Repository: Deokishisu/FRLG-Plus Branch: master Commit: f198fb944256 Files: 6180 Total size: 23.4 MB Directory structure: gitextract_41kfd4nd/ ├── .gitattributes ├── .github/ │ ├── calcrom/ │ │ ├── calcrom.pl │ │ └── webhook.sh │ └── workflows/ │ └── build.yml ├── .gitignore ├── FAQ.md ├── FEATURES.md ├── INSTALL.md ├── Makefile ├── README.md ├── asm/ │ ├── macros/ │ │ ├── asm.inc │ │ ├── battle_ai_script.inc │ │ ├── battle_anim.inc │ │ ├── battle_anim_script.inc │ │ ├── battle_script.inc │ │ ├── contest_ai_script.inc │ │ ├── ec.inc │ │ ├── event.inc │ │ ├── field_effect_script.inc │ │ ├── function.inc │ │ ├── m4a.inc │ │ ├── map.inc │ │ ├── movement.inc │ │ ├── music_voice.inc │ │ └── trainer_tower.inc │ └── macros.inc ├── asmdiff.sh ├── build_tools.sh ├── charmap.txt ├── common_syms/ │ ├── AgbRfu_LinkManager.txt │ ├── agb_flash.txt │ ├── battle_anim_special.txt │ ├── battle_controller_pokedude.txt │ ├── battle_main.txt │ ├── berry_fix_program.txt │ ├── bg.txt │ ├── cable_club.txt │ ├── ereader_screen.txt │ ├── event_data.txt │ ├── evolution_scene.txt │ ├── fame_checker.txt │ ├── field_camera.txt │ ├── field_control_avatar.txt │ ├── field_specials.txt │ ├── fieldmap.txt │ ├── help_system.txt │ ├── help_system_util.txt │ ├── image_processing_effects.txt │ ├── librfu_rfu.txt │ ├── librfu_sio32id.txt │ ├── librfu_stwi.txt │ ├── link.txt │ ├── link_rfu_2.txt │ ├── list_menu.txt │ ├── load_save.txt │ ├── m4a.txt │ ├── main.txt │ ├── overworld.txt │ ├── party_menu.txt │ ├── quest_log.txt │ ├── random.txt │ ├── save.txt │ ├── save_failed_screen.txt │ ├── scrcmd.txt │ ├── sound.txt │ ├── sprite.txt │ ├── task.txt │ ├── text.txt │ ├── text_printer.txt │ └── window.txt ├── compare.sh ├── config.mk ├── constants/ │ ├── constants.inc │ ├── gba_constants.inc │ ├── m4a_constants.inc │ └── misc_constants.inc ├── data/ │ ├── battle_ai_scripts.s │ ├── battle_anim_scripts.s │ ├── battle_scripts_1.s │ ├── battle_scripts_2.s │ ├── event_scripts.s │ ├── field_effect_scripts.s │ ├── layouts/ │ │ ├── .gitignore │ │ └── layouts.json │ ├── map_events.s │ ├── maps/ │ │ ├── .gitignore │ │ ├── ArtisanCave_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ArtisanCave_B1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleColosseum_2P/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── BattleColosseum_4P/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── BattleFrontier_ExchangeServiceCorner/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_Lounge1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_Lounge2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_Lounge3/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_Lounge4/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_Lounge5/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_Lounge6/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_Lounge7/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_Lounge8/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_OutsideEast/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_OutsideWest/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_RankingHall/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_ReceptionGate/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BattleFrontier_ScottsHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── BirthIsland_Exterior/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── BirthIsland_Harbor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── CeladonCity/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_Condominiums_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_Condominiums_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_Condominiums_3F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_Condominiums_Roof/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_Condominiums_RoofRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_DepartmentStore_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_DepartmentStore_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_DepartmentStore_3F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_DepartmentStore_4F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_DepartmentStore_5F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_DepartmentStore_Elevator/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── CeladonCity_DepartmentStore_Roof/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_GameCorner/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_GameCorner_PrizeRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_Gym/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_Hotel/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeladonCity_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── CeladonCity_Restaurant/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCave_1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── CeruleanCave_1F_Blue/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCave_1F_Yellow/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCave_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── CeruleanCave_2F_Blue/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCave_2F_Yellow/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCave_B1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCave_B1F_Blue/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCave_B1F_Yellow/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_BikeShop/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_Gym/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_House2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_House3/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_House4/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_House5/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CeruleanCity_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── CinnabarIsland/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CinnabarIsland_Gym/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CinnabarIsland_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CinnabarIsland_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CinnabarIsland_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── CinnabarIsland_PokemonLab_Entrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CinnabarIsland_PokemonLab_ExperimentRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CinnabarIsland_PokemonLab_Lounge/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── CinnabarIsland_PokemonLab_ResearchRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── DiglettsCave_B1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── DiglettsCave_NorthEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── DiglettsCave_SouthEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FarawayIsland_Exterior/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FarawayIsland_Interior/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_Harbor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_House2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_LostCave_Entrance/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_LostCave_Room10/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_LostCave_Room11/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room12/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room13/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room14/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room2/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room3/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room4/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_LostCave_Room5/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room6/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room7/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room8/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_LostCave_Room9/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_Meadow/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_MemorialPillar/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FiveIsland_ResortGorgeous/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_ResortGorgeous_House/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_RocketWarehouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FiveIsland_WaterLabyrinth/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland_Base/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland_Base_CableCarStation/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland_CableCarStation/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland_Harbor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FourIsland_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland_House2/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FourIsland_IcefallCave_1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FourIsland_IcefallCave_B1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FourIsland_IcefallCave_Back/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland_IcefallCave_Entrance/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FourIsland_LoreleisHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FourIsland_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FourIsland_PokemonDayCare/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FuchsiaCity/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FuchsiaCity_Gym/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FuchsiaCity_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FuchsiaCity_House2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FuchsiaCity_House3/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FuchsiaCity_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FuchsiaCity_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FuchsiaCity_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── FuchsiaCity_SafariZone_Entrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FuchsiaCity_SafariZone_Office/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── FuchsiaCity_WardensHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── IndigoPlateau_Exterior/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── IndigoPlateau_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── IndigoPlateau_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── LavenderTown/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── LavenderTown_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── LavenderTown_House2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── LavenderTown_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── LavenderTown_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── LavenderTown_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── LavenderTown_VolunteerPokemonHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── MtEmber_Exterior/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── MtEmber_RubyPath_1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_RubyPath_B1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_RubyPath_B1F_Stairs/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_RubyPath_B2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_RubyPath_B2F_Stairs/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_RubyPath_B3F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── MtEmber_RubyPath_B4F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_RubyPath_B5F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_Summit/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_SummitPath_1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_SummitPath_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtEmber_SummitPath_3F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtMoon_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── MtMoon_B1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── MtMoon_B2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── NavelRock_1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_B1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_Base/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B10F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B11F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B3F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B4F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B5F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B6F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B7F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B8F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_BasePath_B9F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_Exterior/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_Fork/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_Harbor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_Summit/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_SummitPath_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_SummitPath_3F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_SummitPath_4F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── NavelRock_SummitPath_5F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── OneIsland/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── OneIsland_Harbor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── OneIsland_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── OneIsland_House2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── OneIsland_KindleRoad/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── OneIsland_KindleRoad_EmberSpa/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── OneIsland_KindleRoad_GlassWorkshop/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── OneIsland_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── OneIsland_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── OneIsland_TreasureBeach/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PalletTown/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PalletTown_PlayersHouse_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PalletTown_PlayersHouse_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PalletTown_ProfessorOaksLab/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PalletTown_RivalsHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PewterCity/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PewterCity_Gym/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PewterCity_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PewterCity_House2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PewterCity_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PewterCity_Museum_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PewterCity_Museum_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PewterCity_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PewterCity_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── PokemonLeague_AgathasRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonLeague_BrunosRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonLeague_ChampionsRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonLeague_HallOfFame/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonLeague_LancesRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonLeague_LoreleisRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonMansion_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonMansion_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonMansion_3F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonMansion_B1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonTower_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonTower_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonTower_3F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonTower_4F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonTower_5F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonTower_6F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PokemonTower_7F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── PowerPlant/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Prototype_SeviiIsle_6/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Prototype_SeviiIsle_7/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Prototype_SeviiIsle_8/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Prototype_SeviiIsle_9/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── RS_BattleTower/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RS_BattleTower_BattleRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RS_BattleTower_Corridor/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RS_BattleTower_Elevator/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RS_BattleTower_Lobby/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RecordCorner/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── RockTunnel_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RockTunnel_B1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RocketHideout_B1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RocketHideout_B2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RocketHideout_B3F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RocketHideout_B4F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── RocketHideout_Elevator/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route10/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route10_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route10_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Route11/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route11_EastEntrance_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route11_EastEntrance_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route12/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route12_FishingHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route12_NorthEntrance_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route12_NorthEntrance_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route13/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route14/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route15/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route15_WestEntrance_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route15_WestEntrance_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route16/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route16_House/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route16_NorthEntrance_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route16_NorthEntrance_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route17/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route18/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route18_EastEntrance_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route18_EastEntrance_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route19/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route19_UnusedHouse/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Route2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route20/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route20_Underwater/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route21_North/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route21_South/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route22/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route22_NorthEntrance/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Route23/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route23_UnusedHouse/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Route24/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route25/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route25_SeaCottage/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route2_EastBuilding/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route2_House/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route2_ViridianForest_NorthEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route2_ViridianForest_SouthEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route3/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route4/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route4_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route4_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Route5/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route5_PokemonDayCare/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route5_SouthEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route6/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route6_NorthEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route6_UnusedHouse/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── Route7/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route7_EastEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route8/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route8_WestEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── Route9/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_1F_Corridor/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_1F_Room1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_1F_Room2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_1F_Room3/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_1F_Room4/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_1F_Room5/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_1F_Room6/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_1F_Room7/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_2F_Corridor/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_2F_Room1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_2F_Room2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_2F_Room3/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_2F_Room4/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_2F_Room5/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_2F_Room6/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_3F_Corridor/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_B1F_Corridor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SSAnne_B1F_Room1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_B1F_Room2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_B1F_Room3/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_B1F_Room4/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_B1F_Room5/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_CaptainsOffice/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_Deck/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SSAnne_Exterior/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SSAnne_Kitchen/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_Center/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_Center_RestHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_East/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_East_RestHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_North/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_NorthEast/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_NorthWest/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_NorthWest_RestHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_North_RestHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_SecretHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_West/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SafariZone_West_RestHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity_Connection/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SaffronCity_CopycatsHouse_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity_CopycatsHouse_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity_Dojo/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity_Gym/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity_House/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity_MrPsychicsHouse/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SaffronCity_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SaffronCity_PokemonTrainerFanClub/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SeafoamIslands_1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SeafoamIslands_B1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SeafoamIslands_B2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SeafoamIslands_B3F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SeafoamIslands_B4F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_Harbor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_House_Room1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_House_Room2/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_SevaultCanyon/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_SevaultCanyon_Entrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_SevaultCanyon_House/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_SevaultCanyon_TanobyKey/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_TanobyRuins/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_TanobyRuins_DilfordChamber/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_TanobyRuins_LiptooChamber/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_TanobyRuins_MoneanChamber/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_TanobyRuins_RixyChamber/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_TanobyRuins_ScufibChamber/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_TanobyRuins_ViapoisChamber/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_TanobyRuins_WeepthChamber/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SevenIsland_TrainerTower/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SevenIsland_UnusedHouse/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SilphCo_10F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_11F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_3F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_4F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_5F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_6F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_7F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_8F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_9F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SilphCo_Elevator/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SixIsland/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_AlteringCave/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SixIsland_DottedHole_1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SixIsland_DottedHole_B1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SixIsland_DottedHole_B2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SixIsland_DottedHole_B3F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SixIsland_DottedHole_B4F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SixIsland_DottedHole_SapphireRoom/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_GreenPath/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_Harbor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SixIsland_House/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_OutcastIsland/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_PatternBush/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── SixIsland_RuinValley/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_WaterPath/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_WaterPath_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SixIsland_WaterPath_House2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SouthernIsland_Exterior/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── SouthernIsland_Interior/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_BerryForest/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_BondBridge/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_BondBridge_Underwater/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_DunsparceTunnel/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_Harbor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── ThreeIsland_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_House2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_House3/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_House4/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_House5/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ThreeIsland_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── ThreeIsland_Port/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── TradeCenter/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_1F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_3F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_4F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_5F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_6F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_7F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_8F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_Elevator/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TrainerTower_Lobby/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── TrainerTower_Roof/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TwoIsland/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── TwoIsland_CapeBrink/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TwoIsland_CapeBrink_House/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── TwoIsland_Harbor/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── TwoIsland_House/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── TwoIsland_JoyfulGameCorner/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── TwoIsland_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── TwoIsland_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── UndergroundPath_EastEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── UndergroundPath_EastWestTunnel/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── UndergroundPath_NorthEntrance/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── UndergroundPath_NorthSouthTunnel/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── UndergroundPath_SouthEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── UndergroundPath_WestEntrance/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── UnionRoom/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── VermilionCity/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VermilionCity_Gym/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VermilionCity_House1/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VermilionCity_House2/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VermilionCity_House3/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VermilionCity_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VermilionCity_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VermilionCity_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── VermilionCity_PokemonFanClub/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VictoryRoad_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VictoryRoad_2F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── VictoryRoad_3F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ViridianCity/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ViridianCity_Gym/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ViridianCity_House/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ViridianCity_Mart/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ViridianCity_PokemonCenter_1F/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ViridianCity_PokemonCenter_2F/ │ │ │ ├── map.json │ │ │ └── scripts.inc │ │ ├── ViridianCity_School/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ ├── ViridianForest/ │ │ │ ├── map.json │ │ │ ├── scripts.inc │ │ │ └── text.inc │ │ └── map_groups.json │ ├── maps.s │ ├── mb_berry_fix.gba │ ├── mb_colosseum.gba │ ├── mb_ereader.gba │ ├── multiboot_berry_glitch_fix.s │ ├── multiboot_ereader.s │ ├── multiboot_pokemon_colosseum.s │ ├── mystery_event_msg.s │ ├── mystery_event_script_cmd_table.s │ ├── script_cmd_table.inc │ ├── scripts/ │ │ ├── aide.inc │ │ ├── bag_full.inc │ │ ├── cable_club.inc │ │ ├── cave_of_origin.inc │ │ ├── day_care.inc │ │ ├── fame_checker.inc │ │ ├── field_moves.inc │ │ ├── flash.inc │ │ ├── flavor_text.inc │ │ ├── fuji_event.inc │ │ ├── fuji_event.pory │ │ ├── hall_of_fame.inc │ │ ├── hole.inc │ │ ├── item_ball_scripts.inc │ │ ├── itemfinder.inc │ │ ├── master_trainers.inc │ │ ├── move_tutors.inc │ │ ├── movement.inc │ │ ├── mystery_event_club.inc │ │ ├── national_dex_aide.inc │ │ ├── national_dex_aide.pory │ │ ├── obtain_item.inc │ │ ├── pc.inc │ │ ├── pc_transfer.inc │ │ ├── pkmn_center_nurse.inc │ │ ├── pokedex_rating.inc │ │ ├── pokemon_league.inc │ │ ├── pokemon_mansion.inc │ │ ├── questionnaire.inc │ │ ├── repel.inc │ │ ├── route23.inc │ │ ├── safari_zone.inc │ │ ├── seagallop.inc │ │ ├── set_gym_trainers.inc │ │ ├── silphco_doors.inc │ │ ├── static_pokemon.inc │ │ ├── std_msgbox.inc │ │ ├── surf.inc │ │ ├── trainer_battle.inc │ │ ├── trainer_card.inc │ │ ├── trainer_tower.inc │ │ ├── trainers.inc │ │ └── white_out.inc │ ├── sound_data.s │ ├── specials.inc │ ├── text/ │ │ ├── aide.inc │ │ ├── braille.inc │ │ ├── day_care.inc │ │ ├── fame_checker.inc │ │ ├── flavor_text.inc │ │ ├── help_system.inc │ │ ├── ingame_trade.inc │ │ ├── itemfinder.inc │ │ ├── new_game_intro.inc │ │ ├── obtain_item.inc │ │ ├── pc.inc │ │ ├── pc_transfer.inc │ │ ├── poke_mart.inc │ │ ├── pokedex_rating.inc │ │ ├── pokedude.inc │ │ ├── route23.inc │ │ ├── safari_zone.inc │ │ ├── save.inc │ │ ├── seagallop.inc │ │ ├── sign_lady.inc │ │ ├── surf.inc │ │ ├── trainer_card.inc │ │ ├── trainers.inc │ │ └── white_out.inc │ └── tilesets/ │ ├── primary/ │ │ ├── building/ │ │ │ └── palettes/ │ │ │ ├── 00.pal │ │ │ ├── 01.pal │ │ │ ├── 02.pal │ │ │ ├── 03.pal │ │ │ ├── 04.pal │ │ │ ├── 05.pal │ │ │ ├── 06.pal │ │ │ ├── 07.pal │ │ │ ├── 08.pal │ │ │ ├── 09.pal │ │ │ ├── 10.pal │ │ │ ├── 11.pal │ │ │ ├── 12.pal │ │ │ ├── 13.pal │ │ │ ├── 14.pal │ │ │ └── 15.pal │ │ └── general/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ └── secondary/ │ ├── battlefrontier/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ └── 12.pal │ ├── battlefrontieroutsideeast/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ └── 12.pal │ ├── battlefrontieroutsidewest/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ └── 12.pal │ ├── battlefrontierrankinghall/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ └── 12.pal │ ├── berry_forest/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── bike_shop/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── burgled_house/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── cable_club/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── cave/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── celadon_city/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── celadon_gym/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── cerulean_cave/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── cerulean_city/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── cerulean_gym/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── cinnabar_gym/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── cinnabar_island/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── condominiums/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── department_store/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── digletts_cave/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── dummy_1/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── dummy_2/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── dummy_3/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── dummy_4/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── fan_club_daycare/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── fuchsia_city/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── fuchsia_gym/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── game_corner/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── generic_building_1/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── generic_building_2/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── hall_of_fame/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── hoenn_building/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── indigo_plateau/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── island_harbor/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── lab/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── lavender_town/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── mart/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── mt_ember/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── museum/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── navel_rock/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── pallet_town/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── pewter_city/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── pewter_gym/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── pokemon_center/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── pokemon_league/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── pokemon_mansion/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── pokemon_tower/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── power_plant/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── restaurant_hotel/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── rock_tunnel/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── safari_zone_building/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── saffron_city/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── saffron_gym/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── school/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── sea_cottage/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── seafoam_islands/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── sevii_islands_123/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── sevii_islands_45/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── sevii_islands_67/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── seviiislands5/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── seviiislands6/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── ss_anne/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── tanoby_ruins/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── trainer_tower/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── underground_path/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── underwater/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── unused_gatehouse_1/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── unused_gatehouse_2/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── vermilion_city/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── vermilion_gym/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── viridian_city/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ ├── viridian_forest/ │ │ └── palettes/ │ │ ├── 00.pal │ │ ├── 01.pal │ │ ├── 02.pal │ │ ├── 03.pal │ │ ├── 04.pal │ │ ├── 05.pal │ │ ├── 06.pal │ │ ├── 07.pal │ │ ├── 08.pal │ │ ├── 09.pal │ │ ├── 10.pal │ │ ├── 11.pal │ │ ├── 12.pal │ │ ├── 13.pal │ │ ├── 14.pal │ │ └── 15.pal │ └── viridian_gym/ │ └── palettes/ │ ├── 00.pal │ ├── 01.pal │ ├── 02.pal │ ├── 03.pal │ ├── 04.pal │ ├── 05.pal │ ├── 06.pal │ ├── 07.pal │ ├── 08.pal │ ├── 09.pal │ ├── 10.pal │ ├── 11.pal │ ├── 12.pal │ ├── 13.pal │ ├── 14.pal │ └── 15.pal ├── docs/ │ ├── bugs_and_glitches.md │ └── legacy_WSL1_INSTALL.md ├── firered.sha1 ├── firered_rev1.sha1 ├── graphics/ │ ├── battle_anims/ │ │ ├── backgrounds/ │ │ │ ├── bug.pal │ │ │ ├── sky.pal │ │ │ ├── solarbeam.pal │ │ │ └── water_muddy.pal │ │ ├── masks/ │ │ │ ├── stat1.pal │ │ │ ├── stat2.pal │ │ │ ├── stat3.pal │ │ │ ├── stat4.pal │ │ │ ├── stat5.pal │ │ │ ├── stat6.pal │ │ │ ├── stat7.pal │ │ │ └── stat8.pal │ │ ├── sprites/ │ │ │ ├── black_ball.pal │ │ │ ├── blue_light_wall.pal │ │ │ ├── blue_orb.pal │ │ │ ├── blue_ring.pal │ │ │ ├── blue_ring_2.pal │ │ │ ├── brown_orb.pal │ │ │ ├── flower.pal │ │ │ ├── glowy_blue_orb.pal │ │ │ ├── glowy_green_orb.pal │ │ │ ├── gray_light_wall.pal │ │ │ ├── hit_2.pal │ │ │ ├── ice_crystals.pal │ │ │ ├── ice_cube.pal │ │ │ ├── mud_sand.pal │ │ │ ├── music_notes_2.pal │ │ │ ├── orange_light_wall.pal │ │ │ ├── pink_heart.pal │ │ │ ├── purple_gas_cloud.pal │ │ │ ├── purple_ring.pal │ │ │ ├── red_heart.pal │ │ │ ├── red_light_wall.pal │ │ │ ├── red_orb_2.pal │ │ │ ├── sap_drip_2.pal │ │ │ ├── slash_2.pal │ │ │ ├── sleep_powder.pal │ │ │ ├── spark.pal │ │ │ ├── sparkle_2.pal │ │ │ ├── stun_spore.pal │ │ │ ├── whip_hit.pal │ │ │ └── white_circle_of_light.pal │ │ └── unused/ │ │ ├── flying.pal │ │ ├── line_sketch_2.pal │ │ ├── spinning_ball_2.pal │ │ └── unknown.pal │ ├── battle_interface/ │ │ ├── healthbar.pal │ │ ├── healthbox.pal │ │ ├── textbox1.pal │ │ └── textbox2.pal │ ├── battle_terrain/ │ │ ├── building/ │ │ │ └── terrain.pal │ │ ├── cave/ │ │ │ └── terrain.pal │ │ ├── grass/ │ │ │ └── terrain.pal │ │ ├── indoor/ │ │ │ ├── 1.pal │ │ │ ├── 2.pal │ │ │ ├── agatha.pal │ │ │ ├── bruno.pal │ │ │ ├── champion.pal │ │ │ ├── gym.pal │ │ │ ├── lance.pal │ │ │ ├── leader.pal │ │ │ ├── link.pal │ │ │ ├── lorelei.pal │ │ │ └── plain.pal │ │ ├── longgrass/ │ │ │ └── terrain.pal │ │ ├── mountain/ │ │ │ └── terrain.pal │ │ ├── pond/ │ │ │ └── terrain.pal │ │ ├── sand/ │ │ │ └── terrain.pal │ │ ├── underwater/ │ │ │ └── terrain.pal │ │ ├── unused/ │ │ │ ├── building/ │ │ │ │ ├── palette.pal │ │ │ │ ├── palette2.pal │ │ │ │ └── palette3.pal │ │ │ ├── groudon.pal │ │ │ ├── kyogre.pal │ │ │ ├── plain.pal │ │ │ └── stadium/ │ │ │ ├── battle_frontier.pal │ │ │ ├── palette1.pal │ │ │ ├── palette2.pal │ │ │ ├── palette3.pal │ │ │ ├── palette4.pal │ │ │ ├── palette5.pal │ │ │ ├── palette6.pal │ │ │ └── palette7.pal │ │ └── water/ │ │ └── terrain.pal │ ├── battle_transitions/ │ │ ├── agatha_bg.pal │ │ ├── blue_bg.pal │ │ ├── bruno_bg.pal │ │ ├── green_bg.pal │ │ ├── lance_bg.pal │ │ ├── lorelei_bg.pal │ │ ├── red_bg.pal │ │ ├── sliding_pokeball.pal │ │ └── unused_trainer.pal │ ├── berry_pouch/ │ │ └── background_female.pal │ ├── cable_car/ │ │ └── bg.pal │ ├── cave_transition/ │ │ ├── black.pal │ │ ├── enter.pal │ │ ├── exit.pal │ │ └── white.pal │ ├── contest/ │ │ ├── interface.pal │ │ ├── japanese/ │ │ │ └── palette.pal │ │ └── results.pal │ ├── credits/ │ │ ├── pokeball_blastoise.pal │ │ ├── pokeball_charizard.pal │ │ ├── pokeball_pikachu.pal │ │ ├── pokeball_venusaur.pal │ │ └── white_circle.pal │ ├── dodrio_berry_picking/ │ │ ├── bg.pal │ │ ├── shiny.pal │ │ └── tree_border.pal │ ├── easy_chat/ │ │ ├── text.pal │ │ ├── text_input_frame_green.pal │ │ ├── text_input_frame_orange.pal │ │ └── title_text.pal │ ├── evolution_scene/ │ │ ├── gray_transition_intro.pal │ │ ├── transition.pal │ │ └── unused.pal │ ├── fame_checker/ │ │ ├── silhouette.pal │ │ └── unk.pal │ ├── field_effects/ │ │ └── palettes/ │ │ ├── ash.pal │ │ ├── general_0.pal │ │ ├── general_1.pal │ │ └── small_sparkle.pal │ ├── field_specials/ │ │ ├── champion_room_lighting_0.pal │ │ ├── champion_room_lighting_1.pal │ │ ├── champion_room_lighting_2.pal │ │ ├── champion_room_lighting_3.pal │ │ ├── champion_room_lighting_4.pal │ │ ├── champion_room_lighting_5.pal │ │ ├── champion_room_lighting_6.pal │ │ ├── champion_room_lighting_7.pal │ │ ├── champion_room_lighting_8.pal │ │ ├── deoxys_rock_0.pal │ │ ├── deoxys_rock_1.pal │ │ ├── deoxys_rock_10.pal │ │ ├── deoxys_rock_2.pal │ │ ├── deoxys_rock_3.pal │ │ ├── deoxys_rock_4.pal │ │ ├── deoxys_rock_5.pal │ │ ├── deoxys_rock_6.pal │ │ ├── deoxys_rock_7.pal │ │ ├── deoxys_rock_8.pal │ │ ├── deoxys_rock_9.pal │ │ ├── elite_four_lighting_0.pal │ │ ├── elite_four_lighting_1.pal │ │ ├── elite_four_lighting_10.pal │ │ ├── elite_four_lighting_11.pal │ │ ├── elite_four_lighting_2.pal │ │ ├── elite_four_lighting_3.pal │ │ ├── elite_four_lighting_4.pal │ │ ├── elite_four_lighting_5.pal │ │ ├── elite_four_lighting_6.pal │ │ ├── elite_four_lighting_7.pal │ │ ├── elite_four_lighting_8.pal │ │ └── elite_four_lighting_9.pal │ ├── interface/ │ │ ├── bag.pal │ │ ├── blank.pal │ │ ├── dex_caught_pokeball.pal │ │ ├── pokemon_types.pal │ │ ├── red_arrow.pal │ │ ├── save_failed_screen.pal │ │ ├── std_menu.pal │ │ └── text_pp.pal │ ├── intro/ │ │ ├── copyright.pal │ │ ├── game_freak/ │ │ │ ├── bg.pal │ │ │ └── sparkles.pal │ │ ├── gengar.pal │ │ ├── nidorino.pal │ │ ├── scene_2/ │ │ │ ├── bg.pal │ │ │ └── nidorino_close.pal │ │ └── scene_3/ │ │ └── bg.pal │ ├── item_menu/ │ │ ├── bag_window_pal.pal │ │ └── bg_female.pal │ ├── items/ │ │ └── icon_palettes/ │ │ ├── acro_bike.pal │ │ ├── aguav_berry.pal │ │ ├── amulet_coin.pal │ │ ├── antidote.pal │ │ ├── apicot_berry.pal │ │ ├── aspear_berry.pal │ │ ├── aurora_ticket.pal │ │ ├── awakening.pal │ │ ├── bead_mail.pal │ │ ├── belue_berry.pal │ │ ├── berry_juice.pal │ │ ├── berry_pouch.pal │ │ ├── bicycle.pal │ │ ├── bike_voucher.pal │ │ ├── black_flute.pal │ │ ├── black_type_enhancing_item.pal │ │ ├── blue_flute.pal │ │ ├── blue_orb.pal │ │ ├── blue_scarf.pal │ │ ├── blue_shard.pal │ │ ├── bluk_berry.pal │ │ ├── bright_powder.pal │ │ ├── burn_heal.pal │ │ ├── calcium.pal │ │ ├── carbos.pal │ │ ├── card_key.pal │ │ ├── charcoal.pal │ │ ├── cheri_berry.pal │ │ ├── chesto_berry.pal │ │ ├── choice_band.pal │ │ ├── cleanse_tag.pal │ │ ├── coin_case.pal │ │ ├── contest_pass.pal │ │ ├── cornn_berry.pal │ │ ├── dark_tm_hm.pal │ │ ├── deep_sea_scale.pal │ │ ├── deep_sea_tooth.pal │ │ ├── devon_goods.pal │ │ ├── devon_scope.pal │ │ ├── dire_hit.pal │ │ ├── dive_ball.pal │ │ ├── dragon_fang.pal │ │ ├── dragon_scale.pal │ │ ├── dragon_tm_hm.pal │ │ ├── dream_mail.pal │ │ ├── durin_berry.pal │ │ ├── electric_tm_hm.pal │ │ ├── elixir.pal │ │ ├── energy_powder.pal │ │ ├── energy_root.pal │ │ ├── enigma_berry.pal │ │ ├── eon_ticket.pal │ │ ├── escape_rope.pal │ │ ├── ether.pal │ │ ├── everstone.pal │ │ ├── exp_share.pal │ │ ├── fab_mail.pal │ │ ├── fame_checker.pal │ │ ├── fighting_tm_hm.pal │ │ ├── figy_berry.pal │ │ ├── fire_stone.pal │ │ ├── fire_tm_hm.pal │ │ ├── fluffy_tail.pal │ │ ├── flying_tm_hm.pal │ │ ├── focus_band.pal │ │ ├── fresh_water.pal │ │ ├── full_heal.pal │ │ ├── full_restore.pal │ │ ├── ganlon_berry.pal │ │ ├── ghost_tm_hm.pal │ │ ├── glitter_mail.pal │ │ ├── go_goggles.pal │ │ ├── gold_teeth.pal │ │ ├── good_rod.pal │ │ ├── grass_tm_hm.pal │ │ ├── great_ball.pal │ │ ├── green_scarf.pal │ │ ├── green_shard.pal │ │ ├── grepa_berry.pal │ │ ├── ground_tm_hm.pal │ │ ├── guard_spec.pal │ │ ├── harbor_mail.pal │ │ ├── hard_stone.pal │ │ ├── heal_powder.pal │ │ ├── heart_scale.pal │ │ ├── hoenn_fossil.pal │ │ ├── hondew_berry.pal │ │ ├── hp_up.pal │ │ ├── hyper_potion.pal │ │ ├── iapapa_berry.pal │ │ ├── ice_heal.pal │ │ ├── ice_tm_hm.pal │ │ ├── iron.pal │ │ ├── itemfinder.pal │ │ ├── kanto_fossil.pal │ │ ├── kelpsy_berry.pal │ │ ├── key.pal │ │ ├── kings_rock.pal │ │ ├── lansat_berry.pal │ │ ├── lava_cookie_and_letter.pal │ │ ├── lax_incense.pal │ │ ├── leaf_stone.pal │ │ ├── leftovers.pal │ │ ├── lemonade.pal │ │ ├── leppa_berry.pal │ │ ├── liechi_berry.pal │ │ ├── light_ball.pal │ │ ├── link_bracelet.pal │ │ ├── lucky_egg.pal │ │ ├── lucky_punch.pal │ │ ├── lum_berry.pal │ │ ├── luxury_ball.pal │ │ ├── mach_bike.pal │ │ ├── macho_brace.pal │ │ ├── magma_emblem.pal │ │ ├── magnet.pal │ │ ├── mago_berry.pal │ │ ├── magost_berry.pal │ │ ├── master_ball.pal │ │ ├── max_elixir.pal │ │ ├── max_ether.pal │ │ ├── max_potion.pal │ │ ├── max_repel.pal │ │ ├── mech_mail.pal │ │ ├── mental_herb.pal │ │ ├── metal_coat.pal │ │ ├── metal_powder.pal │ │ ├── meteorite.pal │ │ ├── miracle_seed.pal │ │ ├── moomoo_milk.pal │ │ ├── moon_stone.pal │ │ ├── mushroom.pal │ │ ├── mystic_ticket.pal │ │ ├── mystic_water.pal │ │ ├── nanab_berry.pal │ │ ├── nest_ball.pal │ │ ├── net_ball.pal │ │ ├── never_melt_ice.pal │ │ ├── nomel_berry.pal │ │ ├── normal_tm_hm.pal │ │ ├── nugget.pal │ │ ├── oaks_parcel.pal │ │ ├── old_amber.pal │ │ ├── old_key.pal │ │ ├── old_rod.pal │ │ ├── old_sea_map.pal │ │ ├── oran_berry.pal │ │ ├── orange_mail.pal │ │ ├── pamtre_berry.pal │ │ ├── paralyze_heal.pal │ │ ├── pearl.pal │ │ ├── pecha_berry.pal │ │ ├── persim_berry.pal │ │ ├── petaya_berry.pal │ │ ├── pinap_berry.pal │ │ ├── pink_scarf.pal │ │ ├── poison_barb.pal │ │ ├── poison_tm_hm.pal │ │ ├── poke_ball.pal │ │ ├── poke_doll.pal │ │ ├── poke_flute.pal │ │ ├── pokeblock_case.pal │ │ ├── pomeg_berry.pal │ │ ├── potion.pal │ │ ├── powder_jar.pal │ │ ├── pp_max.pal │ │ ├── pp_up.pal │ │ ├── protein.pal │ │ ├── psychic_tm_hm.pal │ │ ├── qualot_berry.pal │ │ ├── question_mark.pal │ │ ├── quick_claw.pal │ │ ├── rabuta_berry.pal │ │ ├── rainbow_pass.pal │ │ ├── rare_candy.pal │ │ ├── rawst_berry.pal │ │ ├── razz_berry.pal │ │ ├── red_flute.pal │ │ ├── red_orb.pal │ │ ├── red_scarf.pal │ │ ├── red_shard.pal │ │ ├── repeat_ball.pal │ │ ├── repel.pal │ │ ├── retro_mail.pal │ │ ├── return_to_field_arrow.pal │ │ ├── revival_herb.pal │ │ ├── revive.pal │ │ ├── rock_tm_hm.pal │ │ ├── ruby.pal │ │ ├── sacred_ash.pal │ │ ├── safari_ball.pal │ │ ├── salac_berry.pal │ │ ├── sapphire.pal │ │ ├── scanner.pal │ │ ├── scope_lens.pal │ │ ├── sea_incense.pal │ │ ├── secret_key.pal │ │ ├── shadow_mail.pal │ │ ├── sharp_beak.pal │ │ ├── shell.pal │ │ ├── shoal_salt.pal │ │ ├── silk_scarf.pal │ │ ├── silph_scope.pal │ │ ├── silver_powder.pal │ │ ├── sitrus_berry.pal │ │ ├── smoke_ball.pal │ │ ├── soda_pop.pal │ │ ├── soft_sand.pal │ │ ├── soot_sack.pal │ │ ├── soothe_bell.pal │ │ ├── soul_dew.pal │ │ ├── spell_tag.pal │ │ ├── spelon_berry.pal │ │ ├── ss_ticket.pal │ │ ├── star.pal │ │ ├── starf_berry.pal │ │ ├── steel_tm_hm.pal │ │ ├── stick.pal │ │ ├── sun_stone.pal │ │ ├── super_potion.pal │ │ ├── super_repel.pal │ │ ├── super_rod.pal │ │ ├── tamato_berry.pal │ │ ├── tea.pal │ │ ├── teachy_tv.pal │ │ ├── thick_club.pal │ │ ├── thunder_stone.pal │ │ ├── tm_case.pal │ │ ├── town_map.pal │ │ ├── tri_pass.pal │ │ ├── tropic_mail.pal │ │ ├── twisted_spoon.pal │ │ ├── ultra_ball.pal │ │ ├── up_grade.pal │ │ ├── vs_seeker.pal │ │ ├── wailmer_pail.pal │ │ ├── water_stone.pal │ │ ├── water_tm_hm.pal │ │ ├── watmel_berry.pal │ │ ├── wave_mail.pal │ │ ├── wepear_berry.pal │ │ ├── white_flute.pal │ │ ├── white_herb.pal │ │ ├── wiki_berry.pal │ │ ├── wood_mail.pal │ │ ├── x_accuracy.pal │ │ ├── x_attack.pal │ │ ├── x_defend.pal │ │ ├── x_special.pal │ │ ├── x_speed.pal │ │ ├── yellow_flute.pal │ │ ├── yellow_scarf.pal │ │ ├── yellow_shard.pal │ │ └── zinc.pal │ ├── mail/ │ │ ├── bead/ │ │ │ └── palette.pal │ │ ├── dream/ │ │ │ └── palette.pal │ │ ├── fab/ │ │ │ └── palette.pal │ │ ├── glitter/ │ │ │ └── palette.pal │ │ ├── harbor/ │ │ │ └── palette.pal │ │ ├── mech/ │ │ │ └── palette.pal │ │ ├── orange/ │ │ │ └── palette.pal │ │ ├── retro/ │ │ │ └── palette.pal │ │ ├── shadow/ │ │ │ └── palette.pal │ │ ├── tropic/ │ │ │ └── palette.pal │ │ ├── wave/ │ │ │ └── palette.pal │ │ └── wood/ │ │ └── palette.pal │ ├── main_menu/ │ │ ├── bg.pal │ │ └── textbox.pal │ ├── misc/ │ │ └── option_menu.pal │ ├── naming_screen/ │ │ ├── buttons.pal │ │ ├── cursor.pal │ │ ├── keyboard.pal │ │ ├── menu.pal │ │ ├── page_swap_lower.pal │ │ ├── page_swap_others.pal │ │ ├── page_swap_upper.pal │ │ └── rival.pal │ ├── oak_speech/ │ │ ├── leaf/ │ │ │ └── pal.pal │ │ ├── oak/ │ │ │ └── pal.pal │ │ ├── pikachu_intro/ │ │ │ └── pikachu.pal │ │ ├── platform.pal │ │ ├── red/ │ │ │ └── pal.pal │ │ └── rival/ │ │ └── pal.pal │ ├── object_events/ │ │ └── palettes/ │ │ ├── 22.pal │ │ ├── 23.pal │ │ ├── 839C588.pal │ │ ├── 839D3A8.pal │ │ ├── black_sand_footprints.pal │ │ ├── bridge_reflection.pal │ │ ├── cable_car.pal │ │ ├── lady.pal │ │ ├── meteorite.pal │ │ ├── npc_blue.pal │ │ ├── npc_blue_reflection.pal │ │ ├── npc_green.pal │ │ ├── npc_green_reflection.pal │ │ ├── npc_pink.pal │ │ ├── npc_pink_reflection.pal │ │ ├── npc_white.pal │ │ ├── npc_white_reflection.pal │ │ ├── player.pal │ │ ├── player_reflection.pal │ │ ├── player_unused.pal │ │ ├── rs_quinty_plump.pal │ │ ├── rs_quinty_plump_reflection.pal │ │ ├── seagallop.pal │ │ ├── snow_footprints.pal │ │ ├── ss_anne.pal │ │ ├── three_island_grass.pal │ │ └── underwater_sprites.pal │ ├── pokedex/ │ │ ├── area_markers/ │ │ │ └── marker.pal │ │ ├── kanto_dex_bgpals.pal │ │ ├── national_dex_bgpals.pal │ │ └── silhouette_sprite_pal.pal │ ├── pokemon/ │ │ ├── abra/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── absol/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── aerodactyl/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── aggron/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── aipom/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── alakazam/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── altaria/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ampharos/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── anorith/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── arbok/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── arcanine/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ariados/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── armaldo/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── aron/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── articuno/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── azumarill/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── azurill/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── bagon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── baltoy/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── banette/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── barboach/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── bayleef/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── beautifly/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── beedrill/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── beldum/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── bellossom/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── bellsprout/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── blastoise/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── blaziken/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── blissey/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── breloom/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── bulbasaur/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── butterfree/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── cacnea/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── cacturne/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── camerupt/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── carvanha/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── cascoon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── castform/ │ │ │ ├── normal/ │ │ │ │ ├── normal.pal │ │ │ │ └── shiny.pal │ │ │ ├── rainy/ │ │ │ │ ├── normal.pal │ │ │ │ └── shiny.pal │ │ │ ├── snowy/ │ │ │ │ ├── normal.pal │ │ │ │ └── shiny.pal │ │ │ └── sunny/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── caterpie/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── celebi/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── chansey/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── charizard/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── charmander/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── charmeleon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── chikorita/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── chimecho/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── chinchou/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── clamperl/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── claydol/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── clefable/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── clefairy/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── cleffa/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── cloyster/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── combusken/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── corphish/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── corsola/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── cradily/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── crawdaunt/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── crobat/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── croconaw/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── cubone/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── cyndaquil/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── delcatty/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── delibird/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── deoxys/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── dewgong/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── diglett/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ditto/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── dodrio/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── doduo/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── donphan/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── dragonair/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── dragonite/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── dratini/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── drowzee/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── dugtrio/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── dunsparce/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── dusclops/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── duskull/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── dustox/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── eevee/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── egg/ │ │ │ └── normal.pal │ │ ├── ekans/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── electabuzz/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── electrike/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── electrode/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── elekid/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── entei/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── espeon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── exeggcute/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── exeggutor/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── exploud/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── farfetchd/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── fearow/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── feebas/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── feraligatr/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── flaaffy/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── flareon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── flygon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── forretress/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── furret/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── gardevoir/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── gastly/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── gengar/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── geodude/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── girafarig/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── glalie/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── gligar/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── gloom/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── golbat/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── goldeen/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── golduck/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── golem/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── gorebyss/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── granbull/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── graveler/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── grimer/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── groudon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── grovyle/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── growlithe/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── grumpig/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── gulpin/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── gyarados/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── hariyama/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── haunter/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── heracross/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── hitmonchan/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── hitmonlee/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── hitmontop/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ho_oh/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── hoothoot/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── hoppip/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── horsea/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── houndoom/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── houndour/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── huntail/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── hypno/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── icon_palettes/ │ │ │ ├── icon_palette_0.pal │ │ │ ├── icon_palette_1.pal │ │ │ └── icon_palette_2.pal │ │ ├── igglybuff/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── illumise/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ivysaur/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── jigglypuff/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── jirachi/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── jolteon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── jumpluff/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── jynx/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kabuto/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kabutops/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kadabra/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kakuna/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kangaskhan/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kecleon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kingdra/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kingler/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kirlia/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── koffing/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── krabby/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── kyogre/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── lairon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── lanturn/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── lapras/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── larvitar/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── latias/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── latios/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ledian/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ledyba/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── lickitung/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── lileep/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── linoone/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── lombre/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── lotad/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── loudred/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ludicolo/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── lugia/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── lunatone/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── luvdisc/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── machamp/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── machoke/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── machop/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── magby/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── magcargo/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── magikarp/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── magmar/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── magnemite/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── magneton/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── makuhita/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── manectric/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── mankey/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── mantine/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── mareep/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── marill/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── marowak/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── marshtomp/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── masquerain/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── mawile/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── medicham/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── meditite/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── meganium/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── meowth/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── metagross/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── metang/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── metapod/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── mew/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── mewtwo/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── mightyena/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── milotic/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── miltank/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── minun/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── misdreavus/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── moltres/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── mr_mime/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── mudkip/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── muk/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── murkrow/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── natu/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── nidoking/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── nidoqueen/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── nidoran_f/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── nidoran_m/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── nidorina/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── nidorino/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── nincada/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ninetales/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ninjask/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── noctowl/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── nosepass/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── numel/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── nuzleaf/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── octillery/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── oddish/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── omanyte/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── omastar/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── onix/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── paras/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── parasect/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── pelipper/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── persian/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── phanpy/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── pichu/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── pidgeot/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── pidgeotto/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── pidgey/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── pikachu/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── piloswine/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── pineco/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── pinsir/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── plusle/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── politoed/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── poliwag/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── poliwhirl/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── poliwrath/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ponyta/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── poochyena/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── porygon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── porygon2/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── primeape/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── psyduck/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── pupitar/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── quagsire/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── question_mark/ │ │ │ ├── circled/ │ │ │ │ ├── normal.pal │ │ │ │ └── shiny.pal │ │ │ └── double/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── quilava/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── qwilfish/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── raichu/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── raikou/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ralts/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── rapidash/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── raticate/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── rattata/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── rayquaza/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── regice/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── regirock/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── registeel/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── relicanth/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── remoraid/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── rhydon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── rhyhorn/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── roselia/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sableye/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── salamence/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sandshrew/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sandslash/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sceptile/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── scizor/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── scyther/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── seadra/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── seaking/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sealeo/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── seedot/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── seel/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sentret/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── seviper/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sharpedo/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── shedinja/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── shelgon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── shellder/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── shiftry/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── shroomish/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── shuckle/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── shuppet/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── silcoon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── skarmory/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── skiploom/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── skitty/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── slaking/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── slakoth/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── slowbro/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── slowking/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── slowpoke/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── slugma/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── smeargle/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── smoochum/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sneasel/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── snorlax/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── snorunt/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── snubbull/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── solrock/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── spearow/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── spheal/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── spinarak/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── spinda/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── spoink/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── squirtle/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── stantler/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── starmie/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── staryu/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── steelix/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sudowoodo/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── suicune/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sunflora/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── sunkern/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── surskit/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── swablu/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── swalot/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── swampert/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── swellow/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── swinub/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── taillow/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── tangela/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── tauros/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── teddiursa/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── tentacool/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── tentacruel/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── togepi/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── togetic/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── torchic/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── torkoal/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── totodile/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── trapinch/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── treecko/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── tropius/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── typhlosion/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── tyranitar/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── tyrogue/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── umbreon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── unown/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── ursaring/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── vaporeon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── venomoth/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── venonat/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── venusaur/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── vibrava/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── victreebel/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── vigoroth/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── vileplume/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── volbeat/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── voltorb/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── vulpix/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── wailmer/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── wailord/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── walrein/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── wartortle/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── weedle/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── weepinbell/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── weezing/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── whiscash/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── whismur/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── wigglytuff/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── wingull/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── wobbuffet/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── wooper/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── wurmple/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── wynaut/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── xatu/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── yanma/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── zangoose/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── zapdos/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ ├── zigzagoon/ │ │ │ ├── normal.pal │ │ │ └── shiny.pal │ │ └── zubat/ │ │ ├── normal.pal │ │ └── shiny.pal │ ├── pokemon_jump/ │ │ ├── bg.pal │ │ ├── bonuses.pal │ │ ├── interface.pal │ │ ├── pal1.pal │ │ ├── pal2.pal │ │ └── venusaur.pal │ ├── pokemon_special_anim/ │ │ ├── bg.pal │ │ └── bg_tm_hm.pal │ ├── pokemon_storage/ │ │ ├── interface.pal │ │ ├── interface_no_display_mon.pal │ │ ├── menu.pal │ │ ├── misc1.pal │ │ ├── misc2.pal │ │ ├── party_menu.pal │ │ ├── scrolling_bg_move_items.pal │ │ ├── unused.pal │ │ └── unused_choose_box_menu.pal │ ├── region_map/ │ │ ├── cursor.pal │ │ ├── misc_icon.pal │ │ ├── player_icon_leaf.pal │ │ ├── player_icon_red.pal │ │ ├── region_map.pal │ │ ├── region_map_hoenn.pal │ │ ├── switch_map_cursor.pal │ │ └── top_bar.pal │ ├── seagallop/ │ │ └── ferry_and_wake.pal │ ├── slot_machine/ │ │ ├── firered/ │ │ │ ├── match_lines.pal │ │ │ └── payout_lights.pal │ │ └── leafgreen/ │ │ ├── match_lines.pal │ │ └── payout_lights.pal │ ├── summary_screen/ │ │ ├── hp_bar_red.pal │ │ ├── hp_bar_yellow.pal │ │ ├── marking.pal │ │ ├── move_selection_cursor.pal │ │ ├── text_header.pal │ │ └── text_moves.pal │ ├── teachy_tv/ │ │ └── palettes.pal │ ├── text_window/ │ │ ├── stdpal_0.pal │ │ ├── stdpal_1.pal │ │ ├── stdpal_2.pal │ │ ├── stdpal_3.pal │ │ └── stdpal_4.pal │ ├── title_screen/ │ │ ├── firered/ │ │ │ ├── background.pal │ │ │ ├── box_art_mon.pal │ │ │ ├── game_title_logo.pal │ │ │ └── slash.pal │ │ └── leafgreen/ │ │ ├── background.pal │ │ ├── box_art_mon.pal │ │ ├── game_title_logo.pal │ │ └── slash.pal │ ├── tm_case/ │ │ ├── disc_types_1.pal │ │ ├── disc_types_2.pal │ │ ├── menu_female.pal │ │ └── menu_male.pal │ ├── trade/ │ │ ├── black.pal │ │ ├── cursor.pal │ │ ├── gba.pal │ │ ├── gba_pal2.pal │ │ ├── link_mon.pal │ │ ├── menu.pal │ │ ├── shadow.pal │ │ ├── text.pal │ │ ├── unused1.pal │ │ ├── wireless_signal_receive.pal │ │ └── wireless_signal_send.pal │ ├── trainer_card/ │ │ ├── blue.pal │ │ ├── bronze.pal │ │ ├── female_bg.pal │ │ ├── gold.pal │ │ ├── green.pal │ │ ├── rse/ │ │ │ ├── bronze.pal │ │ │ ├── copper.pal │ │ │ ├── female_bg.pal │ │ │ ├── gold.pal │ │ │ ├── green.pal │ │ │ └── silver.pal │ │ ├── silver.pal │ │ ├── star.pal │ │ ├── stickers1.pal │ │ ├── stickers2.pal │ │ ├── stickers3.pal │ │ ├── stickers4.pal │ │ └── unused.pal │ ├── trainers/ │ │ └── palettes/ │ │ ├── aqua_admin_f.pal │ │ ├── aqua_admin_m.pal │ │ ├── aqua_grunt_f.pal │ │ ├── aqua_grunt_m.pal │ │ ├── aqua_leader_archie.pal │ │ ├── aroma_lady.pal │ │ ├── battle_girl.pal │ │ ├── beauty.pal │ │ ├── biker.pal │ │ ├── bird_keeper.pal │ │ ├── black_belt.pal │ │ ├── bug_catcher.pal │ │ ├── bug_maniac.pal │ │ ├── burglar.pal │ │ ├── camper.pal │ │ ├── champion_rival.pal │ │ ├── champion_steven.pal │ │ ├── channeler.pal │ │ ├── collector.pal │ │ ├── cool_couple.pal │ │ ├── cool_trainer_f.pal │ │ ├── cool_trainer_m.pal │ │ ├── crush_girl.pal │ │ ├── crush_kin.pal │ │ ├── cue_ball.pal │ │ ├── cycling_triathlete_f.pal │ │ ├── cycling_triathlete_m.pal │ │ ├── dragon_tamer.pal │ │ ├── elite_four_agatha.pal │ │ ├── elite_four_bruno.pal │ │ ├── elite_four_drake.pal │ │ ├── elite_four_glacia.pal │ │ ├── elite_four_lance.pal │ │ ├── elite_four_lorelei.pal │ │ ├── elite_four_phoebe.pal │ │ ├── elite_four_sidney.pal │ │ ├── emerald_brendan.pal │ │ ├── emerald_may.pal │ │ ├── engineer.pal │ │ ├── expert_f.pal │ │ ├── expert_m.pal │ │ ├── fisherman.pal │ │ ├── gamer.pal │ │ ├── gentleman.pal │ │ ├── guitarist.pal │ │ ├── hex_maniac.pal │ │ ├── hiker.pal │ │ ├── interviewer.pal │ │ ├── juggler.pal │ │ ├── kindler.pal │ │ ├── lady.pal │ │ ├── lass.pal │ │ ├── leader_blaine.pal │ │ ├── leader_brawly.pal │ │ ├── leader_brock.pal │ │ ├── leader_erika.pal │ │ ├── leader_flannery.pal │ │ ├── leader_giovanni.pal │ │ ├── leader_koga.pal │ │ ├── leader_lt_surge.pal │ │ ├── leader_misty.pal │ │ ├── leader_norman.pal │ │ ├── leader_roxanne.pal │ │ ├── leader_sabrina.pal │ │ ├── leader_tate_and_liza.pal │ │ ├── leader_wallace.pal │ │ ├── leader_wattson.pal │ │ ├── leader_winona.pal │ │ ├── leaf.pal │ │ ├── leaf_back_pic.pal │ │ ├── magma_admin_f.pal │ │ ├── magma_admin_m.pal │ │ ├── magma_grunt_f.pal │ │ ├── magma_grunt_m.pal │ │ ├── magma_leader_maxie.pal │ │ ├── master_beauty.pal │ │ ├── master_bird_keeper.pal │ │ ├── master_black_belt.pal │ │ ├── master_bug_catcher.pal │ │ ├── master_cool_trainer_m.pal │ │ ├── master_hiker.pal │ │ ├── master_lass.pal │ │ ├── master_psychic_m.pal │ │ ├── master_scientist.pal │ │ ├── master_swimmer.pal │ │ ├── master_youngster.pal │ │ ├── ninja_boy.pal │ │ ├── old_couple.pal │ │ ├── old_man_back_pic.pal │ │ ├── painter.pal │ │ ├── parasol_lady.pal │ │ ├── picnicker.pal │ │ ├── pokedude_back_pic.pal │ │ ├── pokefan_f.pal │ │ ├── pokefan_m.pal │ │ ├── pokemaniac.pal │ │ ├── pokemon_breeder.pal │ │ ├── pokemon_ranger_f.pal │ │ ├── pokemon_ranger_m.pal │ │ ├── professor_oak.pal │ │ ├── psychic_f.pal │ │ ├── psychic_m.pal │ │ ├── red.pal │ │ ├── red_back_pic.pal │ │ ├── rich_boy.pal │ │ ├── rival_early.pal │ │ ├── rival_late.pal │ │ ├── rocker.pal │ │ ├── rocket_grunt_f.pal │ │ ├── rocket_grunt_m.pal │ │ ├── rs_aroma_lady.pal │ │ ├── rs_beauty.pal │ │ ├── rs_bird_keeper.pal │ │ ├── rs_black_belt.pal │ │ ├── rs_bug_catcher.pal │ │ ├── rs_camper.pal │ │ ├── rs_cool_trainer_f.pal │ │ ├── rs_cool_trainer_m.pal │ │ ├── rs_fisherman.pal │ │ ├── rs_gentleman.pal │ │ ├── rs_hiker.pal │ │ ├── rs_lady.pal │ │ ├── rs_lass.pal │ │ ├── rs_picnicker.pal │ │ ├── rs_pokemaniac.pal │ │ ├── rs_pokemon_breeder_f.pal │ │ ├── rs_pokemon_breeder_m.pal │ │ ├── rs_pokemon_ranger_f.pal │ │ ├── rs_pokemon_ranger_m.pal │ │ ├── rs_psychic_f.pal │ │ ├── rs_psychic_m.pal │ │ ├── rs_ruin_maniac.pal │ │ ├── rs_sailor.pal │ │ ├── rs_sis_and_bro.pal │ │ ├── rs_swimmer_f.pal │ │ ├── rs_swimmer_m.pal │ │ ├── rs_tuber_f.pal │ │ ├── rs_twins.pal │ │ ├── rs_young_couple.pal │ │ ├── rs_youngster.pal │ │ ├── ruby_sapphire_brendan.pal │ │ ├── ruby_sapphire_may.pal │ │ ├── ruin_maniac.pal │ │ ├── running_triathlete_f.pal │ │ ├── running_triathlete_m.pal │ │ ├── sailor.pal │ │ ├── school_kid_f.pal │ │ ├── school_kid_m.pal │ │ ├── scientist.pal │ │ ├── sis_and_bro.pal │ │ ├── sr_and_jr.pal │ │ ├── super_nerd.pal │ │ ├── swimmer_f.pal │ │ ├── swimmer_m.pal │ │ ├── swimming_triathlete_f.pal │ │ ├── swimming_triathlete_m.pal │ │ ├── tamer.pal │ │ ├── tuber_f.pal │ │ ├── tuber_m.pal │ │ ├── twins.pal │ │ ├── wally.pal │ │ ├── young_couple.pal │ │ └── youngster.pal │ ├── union_room_chat/ │ │ ├── messages.pal │ │ ├── objects.pal │ │ ├── text_entry.pal │ │ └── unused.pal │ ├── unused/ │ │ ├── battle_anim_023.pal │ │ ├── gray_palette.pal │ │ ├── old_pal1.pal │ │ ├── old_pal2.pal │ │ ├── old_pal3.pal │ │ ├── old_pal4.pal │ │ ├── old_pal5.pal │ │ ├── old_pal6.pal │ │ ├── old_pal7.pal │ │ └── red_palette.pal │ ├── weather/ │ │ └── default.pal │ ├── wireless_status_screen/ │ │ ├── anim_00.pal │ │ ├── anim_01.pal │ │ ├── anim_02.pal │ │ ├── anim_03.pal │ │ ├── anim_04.pal │ │ ├── anim_05.pal │ │ ├── anim_06.pal │ │ ├── anim_07.pal │ │ ├── anim_08.pal │ │ ├── anim_09.pal │ │ ├── anim_10.pal │ │ ├── anim_11.pal │ │ ├── anim_12.pal │ │ ├── anim_13.pal │ │ └── default.pal │ ├── wonder_card/ │ │ ├── bg0.pal │ │ ├── bg1.pal │ │ ├── bg2.pal │ │ ├── bg3.pal │ │ ├── bg4.pal │ │ ├── bg5.pal │ │ ├── bg6.pal │ │ ├── bg7.pal │ │ ├── stamp_shadow_0.pal │ │ ├── stamp_shadow_1.pal │ │ ├── stamp_shadow_2.pal │ │ ├── stamp_shadow_3.pal │ │ ├── stamp_shadow_4.pal │ │ ├── stamp_shadow_5.pal │ │ ├── stamp_shadow_6.pal │ │ └── stamp_shadow_7.pal │ └── wonder_news/ │ ├── bg0.pal │ ├── bg6.pal │ └── bg7.pal ├── graphics_file_rules.mk ├── include/ │ ├── AgbRfu_LinkManager.h │ ├── bag.h │ ├── battle.h │ ├── battle_ai_script_commands.h │ ├── battle_ai_switch_items.h │ ├── battle_anim.h │ ├── battle_bg.h │ ├── battle_controllers.h │ ├── battle_gfx_sfx_util.h │ ├── battle_interface.h │ ├── battle_main.h │ ├── battle_message.h │ ├── battle_records.h │ ├── battle_script_commands.h │ ├── battle_scripts.h │ ├── battle_setup.h │ ├── battle_tower.h │ ├── battle_transition.h │ ├── battle_util.h │ ├── battle_util2.h │ ├── berry.h │ ├── berry_crush.h │ ├── berry_fix_program.h │ ├── berry_pouch.h │ ├── berry_powder.h │ ├── bg.h │ ├── bg_regs.h │ ├── bike.h │ ├── blend_palette.h │ ├── blit.h │ ├── cable_club.h │ ├── calculate_base_damage.h │ ├── cereader_tool.h │ ├── characters.h │ ├── clear_save_data_screen.h │ ├── coins.h │ ├── config.h │ ├── constants/ │ │ ├── abilities.h │ │ ├── battle.h │ │ ├── battle_ai.h │ │ ├── battle_anim.h │ │ ├── battle_move_effects.h │ │ ├── battle_script_commands.h │ │ ├── battle_setup.h │ │ ├── battle_string_ids.h │ │ ├── battle_tower.h │ │ ├── cable_club.h │ │ ├── coins.h │ │ ├── daycare.h │ │ ├── decorations.h │ │ ├── easy_chat.h │ │ ├── event_bg.h │ │ ├── event_object_movement.h │ │ ├── event_objects.h │ │ ├── fame_checker.h │ │ ├── field_effects.h │ │ ├── field_tasks.h │ │ ├── field_weather.h │ │ ├── flags.h │ │ ├── game_stat.h │ │ ├── global.h │ │ ├── heal_locations.h │ │ ├── help_system.h │ │ ├── hoenn_cries.h │ │ ├── hold_effects.h │ │ ├── item_effects.h │ │ ├── item_menu.h │ │ ├── items.h │ │ ├── layouts.h │ │ ├── map_groups.h │ │ ├── map_scripts.h │ │ ├── map_types.h │ │ ├── maps.h │ │ ├── master_opponents.h │ │ ├── menu.h │ │ ├── metatile_behaviors.h │ │ ├── metatile_labels.h │ │ ├── moves.h │ │ ├── mystery_gift.h │ │ ├── opponents.h │ │ ├── party_menu.h │ │ ├── pokedex.h │ │ ├── pokemon.h │ │ ├── quest_log.h │ │ ├── region_map_sections.h │ │ ├── rgb.h │ │ ├── seagallop.h │ │ ├── songs.h │ │ ├── sound.h │ │ ├── species.h │ │ ├── trade.h │ │ ├── trainer_card.h │ │ ├── trainer_fan_club.h │ │ ├── trainer_tower.h │ │ ├── trainer_types.h │ │ ├── trainers.h │ │ ├── union_room.h │ │ ├── vars.h │ │ └── weather.h │ ├── coord_event_weather.h │ ├── credits.h │ ├── data.h │ ├── daycare.h │ ├── decompress.h │ ├── decoration.h │ ├── digit_obj_util.h │ ├── diploma.h │ ├── dma3.h │ ├── dodrio_berry_picking.h │ ├── dynamic_placeholder_text_util.h │ ├── easy_chat.h │ ├── egg_hatch.h │ ├── ereader_helpers.h │ ├── event_data.h │ ├── event_object_lock.h │ ├── event_object_movement.h │ ├── event_scripts.h │ ├── evolution_graphics.h │ ├── evolution_scene.h │ ├── fame_checker.h │ ├── faraway_island.h │ ├── field_camera.h │ ├── field_control_avatar.h │ ├── field_door.h │ ├── field_effect.h │ ├── field_effect_helpers.h │ ├── field_effect_scripts.h │ ├── field_fadetransition.h │ ├── field_message_box.h │ ├── field_player_avatar.h │ ├── field_poison.h │ ├── field_screen.h │ ├── field_screen_effect.h │ ├── field_specials.h │ ├── field_tasks.h │ ├── field_weather.h │ ├── field_weather_effects.h │ ├── field_weather_util.h │ ├── fieldmap.h │ ├── fldeff.h │ ├── gba/ │ │ ├── defines.h │ │ ├── flash_internal.h │ │ ├── gba.h │ │ ├── io_reg.h │ │ ├── isagbprint.h │ │ ├── m4a_internal.h │ │ ├── macro.h │ │ ├── multiboot.h │ │ ├── syscall.h │ │ └── types.h │ ├── gflib.h │ ├── global.berry.h │ ├── global.fieldmap.h │ ├── global.h │ ├── gpu_regs.h │ ├── graphics.h │ ├── hall_of_fame.h │ ├── heal_location.h │ ├── help_message.h │ ├── help_system.h │ ├── image_processing_effects.h │ ├── intro.h │ ├── item.h │ ├── item_menu.h │ ├── item_menu_icons.h │ ├── item_pc.h │ ├── item_use.h │ ├── itemfinder.h │ ├── keyboard_text.h │ ├── libgcnmultiboot.h │ ├── librfu.h │ ├── link.h │ ├── link_rfu.h │ ├── list_menu.h │ ├── load_save.h │ ├── m4a.h │ ├── mail.h │ ├── mail_data.h │ ├── mailbox_pc.h │ ├── main.h │ ├── main_menu.h │ ├── malloc.h │ ├── map_name_popup.h │ ├── map_preview_screen.h │ ├── math_util.h │ ├── menu.h │ ├── menu_helpers.h │ ├── menu_indicators.h │ ├── metatile_behavior.h │ ├── mini_printf.h │ ├── minigame_countdown.h │ ├── mon_markings.h │ ├── money.h │ ├── multiboot.h │ ├── mystery_event_msg.h │ ├── mystery_event_script.h │ ├── mystery_gift.h │ ├── mystery_gift_client.h │ ├── mystery_gift_link.h │ ├── mystery_gift_menu.h │ ├── mystery_gift_server.h │ ├── naming_screen.h │ ├── new_game.h │ ├── new_menu_helpers.h │ ├── oak_speech.h │ ├── option_menu.h │ ├── orre_met_location_strings.h │ ├── overworld.h │ ├── palette.h │ ├── palette_util.h │ ├── party_menu.h │ ├── pc_screen_effect.h │ ├── play_time.h │ ├── player_pc.h │ ├── pokeball.h │ ├── pokedex.h │ ├── pokedex_area_markers.h │ ├── pokedex_screen.h │ ├── pokemon.h │ ├── pokemon_icon.h │ ├── pokemon_item_effects.h │ ├── pokemon_jump.h │ ├── pokemon_size_record.h │ ├── pokemon_special_anim.h │ ├── pokemon_special_anim_internal.h │ ├── pokemon_storage_system.h │ ├── pokemon_storage_system_internal.h │ ├── pokemon_summary_screen.h │ ├── quest_log.h │ ├── quest_log_battle.h │ ├── quest_log_objects.h │ ├── quest_log_player.h │ ├── random.h │ ├── region_map.h │ ├── renewable_hidden_items.h │ ├── reset_save_heap.h │ ├── reshow_battle_screen.h │ ├── roamer.h │ ├── safari_zone.h │ ├── save.h │ ├── save_failed_screen.h │ ├── save_location.h │ ├── save_menu_util.h │ ├── scanline_effect.h │ ├── script.h │ ├── script_menu.h │ ├── script_movement.h │ ├── script_pokemon_util.h │ ├── shop.h │ ├── slot_machine.h │ ├── sound.h │ ├── special_field_anim.h │ ├── sprite.h │ ├── start_menu.h │ ├── string_util.h │ ├── strings.h │ ├── task.h │ ├── teachy_tv.h │ ├── text.h │ ├── text_window.h │ ├── text_window_graphics.h │ ├── tilemap_util.h │ ├── tileset_anims.h │ ├── tilesets.h │ ├── title_screen.h │ ├── tm_case.h │ ├── trade.h │ ├── trade_scene.h │ ├── trainer_card.h │ ├── trainer_front_sprites.h │ ├── trainer_ids.h │ ├── trainer_pokemon_sprites.h │ ├── trainer_see.h │ ├── trainer_tower.h │ ├── trig.h │ ├── union_room.h │ ├── union_room_battle.h │ ├── union_room_chat.h │ ├── union_room_chat_display.h │ ├── union_room_chat_objects.h │ ├── union_room_message.h │ ├── union_room_player_avatar.h │ ├── util.h │ ├── vs_seeker.h │ ├── wild_encounter.h │ ├── wild_pokemon_area.h │ ├── window.h │ └── wonder_news.h ├── json_data_rules.mk ├── ld_script.ld ├── ld_script_modern.ld ├── leafgreen.sha1 ├── leafgreen_rev1.sha1 ├── map_data_rules.mk ├── patch/ │ └── frlgPlus.bps ├── replace.sh ├── songs.mk ├── sound/ │ ├── MPlayDef.s │ ├── cry_tables.inc │ ├── direct_sound_data.inc │ ├── direct_sound_samples/ │ │ ├── bicycle_bell.aif │ │ ├── classical_choir_voice_ahhs.aif │ │ ├── cries/ │ │ │ ├── abra.aif │ │ │ ├── absol.aif │ │ │ ├── aerodactyl.aif │ │ │ ├── aggron.aif │ │ │ ├── aipom.aif │ │ │ ├── alakazam.aif │ │ │ ├── altaria.aif │ │ │ ├── ampharos.aif │ │ │ ├── anorith.aif │ │ │ ├── arbok.aif │ │ │ ├── arcanine.aif │ │ │ ├── ariados.aif │ │ │ ├── armaldo.aif │ │ │ ├── aron.aif │ │ │ ├── articuno.aif │ │ │ ├── azumarill.aif │ │ │ ├── azurill.aif │ │ │ ├── bagon.aif │ │ │ ├── baltoy.aif │ │ │ ├── banette.aif │ │ │ ├── barboach.aif │ │ │ ├── bayleef.aif │ │ │ ├── beautifly.aif │ │ │ ├── beedrill.aif │ │ │ ├── beldum.aif │ │ │ ├── bellossom.aif │ │ │ ├── bellsprout.aif │ │ │ ├── blastoise.aif │ │ │ ├── blaziken.aif │ │ │ ├── blissey.aif │ │ │ ├── breloom.aif │ │ │ ├── bulbasaur.aif │ │ │ ├── butterfree.aif │ │ │ ├── cacnea.aif │ │ │ ├── cacturne.aif │ │ │ ├── camerupt.aif │ │ │ ├── carvanha.aif │ │ │ ├── cascoon.aif │ │ │ ├── castform.aif │ │ │ ├── caterpie.aif │ │ │ ├── celebi.aif │ │ │ ├── chansey.aif │ │ │ ├── charizard.aif │ │ │ ├── charmander.aif │ │ │ ├── charmeleon.aif │ │ │ ├── chikorita.aif │ │ │ ├── chimecho.aif │ │ │ ├── chinchou.aif │ │ │ ├── clamperl.aif │ │ │ ├── claydol.aif │ │ │ ├── clefable.aif │ │ │ ├── clefairy.aif │ │ │ ├── cleffa.aif │ │ │ ├── cloyster.aif │ │ │ ├── combusken.aif │ │ │ ├── corphish.aif │ │ │ ├── corsola.aif │ │ │ ├── cradily.aif │ │ │ ├── crawdaunt.aif │ │ │ ├── crobat.aif │ │ │ ├── croconaw.aif │ │ │ ├── cubone.aif │ │ │ ├── cyndaquil.aif │ │ │ ├── delcatty.aif │ │ │ ├── delibird.aif │ │ │ ├── deoxys.aif │ │ │ ├── dewgong.aif │ │ │ ├── diglett.aif │ │ │ ├── ditto.aif │ │ │ ├── dodrio.aif │ │ │ ├── doduo.aif │ │ │ ├── donphan.aif │ │ │ ├── dragonair.aif │ │ │ ├── dragonite.aif │ │ │ ├── dratini.aif │ │ │ ├── drowzee.aif │ │ │ ├── dugtrio.aif │ │ │ ├── dunsparce.aif │ │ │ ├── dusclops.aif │ │ │ ├── duskull.aif │ │ │ ├── dustox.aif │ │ │ ├── eevee.aif │ │ │ ├── ekans.aif │ │ │ ├── electabuzz.aif │ │ │ ├── electrike.aif │ │ │ ├── electrode.aif │ │ │ ├── elekid.aif │ │ │ ├── entei.aif │ │ │ ├── espeon.aif │ │ │ ├── exeggcute.aif │ │ │ ├── exeggutor.aif │ │ │ ├── exploud.aif │ │ │ ├── farfetchd.aif │ │ │ ├── fearow.aif │ │ │ ├── feebas.aif │ │ │ ├── feraligatr.aif │ │ │ ├── flaaffy.aif │ │ │ ├── flareon.aif │ │ │ ├── flygon.aif │ │ │ ├── forretress.aif │ │ │ ├── furret.aif │ │ │ ├── gardevoir.aif │ │ │ ├── gastly.aif │ │ │ ├── gengar.aif │ │ │ ├── geodude.aif │ │ │ ├── girafarig.aif │ │ │ ├── glalie.aif │ │ │ ├── gligar.aif │ │ │ ├── gloom.aif │ │ │ ├── golbat.aif │ │ │ ├── goldeen.aif │ │ │ ├── golduck.aif │ │ │ ├── golem.aif │ │ │ ├── gorebyss.aif │ │ │ ├── granbull.aif │ │ │ ├── graveler.aif │ │ │ ├── grimer.aif │ │ │ ├── groudon.aif │ │ │ ├── grovyle.aif │ │ │ ├── growlithe.aif │ │ │ ├── grumpig.aif │ │ │ ├── gulpin.aif │ │ │ ├── gyarados.aif │ │ │ ├── hariyama.aif │ │ │ ├── haunter.aif │ │ │ ├── heracross.aif │ │ │ ├── hitmonchan.aif │ │ │ ├── hitmonlee.aif │ │ │ ├── hitmontop.aif │ │ │ ├── ho_oh.aif │ │ │ ├── hoothoot.aif │ │ │ ├── hoppip.aif │ │ │ ├── horsea.aif │ │ │ ├── houndoom.aif │ │ │ ├── houndour.aif │ │ │ ├── huntail.aif │ │ │ ├── hypno.aif │ │ │ ├── igglybuff.aif │ │ │ ├── illumise.aif │ │ │ ├── ivysaur.aif │ │ │ ├── jigglypuff.aif │ │ │ ├── jirachi.aif │ │ │ ├── jolteon.aif │ │ │ ├── jumpluff.aif │ │ │ ├── jynx.aif │ │ │ ├── kabuto.aif │ │ │ ├── kabutops.aif │ │ │ ├── kadabra.aif │ │ │ ├── kakuna.aif │ │ │ ├── kangaskhan.aif │ │ │ ├── kecleon.aif │ │ │ ├── kingdra.aif │ │ │ ├── kingler.aif │ │ │ ├── kirlia.aif │ │ │ ├── koffing.aif │ │ │ ├── krabby.aif │ │ │ ├── kyogre.aif │ │ │ ├── lairon.aif │ │ │ ├── lanturn.aif │ │ │ ├── lapras.aif │ │ │ ├── larvitar.aif │ │ │ ├── latias.aif │ │ │ ├── latios.aif │ │ │ ├── ledian.aif │ │ │ ├── ledyba.aif │ │ │ ├── lickitung.aif │ │ │ ├── lileep.aif │ │ │ ├── linoone.aif │ │ │ ├── lombre.aif │ │ │ ├── lotad.aif │ │ │ ├── loudred.aif │ │ │ ├── ludicolo.aif │ │ │ ├── lugia.aif │ │ │ ├── lunatone.aif │ │ │ ├── luvdisc.aif │ │ │ ├── machamp.aif │ │ │ ├── machoke.aif │ │ │ ├── machop.aif │ │ │ ├── magby.aif │ │ │ ├── magcargo.aif │ │ │ ├── magikarp.aif │ │ │ ├── magmar.aif │ │ │ ├── magnemite.aif │ │ │ ├── magneton.aif │ │ │ ├── makuhita.aif │ │ │ ├── manectric.aif │ │ │ ├── mankey.aif │ │ │ ├── mantine.aif │ │ │ ├── mareep.aif │ │ │ ├── marill.aif │ │ │ ├── marowak.aif │ │ │ ├── marshtomp.aif │ │ │ ├── masquerain.aif │ │ │ ├── mawile.aif │ │ │ ├── medicham.aif │ │ │ ├── meditite.aif │ │ │ ├── meganium.aif │ │ │ ├── meowth.aif │ │ │ ├── metagross.aif │ │ │ ├── metang.aif │ │ │ ├── metapod.aif │ │ │ ├── mew.aif │ │ │ ├── mewtwo.aif │ │ │ ├── mightyena.aif │ │ │ ├── milotic.aif │ │ │ ├── miltank.aif │ │ │ ├── minun.aif │ │ │ ├── misdreavus.aif │ │ │ ├── moltres.aif │ │ │ ├── mr_mime.aif │ │ │ ├── mudkip.aif │ │ │ ├── muk.aif │ │ │ ├── murkrow.aif │ │ │ ├── natu.aif │ │ │ ├── nidoking.aif │ │ │ ├── nidoqueen.aif │ │ │ ├── nidoran_f.aif │ │ │ ├── nidoran_m.aif │ │ │ ├── nidorina.aif │ │ │ ├── nidorino.aif │ │ │ ├── nincada.aif │ │ │ ├── ninetales.aif │ │ │ ├── ninjask.aif │ │ │ ├── noctowl.aif │ │ │ ├── nosepass.aif │ │ │ ├── numel.aif │ │ │ ├── nuzleaf.aif │ │ │ ├── octillery.aif │ │ │ ├── oddish.aif │ │ │ ├── omanyte.aif │ │ │ ├── omastar.aif │ │ │ ├── onix.aif │ │ │ ├── paras.aif │ │ │ ├── parasect.aif │ │ │ ├── pelipper.aif │ │ │ ├── persian.aif │ │ │ ├── phanpy.aif │ │ │ ├── pichu.aif │ │ │ ├── pidgeot.aif │ │ │ ├── pidgeotto.aif │ │ │ ├── pidgey.aif │ │ │ ├── pikachu.aif │ │ │ ├── piloswine.aif │ │ │ ├── pineco.aif │ │ │ ├── pinsir.aif │ │ │ ├── plusle.aif │ │ │ ├── politoed.aif │ │ │ ├── poliwag.aif │ │ │ ├── poliwhirl.aif │ │ │ ├── poliwrath.aif │ │ │ ├── ponyta.aif │ │ │ ├── poochyena.aif │ │ │ ├── porygon.aif │ │ │ ├── porygon2.aif │ │ │ ├── primeape.aif │ │ │ ├── psyduck.aif │ │ │ ├── pupitar.aif │ │ │ ├── quagsire.aif │ │ │ ├── quilava.aif │ │ │ ├── qwilfish.aif │ │ │ ├── raichu.aif │ │ │ ├── raikou.aif │ │ │ ├── ralts.aif │ │ │ ├── rapidash.aif │ │ │ ├── raticate.aif │ │ │ ├── rattata.aif │ │ │ ├── rayquaza.aif │ │ │ ├── regice.aif │ │ │ ├── regirock.aif │ │ │ ├── registeel.aif │ │ │ ├── relicanth.aif │ │ │ ├── remoraid.aif │ │ │ ├── rhydon.aif │ │ │ ├── rhyhorn.aif │ │ │ ├── roselia.aif │ │ │ ├── sableye.aif │ │ │ ├── salamence.aif │ │ │ ├── sandshrew.aif │ │ │ ├── sandslash.aif │ │ │ ├── sceptile.aif │ │ │ ├── scizor.aif │ │ │ ├── scyther.aif │ │ │ ├── seadra.aif │ │ │ ├── seaking.aif │ │ │ ├── sealeo.aif │ │ │ ├── seedot.aif │ │ │ ├── seel.aif │ │ │ ├── sentret.aif │ │ │ ├── seviper.aif │ │ │ ├── sharpedo.aif │ │ │ ├── shedinja.aif │ │ │ ├── shelgon.aif │ │ │ ├── shellder.aif │ │ │ ├── shiftry.aif │ │ │ ├── shroomish.aif │ │ │ ├── shuckle.aif │ │ │ ├── shuppet.aif │ │ │ ├── silcoon.aif │ │ │ ├── skarmory.aif │ │ │ ├── skiploom.aif │ │ │ ├── skitty.aif │ │ │ ├── slaking.aif │ │ │ ├── slakoth.aif │ │ │ ├── slowbro.aif │ │ │ ├── slowking.aif │ │ │ ├── slowpoke.aif │ │ │ ├── slugma.aif │ │ │ ├── smeargle.aif │ │ │ ├── smoochum.aif │ │ │ ├── sneasel.aif │ │ │ ├── snorlax.aif │ │ │ ├── snorunt.aif │ │ │ ├── snubbull.aif │ │ │ ├── solrock.aif │ │ │ ├── spearow.aif │ │ │ ├── spheal.aif │ │ │ ├── spinarak.aif │ │ │ ├── spinda.aif │ │ │ ├── spoink.aif │ │ │ ├── squirtle.aif │ │ │ ├── stantler.aif │ │ │ ├── starmie.aif │ │ │ ├── staryu.aif │ │ │ ├── steelix.aif │ │ │ ├── sudowoodo.aif │ │ │ ├── suicune.aif │ │ │ ├── sunflora.aif │ │ │ ├── sunkern.aif │ │ │ ├── surskit.aif │ │ │ ├── swablu.aif │ │ │ ├── swalot.aif │ │ │ ├── swampert.aif │ │ │ ├── swellow.aif │ │ │ ├── swinub.aif │ │ │ ├── taillow.aif │ │ │ ├── tangela.aif │ │ │ ├── tauros.aif │ │ │ ├── teddiursa.aif │ │ │ ├── tentacool.aif │ │ │ ├── tentacruel.aif │ │ │ ├── togepi.aif │ │ │ ├── togetic.aif │ │ │ ├── torchic.aif │ │ │ ├── torkoal.aif │ │ │ ├── totodile.aif │ │ │ ├── trapinch.aif │ │ │ ├── treecko.aif │ │ │ ├── tropius.aif │ │ │ ├── typhlosion.aif │ │ │ ├── tyranitar.aif │ │ │ ├── tyrogue.aif │ │ │ ├── umbreon.aif │ │ │ ├── unown.aif │ │ │ ├── unused_265.aif │ │ │ ├── unused_268.aif │ │ │ ├── ursaring.aif │ │ │ ├── vaporeon.aif │ │ │ ├── venomoth.aif │ │ │ ├── venonat.aif │ │ │ ├── venusaur.aif │ │ │ ├── vibrava.aif │ │ │ ├── victreebel.aif │ │ │ ├── vigoroth.aif │ │ │ ├── vileplume.aif │ │ │ ├── volbeat.aif │ │ │ ├── voltorb.aif │ │ │ ├── vulpix.aif │ │ │ ├── wailmer.aif │ │ │ ├── wailord.aif │ │ │ ├── walrein.aif │ │ │ ├── wartortle.aif │ │ │ ├── weedle.aif │ │ │ ├── weepinbell.aif │ │ │ ├── weezing.aif │ │ │ ├── whiscash.aif │ │ │ ├── whismur.aif │ │ │ ├── wigglytuff.aif │ │ │ ├── wingull.aif │ │ │ ├── wobbuffet.aif │ │ │ ├── wooper.aif │ │ │ ├── wurmple.aif │ │ │ ├── wynaut.aif │ │ │ ├── xatu.aif │ │ │ ├── yanma.aif │ │ │ ├── zangoose.aif │ │ │ ├── zapdos.aif │ │ │ ├── zigzagoon.aif │ │ │ └── zubat.aif │ │ ├── dance_drums_ride_bell.aif │ │ ├── drum_and_percussion_kick.aif │ │ ├── ethnic_flavours_atarigane.aif │ │ ├── ethnic_flavours_hyoushigi.aif │ │ ├── ethnic_flavours_kotsuzumi.aif │ │ ├── ethnic_flavours_ohtsuzumi.aif │ │ ├── heart_of_asia_gamelan.aif │ │ ├── phonemes/ │ │ │ ├── 01.aif │ │ │ ├── 02.aif │ │ │ ├── 03.aif │ │ │ ├── 04.aif │ │ │ ├── 05.aif │ │ │ ├── 06.aif │ │ │ ├── 07.aif │ │ │ ├── 08.aif │ │ │ ├── 09.aif │ │ │ ├── 10.aif │ │ │ ├── 11.aif │ │ │ ├── 12.aif │ │ │ ├── 13.aif │ │ │ ├── 14.aif │ │ │ ├── 15.aif │ │ │ ├── 16.aif │ │ │ ├── 17.aif │ │ │ ├── 18.aif │ │ │ ├── 19.aif │ │ │ ├── 20.aif │ │ │ ├── 21.aif │ │ │ ├── 22.aif │ │ │ ├── 23.aif │ │ │ ├── 24.aif │ │ │ ├── 25.aif │ │ │ ├── 26.aif │ │ │ ├── 27.aif │ │ │ ├── 28.aif │ │ │ ├── 29.aif │ │ │ ├── 30.aif │ │ │ ├── 31.aif │ │ │ ├── 32.aif │ │ │ ├── 33.aif │ │ │ ├── 34.aif │ │ │ ├── 35.aif │ │ │ ├── 36.aif │ │ │ ├── 37.aif │ │ │ ├── 38.aif │ │ │ ├── 39.aif │ │ │ ├── 40.aif │ │ │ ├── 41.aif │ │ │ ├── 42.aif │ │ │ ├── 43.aif │ │ │ ├── 44.aif │ │ │ ├── 45.aif │ │ │ ├── 46.aif │ │ │ ├── 47.aif │ │ │ ├── 48.aif │ │ │ ├── 49.aif │ │ │ ├── 50.aif │ │ │ └── 51.aif │ │ ├── register_noise.aif │ │ ├── sc88pro_accordion.aif │ │ ├── sc88pro_accordion_duplicate.aif │ │ ├── sc88pro_bubbles.aif │ │ ├── sc88pro_church_organ3_high.aif │ │ ├── sc88pro_church_organ3_low.aif │ │ ├── sc88pro_fingered_bass.aif │ │ ├── sc88pro_flute.aif │ │ ├── sc88pro_french_horn_60.aif │ │ ├── sc88pro_french_horn_72.aif │ │ ├── sc88pro_fretless_bass.aif │ │ ├── sc88pro_glockenspiel.aif │ │ ├── sc88pro_harp.aif │ │ ├── sc88pro_jingle_bell.aif │ │ ├── sc88pro_mute_high_conga.aif │ │ ├── sc88pro_nylon_str_guitar.aif │ │ ├── sc88pro_open_low_conga.aif │ │ ├── sc88pro_orchestra_cymbal_crash.aif │ │ ├── sc88pro_orchestra_snare.aif │ │ ├── sc88pro_organ2.aif │ │ ├── sc88pro_piano1_48.aif │ │ ├── sc88pro_piano1_60.aif │ │ ├── sc88pro_piano1_72.aif │ │ ├── sc88pro_piano1_84.aif │ │ ├── sc88pro_pizzicato_strings.aif │ │ ├── sc88pro_rnd_kick.aif │ │ ├── sc88pro_rnd_snare.aif │ │ ├── sc88pro_slap_bass.aif │ │ ├── sc88pro_square_wave.aif │ │ ├── sc88pro_string_ensemble_60.aif │ │ ├── sc88pro_string_ensemble_72.aif │ │ ├── sc88pro_string_ensemble_84.aif │ │ ├── sc88pro_synth_bass.aif │ │ ├── sc88pro_taiko.aif │ │ ├── sc88pro_tambourine.aif │ │ ├── sc88pro_timpani.aif │ │ ├── sc88pro_timpani_with_snare.aif │ │ ├── sc88pro_tr909_hand_clap.aif │ │ ├── sc88pro_trumpet_60.aif │ │ ├── sc88pro_trumpet_72.aif │ │ ├── sc88pro_trumpet_84.aif │ │ ├── sc88pro_tuba_39.aif │ │ ├── sc88pro_tuba_51.aif │ │ ├── sc88pro_tubular_bell.aif │ │ ├── sc88pro_wind.aif │ │ ├── sc88pro_xylophone.aif │ │ ├── sd90_ambient_tom.aif │ │ ├── sd90_classical_detuned_ep1_high.aif │ │ ├── sd90_classical_detuned_ep1_low.aif │ │ ├── sd90_classical_distortion_guitar_high.aif │ │ ├── sd90_classical_distortion_guitar_low.aif │ │ ├── sd90_classical_oboe.aif │ │ ├── sd90_classical_overdrive_guitar.aif │ │ ├── sd90_classical_shakuhachi.aif │ │ ├── sd90_classical_whistle.aif │ │ ├── sd90_cowbell.aif │ │ ├── sd90_enhanced_delay_shaku.aif │ │ ├── sd90_open_triangle.aif │ │ ├── sd90_solo_snare.aif │ │ ├── sd90_special_scream_drive.aif │ │ ├── steinway_b_piano.aif │ │ ├── trinity_30303_mega_bass.aif │ │ ├── trinity_big_boned.aif │ │ ├── trinity_cymbal_crash.aif │ │ ├── unknown_01.aif │ │ ├── unknown_02.aif │ │ ├── unknown_03.aif │ │ ├── unknown_04.aif │ │ ├── unknown_05.aif │ │ ├── unknown_06.aif │ │ ├── unknown_07.aif │ │ ├── unknown_08.aif │ │ ├── unknown_09.aif │ │ ├── unknown_10.aif │ │ ├── unknown_11.aif │ │ ├── unknown_12.aif │ │ ├── unknown_13.aif │ │ ├── unknown_14.aif │ │ ├── unknown_15.aif │ │ ├── unknown_16.aif │ │ ├── unknown_17.aif │ │ ├── unknown_18.aif │ │ ├── unknown_bell.aif │ │ ├── unknown_close_hihat.aif │ │ ├── unknown_female_voice.aif │ │ ├── unknown_koto_high.aif │ │ ├── unknown_koto_low.aif │ │ ├── unknown_open_hihat.aif │ │ ├── unknown_snare.aif │ │ ├── unknown_synth_snare.aif │ │ ├── unused_guitar_separates_power_chord.aif │ │ ├── unused_heart_of_asia_indian_drum.aif │ │ ├── unused_sc55_tom.aif │ │ ├── unused_sc88pro_unison_slap.aif │ │ ├── unused_sd90_oboe.aif │ │ ├── unused_unknown_male_voice.aif │ │ ├── wave_54.aif │ │ └── wave_77.aif │ ├── keysplit_tables.inc │ ├── music_player_table.inc │ ├── programmable_wave_data.inc │ ├── programmable_wave_samples/ │ │ ├── 01.pcm │ │ ├── 02.pcm │ │ ├── 03.pcm │ │ ├── 04.pcm │ │ ├── 05.pcm │ │ ├── 06.pcm │ │ ├── 07.pcm │ │ ├── 08.pcm │ │ ├── 09.pcm │ │ ├── 10.pcm │ │ ├── 11.pcm │ │ ├── 12.pcm │ │ ├── 13.pcm │ │ ├── 14.pcm │ │ ├── 15.pcm │ │ ├── 16.pcm │ │ ├── 17.pcm │ │ ├── 18.pcm │ │ ├── 19.pcm │ │ ├── 20.pcm │ │ ├── 21.pcm │ │ ├── 22.pcm │ │ ├── 23.pcm │ │ ├── 24.pcm │ │ └── 25.pcm │ ├── song_table.inc │ ├── songs/ │ │ ├── midi/ │ │ │ ├── mus_abandoned_ship.mid │ │ │ ├── mus_abnormal_weather.mid │ │ │ ├── mus_aqua_magma_hideout.mid │ │ │ ├── mus_awaken_legend.mid │ │ │ ├── mus_b_arena.mid │ │ │ ├── mus_b_dome.mid │ │ │ ├── mus_b_dome_lobby.mid │ │ │ ├── mus_b_factory.mid │ │ │ ├── mus_b_frontier.mid │ │ │ ├── mus_b_palace.mid │ │ │ ├── mus_b_pike.mid │ │ │ ├── mus_b_pyramid.mid │ │ │ ├── mus_b_pyramid_top.mid │ │ │ ├── mus_b_tower.mid │ │ │ ├── mus_b_tower_rs.mid │ │ │ ├── mus_birch_lab.mid │ │ │ ├── mus_c_comm_center.mid │ │ │ ├── mus_c_vs_legend_beast.mid │ │ │ ├── mus_cable_car.mid │ │ │ ├── mus_caught.mid │ │ │ ├── mus_cave_of_origin.mid │ │ │ ├── mus_contest.mid │ │ │ ├── mus_contest_lobby.mid │ │ │ ├── mus_contest_results.mid │ │ │ ├── mus_contest_winner.mid │ │ │ ├── mus_credits.mid │ │ │ ├── mus_cycling.mid │ │ │ ├── mus_dewford.mid │ │ │ ├── mus_dummy.mid │ │ │ ├── mus_encounter_aqua.mid │ │ │ ├── mus_encounter_brendan.mid │ │ │ ├── mus_encounter_champion.mid │ │ │ ├── mus_encounter_cool.mid │ │ │ ├── mus_encounter_elite_four.mid │ │ │ ├── mus_encounter_female.mid │ │ │ ├── mus_encounter_girl.mid │ │ │ ├── mus_encounter_hiker.mid │ │ │ ├── mus_encounter_intense.mid │ │ │ ├── mus_encounter_interviewer.mid │ │ │ ├── mus_encounter_magma.mid │ │ │ ├── mus_encounter_male.mid │ │ │ ├── mus_encounter_may.mid │ │ │ ├── mus_encounter_rich.mid │ │ │ ├── mus_encounter_suspicious.mid │ │ │ ├── mus_encounter_swimmer.mid │ │ │ ├── mus_encounter_twins.mid │ │ │ ├── mus_end.mid │ │ │ ├── mus_ever_grande.mid │ │ │ ├── mus_evolution.mid │ │ │ ├── mus_evolution_intro.mid │ │ │ ├── mus_evolved.mid │ │ │ ├── mus_fallarbor.mid │ │ │ ├── mus_follow_me.mid │ │ │ ├── mus_fortree.mid │ │ │ ├── mus_game_corner.mid │ │ │ ├── mus_gsc_pewter.mid │ │ │ ├── mus_gsc_route38.mid │ │ │ ├── mus_gym.mid │ │ │ ├── mus_hall_of_fame.mid │ │ │ ├── mus_hall_of_fame_room.mid │ │ │ ├── mus_heal.mid │ │ │ ├── mus_help.mid │ │ │ ├── mus_intro.mid │ │ │ ├── mus_intro_battle.mid │ │ │ ├── mus_level_up.mid │ │ │ ├── mus_lilycove.mid │ │ │ ├── mus_lilycove_museum.mid │ │ │ ├── mus_link_contest_p1.mid │ │ │ ├── mus_link_contest_p2.mid │ │ │ ├── mus_link_contest_p3.mid │ │ │ ├── mus_link_contest_p4.mid │ │ │ ├── mus_littleroot.mid │ │ │ ├── mus_littleroot_test.mid │ │ │ ├── mus_move_deleted.mid │ │ │ ├── mus_mt_chimney.mid │ │ │ ├── mus_mt_pyre.mid │ │ │ ├── mus_mt_pyre_exterior.mid │ │ │ ├── mus_obtain_b_points.mid │ │ │ ├── mus_obtain_badge.mid │ │ │ ├── mus_obtain_berry.mid │ │ │ ├── mus_obtain_item.mid │ │ │ ├── mus_obtain_symbol.mid │ │ │ ├── mus_obtain_tmhm.mid │ │ │ ├── mus_oceanic_museum.mid │ │ │ ├── mus_oldale.mid │ │ │ ├── mus_petalburg.mid │ │ │ ├── mus_petalburg_woods.mid │ │ │ ├── mus_poke_center.mid │ │ │ ├── mus_poke_mart.mid │ │ │ ├── mus_rayquaza_appears.mid │ │ │ ├── mus_register_match_call.mid │ │ │ ├── mus_rg_berry_pick.mid │ │ │ ├── mus_rg_caught.mid │ │ │ ├── mus_rg_caught_intro.mid │ │ │ ├── mus_rg_celadon.mid │ │ │ ├── mus_rg_cinnabar.mid │ │ │ ├── mus_rg_credits.mid │ │ │ ├── mus_rg_cycling.mid │ │ │ ├── mus_rg_dex_rating.mid │ │ │ ├── mus_rg_encounter_boy.mid │ │ │ ├── mus_rg_encounter_deoxys.mid │ │ │ ├── mus_rg_encounter_girl.mid │ │ │ ├── mus_rg_encounter_gym_leader.mid │ │ │ ├── mus_rg_encounter_rival.mid │ │ │ ├── mus_rg_encounter_rocket.mid │ │ │ ├── mus_rg_follow_me.mid │ │ │ ├── mus_rg_fuchsia.mid │ │ │ ├── mus_rg_game_corner.mid │ │ │ ├── mus_rg_game_freak.mid │ │ │ ├── mus_rg_gym.mid │ │ │ ├── mus_rg_hall_of_fame.mid │ │ │ ├── mus_rg_heal.mid │ │ │ ├── mus_rg_intro_fight.mid │ │ │ ├── mus_rg_jigglypuff.mid │ │ │ ├── mus_rg_lavender.mid │ │ │ ├── mus_rg_mt_moon.mid │ │ │ ├── mus_rg_mystery_gift.mid │ │ │ ├── mus_rg_net_center.mid │ │ │ ├── mus_rg_new_game_exit.mid │ │ │ ├── mus_rg_new_game_instruct.mid │ │ │ ├── mus_rg_new_game_intro.mid │ │ │ ├── mus_rg_oak.mid │ │ │ ├── mus_rg_oak_lab.mid │ │ │ ├── mus_rg_obtain_key_item.mid │ │ │ ├── mus_rg_pallet.mid │ │ │ ├── mus_rg_pewter.mid │ │ │ ├── mus_rg_photo.mid │ │ │ ├── mus_rg_poke_center.mid │ │ │ ├── mus_rg_poke_flute.mid │ │ │ ├── mus_rg_poke_jump.mid │ │ │ ├── mus_rg_poke_mansion.mid │ │ │ ├── mus_rg_poke_tower.mid │ │ │ ├── mus_rg_rival_exit.mid │ │ │ ├── mus_rg_rocket_hideout.mid │ │ │ ├── mus_rg_route1.mid │ │ │ ├── mus_rg_route11.mid │ │ │ ├── mus_rg_route24.mid │ │ │ ├── mus_rg_route3.mid │ │ │ ├── mus_rg_sevii_123.mid │ │ │ ├── mus_rg_sevii_45.mid │ │ │ ├── mus_rg_sevii_67.mid │ │ │ ├── mus_rg_sevii_cave.mid │ │ │ ├── mus_rg_sevii_dungeon.mid │ │ │ ├── mus_rg_sevii_route.mid │ │ │ ├── mus_rg_silph.mid │ │ │ ├── mus_rg_slow_pallet.mid │ │ │ ├── mus_rg_ss_anne.mid │ │ │ ├── mus_rg_surf.mid │ │ │ ├── mus_rg_teachy_tv_menu.mid │ │ │ ├── mus_rg_teachy_tv_show.mid │ │ │ ├── mus_rg_title.mid │ │ │ ├── mus_rg_trainer_tower.mid │ │ │ ├── mus_rg_union_room.mid │ │ │ ├── mus_rg_vermillion.mid │ │ │ ├── mus_rg_victory_gym_leader.mid │ │ │ ├── mus_rg_victory_road.mid │ │ │ ├── mus_rg_victory_trainer.mid │ │ │ ├── mus_rg_victory_wild.mid │ │ │ ├── mus_rg_viridian_forest.mid │ │ │ ├── mus_rg_vs_champion.mid │ │ │ ├── mus_rg_vs_deoxys.mid │ │ │ ├── mus_rg_vs_gym_leader.mid │ │ │ ├── mus_rg_vs_legend.mid │ │ │ ├── mus_rg_vs_mewtwo.mid │ │ │ ├── mus_rg_vs_trainer.mid │ │ │ ├── mus_rg_vs_wild.mid │ │ │ ├── mus_roulette.mid │ │ │ ├── mus_route101.mid │ │ │ ├── mus_route104.mid │ │ │ ├── mus_route110.mid │ │ │ ├── mus_route111.mid │ │ │ ├── mus_route113.mid │ │ │ ├── mus_route119.mid │ │ │ ├── mus_route120.mid │ │ │ ├── mus_route122.mid │ │ │ ├── mus_rustboro.mid │ │ │ ├── mus_safari_zone.mid │ │ │ ├── mus_sailing.mid │ │ │ ├── mus_school.mid │ │ │ ├── mus_sealed_chamber.mid │ │ │ ├── mus_slateport.mid │ │ │ ├── mus_slots_jackpot.mid │ │ │ ├── mus_slots_win.mid │ │ │ ├── mus_sootopolis.mid │ │ │ ├── mus_surf.mid │ │ │ ├── mus_title.mid │ │ │ ├── mus_too_bad.mid │ │ │ ├── mus_trick_house.mid │ │ │ ├── mus_underwater.mid │ │ │ ├── mus_verdanturf.mid │ │ │ ├── mus_victory_aqua_magma.mid │ │ │ ├── mus_victory_gym_leader.mid │ │ │ ├── mus_victory_league.mid │ │ │ ├── mus_victory_road.mid │ │ │ ├── mus_victory_trainer.mid │ │ │ ├── mus_victory_wild.mid │ │ │ ├── mus_vs_aqua_magma.mid │ │ │ ├── mus_vs_aqua_magma_leader.mid │ │ │ ├── mus_vs_champion.mid │ │ │ ├── mus_vs_elite_four.mid │ │ │ ├── mus_vs_frontier_brain.mid │ │ │ ├── mus_vs_gym_leader.mid │ │ │ ├── mus_vs_kyogre_groudon.mid │ │ │ ├── mus_vs_mew.mid │ │ │ ├── mus_vs_rayquaza.mid │ │ │ ├── mus_vs_regi.mid │ │ │ ├── mus_vs_rival.mid │ │ │ ├── mus_vs_trainer.mid │ │ │ ├── mus_vs_wild.mid │ │ │ ├── mus_weather_groudon.mid │ │ │ ├── ph_choice_blend.mid │ │ │ ├── ph_choice_held.mid │ │ │ ├── ph_choice_solo.mid │ │ │ ├── ph_cloth_blend.mid │ │ │ ├── ph_cloth_held.mid │ │ │ ├── ph_cloth_solo.mid │ │ │ ├── ph_cure_blend.mid │ │ │ ├── ph_cure_held.mid │ │ │ ├── ph_cure_solo.mid │ │ │ ├── ph_dress_blend.mid │ │ │ ├── ph_dress_held.mid │ │ │ ├── ph_dress_solo.mid │ │ │ ├── ph_face_blend.mid │ │ │ ├── ph_face_held.mid │ │ │ ├── ph_face_solo.mid │ │ │ ├── ph_fleece_blend.mid │ │ │ ├── ph_fleece_held.mid │ │ │ ├── ph_fleece_solo.mid │ │ │ ├── ph_foot_blend.mid │ │ │ ├── ph_foot_held.mid │ │ │ ├── ph_foot_solo.mid │ │ │ ├── ph_goat_blend.mid │ │ │ ├── ph_goat_held.mid │ │ │ ├── ph_goat_solo.mid │ │ │ ├── ph_goose_blend.mid │ │ │ ├── ph_goose_held.mid │ │ │ ├── ph_goose_solo.mid │ │ │ ├── ph_kit_blend.mid │ │ │ ├── ph_kit_held.mid │ │ │ ├── ph_kit_solo.mid │ │ │ ├── ph_lot_blend.mid │ │ │ ├── ph_lot_held.mid │ │ │ ├── ph_lot_solo.mid │ │ │ ├── ph_mouth_blend.mid │ │ │ ├── ph_mouth_held.mid │ │ │ ├── ph_mouth_solo.mid │ │ │ ├── ph_nurse_blend.mid │ │ │ ├── ph_nurse_held.mid │ │ │ ├── ph_nurse_solo.mid │ │ │ ├── ph_price_blend.mid │ │ │ ├── ph_price_held.mid │ │ │ ├── ph_price_solo.mid │ │ │ ├── ph_strut_blend.mid │ │ │ ├── ph_strut_held.mid │ │ │ ├── ph_strut_solo.mid │ │ │ ├── ph_thought_blend.mid │ │ │ ├── ph_thought_held.mid │ │ │ ├── ph_thought_solo.mid │ │ │ ├── ph_trap_blend.mid │ │ │ ├── ph_trap_held.mid │ │ │ ├── ph_trap_solo.mid │ │ │ ├── se_a.mid │ │ │ ├── se_applause.mid │ │ │ ├── se_arena_timeup1.mid │ │ │ ├── se_arena_timeup2.mid │ │ │ ├── se_ball.mid │ │ │ ├── se_ball_bounce_1.mid │ │ │ ├── se_ball_bounce_2.mid │ │ │ ├── se_ball_bounce_3.mid │ │ │ ├── se_ball_bounce_4.mid │ │ │ ├── se_ball_open.mid │ │ │ ├── se_ball_throw.mid │ │ │ ├── se_ball_trade.mid │ │ │ ├── se_ball_tray_ball.mid │ │ │ ├── se_ball_tray_enter.mid │ │ │ ├── se_ball_tray_exit.mid │ │ │ ├── se_balloon_blue.mid │ │ │ ├── se_balloon_red.mid │ │ │ ├── se_balloon_yellow.mid │ │ │ ├── se_bang.mid │ │ │ ├── se_berry_blender.mid │ │ │ ├── se_bike_bell.mid │ │ │ ├── se_bike_hop.mid │ │ │ ├── se_boo.mid │ │ │ ├── se_breakable_door.mid │ │ │ ├── se_bridge_walk.mid │ │ │ ├── se_card.mid │ │ │ ├── se_click.mid │ │ │ ├── se_contest_condition_lose.mid │ │ │ ├── se_contest_curtain_fall.mid │ │ │ ├── se_contest_curtain_rise.mid │ │ │ ├── se_contest_heart.mid │ │ │ ├── se_contest_icon_change.mid │ │ │ ├── se_contest_icon_clear.mid │ │ │ ├── se_contest_mons_turn.mid │ │ │ ├── se_contest_place.mid │ │ │ ├── se_dex_search.mid │ │ │ ├── se_ding_dong.mid │ │ │ ├── se_door.mid │ │ │ ├── se_downpour.mid │ │ │ ├── se_downpour_stop.mid │ │ │ ├── se_e.mid │ │ │ ├── se_effective.mid │ │ │ ├── se_egg_hatch.mid │ │ │ ├── se_elevator.mid │ │ │ ├── se_escalator.mid │ │ │ ├── se_exit.mid │ │ │ ├── se_exp.mid │ │ │ ├── se_exp_max.mid │ │ │ ├── se_failure.mid │ │ │ ├── se_faint.mid │ │ │ ├── se_fall.mid │ │ │ ├── se_field_poison.mid │ │ │ ├── se_flee.mid │ │ │ ├── se_fu_zaku.mid │ │ │ ├── se_glass_flute.mid │ │ │ ├── se_i.mid │ │ │ ├── se_ice_break.mid │ │ │ ├── se_ice_crack.mid │ │ │ ├── se_ice_stairs.mid │ │ │ ├── se_intro_blast.mid │ │ │ ├── se_itemfinder.mid │ │ │ ├── se_lavaridge_fall_warp.mid │ │ │ ├── se_ledge.mid │ │ │ ├── se_low_health.mid │ │ │ ├── se_m_bind.mid │ │ │ ├── se_m_comet_punch.mid │ │ │ ├── se_m_cut.mid │ │ │ ├── se_m_double_slap.mid │ │ │ ├── se_m_fire_punch.mid │ │ │ ├── se_m_fly.mid │ │ │ ├── se_m_gust.mid │ │ │ ├── se_m_gust2.mid │ │ │ ├── se_m_headbutt.mid │ │ │ ├── se_m_horn_attack.mid │ │ │ ├── se_m_jump_kick.mid │ │ │ ├── se_m_leer.mid │ │ │ ├── se_m_mega_kick.mid │ │ │ ├── se_m_mega_kick2.mid │ │ │ ├── se_m_pay_day.mid │ │ │ ├── se_m_razor_wind.mid │ │ │ ├── se_m_razor_wind2.mid │ │ │ ├── se_m_sand_attack.mid │ │ │ ├── se_m_scratch.mid │ │ │ ├── se_m_swords_dance.mid │ │ │ ├── se_m_tail_whip.mid │ │ │ ├── se_m_take_down.mid │ │ │ ├── se_m_vicegrip.mid │ │ │ ├── se_m_wing_attack.mid │ │ │ ├── se_mud_ball.mid │ │ │ ├── se_mugshot.mid │ │ │ ├── se_n.mid │ │ │ ├── se_not_effective.mid │ │ │ ├── se_note_a.mid │ │ │ ├── se_note_b.mid │ │ │ ├── se_note_c.mid │ │ │ ├── se_note_c_high.mid │ │ │ ├── se_note_d.mid │ │ │ ├── se_note_e.mid │ │ │ ├── se_note_f.mid │ │ │ ├── se_note_g.mid │ │ │ ├── se_o.mid │ │ │ ├── se_orb.mid │ │ │ ├── se_pc_login.mid │ │ │ ├── se_pc_off.mid │ │ │ ├── se_pc_on.mid │ │ │ ├── se_pike_curtain_close.mid │ │ │ ├── se_pike_curtain_open.mid │ │ │ ├── se_pin.mid │ │ │ ├── se_pokenav_call.mid │ │ │ ├── se_pokenav_hang_up.mid │ │ │ ├── se_pokenav_off.mid │ │ │ ├── se_pokenav_on.mid │ │ │ ├── se_puddle.mid │ │ │ ├── se_rain.mid │ │ │ ├── se_rain_stop.mid │ │ │ ├── se_repel.mid │ │ │ ├── se_rg_bag_cursor.mid │ │ │ ├── se_rg_ball_click.mid │ │ │ ├── se_rg_card_flip.mid │ │ │ ├── se_rg_card_flipping.mid │ │ │ ├── se_rg_card_open.mid │ │ │ ├── se_rg_deoxys_move.mid │ │ │ ├── se_rg_door.mid │ │ │ ├── se_rg_help_close.mid │ │ │ ├── se_rg_help_error.mid │ │ │ ├── se_rg_help_open.mid │ │ │ ├── se_rg_poke_jump_failure.mid │ │ │ ├── se_rg_poke_jump_success.mid │ │ │ ├── se_rg_shop.mid │ │ │ ├── se_rg_ss_anne_horn.mid │ │ │ ├── se_rotating_gate.mid │ │ │ ├── se_roulette_ball.mid │ │ │ ├── se_roulette_ball2.mid │ │ │ ├── se_save.mid │ │ │ ├── se_select.mid │ │ │ ├── se_shiny.mid │ │ │ ├── se_ship.mid │ │ │ ├── se_shop.mid │ │ │ ├── se_sliding_door.mid │ │ │ ├── se_success.mid │ │ │ ├── se_sudowoodo_shake.mid │ │ │ ├── se_super_effective.mid │ │ │ ├── se_switch.mid │ │ │ ├── se_taillow_wing_flap.mid │ │ │ ├── se_thunder.mid │ │ │ ├── se_thunder2.mid │ │ │ ├── se_thunderstorm.mid │ │ │ ├── se_thunderstorm_stop.mid │ │ │ ├── se_truck_door.mid │ │ │ ├── se_truck_move.mid │ │ │ ├── se_truck_stop.mid │ │ │ ├── se_truck_unload.mid │ │ │ ├── se_u.mid │ │ │ ├── se_unlock.mid │ │ │ ├── se_use_item.mid │ │ │ ├── se_vend.mid │ │ │ ├── se_warp_in.mid │ │ │ └── se_warp_out.mid │ │ ├── se_dex_page.s │ │ ├── se_dex_scroll.s │ │ ├── se_m_absorb.s │ │ ├── se_m_absorb_2.s │ │ ├── se_m_acid_armor.s │ │ ├── se_m_attract.s │ │ ├── se_m_attract2.s │ │ ├── se_m_barrier.s │ │ ├── se_m_baton_pass.s │ │ ├── se_m_belly_drum.s │ │ ├── se_m_bite.s │ │ ├── se_m_blizzard.s │ │ ├── se_m_blizzard2.s │ │ ├── se_m_bonemerang.s │ │ ├── se_m_brick_break.s │ │ ├── se_m_bubble.s │ │ ├── se_m_bubble2.s │ │ ├── se_m_bubble3.s │ │ ├── se_m_bubble_beam.s │ │ ├── se_m_bubble_beam2.s │ │ ├── se_m_charge.s │ │ ├── se_m_charm.s │ │ ├── se_m_confuse_ray.s │ │ ├── se_m_cosmic_power.s │ │ ├── se_m_crabhammer.s │ │ ├── se_m_detect.s │ │ ├── se_m_dig.s │ │ ├── se_m_dive.s │ │ ├── se_m_dizzy_punch.s │ │ ├── se_m_double_team.s │ │ ├── se_m_dragon_rage.s │ │ ├── se_m_earthquake.s │ │ ├── se_m_ember.s │ │ ├── se_m_encore.s │ │ ├── se_m_encore2.s │ │ ├── se_m_explosion.s │ │ ├── se_m_faint_attack.s │ │ ├── se_m_flame_wheel.s │ │ ├── se_m_flame_wheel2.s │ │ ├── se_m_flamethrower.s │ │ ├── se_m_flatter.s │ │ ├── se_m_giga_drain.s │ │ ├── se_m_grasswhistle.s │ │ ├── se_m_hail.s │ │ ├── se_m_harden.s │ │ ├── se_m_haze.s │ │ ├── se_m_heal_bell.s │ │ ├── se_m_heat_wave.s │ │ ├── se_m_hydro_pump.s │ │ ├── se_m_hyper_beam.s │ │ ├── se_m_hyper_beam2.s │ │ ├── se_m_icy_wind.s │ │ ├── se_m_lick.s │ │ ├── se_m_lock_on.s │ │ ├── se_m_metronome.s │ │ ├── se_m_milk_drink.s │ │ ├── se_m_minimize.s │ │ ├── se_m_mist.s │ │ ├── se_m_moonlight.s │ │ ├── se_m_morning_sun.s │ │ ├── se_m_nightmare.s │ │ ├── se_m_perish_song.s │ │ ├── se_m_petal_dance.s │ │ ├── se_m_poison_powder.s │ │ ├── se_m_psybeam.s │ │ ├── se_m_psybeam2.s │ │ ├── se_m_rain_dance.s │ │ ├── se_m_reflect.s │ │ ├── se_m_reversal.s │ │ ├── se_m_rock_throw.s │ │ ├── se_m_sacred_fire.s │ │ ├── se_m_sacred_fire2.s │ │ ├── se_m_sand_tomb.s │ │ ├── se_m_sandstorm.s │ │ ├── se_m_screech.s │ │ ├── se_m_self_destruct.s │ │ ├── se_m_sing.s │ │ ├── se_m_sketch.s │ │ ├── se_m_sky_uppercut.s │ │ ├── se_m_snore.s │ │ ├── se_m_solar_beam.s │ │ ├── se_m_spit_up.s │ │ ├── se_m_stat_decrease.s │ │ ├── se_m_stat_increase.s │ │ ├── se_m_strength.s │ │ ├── se_m_string_shot.s │ │ ├── se_m_string_shot2.s │ │ ├── se_m_supersonic.s │ │ ├── se_m_surf.s │ │ ├── se_m_swagger.s │ │ ├── se_m_swagger2.s │ │ ├── se_m_sweet_scent.s │ │ ├── se_m_swift.s │ │ ├── se_m_teeter_dance.s │ │ ├── se_m_teleport.s │ │ ├── se_m_thunder_wave.s │ │ ├── se_m_thunderbolt.s │ │ ├── se_m_thunderbolt2.s │ │ ├── se_m_toxic.s │ │ ├── se_m_tri_attack.s │ │ ├── se_m_tri_attack2.s │ │ ├── se_m_twister.s │ │ ├── se_m_uproar.s │ │ ├── se_m_vital_throw.s │ │ ├── se_m_vital_throw2.s │ │ ├── se_m_waterfall.s │ │ ├── se_m_whirlpool.s │ │ ├── se_m_yawn.s │ │ ├── se_rg_bag_pocket.s │ │ ├── se_wall_hit.s │ │ └── se_win_open.s │ ├── voice_groups.inc │ └── voicegroups/ │ ├── voicegroup000.inc │ ├── voicegroup001.inc │ ├── voicegroup002.inc │ ├── voicegroup003.inc │ ├── voicegroup004.inc │ ├── voicegroup005.inc │ ├── voicegroup006.inc │ ├── voicegroup007.inc │ ├── voicegroup008.inc │ ├── voicegroup009.inc │ ├── voicegroup010.inc │ ├── voicegroup011.inc │ ├── voicegroup012.inc │ ├── voicegroup013.inc │ ├── voicegroup014.inc │ ├── voicegroup015.inc │ ├── voicegroup016.inc │ ├── voicegroup017.inc │ ├── voicegroup018.inc │ ├── voicegroup019.inc │ ├── voicegroup020.inc │ ├── voicegroup021.inc │ ├── voicegroup022.inc │ ├── voicegroup023.inc │ ├── voicegroup024.inc │ ├── voicegroup025.inc │ ├── voicegroup026.inc │ ├── voicegroup027.inc │ ├── voicegroup028.inc │ ├── voicegroup029.inc │ ├── voicegroup030.inc │ ├── voicegroup031.inc │ ├── voicegroup032.inc │ ├── voicegroup033.inc │ ├── voicegroup034.inc │ ├── voicegroup035.inc │ ├── voicegroup036.inc │ ├── voicegroup037.inc │ ├── voicegroup038.inc │ ├── voicegroup039.inc │ ├── voicegroup040.inc │ ├── voicegroup041.inc │ ├── voicegroup042.inc │ ├── voicegroup043.inc │ ├── voicegroup044.inc │ ├── voicegroup045.inc │ ├── voicegroup046.inc │ ├── voicegroup047.inc │ ├── voicegroup048.inc │ ├── voicegroup049.inc │ ├── voicegroup050.inc │ ├── voicegroup051.inc │ ├── voicegroup052.inc │ ├── voicegroup053.inc │ ├── voicegroup054.inc │ ├── voicegroup055.inc │ ├── voicegroup056.inc │ ├── voicegroup057.inc │ ├── voicegroup058.inc │ ├── voicegroup059.inc │ ├── voicegroup060.inc │ ├── voicegroup061.inc │ ├── voicegroup062.inc │ ├── voicegroup063.inc │ ├── voicegroup064.inc │ ├── voicegroup065.inc │ ├── voicegroup066.inc │ ├── voicegroup067.inc │ ├── voicegroup068.inc │ ├── voicegroup069.inc │ ├── voicegroup070.inc │ ├── voicegroup071.inc │ ├── voicegroup072.inc │ ├── voicegroup073.inc │ ├── voicegroup074.inc │ ├── voicegroup075.inc │ ├── voicegroup076.inc │ ├── voicegroup077.inc │ ├── voicegroup078.inc │ ├── voicegroup079.inc │ ├── voicegroup080.inc │ ├── voicegroup081.inc │ ├── voicegroup082.inc │ ├── voicegroup083.inc │ ├── voicegroup084.inc │ ├── voicegroup085.inc │ ├── voicegroup086.inc │ ├── voicegroup087.inc │ ├── voicegroup088.inc │ ├── voicegroup089.inc │ ├── voicegroup090.inc │ ├── voicegroup091.inc │ ├── voicegroup092.inc │ ├── voicegroup093.inc │ ├── voicegroup094.inc │ ├── voicegroup095.inc │ ├── voicegroup096.inc │ ├── voicegroup097.inc │ ├── voicegroup098.inc │ ├── voicegroup099.inc │ ├── voicegroup100.inc │ ├── voicegroup101.inc │ ├── voicegroup102.inc │ ├── voicegroup103.inc │ ├── voicegroup104.inc │ ├── voicegroup105.inc │ ├── voicegroup106.inc │ ├── voicegroup107.inc │ ├── voicegroup108.inc │ ├── voicegroup109.inc │ ├── voicegroup110.inc │ ├── voicegroup111.inc │ ├── voicegroup112.inc │ ├── voicegroup113.inc │ ├── voicegroup114.inc │ ├── voicegroup115.inc │ ├── voicegroup116.inc │ ├── voicegroup117.inc │ ├── voicegroup118.inc │ ├── voicegroup119.inc │ ├── voicegroup120.inc │ ├── voicegroup121.inc │ ├── voicegroup122.inc │ ├── voicegroup123.inc │ ├── voicegroup124.inc │ ├── voicegroup125.inc │ ├── voicegroup126.inc │ ├── voicegroup127.inc │ ├── voicegroup128.inc │ ├── voicegroup129.inc │ ├── voicegroup130.inc │ ├── voicegroup131.inc │ ├── voicegroup132.inc │ ├── voicegroup133.inc │ ├── voicegroup134.inc │ ├── voicegroup135.inc │ ├── voicegroup136.inc │ ├── voicegroup137.inc │ ├── voicegroup138.inc │ ├── voicegroup139.inc │ ├── voicegroup140.inc │ ├── voicegroup141.inc │ ├── voicegroup142.inc │ ├── voicegroup143.inc │ ├── voicegroup144.inc │ ├── voicegroup145.inc │ ├── voicegroup146.inc │ ├── voicegroup147.inc │ ├── voicegroup148.inc │ ├── voicegroup149.inc │ ├── voicegroup150.inc │ ├── voicegroup151.inc │ ├── voicegroup152.inc │ ├── voicegroup153.inc │ ├── voicegroup154.inc │ ├── voicegroup155.inc │ ├── voicegroup156.inc │ ├── voicegroup157.inc │ ├── voicegroup158.inc │ ├── voicegroup159.inc │ ├── voicegroup160.inc │ ├── voicegroup161.inc │ ├── voicegroup162.inc │ ├── voicegroup163.inc │ ├── voicegroup164.inc │ ├── voicegroup165.inc │ ├── voicegroup166.inc │ ├── voicegroup167.inc │ ├── voicegroup168.inc │ ├── voicegroup169.inc │ ├── voicegroup170.inc │ ├── voicegroup171.inc │ ├── voicegroup172.inc │ ├── voicegroup173.inc │ ├── voicegroup174.inc │ ├── voicegroup175.inc │ ├── voicegroup176.inc │ ├── voicegroup177.inc │ ├── voicegroup178.inc │ ├── voicegroup179.inc │ ├── voicegroup180.inc │ ├── voicegroup181.inc │ ├── voicegroup182.inc │ ├── voicegroup183.inc │ ├── voicegroup184.inc │ ├── voicegroup185.inc │ ├── voicegroup186.inc │ ├── voicegroup187.inc │ ├── voicegroup188.inc │ ├── voicegroup189.inc │ ├── voicegroup190.inc │ └── voicegroup191.inc ├── spritesheet_rules.mk ├── src/ │ ├── AgbRfu_LinkManager.c │ ├── agb_flash.c │ ├── agb_flash_1m.c │ ├── agb_flash_le.c │ ├── agb_flash_mx.c │ ├── bag.c │ ├── battle_ai_script_commands.c │ ├── battle_ai_switch_items.c │ ├── battle_anim.c │ ├── battle_anim_bug.c │ ├── battle_anim_dark.c │ ├── battle_anim_dragon.c │ ├── battle_anim_effects_1.c │ ├── battle_anim_effects_2.c │ ├── battle_anim_effects_3.c │ ├── battle_anim_electric.c │ ├── battle_anim_fight.c │ ├── battle_anim_fire.c │ ├── battle_anim_flying.c │ ├── battle_anim_ghost.c │ ├── battle_anim_ground.c │ ├── battle_anim_ice.c │ ├── battle_anim_mon_movement.c │ ├── battle_anim_mons.c │ ├── battle_anim_normal.c │ ├── battle_anim_poison.c │ ├── battle_anim_psychic.c │ ├── battle_anim_rock.c │ ├── battle_anim_smokescreen.c │ ├── battle_anim_sound_tasks.c │ ├── battle_anim_special.c │ ├── battle_anim_status_effects.c │ ├── battle_anim_utility_funcs.c │ ├── battle_anim_water.c │ ├── battle_bg.c │ ├── battle_controller_link_opponent.c │ ├── battle_controller_link_partner.c │ ├── battle_controller_oak_old_man.c │ ├── battle_controller_opponent.c │ ├── battle_controller_player.c │ ├── battle_controller_pokedude.c │ ├── battle_controller_safari.c │ ├── battle_controllers.c │ ├── battle_gfx_sfx_util.c │ ├── battle_interface.c │ ├── battle_intro.c │ ├── battle_main.c │ ├── battle_message.c │ ├── battle_records.c │ ├── battle_script_commands.c │ ├── battle_setup.c │ ├── battle_tower.c │ ├── battle_transition.c │ ├── battle_util.c │ ├── battle_util2.c │ ├── berry.c │ ├── berry_crush.c │ ├── berry_fix_program.c │ ├── berry_pouch.c │ ├── berry_powder.c │ ├── bg.c │ ├── bg_regs.c │ ├── bike.c │ ├── blend_palette.c │ ├── blit.c │ ├── braille_text.c │ ├── buy_menu_helpers.c │ ├── cable_car.c │ ├── cable_car_util.c │ ├── cable_club.c │ ├── cereader_tool.c │ ├── clear_save_data_screen.c │ ├── coins.c │ ├── coord_event_weather.c │ ├── credits.c │ ├── crt0.s │ ├── data/ │ │ ├── battle_anim.h │ │ ├── battle_moves.h │ │ ├── battle_tower/ │ │ │ ├── level_100_mons.h │ │ │ ├── level_50_mons.h │ │ │ └── trainers.h │ │ ├── decoration/ │ │ │ ├── description.h │ │ │ ├── header.h │ │ │ └── tiles.h │ │ ├── easy_chat/ │ │ │ ├── easy_chat_group_actions.h │ │ │ ├── easy_chat_group_adjectives.h │ │ │ ├── easy_chat_group_battle.h │ │ │ ├── easy_chat_group_conditions.h │ │ │ ├── easy_chat_group_endings.h │ │ │ ├── easy_chat_group_events.h │ │ │ ├── easy_chat_group_feelings.h │ │ │ ├── easy_chat_group_greetings.h │ │ │ ├── easy_chat_group_hobbies.h │ │ │ ├── easy_chat_group_lifestyle.h │ │ │ ├── easy_chat_group_misc.h │ │ │ ├── easy_chat_group_move_1.h │ │ │ ├── easy_chat_group_move_2.h │ │ │ ├── easy_chat_group_people.h │ │ │ ├── easy_chat_group_pokemon.h │ │ │ ├── easy_chat_group_pokemon2.h │ │ │ ├── easy_chat_group_speech.h │ │ │ ├── easy_chat_group_status.h │ │ │ ├── easy_chat_group_time.h │ │ │ ├── easy_chat_group_trainer.h │ │ │ ├── easy_chat_group_trendy_saying.h │ │ │ ├── easy_chat_group_voices.h │ │ │ ├── easy_chat_groups.h │ │ │ └── easy_chat_words_by_letter.h │ │ ├── field_effects/ │ │ │ ├── field_effect_object_template_pointers.h │ │ │ └── field_effect_objects.h │ │ ├── graphics/ │ │ │ ├── battle_terrain_unused.h │ │ │ ├── interface_pokeballs.h │ │ │ ├── items.h │ │ │ ├── mail.h │ │ │ ├── pokemon.h │ │ │ └── trainers.h │ │ ├── heal_locations.h │ │ ├── ingame_trades.h │ │ ├── item_icon_table.h │ │ ├── items.json │ │ ├── items.json.txt │ │ ├── master_trainer_parties.h │ │ ├── master_trainers.h │ │ ├── object_events/ │ │ │ ├── base_oam.h │ │ │ ├── movement_action_func_tables.h │ │ │ ├── movement_type_func_tables.h │ │ │ ├── object_event_anims.h │ │ │ ├── object_event_graphics.h │ │ │ ├── object_event_graphics_info.h │ │ │ ├── object_event_graphics_info_pointers.h │ │ │ ├── object_event_pic_tables.h │ │ │ └── object_event_subsprites.h │ │ ├── party_menu.h │ │ ├── pokemon/ │ │ │ ├── cry_ids.h │ │ │ ├── egg_moves.h │ │ │ ├── evolution.h │ │ │ ├── experience_tables.h │ │ │ ├── item_effects.h │ │ │ ├── level_up_learnset_pointers.h │ │ │ ├── level_up_learnsets.h │ │ │ ├── pokedex_categories.h │ │ │ ├── pokedex_entries.h │ │ │ ├── pokedex_orders.h │ │ │ ├── pokedex_text_fr.h │ │ │ ├── pokedex_text_lg.h │ │ │ ├── species_info.h │ │ │ ├── tmhm_learnsets.h │ │ │ ├── trainer_class_lookups.h │ │ │ └── tutor_learnsets.h │ │ ├── pokemon_graphics/ │ │ │ ├── back_pic_coordinates.h │ │ │ ├── back_pic_table.h │ │ │ ├── enemy_mon_elevation.h │ │ │ ├── footprint_table.h │ │ │ ├── front_pic_coordinates.h │ │ │ ├── front_pic_table.h │ │ │ ├── palette_table.h │ │ │ └── shiny_palette_table.h │ │ ├── region_map/ │ │ │ ├── region_map_layout_kanto.h │ │ │ ├── region_map_layout_sevii_123.h │ │ │ ├── region_map_layout_sevii_45.h │ │ │ ├── region_map_layout_sevii_67.h │ │ │ ├── region_map_sections.entries.json.txt │ │ │ ├── region_map_sections.json │ │ │ └── region_map_sections.strings.json.txt │ │ ├── text/ │ │ │ ├── abilities.h │ │ │ ├── move_names.h │ │ │ ├── nature_names.h │ │ │ ├── quest_log.h │ │ │ ├── species_names.h │ │ │ ├── teachy_tv.h │ │ │ └── trainer_class_names.h │ │ ├── tilesets/ │ │ │ ├── graphics.h │ │ │ ├── headers.h │ │ │ └── metatiles.h │ │ ├── trainer_graphics/ │ │ │ ├── back_pic_anims.h │ │ │ ├── back_pic_tables.h │ │ │ ├── front_pic_anims.h │ │ │ └── front_pic_tables.h │ │ ├── trainer_parties.h │ │ ├── trainers.h │ │ ├── union_room.h │ │ └── wild_encounters.h │ ├── data.c │ ├── daycare.c │ ├── decompress.c │ ├── decoration.c │ ├── digit_obj_util.c │ ├── diploma.c │ ├── dma3_manager.c │ ├── dodrio_berry_picking.c │ ├── dodrio_berry_picking_comm.c │ ├── dynamic_placeholder_text_util.c │ ├── easy_chat.c │ ├── easy_chat_2.c │ ├── easy_chat_3.c │ ├── ereader_helpers.c │ ├── ereader_screen.c │ ├── event_data.c │ ├── event_object_lock.c │ ├── event_object_movement.c │ ├── evolution_graphics.c │ ├── evolution_scene.c │ ├── fame_checker.c │ ├── faraway_island.c │ ├── field_camera.c │ ├── field_control_avatar.c │ ├── field_door.c │ ├── field_effect.c │ ├── field_effect_helpers.c │ ├── field_fadetransition.c │ ├── field_message_box.c │ ├── field_player_avatar.c │ ├── field_poison.c │ ├── field_screen_effect.c │ ├── field_special_scene.c │ ├── field_specials.c │ ├── field_tasks.c │ ├── field_weather.c │ ├── field_weather_effects.c │ ├── field_weather_util.c │ ├── fieldmap.c │ ├── fldeff_berrytree.c │ ├── fldeff_cut.c │ ├── fldeff_dig.c │ ├── fldeff_flash.c │ ├── fldeff_poison.c │ ├── fldeff_rocksmash.c │ ├── fldeff_softboiled.c │ ├── fldeff_strength.c │ ├── fldeff_sweetscent.c │ ├── fldeff_teleport.c │ ├── gpu_regs.c │ ├── graphics.c │ ├── hall_of_fame.c │ ├── heal_location.c │ ├── help_message.c │ ├── help_system.c │ ├── help_system_util.c │ ├── hof_pc.c │ ├── image_processing_effects.c │ ├── intro.c │ ├── isagbprn.c │ ├── item.c │ ├── item_menu.c │ ├── item_menu_icons.c │ ├── item_pc.c │ ├── item_use.c │ ├── itemfinder.c │ ├── key_system_menu.c │ ├── keyboard_text.c │ ├── learn_move.c │ ├── libagbsyscall.s │ ├── libgcnmultiboot.s │ ├── librfu_intr.c │ ├── librfu_rfu.c │ ├── librfu_sio32id.c │ ├── librfu_stwi.c │ ├── link.c │ ├── link_rfu_2.c │ ├── link_rfu_3.c │ ├── list_menu.c │ ├── load_save.c │ ├── m4a.c │ ├── m4a_1.s │ ├── m4a_tables.c │ ├── mail.c │ ├── mail_data.c │ ├── mailbox_pc.c │ ├── main.c │ ├── main_menu.c │ ├── malloc.c │ ├── map_name_popup.c │ ├── map_preview_screen.c │ ├── math_util.c │ ├── menu.c │ ├── menu2.c │ ├── menu_helpers.c │ ├── menu_indicators.c │ ├── metatile_behavior.c │ ├── mini_printf.c │ ├── minigame_countdown.c │ ├── mon_markings.c │ ├── money.c │ ├── move_descriptions.c │ ├── multiboot.c │ ├── mystery_event_msg.c │ ├── mystery_event_script.c │ ├── mystery_gift.c │ ├── mystery_gift_client.c │ ├── mystery_gift_link.c │ ├── mystery_gift_menu.c │ ├── mystery_gift_scripts.c │ ├── mystery_gift_server.c │ ├── mystery_gift_show_card.c │ ├── mystery_gift_show_news.c │ ├── naming_screen.c │ ├── new_game.c │ ├── new_menu_helpers.c │ ├── oak_speech.c │ ├── option_menu.c │ ├── orre_met_location_handler.c │ ├── orre_met_location_strings.c │ ├── overworld.c │ ├── palette.c │ ├── palette_util.c │ ├── party_menu.c │ ├── party_menu_specials.c │ ├── pc_screen_effect.c │ ├── play_time.c │ ├── player_pc.c │ ├── pokeball.c │ ├── pokedex.c │ ├── pokedex_area_markers.c │ ├── pokedex_screen.c │ ├── pokemon.c │ ├── pokemon_icon.c │ ├── pokemon_jump.c │ ├── pokemon_size_record.c │ ├── pokemon_special_anim.c │ ├── pokemon_special_anim_scene.c │ ├── pokemon_storage_system.c │ ├── pokemon_storage_system_data.c │ ├── pokemon_storage_system_graphics.c │ ├── pokemon_storage_system_menu.c │ ├── pokemon_storage_system_misc.c │ ├── pokemon_storage_system_tasks.c │ ├── pokemon_summary_screen.c │ ├── post_battle_event_funcs.c │ ├── prof_pc.c │ ├── quest_log.c │ ├── quest_log_battle.c │ ├── quest_log_events.c │ ├── quest_log_objects.c │ ├── quest_log_player.c │ ├── random.c │ ├── region_map.c │ ├── renewable_hidden_items.c │ ├── reset_save_heap.c │ ├── reshow_battle_screen.c │ ├── roamer.c │ ├── rom_header.s │ ├── rom_header_gf.c │ ├── safari_zone.c │ ├── save.c │ ├── save_failed_screen.c │ ├── save_location.c │ ├── save_menu_util.c │ ├── scanline_effect.c │ ├── scrcmd.c │ ├── script.c │ ├── script_menu.c │ ├── script_movement.c │ ├── script_pokemon_util.c │ ├── seagallop.c │ ├── shop.c │ ├── slot_machine.c │ ├── sound.c │ ├── special_field_anim.c │ ├── sprite.c │ ├── ss_anne.c │ ├── start_menu.c │ ├── string_util.c │ ├── strings.c │ ├── task.c │ ├── teachy_tv.c │ ├── text.c │ ├── text_printer.c │ ├── text_window.c │ ├── text_window_graphics.c │ ├── tilemap_util.c │ ├── tileset_anims.c │ ├── tilesets.c │ ├── title_screen.c │ ├── tm_case.c │ ├── trade.c │ ├── trade_scene.c │ ├── trainer_card.c │ ├── trainer_fan_club.c │ ├── trainer_pokemon_sprites.c │ ├── trainer_see.c │ ├── trainer_tower.c │ ├── trainer_tower_sets.c │ ├── trig.c │ ├── union_room.c │ ├── union_room_battle.c │ ├── union_room_chat.c │ ├── union_room_chat_display.c │ ├── union_room_chat_objects.c │ ├── union_room_message.c │ ├── union_room_player_avatar.c │ ├── util.c │ ├── vs_seeker.c │ ├── wild_encounter.c │ ├── wild_pokemon_area.c │ ├── window.c │ ├── window_8bpp.c │ ├── wireless_communication_status_screen.c │ └── wonder_news.c ├── sym_bss.txt ├── sym_common.txt ├── sym_ewram.txt └── tileset_rules.mk ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ *.pal text eol=crlf *.s text eol=lf *.txt text eol=lf Makefile text eol=lf *.mk text eol=lf *.c text eol=lf *.h text eol=lf *.pl text eol=lf *.inc text eol=lf *.sha1 text eol=lf *.sed text eol=lf *.sh text eol=lf *.json text eol=lf .gitignore text eol=lf .gitattributes text eol=lf *.yml text eol=lf *.py text eol=lf *.png binary *.bin binary *.pcm binary *.h linguist-language=C *.inc linguist-language=Assembly ================================================ FILE: .github/calcrom/calcrom.pl ================================================ #!/usr/bin/perl # Usage: # calcrom.pl [--verbose][--data] # # mapfile: path to .map file output by LD # verbose: set to get more detailed output # data: set to output % breakdown of data use IPC::Cmd qw[ run ]; use Getopt::Long; my $usage = "Usage: calcrom.pl file.map [--verbose][--data]\n"; my $verbose = ""; my $showData; GetOptions("verbose" => \$verbose, "data" => \$showData) or die $usage; (@ARGV == 1) or die $usage; open(my $file, $ARGV[0]) or die "ERROR: could not open file '$ARGV[0]'.\n"; my $src = 0; my $asm = 0; my $srcdata = 0; my $data = 0; my @pairs = (); while (my $line = <$file>) { if ($line =~ /^ \.(\w+)\s+0x[0-9a-f]+\s+(0x[0-9a-f]+) (\w+)\/(.+)\.o/) { my $section = $1; my $size = hex($2); my $dir = $3; my $basename = $4; if ($size & 3) { $size += 4 - ($size % 3); } if ($section =~ /text/) { if ($dir eq 'src') { $src += $size; } elsif ($dir eq 'asm') { if (!($basename =~ /(crt0|libagbsyscall|libgcnmultiboot|m4a_1)/)) { push @pairs, [$basename, $size]; } $asm += $size; } } elsif ($section =~ /rodata/) { if ($dir eq 'src') { $srcdata += $size; } elsif ($dir eq 'data') { $data += $size; } } } } my @sorted = sort { $a->[1] <=> $b->[1] } @pairs; (my $elffname = $ARGV[0]) =~ s/\.map/.elf/; # Note that the grep filters out all branch labels. It also requires a minimum # line length of 5, to filter out a ton of generated symbols (like AcCn). No # settings to nm seem to remove these symbols. Finally, nm prints out a separate # entry for whenever a name appears in a file, not just where it's defined. uniq # removes all the duplicate entries. # # # You'd expect this to take a while, because of uniq. It runs in under a second, # though. Uniq is pretty fast! my $base_cmd = "nm $elffname | awk '{print \$3}' | grep '^[^_].\\{4\\}' | uniq"; # This looks for Unknown_, Unknown_, or sub_, followed by an address. Note that # it matches even if stuff precedes the unknown, like sUnknown/gUnknown. my $undoc_regex = "'[Uu]nknown_[0-9a-fA-F]\\{5,7\\}\\|sub_[0-9a-fA-F]\\{5,7\\}'"; # This looks for every symbol with an address at the end of it. Some things are # given a name based on their type / location, but still have an unknown purpose. # For example, FooMap_EventScript_FFFFFFF. # The above may be double counted here, and will need to be filtered out. my $partial_doc_regex = "'_[0-28][0-9a-fA-F]\\{5,7\\}'"; my $count_cmd = "wc -l"; # It sucks that we have to run this three times, but I can't figure out how to get # stdin working for subcommands in perl while still having a timeout. It's decently # fast anyway. my $total_syms_as_string; (run ( command => "$base_cmd | $count_cmd", buffer => \$total_syms_as_string, timeout => 60 )) or die "ERROR: Error while getting all symbols: $?"; my $undocumented_as_string; (run ( command => "$base_cmd | grep $undoc_regex | $count_cmd", buffer => \$undocumented_as_string, timeout => 60 )) or die "ERROR: Error while filtering for undocumented symbols: $?"; my $partial_documented_as_string; (run ( command => "$base_cmd | grep $partial_doc_regex | grep -v $undoc_regex | $count_cmd", buffer => \$partial_documented_as_string, timeout => 60 )) or die "ERROR: Error while filtering for partial symbols: $?"; # Performing addition on a string converts it to a number. Any string that fails # to convert to a number becomes 0. So if our converted number is 0, but our string # is nonzero, then the conversion was an error. $undocumented_as_string =~ s/^\s+|\s+$//g; my $undocumented = $undocumented_as_string + 0; (($undocumented != 0) or (($undocumented == 0) and ($undocumented_as_string eq "0"))) or die "ERROR: Cannot convert string to num: '$undocumented_as_string'"; $partial_documented_as_string =~ s/^\s+|\s+$//g; my $partial_documented = $partial_documented_as_string + 0; (($partial_documented != 0) or (($partial_documented == 0) and ($partial_documented_as_string eq "0"))) or die "ERROR: Cannot convert string to num: '$partial_documented_as_string'"; $total_syms_as_string =~ s/^\s+|\s+$//g; my $total_syms = $total_syms_as_string + 0; (($total_syms != 0) or (($total_syms == 0) and ($total_syms_as_string eq "0"))) or die "ERROR: Cannot convert string to num: '$total_syms_as_string'"; ($total_syms != 0) or die "ERROR: No symbols found."; my $total = $src + $asm; my $srcPct = sprintf("%.4f", 100 * $src / $total); my $asmPct = sprintf("%.4f", 100 * $asm / $total); my $documented = $total_syms - ($undocumented + $partial_documented); my $docPct = sprintf("%.4f", 100 * $documented / $total_syms); my $partialPct = sprintf("%.4f", 100 * $partial_documented / $total_syms); my $undocPct = sprintf("%.4f", 100 * $undocumented / $total_syms); if ($asm == 0) { print "Code decompilation is 100% complete\n" } else { print "$total total bytes of code\n"; print "$src bytes of code in src ($srcPct%)\n"; print "$asm bytes of code in asm ($asmPct%)\n"; } print "\n"; if ($verbose != 0) { print "BREAKDOWN\n"; foreach my $item (@sorted) { print " $item->[1] bytes in asm/$item->[0].s\n" } print "\n"; } if ($partial_documented == 0 && $undocumented == 0) { print "Documentation is 100% complete\n" } else { print "$total_syms total symbols\n"; print "$documented symbols documented ($docPct%)\n"; print "$partial_documented symbols partially documented ($partialPct%)\n"; print "$undocumented symbols undocumented ($undocPct%)\n"; } if ($showData) { print "\n"; my $dataTotal = $srcdata + $data; my $srcDataPct = sprintf("%.4f", 100 * $srcdata / $dataTotal); my $dataPct = sprintf("%.4f", 100 * $data / $dataTotal); print "$dataTotal total bytes of data\n"; print "$srcdata bytes of data in src ($srcDataPct%)\n"; print "$data bytes of data in data ($dataPct%)\n"; } ================================================ FILE: .github/calcrom/webhook.sh ================================================ #!/bin/bash -ex build_name=$1 map_file=$build_name.map if [ ! -f $map_file ]; then echo "$map_file does not exist!" exit 1 fi output=$(perl $(dirname "$0")/calcrom.pl $build_name.map | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g') curl -d "{\"username\": \"$CALCROM_DISCORD_WEBHOOK_USERNAME\", \"avatar_url\": \"$CALCROM_DISCORD_WEBHOOK_AVATAR_URL\", \"content\":\"\`\`\`\\n$build_name progress:\\n$output\\n\`\`\`\"}" -H "Content-Type: application/json" -X POST "$CALCROM_DISCORD_WEBHOOK_URL" ================================================ FILE: .github/workflows/build.yml ================================================ name: CI on: push: branches: [ master ] pull_request: jobs: build: runs-on: ubuntu-latest env: GAME_VERSION: FIRERED GAME_LANGUAGE: ENGLISH GAME_REVISION: 0 MODERN: 0 COMPARE: 1 steps: - name: Checkout uses: actions/checkout@master - name: Checkout agbcc uses: actions/checkout@master with: path: 'agbcc' repository: 'pret/agbcc' - name: Checkout symbols if: ${{ github.event_name == 'push' }} uses: actions/checkout@master with: path: 'symbols' ref: 'symbols' - name: Install binutils run: sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi # build-essential, git, and libpng-dev are already installed # gcc-arm-none-eabi is only needed for the modern build # as an alternative to dkP - name: Install agbcc run: | ./build.sh ./install.sh ../ working-directory: ./agbcc - name: Compare FireRed run: | make -j${nproc} all syms - name: Compare FireRed rev1 env: GAME_REVISION: 1 run: | make -j${nproc} all syms - name: Compare LeafGreen env: GAME_VERSION: LEAFGREEN run: | make -j${nproc} all syms - name: Compare LeafGreen rev1 env: GAME_VERSION: LEAFGREEN GAME_REVISION: 1 run: | make -j${nproc} all syms - name: Build Modern env: MODERN: 1 COMPARE: 0 run: | make -j${nproc} all - name: Move symfiles if: ${{ github.event_name == 'push' }} run: | cp *.sym symbols/ echo "SYMBOLS_COMMIT_MSG=$( git log --format=%s ${GITHUB_SHA} )" >> $GITHUB_ENV - name: Update symfiles if: ${{ github.event_name == 'push' }} uses: EndBug/add-and-commit@v7 with: branch: symbols cwd: "./symbols" add: "*.sym" message: ${{ env.SYMBOLS_COMMIT_MSG }} ================================================ FILE: .gitignore ================================================ *.1bpp *.4bpp *.8bpp *.DS_Store *.bak *.bat *.diff *.dump *.elf *.exe *.fwjpnfont *.gba !data/*.gba *.sgm *.sa1 *.sg1 *.gbapal *.hwjpnfont *.i *.idb *.id0 *.id1 *.id2 *.latfont *.lz *.map *.nam *.o *.pcm *.pl *.rl *.s.old *.s.old2 *.sa* *.swo *.swp *.til .fuse* .idea/ Thumbs.db build/ cmake-build-* ld_script_ruby.txt ld_script_sapphire.txt sound/**/*.bin sound/songs/midi/*.s src/data/items.h src/data/region_map/region_map_entries.h src/data/region_map/region_map_entry_strings.h src/data/region_map/porymap_config.json tags tools/agbcc tools/binutils types_*.taghl !.github/calcrom/calcrom.pl !sound/programmable_wave_samples/*.pcm _Deparsed_XSubs.pm porymap.*.cfg prefabs.json .vscode/*.* *.ss1 *.ss2 my_script.js *.js *.sym ================================================ FILE: FAQ.md ================================================ # **Frequently Asked Questions** ### How can I support development? [I have a Ko-fi link](https://ko-fi.com/deokishisu), tips are appreciated! # Table of Contents: * Mechanics: * [Will later-generation battle mechanics be implemented? What about the physical/special split?](#will-later-generation-battle-mechanics-be-implemented-what-about-the-physicalspecial-split) * [Will new moves be implemented? New held items?](#will-new-moves-be-implemented-new-held-items) * [Will the Generation VI+ Experience Share be implemented?](#will-the-generation-vi-experience-share-be-implemented) * [Will you improve breeding mechanics?](#will-you-improve-breeding-mechanics) * [What are the shiny chances? Will they be improved?](#what-are-the-shiny-chances-will-they-be-improved) * [Will you add something to change my Pokémon's IVs/Hidden Power/Nature/etc.?](#will-you-add-something-to-change-my-pokémons-ivshidden-powernatureetc) * Pokémon Availability: * [Will you add later-generation Pokémon?](#will-you-add-later-generation-pokémon) * [How many Pokémon are available? Will *all* Pokémon be catchable?](#how-many-pokémon-are-available-will-all-pokémon-be-catchable) * [Can you change wild Pokémon availability/levels? Can you put *x* Pokémon in *y* map? Will you add more Pokémon in the future?](#can-you-change-wild-pokémon-availabilitylevels-can-you-put-x-pokémon-in-y-map-will-you-add-more-pokémon-in-the-future) * [Is there a list of wild encounter tables?](#is-there-a-list-of-wild-encounter-tables) * [Can I obtain the other Kanto starters? Can I obtain the unchosen fossil?](#can-i-obtain-the-other-kanto-starters-can-i-obtain-the-unchosen-fossil) * [Can I evolve my Kanto Pokémon into their Johto evolutions without the National Dex?](#can-i-evolve-my-kanto-pokémon-into-their-johto-evolutions-without-the-national-dex) * [How do I evolve Eevee into Espeon and Umbreon?](#how-do-i-evolve-eevee-into-espeon-and-umbreon) * [Can I evolve trade evolutions without trading?](#can-i-evolve-trade-evolutions-without-trading) * [Are trade evolution items available before the postgame?](#are-trade-evolution-items-available-before-the-postgame) * [How do I get the other legendary beasts?](#how-do-i-get-the-other-legendary-beasts) * [Where do I get the event tickets so I can obtain Mew, Lugia and Ho-oh, Deoxys, and Latias and Latias?](#where-do-i-get-the-event-tickets-so-i-can-obtain-mew-lugia-and-ho-oh-deoxys-and-latias-and-latias) * [How do I get Sudowoodo to battle me?](#how-do-i-get-sudowoodo-to-battle-me) * [How do I get the other Fighting Dojo Pokémon? How do I get the missing Hitmonchan/Hitmonlee?](#how-do-i-get-the-other-fighting-dojo-pokémon-how-do-i-get-the-missing-hitmonchanhitmonlee) * Gameplay: * [I just started the game, where is the Key System Menu? I can't change my difficulty after a new game!](#i-just-started-the-game-where-is-the-key-system-menu-i-cant-change-my-difficulty-after-a-new-game) * [Where do I unlock Gym Leader rematches?](#where-do-i-unlock-gym-leader-rematches) * [How does inviting a Gym Leader work? A Gym Leader I invited is gone! When is the rematch lady's Spearow coming back?](#how-does-inviting-a-gym-leader-work-a-gym-leader-i-invited-is-gone-when-is-the-rematch-ladys-spearow-coming-back) * [Can I rematch Giovanni? I can only invite seven Gym Leaders.](#can-i-rematch-giovanni-i-can-only-invite-seven-gym-leaders) * [What are the Challenge Mode boss trainer levels? I want to level cap my Nuzlocke run.](#what-are-the-challenge-mode-boss-trainer-levels-i-want-to-level-cap-my-nuzlocke-run) * [Where are the new Move Tutors and what moves do they teach?](#where-are-the-new-move-tutors-and-what-moves-do-they-teach) * [Is there a location list for all the Master Trainers?](#is-there-a-location-list-for-all-the-master-trainers) * Troubleshooting Savefiles, Emulators, and Flashcarts: * [Is my vanilla FireRed or LeafGreen save compatible with FRLG+?](#is-my-vanilla-firered-or-leafgreen-save-compatible-with-frlg) * [My emulator/flashcart doesn't work with FRLG+! The game won't save!](#my-emulatorflashcart-doesnt-work-with-frlg-the-game-wont-save) * Modifying FRLG+: * [Can I use FRLG+ as a ROM Base?](#can-i-use-frlg-as-a-rom-base) * [How did you implement *x* feature? Can I use *y* feature for my hack?](#how-did-you-implement-x-feature-can-i-use-y-feature-for-my-hack) * Miscellaneous: * [Where do I get TM10 for Hidden Power? Pickup doesn't give me TM10 for Hidden Power!](#where-do-i-get-tm10-for-hidden-power-pickup-doesnt-give-me-tm10-for-hidden-power) * [Will text be decapitalized?](#will-text-be-decapitalized) * [How do I link to other games? When is the earliest I can link?](#how-do-i-link-to-other-games-when-is-the-earliest-i-can-link) ## Mechanics: ### Will later-generation battle mechanics be implemented? What about the physical/special split? No. This hack aims to preserve the original battle mechanics and maintain link compatibility with the vanilla games. Changing the battle mechanics runs contrary to those goals. ### Will new moves be implemented? New held items? No. This hack aims to preserve the original battle mechanics and maintain link compatibility with the vanilla games. Adding new moves or held items runs contrary to those goals. ### Will the Generation VI+ Experience Share be implemented? No. ### Will you improve breeding mechanics? Breeding mechanics have been ported from Emerald, save for Volt Tackle Pichu breeding, but no further improvements will be made. This hack is not meant to supplant the vanilla games when it comes to obtaining good Pokémon. Because Volt Tackle Pichu are illegal in Generation III if they weren't generated in Emerald, the Volt Tackle breeding mechanic will not be ported. ### What are the shiny chances? Will they be improved? The shiny chance is 1/8192, as it was in Generation III. The odds of encountering a shiny Pokémon will not be increased. ### Will you add something to change my Pokémon's IVs/Hidden Power/Nature/etc.? No. This hack is not meant to supplant the vanilla games when it comes to obtaining good Pokémon. For IVs specifically, players can make the game behave as if all Pokémon IVs are perfect by toggling an option in the Key System Menu. This option does not affect a Pokémon's actual IVs or Hidden Power. ## Pokémon Availability: ### Will you add later-generation Pokémon? No. This hack aims to maintain link compatibility with the vanilla games and keep all obtainable Pokémon legal in Generation III. ### How many Pokémon are available? Will *all* Pokémon be catchable? There are 246 Pokémon available in the hack without trading. This hack does not add any new Pokémon that were not available in Generation III. To complete the National Dex, trade with the vanilla games. This is not a 386 hack, and not all Pokémon will be obtainable without trading. ### Can you change wild Pokémon availability/levels? Can you put *x* Pokémon in *y* map? Will you add more Pokémon in the future? One of the goals of this hack is to make every Pokémon available to the player legal in Generation III. This means that modifying existing Pokémon encounters or adding new Pokémon to existing encounter tables would make illegal Pokémon obtainable. There are new Pokémon available that were not in FireRed and LeafGreen originally, but they have been painstakingly implemented in such a way as to maintain their Generation III legality. Adding more Pokémon in the future would require finding ways to make them legal in Generation III, and for the remaining roster of Pokémon there aren't ways to do that while still having it make sense. If you want more Pokémon, trade with vanilla. ### Is there a list of wild encounter tables? Yes, however it is not well-organized. [The link is here](https://github.com/Deokishisu/FRLG-Plus/blob/master/src/data/wild_encounters.h). ### Can I obtain the other Kanto starters? Can I obtain the unchosen fossil? Yes, both in the postgame.
The other Kanto starters: The Rival's starter can be obtained as an Egg on Four Island from the Day Care Man. The unchosen starter can be obtained from Daisy after fixing the Network Machine on One Island.
The unchosen fossil: The unchosen fossil can be obtained in Three Isle Path from the prospector in the cave after becoming Champion.
### Can I evolve my Kanto Pokémon into their Johto evolutions without the National Dex? Yes. The game will no longer prevent Pokémon from evolving into a Pokémon that is not in the Kanto Pokédex. ### How do I evolve Eevee into Espeon and Umbreon? Eevee evolves into Espeon when leveled up outdoors with high friendship. Eevee evolves into Umbreon when leveled up indoors with high friendship. ### Can I evolve trade evolutions without trading? Yes. A new key item, the Link Bracelet, is available. It is an unmissable key item that is obtained during the story and can be used like an evolution stone. To evolve Pokémon that need to hold an item while trading to evolve, have them hold the item before using the Link Bracelet on them.
Exact location of the Link Bracelet: It is received from the Rival after defeating him in Silph Co.
### Are trade evolution items available before the postgame? Yes. Most are available as wild held items. Items like the Up-grade have been moved to be available before becoming the Champion.
Pokemon that hold trade evolution items: • Metal Coats can be found rarely on wild Magnemite and Magneton. • Dragon Scales can be found rarely on wild Dratini and Dragonair. • King's Rocks can be found rarely on wild Poliwhirl and Slowbro. • Deep Sea Scales can be found rarely on wild Chinchou underwater. • Deep Sea Teeth can be found rarely on wild Gyarados underwater.
### How do I get the other legendary beasts? Every time you enter the Hall of Fame, an uncaught legendary beast will begin to roam Kanto if there are no legendary beasts currently roaming. ### Where do I get the event tickets so I can obtain Mew, Lugia and Ho-oh, Deoxys, and Latias and Latias?
The Old Sea Map for Mew on Faraway Island: Become the Champion, then talk to Mr. Fuji in his home in Lavender Town.
The MysticTicket for Lugia and Ho-oh on Navel Rock: Obtain the Extended Dex, then get the diploma for completing the Kanto Pokédex in Celadon Mansion.
The AuroraTicket for Deoxys on Birth Island: Get a 28-win streak at the Battle Tower.
The Eon Ticket for Latias and Latios on Southern Island: Get a 56-win streak at the Battle Tower. These Pokémon are version exclusive, so switch versions in the Key System Menu to obtain both of them.
### How do I get Sudowoodo to battle me?
To get Sudowoodo to battle, have a Fresh Water in your bag and talk to it.
### How do I get the other Fighting Dojo Pokémon? How do I get the missing Hitmonchan/Hitmonlee? Breed your Hitmonchan/Hitmonlee for a Tyrogue and then evolve that Tyrogue into the Fighting Dojo Pokémon that you didn't pick. ## Gameplay: ### I just started the game, where is the Key System Menu? I can't change my difficulty after a new game! Once you have started a new game, you need to save and reset. The Key System Menu is on the Main Menu alongside the Continue and New Game options. ### Where do I unlock Gym Leader rematches? There is an old woman in a house on Seven Island who will start the sidequest for you. ### How does inviting a Gym Leader work? A Gym Leader I invited is gone! When is the rematch lady's Spearow coming back? When you show the old woman in the Battle House a full Fame Checker entry for a Gym Leader, her Spearow will leave to bring them an invitation. Once Spearow returns, the invited Gym Leader will periodically visit the Battle House basement where they can be rematched. Once beaten, a Gym Leader will return to their Gym, but will come back to the house automatically to train after some time. Both Spearow returning and Gym Leaders visiting are based on steps taken while outside of the Seven Island town area. There is randomness involved in how many steps it takes to trigger a Gym Leader visit, but there is bad luck protection that will begin forcing visits to prevent long waits between visits. The sign outside the Battle House will report which Gym Leaders are currently visiting. ### Can I rematch Giovanni? I can only invite seven Gym Leaders. Giovanni is canonically on the run after he flees his Gym and is not seen again in FRLG+. Only the first seven Gym Leaders can be rematched. ### What are the Challenge Mode boss trainer levels? I want to level cap my Nuzlocke run.
Their levels are as follows: Brock: 15
Misty: 22
Lt. Surge: 26
Rocket Hideout Giovanni: 31
Erika: 31
Koga: 46
Silph Co. Giovanni: 44
Sabrina: 46
Blaine: 51
Leader Giovanni: 54
Lorelei: 58
Bruno: 60
Agatha: 62
Lance: 64
Champion: 67
Rematch Lorelei: 71
Rematch Bruno: 73
Rematch Agatha: 75
Rematch Lance: 77
Rematch Champion: 80
### Where are the new Move Tutors and what moves do they teach?
New move tutor locations: • Fury Cutter - Vermilion City • Rollout - Route 24 • Swagger - Route 10 • Dynamic Punch - Saffron City • Sleep Talk - Silph Co. • Nightmare - Silph Co. • Self-Destruct - Cinnabar Island • Sky Attack - Mt. Ember The tutors in Saffron City and Silph Co. will not appear until Team Rocket has been driven from the city.
### Is there a location list for all the Master Trainers? The Master Trainers are all in the same locations as they were in LGPE, with the exception of Master Trainers who would have been on Cycling Road. Those that would have been on Cycling Road have been moved to Routes 16 and 18. Keeping that in mind, [refer to this list from Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Master_Trainer#Trainer_list) for the Master Trainer locations. ## Troubleshooting Savefiles, Emulators, and Flashcarts: ### Is my vanilla FireRed or LeafGreen save compatible with FRLG+? No. The save needed to be edited to add certain features, and therefore vanilla saves are incompatible with FRLG+. Similarly, FRLG+ saves cannot be used in vanilla. ### My emulator/flashcart doesn't work with FRLG+! The game won't save! The recommended emulator for desktop is [mGBA](https://mgba.io/downloads.html). If your emulator or flashcart isn't working properly with FRLG+, follow instructions for that particular emulator or flashcart for playing vanilla FireRed or LeafGreen and apply them to getting FRLG+ to work. If a patch is required to get vanilla FireRed or LeafGreen to save properly, then FRLG+ is incompatible with that emulator or flashcart. ## Modifying FRLG+: ### Can I use FRLG+ as a ROM Base? My official stance is that all mods of FRLG+ are unauthorized and unsupported, but derivative works of FRLG+ must be free and open source. If you choose to use FRLG+ as a ROM Base, I will not offer any support nor answer questions regarding developing a mod of this hack. Use of FRLG+ as a base is contingent on your resulting work being free and open source, as FRLG+ is. ### How did you implement *x* feature? Can I use *y* feature for my hack? My commits are descriptively labeled. If you want to grab something from FRLG+, go back through my commits and find where I implemented it. I don't offer support or answer questions for lifting things from FRLG+, but since the project is open source anyone can take from it. ## Miscellaneous: ### Where do I get TM10 for Hidden Power? Pickup doesn't give me TM10 for Hidden Power! The TM for Hidden Power has been removed from the pickup table and is now sold in the Celadon Dept. Store. The Pickup table has been changed to the following:
    15% - Oran Berry
    10% - Cheri Berry, Chesto Berry, Pecha Berry, Rawst Berry, Aspear Berry, Persim Berry
      5% - PP Up, Rare Candy, Nugget, Pomeg Berry
      1% - Kelpsy Berry, Qualot Berry, Hondew Berry, Grepa Berry, Tamato Berry
### Will text be decapitalized? No. ### How do I link to other games? When is the earliest I can link? FRLG+ is fully compatible with everything that the vanilla international FireRed and LeafGreen games were compatible with. If your emulator supports linking, refer to its documentation for how to initiate a link. The player may link with all Generation III GBA and GCN games the moment they receive the Pokédex. Finishing the Net Center on One Island is no longer a prerequisite for trading with the Hoenn games, trading with the Orre games, using Pokémon Box: Ruby and Sapphire, or receiving Eggs or Pokémon that are not in the Kanto Pokédex.             ================================================ FILE: FEATURES.md ================================================ ## Features #### Mechanical Additions: - A Key System has been implemented, similar to Black 2 and White 2. Press the L Button while on the Key System Menu to access the Help System, which has detailed information on each key. Use the keys to change various settings about your game. Those settings are: * __Version__: Switch between FireRed and LeafGreen to catch version-exclusive Pokémon. * __Difficulty__: Like in Black 2 and White 2, there is a Challenge and an Easy Mode difficulty. These difficulties scale trainer levels up or down, and in Challenge Mode important trainers will have an extra Pokémon and badge boosts are disabled. * __Nuzlocke Toggle__: Can toggle on a Nuzlocke mode. Press the L Button on the Key System menu to read the special ruleset for this mode. * __IV Calculation__: Can make the game treat your Pokémon's IVs as all perfect (31), all zero, or use their actual IVs as is standard for the purposes of stat calculation. This does not affect your Pokémon's actual IVs or Hidden Power, just how their stats are calculated. If set to all perfect, enemy Pokémon will also be treated as if they have all perfect IVs. * __EV Calculation__: Can make the game treat your Pokémon's EVs as all zero, or use their actual EVs as is standard for the purposes of stat calculation. This does not affect your Pokémon's actual EVs, (they will still gain/lose EVs as normal), just how their stats are calculated. * __No Free Heals__: Can disable free party heals, most notably the Pokémon Center heals and the Lavender Tower purified zone, but also many others. This also prevents PC Boxes from healing Pokémon deposited into them. * __Exp. Modifier__: Can alter experience gains using a multiplier. The possible options are 0×, 1/2×, 1×, and 2×. Pokémon still gain EVs normally when this is set to 0×. ##### Nuzlocke Info:
This is a special implementation of the Nuzlocke ruleset. While the Nuzlocke toggle is on (click for details):
#### Story Changes: - The player may progress to the Sevii Islands postgame content immediately after becoming the Champion; the National Dex is no longer required to do so. - After the player becomes the Champion, Oak will upgrade their Pokédex with a new Extended Mode which lists all Pokémon available without trading. - The National Pokédex is now obtained by trading in a Pokémon that is not in the Extended Dex. - A legendary beast will begin roaming when the player first enters the Hall of Fame, instead of upon delivering the Sapphire. - Event tickets are given away through gameplay milestones, allowing the player access to Birth Island and Navel Rock to catch Deoxys and Ho-oh/Lugia, respectively. * Faraway Island has been ported from Emerald, allowing players to catch Mew. The Old Sea Map is given away similarly to the other event tickets. * Southern Island has been ported from Emerald, allowing players to catch Latias and Latios. The Eon Ticket is given away similarly to the other event tickets. - Expanded postgame, focusing on organically fleshing out the available content. * HM08 Dive is now available and usable in the field. New underwater areas found on Route 20 and Bond Bridge. * A Safari Zone expansion adds two more areas, making more Pokémon obtainable. * The Hoenn Battle Tower has been ported from RS. The player will be invited to challenge the Battle Tower upon delivering the Ruby to Celio. * The Level 100 mode has been replaced with the Open Level mode like in Emerald. * Artisan Cave can be accessed from the Battle Tower's dock. * A new area in Berry Forest makes the pinch berries available. * A new area west of Cape Brink has rematchable trainers for the purposes of EV training. * Gym Leader rematches can be unlocked on Seven Island. * Master Trainers appear around Kanto after becoming the Champion, filling a similar role to their appearance in the Let's Go games with some differences. * Master Trainers can be rematched immediately. * Master Trainer Pokémon will scale to the level of the Pokémon used to challenge them, making them more accessible. * Master Trainer Pokémon hold items and have better movesets than in the Let's Go games, making them significantly more challenging. * The Master Trainers for Ditto, Articuno, Zapdos, Moltres, Mewtwo, and Mew want to see Pokémon with 100 total Effort Values. * Master Trainers that would have been on Cycling Road have been moved to Routes 16 and 18. * Additionally, some Master Trainers have been repositioned on their maps to account for FRLG area design. * Clearing a Master Trainer confers a title that can be used in link battles with other FRLG+ players. * Clearing all 151 Master Trainers unlocks a secret superboss Trainer. #### Quality of Life Changes: ##### Travel-related: - Running indoors. - Toggle auto running with the R button. - Cut trees stay cut permanently. - Hold B while surfing to go faster. If autorun is enabled, hold B to go slower, as the faster speed becomes default. - The bike now has two gears, one for the default speed, and one for Mach Bike speed. Press B while biking to switch between them. - The Victory Road boulder puzzles no longer reset. - The two boulders that block access to Mt. Ember's exterior will no longer block the way once the player moves past them. - Steps taken aren't counted while inside Safari Zone Rest Houses. - The player travels at running speed while diving. - The map fades in significantly faster after most warps, which makes entering and exiting doors faster. ##### Inventory and Item-related: - Expanded item pockets. The player can hold one stack of every legally-obtainable item at once. - Two new pockets, the Medicine and Held Items pockets, have been introduced to ease bag navigation. - Press Start in the bag to sort items by several criteria. - The bag pockets wrap around when switching between them. - Left and Right in the TM Case and Berry Pouch scrolls faster. - Infinite TM usage. TM prices have been modified to reflect this. TMs do not restore PP when learned, like in BW/B2W2. * The missable TM44 Rest from the S.S. Anne has been added to the Celadon Dept. Store inventory. * TM10 is no longer available through Pickup and is instead available in the Celadon Dept. Store. - EV-reducing berries ported from Emerald (the Pomeg glitch was fixed during the port). Otherwise worthless berries obtainable as hidden items or through Pickup have been changed to these. - When a repel expires, the player will be asked whether they want to use another immediately, like in Black 2 and White 2. - The Generation III Poké Ball varieties can be purchased in Silph Co. after it has been liberated from Team Rocket. - The Light Ball is held rarely by Pikachu outside of Viridian Forest, making it obtainable without trading. - LGPE-style bonus Premier Balls in shops. Buying multiples of ten of any Poké Ball type will give bonus Premier Balls. - Trade evolution items are now available before the postgame. * Up-grade can be found in Silph Co. * Metal Coats can be found rarely on wild Magnemite and Magneton. * Dragon Scales can be found rarely on wild Dratini and Dragonair. * King's Rocks can be found rarely on wild Poliwhirl and Slowbro. * Deep Sea Scales can be found rarely on wild Chinchou underwater. * Deep Sea Teeth can be found rarely on wild Gyarados underwater. ##### Battle-related: - New options available in the options menu to speed up battles: * Battle Transitions setting turns off the transition animation between the field and a battle. * Battle Intro Animation setting turns off the sliding animation that occurs at the start of every battle. * Battle Scene has been renamed to Move Animations and now also skips in-battle text delays when it is off. * HP Bar Animation Speed gives four options for how fast the HP bar animates, including instant. * Exp. Bar Animation Speed gives the player the choice to make experience bars animate instantly. - New battle style option, switch, which is like shift but doesn't tell what the opponent is switching in. Shift has been renamed to predict. - Press B on the "What will Pokémon do?" menu during wild battles to move the cursor to run. - A message is now printed at the end of a battle if a Pokémon has gained an item through the Pickup ability. ##### Move Tutor-related: - There are eight new Move Tutors scattered throughout the world that teach Fury Cutter, Rollout, Dynamic Punch, Sleep Talk, Nightmare, Self-Destruct, Sky Attack, and Swagger respectively. - Move Tutors will charge after the first time they teach a move, allowing infinite tutor uses at a cost. Frenzy Plant, Blast Burn, and Hydro Cannon can be tutored infinitely for free, and no longer have a friendship requirement to learn. - The Move Reminder can overwrite HM moves with relearned moves. - The Move Reminder can teach moves from a Pokémon's pre-evolutions, with some caveats. * If the Pokémon has a baby form, it can only relearn moves exclusive to that form if it was hatched itself. Wobbuffet from Mirage Island are the sole exception, as they were caught as Wynaut and therefore can also relearn Wynaut's exclusive moves. * If a Pokémon is not at a high enough level to learn a move from its own learnset, then it cannot relearn that move regardless of its presence in a pre-evolution's learnset. ##### User Interface-related: - Indicators have been added for which stats are affected by natures on summary screen. - Press the select button in the party menu to switch Pokémon without having to use the menu option. - Press the select button on the initial Pokédex screen to open the last viewed entry. - Hidden Power's true type and power are shown on the summary screen, and its type is shown in battle. - Return and Frustration's true power is shown on the summary screen. - Weather Ball's type and power are updated with the weather in both the summary screen and in battle. - Nature Power now displays the type, power, and accuracy of the move it will call in both the summary screen and in battle. - The summary screen now wraps around when cycling through the party Pokémon instead of stopping at the first and last. - Game Corner coins can be bought in increments of 1000 in addition to the other two options. ##### Pokémon-related: - All Deoxys formes are included, and are implemented in the way that the GBA games did it for link compatibility purposes. Switch Deoxys' forme by examining the meteorite exhibit in the Pewter Museum of Science. - No evolution restrictions; Pokémon will evolve regardless of whether or not their evolution is in the Kanto Dex. * Eevee evolves into Espeon by happiness outdoors and Umbreon by happiness indoors. - The EV cap for an individual stat is 252, like in later generations. - Pokémon that evolve by trade can evolve by using an unmissable Key Item on them that is obtained during the story. Pokémon like Scyther also need to be holding their evolution items to evolve in this way. - Uncaptured legendary Pokémon, roaming Pokémon, and Snorlax will be regenerated upon entering the Hall of Fame, keeping them from being missable. - If upon entering the Hall of Fame a legendary beast is not currently roaming, an uncaught one will begin to roam. This allows the player to capture all three legendary beasts in one playthrough. - A woman in the Move Reminder's House on Two Island can check if a Pokémon is fully EV trained. If it is, she'll give it the Effort Ribbon. ##### Day Care-related: - The Day-Care Man will raise his hand immediately if a Pokémon Egg is ready without having to transition to another map. He no longer steps forward to indicate an Egg is available. - The Day Care will send a retrieved Pokémon to a box as long as it's not holding mail if the player's party is full. - Eggs have a 50% chance of inheriting the nature of their mother or Ditto parent if that parent holds an Everstone, ported from Emerald. - The Route 5 Day-Care Man tells the player what level a Pokémon was when it was first deposited. ##### Miscellaneous Quality of Life Additions: - Instant text option. - No link restrictions * Trade with Ruby, Sapphire, Emerald, Colosseum, and XD the moment that the player catches a second Pokémon. * Unmodified Emerald may need the National Dex before it allows trading. - The Old Man tutorial battle is skipped if you have more than one Pokémon with you. - The Trainer Card star gained from doing Wireless minigames on Two Island can also be earned by achieving a 50-win streak at the Battle Tower. - The Pokémon Center nurses abbreviate their dialogue after getting two Trainer Card stars, similar to Generation IV and up. - Softlock prevention mechanisms are present. The player can no longer trap themselves on Cinnabar Island and the Indigo Plateau, and free Poké Balls are available in potential softlock situations. - There is now a PC in the S.S. Anne in the room where the player can rest. #### Vanilla Bug Fixes: - All Revision 1 fixes are included here. This includes the missing "Presents" graphic in the intro, and several Pokédex errors and oversights. - The Nugget Bridge Rocket can no longer give the player infinite Nuggets. - Assist, Block, Camouflage, Charge, Conversion 2, Follow Me, Grudge, Helping Hand, Imprison, Ingrain, Magic Coat, Mean Look, Memento, Mimic, Mud Sport, Nightmare, Pain Split, Recycle, Refresh, Role Play, Skill Swap, Slack Off, Snatch, Softboiled, Spider Web, Tail Glow, Vital Throw, Water Sport, Wish and Yawn display as --- accuracy instead of 100 accuracy. - The misspelling of "Pokcet" in the Teachy TV program has been fixed. - Raikou and Entei will not disappear if they Roar the player out of their battles. * The roaming IV glitch will __not__ be fixed, as it affects the legality of the legendary beasts. - Fixed Karate King Koichi and Charine localization oversights. These characters are now named Kiyo and Janine as they are in GSC/HGSS. - Fixed bug where the AI would decide to use Foresight based on the user's type and stats instead of the target's. - Fixed bug where the AI would incorrectly decide to try to stall with semi-invulnerable moves while a weather effect is damaging them. - Fixed bug where the AI would decide to use Facade based on the target's status instead of its own. - Fixed an oversight where Icefall Cave's cracked ice tiles could spawn wild encounters. If a wild encounter is generated on one, it does not crack, allowing the player to cheat the puzzle. - Fixed the [evolution move-learning glitch](https://glitchcity.wiki/wiki/Evolution_move-learning_glitch). - Many vanilla tile errors have been fixed. Too many. #### Miscellaneous Changes: - All Kanto Pokémon, along with 90% of Johto Pokémon, will be available in one playthrough. All Hoenn Pokémon (except for Azurill, Wynaut, Latias, Latios, and Deoxys) will still need to be traded for. - Abilities have effects in the overworld ported from Emerald. * As Lightningrod's Emerald overworld effect is inapplicable, it has been changed. Lightningrod now charges the Vs. Seeker twice as fast. - The Pokémon Summary Screen can accurately show the met location of any Pokémon obtained in Gen 3, including Pokémon from Orre. - Silph Co. is populated by workers once it is liberated from Team Rocket. - Some aesthetic and music changes which are mostly confined to the Sevii Islands to make each island more distinct. - Cycling Road forces the bike theme, like in RGBY. - Emerald's player character designs show in the link rooms if linking with Emerald. - The original RGBY textbox is available as frame type 11 in the options menu. - The Gambler trainer class has been decensored. ================================================ FILE: INSTALL.md ================================================ # Instructions These instructions explain how to set up the tools required to build **pokefirered**, which assembles the source files into a ROM. These instructions come with notes which can be expanded by clicking the "Note..." text. In general, you should not need to open these unless if you get an error or if you need additional clarification. If you run into trouble, ask for help on Discord or IRC (see [README.md](README.md)). ## Windows Windows has instructions for building with three possible terminals, providing 3 different options in case the user stumbles upon unexpected errors. - [Windows 10/11 (WSL1)](#windows-1011-wsl1) (**Fastest, highly recommended**, Windows 10 and 11 only) - [Windows (msys2)](#windows-msys2) (Second fastest) - [Windows (Cygwin)](#windows-cygwin) (Slowest) Unscientific benchmarks suggest **msys2 is 2x slower** than WSL1, and **Cygwin is 5-6x slower** than WSL1.
Note for advanced users: WSL2... > WSL2 is an option and is even faster than WSL1 if files are stored on the WSL2 file system, but some tools may have trouble interacting > with the WSL2 file system over the network drive. For example, tools which use Qt versions before 5.15.2 such as porymap > may have problems with parsing the \\wsl$ network drive path.
All of the Windows instructions assume that the default drive is C:\\. If this differs to your actual drive letter, then replace C with the correct drive letter when reading the instructions. **A note of caution**: As Windows 7 is officially unsupported by Microsoft and Windows 8 has very little usage, some maintainers are unwilling to maintain the Windows 7/8 instructions. Thus, these instructions may break in the future with fixes taking longer than fixes to the Windows 10 instructions. ## Windows 10/11 (WSL1) WSL1 is the preferred terminal to build **pokefirered**. The following instructions will explain how to install WSL1 (referred to interchangeably as WSL). - If WSL (Debian or Ubuntu) is **not installed**, then go to [Installing WSL1](#Installing-WSL1). - Otherwise, if WSL is installed, but it **hasn't previously been set up for another decompilation project**, then go to [Setting up WSL1](#Setting-up-WSL1). - Otherwise, **open WSL** and go to [Choosing where to store pokefirered (WSL1)](#Choosing-where-to-store-pokefirered-WSL1). ### Installing WSL1 1. Open [Windows Powershell **as Administrator**](https://i.imgur.com/QKmVbP9.png), and run the following command (Right Click or Shift+Insert is paste in the Powershell). ```powershell dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart ``` 2. Once the process finishes, restart your machine. 3. The next step is to choose and install a Linux distribution from the Microsoft Store. The following instructions will assume Ubuntu as the Linux distribution of choice.
Note for advanced users... > You can pick a preferred Linux distribution, but setup instructions may differ. Debian should work with the given instructions, but has not been tested.
4. Open the [Microsoft Store Linux Selection](https://aka.ms/wslstore), click Ubuntu, then click Get, which will install the Ubuntu distribution.
Notes... > Note 1: If a dialog pops up asking for you to sign into a Microsoft Account, then just close the dialog. > Note 2: If the link does not work, then open the Microsoft Store manually, and search for the Ubuntu app (choose the one with no version number).
### Setting up WSL1 Some tips before proceeding: - In WSL, Copy and Paste is either done via - **right-click** (selection + right click to Copy, right click with no selection to Paste) - **Ctrl+Shift+C/Ctrl+Shift+V** (enabled by right-clicking the title bar, going to Properties, then checking the checkbox next to "Use Ctrl+Shift+C/V as Copy/Paste"). - Some of the commands that you'll run will ask for your WSL password and/or confirmation to perform the stated action. This is to be expected, just enter your WSL password and/or the yes action when necessary. 1. Open **Ubuntu** (e.g. using Search). 2. WSL/Ubuntu will set up its own installation when it runs for the first time. Once WSL/Ubuntu finishes installing, it will ask for a username and password (to be input in).
Note... > When typing in the password, there will be no visible response, but the terminal will still read in input.
3. Update WSL/Ubuntu before continuing. Do this by running the following command. These commands will likely take a long time to finish: ```bash sudo apt update && sudo apt upgrade ``` > Note: If the repository you plan to build has an **[older revision of the INSTALL.md](https://github.com/pret/pokefirered/blob/b7a6240/INSTALL.md)**, then follow the [legacy WSL1 instructions](docs/legacy_WSL1_INSTALL.md) from here. 4. Certain packages are required to build pokefirered. Install these packages by running the following command: ```bash sudo apt install build-essential binutils-arm-none-eabi git libpng-dev ```
Note... > If the above command does not work, try the above command but replacing `apt` with `apt-get`.
### Choosing where to store pokefirered (WSL1) WSL has its own file system that's not natively accessible from Windows, but Windows files *are* accessible from WSL. So you're going to want to store pokefirered within Windows. For example, say you want to store pokefirered (and agbcc) in **C:\Users\\_\_\Desktop\decomps**. First, ensure that the folder already exists. Then, enter this command to **change directory** to said folder, where *\* is your **Windows** username: ```bash cd /mnt/c/Users//Desktop/decomps ```
Notes... > Note 1: The Windows C:\ drive is called /mnt/c/ in WSL. > Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "/mnt/c/users//Desktop/decomp folder"`. > Note 3: Windows path names are case-insensitive so adhering to capitalization isn't needed
If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)), or continue reading below for [Windows instructions using msys2](#windows-msys2). ## Windows (msys2) - If devkitARM is **not installed**, then go to [Installing devkitARM](#installing-devkitarm). - If devkitARM is installed, but msys2 **hasn't previously been set up for another decompilation project**, then go to [Setting up msys2](#setting-up-msys2). - Otherwise, **open msys2** and go to [Choosing where to store pokefirered (msys2)](#choosing-where-to-store-pokefirered-msys2). ### Installing devkitARM 1. Download the devkitPro installer [here](https://github.com/devkitPro/installer/releases). 2. Run the devkitPro installer. In the "Choose Components" screen, uncheck everything except GBA Development unless if you plan to install other devkitPro components for other purposes. Keep the install location as C:\devkitPro and leave the Start Menu option unchanged. ### Setting up msys2 Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert. 1. Open msys2 at C:\devkitPro\msys2\msys2_shell.bat. 2. Certain packages are required to build pokefirered. Install these by running the following command: ```bash pacman -S make gcc zlib-devel git ```
Note... > This command will ask for confirmation, just enter the yes action when prompted.
3. Download [libpng](https://sourceforge.net/projects/libpng/files/libpng16/1.6.37/libpng-1.6.37.tar.xz/download). 4. Change directory to where libpng was downloaded. By default, msys2 will start in the current user's profile folder, located at **C:\Users\\⁠_\_**, where *\* is your Windows username. In most cases, libpng should be saved within a subfolder of the profile folder. For example, if libpng was saved to **C:\Users\\_\_\Downloads** (the Downloads location for most users), enter this command: ```bash cd Downloads ```
Notes... > Note 1: While not shown, msys uses forward slashes `/` instead of backwards slashes `\` as the directory separator. > Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Downloads/My Downloads"`. > Note 3: Windows path names are case-insensitive so adhering to capitalization isn’t needed. > Note 4: If libpng was saved elsewhere, you will need to specify the full path to where libpng was downloaded, e.g. `cd c:/devkitpro/msys2` if it was saved there.
5. Run the following commands to uncompress and install libpng. ```bash tar xf libpng-1.6.37.tar.xz cd libpng-1.6.37 ./configure --prefix=/usr make check make install ``` 6. Then finally, run the following command to change back to the user profile folder. ```bash cd ``` ### Choosing where to store pokefirered (msys2) At this point, you can choose a folder to store pokefirered into. If you're okay with storing pokefirered in the user profile folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokefirered is stored when changing directory to the pokefirered folder. For example, if you want to store pokefirered (and agbcc) in **C:\Users\\_\_\Desktop\decomps** (where *\* is your **Windows** username), enter this command: ```bash cd Desktop/decomps ``` If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)), or continue reading below for [Windows instructions using Cygwin](#windows-cygwin). ## Windows (Cygwin) 1. If devkitARM is **not installed**, then follow the instructions used to [install devkitARM](#installing-devkitarm) for the msys2 setup before continuing. *Remember to not continue following the msys2 instructions by mistake!* 2. - If Cygwin is **not installed**, or does not have all of the required packages installed, then go to [Installing Cygwin](#installing-cygwin). - If Cygwin is installed, but **is not configured to work with devkitARM**, then go to [Configuring devkitARM for Cygwin](#configuring-devkitarm-for-cygwin). - Otherwise, **open Cygwin** and go to [Choosing where to store pokefirered (Cygwin)](#choosing-where-to-store-pokefirered-cygwin) ### Installing Cygwin 1. Download [Cygwin](https://cygwin.com/install.html): setup-x86_64.exe for 64-bit Windows, setup-x86.exe for 32-bit. 2. Run the Cygwin setup. Within the Cygwin setup, leave the default settings until the "Choose A Download Site" screen. 3. At "Choose a Download Site", select any mirror within the Available Download Sites. 4. At "Select Packages", set the view to "Full" (top left) and search for the following packages: - `make` - `git` - `gcc-core` - `gcc-g++` - `libpng-devel` To quickly find these, use the search bar and type the name of each package. Ensure that the selected package name is the **exact** same as the one you're trying to download, e.g. `cmake` is **NOT** the same as `make`. 5. For each package, double click on the text that says "**Skip**" next to each package to select the most recent version to install. If the text says anything other than "**Skip**", (e.g. Keep or a version number), then the package is or will be installed and you don't need to do anything. 6. Once all required packages have been selected, finish the installation. ### Configuring devkitARM for Cygwin Note that in Cygwin, Copy is Ctrl+Insert and Paste is Shift+Insert. 1. Open **Cygwin**. 2. Run the following commands to configure devkitPro to work with Cygwin. ```bash export DEVKITPRO=/cygdrive/c/devkitpro echo export DEVKITPRO=$DEVKITPRO >> ~/.bashrc export DEVKITARM=$DEVKITPRO/devkitARM echo export DEVKITARM=$DEVKITARM >> ~/.bashrc ```
Note... > Replace the drive letter c with the actual drive letter if it is not c.
### Choosing where to store pokefirered (Cygwin) Cygwin has its own file system that's within Windows, at **C:\cygwin64\home\\_\_**. If you don't want to store pokefirered there, you'll need to account for where pokefirered is stored when **changing directory** to the pokefirered folder. For example, if you want to store pokefirered (and agbcc) in **C:\Users\\_\_\Desktop\decomps**, enter this command, where *\* is your **Windows** username: ```bash cd c:/Users//Desktop/decomps ``` Note that the directory **must exist** in Windows. If you want to store pokefirered in a dedicated folder that doesn't exist (e.g. the example provided above), then create the folder (e.g. using Windows Explorer) before executing the `cd` command.
Notes... > Note 1: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "c:/users//Desktop/decomp folder"`. > Note 2: Windows path names are case-insensitive so adhering to capitalization isn't needed
If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)). ## macOS 1. If the Xcode Command Line Tools are not installed, download the tools [here](https://developer.apple.com/xcode/resources/), open your Terminal, and run the following command: ```bash xcode-select --install ``` 2. - If libpng is **not installed**, then go to [Installing libpng (macOS)](#installing-libpng-macos). - If devkitARM is **not installed**, then go to [Installing devkitARM (macOS)](#installing-devkitarm-macos). - Otherwise, **open the Terminal** and go to [Choosing where to store pokefirered (macOS)](#choosing-where-to-store-pokefirered-macos) ### Installing libpng (macOS)
Note for advanced users... > This guide installs libpng via Homebrew as it is the easiest method, however advanced users can install libpng through other means if they so desire.
Note for Apple Silicon (M1) Mac users... > Currently, Homebrew and libng must be installed via Rosetta on Apple Silicon Macs. Before continuing, create a [Terminal shell profile with Rosetta](https://www.astroworldcreations.com/blog/apple-silicon-and-legacy-command-line-software). Be sure to run the commands corresponding to Apple Silicon (M1).
1. Open the Terminal. 2. If Homebrew is not installed, then install [Homebrew](https://brew.sh/) by following the instructions on the website. 3. Run the following command to install libpng. ```bash brew install libpng # Intel Macs /usr/local/bin/brew install libpng # Apple Silicon (M1) Macs ``` libpng is now installed. Continue to [Installing devkitARM (macOS)](#installing-devkitarm-macos) if **devkitARM is not installed**, otherwise, go to [Choosing where to store pokefirered (macOS)](#choosing-where-to-store-pokefirered-macos). ### Installing devkitARM (macOS) 1. Download the `devkitpro-pacman-installer.pkg` package from [here](https://github.com/devkitPro/pacman/releases). 2. Open the package to install devkitPro pacman. 3. In the Terminal, run the following commands to install devkitARM: ```bash sudo dkp-pacman -Sy sudo dkp-pacman -S gba-dev sudo dkp-pacman -S devkitarm-rules ``` The command with gba-dev will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation. 4. After the tools are installed, devkitARM must now be made accessible from anywhere by the system. To do so, run the following commands: ```bash export DEVKITPRO=/opt/devkitpro echo "export DEVKITPRO=$DEVKITPRO" >> ~/.bashrc # Intel Macs echo "export DEVKITPRO=$DEVKITPRO" >> ~/.zshrc # Apple Silicon (M1) Macs export DEVKITARM=$DEVKITPRO/devkitARM echo "export DEVKITARM=$DEVKITARM" >> ~/.bashrc # Intel Macs echo "export DEVKITARM=$DEVKITARM" >> ~/.zshrc # Apple Silicon (M1) Macs echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile # Intel Macs echo "if [ -f ~/.zshrc ]; then . ~/.zshrc; fi" >> ~/.zprofile # Apple Silicon (M1) Macs ``` ### Choosing where to store pokefirered (macOS) At this point, you can choose a folder to store pokefirered into. If you're okay with storing pokefirered in the user folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokefirered is stored when changing directory to the pokefirered folder. For example, if you want to store pokefirered (and agbcc) in **~/Desktop/decomps**, enter this command to **change directory** to the desired folder: ```bash cd Desktop/decomps ``` Note that the directory **must exist** in the folder system. If you want to store pokefirered in a dedicated folder that doesn't exist (e.g. the example provided above), then create the folder (e.g. using Finder) before executing the `cd` command.
Note... > Note: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Desktop/decomp folder"`
If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)). ## Linux Open Terminal and enter the following commands, depending on which distro you're using. ### Debian/Ubuntu-based distributions Run the following command to install the necessary packages: ```bash sudo apt install build-essential binutils-arm-none-eabi git libpng-dev ``` Then proceed to [Choosing where to store pokefirered (Linux)](#choosing-where-to-store-pokefirered-linux).
Note for legacy repos... > If the repository you plan to build has an **[older revision of the INSTALL.md](https://github.com/pret/pokefirered/blob/571c598/INSTALL.md)**, > then you will have to install devkitARM. Install all the above packages except binutils-arm-none-eabi, and follow the instructions to > [install devkitARM on Debian/Ubuntu-based distributions](#installing-devkitarm-on-debianubuntu-based-distributions).
### Other distributions _(Specific instructions for other distributions would be greatly appreciated!)_ 1. Try to find the required software in its repositories: - `gcc` - `g++` - `make` - `git` - `libpng-dev` 2. Follow the instructions [here](https://devkitpro.org/wiki/devkitPro_pacman) to install devkitPro pacman. As a reminder, the goal is to configure an existing pacman installation to recognize devkitPro's repositories. 3. Once devkitPro pacman is configured, run the following commands: ```bash sudo pacman -Sy sudo pacman -S gba-dev ``` The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation. ### Choosing where to store pokefirered (Linux) At this point, you can choose a folder to store pokefirered (and agbcc) into. If so, you'll have to account for the modified folder path when changing directory to the pokefirered folder. If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)). ## Installation
Note for Windows users... > Consider adding an exception for the `pokefirered` and/or `decomps` folder in Windows Security using > [these instructions](https://support.microsoft.com/help/4028485). This prevents Microsoft Defender from > scanning them which might improve performance while building.
1. If pokefirered is not already downloaded (some users may prefer to download pokefirered via a git client like GitHub Desktop), run: ```bash git clone https://github.com/pret/pokefirered ```
Note for WSL1... > If you get an error stating `fatal: could not set 'core.filemode' to 'false'`, then run the following commands: > ```bash > cd > sudo umount /mnt/c > sudo mount -t drvfs C: /mnt/c -o metadata,noatime > cd > ``` > Where *\* is the path of the folder [where you chose to store pokefirered](#Choosing-where-to-store-pokefirered-WSL1). Then run the `git clone` command again.
2. Install agbcc into pokefirered. The commands to run depend on certain conditions. **You should only follow one of the listed instructions**: - If agbcc has **not been built before** in the folder where you chose to store pokefirered, run the following commands to build and install it into pokefirered: ```bash git clone https://github.com/pret/agbcc cd agbcc ./build.sh ./install.sh ../pokefirered ``` - **Otherwise**, if agbcc has been built before (e.g. if the git clone above fails), but was **last built on a different terminal** than the one currently used (only relevant to Windows, e.g. switching from msys2 to WSL1), then run the following commands to build and install it into pokefirered: ```bash cd agbcc git clean -fX ./build.sh ./install.sh ../pokefirered ``` - **Otherwise**, if agbcc has been built before on the same terminal, run the following commands to install agbcc into pokefirered: ```bash cd agbcc ./install.sh ../pokefirered ```
Note... > If building agbcc or pokefirered results in an error, try deleting the agbcc folder and re-installing agbcc as if it has not been built before.
3. Once agbcc is installed, change directory back to the base directory where pokefirered and agbcc are stored: ```bash cd .. ``` Now you're ready to [build **pokefirered**](#build-pokefirered) ## Build pokefirered If you aren't in the pokefirered directory already, then **change directory** to the pokefirered folder: ```bash cd pokefirered ``` To build **pokefirered.gba** (Note: to speed up builds, see [Parallel builds](#parallel-builds)): ```bash make ``` If it has built successfully you will have the output file **pokefirered.gba** in your project folder.
Note for Windows... > If you switched terminals since the last build (e.g. from msys2 to WSL1), you must run `make clean-tools` once before any subsequent `make` commands.
## Build pokeleafgreen and REV1 Pokemon FireRed and LeafGreen were both released together. As such, this project is capable of building both ROMs. To do so, simply run ```bash make leafgreen ``` This project can also build the version 1.1 ROMs of both FireRed and LeafGreen. To build each, run ```bash make firered_rev1 # for FireRed 1.1 make leafgreen_rev1 # for LeafGreen 1.1 ``` # Building guidance ## Parallel builds See [the GNU docs](https://www.gnu.org/software/make/manual/html_node/Parallel.html) and [this Stack Exchange thread](https://unix.stackexchange.com/questions/208568) for more information. To speed up building, first get the value of `nproc` by running the following command: ```bash nproc ``` Builds can then be sped up by running the following command: ```bash make -j ``` Replace `` with the number that the `nproc` command returned. `nproc` is not available on macOS. The alternative is `sysctl -n hw.ncpu` ([relevant Stack Overflow thread](https://stackoverflow.com/questions/1715580)). ## Compare ROM to the original For contributing, or if you'd simply like to verify that your ROM is identical to the original game, run: ```bash make compare # or compare_leafgreen, compare_firered_rev1, compare_leafgreen_rev1 ``` If it matches, you will see the following at the end of the output: ```bash pokefirered.gba: OK ``` If there are any changes from the original game, you will instead see: ```bash pokefirered.gba: FAILED shasum: WARNING: 1 computed checksum did NOT match ``` ## devkitARM's C compiler This project supports the `arm-none-eabi-gcc` compiler included with devkitARM. If devkitARM (a.k.a. gba-dev) has already been installed as part of the platform-specific instructions, simply run: ```bash make modern # or leafgreen_modern, firered_rev1_modern, leafgreen_rev1_modern ``` Otherwise, follow the instructions below to install devkitARM. ### Installing devkitARM on WSL1 1. `gdebi-core` must be installed beforehand in order to install devkitPro pacman (which facilitates the installation of devkitARM). Install this with the following command: ```bash sudo apt install gdebi-core ```
Note... > If the above command does not work, try the above command but replacing `apt` with `apt-get`.
2. Once `gdebi-core` is done installing, download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`. 3. Change directory to where the package was downloaded. For example, if the package file was saved to **C:\Users\\_\_\Downloads** (the Downloads location for most users), enter this command, where *\ is your **Windows** username: ```bash cd /mnt/c/Users//Downloads ``` 4. Once the directory has been changed to the folder containing the devkitPro pacman package, run the following commands to install devkitARM. ```bash sudo gdebi devkitpro-pacman.amd64.deb sudo dkp-pacman -Sy sudo dkp-pacman -S gba-dev ``` The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.
Note... > Note: `devkitpro-pacman.amd64.deb` is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead.
5. Run the following command to set devkitPro related environment variables (alternatively, close and re-open WSL): ```bash source /etc/profile.d/devkit-env.sh ``` devkitARM is now installed. ### Installing devkitARM on Debian/Ubuntu-based distributions 1. If `gdebi-core` is not installed, run the following command: ```bash sudo apt install gdebi-core ``` 2. Download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`. 3. Change directory to where the package was downloaded. Then, run the following commands to install devkitARM: ```bash sudo gdebi devkitpro-pacman.amd64.deb sudo dkp-pacman -Sy sudo dkp-pacman -S gba-dev ``` The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation. > Note: `devkitpro-pacman.amd64.deb` is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead. 4. Run the following command to set devkitPro related environment variables (alternatively, close and re-open the Terminal): ```bash source /etc/profile.d/devkit-env.sh ``` devkitARM is now installed. ## Other toolchains To build using a toolchain other than devkitARM, override the `TOOLCHAIN` environment variable with the path to your toolchain, which must contain the subdirectory `bin`. ```bash make TOOLCHAIN="/path/to/toolchain/here" ``` The following is an example: ```bash make TOOLCHAIN="/usr/local/arm-none-eabi" ``` To compile the `modern` target with this toolchain, the subdirectories `lib`, `include`, and `arm-none-eabi` must also be present. # Useful additional tools * [porymap](https://github.com/huderlem/porymap) for viewing and editing maps * [poryscript](https://github.com/huderlem/poryscript) for scripting ([VS Code extension](https://marketplace.visualstudio.com/items?itemName=karathan.poryscript)) * [Tilemap Studio](https://github.com/Rangi42/tilemap-studio) for viewing and editing tilemaps ================================================ FILE: Makefile ================================================ TOOLCHAIN := $(DEVKITARM) COMPARE ?= 0 # don't use dkP's base_tools anymore # because the redefinition of $(CC) conflicts # with when we want to use $(CC) to preprocess files # thus, manually create the variables for the bin # files, or use arm-none-eabi binaries on the system # if dkP is not installed on this system ifneq (,$(TOOLCHAIN)) ifneq ($(wildcard $(TOOLCHAIN)/bin),) export PATH := $(TOOLCHAIN)/bin:$(PATH) endif endif PREFIX := arm-none-eabi- OBJCOPY := $(PREFIX)objcopy OBJDUMP := $(PREFIX)objdump AS := $(PREFIX)as LD := $(PREFIX)ld # note: the makefile must be set up so MODERNCC is never called # if MODERN=0 MODERNCC := $(PREFIX)gcc ifeq ($(OS),Windows_NT) EXE := .exe else EXE := endif # use arm-none-eabi-cpp for macOS # as macOS's default compiler is clang # and clang's preprocessor will warn on \u # when preprocessing asm files, expecting a unicode literal # we can't unconditionally use arm-none-eabi-cpp # as installations which install binutils-arm-none-eabi # don't come with it ifneq ($(MODERN),1) ifeq ($(shell uname -s),Darwin) CPP := $(PREFIX)cpp else CPP := $(CC) -E endif else CPP := $(PREFIX)cpp endif include config.mk GCC_VER = $(shell $(CC) -dumpversion) ifeq ($(MODERN),0) CC1 := tools/agbcc/bin/agbcc$(EXE) override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm LIBPATH := -L ../../tools/agbcc/lib else CC1 := $(shell $(MODERNCC) --print-prog-name=cc1) -quiet override CFLAGS += -mthumb -mthumb-interwork -O2 -mcpu=arm7tdmi -mabi=apcs-gnu -fno-toplevel-reorder -fno-aggressive-loop-optimizations -Wno-pointer-to-int-cast LIBPATH := -L $(shell dirname $(shell $(MODERNCC) --print-file-name=libgcc.a)) -L $(shell dirname $(shell $(MODERNCC) --print-file-name=libc.a)) endif CPPFLAGS := -iquote include -D$(GAME_VERSION) -DREVISION=$(GAME_REVISION) -D$(GAME_LANGUAGE) -DMODERN=$(MODERN) ifeq ($(MODERN),0) CPPFLAGS += -I tools/agbcc -I tools/agbcc/include -nostdinc -undef endif SHELL := /bin/bash -o pipefail ROM := poke$(BUILD_NAME).gba OBJ_DIR := build/$(BUILD_NAME) ELF = $(ROM:.gba=.elf) MAP = $(ROM:.gba=.map) SYM = $(ROM:.gba=.sym) C_SUBDIR = src DATA_C_SUBDIR = src/data ASM_SUBDIR = asm DATA_ASM_SUBDIR = data SONG_SUBDIR = sound/songs MID_SUBDIR = sound/songs/midi SAMPLE_SUBDIR = sound/direct_sound_samples CRY_SUBDIR = sound/direct_sound_samples/cries C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR) ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR) DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR) SONG_BUILDDIR = $(OBJ_DIR)/$(SONG_SUBDIR) MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR) ASFLAGS := -mcpu=arm7tdmi --defsym $(GAME_VERSION)=1 --defsym REVISION=$(GAME_REVISION) --defsym $(GAME_LANGUAGE)=1 --defsym MODERN=$(MODERN) LDFLAGS = -Map ../../$(MAP) LIB := $(LIBPATH) -lc -lgcc ifneq ($(MODERN),0) ifneq ($(DEVKITARM),) ifeq ($(TOOLCHAIN),$(DEVKITARM)) LIB += -lsysbase -lc endif endif LIB += -lnosys endif SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c GFX := tools/gbagfx/gbagfx AIF := tools/aif2pcm/aif2pcm MID := tools/mid2agb/mid2agb SCANINC := tools/scaninc/scaninc PREPROC := tools/preproc/preproc RAMSCRGEN := tools/ramscrgen/ramscrgen FIX := tools/gbafix/gbafix MAPJSON := tools/mapjson/mapjson JSONPROC := tools/jsonproc/jsonproc PERL := perl # Clear the default suffixes .SUFFIXES: # Don't delete intermediate files .SECONDARY: # Delete files that weren't built properly .DELETE_ON_ERROR: # Secondary expansion is required for dependency variables in object rules. .SECONDEXPANSION: $(shell mkdir -p $(C_BUILDDIR) $(ASM_BUILDDIR) $(DATA_ASM_BUILDDIR) $(SONG_BUILDDIR) $(MID_BUILDDIR)) infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) # Build tools when building the rom # Disable dependency scanning for clean/tidy/tools ifeq (,$(filter-out all compare syms modern,$(MAKECMDGOALS))) $(call infoshell, $(MAKE) tools) else NODEP := 1 endif C_SRCS := $(wildcard $(C_SUBDIR)/*.c) C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS)) C_ASM_SRCS += $(wildcard $(C_SUBDIR)/*.s $(C_SUBDIR)/*/*.s $(C_SUBDIR)/*/*/*.s) C_ASM_OBJS := $(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o,$(C_ASM_SRCS)) ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s) ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS)) # get all the data/*.s files EXCEPT the ones with specific rules REGULAR_DATA_ASM_SRCS := $(filter-out $(DATA_ASM_SUBDIR)/maps.s $(DATA_ASM_SUBDIR)/map_events.s, $(wildcard $(DATA_ASM_SUBDIR)/*.s)) DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s) DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS)) SONG_SRCS := $(wildcard $(SONG_SUBDIR)/*.s) SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS)) MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid) MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS)) OBJS := $(C_OBJS) $(C_ASM_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS) OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS)) TOOLDIRS := $(filter-out tools/agbcc tools/binutils tools/analyze_source,$(wildcard tools/*)) TOOLBASE = $(TOOLDIRS:tools/%=%) TOOLS = $(foreach tool,$(TOOLBASE),tools/$(tool)/$(tool)$(EXE)) ALL_BUILDS := firered firered_rev1 leafgreen leafgreen_rev1 ALL_BUILDS += $(ALL_BUILDS:%=%_modern) .PHONY: all rom tools clean-tools mostlyclean clean compare tidy syms $(TOOLDIRS) $(ALL_BUILDS) $(ALL_BUILDS:%=compare_%) modern MAKEFLAGS += --no-print-directory AUTO_GEN_TARGETS := all: tools rom syms: $(SYM) rom: $(ROM) ifeq ($(COMPARE),1) @$(SHA1) $(BUILD_NAME).sha1 endif tools: $(TOOLDIRS) $(TOOLDIRS): @$(MAKE) -C $@ # For contributors to make sure a change didn't affect the contents of the ROM. compare: @$(MAKE) COMPARE=1 mostlyclean: tidy rm -f $(SAMPLE_SUBDIR)/*.bin rm -f $(CRY_SUBDIR)/*.bin $(RM) $(SONG_OBJS) $(MID_SUBDIR)/*.s find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + $(RM) $(DATA_ASM_SUBDIR)/layouts/layouts.inc $(DATA_ASM_SUBDIR)/layouts/layouts_table.inc $(RM) $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} + $(RM) $(AUTO_GEN_TARGETS) clean-tools: @$(foreach tooldir,$(TOOLDIRS),$(MAKE) clean -C $(tooldir);) clean: mostlyclean clean-tools tidy: $(RM) $(ALL_BUILDS:%=poke%{.gba,.elf,.map}) $(RM) -r build include graphics_file_rules.mk include tileset_rules.mk include map_data_rules.mk include spritesheet_rules.mk include json_data_rules.mk include songs.mk %.s: ; %.png: ; %.pal: ; %.aif: ; %.1bpp: %.png ; $(GFX) $< $@ %.4bpp: %.png ; $(GFX) $< $@ %.8bpp: %.png ; $(GFX) $< $@ %.gbapal: %.pal ; $(GFX) $< $@ %.gbapal: %.png ; $(GFX) $< $@ %.lz: % ; $(GFX) $< $@ %.rl: % ; $(GFX) $< $@ $(CRY_SUBDIR)/%.bin: $(CRY_SUBDIR)/%.aif ; $(AIF) $< $@ --compress sound/%.bin: sound/%.aif ; $(AIF) $< $@ sound/songs/%.s: sound/songs/%.mid $(MID) $< $@ ifeq ($(MODERN),0) $(C_BUILDDIR)/agb_flash.o: CFLAGS := -O -mthumb-interwork $(C_BUILDDIR)/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork $(C_BUILDDIR)/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork $(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE) $(C_BUILDDIR)/isagbprn.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE) $(C_BUILDDIR)/isagbprn.o: CFLAGS := -mthumb-interwork $(C_BUILDDIR)/trainer_tower.o: CFLAGS += -ffreestanding $(C_BUILDDIR)/battle_anim_flying.o: CFLAGS += -ffreestanding $(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm$(EXE) $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet else $(C_BUILDDIR)/berry_crush_2.o: CFLAGS += -Wno-address-of-packed-member $(C_BUILDDIR)/berry_crush_3.o: CFLAGS += -Wno-address-of-packed-member $(C_BUILDDIR)/braille_text.o: CFLAGS += -Wno-address-of-packed-member $(C_BUILDDIR)/text.o: CFLAGS += -Wno-address-of-packed-member $(C_BUILDDIR)/battle_tower.o: CFLAGS += -Wno-div-by-zero $(C_BUILDDIR)/librfu_intr.o: override CFLAGS += -marm -mthumb-interwork -O2 -mtune=arm7tdmi -march=armv4t -mabi=apcs-gnu -fno-toplevel-reorder -fno-aggressive-loop-optimizations -Wno-pointer-to-int-cast endif ifeq ($(NODEP),1) $(C_BUILDDIR)/%.o: c_dep := else $(C_BUILDDIR)/%.o: c_dep = $(shell [[ -f $(C_SUBDIR)/$*.c ]] && $(SCANINC) -I include -I tools/agbcc/include $(C_SUBDIR)/$*.c) endif ifeq ($(DINFO),1) override CFLAGS += -g endif $(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep) @$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s @echo -e ".text\n\t.align\t2, 0 @ Don't pad with nop\n" >> $(C_BUILDDIR)/$*.s $(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s ifeq ($(NODEP),1) $(C_BUILDDIR)/%.o: c_asm_dep := else $(C_BUILDDIR)/%.o: c_asm_dep = $(shell [[ -f $(C_SUBDIR)/$*.s ]] && $(SCANINC) -I "" $(C_SUBDIR)/$*.s) endif $(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s $$(c_asm_dep) $(AS) $(ASFLAGS) -o $@ $< ifeq ($(NODEP),1) $(DATA_ASM_BUILDDIR)/%.o: data_dep := else $(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) -I . $(DATA_ASM_SUBDIR)/$*.s) endif ifeq ($(NODEP),1) $(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $(AS) $(ASFLAGS) -o $@ $< else define ASM_DEP $1: $2 $$(shell $(SCANINC) -I include -I "" $2) $$(AS) $$(ASFLAGS) -o $$@ $$< endef $(foreach src, $(ASM_SRCS), $(eval $(call ASM_DEP,$(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o, $(src)),$(src)))) endif ifeq ($(NODEP),1) $(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@ else define DATA_ASM_DEP $1: $2 $$(shell $(SCANINC) -I include -I "" $2) $$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(AS) $$(ASFLAGS) -o $$@ endef $(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call DATA_ASM_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src)))) endif $(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s $(AS) $(ASFLAGS) -I sound -o $@ $< $(OBJ_DIR)/sym_bss.ld: sym_bss.txt $(RAMSCRGEN) .bss $< ENGLISH > $@ $(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt) $(RAMSCRGEN) COMMON $< ENGLISH -c $(C_BUILDDIR),common_syms > $@ $(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt $(RAMSCRGEN) ewram_data $< ENGLISH > $@ ifeq ($(MODERN),0) LD_SCRIPT := ld_script.ld LD_SCRIPT_DEPS := $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld else LD_SCRIPT := ld_script_modern.ld LD_SCRIPT_DEPS := endif $(ELF): $(LD_SCRIPT) $(LD_SCRIPT_DEPS) $(OBJS) @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< -o ../../$@ $(OBJS_REL) $(LIB) $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(GAME_REVISION) --silent $(ROM): $(ELF) $(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0x9000000 $< $@ # "friendly" target names for convenience sake firered: ; @$(MAKE) GAME_VERSION=FIRERED firered_rev1: ; @$(MAKE) GAME_VERSION=FIRERED GAME_REVISION=1 leafgreen: ; @$(MAKE) GAME_VERSION=LEAFGREEN leafgreen_rev1: ; @$(MAKE) GAME_VERSION=LEAFGREEN GAME_REVISION=1 compare_firered: ; @$(MAKE) GAME_VERSION=FIRERED COMPARE=1 compare_firered_rev1: ; @$(MAKE) GAME_VERSION=FIRERED GAME_REVISION=1 COMPARE=1 compare_leafgreen: ; @$(MAKE) GAME_VERSION=LEAFGREEN COMPARE=1 compare_leafgreen_rev1: ; @$(MAKE) GAME_VERSION=LEAFGREEN GAME_REVISION=1 COMPARE=1 firered_modern: ; @$(MAKE) GAME_VERSION=FIRERED MODERN=1 firered_rev1_modern: ; @$(MAKE) GAME_VERSION=FIRERED GAME_REVISION=1 MODERN=1 leafgreen_modern: ; @$(MAKE) GAME_VERSION=LEAFGREEN MODERN=1 leafgreen_rev1_modern: ; @$(MAKE) GAME_VERSION=LEAFGREEN GAME_REVISION=1 MODERN=1 modern: ; @$(MAKE) MODERN=1 ################### ### Symbol file ### ################### $(SYM): $(ELF) $(OBJDUMP) -t $< | sort -u | grep -E "^0[2389]" | $(PERL) -p -e 's/^(\w{8}) (\w).{6} \S+\t(\w{8}) (\S+)$$/\1 \2 \3 \4/g' > $@ ================================================ FILE: README.md ================================================ # Pokémon FireRed and LeafGreen+ This is the repository for the Pokémon FireRed and LeafGreen+ hack, based on [pret's decompilation of Pokémon FireRed and LeafGreen](https://github.com/pret/pokefirered). * [**View the FAQ**](https://github.com/Deokishisu/FRLG-Plus/blob/master/FAQ.md) * [**View the full features list**](https://github.com/Deokishisu/FRLG-Plus/blob/master/FEATURES.md) * [**Download the patch**](https://github.com/Deokishisu/FRLG-Plus/releases/latest) * Please direct questions and comments to [**the PokéCommunity thread**](https://www.pokecommunity.com/showthread.php?t=454382). * Support Development * [I have a Ko-fi link](https://ko-fi.com/deokishisu), tips are appreciated! ## See also For other pret projects, see [pret.github.io](https://pret.github.io/). ## Discord server for pret You can find pret on [Discord](https://discord.gg/d5dubZ3). This is not the Discord server for this hack. ================================================ FILE: asm/macros/asm.inc ================================================ .ifndef GUARD_ASM_MACROS_ASM_INC .set GUARD_ASM_MACROS_ASM_INC, 1 .macro inc x .set \x, \x + 1 .endm .macro enum_start x=0 .set __enum__, \x .endm .macro enum constant .equiv \constant, __enum__ inc __enum__ .endm .endif @ GUARD_ASM_MACROS_ASM_INC ================================================ FILE: asm/macros/battle_ai_script.inc ================================================ .macro if_random_less_than percent:req, ptr:req .byte 0x00 .byte \percent .4byte \ptr .endm @ unused .macro if_random_greater_than percent:req, ptr:req .byte 0x01 .byte \percent .4byte \ptr .endm @ unused .macro if_random_equal ptr:req .byte 0x02 .4byte \ptr .endm @ unused .macro if_random_not_equal ptr:req .byte 0x03 .4byte \ptr .endm .macro score score:req .byte 0x04 .byte \score .endm .macro if_hp_less_than battler:req, percent:req, ptr:req .byte 0x05 .byte \battler .byte \percent .4byte \ptr .endm .macro if_hp_more_than battler:req, percent:req, ptr:req .byte 0x06 .byte \battler .byte \percent .4byte \ptr .endm .macro if_hp_equal battler:req, percent:req, ptr:req .byte 0x07 .byte \battler .byte \percent .4byte \ptr .endm .macro if_hp_not_equal battler:req, percent:req, ptr:req .byte 0x08 .byte \battler .byte \percent .4byte \ptr .endm .macro if_status battler:req, status:req, ptr:req .byte 0x09 .byte \battler .4byte \status .4byte \ptr .endm .macro if_not_status battler:req, status:req, ptr:req .byte 0x0a .byte \battler .4byte \status .4byte \ptr .endm .macro if_status2 battler:req, status:req, ptr:req .byte 0x0b .byte \battler .4byte \status .4byte \ptr .endm .macro if_not_status2 battler:req, status:req, ptr:req .byte 0x0c .byte \battler .4byte \status .4byte \ptr .endm .macro if_status3 battler:req, status:req, ptr:req .byte 0x0d .byte \battler .4byte \status .4byte \ptr .endm .macro if_not_status3 battler:req, status:req, ptr:req .byte 0x0e .byte \battler .4byte \status .4byte \ptr .endm .macro if_side_affecting battler:req, status:req, ptr:req .byte 0x0f .byte \battler .4byte \status .4byte \ptr .endm .macro if_not_side_affecting battler:req, status:req, ptr:req .byte 0x10 .byte \battler .4byte \status .4byte \ptr .endm .macro if_less_than value:req, ptr:req .byte 0x11 .byte \value .4byte \ptr .endm .macro if_more_than value:req, ptr:req .byte 0x12 .byte \value .4byte \ptr .endm .macro if_equal value:req, ptr:req .byte 0x13 .byte \value .4byte \ptr .endm .macro if_not_equal value:req, ptr:req .byte 0x14 .byte \value .4byte \ptr .endm .macro if_less_than_ptr value:req, ptr:req .byte 0x15 .4byte \value .4byte \ptr .endm .macro if_more_than_ptr value:req, ptr:req .byte 0x16 .4byte \value .4byte \ptr .endm .macro if_equal_ptr value:req, ptr:req .byte 0x17 .4byte \value .4byte \ptr .endm .macro if_not_equal_ptr value:req, ptr:req .byte 0x18 .4byte \value .4byte \ptr .endm .macro if_move move:req, ptr:req .byte 0x19 .2byte \move .4byte \ptr .endm .macro if_not_move move:req, ptr:req .byte 0x1a .2byte \move .4byte \ptr .endm .macro if_in_bytes list:req, ptr:req .byte 0x1b .4byte \list .4byte \ptr .endm .macro if_not_in_bytes list:req, ptr:req .byte 0x1c .4byte \list .4byte \ptr .endm .macro if_in_hwords list:req, ptr:req .byte 0x1d .4byte \list .4byte \ptr .endm .macro if_not_in_hwords list:req, ptr:req .byte 0x1e .4byte \list .4byte \ptr .endm .macro if_user_has_attacking_move ptr:req .byte 0x1f .4byte \ptr .endm .macro if_user_has_no_attacking_moves ptr:req .byte 0x20 .4byte \ptr .endm .macro get_turn_count .byte 0x21 .endm .macro get_type byte:req .byte 0x22 .byte \byte .endm @ unused .macro get_considered_move_power .byte 0x23 .endm .macro get_how_powerful_move_is .byte 0x24 .endm .macro get_last_used_move battler:req .byte 0x25 .byte \battler .endm .macro if_equal_ type:req, ptr:req .byte 0x26 .byte \type .4byte \ptr .endm @ unused .macro if_not_equal_ type:req, ptr:req .byte 0x27 .byte \type .4byte \ptr .endm .macro if_would_go_first battler:req, ptr:req .byte 0x28 .byte \battler .4byte \ptr .endm .macro if_would_not_go_first battler:req, ptr:req .byte 0x29 .byte \battler .4byte \ptr .endm @ nullsub .macro ai_2a .byte 0x2a .endm @ nullsub .macro ai_2b .byte 0x2b .endm .macro count_alive_pokemon battler:req .byte 0x2c .byte \battler .endm @ unused .macro get_considered_move .byte 0x2d .endm .macro get_considered_move_effect .byte 0x2e .endm .macro get_ability battler:req .byte 0x2f .byte \battler .endm @ unused .macro get_highest_type_effectiveness .byte 0x30 .endm .macro if_type_effectiveness effectiveness:req, ptr:req .byte 0x31 .byte \effectiveness .4byte \ptr .endm @ nullsub .macro ai_32 .byte 0x32 .endm @ nullsub .macro ai_33 .byte 0x33 .endm .macro if_status_in_party battler:req, status:req, ptr:req .byte 0x34 .byte \battler .4byte \status .4byte \ptr .endm @ bugged .macro if_status_not_in_party battler:req, status:req, ptr:req .byte 0x35 .byte \battler .4byte \status .4byte \ptr .endm .macro get_weather .byte 0x36 .endm .macro if_effect byte:req, ptr:req .byte 0x37 .byte \byte .4byte \ptr .endm .macro if_not_effect byte:req, ptr:req .byte 0x38 .byte \byte .4byte \ptr .endm .macro if_stat_level_less_than battler:req, stat:req, level:req, ptr:req .byte 0x39 .byte \battler .byte \stat .byte \level .4byte \ptr .endm .macro if_stat_level_more_than battler:req, stat:req, level:req, ptr:req .byte 0x3a .byte \battler .byte \stat .byte \level .4byte \ptr .endm .macro if_stat_level_equal battler:req, stat:req, level:req, ptr:req .byte 0x3b .byte \battler .byte \stat .byte \level .4byte \ptr .endm .macro if_stat_level_not_equal battler:req, stat:req, level:req, ptr:req .byte 0x3c .byte \battler .byte \stat .byte \level .4byte \ptr .endm .macro if_can_faint ptr:req .byte 0x3d .4byte \ptr .endm .macro if_cant_faint ptr:req .byte 0x3e .4byte \ptr .endm @ unused .macro if_has_move battler:req, move:req, ptr:req .byte 0x3f .byte \battler .2byte \move .4byte \ptr .endm @ unused .macro if_doesnt_have_move battler:req, move:req, ptr:req .byte 0x40 .byte \battler .2byte \move .4byte \ptr .endm .macro if_has_move_with_effect battler:req, effect:req, ptr:req .byte 0x41 .byte \battler .byte \effect .4byte \ptr .endm .macro if_doesnt_have_move_with_effect battler:req, effect:req, ptr:req .byte 0x42 .byte \battler .byte \effect .4byte \ptr .endm .macro if_any_move_disabled_or_encored battler:req, byte:req, ptr:req .byte 0x43 .byte \battler .byte \byte .4byte \ptr .endm .macro if_curr_move_disabled_or_encored battler:req, ptr:req .byte 0x44 .byte \battler .4byte \ptr .endm .macro flee .byte 0x45 .endm .macro if_random_safari_flee ptr:req .byte 0x46 .4byte \ptr .endm .macro watch .byte 0x47 .endm .macro get_hold_effect battler:req .byte 0x48 .byte \battler .endm .macro get_gender battler:req .byte 0x49 .byte \battler .endm .macro is_first_turn_for battler:req .byte 0x4a .byte \battler .endm .macro get_stockpile_count battler:req .byte 0x4b .byte \battler .endm .macro is_double_battle .byte 0x4c .endm .macro get_used_held_item battler:req .byte 0x4d .byte \battler .endm .macro get_move_type_from_result .byte 0x4e .endm .macro get_move_power_from_result .byte 0x4f .endm .macro get_move_effect_from_result .byte 0x50 .endm .macro get_protect_count battler:req .byte 0x51 .byte \battler .endm @ nullsub .macro ai_52 .byte 0x52 .endm @ nullsub .macro ai_53 .byte 0x53 .endm @ nullsub .macro ai_54 .byte 0x54 .endm @ nullsub .macro ai_55 .byte 0x55 .endm @ nullsub .macro ai_56 .byte 0x56 .endm @ nullsub .macro ai_57 .byte 0x57 .endm @ unused .macro call ptr:req .byte 0x58 .4byte \ptr .endm .macro goto ptr:req .byte 0x59 .4byte \ptr .endm .macro end .byte 0x5a .endm .macro if_level_cond cond:req, ptr:req .byte 0x5b .byte \cond .4byte \ptr .endm .macro if_user_higher_level ptr:req if_level_cond 0, \ptr .endm .macro if_target_higher_level ptr:req if_level_cond 1, \ptr .endm .macro if_equal_levels ptr:req if_level_cond 2, \ptr .endm @ unused .macro if_target_taunted ptr:req .byte 0x5c .4byte \ptr .endm .macro if_target_not_taunted ptr:req .byte 0x5d .4byte \ptr .endm @ useful script macros .macro get_curr_move_type get_type AI_TYPE_MOVE .endm .macro get_user_type1 get_type AI_TYPE1_USER .endm .macro get_user_type2 get_type AI_TYPE2_USER .endm .macro get_target_type1 get_type AI_TYPE1_TARGET .endm .macro get_target_type2 get_type AI_TYPE2_TARGET .endm .macro if_target_faster ptr:req if_would_go_first 1, \ptr .endm .macro if_user_faster ptr:req if_would_go_first 0, \ptr .endm .macro if_double_battle ptr:req is_double_battle if_equal 1, \ptr .endm .macro if_not_double_battle ptr:req is_double_battle if_equal 0, \ptr .endm .macro if_any_move_disabled battler:req, ptr:req if_any_move_disabled_or_encored \battler, 0, \ptr .endm .macro if_any_move_encored battler:req, ptr:req if_any_move_disabled_or_encored \battler, 1, \ptr .endm ================================================ FILE: asm/macros/battle_anim.inc ================================================ .macro loadsprite id .byte 0x00 .2byte \id .endm .macro unloadsprite id .byte 0x01 .2byte \id .endm .macro sprite template, priority, argv:vararg .byte 0x02 .4byte \template .byte \priority .byte (.Lsprite_\@_2 - .Lsprite_\@_1) / 2 .Lsprite_\@_1: .2byte \argv .Lsprite_\@_2: .endm .macro createtask addr, priority, argv:vararg .byte 0x03 .4byte \addr .byte \priority .byte (.Lcreatetask_\@_2 - .Lcreatetask_\@_1) / 2 .Lcreatetask_\@_1: .2byte \argv .Lcreatetask_\@_2: .endm .macro pause delay .byte 0x04 .byte \delay .endm .macro wait .byte 0x05 .endm .macro hang1 .byte 0x06 .endm .macro hang2 .byte 0x07 .endm .macro end .byte 0x08 .endm .macro playse id .byte 0x09 .2byte \id .endm .macro monbg which .byte 0x0A .byte \which .endm .macro clearmonbg which .byte 0x0B .byte \which .endm .macro setalpha eva, evb .byte 0x0C .2byte ((\evb) << 8) | (\eva) .endm .macro blendoff .byte 0x0D .endm .macro call addr .byte 0x0E .4byte \addr .endm .macro ret .byte 0x0F .endm .macro setvar var_num, value .byte 0x10 .byte \var_num .2byte \value .endm .macro ifelse addr1, addr2 .byte 0x11 .4byte \addr1 .4byte \addr2 .endm .macro jumpif cond, addr .byte 0x12 .byte \cond .4byte \addr .endm .macro jump addr .byte 0x13 .4byte \addr .endm .macro fadetobg id .byte 0x14 .byte \id .endm .macro restorebg .byte 0x15 .endm .macro waitbgfadeout .byte 0x16 .endm .macro waitbgfadein .byte 0x17 .endm .macro changebg id .byte 0x18 .byte \id .endm .macro panse_19 id, pan .byte 0x19 .2byte \id .byte \pan .endm .macro setpan pan .byte 0x1A .byte \pan .endm .macro panse_1B id, pan_start, pan_end, step, delay .byte 0x1B .2byte \id .byte \pan_start .byte \pan_end .byte \step .byte \delay .endm .macro panse_1C id, pan, delay, count .byte 0x1C .2byte \id .byte \pan .byte \delay .byte \count .endm .macro panse_1D id, pan, count .byte 0x1D .2byte \id .byte \pan .byte \count .endm .macro setbldcnt bldcnt .byte 0x1E .2byte \bldcnt .endm .macro createtask_1F addr, argv:vararg .byte 0x1F .4byte \addr .byte (.Lcreatetask_1F_\@_2 - .Lcreatetask_1F_\@_1) / 2 .Lcreatetask_1F_\@_1: .2byte \argv .Lcreatetask_1F_\@_2: .endm .macro waitsound .byte 0x20 .endm .macro jumpvareq var_num, value, addr .byte 0x21 .byte \var_num .2byte \value .4byte \addr .endm .macro monbg_22 unk .byte 0x22 .byte \unk .endm .macro clearmonbg_23 unk .byte 0x23 .byte \unk .endm .macro jumpunkcond addr .byte 0x24 .4byte \addr .endm .macro fadetobg_25 a, b, c .byte 0x25 .byte \a .byte \b .byte \c .endm .macro panse_26 id, pan_start, pan_end, step, delay .byte 0x26 .2byte \id .byte \pan_start .byte \pan_end .byte \step .byte \delay .endm .macro panse_27 id, pan_start, pan_end, step, delay .byte 0x27 .2byte \id .byte \pan_start .byte \pan_end .byte \step .byte \delay .endm .macro monbgprio_28 unk .byte 0x28 .byte \unk .endm .macro monbgprio_29 .byte 0x29 .endm .macro monbgprio_2A unk .byte 0x2A .byte \unk .endm .macro invisible side .byte 0x2B .byte \side .endm .macro visible side .byte 0x2C .byte \side .endm .macro doublebattle_2D unk .byte 0x2D .byte \unk .endm .macro doublebattle_2E unk .byte 0x2E .byte \unk .endm .macro stopsound .byte 0x2F .endm ================================================ FILE: asm/macros/battle_anim_script.inc ================================================ @ commands .macro loadspritegfx tag:req .byte 0x0 .2byte \tag .endm .macro unloadspritegfx tag:req .byte 0x1 .2byte \tag .endm .macro createsprite template:req, anim_battler:req, subpriority_offset:req, argv:vararg .byte 0x02 .4byte \template .if \anim_battler == ANIM_TARGET .byte ANIMSPRITE_IS_TARGET | (\subpriority_offset & 0x7F) .else .byte (\subpriority_offset & 0x7F) .endif .byte (.Lsprite_\@_2 - .Lsprite_\@_1) / 2 .Lsprite_\@_1: .2byte \argv .Lsprite_\@_2: .endm .macro createvisualtask addr:req, priority:req, argv:vararg .byte 0x03 .4byte \addr .byte \priority .byte (.Lcreatetask_\@_2 - .Lcreatetask_\@_1) / 2 .Lcreatetask_\@_1: .2byte \argv .Lcreatetask_\@_2: .endm .macro delay frames:req .byte 0x4 .byte \frames .endm .macro waitforvisualfinish .byte 0x5 .endm .macro nop .byte 0x6 .endm .macro nop2 .byte 0x7 .endm .macro end .byte 0x8 .endm .macro playse se:req .byte 0x9 .2byte \se .endm .macro monbg battler:req .byte 0xa .byte \battler .endm .macro clearmonbg battler:req .byte 0xb .byte \battler .endm .macro setalpha eva:req, evb:req .byte 0x0C .2byte ((\evb) << 8) | (\eva) .endm .macro blendoff .byte 0xd .endm .macro call ptr:req .byte 0xe .4byte \ptr .endm .macro return .byte 0xf .endm .macro setarg argId:req, value:req .byte 0x10 .byte \argId .2byte \value .endm .macro choosetwoturnanim ptr1:req, ptr2:req .byte 0x11 .4byte \ptr1 .4byte \ptr2 .endm .macro jumpifmoveturn value:req, ptr:req .byte 0x12 .byte \value .4byte \ptr .endm .macro goto ptr:req .byte 0x13 .4byte \ptr .endm .macro fadetobg bg:req .byte 0x14 .byte \bg .endm .macro restorebg .byte 0x15 .endm .macro waitbgfadeout .byte 0x16 .endm .macro waitbgfadein .byte 0x17 .endm .macro changebg bg:req .byte 0x18 .byte \bg .endm .macro playsewithpan se:req, pan:req .byte 0x19 .2byte \se .byte \pan .endm .macro setpan pan:req .byte 0x1a .byte \pan .endm .macro panse se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req .byte 0x1b .2byte \se .byte \currentPan .byte \targetPan .byte \incrementPan .byte \delay .endm .macro loopsewithpan se:req, pan:req, wait:req, times:req .byte 0x1c .2byte \se .byte \pan .byte \wait .byte \times .endm .macro waitplaysewithpan se:req, pan:req, wait:req .byte 0x1d .2byte \se .byte \pan .byte \wait .endm .macro setbldcnt bldcnt:req .byte 0x1e .2byte \bldcnt .endm .macro createsoundtask addr:req, argv:vararg .byte 0x1F .4byte \addr .byte (.Lcreatetask_1F_\@_2 - .Lcreatetask_1F_\@_1) / 2 .Lcreatetask_1F_\@_1: .2byte \argv .Lcreatetask_1F_\@_2: .endm .macro waitsound .byte 0x20 .endm .macro jumpargeq argId:req, value:req, ptr:req .byte 0x21 .byte \argId .2byte \value .4byte \ptr .endm .macro monbg_static battler:req .byte 0x22 .byte \battler .endm .macro clearmonbg_static battler:req .byte 0x23 .byte \battler .endm .macro jumpifcontest ptr:req .byte 0x24 .4byte \ptr .endm .macro fadetobgfromset bgOpponent:req, bgPlayer:req, bgContest:req .byte 0x25 .byte \bgOpponent .byte \bgPlayer .byte \bgContest .endm .macro panse_adjustnone se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req .byte 0x26 .2byte \se .byte \currentPan .byte \targetPan .byte \incrementPan .byte \delay .endm .macro panse_adjustall se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req .byte 0x27 .2byte \se .byte \currentPan .byte \targetPan .byte \incrementPan .byte \delay .endm .macro splitbgprio battler:req .byte 0x28 .byte \battler .endm .macro splitbgprio_all .byte 0x29 .endm .macro splitbgprio_foes battler:req .byte 0x2a .byte \battler .endm .macro invisible battler:req .byte 0x2b .byte \battler .endm .macro visible battler:req .byte 0x2c .byte \battler .endm .macro teamattack_moveback battler:req .byte 0x2d .byte \battler .endm .macro teamattack_movefwd battler:req .byte 0x2e .byte \battler .endm .macro stopsound .byte 0x2f .endm @ useful macros .macro jumpreteq value:req, ptr:req jumpargeq ARG_RET_ID, \value, \ptr .endm .macro jumprettrue ptr:req jumpreteq TRUE, \ptr .endm .macro jumpretfalse ptr:req jumpreteq FALSE, \ptr .endm ================================================ FILE: asm/macros/battle_script.inc ================================================ @ commands .macro attackcanceler .byte 0x0 .endm .macro accuracycheck param0:req, param1:req .byte 0x1 .4byte \param0 .2byte \param1 .endm .macro attackstring .byte 0x2 .endm .macro ppreduce .byte 0x3 .endm .macro critcalc .byte 0x4 .endm .macro damagecalc .byte 0x5 .endm .macro typecalc .byte 0x6 .endm .macro adjustnormaldamage .byte 0x7 .endm .macro adjustnormaldamage2 .byte 0x8 .endm .macro attackanimation .byte 0x9 .endm .macro waitanimation .byte 0xa .endm .macro healthbarupdate battler:req .byte 0xb .byte \battler .endm .macro datahpupdate battler:req .byte 0xc .byte \battler .endm .macro critmessage .byte 0xd .endm .macro effectivenesssound .byte 0xe .endm .macro resultmessage .byte 0xf .endm .macro printstring id:req .byte 0x10 .2byte \id .endm .macro printselectionstring id:req .byte 0x11 .2byte \id .endm .macro waitmessage param0:req .byte 0x12 .2byte \param0 .endm .macro printfromtable ptr:req .byte 0x13 .4byte \ptr .endm .macro printselectionstringfromtable ptr:req .byte 0x14 .4byte \ptr .endm .macro seteffectwithchance .byte 0x15 .endm .macro seteffectprimary .byte 0x16 .endm .macro seteffectsecondary .byte 0x17 .endm .macro clearstatusfromeffect battler:req .byte 0x18 .byte \battler .endm .macro tryfaintmon battler:req .byte 0x19 .byte \battler .byte FALSE .4byte NULL .endm .macro tryfaintmon_spikes battler:req, ptr:req .byte 0x19 .byte \battler .byte TRUE .4byte \ptr .endm .macro dofaintanimation battler:req .byte 0x1a .byte \battler .endm .macro cleareffectsonfaint battler:req .byte 0x1b .byte \battler .endm .macro jumpifstatus battler:req, status1:req, ptr:req .byte 0x1c .byte \battler .4byte \status1 .4byte \ptr .endm .macro jumpifstatus2 battler:req, status2:req, ptr:req .byte 0x1d .byte \battler .4byte \status2 .4byte \ptr .endm .macro jumpifability param0:req, ability:req, ptr:req .byte 0x1e .byte \param0 .byte \ability .4byte \ptr .endm .macro jumpifsideaffecting battler:req, sidestatus:req, ptr:req .byte 0x1f .byte \battler .2byte \sidestatus .4byte \ptr .endm .macro jumpifstat battler:req, ifflag:req, stat:req, value:req, ptr .byte 0x20 .byte \battler .byte \ifflag .byte \stat .byte \value .4byte \ptr .endm .macro jumpifstatus3condition battler:req, status3:req, param2:req, ptr:req .byte 0x21 .byte \battler .4byte \status3 .byte \param2 .4byte \ptr .endm .macro jumpiftype battler:req, type:req, ptr:req .byte 0x22 .byte \battler .byte \type .4byte \ptr .endm .macro getexp battler:req .byte 0x23 .byte \battler .endm .macro checkteamslost ptr:req .byte 0x24 .4byte \ptr .endm .macro movevaluescleanup .byte 0x25 .endm .macro setmultihit value:req .byte 0x26 .byte \value .endm .macro decrementmultihit value:req .byte 0x27 .4byte \value .endm .macro goto ptr:req .byte 0x28 .4byte \ptr .endm .macro jumpifbyte ifflag:req, param1:req, param2:req, param3:req .byte 0x29 .byte \ifflag .4byte \param1 .byte \param2 .4byte \param3 .endm .macro jumpifhalfword ifflag:req, param1:req, param2:req, param3:req .byte 0x2a .byte \ifflag .4byte \param1 .2byte \param2 .4byte \param3 .endm .macro jumpifword ifflag:req, param1:req, param2:req, param3:req .byte 0x2b .byte \ifflag .4byte \param1 .4byte \param2 .4byte \param3 .endm .macro jumpifarrayequal param0:req, param1:req, param2:req, param3:req .byte 0x2c .4byte \param0 .4byte \param1 .byte \param2 .4byte \param3 .endm .macro jumpifarraynotequal param0:req, param1:req, param2:req, param3:req .byte 0x2d .4byte \param0 .4byte \param1 .byte \param2 .4byte \param3 .endm .macro setbyte ptr:req, param1:req .byte 0x2e .4byte \ptr .byte \param1 .endm .macro addbyte ptr:req, param1:req .byte 0x2f .4byte \ptr .byte \param1 .endm .macro subbyte ptr:req, param1:req .byte 0x30 .4byte \ptr .byte \param1 .endm .macro copyarray param0:req, param1:req, param2:req .byte 0x31 .4byte \param0 .4byte \param1 .byte \param2 .endm .macro copyarraywithindex param0:req, param1:req, param2:req, param3:req .byte 0x32 .4byte \param0 .4byte \param1 .4byte \param2 .byte \param3 .endm .macro orbyte ptr:req, param1:req .byte 0x33 .4byte \ptr .byte \param1 .endm .macro orhalfword ptr:req, param1:req .byte 0x34 .4byte \ptr .2byte \param1 .endm .macro orword ptr:req, param1:req .byte 0x35 .4byte \ptr .4byte \param1 .endm .macro bicbyte ptr:req, param1:req .byte 0x36 .4byte \ptr .byte \param1 .endm .macro bichalfword ptr:req, param1:req .byte 0x37 .4byte \ptr .2byte \param1 .endm .macro bicword ptr:req, param1:req .byte 0x38 .4byte \ptr .4byte \param1 .endm .macro pause param0:req .byte 0x39 .2byte \param0 .endm .macro waitstate .byte 0x3a .endm .macro healthbar_update battler:req .byte 0x3b .byte \battler .endm .macro return .byte 0x3c .endm .macro end .byte 0x3d .endm .macro end2 .byte 0x3e .endm .macro end3 .byte 0x3f .endm .macro jumpifaffectedbyprotect ptr:req .byte 0x40 .4byte \ptr .endm .macro call ptr:req .byte 0x41 .4byte \ptr .endm .macro jumpiftype2 battler:req, type:req, ptr:req .byte 0x42 .byte \battler .byte \type .4byte \ptr .endm .macro jumpifabilitypresent ability:req, ptr:req .byte 0x43 .byte \ability .4byte \ptr .endm .macro endselectionscript .byte 0x44 .endm .macro playanimation battler:req, animType:req, arg=NULL .byte 0x45 .byte \battler .byte \animType .4byte \arg .endm .macro playanimation_var battler:req, animType:req, arg=NULL .byte 0x46 .byte \battler .4byte \animType .4byte \arg .endm .macro setgraphicalstatchangevalues .byte 0x47 .endm .macro playstatchangeanimation battler:req, param1:req, param2:req .byte 0x48 .byte \battler .byte \param1 .byte \param2 .endm .macro moveend param0:req, param1:req .byte 0x49 .byte \param0 .byte \param1 .endm @ Help macros for 5 uses of moveend command @ All cases .macro moveendall setbyte sMOVEEND_STATE, 0 moveend 0, 0 .endm @ Chosen case .macro moveendcase case:req setbyte sMOVEEND_STATE, \case moveend 1, 0 .endm @ All cases from (inclusive) .macro moveendfrom from:req setbyte sMOVEEND_STATE, \from moveend 0, 0 .endm @ All cases from 0 to (not inclusive) .macro moveendto to:req setbyte sMOVEEND_STATE, 0 moveend 2, \to .endm @ Cases from (inclusive) to (not inclusive) .macro moveendfromto from:req, to:req setbyte sMOVEEND_STATE, \from moveend 2, \to .endm .macro typecalc2 .byte 0x4a .endm .macro returnatktoball .byte 0x4b .endm .macro getswitchedmondata battler:req .byte 0x4c .byte \battler .endm .macro switchindataupdate battler:req .byte 0x4d .byte \battler .endm .macro switchinanim battler:req, dontclearsubstitutebit:req .byte 0x4e .byte \battler .byte \dontclearsubstitutebit .endm .macro jumpifcantswitch battler:req, ptr:req .byte 0x4f .byte \battler .4byte \ptr .endm .macro openpartyscreen param0:req, param1:req .byte 0x50 .byte \param0 .4byte \param1 .endm .macro switchhandleorder battler:req, param1:req .byte 0x51 .byte \battler .byte \param1 .endm .macro switchineffects battler:req .byte 0x52 .byte \battler .endm .macro trainerslidein battler:req .byte 0x53 .byte \battler .endm .macro playse song:req .byte 0x54 .2byte \song .endm .macro fanfare song:req .byte 0x55 .2byte \song .endm .macro playfaintcry battler:req .byte 0x56 .byte \battler .endm .macro endlinkbattle .byte 0x57 .endm .macro returntoball battler:req .byte 0x58 .byte \battler .endm .macro handlelearnnewmove param0:req, param1:req, param2:req .byte 0x59 .4byte \param0 .4byte \param1 .byte \param2 .endm .macro yesnoboxlearnmove param0:req .byte 0x5a .4byte \param0 .endm .macro yesnoboxstoplearningmove param0:req .byte 0x5b .4byte \param0 .endm .macro hitanimation battler:req .byte 0x5c .byte \battler .endm .macro getmoneyreward addr .byte 0x5d .4byte \addr .endm .macro updatebattlermoves battler:req .byte 0x5e .byte \battler .endm .macro swapattackerwithtarget .byte 0x5f .endm .macro incrementgamestat param0:req .byte 0x60 .byte \param0 .endm .macro drawpartystatussummary battler:req .byte 0x61 .byte \battler .endm .macro hidepartystatussummary battler:req .byte 0x62 .byte \battler .endm .macro jumptocalledmove param0:req .byte 0x63 .byte \param0 .endm .macro statusanimation battler:req .byte 0x64 .byte \battler .endm .macro status2animation battler:req, status2:req .byte 0x65 .byte \battler .4byte \status2 .endm .macro chosenstatusanimation battler:req, param1:req, param2:req .byte 0x66 .byte \battler .byte \param1 .4byte \param2 .endm .macro yesnobox .byte 0x67 .endm .macro cancelallactions .byte 0x68 .endm .macro adjustsetdamage .byte 0x69 .endm .macro removeitem battler:req .byte 0x6a .byte \battler .endm .macro atknameinbuff1 .byte 0x6b .endm .macro drawlvlupbox .byte 0x6c .endm .macro resetsentmonsvalue .byte 0x6d .endm .macro setatktoplayer0 .byte 0x6e .endm .macro makevisible battler:req .byte 0x6f .byte \battler .endm .macro recordlastability battler:req .byte 0x70 .byte \battler .endm .macro buffermovetolearn .byte 0x71 .endm .macro jumpifplayerran ptr:req .byte 0x72 .4byte \ptr .endm .macro hpthresholds battler:req .byte 0x73 .byte \battler .endm .macro hpthresholds2 battler:req .byte 0x74 .byte \battler .endm .macro useitemonopponent .byte 0x75 .endm .macro various battler:req, param1:req .byte 0x76 .byte \battler .byte \param1 .endm .macro setprotectlike .byte 0x77 .endm .macro tryexplosion .byte 0x78 .endm .macro setatkhptozero .byte 0x79 .endm .macro jumpifnexttargetvalid ptr:req .byte 0x7a .4byte \ptr .endm .macro tryhealhalfhealth param0:req, battler:req .byte 0x7b .4byte \param0 .byte \battler .endm .macro trymirrormove .byte 0x7c .endm .macro setrain .byte 0x7d .endm .macro setreflect .byte 0x7e .endm .macro setseeded .byte 0x7f .endm .macro manipulatedamage param0:req .byte 0x80 .byte \param0 .endm .macro trysetrest param0:req .byte 0x81 .4byte \param0 .endm .macro jumpifnotfirstturn ptr:req .byte 0x82 .4byte \ptr .endm .macro nop .byte 0x83 .endm .macro jumpifcantmakeasleep param0:req .byte 0x84 .4byte \param0 .endm .macro stockpile .byte 0x85 .endm .macro stockpiletobasedamage param0:req .byte 0x86 .4byte \param0 .endm .macro stockpiletohpheal param0:req .byte 0x87 .4byte \param0 .endm .macro negativedamage .byte 0x88 .endm .macro statbuffchange param0:req, param1:req .byte 0x89 .byte \param0 .4byte \param1 .endm .macro normalisebuffs .byte 0x8a .endm .macro setbide .byte 0x8b .endm .macro confuseifrepeatingattackends .byte 0x8c .endm .macro setmultihitcounter param0:req .byte 0x8d .byte \param0 .endm .macro initmultihitstring .byte 0x8e .endm .macro forcerandomswitch param0:req .byte 0x8f .4byte \param0 .endm .macro tryconversiontypechange param0:req .byte 0x90 .4byte \param0 .endm .macro givepaydaymoney .byte 0x91 .endm .macro setlightscreen .byte 0x92 .endm .macro tryKO param0:req .byte 0x93 .4byte \param0 .endm .macro damagetohalftargethp .byte 0x94 .endm .macro setsandstorm .byte 0x95 .endm .macro weatherdamage .byte 0x96 .endm .macro tryinfatuating param0:req .byte 0x97 .4byte \param0 .endm .macro updatestatusicon battler:req .byte 0x98 .byte \battler .endm .macro setmist .byte 0x99 .endm .macro setfocusenergy .byte 0x9a .endm .macro transformdataexecution .byte 0x9b .endm .macro setsubstitute .byte 0x9c .endm .macro mimicattackcopy param0:req .byte 0x9d .4byte \param0 .endm .macro metronome .byte 0x9e .endm .macro dmgtolevel .byte 0x9f .endm .macro psywavedamageeffect .byte 0xa0 .endm .macro counterdamagecalculator param0:req .byte 0xa1 .4byte \param0 .endm .macro mirrorcoatdamagecalculator param0:req .byte 0xa2 .4byte \param0 .endm .macro disablelastusedattack param0:req .byte 0xa3 .4byte \param0 .endm .macro trysetencore param0:req .byte 0xa4 .4byte \param0 .endm .macro painsplitdmgcalc param0:req .byte 0xa5 .4byte \param0 .endm .macro settypetorandomresistance param0:req .byte 0xa6 .4byte \param0 .endm .macro setalwayshitflag .byte 0xa7 .endm .macro copymovepermanently param0:req .byte 0xa8 .4byte \param0 .endm .macro trychoosesleeptalkmove param0:req .byte 0xa9 .4byte \param0 .endm .macro setdestinybond .byte 0xaa .endm .macro trysetdestinybondtohappen .byte 0xab .endm .macro remaininghptopower .byte 0xac .endm .macro tryspiteppreduce param0:req .byte 0xad .4byte \param0 .endm .macro healpartystatus .byte 0xae .endm .macro cursetarget param0:req .byte 0xaf .4byte \param0 .endm .macro trysetspikes param0:req .byte 0xb0 .4byte \param0 .endm .macro setforesight .byte 0xb1 .endm .macro trysetperishsong param0:req .byte 0xb2 .4byte \param0 .endm .macro rolloutdamagecalculation .byte 0xb3 .endm .macro jumpifconfusedandstatmaxed stat:req, ptr:req .byte 0xb4 .byte \stat .4byte \ptr .endm .macro furycuttercalc .byte 0xb5 .endm .macro friendshiptodamagecalculation .byte 0xb6 .endm .macro presentdamagecalculation .byte 0xb7 .endm .macro setsafeguard .byte 0xb8 .endm .macro magnitudedamagecalculation .byte 0xb9 .endm .macro jumpifnopursuitswitchdmg param0:req .byte 0xba .4byte \param0 .endm .macro setsunny .byte 0xbb .endm .macro maxattackhalvehp param0:req .byte 0xbc .4byte \param0 .endm .macro copyfoestats param0:req .byte 0xbd .4byte \param0 .endm .macro rapidspinfree .byte 0xbe .endm .macro setdefensecurlbit .byte 0xbf .endm .macro recoverbasedonsunlight param0:req .byte 0xc0 .4byte \param0 .endm .macro hiddenpowercalc .byte 0xc1 .endm .macro selectfirstvalidtarget .byte 0xc2 .endm .macro trysetfutureattack param0:req .byte 0xc3 .4byte \param0 .endm .macro trydobeatup param0:req, param1:req .byte 0xc4 .4byte \param0 .4byte \param1 .endm .macro setsemiinvulnerablebit .byte 0xc5 .endm .macro clearsemiinvulnerablebit .byte 0xc6 .endm .macro setminimize .byte 0xc7 .endm .macro sethail .byte 0xc8 .endm .macro trymemento ptr:req .byte 0xc9 .4byte \ptr .endm .macro setforcedtarget .byte 0xca .endm .macro setcharge .byte 0xcb .endm .macro callterrainattack .byte 0xcc .endm .macro cureifburnedparalysedorpoisoned param0:req .byte 0xcd .4byte \param0 .endm .macro settorment param0:req .byte 0xce .4byte \param0 .endm .macro jumpifnodamage param0:req .byte 0xcf .4byte \param0 .endm .macro settaunt param0:req .byte 0xd0 .4byte \param0 .endm .macro trysethelpinghand param0:req .byte 0xd1 .4byte \param0 .endm .macro tryswapitems param0:req .byte 0xd2 .4byte \param0 .endm .macro trycopyability param0:req .byte 0xd3 .4byte \param0 .endm .macro trywish param0:req, param1:req .byte 0xd4 .byte \param0 .4byte \param1 .endm .macro trysetroots param0:req .byte 0xd5 .4byte \param0 .endm .macro doubledamagedealtifdamaged .byte 0xd6 .endm .macro setyawn param0:req .byte 0xd7 .4byte \param0 .endm .macro setdamagetohealthdifference param0:req .byte 0xd8 .4byte \param0 .endm .macro scaledamagebyhealthratio .byte 0xd9 .endm .macro tryswapabilities param0:req .byte 0xda .4byte \param0 .endm .macro tryimprison param0:req .byte 0xdb .4byte \param0 .endm .macro trysetgrudge param0:req .byte 0xdc .4byte \param0 .endm .macro weightdamagecalculation .byte 0xdd .endm .macro assistattackselect param0:req .byte 0xde .4byte \param0 .endm .macro trysetmagiccoat param0:req .byte 0xdf .4byte \param0 .endm .macro trysetsnatch param0:req .byte 0xe0 .4byte \param0 .endm .macro trygetintimidatetarget param0:req .byte 0xe1 .4byte \param0 .endm .macro switchoutabilities battler:req .byte 0xe2 .byte \battler .endm .macro jumpifhasnohp battler:req, param1:req .byte 0xe3 .byte \battler .4byte \param1 .endm .macro getsecretpowereffect .byte 0xe4 .endm .macro pickup .byte 0xe5 .endm .macro docastformchangeanimation .byte 0xe6 .endm .macro trycastformdatachange .byte 0xe7 .endm .macro settypebasedhalvers param0:req .byte 0xe8 .4byte \param0 .endm .macro setweatherballtype .byte 0xe9 .endm .macro tryrecycleitem param0:req .byte 0xea .4byte \param0 .endm .macro settypetoterrain param0:req .byte 0xeb .4byte \param0 .endm .macro pursuitrelated param0:req .byte 0xec .4byte \param0 .endm .macro snatchsetbattlers .byte 0xed .endm .macro removelightscreenreflect .byte 0xee .endm .macro handleballthrow .byte 0xef .endm .macro givecaughtmon .byte 0xf0 .endm .macro trysetcaughtmondexflags param0:req .byte 0xf1 .4byte \param0 .endm .macro displaydexinfo .byte 0xf2 .endm .macro trygivecaughtmonnick param0:req .byte 0xf3 .4byte \param0 .endm .macro subattackerhpbydmg .byte 0xf4 .endm .macro removeattackerstatus1 .byte 0xf5 .endm .macro finishaction .byte 0xf6 .endm .macro finishturn .byte 0xf7 .endm @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES .endm .macro setmagiccoattarget battler:req various \battler, VARIOUS_SET_MAGIC_COAT_TARGET .endm .macro getifcantrunfrombattle battler:req various \battler, VARIOUS_IS_RUNNING_IMPOSSIBLE .endm .macro getmovetarget battler:req various \battler, VARIOUS_GET_MOVE_TARGET .endm .macro getbattlerfainted battler:req various \battler, VARIOUS_GET_BATTLER_FAINTED .endm .macro resetintimidatetracebits battler:req various \battler, VARIOUS_RESET_INTIMIDATE_TRACE_BITS .endm .macro updatechoicemoveonlvlup battler:req various \battler, VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP .endm .macro resetplayerfainted various BS_ATTACKER, VARIOUS_RESET_PLAYER_FAINTED .endm .macro getbattlersforrecall various BS_ATTACKER, VARIOUS_GET_BATTLERS_FOR_RECALL .endm .macro returnopponentmon1toball various BS_ATTACKER, VARIOUS_RETURN_OPPONENT_MON1 .endm .macro returnopponentmon2toball various BS_ATTACKER, VARIOUS_RETURN_OPPONENT_MON2 .endm .macro checkpokeflute battler:req various \battler, VARIOUS_CHECK_POKEFLUTE .endm .macro waitfanfare battler:req various \battler, VARIOUS_WAIT_FANFARE .endm @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 .endm .macro setmoveeffect effect:req setbyte cEFFECT_CHOOSER, \effect .endm .macro chosenstatus1animation battler:req, status:req chosenstatusanimation \battler, 0x0, \status .endm .macro chosenstatus2animation battler:req, status:req chosenstatusanimation \battler, 0x1, \status .endm .macro sethword dst:req, value:req setbyte \dst, (\value) & 0xFF setbyte \dst + 1, ((\value) >> 8) & 0xFF .endm .macro setword dst:req, value:req setbyte \dst, (\value) & 0xFF setbyte \dst + 1, ((\value) >> 8) & 0xFF setbyte \dst + 2, ((\value) >> 16) & 0xFF setbyte \dst + 3, ((\value) >> 24) & 0xFF .endm .macro copybyte dst:req, src:req copyarray \dst, \src, 0x1 .endm .macro copyhword dst:req, src:req copyarray \dst, \src, 0x2 .endm .macro copyword dst:req, src:req copyarray \dst, \src, 0x4 .endm .macro jumpifbytenotequal byte1:req, byte2:req, jumpptr:req jumpifarraynotequal \byte1, \byte2, 0x1, \jumpptr .endm .macro jumpifbyteequal byte1:req, byte2:req, jumpptr:req jumpifarrayequal \byte1, \byte2, 0x1, \jumpptr .endm .macro jumpifmove move:req, jumpptr:req jumpifhalfword CMP_EQUAL, gCurrentMove, \move, \jumpptr .endm .macro jumpifnotmove move:req, jumpptr:req jumpifhalfword CMP_NOT_EQUAL, gCurrentMove, \move, \jumpptr .endm .macro jumpifstatus3 battler:req, status:req, jumpptr:req jumpifstatus3condition \battler, \status, 0x0, \jumpptr .endm .macro jumpifnostatus3 battler:req, status:req, jumpptr:req jumpifstatus3condition \battler, \status, 0x1, \jumpptr .endm .macro jumpifmovehadnoeffect jumpptr:req jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_NO_EFFECT, \jumpptr .endm .macro jumpifbattletype flags:req, jumpptr:req jumpifword CMP_COMMON_BITS, gBattleTypeFlags, \flags, \jumpptr .endm .macro jumpifnotbattletype flags:req, jumpptr:req jumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, \flags, \jumpptr .endm ================================================ FILE: asm/macros/contest_ai_script.inc ================================================ @ Add a positive/negative value to the score of the move being evaluated. .macro score score .byte 0x00 .byte \score .endm @ turn (AKA "Appeal No.") .macro get_turn .byte 0x01 .endm .macro if_turn_less_than param, addr .byte 0x02 .byte \param .4byte \addr .endm .macro if_turn_more_than param, addr .byte 0x03 .byte \param .4byte \addr .endm .macro if_turn_eq param, addr .byte 0x04 .byte \param .4byte \addr .endm .macro if_turn_not_eq param, addr .byte 0x05 .byte \param .4byte \addr .endm @ audience excitement .macro get_excitement .byte 0x06 .endm .macro if_excitement_less_than param, addr .byte 0x07 .byte \param .4byte \addr .endm .macro if_excitement_more_than param, addr .byte 0x08 .byte \param .4byte \addr .endm .macro if_excitement_eq param, addr .byte 0x09 .byte \param .4byte \addr .endm .macro if_excitement_not_eq param, addr .byte 0x0A .byte \param .4byte \addr .endm @ the order that the user goes in the current turn .macro get_user_order .byte 0x0B .endm .macro if_user_order_less_than param addr .byte 0x0C .byte \param .4byte \addr .endm .macro if_user_order_more_than param addr .byte 0x0D .byte \param .4byte \addr .endm .macro if_user_order_eq param addr .byte 0x0E .byte \param .4byte \addr .endm .macro if_user_order_not_eq param addr .byte 0x0F .byte \param .4byte \addr .endm @ user condition .macro get_user_condition .byte 0x10 .endm .macro if_user_condition_less_than param, addr .byte 0x11 .byte \param .4byte \addr .endm .macro if_user_condition_more_than param, addr .byte 0x12 .byte \param .4byte \addr .endm .macro if_user_condition_eq param, addr .byte 0x13 .byte \param .4byte \addr .endm .macro if_user_condition_not_eq param, addr .byte 0x14 .byte \param .4byte \addr .endm @ 15 @ 16 @ 17 @ 18 @ 19 @ 1A @ 1B @ 1C @ 1D @ 1E @ contest type .macro get_contest_type .byte 0x1F .endm .macro if_contest_type_eq param, addr .byte 0x20 .byte \param .4byte \addr .endm .macro if_contest_type_not_eq param, addr .byte 0x21 .byte \param .4byte \addr .endm @ move excitement (change in excitement due to move) .macro get_move_excitement .byte 0x22 .endm .macro if_move_excitement_less_than param, addr .byte 0x23 .byte \param .4byte \addr .endm .macro if_move_excitement_more_than param, addr .byte 0x24 .byte \param .4byte \addr .endm .macro if_move_excitement_eq param, addr .byte 0x25 .byte \param .4byte \addr .endm .macro if_move_excitement_not_eq param, addr .byte 0x26 .byte \param .4byte \addr .endm @ move effect .macro get_effect .byte 0x27 .endm .macro if_effect_eq param, addr .byte 0x28 .byte \param .4byte \addr .endm .macro if_effect_not_eq param, addr .byte 0x29 .byte \param .4byte \addr .endm @ move effect type .macro get_effect_type .byte 0x2A .endm .macro if_effect_type_eq param, addr .byte 0x2B .byte \param .4byte \addr .endm .macro if_effect_type_not_eq param, addr .byte 0x2C .byte \param .4byte \addr .endm @ whether the current move is the most appealing in the user's moveset .macro check_most_appealing_move .byte 0x2D .endm .macro if_most_appealing_move addr .byte 0x2E .4byte \addr .endm @ 2F @ 30 @ 31 @ 32 @ 33 @ 34 @ 35 @ 36 @ 37 @ 38 @ 39 @ 3A @ number of times current move has been used .macro get_move_used_count .byte 0x3B .endm .macro if_move_used_count_less_than param, addr .byte 0x3C .byte \param .4byte \addr .endm .macro if_move_used_count_more_than param, addr .byte 0x3D .byte \param .4byte \addr .endm .macro if_move_used_count_eq param, addr .byte 0x3E .byte \param .4byte \addr .endm .macro if_move_used_count_not_eq param, addr .byte 0x3F .byte \param .4byte \addr .endm @ whether the current move is a combo starter (with another move in the moveset) .macro check_combo_starter .byte 0x40 .endm .macro if_combo_starter addr .byte 0x41 .4byte \addr .endm .macro if_not_combo_starter addr .byte 0x42 .4byte \addr .endm @ whether the current move is a combo finisher (with another move in the moveset) .macro check_combo_finisher .byte 0x43 .endm .macro if_combo_finisher addr .byte 0x44 .4byte \addr .endm .macro if_not_combo_finisher addr .byte 0x45 .4byte \addr .endm @ whether the current move would finish a combo .macro check_would_finish_combo .byte 0x46 .endm .macro if_would_finish_combo addr .byte 0x47 .4byte \addr .endm .macro if_would_not_finish_combo addr .byte 0x48 .4byte \addr .endm @ condition of mon (indexed by order) .macro get_condition mon .byte 0x49 .byte \mon .endm .macro if_condition_less_than mon, value, addr .byte 0x4A .byte \mon .byte \value .4byte \addr .endm .macro if_condition_more_than mon, value, addr .byte 0x4B .byte \mon .byte \value .4byte \addr .endm .macro if_condition_eq mon, value, addr .byte 0x4C .byte \mon .byte \value .4byte \addr .endm .macro if_condition_not_eq mon, value, addr .byte 0x4D .byte \mon .byte \value .4byte \addr .endm @ whether the mon used a combo starter move @ Even though this value is always 1 or 0 (i.e. TRUE/FALSE), @ there are less-than and greater-than comparison operations for some reason. .macro get_used_combo_starter mon .byte 0x4E .byte \mon .endm .macro if_used_combo_starter_less_than mon, value, addr .byte 0x4F .byte \mon .byte \value .4byte \addr .endm .macro if_used_combo_starter_more_than mon, value, addr .byte 0x50 .byte \mon .byte \value .4byte \addr .endm .macro if_used_combo_starter_eq mon, value, addr .byte 0x51 .byte \mon .byte \value .4byte \addr .endm .macro if_used_combo_starter_not_eq mon, value, addr .byte 0x52 .byte \mon .byte \value .4byte \addr .endm @ whether the mon can make an appeal .macro check_can_participate mon .byte 0x53 .byte \mon .endm .macro if_can_participate mon, addr .byte 0x54 .byte \mon .4byte \addr .endm .macro if_cannot_participate mon, addr .byte 0x55 .byte \mon .4byte \addr .endm @ 56 @ 57 .macro contest_58 param addr .byte 0x58 .byte \param .4byte \addr .endm @ 59 @ 5A @ 5B @ 5C @ 5D @ 5E @ 5F @ 60 @ 61 @ 62 @ 63 @ 64 @ 65 @ 66 @ 67 @ 68 @ 69 @ 6A @ 6B @ 6C @ 6D @ 6E @ 6F @ 70 @ 71 @ 72 @ 73 @ 74 @ 75 @ 76 @ 77 @ 78 @ 79 @ 7A @ 7B @ 7C .macro if_random param addr .byte 0x7D .byte \param .4byte \addr .endm @ 7E .macro jump addr .byte 0x7F .4byte \addr .endm .macro call addr .byte 0x80 .4byte \addr .endm .macro end .byte 0x81 .endm .macro check_user_has_exciting_move .byte 0x82 .endm .macro if_user_has_exciting_move addr .byte 0x83 .4byte \addr .endm .macro if_user_doesnt_have_exciting_move addr .byte 0x84 .4byte \addr .endm @ 85 @ 86 .macro if_effect_in_user_moveset param addr .byte 0x87 .2byte \param .4byte \addr .endm ================================================ FILE: asm/macros/ec.inc ================================================ .macro ec_duplicates count .2byte 0xff00 + \count .endm .macro ec_words_by_letter label .2byte (gEasyChatWordsByLetter_\label - gEasyChatWordsAlphabetized) / 2 .endm ================================================ FILE: asm/macros/event.inc ================================================ @ Does nothing. .macro nop .byte 0x00 .endm @ Does nothing. .macro nop1 .byte 0x01 .endm @ Terminates script execution. .macro end .byte 0x02 .endm @ Jumps back to after the last-executed call statement, and continues script execution from there. .macro return .byte 0x03 .endm @ Jumps to destination and continues script execution from there. The location of the calling script is remembered and can be returned to later. .macro call destination:req .byte 0x04 .4byte \destination .endm @ Jumps to destination and continues script execution from there. .macro goto destination:req .byte 0x05 .4byte \destination .endm @ If the result of the last comparison matches condition (see Comparison operators), jumps to destination and continues script execution from there. .macro goto_if condition:req, destination:req .byte 0x06 .byte \condition .4byte \destination .endm @ If the result of the last comparison matches condition (see Comparison operators), calls destination. .macro call_if condition:req, destination:req .byte 0x07 .byte \condition .4byte \destination .endm @ Jumps to the script in gStdScripts at index function. .macro gotostd function:req .byte 0x08 .byte \function .endm @ Callstd ids STD_OBTAIN_ITEM = 0 STD_FIND_ITEM = 1 MSGBOX_NPC = 2 MSGBOX_SIGN = 3 MSGBOX_DEFAULT = 4 MSGBOX_YESNO = 5 MSGBOX_AUTOCLOSE = 6 STD_OBTAIN_DECORATION = 7 STD_PUT_ITEM_AWAY = 8 STD_RECEIVED_ITEM = 9 @ Calls the script in gStdScripts at index function. .macro callstd function:req .byte 0x09 .byte \function .endm @ If the result of the last comparison matches condition (see Comparison operators), jumps to the script in gStdScripts at index function. .macro gotostd_if condition:req, function:req .byte 0x0a .byte \condition .byte \function .endm @ If the result of the last comparison matches condition (see Comparison operators), calls the script in gStdScripts at index function. .macro callstd_if condition:req, function:req .byte 0x0b .byte \condition .byte \function .endm @ Equivalent to the 'return' command for a RAM script. .macro returnram .byte 0x0c .endm @ Equivalent to the 'end' command for a RAM script. .macro endram .byte 0x0d .endm @ Sets the Mystery Event script status (MEVENT_STATUS_*). .macro setmysteryeventstatus value:req .byte 0x0e .byte \value .endm @ Sets the value at the specified script data index to a fixed 4-byte value. .macro loadword destIndex:req, value:req .byte 0x0f .byte \destIndex .4byte \value .endm @ Sets the value at the specified script data index to a fixed byte value. .macro loadbyte destIndex:req, value:req .byte 0x10 .byte \destIndex .byte \value .endm @ Sets the value at the specified pointer. .macro setptr value:req, ptr:req .byte 0x11 .byte \value .4byte \ptr .endm @ Sets the value at the specified script data index to the value at pointer 'source'. .macro loadbytefromptr destIndex:req, source:req .byte 0x12 .byte \destIndex .4byte \source .endm @ Sets the value at pointer 'destination' to the contents of the script data at 'srcIndex'. .macro setptrbyte srcIndex:req, destination:req .byte 0x13 .byte \srcIndex .4byte \destination .endm @ Copies the contents of the script data from one index to another. .macro copylocal destIndex:req, srcIndex:req .byte 0x14 .byte \destIndex .byte \srcIndex .endm @ Copies the byte at source to destination, replacing whatever byte was previously there. .macro copybyte destination:req, source:req .byte 0x15 .4byte \destination .4byte \source .endm @ Changes the value of destination to value. .macro setvar destination:req, value:req .byte 0x16 .2byte \destination .2byte \value .endm @ Changes the value of destination by adding value to it. Overflow is not prevented (0xFFFF + 1 = 0x0000). .macro addvar destination:req, value:req .byte 0x17 .2byte \destination .2byte \value .endm @ Changes the value of destination by subtracting value to it. Overflow is not prevented (0x0000 - 1 = 0xFFFF). .macro subvar destination:req, value:req .byte 0x18 .2byte \destination .2byte \value .endm @ Copies the value of source into destination. .macro copyvar destination:req, source:req .byte 0x19 .2byte \destination .2byte \source .endm @ If source is not a variable, then this function acts like setvar. Otherwise, it acts like copyvar. .macro setorcopyvar destination:req, source:req .byte 0x1a .2byte \destination .2byte \source .endm @ Compares the values of the script data at indexes 'local1' and 'local2'. @ The result is stored in comparisonResult to be acted on by goto_if / call_if .macro compare_local_to_local local1:req, local2:req .byte 0x1b .byte \local1 .byte \local2 .endm @ Compares the value of the script data at index 'local' to a fixed value. @ The result is stored in comparisonResult to be acted on by goto_if / call_if .macro compare_local_to_value local:req, value:req .byte 0x1c .byte \local .byte \value .endm @ Compares the value of the script data at index 'local' to the value at 'ptr' @ The result is stored in comparisonResult to be acted on by goto_if / call_if .macro compare_local_to_ptr local:req, ptr:req .byte 0x1d .byte \local .4byte \ptr .endm @ Compares the value at 'ptr' to the value of the script data at index 'local'. @ The result is stored in comparisonResult to be acted on by goto_if / call_if .macro compare_ptr_to_local ptr:req, local:req .byte 0x1e .4byte \ptr .byte \local .endm @ Compares the value at 'ptr' to a fixed value. @ The result is stored in comparisonResult to be acted on by goto_if / call_if .macro compare_ptr_to_value ptr:req, value:req .byte 0x1f .4byte \ptr .byte \value .endm @ Compares the value at 'ptr1' to the value at 'ptr2'. @ The result is stored in comparisonResult to be acted on by goto_if / call_if .macro compare_ptr_to_ptr ptr1:req, ptr2:req .byte 0x20 .4byte \ptr1 .4byte \ptr2 .endm @ Compares the value of 'var' to a fixed value. @ The result is stored in comparisonResult to be acted on by goto_if / call_if .macro compare_var_to_value var:req, value:req .byte 0x21 .2byte \var .2byte \value .endm @ Compares the value of 'var1' to the value of 'var2'. @ The result is stored in comparisonResult to be acted on by goto_if / call_if .macro compare_var_to_var var1:req, var2:req .byte 0x22 .2byte \var1 .2byte \var2 .endm @ Generic compare macro which attempts to deduce argument types based on their values @ Any values between VARS_START to VARS_END and SPECIAL_VARS_START to SPECIAL_VARS_END are considered event variable identifiers .macro compare var:req, arg:req .if ((\arg >= VARS_START && \arg <= VARS_END) || (\arg >= SPECIAL_VARS_START && \arg <= SPECIAL_VARS_END)) compare_var_to_var \var, \arg .else compare_var_to_value \var, \arg .endif .endm @ Calls the native C function stored at func. .macro callnative func:req .byte 0x23 .4byte \func .endm @ Replaces the script with the function stored at func. Execution returns to the bytecode script when func returns TRUE. .macro gotonative func:req .byte 0x24 .4byte \func .endm @ Calls a function listed in the table in data/specials.inc. .macro special function:req .byte 0x25 .2byte SPECIAL_\function .endm @ Calls a function listed in the table in data/specials.inc. @ That function's output (if any) will be written to the variable specified by 'output'. .macro specialvar output:req, function:req .byte 0x26 .2byte \output .2byte SPECIAL_\function .endm @ Blocks script execution until a command or C code manually unblocks it. Generally used with specific @ commands and specials. Calling ScriptContext_Enable for instance will allow execution to continue. .macro waitstate .byte 0x27 .endm @ Blocks script execution for frames. (Pokemon Emerald runs at just shy of 60 frames per second.) .macro delay frames:req .byte 0x28 .2byte \frames .endm @ Sets flag to TRUE. .macro setflag flag:req .byte 0x29 .2byte \flag .endm @ Sets flag to FALSE. .macro clearflag flag:req .byte 0x2a .2byte \flag .endm @ Compares flag to TRUE and stores the result in comparisonResult to be used by goto_if, etc @ See additional _if_unset and _if_set macros .macro checkflag flag:req .byte 0x2b .2byte \flag .endm @ In FRLG, this command is a nop. In RSE, initializes the RTC's local time offset to the given hour and minute. .macro initclock hour:req, minute:req .byte 0x2c .2byte \hour .2byte \minute .endm @ In FRLG, this command is a nop. In RSE, updates local time using the RTC and runs time based events. .macro dotimebasedevents .byte 0x2d .endm @ Sets the values of variables VAR_0x8000, VAR_0x8001, and VAR_0x8002 to 0. In RSE, they'd get the current hour, minute, and second respectively. .macro gettime .byte 0x2e .endm @ Plays the specified sound. Only one sound may play at a time, with newer ones interrupting older ones. .macro playse song:req .byte 0x2f .2byte \song .endm @ Blocks script execution until the currently-playing sound (triggered by playse) finishes playing. .macro waitse .byte 0x30 .endm @ Plays the fanfare specified by the song number. If the specified song is not a fanfare it will instead play the first song in sFanfares. .macro playfanfare song:req .byte 0x31 .2byte \song .endm @ Blocks script execution until all currently-playing fanfares finish. .macro waitfanfare .byte 0x32 .endm @ Plays the specified song. If save_song is TRUE, the @ specified song will be saved as if savebgm was called with it. .macro playbgm song:req, save_song:req .byte 0x33 .2byte \song .byte \save_song .endm @ Saves the specified song to be played later. Saved music may be played when Overworld_PlaySpecialMapMusic is called. This occurs on @ exiting most warps. .macro savebgm song:req .byte 0x34 .2byte \song .endm @ Crossfades the currently-playing song into the map's default song. .macro fadedefaultbgm .byte 0x35 .endm @ Crossfades the currently-playing song into the specified song. .macro fadenewbgm song:req .byte 0x36 .2byte \song .endm @ Fades out the currently-playing song. .macro fadeoutbgm speed:req .byte 0x37 .byte \speed .endm @ Fades the previously-playing song back in. .macro fadeinbgm speed:req .byte 0x38 .byte \speed .endm @ Helper macro for warp commands that formats their arguments. @ It allows warp macros to either provide 1. a valid id for which warp location to use, @ or 2. a pair of x/y coordinates to use. Both may be provided but at least one will be @ ignored by SetPlayerCoordsFromWarp. If none are provided it will use dummy arguments, @ and the warp will send the player to the center of the map. @ Examples of valid inputs for a warp command: @ - warp MAP, x, y @ - warp MAP, warpId @ - warp MAP @ - warp MAP, warpId, x, y .macro formatwarp map:req, a, b, c map \map .ifb \a @ No arguments provided, use dummy warpId and coords. .byte WARP_ID_NONE .2byte -1 @ x .2byte -1 @ y .else .ifb \b @ Only one argument provided, treat it as a warpId and use dummy coords. .byte \a @ warpId .2byte -1 @ x .2byte -1 @ y .else .ifb \c @ Only two arguments provided, treat them as a coord pair and use dummy warpId. .byte WARP_ID_NONE .2byte \a @ x .2byte \b @ y .else @ All three arguments provided. Output them and let the warp sort out which to use. .byte \a @ warpId .2byte \b @ x .2byte \c @ y .endif .endif .endif .endm @ Warps the player to the specified map. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro warp map:req, a, b, c .byte 0x39 formatwarp \map, \a, \b, \c .endm @ Warps the player to the specified map without playing a sound effect. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro warpsilent map:req, a, b, c .byte 0x3a formatwarp \map, \a, \b, \c .endm @ Warps the player to the specified map and plays a door opening animation before stepping upwards into it. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro warpdoor map:req, a, b, c .byte 0x3b formatwarp \map, \a, \b, \c .endm @ Warps the player to another map using a hole animation. If the specified map is MAP_UNDEFINED it will instead @ use the map set by setholewarp. In either case the target coordinates on the destination map will be the @ player's current position. .macro warphole map:req .byte 0x3c map \map .endm @ Warps the player to the specified map using a teleport effect. Effect is similar to warpspinenter but @ this warp has a fade out first and doesn't maintain the original facing direction. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro warpteleport map:req, a, b, c .byte 0x3d formatwarp \map, \a, \b, \c .endm @ Sets the warp destination to be used later. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro setwarp map:req, a, b, c .byte 0x3e formatwarp \map, \a, \b, \c .endm @ Sets the dynamic warp destination. Warps with a destination map of MAP_DYNAMIC will target this destination. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro setdynamicwarp map:req, a, b, c .byte 0x3f formatwarp \map, \a, \b, \c .endm @ Sets the destination that diving or emerging from a dive will take the player to. Note that this only @ applies if the current map does not have a dive/emerge connection. If it does have a corresponding @ map connection then that map and the player's current coordinates will be used as the destination instead. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro setdivewarp map:req, a, b, c .byte 0x40 formatwarp \map, \a, \b, \c .endm @ Sets the destination that falling into a hole will take the player to. @ While it does accept and set the x/y coordinates and warpId, they are ultimately ignored. @ This is only used to set the map the player should fall to. The exact location on the @ map to fall to is determined by warphole. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro setholewarp map:req, a=0, b=0, c .byte 0x41 formatwarp \map, \a, \b, \c .endm @ Retrieves the player's zero-indexed x- and y-coordinates in the map, and stores them in the specified variables. .macro getplayerxy x:req, y:req .byte 0x42 .2byte \x .2byte \y .endm @ Retrieves the number of Pokemon in the player's party, and stores that number in VAR_RESULT. .macro getpartysize .byte 0x43 .endm @ Attempts to add quantity of the specified item to the player's Bag. If the player has enough room, the item will @ be added and VAR_RESULT will be set to TRUE; otherwise, VAR_RESULT is set to FALSE. .macro additem itemId:req, quantity=1 .byte 0x44 .2byte \itemId .2byte \quantity .endm @ Removes quantity of the specified item from the player's Bag. If the player has fewer than 'quantity' in their bag @ then none will be removed and VAR_RESULT will be set to FALSE. Otherwise it will be set to TRUE. .macro removeitem itemId:req, quantity=1 .byte 0x45 .2byte \itemId .2byte \quantity .endm @ Checks if the player has enough space in their Bag to hold quantity more of the specified item. Sets VAR_RESULT to @ TRUE if there is room, or FALSE is there is no room. .macro checkitemspace itemId:req, quantity=1 .byte 0x46 .2byte \itemId .2byte \quantity .endm @ Checks if the player has quantity or more of the specified item in their Bag. Sets VAR_RESULT to TRUE if the player has @ enough of the item, or FALSE if they have fewer than quantity of the item. .macro checkitem itemId:req, quantity=1 .byte 0x47 .2byte \itemId .2byte \quantity .endm @ Checks which Bag pocket the specified item belongs in, and writes the pocket value (POCKET_*) to VAR_RESULT. @ This is used to show the name of the proper Bag pocket when the player receives an item via callstd. .macro checkitemtype itemId:req .byte 0x48 .2byte \itemId .endm @ Adds quantity of the specified item to the player's PC. .macro addpcitem itemId:req, quantity=1 .byte 0x49 .2byte \itemId .2byte \quantity .endm @ Checks for quantity of the specified item in the player's PC. .macro checkpcitem itemId:req, quantity=1 .byte 0x4a .2byte \itemId .2byte \quantity .endm @ In FRLG, this command is a nop. In RSE, adds a decoration to the player's PC. .macro adddecoration decoration:req .byte 0x4b .2byte \decoration .endm @ In FRLG, this command is a nop. In RSE, removes a decoration from the player's PC. .macro removedecoration decoration:req .byte 0x4c .2byte \decoration .endm @ In FRLG, this command is a nop. In RSE, checks for decoration in the player's PC. .macro checkdecor decoration:req .byte 0x4d .2byte \decoration .endm @ In FRLG, this command is a nop. In RSE, checks if the player has enough space in their PC to hold the decoration. .macro checkdecorspace decoration:req .byte 0x4e .2byte \decoration .endm @ Applies the movement data at movements to the specified (localId) object. If no map is specified, then the current map is used. .macro applymovement localId:req, movements:req, map .ifb \map .byte 0x4f .2byte \localId .4byte \movements .else @ Really only useful if the object has followed from one map to another (e.g. Wally during the catching event). .byte 0x50 .2byte \localId .4byte \movements map \map .endif .endm @ Blocks script execution until the movements being applied to the specified (localId) object finish. @ If localId is 0, then the id of the last-moved object will be used instead. If the specified object @ is not currently being manipulated with applymovement, then this command does nothing. @ If no map is specified, then the current map is used. .macro waitmovement localId:req, map .ifb \map .byte 0x51 .2byte \localId .else .byte 0x52 .2byte \localId map \map .endif .endm @ Attempts to despawn the specified (localId) object on the specified map. @ It also sets the object's visibility flag if it has one. @ If no map is specified, then the current map is used. .macro removeobject localId:req, map .ifb \map .byte 0x53 .2byte \localId .else .byte 0x54 .2byte \localId map \map .endif .endm @ Attempts to spawn the specified (localId) object the specified map. @ Note that unlike removeobject this does not modify the object's flag. @ If no map is specified, then the current map is used. .macro addobject localId:req, map .ifb \map .byte 0x55 .2byte \localId .else .byte 0x56 .2byte \localId map \map .endif .endm @ Sets the specified (localId) object's position on the current map. .macro setobjectxy localId:req, x:req, y:req .byte 0x57 .2byte \localId .2byte \x .2byte \y .endm @ Sets the specified object's invisibility to FALSE. .macro showobjectat localId:req, map:req .byte 0x58 .2byte \localId map \map .endm @ Sets the specified object's invisibility to TRUE. .macro hideobjectat localId:req, map:req .byte 0x59 .2byte \localId map \map .endm @ Turns the currently selected object (if there is one) to face the player. .macro faceplayer .byte 0x5a .endm @ Turns the specified object in the specified direction. .macro turnobject localId:req, direction:req .byte 0x5b .2byte \localId .byte \direction .endm @ Configures the arguments for a trainer battle, then jumps to the appropriate script in scripts/trainer_battle.inc .macro trainerbattle type:req, trainer:req, local_id:req, pointer1:req, pointer2, pointer3, pointer4 .byte 0x5c .byte \type .2byte \trainer .2byte \local_id .if \type == TRAINER_BATTLE_SINGLE .4byte \pointer1 @ text .4byte \pointer2 @ text .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC .4byte \pointer1 @ text .4byte \pointer2 @ text .4byte \pointer3 @ event script .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT .4byte \pointer1 @ text .4byte \pointer2 @ text .4byte \pointer3 @ event script .elseif \type == TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT .4byte \pointer1 @ text .elseif \type == TRAINER_BATTLE_DOUBLE .4byte \pointer1 @ text .4byte \pointer2 @ text .4byte \pointer3 @ text .elseif \type == TRAINER_BATTLE_REMATCH .4byte \pointer1 @ text .4byte \pointer2 @ text .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE .4byte \pointer1 @ text .4byte \pointer2 @ text .4byte \pointer3 @ text .4byte \pointer4 @ event script .elseif \type == TRAINER_BATTLE_REMATCH_DOUBLE .4byte \pointer1 @ text .4byte \pointer2 @ text .4byte \pointer3 @ text .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC .4byte \pointer1 @ text .4byte \pointer2 @ text .4byte \pointer3 @ text .4byte \pointer4 @ event script .elseif \type == TRAINER_BATTLE_EARLY_RIVAL .4byte \pointer1 @ text .4byte \pointer2 @ text .endif .endm NO_MUSIC = FALSE @ Starts a single trainer battle. Takes a trainer, intro text, loss text, and an optional event script. @ When used with an event script, you can also pass in an optional flag to disable music .macro trainerbattle_single trainer:req, intro_text:req, lose_text:req, event_script=FALSE, music=TRUE .if \event_script == FALSE trainerbattle TRAINER_BATTLE_SINGLE, \trainer, 0, \intro_text, \lose_text .elseif \music == TRUE trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, \trainer, 0, \intro_text, \lose_text, \event_script .else trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, \trainer, 0, \intro_text, \lose_text, \event_script .endif .endm @ Starts a double trainer battle. Takes a trainer, intro text, loss text, text for when you have too few pokemon @ and an optional event script. When used with an event script you can pass in an optional flag to disable music .macro trainerbattle_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req, event_script=FALSE, music=TRUE .if \event_script == FALSE trainerbattle TRAINER_BATTLE_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text .elseif \music == TRUE trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text, \event_script .else trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text, \event_script .endif .endm @ Starts a rematch battle, takes a trainer, intro text and loss text .macro trainerbattle_rematch trainer:req, intro_text:req, lose_text:req trainerbattle TRAINER_BATTLE_REMATCH, \trainer, 0, \intro_text, \lose_text .endm @ Starts a rematch double battle. Takes a trainer, intro text, loss text, and text for when you have too few pokemon .macro trainerbattle_rematch_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req trainerbattle TRAINER_BATTLE_REMATCH_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text .endm @ Starts a trainer battle, skipping intro text. Takes a trainer and loss text .macro trainerbattle_no_intro trainer:req, lose_text:req trainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, \trainer, 0, \lose_text .endm @ Starts a trainer battle with victory text if the player loses. If flags is nonzero, the player will be healed after battle (and its assumed to be the tutorial battle) .macro trainerbattle_earlyrival trainer:req, flags:req, defeat_text:req, victory_text:req trainerbattle TRAINER_BATTLE_EARLY_RIVAL, \trainer, \flags, \defeat_text, \victory_text .endm @ Starts a trainer battle using the battle information stored in RAM (usually by the scripts in trainer_battle.inc, which @ are run by trainerbattle), and blocks script execution until the battle finishes. .macro dotrainerbattle .byte 0x5d .endm @ Goes to address after the trainerbattle command (called by the battle functions, see battle_setup.c) .macro gotopostbattlescript .byte 0x5e .endm @ Goes to address specified in the trainerbattle command (called by the battle functions, see battle_setup.c) .macro gotobeatenscript .byte 0x5f .endm @ Checks if the trainer has been defeated by the player (by comparing the flag 'trainer + TRAINER_FLAGS_START' to TRUE). .macro checktrainerflag trainer:req .byte 0x60 .2byte \trainer .endm @ Sets the trainer flag (trainer + TRAINER_FLAGS_START) to TRUE (defeated). .macro settrainerflag trainer:req .byte 0x61 .2byte \trainer .endm @ Sets the trainer flag (trainer + TRAINER_FLAGS_START) to FALSE (not defeated). .macro cleartrainerflag trainer:req .byte 0x62 .2byte \trainer .endm @ Sets the coordinates of an object's template, so that if the sprite goes off screen @ it'll still be there when it comes back on screen. .macro setobjectxyperm localId:req, x:req, y:req .byte 0x63 .2byte \localId .2byte \x .2byte \y .endm @ Copies a live object event's xy position to its template, so that if the sprite goes off screen @ it'll still be there when it comes back on screen. .macro copyobjectxytoperm localId:req .byte 0x64 .2byte \localId .endm @ Sets the movement type (MOVEMENT_TYPE_*) for an object's template. .macro setobjectmovementtype localId:req, movementType:req .byte 0x65 .2byte \localId .byte \movementType .endm @ If a standard message box (or its text) is being drawn on-screen, this command blocks script execution until the @ box and its text have been fully drawn. .macro waitmessage .byte 0x66 .endm @ Starts displaying a standard message box containing the specified text. If text is a pointer, then the string at @ that offset will be loaded and used. If text is NULL, then the value of script data 0 will be treated as @ a pointer to the text. The 'loadword 0' in msgbox sets this value, for instance. .macro message text:req .byte 0x67 .4byte \text .endm @ Closes the current message box. .macro closemessage .byte 0x68 .endm @ Freezes all objects immediately except the player. The player is frozen once their movement is finished. .macro lockall .byte 0x69 .endm @ Freezes all objects immediately except the player and the selected object. The player and selected object are frozen once their movement is finished. .macro lock .byte 0x6a .endm @ Resumes normal movement for all objects on-screen, and closes any standard message boxes that are still open. .macro releaseall .byte 0x6b .endm @ Resumes normal movement for the selected object (if there is one) and the player. Also closes any standard message boxes that are still open. .macro release .byte 0x6c .endm @ Blocks script execution until the player presses the A or B button. .macro waitbuttonpress .byte 0x6d .endm @ Displays a YES/NO multichoice box at the specified coordinates, and blocks script execution until the user makes a selection. @ Their selection is stored in VAR_RESULT as NO (0) or YES (1). Pressing B is equivalent to answering NO .macro yesnobox x:req, y:req .byte 0x6e .byte \x .byte \y .endm @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. @ Lists of options are predefined (sMultichoiceLists) and the one to be used is specified with multichoiceId. @ If ignoreBPress is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button. .macro multichoice x:req, y:req, multichoiceId:req, ignoreBPress:req .byte 0x6f .byte \x .byte \y .byte \multichoiceId .byte \ignoreBPress .endm @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. @ Lists of options are predefined (sMultichoiceLists) and the one to be used is specified with multichoiceId. @ The default argument determines the initial position of the cursor when the box is first opened; it is zero-indexed, and if it is too large, it is treated as 0. @ If ignoreBPress is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button. .macro multichoicedefault x:req, y:req, multichoiceId:req, default:req, ignoreBPress:req .byte 0x70 .byte \x .byte \y .byte \multichoiceId .byte \default .byte \ignoreBPress .endm @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. @ Lists of options are predefined (sMultichoiceLists) and the one to be used is specified with multichoiceId. @ The per_row argument determines how many list items will be shown on a single row of the box. @ If ignoreBPress is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button. .macro multichoicegrid x:req, y:req, multichoiceId:req, per_row:req, ignoreBPress:req .byte 0x71 .byte \x .byte \y .byte \multichoiceId .byte \per_row .byte \ignoreBPress .endm @ In FRLG, this command is a nop. .macro drawbox .byte 0x72 .endm @ In FRLG, this command is a nop. Still consumes parameters. .macro erasebox left:req, top:req, right:req, bottom:req .byte 0x73 .byte \left .byte \top .byte \right .byte \bottom .endm @ In FRLG, this command is a nop. Still consumes parameters. .macro drawboxtext left:req, top:req, multichoiceId:req, ignoreBPress:req .byte 0x74 .byte \left .byte \top .byte \multichoiceId .byte \ignoreBPress .endm @ Displays a box containing the front sprite for the specified Pokemon species and plays its cry. .macro showmonpic species:req, x:req, y:req .byte 0x75 .2byte \species .byte \x .byte \y .endm @ Hides the box displayed by showmonpic. .macro hidemonpic .byte 0x76 .endm @ In FRLG, this command is a nop. In RSE, draws an image of the winner of the contest. winnerId is any CONTEST_WINNER_* constant. .macro showcontestpainting winnerId:req .byte 0x77 .byte \winnerId .endm @ Displays the given string as braille text in a standard message box. The string should use the .braille directive @ to convert text to braille, and be preceded by brailleformat. The brailleformat data is skipped over (in RS, these @ bytes determined the box's size and position, but in Emerald these are calculated automatically). .macro braillemessage text:req .byte 0x78 .4byte \text .endm @ Formatting for the braille window, to be put at the start of a pointer used by braillemessage. .macro brailleformat winLeft:req, winTop:req, winRight:req, winBottom:req, textLeft:req, textTop:req .byte \winLeft .byte \winTop .byte \winRight .byte \winBottom .byte \textLeft .byte \textTop .endm @ Gives the player a Pokémon of the specified species and level, holding the specified item. The trailing 0s are unused parameters. @ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome. .macro givemon species:req, level:req, item=ITEM_NONE .byte 0x79 .2byte \species .byte \level .2byte \item .4byte 0 .4byte 0 .byte 0 .endm @ Gives the player an Egg of the specified species. @ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome. .macro giveegg species:req .byte 0x7a .2byte \species .endm @ Replaces the move at 'slot' of the Pokémon in the player's party at 'partyIndex' with the specified move. @ If a value greater than PARTY_SIZE is given for partyIndex it will use the last Pokémon in the party instead. @ Note that this means in vanilla a value equal to PARTY_SIZE for partyIndex will go out of bounds. .macro setmonmove partyIndex:req, slot:req, move:req .byte 0x7b .byte \partyIndex .byte \slot .2byte \move .endm @ Checks if at least one Pokemon in the player's party knows the specified move. If so, VAR_RESULT is set to the @ (zero-indexed) slot number of the first Pokemon that knows the move. If not, VAR_RESULT is set to PARTY_SIZE. @ VAR_0x8004 is also set to this Pokemon's species. .macro checkpartymove move:req .byte 0x7c .2byte \move .endm @ Converts STR_VAR_1, STR_VAR_2, or STR_VAR_3 to its corresponding index into sScriptStringVars (0, 1, or 2). @ If given anything else it will output it directly. @ Note: Because the STR_VAR_# arguments given to this macro are not part of a processed string they are not @ replaced with their charmap values, they are just passed as the literal characters "STR_VAR_#". .macro stringvar id:req .if \id == STR_VAR_1 .byte 0 .elseif \id == STR_VAR_2 .byte 1 .elseif \id == STR_VAR_3 .byte 2 .else .byte \id .endif .endm @ Writes the name of the given Pokemon species to the specified buffer. .macro bufferspeciesname stringVarId:req, species:req .byte 0x7d stringvar \stringVarId .2byte \species .endm @ Writes the name of the species of the first Pokemon in the player's party to the specified buffer. .macro bufferleadmonspeciesname stringVarId:req .byte 0x7e stringvar \stringVarId .endm @ Writes the nickname of the Pokemon in 'slot' (zero-indexed) of the player's party to the specified buffer. @ If an empty or invalid slot is specified, ten spaces ("") are written to the buffer. .macro bufferpartymonnick stringVarId:req, slot:req .byte 0x7f stringvar \stringVarId .2byte \slot .endm @ Writes the name of the specified item to the specified buffer. If itemId is >= ITEMS_COUNT, @ then the name of ITEM_NONE ("????????") is buffered instead. .macro bufferitemname stringVarId:req, item:req .byte 0x80 stringvar \stringVarId .2byte \item .endm @ In FRLG, this command is a nop. In RSE, writes the name of the specified decoration to the specified buffer. .macro bufferdecorationname stringVarId:req, decoration:req .byte 0x81 stringvar \stringVarId .2byte \decoration .endm @ Writes the name of the specified move to the specified buffer. .macro buffermovename stringVarId:req, move:req .byte 0x82 stringvar \stringVarId .2byte \move .endm @ Converts the value of input to a decimal string, and writes that string to the specified buffer. .macro buffernumberstring stringVarId:req, input:req .byte 0x83 stringvar \stringVarId .2byte \input .endm @ Writes the given standard string (STDSTRING_*) to the specified buffer. Invalid std string ids are not handled. .macro bufferstdstring stringVarId:req, index:req .byte 0x84 stringvar \stringVarId .2byte \index .endm @ Copies the string at the given pointer to the specified buffer. .macro bufferstring stringVarId:req, text:req .byte 0x85 stringvar \stringVarId .4byte \text .endm @ Opens the Pokemart system, offering the specified products for sale. @ Products should be a list of .2byte item values preceded by an .align 2 .macro pokemart products:req .byte 0x86 .4byte \products .endm @ Opens the Pokemart system and treats the list of items as decorations. @ Products should be a list of .2byte decoration values preceded by an .align 2 .macro pokemartdecoration products:req .byte 0x87 .4byte \products .endm @ Identical to pokemartdecoration, but with slight changes to the clerk dialogue. See uses of MART_TYPE_DECOR2. .macro pokemartdecoration2 products:req .byte 0x88 .4byte \products .endm @ Starts up the slot machine minigame. id is a SLOT_MACHINE_* value that influences probabilities of certain reel outcomes. .macro playslotmachine id:req .byte 0x89 .2byte \id .endm @ In FRLG, this command is a nop. In RSE, sets a berry tree's berry and growth stage. .macro setberrytree treeId:req, berry:req, growthStage:req .byte 0x8a .byte \treeId .byte \berry .byte \growthStage .endm @ In FRLG, this command is a nop. In RSE, opens the party menu to select a Pokemon for a contest. .macro choosecontestmon .byte 0x8b .endm @ In FRLG, this command is a nop. In RSE, starts the appeals round of a contest. .macro startcontest .byte 0x8c .endm @ In FRLG, this command is a nop. In RSE, shows the results screen of a contest. .macro showcontestresults .byte 0x8d .endm @ In FRLG, this command is a nop. In RSE, starts communication to initialize a link contest. .macro contestlinktransfer .byte 0x8e .endm @ Stores a random integer between 0 and limit (exclusive of limit) in VAR_RESULT. .macro random limit:req .byte 0x8f .2byte \limit .endm @ Adds value to the player's money. If adding 'value' money would exceed MAX_MONEY, the player's money is set to MAX_MONEY. @ If 'disable' is set to anything but 0 then this command does nothing. .macro addmoney value:req, disable=0 .byte 0x90 .4byte \value .byte \disable .endm @ Subtracts value from the player's money. If the player has less than 'value' money, their money is set to 0. @ If 'disable' is set to anything but 0 then this command does nothing. .macro removemoney value:req, disable=0 .byte 0x91 .4byte \value .byte \disable .endm @ Checks if the player has money >= value. VAR_RESULT is set to TRUE if the player has enough money, or FALSE if they do not. @ If 'disable' is set to anything but 0 then this command does nothing. .macro checkmoney value:req, disable=0 .byte 0x92 .4byte \value .byte \disable .endm @ Creates a window showing how much money the player has. @ If 'disable' is set to anything but 0 then this command does nothing. .macro showmoneybox x:req, y:req, disable=0 .byte 0x93 .byte \x .byte \y .byte \disable .endm @ Destroys the window created by showmoneybox. Consumption of the x and y arguments was dummied out. .macro hidemoneybox .byte 0x94 .byte 0 @ \x .byte 0 @ \y .endm @ Updates the window created by showmoneybox. Consumption of the x and y arguments was dummied out. @ If 'disable' is set to anything but 0 then this command does nothing. .macro updatemoneybox disable=0 .byte 0x95 .byte 0 @ \x .byte 0 @ \y .byte \disable .endm @ In FRLG, this command is a nop. In RSE, gets whether the effects of the specified PokeNews program are active. .macro getpokenewsactive newsKind:req .byte 0x96 .2byte \newsKind .endm @ Fades the screen to and from black and white. Modes are FADE_(TO/FROM)_(WHITE/BLACK) .macro fadescreen mode:req .byte 0x97 .byte \mode .endm @ Fades the screen to and from black and white. Modes are FADE_(TO/FROM)_(WHITE/BLACK) .macro fadescreenspeed mode:req, speed:req .byte 0x98 .byte \mode .byte \speed .endm @ Sets the flash level. A level of 0 is fully bright, a level of 1 is the largest flash radius, a level @ of 7 is the smallest flash radius, a level of 8 is fully black. .macro setflashlevel level:req .byte 0x99 .2byte \level .endm @ Animates the flash radius from its current size to the size it would be at the specified level. @ Note that this does not actually change the current flash level. It's typically used just before a setflashlevel. .macro animateflash level:req .byte 0x9a .byte \level .endm @ Automatically scrolls through the message without player input and at a fixed speed. .macro messageautoscroll text:req .byte 0x9b .4byte \text .endm @ Executes the specified field effect animation (FLDEFF_*). .macro dofieldeffect animation:req .byte 0x9c .2byte \animation .endm @ Sets the field effect argument at index 'argNum' to 'value.' .macro setfieldeffectargument argNum:req, value:req .byte 0x9d .byte \argNum .2byte \value .endm @ Blocks script execution until all playing field effect animations complete. .macro waitfieldeffect animation:req .byte 0x9e .2byte \animation .endm @ Sets which healing place the player will return to if all of the Pokemon in their party faint. .macro setrespawn heallocation:req .byte 0x9f .2byte \heallocation .endm @ Checks the player's gender. Stores the result (MALE (0) or FEMALE (1)) in VAR_RESULT. .macro checkplayergender .byte 0xa0 .endm @ Plays the cry of the given species. Mode is any CRY_MODE_* constant. @ You can use waitmoncry to block script execution until the cry finishes. .macro playmoncry species:req, mode:req .byte 0xa1 .2byte \species .2byte \mode .endm @ Set the metatile at (x, y) on the current map to the given metatile and impassability. .macro setmetatile x:req, y:req, metatileId:req, impassable:req .byte 0xa2 .2byte \x .2byte \y .2byte \metatileId .2byte \impassable .endm @ Queues a weather change to the default weather for the map. .macro resetweather .byte 0xa3 .endm @ Queues a weather change to type weather. .macro setweather type:req .byte 0xa4 .2byte \type .endm @ Executes the weather change queued with resetweather or setweather. The current weather will smoothly fade into the queued weather. .macro doweather .byte 0xa5 .endm @ Enables the overworld task specified by stepCbId (STEP_CB_*). Only 1 can be active at a time. See src/field_tasks.c for more. .macro setstepcallback stepCbId:req .byte 0xa6 .byte \stepCbId .endm @ Sets the current map layout to the one specified by index (LAYOUT_*). @ This should be done before the layout is loaded, typically in the ON_TRANSITION map script. .macro setmaplayoutindex index:req .byte 0xa7 .2byte \index .endm @ Sets the specified object's sprite's subpriority, and sets fixedPriority to TRUE. @ Only used to hide the player and Briney behind the boat. .macro setobjectsubpriority localId:req, map:req, subpriority:req .byte 0xa8 .2byte \localId map \map .byte \subpriority .endm @ Sets the specified object's fixedPriority to FALSE. Does not change the subpriority field. .macro resetobjectsubpriority localId:req, map:req .byte 0xa9 .2byte \localId map \map .endm @ Creates a sprite with object graphics. Used when creating large groups of static NPCs that exceed the object event limit. @ The specified id can be used to refer to the sprite again later with turnvobject. .macro createvobject graphicsId:req, id:req, x:req, y:req, elevation=3, direction=DIR_SOUTH .byte 0xaa .byte \graphicsId .byte \id .2byte \x .2byte \y .byte \elevation .byte \direction .endm @ Turns a sprite created with createvobject. .macro turnvobject id:req, direction:req .byte 0xab .byte \id .byte \direction .endm @ Opens the door metatile at (x, y) with an animation. .macro opendoor x:req, y:req .byte 0xac .2byte \x .2byte \y .endm @ Closes the door metatile at (x, y) with an animation. .macro closedoor x:req, y:req .byte 0xad .2byte \x .2byte \y .endm @ Waits for the door animation started with opendoor or closedoor to finish. .macro waitdooranim .byte 0xae .endm @ Sets the door metatile at (x, y) to be open without an animation. .macro setdooropen x:req, y:req .byte 0xaf .2byte \x .2byte \y .endm @ Sets the door metatile at (x, y) to be closed without an animation. .macro setdoorclosed x:req, y:req .byte 0xb0 .2byte \x .2byte \y .endm @ In FRLG, this command is a nop. It is implemented but unused in Ruby/Sapphire. .macro addelevmenuitem a:req, b:req, c:req, d:req .byte 0xb1 .byte \a .2byte \b .2byte \c .2byte \d .endm @ In FRLG, this command is a nop. It is implemented but unused in Ruby/Sapphire. .macro showelevmenu .byte 0xb2 .endm @ Gets the number of coins the player has and stores it in the variable 'out'. .macro checkcoins out:req .byte 0xb3 .2byte \out .endm @ Gives 'count' coins to the player, up to a total of MAX_COINS. @ If the player already has MAX_COINS then VAR_RESULT is set to TRUE, otherwise it is set to FALSE. .macro addcoins count:req .byte 0xb4 .2byte \count .endm @ Takes 'count' coins from the player. @ If the player has fewer than 'count' coins then no coins are taken and VAR_RESULT is set to TRUE. @ Otherwise VAR_RESULT is set to FALSE. .macro removecoins count:req .byte 0xb5 .2byte \count .endm @ Prepares to start a wild battle against a 'species' at 'level' holding 'item'. Running this command will not affect @ normal wild battles. You start the prepared battle with dowildbattle. .macro setwildbattle species:req, level:req, item=ITEM_NONE .byte 0xb6 .2byte \species .byte \level .2byte \item .endm @ Starts a wild battle against the Pokemon generated by setwildbattle. Blocks script execution until the battle finishes. .macro dowildbattle .byte 0xb7 .endm @ Sets a relative address to be used by the other vcommands as part of a Mystery Gift script. .macro setvaddress pointer:req .byte 0xb8 .4byte \pointer .endm @ Equivalent to goto using the relative address set by setvaddress. .macro vgoto destination:req .byte 0xb9 .4byte \destination .endm @ Equivalent to call using the relative address set by setvaddress. .macro vcall destination:req .byte 0xba .4byte \destination .endm @ Equivalent to goto_if using the relative address set by setvaddress. .macro vgoto_if condition:req, destination:req .byte 0xbb .byte \condition .4byte \destination .endm @ Equivalent to call_if using the relative address set by setvaddress. .macro vcall_if condition:req, destination:req .byte 0xbc .byte \condition .4byte \destination .endm @ Equivalent to message using the relative address set by setvaddress. .macro vmessage text:req .byte 0xbd .4byte \text .endm @ Expands the given text at the pointer (- the relative address set by setvaddress) into gStringVar4 .macro vbuffermessage text:req .byte 0xbe .4byte \text .endm @ Equivalent to bufferstring using the relative address set by setvaddress. .macro vbufferstring stringVarIndex:req, text:req .byte 0xbf stringvar \stringVarIndex .4byte \text .endm @ Create a window showing how many Coins the player has. .macro showcoinsbox x:req, y:req .byte 0xc0 .byte \x .byte \y .endm @ Destroys the window created by showcoins. It consumes its arguments but doesn't use them. .macro hidecoinsbox x:req, y:req .byte 0xc1 .byte \x .byte \y .endm @ Updates the window created by showcoins. It consumes its arguments but doesn't use them. .macro updatecoinsbox x:req, y:req .byte 0xc2 .byte \x .byte \y .endm @ Increases the value of the specified game stat by 1. The maximum value of a stat is 0xFFFFFF. See include/constants/game_stat.h .macro incrementgamestat stat:req .byte 0xc3 .byte \stat .endm @ Sets the destination that using an Escape Rope or Dig will take the player to. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro setescapewarp map:req, a, b, c .byte 0xc4 formatwarp \map, \a, \b, \c .endm @ Blocks script execution until cry finishes. .macro waitmoncry .byte 0xc5 .endm @ Writes the name of the specified PC box to the specified buffer. .macro bufferboxname stringVarId:req, box:req .byte 0xc6 stringvar \stringVarId .2byte \box .endm @ Sets the color of the text in standard message boxes. color is any NPC_TEXT_COLOR_* constant. @ The color will be reset to NPC_TEXT_COLOR_DEFAULT whenever ProcessPlayerFieldInput is called. .macro textcolor color:req .byte 0xc7 .byte \color .endm @ Displays the help menu with the given text. .macro loadhelp msg:req .byte 0xc8 .4byte \msg .endm @ Erases the help menu .macro unloadhelp .byte 0xc9 .endm @ After using this command, all standard message boxes will use the signpost frame. .macro signmsg .byte 0xca .endm @ Ends the effects of signmsg, returning message box frames to normal. .macro normalmsg .byte 0xcb .endm @ Reads the value of the specified game stat and compares it to the specified value. @ Sets the script comparisonResult to 0 if stat < value, 1 if stat == value, and 2 if stat > value. .macro comparestat statId:req, value:req .byte 0xcc .byte \statId .4byte \value .endm @ Sets the modernFatefulEncounter bit for the Pokemon in the specified slot of the player's party. .macro setmonmodernfatefulencounter slot:req .byte 0xcd .2byte \slot .endm @ Checks if the modernFatefulEncounter bit is set for the Pokemon in the specified slot of the player's party. If it isn't set, @ VAR_RESULT is TRUE. If the bit is set (or if the specified slot is empty or invalid), VAR_RESULT is FALSE. .macro checkmonmodernfatefulencounter slot:req .byte 0xce .2byte \slot .endm @ Jumps to the ram script saved from a Wonder Card. If there is no valid saved Wonder Card or if the @ ram script is invalid then this does nothing. .macro trywondercardscript .byte 0xcf .endm @ Sets worldmapflag to 1. This allows the player to Fly to the corresponding map, if that map has a flightspot. .macro setworldmapflag worldmapflag:req .byte 0xd0 .2byte \worldmapflag .endm @ Warps the player to the specified map using a teleport effect. Effect is similar to warpteleport, but @ this warp has no fade out and maintains the original facing direction. @ Warp commands can be given either the id of which warp location to go to on the destination map @ or a pair of x/y coordinates to go to directly on the destination map. .macro warpspinenter map:req, a, b, c .byte 0xd1 formatwarp \map, \a, \b, \c .endm @ Changes the location where the player caught the Pokemon in the specified slot of their party. .macro setmonmetlocation slot:req, location:req .byte 0xd2 .2byte \slot .byte \location .endm @ Gets the width of the specified message in the Braille font and sets the result to VAR_0x8004. .macro getbraillestringwidth msg:req .byte 0xd3 .4byte \msg .endm @ Writes the name of the specified item to the specified buffer. If 'item' is a Berry or ITEM_POKE_BALL @ and if the quantity is 2 or more, the buffered string will be pluralized ("IES" or "S" appended). @ If the specified item is >= ITEMS_COUNT then the name of ITEM_NONE ("????????") is buffered instead. .macro bufferitemnameplural stringVarId:req, item:req, quantity:req .byte 0xd4 stringvar \stringVarId .2byte \item .2byte \quantity .endm .macro fadescreenswapbuffers mode:req .byte 0xd5 .byte \mode .endm .macro setobjectmovementtypeinstant localId:req, movementType:req .byte 0xd6 .2byte \localId .byte \movementType .endm .macro resetobjectmovementtype localId:req .byte 0xd7 .2byte \localId .endm @ Supplementary .macro goto_if_unset flag:req, dest:req checkflag \flag goto_if FALSE, \dest .endm .macro goto_if_set flag:req, dest:req checkflag \flag goto_if TRUE, \dest .endm @ Allows 'compare' followed by a conditional goto/call to be combined into a single statement. @ The following are examples of the two acceptable formats this facilitates: @ compare VAR_RESULT, TRUE @ goto_if_eq MyScript @ - or - @ goto_if_eq VAR_RESULT, TRUE, MyScript @ @ The first two arguments to this macro are the base command, e.g. 'goto_if 1' for goto_if_eq. @ The remaining arguments 'a, b, c' depend on the format: @ For a single statement, 'a' and 'b' are the values to compare and 'c' is the destination pointer. @ For a statement preceded by a compare, 'a' is the destination pointer and 'b/c' are not provided. .macro trycompare jump:req, condition:req, a:req, b, c .ifnb \c compare \a, \b \jump \condition, \c .else \jump \condition, \a .endif .endm .macro goto_if_lt a:req, b, c @ LESS THAN trycompare goto_if, 0, \a, \b, \c .endm .macro goto_if_eq a:req, b, c @ EQUAL trycompare goto_if, 1, \a, \b, \c .endm .macro goto_if_gt a:req, b, c @ GREATER THAN trycompare goto_if, 2, \a, \b, \c .endm .macro goto_if_le a:req, b, c @ LESS THAN OR EQUAL trycompare goto_if, 3, \a, \b, \c .endm .macro goto_if_ge a:req, b, c @ GREATER THAN OR EQUAL trycompare goto_if, 4, \a, \b, \c .endm .macro goto_if_ne a:req, b, c @ NOT EQUAL trycompare goto_if, 5, \a, \b, \c .endm .macro call_if_unset flag:req, dest:req checkflag \flag call_if FALSE, \dest .endm .macro call_if_set flag:req, dest:req checkflag \flag call_if TRUE, \dest .endm .macro call_if_lt a:req, b, c @ LESS THAN trycompare call_if, 0, \a, \b, \c .endm .macro call_if_eq a:req, b, c @ EQUAL trycompare call_if, 1, \a, \b, \c .endm .macro call_if_gt a:req, b, c @ GREATER THAN trycompare call_if, 2, \a, \b, \c .endm .macro call_if_le a:req, b, c @ LESS THAN OR EQUAL trycompare call_if, 3, \a, \b, \c .endm .macro call_if_ge a:req, b, c @ GREATER THAN OR EQUAL trycompare call_if, 4, \a, \b, \c .endm .macro call_if_ne a:req, b, c @ NOT EQUAL trycompare call_if, 5, \a, \b, \c .endm .macro vgoto_if_eq a:req, b, c trycompare vgoto_if, TRUE, \a, \b, \c .endm .macro vgoto_if_ne a:req, b, c trycompare vgoto_if, FALSE, \a, \b, \c .endm .macro vgoto_if_set flag:req, dest:req checkflag \flag vgoto_if TRUE, \dest .endm .macro vgoto_if_unset flag:req, dest:req checkflag \flag vgoto_if FALSE, \dest .endm .macro goto_if_defeated trainer:req, dest:req checktrainerflag \trainer goto_if TRUE, \dest .endm .macro goto_if_not_defeated trainer:req, dest:req checktrainerflag \trainer goto_if FALSE, \dest .endm .macro call_if_defeated trainer:req, dest:req checktrainerflag \trainer call_if TRUE, \dest .endm .macro call_if_not_defeated trainer:req, dest:req checktrainerflag \trainer call_if FALSE, \dest .endm .macro switch var:req copyvar VAR_0x8000, \var .endm .macro case condition:req, dest:req compare VAR_0x8000, \condition goto_if_eq \dest .endm YES = 1 NO = 0 @ Buffers the given text and calls the relevant standard message script (see gStdScripts). .macro msgbox text:req, type=MSGBOX_DEFAULT loadword 0, \text callstd \type .endm @ Gives 'amount' of the specified 'item' to the player and prints a message with fanfare. @ If the player doesn't have space for all the items then as many are added as possible, the @ message indicates there is no room, and VAR_RESULT is set to FALSE. @ Otherwise VAR_RESULT is set to TRUE, and the message indicates they have received the item(s). .macro giveitem item:req, amount=1 setorcopyvar VAR_0x8000, \item setorcopyvar VAR_0x8001, \amount callstd STD_OBTAIN_ITEM .endm @ For picking up items in the overworld. Similar to giveitem, but with different language and @ sets the flag of the last-talked to object (the item the player picked up). .macro finditem item:req, amount=1 setorcopyvar VAR_0x8000, \item setorcopyvar VAR_0x8001, \amount callstd STD_FIND_ITEM .endm @ Prints the message "{PLAYER} put the {ITEM} in the {POCKET}." The item name is pluralized, if applicable. .macro putitemaway item:req, amount=1 setorcopyvar VAR_0x8000, \item setorcopyvar VAR_0x8001, \amount callstd STD_PUT_ITEM_AWAY .endm @ Prints the provided message after playing the fanfare music (can only be MUS_LEVEL_UP or MUS_OBTAIN_KEY_ITEM). @ It then prints the message shown by using putitemaway. .macro msgreceiveditem msg:req, item:req, amount=1, fanfare=MUS_LEVEL_UP loadword 0, \msg setorcopyvar VAR_0x8000, \item setorcopyvar VAR_0x8001, \amount setorcopyvar VAR_0x8002, \fanfare callstd STD_RECEIVED_ITEM .endm @ Adds the specified item to the bag, then prints a message with fanfare. See description of msgreceiveditem. .macro giveitem_msg msg:req, item:req, amount=1, fanfare=MUS_LEVEL_UP additem \item, \amount msgreceiveditem \msg, \item, \amount, \fanfare .endm @ Depends on the provided function. With the default argument, unlocks the specified entry in the Fame Checker. .macro famechecker person:req, index:req, function=SetFlavorTextFlagFromSpecialVars setvar VAR_0x8004, \person setvar VAR_0x8005, \index special \function .endm @ Sets the 'defeated' flag for all trainers in the specified gym. .macro set_gym_trainers gym:req setvar VAR_0x8008, \gym call EventScript_SetGymTrainers .endm @ Jumps to dest if the Quest Log is currently showing playback scenes (dest is usually a release/end) .macro goto_if_questlog dest:req special GetQuestLogState compare VAR_RESULT, 2 goto_if_eq \dest .endm @ Prints a braille message, then waits for users input. .macro braillemessage_wait text:req setvar VAR_0x8006, 0 braillemessage \text getbraillestringwidth \text call EventScript_BrailleCursorWaitButton .endm @ Creates a Pokémon with the modernFatefulEncounter bit set for an encounter .macro seteventmon species:req, level:req, item=ITEM_NONE setvar VAR_0x8004, \species setvar VAR_0x8005, \level setvar VAR_0x8006, \item special CreateEnemyEventMon .endm ================================================ FILE: asm/macros/field_effect_script.inc ================================================ .macro loadtiles address .byte 0 .4byte \address .endm .macro loadfadedpal address .byte 1 .4byte \address .endm .macro loadpal address .byte 2 .4byte \address .endm .macro callnative address .byte 3 .4byte \address .endm .macro end .byte 4 .endm .macro loadgfx_callnative tiles_address, palette_address, function_address .byte 5 .4byte \tiles_address .4byte \palette_address .4byte \function_address .endm .macro loadtiles_callnative tiles_address, function_address .byte 6 .4byte \tiles_address .4byte \function_address .endm .macro loadfadedpal_callnative palette_address, function_address .byte 7 .4byte \palette_address .4byte \function_address .endm ================================================ FILE: asm/macros/function.inc ================================================ .macro arm_func_start name .align 2, 0 .global \name .arm .type \name, function .endm .macro arm_func_end name .size \name, .-\name .endm .macro thumb_func_start name .align 2, 0 .global \name .thumb .thumb_func .type \name, function .endm .macro non_word_aligned_thumb_func_start name .global \name .thumb .thumb_func .type \name, function .endm .macro thumb_func_end name .size \name, .-\name .endm ================================================ FILE: asm/macros/m4a.inc ================================================ .macro song label, music_player, unknown .4byte \label .2byte \music_player .2byte \unknown .endm .macro music_player info_struct, track_struct, unknown_1, unknown_2 .4byte \info_struct .4byte \track_struct .byte \unknown_1 .space 1 .2byte \unknown_2 .endm ================================================ FILE: asm/macros/map.inc ================================================ @ Most of the macros in this file are for arranging map event data, and are output by mapjson using data from each map's JSON file. @ Takes a MAP constant and outputs the map group and map number as separate bytes .macro map map_id:req .byte \map_id >> 8 @ map group .byte \map_id & 0xFF @ map num .endm @ Defines a map script. 'type' is any MAP_SCRIPT_* constant (see include/constants/map_scripts.h) .macro map_script type:req, script:req .byte \type .4byte \script .endm @ Defines an entry in a map script table (for either ON_WARP_INTO_MAP_TABLE or ON_FRAME_TABLE) .macro map_script_2 var:req, compare:req, script:req .2byte \var .2byte \compare .4byte \script .endm @ Defines an object event template for map data, to be used by a normal object. Mirrors the struct layout of ObjectEventTemplate in include/global.fieldmap.h .macro object_event index:req, gfx:req, x:req, y:req, elevation:req, movement_type:req, x_radius:req, y_radius:req, trainer_type:req, sight_radius_tree_etc:req, script:req, event_flag:req .byte \index .byte \gfx .byte OBJ_KIND_NORMAL .space 1 @ Padding .2byte \x, \y .byte \elevation .byte \movement_type .byte ((\y_radius << 4) | \x_radius) .space 1 @ Padding .2byte \trainer_type .2byte \sight_radius_tree_etc .4byte \script .2byte \event_flag .space 2 @ Padding inc _num_npcs .endm @ Defines an object event template for map data, to be used by a clone object. Mirrors the struct layout of ObjectEventTemplate in include/global.fieldmap.h .macro clone_event index:req, gfx:req, x:req, y:req, target_local_id:req, target_map_id:req .byte \index .byte \gfx .byte OBJ_KIND_CLONE .space 1 @ Padding .2byte \x, \y .byte \target_local_id .space 3 @ Padding .2byte \target_map_id & 0xFF @ map num .2byte \target_map_id >> 8 @ map group .space 8 @ Padding inc _num_npcs .endm @ Defines a warp event for map data. Mirrors the struct layout of WarpEvent in include/global.fieldmap.h .macro warp_def x:req, y:req, elevation:req, warpId:req, map_id:req .2byte \x, \y .byte \elevation .byte \warpId .byte \map_id & 0xFF @ map num .byte \map_id >> 8 @ map group inc _num_warps .endm @ Defines a coord event for map data. Mirrors the struct layout of CoordEvent in include/global.fieldmap.h .macro coord_event x:req, y:req, elevation:req, var:req, varValue:req, script:req .2byte \x, \y .byte \elevation .space 1 @ Padding .2byte \var .2byte \varValue .space 2 @ Padding .4byte \script inc _num_traps .endm @ Defines a weather coord event for map data. Any coord event is treated as a weather coord event if its script is NULL. @ NOTE: In FRLG, the weather handling functions are dummied out. See src/coord_event_weather.c .macro coord_weather_event x:req, y:req, elevation:req, weather:req coord_event \x, \y, \elevation, \weather, 0, NULL .endm @ Defines a generic background event for map data. Mirrors the struct layout of BgEvent in include/global.fieldmap.h @ 'kind' is any BG_EVENT_* constant (see include/constants/event_bg.h). @ 'arg6' is used differently depending on the bg event type. 'arg7' and 'arg8' are only used by bg_hidden_item_event. @ See macros below. .macro bg_event x:req, y, elevation:req, kind:req, arg6:req, arg7, arg8 .2byte \x, \y .byte \elevation .byte \kind .space 2 @ Padding .if \kind != BG_EVENT_HIDDEN_ITEM .4byte \arg6 .else .2byte \arg6 .byte \arg7 .byte \arg8 .endif inc _num_signs .endm @ Defines a background sign event for map data. 'facing_dir' is any of the BG_EVENT_PLAYER_FACING_* constants (see include/constants/event_bg.h) .macro bg_sign_event x:req, y:req, elevation:req, facing_dir:req, script:req bg_event \x, \y, \elevation, \facing_dir, \script .endm @ Defines a background hidden item event for map data .macro bg_hidden_item_event x:req, y:req, elevation:req, item:req, flag:req, quantity:req, underfoot:req bg_event \x, \y, \elevation, BG_EVENT_HIDDEN_ITEM, \item, ((\flag) - FLAG_HIDDEN_ITEMS_START), \quantity | (\underfoot << 7) .endm @ Defines a background secret base event for map data. @ Unused by FRLG .macro bg_secret_base_event x:req, y:req, elevation:req, secret_base_id:req bg_event \x, \y, \elevation, BG_EVENT_SECRET_BASE, \secret_base_id .endm @ Defines the table of event data for a map. Mirrors the struct layout of MapEvents in include/global.fieldmap.h .macro map_events npcs:req, warps:req, traps:req, signs:req .byte _num_npcs, _num_warps, _num_traps, _num_signs .4byte \npcs, \warps, \traps, \signs reset_map_events .endm @ Resets the event counters used to track how many events a map has. Run when the events table is created by map_events .macro reset_map_events .set _num_npcs, 0 .set _num_warps, 0 .set _num_traps, 0 .set _num_signs, 0 .endm @ Initialize the event counters for the first map reset_map_events @ Directions for connecting maps @ The map.json files will only have e.g. "down" as direction data, and this will be appended to "connection_" by the connection macro .equiv connection_down, CONNECTION_SOUTH .equiv connection_up, CONNECTION_NORTH .equiv connection_left, CONNECTION_WEST .equiv connection_right, CONNECTION_EAST .equiv connection_dive, CONNECTION_DIVE .equiv connection_emerge, CONNECTION_EMERGE @ Defines a map connection. Mirrors the struct layout of MapConnection in include/global.fieldmap.h .macro connection direction:req, offset:req, map:req .byte connection_\direction .space 3 @ Padding .4byte \offset map \map .space 2 @ Padding .endm @ Defines the flags for a map header. Mirrors the layout of the bitfield in struct MapHeader in include/global.fieldmap.h .macro map_header_flags allow_cycling:req, allow_escaping:req, allow_running:req, show_map_name:req .byte \allow_cycling .byte ((\show_map_name & 1) << 2) | ((\allow_running & 1) << 1) | ((\allow_escaping & 1) << 0) .endm ================================================ FILE: asm/macros/movement.inc ================================================ .macro create_movement_action name:req, value:req .macro \name .byte \value .endm .endm create_movement_action face_down, MOVEMENT_ACTION_FACE_DOWN create_movement_action face_up, MOVEMENT_ACTION_FACE_UP create_movement_action face_left, MOVEMENT_ACTION_FACE_LEFT create_movement_action face_right, MOVEMENT_ACTION_FACE_RIGHT create_movement_action face_down_fast, MOVEMENT_ACTION_FACE_DOWN_FAST create_movement_action face_up_fast, MOVEMENT_ACTION_FACE_UP_FAST create_movement_action face_left_fast, MOVEMENT_ACTION_FACE_LEFT_FAST create_movement_action face_right_fast, MOVEMENT_ACTION_FACE_RIGHT_FAST create_movement_action walk_slower_down, MOVEMENT_ACTION_WALK_SLOWER_DOWN create_movement_action walk_slower_up, MOVEMENT_ACTION_WALK_SLOWER_UP create_movement_action walk_slower_left, MOVEMENT_ACTION_WALK_SLOWER_LEFT create_movement_action walk_slower_right, MOVEMENT_ACTION_WALK_SLOWER_RIGHT create_movement_action walk_slow_down, MOVEMENT_ACTION_WALK_SLOW_DOWN create_movement_action walk_slow_up, MOVEMENT_ACTION_WALK_SLOW_UP create_movement_action walk_slow_left, MOVEMENT_ACTION_WALK_SLOW_LEFT create_movement_action walk_slow_right, MOVEMENT_ACTION_WALK_SLOW_RIGHT create_movement_action walk_down, MOVEMENT_ACTION_WALK_NORMAL_DOWN create_movement_action walk_up, MOVEMENT_ACTION_WALK_NORMAL_UP create_movement_action walk_left, MOVEMENT_ACTION_WALK_NORMAL_LEFT create_movement_action walk_right, MOVEMENT_ACTION_WALK_NORMAL_RIGHT create_movement_action jump_2_down, MOVEMENT_ACTION_JUMP_2_DOWN create_movement_action jump_2_up, MOVEMENT_ACTION_JUMP_2_UP create_movement_action jump_2_left, MOVEMENT_ACTION_JUMP_2_LEFT create_movement_action jump_2_right, MOVEMENT_ACTION_JUMP_2_RIGHT create_movement_action delay_1, MOVEMENT_ACTION_DELAY_1 create_movement_action delay_2, MOVEMENT_ACTION_DELAY_2 create_movement_action delay_4, MOVEMENT_ACTION_DELAY_4 create_movement_action delay_8, MOVEMENT_ACTION_DELAY_8 create_movement_action delay_16, MOVEMENT_ACTION_DELAY_16 create_movement_action walk_fast_down, MOVEMENT_ACTION_WALK_FAST_DOWN create_movement_action walk_fast_up, MOVEMENT_ACTION_WALK_FAST_UP create_movement_action walk_fast_left, MOVEMENT_ACTION_WALK_FAST_LEFT create_movement_action walk_fast_right, MOVEMENT_ACTION_WALK_FAST_RIGHT create_movement_action walk_in_place_slow_down, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN create_movement_action walk_in_place_slow_up, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP create_movement_action walk_in_place_slow_left, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT create_movement_action walk_in_place_slow_right, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT create_movement_action walk_in_place_down, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN create_movement_action walk_in_place_up, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP create_movement_action walk_in_place_left, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT create_movement_action walk_in_place_right, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT create_movement_action walk_in_place_fast_down, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN create_movement_action walk_in_place_fast_up, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP create_movement_action walk_in_place_fast_left, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT create_movement_action walk_in_place_fast_right, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT create_movement_action walk_in_place_faster_down, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN create_movement_action walk_in_place_faster_up, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP create_movement_action walk_in_place_faster_left, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT create_movement_action walk_in_place_faster_right, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT create_movement_action ride_water_current_down, MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN create_movement_action ride_water_current_up, MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP create_movement_action ride_water_current_lefft, MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT create_movement_action ride_water_current_right, MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT create_movement_action walk_faster_down, MOVEMENT_ACTION_WALK_FASTER_DOWN create_movement_action walk_faster_up, MOVEMENT_ACTION_WALK_FASTER_UP create_movement_action walk_faster_left, MOVEMENT_ACTION_WALK_FASTER_LEFT create_movement_action walk_faster_right, MOVEMENT_ACTION_WALK_FASTER_RIGHT create_movement_action slide_down, MOVEMENT_ACTION_SLIDE_DOWN create_movement_action slide_up, MOVEMENT_ACTION_SLIDE_UP create_movement_action slide_left, MOVEMENT_ACTION_SLIDE_LEFT create_movement_action slide_right, MOVEMENT_ACTION_SLIDE_RIGHT create_movement_action player_run_down, MOVEMENT_ACTION_PLAYER_RUN_DOWN create_movement_action player_run_up, MOVEMENT_ACTION_PLAYER_RUN_UP create_movement_action player_run_left, MOVEMENT_ACTION_PLAYER_RUN_LEFT create_movement_action player_run_right, MOVEMENT_ACTION_PLAYER_RUN_RIGHT create_movement_action player_run_down_slow, MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW create_movement_action player_run_up_slow, MOVEMENT_ACTION_PLAYER_RUN_UP_SLOW create_movement_action player_run_left_slow, MOVEMENT_ACTION_PLAYER_RUN_LEFT_SLOW create_movement_action player_run_right_slow, MOVEMENT_ACTION_PLAYER_RUN_RIGHT_SLOW create_movement_action start_anim_in_direction, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION create_movement_action jump_special_down, MOVEMENT_ACTION_JUMP_SPECIAL_DOWN create_movement_action jump_special_up, MOVEMENT_ACTION_JUMP_SPECIAL_UP create_movement_action jump_special_left, MOVEMENT_ACTION_JUMP_SPECIAL_LEFT create_movement_action jump_special_right, MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT create_movement_action face_player, MOVEMENT_ACTION_FACE_PLAYER create_movement_action face_away_player, MOVEMENT_ACTION_FACE_AWAY_PLAYER create_movement_action lock_facing_direction, MOVEMENT_ACTION_LOCK_FACING_DIRECTION create_movement_action unlock_facing_direction, MOVEMENT_ACTION_UNLOCK_FACING_DIRECTION create_movement_action jump_down, MOVEMENT_ACTION_JUMP_DOWN create_movement_action jump_up, MOVEMENT_ACTION_JUMP_UP create_movement_action jump_left, MOVEMENT_ACTION_JUMP_LEFT create_movement_action jump_right, MOVEMENT_ACTION_JUMP_RIGHT create_movement_action jump_in_place_down, MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN create_movement_action jump_in_place_up, MOVEMENT_ACTION_JUMP_IN_PLACE_UP create_movement_action jump_in_place_left, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT create_movement_action jump_in_place_right, MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT create_movement_action jump_in_place_down_up, MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP create_movement_action jump_in_place_up_down, MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN create_movement_action jump_in_place_left_right, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT create_movement_action jump_in_place_right_left, MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT create_movement_action face_original_direction, MOVEMENT_ACTION_FACE_ORIGINAL_DIRECTION create_movement_action nurse_joy_bow, MOVEMENT_ACTION_NURSE_JOY_BOW_DOWN create_movement_action enable_jump_landing_ground_effect, MOVEMENT_ACTION_ENABLE_JUMP_LANDING_GROUND_EFFECT create_movement_action disable_jump_landing_ground_effect, MOVEMENT_ACTION_DISABLE_JUMP_LANDING_GROUND_EFFECT create_movement_action disable_anim, MOVEMENT_ACTION_DISABLE_ANIMATION create_movement_action restore_anim, MOVEMENT_ACTION_RESTORE_ANIMATION create_movement_action set_invisible, MOVEMENT_ACTION_SET_INVISIBLE create_movement_action set_visible, MOVEMENT_ACTION_SET_VISIBLE create_movement_action emote_exclamation_mark, MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK create_movement_action emote_question_mark, MOVEMENT_ACTION_EMOTE_QUESTION_MARK create_movement_action emote_x, MOVEMENT_ACTION_EMOTE_X create_movement_action emote_double_exclamation_mark, MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK create_movement_action emote_smile, MOVEMENT_ACTION_EMOTE_SMILE create_movement_action reveal_trainer, MOVEMENT_ACTION_REVEAL_TRAINER create_movement_action rock_smash_break, MOVEMENT_ACTION_ROCK_SMASH_BREAK create_movement_action cut_tree, MOVEMENT_ACTION_CUT_TREE create_movement_action set_fixed_priority, MOVEMENT_ACTION_SET_FIXED_PRIORITY create_movement_action clear_fixed_priority, MOVEMENT_ACTION_CLEAR_FIXED_PRIORITY create_movement_action init_affine_anim, MOVEMENT_ACTION_INIT_AFFINE_ANIM create_movement_action clear_affine_anim, MOVEMENT_ACTION_CLEAR_AFFINE_ANIM create_movement_action walk_down_start_affine, MOVEMENT_ACTION_WALK_DOWN_START_AFFINE create_movement_action walk_down_affine, MOVEMENT_ACTION_WALK_DOWN_AFFINE create_movement_action acro_wheelie_face_down, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN create_movement_action acro_wheelie_face_up, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP create_movement_action acro_wheelie_face_left, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT create_movement_action acro_wheelie_face_right, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT create_movement_action acro_pop_wheelie_down, MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN create_movement_action acro_pop_wheelie_up, MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP create_movement_action acro_pop_wheelie_left, MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT create_movement_action acro_pop_wheelie_right, MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT create_movement_action acro_end_wheelie_face_down, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN create_movement_action acro_end_wheelie_face_up, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP create_movement_action acro_end_wheelie_face_left, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT create_movement_action acro_end_wheelie_face_right, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT create_movement_action acro_wheelie_hop_face_down, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN create_movement_action acro_wheelie_hop_face_up, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP create_movement_action acro_wheelie_hop_face_left, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT create_movement_action acro_wheelie_hop_face_right, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT create_movement_action acro_wheelie_hop_down, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN create_movement_action acro_wheelie_hop_up, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP create_movement_action acro_wheelie_hop_left, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT create_movement_action acro_wheelie_hop_right, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT create_movement_action acro_wheelie_jump_down, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN create_movement_action acro_wheelie_jump_up, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP create_movement_action acro_wheelie_jump_left, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT create_movement_action acro_wheelie_jump_right, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT create_movement_action acro_wheelie_in_place_down, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN create_movement_action acro_wheelie_in_place_up, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP create_movement_action acro_wheelie_in_place_left, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT create_movement_action acro_wheelie_in_place_right, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT create_movement_action acro_pop_wheelie_move_down, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN create_movement_action acro_pop_wheelie_move_up, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP create_movement_action acro_pop_wheelie_move_left, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT create_movement_action acro_pop_wheelie_move_right, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT create_movement_action acro_wheelie_move_down, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN create_movement_action acro_wheelie_move_up, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP create_movement_action acro_wheelie_move_left, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT create_movement_action acro_wheelie_move_right, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT create_movement_action spin_down, MOVEMENT_ACTION_SPIN_DOWN create_movement_action spin_up, MOVEMENT_ACTION_SPIN_UP create_movement_action spin_left, MOVEMENT_ACTION_SPIN_LEFT create_movement_action spin_right, MOVEMENT_ACTION_SPIN_RIGHT create_movement_action raise_hand_and_stop, MOVEMENT_ACTION_RAISE_HAND_AND_STOP create_movement_action raise_hand_and_jump, MOVEMENT_ACTION_RAISE_HAND_AND_JUMP create_movement_action raise_hand_and_swim, MOVEMENT_ACTION_RAISE_HAND_AND_SWIM create_movement_action walk_slowest_down, MOVEMENT_ACTION_WALK_SLOWEST_DOWN create_movement_action walk_slowest_up, MOVEMENT_ACTION_WALK_SLOWEST_UP create_movement_action walk_slowest_left, MOVEMENT_ACTION_WALK_SLOWEST_LEFT create_movement_action walk_slowest_right, MOVEMENT_ACTION_WALK_SLOWEST_RIGHT create_movement_action shake_head_or_walk_in_place, MOVEMENT_ACTION_SHAKE_HEAD_OR_WALK_IN_PLACE create_movement_action glide_down, MOVEMENT_ACTION_GLIDE_DOWN create_movement_action glide_up, MOVEMENT_ACTION_GLIDE_UP create_movement_action glide_left, MOVEMENT_ACTION_GLIDE_LEFT create_movement_action glide_right, MOVEMENT_ACTION_GLIDE_RIGHT create_movement_action fly_up, MOVEMENT_ACTION_FLY_UP create_movement_action fly_down, MOVEMENT_ACTION_FLY_DOWN create_movement_action jump_special_with_effect_down, MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN create_movement_action jump_special_with_effect_up, MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_UP create_movement_action jump_special_with_effect_left, MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_LEFT create_movement_action jump_special_with_effect_right, MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_RIGHT create_movement_action step_end, MOVEMENT_ACTION_STEP_END ================================================ FILE: asm/macros/music_voice.inc ================================================ .macro voice_directsound base_midi_key:req, pan:req, sample_data_pointer:req, attack:req, decay:req, sustain:req, release:req .byte 0 _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release .endm .macro voice_directsound_no_resample base_midi_key:req, pan:req, sample_data_pointer:req, attack:req, decay:req, sustain:req, release:req .byte 8 _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release .endm .macro voice_directsound_alt base_midi_key:req, pan:req, sample_data_pointer:req, attack:req, decay:req, sustain:req, release:req .byte 16 _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release .endm .macro _voice_directsound base_midi_key:req, pan:req, sample_data_pointer:req, attack:req, decay:req, sustain:req, release:req .byte \base_midi_key .byte 0 .if \pan != 0 .byte (0x80 | \pan) .else .byte 0 .endif .4byte \sample_data_pointer .byte \attack .byte \decay .byte \sustain .byte \release .endm .macro voice_square_1 base_midi_key:req, pan:req, sweep:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req _voice_square_1 1, \base_midi_key, \pan, \sweep, \duty_cycle, \attack, \decay, \sustain, \release .endm .macro voice_square_1_alt base_midi_key:req, pan:req, sweep:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req _voice_square_1 9, \base_midi_key, \pan, \sweep, \duty_cycle, \attack, \decay, \sustain, \release .endm .macro _voice_square_1 type:req, base_midi_key:req, pan:req, sweep:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req .byte \type .byte \base_midi_key .if \pan != 0 .byte (0x80 | \pan) .else .byte 0 .endif .byte \sweep .byte (\duty_cycle & 0x3) .byte 0, 0, 0 .byte (\attack & 0x7) .byte (\decay & 0x7) .byte (\sustain & 0xF) .byte (\release & 0x7) .endm .macro voice_square_2 base_midi_key:req, pan:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req _voice_square_2 2, \base_midi_key, \pan, \duty_cycle, \attack, \decay, \sustain, \release .endm .macro voice_square_2_alt base_midi_key:req, pan:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req _voice_square_2 10, \base_midi_key, \pan, \duty_cycle, \attack, \decay, \sustain, \release .endm .macro _voice_square_2 type:req, base_midi_key:req, pan:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req .byte \type .byte \base_midi_key .if \pan != 0 .byte (0x80 | \pan) .else .byte 0 .endif .byte 0 .byte (\duty_cycle & 0x3) .byte 0, 0, 0 .byte (\attack & 0x7) .byte (\decay & 0x7) .byte (\sustain & 0xF) .byte (\release & 0x7) .endm .macro voice_programmable_wave base_midi_key:req, pan:req, wave_samples_pointer:req, attack:req, decay:req, sustain:req, release:req _voice_programmable_wave 3, \base_midi_key, \pan, \wave_samples_pointer, \attack, \decay, \sustain, \release .endm .macro voice_programmable_wave_alt base_midi_key:req, pan:req, wave_samples_pointer:req, attack:req, decay:req, sustain:req, release:req _voice_programmable_wave 11, \base_midi_key, \pan, \wave_samples_pointer, \attack, \decay, \sustain, \release .endm .macro _voice_programmable_wave type:req, base_midi_key:req, pan:req, wave_samples_pointer:req, attack:req, decay:req, sustain:req, release:req .byte \type .byte \base_midi_key .if \pan != 0 .byte (0x80 | \pan) .else .byte 0 .endif .byte 0 .4byte \wave_samples_pointer .byte (\attack & 0x7) .byte (\decay & 0x7) .byte (\sustain & 0xF) .byte (\release & 0x7) .endm .macro voice_noise base_midi_key:req, pan:req, period:req, attack:req, decay:req, sustain:req, release:req _voice_noise 4, \base_midi_key, \pan, \period, \attack, \decay, \sustain, \release .endm .macro voice_noise_alt base_midi_key:req, pan:req, period:req, attack:req, decay:req, sustain:req, release:req _voice_noise 12, \base_midi_key, \pan, \period, \attack, \decay, \sustain, \release .endm .macro _voice_noise type:req, base_midi_key:req, pan:req, period:req, attack:req, decay:req, sustain:req, release:req .byte \type .byte \base_midi_key .if \pan != 0 .byte (0x80 | \pan) .else .byte 0 .endif .byte 0 .byte (\period & 0x1) .byte 0, 0, 0 .byte (\attack & 0x7) .byte (\decay & 0x7) .byte (\sustain & 0xF) .byte (\release & 0x7) .endm .macro voice_keysplit voice_group_pointer:req, keysplit_table_pointer:req .byte 0x40, 0, 0, 0 .4byte \voice_group_pointer .4byte \keysplit_table_pointer .endm .macro voice_keysplit_all voice_group_pointer:req .byte 0x80, 0, 0, 0 .4byte \voice_group_pointer .4byte 0 .endm .macro cry sample:req .byte 0x20, 60, 0, 0 .4byte \sample .byte 0xff, 0, 0xff, 0 .endm .macro cry_reverse sample:req .byte 0x30, 60, 0, 0 .4byte \sample .byte 0xff, 0, 0xff, 0 .endm ================================================ FILE: asm/macros/trainer_tower.inc ================================================ @ Sets NPC gfx and the floor layout depending on current challenge and floor .macro ttower_initfloor setvar VAR_0x8004, TRAINER_TOWER_FUNC_INIT_FLOOR special CallTrainerTowerFunc .endm @ Buffers the opponents battle speech to gStringVar4. speech is any TRAINER_TOWER_TEXT_*. .macro ttower_getspeech speech:req, trainer=0xFF setvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_SPEECH setvar VAR_0x8005, \speech .if \trainer >= VARS_START && \trainer != 0xFF copyvar VAR_0x8006, \trainer .elseif \trainer != 0xFF setvar VAR_0x8006, \trainer .endif special CallTrainerTowerFunc .endm @ Starts a trainer tower battle. VAR_0x8005 is unused .macro ttower_dobattle setvar VAR_0x8004, TRAINER_TOWER_FUNC_DO_BATTLE setvar VAR_0x8005, 0 special CallTrainerTowerFunc .endm @ Returns the current challenge type (CHALLENGE_TYPE_*). Mixed challenges use different types for each floor. If VAR_0x8005 is != FALSE, does nothing .macro ttower_getchallengetype setvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_CHALLENGE_TYPE setvar VAR_0x8005, FALSE special CallTrainerTowerFunc .endm @ Adds 1 to the number of floors cleared (all trainers on floor defeated) .macro ttower_clearedfloor setvar VAR_0x8004, TRAINER_TOWER_FUNC_CLEARED_FLOOR special CallTrainerTowerFunc .endm @ TRUE if the trainers on this floor were already beaten, FALSE otherwise .macro ttower_isfloorcleared setvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_FLOOR_CLEARED special CallTrainerTowerFunc .endm @ Initializes the Trainer Tower challenge and starts the timer .macro ttower_startchallenge setvar VAR_0x8004, TRAINER_TOWER_FUNC_START_CHALLENGE special CallTrainerTowerFunc .endm @ 0 if not spoken to yet, 1 if spoken to but not received prize, 2 if received prize .macro ttower_getownerstate setvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_OWNER_STATE special CallTrainerTowerFunc .endm @ Tries to give prize. 0 if given successfully, 1 if no room for prize, 2 if giving prize should be skipped .macro ttower_giveprize setvar VAR_0x8004, TRAINER_TOWER_FUNC_GIVE_PRIZE special CallTrainerTowerFunc .endm @ Checks the final challenge time. 0 if new record, 1 if not, 2 if time has already been checked .macro ttower_checkfinaltime setvar VAR_0x8004, TRAINER_TOWER_FUNC_CHECK_FINAL_TIME special CallTrainerTowerFunc .endm @ Resumes the challenge timer (or starts, if the timer is 0) .macro ttower_resumetimer setvar VAR_0x8004, TRAINER_TOWER_FUNC_RESUME_TIMER special CallTrainerTowerFunc .endm @ Sets that the player lost the challenge .macro ttower_setlost setvar VAR_0x8004, TRAINER_TOWER_FUNC_SET_LOST special CallTrainerTowerFunc .endm @ Returns the status of the current Trainer Tower challenge (CHALLENGE_STATUS_*) .macro ttower_getchallengestatus setvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_CHALLENGE_STATUS special CallTrainerTowerFunc .endm @ Buffers the current challenge time (min in gStringVar1, sec in gStringVar2, fraction sec in gStringVar3) .macro ttower_gettime setvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_TIME special CallTrainerTowerFunc .endm @ Unused. Displays Trainer Tower results. Handled by ShowBattleRecords instead .macro ttower_showresults setvar VAR_0x8004, TRAINER_TOWER_FUNC_SHOW_RESULTS special CallTrainerTowerFunc .endm @ Unused. See above .macro ttower_closeresults setvar VAR_0x8004, TRAINER_TOWER_FUNC_CLOSE_RESULTS special CallTrainerTowerFunc .endm @ Returns the eligibility of the players party for a double battle (using GetMonsStateToDoubles) .macro ttower_checkdoubles setvar VAR_0x8004, TRAINER_TOWER_FUNC_CHECK_DOUBLES special CallTrainerTowerFunc .endm @ For the unused E-Reader challenges, gets the number of floors used. Otherwise returns FALSE (all floors used) .macro ttower_getnumfloors setvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_NUM_FLOORS special CallTrainerTowerFunc .endm @ Dummied, always returns FALSE .macro ttower_shouldexit setvar VAR_0x8004, TRAINER_TOWER_FUNC_SHOULD_WARP_TO_COUNTER special CallTrainerTowerFunc .endm @ Plays the encounter music for the trainer number in VAR_TEMP_1 .macro ttower_encountermusic setvar VAR_0x8004, TRAINER_TOWER_FUNC_ENCOUNTER_MUSIC special CallTrainerTowerFunc .endm @ TRUE if the player reached the Battle Tower owner, FALSE otherwise .macro ttower_getbeatchallenge setvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_BEAT_CHALLENGE special CallTrainerTowerFunc .endm ================================================ FILE: asm/macros.inc ================================================ .include "asm/macros/asm.inc" .include "asm/macros/function.inc" .include "asm/macros/movement.inc" .include "asm/macros/ec.inc" .include "asm/macros/map.inc" .include "asm/macros/m4a.inc" .include "asm/macros/trainer_tower.inc" .macro region_map_location x, y, width, height, name .byte \x .byte \y .byte \width .byte \height .4byte gMapName_\name .endm .macro obj_tiles address, uncompressed_size, tag .4byte \address .2byte \uncompressed_size .2byte \tag .endm .macro null_obj_tiles obj_tiles 0, 0, 0 .endm .macro obj_pal address, tag .4byte \address .2byte \tag .2byte 0 @ padding .endm .macro null_obj_pal obj_pal 0, 0 .endm .macro paired_pals tag, address .2byte \tag .2byte 0 @ padding .4byte \address .endm @ For object animation frames. .macro obj_frame_tiles address, uncompressed_size .4byte \address .2byte \uncompressed_size .2byte 0 @ padding .endm .macro spr_template tile_tag, pal_tag, oam, anims, images, affine_anims, callback .2byte \tile_tag .2byte \pal_tag .4byte \oam .4byte \anims .4byte \images .4byte \affine_anims .4byte \callback .endm @ Berry trees have a table defining the palette slot used for each of their 5 @ stages. However, the first 2 stages always use the same slots regardless of @ the type of tree and the slots of the last 3 stages always equal each other. .macro berry_tree_palette_slot_table slot .byte 3, 4, \slot, \slot, \slot .endm .macro subsprite x, y, priority, tile_num_offset, size .byte \x .byte \y .2byte ((\priority) << 14) | ((\tile_num_offset) << 4) | SPRITE_SIZE_\size .endm .macro obj_image_anim_frame pic_id, duration, flags = 0 .2byte \pic_id .byte (\flags) | (\duration) .byte 0 @ padding .endm .macro obj_image_anim_loop count .2byte 0xfffd .byte \count .byte 0 @ padding .endm .macro obj_image_anim_jump target_index .2byte 0xfffe .byte \target_index .byte 0 @ padding .endm .macro obj_image_anim_end .2byte 0xffff .2byte 0 @ padding .endm .macro obj_rot_scal_anim_frame delta_x_scale, delta_y_scale, delta_angle, duration .2byte \delta_x_scale .2byte \delta_y_scale .byte \delta_angle .byte \duration .2byte 0 @ padding .endm .macro obj_rot_scal_anim_loop count .2byte 0x7ffd .2byte \count .4byte 0 @ padding .endm .macro obj_rot_scal_anim_jump target_index .2byte 0x7ffe .2byte \target_index .4byte 0 @ padding .endm .macro obj_rot_scal_anim_end unknown=0 .2byte 0x7fff .2byte \unknown .fill 4 @ padding .endm .macro overworld_frame ptr:req, width:req, height:req, frame:req .4byte (\ptr + (\width * \height * \frame * 64) / 2) .2byte (\width * \height * 64) / 2 .2byte 0 @ padding .endm .macro credits_entry number, text .4byte \number .4byte \text .endm .macro door_anim_frame unknown, offset .byte \unknown .byte 0 @ padding .2byte \offset .endm .macro door_anim_gfx metatile_num, unknown, tile_addr, palette_addr .2byte \metatile_num .2byte \unknown .4byte \tile_addr .4byte \palette_addr .endm .macro trainer_eye_trainer opp_1, opp_2, opp_3, opp_4, opp_5, map_name .2byte OPPONENT_\opp_1 .2byte OPPONENT_\opp_2 .2byte OPPONENT_\opp_3 .2byte OPPONENT_\opp_4 .2byte OPPONENT_\opp_5 .2byte GROUP_\map_name .2byte MAP_\map_name .space 2 .endm .macro window_template bg, top, left, height, width, palno, baseBlock .byte \bg, \top, \left, \height, \width, \palno .2byte \baseBlock .endm .macro abspath relative .if REVISION == 0 .ascii "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/" .else .ascii "C:/WORK/POKeFRLG/Src/pm_lgfr_ose/source/" .endif .asciz "\relative" .endm ================================================ FILE: asmdiff.sh ================================================ #!/bin/bash if [ "$1" == "firered" ] || [ "$1" == "leafgreen" ] || [ "$1" == "firered_rev1" ] || [ "$1" == "leafgreen_rev1" ]; then buildname="$1" shift else buildname=firered fi if [ "$buildname" == "firered" ]; then baserom=baserom elif [ "$buildname" == "leafgreen" ]; then baserom=baserom_lg elif [ "$buildname" == "firered_rev1" ]; then baserom=baserom_fr_rev1 elif [ "$buildname" == "leafgreen_rev1" ]; then baserom=baserom_lg_rev1 else echo unknown buildname $buildname exit 1 fi OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb" OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))" $OBJDUMP $OPTIONS ${baserom}.gba > ${baserom}.dump || exit 1 $OBJDUMP $OPTIONS poke${buildname}.gba > poke${buildname}.dump diff -u ${baserom}.dump poke${buildname}.dump ================================================ FILE: build_tools.sh ================================================ #!/bin/sh make -C tools/aif2pcm CXX=${1:-g++} make -C tools/bin2c CXX=${1:-g++} make -C tools/gbafix CXX=${1:-g++} make -C tools/gbagfx CXX=${1:-g++} make -C tools/preproc CXX=${1:-g++} make -C tools/ramscrgen CXX=${1:-g++} make -C tools/rsfont CXX=${1:-g++} make -C tools/scaninc CXX=${1:-g++} make -C tools/mapjson CXX=${1:-g++} make -C tools/jsonproc CXX=${1:-g++} ================================================ FILE: charmap.txt ================================================ ' ' = 00 'À' = 01 'Á' = 02 'Â' = 03 'Ç' = 04 'È' = 05 'É' = 06 'Ê' = 07 'Ë' = 08 'Ì' = 09 'Î' = 0B 'Ï' = 0C 'Ò' = 0D 'Ó' = 0E 'Ô' = 0F 'Œ' = 10 'Ù' = 11 'Ú' = 12 'Û' = 13 'Ñ' = 14 'ß' = 15 'à' = 16 'á' = 17 'ç' = 19 'è' = 1A 'é' = 1B 'ê' = 1C 'ë' = 1D 'ì' = 1E 'î' = 20 'ï' = 21 'ò' = 22 'ó' = 23 'ô' = 24 'œ' = 25 'ù' = 26 'ú' = 27 'û' = 28 'ñ' = 29 'º' = 2A 'ª' = 2B SUPER_ER = 2C '&' = 2D '+' = 2E LV = 34 '=' = 35 ';' = 36 '¿' = 51 '¡' = 52 PK = 53 PKMN = 53 54 POKEBLOCK = 55 56 57 58 59 'Í' = 5A '%' = 5B '(' = 5C ')' = 5D 'â' = 68 'í' = 6F ARROW_SPACER = 78 UP_ARROW = 79 DOWN_ARROW = 7A LEFT_ARROW = 7B RIGHT_ARROW = 7C FONT_A_BUTTON = 7D SUPER_E = 84 '<' = 85 '>' = 86 SUPER_RE = A0 '0' = A1 '1' = A2 '2' = A3 '3' = A4 '4' = A5 '5' = A6 '6' = A7 '7' = A8 '8' = A9 '9' = AA '!' = AB '?' = AC '.' = AD '-' = AE '·' = AF '…' = B0 '“' = B1 '”' = B2 '‘' = B3 '’' = B4 '\'' = B4 '♂' = B5 '♀' = B6 '¥' = B7 ',' = B8 '×' = B9 '/' = BA 'A' = BB 'B' = BC 'C' = BD 'D' = BE 'E' = BF 'F' = C0 'G' = C1 'H' = C2 'I' = C3 'J' = C4 'K' = C5 'L' = C6 'M' = C7 'N' = C8 'O' = C9 'P' = CA 'Q' = CB 'R' = CC 'S' = CD 'T' = CE 'U' = CF 'V' = D0 'W' = D1 'X' = D2 'Y' = D3 'Z' = D4 'a' = D5 'b' = D6 'c' = D7 'd' = D8 'e' = D9 'f' = DA 'g' = DB 'h' = DC 'i' = DD 'j' = DE 'k' = DF 'l' = E0 'm' = E1 'n' = E2 'o' = E3 'p' = E4 'q' = E5 'r' = E6 's' = E7 't' = E8 'u' = E9 'v' = EA 'w' = EB 'x' = EC 'y' = ED 'z' = EE '▶' = EF ':' = F0 'Ä' = F1 'Ö' = F2 'Ü' = F3 'ä' = F4 'ö' = F5 'ü' = F6 @ Arrows at F7-FA are duplicates of 79-7C. Unused? TALL_PLUS = FC 0C FB '$' = FF @ Hiragana 'あ' = 01 'い' = 02 'う' = 03 'え' = 04 'お' = 05 'か' = 06 'き' = 07 'く' = 08 'け' = 09 'こ' = 0A 'さ' = 0B 'し' = 0C 'す' = 0D 'せ' = 0E 'そ' = 0F 'た' = 10 'ち' = 11 'つ' = 12 'て' = 13 'と' = 14 'な' = 15 'に' = 16 'ぬ' = 17 'ね' = 18 'の' = 19 'は' = 1A 'ひ' = 1B 'ふ' = 1C 'へ' = 1D 'ほ' = 1E 'ま' = 1F 'み' = 20 'む' = 21 'め' = 22 'も' = 23 'や' = 24 'ゆ' = 25 'よ' = 26 'ら' = 27 'り' = 28 'る' = 29 'れ' = 2A 'ろ' = 2B 'わ' = 2C 'を' = 2D 'ん' = 2E 'ぁ' = 2F 'ぃ' = 30 'ぅ' = 31 'ぇ' = 32 'ぉ' = 33 'ゃ' = 34 'ゅ' = 35 'ょ' = 36 'が' = 37 'ぎ' = 38 'ぐ' = 39 'げ' = 3A 'ご' = 3B 'ざ' = 3C 'じ' = 3D 'ず' = 3E 'ぜ' = 3F 'ぞ' = 40 'だ' = 41 'ぢ' = 42 'づ' = 43 'で' = 44 'ど' = 45 'ば' = 46 'び' = 47 'ぶ' = 48 'べ' = 49 'ぼ' = 4A 'ぱ' = 4B 'ぴ' = 4C 'ぷ' = 4D 'ぺ' = 4E 'ぽ' = 4F 'っ' = 50 @ Katakana 'ア' = 51 'イ' = 52 'ウ' = 53 'エ' = 54 'オ' = 55 'カ' = 56 'キ' = 57 'ク' = 58 'ケ' = 59 'コ' = 5A 'サ' = 5B 'シ' = 5C 'ス' = 5D 'セ' = 5E 'ソ' = 5F 'タ' = 60 'チ' = 61 'ツ' = 62 'テ' = 63 'ト' = 64 'ナ' = 65 'ニ' = 66 'ヌ' = 67 'ネ' = 68 'ノ' = 69 'ハ' = 6A 'ヒ' = 6B 'フ' = 6C 'ヘ' = 6D 'ホ' = 6E 'マ' = 6F 'ミ' = 70 'ム' = 71 'メ' = 72 'モ' = 73 'ヤ' = 74 'ユ' = 75 'ヨ' = 76 'ラ' = 77 'リ' = 78 'ル' = 79 'レ' = 7A 'ロ' = 7B 'ワ' = 7C 'ヲ' = 7D 'ン' = 7E 'ァ' = 7F 'ィ' = 80 'ゥ' = 81 'ェ' = 82 'ォ' = 83 'ャ' = 84 'ュ' = 85 'ョ' = 86 'ガ' = 87 'ギ' = 88 'グ' = 89 'ゲ' = 8A 'ゴ' = 8B 'ザ' = 8C 'ジ' = 8D 'ズ' = 8E 'ゼ' = 8F 'ゾ' = 90 'ダ' = 91 'ヂ' = 92 'ヅ' = 93 'デ' = 94 'ド' = 95 'バ' = 96 'ビ' = 97 'ブ' = 98 'ベ' = 99 'ボ' = 9A 'パ' = 9B 'ピ' = 9C 'プ' = 9D 'ペ' = 9E 'ポ' = 9F 'ッ' = A0 @ Japanese punctuation ' ' = 00 '!' = AB '?' = AC '。' = AD 'ー' = AE '‥' = B0 STRING = FD @ string placeholders PLAYER = FD 01 STR_VAR_1 = FD 02 STR_VAR_2 = FD 03 STR_VAR_3 = FD 04 KUN = FD 05 RIVAL = FD 06 @ version-dependent strings VERSION = FD 07 @ "RUBY" / "SAPPHIRE" EVIL_TEAM = FD 08 @ "MAGMA" / "AQUA" GOOD_TEAM = FD 09 @ "AQUA" / "MAGMA" EVIL_LEADER = FD 0A @ "MAXIE" / "ARCHIE" GOOD_LEADER = FD 0B @ "ARCHIE" / "MAXIE" EVIL_LEGENDARY = FD 0C @ "GROUDON" / "KYOGRE" GOOD_LEGENDARY = FD 0D @ "KYOGRE" / "GROUDON" @ battle macros UNKNOWN_STR = FD 00 ATTACKING_TRAINER = FD 08 DEFENDING_TRAINER = FD 09 ATTACKING_MON = FD 0C DEFENDING_MON = FD 0D @ battle string placeholders B_BUFF1 = FD 00 B_BUFF2 = FD 01 B_COPY_VAR_1 = FD 02 B_COPY_VAR_2 = FD 03 B_COPY_VAR_3 = FD 04 B_PLAYER_MON1_NAME = FD 05 B_OPPONENT_MON1_NAME = FD 06 B_PLAYER_MON2_NAME = FD 07 B_OPPONENT_MON2_NAME = FD 08 B_LINK_PLAYER_MON1_NAME = FD 09 B_LINK_OPPONENT_MON1_NAME = FD 0A B_LINK_PLAYER_MON2_NAME = FD 0B B_LINK_OPPONENT_MON2_NAME = FD 0C B_ATK_NAME_WITH_PREFIX_MON1 = FD 0D B_ATK_PARTNER_NAME = FD 0E B_ATK_NAME_WITH_PREFIX = FD 0F B_DEF_NAME_WITH_PREFIX = FD 10 B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler B_ACTIVE_NAME_WITH_PREFIX = FD 12 B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13 B_CURRENT_MOVE = FD 14 B_LAST_MOVE = FD 15 B_LAST_ITEM = FD 16 B_LAST_ABILITY = FD 17 B_ATK_ABILITY = FD 18 B_DEF_ABILITY = FD 19 B_SCR_ACTIVE_ABILITY = FD 1A B_EFF_ABILITY = FD 1B B_TRAINER1_CLASS = FD 1C B_TRAINER1_NAME = FD 1D B_LINK_PLAYER_NAME = FD 1E B_LINK_PARTNER_NAME = FD 1F B_LINK_OPPONENT1_NAME = FD 20 B_LINK_OPPONENT2_NAME = FD 21 B_LINK_SCR_TRAINER_NAME = FD 22 B_PLAYER_NAME = FD 23 B_TRAINER1_LOSE_TEXT = FD 24 B_TRAINER1_WIN_TEXT = FD 25 B_26 = FD 26 B_PC_CREATOR_NAME = FD 27 B_ATK_PREFIX1 = FD 28 B_DEF_PREFIX1 = FD 29 B_ATK_PREFIX2 = FD 2A B_DEF_PREFIX2 = FD 2B B_ATK_PREFIX3 = FD 2C B_DEF_PREFIX3 = FD 2D B_TRAINER2_LOSE_TEXT = FD 2E B_TRAINER2_WIN_TEXT = FD 2F B_BUFF3 = FD 30 @ indicates the end of a town/city name (before " TOWN" or " CITY") NAME_END = FC 00 @ special 0xF7 character DYNAMIC = F7 @ more text functions COLOR = FC 01 @ use a color listed below right after HIGHLIGHT = FC 02 @ same as fc 01 SHADOW = FC 03 @ same as fc 01 COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes PALETTE = FC 05 @ used in credits FONT = FC 06 @ Given a font id, or use font constants below instead RESET_FONT = FC 07 PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them PAUSE_UNTIL_PRESS = FC 09 WAIT_SE = FC 0A PLAY_BGM = FC 0B ESCAPE = FC 0C SHIFT_RIGHT = FC 0D SHIFT_DOWN = FC 0E FILL_WINDOW = FC 0F PLAY_SE = FC 10 CLEAR = FC 11 SKIP = FC 12 CLEAR_TO = FC 13 MIN_LETTER_SPACING = FC 14 JPN = FC 15 ENG = FC 16 PAUSE_MUSIC = FC 17 RESUME_MUSIC = FC 18 @ fonts FONT_SMALL = FC 06 00 FONT_NORMAL_COPY_1 = FC 06 01 FONT_NORMAL = FC 06 02 FONT_NORMAL_COPY_2 = FC 06 03 FONT_MALE = FC 06 04 FONT_FEMALE = FC 06 05 @ colors TRANSPARENT = 00 WHITE = 01 DARK_GRAY = 02 LIGHT_GRAY = 03 RED = 04 LIGHT_RED = 05 GREEN = 06 LIGHT_GREEN = 07 BLUE = 08 LIGHT_BLUE = 09 @ these next colors can be set to anything arbitrary at runtime @ usually though they'll have the textbox border colors as described below DYNAMIC_COLOR1 = 0A @ white DYNAMIC_COLOR2 = 0B @ white with a tinge of green DYNAMIC_COLOR3 = 0C @ white 2 DYNAMIC_COLOR4 = 0D @ aquamarine DYNAMIC_COLOR5 = 0E @ blue-green DYNAMIC_COLOR6 = 0F @ cerulean @ sound and music MUS_DUMMY = 00 00 SE_USE_ITEM = 01 00 SE_PC_LOGIN = 02 00 SE_PC_OFF = 03 00 SE_PC_ON = 04 00 SE_SELECT = 05 00 SE_WIN_OPEN = 06 00 SE_WALL_HIT = 07 00 SE_RS_DOOR = 08 00 SE_EXIT = 09 00 SE_LEDGE = 0A 00 SE_BIKE_BELL = 0B 00 SE_NOT_EFFECTIVE = 0C 00 SE_EFFECTIVE = 0D 00 SE_SUPER_EFFECTIVE = 0E 00 SE_BALL_OPEN = 0F 00 SE_FAINT = 10 00 SE_FLEE = 11 00 SE_SLIDING_DOOR = 12 00 SE_SHIP = 13 00 SE_BANG = 14 00 SE_PIN = 15 00 SE_BOO = 16 00 SE_BALL = 17 00 SE_CONTEST_PLACE = 18 00 SE_A = 19 00 SE_I = 1A 00 SE_U = 1B 00 SE_E = 1C 00 SE_O = 1D 00 SE_N = 1E 00 SE_SUCCESS = 1F 00 SE_FAILURE = 20 00 SE_EXP = 21 00 SE_BIKE_HOP = 22 00 SE_SWITCH = 23 00 SE_CLICK = 24 00 SE_FU_ZAKU = 25 00 SE_CONTEST_CONDITION_LOSE = 26 00 SE_LAVARIDGE_FALL_WARP = 27 00 SE_ICE_STAIRS = 28 00 SE_ICE_BREAK = 29 00 SE_ICE_CRACK = 2A 00 SE_FALL = 2B 00 SE_UNLOCK = 2C 00 SE_WARP_IN = 2D 00 SE_WARP_OUT = 2E 00 SE_REPEL = 2F 00 SE_ROTATING_GATE = 30 00 SE_TRUCK_MOVE = 31 00 SE_TRUCK_STOP = 32 00 SE_TRUCK_UNLOAD = 33 00 SE_TRUCK_DOOR = 34 00 SE_BERRY_BLENDER = 35 00 SE_CARD = 36 00 SE_SAVE = 37 00 SE_BALL_BOUNCE_1 = 38 00 SE_BALL_BOUNCE_2 = 39 00 SE_BALL_BOUNCE_3 = 3A 00 SE_BALL_BOUNCE_4 = 3B 00 SE_BALL_TRADE = 3C 00 SE_BALL_THROW = 3D 00 SE_NOTE_C = 3E 00 SE_NOTE_D = 3F 00 SE_NOTE_E = 40 00 SE_NOTE_F = 41 00 SE_NOTE_G = 42 00 SE_NOTE_A = 43 00 SE_NOTE_B = 44 00 SE_NOTE_C_HIGH = 45 00 SE_PUDDLE = 46 00 SE_BRIDGE_WALK = 47 00 SE_ITEMFINDER = 48 00 SE_DING_DONG = 49 00 SE_BALLOON_RED = 4A 00 SE_BALLOON_BLUE = 4B 00 SE_BALLOON_YELLOW = 4C 00 SE_BREAKABLE_DOOR = 4D 00 SE_MUD_BALL = 4E 00 SE_FIELD_POISON = 4F 00 SE_ESCALATOR = 50 00 SE_THUNDERSTORM = 51 00 SE_THUNDERSTORM_STOP = 52 00 SE_DOWNPOUR = 53 00 SE_DOWNPOUR_STOP = 54 00 SE_RAIN = 55 00 SE_RAIN_STOP = 56 00 SE_THUNDER = 57 00 SE_THUNDER2 = 58 00 SE_ELEVATOR = 59 00 SE_LOW_HEALTH = 5A 00 SE_EXP_MAX = 5B 00 SE_ROULETTE_BALL = 5C 00 SE_ROULETTE_BALL2 = 5D 00 SE_TAILLOW_WING_FLAP = 5E 00 SE_RS_SHOP = 5F 00 SE_CONTEST_HEART = 60 00 SE_CONTEST_CURTAIN_RISE = 61 00 SE_CONTEST_CURTAIN_FALL = 62 00 SE_CONTEST_ICON_CHANGE = 63 00 SE_CONTEST_ICON_CLEAR = 64 00 SE_CONTEST_MONS_TURN = 65 00 SE_SHINY = 66 00 SE_INTRO_BLAST = 67 00 SE_MUGSHOT = 68 00 SE_APPLAUSE = 69 00 SE_VEND = 6A 00 SE_ORB = 6B 00 SE_DEX_SCROLL = 6C 00 SE_DEX_PAGE = 6D 00 SE_POKENAV_ON = 6E 00 SE_POKENAV_OFF = 6F 00 SE_DEX_SEARCH = 70 00 SE_EGG_HATCH = 71 00 SE_BALL_TRAY_ENTER = 72 00 SE_BALL_TRAY_BALL = 73 00 SE_BALL_TRAY_EXIT = 74 00 SE_GLASS_FLUTE = 75 00 SE_M_THUNDERBOLT = 76 00 SE_M_THUNDERBOLT2 = 77 00 SE_M_HARDEN = 78 00 SE_M_NIGHTMARE = 79 00 SE_M_VITAL_THROW = 7A 00 SE_M_VITAL_THROW2 = 7B 00 SE_M_BUBBLE = 7C 00 SE_M_BUBBLE2 = 7D 00 SE_M_BUBBLE3 = 7E 00 SE_M_RAIN_DANCE = 7F 00 SE_M_CUT = 80 00 SE_M_STRING_SHOT = 81 00 SE_M_STRING_SHOT2 = 82 00 SE_M_ROCK_THROW = 83 00 SE_M_GUST = 84 00 SE_M_GUST2 = 85 00 SE_M_DOUBLE_SLAP = 86 00 SE_M_DOUBLE_TEAM = 87 00 SE_M_RAZOR_WIND = 88 00 SE_M_ICY_WIND = 89 00 SE_M_THUNDER_WAVE = 8A 00 SE_M_COMET_PUNCH = 8B 00 SE_M_MEGA_KICK = 8C 00 SE_M_MEGA_KICK2 = 8D 00 SE_M_CRABHAMMER = 8E 00 SE_M_JUMP_KICK = 8F 00 SE_M_FLAME_WHEEL = 90 00 SE_M_FLAME_WHEEL2 = 91 00 SE_M_FLAMETHROWER = 92 00 SE_M_FIRE_PUNCH = 93 00 SE_M_TOXIC = 94 00 SE_M_SACRED_FIRE = 95 00 SE_M_SACRED_FIRE2 = 96 00 SE_M_EMBER = 97 00 SE_M_TAKE_DOWN = 98 00 SE_M_BLIZZARD = 99 00 SE_M_BLIZZARD2 = 9A 00 SE_M_SCRATCH = 9B 00 SE_M_VICEGRIP = 9C 00 SE_M_WING_ATTACK = 9D 00 SE_M_FLY = 9E 00 SE_M_SAND_ATTACK = 9F 00 SE_M_RAZOR_WIND2 = A0 00 SE_M_BITE = A1 00 SE_M_HEADBUTT = A2 00 SE_M_SURF = A3 00 SE_M_HYDRO_PUMP = A4 00 SE_M_WHIRLPOOL = A5 00 SE_M_HORN_ATTACK = A6 00 SE_M_TAIL_WHIP = A7 00 SE_M_MIST = A8 00 SE_M_POISON_POWDER = A9 00 SE_M_BIND = AA 00 SE_M_DRAGON_RAGE = AB 00 SE_M_SING = AC 00 SE_M_PERISH_SONG = AD 00 SE_M_PAY_DAY = AE 00 SE_M_DIG = AF 00 SE_M_DIZZY_PUNCH = B0 00 SE_M_SELF_DESTRUCT = B1 00 SE_M_EXPLOSION = B2 00 SE_M_ABSORB_2 = B3 00 SE_M_ABSORB = B4 00 SE_M_SCREECH = B5 00 SE_M_BUBBLE_BEAM = B6 00 SE_M_BUBBLE_BEAM2 = B7 00 SE_M_SUPERSONIC = B8 00 SE_M_BELLY_DRUM = B9 00 SE_M_METRONOME = BA 00 SE_M_BONEMERANG = BB 00 SE_M_LICK = BC 00 SE_M_PSYBEAM = BD 00 SE_M_FAINT_ATTACK = BE 00 SE_M_SWORDS_DANCE = BF 00 SE_M_LEER = C0 00 SE_M_SWAGGER = C1 00 SE_M_SWAGGER2 = C2 00 SE_M_HEAL_BELL = C3 00 SE_M_CONFUSE_RAY = C4 00 SE_M_SNORE = C5 00 SE_M_BRICK_BREAK = C6 00 SE_M_GIGA_DRAIN = C7 00 SE_M_PSYBEAM2 = C8 00 SE_M_SOLAR_BEAM = C9 00 SE_M_PETAL_DANCE = CA 00 SE_M_TELEPORT = CB 00 SE_M_MINIMIZE = CC 00 SE_M_SKETCH = CD 00 SE_M_SWIFT = CE 00 SE_M_REFLECT = CF 00 SE_M_BARRIER = D0 00 SE_M_DETECT = D1 00 SE_M_LOCK_ON = D2 00 SE_M_MOONLIGHT = D3 00 SE_M_CHARM = D4 00 SE_M_CHARGE = D5 00 SE_M_STRENGTH = D6 00 SE_M_HYPER_BEAM = D7 00 SE_M_WATERFALL = D8 00 SE_M_REVERSAL = D9 00 SE_M_ACID_ARMOR = DA 00 SE_M_SANDSTORM = DB 00 SE_M_TRI_ATTACK = DC 00 SE_M_TRI_ATTACK2 = DD 00 SE_M_ENCORE = DE 00 SE_M_ENCORE2 = DF 00 SE_M_BATON_PASS = E0 00 SE_M_MILK_DRINK = E1 00 SE_M_ATTRACT = E2 00 SE_M_ATTRACT2 = E3 00 SE_M_MORNING_SUN = E4 00 SE_M_FLATTER = E5 00 SE_M_SAND_TOMB = E6 00 SE_M_GRASSWHISTLE = E7 00 SE_M_SPIT_UP = E8 00 SE_M_DIVE = E9 00 SE_M_EARTHQUAKE = EA 00 SE_M_TWISTER = EB 00 SE_M_SWEET_SCENT = EC 00 SE_M_YAWN = ED 00 SE_M_SKY_UPPERCUT = EE 00 SE_M_STAT_INCREASE = EF 00 SE_M_HEAT_WAVE = F0 00 SE_M_UPROAR = F1 00 SE_M_HAIL = F2 00 SE_M_COSMIC_POWER = F3 00 SE_M_TEETER_DANCE = F4 00 SE_M_STAT_DECREASE = F5 00 SE_M_HAZE = F6 00 SE_M_HYPER_BEAM2 = F7 00 SE_DOOR = F8 00 SE_CARD_FLIP = F9 00 SE_CARD_FLIPPING = FA 00 SE_CARD_OPEN = FB 00 SE_BAG_CURSOR = FC 00 SE_BAG_POCKET = FD 00 SE_BALL_CLICK = FE 00 SE_SHOP = FF 00 SE_SS_ANNE_HORN = 00 01 SE_HELP_OPEN = 01 01 SE_HELP_CLOSE = 02 01 SE_HELP_ERROR = 03 01 SE_DEOXYS_MOVE = 04 01 SE_POKE_JUMP_SUCCESS = 05 01 SE_POKE_JUMP_FAILURE = 06 01 SE_POKENAV_CALL = 07 01 SE_POKENAV_HANG_UP = 08 01 SE_ARENA_TIMEUP1 = 09 01 SE_ARENA_TIMEUP2 = 0A 01 SE_PIKE_CURTAIN_CLOSE = 0B 01 SE_PIKE_CURTAIN_OPEN = 0C 01 SE_SUDOWOODO_SHAKE = 0D 01 MUS_LITTLEROOT_TEST = 5E 01 MUS_GSC_ROUTE38 = 5F 01 MUS_RS_CAUGHT = 60 01 MUS_RS_VICTORY_WILD = 61 01 MUS_RS_VICTORY_GYM_LEADER = 62 01 MUS_VICTORY_LEAGUE = 63 01 MUS_C_COMM_CENTER = 64 01 MUS_GSC_PEWTER = 65 01 MUS_C_VS_LEGEND_BEAST = 66 01 MUS_ROUTE101 = 67 01 MUS_ROUTE110 = 68 01 MUS_ROUTE120 = 69 01 MUS_PETALBURG = 6A 01 MUS_OLDALE = 6B 01 MUS_RS_GYM = 6C 01 MUS_RS_SURF = 6D 01 MUS_PETALBURG_WOODS = 6E 01 MUS_LEVEL_UP = 6F 01 MUS_RS_HEAL = 70 01 MUS_OBTAIN_BADGE = 71 01 MUS_OBTAIN_ITEM = 72 01 MUS_EVOLVED = 73 01 MUS_OBTAIN_TMHM = 74 01 MUS_LILYCOVE_MUSEUM = 75 01 MUS_ROUTE122 = 76 01 MUS_OCEANIC_MUSEUM = 77 01 MUS_EVOLUTION_INTRO = 78 01 MUS_EVOLUTION = 79 01 MUS_MOVE_DELETED = 7A 01 MUS_RS_ENCOUNTER_GIRL = 7B 01 MUS_ENCOUNTER_MALE = 7C 01 MUS_ABANDONED_SHIP = 7D 01 MUS_FORTREE = 7E 01 MUS_BIRCH_LAB = 7F 01 MUS_B_TOWER_RS = 80 01 MUS_ENCOUNTER_SWIMMER = 81 01 MUS_CAVE_OF_ORIGIN = 82 01 MUS_OBTAIN_BERRY = 83 01 MUS_AWAKEN_LEGEND = 84 01 MUS_SLOTS_JACKPOT = 85 01 MUS_SLOTS_WIN = 86 01 MUS_TOO_BAD = 87 01 MUS_ROULETTE = 88 01 MUS_LINK_CONTEST_P1 = 89 01 MUS_LINK_CONTEST_P2 = 8A 01 MUS_LINK_CONTEST_P3 = 8B 01 MUS_LINK_CONTEST_P4 = 8C 01 MUS_ENCOUNTER_RICH = 8D 01 MUS_VERDANTURF = 8E 01 MUS_RUSTBORO = 8F 01 MUS_RS_POKE_CENTER = 90 01 MUS_ROUTE104 = 91 01 MUS_ROUTE119 = 92 01 MUS_RS_CYCLING = 93 01 MUS_POKE_MART = 94 01 MUS_LITTLEROOT = 95 01 MUS_MT_CHIMNEY = 96 01 MUS_ENCOUNTER_FEMALE = 97 01 MUS_LILYCOVE = 98 01 MUS_ROUTE111 = 99 01 MUS_HELP = 9A 01 MUS_UNDERWATER = 9B 01 MUS_RS_VICTORY_TRAINER = 9C 01 MUS_RS_TITLE = 9D 01 MUS_INTRO = 9E 01 MUS_ENCOUNTER_MAY = 9F 01 MUS_ENCOUNTER_INTENSE = A0 01 MUS_ENCOUNTER_COOL = A1 01 MUS_ROUTE113 = A2 01 MUS_ENCOUNTER_AQUA = A3 01 MUS_RS_FOLLOW_ME = A4 01 MUS_ENCOUNTER_BRENDAN = A5 01 MUS_EVER_GRANDE = A6 01 MUS_ENCOUNTER_SUSPICIOUS = A7 01 MUS_VICTORY_AQUA_MAGMA = A8 01 MUS_CABLE_CAR = A9 01 MUS_RS_GAME_CORNER = AA 01 MUS_DEWFORD = AB 01 MUS_SAFARI_ZONE = AC 01 MUS_RS_VICTORY_ROAD = AD 01 MUS_AQUA_MAGMA_HIDEOUT = AE 01 MUS_SAILING = AF 01 MUS_MT_PYRE = B0 01 MUS_SLATEPORT = B1 01 MUS_MT_PYRE_EXTERIOR = B2 01 MUS_SCHOOL = B3 01 MUS_RS_HALL_OF_FAME = B4 01 MUS_FALLARBOR = B5 01 MUS_SEALED_CHAMBER = B6 01 MUS_CONTEST_WINNER = B7 01 MUS_CONTEST = B8 01 MUS_ENCOUNTER_MAGMA = B9 01 MUS_INTRO_BATTLE = BA 01 MUS_ABNORMAL_WEATHER = BB 01 MUS_WEATHER_GROUDON = BC 01 MUS_SOOTOPOLIS = BD 01 MUS_CONTEST_RESULTS = BE 01 MUS_HALL_OF_FAME_ROOM = BF 01 MUS_TRICK_HOUSE = C0 01 MUS_ENCOUNTER_TWINS = C1 01 MUS_ENCOUNTER_ELITE_FOUR = C2 01 MUS_ENCOUNTER_HIKER = C3 01 MUS_CONTEST_LOBBY = C4 01 MUS_ENCOUNTER_INTERVIEWER = C5 01 MUS_ENCOUNTER_CHAMPION = C6 01 MUS_RS_CREDITS = C7 01 MUS_END = C8 01 MUS_B_FRONTIER = C9 01 MUS_B_ARENA = CA 01 MUS_OBTAIN_B_POINTS = CB 01 MUS_REGISTER_MATCH_CALL = CC 01 MUS_B_PYRAMID = CD 01 MUS_B_PYRAMID_TOP = CE 01 MUS_B_PALACE = CF 01 MUS_RAYQUAZA_APPEARS = D0 01 MUS_B_TOWER = D1 01 MUS_OBTAIN_SYMBOL = D2 01 MUS_B_DOME = D3 01 MUS_B_PIKE = D4 01 MUS_B_FACTORY = D5 01 MUS_VS_RAYQUAZA = D6 01 MUS_VS_FRONTIER_BRAIN = D7 01 MUS_VS_MEW = D8 01 MUS_B_DOME_LOBBY = D9 01 MUS_RS_VS_WILD = DA 01 MUS_VS_AQUA_MAGMA = DB 01 MUS_RS_VS_TRAINER = DC 01 MUS_RS_VS_GYM_LEADER = DD 01 MUS_RS_VS_CHAMPION = DE 01 MUS_VS_REGI = DF 01 MUS_VS_KYOGRE_GROUDON = E0 01 MUS_VS_RIVAL = E1 01 MUS_VS_ELITE_FOUR = E2 01 MUS_VS_AQUA_MAGMA_LEADER = E3 01 MUS_FOLLOW_ME = E4 01 MUS_GAME_CORNER = E5 01 MUS_ROCKET_HIDEOUT = E6 01 MUS_GYM = E7 01 MUS_JIGGLYPUFF = E8 01 MUS_INTRO_FIGHT = E9 01 MUS_TITLE = EA 01 MUS_CINNABAR = EB 01 MUS_LAVENDER = EC 01 MUS_HEAL = ED 01 MUS_CYCLING = EE 01 MUS_ENCOUNTER_ROCKET = EF 01 MUS_ENCOUNTER_GIRL = F0 01 MUS_ENCOUNTER_BOY = F1 01 MUS_HALL_OF_FAME = F2 01 MUS_VIRIDIAN_FOREST = F3 01 MUS_MT_MOON = F4 01 MUS_POKE_MANSION = F5 01 MUS_CREDITS = F6 01 MUS_ROUTE1 = F7 01 MUS_ROUTE24 = F8 01 MUS_ROUTE3 = F9 01 MUS_ROUTE11 = FA 01 MUS_VICTORY_ROAD = FB 01 MUS_VS_GYM_LEADER = FC 01 MUS_VS_TRAINER = FD 01 MUS_VS_WILD = FE 01 MUS_VS_CHAMPION = FF 01 MUS_PALLET = 00 02 MUS_OAK_LAB = 01 02 MUS_OAK = 02 02 MUS_POKE_CENTER = 03 02 MUS_SS_ANNE = 04 02 MUS_SURF = 05 02 MUS_POKE_TOWER = 06 02 MUS_SILPH = 07 02 MUS_FUCHSIA = 08 02 MUS_CELADON = 09 02 MUS_VICTORY_TRAINER = 0A 02 MUS_VICTORY_WILD = 0B 02 MUS_VICTORY_GYM_LEADER = 0C 02 MUS_VERMILLION = 0D 02 MUS_PEWTER = 0E 02 MUS_ENCOUNTER_RIVAL = 0F 02 MUS_RIVAL_EXIT = 10 02 MUS_DEX_RATING = 11 02 MUS_OBTAIN_KEY_ITEM = 12 02 MUS_CAUGHT_INTRO = 13 02 MUS_PHOTO = 14 02 MUS_GAME_FREAK = 15 02 MUS_CAUGHT = 16 02 MUS_NEW_GAME_INSTRUCT = 17 02 MUS_NEW_GAME_INTRO = 18 02 MUS_NEW_GAME_EXIT = 19 02 MUS_POKE_JUMP = 1A 02 MUS_UNION_ROOM = 1B 02 MUS_NET_CENTER = 1C 02 MUS_MYSTERY_GIFT = 1D 02 MUS_BERRY_PICK = 1E 02 MUS_SEVII_CAVE = 1F 02 MUS_TEACHY_TV_SHOW = 20 02 MUS_SEVII_ROUTE = 21 02 MUS_SEVII_DUNGEON = 22 02 MUS_SEVII_123 = 23 02 MUS_SEVII_45 = 24 02 MUS_SEVII_67 = 25 02 MUS_POKE_FLUTE = 26 02 MUS_VS_DEOXYS = 27 02 MUS_VS_MEWTWO = 28 02 MUS_VS_LEGEND = 29 02 MUS_ENCOUNTER_GYM_LEADER = 2A 02 MUS_ENCOUNTER_DEOXYS = 2B 02 MUS_TRAINER_TOWER = 2C 02 MUS_SLOW_PALLET = 2D 02 MUS_TEACHY_TV_MENU = 2E 02 PH_TRAP_BLEND = 2F 02 PH_TRAP_HELD = 30 02 PH_TRAP_SOLO = 31 02 PH_FACE_BLEND = 32 02 PH_FACE_HELD = 33 02 PH_FACE_SOLO = 34 02 PH_CLOTH_BLEND = 35 02 PH_CLOTH_HELD = 36 02 PH_CLOTH_SOLO = 37 02 PH_DRESS_BLEND = 38 02 PH_DRESS_HELD = 39 02 PH_DRESS_SOLO = 3A 02 PH_FLEECE_BLEND = 3B 02 PH_FLEECE_HELD = 3C 02 PH_FLEECE_SOLO = 3D 02 PH_KIT_BLEND = 3E 02 PH_KIT_HELD = 3F 02 PH_KIT_SOLO = 40 02 PH_PRICE_BLEND = 41 02 PH_PRICE_HELD = 42 02 PH_PRICE_SOLO = 43 02 PH_LOT_BLEND = 44 02 PH_LOT_HELD = 45 02 PH_LOT_SOLO = 46 02 PH_GOAT_BLEND = 47 02 PH_GOAT_HELD = 48 02 PH_GOAT_SOLO = 49 02 PH_THOUGHT_BLEND = 4A 02 PH_THOUGHT_HELD = 4B 02 PH_THOUGHT_SOLO = 4C 02 PH_CHOICE_BLEND = 4D 02 PH_CHOICE_HELD = 4E 02 PH_CHOICE_SOLO = 4F 02 PH_MOUTH_BLEND = 50 02 PH_MOUTH_HELD = 51 02 PH_MOUTH_SOLO = 52 02 PH_FOOT_BLEND = 53 02 PH_FOOT_HELD = 54 02 PH_FOOT_SOLO = 55 02 PH_GOOSE_BLEND = 56 02 PH_GOOSE_HELD = 57 02 PH_GOOSE_SOLO = 58 02 PH_STRUT_BLEND = 59 02 PH_STRUT_HELD = 5A 02 PH_STRUT_SOLO = 5B 02 PH_CURE_BLEND = 5C 02 PH_CURE_HELD = 5D 02 PH_CURE_SOLO = 5E 02 PH_NURSE_BLEND = 5F 02 PH_NURSE_HELD = 60 02 PH_NURSE_SOLO = 61 02 A_BUTTON = F8 00 B_BUTTON = F8 01 L_BUTTON = F8 02 R_BUTTON = F8 03 START_BUTTON = F8 04 SELECT_BUTTON = F8 05 DPAD_UP = F8 06 DPAD_DOWN = F8 07 DPAD_LEFT = F8 08 DPAD_RIGHT = F8 09 DPAD_UPDOWN = F8 0A DPAD_LEFTRIGHT = F8 0B DPAD_ANY = F8 0C UP_ARROW_2 = F9 00 DOWN_ARROW_2 = F9 01 LEFT_ARROW_2 = F9 02 RIGHT_ARROW_2 = F9 03 PLUS = F9 04 LV_2 = F9 05 PP = F9 06 ID = F9 07 NO = F9 08 UNDERSCORE = F9 09 CIRCLE_1 = F9 0A CIRCLE_2 = F9 0B CIRCLE_3 = F9 0C CIRCLE_4 = F9 0D CIRCLE_5 = F9 0E CIRCLE_6 = F9 0F CIRCLE_7 = F9 10 CIRCLE_8 = F9 11 CIRCLE_9 = F9 12 LEFT_PAREN = F9 13 RIGHT_PAREN = F9 14 CIRCLE_DOT = F9 15 TRIANGLE = F9 16 BIG_MULT_X = F9 17 EMOJI_UNDERSCORE = F9 D0 EMOJI_PIPE = F9 D1 EMOJI_HIGHBAR = F9 D2 EMOJI_TILDE = F9 D3 EMOJI_LEFT_PAREN = F9 D4 EMOJI_RIGHT_PAREN = F9 D5 EMOJI_UNION = F9 D6 @ ⊂ EMOJI_GREATER_THAN = F9 D7 EMOJI_LEFT_EYE = F9 D8 EMOJI_RIGHT_EYE = F9 D9 EMOJI_AT = F9 DA EMOJI_SEMICOLON = F9 DB EMOJI_PLUS = F9 DC EMOJI_MINUS = F9 DD EMOJI_EQUALS = F9 DE EMOJI_SPIRAL = F9 DF EMOJI_TONGUE = F9 E0 EMOJI_TRIANGLE_OUTLINE = F9 E1 EMOJI_ACUTE = F9 E2 EMOJI_GRAVE = F9 E3 EMOJI_CIRCLE = F9 E4 EMOJI_TRIANGLE = F9 E5 EMOJI_SQUARE = F9 E6 EMOJI_HEART = F9 E7 EMOJI_MOON = F9 E8 EMOJI_NOTE = F9 E9 EMOJI_BALL = F9 EA EMOJI_BOLT = F9 EB EMOJI_LEAF = F9 EC EMOJI_FIRE = F9 ED EMOJI_WATER = F9 EE EMOJI_LEFT_FIST = F9 EF EMOJI_RIGHT_FIST = F9 F0 EMOJI_BIGWHEEL = F9 F1 EMOJI_SMALLWHEEL = F9 F2 EMOJI_SPHERE = F9 F3 EMOJI_IRRITATED = F9 F4 EMOJI_MISCHIEVOUS = F9 F5 EMOJI_HAPPY = F9 F6 EMOJI_ANGRY = F9 F7 EMOJI_SURPRISED = F9 F8 EMOJI_BIGSMILE = F9 F9 EMOJI_EVIL = F9 FA EMOJI_TIRED = F9 FB EMOJI_NEUTRAL = F9 FC EMOJI_SHOCKED = F9 FD EMOJI_BIGANGER = F9 FE '\l' = FA @ scroll up window text '\p' = FB @ new paragraph '\n' = FE @ new line ================================================ FILE: common_syms/AgbRfu_LinkManager.txt ================================================ lman ================================================ FILE: common_syms/agb_flash.txt ================================================ gFlashTimeoutFlag PollFlashStatus WaitForFlashWrite ProgramFlashSector gFlash ProgramFlashByte gFlashNumRemainingBytes EraseFlashChip EraseFlashSector gFlashMaxTime ================================================ FILE: common_syms/battle_anim_special.txt ================================================ gMonShrinkDuration gMonShrinkDelta gMonShrinkDistance ================================================ FILE: common_syms/battle_controller_pokedude.txt ================================================ gPokedudeBattlerStates ================================================ FILE: common_syms/battle_main.txt ================================================ gPreBattleCallback1 gBattleMainFunc gBattleResults gLeveledUpInBattle gBattlerControllerFuncs gHealthboxSpriteIds gMultiUsePlayerCursor gNumberOfMovesToChoose gBattleControllerData ================================================ FILE: common_syms/berry_fix_program.txt ================================================ gMultibootStart gMultibootStatus gMultibootSize gMultibootParam ================================================ FILE: common_syms/bg.txt ================================================ gWindowTileAutoAllocEnabled ================================================ FILE: common_syms/cable_club.txt ================================================ UnusedVarNeededToMatch ================================================ FILE: common_syms/ereader_screen.txt ================================================ gEReaderData ================================================ FILE: common_syms/event_data.txt ================================================ gLastQuestLogStoredFlagOrVarIdx ================================================ FILE: common_syms/evolution_scene.txt ================================================ gCB2_AfterEvolution ================================================ FILE: common_syms/fame_checker.txt ================================================ gFameChecker_ListMenuTemplate gIconDescriptionBoxIsOpen ================================================ FILE: common_syms/field_camera.txt ================================================ gFieldCamera gTotalCameraPixelOffsetY gTotalCameraPixelOffsetX ================================================ FILE: common_syms/field_control_avatar.txt ================================================ gFieldInputRecord ================================================ FILE: common_syms/field_specials.txt ================================================ sFieldSpecialsListMenuTemplate sFieldSpecialsListMenuScrollBuffer ================================================ FILE: common_syms/fieldmap.txt ================================================ VMap ================================================ FILE: common_syms/help_system.txt ================================================ gHelpSystemState gHelpContextIdBackup ================================================ FILE: common_syms/help_system_util.txt ================================================ gHelpSystemEnabled ================================================ FILE: common_syms/image_processing_effects.txt ================================================ gCanvasColumnStart gCanvasPixels gCanvasRowEnd gCanvasHeight gCanvasColumnEnd gCanvasRowStart gCanvasMonPersonality gCanvasWidth gCanvasPalette gCanvasPaletteStart ================================================ FILE: common_syms/librfu_rfu.txt ================================================ gRfuSlotStatusUNI gRfuSlotStatusNI gRfuLinkStatus gRfuStatic gRfuFixed ================================================ FILE: common_syms/librfu_sio32id.txt ================================================ gRfuSIO32Id ================================================ FILE: common_syms/librfu_stwi.txt ================================================ gSTWIStatus ================================================ FILE: common_syms/link.txt ================================================ gLinkPartnersHeldKeys gLinkDebugSeed gLocalLinkPlayerBlock gLinkErrorOccurred gLinkDebugFlags gLinkFiller1 gRemoteLinkPlayersNotReceived gBlockReceivedStatus gLinkFiller2 gLinkHeldKeys gRecvCmds gLinkStatus gLinkDummy1 gLinkDummy2 gReadyToExitStandby gReadyToCloseLink gReadyCloseLinkType gSuppressLinkErrorMessage gWirelessCommType gSavedLinkPlayerCount gSendCmd gSavedMultiplayerId gReceivedRemoteLinkPlayers gLinkTestBGInfo gLinkCallback gShouldAdvanceLinkState gLinkTestBlockChecksums gBlockRequestType gLinkFiller3 gLinkFiller4 gLinkFiller5 gLastSendQueueCount gLink gLastRecvQueueCount gLinkSavedIme ================================================ FILE: common_syms/link_rfu_2.txt ================================================ gHostRfuGameData gRfu gHostRfuUsername ================================================ FILE: common_syms/list_menu.txt ================================================ gListMenuOverride gMultiuseListMenuTemplate ================================================ FILE: common_syms/load_save.txt ================================================ gFlashMemoryPresent gSaveBlock1Ptr gSaveBlock2Ptr gPokemonStoragePtr ================================================ FILE: common_syms/m4a.txt ================================================ gSoundInfo gPokemonCrySongs gPokemonCryMusicPlayers gMPlayJumpTable gCgbChans gPokemonCryTracks gPokemonCrySong gMPlayInfo_BGM gMPlayInfo_SE1 gMPlayInfo_SE2 gMPlayMemAccArea gMPlayInfo_SE3 ================================================ FILE: common_syms/main.txt ================================================ gKeyRepeatStartDelay gLinkTransferringData gMain gKeyRepeatContinueDelay gSoftResetDisabled gIntrTable sVcountAfterSound gLinkVSyncDisabled IntrMain_Buffer sVcountAtIntr sVcountBeforeSound gPcmDmaCounter ================================================ FILE: common_syms/overworld.txt ================================================ gBGTilemapBuffers1 gBGTilemapBuffers2 gBGTilemapBuffers3 gFieldCallback gFieldCallback2 gHeldKeyCodeToSend gLocalLinkPlayerId gFieldLinkPlayerCount ================================================ FILE: common_syms/party_menu.txt ================================================ gItemUseCB ================================================ FILE: common_syms/quest_log.txt ================================================ gQuestLogPlaybackState sMaxActionsInScene gQuestLogFieldInput sCurSceneActions ================================================ FILE: common_syms/random.txt ================================================ gRngValue gRng2Value ================================================ FILE: common_syms/save.txt ================================================ gLastWrittenSector gLastSaveCounter gLastKnownGoodSector gDamagedSaveSectors gSaveCounter gSaveDataBufferPtr gIncrementalSectorId gSaveUnusedVar gSaveFileStatus gGameContinueCallback gRamSaveSectorLocations gSaveAttemptStatus ================================================ FILE: common_syms/save_failed_screen.txt ================================================ sIsInSaveFailedScreen ================================================ FILE: common_syms/scrcmd.txt ================================================ sQuestLogScriptContextPtr gSelectedObjectEvent ================================================ FILE: common_syms/sound.txt ================================================ gDisableMusic ================================================ FILE: common_syms/sprite.txt ================================================ gOamMatrixAllocBitmap gReservedSpritePaletteCount ================================================ FILE: common_syms/task.txt ================================================ gTasks ================================================ FILE: common_syms/text.txt ================================================ gTextFlags ================================================ FILE: common_syms/text_printer.txt ================================================ gFonts gGlyphInfo ================================================ FILE: common_syms/window.txt ================================================ gWindowClearTile gWindowBgTilemapBuffers ================================================ FILE: compare.sh ================================================ #!/bin/bash # Compares baserom.gba and pokefirered.gba # create baserom_compare.dump if necessary if [ ! -f baserom_compare.dump ]; then hexdump -C baserom.gba > baserom_compare.dump # can create an empty baserom_compare.dump if no baserom.gba fi hexdump -C pokefirered.gba > pokefirered_compare.dump diff -u baserom_compare.dump pokefirered_compare.dump | less ================================================ FILE: config.mk ================================================ # Default variables GAME_VERSION ?= FIRERED GAME_REVISION ?= 0 GAME_LANGUAGE ?= ENGLISH MODERN ?= 0 COMPARE ?= 0 # For gbafix MAKER_CODE := 01 # Version ifeq ($(GAME_VERSION),FIRERED) TITLE := POKEMON FIRE GAME_CODE := BPR BUILD_NAME := firered else ifeq ($(GAME_VERSION),LEAFGREEN) TITLE := POKEMON LEAF GAME_CODE := BPG BUILD_NAME := leafgreen else $(error unknown version $(GAME_VERSION)) endif endif # Revision ifeq ($(GAME_REVISION),0) BUILD_NAME := $(BUILD_NAME) else ifeq ($(GAME_REVISION),1) BUILD_NAME := $(BUILD_NAME)_rev1 else $(error unknown revision $(GAME_REVISION)) endif endif # Language ifeq ($(GAME_LANGUAGE),ENGLISH) BUILD_NAME := $(BUILD_NAME) GAME_CODE := $(GAME_CODE)E else $(error unknown language $(GAME_LANGUAGE)) endif # Modern GCC ifeq ($(MODERN), 0) BUILD_NAME := $(BUILD_NAME) else BUILD_NAME := $(BUILD_NAME)_modern endif ================================================ FILE: constants/constants.inc ================================================ .include "constants/gba_constants.inc" .include "constants/misc_constants.inc" ================================================ FILE: constants/gba_constants.inc ================================================ .set PSR_USR_MODE, 0x00000010 .set PSR_FIQ_MODE, 0x00000011 .set PSR_IRQ_MODE, 0x00000012 .set PSR_SVC_MODE, 0x00000013 .set PSR_ABT_MODE, 0x00000017 .set PSR_UND_MODE, 0x0000001b .set PSR_SYS_MODE, 0x0000001f .set PSR_MODE_MASK, 0x0000001f .set PSR_T_BIT, 0x00000020 .set PSR_F_BIT, 0x00000040 .set PSR_I_BIT, 0x00000080 .set EWRAM_START, 0x02000000 .set EWRAM_END, EWRAM_START + 0x40000 .set IWRAM_START, 0x03000000 .set IWRAM_END, IWRAM_START + 0x8000 .set PLTT, 0x5000000 .set BG_PLTT, PLTT .set OBJ_PLTT, PLTT + 0x200 .set VRAM, 0x6000000 .set BG_VRAM, VRAM .set OBJ_VRAM0, VRAM + 0x10000 @ text-mode BG .set OBJ_VRAM1, VRAM + 0x14000 @ bitmap-mode BG .set OAM, 0x7000000 .set SOUND_INFO_PTR, 0x3007FF0 .set INTR_CHECK, 0x3007FF8 .set INTR_VECTOR, 0x3007FFC .set INTR_FLAG_VBLANK, 1 << 0 .set INTR_FLAG_HBLANK, 1 << 1 .set INTR_FLAG_VCOUNT, 1 << 2 .set INTR_FLAG_TIMER0, 1 << 3 .set INTR_FLAG_TIMER1, 1 << 4 .set INTR_FLAG_TIMER2, 1 << 5 .set INTR_FLAG_TIMER3, 1 << 6 .set INTR_FLAG_SERIAL, 1 << 7 .set INTR_FLAG_DMA0, 1 << 8 .set INTR_FLAG_DMA1, 1 << 9 .set INTR_FLAG_DMA2, 1 << 10 .set INTR_FLAG_DMA3, 1 << 11 .set INTR_FLAG_KEYPAD, 1 << 12 .set INTR_FLAG_GAMEPAK, 1 << 13 .set VCOUNT_VBLANK, 160 .set TOTAL_SCANLINES, 228 .set REG_BASE, 0x4000000 @ I/O register base address @ I/O register offsets .set OFFSET_REG_DISPCNT, 0x0 .set OFFSET_REG_DISPSTAT, 0x4 .set OFFSET_REG_VCOUNT, 0x6 .set OFFSET_REG_BG0CNT, 0x8 .set OFFSET_REG_BG1CNT, 0xa .set OFFSET_REG_BG2CNT, 0xc .set OFFSET_REG_BG3CNT, 0xe .set OFFSET_REG_BG0HOFS, 0x10 .set OFFSET_REG_BG0VOFS, 0x12 .set OFFSET_REG_BG1HOFS, 0x14 .set OFFSET_REG_BG1VOFS, 0x16 .set OFFSET_REG_BG2HOFS, 0x18 .set OFFSET_REG_BG2VOFS, 0x1a .set OFFSET_REG_BG3HOFS, 0x1c .set OFFSET_REG_BG3VOFS, 0x1e .set OFFSET_REG_BG2PA, 0x20 .set OFFSET_REG_BG2PB, 0x22 .set OFFSET_REG_BG2PC, 0x24 .set OFFSET_REG_BG2PD, 0x26 .set OFFSET_REG_BG2X_L, 0x28 .set OFFSET_REG_BG2X_H, 0x2a .set OFFSET_REG_BG2Y_L, 0x2c .set OFFSET_REG_BG2Y_H, 0x2e .set OFFSET_REG_BG3PA, 0x30 .set OFFSET_REG_BG3PB, 0x32 .set OFFSET_REG_BG3PC, 0x34 .set OFFSET_REG_BG3PD, 0x36 .set OFFSET_REG_BG3X_L, 0x38 .set OFFSET_REG_BG3X_H, 0x3a .set OFFSET_REG_BG3Y_L, 0x3c .set OFFSET_REG_BG3Y_H, 0x3e .set OFFSET_REG_WIN0H, 0x40 .set OFFSET_REG_WIN1H, 0x42 .set OFFSET_REG_WIN0V, 0x44 .set OFFSET_REG_WIN1V, 0x46 .set OFFSET_REG_WININ, 0x48 .set OFFSET_REG_WINOUT, 0x4a .set OFFSET_REG_MOSAIC, 0x4c .set OFFSET_REG_BLDCNT, 0x50 .set OFFSET_REG_BLDALPHA, 0x52 .set OFFSET_REG_BLDY, 0x54 .set OFFSET_REG_SOUND1CNT, 0x60 .set OFFSET_REG_SOUND1CNT_L, 0x60 .set OFFSET_REG_NR10, 0x60 .set OFFSET_REG_SOUND1CNT_H, 0x62 .set OFFSET_REG_NR11, 0x62 .set OFFSET_REG_NR12, 0x63 .set OFFSET_REG_SOUND1CNT_X, 0x64 .set OFFSET_REG_NR13, 0x64 .set OFFSET_REG_NR14, 0x65 .set OFFSET_REG_SOUND2CNT, 0x68 .set OFFSET_REG_SOUND2CNT_L, 0x68 .set OFFSET_REG_NR21, 0x68 .set OFFSET_REG_NR22, 0x69 .set OFFSET_REG_SOUND2CNT_H, 0x6c .set OFFSET_REG_NR23, 0x6c .set OFFSET_REG_NR24, 0x6d .set OFFSET_REG_SOUND3CNT, 0x70 .set OFFSET_REG_SOUND3CNT_L, 0x70 .set OFFSET_REG_NR30, 0x70 .set OFFSET_REG_SOUND3CNT_H, 0x72 .set OFFSET_REG_NR31, 0x72 .set OFFSET_REG_NR32, 0x73 .set OFFSET_REG_SOUND3CNT_X, 0x74 .set OFFSET_REG_NR33, 0x74 .set OFFSET_REG_NR34, 0x75 .set OFFSET_REG_SOUND4CNT, 0x78 .set OFFSET_REG_SOUND4CNT_L, 0x78 .set OFFSET_REG_NR41, 0x78 .set OFFSET_REG_NR42, 0x79 .set OFFSET_REG_SOUND4CNT_H, 0x7c .set OFFSET_REG_NR43, 0x7c .set OFFSET_REG_NR44, 0x7d .set OFFSET_REG_SOUNDCNT, 0x80 .set OFFSET_REG_SOUNDCNT_L, 0x80 .set OFFSET_REG_NR50, 0x80 .set OFFSET_REG_NR51, 0x81 .set OFFSET_REG_SOUNDCNT_H, 0x82 .set OFFSET_REG_SOUNDCNT_X, 0x84 .set OFFSET_REG_NR52, 0x84 .set OFFSET_REG_SOUNDBIAS, 0x88 .set OFFSET_REG_WAVE_RAM, 0x90 .set OFFSET_REG_WAVE_RAM0, 0x90 .set OFFSET_REG_WAVE_RAM0_L, 0x90 .set OFFSET_REG_WAVE_RAM0_H, 0x92 .set OFFSET_REG_WAVE_RAM1, 0x94 .set OFFSET_REG_WAVE_RAM1_L, 0x94 .set OFFSET_REG_WAVE_RAM1_H, 0x96 .set OFFSET_REG_WAVE_RAM2, 0x98 .set OFFSET_REG_WAVE_RAM2_L, 0x98 .set OFFSET_REG_WAVE_RAM2_H, 0x9a .set OFFSET_REG_WAVE_RAM3, 0x9c .set OFFSET_REG_WAVE_RAM3_L, 0x9c .set OFFSET_REG_WAVE_RAM3_H, 0x9e .set OFFSET_REG_FIFO, 0xa0 .set OFFSET_REG_FIFO_A, 0xa0 .set OFFSET_REG_FIFO_A_L, 0xa0 .set OFFSET_REG_FIFO_A_H, 0xa2 .set OFFSET_REG_FIFO_B, 0xa4 .set OFFSET_REG_FIFO_B_L, 0xa4 .set OFFSET_REG_FIFO_B_H, 0xa6 .set OFFSET_REG_DMA0, 0xb0 .set OFFSET_REG_DMA0SAD, 0xb0 .set OFFSET_REG_DMA0SAD_L, 0xb0 .set OFFSET_REG_DMA0SAD_H, 0xb2 .set OFFSET_REG_DMA0DAD, 0xb4 .set OFFSET_REG_DMA0DAD_L, 0xb4 .set OFFSET_REG_DMA0DAD_H, 0xb6 .set OFFSET_REG_DMA0CNT, 0xb8 .set OFFSET_REG_DMA0CNT_L, 0xb8 .set OFFSET_REG_DMA0CNT_H, 0xba .set OFFSET_REG_DMA1, 0xbc .set OFFSET_REG_DMA1SAD, 0xbc .set OFFSET_REG_DMA1SAD_L, 0xbc .set OFFSET_REG_DMA1SAD_H, 0xbe .set OFFSET_REG_DMA1DAD, 0xc0 .set OFFSET_REG_DMA1DAD_L, 0xc0 .set OFFSET_REG_DMA1DAD_H, 0xc2 .set OFFSET_REG_DMA1CNT, 0xc4 .set OFFSET_REG_DMA1CNT_L, 0xc4 .set OFFSET_REG_DMA1CNT_H, 0xc6 .set OFFSET_REG_DMA2, 0xc8 .set OFFSET_REG_DMA2SAD, 0xc8 .set OFFSET_REG_DMA2SAD_L, 0xc8 .set OFFSET_REG_DMA2SAD_H, 0xca .set OFFSET_REG_DMA2DAD, 0xcc .set OFFSET_REG_DMA2DAD_L, 0xcc .set OFFSET_REG_DMA2DAD_H, 0xce .set OFFSET_REG_DMA2CNT, 0xd0 .set OFFSET_REG_DMA2CNT_L, 0xd0 .set OFFSET_REG_DMA2CNT_H, 0xd2 .set OFFSET_REG_DMA3, 0xd4 .set OFFSET_REG_DMA3SAD, 0xd4 .set OFFSET_REG_DMA3SAD_L, 0xd4 .set OFFSET_REG_DMA3SAD_H, 0xd6 .set OFFSET_REG_DMA3DAD, 0xd8 .set OFFSET_REG_DMA3DAD_L, 0xd8 .set OFFSET_REG_DMA3DAD_H, 0xda .set OFFSET_REG_DMA3CNT, 0xdc .set OFFSET_REG_DMA3CNT_L, 0xdc .set OFFSET_REG_DMA3CNT_H, 0xde .set OFFSET_REG_TM0CNT, 0x100 .set OFFSET_REG_TM0CNT_L, 0x100 .set OFFSET_REG_TM0CNT_H, 0x102 .set OFFSET_REG_TM1CNT, 0x104 .set OFFSET_REG_TM1CNT_L, 0x104 .set OFFSET_REG_TM1CNT_H, 0x106 .set OFFSET_REG_TM2CNT, 0x108 .set OFFSET_REG_TM2CNT_L, 0x108 .set OFFSET_REG_TM2CNT_H, 0x10a .set OFFSET_REG_TM3CNT, 0x10c .set OFFSET_REG_TM3CNT_L, 0x10c .set OFFSET_REG_TM3CNT_H, 0x10e .set OFFSET_REG_SIOCNT, 0x128 .set OFFSET_REG_SIODATA8, 0x12a .set OFFSET_REG_SIODATA32, 0x120 .set OFFSET_REG_SIOMLT_SEND, 0x12a .set OFFSET_REG_SIOMLT_RECV, 0x120 .set OFFSET_REG_SIOMULTI0, 0x120 .set OFFSET_REG_SIOMULTI1, 0x122 .set OFFSET_REG_SIOMULTI2, 0x124 .set OFFSET_REG_SIOMULTI3, 0x126 .set OFFSET_REG_KEYINPUT, 0x130 .set OFFSET_REG_KEYCNT, 0x132 .set OFFSET_REG_RCNT, 0x134 .set OFFSET_REG_JOYCNT, 0x140 .set OFFSET_REG_JOYSTAT, 0x158 .set OFFSET_REG_JOY_RECV, 0x150 .set OFFSET_REG_JOY_RECV_L, 0x150 .set OFFSET_REG_JOY_RECV_H, 0x152 .set OFFSET_REG_JOY_TRANS, 0x154 .set OFFSET_REG_JOY_TRANS_L, 0x154 .set OFFSET_REG_JOY_TRANS_H, 0x156 .set OFFSET_REG_IME, 0x208 .set OFFSET_REG_IE, 0x200 .set OFFSET_REG_IF, 0x202 .set OFFSET_REG_WAITCNT, 0x204 @ I/O register addresses .set REG_DISPCNT, REG_BASE + OFFSET_REG_DISPCNT .set REG_DISPSTAT, REG_BASE + OFFSET_REG_DISPSTAT .set REG_VCOUNT, REG_BASE + OFFSET_REG_VCOUNT .set REG_BG0CNT, REG_BASE + OFFSET_REG_BG0CNT .set REG_BG1CNT, REG_BASE + OFFSET_REG_BG1CNT .set REG_BG2CNT, REG_BASE + OFFSET_REG_BG2CNT .set REG_BG3CNT, REG_BASE + OFFSET_REG_BG3CNT .set REG_BG0HOFS, REG_BASE + OFFSET_REG_BG0HOFS .set REG_BG0VOFS, REG_BASE + OFFSET_REG_BG0VOFS .set REG_BG1HOFS, REG_BASE + OFFSET_REG_BG1HOFS .set REG_BG1VOFS, REG_BASE + OFFSET_REG_BG1VOFS .set REG_BG2HOFS, REG_BASE + OFFSET_REG_BG2HOFS .set REG_BG2VOFS, REG_BASE + OFFSET_REG_BG2VOFS .set REG_BG3HOFS, REG_BASE + OFFSET_REG_BG3HOFS .set REG_BG3VOFS, REG_BASE + OFFSET_REG_BG3VOFS .set REG_BG2PA, REG_BASE + OFFSET_REG_BG2PA .set REG_BG2PB, REG_BASE + OFFSET_REG_BG2PB .set REG_BG2PC, REG_BASE + OFFSET_REG_BG2PC .set REG_BG2PD, REG_BASE + OFFSET_REG_BG2PD .set REG_BG2X_L, REG_BASE + OFFSET_REG_BG2X_L .set REG_BG2X_H, REG_BASE + OFFSET_REG_BG2X_H .set REG_BG2Y_L, REG_BASE + OFFSET_REG_BG2Y_L .set REG_BG2Y_H, REG_BASE + OFFSET_REG_BG2Y_H .set REG_BG3PA, REG_BASE + OFFSET_REG_BG3PA .set REG_BG3PB, REG_BASE + OFFSET_REG_BG3PB .set REG_BG3PC, REG_BASE + OFFSET_REG_BG3PC .set REG_BG3PD, REG_BASE + OFFSET_REG_BG3PD .set REG_BG3X_L, REG_BASE + OFFSET_REG_BG3X_L .set REG_BG3X_H, REG_BASE + OFFSET_REG_BG3X_H .set REG_BG3Y_L, REG_BASE + OFFSET_REG_BG3Y_L .set REG_BG3Y_H, REG_BASE + OFFSET_REG_BG3Y_H .set REG_WIN0H, REG_BASE + OFFSET_REG_WIN0H .set REG_WIN1H, REG_BASE + OFFSET_REG_WIN1H .set REG_WIN0V, REG_BASE + OFFSET_REG_WIN0V .set REG_WIN1V, REG_BASE + OFFSET_REG_WIN1V .set REG_WININ, REG_BASE + OFFSET_REG_WININ .set REG_WINOUT, REG_BASE + OFFSET_REG_WINOUT .set REG_MOSAIC, REG_BASE + OFFSET_REG_MOSAIC .set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT .set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA .set REG_BLDY, REG_BASE + OFFSET_REG_BLDY .set REG_SOUND1CNT, REG_BASE + OFFSET_REG_SOUND1CNT .set REG_SOUND1CNT_L, REG_BASE + OFFSET_REG_SOUND1CNT_L .set REG_NR10, REG_BASE + OFFSET_REG_NR10 .set REG_SOUND1CNT_H, REG_BASE + OFFSET_REG_SOUND1CNT_H .set REG_NR11, REG_BASE + OFFSET_REG_NR11 .set REG_NR12, REG_BASE + OFFSET_REG_NR12 .set REG_SOUND1CNT_X, REG_BASE + OFFSET_REG_SOUND1CNT_X .set REG_NR13, REG_BASE + OFFSET_REG_NR13 .set REG_NR14, REG_BASE + OFFSET_REG_NR14 .set REG_SOUND2CNT, REG_BASE + OFFSET_REG_SOUND2CNT .set REG_SOUND2CNT_L, REG_BASE + OFFSET_REG_SOUND2CNT_L .set REG_NR21, REG_BASE + OFFSET_REG_NR21 .set REG_NR22, REG_BASE + OFFSET_REG_NR22 .set REG_SOUND2CNT_H, REG_BASE + OFFSET_REG_SOUND2CNT_H .set REG_NR23, REG_BASE + OFFSET_REG_NR23 .set REG_NR24, REG_BASE + OFFSET_REG_NR24 .set REG_SOUND3CNT, REG_BASE + OFFSET_REG_SOUND3CNT .set REG_SOUND3CNT_L, REG_BASE + OFFSET_REG_SOUND3CNT_L .set REG_NR30, REG_BASE + OFFSET_REG_NR30 .set REG_SOUND3CNT_H, REG_BASE + OFFSET_REG_SOUND3CNT_H .set REG_NR31, REG_BASE + OFFSET_REG_NR31 .set REG_NR32, REG_BASE + OFFSET_REG_NR32 .set REG_SOUND3CNT_X, REG_BASE + OFFSET_REG_SOUND3CNT_X .set REG_NR33, REG_BASE + OFFSET_REG_NR33 .set REG_NR34, REG_BASE + OFFSET_REG_NR34 .set REG_SOUND4CNT, REG_BASE + OFFSET_REG_SOUND4CNT .set REG_SOUND4CNT_L, REG_BASE + OFFSET_REG_SOUND4CNT_L .set REG_NR41, REG_BASE + OFFSET_REG_NR41 .set REG_NR42, REG_BASE + OFFSET_REG_NR42 .set REG_SOUND4CNT_H, REG_BASE + OFFSET_REG_SOUND4CNT_H .set REG_NR43, REG_BASE + OFFSET_REG_NR43 .set REG_NR44, REG_BASE + OFFSET_REG_NR44 .set REG_SOUNDCNT, REG_BASE + OFFSET_REG_SOUNDCNT .set REG_SOUNDCNT_L, REG_BASE + OFFSET_REG_SOUNDCNT_L .set REG_NR50, REG_BASE + OFFSET_REG_NR50 .set REG_NR51, REG_BASE + OFFSET_REG_NR51 .set REG_SOUNDCNT_H, REG_BASE + OFFSET_REG_SOUNDCNT_H .set REG_SOUNDCNT_X, REG_BASE + OFFSET_REG_SOUNDCNT_X .set REG_NR52, REG_BASE + OFFSET_REG_NR52 .set REG_SOUNDBIAS, REG_BASE + OFFSET_REG_SOUNDBIAS .set REG_WAVE_RAM, REG_BASE + OFFSET_REG_WAVE_RAM .set REG_WAVE_RAM0, REG_BASE + OFFSET_REG_WAVE_RAM0 .set REG_WAVE_RAM0_L, REG_BASE + OFFSET_REG_WAVE_RAM0_L .set REG_WAVE_RAM0_H, REG_BASE + OFFSET_REG_WAVE_RAM0_H .set REG_WAVE_RAM1, REG_BASE + OFFSET_REG_WAVE_RAM1 .set REG_WAVE_RAM1_L, REG_BASE + OFFSET_REG_WAVE_RAM1_L .set REG_WAVE_RAM1_H, REG_BASE + OFFSET_REG_WAVE_RAM1_H .set REG_WAVE_RAM2, REG_BASE + OFFSET_REG_WAVE_RAM2 .set REG_WAVE_RAM2_L, REG_BASE + OFFSET_REG_WAVE_RAM2_L .set REG_WAVE_RAM2_H, REG_BASE + OFFSET_REG_WAVE_RAM2_H .set REG_WAVE_RAM3, REG_BASE + OFFSET_REG_WAVE_RAM3 .set REG_WAVE_RAM3_L, REG_BASE + OFFSET_REG_WAVE_RAM3_L .set REG_WAVE_RAM3_H, REG_BASE + OFFSET_REG_WAVE_RAM3_H .set REG_FIFO, REG_BASE + OFFSET_REG_FIFO .set REG_FIFO_A, REG_BASE + OFFSET_REG_FIFO_A .set REG_FIFO_A_L, REG_BASE + OFFSET_REG_FIFO_A_L .set REG_FIFO_A_H, REG_BASE + OFFSET_REG_FIFO_A_H .set REG_FIFO_B, REG_BASE + OFFSET_REG_FIFO_B .set REG_FIFO_B_L, REG_BASE + OFFSET_REG_FIFO_B_L .set REG_FIFO_B_H, REG_BASE + OFFSET_REG_FIFO_B_H .set REG_DMA0, REG_BASE + OFFSET_REG_DMA0 .set REG_DMA0SAD, REG_BASE + OFFSET_REG_DMA0SAD .set REG_DMA0SAD_L, REG_BASE + OFFSET_REG_DMA0SAD_L .set REG_DMA0SAD_H, REG_BASE + OFFSET_REG_DMA0SAD_H .set REG_DMA0DAD, REG_BASE + OFFSET_REG_DMA0DAD .set REG_DMA0DAD_L, REG_BASE + OFFSET_REG_DMA0DAD_L .set REG_DMA0DAD_H, REG_BASE + OFFSET_REG_DMA0DAD_H .set REG_DMA0CNT, REG_BASE + OFFSET_REG_DMA0CNT .set REG_DMA0CNT_L, REG_BASE + OFFSET_REG_DMA0CNT_L .set REG_DMA0CNT_H, REG_BASE + OFFSET_REG_DMA0CNT_H .set REG_DMA1, REG_BASE + OFFSET_REG_DMA1 .set REG_DMA1SAD, REG_BASE + OFFSET_REG_DMA1SAD .set REG_DMA1SAD_L, REG_BASE + OFFSET_REG_DMA1SAD_L .set REG_DMA1SAD_H, REG_BASE + OFFSET_REG_DMA1SAD_H .set REG_DMA1DAD, REG_BASE + OFFSET_REG_DMA1DAD .set REG_DMA1DAD_L, REG_BASE + OFFSET_REG_DMA1DAD_L .set REG_DMA1DAD_H, REG_BASE + OFFSET_REG_DMA1DAD_H .set REG_DMA1CNT, REG_BASE + OFFSET_REG_DMA1CNT .set REG_DMA1CNT_L, REG_BASE + OFFSET_REG_DMA1CNT_L .set REG_DMA1CNT_H, REG_BASE + OFFSET_REG_DMA1CNT_H .set REG_DMA2, REG_BASE + OFFSET_REG_DMA2 .set REG_DMA2SAD, REG_BASE + OFFSET_REG_DMA2SAD .set REG_DMA2SAD_L, REG_BASE + OFFSET_REG_DMA2SAD_L .set REG_DMA2SAD_H, REG_BASE + OFFSET_REG_DMA2SAD_H .set REG_DMA2DAD, REG_BASE + OFFSET_REG_DMA2DAD .set REG_DMA2DAD_L, REG_BASE + OFFSET_REG_DMA2DAD_L .set REG_DMA2DAD_H, REG_BASE + OFFSET_REG_DMA2DAD_H .set REG_DMA2CNT, REG_BASE + OFFSET_REG_DMA2CNT .set REG_DMA2CNT_L, REG_BASE + OFFSET_REG_DMA2CNT_L .set REG_DMA2CNT_H, REG_BASE + OFFSET_REG_DMA2CNT_H .set REG_DMA3, REG_BASE + OFFSET_REG_DMA3 .set REG_DMA3SAD, REG_BASE + OFFSET_REG_DMA3SAD .set REG_DMA3SAD_L, REG_BASE + OFFSET_REG_DMA3SAD_L .set REG_DMA3SAD_H, REG_BASE + OFFSET_REG_DMA3SAD_H .set REG_DMA3DAD, REG_BASE + OFFSET_REG_DMA3DAD .set REG_DMA3DAD_L, REG_BASE + OFFSET_REG_DMA3DAD_L .set REG_DMA3DAD_H, REG_BASE + OFFSET_REG_DMA3DAD_H .set REG_DMA3CNT, REG_BASE + OFFSET_REG_DMA3CNT .set REG_DMA3CNT_L, REG_BASE + OFFSET_REG_DMA3CNT_L .set REG_DMA3CNT_H, REG_BASE + OFFSET_REG_DMA3CNT_H .set REG_TM0CNT, REG_BASE + OFFSET_REG_TM0CNT .set REG_TM0CNT_L, REG_BASE + OFFSET_REG_TM0CNT_L .set REG_TM0CNT_H, REG_BASE + OFFSET_REG_TM0CNT_H .set REG_TM1CNT, REG_BASE + OFFSET_REG_TM1CNT .set REG_TM1CNT_L, REG_BASE + OFFSET_REG_TM1CNT_L .set REG_TM1CNT_H, REG_BASE + OFFSET_REG_TM1CNT_H .set REG_TM2CNT, REG_BASE + OFFSET_REG_TM2CNT .set REG_TM2CNT_L, REG_BASE + OFFSET_REG_TM2CNT_L .set REG_TM2CNT_H, REG_BASE + OFFSET_REG_TM2CNT_H .set REG_TM3CNT, REG_BASE + OFFSET_REG_TM3CNT .set REG_TM3CNT_L, REG_BASE + OFFSET_REG_TM3CNT_L .set REG_TM3CNT_H, REG_BASE + OFFSET_REG_TM3CNT_H .set REG_SIOCNT, REG_BASE + OFFSET_REG_SIOCNT .set REG_SIODATA8, REG_BASE + OFFSET_REG_SIODATA8 .set REG_SIODATA32, REG_BASE + OFFSET_REG_SIODATA32 .set REG_SIOMLT_SEND, REG_BASE + OFFSET_REG_SIOMLT_SEND .set REG_SIOMLT_RECV, REG_BASE + OFFSET_REG_SIOMLT_RECV .set REG_SIOMULTI0, REG_BASE + OFFSET_REG_SIOMULTI0 .set REG_SIOMULTI1, REG_BASE + OFFSET_REG_SIOMULTI1 .set REG_SIOMULTI2, REG_BASE + OFFSET_REG_SIOMULTI2 .set REG_SIOMULTI3, REG_BASE + OFFSET_REG_SIOMULTI3 .set REG_KEYINPUT, REG_BASE + OFFSET_REG_KEYINPUT .set REG_KEYCNT, REG_BASE + OFFSET_REG_KEYCNT .set REG_RCNT, REG_BASE + OFFSET_REG_RCNT .set REG_JOYCNT, REG_BASE + OFFSET_REG_JOYCNT .set REG_JOYSTAT, REG_BASE + OFFSET_REG_JOYSTAT .set REG_JOY_RECV, REG_BASE + OFFSET_REG_JOY_RECV .set REG_JOY_RECV_L, REG_BASE + OFFSET_REG_JOY_RECV_L .set REG_JOY_RECV_H, REG_BASE + OFFSET_REG_JOY_RECV_H .set REG_JOY_TRANS, REG_BASE + OFFSET_REG_JOY_TRANS .set REG_JOY_TRANS_L, REG_BASE + OFFSET_REG_JOY_TRANS_L .set REG_JOY_TRANS_H, REG_BASE + OFFSET_REG_JOY_TRANS_H .set REG_IME, REG_BASE + OFFSET_REG_IME .set REG_IE, REG_BASE + OFFSET_REG_IE .set REG_IF, REG_BASE + OFFSET_REG_IF .set REG_WAITCNT, REG_BASE + OFFSET_REG_WAITCNT @ DMA register constants .set DMA_DEST_INC, 0x0000 .set DMA_DEST_DEC, 0x0020 .set DMA_DEST_FIXED, 0x0040 .set DMA_DEST_RELOAD, 0x0060 .set DMA_SRC_INC, 0x0000 .set DMA_SRC_DEC, 0x0080 .set DMA_SRC_FIXED, 0x0100 .set DMA_REPEAT, 0x0200 .set DMA_16BIT, 0x0000 .set DMA_32BIT, 0x0400 .set DMA_DREQ_ON, 0x0800 .set DMA_START_NOW, 0x0000 .set DMA_START_VBLANK, 0x1000 .set DMA_START_HBLANK, 0x2000 .set DMA_START_SPECIAL, 0x3000 .set DMA_INTR_ENABLE, 0x4000 .set DMA_ENABLE, 0x8000 @ OAM attribute constants .set OAM_OBJ_NORMAL, 0x00000000 .set OAM_OBJ_BLEND, 0x00000400 .set OAM_OBJ_WINDOW, 0x00000800 .set OAM_AFFINE_NONE, 0x00000000 .set OAM_AFFINE_NORMAL_SIZE, 0x00000100 .set OAM_OBJ_DISABLED, 0x00000200 .set OAM_AFFINE_DOUBLE_SIZE, 0x00000300 .set OAM_MOSAIC_OFF, 0x00000000 .set OAM_MOSAIC_ON, 0x00001000 .set OAM_4BPP, 0x00000000 .set OAM_8BPP, 0x00002000 .set OAM_H_FLIP, 0x10000000 .set OAM_V_FLIP, 0x20000000 .set OAM_SQUARE, 0x00000000 .set OAM_H_RECTANGLE, 0x00004000 .set OAM_V_RECTANGLE, 0x00008000 .set OAM_SIZE_0, 0x00000000 .set OAM_SIZE_1, 0x40000000 .set OAM_SIZE_2, 0x80000000 .set OAM_SIZE_3, 0xc0000000 .set OAM_SIZE_8x8, OAM_SIZE_0 | OAM_SQUARE .set OAM_SIZE_16x16, OAM_SIZE_1 | OAM_SQUARE .set OAM_SIZE_32x32, OAM_SIZE_2 | OAM_SQUARE .set OAM_SIZE_64x64, OAM_SIZE_3 | OAM_SQUARE .set OAM_SIZE_16x8, OAM_SIZE_0 | OAM_H_RECTANGLE .set OAM_SIZE_32x8, OAM_SIZE_1 | OAM_H_RECTANGLE .set OAM_SIZE_32x16, OAM_SIZE_2 | OAM_H_RECTANGLE .set OAM_SIZE_64x32, OAM_SIZE_3 | OAM_H_RECTANGLE .set OAM_SIZE_8x16, OAM_SIZE_0 | OAM_V_RECTANGLE .set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE .set OAM_SIZE_16x32, OAM_SIZE_2 | OAM_V_RECTANGLE .set OAM_SIZE_32x64, OAM_SIZE_3 | OAM_V_RECTANGLE @ BLDCNT .set BLDCNT_TGT1_BG0, 1 << 0 .set BLDCNT_TGT1_BG1, 1 << 1 .set BLDCNT_TGT1_BG2, 1 << 2 .set BLDCNT_TGT1_BG3, 1 << 3 .set BLDCNT_TGT1_OBJ, 1 << 4 .set BLDCNT_TGT1_BD, 1 << 5 .set BLDCNT_TGT1_ALL, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD .set BLDCNT_EFFECT_NONE, 0 << 6 .set BLDCNT_EFFECT_BLEND, 1 << 6 .set BLDCNT_EFFECT_LIGHTEN, 2 << 6 .set BLDCNT_EFFECT_DARKEN, 3 << 6 .set BLDCNT_TGT2_BG0, 1 << 8 .set BLDCNT_TGT2_BG1, 1 << 9 .set BLDCNT_TGT2_BG2, 1 << 10 .set BLDCNT_TGT2_BG3, 1 << 11 .set BLDCNT_TGT2_OBJ, 1 << 12 .set BLDCNT_TGT2_BD, 1 << 13 .set BLDCNT_TGT2_ALL, BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD ================================================ FILE: constants/m4a_constants.inc ================================================ .equiv ID_NUMBER, 0x68736d53 .equiv PCM_DMA_BUF_SIZE, 1584 .equiv MAX_DIRECTSOUND_CHANNELS, 12 .equiv C_V, 0x40 .equiv TONEDATA_TYPE_CGB, 0x07 .equiv TONEDATA_TYPE_FIX, 0x08 .equiv TONEDATA_TYPE_REV, 0x10 .equiv TONEDATA_TYPE_CMP, 0x20 .equiv TONEDATA_TYPE_SPL, 0x40 @ key split .equiv TONEDATA_TYPE_RHY, 0x80 @ rhythm .equiv TONEDATA_P_S_PAN, 0xc0 .equiv SOUND_CHANNEL_SF_START, 0x80 .equiv SOUND_CHANNEL_SF_STOP, 0x40 .equiv SOUND_CHANNEL_SF_SPECIAL, 0x20 .equiv SOUND_CHANNEL_SF_LOOP, 0x10 .equiv SOUND_CHANNEL_SF_IEC, 0x04 .equiv SOUND_CHANNEL_SF_ENV, 0x03 .equiv SOUND_CHANNEL_SF_ENV_ATTACK, 0x03 .equiv SOUND_CHANNEL_SF_ENV_DECAY, 0x02 .equiv SOUND_CHANNEL_SF_ENV_SUSTAIN, 0x01 .equiv SOUND_CHANNEL_SF_ENV_RELEASE, 0x00 .equiv SOUND_CHANNEL_SF_ON, (SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_STOP | SOUND_CHANNEL_SF_IEC | SOUND_CHANNEL_SF_ENV) .equiv CGB_CHANNEL_MO_PIT, 0x02 .equiv CGB_CHANNEL_MO_VOL, 0x01 .equiv WAVE_DATA_FLAG_LOOP, 0xC0 .equiv MPT_FLG_VOLSET, 0x01 .equiv MPT_FLG_VOLCHG, 0x03 .equiv MPT_FLG_PITSET, 0x04 .equiv MPT_FLG_PITCHG, 0x0C .equiv MPT_FLG_START, 0x40 .equiv MPT_FLG_EXIST, 0x80 .macro struct_begin .struct 0 .endm .macro struct_field name, size \name: .struct \name + \size .endm struct_begin struct_field o_WaveData_type, 2 struct_field o_WaveData_d1, 1 struct_field o_WaveData_flags, 1 struct_field o_WaveData_freq, 4 struct_field o_WaveData_loopStart, 4 struct_field o_WaveData_size, 4 struct_field o_WaveData_data, 0 struct_field WaveData_size, 0 struct_begin struct_field o_ToneData_type, 1 struct_field o_ToneData_key, 1 struct_field o_ToneData_length, 1 struct_field o_ToneData_pan_sweep, 1 struct_field o_ToneData_wav, 4 struct_field o_ToneData_attack, 1 struct_field o_ToneData_decay, 1 struct_field o_ToneData_sustain, 1 struct_field o_ToneData_release, 1 struct_field ToneData_size, 0 struct_begin struct_field o_SoundInfo_ident, 4 struct_field o_SoundInfo_pcmDmaCounter, 1 struct_field o_SoundInfo_reverb, 1 struct_field o_SoundInfo_maxChans, 1 struct_field o_SoundInfo_masterVolume, 1 struct_field o_SoundInfo_freq, 1 struct_field o_SoundInfo_mode, 1 struct_field o_SoundInfo_c15, 1 struct_field o_SoundInfo_pcmDmaPeriod, 1 struct_field o_SoundInfo_maxLines, 1 struct_field o_SoundInfo_gap, 3 struct_field o_SoundInfo_pcmSamplesPerVBlank, 4 struct_field o_SoundInfo_pcmFreq, 4 struct_field o_SoundInfo_divFreq, 4 struct_field o_SoundInfo_cgbChans, 4 struct_field o_SoundInfo_MPlayMainHead, 4 struct_field o_SoundInfo_musicPlayerHead, 4 struct_field o_SoundInfo_CgbSound, 4 struct_field o_SoundInfo_CgbOscOff, 4 struct_field o_SoundInfo_MidiKeyToCgbFreq, 4 struct_field o_SoundInfo_MPlayJumpTable, 4 struct_field o_SoundInfo_plynote, 4 struct_field o_SoundInfo_ExtVolPit, 4 struct_field o_SoundInfo_gap2, 16 struct_field o_SoundInfo_chans, MAX_DIRECTSOUND_CHANNELS * 64 struct_field o_SoundInfo_pcmBuffer, PCM_DMA_BUF_SIZE * 2 struct_field SoundInfo_size, 0 struct_begin struct_field o_SoundChannel_statusFlags, 1 struct_field o_SoundChannel_type, 1 struct_field o_SoundChannel_rightVolume, 1 struct_field o_SoundChannel_leftVolume, 1 struct_field o_SoundChannel_attack, 1 struct_field o_SoundChannel_decay, 1 struct_field o_SoundChannel_sustain, 1 struct_field o_SoundChannel_release, 1 struct_field o_SoundChannel_key, 1 struct_field o_SoundChannel_envelopeVolume, 1 struct_field o_SoundChannel_envelopeVolumeRight, 1 struct_field o_SoundChannel_envelopeVolumeLeft, 1 struct_field o_SoundChannel_pseudoEchoVolume, 1 struct_field o_SoundChannel_pseudoEchoLength, 1 struct_field o_SoundChannel_dummy1, 1 struct_field o_SoundChannel_dummy2, 1 struct_field o_SoundChannel_gateTime, 1 struct_field o_SoundChannel_midiKey, 1 struct_field o_SoundChannel_velocity, 1 struct_field o_SoundChannel_priority, 1 struct_field o_SoundChannel_rhythmPan, 1 struct_field o_SoundChannel_dummy3, 3 struct_field o_SoundChannel_count, 4 struct_field o_SoundChannel_fw, 4 struct_field o_SoundChannel_frequency, 4 struct_field o_SoundChannel_wav, 4 struct_field o_SoundChannel_currentPointer, 4 struct_field o_SoundChannel_track, 4 struct_field o_SoundChannel_prevChannelPointer, 4 struct_field o_SoundChannel_nextChannelPointer, 4 struct_field o_SoundChannel_dummy4, 4 struct_field o_SoundChannel_xpi, 2 struct_field o_SoundChannel_xpc, 2 struct_field SoundChannel_size, 0 struct_begin struct_field o_MusicPlayerTrack_flags, 1 struct_field o_MusicPlayerTrack_wait, 1 struct_field o_MusicPlayerTrack_patternLevel, 1 struct_field o_MusicPlayerTrack_repN, 1 struct_field o_MusicPlayerTrack_gateTime, 1 struct_field o_MusicPlayerTrack_key, 1 struct_field o_MusicPlayerTrack_velocity, 1 struct_field o_MusicPlayerTrack_runningStatus, 1 struct_field o_MusicPlayerTrack_keyM, 1 struct_field o_MusicPlayerTrack_pitM, 1 struct_field o_MusicPlayerTrack_keyShift, 1 struct_field o_MusicPlayerTrack_keyShiftX, 1 struct_field o_MusicPlayerTrack_tune, 1 struct_field o_MusicPlayerTrack_pitX, 1 struct_field o_MusicPlayerTrack_bend, 1 struct_field o_MusicPlayerTrack_bendRange, 1 struct_field o_MusicPlayerTrack_volMR, 1 struct_field o_MusicPlayerTrack_volML, 1 struct_field o_MusicPlayerTrack_vol, 1 struct_field o_MusicPlayerTrack_volX, 1 struct_field o_MusicPlayerTrack_pan, 1 struct_field o_MusicPlayerTrack_panX, 1 struct_field o_MusicPlayerTrack_modM, 1 struct_field o_MusicPlayerTrack_mod, 1 struct_field o_MusicPlayerTrack_modT, 1 struct_field o_MusicPlayerTrack_lfoSpeed, 1 struct_field o_MusicPlayerTrack_lfoSpeedC, 1 struct_field o_MusicPlayerTrack_lfoDelay, 1 struct_field o_MusicPlayerTrack_lfoDelayC, 1 struct_field o_MusicPlayerTrack_priority, 1 struct_field o_MusicPlayerTrack_pseudoEchoVolume, 1 struct_field o_MusicPlayerTrack_pseudoEchoLength, 1 struct_field o_MusicPlayerTrack_chan, 4 struct_field o_MusicPlayerTrack_ToneData_type, 1 struct_field o_MusicPlayerTrack_ToneData_key, 1 struct_field o_MusicPlayerTrack_ToneData_length, 1 struct_field o_MusicPlayerTrack_ToneData_pan_sweep, 1 struct_field o_MusicPlayerTrack_ToneData_wav, 4 struct_field o_MusicPlayerTrack_ToneData_attack, 1 struct_field o_MusicPlayerTrack_ToneData_decay, 1 struct_field o_MusicPlayerTrack_ToneData_sustain, 1 struct_field o_MusicPlayerTrack_ToneData_release, 1 struct_field o_MusicPlayerTrack_gap, 10 struct_field o_MusicPlayerTrack_unk_3A, 2 struct_field o_MusicPlayerTrack_unk_3C, 4 struct_field o_MusicPlayerTrack_cmdPtr, 4 struct_field o_MusicPlayerTrack_patternStack, 12 struct_field MusicPlayerTrack_size, 0 .equiv o_MusicPlayerTrack_ToneData_keySplitTable, o_MusicPlayerTrack_ToneData_attack struct_begin struct_field o_MusicPlayerInfo_songHeader, 4 struct_field o_MusicPlayerInfo_status, 4 struct_field o_MusicPlayerInfo_trackCount, 1 struct_field o_MusicPlayerInfo_priority, 1 struct_field o_MusicPlayerInfo_cmd, 1 struct_field o_MusicPlayerInfo_unk_B, 1 struct_field o_MusicPlayerInfo_clock, 4 struct_field o_MusicPlayerInfo_gap, 8 struct_field o_MusicPlayerInfo_memAccArea, 4 struct_field o_MusicPlayerInfo_tempoD, 2 struct_field o_MusicPlayerInfo_tempoU, 2 struct_field o_MusicPlayerInfo_tempoI, 2 struct_field o_MusicPlayerInfo_tempoC, 2 struct_field o_MusicPlayerInfo_fadeOI, 2 struct_field o_MusicPlayerInfo_fadeOC, 2 struct_field o_MusicPlayerInfo_fadeOV, 2 struct_field o_MusicPlayerInfo_padding, 2 struct_field o_MusicPlayerInfo_tracks, 4 struct_field o_MusicPlayerInfo_tone, 4 struct_field o_MusicPlayerInfo_ident, 4 struct_field o_MusicPlayerInfo_func, 4 struct_field o_MusicPlayerInfo_intp, 4 struct_field MusicPlayerInfo_size, 0 struct_begin struct_field o_CgbChannel_statusFlags, 1 struct_field o_CgbChannel_type, 1 struct_field o_CgbChannel_rightVolume, 1 struct_field o_CgbChannel_leftVolume, 1 struct_field o_CgbChannel_attack, 1 struct_field o_CgbChannel_decay, 1 struct_field o_CgbChannel_sustain, 1 struct_field o_CgbChannel_release, 1 struct_field o_CgbChannel_key, 1 struct_field o_CgbChannel_envelopeVolume, 1 struct_field o_CgbChannel_envelopeGoal, 1 struct_field o_CgbChannel_envelopeCounter, 1 struct_field o_CgbChannel_pseudoEchoVolume, 1 struct_field o_CgbChannel_pseudoEchoLength, 1 struct_field o_CgbChannel_dummy1, 1 struct_field o_CgbChannel_dummy2, 1 struct_field o_CgbChannel_gateTime, 1 struct_field o_CgbChannel_midiKey, 1 struct_field o_CgbChannel_velocity, 1 struct_field o_CgbChannel_priority, 1 struct_field o_CgbChannel_rhythmPan, 1 struct_field o_CgbChannel_dummy3, 3 struct_field o_CgbChannel_dummy5, 1 struct_field o_CgbChannel_sustainGoal, 1 struct_field o_CgbChannel_n4, 1 struct_field o_CgbChannel_pan, 1 struct_field o_CgbChannel_panMask, 1 struct_field o_CgbChannel_modify, 1 struct_field o_CgbChannel_length, 1 struct_field o_CgbChannel_sweep, 1 struct_field o_CgbChannel_frequency, 4 struct_field o_CgbChannel_wavePointer, 4 struct_field o_CgbChannel_currentPointer, 4 struct_field o_CgbChannel_track, 4 struct_field o_CgbChannel_prevChannelPointer, 4 struct_field o_CgbChannel_nextChannelPointer, 4 struct_field o_CgbChannel_dummy4, 8 struct_field CgbChannel_size, 0 ================================================ FILE: constants/misc_constants.inc ================================================ .set TRUE, 1 .set FALSE, 0 .set NULL, 0 .set SPRITE_SIZE_8x8, (OAM_SIZE_0 >> 28) | (OAM_SQUARE >> 14) .set SPRITE_SIZE_16x16, (OAM_SIZE_1 >> 28) | (OAM_SQUARE >> 14) .set SPRITE_SIZE_32x32, (OAM_SIZE_2 >> 28) | (OAM_SQUARE >> 14) .set SPRITE_SIZE_64x64, (OAM_SIZE_3 >> 28) | (OAM_SQUARE >> 14) .set SPRITE_SIZE_16x8, (OAM_SIZE_0 >> 28) | (OAM_H_RECTANGLE >> 14) .set SPRITE_SIZE_32x8, (OAM_SIZE_1 >> 28) | (OAM_H_RECTANGLE >> 14) .set SPRITE_SIZE_32x16, (OAM_SIZE_2 >> 28) | (OAM_H_RECTANGLE >> 14) .set SPRITE_SIZE_64x32, (OAM_SIZE_3 >> 28) | (OAM_H_RECTANGLE >> 14) .set SPRITE_SIZE_8x16, (OAM_SIZE_0 >> 28) | (OAM_V_RECTANGLE >> 14) .set SPRITE_SIZE_8x32, (OAM_SIZE_1 >> 28) | (OAM_V_RECTANGLE >> 14) .set SPRITE_SIZE_16x32, (OAM_SIZE_2 >> 28) | (OAM_V_RECTANGLE >> 14) .set SPRITE_SIZE_32x64, (OAM_SIZE_3 >> 28) | (OAM_V_RECTANGLE >> 14) .set OBJ_IMAGE_ANIM_H_FLIP, 1 << 6 .set OBJ_IMAGE_ANIM_V_FLIP, 1 << 7 ================================================ FILE: data/battle_ai_scripts.s ================================================ #include "constants/battle.h" #include "constants/battle_ai.h" #include "constants/abilities.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/battle_move_effects.h" #include "constants/hold_effects.h" #include "constants/pokemon.h" .include "asm/macros/battle_ai_script.inc" .section script_data, "aw", %progbits @ The FRLG scripts are improved subtly by Emerald in a few places @ To make adding these improvements easier they are commented and tagged with "Improvement in Emerald" @ Emerald also adds a few entirely new AI commands (mostly to expand Double Battle AI), which are not included .align 2 gBattleAI_ScriptsTable:: .4byte AI_CheckBadMove .4byte AI_CheckViability .4byte AI_TryToFaint .4byte AI_SetupFirstTurn .4byte AI_Risky .4byte AI_PreferStrongestMove .4byte AI_PreferBatonPass .4byte AI_DoubleBattle .4byte AI_HPAware .4byte AI_Unknown .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Ret .4byte AI_Roaming .4byte AI_Safari .4byte AI_FirstBattle AI_CheckBadMove:: if_move MOVE_FISSURE, AI_CBM_CheckIfNegatesType if_move MOVE_HORN_DRILL, AI_CBM_CheckIfNegatesType get_how_powerful_move_is if_equal MOVE_POWER_DISCOURAGED, AI_CheckBadMove_CheckSoundproof AI_CBM_CheckIfNegatesType:: if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_VOLT_ABSORB, CheckIfVoltAbsorbCancelsElectric if_equal ABILITY_WATER_ABSORB, CheckIfWaterAbsorbCancelsWater if_equal ABILITY_FLASH_FIRE, CheckIfFlashFireCancelsFire if_equal ABILITY_WONDER_GUARD, CheckIfWonderGuardCancelsMove if_equal ABILITY_LEVITATE, CheckIfLevitateCancelsGroundMove goto AI_CheckBadMove_CheckSoundproof CheckIfVoltAbsorbCancelsElectric:: get_curr_move_type if_equal_ TYPE_ELECTRIC, Score_Minus12 goto AI_CheckBadMove_CheckSoundproof CheckIfWaterAbsorbCancelsWater:: get_curr_move_type if_equal_ TYPE_WATER, Score_Minus12 goto AI_CheckBadMove_CheckSoundproof CheckIfFlashFireCancelsFire:: get_curr_move_type if_equal_ TYPE_FIRE, Score_Minus12 goto AI_CheckBadMove_CheckSoundproof CheckIfWonderGuardCancelsMove:: if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CheckBadMove_CheckSoundproof goto Score_Minus10 CheckIfLevitateCancelsGroundMove:: get_curr_move_type if_equal_ TYPE_GROUND, Score_Minus10 AI_CheckBadMove_CheckSoundproof:: get_ability AI_TARGET if_not_equal ABILITY_SOUNDPROOF, AI_CheckBadMove_CheckEffect if_move MOVE_GROWL, Score_Minus10 if_move MOVE_ROAR, Score_Minus10 if_move MOVE_SING, Score_Minus10 if_move MOVE_SUPERSONIC, Score_Minus10 if_move MOVE_SCREECH, Score_Minus10 if_move MOVE_SNORE, Score_Minus10 if_move MOVE_UPROAR, Score_Minus10 if_move MOVE_METAL_SOUND, Score_Minus10 if_move MOVE_GRASS_WHISTLE, Score_Minus10 AI_CheckBadMove_CheckEffect:: if_effect EFFECT_SLEEP, AI_CBM_Sleep if_effect EFFECT_EXPLOSION, AI_CBM_Explosion if_effect EFFECT_DREAM_EATER, AI_CBM_DreamEater if_effect EFFECT_ATTACK_UP, AI_CBM_AttackUp if_effect EFFECT_DEFENSE_UP, AI_CBM_DefenseUp if_effect EFFECT_SPEED_UP, AI_CBM_SpeedUp if_effect EFFECT_SPECIAL_ATTACK_UP, AI_CBM_SpAtkUp if_effect EFFECT_SPECIAL_DEFENSE_UP, AI_CBM_SpDefUp if_effect EFFECT_ACCURACY_UP, AI_CBM_AccUp if_effect EFFECT_EVASION_UP, AI_CBM_EvasionUp if_effect EFFECT_ATTACK_DOWN, AI_CBM_AttackDown if_effect EFFECT_DEFENSE_DOWN, AI_CBM_DefenseDown if_effect EFFECT_SPEED_DOWN, AI_CBM_SpeedDown if_effect EFFECT_SPECIAL_ATTACK_DOWN, AI_CBM_SpAtkDown if_effect EFFECT_SPECIAL_DEFENSE_DOWN, AI_CBM_SpDefDown if_effect EFFECT_ACCURACY_DOWN, AI_CBM_AccDown if_effect EFFECT_EVASION_DOWN, AI_CBM_EvasionDown if_effect EFFECT_HAZE, AI_CBM_Haze if_effect EFFECT_BIDE, AI_CBM_HighRiskForDamage if_effect EFFECT_ROAR, AI_CBM_Roar if_effect EFFECT_TOXIC, AI_CBM_Poison if_effect EFFECT_LIGHT_SCREEN, AI_CBM_LightScreen if_effect EFFECT_OHKO, AI_CBM_OneHitKO if_effect EFFECT_RAZOR_WIND, AI_CBM_HighRiskForDamage if_effect EFFECT_SUPER_FANG, AI_CBM_HighRiskForDamage if_effect EFFECT_MIST, AI_CBM_Mist if_effect EFFECT_FOCUS_ENERGY, AI_CBM_FocusEnergy if_effect EFFECT_CONFUSE, AI_CBM_Confuse if_effect EFFECT_ATTACK_UP_2, AI_CBM_AttackUp if_effect EFFECT_DEFENSE_UP_2, AI_CBM_DefenseUp if_effect EFFECT_SPEED_UP_2, AI_CBM_SpeedUp if_effect EFFECT_SPECIAL_ATTACK_UP_2, AI_CBM_SpAtkUp if_effect EFFECT_SPECIAL_DEFENSE_UP_2, AI_CBM_SpDefUp if_effect EFFECT_ACCURACY_UP_2, AI_CBM_AccUp if_effect EFFECT_EVASION_UP_2, AI_CBM_EvasionUp if_effect EFFECT_ATTACK_DOWN_2, AI_CBM_AttackDown if_effect EFFECT_DEFENSE_DOWN_2, AI_CBM_DefenseDown if_effect EFFECT_SPEED_DOWN_2, AI_CBM_SpeedDown if_effect EFFECT_SPECIAL_ATTACK_DOWN_2, AI_CBM_SpAtkDown if_effect EFFECT_SPECIAL_DEFENSE_DOWN_2, AI_CBM_SpDefDown if_effect EFFECT_ACCURACY_DOWN_2, AI_CBM_AccDown if_effect EFFECT_EVASION_DOWN_2, AI_CBM_EvasionDown if_effect EFFECT_REFLECT, AI_CBM_Reflect if_effect EFFECT_POISON, AI_CBM_Poison if_effect EFFECT_PARALYZE, AI_CBM_Paralyze if_effect EFFECT_SUBSTITUTE, AI_CBM_Substitute if_effect EFFECT_RECHARGE, AI_CBM_HighRiskForDamage if_effect EFFECT_LEECH_SEED, AI_CBM_LeechSeed if_effect EFFECT_DISABLE, AI_CBM_Disable if_effect EFFECT_LEVEL_DAMAGE, AI_CBM_HighRiskForDamage if_effect EFFECT_PSYWAVE, AI_CBM_HighRiskForDamage if_effect EFFECT_COUNTER, AI_CBM_HighRiskForDamage if_effect EFFECT_ENCORE, AI_CBM_Encore if_effect EFFECT_SNORE, AI_CBM_DamageDuringSleep if_effect EFFECT_SLEEP_TALK, AI_CBM_DamageDuringSleep if_effect EFFECT_FLAIL, AI_CBM_HighRiskForDamage if_effect EFFECT_MEAN_LOOK, AI_CBM_CantEscape if_effect EFFECT_NIGHTMARE, AI_CBM_Nightmare if_effect EFFECT_MINIMIZE, AI_CBM_EvasionUp if_effect EFFECT_CURSE, AI_CBM_Curse if_effect EFFECT_SPIKES, AI_CBM_Spikes if_effect EFFECT_FORESIGHT, AI_CBM_Foresight if_effect EFFECT_PERISH_SONG, AI_CBM_PerishSong if_effect EFFECT_SANDSTORM, AI_CBM_Sandstorm if_effect EFFECT_SWAGGER, AI_CBM_Confuse if_effect EFFECT_ATTRACT, AI_CBM_Attract if_effect EFFECT_RETURN, AI_CBM_HighRiskForDamage if_effect EFFECT_PRESENT, AI_CBM_HighRiskForDamage if_effect EFFECT_FRUSTRATION, AI_CBM_HighRiskForDamage if_effect EFFECT_SAFEGUARD, AI_CBM_Safeguard if_effect EFFECT_MAGNITUDE, AI_CBM_Magnitude if_effect EFFECT_BATON_PASS, AI_CBM_BatonPass if_effect EFFECT_SONICBOOM, AI_CBM_HighRiskForDamage if_effect EFFECT_RAIN_DANCE, AI_CBM_RainDance if_effect EFFECT_SUNNY_DAY, AI_CBM_SunnyDay if_effect EFFECT_BELLY_DRUM, AI_CBM_BellyDrum if_effect EFFECT_PSYCH_UP, AI_CBM_Haze if_effect EFFECT_MIRROR_COAT, AI_CBM_HighRiskForDamage if_effect EFFECT_SKULL_BASH, AI_CBM_HighRiskForDamage if_effect EFFECT_FUTURE_SIGHT, AI_CBM_FutureSight if_effect EFFECT_TELEPORT, Score_Minus10 if_effect EFFECT_DEFENSE_CURL, AI_CBM_DefenseUp if_effect EFFECT_FAKE_OUT, AI_CBM_FakeOut if_effect EFFECT_STOCKPILE, AI_CBM_Stockpile if_effect EFFECT_SPIT_UP, AI_CBM_SpitUpAndSwallow if_effect EFFECT_SWALLOW, AI_CBM_SpitUpAndSwallow if_effect EFFECT_HAIL, AI_CBM_Hail if_effect EFFECT_TORMENT, AI_CBM_Torment if_effect EFFECT_FLATTER, AI_CBM_Confuse if_effect EFFECT_WILL_O_WISP, AI_CBM_WillOWisp if_effect EFFECT_MEMENTO, AI_CBM_Memento if_effect EFFECT_FOCUS_PUNCH, AI_CBM_HighRiskForDamage if_effect EFFECT_HELPING_HAND, AI_CBM_HelpingHand if_effect EFFECT_TRICK, AI_CBM_TrickAndKnockOff if_effect EFFECT_INGRAIN, AI_CBM_Ingrain if_effect EFFECT_SUPERPOWER, AI_CBM_HighRiskForDamage if_effect EFFECT_RECYCLE, AI_CBM_Recycle if_effect EFFECT_KNOCK_OFF, AI_CBM_TrickAndKnockOff if_effect EFFECT_ENDEAVOR, AI_CBM_HighRiskForDamage if_effect EFFECT_IMPRISON, AI_CBM_Imprison if_effect EFFECT_REFRESH, AI_CBM_Refresh if_effect EFFECT_LOW_KICK, AI_CBM_HighRiskForDamage if_effect EFFECT_MUD_SPORT, AI_CBM_MudSport if_effect EFFECT_TICKLE, AI_CBM_Tickle if_effect EFFECT_COSMIC_POWER, AI_CBM_CosmicPower if_effect EFFECT_BULK_UP, AI_CBM_BulkUp if_effect EFFECT_WATER_SPORT, AI_CBM_WaterSport if_effect EFFECT_CALM_MIND, AI_CBM_CalmMind if_effect EFFECT_DRAGON_DANCE, AI_CBM_DragonDance end AI_CBM_Sleep:: get_ability AI_TARGET if_equal ABILITY_INSOMNIA, Score_Minus10 if_equal ABILITY_VITAL_SPIRIT, Score_Minus10 if_status AI_TARGET, STATUS1_ANY, Score_Minus10 if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 end AI_CBM_Explosion:: if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_DAMP, Score_Minus10 count_alive_pokemon AI_USER if_not_equal 0, AI_CBM_Explosion_End count_alive_pokemon AI_TARGET if_not_equal 0, Score_Minus10 goto Score_Minus1 AI_CBM_Explosion_End:: end AI_CBM_Nightmare:: if_status2 AI_TARGET, STATUS2_NIGHTMARE, Score_Minus10 if_not_status AI_TARGET, STATUS1_SLEEP, Score_Minus8 end AI_CBM_DreamEater:: if_not_status AI_TARGET, STATUS1_SLEEP, Score_Minus8 if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 end AI_CBM_BellyDrum:: if_hp_less_than AI_USER, 51, Score_Minus10 AI_CBM_AttackUp:: if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 end AI_CBM_DefenseUp:: if_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus10 end AI_CBM_SpeedUp:: if_stat_level_equal AI_USER, STAT_SPEED, 12, Score_Minus10 end AI_CBM_SpAtkUp:: if_stat_level_equal AI_USER, STAT_SPATK, 12, Score_Minus10 end AI_CBM_SpDefUp:: if_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus10 end AI_CBM_AccUp:: if_stat_level_equal AI_USER, STAT_ACC, 12, Score_Minus10 end AI_CBM_EvasionUp:: if_stat_level_equal AI_USER, STAT_EVASION, 12, Score_Minus10 end AI_CBM_AttackDown:: if_stat_level_equal AI_TARGET, STAT_ATK, 0, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_HYPER_CUTTER, Score_Minus10 goto CheckIfAbilityBlocksStatChange AI_CBM_DefenseDown:: if_stat_level_equal AI_TARGET, STAT_DEF, 0, Score_Minus10 goto CheckIfAbilityBlocksStatChange AI_CBM_SpeedDown:: if_stat_level_equal AI_TARGET, STAT_SPEED, 0, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_SPEED_BOOST, Score_Minus10 goto CheckIfAbilityBlocksStatChange AI_CBM_SpAtkDown:: if_stat_level_equal AI_TARGET, STAT_SPATK, 0, Score_Minus10 goto CheckIfAbilityBlocksStatChange AI_CBM_SpDefDown:: if_stat_level_equal AI_TARGET, STAT_SPDEF, 0, Score_Minus10 goto CheckIfAbilityBlocksStatChange AI_CBM_AccDown:: if_stat_level_equal AI_TARGET, STAT_ACC, 0, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_KEEN_EYE, Score_Minus10 goto CheckIfAbilityBlocksStatChange AI_CBM_EvasionDown:: if_stat_level_equal AI_TARGET, STAT_EVASION, 0, Score_Minus10 CheckIfAbilityBlocksStatChange:: get_ability AI_TARGET if_equal ABILITY_CLEAR_BODY, Score_Minus10 if_equal ABILITY_WHITE_SMOKE, Score_Minus10 end AI_CBM_Haze:: if_stat_level_less_than AI_USER, STAT_ATK, 6, AI_CBM_Haze_End if_stat_level_less_than AI_USER, STAT_DEF, 6, AI_CBM_Haze_End if_stat_level_less_than AI_USER, STAT_SPEED, 6, AI_CBM_Haze_End if_stat_level_less_than AI_USER, STAT_SPATK, 6, AI_CBM_Haze_End if_stat_level_less_than AI_USER, STAT_SPDEF, 6, AI_CBM_Haze_End if_stat_level_less_than AI_USER, STAT_ACC, 6, AI_CBM_Haze_End if_stat_level_less_than AI_USER, STAT_EVASION, 6, AI_CBM_Haze_End if_stat_level_more_than AI_TARGET, STAT_ATK, 6, AI_CBM_Haze_End if_stat_level_more_than AI_TARGET, STAT_DEF, 6, AI_CBM_Haze_End if_stat_level_more_than AI_TARGET, STAT_SPEED, 6, AI_CBM_Haze_End if_stat_level_more_than AI_TARGET, STAT_SPATK, 6, AI_CBM_Haze_End if_stat_level_more_than AI_TARGET, STAT_SPDEF, 6, AI_CBM_Haze_End if_stat_level_more_than AI_TARGET, STAT_ACC, 6, AI_CBM_Haze_End if_stat_level_more_than AI_TARGET, STAT_EVASION, 6, AI_CBM_Haze_End goto Score_Minus10 AI_CBM_Haze_End:: end AI_CBM_Roar:: count_alive_pokemon AI_TARGET if_equal 0, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_SUCTION_CUPS, Score_Minus10 end AI_CBM_Poison:: get_target_type1 if_equal TYPE_STEEL, Score_Minus10 if_equal TYPE_POISON, Score_Minus10 get_target_type2 if_equal TYPE_STEEL, Score_Minus10 if_equal TYPE_POISON, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_IMMUNITY, Score_Minus10 if_status AI_TARGET, STATUS1_ANY, Score_Minus10 if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 end AI_CBM_LightScreen:: if_side_affecting AI_USER, SIDE_STATUS_LIGHTSCREEN, Score_Minus8 end AI_CBM_OneHitKO:: if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_STURDY, Score_Minus10 if_level_cond 1, Score_Minus10 end AI_CBM_Magnitude:: get_ability AI_TARGET if_equal ABILITY_LEVITATE, Score_Minus10 AI_CBM_HighRiskForDamage:: if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 get_ability AI_TARGET if_not_equal ABILITY_WONDER_GUARD, AI_CBM_HighRiskForDamage_End if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CBM_HighRiskForDamage_End goto Score_Minus10 AI_CBM_HighRiskForDamage_End:: end AI_CBM_Mist:: if_side_affecting AI_USER, SIDE_STATUS_MIST, Score_Minus8 end AI_CBM_FocusEnergy:: if_status2 AI_USER, STATUS2_FOCUS_ENERGY, Score_Minus10 end AI_CBM_Confuse:: if_status2 AI_TARGET, STATUS2_CONFUSION, Score_Minus5 get_ability AI_TARGET if_equal ABILITY_OWN_TEMPO, Score_Minus10 if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 end AI_CBM_Reflect:: if_side_affecting AI_USER, SIDE_STATUS_REFLECT, Score_Minus8 end AI_CBM_Paralyze:: if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_LIMBER, Score_Minus10 if_status AI_TARGET, STATUS1_ANY, Score_Minus10 if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 end AI_CBM_Substitute:: if_status2 AI_USER, STATUS2_SUBSTITUTE, Score_Minus8 if_hp_less_than AI_USER, 26, Score_Minus10 end AI_CBM_LeechSeed:: if_status3 AI_TARGET, STATUS3_LEECHSEED, Score_Minus10 get_target_type1 if_equal TYPE_GRASS, Score_Minus10 get_target_type2 if_equal TYPE_GRASS, Score_Minus10 end AI_CBM_Disable:: if_any_move_disabled AI_TARGET, Score_Minus8 end AI_CBM_Encore:: if_any_move_encored AI_TARGET, Score_Minus8 end AI_CBM_DamageDuringSleep:: if_not_status AI_USER, STATUS1_SLEEP, Score_Minus8 end AI_CBM_CantEscape:: if_status2 AI_TARGET, STATUS2_ESCAPE_PREVENTION, Score_Minus10 end AI_CBM_Curse:: if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 if_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus8 end AI_CBM_Spikes:: if_side_affecting AI_TARGET, SIDE_STATUS_SPIKES, Score_Minus10 end AI_CBM_Foresight:: if_status2 AI_TARGET, STATUS2_FORESIGHT, Score_Minus10 end AI_CBM_PerishSong:: if_status3 AI_TARGET, STATUS3_PERISH_SONG, Score_Minus10 end AI_CBM_Sandstorm:: get_weather if_equal AI_WEATHER_SANDSTORM, Score_Minus8 end AI_CBM_Attract:: if_status2 AI_TARGET, STATUS2_INFATUATION, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_OBLIVIOUS, Score_Minus10 get_gender AI_USER if_equal MON_MALE, AI_CBM_Attract_CheckIfTargetIsFemale if_equal MON_FEMALE, AI_CBM_Attract_CheckIfTargetIsMale goto Score_Minus10 AI_CBM_Attract_CheckIfTargetIsFemale:: get_gender AI_TARGET if_equal MON_FEMALE, AI_CBM_Attract_End goto Score_Minus10 AI_CBM_Attract_CheckIfTargetIsMale:: get_gender AI_TARGET if_equal MON_MALE, AI_CBM_Attract_End goto Score_Minus10 AI_CBM_Attract_End:: end AI_CBM_Safeguard:: if_side_affecting AI_USER, SIDE_STATUS_SAFEGUARD, Score_Minus8 end AI_CBM_Memento:: if_stat_level_equal AI_TARGET, STAT_ATK, 0, Score_Minus10 if_stat_level_equal AI_TARGET, STAT_SPATK, 0, Score_Minus8 AI_CBM_BatonPass:: count_alive_pokemon AI_USER if_equal 0, Score_Minus10 end AI_CBM_RainDance:: get_weather if_equal AI_WEATHER_RAIN, Score_Minus8 end AI_CBM_SunnyDay:: get_weather if_equal AI_WEATHER_SUN, Score_Minus8 end AI_CBM_FutureSight:: if_side_affecting AI_TARGET, SIDE_STATUS_FUTUREATTACK, Score_Minus10 if_side_affecting AI_USER, SIDE_STATUS_FUTUREATTACK, Score_Minus12 end AI_CBM_FakeOut:: is_first_turn_for AI_USER if_equal 0, Score_Minus10 end AI_CBM_Stockpile:: get_stockpile_count AI_USER if_equal 3, Score_Minus10 end AI_CBM_SpitUpAndSwallow:: if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 get_stockpile_count AI_USER if_equal 0, Score_Minus10 end AI_CBM_Hail:: get_weather if_equal AI_WEATHER_HAIL, Score_Minus8 end AI_CBM_Torment:: if_status2 AI_TARGET, STATUS2_TORMENT, Score_Minus10 end AI_CBM_WillOWisp:: get_ability AI_TARGET if_equal ABILITY_WATER_VEIL, Score_Minus10 if_status AI_TARGET, STATUS1_ANY, Score_Minus10 if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 if_type_effectiveness AI_EFFECTIVENESS_x0_5, Score_Minus10 if_type_effectiveness AI_EFFECTIVENESS_x0_25, Score_Minus10 if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 end AI_CBM_HelpingHand:: if_not_double_battle Score_Minus10 end AI_CBM_TrickAndKnockOff:: get_ability AI_TARGET if_equal ABILITY_STICKY_HOLD, Score_Minus10 end AI_CBM_Ingrain:: if_status3 AI_USER, STATUS3_ROOTED, Score_Minus10 end AI_CBM_Recycle:: get_used_held_item AI_USER if_equal ITEM_NONE, Score_Minus10 end AI_CBM_Imprison:: if_status3 AI_USER, STATUS3_IMPRISONED_OTHERS, Score_Minus10 end AI_CBM_Refresh:: if_not_status AI_USER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, Score_Minus10 end AI_CBM_MudSport:: if_status3 AI_USER, STATUS3_MUDSPORT, Score_Minus10 end AI_CBM_Tickle:: if_stat_level_equal AI_TARGET, STAT_ATK, 0, Score_Minus10 if_stat_level_equal AI_TARGET, STAT_DEF, 0, Score_Minus8 end AI_CBM_CosmicPower:: if_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus10 if_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus8 end AI_CBM_BulkUp:: if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 if_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus8 end AI_CBM_WaterSport:: if_status3 AI_USER, STATUS3_WATERSPORT, Score_Minus10 end AI_CBM_CalmMind:: if_stat_level_equal AI_USER, STAT_SPATK, 12, Score_Minus10 if_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus8 end AI_CBM_DragonDance:: if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 if_stat_level_equal AI_USER, STAT_SPEED, 12, Score_Minus8 end Score_Minus1:: score -1 end Score_Minus2:: score -2 end Score_Minus3:: score -3 end Score_Minus5:: score -5 end Score_Minus8:: score -8 end Score_Minus10:: score -10 end Score_Minus12:: score -12 end Score_Plus1:: score +1 end Score_Plus2:: score +2 end Score_Plus3:: score +3 end Score_Plus5:: score +5 end Score_Plus10:: score +10 end AI_CheckViability:: if_effect EFFECT_SLEEP, AI_CV_Sleep if_effect EFFECT_ABSORB, AI_CV_Absorb if_effect EFFECT_EXPLOSION, AI_CV_SelfKO if_effect EFFECT_DREAM_EATER, AI_CV_DreamEater if_effect EFFECT_MIRROR_MOVE, AI_CV_MirrorMove if_effect EFFECT_ATTACK_UP, AI_CV_AttackUp if_effect EFFECT_DEFENSE_UP, AI_CV_DefenseUp if_effect EFFECT_SPEED_UP, AI_CV_SpeedUp if_effect EFFECT_SPECIAL_ATTACK_UP, AI_CV_SpAtkUp if_effect EFFECT_SPECIAL_DEFENSE_UP, AI_CV_SpDefUp if_effect EFFECT_ACCURACY_UP, AI_CV_AccuracyUp if_effect EFFECT_EVASION_UP, AI_CV_EvasionUp if_effect EFFECT_ALWAYS_HIT, AI_CV_AlwaysHit if_effect EFFECT_ATTACK_DOWN, AI_CV_AttackDown if_effect EFFECT_DEFENSE_DOWN, AI_CV_DefenseDown if_effect EFFECT_SPEED_DOWN, AI_CV_SpeedDown if_effect EFFECT_SPECIAL_ATTACK_DOWN, AI_CV_SpAtkDown if_effect EFFECT_SPECIAL_DEFENSE_DOWN, AI_CV_SpDefDown if_effect EFFECT_ACCURACY_DOWN, AI_CV_AccuracyDown if_effect EFFECT_EVASION_DOWN, AI_CV_EvasionDown if_effect EFFECT_HAZE, AI_CV_Haze if_effect EFFECT_BIDE, AI_CV_Bide if_effect EFFECT_ROAR, AI_CV_Roar if_effect EFFECT_CONVERSION, AI_CV_Conversion if_effect EFFECT_RESTORE_HP, AI_CV_Heal if_effect EFFECT_TOXIC, AI_CV_Toxic if_effect EFFECT_LIGHT_SCREEN, AI_CV_LightScreen if_effect EFFECT_REST, AI_CV_Rest if_effect EFFECT_OHKO, AI_CV_OneHitKO if_effect EFFECT_RAZOR_WIND, AI_CV_ChargeUpMove if_effect EFFECT_SUPER_FANG, AI_CV_SuperFang if_effect EFFECT_TRAP, AI_CV_Trap if_effect EFFECT_HIGH_CRITICAL, AI_CV_HighCrit if_effect EFFECT_CONFUSE, AI_CV_Confuse if_effect EFFECT_ATTACK_UP_2, AI_CV_AttackUp if_effect EFFECT_DEFENSE_UP_2, AI_CV_DefenseUp if_effect EFFECT_SPEED_UP_2, AI_CV_SpeedUp if_effect EFFECT_SPECIAL_ATTACK_UP_2, AI_CV_SpAtkUp if_effect EFFECT_SPECIAL_DEFENSE_UP_2, AI_CV_SpDefUp if_effect EFFECT_ACCURACY_UP_2, AI_CV_AccuracyUp if_effect EFFECT_EVASION_UP_2, AI_CV_EvasionUp if_effect EFFECT_ATTACK_DOWN_2, AI_CV_AttackDown if_effect EFFECT_DEFENSE_DOWN_2, AI_CV_DefenseDown if_effect EFFECT_SPEED_DOWN_2, AI_CV_SpeedDown if_effect EFFECT_SPECIAL_ATTACK_DOWN_2, AI_CV_SpAtkDown if_effect EFFECT_SPECIAL_DEFENSE_DOWN_2, AI_CV_SpDefDown if_effect EFFECT_ACCURACY_DOWN_2, AI_CV_AccuracyDown if_effect EFFECT_EVASION_DOWN_2, AI_CV_EvasionDown if_effect EFFECT_REFLECT, AI_CV_Reflect if_effect EFFECT_POISON, AI_CV_Poison if_effect EFFECT_PARALYZE, AI_CV_Paralyze if_effect EFFECT_SWAGGER, AI_CV_Swagger if_effect EFFECT_SPEED_DOWN_HIT, AI_CV_SpeedDownFromChance if_effect EFFECT_SKY_ATTACK, AI_CV_ChargeUpMove if_effect EFFECT_VITAL_THROW, AI_CV_VitalThrow if_effect EFFECT_SUBSTITUTE, AI_CV_Substitute if_effect EFFECT_RECHARGE, AI_CV_Recharge if_effect EFFECT_LEECH_SEED, AI_CV_Toxic if_effect EFFECT_DISABLE, AI_CV_Disable if_effect EFFECT_COUNTER, AI_CV_Counter if_effect EFFECT_ENCORE, AI_CV_Encore if_effect EFFECT_PAIN_SPLIT, AI_CV_PainSplit if_effect EFFECT_SNORE, AI_CV_Snore if_effect EFFECT_LOCK_ON, AI_CV_LockOn if_effect EFFECT_SLEEP_TALK, AI_CV_SleepTalk if_effect EFFECT_DESTINY_BOND, AI_CV_DestinyBond if_effect EFFECT_FLAIL, AI_CV_Flail if_effect EFFECT_HEAL_BELL, AI_CV_HealBell if_effect EFFECT_THIEF, AI_CV_Thief if_effect EFFECT_MEAN_LOOK, AI_CV_Trap if_effect EFFECT_MINIMIZE, AI_CV_EvasionUp if_effect EFFECT_CURSE, AI_CV_Curse if_effect EFFECT_PROTECT, AI_CV_Protect if_effect EFFECT_FORESIGHT, AI_CV_Foresight if_effect EFFECT_ENDURE, AI_CV_Endure if_effect EFFECT_BATON_PASS, AI_CV_BatonPass if_effect EFFECT_PURSUIT, AI_CV_Pursuit if_effect EFFECT_MORNING_SUN, AI_CV_HealWeather if_effect EFFECT_SYNTHESIS, AI_CV_HealWeather if_effect EFFECT_MOONLIGHT, AI_CV_HealWeather if_effect EFFECT_RAIN_DANCE, AI_CV_RainDance if_effect EFFECT_SUNNY_DAY, AI_CV_SunnyDay if_effect EFFECT_BELLY_DRUM, AI_CV_BellyDrum if_effect EFFECT_PSYCH_UP, AI_CV_PsychUp if_effect EFFECT_MIRROR_COAT, AI_CV_MirrorCoat if_effect EFFECT_SKULL_BASH, AI_CV_ChargeUpMove if_effect EFFECT_SOLAR_BEAM, AI_CV_ChargeUpMove if_effect EFFECT_SEMI_INVULNERABLE, AI_CV_SemiInvulnerable if_effect EFFECT_SOFTBOILED, AI_CV_Heal if_effect EFFECT_FAKE_OUT, AI_CV_FakeOut if_effect EFFECT_SPIT_UP, AI_CV_SpitUp if_effect EFFECT_SWALLOW, AI_CV_Heal if_effect EFFECT_HAIL, AI_CV_Hail if_effect EFFECT_FLATTER, AI_CV_Flatter if_effect EFFECT_MEMENTO, AI_CV_SelfKO if_effect EFFECT_FACADE, AI_CV_Facade if_effect EFFECT_FOCUS_PUNCH, AI_CV_FocusPunch if_effect EFFECT_SMELLINGSALT, AI_CV_SmellingSalt if_effect EFFECT_TRICK, AI_CV_Trick if_effect EFFECT_ROLE_PLAY, AI_CV_ChangeSelfAbility if_effect EFFECT_SUPERPOWER, AI_CV_Superpower if_effect EFFECT_MAGIC_COAT, AI_CV_MagicCoat if_effect EFFECT_RECYCLE, AI_CV_Recycle if_effect EFFECT_REVENGE, AI_CV_Revenge if_effect EFFECT_BRICK_BREAK, AI_CV_BrickBreak if_effect EFFECT_KNOCK_OFF, AI_CV_KnockOff if_effect EFFECT_ENDEAVOR, AI_CV_Endeavor if_effect EFFECT_ERUPTION, AI_CV_Eruption if_effect EFFECT_SKILL_SWAP, AI_CV_ChangeSelfAbility if_effect EFFECT_IMPRISON, AI_CV_Imprison if_effect EFFECT_REFRESH, AI_CV_Refresh if_effect EFFECT_SNATCH, AI_CV_Snatch if_effect EFFECT_BLAZE_KICK, AI_CV_HighCrit if_effect EFFECT_MUD_SPORT, AI_CV_MudSport if_effect EFFECT_OVERHEAT, AI_CV_Overheat if_effect EFFECT_TICKLE, AI_CV_DefenseDown if_effect EFFECT_COSMIC_POWER, AI_CV_SpDefUp if_effect EFFECT_BULK_UP, AI_CV_DefenseUp if_effect EFFECT_POISON_TAIL, AI_CV_HighCrit if_effect EFFECT_WATER_SPORT, AI_CV_WaterSport if_effect EFFECT_CALM_MIND, AI_CV_SpDefUp if_effect EFFECT_DRAGON_DANCE, AI_CV_DragonDance end AI_CV_Sleep:: if_has_move_with_effect AI_TARGET, EFFECT_DREAM_EATER, AI_CV_SleepEncourageSlpDamage if_has_move_with_effect AI_TARGET, EFFECT_NIGHTMARE, AI_CV_SleepEncourageSlpDamage goto AI_CV_Sleep_End AI_CV_SleepEncourageSlpDamage:: if_random_less_than 128, AI_CV_Sleep_End score +1 AI_CV_Sleep_End:: end AI_CV_Absorb:: if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_AbsorbEncourageMaybe if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_AbsorbEncourageMaybe goto AI_CV_Absorb_End AI_CV_AbsorbEncourageMaybe:: if_random_less_than 50, AI_CV_Absorb_End score -3 AI_CV_Absorb_End:: end AI_CV_SelfKO:: if_stat_level_less_than AI_TARGET, STAT_EVASION, 7, AI_CV_SelfKO_Encourage1 score -1 if_stat_level_less_than AI_TARGET, STAT_EVASION, 10, AI_CV_SelfKO_Encourage1 if_random_less_than 128, AI_CV_SelfKO_Encourage1 score -1 AI_CV_SelfKO_Encourage1:: if_hp_less_than AI_USER, 80, AI_CV_SelfKO_Encourage2 if_target_faster AI_CV_SelfKO_Encourage2 if_random_less_than 50, AI_CV_SelfKO_End goto Score_Minus3 AI_CV_SelfKO_Encourage2:: if_hp_more_than AI_USER, 50, AI_CV_SelfKO_Encourage4 if_random_less_than 128, AI_CV_SelfKO_Encourage3 score +1 AI_CV_SelfKO_Encourage3:: if_hp_more_than AI_USER, 30, AI_CV_SelfKO_End if_random_less_than 50, AI_CV_SelfKO_End score +1 goto AI_CV_SelfKO_End AI_CV_SelfKO_Encourage4:: if_random_less_than 50, AI_CV_SelfKO_End score -1 AI_CV_SelfKO_End:: end AI_CV_DreamEater:: if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_DreamEater_ScoreDown1 if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_DreamEater_ScoreDown1 goto AI_CV_DreamEater_End AI_CV_DreamEater_ScoreDown1:: score -1 AI_CV_DreamEater_End:: end AI_CV_MirrorMove:: if_target_faster AI_CV_MirrorMove2 get_last_used_move AI_TARGET if_not_in_hwords AI_CV_MirrorMove_EncouragedMovesToMirror, AI_CV_MirrorMove2 if_random_less_than 128, AI_CV_MirrorMove_End score +2 goto AI_CV_MirrorMove_End AI_CV_MirrorMove2:: get_last_used_move AI_TARGET if_in_hwords AI_CV_MirrorMove_EncouragedMovesToMirror, AI_CV_MirrorMove_End if_random_less_than 80, AI_CV_MirrorMove_End score -1 AI_CV_MirrorMove_End:: end .space 2 AI_CV_MirrorMove_EncouragedMovesToMirror:: .align 1 .2byte MOVE_SLEEP_POWDER .2byte MOVE_LOVELY_KISS .2byte MOVE_SPORE .2byte MOVE_HYPNOSIS .2byte MOVE_SING .2byte MOVE_GRASS_WHISTLE .2byte MOVE_SHADOW_PUNCH .2byte MOVE_SAND_ATTACK .2byte MOVE_SMOKESCREEN .2byte MOVE_TOXIC .2byte MOVE_GUILLOTINE .2byte MOVE_HORN_DRILL .2byte MOVE_FISSURE .2byte MOVE_SHEER_COLD .2byte MOVE_CROSS_CHOP .2byte MOVE_AEROBLAST .2byte MOVE_CONFUSE_RAY .2byte MOVE_SWEET_KISS .2byte MOVE_SCREECH .2byte MOVE_COTTON_SPORE .2byte MOVE_SCARY_FACE .2byte MOVE_FAKE_TEARS .2byte MOVE_METAL_SOUND .2byte MOVE_THUNDER_WAVE .2byte MOVE_GLARE .2byte MOVE_POISON_POWDER .2byte MOVE_SHADOW_BALL .2byte MOVE_DYNAMIC_PUNCH .2byte MOVE_HYPER_BEAM .2byte MOVE_EXTREME_SPEED .2byte MOVE_THIEF .2byte MOVE_COVET .2byte MOVE_ATTRACT .2byte MOVE_SWAGGER .2byte MOVE_TORMENT .2byte MOVE_FLATTER .2byte MOVE_TRICK .2byte MOVE_SUPERPOWER .2byte MOVE_SKILL_SWAP .2byte -1 AI_CV_AttackUp:: if_stat_level_less_than AI_USER, STAT_ATK, 9, AI_CV_AttackUp2 if_random_less_than 100, AI_CV_AttackUp3 score -1 goto AI_CV_AttackUp3 AI_CV_AttackUp2:: if_hp_not_equal AI_USER, 100, AI_CV_AttackUp3 if_random_less_than 128, AI_CV_AttackUp3 score +2 AI_CV_AttackUp3:: if_hp_more_than AI_USER, 70, AI_CV_AttackUp_End if_hp_less_than AI_USER, 40, AI_CV_AttackUp_ScoreDown2 if_random_less_than 40, AI_CV_AttackUp_End AI_CV_AttackUp_ScoreDown2:: score -2 AI_CV_AttackUp_End:: end AI_CV_DefenseUp:: if_stat_level_less_than AI_USER, STAT_DEF, 9, AI_CV_DefenseUp2 if_random_less_than 100, AI_CV_DefenseUp3 score -1 goto AI_CV_DefenseUp3 AI_CV_DefenseUp2:: if_hp_not_equal AI_USER, 100, AI_CV_DefenseUp3 if_random_less_than 128, AI_CV_DefenseUp3 score +2 AI_CV_DefenseUp3:: if_hp_less_than AI_USER, 70, AI_CV_DefenseUp4 if_random_less_than 200, AI_CV_DefenseUp_End AI_CV_DefenseUp4:: if_hp_less_than AI_USER, 40, AI_CV_DefenseUp_ScoreDown2 get_last_used_move AI_TARGET get_move_power_from_result if_equal 0, AI_CV_DefenseUp5 get_last_used_move AI_TARGET get_move_type_from_result if_not_in_bytes AI_CV_DefenseUp_PhysicalTypes, AI_CV_DefenseUp_ScoreDown2 if_random_less_than 60, AI_CV_DefenseUp_End AI_CV_DefenseUp5:: if_random_less_than 60, AI_CV_DefenseUp_End AI_CV_DefenseUp_ScoreDown2:: score -2 AI_CV_DefenseUp_End:: end AI_CV_DefenseUp_PhysicalTypes:: .byte TYPE_NORMAL .byte TYPE_FIGHTING .byte TYPE_POISON .byte TYPE_GROUND .byte TYPE_FLYING .byte TYPE_ROCK .byte TYPE_BUG .byte TYPE_GHOST .byte TYPE_STEEL .byte -1 AI_CV_SpeedUp:: if_target_faster AI_CV_SpeedUp2 score -3 goto AI_CV_SpeedUp_End AI_CV_SpeedUp2:: if_random_less_than 70, AI_CV_SpeedUp_End score +3 AI_CV_SpeedUp_End:: end AI_CV_SpAtkUp:: if_stat_level_less_than AI_USER, STAT_SPATK, 9, AI_CV_SpAtkUp2 if_random_less_than 100, AI_CV_SpAtkUp3 score -1 goto AI_CV_SpAtkUp3 AI_CV_SpAtkUp2:: if_hp_not_equal AI_USER, 100, AI_CV_SpAtkUp3 if_random_less_than 128, AI_CV_SpAtkUp3 score +2 AI_CV_SpAtkUp3:: if_hp_more_than AI_USER, 70, AI_CV_SpAtkUp_End if_hp_less_than AI_USER, 40, AI_CV_SpAtkUp_ScoreDown2 if_random_less_than 70, AI_CV_SpAtkUp_End AI_CV_SpAtkUp_ScoreDown2:: score -2 AI_CV_SpAtkUp_End:: end AI_CV_SpDefUp:: if_stat_level_less_than AI_USER, STAT_SPDEF, 9, AI_CV_SpDefUp2 if_random_less_than 100, AI_CV_SpDefUp3 score -1 goto AI_CV_SpDefUp3 AI_CV_SpDefUp2:: if_hp_not_equal AI_USER, 100, AI_CV_SpDefUp3 if_random_less_than 128, AI_CV_SpDefUp3 score +2 AI_CV_SpDefUp3:: if_hp_less_than AI_USER, 70, AI_CV_SpDefUp4 if_random_less_than 200, AI_CV_SpDefUp_End AI_CV_SpDefUp4:: if_hp_less_than AI_USER, 40, AI_CV_SpDefUp_ScoreDown2 get_last_used_move AI_TARGET get_move_power_from_result if_equal 0, AI_CV_SpDefUp5 get_last_used_move AI_TARGET get_move_type_from_result if_in_bytes AI_CV_SpDefUp_PhysicalTypes, AI_CV_SpDefUp_ScoreDown2 if_random_less_than 60, AI_CV_SpDefUp_End AI_CV_SpDefUp5:: if_random_less_than 60, AI_CV_SpDefUp_End AI_CV_SpDefUp_ScoreDown2:: score -2 AI_CV_SpDefUp_End:: end AI_CV_SpDefUp_PhysicalTypes:: .byte TYPE_NORMAL .byte TYPE_FIGHTING .byte TYPE_POISON .byte TYPE_GROUND .byte TYPE_FLYING .byte TYPE_ROCK .byte TYPE_BUG .byte TYPE_GHOST .byte TYPE_STEEL .byte -1 AI_CV_AccuracyUp:: if_stat_level_less_than AI_USER, STAT_ACC, 9, AI_CV_AccuracyUp2 if_random_less_than 50, AI_CV_AccuracyUp2 score -2 AI_CV_AccuracyUp2:: if_hp_more_than AI_USER, 70, AI_CV_AccuracyUp_End score -2 AI_CV_AccuracyUp_End:: end AI_CV_EvasionUp:: if_hp_less_than AI_USER, 90, AI_CV_EvasionUp2 if_random_less_than 100, AI_CV_EvasionUp2 score +3 AI_CV_EvasionUp2:: if_stat_level_less_than AI_USER, STAT_EVASION, 9, AI_CV_EvasionUp3 if_random_less_than 128, AI_CV_EvasionUp3 score -1 AI_CV_EvasionUp3:: if_not_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_EvasionUp5 if_hp_more_than AI_USER, 50, AI_CV_EvasionUp4 if_random_less_than 80, AI_CV_EvasionUp5 AI_CV_EvasionUp4:: if_random_less_than 50, AI_CV_EvasionUp5 score +3 AI_CV_EvasionUp5:: if_not_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_EvasionUp6 if_random_less_than 70, AI_CV_EvasionUp6 score +3 AI_CV_EvasionUp6:: if_not_status3 AI_USER, STATUS3_ROOTED, AI_CV_EvasionUp7 if_random_less_than 128, AI_CV_EvasionUp7 score +2 AI_CV_EvasionUp7:: if_not_status2 AI_TARGET, STATUS2_CURSED, AI_CV_EvasionUp8 if_random_less_than 70, AI_CV_EvasionUp8 score +3 AI_CV_EvasionUp8:: if_hp_more_than AI_USER, 70, AI_CV_EvasionUp_End if_stat_level_equal AI_USER, STAT_EVASION, 6, AI_CV_EvasionUp_End if_hp_less_than AI_USER, 40, AI_CV_EvasionUp_ScoreDown2 if_hp_less_than AI_TARGET, 40, AI_CV_EvasionUp_ScoreDown2 if_random_less_than 70, AI_CV_EvasionUp_End AI_CV_EvasionUp_ScoreDown2:: score -2 AI_CV_EvasionUp_End:: end AI_CV_AlwaysHit:: if_stat_level_more_than AI_TARGET, STAT_EVASION, 10, AI_CV_AlwaysHit_ScoreUp1 if_stat_level_less_than AI_USER, STAT_ACC, 2, AI_CV_AlwaysHit_ScoreUp1 if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_AlwaysHit2 if_stat_level_less_than AI_USER, STAT_ACC, 4, AI_CV_AlwaysHit2 goto AI_CV_AlwaysHit_End AI_CV_AlwaysHit_ScoreUp1:: score +1 AI_CV_AlwaysHit2:: if_random_less_than 100, AI_CV_AlwaysHit_End score +1 AI_CV_AlwaysHit_End:: end AI_CV_AttackDown:: if_stat_level_equal AI_TARGET, STAT_ATK, 6, AI_CV_AttackDown3 score -1 if_hp_more_than AI_USER, 90, AI_CV_AttackDown2 score -1 AI_CV_AttackDown2:: if_stat_level_more_than AI_TARGET, STAT_ATK, 3, AI_CV_AttackDown3 if_random_less_than 50, AI_CV_AttackDown3 score -2 AI_CV_AttackDown3:: if_hp_more_than AI_TARGET, 70, AI_CV_AttackDown4 score -2 AI_CV_AttackDown4:: get_target_type1 if_in_bytes AI_CV_AttackDown_PhysicalTypeList, AI_CV_AttackDown_End get_target_type2 if_in_bytes AI_CV_AttackDown_PhysicalTypeList, AI_CV_AttackDown_End if_random_less_than 50, AI_CV_AttackDown_End score -2 AI_CV_AttackDown_End:: end @ Missing Poison, Flying, and Ghost for unknown reason AI_CV_AttackDown_PhysicalTypeList:: .byte TYPE_NORMAL .byte TYPE_FIGHTING .byte TYPE_GROUND .byte TYPE_ROCK .byte TYPE_BUG .byte TYPE_STEEL .byte -1 AI_CV_DefenseDown:: if_hp_less_than AI_USER, 70, AI_CV_DefenseDown2 if_stat_level_more_than AI_TARGET, STAT_DEF, 3, AI_CV_DefenseDown3 AI_CV_DefenseDown2:: if_random_less_than 50, AI_CV_DefenseDown3 score -2 AI_CV_DefenseDown3:: if_hp_more_than AI_TARGET, 70, AI_CV_DefenseDown_End score -2 AI_CV_DefenseDown_End:: end AI_CV_SpeedDownFromChance:: if_move MOVE_ICY_WIND, AI_CV_SpeedDown if_move MOVE_ROCK_TOMB, AI_CV_SpeedDown if_move MOVE_MUD_SHOT, AI_CV_SpeedDown end AI_CV_SpeedDown:: if_target_faster AI_CV_SpeedDown2 score -3 goto AI_CV_SpeedDown_End AI_CV_SpeedDown2:: if_random_less_than 70, AI_CV_SpeedDown_End score +2 AI_CV_SpeedDown_End:: end AI_CV_SpAtkDown:: if_stat_level_equal AI_TARGET, STAT_ATK, 6, AI_CV_SpAtkDown3 score -1 if_hp_more_than AI_USER, 90, AI_CV_SpAtkDown2 score -1 AI_CV_SpAtkDown2:: if_stat_level_more_than AI_TARGET, STAT_SPATK, 3, AI_CV_SpAtkDown3 if_random_less_than 50, AI_CV_SpAtkDown3 score -2 AI_CV_SpAtkDown3:: if_hp_more_than AI_TARGET, 70, AI_CV_SpAtkDown4 score -2 AI_CV_SpAtkDown4:: get_target_type1 if_in_bytes AI_CV_SpAtkDown_SpecialTypeList, AI_CV_SpAtkDown_End get_target_type2 if_in_bytes AI_CV_SpAtkDown_SpecialTypeList, AI_CV_SpAtkDown_End if_random_less_than 50, AI_CV_SpAtkDown_End score -2 AI_CV_SpAtkDown_End:: end AI_CV_SpAtkDown_SpecialTypeList:: .byte TYPE_FIRE .byte TYPE_WATER .byte TYPE_GRASS .byte TYPE_ELECTRIC .byte TYPE_PSYCHIC .byte TYPE_ICE .byte TYPE_DRAGON .byte TYPE_DARK .byte -1 AI_CV_SpDefDown:: if_hp_less_than AI_USER, 70, AI_CV_SpDefDown2 if_stat_level_more_than AI_TARGET, STAT_SPDEF, 3, AI_CV_SpDefDown3 AI_CV_SpDefDown2:: if_random_less_than 50, AI_CV_SpDefDown3 score -2 AI_CV_SpDefDown3:: if_hp_more_than AI_TARGET, 70, AI_CV_SpDefDown_End score -2 AI_CV_SpDefDown_End:: end AI_CV_AccuracyDown:: if_hp_less_than AI_USER, 70, AI_CV_AccuracyDown2 if_hp_more_than AI_TARGET, 70, AI_CV_AccuracyDown3 AI_CV_AccuracyDown2:: if_random_less_than 100, AI_CV_AccuracyDown3 score -1 AI_CV_AccuracyDown3:: if_stat_level_more_than AI_USER, STAT_ACC, 4, AI_CV_AccuracyDown4 if_random_less_than 80, AI_CV_AccuracyDown4 score -2 AI_CV_AccuracyDown4:: if_not_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_AccuracyDown5 if_random_less_than 70, AI_CV_AccuracyDown5 score +2 AI_CV_AccuracyDown5:: if_not_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_AccuracyDown6 if_random_less_than 70, AI_CV_AccuracyDown6 score +2 AI_CV_AccuracyDown6:: if_not_status3 AI_USER, STATUS3_ROOTED, AI_CV_AccuracyDown7 if_random_less_than 128, AI_CV_AccuracyDown7 score +1 AI_CV_AccuracyDown7:: if_not_status2 AI_TARGET, STATUS2_CURSED, AI_CV_AccuracyDown8 if_random_less_than 70, AI_CV_AccuracyDown8 score +2 AI_CV_AccuracyDown8:: if_hp_more_than AI_USER, 70, AI_CV_AccuracyDown_End if_stat_level_equal AI_TARGET, STAT_ACC, 6, AI_CV_AccuracyDown_End if_hp_less_than AI_USER, 40, AI_CV_AccuracyDown_ScoreDown2 if_hp_less_than AI_TARGET, 40, AI_CV_AccuracyDown_ScoreDown2 if_random_less_than 70, AI_CV_AccuracyDown_End AI_CV_AccuracyDown_ScoreDown2:: score -2 AI_CV_AccuracyDown_End:: end AI_CV_EvasionDown:: if_hp_less_than AI_USER, 70, AI_CV_EvasionDown2 if_stat_level_more_than AI_TARGET, STAT_EVASION, 3, AI_CV_EvasionDown3 AI_CV_EvasionDown2:: if_random_less_than 50, AI_CV_EvasionDown3 score -2 AI_CV_EvasionDown3:: if_hp_more_than AI_TARGET, 70, AI_CV_EvasionDown_End score -2 AI_CV_EvasionDown_End:: end AI_CV_Haze:: if_stat_level_more_than AI_USER, STAT_ATK, 8, AI_CV_Haze2 if_stat_level_more_than AI_USER, STAT_DEF, 8, AI_CV_Haze2 if_stat_level_more_than AI_USER, STAT_SPATK, 8, AI_CV_Haze2 if_stat_level_more_than AI_USER, STAT_SPDEF, 8, AI_CV_Haze2 if_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_Haze2 if_stat_level_less_than AI_TARGET, STAT_ATK, 4, AI_CV_Haze2 if_stat_level_less_than AI_TARGET, STAT_DEF, 4, AI_CV_Haze2 if_stat_level_less_than AI_TARGET, STAT_SPATK, 4, AI_CV_Haze2 if_stat_level_less_than AI_TARGET, STAT_SPDEF, 4, AI_CV_Haze2 if_stat_level_less_than AI_TARGET, STAT_ACC, 4, AI_CV_Haze2 goto AI_CV_Haze3 AI_CV_Haze2:: if_random_less_than 50, AI_CV_Haze3 score -3 AI_CV_Haze3:: if_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_Haze4 if_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_Haze4 if_stat_level_more_than AI_TARGET, STAT_SPATK, 8, AI_CV_Haze4 if_stat_level_more_than AI_TARGET, STAT_SPDEF, 8, AI_CV_Haze4 if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_Haze4 if_stat_level_less_than AI_USER, STAT_ATK, 4, AI_CV_Haze4 if_stat_level_less_than AI_USER, STAT_DEF, 4, AI_CV_Haze4 if_stat_level_less_than AI_USER, STAT_SPATK, 4, AI_CV_Haze4 if_stat_level_less_than AI_USER, STAT_SPDEF, 4, AI_CV_Haze4 if_stat_level_less_than AI_USER, STAT_ACC, 4, AI_CV_Haze4 if_random_less_than 50, AI_CV_Haze_End score -1 goto AI_CV_Haze_End AI_CV_Haze4:: if_random_less_than 50, AI_CV_Haze_End score +3 AI_CV_Haze_End:: end AI_CV_Bide:: if_hp_more_than AI_USER, 90, AI_CV_Bide_End score -2 AI_CV_Bide_End:: end AI_CV_Roar:: if_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_Roar2 if_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_Roar2 if_stat_level_more_than AI_TARGET, STAT_SPATK, 8, AI_CV_Roar2 if_stat_level_more_than AI_TARGET, STAT_SPDEF, 8, AI_CV_Roar2 if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_Roar2 score -3 goto AI_CV_Roar_End AI_CV_Roar2:: if_random_less_than 128, AI_CV_Roar_End score +2 AI_CV_Roar_End:: end AI_CV_Conversion:: if_hp_more_than AI_USER, 90, AI_CV_Conversion2 score -2 AI_CV_Conversion2:: get_turn_count if_equal 0, AI_CV_Conversion_End if_random_less_than 200, Score_Minus2 AI_CV_Conversion_End:: end AI_CV_HealWeather:: get_weather if_equal AI_WEATHER_HAIL, AI_CV_HealWeather_ScoreDown2 if_equal AI_WEATHER_RAIN, AI_CV_HealWeather_ScoreDown2 if_equal AI_WEATHER_SANDSTORM, AI_CV_HealWeather_ScoreDown2 goto AI_CV_Heal AI_CV_HealWeather_ScoreDown2:: score -2 AI_CV_Heal:: if_hp_equal AI_USER, 100, AI_CV_Heal3 if_target_faster AI_CV_Heal4 score -8 goto AI_CV_Heal_End @ Never reached AI_CV_Heal2: if_hp_less_than AI_USER, 50, AI_CV_Heal5 if_hp_more_than AI_USER, 80, AI_CV_Heal3 if_random_less_than 70, AI_CV_Heal5 AI_CV_Heal3:: score -3 goto AI_CV_Heal_End AI_CV_Heal4:: if_hp_less_than AI_USER, 70, AI_CV_Heal5 if_random_less_than 30, AI_CV_Heal5 score -3 goto AI_CV_Heal_End AI_CV_Heal5:: if_doesnt_have_move_with_effect AI_TARGET, EFFECT_SNATCH, AI_CV_Heal6 if_random_less_than 100, AI_CV_Heal_End AI_CV_Heal6:: if_random_less_than 20, AI_CV_Heal_End score +2 AI_CV_Heal_End:: end AI_CV_Toxic:: if_user_has_no_attacking_moves AI_CV_Toxic3 if_hp_more_than AI_USER, 50, AI_CV_Toxic2 if_random_less_than 50, AI_CV_Toxic2 score -3 AI_CV_Toxic2:: if_hp_more_than AI_TARGET, 50, AI_CV_Toxic3 if_random_less_than 50, AI_CV_Toxic3 score -3 AI_CV_Toxic3:: if_has_move_with_effect AI_USER, EFFECT_SPECIAL_DEFENSE_UP, AI_CV_Toxic4 if_has_move_with_effect AI_USER, EFFECT_PROTECT, AI_CV_Toxic4 goto AI_CV_Toxic_End AI_CV_Toxic4:: if_random_less_than 60, AI_CV_Toxic_End score +2 AI_CV_Toxic_End:: end AI_CV_LightScreen:: if_hp_less_than AI_USER, 50, AI_CV_LightScreen_ScoreDown2 get_target_type1 if_in_bytes AI_CV_LightScreen_SpecialTypeList, AI_CV_LightScreen_End get_target_type2 if_in_bytes AI_CV_LightScreen_SpecialTypeList, AI_CV_LightScreen_End if_random_less_than 50, AI_CV_LightScreen_End AI_CV_LightScreen_ScoreDown2:: score -2 AI_CV_LightScreen_End:: end AI_CV_LightScreen_SpecialTypeList:: .byte TYPE_FIRE .byte TYPE_WATER .byte TYPE_GRASS .byte TYPE_ELECTRIC .byte TYPE_PSYCHIC .byte TYPE_ICE .byte TYPE_DRAGON .byte TYPE_DARK .byte -1 AI_CV_Rest:: if_target_faster AI_CV_Rest4 if_hp_not_equal AI_USER, 100, AI_CV_Rest2 score -8 goto AI_CV_Rest_End AI_CV_Rest2:: if_hp_less_than AI_USER, 40, AI_CV_Rest6 if_hp_more_than AI_USER, 50, AI_CV_Rest3 if_random_less_than 70, AI_CV_Rest6 AI_CV_Rest3:: score -3 goto AI_CV_Rest_End AI_CV_Rest4:: if_hp_less_than AI_USER, 60, AI_CV_Rest6 if_hp_more_than AI_USER, 70, AI_CV_Rest5 if_random_less_than 50, AI_CV_Rest6 AI_CV_Rest5:: score -3 goto AI_CV_Rest_End AI_CV_Rest6:: if_doesnt_have_move_with_effect AI_TARGET, EFFECT_SNATCH, AI_CV_Rest7 if_random_less_than 50, AI_CV_Rest_End AI_CV_Rest7:: if_random_less_than 10, AI_CV_Rest_End score +3 AI_CV_Rest_End:: end AI_CV_OneHitKO:: end AI_CV_SuperFang:: if_hp_more_than AI_TARGET, 50, AI_CV_SuperFang_End score -1 AI_CV_SuperFang_End:: end AI_CV_Trap:: if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_Trap2 if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_Trap2 if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Trap2 if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Trap2 goto AI_CV_Trap_End AI_CV_Trap2:: if_random_less_than 128, AI_CV_Trap_End score +1 AI_CV_Trap_End:: end AI_CV_HighCrit:: if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_HighCrit_End if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_HighCrit_End if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CV_HighCrit2 if_type_effectiveness AI_EFFECTIVENESS_x4, AI_CV_HighCrit2 if_random_less_than 128, AI_CV_HighCrit_End AI_CV_HighCrit2:: if_random_less_than 128, AI_CV_HighCrit_End score +1 AI_CV_HighCrit_End:: end AI_CV_Swagger: if_has_move AI_USER, MOVE_PSYCH_UP, AI_CV_SwaggerHasPsychUp AI_CV_Flatter:: if_random_less_than 128, AI_CV_Confuse score +1 AI_CV_Confuse:: if_hp_more_than AI_TARGET, 70, AI_CV_Confuse_End if_random_less_than 128, AI_CV_Confuse2 score -1 AI_CV_Confuse2:: if_hp_more_than AI_TARGET, 50, AI_CV_Confuse_End score -1 if_hp_more_than AI_TARGET, 30, AI_CV_Confuse_End score -1 AI_CV_Confuse_End:: end AI_CV_SwaggerHasPsychUp: if_stat_level_more_than AI_TARGET, STAT_ATK, 3, AI_CV_SwaggerHasPsychUp_Minus5 score +3 get_turn_count if_not_equal 0, AI_CV_SwaggerHasPsychUp_End score +2 goto AI_CV_SwaggerHasPsychUp_End AI_CV_SwaggerHasPsychUp_Minus5: score -5 AI_CV_SwaggerHasPsychUp_End: end AI_CV_Reflect:: if_hp_less_than AI_USER, 50, AI_CV_Reflect_ScoreDown2 get_target_type1 if_in_bytes AI_CV_Reflect_PhysicalTypeList, AI_CV_Reflect_End get_target_type2 if_in_bytes AI_CV_Reflect_PhysicalTypeList, AI_CV_Reflect_End if_random_less_than 50, AI_CV_Reflect_End AI_CV_Reflect_ScoreDown2:: score -2 AI_CV_Reflect_End:: end AI_CV_Reflect_PhysicalTypeList:: .byte TYPE_NORMAL .byte TYPE_FIGHTING .byte TYPE_FLYING .byte TYPE_POISON .byte TYPE_GROUND .byte TYPE_ROCK .byte TYPE_BUG .byte TYPE_GHOST .byte TYPE_STEEL .byte -1 AI_CV_Poison:: if_hp_less_than AI_USER, 50, AI_CV_Poison_ScoreDown1 if_hp_more_than AI_TARGET, 50, AI_CV_Poison_End AI_CV_Poison_ScoreDown1:: score -1 AI_CV_Poison_End:: end AI_CV_Paralyze:: if_target_faster AI_CV_Paralyze2 if_hp_more_than AI_USER, 70, AI_CV_Paralyze_End score -1 goto AI_CV_Paralyze_End AI_CV_Paralyze2:: if_random_less_than 20, AI_CV_Paralyze_End score +3 AI_CV_Paralyze_End:: end AI_CV_VitalThrow:: if_target_faster AI_CV_VitalThrow_End if_hp_more_than AI_USER, 60, AI_CV_VitalThrow_End if_hp_less_than AI_USER, 40, AI_CV_VitalThrow2 if_random_less_than 180, AI_CV_VitalThrow_End AI_CV_VitalThrow2:: if_random_less_than 50, AI_CV_VitalThrow_End score -1 AI_CV_VitalThrow_End:: end AI_CV_Substitute:: if_hp_more_than AI_USER, 90, AI_CV_Substitute4 if_hp_more_than AI_USER, 70, AI_CV_Substitute3 if_hp_more_than AI_USER, 50, AI_CV_Substitute2 if_random_less_than 100, AI_CV_Substitute2 score -1 AI_CV_Substitute2:: if_random_less_than 100, AI_CV_Substitute3 score -1 AI_CV_Substitute3:: if_random_less_than 100, AI_CV_Substitute4 score -1 AI_CV_Substitute4:: if_target_faster AI_CV_Substitute_End get_last_used_move AI_TARGET get_move_effect_from_result if_equal EFFECT_SLEEP, AI_CV_Substitute5 if_equal EFFECT_TOXIC, AI_CV_Substitute5 if_equal EFFECT_POISON, AI_CV_Substitute5 if_equal EFFECT_PARALYZE, AI_CV_Substitute5 if_equal EFFECT_WILL_O_WISP, AI_CV_Substitute5 if_equal EFFECT_CONFUSE, AI_CV_Substitute6 if_equal EFFECT_LEECH_SEED, AI_CV_Substitute7 goto AI_CV_Substitute_End AI_CV_Substitute5:: if_not_status AI_TARGET, STATUS1_ANY, AI_CV_Substitute8 goto AI_CV_Substitute_End AI_CV_Substitute6:: if_not_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Substitute8 goto AI_CV_Substitute_End AI_CV_Substitute7:: if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_Substitute_End AI_CV_Substitute8:: if_random_less_than 100, AI_CV_Substitute_End score +1 AI_CV_Substitute_End:: end AI_CV_Recharge:: if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Recharge_ScoreDown1 if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Recharge_ScoreDown1 if_target_faster AI_CV_Recharge2 if_hp_more_than AI_USER, 40, AI_CV_Recharge_ScoreDown1 goto AI_CV_Recharge_End AI_CV_Recharge2:: if_hp_less_than AI_USER, 60, AI_CV_Recharge_End AI_CV_Recharge_ScoreDown1:: score -1 AI_CV_Recharge_End:: end AI_CV_Disable:: if_target_faster AI_CV_Disable_End get_last_used_move AI_TARGET get_move_power_from_result if_equal 0, AI_CV_Disable2 score +1 goto AI_CV_Disable_End AI_CV_Disable2:: if_random_less_than 100, AI_CV_Disable_End score -1 AI_CV_Disable_End:: end AI_CV_Counter:: if_status AI_TARGET, STATUS1_SLEEP, AI_CV_Counter_ScoreDown1 if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Counter_ScoreDown1 if_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Counter_ScoreDown1 if_hp_more_than AI_USER, 30, AI_CV_Counter2 if_random_less_than 10, AI_CV_Counter2 score -1 AI_CV_Counter2:: if_hp_more_than AI_USER, 50, AI_CV_Counter3 if_random_less_than 100, AI_CV_Counter3 score -1 AI_CV_Counter3:: if_has_move AI_USER, MOVE_MIRROR_COAT, AI_CV_Counter7 get_last_used_move AI_TARGET get_move_power_from_result if_equal 0, AI_CV_Counter5 if_target_not_taunted AI_CV_Counter4 if_random_less_than 100, AI_CV_Counter4 score +1 AI_CV_Counter4:: get_last_used_move AI_TARGET get_move_type_from_result if_not_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_ScoreDown1 if_random_less_than 100, AI_CV_Counter_End score +1 goto AI_CV_Counter_End AI_CV_Counter5:: if_target_not_taunted AI_CV_Counter6 if_random_less_than 100, AI_CV_Counter6 score +1 AI_CV_Counter6:: get_target_type1 if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End get_target_type2 if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End if_random_less_than 50, AI_CV_Counter_End AI_CV_Counter7: if_random_less_than 100, AI_CV_Counter8 score +4 AI_CV_Counter8: end AI_CV_Counter_ScoreDown1:: score -1 AI_CV_Counter_End:: end AI_CV_Counter_PhysicalTypeList:: .byte TYPE_NORMAL .byte TYPE_FIGHTING .byte TYPE_FLYING .byte TYPE_POISON .byte TYPE_GROUND .byte TYPE_ROCK .byte TYPE_BUG .byte TYPE_GHOST .byte TYPE_STEEL .byte -1 AI_CV_Encore:: if_any_move_disabled AI_TARGET, AI_CV_Encore2 if_target_faster AI_CV_Encore_ScoreDown2 get_last_used_move AI_TARGET get_move_effect_from_result if_not_in_bytes AI_CV_Encore_EncouragedMovesToEncore, AI_CV_Encore_ScoreDown2 AI_CV_Encore2:: if_random_less_than 30, AI_CV_Encore_End score +3 goto AI_CV_Encore_End AI_CV_Encore_ScoreDown2:: score -2 AI_CV_Encore_End:: end AI_CV_Encore_EncouragedMovesToEncore:: .byte EFFECT_DREAM_EATER .byte EFFECT_ATTACK_UP .byte EFFECT_DEFENSE_UP .byte EFFECT_SPEED_UP .byte EFFECT_SPECIAL_ATTACK_UP .byte EFFECT_HAZE .byte EFFECT_ROAR .byte EFFECT_CONVERSION .byte EFFECT_TOXIC .byte EFFECT_LIGHT_SCREEN .byte EFFECT_REST .byte EFFECT_SUPER_FANG .byte EFFECT_SPECIAL_DEFENSE_UP_2 .byte EFFECT_CONFUSE .byte EFFECT_POISON .byte EFFECT_PARALYZE .byte EFFECT_LEECH_SEED .byte EFFECT_SPLASH .byte EFFECT_ATTACK_UP_2 .byte EFFECT_ENCORE .byte EFFECT_CONVERSION_2 .byte EFFECT_LOCK_ON .byte EFFECT_HEAL_BELL .byte EFFECT_MEAN_LOOK .byte EFFECT_NIGHTMARE .byte EFFECT_PROTECT .byte EFFECT_SKILL_SWAP .byte EFFECT_FORESIGHT .byte EFFECT_PERISH_SONG .byte EFFECT_SANDSTORM .byte EFFECT_ENDURE .byte EFFECT_SWAGGER .byte EFFECT_ATTRACT .byte EFFECT_SAFEGUARD .byte EFFECT_RAIN_DANCE .byte EFFECT_SUNNY_DAY .byte EFFECT_BELLY_DRUM .byte EFFECT_PSYCH_UP .byte EFFECT_FUTURE_SIGHT .byte EFFECT_FAKE_OUT .byte EFFECT_STOCKPILE .byte EFFECT_SPIT_UP .byte EFFECT_SWALLOW .byte EFFECT_HAIL .byte EFFECT_TORMENT .byte EFFECT_WILL_O_WISP .byte EFFECT_FOLLOW_ME .byte EFFECT_CHARGE .byte EFFECT_TRICK .byte EFFECT_ROLE_PLAY .byte EFFECT_INGRAIN .byte EFFECT_RECYCLE .byte EFFECT_KNOCK_OFF .byte EFFECT_SKILL_SWAP .byte EFFECT_IMPRISON .byte EFFECT_REFRESH .byte EFFECT_GRUDGE .byte EFFECT_TEETER_DANCE .byte EFFECT_MUD_SPORT .byte EFFECT_WATER_SPORT .byte EFFECT_DRAGON_DANCE .byte EFFECT_CAMOUFLAGE .byte -1 AI_CV_PainSplit:: if_hp_less_than AI_TARGET, 80, AI_CV_PainSplit_ScoreDown1 if_target_faster AI_CV_PainSplit2 if_hp_more_than AI_USER, 40, AI_CV_PainSplit_ScoreDown1 score +1 goto AI_CV_PainSplit_End AI_CV_PainSplit2:: if_hp_more_than AI_USER, 60, AI_CV_PainSplit_ScoreDown1 score +1 goto AI_CV_PainSplit_End AI_CV_PainSplit_ScoreDown1:: score -1 AI_CV_PainSplit_End:: end AI_CV_Snore:: score +2 end AI_CV_LockOn:: if_random_less_than 128, AI_CV_LockOn_End score +2 AI_CV_LockOn_End:: end AI_CV_SleepTalk:: if_status AI_USER, STATUS1_SLEEP, Score_Plus10 score -5 end AI_CV_DestinyBond:: score -1 if_target_faster AI_CV_DestinyBond_End if_hp_more_than AI_USER, 70, AI_CV_DestinyBond_End if_random_less_than 128, AI_CV_DestinyBond2 score +1 AI_CV_DestinyBond2:: if_hp_more_than AI_USER, 50, AI_CV_DestinyBond_End if_random_less_than 128, AI_CV_DestinyBond3 score +1 AI_CV_DestinyBond3:: if_hp_more_than AI_USER, 30, AI_CV_DestinyBond_End if_random_less_than 100, AI_CV_DestinyBond_End score +2 AI_CV_DestinyBond_End:: end AI_CV_Flail:: if_target_faster AI_CV_Flail2 if_hp_more_than AI_USER, 33, AI_CV_Flail_ScoreDown1 if_hp_more_than AI_USER, 20, AI_CV_Flail_End if_hp_less_than AI_USER, 8, AI_CV_Flail_ScoreUp1 goto AI_CV_Flail3 AI_CV_Flail2:: if_hp_more_than AI_USER, 60, AI_CV_Flail_ScoreDown1 if_hp_more_than AI_USER, 40, AI_CV_Flail_End goto AI_CV_Flail3 AI_CV_Flail_ScoreUp1:: score +1 AI_CV_Flail3:: if_random_less_than 100, AI_CV_Flail_End score +1 goto AI_CV_Flail_End AI_CV_Flail_ScoreDown1:: score -1 AI_CV_Flail_End:: end AI_CV_HealBell:: if_status AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End if_status_in_party AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End score -5 AI_CV_HealBell_End:: end AI_CV_Thief:: get_hold_effect AI_TARGET if_not_in_bytes AI_CV_Thief_EncourageItemsToSteal, AI_CV_Thief_ScoreDown2 if_random_less_than 50, AI_CV_Thief_End score +1 goto AI_CV_Thief_End AI_CV_Thief_ScoreDown2:: score -2 AI_CV_Thief_End:: end AI_CV_Thief_EncourageItemsToSteal:: .byte HOLD_EFFECT_CURE_SLP .byte HOLD_EFFECT_CURE_STATUS .byte HOLD_EFFECT_RESTORE_HP .byte HOLD_EFFECT_EVASION_UP .byte HOLD_EFFECT_LEFTOVERS .byte HOLD_EFFECT_LIGHT_BALL .byte HOLD_EFFECT_THICK_CLUB .byte -1 AI_CV_Curse:: get_user_type1 if_equal TYPE_GHOST, AI_CV_Curse4 get_user_type2 if_equal TYPE_GHOST, AI_CV_Curse4 if_stat_level_more_than AI_USER, STAT_DEF, 9, AI_CV_Curse_End if_random_less_than 128, AI_CV_Curse2 score +1 AI_CV_Curse2:: if_stat_level_more_than AI_USER, STAT_DEF, 7, AI_CV_Curse_End if_random_less_than 128, AI_CV_Curse3 score +1 AI_CV_Curse3:: if_stat_level_more_than AI_USER, STAT_DEF, 6, AI_CV_Curse_End if_random_less_than 128, AI_CV_Curse_End score +1 goto AI_CV_Curse_End AI_CV_Curse4:: if_hp_more_than AI_USER, 80, AI_CV_Curse_End score -1 AI_CV_Curse_End:: end AI_CV_Protect:: get_protect_count AI_USER if_more_than 1, AI_CV_Protect_ScoreDown2 if_status AI_USER, STATUS1_TOXIC_POISON, AI_CV_Protect3 if_status2 AI_USER, STATUS2_CURSED, AI_CV_Protect3 if_status3 AI_USER, STATUS3_PERISH_SONG, AI_CV_Protect3 if_status2 AI_USER, STATUS2_INFATUATION, AI_CV_Protect3 if_status3 AI_USER, STATUS3_LEECHSEED, AI_CV_Protect3 if_status3 AI_USER, STATUS3_YAWN, AI_CV_Protect3 if_has_move_with_effect AI_TARGET, EFFECT_RESTORE_HP, AI_CV_Protect3 if_has_move_with_effect AI_TARGET, EFFECT_DEFENSE_CURL, AI_CV_Protect3 if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_Protect_ScoreUp2 if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_Protect_ScoreUp2 if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Protect_ScoreUp2 if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Protect_ScoreUp2 if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_Protect_ScoreUp2 if_status3 AI_TARGET, STATUS3_YAWN, AI_CV_Protect_ScoreUp2 get_last_used_move AI_TARGET get_move_effect_from_result if_not_equal EFFECT_LOCK_ON, AI_CV_Protect_ScoreUp2 goto AI_CV_Protect2 AI_CV_Protect_ScoreUp2:: score +2 AI_CV_Protect2:: if_random_less_than 128, AI_CV_Protect4 score -1 AI_CV_Protect4:: get_protect_count AI_USER if_equal 0, AI_CV_Protect_End score -1 if_random_less_than 128, AI_CV_Protect_End score -1 goto AI_CV_Protect_End AI_CV_Protect3:: get_last_used_move AI_TARGET get_move_effect_from_result if_not_equal EFFECT_LOCK_ON, AI_CV_Protect_End AI_CV_Protect_ScoreDown2:: score -2 AI_CV_Protect_End:: end AI_CV_Foresight:: get_target_type1 if_equal TYPE_GHOST, AI_CV_Foresight2 get_target_type2 if_equal TYPE_GHOST, AI_CV_Foresight2 if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_Foresight3 score -2 goto AI_CV_Foresight_End AI_CV_Foresight2:: if_random_less_than 80, AI_CV_Foresight_End AI_CV_Foresight3:: if_random_less_than 80, AI_CV_Foresight_End score +2 AI_CV_Foresight_End:: end AI_CV_Endure:: if_hp_less_than AI_USER, 4, AI_CV_Endure2 if_hp_less_than AI_USER, 35, AI_CV_Endure3 AI_CV_Endure2:: score -1 goto AI_CV_Endure_End AI_CV_Endure3:: if_random_less_than 70, AI_CV_Endure_End score +1 AI_CV_Endure_End:: end AI_CV_BatonPass:: if_stat_level_more_than AI_USER, STAT_ATK, 8, AI_CV_BatonPass2 if_stat_level_more_than AI_USER, STAT_DEF, 8, AI_CV_BatonPass2 if_stat_level_more_than AI_USER, STAT_SPATK, 8, AI_CV_BatonPass2 if_stat_level_more_than AI_USER, STAT_SPDEF, 8, AI_CV_BatonPass2 if_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_BatonPass2 goto AI_CV_BatonPass5 AI_CV_BatonPass2:: if_target_faster AI_CV_BatonPass3 if_hp_more_than AI_USER, 60, AI_CV_BatonPass_End goto AI_CV_BatonPass4 AI_CV_BatonPass3:: if_hp_more_than AI_USER, 70, AI_CV_BatonPass_End AI_CV_BatonPass4:: if_random_less_than 80, AI_CV_BatonPass_End score +2 goto AI_CV_BatonPass_End AI_CV_BatonPass5:: if_stat_level_more_than AI_USER, STAT_ATK, 7, AI_CV_BatonPass7 if_stat_level_more_than AI_USER, STAT_DEF, 7, AI_CV_BatonPass7 if_stat_level_more_than AI_USER, STAT_SPATK, 7, AI_CV_BatonPass7 if_stat_level_more_than AI_USER, STAT_SPDEF, 7, AI_CV_BatonPass7 if_stat_level_more_than AI_USER, STAT_EVASION, 7, AI_CV_BatonPass7 goto AI_CV_BatonPass_ScoreDown2 AI_CV_BatonPass7:: if_target_faster AI_CV_BatonPass8 if_hp_more_than AI_USER, 60, AI_CV_BatonPass_ScoreDown2 goto AI_CV_BatonPass_End AI_CV_BatonPass8:: if_hp_less_than AI_USER, 70, AI_CV_BatonPass_End AI_CV_BatonPass_ScoreDown2:: score -2 AI_CV_BatonPass_End:: end AI_CV_Pursuit:: is_first_turn_for AI_USER if_not_equal 0, AI_CV_Pursuit_End get_target_type1 if_equal TYPE_GHOST, AI_CV_Pursuit2 get_target_type1 if_equal TYPE_PSYCHIC, AI_CV_Pursuit2 get_target_type2 if_equal TYPE_GHOST, AI_CV_Pursuit2 get_target_type2 if_equal TYPE_PSYCHIC, AI_CV_Pursuit2 goto AI_CV_Pursuit_End AI_CV_Pursuit2:: if_random_less_than 128, AI_CV_Pursuit_End score +1 AI_CV_Pursuit_End:: end AI_CV_RainDance:: if_user_faster AI_CV_RainDance2 get_ability AI_USER if_equal ABILITY_SWIFT_SWIM, AI_CV_RainDance3 AI_CV_RainDance2:: if_hp_less_than AI_USER, 40, AI_CV_RainDance_ScoreDown1 get_weather if_equal AI_WEATHER_HAIL, AI_CV_RainDance3 if_equal AI_WEATHER_SUN, AI_CV_RainDance3 if_equal AI_WEATHER_SANDSTORM, AI_CV_RainDance3 get_ability AI_USER if_equal ABILITY_RAIN_DISH, AI_CV_RainDance3 goto AI_CV_RainDance_End AI_CV_RainDance3:: score +1 goto AI_CV_RainDance_End AI_CV_RainDance_ScoreDown1:: score -1 AI_CV_RainDance_End:: end AI_CV_SunnyDay:: if_hp_less_than AI_USER, 40, AI_CV_SunnyDay_ScoreDown1 get_weather if_equal AI_WEATHER_HAIL, AI_CV_SunnyDay2 if_equal AI_WEATHER_RAIN, AI_CV_SunnyDay2 if_equal AI_WEATHER_SANDSTORM, AI_CV_SunnyDay2 goto AI_CV_SunnyDay_End AI_CV_SunnyDay2:: score +1 goto AI_CV_SunnyDay_End AI_CV_SunnyDay_ScoreDown1:: score -1 AI_CV_SunnyDay_End:: end AI_CV_BellyDrum:: if_hp_less_than AI_USER, 90, AI_CV_BellyDrum_ScoreDown2 goto AI_CV_BellyDrum_End AI_CV_BellyDrum_ScoreDown2:: score -2 AI_CV_BellyDrum_End:: end AI_CV_PsychUp:: if_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_PsychUp2 if_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_PsychUp2 if_stat_level_more_than AI_TARGET, STAT_SPATK, 8, AI_CV_PsychUp2 if_stat_level_more_than AI_TARGET, STAT_SPDEF, 8, AI_CV_PsychUp2 if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_PsychUp2 goto AI_CV_PsychUp_ScoreDown2 AI_CV_PsychUp2:: if_stat_level_less_than AI_USER, STAT_ATK, 7, AI_CV_PsychUp3 if_stat_level_less_than AI_USER, STAT_DEF, 7, AI_CV_PsychUp3 if_stat_level_less_than AI_USER, STAT_SPATK, 7, AI_CV_PsychUp3 if_stat_level_less_than AI_USER, STAT_SPDEF, 7, AI_CV_PsychUp3 if_stat_level_less_than AI_USER, STAT_EVASION, 7, AI_CV_PsychUp_ScoreUp1 if_random_less_than 50, AI_CV_PsychUp_End goto AI_CV_PsychUp_ScoreDown2 AI_CV_PsychUp_ScoreUp1:: score +1 AI_CV_PsychUp3:: if_random_less_than 128, AI_CV_PsychUp_End @ Remove this line score +1 end AI_CV_PsychUp_ScoreDown2:: score -2 AI_CV_PsychUp_End:: end AI_CV_MirrorCoat:: if_status AI_TARGET, STATUS1_SLEEP, AI_CV_MirrorCoat_ScoreDown1 if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_MirrorCoat_ScoreDown1 if_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_MirrorCoat_ScoreDown1 if_hp_more_than AI_USER, 30, AI_CV_MirrorCoat2 if_random_less_than 10, AI_CV_MirrorCoat2 score -1 AI_CV_MirrorCoat2:: if_hp_more_than AI_USER, 50, AI_CV_MirrorCoat3 if_random_less_than 100, AI_CV_MirrorCoat3 score -1 AI_CV_MirrorCoat3:: if_has_move AI_USER, MOVE_COUNTER, AI_CV_MirrorCoat_ScoreUp4 get_last_used_move AI_TARGET get_move_power_from_result if_equal 0, AI_CV_MirrorCoat5 if_target_not_taunted AI_CV_MirrorCoat4 if_random_less_than 100, AI_CV_MirrorCoat4 score +1 AI_CV_MirrorCoat4:: get_last_used_move AI_TARGET get_move_type_from_result if_not_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_ScoreDown1 if_random_less_than 100, AI_CV_MirrorCoat_End score +1 goto AI_CV_MirrorCoat_End AI_CV_MirrorCoat5:: if_target_not_taunted AI_CV_MirrorCoat6 if_random_less_than 100, AI_CV_MirrorCoat6 score +1 AI_CV_MirrorCoat6:: get_target_type1 if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End get_target_type2 if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End if_random_less_than 50, AI_CV_MirrorCoat_End AI_CV_MirrorCoat_ScoreUp4: if_random_less_than 100, AI_CV_MirrorCoat_ScoreUp4_End score +4 AI_CV_MirrorCoat_ScoreUp4_End: end AI_CV_MirrorCoat_ScoreDown1:: score -1 AI_CV_MirrorCoat_End:: end AI_CV_MirrorCoat_SpecialTypeList:: .byte TYPE_FIRE .byte TYPE_WATER .byte TYPE_GRASS .byte TYPE_ELECTRIC .byte TYPE_PSYCHIC .byte TYPE_ICE .byte TYPE_DRAGON .byte TYPE_DARK .byte -1 AI_CV_ChargeUpMove:: if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_ChargeUpMove_ScoreDown2 if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_ChargeUpMove_ScoreDown2 if_has_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_ChargeUpMove_ScoreDown2 if_hp_more_than AI_USER, 38, AI_CV_ChargeUpMove_End score -1 goto AI_CV_ChargeUpMove_End AI_CV_ChargeUpMove_ScoreDown2:: score -2 AI_CV_ChargeUpMove_End:: end AI_CV_SemiInvulnerable:: if_doesnt_have_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_SemiInvulnerable2 score -1 goto AI_CV_SemiInvulnerable_End AI_CV_SemiInvulnerable2:: if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_SemiInvulnerable_TryEncourage if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_SemiInvulnerable_TryEncourage if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_SemiInvulnerable_TryEncourage get_weather if_equal AI_WEATHER_HAIL, AI_CV_SemiInvulnerable_CheckIceType if_equal AI_WEATHER_SANDSTORM, AI_CV_SemiInvulnerable_CheckSandstormTypes goto AI_CV_SemiInvulnerable5 AI_CV_SemiInvulnerable_CheckSandstormTypes:: get_user_type1 if_in_bytes AI_CV_SandstormResistantTypes, AI_CV_SemiInvulnerable_TryEncourage get_user_type2 if_in_bytes AI_CV_SandstormResistantTypes, AI_CV_SemiInvulnerable_TryEncourage goto AI_CV_SemiInvulnerable5 AI_CV_SemiInvulnerable_CheckIceType:: get_user_type1 if_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage get_user_type2 if_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage AI_CV_SemiInvulnerable5:: if_target_faster AI_CV_SemiInvulnerable_End get_last_used_move AI_TARGET get_move_effect_from_result if_not_equal EFFECT_LOCK_ON, AI_CV_SemiInvulnerable_TryEncourage goto AI_CV_SemiInvulnerable_End AI_CV_SemiInvulnerable_TryEncourage:: if_random_less_than 80, AI_CV_SemiInvulnerable_End score +1 AI_CV_SemiInvulnerable_End:: end AI_CV_SandstormResistantTypes:: .byte TYPE_GROUND .byte TYPE_ROCK .byte TYPE_STEEL .byte -1 AI_CV_FakeOut:: score +2 end AI_CV_SpitUp:: get_stockpile_count AI_USER if_less_than 2, AI_CV_SpitUp_End if_random_less_than 80, AI_CV_SpitUp_End score +2 AI_CV_SpitUp_End:: end AI_CV_Hail:: if_hp_less_than AI_USER, 40, AI_CV_Hail_ScoreDown1 get_weather if_equal AI_WEATHER_SUN, AI_CV_Hail2 if_equal AI_WEATHER_RAIN, AI_CV_Hail2 if_equal AI_WEATHER_SANDSTORM, AI_CV_Hail2 goto AI_CV_Hail_End AI_CV_Hail2:: score +1 goto AI_CV_Hail_End AI_CV_Hail_ScoreDown1:: score -1 AI_CV_Hail_End:: end AI_CV_Facade:: if_not_status AI_USER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, AI_CV_Facade_End score +1 AI_CV_Facade_End:: end AI_CV_FocusPunch:: if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_FocusPunch2 if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_FocusPunch2 if_status AI_TARGET, STATUS1_SLEEP, AI_CV_FocusPunch_ScoreUp1 if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_FocusPunch3 if_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_FocusPunch3 is_first_turn_for AI_USER if_not_equal 0, AI_CV_FocusPunch_End if_random_less_than 100, AI_CV_FocusPunch_End score +1 goto AI_CV_FocusPunch_End AI_CV_FocusPunch2:: score -1 goto AI_CV_FocusPunch_End AI_CV_FocusPunch3:: if_random_less_than 100, AI_CV_FocusPunch_End AI_CV_FocusPunch_ScoreUp1:: score +1 AI_CV_FocusPunch_End:: end AI_CV_SmellingSalt:: if_status AI_TARGET, STATUS1_PARALYSIS, AI_CV_SmellingSalt_ScoreUp1 goto AI_CV_SmellingSalt_End AI_CV_SmellingSalt_ScoreUp1:: score +1 AI_CV_SmellingSalt_End:: end AI_CV_Trick:: get_hold_effect AI_USER if_in_bytes AI_CV_Trick_ChoiceEffects, AI_CV_Trick3 if_in_bytes AI_CV_Trick_EffectsToEncourage, AI_CV_Trick4 AI_CV_Trick2:: score -3 goto AI_CV_Trick_End AI_CV_Trick3:: get_hold_effect AI_TARGET if_in_bytes AI_CV_Trick_ChoiceEffects, AI_CV_Trick2 score +5 goto AI_CV_Trick_End AI_CV_Trick4:: get_hold_effect AI_TARGET if_in_bytes AI_CV_Trick_EffectsToEncourage, AI_CV_Trick2 if_random_less_than 50, AI_CV_Trick_End score +2 AI_CV_Trick_End:: end AI_CV_Trick_EffectsToEncourage:: .byte HOLD_EFFECT_CONFUSE_SPICY .byte HOLD_EFFECT_CONFUSE_DRY .byte HOLD_EFFECT_CONFUSE_SWEET .byte HOLD_EFFECT_CONFUSE_BITTER .byte HOLD_EFFECT_CONFUSE_SOUR .byte HOLD_EFFECT_MACHO_BRACE .byte HOLD_EFFECT_CHOICE_BAND .byte -1 AI_CV_Trick_ChoiceEffects:: .byte HOLD_EFFECT_CHOICE_BAND .byte -1 AI_CV_ChangeSelfAbility:: get_ability AI_USER if_in_bytes AI_CV_ChangeSelfAbility_AbilitiesToEncourage, AI_CV_ChangeSelfAbility2 get_ability AI_TARGET if_in_bytes AI_CV_ChangeSelfAbility_AbilitiesToEncourage, AI_CV_ChangeSelfAbility3 AI_CV_ChangeSelfAbility2:: score -1 goto AI_CV_ChangeSelfAbility_End AI_CV_ChangeSelfAbility3:: if_random_less_than 50, AI_CV_ChangeSelfAbility_End score +2 AI_CV_ChangeSelfAbility_End:: end AI_CV_ChangeSelfAbility_AbilitiesToEncourage:: .byte ABILITY_SPEED_BOOST .byte ABILITY_BATTLE_ARMOR .byte ABILITY_SAND_VEIL .byte ABILITY_STATIC .byte ABILITY_FLASH_FIRE .byte ABILITY_WONDER_GUARD .byte ABILITY_EFFECT_SPORE .byte ABILITY_SWIFT_SWIM .byte ABILITY_HUGE_POWER .byte ABILITY_RAIN_DISH .byte ABILITY_CUTE_CHARM .byte ABILITY_SHED_SKIN .byte ABILITY_MARVEL_SCALE .byte ABILITY_PURE_POWER .byte ABILITY_CHLOROPHYLL .byte ABILITY_SHIELD_DUST .byte -1 AI_CV_Superpower:: if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Superpower_ScoreDown1 if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Superpower_ScoreDown1 if_stat_level_less_than AI_USER, STAT_ATK, 6, AI_CV_Superpower_ScoreDown1 if_target_faster AI_CV_Superpower2 if_hp_more_than AI_USER, 40, AI_CV_Superpower_ScoreDown1 goto AI_CV_Superpower_End AI_CV_Superpower2:: if_hp_less_than AI_USER, 60, AI_CV_Superpower_End AI_CV_Superpower_ScoreDown1:: score -1 AI_CV_Superpower_End:: end AI_CV_MagicCoat:: if_hp_more_than AI_TARGET, 30, AI_CV_MagicCoat2 if_random_less_than 100, AI_CV_MagicCoat2 score -1 AI_CV_MagicCoat2:: is_first_turn_for AI_USER if_equal 0, AI_CV_MagicCoat4 if_random_less_than 150, AI_CV_MagicCoat_End score +1 goto AI_CV_MagicCoat_End if_random_less_than 50, AI_CV_MagicCoat_End AI_CV_MagicCoat3:: if_random_less_than 50, AI_CV_MagicCoat_End AI_CV_MagicCoat4:: if_random_less_than 30, AI_CV_MagicCoat_End score -1 AI_CV_MagicCoat_End:: end AI_CV_Recycle:: get_used_held_item AI_USER if_not_in_bytes AI_CV_Recycle_ItemsToEncourage, AI_CV_Recycle_ScoreDown2 if_random_less_than 50, AI_CV_Recycle_End score +1 goto AI_CV_Recycle_End AI_CV_Recycle_ScoreDown2:: score -2 AI_CV_Recycle_End:: end AI_CV_Recycle_ItemsToEncourage:: .byte ITEM_CHESTO_BERRY .byte ITEM_LUM_BERRY .byte ITEM_STARF_BERRY .byte -1 AI_CV_Revenge:: if_status AI_TARGET, STATUS1_SLEEP, AI_CV_Revenge_ScoreDown2 if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Revenge_ScoreDown2 if_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Revenge_ScoreDown2 if_random_less_than 180, AI_CV_Revenge_ScoreDown2 score +2 goto AI_CV_Revenge_End AI_CV_Revenge_ScoreDown2:: score -2 AI_CV_Revenge_End:: end AI_CV_BrickBreak:: if_side_affecting AI_TARGET, SIDE_STATUS_REFLECT, AI_CV_BrickBreak_ScoreUp1 goto AI_CV_BrickBreak_End AI_CV_BrickBreak_ScoreUp1:: score +1 AI_CV_BrickBreak_End:: end AI_CV_KnockOff:: if_hp_less_than AI_TARGET, 30, AI_CV_KnockOff_End is_first_turn_for AI_USER if_more_than 0, AI_CV_KnockOff_End if_random_less_than 180, AI_CV_KnockOff_End score +1 AI_CV_KnockOff_End:: end AI_CV_Endeavor:: if_hp_less_than AI_TARGET, 70, AI_CV_Endeavor_ScoreDown1 if_target_faster AI_CV_Endeavor2 if_hp_more_than AI_USER, 40, AI_CV_Endeavor_ScoreDown1 score +1 goto AI_CV_Endeavor_End AI_CV_Endeavor2:: if_hp_more_than AI_USER, 50, AI_CV_Endeavor_ScoreDown1 score +1 goto AI_CV_Endeavor_End AI_CV_Endeavor_ScoreDown1:: score -1 AI_CV_Endeavor_End:: end AI_CV_Eruption:: if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Eruption_ScoreDown1 if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Eruption_ScoreDown1 if_target_faster AI_CV_Eruption2 if_hp_more_than AI_TARGET, 50, AI_CV_Eruption_End goto AI_CV_Eruption_ScoreDown1 AI_CV_Eruption2:: if_hp_more_than AI_TARGET, 70, AI_CV_Eruption_End AI_CV_Eruption_ScoreDown1:: score -1 AI_CV_Eruption_End:: end AI_CV_Imprison:: is_first_turn_for AI_USER if_more_than 0, AI_CV_Imprison_End if_random_less_than 100, AI_CV_Imprison_End score +2 AI_CV_Imprison_End:: end AI_CV_Refresh:: if_hp_less_than AI_TARGET, 50, AI_CV_Refresh_ScoreDown1 goto AI_CV_Refresh_End AI_CV_Refresh_ScoreDown1:: score -1 AI_CV_Refresh_End:: end AI_CV_Snatch:: is_first_turn_for AI_USER if_equal 1, AI_CV_Snatch3 if_random_less_than 30, AI_CV_Snatch_End if_target_faster AI_CV_Snatch2 if_hp_not_equal AI_USER, 100, AI_CV_Snatch5 if_hp_less_than AI_TARGET, 70, AI_CV_Snatch5 if_random_less_than 60, AI_CV_Snatch_End goto AI_CV_Snatch5 AI_CV_Snatch2:: if_hp_more_than AI_TARGET, 25, AI_CV_Snatch5 if_has_move_with_effect AI_TARGET, EFFECT_RESTORE_HP, AI_CV_Snatch3 if_has_move_with_effect AI_TARGET, EFFECT_DEFENSE_CURL, AI_CV_Snatch3 goto AI_CV_Snatch4 AI_CV_Snatch3:: if_random_less_than 150, AI_CV_Snatch_End score +2 goto AI_CV_Snatch_End AI_CV_Snatch4:: if_random_less_than 230, AI_CV_Snatch5 score +1 goto AI_CV_Snatch_End AI_CV_Snatch5:: if_random_less_than 30, AI_CV_Snatch_End score -2 AI_CV_Snatch_End:: end AI_CV_MudSport:: if_hp_less_than AI_USER, 50, AI_CV_MudSport_ScoreDown1 get_target_type1 if_equal TYPE_ELECTRIC, AI_CV_MudSport2 get_target_type2 if_equal TYPE_ELECTRIC, AI_CV_MudSport2 goto AI_CV_MudSport_ScoreDown1 AI_CV_MudSport2:: score +1 goto AI_CV_MudSport_End AI_CV_MudSport_ScoreDown1:: score -1 AI_CV_MudSport_End:: end AI_CV_Overheat:: if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Overheat_ScoreDown1 if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Overheat_ScoreDown1 if_target_faster AI_CV_Overheat2 if_hp_more_than AI_USER, 60, AI_CV_Overheat_End goto AI_CV_Overheat_ScoreDown1 AI_CV_Overheat2:: if_hp_more_than AI_USER, 80, AI_CV_Overheat_End AI_CV_Overheat_ScoreDown1:: score -1 AI_CV_Overheat_End:: end AI_CV_WaterSport:: if_hp_less_than AI_USER, 50, AI_CV_WaterSport_ScoreDown1 get_target_type1 if_equal TYPE_FIRE, AI_CV_WaterSport2 get_target_type2 if_equal TYPE_FIRE, AI_CV_WaterSport2 goto AI_CV_WaterSport_ScoreDown1 AI_CV_WaterSport2:: score +1 goto AI_CV_WaterSport_End AI_CV_WaterSport_ScoreDown1:: score -1 AI_CV_WaterSport_End:: end AI_CV_DragonDance:: if_target_faster AI_CV_DragonDance2 if_hp_more_than AI_USER, 50, AI_CV_DragonDance_End if_random_less_than 70, AI_CV_DragonDance_End score -1 goto AI_CV_DragonDance_End AI_CV_DragonDance2:: if_random_less_than 128, AI_CV_DragonDance_End score +1 AI_CV_DragonDance_End:: end AI_TryToFaint:: if_can_faint AI_TryToFaint_TryToEncourageQuickAttack get_how_powerful_move_is if_equal MOVE_NOT_MOST_POWERFUL, Score_Minus1 if_type_effectiveness AI_EFFECTIVENESS_x4, AI_TryToFaint_DoubleSuperEffective end AI_TryToFaint_DoubleSuperEffective: if_random_less_than 80, AI_TryToFaint_End score +2 end AI_TryToFaint_TryToEncourageQuickAttack:: if_effect EFFECT_EXPLOSION, AI_TryToFaint_End if_not_effect EFFECT_QUICK_ATTACK, AI_TryToFaint_ScoreUp4 score +2 AI_TryToFaint_ScoreUp4:: score +4 AI_TryToFaint_End:: end AI_SetupFirstTurn:: get_turn_count if_not_equal 0, AI_SetupFirstTurn_End get_considered_move_effect if_not_in_bytes AI_SetupFirstTurn_SetupEffectsToEncourage, AI_SetupFirstTurn_End if_random_less_than 80, AI_SetupFirstTurn_End score +2 AI_SetupFirstTurn_End:: end AI_SetupFirstTurn_SetupEffectsToEncourage:: .byte EFFECT_ATTACK_UP .byte EFFECT_DEFENSE_UP .byte EFFECT_SPEED_UP .byte EFFECT_SPECIAL_ATTACK_UP .byte EFFECT_SPECIAL_DEFENSE_UP .byte EFFECT_ACCURACY_UP .byte EFFECT_EVASION_UP .byte EFFECT_ATTACK_DOWN .byte EFFECT_DEFENSE_DOWN .byte EFFECT_SPEED_DOWN .byte EFFECT_SPECIAL_ATTACK_DOWN .byte EFFECT_SPECIAL_DEFENSE_DOWN .byte EFFECT_ACCURACY_DOWN .byte EFFECT_EVASION_DOWN .byte EFFECT_CONVERSION .byte EFFECT_LIGHT_SCREEN .byte EFFECT_SPECIAL_DEFENSE_UP_2 .byte EFFECT_FOCUS_ENERGY .byte EFFECT_CONFUSE .byte EFFECT_ATTACK_UP_2 .byte EFFECT_DEFENSE_UP_2 .byte EFFECT_SPEED_UP_2 .byte EFFECT_SPECIAL_ATTACK_UP_2 .byte EFFECT_SPECIAL_DEFENSE_UP_2 .byte EFFECT_ACCURACY_UP_2 .byte EFFECT_EVASION_UP_2 .byte EFFECT_ATTACK_DOWN_2 .byte EFFECT_DEFENSE_DOWN_2 .byte EFFECT_SPEED_DOWN_2 .byte EFFECT_SPECIAL_ATTACK_DOWN_2 .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 .byte EFFECT_ACCURACY_DOWN_2 .byte EFFECT_EVASION_DOWN_2 .byte EFFECT_REFLECT .byte EFFECT_POISON .byte EFFECT_PARALYZE .byte EFFECT_SUBSTITUTE .byte EFFECT_LEECH_SEED .byte EFFECT_MINIMIZE .byte EFFECT_CURSE .byte EFFECT_SWAGGER .byte EFFECT_CAMOUFLAGE .byte EFFECT_YAWN .byte EFFECT_DEFENSE_CURL .byte EFFECT_TORMENT .byte EFFECT_FLATTER .byte EFFECT_WILL_O_WISP .byte EFFECT_INGRAIN .byte EFFECT_IMPRISON .byte EFFECT_TEETER_DANCE .byte EFFECT_TICKLE .byte EFFECT_COSMIC_POWER .byte EFFECT_BULK_UP .byte EFFECT_CALM_MIND .byte EFFECT_CAMOUFLAGE .byte -1 AI_PreferStrongestMove:: get_how_powerful_move_is if_not_equal MOVE_POWER_DISCOURAGED, AI_PreferStrongestMove_End if_random_less_than 100, AI_PreferStrongestMove_End score +2 AI_PreferStrongestMove_End:: end AI_Risky:: get_considered_move_effect if_not_in_bytes AI_Risky_EffectsToEncourage, AI_Risky_End if_random_less_than 128, AI_Risky_End score +2 AI_Risky_End:: end AI_Risky_EffectsToEncourage:: .byte EFFECT_SLEEP .byte EFFECT_EXPLOSION .byte EFFECT_MIRROR_MOVE .byte EFFECT_OHKO .byte EFFECT_HIGH_CRITICAL .byte EFFECT_CONFUSE .byte EFFECT_METRONOME .byte EFFECT_PSYWAVE .byte EFFECT_COUNTER .byte EFFECT_DESTINY_BOND .byte EFFECT_SWAGGER .byte EFFECT_ATTRACT .byte EFFECT_PRESENT .byte EFFECT_ALL_STATS_UP_HIT .byte EFFECT_BELLY_DRUM .byte EFFECT_MIRROR_COAT .byte EFFECT_FOCUS_PUNCH .byte EFFECT_REVENGE .byte EFFECT_TEETER_DANCE .byte -1 AI_PreferBatonPass:: count_alive_pokemon AI_USER if_equal 0, AI_PreferBatonPass_End get_how_powerful_move_is if_not_equal MOVE_POWER_DISCOURAGED, AI_PreferBatonPass_End if_has_move_with_effect AI_USER, EFFECT_BATON_PASS, AI_PreferBatonPass_GoForBatonPass if_random_less_than 80, AI_Risky_End AI_PreferBatonPass_GoForBatonPass:: if_move MOVE_SWORDS_DANCE, AI_PreferBatonPass2 if_move MOVE_DRAGON_DANCE, AI_PreferBatonPass2 if_move MOVE_CALM_MIND, AI_PreferBatonPass2 if_effect EFFECT_PROTECT, AI_PreferBatonPass3 if_move MOVE_BATON_PASS, AI_PreferBatonPass_EncourageIfHighStats if_random_less_than 20, AI_Risky_End score +3 AI_PreferBatonPass2: get_turn_count if_equal 0, Score_Plus5 if_hp_less_than AI_USER, 60, Score_Minus10 goto Score_Plus1 AI_PreferBatonPass3:: get_last_used_move AI_USER if_in_hwords AI_PreferBatonPass_ProtectMoves, Score_Minus2 score +2 end AI_PreferBatonPass_ProtectMoves: .2byte MOVE_PROTECT .2byte MOVE_DETECT .2byte -1 AI_PreferBatonPass_EncourageIfHighStats: get_turn_count if_equal 0, Score_Minus2 if_stat_level_more_than AI_USER, STAT_ATK, 8, Score_Plus3 if_stat_level_more_than AI_USER, STAT_ATK, 7, Score_Plus2 if_stat_level_more_than AI_USER, STAT_ATK, 6, Score_Plus1 if_stat_level_more_than AI_USER, STAT_SPATK, 8, Score_Plus3 if_stat_level_more_than AI_USER, STAT_SPATK, 7, Score_Plus2 if_stat_level_more_than AI_USER, STAT_SPATK, 6, Score_Plus1 end AI_PreferBatonPass_End:: end @ Empty. Expanded in Emerald AI_DoubleBattle:: end AI_HPAware:: if_hp_more_than AI_USER, 70, AI_HPAware_UserHasHighHP if_hp_more_than AI_USER, 30, AI_HPAware_UserHasMediumHP get_considered_move_effect if_in_bytes AI_HPAware_DiscouragedEffectsWhenLowHP, AI_HPAware_TryToDiscourage goto AI_HPAware_ConsiderTarget AI_HPAware_UserHasHighHP:: get_considered_move_effect if_in_bytes AI_HPAware_DiscouragedEffectsWhenHighHP, AI_HPAware_TryToDiscourage goto AI_HPAware_ConsiderTarget AI_HPAware_UserHasMediumHP:: get_considered_move_effect if_in_bytes AI_HPAware_DiscouragedEffectsWhenMediumHP, AI_HPAware_TryToDiscourage goto AI_HPAware_ConsiderTarget AI_HPAware_TryToDiscourage:: if_random_less_than 50, AI_HPAware_ConsiderTarget score -2 AI_HPAware_ConsiderTarget:: if_hp_more_than AI_TARGET, 70, AI_HPAware_TargetHasHighHP if_hp_more_than AI_TARGET, 30, AI_HPAware_TargetHasMediumHP get_considered_move_effect if_in_bytes AI_HPAware_DiscouragedEffectsWhenTargetLowHP, AI_HPAware_TargetTryToDiscourage goto AI_HPAware_End AI_HPAware_TargetHasHighHP:: get_considered_move_effect if_in_bytes AI_HPAware_DiscouragedEffectsWhenTargetHighHP, AI_HPAware_TargetTryToDiscourage goto AI_HPAware_End AI_HPAware_TargetHasMediumHP:: get_considered_move_effect if_in_bytes AI_HPAware_DiscouragedEffectsWhenTargetMediumHP, AI_HPAware_TargetTryToDiscourage goto AI_HPAware_End AI_HPAware_TargetTryToDiscourage:: if_random_less_than 50, AI_HPAware_End score -2 AI_HPAware_End:: end AI_HPAware_DiscouragedEffectsWhenHighHP:: .byte EFFECT_EXPLOSION .byte EFFECT_RESTORE_HP .byte EFFECT_REST .byte EFFECT_DESTINY_BOND .byte EFFECT_FLAIL .byte EFFECT_ENDURE .byte EFFECT_MORNING_SUN .byte EFFECT_SYNTHESIS .byte EFFECT_MOONLIGHT .byte EFFECT_SOFTBOILED .byte EFFECT_MEMENTO .byte EFFECT_GRUDGE .byte EFFECT_OVERHEAT .byte -1 AI_HPAware_DiscouragedEffectsWhenMediumHP:: .byte EFFECT_EXPLOSION .byte EFFECT_ATTACK_UP .byte EFFECT_DEFENSE_UP .byte EFFECT_SPEED_UP .byte EFFECT_SPECIAL_ATTACK_UP .byte EFFECT_SPECIAL_DEFENSE_UP .byte EFFECT_ACCURACY_UP .byte EFFECT_EVASION_UP .byte EFFECT_ATTACK_DOWN .byte EFFECT_DEFENSE_DOWN .byte EFFECT_SPEED_DOWN .byte EFFECT_SPECIAL_ATTACK_DOWN .byte EFFECT_SPECIAL_DEFENSE_DOWN .byte EFFECT_ACCURACY_DOWN .byte EFFECT_EVASION_DOWN .byte EFFECT_BIDE .byte EFFECT_CONVERSION .byte EFFECT_LIGHT_SCREEN .byte EFFECT_MIST .byte EFFECT_FOCUS_ENERGY .byte EFFECT_ATTACK_UP_2 .byte EFFECT_DEFENSE_UP_2 .byte EFFECT_SPEED_UP_2 .byte EFFECT_SPECIAL_ATTACK_UP_2 .byte EFFECT_SPECIAL_DEFENSE_UP_2 .byte EFFECT_ACCURACY_UP_2 .byte EFFECT_EVASION_UP_2 .byte EFFECT_ATTACK_DOWN_2 .byte EFFECT_DEFENSE_DOWN_2 .byte EFFECT_SPEED_DOWN_2 .byte EFFECT_SPECIAL_ATTACK_DOWN_2 .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 .byte EFFECT_ACCURACY_DOWN_2 .byte EFFECT_EVASION_DOWN_2 .byte EFFECT_CONVERSION_2 .byte EFFECT_SAFEGUARD .byte EFFECT_BELLY_DRUM .byte EFFECT_TICKLE .byte EFFECT_COSMIC_POWER .byte EFFECT_BULK_UP .byte EFFECT_CALM_MIND .byte EFFECT_DRAGON_DANCE .byte -1 AI_HPAware_DiscouragedEffectsWhenLowHP:: .byte EFFECT_ATTACK_UP .byte EFFECT_DEFENSE_UP .byte EFFECT_SPEED_UP .byte EFFECT_SPECIAL_ATTACK_UP .byte EFFECT_SPECIAL_DEFENSE_UP .byte EFFECT_ACCURACY_UP .byte EFFECT_EVASION_UP .byte EFFECT_ATTACK_DOWN .byte EFFECT_DEFENSE_DOWN .byte EFFECT_SPEED_DOWN .byte EFFECT_SPECIAL_ATTACK_DOWN .byte EFFECT_SPECIAL_DEFENSE_DOWN .byte EFFECT_ACCURACY_DOWN .byte EFFECT_EVASION_DOWN .byte EFFECT_BIDE .byte EFFECT_CONVERSION .byte EFFECT_LIGHT_SCREEN .byte EFFECT_MIST .byte EFFECT_FOCUS_ENERGY .byte EFFECT_ATTACK_UP_2 .byte EFFECT_DEFENSE_UP_2 .byte EFFECT_SPEED_UP_2 .byte EFFECT_SPECIAL_ATTACK_UP_2 .byte EFFECT_SPECIAL_DEFENSE_UP_2 .byte EFFECT_ACCURACY_UP_2 .byte EFFECT_EVASION_UP_2 .byte EFFECT_ATTACK_DOWN_2 .byte EFFECT_DEFENSE_DOWN_2 .byte EFFECT_SPEED_DOWN_2 .byte EFFECT_SPECIAL_ATTACK_DOWN_2 .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 .byte EFFECT_ACCURACY_DOWN_2 .byte EFFECT_EVASION_DOWN_2 .byte EFFECT_RAGE .byte EFFECT_CONVERSION_2 .byte EFFECT_LOCK_ON .byte EFFECT_SAFEGUARD .byte EFFECT_BELLY_DRUM .byte EFFECT_PSYCH_UP .byte EFFECT_MIRROR_COAT .byte EFFECT_SOLAR_BEAM .byte EFFECT_ERUPTION .byte EFFECT_TICKLE .byte EFFECT_COSMIC_POWER .byte EFFECT_BULK_UP .byte EFFECT_CALM_MIND .byte EFFECT_DRAGON_DANCE .byte -1 AI_HPAware_DiscouragedEffectsWhenTargetHighHP:: .byte -1 AI_HPAware_DiscouragedEffectsWhenTargetMediumHP:: .byte EFFECT_ATTACK_UP .byte EFFECT_DEFENSE_UP .byte EFFECT_SPEED_UP .byte EFFECT_SPECIAL_ATTACK_UP .byte EFFECT_SPECIAL_DEFENSE_UP .byte EFFECT_ACCURACY_UP .byte EFFECT_EVASION_UP .byte EFFECT_ATTACK_DOWN .byte EFFECT_DEFENSE_DOWN .byte EFFECT_SPEED_DOWN .byte EFFECT_SPECIAL_ATTACK_DOWN .byte EFFECT_SPECIAL_DEFENSE_DOWN .byte EFFECT_ACCURACY_DOWN .byte EFFECT_EVASION_DOWN .byte EFFECT_MIST .byte EFFECT_FOCUS_ENERGY .byte EFFECT_ATTACK_UP_2 .byte EFFECT_DEFENSE_UP_2 .byte EFFECT_SPEED_UP_2 .byte EFFECT_SPECIAL_ATTACK_UP_2 .byte EFFECT_SPECIAL_DEFENSE_UP_2 .byte EFFECT_ACCURACY_UP_2 .byte EFFECT_EVASION_UP_2 .byte EFFECT_ATTACK_DOWN_2 .byte EFFECT_DEFENSE_DOWN_2 .byte EFFECT_SPEED_DOWN_2 .byte EFFECT_SPECIAL_ATTACK_DOWN_2 .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 .byte EFFECT_ACCURACY_DOWN_2 .byte EFFECT_EVASION_DOWN_2 .byte EFFECT_POISON .byte EFFECT_PAIN_SPLIT .byte EFFECT_PERISH_SONG .byte EFFECT_SAFEGUARD .byte EFFECT_TICKLE .byte EFFECT_COSMIC_POWER .byte EFFECT_BULK_UP .byte EFFECT_CALM_MIND .byte EFFECT_DRAGON_DANCE .byte -1 AI_HPAware_DiscouragedEffectsWhenTargetLowHP:: .byte EFFECT_SLEEP .byte EFFECT_EXPLOSION .byte EFFECT_ATTACK_UP .byte EFFECT_DEFENSE_UP .byte EFFECT_SPEED_UP .byte EFFECT_SPECIAL_ATTACK_UP .byte EFFECT_SPECIAL_DEFENSE_UP .byte EFFECT_ACCURACY_UP .byte EFFECT_EVASION_UP .byte EFFECT_ATTACK_DOWN .byte EFFECT_DEFENSE_DOWN .byte EFFECT_SPEED_DOWN .byte EFFECT_SPECIAL_ATTACK_DOWN .byte EFFECT_SPECIAL_DEFENSE_DOWN .byte EFFECT_ACCURACY_DOWN .byte EFFECT_EVASION_DOWN .byte EFFECT_BIDE .byte EFFECT_CONVERSION .byte EFFECT_TOXIC .byte EFFECT_LIGHT_SCREEN .byte EFFECT_OHKO .byte EFFECT_SUPER_FANG @ Maybe supposed to be EFFECT_RAZOR_WIND .byte EFFECT_SUPER_FANG .byte EFFECT_MIST .byte EFFECT_FOCUS_ENERGY .byte EFFECT_CONFUSE .byte EFFECT_ATTACK_UP_2 .byte EFFECT_DEFENSE_UP_2 .byte EFFECT_SPEED_UP_2 .byte EFFECT_SPECIAL_ATTACK_UP_2 .byte EFFECT_SPECIAL_DEFENSE_UP_2 .byte EFFECT_ACCURACY_UP_2 .byte EFFECT_EVASION_UP_2 .byte EFFECT_ATTACK_DOWN_2 .byte EFFECT_DEFENSE_DOWN_2 .byte EFFECT_SPEED_DOWN_2 .byte EFFECT_SPECIAL_ATTACK_DOWN_2 .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 .byte EFFECT_ACCURACY_DOWN_2 .byte EFFECT_EVASION_DOWN_2 .byte EFFECT_POISON .byte EFFECT_PARALYZE .byte EFFECT_PAIN_SPLIT .byte EFFECT_CONVERSION_2 .byte EFFECT_LOCK_ON .byte EFFECT_SPITE .byte EFFECT_PERISH_SONG .byte EFFECT_SWAGGER .byte EFFECT_FURY_CUTTER .byte EFFECT_ATTRACT .byte EFFECT_SAFEGUARD .byte EFFECT_PSYCH_UP .byte EFFECT_MIRROR_COAT .byte EFFECT_WILL_O_WISP .byte EFFECT_TICKLE .byte EFFECT_COSMIC_POWER .byte EFFECT_BULK_UP .byte EFFECT_CALM_MIND .byte EFFECT_DRAGON_DANCE .byte -1 AI_Unknown:: if_not_effect EFFECT_SUNNY_DAY, AI_Unknown_End if_equal 0, AI_Unknown_End is_first_turn_for AI_USER if_equal 0, AI_Unknown_End score +5 AI_Unknown_End:: end AI_Roaming:: if_status2 AI_USER, STATUS2_WRAPPED, AI_Roaming_End if_status2 AI_USER, STATUS2_ESCAPE_PREVENTION, AI_Roaming_End get_ability AI_TARGET if_equal ABILITY_SHADOW_TAG, AI_Roaming_End get_ability AI_USER if_equal ABILITY_LEVITATE, AI_Roaming_Flee get_ability AI_TARGET if_equal ABILITY_ARENA_TRAP, AI_Roaming_End AI_Roaming_Flee:: flee AI_Roaming_End:: end AI_Safari:: if_random_safari_flee AI_Safari_Flee watch AI_Safari_Flee:: flee @ From Hoenns Poochyena fight (Zigzagoon in Emerald) AI_FirstBattle:: if_hp_equal AI_TARGET, 20, AI_FirstBattle_Flee if_hp_less_than AI_TARGET, 20, AI_FirstBattle_Flee end AI_FirstBattle_Flee:: flee AI_Ret:: end ================================================ FILE: data/battle_anim_scripts.s ================================================ #include "constants/battle.h" #include "constants/battle_anim.h" #include "constants/battle_string_ids.h" #include "constants/rgb.h" #include "constants/songs.h" #include "constants/sound.h" #include "constants/moves.h" .include "asm/macros.inc" .include "asm/macros/battle_anim_script.inc" .include "constants/constants.inc" .section script_data, "aw", %progbits .align 2 gMovesWithQuietBGM:: .2byte MOVE_SING .2byte MOVE_PERISH_SONG .2byte MOVE_GRASS_WHISTLE .2byte 0xFFFF .align 2 gBattleAnims_Moves:: .4byte Move_NONE .4byte Move_POUND .4byte Move_KARATE_CHOP .4byte Move_DOUBLE_SLAP .4byte Move_COMET_PUNCH .4byte Move_MEGA_PUNCH .4byte Move_PAY_DAY .4byte Move_FIRE_PUNCH .4byte Move_ICE_PUNCH .4byte Move_THUNDER_PUNCH .4byte Move_SCRATCH .4byte Move_VICE_GRIP .4byte Move_GUILLOTINE .4byte Move_RAZOR_WIND .4byte Move_SWORDS_DANCE .4byte Move_CUT .4byte Move_GUST .4byte Move_WING_ATTACK .4byte Move_WHIRLWIND .4byte Move_FLY .4byte Move_BIND .4byte Move_SLAM .4byte Move_VINE_WHIP .4byte Move_STOMP .4byte Move_DOUBLE_KICK .4byte Move_MEGA_KICK .4byte Move_JUMP_KICK .4byte Move_ROLLING_KICK .4byte Move_SAND_ATTACK .4byte Move_HEADBUTT .4byte Move_HORN_ATTACK .4byte Move_FURY_ATTACK .4byte Move_HORN_DRILL .4byte Move_TACKLE .4byte Move_BODY_SLAM .4byte Move_WRAP .4byte Move_TAKE_DOWN .4byte Move_THRASH .4byte Move_DOUBLE_EDGE .4byte Move_TAIL_WHIP .4byte Move_POISON_STING .4byte Move_TWINEEDLE .4byte Move_PIN_MISSILE .4byte Move_LEER .4byte Move_BITE .4byte Move_GROWL .4byte Move_ROAR .4byte Move_SING .4byte Move_SUPERSONIC .4byte Move_SONIC_BOOM .4byte Move_DISABLE .4byte Move_ACID .4byte Move_EMBER .4byte Move_FLAMETHROWER .4byte Move_MIST .4byte Move_WATER_GUN .4byte Move_HYDRO_PUMP .4byte Move_SURF .4byte Move_ICE_BEAM .4byte Move_BLIZZARD .4byte Move_PSYBEAM .4byte Move_BUBBLE_BEAM .4byte Move_AURORA_BEAM .4byte Move_HYPER_BEAM .4byte Move_PECK .4byte Move_DRILL_PECK .4byte Move_SUBMISSION .4byte Move_LOW_KICK .4byte Move_COUNTER .4byte Move_SEISMIC_TOSS .4byte Move_STRENGTH .4byte Move_ABSORB .4byte Move_MEGA_DRAIN .4byte Move_LEECH_SEED .4byte Move_GROWTH .4byte Move_RAZOR_LEAF .4byte Move_SOLAR_BEAM .4byte Move_POISON_POWDER .4byte Move_STUN_SPORE .4byte Move_SLEEP_POWDER .4byte Move_PETAL_DANCE .4byte Move_STRING_SHOT .4byte Move_DRAGON_RAGE .4byte Move_FIRE_SPIN .4byte Move_THUNDER_SHOCK .4byte Move_THUNDERBOLT .4byte Move_THUNDER_WAVE .4byte Move_THUNDER .4byte Move_ROCK_THROW .4byte Move_EARTHQUAKE .4byte Move_FISSURE .4byte Move_DIG .4byte Move_TOXIC .4byte Move_CONFUSION .4byte Move_PSYCHIC .4byte Move_HYPNOSIS .4byte Move_MEDITATE .4byte Move_AGILITY .4byte Move_QUICK_ATTACK .4byte Move_RAGE .4byte Move_TELEPORT .4byte Move_NIGHT_SHADE .4byte Move_MIMIC .4byte Move_SCREECH .4byte Move_DOUBLE_TEAM .4byte Move_RECOVER .4byte Move_HARDEN .4byte Move_MINIMIZE .4byte Move_SMOKESCREEN .4byte Move_CONFUSE_RAY .4byte Move_WITHDRAW .4byte Move_DEFENSE_CURL .4byte Move_BARRIER .4byte Move_LIGHT_SCREEN .4byte Move_HAZE .4byte Move_REFLECT .4byte Move_FOCUS_ENERGY .4byte Move_BIDE .4byte Move_METRONOME .4byte Move_MIRROR_MOVE .4byte Move_SELF_DESTRUCT .4byte Move_EGG_BOMB .4byte Move_LICK .4byte Move_SMOG .4byte Move_SLUDGE .4byte Move_BONE_CLUB .4byte Move_FIRE_BLAST .4byte Move_WATERFALL .4byte Move_CLAMP .4byte Move_SWIFT .4byte Move_SKULL_BASH .4byte Move_SPIKE_CANNON .4byte Move_CONSTRICT .4byte Move_AMNESIA .4byte Move_KINESIS .4byte Move_SOFT_BOILED .4byte Move_HI_JUMP_KICK .4byte Move_GLARE .4byte Move_DREAM_EATER .4byte Move_POISON_GAS .4byte Move_BARRAGE .4byte Move_LEECH_LIFE .4byte Move_LOVELY_KISS .4byte Move_SKY_ATTACK .4byte Move_TRANSFORM .4byte Move_BUBBLE .4byte Move_DIZZY_PUNCH .4byte Move_SPORE .4byte Move_FLASH .4byte Move_PSYWAVE .4byte Move_SPLASH .4byte Move_ACID_ARMOR .4byte Move_CRABHAMMER .4byte Move_EXPLOSION .4byte Move_FURY_SWIPES .4byte Move_BONEMERANG .4byte Move_REST .4byte Move_ROCK_SLIDE .4byte Move_HYPER_FANG .4byte Move_SHARPEN .4byte Move_CONVERSION .4byte Move_TRI_ATTACK .4byte Move_SUPER_FANG .4byte Move_SLASH .4byte Move_SUBSTITUTE .4byte Move_STRUGGLE .4byte Move_SKETCH .4byte Move_TRIPLE_KICK .4byte Move_THIEF .4byte Move_SPIDER_WEB .4byte Move_MIND_READER .4byte Move_NIGHTMARE .4byte Move_FLAME_WHEEL .4byte Move_SNORE .4byte Move_CURSE .4byte Move_FLAIL .4byte Move_CONVERSION_2 .4byte Move_AEROBLAST .4byte Move_COTTON_SPORE .4byte Move_REVERSAL .4byte Move_SPITE .4byte Move_POWDER_SNOW .4byte Move_PROTECT .4byte Move_MACH_PUNCH .4byte Move_SCARY_FACE .4byte Move_FAINT_ATTACK .4byte Move_SWEET_KISS .4byte Move_BELLY_DRUM .4byte Move_SLUDGE_BOMB .4byte Move_MUD_SLAP .4byte Move_OCTAZOOKA .4byte Move_SPIKES .4byte Move_ZAP_CANNON .4byte Move_FORESIGHT .4byte Move_DESTINY_BOND .4byte Move_PERISH_SONG .4byte Move_ICY_WIND .4byte Move_DETECT .4byte Move_BONE_RUSH .4byte Move_LOCK_ON .4byte Move_OUTRAGE .4byte Move_SANDSTORM .4byte Move_GIGA_DRAIN .4byte Move_ENDURE .4byte Move_CHARM .4byte Move_ROLLOUT .4byte Move_FALSE_SWIPE .4byte Move_SWAGGER .4byte Move_MILK_DRINK .4byte Move_SPARK .4byte Move_FURY_CUTTER .4byte Move_STEEL_WING .4byte Move_MEAN_LOOK .4byte Move_ATTRACT .4byte Move_SLEEP_TALK .4byte Move_HEAL_BELL .4byte Move_RETURN .4byte Move_PRESENT .4byte Move_FRUSTRATION .4byte Move_SAFEGUARD .4byte Move_PAIN_SPLIT .4byte Move_SACRED_FIRE .4byte Move_MAGNITUDE .4byte Move_DYNAMIC_PUNCH .4byte Move_MEGAHORN .4byte Move_DRAGON_BREATH .4byte Move_BATON_PASS .4byte Move_ENCORE .4byte Move_PURSUIT .4byte Move_RAPID_SPIN .4byte Move_SWEET_SCENT .4byte Move_IRON_TAIL .4byte Move_METAL_CLAW .4byte Move_VITAL_THROW .4byte Move_MORNING_SUN .4byte Move_SYNTHESIS .4byte Move_MOONLIGHT .4byte Move_HIDDEN_POWER .4byte Move_CROSS_CHOP .4byte Move_TWISTER .4byte Move_RAIN_DANCE .4byte Move_SUNNY_DAY .4byte Move_CRUNCH .4byte Move_MIRROR_COAT .4byte Move_PSYCH_UP .4byte Move_EXTREME_SPEED .4byte Move_ANCIENT_POWER .4byte Move_SHADOW_BALL .4byte Move_FUTURE_SIGHT .4byte Move_ROCK_SMASH .4byte Move_WHIRLPOOL .4byte Move_BEAT_UP .4byte Move_FAKE_OUT .4byte Move_UPROAR .4byte Move_STOCKPILE .4byte Move_SPIT_UP .4byte Move_SWALLOW .4byte Move_HEAT_WAVE .4byte Move_HAIL .4byte Move_TORMENT .4byte Move_FLATTER .4byte Move_WILL_O_WISP .4byte Move_MEMENTO .4byte Move_FACADE .4byte Move_FOCUS_PUNCH .4byte Move_SMELLING_SALT .4byte Move_FOLLOW_ME .4byte Move_NATURE_POWER .4byte Move_CHARGE .4byte Move_TAUNT .4byte Move_HELPING_HAND .4byte Move_TRICK .4byte Move_ROLE_PLAY .4byte Move_WISH .4byte Move_ASSIST .4byte Move_INGRAIN .4byte Move_SUPERPOWER .4byte Move_MAGIC_COAT .4byte Move_RECYCLE .4byte Move_REVENGE .4byte Move_BRICK_BREAK .4byte Move_YAWN .4byte Move_KNOCK_OFF .4byte Move_ENDEAVOR .4byte Move_ERUPTION .4byte Move_SKILL_SWAP .4byte Move_IMPRISON .4byte Move_REFRESH .4byte Move_GRUDGE .4byte Move_SNATCH .4byte Move_SECRET_POWER .4byte Move_DIVE .4byte Move_ARM_THRUST .4byte Move_CAMOUFLAGE .4byte Move_TAIL_GLOW .4byte Move_LUSTER_PURGE .4byte Move_MIST_BALL .4byte Move_FEATHER_DANCE .4byte Move_TEETER_DANCE .4byte Move_BLAZE_KICK .4byte Move_MUD_SPORT .4byte Move_ICE_BALL .4byte Move_NEEDLE_ARM .4byte Move_SLACK_OFF .4byte Move_HYPER_VOICE .4byte Move_POISON_FANG .4byte Move_CRUSH_CLAW .4byte Move_BLAST_BURN .4byte Move_HYDRO_CANNON .4byte Move_METEOR_MASH .4byte Move_ASTONISH .4byte Move_WEATHER_BALL .4byte Move_AROMATHERAPY .4byte Move_FAKE_TEARS .4byte Move_AIR_CUTTER .4byte Move_OVERHEAT .4byte Move_ODOR_SLEUTH .4byte Move_ROCK_TOMB .4byte Move_SILVER_WIND .4byte Move_METAL_SOUND .4byte Move_GRASS_WHISTLE .4byte Move_TICKLE .4byte Move_COSMIC_POWER .4byte Move_WATER_SPOUT .4byte Move_SIGNAL_BEAM .4byte Move_SHADOW_PUNCH .4byte Move_EXTRASENSORY .4byte Move_SKY_UPPERCUT .4byte Move_SAND_TOMB .4byte Move_SHEER_COLD .4byte Move_MUDDY_WATER .4byte Move_BULLET_SEED .4byte Move_AERIAL_ACE .4byte Move_ICICLE_SPEAR .4byte Move_IRON_DEFENSE .4byte Move_BLOCK .4byte Move_HOWL .4byte Move_DRAGON_CLAW .4byte Move_FRENZY_PLANT .4byte Move_BULK_UP .4byte Move_BOUNCE .4byte Move_MUD_SHOT .4byte Move_POISON_TAIL .4byte Move_COVET .4byte Move_VOLT_TACKLE .4byte Move_MAGICAL_LEAF .4byte Move_WATER_SPORT .4byte Move_CALM_MIND .4byte Move_LEAF_BLADE .4byte Move_DRAGON_DANCE .4byte Move_ROCK_BLAST .4byte Move_SHOCK_WAVE .4byte Move_WATER_PULSE .4byte Move_DOOM_DESIRE .4byte Move_PSYCHO_BOOST .4byte Move_COUNT @ cannot be reached, because last move is Psycho Boost .align 2 gBattleAnims_StatusConditions:: .4byte Status_Poison @ B_ANIM_STATUS_PSN .4byte Status_Confusion @ B_ANIM_STATUS_CONFUSION .4byte Status_Burn @ B_ANIM_STATUS_BRN .4byte Status_Infatuation @ B_ANIM_STATUS_INFATUATION .4byte Status_Sleep @ B_ANIM_STATUS_SLP .4byte Status_Paralysis @ B_ANIM_STATUS_PRZ .4byte Status_Freeze @ B_ANIM_STATUS_FRZ .4byte Status_Curse @ B_ANIM_STATUS_CURSED .4byte Status_Nightmare @ B_ANIM_STATUS_NIGHTMARE .align 2 gBattleAnims_General:: .4byte General_CastformChange @ B_ANIM_CASTFORM_CHANGE .4byte General_StatsChange @ B_ANIM_STATS_CHANGE .4byte General_SubstituteFade @ B_ANIM_SUBSTITUTE_FADE .4byte General_SubstituteAppear @ B_ANIM_SUBSTITUTE_APPEAR .4byte General_BaitThrow @ B_ANIM_BAIT_THROW .4byte General_ItemKnockoff @ B_ANIM_ITEM_KNOCKOFF .4byte General_TurnTrap @ B_ANIM_TURN_TRAP .4byte General_HeldItemEffect @ B_ANIM_HELD_ITEM_EFFECT .4byte General_SmokeballEscape @ B_ANIM_SMOKEBALL_ESCAPE .4byte General_FocusBand @ B_ANIM_FOCUS_BAND .4byte General_Rain @ B_ANIM_RAIN_CONTINUES .4byte General_Sun @ B_ANIM_SUN_CONTINUES .4byte General_Sandstorm @ B_ANIM_SANDSTORM_CONTINUES .4byte General_Hail @ B_ANIM_HAIL_CONTINUES .4byte General_LeechSeedDrain @ B_ANIM_LEECH_SEED_DRAIN .4byte General_MonHit @ B_ANIM_MON_HIT .4byte General_ItemSteal @ B_ANIM_ITEM_STEAL .4byte General_SnatchMove @ B_ANIM_SNATCH_MOVE .4byte General_FutureSightHit @ B_ANIM_FUTURE_SIGHT_HIT .4byte General_DoomDesireHit @ B_ANIM_DOOM_DESIRE_HIT .4byte General_FocusPunchSetUp @ B_ANIM_FOCUS_PUNCH_SETUP .4byte General_IngrainHeal @ B_ANIM_INGRAIN_HEAL .4byte General_WishHeal @ B_ANIM_WISH_HEAL .4byte General_MonScared @ B_ANIM_MON_SCARED .4byte General_GhostGetOut @ B_ANIM_GHOST_GET_OUT .4byte General_SilphScoped @ B_ANIM_SILPH_SCOPED .4byte General_SafariRockThrow @ B_ANIM_ROCK_THROW .4byte General_SafariReaction @ B_ANIM_SAFARI_REACTION .align 2 gBattleAnims_Special:: .4byte Special_LevelUp @ B_ANIM_LVL_UP .4byte Special_SwitchOutPlayerMon @ B_ANIM_SWITCH_OUT_PLAYER_MON .4byte Special_SwitchOutOpponentMon @ B_ANIM_SWITCH_OUT_OPPONENT_MON .4byte Special_BallThrow @ B_ANIM_BALL_THROW .4byte Special_BallThrowWithTrainer @ B_ANIM_BALL_THROW_WITH_TRAINER .4byte Special_SubstituteToMon @ B_ANIM_SUBSTITUTE_TO_MON .4byte Special_MonToSubstitute @ B_ANIM_MON_TO_SUBSTITUTE Move_NONE: Move_MIRROR_MOVE: Move_POUND: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_DOUBLE_SLAP: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 choosetwoturnanim DoubleSlapLeft, DoubleSlapRight DoubleSlapContinue: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff end DoubleSlapLeft: createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2 goto DoubleSlapContinue DoubleSlapRight: createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 2 goto DoubleSlapContinue Move_POISON_POWDER: loadspritegfx ANIM_TAG_POISON_POWDER loadspritegfx ANIM_TAG_POISON_BUBBLE loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 10, 6 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -30, -22, 117, 80, 5, 1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 10, -22, 117, 80, -5, 1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -25, -22, 117, 112, 5, 3 delay 15 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 80, -5, 1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 96, 5, 1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 69, -5, 1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 delay 30 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 15, -22, 117, 80, -5, 1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 96, 7, 2 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 90, -8, 0 delay 20 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 80, -5, 1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 89, 5, 2 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 20, -22, 117, 112, -8, 2 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 80, 5, 1 waitforvisualfinish end Move_STUN_SPORE: loadspritegfx ANIM_TAG_STUN_SPORE loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 10, 6 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -30, -22, 117, 80, 5, 1 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 10, -22, 117, 80, -5, 1 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -25, -22, 117, 112, 5, 3 delay 15 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 80, -5, 1 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 96, 5, 1 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 69, -5, 1 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 delay 30 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 15, -22, 117, 80, -5, 1 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 96, 7, 2 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 90, -8, 0 delay 20 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 80, -5, 1 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 89, 5, 2 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 20, -22, 117, 112, -8, 2 createsprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 80, 5, 1 waitforvisualfinish end Move_SLEEP_POWDER: loadspritegfx ANIM_TAG_SLEEP_POWDER loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 10, 6 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -30, -22, 117, 80, 5, 1 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 10, -22, 117, 80, -5, 1 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -25, -22, 117, 112, 5, 3 delay 15 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 80, -5, 1 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 96, 5, 1 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 69, -5, 1 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 delay 30 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 15, -22, 117, 80, -5, 1 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 96, 7, 2 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 90, -8, 0 delay 20 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 80, -5, 1 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 89, 5, 2 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 20, -22, 117, 112, -8, 2 createsprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 80, 5, 1 waitforvisualfinish end Move_SWIFT: loadspritegfx ANIM_TAG_YELLOW_STAR loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, 20, 1 delay 5 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 5, 22, -18, 1 delay 5 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, -10, 22, 15, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 18, 1 delay 5 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, -20, 1 delay 5 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, 12, 1 delay 5 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_STRENGTH: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeAndSinkMon, 5, ANIM_ATTACKER, 2, 0, 96, 30 waitforvisualfinish delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 4 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_TARGET, 18, 6, 2, 4 delay 4 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 16, 12, ANIM_TARGET, 1 delay 4 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, -12, ANIM_TARGET, 1 delay 4 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 3, 4, ANIM_TARGET, 1 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_TACKLE: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_BODY_SLAM: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER waitforvisualfinish delay 11 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 10, 2 delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6 delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_SUPERSONIC: loadspritegfx ANIM_TAG_GOLD_RING monbg ANIM_ATK_PARTNER splitbgprio_foes ANIM_ATTACKER setalpha 12, 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 8, 1 call SupersonicRing call SupersonicRing call SupersonicRing call SupersonicRing call SupersonicRing call SupersonicRing waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end SupersonicRing: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER createsprite gSupersonicRingSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 30, 0 delay 2 return Move_SCREECH: loadspritegfx ANIM_TAG_PURPLE_RING createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 2, 1 call ScreechRing call ScreechRing delay 16 createvisualtask AnimTask_SwayMon, 5, 0, 6, 2048, 2, ANIM_TARGET waitforvisualfinish end ScreechRing: playsewithpan SE_M_SCREECH, SOUND_PAN_ATTACKER createsprite gScreechRingSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 30, 0 delay 2 return Move_FLAME_WHEEL: loadspritegfx ANIM_TAG_SMALL_EMBER monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 6 delay 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 8, 1 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET call FireSpreadEffect delay 7 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 9 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end FlameWheel1: @ Unused createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 50 delay 4 return Move_PIN_MISSILE: loadspritegfx ANIM_TAG_NEEDLE loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, -8, -8, 20, -32 delay 15 createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 8, 8, 20, -40 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -8, -8, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 9 createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 0, 0, 20, -32 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 8, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 14 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_ICICLE_SPEAR: loadspritegfx ANIM_TAG_ICICLE_SPEAR loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER createsprite gIcicleSpearSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, -8, -8, 20, -32 delay 15 createsprite gIcicleSpearSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 8, 8, 20, -40 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -8, -8, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 9 createsprite gIcicleSpearSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 0, 0, 20, -32 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 8, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 14 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_TAKE_DOWN: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 delay 35 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, 0, 0, 4 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_DOUBLE_EDGE: loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 waitforvisualfinish delay 10 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 delay 3 waitforvisualfinish playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 waitforvisualfinish end Move_POISON_STING: loadspritegfx ANIM_TAG_NEEDLE loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_POISON_BUBBLE monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 0, -8, 0, 20 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET waitforvisualfinish call PoisonBubblesEffect waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_TWINEEDLE: loadspritegfx ANIM_TAG_NEEDLE loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 6, 2 createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 10, -4, 0, -4, 20 createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 12, 10, 12, 20 delay 20 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1 createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -4, 1, 3 loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 5, 2 delay 1 createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 10, 12, 1, 3 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_FIRE_BLAST: loadspritegfx ANIM_TAG_SMALL_EMBER createsoundtask SoundTask_FireBlast, SE_M_FLAME_WHEEL, SE_M_FLAME_WHEEL2 call FireBlastRing call FireBlastRing call FireBlastRing delay 24 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 0, 8, RGB_BLACK waitforvisualfinish delay 19 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 20, 1 call FireBlastCross delay 3 call FireBlastCross delay 3 call FireBlastCross delay 3 call FireBlastCross delay 3 call FireBlastCross delay 3 call FireBlastCross delay 3 call FireBlastCross delay 3 call FireBlastCross delay 3 call FireBlastCross waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 8, 0, RGB_BLACK waitforvisualfinish end FireBlastRing: createsprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0 createsprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 51 createsprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 102 createsprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 153 createsprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 204 delay 5 return FireBlastCross: createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 10, 0, -2 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 13, -2, 0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 13, 2, 0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 15, -2, 2 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 15, 2, 2 return Move_LEECH_SEED: loadspritegfx ANIM_TAG_SEED playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER createsprite gLeechSeedSpriteTemplate, ANIM_TARGET, 2, 15, 0, 0, 24, 35, -32 delay 8 playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER createsprite gLeechSeedSpriteTemplate, ANIM_TARGET, 2, 15, 0, -16, 24, 35, -40 delay 8 playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER createsprite gLeechSeedSpriteTemplate, ANIM_TARGET, 2, 15, 0, 16, 24, 35, -37 delay 12 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET, 10, 8 waitforvisualfinish end Move_EMBER: loadspritegfx ANIM_TAG_SMALL_EMBER loopsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER, 5, 2 createsprite gEmberSpriteTemplate, ANIM_TARGET, 2, 20, 0, -16, 24, 20, 1 delay 4 createsprite gEmberSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 24, 20, 1 delay 4 createsprite gEmberSpriteTemplate, ANIM_TARGET, 2, 20, 0, 16, 24, 20, 1 delay 16 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET call EmberFireHit call EmberFireHit call EmberFireHit end EmberFireHit: createsprite gEmberFlareSpriteTemplate, ANIM_TARGET, 2, -24, 24, 24, 24, 20, ANIM_TARGET, 1 delay 4 return Move_MEGA_PUNCH: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_TARGET delay 2 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 16, RGB_BLACK setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gMegaPunchKickSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 50 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE delay 50 call SetImpactBackground createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff delay 2 restorebg waitbgfadein end SetImpactBackground: delay 2 createvisualtask AnimTask_IsContest, 2 jumprettrue SetImpactContestsBG createvisualtask AnimTask_IsTargetPlayerSide, 2 jumpretfalse SetImpactOpponentBG jumprettrue SetImpactPlayerBG SetImpactBackgroundRet: return SetImpactOpponentBG: changebg BG_IMPACT_OPPONENT goto SetImpactBackgroundRet SetImpactPlayerBG: changebg BG_IMPACT_PLAYER goto SetImpactBackgroundRet SetImpactContestsBG: changebg BG_IMPACT_CONTESTS goto SetImpactBackgroundRet Move_MEGA_KICK: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_TARGET delay 2 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 16, RGB_BLACK setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gMegaPunchKickSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 50 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE delay 50 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET call SetImpactBackground createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 waitforvisualfinish clearmonbg ANIM_TARGET blendoff delay 2 restorebg waitbgfadein end Move_COMET_PUNCH: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_TARGET setalpha 12, 8 choosetwoturnanim CometPunchLeft, CometPunchRight CometPunchContinue: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff end CometPunchLeft: createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, -8, ANIM_TARGET, 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -8, 0, 8, 1, 0 goto CometPunchContinue CometPunchRight: createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, -8, ANIM_TARGET, 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, 0, 8, 1, 0 goto CometPunchContinue Move_SONIC_BOOM: loadspritegfx ANIM_TAG_AIR_WAVE loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 call SonicBoomProjectile call SonicBoomProjectile call SonicBoomProjectile createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 10, 1 call SonicBoomHit waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end SonicBoomProjectile: playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gSonicBoomSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 15 delay 4 return SonicBoomHit: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 2 delay 4 return Move_THUNDER_SHOCK: loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_SPARK_2 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 6, RGB_BLACK waitforvisualfinish delay 10 createvisualtask AnimTask_ElectricBolt, 5, 0, -44, 0 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET delay 9 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 0, 13, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 13, 0, RGB_BLACK waitforvisualfinish delay 20 call ElectricityEffect waitforvisualfinish delay 20 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 0, RGB_BLACK waitforvisualfinish end Move_THUNDERBOLT: loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_SHOCK_3 loadspritegfx ANIM_TAG_SPARK_2 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 6, RGB_BLACK waitforvisualfinish delay 10 createvisualtask AnimTask_ElectricBolt, 5, 24, -52, 0 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET delay 7 createvisualtask AnimTask_ElectricBolt, 5, -24, -52, 0 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET delay 7 createvisualtask AnimTask_ElectricBolt, 5, 0, -60, 1 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET delay 9 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 0, 13, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 13, 0, RGB_BLACK waitforvisualfinish delay 20 createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 0, 40, 0, -32765 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 64, 40, 1, -32765 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 128, 40, 0, -32765 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 192, 40, 2, -32765 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 32, 40, 0, -32765 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 96, 40, 1, -32765 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 160, 40, 0, -32765 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 224, 40, 2, -32765 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 0 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK delay 6 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK delay 6 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK delay 6 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK waitforvisualfinish delay 20 waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 19 call ElectricityEffect waitforvisualfinish delay 20 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 0, RGB_BLACK waitforvisualfinish end Move_THUNDER_WAVE: loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_SPARK_2 loadspritegfx ANIM_TAG_SPARK_H createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 6, RGB_BLACK waitforvisualfinish delay 10 createvisualtask AnimTask_ElectricBolt, 5, 0, -48, 0 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 20 loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 10, 4 createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, -16 delay 4 createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 0 delay 4 createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 16 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 0, RGB_BLACK waitforvisualfinish end Move_BEAT_UP: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_TARGET setalpha 12, 8 choosetwoturnanim BeatUpLeft, BeatUpRight BeatUpContinue: waitforvisualfinish clearmonbg ANIM_TARGET blendoff end BeatUpLeft: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -20, -20, ANIM_TARGET, 2 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, -20, -12, 8, 1, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 8, 0, ANIM_TARGET, 2 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 8, 8, 8, 1, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET goto BeatUpContinue BeatUpRight: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 12, -20, ANIM_TARGET, 2 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 12, -12, 8, 1, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -12, 0, ANIM_TARGET, 2 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, -12, 8, 8, 1, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET goto BeatUpContinue Move_STOMP: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gStompFootSpriteTemplate, ANIM_ATTACKER, 3, 0, -32, 15 delay 19 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, -8, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 9, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_TAIL_WHIP: loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 24, 3 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 2, 3 waitforvisualfinish end Move_CUT: loadspritegfx ANIM_TAG_CUT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff waitforvisualfinish end Move_HIDDEN_POWER: loadspritegfx ANIM_TAG_RED_ORB playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 waitforvisualfinish delay 30 createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(31, 31, 19), 12, 5, 1 delay 4 createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 0 createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 42 createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 84 createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 126 createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 168 createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 210 delay 52 setarg 7, 0xFFFF playsewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 0 createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 32 createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 64 createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 96 createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 128 createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 160 createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 192 createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 224 end Move_REVERSAL: loadspritegfx ANIM_TAG_BLUE_ORB loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB_WHITE, 8, RGB_BLACK, 0 waitforvisualfinish delay 30 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 2, 0, 10, RGB_WHITE delay 10 playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER createsprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 0 createsprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 42 createsprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 84 createsprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 126 createsprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 168 createsprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 210 waitforvisualfinish delay 20 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 8, RGB_BLACK, 0 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 10, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0 end Move_PURSUIT: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET fadetobg BG_DARK waitbgfadein delay 0 setalpha 12, 8 choosetwoturnanim PursuitNormal, PursuitOnSwitchout PursuitContinue: waitforvisualfinish clearmonbg ANIM_TARGET blendoff delay 0 restorebg waitbgfadein end PursuitNormal: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 6, 1, 0 goto PursuitContinue PursuitOnSwitchout: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 6, 1, 0 goto PursuitContinue Move_SPIKE_CANNON: loadspritegfx ANIM_TAG_NEEDLE loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -4, 0, 4, 6, 8, 4 waitforvisualfinish loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 5, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 10, -8, -8, -8, 20 createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 0, 0, 20 createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 8, 8, 20 waitforvisualfinish createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -8, -8, 1, 2 createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 2 createsprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 8, 1, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 7, 1 loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 5, 3 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_SWORDS_DANCE: loadspritegfx ANIM_TAG_SWORD monbg ANIM_ATTACKER setalpha 12, 8 playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 16, 6, 1, 4 createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 delay 22 createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff delay 1 end Move_PSYCH_UP: loadspritegfx ANIM_TAG_SPIRAL monbg ANIM_ATK_PARTNER createvisualtask AnimTask_BlendColorCycleExclude, 2, 1, 2, 6, 1, 11, RGB_BLACK setalpha 12, 8 loopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 5, 10 createsprite gPsychUpSpiralSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0 createvisualtask AnimTask_SwayMon, 5, 0, 5, 2560, 8, ANIM_ATTACKER delay 127 delay 4 playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1 createvisualtask AnimTask_BlendBattleAnimPal, 9, F_PAL_ATTACKER, 2, 10, 0, RGB_YELLOW delay 30 clearmonbg ANIM_ATK_PARTNER blendoff waitforvisualfinish end Move_DIZZY_PUNCH: loadspritegfx ANIM_TAG_DUCK loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 call DizzyPunchLunge createsprite gFistFootSpriteTemplate, ANIM_TARGET, 5, 16, 8, 20, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 16, 0, ANIM_TARGET, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, 160, -32 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, -256, -40 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, 128, -16 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, 416, -38 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, -128, -22 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, -384, -31 delay 10 call DizzyPunchLunge createsprite gFistFootSpriteTemplate, ANIM_TARGET, 5, -16, -8, 20, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -16, -16, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, 160, -32 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, -256, -40 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, 128, -16 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, 416, -38 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, -128, -22 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, -384, -31 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end DizzyPunchLunge: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 6 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 7, 1 return Move_FIRE_SPIN: loadspritegfx ANIM_TAG_SMALL_EMBER playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 47, 1 call FireSpinEffect call FireSpinEffect call FireSpinEffect waitforvisualfinish end FireSpinEffect: createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 28, 528, 30, 13, 50, ANIM_TARGET delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 32, 480, 20, 16, -46, ANIM_TARGET delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 33, 576, 20, 8, 42, ANIM_TARGET delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 31, 400, 25, 11, -42, ANIM_TARGET delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 28, 512, 25, 16, 46, ANIM_TARGET delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 30, 15, -50, ANIM_TARGET delay 2 return Move_FURY_CUTTER: loadspritegfx ANIM_TAG_CUT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_IsFuryCutterHitRight, 2 jumpretfalse FuryCutterLeft goto FuryCutterRight FuryCutterContinue: createvisualtask AnimTask_GetFuryCutterHitCount, 2 jumpreteq 1, FuryCutterContinue2 jumpreteq 2, FuryCutterMedium jumpreteq 3, FuryCutterStrong goto FuryCutterStrongest FuryCutterContinue2: delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff waitforvisualfinish end FuryCutterLeft: createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 goto FuryCutterContinue FuryCutterRight: createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1 goto FuryCutterContinue FuryCutterMedium: createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB(9, 8, 10), 4, RGB_BLACK, 0 goto FuryCutterContinue2 FuryCutterStrong: createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB(9, 8, 10), 4, RGB_BLACK, 0 goto FuryCutterContinue2 FuryCutterStrongest: createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB(9, 8, 10), 4, RGB_BLACK, 0 goto FuryCutterContinue2 Move_SELF_DESTRUCT: loadspritegfx ANIM_TAG_EXPLOSION createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, RGB_RED createvisualtask AnimTask_ShakeMon2, 5, 4, 6, 0, 38, 1 createvisualtask AnimTask_ShakeMon2, 5, 5, 6, 0, 38, 1 createvisualtask AnimTask_ShakeMon2, 5, 6, 6, 0, 38, 1 createvisualtask AnimTask_ShakeMon2, 5, 7, 6, 0, 38, 1 createvisualtask AnimTask_ShakeMon2, 5, 8, 6, 0, 38, 1 call SelfDestructExplode call SelfDestructExplode waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 9, 0, RGB_RED end SelfDestructExplode: playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 0, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 0, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 0, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 0, 1 delay 6 return Move_SLAM: loadspritegfx ANIM_TAG_SLAM_HIT loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 3, 0, 4 delay 1 createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 delay 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 waitforvisualfinish delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_VINE_WHIP: loadspritegfx ANIM_TAG_WHIP_HIT playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 delay 6 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET createsprite gVineWhipSpriteTemplate, ANIM_TARGET, 2, 0, 0 delay 6 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 6, 1 end Move_DRILL_PECK: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_WHIRLWIND_LINES createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 delay 2 loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 4, 8 createvisualtask AnimTask_DrillPeckHitSplats, 5 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 waitforvisualfinish createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6 waitforvisualfinish end Move_WATERFALL: loadspritegfx ANIM_TAG_WATER_IMPACT loadspritegfx ANIM_TAG_SMALL_BUBBLES loadspritegfx ANIM_TAG_ICE_CRYSTALS monbg ANIM_DEF_PARTNER setalpha 12, 8 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 23, 1 delay 5 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 25, ANIM_ATTACKER delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -15, 0, 25, ANIM_ATTACKER delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 20, 10, 25, ANIM_ATTACKER delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 25, ANIM_ATTACKER delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -10, 15, 25, ANIM_ATTACKER delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 25, 20, 25, ANIM_ATTACKER delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -20, 20, 25, ANIM_ATTACKER delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 12, 0, 25, ANIM_ATTACKER waitforvisualfinish delay 10 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 5 delay 6 call RisingWaterHitEffect waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end RisingWaterHitEffect: playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 17, 1 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 20, ANIM_TARGET, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 20 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 20 delay 2 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 15, ANIM_TARGET, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 15 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 15 delay 2 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 10, ANIM_TARGET, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 10 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 10 delay 2 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, ANIM_TARGET, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 5 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 5 delay 2 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 0 delay 2 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -5, ANIM_TARGET, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -5 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -5 delay 2 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -10, ANIM_TARGET, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -10 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -10 delay 2 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, ANIM_TARGET, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -15 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -15 delay 2 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -20, ANIM_TARGET, 1 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -20 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -20 return Move_EXPLOSION: loadspritegfx ANIM_TAG_EXPLOSION createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 8, 9, RGB(26, 8, 8), 8, RGB_BLACK, 8 createvisualtask AnimTask_ShakeMon2, 5, 4, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, 5, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, 6, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, 7, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, 8, 8, 0, 40, 1 call Explosion1 call Explosion1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 16, RGB_WHITE delay 50 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 16, 0, RGB_WHITE end Explosion1: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 1 delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 0, 1 delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 0, 1 delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 0, 1 delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 0, 1 delay 6 return Move_DEFENSE_CURL: loadspritegfx ANIM_TAG_ECLIPSING_ORB loopsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, 18, 3 createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 0 createvisualtask AnimTask_DefenseCurlDeformMon, 5 waitforvisualfinish createsprite gEclipsingOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 6, 0, 1 waitforvisualfinish createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 1 waitforvisualfinish end Move_PROTECT: loadspritegfx ANIM_TAG_PROTECT monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 16 createsprite gProtectSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 90 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER end Move_DETECT: loadspritegfx ANIM_TAG_SPARKLE_4 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 9, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, RGB_WHITE delay 18 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 13, 20, -20 waitforvisualfinish delay 10 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 9, 0, RGB_BLACK createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_WHITE waitforvisualfinish end Move_FRUSTRATION: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_ANGER monbg ANIM_DEF_PARTNER setalpha 12, 8 createvisualtask AnimTask_GetFrustrationPowerLevel, 1 jumpreteq 0, Frustration_Strongest jumpreteq 1, Frustration_Strong jumpreteq 2, Frustration_Medium goto Frustration_Weak Frustration_Continue: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Frustration_Strongest: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER, 1, 0, 15, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 0, 9, RGB_RED waitforvisualfinish delay 20 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28 waitforvisualfinish playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28 waitforvisualfinish delay 10 createvisualtask AnimTask_SwayMon, 5, 0, 16, 6144, 8, ANIM_ATTACKER delay 5 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 30, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 9, 0, RGB_RED goto Frustration_Continue Frustration_Strong: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER, 1, 0, 15, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 0, 9, RGB_RED waitforvisualfinish delay 20 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28 waitforvisualfinish delay 5 createvisualtask AnimTask_StrongFrustrationGrowAndShrink, 5 delay 7 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 8, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 6, 1 delay 14 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 12, -6, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 6, 1 delay 14 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -12, -6, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 9, 0, RGB_RED goto Frustration_Continue Frustration_Medium: playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28 waitforvisualfinish delay 5 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 4, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -4, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 goto Frustration_Continue Frustration_Weak: createsprite gWeakFrustrationAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 20, -28 waitforvisualfinish delay 10 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 10, 2 delay 12 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 goto Frustration_Continue Move_SAFEGUARD: loadspritegfx ANIM_TAG_GUARD_RING monbg ANIM_ATK_PARTNER setalpha 8, 8 playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER createsprite gGuardRingSpriteTemplate, ANIM_ATTACKER, 2 delay 4 createsprite gGuardRingSpriteTemplate, ANIM_ATTACKER, 2 delay 4 createsprite gGuardRingSpriteTemplate, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATK_SIDE, 0, 2, 0, 10, RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end Move_PAIN_SPLIT: loadspritegfx ANIM_TAG_PAIN_SPLIT createsprite gPainSplitProjectileSpriteTemplate, ANIM_ATTACKER, 2, -8, -42, ANIM_ATTACKER createsprite gPainSplitProjectileSpriteTemplate, ANIM_TARGET, 2, -8, -42, ANIM_TARGET delay 10 playsewithpan SE_M_SWAGGER2, 0 createvisualtask AnimTask_PainSplitMovement, 2, ANIM_ATTACKER, 0 createvisualtask AnimTask_PainSplitMovement, 2, ANIM_TARGET, 0 waitforvisualfinish createsprite gPainSplitProjectileSpriteTemplate, ANIM_ATTACKER, 2, -24, -42, ANIM_ATTACKER createsprite gPainSplitProjectileSpriteTemplate, ANIM_TARGET, 2, -24, -42, ANIM_TARGET delay 10 playsewithpan SE_M_SWAGGER2, 0 createvisualtask AnimTask_PainSplitMovement, 2, ANIM_ATTACKER, 1 createvisualtask AnimTask_PainSplitMovement, 2, ANIM_TARGET, 1 waitforvisualfinish createsprite gPainSplitProjectileSpriteTemplate, ANIM_ATTACKER, 2, 8, -42, ANIM_ATTACKER createsprite gPainSplitProjectileSpriteTemplate, ANIM_TARGET, 2, 8, -42, ANIM_TARGET delay 10 playsewithpan SE_M_SWAGGER2, 0 createvisualtask AnimTask_PainSplitMovement, 2, ANIM_ATTACKER, 2 createvisualtask AnimTask_PainSplitMovement, 2, ANIM_TARGET, 2 end Move_VICE_GRIP: loadspritegfx ANIM_TAG_CUT loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET createsprite gViceGripSpriteTemplate, ANIM_ATTACKER, 2, 0 createsprite gViceGripSpriteTemplate, ANIM_ATTACKER, 2, 1 delay 9 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 5, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_GUILLOTINE: loadspritegfx ANIM_TAG_CUT loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 fadetobgfromset BG_GUILLOTINE_OPPONENT, BG_GUILLOTINE_PLAYER, BG_GUILLOTINE_CONTESTS waitbgfadein playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET createsprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 0 createsprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB_BLACK delay 9 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 23, 1 delay 46 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 8, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff restorebg waitbgfadein end Move_PAY_DAY: loadspritegfx ANIM_TAG_COIN loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gCoinThrowSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 1152 waitforvisualfinish playsewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 2 createsprite gFallingCoinSpriteTemplate, ANIM_ATTACKER, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_OUTRAGE: loadspritegfx ANIM_TAG_SMALL_EMBER loopsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER, 8, 3 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 2, 5, 3, 8, RGB(14, 13, 0) createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 5, 4 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 0, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 0, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, 1280, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, -1280, 3 delay 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 40, 1 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 768, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 768, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, -768, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, -768, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 0, 3 call OutrageFlames call OutrageFlames waitforvisualfinish end OutrageFlames: delay 3 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 0, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, 1280, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, -1280, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 768, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 768, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, -768, 3 delay 0 createsprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, -768, 3 return Move_SPARK: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_SPARK_2 delay 0 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 5, 5, RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, ANIM_ATTACKER, 1, 0 delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, ANIM_ATTACKER, 1, 1 delay 0 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 0, 0, RGB(31, 31, 22) delay 10 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 5, 5, RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, ANIM_ATTACKER, 1, 1 delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1 delay 0 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 0, 0, RGB(31, 31, 22) delay 20 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 7, 7, RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 128, 20, 0, 0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 192, 20, 2, 0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 32, 20, 0, 0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 96, 20, 1, 0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 160, 20, 0, 0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0 delay 4 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 0, 0, RGB(31, 31, 22) createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 4 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, -31, 2, 0, 6, RGB(31, 31, 22) call ElectricityEffect waitforvisualfinish end Move_ATTRACT: loadspritegfx ANIM_TAG_RED_HEART loopsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER, 12, 3 createvisualtask AnimTask_SwayMon, 5, 0, 12, 4096, 4, ANIM_ATTACKER delay 15 createsprite gRedHeartProjectileSpriteTemplate, ANIM_TARGET, 3, 20, -8 waitforvisualfinish playsewithpan SE_M_ATTRACT, SOUND_PAN_TARGET createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -32 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -40 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -16 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 416, -38 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -128, -22 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -384, -31 waitforvisualfinish waitplaysewithpan SE_M_ATTRACT2, 0, 15 createvisualtask AnimTask_HeartsBackground, 5 createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 16, 256, 0 createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 224, 240, 15 createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 126, 272, 30 createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 80, 224, 45 createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 170, 272, 60 createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 40, 256, 75 createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 112, 256, 90 createsprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 200, 272, 90 delay 75 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 10, RGB(31, 25, 27) end Move_GROWTH: call GrowthEffect waitforvisualfinish call GrowthEffect waitforvisualfinish end GrowthEffect: createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -3, -3, 16, ANIM_ATTACKER, 0 return Move_WHIRLWIND: loadspritegfx ANIM_TAG_WHIRLWIND_LINES createsprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, -8, ANIM_TARGET, 60, 0 createsprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 60, 1 createsprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 8, ANIM_TARGET, 60, 2 createsprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, ANIM_TARGET, 60, 3 createsprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, ANIM_TARGET, 60, 4 createsprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, ANIM_TARGET, 60, 0 delay 5 loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET, 10, 4 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 15, 1 delay 29 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_TARGET, 12, 6, 1, 5 delay 7 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET createvisualtask AnimTask_SlideOffScreen, 5, ANIM_TARGET, 8 waitforvisualfinish end Move_CONFUSE_RAY: loadspritegfx ANIM_TAG_YELLOW_BALL monbg ANIM_DEF_PARTNER fadetobg BG_GHOST waitbgfadein createvisualtask SoundTask_AdjustPanningVar, 2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 createvisualtask AnimTask_BlendColorCycleByTag, 2, ANIM_TAG_YELLOW_BALL, 0, 6, 0, 14, RGB(31, 10, 0) createsprite gConfuseRayBallBounceSpriteTemplate, ANIM_TARGET, 2, 28, 0, 288 waitforvisualfinish setalpha 8, 8 playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET createsprite gConfuseRayBallSpiralSpriteTemplate, ANIM_TARGET, 2, 0, -16 waitforvisualfinish delay 0 blendoff clearmonbg ANIM_DEF_PARTNER restorebg waitbgfadein end Move_LOCK_ON: loadspritegfx ANIM_TAG_LOCK_ON createsprite gLockOnTargetSpriteTemplate, ANIM_ATTACKER, 40 createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 1 createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 2 createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 3 createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 4 @ Also transitions to red target delay 120 setarg 7, 0xFFFF @ Signal target to flash/disappear waitforvisualfinish end Move_MEAN_LOOK: loadspritegfx ANIM_TAG_EYE monbg ANIM_DEF_PARTNER playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 16, RGB_BLACK loopsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET, 15, 4 waitplaysewithpan SE_M_LEER, SOUND_PAN_TARGET, 85 createsprite gMeanLookEyeSpriteTemplate, ANIM_ATTACKER, 2 delay 120 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK delay 30 clearmonbg ANIM_DEF_PARTNER waitforvisualfinish end Move_ROCK_THROW: loadspritegfx ANIM_TAG_ROCKS createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_TARGET, 2, 6, 1, 15, 1 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 0, 1, 0, 0 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 6 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 19, 1, 10, 0 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 6 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -23, 2, -10, 0 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 20, 1 delay 6 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -15, 1, -10, 0 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 6 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 23, 2, 10, 0 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET waitforvisualfinish end Move_ROCK_SLIDE: loadspritegfx ANIM_TAG_ROCKS monbg ANIM_DEF_PARTNER createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 7, 1, 11, 1 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -5, 1, -5, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 5, 0, 6, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 19, 1, 10, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -23, 2, -10, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 5, 50, 1 delay 2 call RockSlideRocks call RockSlideRocks waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end RockSlideRocks: createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -20, 0, -10, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 28, 1, 10, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -10, 1, -5, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 10, 0, 6, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 24, 1, 10, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -32, 2, -10, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -20, 0, -10, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 30, 2, 10, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 return Move_THIEF: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET delay 1 fadetobg BG_DARK waitbgfadein setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 6 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 8, 1 waitforvisualfinish delay 20 clearmonbg ANIM_TARGET blendoff restorebg waitbgfadein end Move_BUBBLE_BEAM: loadspritegfx ANIM_TAG_BUBBLE loadspritegfx ANIM_TAG_SMALL_BUBBLES monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 delay 1 call BulbblebeamCreateBubbles createvisualtask AnimTask_SwayMon, 5, 0, 3, 3072, 8, ANIM_TARGET call BulbblebeamCreateBubbles call BulbblebeamCreateBubbles waitforvisualfinish call WaterBubblesEffectShort waitforvisualfinish clearmonbg ANIM_TARGET blendoff end BulbblebeamCreateBubbles: createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 35, 70, 0, 256, 50 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER delay 3 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 20, 40, -10, 256, 50 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER delay 3 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 10, -60, 0, 256, 50 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER delay 3 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 15, -15, 10, 256, 50 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER delay 3 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 30, 10, -10, 256, 50 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER delay 3 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 25, -30, 10, 256, 50 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER delay 3 return Move_ICY_WIND: loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_ICE_SPIKES monbg ANIM_DEF_PARTNER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_ATK_SIDE, 4, 0, 4, RGB_BLACK fadetobg BG_ICE waitbgfadeout playsewithpan SE_M_ICY_WIND, 0 waitbgfadein waitforvisualfinish panse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call IcyWindSwirlingSnowballs delay 5 call IcyWindSwirlingSnowballs playsewithpan SE_M_GUST2, SOUND_PAN_TARGET delay 55 call IceSpikesEffectLong waitforvisualfinish clearmonbg ANIM_DEF_PARTNER restorebg waitbgfadeout createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_ATK_SIDE, 4, 4, 0, RGB_BLACK waitbgfadein end IcyWindSwirlingSnowballs: createsprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, 0, 0, 0, 72, 1 delay 5 createsprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, 10, 0, 10, 72, 1 delay 5 createsprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, -10, 0, -10, 72, 1 delay 5 createsprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, 15, 0, 15, 72, 1 delay 5 createsprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, -5, 0, -5, 72, 1 return Move_SMOKESCREEN: loadspritegfx ANIM_TAG_BLACK_SMOKE loadspritegfx ANIM_TAG_BLACK_BALL playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gBlackBallSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 waitforvisualfinish createvisualtask AnimTask_SmokescreenImpact, 2 delay 2 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, -12, 104, 0, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, -12, 72, 1, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, -6, 56, 1, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, -6, 88, 0, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 0, 56, 0, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 0, 88, 1, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 6, 72, 0, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 6, 104, 1, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 12, 72, 0, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 12, 56, 1, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 18, 80, 0, 75 createsprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 18, 72, 1, 75 waitforvisualfinish end Move_CONVERSION: loadspritegfx ANIM_TAG_CONVERSION monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER setalpha 16, 0 delay 0 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -24, -24 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -8, -24 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 8, -24 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 24, -24 delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -24, -8 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -8, -8 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 8, -8 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 24, -8 delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -24, 8 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -8, 8 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 8, 8 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 24, 8 delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -24, 24 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -8, 24 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 8, 24 delay 3 createsprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 24, 24 delay 20 playsewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_CONVERSION, 1, 1, RGB(31, 31, 13), 12, 0, 0 delay 6 createvisualtask AnimTask_ConversionAlphaBlend, 5 waitforvisualfinish delay 1 clearmonbg ANIM_ATK_PARTNER blendoff end Move_CONVERSION_2: loadspritegfx ANIM_TAG_CONVERSION monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET setalpha 0, 16 delay 0 playsewithpan SE_M_BARRIER, SOUND_PAN_TARGET createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -24, -24, 60 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -8, -24, 65 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 8, -24, 70 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 24, -24, 75 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -24, -8, 80 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -8, -8, 85 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 8, -8, 90 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 24, -8, 95 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -24, 8, 100 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -8, 8, 105 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 8, 8, 110 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 24, 8, 115 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -24, 24, 120 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -8, 24, 125 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 8, 24, 130 createsprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 24, 24, 135 createvisualtask AnimTask_Conversion2AlphaBlend, 5 delay 60 playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET delay 10 playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET delay 10 playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET delay 10 playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET delay 10 playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET delay 10 playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET delay 10 playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET delay 10 playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_ROLLING_KICK: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 4 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 6 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 createsprite gSlidingKickSpriteTemplate, ANIM_ATTACKER, 2, -24, 0, 48, 10, 160, 0 delay 5 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 8 clearmonbg ANIM_TARGET blendoff end Move_HEADBUTT: loadspritegfx ANIM_TAG_IMPACT createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish end Move_HORN_ATTACK: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HORN_HIT createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 0, 0, 10 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET waitforvisualfinish end Move_FURY_ATTACK: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HORN_HIT createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 256, ANIM_ATTACKER, 2 choosetwoturnanim FuryAttackRight, FuryAttackLeft FuryAttackContinue: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 waitforvisualfinish end FuryAttackRight: createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 8, 8, 10 waitforvisualfinish createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET goto FuryAttackContinue FuryAttackLeft: createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, -8, -8, 10 waitforvisualfinish createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET goto FuryAttackContinue Move_HORN_DRILL: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HORN_HIT jumpifcontest HornDrillInContest fadetobg BG_DRILL waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, -2304, 768, 1, -1 HornDrillContinue: waitbgfadein setalpha 12, 8 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 0, 0, 12 waitforvisualfinish playse SE_BANG createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 2, ANIM_TARGET, 3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, 3, ANIM_TARGET, 3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -8, -5, ANIM_TARGET, 3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 4, -12, ANIM_TARGET, 3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 16, 0, ANIM_TARGET, 3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, 18, ANIM_TARGET, 3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -17, 12, ANIM_TARGET, 2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -21, -15, ANIM_TARGET, 2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, -27, ANIM_TARGET, 2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 0, ANIM_TARGET, 2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET delay 4 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 waitforvisualfinish restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein end HornDrillInContest: fadetobg BG_DRILL_CONTESTS waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, 2304, 768, 0, -1 goto HornDrillContinue Move_THRASH: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET createvisualtask AnimTask_ThrashMoveMonHorizontal, 2 createvisualtask AnimTask_ThrashMoveMonVertical, 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 28 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 28 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 8, 0, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET end Move_SING: loadspritegfx ANIM_TAG_MUSIC_NOTES monbg ANIM_DEF_PARTNER createvisualtask AnimTask_MusicNotesRainbowBlend, 2 waitforvisualfinish panse SE_M_SING, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 7, 0, 12 delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 1, 12 delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 1, 2, 12 delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 3, 12 delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 3, 0, 12 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 12 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 5, 2, 12 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 3, 12 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 0, 12 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 12 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 1, 2, 12 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 5, 3, 12 delay 4 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER createvisualtask AnimTask_MusicNotesClearRainbowBlend, 2 waitforvisualfinish end Move_LOW_KICK: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 createsprite gSlidingKickSpriteTemplate, ANIM_TARGET, 2, -24, 28, 40, 8, 160, 0 delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, ANIM_TARGET, 2 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 6, 384, ANIM_TARGET, 2 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 4 end Move_EARTHQUAKE: createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 50 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 50 playsewithpan SE_M_EARTHQUAKE, 0 delay 10 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 delay 16 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 end Move_FISSURE: loadspritegfx ANIM_TAG_MUD_SAND createvisualtask AnimTask_HorizontalShake, 3, (MAX_BATTLERS_COUNT + 1), 10, 50 createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 50 playsewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET delay 8 call FissureDirtPlumeFar delay 15 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 delay 15 call FissureDirtPlumeClose delay 15 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 delay 15 call FissureDirtPlumeFar delay 50 fadetobg BG_FISSURE waitbgfadeout createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 waitbgfadein delay 40 restorebg waitbgfadeout setarg 7, -1 waitbgfadein end FissureDirtPlumeFar: createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 12, -48, -16, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 16, -16, -10, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 14, -52, -18, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 12, -32, -16, 24 playsewithpan SE_M_DIG, SOUND_PAN_TARGET return FissureDirtPlumeClose: createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 12, -24, -16, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 16, -38, -10, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 14, -20, -18, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 12, -36, -16, 24 playsewithpan SE_M_DIG, SOUND_PAN_TARGET return Move_DIG: choosetwoturnanim DigSetUp, DigUnleash DigEnd: end DigSetUp: loadspritegfx ANIM_TAG_MUD_SAND loadspritegfx ANIM_TAG_DIRT_MOUND createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, 180 createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0, 1, 180 monbg_static ANIM_ATTACKER delay 1 createvisualtask AnimTask_DigDownMovement, 2, FALSE delay 6 call DigThrowDirt call DigThrowDirt call DigThrowDirt call DigThrowDirt call DigThrowDirt waitforvisualfinish clearmonbg_static ANIM_ATTACKER delay 1 createvisualtask AnimTask_DigDownMovement, 2, TRUE goto DigEnd DigUnleash: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_DIRT_MOUND createvisualtask AnimTask_DigUpMovement, 2, FALSE waitforvisualfinish monbg ANIM_ATTACKER createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, 48 createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0, 1, 48 delay 1 createvisualtask AnimTask_DigUpMovement, 2, TRUE delay 16 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_ATTACKER clearmonbg ANIM_ATTACKER goto DigEnd DigThrowDirt: createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 12, 4, -16, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 16, 4, -10, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 14, 4, -18, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 12, 4, -16, 18 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER delay 32 return Move_MEDITATE: call SetPsychicBackground createvisualtask AnimTask_MeditateStretchAttacker, 2 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER delay 16 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER waitforvisualfinish call UnsetPsychicBackground end Move_AGILITY: monbg ANIM_ATK_PARTNER setalpha 12, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 4, 4 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 10 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 12 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 12 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff delay 1 end Move_QUICK_ATTACK: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_ATK_PARTNER setalpha 12, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff waitforvisualfinish end Move_RAGE: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_ANGER monbg ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_ATTACKER, RGB_RED, 10, 0, 2 createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, -28 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER delay 20 createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, TRUE, 1, 10, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET end Move_TELEPORT: call SetPsychicBackground createvisualtask AnimTask_Teleport, 2 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER delay 15 call UnsetPsychicBackground waitforvisualfinish end Move_DOUBLE_TEAM: monbg ANIM_ATK_PARTNER setalpha 12, 8 createvisualtask AnimTask_DoubleTeam, 2 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 32 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 24 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 16 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER delay 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff delay 1 end Move_MINIMIZE: setalpha 10, 8 createvisualtask AnimTask_Minimize, 2 loopsewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 34, 3 waitforvisualfinish blendoff end Move_METRONOME: loadspritegfx ANIM_TAG_FINGER loadspritegfx ANIM_TAG_THOUGHT_BUBBLE createsprite gThoughtBubbleSpriteTemplate, ANIM_ATTACKER, 11, 0, 100 playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER delay 6 createsprite gMetronomeFingerSpriteTemplate, ANIM_ATTACKER, 12, 0 delay 24 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 22, 3 waitforvisualfinish end Move_SKULL_BASH: choosetwoturnanim SkullBashSetUp, SkullBashAttack SkullBashEnd: end SkullBashSetUp: call SkullBashSetUpHeadDown call SkullBashSetUpHeadDown waitforvisualfinish goto SkullBashEnd SkullBashSetUpHeadDown: createsprite gSlideMonToOffsetAndBackSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -24, 0, 0, 10, 0 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 16, 96, ANIM_ATTACKER, 2 waitforvisualfinish createsprite gSlideMonToOffsetAndBackSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 10, 1 waitforvisualfinish return SkullBashAttack: loadspritegfx ANIM_TAG_IMPACT createvisualtask AnimTask_SkullBashPosition, 2, 0 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER waitforvisualfinish playse SE_BANG createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 0 loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 8, 3 waitforvisualfinish createvisualtask AnimTask_SkullBashPosition, 2, 1 goto SkullBashEnd Move_AMNESIA: loadspritegfx ANIM_TAG_AMNESIA call SetPsychicBackground delay 8 createsprite gQuestionMarkSpriteTemplate, ANIM_ATTACKER, 20 playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER delay 54 loopsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER, 16, 3 waitforvisualfinish call UnsetPsychicBackground end Move_KINESIS: loadspritegfx ANIM_TAG_ALERT loadspritegfx ANIM_TAG_BENT_SPOON playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER call SetPsychicBackground createsprite gBentSpoonSpriteTemplate, ANIM_ATTACKER, 20 createsprite gKinesisZapEnergySpriteTemplate, ANIM_ATTACKER, 19, 32, -8, 0 createsprite gKinesisZapEnergySpriteTemplate, ANIM_ATTACKER, 19, 32, 16, 1 loopsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER, 21, 2 delay 60 playsewithpan SE_M_DIZZY_PUNCH, SOUND_PAN_ATTACKER delay 30 loopsewithpan SE_M_DIZZY_PUNCH, SOUND_PAN_ATTACKER, 20, 2 delay 70 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER waitforvisualfinish call UnsetPsychicBackground end Move_GLARE: loadspritegfx ANIM_TAG_SMALL_RED_EYE loadspritegfx ANIM_TAG_EYE_SPARKLE createvisualtask AnimTask_GlareEyeDots, 5, 0 playsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 0, 0, 16, RGB_BLACK waitforvisualfinish createsprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, -16, -8 createsprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, 16, -8 createvisualtask AnimTask_ScaryFace, 5 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER delay 2 createvisualtask AnimTask_ShakeTargetInPattern, 3, 20, 1, FALSE waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 0, 16, 0, RGB_BLACK end Move_BARRAGE: loadspritegfx ANIM_TAG_RED_BALL createvisualtask AnimTask_BarrageBall, 3 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER delay 24 createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, 40, 1 createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 0, 4, 20, 1 createvisualtask AnimTask_ShakeMon, 3, ANIM_DEF_PARTNER, 0, 4, 20, 1 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 2 end Move_SKY_ATTACK: choosetwoturnanim SkyAttackSetUp, SkyAttackUnleash SkyAttackEnd: end SkyAttackSetUp: monbg ANIM_DEF_PARTNER setalpha 12, 11 createvisualtask AnimTask_GetTargetIsAttackerPartner, 5, ARG_RET_ID jumpretfalse SkyAttackSetUpAgainstOpponent goto SkyAttackSetUpAgainstPartner SkyAttackSetUpAgainstOpponent: createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, 1, 0, 12, RGB_BLACK waitforvisualfinish delay 12 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 8, 0, RGB_BLACK createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 loopsewithpan SE_M_STAT_INCREASE, SOUND_PAN_ATTACKER, 4, 8 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 15, RGB_WHITE delay 20 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_ATK_PARTNER | F_PAL_DEF_PARTNER, 1, 8, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff goto SkyAttackEnd SkyAttackSetUpAgainstPartner: createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 1, 0, 12, RGB_BLACK waitforvisualfinish delay 12 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 8, 0, RGB_BLACK createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 playsewithpan SE_M_STAT_INCREASE, SOUND_PAN_ATTACKER delay 8 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 15, RGB_WHITE delay 20 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 4, 1, 8, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff goto SkyAttackEnd SkyAttackUnleash: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_BIRD call SetSkyBg monbg ANIM_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 16, RGB_WHITE delay 4 createvisualtask AnimTask_AttackerFadeToInvisible, 5, 0 waitforvisualfinish createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_SKY_UPPERCUT, SOUND_PAN_ATTACKER createsprite gSkyAttackBirdSpriteTemplate, ANIM_TARGET, 2 delay 14 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 20 createvisualtask AnimTask_AttackerFadeFromInvisible, 5, 1 delay 2 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 15, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATTACKER call UnsetSkyBg goto SkyAttackEnd Move_FLASH: playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createvisualtask AnimTask_Flash, 2 waitforvisualfinish end Move_SPLASH: createvisualtask AnimTask_Splash, 2, 0, 3 delay 8 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 38, 3 waitforvisualfinish end Move_ACID_ARMOR: monbg ANIM_ATTACKER setalpha 15, 0 createvisualtask AnimTask_AcidArmor, 2, ANIM_ATTACKER playsewithpan SE_M_ACID_ARMOR, SOUND_PAN_ATTACKER waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER delay 1 end Move_SHARPEN: loadspritegfx ANIM_TAG_SPHERE_TO_CUBE createsprite gSharpenSphereSpriteTemplate, ANIM_ATTACKER, 2 waitforvisualfinish end Move_SUPER_FANG: loadspritegfx ANIM_TAG_FANG_ATTACK createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 1, 0, 20, 1 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 48, 1 createvisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATTACKER, RGB(31, 6, 1), 12, 4, 1 waitforvisualfinish delay 20 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 4 createsprite gSuperFangSpriteTemplate, ANIM_TARGET, 2 playsewithpan SE_M_BITE, SOUND_PAN_TARGET delay 8 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB(31, 2, 2), 14, RGB_WHITE, 14 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 7, 12, 1 waitforvisualfinish blendoff end Move_SLASH: loadspritegfx ANIM_TAG_SLASH createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET delay 4 createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, 8, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish end Move_STRUGGLE: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_MOVEMENT_WAVES monbg ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4 createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2 createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 2 loopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 12, 4 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_SKETCH: loadspritegfx ANIM_TAG_PENCIL monbg ANIM_TARGET createvisualtask AnimTask_SketchDrawMon, 2 createsprite gPencilSpriteTemplate, ANIM_TARGET, 2 waitforvisualfinish clearmonbg ANIM_TARGET createvisualtask AnimTask_Splash, 2, 0, 2 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 38, 2 end Move_NIGHTMARE: fadetobg BG_GHOST waitbgfadein jumpifcontest NightmareInContest monbg ANIM_DEF_PARTNER createvisualtask AnimTask_NightmareClone, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 40, 1 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER restorebg waitbgfadein end NightmareInContest: createvisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATTACKER, RGB_WHITE, 10, 2, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 3, 0, 32, 1 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET waitforvisualfinish restorebg waitbgfadein end Move_FLAIL: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER loopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 8, 2 waitforvisualfinish createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 30, 1, 0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_SPITE: fadetobg BG_GHOST playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER waitbgfadein monbg ANIM_DEF_PARTNER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 6, 0, 8, RGB_WHITE createvisualtask AnimTask_SpiteTargetShadow, 2 loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 waitforvisualfinish restorebg waitbgfadein clearmonbg ANIM_TARGET end Move_MACH_PUNCH: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_ATK_PARTNER createvisualtask AnimTask_GetAttackerSide, 2 jumprettrue MachPunchAgainstPlayer fadetobg BG_HIGHSPEED_OPPONENT MachPunchContinue: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1 waitbgfadein delay 0 setalpha 9, 8 createvisualtask AnimTask_AttackerPunchWithTrace, 2, RGB(8, 9, 28), 10 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein end MachPunchAgainstPlayer: fadetobg BG_HIGHSPEED_PLAYER goto MachPunchContinue Move_FORESIGHT: loadspritegfx ANIM_TAG_MAGNIFYING_GLASS monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 16, 0 createsprite gForesightMagnifyingGlassSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET delay 17 loopsewithpan SE_M_SKETCH, SOUND_PAN_TARGET, 16, 4 delay 48 delay 24 playsewithpan SE_M_SKETCH, SOUND_PAN_TARGET delay 10 createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB_WHITE, 12, 2, 1 playsewithpan SE_M_DETECT, SOUND_PAN_TARGET waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER end Move_DESTINY_BOND: loadspritegfx ANIM_TAG_WHITE_SHADOW fadetobg BG_GHOST playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER waitbgfadein createvisualtask AnimTask_DestinyBondWhiteShadow, 5, 0, 48 playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER delay 48 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 24, 1 createvisualtask AnimTask_BlendBattleAnimPalExclude, 2, 6, 1, 0, 12, RGB(29, 29, 29) delay 24 createvisualtask AnimTask_BlendBattleAnimPalExclude, 2, 6, 1, 12, 0, RGB(29, 29, 29) playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET waitforvisualfinish restorebg waitbgfadein blendoff clearmonbg 5 end Move_ENDURE: loadspritegfx ANIM_TAG_FOCUS_ENERGY playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 8 call EndureEffect waitforvisualfinish end EndureEffect: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 26, 2 delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 14, 28, 1 delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 10, 2 delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 26, 3 delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -12, 0, 1 return Move_CHARM: loadspritegfx ANIM_TAG_MAGENTA_HEART createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0, 20 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER delay 15 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, -20, 20 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER delay 15 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 20, 20 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER waitforvisualfinish end Move_ROLLOUT: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_MUD_SAND loadspritegfx ANIM_TAG_ROCKS monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_Rollout, 2 waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 30, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 2 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_FALSE_SWIPE: loadspritegfx ANIM_TAG_SLASH_2 loadspritegfx ANIM_TAG_IMPACT createsprite gFalseSwipeSliceSpriteTemplate, ANIM_TARGET, 2 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET delay 16 createsprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 0 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET delay 2 createsprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 16 delay 2 createsprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 32 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET delay 2 createsprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 48 delay 2 createsprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 64 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET delay 2 createsprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 80 delay 2 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET end Move_SWAGGER: loadspritegfx ANIM_TAG_BREATH loadspritegfx ANIM_TAG_ANGER createvisualtask AnimTask_GrowAndShrink, 2 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gBreathPuffSpriteTemplate, ANIM_ATTACKER, 2 loopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2 waitforvisualfinish delay 24 createsprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, -20, -28 playsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET delay 12 createsprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, 20, -28 playsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET waitforvisualfinish end Move_MILK_DRINK: loadspritegfx ANIM_TAG_MILK_BOTTLE loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_BLUE_STAR monbg ANIM_TARGET createsprite gMilkBottleSpriteTemplate, ANIM_ATTACKER, 2 delay 40 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER delay 12 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER delay 20 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0 playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER waitforvisualfinish clearmonbg ANIM_TARGET call HealingEffect2 waitforvisualfinish end Move_MAGNITUDE: createvisualtask AnimTask_IsPowerOver99, 2 waitforvisualfinish jumpargeq 15, FALSE, MagnitudeRegular jumpargeq 15, TRUE, MagnitudeIntense MagnitudeEnd: end MagnitudeRegular: createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 0, 50 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 0, 50 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 10 goto MagnitudeEnd MagnitudeIntense: createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 0, 50 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 0, 50 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 10 delay 10 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 delay 16 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14 goto MagnitudeEnd Move_RAPID_SPIN: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_RAPID_SPIN monbg ANIM_ATTACKER createsprite gRapidSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 32, -32, 40, -2 createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 0 loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 10, 1, 0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish delay 8 createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 1 loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4 waitforvisualfinish clearmonbg ANIM_ATTACKER end Move_MOONLIGHT: loadspritegfx ANIM_TAG_MOON loadspritegfx ANIM_TAG_GREEN_SPARKLE loadspritegfx ANIM_TAG_BLUE_STAR setalpha 0, 16 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 16, RGB_BLACK waitforvisualfinish createsprite gMoonSpriteTemplate, ANIM_ATTACKER, 2, 120, 56 createvisualtask AnimTask_AlphaFadeIn, 3, 0, 16, 16, 0, 1 playsewithpan SE_M_MOONLIGHT, 0 delay 30 createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, -12, 0 delay 30 createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, -24, 0 delay 30 createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, 21, 0 delay 30 createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, 0, 0 delay 30 createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, 10, 0 delay 20 createvisualtask AnimTask_MoonlightEndFade, 2 waitforvisualfinish call HealingEffect waitforvisualfinish end Move_EXTREME_SPEED: loadspritegfx ANIM_TAG_SPEED_DUST loadspritegfx ANIM_TAG_IMPACT createvisualtask AnimTask_GetAttackerSide, 2 jumprettrue ExtremeSpeedAgainstPlayer fadetobg BG_HIGHSPEED_OPPONENT ExtremeSpeedContinue: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1 waitbgfadein createvisualtask AnimTask_AttackerStretchAndDisappear, 2 loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 3 waitforvisualfinish delay 1 createvisualtask AnimTask_SetAttackerInvisibleWaitForSignal, 2 monbg ANIM_TARGET setalpha 12, 8 delay 18 createvisualtask AnimTask_ExtremeSpeedImpact, 2 delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gMonEdgeHitSplatSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, -12, 3 delay 10 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gMonEdgeHitSplatSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, 3 delay 10 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gMonEdgeHitSplatSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_SpeedDust, 2 delay 10 createvisualtask AnimTask_ExtremeSpeedMonReappear, 2 loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 8, 4 waitforvisualfinish restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein clearmonbg ANIM_TARGET blendoff delay 1 setarg 7, 0x1000 delay 1 end ExtremeSpeedAgainstPlayer: fadetobg BG_HIGHSPEED_PLAYER goto ExtremeSpeedContinue Move_UPROAR: loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE loadspritegfx ANIM_TAG_THIN_RING monbg ANIM_DEF_PARTNER createvisualtask AnimTask_UproarDistortion, 2, 0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 29, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, -29, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, -29, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -29, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, -24, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, -24, 0 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end Move_HEAT_WAVE: loadspritegfx ANIM_TAG_FLYING_DIRT createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FLYING_DIRT, 0, 6, 6, RGB_RED createvisualtask AnimTask_LoadSandstormBackground, 5, TRUE createvisualtask AnimTask_BlendBackground, 6, 6, RGB_RED panse SE_M_HEAT_WAVE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 delay 4 createvisualtask AnimTask_MoveHeatWaveTargets, 5 delay 12 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 1 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 1 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 1 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 1 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 1 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 1 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 1 end @ Also used by Hail weather Move_HAIL: loadspritegfx ANIM_TAG_HAIL loadspritegfx ANIM_TAG_ICE_CRYSTALS createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 0, 6, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_Hail, 5 loopsewithpan SE_M_HAIL, 0, 8, 10 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 6, 0, RGB_BLACK end Move_TORMENT: loadspritegfx ANIM_TAG_ANGER loadspritegfx ANIM_TAG_THOUGHT_BUBBLE createvisualtask AnimTask_TormentAttacker, 2 waitforvisualfinish createvisualtask AnimTask_BlendMonInAndOut, 2, ANIM_TARGET, RGB_RED, 10, 1, 1 createsprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, -20, -28 playsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET delay 20 createsprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, 20, -28 playsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET end Move_MEMENTO: setalpha 0, 16 delay 1 createvisualtask AnimTask_InitMementoShadow, 2 delay 1 createvisualtask AnimTask_MoveAttackerMementoShadow, 5 playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER delay 48 playsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_MementoHandleBg, 2 delay 12 setalpha 0, 16 delay 1 monbg_static ANIM_TARGET createvisualtask AnimTask_MoveTargetMementoShadow, 5 playsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET waitforvisualfinish clearmonbg_static ANIM_TARGET delay 1 blendoff delay 1 end Move_FACADE: loadspritegfx ANIM_TAG_SWEAT_DROP createvisualtask AnimTask_SquishAndSweatDroplets, 2, ANIM_ATTACKER, 3 createvisualtask AnimTask_FacadeColorBlend, 2, ANIM_ATTACKER, 72 loopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 24, 3 end Move_SMELLING_SALT: loadspritegfx ANIM_TAG_TAG_HAND loadspritegfx ANIM_TAG_SMELLINGSALT_EFFECT createsprite gSmellingSaltsHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 2 createsprite gSmellingSaltsHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 2 delay 32 createvisualtask AnimTask_SmellingSaltsSquish, 3, ANIM_TARGET, 2 loopsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET, 12, 2 waitforvisualfinish delay 4 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 6, 2 createsprite gSmellingSaltExclamationSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 8, 3 loopsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET, 16, 3 end Move_FOLLOW_ME: loadspritegfx ANIM_TAG_FINGER createsprite gFollowMeFingerSpriteTemplate, ANIM_ATTACKER, 2, 0 playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 18 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER delay 71 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 22, 3 end Move_CHARGE: loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_ELECTRICITY monbg ANIM_ATTACKER setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 30 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 30 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0 delay 25 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 20 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 15 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 10 delay 6 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 6, 5 waitforvisualfinish createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 16 delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, -16, -16 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB_BLACK clearmonbg ANIM_ATTACKER blendoff end Move_TAUNT: loadspritegfx ANIM_TAG_FINGER_2 loadspritegfx ANIM_TAG_THOUGHT_BUBBLE loadspritegfx ANIM_TAG_ANGER createsprite gThoughtBubbleSpriteTemplate, ANIM_ATTACKER, 11, 0, 45 playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER delay 6 createsprite gTauntFingerSpriteTemplate, ANIM_ATTACKER, 12, 0 delay 4 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 16, 2 waitforvisualfinish delay 8 createsprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, -20, -28 playsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET waitforvisualfinish delay 12 createsprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, 20, -28 playsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET end Move_HELPING_HAND: loadspritegfx ANIM_TAG_TAG_HAND createvisualtask AnimTask_HelpingHandAttackerMovement, 5 createsprite gHelpingHandClapSpriteTemplate, ANIM_ATTACKER, 40, 0 createsprite gHelpingHandClapSpriteTemplate, ANIM_ATTACKER, 40, 1 delay 19 playsewithpan SE_M_ENCORE, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1 delay 14 playsewithpan SE_M_ENCORE, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1 delay 20 playsewithpan SE_M_ENCORE, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 3, 0, 10, 1 createvisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATK_PARTNER, RGB_YELLOW, 12, 1, 1 end Move_ASSIST: loadspritegfx ANIM_TAG_PAW_PRINT createsprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, 112, -16, 140, 128, 36 delay 2 createsprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, 208, 128, -16, 48, 36 playsewithpan SE_M_SCRATCH, 0 delay 2 createsprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, -16, 112, 256, -16, 36 playsewithpan SE_M_SCRATCH, 0 delay 2 createsprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, 108, 128, 84, -16, 36 playsewithpan SE_M_SCRATCH, 0 delay 2 createsprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, -16, 56, 256, 56, 36 playsewithpan SE_M_SCRATCH, 0 end Move_SUPERPOWER: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_METEOR loadspritegfx ANIM_TAG_FLAT_ROCK monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER setalpha 12, 8 createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 2, ANIM_ATTACKER playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER delay 20 createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 180, 1 createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_EARTHQUAKE, 0 delay 40 createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 200, 96, 1, 120 delay 8 createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 20, 248, 4, 112 delay 8 createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 130, 160, 2, 104 delay 8 createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 160, 192, 0, 96 delay 8 createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 60, 288, 3, 88 delay 74 createsprite gSuperpowerFireballSpriteTemplate, ANIM_TARGET, 3, ANIM_ATTACKER playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER delay 16 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff delay 1 end Move_RECYCLE: loadspritegfx ANIM_TAG_RECYCLE monbg ANIM_ATTACKER setalpha 0, 16 delay 1 createsprite gRecycleSpriteTemplate, ANIM_ATTACKER, 2 loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER, 24, 3 waitforvisualfinish createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB_WHITE, 12, 2, 1 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER delay 1 end Move_BRICK_BREAK: loadspritegfx ANIM_TAG_BLUE_LIGHT_WALL loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_TORN_METAL choosetwoturnanim BrickBreakNormal, BrickBreakShatteredWall BrickBreakNormal: monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8 delay 4 delay 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -18, -18, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, -18, -18, 10, 1, 0 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET delay 20 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8 delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, 18, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 18, 18, 10, 1, 0 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET delay 20 createvisualtask AnimTask_WindUpLunge, 2, ANIM_ATTACKER, -24, 0, 24, 10, 24, 3 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 6, RGB_BLACK delay 37 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 10, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 6, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET end BrickBreakShatteredWall: monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8 delay 4 createsprite gBrickBreakWallSpriteTemplate, ANIM_ATTACKER, 3, ANIM_TARGET, 0, 0, 90, 10 delay 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -18, -18, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, -18, -18, 10, 1, 0 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET delay 20 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8 delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, 18, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 18, 18, 10, 1, 0 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET delay 20 createvisualtask AnimTask_WindUpLunge, 2, ANIM_ATTACKER, -24, 0, 24, 10, 24, 3 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 6, RGB_BLACK delay 37 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 10, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, -8, -12 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 8, -12 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 2, -8, 12 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 3, 8, 12 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 6, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET end Move_YAWN: loadspritegfx ANIM_TAG_PINK_CLOUD createvisualtask AnimTask_DeepInhale, 2, ANIM_ATTACKER playsewithpan SE_M_YAWN, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gYawnCloudSpriteTemplate, ANIM_TARGET, 5, 2 playsewithpan SE_M_SPIT_UP, SOUND_PAN_ATTACKER delay 4 createsprite gYawnCloudSpriteTemplate, ANIM_TARGET, 5, 1 delay 4 createsprite gYawnCloudSpriteTemplate, ANIM_TARGET, 5, 0 waitforvisualfinish createvisualtask AnimTask_DeepInhale, 2, ANIM_TARGET playsewithpan SE_M_YAWN, SOUND_PAN_TARGET end Move_ENDEAVOR: loadspritegfx ANIM_TAG_SWEAT_DROP loadspritegfx ANIM_TAG_IMPACT createvisualtask AnimTask_SquishAndSweatDroplets, 2, ANIM_ATTACKER, 2 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 24, 2 createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(31, 21, 0), 12, 1, 2 delay 6 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 12, -12, ANIM_TARGET, 2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 24 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -12, 12, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET end Move_ERUPTION: loadspritegfx ANIM_TAG_WARM_ROCK createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 2, 0, 4, RGB_RED waitforvisualfinish createvisualtask AnimTask_EruptionLaunchRocks, 2 waitplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER, 60 waitforvisualfinish createvisualtask AnimTask_EruptionLaunchRocks, 2 waitplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER, 60 waitforvisualfinish delay 30 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 200, -32, 0, 100, 0 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 30, -32, 16, 90, 1 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 150, -32, 32, 60, 2 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 90, -32, 48, 80, 3 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 110, -32, 64, 50, 0 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 60, -32, 80, 70, 1 delay 22 createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 8, 60 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 8, 60 loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET, 16, 12 delay 80 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 40, F_PAL_BG | F_PAL_BATTLERS, 4, 4, 0, RGB_RED end Move_SKILL_SWAP: loadspritegfx ANIM_TAG_BLUEGREEN_ORB call SetPsychicBackground createvisualtask AnimTask_SkillSwap, 3, ANIM_TARGET createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB_WHITE, 12, 3, 1 loopsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER, 24, 3 delay 16 createvisualtask AnimTask_SkillSwap, 3, ANIM_ATTACKER createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB_WHITE, 12, 3, 1 waitforvisualfinish call UnsetPsychicBackground end Move_IMPRISON: loadspritegfx ANIM_TAG_HOLLOW_ORB loadspritegfx ANIM_TAG_X_SIGN call SetPsychicBackground monbg ANIM_DEF_PARTNER createvisualtask AnimTask_ImprisonOrbs, 5 delay 8 loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_ATTACKER, 8, 5 waitforvisualfinish delay 4 createsprite gRedXSpriteTemplate, ANIM_ATTACKER, 5, ANIM_ATTACKER, 40 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 1, 10 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_ATTACKER clearmonbg ANIM_DEF_PARTNER call UnsetPsychicBackground end Move_GRUDGE: loadspritegfx ANIM_TAG_PURPLE_FLAME monbg ANIM_ATTACKER splitbgprio_all fadetobg BG_GHOST playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER waitbgfadein createvisualtask AnimTask_GrudgeFlames, 3 loopsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER, 16, 4 delay 10 delay 80 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET waitforvisualfinish restorebg waitbgfadein clearmonbg ANIM_ATTACKER end Move_CAMOUFLAGE: monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER setalpha 16, 0 createvisualtask AnimTask_SetCamouflageBlend, 5, F_PAL_ATTACKER, 3, 0, 14 delay 16 createvisualtask AnimTask_AttackerFadeToInvisible, 2, 4 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER waitforvisualfinish delay 8 createvisualtask AnimTask_SetCamouflageBlend, 5, F_PAL_ATTACKER, 0, 0, 0 waitforvisualfinish createvisualtask AnimTask_AttackerFadeFromInvisible, 2, 1 waitforvisualfinish blendoff clearmonbg ANIM_ATK_PARTNER end Move_TAIL_GLOW: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT monbg ANIM_ATTACKER setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK waitforvisualfinish createsprite gTailGlowOrbSpriteTemplate, ANIM_ATTACKER, 66, ANIM_ATTACKER delay 18 loopsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER, 16, 6 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB_BLACK clearmonbg ANIM_ATTACKER blendoff delay 1 end Move_LUSTER_PURGE: loadspritegfx ANIM_TAG_WHITE_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_IMPACT fadetobg BG_PSYCHIC waitbgfadeout createvisualtask AnimTask_FadeScreenToWhite, 5 waitbgfadein monbg ANIM_ATTACKER setalpha 12, 8 playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER createsprite gLusterPurgeCircleSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(0, 0, 23) waitforvisualfinish createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff call UnsetPsychicBackground end Move_MIST_BALL: loadspritegfx ANIM_TAG_SMALL_BUBBLES loadspritegfx ANIM_TAG_WHITE_FEATHER delay 0 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER createsprite gMistBallSpriteTemplate, ANIM_TARGET, 0, 0, 0, 0, 0, 30, 0 waitforvisualfinish playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 10, 0 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 1, 1, RGB(23, 16, 31), 16, RGB_WHITE, 16 delay 0 playsewithpan SE_M_HAZE, 0 createvisualtask AnimTask_MistBallFog, 5 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 3, 0, 16, RGB_WHITE delay 8 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 70, 0 delay 70 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB_WHITE end Move_FEATHER_DANCE: loadspritegfx ANIM_TAG_WHITE_FEATHER monbg ANIM_DEF_PARTNER splitbgprio_all playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_TARGET delay 0 createsprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 64, 2, 104, 11304, 32, 1 delay 6 createsprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 32, 2, 104, 11304, 32, 1 createsprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 0, 2, 104, 11304, 32, 1 delay 6 createsprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 224, 2, 104, 11304, 32, 1 createsprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 128, 2, 104, 11304, 32, 1 delay 6 createsprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 192, 2, 104, 11304, 32, 1 createsprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 160, 2, 104, 11304, 32, 1 delay 6 createsprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 96, 2, 104, 11304, 32, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end Move_TEETER_DANCE: loadspritegfx ANIM_TAG_MUSIC_NOTES loadspritegfx ANIM_TAG_DUCK createvisualtask AnimTask_TeeterDanceMovement, 5 createsprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, -2 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER delay 24 createsprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -2 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER delay 24 createsprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, -16, -2 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER delay 24 createsprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 1, -8, -2 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER delay 24 createsprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 2, 8, -2 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER end Move_MUD_SPORT: loadspritegfx ANIM_TAG_MUD_SAND createvisualtask AnimTask_Splash, 2, 0, 6 delay 24 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, -4, -16 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, 4, -12 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER delay 32 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, -3, -12 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, 5, -14 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER delay 32 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, -5, -18 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, 3, -14 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER delay 16 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 220, 60 waitplaysewithpan SE_M_BUBBLE2, 0, 15 delay 2 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 60, 100 waitplaysewithpan SE_M_BUBBLE2, 0, 25 delay 2 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 140, 55 waitplaysewithpan SE_M_BUBBLE2, 0, 14 delay 2 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 180, 50 waitplaysewithpan SE_M_BUBBLE2, 0, 10 delay 2 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 20, 90 waitplaysewithpan SE_M_BUBBLE2, 0, 22 delay 2 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 90, 90 waitplaysewithpan SE_M_BUBBLE2, 0, 22 delay 2 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 160, 60 waitplaysewithpan SE_M_BUBBLE2, 0, 15 delay 2 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 30, 90 waitplaysewithpan SE_M_BUBBLE2, 0, 22 delay 2 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 120, 60 waitplaysewithpan SE_M_BUBBLE2, 0, 15 delay 2 createsprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 200, 40 waitplaysewithpan SE_M_BUBBLE2, 0, 10 end Move_NEEDLE_ARM: loadspritegfx ANIM_TAG_GREEN_SPIKE loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 2, 16 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 0, -32, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 22, -22, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 30, 0, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 20, 20, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 0, 28, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, -19, 19, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, -27, 0, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, -18, -18, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 0, -25, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 17, -17, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 23, 0, 16 delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 16, 16, 16 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0, -24, 10 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 17, -17, 10 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 24, 0, 10 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 17, 17, 10 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0, 24, 10 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, -17, 17, 10 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, -24, 0, 10 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, -17, -17, 10 end Move_SLACK_OFF: loadspritegfx ANIM_TAG_BLUE_STAR createvisualtask AnimTask_SlackOffSquish, 2, ANIM_ATTACKER playsewithpan SE_M_YAWN, SOUND_PAN_ATTACKER waitforvisualfinish call HealingEffect waitforvisualfinish end Move_CRUSH_CLAW: loadspritegfx ANIM_TAG_BLUE_LIGHT_WALL loadspritegfx ANIM_TAG_CLAW_SLASH loadspritegfx ANIM_TAG_TORN_METAL monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 4 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET delay 12 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish waitforvisualfinish @ Redundant blendoff clearmonbg ANIM_TARGET end Move_AROMATHERAPY: playsewithpan SE_M_PETAL_DANCE, 0 loadspritegfx ANIM_TAG_FLOWER loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_SPARKLE_2 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 0, 0, 7, RGB(13, 31, 12) delay 1 monbg ANIM_ATTACKER delay 1 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 24, 16, 0, 2, 2, 0, 0 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 64, 24, 0, 3, 1, 1, 0 createsprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 16, 24, 0, 2, 1, 0, 0 delay 20 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 48, 12, 0, 4, 3, 1, 0 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 100, 16, 0, 3, 2, 0, 0 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 74, 24, 180, 3, 2, 0, 0 delay 10 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 80, 30, 0, 4, 1, 1, 0 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 128, 12, 0, 3, 3, 0, 0 createsprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 90, 16, 0, 2, 1, 0, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 0, 7, 0, RGB(13, 31, 12) delay 1 playsewithpan SE_M_STAT_INCREASE, SOUND_PAN_ATTACKER createvisualtask AnimTask_StatusClearedEffect, 2, 1 waitforvisualfinish playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER createsprite gSparklingStarsSpriteTemplate, ANIM_ATTACKER, 16, -15, 0, 0, 0, 32, 60, 1 delay 8 createsprite gSparklingStarsSpriteTemplate, ANIM_ATTACKER, 16, 12, -5, 0, 0, 32, 60, 1 waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_ANIM_1, 3, 10, 0, RGB(13, 31, 12) createsprite gBlendThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 16, 0, 0, 0, 1 waitforvisualfinish end Move_FAKE_TEARS: loadspritegfx ANIM_TAG_SMALL_BUBBLES loadspritegfx ANIM_TAG_THOUGHT_BUBBLE loadspritegfx ANIM_TAG_MUSIC_NOTES createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SMALL_BUBBLES, 0, 4, 4, RGB(12, 11, 31) waitforvisualfinish createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 1 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 12, 4 delay 8 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 1 delay 8 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 2 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 3 delay 8 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 1 delay 8 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 2 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 3 waitforvisualfinish end Move_AIR_CUTTER: loadspritegfx ANIM_TAG_AIR_WAVE loadspritegfx ANIM_TAG_CUT loadspritegfx ANIM_TAG_IMPACT delay 0 monbg ANIM_DEF_PARTNER setalpha 12, 8 delay 0 createvisualtask AnimTask_AirCutterProjectile, 2, 32, -24, 6 * 256, 2, 128 @ 6 * 256 == Q_8_8(6) waitforvisualfinish playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gAirCutterSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0, 2 delay 5 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 8, 1 waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER delay 0 end Move_ODOR_SLEUTH: monbg ANIM_TARGET createvisualtask AnimTask_OdorSleuthMovement, 5 delay 24 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER delay 6 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER waitforvisualfinish clearmonbg ANIM_TARGET delay 1 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_WHITEALPHA, 16, RGB_WHITEALPHA, 0 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER end Move_GRASS_WHISTLE: loadspritegfx ANIM_TAG_MUSIC_NOTES createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB(18, 31, 12) waitforvisualfinish createvisualtask AnimTask_MusicNotesRainbowBlend, 2 waitforvisualfinish panse SE_M_GRASSWHISTLE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 7, 1, 0 delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 1, 0 delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0 delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 0 delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 3, 1, 0 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 0 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 5, 1, 0 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 1, 0 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 0 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 0 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0 delay 4 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 5, 1, 0 delay 4 waitforvisualfinish createvisualtask AnimTask_MusicNotesClearRainbowBlend, 2 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB(18, 31, 12) waitforvisualfinish end Move_TICKLE: loadspritegfx ANIM_TAG_EYE_SPARKLE createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 0, 16, RGB_BLACK waitforvisualfinish createsprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, -16, -8 createsprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, 16, -8 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 16, 0, RGB_BLACK waitforvisualfinish delay 20 createvisualtask AnimTask_SwayMon, 3, 0, 6, 1280, 3, ANIM_ATTACKER delay 12 createvisualtask AnimTask_RockMonBackAndForth, 3, ANIM_TARGET, 6, 2 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET, 8, 8 waitforvisualfinish end Move_WATER_SPOUT: loadspritegfx ANIM_TAG_GLOWY_BLUE_ORB loadspritegfx ANIM_TAG_WATER_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 createvisualtask AnimTask_WaterSpoutLaunch, 5 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER delay 44 playsewithpan SE_M_DIVE, SOUND_PAN_ATTACKER waitforvisualfinish delay 16 createvisualtask AnimTask_WaterSpoutRain, 5 playsewithpan SE_M_SURF, SOUND_PAN_TARGET clearmonbg ANIM_DEF_PARTNER blendoff end Move_SHADOW_PUNCH: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET fadetobg BG_GHOST waitbgfadein monbg ANIM_ATK_PARTNER setalpha 9, 8 createvisualtask AnimTask_AttackerPunchWithTrace, 2, RGB_BLACK, 13 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff restorebg waitbgfadein end Move_EXTRASENSORY: call SetPsychicBackground monbg ANIM_DEF_PARTNER setalpha 12, 8 createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 createvisualtask AnimTask_ExtrasensoryDistortion, 5, 0 playsewithpan SE_M_BIND, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 createvisualtask AnimTask_ExtrasensoryDistortion, 5, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_TransparentCloneGrowAndShrink, 5, ANIM_ATTACKER createvisualtask AnimTask_ExtrasensoryDistortion, 5, 2 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER call UnsetPsychicBackground end Move_AERIAL_ACE: loadspritegfx ANIM_TAG_CUT monbg ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 3 createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_IRON_DEFENSE: loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 28, 2 createvisualtask AnimTask_MetallicShine, 5, 0, 0, 0 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 8, 2, RGB_WHITEALPHA, 14, RGB_WHITEALPHA, 0 waitforvisualfinish end Move_BLOCK: loadspritegfx ANIM_TAG_X_SIGN createsprite gBlockXSpriteTemplate, ANIM_TARGET, 66 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET end Move_HOWL: loadspritegfx ANIM_TAG_NOISE_LINE createvisualtask AnimTask_DeepInhale, 2, 0 delay 12 call RoarEffect createvisualtask SoundTask_PlayCryHighPitch, 2, ANIM_ATTACKER, 3 waitforvisualfinish delay 30 end Move_BULK_UP: loadspritegfx ANIM_TAG_BREATH createvisualtask AnimTask_GrowAndShrink, 2 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gBreathPuffSpriteTemplate, ANIM_ATTACKER, 2 loopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2 waitforvisualfinish end Move_COVET: loadspritegfx ANIM_TAG_MAGENTA_HEART loadspritegfx ANIM_TAG_ITEM_BAG createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0, 20 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER delay 15 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, -20, 20 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER delay 15 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 20, 20 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 loopsewithpan SE_M_DIZZY_PUNCH, SOUND_PAN_TARGET, 4, 3 end Move_VOLT_TACKLE: loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_ELECTRICITY monbg ANIM_ATTACKER setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 8, RGB_BLACK waitforvisualfinish createsprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff delay 8 createvisualtask AnimTask_VoltTackleBolt, 5, 0 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_VoltTackleBolt, 5, 1 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_VoltTackleBolt, 5, 2 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_VoltTackleBolt, 5, 3 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_VoltTackleBolt, 5, 4 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 1, 16, 16 delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, -16 delay 8 createvisualtask AnimTask_VoltTackleAttackerReappear, 5 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 16 delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, -16, -16 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 8, 0, RGB_BLACK waitforvisualfinish end Move_WATER_SPORT: loadspritegfx ANIM_TAG_GLOWY_BLUE_ORB createvisualtask AnimTask_WaterSport, 5 delay 8 playsewithpan SE_M_SURF, SOUND_PAN_ATTACKER delay 44 playsewithpan SE_M_SURF, SOUND_PAN_ATTACKER delay 44 playsewithpan SE_M_SURF, SOUND_PAN_ATTACKER delay 44 panse SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 end Move_CALM_MIND: loadspritegfx ANIM_TAG_THIN_RING monbg ANIM_ATK_PARTNER createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, ANIM_ATTACKER, 0, 0, 16, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_SetAllNonAttackersInvisiblity, 5, TRUE waitforvisualfinish createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER delay 14 createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER delay 14 createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_SetAllNonAttackersInvisiblity, 5, FALSE visible ANIM_ATTACKER @ Redundant waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, ANIM_ATTACKER, 0, 16, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATK_PARTNER end Move_LEAF_BLADE: loadspritegfx ANIM_TAG_LEAF loadspritegfx ANIM_TAG_CROSS_IMPACT createvisualtask AnimTask_LeafBlade, 5 delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 playsewithpan SE_M_CUT, SOUND_PAN_TARGET delay 50 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 playsewithpan SE_M_CUT, SOUND_PAN_TARGET delay 50 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 playsewithpan SE_M_CUT, SOUND_PAN_TARGET waitforvisualfinish monbg ANIM_TARGET setalpha 12, 8 delay 12 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 18, 1 createsprite gCrossImpactSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 36 playsewithpan SE_M_LEER, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_DRAGON_DANCE: loadspritegfx ANIM_TAG_HOLLOW_ORB monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER delay 1 createvisualtask AnimTask_DragonDanceWaver, 5 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER delay 8 createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB(0, 0, 19), 14, 0, 3 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 43 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 85 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 128 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 170 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 213 delay 30 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER delay 30 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 end Move_SHOCK_WAVE: loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_LIGHTNING monbg ANIM_ATTACKER setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 20, 0, 2 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 12 createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 delay 30 createvisualtask AnimTask_ShockWaveProgressingBolt, 5 delay 12 waitforvisualfinish createvisualtask AnimTask_ShockWaveLightning, 5 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 3, 16, 0, RGB_WHITE createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 16, 16, RGB_BLACK delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 0, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff end Move_HARDEN: loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 createvisualtask AnimTask_MetallicShine, 5, 0, 0, 0 waitforvisualfinish end Move_BELLY_DRUM: loadspritegfx ANIM_TAG_MUSIC_NOTES loadspritegfx ANIM_TAG_PURPLE_HAND_OUTLINE createvisualtask AnimTask_MusicNotesRainbowBlend, 2 waitforvisualfinish call BellyDrumRight createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER delay 15 call BellyDrumLeft createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 1, 0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER delay 15 call BellyDrumRight createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 3, 3, 128 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER delay 7 call BellyDrumLeft createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 1, 2, 0, 128 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER delay 7 call BellyDrumRight createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 1, 0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER delay 7 call BellyDrumLeft createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 3, 0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_MusicNotesClearRainbowBlend, 2 waitforvisualfinish end BellyDrumLeft: createsprite gBellyDrumHandSpriteTemplate, ANIM_ATTACKER, 3, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 8, 2, 1 return BellyDrumRight: createsprite gBellyDrumHandSpriteTemplate, ANIM_ATTACKER, 3, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 8, 2, 1 return Move_MIND_READER: loadspritegfx ANIM_TAG_TEAL_ALERT loadspritegfx ANIM_TAG_OPENING_EYE loadspritegfx ANIM_TAG_ROUND_WHITE_HALO monbg 4 playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET createsprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0, 0, 1, 0 createsprite gWhiteHaloSpriteTemplate, ANIM_ATTACKER, 5 delay 40 playsewithpan SE_M_LEER, SOUND_PAN_TARGET createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG, 1, 2, 0, 10, RGB_BLACK call MindReaderEyeSpikeEffect waitforvisualfinish clearmonbg 4 end MindReaderEyeSpikeEffect: createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 70, 0, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 40, 40, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 10, -60, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -50, -40, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -40, 40, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 50, -50, 6 delay 2 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 50, -30, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 60, 10, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0, 60, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0, -40, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -60, 20, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -60, -30, 6 delay 2 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -50, 50, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -60, 20, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -40, -40, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 20, -60, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 50, -50, 6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 35, 40, 6 delay 2 return Move_ICE_PUNCH: monbg ANIM_DEF_PARTNER setalpha 12, 8 loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(12, 26, 31) delay 20 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0 createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 64 createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 128 createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 192 delay 5 createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 32 createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 96 createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 160 createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 224 delay 17 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 4, 0, -10, 8, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -10, ANIM_TARGET, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 3, 1 waitforvisualfinish delay 15 call IceCrystalEffectShort delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(12, 26, 31) waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_REST: playsewithpan SE_M_SNORE, SOUND_PAN_ATTACKER loadspritegfx ANIM_TAG_LETTER_Z createsprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0 delay 20 createsprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0 delay 20 createsprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0 waitforvisualfinish end Move_CONFUSION: monbg ANIM_DEF_PARTNER call SetPsychicBackground setalpha 8, 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE waitforvisualfinish playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff delay 1 call UnsetPsychicBackground end Move_PSYCHIC: monbg ANIM_DEF_PARTNER call SetPsychicBackground setalpha 8, 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(31, 23, 0) waitforvisualfinish loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 5, -6, -6, 15, ANIM_TARGET, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff delay 1 call UnsetPsychicBackground end Move_FUTURE_SIGHT: goto FutureSight FutureSightContinue: waitforvisualfinish delay 1 call UnsetPsychicBackground end FutureSight: monbg ANIM_ATK_PARTNER playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER call SetPsychicBackground setalpha 8, 8 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_ATTACKER, 1 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff goto FutureSightContinue UnusedFutureSightHit: monbg ANIM_DEF_PARTNER playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER call SetPsychicBackground setalpha 8, 8 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET waitplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 8 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 15, ANIM_TARGET, 1 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 24, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff goto FutureSightContinue Move_THUNDER: loadspritegfx ANIM_TAG_LIGHTNING fadetobg BG_THUNDER waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, -256, 0, 1, -1 waitbgfadein createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK delay 16 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -36 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -20 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, 12 delay 20 createsprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, -32 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, -16 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 5 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, -32 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, -16 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, 16 delay 30 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 5 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 10 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 1 createvisualtask AnimTask_ShakeTargetInPattern, 2, 30, 3, TRUE, 0 delay 2 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_TARGET, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK waitforvisualfinish restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein end Move_THUNDER_PUNCH: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_LIGHTNING monbg ANIM_TARGET setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 delay 1 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, -16 delay 1 createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, 16 delay 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK delay 20 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_SACRED_FIRE: loadspritegfx ANIM_TAG_FIRE loadspritegfx ANIM_TAG_FIRE_PLUME loopsewithpan SE_M_SACRED_FIRE, SOUND_PAN_ATTACKER, 7, 5 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 50, 5, -2, 0 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, -20, -10, 50, 5, -1, -1 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 0, -16, 50, 5, 0, -1 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 20, -10, 50, 5, 1, -1 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 50, 5, 2, 0 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 20, 10, 50, 5, 1, 1 delay 1 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 50, 5, 0, 1 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -20, 10, 50, 5, -1, 1 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 1 waitforvisualfinish playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createsprite gLargeFlameSpriteTemplate, ANIM_TARGET, 2, -16, 0, 70, 16, 0, 1 delay 10 playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createsprite gLargeFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 70, 16, 0, 1 delay 10 playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createsprite gLargeFlameSpriteTemplate, ANIM_TARGET, 2, 16, 0, 80, 16, 0, 1 delay 1 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 1 waitforvisualfinish createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 0 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 0, 1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, -1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 2, 1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 1, -1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 1, -2 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 3, 1 waitforvisualfinish end Move_SCRATCH: loadspritegfx ANIM_TAG_SCRATCH monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET createsprite gScratchSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff waitforvisualfinish end Move_DRAGON_BREATH: loadspritegfx ANIM_TAG_SMALL_EMBER monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 7, 7 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 21, 1 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 delay 2 createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end Move_ROAR: loadspritegfx ANIM_TAG_NOISE_LINE monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER setalpha 8, 8 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_ROAR createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1 call RoarEffect delay 20 createvisualtask AnimTask_SlideOffScreen, 5, ANIM_TARGET, 2 waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff waitforvisualfinish createvisualtask SoundTask_WaitForCry, 5 waitforvisualfinish end RoarEffect: createsprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, -8, 0 createsprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 2 createsprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, 8, 1 delay 15 createsprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, -8, 0 createsprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 2 createsprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, 8, 1 return Move_GROWL: loadspritegfx ANIM_TAG_NOISE_LINE createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 9, 1 waitforvisualfinish createvisualtask SoundTask_WaitForCry, 5 waitforvisualfinish end Move_SNORE: loadspritegfx ANIM_TAG_SNORE_Z monbg ANIM_ATK_PARTNER setalpha 8, 8 call SnoreEffect delay 30 call SnoreEffect waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end SnoreEffect: playsewithpan SE_M_SNORE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 7, ANIM_ATTACKER, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 7, 1 createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, 14, 0, 0 createsprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -42, -38, 24, 0, 0 createsprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, -42, 24, 0, 0 createsprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 42, -38, 24, 0, 0 return Move_LIGHT_SCREEN: loadspritegfx ANIM_TAG_SPARKLE_3 loadspritegfx ANIM_TAG_GREEN_LIGHT_WALL setalpha 0, 16 waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 15 createsprite gLightScreenWallSpriteTemplate, ANIM_ATTACKER, 1, 40, 0, ANIM_TAG_GREEN_LIGHT_WALL delay 10 call SpecialScreenSparkle waitforvisualfinish delay 1 blendoff end SpecialScreenSparkle: createsprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 23, 0, ANIM_ATTACKER, TRUE delay 6 createsprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 31, -8, ANIM_ATTACKER, TRUE delay 5 createsprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 30, 20, ANIM_ATTACKER, TRUE delay 7 createsprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 10, -15, ANIM_ATTACKER, TRUE delay 6 createsprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 20, 10, ANIM_ATTACKER, TRUE delay 6 createsprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 10, 18, ANIM_ATTACKER, TRUE return Move_MIRROR_COAT: loadspritegfx ANIM_TAG_SPARKLE_3 loadspritegfx ANIM_TAG_RED_LIGHT_WALL setalpha 0, 16 createsprite gMirrorCoatWallSpriteTemplate, ANIM_ATTACKER, 1, 40, 0, ANIM_TAG_RED_LIGHT_WALL delay 10 playsewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER call SpecialScreenSparkle waitforvisualfinish delay 1 blendoff end Move_REFLECT: loadspritegfx ANIM_TAG_SPARKLE_4 loadspritegfx ANIM_TAG_BLUE_LIGHT_WALL setalpha 0, 16 waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 15 createsprite gReflectWallSpriteTemplate, ANIM_ATTACKER, 1, 40, 0, ANIM_TAG_BLUE_LIGHT_WALL delay 20 createsprite gReflectSparkleSpriteTemplate, ANIM_ATTACKER, 2, 30, 0, ANIM_ATTACKER, TRUE delay 7 createsprite gReflectSparkleSpriteTemplate, ANIM_ATTACKER, 2, 19, -12, ANIM_ATTACKER, TRUE delay 7 createsprite gReflectSparkleSpriteTemplate, ANIM_ATTACKER, 2, 10, 20, ANIM_ATTACKER, TRUE waitforvisualfinish delay 1 blendoff end Move_BARRIER: loadspritegfx ANIM_TAG_GRAY_LIGHT_WALL setalpha 0, 16 waitplaysewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER, 15 createsprite gBarrierWallSpriteTemplate, ANIM_ATTACKER, 3, 40, 0, ANIM_TAG_GRAY_LIGHT_WALL waitforvisualfinish delay 1 blendoff end Move_BUBBLE: loadspritegfx ANIM_TAG_BUBBLE loadspritegfx ANIM_TAG_SMALL_BUBBLES monbg ANIM_TARGET setalpha 12, 8 delay 1 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 15, -15, 10, 128, 100 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100 delay 6 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 35, 37, 40, 128, 100 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100 delay 6 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 10, -37, 30, 128, 100 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100 delay 6 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 30, 10, 15, 128, 100 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100 delay 6 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 20, 33, 20, 128, 100 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100 delay 6 createsprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 25, -30, 10, 128, 100 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100 waitforvisualfinish call WaterBubblesEffectLong waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_SMOG: loadspritegfx ANIM_TAG_PURPLE_GAS_CLOUD monbg ANIM_DEF_PARTNER splitbgprio_all setalpha 12, 8 loopsewithpan SE_M_MIST, SOUND_PAN_TARGET, 17, 10 call SmogCloud call SmogCloud call SmogCloud call SmogCloud call SmogCloud call SmogCloud call SmogCloud delay 120 loopsewithpan SE_M_TOXIC, SOUND_PAN_TARGET, 18, 2 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(26, 0, 26) delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end SmogCloud: createsprite gSmogCloudSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 48, 240, 1, 0 delay 7 return Move_FAINT_ATTACK: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_ATTACKER fadetobg BG_DARK waitbgfadein delay 0 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 createvisualtask AnimTask_AttackerFadeToInvisible, 2, 1 waitforvisualfinish clearmonbg ANIM_ATTACKER invisible ANIM_ATTACKER delay 1 createvisualtask AnimTask_SetAttackerInvisibleWaitForSignal, 2 monbg ANIM_TARGET setalpha 12, 8 delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 9, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff delay 1 setarg 7, 0x1000 delay 32 createvisualtask AnimTask_InitAttackerFadeFromInvisible, 2 monbg ANIM_ATTACKER createvisualtask AnimTask_AttackerFadeFromInvisible, 2, 1 waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 restorebg waitbgfadein end Move_SAND_ATTACK: loadspritegfx ANIM_TAG_MUD_SAND monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER setalpha 12, 8 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 0, 0, 3 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2 call SandAttackDirt call SandAttackDirt call SandAttackDirt call SandAttackDirt call SandAttackDirt call SandAttackDirt waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end SandAttackDirt: createsprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 0, 0 createsprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 10, 10 createsprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, -10, -10 createsprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 20, 5 createsprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, -20, -5 delay 2 return Move_MUD_SLAP: loadspritegfx ANIM_TAG_MUD_SAND playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 0, 0, 3 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2 call MudSlapMud call MudSlapMud call MudSlapMud call MudSlapMud call MudSlapMud call MudSlapMud waitforvisualfinish end MudSlapMud: createsprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 0, 0 createsprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 10, 5 createsprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, -10, -5 createsprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 20, 10 createsprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, -20, -10 delay 2 return Move_DRAGON_RAGE: loadspritegfx ANIM_TAG_SMALL_EMBER loadspritegfx ANIM_TAG_FIRE_PLUME playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, 0, 15, 0, 0, 4 waitforvisualfinish createsprite gDragonRageFireSpitSpriteTemplate, ANIM_TARGET, 2, 30, 15, 0, 10, 10 waitforvisualfinish loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET, 11, 3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 delay 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -10, -15 delay 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 25 delay 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 15, 5 delay 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -25, 0 delay 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 30, 30 delay 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, -27, 25 delay 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 0, 8 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0, 0, 4 waitforvisualfinish end Move_RAIN_DANCE: loadspritegfx ANIM_TAG_RAIN_DROPS playsewithpan SE_M_RAIN_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 2, 0, 4, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_CreateRaindrops, 2, 0, 3, 120 createvisualtask AnimTask_CreateRaindrops, 2, 0, 3, 120 delay 120 delay 30 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 2, 4, 0, RGB_BLACK waitforvisualfinish end Move_BITE: loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff delay 1 end Move_CRUNCH: loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET fadetobg BG_DARK waitbgfadein setalpha 12, 8 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, -32, -32, 1, 819, 819, 10 createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 32, 32, 5, -819, -819, 10 delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 waitforvisualfinish playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 32, -32, 7, -819, 819, 10 createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, -32, 32, 3, 819, -819, 10 delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 waitforvisualfinish clearmonbg ANIM_TARGET blendoff delay 1 restorebg waitbgfadein end Move_CLAMP: loadspritegfx ANIM_TAG_CLAMP loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 2, 819, 0, 10 createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10 delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff waitforvisualfinish end Move_ICE_BEAM: monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 loadspritegfx ANIM_TAG_ICE_CRYSTALS createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK waitforvisualfinish createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_BUBBLE_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 4, 4, 0, 10 createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 12, 0, 12, 20 createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, -12, 0, -12, 20 delay 1 call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, -31, 0, 7, RGB(0, 20, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1 call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 11 delay 1 createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 11 waitforvisualfinish delay 20 call IceCrystalEffectShort createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff end IceBeamCreateCrystals: createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 12, 0, 12, 20 createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, -12, 0, -12, 20 createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 11 delay 1 return Move_WITHDRAW: playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER createvisualtask AnimTask_Withdraw, 5 waitforvisualfinish end Move_AURORA_BEAM: loadspritegfx ANIM_TAG_RAINBOW_RINGS fadetobg BG_AURORA waitbgfadein playsewithpan SE_M_BUBBLE_BEAM, SOUND_PAN_ATTACKER setarg 7, 0 createvisualtask AnimTask_RotateAuroraRingColors, 10, 130 call AuroraBeamCreateRings createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 1, 0, 17, 1 call AuroraBeamCreateRings call AuroraBeamCreateRings call AuroraBeamCreateRings setarg 7, 0xFFFF createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_BUBBLE_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 6, 0, 10 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 40, 1 call AuroraBeamCreateRings call AuroraBeamCreateRings call AuroraBeamCreateRings call AuroraBeamCreateRings call AuroraBeamCreateRings call AuroraBeamCreateRings waitforvisualfinish restorebg waitbgfadein end AuroraBeamCreateRings: createsprite gAuroraBeamRingSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 17 delay 1 createsprite gAuroraBeamRingSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 17 delay 1 createsprite gAuroraBeamRingSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 17 delay 1 createsprite gAuroraBeamRingSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 17 delay 1 return Move_SOLAR_BEAM: loadspritegfx ANIM_TAG_ORBS choosetwoturnanim SolarBeamSetUp, SolarBeamUnleash SolarBeamEnd: waitforvisualfinish end SolarBeamSetUp: monbg ANIM_ATK_PARTNER setalpha 12, 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 1, 4, 0, 11, RGB(31, 31, 11) playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call SolarBeamAbsorbEffect waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff goto SolarBeamEnd SolarBeamAbsorbEffect: createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, 40, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, -40, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 40, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, -40, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, -20, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, 20, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, -20, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, 20, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -20, 30, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 20, -30, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -20, -30, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 20, 30, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, 0, 16 delay 2 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, 0, 16 delay 2 return SolarBeamUnleash: call SetSolarBeamBg panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 createvisualtask AnimTask_CreateSmallSolarBeamOrbs, 5 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 delay 4 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 10, RGB(25, 31, 0) createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 delay 4 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 65, 1 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 delay 4 call SolarBeamUnleash1 call SolarBeamUnleash1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 10, 0, RGB(25, 31, 0) call UnsetSolarBeamBg goto SolarBeamEnd SolarBeamUnleash1: createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5 delay 4 createsprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6 delay 4 return Move_BLIZZARD: loadspritegfx ANIM_TAG_ICE_CRYSTALS monbg ANIM_DEF_PARTNER createvisualtask AnimTask_GetAttackerSide, 2 jumprettrue BlizzardAgainstPlayer fadetobg BG_HIGHSPEED_OPPONENT BlizzardContinue: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1 waitbgfadein waitforvisualfinish panse SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call BlizzardIceCrystals call BlizzardIceCrystals playsewithpan SE_M_BLIZZARD2, SOUND_PAN_TARGET waitforvisualfinish call IceCrystalEffectLong waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 20 restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein end BlizzardIceCrystals: createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -10, 0, -10, 72, 1 createsprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0, 80, 0, 0, 1 delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -15, 0, -15, 72, 1 createsprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, -10, 0, -10, 80, 0, 0, 1 delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -5, 0, -5, 72, 1 createsprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, 10, 0, 10, 80, 0, 0, 1 delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -10, 0, -10, 72, 1 createsprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 80, 0, 0, 1 delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 72, 1 createsprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, 15, 0, 15, 80, 0, 0, 1 delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -15, 0, -15, 72, 1 createsprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 80, 0, 0, 1 delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -25, 0, -25, 72, 1 createsprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, 20, 0, 20, 80, 0, 0, 1 delay 3 return BlizzardAgainstPlayer: fadetobg BG_HIGHSPEED_PLAYER goto BlizzardContinue Move_POWDER_SNOW: loadspritegfx ANIM_TAG_ICE_CRYSTALS monbg ANIM_DEF_PARTNER createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 0, 3, RGB_BLACK waitforvisualfinish panse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call PowderSnowSnowballs call PowderSnowSnowballs playsewithpan SE_M_GUST2, SOUND_PAN_TARGET waitforvisualfinish waitsound call IceCrystalEffectLong waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 20 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 3, 0, RGB_BLACK end PowderSnowSnowballs: createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0, 56, 4, 4, 1 delay 3 createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -10, 0, -10, 56, 4, 4, 1 delay 3 createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, 10, 0, 10, 56, -4, 3, 1 delay 3 createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 56, -4, 5, 1 delay 3 createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, 15, 0, 15, 56, 4, 4, 1 delay 3 createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 56, 4, 4, 1 delay 3 createsprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, 20, 0, 20, 56, 4, 4, 1 delay 3 return Move_HYDRO_PUMP: loadspritegfx ANIM_TAG_WATER_ORB loadspritegfx ANIM_TAG_WATER_IMPACT monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1 delay 6 panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 createvisualtask AnimTask_StartSinAnimTimer, 5, 100 call HydroPumpBeams call HydroPumpBeams call HydroPumpBeams createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1 call HydroPumpHitSplats call HydroPumpBeams call HydroPumpBeams call HydroPumpHitSplats call HydroPumpBeams call HydroPumpBeams call HydroPumpHitSplats call HydroPumpBeams call HydroPumpBeams call HydroPumpHitSplats call HydroPumpBeams call HydroPumpBeams call HydroPumpHitSplats delay 1 delay 1 call HydroPumpHitSplats waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end HydroPumpBeams: createsprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16 createsprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, -16 delay 1 createsprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16 createsprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, -16 delay 1 return HydroPumpHitSplats : createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 15, ANIM_TARGET, 1 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, -15, ANIM_TARGET, 1 return Move_SIGNAL_BEAM: loadspritegfx ANIM_TAG_GLOWY_RED_ORB loadspritegfx ANIM_TAG_GLOWY_GREEN_ORB loadspritegfx ANIM_TAG_DUCK createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 25, 1 delay 6 panse SE_M_BUBBLE_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0 createvisualtask AnimTask_StartSinAnimTimer, 5, 100 call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 25, 1 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 8, 5, RGB_RED, 8, RGB(1, 30, 0), 8 call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs call SignalBeamOrbs waitforvisualfinish end SignalBeamOrbs: createsprite gSignalBeamRedOrbSpriteTemplate, ANIM_TARGET, 3, 10, 10, 0, 16 createsprite gSignalBeamGreenOrbSpriteTemplate, ANIM_TARGET, 3, 10, 10, 0, -16 delay 1 return Move_ABSORB: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_BLUE_STAR loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 4, RGB(13, 31, 12) waitforvisualfinish playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 waitforvisualfinish delay 3 call AbsorbEffect waitforvisualfinish delay 15 call HealingEffect waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 4, 0, RGB(13, 31, 12) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end AbsorbEffect: playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 delay 4 return Move_MEGA_DRAIN: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_BLUE_STAR loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 8, RGB(13, 31, 12) waitforvisualfinish playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 waitforvisualfinish delay 3 call MegaDrainAbsorbEffect waitforvisualfinish delay 15 call HealingEffect waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 8, 0, RGB(13, 31, 12) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end MegaDrainAbsorbEffect: playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 delay 4 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 delay 4 return Move_GIGA_DRAIN: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_BLUE_STAR loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 12, RGB(13, 31, 12) waitforvisualfinish playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 waitforvisualfinish delay 3 call GigaDrainAbsorbEffect waitforvisualfinish delay 15 call HealingEffect waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 12, 0, RGB(13, 31, 12) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end GigaDrainAbsorbEffect: playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -40, 35 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 28, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 40, 39 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -32, 26 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -40, 26 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 36, 33 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 delay 4 return Move_LEECH_LIFE: loadspritegfx ANIM_TAG_NEEDLE loadspritegfx ANIM_TAG_ORBS delay 1 loadspritegfx ANIM_TAG_BLUE_STAR loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET setalpha 12, 8 delay 1 createsprite gLeechLifeNeedleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 12 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK waitforvisualfinish call AbsorbEffect waitforvisualfinish delay 15 call HealingEffect waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 7, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_SYNTHESIS: loadspritegfx ANIM_TAG_BLUE_STAR loadspritegfx ANIM_TAG_SPARKLE_2 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 16, RGB(27, 31, 18) playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call GrantingStarsEffect waitforvisualfinish call HealingEffect waitforvisualfinish end Move_TOXIC: loadspritegfx ANIM_TAG_TOXIC_BUBBLE loadspritegfx ANIM_TAG_POISON_BUBBLE call ToxicBubbles call ToxicBubbles waitforvisualfinish delay 15 call PoisonBubblesEffect waitforvisualfinish end ToxicBubbles: createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, -24, 16, 1, 1 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET delay 15 createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 8, 16, 1, 1 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET delay 15 createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, -8, 16, 1, 1 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET delay 15 createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 24, 16, 1, 1 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET delay 15 return Move_SLUDGE: loadspritegfx ANIM_TAG_POISON_BUBBLE playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER createsprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 0 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 12, RGB(30, 0, 31) call PoisonBubblesEffect waitforvisualfinish end Move_SLUDGE_BOMB: loadspritegfx ANIM_TAG_POISON_BUBBLE call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 3, 0, 15, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 12, RGB(30, 0, 31) createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 playsewithpan SE_M_DIG, SOUND_PAN_TARGET delay 5 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 0, 40, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -8, -44, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -46, -28, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 46, 9, 20 playsewithpan SE_M_DIG, SOUND_PAN_TARGET delay 5 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 0, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -43, -12, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 16, -46, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -16, 44, 20 playsewithpan SE_M_DIG, SOUND_PAN_TARGET delay 0 waitsound waitforvisualfinish call PoisonBubblesEffect waitforvisualfinish end SludgeBombProjectile: playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER createsprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 0 delay 3 return Move_ACID: loadspritegfx ANIM_TAG_POISON_BUBBLE monbg ANIM_DEF_PARTNER createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 0, 0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 24, 0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, -24, 0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 15 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_DEF_PARTNER, 2, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 2, 2, 0, 12, RGB(30, 0, 31) createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -22, 0, 15, 55 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, -26, -24, 0, 15, 55 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 15, -27, 0, 15, 50 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, -15, -17, 0, 10, 45 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 27, -22, 0, 15, 50 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end Move_BONEMERANG: loadspritegfx ANIM_TAG_BONE loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_BONEMERANG, SOUND_PAN_ATTACKER createsprite gBonemerangSpriteTemplate, ANIM_ATTACKER, 2 delay 20 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 5, 1 delay 17 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, -4 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_BONE_CLUB: loadspritegfx ANIM_TAG_BONE loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET createsprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, -42, -25, 0, 0, 15 delay 12 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 5, 1, RGB_BLACK, 10, RGB_BLACK, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_BONE_RUSH: loadspritegfx ANIM_TAG_BONE loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET createsprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, -42, -25, 0, 0, 15 delay 12 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 5, 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_SPIKES: loadspritegfx ANIM_TAG_SPIKES monbg ANIM_DEF_PARTNER playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28 createsprite gSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 24, 30 delay 10 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28 createsprite gSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, -24, 24, 30 delay 10 waitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28 createsprite gSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, 24, 24, 30 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end Move_MEGAHORN: loadspritegfx ANIM_TAG_HORN_HIT_2 loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER jumpifcontest MegahornInContest fadetobg BG_DRILL waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, -2304, 768, 1, -1 MegahornContinue: waitbgfadein setalpha 12, 8 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1 waitforvisualfinish delay 10 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 6 delay 3 createsprite gMegahornHornSpriteTemplate, ANIM_ATTACKER, 3, -42, 25, 0, 0, 6 delay 4 playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, 4, 1, 4 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, -4, 1, 12, 1 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11 delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 waitforvisualfinish waitforvisualfinish @ Redundant clearmonbg ANIM_DEF_PARTNER blendoff restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein end MegahornInContest: fadetobg BG_DRILL_CONTESTS waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, 2304, 768, 0, -1 goto MegahornContinue Move_GUST: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_GUST, SOUND_PAN_TARGET createsprite gEllipticalGustSpriteTemplate, ANIM_ATTACKER, 2, 0, -16 createvisualtask AnimTask_AnimateGustTornadoPalette, 5, 1, 70 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 1, 0, 7, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 playsewithpan SE_M_GUST2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_WING_ATTACK: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 loopsewithpan SE_M_WING_ATTACK, SOUND_PAN_ATTACKER, 20, 2 createvisualtask AnimTask_TranslateMonElliptical, 2, 0, 12, 4, 1, 4 createvisualtask AnimTask_AnimateGustTornadoPalette, 5, 1, 70 createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, -25, 0, 0, 0, 20 createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 25, 0, 0, 0, 20 delay 24 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 9 delay 17 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, ANIM_TARGET, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, ANIM_TARGET, 1 loopsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET, 5, 2 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_PECK: loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createvisualtask AnimTask_RotateMonToSideAndRestore, 2, 3, -768, ANIM_TARGET, 2 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 0, ANIM_TARGET, 3 waitforvisualfinish end Move_AEROBLAST: loadspritegfx ANIM_TAG_AIR_WAVE_2 loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER call SetSkyBg splitbgprio ANIM_TARGET setalpha 12, 8 call AeroblastBeam createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 50, 1 call AeroblastBeam call AeroblastBeam call AeroblastBeam call AeroblastBeam waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff delay 0 call UnsetSkyBg end AeroblastBeam: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 0, 0 createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 0, 0 delay 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 1, 0 createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 1, 0 delay 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 2, 0 createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 2, 0 delay 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 3, 0 createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 3, 0 delay 3 return Move_WATER_GUN: loadspritegfx ANIM_TAG_SMALL_BUBBLES loadspritegfx ANIM_TAG_WATER_IMPACT monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 createsprite gWaterGunProjectileSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 40, -25 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 1, 0, 8, 1 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 2 createsprite gWaterGunDropletSpriteTemplate, ANIM_ATTACKER, 2, 0, -15, 0, 15, 55 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET delay 10 createsprite gWaterGunDropletSpriteTemplate, ANIM_ATTACKER, 2, 15, -20, 0, 15, 50 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET delay 10 createsprite gWaterGunDropletSpriteTemplate, ANIM_ATTACKER, 2, -15, -10, 0, 10, 45 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_CRABHAMMER: loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_WATER_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB(13, 21, 31), 10, RGB_BLACK, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -24, 0, 0, 4 waitforvisualfinish delay 8 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 4 waitforvisualfinish loopsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET, 20, 3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 8, 1 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 20, ANIM_TARGET delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 20, ANIM_TARGET delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -15, 15, 20, ANIM_TARGET delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, ANIM_TARGET delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -10, -20, 20, ANIM_TARGET delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 20, ANIM_TARGET delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 5, 8, 20, ANIM_TARGET delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, 20, ANIM_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_SURF: createvisualtask AnimTask_CreateSurfWave, 2, FALSE delay 24 panse SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 waitforvisualfinish end Move_FLAMETHROWER: loadspritegfx ANIM_TAG_SMALL_EMBER monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 delay 6 createvisualtask AnimTask_StartSinAnimTimer, 5, 100 panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call FlamethrowerCreateFlames call FlamethrowerCreateFlames call FlamethrowerCreateFlames createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 call FlamethrowerCreateFlames call FlamethrowerCreateFlames call FlamethrowerCreateFlames call FlamethrowerCreateFlames call FlamethrowerCreateFlames call FlamethrowerCreateFlames call FlamethrowerCreateFlames call FlamethrowerCreateFlames waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end FlamethrowerCreateFlames: createsprite gFlamethrowerFlameSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16 delay 2 createsprite gFlamethrowerFlameSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16 delay 2 return @ Also used by Sandstorm weather Move_SANDSTORM: loadspritegfx ANIM_TAG_FLYING_DIRT playsewithpan SE_M_SANDSTORM, 0 createvisualtask AnimTask_LoadSandstormBackground, 5, FALSE delay 16 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 0 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 0 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 0 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 0 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 0 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 0 delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 0 end Move_WHIRLPOOL: loadspritegfx ANIM_TAG_WATER_ORB monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 delay 0 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(0, 13, 23) playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1 call WhirlpoolEffect call WhirlpoolEffect call WhirlpoolEffect delay 12 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(0, 13, 23) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end WhirlpoolEffect: createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 28, 384, 50, 8, 50, ANIM_TARGET delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 32, 240, 40, 11, -46, ANIM_TARGET delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 33, 416, 40, 4, 42, ANIM_TARGET delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 31, 288, 45, 6, -42, ANIM_TARGET delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 28, 448, 45, 11, 46, ANIM_TARGET delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 50, 10, -50, ANIM_TARGET delay 2 return Move_FLY: loadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_IMPACT choosetwoturnanim FlySetUp, FlyUnleash FlyEnd: waitforvisualfinish end FlySetUp: playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 goto FlyEnd FlyUnleash: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gFlyBallAttackSpriteTemplate, ANIM_ATTACKER, 2, 20 delay 20 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff goto FlyEnd Move_BOUNCE: loadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_IMPACT choosetwoturnanim BounceSetUp, BounceUnleash BounceEnd: end BounceSetUp: playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER createsprite gBounceBallShrinkSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 goto BounceEnd BounceUnleash: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 delay 7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff goto BounceEnd Move_KARATE_CHOP: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, 0, 0, 10, 1, 3, 0 waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_CROSS_CHOP: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_CROSS_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gCrossChopHandSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0 createsprite gCrossChopHandSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1 delay 40 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 10, RGB_BLACK, 10 createsprite gCrossImpactSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 20 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_JUMP_KICK: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 3 createsprite gJumpKickSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 0, 0, 10, ANIM_TARGET, 1, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 7, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_HI_JUMP_KICK: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 0, 0, 8 waitforvisualfinish delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 3 delay 2 createsprite gJumpKickSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 0, 0, 10, ANIM_TARGET, 1, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 delay 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 11, 1 waitforvisualfinish delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_DOUBLE_KICK: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 createsprite gFistFootRandomPosSpriteTemplate, ANIM_ATTACKER, 3, 1, 20, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish waitforvisualfinish @ Redundant clearmonbg ANIM_DEF_PARTNER blendoff end Move_TRIPLE_KICK: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET jumpifmoveturn 0, TripleKickLeft jumpifmoveturn 1, TripleKickRight goto TripleKickCenter TripleKickContinue: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end TripleKickLeft: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, -16, -8, 20, 1, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -16, -16, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 goto TripleKickContinue TripleKickRight: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 8, 8, 20, 1, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 goto TripleKickContinue TripleKickCenter: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 20, 1, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -8, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 goto TripleKickContinue Move_DYNAMIC_PUNCH: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_EXPLOSION loadspritegfx ANIM_TAG_EXPLOSION_6 delay 1 monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 20, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 7, 1 delay 1 waitsound playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 5, 0, 28, 1 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_COUNTER: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_DEF_PARTNER setalpha 12, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 4 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -15, 18, ANIM_TARGET, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 25, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -15, 18, 8, 1, 0 delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, -4, ANIM_TARGET, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0, -4, 8, 1, 0 delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 15, 9, ANIM_TARGET, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 15, 9, 8, 1, 0 delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_VITAL_THROW: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 2 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -24, 0, 0, 4 waitforvisualfinish delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 delay 11 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 10 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_ROCK_SMASH: loadspritegfx ANIM_TAG_ROCKS loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_DEF_PARTNER setalpha 12, 8 delay 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 8, 1, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, 24, 14, 2 createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 5, 0, -20, 24, 14, 1 createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 5, 20, -24, 14, 2 createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, -5, 0, -20, -24, 14, 2 createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 30, 18, 8, 2 createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 30, -18, 8, 2 createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -30, 18, 8, 2 createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -30, -18, 8, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_SUBMISSION: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 10 waitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 20 waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 30 waitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 40 waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 50 waitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 60 waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 70 waitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 80 waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 90 createvisualtask AnimTask_TranslateMonElliptical, 2, 0, -18, 6, 6, 4 createvisualtask AnimTask_TranslateMonElliptical, 2, 1, 18, 6, 6, 4 call SubmissionHit call SubmissionHit call SubmissionHit waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end SubmissionHit: createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -12, ANIM_TARGET, 1 delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -12, 8, ANIM_TARGET, 1 delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 12, 0, ANIM_TARGET, 1 delay 8 return @ Also used by Sunny weather Move_SUNNY_DAY: loadspritegfx ANIM_TAG_SUNLIGHT monbg ANIM_ATK_PARTNER setalpha 13, 3 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 1, 0, 6, RGB_WHITE waitforvisualfinish panse_adjustnone SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0 call SunnyDayLightRay call SunnyDayLightRay call SunnyDayLightRay call SunnyDayLightRay waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 1, 6, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end SunnyDayLightRay: createsprite gSunlightRaySpriteTemplate, ANIM_ATTACKER, 40 delay 6 return Move_COTTON_SPORE: loadspritegfx ANIM_TAG_SPORE monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 18, 10 call CreateCottonSpores call CreateCottonSpores call CreateCottonSpores waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end CreateCottonSpores: createsprite gSporeParticleSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, 85, 80, 0 delay 12 createsprite gSporeParticleSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 170, 80, 0 delay 12 createsprite gSporeParticleSpriteTemplate, ANIM_ATTACKER, 2, 0, -15, 0, 80, 0 delay 12 return Move_SPORE: loadspritegfx ANIM_TAG_SPORE monbg ANIM_DEF_PARTNER setalpha 12, 8 createvisualtask AnimTask_SporeDoubleBattle, 2 loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 16, 11 call CreateSpore call CreateSpore call CreateSpore waitforvisualfinish delay 1 clearmonbg ANIM_DEF_PARTNER blendoff end CreateSpore: createsprite gSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -20, 85, 80, 1 delay 12 createsprite gSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -10, 170, 80, 1 delay 12 createsprite gSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -15, 0, 80, 1 delay 12 return Move_PETAL_DANCE: loadspritegfx ANIM_TAG_FLOWER loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 6, 3 createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 8, 140 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 16, -24, 8, 100 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -16, -24, 8, 100 delay 15 createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 8, 140 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 32, -24, 8, 100 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -32, -24, 8, 100 delay 15 createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 8, 140 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 24, -24, 8, 100 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -24, -24, 8, 100 delay 30 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 16, -24, 0, 100 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -16, -24, 0, 100 delay 30 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 20, -16, 14, 80 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -20, -14, 16, 80 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 5 delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1 waitforvisualfinish delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_RAZOR_LEAF: loadspritegfx ANIM_TAG_LEAF loadspritegfx ANIM_TAG_RAZOR_LEAF loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 delay 1 loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER, 10, 5 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -2, 10 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -1, 15 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -4, -4, 7 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, -3, 11 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -6, 8 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -1, 12 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -4, 13 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -5, 7 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -6, 11 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -5, 8 delay 60 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, 20, 1 createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, -20, 1 delay 20 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 8, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_NATURE_POWER: @ No actual animation, uses the animation of a move from gNaturePowerMoves instead Move_ANCIENT_POWER: loadspritegfx ANIM_TAG_ROCKS loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 10, 1 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 20, 32, -48, 50, 2 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, -38, 25, 5 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 32, 32, -28, 40, 3 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, -20, 32, -48, 50, 2 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 20, 32, -28, 60, 1 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, -28, 30, 4 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 30, 1 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER delay 10 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 15, 32, -48, 25, 5 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, -10, 32, -42, 30, 4 delay 10 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, -42, 25, 5 createsprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, -25, 32, -48, 30, 4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 0, 0, 4 delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_OCTAZOOKA: loadspritegfx ANIM_TAG_GRAY_SMOKE loadspritegfx ANIM_TAG_BLACK_BALL playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_ATTACKER createsprite gOctazookaBallSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 20, 0 waitforvisualfinish playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, 8, 1, 0 delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, -8, -8, 1, 0 delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, -8, 1, 0 delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, -8, 8, 1, 0 waitforvisualfinish end Move_MIST: loadspritegfx ANIM_TAG_MIST_CLOUD monbg ANIM_ATK_PARTNER setalpha 12, 8 loopsewithpan SE_M_MIST, SOUND_PAN_ATTACKER, 20, 15 call MistCloud call MistCloud call MistCloud call MistCloud call MistCloud call MistCloud call MistCloud delay 32 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATK_SIDE, 8, 2, 0, 14, RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end MistCloud: createsprite gMistCloudSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 48, 240, 0, 1 delay 7 return Move_HAZE: waitforvisualfinish playsewithpan SE_M_HAZE, 0 createvisualtask AnimTask_HazeScrollingFog, 5 delay 30 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 16, RGB_BLACK delay 90 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 1, 16, 0, RGB_BLACK end Move_FIRE_PUNCH: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_SMALL_EMBER loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_RED createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 0 createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 64 createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 128 createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 196 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET waitforvisualfinish createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 8, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 call FireSpreadEffect delay 4 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 9, 0, RGB_RED waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end FireSpreadEffect: createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 192, 176, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -192, 240, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 192, -160, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -192, -112, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 160, 48, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -224, -32, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40 return Move_LEER: loadspritegfx ANIM_TAG_LEER monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER setalpha 8, 8 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 24, -12 createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1 waitforvisualfinish delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 9, 1 waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff delay 1 waitforvisualfinish end Move_DREAM_EATER: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_BLUE_STAR monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER call SetPsychicBackground setalpha 8, 8 playsewithpan SE_M_MINIMIZE, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 5, -6, -6, 15, ANIM_TARGET, 1 waitforvisualfinish setalpha 12, 8 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 2, 25, 1 call DreamEaterAbsorb waitforvisualfinish delay 15 call HealingEffect waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff delay 1 call UnsetPsychicBackground end DreamEaterAbsorb: playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -40, 35 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 28, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 40, 39 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -32, 26 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -40, 26 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 36, 33 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26 createsprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35 delay 4 return Move_POISON_GAS: loadspritegfx ANIM_TAG_PURPLE_GAS_CLOUD loadspritegfx ANIM_TAG_POISON_BUBBLE delay 0 monbg ANIM_DEF_PARTNER splitbgprio_all setalpha 12, 8 delay 0 playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER createsprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0 delay 4 playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER createsprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0 delay 4 playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER createsprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0 delay 4 playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER createsprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0 delay 4 playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER createsprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0 delay 4 playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER createsprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0 delay 40 loopsewithpan SE_M_MIST, SOUND_PAN_TARGET, 28, 6 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 6, 2, 0, 12, RGB(26, 0, 26) waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER delay 0 end Move_BIND: createvisualtask AnimTask_SwayMon, 5, 0, 6, 3328, 4, ANIM_ATTACKER goto BindWrap BindWrap: playsewithpan SE_M_BIND, SOUND_PAN_TARGET call BindWrapSqueezeTarget call BindWrapSqueezeTarget waitforvisualfinish end BindWrapSqueezeTarget: createvisualtask AnimTask_ScaleMonAndRestore, 5, 10, -5, 5, ANIM_TARGET, 0 delay 16 return Move_WRAP: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 6, 4, 2, 4 goto BindWrap Move_PSYBEAM: loadspritegfx ANIM_TAG_GOLD_RING playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER call SetPsychicBackground createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 4, 0, 15 call PsybeamRings call PsybeamRings createvisualtask AnimTask_SwayMon, 5, 0, 6, 2048, 4, ANIM_TARGET createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 18, 31) call PsybeamRings call PsybeamRings call PsybeamRings call PsybeamRings call PsybeamRings call PsybeamRings call PsybeamRings call PsybeamRings call PsybeamRings waitforvisualfinish delay 1 call UnsetPsychicBackground end PsybeamRings: createsprite gGoldRingSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 13, 0 delay 4 return Move_HYPNOSIS: loadspritegfx ANIM_TAG_GOLD_RING call SetPsychicBackground call HypnosisRings call HypnosisRings call HypnosisRings createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 18, 31) waitforvisualfinish delay 1 call UnsetPsychicBackground end HypnosisRings: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER createsprite gGoldRingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 0, 8, 27, 0 createsprite gGoldRingSpriteTemplate, ANIM_TARGET, 2, 16, -8, 0, -8, 27, 0 delay 6 return Move_PSYWAVE: loadspritegfx ANIM_TAG_BLUE_RING playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER call SetPsychicBackground createvisualtask AnimTask_StartSinAnimTimer, 5, 100 createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_TELEPORT, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 9, 0, 10 call PsywaveRings call PsywaveRings createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 4, 0, 12, RGB(31, 18, 31) call PsywaveRings call PsywaveRings call PsywaveRings call PsywaveRings waitforvisualfinish delay 1 call UnsetPsychicBackground end PsywaveRings: createsprite gPsywaveRingSpriteTemplate, ANIM_TARGET, 3, 10, 10, 0, 16 delay 4 createsprite gPsywaveRingSpriteTemplate, ANIM_TARGET, 3, 10, 10, 0, 16 delay 4 return Move_ZAP_CANNON: loadspritegfx ANIM_TAG_BLACK_BALL_2 loadspritegfx ANIM_TAG_SPARK_2 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER createsprite gZapCannonBallSpriteTemplate, ANIM_TARGET, 3, 10, 0, 0, 0, 30, 0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 64, 40, 1 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 128, 40, 0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 192, 40, 2 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 32, 40, 0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 96, 40, 1 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 160, 40, 0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 224, 40, 2 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 delay 15 waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 19 call ElectricityEffect waitforvisualfinish end Move_STEEL_WING: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_IMPACT loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 createvisualtask AnimTask_MetallicShine, 5, 0, 0, 0 waitforvisualfinish monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 loopsewithpan SE_M_WING_ATTACK, SOUND_PAN_ATTACKER, 20, 2 createvisualtask AnimTask_TranslateMonElliptical, 2, 0, 12, 4, 1, 4 createvisualtask AnimTask_AnimateGustTornadoPalette, 5, 1, 70 createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, -25, 0, 0, 0, 20 createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 25, 0, 0, 0, 20 delay 24 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 9 delay 17 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, ANIM_TARGET, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, ANIM_TARGET, 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_IRON_TAIL: loadspritegfx ANIM_TAG_IMPACT loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 createvisualtask AnimTask_MetallicShine, 5, 1, 0, 0 waitforvisualfinish monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 1 clearmonbg ANIM_TARGET blendoff waitforvisualfinish end Move_POISON_TAIL: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_POISON_BUBBLE loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 createvisualtask AnimTask_MetallicShine, 5, 1, 1, RGB(24, 6, 23) waitforvisualfinish monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 1 clearmonbg ANIM_TARGET blendoff call PoisonBubblesEffect waitforvisualfinish end Move_METAL_CLAW: loadspritegfx ANIM_TAG_CLAW_SLASH loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 createvisualtask AnimTask_MetallicShine, 5, 0, 0, 0 waitforvisualfinish createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1 delay 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1 createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1 waitforvisualfinish end Move_NIGHT_SHADE: monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER fadetobg BG_GHOST waitbgfadein delay 10 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createvisualtask AnimTask_NightShadeClone, 5, 85 delay 70 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 0, 2, 0, 13, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 restorebg waitbgfadein end Move_EGG_BOMB: loadspritegfx ANIM_TAG_EXPLOSION loadspritegfx ANIM_TAG_LARGE_FRESH_EGG playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER createsprite gEggThrowSpriteTemplate, ANIM_TARGET, 2, 10, 0, 0, 0, 25, -32 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 16, 1 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET delay 3 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 1, 0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET delay 3 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 1, 0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET delay 3 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 1, 0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET delay 3 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET delay 3 waitforvisualfinish end Move_SHADOW_BALL: loadspritegfx ANIM_TAG_SHADOW_BALL fadetobg BG_GHOST waitbgfadein delay 15 createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_MIST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 5, 0, 5 createsprite gShadowBallSpriteTemplate, ANIM_TARGET, 2, 16, 16, 8 waitforvisualfinish playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1 waitforvisualfinish restorebg waitbgfadein end Move_LICK: loadspritegfx ANIM_TAG_LICK delay 15 playsewithpan SE_M_LICK, SOUND_PAN_TARGET createsprite gLickSpriteTemplate, ANIM_TARGET, 2, 0, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 16, 1 waitforvisualfinish end Move_FOCUS_ENERGY: loadspritegfx ANIM_TAG_FOCUS_ENERGY playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_WHITE createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 8 call EndureEffect waitforvisualfinish end Move_BIDE: choosetwoturnanim BideSetUp, BideUnleash end BideSetUp: loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER, 9, 2 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 waitforvisualfinish end BideUnleash: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER, 9, 2 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 4 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 12, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 16, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 18, -8, ANIM_TARGET, 1 delay 5 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, -18, 8, ANIM_TARGET, 1 delay 5 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, -8, -5, ANIM_TARGET, 1 waitforvisualfinish delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 11, 0, RGB_RED waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_STRING_SHOT: loadspritegfx ANIM_TAG_STRING loadspritegfx ANIM_TAG_WEB_THREAD monbg ANIM_DEF_PARTNER delay 0 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 0, 9, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 9, 6 call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread call StringShotThread waitforvisualfinish playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET createsprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, 10 delay 4 createsprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, -2 delay 4 createsprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, 22 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 1 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 9, 0, RGB_BLACK end StringShotThread: createsprite gWebThreadSpriteTemplate, ANIM_TARGET, 2, 20, 0, 512, 20, 1 delay 1 return Move_SPIDER_WEB: loadspritegfx ANIM_TAG_SPIDER_WEB loadspritegfx ANIM_TAG_WEB_THREAD monbg ANIM_DEF_PARTNER delay 0 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 0, 9, RGB_BLACK waitforvisualfinish splitbgprio ANIM_TARGET loopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 9, 6 call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread call SpiderWebThread waitforvisualfinish playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET createsprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 9, 0, RGB_BLACK end SpiderWebThread: createsprite gWebThreadSpriteTemplate, ANIM_TARGET, 2, 20, 0, 512, 20, 0 delay 1 return Move_RAZOR_WIND: choosetwoturnanim RazorWindSetUp, RazorWindUnleash RazorWindEnd: waitforvisualfinish end RazorWindSetUp: loadspritegfx ANIM_TAG_GUST playsewithpan SE_M_GUST, SOUND_PAN_ATTACKER createsprite gRazorWindTornadoSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 16, 16, 0, 7, 40 createsprite gRazorWindTornadoSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 16, 16, 85, 7, 40 createsprite gRazorWindTornadoSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 16, 16, 170, 7, 40 waitforvisualfinish playsewithpan SE_M_GUST2, SOUND_PAN_ATTACKER goto RazorWindEnd RazorWindUnleash: loadspritegfx ANIM_TAG_AIR_WAVE_2 loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, 8, 0, 0, 22, 2, 1 delay 2 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -8, 16, 14, 22, 1, 1 delay 2 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, 12, -16, -14, 22, 0, 1 delay 17 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 10, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 10, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff goto RazorWindEnd Move_DISABLE: loadspritegfx ANIM_TAG_SPARKLE_4 monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 8, 8 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 13, 24, -16 waitforvisualfinish createvisualtask AnimTask_GrowAndGrayscale, 5 loopsewithpan SE_M_BIND, SOUND_PAN_TARGET, 15, 4 waitforvisualfinish delay 1 clearmonbg ANIM_TARGET blendoff end Move_RECOVER: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_BLUE_STAR monbg ANIM_ATK_PARTNER setalpha 12, 8 loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 6, 0, 11, RGB(31, 31, 11) call RecoverAbsorbEffect call RecoverAbsorbEffect call RecoverAbsorbEffect waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff delay 1 call HealingEffect waitforvisualfinish end RecoverAbsorbEffect: createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, -10, 13 delay 3 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -35, -10, 13 delay 3 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 15, -40, 13 delay 3 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -10, -32, 13 delay 3 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 25, -20, 13 delay 3 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, -20, 13 delay 3 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 5, -40, 13 delay 3 return Move_MIMIC: loadspritegfx ANIM_TAG_ORBS monbg_static ANIM_DEF_PARTNER setalpha 11, 5 panse SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0 createvisualtask AnimTask_ShrinkTargetCopy, 5, 128, 24 delay 15 createsprite gMimicOrbSpriteTemplate, ANIM_TARGET, 2, -12, 24 delay 10 setarg 7, 0xFFFF waitforvisualfinish playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 11, RGB_WHITE waitforvisualfinish clearmonbg_static ANIM_DEF_PARTNER blendoff end Move_CONSTRICT: loadspritegfx ANIM_TAG_TENDRILS loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 6, 4 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0, 16, 0, 2 delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 2 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 1, 2 delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0, -8, 1, 2 delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 delay 20 playsewithpan SE_M_BIND, SOUND_PAN_TARGET setarg 7, 0xFFFF waitforvisualfinish end Move_CURSE: choosetwoturnanim CurseGhost, CurseStats CurseGhost: loadspritegfx ANIM_TAG_NAIL loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT monbg ANIM_ATK_PARTNER createvisualtask AnimTask_CurseStretchingBlackBg, 5 waitforvisualfinish delay 20 createsprite gCurseNailSpriteTemplate, ANIM_ATTACKER, 2 delay 60 call CurseGhostShakeFromNail delay 41 call CurseGhostShakeFromNail delay 41 call CurseGhostShakeFromNail waitforvisualfinish clearmonbg ANIM_ATK_PARTNER delay 1 monbg ANIM_DEF_PARTNER playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end CurseGhostShakeFromNail: createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 4, 0, 10, 0 playsewithpan SE_M_BIND, SOUND_PAN_ATTACKER return CurseStats: createvisualtask AnimTask_SwayMon, 5, 0, 10, 1536, 3, ANIM_ATTACKER waitforvisualfinish delay 10 call CurseStats1 waitforvisualfinish end CurseStats1: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_DrawFallingWhiteLinesOnAttacker, 5 createvisualtask AnimTask_BlendColorCycle, 5, F_PAL_ATTACKER, 4, 2, 0, 10, RGB_RED return Move_SOFT_BOILED: loadspritegfx ANIM_TAG_BREAKING_EGG loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_BLUE_STAR monbg ANIM_ATK_PARTNER playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 2, 6, 1 createsprite gSoftBoiledEggSpriteTemplate, ANIM_ATTACKER, 4, 0, 16, 0 createsprite gSoftBoiledEggSpriteTemplate, ANIM_ATTACKER, 4, 0, 16, 1 delay 120 delay 7 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_ATTACKER createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 10, 0, RGB(12, 24, 30) createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 31, 16, 0, 1 delay 8 createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 31, 16, 0, 1 delay 60 setarg 7, 0xFFFF waitforvisualfinish clearmonbg ANIM_ATK_PARTNER call HealingEffect2 end Move_HEAL_BELL: loadspritegfx ANIM_TAG_BELL loadspritegfx ANIM_TAG_MUSIC_NOTES_2 loadspritegfx ANIM_TAG_THIN_RING createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATK_SIDE, 0, 0, 10, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_LoadMusicNotesPals, 5 createsprite gBellSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 0, 1 delay 12 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 48, -18, 35, 0, 0 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -48, 20, 30, 1, 1 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -38, -29, 30, 2, 2 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 36, 18, 30, 3, 3 call HealBellRing delay 33 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 19, 26, 35, 4, 4 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -34, -12, 30, 5, 5 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 41, -20, 34, 6, 2 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -15, 26, 32, 7, 0 call HealBellRing delay 33 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -48, 18, 31, 0, 2 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 48, -20, 30, 2, 5 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 38, 29, 33, 4, 3 createsprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -36, -18, 30, 6, 1 call HealBellRing waitforvisualfinish createvisualtask AnimTask_FreeMusicNotesPals, 5 waitforvisualfinish unloadspritegfx ANIM_TAG_BELL unloadspritegfx ANIM_TAG_MUSIC_NOTES_2 unloadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_SPARKLE_2 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER createsprite gSparklingStarsSpriteTemplate, ANIM_ATTACKER, 16, -15, 0, 0, 0, 32, 60, 1 delay 8 createsprite gSparklingStarsSpriteTemplate, ANIM_ATTACKER, 16, 12, -5, 0, 0, 32, 60, 1 waitforvisualfinish unloadspritegfx ANIM_TAG_SPARKLE_2 loadspritegfx ANIM_TAG_THIN_RING playsewithpan SE_SHINY, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 4, 3, 10, 0, RGB(12, 24, 30) createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATK_SIDE, 3, 10, 0, RGB_WHITE createsprite gBlendThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 16, 0, 0, 0, 1 end HealBellRing: createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 4, 3, 8, 0, RGB(12, 24, 30) createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATK_SIDE, 3, 2, 10, RGB_WHITE createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 0, 1 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER return Move_FAKE_OUT: playsewithpan SE_M_FLATTER, 0 createvisualtask AnimTask_FakeOut, 5 waitforvisualfinish playsewithpan SE_M_SKETCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 3 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_WHITE end Move_SCARY_FACE: loadspritegfx ANIM_TAG_EYE_SPARKLE createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, 3, 0, 16, RGB_BLACK playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER waitforvisualfinish delay 10 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaryFace, 5 delay 13 createsprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, -16, -8 createsprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, 16, -8 waitforvisualfinish createvisualtask AnimTask_ShakeTargetInPattern, 3, 20, 1, FALSE playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, 3, 16, 0, RGB_BLACK waitforvisualfinish end Move_SWEET_KISS: loadspritegfx ANIM_TAG_RED_HEART loadspritegfx ANIM_TAG_ANGEL createsprite gAngelSpriteTemplate, ANIM_TARGET, 2, 16, -48 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_TARGET delay 23 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_TARGET delay 23 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_TARGET waitforvisualfinish createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -30 playsewithpan SE_M_ATTRACT, SOUND_PAN_TARGET createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -42 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -14 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 416, -38 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -128, -22 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -384, -31 end Move_LOVELY_KISS: loadspritegfx ANIM_TAG_PINK_HEART loadspritegfx ANIM_TAG_DEVIL createsprite gDevilSpriteTemplate, ANIM_TARGET, 2, 0, -24 playsewithpan SE_M_PSYBEAM2, SOUND_PAN_TARGET waitforvisualfinish playsewithpan SE_M_ATTRACT, SOUND_PAN_TARGET createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, -256, -42 createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 128, -14 createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 416, -38 createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, -128, -22 end Move_FURY_SWIPES: loadspritegfx ANIM_TAG_SWIPE createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 5, 5 delay 4 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET createsprite gFurySwipesSpriteTemplate, ANIM_TARGET, 2, 16, 0, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 5, 1 delay 10 createsprite gHorizontalLungeSpriteTemplate, ANIM_TARGET, 2, 5, 5 delay 4 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET createsprite gFurySwipesSpriteTemplate, ANIM_TARGET, 2, -16, 0, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 7, 1 end Move_INGRAIN: loadspritegfx ANIM_TAG_ROOTS loadspritegfx ANIM_TAG_ORBS createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 16, 26, -1, 2, 150 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 10 createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, -32, 20, 1, 1, 140 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 10 createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 32, 22, 1, 0, 130 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 10 createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, -16, 25, -1, 3, 120 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 40 createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 32, 26, -1, 3, 30 delay 5 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, -48, 20, 1, 2, 30 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 48, 26, -2, 3, 18 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 10 waitforvisualfinish end Move_PRESENT: loadspritegfx ANIM_TAG_ITEM_BAG createvisualtask AnimTask_IsHealingMove, 2 createsprite gPresentSpriteTemplate, ANIM_TARGET, 2, 0, -5, 10, 2, -1 playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 14 playsewithpan SE_M_BUBBLE2, SOUND_PAN_ATTACKER delay 14 playsewithpan SE_M_BUBBLE2, 0 delay 20 playsewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET waitforvisualfinish jumpretfalse PresentDamage jumprettrue PresentHeal end PresentDamage: loadspritegfx ANIM_TAG_EXPLOSION playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 24, -24, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -16, 16, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -24, -12, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 16, 16, 1, 1 end PresentHeal: loadspritegfx ANIM_TAG_GREEN_SPARKLE loadspritegfx ANIM_TAG_BLUE_STAR playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -16, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 16, 32, -3, -1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 32, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -32, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 0, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 24, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -24, 32, -3, 1 waitforvisualfinish waitsound call HealingEffect2 end Move_BATON_PASS: loadspritegfx ANIM_TAG_POKEBALL playsewithpan SE_M_BATON_PASS, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 2, 0, 11, RGB(31, 22, 30) createsprite gBatonPassPokeballSpriteTemplate, ANIM_ATTACKER, 2 end Move_PERISH_SONG: loadspritegfx ANIM_TAG_MUSIC_NOTES_2 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 0 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 1, 1, 16 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 2, 1, 32 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 3, 2, 48 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 4, 2, 64 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 5, 0, 80 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 6, 0, 96 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 7, 1, 112 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 8, 2, 128 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 9, 0, 144 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 10, 2, 160 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 11, 0, 176 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 12, 1, 192 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 13, 3, 208 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 14, 3, 224 createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 15, 0, 240 createsprite gPerishSongMusicNote2SpriteTemplate, ANIM_ATTACKER, 4, 15, 0, 0 delay 20 panse SE_M_PERISH_SONG, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 delay 80 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 16, RGB_BLACK createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 4, 0 createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 5, 0 createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 6, 0 createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 7, 0 delay 100 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_BLACK createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 4, 1 createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 5, 1 createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 6, 1 createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 7, 1 waitforvisualfinish end Move_SLEEP_TALK: loadspritegfx ANIM_TAG_LETTER_Z createvisualtask AnimTask_SwayMon, 5, 0, 4, 4096, 2, ANIM_ATTACKER delay 20 createsprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -1 playsewithpan SE_M_SNORE, SOUND_PAN_ATTACKER delay 6 createsprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -1 delay 6 createsprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -1 delay 20 createsprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -5 playsewithpan SE_M_SNORE, SOUND_PAN_ATTACKER delay 6 createsprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -5 delay 6 createsprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -5 delay 20 createsprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -3 playsewithpan SE_M_SNORE, SOUND_PAN_ATTACKER delay 6 createsprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -3 delay 6 createsprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -3 waitforvisualfinish end Move_HYPER_FANG: loadspritegfx ANIM_TAG_FANG_ATTACK playsewithpan SE_M_BITE, SOUND_PAN_TARGET delay 1 delay 2 createvisualtask AnimTask_IsContest, 2 jumprettrue HyperFangInContest createvisualtask AnimTask_IsTargetPlayerSide, 2 jumpretfalse HyperFangOnOpponent goto HyperFangOnPlayer HyperFangContinue: waitbgfadeout createsprite gFangSpriteTemplate, ANIM_TARGET, 2 waitbgfadein createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 0, 10, 10, 1 playsewithpan SE_M_LEER, SOUND_PAN_TARGET delay 20 restorebg waitbgfadein waitforvisualfinish end HyperFangOnOpponent: fadetobg BG_IMPACT_OPPONENT goto HyperFangContinue HyperFangOnPlayer: fadetobg BG_IMPACT_PLAYER goto HyperFangContinue HyperFangInContest: fadetobg BG_IMPACT_CONTESTS goto HyperFangContinue Move_TRI_ATTACK: loadspritegfx ANIM_TAG_TRI_ATTACK_TRIANGLE createsprite gTriAttackTriangleSpriteTemplate, ANIM_TARGET, 2, 16, 0 playsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER delay 20 playsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER delay 20 createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 6, 0, 7 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK delay 16 loadspritegfx ANIM_TAG_FIRE createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 0 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 0, 1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, -1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 2, 1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 1, -1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 1 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 1, -2 delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 3, 1 delay 2 createvisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 1 waitforvisualfinish loadspritegfx ANIM_TAG_LIGHTNING createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 20 createvisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 0 delay 2 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 waitforvisualfinish loadspritegfx ANIM_TAG_ICE_CRYSTALS call IceCrystalEffectShort createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK waitforvisualfinish end Move_WILL_O_WISP: loadspritegfx ANIM_TAG_WISP_FIRE loadspritegfx ANIM_TAG_WISP_ORB monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_EMBER, SOUND_PAN_ATTACKER, 10 createvisualtask SoundTask_AdjustPanningVar, 2, SOUND_PAN_ATTACKER, SOUND_PAN_ATTACKER, 1, 0 createsprite gWillOWispOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0 delay 3 createsprite gWillOWispOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1 delay 3 createsprite gWillOWispOrbSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 2 delay 3 createsprite gWillOWispOrbSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 3 delay 40 createvisualtask SoundTask_AdjustPanningVar, 2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 waitforvisualfinish splitbgprio_all playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 13, 1 createsprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 0 createsprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 42 createsprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 84 createsprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 126 createsprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 168 createsprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 210 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end Move_ENCORE: loadspritegfx ANIM_TAG_SPOTLIGHT loadspritegfx ANIM_TAG_TAG_HAND createvisualtask AnimTask_CreateSpotlight, 2 createvisualtask AnimTask_HardwarePaletteFade, 2, 248, 3, 0, 10, 0 waitforvisualfinish createsprite gSpotlightSpriteTemplate, ANIM_TARGET, 2, 0, -8 createsprite gClappingHandSpriteTemplate, ANIM_ATTACKER, 2, -2, 0, 0, 0, 9 createsprite gClappingHandSpriteTemplate, ANIM_ATTACKER, 2, 2, 0, 1, 0, 9 createsprite gClappingHand2SpriteTemplate, ANIM_ATTACKER, 3, -2, 0, 0, 0, 9 createsprite gClappingHand2SpriteTemplate, ANIM_ATTACKER, 3, 2, 0, 1, 0, 9 delay 16 createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_ENCORE2, SOUND_PAN_TARGET createvisualtask AnimTask_SwayMon, 5, 1, 8, 1536, 5, ANIM_TARGET waitforvisualfinish createvisualtask AnimTask_HardwarePaletteFade, 2, 248, 3, 10, 0, 1 waitforvisualfinish createvisualtask AnimTask_RemoveSpotlight, 2 end Move_TRICK: loadspritegfx ANIM_TAG_ITEM_BAG loadspritegfx ANIM_TAG_SPEED_DUST createsprite gTrickBagSpriteTemplate, ANIM_ATTACKER, 2, -40, 80 createsprite gTrickBagSpriteTemplate, ANIM_ATTACKER, 2, -40, 208 delay 16 playsewithpan SE_M_SKETCH, 0 createvisualtask AnimTask_StretchTargetUp, 3 createvisualtask AnimTask_StretchAttackerUp, 3 delay 30 playsewithpan SE_M_DOUBLE_TEAM, 0 delay 24 playsewithpan SE_M_DOUBLE_TEAM, 0 delay 16 playsewithpan SE_M_DOUBLE_TEAM, 0 delay 16 playsewithpan SE_M_DOUBLE_TEAM, 0 delay 16 playsewithpan SE_M_DOUBLE_TEAM, 0 delay 16 playsewithpan SE_M_DOUBLE_TEAM, 0 delay 16 playsewithpan SE_M_ATTRACT, 0 createvisualtask AnimTask_ShakeMon, 3, ANIM_ATTACKER, 5, 0, 7, 2 createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 5, 0, 7, 2 waitforvisualfinish end Move_WISH: loadspritegfx ANIM_TAG_GOLD_STARS loadspritegfx ANIM_TAG_SPARKLE_2 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 10, RGB_BLACK waitforvisualfinish panse_adjustall SE_M_REFLECT, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0 createsprite gWishStarSpriteTemplate, ANIM_ATTACKER, 40 waitforvisualfinish delay 60 loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 16, 3 call GrantingStarsEffect waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 10, 0, RGB_BLACK waitforvisualfinish end Move_STOCKPILE: loadspritegfx ANIM_TAG_GRAY_ORB playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 8, 1, 0, 12, RGB_WHITE createvisualtask AnimTask_StockpileDeformMon, 5 call StockpileAbsorb call StockpileAbsorb waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 12, 0, RGB_WHITE end StockpileAbsorb: createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, 55, 13 delay 1 createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -55, -55, 13 delay 1 createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 55, 13 delay 1 createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, -55, 13 delay 1 createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, -34, 13 delay 1 createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, 34, 13 delay 1 createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -55, -34, 13 delay 1 createsprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -55, 34, 13 delay 1 return Move_SPIT_UP: loadspritegfx ANIM_TAG_RED_ORB_2 loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_SpitUpDeformMon, 5 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 8, 2 delay 45 playsewithpan SE_M_SPIT_UP, SOUND_PAN_ATTACKER delay 3 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 12 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 32, 12 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 64, 12 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 96, 12 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 128, 12 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 160, 12 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 192, 12 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 224, 12 delay 5 jumpifmoveturn 2, SpitUpStrong jumpifmoveturn 3, SpitUpStrongest SpitUpContinue: delay 5 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 8, 1, 0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 10, ANIM_TARGET, 1 delay 5 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, -10, ANIM_TARGET, 1 waitforvisualfinish end SpitUpStrong: createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 16 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 80 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 144 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 208 goto SpitUpContinue SpitUpStrongest: createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 16 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 48 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 80 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 112 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 144 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 176 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 208 createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 240 goto SpitUpContinue Move_SWALLOW: loadspritegfx ANIM_TAG_BLUE_ORB loadspritegfx ANIM_TAG_BLUE_STAR playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_SwallowDeformMon, 5 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 8, 2 delay 38 playsewithpan SE_M_SPIT_UP, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 12, 1 call SwallowEffect jumpifmoveturn 2, SwallowGood jumpifmoveturn 3, SwallowBest SwallowContinue: waitforvisualfinish call HealingEffect end SwallowEffect: createsprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, -8 delay 1 createsprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, -24, -8 delay 1 createsprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, 16, -8 delay 1 createsprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, -16, -8 delay 1 createsprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, 24, -8 delay 1 return SwallowGood: call SwallowEffect goto SwallowContinue SwallowBest: call SwallowEffect call SwallowEffect goto SwallowContinue Move_TRANSFORM: monbg ANIM_ATTACKER playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48 createvisualtask AnimTask_TransformMon, 2, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER end Move_MORNING_SUN: loadspritegfx ANIM_TAG_GREEN_STAR loadspritegfx ANIM_TAG_BLUE_STAR createvisualtask AnimTask_MorningSunLightBeam, 5 delay 8 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 8, 0, 12, RGB_WHITE delay 14 call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar call MorningSunStar createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 3, 12, 0, RGB_WHITE waitforvisualfinish waitsound call HealingEffect end MorningSunStar: createsprite gGreenStarSpriteTemplate, ANIM_ATTACKER, 2, 30, 640 delay 5 return Move_SWEET_SCENT: loadspritegfx ANIM_TAG_PINK_PETAL playsewithpan SE_M_SWEET_SCENT, SOUND_PAN_ATTACKER createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 100, 0, 100 delay 25 setpan 0 call SweetScentEffect createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 55, 0 setpan SOUND_PAN_TARGET createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 1, 5, 5, 13, RGB(31, 21, 21) call SweetScentEffect waitforvisualfinish end SweetScentEffect: createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 70, 1, 64 delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 60, 0, 64 delay 5 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 80, 1, 64 delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 58, 0, 120 delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 100, 0, 120 delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 90, 0, 64 delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 48, 0, 64 delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 95, 1, 80 delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 100, 0, 120 delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 75, 1, 64 delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 85, 0, 120 delay 2 return Move_HYPER_BEAM: loadspritegfx ANIM_TAG_ORBS createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 0, 16, RGB_BLACK waitforvisualfinish delay 10 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 4, 1 waitforvisualfinish delay 30 createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 15, 0, 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB(31, 0, 0), 16, 0, 0 call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(25, 25, 25) call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs call HyperBeamOrbs createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(25, 25, 25) waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 16, 0, RGB_BLACK end HyperBeamOrbs: createsprite gHyperBeamOrbSpriteTemplate, ANIM_TARGET, 2 createsprite gHyperBeamOrbSpriteTemplate, ANIM_TARGET, 2 delay 1 return Move_FLATTER: loadspritegfx ANIM_TAG_SPOTLIGHT loadspritegfx ANIM_TAG_CONFETTI createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_ENCORE2, SOUND_PAN_TARGET createvisualtask AnimTask_CreateSpotlight, 2 createvisualtask AnimTask_HardwarePaletteFade, 2, 248, 3, 0, 10, 0 waitforvisualfinish createsprite gFlatterSpotlightSpriteTemplate, ANIM_TARGET, 2, 0, -8, 80 delay 0 createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 5, 2, ANIM_TARGET delay 10 createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 5, 2, ANIM_TARGET delay 0 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_FLATTER, SOUND_PAN_ATTACKER call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti call CreateFlatterConfetti delay 5 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_FLATTER, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_HardwarePaletteFade, 2, 248, 3, 10, 0, 1 waitforvisualfinish createvisualtask AnimTask_RemoveSpotlight, 2 end CreateFlatterConfetti: createsprite gFlatterConfettiSpriteTemplate, ANIM_ATTACKER, 40, ANIM_ATTACKER createsprite gFlatterConfettiSpriteTemplate, ANIM_ATTACKER, 40, ANIM_TARGET return Move_ROLE_PLAY: monbg ANIM_ATK_PARTNER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB_WHITE createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 10, RGB_BLACK waitforvisualfinish playsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_DETECT, SOUND_PAN_ATTACKER, 30 createvisualtask AnimTask_RolePlaySilhouette, 2 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB_WHITE delay 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 10, 0, RGB_BLACK end Move_REFRESH: loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_SPARKLE_2 playsewithpan SE_M_STAT_INCREASE, SOUND_PAN_ATTACKER createvisualtask AnimTask_StatusClearedEffect, 2, 0 waitforvisualfinish playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER call GrantingStarsEffect waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 10, 0, RGB(12, 24, 30) createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 end Move_BLAZE_KICK: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_SMALL_EMBER monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET createsprite gSpinningHandOrFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 30 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE delay 30 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 14, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 call FireSpreadEffect waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_HYPER_VOICE: loadspritegfx ANIM_TAG_THIN_RING call HyperVoiceEffect waitforvisualfinish delay 8 call HyperVoiceEffect waitforvisualfinish end HyperVoiceEffect: createvisualtask SoundTask_PlayCryWithEcho, 5 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 8, 0, RGB_YELLOW createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 5, ANIM_ATTACKER, 0 createsprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 45, 0, 0, 0, 0, 0, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 6, 1 createvisualtask AnimTask_ShakeBattleTerrain, 2, 1, 0, 6, 1 createvisualtask SoundTask_WaitForCry, 5 return Move_SAND_TOMB: loadspritegfx ANIM_TAG_MUD_SAND createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(19, 17, 0) createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 43, 1 playsewithpan SE_M_SAND_TOMB, SOUND_PAN_TARGET call SandTombSwirlingDirt call SandTombSwirlingDirt call SandTombSwirlingDirt delay 22 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(19, 17, 0) waitforvisualfinish end SandTombSwirlingDirt: createsprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 32, 528, 30, 10, 50, ANIM_TARGET delay 2 createsprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 36, 480, 20, 13, -46, ANIM_TARGET delay 2 createsprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 37, 576, 20, 5, 42, ANIM_TARGET delay 2 createsprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 35, 400, 25, 8, -42, ANIM_TARGET delay 2 createsprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 32, 512, 25, 13, 46, ANIM_TARGET delay 2 createsprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 37, 464, 30, 12, -50, ANIM_TARGET delay 2 return Move_SHEER_COLD: fadetobg BG_ICE waitbgfadeout playsewithpan SE_M_ICY_WIND, 0 waitbgfadein loadspritegfx ANIM_TAG_ICE_CUBE monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_FrozenIceCube, 2 waitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 17 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff restorebg waitbgfadein end Move_ARM_THRUST: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT splitbgprio ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_RotateMonSpriteToSide, 5, 8, 5, ANIM_ATTACKER, 0 delay 6 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 3 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gArmThrustHandSpriteTemplate, ANIM_TARGET, 2, 10, -8, 14, 3 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 5, 8, 5, ANIM_ATTACKER, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET choosetwoturnanim ArmThrustRight, ArmThrustLeft ArmThrustContinue: createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish blendoff end ArmThrustRight: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 8, 0, ANIM_TARGET, 2 goto ArmThrustContinue ArmThrustLeft: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 0, ANIM_TARGET, 2 goto ArmThrustContinue Move_MUDDY_WATER: panse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 createvisualtask AnimTask_CreateSurfWave, 2, TRUE waitforvisualfinish end Move_BULLET_SEED: loadspritegfx ANIM_TAG_SEED createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 delay 5 createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 delay 5 createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 delay 5 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 30, 1 createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 delay 5 createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 delay 5 createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 delay 5 createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 delay 5 createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 delay 5 createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 delay 5 createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 waitforvisualfinish end Move_DRAGON_CLAW: loadspritegfx ANIM_TAG_SMALL_EMBER loadspritegfx ANIM_TAG_CLAW_SLASH playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 4, 0, 8, RGB(31, 19, 0) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 15, 1 call DragonClawFireSpiral call DragonClawFireSpiral createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 528, 30, 13, 50, ANIM_ATTACKER delay 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 480, 20, 16, -46, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 576, 20, 8, 42, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 31, 400, 25, 11, -42, ANIM_ATTACKER delay 2 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 512, 25, 16, 46, ANIM_ATTACKER delay 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1 createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1 createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 464, 30, 15, -50, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 528, 30, 13, 50, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 480, 20, 16, -46, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 576, 20, 8, 42, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 31, 400, 25, 11, -42, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 512, 25, 16, 46, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 464, 30, 15, -50, ANIM_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 4, 8, 0, RGB(31, 19, 0) waitforvisualfinish end DragonClawFireSpiral: createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 528, 30, 13, 50, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 480, 20, 16, -46, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 576, 20, 8, 42, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 31, 400, 25, 11, -42, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 512, 25, 16, 46, ANIM_ATTACKER delay 2 createsprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 464, 30, 15, -50, ANIM_ATTACKER delay 2 return end Move_MUD_SHOT: loadspritegfx ANIM_TAG_BROWN_ORB monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 delay 6 createvisualtask AnimTask_StartSinAnimTimer, 5, 100 panse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0 call MudShotOrbs call MudShotOrbs call MudShotOrbs createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 call MudShotOrbs call MudShotOrbs call MudShotOrbs call MudShotOrbs call MudShotOrbs call MudShotOrbs call MudShotOrbs call MudShotOrbs waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end MudShotOrbs: createsprite gMudShotOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16 delay 2 createsprite gMudShotOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16 delay 2 return Move_METEOR_MASH: loadspritegfx ANIM_TAG_GOLD_STARS loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET panse SE_M_BARRIER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +3, 0 fadetobg BG_COSMIC waitbgfadein waitforvisualfinish createsprite gMeteorMashStarSpriteTemplate, ANIM_TARGET, 3, -48, -64, 72, 32, 30 delay 10 createsprite gMeteorMashStarSpriteTemplate, ANIM_TARGET, 3, -112, -64, 8, 32, 30 delay 40 createsprite gSpinningHandOrFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 30 createsprite gMeteorMashStarSpriteTemplate, ANIM_TARGET, 3, -80, -64, 40, 32, 30 delay 20 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 5, 0, 20, 1 waitforvisualfinish delay 10 restorebg waitbgfadein waitforvisualfinish end Move_REVENGE: loadspritegfx ANIM_TAG_PURPLE_SCRATCH monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gRevengeSmallScratchSpriteTemplate, ANIM_ATTACKER, 2, 10, -10 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 4, 2, 8, RGB_RED waitforvisualfinish unloadspritegfx ANIM_TAG_PURPLE_SCRATCH loadspritegfx ANIM_TAG_PURPLE_SWIPE createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4 delay 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gRevengeBigScratchSpriteTemplate, ANIM_TARGET, 2, 10, -10 waitforvisualfinish unloadspritegfx ANIM_TAG_PURPLE_SWIPE loadspritegfx ANIM_TAG_IMPACT createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 10, 1 createsprite gPersistHitSplatSpriteTemplate, ANIM_TARGET, 3, -10, -8, ANIM_TARGET, 1, 8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 createsprite gPersistHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, 8, ANIM_TARGET, 1, 8 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_POISON_FANG: loadspritegfx ANIM_TAG_FANG_ATTACK loadspritegfx ANIM_TAG_POISON_BUBBLE playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gFangSpriteTemplate, ANIM_TARGET, 2 delay 10 createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 3, 0, 10, 1 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 0, 4, 0, 12, RGB(26, 0, 26) call PoisonBubblesEffect waitforvisualfinish end Move_SUBSTITUTE: playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER createvisualtask AnimTask_MonToSubstitute, 2 end Move_FRENZY_PLANT: loadspritegfx ANIM_TAG_ROOTS loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 2, 0, 5, RGB_BLACK waitforvisualfinish createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, 2, 0, 0, 100 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, -2, 0, 1, 95 playsewithpan SE_M_SCRATCH, -43 delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 30, 8, -4, 0, 0, 90 playsewithpan SE_M_SCRATCH, -22 delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 40, -8, 4, 0, 1, 85 playsewithpan SE_M_SCRATCH, 0 delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 50, 8, 0, 0, 0, 85 playsewithpan SE_M_SCRATCH, +21 delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 60, -8, -2, 0, 1, 85 playsewithpan SE_M_SCRATCH, +42 delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 75, 8, 0, 0, 0, 85 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 85, 16, 6, 0, 3, 80 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 85, -16, -6, 0, 2, 75 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -10, ANIM_TARGET, 3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 8, 0, 20, 1 delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, ANIM_TARGET, 3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, -3, ANIM_TARGET, 2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -3, 1, ANIM_TARGET, 2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 1, ANIM_TARGET, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, ANIM_TARGET, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 2, 5, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff end Move_METAL_SOUND: loadspritegfx ANIM_TAG_METAL_SOUND_WAVES monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 8, 1 call MetalSoundRings call MetalSoundRings call MetalSoundRings call MetalSoundRings waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 0 waitforvisualfinish end MetalSoundRings: panse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 createsprite gMetalSoundSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 30, 0 delay 2 return Move_FOCUS_PUNCH: goto FocusPunch FocusPunchEnd: waitforvisualfinish end FocusPunch: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET delay 1 createvisualtask AnimTask_IsContest, 2 jumprettrue FocusPunchInContest createvisualtask AnimTask_IsTargetPlayerSide, 2 jumpretfalse FocusPunchOnOpponent jumprettrue FocusPunchOnPlayer FocusPunchContinue: waitbgfadein monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gFocusPunchFistSpriteTemplate, ANIM_TARGET, 2 delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 8, 0, 24, 1 delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 2, ANIM_TARGET, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, -6, ANIM_TARGET, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 8, ANIM_TARGET, 0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish restorebg waitbgfadein clearmonbg ANIM_DEF_PARTNER blendoff goto FocusPunchEnd FocusPunchOnOpponent: fadetobg BG_IMPACT_OPPONENT goto FocusPunchContinue FocusPunchOnPlayer: fadetobg BG_IMPACT_PLAYER goto FocusPunchContinue FocusPunchInContest: fadetobg BG_IMPACT_CONTESTS goto FocusPunchContinue Move_RETURN: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 createvisualtask AnimTask_GetReturnPowerLevel, 2 delay 2 jumpreteq 0, ReturnWeak jumpreteq 1, ReturnMedium jumpreteq 2, ReturnStrong jumpreteq 3, ReturnStrongest ReturnContinue: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end ReturnWeak: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 16, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 16, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_COMET_PUNCH, SOUND_PAN_TARGET goto ReturnContinue ReturnMedium: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER waitforvisualfinish delay 11 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 5, 4 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET goto ReturnContinue ReturnStrong: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 3, -5, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -5, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 goto ReturnContinue ReturnStrongest: createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 6, RGB_BLACK waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 16, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 3, -5, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 12, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 waitforvisualfinish delay 4 createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 waitforvisualfinish delay 2 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1 createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1 waitforvisualfinish createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 4, 2, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1 waitforvisualfinish call ReturnStrongestHit call ReturnStrongestHit call ReturnStrongestHit call ReturnStrongestHit createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 0 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 8, 0, 24, 1 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, ANIM_TARGET, 0 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 3, -5, ANIM_TARGET, 0 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -5, 3, ANIM_TARGET, 0 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 6, 0, RGB_BLACK goto ReturnContinue ReturnStrongestHit: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 4, 3, ANIM_ATTACKER createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1 waitforvisualfinish return Move_COSMIC_POWER: loadspritegfx ANIM_TAG_SPARKLE_2 createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_COSMIC_POWER, 0 playsewithpan SE_M_COSMIC_POWER, 0 createvisualtask AnimTask_BlendNonAttackerPalettes, 2, 0, 0, 15, RGB_BLACK waitforvisualfinish fadetobg BG_COSMIC waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 2, 0, 128, 0, -1 waitbgfadein delay 70 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MORNING_SUN, SOUND_PAN_ATTACKER createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, -15, 0, 0, 0, 32, 60 delay 8 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60 delay 40 createvisualtask AnimTask_BlendNonAttackerPalettes, 2, 0, 15, 0, RGB_BLACK waitforvisualfinish restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein waitforvisualfinish end Move_BLAST_BURN: loadspritegfx ANIM_TAG_FIRE_PLUME loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_SACRED_FIRE, SOUND_PAN_ATTACKER createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -20, -10, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 0, -16, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 20, -10, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 32, 0, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 20, 10, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -20, 10, 24, 0, 0, 0 delay 25 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -64, 0, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 6, -40, -20, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 0, -32, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 40, -20, 24, 0, 0, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 64, 0, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 40, 20, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -40, 20, 24, 0, 0, 0 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 25 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -96, 0, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 6, -60, -30, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 0, -48, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 60, -30, 24, 0, 0, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -4, 3, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 12, 0, 20, 1 createvisualtask AnimTask_ShakeBattleTerrain, 2, 2, 0, 10, 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 96, 0, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 60, 30, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 48, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -60, 30, 24, 0, 0, 0 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_ROCK_TOMB: loadspritegfx ANIM_TAG_X_SIGN loadspritegfx ANIM_TAG_ROCKS createvisualtask AnimTask_ShakeBattleTerrain, 2, 2, 0, 10, 1 waitforvisualfinish createsprite gRockTombRockSpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 114, 0 delay 8 createvisualtask AnimTask_ShakeBattleTerrain, 2, 0, 2, 3, 1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET delay 8 createsprite gRockTombRockSpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 98, 0 delay 8 createvisualtask AnimTask_ShakeBattleTerrain, 2, 0, 2, 3, 1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET delay 8 createsprite gRockTombRockSpriteTemplate, ANIM_TARGET, 66, 3, 6, 64, 82, 0 delay 8 createvisualtask AnimTask_ShakeBattleTerrain, 2, 0, 2, 3, 1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET delay 8 createsprite gRockTombRockSpriteTemplate, ANIM_TARGET, 2, -3, 13, 64, 66, 0 delay 8 createvisualtask AnimTask_ShakeBattleTerrain, 2, 0, 2, 3, 1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET delay 24 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET createsprite gRedXSpriteTemplate, ANIM_TARGET, 5, ANIM_TARGET, 50 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 20, 1 createvisualtask AnimTask_ShakeBattleTerrain, 2, 2, 0, 10, 1 waitforvisualfinish end Move_SILVER_WIND: loadspritegfx ANIM_TAG_SPARKLE_6 panse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 playsewithpan SE_M_MORNING_SUN, 0 delay 0 monbg ANIM_DEF_PARTNER splitbgprio_all delay 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 0, 4, RGB_BLACK createvisualtask AnimTask_GetTargetSide, 2 jumprettrue SilverWindOnPlayer fadetobg BG_BUG_OPPONENT waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, 1536, 0, 0, -1 SilverWindContinue: delay 0 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 4, 4, RGB_BLACK waitbgfadein createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 createsprite gSilverWindBigSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 createsprite gSilverWindBigSparkSpriteTemplate, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1 delay 0 createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1 delay 0 createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1 delay 6 createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1 createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1 delay 0 createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1 createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1 delay 0 createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1 createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1 waitforvisualfinish playsewithpan SE_M_GUST2, SOUND_PAN_TARGET clearmonbg ANIM_DEF_PARTNER delay 0 restorebg waitbgfadeout createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 4, 0, RGB_BLACK setarg 7, 0xFFFF waitbgfadein end SilverWindOnPlayer: fadetobg BG_BUG_PLAYER waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, -1536, 0, 0, -1 goto SilverWindContinue Move_SNATCH: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -12, 4, 10, 10, 12, 6 end Move_DIVE: loadspritegfx ANIM_TAG_SPLASH loadspritegfx ANIM_TAG_SWEAT_BEAD choosetwoturnanim DiveSetUp, DiveAttack DiveSetUp: loadspritegfx ANIM_TAG_ROUND_SHADOW playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER createsprite gDiveBallSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 waitforvisualfinish playsewithpan SE_M_DIVE, SOUND_PAN_ATTACKER createsprite gDiveWaterSplashSpriteTemplate, ANIM_ATTACKER, 3, 0 call DiveSetUpWaterDroplets call DiveSetUpWaterDroplets call DiveSetUpWaterDroplets call DiveSetUpWaterDroplets call DiveSetUpWaterDroplets end DiveSetUpWaterDroplets: createsprite gSprayWaterDropletSpriteTemplate, ANIM_ATTACKER, 5, 0, 0 createsprite gSprayWaterDropletSpriteTemplate, ANIM_ATTACKER, 5, 1, 0 return DiveAttack: loadspritegfx ANIM_TAG_WATER_IMPACT loadspritegfx ANIM_TAG_SMALL_BUBBLES monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gDiveWaterSplashSpriteTemplate, ANIM_TARGET, 3, 1 call DiveAttackWaterDroplets call DiveAttackWaterDroplets call DiveAttackWaterDroplets call DiveAttackWaterDroplets call DiveAttackWaterDroplets delay 12 call RisingWaterHitEffect waitforvisualfinish visible ANIM_ATTACKER clearmonbg ANIM_DEF_PARTNER blendoff end DiveAttackWaterDroplets: createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0, 1 createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 1, 1 return Move_ROCK_BLAST: loadspritegfx ANIM_TAG_ROCKS loadspritegfx ANIM_TAG_IMPACT createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 delay 3 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gRockBlastRockSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 25, 257 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, 0, 0, 20, 24, 14, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, 5, 0, -20, 24, 14, 1 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, 0, 5, 20, -24, 14, 2 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, -5, 0, -20, -24, 14, 2 waitforvisualfinish end Move_OVERHEAT: loadspritegfx ANIM_TAG_SMALL_EMBER loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 18 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 5, RGB(28, 0, 0) waitforvisualfinish createvisualtask AnimTask_AllocBackupPalBuffer, 5 waitforvisualfinish createvisualtask AnimTask_CopyPalUnfadedToBackup, 5, 0, 1 delay 1 createvisualtask AnimTask_CopyPalFadedToUnfaded, 5, 0 delay 1 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_CopyPalUnfadedToBackup, 5, 1, 0 delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 1, 0, 13, RGB(28, 0, 0) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1 waitforvisualfinish playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 30, 25, -20 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 32, 30, 25, -20 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 64, 30, 25, -20 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 96, 30, 25, -20 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 128, 30, 25, -20 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 160, 30, 25, -20 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 192, 30, 25, -20 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, -20 delay 5 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 30, 25, 0 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 32, 30, 25, 0 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 64, 30, 25, 0 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 96, 30, 25, 0 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 128, 30, 25, 0 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 160, 30, 25, 0 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 192, 30, 25, 0 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, 0 delay 5 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 30, 25, 10 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 32, 30, 25, 10 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 64, 30, 25, 10 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 96, 30, 25, 10 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 128, 30, 25, 10 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 160, 30, 25, 10 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 192, 30, 25, 10 createsprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, 10 delay 5 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -5, 3, ANIM_TARGET, 0 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 10, 0, 25, 1 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, -5, ANIM_TARGET, 0 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, 10, ANIM_TARGET, 0 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_CopyPalFadedToUnfaded, 5, 1 delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, -1, 0, 13, RGB(18, 18, 18) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 3, 0, 15, 1 waitforvisualfinish createvisualtask AnimTask_CopyPalUnfadedFromBackup, 5, 0, 1 delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 5, 0, RGB(28, 0, 0) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff waitforvisualfinish delay 15 createvisualtask AnimTask_CopyPalUnfadedFromBackup, 5, 1, 0 delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 13, 0, RGB(18, 18, 18) waitforvisualfinish createvisualtask AnimTask_FreeBackupPalBuffer, 5 waitforvisualfinish end Move_HYDRO_CANNON: loadspritegfx ANIM_TAG_WATER_ORB loadspritegfx ANIM_TAG_WATER_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_SURF, SOUND_PAN_ATTACKER createsprite gHydroCannonChargeSpriteTemplate, ANIM_TARGET, 2 delay 10 createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 delay 30 panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call HydroCannonBeam createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 10, 0, 40, 1 createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 call HydroCannonBeam createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 call HydroCannonBeam createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 call HydroCannonBeam createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 call HydroCannonBeam createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 call HydroCannonBeam createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 waitforvisualfinish createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end HydroCannonBeam: createsprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257 delay 1 createsprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257 delay 1 createsprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257 delay 1 createsprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257 delay 1 createsprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257 return Move_ASTONISH: loadspritegfx ANIM_TAG_SWEAT_BEAD playsewithpan SE_M_ENCORE, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 delay 25 createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0, 1 playsewithpan SE_M_SKETCH, SOUND_PAN_TARGET createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 1, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 3 waitforvisualfinish end Move_SEISMIC_TOSS: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_ROCKS setarg 7, 0 monbg ANIM_DEF_PARTNER setalpha 12, 8 waitforvisualfinish createvisualtask AnimTask_GetSeismicTossDamageLevel, 3 delay 1 fadetobg BG_IN_AIR waitbgfadeout createvisualtask AnimTask_MoveSeismicTossBg, 3 playsewithpan SE_M_SKY_UPPERCUT, 0 waitbgfadein waitforvisualfinish createvisualtask AnimTask_SeismicTossBgAccelerateDownAtEnd, 3 jumpreteq 0, SeismicTossWeak jumpreteq 1, SeismicTossMedium jumpreteq 2, SeismicTossStrong SeismicTossContinue: restorebg waitbgfadeout setarg 7, 0xFFF waitbgfadein clearmonbg ANIM_DEF_PARTNER blendoff end SeismicTossWeak: call SeismicTossRockScatter1 delay 16 call SeismicTossRockScatter2 goto SeismicTossContinue SeismicTossMedium: call SeismicTossRockScatter1 delay 14 call SeismicTossRockScatter2 delay 14 call SeismicTossRockScatter1 goto SeismicTossContinue SeismicTossStrong: call SeismicTossRockScatter2 delay 10 call SeismicTossRockScatter1 delay 10 call SeismicTossRockScatter2 delay 10 call SeismicTossRockScatter1 goto SeismicTossContinue SeismicTossRockScatter1: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -10, -8, ANIM_TARGET, 1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 27, 2, 3 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 28, 3, 4 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 30, 2, 3 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 25, 4, 4 return SeismicTossRockScatter2: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, ANIM_TARGET, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 32, 3, 4 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 31, 2, 2 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 28, 2, 3 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 30, 4, 3 return Move_MAGIC_COAT: loadspritegfx ANIM_TAG_ORANGE_LIGHT_WALL setalpha 0, 16 waitplaysewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER, 15 createsprite gMagicCoatWallSpriteTemplate, ANIM_ATTACKER, 3, 40, 0, ANIM_TAG_ORANGE_LIGHT_WALL waitforvisualfinish delay 1 blendoff end Move_WATER_PULSE: loadspritegfx ANIM_TAG_SMALL_BUBBLES loadspritegfx ANIM_TAG_BLUE_RING_2 monbg ANIM_TARGET splitbgprio ANIM_TARGET playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 7, RGB(0, 25, 28) delay 10 createsprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 100, 100, 8, 1, 20, 40, 0 createsprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 20, 100, 16, 2, 10, 35, 1 createsprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 200, 80, 8, 1, 40, 20, 0 createsprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 80, 60, 10, 3, 20, 50, 0 createsprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 140, 100, 16, 1, 20, 30, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET waitforvisualfinish playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER createsprite gWaterPulseRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 40, 15 delay 5 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER createsprite gWaterPulseRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 40, 15 delay 5 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER createsprite gWaterPulseRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 40, 15 delay 13 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 8, 18, 1 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 7, 0, RGB(0, 25, 28) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end Move_PSYCHO_BOOST: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT monbg ANIM_ATK_PARTNER fadetobg BG_PSYCHIC waitbgfadeout createvisualtask AnimTask_FadeScreenToWhite, 5 waitbgfadein delay 6 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG, 2, 8, 0, 10, RGB_BLACK delay 0 splitbgprio ANIM_ATTACKER setalpha 8, 8 delay 10 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 3, 0, 240, 0 loopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 14, 10 createsprite gPsychoBoostOrbSpriteTemplate, ANIM_ATTACKER, 2 delay 110 loopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 7, 10 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, -8, 1, 24, 1 playsewithpan SE_M_LEER, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff call UnsetPsychicBackground end Move_KNOCK_OFF: loadspritegfx ANIM_TAG_SLAM_HIT_2 loadspritegfx ANIM_TAG_IMPACT createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 delay 4 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gKnockOffStrikeSpriteTemplate, ANIM_TARGET, 2, -16, -16 delay 8 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 delay 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 delay 10 waitforvisualfinish end Move_DOOM_DESIRE: createvisualtask GetIsDoomDesireHitTurn, 2 delay 1 monbg ANIM_ATK_PARTNER createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, FALSE createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 4, RGB_BLACK waitforvisualfinish setalpha 8, 8 playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_ATTACKER, 1 waitforvisualfinish delay 20 createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, TRUE createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 4, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end UnusedDoomDesireHit: loadspritegfx ANIM_TAG_EXPLOSION createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 16, RGB_WHITE waitforvisualfinish delay 10 createvisualtask AnimTask_DoomDesireLightBeam, 5 delay 5 playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER delay 10 playsewithpan SE_M_CONFUSE_RAY, 0 delay 10 playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET delay 23 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_WHITE waitforvisualfinish end Move_SKY_UPPERCUT: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET fadetobg BG_IN_AIR waitbgfadeout playsewithpan SE_M_SKY_UPPERCUT, SOUND_PAN_ATTACKER createvisualtask AnimTask_MoveSkyUppercutBg, 5, 55 waitbgfadein setalpha 12, 8 delay 38 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 0, 0, 5 delay 4 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -28, 28, ANIM_TARGET, 1 delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -15, 8, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -5, -12, ANIM_TARGET, 1 delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -32, ANIM_TARGET, 1 delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, -52, ANIM_TARGET, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -26, 16, 1, 4 delay 4 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 delay 30 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6 delay 4 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 clearmonbg ANIM_DEF_PARTNER blendoff restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein end Move_SECRET_POWER: createvisualtask AnimTask_GetBattleTerrain, 5 jumpargeq 0, BATTLE_TERRAIN_GRASS, Move_NEEDLE_ARM jumpargeq 0, BATTLE_TERRAIN_LONG_GRASS, Move_MAGICAL_LEAF jumpargeq 0, BATTLE_TERRAIN_SAND, Move_MUD_SHOT jumpargeq 0, BATTLE_TERRAIN_UNDERWATER, Move_WATERFALL jumpargeq 0, BATTLE_TERRAIN_WATER, Move_SURF jumpargeq 0, BATTLE_TERRAIN_POND, Move_BUBBLE_BEAM jumpargeq 0, BATTLE_TERRAIN_MOUNTAIN, Move_ROCK_THROW jumpargeq 0, BATTLE_TERRAIN_CAVE, Move_BITE jumpargeq 0, BATTLE_TERRAIN_BUILDING, Move_STRENGTH goto Move_SLAM Move_TWISTER: loadspritegfx ANIM_TAG_LEAF loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_ROCKS monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET playsewithpan SE_M_TWISTER, SOUND_PAN_TARGET createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 120, 70, 5, 70, 30 delay 1 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 55, 6, 60, 25 delay 1 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 60, 7, 60, 30 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 55, 10, 60, 30 delay 3 createsprite gTwisterRockSpriteTemplate, ANIM_TARGET, 2, 100, 50, 4, 50, 26 delay 1 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 105, 25, 8, 60, 20 delay 1 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 40, 10, 48, 30 delay 3 createsprite gTwisterRockSpriteTemplate, ANIM_TARGET, 2, 120, 30, 6, 45, 25 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 35, 10, 60, 30 delay 3 createsprite gTwisterRockSpriteTemplate, ANIM_TARGET, 2, 105, 20, 8, 40, 0 delay 3 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 20, 255, 15, 32, 0 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 110, 10, 8, 32, 20 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -32, -16, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_MAGICAL_LEAF: loadspritegfx ANIM_TAG_LEAF loadspritegfx ANIM_TAG_RAZOR_LEAF loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 delay 1 loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER, 10, 5 createvisualtask AnimTask_CycleMagicalLeafPal, 5 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -2, 10 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -1, 15 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -4, -4, 7 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, -3, 11 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -6, 8 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -1, 12 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -4, 13 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -5, 7 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -6, 11 delay 2 createsprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -5, 8 delay 60 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 32, 20, 0 createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 32, -20, 0 delay 30 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, -4, ANIM_TARGET, 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 10, 4, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 delay 20 setarg 7, 0xFFFF waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end Move_ICE_BALL: loadspritegfx ANIM_TAG_ICE_CHUNK loadspritegfx ANIM_TAG_ICE_CRYSTALS createvisualtask AnimTask_GetRolloutCounter, 5, 0 jumpargeq 0, 4, IceBallSetIceBg IceBallContinue: playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER createsprite gIceBallChunkSpriteTemplate, ANIM_TARGET, 2, 15, 0, -12, -16, 30, -40 delay 28 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET createvisualtask AnimTask_GetRolloutCounter, 5, 0 jumpargeq 0, 0, IceBallWeakest jumpargeq 0, 1, IceBallWeak jumpargeq 0, 2, IceBallMediun jumpargeq 0, 3, IceBallStrong jumpargeq 0, 4, IceBallStrongest IceBallContinue2: createvisualtask AnimTask_GetRolloutCounter, 5, 0 jumpargeq 0, 4, IceBallUnsetIceBg IceBallEnd: end IceBallSetIceBg: fadetobg BG_ICE goto IceBallContinue IceBallUnsetIceBg: waitbgfadein delay 45 restorebg waitbgfadein goto IceBallEnd IceBallWeakest: createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 8, 1, 0 call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard goto IceBallContinue2 IceBallWeak: createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 10, 1, 0 call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard goto IceBallContinue2 IceBallMediun: createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 14, 1, 0 call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard goto IceBallContinue2 IceBallStrong: createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 18, 1, 0 call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard goto IceBallContinue2 IceBallStrongest: createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 30, 1, 0 call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard call IceBallImpactShard goto IceBallContinue2 IceBallImpactShard: createsprite gIceBallImpactShardSpriteTemplate, ANIM_TARGET, 4, -12, -16 return Move_WEATHER_BALL: loadspritegfx ANIM_TAG_WEATHER_BALL createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, ANIM_ATTACKER delay 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gWeatherBallUpSpriteTemplate, ANIM_ATTACKER, 2 waitforvisualfinish delay 15 playsewithpan SE_M_DETECT, 0 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 waitforvisualfinish createvisualtask AnimTask_GetWeather, 2 delay 1 jumpreteq ANIM_WEATHER_NONE, WeatherBallNormal jumpreteq ANIM_WEATHER_SUN, WeatherBallFire jumpreteq ANIM_WEATHER_RAIN, WeatherBallWater jumpreteq ANIM_WEATHER_SANDSTORM, WeatherBallSandstorm jumpreteq ANIM_WEATHER_HAIL, WeatherBallIce WeatherBallNormal: loadspritegfx ANIM_TAG_IMPACT createsprite gWeatherBallNormalDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 0, 0 waitforvisualfinish playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 8, 1 waitforvisualfinish end WeatherBallFire: loadspritegfx ANIM_TAG_SMALL_EMBER createsprite gWeatherBallFireDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 40, 10 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET delay 10 createsprite gWeatherBallFireDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, -40, 20 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET delay 10 createsprite gWeatherBallFireDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 0, 0 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET waitforvisualfinish playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 8, 1 waitforvisualfinish end WeatherBallWater: loadspritegfx ANIM_TAG_SMALL_BUBBLES createsprite gWeatherBallWaterDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 50, 10 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET delay 8 createsprite gWeatherBallWaterDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, -20, 20 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET delay 13 createsprite gWeatherBallWaterDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 0, 0 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 8, 1 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET waitforvisualfinish end WeatherBallSandstorm: loadspritegfx ANIM_TAG_ROCKS createsprite gWeatherBallRockDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 30, 0 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 5 createsprite gWeatherBallRockDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, -40, 20 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 14 createsprite gWeatherBallRockDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 0, 0 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET waitforvisualfinish playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 27, 2, 3 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 28, 3, 4 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 30, 2, 3 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 25, 4, 4 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 waitforvisualfinish end WeatherBallIce: loadspritegfx ANIM_TAG_HAIL loadspritegfx ANIM_TAG_ICE_CRYSTALS createsprite gWeatherBallIceDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 25, -40, 20 playsewithpan SE_M_HAIL, SOUND_PAN_TARGET delay 10 createsprite gWeatherBallIceDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 25, 40, 0 playsewithpan SE_M_HAIL, SOUND_PAN_TARGET delay 10 createsprite gWeatherBallIceDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 25, 0, 0 playsewithpan SE_M_HAIL, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET call IceCrystalEffectShort waitforvisualfinish end Move_COUNT: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end IceCrystalEffectShort: createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 10, 20, 0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -5, 10, 0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 17, -12, 0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, -15, 15, 0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 20, 2, 0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET return IceCrystalEffectLong: createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -10, -10, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 10, 20, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -29, 0, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 29, -20, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -5, 10, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 17, -12, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -20, 0, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, -15, 15, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 26, -5, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 20, 2, 1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET return IceSpikesEffectShort: @ Unused loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 6, 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 0, 24, 0 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 8, 24, 0 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -8, 24, 0 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 16, 24, 0 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -16, 24, 0 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 24, 24, 0 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -24, 24, 0 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 32, 24, 0 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -32, 24, 0 return IceSpikesEffectLong: loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 6, 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 0, 24, 1 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 8, 24, 1 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -8, 24, 1 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 16, 24, 1 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -16, 24, 1 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 24, 24, 1 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -24, 24, 1 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 32, 24, 1 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -32, 24, 1 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 40, 24, 1 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -40, 24, 1 delay 4 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 48, 24, 1 createsprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -48, 24, 1 return GrantingStarsEffect: createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, -15, 0, 0, 0, 32, 60 delay 8 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60 delay 8 return HealingEffect: playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER createsprite gHealingBlueStarSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 0, 0 delay 7 createsprite gHealingBlueStarSpriteTemplate, ANIM_ATTACKER, 2, -15, 10, 0, 0 delay 7 createsprite gHealingBlueStarSpriteTemplate, ANIM_ATTACKER, 2, -15, -15, 0, 0 delay 7 createsprite gHealingBlueStarSpriteTemplate, ANIM_ATTACKER, 2, 10, -5, 0, 0 delay 7 return HealingEffect2: playsewithpan SE_M_ABSORB_2, SOUND_PAN_TARGET createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, 0, -5, 1, 0 delay 7 createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, -15, 10, 1, 0 delay 7 createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, -15, -15, 1, 0 delay 7 createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, 10, -5, 1, 0 delay 7 return PoisonBubblesEffect: createsprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 10, 10, 0 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET delay 6 createsprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, -20, 0 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET delay 6 createsprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, -20, 15, 0 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET delay 6 createsprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET delay 6 createsprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, -20, -20, 0 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET delay 6 createsprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 16, -8, 0 playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET return WaterBubblesEffectShort: createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, -20, 0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET return WaterBubblesEffectLong: createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -28, -10, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 27, 8, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, -20, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET delay 6 createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET return ElectricityEffect: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0 delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -5, 10, 5, 1 delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 15, 20, 5, 2 delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -15, -10, 5, 0 delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 25, 0, 5, 1 delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -8, 8, 5, 2 delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 2, -8, 5, 0 delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -20, 15, 5, 1 return ConfusionEffect: loopsewithpan SE_M_DIZZY_PUNCH, SOUND_PAN_TARGET, 13, 6 createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 0, 3, 90 createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 51, 3, 90 createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 102, 3, 90 createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 153, 3, 90 createsprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 204, 3, 90 return SetPsychicBackground: fadetobg BG_PSYCHIC waitbgfadeout createvisualtask AnimTask_SetPsychicBackground, 5 waitbgfadein return UnsetPsychicBackground: restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein return SetSkyBg: jumpifcontest SetSkyBgContest fadetobg BG_SKY waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, -2304, 768, 1, -1 SetSkyBgContinue: waitbgfadein return SetSkyBgContest: fadetobg BG_SKY_CONTESTS waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 5, 2304, 768, 0, -1 goto SetSkyBgContinue UnsetSkyBg: restorebg waitbgfadeout setarg 7, 0xFFFF waitbgfadein return SetSolarBeamBg: createvisualtask AnimTask_IsContest, 2 jumprettrue SetSolarBeamBgContest createvisualtask AnimTask_IsTargetPlayerSide, 2 jumpretfalse SetSolarBeamBgOpponent goto SetSolarBeamBgPlayer SetSolarBeamBgContinue: waitbgfadein return SetSolarBeamBgContest: fadetobg BG_SOLAR_BEAM_CONTESTS goto SetSolarBeamBgContinue SetSolarBeamBgPlayer: fadetobg BG_SOLAR_BEAM_PLAYER goto SetSolarBeamBgContinue SetSolarBeamBgOpponent: fadetobg BG_SOLAR_BEAM_OPPONENT goto SetSolarBeamBgContinue UnsetSolarBeamBg: restorebg waitbgfadein return Status_Poison: loopsewithpan SE_M_TOXIC, SOUND_PAN_TARGET, 13, 6 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 18, 2 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 12, RGB(30, 0, 31) end Status_Confusion: loadspritegfx ANIM_TAG_DUCK call ConfusionEffect end Status_Burn: loadspritegfx ANIM_TAG_SMALL_EMBER playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET call BurnFlame call BurnFlame call BurnFlame waitforvisualfinish end BurnFlame: createsprite gBurnFlameSpriteTemplate, ANIM_TARGET, 2, -24, 24, 24, 24, 20, 1, 1 delay 4 return Status_Infatuation: loadspritegfx ANIM_TAG_MAGENTA_HEART playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0, 20 delay 15 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, -20, 20 delay 15 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 20, 20 end Status_Sleep: loadspritegfx ANIM_TAG_LETTER_Z playsewithpan SE_M_SNORE, SOUND_PAN_ATTACKER createsprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0 delay 30 createsprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0 end Status_Paralysis: loadspritegfx ANIM_TAG_SPARK_2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 call ElectricityEffect end Status_Freeze: playsewithpan SE_M_ICY_WIND, 0 loadspritegfx ANIM_TAG_ICE_CUBE monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET waitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 17 createvisualtask AnimTask_FrozenIceCube, 2 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end Status_Curse: loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT monbg ANIM_DEF_PARTNER playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end Status_Nightmare: loadspritegfx ANIM_TAG_DEVIL monbg ANIM_DEF_PARTNER playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET createsprite gNightmareDevilSpriteTemplate, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end General_CastformChange: createvisualtask AnimTask_IsMonInvisible, 2 jumpreteq TRUE, CastformChangeSkipAnim goto CastformChangeContinue CastformChangeContinue: monbg ANIM_ATTACKER playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48 createvisualtask AnimTask_TransformMon, 2, 1 waitforvisualfinish clearmonbg ANIM_ATTACKER end CastformChangeSkipAnim: createvisualtask AnimTask_CastformGfxChange, 2, 1 end General_StatsChange: createvisualtask AnimTask_StatsChange, 5 waitforvisualfinish end General_SubstituteFade: monbg ANIM_ATTACKER createvisualtask AnimTask_SubstituteFadeToInvisible, 5 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 16, RGB_WHITE waitforvisualfinish delay 1 clearmonbg ANIM_ATTACKER delay 2 blendoff createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 0, RGB_WHITE createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, TRUE end General_SubstituteAppear: createvisualtask AnimTask_MonToSubstitute, 2 end General_BaitThrow: createvisualtask AnimTask_SafariOrGhost_DecideAnimSides, 2, 0 createvisualtask AnimTask_LoadBaitGfx, 2 delay 0 waitplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER, 22 createsprite gSafariBaitSpriteTemplate, ANIM_TARGET, 3, -18, 12, 0, 32 delay 50 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET, 19, 2 createvisualtask AnimTask_SwayMon, 5, 1, 8, 1536, 2, ANIM_TARGET waitforvisualfinish createvisualtask AnimTask_FreeBaitGfx, 2 end General_ItemKnockoff: loadspritegfx ANIM_TAG_ITEM_BAG createsprite gKnockOffItemSpriteTemplate, ANIM_TARGET, 2 end General_TurnTrap: createvisualtask AnimTask_GetTrappedMoveAnimId, 5 jumpargeq 0, TRAP_ANIM_FIRE_SPIN, Status_FireSpin jumpargeq 0, TRAP_ANIM_WHIRLPOOL, Status_Whirlpool jumpargeq 0, TRAP_ANIM_CLAMP, Status_Clamp jumpargeq 0, TRAP_ANIM_SAND_TOMB, Status_SandTomb goto Status_BindWrap Status_BindWrap: loadspritegfx ANIM_TAG_TENDRILS loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 6, 2 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0, 16, 0, 1 delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 1, 1 delay 3 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 delay 20 setarg 7, 0xFFFF playsewithpan SE_M_BIND, SOUND_PAN_TARGET waitforvisualfinish end Status_FireSpin: loadspritegfx ANIM_TAG_SMALL_EMBER playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 30, 1 call FireSpinEffect call FireSpinEffect waitforvisualfinish stopsound end Status_Whirlpool: loadspritegfx ANIM_TAG_WATER_ORB monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 delay 0 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(0, 13, 23) playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 30, 1 call WhirlpoolEffect call WhirlpoolEffect delay 12 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(0, 13, 23) waitforvisualfinish stopsound clearmonbg ANIM_DEF_PARTNER end Status_Clamp: loadspritegfx ANIM_TAG_CLAMP loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 2, 819, 0, 10 createsprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10 delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff waitforvisualfinish end Status_SandTomb: loadspritegfx ANIM_TAG_MUD_SAND createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(19, 17, 0) createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 30, 1 playsewithpan SE_M_SAND_TOMB, SOUND_PAN_TARGET call SandTombSwirlingDirt call SandTombSwirlingDirt delay 22 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(19, 17, 0) waitforvisualfinish stopsound end General_HeldItemEffect: loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_SPARKLE_2 delay 0 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, 128, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, 128, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, 128, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER call GrantingStarsEffect waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 3, 7, 0, RGB(17, 31, 25) createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 waitforvisualfinish end General_SmokeballEscape: loadspritegfx ANIM_TAG_PINK_CLOUD monbg ANIM_ATTACKER setalpha 12, 4 delay 0 playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_TARGET, 0, 0, 32, 28, 30 delay 4 playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 127, 2, 12, 20, 30 delay 12 playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 126, 2, -28, 4, 30 delay 12 playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 124, 2, 14, -20, 30 delay 4 playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET createvisualtask AnimTask_AttackerFadeToInvisible, 2, 2 createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 123, 3, 4, 4, 30 delay 14 playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 122, 3, -14, 18, 46 delay 0 createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 121, 3, 14, -14, 46 delay 0 createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 120, 3, -12, -10, 46 delay 0 createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 119, 3, 14, 14, 46 delay 0 createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 118, 3, 0, 0, 46 waitforvisualfinish clearmonbg ANIM_ATTACKER invisible ANIM_ATTACKER delay 0 blendoff end General_FocusBand: createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_ATTACKER, 7, 0, 9, RGB_RED playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_SlideMonForFocusBand, 5, 30, 128, 0, 1, 2, 0, 1 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_ATTACKER, 4, 9, 0, RGB_RED waitforvisualfinish delay 6 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 0, 0, 0, 15 end General_Rain: loadspritegfx ANIM_TAG_RAIN_DROPS playsewithpan SE_M_RAIN_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 2, 0, 4, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_CreateRaindrops, 2, 0, 3, 60 createvisualtask AnimTask_CreateRaindrops, 2, 0, 3, 60 delay 50 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 2, 4, 0, RGB_BLACK waitforvisualfinish end General_Sun: goto Move_SUNNY_DAY General_Sandstorm: goto Move_SANDSTORM General_Hail: goto Move_HAIL General_LeechSeedDrain: createvisualtask AnimTask_GetBattlersFromArg, 5 delay 0 goto Move_ABSORB General_MonHit: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end General_ItemSteal: loadspritegfx ANIM_TAG_ITEM_BAG createvisualtask AnimTask_SetAnimAttackerAndTargetForEffectAtk, 2 createvisualtask AnimTask_SetTargetToEffectBattler, 2 @ Redundant with above delay 1 createsprite gItemStealSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 10, 2, -1 end General_SnatchMove: loadspritegfx ANIM_TAG_ITEM_BAG createvisualtask AnimTask_SetAnimAttackerAndTargetForEffectTgt, 2 call SnatchMoveTrySwapFromSubstitute delay 1 createvisualtask AnimTask_SwayMon, 2, 0, 5, 5120, 4, ANIM_TARGET waitforvisualfinish createvisualtask AnimTask_IsTargetSameSide, 2 jumpretfalse SnatchOpposingMonMove goto SnatchPartnerMonMove SnatchMoveContinue: waitforvisualfinish call SnatchMoveTrySwapToSubstitute end SnatchOpposingMonMove: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createvisualtask AnimTask_SnatchOpposingMonMove, 2 goto SnatchMoveContinue SnatchPartnerMonMove: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createvisualtask AnimTask_SnatchPartnerMove, 2 goto SnatchMoveContinue General_FutureSightHit: createvisualtask AnimTask_SetAnimTargetToBattlerTarget, 2 monbg ANIM_DEF_PARTNER playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER call SetPsychicBackground setalpha 8, 8 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET waitplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 8 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 15, ANIM_TARGET, 1 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 24, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff waitforvisualfinish delay 1 call UnsetPsychicBackground end General_DoomDesireHit: createvisualtask AnimTask_SetAnimTargetToBattlerTarget, 2 loadspritegfx ANIM_TAG_EXPLOSION createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 16, RGB_WHITE waitforvisualfinish delay 10 createvisualtask AnimTask_DoomDesireLightBeam, 5 delay 9 playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER delay 9 playsewithpan SE_M_CONFUSE_RAY, 0 delay 9 playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET delay 25 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 1, 1 delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_WHITE waitforvisualfinish end General_FocusPunchSetUp: loadspritegfx ANIM_TAG_FOCUS_ENERGY playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect delay 8 call EndureEffect waitforvisualfinish end General_IngrainHeal: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_BLUE_STAR monbg ANIM_DEF_PARTNER setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 4, RGB(13, 31, 12) waitforvisualfinish delay 3 call AbsorbEffect waitforvisualfinish delay 15 call HealingEffect waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 4, 0, RGB(13, 31, 12) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff end General_WishHeal: loadspritegfx ANIM_TAG_BLUE_STAR loadspritegfx ANIM_TAG_SPARKLE_2 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 10, RGB_BLACK waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call GrantingStarsEffect waitforvisualfinish call HealingEffect waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 10, 0, RGB_BLACK end General_MonScared: createvisualtask AnimTask_SafariOrGhost_DecideAnimSides, 2, 1 waitforvisualfinish loadspritegfx ANIM_TAG_SWEAT_BEAD createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 10, RGB(0, 23, 25) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 10, 1 delay 20 createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0, 1 playsewithpan SE_M_SKETCH, SOUND_PAN_TARGET createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 1, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 3 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 10, 0, RGB(0, 23, 25) waitforvisualfinish end General_GhostGetOut: createvisualtask AnimTask_SafariOrGhost_DecideAnimSides, 2, 1 waitforvisualfinish fadetobg BG_GHOST waitbgfadeout monbg_static ANIM_ATTACKER createvisualtask AnimTask_GhostGetOut, 2 waitbgfadein loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 waitforvisualfinish clearmonbg_static ANIM_ATTACKER delay 1 loadspritegfx ANIM_TAG_SWEAT_BEAD createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, -1, 0, 6, RGB(21, 22, 26) createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0, 1 createsprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 1, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 3 waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, -1, 6, 0, RGB(21, 22, 26) waitforvisualfinish restorebg waitbgfadein end General_SilphScoped: monbg ANIM_ATTACKER playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48 createvisualtask AnimTask_TransformMon, 2, 255 waitsound waitforvisualfinish clearmonbg ANIM_ATTACKER end General_SafariRockThrow: createvisualtask AnimTask_SafariOrGhost_DecideAnimSides, 2, 0 waitforvisualfinish loadspritegfx ANIM_TAG_ROCKS loadspritegfx ANIM_TAG_IMPACT delay 0 waitplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER, 22 createsprite gSafariRockTemplate, ANIM_TARGET, 3, -17, 14, 8, 0 delay 50 monbg ANIM_DEF_PARTNER setalpha 12, 8 delay 0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -4, -20, 1, 2 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff waitforvisualfinish end General_SafariReaction: createvisualtask AnimTask_SafariGetReaction, 2 waitforvisualfinish jumpreteq B_MSG_MON_WATCHING, SafariReaction_WatchingCarefully jumpreteq B_MSG_MON_ANGRY, SafariReaction_Angry jumpreteq B_MSG_MON_EATING, SafariReaction_Eating end SafariReaction_WatchingCarefully: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET createvisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, 96, 0, 2 waitforvisualfinish playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET createvisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, -96, 0, 2 end SafariReaction_Angry: loadspritegfx ANIM_TAG_ANGER createsprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, 20, -20 playsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET waitforvisualfinish delay 12 createsprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, -20, -20 playsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET end SafariReaction_Eating: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET createvisualtask AnimTask_RotateMonToSideAndRestore, 2, 8, 136, 0, 2 waitforvisualfinish playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET createvisualtask AnimTask_RotateMonToSideAndRestore, 2, 8, 136, 0, 2 end SnatchMoveTrySwapFromSubstitute: createvisualtask AnimTask_IsAttackerBehindSubstitute, 2 jumprettrue SnatchMoveSwapSubstituteForMon SnatchMoveTrySwapFromSubstituteEnd: waitforvisualfinish return SnatchMoveSwapSubstituteForMon: createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, TRUE waitforvisualfinish goto SnatchMoveTrySwapFromSubstituteEnd SnatchMoveTrySwapToSubstitute: createvisualtask AnimTask_IsAttackerBehindSubstitute, 2 jumprettrue SnatchMoveSwapMonForSubstitute SnatchMoveTrySwapToSubstituteEnd: waitforvisualfinish return SnatchMoveSwapMonForSubstitute: createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, FALSE waitforvisualfinish goto SnatchMoveTrySwapToSubstituteEnd @ Healthbox blue flash effect on level up Special_LevelUp: playsewithpan SE_EXP_MAX, 0 createvisualtask AnimTask_LoadHealthboxPalsForLevelUp, 2 delay 0 createvisualtask AnimTask_FlashHealthboxOnLevelUp, 5, 0, 0 waitforvisualfinish createvisualtask AnimTask_FreeHealthboxPalsForLevelUp, 2 end Special_SwitchOutPlayerMon: createvisualtask AnimTask_SwitchOutBallEffect, 2 delay 10 createvisualtask AnimTask_SwitchOutShrinkMon, 2 end Special_SwitchOutOpponentMon: createvisualtask AnimTask_SwitchOutBallEffect, 2 delay 10 createvisualtask AnimTask_SwitchOutShrinkMon, 2 end Special_BallThrow: createvisualtask AnimTask_LoadBallGfx, 2 delay 0 playsewithpan SE_BALL_THROW, 0 createvisualtask AnimTask_ThrowBall, 2 createvisualtask AnimTask_IsBallBlockedByTrainerOrDodged, 2 jumpreteq -1, BallThrowTrainerBlock jumpreteq -2, BallThrowGhostDodged BallThrowEnd: waitforvisualfinish createvisualtask AnimTask_FreeBallGfx, 2 end BallThrowTrainerBlock: loadspritegfx ANIM_TAG_IMPACT delay 25 monbg ANIM_DEF_PARTNER setalpha 12, 8 delay 0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -4, -20, ANIM_TARGET, 2 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff goto BallThrowEnd BallThrowGhostDodged: delay 16 createvisualtask AnimTask_WindUpLunge, 2, ANIM_TARGET, 48, 6, 16, 48, -48, 16 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET waitplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET, 48 waitforvisualfinish goto BallThrowEnd Special_BallThrowWithTrainer: createvisualtask AnimTask_LoadBallGfx, 2 delay 0 createvisualtask AnimTask_ThrowBallSpecial, 2 waitforvisualfinish createvisualtask AnimTask_FreeBallGfx, 2 end Special_SubstituteToMon: createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, TRUE end Special_MonToSubstitute: createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, FALSE end ================================================ FILE: data/battle_scripts_1.s ================================================ #include "constants/global.h" #include "constants/moves.h" #include "constants/battle.h" #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" #include "constants/battle_anim.h" #include "constants/items.h" #include "constants/abilities.h" #include "constants/species.h" #include "constants/pokemon.h" #include "constants/songs.h" #include "constants/trainers.h" #include "constants/game_stat.h" #include "constants/battle_string_ids.h" .include "asm/macros/battle_script.inc" @ Define these here since misc_constants.inc conflicts with the C headers .set NULL, 0 .set FALSE, 0 .set TRUE, 1 .section script_data, "aw", %progbits .align 2 gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_HIT .4byte BattleScript_EffectSleep @ EFFECT_SLEEP .4byte BattleScript_EffectPoisonHit @ EFFECT_POISON_HIT .4byte BattleScript_EffectAbsorb @ EFFECT_ABSORB .4byte BattleScript_EffectBurnHit @ EFFECT_BURN_HIT .4byte BattleScript_EffectFreezeHit @ EFFECT_FREEZE_HIT .4byte BattleScript_EffectParalyzeHit @ EFFECT_PARALYZE_HIT .4byte BattleScript_EffectExplosion @ EFFECT_EXPLOSION .4byte BattleScript_EffectDreamEater @ EFFECT_DREAM_EATER .4byte BattleScript_EffectMirrorMove @ EFFECT_MIRROR_MOVE .4byte BattleScript_EffectAttackUp @ EFFECT_ATTACK_UP .4byte BattleScript_EffectDefenseUp @ EFFECT_DEFENSE_UP .4byte BattleScript_EffectHit @ EFFECT_SPEED_UP .4byte BattleScript_EffectSpecialAttackUp @ EFFECT_SPECIAL_ATTACK_UP .4byte BattleScript_EffectHit @ EFFECT_SPECIAL_DEFENSE_UP .4byte BattleScript_EffectHit @ EFFECT_ACCURACY_UP .4byte BattleScript_EffectEvasionUp @ EFFECT_EVASION_UP .4byte BattleScript_EffectHit @ EFFECT_ALWAYS_HIT .4byte BattleScript_EffectAttackDown @ EFFECT_ATTACK_DOWN .4byte BattleScript_EffectDefenseDown @ EFFECT_DEFENSE_DOWN .4byte BattleScript_EffectSpeedDown @ EFFECT_SPEED_DOWN .4byte BattleScript_EffectHit @ EFFECT_SPECIAL_ATTACK_DOWN .4byte BattleScript_EffectHit @ EFFECT_SPECIAL_DEFENSE_DOWN .4byte BattleScript_EffectAccuracyDown @ EFFECT_ACCURACY_DOWN .4byte BattleScript_EffectEvasionDown @ EFFECT_EVASION_DOWN .4byte BattleScript_EffectHaze @ EFFECT_HAZE .4byte BattleScript_EffectBide @ EFFECT_BIDE .4byte BattleScript_EffectRampage @ EFFECT_RAMPAGE .4byte BattleScript_EffectRoar @ EFFECT_ROAR .4byte BattleScript_EffectMultiHit @ EFFECT_MULTI_HIT .4byte BattleScript_EffectConversion @ EFFECT_CONVERSION .4byte BattleScript_EffectFlinchHit @ EFFECT_FLINCH_HIT .4byte BattleScript_EffectRestoreHp @ EFFECT_RESTORE_HP .4byte BattleScript_EffectToxic @ EFFECT_TOXIC .4byte BattleScript_EffectPayDay @ EFFECT_PAY_DAY .4byte BattleScript_EffectLightScreen @ EFFECT_LIGHT_SCREEN .4byte BattleScript_EffectTriAttack @ EFFECT_TRI_ATTACK .4byte BattleScript_EffectRest @ EFFECT_REST .4byte BattleScript_EffectOHKO @ EFFECT_OHKO .4byte BattleScript_EffectRazorWind @ EFFECT_RAZOR_WIND .4byte BattleScript_EffectSuperFang @ EFFECT_SUPER_FANG .4byte BattleScript_EffectDragonRage @ EFFECT_DRAGON_RAGE .4byte BattleScript_EffectTrap @ EFFECT_TRAP .4byte BattleScript_EffectHit @ EFFECT_HIGH_CRITICAL .4byte BattleScript_EffectDoubleHit @ EFFECT_DOUBLE_HIT .4byte BattleScript_EffectRecoilIfMiss @ EFFECT_RECOIL_IF_MISS .4byte BattleScript_EffectMist @ EFFECT_MIST .4byte BattleScript_EffectFocusEnergy @ EFFECT_FOCUS_ENERGY .4byte BattleScript_EffectRecoil @ EFFECT_RECOIL .4byte BattleScript_EffectConfuse @ EFFECT_CONFUSE .4byte BattleScript_EffectAttackUp2 @ EFFECT_ATTACK_UP_2 .4byte BattleScript_EffectDefenseUp2 @ EFFECT_DEFENSE_UP_2 .4byte BattleScript_EffectSpeedUp2 @ EFFECT_SPEED_UP_2 .4byte BattleScript_EffectSpecialAttackUp2 @ EFFECT_SPECIAL_ATTACK_UP_2 .4byte BattleScript_EffectSpecialDefenseUp2 @ EFFECT_SPECIAL_DEFENSE_UP_2 .4byte BattleScript_EffectHit @ EFFECT_ACCURACY_UP_2 .4byte BattleScript_EffectHit @ EFFECT_EVASION_UP_2 .4byte BattleScript_EffectTransform @ EFFECT_TRANSFORM .4byte BattleScript_EffectAttackDown2 @ EFFECT_ATTACK_DOWN_2 .4byte BattleScript_EffectDefenseDown2 @ EFFECT_DEFENSE_DOWN_2 .4byte BattleScript_EffectSpeedDown2 @ EFFECT_SPEED_DOWN_2 .4byte BattleScript_EffectHit @ EFFECT_SPECIAL_ATTACK_DOWN_2 .4byte BattleScript_EffectSpecialDefenseDown2 @ EFFECT_SPECIAL_DEFENSE_DOWN_2 .4byte BattleScript_EffectHit @ EFFECT_ACCURACY_DOWN_2 .4byte BattleScript_EffectHit @ EFFECT_EVASION_DOWN_2 .4byte BattleScript_EffectReflect @ EFFECT_REFLECT .4byte BattleScript_EffectPoison @ EFFECT_POISON .4byte BattleScript_EffectParalyze @ EFFECT_PARALYZE .4byte BattleScript_EffectAttackDownHit @ EFFECT_ATTACK_DOWN_HIT .4byte BattleScript_EffectDefenseDownHit @ EFFECT_DEFENSE_DOWN_HIT .4byte BattleScript_EffectSpeedDownHit @ EFFECT_SPEED_DOWN_HIT .4byte BattleScript_EffectSpecialAttackDownHit @ EFFECT_SPECIAL_ATTACK_DOWN_HIT .4byte BattleScript_EffectSpecialDefenseDownHit @ EFFECT_SPECIAL_DEFENSE_DOWN_HIT .4byte BattleScript_EffectAccuracyDownHit @ EFFECT_ACCURACY_DOWN_HIT .4byte BattleScript_EffectHit @ EFFECT_EVASION_DOWN_HIT .4byte BattleScript_EffectSkyAttack @ EFFECT_SKY_ATTACK .4byte BattleScript_EffectConfuseHit @ EFFECT_CONFUSE_HIT .4byte BattleScript_EffectTwineedle @ EFFECT_TWINEEDLE .4byte BattleScript_EffectHit @ EFFECT_VITAL_THROW .4byte BattleScript_EffectSubstitute @ EFFECT_SUBSTITUTE .4byte BattleScript_EffectRecharge @ EFFECT_RECHARGE .4byte BattleScript_EffectRage @ EFFECT_RAGE .4byte BattleScript_EffectMimic @ EFFECT_MIMIC .4byte BattleScript_EffectMetronome @ EFFECT_METRONOME .4byte BattleScript_EffectLeechSeed @ EFFECT_LEECH_SEED .4byte BattleScript_EffectSplash @ EFFECT_SPLASH .4byte BattleScript_EffectDisable @ EFFECT_DISABLE .4byte BattleScript_EffectLevelDamage @ EFFECT_LEVEL_DAMAGE .4byte BattleScript_EffectPsywave @ EFFECT_PSYWAVE .4byte BattleScript_EffectCounter @ EFFECT_COUNTER .4byte BattleScript_EffectEncore @ EFFECT_ENCORE .4byte BattleScript_EffectPainSplit @ EFFECT_PAIN_SPLIT .4byte BattleScript_EffectSnore @ EFFECT_SNORE .4byte BattleScript_EffectConversion2 @ EFFECT_CONVERSION_2 .4byte BattleScript_EffectLockOn @ EFFECT_LOCK_ON .4byte BattleScript_EffectSketch @ EFFECT_SKETCH .4byte BattleScript_EffectHit @ EFFECT_UNUSED_60 .4byte BattleScript_EffectSleepTalk @ EFFECT_SLEEP_TALK .4byte BattleScript_EffectDestinyBond @ EFFECT_DESTINY_BOND .4byte BattleScript_EffectFlail @ EFFECT_FLAIL .4byte BattleScript_EffectSpite @ EFFECT_SPITE .4byte BattleScript_EffectHit @ EFFECT_FALSE_SWIPE .4byte BattleScript_EffectHealBell @ EFFECT_HEAL_BELL .4byte BattleScript_EffectHit @ EFFECT_QUICK_ATTACK .4byte BattleScript_EffectTripleKick @ EFFECT_TRIPLE_KICK .4byte BattleScript_EffectThief @ EFFECT_THIEF .4byte BattleScript_EffectMeanLook @ EFFECT_MEAN_LOOK .4byte BattleScript_EffectNightmare @ EFFECT_NIGHTMARE .4byte BattleScript_EffectMinimize @ EFFECT_MINIMIZE .4byte BattleScript_EffectCurse @ EFFECT_CURSE .4byte BattleScript_EffectHit @ EFFECT_UNUSED_6E .4byte BattleScript_EffectProtect @ EFFECT_PROTECT .4byte BattleScript_EffectSpikes @ EFFECT_SPIKES .4byte BattleScript_EffectForesight @ EFFECT_FORESIGHT .4byte BattleScript_EffectPerishSong @ EFFECT_PERISH_SONG .4byte BattleScript_EffectSandstorm @ EFFECT_SANDSTORM .4byte BattleScript_EffectEndure @ EFFECT_ENDURE .4byte BattleScript_EffectRollout @ EFFECT_ROLLOUT .4byte BattleScript_EffectSwagger @ EFFECT_SWAGGER .4byte BattleScript_EffectFuryCutter @ EFFECT_FURY_CUTTER .4byte BattleScript_EffectAttract @ EFFECT_ATTRACT .4byte BattleScript_EffectReturn @ EFFECT_RETURN .4byte BattleScript_EffectPresent @ EFFECT_PRESENT .4byte BattleScript_EffectFrustration @ EFFECT_FRUSTRATION .4byte BattleScript_EffectSafeguard @ EFFECT_SAFEGUARD .4byte BattleScript_EffectThawHit @ EFFECT_THAW_HIT .4byte BattleScript_EffectMagnitude @ EFFECT_MAGNITUDE .4byte BattleScript_EffectBatonPass @ EFFECT_BATON_PASS .4byte BattleScript_EffectHit @ EFFECT_PURSUIT .4byte BattleScript_EffectRapidSpin @ EFFECT_RAPID_SPIN .4byte BattleScript_EffectSonicboom @ EFFECT_SONICBOOM .4byte BattleScript_EffectHit @ EFFECT_UNUSED_83 .4byte BattleScript_EffectMorningSun @ EFFECT_MORNING_SUN .4byte BattleScript_EffectSynthesis @ EFFECT_SYNTHESIS .4byte BattleScript_EffectMoonlight @ EFFECT_MOONLIGHT .4byte BattleScript_EffectHiddenPower @ EFFECT_HIDDEN_POWER .4byte BattleScript_EffectRainDance @ EFFECT_RAIN_DANCE .4byte BattleScript_EffectSunnyDay @ EFFECT_SUNNY_DAY .4byte BattleScript_EffectDefenseUpHit @ EFFECT_DEFENSE_UP_HIT .4byte BattleScript_EffectAttackUpHit @ EFFECT_ATTACK_UP_HIT .4byte BattleScript_EffectAllStatsUpHit @ EFFECT_ALL_STATS_UP_HIT .4byte BattleScript_EffectHit @ EFFECT_UNUSED_8D .4byte BattleScript_EffectBellyDrum @ EFFECT_BELLY_DRUM .4byte BattleScript_EffectPsychUp @ EFFECT_PSYCH_UP .4byte BattleScript_EffectMirrorCoat @ EFFECT_MIRROR_COAT .4byte BattleScript_EffectSkullBash @ EFFECT_SKULL_BASH .4byte BattleScript_EffectTwister @ EFFECT_TWISTER .4byte BattleScript_EffectEarthquake @ EFFECT_EARTHQUAKE .4byte BattleScript_EffectFutureSight @ EFFECT_FUTURE_SIGHT .4byte BattleScript_EffectGust @ EFFECT_GUST .4byte BattleScript_EffectStomp @ EFFECT_FLINCH_MINIMIZE_HIT .4byte BattleScript_EffectSolarBeam @ EFFECT_SOLAR_BEAM .4byte BattleScript_EffectThunder @ EFFECT_THUNDER .4byte BattleScript_EffectTeleport @ EFFECT_TELEPORT .4byte BattleScript_EffectBeatUp @ EFFECT_BEAT_UP .4byte BattleScript_EffectSemiInvulnerable @ EFFECT_SEMI_INVULNERABLE .4byte BattleScript_EffectDefenseCurl @ EFFECT_DEFENSE_CURL .4byte BattleScript_EffectSoftboiled @ EFFECT_SOFTBOILED .4byte BattleScript_EffectFakeOut @ EFFECT_FAKE_OUT .4byte BattleScript_EffectUproar @ EFFECT_UPROAR .4byte BattleScript_EffectStockpile @ EFFECT_STOCKPILE .4byte BattleScript_EffectSpitUp @ EFFECT_SPIT_UP .4byte BattleScript_EffectSwallow @ EFFECT_SWALLOW .4byte BattleScript_EffectHit @ EFFECT_UNUSED_A3 .4byte BattleScript_EffectHail @ EFFECT_HAIL .4byte BattleScript_EffectTorment @ EFFECT_TORMENT .4byte BattleScript_EffectFlatter @ EFFECT_FLATTER .4byte BattleScript_EffectWillOWisp @ EFFECT_WILL_O_WISP .4byte BattleScript_EffectMemento @ EFFECT_MEMENTO .4byte BattleScript_EffectFacade @ EFFECT_FACADE .4byte BattleScript_EffectFocusPunch @ EFFECT_FOCUS_PUNCH .4byte BattleScript_EffectSmellingsalt @ EFFECT_SMELLINGSALT .4byte BattleScript_EffectFollowMe @ EFFECT_FOLLOW_ME .4byte BattleScript_EffectNaturePower @ EFFECT_NATURE_POWER .4byte BattleScript_EffectCharge @ EFFECT_CHARGE .4byte BattleScript_EffectTaunt @ EFFECT_TAUNT .4byte BattleScript_EffectHelpingHand @ EFFECT_HELPING_HAND .4byte BattleScript_EffectTrick @ EFFECT_TRICK .4byte BattleScript_EffectRolePlay @ EFFECT_ROLE_PLAY .4byte BattleScript_EffectWish @ EFFECT_WISH .4byte BattleScript_EffectAssist @ EFFECT_ASSIST .4byte BattleScript_EffectIngrain @ EFFECT_INGRAIN .4byte BattleScript_EffectSuperpower @ EFFECT_SUPERPOWER .4byte BattleScript_EffectMagicCoat @ EFFECT_MAGIC_COAT .4byte BattleScript_EffectRecycle @ EFFECT_RECYCLE .4byte BattleScript_EffectRevenge @ EFFECT_REVENGE .4byte BattleScript_EffectBrickBreak @ EFFECT_BRICK_BREAK .4byte BattleScript_EffectYawn @ EFFECT_YAWN .4byte BattleScript_EffectKnockOff @ EFFECT_KNOCK_OFF .4byte BattleScript_EffectEndeavor @ EFFECT_ENDEAVOR .4byte BattleScript_EffectEruption @ EFFECT_ERUPTION .4byte BattleScript_EffectSkillSwap @ EFFECT_SKILL_SWAP .4byte BattleScript_EffectImprison @ EFFECT_IMPRISON .4byte BattleScript_EffectRefresh @ EFFECT_REFRESH .4byte BattleScript_EffectGrudge @ EFFECT_GRUDGE .4byte BattleScript_EffectSnatch @ EFFECT_SNATCH .4byte BattleScript_EffectLowKick @ EFFECT_LOW_KICK .4byte BattleScript_EffectSecretPower @ EFFECT_SECRET_POWER .4byte BattleScript_EffectDoubleEdge @ EFFECT_DOUBLE_EDGE .4byte BattleScript_EffectTeeterDance @ EFFECT_TEETER_DANCE .4byte BattleScript_EffectBurnHit @ EFFECT_BLAZE_KICK .4byte BattleScript_EffectMudSport @ EFFECT_MUD_SPORT .4byte BattleScript_EffectPoisonFang @ EFFECT_POISON_FANG .4byte BattleScript_EffectWeatherBall @ EFFECT_WEATHER_BALL .4byte BattleScript_EffectOverheat @ EFFECT_OVERHEAT .4byte BattleScript_EffectTickle @ EFFECT_TICKLE .4byte BattleScript_EffectCosmicPower @ EFFECT_COSMIC_POWER .4byte BattleScript_EffectSkyUppercut @ EFFECT_SKY_UPPERCUT .4byte BattleScript_EffectBulkUp @ EFFECT_BULK_UP .4byte BattleScript_EffectPoisonHit @ EFFECT_POISON_TAIL .4byte BattleScript_EffectWaterSport @ EFFECT_WATER_SPORT .4byte BattleScript_EffectCalmMind @ EFFECT_CALM_MIND .4byte BattleScript_EffectDragonDance @ EFFECT_DRAGON_DANCE .4byte BattleScript_EffectCamouflage @ EFFECT_CAMOUFLAGE BattleScript_EffectHit:: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER setbyte sDMG_MULTIPLIER, 2 BattleScript_HitFromAtkCanceler:: attackcanceler BattleScript_HitFromAccCheck:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE BattleScript_HitFromAtkString:: attackstring ppreduce BattleScript_HitFromCritCalc:: critcalc damagecalc typecalc adjustnormaldamage BattleScript_HitFromAtkAnimation:: attackanimation waitanimation effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG seteffectwithchance tryfaintmon BS_TARGET BattleScript_MoveEnd:: moveendall end BattleScript_MakeMoveMissed:: orbyte gMoveResultFlags, MOVE_RESULT_MISSED BattleScript_PrintMoveMissed:: attackstring ppreduce BattleScript_MoveMissedPause:: pause B_WAIT_TIME_SHORT BattleScript_MoveMissed:: effectivenesssound resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSleep:: attackcanceler attackstring ppreduce jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_AlreadyAsleep jumpifcantmakeasleep BattleScript_CantMakeAsleep jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_SLEEP seteffectprimary goto BattleScript_MoveEnd BattleScript_AlreadyAsleep:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYASLEEP waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_WasntAffected:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNWASNTAFFECTED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_CantMakeAsleep:: pause B_WAIT_TIME_SHORT printfromtable gUproarAwakeStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectPoisonHit:: setmoveeffect MOVE_EFFECT_POISON goto BattleScript_EffectHit BattleScript_EffectAbsorb:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce critcalc damagecalc typecalc adjustnormaldamage attackanimation waitanimation effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG negativedamage orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_AbsorbLiquidOoze setbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB goto BattleScript_AbsorbUpdateHp BattleScript_AbsorbLiquidOoze:: manipulatedamage DMG_CHANGE_SIGN setbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB_OOZE BattleScript_AbsorbUpdateHp:: healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER jumpifmovehadnoeffect BattleScript_AbsorbTryFainting printfromtable gAbsorbDrainStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AbsorbTryFainting:: tryfaintmon BS_ATTACKER tryfaintmon BS_TARGET goto BattleScript_MoveEnd BattleScript_EffectBurnHit:: setmoveeffect MOVE_EFFECT_BURN goto BattleScript_EffectHit BattleScript_EffectFreezeHit:: setmoveeffect MOVE_EFFECT_FREEZE goto BattleScript_EffectHit BattleScript_EffectParalyzeHit:: setmoveeffect MOVE_EFFECT_PARALYSIS goto BattleScript_EffectHit BattleScript_EffectExplosion:: attackcanceler attackstring ppreduce @ Below jumps to BattleScript_DampStopsExplosion if it fails (only way it can) tryexplosion setatkhptozero waitstate jumpifbyte CMP_NO_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_MISSED, BattleScript_ExplosionDoAnimStartLoop call BattleScript_PreserveMissedBitDoMoveAnim goto BattleScript_ExplosionLoop BattleScript_ExplosionDoAnimStartLoop: attackanimation waitanimation BattleScript_ExplosionLoop: movevaluescleanup critcalc damagecalc typecalc adjustnormaldamage accuracycheck BattleScript_ExplosionMissed, ACC_CURR_MOVE effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_ExplosionLoop tryfaintmon BS_ATTACKER end BattleScript_ExplosionMissed: effectivenesssound resultmessage waitmessage B_WAIT_TIME_LONG moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_ExplosionLoop tryfaintmon BS_ATTACKER end BattleScript_PreserveMissedBitDoMoveAnim: bicbyte gMoveResultFlags, MOVE_RESULT_MISSED attackanimation waitanimation orbyte gMoveResultFlags, MOVE_RESULT_MISSED return BattleScript_EffectDreamEater:: attackcanceler jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_DreamEaterNoEffect jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_DreamEaterWorked BattleScript_DreamEaterNoEffect: attackstring ppreduce waitmessage B_WAIT_TIME_LONG goto BattleScript_WasntAffected BattleScript_DreamEaterWorked: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce critcalc damagecalc typecalc adjustnormaldamage attackanimation waitanimation effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG negativedamage orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER jumpifmovehadnoeffect BattleScript_DreamEaterTryFaintEnd printstring STRINGID_PKMNDREAMEATEN waitmessage B_WAIT_TIME_LONG BattleScript_DreamEaterTryFaintEnd: tryfaintmon BS_TARGET goto BattleScript_MoveEnd BattleScript_EffectMirrorMove:: attackcanceler attackstring pause B_WAIT_TIME_LONG trymirrormove ppreduce orbyte gMoveResultFlags, MOVE_RESULT_FAILED printstring STRINGID_MIRRORMOVEFAILED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectAttackUp:: setstatchanger STAT_ATK, 1, FALSE goto BattleScript_EffectStatUp BattleScript_EffectDefenseUp:: setstatchanger STAT_DEF, 1, FALSE goto BattleScript_EffectStatUp BattleScript_EffectSpecialAttackUp:: setstatchanger STAT_SPATK, 1, FALSE goto BattleScript_EffectStatUp BattleScript_EffectEvasionUp:: setstatchanger STAT_EVASION, 1, FALSE BattleScript_EffectStatUp:: attackcanceler BattleScript_EffectStatUpAfterAtkCanceler:: attackstring ppreduce statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpAttackAnim pause B_WAIT_TIME_SHORT goto BattleScript_StatUpPrintString BattleScript_StatUpAttackAnim:: attackanimation waitanimation BattleScript_StatUpDoAnim:: setgraphicalstatchangevalues playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 BattleScript_StatUpPrintString:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StatUpEnd:: goto BattleScript_MoveEnd BattleScript_StatUp:: playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_EffectAttackDown:: setstatchanger STAT_ATK, 1, TRUE goto BattleScript_EffectStatDown BattleScript_EffectDefenseDown:: setstatchanger STAT_DEF, 1, TRUE goto BattleScript_EffectStatDown BattleScript_EffectSpeedDown:: setstatchanger STAT_SPEED, 1, TRUE goto BattleScript_EffectStatDown BattleScript_EffectAccuracyDown:: setstatchanger STAT_ACC, 1, TRUE goto BattleScript_EffectStatDown BattleScript_EffectEvasionDown:: setstatchanger STAT_EVASION, 1, TRUE BattleScript_EffectStatDown:: attackcanceler jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StatDownEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StatDownDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StatDownEnd pause B_WAIT_TIME_SHORT goto BattleScript_StatDownPrintString BattleScript_StatDownDoAnim:: attackanimation waitanimation setgraphicalstatchangevalues playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 BattleScript_StatDownPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StatDownEnd:: goto BattleScript_MoveEnd BattleScript_StatDown:: playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_EffectHaze:: attackcanceler attackstring ppreduce attackanimation waitanimation normalisebuffs printstring STRINGID_STATCHANGESGONE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectBide:: attackcanceler attackstring ppreduce attackanimation waitanimation orword gHitMarker, HITMARKER_CHARGING setbide goto BattleScript_MoveEnd BattleScript_EffectRampage:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_EffectRampage2 ppreduce BattleScript_EffectRampage2: confuseifrepeatingattackends goto BattleScript_HitFromCritCalc BattleScript_EffectRoar:: attackcanceler attackstring ppreduce jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE forcerandomswitch BattleScript_ButItFailed BattleScript_EffectMultiHit:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce setmultihitcounter 0 initmultihitstring setbyte sMULTIHIT_EFFECT, 0 BattleScript_MultiHitLoop:: jumpifhasnohp BS_ATTACKER, BattleScript_MultiHitEnd jumpifhasnohp BS_TARGET, BattleScript_MultiHitPrintStrings jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoMultiHit jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_MultiHitPrintStrings BattleScript_DoMultiHit:: movevaluescleanup copybyte cEFFECT_CHOOSER, sMULTIHIT_EFFECT critcalc damagecalc typecalc jumpifmovehadnoeffect BattleScript_MultiHitNoMoreHits adjustnormaldamage attackanimation waitanimation effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG printstring STRINGID_EMPTYSTRING3 waitmessage 1 addbyte sMULTIHIT_STRING + 4, 1 moveendto MOVEEND_NEXT_TARGET jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_FOE_ENDURED, BattleScript_MultiHitPrintStrings decrementmultihit BattleScript_MultiHitLoop goto BattleScript_MultiHitPrintStrings BattleScript_MultiHitNoMoreHits:: pause B_WAIT_TIME_SHORT BattleScript_MultiHitPrintStrings:: resultmessage waitmessage B_WAIT_TIME_LONG jumpifmovehadnoeffect BattleScript_MultiHitEnd copyarray gBattleTextBuff1, sMULTIHIT_STRING, 6 printstring STRINGID_HITXTIMES waitmessage B_WAIT_TIME_LONG BattleScript_MultiHitEnd:: seteffectwithchance tryfaintmon BS_TARGET moveendcase MOVEEND_SYNCHRONIZE_TARGET moveendfrom MOVEEND_IMMUNITY_ABILITIES end BattleScript_EffectConversion:: attackcanceler attackstring ppreduce tryconversiontypechange BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNCHANGEDTYPE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectFlinchHit:: setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit BattleScript_EffectRestoreHp:: attackcanceler attackstring ppreduce tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER attackanimation waitanimation orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectToxic:: attackcanceler attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed jumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected jumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_TOXIC seteffectprimary resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyPoisoned:: pause B_WAIT_TIME_LONG printstring STRINGID_PKMNALREADYPOISONED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_ImmunityProtected:: copybyte gEffectBattler, gBattlerTarget setbyte cMULTISTRING_CHOOSER, B_MSG_ABILITY_PREVENTS_MOVE_STATUS call BattleScript_PSNPrevention goto BattleScript_MoveEnd BattleScript_EffectPayDay:: setmoveeffect MOVE_EFFECT_PAYDAY goto BattleScript_EffectHit BattleScript_EffectLightScreen:: attackcanceler attackstring ppreduce setlightscreen goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectTriAttack:: setmoveeffect MOVE_EFFECT_TRI_ATTACK goto BattleScript_EffectHit BattleScript_EffectRest:: attackcanceler attackstring ppreduce jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_RestIsAlreadyAsleep jumpifcantmakeasleep BattleScript_RestCantSleep trysetrest BattleScript_AlreadyAtFullHp pause B_WAIT_TIME_SHORT printfromtable gRestUsedStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER waitstate goto BattleScript_PresentHealTarget BattleScript_RestCantSleep:: pause B_WAIT_TIME_LONG printfromtable gUproarAwakeStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_RestIsAlreadyAsleep:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYASLEEP2 waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectOHKO:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON typecalc jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation tryKO BattleScript_KOFail trysetdestinybondtohappen goto BattleScript_HitFromAtkAnimation BattleScript_KOFail:: pause B_WAIT_TIME_LONG printfromtable gKOFailedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectRazorWind:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn setbyte sTWOTURN_STRINGID, B_MSG_TURN1_RAZOR_WIND call BattleScriptFirstChargingTurn goto BattleScript_MoveEnd BattleScript_TwoTurnMovesSecondTurn:: attackcanceler setmoveeffect MOVE_EFFECT_CHARGING setbyte sB_ANIM_TURN, 1 clearstatusfromeffect BS_ATTACKER orword gHitMarker, HITMARKER_NO_PPDEDUCT jumpifnotmove MOVE_SKY_ATTACK, BattleScript_HitFromAccCheck setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_HitFromAccCheck BattleScriptFirstChargingTurn:: attackcanceler printstring STRINGID_EMPTYSTRING3 ppreduce attackanimation waitanimation orword gHitMarker, HITMARKER_CHARGING setmoveeffect MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER seteffectprimary copybyte cMULTISTRING_CHOOSER, sTWOTURN_STRINGID printfromtable gFirstTurnOfTwoStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_EffectSuperFang:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE damagetohalftargethp goto BattleScript_HitFromAtkAnimation BattleScript_EffectDragonRage:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE setword gBattleMoveDamage, 40 adjustsetdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectTrap:: jumpifnotmove MOVE_WHIRLPOOL, BattleScript_DoWrapEffect jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_DoWrapEffect orword gHitMarker, HITMARKER_IGNORE_UNDERWATER setbyte sDMG_MULTIPLIER, 2 BattleScript_DoWrapEffect:: setmoveeffect MOVE_EFFECT_WRAP goto BattleScript_EffectHit BattleScript_EffectDoubleHit:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce setmultihitcounter 2 initmultihitstring setbyte sMULTIHIT_EFFECT, 0 goto BattleScript_MultiHitLoop BattleScript_EffectRecoilIfMiss:: attackcanceler accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE goto BattleScript_HitFromAtkString BattleScript_MoveMissedDoDamage:: attackstring ppreduce pause B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd printstring STRINGID_PKMNCRASHED waitmessage B_WAIT_TIME_LONG damagecalc typecalc adjustnormaldamage manipulatedamage DMG_RECOIL_FROM_MISS bicbyte gMoveResultFlags, MOVE_RESULT_MISSED orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER orbyte gMoveResultFlags, MOVE_RESULT_MISSED goto BattleScript_MoveEnd BattleScript_EffectMist:: attackcanceler attackstring ppreduce setmist attackanimation waitanimation printfromtable gMistUsedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectFocusEnergy:: attackcanceler attackstring ppreduce jumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY, BattleScript_ButItFailed setfocusenergy attackanimation waitanimation printfromtable gFocusEnergyUsedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectRecoil:: setmoveeffect MOVE_EFFECT_RECOIL_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit incrementgamestat GAME_STAT_USED_STRUGGLE goto BattleScript_EffectHit BattleScript_EffectConfuse:: attackcanceler attackstring ppreduce jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_AlreadyConfused accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_CONFUSION seteffectprimary resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyConfused:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYCONFUSED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectAttackUp2:: setstatchanger STAT_ATK, 2, FALSE goto BattleScript_EffectStatUp BattleScript_EffectDefenseUp2:: setstatchanger STAT_DEF, 2, FALSE goto BattleScript_EffectStatUp BattleScript_EffectSpeedUp2:: setstatchanger STAT_SPEED, 2, FALSE goto BattleScript_EffectStatUp BattleScript_EffectSpecialAttackUp2:: setstatchanger STAT_SPATK, 2, FALSE goto BattleScript_EffectStatUp BattleScript_EffectSpecialDefenseUp2:: setstatchanger STAT_SPDEF, 2, FALSE goto BattleScript_EffectStatUp BattleScript_EffectTransform:: attackcanceler attackstring ppreduce transformdataexecution attackanimation waitanimation printfromtable gTransformUsedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectAttackDown2:: setstatchanger STAT_ATK, 2, TRUE goto BattleScript_EffectStatDown BattleScript_EffectDefenseDown2:: setstatchanger STAT_DEF, 2, TRUE goto BattleScript_EffectStatDown BattleScript_EffectSpeedDown2:: setstatchanger STAT_SPEED, 2, TRUE goto BattleScript_EffectStatDown BattleScript_EffectSpecialDefenseDown2:: setstatchanger STAT_SPDEF, 2, TRUE goto BattleScript_EffectStatDown BattleScript_EffectReflect:: attackcanceler attackstring ppreduce setreflect BattleScript_PrintReflectLightScreenSafeguardString:: attackanimation waitanimation printfromtable gReflectLightScreenSafeguardStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectPoison:: attackcanceler attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned jumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected jumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_POISON seteffectprimary resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectParalyze:: attackcanceler attackstring ppreduce jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed typecalc jumpifmovehadnoeffect BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_PARALYSIS seteffectprimary resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyParalyzed:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNISALREADYPARALYZED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_LimberProtected:: copybyte gEffectBattler, gBattlerTarget setbyte cMULTISTRING_CHOOSER, B_MSG_ABILITY_PREVENTS_MOVE_STATUS call BattleScript_PRLZPrevention goto BattleScript_MoveEnd BattleScript_EffectAttackDownHit:: setmoveeffect MOVE_EFFECT_ATK_MINUS_1 goto BattleScript_EffectHit BattleScript_EffectDefenseDownHit:: setmoveeffect MOVE_EFFECT_DEF_MINUS_1 goto BattleScript_EffectHit BattleScript_EffectSpeedDownHit:: setmoveeffect MOVE_EFFECT_SPD_MINUS_1 goto BattleScript_EffectHit BattleScript_EffectSpecialAttackDownHit:: setmoveeffect MOVE_EFFECT_SP_ATK_MINUS_1 goto BattleScript_EffectHit BattleScript_EffectSpecialDefenseDownHit:: setmoveeffect MOVE_EFFECT_SP_DEF_MINUS_1 goto BattleScript_EffectHit BattleScript_EffectAccuracyDownHit:: setmoveeffect MOVE_EFFECT_ACC_MINUS_1 goto BattleScript_EffectHit BattleScript_EffectSkyAttack:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn setbyte sTWOTURN_STRINGID, B_MSG_TURN1_SKY_ATTACK call BattleScriptFirstChargingTurn goto BattleScript_MoveEnd BattleScript_EffectConfuseHit:: setmoveeffect MOVE_EFFECT_CONFUSION goto BattleScript_EffectHit BattleScript_EffectTwineedle:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE setbyte sMULTIHIT_EFFECT, MOVE_EFFECT_POISON attackstring ppreduce setmultihitcounter 2 initmultihitstring goto BattleScript_MultiHitLoop BattleScript_EffectSubstitute:: attackcanceler ppreduce attackstring waitstate jumpifstatus2 BS_ATTACKER, STATUS2_SUBSTITUTE, BattleScript_AlreadyHasSubstitute setsubstitute jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteAnim pause B_WAIT_TIME_SHORT goto BattleScript_SubstituteString BattleScript_SubstituteAnim:: attackanimation waitanimation healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER BattleScript_SubstituteString:: printfromtable gSubstituteUsedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyHasSubstitute:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNHASSUBSTITUTE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectRecharge:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE setmoveeffect MOVE_EFFECT_RECHARGE | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_HitFromAtkString BattleScript_MoveUsedMustRecharge:: printstring STRINGID_PKMNMUSTRECHARGE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectRage:: attackcanceler accuracycheck BattleScript_RageMiss, ACC_CURR_MOVE setmoveeffect MOVE_EFFECT_RAGE seteffectprimary setmoveeffect 0 goto BattleScript_HitFromAtkString BattleScript_RageMiss:: setmoveeffect MOVE_EFFECT_RAGE clearstatusfromeffect BS_ATTACKER goto BattleScript_PrintMoveMissed BattleScript_EffectMimic:: attackcanceler attackstring ppreduce jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON mimicattackcopy BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNLEARNEDMOVE2 waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectMetronome:: attackcanceler attackstring pause B_WAIT_TIME_SHORT attackanimation waitanimation setbyte sB_ANIM_TURN, 0 setbyte sB_ANIM_TARGETS_HIT, 0 metronome BattleScript_EffectLeechSeed:: attackcanceler attackstring pause B_WAIT_TIME_SHORT ppreduce jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed accuracycheck BattleScript_DoLeechSeed, ACC_CURR_MOVE BattleScript_DoLeechSeed:: setseeded attackanimation waitanimation printfromtable gLeechSeedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSplash:: attackcanceler attackstring ppreduce attackanimation waitanimation incrementgamestat GAME_STAT_USED_SPLASH printstring STRINGID_BUTNOTHINGHAPPENED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectDisable:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE disablelastusedattack BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNMOVEWASDISABLED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectLevelDamage:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE dmgtolevel adjustsetdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectPsywave:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE psywavedamageeffect adjustsetdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectCounter:: attackcanceler counterdamagecalculator BattleScript_ButItFailedAtkStringPpReduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce typecalc2 adjustsetdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectEncore:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce trysetencore BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNGOTENCORE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectPainSplit:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON painsplitdmgcalc BattleScript_ButItFailed attackanimation waitanimation orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER copyword gBattleMoveDamage, sPAINSPLIT_HP healthbarupdate BS_TARGET datahpupdate BS_TARGET printstring STRINGID_SHAREDPAIN waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSnore:: attackcanceler jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SnoreIsAsleep attackstring ppreduce goto BattleScript_ButItFailed BattleScript_SnoreIsAsleep:: jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoSnore printstring STRINGID_PKMNFASTASLEEP waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER BattleScript_DoSnore:: attackstring ppreduce accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_HitFromCritCalc BattleScript_EffectConversion2:: attackcanceler attackstring ppreduce settypetorandomresistance BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNCHANGEDTYPE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectLockOn:: attackcanceler attackstring ppreduce jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE setalwayshitflag attackanimation waitanimation printstring STRINGID_PKMNTOOKAIM waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSketch:: attackcanceler attackstring ppreduce jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed copymovepermanently BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSKETCHEDMOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSleepTalk:: attackcanceler jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SleepTalkIsAsleep attackstring ppreduce goto BattleScript_ButItFailed BattleScript_SleepTalkIsAsleep:: printstring STRINGID_PKMNFASTASLEEP waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER attackstring ppreduce orword gHitMarker, HITMARKER_NO_PPDEDUCT trychoosesleeptalkmove BattleScript_SleepTalkUsingMove pause B_WAIT_TIME_LONG goto BattleScript_ButItFailed BattleScript_SleepTalkUsingMove:: attackanimation waitanimation setbyte sB_ANIM_TURN, 0 setbyte sB_ANIM_TARGETS_HIT, 0 jumptocalledmove TRUE BattleScript_EffectDestinyBond:: attackcanceler attackstring ppreduce setdestinybond attackanimation waitanimation printstring STRINGID_PKMNTRYINGTOTAKEFOE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectFlail:: remaininghptopower goto BattleScript_EffectHit BattleScript_EffectSpite:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE tryspiteppreduce BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNREDUCEDPP waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectHealBell:: attackcanceler attackstring ppreduce healpartystatus waitstate attackanimation waitanimation printfromtable gPartyStatusHealStringIds waitmessage B_WAIT_TIME_LONG jumpifnotmove MOVE_HEAL_BELL, BattleScript_PartyHealEnd jumpifbyte CMP_NO_COMMON_BITS, cMULTISTRING_CHOOSER, B_MSG_BELL_SOUNDPROOF_ATTACKER, BattleScript_CheckHealBellMon2Unaffected printstring STRINGID_PKMNSXBLOCKSY waitmessage B_WAIT_TIME_LONG BattleScript_CheckHealBellMon2Unaffected:: jumpifbyte CMP_NO_COMMON_BITS, cMULTISTRING_CHOOSER, B_MSG_BELL_SOUNDPROOF_PARTNER, BattleScript_PartyHealEnd printstring STRINGID_PKMNSXBLOCKSY2 waitmessage B_WAIT_TIME_LONG BattleScript_PartyHealEnd:: updatestatusicon BS_ATTACKER_WITH_PARTNER waitstate goto BattleScript_MoveEnd BattleScript_EffectTripleKick:: attackcanceler attackstring ppreduce sethword sTRIPLE_KICK_POWER, 0 initmultihitstring setmultihit 3 BattleScript_TripleKickLoop:: jumpifhasnohp BS_ATTACKER, BattleScript_TripleKickEnd jumpifhasnohp BS_TARGET, BattleScript_TripleKickNoMoreHits jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoTripleKickAttack jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_TripleKickNoMoreHits BattleScript_DoTripleKickAttack:: accuracycheck BattleScript_TripleKickNoMoreHits, ACC_CURR_MOVE movevaluescleanup addbyte sTRIPLE_KICK_POWER, 10 addbyte sMULTIHIT_STRING + 4, 1 copyhword gDynamicBasePower, sTRIPLE_KICK_POWER critcalc damagecalc typecalc adjustnormaldamage jumpifmovehadnoeffect BattleScript_TripleKickNoMoreHits attackanimation waitanimation effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG printstring STRINGID_EMPTYSTRING3 waitmessage 1 moveendto MOVEEND_NEXT_TARGET jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_FOE_ENDURED, BattleScript_TripleKickPrintStrings decrementmultihit BattleScript_TripleKickLoop goto BattleScript_TripleKickPrintStrings BattleScript_TripleKickNoMoreHits:: pause B_WAIT_TIME_SHORT jumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0, BattleScript_TripleKickPrintStrings bicbyte gMoveResultFlags, MOVE_RESULT_MISSED BattleScript_TripleKickPrintStrings:: resultmessage waitmessage B_WAIT_TIME_LONG jumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0, BattleScript_TripleKickEnd jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TripleKickEnd copyarray gBattleTextBuff1, sMULTIHIT_STRING, 6 printstring STRINGID_HITXTIMES waitmessage B_WAIT_TIME_LONG BattleScript_TripleKickEnd:: seteffectwithchance tryfaintmon BS_TARGET moveendfrom MOVEEND_UPDATE_LAST_MOVES end BattleScript_EffectThief:: setmoveeffect MOVE_EFFECT_STEAL_ITEM goto BattleScript_EffectHit BattleScript_EffectMeanLook:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_ButItFailed jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed attackanimation waitanimation setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE seteffectprimary printstring STRINGID_TARGETCANTESCAPENOW waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectNightmare:: attackcanceler attackstring ppreduce jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed jumpifstatus2 BS_TARGET, STATUS2_NIGHTMARE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_NightmareWorked goto BattleScript_ButItFailed BattleScript_NightmareWorked:: attackanimation waitanimation setmoveeffect MOVE_EFFECT_NIGHTMARE seteffectprimary printstring STRINGID_PKMNFELLINTONIGHTMARE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectMinimize:: attackcanceler setminimize setstatchanger STAT_EVASION, 1, FALSE goto BattleScript_EffectStatUpAfterAtkCanceler BattleScript_EffectCurse:: jumpiftype2 BS_ATTACKER, TYPE_GHOST, BattleScript_GhostCurse attackcanceler attackstring ppreduce jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPEED, MIN_STAT_STAGE, BattleScript_CurseTrySpeed jumpifstat BS_ATTACKER, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_CurseTrySpeed jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_ButItFailed BattleScript_CurseTrySpeed:: copybyte gBattlerTarget, gBattlerAttacker setbyte sB_ANIM_TURN, 1 attackanimation waitanimation setstatchanger STAT_SPEED, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryAttack printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryAttack:: setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryDefense:: setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseEnd:: goto BattleScript_MoveEnd BattleScript_GhostCurse:: jumpifbytenotequal gBattlerAttacker, gBattlerTarget, BattleScript_DoGhostCurse getmovetarget BS_ATTACKER BattleScript_DoGhostCurse:: attackcanceler attackstring ppreduce jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON cursetarget BattleScript_ButItFailed orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE setbyte sB_ANIM_TURN, 0 attackanimation waitanimation healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNLAIDCURSE waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectProtect:: BattleScript_EffectEndure:: attackcanceler attackstring ppreduce setprotectlike attackanimation waitanimation printfromtable gProtectLikeUsedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSpikes:: attackcanceler trysetspikes BattleScript_ButItFailedAtkStringPpReduce attackstring ppreduce attackanimation waitanimation printstring STRINGID_SPIKESSCATTERED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectForesight:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce setforesight attackanimation waitanimation printstring STRINGID_PKMNIDENTIFIED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectPerishSong:: attackcanceler attackstring ppreduce trysetperishsong BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_FAINTINTHREE waitmessage B_WAIT_TIME_LONG setbyte sBATTLER, 0 BattleScript_PerishSongLoop:: jumpifability BS_SCRIPTING, ABILITY_SOUNDPROOF, BattleScript_PerishSongNotAffected BattleScript_PerishSongLoopIncrement:: addbyte sBATTLER, 1 jumpifbytenotequal sBATTLER, gBattlersCount, BattleScript_PerishSongLoop goto BattleScript_MoveEnd BattleScript_PerishSongNotAffected:: printstring STRINGID_PKMNSXBLOCKSY2 waitmessage B_WAIT_TIME_LONG goto BattleScript_PerishSongLoopIncrement BattleScript_EffectSandstorm:: attackcanceler attackstring ppreduce setsandstorm goto BattleScript_MoveWeatherChange BattleScript_EffectRollout:: attackcanceler attackstring jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_RolloutCheckAccuracy ppreduce BattleScript_RolloutCheckAccuracy:: accuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE BattleScript_RolloutHit:: typecalc2 rolloutdamagecalculation goto BattleScript_HitFromCritCalc BattleScript_EffectSwagger:: attackcanceler jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce jumpifconfusedandstatmaxed STAT_ATK, BattleScript_ButItFailed attackanimation waitanimation setstatchanger STAT_ATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_SwaggerTryConfuse jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SwaggerTryConfuse setgraphicalstatchangevalues playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_SwaggerTryConfuse:: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected setmoveeffect MOVE_EFFECT_CONFUSION seteffectprimary goto BattleScript_MoveEnd BattleScript_EffectFuryCutter:: attackcanceler attackstring ppreduce accuracycheck BattleScript_FuryCutterHit, ACC_CURR_MOVE BattleScript_FuryCutterHit:: furycuttercalc critcalc damagecalc typecalc jumpifmovehadnoeffect BattleScript_FuryCutterHit adjustnormaldamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectAttract:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE tryinfatuating BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNFELLINLOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectReturn:: BattleScript_EffectFrustration:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE friendshiptodamagecalculation goto BattleScript_HitFromAtkString BattleScript_EffectPresent:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce typecalc presentdamagecalculation BattleScript_EffectSafeguard:: attackcanceler attackstring ppreduce setsafeguard goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectThawHit:: setmoveeffect MOVE_EFFECT_BURN goto BattleScript_EffectHit BattleScript_EffectMagnitude:: attackcanceler attackstring ppreduce selectfirstvalidtarget magnitudedamagecalculation pause B_WAIT_TIME_SHORT printstring STRINGID_MAGNITUDESTRENGTH waitmessage B_WAIT_TIME_LONG goto BattleScript_HitsAllWithUndergroundBonusLoop BattleScript_EffectBatonPass:: attackcanceler attackstring ppreduce jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation openpartyscreen BS_ATTACKER, BattleScript_ButItFailed switchoutabilities BS_ATTACKER waitstate switchhandleorder BS_ATTACKER, 2 returntoball BS_ATTACKER getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER printstring STRINGID_SWITCHINMON switchinanim BS_ATTACKER, TRUE waitstate switchineffects BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectRapidSpin:: setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit BattleScript_EffectSonicboom:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE setword gBattleMoveDamage, 20 adjustsetdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectMorningSun:: BattleScript_EffectSynthesis:: BattleScript_EffectMoonlight:: attackcanceler attackstring ppreduce recoverbasedonsunlight BattleScript_AlreadyAtFullHp goto BattleScript_PresentHealTarget BattleScript_EffectHiddenPower:: attackcanceler hiddenpowercalc goto BattleScript_HitFromAccCheck BattleScript_EffectRainDance:: attackcanceler attackstring ppreduce setrain BattleScript_MoveWeatherChange:: attackanimation waitanimation printfromtable gMoveWeatherChangeStringIds waitmessage B_WAIT_TIME_LONG call BattleScript_WeatherFormChanges goto BattleScript_MoveEnd BattleScript_EffectSunnyDay:: attackcanceler attackstring ppreduce setsunny goto BattleScript_MoveWeatherChange BattleScript_EffectDefenseUpHit:: setmoveeffect MOVE_EFFECT_DEF_PLUS_1 | MOVE_EFFECT_AFFECTS_USER goto BattleScript_EffectHit BattleScript_EffectAttackUpHit:: setmoveeffect MOVE_EFFECT_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER goto BattleScript_EffectHit BattleScript_EffectAllStatsUpHit:: setmoveeffect MOVE_EFFECT_ALL_STATS_UP | MOVE_EFFECT_AFFECTS_USER goto BattleScript_EffectHit BattleScript_EffectBellyDrum:: attackcanceler attackstring ppreduce maxattackhalvehp BattleScript_ButItFailed orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE attackanimation waitanimation healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNCUTHPMAXEDATTACK waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectPsychUp:: attackcanceler attackstring ppreduce copyfoestats BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNCOPIEDSTATCHANGES waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectMirrorCoat:: attackcanceler mirrorcoatdamagecalculator BattleScript_ButItFailedAtkStringPpReduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce typecalc2 adjustsetdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectSkullBash:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn setbyte sTWOTURN_STRINGID, B_MSG_TURN1_SKULL_BASH call BattleScriptFirstChargingTurn setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_SkullBashEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SkullBashEnd setgraphicalstatchangevalues playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_SkullBashEnd:: goto BattleScript_MoveEnd BattleScript_EffectTwister:: jumpifnostatus3 BS_TARGET, STATUS3_ON_AIR, BattleScript_FlinchEffect orword gHitMarker, HITMARKER_IGNORE_ON_AIR setbyte sDMG_MULTIPLIER, 2 BattleScript_FlinchEffect:: setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit BattleScript_EffectEarthquake:: attackcanceler attackstring ppreduce selectfirstvalidtarget BattleScript_HitsAllWithUndergroundBonusLoop:: movevaluescleanup jumpifnostatus3 BS_TARGET, STATUS3_UNDERGROUND, BattleScript_HitsAllNoUndergroundBonus orword gHitMarker, HITMARKER_IGNORE_UNDERGROUND setbyte sDMG_MULTIPLIER, 2 goto BattleScript_DoHitAllWithUndergroundBonus BattleScript_HitsAllNoUndergroundBonus:: bicword gHitMarker, HITMARKER_IGNORE_UNDERGROUND setbyte sDMG_MULTIPLIER, 1 BattleScript_DoHitAllWithUndergroundBonus:: accuracycheck BattleScript_HitAllWithUndergroundBonusMissed, ACC_CURR_MOVE critcalc damagecalc typecalc adjustnormaldamage attackanimation waitanimation effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG printstring STRINGID_EMPTYSTRING3 waitmessage 1 tryfaintmon BS_TARGET moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_HitsAllWithUndergroundBonusLoop end BattleScript_HitAllWithUndergroundBonusMissed:: pause B_WAIT_TIME_SHORT typecalc effectivenesssound resultmessage waitmessage B_WAIT_TIME_LONG moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_HitsAllWithUndergroundBonusLoop end BattleScript_EffectFutureSight:: attackcanceler attackstring ppreduce trysetfutureattack BattleScript_ButItFailed attackanimation waitanimation printfromtable gFutureMoveUsedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectGust:: jumpifnostatus3 BS_TARGET, STATUS3_ON_AIR, BattleScript_EffectHit orword gHitMarker, HITMARKER_IGNORE_ON_AIR setbyte sDMG_MULTIPLIER, 2 goto BattleScript_EffectHit BattleScript_EffectStomp:: jumpifnostatus3 BS_TARGET, STATUS3_MINIMIZED, BattleScript_FlinchEffect setbyte sDMG_MULTIPLIER, 2 goto BattleScript_FlinchEffect BattleScript_EffectSolarBeam:: jumpifabilitypresent ABILITY_CLOUD_NINE, BattleScript_SolarBeamDecideTurn jumpifabilitypresent ABILITY_AIR_LOCK, BattleScript_SolarBeamDecideTurn jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN, BattleScript_SolarBeamOnFirstTurn BattleScript_SolarBeamDecideTurn:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn setbyte sTWOTURN_STRINGID, B_MSG_TURN1_SOLAR_BEAM call BattleScriptFirstChargingTurn goto BattleScript_MoveEnd BattleScript_SolarBeamOnFirstTurn:: orword gHitMarker, HITMARKER_CHARGING setmoveeffect MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER seteffectprimary ppreduce goto BattleScript_TwoTurnMovesSecondTurn BattleScript_EffectThunder:: setmoveeffect MOVE_EFFECT_PARALYSIS orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit BattleScript_EffectTeleport:: attackcanceler attackstring ppreduce jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_ButItFailed getifcantrunfrombattle BS_ATTACKER jumpifbyte CMP_EQUAL, gBattleCommunication, 1, BattleScript_ButItFailed jumpifbyte CMP_EQUAL, gBattleCommunication, 2, BattleScript_PrintAbilityMadeIneffective attackanimation waitanimation printstring STRINGID_PKMNFLEDFROMBATTLE waitmessage B_WAIT_TIME_LONG setbyte gBattleOutcome, B_OUTCOME_PLAYER_TELEPORTED goto BattleScript_MoveEnd BattleScript_EffectBeatUp:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring pause B_WAIT_TIME_SHORT ppreduce setbyte gBattleCommunication, 0 BattleScript_BeatUpLoop:: movevaluescleanup trydobeatup BattleScript_BeatUpEnd, BattleScript_ButItFailed printstring STRINGID_PKMNATTACK critcalc jumpifbyte CMP_NOT_EQUAL, gCritMultiplier, 2, BattleScript_BeatUpAttack manipulatedamage DMG_DOUBLED BattleScript_BeatUpAttack:: adjustnormaldamage attackanimation waitanimation effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET moveendto MOVEEND_NEXT_TARGET goto BattleScript_BeatUpLoop BattleScript_BeatUpEnd:: end BattleScript_EffectSemiInvulnerable:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_SecondTurnSemiInvulnerable jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_SecondTurnSemiInvulnerable jumpifmove MOVE_FLY, BattleScript_FirstTurnFly jumpifmove MOVE_DIVE, BattleScript_FirstTurnDive jumpifmove MOVE_BOUNCE, BattleScript_FirstTurnBounce setbyte sTWOTURN_STRINGID, B_MSG_TURN1_DIG goto BattleScript_FirstTurnSemiInvulnerable BattleScript_FirstTurnBounce:: setbyte sTWOTURN_STRINGID, B_MSG_TURN1_BOUNCE goto BattleScript_FirstTurnSemiInvulnerable BattleScript_FirstTurnDive:: setbyte sTWOTURN_STRINGID, B_MSG_TURN1_DIVE goto BattleScript_FirstTurnSemiInvulnerable BattleScript_FirstTurnFly:: setbyte sTWOTURN_STRINGID, B_MSG_TURN1_FLY BattleScript_FirstTurnSemiInvulnerable:: call BattleScriptFirstChargingTurn setsemiinvulnerablebit goto BattleScript_MoveEnd BattleScript_SecondTurnSemiInvulnerable:: attackcanceler setmoveeffect MOVE_EFFECT_CHARGING setbyte sB_ANIM_TURN, 1 clearstatusfromeffect BS_ATTACKER orword gHitMarker, HITMARKER_NO_PPDEDUCT jumpifnotmove MOVE_BOUNCE, BattleScript_SemiInvulnerableTryHit setmoveeffect MOVE_EFFECT_PARALYSIS BattleScript_SemiInvulnerableTryHit:: accuracycheck BattleScript_SemiInvulnerableMiss, ACC_CURR_MOVE clearsemiinvulnerablebit goto BattleScript_HitFromAtkString BattleScript_SemiInvulnerableMiss:: clearsemiinvulnerablebit goto BattleScript_PrintMoveMissed BattleScript_EffectDefenseCurl:: attackcanceler attackstring ppreduce setdefensecurlbit setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DefenseCurlDoStatUpAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpPrintString attackanimation waitanimation BattleScript_DefenseCurlDoStatUpAnim:: goto BattleScript_StatUpDoAnim BattleScript_EffectSoftboiled:: attackcanceler attackstring ppreduce tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET BattleScript_PresentHealTarget:: attackanimation waitanimation orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_TARGET datahpupdate BS_TARGET printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyAtFullHp:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNHPFULL waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectFakeOut:: attackcanceler jumpifnotfirstturn BattleScript_ButItFailedAtkStringPpReduce setmoveeffect MOVE_EFFECT_FLINCH | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit BattleScript_ButItFailedAtkStringPpReduce:: attackstring BattleScript_ButItFailedPpReduce:: ppreduce BattleScript_ButItFailed:: pause B_WAIT_TIME_SHORT orbyte gMoveResultFlags, MOVE_RESULT_FAILED resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_NotAffected:: pause B_WAIT_TIME_SHORT orbyte gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectUproar:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE setmoveeffect MOVE_EFFECT_UPROAR | MOVE_EFFECT_AFFECTS_USER attackstring jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_UproarHit ppreduce BattleScript_UproarHit:: nop goto BattleScript_HitFromCritCalc BattleScript_EffectStockpile:: attackcanceler attackstring ppreduce stockpile attackanimation waitanimation printfromtable gStockpileUsedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSpitUp:: attackcanceler jumpifbyte CMP_EQUAL, cMISS_TYPE, B_MSG_PROTECTED, BattleScript_SpitUpFailProtect attackstring ppreduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE stockpiletobasedamage BattleScript_SpitUpFail typecalc adjustsetdamage goto BattleScript_HitFromAtkAnimation BattleScript_SpitUpFail:: pause B_WAIT_TIME_SHORT printstring STRINGID_FAILEDTOSPITUP waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_SpitUpFailProtect:: attackstring ppreduce pause B_WAIT_TIME_LONG stockpiletobasedamage BattleScript_SpitUpFail resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSwallow:: attackcanceler attackstring ppreduce stockpiletohpheal BattleScript_SwallowFail goto BattleScript_PresentHealTarget BattleScript_SwallowFail:: pause B_WAIT_TIME_SHORT printfromtable gSwallowFailStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectHail:: attackcanceler attackstring ppreduce sethail goto BattleScript_MoveWeatherChange BattleScript_EffectTorment:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE settorment BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSUBJECTEDTOTORMENT waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectFlatter:: attackcanceler jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce jumpifconfusedandstatmaxed STAT_SPATK, BattleScript_ButItFailed attackanimation waitanimation setstatchanger STAT_SPATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_FlatterTryConfuse jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlatterTryConfuse setgraphicalstatchangevalues playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FlatterTryConfuse:: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected setmoveeffect MOVE_EFFECT_CONFUSION seteffectprimary goto BattleScript_MoveEnd BattleScript_EffectWillOWisp:: attackcanceler attackstring ppreduce jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_BURN, BattleScript_AlreadyBurned jumpiftype BS_TARGET, TYPE_FIRE, BattleScript_NotAffected jumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_BURN seteffectprimary goto BattleScript_MoveEnd BattleScript_WaterVeilPrevents:: copybyte gEffectBattler, gBattlerTarget setbyte cMULTISTRING_CHOOSER, B_MSG_ABILITY_PREVENTS_MOVE_STATUS call BattleScript_BRNPrevention goto BattleScript_MoveEnd BattleScript_AlreadyBurned:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYHASBURN waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectMemento:: attackcanceler jumpifbyte CMP_EQUAL, cMISS_TYPE, B_MSG_PROTECTED, BattleScript_MementoTargetProtect attackstring ppreduce trymemento BattleScript_ButItFailed setatkhptozero attackanimation waitanimation jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_EffectMementoPrintNoEffect setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk @ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTrySpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTrySpAtk: playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTryFaint @ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTryFaint printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTryFaint: tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectMementoPrintNoEffect: printstring STRINGID_BUTNOEFFECT waitmessage B_WAIT_TIME_LONG goto BattleScript_EffectMementoTryFaint @ If the target is protected there's no need to check the target's stats or animate, the user will just faint BattleScript_MementoTargetProtect: attackstring ppreduce trymemento BattleScript_MementoTargetProtectEnd BattleScript_MementoTargetProtectEnd: setatkhptozero pause B_WAIT_TIME_LONG effectivenesssound resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectFacade:: jumpifstatus BS_ATTACKER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, BattleScript_FacadeDoubleDmg goto BattleScript_EffectHit BattleScript_FacadeDoubleDmg:: setbyte sDMG_MULTIPLIER, 2 goto BattleScript_EffectHit BattleScript_EffectFocusPunch:: attackcanceler jumpifnodamage BattleScript_HitFromAccCheck ppreduce printstring STRINGID_PKMNLOSTFOCUS waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSmellingsalt:: jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_EffectHit setmoveeffect MOVE_EFFECT_REMOVE_PARALYSIS | MOVE_EFFECT_CERTAIN jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_SmellingsaltDoubleDmg goto BattleScript_EffectHit BattleScript_SmellingsaltDoubleDmg:: setbyte sDMG_MULTIPLIER, 2 goto BattleScript_EffectHit BattleScript_EffectFollowMe:: attackcanceler attackstring ppreduce setforcedtarget attackanimation waitanimation printstring STRINGID_PKMNCENTERATTENTION waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectNaturePower:: attackcanceler attackstring pause B_WAIT_TIME_SHORT callterrainattack printstring STRINGID_NATUREPOWERTURNEDINTO waitmessage B_WAIT_TIME_LONG return BattleScript_EffectCharge:: attackcanceler attackstring ppreduce setcharge attackanimation waitanimation printstring STRINGID_PKMNCHARGINGPOWER waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectTaunt:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE settaunt BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNFELLFORTAUNT waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectHelpingHand:: attackcanceler attackstring ppreduce trysethelpinghand BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNREADYTOHELP waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectTrick:: attackcanceler attackstring ppreduce jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE tryswapitems BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSWITCHEDITEMS waitmessage B_WAIT_TIME_LONG printfromtable gItemSwapStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectRolePlay:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON trycopyability BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNCOPIEDFOE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectWish:: attackcanceler attackstring ppreduce trywish 0, BattleScript_ButItFailed attackanimation waitanimation goto BattleScript_MoveEnd BattleScript_EffectAssist:: attackcanceler attackstring assistattackselect BattleScript_ButItFailedPpReduce attackanimation waitanimation setbyte sB_ANIM_TURN, 0 setbyte sB_ANIM_TARGETS_HIT, 0 jumptocalledmove TRUE BattleScript_EffectIngrain:: attackcanceler attackstring ppreduce trysetroots BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNPLANTEDROOTS waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSuperpower:: setmoveeffect MOVE_EFFECT_ATK_DEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit BattleScript_EffectMagicCoat:: attackcanceler trysetmagiccoat BattleScript_ButItFailedAtkStringPpReduce attackstring ppreduce attackanimation waitanimation printstring STRINGID_PKMNSHROUDEDITSELF waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectRecycle:: attackcanceler attackstring ppreduce tryrecycleitem BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_XFOUNDONEY waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectRevenge:: doubledamagedealtifdamaged goto BattleScript_EffectHit BattleScript_EffectBrickBreak:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce removelightscreenreflect critcalc damagecalc typecalc adjustnormaldamage jumpifbyte CMP_EQUAL, sB_ANIM_TURN, 0, BattleScript_BrickBreakAnim bicbyte gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE BattleScript_BrickBreakAnim:: attackanimation waitanimation jumpifbyte CMP_LESS_THAN, sB_ANIM_TURN, 2, BattleScript_BrickBreakDoHit printstring STRINGID_THEWALLSHATTERED waitmessage B_WAIT_TIME_LONG BattleScript_BrickBreakDoHit:: typecalc2 effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG seteffectwithchance tryfaintmon BS_TARGET goto BattleScript_MoveEnd BattleScript_EffectYawn:: attackcanceler attackstring ppreduce jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifcantmakeasleep BattleScript_ButItFailed setyawn BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNWASMADEDROWSY waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_PrintBankAbilityMadeIneffective:: copybyte sBATTLER, sBATTLER_WITH_ABILITY BattleScript_PrintAbilityMadeIneffective:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXMADEITINEFFECTIVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectKnockOff:: setmoveeffect MOVE_EFFECT_KNOCK_OFF goto BattleScript_EffectHit BattleScript_EffectEndeavor:: attackcanceler attackstring ppreduce setdamagetohealthdifference BattleScript_ButItFailed copyword gHpDealt, gBattleMoveDamage accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE copyword gBattleMoveDamage, gHpDealt adjustsetdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectEruption:: scaledamagebyhealthratio goto BattleScript_EffectHit BattleScript_EffectSkillSwap:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON tryswapabilities BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSWAPPEDABILITIES waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectImprison:: attackcanceler attackstring ppreduce tryimprison BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSEALEDOPPONENTMOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectRefresh:: attackcanceler attackstring ppreduce cureifburnedparalysedorpoisoned BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSTATUSNORMAL waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectGrudge:: attackcanceler attackstring ppreduce trysetgrudge BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNWANTSGRUDGE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSnatch:: attackcanceler trysetsnatch BattleScript_ButItFailedAtkStringPpReduce attackstring ppreduce attackanimation waitanimation pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNWAITSFORTARGET waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectLowKick:: attackcanceler attackstring ppreduce weightdamagecalculation accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_EffectSecretPower:: getsecretpowereffect goto BattleScript_EffectHit BattleScript_EffectDoubleEdge:: setmoveeffect MOVE_EFFECT_RECOIL_33 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit BattleScript_EffectTeeterDance:: attackcanceler attackstring ppreduce setbyte gBattlerTarget, 0 BattleScript_TeeterDanceLoop:: movevaluescleanup setmoveeffect MOVE_EFFECT_CONFUSION jumpifbyteequal gBattlerAttacker, gBattlerTarget, BattleScript_TeeterDanceLoopIncrement jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_TeeterDanceOwnTempoPrevents jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_TeeterDanceSubstitutePrevents jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_TeeterDanceAlreadyConfused accuracycheck BattleScript_TeeterDanceMissed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_TeeterDanceSafeguardProtected attackanimation waitanimation seteffectprimary resultmessage waitmessage B_WAIT_TIME_LONG BattleScript_TeeterDanceLoopIncrement:: moveendto MOVEEND_NEXT_TARGET addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_TeeterDanceLoop end BattleScript_TeeterDanceOwnTempoPrevents:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNPREVENTSCONFUSIONWITH waitmessage B_WAIT_TIME_LONG goto BattleScript_TeeterDanceLoopIncrement BattleScript_TeeterDanceSafeguardProtected:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNUSEDSAFEGUARD waitmessage B_WAIT_TIME_LONG goto BattleScript_TeeterDanceLoopIncrement BattleScript_TeeterDanceSubstitutePrevents:: pause B_WAIT_TIME_SHORT printstring STRINGID_BUTITFAILED waitmessage B_WAIT_TIME_LONG goto BattleScript_TeeterDanceLoopIncrement BattleScript_TeeterDanceAlreadyConfused:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYCONFUSED waitmessage B_WAIT_TIME_LONG goto BattleScript_TeeterDanceLoopIncrement BattleScript_TeeterDanceMissed:: resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_TeeterDanceLoopIncrement BattleScript_EffectMudSport:: BattleScript_EffectWaterSport:: attackcanceler attackstring ppreduce settypebasedhalvers BattleScript_ButItFailed attackanimation waitanimation printfromtable gSportsUsedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectPoisonFang:: setmoveeffect MOVE_EFFECT_TOXIC goto BattleScript_EffectHit BattleScript_EffectWeatherBall:: setweatherballtype goto BattleScript_EffectHit BattleScript_EffectOverheat:: setmoveeffect MOVE_EFFECT_SP_ATK_TWO_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit BattleScript_EffectTickle:: attackcanceler attackstring ppreduce jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_TickleDoMoveAnim jumpifstat BS_TARGET, CMP_EQUAL, STAT_DEF, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_TickleDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleTryLowerDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleTryLowerDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleTryLowerDef:: playstatchangeanimation BS_TARGET, BIT_DEF, STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleEnd:: goto BattleScript_MoveEnd BattleScript_CantLowerMultipleStats:: pause B_WAIT_TIME_SHORT orbyte gMoveResultFlags, MOVE_RESULT_FAILED printstring STRINGID_STATSWONTDECREASE2 waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectCosmicPower:: attackcanceler attackstring ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_CosmicPowerDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_CosmicPowerDoMoveAnim:: attackanimation waitanimation setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerEnd:: goto BattleScript_MoveEnd BattleScript_EffectSkyUppercut:: orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit BattleScript_EffectBulkUp:: attackcanceler attackstring ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_BulkUpDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_BulkUpDoMoveAnim:: attackanimation waitanimation setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpTryDef:: setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpEnd:: goto BattleScript_MoveEnd BattleScript_EffectCalmMind:: attackcanceler attackstring ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_CalmMindDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_CalmMindDoMoveAnim:: attackanimation waitanimation setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindEnd:: goto BattleScript_MoveEnd BattleScript_CantRaiseMultipleStats:: pause B_WAIT_TIME_SHORT orbyte gMoveResultFlags, MOVE_RESULT_FAILED printstring STRINGID_STATSWONTINCREASE2 waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectDragonDance:: attackcanceler attackstring ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_DragonDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_DragonDanceDoMoveAnim:: attackanimation waitanimation setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPEED, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceEnd:: goto BattleScript_MoveEnd BattleScript_EffectCamouflage:: attackcanceler attackstring ppreduce settypetoterrain BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNCHANGEDTYPE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_FaintAttacker:: playfaintcry BS_ATTACKER pause B_WAIT_TIME_LONG dofaintanimation BS_ATTACKER cleareffectsonfaint BS_ATTACKER printstring STRINGID_ATTACKERFAINTED printstring STRINGID_EMPTYSTRING3 return BattleScript_FaintTarget:: playfaintcry BS_TARGET pause B_WAIT_TIME_LONG dofaintanimation BS_TARGET cleareffectsonfaint BS_TARGET printstring STRINGID_TARGETFAINTED printstring STRINGID_EMPTYSTRING3 return BattleScript_GiveExp:: setbyte sGIVEEXP_STATE, 0 getexp BS_TARGET end2 BattleScript_HandleFaintedMon:: checkteamslost BattleScript_LinkHandleFaintedMonMultiple jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_FaintedMonEnd jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_FaintedMonTryChoose jumpifword CMP_NO_COMMON_BITS, gHitMarker, HITMARKER_PLAYER_FAINTED, BattleScript_FaintedMonTryChoose printstring STRINGID_USENEXTPKMN setbyte gBattleCommunication, 0 yesnobox jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 0, BattleScript_FaintedMonTryChoose jumpifplayerran BattleScript_FaintedMonEnd printstring STRINGID_CANTESCAPE2 BattleScript_FaintedMonTryChoose:: openpartyscreen BS_FAINTED, BattleScript_FaintedMonEnd switchhandleorder BS_FAINTED, 2 jumpifnotbattletype BATTLE_TYPE_TRAINER, BattleScript_FaintedMonSendOutNew jumpifbattletype BATTLE_TYPE_LINK, BattleScript_FaintedMonSendOutNew jumpifbattletype BATTLE_TYPE_BATTLE_TOWER, BattleScript_FaintedMonSendOutNew jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonSendOutNew jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_PLAYER_FAINTED, BattleScript_FaintedMonSendOutNew jumpifbyte CMP_EQUAL, sBATTLE_STYLE, OPTIONS_BATTLE_STYLE_SET, BattleScript_FaintedMonSendOutNew jumpifcantswitch BS_PLAYER1, BattleScript_FaintedMonSendOutNew jumpifbyte CMP_EQUAL, sBATTLE_STYLE, OPTIONS_BATTLE_STYLE_SHIFT, BattleScript_SwitchBattleStylePrintString @ Yes/No for sending out a new Pokémon when the opponent is switching printstring STRINGID_ENEMYABOUTTOSWITCHPKMN BattleScript_HandleSwitchAfterFaintingEnemyInput:: setbyte gBattleCommunication, 0 yesnobox jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 1, BattleScript_FaintedMonSendOutNew @ Player said yes, go to party screen (note optional flag, player may exit the menu instead) setatktoplayer0 openpartyscreen BS_ATTACKER | PARTY_SCREEN_OPTIONAL, BattleScript_FaintedMonSendOutNew switchhandleorder BS_ATTACKER, 2 jumpifbyte CMP_EQUAL, gBattleCommunication, PARTY_SIZE, BattleScript_FaintedMonSendOutNew @ Switch Pokémon before opponent atknameinbuff1 resetintimidatetracebits BS_ATTACKER hpthresholds2 BS_ATTACKER printstring STRINGID_RETURNMON switchoutabilities BS_ATTACKER waitstate returnatktoball waitstate drawpartystatussummary BS_ATTACKER getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER printstring STRINGID_SWITCHINMON hidepartystatussummary BS_ATTACKER switchinanim BS_ATTACKER, 0 waitstate switchineffects BS_ATTACKER resetsentmonsvalue BattleScript_FaintedMonSendOutNew:: drawpartystatussummary BS_FAINTED getswitchedmondata BS_FAINTED switchindataupdate BS_FAINTED hpthresholds BS_FAINTED printstring STRINGID_SWITCHINMON hidepartystatussummary BS_FAINTED switchinanim BS_FAINTED, FALSE waitstate resetplayerfainted switchineffects BS_FAINTED jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonEnd cancelallactions BattleScript_FaintedMonEnd:: end2 BattleScript_SwitchBattleStylePrintString:: printstring STRINGID_ENEMYABOUTTOSWITCHPKMNNOPREDICT jumpifbyte CMP_EQUAL, sBATTLE_STYLE, 1, BattleScript_HandleSwitchAfterFaintingEnemyInput BattleScript_LinkHandleFaintedMonMultiple:: openpartyscreen BS_FAINTED_LINK_MULTIPLE_1, BattleScript_LinkHandleFaintedMonMultipleStart BattleScript_LinkHandleFaintedMonMultipleStart:: switchhandleorder BS_FAINTED, 0 openpartyscreen BS_FAINTED_LINK_MULTIPLE_2, BattleScript_LinkHandleFaintedMonMultipleEnd switchhandleorder BS_FAINTED, 0 BattleScript_LinkHandleFaintedMonLoop:: switchhandleorder BS_FAINTED, 2 drawpartystatussummary BS_FAINTED getswitchedmondata BS_FAINTED switchindataupdate BS_FAINTED hpthresholds BS_FAINTED printstring STRINGID_SWITCHINMON hidepartystatussummary BS_FAINTED switchinanim BS_FAINTED, FALSE waitstate switchineffects BS_FAINTED_LINK_MULTIPLE_1 jumpifbytenotequal gBattlerFainted, gBattlersCount, BattleScript_LinkHandleFaintedMonLoop BattleScript_LinkHandleFaintedMonMultipleEnd:: end2 BattleScript_LocalTrainerBattleWon:: printstring STRINGID_PLAYERDEFEATEDTRAINER1 trainerslidein BS_ATTACKER waitstate printstring STRINGID_TRAINER1LOSETEXT getmoneyreward BattleScript_LocalTrainerBattleWonGotMoney BattleScript_LocalTrainerBattleWonGotMoney:: printstring STRINGID_PLAYERGOTMONEY waitmessage B_WAIT_TIME_LONG BattleScript_PayDayMoneyAndPickUpItems:: givepaydaymoney pickup end2 BattleScript_PickedUpItem:: printstring STRINGID_PICKUP waitmessage 0x40 return BattleScript_PickedUpItemSolo:: printstring STRINGID_PICKUPSOLO waitmessage 0x40 return BattleScript_LocalBattleLost:: jumpifbattletype BATTLE_TYPE_BATTLE_TOWER, BattleScript_EReaderOrSecretBaseTrainerEnd jumpifbattletype BATTLE_TYPE_TRAINER_TOWER, BattleScript_BattleTowerLost jumpifbattletype BATTLE_TYPE_EREADER_TRAINER, BattleScript_EReaderOrSecretBaseTrainerEnd jumpifhalfword CMP_EQUAL, gTrainerBattleOpponent_A, TRAINER_SECRET_BASE, BattleScript_EReaderOrSecretBaseTrainerEnd jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0, BattleScript_RivalBattleLost BattleScript_LocalBattleLostPrintWhiteOut:: jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd printstring STRINGID_PLAYERWHITEOUT waitmessage B_WAIT_TIME_LONG getmoneyreward BattleScript_LocalBattleLostPrintTrainersWinText printstring STRINGID_PLAYERWHITEOUT2 waitmessage B_WAIT_TIME_LONG goto BattleScript_EReaderOrSecretBaseTrainerEnd BattleScript_LocalBattleLostEnd:: printstring STRINGID_PLAYERLOSTAGAINSTENEMYTRAINER waitmessage B_WAIT_TIME_LONG getmoneyreward BattleScript_LocalBattleLostPrintTrainersWinText printstring STRINGID_PLAYERPAIDPRIZEMONEY waitmessage B_WAIT_TIME_LONG BattleScript_EReaderOrSecretBaseTrainerEnd:: end2 BattleScript_LocalBattleLostPrintTrainersWinText:: printstring STRINGID_PLAYERWHITEDOUT waitmessage B_WAIT_TIME_LONG end2 BattleScript_RivalBattleLost:: jumpifhasnohp BS_ATTACKER, BattleScript_RivalBattleLostSkipMonRecall printstring STRINGID_TRAINER1MON1COMEBACK waitmessage B_WAIT_TIME_LONG returnatktoball waitstate BattleScript_RivalBattleLostSkipMonRecall:: trainerslidein BS_ATTACKER waitstate printstring STRINGID_TRAINER1WINTEXT jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 2, BattleScript_LocalBattleLostPrintWhiteOut end2 BattleScript_BattleTowerLost:: getbattlersforrecall jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0, BattleScript_BattleTowerLostLostSkipMonRecall printfromtable gDoubleBattleRecallStrings waitmessage B_WAIT_TIME_LONG returnopponentmon1toball waitstate returnopponentmon2toball waitstate BattleScript_BattleTowerLostLostSkipMonRecall:: trainerslidein BS_ATTACKER waitstate printstring STRINGID_TRAINER1WINTEXT jumpifnotbattletype BATTLE_TYPE_DOUBLE, BattleScript_BattleTowerLostLostSkipDouble printstring STRINGID_TRAINER2WINTEXT BattleScript_BattleTowerLostLostSkipDouble:: end2 BattleScript_LinkBattleWonOrLost:: printstring STRINGID_BATTLEEND waitmessage B_WAIT_TIME_LONG endlinkbattle waitmessage B_WAIT_TIME_LONG end2 BattleScript_BattleTowerTrainerBattleWon:: printstring STRINGID_PLAYERDEFEATEDTRAINER1 trainerslidein BS_ATTACKER waitstate jumpifnotbattletype BATTLE_TYPE_TRAINER_TOWER, BattleScript_BattleTowerEtcTrainerBattleWonSkipText printstring STRINGID_TRAINER1LOSETEXT jumpifnotbattletype BATTLE_TYPE_DOUBLE, BattleScript_BattleTowerEtcTrainerBattleWonSkipText printstring STRINGID_TRAINER2LOSETEXT BattleScript_BattleTowerEtcTrainerBattleWonSkipText:: //pickup end2 BattleScript_MasterTrainerBattleWon:: printstring STRINGID_PLAYERDEFEATEDTRAINER1 trainerslidein BS_ATTACKER waitstate printstring STRINGID_TRAINER1LOSETEXT waitmessage 0x40 //pickup end2 BattleScript_SmokeBallEscape:: playanimation BS_ATTACKER, B_ANIM_SMOKEBALL_ESCAPE printstring STRINGID_PKMNFLEDUSINGITS waitmessage B_WAIT_TIME_LONG end2 BattleScript_RanAwayUsingMonAbility:: printstring STRINGID_PKMNFLEDUSING waitmessage B_WAIT_TIME_LONG end2 BattleScript_GotAwaySafely:: printstring STRINGID_GOTAWAYSAFELY waitmessage B_WAIT_TIME_LONG end2 BattleScript_WildMonFled:: printstring STRINGID_WILDPKMNFLED waitmessage B_WAIT_TIME_LONG end2 BattleScript_PrintCantRunFromTrainer:: jumpifbattletype BATTLE_TYPE_FIRST_BATTLE, BattleScript_LeftoverBirchString printstring STRINGID_NORUNNINGFROMTRAINERS end2 BattleScript_LeftoverBirchString:: printstring STRINGID_DONTLEAVEBIRCH end2 BattleScript_PrintFailedToRunString:: printfromtable gNoEscapeStringIds waitmessage B_WAIT_TIME_LONG end2 BattleScript_PrintCantEscapeFromBattle:: printselectionstringfromtable gNoEscapeStringIds endselectionscript BattleScript_PrintFullBox:: printselectionstring STRINGID_BOXISFULL endselectionscript BattleScript_ActionSwitch:: hpthresholds2 BS_ATTACKER printstring STRINGID_RETURNMON setbyte sDMG_MULTIPLIER, 2 jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_PursuitSwitchDmgSetMultihit setmultihit 1 goto BattleScript_PursuitSwitchDmgLoop BattleScript_PursuitSwitchDmgSetMultihit:: setmultihit 2 BattleScript_PursuitSwitchDmgLoop:: jumpifnopursuitswitchdmg BattleScript_DoSwitchOut swapattackerwithtarget trysetdestinybondtohappen call BattleScript_PursuitDmgOnSwitchOut swapattackerwithtarget BattleScript_DoSwitchOut:: decrementmultihit BattleScript_PursuitSwitchDmgLoop switchoutabilities BS_ATTACKER waitstate returnatktoball waitstate drawpartystatussummary BS_ATTACKER switchhandleorder BS_ATTACKER, 1 getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER printstring STRINGID_SWITCHINMON hidepartystatussummary BS_ATTACKER switchinanim BS_ATTACKER, FALSE waitstate switchineffects BS_ATTACKER moveendcase MOVEEND_IMMUNITY_ABILITIES moveendcase MOVEEND_MIRROR_MOVE end2 BattleScript_PursuitDmgOnSwitchOut:: pause B_WAIT_TIME_SHORT attackstring ppreduce critcalc damagecalc typecalc adjustnormaldamage attackanimation waitanimation effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET critmessage waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET moveendfromto MOVEEND_ON_DAMAGE_ABILITIES, MOVEEND_CHOICE_MOVE getbattlerfainted BS_TARGET jumpifbyte CMP_EQUAL, gBattleCommunication, FALSE, BattleScript_PursuitDmgOnSwitchOutRet setbyte sGIVEEXP_STATE, 0 getexp BS_TARGET BattleScript_PursuitDmgOnSwitchOutRet: return BattleScript_Pausex20:: pause B_WAIT_TIME_SHORT return BattleScript_LevelUp:: fanfare MUS_LEVEL_UP printstring STRINGID_PKMNGREWTOLV setbyte sLVLBOX_STATE, 0 drawlvlupbox handlelearnnewmove BattleScript_LearnedNewMove, BattleScript_LearnMoveReturn, TRUE goto BattleScript_AskToLearnMove BattleScript_TryLearnMoveLoop:: handlelearnnewmove BattleScript_LearnedNewMove, BattleScript_LearnMoveReturn, FALSE BattleScript_AskToLearnMove:: buffermovetolearn printstring STRINGID_TRYTOLEARNMOVE1 printstring STRINGID_TRYTOLEARNMOVE2 printstring STRINGID_TRYTOLEARNMOVE3 waitstate setbyte sLEARNMOVE_STATE, 0 yesnoboxlearnmove BattleScript_ForgotAndLearnedNewMove printstring STRINGID_STOPLEARNINGMOVE waitstate setbyte sLEARNMOVE_STATE, 0 yesnoboxstoplearningmove BattleScript_AskToLearnMove printstring STRINGID_DIDNOTLEARNMOVE goto BattleScript_TryLearnMoveLoop BattleScript_ForgotAndLearnedNewMove:: printstring STRINGID_123POOF printstring STRINGID_PKMNFORGOTMOVE printstring STRINGID_ANDELLIPSIS BattleScript_LearnedNewMove:: buffermovetolearn fanfare MUS_LEVEL_UP printstring STRINGID_PKMNLEARNEDMOVE waitmessage B_WAIT_TIME_LONG updatechoicemoveonlvlup BS_ATTACKER goto BattleScript_TryLearnMoveLoop BattleScript_LearnMoveReturn:: return BattleScript_RainContinuesOrEnds:: printfromtable gRainContinuesStringIds waitmessage B_WAIT_TIME_LONG jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_RAIN_STOPPED, BattleScript_RainContinuesOrEndsEnd playanimation BS_ATTACKER, B_ANIM_RAIN_CONTINUES BattleScript_RainContinuesOrEndsEnd:: end2 BattleScript_DamagingWeatherContinues:: printfromtable gSandstormHailContinuesStringIds waitmessage B_WAIT_TIME_LONG playanimation_var BS_ATTACKER, sB_ANIM_ARG1 setbyte gBattleCommunication, 0 BattleScript_DamagingWeatherLoop:: copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattleCommunication, 1 weatherdamage jumpifword CMP_EQUAL, gBattleMoveDamage, NULL, BattleScript_DamagingWeatherContinuesEnd printfromtable gSandstormHailDmgStringIds waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE effectivenesssound hitanimation BS_ATTACKER healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER checkteamslost BattleScript_DamagingWeatherContinuesEnd BattleScript_DamagingWeatherContinuesEnd:: jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_WeatherDamageEndedBattle addbyte gBattleCommunication, 1 jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_DamagingWeatherLoop BattleScript_WeatherDamageEndedBattle:: bicword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE end2 BattleScript_SandStormHailEnds:: printfromtable gSandstormHailEndStringIds waitmessage B_WAIT_TIME_LONG end2 BattleScript_SunlightContinues:: printstring STRINGID_SUNLIGHTSTRONG waitmessage B_WAIT_TIME_LONG playanimation BS_ATTACKER, B_ANIM_SUN_CONTINUES end2 BattleScript_SunlightFaded:: printstring STRINGID_SUNLIGHTFADED waitmessage B_WAIT_TIME_LONG end2 BattleScript_OverworldWeatherStarts:: printfromtable gWeatherStartsStringIds waitmessage B_WAIT_TIME_LONG playanimation_var BS_ATTACKER, sB_ANIM_ARG1 end3 BattleScript_SideStatusWoreOff:: printstring STRINGID_PKMNSXWOREOFF waitmessage B_WAIT_TIME_LONG end2 BattleScript_SafeguardProtected:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNUSEDSAFEGUARD waitmessage B_WAIT_TIME_LONG end2 BattleScript_SafeguardEnds:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSAFEGUARDEXPIRED waitmessage B_WAIT_TIME_LONG end2 BattleScript_LeechSeedTurnDrain:: playanimation BS_ATTACKER, B_ANIM_LEECH_SEED_DRAIN, sB_ANIM_ARG1 orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER copyword gBattleMoveDamage, gHpDealt jumpifability BS_ATTACKER, ABILITY_LIQUID_OOZE, BattleScript_LeechSeedLiquidOoze manipulatedamage 0 setbyte cMULTISTRING_CHOOSER, 3 goto BattleScript_LeechSeedTurnPrintAndUpdateHp BattleScript_LeechSeedLiquidOoze:: setbyte cMULTISTRING_CHOOSER, 4 BattleScript_LeechSeedTurnPrintAndUpdateHp:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_TARGET datahpupdate BS_TARGET printfromtable gLeechSeedStringIds waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER tryfaintmon BS_TARGET end2 BattleScript_BideStoringEnergy:: printstring STRINGID_PKMNSTORINGENERGY waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_BideAttack:: attackcanceler setmoveeffect MOVE_EFFECT_CHARGING clearstatusfromeffect BS_ATTACKER printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE copyword gBattleMoveDamage, sBIDE_DMG adjustsetdamage setbyte sB_ANIM_TURN, 1 attackanimation waitanimation effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET goto BattleScript_MoveEnd BattleScript_BideNoEnergyToAttack:: attackcanceler setmoveeffect MOVE_EFFECT_CHARGING clearstatusfromeffect BS_ATTACKER printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG goto BattleScript_ButItFailed BattleScript_SuccessForceOut:: attackanimation waitanimation switchoutabilities BS_TARGET returntoball BS_TARGET waitstate jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_TrainerBattleForceOut setbyte gBattleOutcome, B_OUTCOME_PLAYER_TELEPORTED finishaction BattleScript_TrainerBattleForceOut:: getswitchedmondata BS_TARGET switchindataupdate BS_TARGET switchinanim BS_TARGET, FALSE waitstate printstring STRINGID_PKMNWASDRAGGEDOUT switchineffects BS_TARGET goto BattleScript_MoveEnd BattleScript_MistProtected:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNPROTECTEDBYMIST waitmessage B_WAIT_TIME_LONG return BattleScript_RageIsBuilding:: printstring STRINGID_PKMNRAGEBUILDING waitmessage B_WAIT_TIME_LONG return BattleScript_MoveUsedIsDisabled:: printstring STRINGID_PKMNMOVEISDISABLED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_SelectingDisabledMove:: printselectionstring STRINGID_PKMNMOVEISDISABLED endselectionscript BattleScript_DisabledNoMore:: printstring STRINGID_PKMNMOVEDISABLEDNOMORE waitmessage B_WAIT_TIME_LONG end2 BattleScript_EncoredNoMore:: printstring STRINGID_PKMNENCOREENDED waitmessage B_WAIT_TIME_LONG end2 BattleScript_DestinyBondTakesLife:: printstring STRINGID_PKMNTOOKFOE waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER return BattleScript_SpikesOnAttacker:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER call BattleScript_PrintHurtBySpikes tryfaintmon BS_ATTACKER tryfaintmon_spikes BS_ATTACKER, BattleScript_SpikesOnAttackerFainted return BattleScript_SpikesOnAttackerFainted:: setbyte sGIVEEXP_STATE, 0 getexp BS_ATTACKER moveendall goto BattleScript_HandleFaintedMon BattleScript_SpikesOnTarget:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_TARGET datahpupdate BS_TARGET call BattleScript_PrintHurtBySpikes tryfaintmon BS_TARGET tryfaintmon_spikes BS_TARGET, BattleScript_SpikesOnTargetFainted return BattleScript_SpikesOnTargetFainted:: setbyte sGIVEEXP_STATE, 0 getexp BS_TARGET moveendall goto BattleScript_HandleFaintedMon BattleScript_SpikesOnFaintedBattler:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_FAINTED datahpupdate BS_FAINTED call BattleScript_PrintHurtBySpikes tryfaintmon BS_FAINTED tryfaintmon_spikes BS_FAINTED, BattleScript_SpikesOnFaintedBattlerFainted return BattleScript_SpikesOnFaintedBattlerFainted:: setbyte sGIVEEXP_STATE, 0 getexp BS_FAINTED moveendall goto BattleScript_HandleFaintedMon BattleScript_PrintHurtBySpikes:: printstring STRINGID_PKMNHURTBYSPIKES waitmessage B_WAIT_TIME_LONG return BattleScript_PerishSongTakesLife:: printstring STRINGID_PKMNPERISHCOUNTFELL waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER end2 BattleScript_PerishSongCountGoesDown:: printstring STRINGID_PKMNPERISHCOUNTFELL waitmessage B_WAIT_TIME_LONG end2 BattleScript_AllStatsUp:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_AllStatsUpRet BattleScript_AllStatsUpAtk:: setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpDef:: setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpeed:: setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpAtk:: setstatchanger STAT_SPATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpDef:: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpRet:: return BattleScript_RapidSpinAway:: rapidspinfree return BattleScript_WrapFree:: printstring STRINGID_PKMNGOTFREE waitmessage B_WAIT_TIME_LONG copybyte gBattlerTarget, sBATTLER return BattleScript_LeechSeedFree:: printstring STRINGID_PKMNSHEDLEECHSEED waitmessage B_WAIT_TIME_LONG return BattleScript_SpikesFree:: printstring STRINGID_PKMNBLEWAWAYSPIKES waitmessage B_WAIT_TIME_LONG return BattleScript_MonTookFutureAttack:: printstring STRINGID_PKMNTOOKATTACK waitmessage B_WAIT_TIME_LONG jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_FUTURE_SIGHT, BattleScript_CheckDoomDesireMiss accuracycheck BattleScript_FutureAttackMiss, MOVE_FUTURE_SIGHT goto BattleScript_FutureAttackAnimate BattleScript_CheckDoomDesireMiss:: accuracycheck BattleScript_FutureAttackMiss, MOVE_DOOM_DESIRE BattleScript_FutureAttackAnimate:: adjustnormaldamage2 jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_FUTURE_SIGHT, BattleScript_FutureHitAnimDoomDesire playanimation BS_ATTACKER, B_ANIM_FUTURE_SIGHT_HIT goto BattleScript_DoFutureAttackHit BattleScript_FutureHitAnimDoomDesire:: playanimation BS_ATTACKER, B_ANIM_DOOM_DESIRE_HIT BattleScript_DoFutureAttackHit:: effectivenesssound hitanimation BS_TARGET waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET checkteamslost BattleScript_FutureAttackEnd BattleScript_FutureAttackEnd:: moveendcase MOVEEND_RAGE moveendfromto MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_UPDATE_LAST_MOVES setbyte gMoveResultFlags, 0 end2 BattleScript_FutureAttackMiss:: pause B_WAIT_TIME_SHORT setbyte gMoveResultFlags, 0 orbyte gMoveResultFlags, MOVE_RESULT_FAILED resultmessage waitmessage B_WAIT_TIME_LONG setbyte gMoveResultFlags, 0 end2 BattleScript_NoMovesLeft:: printselectionstring STRINGID_PKMNHASNOMOVESLEFT endselectionscript BattleScript_SelectingMoveWithNoPP:: printselectionstring STRINGID_NOPPLEFT endselectionscript BattleScript_NoPPForMove:: attackstring pause B_WAIT_TIME_SHORT printstring STRINGID_BUTNOPPLEFT waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_SelectingTormentedMove:: printselectionstring STRINGID_PKMNCANTUSEMOVETORMENT endselectionscript printstring STRINGID_PKMNCANTUSEMOVETORMENT waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_SelectingNotAllowedMoveTaunt:: printselectionstring STRINGID_PKMNCANTUSEMOVETAUNT endselectionscript BattleScript_MoveUsedIsTaunted:: printstring STRINGID_PKMNCANTUSEMOVETAUNT waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_WishComesTrue:: trywish 1, BattleScript_WishButFullHp playanimation BS_TARGET, B_ANIM_WISH_HEAL printstring STRINGID_PKMNWISHCAMETRUE waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_TARGET datahpupdate BS_TARGET printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG end2 BattleScript_WishButFullHp:: printstring STRINGID_PKMNWISHCAMETRUE waitmessage B_WAIT_TIME_LONG pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNHPFULL waitmessage B_WAIT_TIME_LONG end2 BattleScript_IngrainTurnHeal:: playanimation BS_ATTACKER, B_ANIM_INGRAIN_HEAL printstring STRINGID_PKMNABSORBEDNUTRIENTS waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER end2 BattleScript_PrintMonIsRooted:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNANCHOREDITSELF waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AtkDefDown:: setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownAtkFail jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 2, BattleScript_AtkDefDownAtkFail printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownAtkFail:: playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_AtkDefDownDefFail jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 2, BattleScript_AtkDefDownDefFail printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownDefFail:: return BattleScript_KnockedOff:: playanimation BS_TARGET, B_ANIM_ITEM_KNOCKOFF printstring STRINGID_PKMNKNOCKEDOFF waitmessage B_WAIT_TIME_LONG return BattleScript_MoveUsedIsImprisoned:: printstring STRINGID_PKMNCANTUSEMOVESEALED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_SelectingImprisonedMove:: printselectionstring STRINGID_PKMNCANTUSEMOVESEALED endselectionscript BattleScript_GrudgeTakesPp:: printstring STRINGID_PKMNLOSTPPGRUDGE waitmessage B_WAIT_TIME_LONG return BattleScript_MagicCoatBounce:: attackstring ppreduce pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNMOVEBOUNCED waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP setmagiccoattarget BS_ATTACKER return BattleScript_SnatchedMove:: attackstring ppreduce snatchsetbattlers playanimation BS_TARGET, B_ANIM_SNATCH_MOVE printstring STRINGID_PKMNSNATCHEDMOVE waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP swapattackerwithtarget return BattleScript_EnduredMsg:: printstring STRINGID_PKMNENDUREDHIT waitmessage B_WAIT_TIME_LONG return BattleScript_OneHitKOMsg:: printstring STRINGID_ONEHITKO waitmessage B_WAIT_TIME_LONG return BattleScript_SAtkDown2:: setbyte sSTAT_ANIM_PLAYED, 0 playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_SPATK, 2, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_SAtkDown2End jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 2, BattleScript_SAtkDown2End printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_SAtkDown2End:: return BattleScript_FocusPunchSetUp:: printstring STRINGID_EMPTYSTRING3 waitmessage 1 playanimation BS_ATTACKER, B_ANIM_FOCUS_PUNCH_SETUP printstring STRINGID_PKMNTIGHTENINGFOCUS waitmessage B_WAIT_TIME_LONG end2 BattleScript_MoveUsedIsAsleep:: printstring STRINGID_PKMNFASTASLEEP waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER goto BattleScript_MoveEnd BattleScript_MoveUsedWokeUp:: bicword gHitMarker, HITMARKER_WAKE_UP_CLEAR printfromtable gWokeUpStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER return BattleScript_MonWokeUpInUproar:: printstring STRINGID_PKMNWOKEUPINUPROAR waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER end2 BattleScript_PoisonTurnDmg:: printstring STRINGID_PKMNHURTBYPOISON waitmessage B_WAIT_TIME_LONG BattleScript_DoStatusTurnDmg:: statusanimation BS_ATTACKER BattleScript_DoTurnDmg:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER checkteamslost BattleScript_DoTurnDmgEnd BattleScript_DoTurnDmgEnd:: end2 BattleScript_BurnTurnDmg:: printstring STRINGID_PKMNHURTBYBURN waitmessage B_WAIT_TIME_LONG goto BattleScript_DoStatusTurnDmg BattleScript_MoveUsedIsFrozen:: printstring STRINGID_PKMNISFROZEN waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER goto BattleScript_MoveEnd BattleScript_MoveUsedUnfroze:: printfromtable gGotDefrostedStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER return BattleScript_DefrostedViaFireMove:: printstring STRINGID_PKMNWASDEFROSTED waitmessage B_WAIT_TIME_LONG updatestatusicon BS_TARGET return BattleScript_MoveUsedIsParalyzed:: printstring STRINGID_PKMNISPARALYZED waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER cancelmultiturnmoves BS_ATTACKER goto BattleScript_MoveEnd BattleScript_MoveUsedFlinched:: printstring STRINGID_PKMNFLINCHED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_PrintUproarOverTurns:: printfromtable gUproarOverTurnStringIds waitmessage B_WAIT_TIME_LONG end2 BattleScript_ThrashConfuses:: chosenstatus2animation BS_ATTACKER, STATUS2_CONFUSION printstring STRINGID_PKMNFATIGUECONFUSION waitmessage B_WAIT_TIME_LONG end2 BattleScript_MoveUsedIsConfused:: printstring STRINGID_PKMNISCONFUSED waitmessage B_WAIT_TIME_LONG status2animation BS_ATTACKER, STATUS2_CONFUSION jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, FALSE, BattleScript_MoveUsedIsConfusedRet BattleScript_DoSelfConfusionDmg:: cancelmultiturnmoves BS_ATTACKER adjustnormaldamage2 printstring STRINGID_ITHURTCONFUSION waitmessage B_WAIT_TIME_LONG effectivenesssound hitanimation BS_ATTACKER waitstate orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_MoveUsedIsConfusedRet:: return BattleScript_MoveUsedIsConfusedNoMore:: printstring STRINGID_PKMNHEALEDCONFUSION waitmessage B_WAIT_TIME_LONG return BattleScript_PrintPayDayMoneyString:: printstring STRINGID_PLAYERPICKEDUPMONEY waitmessage B_WAIT_TIME_LONG return BattleScript_WrapTurnDmg:: playanimation BS_ATTACKER, B_ANIM_TURN_TRAP, sB_ANIM_ARG1 printstring STRINGID_PKMNHURTBY waitmessage B_WAIT_TIME_LONG goto BattleScript_DoTurnDmg BattleScript_WrapEnds:: printstring STRINGID_PKMNFREEDFROM waitmessage B_WAIT_TIME_LONG end2 BattleScript_MoveUsedIsInLove:: printstring STRINGID_PKMNINLOVE waitmessage B_WAIT_TIME_LONG status2animation BS_ATTACKER, STATUS2_INFATUATION return BattleScript_MoveUsedIsInLoveCantAttack:: printstring STRINGID_PKMNIMMOBILIZEDBYLOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_NightmareTurnDmg:: printstring STRINGID_PKMNLOCKEDINNIGHTMARE waitmessage B_WAIT_TIME_LONG status2animation BS_ATTACKER, STATUS2_NIGHTMARE goto BattleScript_DoTurnDmg BattleScript_CurseTurnDmg:: printstring STRINGID_PKMNAFFLICTEDBYCURSE waitmessage B_WAIT_TIME_LONG status2animation BS_ATTACKER, STATUS2_CURSED goto BattleScript_DoTurnDmg BattleScript_TargetPRLZHeal:: printstring STRINGID_PKMNHEALEDPARALYSIS waitmessage B_WAIT_TIME_LONG updatestatusicon BS_TARGET return BattleScript_TooScaredToMove:: printstring STRINGID_MONTOOSCAREDTOMOVE waitmessage B_WAIT_TIME_LONG playanimation BS_ATTACKER, B_ANIM_MON_SCARED goto BattleScript_MoveEnd BattleScript_GhostGetOutGetOut:: printstring STRINGID_GHOSTGETOUTGETOUT playanimation BS_ATTACKER, B_ANIM_GHOST_GET_OUT goto BattleScript_MoveEnd BattleScript_SilphScopeUnveiled:: pause B_WAIT_TIME_SHORT_UNSKIPPABLE printstring STRINGID_SILPHSCOPEUNVEILED waitstate playanimation BS_OPPONENT1, B_ANIM_SILPH_SCOPED pause B_WAIT_TIME_SHORT printstring STRINGID_GHOSTWASMAROWAK waitmessage B_WAIT_TIME_LONG end2 BattleScript_MoveEffectSleep:: statusanimation BS_EFFECT_BATTLER printfromtable gFellAsleepStringIds waitmessage B_WAIT_TIME_LONG BattleScript_UpdateEffectStatusIconRet:: updatestatusicon BS_EFFECT_BATTLER waitstate return BattleScript_YawnMakesAsleep:: statusanimation BS_EFFECT_BATTLER printstring STRINGID_PKMNFELLASLEEP waitmessage B_WAIT_TIME_LONG updatestatusicon BS_EFFECT_BATTLER waitstate makevisible BS_EFFECT_BATTLER end2 BattleScript_MoveEffectPoison:: statusanimation BS_EFFECT_BATTLER printfromtable gGotPoisonedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_UpdateEffectStatusIconRet BattleScript_MoveEffectBurn:: statusanimation BS_EFFECT_BATTLER printfromtable gGotBurnedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_UpdateEffectStatusIconRet BattleScript_MoveEffectFreeze:: statusanimation BS_EFFECT_BATTLER printfromtable gGotFrozenStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_UpdateEffectStatusIconRet BattleScript_MoveEffectParalysis:: statusanimation BS_EFFECT_BATTLER printfromtable gGotParalyzedStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_UpdateEffectStatusIconRet BattleScript_MoveEffectUproar:: printstring STRINGID_PKMNCAUSEDUPROAR waitmessage B_WAIT_TIME_LONG return BattleScript_MoveEffectToxic:: statusanimation BS_EFFECT_BATTLER printstring STRINGID_PKMNBADLYPOISONED waitmessage B_WAIT_TIME_LONG goto BattleScript_UpdateEffectStatusIconRet BattleScript_MoveEffectPayDay:: printstring STRINGID_COINSSCATTERED waitmessage B_WAIT_TIME_LONG return BattleScript_MoveEffectWrap:: printfromtable gWrappedStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_MoveEffectConfusion:: chosenstatus2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION printstring STRINGID_PKMNWASCONFUSED waitmessage B_WAIT_TIME_LONG return BattleScript_MoveEffectRecoil:: jumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd BattleScript_DoRecoil:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNHITWITHRECOIL waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER BattleScript_RecoilEnd:: return BattleScript_ItemSteal:: playanimation BS_TARGET, B_ANIM_ITEM_STEAL printstring STRINGID_PKMNSTOLEITEM waitmessage B_WAIT_TIME_LONG return BattleScript_DrizzleActivates:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNMADEITRAIN waitstate playanimation BS_BATTLER_0, B_ANIM_RAIN_CONTINUES call BattleScript_WeatherFormChanges end3 BattleScript_SpeedBoostActivates:: playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printstring STRINGID_PKMNRAISEDSPEED waitmessage B_WAIT_TIME_LONG end3 BattleScript_TraceActivates:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNTRACED waitmessage B_WAIT_TIME_LONG end3 BattleScript_RainDishActivates:: printstring STRINGID_PKMNSXRESTOREDHPALITTLE2 waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER end3 BattleScript_SandstreamActivates:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXWHIPPEDUPSANDSTORM waitstate playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES call BattleScript_WeatherFormChanges end3 BattleScript_ShedSkinActivates:: printstring STRINGID_PKMNSXCUREDYPROBLEM waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER end3 BattleScript_WeatherFormChanges:: setbyte sBATTLER, 0 BattleScript_WeatherFormChangesLoop:: trycastformdatachange addbyte sBATTLER, 1 jumpifbytenotequal sBATTLER, gBattlersCount, BattleScript_WeatherFormChangesLoop return BattleScript_CastformChange:: call BattleScript_DoCastformChangeAnim end3 BattleScript_DoCastformChangeAnim:: docastformchangeanimation waitstate printstring STRINGID_PKMNTRANSFORMED waitmessage B_WAIT_TIME_LONG return BattleScript_IntimidateActivatesEnd3:: call BattleScript_DoIntimidateActivationAnim end3 BattleScript_DoIntimidateActivationAnim:: pause B_WAIT_TIME_SHORT BattleScript_IntimidateActivates:: setbyte gBattlerTarget, 0 setstatchanger STAT_ATK, 1, TRUE BattleScript_IntimidateActivationAnimLoop:: trygetintimidatetarget BattleScript_IntimidateEnd jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_IntimidateFail jumpifability BS_TARGET, ABILITY_CLEAR_BODY, BattleScript_IntimidateAbilityFail jumpifability BS_TARGET, ABILITY_HYPER_CUTTER, BattleScript_IntimidateAbilityFail jumpifability BS_TARGET, ABILITY_WHITE_SMOKE, BattleScript_IntimidateAbilityFail statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_IntimidateFail jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, 1, BattleScript_IntimidateFail setgraphicalstatchangevalues playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printstring STRINGID_PKMNCUTSATTACKWITH waitmessage B_WAIT_TIME_LONG BattleScript_IntimidateFail:: addbyte gBattlerTarget, 1 goto BattleScript_IntimidateActivationAnimLoop BattleScript_IntimidateEnd:: return BattleScript_IntimidateAbilityFail:: pause B_WAIT_TIME_SHORT printstring STRINGID_PREVENTEDFROMWORKING waitmessage B_WAIT_TIME_LONG goto BattleScript_IntimidateFail BattleScript_DroughtActivates:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXINTENSIFIEDSUN waitstate playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES call BattleScript_WeatherFormChanges end3 BattleScript_TookAttack:: attackstring pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXTOOKATTACK waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED return BattleScript_SturdyPreventsOHKO:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNPROTECTEDBY pause B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_DampStopsExplosion:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNPREVENTSUSAGE pause B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_MoveHPDrain_PPLoss:: ppreduce BattleScript_MoveHPDrain:: attackstring pause B_WAIT_TIME_SHORT orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_TARGET datahpupdate BS_TARGET printstring STRINGID_PKMNRESTOREDHPUSING waitmessage B_WAIT_TIME_LONG orbyte gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd BattleScript_MonMadeMoveUseless_PPLoss:: ppreduce BattleScript_MonMadeMoveUseless:: attackstring pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXMADEYUSELESS waitmessage B_WAIT_TIME_LONG orbyte gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd BattleScript_FlashFireBoost_PPLoss:: ppreduce BattleScript_FlashFireBoost:: attackstring pause B_WAIT_TIME_SHORT printfromtable gFlashFireStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AbilityPreventsPhasingOut:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNANCHORSITSELFWITH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AbilityNoStatLoss:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNPREVENTSSTATLOSSWITH waitmessage B_WAIT_TIME_LONG return BattleScript_BRNPrevention:: pause B_WAIT_TIME_SHORT printfromtable gBRNPreventionStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_PRLZPrevention:: pause B_WAIT_TIME_SHORT printfromtable gPRLZPreventionStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_PSNPrevention:: pause B_WAIT_TIME_SHORT printfromtable gPSNPreventionStringIds waitmessage B_WAIT_TIME_LONG return BattleScript_ObliviousPreventsAttraction:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNPREVENTSROMANCEWITH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_FlinchPrevention:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXPREVENTSFLINCHING waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_OwnTempoPrevents:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNPREVENTSCONFUSIONWITH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_SoundproofProtected:: attackstring ppreduce pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXBLOCKSY waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AbilityNoSpecificStatLoss:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXPREVENTSYLOSS waitmessage B_WAIT_TIME_LONG setbyte cMULTISTRING_CHOOSER, 3 return BattleScript_StickyHoldActivates:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXMADEYINEFFECTIVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_ColorChangeActivates:: printstring STRINGID_PKMNCHANGEDTYPEWITH waitmessage B_WAIT_TIME_LONG return BattleScript_RoughSkinActivates:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNHURTSWITH waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER return BattleScript_CuteCharmActivates:: status2animation BS_ATTACKER, STATUS2_INFATUATION printstring STRINGID_PKMNSXINFATUATEDY waitmessage B_WAIT_TIME_LONG return BattleScript_ApplySecondaryEffect:: waitstate seteffectsecondary return BattleScript_SynchronizeActivates:: waitstate seteffectprimary return BattleScript_AbilityCuredStatus:: printstring STRINGID_PKMNSXCUREDITSYPROBLEM waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING return BattleScript_IgnoresWhileAsleep:: printstring STRINGID_PKMNIGNORESASLEEP waitmessage B_WAIT_TIME_LONG moveendto MOVEEND_NEXT_TARGET end BattleScript_IgnoresAndUsesRandomMove:: printstring STRINGID_PKMNIGNOREDORDERS waitmessage B_WAIT_TIME_LONG jumptocalledmove 0 BattleScript_MoveUsedLoafingAround:: printfromtable gInobedientStringIds waitmessage B_WAIT_TIME_LONG moveendto MOVEEND_NEXT_TARGET end BattleScript_IgnoresAndFallsAsleep:: printstring STRINGID_PKMNBEGANTONAP waitmessage B_WAIT_TIME_LONG setmoveeffect MOVE_EFFECT_SLEEP | MOVE_EFFECT_AFFECTS_USER seteffectprimary moveendto MOVEEND_NEXT_TARGET end BattleScript_IgnoresAndHitsItself:: printstring STRINGID_PKMNWONTOBEY waitmessage B_WAIT_TIME_LONG goto BattleScript_DoSelfConfusionDmg BattleScript_SubstituteFade:: playanimation BS_TARGET, B_ANIM_SUBSTITUTE_FADE printstring STRINGID_PKMNSUBSTITUTEFADED return BattleScript_BerryCurePrlzEnd2:: call BattleScript_BerryCureParRet end2 BattleScript_BerryCureParRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMCUREDPARALYSIS waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING return BattleScript_BerryCurePsnEnd2:: call BattleScript_BerryCurePsnRet end2 BattleScript_BerryCurePsnRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMCUREDPOISON waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING return BattleScript_BerryCureBrnEnd2:: call BattleScript_BerryCureBrnRet end2 BattleScript_BerryCureBrnRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMHEALEDBURN waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING return BattleScript_BerryCureFrzEnd2:: call BattleScript_BerryCureFrzRet end2 BattleScript_BerryCureFrzRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMDEFROSTEDIT waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING return BattleScript_BerryCureSlpEnd2:: call BattleScript_BerryCureSlpRet end2 BattleScript_BerryCureSlpRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMWOKEIT waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING return BattleScript_BerryCureConfusionEnd2:: call BattleScript_BerryCureConfusionRet end2 BattleScript_BerryCureConfusionRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMSNAPPEDOUT waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING return BattleScript_BerryCureChosenStatusEnd2:: call BattleScript_BerryCureChosenStatusRet end2 BattleScript_BerryCureChosenStatusRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printfromtable gBerryEffectStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING return BattleScript_WhiteHerbEnd2:: call BattleScript_WhiteHerbRet end2 BattleScript_WhiteHerbRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDSTATUS waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING return BattleScript_ItemHealHP_RemoveItem:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER removeitem BS_ATTACKER end2 BattleScript_BerryPPHealEnd2:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDPP waitmessage B_WAIT_TIME_LONG removeitem BS_ATTACKER end2 BattleScript_ItemHealHP_End2:: call BattleScript_ItemHealHP_Ret end2 BattleScript_ItemHealHP_Ret:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHPALITTLE waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER return BattleScript_SelectingNotAllowedMoveChoiceItem:: printselectionstring STRINGID_ITEMALLOWSONLYYMOVE endselectionscript BattleScript_FocusBandActivates:: playanimation BS_TARGET, B_ANIM_FOCUS_BAND printstring STRINGID_PKMNHUNGONWITHX waitmessage B_WAIT_TIME_LONG return BattleScript_BerryConfuseHealEnd2:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_FORXCOMMAYZ waitmessage B_WAIT_TIME_LONG setmoveeffect MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER seteffectprimary removeitem BS_ATTACKER end2 BattleScript_BerryStatRaiseEnd2:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BerryStatRaiseDoStatUp BattleScript_BerryStatRaiseDoStatUp:: setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM call BattleScript_StatUp removeitem BS_ATTACKER end2 BattleScript_BerryFocusEnergyEnd2:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNUSEDXTOGETPUMPED waitmessage B_WAIT_TIME_LONG removeitem BS_ATTACKER end2 BattleScript_ActionSelectionItemsCantBeUsed:: printselectionstring STRINGID_ITEMSCANTBEUSEDNOW endselectionscript BattleScript_FlushMessageBox:: printstring STRINGID_EMPTYSTRING3 return ================================================ FILE: data/battle_scripts_2.s ================================================ #include "constants/moves.h" #include "constants/battle.h" #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" #include "constants/battle_anim.h" #include "constants/items.h" #include "constants/abilities.h" #include "constants/species.h" #include "constants/pokemon.h" #include "constants/songs.h" #include "constants/game_stat.h" #include "constants/battle_string_ids.h" .include "asm/macros/battle_script.inc" @ Define these here since misc_constants.inc conflicts with the C headers .set NULL, 0 .set FALSE, 0 .set TRUE, 1 .section script_data, "aw", %progbits .align 2 gBattlescriptsForBallThrow:: .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowSafariBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall .4byte BattleScript_ThrowBall gBattlescriptsForUsingItem:: .4byte BattleScript_PlayerUseItem .4byte BattleScript_AIUseFullRestoreOrHpHeal .4byte BattleScript_AIUseFullRestoreOrHpHeal .4byte BattleScript_AIUseStatRestore .4byte BattleScript_AIUseXstat .4byte BattleScript_AIUseGuardSpec gBattlescriptsForRunningByItem:: .4byte BattleScript_UseFluffyTail .4byte BattleScript_UsePokeFlute gBattlescriptsForSafariActions:: .4byte BattleScript_WatchesCarefully .4byte BattleScript_ThrowRock .4byte BattleScript_ThrowBait .4byte BattleScript_LeftoverWallyPrepToThrow BattleScript_ThrowBall:: jumpifbattletype BATTLE_TYPE_OLD_MAN_TUTORIAL, BattleScript_OldManThrowBall jumpifbattletype BATTLE_TYPE_POKEDUDE, BattleScript_PokedudeThrowBall printstring STRINGID_PLAYERUSEDITEM handleballthrow BattleScript_OldManThrowBall:: printstring STRINGID_OLDMANUSEDITEM handleballthrow BattleScript_PokedudeThrowBall:: printstring STRINGID_POKEDUDEUSED handleballthrow BattleScript_ThrowSafariBall:: printstring STRINGID_PLAYERUSEDITEM updatestatusicon BS_ATTACKER handleballthrow BattleScript_SuccessBallThrow:: jumpifhalfword CMP_EQUAL, gLastUsedItem, ITEM_SAFARI_BALL, BattleScript_SafariNoIncGameStat incrementgamestat GAME_STAT_POKEMON_CAPTURES BattleScript_SafariNoIncGameStat:: printstring STRINGID_GOTCHAPKMNCAUGHT trysetcaughtmondexflags BattleScript_CaughtPokemonSkipNewDex printstring STRINGID_PKMNDATAADDEDTODEX waitstate setbyte gBattleCommunication, 0 displaydexinfo BattleScript_CaughtPokemonSkipNewDex:: printstring STRINGID_GIVENICKNAMECAPTURED waitstate setbyte gBattleCommunication, 0 trygivecaughtmonnick BattleScript_CaughtPokemonSkipNickname givecaughtmon printfromtable gCaughtMonStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_CaughtPokemonDone BattleScript_SuccessBallThrowForceNick:: jumpifhalfword CMP_EQUAL, gLastUsedItem, ITEM_SAFARI_BALL, BattleScript_SafariNoIncGameStat2 incrementgamestat GAME_STAT_POKEMON_CAPTURES BattleScript_SafariNoIncGameStat2:: printstring STRINGID_GOTCHAPKMNCAUGHT trysetcaughtmondexflags BattleScript_CaughtPokemonSkipNewDex2 printstring STRINGID_PKMNDATAADDEDTODEX waitstate setbyte gBattleCommunication, 0 displaydexinfo BattleScript_CaughtPokemonSkipNewDex2:: waitstate setbyte gBattleCommunication, 2 trygivecaughtmonnick BattleScript_CaughtPokemonSkipNickname givecaughtmon printfromtable gCaughtMonStringIds waitmessage 64 goto BattleScript_CaughtPokemonDone BattleScript_CaughtPokemonSkipNickname:: givecaughtmon BattleScript_CaughtPokemonDone:: setbyte gBattleOutcome, B_OUTCOME_CAUGHT finishturn BattleScript_OldMan_Pokedude_CaughtMessage:: printstring STRINGID_GOTCHAPKMNCAUGHT2 setbyte gBattleOutcome, B_OUTCOME_CAUGHT endlinkbattle finishturn BattleScript_ShakeBallThrow:: printfromtable gBallEscapeStringIds waitmessage B_WAIT_TIME_LONG jumpifnotbattletype BATTLE_TYPE_SAFARI, BattleScript_CatchFailEnd jumpifbyte CMP_NOT_EQUAL, gNumSafariBalls, 0, BattleScript_CatchFailEnd printstring STRINGID_OUTOFSAFARIBALLS waitmessage B_WAIT_TIME_LONG setbyte gBattleOutcome, B_OUTCOME_NO_SAFARI_BALLS BattleScript_CatchFailEnd:: finishaction BattleScript_TrainerBallBlock:: waitmessage B_WAIT_TIME_LONG printstring STRINGID_TRAINERBLOCKEDBALL waitmessage B_WAIT_TIME_LONG printstring STRINGID_DONTBEATHIEF waitmessage B_WAIT_TIME_LONG finishaction BattleScript_GhostBallDodge:: waitmessage B_WAIT_TIME_LONG printstring STRINGID_ITDODGEDBALL waitmessage B_WAIT_TIME_LONG finishaction BattleScript_PlayerUseItem:: moveendcase 15 end BattleScript_AIUseFullRestoreOrHpHeal:: printstring STRINGID_EMPTYSTRING3 pause B_WAIT_TIME_MED playse SE_USE_ITEM printstring STRINGID_TRAINER1USEDITEM waitmessage B_WAIT_TIME_LONG useitemonopponent orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER moveendcase 15 finishaction BattleScript_AIUseStatRestore:: printstring STRINGID_EMPTYSTRING3 pause B_WAIT_TIME_MED playse SE_USE_ITEM printstring STRINGID_TRAINER1USEDITEM waitmessage B_WAIT_TIME_LONG useitemonopponent printfromtable gTrainerItemCuredStatusStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER moveendcase 15 finishaction BattleScript_AIUseXstat:: printstring STRINGID_EMPTYSTRING3 pause B_WAIT_TIME_MED playse SE_USE_ITEM printstring STRINGID_TRAINER1USEDITEM waitmessage B_WAIT_TIME_LONG useitemonopponent printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG moveendcase 15 finishaction BattleScript_AIUseGuardSpec:: printstring STRINGID_EMPTYSTRING3 pause B_WAIT_TIME_MED playse SE_USE_ITEM printstring STRINGID_TRAINER1USEDITEM waitmessage B_WAIT_TIME_LONG useitemonopponent printfromtable gMistUsedStringIds waitmessage B_WAIT_TIME_LONG moveendcase 15 finishaction BattleScript_UseFluffyTail:: playse SE_FLEE setbyte gBattleOutcome, B_OUTCOME_RAN finishturn BattleScript_UsePokeFlute:: checkpokeflute BS_ATTACKER jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 1, BattleScript_PokeFluteWakeUp printstring STRINGID_POKEFLUTECATCHY waitmessage B_WAIT_TIME_LONG goto BattleScript_PokeFluteEnd BattleScript_PokeFluteWakeUp:: printstring STRINGID_POKEFLUTE waitmessage B_WAIT_TIME_LONG fanfare MUS_POKE_FLUTE waitfanfare BS_ATTACKER printstring STRINGID_MONHEARINGFLUTEAWOKE waitmessage B_WAIT_TIME_LONG updatestatusicon BS_PLAYER2 waitstate BattleScript_PokeFluteEnd:: finishaction BattleScript_WatchesCarefully:: printfromtable gSafariReactionStringIds waitmessage B_WAIT_TIME_LONG playanimation BS_OPPONENT1, B_ANIM_SAFARI_REACTION end2 BattleScript_ThrowRock:: printstring STRINGID_THREWROCK waitmessage B_WAIT_TIME_LONG playanimation BS_ATTACKER, B_ANIM_ROCK_THROW end2 BattleScript_ThrowBait:: printstring STRINGID_THREWBAIT waitmessage B_WAIT_TIME_LONG playanimation BS_ATTACKER, B_ANIM_BAIT_THROW end2 BattleScript_LeftoverWallyPrepToThrow:: printstring STRINGID_RETURNMON waitmessage B_WAIT_TIME_LONG returnatktoball waitstate trainerslidein BS_TARGET waitstate printstring STRINGID_YOUTHROWABALLNOWRIGHT waitmessage B_WAIT_TIME_LONG end2 ================================================ FILE: data/event_scripts.s ================================================ #include "constants/global.h" #include "constants/flags.h" #include "constants/event_objects.h" #include "constants/event_object_movement.h" #include "constants/decorations.h" #include "constants/items.h" #include "constants/layouts.h" #include "constants/maps.h" #include "constants/metatile_labels.h" #include "constants/pokemon.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/sound.h" #include "constants/species.h" #include "constants/vars.h" #include "constants/battle.h" #include "constants/heal_locations.h" #include "constants/field_effects.h" #include "constants/trainers.h" #include "constants/trainer_tower.h" #include "constants/fame_checker.h" #include "constants/seagallop.h" #include "constants/game_stat.h" #include "constants/coins.h" #include "constants/menu.h" #include "constants/battle_setup.h" #include "constants/map_scripts.h" #include "constants/cable_club.h" #include "constants/field_tasks.h" #include "constants/field_weather.h" #include "constants/weather.h" #include "constants/union_room.h" #include "constants/trade.h" #include "constants/quest_log.h" #include "constants/daycare.h" #include "constants/easy_chat.h" #include "constants/trainer_card.h" #include "constants/help_system.h" #include "constants/trainer_fan_club.h" #include "constants/mystery_gift.h" .include "asm/macros.inc" .include "asm/macros/event.inc" .set FALSE, 0 .set TRUE, 1 .section script_data, "aw", %progbits .include "data/script_cmd_table.inc" .align 2 gSpecialVars:: .4byte gSpecialVar_0x8000 .4byte gSpecialVar_0x8001 .4byte gSpecialVar_0x8002 .4byte gSpecialVar_0x8003 .4byte gSpecialVar_0x8004 .4byte gSpecialVar_0x8005 .4byte gSpecialVar_0x8006 .4byte gSpecialVar_0x8007 .4byte gSpecialVar_0x8008 .4byte gSpecialVar_0x8009 .4byte gSpecialVar_0x800A .4byte gSpecialVar_0x800B .4byte gSpecialVar_Facing .4byte gSpecialVar_Result .4byte gSpecialVar_ItemId .4byte gSpecialVar_LastTalked .4byte gSpecialVar_MonBoxId .4byte gSpecialVar_MonBoxPos .4byte gSpecialVar_TextColor .4byte gSpecialVar_PrevTextColor .4byte gSpecialVar_0x8014 .include "data/specials.inc" .align 2 gStdScripts:: .4byte Std_ObtainItem @ STD_OBTAIN_ITEM .4byte Std_FindItem @ STD_FIND_ITEM .4byte Std_MsgboxNPC @ MSGBOX_NPC .4byte Std_MsgboxSign @ MSGBOX_SIGN .4byte Std_MsgboxDefault @ MSGBOX_DEFAULT .4byte Std_MsgboxYesNo @ MSGBOX_YESNO .4byte Std_MsgboxAutoclose @ MSGBOX_AUTOCLOSE .4byte Std_ObtainDecoration @ STD_OBTAIN_DECORATION .4byte Std_PutItemAway @ STD_PUT_ITEM_AWAY .4byte Std_ReceivedItem @ STD_RECEIVED_ITEM gStdScriptsEnd:: .include "data/maps/BattleColosseum_2P/scripts.inc" .include "data/maps/TradeCenter/scripts.inc" .include "data/maps/RecordCorner/scripts.inc" .include "data/maps/BattleColosseum_4P/scripts.inc" .include "data/maps/UnionRoom/scripts.inc" .include "data/maps/ViridianForest/scripts.inc" .include "data/maps/MtMoon_1F/scripts.inc" .include "data/maps/MtMoon_B1F/scripts.inc" .include "data/maps/MtMoon_B2F/scripts.inc" .include "data/maps/SSAnne_Exterior/scripts.inc" .include "data/maps/SSAnne_1F_Corridor/scripts.inc" .include "data/maps/SSAnne_2F_Corridor/scripts.inc" .include "data/maps/SSAnne_3F_Corridor/scripts.inc" .include "data/maps/SSAnne_B1F_Corridor/scripts.inc" .include "data/maps/SSAnne_Deck/scripts.inc" .include "data/maps/SSAnne_Kitchen/scripts.inc" .include "data/maps/SSAnne_CaptainsOffice/scripts.inc" .include "data/maps/SSAnne_1F_Room1/scripts.inc" .include "data/maps/SSAnne_1F_Room2/scripts.inc" .include "data/maps/SSAnne_1F_Room3/scripts.inc" .include "data/maps/SSAnne_1F_Room4/scripts.inc" .include "data/maps/SSAnne_1F_Room5/scripts.inc" .include "data/maps/SSAnne_1F_Room7/scripts.inc" .include "data/maps/SSAnne_2F_Room1/scripts.inc" .include "data/maps/SSAnne_2F_Room2/scripts.inc" .include "data/maps/SSAnne_2F_Room3/scripts.inc" .include "data/maps/SSAnne_2F_Room4/scripts.inc" .include "data/maps/SSAnne_2F_Room5/scripts.inc" .include "data/maps/SSAnne_2F_Room6/scripts.inc" .include "data/maps/SSAnne_B1F_Room1/scripts.inc" .include "data/maps/SSAnne_B1F_Room2/scripts.inc" .include "data/maps/SSAnne_B1F_Room3/scripts.inc" .include "data/maps/SSAnne_B1F_Room4/scripts.inc" .include "data/maps/SSAnne_B1F_Room5/scripts.inc" .include "data/maps/SSAnne_1F_Room6/scripts.inc" .include "data/maps/UndergroundPath_NorthEntrance/scripts.inc" .include "data/maps/UndergroundPath_NorthSouthTunnel/scripts.inc" .include "data/maps/UndergroundPath_SouthEntrance/scripts.inc" .include "data/maps/UndergroundPath_WestEntrance/scripts.inc" .include "data/maps/UndergroundPath_EastWestTunnel/scripts.inc" .include "data/maps/UndergroundPath_EastEntrance/scripts.inc" .include "data/maps/DiglettsCave_NorthEntrance/scripts.inc" .include "data/maps/DiglettsCave_B1F/scripts.inc" .include "data/maps/DiglettsCave_SouthEntrance/scripts.inc" .include "data/maps/VictoryRoad_1F/scripts.inc" .include "data/maps/VictoryRoad_2F/scripts.inc" .include "data/maps/VictoryRoad_3F/scripts.inc" .include "data/maps/RocketHideout_B1F/scripts.inc" .include "data/maps/RocketHideout_B2F/scripts.inc" .include "data/maps/RocketHideout_B3F/scripts.inc" .include "data/maps/RocketHideout_B4F/scripts.inc" .include "data/maps/RocketHideout_Elevator/scripts.inc" .include "data/maps/SilphCo_1F/scripts.inc" .include "data/maps/SilphCo_2F/scripts.inc" .include "data/maps/SilphCo_3F/scripts.inc" .include "data/maps/SilphCo_4F/scripts.inc" .include "data/maps/SilphCo_5F/scripts.inc" .include "data/maps/SilphCo_6F/scripts.inc" .include "data/maps/SilphCo_7F/scripts.inc" .include "data/maps/SilphCo_8F/scripts.inc" .include "data/maps/SilphCo_9F/scripts.inc" .include "data/maps/SilphCo_10F/scripts.inc" .include "data/maps/SilphCo_11F/scripts.inc" .include "data/maps/SilphCo_Elevator/scripts.inc" .include "data/maps/PokemonMansion_1F/scripts.inc" .include "data/maps/PokemonMansion_2F/scripts.inc" .include "data/maps/PokemonMansion_3F/scripts.inc" .include "data/maps/PokemonMansion_B1F/scripts.inc" .include "data/maps/SafariZone_Center/scripts.inc" .include "data/maps/SafariZone_East/scripts.inc" .include "data/maps/SafariZone_North/scripts.inc" .include "data/maps/SafariZone_West/scripts.inc" .include "data/maps/SafariZone_Center_RestHouse/scripts.inc" .include "data/maps/SafariZone_East_RestHouse/scripts.inc" .include "data/maps/SafariZone_North_RestHouse/scripts.inc" .include "data/maps/SafariZone_West_RestHouse/scripts.inc" .include "data/maps/SafariZone_SecretHouse/scripts.inc" .include "data/maps/CeruleanCave_1F/scripts.inc" .include "data/maps/CeruleanCave_2F/scripts.inc" .include "data/maps/CeruleanCave_B1F/scripts.inc" .include "data/maps/PokemonLeague_LoreleisRoom/scripts.inc" .include "data/maps/PokemonLeague_BrunosRoom/scripts.inc" .include "data/maps/PokemonLeague_AgathasRoom/scripts.inc" .include "data/maps/PokemonLeague_LancesRoom/scripts.inc" .include "data/maps/PokemonLeague_ChampionsRoom/scripts.inc" .include "data/maps/PokemonLeague_HallOfFame/scripts.inc" .include "data/maps/RockTunnel_1F/scripts.inc" .include "data/maps/RockTunnel_B1F/scripts.inc" .include "data/maps/SeafoamIslands_1F/scripts.inc" .include "data/maps/SeafoamIslands_B1F/scripts.inc" .include "data/maps/SeafoamIslands_B2F/scripts.inc" .include "data/maps/SeafoamIslands_B3F/scripts.inc" .include "data/maps/SeafoamIslands_B4F/scripts.inc" .include "data/maps/PokemonTower_1F/scripts.inc" .include "data/maps/PokemonTower_2F/scripts.inc" .include "data/maps/PokemonTower_3F/scripts.inc" .include "data/maps/PokemonTower_4F/scripts.inc" .include "data/maps/PokemonTower_5F/scripts.inc" .include "data/maps/PokemonTower_6F/scripts.inc" .include "data/maps/PokemonTower_7F/scripts.inc" .include "data/maps/PowerPlant/scripts.inc" .include "data/maps/MtEmber_RubyPath_B4F/scripts.inc" .include "data/maps/MtEmber_Exterior/scripts.inc" .include "data/maps/MtEmber_SummitPath_1F/scripts.inc" .include "data/maps/MtEmber_SummitPath_2F/scripts.inc" .include "data/maps/MtEmber_SummitPath_3F/scripts.inc" .include "data/maps/MtEmber_Summit/scripts.inc" .include "data/maps/MtEmber_RubyPath_B5F/scripts.inc" .include "data/maps/MtEmber_RubyPath_1F/scripts.inc" .include "data/maps/MtEmber_RubyPath_B1F/scripts.inc" .include "data/maps/MtEmber_RubyPath_B2F/scripts.inc" .include "data/maps/MtEmber_RubyPath_B3F/scripts.inc" .include "data/maps/MtEmber_RubyPath_B1F_Stairs/scripts.inc" .include "data/maps/MtEmber_RubyPath_B2F_Stairs/scripts.inc" .include "data/maps/ThreeIsland_BerryForest/scripts.inc" .include "data/maps/FourIsland_IcefallCave_Entrance/scripts.inc" .include "data/maps/FourIsland_IcefallCave_1F/scripts.inc" .include "data/maps/FourIsland_IcefallCave_B1F/scripts.inc" .include "data/maps/FourIsland_IcefallCave_Back/scripts.inc" .include "data/maps/FiveIsland_RocketWarehouse/scripts.inc" .include "data/maps/SixIsland_DottedHole_1F/scripts.inc" .include "data/maps/SixIsland_DottedHole_B1F/scripts.inc" .include "data/maps/SixIsland_DottedHole_B2F/scripts.inc" .include "data/maps/SixIsland_DottedHole_B3F/scripts.inc" .include "data/maps/SixIsland_DottedHole_B4F/scripts.inc" .include "data/maps/SixIsland_DottedHole_SapphireRoom/scripts.inc" .include "data/maps/SixIsland_PatternBush/scripts.inc" .include "data/maps/SixIsland_AlteringCave/scripts.inc" .include "data/maps/NavelRock_Exterior/scripts.inc" .include "data/maps/TrainerTower_1F/scripts.inc" .include "data/maps/TrainerTower_2F/scripts.inc" .include "data/maps/TrainerTower_3F/scripts.inc" .include "data/maps/TrainerTower_4F/scripts.inc" .include "data/maps/TrainerTower_5F/scripts.inc" .include "data/maps/TrainerTower_6F/scripts.inc" .include "data/maps/TrainerTower_7F/scripts.inc" .include "data/maps/TrainerTower_8F/scripts.inc" .include "data/maps/TrainerTower_Roof/scripts.inc" .include "data/maps/TrainerTower_Lobby/scripts.inc" .include "data/maps/TrainerTower_Elevator/scripts.inc" .include "data/maps/FiveIsland_LostCave_Entrance/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room1/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room2/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room3/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room4/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room5/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room6/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room7/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room8/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room9/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room10/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room11/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room12/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room13/scripts.inc" .include "data/maps/FiveIsland_LostCave_Room14/scripts.inc" .include "data/maps/SevenIsland_TanobyRuins_MoneanChamber/scripts.inc" .include "data/maps/SevenIsland_TanobyRuins_LiptooChamber/scripts.inc" .include "data/maps/SevenIsland_TanobyRuins_WeepthChamber/scripts.inc" .include "data/maps/SevenIsland_TanobyRuins_DilfordChamber/scripts.inc" .include "data/maps/SevenIsland_TanobyRuins_ScufibChamber/scripts.inc" .include "data/maps/SevenIsland_TanobyRuins_RixyChamber/scripts.inc" .include "data/maps/SevenIsland_TanobyRuins_ViapoisChamber/scripts.inc" .include "data/maps/ThreeIsland_DunsparceTunnel/scripts.inc" .include "data/maps/SevenIsland_SevaultCanyon_TanobyKey/scripts.inc" .include "data/maps/NavelRock_1F/scripts.inc" .include "data/maps/NavelRock_Summit/scripts.inc" .include "data/maps/NavelRock_Base/scripts.inc" .include "data/maps/NavelRock_SummitPath_2F/scripts.inc" .include "data/maps/NavelRock_SummitPath_3F/scripts.inc" .include "data/maps/NavelRock_SummitPath_4F/scripts.inc" .include "data/maps/NavelRock_SummitPath_5F/scripts.inc" .include "data/maps/NavelRock_BasePath_B1F/scripts.inc" .include "data/maps/NavelRock_BasePath_B2F/scripts.inc" .include "data/maps/NavelRock_BasePath_B3F/scripts.inc" .include "data/maps/NavelRock_BasePath_B4F/scripts.inc" .include "data/maps/NavelRock_BasePath_B5F/scripts.inc" .include "data/maps/NavelRock_BasePath_B6F/scripts.inc" .include "data/maps/NavelRock_BasePath_B7F/scripts.inc" .include "data/maps/NavelRock_BasePath_B8F/scripts.inc" .include "data/maps/NavelRock_BasePath_B9F/scripts.inc" .include "data/maps/NavelRock_BasePath_B10F/scripts.inc" .include "data/maps/NavelRock_BasePath_B11F/scripts.inc" .include "data/maps/NavelRock_B1F/scripts.inc" .include "data/maps/NavelRock_Fork/scripts.inc" .include "data/maps/BirthIsland_Exterior/scripts.inc" .include "data/maps/OneIsland_KindleRoad_EmberSpa/scripts.inc" .include "data/maps/BirthIsland_Harbor/scripts.inc" .include "data/maps/NavelRock_Harbor/scripts.inc" .include "data/maps/PalletTown/scripts.inc" .include "data/maps/ViridianCity/scripts.inc" .include "data/maps/PewterCity/scripts.inc" .include "data/maps/CeruleanCity/scripts.inc" .include "data/maps/LavenderTown/scripts.inc" .include "data/maps/VermilionCity/scripts.inc" .include "data/maps/CeladonCity/scripts.inc" .include "data/maps/FuchsiaCity/scripts.inc" .include "data/maps/CinnabarIsland/scripts.inc" .include "data/maps/IndigoPlateau_Exterior/scripts.inc" .include "data/maps/SaffronCity/scripts.inc" .include "data/maps/SaffronCity_Connection/scripts.inc" .include "data/maps/OneIsland/scripts.inc" .include "data/maps/TwoIsland/scripts.inc" .include "data/maps/ThreeIsland/scripts.inc" .include "data/maps/FourIsland/scripts.inc" .include "data/maps/FiveIsland/scripts.inc" .include "data/maps/SevenIsland/scripts.inc" .include "data/maps/SixIsland/scripts.inc" .include "data/maps/Route1/scripts.inc" .include "data/maps/Route2/scripts.inc" .include "data/maps/Route3/scripts.inc" .include "data/maps/Route4/scripts.inc" .include "data/maps/Route5/scripts.inc" .include "data/maps/Route6/scripts.inc" .include "data/maps/Route7/scripts.inc" .include "data/maps/Route8/scripts.inc" .include "data/maps/Route9/scripts.inc" .include "data/maps/Route10/scripts.inc" .include "data/maps/Route11/scripts.inc" .include "data/maps/Route12/scripts.inc" .include "data/maps/Route13/scripts.inc" .include "data/maps/Route14/scripts.inc" .include "data/maps/Route15/scripts.inc" .include "data/maps/Route16/scripts.inc" .include "data/maps/Route17/scripts.inc" .include "data/maps/Route18/scripts.inc" .include "data/maps/Route19/scripts.inc" .include "data/maps/Route20/scripts.inc" .include "data/maps/Route21_North/scripts.inc" .include "data/maps/Route21_South/scripts.inc" .include "data/maps/Route22/scripts.inc" .include "data/maps/Route23/scripts.inc" .include "data/maps/Route24/scripts.inc" .include "data/maps/Route25/scripts.inc" .include "data/maps/OneIsland_KindleRoad/scripts.inc" .include "data/maps/OneIsland_TreasureBeach/scripts.inc" .include "data/maps/TwoIsland_CapeBrink/scripts.inc" .include "data/maps/ThreeIsland_BondBridge/scripts.inc" .include "data/maps/ThreeIsland_Port/scripts.inc" .include "data/maps/Prototype_SeviiIsle_6/scripts.inc" .include "data/maps/Prototype_SeviiIsle_7/scripts.inc" .include "data/maps/Prototype_SeviiIsle_8/scripts.inc" .include "data/maps/Prototype_SeviiIsle_9/scripts.inc" .include "data/maps/FiveIsland_ResortGorgeous/scripts.inc" .include "data/maps/FiveIsland_WaterLabyrinth/scripts.inc" .include "data/maps/FiveIsland_Meadow/scripts.inc" .include "data/maps/FiveIsland_MemorialPillar/scripts.inc" .include "data/maps/SixIsland_OutcastIsland/scripts.inc" .include "data/maps/SixIsland_GreenPath/scripts.inc" .include "data/maps/SixIsland_WaterPath/scripts.inc" .include "data/maps/SixIsland_RuinValley/scripts.inc" .include "data/maps/SevenIsland_TrainerTower/scripts.inc" .include "data/maps/SevenIsland_SevaultCanyon_Entrance/scripts.inc" .include "data/maps/SevenIsland_SevaultCanyon/scripts.inc" .include "data/maps/SevenIsland_TanobyRuins/scripts.inc" .include "data/maps/PalletTown_PlayersHouse_1F/scripts.inc" .include "data/maps/PalletTown_PlayersHouse_2F/scripts.inc" .include "data/maps/PalletTown_RivalsHouse/scripts.inc" .include "data/maps/PalletTown_ProfessorOaksLab/scripts.inc" .include "data/maps/ViridianCity_House/scripts.inc" .include "data/maps/ViridianCity_Gym/scripts.inc" .include "data/maps/ViridianCity_School/scripts.inc" .include "data/maps/ViridianCity_Mart/scripts.inc" .include "data/maps/ViridianCity_PokemonCenter_1F/scripts.inc" .include "data/maps/ViridianCity_PokemonCenter_2F/scripts.inc" .include "data/maps/PewterCity_Museum_1F/scripts.inc" .include "data/maps/PewterCity_Museum_2F/scripts.inc" .include "data/maps/PewterCity_Gym/scripts.inc" .include "data/maps/PewterCity_Mart/scripts.inc" .include "data/maps/PewterCity_House1/scripts.inc" .include "data/maps/PewterCity_PokemonCenter_1F/scripts.inc" .include "data/maps/PewterCity_PokemonCenter_2F/scripts.inc" .include "data/maps/PewterCity_House2/scripts.inc" .include "data/maps/CeruleanCity_House1/scripts.inc" .include "data/maps/CeruleanCity_House2/scripts.inc" .include "data/maps/CeruleanCity_House3/scripts.inc" .include "data/maps/CeruleanCity_PokemonCenter_1F/scripts.inc" .include "data/maps/CeruleanCity_PokemonCenter_2F/scripts.inc" .include "data/maps/CeruleanCity_Gym/scripts.inc" .include "data/maps/CeruleanCity_BikeShop/scripts.inc" .include "data/maps/CeruleanCity_Mart/scripts.inc" .include "data/maps/CeruleanCity_House4/scripts.inc" .include "data/maps/CeruleanCity_House5/scripts.inc" .include "data/maps/LavenderTown_PokemonCenter_1F/scripts.inc" .include "data/maps/LavenderTown_PokemonCenter_2F/scripts.inc" .include "data/maps/LavenderTown_VolunteerPokemonHouse/scripts.inc" .include "data/maps/LavenderTown_House1/scripts.inc" .include "data/maps/LavenderTown_House2/scripts.inc" .include "data/maps/LavenderTown_Mart/scripts.inc" .include "data/maps/VermilionCity_House1/scripts.inc" .include "data/maps/VermilionCity_PokemonCenter_1F/scripts.inc" .include "data/maps/VermilionCity_PokemonCenter_2F/scripts.inc" .include "data/maps/VermilionCity_PokemonFanClub/scripts.inc" .include "data/maps/VermilionCity_House2/scripts.inc" .include "data/maps/VermilionCity_Mart/scripts.inc" .include "data/maps/VermilionCity_Gym/scripts.inc" .include "data/maps/VermilionCity_House3/scripts.inc" .include "data/maps/CeladonCity_DepartmentStore_1F/scripts.inc" .include "data/maps/CeladonCity_DepartmentStore_2F/scripts.inc" .include "data/maps/CeladonCity_DepartmentStore_3F/scripts.inc" .include "data/maps/CeladonCity_DepartmentStore_4F/scripts.inc" .include "data/maps/CeladonCity_DepartmentStore_5F/scripts.inc" .include "data/maps/CeladonCity_DepartmentStore_Roof/scripts.inc" .include "data/maps/CeladonCity_DepartmentStore_Elevator/scripts.inc" .include "data/maps/CeladonCity_Condominiums_1F/scripts.inc" .include "data/maps/CeladonCity_Condominiums_2F/scripts.inc" .include "data/maps/CeladonCity_Condominiums_3F/scripts.inc" .include "data/maps/CeladonCity_Condominiums_Roof/scripts.inc" .include "data/maps/CeladonCity_Condominiums_RoofRoom/scripts.inc" .include "data/maps/CeladonCity_PokemonCenter_1F/scripts.inc" .include "data/maps/CeladonCity_PokemonCenter_2F/scripts.inc" .include "data/maps/CeladonCity_GameCorner/scripts.inc" .include "data/maps/CeladonCity_GameCorner_PrizeRoom/scripts.inc" .include "data/maps/CeladonCity_Gym/scripts.inc" .include "data/maps/CeladonCity_Restaurant/scripts.inc" .include "data/maps/CeladonCity_House1/scripts.inc" .include "data/maps/CeladonCity_Hotel/scripts.inc" .include "data/maps/FuchsiaCity_SafariZone_Entrance/scripts.inc" .include "data/maps/FuchsiaCity_Mart/scripts.inc" .include "data/maps/FuchsiaCity_SafariZone_Office/scripts.inc" .include "data/maps/FuchsiaCity_Gym/scripts.inc" .include "data/maps/FuchsiaCity_House1/scripts.inc" .include "data/maps/FuchsiaCity_PokemonCenter_1F/scripts.inc" .include "data/maps/FuchsiaCity_PokemonCenter_2F/scripts.inc" .include "data/maps/FuchsiaCity_WardensHouse/scripts.inc" .include "data/maps/FuchsiaCity_House2/scripts.inc" .include "data/maps/FuchsiaCity_House3/scripts.inc" .include "data/maps/CinnabarIsland_Gym/scripts.inc" .include "data/maps/CinnabarIsland_PokemonLab_Entrance/scripts.inc" .include "data/maps/CinnabarIsland_PokemonLab_Lounge/scripts.inc" .include "data/maps/CinnabarIsland_PokemonLab_ResearchRoom/scripts.inc" .include "data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/scripts.inc" .include "data/maps/CinnabarIsland_PokemonCenter_1F/scripts.inc" .include "data/maps/CinnabarIsland_PokemonCenter_2F/scripts.inc" .include "data/maps/CinnabarIsland_Mart/scripts.inc" .include "data/maps/IndigoPlateau_PokemonCenter_1F/scripts.inc" .include "data/maps/IndigoPlateau_PokemonCenter_2F/scripts.inc" .include "data/maps/SaffronCity_CopycatsHouse_1F/scripts.inc" .include "data/maps/SaffronCity_CopycatsHouse_2F/scripts.inc" .include "data/maps/SaffronCity_Dojo/scripts.inc" .include "data/maps/SaffronCity_Gym/scripts.inc" .include "data/maps/SaffronCity_House/scripts.inc" .include "data/maps/SaffronCity_Mart/scripts.inc" .include "data/maps/SaffronCity_PokemonCenter_1F/scripts.inc" .include "data/maps/SaffronCity_PokemonCenter_2F/scripts.inc" .include "data/maps/SaffronCity_MrPsychicsHouse/scripts.inc" .include "data/maps/SaffronCity_PokemonTrainerFanClub/scripts.inc" .include "data/maps/Route2_ViridianForest_SouthEntrance/scripts.inc" .include "data/maps/Route2_House/scripts.inc" .include "data/maps/Route2_EastBuilding/scripts.inc" .include "data/maps/Route2_ViridianForest_NorthEntrance/scripts.inc" .include "data/maps/Route4_PokemonCenter_1F/scripts.inc" .include "data/maps/Route4_PokemonCenter_2F/scripts.inc" .include "data/maps/Route5_PokemonDayCare/scripts.inc" .include "data/maps/Route5_SouthEntrance/scripts.inc" .include "data/maps/Route6_NorthEntrance/scripts.inc" .include "data/maps/Route6_UnusedHouse/scripts.inc" .include "data/maps/Route7_EastEntrance/scripts.inc" .include "data/maps/Route8_WestEntrance/scripts.inc" .include "data/maps/Route10_PokemonCenter_1F/scripts.inc" .include "data/maps/Route10_PokemonCenter_2F/scripts.inc" .include "data/maps/Route11_EastEntrance_1F/scripts.inc" .include "data/maps/Route11_EastEntrance_2F/scripts.inc" .include "data/maps/Route12_NorthEntrance_1F/scripts.inc" .include "data/maps/Route12_NorthEntrance_2F/scripts.inc" .include "data/maps/Route12_FishingHouse/scripts.inc" .include "data/maps/Route15_WestEntrance_1F/scripts.inc" .include "data/maps/Route15_WestEntrance_2F/scripts.inc" .include "data/maps/Route16_House/scripts.inc" .include "data/maps/Route16_NorthEntrance_1F/scripts.inc" .include "data/maps/Route16_NorthEntrance_2F/scripts.inc" .include "data/maps/Route18_EastEntrance_1F/scripts.inc" .include "data/maps/Route18_EastEntrance_2F/scripts.inc" .include "data/maps/Route19_UnusedHouse/scripts.inc" .include "data/maps/Route22_NorthEntrance/scripts.inc" .include "data/maps/Route23_UnusedHouse/scripts.inc" .include "data/maps/Route25_SeaCottage/scripts.inc" .include "data/maps/SevenIsland_House_Room1/scripts.inc" .include "data/maps/SevenIsland_House_Room2/scripts.inc" .include "data/maps/SevenIsland_Mart/scripts.inc" .include "data/maps/SevenIsland_PokemonCenter_1F/scripts.inc" .include "data/maps/SevenIsland_PokemonCenter_2F/scripts.inc" .include "data/maps/SevenIsland_UnusedHouse/scripts.inc" .include "data/maps/SevenIsland_Harbor/scripts.inc" .include "data/maps/OneIsland_PokemonCenter_1F/scripts.inc" .include "data/maps/OneIsland_PokemonCenter_2F/scripts.inc" .include "data/maps/OneIsland_House1/scripts.inc" .include "data/maps/OneIsland_House2/scripts.inc" .include "data/maps/OneIsland_Harbor/scripts.inc" .include "data/maps/TwoIsland_JoyfulGameCorner/scripts.inc" .include "data/maps/TwoIsland_House/scripts.inc" .include "data/maps/TwoIsland_PokemonCenter_1F/scripts.inc" .include "data/maps/TwoIsland_PokemonCenter_2F/scripts.inc" .include "data/maps/TwoIsland_Harbor/scripts.inc" .include "data/maps/ThreeIsland_House1/scripts.inc" .include "data/maps/ThreeIsland_PokemonCenter_1F/scripts.inc" .include "data/maps/ThreeIsland_PokemonCenter_2F/scripts.inc" .include "data/maps/ThreeIsland_Mart/scripts.inc" .include "data/maps/ThreeIsland_House2/scripts.inc" .include "data/maps/ThreeIsland_House3/scripts.inc" .include "data/maps/ThreeIsland_House4/scripts.inc" .include "data/maps/ThreeIsland_House5/scripts.inc" .include "data/maps/FourIsland_PokemonDayCare/scripts.inc" .include "data/maps/FourIsland_PokemonCenter_1F/scripts.inc" .include "data/maps/FourIsland_PokemonCenter_2F/scripts.inc" .include "data/maps/FourIsland_House1/scripts.inc" .include "data/maps/FourIsland_LoreleisHouse/scripts.inc" .include "data/maps/FourIsland_Harbor/scripts.inc" .include "data/maps/FourIsland_House2/scripts.inc" .include "data/maps/FourIsland_Mart/scripts.inc" .include "data/maps/FiveIsland_PokemonCenter_1F/scripts.inc" .include "data/maps/FiveIsland_PokemonCenter_2F/scripts.inc" .include "data/maps/FiveIsland_Harbor/scripts.inc" .include "data/maps/FiveIsland_House1/scripts.inc" .include "data/maps/FiveIsland_House2/scripts.inc" .include "data/maps/SixIsland_PokemonCenter_1F/scripts.inc" .include "data/maps/SixIsland_PokemonCenter_2F/scripts.inc" .include "data/maps/SixIsland_Harbor/scripts.inc" .include "data/maps/SixIsland_House/scripts.inc" .include "data/maps/SixIsland_Mart/scripts.inc" .include "data/maps/ThreeIsland_Harbor/scripts.inc" .include "data/maps/FiveIsland_ResortGorgeous_House/scripts.inc" .include "data/maps/TwoIsland_CapeBrink_House/scripts.inc" .include "data/maps/SixIsland_WaterPath_House1/scripts.inc" .include "data/maps/SixIsland_WaterPath_House2/scripts.inc" .include "data/maps/SevenIsland_SevaultCanyon_House/scripts.inc" .include "data/maps/ViridianForest/text.inc" .include "data/maps/MtMoon_1F/text.inc" .include "data/maps/MtMoon_B2F/text.inc" .include "data/maps/SSAnne_1F_Corridor/text.inc" .include "data/maps/SSAnne_2F_Corridor/text.inc" .include "data/maps/SSAnne_3F_Corridor/text.inc" .include "data/maps/SSAnne_Deck/text.inc" .include "data/maps/SSAnne_Kitchen/text.inc" .include "data/maps/SSAnne_CaptainsOffice/text.inc" .include "data/maps/SSAnne_1F_Room1/text.inc" .include "data/maps/SSAnne_1F_Room2/text.inc" .include "data/maps/SSAnne_1F_Room3/text.inc" .include "data/maps/SSAnne_1F_Room4/text.inc" .include "data/maps/SSAnne_1F_Room5/text.inc" .include "data/maps/SSAnne_1F_Room7/text.inc" .include "data/maps/SSAnne_2F_Room1/text.inc" .include "data/maps/SSAnne_2F_Room2/text.inc" .include "data/maps/SSAnne_2F_Room3/text.inc" .include "data/maps/SSAnne_2F_Room4/text.inc" .include "data/maps/SSAnne_2F_Room5/text.inc" .include "data/maps/SSAnne_2F_Room6/text.inc" .include "data/maps/SSAnne_B1F_Room1/text.inc" .include "data/maps/SSAnne_B1F_Room2/text.inc" .include "data/maps/SSAnne_B1F_Room3/text.inc" .include "data/maps/SSAnne_B1F_Room4/text.inc" .include "data/maps/SSAnne_B1F_Room5/text.inc" .include "data/maps/SSAnne_1F_Room6/text.inc" .include "data/maps/UndergroundPath_SouthEntrance/text.inc" .include "data/maps/UndergroundPath_WestEntrance/text.inc" .include "data/maps/UndergroundPath_EastEntrance/text.inc" .include "data/maps/DiglettsCave_NorthEntrance/text.inc" .include "data/maps/DiglettsCave_SouthEntrance/text.inc" .include "data/maps/VictoryRoad_1F/text.inc" .include "data/maps/VictoryRoad_2F/text.inc" .include "data/maps/VictoryRoad_3F/text.inc" .include "data/maps/RocketHideout_B1F/text.inc" .include "data/maps/RocketHideout_B2F/text.inc" .include "data/maps/RocketHideout_B3F/text.inc" .include "data/maps/RocketHideout_B4F/text.inc" .include "data/maps/RocketHideout_Elevator/text.inc" .include "data/maps/SilphCo_1F/text.inc" .include "data/maps/SilphCo_2F/text.inc" .include "data/maps/SilphCo_3F/text.inc" .include "data/maps/SilphCo_4F/text.inc" .include "data/maps/SilphCo_5F/text.inc" .include "data/maps/SilphCo_6F/text.inc" .include "data/maps/SilphCo_7F/text.inc" .include "data/maps/SilphCo_8F/text.inc" .include "data/maps/SilphCo_9F/text.inc" .include "data/maps/SilphCo_10F/text.inc" .include "data/maps/SilphCo_11F/text.inc" .include "data/maps/PokemonMansion_1F/text.inc" .include "data/maps/PokemonMansion_2F/text.inc" .include "data/maps/PokemonMansion_3F/text.inc" .include "data/maps/PokemonMansion_B1F/text.inc" .include "data/maps/SafariZone_Center/text.inc" .include "data/maps/SafariZone_East/text.inc" .include "data/maps/SafariZone_North/text.inc" .include "data/maps/SafariZone_West/text.inc" .include "data/maps/SafariZone_Center_RestHouse/text.inc" .include "data/maps/SafariZone_East_RestHouse/text.inc" .include "data/maps/SafariZone_North_RestHouse/text.inc" .include "data/maps/SafariZone_West_RestHouse/text.inc" .include "data/maps/SafariZone_SecretHouse/text.inc" .include "data/maps/CeruleanCave_B1F/text.inc" .include "data/maps/PokemonLeague_LoreleisRoom/text.inc" .include "data/maps/PokemonLeague_BrunosRoom/text.inc" .include "data/maps/PokemonLeague_AgathasRoom/text.inc" .include "data/maps/PokemonLeague_LancesRoom/text.inc" .include "data/maps/PokemonLeague_ChampionsRoom/text.inc" .include "data/maps/PokemonLeague_HallOfFame/text.inc" .include "data/maps/RockTunnel_1F/text.inc" .include "data/maps/RockTunnel_B1F/text.inc" .include "data/maps/SeafoamIslands_B4F/text.inc" .include "data/maps/PokemonTower_1F/text.inc" .include "data/maps/PokemonTower_2F/text.inc" .include "data/maps/PokemonTower_3F/text.inc" .include "data/maps/PokemonTower_4F/text.inc" .include "data/maps/PokemonTower_5F/text.inc" .include "data/maps/PokemonTower_6F/text.inc" .include "data/maps/PokemonTower_7F/text.inc" .include "data/maps/MtEmber_Exterior/text.inc" .include "data/maps/MtEmber_RubyPath_B3F/text.inc" .include "data/maps/ThreeIsland_BerryForest/text.inc" .include "data/maps/FourIsland_IcefallCave_Back/text.inc" .include "data/maps/FiveIsland_RocketWarehouse/text.inc" .include "data/maps/SixIsland_DottedHole_SapphireRoom/text.inc" .include "data/maps/SixIsland_PatternBush/text.inc" .include "data/maps/TrainerTower_Lobby/text.inc" .include "data/maps/FiveIsland_LostCave_Room1/text.inc" .include "data/maps/FiveIsland_LostCave_Room4/text.inc" .include "data/maps/FiveIsland_LostCave_Room10/text.inc" .include "data/maps/ThreeIsland_DunsparceTunnel/text.inc" .include "data/maps/SevenIsland_SevaultCanyon_TanobyKey/text.inc" .include "data/maps/OneIsland_KindleRoad_EmberSpa/text.inc" .include "data/maps/PalletTown/text.inc" .include "data/maps/ViridianCity/text.inc" .include "data/maps/PewterCity/text.inc" .include "data/maps/CeruleanCity/text.inc" .include "data/maps/LavenderTown/text.inc" .include "data/maps/VermilionCity/text.inc" .include "data/maps/CeladonCity/text.inc" .include "data/maps/FuchsiaCity/text.inc" .include "data/maps/CinnabarIsland/text.inc" .include "data/maps/SaffronCity/text.inc" .include "data/maps/OneIsland/text.inc" .include "data/maps/TwoIsland/text.inc" .include "data/maps/ThreeIsland/text.inc" .include "data/maps/FourIsland/text.inc" .include "data/maps/FiveIsland/text.inc" .include "data/maps/SevenIsland/text.inc" .include "data/maps/SixIsland/text.inc" .include "data/maps/Route1/text.inc" .include "data/maps/Route2/text.inc" .include "data/maps/Route3/text.inc" .include "data/maps/Route4/text.inc" .include "data/maps/Route5/text.inc" .include "data/maps/Route6/text.inc" .include "data/maps/Route7/text.inc" .include "data/maps/Route8/text.inc" .include "data/maps/Route9/text.inc" .include "data/maps/Route10/text.inc" .include "data/maps/Route11/text.inc" .include "data/maps/Route12/text.inc" .include "data/maps/Route13/text.inc" .include "data/maps/Route14/text.inc" .include "data/maps/Route15/text.inc" .include "data/maps/Route16/text.inc" .include "data/maps/Route17/text.inc" .include "data/maps/Route18/text.inc" .include "data/maps/Route19/text.inc" .include "data/maps/Route20/text.inc" .include "data/maps/Route21_North/text.inc" .include "data/maps/Route21_South/text.inc" .include "data/maps/Route22/text.inc" .include "data/maps/Route23/text.inc" .include "data/maps/Route24/text.inc" .include "data/maps/Route25/text.inc" .include "data/maps/OneIsland_KindleRoad/text.inc" .include "data/maps/OneIsland_TreasureBeach/text.inc" .include "data/maps/ThreeIsland_BondBridge/text.inc" .include "data/maps/ThreeIsland_Port/text.inc" .include "data/maps/FiveIsland_ResortGorgeous/text.inc" .include "data/maps/FiveIsland_WaterLabyrinth/text.inc" .include "data/maps/FiveIsland_Meadow/text.inc" .include "data/maps/FiveIsland_MemorialPillar/text.inc" .include "data/maps/SixIsland_OutcastIsland/text.inc" .include "data/maps/SixIsland_GreenPath/text.inc" .include "data/maps/SixIsland_WaterPath/text.inc" .include "data/maps/SixIsland_RuinValley/text.inc" .include "data/maps/SevenIsland_TrainerTower/text.inc" .include "data/maps/SevenIsland_SevaultCanyon_Entrance/text.inc" .include "data/maps/SevenIsland_SevaultCanyon/text.inc" .include "data/maps/SevenIsland_TanobyRuins/text.inc" .include "data/maps/PalletTown_PlayersHouse_1F/text.inc" .include "data/maps/PalletTown_PlayersHouse_2F/text.inc" .include "data/maps/PalletTown_RivalsHouse/text.inc" .include "data/maps/PalletTown_ProfessorOaksLab/text.inc" .include "data/maps/ViridianCity_House/text.inc" .include "data/maps/ViridianCity_Gym/text.inc" .include "data/maps/ViridianCity_School/text.inc" .include "data/maps/ViridianCity_Mart/text.inc" .include "data/maps/ViridianCity_PokemonCenter_1F/text.inc" .include "data/maps/PewterCity_Museum_1F/text.inc" .include "data/maps/PewterCity_Museum_2F/text.inc" .include "data/maps/PewterCity_Gym/text.inc" .include "data/maps/PewterCity_Mart/text.inc" .include "data/maps/PewterCity_House1/text.inc" .include "data/maps/PewterCity_PokemonCenter_1F/text.inc" .include "data/maps/PewterCity_House2/text.inc" .include "data/maps/CeruleanCity_House1/text.inc" .include "data/maps/CeruleanCity_House2/text.inc" .include "data/maps/CeruleanCity_House3/text.inc" .include "data/maps/CeruleanCity_PokemonCenter_1F/text.inc" .include "data/maps/CeruleanCity_Gym/text.inc" .include "data/maps/CeruleanCity_BikeShop/text.inc" .include "data/maps/CeruleanCity_Mart/text.inc" .include "data/maps/CeruleanCity_House4/text.inc" .include "data/maps/CeruleanCity_House5/text.inc" .include "data/maps/LavenderTown_PokemonCenter_1F/text.inc" .include "data/maps/LavenderTown_VolunteerPokemonHouse/text.inc" .include "data/maps/LavenderTown_House1/text.inc" .include "data/maps/LavenderTown_House2/text.inc" .include "data/maps/LavenderTown_Mart/text.inc" .include "data/maps/VermilionCity_House1/text.inc" .include "data/maps/VermilionCity_PokemonCenter_1F/text.inc" .include "data/maps/VermilionCity_PokemonFanClub/text.inc" .include "data/maps/VermilionCity_House2/text.inc" .include "data/maps/VermilionCity_Mart/text.inc" .include "data/maps/VermilionCity_Gym/text.inc" .include "data/maps/VermilionCity_House3/text.inc" .include "data/maps/CeladonCity_DepartmentStore_1F/text.inc" .include "data/maps/CeladonCity_DepartmentStore_2F/text.inc" .include "data/maps/CeladonCity_DepartmentStore_3F/text.inc" .include "data/maps/CeladonCity_DepartmentStore_4F/text.inc" .include "data/maps/CeladonCity_DepartmentStore_5F/text.inc" .include "data/maps/CeladonCity_DepartmentStore_Roof/text.inc" .include "data/maps/CeladonCity_Condominiums_1F/text.inc" .include "data/maps/CeladonCity_Condominiums_2F/text.inc" .include "data/maps/CeladonCity_Condominiums_3F/text.inc" .include "data/maps/CeladonCity_Condominiums_Roof/text.inc" .include "data/maps/CeladonCity_Condominiums_RoofRoom/text.inc" .include "data/maps/CeladonCity_PokemonCenter_1F/text.inc" .include "data/maps/CeladonCity_GameCorner/text.inc" .include "data/maps/CeladonCity_GameCorner_PrizeRoom/text.inc" .include "data/maps/CeladonCity_Gym/text.inc" .include "data/maps/CeladonCity_Restaurant/text.inc" .include "data/maps/CeladonCity_House1/text.inc" .include "data/maps/CeladonCity_Hotel/text.inc" .include "data/maps/FuchsiaCity_SafariZone_Entrance/text.inc" .include "data/maps/FuchsiaCity_Mart/text.inc" .include "data/maps/FuchsiaCity_SafariZone_Office/text.inc" .include "data/maps/FuchsiaCity_Gym/text.inc" .include "data/maps/FuchsiaCity_House1/text.inc" .include "data/maps/FuchsiaCity_PokemonCenter_1F/text.inc" .include "data/maps/FuchsiaCity_WardensHouse/text.inc" .include "data/maps/FuchsiaCity_House2/text.inc" .include "data/maps/FuchsiaCity_House3/text.inc" .include "data/maps/CinnabarIsland_Gym/text.inc" .include "data/maps/CinnabarIsland_PokemonLab_Entrance/text.inc" .include "data/maps/CinnabarIsland_PokemonLab_Lounge/text.inc" .include "data/maps/CinnabarIsland_PokemonLab_ResearchRoom/text.inc" .include "data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/text.inc" .include "data/maps/CinnabarIsland_PokemonCenter_1F/text.inc" .include "data/maps/CinnabarIsland_Mart/text.inc" .include "data/maps/IndigoPlateau_PokemonCenter_1F/text.inc" .include "data/maps/SaffronCity_CopycatsHouse_1F/text.inc" .include "data/maps/SaffronCity_CopycatsHouse_2F/text.inc" .include "data/maps/SaffronCity_Dojo/text.inc" .include "data/maps/SaffronCity_Gym/text.inc" .include "data/maps/SaffronCity_House/text.inc" .include "data/maps/SaffronCity_Mart/text.inc" .include "data/maps/SaffronCity_PokemonCenter_1F/text.inc" .include "data/maps/SaffronCity_MrPsychicsHouse/text.inc" .include "data/maps/SaffronCity_PokemonTrainerFanClub/text.inc" .include "data/maps/Route2_ViridianForest_SouthEntrance/text.inc" .include "data/maps/Route2_House/text.inc" .include "data/maps/Route2_EastBuilding/text.inc" .include "data/maps/Route2_ViridianForest_NorthEntrance/text.inc" .include "data/maps/Route4_PokemonCenter_1F/text.inc" .include "data/maps/Route5_PokemonDayCare/text.inc" .include "data/maps/Route5_SouthEntrance/text.inc" .include "data/maps/Route6_NorthEntrance/text.inc" .include "data/maps/Route7_EastEntrance/text.inc" .include "data/maps/Route8_WestEntrance/text.inc" .include "data/maps/Route10_PokemonCenter_1F/text.inc" .include "data/maps/Route11_EastEntrance_1F/text.inc" .include "data/maps/Route11_EastEntrance_2F/text.inc" .include "data/maps/Route12_NorthEntrance_1F/text.inc" .include "data/maps/Route12_NorthEntrance_2F/text.inc" .include "data/maps/Route12_FishingHouse/text.inc" .include "data/maps/Route15_WestEntrance_1F/text.inc" .include "data/maps/Route15_WestEntrance_2F/text.inc" .include "data/maps/Route16_House/text.inc" .include "data/maps/Route16_NorthEntrance_1F/text.inc" .include "data/maps/Route16_NorthEntrance_2F/text.inc" .include "data/maps/Route18_EastEntrance_1F/text.inc" .include "data/maps/Route18_EastEntrance_2F/text.inc" .include "data/maps/Route25_SeaCottage/text.inc" .include "data/maps/SevenIsland_House_Room1/text.inc" .include "data/maps/SevenIsland_Mart/text.inc" .include "data/maps/SevenIsland_PokemonCenter_1F/text.inc" .include "data/maps/OneIsland_PokemonCenter_1F/text.inc" .include "data/maps/OneIsland_House1/text.inc" .include "data/maps/OneIsland_House2/text.inc" .include "data/maps/TwoIsland_JoyfulGameCorner/text.inc" .include "data/maps/TwoIsland_House/text.inc" .include "data/maps/TwoIsland_PokemonCenter_1F/text.inc" .include "data/maps/ThreeIsland_House1/text.inc" .include "data/maps/ThreeIsland_PokemonCenter_1F/text.inc" .include "data/maps/ThreeIsland_Mart/text.inc" .include "data/maps/ThreeIsland_House2/text.inc" .include "data/maps/ThreeIsland_House3/text.inc" .include "data/maps/ThreeIsland_House4/text.inc" .include "data/maps/ThreeIsland_House5/text.inc" .include "data/maps/FourIsland_PokemonCenter_1F/text.inc" .include "data/maps/FourIsland_House1/text.inc" .include "data/maps/FourIsland_LoreleisHouse/text.inc" .include "data/maps/FourIsland_Mart/text.inc" .include "data/maps/FiveIsland_PokemonCenter_1F/text.inc" .include "data/maps/FiveIsland_House1/text.inc" .include "data/maps/FiveIsland_House2/text.inc" .include "data/maps/SixIsland_PokemonCenter_1F/text.inc" .include "data/maps/SixIsland_House/text.inc" .include "data/maps/SixIsland_Mart/text.inc" .include "data/maps/FiveIsland_ResortGorgeous_House/text.inc" .include "data/maps/TwoIsland_CapeBrink_House/text.inc" .include "data/maps/SixIsland_WaterPath_House1/text.inc" .include "data/maps/SixIsland_WaterPath_House2/text.inc" .include "data/maps/SevenIsland_SevaultCanyon_House/text.inc" .include "data/scripts/std_msgbox.inc" .include "data/scripts/trainer_battle.inc" .include "data/text/pc.inc" Text_PleaseComeAgain:: .string "Please come again!$" .include "data/text/obtain_item.inc" Text_WantWhichFloor:: .string "Which floor do you want?$" Text_BagItemCanBeRegistered:: .string "An item in the BAG can be\n" .string "registered to SELECT for easy use.$" Text_PlayerBootedUpPC:: .string "{PLAYER} booted up the PC.$" gText_PkmnFainted3:: .string "{STR_VAR_1} fainted…\p" .string "$" Text_WelcomeWantToHealPkmn:: .string "Welcome to our POKéMON CENTER!\p" .string "Would you like me to heal your\n" .string "POKéMON back to perfect health?$" Text_TakeYourPkmnForFewSeconds:: .string "Okay, I'll take your POKéMON for a\n" .string "few seconds.$" Text_WeHopeToSeeYouAgain:: .string "We hope to see you again!$" Text_RestoredPkmnToFullHealth:: .string "Thank you for waiting.\n" .string "We've restored your POKéMON to\l" .string "full health.$" .include "data/text/surf.inc" Text_WirelessClubUndergoingAdjustments:: .string "I'm terribly sorry.\n" .string "The POKéMON WIRELESS CLUB is\l" .string "undergoing adjustments now.$" Text_AppearsToBeUndergoingAdjustments:: .string "It appears to be undergoing\n" .string "adjustments…$" Text_HandedOverItem:: .string "{PLAYER} handed over the\n" .string "{STR_VAR_1}.$" Text_GiveNicknameToThisMon:: .string "Do you want to give a nickname to\n" .string "this {STR_VAR_1}?$" .include "data/text/itemfinder.inc" .include "data/text/route23.inc" .include "data/text/aide.inc" .include "data/text/ingame_trade.inc" Text_CardKeyOpenedDoor:: .string "Bingo!\n" .string "The CARD KEY opened the door!$" Text_ItNeedsCardKey:: .string "No!\n" .string "It needs a CARD KEY!$" Text_AccessedProfOaksPC:: .string "Accessed PROF. OAK's PC…\p" .string "Accessed the POKéDEX Rating\n" .string "System…$" Text_HavePokedexRated:: .string "Would you like to have your\n" .string "POKéDEX rated?$" Text_ClosedLinkToProfOaksPC:: .string "Closed link to PROF. OAK's PC.$" Text_VoiceRangOutDontRunAway:: .string "Someone's voice rang out,\n" .string "“Don't run away!”$" Text_TheDoorIsOpen:: .string "The door is open…$" .include "data/text/pc_transfer.inc" .include "data/text/white_out.inc" .include "data/text/poke_mart.inc" Text_MonFlewAway:: .string "The {STR_VAR_1} flew away!$" Text_FoundTMHMContainsMove:: .string "{PLAYER} found a {STR_VAR_2}!\n" .string "It contains {STR_VAR_1}.$" .include "data/text/seagallop.inc" @ Call for legendary bird trio Text_Gyaoo:: .string "Gyaoo!$" Text_MoveCanOnlyBeLearnedOnce:: .string "This move can only be learned\n" .string "once for free. Is that okay?$" EventScript_ResetAllMapFlags:: setflag FLAG_HIDE_OAK_IN_HIS_LAB setflag FLAG_HIDE_OAK_IN_PALLET_TOWN setflag FLAG_HIDE_BILL_HUMAN_SEA_COTTAGE setflag FLAG_HIDE_PEWTER_CITY_RUNNING_SHOES_GUY setflag FLAG_HIDE_POKEHOUSE_FUJI setflag FLAG_HIDE_LIFT_KEY setflag FLAG_HIDE_SILPH_SCOPE setflag FLAG_HIDE_CERULEAN_RIVAL setflag FLAG_HIDE_SS_ANNE_RIVAL setflag FLAG_HIDE_VERMILION_CITY_OAKS_AIDE setflag FLAG_HIDE_SAFFRON_CIVILIANS setflag FLAG_HIDE_ROUTE_22_RIVAL setflag FLAG_HIDE_OAK_IN_CHAMP_ROOM setflag FLAG_HIDE_CREDITS_RIVAL setflag FLAG_HIDE_CREDITS_OAK setflag FLAG_HIDE_CINNABAR_BILL setflag FLAG_HIDE_CINNABAR_SEAGALLOP setflag FLAG_HIDE_CINNABAR_POKECENTER_BILL setflag FLAG_HIDE_LORELEI_IN_HER_HOUSE setflag FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT setflag FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER setflag FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN setflag FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY setflag FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE setflag FLAG_HIDE_TWO_ISLAND_GAME_CORNER_BIKER setflag FLAG_HIDE_TWO_ISLAND_WOMAN setflag FLAG_HIDE_TWO_ISLAND_BEAUTY setflag FLAG_HIDE_TWO_ISLAND_SUPER_NERD setflag FLAG_HIDE_LOSTELLE_IN_HER_HOME setflag FLAG_HIDE_THREE_ISLAND_LONE_BIKER setflag FLAG_HIDE_FOUR_ISLAND_RIVAL setflag FLAG_HIDE_DOTTED_HOLE_SCIENTIST setflag FLAG_HIDE_RESORT_GORGEOUS_SELPHY setflag FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY setflag FLAG_HIDE_SELPHYS_BUTLER setflag FLAG_HIDE_DEOXYS setflag FLAG_HIDE_LORELEI_HOUSE_MEOWTH_DOLL setflag FLAG_HIDE_LORELEI_HOUSE_CHANSEY_DOLL setflag FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_F_DOLL setflag FLAG_HIDE_LORELEI_HOUSE_JIGGLYPUFF_DOLL setflag FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_M_DOLL setflag FLAG_HIDE_LORELEIS_HOUSE_FEAROW_DOLL setflag FLAG_HIDE_LORELEIS_HOUSE_PIDGEOT_DOLL setflag FLAG_HIDE_LORELEIS_HOUSE_LAPRAS_DOLL setflag FLAG_HIDE_POSTGAME_GOSSIPERS setflag FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS setflag FLAG_HIDE_FAME_CHECKER_KOGA_JOURNAL setflag FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL setflag FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS setflag FLAG_HIDE_LAVENDER_OUTSIDE_FUJI setflag FLAG_HIDE_BATTLE_TOWER_OPPONENT setflag FLAG_HIDE_VICTORY_ROAD_2F_BOULDER setflag FLAG_HIDE_SCOTT setflag FLAG_HIDE_LATI setflag FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER setflag FLAG_HIDE_NATIONAL_DEX_AIDE setflag FLAG_HIDE_MASTER_TRAINERS setvar VAR_MASSAGE_COOLDOWN_STEP_COUNTER, 500 end .include "data/scripts/hall_of_fame.inc" .include "data/scripts/pkmn_center_nurse.inc" .include "data/scripts/obtain_item.inc" .include "data/scripts/pc.inc" Common_ShowEasyChatScreen:: fadescreen FADE_TO_BLACK special ShowEasyChatScreen fadescreen FADE_FROM_BLACK return .include "data/scripts/surf.inc" .include "data/scripts/set_gym_trainers.inc" .include "data/scripts/bag_full.inc" EventScript_OutOfCenterPartyHeal:: fadescreen FADE_TO_BLACK playfanfare MUS_RS_HEAL waitfanfare special HealPlayerParty fadescreen FADE_FROM_BLACK return EventScript_WallTownMap:: lockall msgbox Text_ATownMap goto_if_questlog EventScript_ReleaseEnd fadescreen FADE_TO_BLACK special ShowTownMap waitstate releaseall end .include "data/text/pokedex_rating.inc" .include "data/scripts/pokedex_rating.inc" .include "data/scripts/cave_of_origin.inc" EventScript_ChangePokemonNickname:: fadescreen FADE_TO_BLACK special ChangePokemonNickname waitstate return .include "data/scripts/pokemon_league.inc" .include "data/scripts/movement.inc" .include "data/scripts/flavor_text.inc" .include "data/scripts/questionnaire.inc" EventScript_BagItemCanBeRegistered:: msgbox Text_BagItemCanBeRegistered, MSGBOX_SIGN end EventScript_Return:: return EventScript_SetResultTrue:: setvar VAR_RESULT, TRUE return EventScript_SetResultFalse:: setvar VAR_RESULT, FALSE return EventScript_SetExitingCyclingRoad:: lockall clearflag FLAG_SYS_ON_CYCLING_ROAD setvar VAR_MAP_SCENE_ROUTE16, 0 releaseall end EventScript_SetEnteringCyclingRoad:: lockall setvar VAR_MAP_SCENE_ROUTE16, 1 releaseall end .include "data/scripts/route23.inc" EventScript_GetElevatorFloor:: special GetElevatorFloor return .include "data/scripts/aide.inc" EventScript_CancelMessageBox:: special DoPicboxCancel release end EventScript_ReleaseEnd:: release end .include "data/scripts/pokemon_mansion.inc" .include "data/scripts/silphco_doors.inc" .include "data/scripts/pc_transfer.inc" EventScript_GetInGameTradeSpeciesInfo:: copyvar VAR_0x8004, VAR_0x8008 specialvar VAR_RESULT, GetInGameTradeSpeciesInfo copyvar VAR_0x8009, VAR_RESULT return EventScript_ChooseMonForInGameTrade:: special ChoosePartyMon waitstate lock faceplayer copyvar VAR_0x800A, VAR_0x8004 return EventScript_GetInGameTradeSpecies:: copyvar VAR_0x8005, VAR_0x800A specialvar VAR_RESULT, GetTradeSpecies copyvar VAR_0x800B, VAR_RESULT return EventScript_DoInGameTrade:: copyvar VAR_0x8004, VAR_0x8008 copyvar VAR_0x8005, VAR_0x800A special CreateInGameTradePokemon special DoInGameTradeScene waitstate lock faceplayer return EventScript_VsSeekerChargingDone:: special VsSeekerFreezeObjectsAfterChargeComplete waitstate special VsSeekerResetObjectMovementAfterChargeComplete releaseall end Common_EventScript_UnionRoomAttendant:: call CableClub_EventScript_UnionRoomAttendant end Common_EventScript_WirelessClubAttendant:: call CableClub_EventScript_WirelessClubAttendant end Common_EventScript_DirectCornerAttendant:: call CableClub_EventScript_DirectCornerAttendant end VermilionCity_PokemonCenter_1F_EventScript_VSSeekerWoman:: lock faceplayer goto_if_set FLAG_GOT_VS_SEEKER, VermilionCity_PokemonCenter_1F_EventScript_ExplainVSSeeker msgbox VermilionCity_PokemonCenter_1F_Text_UrgeToBattleSomeoneAgain setflag FLAG_GOT_VS_SEEKER giveitem ITEM_VS_SEEKER goto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull msgbox VermilionCity_PokemonCenter_1F_Text_UseDeviceForRematches release end VermilionCity_PokemonCenter_1F_EventScript_ExplainVSSeeker:: msgbox VermilionCity_PokemonCenter_1F_Text_ExplainVSSeeker release end .include "data/scripts/itemfinder.inc" .include "data/scripts/white_out.inc" Std_PutItemAway:: bufferitemnameplural STR_VAR_2, VAR_0x8000, VAR_0x8001 checkitemtype VAR_0x8000 call EventScript_BufferPutAwayPocketName msgbox Text_PutItemAway return EventScript_BufferPutAwayPocketName:: switch VAR_RESULT case POCKET_ITEMS, EventScript_BufferPutAwayPocketItems case POCKET_KEY_ITEMS, EventScript_BufferPutAwayPocketKeyItems case POCKET_POKE_BALLS, EventScript_BufferPutAwayPocketPokeBalls case POCKET_TM_CASE, EventScript_BufferPutAwayPocketTMCase case POCKET_BERRY_POUCH, EventScript_BufferPutAwayPocketBerryPouch case POCKET_MEDICINE, EventScript_BufferPutAwayPocketMedicine case POCKET_HELD_ITEMS, EventScript_BufferPutAwayPocketHeldItems end EventScript_BufferPutAwayPocketItems:: bufferstdstring STR_VAR_3, STDSTRING_ITEMS_POCKET return EventScript_BufferPutAwayPocketMedicine:: bufferstdstring STR_VAR_3, STDSTRING_MEDICINE_POCKET return EventScript_BufferPutAwayPocketKeyItems:: bufferstdstring STR_VAR_3, STDSTRING_KEY_ITEMS_POCKET return EventScript_BufferPutAwayPocketHeldItems:: bufferstdstring STR_VAR_3, STDSTRING_HELD_ITEMS_POCKET return EventScript_BufferPutAwayPocketPokeBalls:: bufferstdstring STR_VAR_3, STDSTRING_POKEBALLS_POCKET return EventScript_BufferPutAwayPocketTMCase:: bufferstdstring STR_VAR_3, STDSTRING_TM_CASE return EventScript_BufferPutAwayPocketBerryPouch:: bufferstdstring STR_VAR_3, STDSTRING_BERRY_POUCH return .include "data/scripts/seagallop.inc" .include "data/scripts/static_pokemon.inc" EventScript_TryDarkenRuins:: goto_if_set FLAG_SYS_UNLOCKED_TANOBY_RUINS, EventScript_Return setweather WEATHER_SHADE doweather return EventScript_BrailleCursorWaitButton:: special BrailleCursorToggle waitbuttonpress playse SE_SELECT setvar VAR_0x8006, 1 special BrailleCursorToggle return EventScript_NoMoreRoomForPokemon:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox Text_NoMoreRoomForPokemon release end .include "data/text/braille.inc" .include "data/scripts/trainers.inc" .include "data/scripts/master_trainers.inc" .include "data/scripts/fame_checker.inc" .include "data/text/fame_checker.inc" .include "data/text/sign_lady.inc" .include "data/text/trainer_card.inc" .include "data/scripts/trainer_card.inc" .include "data/text/help_system.inc" .include "data/scripts/cable_club.inc" .include "data/scripts/field_moves.inc" .include "data/scripts/item_ball_scripts.inc" .include "data/scripts/mystery_event_club.inc" .include "data/scripts/day_care.inc" .include "data/text/day_care.inc" .include "data/scripts/flash.inc" .include "data/scripts/repel.inc" .include "data/scripts/safari_zone.inc" .include "data/text/safari_zone.inc" .include "data/text/flavor_text.inc" .include "data/scripts/hole.inc" .include "data/text/trainers.inc" .include "data/scripts/move_tutors.inc" .include "data/scripts/trainer_tower.inc" .include "data/text/save.inc" .include "data/text/new_game_intro.inc" .include "data/text/pokedude.inc" .include "data/maps/FarawayIsland_Exterior/scripts.inc" .include "data/maps/FarawayIsland_Exterior/text.inc" .include "data/maps/FarawayIsland_Interior/scripts.inc" .include "data/maps/FarawayIsland_Interior/text.inc" .include "data/scripts/fuji_event.inc" .include "data/scripts/national_dex_aide.inc" .include "data/maps/OneIsland_KindleRoad_GlassWorkshop/scripts.inc" .include "data/maps/Route20_Underwater/scripts.inc" .include "data/maps/Route20_Underwater/text.inc" .include "data/maps/BattleFrontier_OutsideWest/scripts.inc" .include "data/maps/BattleFrontier_OutsideWest/text.inc" .include "data/maps/BattleFrontier_OutsideEast/scripts.inc" .include "data/maps/BattleFrontier_OutsideEast/text.inc" .include "data/maps/RS_BattleTower/scripts.inc" .include "data/maps/RS_BattleTower/text.inc" .include "data/maps/RS_BattleTower_Lobby/scripts.inc" .include "data/maps/RS_BattleTower_Lobby/text.inc" .include "data/maps/RS_BattleTower_Elevator/scripts.inc" .include "data/maps/RS_BattleTower_Elevator/text.inc" .include "data/maps/RS_BattleTower_Corridor/scripts.inc" .include "data/maps/RS_BattleTower_Corridor/text.inc" .include "data/maps/RS_BattleTower_BattleRoom/scripts.inc" .include "data/maps/RS_BattleTower_BattleRoom/text.inc" .include "data/maps/SafariZone_NorthWest/scripts.inc" .include "data/maps/SafariZone_NorthWest/text.inc" .include "data/maps/SafariZone_NorthEast/scripts.inc" .include "data/maps/SafariZone_NorthEast/text.inc" .include "data/maps/SafariZone_NorthWest_RestHouse/scripts.inc" .include "data/maps/SafariZone_NorthWest_RestHouse/text.inc" .include "data/maps/ThreeIsland_BondBridge_Underwater/scripts.inc" .include "data/maps/ThreeIsland_BondBridge_Underwater/text.inc" .include "data/maps/ArtisanCave_B1F/scripts.inc" .include "data/maps/ArtisanCave_B1F/text.inc" .include "data/maps/ArtisanCave_1F/scripts.inc" .include "data/maps/ArtisanCave_1F/text.inc" .include "data/maps/SouthernIsland_Exterior/scripts.inc" .include "data/maps/SouthernIsland_Exterior/text.inc" .include "data/maps/SouthernIsland_Interior/scripts.inc" .include "data/maps/SouthernIsland_Interior/text.inc" .include "data/maps/CeruleanCave_1F_Blue/scripts.inc" .include "data/maps/CeruleanCave_1F_Blue/text.inc" .include "data/maps/CeruleanCave_2F_Blue/scripts.inc" .include "data/maps/CeruleanCave_2F_Blue/text.inc" .include "data/maps/CeruleanCave_B1F_Blue/scripts.inc" .include "data/maps/CeruleanCave_B1F_Blue/text.inc" .include "data/maps/CeruleanCave_1F_Yellow/scripts.inc" .include "data/maps/CeruleanCave_1F_Yellow/text.inc" .include "data/maps/CeruleanCave_2F_Yellow/scripts.inc" .include "data/maps/CeruleanCave_2F_Yellow/text.inc" .include "data/maps/CeruleanCave_B1F_Yellow/scripts.inc" .include "data/maps/CeruleanCave_B1F_Yellow/text.inc" .include "data/maps/FourIsland_Base/scripts.inc" .include "data/maps/FourIsland_Base/text.inc" .include "data/maps/FourIsland_Base_CableCarStation/scripts.inc" .include "data/maps/FourIsland_Base_CableCarStation/text.inc" .include "data/maps/FourIsland_CableCarStation/scripts.inc" .include "data/maps/FourIsland_CableCarStation/text.inc" .include "data/maps/BattleFrontier_Lounge2/scripts.inc" .include "data/maps/BattleFrontier_Lounge2/text.inc" .include "data/maps/BattleFrontier_Lounge1/scripts.inc" .include "data/maps/BattleFrontier_Lounge1/text.inc" .include "data/maps/BattleFrontier_Lounge3/scripts.inc" .include "data/maps/BattleFrontier_Lounge3/text.inc" .include "data/maps/BattleFrontier_Lounge4/scripts.inc" .include "data/maps/BattleFrontier_Lounge4/text.inc" .include "data/maps/BattleFrontier_Lounge5/scripts.inc" .include "data/maps/BattleFrontier_Lounge5/text.inc" .include "data/maps/BattleFrontier_Lounge6/scripts.inc" .include "data/maps/BattleFrontier_Lounge6/text.inc" .include "data/maps/BattleFrontier_Lounge7/scripts.inc" .include "data/maps/BattleFrontier_Lounge7/text.inc" .include "data/maps/BattleFrontier_Lounge8/scripts.inc" .include "data/maps/BattleFrontier_Lounge8/text.inc" .include "data/maps/BattleFrontier_ReceptionGate/scripts.inc" .include "data/maps/BattleFrontier_ReceptionGate/text.inc" .include "data/maps/BattleFrontier_ExchangeServiceCorner/scripts.inc" .include "data/maps/BattleFrontier_ExchangeServiceCorner/text.inc" .include "data/maps/BattleFrontier_ScottsHouse/scripts.inc" .include "data/maps/BattleFrontier_ScottsHouse/text.inc" .include "data/maps/BattleFrontier_PokemonCenter_1F/scripts.inc" .include "data/maps/BattleFrontier_PokemonCenter_1F/text.inc" .include "data/maps/BattleFrontier_PokemonCenter_2F/scripts.inc" .include "data/maps/BattleFrontier_PokemonCenter_2F/text.inc" .include "data/maps/BattleFrontier_Mart/scripts.inc" .include "data/maps/BattleFrontier_Mart/text.inc" .include "data/maps/BattleFrontier_RankingHall/scripts.inc" .include "data/maps/BattleFrontier_RankingHall/text.inc" ================================================ FILE: data/field_effect_scripts.s ================================================ .include "asm/macros/field_effect_script.inc" .section script_data, "aw", %progbits .align 2 gFieldEffectScriptPointers:: .4byte gFldEffScript_ExclamationMarkIcon @ FLDEFF_EXCLAMATION_MARK_ICON .4byte gFldEffScript_UseCutOnGrass @ FLDEFF_USE_CUT_ON_GRASS .4byte gFldEffScript_UseCutOnTree @ FLDEFF_USE_CUT_ON_TREE .4byte gFldEffScript_Shadow @ FLDEFF_SHADOW .4byte gFldEffScript_TallGrass @ FLDEFF_TALL_GRASS .4byte gFldEffScript_Ripple @ FLDEFF_RIPPLE .4byte gFldEffScript_FieldMoveShowMon @ FLDEFF_FIELD_MOVE_SHOW_MON .4byte gFldEffScript_Ash @ FLDEFF_ASH .4byte gFldEffScript_SurfBlob @ FLDEFF_SURF_BLOB .4byte gFldEffScript_UseSurf @ FLDEFF_USE_SURF .4byte gFldEffScript_Dust @ FLDEFF_DUST .4byte gFldEffScript_UseSecretPowerCave @ FLDEFF_USE_SECRET_POWER_CAVE .4byte gFldEffScript_JumpTallGrass @ FLDEFF_JUMP_TALL_GRASS .4byte gFldEffScript_SandFootprints @ FLDEFF_SAND_FOOTPRINTS .4byte gFldEffScript_JumpBigSplash @ FLDEFF_JUMP_BIG_SPLASH .4byte gFldEffScript_Splash @ FLDEFF_SPLASH .4byte gFldEffScript_JumpSmallSplash @ FLDEFF_JUMP_SMALL_SPLASH .4byte gFldEffScript_LongGrass @ FLDEFF_LONG_GRASS .4byte gFldEffScript_JumpLongGrass @ FLDEFF_JUMP_LONG_GRASS .4byte gFldEffScript_UnusedGrass @ FLDEFF_UNUSED_GRASS .4byte gFldEffScript_UnusedGrass2 @ FLDEFF_UNUSED_GRASS_2 .4byte gFldEffScript_UnusedSand @ FLDEFF_UNUSED_SAND .4byte gFldEffScript_UnusedWaterSurfacing @ FLDEFF_UNUSED_WATER_SURFACING .4byte gFldEffScript_BerryTreeGrowthSparkle @ FLDEFF_BERRY_TREE_GROWTH_SPARKLE .4byte gFldEffScript_DeepSandFootprints @ FLDEFF_DEEP_SAND_FOOTPRINTS .4byte gFldEffScript_PokecenterHeal @ FLDEFF_POKECENTER_HEAL .4byte gFldEffScript_UseSecretPowerTree @ FLDEFF_USE_SECRET_POWER_TREE .4byte gFldEffScript_UseSecretPowerShrub @ FLDEFF_USE_SECRET_POWER_SHRUB .4byte gFldEffScript_TreeDisguise @ FLDEFF_TREE_DISGUISE .4byte gFldEffScript_MountainDisguise @ FLDEFF_MOUNTAIN_DISGUISE .4byte gFldEffScript_NpcflyOut @ FLDEFF_NPCFLY_OUT .4byte gFldEffScript_FlyOut @ FLDEFF_FLY_OUT .4byte gFldEffScript_FlyIn @ FLDEFF_FLY_IN .4byte gFldEffScript_QuestionMarkIcon @ FLDEFF_QUESTION_MARK_ICON .4byte gFldEffScript_FeetInFlowingWater @ FLDEFF_FEET_IN_FLOWING_WATER .4byte gFldEffScript_BikeTireTracks @ FLDEFF_BIKE_TIRE_TRACKS .4byte gFldEffScript_SandDisguise @ FLDEFF_SAND_DISGUISE .4byte gFldEffScript_UseRockSmash @ FLDEFF_USE_ROCK_SMASH .4byte gFldEffScript_UseDig @ FLDEFF_USE_DIG .4byte gFldEffScript_SandPile @ FLDEFF_SAND_PILE .4byte gFldEffScript_UseStrength @ FLDEFF_USE_STRENGTH .4byte gFldEffScript_ShortGrass @ FLDEFF_SHORT_GRASS .4byte gFldEffScript_HotSpringsWater @ FLDEFF_HOT_SPRINGS_WATER .4byte gFldEffScript_UseWaterfall @ FLDEFF_USE_WATERFALL .4byte gFldEffScript_UseDive @ FLDEFF_USE_DIVE .4byte gFldEffScript_Pokeball @ FLDEFF_POKEBALL .4byte gFldEffScript_XIcon @ FLDEFF_X_ICON .4byte gFldEffScript_Nop47 @ FLDEFF_NOP_47 .4byte gFldEffScript_Nop48 @ FLDEFF_NOP_48 .4byte gFldEffScript_PopOutOfAsh @ FLDEFF_POP_OUT_OF_ASH .4byte gFldEffScript_LavaridgeGymWarp @ FLDEFF_LAVARIDGE_GYM_WARP .4byte gFldEffScript_SweetScent @ FLDEFF_SWEET_SCENT .4byte gFldEffScript_SandPillar @ FLDEFF_SAND_PILLAR .4byte gFldEffScript_Bubbles @ FLDEFF_BUBBLES .4byte gFldEffScript_Sparkle @ FLDEFF_SPARKLE .4byte gFldEffScript_SecretPowerCave @ FLDEFF_SECRET_POWER_CAVE .4byte gFldEffScript_SecretPowerTree @ FLDEFF_SECRET_POWER_TREE .4byte gFldEffScript_SecretPowerShrub @ FLDEFF_SECRET_POWER_SHRUB .4byte gFldEffScript_CutGrass @ FLDEFF_CUT_GRASS .4byte gFldEffScript_FieldMoveShowMonInit @ FLDEFF_FIELD_MOVE_SHOW_MON_INIT .4byte gFldEffScript_UseFlyAncientTomb @ FLDEFF_USE_FLY_ANCIENT_TOMB .4byte gFldEffScript_PcturnOn @ FLDEFF_PCTURN_ON .4byte gFldEffScript_HallOfFameRecord @ FLDEFF_HALL_OF_FAME_RECORD .4byte gFldEffScript_UseTeleport @ FLDEFF_USE_TELEPORT .4byte gFldEffScript_SmileyFaceIcon @ FLDEFF_SMILEY_FACE_ICON .4byte gFldEffScript_UseVsSeeker @ FLDEFF_USE_VS_SEEKER .4byte gFldEffScript_DoubleExclMarkIcon @ FLDEFF_DOUBLE_EXCL_MARK_ICON .4byte gFldEffScript_MoveDeoxysRock @ FLDEFF_MOVE_DEOXYS_ROCK .4byte gFldEffScript_DestroyDeoxysRock @ FLDEFF_DESTROY_DEOXYS_ROCK .4byte gFldEffScript_PhotoFlash @ FLDEFF_PHOTO_FLASH gFldEffScript_ExclamationMarkIcon:: callnative FldEff_ExclamationMarkIcon1 end gFldEffScript_UseCutOnGrass:: callnative FldEff_UseCutOnGrass end gFldEffScript_UseCutOnTree:: callnative FldEff_UseCutOnTree end gFldEffScript_Shadow:: callnative FldEff_Shadow end gFldEffScript_TallGrass:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_TallGrass end gFldEffScript_Ripple:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_Ripple end gFldEffScript_FieldMoveShowMon:: callnative FldEff_FieldMoveShowMon end gFldEffScript_Ash:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_Ash end gFldEffScript_SurfBlob:: callnative FldEff_SurfBlob end gFldEffScript_UseSurf:: callnative FldEff_UseSurf end gFldEffScript_Dust:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_Dust end gFldEffScript_UseSecretPowerCave:: end gFldEffScript_JumpTallGrass:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_JumpTallGrass end gFldEffScript_SandFootprints:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_SandFootprints end gFldEffScript_JumpBigSplash:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_JumpBigSplash end gFldEffScript_Splash:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_Splash end gFldEffScript_JumpSmallSplash:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_JumpSmallSplash end gFldEffScript_LongGrass:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_LongGrass end gFldEffScript_JumpLongGrass:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_JumpLongGrass end gFldEffScript_UnusedGrass:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass end gFldEffScript_UnusedGrass2:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass2 end gFldEffScript_UnusedSand:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_UnusedSand end gFldEffScript_UnusedWaterSurfacing:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_UnusedWaterSurfacing end gFldEffScript_BerryTreeGrowthSparkle:: callnative FldEff_BerryTreeGrowthSparkle end gFldEffScript_DeepSandFootprints:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_DeepSandFootprints end gFldEffScript_PokecenterHeal:: loadfadedpal gSpritePalette_PokeballGlow loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_PokecenterHeal end gFldEffScript_UseSecretPowerTree:: end gFldEffScript_UseSecretPowerShrub:: end gFldEffScript_TreeDisguise:: callnative ShowTreeDisguiseFieldEffect end gFldEffScript_MountainDisguise:: callnative ShowMountainDisguiseFieldEffect end gFldEffScript_NpcflyOut:: callnative FldEff_NpcFlyOut end gFldEffScript_FlyOut:: callnative FldEff_FlyOut end gFldEffScript_FlyIn:: callnative FldEff_FlyIn end gFldEffScript_QuestionMarkIcon:: callnative FldEff_QuestionMarkIcon end gFldEffScript_FeetInFlowingWater:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_FeetInFlowingWater end gFldEffScript_BikeTireTracks:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_BikeTireTracks end gFldEffScript_SandDisguise:: callnative ShowSandDisguiseFieldEffect end gFldEffScript_UseRockSmash:: callnative FldEff_UseRockSmash end gFldEffScript_UseStrength:: callnative FldEff_UseStrength end gFldEffScript_UseDig:: callnative FldEff_UseDig end gFldEffScript_SandPile:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_SandPile end gFldEffScript_ShortGrass:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_ShortGrass end gFldEffScript_HotSpringsWater:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_HotSpringsWater end gFldEffScript_UseWaterfall:: callnative FldEff_UseWaterfall end gFldEffScript_UseDive:: callnative FldEff_UseDive end gFldEffScript_Pokeball:: loadpal gSpritePalette_Pokeball callnative FldEff_PokeballTrail end gFldEffScript_XIcon:: callnative FldEff_XIcon end gFldEffScript_Nop47:: end gFldEffScript_Nop48:: end gFldEffScript_PopOutOfAsh:: loadfadedpal_callnative gSpritePalette_Ash, FldEff_PopOutOfAsh end gFldEffScript_LavaridgeGymWarp:: loadfadedpal_callnative gSpritePalette_Ash, FldEff_LavaridgeGymWarp end gFldEffScript_SweetScent:: callnative FldEff_SweetScent end gFldEffScript_SandPillar:: end gFldEffScript_Bubbles:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_Bubbles end gFldEffScript_Sparkle:: loadfadedpal_callnative gSpritePalette_SmallSparkle, FldEff_Sparkle end gFldEffScript_SecretPowerCave:: end gFldEffScript_SecretPowerTree:: end gFldEffScript_SecretPowerShrub:: end gFldEffScript_CutGrass:: loadfadedpal_callnative gFldEffPalette_CutGrass, FldEff_CutGrass end gFldEffScript_FieldMoveShowMonInit:: callnative FldEff_FieldMoveShowMonInit end gFldEffScript_UseFlyAncientTomb:: end gFldEffScript_PcturnOn:: end gFldEffScript_HallOfFameRecord:: loadfadedpal gSpritePalette_PokeballGlow loadfadedpal_callnative gSpritePalette_HofMonitor, FldEff_HallOfFameRecord end gFldEffScript_UseTeleport:: callnative FldEff_UseTeleport end gFldEffScript_SmileyFaceIcon:: callnative FldEff_SmileyFaceIcon end gFldEffScript_UseVsSeeker:: callnative FldEff_UseVsSeeker end gFldEffScript_DoubleExclMarkIcon:: callnative FldEff_DoubleExclMarkIcon end gFldEffScript_MoveDeoxysRock:: callnative FldEff_MoveDeoxysRock end gFldEffScript_DestroyDeoxysRock:: callnative FldEff_DestroyDeoxysRock end gFldEffScript_PhotoFlash:: callnative FldEff_PhotoFlash end ================================================ FILE: data/layouts/.gitignore ================================================ layouts.inc layouts_table.inc ================================================ FILE: data/layouts/layouts.json ================================================ { "layouts_table_label": "gMapLayouts", "layouts": [ { "id": "LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_1F", "name": "PalletTown_PlayersHouse_1F_Layout", "width": 13, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding1", "border_filepath": "data/layouts/PalletTown_PlayersHouse_1F/border.bin", "blockdata_filepath": "data/layouts/PalletTown_PlayersHouse_1F/map.bin" }, { "id": "LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_2F", "name": "PalletTown_PlayersHouse_2F_Layout", "width": 12, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding1", "border_filepath": "data/layouts/PalletTown_PlayersHouse_2F/border.bin", "blockdata_filepath": "data/layouts/PalletTown_PlayersHouse_2F/map.bin" }, { "id": "LAYOUT_PALLET_TOWN_RIVALS_HOUSE", "name": "PalletTown_RivalsHouse_Layout", "width": 13, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/PalletTown_RivalsHouse/border.bin", "blockdata_filepath": "data/layouts/PalletTown_RivalsHouse/map.bin" }, { "id": "LAYOUT_LITTLEROOT_TOWN_MAYS_HOUSE_2F", "name": "LittlerootTown_MaysHouse_2F_Layout", "width": 9, "height": 8, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding1", "border_filepath": "data/layouts/LittlerootTown_MaysHouse_2F/border.bin", "blockdata_filepath": "data/layouts/LittlerootTown_MaysHouse_2F/map.bin" }, { "id": "LAYOUT_PALLET_TOWN_PROFESSOR_OAKS_LAB", "name": "PalletTown_ProfessorOaksLab_Layout", "width": 13, "height": 14, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Lab", "border_filepath": "data/layouts/PalletTown_ProfessorOaksLab/border.bin", "blockdata_filepath": "data/layouts/PalletTown_ProfessorOaksLab/map.bin" }, { "id": "LAYOUT_HOUSE1", "name": "House1_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding1", "border_filepath": "data/layouts/House1/border.bin", "blockdata_filepath": "data/layouts/House1/map.bin" }, { "id": "LAYOUT_HOUSE2", "name": "House2_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/House2/border.bin", "blockdata_filepath": "data/layouts/House2/map.bin" }, { "id": "LAYOUT_POKEMON_CENTER_1F", "name": "PokemonCenter_1F_Layout", "width": 15, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonCenter", "border_filepath": "data/layouts/PokemonCenter_1F/border.bin", "blockdata_filepath": "data/layouts/PokemonCenter_1F/map.bin" }, { "id": "LAYOUT_POKEMON_CENTER_2F", "name": "PokemonCenter_2F_Layout", "width": 15, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonCenter", "border_filepath": "data/layouts/PokemonCenter_2F/border.bin", "blockdata_filepath": "data/layouts/PokemonCenter_2F/map.bin" }, { "id": "LAYOUT_MART", "name": "Mart_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Mart", "border_filepath": "data/layouts/Mart/border.bin", "blockdata_filepath": "data/layouts/Mart/map.bin" }, { "id": "LAYOUT_HOUSE3", "name": "House3_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/House3/border.bin", "blockdata_filepath": "data/layouts/House3/map.bin" }, { "id": "LAYOUT_CERULEAN_CITY_GYM", "name": "CeruleanCity_Gym_Layout", "width": 17, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_CeruleanGym", "border_filepath": "data/layouts/CeruleanCity_Gym/border.bin", "blockdata_filepath": "data/layouts/CeruleanCity_Gym/map.bin" }, { "id": "LAYOUT_HOUSE4", "name": "House4_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/House4/border.bin", "blockdata_filepath": "data/layouts/House4/map.bin" }, { "id": "LAYOUT_LAVARIDGE_TOWN_HERB_SHOP", "name": "LavaridgeTown_HerbShop_Layout", "width": 11, "height": 8, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Mart", "border_filepath": "data/layouts/LavaridgeTown_HerbShop/border.bin", "blockdata_filepath": "data/layouts/LavaridgeTown_HerbShop/map.bin" }, { "id": "LAYOUT_CELADON_CITY_GYM", "name": "CeladonCity_Gym_Layout", "width": 13, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_CeladonGym", "border_filepath": "data/layouts/CeladonCity_Gym/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Gym/map.bin" }, { "id": "LAYOUT_RS_POKEMON_CENTER_1F", "name": "RS_PokemonCenter_1F_Layout", "width": 14, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonCenter", "border_filepath": "data/layouts/RS_PokemonCenter_1F/border.bin", "blockdata_filepath": "data/layouts/RS_PokemonCenter_1F/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE", "name": "FiveIsland_ResortGorgeous_House_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Museum", "border_filepath": "data/layouts/FiveIsland_ResortGorgeous_House/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_ResortGorgeous_House/map.bin" }, { "id": "LAYOUT_PACIFIDLOG_TOWN_HOUSE1", "name": "PacifidlogTown_House1_Layout", "width": 10, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/PacifidlogTown_House1/border.bin", "blockdata_filepath": "data/layouts/PacifidlogTown_House1/map.bin" }, { "id": "LAYOUT_PACIFIDLOG_TOWN_HOUSE2", "name": "PacifidlogTown_House2_Layout", "width": 10, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/PacifidlogTown_House2/border.bin", "blockdata_filepath": "data/layouts/PacifidlogTown_House2/map.bin" }, { "id": "LAYOUT_FUCHSIA_CITY_GYM", "name": "FuchsiaCity_Gym_Layout", "width": 15, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_FuchsiaGym", "border_filepath": "data/layouts/FuchsiaCity_Gym/border.bin", "blockdata_filepath": "data/layouts/FuchsiaCity_Gym/map.bin" }, { "id": "LAYOUT_HOUSE5", "name": "House5_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding1", "border_filepath": "data/layouts/House5/border.bin", "blockdata_filepath": "data/layouts/House5/map.bin" }, { "id": "LAYOUT_UNUSED1", "name": "Unused1_Layout", "width": 12, "height": 12, "border_width": 2, "border_height": 2, "primary_tileset": "NULL", "secondary_tileset": "gTileset_Dummy1", "border_filepath": "data/layouts/Unused1/border.bin", "blockdata_filepath": "data/layouts/Unused1/map.bin" }, { "id": "LAYOUT_VERMILION_CITY_GYM", "name": "VermilionCity_Gym_Layout", "width": 11, "height": 21, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_VermilionGym", "border_filepath": "data/layouts/VermilionCity_Gym/border.bin", "blockdata_filepath": "data/layouts/VermilionCity_Gym/map.bin" }, { "id": "LAYOUT_CERULEAN_CITY_BIKE_SHOP", "name": "CeruleanCity_BikeShop_Layout", "width": 11, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BikeShop", "border_filepath": "data/layouts/CeruleanCity_BikeShop/border.bin", "blockdata_filepath": "data/layouts/CeruleanCity_BikeShop/map.bin" }, { "id": "LAYOUT_CELADON_CITY_GAME_CORNER", "name": "CeladonCity_GameCorner_Layout", "width": 18, "height": 15, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GameCorner", "border_filepath": "data/layouts/CeladonCity_GameCorner/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_GameCorner/map.bin" }, { "id": "LAYOUT_PEWTER_CITY_GYM", "name": "PewterCity_Gym_Layout", "width": 13, "height": 16, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PewterGym", "border_filepath": "data/layouts/PewterCity_Gym/border.bin", "blockdata_filepath": "data/layouts/PewterCity_Gym/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND_LORELEIS_HOUSE", "name": "FourIsland_LoreleisHouse_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SafariZoneBuilding", "border_filepath": "data/layouts/FourIsland_LoreleisHouse/border.bin", "blockdata_filepath": "data/layouts/FourIsland_LoreleisHouse/map.bin" }, { "id": "LAYOUT_THREE_ISLAND_HOUSE1", "name": "ThreeIsland_House1_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Lab", "border_filepath": "data/layouts/ThreeIsland_House1/border.bin", "blockdata_filepath": "data/layouts/ThreeIsland_House1/map.bin" }, { "id": "LAYOUT_RUSTBORO_CITY_CUTTERS_HOUSE", "name": "RustboroCity_CuttersHouse_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/RustboroCity_CuttersHouse/border.bin", "blockdata_filepath": "data/layouts/RustboroCity_CuttersHouse/map.bin" }, { "id": "LAYOUT_FORTREE_CITY_HOUSE1", "name": "FortreeCity_House1_Layout", "width": 8, "height": 6, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/FortreeCity_House1/border.bin", "blockdata_filepath": "data/layouts/FortreeCity_House1/map.bin" }, { "id": "LAYOUT_SAFFRON_CITY_GYM", "name": "SaffronCity_Gym_Layout", "width": 29, "height": 25, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SaffronGym", "border_filepath": "data/layouts/SaffronCity_Gym/border.bin", "blockdata_filepath": "data/layouts/SaffronCity_Gym/map.bin" }, { "id": "LAYOUT_FORTREE_CITY_HOUSE2", "name": "FortreeCity_House2_Layout", "width": 8, "height": 6, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/FortreeCity_House2/border.bin", "blockdata_filepath": "data/layouts/FortreeCity_House2/map.bin" }, { "id": "LAYOUT_CINNABAR_ISLAND_GYM", "name": "CinnabarIsland_Gym_Layout", "width": 30, "height": 25, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_CinnabarGym", "border_filepath": "data/layouts/CinnabarIsland_Gym/border.bin", "blockdata_filepath": "data/layouts/CinnabarIsland_Gym/map.bin" }, { "id": "LAYOUT_VIRIDIAN_CITY_GYM", "name": "ViridianCity_Gym_Layout", "width": 20, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_ViridianGym", "border_filepath": "data/layouts/ViridianCity_Gym/border.bin", "blockdata_filepath": "data/layouts/ViridianCity_Gym/map.bin" }, { "id": "LAYOUT_RS_SAFARI_ZONE_ENTRANCE", "name": "RS_SafariZone_Entrance_Layout", "width": 18, "height": 14, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Mart", "border_filepath": "data/layouts/RS_SafariZone_Entrance/border.bin", "blockdata_filepath": "data/layouts/RS_SafariZone_Entrance/map.bin" }, { "id": "LAYOUT_BATTLE_COLOSSEUM_2P", "name": "BattleColosseum_2P_Layout", "width": 14, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_CableClub", "border_filepath": "data/layouts/BattleColosseum_2P/border.bin", "blockdata_filepath": "data/layouts/BattleColosseum_2P/map.bin" }, { "id": "LAYOUT_TRADE_CENTER", "name": "TradeCenter_Layout", "width": 12, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_CableClub", "border_filepath": "data/layouts/TradeCenter/border.bin", "blockdata_filepath": "data/layouts/TradeCenter/map.bin" }, { "id": "LAYOUT_RECORD_CORNER", "name": "RecordCorner_Layout", "width": 20, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_CableClub", "border_filepath": "data/layouts/RecordCorner/border.bin", "blockdata_filepath": "data/layouts/RecordCorner/map.bin" }, { "id": "LAYOUT_BATTLE_COLOSSEUM_4P", "name": "BattleColosseum_4P_Layout", "width": 14, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_CableClub", "border_filepath": "data/layouts/BattleColosseum_4P/border.bin", "blockdata_filepath": "data/layouts/BattleColosseum_4P/map.bin" }, { "id": "LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE", "name": "FuchsiaCity_SafariZone_Entrance_Layout", "width": 9, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SafariZoneBuilding", "border_filepath": "data/layouts/FuchsiaCity_SafariZone_Entrance/border.bin", "blockdata_filepath": "data/layouts/FuchsiaCity_SafariZone_Entrance/map.bin" }, { "id": "LAYOUT_RS_SAFARI_ZONE_NORTHEAST", "name": "RS_SafariZone_Northeast_Layout", "width": 40, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CinnabarIsland", "border_filepath": "data/layouts/RS_SafariZone_Northeast/border.bin", "blockdata_filepath": "data/layouts/RS_SafariZone_Northeast/map.bin" }, { "id": "LAYOUT_RS_SAFARI_ZONE_SOUTHWEST", "name": "RS_SafariZone_Southwest_Layout", "width": 40, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CinnabarIsland", "border_filepath": "data/layouts/RS_SafariZone_Southwest/border.bin", "blockdata_filepath": "data/layouts/RS_SafariZone_Southwest/map.bin" }, { "id": "LAYOUT_RS_SAFARI_ZONE_SOUTHEAST", "name": "RS_SafariZone_Southeast_Layout", "width": 40, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CinnabarIsland", "border_filepath": "data/layouts/RS_SafariZone_Southeast/border.bin", "blockdata_filepath": "data/layouts/RS_SafariZone_Southeast/map.bin" }, { "id": "LAYOUT_FORTREE_CITY_DECORATION_SHOP", "name": "FortreeCity_DecorationShop_Layout", "width": 8, "height": 6, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/FortreeCity_DecorationShop/border.bin", "blockdata_filepath": "data/layouts/FortreeCity_DecorationShop/map.bin" }, { "id": "LAYOUT_RS_BATTLE_TOWER", "name": "RS_BattleTower_Layout", "width": 29, "height": 30, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_BattleFrontierOutsideEast", "border_filepath": "data/layouts/RS_BattleTower/border.bin", "blockdata_filepath": "data/layouts/RS_BattleTower/map.bin" }, { "id": "LAYOUT_SS_TIDAL_CORRIDOR", "name": "SSTidal_Corridor_Layout", "width": 18, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSTidal_Corridor/border.bin", "blockdata_filepath": "data/layouts/SSTidal_Corridor/map.bin" }, { "id": "LAYOUT_SS_TIDAL_LOWER_DECK", "name": "SSTidal_LowerDeck_Layout", "width": 17, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSTidal_LowerDeck/border.bin", "blockdata_filepath": "data/layouts/SSTidal_LowerDeck/map.bin" }, { "id": "LAYOUT_SS_TIDAL_ROOMS", "name": "SSTidal_Rooms_Layout", "width": 36, "height": 18, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSTidal_Rooms/border.bin", "blockdata_filepath": "data/layouts/SSTidal_Rooms/map.bin" }, { "id": "LAYOUT_RUSTBORO_CITY_FLAT2_1F", "name": "RustboroCity_Flat2_1F_Layout", "width": 14, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/RustboroCity_Flat2_1F/border.bin", "blockdata_filepath": "data/layouts/RustboroCity_Flat2_1F/map.bin" }, { "id": "LAYOUT_RUSTBORO_CITY_FLAT2_2F", "name": "RustboroCity_Flat2_2F_Layout", "width": 14, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/RustboroCity_Flat2_2F/border.bin", "blockdata_filepath": "data/layouts/RustboroCity_Flat2_2F/map.bin" }, { "id": "LAYOUT_RUSTBORO_CITY_FLAT2_3F", "name": "RustboroCity_Flat2_3F_Layout", "width": 14, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/RustboroCity_Flat2_3F/border.bin", "blockdata_filepath": "data/layouts/RustboroCity_Flat2_3F/map.bin" }, { "id": "LAYOUT_EVER_GRANDE_CITY_HALL_OF_FAME", "name": "EverGrandeCity_HallOfFame_Layout", "width": 15, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_CableClub", "border_filepath": "data/layouts/EverGrandeCity_HallOfFame/border.bin", "blockdata_filepath": "data/layouts/EverGrandeCity_HallOfFame/map.bin" }, { "id": "LAYOUT_MOSSDEEP_CITY_EREADER_TRAINER_HOUSE_1F", "name": "MossdeepCity_EReaderTrainerHouse_1F_Layout", "width": 11, "height": 8, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/MossdeepCity_EReaderTrainerHouse_1F/border.bin", "blockdata_filepath": "data/layouts/MossdeepCity_EReaderTrainerHouse_1F/map.bin" }, { "id": "LAYOUT_MOSSDEEP_CITY_EREADER_TRAINER_HOUSE_2F", "name": "MossdeepCity_EReaderTrainerHouse_2F_Layout", "width": 12, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/MossdeepCity_EReaderTrainerHouse_2F/border.bin", "blockdata_filepath": "data/layouts/MossdeepCity_EReaderTrainerHouse_2F/map.bin" }, { "id": "LAYOUT_SOOTOPOLIS_CITY_HOUSE1", "name": "SootopolisCity_House1_Layout", "width": 8, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/SootopolisCity_House1/border.bin", "blockdata_filepath": "data/layouts/SootopolisCity_House1/map.bin" }, { "id": "LAYOUT_SOOTOPOLIS_CITY_HOUSE2", "name": "SootopolisCity_House2_Layout", "width": 8, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/SootopolisCity_House2/border.bin", "blockdata_filepath": "data/layouts/SootopolisCity_House2/map.bin" }, { "id": "LAYOUT_SOOTOPOLIS_CITY_HOUSE3", "name": "SootopolisCity_House3_Layout", "width": 8, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/SootopolisCity_House3/border.bin", "blockdata_filepath": "data/layouts/SootopolisCity_House3/map.bin" }, { "id": "LAYOUT_RUSTBORO_CITY_FLAT1_1F", "name": "RustboroCity_Flat1_1F_Layout", "width": 14, "height": 8, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/RustboroCity_Flat1_1F/border.bin", "blockdata_filepath": "data/layouts/RustboroCity_Flat1_1F/map.bin" }, { "id": "LAYOUT_RUSTBORO_CITY_FLAT1_2F", "name": "RustboroCity_Flat1_2F_Layout", "width": 14, "height": 8, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/RustboroCity_Flat1_2F/border.bin", "blockdata_filepath": "data/layouts/RustboroCity_Flat1_2F/map.bin" }, { "id": "LAYOUT_RS_SAFARI_ZONE_REST_HOUSE", "name": "RS_SafariZone_RestHouse_Layout", "width": 10, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/RS_SafariZone_RestHouse/border.bin", "blockdata_filepath": "data/layouts/RS_SafariZone_RestHouse/map.bin" }, { "id": "LAYOUT_PALLET_TOWN", "name": "PalletTown_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_PalletTown", "border_filepath": "data/layouts/PalletTown/border.bin", "blockdata_filepath": "data/layouts/PalletTown/map.bin" }, { "id": "LAYOUT_VIRIDIAN_CITY", "name": "ViridianCity_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_ViridianCity", "border_filepath": "data/layouts/ViridianCity/border.bin", "blockdata_filepath": "data/layouts/ViridianCity/map.bin" }, { "id": "LAYOUT_PEWTER_CITY", "name": "PewterCity_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_PewterCity", "border_filepath": "data/layouts/PewterCity/border.bin", "blockdata_filepath": "data/layouts/PewterCity/map.bin" }, { "id": "LAYOUT_CERULEAN_CITY", "name": "CeruleanCity_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCity", "border_filepath": "data/layouts/CeruleanCity/border.bin", "blockdata_filepath": "data/layouts/CeruleanCity/map.bin" }, { "id": "LAYOUT_LAVENDER_TOWN", "name": "LavenderTown_Layout", "width": 24, "height": 21, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_LavenderTown", "border_filepath": "data/layouts/LavenderTown/border.bin", "blockdata_filepath": "data/layouts/LavenderTown/map.bin" }, { "id": "LAYOUT_VERMILION_CITY", "name": "VermilionCity_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_VermilionCity", "border_filepath": "data/layouts/VermilionCity/border.bin", "blockdata_filepath": "data/layouts/VermilionCity/map.bin" }, { "id": "LAYOUT_CELADON_CITY", "name": "CeladonCity_Layout", "width": 60, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeladonCity", "border_filepath": "data/layouts/CeladonCity/border.bin", "blockdata_filepath": "data/layouts/CeladonCity/map.bin" }, { "id": "LAYOUT_FUCHSIA_CITY", "name": "FuchsiaCity_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_FuchsiaCity", "border_filepath": "data/layouts/FuchsiaCity/border.bin", "blockdata_filepath": "data/layouts/FuchsiaCity/map.bin" }, { "id": "LAYOUT_CINNABAR_ISLAND", "name": "CinnabarIsland_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CinnabarIsland", "border_filepath": "data/layouts/CinnabarIsland/border.bin", "blockdata_filepath": "data/layouts/CinnabarIsland/map.bin" }, { "id": "LAYOUT_INDIGO_PLATEAU_EXTERIOR", "name": "IndigoPlateau_Exterior_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_IndigoPlateau", "border_filepath": "data/layouts/IndigoPlateau_Exterior/border.bin", "blockdata_filepath": "data/layouts/IndigoPlateau_Exterior/map.bin" }, { "id": "LAYOUT_SAFFRON_CITY_CONNECTION", "name": "SaffronCity_Connection_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SaffronCity", "border_filepath": "data/layouts/SaffronCity_Connection/border.bin", "blockdata_filepath": "data/layouts/SaffronCity_Connection/map.bin" }, { "id": "LAYOUT_ROUTE1", "name": "Route1_Layout", "width": 24, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_PalletTown", "border_filepath": "data/layouts/Route1/border.bin", "blockdata_filepath": "data/layouts/Route1/map.bin" }, { "id": "LAYOUT_ROUTE2", "name": "Route2_Layout", "width": 24, "height": 80, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_ViridianCity", "border_filepath": "data/layouts/Route2/border.bin", "blockdata_filepath": "data/layouts/Route2/map.bin" }, { "id": "LAYOUT_ROUTE3", "name": "Route3_Layout", "width": 84, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_PewterCity", "border_filepath": "data/layouts/Route3/border.bin", "blockdata_filepath": "data/layouts/Route3/map.bin" }, { "id": "LAYOUT_ROUTE4", "name": "Route4_Layout", "width": 108, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCity", "border_filepath": "data/layouts/Route4/border.bin", "blockdata_filepath": "data/layouts/Route4/map.bin" }, { "id": "LAYOUT_ROUTE5", "name": "Route5_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCity", "border_filepath": "data/layouts/Route5/border.bin", "blockdata_filepath": "data/layouts/Route5/map.bin" }, { "id": "LAYOUT_ROUTE6", "name": "Route6_Layout", "width": 24, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_VermilionCity", "border_filepath": "data/layouts/Route6/border.bin", "blockdata_filepath": "data/layouts/Route6/map.bin" }, { "id": "LAYOUT_ROUTE7", "name": "Route7_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeladonCity", "border_filepath": "data/layouts/Route7/border.bin", "blockdata_filepath": "data/layouts/Route7/map.bin" }, { "id": "LAYOUT_ROUTE8", "name": "Route8_Layout", "width": 72, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_LavenderTown", "border_filepath": "data/layouts/Route8/border.bin", "blockdata_filepath": "data/layouts/Route8/map.bin" }, { "id": "LAYOUT_ROUTE9", "name": "Route9_Layout", "width": 72, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCity", "border_filepath": "data/layouts/Route9/border.bin", "blockdata_filepath": "data/layouts/Route9/map.bin" }, { "id": "LAYOUT_ROUTE10", "name": "Route10_Layout", "width": 24, "height": 80, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_LavenderTown", "border_filepath": "data/layouts/Route10/border.bin", "blockdata_filepath": "data/layouts/Route10/map.bin" }, { "id": "LAYOUT_ROUTE11", "name": "Route11_Layout", "width": 72, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_VermilionCity", "border_filepath": "data/layouts/Route11/border.bin", "blockdata_filepath": "data/layouts/Route11/map.bin" }, { "id": "LAYOUT_ROUTE12", "name": "Route12_Layout", "width": 24, "height": 119, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_LavenderTown", "border_filepath": "data/layouts/Route12/border.bin", "blockdata_filepath": "data/layouts/Route12/map.bin" }, { "id": "LAYOUT_ROUTE13", "name": "Route13_Layout", "width": 72, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_LavenderTown", "border_filepath": "data/layouts/Route13/border.bin", "blockdata_filepath": "data/layouts/Route13/map.bin" }, { "id": "LAYOUT_ROUTE14", "name": "Route14_Layout", "width": 24, "height": 60, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_LavenderTown", "border_filepath": "data/layouts/Route14/border.bin", "blockdata_filepath": "data/layouts/Route14/map.bin" }, { "id": "LAYOUT_ROUTE15", "name": "Route15_Layout", "width": 72, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_FuchsiaCity", "border_filepath": "data/layouts/Route15/border.bin", "blockdata_filepath": "data/layouts/Route15/map.bin" }, { "id": "LAYOUT_ROUTE16", "name": "Route16_Layout", "width": 48, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeladonCity", "border_filepath": "data/layouts/Route16/border.bin", "blockdata_filepath": "data/layouts/Route16/map.bin" }, { "id": "LAYOUT_ROUTE17", "name": "Route17_Layout", "width": 24, "height": 160, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeladonCity", "border_filepath": "data/layouts/Route17/border.bin", "blockdata_filepath": "data/layouts/Route17/map.bin" }, { "id": "LAYOUT_ROUTE18", "name": "Route18_Layout", "width": 60, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeladonCity", "border_filepath": "data/layouts/Route18/border.bin", "blockdata_filepath": "data/layouts/Route18/map.bin" }, { "id": "LAYOUT_ROUTE19", "name": "Route19_Layout", "width": 24, "height": 60, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_FuchsiaCity", "border_filepath": "data/layouts/Route19/border.bin", "blockdata_filepath": "data/layouts/Route19/map.bin" }, { "id": "LAYOUT_ROUTE20", "name": "Route20_Layout", "width": 120, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CinnabarIsland", "border_filepath": "data/layouts/Route20/border.bin", "blockdata_filepath": "data/layouts/Route20/map.bin" }, { "id": "LAYOUT_ROUTE21_NORTH", "name": "Route21_North_Layout", "width": 24, "height": 50, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_PalletTown", "border_filepath": "data/layouts/Route21_North/border.bin", "blockdata_filepath": "data/layouts/Route21_North/map.bin" }, { "id": "LAYOUT_ROUTE22", "name": "Route22_Layout", "width": 48, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_ViridianCity", "border_filepath": "data/layouts/Route22/border.bin", "blockdata_filepath": "data/layouts/Route22/map.bin" }, { "id": "LAYOUT_ROUTE23", "name": "Route23_Layout", "width": 24, "height": 160, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_IndigoPlateau", "border_filepath": "data/layouts/Route23/border.bin", "blockdata_filepath": "data/layouts/Route23/map.bin" }, { "id": "LAYOUT_ROUTE24", "name": "Route24_Layout", "width": 24, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCity", "border_filepath": "data/layouts/Route24/border.bin", "blockdata_filepath": "data/layouts/Route24/map.bin" }, { "id": "LAYOUT_ROUTE25", "name": "Route25_Layout", "width": 72, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCity", "border_filepath": "data/layouts/Route25/border.bin", "blockdata_filepath": "data/layouts/Route25/map.bin" }, { "id": "LAYOUT_MT_MOON_1F", "name": "MtMoon_1F_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/MtMoon_1F/border.bin", "blockdata_filepath": "data/layouts/MtMoon_1F/map.bin" }, { "id": "LAYOUT_MT_MOON_B1F", "name": "MtMoon_B1F_Layout", "width": 49, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/MtMoon_B1F/border.bin", "blockdata_filepath": "data/layouts/MtMoon_B1F/map.bin" }, { "id": "LAYOUT_MT_MOON_B2F", "name": "MtMoon_B2F_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/MtMoon_B2F/border.bin", "blockdata_filepath": "data/layouts/MtMoon_B2F/map.bin" }, { "id": "LAYOUT_VIRIDIAN_FOREST", "name": "ViridianForest_Layout", "width": 54, "height": 69, "border_width": 3, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_ViridianForest", "border_filepath": "data/layouts/ViridianForest/border.bin", "blockdata_filepath": "data/layouts/ViridianForest/map.bin" }, { "id": "LAYOUT_SSANNE_EXTERIOR", "name": "SSAnne_Exterior_Layout", "width": 70, "height": 32, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_VermilionCity", "border_filepath": "data/layouts/SSAnne_Exterior/border.bin", "blockdata_filepath": "data/layouts/SSAnne_Exterior/map.bin" }, { "id": "LAYOUT_SSANNE_1F_CORRIDOR", "name": "SSAnne_1F_Corridor_Layout", "width": 31, "height": 21, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSAnne_1F_Corridor/border.bin", "blockdata_filepath": "data/layouts/SSAnne_1F_Corridor/map.bin" }, { "id": "LAYOUT_SSANNE_2F_CORRIDOR", "name": "SSAnne_2F_Corridor_Layout", "width": 34, "height": 16, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSAnne_2F_Corridor/border.bin", "blockdata_filepath": "data/layouts/SSAnne_2F_Corridor/map.bin" }, { "id": "LAYOUT_SSANNE_3F_CORRIDOR", "name": "SSAnne_3F_Corridor_Layout", "width": 22, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSAnne_3F_Corridor/border.bin", "blockdata_filepath": "data/layouts/SSAnne_3F_Corridor/map.bin" }, { "id": "LAYOUT_SSANNE_B1F_CORRIDOR", "name": "SSAnne_B1F_Corridor_Layout", "width": 23, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSAnne_B1F_Corridor/border.bin", "blockdata_filepath": "data/layouts/SSAnne_B1F_Corridor/map.bin" }, { "id": "LAYOUT_SSANNE_DECK", "name": "SSAnne_Deck_Layout", "width": 24, "height": 19, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSAnne_Deck/border.bin", "blockdata_filepath": "data/layouts/SSAnne_Deck/map.bin" }, { "id": "LAYOUT_DIGLETTS_CAVE_B1F", "name": "DiglettsCave_B1F_Layout", "width": 85, "height": 80, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_DiglettsCave", "border_filepath": "data/layouts/DiglettsCave_B1F/border.bin", "blockdata_filepath": "data/layouts/DiglettsCave_B1F/map.bin" }, { "id": "LAYOUT_VICTORY_ROAD_1F", "name": "VictoryRoad_1F_Layout", "width": 26, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/VictoryRoad_1F/border.bin", "blockdata_filepath": "data/layouts/VictoryRoad_1F/map.bin" }, { "id": "LAYOUT_VICTORY_ROAD_2F", "name": "VictoryRoad_2F_Layout", "width": 51, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/VictoryRoad_2F/border.bin", "blockdata_filepath": "data/layouts/VictoryRoad_2F/map.bin" }, { "id": "LAYOUT_VICTORY_ROAD_3F", "name": "VictoryRoad_3F_Layout", "width": 45, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/VictoryRoad_3F/border.bin", "blockdata_filepath": "data/layouts/VictoryRoad_3F/map.bin" }, { "id": "LAYOUT_ROCKET_HIDEOUT_B1F", "name": "RocketHideout_B1F_Layout", "width": 28, "height": 34, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/RocketHideout_B1F/border.bin", "blockdata_filepath": "data/layouts/RocketHideout_B1F/map.bin" }, { "id": "LAYOUT_ROCKET_HIDEOUT_B2F", "name": "RocketHideout_B2F_Layout", "width": 32, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/RocketHideout_B2F/border.bin", "blockdata_filepath": "data/layouts/RocketHideout_B2F/map.bin" }, { "id": "LAYOUT_ROCKET_HIDEOUT_B3F", "name": "RocketHideout_B3F_Layout", "width": 22, "height": 27, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/RocketHideout_B3F/border.bin", "blockdata_filepath": "data/layouts/RocketHideout_B3F/map.bin" }, { "id": "LAYOUT_ROCKET_HIDEOUT_B4F", "name": "RocketHideout_B4F_Layout", "width": 24, "height": 26, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/RocketHideout_B4F/border.bin", "blockdata_filepath": "data/layouts/RocketHideout_B4F/map.bin" }, { "id": "LAYOUT_SILPH_CO_1F", "name": "SilphCo_1F_Layout", "width": 36, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_1F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_1F/map.bin" }, { "id": "LAYOUT_SILPH_CO_2F", "name": "SilphCo_2F_Layout", "width": 36, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_2F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_2F/map.bin" }, { "id": "LAYOUT_SILPH_CO_3F", "name": "SilphCo_3F_Layout", "width": 36, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_3F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_3F/map.bin" }, { "id": "LAYOUT_SILPH_CO_4F", "name": "SilphCo_4F_Layout", "width": 36, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_4F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_4F/map.bin" }, { "id": "LAYOUT_SILPH_CO_5F", "name": "SilphCo_5F_Layout", "width": 36, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_5F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_5F/map.bin" }, { "id": "LAYOUT_SILPH_CO_6F", "name": "SilphCo_6F_Layout", "width": 31, "height": 19, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_6F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_6F/map.bin" }, { "id": "LAYOUT_SILPH_CO_7F", "name": "SilphCo_7F_Layout", "width": 31, "height": 19, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_7F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_7F/map.bin" }, { "id": "LAYOUT_SILPH_CO_8F", "name": "SilphCo_8F_Layout", "width": 31, "height": 19, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_8F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_8F/map.bin" }, { "id": "LAYOUT_SILPH_CO_9F", "name": "SilphCo_9F_Layout", "width": 31, "height": 19, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_9F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_9F/map.bin" }, { "id": "LAYOUT_SILPH_CO_10F", "name": "SilphCo_10F_Layout", "width": 17, "height": 19, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_10F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_10F/map.bin" }, { "id": "LAYOUT_SILPH_CO_11F", "name": "SilphCo_11F_Layout", "width": 17, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_11F/border.bin", "blockdata_filepath": "data/layouts/SilphCo_11F/map.bin" }, { "id": "LAYOUT_POKEMON_MANSION_1F", "name": "PokemonMansion_1F_Layout", "width": 38, "height": 35, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonMansion", "border_filepath": "data/layouts/PokemonMansion_1F/border.bin", "blockdata_filepath": "data/layouts/PokemonMansion_1F/map.bin" }, { "id": "LAYOUT_POKEMON_MANSION_2F", "name": "PokemonMansion_2F_Layout", "width": 38, "height": 38, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonMansion", "border_filepath": "data/layouts/PokemonMansion_2F/border.bin", "blockdata_filepath": "data/layouts/PokemonMansion_2F/map.bin" }, { "id": "LAYOUT_POKEMON_MANSION_3F", "name": "PokemonMansion_3F_Layout", "width": 38, "height": 35, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonMansion", "border_filepath": "data/layouts/PokemonMansion_3F/border.bin", "blockdata_filepath": "data/layouts/PokemonMansion_3F/map.bin" }, { "id": "LAYOUT_POKEMON_MANSION_B1F", "name": "PokemonMansion_B1F_Layout", "width": 38, "height": 35, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonMansion", "border_filepath": "data/layouts/PokemonMansion_B1F/border.bin", "blockdata_filepath": "data/layouts/PokemonMansion_B1F/map.bin" }, { "id": "LAYOUT_SAFARI_ZONE_CENTER", "name": "SafariZone_Center_Layout", "width": 51, "height": 36, "border_width": 3, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_FuchsiaCity", "border_filepath": "data/layouts/SafariZone_Center/border.bin", "blockdata_filepath": "data/layouts/SafariZone_Center/map.bin" }, { "id": "LAYOUT_SAFARI_ZONE_EAST", "name": "SafariZone_East_Layout", "width": 54, "height": 35, "border_width": 3, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_FuchsiaCity", "border_filepath": "data/layouts/SafariZone_East/border.bin", "blockdata_filepath": "data/layouts/SafariZone_East/map.bin" }, { "id": "LAYOUT_SAFARI_ZONE_NORTH", "name": "SafariZone_North_Layout", "width": 57, "height": 42, "border_width": 3, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_FuchsiaCity", "border_filepath": "data/layouts/SafariZone_North/border.bin", "blockdata_filepath": "data/layouts/SafariZone_North/map.bin" }, { "id": "LAYOUT_SAFARI_ZONE_WEST", "name": "SafariZone_West_Layout", "width": 48, "height": 36, "border_width": 3, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_FuchsiaCity", "border_filepath": "data/layouts/SafariZone_West/border.bin", "blockdata_filepath": "data/layouts/SafariZone_West/map.bin" }, { "id": "LAYOUT_CERULEAN_CAVE_1F", "name": "CeruleanCave_1F_Layout", "width": 40, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCave", "border_filepath": "data/layouts/CeruleanCave_1F/border.bin", "blockdata_filepath": "data/layouts/CeruleanCave_1F/map.bin" }, { "id": "LAYOUT_CERULEAN_CAVE_2F", "name": "CeruleanCave_2F_Layout", "width": 40, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCave", "border_filepath": "data/layouts/CeruleanCave_2F/border.bin", "blockdata_filepath": "data/layouts/CeruleanCave_2F/map.bin" }, { "id": "LAYOUT_CERULEAN_CAVE_B1F", "name": "CeruleanCave_B1F_Layout", "width": 40, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCave", "border_filepath": "data/layouts/CeruleanCave_B1F/border.bin", "blockdata_filepath": "data/layouts/CeruleanCave_B1F/map.bin" }, { "id": "LAYOUT_ROCK_TUNNEL_1F", "name": "RockTunnel_1F_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_RockTunnel", "border_filepath": "data/layouts/RockTunnel_1F/border.bin", "blockdata_filepath": "data/layouts/RockTunnel_1F/map.bin" }, { "id": "LAYOUT_ROCK_TUNNEL_B1F", "name": "RockTunnel_B1F_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_RockTunnel", "border_filepath": "data/layouts/RockTunnel_B1F/border.bin", "blockdata_filepath": "data/layouts/RockTunnel_B1F/map.bin" }, { "id": "LAYOUT_SEAFOAM_ISLANDS_1F", "name": "SeafoamIslands_1F_Layout", "width": 38, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/SeafoamIslands_1F/border.bin", "blockdata_filepath": "data/layouts/SeafoamIslands_1F/map.bin" }, { "id": "LAYOUT_SEAFOAM_ISLANDS_B1F", "name": "SeafoamIslands_B1F_Layout", "width": 38, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/SeafoamIslands_B1F/border.bin", "blockdata_filepath": "data/layouts/SeafoamIslands_B1F/map.bin" }, { "id": "LAYOUT_SEAFOAM_ISLANDS_B2F", "name": "SeafoamIslands_B2F_Layout", "width": 38, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/SeafoamIslands_B2F/border.bin", "blockdata_filepath": "data/layouts/SeafoamIslands_B2F/map.bin" }, { "id": "LAYOUT_SEAFOAM_ISLANDS_B3F", "name": "SeafoamIslands_B3F_Layout", "width": 38, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/SeafoamIslands_B3F/border.bin", "blockdata_filepath": "data/layouts/SeafoamIslands_B3F/map.bin" }, { "id": "LAYOUT_SEAFOAM_ISLANDS_B4F", "name": "SeafoamIslands_B4F_Layout", "width": 38, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/SeafoamIslands_B4F/border.bin", "blockdata_filepath": "data/layouts/SeafoamIslands_B4F/map.bin" }, { "id": "LAYOUT_POKEMON_TOWER_1F", "name": "PokemonTower_1F_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonTower", "border_filepath": "data/layouts/PokemonTower_1F/border.bin", "blockdata_filepath": "data/layouts/PokemonTower_1F/map.bin" }, { "id": "LAYOUT_POKEMON_TOWER_2F", "name": "PokemonTower_2F_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonTower", "border_filepath": "data/layouts/PokemonTower_2F/border.bin", "blockdata_filepath": "data/layouts/PokemonTower_2F/map.bin" }, { "id": "LAYOUT_POKEMON_TOWER_3F", "name": "PokemonTower_3F_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonTower", "border_filepath": "data/layouts/PokemonTower_3F/border.bin", "blockdata_filepath": "data/layouts/PokemonTower_3F/map.bin" }, { "id": "LAYOUT_POKEMON_TOWER_4F", "name": "PokemonTower_4F_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonTower", "border_filepath": "data/layouts/PokemonTower_4F/border.bin", "blockdata_filepath": "data/layouts/PokemonTower_4F/map.bin" }, { "id": "LAYOUT_POKEMON_TOWER_5F", "name": "PokemonTower_5F_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonTower", "border_filepath": "data/layouts/PokemonTower_5F/border.bin", "blockdata_filepath": "data/layouts/PokemonTower_5F/map.bin" }, { "id": "LAYOUT_POKEMON_TOWER_6F", "name": "PokemonTower_6F_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonTower", "border_filepath": "data/layouts/PokemonTower_6F/border.bin", "blockdata_filepath": "data/layouts/PokemonTower_6F/map.bin" }, { "id": "LAYOUT_POKEMON_TOWER_7F", "name": "PokemonTower_7F_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonTower", "border_filepath": "data/layouts/PokemonTower_7F/border.bin", "blockdata_filepath": "data/layouts/PokemonTower_7F/map.bin" }, { "id": "LAYOUT_POWER_PLANT", "name": "PowerPlant_Layout", "width": 49, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PowerPlant", "border_filepath": "data/layouts/PowerPlant/border.bin", "blockdata_filepath": "data/layouts/PowerPlant/map.bin" }, { "id": "LAYOUT_ROUTE25_SEA_COTTAGE", "name": "Route25_SeaCottage_Layout", "width": 15, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SeaCottage", "border_filepath": "data/layouts/Route25_SeaCottage/border.bin", "blockdata_filepath": "data/layouts/Route25_SeaCottage/map.bin" }, { "id": "LAYOUT_SSANNE_KITCHEN", "name": "SSAnne_Kitchen_Layout", "width": 16, "height": 14, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSAnne_Kitchen/border.bin", "blockdata_filepath": "data/layouts/SSAnne_Kitchen/map.bin" }, { "id": "LAYOUT_SSANNE_CAPTAINS_OFFICE", "name": "SSAnne_CaptainsOffice_Layout", "width": 9, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSAnne_CaptainsOffice/border.bin", "blockdata_filepath": "data/layouts/SSAnne_CaptainsOffice/map.bin" }, { "id": "LAYOUT_UNDERGROUND_PATH_ENTRANCE", "name": "UndergroundPath_Entrance_Layout", "width": 13, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/UndergroundPath_Entrance/border.bin", "blockdata_filepath": "data/layouts/UndergroundPath_Entrance/map.bin" }, { "id": "LAYOUT_UNDERGROUND_PATH_EAST_WEST_TUNNEL", "name": "UndergroundPath_EastWestTunnel_Layout", "width": 80, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_UndergroundPath", "border_filepath": "data/layouts/UndergroundPath_EastWestTunnel/border.bin", "blockdata_filepath": "data/layouts/UndergroundPath_EastWestTunnel/map.bin" }, { "id": "LAYOUT_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL", "name": "UndergroundPath_NorthSouthTunnel_Layout", "width": 8, "height": 63, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_UndergroundPath", "border_filepath": "data/layouts/UndergroundPath_NorthSouthTunnel/border.bin", "blockdata_filepath": "data/layouts/UndergroundPath_NorthSouthTunnel/map.bin" }, { "id": "LAYOUT_ROUTE12_NORTH_ENTRANCE_1F", "name": "Route12_NorthEntrance_1F_Layout", "width": 11, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/Route12_NorthEntrance_1F/border.bin", "blockdata_filepath": "data/layouts/Route12_NorthEntrance_1F/map.bin" }, { "id": "LAYOUT_SSANNE_ROOM1", "name": "SSAnne_Room1_Layout", "width": 6, "height": 8, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSAnne_Room1/border.bin", "blockdata_filepath": "data/layouts/SSAnne_Room1/map.bin" }, { "id": "LAYOUT_SSANNE_ROOM2", "name": "SSAnne_Room2_Layout", "width": 6, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SSAnne", "border_filepath": "data/layouts/SSAnne_Room2/border.bin", "blockdata_filepath": "data/layouts/SSAnne_Room2/map.bin" }, { "id": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR", "name": "CeladonCity_DepartmentStore_Elevator_Layout", "width": 5, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/CeladonCity_DepartmentStore_Elevator/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_DepartmentStore_Elevator/map.bin" }, { "id": "LAYOUT_PEWTER_CITY_MUSEUM_1F", "name": "PewterCity_Museum_1F_Layout", "width": 28, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Museum", "border_filepath": "data/layouts/PewterCity_Museum_1F/border.bin", "blockdata_filepath": "data/layouts/PewterCity_Museum_1F/map.bin" }, { "id": "LAYOUT_PEWTER_CITY_MUSEUM_2F", "name": "PewterCity_Museum_2F_Layout", "width": 19, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Museum", "border_filepath": "data/layouts/PewterCity_Museum_2F/border.bin", "blockdata_filepath": "data/layouts/PewterCity_Museum_2F/map.bin" }, { "id": "LAYOUT_CERULEAN_CITY_HOUSE2", "name": "CeruleanCity_House2_Layout", "width": 10, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BurgledHouse", "border_filepath": "data/layouts/CeruleanCity_House2/border.bin", "blockdata_filepath": "data/layouts/CeruleanCity_House2/map.bin" }, { "id": "LAYOUT_CERULEAN_CITY_HOUSE1", "name": "CeruleanCity_House1_Layout", "width": 10, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/CeruleanCity_House1/border.bin", "blockdata_filepath": "data/layouts/CeruleanCity_House1/map.bin" }, { "id": "LAYOUT_CELADON_CITY_CONDOMINIUMS_1F", "name": "CeladonCity_Condominiums_1F_Layout", "width": 15, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Condominiums", "border_filepath": "data/layouts/CeladonCity_Condominiums_1F/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Condominiums_1F/map.bin" }, { "id": "LAYOUT_CELADON_CITY_CONDOMINIUMS_2F", "name": "CeladonCity_Condominiums_2F_Layout", "width": 15, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Condominiums", "border_filepath": "data/layouts/CeladonCity_Condominiums_2F/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Condominiums_2F/map.bin" }, { "id": "LAYOUT_CELADON_CITY_CONDOMINIUMS_3F", "name": "CeladonCity_Condominiums_3F_Layout", "width": 15, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Condominiums", "border_filepath": "data/layouts/CeladonCity_Condominiums_3F/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Condominiums_3F/map.bin" }, { "id": "LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF", "name": "CeladonCity_Condominiums_Roof_Layout", "width": 14, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Condominiums", "border_filepath": "data/layouts/CeladonCity_Condominiums_Roof/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Condominiums_Roof/map.bin" }, { "id": "LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM", "name": "CeladonCity_Condominiums_RoofRoom_Layout", "width": 10, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_School", "border_filepath": "data/layouts/CeladonCity_Condominiums_RoofRoom/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Condominiums_RoofRoom/map.bin" }, { "id": "LAYOUT_CELADON_CITY_GAME_CORNER_PRIZE_ROOM", "name": "CeladonCity_GameCorner_PrizeRoom_Layout", "width": 9, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GameCorner", "border_filepath": "data/layouts/CeladonCity_GameCorner_PrizeRoom/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_GameCorner_PrizeRoom/map.bin" }, { "id": "LAYOUT_CELADON_CITY_RESTAURANT", "name": "CeladonCity_Restaurant_Layout", "width": 15, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_RestaurantHotel", "border_filepath": "data/layouts/CeladonCity_Restaurant/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Restaurant/map.bin" }, { "id": "LAYOUT_CELADON_CITY_HOTEL", "name": "CeladonCity_Hotel_Layout", "width": 17, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_RestaurantHotel", "border_filepath": "data/layouts/CeladonCity_Hotel/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Hotel/map.bin" }, { "id": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_1F", "name": "CeladonCity_DepartmentStore_1F_Layout", "width": 13, "height": 16, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_DepartmentStore", "border_filepath": "data/layouts/CeladonCity_DepartmentStore_1F/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_DepartmentStore_1F/map.bin" }, { "id": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_2F", "name": "CeladonCity_DepartmentStore_2F_Layout", "width": 13, "height": 15, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_DepartmentStore", "border_filepath": "data/layouts/CeladonCity_DepartmentStore_2F/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_DepartmentStore_2F/map.bin" }, { "id": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_3F", "name": "CeladonCity_DepartmentStore_3F_Layout", "width": 13, "height": 15, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_DepartmentStore", "border_filepath": "data/layouts/CeladonCity_DepartmentStore_3F/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_DepartmentStore_3F/map.bin" }, { "id": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_4F", "name": "CeladonCity_DepartmentStore_4F_Layout", "width": 13, "height": 15, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_DepartmentStore", "border_filepath": "data/layouts/CeladonCity_DepartmentStore_4F/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_DepartmentStore_4F/map.bin" }, { "id": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_5F", "name": "CeladonCity_DepartmentStore_5F_Layout", "width": 13, "height": 15, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_DepartmentStore", "border_filepath": "data/layouts/CeladonCity_DepartmentStore_5F/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_DepartmentStore_5F/map.bin" }, { "id": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ROOF", "name": "CeladonCity_DepartmentStore_Roof_Layout", "width": 19, "height": 14, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_DepartmentStore", "border_filepath": "data/layouts/CeladonCity_DepartmentStore_Roof/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_DepartmentStore_Roof/map.bin" }, { "id": "LAYOUT_SAFARI_ZONE_REST_HOUSE", "name": "SafariZone_RestHouse_Layout", "width": 13, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SafariZoneBuilding", "border_filepath": "data/layouts/SafariZone_RestHouse/border.bin", "blockdata_filepath": "data/layouts/SafariZone_RestHouse/map.bin" }, { "id": "LAYOUT_SAFARI_ZONE_SECRET_HOUSE", "name": "SafariZone_SecretHouse_Layout", "width": 13, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SafariZoneBuilding", "border_filepath": "data/layouts/SafariZone_SecretHouse/border.bin", "blockdata_filepath": "data/layouts/SafariZone_SecretHouse/map.bin" }, { "id": "LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_OFFICE", "name": "FuchsiaCity_SafariZone_Office_Layout", "width": 20, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SafariZoneBuilding", "border_filepath": "data/layouts/FuchsiaCity_SafariZone_Office/border.bin", "blockdata_filepath": "data/layouts/FuchsiaCity_SafariZone_Office/map.bin" }, { "id": "LAYOUT_FUCHSIA_CITY_WARDENS_HOUSE", "name": "FuchsiaCity_WardensHouse_Layout", "width": 13, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Museum", "border_filepath": "data/layouts/FuchsiaCity_WardensHouse/border.bin", "blockdata_filepath": "data/layouts/FuchsiaCity_WardensHouse/map.bin" }, { "id": "LAYOUT_FUCHSIA_CITY_HOUSE2", "name": "FuchsiaCity_House2_Layout", "width": 10, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Museum", "border_filepath": "data/layouts/FuchsiaCity_House2/border.bin", "blockdata_filepath": "data/layouts/FuchsiaCity_House2/map.bin" }, { "id": "LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE", "name": "CinnabarIsland_PokemonLab_Entrance_Layout", "width": 28, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Lab", "border_filepath": "data/layouts/CinnabarIsland_PokemonLab_Entrance/border.bin", "blockdata_filepath": "data/layouts/CinnabarIsland_PokemonLab_Entrance/map.bin" }, { "id": "LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE", "name": "CinnabarIsland_PokemonLab_Lounge_Layout", "width": 15, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Lab", "border_filepath": "data/layouts/CinnabarIsland_PokemonLab_Lounge/border.bin", "blockdata_filepath": "data/layouts/CinnabarIsland_PokemonLab_Lounge/map.bin" }, { "id": "LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM", "name": "CinnabarIsland_PokemonLab_ResearchRoom_Layout", "width": 15, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Lab", "border_filepath": "data/layouts/CinnabarIsland_PokemonLab_ResearchRoom/border.bin", "blockdata_filepath": "data/layouts/CinnabarIsland_PokemonLab_ResearchRoom/map.bin" }, { "id": "LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM", "name": "CinnabarIsland_PokemonLab_ExperimentRoom_Layout", "width": 15, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_Lab", "border_filepath": "data/layouts/CinnabarIsland_PokemonLab_ExperimentRoom/border.bin", "blockdata_filepath": "data/layouts/CinnabarIsland_PokemonLab_ExperimentRoom/map.bin" }, { "id": "LAYOUT_SAFFRON_CITY", "name": "SaffronCity_Layout", "width": 66, "height": 55, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SaffronCity", "border_filepath": "data/layouts/SaffronCity/border.bin", "blockdata_filepath": "data/layouts/SaffronCity/map.bin" }, { "id": "LAYOUT_SAFFRON_CITY_NORTH_SOUTH_ENTRANCE", "name": "SaffronCity_NorthSouthEntrance_Layout", "width": 9, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/SaffronCity_NorthSouthEntrance/border.bin", "blockdata_filepath": "data/layouts/SaffronCity_NorthSouthEntrance/map.bin" }, { "id": "LAYOUT_SAFFRON_CITY_EAST_WEST_ENTRANCE", "name": "SaffronCity_EastWestEntrance_Layout", "width": 13, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/SaffronCity_EastWestEntrance/border.bin", "blockdata_filepath": "data/layouts/SaffronCity_EastWestEntrance/map.bin" }, { "id": "LAYOUT_DIGLETTS_CAVE_NORTH_ENTRANCE", "name": "DiglettsCave_NorthEntrance_Layout", "width": 10, "height": 8, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_DiglettsCave", "border_filepath": "data/layouts/DiglettsCave_NorthEntrance/border.bin", "blockdata_filepath": "data/layouts/DiglettsCave_NorthEntrance/map.bin" }, { "id": "LAYOUT_DIGLETTS_CAVE_SOUTH_ENTRANCE", "name": "DiglettsCave_SouthEntrance_Layout", "width": 10, "height": 8, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_DiglettsCave", "border_filepath": "data/layouts/DiglettsCave_SouthEntrance/border.bin", "blockdata_filepath": "data/layouts/DiglettsCave_SouthEntrance/map.bin" }, { "id": "LAYOUT_INDIGO_PLATEAU_POKEMON_CENTER_1F", "name": "IndigoPlateau_PokemonCenter_1F_Layout", "width": 25, "height": 18, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonCenter", "border_filepath": "data/layouts/IndigoPlateau_PokemonCenter_1F/border.bin", "blockdata_filepath": "data/layouts/IndigoPlateau_PokemonCenter_1F/map.bin" }, { "id": "LAYOUT_POKEMON_LEAGUE_LORELEIS_ROOM", "name": "PokemonLeague_LoreleisRoom_Layout", "width": 13, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonLeague", "border_filepath": "data/layouts/PokemonLeague_LoreleisRoom/border.bin", "blockdata_filepath": "data/layouts/PokemonLeague_LoreleisRoom/map.bin" }, { "id": "LAYOUT_POKEMON_LEAGUE_BRUNOS_ROOM", "name": "PokemonLeague_BrunosRoom_Layout", "width": 13, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonLeague", "border_filepath": "data/layouts/PokemonLeague_BrunosRoom/border.bin", "blockdata_filepath": "data/layouts/PokemonLeague_BrunosRoom/map.bin" }, { "id": "LAYOUT_POKEMON_LEAGUE_AGATHAS_ROOM", "name": "PokemonLeague_AgathasRoom_Layout", "width": 13, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonLeague", "border_filepath": "data/layouts/PokemonLeague_AgathasRoom/border.bin", "blockdata_filepath": "data/layouts/PokemonLeague_AgathasRoom/map.bin" }, { "id": "LAYOUT_POKEMON_LEAGUE_LANCES_ROOM", "name": "PokemonLeague_LancesRoom_Layout", "width": 28, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonLeague", "border_filepath": "data/layouts/PokemonLeague_LancesRoom/border.bin", "blockdata_filepath": "data/layouts/PokemonLeague_LancesRoom/map.bin" }, { "id": "LAYOUT_POKEMON_LEAGUE_CHAMPIONS_ROOM", "name": "PokemonLeague_ChampionsRoom_Layout", "width": 13, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonLeague", "border_filepath": "data/layouts/PokemonLeague_ChampionsRoom/border.bin", "blockdata_filepath": "data/layouts/PokemonLeague_ChampionsRoom/map.bin" }, { "id": "LAYOUT_POKEMON_LEAGUE_HALL_OF_FAME", "name": "PokemonLeague_HallOfFame_Layout", "width": 11, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HallOfFame", "border_filepath": "data/layouts/PokemonLeague_HallOfFame/border.bin", "blockdata_filepath": "data/layouts/PokemonLeague_HallOfFame/map.bin" }, { "id": "LAYOUT_ROUTE21_SOUTH", "name": "Route21_South_Layout", "width": 24, "height": 50, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CinnabarIsland", "border_filepath": "data/layouts/Route21_South/border.bin", "blockdata_filepath": "data/layouts/Route21_South/map.bin" }, { "id": "LAYOUT_ENTRANCE_2F", "name": "Entrance_2F_Layout", "width": 13, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/Entrance_2F/border.bin", "blockdata_filepath": "data/layouts/Entrance_2F/map.bin" }, { "id": "LAYOUT_ROUTE2_ENTRANCE", "name": "Route2_Entrance_Layout", "width": 15, "height": 12, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/Route2_Entrance/border.bin", "blockdata_filepath": "data/layouts/Route2_Entrance/map.bin" }, { "id": "LAYOUT_ROUTE22_NORTH_ENTRANCE", "name": "Route22_NorthEntrance_Layout", "width": 15, "height": 12, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/Route22_NorthEntrance/border.bin", "blockdata_filepath": "data/layouts/Route22_NorthEntrance/map.bin" }, { "id": "LAYOUT_ROUTE16_NORTH_ENTRANCE_1F", "name": "Route16_NorthEntrance_1F_Layout", "width": 13, "height": 18, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/Route16_NorthEntrance_1F/border.bin", "blockdata_filepath": "data/layouts/Route16_NorthEntrance_1F/map.bin" }, { "id": "LAYOUT_ENTRANCE_1F", "name": "Entrance_1F_Layout", "width": 13, "height": 12, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/Entrance_1F/border.bin", "blockdata_filepath": "data/layouts/Entrance_1F/map.bin" }, { "id": "LAYOUT_ROCKET_HIDEOUT_ELEVATOR", "name": "RocketHideout_Elevator_Layout", "width": 5, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/RocketHideout_Elevator/border.bin", "blockdata_filepath": "data/layouts/RocketHideout_Elevator/map.bin" }, { "id": "LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_1F", "name": "SaffronCity_CopycatsHouse_1F_Layout", "width": 13, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding1", "border_filepath": "data/layouts/SaffronCity_CopycatsHouse_1F/border.bin", "blockdata_filepath": "data/layouts/SaffronCity_CopycatsHouse_1F/map.bin" }, { "id": "LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_2F", "name": "SaffronCity_CopycatsHouse_2F_Layout", "width": 12, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding1", "border_filepath": "data/layouts/SaffronCity_CopycatsHouse_2F/border.bin", "blockdata_filepath": "data/layouts/SaffronCity_CopycatsHouse_2F/map.bin" }, { "id": "LAYOUT_SAFFRON_CITY_DOJO", "name": "SaffronCity_Dojo_Layout", "width": 13, "height": 16, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PewterGym", "border_filepath": "data/layouts/SaffronCity_Dojo/border.bin", "blockdata_filepath": "data/layouts/SaffronCity_Dojo/map.bin" }, { "id": "LAYOUT_SILPH_CO_ELEVATOR", "name": "SilphCo_Elevator_Layout", "width": 5, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/SilphCo_Elevator/border.bin", "blockdata_filepath": "data/layouts/SilphCo_Elevator/map.bin" }, { "id": "LAYOUT_ONE_ISLAND", "name": "OneIsland_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands123", "border_filepath": "data/layouts/OneIsland/border.bin", "blockdata_filepath": "data/layouts/OneIsland/map.bin" }, { "id": "LAYOUT_TWO_ISLAND", "name": "TwoIsland_Layout", "width": 48, "height": 19, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands123", "border_filepath": "data/layouts/TwoIsland/border.bin", "blockdata_filepath": "data/layouts/TwoIsland/map.bin" }, { "id": "LAYOUT_THREE_ISLAND", "name": "ThreeIsland_Layout", "width": 24, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_BerryForest", "border_filepath": "data/layouts/ThreeIsland/border.bin", "blockdata_filepath": "data/layouts/ThreeIsland/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND", "name": "FourIsland_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands45", "border_filepath": "data/layouts/FourIsland/border.bin", "blockdata_filepath": "data/layouts/FourIsland/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND", "name": "FiveIsland_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands5", "border_filepath": "data/layouts/FiveIsland/border.bin", "blockdata_filepath": "data/layouts/FiveIsland/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND", "name": "SevenIsland_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands67", "border_filepath": "data/layouts/SevenIsland/border.bin", "blockdata_filepath": "data/layouts/SevenIsland/map.bin" }, { "id": "LAYOUT_SIX_ISLAND", "name": "SixIsland_Layout", "width": 25, "height": 31, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands6", "border_filepath": "data/layouts/SixIsland/border.bin", "blockdata_filepath": "data/layouts/SixIsland/map.bin" }, { "id": "LAYOUT_ONE_ISLAND_KINDLE_ROAD", "name": "OneIsland_KindleRoad_Layout", "width": 24, "height": 140, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands123", "border_filepath": "data/layouts/OneIsland_KindleRoad/border.bin", "blockdata_filepath": "data/layouts/OneIsland_KindleRoad/map.bin" }, { "id": "LAYOUT_ONE_ISLAND_TREASURE_BEACH", "name": "OneIsland_TreasureBeach_Layout", "width": 24, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands123", "border_filepath": "data/layouts/OneIsland_TreasureBeach/border.bin", "blockdata_filepath": "data/layouts/OneIsland_TreasureBeach/map.bin" }, { "id": "LAYOUT_TWO_ISLAND_CAPE_BRINK", "name": "TwoIsland_CapeBrink_Layout", "width": 51, "height": 31, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands123", "border_filepath": "data/layouts/TwoIsland_CapeBrink/border.bin", "blockdata_filepath": "data/layouts/TwoIsland_CapeBrink/map.bin" }, { "id": "LAYOUT_THREE_ISLAND_BOND_BRIDGE", "name": "ThreeIsland_BondBridge_Layout", "width": 96, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_BerryForest", "border_filepath": "data/layouts/ThreeIsland_BondBridge/border.bin", "blockdata_filepath": "data/layouts/ThreeIsland_BondBridge/map.bin" }, { "id": "LAYOUT_THREE_ISLAND_PORT", "name": "ThreeIsland_Port_Layout", "width": 48, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_BerryForest", "border_filepath": "data/layouts/ThreeIsland_Port/border.bin", "blockdata_filepath": "data/layouts/ThreeIsland_Port/map.bin" }, { "id": "LAYOUT_PROTOTYPE_SEVII_ISLE_6", "name": "Prototype_SeviiIsle_6_Layout", "width": 1, "height": 1, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeladonCity", "border_filepath": "data/layouts/Prototype_SeviiIsle_6/border.bin", "blockdata_filepath": "data/layouts/Prototype_SeviiIsle_6/map.bin" }, { "id": "LAYOUT_PROTOTYPE_SEVII_ISLE_7", "name": "Prototype_SeviiIsle_7_Layout", "width": 1, "height": 1, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeladonCity", "border_filepath": "data/layouts/Prototype_SeviiIsle_7/border.bin", "blockdata_filepath": "data/layouts/Prototype_SeviiIsle_7/map.bin" }, { "id": "LAYOUT_PROTOTYPE_SEVII_ISLE_8", "name": "Prototype_SeviiIsle_8_Layout", "width": 84, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeladonCity", "border_filepath": "data/layouts/Prototype_SeviiIsle_8/border.bin", "blockdata_filepath": "data/layouts/Prototype_SeviiIsle_8/map.bin" }, { "id": "LAYOUT_PROTOTYPE_SEVII_ISLE_9", "name": "Prototype_SeviiIsle_9_Layout", "width": 24, "height": 60, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeladonCity", "border_filepath": "data/layouts/Prototype_SeviiIsle_9/border.bin", "blockdata_filepath": "data/layouts/Prototype_SeviiIsle_9/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS", "name": "FiveIsland_ResortGorgeous_Layout", "width": 72, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands5", "border_filepath": "data/layouts/FiveIsland_ResortGorgeous/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_ResortGorgeous/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_WATER_LABYRINTH", "name": "FiveIsland_WaterLabyrinth_Layout", "width": 72, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands5", "border_filepath": "data/layouts/FiveIsland_WaterLabyrinth/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_WaterLabyrinth/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_MEADOW", "name": "FiveIsland_Meadow_Layout", "width": 24, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands5", "border_filepath": "data/layouts/FiveIsland_Meadow/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_Meadow/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_MEMORIAL_PILLAR", "name": "FiveIsland_MemorialPillar_Layout", "width": 24, "height": 60, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands5", "border_filepath": "data/layouts/FiveIsland_MemorialPillar/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_MemorialPillar/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_OUTCAST_ISLAND", "name": "SixIsland_OutcastIsland_Layout", "width": 24, "height": 80, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands6", "border_filepath": "data/layouts/SixIsland_OutcastIsland/border.bin", "blockdata_filepath": "data/layouts/SixIsland_OutcastIsland/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_GREEN_PATH", "name": "SixIsland_GreenPath_Layout", "width": 78, "height": 21, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands6", "border_filepath": "data/layouts/SixIsland_GreenPath/border.bin", "blockdata_filepath": "data/layouts/SixIsland_GreenPath/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_WATER_PATH", "name": "SixIsland_WaterPath_Layout", "width": 24, "height": 100, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands6", "border_filepath": "data/layouts/SixIsland_WaterPath/border.bin", "blockdata_filepath": "data/layouts/SixIsland_WaterPath/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_RUIN_VALLEY", "name": "SixIsland_RuinValley_Layout", "width": 48, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands6", "border_filepath": "data/layouts/SixIsland_RuinValley/border.bin", "blockdata_filepath": "data/layouts/SixIsland_RuinValley/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_TRAINER_TOWER", "name": "SevenIsland_TrainerTower_Layout", "width": 42, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands67", "border_filepath": "data/layouts/SevenIsland_TrainerTower/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_TrainerTower/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE", "name": "SevenIsland_SevaultCanyon_Entrance_Layout", "width": 24, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands67", "border_filepath": "data/layouts/SevenIsland_SevaultCanyon_Entrance/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_SevaultCanyon_Entrance/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON", "name": "SevenIsland_SevaultCanyon_Layout", "width": 24, "height": 81, "border_width": 6, "border_height": 28, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands67", "border_filepath": "data/layouts/SevenIsland_SevaultCanyon/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_SevaultCanyon/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS", "name": "SevenIsland_TanobyRuins_Layout", "width": 144, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands67", "border_filepath": "data/layouts/SevenIsland_TanobyRuins/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_TanobyRuins/map.bin" }, { "id": "LAYOUT_PROTOTYPE_SEVII_ISLE_22", "name": "Prototype_SeviiIsle_22_Layout", "width": 24, "height": 60, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_PalletTown", "border_filepath": "data/layouts/Prototype_SeviiIsle_22/border.bin", "blockdata_filepath": "data/layouts/Prototype_SeviiIsle_22/map.bin" }, { "id": "LAYOUT_PROTOTYPE_SEVII_ISLE_23_EAST", "name": "Prototype_SeviiIsle_23_East_Layout", "width": 144, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_PalletTown", "border_filepath": "data/layouts/Prototype_SeviiIsle_23_East/border.bin", "blockdata_filepath": "data/layouts/Prototype_SeviiIsle_23_East/map.bin" }, { "id": "LAYOUT_PROTOTYPE_SEVII_ISLE_23_WEST", "name": "Prototype_SeviiIsle_23_West_Layout", "width": 24, "height": 60, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_PalletTown", "border_filepath": "data/layouts/Prototype_SeviiIsle_23_West/border.bin", "blockdata_filepath": "data/layouts/Prototype_SeviiIsle_23_West/map.bin" }, { "id": "LAYOUT_PROTOTYPE_SEVII_ISLE_24", "name": "Prototype_SeviiIsle_24_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_PalletTown", "border_filepath": "data/layouts/Prototype_SeviiIsle_24/border.bin", "blockdata_filepath": "data/layouts/Prototype_SeviiIsle_24/map.bin" }, { "id": "LAYOUT_UNION_ROOM", "name": "UnionRoom_Layout", "width": 15, "height": 12, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HallOfFame", "border_filepath": "data/layouts/UnionRoom/border.bin", "blockdata_filepath": "data/layouts/UnionRoom/map.bin" }, { "id": "LAYOUT_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB", "name": "SaffronCity_PokemonTrainerFanClub_Layout", "width": 11, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_FanClubDaycare", "border_filepath": "data/layouts/SaffronCity_PokemonTrainerFanClub/border.bin", "blockdata_filepath": "data/layouts/SaffronCity_PokemonTrainerFanClub/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1_DOOR_OPEN", "name": "SevenIsland_House_Room1_DoorOpen_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/SevenIsland_House_Room1_DoorOpen/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_House_Room1_DoorOpen/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_HOUSE_ROOM2", "name": "SevenIsland_House_Room2_Layout", "width": 12, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonCenter", "border_filepath": "data/layouts/SevenIsland_House_Room2/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_House_Room2/map.bin" }, { "id": "LAYOUT_VIRIDIAN_CITY_SCHOOL", "name": "ViridianCity_School_Layout", "width": 10, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_School", "border_filepath": "data/layouts/ViridianCity_School/border.bin", "blockdata_filepath": "data/layouts/ViridianCity_School/map.bin" }, { "id": "LAYOUT_CELADON_CITY_RESTAURANT_DUPLICATE", "name": "CeladonCity_Restaurant_Duplicate_Layout", "width": 15, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_RestaurantHotel", "border_filepath": "data/layouts/CeladonCity_Restaurant_Duplicate/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Restaurant_Duplicate/map.bin" }, { "id": "LAYOUT_CELADON_CITY_HOTEL_DUPLICATE", "name": "CeladonCity_Hotel_Duplicate_Layout", "width": 17, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_RestaurantHotel", "border_filepath": "data/layouts/CeladonCity_Hotel_Duplicate/border.bin", "blockdata_filepath": "data/layouts/CeladonCity_Hotel_Duplicate/map.bin" }, { "id": "LAYOUT_MT_EMBER_RUBY_PATH_B4F", "name": "MtEmber_RubyPath_B4F_Layout", "width": 18, "height": 16, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_RubyPath_B4F/border.bin", "blockdata_filepath": "data/layouts/MtEmber_RubyPath_B4F/map.bin" }, { "id": "LAYOUT_THREE_ISLAND_BERRY_FOREST", "name": "ThreeIsland_BerryForest_Layout", "width": 85, "height": 47, "border_width": 3, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_BerryForest", "border_filepath": "data/layouts/ThreeIsland_BerryForest/border.bin", "blockdata_filepath": "data/layouts/ThreeIsland_BerryForest/map.bin" }, { "id": "LAYOUT_ONE_ISLAND_POKEMON_CENTER_1F", "name": "OneIsland_PokemonCenter_1F_Layout", "width": 19, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonCenter", "border_filepath": "data/layouts/OneIsland_PokemonCenter_1F/border.bin", "blockdata_filepath": "data/layouts/OneIsland_PokemonCenter_1F/map.bin" }, { "id": "LAYOUT_TWO_ISLAND_JOYFUL_GAME_CORNER", "name": "TwoIsland_JoyfulGameCorner_Layout", "width": 12, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GameCorner", "border_filepath": "data/layouts/TwoIsland_JoyfulGameCorner/border.bin", "blockdata_filepath": "data/layouts/TwoIsland_JoyfulGameCorner/map.bin" }, { "id": "LAYOUT_VERMILION_CITY_POKEMON_FAN_CLUB", "name": "VermilionCity_PokemonFanClub_Layout", "width": 12, "height": 12, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_FanClubDaycare", "border_filepath": "data/layouts/VermilionCity_PokemonFanClub/border.bin", "blockdata_filepath": "data/layouts/VermilionCity_PokemonFanClub/map.bin" }, { "id": "LAYOUT_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE", "name": "LavenderTown_VolunteerPokemonHouse_Layout", "width": 12, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_FanClubDaycare", "border_filepath": "data/layouts/LavenderTown_VolunteerPokemonHouse/border.bin", "blockdata_filepath": "data/layouts/LavenderTown_VolunteerPokemonHouse/map.bin" }, { "id": "LAYOUT_ROUTE5_POKEMON_DAY_CARE", "name": "Route5_PokemonDayCare_Layout", "width": 12, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_FanClubDaycare", "border_filepath": "data/layouts/Route5_PokemonDayCare/border.bin", "blockdata_filepath": "data/layouts/Route5_PokemonDayCare/map.bin" }, { "id": "LAYOUT_VIRIDIAN_CITY_HOUSE", "name": "ViridianCity_House_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/ViridianCity_House/border.bin", "blockdata_filepath": "data/layouts/ViridianCity_House/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND_POKEMON_DAY_CARE", "name": "FourIsland_PokemonDayCare_Layout", "width": 12, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_FanClubDaycare", "border_filepath": "data/layouts/FourIsland_PokemonDayCare/border.bin", "blockdata_filepath": "data/layouts/FourIsland_PokemonDayCare/map.bin" }, { "id": "LAYOUT_SEAFOAM_ISLANDS_B3F_CURRENT_STOPPED", "name": "SeafoamIslands_B3F_CurrentStopped_Layout", "width": 38, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/SeafoamIslands_B3F_CurrentStopped/border.bin", "blockdata_filepath": "data/layouts/SeafoamIslands_B3F_CurrentStopped/map.bin" }, { "id": "LAYOUT_SEAFOAM_ISLANDS_B4F_CURRENT_STOPPED", "name": "SeafoamIslands_B4F_CurrentStopped_Layout", "width": 38, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/SeafoamIslands_B4F_CurrentStopped/border.bin", "blockdata_filepath": "data/layouts/SeafoamIslands_B4F_CurrentStopped/map.bin" }, { "id": "LAYOUT_MT_EMBER_EXTERIOR", "name": "MtEmber_Exterior_Layout", "width": 57, "height": 54, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands123", "border_filepath": "data/layouts/MtEmber_Exterior/border.bin", "blockdata_filepath": "data/layouts/MtEmber_Exterior/map.bin" }, { "id": "LAYOUT_MT_EMBER_SUMMIT", "name": "MtEmber_Summit_Layout", "width": 19, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands123", "border_filepath": "data/layouts/MtEmber_Summit/border.bin", "blockdata_filepath": "data/layouts/MtEmber_Summit/map.bin" }, { "id": "LAYOUT_MT_EMBER_SUMMIT_PATH_1F", "name": "MtEmber_SummitPath_1F_Layout", "width": 15, "height": 18, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_SummitPath_1F/border.bin", "blockdata_filepath": "data/layouts/MtEmber_SummitPath_1F/map.bin" }, { "id": "LAYOUT_MT_EMBER_SUMMIT_PATH_2F", "name": "MtEmber_SummitPath_2F_Layout", "width": 48, "height": 46, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_SummitPath_2F/border.bin", "blockdata_filepath": "data/layouts/MtEmber_SummitPath_2F/map.bin" }, { "id": "LAYOUT_MT_EMBER_SUMMIT_PATH_3F", "name": "MtEmber_SummitPath_3F_Layout", "width": 15, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_SummitPath_3F/border.bin", "blockdata_filepath": "data/layouts/MtEmber_SummitPath_3F/map.bin" }, { "id": "LAYOUT_MT_EMBER_RUBY_PATH_1F", "name": "MtEmber_RubyPath_1F_Layout", "width": 27, "height": 19, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_RubyPath_1F/border.bin", "blockdata_filepath": "data/layouts/MtEmber_RubyPath_1F/map.bin" }, { "id": "LAYOUT_MT_EMBER_RUBY_PATH_B1F", "name": "MtEmber_RubyPath_B1F_Layout", "width": 11, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_RubyPath_B1F/border.bin", "blockdata_filepath": "data/layouts/MtEmber_RubyPath_B1F/map.bin" }, { "id": "LAYOUT_MT_EMBER_RUBY_PATH_B2F", "name": "MtEmber_RubyPath_B2F_Layout", "width": 16, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_RubyPath_B2F/border.bin", "blockdata_filepath": "data/layouts/MtEmber_RubyPath_B2F/map.bin" }, { "id": "LAYOUT_MT_EMBER_RUBY_PATH_B3F", "name": "MtEmber_RubyPath_B3F_Layout", "width": 31, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_RubyPath_B3F/border.bin", "blockdata_filepath": "data/layouts/MtEmber_RubyPath_B3F/map.bin" }, { "id": "LAYOUT_MT_EMBER_RUBY_PATH_B1F_STAIRS", "name": "MtEmber_RubyPath_B1F_Stairs_Layout", "width": 6, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_RubyPath_B1F_Stairs/border.bin", "blockdata_filepath": "data/layouts/MtEmber_RubyPath_B1F_Stairs/map.bin" }, { "id": "LAYOUT_MT_EMBER_RUBY_PATH_B2F_STAIRS", "name": "MtEmber_RubyPath_B2F_Stairs_Layout", "width": 8, "height": 6, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_RubyPath_B2F_Stairs/border.bin", "blockdata_filepath": "data/layouts/MtEmber_RubyPath_B2F_Stairs/map.bin" }, { "id": "LAYOUT_MT_EMBER_RUBY_PATH_B5F", "name": "MtEmber_RubyPath_B5F_Layout", "width": 16, "height": 15, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/MtEmber_RubyPath_B5F/border.bin", "blockdata_filepath": "data/layouts/MtEmber_RubyPath_B5F/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_ROCKET_WAREHOUSE", "name": "FiveIsland_RocketWarehouse_Layout", "width": 29, "height": 27, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/FiveIsland_RocketWarehouse/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_RocketWarehouse/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE", "name": "FourIsland_IcefallCave_Entrance_Layout", "width": 30, "height": 36, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/FourIsland_IcefallCave_Entrance/border.bin", "blockdata_filepath": "data/layouts/FourIsland_IcefallCave_Entrance/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_1F", "name": "FourIsland_IcefallCave_1F_Layout", "width": 20, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/FourIsland_IcefallCave_1F/border.bin", "blockdata_filepath": "data/layouts/FourIsland_IcefallCave_1F/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_B1F", "name": "FourIsland_IcefallCave_B1F_Layout", "width": 24, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/FourIsland_IcefallCave_B1F/border.bin", "blockdata_filepath": "data/layouts/FourIsland_IcefallCave_B1F/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_BACK", "name": "FourIsland_IcefallCave_Back_Layout", "width": 25, "height": 26, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/FourIsland_IcefallCave_Back/border.bin", "blockdata_filepath": "data/layouts/FourIsland_IcefallCave_Back/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_LOBBY", "name": "TrainerTower_Lobby_Layout", "width": 19, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_Lobby/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_Lobby/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_1F", "name": "TrainerTower_1F_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_1F/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_1F/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_2F", "name": "TrainerTower_2F_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_2F/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_2F/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_3F", "name": "TrainerTower_3F_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_3F/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_3F/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_4F", "name": "TrainerTower_4F_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_4F/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_4F/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_5F", "name": "TrainerTower_5F_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_5F/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_5F/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_6F", "name": "TrainerTower_6F_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_6F/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_6F/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_7F", "name": "TrainerTower_7F_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_7F/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_7F/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_8F", "name": "TrainerTower_8F_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_8F/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_8F/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_ROOF", "name": "TrainerTower_Roof_Layout", "width": 18, "height": 16, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_Roof/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_Roof/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_ELEVATOR", "name": "TrainerTower_Elevator_Layout", "width": 5, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/TrainerTower_Elevator/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_Elevator/map.bin" }, { "id": "LAYOUT_CERULEAN_CITY_HOUSE5", "name": "CeruleanCity_House5_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_GenericBuilding2", "border_filepath": "data/layouts/CeruleanCity_House5/border.bin", "blockdata_filepath": "data/layouts/CeruleanCity_House5/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_1F", "name": "SixIsland_DottedHole_1F_Layout", "width": 16, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/SixIsland_DottedHole_1F/border.bin", "blockdata_filepath": "data/layouts/SixIsland_DottedHole_1F/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_B1F", "name": "SixIsland_DottedHole_B1F_Layout", "width": 13, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/SixIsland_DottedHole_B1F/border.bin", "blockdata_filepath": "data/layouts/SixIsland_DottedHole_B1F/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_B2F", "name": "SixIsland_DottedHole_B2F_Layout", "width": 13, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/SixIsland_DottedHole_B2F/border.bin", "blockdata_filepath": "data/layouts/SixIsland_DottedHole_B2F/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_B3F", "name": "SixIsland_DottedHole_B3F_Layout", "width": 13, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/SixIsland_DottedHole_B3F/border.bin", "blockdata_filepath": "data/layouts/SixIsland_DottedHole_B3F/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_B4F", "name": "SixIsland_DottedHole_B4F_Layout", "width": 13, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/SixIsland_DottedHole_B4F/border.bin", "blockdata_filepath": "data/layouts/SixIsland_DottedHole_B4F/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM", "name": "SixIsland_DottedHole_SapphireRoom_Layout", "width": 16, "height": 15, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/SixIsland_DottedHole_SapphireRoom/border.bin", "blockdata_filepath": "data/layouts/SixIsland_DottedHole_SapphireRoom/map.bin" }, { "id": "LAYOUT_ISLAND_HARBOR", "name": "Island_Harbor_Layout", "width": 17, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_IslandHarbor", "border_filepath": "data/layouts/Island_Harbor/border.bin", "blockdata_filepath": "data/layouts/Island_Harbor/map.bin" }, { "id": "LAYOUT_ONE_ISLAND_POKEMON_CENTER_2F", "name": "OneIsland_PokemonCenter_2F_Layout", "width": 15, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_PokemonCenter", "border_filepath": "data/layouts/OneIsland_PokemonCenter_2F/border.bin", "blockdata_filepath": "data/layouts/OneIsland_PokemonCenter_2F/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_PATTERN_BUSH", "name": "SixIsland_PatternBush_Layout", "width": 60, "height": 32, "border_width": 3, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands6", "border_filepath": "data/layouts/SixIsland_PatternBush/border.bin", "blockdata_filepath": "data/layouts/SixIsland_PatternBush/map.bin" }, { "id": "LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL", "name": "ThreeIsland_DunsparceTunnel_Layout", "width": 30, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/ThreeIsland_DunsparceTunnel/border.bin", "blockdata_filepath": "data/layouts/ThreeIsland_DunsparceTunnel/map.bin" }, { "id": "LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL_DUG_OUT", "name": "ThreeIsland_DunsparceTunnel_DugOut_Layout", "width": 30, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/ThreeIsland_DunsparceTunnel_DugOut/border.bin", "blockdata_filepath": "data/layouts/ThreeIsland_DunsparceTunnel_DugOut/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ENTRANCE", "name": "FiveIsland_LostCave_Entrance_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Entrance/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Entrance/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM1", "name": "FiveIsland_LostCave_Room1_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room1/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room1/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM2", "name": "FiveIsland_LostCave_Room2_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room2/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room2/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM3", "name": "FiveIsland_LostCave_Room3_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room3/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room3/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM4", "name": "FiveIsland_LostCave_Room4_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room4/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room4/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM5", "name": "FiveIsland_LostCave_Room5_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room5/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room5/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM6", "name": "FiveIsland_LostCave_Room6_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room6/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room6/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM7", "name": "FiveIsland_LostCave_Room7_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room7/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room7/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM8", "name": "FiveIsland_LostCave_Room8_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room8/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room8/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM9", "name": "FiveIsland_LostCave_Room9_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room9/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room9/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM10", "name": "FiveIsland_LostCave_Room10_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room10/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room10/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM11", "name": "FiveIsland_LostCave_Room11_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room11/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room11/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM12", "name": "FiveIsland_LostCave_Room12_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room12/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room12/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM13", "name": "FiveIsland_LostCave_Room13_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room13/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room13/map.bin" }, { "id": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM14", "name": "FiveIsland_LostCave_Room14_Layout", "width": 11, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/FiveIsland_LostCave_Room14/border.bin", "blockdata_filepath": "data/layouts/FiveIsland_LostCave_Room14/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER", "name": "SevenIsland_TanobyRuins_MoneanChamber_Layout", "width": 23, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TanobyRuins", "border_filepath": "data/layouts/SevenIsland_TanobyRuins_MoneanChamber/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_TanobyRuins_MoneanChamber/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER", "name": "SevenIsland_TanobyRuins_LiptooChamber_Layout", "width": 23, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TanobyRuins", "border_filepath": "data/layouts/SevenIsland_TanobyRuins_LiptooChamber/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_TanobyRuins_LiptooChamber/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER", "name": "SevenIsland_TanobyRuins_WeepthChamber_Layout", "width": 23, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TanobyRuins", "border_filepath": "data/layouts/SevenIsland_TanobyRuins_WeepthChamber/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_TanobyRuins_WeepthChamber/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER", "name": "SevenIsland_TanobyRuins_DilfordChamber_Layout", "width": 23, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TanobyRuins", "border_filepath": "data/layouts/SevenIsland_TanobyRuins_DilfordChamber/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_TanobyRuins_DilfordChamber/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER", "name": "SevenIsland_TanobyRuins_ScufibChamber_Layout", "width": 23, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TanobyRuins", "border_filepath": "data/layouts/SevenIsland_TanobyRuins_ScufibChamber/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_TanobyRuins_ScufibChamber/map.bin" }, { "id": "LAYOUT_SIX_ISLAND_ALTERING_CAVE", "name": "SixIsland_AlteringCave_Layout", "width": 32, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_RockTunnel", "border_filepath": "data/layouts/SixIsland_AlteringCave/border.bin", "blockdata_filepath": "data/layouts/SixIsland_AlteringCave/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY", "name": "SevenIsland_SevaultCanyon_TanobyKey_Layout", "width": 15, "height": 16, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_DiglettsCave", "border_filepath": "data/layouts/SevenIsland_SevaultCanyon_TanobyKey/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_SevaultCanyon_TanobyKey/map.bin" }, { "id": "LAYOUT_BIRTH_ISLAND_EXTERIOR", "name": "BirthIsland_Exterior_Layout", "width": 30, "height": 30, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands6", "border_filepath": "data/layouts/BirthIsland_Exterior/border.bin", "blockdata_filepath": "data/layouts/BirthIsland_Exterior/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_EXTERIOR", "name": "NavelRock_Exterior_Layout", "width": 20, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands6", "border_filepath": "data/layouts/NavelRock_Exterior/border.bin", "blockdata_filepath": "data/layouts/NavelRock_Exterior/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_1F", "name": "NavelRock_1F_Layout", "width": 17, "height": 26, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_1F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_1F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_SUMMIT", "name": "NavelRock_Summit_Layout", "width": 19, "height": 25, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_Summit/border.bin", "blockdata_filepath": "data/layouts/NavelRock_Summit/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE", "name": "NavelRock_Base_Layout", "width": 21, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_Base/border.bin", "blockdata_filepath": "data/layouts/NavelRock_Base/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_SUMMIT_PATH_2F", "name": "NavelRock_SummitPath_2F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_SummitPath_2F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_SummitPath_2F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_SUMMIT_PATH_3F", "name": "NavelRock_SummitPath_3F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_SummitPath_3F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_SummitPath_3F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_SUMMIT_PATH_4F", "name": "NavelRock_SummitPath_4F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_SummitPath_4F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_SummitPath_4F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_SUMMIT_PATH_5F", "name": "NavelRock_SummitPath_5F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_SummitPath_5F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_SummitPath_5F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B1F", "name": "NavelRock_BasePath_B1F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B1F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B1F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B2F", "name": "NavelRock_BasePath_B2F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B2F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B2F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B3F", "name": "NavelRock_BasePath_B3F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B3F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B3F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B4F", "name": "NavelRock_BasePath_B4F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B4F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B4F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B5F", "name": "NavelRock_BasePath_B5F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B5F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B5F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B6F", "name": "NavelRock_BasePath_B6F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B6F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B6F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B7F", "name": "NavelRock_BasePath_B7F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B7F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B7F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B8F", "name": "NavelRock_BasePath_B8F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B8F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B8F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B9F", "name": "NavelRock_BasePath_B9F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B9F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B9F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B10F", "name": "NavelRock_BasePath_B10F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B10F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B10F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_BASE_PATH_B11F", "name": "NavelRock_BasePath_B11F_Layout", "width": 7, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_BasePath_B11F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_BasePath_B11F/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER", "name": "SevenIsland_TanobyRuins_RixyChamber_Layout", "width": 23, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TanobyRuins", "border_filepath": "data/layouts/SevenIsland_TanobyRuins_RixyChamber/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_TanobyRuins_RixyChamber/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER", "name": "SevenIsland_TanobyRuins_ViapoisChamber_Layout", "width": 23, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TanobyRuins", "border_filepath": "data/layouts/SevenIsland_TanobyRuins_ViapoisChamber/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_TanobyRuins_ViapoisChamber/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_B1F", "name": "NavelRock_B1F_Layout", "width": 17, "height": 7, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_B1F/border.bin", "blockdata_filepath": "data/layouts/NavelRock_B1F/map.bin" }, { "id": "LAYOUT_NAVEL_ROCK_FORK", "name": "NavelRock_Fork_Layout", "width": 30, "height": 100, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_NavelRock", "border_filepath": "data/layouts/NavelRock_Fork/border.bin", "blockdata_filepath": "data/layouts/NavelRock_Fork/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_1F_DOUBLES", "name": "TrainerTower_1F_Doubles_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_1F_Doubles/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_1F_Doubles/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_2F_DOUBLES", "name": "TrainerTower_2F_Doubles_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_2F_Doubles/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_2F_Doubles/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_3F_DOUBLES", "name": "TrainerTower_3F_Doubles_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_3F_Doubles/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_3F_Doubles/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_4F_DOUBLES", "name": "TrainerTower_4F_Doubles_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_4F_Doubles/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_4F_Doubles/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_5F_DOUBLES", "name": "TrainerTower_5F_Doubles_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_5F_Doubles/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_5F_Doubles/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_6F_DOUBLES", "name": "TrainerTower_6F_Doubles_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_6F_Doubles/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_6F_Doubles/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_7F_DOUBLES", "name": "TrainerTower_7F_Doubles_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_7F_Doubles/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_7F_Doubles/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_8F_DOUBLES", "name": "TrainerTower_8F_Doubles_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_8F_Doubles/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_8F_Doubles/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_1F_KNOCKOUT", "name": "TrainerTower_1F_Knockout_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_1F_Knockout/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_1F_Knockout/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_2F_KNOCKOUT", "name": "TrainerTower_2F_Knockout_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_2F_Knockout/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_2F_Knockout/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_3F_KNOCKOUT", "name": "TrainerTower_3F_Knockout_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_3F_Knockout/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_3F_Knockout/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_4F_KNOCKOUT", "name": "TrainerTower_4F_Knockout_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_4F_Knockout/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_4F_Knockout/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_5F_KNOCKOUT", "name": "TrainerTower_5F_Knockout_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_5F_Knockout/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_5F_Knockout/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_6F_KNOCKOUT", "name": "TrainerTower_6F_Knockout_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_6F_Knockout/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_6F_Knockout/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_7F_KNOCKOUT", "name": "TrainerTower_7F_Knockout_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_7F_Knockout/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_7F_Knockout/map.bin" }, { "id": "LAYOUT_TRAINER_TOWER_8F_KNOCKOUT", "name": "TrainerTower_8F_Knockout_Layout", "width": 18, "height": 17, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_TrainerTower", "border_filepath": "data/layouts/TrainerTower_8F_Knockout/border.bin", "blockdata_filepath": "data/layouts/TrainerTower_8F_Knockout/map.bin" }, { "id": "LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1", "name": "SevenIsland_House_Room1_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SeafoamIslands", "border_filepath": "data/layouts/SevenIsland_House_Room1/border.bin", "blockdata_filepath": "data/layouts/SevenIsland_House_Room1/map.bin" }, { "id": "LAYOUT_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA", "name": "OneIsland_KindleRoad_EmberSpa_Layout", "width": 27, "height": 39, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_MtEmber", "border_filepath": "data/layouts/OneIsland_KindleRoad_EmberSpa/border.bin", "blockdata_filepath": "data/layouts/OneIsland_KindleRoad_EmberSpa/map.bin" }, { "id": "LAYOUT_FARAWAY_ISLAND_EXTERIOR", "name": "FarawayIsland_Exterior_Layout", "width": 34, "height": 46, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands67", "border_filepath": "data/layouts/FarawayIsland_Exterior/border.bin", "blockdata_filepath": "data/layouts/FarawayIsland_Exterior/map.bin" }, { "id": "LAYOUT_FARAWAY_ISLAND_INTERIOR", "name": "FarawayIsland_Interior_Layout", "width": 29, "height": 26, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands67", "border_filepath": "data/layouts/FarawayIsland_Interior/border.bin", "blockdata_filepath": "data/layouts/FarawayIsland_Interior/map.bin" }, { "id": "LAYOUT_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP", "name": "OneIsland_KindleRoad_GlassWorkshop_Layout", "width": 11, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_HoennBuilding", "border_filepath": "data/layouts/OneIsland_KindleRoad_GlassWorkshop/border.bin", "blockdata_filepath": "data/layouts/OneIsland_KindleRoad_GlassWorkshop/map.bin" }, { "id": "LAYOUT_ROUTE20_UNDERWATER", "name": "Route20_Underwater_Layout", "width": 120, "height": 20, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Underwater", "border_filepath": "data/layouts/Route20_Underwater/border.bin", "blockdata_filepath": "data/layouts/Route20_Underwater/map.bin" }, { "id": "LAYOUT_BATTLE_FRONTIER_OUTSIDE_WEST", "name": "BattleFrontier_OutsideWest_Layout", "width": 56, "height": 72, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_BattleFrontierOutsideWest", "border_filepath": "data/layouts/BattleFrontier_OutsideWest/border.bin", "blockdata_filepath": "data/layouts/BattleFrontier_OutsideWest/map.bin" }, { "id": "LAYOUT_BATTLE_FRONTIER_OUTSIDE_EAST", "name": "BattleFrontier_OutsideEast_Layout", "width": 72, "height": 72, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_BattleFrontierOutsideEast", "border_filepath": "data/layouts/BattleFrontier_OutsideEast/border.bin", "blockdata_filepath": "data/layouts/BattleFrontier_OutsideEast/map.bin" }, { "id": "LAYOUT_RS_BATTLE_TOWER_LOBBY", "name": "RS_BattleTower_Lobby_Layout", "width": 14, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BattleFrontier", "border_filepath": "data/layouts/RS_BattleTower_Lobby/border.bin", "blockdata_filepath": "data/layouts/RS_BattleTower_Lobby/map.bin" }, { "id": "LAYOUT_RS_BATTLE_TOWER_ELEVATOR", "name": "RS_BattleTower_Elevator_Layout", "width": 5, "height": 8, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_SilphCo", "border_filepath": "data/layouts/RS_BattleTower_Elevator/border.bin", "blockdata_filepath": "data/layouts/RS_BattleTower_Elevator/map.bin" }, { "id": "LAYOUT_RS_BATTLE_TOWER_CORRIDOR", "name": "RS_BattleTower_Corridor_Layout", "width": 17, "height": 5, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BattleFrontier", "border_filepath": "data/layouts/RS_BattleTower_Corridor/border.bin", "blockdata_filepath": "data/layouts/RS_BattleTower_Corridor/map.bin" }, { "id": "LAYOUT_RS_BATTLE_TOWER_BATTLE_ROOM", "name": "RS_BattleTower_BattleRoom_Layout", "width": 10, "height": 10, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BattleFrontier", "border_filepath": "data/layouts/RS_BattleTower_BattleRoom/border.bin", "blockdata_filepath": "data/layouts/RS_BattleTower_BattleRoom/map.bin" }, { "id": "LAYOUT_SAFARI_ZONE_NORTH_WEST", "name": "SafariZone_NorthWest_Layout", "width": 52, "height": 36, "border_width": 3, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_FuchsiaCity", "border_filepath": "data/layouts/SafariZone_NorthWest/border.bin", "blockdata_filepath": "data/layouts/SafariZone_NorthWest/map.bin" }, { "id": "LAYOUT_SAFARI_ZONE_NORTH_EAST", "name": "SafariZone_NorthEast_Layout", "width": 52, "height": 36, "border_width": 3, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_FuchsiaCity", "border_filepath": "data/layouts/SafariZone_NorthEast/border.bin", "blockdata_filepath": "data/layouts/SafariZone_NorthEast/map.bin" }, { "id": "LAYOUT_THREE_ISLAND_BOND_BRIDGE_UNDERWATER", "name": "ThreeIsland_BondBridge_Underwater_Layout", "width": 96, "height": 40, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Underwater", "border_filepath": "data/layouts/ThreeIsland_BondBridge_Underwater/border.bin", "blockdata_filepath": "data/layouts/ThreeIsland_BondBridge_Underwater/map.bin" }, { "id": "LAYOUT_ARTISAN_CAVE_B1F", "name": "ArtisanCave_B1F_Layout", "width": 46, "height": 54, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/ArtisanCave_B1F/border.bin", "blockdata_filepath": "data/layouts/ArtisanCave_B1F/map.bin" }, { "id": "LAYOUT_ARTISAN_CAVE_1F", "name": "ArtisanCave_1F_Layout", "width": 21, "height": 22, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/ArtisanCave_1F/border.bin", "blockdata_filepath": "data/layouts/ArtisanCave_1F/map.bin" }, { "id": "LAYOUT_SOUTHERN_ISLAND_EXTERIOR", "name": "SouthernIsland_Exterior_Layout", "width": 33, "height": 30, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands67", "border_filepath": "data/layouts/SouthernIsland_Exterior/border.bin", "blockdata_filepath": "data/layouts/SouthernIsland_Exterior/map.bin" }, { "id": "LAYOUT_SOUTHERN_ISLAND_INTERIOR", "name": "SouthernIsland_Interior_Layout", "width": 27, "height": 24, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands67", "border_filepath": "data/layouts/SouthernIsland_Interior/border.bin", "blockdata_filepath": "data/layouts/SouthernIsland_Interior/map.bin" }, { "id": "LAYOUT_CERULEAN_CAVE_1F_BLUE", "name": "CeruleanCave_1F_Blue_Layout", "width": 40, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCave", "border_filepath": "data/layouts/CeruleanCave_1F_Blue/border.bin", "blockdata_filepath": "data/layouts/CeruleanCave_1F_Blue/map.bin" }, { "id": "LAYOUT_CERULEAN_CAVE_2F_BLUE", "name": "CeruleanCave_2F_Blue_Layout", "width": 40, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCave", "border_filepath": "data/layouts/CeruleanCave_2F_Blue/border.bin", "blockdata_filepath": "data/layouts/CeruleanCave_2F_Blue/map.bin" }, { "id": "LAYOUT_CERULEAN_CAVE_B1F_BLUE", "name": "CeruleanCave_B1F_Blue_Layout", "width": 40, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCave", "border_filepath": "data/layouts/CeruleanCave_B1F_Blue/border.bin", "blockdata_filepath": "data/layouts/CeruleanCave_B1F_Blue/map.bin" }, { "id": "LAYOUT_CERULEAN_CAVE_1F_YELLOW", "name": "CeruleanCave_1F_Yellow_Layout", "width": 40, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCave", "border_filepath": "data/layouts/CeruleanCave_1F_Yellow/border.bin", "blockdata_filepath": "data/layouts/CeruleanCave_1F_Yellow/map.bin" }, { "id": "LAYOUT_CERULEAN_CAVE_2F_YELLOW", "name": "CeruleanCave_2F_Yellow_Layout", "width": 40, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCave", "border_filepath": "data/layouts/CeruleanCave_2F_Yellow/border.bin", "blockdata_filepath": "data/layouts/CeruleanCave_2F_Yellow/map.bin" }, { "id": "LAYOUT_CERULEAN_CAVE_B1F_YELLOW", "name": "CeruleanCave_B1F_Yellow_Layout", "width": 40, "height": 23, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_CeruleanCave", "border_filepath": "data/layouts/CeruleanCave_B1F_Yellow/border.bin", "blockdata_filepath": "data/layouts/CeruleanCave_B1F_Yellow/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND_BASE", "name": "FourIsland_Base_Layout", "width": 33, "height": 39, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_SeviiIslands45", "border_filepath": "data/layouts/FourIsland_Base/border.bin", "blockdata_filepath": "data/layouts/FourIsland_Base/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION", "name": "FourIsland_Base_CableCarStation_Layout", "width": 13, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_IslandHarbor", "border_filepath": "data/layouts/FourIsland_Base_CableCarStation/border.bin", "blockdata_filepath": "data/layouts/FourIsland_Base_CableCarStation/map.bin" }, { "id": "LAYOUT_FOUR_ISLAND_CABLE_CAR_STATION", "name": "FourIsland_CableCarStation_Layout", "width": 13, "height": 13, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_IslandHarbor", "border_filepath": "data/layouts/FourIsland_CableCarStation/border.bin", "blockdata_filepath": "data/layouts/FourIsland_CableCarStation/map.bin" }, { "id": "LAYOUT_BATTLE_FRONTIER_LOUNGE2", "name": "BattleFrontier_Lounge2_Layout", "width": 13, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BattleFrontier", "border_filepath": "data/layouts/BattleFrontier_Lounge2/border.bin", "blockdata_filepath": "data/layouts/BattleFrontier_Lounge2/map.bin" }, { "id": "LAYOUT_BATTLE_FRONTIER_LOUNGE1", "name": "BattleFrontier_Lounge1_Layout", "width": 9, "height": 11, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BattleFrontier", "border_filepath": "data/layouts/BattleFrontier_Lounge1/border.bin", "blockdata_filepath": "data/layouts/BattleFrontier_Lounge1/map.bin" }, { "id": "LAYOUT_BATTLE_FRONTIER_RECEPTION_GATE", "name": "BattleFrontier_ReceptionGate_Layout", "width": 9, "height": 14, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BattleFrontier", "border_filepath": "data/layouts/BattleFrontier_ReceptionGate/border.bin", "blockdata_filepath": "data/layouts/BattleFrontier_ReceptionGate/map.bin" }, { "id": "LAYOUT_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER", "name": "BattleFrontier_ExchangeServiceCorner_Layout", "width": 15, "height": 12, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BattleFrontier", "border_filepath": "data/layouts/BattleFrontier_ExchangeServiceCorner/border.bin", "blockdata_filepath": "data/layouts/BattleFrontier_ExchangeServiceCorner/map.bin" }, { "id": "LAYOUT_BATTLE_FRONTIER_SCOTTS_HOUSE", "name": "BattleFrontier_ScottsHouse_Layout", "width": 7, "height": 9, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BattleFrontier", "border_filepath": "data/layouts/BattleFrontier_ScottsHouse/border.bin", "blockdata_filepath": "data/layouts/BattleFrontier_ScottsHouse/map.bin" }, { "id": "LAYOUT_BATTLE_FRONTIER_RANKING_HALL", "name": "BattleFrontier_RankingHall_Layout", "width": 47, "height": 16, "border_width": 2, "border_height": 2, "primary_tileset": "gTileset_Building", "secondary_tileset": "gTileset_BattleFrontierRankingHall", "border_filepath": "data/layouts/BattleFrontier_RankingHall/border.bin", "blockdata_filepath": "data/layouts/BattleFrontier_RankingHall/map.bin" } ] } ================================================ FILE: data/map_events.s ================================================ #include "constants/event_bg.h" #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/flags.h" #include "constants/items.h" #include "constants/map_scripts.h" #include "constants/layouts.h" #include "constants/maps.h" #include "constants/trainer_types.h" #include "constants/vars.h" #include "constants/weather.h" .include "asm/macros.inc" .include "constants/constants.inc" .section .rodata .include "data/maps/events.inc" ================================================ FILE: data/maps/.gitignore ================================================ connections.inc events.inc groups.inc headers.inc **/connections.inc **/events.inc **/header.inc ================================================ FILE: data/maps/ArtisanCave_1F/map.json ================================================ { "id": "MAP_ARTISAN_CAVE_1F", "name": "ArtisanCave_1F", "layout": "LAYOUT_ARTISAN_CAVE_1F", "music": "MUS_PETALBURG_WOODS", "region_map_section": "MAPSEC_ARTISAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 14, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ArtisanCave_1F_EventScript_ItemCarbos", "flag": "FLAG_HIDE_ARTISAN_CAVE_B1F_CARBOS" } ], "warp_events": [ { "x": 10, "y": 17, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 13 }, { "x": 6, "y": 5, "elevation": 0, "dest_map": "MAP_ARTISAN_CAVE_B1F", "dest_warp_id": 1 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ArtisanCave_1F/scripts.inc ================================================ ArtisanCave_1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/ArtisanCave_1F/text.inc ================================================ ================================================ FILE: data/maps/ArtisanCave_B1F/map.json ================================================ { "id": "MAP_ARTISAN_CAVE_B1F", "name": "ArtisanCave_B1F", "layout": "LAYOUT_ARTISAN_CAVE_B1F", "music": "MUS_PETALBURG_WOODS", "region_map_section": "MAPSEC_ARTISAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 32, "y": 38, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ArtisanCave_B1F_EventScript_ItemHPUp", "flag": "FLAG_HIDE_ARTISAN_CAVE_B1F_HP_UP" } ], "warp_events": [ { "x": 8, "y": 48, "elevation": 0, "dest_map": "MAP_RS_BATTLE_TOWER", "dest_warp_id": 1 }, { "x": 38, "y": 5, "elevation": 0, "dest_map": "MAP_ARTISAN_CAVE_1F", "dest_warp_id": 1 } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 32, "y": 29, "elevation": 3, "item": "ITEM_ZINC", "flag": "FLAG_HIDDEN_ITEM_ARTISAN_CAVE_ZINC", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 27, "y": 8, "elevation": 4, "item": "ITEM_CALCIUM", "flag": "FLAG_HIDDEN_ITEM_ARTISAN_CAVE_CALCIUM", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 7, "y": 5, "elevation": 3, "item": "ITEM_PROTEIN", "flag": "FLAG_HIDDEN_ITEM_ARTISAN_CAVE_PROTEIN", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 19, "y": 43, "elevation": 3, "item": "ITEM_IRON", "flag": "FLAG_HIDDEN_ITEM_ARTISAN_CAVE_IRON", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/ArtisanCave_B1F/scripts.inc ================================================ ArtisanCave_B1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/ArtisanCave_B1F/text.inc ================================================ ================================================ FILE: data/maps/BattleColosseum_2P/map.json ================================================ { "id": "MAP_BATTLE_COLOSSEUM_2P", "name": "BattleColosseum_2P", "layout": "LAYOUT_BATTLE_COLOSSEUM_2P", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SPECIAL_AREA", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_LINK", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST", "x": 9, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleColosseum_2P_EventScript_Attendant", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" } ], "coord_events": [ { "type": "trigger", "x": 3, "y": 5, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "BattleColosseum_2P_EventScript_PlayerSpot0" }, { "type": "trigger", "x": 10, "y": 5, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "BattleColosseum_2P_EventScript_PlayerSpot1" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/BattleColosseum_2P/scripts.inc ================================================ BattleColosseum_2P_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleColosseum_4P/map.json ================================================ { "id": "MAP_BATTLE_COLOSSEUM_4P", "name": "BattleColosseum_4P", "layout": "LAYOUT_BATTLE_COLOSSEUM_4P", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SPECIAL_AREA", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_LINK", "connections": null, "object_events": [], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" } ], "coord_events": [ { "type": "trigger", "x": 3, "y": 4, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "BattleColosseum_4P_EventScript_PlayerSpot0" }, { "type": "trigger", "x": 3, "y": 6, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "BattleColosseum_4P_EventScript_PlayerSpot2" }, { "type": "trigger", "x": 10, "y": 4, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "BattleColosseum_4P_EventScript_PlayerSpot1" }, { "type": "trigger", "x": 10, "y": 6, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "BattleColosseum_4P_EventScript_PlayerSpot3" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/BattleColosseum_4P/scripts.inc ================================================ BattleColosseum_4P_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_ExchangeServiceCorner/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER", "name": "BattleFrontier_ExchangeServiceCorner", "layout": "LAYOUT_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 0, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 0, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_ROCKER", "in_connection": false, "x": 1, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 9, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 10, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 12, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 7, "y": 10, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 6 }, { "x": 6, "y": 10, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 6 }, { "x": 8, "y": 10, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 6 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_ExchangeServiceCorner/scripts.inc ================================================ BattleFrontier_ExchangeServiceCorner_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_ExchangeServiceCorner/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_Lounge1/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_LOUNGE1", "name": "BattleFrontier_Lounge1", "layout": "LAYOUT_BATTLE_FRONTIER_LOUNGE1", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 0, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 7, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 5 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_Lounge1/scripts.inc ================================================ BattleFrontier_Lounge1_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_Lounge1/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_Lounge2/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_LOUNGE2", "name": "BattleFrontier_Lounge2", "layout": "LAYOUT_BATTLE_FRONTIER_LOUNGE2", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 4, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 8, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 10, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 10, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 10, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 7, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 3 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_Lounge2/scripts.inc ================================================ BattleFrontier_Lounge2_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_Lounge2/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_Lounge3/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_LOUNGE3", "name": "BattleFrontier_Lounge3", "layout": "LAYOUT_BATTLE_FRONTIER_LOUNGE1", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 4, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 0, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 0, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 9 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_Lounge3/scripts.inc ================================================ BattleFrontier_Lounge3_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_Lounge3/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_Lounge4/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_LOUNGE4", "name": "BattleFrontier_Lounge4", "layout": "LAYOUT_BATTLE_FRONTIER_LOUNGE1", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CHEF", "in_connection": false, "x": 6, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 0, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 6 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_Lounge4/scripts.inc ================================================ BattleFrontier_Lounge4_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_Lounge4/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_Lounge5/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_LOUNGE5", "name": "BattleFrontier_Lounge5", "layout": "LAYOUT_BATTLE_FRONTIER_LOUNGE2", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 12, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 0, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 11, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 7, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 7 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_Lounge5/scripts.inc ================================================ BattleFrontier_Lounge5_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_Lounge5/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_Lounge6/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_LOUNGE6", "name": "BattleFrontier_Lounge6", "layout": "LAYOUT_BATTLE_FRONTIER_LOUNGE1", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 8 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_Lounge6/scripts.inc ================================================ BattleFrontier_Lounge6_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_Lounge6/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_Lounge7/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_LOUNGE7", "name": "BattleFrontier_Lounge7", "layout": "LAYOUT_BATTLE_FRONTIER_LOUNGE1", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 0, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 8, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 7 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_Lounge7/scripts.inc ================================================ BattleFrontier_Lounge7_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_Lounge7/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_Lounge8/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_LOUNGE8", "name": "BattleFrontier_Lounge8", "layout": "LAYOUT_BATTLE_FRONTIER_LOUNGE1", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 8, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 8, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 10 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_Lounge8/scripts.inc ================================================ BattleFrontier_Lounge8_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_Lounge8/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_Mart/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_MART", "name": "BattleFrontier_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_MART", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 2, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 6, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 9, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 4 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_Mart/scripts.inc ================================================ BattleFrontier_Mart_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_Mart/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_OutsideEast/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "name": "BattleFrontier_OutsideEast", "layout": "LAYOUT_BATTLE_FRONTIER_OUTSIDE_EAST", "music": "MUS_B_FRONTIER", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": 0, "map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST" } ], "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 20, "y": 17, "elevation": 0, "movement_type": "MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 42, "y": 15, "elevation": 0, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 53, "y": 6, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 2, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 54, "y": 16, "elevation": 0, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 37, "y": 32, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CHEF", "in_connection": false, "x": 41, "y": 56, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 8, "y": 46, "elevation": 0, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_ROCKER", "in_connection": false, "x": 34, "y": 41, "elevation": 0, "movement_type": "MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 45, "y": 47, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 59, "y": 35, "elevation": 0, "movement_type": "MOVEMENT_TYPE_WALK_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 6, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 18, "y": 40, "elevation": 0, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 17, "y": 40, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MEOWTH", "in_connection": false, "x": 40, "y": 56, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUDOWOODO", "in_connection": false, "x": 54, "y": 62, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 42, "y": 34, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 51, "y": 53, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_M", "in_connection": false, "x": 62, "y": 18, "elevation": 0, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT", "movement_range_x": 2, "movement_range_y": 6, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 11, "y": 21, "elevation": 0, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 10, "y": 21, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 16, "y": 30, "elevation": 0, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 3, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 33, "y": 14, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 54, "y": 31, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 54, "y": 32, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 58, "y": 55, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 48, "y": 41, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 29, "y": 14, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 16, "y": 14, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 0 }, { "x": 39, "y": 29, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 1 }, { "x": 45, "y": 56, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 2 }, { "x": 58, "y": 14, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 3 }, { "x": 35, "y": 12, "elevation": 3, "dest_map": "MAP_BATTLE_FRONTIER_RANKING_HALL", "dest_warp_id": 0 }, { "x": 4, "y": 44, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_LOUNGE1", "dest_warp_id": 0 }, { "x": 10, "y": 28, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER", "dest_warp_id": 0 }, { "x": 22, "y": 51, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_LOUNGE5", "dest_warp_id": 0 }, { "x": 5, "y": 8, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_LOUNGE6", "dest_warp_id": 0 }, { "x": 65, "y": 31, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_LOUNGE3", "dest_warp_id": 0 }, { "x": 14, "y": 51, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_LOUNGE8", "dest_warp_id": 0 }, { "x": 21, "y": 45, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 11 }, { "x": 4, "y": 51, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F", "dest_warp_id": 0 }, { "x": 28, "y": 7, "elevation": 0, "dest_map": "MAP_ARTISAN_CAVE_1F", "dest_warp_id": 0 } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 13, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" }, { "type": "sign", "x": 43, "y": 56, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" }, { "type": "sign", "x": 36, "y": 34, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" }, { "type": "sign", "x": 62, "y": 15, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" }, { "type": "sign", "x": 7, "y": 29, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" }, { "type": "sign", "x": 32, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" } ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_OutsideEast/scripts.inc ================================================ BattleFrontier_OutsideEast_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_OutsideEast/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_OutsideWest/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "name": "BattleFrontier_OutsideWest", "layout": "LAYOUT_BATTLE_FRONTIER_OUTSIDE_WEST", "music": "MUS_B_FRONTIER", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "right", "offset": 0, "map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST" } ], "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 26, "y": 38, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 19, "y": 70, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 19, "y": 68, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NavelRock_Harbor_EventScript_Sailor", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 26, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 8, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 27, "y": 30, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 33, "y": 41, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 28, "y": 43, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 0, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 17, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 13, "y": 44, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 14, "y": 44, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_ROCKER", "in_connection": false, "x": 23, "y": 47, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 38, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 45, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 9, "y": 47, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 35, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 11, "y": 66, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 31, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 42, "y": 48, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 38, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 0, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 12, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 12, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 8, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 4, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_ROTATE_CLOCKWISE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 42, "y": 27, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 0 }, { "x": 19, "y": 17, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 1 }, { "x": 11, "y": 38, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 2 }, { "x": 45, "y": 44, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_LOUNGE2", "dest_warp_id": 0 }, { "x": 52, "y": 51, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_MART", "dest_warp_id": 0 }, { "x": 44, "y": 5, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_SCOTTS_HOUSE", "dest_warp_id": 0 }, { "x": 53, "y": 44, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_LOUNGE4", "dest_warp_id": 0 }, { "x": 5, "y": 20, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_LOUNGE7", "dest_warp_id": 0 }, { "x": 26, "y": 65, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_RECEPTION_GATE", "dest_warp_id": 0 }, { "x": 26, "y": 61, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_RECEPTION_GATE", "dest_warp_id": 1 }, { "x": 39, "y": 55, "elevation": 0, "dest_map": "MAP_ARTISAN_CAVE_B1F", "dest_warp_id": 0 } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 15, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" }, { "type": "sign", "x": 45, "y": 30, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" }, { "type": "sign", "x": 16, "y": 43, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" } ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_OutsideWest/scripts.inc ================================================ BattleFrontier_OutsideWest_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_OutsideWest/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_PokemonCenter_1F/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F", "name": "BattleFrontier_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_RS_POKE_CENTER", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleFrontier_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 12, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 2, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MEOWTH", "in_connection": false, "x": 1, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 7, "y": 8, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 12 }, { "x": 1, "y": 6, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F", "dest_warp_id": 0 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_PokemonCenter_1F/scripts.inc ================================================ BattleFrontier_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 BattleFrontier_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_BATTLE_FRONTIER end BattleFrontier_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end ================================================ FILE: data/maps/BattleFrontier_PokemonCenter_1F/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_PokemonCenter_2F/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F", "name": "BattleFrontier_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_RS_POKE_CENTER", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "in_connection": false, "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F", "dest_warp_id": 1 }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": 0 }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": 0 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_PokemonCenter_2F/scripts.inc ================================================ BattleFrontier_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 ================================================ FILE: data/maps/BattleFrontier_PokemonCenter_2F/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_RankingHall/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_RANKING_HALL", "name": "BattleFrontier_RankingHall", "layout": "LAYOUT_BATTLE_FRONTIER_RANKING_HALL", "music": "MUS_LILYCOVE_MUSEUM", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 21, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 1, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 41, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 23, "y": 14, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "dest_warp_id": 4 } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 23, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 20, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 23, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 26, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 39, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 43, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "NULL" }, { "type": "sign", "x": 7, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 5, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 3, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 41, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 13, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" }, { "type": "sign", "x": 33, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "NULL" } ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_RankingHall/scripts.inc ================================================ BattleFrontier_RankingHall_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_RankingHall/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_ReceptionGate/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_RECEPTION_GATE", "name": "BattleFrontier_ReceptionGate", "layout": "LAYOUT_BATTLE_FRONTIER_RECEPTION_GATE", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 0, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 8, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 8, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SCOTT", "in_connection": false, "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 0, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 13, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 8 }, { "x": 4, "y": 1, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 9 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_ReceptionGate/scripts.inc ================================================ BattleFrontier_ReceptionGate_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_ReceptionGate/text.inc ================================================ ================================================ FILE: data/maps/BattleFrontier_ScottsHouse/map.json ================================================ { "id": "MAP_BATTLE_FRONTIER_SCOTTS_HOUSE", "name": "BattleFrontier_ScottsHouse", "layout": "LAYOUT_BATTLE_FRONTIER_SCOTTS_HOUSE", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_SCOTT", "in_connection": false, "x": 2, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 0, "dest_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", "dest_warp_id": 5 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BattleFrontier_ScottsHouse/scripts.inc ================================================ BattleFrontier_ScottsHouse_MapScripts:: .byte 0 ================================================ FILE: data/maps/BattleFrontier_ScottsHouse/text.inc ================================================ ================================================ FILE: data/maps/BirthIsland_Exterior/map.json ================================================ { "id": "MAP_BIRTH_ISLAND_EXTERIOR", "name": "BirthIsland_Exterior", "layout": "LAYOUT_BIRTH_ISLAND_EXTERIOR", "music": "0xFFFF", "region_map_section": "MAPSEC_BIRTH_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_METEORITE", "in_connection": false, "x": 15, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BirthIsland_Exterior_EventScript_Triangle", "flag": "FLAG_HIDE_BIRTH_ISLAND_METEORITE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "in_connection": false, "x": 15, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_DEOXYS" } ], "warp_events": [ { "x": 15, "y": 24, "elevation": 3, "dest_map": "MAP_BIRTH_ISLAND_HARBOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/BirthIsland_Exterior/scripts.inc ================================================ .set LOCALID_DEOXYS_ROCK, 1 .set LOCALID_DEOXYS, 2 BirthIsland_Exterior_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BirthIsland_Exterior_OnTransition map_script MAP_SCRIPT_ON_RESUME, BirthIsland_Exterior_OnResume map_script MAP_SCRIPT_ON_RETURN_TO_FIELD, BirthIsland_Exterior_OnReturnToField .byte 0 BirthIsland_Exterior_OnReturnToField:: special SetDeoxysTrianglePalette end BirthIsland_Exterior_OnTransition:: setworldmapflag FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_DEOXYS_N setvar VAR_DEOXYS_INTERACTION_STEP_COUNTER, 0 setvar VAR_DEOXYS_INTERACTION_NUM, 0 call_if_set FLAG_FOUGHT_DEOXYS, BirthIsland_Exterior_EventScript_HideDeoxysAndPuzzle call_if_unset FLAG_FOUGHT_DEOXYS, BirthIsland_Exterior_EventScript_TryShowDeoxysPuzzle end BirthIsland_Exterior_EventScript_HideDeoxysAndPuzzle:: setflag FLAG_HIDE_DEOXYS setflag FLAG_HIDE_BIRTH_ISLAND_METEORITE return BirthIsland_Exterior_EventScript_TryShowDeoxysPuzzle:: goto_if_set FLAG_DEOXYS_FLEW_AWAY, EventScript_Return clearflag FLAG_HIDE_BIRTH_ISLAND_METEORITE clearflag FLAG_SYS_DEOXYS_AWAKENED return BirthIsland_Exterior_OnResume:: call_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, BirthIsland_Exterior_EventScript_TryRemoveDeoxys end BirthIsland_Exterior_EventScript_TryRemoveDeoxys:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return removeobject LOCALID_DEOXYS return BirthIsland_Exterior_EventScript_Triangle:: lock faceplayer goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording special DoDeoxysTriangleInteraction waitstate switch VAR_RESULT case 0, BirthIsland_Exterior_EventScript_NotSolved1 case 1, BirthIsland_Exterior_EventScript_NotSolved2 case 2, BirthIsland_Exterior_EventScript_Deoxys case 3, BirthIsland_Exterior_EventScript_NotSolved3 end BirthIsland_Exterior_EventScript_NotSolved1:: release end BirthIsland_Exterior_EventScript_NotSolved2:: release end BirthIsland_Exterior_EventScript_NotSolved3:: release end BirthIsland_Exterior_EventScript_Deoxys:: addobject LOCALID_DEOXYS waitse setfieldeffectargument 0, LOCALID_DEOXYS_ROCK setfieldeffectargument 1, MAP_NUM(BIRTH_ISLAND_EXTERIOR) setfieldeffectargument 2, MAP_GROUP(BIRTH_ISLAND_EXTERIOR) dofieldeffect FLDEFF_DESTROY_DEOXYS_ROCK playbgm MUS_ENCOUNTER_DEOXYS, 0 waitfieldeffect FLDEFF_DESTROY_DEOXYS_ROCK applymovement LOCALID_DEOXYS, Movement_DeoxysApproach waitmovement 0 waitse playmoncry SPECIES_DEOXYS, CRY_MODE_ENCOUNTER delay 40 waitmoncry setvar VAR_LAST_TALKED, LOCALID_DEOXYS seteventmon SPECIES_DEOXYS, 30 setflag FLAG_SYS_SPECIAL_WILD_BATTLE special StartLegendaryBattle waitstate clearflag FLAG_SYS_SPECIAL_WILD_BATTLE specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, BirthIsland_Exterior_EventScript_DefeatedDeoxys goto_if_eq VAR_RESULT, B_OUTCOME_RAN, BirthIsland_Exterior_EventScript_RanFromDeoxys goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, BirthIsland_Exterior_EventScript_RanFromDeoxys setflag FLAG_FOUGHT_DEOXYS release end BirthIsland_Exterior_EventScript_DefeatedDeoxys:: setflag FLAG_DEOXYS_FLEW_AWAY setvar VAR_0x8004, SPECIES_DEOXYS goto EventScript_MonFlewAway end BirthIsland_Exterior_EventScript_RanFromDeoxys:: setvar VAR_0x8004, SPECIES_DEOXYS goto EventScript_MonFlewAway end Movement_DeoxysApproach: walk_slower_down walk_slower_down walk_slower_down walk_slower_down walk_slower_down walk_slower_down walk_slower_down step_end ================================================ FILE: data/maps/BirthIsland_Harbor/map.json ================================================ { "id": "MAP_BIRTH_ISLAND_HARBOR", "name": "BirthIsland_Harbor", "layout": "LAYOUT_ISLAND_HARBOR", "music": "0xFFFF", "region_map_section": "MAPSEC_BIRTH_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "x": 8, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BirthIsland_Harbor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_BIRTH_ISLAND_EXTERIOR", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/BirthIsland_Harbor/scripts.inc ================================================ BirthIsland_Harbor_MapScripts:: .byte 0 BirthIsland_Harbor_EventScript_Sailor:: lock faceplayer message Text_WhereDoYouWantToSail waitmessage setvar VAR_0x8004, SEAGALLOP_BIRTH_ISLAND multichoice 20, 8, MULTICHOICE_SEAGALLOP_VERMILION, FALSE switch VAR_RESULT case 0, EventScript_SailToVermilionCity case 1, EventScript_CancelSail case 127, EventScript_CancelSail end ================================================ FILE: data/maps/CeladonCity/map.json ================================================ { "id": "MAP_CELADON_CITY", "name": "CeladonCity", "layout": "LAYOUT_CELADON_CITY", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": 10, "map": "MAP_ROUTE16" }, { "direction": "right", "offset": 10, "map": "MAP_ROUTE7" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 48, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_RocketGrunt1", "flag": "FLAG_HIDE_CELADON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 38, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_FatMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLIWRATH", "in_connection": false, "x": 36, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_Poliwrath", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 11, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP", "movement_range_x": 4, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_LittleGirl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 18, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 5, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 30, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_OldMan2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 26, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_SoftboiledTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 38, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 5, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_RocketGrunt2", "flag": "FLAG_HIDE_CELADON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 10, "y": 30, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_OldMan1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 52, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_CELADON_CITY_NORTH_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 40, "y": 35, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_CELADON_CITY_SOUTH_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 25, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_Boy", "flag": "0" }, { "type": "clone", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "x": -7, "y": 21, "target_local_id": 7, "target_map": "MAP_ROUTE16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_ItemEther", "flag": "FLAG_HIDE_CELADON_CITY_ETHER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 47, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_SilphCoScientist", "flag": "FLAG_HIDE_CELADON_ROCKETS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 28, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Grimer", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 23, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Victreebel", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 44, "y": 36, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_EventScript_ItemSunStone", "flag": "FLAG_HIDE_CELADON_CITY_SUN_STONE" } ], "warp_events": [ { "x": 34, "y": 21, "elevation": 0, "dest_map": "MAP_CELADON_CITY_GAME_CORNER", "dest_warp_id": "0" }, { "x": 11, "y": 14, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_1F", "dest_warp_id": "1" }, { "x": 15, "y": 14, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_1F", "dest_warp_id": "4" }, { "x": 30, "y": 11, "elevation": 0, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_1F", "dest_warp_id": "1" }, { "x": 48, "y": 11, "elevation": 0, "dest_map": "MAP_CELADON_CITY_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 39, "y": 20, "elevation": 0, "dest_map": "MAP_CELADON_CITY_GAME_CORNER_PRIZE_ROOM", "dest_warp_id": "1" }, { "x": 12, "y": 30, "elevation": 0, "dest_map": "MAP_CELADON_CITY_GYM", "dest_warp_id": "1" }, { "x": 37, "y": 29, "elevation": 0, "dest_map": "MAP_CELADON_CITY_RESTAURANT", "dest_warp_id": "1" }, { "x": 41, "y": 29, "elevation": 0, "dest_map": "MAP_CELADON_CITY_HOUSE1", "dest_warp_id": "1" }, { "x": 49, "y": 29, "elevation": 0, "dest_map": "MAP_CELADON_CITY_HOTEL", "dest_warp_id": "1" }, { "x": 29, "y": 5, "elevation": 0, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_1F", "dest_warp_id": "5" }, { "x": 30, "y": 4, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_1F", "dest_warp_id": "5" }, { "x": 31, "y": 5, "elevation": 0, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_1F", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 45, "y": 23, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_EventScript_TrainerTips2" }, { "type": "sign", "x": 38, "y": 23, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_EventScript_PrizeExchangeSign" }, { "type": "sign", "x": 33, "y": 23, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_EventScript_GameCornerSign" }, { "type": "sign", "x": 22, "y": 18, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_EventScript_CitySign" }, { "type": "sign", "x": 26, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_EventScript_MansionSign" }, { "type": "sign", "x": 33, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_EventScript_TrainerTips1" }, { "type": "sign", "x": 18, "y": 14, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_EventScript_DeptStoreSign" }, { "type": "sign", "x": 16, "y": 31, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_EventScript_GymSign" }, { "type": "hidden_item", "x": 55, "y": 20, "elevation": 3, "item": "ITEM_PP_UP", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_PP_UP", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity/scripts.inc ================================================ .set LOCALID_FAT_MAN, 2 .set LOCALID_POLIWRATH, 3 .set LOCALID_GRIMER_MASTER, 16 .set LOCALID_VICTREEBEL_MASTER, 17 .set TRAINER, VAR_0x8009 CeladonCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_OnTransition .byte 0 CeladonCity_OnTransition:: setworldmapflag FLAG_WORLD_MAP_CELADON_CITY goto CeladonCity_MapScript_SetMasterTrainerMovementTypes end CeladonCity_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_GRIMER callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeladonCity_MapScript_GrimerMasterMovementType setvar TRAINER, MASTER_VICTREEBEL callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeladonCity_MapScript_VictreebelMasterMovementType end CeladonCity_MapScript_GrimerMasterMovementType:: setobjectmovementtype LOCALID_GRIMER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_MapScript_VictreebelMasterMovementType:: setobjectmovementtype LOCALID_VICTREEBEL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_EventScript_LittleGirl:: msgbox CeladonCity_Text_GotMyKoffingInCinnabar, MSGBOX_NPC end CeladonCity_EventScript_OldMan1:: lock msgbox CeladonCity_Text_GymIsGreatFullOfWomen release end CeladonCity_EventScript_Woman:: msgbox CeladonCity_Text_GameCornerIsBadForCitysImage, MSGBOX_NPC end CeladonCity_EventScript_OldMan2:: msgbox CeladonCity_Text_BlewItAllAtSlots, MSGBOX_NPC end CeladonCity_EventScript_SoftboiledTutor:: goto EventScript_SoftboiledTutor end CeladonCity_EventScript_FatMan:: lock faceplayer msgbox CeladonCity_Text_MyTrustedPalPoliwrath closemessage applymovement LOCALID_FAT_MAN, Common_Movement_FaceOriginalDirection waitmovement 0 release end CeladonCity_EventScript_Poliwrath:: lock faceplayer waitse playmoncry SPECIES_POLIWRATH, CRY_MODE_NORMAL msgbox CeladonCity_Text_Poliwrath closemessage waitmoncry applymovement LOCALID_POLIWRATH, Common_Movement_FaceOriginalDirection waitmovement 0 release end CeladonCity_EventScript_RocketGrunt1:: msgbox CeladonCity_Text_KeepOutOfTeamRocketsWay, MSGBOX_NPC end CeladonCity_EventScript_RocketGrunt2:: msgbox CeladonCity_Text_GetLostOrIllPunchYou, MSGBOX_NPC end CeladonCity_EventScript_Boy:: msgbox CeladonCity_Text_ScaldedTongueOnTea, MSGBOX_NPC end CeladonCity_EventScript_SilphCoScientist:: msgbox CeladonCity_Text_SomeoneStoleSilphScope, MSGBOX_NPC end CeladonCity_EventScript_TrainerTips1:: msgbox CeladonCity_Text_ExplainXAccuracyDireHit, MSGBOX_SIGN end CeladonCity_EventScript_CitySign:: msgbox CeladonCity_Text_CitySign, MSGBOX_SIGN end CeladonCity_EventScript_GymSign:: lockall famechecker FAMECHECKER_ERIKA, 0 msgbox CeladonCity_Text_GymSign releaseall end CeladonCity_EventScript_MansionSign:: msgbox CeladonCity_Text_MansionSign, MSGBOX_SIGN end CeladonCity_EventScript_DeptStoreSign:: msgbox CeladonCity_Text_DeptStoreSign, MSGBOX_SIGN end CeladonCity_EventScript_TrainerTips2:: msgbox CeladonCity_Text_GuardSpecProtectsFromStatus, MSGBOX_SIGN end CeladonCity_EventScript_PrizeExchangeSign:: msgbox CeladonCity_Text_PrizeExchangeSign, MSGBOX_SIGN end CeladonCity_EventScript_GameCornerSign:: msgbox CeladonCity_Text_GameCornerSign, MSGBOX_SIGN end ================================================ FILE: data/maps/CeladonCity/text.inc ================================================ CeladonCity_Text_GotMyKoffingInCinnabar:: .string "I got my KOFFING in CINNABAR.\p" .string "It's usually nice, but it breathes\n" .string "poison when it's angry.$" CeladonCity_Text_GymIsGreatFullOfWomen:: .string "Heheh! This GYM is great!\n" .string "It's full of women!$" CeladonCity_Text_GameCornerIsBadForCitysImage:: .string "CELADON takes pride in its efforts\n" .string "to keep the city beautiful.\p" .string "That's why the new GAME CORNER is\n" .string "bad for our city's image.$" CeladonCity_Text_BlewItAllAtSlots:: .string "Moan…\n" .string "I blew it all at the slots!\p" .string "I knew I should have cashed in my\n" .string "COINS for prizes!$" CeladonCity_Text_MyTrustedPalPoliwrath:: .string "This is my trusted pal, POLIWRATH.\p" .string "It evolved from a POLIWHIRL when\n" .string "I used a WATER STONE.$" CeladonCity_Text_Poliwrath:: .string "POLIWRATH: Ribi ribit!$" CeladonCity_Text_GetLostOrIllPunchYou:: .string "What are you staring at?\n" .string "Get lost, or I'll punch you.$" CeladonCity_Text_KeepOutOfTeamRocketsWay:: .string "Keep out of TEAM ROCKET's way!$" CeladonCity_Text_ExplainXAccuracyDireHit:: .string "TRAINER TIPS\p" .string "X ACCURACY boosts the accuracy of\n" .string "techniques.\p" .string "DIRE HIT jacks up the likelihood\n" .string "of critical hits.\p" .string "Get your items at the CELADON\n" .string "DEPT. STORE!$" CeladonCity_Text_CitySign:: .string "CELADON CITY\n" .string "The City of Rainbow Dreams$" CeladonCity_Text_GymSign:: .string "CELADON CITY POKéMON GYM\n" .string "LEADER: ERIKA\l" .string "The Nature-Loving Princess!$" CeladonCity_Text_MansionSign:: .string "CELADON MANSION$" CeladonCity_Text_DeptStoreSign:: .string "Find what you need at the\n" .string "CELADON DEPT. STORE!$" CeladonCity_Text_GuardSpecProtectsFromStatus:: .string "TRAINER TIPS\p" .string "GUARD SPEC. protects POKéMON\n" .string "from status-reduction moves during\l" .string "battle.\p" .string "Get your items at the\n" .string "CELADON DEPT. STORE!$" CeladonCity_Text_PrizeExchangeSign:: .string "COINS exchanged for prizes!\n" .string "PRIZE EXCHANGE$" CeladonCity_Text_GameCornerSign:: .string "ROCKET GAME CORNER\n" .string "The playground for grown-ups!$" CeladonCity_Text_ScaldedTongueOnTea:: .string "Aaaagh, ow…\n" .string "I scalded my tongue!\p" .string "This nice old lady in the MANSION\n" .string "gave me some TEA.\p" .string "But it was boiling hot!\n" .string "Gotta cool it to drink it.$" Text_SoftboiledTeach:: .string "Hello, there!\p" .string "I've seen you about, but I never\n" .string "had a chance to chat.\p" .string "It must be good luck that brought\n" .string "us together finally.\p" .string "I'd like to celebrate by teaching\n" .string "you the move SOFTBOILED.$" Text_SoftboiledDeclined:: .string "I'll always be keeping an eye out\n" .string "for you.\p" .string "I hope we can chat again.$" Text_SoftboiledWhichMon:: .string "So, who's the POKéMON that gets\n" .string "the chance to learn SOFTBOILED?$" Text_SoftboiledTaught:: .string "I wish you the best of luck!$" Text_SoftboiledReteach:: .string "Hello again!\p" .string "Did you stop by to chat, or would\n" .string "you like me to teach SOFTBOILED\l" .string "to your POKéMON?\p" .string "I can teach it again for\n" .string "only ¥5000!$" Text_SoftboiledReteach2:: .string "Would you like me to teach\n" .string "your POKéMON SOFTBOILED?$" Text_SoftboiledNotEnoughMoney:: .string "You don't have ¥5000!\n" .string "Come back again when you do.$" CeladonCity_Text_SomeoneStoleSilphScope:: .string "Oh, what am I to do…\p" .string "Someone stole our SILPH SCOPE.\p" .string "The thief came running this way,\n" .string "I'm sure of it.\p" .string "But I lost sight of him!\n" .string "Where'd he go?$" ================================================ FILE: data/maps/CeladonCity_Condominiums_1F/map.json ================================================ { "id": "MAP_CELADON_CITY_CONDOMINIUMS_1F", "name": "CeladonCity_Condominiums_1F", "layout": "LAYOUT_CELADON_CITY_CONDOMINIUMS_1F", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MEOWTH", "in_connection": false, "x": 1, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_1F_EventScript_Meowth", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLEFAIRY", "in_connection": false, "x": 5, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_1F_EventScript_Clefairy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NIDORAN_F", "in_connection": false, "x": 5, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_1F_EventScript_Nidoran", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 2, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_1F_EventScript_TeaWoman", "flag": "0" } ], "warp_events": [ { "x": 11, "y": 19, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "3" }, { "x": 12, "y": 18, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "3" }, { "x": 13, "y": 19, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "3" }, { "x": 4, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_2F", "dest_warp_id": "0" }, { "x": 12, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_2F", "dest_warp_id": "3" }, { "x": 2, "y": 1, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "11" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 8, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_1F_EventScript_SuiteSign" }, { "type": "sign", "x": 7, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_1F_EventScript_SuiteSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_Condominiums_1F/scripts.inc ================================================ CeladonCity_Condominiums_1F_MapScripts:: .byte 0 CeladonCity_Condominiums_1F_EventScript_TeaWoman:: lock faceplayer goto_if_set FLAG_TALKED_TO_TEA_LADY_AFTER_HOF, CeladonCity_Condominiums_1F_EventScript_TeaWomanAfterTea goto_if_set FLAG_SYS_GAME_CLEAR, CeladonCity_Condominiums_1F_EventScript_TeaWomanMentionDaisy goto_if_set FLAG_GOT_TEA, CeladonCity_Condominiums_1F_EventScript_TeaWomanAfterTea msgbox CeladonCity_Condominiums_1F_Text_TryThisDrinkInstead setflag FLAG_GOT_TEA giveitem ITEM_TEA goto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull msgbox CeladonCity_Condominiums_1F_Text_NothingBeatsThirstLikeTea release end CeladonCity_Condominiums_1F_EventScript_TeaWomanAfterTea:: msgbox CeladonCity_Condominiums_1F_Text_MyDearMonsKeepMeCompany release end CeladonCity_Condominiums_1F_EventScript_TeaWomanMentionDaisy:: famechecker FAMECHECKER_DAISY, 4 setflag FLAG_TALKED_TO_TEA_LADY_AFTER_HOF msgbox CeladonCity_Condominiums_1F_Text_DaisyComesToBuyTea release end CeladonCity_Condominiums_1F_EventScript_Meowth:: lock faceplayer waitse playmoncry SPECIES_MEOWTH, CRY_MODE_NORMAL msgbox CeladonCity_Condominiums_1F_Text_Meowth waitmoncry release end CeladonCity_Condominiums_1F_EventScript_Clefairy:: lock faceplayer waitse playmoncry SPECIES_CLEFAIRY, CRY_MODE_NORMAL msgbox CeladonCity_Condominiums_1F_Text_Clefairy waitmoncry release end CeladonCity_Condominiums_1F_EventScript_Nidoran:: lock faceplayer waitse playmoncry SPECIES_NIDORAN_F, CRY_MODE_NORMAL msgbox CeladonCity_Condominiums_1F_Text_Nidoran waitmoncry release end CeladonCity_Condominiums_1F_EventScript_SuiteSign:: msgbox CeladonCity_Condominiums_1F_Text_ManagersSuite, MSGBOX_SIGN end ================================================ FILE: data/maps/CeladonCity_Condominiums_1F/text.inc ================================================ CeladonCity_Condominiums_1F_Text_Meowth:: .string "MEOWTH: Meow!$" CeladonCity_Condominiums_1F_Text_TryThisDrinkInstead:: .string "You shouldn't spend all your money\n" .string "on drinks.\p" .string "Try this instead.$" CeladonCity_Condominiums_1F_Text_NothingBeatsThirstLikeTea:: .string "Nothing beats thirst like some hot\n" .string "TEA.\p" .string "It really is the best.$" CeladonCity_Condominiums_1F_Text_MyDearMonsKeepMeCompany:: .string "My dear POKéMON keep me company.\n" .string "MEOWTH even brings money home!$" CeladonCity_Condominiums_1F_Text_DaisyComesToBuyTea:: .string "Oh, hello, dearie.\n" .string "Did you enjoy my TEA?\p" .string "By the way, dear. Are you, by any\n" .string "chance, from PALLET TOWN?\p" .string "A girl from PALLET TOWN, DAISY,\n" .string "she enjoys TEA every day.\p" .string "She visits the CELADON DEPT. STORE\n" .string "to buy some TEA.$" CeladonCity_Condominiums_1F_Text_Clefairy:: .string "CLEFAIRY: Pi pippippi!$" CeladonCity_Condominiums_1F_Text_Nidoran:: .string "NIDORAN♀: Kya kyaoo!$" CeladonCity_Condominiums_1F_Text_ManagersSuite:: .string "CELADON MANSION\n" .string "Manager's Suite$" ================================================ FILE: data/maps/CeladonCity_Condominiums_2F/map.json ================================================ { "id": "MAP_CELADON_CITY_CONDOMINIUMS_2F", "name": "CeladonCity_Condominiums_2F", "layout": "LAYOUT_CELADON_CITY_CONDOMINIUMS_2F", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "0", "in_connection": false, "x": 6, "y": 6, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_2F_EventScript_PokemonJournalErika", "flag": "FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 5, "y": 6, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_2F_EventScript_PokemonJournalErika", "flag": "FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 2, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_MrMime", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 4, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_1F", "dest_warp_id": "3" }, { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_3F", "dest_warp_id": "0" }, { "x": 11, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_3F", "dest_warp_id": "3" }, { "x": 12, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_1F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 8, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_2F_EventScript_MeetingRoomSign" }, { "type": "sign", "x": 7, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_2F_EventScript_MeetingRoomSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_Condominiums_2F/scripts.inc ================================================ .set LOCALID_MR_MIME_MASTER, 3 .set TRAINER, VAR_0x8009 CeladonCity_Condominiums_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_Condominiums_2F_MapScript_SetMasterTrainerMovementTypes .byte 0 CeladonCity_Condominiums_2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MR_MIME callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeladonCity_Condominiums_2F_MapScript_MrMimeMasterMovementType end CeladonCity_Condominiums_2F_MapScript_MrMimeMasterMovementType:: setobjectmovementtype LOCALID_MR_MIME_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_Condominiums_2F_EventScript_MeetingRoomSign:: msgbox CeladonCity_Condominiums_2F_Text_GameFreakMeetingRoom, MSGBOX_SIGN end ================================================ FILE: data/maps/CeladonCity_Condominiums_2F/text.inc ================================================ CeladonCity_Condominiums_2F_Text_GameFreakMeetingRoom:: .string "GAME FREAK Meeting Room$" ================================================ FILE: data/maps/CeladonCity_Condominiums_3F/map.json ================================================ { "id": "MAP_CELADON_CITY_CONDOMINIUMS_3F", "name": "CeladonCity_Condominiums_3F", "layout": "LAYOUT_CELADON_CITY_CONDOMINIUMS_3F", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKER", "in_connection": false, "x": 0, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_3F_EventScript_Programmer", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 3, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_3F_EventScript_Designer", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 4, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_3F_EventScript_GraphicArtist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 0, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_3F_EventScript_Writer", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 6, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_3F_EventScript_TitleGiver", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_2F", "dest_warp_id": "1" }, { "x": 4, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_ROOF", "dest_warp_id": "0" }, { "x": 12, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_ROOF", "dest_warp_id": "1" }, { "x": 11, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_2F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 8, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_3F_EventScript_DevelopmentRoomSign" }, { "type": "sign", "x": 1, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_Condominiums_3F_EventScript_Computer1" }, { "type": "sign", "x": 5, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_Condominiums_3F_EventScript_Computer2" }, { "type": "sign", "x": 1, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_Condominiums_3F_EventScript_Computer3" }, { "type": "sign", "x": 7, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_3F_EventScript_DevelopmentRoomSign" }, { "type": "sign", "x": 0, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_Condominiums_3F_EventScript_Computer3" }, { "type": "sign", "x": 0, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_Condominiums_3F_EventScript_Computer1" }, { "type": "sign", "x": 4, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_Condominiums_3F_EventScript_Computer2" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_Condominiums_3F/scripts.inc ================================================ CeladonCity_Condominiums_3F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CeladonCity_Condominiums_3F_OnFrame .byte 0 CeladonCity_Condominiums_3F_OnFrame:: map_script_2 VAR_TEMP_0, 2, CeladonCity_Condominiums_3F_EventScript_CheckMysticTicket .2byte 0 CeladonCity_Condominiums_3F_EventScript_Programmer:: msgbox CeladonCity_Condominiums_3F_Text_ImTheProgrammer, MSGBOX_NPC end CeladonCity_Condominiums_3F_EventScript_GraphicArtist:: msgbox CeladonCity_Condominiums_3F_Text_ImTheGraphicArtist, MSGBOX_NPC end CeladonCity_Condominiums_3F_EventScript_Writer:: msgbox CeladonCity_Condominiums_3F_Text_IWroteTheStory, MSGBOX_NPC end CeladonCity_Condominiums_3F_EventScript_Designer:: lock faceplayer specialvar VAR_RESULT, HasAllKantoMons goto_if_eq VAR_RESULT, TRUE, CeladonCity_Condominiums_3F_EventScript_CompletedPokedex msgbox CeladonCity_Condominiums_3F_Text_ImGameDesignerShowMeFinishedPokedex release end CeladonCity_Condominiums_3F_EventScript_CompletedPokedex:: goto CeladonCity_Condominiums_3F_EventScript_ShowDiploma end CeladonCity_Condominiums_3F_EventScript_ShowDiploma:: message CeladonCity_Condominiums_3F_Text_CompletedPokedexCongratulations waitmessage delay 60 goto_if_questlog EventScript_ReleaseEnd setvar VAR_TEMP_0, 2 special ShowDiploma waitstate CeladonCity_Condominiums_3F_EventScript_CheckMysticTicket:: setvar VAR_TEMP_0, 0 checkitem ITEM_MYSTIC_TICKET, 1 compare VAR_RESULT, FALSE goto_if_eq CeladonCity_Condominiums_3F_EventScript_GiveMysticTicket release end CeladonCity_Condominiums_3F_EventScript_GiveMysticTicket:: goto_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, CeladonCity_Condominiums_3F_EventScript_CantGiveMysticTicket textcolor 0 msgbox CeladonCity_Condominiums_3F_Text_GiveMysticTicket textcolor 3 giveitem ITEM_MYSTIC_TICKET, 1 setflag FLAG_RECEIVED_MYSTIC_TICKET setflag FLAG_ENABLE_SHIP_NAVEL_ROCK textcolor 0 msgbox CeladonCity_Condominiums_3F_Text_ExplainMysticTicket release end CeladonCity_Condominiums_3F_EventScript_CantGiveMysticTicket:: textcolor 0 msgbox CeladonCity_Condominiums_3F_Text_CantGiveMysticTicket release end CeladonCity_Condominiums_3F_Text_CantGiveMysticTicket: .string "I have a gift for filling up your\n" .string "POKéDEX, but it's probably best to\l" .string "wait until it's been upgraded first.\p" .string "Come see me when your POKéDEX\n" .string "can handle registering more POKéMON.$" CeladonCity_Condominiums_3F_Text_GiveMysticTicket: .string "Here's a little gift for filling up\n" .string "your POKéDEX.$" CeladonCity_Condominiums_3F_Text_ExplainMysticTicket: .string "Bring that ticket to the docks in\n" .string "VERMILION CITY.\p" .string "With it, you can go to NAVEL ROCK\n" .string "between FOUR and FIVE ISLAND.\p" .string "Since you like catching POKéMON,\n" .string "you'll want to see what's there.\p" .string "Good luck!$" CeladonCity_Condominiums_3F_EventScript_DevelopmentRoomSign:: msgbox CeladonCity_Condominiums_3F_Text_GameFreakDevelopmentRoom, MSGBOX_SIGN end CeladonCity_Condominiums_3F_EventScript_Computer1:: msgbox CeladonCity_Condominiums_3F_Text_ItsTheGameProgram, MSGBOX_SIGN end CeladonCity_Condominiums_3F_EventScript_Computer2:: msgbox CeladonCity_Condominiums_3F_Text_SomeonesPlayingGame, MSGBOX_SIGN end CeladonCity_Condominiums_3F_EventScript_Computer3:: msgbox CeladonCity_Condominiums_3F_Text_ItsScriptBetterNotLookAtEnding, MSGBOX_SIGN end CeladonCity_Condominiums_3F_EventScript_TitleGiver:: lock faceplayer callnative CheckHasAnyMasterTitle compare VAR_RESULT, FALSE goto_if_eq CeladonCity_Condominiums_3F_EventScript_TitleGiver_NoTitles callnative CheckCurrentMasterTitle compare VAR_RESULT, 0 call_if_eq CeladonCity_Condominiums_3F_EventScript_TitleGiver_NoTitleSelected compare VAR_RESULT, 0 call_if_ne CeladonCity_Condominiums_3F_EventScript_TitleGiver_TitleSelected setvar VAR_0x8004, LISTMENU_MASTER_TRAINER_TITLES special ListMenu waitstate switch VAR_RESULT case 0, CeladonCity_Condominiums_3F_EventScript_TitleGiver_ChoseNoTitle case 152, CeladonCity_Condominiums_3F_EventScript_TitleGiver_ChoseGrandMaster case 153, CeladonCity_Condominiums_3F_EventScript_TitleGiver_PressedB // chose an actual mon callnative SetCurrentMasterTitle bufferspeciesname STR_VAR_2, VAR_RESULT msgbox CeladonCity_Condominiums_3F_Text_TitleGiver_ChoseMonMaster, MSGBOX_NPC end CeladonCity_Condominiums_3F_EventScript_TitleGiver_NoTitles: msgbox CeladonCity_Condominiums_3F_Text_TitleGiver_NoTitles, MSGBOX_NPC end CeladonCity_Condominiums_3F_EventScript_TitleGiver_NoTitleSelected: msgbox CeladonCity_Condominiums_3F_Text_TitleGiver_WelcomeNoTitle return CeladonCity_Condominiums_3F_EventScript_TitleGiver_TitleSelected: compare VAR_RESULT, 152 call_if_eq CeladonCity_Condominiums_3F_EventScript_TitleGiver_BufferGrand compare VAR_RESULT, 152 call_if_ne CeladonCity_Condominiums_3F_EventScript_TitleGiver_BufferSpecies msgbox CeladonCity_Condominiums_3F_Text_TitleGiver_WelcomeTitle return CeladonCity_Condominiums_3F_EventScript_TitleGiver_BufferGrand: bufferstring 1, CeladonCity_Condominiums_3F_EventScript_TitleGiver_Grand return CeladonCity_Condominiums_3F_EventScript_TitleGiver_BufferSpecies: bufferspeciesname STR_VAR_2, VAR_RESULT return CeladonCity_Condominiums_3F_EventScript_TitleGiver_ChoseNoTitle: callnative SetCurrentMasterTitle msgbox CeladonCity_Condominiums_3F_Text_TitleGiver_ChoseNoTitles, MSGBOX_NPC end CeladonCity_Condominiums_3F_EventScript_TitleGiver_ChoseGrandMaster: callnative SetCurrentMasterTitle msgbox CeladonCity_Condominiums_3F_Text_TitleGiver_ChoseGrandMaster, MSGBOX_NPC end CeladonCity_Condominiums_3F_EventScript_TitleGiver_PressedB: msgbox CeladonCity_Condominiums_3F_Text_TitleGiver_PressedB, MSGBOX_NPC end CeladonCity_Condominiums_3F_Text_TitleGiver_NoTitles: .string "Welcome!\p" .string "You probably don't know what I'm\n" .string "talking about, but come back once\l" .string "you have earned a title!$" CeladonCity_Condominiums_3F_Text_TitleGiver_WelcomeNoTitle: .string "Welcome!\p" .string "Or would you like me to call you\n" .string "by a title?$" CeladonCity_Condominiums_3F_Text_TitleGiver_WelcomeTitle: .string "Welcome, {STR_VAR_2} MASTER!\p" .string "Or would you like me to call you\n" .string "by a different title?$" CeladonCity_Condominiums_3F_Text_TitleGiver_ChoseNoTitles: .string "Oh, you don't want to have a title?\n" .string "I guess you really don't need one!$" CeladonCity_Condominiums_3F_Text_TitleGiver_ChoseGrandMaster: .string "Yo, GRAND MASTER!\n" .string "A fitting title for you indeed.$" CeladonCity_Condominiums_3F_Text_TitleGiver_PressedB: .string "Oh, you're not going to change\n" .string "your title?\p" .string "I guess you really like the one\n" .string "you have now!$" CeladonCity_Condominiums_3F_Text_TitleGiver_ChoseMonMaster: .string "Yo, {STR_VAR_2} MASTER!\n" .string "A fitting title for you indeed.$" CeladonCity_Condominiums_3F_EventScript_TitleGiver_Grand: .string "GRAND$" ================================================ FILE: data/maps/CeladonCity_Condominiums_3F/text.inc ================================================ CeladonCity_Condominiums_3F_Text_ImTheProgrammer:: .string "Me?\n" .string "I'm the programmer!$" CeladonCity_Condominiums_3F_Text_ImTheGraphicArtist:: .string "I'm the graphic artist!\n" .string "I drew you!$" CeladonCity_Condominiums_3F_Text_IWroteTheStory:: .string "I wrote the story!\n" .string "Isn't ERIKA cute?\p" .string "I like MISTY a lot, too!\n" .string "Oh, and SABRINA, I like her!$" CeladonCity_Condominiums_3F_Text_ImGameDesignerShowMeFinishedPokedex:: .string "Is that right?\p" .string "I'm the game designer!\p" .string "Filling up your POKéDEX is tough,\n" .string "but don't quit!\p" .string "When you finish, come tell me!$" CeladonCity_Condominiums_3F_Text_CompletedPokedexCongratulations:: .string "Wow! Excellent!\n" .string "You completed your POKéDEX!\l" .string "Congratulations!\l" .string "…$" CeladonCity_Condominiums_3F_Text_ItsTheGameProgram:: .string "It's the game program! Messing with\n" .string "it could bug out the game!$" CeladonCity_Condominiums_3F_Text_SomeonesPlayingGame:: .string "Someone's playing a game instead of\n" .string "working!$" CeladonCity_Condominiums_3F_Text_ItsScriptBetterNotLookAtEnding:: .string "It's the script!\n" .string "Better not look at the ending!$" CeladonCity_Condominiums_3F_Text_GameFreakDevelopmentRoom:: .string "GAME FREAK Development Room$" ================================================ FILE: data/maps/CeladonCity_Condominiums_Roof/map.json ================================================ { "id": "MAP_CELADON_CITY_CONDOMINIUMS_ROOF", "name": "CeladonCity_Condominiums_Roof", "layout": "LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_TOWN", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 4, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_3F", "dest_warp_id": "1" }, { "x": 10, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_3F", "dest_warp_id": "2" }, { "x": 2, "y": 12, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_Roof_EventScript_Sign" }, { "type": "sign", "x": 3, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_Roof_EventScript_Sign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_Condominiums_Roof/scripts.inc ================================================ CeladonCity_Condominiums_Roof_MapScripts:: .byte 0 CeladonCity_Condominiums_Roof_EventScript_Sign:: msgbox CeladonCity_Condominiums_Roof_Text_IKnowEverything, MSGBOX_SIGN end ================================================ FILE: data/maps/CeladonCity_Condominiums_Roof/text.inc ================================================ CeladonCity_Condominiums_Roof_Text_IKnowEverything:: .string "I KNOW EVERYTHING!$" ================================================ FILE: data/maps/CeladonCity_Condominiums_RoofRoom/map.json ================================================ { "id": "MAP_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM", "name": "CeladonCity_Condominiums_RoofRoom", "layout": "LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_RoofRoom_EventScript_BlackBelt", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 7, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Condominiums_RoofRoom_EventScript_EeveeBall", "flag": "FLAG_HIDE_EEVEE_BALL" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 0, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Charmander", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 8, "elevation": 0, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_ROOF", "dest_warp_id": "2" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_ROOF", "dest_warp_id": "2" }, { "x": 5, "y": 8, "elevation": 0, "dest_map": "MAP_CELADON_CITY_CONDOMINIUMS_ROOF", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_RoofRoom_EventScript_Blackboard" }, { "type": "sign", "x": 5, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_RoofRoom_EventScript_Blackboard" }, { "type": "sign", "x": 4, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Condominiums_RoofRoom_EventScript_TMsPamphlet" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_Condominiums_RoofRoom/scripts.inc ================================================ .set LOCALID_EEVEE_POKEBALL, 2 .set LOCALID_CHARMANDER_MASTER, 3 .set TRAINER, VAR_0x8009 CeladonCity_Condominiums_RoofRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_Condominiums_RoofRoom_MapScript_SetMasterTrainerMovementTypes .byte 0 CeladonCity_Condominiums_RoofRoom_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_CHARMANDER callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeladonCity_Condominiums_RoofRoom_MapScript_CharmanderMasterMovementType end CeladonCity_Condominiums_RoofRoom_MapScript_CharmanderMasterMovementType:: setobjectmovementtype LOCALID_CHARMANDER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_Condominiums_RoofRoom_EventScript_BlackBelt:: msgbox CeladonCity_Condominiums_RoofRoom_Text_TheresNothingIDontKnow, MSGBOX_NPC end CeladonCity_Condominiums_RoofRoom_EventScript_EeveeBall:: lock faceplayer setvar VAR_TEMP_1, SPECIES_EEVEE givemon SPECIES_EEVEE, 25 goto_if_eq VAR_RESULT, 0, CeladonCity_Condominiums_RoofRoom_EventScript_GetEeveeParty goto_if_eq VAR_RESULT, 1, CeladonCity_Condominiums_RoofRoom_EventScript_GetEeveePC goto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon release end CeladonCity_Condominiums_RoofRoom_EventScript_GetEeveeParty:: removeobject LOCALID_EEVEE_POKEBALL playfanfare MUS_LEVEL_UP message CeladonCity_Condominiums_RoofRoom_Text_ObtainedAnEevee waitmessage waitfanfare bufferspeciesname STR_VAR_1, SPECIES_EEVEE callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, CeladonCity_Condominiums_RoofRoom_EventScript_NicknameEeveeParty msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_Condominiums_RoofRoom_EventScript_SetGotEevee CeladonCity_Condominiums_RoofRoom_EventScript_NicknameEeveeParty:: call EventScript_GetGiftMonPartySlot call EventScript_ChangePokemonNickname goto CeladonCity_Condominiums_RoofRoom_EventScript_SetGotEevee end CeladonCity_Condominiums_RoofRoom_EventScript_GetEeveePC:: removeobject LOCALID_EEVEE_POKEBALL playfanfare MUS_LEVEL_UP message CeladonCity_Condominiums_RoofRoom_Text_ObtainedAnEevee waitmessage waitfanfare bufferspeciesname STR_VAR_1, SPECIES_EEVEE callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, CeladonCity_Condominiums_RoofRoom_EventScript_NicknameEeveePC msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_Condominiums_RoofRoom_EventScript_TransferEeveeToPC CeladonCity_Condominiums_RoofRoom_EventScript_NicknameEeveePC:: call EventScript_NameReceivedBoxMon goto CeladonCity_Condominiums_RoofRoom_EventScript_TransferEeveeToPC end CeladonCity_Condominiums_RoofRoom_EventScript_TransferEeveeToPC:: call EventScript_TransferredToPC goto CeladonCity_Condominiums_RoofRoom_EventScript_SetGotEevee end CeladonCity_Condominiums_RoofRoom_EventScript_SetGotEevee:: setflag FLAG_GOT_EEVEE release end CeladonCity_Condominiums_RoofRoom_EventScript_TMsPamphlet:: msgbox CeladonCity_Condominiums_RoofRoom_Text_PamphletOnTMs, MSGBOX_SIGN end CeladonCity_Condominiums_RoofRoom_EventScript_Blackboard:: lockall msgbox CeladonCity_Condominiums_RoofRoom_Text_WirelessAdapterLecture message CeladonCity_Condominiums_RoofRoom_Text_ReadWhichHeading waitmessage setvar VAR_0x8004, 4 multichoice 0, 0, MULTICHOICE_LINKED_DIRECT_UNION, FALSE switch VAR_RESULT case 0, CeladonCity_Condominiums_RoofRoom_EventScript_WirelessClub case 1, CeladonCity_Condominiums_RoofRoom_EventScript_DirectCorner case 2, CeladonCity_Condominiums_RoofRoom_EventScript_UnionRoom case 3, CeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard case 127, CeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard end CeladonCity_Condominiums_RoofRoom_EventScript_ReadAnotherHeading:: message CeladonCity_Condominiums_RoofRoom_Text_ReadWhichHeading waitmessage multichoice 0, 0, MULTICHOICE_LINKED_DIRECT_UNION, FALSE switch VAR_RESULT case 0, CeladonCity_Condominiums_RoofRoom_EventScript_WirelessClub case 1, CeladonCity_Condominiums_RoofRoom_EventScript_DirectCorner case 2, CeladonCity_Condominiums_RoofRoom_EventScript_UnionRoom case 3, CeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard case 127, CeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard end CeladonCity_Condominiums_RoofRoom_EventScript_WirelessClub:: msgbox CeladonCity_Condominiums_RoofRoom_Text_ExplainWirelessClub goto CeladonCity_Condominiums_RoofRoom_EventScript_ReadAnotherHeading end CeladonCity_Condominiums_RoofRoom_EventScript_DirectCorner:: msgbox CeladonCity_Condominiums_RoofRoom_Text_ExplainDirectCorner goto CeladonCity_Condominiums_RoofRoom_EventScript_ReadAnotherHeading end CeladonCity_Condominiums_RoofRoom_EventScript_UnionRoom:: msgbox CeladonCity_Condominiums_RoofRoom_Text_ExplainUnionRoom goto CeladonCity_Condominiums_RoofRoom_EventScript_ReadAnotherHeading end CeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard:: releaseall end ================================================ FILE: data/maps/CeladonCity_Condominiums_RoofRoom/text.inc ================================================ CeladonCity_Condominiums_RoofRoom_Text_TheresNothingIDontKnow:: .string "There is nothing that I don't know,\n" .string "like I wrote on the blackboard.\p" .string "I know about the world of POKéMON\n" .string "in your GAME BOY ADVANCE!\p" .string "Get together with your friends and\n" .string "enjoy trading POKéMON!$" CeladonCity_Condominiums_RoofRoom_Text_ObtainedAnEevee:: .string "{PLAYER} obtained an EEVEE!$" CeladonCity_Condominiums_RoofRoom_Text_WirelessAdapterLecture:: .string "POKéMON Lecture\p" .string "Playing with the Wireless Adapter$" CeladonCity_Condominiums_RoofRoom_Text_ReadWhichHeading:: .string "Which heading do you want to read?$" CeladonCity_Condominiums_RoofRoom_Text_ExplainWirelessClub:: .string "The POKéMON WIRELESS CLUB is\n" .string "upstairs at any POKéMON CENTER.\p" .string "Visit one to link up with friend(s)\n" .string "using your Wireless Adapter.$" CeladonCity_Condominiums_RoofRoom_Text_ExplainDirectCorner:: .string "To link only with a friend, go to\n" .string "the DIRECT CORNER.\p" .string "It is the right counter at the\n" .string "POKéMON WIRELESS CLUB.\p" .string "Go into the TRADE CORNER or the\n" .string "COLOSSEUM with your friend.$" CeladonCity_Condominiums_RoofRoom_Text_ExplainUnionRoom:: .string "To link and communicate with\n" .string "anyone, go to the UNION ROOM.\p" .string "It is the left counter at the\n" .string "POKéMON WIRELESS CLUB.\p" .string "Go to the UNION ROOM and enjoy\n" .string "meeting other TRAINERS.$" CeladonCity_Condominiums_RoofRoom_Text_PamphletOnTMs:: .string "It's a pamphlet on TMs.\p" .string "… …\p" .string "There are fifty TMs in all.\p" .string "There are also seven HMs that\n" .string "can be used repeatedly.\p" .string "SILPH CO.$" ================================================ FILE: data/maps/CeladonCity_DepartmentStore_1F/map.json ================================================ { "id": "MAP_CELADON_CITY_DEPARTMENT_STORE_1F", "name": "CeladonCity_DepartmentStore_1F", "layout": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_1F", "music": "MUS_POKE_MART", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": true, "floor_number": 1, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 6, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_1F_EventScript_Receptionist", "flag": "0" } ], "warp_events": [ { "x": 1, "y": 15, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "1" }, { "x": 2, "y": 14, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "1" }, { "x": 3, "y": 15, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "1" }, { "x": 9, "y": 15, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "2" }, { "x": 10, "y": 14, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "2" }, { "x": 11, "y": 15, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "2" }, { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR", "dest_warp_id": "0" }, { "x": 4, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_2F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 9, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_1F_EventScript_LayoutSign" }, { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_1F_EventScript_FloorSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_DepartmentStore_1F/scripts.inc ================================================ CeladonCity_DepartmentStore_1F_MapScripts:: .byte 0 CeladonCity_DepartmentStore_1F_EventScript_Receptionist:: msgbox CeladonCity_DepartmentStore_1F_Text_WelcomeToDeptStore, MSGBOX_NPC end CeladonCity_DepartmentStore_1F_EventScript_LayoutSign:: msgbox CeladonCity_DepartmentStore_1F_Text_FloorDescriptions, MSGBOX_SIGN end CeladonCity_DepartmentStore_1F_EventScript_FloorSign:: msgbox CeladonCity_DepartmentStore_1F_Text_ServiceCounter, MSGBOX_SIGN end ================================================ FILE: data/maps/CeladonCity_DepartmentStore_1F/text.inc ================================================ CeladonCity_DepartmentStore_1F_Text_WelcomeToDeptStore:: .string "Hello!\n" .string "Welcome to CELADON DEPT. STORE.\p" .string "The board on the right describes\n" .string "the store layout.$" CeladonCity_DepartmentStore_1F_Text_FloorDescriptions:: .string "1F: SERVICE COUNTER\p" .string "2F: TRAINER'S MARKET\p" .string "3F: TV GAME SHOP\p" .string "4F: WISE MAN GIFTS\p" .string "5F: DRUGSTORE\p" .string "ROOFTOP SQUARE: VENDING MACHINES$" CeladonCity_DepartmentStore_1F_Text_ServiceCounter:: .string "1F: SERVICE COUNTER$" ================================================ FILE: data/maps/CeladonCity_DepartmentStore_2F/map.json ================================================ { "id": "MAP_CELADON_CITY_DEPARTMENT_STORE_2F", "name": "CeladonCity_DepartmentStore_2F", "layout": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_2F", "music": "MUS_POKE_MART", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": true, "floor_number": 2, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 5, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_2F_EventScript_Lass", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 1, "y": 8, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_2F_EventScript_ClerkItems", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 1, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_2F_EventScript_ClerkTMs", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 11, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_2F_EventScript_Woman", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 12, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Vaporeon", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR", "dest_warp_id": "0" }, { "x": 3, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_1F", "dest_warp_id": "7" }, { "x": 9, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_3F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_2F_EventScript_FloorSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_DepartmentStore_2F/scripts.inc ================================================ .set LOCALID_VAPOREON_MASTER, 5 .set TRAINER, VAR_0x8009 CeladonCity_DepartmentStore_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_DepartmentStore_2F_MapScript_SetMasterTrainerMovementTypes .byte 0 CeladonCity_DepartmentStore_2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_VAPOREON callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_2F_MapScript_VaporeonMasterMovementType end CeladonCity_DepartmentStore_2F_MapScript_VaporeonMasterMovementType:: setobjectmovementtype LOCALID_VAPOREON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_DepartmentStore_2F_EventScript_UnusedNPC:: msgbox CeladonCity_DepartmentStore_2F_Text_SuperRepelMorePowerfulRepel, MSGBOX_NPC end CeladonCity_DepartmentStore_2F_EventScript_Lass:: msgbox CeladonCity_DepartmentStore_2F_Text_BuyReviveForLongOutings, MSGBOX_NPC end CeladonCity_DepartmentStore_2F_EventScript_FloorSign:: msgbox CeladonCity_DepartmentStore_2F_Text_FloorSign, MSGBOX_SIGN end CeladonCity_DepartmentStore_2F_EventScript_ClerkItems:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart CeladonCity_DepartmentStore_2F_Items msgbox Text_PleaseComeAgain release end .align 2 CeladonCity_DepartmentStore_2F_Items:: .2byte ITEM_GREAT_BALL .2byte ITEM_SUPER_POTION .2byte ITEM_REVIVE .2byte ITEM_ANTIDOTE .2byte ITEM_PARALYZE_HEAL .2byte ITEM_AWAKENING .2byte ITEM_BURN_HEAL .2byte ITEM_ICE_HEAL .2byte ITEM_SUPER_REPEL .2byte ITEM_NONE release end CeladonCity_DepartmentStore_2F_EventScript_ClerkTMs:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart CeladonCity_DepartmentStore_2F_TMs msgbox Text_PleaseComeAgain release end .align 2 CeladonCity_DepartmentStore_2F_TMs:: .2byte ITEM_TM05 .2byte ITEM_TM10 .2byte ITEM_TM15 .2byte ITEM_TM28 .2byte ITEM_TM31 .2byte ITEM_TM43 .2byte ITEM_TM44 .2byte ITEM_TM45 .2byte ITEM_NONE release end ================================================ FILE: data/maps/CeladonCity_DepartmentStore_2F/text.inc ================================================ CeladonCity_DepartmentStore_2F_Text_SuperRepelMorePowerfulRepel:: .string "SUPER REPEL keeps weak POKéMON at\n" .string "bay…\p" .string "Hmm, it's a more powerful REPEL.$" CeladonCity_DepartmentStore_2F_Text_BuyReviveForLongOutings:: .string "For long outings, you should buy\n" .string "REVIVE.$" CeladonCity_DepartmentStore_2F_Text_FloorSign:: .string "Top-Grade Items for TRAINERS!\p" .string "2F: TRAINER'S MARKET$" CeladonCity_DepartmentStore_2F_Text_LanceComesToBuyCapes:: .string "We have a customer, LANCE, who\n" .string "occasionally comes.\p" .string "He always buys capes.\p" .string "I wonder… Does he have many\n" .string "identical capes at home?$" ================================================ FILE: data/maps/CeladonCity_DepartmentStore_3F/map.json ================================================ { "id": "MAP_CELADON_CITY_DEPARTMENT_STORE_3F", "name": "CeladonCity_DepartmentStore_3F", "layout": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_3F", "music": "MUS_POKE_MART", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": true, "floor_number": 3, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 10, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_3F_EventScript_CounterTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GBA_KID", "in_connection": false, "x": 11, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_3F_EventScript_GBAKid1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GBA_KID", "in_connection": false, "x": 4, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_3F_EventScript_GBAKid3", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GBA_KID", "in_connection": false, "x": 1, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_3F_EventScript_GBAKid2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 9, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_3F_EventScript_LittleGirl", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 1, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Jolteon", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR", "dest_warp_id": "0" }, { "x": 9, "y": 2, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_2F", "dest_warp_id": "2" }, { "x": 3, "y": 2, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_4F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_3F_EventScript_FloorSign" }, { "type": "sign", "x": 2, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_DepartmentStore_3F_EventScript_TV1" }, { "type": "sign", "x": 5, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_DepartmentStore_3F_EventScript_TV2" }, { "type": "sign", "x": 2, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_DepartmentStore_3F_EventScript_TV3" }, { "type": "sign", "x": 5, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_DepartmentStore_3F_EventScript_TV4" }, { "type": "sign", "x": 1, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_3F_EventScript_SuperNES" }, { "type": "sign", "x": 1, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_3F_EventScript_SuperNES" }, { "type": "sign", "x": 4, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_3F_EventScript_SuperNES" }, { "type": "sign", "x": 4, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_3F_EventScript_SuperNES" }, { "type": "sign", "x": 2, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_DepartmentStore_3F_EventScript_Poster" }, { "type": "sign", "x": 0, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CeladonCity_DepartmentStore_3F_EventScript_Poster" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_DepartmentStore_3F/scripts.inc ================================================ .set LOCALID_JOLTEON_MASTER, 6 .set TRAINER, VAR_0x8009 CeladonCity_DepartmentStore_3F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_DepartmentStore_3F_MapScript_SetMasterTrainerMovementTypes .byte 0 CeladonCity_DepartmentStore_3F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_JOLTEON callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_3F_MapScript_JolteonMasterMovementType end CeladonCity_DepartmentStore_3F_MapScript_JolteonMasterMovementType:: setobjectmovementtype LOCALID_JOLTEON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_DepartmentStore_3F_EventScript_CounterTutor:: goto EventScript_CounterTutor end CeladonCity_DepartmentStore_3F_EventScript_GBAKid1:: msgbox CeladonCity_DepartmentStore_3F_Text_OTStandsForOriginalTrainer, MSGBOX_NPC end CeladonCity_DepartmentStore_3F_EventScript_GBAKid2:: msgbox CeladonCity_DepartmentStore_3F_Text_BuddyTradingKangaskhanForHaunter, MSGBOX_NPC end CeladonCity_DepartmentStore_3F_EventScript_GBAKid3:: msgbox CeladonCity_DepartmentStore_3F_Text_HaunterEvolvedOnTrade, MSGBOX_NPC end CeladonCity_DepartmentStore_3F_EventScript_LittleGirl:: msgbox CeladonCity_DepartmentStore_3F_Text_CanIdentifyTradeMonsByID, MSGBOX_NPC end CeladonCity_DepartmentStore_3F_EventScript_SuperNES:: msgbox CeladonCity_DepartmentStore_3F_Text_ItsSuperNES, MSGBOX_SIGN end CeladonCity_DepartmentStore_3F_EventScript_TV1:: msgbox CeladonCity_DepartmentStore_3F_Text_AnRPG, MSGBOX_SIGN end CeladonCity_DepartmentStore_3F_EventScript_TV2:: msgbox CeladonCity_DepartmentStore_3F_Text_SportsGame, MSGBOX_SIGN end CeladonCity_DepartmentStore_3F_EventScript_TV3:: msgbox CeladonCity_DepartmentStore_3F_Text_PuzzleGame, MSGBOX_SIGN end CeladonCity_DepartmentStore_3F_EventScript_TV4:: msgbox CeladonCity_DepartmentStore_3F_Text_FightingGame, MSGBOX_SIGN end CeladonCity_DepartmentStore_3F_EventScript_FloorSign:: msgbox CeladonCity_DepartmentStore_3F_Text_TVGameShop, MSGBOX_SIGN end CeladonCity_DepartmentStore_3F_EventScript_Poster:: msgbox CeladonCity_DepartmentStore_3F_Text_RedGreenBothArePokemon, MSGBOX_SIGN end ================================================ FILE: data/maps/CeladonCity_DepartmentStore_3F/text.inc ================================================ CeladonCity_DepartmentStore_3F_Text_OTStandsForOriginalTrainer:: .string "Captured POKéMON are registered\n" .string "with an ID No. and the OT.\p" .string "OT stands for “Original TRAINER” -\n" .string "the TRAINER that caught it first.$" CeladonCity_DepartmentStore_3F_Text_BuddyTradingKangaskhanForHaunter:: .string "All right!\p" .string "My buddy's going to trade me his\n" .string "KANGASKHAN for my HAUNTER!$" CeladonCity_DepartmentStore_3F_Text_HaunterEvolvedOnTrade:: .string "Come on, HAUNTER!\p" .string "I love HAUNTER!\n" .string "I collect them!\p" .string "Huh?\p" .string "HAUNTER turned into a different\n" .string "POKéMON while being traded!$" CeladonCity_DepartmentStore_3F_Text_CanIdentifyTradeMonsByID:: .string "You can identify POKéMON you get\n" .string "in trades by their ID Numbers.$" CeladonCity_DepartmentStore_3F_Text_ItsSuperNES:: .string "It's a Super NES.$" CeladonCity_DepartmentStore_3F_Text_AnRPG:: .string "An RPG!\n" .string "There's no time for that!$" CeladonCity_DepartmentStore_3F_Text_SportsGame:: .string "A sports game!\n" .string "Dad'll like that!$" CeladonCity_DepartmentStore_3F_Text_PuzzleGame:: .string "A puzzle game!\n" .string "Looks addictive!$" CeladonCity_DepartmentStore_3F_Text_FightingGame:: .string "A fighting game!\n" .string "Looks tough!$" CeladonCity_DepartmentStore_3F_Text_TVGameShop:: .string "3F: TV GAME SHOP$" CeladonCity_DepartmentStore_3F_Text_RedGreenBothArePokemon:: .string "Red and Green!\n" .string "Both are POKéMON!$" Text_CounterTeach:: .string "Oh, hi!\n" .string "I finally finished POKéMON.\p" .string "Not done yet? How about I teach\n" .string "you a good move?\p" .string "The move I have in mind is\n" .string "COUNTER.\p" .string "Not like the one I'm leaning on,\n" .string "mind you!$" Text_CounterDeclined:: .string "You're not interested? Come see\n" .string "me if you change your mind.$" Text_CounterWhichMon:: .string "Which POKéMON should I teach\n" .string "COUNTER to?$" Text_CounterTaught:: .string "Are you using that COUNTER move\n" .string "I taught your POKéMON?$" Text_CounterReteach:: .string "Still working away at POKéMON?\n" .string "I've moved onto the next big thing.\p" .string "If you want, I can teach you\n" .string "COUNTER again for ¥5000.$" Text_CounterReteach2:: .string "Should I teach COUNTER to your\n" .string "POKéMON?$" Text_CounterNotEnoughMoney:: .string "Kid, I need money for the next\n" .string "big game that's coming out soon!\p" .string "I can't help you out with COUNTER\n" .string "if you can't help me out by paying.$" ================================================ FILE: data/maps/CeladonCity_DepartmentStore_4F/map.json ================================================ { "id": "MAP_CELADON_CITY_DEPARTMENT_STORE_4F", "name": "CeladonCity_DepartmentStore_4F", "layout": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_4F", "music": "MUS_POKE_MART", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": true, "floor_number": 4, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 6, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_4F_EventScript_Man", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 10, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_4F_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 3, "y": 13, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_4F_EventScript_Clerk", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 0, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Flareon", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR", "dest_warp_id": "0" }, { "x": 3, "y": 2, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_3F", "dest_warp_id": "2" }, { "x": 9, "y": 2, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_5F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_4F_EventScript_FloorSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_DepartmentStore_4F/scripts.inc ================================================ .set LOCALID_FLAREON_MASTER, 4 .set TRAINER, VAR_0x8009 CeladonCity_DepartmentStore_4F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_DepartmentStore_4F_MapScript_SetMasterTrainerMovementTypes .byte 0 CeladonCity_DepartmentStore_4F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_FLAREON callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_4F_MapScript_FlareonMasterMovementType end CeladonCity_DepartmentStore_4F_MapScript_FlareonMasterMovementType:: setobjectmovementtype LOCALID_FLAREON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_DepartmentStore_4F_EventScript_Man:: msgbox CeladonCity_DepartmentStore_4F_Text_GettingPokeDollAsPresent, MSGBOX_NPC end CeladonCity_DepartmentStore_4F_EventScript_Youngster:: msgbox CeladonCity_DepartmentStore_4F_Text_CanRunAwayWithPokeDoll, MSGBOX_NPC end CeladonCity_DepartmentStore_4F_EventScript_FloorSign:: msgbox CeladonCity_DepartmentStore_4F_Text_FloorSign, MSGBOX_SIGN end CeladonCity_DepartmentStore_4F_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart CeladonCity_DepartmentStore_4F_Items msgbox Text_PleaseComeAgain release end .align 2 CeladonCity_DepartmentStore_4F_Items:: .2byte ITEM_POKE_DOLL .2byte ITEM_RETRO_MAIL .2byte ITEM_FIRE_STONE .2byte ITEM_THUNDER_STONE .2byte ITEM_WATER_STONE .2byte ITEM_LEAF_STONE .2byte ITEM_NONE release end ================================================ FILE: data/maps/CeladonCity_DepartmentStore_4F/text.inc ================================================ CeladonCity_DepartmentStore_4F_Text_GettingPokeDollAsPresent:: .string "I'm getting a present for my\n" .string "girlfriend.\p" .string "I guess a POKé DOLL will be it.\n" .string "It's the popular thing.$" CeladonCity_DepartmentStore_4F_Text_CanRunAwayWithPokeDoll:: .string "I heard something useful.\p" .string "If a wild POKéMON appears, you can\n" .string "distract it with a POKé DOLL.\p" .string "You can run away while the wild\n" .string "POKéMON is distracted.$" CeladonCity_DepartmentStore_4F_Text_FloorSign:: .string "Express yourself with gifts!\n" .string "4F: WISE MAN GIFTS\p" .string "Evolution Special!\n" .string "Element STONES on sale now!$" ================================================ FILE: data/maps/CeladonCity_DepartmentStore_5F/map.json ================================================ { "id": "MAP_CELADON_CITY_DEPARTMENT_STORE_5F", "name": "CeladonCity_DepartmentStore_5F", "layout": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_5F", "music": "MUS_POKE_MART", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": true, "floor_number": 5, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 11, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_5F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 6, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_5F_EventScript_Sailor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 1, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_5F_EventScript_ClerkXItems", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 1, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_5F_EventScript_ClerkVitamins", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR", "dest_warp_id": "0" }, { "x": 9, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_4F", "dest_warp_id": "2" }, { "x": 3, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_5F_EventScript_FloorSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_DepartmentStore_5F/scripts.inc ================================================ CeladonCity_DepartmentStore_5F_MapScripts:: .byte 0 CeladonCity_DepartmentStore_5F_EventScript_Gentleman:: msgbox CeladonCity_DepartmentStore_5F_Text_ExplainStatEnhancers, MSGBOX_NPC end CeladonCity_DepartmentStore_5F_EventScript_Sailor:: msgbox CeladonCity_DepartmentStore_5F_Text_HereForStatEnhancers, MSGBOX_NPC end CeladonCity_DepartmentStore_5F_EventScript_FloorSign:: msgbox CeladonCity_DepartmentStore_5F_Text_Drugstore, MSGBOX_SIGN end CeladonCity_DepartmentStore_5F_EventScript_ClerkXItems:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart CeladonCity_DepartmentStore_5F_XItems msgbox Text_PleaseComeAgain release end .align 2 CeladonCity_DepartmentStore_5F_XItems:: .2byte ITEM_X_ATTACK .2byte ITEM_X_DEFEND .2byte ITEM_X_SPEED .2byte ITEM_X_SPECIAL .2byte ITEM_X_ACCURACY .2byte ITEM_GUARD_SPEC .2byte ITEM_DIRE_HIT .2byte ITEM_NONE release end CeladonCity_DepartmentStore_5F_EventScript_ClerkVitamins:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart CeladonCity_DepartmentStore_5F_Vitamins msgbox Text_PleaseComeAgain release end .align 2 CeladonCity_DepartmentStore_5F_Vitamins:: .2byte ITEM_HP_UP .2byte ITEM_PROTEIN .2byte ITEM_IRON .2byte ITEM_CALCIUM .2byte ITEM_ZINC .2byte ITEM_CARBOS .2byte ITEM_NONE release end ================================================ FILE: data/maps/CeladonCity_DepartmentStore_5F/text.inc ================================================ CeladonCity_DepartmentStore_5F_Text_ExplainStatEnhancers:: .string "POKéMON stat enhancers can be\n" .string "bought only here.\p" .string "HP UP increases the base HP of a\n" .string "POKéMON.\p" .string "CALCIUM raises the base SP. ATK\n" .string "stat of one POKéMON.\p" .string "ZINC boosts the base SP. DEF stat\n" .string "of one POKéMON.\p" .string "CARBOS enhances the base SPEED\n" .string "stat.$" CeladonCity_DepartmentStore_5F_Text_HereForStatEnhancers:: .string "I'm here for POKéMON stat\n" .string "enhancers.\p" .string "PROTEIN increases the base ATTACK\n" .string "power.\p" .string "IRON increases the base DEFENSE\n" .string "stat.$" CeladonCity_DepartmentStore_5F_Text_Drugstore:: .string "5F: DRUGSTORE$" ================================================ FILE: data/maps/CeladonCity_DepartmentStore_Elevator/map.json ================================================ { "id": "MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR", "name": "CeladonCity_DepartmentStore_Elevator", "layout": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR", "music": "MUS_POKE_MART", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 2, "y": 6, "elevation": 0, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 0, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelect" }, { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelect" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_DepartmentStore_Elevator/scripts.inc ================================================ CeladonCity_DepartmentStore_Elevator_MapScripts:: .byte 0 CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelect:: lockall setvar VAR_0x8004, 3 call_if_unset FLAG_TEMP_2, EventScript_GetElevatorFloor copyvar VAR_0x8005, VAR_ELEVATOR_FLOOR special DrawElevatorCurrentFloorWindow message Text_WantWhichFloor waitmessage setvar VAR_0x8004, 3 specialvar VAR_RESULT, InitElevatorFloorSelectMenuPos switch VAR_RESULT case 0, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom5F case 1, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom4F case 2, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom3F case 3, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom2F case 4, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom1F end CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom5F:: multichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 0, FALSE goto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor end CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom4F:: multichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 1, FALSE goto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor end CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom3F:: multichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 2, FALSE goto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor end CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom2F:: multichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 3, FALSE goto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor end CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom1F:: multichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 4, FALSE goto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor end CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor:: switch VAR_RESULT case 0, CeladonCity_DepartmentStore_Elevator_EventScript_To5F case 1, CeladonCity_DepartmentStore_Elevator_EventScript_To4F case 2, CeladonCity_DepartmentStore_Elevator_EventScript_To3F case 3, CeladonCity_DepartmentStore_Elevator_EventScript_To2F case 4, CeladonCity_DepartmentStore_Elevator_EventScript_To1F case 5, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect case 127, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect end CeladonCity_DepartmentStore_Elevator_EventScript_To1F:: setvar VAR_0x8006, 4 setdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_1F, 255, 6, 1 goto_if_eq VAR_ELEVATOR_FLOOR, 4, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect call CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 4 goto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect end CeladonCity_DepartmentStore_Elevator_EventScript_To2F:: setvar VAR_0x8006, 5 setdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_2F, 255, 6, 1 goto_if_eq VAR_ELEVATOR_FLOOR, 5, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect call CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 5 goto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect end CeladonCity_DepartmentStore_Elevator_EventScript_To3F:: setvar VAR_0x8006, 6 setdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_3F, 255, 6, 1 goto_if_eq VAR_ELEVATOR_FLOOR, 6, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect call CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 6 goto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect end CeladonCity_DepartmentStore_Elevator_EventScript_To4F:: setvar VAR_0x8006, 7 setdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_4F, 255, 6, 1 goto_if_eq VAR_ELEVATOR_FLOOR, 7, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect call CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 7 goto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect end CeladonCity_DepartmentStore_Elevator_EventScript_To5F:: setvar VAR_0x8006, 8 setdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_5F, 255, 6, 1 goto_if_eq VAR_ELEVATOR_FLOOR, 8, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect call CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 8 goto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect end CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect:: special CloseElevatorCurrentFloorWindow releaseall end CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator:: special CloseElevatorCurrentFloorWindow closemessage waitse special AnimateElevator waitstate setflag FLAG_TEMP_2 return ================================================ FILE: data/maps/CeladonCity_DepartmentStore_Roof/map.json ================================================ { "id": "MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF", "name": "CeladonCity_DepartmentStore_Roof", "layout": "LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ROOF", "music": "MUS_POKE_MART", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_TOWN", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": true, "floor_number": 127, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 9, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_Roof_EventScript_CooltrainerM", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_DepartmentStore_Roof_EventScript_ThirstyGirl", "flag": "0" } ], "warp_events": [ { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_CELADON_CITY_DEPARTMENT_STORE_5F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 14, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_Roof_EventScript_FloorSign" }, { "type": "sign", "x": 10, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_Roof_EventScript_VendingMachine" }, { "type": "sign", "x": 11, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_Roof_EventScript_VendingMachine" }, { "type": "sign", "x": 12, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_DepartmentStore_Roof_EventScript_VendingMachine" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_DepartmentStore_Roof/scripts.inc ================================================ CeladonCity_DepartmentStore_Roof_MapScripts:: .byte 0 CeladonCity_DepartmentStore_Roof_EventScript_ThirstyGirl:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer call CeladonCity_DepartmentStore_Roof_EventScript_CheckPlayerHasDrinks goto_if_eq VAR_TEMP_1, 0, CeladonCity_DepartmentStore_Roof_EventScript_IWantDrink goto CeladonCity_DepartmentStore_Roof_EventScript_AskGiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_CheckPlayerHasDrinks:: setvar VAR_TEMP_1, 0 checkitem ITEM_FRESH_WATER call_if_eq VAR_RESULT, TRUE, CeladonCity_DepartmentStore_Roof_EventScript_SetHasFreshWater checkitem ITEM_SODA_POP call_if_eq VAR_RESULT, TRUE, CeladonCity_DepartmentStore_Roof_EventScript_SetHasSodaPop checkitem ITEM_LEMONADE call_if_eq VAR_RESULT, TRUE, CeladonCity_DepartmentStore_Roof_EventScript_SetHasLemonade return CeladonCity_DepartmentStore_Roof_EventScript_SetHasFreshWater:: addvar VAR_TEMP_1, 1 return CeladonCity_DepartmentStore_Roof_EventScript_SetHasSodaPop:: addvar VAR_TEMP_1, 2 return CeladonCity_DepartmentStore_Roof_EventScript_SetHasLemonade:: addvar VAR_TEMP_1, 4 return CeladonCity_DepartmentStore_Roof_EventScript_AskGiveDrink:: msgbox CeladonCity_DepartmentStore_Roof_Text_ImThirstyGiveHerDrink, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink textcolor NPC_TEXT_COLOR_NEUTRAL message CeladonCity_DepartmentStore_Roof_Text_GiveWhichDrink waitmessage textcolor NPC_TEXT_COLOR_FEMALE switch VAR_TEMP_1 case 1, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWater case 2, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveSodaPop case 3, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWaterSodaPop case 4, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveLemonade case 5, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWaterLemonade case 6, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveSodaPopLemonade case 7, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveAllDrinks end CeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWater:: multichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_FRESH_WATER, FALSE switch VAR_RESULT case 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater case 1, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink case 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_AskGiveSodaPop:: multichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_SODA_POP, FALSE switch VAR_RESULT case 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop case 1, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink case 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWaterSodaPop:: multichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP, FALSE switch VAR_RESULT case 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater case 1, CeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop case 2, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink case 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_AskGiveLemonade:: multichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_LEMONADE, FALSE switch VAR_RESULT case 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade case 1, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink case 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWaterLemonade:: multichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_LEMONADE, FALSE switch VAR_RESULT case 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater case 1, CeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade case 2, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink case 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_AskGiveSodaPopLemonade:: multichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_SODA_POP_LEMONADE, FALSE switch VAR_RESULT case 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop case 1, CeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade case 2, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink case 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_AskGiveAllDrinks:: multichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP_LEMONADE, FALSE switch VAR_RESULT case 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater case 1, CeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop case 2, CeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade case 3, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink case 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater:: setvar VAR_0x8008, ITEM_FRESH_WATER setvar VAR_0x8009, ITEM_TM16 goto_if_set FLAG_GOT_TM16_FROM_THIRSTY_GIRL, CeladonCity_DepartmentStore_Roof_EventScript_NotThirstyAfterAll msgbox CeladonCity_DepartmentStore_Roof_Text_YayFreshWaterHaveThis goto CeladonCity_DepartmentStore_Roof_EventScript_GiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop:: setvar VAR_0x8008, ITEM_SODA_POP setvar VAR_0x8009, ITEM_TM20 goto_if_set FLAG_GOT_TM20_FROM_THIRSTY_GIRL, CeladonCity_DepartmentStore_Roof_EventScript_NotThirstyAfterAll msgbox CeladonCity_DepartmentStore_Roof_Text_YaySodaPopHaveThis goto CeladonCity_DepartmentStore_Roof_EventScript_GiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade:: setvar VAR_0x8008, ITEM_LEMONADE setvar VAR_0x8009, ITEM_TM33 goto_if_set FLAG_GOT_TM33_FROM_THIRSTY_GIRL, CeladonCity_DepartmentStore_Roof_EventScript_NotThirstyAfterAll msgbox CeladonCity_DepartmentStore_Roof_Text_YayLemonadeHaveThis goto CeladonCity_DepartmentStore_Roof_EventScript_GiveDrink end CeladonCity_DepartmentStore_Roof_EventScript_GiveDrink:: bufferitemname STR_VAR_1, VAR_0x8008 bufferitemname STR_VAR_2, VAR_0x8009 removeitem VAR_0x8008 checkitemspace VAR_0x8009 goto_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_Roof_EventScript_NoRoomForReward additem VAR_0x8009 textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message Text_ReceivedItemFromLittleGirl waitmessage waitfanfare putitemaway VAR_0x8009 call EventScript_RestorePrevTextColor call_if_eq VAR_0x8008, ITEM_FRESH_WATER, CeladonCity_DepartmentStore_Roof_EventScript_ExplainTM16 call_if_eq VAR_0x8008, ITEM_SODA_POP, CeladonCity_DepartmentStore_Roof_EventScript_ExplainTM20 call_if_eq VAR_0x8008, ITEM_LEMONADE, CeladonCity_DepartmentStore_Roof_EventScript_ExplainTM33 release end CeladonCity_DepartmentStore_Roof_EventScript_ExplainTM16:: setflag FLAG_GOT_TM16_FROM_THIRSTY_GIRL msgbox CeladonCity_DepartmentStore_Roof_Text_ExplainTM16 return CeladonCity_DepartmentStore_Roof_EventScript_ExplainTM20:: setflag FLAG_GOT_TM20_FROM_THIRSTY_GIRL msgbox CeladonCity_DepartmentStore_Roof_Text_ExplainTM20 return CeladonCity_DepartmentStore_Roof_EventScript_ExplainTM33:: setflag FLAG_GOT_TM33_FROM_THIRSTY_GIRL msgbox CeladonCity_DepartmentStore_Roof_Text_ExplainTM33 return CeladonCity_DepartmentStore_Roof_EventScript_NoRoomForReward:: msgbox CeladonCity_DepartmentStore_Roof_Text_DontHaveSpaceForThis release end CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink:: release end CeladonCity_DepartmentStore_Roof_EventScript_IWantDrink:: msgbox CeladonCity_DepartmentStore_Roof_Text_ImThirstyIWantDrink release end CeladonCity_DepartmentStore_Roof_EventScript_NotThirstyAfterAll:: msgbox CeladonCity_DepartmentStore_Roof_Text_ImNotThirstyAfterAll release end CeladonCity_DepartmentStore_Roof_EventScript_CooltrainerM:: msgbox CeladonCity_DepartmentStore_Roof_Text_MySisterIsImmature, MSGBOX_NPC end CeladonCity_DepartmentStore_Roof_EventScript_FloorSign:: msgbox CeladonCity_DepartmentStore_Roof_Text_FloorSign, MSGBOX_SIGN end CeladonCity_DepartmentStore_Roof_EventScript_VendingMachine:: lockall message CeladonCity_DepartmentStore_Roof_Text_VendingMachineWhatDoesItHave waitmessage showmoneybox 0, 0 goto CeladonCity_DepartmentStore_Roof_EventScript_ChooseDrink end CeladonCity_DepartmentStore_Roof_EventScript_ChooseDrink:: multichoice 12, 0, MULTICHOICE_CELADON_VENDING_MACHINE, FALSE copyvar VAR_TEMP_1, VAR_RESULT switch VAR_TEMP_1 case 0, CeladonCity_DepartmentStore_Roof_EventScript_BuyFreshWater case 1, CeladonCity_DepartmentStore_Roof_EventScript_BuySodaPop case 2, CeladonCity_DepartmentStore_Roof_EventScript_BuyLemonade msgbox CeladonCity_DepartmentStore_Roof_Text_NotThirsty goto CeladonCity_DepartmentStore_Roof_EventScript_ExitVendingMachine end CeladonCity_DepartmentStore_Roof_EventScript_BuyFreshWater:: setvar VAR_TEMP_0, ITEM_FRESH_WATER checkmoney 200 goto CeladonCity_DepartmentStore_Roof_EventScript_TryBuyDrink end CeladonCity_DepartmentStore_Roof_EventScript_BuySodaPop:: setvar VAR_TEMP_0, ITEM_SODA_POP checkmoney 300 goto CeladonCity_DepartmentStore_Roof_EventScript_TryBuyDrink end CeladonCity_DepartmentStore_Roof_EventScript_BuyLemonade:: setvar VAR_TEMP_0, ITEM_LEMONADE checkmoney 350 goto CeladonCity_DepartmentStore_Roof_EventScript_TryBuyDrink end CeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneyFreshWater:: removemoney 200 return CeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneySodaPop:: removemoney 300 return CeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneyLemonade:: removemoney 350 return CeladonCity_DepartmentStore_Roof_EventScript_TryBuyDrink:: goto_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_Roof_EventScript_NotEnoughMoney checkitemspace VAR_TEMP_0 goto_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_Roof_EventScript_NoRoomForDrink call_if_eq VAR_TEMP_1, 0, CeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneyFreshWater call_if_eq VAR_TEMP_1, 1, CeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneySodaPop call_if_eq VAR_TEMP_1, 2, CeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneyLemonade updatemoneybox bufferitemname STR_VAR_1, VAR_TEMP_0 playse SE_VEND msgbox CeladonCity_DepartmentStore_Roof_Text_DrinkCanPoppedOut additem VAR_TEMP_0 goto CeladonCity_DepartmentStore_Roof_EventScript_ChooseNewDrink end CeladonCity_DepartmentStore_Roof_EventScript_ChooseNewDrink:: message CeladonCity_DepartmentStore_Roof_Text_VendingMachineWhatDoesItHave waitmessage goto CeladonCity_DepartmentStore_Roof_EventScript_ChooseDrink end CeladonCity_DepartmentStore_Roof_EventScript_NotEnoughMoney:: msgbox CeladonCity_DepartmentStore_Roof_Text_NotEnoughMoney goto CeladonCity_DepartmentStore_Roof_EventScript_ExitVendingMachine end CeladonCity_DepartmentStore_Roof_EventScript_NoRoomForDrink:: msgbox CeladonCity_DepartmentStore_Roof_Text_NoMoreRoomForStuff goto CeladonCity_DepartmentStore_Roof_EventScript_ExitVendingMachine end CeladonCity_DepartmentStore_Roof_EventScript_ExitVendingMachine:: hidemoneybox releaseall end ================================================ FILE: data/maps/CeladonCity_DepartmentStore_Roof/text.inc ================================================ CeladonCity_DepartmentStore_Roof_Text_ImThirstyGiveHerDrink:: .string "I'm thirsty!\n" .string "I want something to drink!\p" .string "{FONT_NORMAL}Give her a drink?$" CeladonCity_DepartmentStore_Roof_Text_GiveWhichDrink:: .string "Give her which drink?$" CeladonCity_DepartmentStore_Roof_Text_YayFreshWaterHaveThis:: .string "Yay!\p" .string "FRESH WATER!\p" .string "Thank you!\n" .string "You can have this from me!$" Text_ReceivedItemFromLittleGirl:: .string "{PLAYER} received a {STR_VAR_2}\n" .string "from the little girl.$" CeladonCity_DepartmentStore_Roof_Text_ExplainTM16:: .string "TM16 contains LIGHT SCREEN.\p" .string "It's a move that weakens the power\n" .string "of special attacks by your foe.$" CeladonCity_DepartmentStore_Roof_Text_YaySodaPopHaveThis:: .string "Yay!\p" .string "SODA POP!\p" .string "Thank you!\n" .string "You can have this from me!$" CeladonCity_DepartmentStore_Roof_Text_ExplainTM20:: .string "TM20 contains SAFEGUARD.\p" .string "It's a move that prevents status\n" .string "problems among your POKéMON.$" CeladonCity_DepartmentStore_Roof_Text_YayLemonadeHaveThis:: .string "Yay!\p" .string "LEMONADE!\p" .string "Thank you!\n" .string "You can have this from me!$" CeladonCity_DepartmentStore_Roof_Text_ExplainTM33:: .string "TM33 contains REFLECT.\p" .string "It's a move that weakens the power\n" .string "of physical attacks by your foe.$" CeladonCity_DepartmentStore_Roof_Text_DontHaveSpaceForThis:: .string "You don't have space for this!$" CeladonCity_DepartmentStore_Roof_Text_ImNotThirstyAfterAll:: .string "No, thank you!\n" .string "I'm not thirsty after all!$" CeladonCity_DepartmentStore_Roof_Text_MySisterIsImmature:: .string "My sister is a TRAINER, believe it\n" .string "or not.\p" .string "But, she's so immature, she drives\n" .string "me nuts!$" CeladonCity_DepartmentStore_Roof_Text_ImThirstyIWantDrink:: .string "I'm thirsty!\n" .string "I want something to drink!$" CeladonCity_DepartmentStore_Roof_Text_FloorSign:: .string "ROOFTOP SQUARE:\n" .string "VENDING MACHINES$" CeladonCity_DepartmentStore_Roof_Text_VendingMachineWhatDoesItHave:: .string "A vending machine!\n" .string "What does it have?$" CeladonCity_DepartmentStore_Roof_Text_NotEnoughMoney:: .string "Oops, not enough money!$" CeladonCity_DepartmentStore_Roof_Text_DrinkCanPoppedOut:: .string "A can of {STR_VAR_1} popped out!$" CeladonCity_DepartmentStore_Roof_Text_NoMoreRoomForStuff:: .string "There's no more room for stuff!$" CeladonCity_DepartmentStore_Roof_Text_NotThirsty:: .string "Not thirsty!$" ================================================ FILE: data/maps/CeladonCity_GameCorner/map.json ================================================ { "id": "MAP_CELADON_CITY_GAME_CORNER", "name": "CeladonCity_GameCorner", "layout": "LAYOUT_CELADON_CITY_GAME_CORNER", "music": "MUS_GAME_CORNER", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_InfoClerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_CoinsClerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 1, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_BaldingMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 1, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_Woman1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 4, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_Fisher", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GYM_GUY", "in_connection": false, "x": 7, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_GymGuy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 7, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_Woman2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 10, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 13, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 16, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 11, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_EventScript_RocketGrunt", "flag": "FLAG_HIDE_GAME_CORNER_ROCKET" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 0, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Porygon", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 9, "y": 13, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "0" }, { "x": 10, "y": 13, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "0" }, { "x": 11, "y": 13, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "0" }, { "x": 15, "y": 2, "elevation": 3, "dest_map": "MAP_ROCKET_HIDEOUT_B1F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 2, "y": 4, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS", "quantity": 10, "underfoot": false }, { "type": "hidden_item", "x": 3, "y": 8, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_2", "quantity": 10, "underfoot": false }, { "type": "hidden_item", "x": 2, "y": 11, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_3", "quantity": 20, "underfoot": false }, { "type": "hidden_item", "x": 6, "y": 12, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_4", "quantity": 10, "underfoot": false }, { "type": "hidden_item", "x": 9, "y": 9, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_5", "quantity": 10, "underfoot": false }, { "type": "hidden_item", "x": 8, "y": 5, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_6", "quantity": 20, "underfoot": false }, { "type": "hidden_item", "x": 10, "y": 4, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_7", "quantity": 10, "underfoot": false }, { "type": "hidden_item", "x": 13, "y": 3, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_8", "quantity": 10, "underfoot": false }, { "type": "hidden_item", "x": 15, "y": 5, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_9", "quantity": 10, "underfoot": false }, { "type": "hidden_item", "x": 17, "y": 5, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_10", "quantity": 40, "underfoot": false }, { "type": "hidden_item", "x": 15, "y": 13, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_11", "quantity": 100, "underfoot": false }, { "type": "hidden_item", "x": 12, "y": 12, "elevation": 3, "item": "ITEM_NONE", "flag": "FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_12", "quantity": 10, "underfoot": false }, { "type": "sign", "x": 0, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine0" }, { "type": "sign", "x": 0, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine1" }, { "type": "sign", "x": 0, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine2" }, { "type": "sign", "x": 5, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine3" }, { "type": "sign", "x": 5, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_UnusableSlotMachine1" }, { "type": "sign", "x": 5, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine5" }, { "type": "sign", "x": 5, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine6" }, { "type": "sign", "x": 6, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine7" }, { "type": "sign", "x": 6, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine8" }, { "type": "sign", "x": 6, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine9" }, { "type": "sign", "x": 11, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine10" }, { "type": "sign", "x": 11, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine11" }, { "type": "sign", "x": 11, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine12" }, { "type": "sign", "x": 11, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine13" }, { "type": "sign", "x": 12, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine14" }, { "type": "sign", "x": 12, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_UnusableSlotMachine2" }, { "type": "sign", "x": 12, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine16" }, { "type": "sign", "x": 12, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_WEST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine17" }, { "type": "sign", "x": 17, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_UnusableSlotMachine3" }, { "type": "sign", "x": 17, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine19" }, { "type": "sign", "x": 17, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine20" }, { "type": "sign", "x": 17, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_SlotMachine21" }, { "type": "sign", "x": 11, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_GameCorner_EventScript_Poster" }, { "type": "sign", "x": 17, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "CeladonCity_GameCorner_EventScript_PhotoPrinter" } ], "level_scaling": "2" } ================================================ FILE: data/maps/CeladonCity_GameCorner/scripts.inc ================================================ .set LOCALID_GRUNT, 11 .set LOCALID_PORYGON_MASTER, 12 .set TRAINER, VAR_0x8009 CeladonCity_GameCorner_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, CeladonCity_GameCorner_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_GameCorner_MapScript_SetMasterTrainerMovementTypes .byte 0 CeladonCity_GameCorner_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PORYGON callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE CeladonCity_GameCorner_MapScript_PorygonMasterMovementType end CeladonCity_GameCorner_MapScript_PorygonMasterMovementType:: setobjectmovementtype LOCALID_PORYGON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_GameCorner_OnLoad:: call_if_unset FLAG_OPENED_ROCKET_HIDEOUT, CeladonCity_GameCorner_EventScript_HideRocketHideout end CeladonCity_GameCorner_EventScript_HideRocketHideout:: setmetatile 15, 2, METATILE_GameCorner_Floor_ShadeFull, 0 setmetatile 16, 2, METATILE_GameCorner_Floor_ShadeFull, 0 setmetatile 17, 2, METATILE_GameCorner_Floor_ShadeFull, 0 setmetatile 16, 3, METATILE_GameCorner_PurpleWall_Floor, 1 setmetatile 17, 3, METATILE_GameCorner_PurpleWall_Floor, 1 return CeladonCity_GameCorner_EventScript_InfoClerk:: msgbox CeladonCity_GameCorner_Text_CanExchangeCoinsNextDoor, MSGBOX_NPC end CeladonCity_GameCorner_EventScript_CoinsClerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer showmoneybox 0, 0 showcoinsbox 0, 5 message CeladonCity_GameCorner_Text_WelcomeBuySomeCoins waitmessage multichoice 13, 0, MULTICHOICE_GAME_CORNER_COIN_PURCHASE_COUNTER, FALSE copyvar VAR_0x8009, VAR_RESULT switch VAR_RESULT case 0, CeladonCity_GameCorner_EventScript_BuyCoins case 1, CeladonCity_GameCorner_EventScript_BuyCoins case 2, CeladonCity_GameCorner_EventScript_BuyCoins case 3, CeladonCity_GameCorner_EventScript_ClerkDeclineBuy case 127, CeladonCity_GameCorner_EventScript_ClerkDeclineBuy end CeladonCity_GameCorner_EventScript_BuyCoins:: goto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_ClerkNoCoinCase goto_if_eq VAR_0x8009, 0, CeladonCity_GameCorner_EventScript_Buy50Coins goto_if_eq VAR_0x8009, 1, CeladonCity_GameCorner_EventScript_Buy500Coins goto_if_eq VAR_0x8009, 2, CeladonCity_GameCorner_EventScript_Buy1000Coins end CeladonCity_GameCorner_EventScript_Buy1000Coins:: checkcoins VAR_TEMP_1 goto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 1000, CeladonCity_GameCorner_EventScript_ClerkNoRoomForCoins checkmoney 20000 goto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_EventScript_ClerkNotEnoughMoney addcoins 1000 removemoney 20000 goto CeladonCity_GameCorner_EventScript_BoughtCoins end CeladonCity_GameCorner_EventScript_Buy500Coins:: checkcoins VAR_TEMP_1 goto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 500, CeladonCity_GameCorner_EventScript_ClerkNoRoomForCoins checkmoney 10000 goto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_EventScript_ClerkNotEnoughMoney addcoins 500 removemoney 10000 goto CeladonCity_GameCorner_EventScript_BoughtCoins end CeladonCity_GameCorner_EventScript_Buy50Coins:: checkcoins VAR_TEMP_1 goto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 50, CeladonCity_GameCorner_EventScript_ClerkNoRoomForCoins checkmoney 1000 goto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_EventScript_ClerkNotEnoughMoney addcoins 50 removemoney 1000 goto CeladonCity_GameCorner_EventScript_BoughtCoins end CeladonCity_GameCorner_EventScript_BoughtCoins:: updatemoneybox updatecoinsbox 0, 5 playse SE_SHOP msgbox CeladonCity_GameCorner_Text_HereAreYourCoins goto CeladonCity_GameCorner_EventScript_ClerkEnd end CeladonCity_GameCorner_EventScript_ClerkEnd:: hidemoneybox hidecoinsbox 0, 5 release end CeladonCity_GameCorner_EventScript_ClerkDeclineBuy:: msgbox CeladonCity_GameCorner_Text_ComePlaySometime goto CeladonCity_GameCorner_EventScript_ClerkEnd end CeladonCity_GameCorner_EventScript_ClerkNoCoinCase:: msgbox CeladonCity_GameCorner_Text_SorryDontHaveCoinCase goto CeladonCity_GameCorner_EventScript_ClerkEnd end CeladonCity_GameCorner_EventScript_ClerkNoRoomForCoins:: msgbox CeladonCity_GameCorner_Text_CoinCaseIsFull goto CeladonCity_GameCorner_EventScript_ClerkEnd end CeladonCity_GameCorner_EventScript_ClerkNotEnoughMoney:: msgbox CeladonCity_GameCorner_Text_CantAffordCoins goto CeladonCity_GameCorner_EventScript_ClerkEnd end CeladonCity_GameCorner_EventScript_BaldingMan:: lock faceplayer msgbox CeladonCity_GameCorner_Text_RumoredTeamRocketRunsThisPlace goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_FaceSlotMachine:: closemessage applymovement VAR_LAST_TALKED, Common_Movement_FaceOriginalDirection waitmovement 0 release end CeladonCity_GameCorner_EventScript_Woman1:: lock faceplayer msgbox CeladonCity_GameCorner_Text_ThinkMachinesHaveDifferentOdds goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_Fisher:: lock faceplayer goto_if_set FLAG_GOT_10_COINS_FROM_GAMBLER, CeladonCity_GameCorner_EventScript_FisherAlreadyGotCoins msgbox CeladonCity_GameCorner_Text_DoYouWantToPlay goto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_GamblerNoCoinCase checkcoins VAR_TEMP_1 goto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 10, CeladonCity_GameCorner_EventScript_FisherNoRoomForCoins addcoins 10 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox CeladonCity_GameCorner_Text_Received10CoinsFromMan playse SE_SHOP waitse setflag FLAG_GOT_10_COINS_FROM_GAMBLER goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_FisherNoRoomForCoins:: msgbox CeladonCity_GameCorner_Text_DontNeedMyCoins goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_GamblerNoCoinCase:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox CeladonCity_GameCorner_Text_DontHaveCoinCase goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_FisherAlreadyGotCoins:: msgbox CeladonCity_GameCorner_Text_WinsComeAndGo goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_GymGuy:: lock faceplayer goto_if_set FLAG_DEFEATED_ERIKA, CeladonCity_GameCorner_EventScript_GymGuyPostVictory msgbox CeladonCity_GameCorner_Text_GymGuyAdvice goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_GymGuyPostVictory:: msgbox CeladonCity_GameCorner_Text_RareMonsForCoins goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_Woman2:: lock faceplayer msgbox CeladonCity_GameCorner_Text_WinOrLoseItsOnlyLuck goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_OldMan:: lock faceplayer msgbox CeladonCity_GameCorner_Text_SoEasyToGetHooked goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_Scientist:: lock faceplayer goto_if_set FLAG_GOT_20_COINS_FROM_GAMBLER, CeladonCity_GameCorner_EventScript_ScientistAlreadyGotCoins msgbox CeladonCity_GameCorner_Text_WantSomeCoins goto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_GamblerNoCoinCase checkcoins VAR_TEMP_1 goto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 20, CeladonCity_GameCorner_EventScript_ScientistNoRoomForCoins addcoins 20 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox CeladonCity_GameCorner_Text_Received20CoinsFromNiceGuy playse SE_SHOP waitse setflag FLAG_GOT_20_COINS_FROM_GAMBLER goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_ScientistNoRoomForCoins:: msgbox CeladonCity_GameCorner_Text_YouHaveLotsOfCoins goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_ScientistAlreadyGotCoins:: msgbox CeladonCity_GameCorner_Text_NeedMoreCoinsForMonIWant goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_Gentleman:: lock faceplayer goto_if_set FLAG_GOT_20_COINS_FROM_GAMBLER_2, CeladonCity_GameCorner_EventScript_GentlemanAlreadyGotCoins msgbox CeladonCity_GameCorner_Text_HereAreSomeCoinsShoo goto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_GamblerNoCoinCase checkcoins VAR_TEMP_1 goto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 20, CeladonCity_GameCorner_EventScript_GentlemanNoRoomForCoins addcoins 20 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox CeladonCity_GameCorner_Text_Received20CoinsFromMan playse SE_SHOP waitse setflag FLAG_GOT_20_COINS_FROM_GAMBLER_2 goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_GentlemanNoRoomForCoins:: msgbox CeladonCity_GameCorner_Text_YouveGotPlentyCoins goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_GentlemanAlreadyGotCoins:: msgbox CeladonCity_GameCorner_Text_WatchReelsClosely goto CeladonCity_GameCorner_EventScript_FaceSlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine0:: lockall setvar VAR_0x8004, 0 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_DontPlaySlotMachine:: releaseall end CeladonCity_GameCorner_EventScript_SlotMachine:: goto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_SlotMachineNoCoinCase msgbox CeladonCity_GameCorner_Text_SlotMachineWantToPlay, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_EventScript_DontPlaySlotMachine setfieldeffectargument 0, OBJ_EVENT_ID_PLAYER .ifdef BUGFIX setfieldeffectargument 1, MAP_NUM(CELADON_CITY_GAME_CORNER) setfieldeffectargument 2, MAP_GROUP(CELADON_CITY_GAME_CORNER) .else @ Map num/group were provided in the wrong order setfieldeffectargument 1, MAP_GROUP(CELADON_CITY_GAME_CORNER) setfieldeffectargument 2, MAP_NUM(CELADON_CITY_GAME_CORNER) .endif dofieldeffect FLDEFF_SMILEY_FACE_ICON waitfieldeffect FLDEFF_SMILEY_FACE_ICON specialvar VAR_RESULT, GetRandomSlotMachineId playslotmachine VAR_RESULT releaseall end CeladonCity_GameCorner_EventScript_SlotMachine1:: lockall setvar VAR_0x8004, 1 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine2:: lockall setvar VAR_0x8004, 2 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine3:: lockall setvar VAR_0x8004, 3 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine4:: lockall setvar VAR_0x8004, 4 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine5:: lockall setvar VAR_0x8004, 5 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine6:: lockall setvar VAR_0x8004, 6 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine7:: lockall setvar VAR_0x8004, 7 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine8:: lockall setvar VAR_0x8004, 8 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine9:: lockall setvar VAR_0x8004, 9 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine10:: lockall setvar VAR_0x8004, 10 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine11:: lockall setvar VAR_0x8004, 11 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine12:: lockall setvar VAR_0x8004, 12 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine13:: lockall setvar VAR_0x8004, 13 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine14:: lockall setvar VAR_0x8004, 14 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine15:: lockall setvar VAR_0x8004, 15 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine16:: lockall setvar VAR_0x8004, 16 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine17:: lockall setvar VAR_0x8004, 17 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine18:: lockall setvar VAR_0x8004, 18 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine19:: lockall setvar VAR_0x8004, 19 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine20:: lockall setvar VAR_0x8004, 20 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachine21:: lockall setvar VAR_0x8004, 21 goto CeladonCity_GameCorner_EventScript_SlotMachine end CeladonCity_GameCorner_EventScript_SlotMachineNoCoinCase:: msgbox CeladonCity_GameCorner_Text_CoinCaseIsRequired releaseall end CeladonCity_GameCorner_EventScript_Poster:: lockall msgbox CeladonCity_GameCorner_Text_SwitchBehindPosterPushIt call_if_unset FLAG_OPENED_ROCKET_HIDEOUT, CeladonCity_GameCorner_EventScript_OpenRocketHideout releaseall end CeladonCity_GameCorner_EventScript_OpenRocketHideout:: playse SE_UNLOCK setmetatile 15, 2, METATILE_GameCorner_Floor_StairsTop, 0 setmetatile 16, 2, METATILE_GameCorner_StairsTop, 1 setmetatile 17, 2, METATILE_GameCorner_StairsBottom, 1 setmetatile 16, 3, METATILE_GameCorner_PurpleWall_StairsTop, 1 setmetatile 17, 3, METATILE_GameCorner_PurpleWall_stairsBottom, 1 special DrawWholeMapView setflag FLAG_OPENED_ROCKET_HIDEOUT return CeladonCity_GameCorner_EventScript_RocketGrunt:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_7, CeladonCity_GameCorner_Text_GruntIntro, CeladonCity_GameCorner_Text_GruntDefeat, CeladonCity_GameCorner_Text_DefeatedGrunt msgbox CeladonCity_GameCorner_Text_GruntPostBattle, MSGBOX_AUTOCLOSE end CeladonCity_GameCorner_Text_DefeatedGrunt:: msgbox CeladonCity_GameCorner_Text_GruntPostBattle closemessage call_if_eq VAR_FACING, DIR_WEST, CeladonCity_GameCorner_Text_GruntExitWest call_if_ne VAR_FACING, DIR_WEST, CeladonCity_GameCorner_Text_GruntExit removeobject LOCALID_GRUNT release end CeladonCity_GameCorner_Text_GruntExitWest:: applymovement LOCALID_GRUNT, CeladonCity_GameCorner_Movement_GruntExitWest waitmovement 0 return CeladonCity_GameCorner_Text_GruntExit:: applymovement LOCALID_GRUNT, CeladonCity_GameCorner_Movement_GruntExit waitmovement 0 return CeladonCity_GameCorner_Movement_GruntExitWest:: walk_down walk_right walk_right walk_up walk_right walk_right walk_right walk_right step_end CeladonCity_GameCorner_Movement_GruntExit:: walk_right walk_right walk_right walk_right walk_right walk_right step_end CeladonCity_GameCorner_EventScript_UnusableSlotMachine1:: msgbox CeladonCity_GameCorner_Text_OutOfOrder, MSGBOX_SIGN end CeladonCity_GameCorner_EventScript_UnusableSlotMachine2:: msgbox CeladonCity_GameCorner_Text_OutToLunch, MSGBOX_SIGN end CeladonCity_GameCorner_EventScript_UnusableSlotMachine3:: msgbox CeladonCity_GameCorner_Text_SomeonesKeys, MSGBOX_SIGN end ================================================ FILE: data/maps/CeladonCity_GameCorner/text.inc ================================================ CeladonCity_GameCorner_Text_CanExchangeCoinsNextDoor:: .string "Welcome!\p" .string "You can exchange your COINS for\n" .string "fabulous prizes next door.$" CeladonCity_GameCorner_Text_WelcomeBuySomeCoins:: .string "Welcome to ROCKET GAME CORNER!\p" .string "Do you need some game COINS?\n" .string "Would you like to buy some?$" CeladonCity_GameCorner_Text_ComePlaySometime:: .string "No?\n" .string "Please come play sometime!$" CeladonCity_GameCorner_Text_SorryDontHaveCoinCase:: .string "Oh, I'm sorry.\n" .string "You don't have a COIN CASE.$" CeladonCity_GameCorner_Text_CoinCaseIsFull:: .string "Whoops!\n" .string "Your COIN CASE is full.$" CeladonCity_GameCorner_Text_CantAffordCoins:: .string "You can't afford the COINS.$" CeladonCity_GameCorner_Text_HereAreYourCoins:: .string "Thank you.\n" .string "Here are your COINS!$" CeladonCity_GameCorner_Text_RumoredTeamRocketRunsThisPlace:: .string "Keep this quiet.\p" .string "It's rumored that this place is run\n" .string "by TEAM ROCKET.$" CeladonCity_GameCorner_Text_ThinkMachinesHaveDifferentOdds:: .string "I think these machines have\n" .string "different odds.$" CeladonCity_GameCorner_Text_DoYouWantToPlay:: .string "Kid, do you want to play?$" CeladonCity_GameCorner_Text_Received10CoinsFromMan:: .string "{PLAYER} received 10 COINS\n" .string "from the man.$" CeladonCity_GameCorner_Text_DontNeedMyCoins:: .string "You don't need my COINS!$" CeladonCity_GameCorner_Text_WinsComeAndGo:: .string "Wins seem to come and go.\n" .string "Nothing's a sure thing.$" CeladonCity_GameCorner_Text_WinOrLoseItsOnlyLuck:: .string "These slot games…\n" .string "Win or lose, it's only by luck.$" CeladonCity_GameCorner_Text_GymGuyAdvice:: .string "Hey!\p" .string "You have better things to do,\n" .string "champ in the making!\p" .string "CELADON GYM's LEADER is ERIKA.\p" .string "She is a user of GRASS-type\n" .string "POKéMON, and at one with nature.\p" .string "She might appear docile because of\n" .string "her flower arranging…\p" .string "But she's not one to be taken\n" .string "lightly!$" CeladonCity_GameCorner_Text_RareMonsForCoins:: .string "They offer rare POKéMON that can\n" .string "be exchanged for your COINS.\p" .string "But, I just can't seem to win!$" CeladonCity_GameCorner_Text_SoEasyToGetHooked:: .string "Games are scary!\n" .string "It's so easy to get hooked!$" CeladonCity_GameCorner_Text_WantSomeCoins:: .string "What's up?\n" .string "Want some COINS?$" CeladonCity_GameCorner_Text_Received20CoinsFromNiceGuy:: .string "{PLAYER} received 20 COINS\n" .string "from the nice guy.$" CeladonCity_GameCorner_Text_YouHaveLotsOfCoins:: .string "You have lots of COINS!$" CeladonCity_GameCorner_Text_NeedMoreCoinsForMonIWant:: .string "Darn! I need more COINS for the\n" .string "POKéMON I want!$" CeladonCity_GameCorner_Text_HereAreSomeCoinsShoo:: .string "Hey, what? You're throwing me off!\n" .string "Here are some COINS, so shoo!$" CeladonCity_GameCorner_Text_Received20CoinsFromMan:: .string "{PLAYER} received 20 COINS\n" .string "from the man.$" CeladonCity_GameCorner_Text_YouveGotPlentyCoins:: .string "You've got plenty of your own\n" .string "COINS!$" CeladonCity_GameCorner_Text_WatchReelsClosely:: .string "The trick is to watch the reels\n" .string "closely.$" CeladonCity_GameCorner_Text_GruntIntro:: .string "I'm guarding this poster!\n" .string "Go away, or else!$" CeladonCity_GameCorner_Text_GruntDefeat:: .string "Dang!$" CeladonCity_GameCorner_Text_GruntPostBattle:: .string "The TEAM ROCKET HIDEOUT might\n" .string "be discovered!\p" .string "I better tell BOSS!$" CeladonCity_GameCorner_Text_SwitchBehindPosterPushIt:: .string "Hey!\p" .string "A switch behind the poster!?\n" .string "Let's push it!$" CeladonCity_GameCorner_Text_CoinCaseIsRequired:: .string "A COIN CASE is required…$" CeladonCity_GameCorner_Text_DontHaveCoinCase:: .string "Oops!\n" .string "Don't have the COIN CASE!$" CeladonCity_GameCorner_Text_SlotMachineWantToPlay:: .string "A slot machine!\n" .string "Want to play?$" CeladonCity_GameCorner_Text_OutOfOrder:: .string "OUT OF ORDER\n" .string "This is broken.$" CeladonCity_GameCorner_Text_OutToLunch:: .string "OUT TO LUNCH\n" .string "This is reserved.$" CeladonCity_GameCorner_Text_SomeonesKeys:: .string "Someone's keys!\n" .string "They'll be back.$" ================================================ FILE: data/maps/CeladonCity_GameCorner_PrizeRoom/map.json ================================================ { "id": "MAP_CELADON_CITY_GAME_CORNER_PRIZE_ROOM", "name": "CeladonCity_GameCorner_PrizeRoom", "layout": "LAYOUT_CELADON_CITY_GAME_CORNER_PRIZE_ROOM", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 2, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_PrizeRoom_EventScript_BaldingMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "x": 6, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_PrizeRoom_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkMons", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkTMs", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkItems", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 9, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "5" }, { "x": 4, "y": 8, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "5" }, { "x": 5, "y": 9, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "5" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_GameCorner_PrizeRoom/scripts.inc ================================================ CeladonCity_GameCorner_PrizeRoom_MapScripts:: .byte 0 CeladonCity_GameCorner_PrizeRoom_EventScript_BaldingMan:: msgbox CeladonCity_GameCorner_PrizeRoom_Text_FancyThatPorygon, MSGBOX_NPC end CeladonCity_GameCorner_PrizeRoom_EventScript_OldMan:: msgbox CeladonCity_GameCorner_PrizeRoom_Text_RakedItInToday, MSGBOX_NPC end CeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkMons:: lock faceplayer goto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_PrizeRoom_EventScript_NeedCoinCase goto_if_questlog EventScript_ReleaseEnd showcoinsbox 0, 0 msgbox CeladonCity_GameCorner_PrizeRoom_Text_WeExchangeCoinsForPrizes callnative IsVersionFireRedToVarResult compare VAR_RESULT, TRUE goto_if_ne CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeMon_LG goto CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeMon_FR end CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeMon_FR:: message CeladonCity_GameCorner_PrizeRoom_Text_WhichPrize waitmessage multichoice 11, 0, MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_FR, FALSE switch VAR_RESULT case 0, CeladonCity_GameCorner_PrizeRoom_EventScript_Abra_FR case 1, CeladonCity_GameCorner_PrizeRoom_EventScript_Clefairy_FR case 2, CeladonCity_GameCorner_PrizeRoom_EventScript_DratiniPinsir_FR case 3, CeladonCity_GameCorner_PrizeRoom_EventScript_ScytherDratini_FR case 4, CeladonCity_GameCorner_PrizeRoom_EventScript_Porygon_FR case 5, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange case 127, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange end CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeMon_LG:: message CeladonCity_GameCorner_PrizeRoom_Text_WhichPrize waitmessage multichoice 11, 0, MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_LG, FALSE switch VAR_RESULT case 0, CeladonCity_GameCorner_PrizeRoom_EventScript_Abra_LG case 1, CeladonCity_GameCorner_PrizeRoom_EventScript_Clefairy_LG case 2, CeladonCity_GameCorner_PrizeRoom_EventScript_DratiniPinsir_LG case 3, CeladonCity_GameCorner_PrizeRoom_EventScript_ScytherDratini_LG case 4, CeladonCity_GameCorner_PrizeRoom_EventScript_Porygon_LG case 5, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange case 127, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange end CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange:: hidecoinsbox 0, 0 release end CeladonCity_GameCorner_PrizeRoom_EventScript_Abra_FR:: setvar VAR_TEMP_1, SPECIES_ABRA setvar VAR_TEMP_2, 180 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR end CeladonCity_GameCorner_PrizeRoom_EventScript_Abra_LG:: setvar VAR_TEMP_1, SPECIES_ABRA setvar VAR_TEMP_2, 120 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG end CeladonCity_GameCorner_PrizeRoom_EventScript_Clefairy_FR:: setvar VAR_TEMP_1, SPECIES_CLEFAIRY setvar VAR_TEMP_2, 500 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR end CeladonCity_GameCorner_PrizeRoom_EventScript_Clefairy_LG:: setvar VAR_TEMP_1, SPECIES_CLEFAIRY setvar VAR_TEMP_2, 750 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG end CeladonCity_GameCorner_PrizeRoom_EventScript_DratiniPinsir_FR:: setvar VAR_TEMP_1, SPECIES_DRATINI setvar VAR_TEMP_2, 2800 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR end CeladonCity_GameCorner_PrizeRoom_EventScript_DratiniPinsir_LG:: setvar VAR_TEMP_1, SPECIES_PINSIR setvar VAR_TEMP_2, 2500 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG end CeladonCity_GameCorner_PrizeRoom_EventScript_ScytherDratini_FR:: setvar VAR_TEMP_1, SPECIES_SCYTHER setvar VAR_TEMP_2, 5500 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR end CeladonCity_GameCorner_PrizeRoom_EventScript_ScytherDratini_LG:: setvar VAR_TEMP_1, SPECIES_DRATINI setvar VAR_TEMP_2, 4600 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG end CeladonCity_GameCorner_PrizeRoom_EventScript_Porygon_FR:: setvar VAR_TEMP_1, SPECIES_PORYGON setvar VAR_TEMP_2, 9999 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR end CeladonCity_GameCorner_PrizeRoom_EventScript_Porygon_LG:: setvar VAR_TEMP_1, SPECIES_PORYGON setvar VAR_TEMP_2, 6500 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG end CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR:: bufferspeciesname STR_VAR_1, VAR_TEMP_1 msgbox CeladonCity_GameCorner_PrizeRoom_Text_YouWantPrize, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange checkcoins VAR_RESULT goto_if_lt VAR_RESULT, VAR_TEMP_2, CeladonCity_GameCorner_PrizeRoom_EventScript_NotEnoughCoins textcolor NPC_TEXT_COLOR_NEUTRAL switch VAR_TEMP_1 case SPECIES_ABRA, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveAbra_FR case SPECIES_CLEFAIRY, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveClefairy_FR case SPECIES_DRATINI, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveDratini_FR case SPECIES_SCYTHER, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveScyther_FR case SPECIES_PORYGON, CeladonCity_GameCorner_PrizeRoom_EventScript_GivePorygon_FR case SPECIES_PINSIR, CeladonCity_GameCorner_PrizeRoom_EventScript_GivePinsir_FR end CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG:: bufferspeciesname STR_VAR_1, VAR_TEMP_1 msgbox CeladonCity_GameCorner_PrizeRoom_Text_YouWantPrize, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange checkcoins VAR_RESULT goto_if_lt VAR_RESULT, VAR_TEMP_2, CeladonCity_GameCorner_PrizeRoom_EventScript_NotEnoughCoins textcolor NPC_TEXT_COLOR_NEUTRAL switch VAR_TEMP_1 case SPECIES_ABRA, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveAbra_LG case SPECIES_CLEFAIRY, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveClefairy_LG case SPECIES_DRATINI, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveDratini_LG case SPECIES_SCYTHER, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveScyther_LG case SPECIES_PORYGON, CeladonCity_GameCorner_PrizeRoom_EventScript_GivePorygon_LG case SPECIES_PINSIR, CeladonCity_GameCorner_PrizeRoom_EventScript_GivePinsir_LG end CeladonCity_GameCorner_PrizeRoom_EventScript_GiveAbra_FR:: givemon VAR_TEMP_1, 9, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GiveAbra_LG:: givemon VAR_TEMP_1, 7, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GiveClefairy_FR:: givemon VAR_TEMP_1, 8, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GiveClefairy_LG:: givemon VAR_TEMP_1, 12, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GiveDratini_FR:: givemon VAR_TEMP_1, 18, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GiveDratini_LG:: givemon VAR_TEMP_1, 24, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GiveScyther_FR:: givemon VAR_TEMP_1, 25, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GiveScyther_LG:: givemon VAR_TEMP_1, 25, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GivePorygon_FR:: givemon VAR_TEMP_1, 26, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GivePorygon_LG:: givemon VAR_TEMP_1, 18, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GivePinsir_FR:: givemon VAR_TEMP_1, 18, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_GivePinsir_LG:: givemon VAR_TEMP_1, 18, ITEM_NONE goto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon end CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon:: goto_if_eq VAR_RESULT, 0, CeladonCity_GameCorner_PrizeRoom_EventScript_ReceivedMonParty goto_if_eq VAR_RESULT, 1, CeladonCity_GameCorner_PrizeRoom_EventScript_ReceivedMonPC goto_if_eq VAR_RESULT, 2, CeladonCity_GameCorner_PrizeRoom_EventScript_PartyFull end CeladonCity_GameCorner_PrizeRoom_EventScript_PartyFull:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox Text_NoMoreRoomForPokemon hidecoinsbox 0, 0 release end CeladonCity_GameCorner_PrizeRoom_EventScript_NicknamePartyMon:: getpartysize subvar VAR_RESULT, 1 copyvar VAR_0x8004, VAR_RESULT call EventScript_ChangePokemonNickname goto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange end CeladonCity_GameCorner_PrizeRoom_EventScript_NeedCoinCase:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox CeladonCity_GameCorner_PrizeRoom_Text_CoinCaseRequired release end CeladonCity_GameCorner_PrizeRoom_EventScript_NotEnoughCoins:: msgbox CeladonCity_GameCorner_PrizeRoom_Text_NeedMoreCoins goto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange end CeladonCity_GameCorner_PrizeRoom_EventScript_ReceivedMonParty:: removecoins VAR_TEMP_2 updatecoinsbox 0, 5 bufferspeciesname STR_VAR_1, VAR_TEMP_1 playfanfare MUS_LEVEL_UP message Text_PlayerObtainedTheMon waitmessage waitfanfare callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, CeladonCity_Condominiums_RoofRoom_EventScript_NicknamePrizeParty msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO CeladonCity_Condominiums_RoofRoom_EventScript_NicknamePrizeParty:: goto_if_eq VAR_RESULT, YES, CeladonCity_GameCorner_PrizeRoom_EventScript_NicknamePartyMon goto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange end CeladonCity_GameCorner_PrizeRoom_EventScript_ReceivedMonPC:: removecoins VAR_TEMP_2 updatecoinsbox 0, 5 bufferspeciesname STR_VAR_1, VAR_TEMP_1 playfanfare MUS_LEVEL_UP message Text_PlayerObtainedTheMon waitmessage waitfanfare callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, CeladonCity_GameCorner_PrizeRoom_EventScript_NicknamePrizePC msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_TransferredToPC CeladonCity_GameCorner_PrizeRoom_EventScript_NicknamePrizePC:: call EventScript_NameReceivedBoxMon goto CeladonCity_GameCorner_PrizeRoom_EventScript_TransferredToPC end CeladonCity_GameCorner_PrizeRoom_EventScript_TransferredToPC:: call EventScript_TransferredToPC goto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange end CeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkTMs:: lock faceplayer goto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_PrizeRoom_EventScript_NeedCoinCase goto_if_questlog EventScript_ReleaseEnd showcoinsbox 0, 0 msgbox CeladonCity_GameCorner_PrizeRoom_Text_WeExchangeCoinsForPrizes goto CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeTM end CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeTM:: message CeladonCity_GameCorner_PrizeRoom_Text_WhichPrize waitmessage multichoice 11, 0, MULTICHOICE_GAME_CORNER_TMPRIZES, FALSE switch VAR_RESULT case 0, CeladonCity_GameCorner_PrizeRoom_EventScript_TM13 case 1, CeladonCity_GameCorner_PrizeRoom_EventScript_TM23 case 2, CeladonCity_GameCorner_PrizeRoom_EventScript_TM24 case 3, CeladonCity_GameCorner_PrizeRoom_EventScript_TM30 case 4, CeladonCity_GameCorner_PrizeRoom_EventScript_TM35 case 5, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange case 127, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange end CeladonCity_GameCorner_PrizeRoom_EventScript_TM13:: setvar VAR_TEMP_1, ITEM_TM13 setvar VAR_TEMP_2, 4000 buffermovename STR_VAR_2, MOVE_ICE_BEAM goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM end CeladonCity_GameCorner_PrizeRoom_EventScript_TM23:: setvar VAR_TEMP_1, ITEM_TM23 setvar VAR_TEMP_2, 3500 buffermovename STR_VAR_2, MOVE_IRON_TAIL goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM end CeladonCity_GameCorner_PrizeRoom_EventScript_TM24:: setvar VAR_TEMP_1, ITEM_TM24 setvar VAR_TEMP_2, 4000 buffermovename STR_VAR_2, MOVE_THUNDERBOLT goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM end CeladonCity_GameCorner_PrizeRoom_EventScript_TM30:: setvar VAR_TEMP_1, ITEM_TM30 setvar VAR_TEMP_2, 4500 buffermovename STR_VAR_2, MOVE_SHADOW_BALL goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM end CeladonCity_GameCorner_PrizeRoom_EventScript_TM35:: setvar VAR_TEMP_1, ITEM_TM35 setvar VAR_TEMP_2, 4000 buffermovename STR_VAR_2, MOVE_FLAMETHROWER goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM end CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM:: checkitem VAR_TEMP_1, 1 goto_if_eq VAR_RESULT, TRUE, CeladonCity_GameCorner_PrizeRoom_EventScript_AlreadyHaveTM msgbox CeladonCity_GameCorner_PrizeRoom_Text_YouWantTM, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange goto CeladonCity_GameCorner_PrizeRoom_EventScript_TryGivePrize end CeladonCity_GameCorner_PrizeRoom_EventScript_AlreadyHaveTM:: msgbox CeladonCity_GameCorner_PrizeRoom_Text_YouAlreadyHaveThisTM goto CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeTM end CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem:: bufferitemname STR_VAR_1, VAR_TEMP_1 msgbox CeladonCity_GameCorner_PrizeRoom_Text_YouWantPrize, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange goto CeladonCity_GameCorner_PrizeRoom_EventScript_TryGivePrize end CeladonCity_GameCorner_PrizeRoom_EventScript_TryGivePrize:: bufferitemname STR_VAR_1, VAR_TEMP_1 checkcoins VAR_RESULT goto_if_lt VAR_RESULT, VAR_TEMP_2, CeladonCity_GameCorner_PrizeRoom_EventScript_NotEnoughCoins checkitemspace VAR_TEMP_1 goto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_PrizeRoom_EventScript_BagFull removecoins VAR_TEMP_2 updatecoinsbox 0, 5 giveitem VAR_TEMP_1 goto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange end CeladonCity_GameCorner_PrizeRoom_EventScript_BagFull:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox Text_TooBadBagFull hidecoinsbox 0, 0 release end CeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkItems:: lock faceplayer goto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_PrizeRoom_EventScript_NeedCoinCase goto_if_questlog EventScript_ReleaseEnd showcoinsbox 0, 0 msgbox CeladonCity_GameCorner_PrizeRoom_Text_WeExchangeCoinsForPrizes goto CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeItem end CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeItem:: message CeladonCity_GameCorner_PrizeRoom_Text_WhichPrize waitmessage multichoice 10, 0, MULTICHOICE_GAME_CORNER_BATTLE_ITEM_PRIZES, FALSE switch VAR_RESULT case 0, CeladonCity_GameCorner_PrizeRoom_EventScript_SmokeBall case 1, CeladonCity_GameCorner_PrizeRoom_EventScript_MiracleSeed case 2, CeladonCity_GameCorner_PrizeRoom_EventScript_Charcoal case 3, CeladonCity_GameCorner_PrizeRoom_EventScript_MysticWater case 4, CeladonCity_GameCorner_PrizeRoom_EventScript_YellowFlute case 5, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange case 127, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange end CeladonCity_GameCorner_PrizeRoom_EventScript_SmokeBall:: setvar VAR_TEMP_1, ITEM_SMOKE_BALL setvar VAR_TEMP_2, 800 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem end CeladonCity_GameCorner_PrizeRoom_EventScript_MiracleSeed:: setvar VAR_TEMP_1, ITEM_MIRACLE_SEED setvar VAR_TEMP_2, 1000 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem end CeladonCity_GameCorner_PrizeRoom_EventScript_Charcoal:: setvar VAR_TEMP_1, ITEM_CHARCOAL setvar VAR_TEMP_2, 1000 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem end CeladonCity_GameCorner_PrizeRoom_EventScript_MysticWater:: setvar VAR_TEMP_1, ITEM_MYSTIC_WATER setvar VAR_TEMP_2, 1000 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem end CeladonCity_GameCorner_PrizeRoom_EventScript_YellowFlute:: setvar VAR_TEMP_1, ITEM_YELLOW_FLUTE setvar VAR_TEMP_2, 1600 goto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem end ================================================ FILE: data/maps/CeladonCity_GameCorner_PrizeRoom/text.inc ================================================ CeladonCity_GameCorner_PrizeRoom_Text_FancyThatPorygon:: .string "I sure do fancy that PORYGON!\n" .string "But, it's hard to win at slots!$" CeladonCity_GameCorner_PrizeRoom_Text_RakedItInToday:: .string "Gahaha! I raked it in today!\n" .string "If only every day were like this…$" CeladonCity_GameCorner_PrizeRoom_Text_CoinCaseRequired:: .string "A COIN CASE is required…$" CeladonCity_GameCorner_PrizeRoom_Text_WeExchangeCoinsForPrizes:: .string "We exchange your COINS for prizes.$" CeladonCity_GameCorner_PrizeRoom_Text_WhichPrize:: .string "Which prize would you like?$" CeladonCity_GameCorner_PrizeRoom_Text_YouWantPrize:: .string "So, you want the {STR_VAR_1}?$" CeladonCity_GameCorner_PrizeRoom_Text_YouWantTM:: .string "Okay, a TM of {STR_VAR_2}\n" .string "is what you want?$" CeladonCity_GameCorner_PrizeRoom_Text_NeedMoreCoins:: .string "Sorry, you'll need more COINS\n" .string "than that.$" CeladonCity_GameCorner_PrizeRoom_Text_YouAlreadyHaveThisTM:: .string "You already have this TM.$" ================================================ FILE: data/maps/CeladonCity_Gym/map.json ================================================ { "id": "MAP_CELADON_CITY_GYM", "name": "CeladonCity_Gym", "layout": "LAYOUT_CELADON_CITY_GYM", "music": "MUS_GYM", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 3, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "CeladonCity_Gym_EventScript_Kay", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 9, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "CeladonCity_Gym_EventScript_Bridget", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 10, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "CeladonCity_Gym_EventScript_Tina", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 2, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "CeladonCity_Gym_EventScript_Tamia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "CeladonCity_Gym_EventScript_Lori", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "CeladonCity_Gym_EventScript_Lisa", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ERIKA", "in_connection": false, "x": 6, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Gym_EventScript_Erika", "flag": "FLAG_TEMP_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 8, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "CeladonCity_Gym_EventScript_Mary", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 6, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_CELADON_GYM_BOTTOM_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_CELADON_GYM_LEFT_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_CELADON_GYM_RIGHT_CUT_TREE" } ], "warp_events": [ { "x": 5, "y": 18, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "6" }, { "x": 6, "y": 18, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "6" }, { "x": 7, "y": 18, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "6" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 8, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeladonCity_Gym_EventScript_GymStatue" } ], "level_scaling": "2" } ================================================ FILE: data/maps/CeladonCity_Gym/scripts.inc ================================================ .equ CHECK_VISITOR_STATE, 6 .equ TYPE, VAR_0x8003 .equ ARGUMENT, VAR_0x8004 CeladonCity_Gym_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_Gym_OnTransition .byte 0 CeladonCity_Gym_OnTransition:: setvar TYPE, CHECK_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_ERIKA callnative UseBattleHouseVar call_if_eq VAR_RESULT, 1, CeladonCity_Gym_EventScript_HideErika end CeladonCity_Gym_EventScript_HideErika:: setflag FLAG_TEMP_1 return CeladonCity_Gym_EventScript_Erika:: famechecker FAMECHECKER_ERIKA, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, CeladonCity_Gym_EventScript_Erika_ChallengeMode trainerbattle_single TRAINER_LEADER_ERIKA, CeladonCity_Gym_Text_ErikaIntro, CeladonCity_Gym_Text_ErikaDefeat, CeladonCity_Gym_EventScript_DefeatedErika, NO_MUSIC settrainerflag TRAINER_LEADER_ERIKA_CHALLENGE goto_if_unset FLAG_GOT_TM19_FROM_ERIKA, CeladonCity_Gym_EventScript_GiveTM19 famechecker FAMECHECKER_ERIKA, 4 msgbox CeladonCity_Gym_Text_ErikaPostBattle release end CeladonCity_Gym_EventScript_Erika_ChallengeMode:: trainerbattle_single TRAINER_LEADER_ERIKA_CHALLENGE, CeladonCity_Gym_Text_ErikaIntro, CeladonCity_Gym_Text_ErikaDefeat, CeladonCity_Gym_EventScript_DefeatedErika, NO_MUSIC settrainerflag TRAINER_LEADER_ERIKA goto_if_unset FLAG_GOT_TM19_FROM_ERIKA, CeladonCity_Gym_EventScript_GiveTM19 famechecker FAMECHECKER_ERIKA, 4 msgbox CeladonCity_Gym_Text_ErikaPostBattle release end CeladonCity_Gym_EventScript_DefeatedErika:: famechecker FAMECHECKER_ERIKA, 1 clearflag FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS setflag FLAG_DEFEATED_ERIKA setflag FLAG_BADGE04_GET set_gym_trainers 4 goto CeladonCity_Gym_EventScript_GiveTM19 end CeladonCity_Gym_EventScript_GiveTM19:: msgbox CeladonCity_Gym_Text_ExplainRainbowBadgeTakeThis checkitemspace ITEM_TM19 goto_if_eq VAR_RESULT, FALSE, CeladonCity_Gym_EventScript_NoRoomForTM19 giveitem_msg CeladonCity_Gym_Text_ReceivedTM19FromErika, ITEM_TM19 setflag FLAG_GOT_TM19_FROM_ERIKA msgbox CeladonCity_Gym_Text_ExplainTM19 release end CeladonCity_Gym_EventScript_NoRoomForTM19:: msgbox CeladonCity_Gym_Text_ShouldMakeRoomForThis release end CeladonCity_Gym_EventScript_Kay:: trainerbattle_single TRAINER_LASS_KAY, CeladonCity_Gym_Text_KayIntro, CeladonCity_Gym_Text_KayDefeat msgbox CeladonCity_Gym_Text_KayPostBattle, MSGBOX_AUTOCLOSE end CeladonCity_Gym_EventScript_Lisa:: trainerbattle_single TRAINER_LASS_LISA, CeladonCity_Gym_Text_LisaIntro, CeladonCity_Gym_Text_LisaDefeat famechecker FAMECHECKER_ERIKA, 2 msgbox CeladonCity_Gym_Text_LisaPostBattle, MSGBOX_AUTOCLOSE end CeladonCity_Gym_EventScript_Tina:: trainerbattle_single TRAINER_PICNICKER_TINA, CeladonCity_Gym_Text_TinaIntro, CeladonCity_Gym_Text_TinaDefeat msgbox CeladonCity_Gym_Text_TinaPostBattle, MSGBOX_AUTOCLOSE end CeladonCity_Gym_EventScript_Bridget:: trainerbattle_single TRAINER_BEAUTY_BRIDGET, CeladonCity_Gym_Text_BridgetIntro, CeladonCity_Gym_Text_BridgetDefeat msgbox CeladonCity_Gym_Text_BridgetPostBattle, MSGBOX_AUTOCLOSE end CeladonCity_Gym_EventScript_Tamia:: trainerbattle_single TRAINER_BEAUTY_TAMIA, CeladonCity_Gym_Text_TamiaIntro, CeladonCity_Gym_Text_TamiaDefeat famechecker FAMECHECKER_ERIKA, 3 msgbox CeladonCity_Gym_Text_TamiaPostBattle, MSGBOX_AUTOCLOSE end CeladonCity_Gym_EventScript_Lori:: trainerbattle_single TRAINER_BEAUTY_LORI, CeladonCity_Gym_Text_LoriIntro, CeladonCity_Gym_Text_LoriDefeat msgbox CeladonCity_Gym_Text_LoriPostBattle, MSGBOX_AUTOCLOSE end CeladonCity_Gym_EventScript_Mary:: trainerbattle_single TRAINER_COOLTRAINER_MARY, CeladonCity_Gym_Text_MaryIntro, CeladonCity_Gym_Text_MaryDefeat msgbox CeladonCity_Gym_Text_MaryPostBattle, MSGBOX_AUTOCLOSE end CeladonCity_Gym_EventScript_GymStatue:: lockall goto_if_set FLAG_BADGE04_GET, CeladonCity_Gym_EventScript_GymStatuePostVictory msgbox CeladonCity_Gym_Text_GymStatue releaseall end CeladonCity_Gym_EventScript_GymStatuePostVictory:: msgbox CeladonCity_Gym_Text_GymStatuePlayerWon releaseall end ================================================ FILE: data/maps/CeladonCity_Gym/text.inc ================================================ CeladonCity_Gym_Text_ErikaIntro:: .string "Hello…\n" .string "Lovely weather, isn't it?\l" .string "It's so pleasant…\p" .string "…Oh, dear…\n" .string "I must have dozed off. Welcome.\p" .string "My name is ERIKA.\n" .string "I am the LEADER of CELADON GYM.\p" .string "I am a student of the art of\n" .string "flower arranging.\p" .string "My POKéMON are solely of the\n" .string "GRASS type.\p" .string "…Oh, I'm sorry, I had no idea that\n" .string "you wished to challenge me.\p" .string "Very well, but I shall not lose.{PLAY_BGM MUS_ENCOUNTER_GYM_LEADER}$" CeladonCity_Gym_Text_ErikaDefeat:: .string "Oh!\n" .string "I concede defeat.\l" .string "You are remarkably strong.\p" .string "I must confer on you the\n" .string "RAINBOWBADGE.$" CeladonCity_Gym_Text_ErikaPostBattle:: .string "You are cataloging POKéMON?\n" .string "I must say I'm impressed.\p" .string "I would never collect POKéMON if\n" .string "they were unattractive.$" CeladonCity_Gym_Text_ExplainRainbowBadgeTakeThis:: .string "The RAINBOWBADGE will make\n" .string "POKéMON up to Lv. 50 obey.\p" .string "It also allows POKéMON to use\n" .string "STRENGTH in and out of battle.\p" .string "Please also take this with you.$" CeladonCity_Gym_Text_ReceivedTM19FromErika:: .string "{PLAYER} received TM19\n" .string "from ERIKA.$" CeladonCity_Gym_Text_ExplainTM19:: .string "TM19 contains GIGA DRAIN.\p" .string "Half the damage it inflicts is\n" .string "drained to heal your POKéMON.\p" .string "Wouldn't you agree that it's a\n" .string "wonderful move?$" CeladonCity_Gym_Text_ShouldMakeRoomForThis:: .string "You should make room for this.$" CeladonCity_Gym_Text_KayIntro:: .string "I should tell you about this GYM.\p" .string "Only real ladies are allowed in\n" .string "here!$" CeladonCity_Gym_Text_KayDefeat:: .string "You're too rough!$" CeladonCity_Gym_Text_KayPostBattle:: .string "Bleaah!\n" .string "I hope ERIKA wipes you out!$" CeladonCity_Gym_Text_BridgetIntro:: .string "Oh, welcome.\n" .string "I was getting bored.$" CeladonCity_Gym_Text_BridgetDefeat:: .string "My makeup!$" CeladonCity_Gym_Text_BridgetPostBattle:: .string "GRASS-type POKéMON are tough\n" .string "against the WATER type.\p" .string "They also have an edge on ROCK-\n" .string "and GROUND-type POKéMON.$" CeladonCity_Gym_Text_TinaIntro:: .string "…Weren't you peeking in here\n" .string "earlier?$" CeladonCity_Gym_Text_TinaDefeat:: .string "You're an eye-opener!$" CeladonCity_Gym_Text_TinaPostBattle:: .string "Oh, you were looking at ERIKA…\n" .string "You weren't looking at me…$" CeladonCity_Gym_Text_TamiaIntro:: .string "Look, look!\n" .string "See my POKéMON!\p" .string "I like the GRASS type.\n" .string "I like how they're easy to raise.$" CeladonCity_Gym_Text_TamiaDefeat:: .string "No!$" CeladonCity_Gym_Text_TamiaPostBattle:: .string "We only use GRASS-type POKéMON at\n" .string "our GYM.\p" .string "Why? We also use them for making\n" .string "flower arrangements!$" CeladonCity_Gym_Text_LisaIntro:: .string "Oh, hey!\p" .string "We don't like BUG- or FIRE-type\n" .string "POKéMON in here!$" CeladonCity_Gym_Text_LisaDefeat:: .string "Oh!\n" .string "You!$" CeladonCity_Gym_Text_LisaPostBattle:: .string "Our LEADER ERIKA might be quiet,\n" .string "but she's famous around here.$" CeladonCity_Gym_Text_LoriIntro:: .string "Pleased to meet you.\n" .string "My hobby is POKéMON training.$" CeladonCity_Gym_Text_LoriDefeat:: .string "Oh!\n" .string "Splendid!$" CeladonCity_Gym_Text_LoriPostBattle:: .string "I have a blind date coming up.\n" .string "I have to learn to be polite,\l" .string "especially if I have to battle.$" CeladonCity_Gym_Text_MaryIntro:: .string "Welcome to CELADON GYM!\p" .string "You'd better not underestimate\n" .string "the nice ladies here.$" CeladonCity_Gym_Text_MaryDefeat:: .string "Oh!\n" .string "Beaten!$" CeladonCity_Gym_Text_MaryPostBattle:: .string "I didn't bring my best POKéMON.\n" .string "Wait until next time!$" CeladonCity_Gym_Text_GymStatue:: .string "CELADON POKéMON GYM\n" .string "LEADER: ERIKA\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}$" CeladonCity_Gym_Text_GymStatuePlayerWon:: .string "CELADON POKéMON GYM\n" .string "LEADER: ERIKA\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}, {PLAYER}$" ================================================ FILE: data/maps/CeladonCity_Hotel/map.json ================================================ { "id": "MAP_CELADON_CITY_HOTEL", "name": "CeladonCity_Hotel", "layout": "LAYOUT_CELADON_CITY_HOTEL", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Hotel_EventScript_Receptionist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 3, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Hotel_EventScript_Beauty", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Hotel_EventScript_BeautyBoyfriend", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 2, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Hotel_EventScript_BeautyBrother", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 10, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Gyarados", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 16, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Arcanine", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 10, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "9" }, { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "9" }, { "x": 5, "y": 10, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "9" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_Hotel/scripts.inc ================================================ .set LOCALID_GYARADOS_MASTER, 5 .set LOCALID_ARCANINE_MASTER, 6 .set TRAINER, VAR_0x8009 CeladonCity_Hotel_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_Hotel_MapScript_SetMasterTrainerMovementTypes .byte 0 CeladonCity_Hotel_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_GYARADOS callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeladonCity_Hotel_MapScript_GyaradosMasterMovementType setvar TRAINER, MASTER_ARCANINE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeladonCity_Hotel_MapScript_ArcanineMasterMovementType end CeladonCity_Hotel_MapScript_GyaradosMasterMovementType:: setobjectmovementtype LOCALID_GYARADOS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_Hotel_MapScript_ArcanineMasterMovementType:: setobjectmovementtype LOCALID_ARCANINE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeladonCity_Hotel_EventScript_Receptionist:: msgbox CeladonCity_Hotel_Text_ThisHotelIsForPeople, MSGBOX_NPC end CeladonCity_Hotel_EventScript_Beauty:: msgbox CeladonCity_Hotel_Text_OnVacationWithBrotherAndBoyfriend, MSGBOX_NPC end CeladonCity_Hotel_EventScript_BeautyBoyfriend:: msgbox CeladonCity_Hotel_Text_WhyDidSheBringBrother, MSGBOX_NPC end CeladonCity_Hotel_EventScript_BeautyBrother:: msgbox CeladonCity_Hotel_Text_SisBroughtMeOnVacation, MSGBOX_NPC end ================================================ FILE: data/maps/CeladonCity_Hotel/text.inc ================================================ CeladonCity_Hotel_Text_ThisHotelIsForPeople:: .string "POKéMON?\n" .string "No, this is a hotel for people.\p" .string "We're full up, unfortunately.$" CeladonCity_Hotel_Text_OnVacationWithBrotherAndBoyfriend:: .string "I'm on vacation with my brother and\n" .string "boyfriend.\p" .string "CELADON is such a pretty city!$" CeladonCity_Hotel_Text_WhyDidSheBringBrother:: .string "Why?\n" .string "Why did she bring her brother?$" CeladonCity_Hotel_Text_SisBroughtMeOnVacation:: .string "Yippee! I'm on vacation!\n" .string "My sis brought me along! Awesome!$" ================================================ FILE: data/maps/CeladonCity_House1/map.json ================================================ { "id": "MAP_CELADON_CITY_HOUSE1", "name": "CeladonCity_House1", "layout": "LAYOUT_HOUSE5", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "x": 5, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_House1_EventScript_RocketChief", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 5, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_House1_EventScript_Rocket1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "x": 8, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 5, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_House1_EventScript_Rocket2", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "8" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "8" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "8" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_House1/scripts.inc ================================================ CeladonCity_House1_MapScripts:: .byte 0 CeladonCity_House1_EventScript_RocketChief:: msgbox CeladonCity_House1_Text_SlotsReelInTheDough, MSGBOX_NPC end CeladonCity_House1_EventScript_Rocket1:: msgbox CeladonCity_House1_Text_ShippedMonsAsSlotPrizes, MSGBOX_NPC end CeladonCity_House1_EventScript_Rocket2:: msgbox CeladonCity_House1_Text_DontTouchGameCornerPoster, MSGBOX_NPC end ================================================ FILE: data/maps/CeladonCity_House1/text.inc ================================================ CeladonCity_House1_Text_SlotsReelInTheDough:: .string "Hehehe!\p" .string "The slots just reel in the dough,\n" .string "big-time!$" CeladonCity_House1_Text_ShippedMonsAsSlotPrizes:: .string "CHIEF!\p" .string "We just shipped two thousand\n" .string "more POKéMON as slot prizes\l" .string "again today!$" CeladonCity_House1_Text_DontTouchGameCornerPoster:: .string "Don't touch the poster at the GAME\n" .string "CORNER!\p" .string "There's no secret switch behind it!$" @ Text for the replaced altars in the rocket chiefs house / celadon mansion @ In English RB, this is westernized as "It's a sculpture of DIGLETT.", and is removed altogether in FRLG Text_ItsABuddhistAltar:: .string "ぶつだん だ‥$" ================================================ FILE: data/maps/CeladonCity_PokemonCenter_1F/map.json ================================================ { "id": "MAP_CELADON_CITY_POKEMON_CENTER_1F", "name": "CeladonCity_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 10, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_PokemonCenter_1F_EventScript_CooltrainerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "4" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "4" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "4" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_CELADON_CITY_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_PokemonCenter_1F/scripts.inc ================================================ CeladonCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad //map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume .byte 0 CeladonCity_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_CELADON_CITY end CeladonCity_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end CeladonCity_PokemonCenter_1F_EventScript_Gentleman:: msgbox CeladonCity_PokemonCenter_1F_Text_PokeFluteAwakensSleepingMons, MSGBOX_NPC end CeladonCity_PokemonCenter_1F_EventScript_CooltrainerF:: msgbox CeladonCity_PokemonCenter_1F_Text_RodeHereFromFuchsia, MSGBOX_NPC end CeladonCity_PokemonCenter_1F_EventScript_Youngster:: msgbox CeladonCity_PokemonCenter_1F_Text_GoToCyclingRoadIfIHadBike, MSGBOX_NPC end ================================================ FILE: data/maps/CeladonCity_PokemonCenter_1F/text.inc ================================================ CeladonCity_PokemonCenter_1F_Text_PokeFluteAwakensSleepingMons:: .string "A POKé FLUTE awakens sleeping\n" .string "POKéMON. You know that.\p" .string "It does so with a sound that only\n" .string "they can hear.$" CeladonCity_PokemonCenter_1F_Text_RodeHereFromFuchsia:: .string "I rode here from FUCHSIA.\p" .string "It's an uphill ride on CYCLING\n" .string "ROAD, so I'm exhausted.$" CeladonCity_PokemonCenter_1F_Text_GoToCyclingRoadIfIHadBike:: .string "If I had a BIKE, I would go to\n" .string "CYCLING ROAD!$" ================================================ FILE: data/maps/CeladonCity_PokemonCenter_2F/map.json ================================================ { "id": "MAP_CELADON_CITY_POKEMON_CENTER_2F", "name": "CeladonCity_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_CELADON_CITY_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_PokemonCenter_2F/scripts.inc ================================================ CeladonCity_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS CeladonCity_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end CeladonCity_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end CeladonCity_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/CeladonCity_Restaurant/map.json ================================================ { "id": "MAP_CELADON_CITY_RESTAURANT", "name": "CeladonCity_Restaurant", "layout": "LAYOUT_CELADON_CITY_RESTAURANT", "music": "MUS_CELADON", "region_map_section": "MAPSEC_CELADON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHEF", "x": 12, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Restaurant_EventScript_Chef", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 11, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Restaurant_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "x": 9, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Restaurant_EventScript_FatMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 1, "y": 2, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Restaurant_EventScript_CoinCaseMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 3, "y": 7, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeladonCity_Restaurant_EventScript_WorkerM", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 9, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "7" }, { "x": 6, "y": 9, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "7" }, { "x": 7, "y": 9, "elevation": 0, "dest_map": "MAP_CELADON_CITY", "dest_warp_id": "7" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CeladonCity_Restaurant/scripts.inc ================================================ CeladonCity_Restaurant_MapScripts:: .byte 0 CeladonCity_Restaurant_EventScript_Chef:: msgbox CeladonCity_Restaurant_Text_TakingBreakRightNow, MSGBOX_NPC end CeladonCity_Restaurant_EventScript_Woman:: msgbox CeladonCity_Restaurant_Text_OftenGoToDrugstore, MSGBOX_NPC end CeladonCity_Restaurant_EventScript_CoinCaseMan:: lock faceplayer goto_if_set FLAG_GOT_COIN_CASE, CeladonCity_Restaurant_EventScript_AlreadyGotCoinCase msgbox CeladonCity_Restaurant_Text_TakeThisImBusted checkitemspace ITEM_COIN_CASE goto_if_eq VAR_RESULT, FALSE, CeladonCity_Restaurant_EventScript_NoRoomForCoinCase giveitem_msg CeladonCity_Restaurant_Text_ReceivedCoinCaseFromMan, ITEM_COIN_CASE setflag FLAG_GOT_COIN_CASE release end CeladonCity_Restaurant_EventScript_NoRoomForCoinCase:: msgbox CeladonCity_Restaurant_Text_MakeRoomForThis release end CeladonCity_Restaurant_EventScript_AlreadyGotCoinCase:: msgbox CeladonCity_Restaurant_Text_ThoughtIdWinItBack release end CeladonCity_Restaurant_EventScript_WorkerM:: msgbox CeladonCity_Restaurant_Text_PsstBasementUnderGameCorner, MSGBOX_NPC end CeladonCity_Restaurant_EventScript_FatMan:: msgbox CeladonCity_Restaurant_Text_ManLostItAllAtSlots, MSGBOX_NPC end ================================================ FILE: data/maps/CeladonCity_Restaurant/text.inc ================================================ CeladonCity_Restaurant_Text_TakingBreakRightNow:: .string "Hi!\p" .string "Sorry, but we're taking a break\n" .string "right now.$" CeladonCity_Restaurant_Text_OftenGoToDrugstore:: .string "My POKéMON are weak, so I often\n" .string "have to go to the DRUGSTORE.$" CeladonCity_Restaurant_Text_PsstBasementUnderGameCorner:: .string "Psst! There's a basement under the\n" .string "GAME CORNER, I hear.$" CeladonCity_Restaurant_Text_ManLostItAllAtSlots:: .string "Munch…\p" .string "The man at that table lost it all\n" .string "at the slots.$" CeladonCity_Restaurant_Text_TakeThisImBusted:: .string "Go ahead! Laugh!\n" .string "I'm flat-out busted!\p" .string "No more slots for me!\n" .string "I'm going straight!\p" .string "Here!\n" .string "I won't be needing this anymore!$" CeladonCity_Restaurant_Text_ReceivedCoinCaseFromMan:: .string "{PLAYER} received a COIN CASE\n" .string "from the man.$" CeladonCity_Restaurant_Text_MakeRoomForThis:: .string "Make room for this!$" CeladonCity_Restaurant_Text_ThoughtIdWinItBack:: .string "I always thought I was going to\n" .string "win it back…$" ================================================ FILE: data/maps/CeruleanCave_1F/map.json ================================================ { "id": "MAP_CERULEAN_CAVE_1F", "name": "CeruleanCave_1F", "layout": "LAYOUT_CERULEAN_CAVE_1F", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_CERULEAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 7, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_1F_EventScript_ItemNugget", "flag": "FLAG_HIDE_CERULEAN_CAVE_1F_NUGGET" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 11, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_1F_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_CERULEAN_CAVE_1F_FULL_RESTORE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 25, "y": 5, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_1F_EventScript_ItemMaxElixir", "flag": "FLAG_HIDE_CERULEAN_CAVE_1F_MAX_ELIXIR" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 7, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 13, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 5, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 14, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 11, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 9, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" } ], "warp_events": [ { "x": 33, "y": 21, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "7" }, { "x": 34, "y": 2, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F", "dest_warp_id": "0" }, { "x": 1, "y": 7, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_B1F", "dest_warp_id": "0" }, { "x": 10, "y": 2, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F", "dest_warp_id": "1" }, { "x": 5, "y": 15, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F", "dest_warp_id": "2" }, { "x": 30, "y": 10, "elevation": 4, "dest_map": "MAP_CERULEAN_CAVE_2F", "dest_warp_id": "3" }, { "x": 24, "y": 11, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F", "dest_warp_id": "4" }, { "x": 2, "y": 4, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 12, "y": 2, "elevation": 3, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_CERULEAN_CAVE_1F_ULTRA_BALL", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCave_1F/scripts.inc ================================================ CeruleanCave_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_1F_OnTransition .byte 0 CeruleanCave_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_CERULEAN_CAVE_1F setescapewarp MAP_CERULEAN_CITY, 255, 1, 13 end ================================================ FILE: data/maps/CeruleanCave_1F_Blue/map.json ================================================ { "id": "MAP_CERULEAN_CAVE_1F_BLUE", "name": "CeruleanCave_1F_Blue", "layout": "LAYOUT_CERULEAN_CAVE_1F_BLUE", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_CERULEAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 14, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_1F_EventScript_ItemNugget", "flag": "FLAG_HIDE_CERULEAN_CAVE_1F_NUGGET" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_1F_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_CERULEAN_CAVE_1F_FULL_RESTORE" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 28, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_1F_EventScript_ItemMaxElixir", "flag": "FLAG_HIDE_CERULEAN_CAVE_1F_MAX_ELIXIR" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 9, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 22, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 7, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 19, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 16, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 8, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" } ], "warp_events": [ { "x": 33, "y": 21, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": 7 }, { "x": 34, "y": 2, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_BLUE", "dest_warp_id": 0 }, { "x": 1, "y": 8, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_B1F_BLUE", "dest_warp_id": 0 }, { "x": 16, "y": 2, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_BLUE", "dest_warp_id": 1 }, { "x": 10, "y": 11, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_BLUE", "dest_warp_id": 2 }, { "x": 32, "y": 9, "elevation": 4, "dest_map": "MAP_CERULEAN_CAVE_2F_BLUE", "dest_warp_id": 3 }, { "x": 27, "y": 12, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_BLUE", "dest_warp_id": 4 }, { "x": 2, "y": 4, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_BLUE", "dest_warp_id": 5 } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 24, "y": 15, "elevation": 3, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_CERULEAN_CAVE_1F_ULTRA_BALL", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCave_1F_Blue/scripts.inc ================================================ CeruleanCave_1F_Blue_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_1F_OnTransition .byte 0 ================================================ FILE: data/maps/CeruleanCave_1F_Blue/text.inc ================================================ ================================================ FILE: data/maps/CeruleanCave_1F_Yellow/map.json ================================================ { "id": "MAP_CERULEAN_CAVE_1F_YELLOW", "name": "CeruleanCave_1F_Yellow", "layout": "LAYOUT_CERULEAN_CAVE_1F_YELLOW", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_CERULEAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 25, "y": 4, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_1F_EventScript_ItemNugget", "flag": "FLAG_HIDE_CERULEAN_CAVE_1F_NUGGET" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 35, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_1F_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_CERULEAN_CAVE_1F_FULL_RESTORE" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 9, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_1F_EventScript_ItemMaxElixir", "flag": "FLAG_HIDE_CERULEAN_CAVE_1F_MAX_ELIXIR" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 38, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 37, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 34, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 38, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 35, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 37, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" } ], "warp_events": [ { "x": 33, "y": 21, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": 7 }, { "x": 34, "y": 2, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_YELLOW", "dest_warp_id": 0 }, { "x": 1, "y": 7, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_B1F_YELLOW", "dest_warp_id": 0 }, { "x": 10, "y": 2, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_YELLOW", "dest_warp_id": 1 }, { "x": 5, "y": 15, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_YELLOW", "dest_warp_id": 2 }, { "x": 30, "y": 8, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_YELLOW", "dest_warp_id": 3 }, { "x": 24, "y": 11, "elevation": 4, "dest_map": "MAP_CERULEAN_CAVE_2F_YELLOW", "dest_warp_id": 4 }, { "x": 2, "y": 4, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_2F_YELLOW", "dest_warp_id": 5 } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 25, "y": 9, "elevation": 3, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_CERULEAN_CAVE_1F_ULTRA_BALL", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCave_1F_Yellow/scripts.inc ================================================ CeruleanCave_1F_Yellow_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_1F_OnTransition .byte 0 ================================================ FILE: data/maps/CeruleanCave_1F_Yellow/text.inc ================================================ ================================================ FILE: data/maps/CeruleanCave_2F/map.json ================================================ { "id": "MAP_CERULEAN_CAVE_2F", "name": "CeruleanCave_2F", "layout": "LAYOUT_CERULEAN_CAVE_2F", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_CERULEAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 9, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_2F_EventScript_ItemPPUp", "flag": "FLAG_HIDE_CERULEAN_CAVE_2F_PP_UP" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 29, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_2F_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_CERULEAN_CAVE_2F_ULTRA_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 33, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_2F_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_CERULEAN_CAVE_2F_FULL_RESTORE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 33, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 33, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 25, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 28, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 30, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 9, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 23, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 13, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_19" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1A" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 10, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1B" } ], "warp_events": [ { "x": 33, "y": 4, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F", "dest_warp_id": "1" }, { "x": 13, "y": 4, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F", "dest_warp_id": "3" }, { "x": 7, "y": 14, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F", "dest_warp_id": "4" }, { "x": 26, "y": 9, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F", "dest_warp_id": "5" }, { "x": 23, "y": 10, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F", "dest_warp_id": "6" }, { "x": 5, "y": 6, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F", "dest_warp_id": "7" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCave_2F/scripts.inc ================================================ CeruleanCave_2F_MapScripts:: .byte 0 ================================================ FILE: data/maps/CeruleanCave_2F_Blue/map.json ================================================ { "id": "MAP_CERULEAN_CAVE_2F_BLUE", "name": "CeruleanCave_2F_Blue", "layout": "LAYOUT_CERULEAN_CAVE_2F_BLUE", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_CERULEAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 33, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_2F_EventScript_ItemPPUp", "flag": "FLAG_HIDE_CERULEAN_CAVE_2F_PP_UP" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 8, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_2F_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_CERULEAN_CAVE_2F_ULTRA_BALL" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_2F_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_CERULEAN_CAVE_2F_FULL_RESTORE" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 32, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 32, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 27, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 28, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 30, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 9, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 23, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 13, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_19" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1A" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 10, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1B" } ], "warp_events": [ { "x": 33, "y": 4, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_BLUE", "dest_warp_id": 1 }, { "x": 13, "y": 4, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_BLUE", "dest_warp_id": 3 }, { "x": 7, "y": 14, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_BLUE", "dest_warp_id": 4 }, { "x": 26, "y": 9, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_BLUE", "dest_warp_id": 5 }, { "x": 23, "y": 10, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_BLUE", "dest_warp_id": 6 }, { "x": 5, "y": 6, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_BLUE", "dest_warp_id": 7 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCave_2F_Blue/scripts.inc ================================================ CeruleanCave_2F_Blue_MapScripts:: .byte 0 ================================================ FILE: data/maps/CeruleanCave_2F_Blue/text.inc ================================================ ================================================ FILE: data/maps/CeruleanCave_2F_Yellow/map.json ================================================ { "id": "MAP_CERULEAN_CAVE_2F_YELLOW", "name": "CeruleanCave_2F_Yellow", "layout": "LAYOUT_CERULEAN_CAVE_2F_YELLOW", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_CERULEAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 23, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_2F_EventScript_ItemPPUp", "flag": "FLAG_HIDE_CERULEAN_CAVE_2F_PP_UP" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 20, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_2F_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_CERULEAN_CAVE_2F_ULTRA_BALL" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 31, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_2F_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_CERULEAN_CAVE_2F_FULL_RESTORE" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 31, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 31, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 27, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 26, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 30, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 9, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 21, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 13, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_19" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1A" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 11, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1B" } ], "warp_events": [ { "x": 33, "y": 4, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_YELLOW", "dest_warp_id": 1 }, { "x": 13, "y": 4, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_YELLOW", "dest_warp_id": 3 }, { "x": 7, "y": 14, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_YELLOW", "dest_warp_id": 4 }, { "x": 26, "y": 9, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_YELLOW", "dest_warp_id": 5 }, { "x": 23, "y": 10, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_YELLOW", "dest_warp_id": 6 }, { "x": 5, "y": 6, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_YELLOW", "dest_warp_id": 7 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCave_2F_Yellow/scripts.inc ================================================ CeruleanCave_2F_Yellow_MapScripts:: .byte 0 ================================================ FILE: data/maps/CeruleanCave_2F_Yellow/text.inc ================================================ ================================================ FILE: data/maps/CeruleanCave_B1F/map.json ================================================ { "id": "MAP_CERULEAN_CAVE_B1F", "name": "CeruleanCave_B1F", "layout": "LAYOUT_CERULEAN_CAVE_B1F", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_CERULEAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 31, "y": 9, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_B1F_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_CERULEAN_CAVE_B1F_ULTRA_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 32, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_B1F_EventScript_ItemMaxRevive", "flag": "FLAG_HIDE_CERULEAN_CAVE_B1F_MAX_REVIVE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MEWTWO", "in_connection": false, "x": 7, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_B1F_EventScript_Mewtwo", "flag": "FLAG_HIDE_MEWTWO" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 37, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 38, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 35, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 37, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 35, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 6, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_19" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 3, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1A" } ], "warp_events": [ { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCave_B1F/scripts.inc ================================================ CeruleanCave_B1F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, CeruleanCave_B1F_OnResume map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_B1F_OnTransition .byte 0 CeruleanCave_B1F_OnResume:: call_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, CeruleanCave_B1F_EventScript_TryRemoveMewtwo end CeruleanCave_B1F_EventScript_TryRemoveMewtwo:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return removeobject VAR_LAST_TALKED return CeruleanCave_B1F_OnTransition:: call_if_set FLAG_FOUGHT_MEWTWO, CeruleanCave_B1F_EventScript_HideMewtwo call_if_unset FLAG_FOUGHT_MEWTWO, CeruleanCave_B1F_EventScript_TryShowMewtwo end CeruleanCave_B1F_EventScript_TryShowMewtwo:: goto_if_set FLAG_MEWTWO_FLEW_AWAY, EventScript_Return clearflag FLAG_HIDE_MEWTWO return CeruleanCave_B1F_EventScript_HideMewtwo:: setflag FLAG_HIDE_MEWTWO return CeruleanCave_B1F_EventScript_Mewtwo:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer waitse playmoncry SPECIES_MEWTWO, CRY_MODE_ENCOUNTER message CeruleanCave_B1F_Text_Mew waitmessage waitmoncry delay 20 playbgm MUS_ENCOUNTER_GYM_LEADER, 0 waitbuttonpress setwildbattle SPECIES_MEWTWO, 70 setflag FLAG_SYS_SPECIAL_WILD_BATTLE special StartLegendaryBattle waitstate clearflag FLAG_SYS_SPECIAL_WILD_BATTLE specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, CeruleanCave_B1F_EventScript_DefeatedMewtwo goto_if_eq VAR_RESULT, B_OUTCOME_RAN, CeruleanCave_B1F_EventScript_RanFromMewtwo goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, CeruleanCave_B1F_EventScript_RanFromMewtwo setflag FLAG_FOUGHT_MEWTWO release end CeruleanCave_B1F_EventScript_DefeatedMewtwo:: setflag FLAG_MEWTWO_FLEW_AWAY setvar VAR_0x8004, SPECIES_MEWTWO goto EventScript_MonFlewAway end CeruleanCave_B1F_EventScript_RanFromMewtwo:: setvar VAR_0x8004, SPECIES_MEWTWO goto EventScript_MonFlewAway end ================================================ FILE: data/maps/CeruleanCave_B1F/text.inc ================================================ CeruleanCave_B1F_Text_Mew:: .string "Mew!$" ================================================ FILE: data/maps/CeruleanCave_B1F_Blue/map.json ================================================ { "id": "MAP_CERULEAN_CAVE_B1F_BLUE", "name": "CeruleanCave_B1F_Blue", "layout": "LAYOUT_CERULEAN_CAVE_B1F_BLUE", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_CERULEAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 22, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_B1F_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_CERULEAN_CAVE_B1F_ULTRA_BALL" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 21, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_B1F_EventScript_ItemMaxRevive", "flag": "FLAG_HIDE_CERULEAN_CAVE_B1F_MAX_REVIVE" }, { "graphics_id": "OBJ_EVENT_GFX_MEWTWO", "in_connection": false, "x": 35, "y": 15, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_B1F_EventScript_Mewtwo", "flag": "FLAG_HIDE_MEWTWO" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 24, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 23, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 20, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 19, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 23, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 6, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_19" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 3, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1A" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_CERULEAN_CAVE_1F_BLUE", "dest_warp_id": 2 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCave_B1F_Blue/scripts.inc ================================================ CeruleanCave_B1F_Blue_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, CeruleanCave_B1F_OnResume map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_B1F_OnTransition .byte 0 ================================================ FILE: data/maps/CeruleanCave_B1F_Blue/text.inc ================================================ ================================================ FILE: data/maps/CeruleanCave_B1F_Yellow/map.json ================================================ { "id": "MAP_CERULEAN_CAVE_B1F_YELLOW", "name": "CeruleanCave_B1F_Yellow", "layout": "LAYOUT_CERULEAN_CAVE_B1F_YELLOW", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_CERULEAN_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 3, "y": 13, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_B1F_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_CERULEAN_CAVE_B1F_ULTRA_BALL" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 18, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_B1F_EventScript_ItemMaxRevive", "flag": "FLAG_HIDE_CERULEAN_CAVE_B1F_MAX_REVIVE" }, { "graphics_id": "OBJ_EVENT_GFX_MEWTWO", "in_connection": false, "x": 33, "y": 15, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCave_B1F_EventScript_Mewtwo", "flag": "FLAG_HIDE_MEWTWO" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 35, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 36, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 34, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 36, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 34, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 24, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 27, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 29, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_19" }, { "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 31, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1A" } ], "warp_events": [ { "x": 5, "y": 7, "elevation": 4, "dest_map": "MAP_CERULEAN_CAVE_1F_YELLOW", "dest_warp_id": 2 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCave_B1F_Yellow/scripts.inc ================================================ CeruleanCave_B1F_Yellow_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, CeruleanCave_B1F_OnResume map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_B1F_OnTransition .byte 0 ================================================ FILE: data/maps/CeruleanCave_B1F_Yellow/text.inc ================================================ ================================================ FILE: data/maps/CeruleanCity/map.json ================================================ { "id": "MAP_CERULEAN_CITY", "name": "CeruleanCity", "layout": "LAYOUT_CERULEAN_CITY", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 12, "map": "MAP_ROUTE24" }, { "direction": "down", "offset": 0, "map": "MAP_ROUTE5" }, { "direction": "left", "offset": 10, "map": "MAP_ROUTE4" }, { "direction": "right", "offset": 10, "map": "MAP_ROUTE9" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 31, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_EventScript_Policeman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 33, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_EventScript_Grunt", "flag": "FLAG_HIDE_CERULEAN_ROCKET" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 16, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_EventScript_LittleBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 9, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_EventScript_BaldingMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SLOWBRO", "in_connection": false, "x": 32, "y": 29, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_EventScript_Slowbro", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 33, "y": 29, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_EventScript_Lass", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 34, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "in_connection": false, "x": 22, "y": 0, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_CERULEAN_RIVAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 26, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_CERULEAN_CITY_CUT_TREE" }, { "type": "clone", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "x": 50, "y": 18, "target_local_id": 10, "target_map": "MAP_ROUTE9" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 12, "y": 30, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 1, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_EventScript_CeruleanCaveGuard", "flag": "FLAG_HIDE_CERULEAN_CAVE_GUARD" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BLACK_BELT", "in_connection": false, "x": 13, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Poliwrath", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 7, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Jynx", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 10, "y": 11, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY_HOUSE1", "dest_warp_id": "1" }, { "x": 30, "y": 11, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY_HOUSE2", "dest_warp_id": "1" }, { "x": 15, "y": 17, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY_HOUSE3", "dest_warp_id": "1" }, { "x": 22, "y": 19, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 31, "y": 21, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY_GYM", "dest_warp_id": "1" }, { "x": 13, "y": 28, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY_BIKE_SHOP", "dest_warp_id": "1" }, { "x": 29, "y": 28, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY_MART", "dest_warp_id": "1" }, { "x": 1, "y": 12, "elevation": 0, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 10, "y": 8, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY_HOUSE1", "dest_warp_id": "3" }, { "x": 31, "y": 8, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY_HOUSE2", "dest_warp_id": "3" }, { "x": 31, "y": 9, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY_HOUSE2", "dest_warp_id": "3" }, { "x": 14, "y": 28, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY_BIKE_SHOP", "dest_warp_id": "1" }, { "x": 23, "y": 28, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY_HOUSE4", "dest_warp_id": "0" }, { "x": 17, "y": 11, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY_HOUSE5", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 22, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_CERULEAN_CITY_RIVAL", "var_value": "0", "script": "CeruleanCity_EventScript_RivalTriggerLeft" }, { "type": "trigger", "x": 23, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_CERULEAN_CITY_RIVAL", "var_value": "0", "script": "CeruleanCity_EventScript_RivalTriggerMid" }, { "type": "trigger", "x": 24, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_CERULEAN_CITY_RIVAL", "var_value": "0", "script": "CeruleanCity_EventScript_RivalTriggerRight" }, { "type": "trigger", "x": 33, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_CERULEAN_CITY_ROCKET", "var_value": "0", "script": "CeruleanCity_EventScript_GruntTriggerTop" }, { "type": "trigger", "x": 33, "y": 7, "elevation": 3, "var": "VAR_MAP_SCENE_CERULEAN_CITY_ROCKET", "var_value": "0", "script": "CeruleanCity_EventScript_GruntTriggerBottom" }, { "type": "trigger", "x": 1, "y": 13, "elevation": 0, "var": "VAR_TEMP_2", "var_value": "0", "script": "CeruleanCity_EventScript_SetCeruleanCaveWarp" } ], "bg_events": [ { "type": "sign", "x": 20, "y": 25, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_EventScript_CitySign" }, { "type": "sign", "x": 27, "y": 21, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_EventScript_GymSign" }, { "type": "sign", "x": 11, "y": 28, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_EventScript_BikeShopSign" }, { "type": "sign", "x": 19, "y": 32, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_EventScript_TrainerTips" }, { "type": "hidden_item", "x": 18, "y": 7, "elevation": 3, "item": "ITEM_RARE_CANDY", "flag": "FLAG_HIDDEN_ITEM_CERULEAN_CITY_RARE_CANDY", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 11, "y": 25, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" }, { "type": "sign", "x": 11, "y": 27, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" }, { "type": "sign", "x": 11, "y": 26, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" } ], "level_scaling": "1" } ================================================ FILE: data/maps/CeruleanCity/scripts.inc ================================================ .set LOCALID_POLICEMAN, 1 .set LOCALID_GRUNT, 2 .set LOCALID_SLOWBRO, 5 .set LOCALID_LASS, 6 .set LOCALID_RIVAL, 8 .set LOCALID_WOMAN, 11 .set LOCALID_POLIWRATH_MASTER, 13 .set LOCALID_JYNX_MASTER, 14 .set TRAINER, VAR_0x8009 CeruleanCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_OnTransition .byte 0 CeruleanCity_OnTransition:: setworldmapflag FLAG_WORLD_MAP_CERULEAN_CITY call_if_unset FLAG_GOT_SS_TICKET, CeruleanCity_EventScript_BlockExits goto CeruleanCity_MapScript_SetMasterTrainerMovementTypes end CeruleanCity_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_POLIWRATH callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeruleanCity_MapScript_PoliwrathMasterMovementType setvar TRAINER, MASTER_JYNX callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeruleanCity_MapScript_JynxMasterMovementType end CeruleanCity_MapScript_PoliwrathMasterMovementType:: setobjectmovementtype LOCALID_POLIWRATH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeruleanCity_MapScript_JynxMasterMovementType:: setobjectmovementtype LOCALID_JYNX_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeruleanCity_EventScript_BlockExits:: setobjectxyperm LOCALID_POLICEMAN, 30, 12 setobjectxyperm LOCALID_SLOWBRO, 26, 31 setobjectxyperm LOCALID_LASS, 27, 31 return CeruleanCity_EventScript_RivalTriggerLeft:: lockall setvar VAR_TEMP_1, 0 goto CeruleanCity_EventScript_Rival end CeruleanCity_EventScript_RivalTriggerMid:: lockall setvar VAR_TEMP_1, 1 setobjectxyperm LOCALID_RIVAL, 23, 0 goto CeruleanCity_EventScript_Rival end CeruleanCity_EventScript_RivalTriggerRight:: lockall setvar VAR_TEMP_1, 2 setobjectxyperm LOCALID_RIVAL, 24, 0 goto CeruleanCity_EventScript_Rival end CeruleanCity_EventScript_Rival:: textcolor NPC_TEXT_COLOR_MALE setvar VAR_MAP_SCENE_ROUTE22, 2 playbgm MUS_ENCOUNTER_RIVAL, 0 addobject LOCALID_RIVAL applymovement LOCALID_RIVAL, CeruleanCity_Movement_RivalEnter waitmovement 0 msgbox CeruleanCity_Text_RivalIntro setvar VAR_LAST_TALKED, LOCALID_RIVAL call_if_eq VAR_STARTER_MON, 2, CeruleanCity_EventScript_RivalSquirtle call_if_eq VAR_STARTER_MON, 1, CeruleanCity_EventScript_RivalBulbasaur call_if_eq VAR_STARTER_MON, 0, CeruleanCity_EventScript_RivalCharmander famechecker FAMECHECKER_BILL, 0 msgbox CeruleanCity_Text_RivalPostBattle closemessage playbgm MUS_RIVAL_EXIT, 0 call_if_eq VAR_TEMP_1, 0, CeruleanCity_EventScript_RivalStartExit call_if_eq VAR_TEMP_1, 1, CeruleanCity_EventScript_RivalStartExit call_if_eq VAR_TEMP_1, 2, CeruleanCity_EventScript_RivalStartExitRight msgbox CeruleanCity_Text_OhRightLittlePresentAsFavor setvar VAR_MAP_SCENE_CERULEAN_CITY_RIVAL, 1 setflag FLAG_GOT_FAME_CHECKER giveitem ITEM_FAME_CHECKER msgbox CeruleanCity_Text_ExplainFameCheckerSmellYa closemessage applymovement LOCALID_RIVAL, CeruleanCity_Movement_RivalExit waitmovement 0 fadedefaultbgm removeobject LOCALID_RIVAL releaseall end CeruleanCity_EventScript_RivalSquirtle:: trainerbattle_no_intro TRAINER_RIVAL_CERULEAN_SQUIRTLE, CeruleanCity_Text_RivalDefeat return CeruleanCity_EventScript_RivalBulbasaur:: trainerbattle_no_intro TRAINER_RIVAL_CERULEAN_BULBASAUR, CeruleanCity_Text_RivalDefeat return CeruleanCity_EventScript_RivalCharmander:: trainerbattle_no_intro TRAINER_RIVAL_CERULEAN_CHARMANDER, CeruleanCity_Text_RivalDefeat return CeruleanCity_EventScript_RivalStartExit:: applymovement OBJ_EVENT_ID_PLAYER, CeruleanCity_Movement_PlayerWatchRivalExit applymovement LOCALID_RIVAL, CeruleanCity_Movement_RivalStartExit waitmovement 0 return CeruleanCity_EventScript_RivalStartExitRight:: applymovement OBJ_EVENT_ID_PLAYER, CeruleanCity_Movement_PlayerWatchRivalExitRight applymovement LOCALID_RIVAL, CeruleanCity_Movement_RivalStartExitRight waitmovement 0 return CeruleanCity_Movement_PlayerWatchRivalExit:: delay_16 delay_8 walk_in_place_faster_right delay_16 walk_in_place_faster_down step_end CeruleanCity_Movement_PlayerWatchRivalExitRight:: delay_16 delay_8 walk_in_place_faster_left delay_16 walk_in_place_faster_down step_end CeruleanCity_Movement_RivalEnter:: walk_down walk_down walk_down walk_down walk_down step_end CeruleanCity_Movement_RivalStartExit:: walk_right walk_down walk_down walk_down walk_down walk_down walk_down walk_down delay_16 delay_16 walk_left walk_up walk_up walk_up walk_up walk_up step_end CeruleanCity_Movement_RivalStartExitRight:: walk_left walk_down walk_down walk_down walk_down walk_down walk_down walk_down delay_16 delay_16 walk_right walk_up walk_up walk_up walk_up walk_up step_end CeruleanCity_Movement_RivalExit:: walk_down walk_down walk_down walk_down walk_down walk_down walk_down step_end CeruleanCity_EventScript_Grunt:: lock faceplayer goto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_5, CeruleanCity_EventScript_GruntDefeated message CeruleanCity_Text_GruntIntro waitmessage playbgm MUS_ENCOUNTER_ROCKET, 0 waitbuttonpress trainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_5, CeruleanCity_Text_GruntDefeat setvar VAR_MAP_SCENE_CERULEAN_CITY_ROCKET, 1 goto CeruleanCity_EventScript_GruntDefeated end CeruleanCity_EventScript_GruntDefeated:: msgbox CeruleanCity_Text_OkayIllReturnStolenTM checkitemspace ITEM_TM28 goto_if_eq VAR_RESULT, FALSE, CeruleanCity_EventScript_NoRoomForTM28 giveitem_msg CeruleanCity_Text_RecoveredTM28FromGrunt, ITEM_TM28 msgbox CeruleanCity_Text_BetterGetMovingBye closemessage fadescreen FADE_TO_BLACK removeobject LOCALID_GRUNT fadescreen FADE_FROM_BLACK setflag FLAG_GOT_TM28_FROM_ROCKET release end CeruleanCity_EventScript_NoRoomForTM28:: textcolor NPC_TEXT_COLOR_MALE msgbox CeruleanCity_Text_MakeRoomForThisCantRun release end CeruleanCity_EventScript_GruntTriggerTop:: lockall setvar VAR_TEMP_1, 0 applymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterUp waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 goto CeruleanCity_EventScript_GruntTrigger end CeruleanCity_EventScript_GruntTriggerBottom:: lockall setvar VAR_TEMP_1, 1 applymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterDown waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto CeruleanCity_EventScript_GruntTrigger end CeruleanCity_EventScript_GruntTrigger:: textcolor NPC_TEXT_COLOR_MALE msgbox CeruleanCity_Text_GruntIntro setvar VAR_LAST_TALKED, LOCALID_GRUNT trainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_5, CeruleanCity_Text_GruntDefeat setvar VAR_MAP_SCENE_CERULEAN_CITY_ROCKET, 1 goto CeruleanCity_EventScript_GruntDefeated end CeruleanCity_EventScript_Policeman:: lock faceplayer msgbox CeruleanCity_Text_PeopleHereWereRobbed closemessage applymovement LOCALID_POLICEMAN, Common_Movement_FaceOriginalDirection waitmovement 0 release end CeruleanCity_EventScript_LittleBoy:: lock faceplayer goto_if_set FLAG_GOT_SS_TICKET, CeruleanCity_EventScript_LittleBoySlowbroMoved msgbox CeruleanCity_Text_IfSlowbroWasntThereCouldCutTree release end CeruleanCity_EventScript_LittleBoySlowbroMoved:: msgbox CeruleanCity_Text_YouCanCutDownSmallTrees release end CeruleanCity_EventScript_BaldingMan:: msgbox CeruleanCity_Text_PokemonEncyclopediaAmusing, MSGBOX_NPC end CeruleanCity_EventScript_Youngster:: msgbox CeruleanCity_Text_TrainerLifeIsToughIsntIt, MSGBOX_NPC end CeruleanCity_EventScript_CeruleanCaveGuard:: msgbox CeruleanCity_Text_ThisIsCeruleanCave, MSGBOX_NPC end CeruleanCity_EventScript_Woman:: lock faceplayer msgbox CeruleanCity_Text_WantBrightRedBicycle closemessage applymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection waitmovement 0 release end CeruleanCity_EventScript_Lass:: lock random 3 copyvar VAR_0x8008, VAR_RESULT call_if_eq VAR_0x8008, 0, CeruleanCity_EventScript_SlowbroCommand1 call_if_eq VAR_0x8008, 1, CeruleanCity_EventScript_SlowbroCommand2 call_if_eq VAR_0x8008, 2, CeruleanCity_EventScript_SlowbroCommand3 waitmessage delay 40 playse SE_PIN applymovement LOCALID_SLOWBRO, Common_Movement_QuestionMark waitmovement 0 delay 30 call_if_eq VAR_0x8008, 0, CeruleanCity_EventScript_SlowbroFailed1 call_if_eq VAR_0x8008, 1, CeruleanCity_EventScript_SlowbroFailed2 call_if_eq VAR_0x8008, 2, CeruleanCity_EventScript_SlowbroFailed3 release end CeruleanCity_EventScript_SlowbroCommand1:: message CeruleanCity_Text_SlowbroUseSonicboom return CeruleanCity_EventScript_SlowbroCommand2:: message CeruleanCity_Text_SlowbroPunch return CeruleanCity_EventScript_SlowbroCommand3:: message CeruleanCity_Text_SlowbroWithdraw return CeruleanCity_EventScript_SlowbroFailed1:: msgbox CeruleanCity_Text_SlowbroPayAttention return CeruleanCity_EventScript_SlowbroFailed2:: msgbox CeruleanCity_Text_NoYouBlewItAgain return CeruleanCity_EventScript_SlowbroFailed3:: msgbox CeruleanCity_Text_HardToControlMonsObedience return CeruleanCity_EventScript_Slowbro:: lock random 4 copyvar VAR_0x8008, VAR_RESULT call_if_eq VAR_0x8008, 0, CeruleanCity_EventScript_SlowbroText1 call_if_eq VAR_0x8008, 1, CeruleanCity_EventScript_SlowbroText2 call_if_eq VAR_0x8008, 2, CeruleanCity_EventScript_SlowbroText3 call_if_eq VAR_0x8008, 3, CeruleanCity_EventScript_SlowbroText4 release end CeruleanCity_EventScript_SlowbroText1:: msgbox CeruleanCity_Text_SlowbroTookSnooze return CeruleanCity_EventScript_SlowbroText2:: msgbox CeruleanCity_Text_SlowbroLoafingAround return CeruleanCity_EventScript_SlowbroText3:: msgbox CeruleanCity_Text_SlowbroTurnedAway return CeruleanCity_EventScript_SlowbroText4:: msgbox CeruleanCity_Text_SlowbroIgnoredOrders return CeruleanCity_EventScript_CitySign:: msgbox CeruleanCity_Text_CitySign, MSGBOX_SIGN end CeruleanCity_EventScript_TrainerTips:: msgbox CeruleanCity_Text_TrainerTipsHeldItems, MSGBOX_SIGN end CeruleanCity_EventScript_BikeShopSign:: msgbox CeruleanCity_Text_BikeShopSign, MSGBOX_SIGN end CeruleanCity_EventScript_GymSign:: lockall famechecker FAMECHECKER_MISTY, 0 msgbox CeruleanCity_Text_GymSign releaseall end CeruleanCity_EventScript_SetCeruleanCaveWarp:: callnative DetermineCeruleanCaveLayout compare VAR_RESULT, 0 goto_if_eq CeruleanCity_EventScript_SetCeruleanCaveRG compare VAR_RESULT, 1 goto_if_eq CeruleanCity_EventScript_SetCeruleanCaveRB compare VAR_RESULT, 2 goto_if_eq CeruleanCity_EventScript_SetCeruleanCaveY end CeruleanCity_EventScript_SetCeruleanCaveRG:: setdynamicwarp MAP_CERULEAN_CAVE_1F, 255, 33, 21 release end CeruleanCity_EventScript_SetCeruleanCaveRB:: setdynamicwarp MAP_CERULEAN_CAVE_1F_BLUE, 255, 33, 21 release end CeruleanCity_EventScript_SetCeruleanCaveY:: setdynamicwarp MAP_CERULEAN_CAVE_1F_YELLOW, 255, 33, 21 release end ================================================ FILE: data/maps/CeruleanCity/text.inc ================================================ CeruleanCity_Text_RivalIntro:: .string "{RIVAL}: Yo! {PLAYER}!\p" .string "You're still struggling along back\n" .string "here?\p" .string "I'm doing great! I caught a bunch\n" .string "of strong and smart POKéMON!\p" .string "Here, let me see what you caught,\n" .string "{PLAYER}!$" CeruleanCity_Text_RivalDefeat:: .string "Hey!\n" .string "Take it easy!\l" .string "You won already!$" CeruleanCity_Text_RivalPostBattle:: .string "{RIVAL}: Hey, guess what?\p" .string "I went to BILL's and got him to\n" .string "show me his rare POKéMON.\p" .string "That added a lot of pages to my\n" .string "POKéDEX!\p" .string "After all, BILL's world famous as a\n" .string "POKéMANIAC.\p" .string "He invented the POKéMON Storage\n" .string "System on PC, too.\p" .string "Since you're using his system,\n" .string "you should go thank him.\p" .string "Well, I better get rolling!\n" .string "Smell ya later!$" CeruleanCity_Text_OhRightLittlePresentAsFavor:: .string "Oh, yeah, right.\p" .string "I feel sorry for you. No, really.\n" .string "You're always plodding behind me.\p" .string "So here, I'll give you a little\n" .string "present as a favor.$" CeruleanCity_Text_ExplainFameCheckerSmellYa:: .string "A chatty gossip like you…\n" .string "That thing's perfect.\p" .string "I don't need it because I don't\n" .string "give a hoot about others.\p" .string "All right, this time I really am\n" .string "gone. Smell ya!$" CeruleanCity_Text_GruntIntro:: .string "Hey! Stay out!\n" .string "It's not your yard!\p" .string "…Huh?\n" .string "Me?\p" .string "I'm an innocent bystander!\n" .string "Don't you believe me?{PLAY_BGM}{MUS_ENCOUNTER_ROCKET}$" CeruleanCity_Text_GruntDefeat:: .string "GRUNT: Stop! I give up!\n" .string "I'll leave quietly!$" CeruleanCity_Text_OkayIllReturnStolenTM:: .string "…Okay.\n" .string "I'll return the TM I stole.$" CeruleanCity_Text_RecoveredTM28FromGrunt:: .string "{PLAYER} recovered TM28 from\n" .string "the TEAM ROCKET GRUNT.$" CeruleanCity_Text_BetterGetMovingBye:: .string "I better get moving!\n" .string "Bye!$" CeruleanCity_Text_MakeRoomForThisCantRun:: .string "Make room for this!\n" .string "I can't run until I give it to you!$" CeruleanCity_Text_TrainerLifeIsToughIsntIt:: .string "You're a TRAINER, too?\p" .string "Collecting, battling…\n" .string "It's a tough life, isn't it?$" CeruleanCity_Text_YouCanCutDownSmallTrees:: .string "Did you know that you can CUT down\n" .string "small trees?\p" .string "Even that small tree in front of\n" .string "the shop can be CUT down.\p" .string "I think there's a way around it,\n" .string "though.$" CeruleanCity_Text_IfSlowbroWasntThereCouldCutTree:: .string "If that SLOWBRO wasn't there, you\n" .string "could CUT down the small tree.\p" .string "That way, you could get to the\n" .string "other side.\p" .string "I think there's a way around it,\n" .string "though.$" CeruleanCity_Text_PokemonEncyclopediaAmusing:: .string "You're making an encyclopedia on\n" .string "POKéMON? That sounds amusing.$" CeruleanCity_Text_PeopleHereWereRobbed:: .string "The people here were robbed.\p" .string "It's obvious that TEAM ROCKET is\n" .string "behind this most heinous crime!\p" .string "Even our POLICE FORCE has\n" .string "trouble with the ROCKETS!$" CeruleanCity_Text_SlowbroUseSonicboom:: .string "Okay! SLOWBRO!\n" .string "Use SONICBOOM!$" CeruleanCity_Text_SlowbroPayAttention:: .string "Come on, SLOWBRO, pay attention!$" CeruleanCity_Text_SlowbroPunch:: .string "SLOWBRO, punch!$" CeruleanCity_Text_NoYouBlewItAgain:: .string "No!\n" .string "You blew it again!$" CeruleanCity_Text_SlowbroWithdraw:: .string "SLOWBRO, WITHDRAW!$" CeruleanCity_Text_HardToControlMonsObedience:: .string "No! That's wrong!\n" .string "It's so hard to control POKéMON!\p" .string "Your POKéMON's obedience depends\n" .string "on your abilities as a TRAINER.$" CeruleanCity_Text_SlowbroTookSnooze:: .string "SLOWBRO took a snooze…$" CeruleanCity_Text_SlowbroLoafingAround:: .string "SLOWBRO is loafing around…$" CeruleanCity_Text_SlowbroTurnedAway:: .string "SLOWBRO turned away…$" CeruleanCity_Text_SlowbroIgnoredOrders:: .string "SLOWBRO ignored orders…$" CeruleanCity_Text_WantBrightRedBicycle:: .string "I want a bright red bicycle.\p" .string "I'll keep it at home, so it won't\n" .string "get dirty.$" CeruleanCity_Text_ThisIsCeruleanCave:: .string "This is CERULEAN CAVE.\p" .string "Horribly strong POKéMON live inside\n" .string "there.\p" .string "It takes a very special TRAINER to\n" .string "be allowed inside there.\p" .string "You'd have to be strong enough to\n" .string "become the POKéMON LEAGUE\l" .string "CHAMPION for starters.\p" .string "And, you would have to have\n" .string "made a great achievement.$" CeruleanCity_Text_CitySign:: .string "CERULEAN CITY\n" .string "A Mysterious, Blue Aura Surrounds\l" .string "It$" CeruleanCity_Text_TrainerTipsHeldItems:: .string "TRAINER TIPS\p" .string "A POKéMON can be made to hold\n" .string "an item.\p" .string "Some items can even be used by\n" .string "the holding POKéMON in battle.$" CeruleanCity_Text_BikeShopSign:: .string "Grass and caves handled easily!\n" .string "BIKE SHOP$" CeruleanCity_Text_GymSign:: .string "CERULEAN CITY POKéMON GYM\n" .string "LEADER: MISTY\l" .string "The Tomboyish Mermaid!$" ================================================ FILE: data/maps/CeruleanCity_BikeShop/map.json ================================================ { "id": "MAP_CERULEAN_CITY_BIKE_SHOP", "name": "CeruleanCity_BikeShop", "layout": "LAYOUT_CERULEAN_CITY_BIKE_SHOP", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 9, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_BikeShop_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_BikeShop_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_BikeShop_EventScript_Woman", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BIRD_KEEPER", "in_connection": false, "x": 0, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Doduo", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "5" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "5" }, { "x": 6, "y": 9, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" }, { "type": "sign", "x": 4, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" }, { "type": "sign", "x": 4, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" }, { "type": "sign", "x": 2, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" }, { "type": "sign", "x": 1, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" }, { "type": "sign", "x": 2, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" }, { "type": "sign", "x": 2, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" }, { "type": "sign", "x": 2, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_BikeShop_EventScript_Bicycle" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCity_BikeShop/scripts.inc ================================================ .set LOCALID_DODUO_MASTER, 4 .set TRAINER, VAR_0x8009 CeruleanCity_BikeShop_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_BikeShop_MapScript_SetMasterTrainerMovementTypes .byte 0 CeruleanCity_BikeShop_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_DODUO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeruleanCity_BikeShop_MapScript_DoduoMasterMovementType end CeruleanCity_BikeShop_MapScript_DoduoMasterMovementType:: setobjectmovementtype LOCALID_DODUO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeruleanCity_BikeShop_EventScript_Clerk:: lock faceplayer goto_if_set FLAG_GOT_BICYCLE, CeruleanCity_BikeShop_EventScript_AlreadyGotBicycle goto_if_set FLAG_GOT_BIKE_VOUCHER, CeruleanCity_BikeShop_EventScript_ExchangeBikeVoucher showmoneybox 0, 0 message CeruleanCity_BikeShop_Text_WelcomeToBikeShop waitmessage multichoice 11, 0, MULTICHOICE_BIKE_SHOP, FALSE switch VAR_RESULT case 0, CeruleanCity_BikeShop_EventScript_TryPurchaseBicycle case 1, CeruleanCity_BikeShop_EventScript_ClerkGoodbye case 127, CeruleanCity_BikeShop_EventScript_ClerkGoodbye end @ The Bicycle price / players money is never actually checked CeruleanCity_BikeShop_EventScript_TryPurchaseBicycle:: msgbox CeruleanCity_BikeShop_Text_SorryYouCantAffordIt goto CeruleanCity_BikeShop_EventScript_ClerkGoodbye end CeruleanCity_BikeShop_EventScript_ClerkGoodbye:: msgbox CeruleanCity_BikeShop_Text_ThankYouComeAgain hidemoneybox release end CeruleanCity_BikeShop_EventScript_ExchangeBikeVoucher:: msgbox CeruleanCity_BikeShop_Text_OhBikeVoucherHereYouGo msgreceiveditem CeruleanCity_BikeShop_Text_ExchangedVoucherForBicycle, ITEM_BICYCLE, 1, MUS_OBTAIN_KEY_ITEM setflag FLAG_GOT_BICYCLE additem ITEM_BICYCLE removeitem ITEM_BIKE_VOUCHER msgbox CeruleanCity_BikeShop_Text_ExplainBicycleGears msgbox CeruleanCity_BikeShop_Text_ThankYouComeAgain release end CeruleanCity_BikeShop_EventScript_AlreadyGotBicycle:: msgbox CeruleanCity_BikeShop_Text_HowDoYouLikeNewBicycle release end @ Unused CeruleanCity_BikeShop_EventScript_NoRoomForBicycle:: msgbox CeruleanCity_BikeShop_Text_MakeRoomForBicycle release end CeruleanCity_BikeShop_EventScript_Woman:: msgbox CeruleanCity_BikeShop_Text_CityBikeGoodEnoughForMe, MSGBOX_NPC end CeruleanCity_BikeShop_EventScript_Youngster:: lock faceplayer goto_if_set FLAG_GOT_BICYCLE, CeruleanCity_BikeShop_EventScript_YoungsterHaveBike msgbox CeruleanCity_BikeShop_Text_BikesCoolButExpensive release end CeruleanCity_BikeShop_EventScript_YoungsterHaveBike:: msgbox CeruleanCity_BikeShop_Text_WowYourBikeIsCool release end CeruleanCity_BikeShop_EventScript_Bicycle:: msgbox CeruleanCity_BikeShop_Text_ShinyNewBicycle, MSGBOX_SIGN end ================================================ FILE: data/maps/CeruleanCity_BikeShop/text.inc ================================================ CeruleanCity_BikeShop_Text_WelcomeToBikeShop:: .string "Hi!\n" .string "Welcome to our BIKE SHOP.\p" .string "Have we got just the BIKE for\n" .string "you!$" CeruleanCity_BikeShop_Text_SorryYouCantAffordIt:: .string "Sorry!\n" .string "You can't afford it!$" CeruleanCity_BikeShop_Text_OhBikeVoucherHereYouGo:: .string "Oh, that's…\p" .string "A BIKE VOUCHER!\p" .string "Okay!\n" .string "Here you go!$" CeruleanCity_BikeShop_Text_ExchangedVoucherForBicycle:: .string "{PLAYER} exchanged the\n" .string "BIKE VOUCHER for a BICYCLE.$" CeruleanCity_BikeShop_Text_ThankYouComeAgain:: .string "Thank you!\n" .string "Come back again sometime!$" CeruleanCity_BikeShop_Text_ExplainBicycleGears:: .string "This BICYCLE has two gears.\n" .string "Press the B Button to switch them\l" .string "for more control of your speed!$" CeruleanCity_BikeShop_Text_HowDoYouLikeNewBicycle:: .string "How do you like your new BICYCLE?\n" .string "Do you like how it rides?\p" .string "You can take it out on CYCLING\n" .string "ROAD and even into caves!\p" .string "You can switch gears for more\n" .string "speed too with the B Button!$" CeruleanCity_BikeShop_Text_MakeRoomForBicycle:: .string "You better make room for your\n" .string "BICYCLE!$" CeruleanCity_BikeShop_Text_CityBikeGoodEnoughForMe:: .string "A plain city bike is good enough\n" .string "for me.\p" .string "After all, you can't put a shopping\n" .string "basket on a mountain bike.$" CeruleanCity_BikeShop_Text_BikesCoolButExpensive:: .string "These bikes are cool, but they're\n" .string "way expensive!$" CeruleanCity_BikeShop_Text_WowYourBikeIsCool:: .string "Wow.\n" .string "Your BIKE is really cool!$" CeruleanCity_BikeShop_Text_ShinyNewBicycle:: .string "A shiny new BICYCLE!$" ================================================ FILE: data/maps/CeruleanCity_Gym/map.json ================================================ { "id": "MAP_CERULEAN_CITY_GYM", "name": "CeruleanCity_Gym", "layout": "LAYOUT_CERULEAN_CITY_GYM", "music": "MUS_GYM", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 10, "y": 12, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "CeruleanCity_Gym_EventScript_Luis", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 4, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "CeruleanCity_Gym_EventScript_Diana", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MISTY", "in_connection": false, "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_Gym_EventScript_Misty", "flag": "FLAG_TEMP_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GYM_GUY", "in_connection": false, "x": 7, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_Gym_EventScript_GymGuy", "flag": "0" } ], "warp_events": [ { "x": 7, "y": 18, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "4" }, { "x": 8, "y": 18, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "4" }, { "x": 9, "y": 18, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 6, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 10, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_Gym_EventScript_GymStatue" } ], "level_scaling": "1" } ================================================ FILE: data/maps/CeruleanCity_Gym/scripts.inc ================================================ .equ CHECK_VISITOR_STATE, 6 .equ TYPE, VAR_0x8003 .equ ARGUMENT, VAR_0x8004 CeruleanCity_Gym_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_Gym_OnTransition .byte 0 CeruleanCity_Gym_OnTransition:: setvar TYPE, CHECK_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_MISTY callnative UseBattleHouseVar call_if_eq VAR_RESULT, 1, CeruleanCity_Gym_EventScript_HideMisty end CeruleanCity_Gym_EventScript_HideMisty:: setflag FLAG_TEMP_1 return CeruleanCity_Gym_EventScript_Misty:: famechecker FAMECHECKER_MISTY, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, CeruleanCity_Gym_EventScript_Misty_ChallengeMode trainerbattle_single TRAINER_LEADER_MISTY, CeruleanCity_Gym_Text_MistyIntro, CeruleanCity_Gym_Text_MistyDefeat, CeruleanCity_Gym_EventScript_MistyDefeated, NO_MUSIC settrainerflag TRAINER_LEADER_MISTY_CHALLENGE goto_if_unset FLAG_GOT_TM03_FROM_MISTY, CeruleanCity_Gym_EventScript_GiveTM03 msgbox CeruleanCity_Gym_Text_ExplainTM03 release end CeruleanCity_Gym_EventScript_Misty_ChallengeMode:: trainerbattle_single TRAINER_LEADER_MISTY_CHALLENGE, CeruleanCity_Gym_Text_MistyIntro, CeruleanCity_Gym_Text_MistyDefeat, CeruleanCity_Gym_EventScript_MistyDefeated, NO_MUSIC settrainerflag TRAINER_LEADER_MISTY goto_if_unset FLAG_GOT_TM03_FROM_MISTY, CeruleanCity_Gym_EventScript_GiveTM03 msgbox CeruleanCity_Gym_Text_ExplainTM03 release end CeruleanCity_Gym_EventScript_MistyDefeated:: famechecker FAMECHECKER_MISTY, 1 setflag FLAG_DEFEATED_MISTY setflag FLAG_BADGE02_GET setrespawn SPAWN_CERULEAN_CITY set_gym_trainers 2 goto CeruleanCity_Gym_EventScript_GiveTM03 end CeruleanCity_Gym_EventScript_GiveTM03:: msgbox CeruleanCity_Gym_Text_ExplainCascadeBadge checkitemspace ITEM_TM03 goto_if_eq VAR_RESULT, FALSE, CeruleanCity_Gym_EventScript_NoRoomForTM03 giveitem_msg CeruleanCity_Gym_Text_ReceivedTM03FromMisty, ITEM_TM03 setflag FLAG_GOT_TM03_FROM_MISTY msgbox CeruleanCity_Gym_Text_ExplainTM03 release end CeruleanCity_Gym_EventScript_NoRoomForTM03:: msgbox CeruleanCity_Gym_Text_BetterMakeRoomForThis release end CeruleanCity_Gym_EventScript_Diana:: trainerbattle_single TRAINER_PICNICKER_DIANA, CeruleanCity_Gym_Text_DianaIntro, CeruleanCity_Gym_Text_DianaDefeat msgbox CeruleanCity_Gym_Text_DianaPostBattle, MSGBOX_AUTOCLOSE end CeruleanCity_Gym_EventScript_Luis:: trainerbattle_single TRAINER_SWIMMER_MALE_LUIS, CeruleanCity_Gym_Text_LuisIntro, CeruleanCity_Gym_Text_LuisDefeat famechecker FAMECHECKER_MISTY, 2 msgbox CeruleanCity_Gym_Text_LuisPostBattle, MSGBOX_AUTOCLOSE end CeruleanCity_Gym_EventScript_GymGuy:: lock faceplayer goto_if_set FLAG_DEFEATED_MISTY, CeruleanCity_Gym_EventScript_GymGuyPostVictory msgbox CeruleanCity_Gym_Text_GymGuyAdvice release end CeruleanCity_Gym_EventScript_GymGuyPostVictory:: msgbox CeruleanCity_Gym_Text_WeMakePrettyGoodTeam release end CeruleanCity_Gym_EventScript_GymStatue:: lockall goto_if_set FLAG_BADGE02_GET, CeruleanCity_Gym_EventScript_GymStatuePostVictory msgbox CeruleanCity_Gym_Text_GymStatue releaseall end CeruleanCity_Gym_EventScript_GymStatuePostVictory:: msgbox CeruleanCity_Gym_Text_GymStatuePlayerWon releaseall end ================================================ FILE: data/maps/CeruleanCity_Gym/text.inc ================================================ CeruleanCity_Gym_Text_MistyIntro:: .string "Hi, you're a new face!\p" .string "Only those TRAINERS who have a\n" .string "policy about POKéMON can turn pro.\p" .string "What is your approach when you\n" .string "catch and train POKéMON?\p" .string "My policy is an all-out offensive\n" .string "with WATER-type POKéMON!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" CeruleanCity_Gym_Text_ExplainTM03:: .string "TM03 teaches WATER PULSE.\p" .string "Use it on an aquatic POKéMON!$" CeruleanCity_Gym_Text_ExplainCascadeBadge:: .string "The CASCADEBADGE makes all\n" .string "POKéMON up to Lv. 30 obey.\p" .string "That includes even outsiders you\n" .string "got in trades.\p" .string "There's more. You can now use CUT\n" .string "anytime, even out of battle.\p" .string "You can CUT down small trees to\n" .string "open new pathways.\p" .string "You can also have my favorite TM.$" CeruleanCity_Gym_Text_ReceivedTM03FromMisty:: .string "{PLAYER} received TM03\n" .string "from MISTY.$" CeruleanCity_Gym_Text_BetterMakeRoomForThis:: .string "You better make room for this!$" CeruleanCity_Gym_Text_MistyDefeat:: .string "Wow!\n" .string "You're too much!\p" .string "All right!\p" .string "You can have the CASCADEBADGE to\n" .string "show you beat me.$" CeruleanCity_Gym_Text_DianaIntro:: .string "What? You?\n" .string "I'm more than good enough for you!\p" .string "MISTY won't have to be bothered.$" CeruleanCity_Gym_Text_DianaDefeat:: .string "You overwhelmed me!$" CeruleanCity_Gym_Text_DianaPostBattle:: .string "You have to face other TRAINERS\n" .string "to see how good you really are.$" CeruleanCity_Gym_Text_LuisIntro:: .string "Splash!\p" .string "I'm first up!\n" .string "Let's do it!$" CeruleanCity_Gym_Text_LuisDefeat:: .string "That can't be!$" CeruleanCity_Gym_Text_LuisPostBattle:: .string "MISTY is a TRAINER who's going to\n" .string "keep improving.\p" .string "She won't lose to someone like you!$" CeruleanCity_Gym_Text_GymGuyAdvice:: .string "Yo!\n" .string "Champ in the making!\p" .string "Let me give you some advice!\p" .string "The LEADER, MISTY, is a pro who\n" .string "uses WATER-type POKéMON.\p" .string "You can drain all their water with\n" .string "GRASS-type POKéMON.\p" .string "Or, you might use ELECTRIC-type\n" .string "POKéMON and zap them!$" CeruleanCity_Gym_Text_WeMakePrettyGoodTeam:: .string "You beat MISTY!\n" .string "See, what'd I tell ya?\p" .string "You and me, kid, we make a pretty\n" .string "darn-good team!$" CeruleanCity_Gym_Text_GymStatue:: .string "CERULEAN POKéMON GYM\n" .string "LEADER: MISTY\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}$" CeruleanCity_Gym_Text_GymStatuePlayerWon:: .string "CERULEAN POKéMON GYM\n" .string "LEADER: MISTY\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}, {PLAYER}$" ================================================ FILE: data/maps/CeruleanCity_House1/map.json ================================================ { "id": "MAP_CERULEAN_CITY_HOUSE1", "name": "CeruleanCity_House1", "layout": "LAYOUT_CERULEAN_CITY_HOUSE1", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_House1_EventScript_BadgeGuy", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 9, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "0" }, { "x": 3, "y": 8, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "0" }, { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "0" }, { "x": 3, "y": 1, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "8" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCity_House1/scripts.inc ================================================ CeruleanCity_House1_MapScripts:: .byte 0 CeruleanCity_House1_EventScript_BadgeGuy:: lock faceplayer msgbox CeruleanCity_House1_Text_BadgesHaveAmazingSecrets message CeruleanCity_House1_Text_DescribeWhichBadge waitmessage setvar VAR_0x8004, LISTMENU_BADGES special ListMenu waitstate switch VAR_RESULT case 0, CeruleanCity_House1_EventScript_DescribeBoulderBadge case 1, CeruleanCity_House1_EventScript_DescribeCascadeBadge case 2, CeruleanCity_House1_EventScript_DescribeThunderBadge case 3, CeruleanCity_House1_EventScript_DescribeRainbowBadge case 4, CeruleanCity_House1_EventScript_DescribeSoulBadge case 5, CeruleanCity_House1_EventScript_DescribeMarshBadge case 6, CeruleanCity_House1_EventScript_DescribeVolcanoBadge case 7, CeruleanCity_House1_EventScript_DescribeEarthBadge case 8, CeruleanCity_House1_EventScript_StopDescribingBadges case 127, CeruleanCity_House1_EventScript_StopDescribingBadges end CeruleanCity_House1_EventScript_DescribeAnotherBadge:: message CeruleanCity_House1_Text_DescribeWhichBadge waitmessage special ReturnToListMenu waitstate switch VAR_RESULT case 0, CeruleanCity_House1_EventScript_DescribeBoulderBadge case 1, CeruleanCity_House1_EventScript_DescribeCascadeBadge case 2, CeruleanCity_House1_EventScript_DescribeThunderBadge case 3, CeruleanCity_House1_EventScript_DescribeRainbowBadge case 4, CeruleanCity_House1_EventScript_DescribeSoulBadge case 5, CeruleanCity_House1_EventScript_DescribeMarshBadge case 6, CeruleanCity_House1_EventScript_DescribeVolcanoBadge case 7, CeruleanCity_House1_EventScript_DescribeEarthBadge case 8, CeruleanCity_House1_EventScript_StopDescribingBadges case 127, CeruleanCity_House1_EventScript_StopDescribingBadges end CeruleanCity_House1_EventScript_DescribeBoulderBadge:: msgbox CeruleanCity_House1_Text_AttackStatFlash goto CeruleanCity_House1_EventScript_DescribeAnotherBadge end CeruleanCity_House1_EventScript_DescribeCascadeBadge:: msgbox CeruleanCity_House1_Text_ObeyLv30Cut goto CeruleanCity_House1_EventScript_DescribeAnotherBadge end CeruleanCity_House1_EventScript_DescribeThunderBadge:: msgbox CeruleanCity_House1_Text_SpeedStatFly goto CeruleanCity_House1_EventScript_DescribeAnotherBadge end CeruleanCity_House1_EventScript_DescribeRainbowBadge:: msgbox CeruleanCity_House1_Text_ObeyLv50Strength goto CeruleanCity_House1_EventScript_DescribeAnotherBadge end CeruleanCity_House1_EventScript_DescribeSoulBadge:: msgbox CeruleanCity_House1_Text_DefenseStatSurf goto CeruleanCity_House1_EventScript_DescribeAnotherBadge end CeruleanCity_House1_EventScript_DescribeMarshBadge:: msgbox CeruleanCity_House1_Text_ObeyLv70RockSmash goto CeruleanCity_House1_EventScript_DescribeAnotherBadge end CeruleanCity_House1_EventScript_DescribeVolcanoBadge:: msgbox CeruleanCity_House1_Text_SpStatsWaterfall goto CeruleanCity_House1_EventScript_DescribeAnotherBadge end CeruleanCity_House1_EventScript_DescribeEarthBadge:: msgbox CeruleanCity_House1_Text_AllMonsWillObeyYou goto CeruleanCity_House1_EventScript_DescribeAnotherBadge end CeruleanCity_House1_EventScript_StopDescribingBadges:: msgbox CeruleanCity_House1_Text_ComeVisitAnytime release end ================================================ FILE: data/maps/CeruleanCity_House1/text.inc ================================================ CeruleanCity_House1_Text_BadgesHaveAmazingSecrets:: .string "Only skilled TRAINERS can collect\n" .string "POKéMON BADGES.\p" .string "I see you have at least one.\p" .string "Those BADGES have amazing secrets,\n" .string "did you know?$" CeruleanCity_House1_Text_DescribeWhichBadge:: .string "Now then…\p" .string "Which of the eight BADGES should\n" .string "I describe?$" CeruleanCity_House1_Text_ComeVisitAnytime:: .string "Come visit me anytime you wish.$" CeruleanCity_House1_Text_AttackStatFlash:: .string "The ATTACK stat of all your\n" .string "POKéMON increases a little bit.\p" .string "It also lets you use the move\n" .string "FLASH outside of battle.$" CeruleanCity_House1_Text_ObeyLv30Cut:: .string "POKéMON up to Lv. 30 will obey\n" .string "you.\p" .string "That includes even outsiders you\n" .string "obtain in trades.\p" .string "POKéMON of higher levels will\n" .string "be unruly in battle, however.\p" .string "It also lets you use the move\n" .string "CUT outside of battle.$" CeruleanCity_House1_Text_SpeedStatFly:: .string "The SPEED stat of all your\n" .string "POKéMON increases a little bit.\p" .string "It also lets you use the move\n" .string "FLY outside of battle.$" CeruleanCity_House1_Text_ObeyLv50Strength:: .string "POKéMON up to Lv. 50 will obey\n" .string "you.\p" .string "That includes even outsiders you\n" .string "obtain in trades.\p" .string "POKéMON of higher levels will\n" .string "be unruly in battle, however.\p" .string "It also lets you use the move\n" .string "STRENGTH outside of battle.$" CeruleanCity_House1_Text_DefenseStatSurf:: .string "The DEFENSE stat of all your\n" .string "POKéMON increases a little bit.\p" .string "It also lets you use the move\n" .string "SURF outside of battle.$" CeruleanCity_House1_Text_ObeyLv70RockSmash:: .string "POKéMON up to Lv. 70 will obey\n" .string "you.\p" .string "That includes even outsiders you\n" .string "obtain in trades.\p" .string "POKéMON of higher levels will\n" .string "be unruly in battle, however.\p" .string "It also lets you use the move\n" .string "ROCK SMASH outside of battle.$" CeruleanCity_House1_Text_SpStatsWaterfall:: .string "The SP. ATK and SP. DEF stats of\n" .string "all your POKéMON rise a little bit.\p" .string "It also lets you use the move\n" .string "WATERFALL outside of battle.$" CeruleanCity_House1_Text_AllMonsWillObeyYou:: .string "All POKéMON will obey you!$" ================================================ FILE: data/maps/CeruleanCity_House2/map.json ================================================ { "id": "MAP_CERULEAN_CITY_HOUSE2", "name": "CeruleanCity_House2", "layout": "LAYOUT_CERULEAN_CITY_HOUSE2", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_House2_EventScript_Hiker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 7, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_House2_EventScript_Lass", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_YOUNGSTER", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Raticate", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 2, "y": 7, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "1" }, { "x": 3, "y": 7, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "1" }, { "x": 4, "y": 7, "elevation": 1, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "1" }, { "x": 4, "y": 1, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "9" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_House2_EventScript_WallHole" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCity_House2/scripts.inc ================================================ .set LOCALID_RATICATE_MASTER, 3 .set TRAINER, VAR_0x8009 CeruleanCity_House2_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_House2_MapScript_SetMasterTrainerMovementTypes .byte 0 CeruleanCity_House2_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_RATICATE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeruleanCity_House2_MapScript_RaticateMasterMovementType end CeruleanCity_House2_MapScript_RaticateMasterMovementType:: setobjectmovementtype LOCALID_RATICATE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeruleanCity_House2_EventScript_Hiker:: lock faceplayer goto_if_set FLAG_GOT_TM28_FROM_ROCKET, CeruleanCity_House2_EventScript_HikerGotTM28 msgbox CeruleanCity_House2_Text_RocketsStoleTMForDig release end CeruleanCity_House2_EventScript_HikerGotTM28:: msgbox CeruleanCity_House2_Text_TeachDiglettDigWithoutTM release end CeruleanCity_House2_EventScript_Lass:: msgbox CeruleanCity_House2_Text_TeamRocketTryingToDigIntoNoGood, MSGBOX_NPC end CeruleanCity_House2_EventScript_WallHole:: msgbox CeruleanCity_House2_Text_TeamRocketLeftWayOut, MSGBOX_SIGN end ================================================ FILE: data/maps/CeruleanCity_House2/text.inc ================================================ CeruleanCity_House2_Text_RocketsStoleTMForDig:: .string "Those miserable ROCKETS!\p" .string "Look what they've done to my\n" .string "house!\p" .string "They stole a TM for teaching\n" .string "POKéMON how to DIG holes!\p" .string "I was going to use it on a\n" .string "MANKEY or a SANDSHREW…\p" .string "That cost me a bundle, it did!$" CeruleanCity_House2_Text_TeachDiglettDigWithoutTM:: .string "I figure what's lost is lost.\p" .string "I decided to teach DIGLETT how to\n" .string "DIG without a TM.$" CeruleanCity_House2_Text_TeamRocketTryingToDigIntoNoGood:: .string "TEAM ROCKET must be trying to DIG\n" .string "their way into no good!$" CeruleanCity_House2_Text_TeamRocketLeftWayOut:: .string "TEAM ROCKET left a way out!$" ================================================ FILE: data/maps/CeruleanCity_House3/map.json ================================================ { "id": "MAP_CERULEAN_CITY_HOUSE3", "name": "CeruleanCity_House3", "layout": "LAYOUT_HOUSE1", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_House3_EventScript_Dontae", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 7, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_House3_EventScript_OldWoman", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 10, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Poliwhirl", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "2" }, { "x": 4, "y": 7, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "2" }, { "x": 5, "y": 7, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCity_House3/scripts.inc ================================================ .set LOCALID_POLIWHIRL_MASTER, 3 .set TRAINER, VAR_0x8009 CeruleanCity_House3_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_House3_MapScript_SetMasterTrainerMovementTypes .byte 0 CeruleanCity_House3_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_POLIWHIRL callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeruleanCity_House3_MapScript_PoliwhirlMasterMovementType end CeruleanCity_House3_MapScript_PoliwhirlMasterMovementType:: setobjectmovementtype LOCALID_POLIWHIRL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeruleanCity_House3_EventScript_OldWoman:: msgbox CeruleanCity_House3_Text_PleaseTradeWithMyHusband, MSGBOX_NPC end CeruleanCity_House3_EventScript_Dontae:: lock faceplayer setvar VAR_0x8008, INGAME_TRADE_JYNX call EventScript_GetInGameTradeSpeciesInfo goto_if_set FLAG_DID_ZYNX_TRADE, CeruleanCity_House3_EventScript_AlreadyTraded msgbox Trade_Text_DoYouHaveMonWouldYouTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeruleanCity_House3_EventScript_DeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, CeruleanCity_House3_EventScript_DeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, CeruleanCity_House3_EventScript_NotRequestedMon call EventScript_DoInGameTrade msgbox Trade_Text_Thanks setflag FLAG_DID_ZYNX_TRADE release end CeruleanCity_House3_EventScript_DeclineTrade:: msgbox Trade_Text_WellIfYouDontWantTo release end CeruleanCity_House3_EventScript_NotRequestedMon:: bufferspeciesname STR_VAR_1, VAR_0x8009 msgbox Trade_Text_ThisIsntMon release end CeruleanCity_House3_EventScript_AlreadyTraded:: msgbox Trade_Text_HasTradedMonGrownStronger release end ================================================ FILE: data/maps/CeruleanCity_House3/text.inc ================================================ CeruleanCity_House3_Text_PleaseTradeWithMyHusband:: .string "My husband likes trading POKéMON.\p" .string "You're collecting POKéMON for your\n" .string "POKéDEX, aren't you?\p" .string "Would you please trade with him?$" ================================================ FILE: data/maps/CeruleanCity_House4/map.json ================================================ { "id": "MAP_CERULEAN_CITY_HOUSE4", "name": "CeruleanCity_House4", "layout": "LAYOUT_HOUSE1", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "x": 5, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_House4_EventScript_WonderNewsBerryMan", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "12" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCity_House4/scripts.inc ================================================ .set LOCALID_WONDER_NEWS_BERRY_MAN, 1 .set REWARD_TYPE, VAR_0x8004 .set REWARD_ITEM, VAR_0x8008 CeruleanCity_House4_MapScripts:: .byte 0 CeruleanCity_House4_EventScript_WonderNewsBerryMan:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock specialvar REWARD_TYPE, WonderNews_GetRewardInfo copyvar REWARD_ITEM, VAR_RESULT goto_if_eq REWARD_TYPE, NEWS_REWARD_NONE, CeruleanCity_House4_EventScript_NoNews goto_if_eq REWARD_TYPE, NEWS_REWARD_RECV_SMALL, CeruleanCity_House4_EventScript_Reward_RecvSmall goto_if_eq REWARD_TYPE, NEWS_REWARD_RECV_BIG, CeruleanCity_House4_EventScript_Reward_RecvBig goto_if_eq REWARD_TYPE, NEWS_REWARD_WAITING, CeruleanCity_House4_EventScript_Waiting goto_if_eq REWARD_TYPE, NEWS_REWARD_SENT_SMALL, CeruleanCity_House4_EventScript_Reward_SentSmall goto_if_eq REWARD_TYPE, NEWS_REWARD_SENT_BIG, CeruleanCity_House4_EventScript_Reward_SentBig goto_if_eq REWARD_TYPE, NEWS_REWARD_AT_MAX, CeruleanCity_House4_EventScript_AtMax end @ Mystery Gift is not enabled, or the player has no saved Wonder News CeruleanCity_House4_EventScript_NoNews:: msgbox CeruleanCity_House4_Text_NothingEntertaining release end @ Small reward for receiving Wonder News from friend CeruleanCity_House4_EventScript_Reward_RecvSmall:: call CeruleanCity_House4_EventScript_MovementReactionToNews msgbox CeruleanCity_House4_Text_NewNewsInformativeHaveThis giveitem REWARD_ITEM goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries release end @ Big reward for receiving Wonder News from non-friend source CeruleanCity_House4_EventScript_Reward_RecvBig:: call CeruleanCity_House4_EventScript_MovementReactionToNews msgbox CeruleanCity_House4_Text_IncredibleNewsHaveBerries giveitem REWARD_ITEM, 4 goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries release end @ Player has not recently sent Wonder News CeruleanCity_House4_EventScript_Waiting:: applymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_FacePlayer waitmovement 0 msgbox CeruleanCity_House4_Text_WishCouldShareNewsWithOthers release end @ Small reward for sending Wonder News every 1-3 times CeruleanCity_House4_EventScript_Reward_SentSmall:: call CeruleanCity_House4_EventScript_MovementReactionToNews msgbox CeruleanCity_House4_Text_ThanksForSpreadingNewsTakeThis giveitem REWARD_ITEM goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries release end @ Big reward for sending Wonder News every 4th time CeruleanCity_House4_EventScript_Reward_SentBig:: call CeruleanCity_House4_EventScript_MovementReactionToNews msgbox CeruleanCity_House4_Text_MagnificentNewsSpreadHaveBerries giveitem REWARD_ITEM, 4 goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries release end @ Player has hit reward limit and must wait to receive new rewards CeruleanCity_House4_EventScript_AtMax:: applymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_FacePlayer waitmovement 0 msgbox CeruleanCity_House4_Text_EnjoyingMyselfWithAllSortsOfNews release end CeruleanCity_House4_EventScript_MovementReactionToNews:: playse SE_PIN applymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_FacePlayer waitmovement 0 applymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_Delay48 waitmovement 0 return CeruleanCity_House4_EventScript_NoRoomForBerries:: msgbox CeruleanCity_House4_Text_YourBerryPouchIsFull release end ================================================ FILE: data/maps/CeruleanCity_House4/text.inc ================================================ CeruleanCity_House4_Text_NothingEntertaining:: .string "Sigh…\n" .string "Too much time, too little to do…\p" .string "Is nothing entertaining happening\n" .string "anywhere?$" CeruleanCity_House4_Text_NewNewsInformativeHaveThis:: .string "Ah!\n" .string "A new news report!\p" .string "Hmm…\p" .string "I see!\n" .string "That was quite informative!\p" .string "I applaud you for taking interest\n" .string "in the news at your young age.\p" .string "As my thanks for sharing the news\n" .string "with me, I want you to have this.$" CeruleanCity_House4_Text_IncredibleNewsHaveBerries:: .string "Oh, oh!\n" .string "Th-this news report!\p" .string "Hmm…\p" .string "Amazing!\n" .string "What an incredible piece of news!\p" .string "I haven't seen a news story this\n" .string "incredible in too long a time!\p" .string "Thanks for sharing this fantastic\n" .string "news. Have a bunch of BERRIES!$" CeruleanCity_House4_Text_WishCouldShareNewsWithOthers:: .string "It seems such a shame to not share\n" .string "this news with other folks…\p" .string "I wish I could tell someone…\n" .string "Let others know the news…$" CeruleanCity_House4_Text_ThanksForSpreadingNewsTakeThis:: .string "Ah, you've spread the news for me?\p" .string "Good news becomes worthwhile when\n" .string "all sorts of people share it.\p" .string "As my thanks for your spreading\n" .string "the news, take this!$" CeruleanCity_House4_Text_MagnificentNewsSpreadHaveBerries:: .string "You've spread the news some more?\n" .string "Magnificent!\p" .string "That piece of news must be\n" .string "delighted to be passed around so.\p" .string "Yes, indeed!\p" .string "Consider this a show of\n" .string "appreciation from me and the news.\p" .string "I'll give you more BERRIES than\n" .string "I usually do.$" CeruleanCity_House4_Text_EnjoyingMyselfWithAllSortsOfNews:: .string "I'm quite enjoying myself with all\n" .string "sorts of news.\p" .string "Yes, I am satisfied!\n" .string "I won't be bored for a while.$" CeruleanCity_House4_Text_YourBerryPouchIsFull:: .string "Hm? Your BERRY POUCH is full.\n" .string "My gift remains ungiven, then.$" ================================================ FILE: data/maps/CeruleanCity_House5/map.json ================================================ { "id": "MAP_CERULEAN_CITY_HOUSE5", "name": "CeruleanCity_House5", "layout": "LAYOUT_CERULEAN_CITY_HOUSE5", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_House5_EventScript_BerryPowderMan", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 10, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Dragonite", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "13" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 3, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CeruleanCity_House5_EventScript_BerryCrushRankings" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCity_House5/scripts.inc ================================================ .set LOCALID_DRAGONITE_MASTER, 2 .set TRAINER, VAR_0x8009 CeruleanCity_House5_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_House5_MapScript_SetMasterTrainerMovementTypes .byte 0 CeruleanCity_House5_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_DRAGONITE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CeruleanCity_House5_MapScript_DragoniteMasterMovementType end CeruleanCity_House5_MapScript_DragoniteMasterMovementType:: setobjectmovementtype LOCALID_DRAGONITE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CeruleanCity_House5_EventScript_BerryPowderMan:: lock faceplayer goto_if_set FLAG_GOT_POWDER_JAR, CeruleanCity_House5_EventScript_AskToExchangePowder msgbox CeruleanCity_House1_Text_AnyInterestInBerries, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeruleanCity_House5_EventScript_NoInterestInBerries goto_if_unset FLAG_SYS_GOT_BERRY_POUCH, CeruleanCity_House5_EventScript_NoBerries msgbox CeruleanCity_House1_Text_HaveJustTheThing setflag FLAG_GOT_POWDER_JAR giveitem ITEM_POWDER_JAR goto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull msgbox CeruleanCity_House1_Text_GoCrushBerriesAtDirectCorner release end CeruleanCity_House5_EventScript_NoBerries:: msgbox CeruleanCity_House1_Text_WhyMustYouLieNoBerries release end CeruleanCity_House5_EventScript_NoInterestInBerries:: msgbox CeruleanCity_House1_Text_TakeInterestInAllSortsOfThings release end CeruleanCity_House5_EventScript_AskToExchangePowder:: special DisplayBerryPowderVendorMenu msgbox CeruleanCity_House1_Text_HaveYouBroughtBerryPowder goto CeruleanCity_House5_EventScript_ChooseExchangeItem end CeruleanCity_House5_EventScript_ChooseExchangeItem:: message CeruleanCity_House5_Text_ExchangeWithWhat waitmessage setvar VAR_0x8004, LISTMENU_BERRY_POWDER special ListMenu waitstate switch VAR_RESULT case 0, CeruleanCity_House5_EventScript_EnergyPowder case 1, CeruleanCity_House5_EventScript_EnergyRoot case 2, CeruleanCity_House5_EventScript_HealPowder case 3, CeruleanCity_House5_EventScript_RevivalHerb case 4, CeruleanCity_House5_EventScript_Protein case 5, CeruleanCity_House5_EventScript_Iron case 6, CeruleanCity_House5_EventScript_Carbos case 7, CeruleanCity_House5_EventScript_Calcium case 8, CeruleanCity_House5_EventScript_Zinc case 9, CeruleanCity_House5_EventScript_HPUp case 10, CeruleanCity_House5_EventScript_PPUp case 11, CeruleanCity_House5_EventScript_ExitMenu case 127, CeruleanCity_House5_EventScript_ExitMenu end CeruleanCity_House5_EventScript_EnergyPowder:: bufferitemname STR_VAR_1, ITEM_ENERGY_POWDER setvar VAR_0x8008, ITEM_ENERGY_POWDER setvar VAR_0x8009, 50 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_EnergyRoot:: bufferitemname STR_VAR_1, ITEM_ENERGY_ROOT setvar VAR_0x8008, ITEM_ENERGY_ROOT setvar VAR_0x8009, 80 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_HealPowder:: bufferitemname STR_VAR_1, ITEM_HEAL_POWDER setvar VAR_0x8008, ITEM_HEAL_POWDER setvar VAR_0x8009, 50 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_RevivalHerb:: bufferitemname STR_VAR_1, ITEM_REVIVAL_HERB setvar VAR_0x8008, ITEM_REVIVAL_HERB setvar VAR_0x8009, 300 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_Protein:: bufferitemname STR_VAR_1, ITEM_PROTEIN setvar VAR_0x8008, ITEM_PROTEIN setvar VAR_0x8009, 1000 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_Iron:: bufferitemname STR_VAR_1, ITEM_IRON setvar VAR_0x8008, ITEM_IRON setvar VAR_0x8009, 1000 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_Carbos:: bufferitemname STR_VAR_1, ITEM_CARBOS setvar VAR_0x8008, ITEM_CARBOS setvar VAR_0x8009, 1000 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_Calcium:: bufferitemname STR_VAR_1, ITEM_CALCIUM setvar VAR_0x8008, ITEM_CALCIUM setvar VAR_0x8009, 1000 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_Zinc:: bufferitemname STR_VAR_1, ITEM_ZINC setvar VAR_0x8008, ITEM_ZINC setvar VAR_0x8009, 1000 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_HPUp:: bufferitemname STR_VAR_1, ITEM_HP_UP setvar VAR_0x8008, ITEM_HP_UP setvar VAR_0x8009, 1000 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_PPUp:: bufferitemname STR_VAR_1, ITEM_PP_UP setvar VAR_0x8008, ITEM_PP_UP setvar VAR_0x8009, 3000 goto CeruleanCity_House5_EventScript_ExchangePowderForItem end CeruleanCity_House5_EventScript_ExitMenu:: msgbox CeruleanCity_House1_Text_SeeMeIfYoudLikeToTradePowder special RemoveBerryPowderVendorMenu release end CeruleanCity_House5_EventScript_ExchangePowderForItem:: msgbox CeruleanCity_House1_Text_YoullExchangeBerryPowderForItem, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeruleanCity_House5_EventScript_ChooseExchangeItem copyvar VAR_0x8004, VAR_0x8009 specialvar VAR_RESULT, Script_HasEnoughBerryPowder goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House5_EventScript_NotEnoughBerryPowder giveitem VAR_0x8008 goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House5_EventScript_BagIsFull copyvar VAR_0x8004, VAR_0x8009 special Script_TakeBerryPowder special PrintPlayerBerryPowderAmount msgbox CeruleanCity_House1_Text_TradeMoreBerryPowder, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, CeruleanCity_House5_EventScript_ChooseExchangeItem msgbox CeruleanCity_House1_Text_HopeToSeeYouAgain special RemoveBerryPowderVendorMenu release end CeruleanCity_House5_EventScript_BagIsFull:: msgbox Text_BagIsFull special RemoveBerryPowderVendorMenu release end CeruleanCity_House5_EventScript_NotEnoughBerryPowder:: msgbox CeruleanCity_House1_Text_DontHaveEnoughBerryPowder goto CeruleanCity_House5_EventScript_ChooseExchangeItem end CeruleanCity_House5_EventScript_BerryCrushRankings:: lockall goto_if_questlog EventScript_ReleaseEnd special ShowBerryCrushRankings waitstate releaseall end ================================================ FILE: data/maps/CeruleanCity_House5/text.inc ================================================ CeruleanCity_House1_Text_AnyInterestInBerries:: .string "I concoct a variety of medicine\n" .string "from BERRY POWDER.\p" .string "Using good BERRY POWDER, I can\n" .string "make any kind of medicine.\p" .string "Now tell me, have you any interest\n" .string "in BERRIES?$" CeruleanCity_House1_Text_HaveJustTheThing:: .string "Ah, good! For you, then, I have\n" .string "just the thing.$" CeruleanCity_House1_Text_GoCrushBerriesAtDirectCorner:: .string "There's something new on the second\n" .string "floor of POKéMON CENTERS, at the\l" .string "DIRECT CORNER.\p" .string "They installed a Wireless Adapter\n" .string "machine for crushing BERRIES.\p" .string "This is where you come in.\p" .string "I have a favor to ask, one that\n" .string "I can entrust only to you.\p" .string "Could you make BERRY POWDER for\n" .string "me using that machine?\p" .string "Don't forget, the machine is at the\n" .string "DIRECT CORNER of POKéMON CENTERS.\p" .string "I'll concoct medicine for you if\n" .string "you bring me some BERRY POWDER.\p" .string "Don't forget, crush BERRIES into\n" .string "BERRY POWDER and bring it to me.$" CeruleanCity_House1_Text_WhyMustYouLieNoBerries:: .string "Why must you lie to me?\p" .string "How many BERRIES do you have?\n" .string "Not a one!$" CeruleanCity_House1_Text_TakeInterestInAllSortsOfThings:: .string "You have no interest in BERRIES?\p" .string "Young one, it's important to take an\n" .string "interest in all sorts of things.$" CeruleanCity_House1_Text_HaveYouBroughtBerryPowder:: .string "Er-hem! Have you brought me some\n" .string "BERRY POWDER?$" CeruleanCity_House5_Text_ExchangeWithWhat:: .string "With what would you like to \n" .string "exchange it?$" CeruleanCity_House1_Text_YoullExchangeBerryPowderForItem:: .string "Fine, you'll exchange your BERRY\n" .string "POWDER for one {STR_VAR_1}?$" CeruleanCity_House1_Text_DontHaveEnoughBerryPowder:: .string "Hm? You don't have enough\n" .string "BERRY POWDER.$" CeruleanCity_House1_Text_TradeMoreBerryPowder:: .string "This is fine BERRY POWDER indeed.\n" .string "It will make excellent medicine.\p" .string "Would you like to trade more BERRY\n" .string "POWDER for something else?$" CeruleanCity_House1_Text_HopeToSeeYouAgain:: .string "That's fine, then.\n" .string "I'll hope to see you back again.$" CeruleanCity_House1_Text_SeeMeIfYoudLikeToTradePowder:: .string "Come see me if you'd like to trade\n" .string "your BERRY POWDER.$" ================================================ FILE: data/maps/CeruleanCity_Mart/map.json ================================================ { "id": "MAP_CERULEAN_CITY_MART", "name": "CeruleanCity_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "x": 9, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_Mart_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "x": 1, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_Mart_EventScript_Youngster", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "6" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "6" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "6" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCity_Mart/scripts.inc ================================================ CeruleanCity_Mart_MapScripts:: .byte 0 CeruleanCity_Mart_EventScript_Youngster:: msgbox CeruleanCity_Mart_Text_RepelWorksOnWeakMons, MSGBOX_NPC end CeruleanCity_Mart_EventScript_Woman:: msgbox CeruleanCity_Mart_Text_DoYouKnowAboutRareCandy, MSGBOX_NPC end CeruleanCity_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart CeruleanCity_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 CeruleanCity_Mart_Items:: .2byte ITEM_POKE_BALL .2byte ITEM_SUPER_POTION .2byte ITEM_POTION .2byte ITEM_ANTIDOTE .2byte ITEM_PARALYZE_HEAL .2byte ITEM_AWAKENING .2byte ITEM_BURN_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_REPEL .2byte ITEM_NONE release end ================================================ FILE: data/maps/CeruleanCity_Mart/text.inc ================================================ CeruleanCity_Mart_Text_RepelWorksOnWeakMons:: .string "REPEL not only keeps bugs away,\n" .string "it also works on weak POKéMON.\p" .string "Put your strongest POKéMON at the\n" .string "left of the POKéMON LIST.\p" .string "If your first POKéMON is strong,\n" .string "REPEL's effect is boosted.$" CeruleanCity_Mart_Text_DoYouKnowAboutRareCandy:: .string "Do you know about RARE CANDY?\n" .string "They don't sell it in shops.\p" .string "I think it makes POKéMON grow\n" .string "very quickly all of a sudden.$" ================================================ FILE: data/maps/CeruleanCity_PokemonCenter_1F/map.json ================================================ { "id": "MAP_CERULEAN_CITY_POKEMON_CENTER_1F", "name": "CeruleanCity_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKER", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_PokemonCenter_1F_EventScript_Rocker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 4, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 3, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_PokemonCenter_1F_EventScript_Lass", "flag": "0" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 2, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_PokemonCenter_1F_EventScript_PokemonJournalMisty", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 3, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CeruleanCity_PokemonCenter_1F_EventScript_PokemonJournalMisty", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "3" }, { "x": 7, "y": 8, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "3" }, { "x": 8, "y": 8, "elevation": 0, "dest_map": "MAP_CERULEAN_CITY", "dest_warp_id": "3" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_CERULEAN_CITY_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCity_PokemonCenter_1F/scripts.inc ================================================ CeruleanCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 CeruleanCity_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_CERULEAN_CITY end CeruleanCity_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end CeruleanCity_PokemonCenter_1F_EventScript_Gentleman:: msgbox CeruleanCity_PokemonCenter_1F_Text_EveryoneCallsBillPokemaniac, MSGBOX_NPC end CeruleanCity_PokemonCenter_1F_EventScript_Rocker:: msgbox CeruleanCity_PokemonCenter_1F_Text_BillDoesWhateverForRareMons, MSGBOX_NPC end CeruleanCity_PokemonCenter_1F_EventScript_Youngster:: lock faceplayer famechecker FAMECHECKER_BILL, 1 msgbox CeruleanCity_PokemonCenter_1F_Text_BillCollectsRareMons release end CeruleanCity_PokemonCenter_1F_EventScript_Lass:: msgbox CeruleanCity_PokemonCenter_1F_Text_TryTradingUpstairs, MSGBOX_NPC end ================================================ FILE: data/maps/CeruleanCity_PokemonCenter_1F/text.inc ================================================ CeruleanCity_PokemonCenter_1F_Text_BillDoesWhateverForRareMons:: .string "That BILL!\p" .string "I heard that he'll do whatever it\n" .string "takes to get rare POKéMON.\p" .string "He's not above doing all sorts\n" .string "of things, I've heard.$" CeruleanCity_PokemonCenter_1F_Text_EveryoneCallsBillPokemaniac:: .string "Have you heard about BILL?\p" .string "Everyone calls him a POKéMANIAC!\p" .string "I think people are just jealous of\n" .string "BILL, though.\p" .string "Who wouldn't want to boast about\n" .string "their POKéMON?$" CeruleanCity_PokemonCenter_1F_Text_BillCollectsRareMons:: .string "BILL has lots of POKéMON!\n" .string "He collects rare ones, too!$" CeruleanCity_PokemonCenter_1F_Text_TryTradingUpstairs:: .string "Why don't you go upstairs and try\n" .string "trading POKéMON with your friends?\p" .string "You could get a lot more variety\n" .string "by trading.\p" .string "The POKéMON you get in trades grow\n" .string "quickly, too.$" ================================================ FILE: data/maps/CeruleanCity_PokemonCenter_2F/map.json ================================================ { "id": "MAP_CERULEAN_CITY_POKEMON_CENTER_2F", "name": "CeruleanCity_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_CERULEAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_CERULEAN_CITY_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CeruleanCity_PokemonCenter_2F/scripts.inc ================================================ CeruleanCity_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS CeruleanCity_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end CeruleanCity_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end CeruleanCity_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/CinnabarIsland/map.json ================================================ { "id": "MAP_CINNABAR_ISLAND", "name": "CinnabarIsland", "layout": "LAYOUT_CINNABAR_ISLAND", "music": "MUS_CINNABAR", "region_map_section": "MAPSEC_CINNABAR_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ROUTE21_SOUTH" }, { "direction": "right", "offset": 0, "map": "MAP_ROUTE20" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 11, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BILL", "in_connection": false, "x": 19, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_CINNABAR_BILL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 23, "y": 7, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_CINNABAR_SEAGALLOP" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 6, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Exeggutor", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 8, "y": 3, "elevation": 0, "dest_map": "MAP_POKEMON_MANSION_1F", "dest_warp_id": "1" }, { "x": 19, "y": 4, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND_GYM", "dest_warp_id": "1" }, { "x": 8, "y": 9, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE", "dest_warp_id": "1" }, { "x": 14, "y": 11, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "0" }, { "x": 19, "y": 11, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND_MART", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 19, "y": 5, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "CinnabarIsland_EventScript_GymDoorLocked" } ], "bg_events": [ { "type": "sign", "x": 12, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_EventScript_IslandSign" }, { "type": "sign", "x": 9, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_EventScript_PokemonLabSign" }, { "type": "sign", "x": 22, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_EventScript_GymSign" }, { "type": "sign", "x": 10, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_EventScript_PokemonLabSign" } ], "level_scaling": "4" } ================================================ FILE: data/maps/CinnabarIsland/scripts.inc ================================================ .equ LOCALID_BILL, 3 .equ LOCALID_SEAGALLOP, 4 .set LOCALID_EXEGGUTOR_MASTER, 5 .set TRAINER, VAR_0x8009 CinnabarIsland_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, CinnabarIsland_OnFrame .byte 0 CinnabarIsland_OnTransition:: setworldmapflag FLAG_WORLD_MAP_CINNABAR_ISLAND call CinnabarIsland_EventScript_CheckUnlockGym call_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND, 1, CinnabarIsland_EventScript_ReadyObjectsSailToOneIsland call_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND, 3, CinnabarIsland_EventScript_ReadyObjectsReturnFromSeviiIslands call_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_2, 1, CinnabarIsland_EventScript_ReadyObjectsSailToOneIslandFromPokeCenter goto CinnabarIsland_MapScript_SetMasterTrainerMovementTypes end CinnabarIsland_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_EXEGGUTOR callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CinnabarIsland_MapScript_ExeggutorMasterMovementType end CinnabarIsland_MapScript_ExeggutorMasterMovementType:: setobjectmovementtype LOCALID_EXEGGUTOR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CinnabarIsland_EventScript_ReadyObjectsSailToOneIslandFromPokeCenter:: savebgm MUS_FOLLOW_ME setflag FLAG_TEMP_2 setobjectxyperm LOCALID_BILL, 15, 12 setobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_LEFT setobjectxyperm LOCALID_SEAGALLOP, 30, 12 return CinnabarIsland_EventScript_ReadyObjectsSailToOneIsland:: getplayerxy VAR_0x8004, VAR_0x8005 goto_if_ge VAR_0x8004, 18, CinnabarIsland_EventScript_MoveSeagallopDown setflag FLAG_TEMP_2 setobjectxyperm LOCALID_BILL, 18, 12 setobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_UP setobjectxyperm LOCALID_SEAGALLOP, 30, 12 return CinnabarIsland_EventScript_MoveSeagallopDown:: setobjectxyperm LOCALID_SEAGALLOP, 30, 8 return CinnabarIsland_EventScript_ReadyObjectsReturnFromSeviiIslands:: setobjectxyperm LOCALID_BILL, 21, 8 setobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_UP return CinnabarIsland_EventScript_CheckUnlockGym:: goto_if_set FLAG_HIDE_POKEMON_MANSION_B1F_SECRET_KEY, CinnabarIsland_EventScript_UnlockGym return CinnabarIsland_EventScript_UnlockGym:: setvar VAR_TEMP_1, 1 return CinnabarIsland_OnFrame:: map_script_2 VAR_MAP_SCENE_CINNABAR_ISLAND_2, 1, CinnabarIsland_EventScript_ExitPokeCenterForOneIsland map_script_2 VAR_MAP_SCENE_CINNABAR_ISLAND, 1, CinnabarIsland_EventScript_BillScene map_script_2 VAR_MAP_SCENE_CINNABAR_ISLAND, 3, CinnabarIsland_EventScript_ReturnFromSeviiIslands .2byte 0 CinnabarIsland_EventScript_ExitPokeCenterForOneIsland:: lockall clearflag FLAG_DONT_TRANSITION_MUSIC savebgm MUS_DUMMY textcolor NPC_TEXT_COLOR_MALE setvar VAR_MAP_SCENE_CINNABAR_ISLAND_2, 2 delay 20 call CinnabarIsland_EventScript_SailToOneIsland releaseall end CinnabarIsland_EventScript_ReturnFromSeviiIslands:: lockall textcolor NPC_TEXT_COLOR_MALE msgbox CinnabarIsland_Text_IfYouHaveTriPassYouCanGoAgain closemessage applymovement LOCALID_BILL, CinnabarIsland_Movement_BillExit waitmovement 0 removeobject LOCALID_BILL setvar VAR_MAP_SCENE_CINNABAR_ISLAND, 4 setflag FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE clearflag FLAG_HIDE_LOSTELLE_IN_HER_HOME releaseall end CinnabarIsland_Movement_BillExit:: walk_down walk_down walk_down walk_down walk_down walk_down step_end CinnabarIsland_EventScript_BillScene:: lockall textcolor NPC_TEXT_COLOR_MALE call_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BillFacePlayer1 call_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BillFacePlayer2 playse SE_PIN applymovement LOCALID_BILL, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_BILL, Common_Movement_Delay48 waitmovement 0 call_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BillApproachPlayer1 call_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BillApproachPlayer2 msgbox CinnabarIsland_Text_HeyIfItIsntPlayer msgbox CinnabarIsland_Text_ComeWithMeToOneIsland, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, CinnabarIsland_EventScript_AgreeSailToOneIsland goto_if_eq VAR_RESULT, NO, CinnabarIsland_EventScript_DeclineSailToOneIsland end CinnabarIsland_EventScript_BillFacePlayer1:: applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return CinnabarIsland_EventScript_BillFacePlayer2:: applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return CinnabarIsland_EventScript_BillApproachPlayer1:: applymovement LOCALID_BILL, CinnabarIsland_Movement_BillApproachPlayer1 waitmovement 0 return CinnabarIsland_EventScript_BillApproachPlayer2:: applymovement LOCALID_BILL, CinnabarIsland_Movement_BillApproachPlayer2 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return CinnabarIsland_EventScript_AgreeSailToOneIsland:: msgbox CinnabarIsland_Text_AllRightLetsGo closemessage call CinnabarIsland_EventScript_SailToOneIsland releaseall end CinnabarIsland_EventScript_DeclineSailToOneIsland:: msgbox CinnabarIsland_Text_IllBeWaitingInPokeCenter closemessage call_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BillExitToPokeCenter call_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BillReturnToPokeCenter removeobject LOCALID_BILL setvar VAR_MAP_SCENE_CINNABAR_ISLAND, 2 clearflag FLAG_HIDE_CINNABAR_POKECENTER_BILL releaseall end CinnabarIsland_EventScript_BillExitToPokeCenter:: applymovement LOCALID_BILL, CinnabarIsland_Movement_BillExitToPokeCenter waitmovement 0 return CinnabarIsland_Movement_BillExitToPokeCenter:: walk_right walk_right walk_down walk_down walk_down walk_down walk_down walk_down step_end CinnabarIsland_EventScript_BillReturnToPokeCenter:: applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_PlayerWatchBillExit applymovement LOCALID_BILL, CinnabarIsland_Movement_BillApproachDoor waitmovement 0 opendoor 14, 11 waitdooranim applymovement LOCALID_BILL, CinnabarIsland_Movement_BillReEnterPokeCenter waitmovement 0 closedoor 14, 11 waitdooranim return CinnabarIsland_Movement_PlayerWatchBillExit:: walk_left walk_in_place_faster_right step_end CinnabarIsland_Movement_BillApproachDoor:: delay_16 walk_left walk_in_place_faster_up step_end CinnabarIsland_Movement_BillReEnterPokeCenter:: walk_up delay_4 set_invisible step_end @ Can be triggered outside, or after talking to Bill in the poke center CinnabarIsland_EventScript_SailToOneIsland:: call_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_ApproachShore addobject LOCALID_SEAGALLOP call_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BoatArrive call_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BoatArriveExitedPokeCenter msgbox CinnabarIsland_Text_MyPalsBoatArrived closemessage call_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BoardBoat call_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BoardBoatExitedPokeCenter setvar VAR_MAP_SCENE_CINNABAR_ISLAND, 2 removeobject LOCALID_BILL delay 40 setflag FLAG_HIDE_CINNABAR_SEAGALLOP setvar VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 1 setvar VAR_0x8004, SEAGALLOP_CINNABAR_ISLAND setvar VAR_0x8006, SEAGALLOP_ONE_ISLAND goto EventScript_SetSail end CinnabarIsland_EventScript_ApproachShore:: applymovement LOCALID_BILL, CinnabarIsland_Movement_ApproachShore applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_ApproachShore waitmovement 0 return CinnabarIsland_EventScript_BoatArrive:: applymovement LOCALID_BILL, CinnabarIsland_Movement_BillFaceBoat applymovement LOCALID_SEAGALLOP, CinnabarIsland_Movement_BoatArrive waitmovement 0 return CinnabarIsland_EventScript_BoatArriveExitedPokeCenter:: applymovement LOCALID_SEAGALLOP, CinnabarIsland_Movement_BoatArrive waitmovement 0 return CinnabarIsland_EventScript_BoardBoat:: applymovement LOCALID_BILL, CinnabarIsland_Movement_BillBoardBoat applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_PlayerBoardBoat waitmovement 0 return CinnabarIsland_EventScript_BoardBoatExitedPokeCenter:: applymovement LOCALID_BILL, CinnabarIsland_Movement_BillBoardBoatFromShore applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_PlayerBoardBoatFromShore waitmovement 0 return CinnabarIsland_Movement_BoatArrive:: delay_16 delay_16 walk_fast_left walk_fast_left walk_left walk_slower_left walk_slower_left step_end CinnabarIsland_Movement_BillBoardBoat:: walk_right walk_down walk_down walk_right delay_4 set_invisible step_end CinnabarIsland_Movement_BillApproachPlayer1:: walk_up step_end CinnabarIsland_Movement_BillApproachPlayer2:: walk_left walk_left walk_left step_end CinnabarIsland_Movement_BillFaceBoat:: delay_16 delay_16 delay_8 walk_in_place_faster_right step_end CinnabarIsland_Movement_ApproachShore:: walk_right walk_right walk_right walk_right walk_right walk_right step_end CinnabarIsland_Movement_BillBoardBoatFromShore:: walk_right delay_4 set_invisible step_end CinnabarIsland_Movement_PlayerBoardBoat:: walk_down walk_right walk_down walk_down walk_in_place_faster_right delay_4 walk_right delay_4 set_invisible step_end CinnabarIsland_Movement_PlayerBoardBoatFromShore:: walk_right delay_4 walk_right delay_4 set_invisible step_end @ Triggered when VAR_TEMP_1 is 0 CinnabarIsland_EventScript_GymDoorLocked:: lockall applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 20 msgbox CinnabarIsland_Text_DoorIsLocked closemessage applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_ForcePlayerFromDoor waitmovement 0 releaseall end CinnabarIsland_Movement_ForcePlayerFromDoor:: walk_down step_end CinnabarIsland_EventScript_Woman:: lock faceplayer famechecker FAMECHECKER_BLAINE, 3 msgbox CinnabarIsland_Text_BlaineLivedHereSinceBeforeLab release end CinnabarIsland_EventScript_OldMan:: msgbox CinnabarIsland_Text_ScientistsExperimentInMansion, MSGBOX_NPC end CinnabarIsland_EventScript_IslandSign:: msgbox CinnabarIsland_Text_IslandSign, MSGBOX_SIGN end CinnabarIsland_EventScript_PokemonLabSign:: msgbox CinnabarIsland_Text_PokemonLab, MSGBOX_SIGN end CinnabarIsland_EventScript_GymSign:: lockall famechecker FAMECHECKER_BLAINE, 0 msgbox CinnabarIsland_Text_GymSign releaseall end ================================================ FILE: data/maps/CinnabarIsland/text.inc ================================================ CinnabarIsland_Text_DoorIsLocked:: .string "The door is locked…$" CinnabarIsland_Text_BlaineLivedHereSinceBeforeLab:: .string "CINNABAR GYM's BLAINE is quite the\n" .string "odd fellow.\p" .string "He's lived on the island since way\n" .string "before the LAB was built.$" CinnabarIsland_Text_ScientistsExperimentInMansion:: .string "Scientists conduct experiments \n" .string "in the burned-out building.\p" .string "You know, the one they call the\n" .string "POKéMON MANSION.$" CinnabarIsland_Text_IslandSign:: .string "CINNABAR ISLAND\n" .string "The Fiery Town of Burning Desire$" CinnabarIsland_Text_PokemonLab:: .string "POKéMON LAB$" CinnabarIsland_Text_GymSign:: .string "CINNABAR ISLAND POKéMON GYM\n" .string "LEADER: BLAINE\l" .string "The Hotheaded Quiz Master!$" CinnabarIsland_Text_HeyIfItIsntPlayer:: .string "Huh?\n" .string "Hey, if it isn't {PLAYER}!$" CinnabarIsland_Text_ComeWithMeToOneIsland:: .string "Look, it's me, BILL.\n" .string "Long time no see!\p" .string "I hope you're still using my\n" .string "PC system.\p" .string "Well, listen, since we met up here,\n" .string "how about spending time with me?\p" .string "There's this little island in the far\n" .string "south called ONE ISLAND.\p" .string "A friend invited me, so I'm on my\n" .string "way out there.\p" .string "How about it?\n" .string "Do you feel like coming with me?$" CinnabarIsland_Text_AllRightLetsGo:: .string "All right, then.\n" .string "Let's go!$" CinnabarIsland_Text_IllBeWaitingInPokeCenter:: .string "What, are you too busy?\p" .string "Well, all right.\n" .string "The boat hasn't arrived yet anyway.\p" .string "I'll be waiting at the POKéMON\n" .string "CENTER over there.\p" .string "Come see me when you're done with\n" .string "your business here.$" CinnabarIsland_Text_MyPalsBoatArrived:: .string "Looks like my pal's boat arrived,\n" .string "too.\p" .string "He sent it specially here to\n" .string "CINNABAR to pick me up.$" CinnabarIsland_Text_IfYouHaveTriPassYouCanGoAgain:: .string "Hey, wasn't that a long cruise?\p" .string "My buddy CELIO seemed to enjoy\n" .string "your company.\p" .string "I'm sure he'd welcome you if you\n" .string "were to visit him again.\p" .string "If you have a TRI-PASS, you can\n" .string "always take a ferry there from\l" .string "VERMILION PORT.\p" .string "All right, thanks for your company!$" ================================================ FILE: data/maps/CinnabarIsland_Gym/map.json ================================================ { "id": "MAP_CINNABAR_ISLAND_GYM", "name": "CinnabarIsland_Gym", "layout": "LAYOUT_CINNABAR_ISLAND_GYM", "music": "MUS_GYM", "region_map_section": "MAPSEC_CINNABAR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BURGLAR", "x": 25, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Gym_EventScript_Quinn", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 25, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Gym_EventScript_Erik", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 17, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Gym_EventScript_Avery", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BURGLAR", "x": 16, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Gym_EventScript_Ramon", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 16, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Gym_EventScript_Derek", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BURGLAR", "x": 4, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Gym_EventScript_Dusty", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 4, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Gym_EventScript_Zac", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLAINE", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Gym_EventScript_Blaine", "flag": "FLAG_TEMP_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GYM_GUY", "in_connection": false, "x": 24, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Gym_EventScript_GymGuy", "flag": "0" } ], "warp_events": [ { "x": 24, "y": 23, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "1" }, { "x": 25, "y": 23, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "1" }, { "x": 26, "y": 23, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 23, "y": 20, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 27, "y": 20, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 22, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quz1Left" }, { "type": "sign", "x": 23, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quz1Right" }, { "type": "sign", "x": 15, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz2Left" }, { "type": "sign", "x": 16, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz2Right" }, { "type": "sign", "x": 13, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz3Left" }, { "type": "sign", "x": 14, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz3Right" }, { "type": "sign", "x": 13, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz4Left" }, { "type": "sign", "x": 14, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz4Right" }, { "type": "sign", "x": 1, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz5Left" }, { "type": "sign", "x": 2, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz5Right" }, { "type": "sign", "x": 1, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz6Left" }, { "type": "sign", "x": 2, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_Quiz6Right" }, { "type": "sign", "x": 3, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "CinnabarIsland_Gym_EventScript_BlaineFujiPhoto" } ], "level_scaling": "4" } ================================================ FILE: data/maps/CinnabarIsland_Gym/scripts.inc ================================================ .set LOCALID_QUINN, 1 .set LOCALID_AVERY, 3 .set LOCALID_RAMON, 4 .set LOCALID_DEREK, 5 .set LOCALID_DUSTY, 6 .set LOCALID_ZAC, 7 .equ CHECK_VISITOR_STATE, 6 .equ TYPE, VAR_0x8003 .equ ARGUMENT, VAR_0x8004 CinnabarIsland_Gym_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, CinnabarIsland_Gym_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_Gym_OnTransition .byte 0 CinnabarIsland_Gym_OnTransition:: setvar TYPE, CHECK_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_BLAINE callnative UseBattleHouseVar call_if_eq VAR_RESULT, 1, CinnabarIsland_Gym_EventScript_HideBlaine end CinnabarIsland_Gym_EventScript_HideBlaine:: setflag FLAG_TEMP_1 return CinnabarIsland_Gym_OnLoad:: goto_if_set FLAG_DEFEATED_BLAINE, CinnabarIsland_Gym_OnLoadOpenAllDoors call_if_set FLAG_CINNABAR_GYM_QUIZ_1, CinnabarIsland_Gym_OnLoadOpenDoor1 call_if_set FLAG_CINNABAR_GYM_QUIZ_2, CinnabarIsland_Gym_OnLoadOpenDoor2 call_if_set FLAG_CINNABAR_GYM_QUIZ_3, CinnabarIsland_Gym_OnLoadOpenDoor3 call_if_set FLAG_CINNABAR_GYM_QUIZ_4, CinnabarIsland_Gym_OnLoadOpenDoor4 call_if_set FLAG_CINNABAR_GYM_QUIZ_5, CinnabarIsland_Gym_OnLoadOpenDoor5 call_if_set FLAG_CINNABAR_GYM_QUIZ_6, CinnabarIsland_Gym_OnLoadOpenDoor6 end CinnabarIsland_Gym_OnLoadOpenAllDoors:: call CinnabarIsland_Gym_EventScript_OpenDoor1 call CinnabarIsland_Gym_EventScript_OpenDoor2 call CinnabarIsland_Gym_EventScript_OpenDoor3 call CinnabarIsland_Gym_EventScript_OpenDoor4 call CinnabarIsland_Gym_EventScript_OpenDoor5 call CinnabarIsland_Gym_EventScript_OpenDoor6 end CinnabarIsland_Gym_OnLoadOpenDoor1:: call CinnabarIsland_Gym_EventScript_OpenDoor1 return CinnabarIsland_Gym_OnLoadOpenDoor2:: call CinnabarIsland_Gym_EventScript_OpenDoor2 return CinnabarIsland_Gym_OnLoadOpenDoor3:: call CinnabarIsland_Gym_EventScript_OpenDoor3 return CinnabarIsland_Gym_OnLoadOpenDoor4:: call CinnabarIsland_Gym_EventScript_OpenDoor4 return CinnabarIsland_Gym_OnLoadOpenDoor5:: call CinnabarIsland_Gym_EventScript_OpenDoor5 return CinnabarIsland_Gym_OnLoadOpenDoor6:: call CinnabarIsland_Gym_EventScript_OpenDoor6 return CinnabarIsland_Gym_EventScript_Blaine:: famechecker FAMECHECKER_BLAINE, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, CinnabarIsland_Gym_EventScript_Blaine_ChallengeMode trainerbattle_single TRAINER_LEADER_BLAINE, CinnabarIsland_Gym_Text_BlaineIntro, CinnabarIsland_Gym_Text_BlaineDefeat, CinnabarIsland_Gym_EventScript_DefeatedBlaine, NO_MUSIC settrainerflag TRAINER_LEADER_BLAINE_CHALLENGE goto_if_unset FLAG_GOT_TM38_FROM_BLAINE, CinnabarIsland_Gym_EventScript_GiveTM38 msgbox CinnabarIsland_Gym_Text_BlainePostBattle release end CinnabarIsland_Gym_EventScript_Blaine_ChallengeMode:: trainerbattle_single TRAINER_LEADER_BLAINE_CHALLENGE, CinnabarIsland_Gym_Text_BlaineIntro, CinnabarIsland_Gym_Text_BlaineDefeat, CinnabarIsland_Gym_EventScript_DefeatedBlaine, NO_MUSIC settrainerflag TRAINER_LEADER_BLAINE goto_if_unset FLAG_GOT_TM38_FROM_BLAINE, CinnabarIsland_Gym_EventScript_GiveTM38 msgbox CinnabarIsland_Gym_Text_BlainePostBattle release end CinnabarIsland_Gym_EventScript_DefeatedBlaine:: famechecker FAMECHECKER_BLAINE, 1 setflag FLAG_DEFEATED_BLAINE setflag FLAG_BADGE07_GET setrespawn SPAWN_CINNABAR_ISLAND setvar VAR_MAP_SCENE_CINNABAR_ISLAND, 1 clearflag FLAG_HIDE_CINNABAR_BILL set_gym_trainers 7 goto CinnabarIsland_Gym_EventScript_GiveTM38 end CinnabarIsland_Gym_EventScript_GiveTM38:: msgbox CinnabarIsland_Gym_Text_ExplainVolcanoBadge checkitemspace ITEM_TM38 goto_if_eq VAR_RESULT, FALSE, CinnabarIsland_Gym_EventScript_NoRoomForTM38 giveitem_msg CinnabarIsland_Gym_Text_ReceivedTM38FromBlaine, ITEM_TM38 setflag FLAG_GOT_TM38_FROM_BLAINE msgbox CinnabarIsland_Gym_Text_FireBlastIsUltimateFireMove release end CinnabarIsland_Gym_EventScript_NoRoomForTM38:: msgbox CinnabarIsland_Gym_Text_MakeSpaceForThis release end CinnabarIsland_Gym_EventScript_Erik:: trainerbattle_single TRAINER_SUPER_NERD_ERIK, CinnabarIsland_Gym_Text_ErikIntro, CinnabarIsland_Gym_Text_ErikDefeat msgbox CinnabarIsland_Gym_Text_ErikPostBattle, MSGBOX_AUTOCLOSE end CinnabarIsland_Gym_EventScript_Avery:: trainerbattle_single TRAINER_SUPER_NERD_AVERY, CinnabarIsland_Gym_Text_AveryIntro, CinnabarIsland_Gym_Text_AveryDefeat, CinnabarIsland_Gym_EventScript_DefeatedAvery msgbox CinnabarIsland_Gym_Text_AveryPostBattle, MSGBOX_AUTOCLOSE end CinnabarIsland_Gym_EventScript_DefeatedAvery:: call_if_unset FLAG_CINNABAR_GYM_QUIZ_2, CinnabarIsland_Gym_EventScript_Quiz2CompleteTrainer release end CinnabarIsland_Gym_EventScript_Quiz2CompleteTrainer:: call CinnabarIsland_Gym_EventScript_Quiz2Complete return CinnabarIsland_Gym_EventScript_Derek:: trainerbattle_single TRAINER_SUPER_NERD_DEREK, CinnabarIsland_Gym_Text_DerekIntro, CinnabarIsland_Gym_Text_DerekDefeat, CinnabarIsland_Gym_EventScript_DefeatedDerek famechecker FAMECHECKER_BLAINE, 2 msgbox CinnabarIsland_Gym_Text_DerekPostBattle, MSGBOX_AUTOCLOSE end CinnabarIsland_Gym_EventScript_DefeatedDerek:: call_if_unset FLAG_CINNABAR_GYM_QUIZ_4, CinnabarIsland_Gym_EventScript_Quiz4CompleteTrainer release end CinnabarIsland_Gym_EventScript_Quiz4CompleteTrainer:: call CinnabarIsland_Gym_EventScript_Quiz4Complete return CinnabarIsland_Gym_EventScript_Zac:: trainerbattle_single TRAINER_SUPER_NERD_ZAC, CinnabarIsland_Gym_Text_ZacIntro, CinnabarIsland_Gym_Text_ZacDefeat, CinnabarIsland_Gym_EventScript_DefeatedZac msgbox CinnabarIsland_Gym_Text_ZacPostBattle, MSGBOX_AUTOCLOSE end CinnabarIsland_Gym_EventScript_DefeatedZac:: call_if_unset FLAG_CINNABAR_GYM_QUIZ_6, CinnabarIsland_Gym_EventScript_Quiz6CompleteTrainer release end CinnabarIsland_Gym_EventScript_Quiz6CompleteTrainer:: call CinnabarIsland_Gym_EventScript_Quiz6Complete return CinnabarIsland_Gym_EventScript_Quinn:: trainerbattle_single TRAINER_BURGLAR_QUINN, CinnabarIsland_Gym_Text_QuinnIntro, CinnabarIsland_Gym_Text_QuinnDefeat, CinnabarIsland_Gym_EventScript_DefeatedQuinn msgbox CinnabarIsland_Gym_Text_QuinnPostBattle, MSGBOX_AUTOCLOSE end CinnabarIsland_Gym_EventScript_DefeatedQuinn:: call_if_unset FLAG_CINNABAR_GYM_QUIZ_1, CinnabarIsland_Gym_EventScript_Quiz1CompleteTrainer release end CinnabarIsland_Gym_EventScript_Quiz1CompleteTrainer:: call CinnabarIsland_Gym_EventScript_Quiz1Complete return CinnabarIsland_Gym_EventScript_Ramon:: trainerbattle_single TRAINER_BURGLAR_RAMON, CinnabarIsland_Gym_Text_RamonIntro, CinnabarIsland_Gym_Text_RamonDefeat, CinnabarIsland_Gym_EventScript_DefeatedRamon msgbox CinnabarIsland_Gym_Text_RamonPostBattle, MSGBOX_AUTOCLOSE end CinnabarIsland_Gym_EventScript_DefeatedRamon:: call_if_unset FLAG_CINNABAR_GYM_QUIZ_3, CinnabarIsland_Gym_EventScript_Quiz3CompleteTrainer release end CinnabarIsland_Gym_EventScript_Quiz3CompleteTrainer:: call CinnabarIsland_Gym_EventScript_Quiz3Complete return CinnabarIsland_Gym_EventScript_Dusty:: trainerbattle_single TRAINER_BURGLAR_DUSTY, CinnabarIsland_Gym_Text_DustyIntro, CinnabarIsland_Gym_Text_DustyDefeat, CinnabarIsland_Gym_EventScript_DefeatedDusty msgbox CinnabarIsland_Gym_Text_DustyPostBattle, MSGBOX_AUTOCLOSE end CinnabarIsland_Gym_EventScript_DefeatedDusty:: call_if_unset FLAG_CINNABAR_GYM_QUIZ_5, CinnabarIsland_Gym_EventScript_Quiz5CompleteTrainer release end CinnabarIsland_Gym_EventScript_Quiz5CompleteTrainer:: call CinnabarIsland_Gym_EventScript_Quiz5Complete return CinnabarIsland_Gym_EventScript_GymGuy:: lock faceplayer goto_if_set FLAG_DEFEATED_BLAINE, CinnabarIsland_Gym_EventScript_GymGuyPostVictory msgbox CinnabarIsland_Gym_Text_GymGuyAdvice release end CinnabarIsland_Gym_EventScript_GymGuyPostVictory:: msgbox CinnabarIsland_Gym_Text_GymGuyPostVictory release end CinnabarIsland_Gym_EventScript_GymStatue:: lockall goto_if_set FLAG_BADGE07_GET, CinnabarIsland_Gym_EventScript_GymStatuePostVictory msgbox CinnabarIsland_Gym_Text_GymStatue releaseall end CinnabarIsland_Gym_EventScript_GymStatuePostVictory:: msgbox CinnabarIsland_Gym_Text_GymStatuePlayerWon releaseall end CinnabarIsland_Gym_EventScript_Quz1Left:: lockall setvar VAR_TEMP_1, 0 goto CinnabarIsland_Gym_EventScript_Quiz1 end CinnabarIsland_Gym_EventScript_Quz1Right:: lockall setvar VAR_TEMP_1, 1 goto CinnabarIsland_Gym_EventScript_Quiz1 end CinnabarIsland_Gym_EventScript_Quiz1:: msgbox CinnabarIsland_Gym_Text_PokemonQuizRules msgbox CinnabarIsland_Gym_Text_QuizQuestion1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz1Correct goto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz1Incorrect end CinnabarIsland_Gym_EventScript_CorrectAnswer:: playfanfare MUS_LEVEL_UP waitfanfare msgbox CinnabarIsland_Gym_Text_CorrectGoOnThrough return CinnabarIsland_Gym_EventScript_IncorrectAnswer:: waitse playse SE_BOO waitse msgbox CinnabarIsland_Gym_Text_SorryBadCall closemessage return CinnabarIsland_Gym_EventScript_Quiz1Correct:: call CinnabarIsland_Gym_EventScript_CorrectAnswer goto_if_set FLAG_CINNABAR_GYM_QUIZ_1, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz1Complete releaseall end CinnabarIsland_Gym_EventScript_Quiz1Complete:: playse SE_UNLOCK waitse call CinnabarIsland_Gym_EventScript_OpenDoor1 special DrawWholeMapView setflag FLAG_CINNABAR_GYM_QUIZ_1 return CinnabarIsland_Gym_EventScript_DoorAlreadyOpen:: releaseall end CinnabarIsland_Gym_EventScript_Quiz1Incorrect:: call CinnabarIsland_Gym_EventScript_IncorrectAnswer goto_if_not_defeated TRAINER_BURGLAR_QUINN, CinnabarIsland_Gym_EventScript_BattleQuinn releaseall end CinnabarIsland_Gym_EventScript_BattleQuinn:: call_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_QuinnApproachLeft call_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_QuinnApproachRight textcolor NPC_TEXT_COLOR_MALE msgbox CinnabarIsland_Gym_Text_QuinnIntro trainerbattle_no_intro TRAINER_BURGLAR_QUINN, CinnabarIsland_Gym_Text_QuinnDefeat goto_if_set FLAG_CINNABAR_GYM_QUIZ_1, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz1Complete releaseall end CinnabarIsland_Gym_EventScript_QuinnApproachLeft:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_QUINN, CinnabarIsland_Gym_Movement_QuinnApproachLeft waitmovement 0 return CinnabarIsland_Gym_EventScript_QuinnApproachRight:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_QUINN, CinnabarIsland_Gym_Movement_QuinnApproachRight waitmovement 0 return CinnabarIsland_Gym_Movement_QuinnApproachLeft:: walk_left walk_left step_end CinnabarIsland_Gym_Movement_QuinnApproachRight:: walk_left step_end CinnabarIsland_Gym_EventScript_Quiz2Left:: lockall setvar VAR_TEMP_1, 0 goto CinnabarIsland_Gym_EventScript_Quiz2 end CinnabarIsland_Gym_EventScript_Quiz2Right:: lockall setvar VAR_TEMP_1, 1 goto CinnabarIsland_Gym_EventScript_Quiz2 end CinnabarIsland_Gym_EventScript_Quiz2:: msgbox CinnabarIsland_Gym_Text_PokemonQuizRules msgbox CinnabarIsland_Gym_Text_QuizQuestion2, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz2Incorrect goto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz2Correct end CinnabarIsland_Gym_EventScript_Quiz2Correct:: call CinnabarIsland_Gym_EventScript_CorrectAnswer goto_if_set FLAG_CINNABAR_GYM_QUIZ_2, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz2Complete releaseall end CinnabarIsland_Gym_EventScript_Quiz2Complete:: playse SE_UNLOCK waitse call CinnabarIsland_Gym_EventScript_OpenDoor2 special DrawWholeMapView setflag FLAG_CINNABAR_GYM_QUIZ_2 return CinnabarIsland_Gym_EventScript_Quiz2Incorrect:: call CinnabarIsland_Gym_EventScript_IncorrectAnswer goto_if_not_defeated TRAINER_SUPER_NERD_AVERY, CinnabarIsland_Gym_EventScript_BattleAvery releaseall end CinnabarIsland_Gym_EventScript_BattleAvery:: call_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_AveryApproachLeft call_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_AveryApproachRight textcolor NPC_TEXT_COLOR_MALE msgbox CinnabarIsland_Gym_Text_AveryIntro trainerbattle_no_intro TRAINER_SUPER_NERD_AVERY, CinnabarIsland_Gym_Text_AveryDefeat goto_if_set FLAG_CINNABAR_GYM_QUIZ_2, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz2Complete releaseall end CinnabarIsland_Gym_EventScript_AveryApproachLeft:: applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Gym_Movement_PlayerFaceAvery applymovement LOCALID_AVERY, CinnabarIsland_Gym_Movement_AveryApproachLeft waitmovement 0 return CinnabarIsland_Gym_EventScript_AveryApproachRight:: applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Gym_Movement_PlayerFaceAvery applymovement LOCALID_AVERY, CinnabarIsland_Gym_Movement_AveryApproachRight waitmovement 0 return CinnabarIsland_Gym_Movement_AveryApproachLeft:: walk_up walk_up walk_left step_end CinnabarIsland_Gym_Movement_AveryApproachRight:: walk_up walk_up walk_in_place_faster_left step_end CinnabarIsland_Gym_Movement_PlayerFaceAvery:: delay_16 delay_16 walk_in_place_faster_right step_end CinnabarIsland_Gym_EventScript_Quiz3Left:: lockall setvar VAR_TEMP_1, 0 goto CinnabarIsland_Gym_EventScript_Quiz3 end CinnabarIsland_Gym_EventScript_Quiz3Right:: lockall setvar VAR_TEMP_1, 1 goto CinnabarIsland_Gym_EventScript_Quiz3 end CinnabarIsland_Gym_EventScript_Quiz3:: msgbox CinnabarIsland_Gym_Text_PokemonQuizRules msgbox CinnabarIsland_Gym_Text_QuizQuestion3, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz3Incorrect goto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz3Correct end CinnabarIsland_Gym_EventScript_Quiz3Correct:: call CinnabarIsland_Gym_EventScript_CorrectAnswer goto_if_set FLAG_CINNABAR_GYM_QUIZ_3, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz3Complete releaseall end CinnabarIsland_Gym_EventScript_Quiz3Complete:: playse SE_UNLOCK waitse call CinnabarIsland_Gym_EventScript_OpenDoor3 special DrawWholeMapView setflag FLAG_CINNABAR_GYM_QUIZ_3 return CinnabarIsland_Gym_EventScript_Quiz3Incorrect:: call CinnabarIsland_Gym_EventScript_IncorrectAnswer goto_if_not_defeated TRAINER_BURGLAR_RAMON, CinnabarIsland_Gym_EventScript_BattleRamon releaseall end CinnabarIsland_Gym_EventScript_BattleRamon:: call_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_RamonApproachLeft call_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_RamonApproachRight textcolor NPC_TEXT_COLOR_MALE msgbox CinnabarIsland_Gym_Text_RamonIntro trainerbattle_no_intro TRAINER_BURGLAR_RAMON, CinnabarIsland_Gym_Text_RamonDefeat goto_if_set FLAG_CINNABAR_GYM_QUIZ_3, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz3Complete releaseall end CinnabarIsland_Gym_EventScript_RamonApproachLeft:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_RAMON, CinnabarIsland_Gym_Movement_RamonApproachLeft waitmovement 0 return CinnabarIsland_Gym_EventScript_RamonApproachRight:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_RAMON, CinnabarIsland_Gym_Movement_RamonApproachRight waitmovement 0 return CinnabarIsland_Gym_Movement_RamonApproachLeft:: walk_left walk_left step_end CinnabarIsland_Gym_Movement_RamonApproachRight:: walk_left step_end CinnabarIsland_Gym_EventScript_Quiz4Left:: lockall setvar VAR_TEMP_1, 0 goto CinnabarIsland_Gym_EventScript_Quiz4 end CinnabarIsland_Gym_EventScript_Quiz4Right:: lockall setvar VAR_TEMP_1, 1 goto CinnabarIsland_Gym_EventScript_Quiz4 end CinnabarIsland_Gym_EventScript_Quiz4:: msgbox CinnabarIsland_Gym_Text_PokemonQuizRules msgbox CinnabarIsland_Gym_Text_QuizQuestion4, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz4Incorrect goto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz4Correct end CinnabarIsland_Gym_EventScript_Quiz4Correct:: call CinnabarIsland_Gym_EventScript_CorrectAnswer goto_if_set FLAG_CINNABAR_GYM_QUIZ_4, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz4Complete releaseall end CinnabarIsland_Gym_EventScript_Quiz4Complete:: playse SE_UNLOCK waitse call CinnabarIsland_Gym_EventScript_OpenDoor4 special DrawWholeMapView setflag FLAG_CINNABAR_GYM_QUIZ_4 return CinnabarIsland_Gym_EventScript_Quiz4Incorrect:: call CinnabarIsland_Gym_EventScript_IncorrectAnswer goto_if_not_defeated TRAINER_SUPER_NERD_DEREK, CinnabarIsland_Gym_EventScript_BattleDerek releaseall end CinnabarIsland_Gym_EventScript_BattleDerek:: call_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_DerekApproachLeft call_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_DerekApproachRight textcolor NPC_TEXT_COLOR_MALE msgbox CinnabarIsland_Gym_Text_DerekIntro trainerbattle_no_intro TRAINER_SUPER_NERD_DEREK, CinnabarIsland_Gym_Text_DerekDefeat goto_if_set FLAG_CINNABAR_GYM_QUIZ_4, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz4Complete releaseall end CinnabarIsland_Gym_EventScript_DerekApproachLeft:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_DEREK, CinnabarIsland_Gym_Movement_DerekApproachLeft waitmovement 0 return CinnabarIsland_Gym_EventScript_DerekApproachRight:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_DEREK, CinnabarIsland_Gym_Movement_DerekApproachRight waitmovement 0 return CinnabarIsland_Gym_Movement_DerekApproachLeft:: walk_left walk_left step_end CinnabarIsland_Gym_Movement_DerekApproachRight:: walk_left step_end CinnabarIsland_Gym_EventScript_Quiz5Left:: lockall setvar VAR_TEMP_1, 0 goto CinnabarIsland_Gym_EventScript_Quiz5 end CinnabarIsland_Gym_EventScript_Quiz5Right:: lockall setvar VAR_TEMP_1, 1 goto CinnabarIsland_Gym_EventScript_Quiz5 end CinnabarIsland_Gym_EventScript_Quiz5:: msgbox CinnabarIsland_Gym_Text_PokemonQuizRules msgbox CinnabarIsland_Gym_Text_QuizQuestion5, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz5Correct goto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz5Incorrect end CinnabarIsland_Gym_EventScript_Quiz5Correct:: call CinnabarIsland_Gym_EventScript_CorrectAnswer goto_if_set FLAG_CINNABAR_GYM_QUIZ_5, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz5Complete releaseall end CinnabarIsland_Gym_EventScript_Quiz5Complete:: playse SE_UNLOCK waitse call CinnabarIsland_Gym_EventScript_OpenDoor5 special DrawWholeMapView setflag FLAG_CINNABAR_GYM_QUIZ_5 return CinnabarIsland_Gym_EventScript_Quiz5Incorrect:: call CinnabarIsland_Gym_EventScript_IncorrectAnswer goto_if_not_defeated TRAINER_BURGLAR_DUSTY, CinnabarIsland_Gym_EventScript_BattleDusty releaseall end CinnabarIsland_Gym_EventScript_BattleDusty:: call_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_DustyApproachLeft call_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_DustyApproachRight textcolor NPC_TEXT_COLOR_MALE msgbox CinnabarIsland_Gym_Text_DustyIntro trainerbattle_no_intro TRAINER_BURGLAR_DUSTY, CinnabarIsland_Gym_Text_DustyDefeat goto_if_set FLAG_CINNABAR_GYM_QUIZ_5, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz5Complete releaseall end CinnabarIsland_Gym_EventScript_DustyApproachLeft:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_DUSTY, CinnabarIsland_Gym_Movement_DustyApproachLeft waitmovement 0 return CinnabarIsland_Gym_EventScript_DustyApproachRight:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_DUSTY, CinnabarIsland_Gym_Movement_DustyApproachRight waitmovement 0 return CinnabarIsland_Gym_Movement_DustyApproachLeft:: walk_left walk_left step_end CinnabarIsland_Gym_Movement_DustyApproachRight:: walk_left step_end CinnabarIsland_Gym_EventScript_Quiz6Left:: lockall setvar VAR_TEMP_1, 0 goto CinnabarIsland_Gym_EventScript_Quiz6 end CinnabarIsland_Gym_EventScript_Quiz6Right:: lockall setvar VAR_TEMP_1, 1 goto CinnabarIsland_Gym_EventScript_Quiz6 end CinnabarIsland_Gym_EventScript_Quiz6:: msgbox CinnabarIsland_Gym_Text_PokemonQuizRules msgbox CinnabarIsland_Gym_Text_QuizQuestion6, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz6Incorrect goto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz6Correct end CinnabarIsland_Gym_EventScript_Quiz6Correct:: call CinnabarIsland_Gym_EventScript_CorrectAnswer goto_if_set FLAG_CINNABAR_GYM_QUIZ_6, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz6Complete releaseall end CinnabarIsland_Gym_EventScript_Quiz6Complete:: playse SE_UNLOCK waitse call CinnabarIsland_Gym_EventScript_OpenDoor6 special DrawWholeMapView setflag FLAG_CINNABAR_GYM_QUIZ_6 return CinnabarIsland_Gym_EventScript_Quiz6Incorrect:: call CinnabarIsland_Gym_EventScript_IncorrectAnswer goto_if_not_defeated TRAINER_SUPER_NERD_ZAC, CinnabarIsland_Gym_EventScript_BattleZac releaseall end CinnabarIsland_Gym_EventScript_BattleZac:: call_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_ZacApproachLeft call_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_ZacApproachRight textcolor NPC_TEXT_COLOR_MALE msgbox CinnabarIsland_Gym_Text_ZacIntro trainerbattle_no_intro TRAINER_SUPER_NERD_ZAC, CinnabarIsland_Gym_Text_ZacDefeat goto_if_set FLAG_CINNABAR_GYM_QUIZ_6, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen call CinnabarIsland_Gym_EventScript_Quiz6Complete releaseall end CinnabarIsland_Gym_EventScript_ZacApproachLeft:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_ZAC, CinnabarIsland_Gym_Movement_ZacApproachLeft waitmovement 0 return CinnabarIsland_Gym_EventScript_ZacApproachRight:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_ZAC, CinnabarIsland_Gym_Movement_ZacApproachRight waitmovement 0 return CinnabarIsland_Gym_Movement_ZacApproachLeft:: walk_left walk_left step_end CinnabarIsland_Gym_Movement_ZacApproachRight:: walk_left step_end CinnabarIsland_Gym_EventScript_OpenDoor1:: setmetatile 26, 8, METATILE_CinnabarGym_Floor_WallLeftCorner, 0 setmetatile 27, 8, METATILE_CinnabarGym_Floor_WallRightCorner, 0 setmetatile 26, 9, METATILE_CinnabarGym_Floor_WallLeftEdge, 0 setmetatile 27, 9, METATILE_CinnabarGym_Floor_WallRightEdge, 0 setmetatile 26, 10, METATILE_CinnabarGym_Floor_ShadeFull, 0 setmetatile 27, 10, METATILE_CinnabarGym_Floor, 0 setmetatile 28, 10, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0 return CinnabarIsland_Gym_EventScript_OpenDoor2:: setmetatile 17, 8, METATILE_CinnabarGym_Floor_WallLeftCorner, 0 setmetatile 18, 8, METATILE_CinnabarGym_Floor_WallRightCorner, 0 setmetatile 17, 9, METATILE_CinnabarGym_Floor_WallLeftEdge, 0 setmetatile 18, 9, METATILE_CinnabarGym_Floor_WallRightEdge, 0 setmetatile 17, 10, METATILE_CinnabarGym_Floor_ShadeFull, 0 setmetatile 18, 10, METATILE_CinnabarGym_Floor, 0 setmetatile 19, 10, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0 return CinnabarIsland_Gym_EventScript_OpenDoor3:: setmetatile 17, 15, METATILE_CinnabarGym_Floor_WallLeftCorner, 0 setmetatile 18, 15, METATILE_CinnabarGym_Floor_WallRightCorner, 0 setmetatile 17, 16, METATILE_CinnabarGym_Floor_WallLeftEdge, 0 setmetatile 18, 16, METATILE_CinnabarGym_Floor_WallRightEdge, 0 setmetatile 17, 17, METATILE_CinnabarGym_Floor_ShadeFull, 0 setmetatile 18, 17, METATILE_CinnabarGym_Floor, 0 setmetatile 19, 17, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0 return CinnabarIsland_Gym_EventScript_OpenDoor4:: setmetatile 11, 21, METATILE_CinnabarGym_Wall_RetractedBarrier, 1 setmetatile 11, 22, METATILE_CinnabarGym_Floor_ShadeFull, 0 setmetatile 11, 23, METATILE_CinnabarGym_Floor, 0 return CinnabarIsland_Gym_EventScript_OpenDoor5:: setmetatile 5, 16, METATILE_CinnabarGym_Floor_WallLeftCorner, 0 setmetatile 6, 16, METATILE_CinnabarGym_Floor_WallRightCorner, 0 setmetatile 5, 17, METATILE_CinnabarGym_Floor_WallLeftEdge, 0 setmetatile 6, 17, METATILE_CinnabarGym_Floor_WallRightEdge, 0 setmetatile 5, 18, METATILE_CinnabarGym_Floor_ShadeFull, 0 setmetatile 6, 18, METATILE_CinnabarGym_Floor, 0 setmetatile 7, 18, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0 return CinnabarIsland_Gym_EventScript_OpenDoor6:: setmetatile 5, 8, METATILE_CinnabarGym_Floor_WallLeftCorner, 0 setmetatile 6, 8, METATILE_CinnabarGym_Floor_WallRightCorner, 0 setmetatile 5, 9, METATILE_CinnabarGym_Floor_WallLeftEdge, 0 setmetatile 6, 9, METATILE_CinnabarGym_Floor_WallRightEdge, 0 setmetatile 5, 10, METATILE_CinnabarGym_Floor_ShadeFull, 0 setmetatile 6, 10, METATILE_CinnabarGym_Floor, 0 setmetatile 7, 10, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0 return ================================================ FILE: data/maps/CinnabarIsland_Gym/text.inc ================================================ CinnabarIsland_Gym_Text_BlaineIntro:: .string "Hah!\p" .string "I am BLAINE, the red-hot LEADER\n" .string "of CINNABAR GYM!\p" .string "My fiery POKéMON are all rough\n" .string "and ready with intense heat!\p" .string "They incinerate all challengers!\p" .string "Hah!\n" .string "You better have BURN HEAL!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" CinnabarIsland_Gym_Text_BlaineDefeat:: .string "I have burned down to nothing!\n" .string "Not even ashes remain!\p" .string "You have earned the VOLCANOBADGE.$" CinnabarIsland_Gym_Text_FireBlastIsUltimateFireMove:: .string "FIRE BLAST is the ultimate fire\n" .string "technique.\p" .string "Don't waste it on WATER POKéMON.$" CinnabarIsland_Gym_Text_ExplainVolcanoBadge:: .string "Hah!\p" .string "The VOLCANOBADGE heightens the\n" .string "SPECIAL stats of your POKéMON.\p" .string "Here, you can have this, too!$" CinnabarIsland_Gym_Text_ReceivedTM38FromBlaine:: .string "{PLAYER} received TM38\n" .string "from BLAINE.$" CinnabarIsland_Gym_Text_BlainePostBattle:: .string "TM38 contains FIRE BLAST.\n" .string "Teach it to FIRE-type POKéMON.\p" .string "VULPIX or CHARMELEON would be\n" .string "ideal for that move.$" CinnabarIsland_Gym_Text_MakeSpaceForThis:: .string "Make space for this, child!$" CinnabarIsland_Gym_Text_ErikIntro:: .string "Do you know how hot POKéMON fire\n" .string "breath can get?$" CinnabarIsland_Gym_Text_ErikDefeat:: .string "Yow!\n" .string "Hot, hot, hot!$" CinnabarIsland_Gym_Text_ErikPostBattle:: .string "Fire, or to be more precise,\n" .string "combustion…\p" .string "…Oxygen in the air…\n" .string "Blah, blah, blah, blah…$" CinnabarIsland_Gym_Text_QuinnIntro:: .string "I was a thief, but I went straight\n" .string "as a TRAINER.$" CinnabarIsland_Gym_Text_QuinnDefeat:: .string "I surrender!$" CinnabarIsland_Gym_Text_QuinnPostBattle:: .string "I get this uncontrollable urge to\n" .string "steal other people's POKéMON.$" CinnabarIsland_Gym_Text_AveryIntro:: .string "I've studied POKéMON thoroughly.\n" .string "You can't win!$" CinnabarIsland_Gym_Text_AveryDefeat:: .string "Waah!\n" .string "My studies were insufficient!$" CinnabarIsland_Gym_Text_AveryPostBattle:: .string "My theories are too complicated\n" .string "for you to understand.$" CinnabarIsland_Gym_Text_RamonIntro:: .string "I like using FIRE-type POKéMON.\n" .string "I just do.$" CinnabarIsland_Gym_Text_RamonDefeat:: .string "Too hot to handle!$" CinnabarIsland_Gym_Text_RamonPostBattle:: .string "I wish there were a thief POKéMON.\n" .string "I'd use that!$" CinnabarIsland_Gym_Text_DerekIntro:: .string "I know why BLAINE became a\n" .string "TRAINER.$" CinnabarIsland_Gym_Text_DerekDefeat:: .string "Ow!$" CinnabarIsland_Gym_Text_DerekPostBattle:: .string "Our LEADER, BLAINE, became lost\n" .string "in the mountains but good.\p" .string "Night fell when a fiery bird\n" .string "POKéMON appeared.\p" .string "Its light allowed BLAINE to find\n" .string "his way down safely.$" CinnabarIsland_Gym_Text_DustyIntro:: .string "I've been to many GYMS, but this\n" .string "one best suits my style.$" CinnabarIsland_Gym_Text_DustyDefeat:: .string "Yowza!\n" .string "Too hot!$" CinnabarIsland_Gym_Text_DustyPostBattle:: .string "PONYTA, NINETALES…\n" .string "Those are popular FIRE POKéMON.$" CinnabarIsland_Gym_Text_ZacIntro:: .string "Fire is weak against H2O.$" CinnabarIsland_Gym_Text_ZacDefeat:: .string "Oh!\n" .string "Snuffed out!$" CinnabarIsland_Gym_Text_ZacPostBattle:: .string "Water beats fire, of course.\p" .string "But fire melts ice, so the FIRE\n" .string "type beats ICE-type POKéMON.$" CinnabarIsland_Gym_Text_GymGuyAdvice:: .string "Yo!\n" .string "Champ in the making!\p" .string "The hotheaded BLAINE is a FIRE\n" .string "POKéMON pro.\p" .string "Douse his spirits with water!\p" .string "You'd better take some\n" .string "BURN HEALS, too.$" CinnabarIsland_Gym_Text_GymGuyPostVictory:: .string "{PLAYER}!\n" .string "You beat that firebrand!$" CinnabarIsland_Gym_Text_GymStatue:: .string "CINNABAR POKéMON GYM\n" .string "LEADER: BLAINE\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}$" CinnabarIsland_Gym_Text_GymStatuePlayerWon:: .string "CINNABAR POKéMON GYM\n" .string "LEADER: BLAINE\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}, {PLAYER}$" CinnabarIsland_Gym_Text_PokemonQuizRules:: .string "POKéMON Quiz!\p" .string "Get it right, and the door opens to\n" .string "the next room.\p" .string "Get it wrong, and face a TRAINER!\p" .string "If you want to conserve your\n" .string "POKéMON for the GYM LEADER…\p" .string "Then get it right!\n" .string "Here we go!$" CinnabarIsland_Gym_Text_QuizQuestion1:: .string "CATERPIE evolves into METAPOD?$" CinnabarIsland_Gym_Text_QuizQuestion2:: .string "There are nine certified POKéMON\n" .string "LEAGUE BADGES?$" CinnabarIsland_Gym_Text_QuizQuestion3:: .string "POLIWAG evolves three times?$" CinnabarIsland_Gym_Text_QuizQuestion4:: .string "Are electric moves effective\n" .string "against GROUND-type POKéMON?$" CinnabarIsland_Gym_Text_QuizQuestion5:: .string "POKéMON of the same kind and level\n" .string "are not identical?$" CinnabarIsland_Gym_Text_QuizQuestion6:: .string "TM28 contains TOMBSTONY?$" CinnabarIsland_Gym_Text_CorrectGoOnThrough:: .string "You're absolutely correct!\p" .string "Go on through!$" CinnabarIsland_Gym_Text_SorryBadCall:: .string "Sorry!\n" .string "Bad call!$" ================================================ FILE: data/maps/CinnabarIsland_Mart/map.json ================================================ { "id": "MAP_CINNABAR_ISLAND_MART", "name": "CinnabarIsland_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_CINNABAR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Mart_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_Mart_EventScript_Scientist", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "4" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "4" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "4" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CinnabarIsland_Mart/scripts.inc ================================================ CinnabarIsland_Mart_MapScripts:: .byte 0 CinnabarIsland_Mart_EventScript_Woman:: msgbox CinnabarIsland_Mart_Text_DontTheyHaveXAttack, MSGBOX_NPC end CinnabarIsland_Mart_EventScript_Scientist:: msgbox CinnabarIsland_Mart_Text_ExtraItemsNeverHurt, MSGBOX_NPC end CinnabarIsland_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart CinnabarIsland_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 CinnabarIsland_Mart_Items:: .2byte ITEM_ULTRA_BALL .2byte ITEM_GREAT_BALL .2byte ITEM_HYPER_POTION .2byte ITEM_REVIVE .2byte ITEM_FULL_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_MAX_REPEL .2byte ITEM_NONE release end ================================================ FILE: data/maps/CinnabarIsland_Mart/text.inc ================================================ CinnabarIsland_Mart_Text_DontTheyHaveXAttack:: .string "Don't they have X ATTACK?\p" .string "I like it because it raises the\n" .string "ATTACK stat in battle.$" CinnabarIsland_Mart_Text_ExtraItemsNeverHurt:: .string "It never hurts to have extra items.\n" .string "You never know what might happen.$" ================================================ FILE: data/maps/CinnabarIsland_PokemonCenter_1F/map.json ================================================ { "id": "MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F", "name": "CinnabarIsland_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_CINNABAR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonCenter_1F_EventScript_CooltrainerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 2, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonCenter_1F_EventScript_PokemonJournalMrFuji", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 3, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonCenter_1F_EventScript_PokemonJournalMrFuji", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BILL", "in_connection": false, "x": 11, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonCenter_1F_EventScript_Bill", "flag": "FLAG_HIDE_CINNABAR_POKECENTER_BILL" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 7, "y": 8, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "3" }, { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "3" }, { "x": 8, "y": 8, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "3" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CinnabarIsland_PokemonCenter_1F/scripts.inc ================================================ .set LOCALID_BILL, 8 CinnabarIsland_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 CinnabarIsland_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_CINNABAR_ISLAND end CinnabarIsland_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end CinnabarIsland_PokemonCenter_1F_EventScript_Gentleman:: msgbox CinnabarIsland_PokemonCenter_1F_Text_VisitUnionRoom, MSGBOX_NPC end CinnabarIsland_PokemonCenter_1F_EventScript_CooltrainerF:: msgbox CinnabarIsland_PokemonCenter_1F_Text_CinnabarGymLocked, MSGBOX_NPC end CinnabarIsland_PokemonCenter_1F_EventScript_Youngster:: msgbox CinnabarIsland_PokemonCenter_1F_Text_EvolutionCanWaitForNewMoves, MSGBOX_NPC end CinnabarIsland_PokemonCenter_1F_EventScript_Bill:: lock faceplayer msgbox CinnabarIsland_PokemonCenter_1F_Text_ReadyToSailToOneIsland, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonCenter_1F_EventScript_NotReadyToSail msgbox CinnabarIsland_PokemonCenter_1F_Text_LetsGo closemessage playbgm MUS_FOLLOW_ME, 1 savebgm MUS_FOLLOW_ME setflag FLAG_DONT_TRANSITION_MUSIC setflag FLAG_HIDE_CINNABAR_POKECENTER_BILL delay 20 call_if_eq VAR_FACING, DIR_SOUTH, CinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillSouth call_if_eq VAR_FACING, DIR_EAST, CinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillEast call_if_eq VAR_FACING, DIR_WEST, CinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillWest removeobject LOCALID_BILL setvar VAR_MAP_SCENE_CINNABAR_ISLAND_2, 1 clearflag FLAG_HIDE_CINNABAR_BILL warp MAP_CINNABAR_ISLAND, 14, 11 waitstate release end CinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillSouth:: applymovement LOCALID_BILL, CinnabarIsland_PokemonCenter_1F_Movement_BillExit applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_PokemonCenter_1F_Movement_PlayerExitSouth waitmovement 0 return CinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillEast:: applymovement LOCALID_BILL, CinnabarIsland_PokemonCenter_1F_Movement_BillExitEast applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_PokemonCenter_1F_Movement_PlayerExitEast waitmovement 0 return CinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillWest:: applymovement LOCALID_BILL, CinnabarIsland_PokemonCenter_1F_Movement_BillExit applymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_PokemonCenter_1F_Movement_PlayerExitWest waitmovement 0 return CinnabarIsland_PokemonCenter_1F_EventScript_NotReadyToSail:: msgbox CinnabarIsland_PokemonCenter_1F_Text_OhNotDoneYet release end CinnabarIsland_PokemonCenter_1F_Movement_BillExit:: walk_left walk_left walk_left walk_left walk_down walk_down walk_down delay_8 set_invisible step_end CinnabarIsland_PokemonCenter_1F_Movement_PlayerExitSouth:: walk_down walk_left walk_left walk_left walk_left walk_down walk_down delay_16 walk_down step_end CinnabarIsland_PokemonCenter_1F_Movement_BillExitEast:: walk_up walk_left walk_left walk_down walk_left walk_left walk_down walk_down walk_down delay_8 set_invisible step_end CinnabarIsland_PokemonCenter_1F_Movement_PlayerExitEast:: delay_16 delay_16 delay_16 face_left delay_16 walk_left walk_left walk_left walk_down walk_down delay_8 walk_down delay_8 set_invisible step_end CinnabarIsland_PokemonCenter_1F_Movement_PlayerExitWest:: walk_left walk_left walk_left walk_left walk_left walk_down walk_down delay_16 walk_down step_end ================================================ FILE: data/maps/CinnabarIsland_PokemonCenter_1F/text.inc ================================================ CinnabarIsland_PokemonCenter_1F_Text_CinnabarGymLocked:: .string "I came to visit the CINNABAR GYM,\n" .string "but the door is locked tight.\p" .string "There should be a key for it\n" .string "somewhere.\p" .string "Could it be in that burned-out\n" .string "mansion?\p" .string "The GYM LEADER's friend used to\n" .string "live there, they say.$" CinnabarIsland_PokemonCenter_1F_Text_VisitUnionRoom:: .string "Do you have lots of friends?\p" .string "Linking up with the usual friends\n" .string "is fun, of course.\p" .string "But how about visiting the\n" .string "UNION ROOM every so often?\p" .string "Who knows, you may end up making\n" .string "new friends.\p" .string "I think it would be worth your time\n" .string "to check the UNION ROOM.$" CinnabarIsland_PokemonCenter_1F_Text_EvolutionCanWaitForNewMoves:: .string "POKéMON can still learn techniques\n" .string "after canceling evolution.\p" .string "Evolution can wait until new moves\n" .string "have been learned.$" CinnabarIsland_PokemonCenter_1F_Text_ReadyToSailToOneIsland:: .string "BILL: Hey, you kept me waiting!\n" .string "Ready to set sail to ONE ISLAND?$" CinnabarIsland_PokemonCenter_1F_Text_OhNotDoneYet:: .string "Oh, you're still not done yet?$" CinnabarIsland_PokemonCenter_1F_Text_LetsGo:: .string "Well, that's it.\n" .string "Let's go!$" ================================================ FILE: data/maps/CinnabarIsland_PokemonCenter_2F/map.json ================================================ { "id": "MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F", "name": "CinnabarIsland_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_CINNABAR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CinnabarIsland_PokemonCenter_2F/scripts.inc ================================================ CinnabarIsland_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS CinnabarIsland_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end CinnabarIsland_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end CinnabarIsland_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_Entrance/map.json ================================================ { "id": "MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE", "name": "CinnabarIsland_PokemonLab_Entrance", "layout": "LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE", "music": "MUS_CINNABAR", "region_map_section": "MAPSEC_CINNABAR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonLab_Entrance_EventScript_Scientist", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 9, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "2" }, { "x": 4, "y": 9, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "2" }, { "x": 5, "y": 9, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "2" }, { "x": 13, "y": 5, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE", "dest_warp_id": "0" }, { "x": 19, "y": 5, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM", "dest_warp_id": "0" }, { "x": 25, "y": 5, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_PokemonLab_Entrance_EventScript_DrFujiPhoto" }, { "type": "sign", "x": 12, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_PokemonLab_Entrance_EventScript_MeetingRoomSign" }, { "type": "sign", "x": 18, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_PokemonLab_Entrance_EventScript_RAndDRoomSign" }, { "type": "sign", "x": 24, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_PokemonLab_Entrance_EventScript_TestingRoomSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_Entrance/scripts.inc ================================================ CinnabarIsland_PokemonLab_Entrance_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_PokemonLab_Entrance_OnTransition .byte 0 CinnabarIsland_PokemonLab_Entrance_OnTransition:: call_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1, CinnabarIsland_PokemonLab_Entrance_EventScript_ReadyFossil end CinnabarIsland_PokemonLab_Entrance_EventScript_ReadyFossil:: setvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 2 return CinnabarIsland_PokemonLab_Entrance_EventScript_Scientist:: callnative CheckPlayerTrappedOnCinnabar goto_if_ne VAR_RESULT, 0, CinnabarIsland_PokemonLab_Entrance_EventScript_Trapped msgbox CinnabarIsland_PokemonLab_Entrance_Text_StudyMonsExtensively, MSGBOX_NPC end CinnabarIsland_PokemonLab_Entrance_EventScript_Trapped:: lock faceplayer copyvar VAR_0x8005, VAR_RESULT msgbox CinnabarIsland_PokemonLab_Entrance_Text_Trapped, MSGBOX_DEFAULT givemon SPECIES_TENTACOOL, 15, ITEM_NONE copyvar VAR_0x8007, VAR_RESULT goto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_Entrance_EventScript_GetTentacoolParty goto_if_eq VAR_RESULT, 1, CinnabarIsland_PokemonLab_Entrance_EventScript_GetTentacoolPC goto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon release end CinnabarIsland_PokemonLab_Entrance_EventScript_GetTentacoolParty:: textcolor 3 playfanfare MUS_LEVEL_UP message CinnabarIsland_PokemonLab_Entrance_Text_ObtainedATentacool waitmessage waitfanfare bufferspeciesname STR_VAR_1, SPECIES_TENTACOOL callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, CinnabarIsland_PokemonLab_Entrance_EventScript_NicknameTentacoolParty msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03 CinnabarIsland_PokemonLab_Entrance_EventScript_NicknameTentacoolParty:: call EventScript_GetGiftMonPartySlot call EventScript_ChangePokemonNickname goto CinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03 end CinnabarIsland_PokemonLab_Entrance_EventScript_GetTentacoolPC:: textcolor 3 playfanfare MUS_LEVEL_UP message CinnabarIsland_PokemonLab_Entrance_Text_ObtainedATentacool waitmessage waitfanfare bufferspeciesname STR_VAR_1, SPECIES_TENTACOOL setvar VAR_TEMP_1, SPECIES_TENTACOOL callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, CinnabarIsland_PokemonLab_Entrance_EventScript_NicknameTentacoolPC msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO call_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_Entrance_EventScript_TransferTentacoolToPC CinnabarIsland_PokemonLab_Entrance_EventScript_NicknameTentacoolPC:: call EventScript_NameReceivedBoxMon call EventScript_TransferredToPC goto CinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03 end CinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03:: goto_if_ne VAR_0x8005, 1, CinnabarIsland_PokemonLab_Entrance_EventScript_TeachSurf release end CinnabarIsland_PokemonLab_Entrance_EventScript_TeachSurf:: callnative TeachTrappedTentacoolSurf release end CinnabarIsland_PokemonLab_Entrance_EventScript_TransferTentacoolToPC:: call EventScript_TransferredToPC goto CinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03 end CinnabarIsland_PokemonLab_Entrance_Text_Trapped:: .string "Huh? Do you happen to…\n" .string "not have a POKéMON that can SURF?\p" .string "That must be hard on you.\n" .string "…\p" .string "Don't worry about it!\n" .string "I'll give you a TENTACOOL!\p" .string "I just caught a little too many.\n" .string "I was going to release it,\l" .string "so take it. Go ahead!$" CinnabarIsland_PokemonLab_Entrance_Text_ObtainedATentacool:: .string "{PLAYER} received\n" .string "the TENTACOOL!$" CinnabarIsland_PokemonLab_Entrance_EventScript_DrFujiPhoto:: msgbox CinnabarIsland_PokemonLab_Entrance_Text_PhotoOfLabFounderDrFuji, MSGBOX_SIGN end CinnabarIsland_PokemonLab_Entrance_EventScript_MeetingRoomSign:: msgbox CinnabarIsland_PokemonLab_Entrance_Text_MeetingRoomSign, MSGBOX_SIGN end CinnabarIsland_PokemonLab_Entrance_EventScript_RAndDRoomSign:: msgbox CinnabarIsland_PokemonLab_Entrance_Text_RAndDRoomSign, MSGBOX_SIGN end CinnabarIsland_PokemonLab_Entrance_EventScript_TestingRoomSign:: msgbox CinnabarIsland_PokemonLab_Entrance_Text_TestingRoomSign, MSGBOX_SIGN end ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_Entrance/text.inc ================================================ CinnabarIsland_Gym_Text_PhotoOfBlaineAndFuji:: .string "It's a photo of BLAINE and\n" .string "MR. FUJI.\p" .string "They're standing shoulder to\n" .string "shoulder with big grins.$" CinnabarIsland_PokemonLab_Entrance_Text_StudyMonsExtensively:: .string "We study POKéMON extensively\n" .string "every day.\p" .string "People often bring us rare POKéMON\n" .string "for examination.$" CinnabarIsland_PokemonLab_Entrance_Text_PhotoOfLabFounderDrFuji:: .string "A photo of the LAB's founder…\n" .string "DR. FUJI?!$" CinnabarIsland_PokemonLab_Entrance_Text_MeetingRoomSign:: .string "POKéMON LAB\n" .string "Meeting Room$" CinnabarIsland_PokemonLab_Entrance_Text_RAndDRoomSign:: .string "POKéMON LAB\n" .string "R & D Room$" CinnabarIsland_PokemonLab_Entrance_Text_TestingRoomSign:: .string "POKéMON LAB\n" .string "Testing Room$" ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/map.json ================================================ { "id": "MAP_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM", "name": "CinnabarIsland_PokemonLab_ExperimentRoom", "layout": "LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM", "music": "MUS_CINNABAR", "region_map_section": "MAPSEC_CINNABAR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 11, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_Garett", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 12, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 1, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Omastar", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_SelfdestructTutor", "flag": "0" } ], "warp_events": [ { "x": 7, "y": 9, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/scripts.inc ================================================ .equ HELIX_FOSSIL, 1 .equ DOME_FOSSIL, 2 .equ OLD_AMBER, 3 .set LOCALID_OMASTAR_MASTER, 3 .set TRAINER, VAR_0x8009 CinnabarIsland_PokemonLab_ExperimentRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_PokemonLab_ExperimentRoom_MapScript_SetMasterTrainerMovementTypes .byte 0 CinnabarIsland_PokemonLab_ExperimentRoom_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_OMASTAR callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, CinnabarIsland_PokemonLab_ExperimentRoom_MapScript_OmastarMasterMovementType end CinnabarIsland_PokemonLab_ExperimentRoom_MapScript_OmastarMasterMovementType:: setobjectmovementtype LOCALID_OMASTAR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_Garett:: lock faceplayer setvar VAR_0x8008, INGAME_TRADE_SEEL call EventScript_GetInGameTradeSpeciesInfo goto_if_set FLAG_DID_SEELOR_TRADE, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_AlreadyTraded msgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NotRequestedMon call EventScript_DoInGameTrade msgbox Trade_Text_HeyThanks setflag FLAG_DID_SEELOR_TRADE release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineTrade:: msgbox Trade_Text_AwwOhWell release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NotRequestedMon:: bufferspeciesname STR_VAR_1, VAR_0x8009 msgbox Trade_Text_WhatThatsNoMon release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_AlreadyTraded:: msgbox Trade_Text_IsntMyOldMonGreat release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist:: lock faceplayer setvar VAR_RESULT, FALSE goto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 2, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveRevivedMon goto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilStillReviving checkitem ITEM_HELIX_FOSSIL, 1 copyvar VAR_0x800A, VAR_RESULT checkitem ITEM_DOME_FOSSIL, 1 copyvar VAR_0x800B, VAR_RESULT checkitem ITEM_OLD_AMBER, 1 copyvar VAR_0x8007, VAR_RESULT goto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_1 goto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_1 goto_if_ne VAR_0x8007, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_1 msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil return CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_1: goto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_27 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_24: goto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_23 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_21: goto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_20 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_19: goto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_11 goto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_16 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_15: goto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_13 message CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe waitmessage multichoice 0, 0, MULTICHOICE_AMBER, FALSE goto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_55 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_54: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil return CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_8: message CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe waitmessage multichoice 0, 0, MULTICHOICE_HELIX_DOME_AMBER, FALSE switch VAR_RESULT case 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_34 case 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_33 case 2, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_35 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_31: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil return CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_9: message CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe waitmessage multichoice 0, 0, MULTICHOICE_HELIX_DOME, FALSE switch VAR_RESULT case 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_39 case 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_38 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_36: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil return CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_10: message CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe waitmessage multichoice 0, 0, MULTICHOICE_HELIX_AMBER, FALSE switch VAR_RESULT case 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_42 case 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_43 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_40: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil return CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_11: message CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe waitmessage multichoice 0, 0, MULTICHOICE_HELIX, FALSE compare VAR_RESULT, 0 goto_if_eq CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_45 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_44: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil return CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_12: message CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe waitmessage multichoice 0, 0, MULTICHOICE_DOME_AMBER, FALSE switch VAR_RESULT case 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_49 case 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_50 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_47: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil return CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_13: message CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe waitmessage multichoice 0, 0, MULTICHOICE_DOME, FALSE compare VAR_RESULT, 0 goto_if_eq CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_52 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_51: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil return CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_16: goto_if_ne VAR_0x8007, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_12 goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_15 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_20: goto_if_ne VAR_0x8007, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_10 goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_19 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_23: goto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_9 goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_21 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_26: goto_if_ne VAR_0x8007, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_8 goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_24 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_27: goto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_26 goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_24 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_33: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_31 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_34: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_31 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_35: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_31 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_38: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_36 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_39: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_36 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_42: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_40 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_43: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_40 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_45: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_44 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_49: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_47 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_50: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_47 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_52: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_51 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_55: goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_54 CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil:: bufferspeciesname STR_VAR_1, SPECIES_OMANYTE bufferitemname STR_VAR_2, ITEM_HELIX_FOSSIL msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_ThatFossilIsOfMonMakeItLiveAgain, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineReviveFossil msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_HandedFossilToWeirdDoctor textcolor NPC_TEXT_COLOR_MALE removeitem ITEM_HELIX_FOSSIL msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk setvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1 setvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, HELIX_FOSSIL release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil:: bufferspeciesname STR_VAR_1, SPECIES_KABUTO bufferitemname STR_VAR_2, ITEM_DOME_FOSSIL msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_ThatFossilIsOfMonMakeItLiveAgain, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineReviveFossil msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_HandedFossilToWeirdDoctor textcolor NPC_TEXT_COLOR_MALE removeitem ITEM_DOME_FOSSIL msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk setvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1 setvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, DOME_FOSSIL release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber:: bufferspeciesname STR_VAR_1, SPECIES_AERODACTYL bufferitemname STR_VAR_2, ITEM_OLD_AMBER msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_ThatFossilIsOfMonMakeItLiveAgain, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineReviveFossil msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_HandedFossilToWeirdDoctor textcolor NPC_TEXT_COLOR_MALE removeitem ITEM_OLD_AMBER msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk setvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1 setvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, OLD_AMBER release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineReviveFossil:: msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_YouComeAgain release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilStillReviving:: msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveRevivedMon:: goto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, HELIX_FOSSIL, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveOmanyte goto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, DOME_FOSSIL, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveKabuto goto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, OLD_AMBER, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveAerodactyl end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveOmanyte:: setvar VAR_TEMP_1, SPECIES_OMANYTE bufferspeciesname STR_VAR_1, SPECIES_OMANYTE msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_FossilMonBackToLife givemon SPECIES_OMANYTE, 5 goto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon setflag FLAG_REVIVED_HELIX goto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonParty goto_if_eq VAR_RESULT, 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonPC end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveKabuto:: setvar VAR_TEMP_1, SPECIES_KABUTO bufferspeciesname STR_VAR_1, SPECIES_KABUTO msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_FossilMonBackToLife givemon SPECIES_KABUTO, 5 goto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon setflag FLAG_REVIVED_DOME goto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonParty goto_if_eq VAR_RESULT, 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonPC end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveAerodactyl:: setvar VAR_TEMP_1, SPECIES_AERODACTYL bufferspeciesname STR_VAR_1, SPECIES_AERODACTYL msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_FossilMonBackToLife givemon SPECIES_AERODACTYL, 5 goto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon setflag FLAG_REVIVED_AMBER goto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonParty goto_if_eq VAR_RESULT, 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonPC end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonParty:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message CinnabarIsland_PokemonLab_ExperimentRoom_Text_ReceivedMonFromDoctor waitmessage waitfanfare setvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 0 callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameFossilParty msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_EndGiveMon CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameFossilParty:: call EventScript_GetGiftMonPartySlot call EventScript_ChangePokemonNickname goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_EndGiveMon end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonPC:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message CinnabarIsland_PokemonLab_ExperimentRoom_Text_ReceivedMonFromDoctor waitmessage waitfanfare setvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 0 callnative CheckNuzlockeMode compare VAR_RESULT, TRUE goto_if_eq CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameFossilPC msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_MonSentToPC CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameFossilPC:: call EventScript_NameReceivedBoxMon goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_MonSentToPC end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_MonSentToPC:: call EventScript_TransferredToPC goto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_EndGiveMon end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_EndGiveMon:: release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_RevivedAllFossils:: msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_YouComeAgain release end CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil:: msgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_NoIsTooBad release end ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/text.inc ================================================ Text_MetronomeTeach:: .string "Tch-tch-tch!\n" .string "I'll teach you a nifty move.\p" .string "Teach it to a POKéMON, and watch\n" .string "the fun unfold!\p" .string "It's a move called METRONOME.\n" .string "Does it strike your fancy?$" Text_MetronomeDeclined:: .string "I tell you, it's a lot of fun!$" Text_MetronomeWhichMon:: .string "Okay!\n" .string "Which POKéMON should I teach?$" Text_MetronomeTaught:: .string "Tch-tch-tch!\n" .string "That's the sound of a METRONOME.\p" .string "It tweaks your POKéMON's brain into\n" .string "using moves it doesn't even know.$" Text_MetronomeReteach:: .string "Tch-tch-tch!\n" .string "The METRONOME ticks eternally!\p" .string "I'll teach you METRONOME again\n" .string "in exchange for ¥5000.$" Text_MetronomeReteach2:: .string "Tch-tch-tch!\n" .string "Let me teach METRONOME?$" Text_MetronomeNotEnoughMoney:: .string "Tch-tch-tch!\p" .string "Time is money, and you don't\n" .string "have enough!$" CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe:: .string "Hiya!\p" .string "I am important doctor.\n" .string "Yes, very much so, indeed.\p" .string "Here, I study rare POKéMON fossils.\n" .string "All the time, I study.\p" .string "You!\n" .string "Have you a fossil for me?$" CinnabarIsland_PokemonLab_ExperimentRoom_Text_NoIsTooBad:: .string "No!\n" .string "Is too bad!$" CinnabarIsland_PokemonLab_ExperimentRoom_Text_FossilMonBackToLife:: .string "You late.\n" .string "Where were you?\p" .string "Your fossil is back to life!\n" .string "It was {STR_VAR_1} like I think!$" CinnabarIsland_PokemonLab_ExperimentRoom_Text_ReceivedMonFromDoctor:: .string "{PLAYER} received the {STR_VAR_1}\n" .string "from the doctor.$" CinnabarIsland_PokemonLab_ExperimentRoom_Text_ThatFossilIsOfMonMakeItLiveAgain:: .string "Oh!\n" .string "That is {STR_VAR_2}, it is!\p" .string "It is fossil of {STR_VAR_1},\n" .string "a POKéMON that is already extinct!\p" .string "My Resurrection Machine will make\n" .string "that POKéMON live again!$" @ TODO: Resolve text dump error below? CinnabarIsland_PokemonLab_ExperimentRoom_Text_HandedFossilToWeirdDoctor:: .string "So!\n" .string "You hurry and give me that!\p" .string "{FONT_NORMAL}{PLAYER} handed over the\n" .string "{STR_VAR_2} to the weird doctor.$" CinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk:: .string "I take a little time!\n" .string "You go for walk a little while!$" CinnabarIsland_PokemonLab_ExperimentRoom_Text_YouComeAgain:: .string "Aiyah!\n" .string "You come again!$" ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_Lounge/map.json ================================================ { "id": "MAP_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE", "name": "CinnabarIsland_PokemonLab_Lounge", "layout": "LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE", "music": "MUS_CINNABAR", "region_map_section": "MAPSEC_CINNABAR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 5, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonLab_Lounge_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "x": 4, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonLab_Lounge_EventScript_Clifton", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 10, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonLab_Lounge_EventScript_Norma", "flag": "0" } ], "warp_events": [ { "x": 7, "y": 9, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_Lounge/scripts.inc ================================================ CinnabarIsland_PokemonLab_Lounge_MapScripts:: .byte 0 CinnabarIsland_PokemonLab_Lounge_EventScript_Scientist:: msgbox CinnabarIsland_PokemonLab_Lounge_Text_FoundFossilInMtMoon, MSGBOX_NPC end CinnabarIsland_PokemonLab_Lounge_EventScript_Clifton:: lock faceplayer setvar VAR_0x8008, INGAME_TRADE_ELECTRODE call EventScript_GetInGameTradeSpeciesInfo goto_if_set FLAG_DID_ESPHERE_TRADE, CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonAlreadyTraded msgbox Trade_Text_DoYouHaveMonWouldYouTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonDeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonDeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonNotRequestedMon call EventScript_DoInGameTrade msgbox Trade_Text_Thanks setflag FLAG_DID_ESPHERE_TRADE release end CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonDeclineTrade:: msgbox Trade_Text_WellIfYouDontWantTo release end CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonNotRequestedMon:: bufferspeciesname STR_VAR_1, VAR_0x8009 msgbox Trade_Text_ThisIsntMon release end CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonAlreadyTraded:: msgbox Trade_Text_HasTradedMonGrownStronger release end CinnabarIsland_PokemonLab_Lounge_EventScript_Norma:: lock faceplayer setvar VAR_0x8008, INGAME_TRADE_TANGELA copyvar VAR_0x8004, VAR_0x8008 specialvar VAR_RESULT, GetInGameTradeSpeciesInfo copyvar VAR_0x8009, VAR_RESULT goto_if_set FLAG_DID_TANGENY_TRADE, CinnabarIsland_PokemonLab_Lounge_EventScript_NormaAlreadyTraded msgbox Trade_Text_DoYouHaveMonWantToTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_Lounge_EventScript_NormaDeclineTrade special ChoosePartyMon waitstate copyvar VAR_0x800A, VAR_0x8004 goto_if_ge VAR_0x8004, PARTY_SIZE, CinnabarIsland_PokemonLab_Lounge_EventScript_NormaDeclineTrade copyvar VAR_0x8005, VAR_0x800A specialvar VAR_RESULT, GetTradeSpecies copyvar VAR_0x800B, VAR_RESULT goto_if_ne VAR_RESULT, VAR_0x8009, CinnabarIsland_PokemonLab_Lounge_EventScript_NormaNotRequestedMon copyvar VAR_0x8004, VAR_0x8008 copyvar VAR_0x8005, VAR_0x800A special CreateInGameTradePokemon special DoInGameTradeScene waitstate msgbox Trade_Text_ThanksYoureAPal setflag FLAG_DID_TANGENY_TRADE release end CinnabarIsland_PokemonLab_Lounge_EventScript_NormaDeclineTrade:: msgbox Trade_Text_ThatsTooBad release end CinnabarIsland_PokemonLab_Lounge_EventScript_NormaNotRequestedMon:: bufferspeciesname STR_VAR_1, VAR_0x8009 msgbox Trade_Text_ThisIsNoMon release end CinnabarIsland_PokemonLab_Lounge_EventScript_NormaAlreadyTraded:: msgbox Trade_Text_HowIsMyOldMon release end ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_Lounge/text.inc ================================================ CinnabarIsland_PokemonLab_Lounge_Text_FoundFossilInMtMoon:: .string "I found this most remarkable fossil\n" .string "inside MT. MOON.\p" .string "I think it's of a rare, prehistoric\n" .string "POKéMON.$" ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_ResearchRoom/map.json ================================================ { "id": "MAP_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM", "name": "CinnabarIsland_PokemonLab_ResearchRoom", "layout": "LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM", "music": "MUS_CINNABAR", "region_map_section": "MAPSEC_CINNABAR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonLab_ResearchRoom_EventScript_MetronomeTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 10, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CinnabarIsland_PokemonLab_ResearchRoom_EventScript_Scientist", "flag": "0" } ], "warp_events": [ { "x": 7, "y": 9, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE", "dest_warp_id": "4" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 6, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_PokemonLab_ResearchRoom_EventScript_AmberPipe" }, { "type": "sign", "x": 3, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "CinnabarIsland_PokemonLab_ResearchRoom_EventScript_Computer" } ], "level_scaling": "0" } ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_ResearchRoom/scripts.inc ================================================ CinnabarIsland_PokemonLab_ResearchRoom_MapScripts:: .byte 0 CinnabarIsland_PokemonLab_ResearchRoom_EventScript_MetronomeTutor:: goto EventScript_MetronomeTutor end CinnabarIsland_PokemonLab_ResearchRoom_EventScript_Scientist:: msgbox CinnabarIsland_PokemonLab_ResearchRoom_Text_EeveeCanEvolveIntroThreeMons, MSGBOX_NPC end CinnabarIsland_PokemonLab_ResearchRoom_EventScript_Computer:: msgbox CinnabarIsland_PokemonLab_ResearchRoom_Text_LegendaryBirdEmail, MSGBOX_SIGN end CinnabarIsland_PokemonLab_ResearchRoom_EventScript_AmberPipe:: msgbox CinnabarIsland_PokemonLab_ResearchRoom_Text_AnAmberPipe, MSGBOX_SIGN end ================================================ FILE: data/maps/CinnabarIsland_PokemonLab_ResearchRoom/text.inc ================================================ CinnabarIsland_PokemonLab_ResearchRoom_Text_EeveeCanEvolveIntroThreeMons:: .string "EEVEE can evolve into one of three\n" .string "kinds of POKéMON.$" CinnabarIsland_PokemonLab_ResearchRoom_Text_LegendaryBirdEmail:: .string "There's an e-mail message.\p" .string "… … …\p" .string "There are three legendary bird\n" .string "POKéMON.\p" .string "They are ARTICUNO, ZAPDOS, and\n" .string "MOLTRES.\p" .string "Their whereabouts are unknown.\p" .string "We plan to explore the cavern\n" .string "close to CERULEAN.\p" .string "From: POKéMON RESEARCH TEAM…$" CinnabarIsland_PokemonLab_ResearchRoom_Text_AnAmberPipe:: .string "An amber pipe!$" ================================================ FILE: data/maps/DiglettsCave_B1F/map.json ================================================ { "id": "MAP_DIGLETTS_CAVE_B1F", "name": "DiglettsCave_B1F", "layout": "LAYOUT_DIGLETTS_CAVE_B1F", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_DIGLETTS_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 51, "y": 43, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Dugtrio", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 3, "elevation": 3, "dest_map": "MAP_DIGLETTS_CAVE_NORTH_ENTRANCE", "dest_warp_id": "0" }, { "x": 82, "y": 71, "elevation": 3, "dest_map": "MAP_DIGLETTS_CAVE_SOUTH_ENTRANCE", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/DiglettsCave_B1F/scripts.inc ================================================ .set LOCALID_DUGTRIO_MASTER, 1 .set TRAINER, VAR_0x8009 DiglettsCave_B1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, DiglettsCave_B1F_OnTransition .byte 0 DiglettsCave_B1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F goto DiglettsCave_B1F_MapScript_SetMasterTrainerMovementTypes end DiglettsCave_B1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_DUGTRIO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, DiglettsCave_B1F_MapScript_DugtrioMasterMovementType end DiglettsCave_B1F_MapScript_DugtrioMasterMovementType:: setobjectmovementtype LOCALID_DUGTRIO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ================================================ FILE: data/maps/DiglettsCave_NorthEntrance/map.json ================================================ { "id": "MAP_DIGLETTS_CAVE_NORTH_ENTRANCE", "name": "DiglettsCave_NorthEntrance", "layout": "LAYOUT_DIGLETTS_CAVE_NORTH_ENTRANCE", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_DIGLETTS_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "DiglettsCave_NorthEntrance_EventScript_Hiker", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 4, "elevation": 3, "dest_map": "MAP_DIGLETTS_CAVE_B1F", "dest_warp_id": "0" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE2", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/DiglettsCave_NorthEntrance/scripts.inc ================================================ DiglettsCave_NorthEntrance_MapScripts:: .byte 0 DiglettsCave_NorthEntrance_EventScript_Hiker:: msgbox DiglettsCave_NorthEntrance_RockTunnelPitchBlack, MSGBOX_NPC end ================================================ FILE: data/maps/DiglettsCave_NorthEntrance/text.inc ================================================ DiglettsCave_NorthEntrance_RockTunnelPitchBlack:: .string "I went inside ROCK TUNNEL, but it's\n" .string "pitch-black and scary in there.\p" .string "If I could get a POKéMON to use\n" .string "FLASH and light it up…$" ================================================ FILE: data/maps/DiglettsCave_SouthEntrance/map.json ================================================ { "id": "MAP_DIGLETTS_CAVE_SOUTH_ENTRANCE", "name": "DiglettsCave_SouthEntrance", "layout": "LAYOUT_DIGLETTS_CAVE_SOUTH_ENTRANCE", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_DIGLETTS_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "DiglettsCave_SouthEntrance_EventScript_OldMan", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Diglett", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE11", "dest_warp_id": "0" }, { "x": 6, "y": 4, "elevation": 3, "dest_map": "MAP_DIGLETTS_CAVE_B1F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/DiglettsCave_SouthEntrance/scripts.inc ================================================ .set LOCALID_DIGLETT_MASTER, 2 .set TRAINER, VAR_0x8009 DiglettsCave_SouthEntrance_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, DiglettsCave_SouthEntrance_MapScript_SetMasterTrainerMovementTypes .byte 0 DiglettsCave_SouthEntrance_EventScript_OldMan:: msgbox DiglettsCave_SouthEntrance_Text_DiglettDugThisTunnel, MSGBOX_NPC end DiglettsCave_SouthEntrance_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_DIGLETT callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, DiglettsCave_SouthEntrance_MapScript_DiglettMasterMovementType end DiglettsCave_SouthEntrance_MapScript_DiglettMasterMovementType:: setobjectmovementtype LOCALID_DIGLETT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ================================================ FILE: data/maps/DiglettsCave_SouthEntrance/text.inc ================================================ DiglettsCave_SouthEntrance_Text_DiglettDugThisTunnel:: .string "Well, isn't this a surprise!\n" .string "DIGLETT dug this long tunnel!\p" .string "It goes right to VIRIDIAN CITY,\n" .string "they tell me.$" ================================================ FILE: data/maps/FarawayIsland_Exterior/map.json ================================================ { "id": "MAP_FARAWAY_ISLAND_EXTERIOR", "name": "FarawayIsland_Exterior", "layout": "LAYOUT_FARAWAY_ISLAND_EXTERIOR", "music": "MUS_ABANDONED_SHIP", "region_map_section": "MAPSEC_FARAWAY_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 13, "y": 39, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FarawayIsland_Exterior_EventScript_Sailor", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 13, "y": 41, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 22, "y": 8, "elevation": 0, "dest_map": "MAP_FARAWAY_ISLAND_INTERIOR", "dest_warp_id": 0 }, { "x": 23, "y": 8, "elevation": 0, "dest_map": "MAP_FARAWAY_ISLAND_INTERIOR", "dest_warp_id": 1 } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 3, "y": 32, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FarawayIsland_Exterior_EventScript_Sign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/FarawayIsland_Exterior/scripts.inc ================================================ FarawayIsland_Exterior_MapScripts:: .byte 0 FarawayIsland_Exterior_EventScript_Sailor:: lock faceplayer msgbox FarawayIsland_Exterior_Text_SailorReturn, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq FarawayIsland_Exterior_EventScript_AsYouLike msgbox EventTicket_Text_SailHome, MSGBOX_DEFAULT closemessage applymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 30 hideobjectat 1, MAP_FARAWAY_ISLAND_EXTERIOR setvar VAR_0x8004, 2 call EventScript_SailToVermilionCity waitstate release end FarawayIsland_Exterior_EventScript_AsYouLike:: msgbox EventTicket_Text_AsYouLike, MSGBOX_DEFAULT release end FarawayIsland_Exterior_EventScript_Sign:: msgbox FarawayIsland_Exterior_Text_Sign, MSGBOX_SIGN end FarawayIsland_Exterior_Text_Sign: .string "The writing is fading as if it was\n" .string "written a long time ago…\p" .string "“…ber, 6th day\n" .string "If any human…sets foot here…\l" .string "again…et it be a kindhearted pers…\l" .string "…ith that hope, I depar…”$" EventTicket_Text_SailHome: .string "Aye, right, then!\n" .string "Sail home we will!$" EventTicket_Text_AsYouLike: .string "Aye, right, as you like, then.$" FarawayIsland_Exterior_Text_SailorReturn: .string "Do you want to return to VERMILION?$" ================================================ FILE: data/maps/FarawayIsland_Exterior/text.inc ================================================ ================================================ FILE: data/maps/FarawayIsland_Interior/map.json ================================================ { "id": "MAP_FARAWAY_ISLAND_INTERIOR", "name": "FarawayIsland_Interior", "layout": "LAYOUT_FARAWAY_ISLAND_INTERIOR", "music": "MUS_ABANDONED_SHIP", "region_map_section": "MAPSEC_FARAWAY_ISLAND", "requires_flash": false, "weather": "WEATHER_SHADE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_MEW", "in_connection": false, "x": 13, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS", "movement_range_x": 15, "movement_range_y": 15, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FarawayIsland_Interior_EventScript_Mew", "flag": "FLAG_HIDE_MEW" } ], "warp_events": [ { "x": 12, "y": 19, "elevation": 0, "dest_map": "MAP_FARAWAY_ISLAND_EXTERIOR", "dest_warp_id": 0 }, { "x": 13, "y": 19, "elevation": 0, "dest_map": "MAP_FARAWAY_ISLAND_EXTERIOR", "dest_warp_id": 1 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FarawayIsland_Interior/scripts.inc ================================================ .set LOCALID_MEW, 1 FarawayIsland_Interior_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, FarawayIsland_Interior_OnResume map_script MAP_SCRIPT_ON_TRANSITION, FarawayIsland_Interior_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, FarawayIsland_Interior_OnFrame map_script MAP_SCRIPT_ON_RETURN_TO_FIELD, FarawayIsland_Interior_OnReturnToField .byte 0 FarawayIsland_Interior_OnReturnToField: call_if_set FLAG_SYS_CTRL_OBJ_DELETE, FarawayIsland_Interior_EventScript_TrySetMewAboveGrass end FarawayIsland_Interior_EventScript_TrySetMewAboveGrass:: specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_WON goto_if_eq FarawayIsland_Interior_EventScript_SetMewAboveGrass compare VAR_RESULT, B_OUTCOME_RAN goto_if_eq FarawayIsland_Interior_EventScript_SetMewAboveGrass compare VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED goto_if_eq FarawayIsland_Interior_EventScript_SetMewAboveGrass compare VAR_RESULT, B_OUTCOME_MON_TELEPORTED goto_if_eq FarawayIsland_Interior_EventScript_SetMewAboveGrass return FarawayIsland_Interior_EventScript_SetMewAboveGrass:: setvar VAR_0x8004, 1 special SetMewAboveGrass return FarawayIsland_Interior_OnResume: call_if_set FLAG_SYS_CTRL_OBJ_DELETE, FarawayIsland_Interior_EventScript_TryRemoveMew end FarawayIsland_Interior_EventScript_TryRemoveMew:: specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_CAUGHT goto_if_ne EventScript_Return removeobject VAR_LAST_TALKED return FarawayIsland_Interior_OnTransition: setvar VAR_FARAWAY_ISLAND_STEP_COUNTER, 0 setvar VAR_TEMP_1, 1 call_if_set FLAG_FOUGHT_MEW, FarawayIsland_Interior_EventScript_HideMew call_if_unset FLAG_FOUGHT_MEW, FarawayIsland_Interior_EventScript_TryShowMew end FarawayIsland_Interior_EventScript_HideMew:: setflag FLAG_HIDE_MEW return FarawayIsland_Interior_EventScript_TryShowMew:: goto_if_set FLAG_MEW_FLEW_AWAY, EventScript_Return clearflag FLAG_HIDE_MEW setvar VAR_TEMP_1, 0 return FarawayIsland_Interior_OnFrame: map_script_2 VAR_TEMP_1, 0, FarawayIsland_Interior_EventScript_FindMew .2byte 0 FarawayIsland_Interior_EventScript_FindMew:: lockall playse SE_PIN applymovement LOCALID_MEW, FarawayIsland_Interior_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_MEW, FarawayIsland_Interior_Movement_Delay48 waitmovement 0 applymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewMoveAndHide waitmovement 0 copyobjectxytoperm LOCALID_MEW setvar VAR_TEMP_1, 1 releaseall end FarawayIsland_Interior_Movement_ExclamationMark: emote_exclamation_mark step_end FarawayIsland_Interior_Movement_Delay48: delay_16 delay_16 delay_16 step_end FarawayIsland_Interior_Movement_MewMoveAndHide: walk_up walk_up walk_up walk_in_place_faster_down set_invisible step_end FarawayIsland_Interior_Movement_MewAppear: set_visible step_end FarawayIsland_Interior_Movement_MewFloatUpNorth: lock_facing_direction walk_fast_up walk_fast_up unlock_facing_direction walk_in_place_down walk_in_place_down step_end FarawayIsland_Interior_Movement_MewFloatUpSouth: lock_facing_direction walk_fast_up walk_fast_up unlock_facing_direction walk_in_place_up walk_in_place_up step_end FarawayIsland_Interior_Movement_MewFloatUpWest: lock_facing_direction walk_fast_up walk_fast_up unlock_facing_direction walk_in_place_right walk_in_place_right step_end FarawayIsland_Interior_Movement_MewFloatUpEast: lock_facing_direction walk_fast_up walk_fast_up unlock_facing_direction walk_in_place_left walk_in_place_left step_end FarawayIsland_Interior_EventScript_Mew:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer applymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewAppear waitmovement 0 setvar VAR_0x8004, 0 special SetMewAboveGrass message FarawayIsland_Interior_Text_Mew waitse playmoncry SPECIES_MEW, 2 compare VAR_FACING, DIR_NORTH call_if_eq FarawayIsland_Interior_EventScript_FoundMewNorth compare VAR_FACING, DIR_SOUTH call_if_eq FarawayIsland_Interior_EventScript_FoundMewSouth compare VAR_FACING, DIR_WEST call_if_eq FarawayIsland_Interior_EventScript_FoundMewWest compare VAR_FACING, DIR_EAST call_if_eq FarawayIsland_Interior_EventScript_FoundMewEast delay 40 waitmoncry setvar VAR_0x8004, SPECIES_MEW setvar VAR_0x8005, 30 @ level setvar VAR_0x8006, ITEM_NONE special CreateEnemyEventMon setflag FLAG_SYS_CTRL_OBJ_DELETE special StartLegendaryBattle waitstate clearflag FLAG_SYS_CTRL_OBJ_DELETE specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_WON goto_if_eq FarawayIsland_Interior_EventScript_MewDefeated compare VAR_RESULT, B_OUTCOME_RAN goto_if_eq FarawayIsland_Interior_EventScript_PlayerOrMewRan compare VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED goto_if_eq FarawayIsland_Interior_EventScript_PlayerOrMewRan compare VAR_RESULT, B_OUTCOME_MON_TELEPORTED goto_if_eq FarawayIsland_Interior_EventScript_PlayerOrMewRan setflag FLAG_FOUGHT_MEW release end FarawayIsland_Interior_EventScript_MewDefeated:: setflag FLAG_MEW_FLEW_AWAY setvar VAR_0x8004, SPECIES_MEW goto EventScript_MonFlewAway end FarawayIsland_Interior_EventScript_PlayerOrMewRan:: setvar VAR_0x8004, SPECIES_MEW goto EventScript_MonFlewAway end FarawayIsland_Interior_EventScript_FoundMewNorth:: applymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewFloatUpNorth waitmovement 0 return FarawayIsland_Interior_EventScript_FoundMewSouth:: applymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewFloatUpSouth waitmovement 0 return FarawayIsland_Interior_EventScript_FoundMewWest:: applymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewFloatUpWest waitmovement 0 return FarawayIsland_Interior_EventScript_FoundMewEast:: applymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewFloatUpEast waitmovement 0 return FarawayIsland_Interior_EventScript_HideMewWhenGrassCut:: lockall fadescreenswapbuffers FADE_TO_BLACK setflag FLAG_HIDE_MEW removeobject LOCALID_MEW fadescreenswapbuffers FADE_FROM_BLACK msgbox FarawayIsland_Interior_Text_TheFeelingOfBeingWatchedFaded, MSGBOX_DEFAULT closemessage releaseall end FarawayIsland_Interior_Text_TheFeelingOfBeingWatchedFaded: .string "The feeling of being watched faded…$" FarawayIsland_Interior_Text_Mew: .string "Myuu…$" ================================================ FILE: data/maps/FarawayIsland_Interior/text.inc ================================================ ================================================ FILE: data/maps/FiveIsland/map.json ================================================ { "id": "MAP_FIVE_ISLAND", "name": "FiveIsland", "layout": "LAYOUT_FIVE_ISLAND", "music": "MUS_VERDANTURF", "region_map_section": "MAPSEC_FIVE_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": -48, "map": "MAP_FIVE_ISLAND_WATER_LABYRINTH" }, { "direction": "right", "offset": 0, "map": "MAP_FIVE_ISLAND_MEADOW" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 8, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_EventScript_Fisher", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 16, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_EventScript_BugCatcher", "flag": "0" }, { "type": "clone", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "x": 32, "y": 9, "target_local_id": 4, "target_map": "MAP_FIVE_ISLAND_MEADOW" } ], "warp_events": [ { "x": 13, "y": 14, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_HARBOR", "dest_warp_id": "0" }, { "x": 13, "y": 6, "elevation": 0, "dest_map": "MAP_FIVE_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "0" }, { "x": 17, "y": 6, "elevation": 0, "dest_map": "MAP_FIVE_ISLAND_HOUSE1", "dest_warp_id": "0" }, { "x": 22, "y": 9, "elevation": 0, "dest_map": "MAP_FIVE_ISLAND_HOUSE2", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 20, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_EventScript_IslandSign" } ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland/scripts.inc ================================================ FiveIsland_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FiveIsland_OnTransition .byte 0 FiveIsland_OnTransition:: setworldmapflag FLAG_WORLD_MAP_FIVE_ISLAND end FiveIsland_EventScript_IslandSign:: msgbox FiveIsland_Text_IslandSign, MSGBOX_SIGN end FiveIsland_EventScript_BugCatcher:: msgbox FiveIsland_Text_WeirdBuildingInMeadow, MSGBOX_NPC end FiveIsland_EventScript_Fisher:: msgbox FiveIsland_Text_BeenGettingBusierAroundHere, MSGBOX_NPC end ================================================ FILE: data/maps/FiveIsland/text.inc ================================================ FiveIsland_Text_IslandSign:: .string "FIVE ISLAND\n" .string "Chrono Island: Where Time Goes$" FiveIsland_Text_WeirdBuildingInMeadow:: .string "Oh, this stinks. I wanted to play in\n" .string "the MEADOW.\p" .string "But they put up a weird building\n" .string "on it, so I can't play there.$" FiveIsland_Text_BeenGettingBusierAroundHere:: .string "It's been getting busier around\n" .string "these parts lately.\p" .string "I haven't been catching many good\n" .string "fish lately, either.$" ================================================ FILE: data/maps/FiveIsland_Harbor/map.json ================================================ { "id": "MAP_FIVE_ISLAND_HARBOR", "name": "FiveIsland_Harbor", "layout": "LAYOUT_ISLAND_HARBOR", "music": "MUS_VERDANTURF", "region_map_section": "MAPSEC_FIVE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 8, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_Harbor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FiveIsland_Harbor/scripts.inc ================================================ FiveIsland_Harbor_MapScripts:: .byte 0 FiveIsland_Harbor_EventScript_Sailor:: lock faceplayer message Text_WhereDoYouWantToSail waitmessage setvar VAR_0x8004, SEAGALLOP_FIVE_ISLAND goto EventScript_ChooseDestFromIsland end ================================================ FILE: data/maps/FiveIsland_House1/map.json ================================================ { "id": "MAP_FIVE_ISLAND_HOUSE1", "name": "FiveIsland_House1", "layout": "LAYOUT_HOUSE3", "music": "MUS_VERDANTURF", "region_map_section": "MAPSEC_FIVE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_House1_EventScript_Woman", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FiveIsland_House1/scripts.inc ================================================ FiveIsland_House1_MapScripts:: .byte 0 FiveIsland_House1_EventScript_Woman:: msgbox FiveIsland_House1_Text_HusbandWentOffFishing, MSGBOX_NPC end ================================================ FILE: data/maps/FiveIsland_House1/text.inc ================================================ FiveIsland_House1_Text_HusbandWentOffFishing:: .string "Don't worry about buying anything\n" .string "for dinner tonight!\p" .string "…That's what my husband said when\n" .string "he went off fishing today.\p" .string "I'm not sure if I can count on him\n" .string "to live up to that promise.$" ================================================ FILE: data/maps/FiveIsland_House2/map.json ================================================ { "id": "MAP_FIVE_ISLAND_HOUSE2", "name": "FiveIsland_House2", "layout": "LAYOUT_HOUSE3", "music": "MUS_VERDANTURF", "region_map_section": "MAPSEC_FIVE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 2, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_House2_EventScript_OldMan", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FiveIsland_House2/scripts.inc ================================================ FiveIsland_House2_MapScripts:: .byte 0 FiveIsland_House2_EventScript_OldMan:: msgbox FiveIsland_House2_Text_MeadowBelongedToFamily, MSGBOX_NPC end ================================================ FILE: data/maps/FiveIsland_House2/text.inc ================================================ FiveIsland_House2_Text_MeadowBelongedToFamily:: .string "That MEADOW has belonged to our\n" .string "family for generations.\p" .string "I should have had a giant mansion\n" .string "built on it.\p" .string "It would be preferable to having\n" .string "those thugs run wild on it!$" ================================================ FILE: data/maps/FiveIsland_LostCave_Entrance/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE", "name": "FiveIsland_LostCave_Entrance", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ENTRANCE", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_RESORT_GORGEOUS", "dest_warp_id": "0" }, { "x": 5, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Entrance/scripts.inc ================================================ FiveIsland_LostCave_Entrance_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FiveIsland_LostCave_Entrance_OnTransition .byte 0 FiveIsland_LostCave_Entrance_OnTransition:: setworldmapflag FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE end ================================================ FILE: data/maps/FiveIsland_LostCave_Room1/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "name": "FiveIsland_LostCave_Room1", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM1", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_RUIN_MANIAC", "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_LostCave_Room1_EventScript_Lawson", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE", "dest_warp_id": "1" }, { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "3" }, { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM2", "dest_warp_id": "3" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "1" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room1/scripts.inc ================================================ FiveIsland_LostCave_Room1_MapScripts:: .byte 0 FiveIsland_LostCave_Room1_EventScript_Lawson:: trainerbattle_single TRAINER_RUIN_MANIAC_LAWSON, FiveIsland_LostCave_Room1_Text_LawsonIntro, FiveIsland_LostCave_Room1_Text_LawsonDefeat msgbox FiveIsland_LostCave_Room1_Text_LawsonPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/FiveIsland_LostCave_Room1/text.inc ================================================ FiveIsland_LostCave_Room1_Text_LawsonIntro:: .string "Aiyeeeeeh!\p" .string "I thought this was an ancient ruin.\n" .string "But it's teeming with ghosts!$" FiveIsland_LostCave_Room1_Text_LawsonDefeat:: .string "Aiyeeeeeh!\n" .string "Mercy!$" FiveIsland_LostCave_Room1_Text_LawsonPostBattle:: .string "I'm trying to get out of here, but\n" .string "I always end up at the same spot.\p" .string "Maybe the number of boulders is\n" .string "a hint…$" ================================================ FILE: data/maps/FiveIsland_LostCave_Room10/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM10", "name": "FiveIsland_LostCave_Room10", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM10", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LADY", "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_LOST_CAVE_SELPHY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_LostCave_Room10_EventScript_ItemSilkScarf", "flag": "FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM10_SILK_SCARF" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room10/scripts.inc ================================================ .set LOCALID_SELPHY, 1 FiveIsland_LostCave_Room10_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, FiveIsland_LostCave_Room10_OnResume map_script MAP_SCRIPT_ON_FRAME_TABLE, FiveIsland_LostCave_Room10_OnFrame .byte 0 FiveIsland_LostCave_Room10_OnResume:: call_if_defeated TRAINER_LADY_SELPHY, FiveIsland_LostCave_Room10_EventScript_StopSelphySceneTrigger end FiveIsland_LostCave_Room10_EventScript_StopSelphySceneTrigger:: setvar VAR_MAP_SCENE_FIVE_ISLAND_LOST_CAVE_ROOM10, 1 return FiveIsland_LostCave_Room10_OnFrame:: map_script_2 VAR_MAP_SCENE_FIVE_ISLAND_LOST_CAVE_ROOM10, 0, FiveIsland_LostCave_Room10_EventScript_FindSelphyScene .2byte 0 FiveIsland_LostCave_Room10_EventScript_FindSelphyScene:: lockall textcolor NPC_TEXT_COLOR_FEMALE applymovement LOCALID_SELPHY, FiveIsland_LostCave_Room10_Movement_SelphyWander waitmovement 0 delay 100 applymovement LOCALID_SELPHY, FiveIsland_LostCave_Room10_Movement_SelphyApproach waitmovement 0 msgbox FiveIsland_LostCave_Room10_Text_SelphyIntro goto_if_questlog FiveIsland_LostCave_Room10_EventScript_SelphyQuestLog trainerbattle_no_intro TRAINER_LADY_SELPHY, FiveIsland_LostCave_Room10_Text_SelphyDefeat msgbox FiveIsland_LostCave_Room10_Text_MayIAskYouToTakeMeHome closemessage call FiveIsland_LostCave_Room10_EventScript_SetSelphyFound warp MAP_FIVE_ISLAND_RESORT_GORGEOUS, 39, 10 waitstate releaseall end FiveIsland_LostCave_Room10_EventScript_SetSelphyFound:: setflag FLAG_HIDE_LOST_CAVE_SELPHY clearflag FLAG_HIDE_RESORT_GORGEOUS_SELPHY setvar VAR_MAP_SCENE_FIVE_ISLAND_LOST_CAVE_ROOM10, 1 setvar VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS, 1 return FiveIsland_LostCave_Room10_EventScript_SelphyQuestLog:: settrainerflag TRAINER_LADY_SELPHY call FiveIsland_LostCave_Room10_EventScript_SetSelphyFound releaseall end FiveIsland_LostCave_Room10_Movement_SelphyWander:: walk_left delay_16 walk_right delay_16 walk_in_place_faster_up delay_16 walk_in_place_faster_down step_end FiveIsland_LostCave_Room10_Movement_SelphyApproach:: walk_down walk_down step_end ================================================ FILE: data/maps/FiveIsland_LostCave_Room10/text.inc ================================================ FiveIsland_LostCave_Room10_Text_SelphyIntro:: .string "W-what do you intend to do with\n" .string "me?$" FiveIsland_LostCave_Room10_Text_SelphyDefeat:: .string "Oh… I was afraid that you meant to\n" .string "harm me.$" FiveIsland_LostCave_Room10_Text_MayIAskYouToTakeMeHome:: .string "I am so glad that you happened\n" .string "here.\p" .string "I grew rather bored of walking,\n" .string "and I am feeling fatigued.\p" .string "May I ask you to take me home\n" .string "from here?$" ================================================ FILE: data/maps/FiveIsland_LostCave_Room11/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM11", "name": "FiveIsland_LostCave_Room11", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM11", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_LostCave_Room11_EventScript_ItemLaxIncense", "flag": "FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM11_LAX_INCENSE" } ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room11/scripts.inc ================================================ FiveIsland_LostCave_Room11_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room12/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM12", "name": "FiveIsland_LostCave_Room12", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM12", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_LostCave_Room12_EventScript_ItemSeaIncense", "flag": "FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM12_SEA_INCENSE" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room12/scripts.inc ================================================ FiveIsland_LostCave_Room12_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room13/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM13", "name": "FiveIsland_LostCave_Room13", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM13", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_LostCave_Room13_EventScript_ItemMaxRevive", "flag": "FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM13_MAX_REVIVE" } ], "warp_events": [ { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room13/scripts.inc ================================================ FiveIsland_LostCave_Room13_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room14/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM14", "name": "FiveIsland_LostCave_Room14", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM14", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_LostCave_Room14_EventScript_ItemRareCandy", "flag": "FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM14_RARE_CANDY" } ], "warp_events": [ { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room14/scripts.inc ================================================ FiveIsland_LostCave_Room14_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room2/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM2", "name": "FiveIsland_LostCave_Room2", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM2", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM3", "dest_warp_id": "2" }, { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "4" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM11", "dest_warp_id": "0" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room2/scripts.inc ================================================ FiveIsland_LostCave_Room2_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room3/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM3", "name": "FiveIsland_LostCave_Room3", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM3", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "3" }, { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "4" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM4", "dest_warp_id": "0" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room3/scripts.inc ================================================ FiveIsland_LostCave_Room3_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room4/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM4", "name": "FiveIsland_LostCave_Room4", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM4", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_F", "x": 6, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_LostCave_Room4_EventScript_Laura", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM12", "dest_warp_id": "0" }, { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "4" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM5", "dest_warp_id": "0" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room4/scripts.inc ================================================ FiveIsland_LostCave_Room4_MapScripts:: .byte 0 FiveIsland_LostCave_Room4_EventScript_Laura:: trainerbattle_single TRAINER_PSYCHIC_LAURA, FiveIsland_LostCave_Room4_Text_LauraIntro, FiveIsland_LostCave_Room4_Text_LauraDefeat msgbox FiveIsland_LostCave_Room4_Text_LauraPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/FiveIsland_LostCave_Room4/text.inc ================================================ FiveIsland_LostCave_Room4_Text_LauraIntro:: .string "I think there is a mysterious power\n" .string "at work in this cave.$" FiveIsland_LostCave_Room4_Text_LauraDefeat:: .string "If you don't go into the right\n" .string "tunnel, you won't get ahead.$" FiveIsland_LostCave_Room4_Text_LauraPostBattle:: .string "Earlier, a lady went into the caves\n" .string "ahead.$" ================================================ FILE: data/maps/FiveIsland_LostCave_Room5/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM5", "name": "FiveIsland_LostCave_Room5", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM5", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "3" }, { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM6", "dest_warp_id": "3" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "1" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room5/scripts.inc ================================================ FiveIsland_LostCave_Room5_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room6/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM6", "name": "FiveIsland_LostCave_Room6", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM6", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "3" }, { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM13", "dest_warp_id": "0" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "1" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM7", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room6/scripts.inc ================================================ FiveIsland_LostCave_Room6_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room7/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM7", "name": "FiveIsland_LostCave_Room7", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM7", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "3" }, { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "4" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM8", "dest_warp_id": "0" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room7/scripts.inc ================================================ FiveIsland_LostCave_Room7_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room8/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM8", "name": "FiveIsland_LostCave_Room8", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM8", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "3" }, { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM9", "dest_warp_id": "3" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "1" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM14", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room8/scripts.inc ================================================ FiveIsland_LostCave_Room8_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_LostCave_Room9/map.json ================================================ { "id": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM9", "name": "FiveIsland_LostCave_Room9", "layout": "LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM9", "music": "MUS_MT_PYRE_EXTERIOR", "region_map_section": "MAPSEC_LOST_CAVE", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM10", "dest_warp_id": "0" }, { "x": 8, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "4" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "1" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ROOM1", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_LostCave_Room9/scripts.inc ================================================ FiveIsland_LostCave_Room9_MapScripts:: .byte 0 ================================================ FILE: data/maps/FiveIsland_Meadow/map.json ================================================ { "id": "MAP_FIVE_ISLAND_MEADOW", "name": "FiveIsland_Meadow", "layout": "LAYOUT_FIVE_ISLAND_MEADOW", "music": "MUS_ROUTE122", "region_map_section": "MAPSEC_FIVE_ISLE_MEADOW", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": 0, "map": "MAP_FIVE_ISLAND" }, { "direction": "right", "offset": 20, "map": "MAP_FIVE_ISLAND_MEMORIAL_PILLAR" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_F", "in_connection": false, "x": 18, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_Meadow_EventScript_Rocket3", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 17, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "FiveIsland_Meadow_EventScript_Rocket1", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 11, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "FiveIsland_Meadow_EventScript_Rocket2", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 8, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_FIVE_ISLE_MEADOW_CUT_TREE_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 19, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_FIVE_ISLE_MEADOW_CUT_TREE_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_Meadow_EventScript_ItemMaxPotion", "flag": "FLAG_HIDE_FIVE_ISLAND_MEADOW_MAX_POTION" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 3, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_Meadow_EventScript_ItemPPUp", "flag": "FLAG_HIDE_FIVE_ISLAND_MEADOW_PP_UP" } ], "warp_events": [ { "x": 12, "y": 21, "elevation": 0, "dest_map": "MAP_FIVE_ISLAND_ROCKET_WAREHOUSE", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 12, "y": 21, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_Meadow_EventScript_WarehouseDoor" } ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_Meadow/scripts.inc ================================================ FiveIsland_Meadow_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, FiveIsland_Meadow_OnLoad .byte 0 FiveIsland_Meadow_OnLoad:: call_if_set FLAG_UNLOCKED_ROCKET_WAREHOUSE, FiveIsland_Meadow_EventScript_SetWarehouseDoorUnlocked end FiveIsland_Meadow_EventScript_WarehouseDoor:: lockall goto_if_set FLAG_UNLOCKED_ROCKET_WAREHOUSE, FiveIsland_Meadow_EventScript_WarehouseDoorAlreadyOpen goto_if_set FLAG_LEARNED_YES_NAH_CHANSEY, FiveIsland_Meadow_EventScript_OpenWarehouseDoor msgbox FiveIsland_Meadow_Text_EnteredPasswordAnotherNeeded releaseall end FiveIsland_Meadow_EventScript_OpenWarehouseDoor:: setflag FLAG_UNLOCKED_ROCKET_WAREHOUSE message FiveIsland_Meadow_Text_EnteredPasswordDoorOpened waitmessage delay 60 call FiveIsland_Meadow_EventScript_SetWarehouseDoorUnlocked special DrawWholeMapView playse SE_PIN waitse releaseall end FiveIsland_Meadow_EventScript_WarehouseDoorAlreadyOpen:: msgbox FiveIsland_Meadow_Text_WarehouseDoorAlreadyOpen releaseall end FiveIsland_Meadow_EventScript_SetWarehouseDoorUnlocked:: setmetatile 12, 21, METATILE_SeviiIslands45_RocketWarehouseDoor_Unlocked, 1 return FiveIsland_Meadow_EventScript_Rocket1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_49, FiveIsland_Meadow_Text_Rocket1Intro, FiveIsland_Meadow_Text_Rocket1Defeat msgbox FiveIsland_Meadow_Text_Rocket1PostBattle, MSGBOX_AUTOCLOSE end FiveIsland_Meadow_EventScript_Rocket2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_50, FiveIsland_Meadow_Text_Rocket2Intro, FiveIsland_Meadow_Text_Rocket2Defeat msgbox FiveIsland_Meadow_Text_Rocket2PostBattle, MSGBOX_AUTOCLOSE end FiveIsland_Meadow_EventScript_Rocket3:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_51, FiveIsland_Meadow_Text_Rocket3Intro, FiveIsland_Meadow_Text_Rocket3Defeat msgbox FiveIsland_Meadow_Text_Rocket3PostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/FiveIsland_Meadow/text.inc ================================================ FiveIsland_Meadow_Text_EnteredPasswordAnotherNeeded:: .string "{PLAYER} entered a password.\p" .string "“GOLDEEN need log.”\p" .string "… … … … … …\p" .string "Another password is needed to\n" .string "open the door…$" FiveIsland_Meadow_Text_EnteredPasswordDoorOpened:: .string "{PLAYER} entered two passwords.\p" .string "“GOLDEEN need log.”\n" .string "“Yes, nah, CHANSEY.”\p" .string "… … … … … …\p" .string "The WAREHOUSE's door opened!$" FiveIsland_Meadow_Text_WarehouseDoorAlreadyOpen:: .string "The WAREHOUSE's door is already\n" .string "open.$" FiveIsland_Meadow_Text_Rocket1Intro:: .string "This area's strictly off-limits!\n" .string "Out, out!$" FiveIsland_Meadow_Text_Rocket1Defeat:: .string "Is this for real?$" FiveIsland_Meadow_Text_Rocket1PostBattle:: .string "You don't have any business here!\n" .string "Go home!$" FiveIsland_Meadow_Text_Rocket2Intro:: .string "There's nothing past here except\n" .string "our WAREHOUSE.\p" .string "So what brings you here?$" FiveIsland_Meadow_Text_Rocket2Defeat:: .string "That wasn't supposed to happen…$" FiveIsland_Meadow_Text_Rocket2PostBattle:: .string "You're wanting to know what's inside\n" .string "this WAREHOUSE?\p" .string "It's better you didn't know.\n" .string "For your own sake, I mean.$" FiveIsland_Meadow_Text_Rocket3Intro:: .string "You'd be wasting time even if you\n" .string "were to get by me.$" FiveIsland_Meadow_Text_Rocket3Defeat:: .string "Oh, that makes me furious!$" FiveIsland_Meadow_Text_Rocket3PostBattle:: .string "You won't be able to get in without\n" .string "the passwords anyway.$" ================================================ FILE: data/maps/FiveIsland_MemorialPillar/map.json ================================================ { "id": "MAP_FIVE_ISLAND_MEMORIAL_PILLAR", "name": "FiveIsland_MemorialPillar", "layout": "LAYOUT_FIVE_ISLAND_MEMORIAL_PILLAR", "music": "MUS_ROUTE122", "region_map_section": "MAPSEC_MEMORIAL_PILLAR", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": -20, "map": "MAP_FIVE_ISLAND_MEADOW" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 8, "y": 44, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_MemorialPillar_EventScript_MemorialMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 12, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "FiveIsland_MemorialPillar_EventScript_Milo", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 14, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "FiveIsland_MemorialPillar_EventScript_Chaz", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 18, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "FiveIsland_MemorialPillar_EventScript_Harold", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 4, "y": 47, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_MemorialPillar_EventScript_ItemMetalCoat", "flag": "FLAG_HIDE_FIVE_ISLAND_MEMORIAL_PILLAR_METAL_COAT" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 9, "y": 43, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "FiveIsland_MemorialPillar_EventScript_Memorial" }, { "type": "hidden_item", "x": 8, "y": 52, "elevation": 3, "item": "ITEM_BIG_PEARL", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_BIG_PEARL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 15, "y": 7, "elevation": 3, "item": "ITEM_POMEG_BERRY", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_POMEG_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 17, "y": 22, "elevation": 3, "item": "ITEM_SITRUS_BERRY", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_SITRUS_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 14, "y": 25, "elevation": 3, "item": "ITEM_KELPSY_BERRY", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_KELPSY_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_MemorialPillar/scripts.inc ================================================ .set LOCALID_MEMORIAL_MAN, 1 FiveIsland_MemorialPillar_MapScripts:: .byte 0 FiveIsland_MemorialPillar_EventScript_MemorialMan:: lock goto_if_set FLAG_GOT_TM42_AT_MEMORIAL_PILLAR, FiveIsland_MemorialPillar_EventScript_AlreadyGotTM42 goto_if_set FLAG_NO_ROOM_FOR_TM42_AT_MEMORIAL_PILLAR, FiveIsland_MemorialPillar_EventScript_ReturnedForTM42 msgbox FiveIsland_MemorialPillar_Text_ScrubScrub closemessage applymovement LOCALID_MEMORIAL_MAN, Common_Movement_FacePlayer waitmovement 0 delay 45 msgbox FiveIsland_MemorialPillar_Text_YourMonsLookHealthy applymovement LOCALID_MEMORIAL_MAN, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox FiveIsland_MemorialPillar_Text_ThisIsWhereIBuriedMyOnix release end FiveIsland_MemorialPillar_EventScript_AlreadyGotTM42:: msgbox FiveIsland_MemorialPillar_Text_ScrubScrubTectonix release end FiveIsland_MemorialPillar_EventScript_ReturnedForTM42:: msgbox FiveIsland_MemorialPillar_Text_StillHaveThingAsMyThanks giveitem ITEM_TM42 goto_if_eq VAR_RESULT, FALSE, FiveIsland_MemorialPillar_EventScript_NoRoomForTM42 call FiveIsland_MemorialPillar_EventScript_ReceivedTM42 release end FiveIsland_MemorialPillar_EventScript_Memorial:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lockall goto_if_set FLAG_GOT_TM42_AT_MEMORIAL_PILLAR, FiveIsland_MemorialPillar_EventScript_MemorialLemonadeAlreadyPlaced goto_if_set FLAG_NO_ROOM_FOR_TM42_AT_MEMORIAL_PILLAR, FiveIsland_MemorialPillar_EventScript_MemorialLemonadeAlreadyPlaced msgbox FiveIsland_MemorialPillar_Text_HereLiesTectonixLemonadeOffering checkitem ITEM_LEMONADE goto_if_eq VAR_RESULT, TRUE, FiveIsland_MemorialPillar_EventScript_AskPlaceLemonade releaseall end FiveIsland_MemorialPillar_EventScript_AskPlaceLemonade:: msgbox FiveIsland_MemorialPillar_Text_LeaveAnotherLemonadeOffering, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FiveIsland_MemorialPillar_EventScript_PlaceLemonade releaseall end FiveIsland_MemorialPillar_EventScript_PlaceLemonade:: removeitem ITEM_LEMONADE msgbox FiveIsland_MemorialPillar_Text_PlacedCanOfLemonade closemessage applymovement LOCALID_MEMORIAL_MAN, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 45 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 textcolor NPC_TEXT_COLOR_MALE msgbox FiveIsland_MemorialPillar_Text_ThankYouPleaseTakeThis giveitem ITEM_TM42 goto_if_eq VAR_RESULT, FALSE, FiveIsland_MemorialPillar_EventScript_NoRoomForTM42 call FiveIsland_MemorialPillar_EventScript_ReceivedTM42 releaseall end FiveIsland_MemorialPillar_EventScript_ReceivedTM42:: msgbox FiveIsland_MemorialPillar_Text_BeGoodToYourMonsToo applymovement LOCALID_MEMORIAL_MAN, Common_Movement_WalkInPlaceFasterUp waitmovement 0 setflag FLAG_GOT_TM42_AT_MEMORIAL_PILLAR return FiveIsland_MemorialPillar_EventScript_NoRoomForTM42:: setflag FLAG_NO_ROOM_FOR_TM42_AT_MEMORIAL_PILLAR msgbox FiveIsland_MemorialPillar_Text_DontHaveRoomForIt releaseall end FiveIsland_MemorialPillar_EventScript_MemorialLemonadeAlreadyPlaced:: msgbox FiveIsland_MemorialPillar_Text_HereLiesTectonix releaseall end ================================================ FILE: data/maps/FiveIsland_MemorialPillar/text.inc ================================================ FiveIsland_MemorialPillar_Text_MiloIntro:: .string "I'm the eldest of the BIRD\n" .string "BROTHERS.\p" .string "The best thing about birds…\n" .string "It has to be the beak.$" FiveIsland_MemorialPillar_Text_MiloDefeat:: .string "Oh, so sharp!$" FiveIsland_MemorialPillar_Text_MiloPostBattle:: .string "You can fly to FOUR ISLAND from\n" .string "here.$" FiveIsland_MemorialPillar_Text_ChazIntro:: .string "I'm the middle kid of the BIRD\n" .string "BROTHERS.\p" .string "The best thing about birds…\n" .string "It has to be the wings.$" FiveIsland_MemorialPillar_Text_ChazDefeat:: .string "Flap, flap!$" FiveIsland_MemorialPillar_Text_ChazPostBattle:: .string "There was a really somber guy\n" .string "over that way.$" FiveIsland_MemorialPillar_Text_HaroldIntro:: .string "I'm the youngest of the BIRD\n" .string "BROTHERS.\p" .string "The best thing about birds…\n" .string "It has to be the down.$" FiveIsland_MemorialPillar_Text_HaroldDefeat:: .string "Down is so comfy…\n" .string "It makes me drowsy…$" FiveIsland_MemorialPillar_Text_HaroldPostBattle:: .string "It fills me with happiness when\n" .string "bird POKéMON beg playfully…$" FiveIsland_MemorialPillar_Text_ScrubScrub:: .string "Scrub, scrub…$" FiveIsland_MemorialPillar_Text_YourMonsLookHealthy:: .string "Hello…\n" .string "Your POKéMON look healthy…$" FiveIsland_MemorialPillar_Text_ThisIsWhereIBuriedMyOnix:: .string "This is where I buried my ONIX…\n" .string "It was named TECTONIX…$" FiveIsland_MemorialPillar_Text_HereLiesTectonixLemonadeOffering:: .string "“Here lies TECTONIX” is engraved\n" .string "on a boulder.\p" .string "There is a LEMONADE placed as an\n" .string "offering in front of the grave.$" FiveIsland_MemorialPillar_Text_LeaveAnotherLemonadeOffering:: .string "Would you like to leave another\n" .string "LEMONADE as an offering?$" FiveIsland_MemorialPillar_Text_PlacedCanOfLemonade:: .string "{PLAYER} placed a can of LEMONADE\n" .string "in front of the grave.$" FiveIsland_MemorialPillar_Text_ThankYouPleaseTakeThis:: .string "Th-thank you…\p" .string "That was my TECTONIX's favorite\n" .string "drink…\p" .string "I don't even know you, but your\n" .string "act of kindness…\p" .string "It's uplifted me a little.\p" .string "Can you please take this as my\n" .string "thanks?$" FiveIsland_MemorialPillar_Text_BeGoodToYourMonsToo:: .string "Please be good to your POKéMON,\n" .string "too.$" FiveIsland_MemorialPillar_Text_DontHaveRoomForIt:: .string "If you don't have room for it,\n" .string "I'll hold it for you till next time.$" FiveIsland_MemorialPillar_Text_StillHaveThingAsMyThanks:: .string "Oh, it's you from that time…\p" .string "I still have that thing I wanted\n" .string "you to have as my thanks.$" FiveIsland_MemorialPillar_Text_ScrubScrubTectonix:: .string "Scrub, scrub…\p" .string "… … …\n" .string "TECTONIX…$" FiveIsland_MemorialPillar_Text_HereLiesTectonix:: .string "Boulders and rocks are neatly piled\n" .string "up as a cairn.\p" .string "“Here lies TECTONIX” is engraved\n" .string "on a boulder.$" ================================================ FILE: data/maps/FiveIsland_PokemonCenter_1F/map.json ================================================ { "id": "MAP_FIVE_ISLAND_POKEMON_CENTER_1F", "name": "FiveIsland_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_FIVE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 9, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_PokemonCenter_1F_EventScript_CooltrainerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHEF", "in_connection": false, "x": 4, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_PokemonCenter_1F_EventScript_Chef", "flag": "0" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 2, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_PokemonCenter_1F_EventScript_PokemonJournal", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 3, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_PokemonCenter_1F_EventScript_PokemonJournal", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND", "dest_warp_id": "1" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_FIVE_ISLAND_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FiveIsland_PokemonCenter_1F/scripts.inc ================================================ FiveIsland_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FiveIsland_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 FiveIsland_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_FIVE_ISLAND end FiveIsland_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end FiveIsland_PokemonCenter_1F_EventScript_Chef:: msgbox FiveIsland_PokemonCenter_1F_Text_OnMyWayToPrepareMeal, MSGBOX_NPC end FiveIsland_PokemonCenter_1F_EventScript_CooltrainerF:: msgbox FiveIsland_PokemonCenter_1F_Text_YoureOnQuestToCatchEveryMon, MSGBOX_NPC end ================================================ FILE: data/maps/FiveIsland_PokemonCenter_1F/text.inc ================================================ FiveIsland_PokemonCenter_1F_Text_OnMyWayToPrepareMeal:: .string "I'm on my way to prepare a meal\n" .string "for a certain high-society person.$" FiveIsland_PokemonCenter_1F_Text_YoureOnQuestToCatchEveryMon:: .string "You're on a quest to catch every\n" .string "single kind of POKéMON?\p" .string "…How incredible. Please tell me if\n" .string "you catch a strong one!$" ================================================ FILE: data/maps/FiveIsland_PokemonCenter_2F/map.json ================================================ { "id": "MAP_FIVE_ISLAND_POKEMON_CENTER_2F", "name": "FiveIsland_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_FIVE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_FIVE_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/FiveIsland_PokemonCenter_2F/scripts.inc ================================================ FiveIsland_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS FiveIsland_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end FiveIsland_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end FiveIsland_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/FiveIsland_ResortGorgeous/map.json ================================================ { "id": "MAP_FIVE_ISLAND_RESORT_GORGEOUS", "name": "FiveIsland_ResortGorgeous", "layout": "LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS", "music": "MUS_ROUTE122", "region_map_section": "MAPSEC_RESORT_GORGEOUS", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": -48, "map": "MAP_FIVE_ISLAND_WATER_LABYRINTH" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PAINTER", "x": 44, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "FiveIsland_ResortGorgeous_EventScript_Daisy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PAINTER", "x": 33, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "FiveIsland_ResortGorgeous_EventScript_Celina", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PAINTER", "x": 12, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_ResortGorgeous_EventScript_Rayna", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LADY", "x": 23, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_ResortGorgeous_EventScript_Jacki", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LADY", "x": 33, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_ResortGorgeous_EventScript_Gillian", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 33, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT", "movement_range_x": 10, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_ResortGorgeous_EventScript_Destin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 56, "y": 7, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_ResortGorgeous_EventScript_Toby", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LADY", "x": 39, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_RESORT_GORGEOUS_SELPHY" } ], "warp_events": [ { "x": 64, "y": 13, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE", "dest_warp_id": "0" }, { "x": 39, "y": 8, "elevation": 0, "dest_map": "MAP_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 10, "y": 7, "elevation": 3, "item": "ITEM_NEST_BALL", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_NEST_BALL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 27, "y": 11, "elevation": 3, "item": "ITEM_STARDUST", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 40, "y": 12, "elevation": 3, "item": "ITEM_STAR_PIECE", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STAR_PIECE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 27, "y": 5, "elevation": 3, "item": "ITEM_STARDUST", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST_2", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 42, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_ResortGorgeous_EventScript_SelphysHouseSign" } ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_ResortGorgeous/scripts.inc ================================================ .equ LOCALID_SELPHY, 8 FiveIsland_ResortGorgeous_MapScripts:: map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, FiveIsland_ResortGorgeous_OnWarp map_script MAP_SCRIPT_ON_FRAME_TABLE, FiveIsland_ResortGorgeous_OnFrame .byte 0 FiveIsland_ResortGorgeous_OnWarp:: map_script_2 VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS, 1, FiveIsland_ResortGorgeous_EventScript_TurnPlayerNorth .2byte 0 FiveIsland_ResortGorgeous_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end FiveIsland_ResortGorgeous_OnFrame:: map_script_2 VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS, 1, FiveIsland_ResortGorgeous_EventScript_SelphyReturnHomeScene .2byte 0 FiveIsland_ResortGorgeous_EventScript_SelphyReturnHomeScene:: lockall textcolor NPC_TEXT_COLOR_FEMALE msgbox FiveIsland_ResortGorgeous_Text_SelphyThanksYouMayGoNow closemessage applymovement LOCALID_SELPHY, Common_Movement_WalkInPlaceFasterUp waitmovement 0 opendoor 39, 8 waitdooranim applymovement LOCALID_SELPHY, FiveIsland_ResortGorgeous_Movement_SelphyEnterHome waitmovement 0 closedoor 39, 8 waitdooranim removeobject LOCALID_SELPHY clearflag FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY setvar VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS, 2 releaseall end FiveIsland_ResortGorgeous_Movement_SelphyEnterHome:: walk_up set_invisible step_end FiveIsland_ResortGorgeous_EventScript_SelphysHouseSign:: msgbox FiveIsland_ResortGorgeous_Text_SelphysHouse, MSGBOX_SIGN end ================================================ FILE: data/maps/FiveIsland_ResortGorgeous/text.inc ================================================ FiveIsland_ResortGorgeous_Text_DaisyIntro:: .string "With these hands, I will create\n" .string "my victory!$" FiveIsland_ResortGorgeous_Text_DaisyDefeat:: .string "The shame of this…\n" .string "I'm red-faced…$" FiveIsland_ResortGorgeous_Text_DaisyPostBattle:: .string "Uh-oh, my paint tubes have\n" .string "scattered everywhere!$" FiveIsland_ResortGorgeous_Text_CelinaIntro:: .string "Excuse me!\n" .string "I'm trying to paint.\l" .string "Please keep out of my sight!$" FiveIsland_ResortGorgeous_Text_CelinaDefeat:: .string "This loss…\n" .string "I feel like I'm whiting out…$" FiveIsland_ResortGorgeous_Text_CelinaPostBattle:: .string "GILLIAN?\n" .string "Please tilt your head slightly…\l" .string "There! That's the look I want!$" FiveIsland_ResortGorgeous_Text_RaynaIntro:: .string "Hmm…\n" .string "The angle, it is not quite there…$" FiveIsland_ResortGorgeous_Text_RaynaDefeat:: .string "Oh…\n" .string "My feelings, they are blue…$" FiveIsland_ResortGorgeous_Text_RaynaPostBattle:: .string "The sky and the sea…\n" .string "They are so fickle.\p" .string "Their changing expressions make\n" .string "them difficult to capture.$" FiveIsland_ResortGorgeous_Text_JackiIntro:: .string "I am visiting my friend's retreat,\n" .string "if you must know.$" FiveIsland_ResortGorgeous_Text_JackiDefeat:: .string "Oh, my, so strong.$" FiveIsland_ResortGorgeous_Text_JackiPostBattle:: .string "I find it pleasurable to leisurely\n" .string "battle in the gentle sea breeze.$" FiveIsland_ResortGorgeous_Text_GillianIntro:: .string "I'm thinking of having a pool\n" .string "made specially for POKéMON.$" FiveIsland_ResortGorgeous_Text_GillianDefeat:: .string "Oh, my goodness gracious!$" FiveIsland_ResortGorgeous_Text_GillianPostBattle:: .string "A pool would be nice, but I must\n" .string "say, a sun-room may be sublime.$" FiveIsland_ResortGorgeous_Text_DestinIntro:: .string "I'm a good runner.\n" .string "I'm really fast!$" FiveIsland_ResortGorgeous_Text_DestinDefeat:: .string "Oops!\n" .string "I rushed things!$" FiveIsland_ResortGorgeous_Text_DestinPostBattle:: .string "When I run with the wind, it feels\n" .string "like I could fly!$" FiveIsland_ResortGorgeous_Text_TobyIntro:: .string "I say, this marine life here at\n" .string "this resort agrees with me.$" FiveIsland_ResortGorgeous_Text_TobyDefeat:: .string "That's a shocker!\n" .string "You must be joking.$" FiveIsland_ResortGorgeous_Text_TobyPostBattle:: .string "Getting so serious over this…\n" .string "How nonsensical.$" FiveIsland_ResortGorgeous_Text_SelphyThanksYouMayGoNow:: .string "SELPHY: Thank you.\p" .string "You may go now.$" FiveIsland_ResortGorgeous_Text_SelphysHouse:: .string "SELPHY'S HOUSE$" ================================================ FILE: data/maps/FiveIsland_ResortGorgeous_House/map.json ================================================ { "id": "MAP_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE", "name": "FiveIsland_ResortGorgeous_House", "layout": "LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE", "music": "MUS_VERDANTURF", "region_map_section": "MAPSEC_RESORT_GORGEOUS", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LADY", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_ResortGorgeous_House_EventScript_Selphy", "flag": "FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_ResortGorgeous_House_EventScript_Butler", "flag": "FLAG_HIDE_SELPHYS_BUTLER" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_RESORT_GORGEOUS", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 9, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "FiveIsland_ResortGorgeous_House_EventScript_PokemonJournal" }, { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "FiveIsland_ResortGorgeous_House_EventScript_PokemonJournal" }, { "type": "sign", "x": 1, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_ResortGorgeous_House_EventScript_Painting" }, { "type": "sign", "x": 2, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_ResortGorgeous_House_EventScript_Painting" } ], "level_scaling": "0" } ================================================ FILE: data/maps/FiveIsland_ResortGorgeous_House/scripts.inc ================================================ .equ LOCALID_SELPHY, 1 .equ LOCALID_BUTLER, 2 .equ SHOWN_REQUESTED_MON, FLAG_TEMP_2 .equ MAPSEC_FOUR_ISLAND, 0x92 FiveIsland_ResortGorgeous_House_MapScripts:: .byte 0 FiveIsland_ResortGorgeous_House_EventScript_Selphy:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer goto_if_set SHOWN_REQUESTED_MON, FiveIsland_ResortGorgeous_House_EventScript_JustFulfilledRequest goto_if_eq VAR_RESORT_GORGEOUS_REQUESTED_MON, 0xFFFF, FiveIsland_ResortGorgeous_House_EventScript_RequestTookTooLong goto_if_ne VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE, FiveIsland_ResortGorgeous_House_EventScript_CheckForRequestedMon msgbox FiveIsland_ResortGorgeous_House_Text_PleaseHearMyWish goto FiveIsland_ResortGorgeous_House_EventScript_RequestMon end FiveIsland_ResortGorgeous_House_EventScript_RequestMon:: special SampleResortGorgeousMonAndReward msgbox FiveIsland_ResortGorgeous_House_Text_WishToSeeMonPlease release end FiveIsland_ResortGorgeous_House_EventScript_RequestTookTooLong:: msgbox FiveIsland_ResortGorgeous_House_Text_OhImTiredOfWaiting goto FiveIsland_ResortGorgeous_House_EventScript_RequestMon end FiveIsland_ResortGorgeous_House_EventScript_CheckForRequestedMon:: copyvar VAR_0x8004, VAR_RESORT_GORGEOUS_REQUESTED_MON specialvar VAR_RESULT, DoesPlayerPartyContainSpecies goto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_House_EventScript_ShowRequestedMon goto FiveIsland_ResortGorgeous_House_EventScript_RequestMon end FiveIsland_ResortGorgeous_House_EventScript_ShowRequestedMon:: special SampleResortGorgeousMonAndReward msgbox FiveIsland_ResortGorgeous_House_Text_MonYouCaughtForMeThankYou addobject LOCALID_BUTLER applymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerEnter waitmovement 0 textcolor NPC_TEXT_COLOR_MALE msgbox FiveIsland_ResortGorgeous_House_Text_ButlerYesMyLady applymovement LOCALID_SELPHY, Common_Movement_WalkInPlaceFasterUp waitmovement 0 textcolor NPC_TEXT_COLOR_FEMALE msgbox FiveIsland_ResortGorgeous_House_Text_SelphyGiveTokenOfAppreciation textcolor NPC_TEXT_COLOR_MALE msgbox FiveIsland_ResortGorgeous_House_Text_ButlerIShallDoAsYouBid closemessage call_if_eq VAR_FACING, DIR_NORTH, FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerNorth call_if_eq VAR_FACING, DIR_SOUTH, FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerSouth call_if_eq VAR_FACING, DIR_EAST, FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerEast call_if_eq VAR_FACING, DIR_WEST, FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerWest copyobjectxytoperm LOCALID_BUTLER msgbox FiveIsland_ResortGorgeous_House_Text_ButlerPleaseAcceptThisAsHerThanks goto_if_unset FLAG_GIVEN_CORSOLA_EGG, FiveIsland_ResortGorgeous_House_EventScript_FirstReward giveitem VAR_RESORT_GORGEOUS_REWARD goto_if_eq VAR_RESULT, FALSE, FiveIsland_ResortGorgeous_House_EventScript_NoRoomForReward setflag SHOWN_REQUESTED_MON setvar VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE release end FiveIsland_ResortGorgeous_House_EventScript_FirstReward:: specialvar VAR_RESULT, CalculatePlayerPartyCount goto_if_eq VAR_RESULT, 6, FiveIsland_ResortGorgeous_House_EventScript_NoRoomForEgg playfanfare MUS_LEVEL_UP textcolor 3 msgbox FiveIsland_ResortGorgeous_House_Text_ObtainedTheEgg waitmessage waitfanfare closemessage callnative GiveSelphyCorsolaEgg specialvar VAR_RESULT, CalculatePlayerPartyCount subvar VAR_RESULT, 1 setmonmetlocation VAR_RESULT, MAPSEC_FOUR_ISLAND setflag SHOWN_REQUESTED_MON setflag FLAG_GIVEN_CORSOLA_EGG setvar VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE release end FiveIsland_ResortGorgeous_House_Text_ObtainedTheEgg:: .string "{PLAYER} received the EGG from\n" .string "SEBASTIAN.$" FiveIsland_ResortGorgeous_House_EventScript_NoRoomForEgg:: textcolor 0 msgbox FiveIsland_ResortGorgeous_House_Text_ButlerPartyAppearsToBeFull textcolor 1 msgbox FiveIsland_ResortGorgeous_House_Text_OhHowDisappointing setflag SHOWN_REQUESTED_MON setvar VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE release end FiveIsland_ResortGorgeous_House_Text_ButlerPartyAppearsToBeFull:: .string "Butler: Your party appears to be\n" .string "unfortunately full.$" FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerNorth:: applymovement LOCALID_SELPHY, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerNorth waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerSouth:: applymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerSouth waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerEast:: applymovement LOCALID_SELPHY, Common_Movement_WalkInPlaceFasterLeft applymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerEast waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerWest:: applymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerWest waitmovement 0 return FiveIsland_ResortGorgeous_House_EventScript_NoRoomForReward:: textcolor NPC_TEXT_COLOR_MALE msgbox FiveIsland_ResortGorgeous_House_Text_ButlerBagAppearsToBeFull textcolor NPC_TEXT_COLOR_FEMALE msgbox FiveIsland_ResortGorgeous_House_Text_OhHowDisappointing setflag SHOWN_REQUESTED_MON setvar VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE release end FiveIsland_ResortGorgeous_House_EventScript_JustFulfilledRequest:: msgbox FiveIsland_ResortGorgeous_House_Text_SelphyWishYouBestOfLuck release end FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerNorth:: walk_left walk_left walk_left walk_down walk_down walk_down walk_in_place_faster_right step_end FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerSouth:: walk_left walk_left walk_in_place_faster_down step_end FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerEast:: walk_left walk_left walk_left walk_down step_end @ Very odd. If the player is talking to Selphy facing West, then the player has clipped through the table @ In this case rather than approach the player the Butler walks up, which clips the Butler into a wall FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerWest:: walk_up step_end FiveIsland_ResortGorgeous_House_Movement_ButlerEnter:: walk_in_place_down step_end @ Addressed as "Sebastian" but speaks only as "Butler" FiveIsland_ResortGorgeous_House_EventScript_Butler:: msgbox FiveIsland_ResortGorgeous_House_Text_LadySelphySmileHasBrillianceOfSun, MSGBOX_NPC end FiveIsland_ResortGorgeous_House_EventScript_Painting:: goto_if_unset FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY, FiveIsland_ResortGorgeous_House_EventScript_PaintingSelphy msgbox FiveIsland_ResortGorgeous_House_Text_WomanWithCorsola, MSGBOX_SIGN end FiveIsland_ResortGorgeous_House_EventScript_PaintingSelphy:: msgbox FiveIsland_ResortGorgeous_House_Text_SelphyWithCorsola, MSGBOX_SIGN end FiveIsland_ResortGorgeous_House_Text_WomanWithCorsola:: .string "It's a photo of a woman relaxing\n" .string "at a resort surrounded by many\l" .string "pink, coral POKéMON.$" FiveIsland_ResortGorgeous_House_Text_SelphyWithCorsola:: .string "It's a photo of SELPHY relaxing\n" .string "at a resort surrounded by many\l" .string "pink, coral POKéMON.$" ================================================ FILE: data/maps/FiveIsland_ResortGorgeous_House/text.inc ================================================ FiveIsland_ResortGorgeous_House_Text_PleaseHearMyWish:: .string "SELPHY: Oh?\n" .string "Do I know you from somewhere?\p" .string "Oh, but that doesn't matter.\p" .string "I am exquisitely bored.\n" .string "Please, hear my wish.$" FiveIsland_ResortGorgeous_House_Text_WishToSeeMonPlease:: .string "I wish to see a POKéMON.\n" .string "A darling {STR_VAR_1}.\p" .string "I want to see one right away.\n" .string "Please, make my wish come true.$" FiveIsland_ResortGorgeous_House_Text_OhImTiredOfWaiting:: .string "SELPHY: Oh, I'm tired of this.\n" .string "I'm tired of waiting for you.\p" .string "I'll forgive you this time, but\n" .string "please don't fail me next time.$" FiveIsland_ResortGorgeous_House_Text_MonYouCaughtForMeThankYou:: .string "SELPHY: Oh, hello, there.\p" .string "Oh, my gracious. That must be the\n" .string "{STR_VAR_1} you caught for me.\p" .string "Giggle…\n" .string "I see a resemblance to you.\p" .string "Thank you so kindly.\p" .string "… … … … … …\n" .string "Is something the matter?\p" .string "You may leave.\p" .string "… … … … … …\n" .string "Oh, fine. I understand now.\p" .string "SEBASTIAN!\n" .string "I need you here this instant!$" FiveIsland_ResortGorgeous_House_Text_ButlerYesMyLady:: .string "Butler: Yes, my lady.$" FiveIsland_ResortGorgeous_House_Text_SelphyGiveTokenOfAppreciation:: .string "SELPHY: See to it that this person\n" .string "is given a token of appreciation.$" FiveIsland_ResortGorgeous_House_Text_ButlerIShallDoAsYouBid:: .string "Butler: I shall do as you bid,\n" .string "my lady.$" FiveIsland_ResortGorgeous_House_Text_ButlerPleaseAcceptThisAsHerThanks:: .string "Butler: I sincerely thank you for\n" .string "pleasing Lady SELPHY.\p" .string "Please accept this as her thanks…$" FiveIsland_ResortGorgeous_House_Text_ButlerBagAppearsToBeFull:: .string "Butler: Your BAG appears to be\n" .string "unfortunately full.$" FiveIsland_ResortGorgeous_House_Text_OhHowDisappointing:: .string "Oh…\n" .string "How disappointing.$" FiveIsland_ResortGorgeous_House_Text_SelphyWishYouBestOfLuck:: .string "SELPHY: I wish you the best of\n" .string "luck.$" FiveIsland_ResortGorgeous_House_Text_LadySelphySmileHasBrillianceOfSun:: .string "Butler: The smile of Lady SELPHY\n" .string "has the brilliance of the sun.\p" .string "Please, I beg you to bring joy\n" .string "to Lady SELPHY.$" ================================================ FILE: data/maps/FiveIsland_RocketWarehouse/map.json ================================================ { "id": "MAP_FIVE_ISLAND_ROCKET_WAREHOUSE", "name": "FiveIsland_RocketWarehouse", "layout": "LAYOUT_FIVE_ISLAND_ROCKET_WAREHOUSE", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_ROCKET_WAREHOUSE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 15, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_RocketWarehouse_EventScript_Grunt2", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 17, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_RocketWarehouse_EventScript_Grunt3", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_F", "in_connection": false, "x": 27, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "FiveIsland_RocketWarehouse_EventScript_Admin1", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 25, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "FiveIsland_RocketWarehouse_EventScript_Admin2", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_F", "in_connection": false, "x": 6, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "FiveIsland_RocketWarehouse_EventScript_Grunt1", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 27, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_RocketWarehouse_EventScript_Gideon", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 8, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_RocketWarehouse_EventScript_ItemBigPearl", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_BIG_PEARL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_4F_EventScript_ItemTM41", "flag": "FLAG_HIDE_SILPH_CO_4F_TM41" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 1, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_RocketWarehouse_EventScript_ItemPearl", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_PEARL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_3F_EventScript_ItemHyperPotion", "flag": "FLAG_HIDE_SILPH_CO_3F_HYPER_POTION" } ], "warp_events": [ { "x": 24, "y": 25, "elevation": 3, "dest_map": "MAP_FIVE_ISLAND_MEADOW", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 22, "y": 11, "elevation": 3, "var": "VAR_MAP_SCENE_ROCKET_WAREHOUSE", "var_value": "0", "script": "FiveIsland_RocketWarehouse_EventScript_Admin2Trigger" }, { "type": "trigger", "x": 23, "y": 11, "elevation": 3, "var": "VAR_MAP_SCENE_ROCKET_WAREHOUSE", "var_value": "0", "script": "FiveIsland_RocketWarehouse_EventScript_Admin2Trigger" }, { "type": "trigger", "x": 24, "y": 11, "elevation": 3, "var": "VAR_MAP_SCENE_ROCKET_WAREHOUSE", "var_value": "0", "script": "FiveIsland_RocketWarehouse_EventScript_Admin2Trigger" } ], "bg_events": [ { "type": "sign", "x": 11, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 26, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "FiveIsland_RocketWarehouse_EventScript_Computer" }, { "type": "hidden_item", "x": 27, "y": 2, "elevation": 0, "item": "ITEM_NEST_BALL", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_ROCKET_WAREHOUSE_NEST_BALL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 7, "y": 16, "elevation": 0, "item": "ITEM_NET_BALL", "flag": "FLAG_HIDDEN_ITEM_FIVE_ISLAND_ROCKET_WAREHOUSE_NET_BALL", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 12, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 10, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 9, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 8, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 7, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 11, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 10, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 11, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 10, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 8, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 7, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 8, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 7, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 5, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 4, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 5, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 4, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 3, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 2, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 2, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" }, { "type": "sign", "x": 3, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FiveIsland_RocketWarehouse_EventScript_Cage" } ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_RocketWarehouse/scripts.inc ================================================ .equ LOCALID_GRUNT1, 5 .equ LOCALID_GRUNT2, 1 .equ LOCALID_GRUNT3, 2 .equ LOCALID_ADMIN1, 3 .equ LOCALID_ADMIN2, 4 .equ PLAYER_X_POS, VAR_0x8004 .equ PLAYER_Y_POS, VAR_0x8005 FiveIsland_RocketWarehouse_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, FiveIsland_RocketWarehouse_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, FiveIsland_RocketWarehouse_OnTransition .byte 0 FiveIsland_RocketWarehouse_OnTransition:: setworldmapflag FLAG_WORLD_MAP_FIVE_ISLAND_ROCKET_WAREHOUSE end FiveIsland_RocketWarehouse_OnLoad:: call_if_defeated TRAINER_TEAM_ROCKET_ADMIN, FiveIsland_RocketWarehouse_EventScript_SetArrowsForReEntry end FiveIsland_RocketWarehouse_EventScript_SetArrowsForReEntry:: setmetatile 26, 20, METATILE_SilphCo_Arrow_Up, 0 setmetatile 27, 20, METATILE_SilphCo_Arrow_Up, 0 return FiveIsland_RocketWarehouse_EventScript_Cage:: lockall goto_if_set FLAG_DEFEATED_ROCKETS_IN_WAREHOUSE, FiveIsland_RocketWarehouse_EventScript_CageUnlocked msgbox FiveIsland_RocketWarehouse_Text_ManyMonsLockedInPen releaseall end FiveIsland_RocketWarehouse_EventScript_CageUnlocked:: msgbox FiveIsland_RocketWarehouse_Text_PenUnlockedMonsFled releaseall end FiveIsland_RocketWarehouse_EventScript_Computer:: msgbox FiveIsland_RocketWarehouse_Text_ReportWithGraphsAndText, MSGBOX_SIGN end FiveIsland_RocketWarehouse_EventScript_Admin2Trigger:: lockall applymovement LOCALID_ADMIN2, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 setvar VAR_MAP_SCENE_ROCKET_WAREHOUSE, 1 releaseall end FiveIsland_RocketWarehouse_EventScript_Gideon:: trainerbattle_single TRAINER_SCIENTIST_GIDEON, FiveIsland_RocketWarehouse_Text_GideonIntro, FiveIsland_RocketWarehouse_Text_GideonDefeat, FiveIsland_RocketWarehouse_EventScript_DefeatedGideon goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, FiveIsland_RocketWarehouse_EventScript_MentionGiovannisKid msgbox FiveIsland_RocketWarehouse_Text_GetLostLeaveMeBe, MSGBOX_AUTOCLOSE end FiveIsland_RocketWarehouse_EventScript_MentionGiovannisKid:: famechecker FAMECHECKER_GIOVANNI, 5 msgbox FiveIsland_RocketWarehouse_Text_GiovannisKidHasRedHair, MSGBOX_AUTOCLOSE end FiveIsland_RocketWarehouse_EventScript_DefeatedGideon:: msgbox FiveIsland_RocketWarehouse_Text_GideonPostBattle setflag FLAG_RECOVERED_SAPPHIRE giveitem ITEM_SAPPHIRE release end FiveIsland_RocketWarehouse_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_47, FiveIsland_RocketWarehouse_Text_Grunt2Intro, FiveIsland_RocketWarehouse_Text_Grunt2Defeat msgbox FiveIsland_RocketWarehouse_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end FiveIsland_RocketWarehouse_EventScript_Grunt3:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_48, FiveIsland_RocketWarehouse_Text_Grunt3Intro, FiveIsland_RocketWarehouse_Text_Grunt3Defeat msgbox FiveIsland_RocketWarehouse_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE end FiveIsland_RocketWarehouse_EventScript_Admin2:: trainerbattle_single TRAINER_TEAM_ROCKET_ADMIN_2, FiveIsland_RocketWarehouse_Text_Admin2Intro, FiveIsland_RocketWarehouse_Text_Admin2Defeat, FiveIsland_RocketWarehouse_EventScript_DefeatedAdmin2 msgbox FiveIsland_RocketWarehouse_Text_Admin2PostBattle, MSGBOX_AUTOCLOSE end FiveIsland_RocketWarehouse_EventScript_DefeatedAdmin2:: getplayerxy PLAYER_X_POS, PLAYER_Y_POS call_if_le PLAYER_X_POS, 24, FiveIsland_RocketWarehouse_EventScript_PlayerFaceAdmin2 msgbox FiveIsland_RocketWarehouse_Text_Admin2PostBattle closemessage fadescreen FADE_TO_BLACK removeobject LOCALID_GRUNT2 removeobject LOCALID_GRUNT3 removeobject LOCALID_ADMIN2 removeobject LOCALID_ADMIN1 setflag FLAG_HIDE_FIVE_ISLAND_ROCKETS fadescreen FADE_FROM_BLACK setvar VAR_MAP_SCENE_ROCKET_WAREHOUSE, 1 setflag FLAG_DEFEATED_ROCKETS_IN_WAREHOUSE release end FiveIsland_RocketWarehouse_EventScript_PlayerFaceAdmin2:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return FiveIsland_RocketWarehouse_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_42, FiveIsland_RocketWarehouse_Text_Grunt1Intro, FiveIsland_RocketWarehouse_Text_Grunt1Defeat msgbox FiveIsland_RocketWarehouse_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end FiveIsland_RocketWarehouse_EventScript_Admin1:: trainerbattle_single TRAINER_TEAM_ROCKET_ADMIN, FiveIsland_RocketWarehouse_Text_Admin1Intro, FiveIsland_RocketWarehouse_Text_Admin1Defeat, FiveIsland_RocketWarehouse_EventScript_DefeatedAdmin1 msgbox FiveIsland_RocketWarehouse_Text_MadeItSoYouCanComeBackThrough, MSGBOX_AUTOCLOSE end FiveIsland_RocketWarehouse_EventScript_DefeatedAdmin1:: getplayerxy PLAYER_X_POS, PLAYER_Y_POS specialvar VAR_RESULT, GetPlayerFacingDirection call_if_eq VAR_RESULT, DIR_NORTH, FiveIsland_RocketWarehouse_EventScript_PlayerFaceAdmin1 msgbox FiveIsland_RocketWarehouse_Text_Admin1PostBattle closemessage call_if_le PLAYER_X_POS, 24, FiveIsland_RocketWarehouse_EventScript_AdminWalkToSwitchFar call_if_eq PLAYER_X_POS, 25, FiveIsland_RocketWarehouse_EventScript_AdminWalkToSwitch call_if_eq PLAYER_X_POS, 26, FiveIsland_RocketWarehouse_EventScript_AdminFaceSwitch call_if_eq PLAYER_X_POS, 27, FiveIsland_RocketWarehouse_EventScript_AdminFaceSwitch playse SE_PIN call FiveIsland_RocketWarehouse_EventScript_SetArrowsForReEntry special DrawWholeMapView waitse call_if_le PLAYER_X_POS, 24, FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerLeft call_if_eq PLAYER_X_POS, 25, FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerLeft call_if_eq PLAYER_X_POS, 26, FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerLeft call_if_eq PLAYER_X_POS, 27, FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerDown msgbox FiveIsland_RocketWarehouse_Text_MadeItSoYouCanComeBackThrough release end FiveIsland_RocketWarehouse_EventScript_PlayerFaceAdmin1:: goto_if_eq PLAYER_X_POS, 27, EventScript_Return applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return FiveIsland_RocketWarehouse_EventScript_AdminWalkToSwitchFar:: applymovement LOCALID_ADMIN1, FiveIsland_RocketWarehouse_Movement_AdminWalkToSwitchFar waitmovement 0 return FiveIsland_RocketWarehouse_EventScript_AdminWalkToSwitch:: applymovement LOCALID_ADMIN1, FiveIsland_RocketWarehouse_Movement_AdminWalkToSwitch waitmovement 0 return FiveIsland_RocketWarehouse_EventScript_AdminFaceSwitch:: applymovement LOCALID_ADMIN1, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerLeft:: applymovement LOCALID_ADMIN1, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerDown:: applymovement LOCALID_ADMIN1, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return FiveIsland_RocketWarehouse_Movement_AdminWalkToSwitchFar:: walk_right walk_right walk_in_place_faster_up step_end FiveIsland_RocketWarehouse_Movement_AdminWalkToSwitch:: walk_right walk_in_place_faster_up step_end ================================================ FILE: data/maps/FiveIsland_RocketWarehouse/text.inc ================================================ FiveIsland_RocketWarehouse_Text_ManyMonsLockedInPen:: .string "There are many POKéMON locked\n" .string "away in the pen…$" FiveIsland_RocketWarehouse_Text_PenUnlockedMonsFled:: .string "The pen door is unlocked.\n" .string "The POKéMON appear to have fled.$" FiveIsland_RocketWarehouse_Text_Grunt2Intro:: .string "Did you come here knowing it's\n" .string "TEAM ROCKET's WAREHOUSE?$" FiveIsland_RocketWarehouse_Text_Grunt2Defeat:: .string "What do you think you're doing?!$" FiveIsland_RocketWarehouse_Text_Grunt2PostBattle:: .string "TEAM ROCKET broke up?\n" .string "What planet are you from?$" FiveIsland_RocketWarehouse_Text_Grunt1Intro:: .string "Oh, now your POKéMON look strong.\n" .string "You're willing to sell them?\p" .string "Oh?\n" .string "You wanted to battle?$" FiveIsland_RocketWarehouse_Text_Grunt1Defeat:: .string "Oh, but…\n" .string "Too much!$" FiveIsland_RocketWarehouse_Text_Grunt1PostBattle:: .string "We can give you a great price.\n" .string "Sell us your POKéMON!$" FiveIsland_RocketWarehouse_Text_Grunt3Intro:: .string "I got word about you from the\n" .string "others.\p" .string "But there's no way a kid like you'd\n" .string "know our BOSS GIOVANNI!$" FiveIsland_RocketWarehouse_Text_Grunt3Defeat:: .string "Don't…you…dare…laugh…$" FiveIsland_RocketWarehouse_Text_Grunt3PostBattle:: .string "Don't mess in the doings of adults,\n" .string "you jumped-up pip-squeak!$" FiveIsland_RocketWarehouse_Text_Admin1Intro:: .string "I don't know or care if what I'm\n" .string "doing is right or wrong…\p" .string "I just put my faith in GIOVANNI\n" .string "and do as I am told.$" FiveIsland_RocketWarehouse_Text_Admin1Defeat:: .string "I…\n" .string "I'm shattered…$" FiveIsland_RocketWarehouse_Text_Admin1PostBattle:: .string "You're doing things according to\n" .string "your beliefs and morals.\p" .string "I understand now…$" FiveIsland_RocketWarehouse_Text_MadeItSoYouCanComeBackThrough:: .string "I've made it so you can come back\n" .string "in through there.\p" .string "Why don't you go get rested and\n" .string "refreshed for what lies ahead?\p" .string "The ADMIN after me outranks me\n" .string "thoroughly as a TRAINER.\p" .string "You'd better steel yourself for one\n" .string "harsh challenge.$" FiveIsland_RocketWarehouse_Text_Admin2Intro:: .string "That's quite enough of you \n" .string "playing the hero, kid.\p" .string "Spreading lies about how TEAM\n" .string "ROCKET has disbanded…\p" .string "It's such an obvious attempt to\n" .string "cause confusion in our ranks.\p" .string "Fortunately, we're not so ignorant\n" .string "to fall for the lies of a child!\p" .string "And now, I'll show you how scary\n" .string "an angry adult can be!$" FiveIsland_RocketWarehouse_Text_Admin2Defeat:: .string "Urgh…\n" .string "You were too strong…\p" .string "…\n" .string "Th-that's GIOVANNI's BADGE!\p" .string "So it's true?\n" .string "TEAM ROCKET really has disbanded?$" FiveIsland_RocketWarehouse_Text_Admin2PostBattle:: .string "We will abandon this WAREHOUSE…\p" .string "But don't think this is over.\n" .string "I won't let this be the end.\p" .string "I will find GIOVANNI.\n" .string "And I will resurrect TEAM ROCKET!\l" .string "I will…\p" .string "Until then, farewell!$" FiveIsland_RocketWarehouse_Text_ReportWithGraphsAndText:: .string "A report with graphs and text is on\n" .string "the PC monitor.\p" .string "“The Influence of Magnetic Waves\n" .string "on POKéMON Evolution”…\p" .string "… … … … … …\p" .string "It's too difficult to understand…$" FiveIsland_RocketWarehouse_Text_GideonIntro:: .string "I almost managed to sell the\n" .string "SAPPHIRE for huge money…\p" .string "Then, you just had to come along\n" .string "and blow the whole deal apart!\p" .string "Fufu… Fufufufu…\n" .string "There's no forgiveness for you!$" FiveIsland_RocketWarehouse_Text_GideonDefeat:: .string "Gah! Darn!\n" .string "Darn! Darn!$" FiveIsland_RocketWarehouse_Text_GideonPostBattle:: .string "If I can't sell it, it's worthless!\n" .string "Go ahead, take it!$" FiveIsland_RocketWarehouse_Text_GetLostLeaveMeBe:: .string "What do you want now?\n" .string "Go on, get lost, leave me be.$" FiveIsland_RocketWarehouse_Text_GiovannisKidHasRedHair:: .string "What, you again?\p" .string "You… You're not GIOVANNI's kid,\n" .string "are you?\p" .string "No, that can't be right!\n" .string "GIOVANNI's kid has red hair.\p" .string "You don't have any reasons for\n" .string "bugging me. Leave me alone!$" ================================================ FILE: data/maps/FiveIsland_WaterLabyrinth/map.json ================================================ { "id": "MAP_FIVE_ISLAND_WATER_LABYRINTH", "name": "FiveIsland_WaterLabyrinth", "layout": "LAYOUT_FIVE_ISLAND_WATER_LABYRINTH", "music": "MUS_ROUTE122", "region_map_section": "MAPSEC_WATER_LABYRINTH", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 48, "map": "MAP_FIVE_ISLAND_RESORT_GORGEOUS" }, { "direction": "down", "offset": 48, "map": "MAP_FIVE_ISLAND" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 14, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_WaterLabyrinth_EventScript_EggGentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEMON_BREEDER", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FiveIsland_WaterLabyrinth_EventScript_Alize", "flag": "0" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FiveIsland_WaterLabyrinth/scripts.inc ================================================ FiveIsland_WaterLabyrinth_MapScripts:: .byte 0 FiveIsland_WaterLabyrinth_EventScript_EggGentleman:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer goto_if_set FLAG_GOT_TOGEPI_EGG, FiveIsland_WaterLabyrinth_EventScript_PostEggComment goto_if_set FLAG_NO_ROOM_FOR_TOGEPI_EGG, FiveIsland_WaterLabyrinth_EventScript_ReturnForEgg msgbox FiveIsland_WaterLabyrinth_Text_LetMeTakeLookAtMons specialvar VAR_RESULT, GetLeadMonFriendship goto_if_eq VAR_RESULT, 6, FiveIsland_WaterLabyrinth_EventScript_LeadMonMaxFriendship msgbox FiveIsland_WaterLabyrinth_Text_HmmISeeIsee release end FiveIsland_WaterLabyrinth_EventScript_MonDaisyComment:: famechecker FAMECHECKER_DAISY, 2 msgbox FiveIsland_WaterLabyrinth_Text_CuteMonRemindsMeOfDaisy release end FiveIsland_WaterLabyrinth_EventScript_LeadMonMaxFriendship:: msgbox FiveIsland_WaterLabyrinth_Text_TreatMonRightHaveThis goto FiveIsland_WaterLabyrinth_EventScript_TryGiveEgg end FiveIsland_WaterLabyrinth_EventScript_TryGiveEgg:: getpartysize goto_if_eq VAR_RESULT, PARTY_SIZE, FiveIsland_WaterLabyrinth_EventScript_NoRoomForEgg setflag FLAG_GOT_TOGEPI_EGG giveegg SPECIES_TOGEPI textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message FiveIsland_WaterLabyrinth_Text_ReceivedEggFromMan waitfanfare waitmessage call EventScript_RestorePrevTextColor goto FiveIsland_WaterLabyrinth_EventScript_PostEggComment end @ If the player has a Togepi/Togetic from this game (assumed to be the one the man gave you) then comment on it @ Otherwise make normal comment FiveIsland_WaterLabyrinth_EventScript_PostEggComment:: bufferspeciesname STR_VAR_2, SPECIES_TOGEPI setvar VAR_0x8004, SPECIES_TOGEPI specialvar VAR_RESULT, PlayerPartyContainsSpeciesWithPlayerID goto_if_eq VAR_RESULT, TRUE, FiveIsland_WaterLabyrinth_EventScript_MonDaisyComment bufferspeciesname STR_VAR_2, SPECIES_TOGETIC setvar VAR_0x8004, SPECIES_TOGETIC specialvar VAR_RESULT, PlayerPartyContainsSpeciesWithPlayerID goto_if_eq VAR_RESULT, TRUE, FiveIsland_WaterLabyrinth_EventScript_MonDaisyComment msgbox FiveIsland_WaterLabyrinth_Text_GladIMetSomeoneLikeYou release end FiveIsland_WaterLabyrinth_EventScript_NoRoomForEgg:: setflag FLAG_NO_ROOM_FOR_TOGEPI_EGG msgbox FiveIsland_WaterLabyrinth_Text_DontHaveSpaceInYourParty release end FiveIsland_WaterLabyrinth_EventScript_ReturnForEgg:: goto FiveIsland_WaterLabyrinth_EventScript_TryGiveEgg end ================================================ FILE: data/maps/FiveIsland_WaterLabyrinth/text.inc ================================================ FiveIsland_WaterLabyrinth_Text_LetMeTakeLookAtMons:: .string "You travel all over the place,\n" .string "don't you?\p" .string "You're not driving your POKéMON\n" .string "too harshly, are you?\p" .string "Let me take a look.\n" .string "… … … … … …$" FiveIsland_WaterLabyrinth_Text_HmmISeeIsee:: .string "Ah, hmm…\n" .string "I see, I see…$" FiveIsland_WaterLabyrinth_Text_TreatMonRightHaveThis:: .string "Oh, impressive.\n" .string "You treat your POKéMON right.\p" .string "I think you can be entrusted with\n" .string "this.\p" .string "Please, I'd like you to have this.$" FiveIsland_WaterLabyrinth_Text_ReceivedEggFromMan:: .string "{PLAYER} received an EGG\n" .string "from the man!$" FiveIsland_WaterLabyrinth_Text_DontHaveSpaceInYourParty:: .string "…Unfortunately, you don't have\n" .string "space for this in your party.\p" .string "You'd better come back for it\n" .string "another time.$" FiveIsland_WaterLabyrinth_Text_GladIMetSomeoneLikeYou:: .string "I received that EGG while I was\n" .string "traveling.\p" .string "I'm glad I met someone like you.$" FiveIsland_WaterLabyrinth_Text_CuteMonRemindsMeOfDaisy:: .string "Oh, hello.\n" .string "That's a cute {STR_VAR_2}.\p" .string "Seeing it reminds me of a sweet \n" .string "little girl I met while traveling.\p" .string "She was gently grooming POKéMON…\n" .string "She was a little angel.\p" .string "That little girl's name…\n" .string "I think it was DAISY.$" FiveIsland_WaterLabyrinth_Text_AlizeIntro:: .string "This is an excellent environment\n" .string "for raising POKéMON.$" FiveIsland_WaterLabyrinth_Text_AlizeDefeat:: .string "Your POKéMON are growing up\n" .string "admirably well!$" FiveIsland_WaterLabyrinth_Text_AlizePostBattle:: .string "You know, I think you have the\n" .string "talent to be a good BREEDER.$" ================================================ FILE: data/maps/FourIsland/map.json ================================================ { "id": "MAP_FOUR_ISLAND", "name": "FourIsland", "layout": "LAYOUT_FOUR_ISLAND", "music": "MUS_FALLARBOR", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 16, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_EventScript_DaycareMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_DODUO", "in_connection": false, "x": 12, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NIDORAN_F", "in_connection": false, "x": 13, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NIDORAN_M", "in_connection": false, "x": 14, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYDUCK", "in_connection": false, "x": 17, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 26, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_EventScript_OldWoman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 32, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_EventScript_ItemStardust", "flag": "FLAG_HIDE_FOUR_ISLAND_STARDUST" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 36, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_EventScript_FatMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 31, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_EventScript_LittleGirl", "flag": "0" } ], "warp_events": [ { "x": 18, "y": 20, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "0" }, { "x": 12, "y": 13, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_POKEMON_DAY_CARE", "dest_warp_id": "0" }, { "x": 25, "y": 13, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_HOUSE1", "dest_warp_id": "0" }, { "x": 38, "y": 12, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE", "dest_warp_id": "0" }, { "x": 33, "y": 23, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_LORELEIS_HOUSE", "dest_warp_id": "0" }, { "x": 25, "y": 26, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_HOUSE2", "dest_warp_id": "0" }, { "x": 10, "y": 23, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_CABLE_CAR_STATION", "dest_warp_id": "0" }, { "x": 22, "y": 26, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_MART", "dest_warp_id": "0" }, { "x": 11, "y": 23, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_CABLE_CAR_STATION", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 13, "y": 19, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FourIsland_EventScript_IslandSign" }, { "type": "sign", "x": 31, "y": 23, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FourIsland_EventScript_LoreleisHouseSign" } ], "level_scaling": "5" } ================================================ FILE: data/maps/FourIsland/scripts.inc ================================================ .equ LOCALID_DAYCARE_MAN, 1 FourIsland_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FourIsland_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_OnFrame .byte 0 FourIsland_OnTransition:: setworldmapflag FLAG_WORLD_MAP_FOUR_ISLAND call FourIsland_EventScript_TrySetDayCareManPos end FourIsland_EventScript_TrySetDayCareManPos:: goto_if_unset FLAG_GOT_RIVAL_STARTER_EGG, FourIsland_EventScript_SetDayCareManPos goto_if_unset FLAG_PENDING_DAYCARE_EGG, FourIsland_EventScript_EndSetDayCareManPos setobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_RAISE_HAND_AND_STOP FourIsland_EventScript_EndSetDayCareManPos:: return FourIsland_EventScript_SetDayCareManPos:: setobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return FourIsland_OnFrame:: map_script_2 VAR_DAYCARE_MAN_TRIGGERS, 0, FourIsland_EventScript_RepositionDaycareMan .2byte 0 FourIsland_EventScript_DaycareMan:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer goto_if_unset FLAG_GOT_RIVAL_STARTER_EGG, FourIsland_EventScript_StarterEggDaycareMan special GetDaycareMonNicknames specialvar VAR_RESULT, GetDaycareState goto_if_eq VAR_RESULT, DAYCARE_EGG_WAITING, FourIsland_EventScript_DaycareEggWaiting goto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_EventScript_CheckOnOneMon goto_if_eq VAR_RESULT, DAYCARE_TWO_MONS, FourIsland_EventScript_CheckOnTwoMons msgbox DayCare_Text_ImDaycareManSpeakToMyWife release end FourIsland_EventScript_DaycareEggWaiting:: msgbox DayCare_Text_DoYouWantEgg, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FourIsland_EventScript_DaycareAcceptEgg msgbox DayCare_Text_IWillKeepDoYouWantIt, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FourIsland_EventScript_DaycareAcceptEgg msgbox DayCare_Text_IllKeepIt clearflag FLAG_PENDING_DAYCARE_EGG special RejectEggFromDayCare setvar VAR_DAYCARE_MAN_TRIGGERS, 0 release setobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN setobjectmovementtypeinstant LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN end FourIsland_EventScript_DaycareAcceptEgg:: specialvar VAR_RESULT, CalculatePlayerPartyCount goto_if_ne VAR_RESULT, PARTY_SIZE, FourIsland_EventScript_DaycareReceivedEgg msgbox DayCare_Text_YouHaveNoRoomForIt release end FourIsland_EventScript_DaycareReceivedEgg:: textcolor NPC_TEXT_COLOR_NEUTRAL message DayCare_Text_ReceivedEgg call EventScript_RestorePrevTextColor playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress msgbox DayCare_Text_TakeGoodCareOfIt special GiveEggFromDaycare clearflag FLAG_PENDING_DAYCARE_EGG setvar VAR_DAYCARE_MAN_TRIGGERS, 0 release setobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN setobjectmovementtypeinstant LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN end FourIsland_EventScript_CheckOnOneMon:: special GetDaycareMonNicknames msgbox DayCare_Text_YourMonIsDoingFine release end FourIsland_EventScript_CheckOnTwoMons:: special GetDaycareMonNicknames msgbox DayCare_Text_YourMonsAreDoingFine special SetDaycareCompatibilityString special ShowFieldMessageStringVar4 waitmessage waitbuttonpress release end FourIsland_EventScript_OldWoman:: lock faceplayer goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, FourIsland_EventScript_OldWomanLoreleiLeft msgbox FourIsland_Text_LoreleiHasReturned release end FourIsland_EventScript_OldWomanLoreleiLeft:: famechecker FAMECHECKER_LORELEI, 5 msgbox FourIsland_Text_LoreleiMetLaprasAsChild release end FourIsland_EventScript_LittleGirl:: lock faceplayer famechecker FAMECHECKER_LORELEI, 4 msgbox FourIsland_Text_LoreleiHasLotsOfStuffedDolls release end FourIsland_EventScript_FatMan:: msgbox FourIsland_Text_MadeSlushieUsingIcefallCaveIce, MSGBOX_NPC end FourIsland_EventScript_IslandSign:: msgbox FourIsland_Text_IslandSign, MSGBOX_SIGN end FourIsland_EventScript_LoreleisHouseSign:: msgbox FourIsland_Text_LoreleisHouse, MSGBOX_SIGN end FourIsland_EventScript_StarterEggDaycareMan:: msgbox FourIsland_EventScript_StarterEggDaycareMan_Text_0, MSGBOX_YESNO compare VAR_RESULT, 0 goto_if_ne FourIsland_EventScript_StarterEggDaycareMan_2 msgbox FourIsland_EventScript_StarterEggDaycareMan_Text_1 release end FourIsland_EventScript_StarterEggDaycareMan_2: specialvar VAR_RESULT, CalculatePlayerPartyCount compare VAR_RESULT, PARTY_SIZE goto_if_eq FourIsland_EventScript_StarterEggDaycareMan_5 textcolor 3 message DayCare_Text_ReceivedEgg call EventScript_RestorePrevTextColor playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress msgbox DayCare_Text_TakeGoodCareOfIt callnative GiveRivalStarterEgg FourIsland_EventScript_StarterEggDaycareMan_7: setflag FLAG_GOT_RIVAL_STARTER_EGG setvar VAR_DAYCARE_MAN_TRIGGERS, 0 release setobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN setobjectmovementtypeinstant LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN end FourIsland_EventScript_StarterEggDaycareMan_5: msgbox DayCare_Text_YouHaveNoRoomForIt release end FourIsland_EventScript_StarterEggDaycareMan_Text_0: .string "Ah, hello!\nI'm the DAY-CARE MAN.\pI help take care of the precious\nPOKéMON of TRAINERS.\pWe were raising a TRAINER's POKéMON\nand were surprised to find an EGG!\pHe didn't want it, but you look\nlike a TRAINER.\pWould you like to take care\nof this EGG instead?$" FourIsland_EventScript_StarterEggDaycareMan_Text_1: .string "I guess I'll keep this EGG until a\nTRAINER comes along who wants it.$" FourIsland_EventScript_RepositionDaycareMan:: goto_if_unset FLAG_GOT_RIVAL_STARTER_EGG, FourIsland_EventScript_RepositionDaycareMan_2 goto_if_unset FLAG_PENDING_DAYCARE_EGG, FourIsland_EventScript_RepositionDaycareMan_3 FourIsland_EventScript_RepositionDaycareMan_2: setobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_RAISE_HAND_AND_STOP setobjectmovementtypeinstant LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_RAISE_HAND_AND_STOP FourIsland_EventScript_RepositionDaycareMan_3: setvar VAR_DAYCARE_MAN_TRIGGERS, 1 end ================================================ FILE: data/maps/FourIsland/text.inc ================================================ FourIsland_Text_IslandSign:: .string "FOUR ISLAND\n" .string "The Cold, Blue, Floe Island$" FourIsland_Text_LoreleiHasReturned:: .string "LORELEI has returned.\p" .string "Did she find the city life too\n" .string "stressful, I wonder?$" FourIsland_Text_LoreleiMetLaprasAsChild:: .string "LORELEI has gone back.\p" .string "The LAPRAS she has, I imagine it\n" .string "to be the one she met as a child.\p" .string "I believe it was in ICEFALL CAVE\n" .string "that she caught it.\p" .string "Perhaps that POKéMON has been with\n" .string "her ever since.$" FourIsland_Text_RivalAlreadyGotEggBeSmellingYa:: .string "{RIVAL}: Hey!\n" .string "{PLAYER}!\p" .string "What are you doing here in the\n" .string "SEVII ISLANDS?\p" .string "You should quit copying me,\n" .string "you know?\p" .string "Anyways, I already got my POKéMON\n" .string "EGG, so I'm done with this island.\p" .string "Heh, I bet you don't even know\n" .string "about POKéMON EGGS.\p" .string "You'll never fill your NATIONAL\n" .string "POKéDEX that way.\p" .string "By the way, I saw someone we both\n" .string "know on this island.\p" .string "Why don't you go look around if\n" .string "it makes you curious?\p" .string "Me, I don't have the time to\n" .string "waste.\p" .string "Be smelling ya!$" FourIsland_Text_LoreleiHasLotsOfStuffedDolls:: .string "Oh, you found me!\n" .string "Please don't tell LORELEI.\p" .string "Did you know that LORELEI has lots\n" .string "and lots of stuffed dolls?\p" .string "Every time she comes back to\n" .string "FOUR ISLAND, her collection grows!$" FourIsland_Text_MadeSlushieUsingIcefallCaveIce:: .string "Ooh, chilly!\p" .string "I made a slushie using ice I\n" .string "shaved inside ICEFALL CAVE.\p" .string "It's chilly and tasty!$" FourIsland_Text_LoreleisHouse:: .string "LORELEI'S HOUSE$" ================================================ FILE: data/maps/FourIsland_Base/map.json ================================================ { "id": "MAP_FOUR_ISLAND_BASE", "name": "FourIsland_Base", "layout": "LAYOUT_FOUR_ISLAND_BASE", "music": "MUS_FALLARBOR", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 5, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_EventScript_ItemStarPiece", "flag": "FLAG_HIDE_FOUR_ISLAND_STAR_PIECE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "in_connection": false, "x": 10, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_FOUR_ISLAND_RIVAL" } ], "warp_events": [ { "x": 12, "y": 27, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_HARBOR", "dest_warp_id": "0" }, { "x": 12, "y": 20, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_BASE_CABLE_CAR_STATION", "dest_warp_id": "0" }, { "x": 13, "y": 20, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_BASE_CABLE_CAR_STATION", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 24, "y": 33, "elevation": 3, "item": "ITEM_PEARL", "flag": "FLAG_HIDDEN_ITEM_FOUR_ISLAND_PEARL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 6, "y": 20, "elevation": 3, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_FOUR_ISLAND_ULTRA_BALL", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 14, "y": 23, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FourIsland_Base_EventScript_CableCarStationSign" } ], "level_scaling": "5" } ================================================ FILE: data/maps/FourIsland_Base/scripts.inc ================================================ .equ LOCALID_RIVAL, 3 FourIsland_Base_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FourIsland_Base_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_Base_OnFrame .byte 0 FourIsland_Base_OnTransition:: compare VAR_MAP_SCENE_FOUR_ISLAND, 0 call_if_eq FourIsland_Base_EventScript_ShowRival end FourIsland_Base_EventScript_ShowRival:: clearflag FLAG_HIDE_FOUR_ISLAND_RIVAL return FourIsland_Base_OnFrame:: map_script_2 VAR_MAP_SCENE_FOUR_ISLAND, 0, FourIsland_Base_EventScript_RivalScene .2byte 0 FourIsland_Base_EventScript_RivalScene:: lockall textcolor 0 applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playbgm MUS_ENCOUNTER_RIVAL, 0 applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_RIVAL, Common_Movement_Delay48 waitmovement 0 delay 25 applymovement LOCALID_RIVAL, FourIsland_Base_Movement_RivalApproach waitmovement 0 msgbox FourIsland_Text_RivalAlreadyGotEggBeSmellingYa closemessage applymovement OBJ_EVENT_ID_PLAYER, FourIsland_Base_Movement_PlayerWatchRivalExit applymovement LOCALID_RIVAL, FourIsland_Base_Movement_RivalExit waitmovement 0 fadedefaultbgm playse SE_EXIT delay 35 removeobject LOCALID_RIVAL setvar VAR_MAP_SCENE_FOUR_ISLAND, 1 releaseall end FourIsland_Base_Movement_RivalApproach:: walk_right walk_right walk_down walk_down step_end FourIsland_Base_Movement_RivalExit:: delay_16 delay_4 walk_down step_end FourIsland_Base_Movement_PlayerWatchRivalExit:: walk_left walk_in_place_faster_right step_end FourIsland_Base_EventScript_CableCarStationSign:: msgbox FourIsland_Base_Text_CableCarStationSign, MSGBOX_SIGN end FourIsland_Base_Text_CableCarStationSign:: .string "FOUR ISLAND CABLE CAR\n" .string "Express trips up the mountain!$" ================================================ FILE: data/maps/FourIsland_Base/text.inc ================================================ ================================================ FILE: data/maps/FourIsland_Base_CableCarStation/map.json ================================================ { "id": "MAP_FOUR_ISLAND_BASE_CABLE_CAR_STATION", "name": "FourIsland_Base_CableCarStation", "layout": "LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION", "music": "MUS_FALLARBOR", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 6, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_Base_CableCarStation_EventScript_Attendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CAR", "in_connection": false, "x": 6, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 11, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_BASE", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FourIsland_Base_CableCarStation/scripts.inc ================================================ .set LOCALID_ATTENDANT, 1 FourIsland_Base_CableCarStation_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FourIsland_Base_CableCarStation_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_Base_CableCarStation_OnFrame .byte 0 FourIsland_Base_CableCarStation_OnTransition: compare VAR_CABLE_CAR_STATION_STATE, 2 call_if_eq FourIsland_Base_CableCarStation_EventScript_MoveAttendantAside end FourIsland_Base_CableCarStation_EventScript_MoveAttendantAside:: setobjectxyperm LOCALID_ATTENDANT, 7, 4 setobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_LEFT return FourIsland_Base_CableCarStation_OnFrame: map_script_2 VAR_CABLE_CAR_STATION_STATE, 2, FourIsland_Base_CableCarStation_EventScript_ExitCableCar .2byte 0 FourIsland_Base_CableCarStation_EventScript_ExitCableCar:: lockall applymovement OBJ_EVENT_ID_PLAYER, FourIsland_Base_CableCarStation_Movement_ExitCableCar applymovement LOCALID_ATTENDANT, FourIsland_Base_CableCarStation_Movement_FollowPlayerOutFromCableCar waitmovement 0 setvar VAR_CABLE_CAR_STATION_STATE, 0 setobjectxyperm LOCALID_ATTENDANT, 6, 7 setobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_DOWN releaseall end FourIsland_Base_CableCarStation_EventScript_Attendant:: lock faceplayer msgbox FourIsland_Base_CableCarStation_Text_CableCarReadyGetOn, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_eq FourIsland_Base_CableCarStation_EventScript_RideCableCar compare VAR_RESULT, NO goto_if_eq FourIsland_Base_CableCarStation_EventScript_DeclineRide end FourIsland_Base_CableCarStation_EventScript_RideCableCar:: msgbox FourIsland_Base_CableCarStation_Text_StepThisWay, MSGBOX_DEFAULT closemessage applymovement LOCALID_ATTENDANT, FourIsland_Base_CableCarStation_Movement_LeadPlayerToCableCar applymovement OBJ_EVENT_ID_PLAYER, FourIsland_Base_CableCarStation_Movement_BoardCableCar waitmovement 0 setvar VAR_0x8004, FALSE @ Going up setvar VAR_CABLE_CAR_STATION_STATE, 1 incrementgamestat GAME_STAT_RODE_CABLE_CAR callnative CableCarWarp callnative CableCar waitstate release end FourIsland_Base_CableCarStation_EventScript_DeclineRide:: msgbox FourIsland_Base_CableCarStation_Text_RideAnotherTime, MSGBOX_DEFAULT release end FourIsland_Base_CableCarStation_Movement_LeadPlayerToCableCar: walk_up walk_up walk_right walk_in_place_faster_left step_end FourIsland_Base_CableCarStation_Movement_FollowPlayerOutFromCableCar: delay_16 walk_left walk_down walk_down step_end FourIsland_Base_CableCarStation_Movement_BoardCableCar: walk_up walk_up walk_up delay_16 step_end FourIsland_Base_CableCarStation_Movement_ExitCableCar: walk_down walk_down walk_down delay_16 step_end FourIsland_Base_CableCarStation_Text_CableCarReadyGetOn: .string "The CABLE CAR is ready to go up.\n" .string "Would you like to be on it?$" FourIsland_Base_CableCarStation_Text_StepThisWay: .string "Please step this way.$" FourIsland_Base_CableCarStation_Text_RideAnotherTime: .string "Please ride with us another time.$" ================================================ FILE: data/maps/FourIsland_Base_CableCarStation/text.inc ================================================ ================================================ FILE: data/maps/FourIsland_CableCarStation/map.json ================================================ { "id": "MAP_FOUR_ISLAND_CABLE_CAR_STATION", "name": "FourIsland_CableCarStation", "layout": "LAYOUT_FOUR_ISLAND_CABLE_CAR_STATION", "music": "MUS_FALLARBOR", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 6, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_CableCarStation_EventScript_Attendant", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CABLE_CAR", "in_connection": false, "x": 6, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND", "dest_warp_id": 6 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FourIsland_CableCarStation/scripts.inc ================================================ .set LOCALID_ATTENDANT, 1 FourIsland_CableCarStation_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FourIsland_CableCarStation_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_CableCarStation_OnFrame .byte 0 FourIsland_CableCarStation_OnTransition: compare VAR_CABLE_CAR_STATION_STATE, 1 call_if_eq FourIsland_CableCarStation_EventScript_MoveAttendantAside end FourIsland_CableCarStation_EventScript_MoveAttendantAside:: setobjectxyperm LOCALID_ATTENDANT, 5, 10 setobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_RIGHT return FourIsland_CableCarStation_OnFrame: map_script_2 VAR_CABLE_CAR_STATION_STATE, 1, FourIsland_CableCarStation_EventScript_ExitCableCar .2byte 0 FourIsland_CableCarStation_EventScript_ExitCableCar:: lockall applymovement OBJ_EVENT_ID_PLAYER, FourIsland_CableCarStation_Movement_ExitCableCar applymovement LOCALID_ATTENDANT, FourIsland_CableCarStation_Movement_FollowPlayerOutFromCableCar waitmovement 0 setvar VAR_CABLE_CAR_STATION_STATE, 0 setobjectxyperm LOCALID_ATTENDANT, 6, 7 setobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_UP releaseall end FourIsland_CableCarStation_EventScript_Attendant:: lock faceplayer msgbox FourIsland_CableCarStation_Text_CableCarReadyGetOn, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_eq FourIsland_CableCarStation_EventScript_RideCableCar compare VAR_RESULT, NO goto_if_eq FourIsland_CableCarStation_EventScript_DeclineRide end FourIsland_CableCarStation_EventScript_RideCableCar:: msgbox FourIsland_CableCarStation_Text_StepThisWay, MSGBOX_DEFAULT closemessage applymovement LOCALID_ATTENDANT, FourIsland_CableCarStation_Movement_LeadPlayerToCableCar applymovement OBJ_EVENT_ID_PLAYER, FourIsland_CableCarStation_Movement_BoardCableCar waitmovement 0 setvar VAR_0x8004, TRUE @ Going down setvar VAR_CABLE_CAR_STATION_STATE, 2 incrementgamestat GAME_STAT_RODE_CABLE_CAR callnative CableCarWarp callnative CableCar waitstate release end FourIsland_CableCarStation_EventScript_DeclineRide:: msgbox FourIsland_CableCarStation_Text_RideAnotherTime, MSGBOX_DEFAULT release end FourIsland_CableCarStation_Movement_LeadPlayerToCableCar: walk_down walk_down walk_down walk_left walk_in_place_faster_right step_end FourIsland_CableCarStation_Movement_FollowPlayerOutFromCableCar: delay_16 walk_right walk_up walk_up walk_up step_end FourIsland_CableCarStation_Movement_BoardCableCar: walk_down walk_down walk_down walk_down delay_16 step_end FourIsland_CableCarStation_Movement_ExitCableCar: walk_up walk_up walk_up walk_up delay_16 step_end FourIsland_CableCarStation_Text_CableCarReadyGetOn: .string "The CABLE CAR is ready to go down.\n" .string "Would you like to be on it?$" FourIsland_CableCarStation_Text_StepThisWay: .string "Please step this way.$" FourIsland_CableCarStation_Text_RideAnotherTime: .string "Please ride with us another time.$" ================================================ FILE: data/maps/FourIsland_CableCarStation/text.inc ================================================ ================================================ FILE: data/maps/FourIsland_Harbor/map.json ================================================ { "id": "MAP_FOUR_ISLAND_HARBOR", "name": "FourIsland_Harbor", "layout": "LAYOUT_ISLAND_HARBOR", "music": "MUS_FALLARBOR", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 8, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_Harbor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_BASE", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FourIsland_Harbor/scripts.inc ================================================ FourIsland_Harbor_MapScripts:: .byte 0 FourIsland_Harbor_EventScript_Sailor:: lock faceplayer message Text_WhereDoYouWantToSail waitmessage setvar VAR_0x8004, SEAGALLOP_FOUR_ISLAND goto EventScript_ChooseDestFromIsland end ================================================ FILE: data/maps/FourIsland_House1/map.json ================================================ { "id": "MAP_FOUR_ISLAND_HOUSE1", "name": "FourIsland_House1", "layout": "LAYOUT_HOUSE3", "music": "MUS_FALLARBOR", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 8, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_House1_EventScript_BodySlamTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 9, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_House1_EventScript_FatMan", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FourIsland_House1/scripts.inc ================================================ FourIsland_House1_MapScripts:: .byte 0 FourIsland_House1_EventScript_FatMan:: msgbox FourIsland_House1_Text_YoureAwfullyHeavy, MSGBOX_NPC end ================================================ FILE: data/maps/FourIsland_House1/text.inc ================================================ @ Text for this file was split weirdly, and is instead in FourIsland_PokemonCenter_1F/text.inc @ Theres also an unused JP version of that text in this file instead FourIsland_House1_Text_YoureAwfullyHeavy:: .string "There! Boing!\n" .string "You're awfully heavy!$" ================================================ FILE: data/maps/FourIsland_House2/map.json ================================================ { "id": "MAP_FOUR_ISLAND_HOUSE2", "name": "FourIsland_House2", "layout": "LAYOUT_HOUSE3", "music": "MUS_FALLARBOR", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_House2_EventScript_StickerMan", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FourIsland_House2/scripts.inc ================================================ FourIsland_House2_MapScripts:: .byte 0 ================================================ FILE: data/maps/FourIsland_IcefallCave_1F/map.json ================================================ { "id": "MAP_FOUR_ISLAND_ICEFALL_CAVE_1F", "name": "FourIsland_IcefallCave_1F", "layout": "LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_1F", "music": "MUS_CAVE_OF_ORIGIN", "region_map_section": "MAPSEC_ICEFALL_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 11, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_IcefallCave_1F_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_ULTRA_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_IcefallCave_1F_EventScript_ItemHM07", "flag": "FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_HM07" } ], "warp_events": [ { "x": 3, "y": 17, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE", "dest_warp_id": "1" }, { "x": 2, "y": 8, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE", "dest_warp_id": "2" }, { "x": 12, "y": 12, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F", "dest_warp_id": "0" }, { "x": 12, "y": 3, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F", "dest_warp_id": "1" }, { "x": 15, "y": 16, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F", "dest_warp_id": "2" }, { "x": 3, "y": 6, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_BACK", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FourIsland_IcefallCave_1F/scripts.inc ================================================ FourIsland_IcefallCave_1F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, FourIsland_IcefallCave_1F_OnResume map_script MAP_SCRIPT_ON_LOAD, FourIsland_IcefallCave_1F_OnLoad map_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_IcefallCave_1F_OnFrame .byte 0 FourIsland_IcefallCave_1F_OnResume:: setstepcallback STEP_CB_ICE end FourIsland_IcefallCave_1F_OnLoad:: special SetIcefallCaveCrackedIceMetatiles end FourIsland_IcefallCave_1F_OnFrame:: map_script_2 VAR_TEMP_1, 1, FourIsland_IcefallCave_1F_EventScript_FallDownHole .2byte 0 FourIsland_IcefallCave_1F_EventScript_FallDownHole:: lockall delay 20 applymovement OBJ_EVENT_ID_PLAYER, FourIsland_IcefallCave_1F_Movement_SetInvisible waitmovement 0 playse SE_FALL delay 60 warphole MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F waitstate releaseall end FourIsland_IcefallCave_1F_Movement_SetInvisible:: set_invisible step_end ================================================ FILE: data/maps/FourIsland_IcefallCave_B1F/map.json ================================================ { "id": "MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F", "name": "FourIsland_IcefallCave_B1F", "layout": "LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_B1F", "music": "MUS_CAVE_OF_ORIGIN", "region_map_section": "MAPSEC_ICEFALL_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 10, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_IcefallCave_B1F_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_B1F_FULL_RESTORE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 21, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_IcefallCave_B1F_EventScript_ItemNeverMeltIce", "flag": "FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_B1F_NEVER_MELT_ICE" } ], "warp_events": [ { "x": 12, "y": 12, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_1F", "dest_warp_id": "2" }, { "x": 12, "y": 3, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_1F", "dest_warp_id": "3" }, { "x": 15, "y": 16, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_1F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FourIsland_IcefallCave_B1F/scripts.inc ================================================ FourIsland_IcefallCave_B1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/FourIsland_IcefallCave_Back/map.json ================================================ { "id": "MAP_FOUR_ISLAND_ICEFALL_CAVE_BACK", "name": "FourIsland_IcefallCave_Back", "layout": "LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_BACK", "music": "MUS_CAVE_OF_ORIGIN", "region_map_section": "MAPSEC_ICEFALL_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 11, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_ICEFALL_CAVE_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 13, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_ICEFALL_CAVE_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LORELEI", "in_connection": false, "x": 12, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_IcefallCave_Back_EventScript_Lorelei", "flag": "FLAG_HIDE_ICEFALL_CAVE_LORELEI" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 10, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_ICEFALL_CAVE_ROCKETS" } ], "warp_events": [ { "x": 12, "y": 23, "elevation": 0, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_1F", "dest_warp_id": "5" } ], "coord_events": [ { "type": "trigger", "x": 11, "y": 18, "elevation": 3, "var": "VAR_MAP_SCENE_ICEFALL_CAVE_BACK", "var_value": "0", "script": "FourIsland_IcefallCave_Back_EventScript_LoreleiRocketsScene" }, { "type": "trigger", "x": 12, "y": 18, "elevation": 3, "var": "VAR_MAP_SCENE_ICEFALL_CAVE_BACK", "var_value": "0", "script": "FourIsland_IcefallCave_Back_EventScript_LoreleiRocketsScene" }, { "type": "trigger", "x": 13, "y": 18, "elevation": 3, "var": "VAR_MAP_SCENE_ICEFALL_CAVE_BACK", "var_value": "0", "script": "FourIsland_IcefallCave_Back_EventScript_LoreleiRocketsScene" } ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FourIsland_IcefallCave_Back/scripts.inc ================================================ .equ LOCALID_ROCKET1, 1 .equ LOCALID_ROCKET2, 2 .equ LOCALID_LORELEI, 3 .equ LOCALID_ROCKET3, 4 FourIsland_IcefallCave_Back_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FourIsland_IcefallCave_Back_OnTransition .byte 0 FourIsland_IcefallCave_Back_OnTransition:: call_if_eq VAR_MAP_SCENE_ICEFALL_CAVE_BACK, 1, FourIsland_IcefallCave_Back_EventScript_HideLorelei end FourIsland_IcefallCave_Back_EventScript_HideLorelei:: setflag FLAG_HIDE_ICEFALL_CAVE_LORELEI return FourIsland_IcefallCave_Back_EventScript_LoreleiRocketsScene:: lockall textcolor NPC_TEXT_COLOR_FEMALE msgbox FourIsland_IcefallCave_Back_Text_LoreleiKeepHandsOffMons applymovement LOCALID_ROCKET1, FourIsland_IcefallCave_Back_Movement_WalkInPlaceDown waitmovement 0 textcolor NPC_TEXT_COLOR_MALE msgbox FourIsland_IcefallCave_Back_Text_ShutItLadyLeaveUsBe closemessage playse SE_PIN applymovement LOCALID_LORELEI, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_LORELEI, Common_Movement_WalkInPlaceFasterDown waitmovement 0 applymovement LOCALID_LORELEI, Common_Movement_Delay48 waitmovement 0 textcolor NPC_TEXT_COLOR_FEMALE msgbox FourIsland_IcefallCave_Back_Text_LoreleiPlayerHelpMeKickPoachersOut closemessage applymovement LOCALID_LORELEI, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 18 applymovement LOCALID_LORELEI, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 35 applymovement LOCALID_ROCKET3, FourIsland_IcefallCave_Back_Movement_Rocket3FaceLorelei applymovement LOCALID_LORELEI, FourIsland_IcefallCave_Back_Movement_LoreleiToRockets applymovement OBJ_EVENT_ID_PLAYER, FourIsland_IcefallCave_Back_Movement_PlayerToRockets waitmovement 0 applymovement LOCALID_ROCKET2, FourIsland_IcefallCave_Back_Movement_WalkInPlaceDown waitmovement 0 playbgm MUS_ENCOUNTER_ROCKET, 0 textcolor NPC_TEXT_COLOR_MALE msgbox FourIsland_IcefallCave_Back_Text_GruntIntro setvar VAR_LAST_TALKED, LOCALID_ROCKET3 trainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_45, FourIsland_IcefallCave_Back_Text_GruntDefeat applymovement LOCALID_LORELEI, FourIsland_IcefallCave_Back_Movement_WalkInPlaceUp waitmovement 0 textcolor NPC_TEXT_COLOR_FEMALE msgbox FourIsland_IcefallCave_Back_Text_LoreleiWhereHaveYouTakenMons textcolor NPC_TEXT_COLOR_MALE msgbox FourIsland_IcefallCave_Back_Text_NotTellingYouThat textcolor NPC_TEXT_COLOR_FEMALE message FourIsland_IcefallCave_Back_Text_LoreleiWellDeepFreezeYou waitmessage waitse playmoncry SPECIES_LAPRAS, CRY_MODE_ENCOUNTER waitbuttonpress waitmoncry applymovement LOCALID_ROCKET1, FourIsland_IcefallCave_Back_Movement_Rocket1ReactToThreat waitmovement 0 textcolor NPC_TEXT_COLOR_MALE msgbox FourIsland_IcefallCave_Back_Text_OkayRocketWareHouseFiveIsland closemessage applymovement LOCALID_LORELEI, FourIsland_IcefallCave_Back_Movement_LoreleiWatchRocketsExit applymovement OBJ_EVENT_ID_PLAYER, FourIsland_IcefallCave_Back_Movement_PlayerWatchRocketsExit applymovement LOCALID_ROCKET1, FourIsland_IcefallCave_Back_Movement_Rocket1Exit applymovement LOCALID_ROCKET2, FourIsland_IcefallCave_Back_Movement_Rocket2Exit applymovement LOCALID_ROCKET3, FourIsland_IcefallCave_Back_Movement_Rocket3Exit waitmovement 0 removeobject LOCALID_ROCKET1 removeobject LOCALID_ROCKET2 removeobject LOCALID_ROCKET3 delay 50 applymovement LOCALID_LORELEI, FourIsland_IcefallCave_Back_Movement_LoreleiWalkToPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 textcolor NPC_TEXT_COLOR_FEMALE msgbox FourIsland_IcefallCave_Back_Text_ThankYouThisIsAwful setflag FLAG_HIDE_RUIN_VALLEY_SCIENTIST clearflag FLAG_HIDE_LORELEI_IN_HER_HOUSE setvar VAR_MAP_SCENE_ICEFALL_CAVE_BACK, 1 releaseall end FourIsland_IcefallCave_Back_Movement_PlayerToRockets:: walk_up walk_up walk_right walk_up step_end FourIsland_IcefallCave_Back_Movement_PlayerWatchRocketsExit:: delay_16 walk_in_place_faster_left delay_16 delay_16 walk_in_place_faster_down step_end FourIsland_IcefallCave_Back_Movement_WalkInPlaceDown:: walk_in_place_down step_end FourIsland_IcefallCave_Back_Movement_UnusedPushRight:: lock_facing_direction walk_right unlock_facing_direction step_end FourIsland_IcefallCave_Back_Movement_Rocket1ReactToThreat:: walk_in_place_fast_down step_end FourIsland_IcefallCave_Back_Movement_Rocket1Exit:: walk_right walk_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down step_end FourIsland_IcefallCave_Back_Movement_Rocket2Exit:: delay_16 walk_left walk_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down step_end FourIsland_IcefallCave_Back_Movement_Rocket3Exit:: delay_16 walk_down delay_16 walk_down walk_fast_right walk_fast_right walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down step_end FourIsland_IcefallCave_Back_Movement_Rocket3FaceLorelei:: delay_16 delay_8 walk_in_place_faster_right step_end FourIsland_IcefallCave_Back_Movement_UnusedWalkLeft:: walk_left walk_left step_end FourIsland_IcefallCave_Back_Movement_LoreleiToRockets:: walk_left walk_up step_end FourIsland_IcefallCave_Back_Movement_WalkInPlaceUp:: walk_in_place_up step_end FourIsland_IcefallCave_Back_Movement_LoreleiWatchRocketsExit:: delay_8 walk_in_place_faster_right delay_16 delay_16 walk_in_place_faster_down step_end FourIsland_IcefallCave_Back_Movement_LoreleiWalkToPlayer:: walk_right step_end FourIsland_IcefallCave_Back_EventScript_Lorelei:: msgbox FourIsland_IcefallCave_Back_Text_ThankYouThisIsAwful, MSGBOX_NPC end ================================================ FILE: data/maps/FourIsland_IcefallCave_Back/text.inc ================================================ FourIsland_IcefallCave_Back_Text_LoreleiKeepHandsOffMons:: .string "LORELEI: Keep your filthy hands\n" .string "off the POKéMON in the cave!\p" .string "Do as I say, or you'll have me to\n" .string "answer to!$" FourIsland_IcefallCave_Back_Text_ShutItLadyLeaveUsBe:: .string "Aww, shut it, lady, and leave\n" .string "us be.\p" .string "Don't let your glasses get all\n" .string "steamed up!$" FourIsland_IcefallCave_Back_Text_LoreleiPlayerHelpMeKickPoachersOut:: .string "LORELEI: {PLAYER}?!\n" .string "What are you doing here?\p" .string "No, we can catch up later.\n" .string "Right now, I need your help.\p" .string "Help me kick these poachers out\n" .string "before they do anything else.\p" .string "They've been catching POKéMON\n" .string "here, then selling them off!\p" .string "Are you ready?\n" .string "You take that one, please!$" FourIsland_IcefallCave_Back_Text_GruntIntro:: .string "W-what?!\p" .string "Who says we can't do what we want\n" .string "with the POKéMON we catch?$" FourIsland_IcefallCave_Back_Text_GruntDefeat:: .string "We didn't plan on this!$" FourIsland_IcefallCave_Back_Text_LoreleiWhereHaveYouTakenMons:: .string "LORELEI: Humph.\n" .string "So despicably weak.\p" .string "You!\n" .string "Tell me!\p" .string "Where have you taken the captured\n" .string "POKéMON?\p" .string "I'm smashing your ring once and\n" .string "for all!$" FourIsland_IcefallCave_Back_Text_NotTellingYouThat:: .string "N-no way!\n" .string "I'm not telling you that!$" FourIsland_IcefallCave_Back_Text_LoreleiWellDeepFreezeYou:: .string "LORELEI: If you won't confess,\n" .string "we'll deep-freeze you.\p" .string "My LAPRAS is furious for what\n" .string "you've done to its friends.\p" .string "Go, LAPRAS!\n" .string "ICE BEAM…$" FourIsland_IcefallCave_Back_Text_OkayRocketWareHouseFiveIsland:: .string "Wawaah! Okay!\n" .string "I'll talk!\p" .string "The POKéMON are in the ROCKET\n" .string "WAREHOUSE on FIVE ISLAND.\p" .string "There! I said it!\n" .string "We'll be going now!\p" .string "…But I doubt you'll ever make it\n" .string "into the ROCKET WAREHOUSE!\p" .string "Heheheheh!$" FourIsland_IcefallCave_Back_Text_ThankYouThisIsAwful:: .string "{PLAYER}, thank you.\n" .string "But this is awful…\p" .string "I was born and raised here on\n" .string "these islands.\p" .string "I had no idea that those horrible\n" .string "criminals were loose here…$" ================================================ FILE: data/maps/FourIsland_IcefallCave_Entrance/map.json ================================================ { "id": "MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE", "name": "FourIsland_IcefallCave_Entrance", "layout": "LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE", "music": "MUS_CAVE_OF_ORIGIN", "region_map_section": "MAPSEC_ICEFALL_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 17, "y": 30, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND", "dest_warp_id": "3" }, { "x": 10, "y": 21, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_1F", "dest_warp_id": "0" }, { "x": 9, "y": 7, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND_ICEFALL_CAVE_1F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/FourIsland_IcefallCave_Entrance/scripts.inc ================================================ FourIsland_IcefallCave_Entrance_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FourIsland_IcefallCave_Entrance_OnTransition .byte 0 FourIsland_IcefallCave_Entrance_OnTransition:: setworldmapflag FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE end ================================================ FILE: data/maps/FourIsland_LoreleisHouse/map.json ================================================ { "id": "MAP_FOUR_ISLAND_LORELEIS_HOUSE", "name": "FourIsland_LoreleisHouse", "layout": "LAYOUT_FOUR_ISLAND_LORELEIS_HOUSE", "music": "MUS_FALLARBOR", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LORELEI", "in_connection": false, "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Lorelei", "flag": "FLAG_HIDE_LORELEI_IN_HER_HOUSE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WIGGLYTUFF", "in_connection": false, "x": 0, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEEL", "in_connection": false, "x": 10, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PIKACHU", "in_connection": false, "x": 9, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SLOWPOKE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SLOWBRO", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYDUCK", "in_connection": false, "x": 6, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MEOWTH", "in_connection": false, "x": 9, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "FLAG_HIDE_LORELEI_HOUSE_MEOWTH_DOLL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANSEY", "in_connection": false, "x": 10, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "FLAG_HIDE_LORELEI_HOUSE_CHANSEY_DOLL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JIGGLYPUFF", "in_connection": false, "x": 0, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "FLAG_HIDE_LORELEI_HOUSE_JIGGLYPUFF_DOLL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NIDORAN_F", "in_connection": false, "x": 0, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_F_DOLL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NIDORAN_M", "in_connection": false, "x": 1, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_M_DOLL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PIDGEOT", "in_connection": false, "x": 9, "y": 0, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "FLAG_HIDE_LORELEIS_HOUSE_PIDGEOT_DOLL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FEAROW", "in_connection": false, "x": 10, "y": 0, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "FLAG_HIDE_LORELEIS_HOUSE_FEAROW_DOLL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LAPRAS_DOLL", "in_connection": false, "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_LoreleisHouse_EventScript_Doll", "flag": "FLAG_HIDE_LORELEIS_HOUSE_LAPRAS_DOLL" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FourIsland_LoreleisHouse/scripts.inc ================================================ FourIsland_LoreleisHouse_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FourIsland_LoreleisHouse_OnTransition .byte 0 FourIsland_LoreleisHouse_OnTransition:: special UpdateLoreleiDollCollection end FourIsland_LoreleisHouse_EventScript_Lorelei:: lock faceplayer goto_if_set FLAG_TALKED_TO_LORELEI_AFTER_WAREHOUSE, FourIsland_LoreleisHouse_EventScript_Lorelei3 goto_if_set FLAG_DEFEATED_ROCKETS_IN_WAREHOUSE, FourIsland_LoreleisHouse_EventScript_Lorelei2 msgbox FourIsland_LoreleisHouse_Text_IfAnythingWereToHappenToIsland release end FourIsland_LoreleisHouse_EventScript_Lorelei2:: setflag FLAG_TALKED_TO_LORELEI_AFTER_WAREHOUSE msgbox FourIsland_LoreleisHouse_Text_IllReturnToLeagueInShortWhile release end FourIsland_LoreleisHouse_EventScript_Lorelei3:: msgbox FourIsland_LoreleisHouse_Text_WillDoWhatICanHereAndNow release end FourIsland_LoreleisHouse_EventScript_Doll:: lock msgbox FourIsland_LoreleisHouse_Text_StuffedMonDollsGalore release end ================================================ FILE: data/maps/FourIsland_LoreleisHouse/text.inc ================================================ FourIsland_LoreleisHouse_Text_IfAnythingWereToHappenToIsland:: .string "LORELEI: There's something weighing\n" .string "heavily on my mind.\p" .string "If anything were to happen on\n" .string "the island where I was born…\p" .string "I wouldn't know about it if I were\n" .string "in the POKéMON LEAGUE.\p" .string "I wonder if that would make me\n" .string "irresponsible to my home…$" FourIsland_LoreleisHouse_Text_IllReturnToLeagueInShortWhile:: .string "LORELEI: So, you managed to solve\n" .string "all the problems here?\p" .string "That's wonderful.\p" .string "That means there isn't any reason\n" .string "for me to be here all the time.\p" .string "Thank you…\p" .string "I'll return to the POKéMON LEAGUE\n" .string "in a short while.$" FourIsland_LoreleisHouse_Text_WillDoWhatICanHereAndNow:: .string "I don't know what will happen in\n" .string "the future, but…\p" .string "I will do what I can here and now.\n" .string "That's all I can do.$" FourIsland_LoreleisHouse_Text_StuffedMonDollsGalore:: .string "Stuffed POKéMON dolls galore!$" ================================================ FILE: data/maps/FourIsland_Mart/map.json ================================================ { "id": "MAP_FOUR_ISLAND_MART", "name": "FourIsland_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_Mart_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 8, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_Mart_EventScript_Camper", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND", "dest_warp_id": "7" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FourIsland_Mart/scripts.inc ================================================ FourIsland_Mart_MapScripts:: .byte 0 FourIsland_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart FourIsland_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 FourIsland_Mart_Items:: .2byte ITEM_ULTRA_BALL .2byte ITEM_FULL_RESTORE .2byte ITEM_MAX_POTION .2byte ITEM_REVIVE .2byte ITEM_ICE_HEAL .2byte ITEM_FULL_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_MAX_REPEL .2byte ITEM_NONE release end FourIsland_Mart_EventScript_Camper:: msgbox FourIsland_Mart_Text_IcefallCaveIsFrigid, MSGBOX_NPC end ================================================ FILE: data/maps/FourIsland_Mart/text.inc ================================================ FourIsland_Mart_Text_LoreleiGrewUpOnThisIsland:: .string "We've had a great and powerful\n" .string "TRAINER grow up on this island.\p" .string "I bet even you'd know her.\n" .string "It's LORELEI of the ELITE FOUR!\p" .string "When LORELEI was just a tyke,\n" .string "I taught her about POKéMON.$" FourIsland_Mart_Text_IcefallCaveIsFrigid:: .string "The SEVII ISLANDS are in a warm\n" .string "region overall.\p" .string "But there is one exception you\n" .string "need to know about.\p" .string "The ICEFALL CAVE is frigid because\n" .string "of the POKéMON that live in it.$" ================================================ FILE: data/maps/FourIsland_PokemonCenter_1F/map.json ================================================ { "id": "MAP_FOUR_ISLAND_POKEMON_CENTER_1F", "name": "FourIsland_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 10, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_PokemonCenter_1F_EventScript_Man", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_PokemonCenter_1F_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND", "dest_warp_id": "0" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_FOUR_ISLAND_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ { "type": "sign", "x": 3, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "FourIsland_PokemonCenter_1F_EventScript_PokemonJournal" }, { "type": "sign", "x": 2, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "FourIsland_PokemonCenter_1F_EventScript_PokemonJournal" } ], "level_scaling": "0" } ================================================ FILE: data/maps/FourIsland_PokemonCenter_1F/scripts.inc ================================================ FourIsland_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FourIsland_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 FourIsland_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_FOUR_ISLAND end FourIsland_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end FourIsland_PokemonCenter_1F_EventScript_Man:: msgbox FourIsland_PokemonCenter_1F_Text_RareIceMonsInCave, MSGBOX_NPC end FourIsland_PokemonCenter_1F_EventScript_Woman:: msgbox FourIsland_PokemonCenter_1F_Text_DayCarePeopleFoundEggBefore, MSGBOX_NPC end FourIsland_PokemonCenter_1F_EventScript_Gentleman:: msgbox FourIsland_PokemonCenter_1F_Text_NewPokemonJournalHasntArrived, MSGBOX_NPC end ================================================ FILE: data/maps/FourIsland_PokemonCenter_1F/text.inc ================================================ @ The 5 texts below are supposed to be in FourIsland_House1 Text_BodySlamTeach:: .string "Ready?\n" .string "Boing!\p" .string "We're having a BODY SLAM match\n" .string "to see who wimps out first.\p" .string "If you were to join us, you'd be\n" .string "squashed like a bug, though…\p" .string "How about I teach BODY SLAM to\n" .string "a POKéMON of yours instead?$" Text_BodySlamDeclined:: .string "Come again!\n" .string "Boing!$" Text_BodySlamWhichMon:: .string "Which POKéMON wants to learn how\n" .string "to BODY SLAM?$" Text_BodySlamTaught:: .string "Boioing!$" Text_BodySlamReteach:: .string "Ready for more?\n" .string "Boing!\p" .string "We're still seeing whose BODY SLAM\n" .string "is stronger.\p" .string "Hmm… And we'd still squash you\n" .string "if you tried to join in.\p" .string "How about I teach POKéMON\n" .string "BODY SLAM instead for ¥5000?$" Text_BodySlamReteach2:: .string "Do you want me to teach your\n" .string "POKéMON BODY SLAM?$" Text_BodySlamNotEnoughMoney:: .string "Boing? What's this?\n" .string "You don't have ¥5000?\p" .string "Well, you definitely can't join\n" .string "our match, it's unsafe!\p" .string "Come back later with the money,\n" .string "and I'll teach your POKéMON instead.$" FourIsland_PokemonCenter_1F_Text_RareIceMonsInCave:: .string "There's a rare kind of ICE POKéMON\n" .string "that lives in the cave.\p" .string "We get a lot of visitors hoping to\n" .string "see that POKéMON.$" FourIsland_PokemonCenter_1F_Text_DayCarePeopleFoundEggBefore:: .string "Oh? A POKéMON EGG?\n" .string "…I have no idea.\p" .string "…Oh, wait. The DAY-CARE people\n" .string "in town were saying something.\p" .string "They said that they'd found EGGS\n" .string "before on their property.$" FourIsland_PokemonCenter_1F_Text_NewPokemonJournalHasntArrived:: .string "What's this?\p" .string "The new POKéMON JOURNAL hasn't\n" .string "arrived on this island?$" ================================================ FILE: data/maps/FourIsland_PokemonCenter_2F/map.json ================================================ { "id": "MAP_FOUR_ISLAND_POKEMON_CENTER_2F", "name": "FourIsland_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_FOUR_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/FourIsland_PokemonCenter_2F/scripts.inc ================================================ FourIsland_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS FourIsland_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end FourIsland_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end FourIsland_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/FourIsland_PokemonDayCare/map.json ================================================ { "id": "MAP_FOUR_ISLAND_POKEMON_DAY_CARE", "name": "FourIsland_PokemonDayCare", "layout": "LAYOUT_FOUR_ISLAND_POKEMON_DAY_CARE", "music": "MUS_FALLARBOR", "region_map_section": "MAPSEC_FOUR_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FourIsland_PokemonDayCare_EventScript_DaycareWoman", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FOUR_ISLAND", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FourIsland_PokemonDayCare/scripts.inc ================================================ .set LOCALID_DAYCARE_WOMAN, 1 FourIsland_PokemonDayCare_MapScripts:: .byte 0 FourIsland_PokemonDayCare_EventScript_DaycareWoman:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer goto_if_unset FLAG_GOT_RIVAL_STARTER_EGG, FourIsland_PokemonDayCare_EventScript_StarterEggDaycareWoman specialvar VAR_RESULT, GetDaycareState goto_if_eq VAR_RESULT, DAYCARE_EGG_WAITING, FourIsland_PokemonDayCare_EggWaiting goto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_PokemonDayCare_OneMonInDaycare goto_if_eq VAR_RESULT, DAYCARE_TWO_MONS, FourIsland_PokemonDayCare_TwoMonsInDaycare msgbox DayCare_Text_WouldYouLikeUsToRaiseMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_GiveMonToRaise msgbox DayCare_Text_FineThenComeAgain release end FourIsland_PokemonDayCare_GiveMonToRaise:: specialvar VAR_RESULT, CountPartyNonEggMons goto_if_eq VAR_RESULT, 1, FourIsland_PokemonDayCare_OnlyOneMonInParty msgbox DayCare_Text_WhichMonShouldWeRaise fadescreen FADE_TO_BLACK special ChooseSendDaycareMon waitstate goto_if_ge VAR_0x8004, PARTY_SIZE, FourIsland_PokemonDayCare_ComeAgain specialvar VAR_RESULT, CountPartyAliveNonEggMons_IgnoreVar0x8004Slot goto_if_eq VAR_RESULT, 0, FourIsland_PokemonDayCare_OnlyOneAliveMonInParty specialvar VAR_0x8005, GetSelectedMonNicknameAndSpecies waitse playmoncry VAR_0x8005, CRY_MODE_NORMAL msgbox DayCare_Text_WellRaiseYourMon waitmoncry special StoreSelectedPokemonInDaycare incrementgamestat GAME_STAT_USED_DAYCARE specialvar VAR_RESULT, GetDaycareState goto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_PokemonDayCare_CanRaiseOneMore release end FourIsland_PokemonDayCare_ComeAgain:: msgbox DayCare_Text_ComeAgain release end FourIsland_PokemonDayCare_CanRaiseOneMore:: msgbox DayCare_Text_WeCanRaiseOneMore, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_GiveMonToRaise goto FourIsland_PokemonDayCare_ComeAgain end FourIsland_PokemonDayCare_OnlyOneMonInParty:: msgbox DayCare_Text_YouHaveJustOneMon release end FourIsland_PokemonDayCare_OnlyOneAliveMonInParty:: msgbox DayCare_Text_WhatWillYouBattleWith release end FourIsland_PokemonDayCare_EggWaiting:: msgbox DayCare_Text_HusbandWasLookingForYou release end FourIsland_PokemonDayCare_MonHasGrownXLevels:: msgbox DayCare_Text_YourMonHasGrownXLevels return FourIsland_PokemonDayCare_DisplayLevelsGained:: specialvar VAR_RESULT, GetNumLevelsGainedFromDaycare call_if_ne VAR_RESULT, 0, FourIsland_PokemonDayCare_MonHasGrownXLevels return FourIsland_PokemonDayCare_OneMonInDaycare:: msgbox DayCare_Text_GoodToSeeYou setvar VAR_0x8004, 0 call FourIsland_PokemonDayCare_DisplayLevelsGained msgbox DayCare_Text_WeCanRaiseOneMore, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_GiveMonToRaise msgbox DayCare_Text_TakeYourMonBack, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_TryRetrieveMon goto FourIsland_PokemonDayCare_ComeAgain end FourIsland_PokemonDayCare_TryRetrieveMon:: callnative IsPartyAndBoxesFull goto_if_eq VAR_RESULT, TRUE, FourIsland_PokemonDayCare_EventScript_StorageAndPartyFull specialvar VAR_RESULT, GetDaycareState setvar VAR_0x8004, 0 goto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_PokemonDayCare_CostPrompt special ShowDaycareLevelMenu waitstate copyvar VAR_0x8004, VAR_RESULT goto_if_eq VAR_RESULT, DAYCARE_EXITED_LEVEL_MENU, FourIsland_PokemonDayCare_ComeAgain goto FourIsland_PokemonDayCare_CostPrompt end FourIsland_PokemonDayCare_CostPrompt:: specialvar VAR_RESULT, CalculatePlayerPartyCount compare VAR_RESULT, PARTY_SIZE goto_if_eq FourIsland_PokemonDayCare_NoRoomInParty FourIsland_PokemonDayCare_CostPrompt_Continue:: special GetDaycareCost msgbox DayCare_Text_ItWillCostX, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_CheckEnoughMoney goto FourIsland_PokemonDayCare_ComeAgain end FourIsland_PokemonDayCare_CheckEnoughMoney:: specialvar VAR_RESULT, IsEnoughForCostInVar0x8005 goto_if_eq VAR_RESULT, TRUE, FourIsland_PokemonDayCare_RetrieveMon msgbox DayCare_Text_NotEnoughMoney release end FourIsland_PokemonDayCare_RetrieveMon:: specialvar VAR_RESULT, TakePokemonFromDaycare goto_if_eq VAR_RESULT, 9999, FourIsland_PokemonDayCare_EventScript_StorageAndPartyFull @boxes full applymovement LOCALID_DAYCARE_WOMAN, FourIsland_PokemonDayCare_Movement_RetrieveMon waitmovement 0 special SubtractMoneyFromVar0x8005 playse SE_RS_SHOP msgbox DayCare_Text_HeresYourMon waitse playmoncry VAR_RESULT, CRY_MODE_NORMAL textcolor NPC_TEXT_COLOR_NEUTRAL msgbox DayCare_Text_TookBackMon waitmoncry compare VAR_MON_BOX_ID, 9999 //not sent to box call_if_ne Route5_PokemonDayCare_EventScript_SentToBoxNum call EventScript_RestorePrevTextColor specialvar VAR_RESULT, GetDaycareState goto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_PokemonDayCare_AskRetrieveOtherMon goto FourIsland_PokemonDayCare_ComeAgain end FourIsland_PokemonDayCare_AskRetrieveOtherMon:: msgbox DayCare_Text_TakeOtherOneBackToo, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_TryRetrieveMon goto FourIsland_PokemonDayCare_ComeAgain end FourIsland_PokemonDayCare_NoRoomInParty:: callnative CheckDaycareMonsHaveMail goto_if_ne VAR_RESULT, TRUE, FourIsland_PokemonDayCare_CostPrompt_Continue @selected slot has mail FourIsland_PokemonDayCare_EventScript_StorageAndPartyFull:: msgbox DayCare_Text_YourPartyIsFull release end FourIsland_PokemonDayCare_Movement_RetrieveMon:: delay_16 delay_16 face_right delay_16 delay_16 face_left delay_16 delay_16 face_up walk_slower_up set_invisible delay_16 delay_16 delay_16 delay_16 delay_16 face_down set_visible walk_slower_down step_end FourIsland_PokemonDayCare_EventScript_StarterEggDaycareWoman:: msgbox FourIsland_PokemonDayCare_Text_StarterEggDaycareWoman release end FourIsland_PokemonDayCare_Text_StarterEggDaycareWoman:: .string "My husband outside is looking for\na TRAINER.\pPlease go see him.$" @ Unused. Possibly a commented script, or a typo end added to the above Movement script FourIsland_PokemonDayCare_EventScript_UnusedEnd:: end FourIsland_PokemonDayCare_TwoMonsInDaycare:: msgbox DayCare_Text_GoodToSeeYou setvar VAR_0x8004, 0 call FourIsland_PokemonDayCare_DisplayLevelsGained setvar VAR_0x8004, 1 call FourIsland_PokemonDayCare_DisplayLevelsGained msgbox DayCare_Text_TakeYourMonBack, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_TryRetrieveMon msgbox DayCare_Text_ComeAgain release end @ Unused FourIsland_PokemonDayCare_EventScript_UnusedRetrieveMon:: special ShowDaycareLevelMenu waitstate goto_if_eq VAR_RESULT, 2, FourIsland_PokemonDayCare_ComeAgain copyvar VAR_0x8004, VAR_RESULT specialvar VAR_RESULT, TakePokemonFromDaycare msgbox DayCare_Text_HeresYourMon msgbox DayCare_Text_ComeAgain release end ================================================ FILE: data/maps/FuchsiaCity/map.json ================================================ { "id": "MAP_FUCHSIA_CITY", "name": "FuchsiaCity", "layout": "LAYOUT_FUCHSIA_CITY", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": 12, "map": "MAP_ROUTE19" }, { "direction": "left", "offset": 10, "map": "MAP_ROUTE18" }, { "direction": "right", "offset": 10, "map": "MAP_ROUTE15" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 37, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_EventScript_Erik", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SLOWPOKE", "in_connection": false, "x": 36, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND_SLOWER", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VOLTORB", "in_connection": false, "x": 33, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 33, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANSEY", "in_connection": false, "x": 39, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 14, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_EventScript_LittleBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LAPRAS", "in_connection": false, "x": 12, "y": 20, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 36, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "in_connection": false, "x": 8, "y": 8, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_KANGASKHAN", "in_connection": false, "x": 16, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 30, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_FUCHSIA_CITY_CUT_TREE_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 21, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_FUCHSIA_CITY_CUT_TREE_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 32, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_FUCHSIA_CITY_CUT_TREE_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 24, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_FUCHSIA_CITY_CUT_TREE_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 15, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_EventScript_SubstituteTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 40, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_EventScript_Lass", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 15, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Kangaskhan", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 19, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Tauros", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 24, "y": 5, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE", "dest_warp_id": "2" }, { "x": 33, "y": 31, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY_WARDENS_HOUSE", "dest_warp_id": "1" }, { "x": 11, "y": 15, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY_MART", "dest_warp_id": "1" }, { "x": 28, "y": 16, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY_SAFARI_ZONE_OFFICE", "dest_warp_id": "1" }, { "x": 9, "y": 32, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY_GYM", "dest_warp_id": "1" }, { "x": 14, "y": 31, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY_HOUSE1", "dest_warp_id": "1" }, { "x": 25, "y": 31, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 38, "y": 31, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY_HOUSE2", "dest_warp_id": "1" }, { "x": 39, "y": 28, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY_HOUSE2", "dest_warp_id": "3" }, { "x": 39, "y": 29, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY_HOUSE2", "dest_warp_id": "3" }, { "x": 19, "y": 31, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY_HOUSE3", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 31, "y": 18, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_CitySign" }, { "type": "sign", "x": 26, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_SafariZoneSign" }, { "type": "sign", "x": 5, "y": 32, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_GymSign" }, { "type": "sign", "x": 31, "y": 31, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_WardensHomeSign" }, { "type": "sign", "x": 35, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_VoltorbSign" }, { "type": "sign", "x": 38, "y": 16, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_SlowpokeSign" }, { "type": "sign", "x": 41, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_ChanseySign" }, { "type": "sign", "x": 17, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_KangaskhanSign" }, { "type": "sign", "x": 10, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_FossilMonSign" }, { "type": "sign", "x": 17, "y": 18, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_LaprasSign" }, { "type": "sign", "x": 22, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_EventScript_SafariGameSign" }, { "type": "hidden_item", "x": 33, "y": 26, "elevation": 3, "item": "ITEM_MAX_REVIVE", "flag": "FLAG_HIDDEN_ITEM_FUCHSIA_CITY_MAX_REVIVE", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity/scripts.inc ================================================ .set LOCALID_KANGASKHAN_MASTER, 17 .set LOCALID_TAUROS_MASTER, 18 .set TRAINER, VAR_0x8009 FuchsiaCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FuchsiaCity_OnTransition .byte 0 FuchsiaCity_OnTransition:: setworldmapflag FLAG_WORLD_MAP_FUCHSIA_CITY call_if_set FLAG_GOT_DOME_FOSSIL, FuchsiaCity_EventScript_SetOmanyteGfx call_if_unset FLAG_GOT_DOME_FOSSIL, FuchsiaCity_EventScript_SetKabutoGfx goto FuchsiaCity_MapScript_SetMasterTrainerMovementTypes end FuchsiaCity_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_KANGASKHAN callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, FuchsiaCity_MapScript_KangaskhanMasterMovementType setvar TRAINER, MASTER_TAUROS callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, FuchsiaCity_MapScript_TaurosMasterMovementType end FuchsiaCity_MapScript_KangaskhanMasterMovementType:: setobjectmovementtype LOCALID_KANGASKHAN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return FuchsiaCity_MapScript_TaurosMasterMovementType:: setobjectmovementtype LOCALID_TAUROS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return FuchsiaCity_EventScript_SetOmanyteGfx:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_OMANYTE return FuchsiaCity_EventScript_SetKabutoGfx:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_KABUTO return FuchsiaCity_EventScript_LittleBoy:: msgbox FuchsiaCity_Text_DidYouTrySafariGame, MSGBOX_NPC end FuchsiaCity_EventScript_OldMan:: msgbox FuchsiaCity_Text_SafariZoneZooInFront, MSGBOX_NPC end FuchsiaCity_EventScript_Erik:: msgbox FuchsiaCity_Text_WheresSara, MSGBOX_NPC end FuchsiaCity_EventScript_Youngster:: msgbox FuchsiaCity_Text_ItemBallInThere, MSGBOX_NPC end FuchsiaCity_EventScript_Lass:: lock faceplayer famechecker FAMECHECKER_KOGA, 3 msgbox FuchsiaCity_Text_MyFatherIsGymLeader release end FuchsiaCity_EventScript_CitySign:: msgbox FuchsiaCity_Text_CitySign, MSGBOX_SIGN end FuchsiaCity_EventScript_SafariZoneSign:: msgbox FuchsiaCity_Text_SafariZoneSign, MSGBOX_SIGN end FuchsiaCity_EventScript_SafariGameSign:: msgbox FuchsiaCity_Text_SafariGameSign, MSGBOX_SIGN end FuchsiaCity_EventScript_WardensHomeSign:: msgbox FuchsiaCity_Text_WardensHomeSign, MSGBOX_SIGN end @ Unused FuchsiaCity_EventScript_SafariZoneOfficeSign:: msgbox FuchsiaCity_Text_SafariZoneOfficeSign, MSGBOX_SIGN end FuchsiaCity_EventScript_GymSign:: lockall famechecker FAMECHECKER_KOGA, 0 msgbox FuchsiaCity_Text_GymSign releaseall end FuchsiaCity_EventScript_ChanseySign:: lockall setvar VAR_0x8004, SPECIES_CHANSEY special SetSeenMon showmonpic SPECIES_CHANSEY, 10, 3 msgbox FuchsiaCity_Text_ChanseySign hidemonpic releaseall end FuchsiaCity_EventScript_VoltorbSign:: lockall setvar VAR_0x8004, SPECIES_VOLTORB special SetSeenMon showmonpic SPECIES_VOLTORB, 10, 3 msgbox FuchsiaCity_Text_VoltorbSign hidemonpic releaseall end FuchsiaCity_EventScript_KangaskhanSign:: lockall setvar VAR_0x8004, SPECIES_KANGASKHAN special SetSeenMon showmonpic SPECIES_KANGASKHAN, 10, 3 msgbox FuchsiaCity_Text_KangaskhanSign hidemonpic releaseall end FuchsiaCity_EventScript_SlowpokeSign:: lockall setvar VAR_0x8004, SPECIES_SLOWPOKE special SetSeenMon showmonpic SPECIES_SLOWPOKE, 10, 3 msgbox FuchsiaCity_Text_SlowpokeSign hidemonpic releaseall end FuchsiaCity_EventScript_LaprasSign:: lockall setvar VAR_0x8004, SPECIES_LAPRAS special SetSeenMon showmonpic SPECIES_LAPRAS, 10, 3 msgbox FuchsiaCity_Text_LaprasSign hidemonpic releaseall end FuchsiaCity_EventScript_FossilMonSign:: lockall goto_if_set FLAG_GOT_DOME_FOSSIL, FuchsiaCity_EventScript_OmanyteSign setvar VAR_0x8004, SPECIES_KABUTO special SetSeenMon showmonpic SPECIES_KABUTO, 10, 3 msgbox FuchsiaCity_Text_KabutoSign hidemonpic releaseall end FuchsiaCity_EventScript_OmanyteSign:: setvar VAR_0x8004, SPECIES_OMANYTE special SetSeenMon showmonpic SPECIES_OMANYTE, 10, 3 msgbox FuchsiaCity_Text_OmanyteSign hidemonpic releaseall end ================================================ FILE: data/maps/FuchsiaCity/text.inc ================================================ FuchsiaCity_Text_DidYouTrySafariGame:: .string "Did you try the SAFARI GAME?\p" .string "There are some rare POKéMON that\n" .string "can only be caught there.$" FuchsiaCity_Text_SafariZoneZooInFront:: .string "The SAFARI ZONE has a zoo in front\n" .string "of the entrance.\p" .string "Out back is the SAFARI GAME for\n" .string "catching POKéMON.$" FuchsiaCity_Text_WheresSara:: .string "ERIK: Where's SARA?\n" .string "I said I'd meet her here.$" FuchsiaCity_Text_ItemBallInThere:: .string "That item ball in there…\n" .string "Were you wanting that?\p" .string "Me, too!\n" .string "…Huh? That's a POKéMON?$" FuchsiaCity_Text_CitySign:: .string "FUCHSIA CITY\n" .string "Behold! It's Passion Pink!$" FuchsiaCity_Text_SafariZoneSign:: .string "POKéMON PARADISE\n" .string "SAFARI ZONE$" FuchsiaCity_Text_SafariGameSign:: .string "SAFARI GAME\n" .string "POKéMON-U-CATCH!$" FuchsiaCity_Text_WardensHomeSign:: .string "SAFARI ZONE\n" .string "WARDEN'S HOME$" FuchsiaCity_Text_SafariZoneOfficeSign:: .string "POKéMON PARADISE!\n" .string "Welcome to the SAFARI ZONE!\l" .string "SAFARI ZONE OFFICE$" FuchsiaCity_Text_GymSign:: .string "FUCHSIA CITY POKéMON GYM\n" .string "LEADER: KOGA\l" .string "The Poisonous Ninja Master$" FuchsiaCity_Text_ChanseySign:: .string "Name: CHANSEY\n" .string "Catching one is all up to chance.$" FuchsiaCity_Text_VoltorbSign:: .string "Name: VOLTORB\n" .string "The very image of a POKé BALL.$" FuchsiaCity_Text_KangaskhanSign:: .string "Name: KANGASKHAN\p" .string "A maternal POKéMON that raises its\n" .string "young in a pouch on its belly.$" FuchsiaCity_Text_SlowpokeSign:: .string "Name: SLOWPOKE\n" .string "Friendly and very slow moving.$" FuchsiaCity_Text_LaprasSign:: .string "Name: LAPRAS\n" .string "AKA the king of the seas.$" FuchsiaCity_Text_OmanyteSign:: .string "Name: OMANYTE\n" .string "An extremely rare POKéMON that was\l" .string "regenerated from a fossil.$" FuchsiaCity_Text_KabutoSign:: .string "Name: KABUTO\n" .string "An extremely rare POKéMON that was\l" .string "regenerated from a fossil.$" @ Unused. May have been meant to be the placeholder text for the zoo mons, similar to RB's "!" text FuchsiaCity_Text_Ellipsis:: .string "……$" Text_SubstituteTeach:: .string "Aww, I wish I was a KANGASKHAN\n" .string "baby.\p" .string "I'd love to be a substitute for the\n" .string "baby…\p" .string "And snuggle in the mother\n" .string "KANGASKHAN's belly pouch.\p" .string "But only POKéMON can use the\n" .string "technique SUBSTITUTE…\p" .string "Want me to teach SUBSTITUTE to\n" .string "one of your POKéMON?$" Text_SubstituteDeclined:: .string "Oh, really?\n" .string "SUBSTITUTE seems so fun…$" Text_SubstituteWhichMon:: .string "Which POKéMON wants to learn\n" .string "SUBSTITUTE?$" Text_SubstituteTaught:: .string "Boy, what I'd give to crawl inside\n" .string "a KANGASKHAN belly pouch…$" Text_SubstituteReteach:: .string "I bet a KANGASKHAN's belly pouch\n" .string "is so comfy and warm…\p" .string "If only I could sub in for the\n" .string "baby, we could take shifts!\p" .string "I can teach SUBSTITUTE to one\n" .string "of your POKéMON again for ¥5000!$" Text_SubstituteReteach2:: .string "Want me to teach SUBSTITUTE to\n" .string "one of your POKéMON?$" Text_SubstituteNotEnoughMoney:: .string "KANGASKHAN is rare, so if I want\n" .string "to catch one, I need money for\l" .string "lots of SAFARI ZONE trips.\p" .string "I can't afford to teach SUBSTITUTE\n" .string "for less than ¥5000 anymore!$" FuchsiaCity_Text_MyFatherIsGymLeader:: .string "My father is the GYM LEADER of\n" .string "this town.\p" .string "I'm training to use POISON POKéMON\n" .string "as well as my father.$" ================================================ FILE: data/maps/FuchsiaCity_Gym/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_GYM", "name": "FuchsiaCity_Gym", "layout": "LAYOUT_FUCHSIA_CITY_GYM", "music": "MUS_GYM", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JUGGLER", "x": 12, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "FuchsiaCity_Gym_EventScript_Kayden", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JUGGLER", "x": 2, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "FuchsiaCity_Gym_EventScript_Shawn", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JUGGLER", "x": 11, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "FuchsiaCity_Gym_EventScript_Kirk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TAMER", "x": 13, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "FuchsiaCity_Gym_EventScript_Edgar", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TAMER", "x": 4, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "FuchsiaCity_Gym_EventScript_Phil", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JUGGLER", "x": 2, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "FuchsiaCity_Gym_EventScript_Nate", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_KOGA", "in_connection": false, "x": 7, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_Gym_EventScript_Koga", "flag": "FLAG_TEMP_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GYM_GUY", "in_connection": false, "x": 11, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_Gym_EventScript_GymGuy", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 21, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "4" }, { "x": 7, "y": 21, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "4" }, { "x": 8, "y": 21, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 19, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 10, "y": 19, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_Gym_EventScript_GymStatue" } ], "level_scaling": "3" } ================================================ FILE: data/maps/FuchsiaCity_Gym/scripts.inc ================================================ .equ CHECK_VISITOR_STATE, 6 .equ TYPE, VAR_0x8003 .equ ARGUMENT, VAR_0x8004 FuchsiaCity_Gym_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FuchsiaCity_Gym_OnTransition .byte 0 FuchsiaCity_Gym_OnTransition:: setvar TYPE, CHECK_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_KOGA callnative UseBattleHouseVar call_if_eq VAR_RESULT, 1, FuchsiaCity_Gym_EventScript_HideKoga end FuchsiaCity_Gym_EventScript_HideKoga:: setflag FLAG_TEMP_1 return FuchsiaCity_Gym_EventScript_Koga:: famechecker FAMECHECKER_KOGA, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, FuchsiaCity_Gym_EventScript_Koga_ChallengeMode trainerbattle_single TRAINER_LEADER_KOGA, FuchsiaCity_Gym_Text_KogaIntro, FuchsiaCity_Gym_Text_KogaDefeat, FuchsiaCity_Gym_EventScript_DefeatedKoga, NO_MUSIC settrainerflag TRAINER_LEADER_KOGA_CHALLENGE goto_if_unset FLAG_GOT_TM06_FROM_KOGA, FuchsiaCity_Gym_EventScript_GiveTM06 msgbox FuchsiaCity_Gym_Text_KogaPostBattle release end FuchsiaCity_Gym_EventScript_Koga_ChallengeMode:: trainerbattle_single TRAINER_LEADER_KOGA_CHALLENGE, FuchsiaCity_Gym_Text_KogaIntro, FuchsiaCity_Gym_Text_KogaDefeat, FuchsiaCity_Gym_EventScript_DefeatedKoga, NO_MUSIC settrainerflag TRAINER_LEADER_KOGA goto_if_unset FLAG_GOT_TM06_FROM_KOGA, FuchsiaCity_Gym_EventScript_GiveTM06 msgbox FuchsiaCity_Gym_Text_KogaPostBattle release end FuchsiaCity_Gym_EventScript_DefeatedKoga:: famechecker FAMECHECKER_KOGA, 1 clearflag FLAG_HIDE_FAME_CHECKER_KOGA_JOURNAL setflag FLAG_DEFEATED_KOGA setflag FLAG_BADGE05_GET set_gym_trainers 5 goto FuchsiaCity_Gym_EventScript_GiveTM06 end FuchsiaCity_Gym_EventScript_GiveTM06:: msgbox FuchsiaCity_Gym_Text_KogaExplainSoulBadge checkitemspace ITEM_TM06 goto_if_eq VAR_RESULT, FALSE, FuchsiaCity_Gym_EventScript_NoRoomForTM06 giveitem_msg FuchsiaCity_Gym_Text_ReceivedTM06FromKoga, ITEM_TM06 setflag FLAG_GOT_TM06_FROM_KOGA msgbox FuchsiaCity_Gym_Text_KogaExplainTM06 release end FuchsiaCity_Gym_EventScript_NoRoomForTM06:: msgbox FuchsiaCity_Gym_Text_MakeSpaceForThis release end FuchsiaCity_Gym_EventScript_Phil:: trainerbattle_single TRAINER_TAMER_PHIL, FuchsiaCity_Gym_Text_PhilIntro, FuchsiaCity_Gym_Text_PhilDefeat msgbox FuchsiaCity_Gym_Text_PhilPostBattle, MSGBOX_AUTOCLOSE end FuchsiaCity_Gym_EventScript_Edgar:: trainerbattle_single TRAINER_TAMER_EDGAR, FuchsiaCity_Gym_Text_EdgarIntro, FuchsiaCity_Gym_Text_EdgarDefeat msgbox FuchsiaCity_Gym_Text_EdgarPostBattle, MSGBOX_AUTOCLOSE end FuchsiaCity_Gym_EventScript_Kirk:: trainerbattle_single TRAINER_JUGGLER_KIRK, FuchsiaCity_Gym_Text_KirkIntro, FuchsiaCity_Gym_Text_KirkDefeat famechecker FAMECHECKER_KOGA, 2 msgbox FuchsiaCity_Gym_Text_KirkPostBattle, MSGBOX_AUTOCLOSE end FuchsiaCity_Gym_EventScript_Shawn:: trainerbattle_single TRAINER_JUGGLER_SHAWN, FuchsiaCity_Gym_Text_ShawnIntro, FuchsiaCity_Gym_Text_ShawnDefeat msgbox FuchsiaCity_Gym_Text_ShawnPostBattle, MSGBOX_AUTOCLOSE end FuchsiaCity_Gym_EventScript_Kayden:: trainerbattle_single TRAINER_JUGGLER_KAYDEN, FuchsiaCity_Gym_Text_KaydenIntro, FuchsiaCity_Gym_Text_KaydenDefeat msgbox FuchsiaCity_Gym_Text_KaydenPostBattle, MSGBOX_AUTOCLOSE end FuchsiaCity_Gym_EventScript_Nate:: trainerbattle_single TRAINER_JUGGLER_NATE, FuchsiaCity_Gym_Text_NateIntro, FuchsiaCity_Gym_Text_NateDefeat msgbox FuchsiaCity_Gym_Text_NatePostBattle, MSGBOX_AUTOCLOSE end FuchsiaCity_Gym_EventScript_GymGuy:: lock faceplayer goto_if_set FLAG_DEFEATED_KOGA, FuchsiaCity_Gym_EventScript_GymGuyPostVictory msgbox FuchsiaCity_Gym_Text_GymGuyAdvice release end FuchsiaCity_Gym_EventScript_GymGuyPostVictory:: msgbox FuchsiaCity_Gym_Text_GymGuyPostVictory release end FuchsiaCity_Gym_EventScript_GymStatue:: lockall goto_if_set FLAG_BADGE05_GET, FuchsiaCity_Gym_EventScript_GymStatuePostVictory msgbox FuchsiaCity_Gym_Text_GymStatue releaseall end FuchsiaCity_Gym_EventScript_GymStatuePostVictory:: msgbox FuchsiaCity_Gym_Text_GymStatuePlayerWon releaseall end ================================================ FILE: data/maps/FuchsiaCity_Gym/text.inc ================================================ FuchsiaCity_Gym_Text_KogaIntro:: .string "KOGA: Fwahahaha!\p" .string "A mere child like you dares to\n" .string "challenge me?\p" .string "The very idea makes me shiver\n" .string "with mirth!\p" .string "Very well, I shall show you true\n" .string "terror as a ninja master.\p" .string "Poison brings steady doom.\n" .string "Sleep renders foes helpless.\p" .string "Despair to the creeping horror of\n" .string "POISON-type POKéMON!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" FuchsiaCity_Gym_Text_KogaDefeat:: .string "Humph!\n" .string "You have proven your worth!\p" .string "Here!\n" .string "Take the SOULBADGE!$" FuchsiaCity_Gym_Text_KogaPostBattle:: .string "When afflicted by TOXIC, a POKéMON\n" .string "suffers more and more.\p" .string "It suffers worsening damage as the\n" .string "battle wears on!\p" .string "It will surely terrorize foes!$" FuchsiaCity_Gym_Text_KogaExplainSoulBadge:: .string "Now that you have the SOULBADGE,\n" .string "the DEFENSE of your POKéMON rises.\p" .string "It also lets you SURF outside of\n" .string "battle.\p" .string "Ah!\n" .string "Take this, too!$" FuchsiaCity_Gym_Text_ReceivedTM06FromKoga:: .string "{PLAYER} received TM06\n" .string "from KOGA.$" FuchsiaCity_Gym_Text_KogaExplainTM06:: .string "Sealed within that TM06 lies\n" .string "TOXIC!\p" .string "It is a secret technique dating\n" .string "back some four hundred years.$" FuchsiaCity_Gym_Text_MakeSpaceForThis:: .string "Make space for this, child!$" FuchsiaCity_Gym_Text_KaydenIntro:: .string "Strength isn't the key for POKéMON.\n" .string "Do you understand this?\p" .string "POKéMON is about strategy!\p" .string "I'll show you how strategy can\n" .string "beat brute strength.$" FuchsiaCity_Gym_Text_KaydenDefeat:: .string "What?\n" .string "Extraordinary!$" FuchsiaCity_Gym_Text_KaydenPostBattle:: .string "So, you mix brawn with brains?\n" .string "Good strategy!\p" .string "That's remarkable for a child\n" .string "TRAINER.$" FuchsiaCity_Gym_Text_KirkIntro:: .string "I was a magician once upon a time.\p" .string "But I dreamt of becoming a ninja,\n" .string "so I joined this GYM.$" FuchsiaCity_Gym_Text_KirkDefeat:: .string "I'm done for!$" FuchsiaCity_Gym_Text_KirkPostBattle:: .string "Even though I've lost, I will keep\n" .string "training according to the teachings\l" .string "of KOGA, my ninja master.$" FuchsiaCity_Gym_Text_NateIntro:: .string "Let's see you beat my special\n" .string "techniques!$" FuchsiaCity_Gym_Text_NateDefeat:: .string "You had me fooled!$" FuchsiaCity_Gym_Text_NatePostBattle:: .string "I like poison and sleep techniques,\n" .string "as they linger after battle!$" FuchsiaCity_Gym_Text_PhilIntro:: .string "Stop right there!\p" .string "The famed invisible walls of\n" .string "FUCHSIA GYM have you frustrated?$" FuchsiaCity_Gym_Text_PhilDefeat:: .string "Whoa!\n" .string "You've got it!$" FuchsiaCity_Gym_Text_PhilPostBattle:: .string "You impressed me!\n" .string "Here's a hint!\p" .string "Look very closely for gaps in the\n" .string "invisible walls!$" FuchsiaCity_Gym_Text_EdgarIntro:: .string "I also study the way of the ninja\n" .string "with Master KOGA!\p" .string "Ninja have a long history of using\n" .string "animals!$" FuchsiaCity_Gym_Text_EdgarDefeat:: .string "Awoo!$" FuchsiaCity_Gym_Text_EdgarPostBattle:: .string "I still have much to learn.$" FuchsiaCity_Gym_Text_ShawnIntro:: .string "Master KOGA comes from a long line\n" .string "of ninjas.\p" .string "What did you descend from?$" FuchsiaCity_Gym_Text_ShawnDefeat:: .string "You're more skilled than I'd\n" .string "thought!$" FuchsiaCity_Gym_Text_ShawnPostBattle:: .string "Where there is light, there is\n" .string "shadow!\p" .string "Light and shadow!\n" .string "Which do you choose?$" FuchsiaCity_Gym_Text_GymGuyAdvice:: .string "Yo!\n" .string "Champ in the making!\p" .string "FUCHSIA GYM is a tricked-up place.\n" .string "It's riddled with invisible walls!\p" .string "KOGA might appear close, but he's\n" .string "blocked off.\p" .string "You have to find gaps in the walls\n" .string "to reach him.$" FuchsiaCity_Gym_Text_GymGuyPostVictory:: .string "It's amazing how ninja can terrify,\n" .string "even now!$" FuchsiaCity_Gym_Text_GymStatue:: .string "FUCHSIA POKéMON GYM\n" .string "LEADER: KOGA\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}$" FuchsiaCity_Gym_Text_GymStatuePlayerWon:: .string "FUCHSIA POKéMON GYM\n" .string "LEADER: KOGA\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}, {PLAYER}$" ================================================ FILE: data/maps/FuchsiaCity_House1/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_HOUSE1", "name": "FuchsiaCity_House1", "layout": "LAYOUT_HOUSE1", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_House1_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_House1_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_House1_EventScript_LittleBoy", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "5" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "5" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "5" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity_House1/scripts.inc ================================================ FuchsiaCity_House1_MapScripts:: .byte 0 FuchsiaCity_House1_EventScript_Woman:: msgbox FuchsiaCity_House1_Text_WardenIsOldHasFalseTeeth, MSGBOX_NPC end FuchsiaCity_House1_EventScript_OldMan:: lock faceplayer famechecker FAMECHECKER_BILL, 2 msgbox FuchsiaCity_House1_Text_BillIsMyGrandson release end FuchsiaCity_House1_EventScript_LittleBoy:: msgbox FuchsiaCity_House1_Text_BillFilesHisOwnMonData, MSGBOX_NPC end ================================================ FILE: data/maps/FuchsiaCity_House1/text.inc ================================================ FuchsiaCity_House1_Text_WardenIsOldHasFalseTeeth:: .string "The SAFARI ZONE's WARDEN is old, \n" .string "but he's still very much active.\p" .string "All his teeth are false, though.$" FuchsiaCity_House1_Text_BillIsMyGrandson:: .string "Hmm?\n" .string "You've met BILL?\p" .string "He's my grandson!\p" .string "He always liked collecting things,\n" .string "even as a child!$" FuchsiaCity_House1_Text_BillFilesHisOwnMonData:: .string "BILL files his own POKéMON data on\n" .string "his PC.\p" .string "Did he show you?$" ================================================ FILE: data/maps/FuchsiaCity_House2/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_HOUSE2", "name": "FuchsiaCity_House2", "layout": "LAYOUT_FUCHSIA_CITY_HOUSE2", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_House2_EventScript_FishingGurusBrother", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BLACK_BELT", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Machoke", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 2, "y": 9, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "7" }, { "x": 3, "y": 8, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "7" }, { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "7" }, { "x": 3, "y": 1, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "8" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity_House2/scripts.inc ================================================ .set LOCALID_MACHOKE_MASTER, 2 .set TRAINER, VAR_0x8009 FuchsiaCity_House2_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FuchsiaCity_House2_MapScript_SetMasterTrainerMovementTypes .byte 0 FuchsiaCity_House2_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MACHOKE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, FuchsiaCity_House2_MapScript_MachokeMasterMovementType end FuchsiaCity_House2_MapScript_MachokeMasterMovementType:: setobjectmovementtype LOCALID_MACHOKE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return FuchsiaCity_House2_EventScript_FishingGurusBrother:: lock faceplayer goto_if_set FLAG_GOT_GOOD_ROD, FuchsiaCity_House2_EventScript_AlreadyGotGoodRod msgbox FuchsiaCity_House2_Text_DoYouLikeToFish, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FuchsiaCity_House2_EventScript_GiveGoodRod msgbox FuchsiaCity_House2_Text_OhThatsDisappointing release end FuchsiaCity_House2_EventScript_AlreadyGotGoodRod:: msgbox FuchsiaCity_House2_Text_HowAreTheFishBiting release end FuchsiaCity_House2_EventScript_GiveGoodRod:: msgbox FuchsiaCity_House2_Text_LikeYourStyleTakeThis checkitemspace ITEM_GOOD_ROD goto_if_eq VAR_RESULT, FALSE, FuchsiaCity_House2_EventScript_NoRoomForGoodRod giveitem_msg FuchsiaCity_House2_Text_ReceivedGoodRod, ITEM_GOOD_ROD msgbox FuchsiaCity_House2_Text_GoodRodCanCatchBetterMons setflag FLAG_GOT_GOOD_ROD release end FuchsiaCity_House2_EventScript_NoRoomForGoodRod:: msgbox FuchsiaCity_House2_Text_YouHaveNoRoomForGift release end ================================================ FILE: data/maps/FuchsiaCity_House2/text.inc ================================================ FuchsiaCity_House2_Text_DoYouLikeToFish:: .string "I'm the FISHING GURU's older\n" .string "brother.\p" .string "I simply looove fishing!\n" .string "I can't bear to go without.\p" .string "Tell me, do you like to fish?$" FuchsiaCity_House2_Text_LikeYourStyleTakeThis:: .string "Grand! I like your style.\n" .string "I think we can be friends.\p" .string "Take this and fish, young friend!$" FuchsiaCity_House2_Text_ReceivedGoodRod:: .string "{PLAYER} received a GOOD ROD from\n" .string "the FISHING GURU's brother.$" FuchsiaCity_House2_Text_GoodRodCanCatchBetterMons:: .string "Fishing is a way of life!\n" .string "It is like the finest poetry.\p" .string "A crummy OLD ROD could only catch\n" .string "MAGIKARP, yes?\p" .string "But with a GOOD ROD, you can\n" .string "catch much better POKéMON.$" FuchsiaCity_House2_Text_OhThatsDisappointing:: .string "Oh…\n" .string "That's so disappointing…$" FuchsiaCity_House2_Text_HowAreTheFishBiting:: .string "Hello there, {PLAYER}!\p" .string "How are the fish biting?$" FuchsiaCity_House2_Text_YouHaveNoRoomForGift:: .string "Oh, no!\p" .string "I had a gift for you, but you have\n" .string "no room for it!$" ================================================ FILE: data/maps/FuchsiaCity_House3/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_HOUSE3", "name": "FuchsiaCity_House3", "layout": "LAYOUT_HOUSE1", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_House3_EventScript_MoveDeleter", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "10" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity_House3/scripts.inc ================================================ FuchsiaCity_House3_MapScripts:: .byte 0 FuchsiaCity_House3_EventScript_MoveDeleter:: lock faceplayer msgbox FuchsiaCity_House3_Text_WouldYouLikeToForgetMove, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FuchsiaCity_House3_EventScript_ChooseMonForMoveDeleter goto FuchsiaCity_House3_EventScript_CancelForgetMove end FuchsiaCity_House3_EventScript_ChooseMonForMoveDeleter:: msgbox FuchsiaCity_House3_Text_WhichMonShouldForgetMove special ChoosePartyMon waitstate goto_if_ge VAR_0x8004, PARTY_SIZE, FuchsiaCity_House3_EventScript_CancelForgetMove special IsSelectedMonEgg goto_if_eq VAR_RESULT, TRUE, FuchsiaCity_House3_EventScript_CantForgetMoveEgg special GetNumMovesSelectedMonHas goto_if_eq VAR_RESULT, 1, FuchsiaCity_House3_EventScript_CantForgetOnlyMove msgbox FuchsiaCity_House3_Text_WhichMoveShouldBeForgotten fadescreen FADE_TO_BLACK special SelectMoveDeleterMove fadescreen FADE_FROM_BLACK goto_if_eq VAR_0x8005, MAX_MON_MOVES, FuchsiaCity_House3_EventScript_ChooseMonForMoveDeleter special BufferMoveDeleterNicknameAndMove msgbox FuchsiaCity_House3_Text_MonsMoveShouldBeForgotten, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FuchsiaCity_House3_EventScript_ForgetMove goto FuchsiaCity_House3_EventScript_CancelForgetMove end FuchsiaCity_House3_EventScript_ForgetMove:: special MoveDeleterForgetMove playfanfare MUS_MOVE_DELETED waitfanfare msgbox FuchsiaCity_House3_Text_MonHasForgottenMoveCompletely release end FuchsiaCity_House3_EventScript_CantForgetOnlyMove:: special BufferMoveDeleterNicknameAndMove msgbox FuchsiaCity_House3_Text_MonOnlyKnowsOneMove release end FuchsiaCity_House3_EventScript_CantForgetMoveEgg:: msgbox FuchsiaCity_House3_Text_NoEggShouldKnowMoves release end FuchsiaCity_House3_EventScript_CancelForgetMove:: msgbox FuchsiaCity_House3_Text_ComeAgainToForgetOtherMoves release end ================================================ FILE: data/maps/FuchsiaCity_House3/text.inc ================================================ FuchsiaCity_House3_Text_WouldYouLikeToForgetMove:: .string "Uh…\n" .string "Oh, yes, I'm the MOVE DELETER.\p" .string "I can make POKéMON forget their\n" .string "moves.\p" .string "Would you like me to do that?$" FuchsiaCity_House3_Text_WhichMonShouldForgetMove:: .string "Which POKéMON should forget a\n" .string "move?$" FuchsiaCity_House3_Text_WhichMoveShouldBeForgotten:: .string "Which move should be forgotten?$" FuchsiaCity_House3_Text_MonOnlyKnowsOneMove:: .string "{STR_VAR_1} seems to know only one\n" .string "move…$" FuchsiaCity_House3_Text_MonsMoveShouldBeForgotten:: .string "Hm! {STR_VAR_1}'s {STR_VAR_2}?\n" .string "That move should be forgotten?$" FuchsiaCity_House3_Text_MonHasForgottenMoveCompletely:: .string "It worked to perfection!\p" .string "{STR_VAR_1} has forgotten\n" .string "{STR_VAR_2} completely.$" FuchsiaCity_House3_Text_ComeAgainToForgetOtherMoves:: .string "Come again if there are other\n" .string "moves to be forgotten.$" FuchsiaCity_House3_Text_NoEggShouldKnowMoves:: .string "What?\n" .string "No EGG should know any moves.$" ================================================ FILE: data/maps/FuchsiaCity_Mart/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_MART", "name": "FuchsiaCity_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 6, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_Mart_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "x": 9, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_Mart_EventScript_CooltrainerF", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "2" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "2" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "2" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity_Mart/scripts.inc ================================================ FuchsiaCity_Mart_MapScripts:: .byte 0 FuchsiaCity_Mart_EventScript_CooltrainerF:: msgbox FuchsiaCity_Mart_Text_DidYouTryXSpeed, MSGBOX_NPC end FuchsiaCity_Mart_EventScript_Gentleman:: msgbox FuchsiaCity_Mart_Text_DontTheyHaveSafariZonePennants, MSGBOX_NPC end FuchsiaCity_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart FuchsiaCity_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 FuchsiaCity_Mart_Items:: .2byte ITEM_ULTRA_BALL .2byte ITEM_GREAT_BALL .2byte ITEM_SUPER_POTION .2byte ITEM_REVIVE .2byte ITEM_FULL_HEAL .2byte ITEM_MAX_REPEL .2byte ITEM_NONE release end ================================================ FILE: data/maps/FuchsiaCity_Mart/text.inc ================================================ FuchsiaCity_Mart_Text_DontTheyHaveSafariZonePennants:: .string "Don't they have any pennants\n" .string "promoting the SAFARI ZONE?\p" .string "How about some paper lanterns?\n" .string "Aren't there even any calendars?$" FuchsiaCity_Mart_Text_DidYouTryXSpeed:: .string "Did you try X SPEED?\n" .string "It speeds up a POKéMON in battle.$" ================================================ FILE: data/maps/FuchsiaCity_PokemonCenter_1F/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_POKEMON_CENTER_1F", "name": "FuchsiaCity_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_PokemonCenter_1F_EventScript_Man", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 13, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_PokemonCenter_1F_EventScript_CooltrainerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 4, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Chansey", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "6" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "6" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "6" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_FUCHSIA_CITY_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity_PokemonCenter_1F/scripts.inc ================================================ .set LOCALID_CHANSEY_MASTER, 7 .set TRAINER, VAR_0x8009 FuchsiaCity_PokemonCenter_1F_MapScripts:: FuchsiaCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FuchsiaCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 FuchsiaCity_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_FUCHSIA_CITY goto FuchsiaCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes end FuchsiaCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_CHANSEY callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, FuchsiaCity_PokemonCenter_1F_MapScript_ChanseyMasterMovementType end FuchsiaCity_PokemonCenter_1F_MapScript_ChanseyMasterMovementType:: setobjectmovementtype LOCALID_CHANSEY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return FuchsiaCity_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end FuchsiaCity_PokemonCenter_1F_EventScript_Man:: msgbox FuchsiaCity_PokemonCenter_1F_Text_CantBecomeGoodTrainerWithOneMon, MSGBOX_NPC end FuchsiaCity_PokemonCenter_1F_EventScript_CooltrainerF:: msgbox FuchsiaCity_PokemonCenter_1F_Text_PokemonLeagueWestOfViridian, MSGBOX_NPC end FuchsiaCity_PokemonCenter_1F_EventScript_Youngster:: msgbox FuchsiaCity_PokemonCenter_1F_Text_VisitSafariZoneForPokedex, MSGBOX_NPC end ================================================ FILE: data/maps/FuchsiaCity_PokemonCenter_1F/text.inc ================================================ FuchsiaCity_PokemonCenter_1F_Text_CantBecomeGoodTrainerWithOneMon:: .string "You can't become a good TRAINER\n" .string "with just one strong POKéMON.\p" .string "But raising many POKéMON evenly\n" .string "is no easy task, either.$" FuchsiaCity_PokemonCenter_1F_Text_PokemonLeagueWestOfViridian:: .string "There's a narrow trail west of\n" .string "VIRIDIAN CITY.\p" .string "It goes to the POKéMON LEAGUE HQ.\n" .string "The HQ governs all TRAINERS.$" FuchsiaCity_PokemonCenter_1F_Text_VisitSafariZoneForPokedex:: .string "If you're working on a POKéDEX,\n" .string "visit the SAFARI ZONE.\p" .string "All sorts of rare POKéMON breed\n" .string "there.$" ================================================ FILE: data/maps/FuchsiaCity_PokemonCenter_2F/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_POKEMON_CENTER_2F", "name": "FuchsiaCity_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_FUCHSIA_CITY_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity_PokemonCenter_2F/scripts.inc ================================================ FuchsiaCity_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS FuchsiaCity_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end FuchsiaCity_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end FuchsiaCity_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/FuchsiaCity_SafariZone_Entrance/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE", "name": "FuchsiaCity_SafariZone_Entrance", "layout": "LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 7, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 1, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_SafariZone_Entrance_EventScript_InfoAttendant", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 1, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "1" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "0" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "0" }, { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 4, "y": 3, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "FuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerMid" }, { "type": "trigger", "x": 5, "y": 3, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "FuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerRight" }, { "type": "trigger", "x": 3, "y": 3, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "FuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerLeft" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity_SafariZone_Entrance/scripts.inc ================================================ FuchsiaCity_SafariZone_Entrance_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, FuchsiaCity_SafariZone_Entrance_OnFrame .byte 0 FuchsiaCity_SafariZone_Entrance_OnFrame:: map_script_2 VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 1, FuchsiaCity_SafariZone_Entrance_EventScript_ExitWarpIn map_script_2 VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 2, FuchsiaCity_SafariZone_Entrance_EventScript_ExitEarly map_script_2 VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 3, FuchsiaCity_SafariZone_Entrance_EventScript_ExitWalkIn .2byte 0 @ When player runs out of balls mid-battle FuchsiaCity_SafariZone_Entrance_EventScript_ExitWalkIn:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_ApproachCounter waitmovement 0 msgbox FuchsiaCity_SafariZone_Entrance_Text_CatchFairShareComeAgain closemessage applymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_Exit2 waitmovement 0 special ExitSafariMode setvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0 releaseall end @ When player runs of out balls after catching a pokemon, or runs out of steps FuchsiaCity_SafariZone_Entrance_EventScript_ExitWarpIn:: lockall textcolor NPC_TEXT_COLOR_MALE msgbox FuchsiaCity_SafariZone_Entrance_Text_CatchFairShareComeAgain closemessage applymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_Exit waitmovement 0 special ExitSafariMode setvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0 releaseall end @ When player re-enters the entrance building with balls/steps remaining FuchsiaCity_SafariZone_Entrance_EventScript_ExitEarly:: lockall textcolor NPC_TEXT_COLOR_MALE msgbox FuchsiaCity_SafariZone_Entrance_Text_GoingToLeaveSafariZoneEarly, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, FuchsiaCity_SafariZone_Entrance_EventScript_ReturnToSafariZone msgbox FuchsiaCity_SafariZone_Entrance_Text_PleaseReturnSafariBalls closemessage applymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_Exit waitmovement 0 special ExitSafariMode setvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0 releaseall end FuchsiaCity_SafariZone_Entrance_EventScript_ReturnToSafariZone:: msgbox FuchsiaCity_SafariZone_Entrance_Text_GoodLuck closemessage applymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_ReEnter waitmovement 0 warp MAP_SAFARI_ZONE_CENTER, 26, 30 waitstate end FuchsiaCity_SafariZone_Entrance_Movement_Exit:: walk_down walk_down step_end FuchsiaCity_SafariZone_Entrance_Movement_ReEnter:: walk_up step_end FuchsiaCity_SafariZone_Entrance_Movement_Exit2:: walk_down walk_down step_end FuchsiaCity_SafariZone_Entrance_Movement_ApproachCounter:: walk_down delay_8 step_end FuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerMid:: lockall setvar VAR_TEMP_2, 0 goto FuchsiaCity_SafariZone_Entrance_EventScript_AskEnterSafariZone end FuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerRight:: lockall setvar VAR_TEMP_2, 1 goto FuchsiaCity_SafariZone_Entrance_EventScript_AskEnterSafariZone end FuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerLeft:: lockall setvar VAR_TEMP_2, 2 goto FuchsiaCity_SafariZone_Entrance_EventScript_AskEnterSafariZone end FuchsiaCity_SafariZone_Entrance_EventScript_AskEnterSafariZone:: textcolor NPC_TEXT_COLOR_MALE msgbox FuchsiaCity_SafariZone_Entrance_Text_WelcomeToSafariZone applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 call_if_set FLAG_SYS_GAME_CLEAR, FuchsiaCity_SafariZone_Entrance_EventScript_TellExpansion1 showmoneybox 0, 0 msgbox FuchsiaCity_SafariZone_Entrance_Text_PlaySafariGameFor500, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FuchsiaCity_SafariZone_Entrance_EventScript_TryEnterSafariZone msgbox FuchsiaCity_SafariZone_Entrance_Text_OkayPleaseComeAgain goto FuchsiaCity_SafariZone_Entrance_EventScript_ForcePlayerBack end FuchsiaCity_SafariZone_Entrance_EventScript_TellExpansion1:: call_if_unset FLAG_TOLD_SAFARI_EXPANSION, FuchsiaCity_SafariZone_Entrance_EventScript_TellExpansion2 return FuchsiaCity_SafariZone_Entrance_EventScript_TellExpansion2:: msgbox FuchsiaCity_SafariZone_Entrance_Text_TellExpansion setflag FLAG_TOLD_SAFARI_EXPANSION return FuchsiaCity_SafariZone_Entrance_Text_TellExpansion:: .string "I have exciting news!\n" .string "We've finished an expansion project!\p" .string "Find the new AREA 4 and 5 to\n" .string "encounter exotic POKéMON imported\l" .string "from far away lands!$" FuchsiaCity_SafariZone_Entrance_EventScript_TryEnterSafariZone:: call FuchsiaCity_SafariZone_Entrance_EventScript_CheckSpaceForMons checkmoney 500 goto_if_eq VAR_RESULT, FALSE, FuchsiaCity_SafariZone_Entrance_EventScript_NotEnoughMoney removemoney 500 updatemoneybox msgbox FuchsiaCity_SafariZone_Entrance_Text_ThatllBe500WeOnlyUseSpecialBalls textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message FuchsiaCity_SafariZone_Entrance_Text_PlayerReceived30SafariBalls waitfanfare call EventScript_RestorePrevTextColor msgbox FuchsiaCity_SafariZone_Entrance_Text_CallYouOnPAWhenYouRunOut closemessage hidemoneybox call_if_eq VAR_TEMP_2, 0, FuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneMid call_if_eq VAR_TEMP_2, 1, FuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneRight call_if_eq VAR_TEMP_2, 2, FuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneLeft special EnterSafariMode setvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 2 warp MAP_SAFARI_ZONE_CENTER, 255, 26, 30 waitstate end FuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneRight:: applymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneRight waitmovement 0 return FuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneMid:: applymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneMid waitmovement 0 return FuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneLeft:: applymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneLeft waitmovement 0 return FuchsiaCity_SafariZone_Entrance_EventScript_CheckSpaceForMons:: getpartysize goto_if_ne VAR_RESULT, PARTY_SIZE, EventScript_Return specialvar VAR_RESULT, IsThereRoomInAnyBoxForMorePokemon goto_if_eq VAR_RESULT, TRUE, EventScript_Return msgbox SafariZone_Text_ExcuseMeYourPCBoxIsFull goto FuchsiaCity_SafariZone_Entrance_EventScript_ForcePlayerBack end FuchsiaCity_SafariZone_Entrance_EventScript_NotEnoughMoney:: msgbox FuchsiaCity_SafariZone_Entrance_Text_OopsNotEnoughMoney goto FuchsiaCity_SafariZone_Entrance_EventScript_ForcePlayerBack end FuchsiaCity_SafariZone_Entrance_EventScript_ForcePlayerBack:: closemessage hidemoneybox applymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_ForceBack waitmovement 0 releaseall end FuchsiaCity_SafariZone_Entrance_Movement_ForceBack:: walk_down step_end FuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneMid:: walk_up walk_up step_end FuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneRight:: walk_up walk_left walk_up step_end FuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneLeft:: walk_up walk_right walk_up step_end FuchsiaCity_SafariZone_Entrance_EventScript_InfoAttendant:: lock faceplayer bufferstring 0, FuchsiaCity_SafariZone_Entrance_Text_InfoAttendantFour call_if_set FLAG_SYS_GAME_CLEAR, FuchsiaCity_SafariZone_Entrance_EventScript_InfoAttendantBufferSix msgbox FuchsiaCity_SafariZone_Entrance_Text_FirstTimeAtSafariZone, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, FuchsiaCity_SafariZone_Entrance_EventScript_ExplainSafariZone msgbox FuchsiaCity_SafariZone_Entrance_Text_SorryYoureARegularHere release end FuchsiaCity_SafariZone_Entrance_EventScript_InfoAttendantBufferSix:: bufferstring 0, FuchsiaCity_SafariZone_Entrance_Text_InfoAttendantSix return FuchsiaCity_SafariZone_Entrance_Text_InfoAttendantFour:: .string "four$" FuchsiaCity_SafariZone_Entrance_Text_InfoAttendantSix:: .string "six$" FuchsiaCity_SafariZone_Entrance_EventScript_ExplainSafariZone:: msgbox FuchsiaCity_SafariZone_Entrance_Text_ExplainSafariZone release end ================================================ FILE: data/maps/FuchsiaCity_SafariZone_Entrance/text.inc ================================================ FuchsiaCity_SafariZone_Entrance_Text_WelcomeToSafariZone:: .string "Welcome to the SAFARI ZONE!$" FuchsiaCity_SafariZone_Entrance_Text_PlaySafariGameFor500:: .string "For just ¥500, you can play the\n" .string "SAFARI GAME.\p" .string "You can roam the wide-open safari\n" .string "and catch what you like.\p" .string "Would you like to play?$" FuchsiaCity_SafariZone_Entrance_Text_ThatllBe500WeOnlyUseSpecialBalls:: .string "That'll be ¥500, please!\p" .string "We only use a special kind of \n" .string "POKé BALLS here.$" FuchsiaCity_SafariZone_Entrance_Text_PlayerReceived30SafariBalls:: .string "{PLAYER} received 30 SAFARI BALLS\n" .string "from the attendant.$" FuchsiaCity_SafariZone_Entrance_Text_CallYouOnPAWhenYouRunOut:: .string "We'll call you on the PA when you\n" .string "run out of time or SAFARI BALLS.\p" .string "Well, I'll wish you the best of\n" .string "luck!$" FuchsiaCity_SafariZone_Entrance_Text_OkayPleaseComeAgain:: .string "Okay.\n" .string "Please come again!$" FuchsiaCity_SafariZone_Entrance_Text_OopsNotEnoughMoney:: .string "Oops!\n" .string "Not enough money!$" FuchsiaCity_SafariZone_Entrance_Text_GoingToLeaveSafariZoneEarly:: .string "Are you going to leave the\n" .string "SAFARI ZONE early?$" FuchsiaCity_SafariZone_Entrance_Text_PleaseReturnSafariBalls:: .string "Please return any SAFARI BALLS\n" .string "you may have left.$" FuchsiaCity_SafariZone_Entrance_Text_GoodLuck:: .string "Good luck!$" FuchsiaCity_SafariZone_Entrance_Text_CatchFairShareComeAgain:: .string "Did you catch your fair share?\n" .string "Come again!$" FuchsiaCity_SafariZone_Entrance_Text_FirstTimeAtSafariZone:: .string "Hi! Is it your first time here at\n" .string "the SAFARI ZONE?$" FuchsiaCity_SafariZone_Entrance_Text_ExplainSafariZone:: .string "The SAFARI ZONE actually has\n" .string "{STR_VAR_1} zones in it.\p" .string "Each zone has different kinds of\n" .string "POKéMON, even some rare ones.\p" .string "Use the supplied SAFARI BALLS to\n" .string "catch them.\p" .string "You can also throw BAIT or ROCKS\n" .string "besides the SAFARI BALLS.\p" .string "If you throw BAIT, the POKéMON\n" .string "becomes less likely to flee, but\l" .string "harder to catch.\p" .string "If you throw ROCKS, the POKéMON\n" .string "becomes more likely to flee, but\l" .string "easier to catch.\p" .string "When you run out of time or SAFARI\n" .string "BALLS, it's game over for you!$" FuchsiaCity_SafariZone_Entrance_Text_SorryYoureARegularHere:: .string "Sorry, you're a regular here!$" ================================================ FILE: data/maps/FuchsiaCity_SafariZone_Office/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_SAFARI_ZONE_OFFICE", "name": "FuchsiaCity_SafariZone_Office", "layout": "LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_OFFICE", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_SafariZone_Office_EventScript_Worker2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 12, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_SafariZone_Office_EventScript_Worker3", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 6, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_SafariZone_Office_EventScript_Worker1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 10, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_SafariZone_Office_EventScript_Worker4", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 9, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "3" }, { "x": 6, "y": 9, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "3" }, { "x": 7, "y": 9, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity_SafariZone_Office/scripts.inc ================================================ FuchsiaCity_SafariZone_Office_MapScripts:: .byte 0 FuchsiaCity_SafariZone_Office_EventScript_Worker1:: msgbox FuchsiaCity_SafariZone_Office_Text_NicknamedWardenSlowpoke, MSGBOX_NPC end FuchsiaCity_SafariZone_Office_EventScript_Worker2:: msgbox FuchsiaCity_SafariZone_Office_Text_WardenIsVeryKnowledgeable, MSGBOX_NPC end FuchsiaCity_SafariZone_Office_EventScript_Worker3:: msgbox FuchsiaCity_SafariZone_Office_Text_CouldntUnderstandWarden, MSGBOX_NPC end FuchsiaCity_SafariZone_Office_EventScript_Worker4:: msgbox FuchsiaCity_SafariZone_Office_Text_PrizeInSafariZone, MSGBOX_NPC end ================================================ FILE: data/maps/FuchsiaCity_SafariZone_Office/text.inc ================================================ FuchsiaCity_SafariZone_Office_Text_NicknamedWardenSlowpoke:: .string "We nicknamed the WARDEN\n" .string "“SLOWPOKE.”\p" .string "You know, he has that vacant look\n" .string "like a SLOWPOKE.$" FuchsiaCity_SafariZone_Office_Text_WardenIsVeryKnowledgeable:: .string "WARDEN SLOWPOKE is very\n" .string "knowledgeable about POKéMON.\p" .string "He even has some fossils of rare,\n" .string "extinct POKéMON.$" FuchsiaCity_SafariZone_Office_Text_CouldntUnderstandWarden:: .string "WARDEN SLOWPOKE came in, but\n" .string "I couldn't understand him.\p" .string "I think he's got a speech problem!$" FuchsiaCity_SafariZone_Office_Text_PrizeInSafariZone:: .string "WARDEN SLOWPOKE is running a\n" .string "promotion campaign right now.\p" .string "Try to get to the farthest corner\n" .string "of the SAFARI ZONE.\p" .string "If you can make it, you'll win a\n" .string "very convenient prize.$" ================================================ FILE: data/maps/FuchsiaCity_WardensHouse/map.json ================================================ { "id": "MAP_FUCHSIA_CITY_WARDENS_HOUSE", "name": "FuchsiaCity_WardensHouse", "layout": "LAYOUT_FUCHSIA_CITY_WARDENS_HOUSE", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_FUCHSIA_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_WardensHouse_EventScript_Warden", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "x": 11, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 11, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_WardensHouse_EventScript_ItemRareCandy", "flag": "FLAG_HIDE_FUCHSIA_CITY_WARDENS_HOUSE_RARE_CANDY" }, { "type": "object", "graphics_id": "0", "x": 4, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FuchsiaCity_WardensHouse_EventScript_PokemonJournalKoga", "flag": "FLAG_HIDE_FAME_CHECKER_KOGA_JOURNAL" } ], "warp_events": [ { "x": 5, "y": 10, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "1" }, { "x": 6, "y": 9, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "1" }, { "x": 7, "y": 10, "elevation": 0, "dest_map": "MAP_FUCHSIA_CITY", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 7, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_WardensHouse_EventScript_DisplaySign2" }, { "type": "sign", "x": 4, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_WardensHouse_EventScript_DisplaySign1" }, { "type": "sign", "x": 5, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_WardensHouse_EventScript_DisplaySign1" }, { "type": "sign", "x": 6, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "FuchsiaCity_WardensHouse_EventScript_DisplaySign2" } ], "level_scaling": "0" } ================================================ FILE: data/maps/FuchsiaCity_WardensHouse/scripts.inc ================================================ FuchsiaCity_WardensHouse_MapScripts:: .byte 0 FuchsiaCity_WardensHouse_EventScript_Warden:: lock faceplayer goto_if_set FLAG_GOT_HM04, FuchsiaCity_WardensHouse_EventScript_ExplainStrength goto_if_set FLAG_HIDE_SAFARI_ZONE_WEST_GOLD_TEETH, FuchsiaCity_WardensHouse_EventScript_GiveGoldTeeth msgbox FuchsiaCity_WardensHouse_Text_HifFuffHefifoo, MSGBOX_YESNO call_if_eq VAR_RESULT, YES, FuchsiaCity_WardensHouse_EventScript_WardenYes call_if_eq VAR_RESULT, NO, FuchsiaCity_WardensHouse_EventScript_WardenNo release end FuchsiaCity_WardensHouse_EventScript_GiveGoldTeeth:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_TMHM message FuchsiaCity_WardensHouse_Text_GaveGoldTeethToWarden waitmessage waitfanfare msgbox FuchsiaCity_WardensHouse_Text_WardenPoppedInHisTeeth call EventScript_RestorePrevTextColor checkplayergender call_if_eq VAR_RESULT, MALE, FuchsiaCity_WardensHouse_EventScript_WardenThanksMale call_if_eq VAR_RESULT, FEMALE, FuchsiaCity_WardensHouse_EventScript_WardenThanksFemale giveitem_msg FuchsiaCity_WardensHouse_Text_ReceivedHM04FromWarden, ITEM_HM04 setflag FLAG_GOT_HM04 removeitem ITEM_GOLD_TEETH release end FuchsiaCity_WardensHouse_EventScript_WardenThanksMale:: msgbox FuchsiaCity_WardensHouse_Text_ThanksSonGiveYouSomething return FuchsiaCity_WardensHouse_EventScript_WardenThanksFemale:: msgbox FuchsiaCity_WardensHouse_Text_ThanksLassieGiveYouSomething return FuchsiaCity_WardensHouse_EventScript_WardenYes:: msgbox FuchsiaCity_WardensHouse_Text_AhHowheeHoHoo return FuchsiaCity_WardensHouse_EventScript_WardenNo:: msgbox FuchsiaCity_WardensHouse_Text_HeOhayHeHaHoo return FuchsiaCity_WardensHouse_EventScript_ExplainStrength:: msgbox FuchsiaCity_WardensHouse_Text_ExplainStrength release end FuchsiaCity_WardensHouse_EventScript_DisplaySign1:: msgbox FuchsiaCity_WardensHouse_Text_MonPhotosFossilsOnDisplay, MSGBOX_SIGN end FuchsiaCity_WardensHouse_EventScript_DisplaySign2:: msgbox FuchsiaCity_WardensHouse_Text_OldMonMerchandiseOnDisplay, MSGBOX_SIGN end ================================================ FILE: data/maps/FuchsiaCity_WardensHouse/text.inc ================================================ FuchsiaCity_WardensHouse_Text_HifFuffHefifoo:: .string "WARDEN: Hif fuff hefifoo!\p" .string "Ha lof ha feef ee hafahi ho.\n" .string "Heff hee fwee!$" FuchsiaCity_WardensHouse_Text_AhHowheeHoHoo:: .string "Ah howhee ho hoo!\n" .string "Eef ee hafahi ho!$" FuchsiaCity_WardensHouse_Text_HeOhayHeHaHoo:: .string "Ha?\n" .string "He ohay heh ha hoo ee haheh!$" FuchsiaCity_WardensHouse_Text_GaveGoldTeethToWarden:: .string "{PLAYER} gave the GOLD TEETH\n" .string "to the WARDEN.$" FuchsiaCity_WardensHouse_Text_WardenPoppedInHisTeeth:: .string "The WARDEN popped in his teeth!$" FuchsiaCity_WardensHouse_Text_ThanksSonGiveYouSomething:: .string "WARDEN: Thanks, son!\n" .string "You're a real lifesaver!\p" .string "No one could understand a word\n" .string "that I said, not a one!\p" .string "I was too ashamed to show my face\n" .string "around the OFFICE, even.\p" .string "Let me give you something for your\n" .string "trouble.$" FuchsiaCity_WardensHouse_Text_ThanksLassieGiveYouSomething:: .string "WARDEN: Thank you, lassie!\n" .string "You're a real lifesaver!\p" .string "No one could understand a word\n" .string "that I said, not a one!\p" .string "I was too ashamed to show my face\n" .string "around the OFFICE, even.\p" .string "Let me give you something for your\n" .string "trouble.$" FuchsiaCity_WardensHouse_Text_ReceivedHM04FromWarden:: .string "{PLAYER} received HM04\n" .string "from the WARDEN.$" FuchsiaCity_WardensHouse_Text_ExplainStrength:: .string "WARDEN: Inside HM04 you'll find\n" .string "STRENGTH.\p" .string "It lets POKéMON move boulders when\n" .string "you're outside of battle.\p" .string "Oh yes, did you find the SECRET\n" .string "HOUSE in the SAFARI ZONE?$" FuchsiaCity_WardensHouse_Text_MonPhotosFossilsOnDisplay:: .string "POKéMON photos and fossils are on\n" .string "display.$" FuchsiaCity_WardensHouse_Text_OldMonMerchandiseOnDisplay:: .string "Old POKéMON merchandise is on\n" .string "display.$" ================================================ FILE: data/maps/IndigoPlateau_Exterior/map.json ================================================ { "id": "MAP_INDIGO_PLATEAU_EXTERIOR", "name": "IndigoPlateau_Exterior", "layout": "LAYOUT_INDIGO_PLATEAU_EXTERIOR", "music": "MUS_VICTORY_ROAD", "region_map_section": "MAPSEC_INDIGO_PLATEAU", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "map": "MAP_ROUTE23", "offset": 0, "direction": "down" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "x": 11, "y": 6, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_CREDITS_RIVAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PROF_OAK", "x": 11, "y": 6, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_CREDITS_OAK" } ], "warp_events": [ { "x": 11, "y": 6, "elevation": 0, "dest_map": "MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/IndigoPlateau_Exterior/scripts.inc ================================================ .equ LOCALID_RIVAL, 1 .equ LOCALID_PROF_OAK, 2 IndigoPlateau_Exterior_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, IndigoPlateau_Exterior_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, IndigoPlateau_Exterior_OnFrame .byte 0 IndigoPlateau_Exterior_OnTransition:: setworldmapflag FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR call_if_eq VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR, 1, IndigoPlateau_Exterior_EventScript_PlayCreditsMusic end IndigoPlateau_Exterior_EventScript_PlayCreditsMusic:: playbgm MUS_CREDITS, 0 return IndigoPlateau_Exterior_OnFrame:: map_script_2 VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR, 1, IndigoPlateau_Exterior_EventScript_Credits .2byte 0 @ After beating the champion, you are warped to the main @ entrance of Indigo Plateau. This script starts running @ immediately after your walking animation. @ The script is timed to the music. IndigoPlateau_Exterior_EventScript_Credits:: lockall delay 105 @ Rival exits building. Spawn a dummy object to lock the camera. opendoor 11, 6 waitdooranim special SpawnCameraObject addobject LOCALID_RIVAL applymovement LOCALID_RIVAL, IndigoPlateau_Exterior_Movement_RivalExitBuilding applymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PushPlayerOutOfWay waitmovement 0 closedoor 11, 6 waitdooranim @ Rival runs off applymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerWatchRivalLeave applymovement LOCALID_RIVAL, IndigoPlateau_Exterior_Movement_RivalLeave waitmovement 0 delay 100 @ Oak exits building opendoor 11, 6 waitdooranim addobject LOCALID_PROF_OAK applymovement LOCALID_PROF_OAK, IndigoPlateau_Exterior_Movement_OakExitBuilding waitmovement 0 closedoor 11, 6 waitdooranim delay 160 @ Oak looks at player, then walks off applymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerWatchOakLeave applymovement LOCALID_PROF_OAK, IndigoPlateau_Exterior_Movement_OakLeave waitmovement 0 delay 100 @ Player begin to leave applymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerBeginLeave waitmovement 0 delay 155 applymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerFaceLeague waitmovement 0 delay 90 @ Player runs off applymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerTurnAround waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerLeave waitmovement 0 @ Reset the map state and roll the credits special RemoveCameraObject setvar VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR, 0 removeobject LOCALID_RIVAL removeobject LOCALID_PROF_OAK special DoCredits waitstate releaseall end IndigoPlateau_Exterior_Movement_PlayerLeave:: player_run_down player_run_down player_run_down player_run_down player_run_down player_run_down step_end @ Unused IndigoPlateau_Exterior_Movement_PlayerExitBuilding:: walk_down walk_down step_end IndigoPlateau_Exterior_Movement_PlayerWatchRivalLeave:: delay_16 delay_4 walk_in_place_faster_down step_end IndigoPlateau_Exterior_Movement_PlayerWatchOakLeave:: delay_8 walk_in_place_faster_right delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 walk_in_place_faster_down step_end IndigoPlateau_Exterior_Movement_PlayerBeginLeave:: walk_right delay_16 walk_down walk_down delay_16 delay_16 step_end IndigoPlateau_Exterior_Movement_PlayerTurnAround:: walk_in_place_faster_down step_end IndigoPlateau_Exterior_Movement_PushPlayerOutOfWay:: face_right lock_facing_direction walk_left unlock_facing_direction step_end IndigoPlateau_Exterior_Movement_PlayerFaceLeague:: walk_in_place_faster_up step_end IndigoPlateau_Exterior_Movement_RivalLeave:: walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down step_end IndigoPlateau_Exterior_Movement_RivalExitBuilding:: walk_fast_down step_end IndigoPlateau_Exterior_Movement_OakLeave:: walk_in_place_faster_left delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 walk_in_place_faster_down delay_16 walk_down walk_down walk_down walk_down walk_down walk_down walk_down step_end IndigoPlateau_Exterior_Movement_OakExitBuilding:: walk_down step_end ================================================ FILE: data/maps/IndigoPlateau_PokemonCenter_1F/map.json ================================================ { "id": "MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F", "name": "IndigoPlateau_PokemonCenter_1F", "layout": "LAYOUT_INDIGO_PLATEAU_POKEMON_CENTER_1F", "music": "MUS_GYM", "region_map_section": "MAPSEC_INDIGO_PLATEAU", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 0, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 13, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 13, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GYM_GUY", "in_connection": false, "x": 7, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_GymGuy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 5, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_DoorGuard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 23, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_BlackBelt", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 22, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_PokemonJournal", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 16, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_CooltrainerM", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 23, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_PokemonJournal", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 10, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_TeleportGuy", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_ABRA", "in_connection": false, "x": 11, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "IndigoPlateau_PokemonCenter_1F_EventScript_Abra", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 14, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 11, "y": 16, "elevation": 3, "dest_map": "MAP_INDIGO_PLATEAU_EXTERIOR", "dest_warp_id": "0" }, { "x": 4, "y": 1, "elevation": 3, "dest_map": "MAP_POKEMON_LEAGUE_LORELEIS_ROOM", "dest_warp_id": "0" }, { "x": 1, "y": 14, "elevation": 4, "dest_map": "MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 11, "y": 16, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/IndigoPlateau_PokemonCenter_1F/scripts.inc ================================================ .set LOCALID_DOOR_GUARD, 4 IndigoPlateau_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, IndigoPlateau_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 IndigoPlateau_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_INDIGO_PLATEAU specialvar VAR_RESULT, IsNationalPokedexEnabled call_if_eq VAR_RESULT, TRUE, IndigoPlateau_PokemonCenter_1F_EventScript_CheckBlockDoor end IndigoPlateau_PokemonCenter_1F_EventScript_CheckBlockDoor:: goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, EventScript_Return setobjectxyperm LOCALID_DOOR_GUARD, 4, 2 return IndigoPlateau_PokemonCenter_1F_EventScript_DoorGuard:: lock faceplayer specialvar VAR_RESULT, IsNationalPokedexEnabled goto_if_eq VAR_RESULT, TRUE, IndigoPlateau_PokemonCenter_1F_EventScript_CheckSeviiIslandComplete msgbox IndigoPlateau_PokemonCenter_1F_Text_FaceEliteFourGoodLuck release end IndigoPlateau_PokemonCenter_1F_EventScript_CheckSeviiIslandComplete:: goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, IndigoPlateau_PokemonCenter_1F_EventScript_SeviiIslandComplete msgbox IndigoPlateau_PokemonCenter_1F_Text_LoreleiIsAbsentClosedForTimeBeing release end IndigoPlateau_PokemonCenter_1F_EventScript_SeviiIslandComplete:: msgbox IndigoPlateau_PokemonCenter_1F_Text_FaceEliteFourGoodLuck release end IndigoPlateau_PokemonCenter_1F_EventScript_GymGuy:: msgbox IndigoPlateau_PokemonCenter_1F_Text_GymGuyAdvice, MSGBOX_NPC end IndigoPlateau_PokemonCenter_1F_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart IndigoPlateau_PokemonCenter_1F_Items msgbox Text_PleaseComeAgain release end .align 2 IndigoPlateau_PokemonCenter_1F_Items:: .2byte ITEM_ULTRA_BALL .2byte ITEM_GREAT_BALL .2byte ITEM_FULL_RESTORE .2byte ITEM_MAX_POTION .2byte ITEM_REVIVE .2byte ITEM_FULL_HEAL .2byte ITEM_MAX_REPEL .2byte ITEM_NONE release end IndigoPlateau_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end IndigoPlateau_PokemonCenter_1F_EventScript_Abra:: lock faceplayer waitse playmoncry SPECIES_ABRA, 0 msgbox IndigoPlateau_PokemonCenter_1F_Text_Abra waitmoncry release end IndigoPlateau_PokemonCenter_1F_Text_Abra:: .string "ABRA: Aabra…$" IndigoPlateau_PokemonCenter_1F_EventScript_TeleportGuy:: lock faceplayer msgbox IndigoPlateau_PokemonCenter_1F_Text_TeleportGuyAsks, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq IndigoPlateau_PokemonCenter_1F_EventScript_TeleportGuyDeclined msgbox IndigoPlateau_PokemonCenter_1F_Text_TeleportGuyYes, MSGBOX_DEFAULT closemessage delay 30 turnobject OBJ_EVENT_ID_PLAYER, DIR_SOUTH warpteleport MAP_PALLET_TOWN, 255, 6, 8 waitstate end IndigoPlateau_PokemonCenter_1F_EventScript_TeleportGuyDeclined:: msgbox IndigoPlateau_PokemonCenter_1F_Text_TeleportGuyDeclined, MSGBOX_NPC end IndigoPlateau_PokemonCenter_1F_Text_TeleportGuyAsks:: .string "Ah! You're challenging the\n" .string "ELITE FOUR?\p" .string "Are you sure you're ready?\n" .string "If you need to train some more,\l" .string "my ABRA can help you.\p" .string "It can TELEPORT you home.\n" .string "Would you like to go home now?$" IndigoPlateau_PokemonCenter_1F_Text_TeleportGuyYes:: .string "Okay, okay.\n" .string "Picture your house in your mind…$" IndigoPlateau_PokemonCenter_1F_Text_TeleportGuyDeclined:: .string "Okay, okay.\n" .string "The best of luck to you!$" ================================================ FILE: data/maps/IndigoPlateau_PokemonCenter_1F/text.inc ================================================ IndigoPlateau_PokemonCenter_1F_Text_GymGuyAdvice:: .string "Yo!\n" .string "Champ in the making!\p" .string "At the POKéMON LEAGUE, you will\n" .string "face the ELITE FOUR all in a row.\p" .string "If you lose, you have to start all\n" .string "over again!\p" .string "This is it!\n" .string "Go for it!$" IndigoPlateau_PokemonCenter_1F_Text_FaceEliteFourGoodLuck:: .string "From here on, you face the\n" .string "ELITE FOUR one by one.\p" .string "If you win, a door opens to the\n" .string "next TRAINER. Good luck!$" IndigoPlateau_PokemonCenter_1F_Text_LoreleiIsAbsentClosedForTimeBeing:: .string "I am so sorry, but you've wasted\n" .string "your time coming here.\p" .string "LORELEI of the ELITE FOUR is\n" .string "absent, you see.\p" .string "As a result, the POKéMON LEAGUE is\n" .string "closed for the time being.$" IndigoPlateau_PokemonCenter_1F_Text_AgathaWhuppedUs:: .string "AGATHA's GHOST-type POKéMON are\n" .string "horrifically terrifying in toughness.\p" .string "I took my FIGHTING-type POKéMON\n" .string "and raised them to the max.\p" .string "I went at AGATHA feeling pretty\n" .string "confident, but she whupped us.\p" .string "That old lady's also got a really\n" .string "short fuse, too.\p" .string "It doesn't take anything to get\n" .string "that scary lady hollering.$" IndigoPlateau_PokemonCenter_1F_Text_LancesCousinGymLeaderFarAway:: .string "Maybe becoming an ELITE FOUR\n" .string "member is in the blood.\p" .string "From what I've heard, LANCE has\n" .string "a cousin who's a GYM LEADER\l" .string "somewhere far away.$" ================================================ FILE: data/maps/IndigoPlateau_PokemonCenter_2F/map.json ================================================ { "id": "MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F", "name": "IndigoPlateau_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_INDIGO_PLATEAU", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F", "dest_warp_id": "2" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/IndigoPlateau_PokemonCenter_2F/scripts.inc ================================================ IndigoPlateau_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS IndigoPlateau_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end IndigoPlateau_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end IndigoPlateau_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/LavenderTown/map.json ================================================ { "id": "MAP_LAVENDER_TOWN", "name": "LavenderTown", "layout": "LAYOUT_LAVENDER_TOWN", "music": "MUS_LAVENDER", "region_map_section": "MAPSEC_LAVENDER_TOWN", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ROUTE10" }, { "direction": "down", "offset": 0, "map": "MAP_ROUTE12" }, { "direction": "left", "offset": 0, "map": "MAP_ROUTE8" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 19, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_EventScript_LittleGirl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 12, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_EventScript_WorkerM", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 10, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_EventScript_Boy", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MR_FUJI", "in_connection": false, "x": 8, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_FujiOutside", "flag": "FLAG_HIDE_LAVENDER_OUTSIDE_FUJI" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 13, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Gastly", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 21, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Haunter", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 17, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Gengar", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 18, "y": 6, "elevation": 0, "dest_map": "MAP_POKEMON_TOWER_1F", "dest_warp_id": "1" }, { "x": 6, "y": 5, "elevation": 0, "dest_map": "MAP_LAVENDER_TOWN_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 10, "y": 11, "elevation": 0, "dest_map": "MAP_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE", "dest_warp_id": "1" }, { "x": 5, "y": 16, "elevation": 0, "dest_map": "MAP_LAVENDER_TOWN_HOUSE1", "dest_warp_id": "1" }, { "x": 10, "y": 16, "elevation": 0, "dest_map": "MAP_LAVENDER_TOWN_HOUSE2", "dest_warp_id": "1" }, { "x": 20, "y": 15, "elevation": 0, "dest_map": "MAP_LAVENDER_TOWN_MART", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 12, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LavenderTown_EventScript_SilphScopeNotice" }, { "type": "sign", "x": 15, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LavenderTown_EventScript_TownSign" }, { "type": "sign", "x": 21, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LavenderTown_EventScript_PokemonTowerSign" }, { "type": "sign", "x": 7, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LavenderTown_EventScript_VolunteerHouseSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/LavenderTown/scripts.inc ================================================ .set LOCALID_GASTLY_MASTER, 5 .set LOCALID_HAUNTER_MASTER, 6 .set LOCALID_GENGAR_MASTER, 7 .set TRAINER, VAR_0x8009 LavenderTown_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LavenderTown_OnTransition .byte 0 LavenderTown_OnTransition:: setworldmapflag FLAG_WORLD_MAP_LAVENDER_TOWN setvar VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR, 1 setflag FLAG_HIDE_SS_ANNE_RIVAL goto LavenderTown_MapScript_SetMasterTrainerMovementTypes end LavenderTown_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_GASTLY callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, LavenderTown_MapScript_GastlyMasterMovementType setvar TRAINER, MASTER_HAUNTER callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, LavenderTown_MapScript_HaunterMasterMovementType setvar TRAINER, MASTER_GENGAR callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, LavenderTown_MapScript_GengarMasterMovementType end LavenderTown_MapScript_GastlyMasterMovementType:: setobjectmovementtype LOCALID_GASTLY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return LavenderTown_MapScript_HaunterMasterMovementType:: setobjectmovementtype LOCALID_HAUNTER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return LavenderTown_MapScript_GengarMasterMovementType:: setobjectmovementtype LOCALID_GENGAR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return LavenderTown_EventScript_LittleGirl:: lock faceplayer msgbox LavenderTown_Text_DoYouBelieveInGhosts, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, LavenderTown_EventScript_LittleGirlBelieve msgbox LavenderTown_Text_JustImaginingWhiteHand release end LavenderTown_EventScript_LittleGirlBelieve:: msgbox LavenderTown_Text_SoThereAreBelievers release end LavenderTown_EventScript_WorkerM:: msgbox LavenderTown_Text_TownKnownAsMonGraveSite, MSGBOX_NPC end LavenderTown_EventScript_Boy:: msgbox LavenderTown_Text_GhostsAppearedInTower, MSGBOX_NPC end LavenderTown_EventScript_TownSign:: msgbox LavenderTown_Text_TownSign, MSGBOX_SIGN end LavenderTown_EventScript_SilphScopeNotice:: msgbox LavenderTown_Text_SilphScopeNotice, MSGBOX_SIGN end LavenderTown_EventScript_VolunteerHouseSign:: msgbox LavenderTown_Text_VolunteerPokemonHouse, MSGBOX_SIGN end LavenderTown_EventScript_PokemonTowerSign:: msgbox LavenderTown_Text_PokemonTowerSign, MSGBOX_SIGN end ================================================ FILE: data/maps/LavenderTown/text.inc ================================================ LavenderTown_Text_DoYouBelieveInGhosts:: .string "Do you believe in ghosts?$" LavenderTown_Text_SoThereAreBelievers:: .string "Really?\n" .string "So there are believers…$" LavenderTown_Text_JustImaginingWhiteHand:: .string "Hahaha, I guess not.\p" .string "That white hand on your shoulder…\n" .string "I'm just imagining it.$" LavenderTown_Text_TownKnownAsMonGraveSite:: .string "This town is known as the grave\n" .string "site of POKéMON.\p" .string "Memorial services are held in\n" .string "POKéMON TOWER.$" LavenderTown_Text_GhostsAppearedInTower:: .string "Ghosts appeared in POKéMON TOWER.\p" .string "I think they're the spirits of\n" .string "POKéMON that the ROCKETS killed.$" LavenderTown_Text_TownSign:: .string "LAVENDER TOWN\n" .string "The Noble Purple Town$" LavenderTown_Text_SilphScopeNotice:: .string "New SILPH SCOPE!\n" .string "Make the Invisible Plain to See!\p" .string "SILPH CO.$" LavenderTown_Text_VolunteerPokemonHouse:: .string "LAVENDER VOLUNTEER\n" .string "POKéMON HOUSE$" LavenderTown_Text_PokemonTowerSign:: .string "POKéMON TOWER\n" .string "Becalm the Spirits of POKéMON$" ================================================ FILE: data/maps/LavenderTown_House1/map.json ================================================ { "id": "MAP_LAVENDER_TOWN_HOUSE1", "name": "LavenderTown_House1", "layout": "LAYOUT_HOUSE5", "music": "MUS_LAVENDER", "region_map_section": "MAPSEC_LAVENDER_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_House1_EventScript_CooltrainerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUBONE", "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_House1_EventScript_Cubone", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "3" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "3" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/LavenderTown_House1/scripts.inc ================================================ LavenderTown_House1_MapScripts:: .byte 0 LavenderTown_House1_EventScript_CooltrainerF:: lock faceplayer goto_if_set FLAG_RESCUED_MR_FUJI, LavenderTown_House1_EventScript_CooltrainerFGhostGone msgbox LavenderTown_House1_Text_RocketsKilledCubonesMother release end LavenderTown_House1_EventScript_CooltrainerFGhostGone:: msgbox LavenderTown_House1_Text_GhostOfPokemonTowerIsGone release end LavenderTown_House1_EventScript_Cubone:: lock faceplayer waitse playmoncry SPECIES_CUBONE, CRY_MODE_NORMAL msgbox LavenderTown_House1_Text_Cubone waitmoncry release end ================================================ FILE: data/maps/LavenderTown_House1/text.inc ================================================ LavenderTown_House1_Text_Cubone:: .string "CUBONE: Kyarugoo!$" LavenderTown_House1_Text_RocketsKilledCubonesMother:: .string "Those horrible ROCKETS!\n" .string "They deserve no mercy!\p" .string "That poor CUBONE's mother…\p" .string "It was killed trying to escape from\n" .string "TEAM ROCKET.$" LavenderTown_House1_Text_GhostOfPokemonTowerIsGone:: .string "The ghost of POKéMON TOWER is\n" .string "gone!\p" .string "Someone must have soothed its\n" .string "restless spirit!$" ================================================ FILE: data/maps/LavenderTown_House2/map.json ================================================ { "id": "MAP_LAVENDER_TOWN_HOUSE2", "name": "LavenderTown_House2", "layout": "LAYOUT_HOUSE5", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_LAVENDER_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_House2_EventScript_NameRater", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "4" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "4" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "4" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/LavenderTown_House2/scripts.inc ================================================ LavenderTown_House2_MapScripts:: .byte 0 LavenderTown_House2_EventScript_NameRater:: lock faceplayer msgbox LavenderTown_House2_Text_WantMeToRateNicknames, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, LavenderTown_House2_EventScript_ChooseMon goto_if_eq VAR_RESULT, NO, LavenderTown_House2_EventScript_DontRateNickname end LavenderTown_House2_EventScript_ChooseMon:: msgbox LavenderTown_House2_Text_CritiqueWhichMonsNickname special ChoosePartyMon waitstate goto_if_lt VAR_0x8004, PARTY_SIZE, LavenderTown_House2_EventScript_CheckCanRateMon goto_if_ge VAR_0x8004, PARTY_SIZE, LavenderTown_House2_EventScript_DontRateNickname end LavenderTown_House2_EventScript_DontRateNickname:: msgbox LavenderTown_House2_Text_ISeeComeVisitAgain release end LavenderTown_House2_EventScript_CheckCanRateMon:: specialvar VAR_RESULT, GetPartyMonSpecies goto_if_eq VAR_RESULT, SPECIES_EGG, LavenderTown_House2_EventScript_CantNicknameEgg special BufferMonNickname special IsMonOTIDNotPlayers goto_if_eq VAR_RESULT, TRUE, LavenderTown_House2_EventScript_CantNicknameTradeMon specialvar VAR_RESULT, IsMonOTNameNotPlayers special BufferMonNickname goto_if_eq VAR_RESULT, TRUE, LavenderTown_House2_EventScript_CantNicknameTradeMon msgbox LavenderTown_House2_Text_GiveItANicerName, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, LavenderTown_House2_EventScript_ChooseNewNickname goto_if_eq VAR_RESULT, NO, LavenderTown_House2_EventScript_DontRateNickname end LavenderTown_House2_EventScript_CantNicknameEgg:: msgbox LavenderTown_House2_Text_ThatIsMerelyAnEgg release end LavenderTown_House2_EventScript_CantNicknameTradeMon:: msgbox LavenderTown_House2_Text_TrulyImpeccableName release end LavenderTown_House2_EventScript_ChooseNewNickname:: msgbox LavenderTown_House2_Text_WhatShallNewNicknameBe call EventScript_ChangePokemonNickname specialvar VAR_RESULT, NameRaterWasNicknameChanged special BufferMonNickname goto_if_eq VAR_RESULT, TRUE, LavenderTown_House2_EventScript_ChoseNewNickname msgbox LavenderTown_House2_Text_FromNowOnShallBeKnownAsSameName release end LavenderTown_House2_EventScript_ChoseNewNickname:: msgbox LavenderTown_House2_Text_FromNowOnShallBeKnownAsName release end ================================================ FILE: data/maps/LavenderTown_House2/text.inc ================================================ LavenderTown_House2_Text_WantMeToRateNicknames:: .string "Hello, hello!\n" .string "I am the official NAME RATER!\p" .string "Want me to rate the nicknames of\n" .string "your POKéMON?$" LavenderTown_House2_Text_CritiqueWhichMonsNickname:: .string "Which POKéMON's nickname should\n" .string "I critique?$" LavenderTown_House2_Text_GiveItANicerName:: .string "{STR_VAR_1}, is it?\n" .string "That is a decent nickname!\p" .string "But, would you like me to give it\n" .string "a nicer name?\p" .string "How about it?$" LavenderTown_House2_Text_WhatShallNewNicknameBe:: .string "Ah, good. Then, what shall the new\n" .string "nickname be?$" LavenderTown_House2_Text_FromNowOnShallBeKnownAsName:: .string "Done! From now on, this POKéMON\n" .string "shall be known as {STR_VAR_1}!\p" .string "It is a better name than before!\n" .string "How fortunate for you!$" LavenderTown_House2_Text_ISeeComeVisitAgain:: .string "I see.\n" .string "Do come visit again.$" LavenderTown_House2_Text_FromNowOnShallBeKnownAsSameName:: .string "Done! From now on, this POKéMON\n" .string "shall be known as {STR_VAR_1}!\p" .string "It looks no different from before,\n" .string "and yet, this is vastly superior!\p" .string "How fortunate for you!$" LavenderTown_House2_Text_TrulyImpeccableName:: .string "{STR_VAR_1}, is it?\n" .string "That is a truly impeccable name!\p" .string "Take good care of {STR_VAR_1}!$" LavenderTown_House2_Text_ThatIsMerelyAnEgg:: .string "Now, now.\n" .string "That is merely an EGG!$" ================================================ FILE: data/maps/LavenderTown_Mart/map.json ================================================ { "id": "MAP_LAVENDER_TOWN_MART", "name": "LavenderTown_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_LAVENDER_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_Mart_EventScript_BaldingMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKER", "x": 9, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_Mart_EventScript_Rocker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "x": 9, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_Mart_EventScript_Youngster", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "5" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "5" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "5" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/LavenderTown_Mart/scripts.inc ================================================ LavenderTown_Mart_MapScripts:: .byte 0 LavenderTown_Mart_EventScript_BaldingMan:: msgbox LavenderTown_Mart_Text_SearchingForStatRaiseItems, MSGBOX_NPC end LavenderTown_Mart_EventScript_Rocker:: msgbox LavenderTown_Mart_Text_DidYouBuyRevives, MSGBOX_NPC end LavenderTown_Mart_EventScript_Youngster:: msgbox LavenderTown_Mart_Text_TrainerDuosCanChallengeYou, MSGBOX_NPC end LavenderTown_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart LavenderTown_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 LavenderTown_Mart_Items:: .2byte ITEM_GREAT_BALL .2byte ITEM_SUPER_POTION .2byte ITEM_REVIVE .2byte ITEM_ANTIDOTE .2byte ITEM_PARALYZE_HEAL .2byte ITEM_BURN_HEAL .2byte ITEM_ICE_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_SUPER_REPEL .2byte ITEM_NONE release end ================================================ FILE: data/maps/LavenderTown_Mart/text.inc ================================================ LavenderTown_Mart_Text_SearchingForStatRaiseItems:: .string "I'm searching for items that raise\n" .string "the stats of POKéMON.\p" .string "They're effective over the course\n" .string "of a single battle.\p" .string "X ATTACK, X DEFEND, X SPEED, \n" .string "and X SPECIAL are what I'm after.\p" .string "Do you know where I can get them?$" LavenderTown_Mart_Text_DidYouBuyRevives:: .string "Did you buy some REVIVES?\n" .string "They revive any fainted POKéMON!$" LavenderTown_Mart_Text_TrainerDuosCanChallengeYou:: .string "Sometimes, a TRAINER duo will\n" .string "challenge you with two POKéMON\l" .string "at the same time.\p" .string "If that happens, you have to send\n" .string "out two POKéMON to battle, too.$" ================================================ FILE: data/maps/LavenderTown_PokemonCenter_1F/map.json ================================================ { "id": "MAP_LAVENDER_TOWN_POKEMON_CENTER_1F", "name": "LavenderTown_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_LAVENDER_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 9, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 5, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_PokemonCenter_1F_EventScript_Lass", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_PokemonCenter_1F_EventScript_BaldingMan", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "1" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "1" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "1" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_LAVENDER_TOWN_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/LavenderTown_PokemonCenter_1F/scripts.inc ================================================ LavenderTown_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LavenderTown_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 LavenderTown_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_LAVENDER_TOWN end LavenderTown_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end LavenderTown_PokemonCenter_1F_EventScript_Gentleman:: msgbox LavenderTown_PokemonCenter_1F_Text_RocketsDoAnythingForMoney, MSGBOX_NPC end LavenderTown_PokemonCenter_1F_EventScript_Lass:: msgbox LavenderTown_PokemonCenter_1F_Text_CubonesMotherKilledByRockets, MSGBOX_NPC end LavenderTown_PokemonCenter_1F_EventScript_Youngster:: msgbox LavenderTown_PokemonCenter_1F_Text_PeoplePayForCuboneSkulls, MSGBOX_NPC end ================================================ FILE: data/maps/LavenderTown_PokemonCenter_1F/text.inc ================================================ LavenderTown_PokemonCenter_1F_Text_RocketsDoAnythingForMoney:: .string "TEAM ROCKET will do anything for\n" .string "the sake of money!\p" .string "There is no job too dirty, no deed\n" .string "too heinous, no crime too wicked!$" LavenderTown_PokemonCenter_1F_Text_CubonesMotherKilledByRockets:: .string "I saw CUBONE's mother trying to\n" .string "escape from TEAM ROCKET.\p" .string "She was killed trying to get away…$" LavenderTown_PokemonCenter_1F_Text_PeoplePayForCuboneSkulls:: .string "You know how the CUBONE species\n" .string "wears skulls, right?\p" .string "People will pay a lot for one.$" ================================================ FILE: data/maps/LavenderTown_PokemonCenter_2F/map.json ================================================ { "id": "MAP_LAVENDER_TOWN_POKEMON_CENTER_2F", "name": "LavenderTown_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_LAVENDER_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_LAVENDER_TOWN_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/LavenderTown_PokemonCenter_2F/scripts.inc ================================================ LavenderTown_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS LavenderTown_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end LavenderTown_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end LavenderTown_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/LavenderTown_VolunteerPokemonHouse/map.json ================================================ { "id": "MAP_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE", "name": "LavenderTown_VolunteerPokemonHouse", "layout": "LAYOUT_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE", "music": "MUS_LAVENDER", "region_map_section": "MAPSEC_LAVENDER_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MR_FUJI", "in_connection": false, "x": 3, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_VolunteerPokemonHouse_EventScript_MrFuji", "flag": "FLAG_HIDE_POKEHOUSE_FUJI" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NIDORINO", "in_connection": false, "x": 1, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_VolunteerPokemonHouse_EventScript_Nidorino", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYDUCK", "in_connection": false, "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_VolunteerPokemonHouse_EventScript_Psyduck", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 9, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_VolunteerPokemonHouse_EventScript_LittleBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_VolunteerPokemonHouse_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "LavenderTown_VolunteerPokemonHouse_EventScript_LittleGirl", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Marowak", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "2" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "2" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 5, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LavenderTown_VolunteerPokemonHouse_EventScript_PokemonFanMagazine" }, { "type": "sign", "x": 3, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LavenderTown_VolunteerPokemonHouse_EventScript_Bookshelf" }, { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LavenderTown_VolunteerPokemonHouse_EventScript_Bookshelf" } ], "level_scaling": "0" } ================================================ FILE: data/maps/LavenderTown_VolunteerPokemonHouse/scripts.inc ================================================ .set LOCALID_MAROWAK_MASTER, 7 .set TRAINER, VAR_0x8009 LavenderTown_VolunteerPokemonHouse_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LavenderTown_VolunteerPokemonHouse_MapScript_SetMasterTrainerMovementTypes .byte 0 LavenderTown_VolunteerPokemonHouse_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MAROWAK callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, LavenderTown_VolunteerPokemonHouse_MapScript_MarowakMasterMovementType end LavenderTown_VolunteerPokemonHouse_MapScript_MarowakMasterMovementType:: setobjectmovementtype LOCALID_MAROWAK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return LavenderTown_VolunteerPokemonHouse_EventScript_MrFuji:: lock faceplayer goto_if_set FLAG_GOT_POKE_FLUTE, LavenderTown_VolunteerPokemonHouse_EventScript_AlreadyHavePokeFlute msgbox LavenderTown_VolunteerPokemonHouse_Text_IdLikeYouToHaveThis checkitemspace ITEM_POKE_FLUTE goto_if_eq VAR_RESULT, FALSE, LavenderTown_VolunteerPokemonHouse_EventScript_NoRoomForPokeFlute setflag FLAG_GOT_POKE_FLUTE giveitem_msg LavenderTown_VolunteerPokemonHouse_Text_ReceivedPokeFluteFromMrFuji, ITEM_POKE_FLUTE, 1, MUS_OBTAIN_KEY_ITEM msgbox LavenderTown_VolunteerPokemonHouse_Text_ExplainPokeFlute release end LavenderTown_VolunteerPokemonHouse_EventScript_AlreadyHavePokeFlute:: checkitem ITEM_OLD_SEA_MAP, 1 goto_if_eq VAR_RESULT, TRUE, LavenderTown_VolunteerPokemonHouse_EventScript_HaveOldSeaMap msgbox LavenderTown_VolunteerPokemonHouse_Text_HasPokeFluteHelpedYou release end LavenderTown_VolunteerPokemonHouse_EventScript_HaveOldSeaMap:: goto_if_set FLAG_CAUGHT_MEW, LavenderTown_VolunteerPokemonHouse_EventScript_MewEventFinished goto_if_set FLAG_FOUGHT_MEW, LavenderTown_VolunteerPokemonHouse_EventScript_MewCaught goto_if_unset FLAG_MEW_FLEW_AWAY, LavenderTown_VolunteerPokemonHouse_EventScript_MewNotEncountered goto_if_set FLAG_MEW_FLEW_AWAY, LavenderTown_VolunteerPokemonHouse_EventScript_MewDefeated LavenderTown_VolunteerPokemonHouse_EventScript_MewNotEncountered: msgbox LavenderTown_VolunteerPokemonHouse_Text_FindFarawayIsland, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, LavenderTown_VolunteerPokemonHouse_EventScript_MewFoundNo msgbox LavenderTown_VolunteerPokemonHouse_Text_NotEncounteredMew release end LavenderTown_VolunteerPokemonHouse_EventScript_MewDefeated:: msgbox LavenderTown_VolunteerPokemonHouse_Text_FoundMew, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, LavenderTown_VolunteerPokemonHouse_EventScript_MewFoundNo msgbox LavenderTown_VolunteerPokemonHouse_Text_DefeatedMew release end LavenderTown_VolunteerPokemonHouse_EventScript_MewCaught:: msgbox LavenderTown_VolunteerPokemonHouse_Text_FoundMew, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, LavenderTown_VolunteerPokemonHouse_EventScript_MewFoundNo msgbox LavenderTown_VolunteerPokemonHouse_Text_CaughtMew setflag FLAG_CAUGHT_MEW release end LavenderTown_VolunteerPokemonHouse_EventScript_MewEventFinished:: msgbox LavenderTown_VolunteerPokemonHouse_Text_HowAreYouAndMew release end LavenderTown_VolunteerPokemonHouse_EventScript_MewFoundNo:: msgbox LavenderTown_VolunteerPokemonHouse_Text_AnsweredNo release end LavenderTown_VolunteerPokemonHouse_EventScript_NoRoomForPokeFlute:: msgbox LavenderTown_VolunteerPokemonHouse_Text_MustMakeRoomForThis release end LavenderTown_VolunteerPokemonHouse_EventScript_LittleGirl:: lock faceplayer famechecker FAMECHECKER_MRFUJI, 0 msgbox LavenderTown_VolunteerPokemonHouse_Text_MrFujiLooksAfterOrphanedMons release end LavenderTown_VolunteerPokemonHouse_EventScript_LittleBoy:: msgbox LavenderTown_VolunteerPokemonHouse_Text_MonsNiceToHug, MSGBOX_NPC end LavenderTown_VolunteerPokemonHouse_EventScript_Youngster:: lock faceplayer goto_if_set FLAG_RESCUED_MR_FUJI, LavenderTown_VolunteerPokemonHouse_EventScript_YoungsterFujiBack msgbox LavenderTown_VolunteerPokemonHouse_Text_WhereDidMrFujiGo release end LavenderTown_VolunteerPokemonHouse_EventScript_YoungsterFujiBack:: msgbox LavenderTown_VolunteerPokemonHouse_Text_MrFujiWasPrayingForCubonesMother release end LavenderTown_VolunteerPokemonHouse_EventScript_Nidorino:: lock faceplayer waitse playmoncry SPECIES_NIDORINO, CRY_MODE_NORMAL msgbox LavenderTown_VolunteerPokemonHouse_Text_Nidorino waitmoncry release end LavenderTown_VolunteerPokemonHouse_EventScript_Psyduck:: lock faceplayer waitse playmoncry SPECIES_PSYDUCK, CRY_MODE_NORMAL msgbox LavenderTown_VolunteerPokemonHouse_Text_Psyduck waitmoncry release end LavenderTown_VolunteerPokemonHouse_EventScript_PokemonFanMagazine:: lockall famechecker FAMECHECKER_MRFUJI, 2 msgbox LavenderTown_VolunteerPokemonHouse_Text_GrandPrizeDrawingClipped releaseall end LavenderTown_VolunteerPokemonHouse_EventScript_Bookshelf:: msgbox LavenderTown_VolunteerPokemonHouse_Text_PokemonMagazinesLineShelf, MSGBOX_SIGN end ================================================ FILE: data/maps/LavenderTown_VolunteerPokemonHouse/text.inc ================================================ LavenderTown_PokemonCenter_1F_Text_HearMrFujiNotFromAroundHere:: .string "I recently moved to this town.\p" .string "I hear that MR. FUJI's not from\n" .string "these parts originally, either.$" LavenderTown_VolunteerPokemonHouse_Text_WhereDidMrFujiGo:: .string "That's odd, MR. FUJI isn't here.\n" .string "Where'd he go?$" LavenderTown_VolunteerPokemonHouse_Text_MrFujiWasPrayingForCubonesMother:: .string "MR. FUJI had been praying alone\n" .string "for CUBONE's mother.$" LavenderTown_VolunteerPokemonHouse_Text_MrFujiLooksAfterOrphanedMons:: .string "This is really MR. FUJI's house.\p" .string "He's really kind.\p" .string "He looks after abandoned and\n" .string "orphaned POKéMON.$" LavenderTown_VolunteerPokemonHouse_Text_MonsNiceToHug:: .string "It's so warm!\n" .string "POKéMON are so nice to hug.$" LavenderTown_VolunteerPokemonHouse_Text_Nidorino:: .string "NIDORINO: Gaoo!$" LavenderTown_VolunteerPokemonHouse_Text_Psyduck:: .string "PSYDUCK: Gwappa!$" LavenderTown_VolunteerPokemonHouse_Text_IdLikeYouToHaveThis:: .string "MR. FUJI: {PLAYER}…\p" .string "Your POKéDEX quest is one that\n" .string "requires strong dedication.\p" .string "Without deep love for POKéMON,\n" .string "your quest may fail.\p" .string "I'm not sure if this will help you,\n" .string "but I'd like you to have it.$" LavenderTown_VolunteerPokemonHouse_Text_ReceivedPokeFluteFromMrFuji:: .string "{PLAYER} received a POKé FLUTE\n" .string "from MR. FUJI.$" LavenderTown_VolunteerPokemonHouse_Text_ExplainPokeFlute:: .string "Upon hearing the POKé FLUTE,\n" .string "sleeping POKéMON will spring awake.\p" .string "Try using it on POKéMON that are\n" .string "sleeping obstacles.$" LavenderTown_VolunteerPokemonHouse_Text_MustMakeRoomForThis:: .string "You must make room for this!$" LavenderTown_VolunteerPokemonHouse_Text_HasPokeFluteHelpedYou:: .string "MR. FUJI: Has my POKé FLUTE\n" .string "helped you?$" LavenderTown_VolunteerPokemonHouse_Text_GrandPrizeDrawingClipped:: .string "POKéMON FAN MAGAZINE\n" .string "Monthly Grand Prize Drawing!\p" .string "The application form is…\p" .string "Gone! It's been clipped out.\n" .string "Someone must have applied already.$" LavenderTown_VolunteerPokemonHouse_Text_PokemonMagazinesLineShelf:: .string "POKéMON magazines line the shelf.\p" .string "POKéMON INSIDER…\p" .string "POKéMON FAN…$" LavenderTown_VolunteerPokemonHouse_Text_FindFarawayIsland:: .string "MR. FUJI: Have you found the\n" .string "island on my OLD SEA MAP?$" LavenderTown_VolunteerPokemonHouse_Text_FoundMew:: .string "MR. FUJI: {PLAYER}!\p" .string "Did my OLD SEA MAP help you?\n" .string "Did you find that POKéMON?$" LavenderTown_VolunteerPokemonHouse_Text_DefeatedMew:: .string "Ah, so the poor thing fled\n" .string "the moment it saw you.\p" .string "Perhaps some wrongs can never\n" .string "be righted…\p" .string "I must thank you for your kind\n" .string "concern anyway, {PLAYER}.\p" .string "Maybe that POKéMON will return\n" .string "someday…$" LavenderTown_VolunteerPokemonHouse_Text_CaughtMew:: .string "You were able to befriend it?\n" .string "Even after all it's been through?\p" .string "Thank you, {PLAYER}!\p" .string "You have eased my mind and\n" .string "calmed that POKéMON's spirit.\p" .string "I'm sure the both of you will\n" .string "become even closer with time.$" LavenderTown_VolunteerPokemonHouse_Text_AnsweredNo:: .string "The OLD SEA MAP can show you\n" .string "how to get to the island.\p" .string "A sailor should be able to\n" .string "read it and take you there.\p" .string "You know someone with a boat,\n" .string "Don't you, {PLAYER}?$" LavenderTown_VolunteerPokemonHouse_Text_NotEncounteredMew:: .string "Ah, so you haven't found the\n" .string "POKéMON there yet.\p" .string "If I remember correctly, it\n" .string "enjoys playing in the long grass.$" LavenderTown_VolunteerPokemonHouse_Text_HowAreYouAndMew:: .string "MR. FUJI: {PLAYER}! Welcome!\n" .string "How are you and MEW doing?$" ================================================ FILE: data/maps/MtEmber_Exterior/map.json ================================================ { "id": "MAP_MT_EMBER_EXTERIOR", "name": "MtEmber_Exterior", "layout": "LAYOUT_MT_EMBER_EXTERIOR", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_VOLCANIC_ASH", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 29, "y": 45, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtEmber_Exterior_EventScript_ExplosionTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 41, "y": 40, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtEmber_Exterior_EventScript_Grunt1", "flag": "FLAG_HIDE_MT_EMBER_EXTERIOR_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 42, "y": 40, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtEmber_Exterior_EventScript_Grunt2", "flag": "FLAG_HIDE_MT_EMBER_EXTERIOR_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 22, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT", "movement_range_x": 5, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "MtEmber_Exterior_EventScript_Jocelyn", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEMON_RANGER_M", "x": 15, "y": 28, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "MtEmber_Exterior_EventScript_Logan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEMON_RANGER_F", "x": 14, "y": 42, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "MtEmber_Exterior_EventScript_Beth", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 29, "y": 41, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 30, "y": 42, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 22, "y": 45, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 17, "y": 46, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 36, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 34, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 36, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 35, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 35, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 18, "y": 39, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 19, "y": 40, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 13, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtEmber_Exterior_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_MT_EMBER_EXTERIOR_ULTRA_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 38, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtEmber_Exterior_EventScript_ItemFireStone", "flag": "FLAG_HIDE_MT_EMBER_EXTERIOR_FIRE_STONE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 48, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtEmber_Exterior_EventScript_ItemDireHit", "flag": "FLAG_HIDE_MT_EMBER_EXTERIOR_DIRE_HIT" }, { "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "in_connection": false, "x": 26, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtEmber_Exterior_EventScript_SkyAttackTutor", "flag": "0" } ], "warp_events": [ { "x": 28, "y": 48, "elevation": 3, "dest_map": "MAP_ONE_ISLAND_KINDLE_ROAD", "dest_warp_id": "0" }, { "x": 29, "y": 48, "elevation": 3, "dest_map": "MAP_ONE_ISLAND_KINDLE_ROAD", "dest_warp_id": "1" }, { "x": 14, "y": 24, "elevation": 3, "dest_map": "MAP_MT_EMBER_SUMMIT_PATH_1F", "dest_warp_id": "0" }, { "x": 39, "y": 19, "elevation": 3, "dest_map": "MAP_MT_EMBER_SUMMIT_PATH_3F", "dest_warp_id": "1" }, { "x": 29, "y": 7, "elevation": 3, "dest_map": "MAP_MT_EMBER_SUMMIT", "dest_warp_id": "0" }, { "x": 42, "y": 39, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_1F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 37, "y": 43, "elevation": 0, "var": "VAR_MAP_SCENE_MT_EMBER_EXTERIOR", "var_value": "1", "script": "MtEmber_Exterior_EventScript_RocketPasswordScene" }, { "type": "trigger", "x": 38, "y": 43, "elevation": 0, "var": "VAR_MAP_SCENE_MT_EMBER_EXTERIOR", "var_value": "1", "script": "MtEmber_Exterior_EventScript_RocketPasswordScene" }, { "type": "trigger", "x": 39, "y": 43, "elevation": 0, "var": "VAR_MAP_SCENE_MT_EMBER_EXTERIOR", "var_value": "1", "script": "MtEmber_Exterior_EventScript_RocketPasswordScene" }, { "type": "trigger", "x": 15, "y": 46, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "MtEmber_Exterior_EventScript_BoulderShortcutTriggers" } ], "bg_events": [ { "type": "hidden_item", "x": 18, "y": 17, "elevation": 0, "item": "ITEM_FIRE_STONE", "flag": "FLAG_HIDDEN_ITEM_MT_EMBER_EXTERIOR_FIRE_STONE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 8, "y": 30, "elevation": 3, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_MT_EMBER_EXTERIOR_ULTRA_BALL", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/MtEmber_Exterior/scripts.inc ================================================ .set LOCALID_GRUNT1, 2 .set LOCALID_GRUNT2, 3 MtEmber_Exterior_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, MtEmber_Exterior_OnResume map_script MAP_SCRIPT_ON_TRANSITION, MtEmber_Exterior_OnTransition map_script MAP_SCRIPT_ON_LOAD, MtEmber_Exterior_OnLoad .byte 0 MtEmber_Exterior_OnResume: setstepcallback STEP_CB_ASH end MtEmber_Exterior_OnTransition:: setworldmapflag FLAG_WORLD_MAP_MT_EMBER_EXTERIOR call_if_eq VAR_MAP_SCENE_MT_EMBER_EXTERIOR, 2, MtEmber_Exterior_EventScript_RocketsFaceDown end MtEmber_Exterior_EventScript_RocketsFaceDown:: setobjectmovementtype LOCALID_GRUNT1, MOVEMENT_TYPE_FACE_DOWN setobjectmovementtype LOCALID_GRUNT2, MOVEMENT_TYPE_FACE_DOWN return MtEmber_Exterior_OnLoad:: call_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4, MtEmber_Exterior_EventScript_OpenCave call_if_set FLAG_MT_EMBER_BOULDER_SHORTCUTS, MtEmber_Exterior_EventScript_MoveBoulders end MtEmber_Exterior_EventScript_OpenCave:: setmetatile 42, 39, METATILE_MtEmber_CaveEntrance, 0 return MtEmber_Exterior_EventScript_MoveBoulders:: setobjectxyperm 9, 17, 45 setobjectxyperm 10, 13, 46 setvar VAR_TEMP_0, 1 return MtEmber_Exterior_EventScript_Grunt1:: lock goto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_43, MtEmber_Exterior_EventScript_Grunt1Defeated goto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4, MtEmber_Exterior_EventScript_BattleGrunt1 msgbox MtEmber_Exterior_Text_WellTryDiggingHere release end MtEmber_Exterior_EventScript_Grunt1Defeated:: msgbox MtEmber_Exterior_Text_Grunt1PostBattle release end MtEmber_Exterior_EventScript_BattleGrunt1:: applymovement LOCALID_GRUNT1, Common_Movement_FacePlayer waitmovement 0 playbgm MUS_ENCOUNTER_ROCKET, 0 msgbox MtEmber_Exterior_Text_Grunt1Intro trainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_43, MtEmber_Exterior_Text_Grunt1Defeat msgbox MtEmber_Exterior_Text_Grunt1PostBattle goto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_44, MtEmber_Exterior_EventScript_DefeatedBothGrunts release end MtEmber_Exterior_EventScript_DefeatedBothGrunts:: msgbox MtEmber_Exterior_Text_WellRegroupDontStepInsideThere closemessage fadescreen FADE_TO_BLACK removeobject LOCALID_GRUNT1 removeobject LOCALID_GRUNT2 fadescreen FADE_FROM_BLACK release end MtEmber_Exterior_EventScript_Grunt2:: lock faceplayer goto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_44, MtEmber_Exterior_EventScript_DefeatedGrunt2 goto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4, MtEmber_Exterior_EventScript_BattleGrunt2 msgbox MtEmber_Exterior_Text_YoureInTheWayGetLost closemessage applymovement LOCALID_GRUNT2, Common_Movement_FaceOriginalDirection waitmovement 0 release end MtEmber_Exterior_EventScript_DefeatedGrunt2:: msgbox MtEmber_Exterior_Text_Grunt2PostBattle release end MtEmber_Exterior_EventScript_BattleGrunt2:: playbgm MUS_ENCOUNTER_ROCKET, 0 msgbox MtEmber_Exterior_Text_Grunt2Intro trainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_44, MtEmber_Exterior_Text_Grunt2Defeat msgbox MtEmber_Exterior_Text_Grunt2PostBattle goto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_43, MtEmber_Exterior_EventScript_DefeatedBothGrunts release end MtEmber_Exterior_EventScript_RocketPasswordScene:: lockall textcolor NPC_TEXT_COLOR_MALE msgbox MtEmber_Exterior_Text_PunchedThroughAtLast message MtEmber_Exterior_Text_WhatsPasswordAgain waitmessage playse SE_PIN applymovement LOCALID_GRUNT2, Common_Movement_QuestionMark waitmovement 0 waitbuttonpress msgbox MtEmber_Exterior_Text_FirstPasswordGoldeen applymovement LOCALID_GRUNT1, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN applymovement LOCALID_GRUNT1, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_GRUNT1, Common_Movement_Delay48 waitmovement 0 applymovement LOCALID_GRUNT2, Common_Movement_WalkInPlaceFasterDown waitmovement 0 call MtEmber_Exterior_EventScript_RocketsFaceDown msgbox MtEmber_Exterior_Text_SnoopsBeenListeningIn setvar VAR_MAP_SCENE_MT_EMBER_EXTERIOR, 2 releaseall end MtEmber_Exterior_EventScript_Logan:: trainerbattle_single TRAINER_PKMN_RANGER_LOGAN, MtEmber_Exterior_Text_LoganIntro, MtEmber_Exterior_Text_LoganDefeat msgbox MtEmber_Exterior_Text_LoganPostBattle, MSGBOX_AUTOCLOSE end MtEmber_Exterior_EventScript_Beth:: trainerbattle_single TRAINER_PKMN_RANGER_BETH, MtEmber_Exterior_Text_BethIntro, MtEmber_Exterior_Text_BethDefeat msgbox MtEmber_Exterior_Text_BethPostBattle, MSGBOX_AUTOCLOSE end MtEmber_Exterior_EventScript_Jocelyn:: trainerbattle_single TRAINER_CRUSH_GIRL_JOCELYN, MtEmber_Exterior_Text_JocelynIntro, MtEmber_Exterior_Text_JocelynDefeat msgbox MtEmber_Exterior_Text_JocelynPostBattle, MSGBOX_AUTOCLOSE end MtEmber_Exterior_EventScript_BoulderShortcutTriggers:: setflag FLAG_MT_EMBER_BOULDER_SHORTCUTS setvar VAR_TEMP_0, 1 release end ================================================ FILE: data/maps/MtEmber_Exterior/text.inc ================================================ Text_ExplosionTeach:: .string "Can you imagine?\n" .string "If this volcano were to erupt?\p" .string "The explosion would be the end of\n" .string "us. How terrifying is that?\p" .string "While we're terrified, would you\n" .string "like me to teach EXPLOSION?$" Text_ExplosionDeclined:: .string "Yeah, you're right.\n" .string "It is too terrifying.$" Text_ExplosionWhichMon:: .string "You're terribly brave!\p" .string "Which POKéMON should I teach\n" .string "EXPLOSION?$" Text_ExplosionTaught:: .string "Using EXPLOSION while on this\n" .string "volcano…\p" .string "What a terrifying thrill!$" Text_ExplosionReteach:: .string "This volcano is still active\n" .string "but you came back?\p" .string "So, you like the thrill of\n" .string "risking a volcanic explosion too?$" Text_ExplosionReteach2:: .string "If you want more thrills, I can\n" .string "teach you EXPLOSION for ¥5000.$" Text_ExplosionNotEnoughMoney:: .string "You don't have enough money!\p" .string "You know, if this mountain explodes\n" .string "with us on it, we wouldn't need\l" .string "money anymore…\p" .string "Until that happens, I won't teach\n" .string "you EXPLOSION without ¥5000!$" MtEmber_Exterior_Text_WellTryDiggingHere:: .string "Over here.\n" .string "We'll try digging here.\p" .string "That treasure the ADMINS've been\n" .string "talking about should be here.$" MtEmber_Exterior_Text_YoureInTheWayGetLost:: .string "What the…?\n" .string "You're in the way. Get lost.$" MtEmber_Exterior_Text_PunchedThroughAtLast:: .string "Whew, punched through at last.\n" .string "Let's go treasure hunting!$" MtEmber_Exterior_Text_WhatsPasswordAgain:: .string "Any treasure we find, we haul back\n" .string "to the WAREHOUSE, understood?\p" .string "…Oh, and what're the passwords?\n" .string "At the ROCKET WAREHOUSE, I mean.$" MtEmber_Exterior_Text_FirstPasswordGoldeen:: .string "What, you forgot the password?\n" .string "There're actually two.\p" .string "The first one's “GOLDEEN need\n" .string "log.”\p" .string "And the second one is…$" MtEmber_Exterior_Text_SnoopsBeenListeningIn:: .string "Hey!\n" .string "This snoop's been listening in!$" MtEmber_Exterior_Text_Grunt1Intro:: .string "You've been eavesdropping on us,\n" .string "haven't you?$" MtEmber_Exterior_Text_Grunt1Defeat:: .string "Huh, what?$" MtEmber_Exterior_Text_Grunt1PostBattle:: .string "Why'd you have to win?$" MtEmber_Exterior_Text_Grunt2Intro:: .string "Trying to horn in on our treasure?\n" .string "Don't bet on it!$" MtEmber_Exterior_Text_Grunt2Defeat:: .string "Wait!\n" .string "But how?$" MtEmber_Exterior_Text_Grunt2PostBattle:: .string "Develop amnesia conveniently and\n" .string "forget everything you heard!$" MtEmber_Exterior_Text_WellRegroupDontStepInsideThere:: .string "What a setback…\n" .string "We'll have to regroup.\p" .string "You! Don't even think about taking\n" .string "a step inside here!\p" .string "If you know what's good for you,\n" .string "don't even think about this!$" MtEmber_Exterior_Text_LoganIntro:: .string "An active volcano is one that's\n" .string "erupting, or about to.$" MtEmber_Exterior_Text_LoganDefeat:: .string "Whew… That was hot!\n" .string "Sweat's erupting from me!$" MtEmber_Exterior_Text_LoganPostBattle:: .string "They say there're over 1,500\n" .string "active volcanoes in the world.\p" .string "Just thinking about them makes me\n" .string "feel all hot and gooey inside!$" MtEmber_Exterior_Text_BethIntro:: .string "Do you know how caves form inside\n" .string "volcanoes?$" MtEmber_Exterior_Text_BethDefeat:: .string "Atchah!\n" .string "You're shockingly good!$" MtEmber_Exterior_Text_BethPostBattle:: .string "When lava at the surface of magma\n" .string "hardens, and the magma inside flows\l" .string "out, caverns are left behind.$" MtEmber_Exterior_Text_JocelynIntro:: .string "I've been in training so I can mend\n" .string "my broken heart…\p" .string "It toughened me up physically at\n" .string "least! Hi-yah!$" MtEmber_Exterior_Text_JocelynDefeat:: .string "I think I tried to overdo it…$" MtEmber_Exterior_Text_JocelynPostBattle:: .string "The way you battle, it reminds me\n" .string "of the guy who dumped me…$" ================================================ FILE: data/maps/MtEmber_RubyPath_1F/map.json ================================================ { "id": "MAP_MT_EMBER_RUBY_PATH_1F", "name": "MtEmber_RubyPath_1F", "layout": "LAYOUT_MT_EMBER_RUBY_PATH_1F", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 18, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 23, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 20, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 19, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 21, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" } ], "warp_events": [ { "x": 22, "y": 17, "elevation": 3, "dest_map": "MAP_MT_EMBER_EXTERIOR", "dest_warp_id": "5" }, { "x": 1, "y": 1, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B1F", "dest_warp_id": "0" }, { "x": 24, "y": 5, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B2F_STAIRS", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_RubyPath_1F/scripts.inc ================================================ MtEmber_RubyPath_1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/MtEmber_RubyPath_B1F/map.json ================================================ { "id": "MAP_MT_EMBER_RUBY_PATH_B1F", "name": "MtEmber_RubyPath_B1F", "layout": "LAYOUT_MT_EMBER_RUBY_PATH_B1F", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 1, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 1, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 3, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 5, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" } ], "warp_events": [ { "x": 9, "y": 21, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_1F", "dest_warp_id": "1" }, { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B2F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_RubyPath_B1F/scripts.inc ================================================ MtEmber_RubyPath_B1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/MtEmber_RubyPath_B1F_Stairs/map.json ================================================ { "id": "MAP_MT_EMBER_RUBY_PATH_B1F_STAIRS", "name": "MtEmber_RubyPath_B1F_Stairs", "layout": "LAYOUT_MT_EMBER_RUBY_PATH_B1F_STAIRS", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" } ], "warp_events": [ { "x": 4, "y": 1, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B3F", "dest_warp_id": "1" }, { "x": 1, "y": 5, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B2F_STAIRS", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_RubyPath_B1F_Stairs/scripts.inc ================================================ MtEmber_RubyPath_B1F_Stairs_MapScripts:: .byte 0 ================================================ FILE: data/maps/MtEmber_RubyPath_B2F/map.json ================================================ { "id": "MAP_MT_EMBER_RUBY_PATH_B2F", "name": "MtEmber_RubyPath_B2F", "layout": "LAYOUT_MT_EMBER_RUBY_PATH_B2F", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 9, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 12, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 1, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" } ], "warp_events": [ { "x": 1, "y": 7, "elevation": 3, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B1F", "dest_warp_id": "1" }, { "x": 13, "y": 9, "elevation": 3, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B3F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_RubyPath_B2F/scripts.inc ================================================ MtEmber_RubyPath_B2F_MapScripts:: .byte 0 ================================================ FILE: data/maps/MtEmber_RubyPath_B2F_Stairs/map.json ================================================ { "id": "MAP_MT_EMBER_RUBY_PATH_B2F_STAIRS", "name": "MtEmber_RubyPath_B2F_Stairs", "layout": "LAYOUT_MT_EMBER_RUBY_PATH_B2F_STAIRS", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" } ], "warp_events": [ { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B1F_STAIRS", "dest_warp_id": "1" }, { "x": 1, "y": 4, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_1F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_RubyPath_B2F_Stairs/scripts.inc ================================================ MtEmber_RubyPath_B2F_Stairs_MapScripts:: .byte 0 ================================================ FILE: data/maps/MtEmber_RubyPath_B3F/map.json ================================================ { "id": "MAP_MT_EMBER_RUBY_PATH_B3F", "name": "MtEmber_RubyPath_B3F", "layout": "LAYOUT_MT_EMBER_RUBY_PATH_B3F", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 10, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 26, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 28, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 6, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 7, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 5, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" } ], "warp_events": [ { "x": 1, "y": 4, "elevation": 0, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B2F", "dest_warp_id": "1" }, { "x": 19, "y": 19, "elevation": 3, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B1F_STAIRS", "dest_warp_id": "0" }, { "x": 5, "y": 19, "elevation": 3, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B4F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_RubyPath_B3F/scripts.inc ================================================ .set LOCALID_RUBY, 1 MtEmber_RubyPath_B3F_MapScripts:: .byte 0 @ Odd that this is here and not in MtEmber_RubyPath_B5F/scripts.inc MtEmber_RubyPath_B5F_EventScript_Ruby:: lock faceplayer setflag FLAG_GOT_RUBY clearflag FLAG_HIDE_SCOTT removeobject LOCALID_RUBY giveitem_msg MtEmber_RubyPath_B3F_Text_FoundARuby, ITEM_RUBY, 1, MUS_OBTAIN_KEY_ITEM release end ================================================ FILE: data/maps/MtEmber_RubyPath_B3F/text.inc ================================================ MtEmber_RubyPath_B3F_Text_FoundARuby:: .string "{PLAYER} found a RUBY!$" ================================================ FILE: data/maps/MtEmber_RubyPath_B4F/map.json ================================================ { "id": "MAP_MT_EMBER_RUBY_PATH_B4F", "name": "MtEmber_RubyPath_B4F", "layout": "LAYOUT_MT_EMBER_RUBY_PATH_B4F", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 14, "y": 14, "elevation": 3, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B5F", "dest_warp_id": "0" }, { "x": 4, "y": 2, "elevation": 3, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B3F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 3, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleABC" }, { "type": "sign", "x": 4, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleABC" }, { "type": "sign", "x": 5, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleABC" }, { "type": "sign", "x": 4, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleGHI" }, { "type": "sign", "x": 3, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleGHI" }, { "type": "sign", "x": 5, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleGHI" }, { "type": "sign", "x": 3, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleMNO" }, { "type": "sign", "x": 4, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleMNO" }, { "type": "sign", "x": 5, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleMNO" }, { "type": "sign", "x": 3, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleTUV" }, { "type": "sign", "x": 4, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleTUV" }, { "type": "sign", "x": 5, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleTUV" }, { "type": "sign", "x": 7, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleDEF" }, { "type": "sign", "x": 8, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleDEF" }, { "type": "sign", "x": 9, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleDEF" }, { "type": "sign", "x": 7, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleJKL" }, { "type": "sign", "x": 8, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleJKL" }, { "type": "sign", "x": 9, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleJKL" }, { "type": "sign", "x": 7, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BraillePQRS" }, { "type": "sign", "x": 11, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BraillePeriod" }, { "type": "sign", "x": 11, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleComma" }, { "type": "sign", "x": 8, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BraillePQRS" }, { "type": "sign", "x": 9, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BraillePQRS" }, { "type": "sign", "x": 7, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleWXYZ" }, { "type": "sign", "x": 9, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleWXYZ" }, { "type": "sign", "x": 8, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B4F_EventScript_BrailleWXYZ" } ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_RubyPath_B4F/scripts.inc ================================================ MtEmber_RubyPath_B4F_MapScripts:: .byte 0 MtEmber_RubyPath_B4F_EventScript_BrailleABC:: lockall braillemessage Braille_Text_ABC waitbuttonpress releaseall end MtEmber_RubyPath_B4F_EventScript_BrailleGHI:: lockall braillemessage Braille_Text_GHI waitbuttonpress releaseall end MtEmber_RubyPath_B4F_EventScript_BrailleMNO:: lockall braillemessage Braille_Text_MNO waitbuttonpress releaseall end MtEmber_RubyPath_B4F_EventScript_BrailleTUV:: lockall braillemessage Braille_Text_TUV waitbuttonpress releaseall end MtEmber_RubyPath_B4F_EventScript_BrailleDEF:: lockall braillemessage Braille_Text_DEF waitbuttonpress releaseall end MtEmber_RubyPath_B4F_EventScript_BrailleJKL:: lockall braillemessage Braille_Text_JKL waitbuttonpress releaseall end MtEmber_RubyPath_B4F_EventScript_BraillePQRS:: lockall braillemessage Braille_Text_PQRS waitbuttonpress releaseall end MtEmber_RubyPath_B4F_EventScript_BrailleWXYZ:: lockall braillemessage Braille_Text_WXYZ waitbuttonpress releaseall end MtEmber_RubyPath_B4F_EventScript_BraillePeriod:: lockall braillemessage Braille_Text_Period waitbuttonpress releaseall end MtEmber_RubyPath_B4F_EventScript_BrailleComma:: lockall braillemessage Braille_Text_Comma waitbuttonpress releaseall end ================================================ FILE: data/maps/MtEmber_RubyPath_B5F/map.json ================================================ { "id": "MAP_MT_EMBER_RUBY_PATH_B5F", "name": "MtEmber_RubyPath_B5F", "layout": "LAYOUT_MT_EMBER_RUBY_PATH_B5F", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_RUBY", "in_connection": false, "x": 7, "y": 7, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtEmber_RubyPath_B5F_EventScript_Ruby", "flag": "FLAG_HIDE_RUBY" } ], "warp_events": [ { "x": 11, "y": 7, "elevation": 3, "dest_map": "MAP_MT_EMBER_RUBY_PATH_B4F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 7, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "MtEmber_RubyPath_B5F_EventScript_BrailleMessage" } ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_RubyPath_B5F/scripts.inc ================================================ MtEmber_RubyPath_B5F_MapScripts:: .byte 0 MtEmber_RubyPath_B5F_EventScript_BrailleMessage:: lockall setvar VAR_0x8005, 130 braillemessage_wait Braille_Text_Everything braillemessage_wait Braille_Text_HasMeaning1 braillemessage_wait Braille_Text_Existence braillemessage_wait Braille_Text_HasMeaning2 braillemessage_wait Braille_Text_BeingAlive braillemessage_wait Braille_Text_HasMeaning3 braillemessage_wait Braille_Text_HaveDreams braillemessage Braille_Text_UsePower waitbuttonpress releaseall end ================================================ FILE: data/maps/MtEmber_Summit/map.json ================================================ { "id": "MAP_MT_EMBER_SUMMIT", "name": "MtEmber_Summit", "layout": "LAYOUT_MT_EMBER_SUMMIT", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_VOLCANIC_ASH", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MOLTRES", "in_connection": false, "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtEmber_Summit_EventScript_Moltres", "flag": "FLAG_HIDE_MOLTRES" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 10, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 9, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 8, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 8, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" } ], "warp_events": [ { "x": 9, "y": 15, "elevation": 0, "dest_map": "MAP_MT_EMBER_EXTERIOR", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_Summit/scripts.inc ================================================ MtEmber_Summit_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MtEmber_Summit_OnTransition map_script MAP_SCRIPT_ON_RESUME, MtEmber_Summit_OnResume .byte 0 MtEmber_Summit_OnResume:: call_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, MtEmber_Summit_EventScript_TryRemoveMoltres end MtEmber_Summit_EventScript_TryRemoveMoltres:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return removeobject VAR_LAST_TALKED return MtEmber_Summit_OnTransition:: call_if_set FLAG_FOUGHT_MOLTRES, MtEmber_Summit_EventScript_HideMoltres call_if_unset FLAG_FOUGHT_MOLTRES, MtEmber_Summit_EventScript_TryShowMoltres end MtEmber_Summit_EventScript_TryShowMoltres:: goto_if_set FLAG_MOLTRES_FLEW_AWAY, EventScript_Return clearflag FLAG_HIDE_MOLTRES return MtEmber_Summit_EventScript_HideMoltres:: setflag FLAG_HIDE_MOLTRES return MtEmber_Summit_EventScript_Moltres:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer setwildbattle SPECIES_MOLTRES, 50 waitse playmoncry SPECIES_MOLTRES, CRY_MODE_ENCOUNTER message Text_Gyaoo waitmessage waitmoncry delay 10 playbgm MUS_ENCOUNTER_GYM_LEADER, 0 waitbuttonpress setflag FLAG_SYS_SPECIAL_WILD_BATTLE special StartLegendaryBattle waitstate clearflag FLAG_SYS_SPECIAL_WILD_BATTLE specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, MtEmber_Summit_EventScript_DefeatedMoltres goto_if_eq VAR_RESULT, B_OUTCOME_RAN, MtEmber_Summit_EventScript_RanFromMoltres goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, MtEmber_Summit_EventScript_RanFromMoltres setflag FLAG_FOUGHT_MOLTRES release end MtEmber_Summit_EventScript_DefeatedMoltres:: setflag FLAG_MOLTRES_FLEW_AWAY setvar VAR_0x8004, SPECIES_MOLTRES goto EventScript_MonFlewAway end MtEmber_Summit_EventScript_RanFromMoltres:: setvar VAR_0x8004, SPECIES_MOLTRES goto EventScript_MonFlewAway end ================================================ FILE: data/maps/MtEmber_SummitPath_1F/map.json ================================================ { "id": "MAP_MT_EMBER_SUMMIT_PATH_1F", "name": "MtEmber_SummitPath_1F", "layout": "LAYOUT_MT_EMBER_SUMMIT_PATH_1F", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 2, "y": 15, "elevation": 0, "dest_map": "MAP_MT_EMBER_EXTERIOR", "dest_warp_id": "2" }, { "x": 11, "y": 1, "elevation": 0, "dest_map": "MAP_MT_EMBER_SUMMIT_PATH_2F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_SummitPath_1F/scripts.inc ================================================ MtEmber_SummitPath_1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/MtEmber_SummitPath_2F/map.json ================================================ { "id": "MAP_MT_EMBER_SUMMIT_PATH_2F", "name": "MtEmber_SummitPath_2F", "layout": "LAYOUT_MT_EMBER_SUMMIT_PATH_2F", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 40, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 33, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 15, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 13, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 13, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 7, "y": 38, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 9, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 7, "y": 34, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_19" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 15, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1A" } ], "warp_events": [ { "x": 8, "y": 39, "elevation": 0, "dest_map": "MAP_MT_EMBER_SUMMIT_PATH_1F", "dest_warp_id": "1" }, { "x": 39, "y": 6, "elevation": 3, "dest_map": "MAP_MT_EMBER_SUMMIT_PATH_3F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_SummitPath_2F/scripts.inc ================================================ MtEmber_SummitPath_2F_MapScripts:: .byte 0 ================================================ FILE: data/maps/MtEmber_SummitPath_3F/map.json ================================================ { "id": "MAP_MT_EMBER_SUMMIT_PATH_3F", "name": "MtEmber_SummitPath_3F", "layout": "LAYOUT_MT_EMBER_SUMMIT_PATH_3F", "music": "MUS_MT_CHIMNEY", "region_map_section": "MAPSEC_MT_EMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 2, "y": 4, "elevation": 0, "dest_map": "MAP_MT_EMBER_SUMMIT_PATH_2F", "dest_warp_id": "1" }, { "x": 11, "y": 8, "elevation": 0, "dest_map": "MAP_MT_EMBER_EXTERIOR", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/MtEmber_SummitPath_3F/scripts.inc ================================================ MtEmber_SummitPath_3F_MapScripts:: .byte 0 ================================================ FILE: data/maps/MtMoon_1F/map.json ================================================ { "id": "MAP_MT_MOON_1F", "name": "MtMoon_1F", "layout": "LAYOUT_MT_MOON_1F", "music": "MUS_MT_MOON", "region_map_section": "MAPSEC_MT_MOON", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 20, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "MtMoon_1F_EventScript_Iris", "flag": "0", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "x": 36, "y": 30, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "MtMoon_1F_EventScript_Robby", "flag": "0", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 30, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "MtMoon_1F_EventScript_Jovan", "flag": "0", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 33, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP", "movement_range_x": 5, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "MtMoon_1F_EventScript_Miriam", "flag": "0", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "x": 7, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "MtMoon_1F_EventScript_Kent", "flag": "0", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "x": 13, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "MtMoon_1F_EventScript_Josh", "flag": "0", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "x": 7, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "MtMoon_1F_EventScript_Marcos", "flag": "0", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 2, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_1F_EventScript_ItemParalyzeHeal", "flag": "FLAG_HIDE_MT_MOON_1F_PARALYZE_HEAL", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 11, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_1F_EventScript_ItemTM09", "flag": "FLAG_HIDE_MT_MOON_1F_TM09", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 26, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_1F_EventScript_ItemPotion", "flag": "FLAG_HIDE_MT_MOON_1F_POTION", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 42, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_1F_EventScript_ItemRareCandy", "flag": "FLAG_HIDE_MT_MOON_1F_RARE_CANDY", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 44, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_1F_EventScript_ItemEscapeRope", "flag": "FLAG_HIDE_MT_MOON_1F_ESCAPE_ROPE", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 3, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_1F_EventScript_ItemMoonStone", "flag": "FLAG_HIDE_MT_MOON_1F_MOON_STONE", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 42, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_1F_EventScript_BaldingMan", "flag": "0", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "x": 44, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Paras", "flag": "FLAG_HIDE_MASTER_TRAINERS", "in_connection": false } ], "warp_events": [ { "x": 5, "y": 6, "elevation": 3, "dest_map": "MAP_MT_MOON_B1F", "dest_warp_id": "0" }, { "x": 19, "y": 14, "elevation": 3, "dest_map": "MAP_MT_MOON_B1F", "dest_warp_id": "1" }, { "x": 31, "y": 16, "elevation": 3, "dest_map": "MAP_MT_MOON_B1F", "dest_warp_id": "2" }, { "x": 18, "y": 37, "elevation": 3, "dest_map": "MAP_ROUTE4", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 19, "y": 26, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "MtMoon_1F_EventScript_ZubatSign" } ], "level_scaling": "1" } ================================================ FILE: data/maps/MtMoon_1F/scripts.inc ================================================ .set LOCALID_PARAS_MASTER, 15 .set TRAINER, VAR_0x8009 MtMoon_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MtMoon_1F_OnTransition .byte 0 MtMoon_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_MT_MOON_1F goto MtMoon_1F_MapScript_SetMasterTrainerMovementTypes end MtMoon_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PARAS callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, MtMoon_1F_MapScript_ParasMasterMovementType end MtMoon_1F_MapScript_ParasMasterMovementType:: setobjectmovementtype LOCALID_PARAS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return MtMoon_1F_EventScript_ZubatSign:: msgbox MtMoon_1F_Text_ZubatIsABloodsucker, MSGBOX_SIGN end MtMoon_1F_EventScript_Marcos:: trainerbattle_single TRAINER_HIKER_MARCOS, MtMoon_1F_Text_MarcosIntro, MtMoon_1F_Text_MarcosDefeat msgbox MtMoon_1F_Text_MarcosPostBattle, MSGBOX_AUTOCLOSE end MtMoon_1F_EventScript_Josh:: trainerbattle_single TRAINER_YOUNGSTER_JOSH, MtMoon_1F_Text_JoshIntro, MtMoon_1F_Text_JoshDefeat msgbox MtMoon_1F_Text_JoshPostBattle, MSGBOX_AUTOCLOSE end MtMoon_1F_EventScript_Miriam:: trainerbattle_single TRAINER_LASS_MIRIAM, MtMoon_1F_Text_MiriamIntro, MtMoon_1F_Text_MiriamDefeat msgbox MtMoon_1F_Text_MiriamPostBattle, MSGBOX_AUTOCLOSE end MtMoon_1F_EventScript_Iris:: trainerbattle_single TRAINER_LASS_IRIS, MtMoon_1F_Text_IrisIntro, MtMoon_1F_Text_IrisDefeat msgbox MtMoon_1F_Text_IrisPostBattle, MSGBOX_AUTOCLOSE end MtMoon_1F_EventScript_Jovan:: trainerbattle_single TRAINER_SUPER_NERD_JOVAN, MtMoon_1F_Text_JovanIntro, MtMoon_1F_Text_JovanDefeat msgbox MtMoon_1F_Text_JovanPostBattle, MSGBOX_AUTOCLOSE end MtMoon_1F_EventScript_Kent:: trainerbattle_single TRAINER_BUG_CATCHER_KENT, MtMoon_1F_Text_KentIntro, MtMoon_1F_Text_KentDefeat msgbox MtMoon_1F_Text_KentPostBattle, MSGBOX_AUTOCLOSE end MtMoon_1F_EventScript_Robby:: trainerbattle_single TRAINER_BUG_CATCHER_ROBBY, MtMoon_1F_Text_RobbyIntro, MtMoon_1F_Text_RobbyDefeat msgbox MtMoon_1F_Text_RobbyPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/MtMoon_1F/text.inc ================================================ MtMoon_1F_Text_MarcosIntro:: .string "WHOA!\n" .string "You shocked me!\l" .string "…Oh, you're just a kid!$" MtMoon_1F_Text_MarcosDefeat:: .string "Wow!\n" .string "Shocked again!$" MtMoon_1F_Text_MarcosPostBattle:: .string "Kids like you shouldn't be\n" .string "wandering around here in the dark.$" MtMoon_1F_Text_JoshIntro:: .string "Did you come to explore the cave,\n" .string "too?$" MtMoon_1F_Text_JoshDefeat:: .string "Losing stinks!\n" .string "It's so uncool.$" MtMoon_1F_Text_JoshPostBattle:: .string "I came all the way down here to\n" .string "show off to girls.$" MtMoon_1F_Text_MiriamIntro:: .string "Wow! It's way bigger in here than\n" .string "I thought!$" MtMoon_1F_Text_MiriamDefeat:: .string "Oh!\n" .string "I lost it!$" MtMoon_1F_Text_MiriamPostBattle:: .string "How do you get out of here?\n" .string "It's so big, I may get lost.$" MtMoon_1F_Text_JovanIntro:: .string "What!\n" .string "Don't sneak up on me!$" MtMoon_1F_Text_JovanDefeat:: .string "My POKéMON won't do!$" MtMoon_1F_Text_JovanPostBattle:: .string "I have to find stronger POKéMON.\n" .string "Where might they be?$" MtMoon_1F_Text_IrisIntro:: .string "What?\n" .string "I'm waiting for my friends to find\l" .string "me here.$" MtMoon_1F_Text_IrisDefeat:: .string "I lost?$" MtMoon_1F_Text_IrisPostBattle:: .string "I came because I heard there are\n" .string "some very rare fossils here.$" MtMoon_1F_Text_KentIntro:: .string "Suspicious men are in the cave.\n" .string "What about you?$" MtMoon_1F_Text_KentDefeat:: .string "You got me!$" MtMoon_1F_Text_KentPostBattle:: .string "I saw them!\n" .string "I'm sure they're from TEAM ROCKET!$" MtMoon_1F_Text_RobbyIntro:: .string "You need to go through this cave\n" .string "to get to CERULEAN CITY.$" MtMoon_1F_Text_RobbyDefeat:: .string "I lost.$" MtMoon_1F_Text_RobbyPostBattle:: .string "ZUBAT is tough!\n" .string "But if you can catch one, you'll\l" .string "be able to count on it.$" MtMoon_1F_Text_ZubatIsABloodsucker:: .string "Beware!\n" .string "ZUBAT is a bloodsucker!$" MtMoon_1F_Text_BrockHelpsExcavateFossils:: .string "Hi, I'm excavating for fossils here\n" .string "under MT. MOON.\p" .string "Sometimes, BROCK of PEWTER GYM\n" .string "lends me a hand.$" ================================================ FILE: data/maps/MtMoon_B1F/map.json ================================================ { "id": "MAP_MT_MOON_B1F", "name": "MtMoon_B1F", "layout": "LAYOUT_MT_MOON_B1F", "music": "MUS_MT_MOON", "region_map_section": "MAPSEC_MT_MOON", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 22, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Clefable", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 3, "elevation": 3, "dest_map": "MAP_MT_MOON_1F", "dest_warp_id": "0" }, { "x": 25, "y": 4, "elevation": 3, "dest_map": "MAP_MT_MOON_1F", "dest_warp_id": "1" }, { "x": 43, "y": 21, "elevation": 3, "dest_map": "MAP_MT_MOON_1F", "dest_warp_id": "2" }, { "x": 22, "y": 18, "elevation": 3, "dest_map": "MAP_MT_MOON_B2F", "dest_warp_id": "0" }, { "x": 17, "y": 5, "elevation": 3, "dest_map": "MAP_MT_MOON_B2F", "dest_warp_id": "1" }, { "x": 26, "y": 36, "elevation": 3, "dest_map": "MAP_MT_MOON_B2F", "dest_warp_id": "2" }, { "x": 39, "y": 4, "elevation": 3, "dest_map": "MAP_MT_MOON_B2F", "dest_warp_id": "3" }, { "x": 45, "y": 4, "elevation": 3, "dest_map": "MAP_ROUTE4", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 46, "y": 2, "elevation": 0, "item": "ITEM_TINY_MUSHROOM", "flag": "FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 26, "y": 2, "elevation": 0, "item": "ITEM_TINY_MUSHROOM", "flag": "FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_2", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 39, "y": 34, "elevation": 0, "item": "ITEM_TINY_MUSHROOM", "flag": "FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_3", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 24, "y": 35, "elevation": 0, "item": "ITEM_BIG_MUSHROOM", "flag": "FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 6, "y": 12, "elevation": 0, "item": "ITEM_BIG_MUSHROOM", "flag": "FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_2", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 25, "y": 34, "elevation": 0, "item": "ITEM_BIG_MUSHROOM", "flag": "FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_3", "quantity": 1, "underfoot": false } ], "level_scaling": "1" } ================================================ FILE: data/maps/MtMoon_B1F/scripts.inc ================================================ .set LOCALID_CLEFABLE_MASTER, 1 .set TRAINER, VAR_0x8009 MtMoon_B1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MtMoon_B1F_MapScript_SetMasterTrainerMovementTypes .byte 0 MtMoon_B1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_CLEFABLE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, MtMoon_B1F_MapScript_ClefableMasterMovementType end MtMoon_B1F_MapScript_ClefableMasterMovementType:: setobjectmovementtype LOCALID_CLEFABLE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ================================================ FILE: data/maps/MtMoon_B2F/map.json ================================================ { "id": "MAP_MT_MOON_B2F", "name": "MtMoon_B2F", "layout": "LAYOUT_MT_MOON_B2F", "music": "MUS_MT_MOON", "region_map_section": "MAPSEC_MT_MOON", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FOSSIL", "x": 13, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_B2F_EventScript_DomeFossil", "flag": "FLAG_HIDE_DOME_FOSSIL", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FOSSIL", "x": 14, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_B2F_EventScript_HelixFossil", "flag": "FLAG_HIDE_HELIX_FOSSIL", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 13, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_B2F_EventScript_Miguel", "flag": "0", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "x": 37, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "MtMoon_B2F_EventScript_Grunt4", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "x": 12, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "MtMoon_B2F_EventScript_Grunt1", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "x": 35, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "MtMoon_B2F_EventScript_Grunt3", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "x": 18, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "MtMoon_B2F_EventScript_Grunt2", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 30, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_B2F_EventScript_ItemStarPiece", "flag": "FLAG_HIDE_MT_MOON_B2F_STAR_PIECE", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 35, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_B2F_EventScript_ItemTM46", "flag": "FLAG_HIDE_MT_MOON_B2F_TM46", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 24, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_B2F_EventScript_ItemRevive", "flag": "FLAG_HIDE_MT_MOON_B2F_REVIVE", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 3, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MtMoon_B2F_EventScript_ItemAntidote", "flag": "FLAG_HIDE_MT_MOON_B2F_ANTIDOTE", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "x": 40, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Omanyte", "flag": "FLAG_HIDE_MASTER_TRAINERS", "in_connection": false }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "x": 33, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Kabuto", "flag": "FLAG_HIDE_MASTER_TRAINERS", "in_connection": false } ], "warp_events": [ { "x": 25, "y": 21, "elevation": 3, "dest_map": "MAP_MT_MOON_B1F", "dest_warp_id": "3" }, { "x": 31, "y": 11, "elevation": 3, "dest_map": "MAP_MT_MOON_B1F", "dest_warp_id": "4" }, { "x": 17, "y": 31, "elevation": 3, "dest_map": "MAP_MT_MOON_B1F", "dest_warp_id": "5" }, { "x": 5, "y": 10, "elevation": 3, "dest_map": "MAP_MT_MOON_B1F", "dest_warp_id": "6" } ], "coord_events": [ { "type": "trigger", "x": 14, "y": 11, "elevation": 3, "var": "VAR_MAP_SCENE_MT_MOON_B2F", "var_value": "0", "script": "MtMoon_B2F_EventScript_MiguelTrigger" } ], "bg_events": [ { "type": "hidden_item", "x": 20, "y": 16, "elevation": 3, "item": "ITEM_MOON_STONE", "flag": "FLAG_HIDDEN_ITEM_MT_MOON_B2F_MOON_STONE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 39, "y": 11, "elevation": 3, "item": "ITEM_ETHER", "flag": "FLAG_HIDDEN_ITEM_MT_MOON_B2F_ETHER", "quantity": 1, "underfoot": false } ], "level_scaling": "1" } ================================================ FILE: data/maps/MtMoon_B2F/scripts.inc ================================================ .equ LOCALID_DOME_FOSSIL, 1 .equ LOCALID_HELIX_FOSSIL, 2 .equ LOCALID_MIGUEL, 3 .set LOCALID_OMANYTE_MASTER, 12 .set LOCALID_KABUTO_MASTER, 13 .set TRAINER, VAR_0x8009 MtMoon_B2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MtMoon_B2F_OnTransition .byte 0 MtMoon_B2F_OnTransition:: call_if_unset FLAG_GOT_FOSSIL_FROM_MT_MOON, MtMoon_B2F_EventScript_ShowFossils goto MtMoon_B2F_MapScript_SetMasterTrainerMovementTypes end MtMoon_B2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_OMANYTE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, MtMoon_B2F_MapScript_OmanyteMasterMovementType setvar TRAINER, MASTER_KABUTO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, MtMoon_B2F_MapScript_KabutoMasterMovementType end MtMoon_B2F_MapScript_OmanyteMasterMovementType:: setobjectmovementtype LOCALID_OMANYTE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return MtMoon_B2F_MapScript_KabutoMasterMovementType:: setobjectmovementtype LOCALID_KABUTO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return MtMoon_B2F_EventScript_ShowFossils:: clearflag FLAG_HIDE_DOME_FOSSIL clearflag FLAG_HIDE_HELIX_FOSSIL return MtMoon_B2F_EventScript_MiguelTrigger:: lockall applymovement LOCALID_MIGUEL, Common_Movement_WalkInPlaceFasterRight waitmovement 0 call MtMoon_B2F_EventScript_BattleMiguel releaseall end MtMoon_B2F_EventScript_Miguel:: lock faceplayer goto_if_set FLAG_GOT_FOSSIL_FROM_MT_MOON, MtMoon_B2F_EventScript_MiguelFossilPicked goto_if_defeated TRAINER_SUPER_NERD_MIGUEL, MtMoon_B2F_EventScript_MiguelGoPickFossil call MtMoon_B2F_EventScript_BattleMiguel release end MtMoon_B2F_EventScript_BattleMiguel:: textcolor NPC_TEXT_COLOR_MALE message MtMoon_B2F_Text_MiguelIntro waitmessage playbgm MUS_ENCOUNTER_GYM_LEADER, 0 waitbuttonpress setvar VAR_LAST_TALKED, LOCALID_MIGUEL trainerbattle_no_intro TRAINER_SUPER_NERD_MIGUEL, MtMoon_B2F_Text_MiguelDefeat setvar VAR_MAP_SCENE_MT_MOON_B2F, 1 msgbox MtMoon_B2F_Text_WellEachTakeAFossil return MtMoon_B2F_EventScript_MiguelFossilPicked:: msgbox MtMoon_B2F_Text_LabOnCinnabarRegeneratesFossils release end MtMoon_B2F_EventScript_MiguelGoPickFossil:: msgbox MtMoon_B2F_Text_WellEachTakeAFossil release end MtMoon_B2F_EventScript_DomeFossil:: lock faceplayer msgbox MtMoon_B2F_Text_YouWantDomeFossil, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MtMoon_B2F_EventScript_DontTakeFossil removeobject LOCALID_DOME_FOSSIL giveitem_msg MtMoon_B2F_Text_ObtainedDomeFossil, ITEM_DOME_FOSSIL, 1, MUS_OBTAIN_KEY_ITEM closemessage special QuestLog_CutRecording delay 10 applymovement LOCALID_MIGUEL, MtMoon_B2F_Movement_MiguelToHelixFossil waitmovement 0 copyobjectxytoperm LOCALID_MIGUEL textcolor NPC_TEXT_COLOR_MALE playfanfare MUS_OBTAIN_KEY_ITEM message MtMoon_B2F_Text_ThenThisFossilIsMine waitmessage waitfanfare removeobject LOCALID_HELIX_FOSSIL setflag FLAG_GOT_DOME_FOSSIL setflag FLAG_GOT_FOSSIL_FROM_MT_MOON release end MtMoon_B2F_Movement_MiguelToHelixFossil:: walk_right walk_up walk_up walk_up step_end MtMoon_B2F_EventScript_HelixFossil:: lock faceplayer msgbox MtMoon_B2F_Text_YouWantHelixFossil, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MtMoon_B2F_EventScript_DontTakeFossil removeobject LOCALID_HELIX_FOSSIL giveitem_msg MtMoon_B2F_Text_ObtainedHelixFossil, ITEM_HELIX_FOSSIL, 1, MUS_OBTAIN_KEY_ITEM closemessage special QuestLog_CutRecording delay 10 applymovement LOCALID_MIGUEL, MtMoon_B2F_Movement_MiguelToDomeFossil waitmovement 0 copyobjectxytoperm LOCALID_MIGUEL textcolor NPC_TEXT_COLOR_MALE playfanfare MUS_OBTAIN_KEY_ITEM message MtMoon_B2F_Text_ThenThisFossilIsMine waitmessage waitfanfare removeobject LOCALID_DOME_FOSSIL setflag FLAG_GOT_HELIX_FOSSIL setflag FLAG_GOT_FOSSIL_FROM_MT_MOON release end MtMoon_B2F_EventScript_DontTakeFossil:: release end MtMoon_B2F_Movement_MiguelToDomeFossil:: walk_up walk_up walk_up step_end MtMoon_B2F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT, MtMoon_B2F_Text_Grunt1Intro, MtMoon_B2F_Text_Grunt1Defeat msgbox MtMoon_B2F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end MtMoon_B2F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_2, MtMoon_B2F_Text_Grunt2Intro, MtMoon_B2F_Text_Grunt2Defeat msgbox MtMoon_B2F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end MtMoon_B2F_EventScript_Grunt3:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_3, MtMoon_B2F_Text_Grunt3Intro, MtMoon_B2F_Text_Grunt3Defeat msgbox MtMoon_B2F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE end MtMoon_B2F_EventScript_Grunt4:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_4, MtMoon_B2F_Text_Grunt4Intro, MtMoon_B2F_Text_Grunt4Defeat msgbox MtMoon_B2F_Text_Grunt4PostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/MtMoon_B2F/text.inc ================================================ MtMoon_B2F_Text_MiguelIntro:: .string "Hey, stop!\p" .string "I found these fossils!\n" .string "They're both mine!$" MtMoon_B2F_Text_MiguelDefeat:: .string "Okay!\n" .string "I'll share!$" MtMoon_B2F_Text_WellEachTakeAFossil:: .string "We'll each take a fossil!\n" .string "No being greedy!$" MtMoon_B2F_Text_ThenThisFossilIsMine:: .string "All right.\n" .string "Then this fossil is mine!$" MtMoon_B2F_Text_LabOnCinnabarRegeneratesFossils:: .string "Far away, on CINNABAR ISLAND,\n" .string "there's a POKéMON LAB.\p" .string "They do research on regenerating\n" .string "fossils.$" MtMoon_B2F_Text_Grunt1Intro:: .string "We, TEAM ROCKET, shall find the\n" .string "fossils!\p" .string "Reviving POKéMON from them will\n" .string "earn us huge riches!$" MtMoon_B2F_Text_Grunt1Defeat:: .string "Urgh!\n" .string "Now I'm mad!$" MtMoon_B2F_Text_Grunt1PostBattle:: .string "You made me mad!\n" .string "TEAM ROCKET will blacklist you!$" MtMoon_B2F_Text_Grunt2Intro:: .string "We, TEAM ROCKET, are POKéMON\n" .string "gangsters!\l" .string "We strike fear with our strength!$" MtMoon_B2F_Text_Grunt2Defeat:: .string "I blew it!$" MtMoon_B2F_Text_Grunt2PostBattle:: .string "Darn it all!\n" .string "My associates won't stand for this!$" MtMoon_B2F_Text_Grunt3Intro:: .string "We're pulling a big job here!\n" .string "Get lost, kid!$" MtMoon_B2F_Text_Grunt3Defeat:: .string "So, you are good…$" MtMoon_B2F_Text_Grunt3PostBattle:: .string "If you find a fossil, give it to me\n" .string "and scram!$" MtMoon_B2F_Text_Grunt4Intro:: .string "Little kids shouldn't be messing\n" .string "around with grown-ups!\p" .string "It could be bad news!$" MtMoon_B2F_Text_Grunt4Defeat:: .string "I'm steamed!$" MtMoon_B2F_Text_Grunt4PostBattle:: .string "POKéMON lived here long before\n" .string "people came.$" MtMoon_B2F_Text_YouWantDomeFossil:: .string "Do you want the DOME FOSSIL?$" MtMoon_B2F_Text_YouWantHelixFossil:: .string "Do you want the HELIX FOSSIL?$" MtMoon_B2F_Text_ObtainedHelixFossil:: .string "Obtained the HELIX FOSSIL!$" MtMoon_B2F_Text_ObtainedDomeFossil:: .string "Obtained the DOME FOSSIL!$" ================================================ FILE: data/maps/NavelRock_1F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_1F", "name": "NavelRock_1F", "layout": "LAYOUT_NAVEL_ROCK_1F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 8, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_B1F", "dest_warp_id": "0" }, { "x": 8, "y": 23, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_EXTERIOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_1F/scripts.inc ================================================ NavelRock_1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_B1F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_B1F", "name": "NavelRock_B1F", "layout": "LAYOUT_NAVEL_ROCK_B1F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 4, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_1F", "dest_warp_id": "0" }, { "x": 11, "y": 5, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_FORK", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_B1F/scripts.inc ================================================ NavelRock_B1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_Base/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE", "name": "NavelRock_Base", "layout": "LAYOUT_NAVEL_ROCK_BASE", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LUGIA", "x": 10, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NavelRock_Base_EventScript_Lugia", "flag": "FLAG_HIDE_LUGIA" } ], "warp_events": [ { "x": 13, "y": 20, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B11F", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_Base/scripts.inc ================================================ .set LOCALID_LUGIA, 1 NavelRock_Base_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, NavelRock_Base_OnTransition map_script MAP_SCRIPT_ON_RESUME, NavelRock_Base_OnResume .byte 0 NavelRock_Base_OnTransition:: call_if_set FLAG_FOUGHT_LUGIA, NavelRock_Base_EventScript_HideLugia call_if_unset FLAG_FOUGHT_LUGIA, NavelRock_Base_EventScript_TryShowLugia end NavelRock_Base_EventScript_HideLugia:: setflag FLAG_HIDE_LUGIA return NavelRock_Base_EventScript_TryShowLugia:: goto_if_set FLAG_LUGIA_FLEW_AWAY, EventScript_Return clearflag FLAG_HIDE_LUGIA return NavelRock_Base_OnResume:: call_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, NavelRock_Base_EventScript_TryRemoveLugia end NavelRock_Base_EventScript_TryRemoveLugia:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return removeobject LOCALID_LUGIA return NavelRock_Base_EventScript_Lugia:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer waitse delay 20 playse SE_THUNDERSTORM_STOP setvar VAR_0x8004, 0 @ Vertical pan setvar VAR_0x8005, 3 @ Horizontal pan setvar VAR_0x8006, 4 @ Num shakes setvar VAR_0x8007, 2 @ Shake delay special ShakeScreen delay 30 playse SE_THUNDERSTORM_STOP setvar VAR_0x8004, 0 @ Vertical pan setvar VAR_0x8005, 3 @ Horizontal pan setvar VAR_0x8006, 4 @ Num shakes setvar VAR_0x8007, 2 @ Shake delay special ShakeScreen delay 30 delay 50 waitse playmoncry SPECIES_LUGIA, CRY_MODE_ENCOUNTER waitmoncry delay 20 seteventmon SPECIES_LUGIA, 70 setflag FLAG_SYS_SPECIAL_WILD_BATTLE special StartLegendaryBattle waitstate clearflag FLAG_SYS_SPECIAL_WILD_BATTLE specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, NavelRock_Base_EventScript_DefeatedLugia goto_if_eq VAR_RESULT, B_OUTCOME_RAN, NavelRock_Base_EventScript_RanFromLugia goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, NavelRock_Base_EventScript_RanFromLugia setflag FLAG_FOUGHT_LUGIA release end NavelRock_Base_EventScript_DefeatedLugia:: setflag FLAG_LUGIA_FLEW_AWAY setvar VAR_0x8004, SPECIES_LUGIA goto EventScript_MonFlewAway end NavelRock_Base_EventScript_RanFromLugia:: setvar VAR_0x8004, SPECIES_LUGIA goto EventScript_MonFlewAway end ================================================ FILE: data/maps/NavelRock_BasePath_B10F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B10F", "name": "NavelRock_BasePath_B10F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B10F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B9F", "dest_warp_id": "1" }, { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B11F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B10F/scripts.inc ================================================ NavelRock_BasePath_B10F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B11F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B11F", "name": "NavelRock_BasePath_B11F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B11F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B10F", "dest_warp_id": "1" }, { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B11F/scripts.inc ================================================ NavelRock_BasePath_B11F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B1F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B1F", "name": "NavelRock_BasePath_B1F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B1F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_FORK", "dest_warp_id": "2" }, { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B2F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B1F/scripts.inc ================================================ NavelRock_BasePath_B1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B2F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B2F", "name": "NavelRock_BasePath_B2F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B2F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B1F", "dest_warp_id": "1" }, { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B3F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B2F/scripts.inc ================================================ NavelRock_BasePath_B2F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B3F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B3F", "name": "NavelRock_BasePath_B3F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B3F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B2F", "dest_warp_id": "1" }, { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B4F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B3F/scripts.inc ================================================ NavelRock_BasePath_B3F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B4F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B4F", "name": "NavelRock_BasePath_B4F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B4F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B3F", "dest_warp_id": "1" }, { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B5F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B4F/scripts.inc ================================================ NavelRock_BasePath_B4F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B5F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B5F", "name": "NavelRock_BasePath_B5F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B5F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B4F", "dest_warp_id": "1" }, { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B6F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B5F/scripts.inc ================================================ NavelRock_BasePath_B5F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B6F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B6F", "name": "NavelRock_BasePath_B6F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B6F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B5F", "dest_warp_id": "1" }, { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B7F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B6F/scripts.inc ================================================ NavelRock_BasePath_B6F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B7F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B7F", "name": "NavelRock_BasePath_B7F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B7F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B6F", "dest_warp_id": "1" }, { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B8F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B7F/scripts.inc ================================================ NavelRock_BasePath_B7F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B8F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B8F", "name": "NavelRock_BasePath_B8F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B8F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B7F", "dest_warp_id": "1" }, { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B9F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B8F/scripts.inc ================================================ NavelRock_BasePath_B8F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_BasePath_B9F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_BASE_PATH_B9F", "name": "NavelRock_BasePath_B9F", "layout": "LAYOUT_NAVEL_ROCK_BASE_PATH_B9F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B8F", "dest_warp_id": "1" }, { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B10F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_BasePath_B9F/scripts.inc ================================================ NavelRock_BasePath_B9F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_Exterior/map.json ================================================ { "id": "MAP_NAVEL_ROCK_EXTERIOR", "name": "NavelRock_Exterior", "layout": "LAYOUT_NAVEL_ROCK_EXTERIOR", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 9, "y": 8, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_1F", "dest_warp_id": "1" }, { "x": 9, "y": 16, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_HARBOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_Exterior/scripts.inc ================================================ NavelRock_Exterior_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, NavelRock_Exterior_OnTransition .byte 0 NavelRock_Exterior_OnTransition:: setworldmapflag FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR end ================================================ FILE: data/maps/NavelRock_Fork/map.json ================================================ { "id": "MAP_NAVEL_ROCK_FORK", "name": "NavelRock_Fork", "layout": "LAYOUT_NAVEL_ROCK_FORK", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 13, "y": 95, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_B1F", "dest_warp_id": "1" }, { "x": 3, "y": 1, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_SUMMIT_PATH_2F", "dest_warp_id": "0" }, { "x": 26, "y": 1, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_BASE_PATH_B1F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_Fork/scripts.inc ================================================ NavelRock_Fork_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_Harbor/map.json ================================================ { "id": "MAP_NAVEL_ROCK_HARBOR", "name": "NavelRock_Harbor", "layout": "LAYOUT_ISLAND_HARBOR", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "x": 8, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NavelRock_Harbor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_EXTERIOR", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_Harbor/scripts.inc ================================================ NavelRock_Harbor_MapScripts:: .byte 0 NavelRock_Harbor_EventScript_Sailor:: lock faceplayer message Text_WhereDoYouWantToSail waitmessage setvar VAR_0x8004, SEAGALLOP_NAVEL_ROCK multichoice 20, 8, MULTICHOICE_SEAGALLOP_VERMILION, FALSE switch VAR_RESULT case 0, EventScript_SailToVermilionCity case 1, EventScript_CancelSail case 127, EventScript_CancelSail end ================================================ FILE: data/maps/NavelRock_Summit/map.json ================================================ { "id": "MAP_NAVEL_ROCK_SUMMIT", "name": "NavelRock_Summit", "layout": "LAYOUT_NAVEL_ROCK_SUMMIT", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_SHADE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HO_OH", "x": 9, "y": 6, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_HO_OH" } ], "warp_events": [ { "x": 10, "y": 18, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_SUMMIT_PATH_5F", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 9, "y": 12, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "NavelRock_Summit_EventScript_HoOh" } ], "bg_events": [ { "type": "hidden_item", "x": 9, "y": 11, "elevation": 3, "item": "ITEM_SACRED_ASH", "flag": "FLAG_HIDDEN_ITEM_NAVEL_ROCK_SUMMIT_SACRED_ASH", "quantity": 1, "underfoot": true } ], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_Summit/scripts.inc ================================================ .set LOCALID_HO_OH, 1 NavelRock_Summit_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, NavelRock_Summit_OnTransition map_script MAP_SCRIPT_ON_RESUME, NavelRock_Summit_OnResume .byte 0 NavelRock_Summit_OnTransition:: call_if_set FLAG_FOUGHT_HO_OH, NavelRock_Summit_EventScript_HideHoOh call_if_unset FLAG_FOUGHT_HO_OH, NavelRock_Summit_EventScript_TryShowHoOh end NavelRock_Summit_EventScript_HideHoOh:: setvar VAR_TEMP_1, 1 setflag FLAG_HIDE_HO_OH return NavelRock_Summit_EventScript_TryShowHoOh:: setvar VAR_TEMP_1, 1 goto_if_set FLAG_HO_OH_FLEW_AWAY, EventScript_Return setvar VAR_TEMP_1, 0 clearflag FLAG_HIDE_HO_OH return NavelRock_Summit_OnResume:: call_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, NavelRock_Summit_EventScript_TryRemoveHoOh end NavelRock_Summit_EventScript_TryRemoveHoOh:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return removeobject LOCALID_HO_OH return NavelRock_Summit_EventScript_HoOh:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lockall setvar VAR_TEMP_1, 1 special SpawnCameraObject setvar VAR_0x8004, 3 @ Num loops setvar VAR_0x8005, 35 @ Delay special LoopWingFlapSound applymovement LOCALID_HO_OH, Movement_HoOhAppear applymovement OBJ_EVENT_ID_CAMERA, Movement_CameraPanUp waitmovement 0 delay 50 setweather 0 doweather waitse playmoncry SPECIES_HO_OH, CRY_MODE_ENCOUNTER delay 30 waitmoncry delay 60 setvar VAR_0x8004, 3 @ Num loops setvar VAR_0x8005, 35 @ Delay special LoopWingFlapSound applymovement OBJ_EVENT_ID_CAMERA, Movement_CameraPanDown applymovement LOCALID_HO_OH, Movement_HoOhApproach waitmovement 0 special RemoveCameraObject seteventmon SPECIES_HO_OH, 70 setflag FLAG_SYS_SPECIAL_WILD_BATTLE special StartLegendaryBattle waitstate clearflag FLAG_SYS_SPECIAL_WILD_BATTLE setvar VAR_LAST_TALKED, LOCALID_HO_OH specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, NavelRock_Summit_EventScript_DefeatedHoOh goto_if_eq VAR_RESULT, B_OUTCOME_RAN, NavelRock_Summit_EventScript_RanFromHoOh goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, NavelRock_Summit_EventScript_RanFromHoOh setflag FLAG_FOUGHT_HO_OH releaseall end NavelRock_Summit_EventScript_DefeatedHoOh:: setflag FLAG_HO_OH_FLEW_AWAY setvar VAR_0x8004, SPECIES_HO_OH goto EventScript_MonFlewAway end NavelRock_Summit_EventScript_RanFromHoOh:: setvar VAR_0x8004, SPECIES_HO_OH goto EventScript_MonFlewAway end Movement_CameraPanUp: walk_up walk_up walk_up step_end Movement_CameraPanDown: delay_16 delay_16 walk_down walk_down walk_down step_end Movement_HoOhApproach: walk_down walk_down walk_down walk_down walk_down walk_in_place_down delay_16 delay_16 step_end Movement_HoOhAppear: delay_16 delay_16 walk_in_place_down walk_in_place_down walk_in_place_down walk_in_place_down step_end ================================================ FILE: data/maps/NavelRock_SummitPath_2F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_SUMMIT_PATH_2F", "name": "NavelRock_SummitPath_2F", "layout": "LAYOUT_NAVEL_ROCK_SUMMIT_PATH_2F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_FORK", "dest_warp_id": "1" }, { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_SUMMIT_PATH_3F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_SummitPath_2F/scripts.inc ================================================ NavelRock_SummitPath_2F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_SummitPath_3F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_SUMMIT_PATH_3F", "name": "NavelRock_SummitPath_3F", "layout": "LAYOUT_NAVEL_ROCK_SUMMIT_PATH_3F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_SUMMIT_PATH_2F", "dest_warp_id": "1" }, { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_SUMMIT_PATH_4F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_SummitPath_3F/scripts.inc ================================================ NavelRock_SummitPath_3F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_SummitPath_4F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_SUMMIT_PATH_4F", "name": "NavelRock_SummitPath_4F", "layout": "LAYOUT_NAVEL_ROCK_SUMMIT_PATH_4F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_SUMMIT_PATH_3F", "dest_warp_id": "1" }, { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_SUMMIT_PATH_5F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_SummitPath_4F/scripts.inc ================================================ NavelRock_SummitPath_4F_MapScripts:: .byte 0 ================================================ FILE: data/maps/NavelRock_SummitPath_5F/map.json ================================================ { "id": "MAP_NAVEL_ROCK_SUMMIT_PATH_5F", "name": "NavelRock_SummitPath_5F", "layout": "LAYOUT_NAVEL_ROCK_SUMMIT_PATH_5F", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_NAVEL_ROCK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_SUMMIT_PATH_4F", "dest_warp_id": "1" }, { "x": 4, "y": 4, "elevation": 3, "dest_map": "MAP_NAVEL_ROCK_SUMMIT", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/NavelRock_SummitPath_5F/scripts.inc ================================================ NavelRock_SummitPath_5F_MapScripts:: .byte 0 ================================================ FILE: data/maps/OneIsland/map.json ================================================ { "id": "MAP_ONE_ISLAND", "name": "OneIsland", "layout": "LAYOUT_ONE_ISLAND", "music": "MUS_DEWFORD", "region_map_section": "MAPSEC_ONE_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": 0, "map": "MAP_ONE_ISLAND_TREASURE_BEACH" }, { "direction": "right", "offset": -120, "map": "MAP_ONE_ISLAND_KINDLE_ROAD" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BILL", "in_connection": false, "x": 12, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_ONE_ISLAND_BILL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 16, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 13, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_EventScript_BaldingMan", "flag": "0" } ], "warp_events": [ { "x": 14, "y": 5, "elevation": 0, "dest_map": "MAP_ONE_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "0" }, { "x": 19, "y": 9, "elevation": 0, "dest_map": "MAP_ONE_ISLAND_HOUSE1", "dest_warp_id": "0" }, { "x": 8, "y": 11, "elevation": 0, "dest_map": "MAP_ONE_ISLAND_HOUSE2", "dest_warp_id": "0" }, { "x": 12, "y": 18, "elevation": 3, "dest_map": "MAP_ONE_ISLAND_HARBOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 14, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_EventScript_IslandSign" }, { "type": "sign", "x": 15, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_EventScript_PokemonNetCenterSign" } ], "level_scaling": "4" } ================================================ FILE: data/maps/OneIsland/scripts.inc ================================================ .equ LOCALID_BILL, 1 OneIsland_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, OneIsland_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, OneIsland_OnFrame .byte 0 OneIsland_OnTransition:: setworldmapflag FLAG_WORLD_MAP_ONE_ISLAND end OneIsland_OnFrame:: map_script_2 VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 2, OneIsland_EventScript_EnterOneIslandFirstTime .2byte 0 OneIsland_EventScript_EnterOneIslandFirstTime:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement OBJ_EVENT_ID_PLAYER, OneIsland_Movement_PlayerExitHarbor waitmovement 0 msgbox OneIsland_Text_BillLetsGoSeeCelio closemessage applymovement LOCALID_BILL, OneIsland_Movement_BillWalkToPokeCenter applymovement OBJ_EVENT_ID_PLAYER, OneIsland_Movement_PlayerWalkToPokeCenter waitmovement 0 opendoor 14, 5 waitdooranim applymovement LOCALID_BILL, OneIsland_Movement_BillEnterPokeCenter applymovement OBJ_EVENT_ID_PLAYER, OneIsland_Movement_PlayerEnterPokeCenter waitmovement 0 closedoor 14, 5 waitdooranim removeobject LOCALID_BILL setvar VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 3 warp MAP_ONE_ISLAND_POKEMON_CENTER_1F, 9, 9 waitstate releaseall end .macro walk_to_pokecenter walk_up walk_up walk_up walk_up walk_right walk_right walk_up walk_up walk_up walk_up walk_up .endm OneIsland_Movement_PlayerWalkToPokeCenter:: walk_up walk_to_pokecenter step_end OneIsland_Movement_PlayerEnterPokeCenter:: walk_up walk_up set_invisible step_end OneIsland_Movement_PlayerExitHarbor:: walk_up step_end OneIsland_Movement_BillWalkToPokeCenter:: walk_to_pokecenter walk_up step_end OneIsland_Movement_BillEnterPokeCenter:: walk_up set_invisible step_end OneIsland_EventScript_OldMan:: lock faceplayer goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, OneIsland_EventScript_OldManLinkHoenn goto_if_set FLAG_SEVII_DETOUR_FINISHED, OneIsland_EventScript_OldManLinkKanto msgbox OneIsland_Text_LuckyToHaveCelioHere release end OneIsland_EventScript_OldManLinkKanto:: msgbox OneIsland_Text_HavePCLinkageWithKanto release end OneIsland_EventScript_OldManLinkHoenn:: msgbox OneIsland_Text_HavePCLinkageWithHoenn release end OneIsland_EventScript_BaldingMan:: msgbox OneIsland_Text_IsntWarmClimateHereGreat, MSGBOX_NPC end OneIsland_EventScript_IslandSign:: msgbox OneIsland_Text_IslandSign, MSGBOX_SIGN end OneIsland_EventScript_PokemonNetCenterSign:: msgbox OneIsland_Text_PokemonNetCenterSign, MSGBOX_SIGN end ================================================ FILE: data/maps/OneIsland/text.inc ================================================ OneIsland_Text_BillLetsGoSeeCelio:: .string "BILL: Here we are!\n" .string "This is ONE ISLAND.\p" .string "There are several islands around\n" .string "here, and this is one of them.\p" .string "My friend CELIO sent the boat to\n" .string "fetch me here.\p" .string "He's in charge of the island's PC\n" .string "network by his lonesome.\p" .string "…Why am I telling you this now?\n" .string "Let's just go see CELIO!$" Text_WhereDoYouWantToSail:: .string "Ahoy, there!\n" .string "Where do you want to sail?$" OneIsland_Text_LuckyToHaveCelioHere:: .string "Here we are on an island smack in\n" .string "the middle of nowhere.\p" .string "We're lucky to have an upstanding\n" .string "young man like CELIO here.\p" .string "My granddaughter was in a tizzy\n" .string "over CELIO's friend.\p" .string "Something about a famous\n" .string "POKéMANIAC?\p" .string "I'm not sure what that means, but\n" .string "CELIO is quite the man!$" OneIsland_Text_HavePCLinkageWithKanto:: .string "My granddaughter was in a tizzy\n" .string "over a new breakthrough.\p" .string "She said we now have PC linkage\n" .string "with people in KANTO.\p" .string "I'm not sure what that means, but\n" .string "CELIO is quite the man!$" OneIsland_Text_HavePCLinkageWithHoenn:: .string "My granddaughter was in a tizzy\n" .string "over a new breakthrough.\p" .string "She said we finally have PC linkage\n" .string "with people in HOENN.\p" .string "I'm not sure what that means, but\n" .string "CELIO is quite the man.\p" .string "He would make a fine husband for\n" .string "my granddaughter!$" OneIsland_Text_IslandSign:: .string "ONE ISLAND\n" .string "Friends Gather at Knot Island$" OneIsland_Text_PokemonNetCenterSign:: .string "Expanding the POKéMON World!\n" .string "POKéMON NET CENTER$" OneIsland_Text_IsntWarmClimateHereGreat:: .string "Hi, sight-seeing, are you?\n" .string "Isn't the warm climate here great?$" ================================================ FILE: data/maps/OneIsland_Harbor/map.json ================================================ { "id": "MAP_ONE_ISLAND_HARBOR", "name": "OneIsland_Harbor", "layout": "LAYOUT_ISLAND_HARBOR", "music": "MUS_DEWFORD", "region_map_section": "MAPSEC_ONE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 8, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_Harbor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_ONE_ISLAND", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/OneIsland_Harbor/scripts.inc ================================================ OneIsland_Harbor_MapScripts:: map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, OneIsland_Harbor_OnWarp map_script MAP_SCRIPT_ON_FRAME_TABLE, OneIsland_Harbor_OnFrame .byte 0 OneIsland_Harbor_OnWarp:: map_script_2 VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 1, OneIsland_Harbor_EventScript_TurnPlayerNorth .2byte 0 OneIsland_Harbor_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end OneIsland_Harbor_OnFrame:: map_script_2 VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 1, OneIsland_Harbor_EventScript_PlayerEnterHarborFirstTime .2byte 0 OneIsland_Harbor_EventScript_PlayerEnterHarborFirstTime:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement OBJ_EVENT_ID_PLAYER, OneIsland_Harbor_Movement_PlayerExitHarbor waitmovement 0 setvar VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 2 warp MAP_ONE_ISLAND, 12, 18 waitstate releaseall end OneIsland_Harbor_Movement_PlayerExitHarbor:: walk_up walk_up walk_up step_end OneIsland_Harbor_EventScript_Sailor:: lock faceplayer message Text_WhereDoYouWantToSail waitmessage setvar VAR_0x8004, SEAGALLOP_ONE_ISLAND goto EventScript_ChooseDestFromOneIsland end ================================================ FILE: data/maps/OneIsland_House1/map.json ================================================ { "id": "MAP_ONE_ISLAND_HOUSE1", "name": "OneIsland_House1", "layout": "LAYOUT_HOUSE3", "music": "MUS_DEWFORD", "region_map_section": "MAPSEC_ONE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_House1_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 7, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_House1_EventScript_OldWoman", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_ONE_ISLAND", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/OneIsland_House1/scripts.inc ================================================ OneIsland_House1_MapScripts:: .byte 0 OneIsland_House1_EventScript_OldMan:: msgbox OneIsland_House1_Text_GazeUponVolcanoOnSunnyDays, MSGBOX_NPC end OneIsland_House1_EventScript_OldWoman:: msgbox OneIsland_House1_Text_LastTimeMtEmberErupted, MSGBOX_NPC end ================================================ FILE: data/maps/OneIsland_House1/text.inc ================================================ OneIsland_House1_Text_GazeUponVolcanoOnSunnyDays:: .string "On sunny days, I step out and gaze\n" .string "upon the volcano.\p" .string "That's my daily routine.$" OneIsland_House1_Text_LastTimeMtEmberErupted:: .string "Let me think… When was the last\n" .string "time MT. EMBER erupted?$" ================================================ FILE: data/maps/OneIsland_House2/map.json ================================================ { "id": "MAP_ONE_ISLAND_HOUSE2", "name": "OneIsland_House2", "layout": "LAYOUT_HOUSE3", "music": "MUS_DEWFORD", "region_map_section": "MAPSEC_ONE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 9, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_House2_EventScript_Lass", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_ONE_ISLAND", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/OneIsland_House2/scripts.inc ================================================ OneIsland_House2_MapScripts:: .byte 0 OneIsland_House2_EventScript_Lass:: msgbox OneIsland_House2_Text_IWantToStayHereForever, MSGBOX_NPC end ================================================ FILE: data/maps/OneIsland_House2/text.inc ================================================ OneIsland_House2_Text_IWantToStayHereForever:: .string "Young people all want to go off to\n" .string "big cities.\p" .string "But I want to stay here forever!$" ================================================ FILE: data/maps/OneIsland_KindleRoad/map.json ================================================ { "id": "MAP_ONE_ISLAND_KINDLE_ROAD", "name": "OneIsland_KindleRoad", "layout": "LAYOUT_ONE_ISLAND_KINDLE_ROAD", "music": "MUS_ROUTE120", "region_map_section": "MAPSEC_KINDLE_ROAD", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": 120, "map": "MAP_ONE_ISLAND" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 11, "y": 32, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "OneIsland_KindleRoad_EventScript_Maria", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_LAND", "in_connection": false, "x": 17, "y": 132, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "OneIsland_KindleRoad_EventScript_Abigail", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 7, "y": 39, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP", "movement_range_x": 6, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_KindleRoad_EventScript_Finn", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_LAND", "in_connection": false, "x": 19, "y": 79, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_KindleRoad_EventScript_Garrett", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 15, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EventScript_Tommy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 9, "y": 53, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 7, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_KindleRoad_EventScript_Sharon", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 18, "y": 105, "elevation": 4, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT", "movement_range_x": 1, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_KindleRoad_EventScript_Tanya", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 16, "y": 64, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_KindleRoad_EventScript_Shea", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 11, "y": 64, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_KindleRoad_EventScript_Hugh", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 11, "y": 89, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "OneIsland_KindleRoad_EventScript_Bryce", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 9, "y": 108, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_KindleRoad_EventScript_Claire", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 8, "y": 68, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_KindleRoad_EventScript_Mik", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 9, "y": 68, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_KindleRoad_EventScript_Kia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 8, "y": 104, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 11, "y": 95, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 12, "y": 96, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 10, "y": 95, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 9, "y": 105, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 15, "y": 75, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_19" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 9, "y": 84, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1A" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 15, "y": 74, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1B" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 15, "y": 73, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1C" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 18, "y": 111, "elevation": 4, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1D" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 10, "y": 86, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1E" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 9, "y": 110, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1F" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 18, "y": 112, "elevation": 4, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_11" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 15, "y": 70, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EventScript_ItemEther", "flag": "FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_ETHER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 103, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EventScript_ItemMaxRepel", "flag": "FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_MAX_REPEL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 18, "y": 114, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EventScript_ItemCarbos", "flag": "FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_CARBOS" } ], "warp_events": [ { "x": 11, "y": 6, "elevation": 3, "dest_map": "MAP_MT_EMBER_EXTERIOR", "dest_warp_id": "0" }, { "x": 12, "y": 6, "elevation": 3, "dest_map": "MAP_MT_EMBER_EXTERIOR", "dest_warp_id": "1" }, { "x": 15, "y": 58, "elevation": 3, "dest_map": "MAP_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA", "dest_warp_id": "0" }, { "x": 6, "y": 17, "elevation": 0, "dest_map": "MAP_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 11, "y": 68, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_AshWeatherTrigger" }, { "type": "trigger", "x": 10, "y": 68, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_AshWeatherTrigger" }, { "type": "trigger", "x": 14, "y": 114, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_DefaultWeatherTrigger" }, { "type": "trigger", "x": 15, "y": 113, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_DefaultWeatherTrigger" }, { "type": "trigger", "x": 13, "y": 114, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_DefaultWeatherTrigger" }, { "type": "trigger", "x": 12, "y": 115, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_DefaultWeatherTrigger" }, { "type": "trigger", "x": 11, "y": 116, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_DefaultWeatherTrigger" }, { "type": "trigger", "x": 10, "y": 115, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_DefaultWeatherTrigger" }, { "type": "trigger", "x": 9, "y": 116, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_DefaultWeatherTrigger" }, { "type": "trigger", "x": 20, "y": 116, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_DefaultWeatherTrigger" }, { "type": "trigger", "x": 21, "y": 117, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "OneIsland_KindleRoad_DefaultWeatherTrigger" } ], "bg_events": [ { "type": "sign", "x": 13, "y": 59, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_KindleRoad_EventScript_EmberSpaSign" }, { "type": "sign", "x": 8, "y": 115, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_KindleRoad_EventScript_RouteSign" }, { "type": "sign", "x": 9, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_KindleRoad_EventScript_GlassWorkshopSign" } ], "level_scaling": "4" } ================================================ FILE: data/maps/OneIsland_KindleRoad/scripts.inc ================================================ OneIsland_KindleRoad_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, OneIsland_KindleRoad_OnResume map_script MAP_SCRIPT_ON_LOAD, OneIsland_KindleRoad_AshWeatherLoad .byte 0 OneIsland_KindleRoad_OnResume: setstepcallback STEP_CB_ASH end OneIsland_KindleRoad_AshWeatherLoad: getplayerxy VAR_TEMP_1, VAR_RESULT goto_if_le VAR_RESULT, 60, OneIsland_KindleRoad_AshWeatherTrigger release end OneIsland_KindleRoad_AshWeatherTrigger:: setweather WEATHER_VOLCANIC_ASH doweather release end OneIsland_KindleRoad_DefaultWeatherTrigger:: resetweather doweather release end OneIsland_KindleRoad_EventScript_RouteSign:: msgbox OneIsland_KindleRoad_Text_RouteSign, MSGBOX_SIGN end OneIsland_KindleRoad_EventScript_EmberSpaSign:: msgbox OneIsland_KindleRoad_Text_EmberSpaSign, MSGBOX_SIGN end OneIsland_KindleRoad_EventScript_GlassWorkshopSign:: msgbox OneIsland_KindleRoad_Text_GlassWorkshopSign, MSGBOX_SIGN end OneIsland_KindleRoad_Text_GlassWorkshopSign: .string "GLASS WORKSHOP\n“Making Glass Items from Fallen Ash”$" ================================================ FILE: data/maps/OneIsland_KindleRoad/text.inc ================================================ OneIsland_KindleRoad_Text_MariaIntro:: .string "The weather's treacherous!\n" .string "Perfect for a battle!$" OneIsland_KindleRoad_Text_MariaDefeat:: .string "Aiyeeeeh!$" OneIsland_KindleRoad_Text_MariaPostBattle:: .string "Please don't splash my face!\n" .string "You'll ruin the makeup.$" OneIsland_KindleRoad_Text_AbigailIntro:: .string "I'm beginning to get a sunburn…$" OneIsland_KindleRoad_Text_AbigailDefeat:: .string "Oh, you're so awful.$" OneIsland_KindleRoad_Text_AbigailPostBattle:: .string "I like that cap you have.\n" .string "Maybe I should wear one, too…$" OneIsland_KindleRoad_Text_FinnIntro:: .string "Seen from here, MT. EMBER towers\n" .string "into the sky.$" OneIsland_KindleRoad_Text_FinnDefeat:: .string "Well, aren't you tough?$" OneIsland_KindleRoad_Text_FinnPostBattle:: .string "The sky is immense around these\n" .string "parts.$" OneIsland_KindleRoad_Text_GarrettIntro:: .string "I took a break from swimming,\n" .string "only to have you challenge me?$" OneIsland_KindleRoad_Text_GarrettDefeat:: .string "Hey, what the…\n" .string "You're good, you!$" OneIsland_KindleRoad_Text_GarrettPostBattle:: .string "Instead of using SURF all the time,\n" .string "you should swim some.$" OneIsland_KindleRoad_Text_TommyIntro:: .string "Wait! Wait a second!\n" .string "I think I've hooked a big one!$" OneIsland_KindleRoad_Text_TommyDefeat:: .string "I've lost it all again…$" OneIsland_KindleRoad_Text_TommyPostBattle:: .string "Not only did I lose, the big one\n" .string "got away from me, too!$" OneIsland_KindleRoad_Text_SharonIntro:: .string "Could you help me out with my\n" .string "training?$" OneIsland_KindleRoad_Text_SharonDefeat:: .string "You were a cut above me.$" OneIsland_KindleRoad_Text_SharonPostBattle:: .string "It's clear that you're skilled.\n" .string "I like you!$" OneIsland_KindleRoad_Text_TanyaIntro:: .string "There isn't a day in which we don't\n" .string "train!$" OneIsland_KindleRoad_Text_TanyaDefeat:: .string "I'm such a fool!$" OneIsland_KindleRoad_Text_TanyaPostBattle:: .string "I'll train even harder from now on!$" OneIsland_KindleRoad_Text_SheaIntro:: .string "Every morning, before breakfast,\n" .string "I swim around this island.$" OneIsland_KindleRoad_Text_SheaDefeat:: .string "Gasp…\n" .string "Gasp…$" OneIsland_KindleRoad_Text_SheaPostBattle:: .string "I lost because I'm pooped from all\n" .string "the running I did…$" OneIsland_KindleRoad_Text_HughIntro:: .string "Dress appropriately for battle!\n" .string "Lose that frivolous outfit!$" OneIsland_KindleRoad_Text_HughDefeat:: .string "Why me?!$" OneIsland_KindleRoad_Text_HughPostBattle:: .string "Even martial artists are becoming\n" .string "fashion conscious these days…$" OneIsland_KindleRoad_Text_BryceIntro:: .string "You know, everything tastes great\n" .string "when you're out in the wild.$" OneIsland_KindleRoad_Text_BryceDefeat:: .string "Awww, blown!$" OneIsland_KindleRoad_Text_BrycePostBattle:: .string "The water in volcanic regions is\n" .string "delicious.$" OneIsland_KindleRoad_Text_ClaireIntro:: .string "My lunch filled us up, so will you\n" .string "battle us for some exercise?$" OneIsland_KindleRoad_Text_ClaireDefeat:: .string "That made me all sweaty.$" OneIsland_KindleRoad_Text_ClairePostBattle:: .string "What should I do?\n" .string "I feel famished again.$" OneIsland_KindleRoad_Text_KiaIntro:: .string "KIA: My big brother and I make\n" .string "an awesome combination!$" OneIsland_KindleRoad_Text_KiaDefeat:: .string "KIA: Huh?!\n" .string "I can't believe it!$" OneIsland_KindleRoad_Text_KiaPostBattle:: .string "KIA: How could there be anyone\n" .string "better than my big brother?$" OneIsland_KindleRoad_Text_KiaNotEnoughMons:: .string "KIA: If you want to battle with\n" .string "us, you have to bring at least two\l" .string "POKéMON with you.$" OneIsland_KindleRoad_Text_MikIntro:: .string "MIK: Together with KIA, I'm afraid\n" .string "of nothing!$" OneIsland_KindleRoad_Text_MikDefeat:: .string "MIK: Whoa!\n" .string "That's too much!$" OneIsland_KindleRoad_Text_MikPostBattle:: .string "MIK: How could my combination\n" .string "with KIA fail?$" OneIsland_KindleRoad_Text_MikNotEnoughMons:: .string "MIK: Hey, do you want to battle\n" .string "with us two?\p" .string "Bring two or more POKéMON with\n" .string "you, then.$" OneIsland_KindleRoad_Text_RouteSign:: .string "This is KINDLE ROAD.\p" .string "Go straight for MT. EMBER.$" OneIsland_KindleRoad_Text_EmberSpaSign:: .string "Light the Fire in Your Heart!\n" .string "EMBER SPA$" ================================================ FILE: data/maps/OneIsland_KindleRoad_EmberSpa/map.json ================================================ { "id": "MAP_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA", "name": "OneIsland_KindleRoad_EmberSpa", "layout": "LAYOUT_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA", "music": "MUS_DEWFORD", "region_map_section": "MAPSEC_EMBER_SPA", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 11, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EmberSpa_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 15, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EmberSpa_EventScript_BaldingMan1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 6, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EmberSpa_EventScript_BlackBelt", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 20, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EmberSpa_EventScript_OldWoman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 10, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EmberSpa_EventScript_RockSmashMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 11, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_EmberSpa_EventScript_BaldingMan2", "flag": "0" } ], "warp_events": [ { "x": 13, "y": 36, "elevation": 3, "dest_map": "MAP_ONE_ISLAND_KINDLE_ROAD", "dest_warp_id": "2" } ], "coord_events": [ { "type": "trigger", "x": 13, "y": 13, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "OneIsland_KindleRoad_EmberSpa_EventScript_SpaHeal" } ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/OneIsland_KindleRoad_EmberSpa/scripts.inc ================================================ OneIsland_KindleRoad_EmberSpa_MapScripts:: .byte 0 OneIsland_KindleRoad_EmberSpa_EventScript_OldMan:: msgbox OneIsland_KindleRoad_EmberSpa_Text_WaterWarmsMeToCore, MSGBOX_NPC end OneIsland_KindleRoad_EmberSpa_EventScript_BaldingMan1:: msgbox OneIsland_KindleRoad_EmberSpa_Text_EnjoyBowlOfChowder, MSGBOX_NPC end OneIsland_KindleRoad_EmberSpa_EventScript_BaldingMan2:: msgbox OneIsland_KindleRoad_EmberSpa_Text_HotSpringIsTherapeutic, MSGBOX_NPC end OneIsland_KindleRoad_EmberSpa_EventScript_OldWoman:: msgbox OneIsland_KindleRoad_EmberSpa_Text_SeeHowSmoothMySkinIs, MSGBOX_NPC end OneIsland_KindleRoad_EmberSpa_EventScript_BlackBelt:: lock faceplayer famechecker FAMECHECKER_BRUNO, 3 msgbox OneIsland_KindleRoad_EmberSpa_Text_BrunoVisitsSpaOnOccasion release end OneIsland_KindleRoad_EmberSpa_EventScript_RockSmashMan:: lock faceplayer goto_if_set FLAG_GOT_HM06, OneIsland_KindleRoad_EmberSpa_EventScript_AlreadyGotHM06 msgbox OneIsland_KindleRoad_EmberSpa_Text_UsedThisToMakeEmberSpa giveitem ITEM_HM06 setflag FLAG_GOT_HM06 msgbox OneIsland_KindleRoad_EmberSpa_Text_ExplainHM06 release end OneIsland_KindleRoad_EmberSpa_EventScript_AlreadyGotHM06:: msgbox OneIsland_KindleRoad_EmberSpa_Text_ExplainHM06 release end OneIsland_KindleRoad_EmberSpa_EventScript_SpaHeal:: lockall fadescreen FADE_TO_WHITE special HealPlayerParty fadescreen FADE_FROM_WHITE msgbox OneIsland_KindleRoad_EmberSpa_Text_WaterExquisiteFullyRefreshed setvar VAR_TEMP_1, 1 releaseall end ================================================ FILE: data/maps/OneIsland_KindleRoad_EmberSpa/text.inc ================================================ OneIsland_KindleRoad_EmberSpa_Text_WaterWarmsMeToCore:: .string "Hm!\n" .string "Haaaaaaaaaaah!\p" .string "Aaaah! This is heavenly!\n" .string "The water warms me to my core!\p" .string "You should jump in, too.\p" .string "Go to the middle, relax, and get\n" .string "good and warm!$" OneIsland_KindleRoad_EmberSpa_Text_EnjoyBowlOfChowder:: .string "My favorite part of bathing comes\n" .string "up right after this.\p" .string "I enjoy a bowl of chowder to\n" .string "warm me from the inside, too!$" OneIsland_KindleRoad_EmberSpa_Text_WaterExquisiteFullyRefreshed:: .string "The water is perfectly warm.\n" .string "It feels exquisite…\p" .string "{PLAYER} and the POKéMON were\n" .string "fully refreshed!$" OneIsland_KindleRoad_EmberSpa_Text_HotSpringIsTherapeutic:: .string "Soaking in a hot spring pool is\n" .string "therapeutic, people say.$" OneIsland_KindleRoad_EmberSpa_Text_SeeHowSmoothMySkinIs:: .string "Have a look at my face.\n" .string "See how smooth my skin is?\p" .string "The hot spring's water keeps my\n" .string "skin younger than my age.$" OneIsland_KindleRoad_EmberSpa_Text_BrunoVisitsSpaOnOccasion:: .string "After an honest day of training,\n" .string "nothing beats a relaxing soak in\l" .string "the hot spring pool.\p" .string "BRUNO, who's a senior ahead of me,\n" .string "visits the SPA on occasion.\p" .string "He comes to rehab injuries, both\n" .string "his own and his POKéMON's.$" OneIsland_KindleRoad_EmberSpa_Text_UsedThisToMakeEmberSpa:: .string "Hot springs go hand-in-hand with\n" .string "volcanoes.\p" .string "The EMBER SPA here, well,\n" .string "I made it years ago.\p" .string "I hewed the pool right out of a\n" .string "gigantic boulder by hand.\p" .string "I was using this at the time.\n" .string "I suppose I can part with it.$" OneIsland_KindleRoad_EmberSpa_Text_ExplainHM06:: .string "That shatters boulders as if they\n" .string "were made of crackers.$" ================================================ FILE: data/maps/OneIsland_KindleRoad_GlassWorkshop/map.json ================================================ { "id": "MAP_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP", "name": "OneIsland_KindleRoad_GlassWorkshop", "layout": "LAYOUT_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP", "music": "MUS_DEWFORD", "region_map_section": "MAPSEC_KINDLE_ROAD", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 3, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_GlassWorkshop_EventScript_GlassWorker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_DOWN_AND_UP", "movement_range_x": 0, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_GlassWorkshop_EventScript_NinjaBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 9, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_KindleRoad_GlassWorkshop_EventScript_Girl", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 0, "dest_map": "MAP_ONE_ISLAND_KINDLE_ROAD", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 7, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_KindleRoad_GlassWorkshop_EventScript_Sign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/OneIsland_KindleRoad_GlassWorkshop/scripts.inc ================================================ OneIsland_KindleRoad_GlassWorkshop_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, OneIsland_KindleRoad_GlassWorkshop_OnTransition .byte 0 .set BLUE_FLUTE_PRICE, 250 .set YELLOW_FLUTE_PRICE, 500 .set RED_FLUTE_PRICE, 500 .set WHITE_FLUTE_PRICE, 1000 .set BLACK_FLUTE_PRICE, 1000 .set LOWEST_ASH_PRICE, BLUE_FLUTE_PRICE OneIsland_KindleRoad_GlassWorkshop_OnTransition: compare VAR_GLASS_WORKSHOP_STATE, 1 call_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ReenterWorkshopAfterSootSack end OneIsland_KindleRoad_GlassWorkshop_EventScript_ReenterWorkshopAfterSootSack:: setvar VAR_GLASS_WORKSHOP_STATE, 2 return OneIsland_KindleRoad_GlassWorkshop_EventScript_GlassWorker:: lock faceplayer compare VAR_GLASS_WORKSHOP_STATE, 10 goto_if_ge OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveItemAfterNoRoom compare VAR_GLASS_WORKSHOP_STATE, 2 goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_CheckCollectedAsh compare VAR_GLASS_WORKSHOP_STATE, 1 goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ExplainSootSack msgbox OneIsland_KindleRoad_GlassWorkshop_Text_GoCollectAshWithThis, MSGBOX_DEFAULT giveitem ITEM_SOOT_SACK setvar VAR_GLASS_WORKSHOP_STATE, 1 msgbox OneIsland_KindleRoad_GlassWorkshop_Text_ExplainSootSack, MSGBOX_DEFAULT release end OneIsland_KindleRoad_GlassWorkshop_EventScript_ExplainSootSack:: msgbox OneIsland_KindleRoad_GlassWorkshop_Text_ExplainSootSack, MSGBOX_DEFAULT release end OneIsland_KindleRoad_GlassWorkshop_EventScript_CheckCollectedAsh:: checkitem ITEM_SOOT_SACK, 1 compare VAR_RESULT, FALSE goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_SootSackNotInBag msgbox OneIsland_KindleRoad_GlassWorkshop_Text_LetsSeeCollectedAshes, MSGBOX_DEFAULT compare VAR_ASH_GATHER_COUNT, LOWEST_ASH_PRICE goto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAsh message OneIsland_KindleRoad_GlassWorkshop_Text_WhichGlassItemWoudYouLike waitmessage goto OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseGlassItem end OneIsland_KindleRoad_GlassWorkshop_EventScript_SootSackNotInBag:: msgbox OneIsland_KindleRoad_GlassWorkshop_Text_HaventGotYourSootSack, MSGBOX_DEFAULT release end OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseGlassItem:: multichoice 13, 0, MULTICHOICE_GLASS_WORKSHOP_VENDOR, FALSE copyvar VAR_0x8009, VAR_RESULT switch VAR_RESULT case 0, OneIsland_KindleRoad_GlassWorkshop_EventScript_BlueFlute case 1, OneIsland_KindleRoad_GlassWorkshop_EventScript_YellowFlute case 2, OneIsland_KindleRoad_GlassWorkshop_EventScript_RedFlute case 3, OneIsland_KindleRoad_GlassWorkshop_EventScript_WhiteFlute case 4, OneIsland_KindleRoad_GlassWorkshop_EventScript_BlackFlute case 5, OneIsland_KindleRoad_GlassWorkshop_EventScript_CancelGlassItemSelect case 127, OneIsland_KindleRoad_GlassWorkshop_EventScript_CancelGlassItemSelect end OneIsland_KindleRoad_GlassWorkshop_EventScript_BlueFlute:: setvar VAR_0x8008, ITEM_BLUE_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 setvar VAR_0x800A, BLUE_FLUTE_PRICE compare VAR_ASH_GATHER_COUNT, BLUE_FLUTE_PRICE goto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem msgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem setvar VAR_GLASS_WORKSHOP_STATE, 10 subvar VAR_ASH_GATHER_COUNT, BLUE_FLUTE_PRICE goto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem end OneIsland_KindleRoad_GlassWorkshop_EventScript_YellowFlute:: setvar VAR_0x8008, ITEM_YELLOW_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 setvar VAR_0x800A, YELLOW_FLUTE_PRICE compare VAR_ASH_GATHER_COUNT, YELLOW_FLUTE_PRICE goto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem msgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem setvar VAR_GLASS_WORKSHOP_STATE, 11 subvar VAR_ASH_GATHER_COUNT, YELLOW_FLUTE_PRICE goto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem end OneIsland_KindleRoad_GlassWorkshop_EventScript_RedFlute:: setvar VAR_0x8008, ITEM_RED_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 setvar VAR_0x800A, RED_FLUTE_PRICE compare VAR_ASH_GATHER_COUNT, RED_FLUTE_PRICE goto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem msgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem setvar VAR_GLASS_WORKSHOP_STATE, 12 subvar VAR_ASH_GATHER_COUNT, RED_FLUTE_PRICE goto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem end OneIsland_KindleRoad_GlassWorkshop_EventScript_WhiteFlute:: setvar VAR_0x8008, ITEM_WHITE_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 setvar VAR_0x800A, WHITE_FLUTE_PRICE compare VAR_ASH_GATHER_COUNT, WHITE_FLUTE_PRICE goto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem msgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem setvar VAR_GLASS_WORKSHOP_STATE, 13 subvar VAR_ASH_GATHER_COUNT, WHITE_FLUTE_PRICE goto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem end OneIsland_KindleRoad_GlassWorkshop_EventScript_BlackFlute:: setvar VAR_0x8008, ITEM_BLACK_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 setvar VAR_0x800A, BLACK_FLUTE_PRICE compare VAR_ASH_GATHER_COUNT, BLACK_FLUTE_PRICE goto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem msgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem setvar VAR_GLASS_WORKSHOP_STATE, 14 subvar VAR_ASH_GATHER_COUNT, BLACK_FLUTE_PRICE goto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem end OneIsland_KindleRoad_GlassWorkshop_EventScript_CancelGlassItemSelect:: msgbox OneIsland_KindleRoad_GlassWorkshop_Text_AllThatAshButDontWantAnything, MSGBOX_DEFAULT release end OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAsh:: setvar VAR_0x800A, LOWEST_ASH_PRICE subvar VAR_0x800A, VAR_ASH_GATHER_COUNT buffernumberstring STR_VAR_1, VAR_0x800A msgbox OneIsland_KindleRoad_GlassWorkshop_Text_NotEnoughAshNeedX, MSGBOX_DEFAULT release end OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem:: subvar VAR_0x800A, VAR_ASH_GATHER_COUNT buffernumberstring STR_VAR_2, VAR_0x800A message OneIsland_KindleRoad_GlassWorkshop_Text_NotEnoughAshToMakeItem waitmessage goto OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseGlassItem end OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem:: message OneIsland_KindleRoad_GlassWorkshop_Text_WhichWouldYouLike waitmessage goto OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseGlassItem end OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem:: msgbox OneIsland_KindleRoad_GlassWorkshop_Text_IllMakeItemForYou, MSGBOX_DEFAULT closemessage fadescreen FADE_TO_BLACK playse SE_GLASS_FLUTE delay 30 fadescreen FADE_FROM_BLACK msgbox OneIsland_KindleRoad_GlassWorkshop_Text_IveFinishedGlassItem, MSGBOX_DEFAULT call OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveGlassFlute setvar VAR_GLASS_WORKSHOP_STATE, 2 release end OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveGlassFlute:: switch VAR_0x8008 case ITEM_BLUE_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveBlueFlute case ITEM_YELLOW_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveYellowFlute case ITEM_RED_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveRedFlute case ITEM_WHITE_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveWhiteFlute case ITEM_BLACK_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveBlackFlute return OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveBlueFlute: giveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_BLUE_FLUTE compare VAR_RESULT, FALSE goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute return OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveYellowFlute: giveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_YELLOW_FLUTE compare VAR_RESULT, FALSE goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute return OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveRedFlute: giveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_RED_FLUTE compare VAR_RESULT, FALSE goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute return OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveWhiteFlute: giveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_WHITE_FLUTE compare VAR_RESULT, FALSE goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute return OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveBlackFlute: giveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_BLACK_FLUTE compare VAR_RESULT, FALSE goto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute return OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute:: call EventScript_BagIsFull msgbox OneIsland_KindleRoad_GlassWorkshop_Text_NoRoomInBag, MSGBOX_DEFAULT release end OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveItemAfterNoRoom:: switch VAR_GLASS_WORKSHOP_STATE case 10, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveBlueFlute case 11, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveYellowFlute case 12, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveRedFlute case 13, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveWhiteFlute case 14, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveBlackFlute end OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveBlueFlute:: setvar VAR_0x8008, ITEM_BLUE_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 goto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain end OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveYellowFlute:: setvar VAR_0x8008, ITEM_YELLOW_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 goto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain end OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveRedFlute:: setvar VAR_0x8008, ITEM_RED_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 goto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain end OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveWhiteFlute:: setvar VAR_0x8008, ITEM_WHITE_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 goto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain end OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveBlackFlute:: setvar VAR_0x8008, ITEM_BLACK_FLUTE bufferitemname STR_VAR_1, VAR_0x8008 goto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain end OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain:: msgbox OneIsland_KindleRoad_GlassWorkshop_Text_IveFinishedGlassItem, MSGBOX_DEFAULT call_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveGlassFlute setvar VAR_GLASS_WORKSHOP_STATE, 2 release end OneIsland_KindleRoad_GlassWorkshop_EventScript_NinjaBoy:: msgbox OneIsland_KindleRoad_GlassWorkshop_Text_FunToBlowGlassFlute, MSGBOX_NPC end OneIsland_KindleRoad_GlassWorkshop_EventScript_Girl:: msgbox OneIsland_KindleRoad_GlassWorkshop_Text_Girl, MSGBOX_NPC end OneIsland_KindleRoad_GlassWorkshop_EventScript_Sign:: msgbox OneIsland_KindleRoad_GlassWorkshop_Text_Sign, MSGBOX_SIGN end OneIsland_KindleRoad_GlassWorkshop_Text_GoCollectAshWithThis: .string "This area is covered in volcanic ash,\n" .string "huff-puff!\p" .string "I'm specially gifted, huff-puff.\p" .string "I make glass out of volcanic ash\n" .string "and make items, huff-puff.\p" .string "Go collect ashes with this,\nhuff-puff.$" OneIsland_KindleRoad_GlassWorkshop_Text_ExplainSootSack: .string "Just take that SOOT SACK and walk\n" .string "through piles of ash, huff-puff.\p" .string "And it will fill up with the\nvolcanic ash," .string " huff-puff.\p" .string "Once you think you've collected a\ngood" .string " amount, come back, huff-puff.$" OneIsland_KindleRoad_GlassWorkshop_Text_LetsSeeCollectedAshes: .string "Have you collected ashes, huff-puff?\n" .string "Let me see, huff-puff.$" OneIsland_KindleRoad_GlassWorkshop_Text_NotEnoughAshNeedX: .string "Hmmm…\n" .string "There's not enough here, huff-puff.\l" .string "I can't craft with this, huff-puff.\p" .string "Let's see… {STR_VAR_1} is the number of\nsteps" .string " you'll need to walk for me\lto make you" .string " a BLUE FLUTE, huff-puff.$" OneIsland_KindleRoad_GlassWorkshop_Text_WhichGlassItemWoudYouLike: .string "Oh! You've got a lot of ashes,\n" .string "huff-puff!\p" .string "I'll make you something, huff-puff!\n" .string "Which one would you like, huff-puff?$" OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou: .string "A {STR_VAR_1}, huff-puff?\n" .string "Is that the one for you, huff-puff?$" OneIsland_KindleRoad_GlassWorkshop_Text_WhichWouldYouLike: .string "Which one would you like, huff-puff?$" OneIsland_KindleRoad_GlassWorkshop_Text_IllMakeItemForYou: .string "A {STR_VAR_1} it is, then,\nhuff-puff!\p" .string "Okay! I'll make it now, huff-puff.\n" .string "Just wait a little while, huff-puff.$" OneIsland_KindleRoad_GlassWorkshop_Text_NotEnoughAshToMakeItem: .string "A {STR_VAR_1}, huff-puff?\p" .string "There's not enough ash here to make\n" .string "that, though, huff-puff.\p" .string "Let's see… {STR_VAR_2} is the number of\nsteps " .string "you'll need to walk through\lvolcanic ash " .string "for me to make that,\lhuff-puff.\p" .string "Which item would you rather have\n" .string "me make instead, huff-puff?$" OneIsland_KindleRoad_GlassWorkshop_Text_AllThatAshButDontWantAnything: .string "You've collected all that ash, but\nyou " .string "don't want anything, huff-puff?$" OneIsland_KindleRoad_GlassWorkshop_Text_IveFinishedGlassItem: .string "Ah, I've finished your {STR_VAR_1}.\n" .string "Take it, huff-puff.$" OneIsland_KindleRoad_GlassWorkshop_Text_NoRoomInBag: .string "Oh?\n" .string "You've no room in your BAG, huff-puff.\p" .string "I'll hold on to it, so come back later,\n" .string "huff-puff.$" OneIsland_KindleRoad_GlassWorkshop_Text_HaventGotYourSootSack: .string "Hah? You haven't got your SOOT SACK\n" .string "with you, huff-puff.\p" .string "You have to keep it with you to collect\n" .string "volcanic ash, huff-puff.$" OneIsland_KindleRoad_GlassWorkshop_Text_FunToBlowGlassFlute: .string "I'm an apprentice learning how to\n" .string "make glass items from ash.\p" .string "Did you know that the BLUE FLUTE\n" .string "wakes up POKéMON who hear it?\p" .string "But, to me, the nicest-sounding\n" .string "flute that wakes up sleeping\l" .string "POKéMON is the POKé FLUTE!\p" .string "…I wonder if I'll ever learn to make\n" .string "one of those.$" OneIsland_KindleRoad_GlassWorkshop_Text_Girl: .string "My uncle makes glass stuff too!\n" .string "He lives far away, huff-puff.\p" .string "I saw a dizzy, spotted POKéMON when\n" .string "we went to visit him, huff-puff!$" OneIsland_KindleRoad_GlassWorkshop_Text_Sign: .string "“Available Glass Items,”\n" .string "the sign says.\p" .string "BLUE FLUTE: Awakens a sleeping\n" .string "POKéMON.\p" .string "YELLOW FLUTE: Snaps a POKéMON\nout " .string "of confusion.\p" .string "RED FLUTE: Snaps a POKéMON\nout " .string "of infatuation.\p" .string "WHITE FLUTE: Makes wild POKéMON\n" .string "appear more frequently.\p" .string "BLACK FLUTE: Makes wild POKéMON\n" .string "appear less frequently.$" OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute: .string "{PLAYER} received the\n{STR_VAR_1}!$" ================================================ FILE: data/maps/OneIsland_PokemonCenter_1F/map.json ================================================ { "id": "MAP_ONE_ISLAND_POKEMON_CENTER_1F", "name": "OneIsland_PokemonCenter_1F", "layout": "LAYOUT_ONE_ISLAND_POKEMON_CENTER_1F", "music": "MUS_NET_CENTER", "region_map_section": "MAPSEC_ONE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 5, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BILL", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_PokemonCenter_1F_EventScript_Bill", "flag": "FLAG_HIDE_ONE_ISLAND_POKECENTER_BILL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CELIO", "in_connection": false, "x": 15, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_PokemonCenter_1F_EventScript_Celio", "flag": "FLAG_HIDE_ONE_ISLAND_POKECENTER_CELIO" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 6, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_PokemonCenter_1F_EventScript_LittleBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 3, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_PokemonCenter_1F_EventScript_Hiker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_PokemonCenter_1F_EventScript_BattleGirl", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SCOTT", "in_connection": false, "x": 15, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_PokemonCenter_1F_EventScript_Scott", "flag": "FLAG_HIDE_SCOTT" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 9, "y": 9, "elevation": 3, "dest_map": "MAP_ONE_ISLAND", "dest_warp_id": "0" }, { "x": 1, "y": 5, "elevation": 4, "dest_map": "MAP_ONE_ISLAND_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 12, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F", "var_value": "2", "script": "OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerTop" }, { "type": "trigger", "x": 12, "y": 7, "elevation": 3, "var": "VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F", "var_value": "2", "script": "OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerMidTop" }, { "type": "trigger", "x": 12, "y": 8, "elevation": 3, "var": "VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F", "var_value": "2", "script": "OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerMidBottom" }, { "type": "trigger", "x": 12, "y": 9, "elevation": 3, "var": "VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F", "var_value": "2", "script": "OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerBottom" }, { "type": "trigger", "x": 9, "y": 9, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ { "type": "sign", "x": 12, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_PokemonCenter_1F_EventScript_NetworkMachine" }, { "type": "sign", "x": 12, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_PokemonCenter_1F_EventScript_NetworkMachine" }, { "type": "sign", "x": 12, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_PokemonCenter_1F_EventScript_NetworkMachine" }, { "type": "sign", "x": 12, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_PokemonCenter_1F_EventScript_NetworkMachine" }, { "type": "sign", "x": 13, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_PokemonCenter_1F_EventScript_NetworkMachine" }, { "type": "sign", "x": 15, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_PokemonCenter_1F_EventScript_NetworkMachine" }, { "type": "sign", "x": 14, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_PokemonCenter_1F_EventScript_NetworkMachine" }, { "type": "sign", "x": 16, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_PokemonCenter_1F_EventScript_NetworkMachine" }, { "type": "sign", "x": 17, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "OneIsland_PokemonCenter_1F_EventScript_NetworkMachine" } ], "level_scaling": "0" } ================================================ FILE: data/maps/OneIsland_PokemonCenter_1F/scripts.inc ================================================ .equ LOCALID_BILL, 3 .equ LOCALID_CELIO, 4 .equ LOCALID_SCOTT, 8 OneIsland_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, OneIsland_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, OneIsland_PokemonCenter_1F_OnLoad map_script MAP_SCRIPT_ON_FRAME_TABLE, OneIsland_PokemonCenter_1F_OnFrame .byte 0 OneIsland_PokemonCenter_1F_OnLoad:: call_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, OneIsland_PokemonCenter_1F_EventScript_SetRubyMetatile call_if_set FLAG_SYS_CAN_LINK_WITH_RS, OneIsland_PokemonCenter_1F_EventScript_SetNetworkMachineOn goto PokemonCenter_1F_OnLoad end OneIsland_PokemonCenter_1F_EventScript_SetRubyMetatile:: setmetatile 13, 4, METATILE_PokemonCenter_NetworkMachine_Ruby, 1 return OneIsland_PokemonCenter_1F_EventScript_SetSapphireMetatile:: setmetatile 16, 4, METATILE_PokemonCenter_NetworkMachine_Sapphire, 1 return OneIsland_PokemonCenter_1F_EventScript_SetNetworkMachineOn:: call OneIsland_PokemonCenter_1F_EventScript_SetSapphireMetatile setmetatile 14, 4, METATILE_PokemonCenter_NetworkMachine_ScreenLeft_On, 1 setmetatile 15, 4, METATILE_PokemonCenter_NetworkMachine_ScreenRight_On, 1 return OneIsland_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_ONE_ISLAND call_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 6, OneIsland_PokemonCenter_1F_EventScript_SetCelioQuestDone call_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 0, OneIsland_PokemonCenter_1F_EventScript_SetBillCelioFirstMeetingPos call_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 2, OneIsland_PokemonCenter_1F_EventScript_SetBillCelioReadyToLeavePos end OneIsland_PokemonCenter_1F_EventScript_SetCelioQuestDone:: setvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 7 return OneIsland_PokemonCenter_1F_EventScript_SetBillCelioFirstMeetingPos:: setobjectxyperm LOCALID_BILL, 9, 8 setobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_UP setobjectxyperm LOCALID_CELIO, 15, 6 setobjectmovementtype LOCALID_CELIO, MOVEMENT_TYPE_FACE_UP return OneIsland_PokemonCenter_1F_EventScript_SetBillCelioReadyToLeavePos:: setobjectxyperm LOCALID_BILL, 14, 7 setobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_LEFT setobjectxyperm LOCALID_CELIO, 14, 8 setobjectmovementtype LOCALID_CELIO, MOVEMENT_TYPE_FACE_LEFT return OneIsland_PokemonCenter_1F_OnFrame:: map_script_2 VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 0, OneIsland_PokemonCenter_1F_EventScript_MeetCelioScene .2byte 0 OneIsland_PokemonCenter_1F_EventScript_MeetCelioScene:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToCelio applymovement LOCALID_BILL, OneIsland_PokemonCenter_1F_Movement_BillWalkToCelio waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_BillHeyThereCelio applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 playse SE_PIN applymovement LOCALID_CELIO, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement LOCALID_CELIO, Common_Movement_Delay48 waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_CelioCantBelieveYouCameOut msgbox OneIsland_PokemonCenter_1F_Text_BillHowsYourResearchComing applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_ThisIsMyBuddyCelio applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterRight waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 call_if_set FLAG_SYS_GAME_CLEAR, OneIsland_PokemonCenter_1F_EventScript_IntroducePlayerChamp call_if_unset FLAG_SYS_GAME_CLEAR, OneIsland_PokemonCenter_1F_EventScript_IntroducePlayerNotChamp applymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_CelioThatsReallyImpressive msgbox OneIsland_PokemonCenter_1F_Text_BillBringMeUpToSpeed applymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_CelioPCsCantLinkWithYours closemessage applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_BillLetMeHelpYou applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_CanYouDeliverThisMeteoritePlayer msgreceiveditem OneIsland_PokemonCenter_1F_Text_AcceptedMeteoriteFromBill, ITEM_METEORITE, 1, MUS_OBTAIN_KEY_ITEM additem ITEM_METEORITE applymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_CelioPleaseTakeThis giveitem_msg OneIsland_PokemonCenter_1F_Text_ObtainedTriPass, ITEM_TRI_PASS, 1, MUS_OBTAIN_KEY_ITEM msgbox OneIsland_PokemonCenter_1F_Text_PassLetsYouTravelBetweenIslands call_if_ge VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, OneIsland_PokemonCenter_1F_EventScript_ReceiveTownMapPage call_if_lt VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, OneIsland_PokemonCenter_1F_EventScript_ReceiveTownMap setflag FLAG_SYS_SEVII_MAP_123 msgbox OneIsland_PokemonCenter_1F_Text_BillCatchYouLater closemessage applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterUp waitmovement 0 applymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterUp waitmovement 0 setflag FLAG_SYS_PC_STORAGE_DISABLED setvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 1 releaseall end OneIsland_PokemonCenter_1F_EventScript_IntroducePlayerChamp:: msgbox OneIsland_PokemonCenter_1F_Text_PlayerIsReigningPokemonChamp return OneIsland_PokemonCenter_1F_EventScript_IntroducePlayerNotChamp:: msgbox OneIsland_PokemonCenter_1F_Text_PlayerIsRisingPokemonChamp return OneIsland_PokemonCenter_1F_EventScript_ReceiveTownMapPage:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_KEY_ITEM message OneIsland_PokemonCenter_1F_Text_ReceivedExtraPageForTownMap waitmessage waitfanfare call EventScript_RestorePrevTextColor return OneIsland_PokemonCenter_1F_EventScript_ReceiveTownMap:: setflag FLAG_HIDE_TOWN_MAP setvar VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2 giveitem_msg OneIsland_PokemonCenter_1F_Text_ReceivedTownMap, ITEM_TOWN_MAP, 1, MUS_OBTAIN_KEY_ITEM return OneIsland_PokemonCenter_1F_Movement_PlayerWalkToCelio:: walk_up walk_up walk_right walk_right walk_right walk_right walk_right walk_in_place_faster_up step_end OneIsland_PokemonCenter_1F_Movement_BillWalkToCelio:: walk_up walk_right walk_right walk_right walk_right walk_right walk_up walk_in_place_faster_right step_end @ Unused OneIsland_PokemonCenter_1F_Movement_WalkUp: walk_up step_end @ Unused OneIsland_PokemonCenter_1F_Movement_StepAsideLeft:: walk_left walk_in_place_faster_right step_end OneIsland_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end OneIsland_PokemonCenter_1F_EventScript_Bill:: lock goto_if_set FLAG_SEVII_DETOUR_FINISHED, OneIsland_PokemonCenter_1F_EventScript_BillGoTakeStroll msgbox OneIsland_PokemonCenter_1F_Text_HmmHowAboutLikeThis release end OneIsland_PokemonCenter_1F_EventScript_BillGoTakeStroll:: applymovement LOCALID_BILL, Common_Movement_FacePlayer waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_GotPCWorkingStrollAWhileMore release end OneIsland_PokemonCenter_1F_EventScript_Celio:: lock faceplayer goto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 7, OneIsland_PokemonCenter_1F_EventScript_CelioGiveBillFact goto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 6, OneIsland_PokemonCenter_1F_EventScript_CelioJustGivenSapphire goto_if_set FLAG_RECOVERED_SAPPHIRE, OneIsland_PokemonCenter_1F_EventScript_GiveCelioSapphire goto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, OneIsland_PokemonCenter_1F_EventScript_ExplainRainbowPass goto_if_set FLAG_GOT_RUBY, OneIsland_PokemonCenter_1F_EventScript_GiveCelioRuby goto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4, OneIsland_PokemonCenter_1F_EventScript_CelioWaitingForRuby goto_if_set FLAG_SYS_RECEIVED_EXTENDED_DEX, OneIsland_PokemonCenter_1F_EventScript_CelioRequestRuby goto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 3, OneIsland_PokemonCenter_1F_EventScript_CelioPlayerMissingNationalDex msgbox OneIsland_PokemonCenter_1F_Text_SorryForBeingPoorHost closemessage applymovement LOCALID_CELIO, Common_Movement_FaceOriginalDirection waitmovement 0 release end OneIsland_PokemonCenter_1F_EventScript_CelioGiveBillFact:: msgbox OneIsland_PokemonCenter_1F_Text_CelioHearingRumorsAboutYou random 3 goto_if_eq VAR_RESULT, 0, OneIsland_PokemonCenter_1F_EventScript_BillFact1 goto_if_eq VAR_RESULT, 1, OneIsland_PokemonCenter_1F_EventScript_BillFact2 famechecker FAMECHECKER_BILL, 5 msgbox OneIsland_PokemonCenter_1F_Text_BillCantStomachMilk release end OneIsland_PokemonCenter_1F_EventScript_BillFact1:: famechecker FAMECHECKER_BILL, 3 msgbox OneIsland_PokemonCenter_1F_Text_BillsFirstMonWasAbra release end OneIsland_PokemonCenter_1F_EventScript_BillFact2:: famechecker FAMECHECKER_BILL, 4 msgbox OneIsland_PokemonCenter_1F_Text_BillsHometownInGoldenrod release end OneIsland_PokemonCenter_1F_EventScript_CelioJustGivenSapphire:: msgbox OneIsland_PokemonCenter_1F_Text_WishYouBestOfLuck release end OneIsland_PokemonCenter_1F_EventScript_GiveCelioSapphire:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_TMHM message OneIsland_PokemonCenter_1F_Text_HandedSapphireToCelio waitmessage waitfanfare call EventScript_RestorePrevTextColor removeitem ITEM_SAPPHIRE msgbox OneIsland_PokemonCenter_1F_Text_ThankYouGiveMeTime closemessage applymovement LOCALID_CELIO, OneIsland_PokemonCenter_1F_Movement_CelioPutGemInMachine waitmovement 0 playse SE_CLICK call OneIsland_PokemonCenter_1F_EventScript_SetSapphireMetatile special DrawWholeMapView msgbox OneIsland_PokemonCenter_1F_Text_OkayThisIsGood closemessage delay 60 applymovement LOCALID_CELIO, OneIsland_PokemonCenter_1F_Movement_CelioCheckMachine waitmovement 0 delay 30 applymovement LOCALID_CELIO, OneIsland_PokemonCenter_1F_Movement_CelioCheckMachine waitmovement 0 delay 40 playse SE_PC_ON call OneIsland_PokemonCenter_1F_EventScript_SetNetworkMachineOn special DrawWholeMapView msgbox OneIsland_PokemonCenter_1F_Text_LinkedUpWithLanette applymovement LOCALID_CELIO, Common_Movement_FacePlayer waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_ManagedToLinkWithHoennThankYou giveitem ITEM_HM08, 1 msgbox OneIsland_PokemonCenter_1F_Text_ExplainDive special SetPostgameFlags setflag FLAG_SYS_CAN_LINK_WITH_RS setflag FLAG_HIDE_CERULEAN_CAVE_GUARD setflag FLAG_HIDE_LORELEI_IN_HER_HOUSE setvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 6 release end OneIsland_PokemonCenter_1F_EventScript_ExplainRainbowPass:: msgbox OneIsland_PokemonCenter_1F_Text_PassLetYouGetToAllIslands release end OneIsland_PokemonCenter_1F_EventScript_GiveCelioRuby:: msgbox OneIsland_PokemonCenter_1F_Text_OhThats textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_TMHM message OneIsland_PokemonCenter_1F_Text_HandedRubyToCelio waitmessage waitfanfare call EventScript_RestorePrevTextColor closemessage applymovement LOCALID_CELIO, OneIsland_PokemonCenter_1F_Movement_CelioPutGemInMachine waitmovement 0 playse SE_CLICK call OneIsland_PokemonCenter_1F_EventScript_SetRubyMetatile special DrawWholeMapView delay 30 applymovement LOCALID_CELIO, Common_Movement_FacePlayer waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_MayIAskOneMoreFavor, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, OneIsland_PokemonCenter_1F_EventScript_DeclineHelpCelio goto OneIsland_PokemonCenter_1F_EventScript_GiveRainbowPass end OneIsland_PokemonCenter_1F_EventScript_DeclineHelpCelio:: msgbox OneIsland_PokemonCenter_1F_Text_PleaseINeedYourHelp, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, OneIsland_PokemonCenter_1F_EventScript_DeclineHelpCelio goto OneIsland_PokemonCenter_1F_EventScript_GiveRainbowPass end OneIsland_PokemonCenter_1F_EventScript_GiveRainbowPass:: msgbox OneIsland_PokemonCenter_1F_Text_AnotherGemstoneInSeviiIslands removeitem ITEM_RUBY removeitem ITEM_TRI_PASS setvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5 additem ITEM_RAINBOW_PASS setflag FLAG_SYS_SEVII_MAP_4567 textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_KEY_ITEM message OneIsland_PokemonCenter_1F_Text_ReturnedTriPassForRainbowPass waitmessage waitfanfare playfanfare MUS_OBTAIN_KEY_ITEM message OneIsland_PokemonCenter_1F_Text_ObtainedExtraMapPage waitmessage waitfanfare call EventScript_RestorePrevTextColor goto OneIsland_PokemonCenter_1F_EventScript_ExplainRainbowPassScott end OneIsland_PokemonCenter_1F_EventScript_ExplainRainbowPassScott:: msgbox OneIsland_PokemonCenter_1F_Text_PassLetYouGetToAllIslandsScott closemessage turnobject LOCALID_SCOTT, DIR_NORTH playse SE_PIN applymovement LOCALID_SCOTT, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_SCOTT, Common_Movement_Delay48 waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_YoureTheChamp closemessage getplayerxy VAR_0x8005, VAR_0x8007 call_if_lt VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottToLeft call_if_eq VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottToCenter call_if_gt VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottToRight turnobject OBJ_EVENT_ID_PLAYER, DIR_SOUTH msgbox OneIsland_PokemonCenter_1F_Text_ExcuseMe closemessage turnobject OBJ_EVENT_ID_PLAYER, DIR_WEST getplayerxy VAR_0x8005, VAR_0x8007 call_if_eq VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottLeftOne call_if_gt VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottLeftTwo applymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottExits waitmovement 0 call_if_ne VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottExitsDownStep removeobject LOCALID_SCOTT playse SE_EXIT release end OneIsland_PokemonCenter_1F_EventScript_ScottExitsDownStep:: applymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottExitsDownStep waitmovement 0 return OneIsland_PokemonCenter_1F_Movement_ScottExitsDownStep:: walk_down step_end OneIsland_PokemonCenter_1F_EventScript_ScottLeftOne:: applymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottLeftOne waitmovement 0 return OneIsland_PokemonCenter_1F_EventScript_ScottLeftTwo:: applymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottLeftTwo waitmovement 0 return OneIsland_PokemonCenter_1F_Movement_ScottLeftOne:: walk_left step_end OneIsland_PokemonCenter_1F_Movement_ScottLeftTwo:: walk_left walk_left step_end OneIsland_PokemonCenter_1F_Movement_ScottExits:: walk_left walk_left walk_left walk_left walk_left walk_down step_end OneIsland_PokemonCenter_1F_Text_ExcuseMe:: .string "Excuse me!\n" .string "I couldn't help but overhear.\p" .string "Let me introduce myself.\n" .string "My name's SCOTT.\p" .string "I've been traveling everywhere in\n" .string "search of outstanding TRAINERS.\p" .string "More specifically, I'm looking for\n" .string "POKéMON battle experts.\p" .string "There's a place I'd like to\n" .string "invite someone like you.\p" .string "It's the…\n" .string "BATTLE TOWER!\p" .string "I'm about to head to VERMILION\n" .string "to continue my search.\p" .string "I'll tell the ferryman there to let\n" .string "you sail to HOENN and check it out\l" .string "for yourself!\p" .string "Well, I'll be seeing you!$" OneIsland_PokemonCenter_1F_EventScript_ScottToLeft:: applymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottToLeft waitmovement 0 return OneIsland_PokemonCenter_1F_EventScript_ScottToCenter:: applymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottToCenter waitmovement 0 return OneIsland_PokemonCenter_1F_EventScript_ScottToRight:: applymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottToRight waitmovement 0 return OneIsland_PokemonCenter_1F_Text_YoureTheChamp:: .string "You're the KANTO LEAGUE CHAMPION?$" OneIsland_PokemonCenter_1F_EventScript_Scott:: msgbox OneIsland_PokemonCenter_1F_Text_ScottOnPhone faceplayer msgbox OneIsland_PokemonCenter_1F_Text_HeyOnCall turnobject LOCALID_SCOTT, DIR_EAST release end OneIsland_PokemonCenter_1F_Text_ScottOnPhone: .string "…I'm not so sure about the\n" .string "TRAINERS here.\p" .string "I think I'm going to roam the\n" .string "towns in KANTO instead.$" OneIsland_PokemonCenter_1F_Text_HeyOnCall: .string "Hey! Can't you see I'm on a call?$" OneIsland_PokemonCenter_1F_Movement_ScottToLeft:: walk_up walk_left walk_up step_end OneIsland_PokemonCenter_1F_Movement_ScottToCenter:: walk_up step_end OneIsland_PokemonCenter_1F_Movement_ScottToRight:: walk_up walk_right walk_up step_end OneIsland_PokemonCenter_1F_EventScript_CelioWaitingForRuby:: msgbox OneIsland_PokemonCenter_1F_Text_TryingToFindGem release end OneIsland_PokemonCenter_1F_EventScript_CelioRequestRuby:: msgbox OneIsland_PokemonCenter_1F_Text_CelioCaughtMoreMonMaybeICanBeUseful applymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_YoullBeTradingFromTrainersFarAway applymovement LOCALID_CELIO, Common_Movement_FacePlayer waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_NeedsSpecialGemstone setvar VAR_MAP_SCENE_MT_EMBER_EXTERIOR, 1 setvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4 release end OneIsland_PokemonCenter_1F_EventScript_CelioPlayerMissingNationalDex:: msgbox OneIsland_PokemonCenter_1F_Text_CelioImModifyingMyNetworkMachine release end OneIsland_PokemonCenter_1F_Movement_CelioCheckMachine:: walk_in_place_up delay_8 walk_in_place_up step_end OneIsland_PokemonCenter_1F_Movement_CelioPutGemInMachine:: walk_in_place_faster_up walk_in_place_up delay_16 walk_in_place_up walk_in_place_up step_end OneIsland_PokemonCenter_1F_EventScript_LittleBoy:: msgbox OneIsland_PokemonCenter_1F_Text_CameFromPalletDontKnowIt, MSGBOX_NPC end OneIsland_PokemonCenter_1F_EventScript_Hiker:: msgbox OneIsland_PokemonCenter_1F_Text_EnormousVolcanoOnIsland, MSGBOX_NPC end OneIsland_PokemonCenter_1F_EventScript_BattleGirl:: lock faceplayer goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, OneIsland_PokemonCenter_1F_EventScript_BattleGirlHoennLinked msgbox OneIsland_PokemonCenter_1F_Text_WishICouldTradeWithBoyfriend release end OneIsland_PokemonCenter_1F_EventScript_BattleGirlHoennLinked:: msgbox OneIsland_PokemonCenter_1F_Text_TradedWithFarAwayBoyfriend release end OneIsland_PokemonCenter_1F_EventScript_NetworkMachine:: lockall goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, OneIsland_PokemonCenter_1F_EventScript_NetworkMachineLinkedWithHoenn goto_if_set FLAG_SEVII_DETOUR_FINISHED, OneIsland_PokemonCenter_1F_EventScript_NetworkMachineLinkedWithKanto msgbox OneIsland_PokemonCenter_1F_Text_MachineUnderAdjustment releaseall end OneIsland_PokemonCenter_1F_EventScript_NetworkMachineLinkedWithKanto:: msgbox OneIsland_PokemonCenter_1F_Text_MachineLinkedWithKanto releaseall end OneIsland_PokemonCenter_1F_EventScript_NetworkMachineLinkedWithHoenn:: msgbox OneIsland_PokemonCenter_1F_Text_MachineLinkedWithKantoAndHoenn releaseall end OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerTop:: lockall setvar VAR_TEMP_1, 1 goto OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene end OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerMidTop:: lockall setvar VAR_TEMP_1, 2 goto OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene end OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerMidBottom:: lockall setvar VAR_TEMP_1, 3 goto OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene end OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerBottom:: lockall setvar VAR_TEMP_1, 4 goto OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene end OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene:: textcolor NPC_TEXT_COLOR_MALE playse SE_PIN applymovement LOCALID_BILL, Common_Movement_ExclamationMark waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_BillOhHeyPlayer closemessage call_if_eq VAR_TEMP_1, 1, OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillTop call_if_eq VAR_TEMP_1, 2, OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillMidTop call_if_eq VAR_TEMP_1, 3, OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillMidBottom call_if_eq VAR_TEMP_1, 4, OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillBottom delay 10 msgbox OneIsland_PokemonCenter_1F_Text_BillWeGotItDone applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_CelioJobWentQuick applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 applymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_BillYouveLearnedALot msgbox OneIsland_PokemonCenter_1F_Text_CelioOhReallyEhehe closemessage applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 10 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 15 msgbox OneIsland_PokemonCenter_1F_Text_BillWeShouldHeadBackToKanto closemessage applymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 15 applymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox OneIsland_PokemonCenter_1F_Text_CelioPromiseIllShowYouAroundSometime closemessage delay 25 applymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerExit applymovement LOCALID_BILL, OneIsland_PokemonCenter_1F_Movement_BillExit waitmovement 0 playse SE_EXIT setflag FLAG_HIDE_ONE_ISLAND_POKECENTER_BILL setvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 3 clearflag FLAG_HIDE_CINNABAR_BILL setvar VAR_MAP_SCENE_CINNABAR_ISLAND, 3 setvar VAR_0x8004, SEAGALLOP_ONE_ISLAND setvar VAR_0x8006, SEAGALLOP_CINNABAR_ISLAND goto EventScript_SetSail end OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillTop:: applymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillTop waitmovement 0 return OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillMidTop:: applymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillMidTop waitmovement 0 return OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillMidBottom:: applymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillMidBottom waitmovement 0 return OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillBottom:: applymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillBottom waitmovement 0 return OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillTop:: walk_right walk_down walk_in_place_faster_right step_end OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillMidTop:: walk_right step_end OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillMidBottom:: walk_right walk_up walk_in_place_faster_right step_end OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillBottom:: walk_right walk_up walk_up walk_in_place_faster_right step_end @ Unused OneIsland_PokemonCenter_1F_Movement_DelayWalkInPlaceLeft:: delay_16 delay_16 delay_4 walk_in_place_faster_left step_end @ Unused OneIsland_PokemonCenter_1F_Movement_WalkInPlaceDown:: walk_in_place_fast_down step_end OneIsland_PokemonCenter_1F_Movement_PlayerExit:: walk_left walk_left walk_left walk_left walk_down walk_down step_end OneIsland_PokemonCenter_1F_Movement_BillExit:: walk_left walk_left walk_left walk_left walk_left walk_down step_end ================================================ FILE: data/maps/OneIsland_PokemonCenter_1F/text.inc ================================================ OneIsland_PokemonCenter_1F_Text_BillHeyThereCelio:: .string "BILL: Hey, there!\n" .string "CELIO!$" OneIsland_PokemonCenter_1F_Text_CelioCantBelieveYouCameOut:: .string "CELIO: BILL!\n" .string "I can't believe you came out here.$" OneIsland_PokemonCenter_1F_Text_BillHowsYourResearchComing:: .string "BILL: Well, absolutely!\n" .string "How's your research coming along?\p" .string "…Oh, wait a sec.$" OneIsland_PokemonCenter_1F_Text_ThisIsMyBuddyCelio:: .string "{PLAYER}, this is my buddy CELIO.\n" .string "He's one dedicated PC MANIAC!$" OneIsland_PokemonCenter_1F_Text_PlayerIsRisingPokemonChamp:: .string "CELIO, this is {PLAYER}, a rising\n" .string "contender as the POKéMON CHAMP!$" OneIsland_PokemonCenter_1F_Text_PlayerIsReigningPokemonChamp:: .string "CELIO, this is {PLAYER}, the\n" .string "reigning POKéMON CHAMP!$" OneIsland_PokemonCenter_1F_Text_CelioThatsReallyImpressive:: .string "CELIO: That's really impressive.\p" .string "I hate to say it, but I have zero\n" .string "aptitude for battling.\p" .string "Anyways, I'm glad to meet you.$" OneIsland_PokemonCenter_1F_Text_BillBringMeUpToSpeed:: .string "BILL: So, bring me up to speed.\n" .string "How's your machine running?$" OneIsland_PokemonCenter_1F_Text_CelioPCsCantLinkWithYours:: .string "CELIO: It's running fine, but we're\n" .string "too remote out here.\p" .string "The PCs on this island just can't\n" .string "link with your PC, BILL.$" OneIsland_PokemonCenter_1F_Text_BillLetMeHelpYou:: .string "BILL: Oh, yeah?\n" .string "Okay, let me take a look-see.\p" .string "…Hang on here…\n" .string "I think we can make it work.\l" .string "Let me help you, okay?$" OneIsland_PokemonCenter_1F_Text_CanYouDeliverThisMeteoritePlayer:: .string "{PLAYER}, can I get you to wait for\n" .string "me just a bit?\p" .string "…Actually, can I get you to do\n" .string "me a favor?\p" .string "The island next to this one's\n" .string "called TWO ISLAND.\p" .string "There's a guy there that runs\n" .string "a GAME CORNER.\p" .string "He has this thing for rare rocks\n" .string "and gems.\p" .string "We keep in touch, being fellow\n" .string "maniacs.\p" .string "So, can I get you to deliver this\n" .string "METEORITE to him?$" OneIsland_PokemonCenter_1F_Text_AcceptedMeteoriteFromBill:: .string "{PLAYER} accepted the METEORITE\n" .string "from BILL.$" OneIsland_PokemonCenter_1F_Text_CelioPleaseTakeThis:: .string "CELIO: {PLAYER}, if you are going\n" .string "to TWO ISLAND, please take this.$" OneIsland_PokemonCenter_1F_Text_PassLetsYouTravelBetweenIslands:: .string "It's a PASS for the ferry service\n" .string "serving the local islands.\p" .string "It will let you travel between the\n" .string "ISLANDS ONE, TWO, and THREE.\p" .string "Oh, you should have this, too.$" OneIsland_PokemonCenter_1F_Text_ReceivedExtraPageForTownMap:: .string "{PLAYER} received an extra page\n" .string "for the TOWN MAP!$" OneIsland_PokemonCenter_1F_Text_ReceivedTownMap:: .string "{PLAYER} received\n" .string "a TOWN MAP!$" OneIsland_PokemonCenter_1F_Text_BillCatchYouLater:: .string "BILL: I'll catch you later!\n" .string "Say hi to the guy for me!$" OneIsland_PokemonCenter_1F_Text_HmmHowAboutLikeThis:: .string "Hmm…\p" .string "How about we try this like this…$" OneIsland_PokemonCenter_1F_Text_GotPCWorkingStrollAWhileMore:: .string "Oh, hey, {PLAYER}!\p" .string "Did you see?\n" .string "We got the PC working!\p" .string "I've got a few things to show\n" .string "CELIO here.\p" .string "Can you go out on a stroll or\n" .string "something for a while more?$" OneIsland_PokemonCenter_1F_Text_SorryForBeingPoorHost:: .string "I'm sorry for taking up so much of\n" .string "BILL's time.\p" .string "I'm also sorry for being such a \n" .string "poor host on your visit here.$" OneIsland_PokemonCenter_1F_Text_UsualPCServicesUnavailable:: .string "The usual PC services aren't\n" .string "available…$" OneIsland_PokemonCenter_1F_Text_BillOhHeyPlayer:: .string "BILL: Oh, hey!\n" .string "{PLAYER}!$" OneIsland_PokemonCenter_1F_Text_BillWeGotItDone:: .string "BILL: What kept you so long?\n" .string "Been out having a good time?\p" .string "We got it done.\n" .string "The PCs are up and running!$" OneIsland_PokemonCenter_1F_Text_CelioJobWentQuick:: .string "CELIO: The job went incredibly\n" .string "quick.\p" .string "BILL is one amazing guy…$" OneIsland_PokemonCenter_1F_Text_BillYouveLearnedALot:: .string "BILL: No, no! There was almost\n" .string "nothing left for me to do.\p" .string "CELIO, I have to hand it to you.\n" .string "You've learned a lot.$" OneIsland_PokemonCenter_1F_Text_CelioOhReallyEhehe:: .string "CELIO: Oh, really?\n" .string "Ehehe…$" OneIsland_PokemonCenter_1F_Text_BillWeShouldHeadBackToKanto:: .string "BILL: Well, there you have it.\n" .string "I'm finished with the job.\l" .string "We should head back to KANTO.\p" .string "CELIO, I'll be seeing you again.$" OneIsland_PokemonCenter_1F_Text_CelioPromiseIllShowYouAroundSometime:: .string "CELIO: {PLAYER}, I'm really sorry\n" .string "that we sent you off alone today.\p" .string "I promise, I will show you around\n" .string "these islands sometime.$" OneIsland_PokemonCenter_1F_Text_CelioImModifyingMyNetworkMachine:: .string "CELIO: Hello!\n" .string "You look awfully busy as always.\p" .string "How am I doing?\p" .string "Well, I'm modifying my Network\n" .string "Machine.\p" .string "When I get done with the machine,\n" .string "I hope you'll be first to use it,\l" .string "{PLAYER}.$" OneIsland_PokemonCenter_1F_Text_CelioCaughtMoreMonMaybeICanBeUseful:: .string "CELIO: {PLAYER}, how have things\n" .string "been for you?\p" .string "Oh, is that right?\n" .string "You've caught more POKéMON.\p" .string "Do you know what?\n" .string "Maybe I can be useful to you.$" OneIsland_PokemonCenter_1F_Text_YoullBeTradingFromTrainersFarAway:: .string "I'm modifying the Network Machine\n" .string "right now.\p" .string "I'm changing it so it can handle\n" .string "trades over long distances.\p" .string "When I get finished, you'll be\n" .string "trading for exotic POKéMON from\l" .string "TRAINERS far away.$" OneIsland_PokemonCenter_1F_Text_NeedsSpecialGemstone:: .string "But, there is a slight catch.\p" .string "For the link to work, the Machine\n" .string "needs a special gemstone.\p" .string "It's supposed to be on ONE ISLAND,\n" .string "but I haven't found one yet.\p" .string "Who knows where it could be.$" OneIsland_PokemonCenter_1F_Text_TryingToFindGem:: .string "I was trying to find the gem\n" .string "even while I was studying.\p" .string "As a result, I've made no headway\n" .string "in both my search and studies…\p" .string "If I relied on BILL, I'm sure my\n" .string "research would progress.\p" .string "But this time, I want to try to do\n" .string "things by myself.$" OneIsland_PokemonCenter_1F_Text_OhThats:: .string "Oh!\n" .string "Th-that's…$" OneIsland_PokemonCenter_1F_Text_HandedRubyToCelio:: .string "{PLAYER} handed the RUBY\n" .string "to CELIO.$" OneIsland_PokemonCenter_1F_Text_MayIAskOneMoreFavor:: .string "Thank you!\n" .string "{PLAYER}, you're simply amazing.\p" .string "… … … … … …\p" .string "Um… May I ask one more giant favor\n" .string "of you?$" OneIsland_PokemonCenter_1F_Text_PleaseINeedYourHelp:: .string "It… It's not anything weird.\n" .string "Please, I need your help.$" OneIsland_PokemonCenter_1F_Text_AnotherGemstoneInSeviiIslands:: .string "While I was studying gemstones,\n" .string "I discovered something important.\p" .string "There is another gem that forms\n" .string "a pair with this RUBY.\p" .string "That other gemstone is supposed to\n" .string "be in the SEVII ISLANDS.\p" .string "{PLAYER}, please, I need you to go\n" .string "find the other gem.\p" .string "{PLAYER}, may I have your ferry\n" .string "PASS and the TOWN MAP?$" OneIsland_PokemonCenter_1F_Text_ReturnedTriPassForRainbowPass:: .string "{PLAYER} returned the TRI-PASS and\n" .string "received the RAINBOW PASS.$" OneIsland_PokemonCenter_1F_Text_ObtainedExtraMapPage:: .string "Obtained an extra page for the\n" .string "TOWN MAP!$" OneIsland_PokemonCenter_1F_Text_PassLetYouGetToAllIslands:: .string "This is my own ferry PASS.\p" .string "It will let you get to all the\n" .string "SEVII ISLANDS.\p" .string "{PLAYER}, please, I can't do\n" .string "it without your help.$" OneIsland_PokemonCenter_1F_Text_PassLetYouGetToAllIslandsScott:: .string "This is my own ferry PASS.\p" .string "It will let you get to all the\n" .string "SEVII ISLANDS.\p" .string "{PLAYER}, please, I can't do\n" .string "it without your help.\p" .string "As the CHAMPION, your POKéMON\n" .string "are amazingly strong.\p" .string "You should be safe exploring\n" .string "the rest of the islands.$" OneIsland_PokemonCenter_1F_Text_HandedSapphireToCelio:: .string "{PLAYER} handed the SAPPHIRE\n" .string "to CELIO.$" OneIsland_PokemonCenter_1F_Text_ThankYouGiveMeTime:: .string "CELIO: So this is the gem that\n" .string "forms a pair with the RUBY…\p" .string "{PLAYER}, you've gone through a lot\n" .string "to get this, didn't you?\p" .string "You don't have to tell me. I know\n" .string "it wasn't easy.\p" .string "Thank you so much!\p" .string "Now it's my turn to work for you!\n" .string "Please give me a little time.$" OneIsland_PokemonCenter_1F_Text_OkayThisIsGood:: .string "Okay, this is good…$" OneIsland_PokemonCenter_1F_Text_LinkedUpWithLanette:: .string "I did it!\n" .string "I linked up with LANETTE!$" OneIsland_PokemonCenter_1F_Text_ManagedToLinkWithHoennThankYou:: .string "{PLAYER}…\n" .string "{PLAYER}, I did it!\p" .string "I've managed to link up with\n" .string "TRAINERS in the HOENN region!\p" .string "Finally, the Network Machine is\n" .string "fully operational!\p" .string "{PLAYER}, I owe it all to you!\p" .string "Thanks to you, my dream came\n" .string "true…\p" .string "I want to give you something\n" .string "to thank you for all your help.$" OneIsland_PokemonCenter_1F_Text_ExplainDive:: .string "Sometimes while SURFING, you'll\n" .string "notice dark patches of water.\p" .string "The water there's deep, so you can\n" .string "use DIVE to drop to the seafloor.\p" .string "When you want to surface, you can\n" .string "use DIVE again as long there's\l" .string "nothing blocking you.$" OneIsland_PokemonCenter_1F_Text_WishYouBestOfLuck:: .string "I…\n" .string "I'm not crying.\p" .string "That's enough about me!\p" .string "{PLAYER}, you're going to keep\n" .string "looking for exotic POKéMON, right?\p" .string "I wish you the best of luck!$" OneIsland_PokemonCenter_1F_Text_CelioHearingRumorsAboutYou:: .string "CELIO: Hello!\p" .string "{PLAYER}, I've been hearing rumors\n" .string "about you.$" OneIsland_PokemonCenter_1F_Text_BillsFirstMonWasAbra:: .string "{PLAYER}, what's your favorite kind\n" .string "of POKéMON?\p" .string "BILL is a POKéMANIAC, so he loves\n" .string "every kind.\p" .string "Apparently, the first one he caught\n" .string "was an ABRA.$" OneIsland_PokemonCenter_1F_Text_BillsHometownInGoldenrod:: .string "By the way, {PLAYER}, you're from\n" .string "PALLET TOWN, aren't you?\p" .string "I've heard that it's a quiet and\n" .string "pleasant place.\p" .string "BILL's hometown is GOLDENROD CITY,\n" .string "where his folks still live.\p" .string "I've heard that it's quite the\n" .string "festive, bustling city.\p" .string "I'd like to go there one day.$" OneIsland_PokemonCenter_1F_Text_BillCantStomachMilk:: .string "{PLAYER}, is there anything that\n" .string "you can't stand?\p" .string "Apparently, BILL simply can't\n" .string "stomach milk at all.$" OneIsland_PokemonCenter_1F_Text_CameFromPalletDontKnowIt:: .string "Oh, you're a stranger here!\n" .string "Hi! Where did you come from?\p" .string "…PALLET TOWN?\n" .string "I don't know it!$" OneIsland_PokemonCenter_1F_Text_EnormousVolcanoOnIsland:: .string "On this island, there's an enormous\n" .string "volcano.\p" .string "It hasn't erupted lately, so why\n" .string "not enjoy a hike?$" OneIsland_PokemonCenter_1F_Text_WishICouldTradeWithBoyfriend:: .string "I wish I could trade POKéMON with\n" .string "my boyfriend who lives far away…$" OneIsland_PokemonCenter_1F_Text_TradedWithFarAwayBoyfriend:: .string "I traded POKéMON with my boyfriend\n" .string "far away!\p" .string "Everyone's saying that we can\n" .string "thank you and CELIO.\p" .string "So, thank you!$" OneIsland_PokemonCenter_1F_Text_MachineUnderAdjustment:: .string "Network Machine\n" .string "Link Level 0\p" .string "…POKéMON Storage System under\n" .string "adjustment…$" OneIsland_PokemonCenter_1F_Text_MachineLinkedWithKanto:: .string "Network Machine\n" .string "Link Level 1\p" .string "Link established with the KANTO\n" .string "region.$" OneIsland_PokemonCenter_1F_Text_MachineLinkedWithKantoAndHoenn:: .string "Network Machine\n" .string "Link Level 2\p" .string "Link established with the KANTO\n" .string "and HOENN regions.$" OneIsland_PokemonCenter_1F_Text_ObtainedTriPass:: .string "Obtained the TRI-PASS!$" ================================================ FILE: data/maps/OneIsland_PokemonCenter_2F/map.json ================================================ { "id": "MAP_ONE_ISLAND_POKEMON_CENTER_2F", "name": "OneIsland_PokemonCenter_2F", "layout": "LAYOUT_ONE_ISLAND_POKEMON_CENTER_2F", "music": "MUS_NET_CENTER", "region_map_section": "MAPSEC_ONE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_ONE_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/OneIsland_PokemonCenter_2F/scripts.inc ================================================ OneIsland_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS OneIsland_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end OneIsland_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end OneIsland_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/OneIsland_TreasureBeach/map.json ================================================ { "id": "MAP_ONE_ISLAND_TREASURE_BEACH", "name": "OneIsland_TreasureBeach", "layout": "LAYOUT_ONE_ISLAND_TREASURE_BEACH", "music": "MUS_ROUTE120", "region_map_section": "MAPSEC_TREASURE_BEACH", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ONE_ISLAND" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 8, "y": 11, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "OneIsland_TreasureBeach_EventScript_Amara", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 13, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "OneIsland_TreasureBeach_EventScript_Boy", "flag": "0" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 8, "y": 20, "elevation": 3, "item": "ITEM_STARDUST", "flag": "FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 13, "y": 27, "elevation": 3, "item": "ITEM_STARDUST", "flag": "FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST_2", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 11, "y": 31, "elevation": 3, "item": "ITEM_PEARL", "flag": "FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 9, "y": 34, "elevation": 3, "item": "ITEM_PEARL", "flag": "FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL_2", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 15, "y": 22, "elevation": 3, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 16, "y": 33, "elevation": 3, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 15, "y": 29, "elevation": 3, "item": "ITEM_STAR_PIECE", "flag": "FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STAR_PIECE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 8, "y": 27, "elevation": 3, "item": "ITEM_BIG_PEARL", "flag": "FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_BIG_PEARL", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/OneIsland_TreasureBeach/scripts.inc ================================================ OneIsland_TreasureBeach_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, OneIsland_TreasureBeach_OnResume .byte 0 OneIsland_TreasureBeach_OnResume: setstepcallback STEP_CB_ASH end OneIsland_TreasureBeach_EventScript_Boy:: msgbox OneIsland_TreasureBeach_Text_GoodThingsWashUpOnBeach, MSGBOX_NPC end ================================================ FILE: data/maps/OneIsland_TreasureBeach/text.inc ================================================ OneIsland_TreasureBeach_Text_AmaraIntro:: .string "Lying back, rocked by the waves…\n" .string "It's exquisite.$" OneIsland_TreasureBeach_Text_AmaraDefeat:: .string "I lost…\n" .string "It feels awful.$" OneIsland_TreasureBeach_Text_AmaraPostBattle:: .string "The sea is pleasantly warm in these\n" .string "parts.$" OneIsland_TreasureBeach_Text_GoodThingsWashUpOnBeach:: .string "Good things get washed up by the\n" .string "ocean current onto this beach.\p" .string "That's why I often come here for\n" .string "some beachcombing.$" ================================================ FILE: data/maps/PalletTown/map.json ================================================ { "id": "MAP_PALLET_TOWN", "name": "PalletTown", "layout": "LAYOUT_PALLET_TOWN", "music": "MUS_PALLET", "region_map_section": "MAPSEC_PALLET_TOWN", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ROUTE1" }, { "direction": "down", "offset": 0, "map": "MAP_ROUTE21_NORTH" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 3, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_EventScript_SignLady", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 13, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 6, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_EventScript_FatMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PROF_OAK", "in_connection": false, "x": 10, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_OAK_IN_PALLET_TOWN" }, { "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 10, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_EventScript_MasterYoungster", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 7, "elevation": 0, "dest_map": "MAP_PALLET_TOWN_PLAYERS_HOUSE_1F", "dest_warp_id": "1" }, { "x": 15, "y": 7, "elevation": 0, "dest_map": "MAP_PALLET_TOWN_RIVALS_HOUSE", "dest_warp_id": "0" }, { "x": 16, "y": 13, "elevation": 0, "dest_map": "MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 12, "y": 1, "elevation": 3, "var": "VAR_MAP_SCENE_PALLET_TOWN_OAK", "var_value": "0", "script": "PalletTown_EventScript_OakTriggerLeft" }, { "type": "trigger", "x": 13, "y": 1, "elevation": 3, "var": "VAR_MAP_SCENE_PALLET_TOWN_OAK", "var_value": "0", "script": "PalletTown_EventScript_OakTriggerRight" }, { "type": "trigger", "x": 13, "y": 2, "elevation": 3, "var": "VAR_TEMP_2", "var_value": "1", "script": "PalletTown_EventScript_SignLadyTrigger" } ], "bg_events": [ { "type": "sign", "x": 16, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_EventScript_OaksLabSign" }, { "type": "sign", "x": 4, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_EventScript_PlayersHouseSign" }, { "type": "sign", "x": 13, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_EventScript_RivalsHouseSign" }, { "type": "sign", "x": 9, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_EventScript_TownSign" }, { "type": "sign", "x": 5, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_EventScript_TrainerTips" } ], "level_scaling": "0" } ================================================ FILE: data/maps/PalletTown/scripts.inc ================================================ .equ LOCALID_SIGN_LADY, 1 .equ LOCALID_PROF_OAK, 3 .equ LOCALID_MASTER_YOUNGSTER, 4 .equ SIGN_LADY_READY, VAR_TEMP_2 PalletTown_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PalletTown_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, PalletTown_OnFrame .byte 0 PalletTown_OnTransition:: setworldmapflag FLAG_WORLD_MAP_PALLET_TOWN call_if_set FLAG_PALLET_LADY_NOT_BLOCKING_SIGN, PalletTown_EventScript_TryReadySignLady call_if_eq VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 0, PalletTown_EventScript_SetSignLadyPos call_if_eq VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1, PalletTown_EventScript_SetSignLadyDone call_if_eq VAR_MAP_SCENE_PALLET_TOWN_OAK, 3, PalletTown_EventScript_PlaceMasterYoungsterOutsideLab end PalletTown_EventScript_TryReadySignLady:: goto_if_unset FLAG_OPENED_START_MENU, EventScript_Return goto_if_ge VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1, EventScript_Return setvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1 return PalletTown_EventScript_SetSignLadyDone:: setvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 2 return PalletTown_EventScript_SetSignLadyPos:: goto_if_set FLAG_PALLET_LADY_NOT_BLOCKING_SIGN, PalletTown_EventScript_MoveSignLadyToRouteEntrance setobjectxyperm LOCALID_SIGN_LADY, 5, 15 setobjectmovementtype LOCALID_SIGN_LADY, MOVEMENT_TYPE_FACE_UP return PalletTown_EventScript_MoveSignLadyToRouteEntrance:: setobjectxyperm LOCALID_SIGN_LADY, 12, 2 setobjectmovementtype LOCALID_SIGN_LADY, MOVEMENT_TYPE_FACE_DOWN setvar SIGN_LADY_READY, TRUE return PalletTown_EventScript_PlaceMasterYoungsterOutsideLab:: setobjectxyperm LOCALID_MASTER_YOUNGSTER, 15, 14 setobjectmovementtype LOCALID_MASTER_YOUNGSTER, MOVEMENT_TYPE_FACE_RIGHT return PalletTown_OnFrame:: map_script_2 VAR_MAP_SCENE_PALLET_TOWN_OAK, 2, PalletTown_EventScript_OakRatingScene map_script_2 VAR_MAP_SCENE_PALLET_TOWN_OAK, 3, PalletTown_EventScript_MasterTrainerYoungster .2byte 0 @ Master Trainer Youngster explains after exiting lab with upgraded dex PalletTown_EventScript_MasterTrainerYoungster:: goto_if_questlog EventScript_ReleaseEnd lockall textcolor 0 applymovement LOCALID_MASTER_YOUNGSTER, SevenIsland_House_Room2_Movement_StepFastestRight applymovement OBJ_EVENT_ID_PLAYER, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 setvar VAR_LAST_TALKED, LOCALID_MASTER_YOUNGSTER msgbox PalletTown_Text_MasterYoungsterIntroduce, MSGBOX_NPC applymovement LOCALID_MASTER_YOUNGSTER, PalletTown_Movement_MoveYoungsterOffScreen waitmovement 0 setobjectxyperm LOCALID_MASTER_YOUNGSTER, 10, 7 setobjectxy LOCALID_MASTER_YOUNGSTER, 10, 7 setobjectmovementtypeinstant LOCALID_MASTER_YOUNGSTER, MOVEMENT_TYPE_FACE_DOWN setvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 4 releaseall end PalletTown_Text_MasterYoungsterIntroduce: .string "Hey, sorry to bug you while your\n" .string "world's expanding.\p" .string "Now that you've successfully become\n" .string "CHAMPION, I've got news for you!\p" .string "The MASTER TRAINERS, TRAINERS that\n" .string "that have spent their whole careers\l" .string "training one specific POKéMON, have\l" .string "appeared throughout KANTO.\p" .string "If you want to know the details,\n" .string "come talk to me!$" PalletTown_Movement_MoveYoungsterOffScreen: walk_left walk_left walk_left walk_left walk_up walk_up walk_up walk_up walk_up walk_up face_down step_end @ Oak approaches player after exiting their house post Elite Four to check if they should receieve the National Dex PalletTown_EventScript_OakRatingScene:: lockall textcolor NPC_TEXT_COLOR_MALE setobjectxyperm LOCALID_PROF_OAK, 14, 14 setobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_LEFT addobject LOCALID_PROF_OAK applymovement LOCALID_PROF_OAK, PalletTown_Movement_OakWalkToPlayersDoor waitmovement 0 msgbox PalletTown_Text_OakLetMeSeePokedex setvar VAR_0x8004, 0 specialvar VAR_RESULT, GetPokedexCount copyvar VAR_0x8008, VAR_0x8005 copyvar VAR_0x8009, VAR_0x8006 buffernumberstring STR_VAR_1, VAR_0x8008 buffernumberstring STR_VAR_2, VAR_0x8009 call_if_lt VAR_0x8009, 60, PalletTown_EventScript_NotEnoughMonsForNationalDex call_if_ge VAR_0x8009, 60, PalletTown_EventScript_EnoughMonsForNationalDex playbgm MUS_FOLLOW_ME, 0 applymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerWalkToLabFromHouse applymovement LOCALID_PROF_OAK, PalletTown_Movement_OakWalkToLabFromHouse waitmovement 0 opendoor 16, 13 waitdooranim applymovement LOCALID_PROF_OAK, PalletTown_Movement_OakEnterLab applymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerEnterLab waitmovement 0 closedoor 16, 13 waitdooranim setvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 7 setvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 3 setflag FLAG_HIDE_OAK_IN_PALLET_TOWN warp MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6, 12 waitstate releaseall end PalletTown_EventScript_EndOakRatingScene:: closemessage applymovement LOCALID_PROF_OAK, PalletTown_Movement_OakExit waitmovement 0 removeobject LOCALID_PROF_OAK setvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 3 releaseall end PalletTown_EventScript_NotEnoughMonsForNationalDex:: msgbox PalletTown_Text_CaughtXPuttingInHonestEffort closemessage return PalletTown_EventScript_EnoughMonsForNationalDex:: msgbox PalletTown_Text_CaughtXImpressiveFollowMe closemessage return PalletTown_Movement_OakWalkToPlayersDoor:: walk_left walk_left walk_left walk_up walk_up walk_up walk_up walk_up walk_left walk_left walk_left walk_left walk_left walk_in_place_faster_up step_end PalletTown_Movement_OakExit:: walk_right walk_right walk_right walk_right walk_right walk_down walk_down walk_down walk_down walk_down walk_right walk_right walk_right step_end PalletTown_Movement_OakWalkToLabFromHouse:: walk_right walk_right walk_right walk_right walk_right walk_down walk_down walk_down walk_down walk_down walk_right walk_right walk_right walk_right walk_right walk_in_place_faster_up step_end PalletTown_Movement_PlayerWalkToLabFromHouse:: walk_down walk_right walk_right walk_right walk_right walk_right walk_down walk_down walk_down walk_down walk_down walk_right walk_right walk_right walk_right step_end PalletTown_EventScript_OakTriggerLeft:: lockall setvar VAR_TEMP_1, 0 goto PalletTown_EventScript_OakTrigger end PalletTown_EventScript_OakTriggerRight:: lockall setvar VAR_TEMP_1, 1 goto PalletTown_EventScript_OakTrigger end PalletTown_EventScript_OakTrigger:: famechecker FAMECHECKER_OAK, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 textcolor NPC_TEXT_COLOR_MALE delay 30 playbgm MUS_OAK, 0 message PalletTown_Text_OakDontGoOut waitmessage delay 85 closemessage applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark waitmovement 0 delay 30 addobject LOCALID_PROF_OAK call_if_eq VAR_TEMP_1, 0, PalletTown_EventScript_OakEnterLeft call_if_eq VAR_TEMP_1, 1, PalletTown_EventScript_OakEnterRight delay 30 msgbox PalletTown_Text_OakGrassUnsafeNeedMon closemessage delay 30 call_if_eq VAR_TEMP_1, 0, PalletTown_EventScript_OakLeadPlayerToLabLeft call_if_eq VAR_TEMP_1, 1, PalletTown_EventScript_OakLeadPlayerToLabRight opendoor 16, 13 waitdooranim applymovement LOCALID_PROF_OAK, PalletTown_Movement_OakEnterLab applymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerEnterLab waitmovement 0 closedoor 16, 13 waitdooranim setvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1 clearflag FLAG_HIDE_OAK_IN_HIS_LAB setvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 1 setflag FLAG_HIDE_OAK_IN_PALLET_TOWN setflag FLAG_DONT_TRANSITION_MUSIC warp MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6, 12 waitstate releaseall end PalletTown_EventScript_OakEnterLeft:: applymovement LOCALID_PROF_OAK, PalletTown_Movement_OakEnterLeft waitmovement 0 return PalletTown_EventScript_OakEnterRight:: applymovement LOCALID_PROF_OAK, PalletTown_Movement_OakEnterRight waitmovement 0 return PalletTown_EventScript_OakLeadPlayerToLabLeft:: applymovement LOCALID_PROF_OAK, PalletTown_Movement_OakWalkToLabLeft applymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerWalkToLabLeft waitmovement 0 return PalletTown_EventScript_OakLeadPlayerToLabRight:: applymovement LOCALID_PROF_OAK, PalletTown_Movement_OakWalkToLabRight applymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerWalkToLabRight waitmovement 0 return PalletTown_Movement_OakEnterLeft:: walk_up walk_up walk_right walk_up walk_up walk_right walk_up walk_up step_end PalletTown_Movement_OakEnterRight:: walk_right walk_up walk_up walk_right walk_up walk_up walk_right walk_up walk_up step_end .macro walk_to_lab walk_left walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_right walk_right walk_right walk_right .endm PalletTown_Movement_OakWalkToLabLeft:: walk_down walk_to_lab walk_right walk_in_place_faster_up step_end PalletTown_Movement_OakWalkToLabRight:: walk_down walk_left walk_to_lab walk_right walk_in_place_faster_up step_end PalletTown_Movement_OakEnterLab:: walk_up set_invisible step_end PalletTown_Movement_PlayerWalkToLabLeft:: walk_down walk_down walk_to_lab step_end PalletTown_Movement_PlayerWalkToLabRight:: walk_down walk_down walk_left walk_to_lab step_end PalletTown_Movement_PlayerEnterLab:: walk_right walk_up set_invisible step_end PalletTown_EventScript_SignLady:: lock goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 2, PalletTown_EventScript_SignLadyDone goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1, PalletTown_EventScript_SignLadyJustShowedSign goto_if_eq SIGN_LADY_READY, TRUE, PalletTown_EventScript_SignLadyStartShowSign goto_if_set FLAG_TEMP_2, PalletTown_EventScript_SignLadyGoReadSign msgbox PalletTown_Text_HmmIsThatRight applymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer waitmovement 0 playse SE_PIN applymovement LOCALID_SIGN_LADY, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_SIGN_LADY, Common_Movement_Delay48 waitmovement 0 msgbox PalletTown_Text_OhLookLook closemessage call_if_eq VAR_FACING, DIR_EAST, PalletTown_EventScript_SignLadyMoveOutOfWayRight call_if_ne VAR_FACING, DIR_EAST, PalletTown_EventScript_SignLadyMoveOutOfWayLeft copyobjectxytoperm LOCALID_SIGN_LADY setflag FLAG_TEMP_2 release end PalletTown_EventScript_SignLadyMoveOutOfWayRight:: applymovement LOCALID_SIGN_LADY, PalletTown_Movement_SignLadyMoveOutOfWayRight waitmovement 0 return PalletTown_EventScript_SignLadyMoveOutOfWayLeft:: applymovement LOCALID_SIGN_LADY, PalletTown_Movement_SignLadyMoveOutOfWayLeft waitmovement 0 return PalletTown_EventScript_SignLadyDone:: applymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer waitmovement 0 msgbox PalletTown_Text_RaisingMonsToo release end PalletTown_EventScript_SignLadyGoReadSign:: applymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer waitmovement 0 msgbox PalletTown_Text_ReadItReadIt release end PalletTown_EventScript_SignLadyJustShowedSign:: applymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer waitmovement 0 msgbox PalletTown_Text_SignsAreUsefulArentThey release end PalletTown_Movement_SignLadyMoveOutOfWayRight:: walk_right walk_in_place_faster_left step_end PalletTown_Movement_SignLadyMoveOutOfWayLeft:: walk_left walk_in_place_faster_right step_end PalletTown_EventScript_FatMan:: msgbox PalletTown_Text_CanStoreItemsAndMonsInPC, MSGBOX_NPC end PalletTown_EventScript_OaksLabSign:: lockall famechecker FAMECHECKER_OAK, 0 msgbox PalletTown_Text_OakPokemonResearchLab releaseall end PalletTown_EventScript_PlayersHouseSign:: msgbox PalletTown_Text_PlayersHouse, MSGBOX_SIGN end PalletTown_EventScript_RivalsHouseSign:: msgbox PalletTown_Text_RivalsHouse, MSGBOX_SIGN end PalletTown_EventScript_TownSign:: msgbox PalletTown_Text_TownSign, MSGBOX_SIGN end PalletTown_EventScript_TrainerTips:: lockall msgbox PalletTown_Text_PressStartToOpenMenu setvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1 releaseall end PalletTown_EventScript_SignLadyTrigger:: lockall applymovement LOCALID_SIGN_LADY, Common_Movement_WalkInPlaceFasterRight applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 call PalletTown_EventScript_SignLadyShowSign releaseall end PalletTown_EventScript_SignLadyShowSign:: textcolor NPC_TEXT_COLOR_FEMALE msgbox PalletTown_Text_LookCopiedTrainerTipsSign closemessage delay 20 textcolor NPC_TEXT_COLOR_NEUTRAL setflag FLAG_OPENED_START_MENU setvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1 setvar SIGN_LADY_READY, FALSE special SetWalkingIntoSignVars special DisableMsgBoxWalkaway signmsg msgbox PalletTown_Text_PressStartToOpenMenuCopy normalmsg return PalletTown_EventScript_SignLadyStartShowSign:: applymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer waitmovement 0 call PalletTown_EventScript_SignLadyShowSign release end PalletTown_EventScript_MasterYoungster:: lock faceplayer message PalletTown_Text_AskAboutMasterTrainers waitmessage multichoice 13, 5, MULTICHOICE_MASTER_YOUNGSTER, FALSE switch VAR_RESULT case 0, PalletTown_EventScript_WhoAreThey case 1, PalletTown_EventScript_HowDoIBattleThem case 2, PalletTown_EventScript_AboutTitles case 3, PalletTown_EventScript_Nothing case 127, PalletTown_EventScript_Nothing end PalletTown_EventScript_WhoAreThey:: msgbox PalletTown_Text_WhoAreThey, MSGBOX_NPC end PalletTown_EventScript_HowDoIBattleThem:: msgbox PalletTown_Text_HowDoIBattleThem, MSGBOX_NPC end PalletTown_EventScript_AboutTitles:: msgbox PalletTown_Text_AboutTitles, MSGBOX_NPC end PalletTown_EventScript_Nothing:: msgbox PalletTown_Text_Nothing, MSGBOX_NPC end PalletTown_Text_AskAboutMasterTrainers:: .string "What do you want to know about\n" .string "the MASTER TRAINERS?$" PalletTown_Text_WhoAreThey:: .string "The MASTER TRAINERS each focus\n" .string "on training one species of POKéMON.\p" .string "They're always waving at TRAINERS to\n" .string "get a battle going, so you should\l" .string "be able to find them pretty easily.$" PalletTown_Text_HowDoIBattleThem:: .string "If you have the same species of\n" .string "POKéMON as them, you'll be able\l" .string "to battle them, one-on-one.\p" .string "Neither side will be allowed to\n" .string "use items, so it will be a battle\l" .string "of pure skill!\p" .string "If you win, you'll receive a title\n" .string "and you'll be able to use it from\l" .string "that point on.$" PalletTown_Text_AboutTitles:: .string "You can change the title you're\n" .string "using at the game company in\l" .string "CELADON CITY.\p" .string "Show it off during link battles!$" PalletTown_Text_Nothing:: .string "Good luck!$" ================================================ FILE: data/maps/PalletTown/text.inc ================================================ PalletTown_Text_OakDontGoOut:: .string "OAK: Hey! Wait!\n" .string "Don't go out!$" PalletTown_Text_OakGrassUnsafeNeedMon:: .string "OAK: It's unsafe!\n" .string "Wild POKéMON live in tall grass!\p" .string "You need your own POKéMON for\n" .string "your protection.\p" .string "I know!\n" .string "Here, come with me!$" PalletTown_Text_RaisingMonsToo:: .string "I'm raising POKéMON, too.\p" .string "When they get strong, they can\n" .string "protect me.$" PalletTown_Text_CanStoreItemsAndMonsInPC:: .string "Technology is incredible!\p" .string "You can now store and recall items\n" .string "and POKéMON as data via PC.$" PalletTown_Text_OakPokemonResearchLab:: .string "OAK POKéMON RESEARCH LAB$" PalletTown_Text_PlayersHouse:: .string "{PLAYER}'s house$" PalletTown_Text_RivalsHouse:: .string "{RIVAL}'s house$" PalletTown_Text_TownSign:: .string "PALLET TOWN\n" .string "Shades of your journey await!$" PalletTown_Text_OakLetMeSeePokedex:: .string "OAK: Ah, {PLAYER}!\n" .string "You're back, are you?\p" .string "How much have you filled in your\n" .string "POKéDEX?\p" .string "May I see it?\p" .string "Let's see…$" PalletTown_Text_CaughtXPuttingInHonestEffort:: .string "You've caught {STR_VAR_2}…\p" .string "Hm, it looks as if you're putting\n" .string "in an honest effort.\p" .string "There's something I wanted to ask\n" .string "of you, {PLAYER}.\p" .string "Come.\n" .string "Follow me.$" PalletTown_Text_CaughtXImpressiveFollowMe:: .string "You've caught… {STR_VAR_2}!?\n" .string "Now, this is impressive!\p" .string "There's something I wanted to ask\n" .string "of you, {PLAYER}.\p" .string "Come.\n" .string "Follow me.$" PalletTown_Text_OakYouEnjoyingTraveling:: .string "OAK: Ah, {PLAYER}!\n" .string "You seem to be enjoying traveling.\p" .string "Knowing you, {PLAYER}, I can easily\n" .string "imagine you going out to even more\l" .string "exotic locales.\p" .string "Good for you, good for you.\n" .string "Hohoho.$" ================================================ FILE: data/maps/PalletTown_PlayersHouse_1F/map.json ================================================ { "id": "MAP_PALLET_TOWN_PLAYERS_HOUSE_1F", "name": "PalletTown_PlayersHouse_1F", "layout": "LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_1F", "music": "MUS_PALLET", "region_map_section": "MAPSEC_PALLET_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MOM", "x": 8, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_PlayersHouse_1F_EventScript_Mom", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_PALLET_TOWN", "dest_warp_id": "0" }, { "x": 4, "y": 8, "elevation": 3, "dest_map": "MAP_PALLET_TOWN", "dest_warp_id": "0" }, { "x": 10, "y": 2, "elevation": 3, "dest_map": "MAP_PALLET_TOWN_PLAYERS_HOUSE_2F", "dest_warp_id": "0" }, { "x": 3, "y": 9, "elevation": 0, "dest_map": "MAP_PALLET_TOWN", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 6, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_PlayersHouse_1F_EventScript_TV" } ], "level_scaling": "0" } ================================================ FILE: data/maps/PalletTown_PlayersHouse_1F/scripts.inc ================================================ .equ LOCALID_MOM, 1 PalletTown_PlayersHouse_1F_MapScripts:: .byte 0 PalletTown_PlayersHouse_1F_EventScript_Mom:: lock faceplayer goto_if_set FLAG_BEAT_RIVAL_IN_OAKS_LAB, PalletTown_PlayersHouse_1F_EventScript_MomHeal checkplayergender call_if_eq VAR_RESULT, MALE, PalletTown_PlayersHouse_1F_EventScript_MomOakLookingForYouMale call_if_eq VAR_RESULT, FEMALE, PalletTown_PlayersHouse_1F_EventScript_MomOakLookingForYouFemale closemessage applymovement LOCALID_MOM, Common_Movement_FaceOriginalDirection waitmovement 0 release end PalletTown_PlayersHouse_1F_EventScript_MomOakLookingForYouMale:: msgbox PalletTown_PlayersHouse_1F_Text_AllBoysLeaveOakLookingForYou return PalletTown_PlayersHouse_1F_EventScript_MomOakLookingForYouFemale:: msgbox PalletTown_PlayersHouse_1F_Text_AllGirlsLeaveOakLookingForYou return PalletTown_PlayersHouse_1F_EventScript_MomHeal:: msgbox PalletTown_PlayersHouse_1F_Text_YouShouldTakeQuickRest closemessage call EventScript_OutOfCenterPartyHeal msgbox PalletTown_PlayersHouse_1F_Text_LookingGreatTakeCare release end @ Displays special text if interacted with from side or back (which are normally inaccessible) PalletTown_PlayersHouse_1F_EventScript_TV:: lockall goto_if_eq VAR_FACING, DIR_NORTH, PalletTown_PlayersHouse_1F_EventScript_TVScreen msgbox PalletTown_PlayersHouse_1F_Text_OopsWrongSide releaseall end PalletTown_PlayersHouse_1F_EventScript_TVScreen:: checkplayergender call_if_eq VAR_RESULT, MALE, PalletTown_PlayersHouse_1F_EventScript_TVScreenMale call_if_eq VAR_RESULT, FEMALE, PalletTown_PlayersHouse_1F_EventScript_TVScreenFemale releaseall end PalletTown_PlayersHouse_1F_EventScript_TVScreenMale:: msgbox PalletTown_PlayersHouse_1F_Text_MovieOnTVFourBoysOnRailroad return PalletTown_PlayersHouse_1F_EventScript_TVScreenFemale:: msgbox PalletTown_PlayersHouse_1F_Text_MovieOnTVGirlOnBrickRoad return ================================================ FILE: data/maps/PalletTown_PlayersHouse_1F/text.inc ================================================ PalletTown_PlayersHouse_1F_Text_AllBoysLeaveOakLookingForYou:: .string "MOM: …Right.\n" .string "All boys leave home someday.\l" .string "It said so on TV.\p" .string "Oh, yes. PROF. OAK, next door, was\n" .string "looking for you.$" PalletTown_PlayersHouse_1F_Text_AllGirlsLeaveOakLookingForYou:: .string "MOM: …Right.\n" .string "All girls dream of traveling.\l" .string "It said so on TV.\p" .string "Oh, yes. PROF. OAK, next door, was\n" .string "looking for you.$" PalletTown_PlayersHouse_1F_Text_YouShouldTakeQuickRest:: .string "MOM: {PLAYER}!\n" .string "You should take a quick rest.$" PalletTown_PlayersHouse_1F_Text_LookingGreatTakeCare:: .string "MOM: Oh, good! You and your\n" .string "POKéMON are looking great.\l" .string "Take care now!$" PalletTown_PlayersHouse_1F_Text_MovieOnTVFourBoysOnRailroad:: .string "There's a movie on TV.\n" .string "Four boys are walking on railroad\l" .string "tracks.\p" .string "…I better go, too.$" PalletTown_PlayersHouse_1F_Text_MovieOnTVGirlOnBrickRoad:: .string "There's a movie on TV.\n" .string "A girl with her hair in pigtails is\l" .string "walking up a brick road.\p" .string "…I better go, too.$" PalletTown_PlayersHouse_1F_Text_OopsWrongSide:: .string "Oops, wrong side…$" ================================================ FILE: data/maps/PalletTown_PlayersHouse_2F/map.json ================================================ { "id": "MAP_PALLET_TOWN_PLAYERS_HOUSE_2F", "name": "PalletTown_PlayersHouse_2F", "layout": "LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_2F", "music": "MUS_PALLET", "region_map_section": "MAPSEC_PALLET_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 10, "y": 2, "elevation": 3, "dest_map": "MAP_PALLET_TOWN_PLAYERS_HOUSE_1F", "dest_warp_id": "2" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 6, "y": 5, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_PlayersHouse_2F_EventScript_NES" }, { "type": "sign", "x": 1, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_PlayersHouse_2F_EventScript_PC" }, { "type": "sign", "x": 11, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_PlayersHouse_2F_EventScript_Sign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/PalletTown_PlayersHouse_2F/scripts.inc ================================================ PalletTown_PlayersHouse_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PalletTown_PlayersHouse_2F_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PalletTown_PlayersHouse_2F_OnWarp .byte 0 PalletTown_PlayersHouse_2F_OnTransition:: call_if_eq VAR_MAP_SCENE_PALLET_TOWN_PLAYERS_HOUSE_2F, 0, PalletTown_PlayersHouse_2F_EventScript_SetRespawn end PalletTown_PlayersHouse_2F_EventScript_SetRespawn:: setrespawn SPAWN_PALLET_TOWN return PalletTown_PlayersHouse_2F_OnWarp:: map_script_2 VAR_MAP_SCENE_PALLET_TOWN_PLAYERS_HOUSE_2F, 0, PalletTown_PlayersHouse_2F_FirstWarpIn .2byte 0 PalletTown_PlayersHouse_2F_FirstWarpIn:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH setvar VAR_MAP_SCENE_PALLET_TOWN_PLAYERS_HOUSE_2F, 1 end PalletTown_PlayersHouse_2F_EventScript_NES:: msgbox PalletTown_PlayersHouse_2F_Text_PlayedWithNES, MSGBOX_SIGN end PalletTown_PlayersHouse_2F_EventScript_Sign:: msgbox PalletTown_PlayersHouse_2F_Text_PressLRForHelp, MSGBOX_SIGN end PalletTown_PlayersHouse_2F_EventScript_PC:: goto_if_questlog EventScript_ReleaseEnd lockall setvar VAR_0x8004, HELPCONTEXT_BEDROOM_PC special Script_SetHelpContext setvar VAR_0x8004, 1 special AnimatePcTurnOn playse SE_PC_ON msgbox Text_PlayerBootedUpPC special BedroomPC waitstate special SetHelpContextForMap releaseall end EventScript_PalletTown_PlayersHouse_2F_ShutDownPC:: setvar VAR_0x8004, 1 playse SE_PC_OFF special AnimatePcTurnOff special SetHelpContextForMap releaseall end ================================================ FILE: data/maps/PalletTown_PlayersHouse_2F/text.inc ================================================ PalletTown_PlayersHouse_2F_Text_PlayedWithNES:: .string "{PLAYER} played with the NES.\p" .string "…Okay!\n" .string "It's time to go!$" PalletTown_PlayersHouse_2F_Text_PressLRForHelp:: .string "It's a posted notice…\p" .string "If you're confused, ask for HELP!\n" .string "Press the L Button!$" ================================================ FILE: data/maps/PalletTown_ProfessorOaksLab/map.json ================================================ { "id": "MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB", "name": "PalletTown_ProfessorOaksLab", "layout": "LAYOUT_PALLET_TOWN_PROFESSOR_OAKS_LAB", "music": "MUS_OAK_LAB", "region_map_section": "MAPSEC_PALLET_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 3, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_Aide1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "x": 2, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 0, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_Aide3", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_Aide2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PROF_OAK", "x": 6, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_ProfOak", "flag": "FLAG_HIDE_OAK_IN_HIS_LAB" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 8, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_BulbasaurBall", "flag": "FLAG_HIDE_BULBASAUR_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 9, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_SquirtleBall", "flag": "FLAG_HIDE_SQUIRTLE_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 10, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_CharmanderBall", "flag": "FLAG_HIDE_CHARMANDER_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_Rival", "flag": "FLAG_HIDE_RIVAL_IN_LAB" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEDEX", "x": 4, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_Pokedex", "flag": "FLAG_HIDE_POKEDEX" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEDEX", "x": 5, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_ProfessorOaksLab_EventScript_Pokedex", "flag": "FLAG_HIDE_POKEDEX" } ], "warp_events": [ { "x": 6, "y": 12, "elevation": 3, "dest_map": "MAP_PALLET_TOWN", "dest_warp_id": "2" }, { "x": 7, "y": 12, "elevation": 3, "dest_map": "MAP_PALLET_TOWN", "dest_warp_id": "2" }, { "x": 5, "y": 12, "elevation": 3, "dest_map": "MAP_PALLET_TOWN", "dest_warp_id": "2" } ], "coord_events": [ { "type": "trigger", "x": 5, "y": 8, "elevation": 3, "var": "VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB", "var_value": "2", "script": "PalletTown_ProfessorOaksLab_EventScript_LeaveStarterSceneTrigger" }, { "type": "trigger", "x": 6, "y": 8, "elevation": 3, "var": "VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB", "var_value": "2", "script": "PalletTown_ProfessorOaksLab_EventScript_LeaveStarterSceneTrigger" }, { "type": "trigger", "x": 7, "y": 8, "elevation": 3, "var": "VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB", "var_value": "2", "script": "PalletTown_ProfessorOaksLab_EventScript_LeaveStarterSceneTrigger" }, { "type": "trigger", "x": 5, "y": 8, "elevation": 3, "var": "VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB", "var_value": "3", "script": "PalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerLeft" }, { "type": "trigger", "x": 6, "y": 8, "elevation": 3, "var": "VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB", "var_value": "3", "script": "PalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerMid" }, { "type": "trigger", "x": 7, "y": 8, "elevation": 3, "var": "VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB", "var_value": "3", "script": "PalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerRight" } ], "bg_events": [ { "type": "sign", "x": 2, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_ProfessorOaksLab_EventScript_Computer" }, { "type": "sign", "x": 3, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_ProfessorOaksLab_EventScript_Computer" }, { "type": "sign", "x": 6, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_ProfessorOaksLab_EventScript_LeftSign" }, { "type": "sign", "x": 7, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_ProfessorOaksLab_EventScript_RightSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/PalletTown_ProfessorOaksLab/scripts.inc ================================================ .equ LOCALID_PROF_OAK, 4 .equ LOCALID_BULBASAUR_BALL, 5 .equ LOCALID_SQUIRTLE_BALL, 6 .equ LOCALID_CHARMANDER_BALL, 7 .equ LOCALID_RIVAL, 8 .equ LOCALID_POKEDEX_1, 9 .equ LOCALID_POKEDEX_2, 10 .equ PLAYER_STARTER_NUM, VAR_TEMP_1 .equ PLAYER_STARTER_SPECIES, VAR_TEMP_2 .equ RIVAL_STARTER_SPECIES, VAR_TEMP_3 .equ RIVAL_STARTER_ID, VAR_TEMP_4 .equ SHOWED_OAK_COMPLETE_DEX, FLAG_TEMP_2 .equ DECLINED_BATTLE, FLAG_TEMP_3 .equ WON_BATTLE, FLAG_TEMP_4 PalletTown_ProfessorOaksLab_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PalletTown_ProfessorOaksLab_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PalletTown_ProfessorOaksLab_OnWarp map_script MAP_SCRIPT_ON_FRAME_TABLE, PalletTown_ProfessorOaksLab_OnFrame .byte 0 PalletTown_ProfessorOaksLab_OnTransition:: setflag FLAG_VISITED_OAKS_LAB call_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1, PalletTown_ProfessorOaksLab_EventScript_ReadyOakForStarterScene call_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 7, PalletTown_ProfessorOaksLab_EventScript_ReadyOakForNationalDexScene call_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 8, PalletTown_ProfessorOaksLab_EventScript_SetNationalDexSceneFinished call_if_set FLAG_GOT_POKEBALLS_FROM_OAK_AFTER_22_RIVAL, PalletTown_ProfessorOaksLab_EventScript_SetSkipPokeBallCheck end PalletTown_ProfessorOaksLab_EventScript_SetSkipPokeBallCheck:: setflag FLAG_OAK_SKIP_22_RIVAL_CHECK return PalletTown_ProfessorOaksLab_EventScript_SetNationalDexSceneFinished:: setvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 9 return PalletTown_ProfessorOaksLab_EventScript_ReadyOakForStarterScene:: setobjectxyperm LOCALID_PROF_OAK, 6, 11 setobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_UP savebgm MUS_OAK return PalletTown_ProfessorOaksLab_EventScript_ReadyOakForNationalDexScene:: setobjectxyperm LOCALID_PROF_OAK, 6, 11 setobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_UP return PalletTown_ProfessorOaksLab_OnWarp:: map_script_2 VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1, PalletTown_ProfessorOaksLab_EventScript_ReadyPlayerForStarterScene .2byte 0 PalletTown_ProfessorOaksLab_EventScript_ReadyPlayerForStarterScene:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end PalletTown_ProfessorOaksLab_OnFrame:: map_script_2 VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1, PalletTown_ProfessorOaksLab_ChooseStarterScene map_script_2 VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 7, PalletTown_ProfessorOaksLab_EventScript_EnterForNationalDexScene .2byte 0 PalletTown_ProfessorOaksLab_EventScript_EnterForNationalDexScene:: lockall setvar VAR_FACING, DIR_NORTH textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakEnter waitmovement 0 removeobject LOCALID_PROF_OAK setobjectxyperm LOCALID_PROF_OAK, 6, 3 setobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_DOWN clearflag FLAG_HIDE_OAK_IN_HIS_LAB applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerEnter waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_NationalDexScene end PalletTown_ProfessorOaksLab_EventScript_NationalDexScene:: msgbox PalletTown_ProfessorOaksLab_Text_OakSightingsOfRareMons closemessage call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterSouth call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterEastWest call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterEastWest msgbox PalletTown_ProfessorOaksLab_Text_RivalJustLetMeHandleEverything fadedefaultbgm msgbox PalletTown_ProfessorOaksLab_Text_OakNeedYourHelpTooNeedToSeePokedexes call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_PlayerFaceOakNorth call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_PlayerFaceOakWest textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PalletTown_ProfessorOaksLab_Text_OakTookBothPokedexUnits closemessage call EventScript_RestorePrevTextColor call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskSouth call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskEast call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskWest addobject LOCALID_POKEDEX_1 addobject LOCALID_POKEDEX_2 delay 30 msgbox PalletTown_ProfessorOaksLab_Text_OakNowTheseUnitsCanRecordMoreData closemessage removeobject LOCALID_POKEDEX_1 removeobject LOCALID_POKEDEX_2 delay 30 call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverSouth call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverEast call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverWest textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_KEY_ITEM message PalletTown_ProfessorOaksLab_Text_PlayersPokedexWasUpgraded waitmessage waitfanfare call EventScript_RestorePrevTextColor setflag FLAG_SYS_RECEIVED_EXTENDED_DEX callnative HasNationalMonToVarResult compare VAR_RESULT, TRUE call_if_eq PalletTown_ProfessorOaksLab_EventScript_GiveNationalDex msgbox PalletTown_ProfessorOaksLab_Text_OakMustReallyWorkToFillPokedex msgbox PalletTown_ProfessorOaksLab_Text_RivalIllCompleteThePokedex closemessage playbgm MUS_RIVAL_EXIT, 0 call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_RivalExitNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_RivalExit call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_RivalExit call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_RivalExit removeobject LOCALID_RIVAL fadedefaultbgm setvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 8 releaseall end PalletTown_ProfessorOaksLab_EventScript_GiveNationalDex:: special EnableNationalPokedex return PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterNorth:: setobjectxyperm LOCALID_RIVAL, 5, 10 addobject LOCALID_RIVAL playbgm MUS_ENCOUNTER_RIVAL, 0 applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterNorth applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterEastWest:: setobjectxyperm LOCALID_RIVAL, 6, 10 addobject LOCALID_RIVAL playbgm MUS_ENCOUNTER_RIVAL, 0 applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterEastWest applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterSouth:: setobjectxyperm LOCALID_RIVAL, 6, 10 addobject LOCALID_RIVAL playbgm MUS_ENCOUNTER_RIVAL, 0 applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_PlayerFaceOakNorth:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_PlayerFaceOakWest:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskNorth:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDesk waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskSouth:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDeskSouth applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk waitmovement LOCALID_PROF_OAK return PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskEast:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDesk applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDeskEast waitmovement LOCALID_PROF_OAK return PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskWest:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDesk waitmovement 0 return PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDesk:: walk_up walk_left walk_in_place_faster_up delay_16 delay_4 step_end PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDeskSouth:: walk_left walk_left walk_up delay_16 delay_4 step_end PalletTown_ProfessorOaksLab_ChooseStarterScene:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakEnter waitmovement 0 removeobject LOCALID_PROF_OAK setobjectxyperm LOCALID_PROF_OAK, 6, 3 setobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_DOWN clearflag FLAG_HIDE_OAK_IN_HIS_LAB applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerEnter waitmovement 0 applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterUp waitmovement 0 clearflag FLAG_DONT_TRANSITION_MUSIC savebgm MUS_DUMMY fadedefaultbgm msgbox PalletTown_ProfessorOaksLab_Text_RivalFedUpWithWaiting closemessage delay 60 msgbox PalletTown_ProfessorOaksLab_Text_OakThreeMonsChooseOne closemessage delay 30 applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalReact waitmovement 0 msgbox PalletTown_ProfessorOaksLab_Text_RivalNoFairWhatAboutMe msgbox PalletTown_ProfessorOaksLab_Text_OakBePatientRival setvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2 releaseall end PalletTown_ProfessorOaksLab_Movement_OakEnter:: walk_up walk_up walk_up walk_up walk_up walk_up step_end PalletTown_ProfessorOaksLab_Movement_PlayerEnter:: walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up step_end PalletTown_ProfessorOaksLab_Movement_RivalReact:: walk_in_place_up walk_in_place_up step_end PalletTown_ProfessorOaksLab_EventScript_LeaveStarterSceneTrigger:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_PROF_OAK, Common_Movement_FaceDown waitmovement 0 msgbox PalletTown_ProfessorOaksLab_Text_OakHeyDontGoAwayYet closemessage applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerWalkUp waitmovement 0 releaseall end PalletTown_ProfessorOaksLab_Movement_PlayerWalkUp:: walk_up step_end PalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerLeft:: lockall setvar VAR_TEMP_2, 1 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattle end PalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerMid:: lockall setvar VAR_TEMP_2, 2 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattle end PalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerRight:: lockall setvar VAR_TEMP_2, 3 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattle end PalletTown_ProfessorOaksLab_EventScript_RivalBattle:: textcolor NPC_TEXT_COLOR_MALE playbgm MUS_ENCOUNTER_RIVAL, 0 applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox PalletTown_ProfessorOaksLab_Text_RivalLetsCheckOutMons closemessage applymovement LOCALID_PROF_OAK, Common_Movement_FaceDown waitmovement 0 goto_if_eq VAR_STARTER_MON, 0, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmander goto_if_eq VAR_STARTER_MON, 1, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaur goto_if_eq VAR_STARTER_MON, 2, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtle end @ The scripts for the rival approaching the player for battle are a bit bloated because @ both the player and rival can be in 3 different positions, so theres 9 different approaches @ NOTE: Names below refer to the Rival's mon (e.g. for RivalBattleSquirtle, player has Charmander) PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtle:: goto_if_eq VAR_TEMP_2, 1, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleLeft goto_if_eq VAR_TEMP_2, 2, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleMid goto_if_eq VAR_TEMP_2, 3, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleRight end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleLeft:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleLeft waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattleSquirtle end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleMid:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleMid waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattleSquirtle end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleRight:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleRight waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattleSquirtle end PalletTown_ProfessorOaksLab_EventScript_RivalBattleSquirtle:: trainerbattle_earlyrival TRAINER_RIVAL_OAKS_LAB_SQUIRTLE, RIVAL_BATTLE_TUTORIAL, PalletTown_ProfessorOaksLab_Text_RivalDefeat, Text_RivalVictory goto PalletTown_ProfessorOaksLab_EventScript_EndRivalBattle end PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleLeft:: walk_left walk_left walk_left walk_left walk_down walk_down step_end PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleMid:: walk_left walk_left walk_left walk_down walk_down step_end PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleRight:: walk_left walk_left walk_down walk_down step_end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmander:: goto_if_eq VAR_TEMP_2, 1, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderLeft goto_if_eq VAR_TEMP_2, 2, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderMid goto_if_eq VAR_TEMP_2, 3, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderRight end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderLeft:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderLeft waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattleCharmander end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderMid:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderMid waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattleCharmander end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderRight:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderRight waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattleCharmander end PalletTown_ProfessorOaksLab_EventScript_RivalBattleCharmander:: trainerbattle_earlyrival TRAINER_RIVAL_OAKS_LAB_CHARMANDER, RIVAL_BATTLE_TUTORIAL, PalletTown_ProfessorOaksLab_Text_RivalDefeat, Text_RivalVictory goto PalletTown_ProfessorOaksLab_EventScript_EndRivalBattle end PalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderLeft:: walk_left walk_left walk_left walk_left walk_left walk_down walk_down step_end PalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderMid:: walk_left walk_left walk_left walk_left walk_down walk_down step_end PalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderRight:: walk_left walk_left walk_left walk_down walk_down step_end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaur:: goto_if_eq VAR_TEMP_2, 1, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurLeft goto_if_eq VAR_TEMP_2, 2, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurMid goto_if_eq VAR_TEMP_2, 3, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurRight end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurLeft:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurLeft waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattleBulbasaur end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurMid:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurMid waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattleBulbasaur end PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurRight:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurRight waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalBattleBulbasaur end PalletTown_ProfessorOaksLab_EventScript_RivalBattleBulbasaur:: trainerbattle_earlyrival TRAINER_RIVAL_OAKS_LAB_BULBASAUR, RIVAL_BATTLE_TUTORIAL, PalletTown_ProfessorOaksLab_Text_RivalDefeat, Text_RivalVictory goto PalletTown_ProfessorOaksLab_EventScript_EndRivalBattle end PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurLeft:: walk_left walk_left walk_left walk_down walk_down step_end PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurMid:: walk_left walk_left walk_down walk_down step_end PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurRight:: walk_left walk_down walk_down step_end PalletTown_ProfessorOaksLab_EventScript_EndRivalBattle:: callnative HealPlayerPartyOak msgbox PalletTown_ProfessorOaksLab_Text_RivalGoToughenMyMon closemessage playbgm MUS_RIVAL_EXIT, 0 call_if_eq VAR_TEMP_2, 1, PalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleLeft call_if_eq VAR_TEMP_2, 2, PalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleMid call_if_eq VAR_TEMP_2, 3, PalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleRight removeobject LOCALID_RIVAL playse SE_EXIT fadedefaultbgm setvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 4 setflag FLAG_BEAT_RIVAL_IN_OAKS_LAB releaseall end PalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleLeft:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleLeft applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattle waitmovement LOCALID_RIVAL return PalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleMid:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleMid applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattle waitmovement LOCALID_RIVAL return PalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleRight:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleRight applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattleRight waitmovement LOCALID_RIVAL return PalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleLeft:: walk_right walk_down walk_down walk_down walk_down walk_down delay_8 step_end PalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleRight:: walk_left walk_down walk_down walk_down walk_down walk_down delay_8 step_end PalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleMid:: walk_right walk_down walk_down walk_down walk_left walk_down walk_down delay_8 step_end PalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattle:: delay_16 delay_8 walk_in_place_faster_right delay_16 walk_in_place_faster_down step_end PalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattleRight:: delay_16 delay_8 walk_in_place_faster_left delay_16 walk_in_place_faster_down step_end PalletTown_ProfessorOaksLab_EventScript_Rival:: lock faceplayer goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_RivalChoseStarter goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2, PalletTown_ProfessorOaksLab_EventScript_RivalWaitingForStarter msgbox PalletTown_ProfessorOaksLab_Text_RivalGrampsIsntAround release end PalletTown_ProfessorOaksLab_EventScript_RivalWaitingForStarter:: msgbox PalletTown_ProfessorOaksLab_Text_RivalGoChoosePlayer release end PalletTown_ProfessorOaksLab_EventScript_RivalChoseStarter:: msgbox PalletTown_ProfessorOaksLab_Text_RivalMyMonLooksTougher release end PalletTown_ProfessorOaksLab_EventScript_ProfOak:: lock faceplayer goto_if_set SHOWED_OAK_COMPLETE_DEX, PalletTown_ProfessorOaksLab_EventScript_OakJustShownCompleteDex goto_if_set WON_BATTLE, PalletTown_ProfessorOaksLab_EventScript_BattleJustWon call_if_not_defeated TRAINER_MASTER_OAK, PalletTown_ProfessorOaksLab_EventScript_CheckMasterTrainerFlags goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 9, PalletTown_ProfessorOaksLab_EventScript_RatePokedex goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 8, PalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait goto_if_set FLAG_SYS_GAME_CLEAR, PalletTown_ProfessorOaksLab_EventScript_TryStartNationalDexScene goto_if_eq VAR_MAP_SCENE_CERULEAN_CITY_RIVAL, 1, PalletTown_ProfessorOaksLab_EventScript_RatePokedex goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6, PalletTown_ProfessorOaksLab_EventScript_RatePokedexOrTryGiveBalls goto_if_ge VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 1, PalletTown_ProfessorOaksLab_EventScript_ReceiveDexScene goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 4, PalletTown_ProfessorOaksLab_EventScript_OakBattleMonForItToGrow goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_OakCanReachNextTownWithMon msgbox PalletTown_ProfessorOaksLab_Text_OakWhichOneWillYouChoose release end PalletTown_ProfessorOaksLab_EventScript_CheckMasterTrainerFlags:: callnative CheckAllMasterTrainerFlags goto_if_eq VAR_RESULT, TRUE, PalletTown_ProfessorOaksLab_EventScript_AskBattle return PalletTown_ProfessorOaksLab_EventScript_AskBattle:: msgbox PalletTown_ProfessorOaksLab_Text_AskBattle, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, PalletTown_ProfessorOaksLab_EventScript_MasterBattle msgbox PalletTown_ProfessorOaksLab_Text_AtLeastLetMe call PokedexRating_EventScript_Rate goto_if_set FLAG_OAK_SAW_DEX_COMPLETION, PalletTown_ProfessorOaksLab_EventScript_DexCompleted release end PalletTown_ProfessorOaksLab_Text_AskBattle:: .string "OAK: Ah, {PLAYER}!\n" .string "It's been a long while.\l" .string "You certainly look more impressive.\p" .string "I heard about your conquest of the\n" .string "MASTER TRAINERS around KANTO,\l" .string "it's just fantastic!\p" .string "Your dedication, trust, and love for\n" .string "your POKéMON is truly outstanding!\p" .string "It's been quite a while since I've\n" .string "had a battle myself…\p" .string "Would you care to have a match\n" .string "with me and my old friends?$" PalletTown_ProfessorOaksLab_Text_AtLeastLetMe:: .string "Then let me see how your POKéDEX\n" .string "is coming along while you're here.\p" .string "Here, let me take a look.$" PalletTown_ProfessorOaksLab_EventScript_MasterBattle:: msgbox PalletTown_ProfessorOaksLab_Text_StartBattle waitmessage closemessage trainerbattle_no_intro TRAINER_MASTER_OAK, PalletTown_ProfessorOaksLab_Text_OakDefeat setflag WON_BATTLE msgbox PalletTown_ProfessorOaksLab_Text_WonBattle message PalletTown_ProfessorOaksLab_Text_GrandMaster_EarnTitle waitmessage playfanfare MUS_EVOLVED waitfanfare waitbuttonpress release end PalletTown_ProfessorOaksLab_Text_StartBattle:: .string "Let's see how you fare against\n" .string "POKéMON with this much experience\l" .string "in battle!$" PalletTown_ProfessorOaksLab_Text_OakDefeat:: .string "OAK: Amazing, {PLAYER}.\n" .string "You and your POKéMON are excellent.\l" .string "I was right in my assessment of you.$" PalletTown_ProfessorOaksLab_Text_WonBattle:: .string "OAK: {PLAYER}…\p" .string "First, you registered every POKéMON\n" .string "here in KANTO in your POKéDEX…\p" .string "And then you raised them all, proved\n" .string "mastery over each in battle…\p" .string "I thought that perhaps I could best\n" .string "you with my years of experience\l" .string "and wizened, old POKéMON…\p" .string "…But, at this point, you may know\n" .string "more about bringing POKéMON to\l" .string "their full potential than I do!\p" .string "You could become a POKéMON\n" .string "professor right now!\p" .string "However, I suspect you want to keep\n" .string "training and becoming stronger.\p" .string "For your outstanding achievements,\n" .string "you have more than earned the\l" .string "title of GRAND MASTER!\p" .string "Congratulations, {PLAYER}!$" PalletTown_ProfessorOaksLab_Text_GrandMaster_EarnTitle: .string "{COLOR DARK_GRAY}You have earned the title of\n" .string "GRAND MASTER!$" PalletTown_ProfessorOaksLab_EventScript_BattleJustWon:: msgbox PalletTown_ProfessorOaksLab_Text_BattleJustWon release end PalletTown_ProfessorOaksLab_Text_BattleJustWon:: .string "OAK: I don't think I'll be battling\n" .string "again for a long time.\p" .string "There's a reason my POKéMON and I\n" .string "retired from battling ages ago.$" PalletTown_ProfessorOaksLab_EventScript_OakJustShownCompleteDex:: msgbox PokedexRating_Text_ThankYouMadeDreamReality release end PalletTown_ProfessorOaksLab_EventScript_OakCanReachNextTownWithMon:: msgbox PalletTown_ProfessorOaksLab_Text_OakCanReachNextTownWithMon release end PalletTown_ProfessorOaksLab_EventScript_OakBattleMonForItToGrow:: msgbox PalletTown_ProfessorOaksLab_Text_OakBattleMonForItToGrow release end PalletTown_ProfessorOaksLab_EventScript_ReceiveDexScene:: msgbox PalletTown_ProfessorOaksLab_Text_OakHaveSomethingForMe textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_TMHM message PalletTown_ProfessorOaksLab_Text_DeliveredOaksParcel waitmessage waitfanfare call EventScript_RestorePrevTextColor removeitem ITEM_OAKS_PARCEL msgbox PalletTown_ProfessorOaksLab_Text_OakCustomBallIOrdered playbgm MUS_ENCOUNTER_RIVAL, 0 msgbox PalletTown_ProfessorOaksLab_Text_RivalGramps closemessage call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterSouth call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterEastWest call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterEastWest fadedefaultbgm msgbox PalletTown_ProfessorOaksLab_Text_RivalWhatDidYouCallMeFor closemessage delay 30 playse SE_PIN applymovement LOCALID_PROF_OAK, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_PROF_OAK, Common_Movement_Delay48 waitmovement 0 call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalSouth call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalEast call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalWest call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalNorth msgbox PalletTown_ProfessorOaksLab_Text_OakHaveRequestForYouTwo closemessage call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskSouth call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskEast call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskWest msgbox PalletTown_ProfessorOaksLab_Text_OakPokedexOnDesk closemessage delay 40 msgbox PalletTown_ProfessorOaksLab_Text_OakTakeTheseWithYou closemessage applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterUp waitmovement 0 removeobject LOCALID_POKEDEX_1 delay 10 removeobject LOCALID_POKEDEX_2 delay 25 call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverSouth call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverEast call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverWest delay 10 textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_KEY_ITEM message PalletTown_ProfessorOaksLab_Text_ReceivedPokedexFromOak waitmessage waitfanfare call EventScript_RestorePrevTextColor setflag FLAG_SYS_POKEDEX_GET setflag FLAG_SYS_GAME_CLEAR_OLD special SetUnlockedPokedexFlags setvar VAR_MAP_SCENE_POKEMON_CENTER_TEALA, 1 msgbox PalletTown_ProfessorOaksLab_Text_OakCatchMonsForDataTakeThese giveitem_msg PalletTown_ProfessorOaksLab_Text_ReceivedFivePokeBalls, ITEM_POKE_BALL, 5 msgbox PalletTown_ProfessorOaksLab_Text_OakExplainCatching famechecker FAMECHECKER_OAK, 1 msgbox PalletTown_ProfessorOaksLab_Text_OakCompleteMonGuideWasMyDream msgbox PalletTown_ProfessorOaksLab_Text_RivalLeaveItToMeGramps call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerSouth call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerEastWest call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerEastWest msgbox PalletTown_ProfessorOaksLab_Text_RivalTellSisNotToGiveYouMap closemessage playbgm MUS_RIVAL_EXIT, 0 call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_RivalExitNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_RivalExit call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_RivalExit call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_RivalExit removeobject LOCALID_RIVAL fadedefaultbgm setvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6 setvar VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 2 setvar VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 1 setvar VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 1 setvar VAR_MAP_SCENE_ROUTE22, 1 release end PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverNorth:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesOver waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverSouth:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesOverSouth waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverEast:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesOver applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerFaceOakForDexEast waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverWest:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesOver waitmovement 0 return PalletTown_ProfessorOaksLab_Movement_PlayerFaceOakForDexEast:: delay_16 delay_8 walk_in_place_faster_right step_end PalletTown_ProfessorOaksLab_Movement_OakBringDexesOver:: walk_right walk_down step_end PalletTown_ProfessorOaksLab_Movement_OakBringDexesOverSouth:: walk_down walk_right step_end PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskNorth:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakWalkToDesk waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskSouth:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakWalkToDeskSouth applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk waitmovement LOCALID_PROF_OAK return PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskEast:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakWalkToDesk applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDeskEast waitmovement LOCALID_PROF_OAK return PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskWest:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakWalkToDesk waitmovement 0 return PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDeskEast:: delay_16 delay_8 walk_in_place_faster_up step_end PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk:: delay_16 delay_8 walk_in_place_faster_left step_end PalletTown_ProfessorOaksLab_Movement_OakWalkToDesk:: walk_up walk_left delay_16 walk_in_place_faster_down step_end PalletTown_ProfessorOaksLab_Movement_OakWalkToDeskSouth:: walk_left walk_left walk_up delay_16 walk_in_place_faster_right step_end PalletTown_ProfessorOaksLab_EventScript_RatePokedexOrTryGiveBalls:: setvar VAR_0x8004, 0 specialvar VAR_RESULT, GetPokedexCount copyvar VAR_0x8008, VAR_0x8005 copyvar VAR_0x8009, VAR_0x8006 buffernumberstring STR_VAR_1, VAR_0x8008 buffernumberstring STR_VAR_2, VAR_0x8009 goto_if_eq VAR_0x8009, 1, PalletTown_ProfessorOaksLab_EventScript_CheckIfPlayerNeedsBalls @ Player only has starter goto PalletTown_ProfessorOaksLab_EventScript_RatePokedex end PalletTown_ProfessorOaksLab_EventScript_RatePokedex:: call PokedexRating_EventScript_RateInPerson goto_if_set FLAG_OAK_SAW_DEX_COMPLETION, PalletTown_ProfessorOaksLab_EventScript_DexCompleted release end PalletTown_ProfessorOaksLab_EventScript_DexCompleted:: closemessage delay 40 message PokedexRating_Text_Wroooaaarrr waitmessage call_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_OakExcitedNorth call_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_OakExcitedSouth call_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_OakExcitedEast call_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_OakExcitedWest applymovement LOCALID_PROF_OAK, Common_Movement_FacePlayer waitmovement 0 closemessage delay 70 msgbox PokedexRating_Text_ThankYouMadeDreamReality setflag SHOWED_OAK_COMPLETE_DEX release end PalletTown_ProfessorOaksLab_EventScript_OakExcitedNorth:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakExcitedNorth waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_OakExcitedSouth:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakExcitedSouth waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_OakExcitedEast:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakExcitedEast waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_OakExcitedWest:: applymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakExcitedWest waitmovement 0 return PalletTown_ProfessorOaksLab_Movement_OakExcitedNorth:: walk_in_place_down walk_in_place_fast_down walk_in_place_down walk_in_place_down walk_in_place_fast_down walk_in_place_down step_end PalletTown_ProfessorOaksLab_Movement_OakExcitedSouth:: walk_in_place_up walk_in_place_fast_up walk_in_place_up walk_in_place_up walk_in_place_fast_up walk_in_place_up step_end PalletTown_ProfessorOaksLab_Movement_OakExcitedEast:: walk_in_place_left walk_in_place_fast_left walk_in_place_left walk_in_place_left walk_in_place_fast_left walk_in_place_left step_end PalletTown_ProfessorOaksLab_Movement_OakExcitedWest:: walk_in_place_right walk_in_place_fast_right walk_in_place_right walk_in_place_right walk_in_place_fast_right walk_in_place_right step_end @ Unused PalletTown_ProfessorOaksLab_Movement_Search: walk_left walk_in_place_faster_down delay_8 walk_in_place_faster_right delay_8 walk_in_place_faster_up delay_8 walk_in_place_faster_left delay_8 walk_in_place_faster_down delay_8 walk_right walk_right walk_in_place_faster_up delay_8 walk_in_place_faster_left delay_8 walk_in_place_faster_down delay_8 walk_in_place_faster_right delay_8 walk_in_place_faster_up delay_8 walk_left step_end @ Unused PalletTown_ProfessorOaksLab_Movement_VerticalPacing: walk_up walk_down walk_down walk_in_place_down walk_up delay_16 delay_16 delay_16 step_end PalletTown_ProfessorOaksLab_EventScript_TryStartNationalDexScene:: call PokedexRating_EventScript_RateInPerson closemessage goto_if_lt VAR_0x8009, 60, PalletTown_ProfessorOaksLab_EventScript_DontStartNationalDexScene goto_if_unset FLAG_WORLD_MAP_ONE_ISLAND, PalletTown_ProfessorOaksLab_EventScript_DontStartNationalDexScene delay 30 msgbox PalletTown_ProfessorOaksLab_Text_OakFavorToAskYouPlayer goto PalletTown_ProfessorOaksLab_EventScript_NationalDexScene end PalletTown_ProfessorOaksLab_EventScript_DontStartNationalDexScene:: release end PalletTown_ProfessorOaksLab_EventScript_CheckIfPlayerNeedsBalls:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording goto_if_set FLAG_OAK_SKIP_22_RIVAL_CHECK, PalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait goto_if_set FLAG_GOT_POKEBALLS_FROM_OAK_AFTER_22_RIVAL, PalletTown_ProfessorOaksLab_EventScript_PlayerAlreadyGotBalls checkitem ITEM_POKE_BALL goto_if_eq VAR_RESULT, FALSE, PalletTown_ProfessorOaksLab_EventScript_PlayerOutOfBalls goto PalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait end PalletTown_ProfessorOaksLab_EventScript_PlayerOutOfBalls:: goto_if_ge VAR_MAP_SCENE_ROUTE22, 2, PalletTown_ProfessorOaksLab_EventScript_GivePlayerMoreBalls goto PalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait end PalletTown_ProfessorOaksLab_EventScript_GivePlayerMoreBalls:: msgbox PalletTown_ProfessorOaksLab_Text_OakAddedNothingToPokedex giveitem_msg PalletTown_ProfessorOaksLab_Text_ReceivedFivePokeBalls, ITEM_POKE_BALL, 5 setflag FLAG_GOT_POKEBALLS_FROM_OAK_AFTER_22_RIVAL release end PalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait:: msgbox PalletTown_ProfessorOaksLab_Text_OakMonsAroundWorldWait release end PalletTown_ProfessorOaksLab_EventScript_PlayerAlreadyGotBalls:: msgbox PalletTown_ProfessorOaksLab_Text_OakComeSeeMeSometime release end PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterNorth:: setobjectxyperm LOCALID_RIVAL, 5, 10 addobject LOCALID_RIVAL applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterNorth applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterEastWest:: setobjectxyperm LOCALID_RIVAL, 6, 10 addobject LOCALID_RIVAL applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterEastWest applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterSouth:: setobjectxyperm LOCALID_RIVAL, 6, 10 addobject LOCALID_RIVAL applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalSouth:: applymovement LOCALID_PROF_OAK, Common_Movement_FacePlayer waitmovement 0 delay 15 applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalWest:: applymovement LOCALID_PROF_OAK, Common_Movement_FacePlayer waitmovement 0 delay 15 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalEast:: applymovement LOCALID_PROF_OAK, Common_Movement_FacePlayer waitmovement 0 delay 15 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerNorth:: applymovement LOCALID_RIVAL, Common_Movement_FacePlayer applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerSouth:: applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterUp applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerEastWest:: applymovement LOCALID_RIVAL, Common_Movement_FacePlayer applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_RivalExitNorth:: applymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterEastWest applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExit waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_RivalExit:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExit waitmovement 0 return PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalNorth:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterEastWest:: delay_4 walk_in_place_faster_down step_end PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterNorth:: walk_in_place_faster_down delay_16 delay_16 delay_16 delay_16 delay_16 delay_8 walk_in_place_faster_left step_end PalletTown_ProfessorOaksLab_Movement_RivalEnter:: walk_up walk_up walk_up walk_up walk_up walk_up step_end PalletTown_ProfessorOaksLab_Movement_RivalExit:: walk_down walk_down walk_down walk_down walk_down walk_down step_end PalletTown_ProfessorOaksLab_EventScript_BulbasaurBall:: lock faceplayer setvar PLAYER_STARTER_NUM, 0 setvar PLAYER_STARTER_SPECIES, SPECIES_BULBASAUR setvar RIVAL_STARTER_SPECIES, SPECIES_CHARMANDER setvar RIVAL_STARTER_ID, LOCALID_CHARMANDER_BALL goto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_LastPokeBall goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2, PalletTown_ProfessorOaksLab_EventScript_ConfirmStarterChoice msgbox PalletTown_ProfessorOaksLab_Text_ThoseArePokeBalls release end PalletTown_ProfessorOaksLab_EventScript_ConfirmStarterChoice:: applymovement LOCALID_PROF_OAK, Common_Movement_FaceRight waitmovement 0 showmonpic PLAYER_STARTER_SPECIES, 10, 3 textcolor NPC_TEXT_COLOR_MALE goto_if_eq PLAYER_STARTER_NUM, 0, PalletTown_ProfessorOaksLab_EventScript_ConfirmBulbasaur goto_if_eq PLAYER_STARTER_NUM, 1, PalletTown_ProfessorOaksLab_EventScript_ConfirmSquirtle goto_if_eq PLAYER_STARTER_NUM, 2, PalletTown_ProfessorOaksLab_EventScript_ConfirmCharmander end PalletTown_ProfessorOaksLab_EventScript_ConfirmBulbasaur:: msgbox PalletTown_ProfessorOaksLab_Text_OakChoosingBulbasaur, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, PalletTown_ProfessorOaksLab_EventScript_ChoseStarter goto_if_eq VAR_RESULT, NO, PalletTown_ProfessorOaksLab_EventScript_DeclinedStarter end PalletTown_ProfessorOaksLab_EventScript_ConfirmSquirtle:: msgbox PalletTown_ProfessorOaksLab_Text_OakChoosingSquirtle, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, PalletTown_ProfessorOaksLab_EventScript_ChoseStarter goto_if_eq VAR_RESULT, NO, PalletTown_ProfessorOaksLab_EventScript_DeclinedStarter end PalletTown_ProfessorOaksLab_EventScript_ConfirmCharmander:: msgbox PalletTown_ProfessorOaksLab_Text_OakChoosingCharmander, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, PalletTown_ProfessorOaksLab_EventScript_ChoseStarter goto_if_eq VAR_RESULT, NO, PalletTown_ProfessorOaksLab_EventScript_DeclinedStarter end PalletTown_ProfessorOaksLab_EventScript_DeclinedStarter:: hidemonpic release end PalletTown_ProfessorOaksLab_EventScript_ChoseStarter:: hidemonpic removeobject VAR_LAST_TALKED msgbox PalletTown_ProfessorOaksLab_Text_OakThisMonIsEnergetic call EventScript_RestorePrevTextColor setflag FLAG_SYS_POKEMON_GET setflag FLAG_PALLET_LADY_NOT_BLOCKING_SIGN givemon PLAYER_STARTER_SPECIES, 5 copyvar VAR_STARTER_MON, PLAYER_STARTER_NUM bufferspeciesname STR_VAR_1, PLAYER_STARTER_SPECIES message PalletTown_ProfessorOaksLab_Text_ReceivedMonFromOak waitmessage playfanfare MUS_OBTAIN_KEY_ITEM waitfanfare callnative SetLastViewedPokedexEntry callnative CheckNuzlockeMode compare VAR_RESULT, TRUE goto_if_eq EventScript_GiveNicknameToStarter msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_GiveNicknameToStarter goto_if_eq VAR_RESULT, NO, PalletTown_ProfessorOaksLab_EventScript_RivalPicksStarter end EventScript_GiveNicknameToStarter:: setvar VAR_0x8004, 0 call EventScript_ChangePokemonNickname goto PalletTown_ProfessorOaksLab_EventScript_RivalPicksStarter end PalletTown_ProfessorOaksLab_EventScript_RivalPicksStarter:: closemessage goto_if_eq PLAYER_STARTER_NUM, 0, PalletTown_ProfessorOaksLab_EventScript_RivalWalksToCharmander goto_if_eq PLAYER_STARTER_NUM, 1, PalletTown_ProfessorOaksLab_EventScript_RivalWalksToBulbasaur goto_if_eq PLAYER_STARTER_NUM, 2, PalletTown_ProfessorOaksLab_EventScript_RivalWalksToSquirtle end PalletTown_ProfessorOaksLab_EventScript_RivalWalksToCharmander:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalWalksToCharmander waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalTakesStarter end PalletTown_ProfessorOaksLab_EventScript_RivalWalksToSquirtle:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalWalksToSquirtle waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalTakesStarter end PalletTown_ProfessorOaksLab_EventScript_RivalWalksToBulbasaur:: applymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalWalksToBulbasaur waitmovement 0 goto PalletTown_ProfessorOaksLab_EventScript_RivalTakesStarter end PalletTown_ProfessorOaksLab_EventScript_RivalTakesStarter:: textcolor NPC_TEXT_COLOR_MALE msgbox PalletTown_ProfessorOaksLab_Text_RivalIllTakeThisOneThen removeobject RIVAL_STARTER_ID textcolor NPC_TEXT_COLOR_NEUTRAL bufferspeciesname STR_VAR_1, RIVAL_STARTER_SPECIES message PalletTown_ProfessorOaksLab_Text_RivalReceivedMonFromOak waitmessage playfanfare MUS_OBTAIN_KEY_ITEM waitfanfare setvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3 call_if_set FLAG_OPENED_START_MENU, PalletTown_ProfessorOaksLab_EventScript_ReadyEndSignLadyScene release end PalletTown_ProfessorOaksLab_EventScript_ReadyEndSignLadyScene:: setvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1 return PalletTown_ProfessorOaksLab_Movement_RivalWalksToCharmander:: walk_down walk_down walk_right walk_right walk_right walk_right walk_right walk_up step_end PalletTown_ProfessorOaksLab_Movement_RivalWalksToSquirtle:: walk_down walk_right walk_right walk_right walk_right walk_in_place_faster_up step_end PalletTown_ProfessorOaksLab_Movement_RivalWalksToBulbasaur:: walk_down walk_right walk_right walk_right walk_in_place_faster_up step_end PalletTown_ProfessorOaksLab_EventScript_SquirtleBall:: lock faceplayer setvar PLAYER_STARTER_NUM, 1 setvar PLAYER_STARTER_SPECIES, SPECIES_SQUIRTLE setvar RIVAL_STARTER_SPECIES, SPECIES_BULBASAUR setvar RIVAL_STARTER_ID, LOCALID_BULBASAUR_BALL goto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_LastPokeBall goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2, PalletTown_ProfessorOaksLab_EventScript_ConfirmStarterChoice msgbox PalletTown_ProfessorOaksLab_Text_ThoseArePokeBalls release end PalletTown_ProfessorOaksLab_EventScript_CharmanderBall:: lock faceplayer setvar PLAYER_STARTER_NUM, 2 setvar PLAYER_STARTER_SPECIES, SPECIES_CHARMANDER setvar RIVAL_STARTER_SPECIES, SPECIES_SQUIRTLE setvar RIVAL_STARTER_ID, LOCALID_SQUIRTLE_BALL goto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_LastPokeBall goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2, PalletTown_ProfessorOaksLab_EventScript_ConfirmStarterChoice msgbox PalletTown_ProfessorOaksLab_Text_ThoseArePokeBalls release end PalletTown_ProfessorOaksLab_EventScript_LastPokeBall:: msgbox PalletTown_ProfessorOaksLab_Text_OaksLastMon release end PalletTown_ProfessorOaksLab_EventScript_Aide1:: lock faceplayer goto_if_set FLAG_SYS_GAME_CLEAR, PalletTown_ProfessorOaksLab_EventScript_Aide1GameClear msgbox PalletTown_ProfessorOaksLab_Text_StudyAsOaksAide release end PalletTown_ProfessorOaksLab_EventScript_Aide1GameClear:: famechecker FAMECHECKER_OAK, 5 msgbox PalletTown_ProfessorOaksLab_Text_OakIsGoingToHaveRadioShow release end PalletTown_ProfessorOaksLab_EventScript_Aide2:: lock faceplayer goto_if_set FLAG_SYS_GAME_CLEAR, PalletTown_ProfessorOaksLab_EventScript_Aide2GameClear msgbox PalletTown_ProfessorOaksLab_Text_StudyAsOaksAide release end PalletTown_ProfessorOaksLab_EventScript_Aide2GameClear:: famechecker FAMECHECKER_DAISY, 0 msgbox PalletTown_ProfessorOaksLab_Text_DaisyWillGroomMons release end PalletTown_ProfessorOaksLab_EventScript_Aide3:: lock faceplayer famechecker FAMECHECKER_OAK, 2 msgbox PalletTown_ProfessorOaksLab_Text_OakIsAuthorityOnMons release end PalletTown_ProfessorOaksLab_EventScript_Pokedex:: msgbox PalletTown_ProfessorOaksLab_Text_BlankEncyclopedia, MSGBOX_NPC end PalletTown_ProfessorOaksLab_EventScript_Computer:: msgbox PalletTown_ProfessorOaksLab_Text_EmailMessage, MSGBOX_SIGN end PalletTown_ProfessorOaksLab_EventScript_LeftSign:: msgbox PalletTown_ProfessorOaksLab_Text_PressStartToOpenMenu, MSGBOX_SIGN end PalletTown_ProfessorOaksLab_EventScript_RightSign:: lockall goto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6, PalletTown_ProfessorOaksLab_EventScript_RightSignAlt msgbox PalletTown_ProfessorOaksLab_Text_SaveOptionInMenu releaseall end PalletTown_ProfessorOaksLab_EventScript_RightSignAlt:: msgbox PalletTown_ProfessorOaksLab_Text_AllMonTypesHaveStrongAndWeakPoints releaseall end ================================================ FILE: data/maps/PalletTown_ProfessorOaksLab/text.inc ================================================ PalletTown_ProfessorOaksLab_Text_RivalGrampsIsntAround:: .string "{RIVAL}: What, it's only {PLAYER}?\n" .string "Gramps isn't around.$" PalletTown_ProfessorOaksLab_Text_RivalFedUpWithWaiting:: .string "{RIVAL}: Gramps!\n" .string "I'm fed up with waiting!$" PalletTown_ProfessorOaksLab_Text_RivalNoFairWhatAboutMe:: .string "{RIVAL}: Hey! Gramps! No fair!\n" .string "What about me?$" PalletTown_ProfessorOaksLab_Text_RivalGoChoosePlayer:: .string "{RIVAL}: Heh, I don't need to be\n" .string "greedy like you. I'm mature!\p" .string "Go ahead and choose, {PLAYER}!$" PalletTown_ProfessorOaksLab_Text_RivalIllTakeThisOneThen:: .string "{RIVAL}: I'll take this one, then!$" PalletTown_ProfessorOaksLab_Text_RivalReceivedMonFromOak:: .string "{RIVAL} received the {STR_VAR_1}\n" .string "from PROF. OAK!$" PalletTown_ProfessorOaksLab_Text_RivalMyMonLooksTougher:: .string "{RIVAL}: My POKéMON looks a lot\n" .string "tougher than yours.$" PalletTown_ProfessorOaksLab_Text_RivalLetsCheckOutMons:: .string "{RIVAL}: Wait, {PLAYER}!\n" .string "Let's check out our POKéMON!\p" .string "Come on, I'll take you on!$" PalletTown_ProfessorOaksLab_Text_RivalDefeat:: .string "WHAT?\n" .string "Unbelievable!\l" .string "I picked the wrong POKéMON!$" @ Also used for early Route 22 battle Text_RivalVictory:: .string "{RIVAL}: Yeah!\n" .string "Am I great or what?$" PalletTown_ProfessorOaksLab_Text_RivalGoToughenMyMon:: .string "{RIVAL}: Okay! I'll make my\n" .string "POKéMON battle to toughen it up!\p" .string "{PLAYER}! Gramps!\n" .string "Smell you later!$" PalletTown_ProfessorOaksLab_Text_RivalGramps:: .string "{RIVAL}: Gramps!$" PalletTown_ProfessorOaksLab_Text_RivalWhatDidYouCallMeFor:: .string "{RIVAL}: I almost forgot!\n" .string "What did you call me for?$" PalletTown_ProfessorOaksLab_Text_RivalLeaveItToMeGramps:: .string "{RIVAL}: All right, Gramps!\n" .string "Leave it all to me!$" PalletTown_ProfessorOaksLab_Text_RivalTellSisNotToGiveYouMap:: .string "{PLAYER}, I hate to say it, but you\n" .string "won't be necessary for this.\p" .string "I know! I'll borrow a TOWN MAP\n" .string "from my sis!\p" .string "I'll tell her not to lend you one,\n" .string "{PLAYER}! Hahaha!\p" .string "Don't bother coming around to\n" .string "my place after this!$" PalletTown_ProfessorOaksLab_Text_OakThreeMonsChooseOne:: .string "OAK: {RIVAL}?\n" .string "Let me think…\p" .string "Oh, that's right, I told you to\n" .string "come! Just wait!\p" .string "Here, {PLAYER}.\p" .string "There are three POKéMON here.\p" .string "Haha!\p" .string "The POKéMON are held inside\n" .string "these POKé BALLS.\p" .string "When I was young, I was a serious\n" .string "POKéMON TRAINER.\p" .string "But now, in my old age, I have\n" .string "only these three left.\p" .string "You can have one.\n" .string "Go on, choose!$" PalletTown_ProfessorOaksLab_Text_OakBePatientRival:: .string "OAK: Be patient, {RIVAL}.\n" .string "You can have one, too!$" PalletTown_ProfessorOaksLab_Text_OakWhichOneWillYouChoose:: .string "OAK: Now, {PLAYER}.\p" .string "Inside those three POKé BALLS are\n" .string "POKéMON.\p" .string "Which one will you choose for\n" .string "yourself?$" PalletTown_ProfessorOaksLab_Text_OakHeyDontGoAwayYet:: .string "OAK: Hey!\n" .string "Don't go away yet!$" PalletTown_ProfessorOaksLab_Text_OakChoosingCharmander:: .string "Ah! CHARMANDER is your choice.\n" .string "You should raise it patiently.\p" .string "So, {PLAYER}, you're claiming the\n" .string "FIRE POKéMON CHARMANDER?$" PalletTown_ProfessorOaksLab_Text_OakChoosingSquirtle:: .string "Hm! SQUIRTLE is your choice.\n" .string "It's one worth raising.\p" .string "So, {PLAYER}, you've decided on the\n" .string "WATER POKéMON SQUIRTLE?$" PalletTown_ProfessorOaksLab_Text_OakChoosingBulbasaur:: .string "I see! BULBASAUR is your choice.\n" .string "It's very easy to raise.\p" .string "So, {PLAYER}, you want to go with\n" .string "the GRASS POKéMON BULBASAUR?$" PalletTown_ProfessorOaksLab_Text_OakThisMonIsEnergetic:: .string "This POKéMON is really quite\n" .string "energetic!$" PalletTown_ProfessorOaksLab_Text_ReceivedMonFromOak:: .string "{PLAYER} received the {STR_VAR_1}\n" .string "from PROF. OAK!$" PalletTown_ProfessorOaksLab_Text_OakCanReachNextTownWithMon:: .string "OAK: If a wild POKéMON appears,\n" .string "your POKéMON can battle it.\p" .string "With it at your side, you should be\n" .string "able to reach the next town.$" PalletTown_ProfessorOaksLab_Text_OakBattleMonForItToGrow:: .string "OAK: {PLAYER}, raise your young\n" .string "POKéMON by making it battle.\p" .string "It has to battle for it to grow.$" PalletTown_ProfessorOaksLab_Text_OakHaveSomethingForMe:: .string "OAK: Oh, {PLAYER}!\n" .string "How is my old POKéMON?\p" .string "Well, it seems to be growing more\n" .string "attached to you.\p" .string "You must be talented as a POKéMON\n" .string "TRAINER.\p" .string "What's that?\n" .string "You have something for me?$" PalletTown_ProfessorOaksLab_Text_DeliveredOaksParcel:: .string "{PLAYER} delivered OAK'S PARCEL.$" PalletTown_ProfessorOaksLab_Text_OakCustomBallIOrdered:: .string "Ah! \n" .string "It's the custom POKé BALL!\p" .string "I had it on order.\n" .string "Thank you!$" PalletTown_ProfessorOaksLab_Text_OakHaveRequestForYouTwo:: .string "OAK: Oh, right!\n" .string "I have a request for you two.$" PalletTown_ProfessorOaksLab_Text_OakPokedexOnDesk:: .string "On the desk there is my invention,\n" .string "the POKéDEX!\p" .string "It automatically records data on\n" .string "POKéMON you've seen or caught.\p" .string "It's a high-tech encyclopedia!$" PalletTown_ProfessorOaksLab_Text_OakTakeTheseWithYou:: .string "OAK: {PLAYER} and {RIVAL}.\n" .string "Take these with you.$" PalletTown_ProfessorOaksLab_Text_ReceivedPokedexFromOak:: .string "{PLAYER} received the POKéDEX\n" .string "from PROF. OAK.$" PalletTown_ProfessorOaksLab_Text_OakCatchMonsForDataTakeThese:: .string "OAK: You can't get detailed data\n" .string "on POKéMON by just seeing them.\p" .string "You must catch them to obtain\n" .string "complete data.\p" .string "So, here are some tools for\n" .string "catching wild POKéMON.$" PalletTown_ProfessorOaksLab_Text_ReceivedFivePokeBalls:: .string "{PLAYER} received five POKé BALLS.$" PalletTown_ProfessorOaksLab_Text_OakExplainCatching:: .string "When a wild POKéMON appears,\n" .string "it's fair game.\p" .string "Just throw a POKé BALL at it and\n" .string "try to catch it!\p" .string "This won't always work, however.\p" .string "A healthy POKéMON can escape.\n" .string "You have to be lucky!$" PalletTown_ProfessorOaksLab_Text_OakCompleteMonGuideWasMyDream:: .string "To make a complete guide on all\n" .string "the POKéMON in the world…\p" .string "That was my dream!\p" .string "But, I'm too old.\n" .string "I can't get the job done.\p" .string "So, I want you two to fulfill my\n" .string "dream for me.\p" .string "Get moving, you two.\p" .string "This is a great undertaking in\n" .string "POKéMON history!$" PalletTown_ProfessorOaksLab_Text_OakMonsAroundWorldWait:: .string "POKéMON around the world wait for\n" .string "you, {PLAYER}!$" PalletTown_ProfessorOaksLab_Text_OakAddedNothingToPokedex:: .string "Ah, {PLAYER}!\n" .string "How is your POKéDEX shaping up?\p" .string "{RIVAL} has already caught some\n" .string "POKéMON and added to the data.\p" .string "So, {PLAYER}, let's have a look at\n" .string "your POKéDEX.\p" .string "…What's the matter?\n" .string "You've added no new data at all.\p" .string "I'll give you these, so do try a\n" .string "little harder.$" PalletTown_ProfessorOaksLab_Text_OakComeSeeMeSometime:: .string "OAK: Come see me sometime.\p" .string "After all, I want to know how your\n" .string "POKéDEX is coming along.$" PalletTown_ProfessorOaksLab_Text_BlankEncyclopedia:: .string "It's like an encyclopedia, but the\n" .string "pages are blank.$" PalletTown_ProfessorOaksLab_Text_ThoseArePokeBalls:: .string "Those are POKé BALLS.\n" .string "They contain POKéMON!$" PalletTown_ProfessorOaksLab_Text_OaksLastMon:: .string "That's PROF. OAK's last POKéMON.$" PalletTown_ProfessorOaksLab_Text_PressStartToOpenMenu:: .string "Press START to open the MENU!$" PalletTown_ProfessorOaksLab_Text_SaveOptionInMenu:: .string "The SAVE option is on the MENU.\n" .string "Use it regularly.$" PalletTown_ProfessorOaksLab_Text_AllMonTypesHaveStrongAndWeakPoints:: .string "All POKéMON types have strong and\n" .string "weak points against others.$" PalletTown_ProfessorOaksLab_Text_EmailMessage:: .string "There's an e-mail message here.\p" .string "…\p" .string "Finally!\n" .string "The ultimate TRAINERS of the\l" .string "POKéMON LEAGUE are ready to\l" .string "take on all comers!\p" .string "Bring your best POKéMON and see\n" .string "how you rate as a TRAINER!\p" .string "POKéMON LEAGUE HQ\n" .string "INDIGO PLATEAU\p" .string "PROF. OAK, please visit us!\n" .string "…$" PalletTown_ProfessorOaksLab_Text_StudyAsOaksAide:: .string "I study POKéMON as PROF. OAK's\n" .string "AIDE.$" PalletTown_ProfessorOaksLab_Text_DaisyWillGroomMons:: .string "Hi, {PLAYER}. I bet you've become\n" .string "good friends with your POKéMON.\p" .string "By the way, did you know about\n" .string "DAISY?\p" .string "If you show DAISY your POKéMON,\n" .string "she can tell how much it likes you.\p" .string "Occasionally, she will even groom\n" .string "a POKéMON for you.\p" .string "This is a secret, so please don't\n" .string "tell anyone.$" PalletTown_ProfessorOaksLab_Text_OakIsGoingToHaveRadioShow:: .string "PROF. OAK is going to have his own\n" .string "radio show soon.\p" .string "The program will be called PROF.\n" .string "OAK's POKéMON SEMINAR.$" PalletTown_ProfessorOaksLab_Text_OakIsAuthorityOnMons:: .string "PROF. OAK may not look like much,\n" .string "but he's the authority on POKéMON.\p" .string "Many POKéMON TRAINERS hold him in\n" .string "high regard.$" PalletTown_ProfessorOaksLab_Text_OakFavorToAskYouPlayer:: .string "Ah, now this is excellent!\p" .string "{PLAYER}, I have another important\n" .string "favor to ask of you.\p" .string "I need you to listen closely.$" PalletTown_ProfessorOaksLab_Text_OakSightingsOfRareMons:: .string "Recently, there have been sightings\n" .string "of many rare POKéMON species.\p" .string "I'm talking about POKéMON that\n" .string "have never been seen in KANTO.\p" .string "I would love to go see things for\n" .string "myself, but I'm much too old.\p" .string "Since I can't do it, {PLAYER}, I'd\n" .string "like you to go in my place.$" PalletTown_ProfessorOaksLab_Text_RivalJustLetMeHandleEverything:: .string "{RIVAL}: Hey, I heard that!\p" .string "Gramps, what's with favoring\n" .string "{PLAYER} over me all the time?\p" .string "I went and collected more POKéMON,\n" .string "and faster, too.\p" .string "You should just let me handle\n" .string "everything.$" PalletTown_ProfessorOaksLab_Text_OakNeedYourHelpTooNeedToSeePokedexes:: .string "OAK: I know, I know.\n" .string "Of course I need your help, too.\p" .string "Now, I need to see both your\n" .string "POKéDEXES.$" PalletTown_ProfessorOaksLab_Text_OakTookBothPokedexUnits:: .string "PROF. OAK took both POKéDEX\n" .string "units.$" PalletTown_ProfessorOaksLab_Text_OakNowTheseUnitsCanRecordMoreData:: .string "… … … … … …\p" .string "… … … … … …\p" .string "…And that's done!\p" .string "Now these units can record data on\n" .string "a lot more POKéMON.$" PalletTown_ProfessorOaksLab_Text_PlayersPokedexWasUpgraded:: .string "{PLAYER}'s POKéDEX was upgraded!$" PalletTown_ProfessorOaksLab_Text_OakMustReallyWorkToFillPokedex:: .string "Now, {PLAYER} and {RIVAL}!\p" .string "This time, you really must work\n" .string "towards filling your POKéDEXES.\p" .string "I urge you to make them the best\n" .string "and the most complete of all time!\p" .string "Truly, this is a monumentally great\n" .string "undertaking in POKéMON history!$" PalletTown_ProfessorOaksLab_Text_RivalIllCompleteThePokedex:: .string "{RIVAL}: Gramps, calm down.\n" .string "Don't get so excited.\p" .string "I'll get the POKéDEX completed,\n" .string "don't you worry about a thing.\p" .string "I think I'll try looking around\n" .string "ONE ISLAND first…\p" .string "Anyways, I'm outta here!$" ================================================ FILE: data/maps/PalletTown_RivalsHouse/map.json ================================================ { "id": "MAP_PALLET_TOWN_RIVALS_HOUSE", "name": "PalletTown_RivalsHouse", "layout": "LAYOUT_PALLET_TOWN_RIVALS_HOUSE", "music": "MUS_PALLET", "region_map_section": "MAPSEC_PALLET_TOWN", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_DAISY", "in_connection": false, "x": 10, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_RivalsHouse_EventScript_Daisy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TOWN_MAP", "in_connection": false, "x": 6, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_RivalsHouse_EventScript_TownMap", "flag": "FLAG_HIDE_TOWN_MAP" }, { "graphics_id": "OBJ_EVENT_GFX_VAR_0", "in_connection": false, "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PalletTown_RivalsHouse_EventScript_Starter", "flag": "FLAG_TEMP_1" } ], "warp_events": [ { "x": 4, "y": 8, "elevation": 3, "dest_map": "MAP_PALLET_TOWN", "dest_warp_id": "1" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_PALLET_TOWN", "dest_warp_id": "1" }, { "x": 3, "y": 8, "elevation": 3, "dest_map": "MAP_PALLET_TOWN", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 12, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_RivalsHouse_EventScript_Bookshelf" }, { "type": "sign", "x": 11, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_RivalsHouse_EventScript_Bookshelf" }, { "type": "sign", "x": 9, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PalletTown_RivalsHouse_EventScript_Picture" } ], "level_scaling": "0" } ================================================ FILE: data/maps/PalletTown_RivalsHouse/scripts.inc ================================================ .equ LOCALID_DAISY, 1 .equ LOCALID_TOWN_MAP, 2 .equ RECEIVED_TOWN_MAP, VAR_TEMP_1 PalletTown_RivalsHouse_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PalletTown_RivalsHouse_OnTransition map_script MAP_SCRIPT_ON_LOAD, PalletTown_RivalsHouse_EventScript_SetStarterGfx .byte 0 PalletTown_RivalsHouse_OnTransition:: call_if_lt VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, PalletTown_RivalsHouse_EventScript_MoveDaisyToTable call_if_ge VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, PalletTown_RivalsHouse_EventScript_AlreadyReceivedTownMap goto_if_unset FLAG_GOT_DAISY_STARTER, PalletTown_RivalsHouse_EventScript_CheckRemoveStarter setflag FLAG_TEMP_1 end PalletTown_RivalsHouse_EventScript_CheckRemoveStarter:: goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, PalletTown_RivalsHouse_EventScript_PositionForStarterGiveaway goto_if_set FLAG_BADGE01_GET, EventScript_ReleaseEnd setflag FLAG_TEMP_1 end PalletTown_RivalsHouse_EventScript_PositionForStarterGiveaway:: setobjectmovementtype LOCALID_DAISY, MOVEMENT_TYPE_FACE_UP setobjectxyperm LOCALID_DAISY, 8, 5 setobjectmovementtype 3, MOVEMENT_TYPE_FACE_DOWN setobjectxyperm 3, 8, 4 end PalletTown_RivalsHouse_EventScript_SetStarterGfx:: call_if_eq VAR_STARTER_MON, 0, PalletTown_RivalsHouse_EventScript_SetSquirtleGfx call_if_eq VAR_STARTER_MON, 1, PalletTown_RivalsHouse_EventScript_SetCharmanderGfx call_if_ge VAR_STARTER_MON, 2, PalletTown_RivalsHouse_EventScript_SetBulbasaurGfx return PalletTown_RivalsHouse_EventScript_SetSquirtleGfx:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_SQUIRTLE return PalletTown_RivalsHouse_EventScript_SetCharmanderGfx:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_CHARMANDER return PalletTown_RivalsHouse_EventScript_SetBulbasaurGfx:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_BULBASAUR return PalletTown_RivalsHouse_EventScript_MoveDaisyToTable:: setobjectmovementtype LOCALID_DAISY, MOVEMENT_TYPE_FACE_RIGHT setobjectxyperm LOCALID_DAISY, 5, 4 return PalletTown_RivalsHouse_EventScript_AlreadyReceivedTownMap:: setvar RECEIVED_TOWN_MAP, TRUE return PalletTown_RivalsHouse_EventScript_Starter:: lock faceplayer goto_if_eq VAR_STARTER_MON, 0, PalletTown_RivalsHouse_EventScript_Squirtle goto_if_eq VAR_STARTER_MON, 1, PalletTown_RivalsHouse_EventScript_Charmander goto_if_ge VAR_STARTER_MON, 2, PalletTown_RivalsHouse_EventScript_Bulbasaur end PalletTown_RivalsHouse_EventScript_Squirtle:: waitse playmoncry SPECIES_SQUIRTLE, 0 msgbox PalletTown_RivalsHouse_Text_Squirtle waitmoncry release end PalletTown_RivalsHouse_Text_Squirtle: .string "SQUIRTLE: Squirtle squirt!$" PalletTown_RivalsHouse_EventScript_Charmander:: waitse playmoncry SPECIES_CHARMANDER, 0 msgbox PalletTown_RivalsHouse_Text_Charmander waitmoncry release end PalletTown_RivalsHouse_Text_Charmander: .string "CHARMANDER: Char char!$" PalletTown_RivalsHouse_EventScript_Bulbasaur:: waitse playmoncry SPECIES_BULBASAUR, 0 msgbox PalletTown_RivalsHouse_Text_Bulbasaur waitmoncry release end PalletTown_RivalsHouse_Text_Bulbasaur: .string "BULBASAUR: Bubba! Zoar!$" PalletTown_RivalsHouse_EventScript_Daisy:: lock faceplayer famechecker FAMECHECKER_DAISY, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, PalletTown_RivalsHouse_EventScript_GiveFinalStarter PalletTown_RivalsHouse_EventScript_DaisyRegular:: goto_if_set FLAG_SYS_GAME_CLEAR, PalletTown_RivalsHouse_EventScript_GroomMon goto_if_eq RECEIVED_TOWN_MAP, TRUE, PalletTown_RivalsHouse_EventScript_PleaseGiveMonsRest goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, PalletTown_RivalsHouse_EventScript_ExplainTownMap goto_if_eq VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 1, PalletTown_RivalsHouse_EventScript_GiveTownMap goto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1, PalletTown_RivalsHouse_EventScript_HeardBattledRival msgbox PalletTown_RivalsHouse_Text_HiBrothersAtLab closemessage applymovement LOCALID_DAISY, Common_Movement_FaceOriginalDirection waitmovement 0 release end PalletTown_RivalsHouse_EventScript_HeardBattledRival:: msgbox PalletTown_RivalsHouse_Text_HeardYouBattledRival release end PalletTown_RivalsHouse_EventScript_GroomMon:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording goto_if_lt VAR_MASSAGE_COOLDOWN_STEP_COUNTER, 500, PalletTown_RivalsHouse_EventScript_RateMonFriendship msgbox PalletTown_RivalsHouse_Text_LikeMeToGroomMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, PalletTown_RivalsHouse_EventScript_DeclineGrooming msgbox PalletTown_RivalsHouse_Text_GroomWhichOne special ChoosePartyMon waitstate lock faceplayer goto_if_ge VAR_0x8004, PARTY_SIZE, PalletTown_RivalsHouse_EventScript_DeclineGrooming specialvar VAR_RESULT, GetPartyMonSpecies goto_if_eq VAR_RESULT, SPECIES_EGG, PalletTown_RivalsHouse_EventScript_CantGroomEgg msgbox PalletTown_RivalsHouse_Text_LookingNiceInNoTime closemessage fadescreen FADE_TO_BLACK playfanfare MUS_RS_HEAL waitfanfare special DaisyMassageServices fadescreen FADE_FROM_BLACK special BufferMonNickname msgbox PalletTown_RivalsHouse_Text_ThereYouGoAllDone release end PalletTown_RivalsHouse_EventScript_CantGroomEgg:: msgbox PalletTown_RivalsHouse_Text_CantGroomAnEgg release end PalletTown_RivalsHouse_EventScript_DeclineGrooming:: msgbox PalletTown_RivalsHouse_Text_DontNeedAnyGrooming release end PalletTown_RivalsHouse_EventScript_RateMonFriendship:: msgbox PalletTown_RivalsHouse_Text_MayISeeFirstMon specialvar VAR_RESULT, GetLeadMonFriendship switch VAR_RESULT case 0, PalletTown_RivalsHouse_EventScript_MonFriendshipLowest case 1, PalletTown_RivalsHouse_EventScript_MonFriendshipLower case 2, PalletTown_RivalsHouse_EventScript_MonFriendshipLow case 3, PalletTown_RivalsHouse_EventScript_MonFriendshipMid case 4, PalletTown_RivalsHouse_EventScript_MonFriendshipHigh case 5, PalletTown_RivalsHouse_EventScript_MonFriendshipHigher case 6, PalletTown_RivalsHouse_EventScript_MonFriendshipHighest end PalletTown_RivalsHouse_EventScript_MonFriendshipLowest:: msgbox PalletTown_RivalsHouse_Text_WhyWouldMonHateYouSoMuch release end PalletTown_RivalsHouse_EventScript_MonFriendshipLower:: msgbox PalletTown_RivalsHouse_Text_DontLikeWayItGlaresAtYou release end PalletTown_RivalsHouse_EventScript_MonFriendshipLow:: msgbox PalletTown_RivalsHouse_Text_NotFamiliarWithYouYet release end PalletTown_RivalsHouse_EventScript_MonFriendshipMid:: msgbox PalletTown_RivalsHouse_Text_ItsWarmingUpToYou release end PalletTown_RivalsHouse_EventScript_MonFriendshipHigh:: msgbox PalletTown_RivalsHouse_Text_ItsQuiteFriendly release end PalletTown_RivalsHouse_EventScript_MonFriendshipHigher:: msgbox PalletTown_RivalsHouse_Text_ItLooksVeryHappy release end PalletTown_RivalsHouse_EventScript_MonFriendshipHighest:: msgbox PalletTown_RivalsHouse_Text_CouldntLoveYouMore release end PalletTown_RivalsHouse_EventScript_PleaseGiveMonsRest:: msgbox PalletTown_RivalsHouse_Text_PleaseGiveMonsRest release end PalletTown_RivalsHouse_EventScript_GiveTownMap:: msgbox PalletTown_RivalsHouse_Text_ErrandForGrandpaThisWillHelp closemessage checkitemspace ITEM_TOWN_MAP goto_if_eq VAR_RESULT, FALSE, PalletTown_RivalsHouse_EventScript_NoRoomForTownMap applymovement LOCALID_DAISY, Common_Movement_WalkInPlaceFasterRight waitmovement 0 removeobject LOCALID_TOWN_MAP setvar VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2 delay 15 applymovement LOCALID_DAISY, Common_Movement_FacePlayer waitmovement 0 delay 12 giveitem_msg PalletTown_RivalsHouse_Text_ReceivedTownMapFromDaisy, ITEM_TOWN_MAP, 1, MUS_OBTAIN_KEY_ITEM release end PalletTown_RivalsHouse_EventScript_NoRoomForTownMap:: msgbox PalletTown_RivalsHouse_Text_DontHaveSpaceForThis release end PalletTown_RivalsHouse_EventScript_ExplainTownMap:: msgbox PalletTown_RivalsHouse_Text_ExplainTownMap release end PalletTown_RivalsHouse_EventScript_TownMap:: msgbox PalletTown_RivalsHouse_Text_ItsBigMapOfKanto, MSGBOX_NPC end PalletTown_RivalsHouse_EventScript_Bookshelf:: msgbox PalletTown_RivalsHouse_Text_ShelvesCrammedFullOfBooks, MSGBOX_SIGN end PalletTown_RivalsHouse_EventScript_Picture:: msgbox PalletTown_RivalsHouse_Text_LovelyAndSweetClefairy, MSGBOX_SIGN end PalletTown_RivalsHouse_EventScript_GiveFinalStarter:: goto_if_set FLAG_GOT_DAISY_STARTER, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_2 PalletTown_RivalsHouse_EventScript_GiveFinalStarter_1: switch VAR_STARTER_MON case 0, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_6 case 1, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_7 case 2, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_8 PalletTown_RivalsHouse_EventScript_GiveFinalStarter_4: msgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_3, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq PalletTown_RivalsHouse_EventScript_GiveFinalStarter_10 specialvar VAR_RESULT, CalculatePlayerPartyCount compare VAR_RESULT, PARTY_SIZE goto_if_eq PalletTown_RivalsHouse_EventScript_GiveFinalStarter_13 textcolor 3 waitse playmoncry VAR_TEMP_2, 0 msgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_6 waitmoncry release turnobject 3, DIR_SOUTH applymovement LOCALID_DAISY, PalletTown_RivalsHouse_Movement_FaceUp waitmovement 0 removeobject 3 delay 16 faceplayer givemon VAR_TEMP_2, 5, ITEM_NONE playfanfare MUS_LEVEL_UP message PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_7 waitmessage waitfanfare callnative CheckNuzlockeMode compare VAR_RESULT, TRUE goto_if_eq PalletTown_RivalsHouse_EventScript_GiveFinalStarter_16 msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_eq PalletTown_RivalsHouse_EventScript_GiveFinalStarter_16 PalletTown_RivalsHouse_EventScript_GiveFinalStarter_15: call EventScript_RestorePrevTextColor setflag FLAG_GOT_DAISY_STARTER msgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_8 release end PalletTown_RivalsHouse_EventScript_GiveFinalStarter_2: goto PalletTown_RivalsHouse_EventScript_DaisyRegular goto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_1 PalletTown_RivalsHouse_EventScript_GiveFinalStarter_6: bufferspeciesname STR_VAR_1, SPECIES_SQUIRTLE bufferstring 1, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_0 setvar VAR_TEMP_2, SPECIES_SQUIRTLE goto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_4 PalletTown_RivalsHouse_EventScript_GiveFinalStarter_7: bufferspeciesname STR_VAR_1, SPECIES_CHARMANDER bufferstring 1, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_1 setvar VAR_TEMP_2, SPECIES_CHARMANDER goto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_4 PalletTown_RivalsHouse_EventScript_GiveFinalStarter_8: bufferspeciesname STR_VAR_1, SPECIES_BULBASAUR bufferstring 1, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_2 setvar VAR_TEMP_2, SPECIES_BULBASAUR goto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_4 PalletTown_RivalsHouse_EventScript_GiveFinalStarter_10: msgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_4 release end PalletTown_RivalsHouse_EventScript_GiveFinalStarter_13: msgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_5 release end PalletTown_RivalsHouse_EventScript_GiveFinalStarter_16: call EventScript_GetGiftMonPartySlot call EventScript_ChangePokemonNickname goto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_15 PalletTown_RivalsHouse_Movement_FaceUp: walk_in_place_faster_up delay_16 walk_in_place_faster_up step_end PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_0: .string "SQUIRTLE: Squirt! Squirtle!$" PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_1: .string "CHARMANDER: Charmander! Char!$" PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_2: .string "BULBASAUR: Zoar! Bubba!$" PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_3: .string "DAISY: Grandpa gave me this\n{STR_VAR_1} to look after, but…\p{STR_VAR_1}'s gotten terribly bored \ncooped up here at home.\p{PLAYER}, I think it would be much\nhappier traveling with you.\pWill you please take {STR_VAR_1}\nwith you on your adventures?$" PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_4: .string "I understand, though {STR_VAR_1}\nlooks disappointed.\pPlease come back if you change\nyour mind.$" PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_5: .string "Oh, you have no room to take\n{STR_VAR_1} with you.\pWe'll wait here until you've\nmade some space.$" PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_6: .string "{STR_VAR_2}$" PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_7: .string "{PLAYER} received a {STR_VAR_1}\nfrom DAISY!$" PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_8: .string "DAISY: Thank you, {PLAYER}!\pTake good care of\n{STR_VAR_1}!$" ================================================ FILE: data/maps/PalletTown_RivalsHouse/text.inc ================================================ PalletTown_RivalsHouse_Text_HiBrothersAtLab:: .string "DAISY: Hi, {PLAYER}!\p" .string "My brother, {RIVAL}, is out at\n" .string "Grandpa's LAB.$" PalletTown_RivalsHouse_Text_HeardYouBattledRival:: .string "DAISY: {PLAYER}, I heard you had\n" .string "a battle against {RIVAL}.\p" .string "I wish I'd seen that!$" PalletTown_RivalsHouse_Text_ErrandForGrandpaThisWillHelp:: .string "Grandpa asked you to run an\n" .string "errand?\p" .string "Gee, that's lazy of him.\n" .string "Here, this will help you.$" PalletTown_RivalsHouse_Text_ReceivedTownMapFromDaisy:: .string "{PLAYER} received a TOWN MAP\n" .string "from DAISY.$" PalletTown_RivalsHouse_Text_DontHaveSpaceForThis:: .string "You don't have space for this in\n" .string "your BAG.$" PalletTown_RivalsHouse_Text_ExplainTownMap:: .string "You can use the TOWN MAP to find\n" .string "out where you are, or check the\l" .string "names of places.$" PalletTown_RivalsHouse_Text_PleaseGiveMonsRest:: .string "DAISY: Just like people, POKéMON\n" .string "are living things.\p" .string "When they get tired, please give\n" .string "them a rest.$" PalletTown_RivalsHouse_Text_ItsBigMapOfKanto:: .string "It's a big map of the KANTO region.\n" .string "Now this would be useful!$" PalletTown_RivalsHouse_Text_ShelvesCrammedFullOfBooks:: .string "The shelves are crammed full of\n" .string "books on POKéMON.$" PalletTown_RivalsHouse_Text_LikeMeToGroomMon:: .string "DAISY: Hi, {PLAYER}!\n" .string "Good timing.\p" .string "I'm about to have some tea.\n" .string "Would you like to join me?\p" .string "Oh, but look.\n" .string "Your POKéMON are a little dirty.\p" .string "Would you like me to groom one?$" PalletTown_RivalsHouse_Text_DontNeedAnyGrooming:: .string "You don't need any grooming done?\n" .string "Okay, we'll just have tea.$" PalletTown_RivalsHouse_Text_GroomWhichOne:: .string "Which one should I groom?$" PalletTown_RivalsHouse_Text_LookingNiceInNoTime:: .string "DAISY: Okay, I'll get it looking\n" .string "nice in no time.$" PalletTown_RivalsHouse_Text_ThereYouGoAllDone:: .string "{FONT_NORMAL}{STR_VAR_1} looks dreamily content…\p" .string "{FONT_FEMALE}DAISY: There you go! All done.\n" .string "See? Doesn't it look nice?\p" .string "Giggle…\n" .string "It's such a cute POKéMON.$" PalletTown_RivalsHouse_Text_CantGroomAnEgg:: .string "Oh, sorry. I honestly can't\n" .string "groom an EGG.$" PalletTown_RivalsHouse_Text_MayISeeFirstMon:: .string "DAISY: Your POKéMON grow to love\n" .string "you if you raise them with love.\p" .string "For example, {PLAYER}, may I see\n" .string "your first POKéMON?$" PalletTown_RivalsHouse_Text_CouldntLoveYouMore:: .string "It couldn't possibly love you\n" .string "any more than it does now.\p" .string "Your POKéMON is happy beyond\n" .string "words.$" PalletTown_RivalsHouse_Text_ItLooksVeryHappy:: .string "It looks very happy.\p" .string "I wish {RIVAL} could see this and\n" .string "learn something from it.$" PalletTown_RivalsHouse_Text_ItsQuiteFriendly:: .string "It's quite friendly with you.\n" .string "Keep being good to it!$" PalletTown_RivalsHouse_Text_ItsWarmingUpToYou:: .string "It's warming up to you.\n" .string "Trust must be growing between you.$" PalletTown_RivalsHouse_Text_NotFamiliarWithYouYet:: .string "It's not quite familiar with you\n" .string "yet.\p" .string "POKéMON are all quite wary when\n" .string "you first get them.$" PalletTown_RivalsHouse_Text_DontLikeWayItGlaresAtYou:: .string "{PLAYER}, I don't like the way it\n" .string "glares at you.\p" .string "Could you try being a little nicer\n" .string "to it?$" PalletTown_RivalsHouse_Text_WhyWouldMonHateYouSoMuch:: .string "…Um, it's not easy for me to say\n" .string "this, but…\p" .string "Is there some reason why your\n" .string "POKéMON would hate you so much?$" PalletTown_RivalsHouse_Text_LovelyAndSweetClefairy:: .string "“The lovely and sweet\n" .string "CLEFAIRY”$" ================================================ FILE: data/maps/PewterCity/map.json ================================================ { "id": "MAP_PEWTER_CITY", "name": "PewterCity", "layout": "LAYOUT_PEWTER_CITY", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_PEWTER_CITY", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": 12, "map": "MAP_ROUTE2" }, { "direction": "right", "offset": 10, "map": "MAP_ROUTE3" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 6, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_EventScript_Lass", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 33, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_EventScript_MuseumGuide", "flag": "FLAG_HIDE_PEWTER_MUSEUM_GUIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 21, "y": 28, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_EventScript_FatMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 33, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_EventScript_BugCatcher", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 42, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_EventScript_GymGuide", "flag": "FLAG_HIDE_PEWTER_CITY_GYM_GUIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 30, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_PEWTER_CITY_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 46, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_EventScript_RunningShoesAide", "flag": "FLAG_HIDE_PEWTER_CITY_RUNNING_SHOES_GUY" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BIRD_KEEPER", "in_connection": false, "x": 28, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Spearow", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 6, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Gloom", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 17, "y": 6, "elevation": 0, "dest_map": "MAP_PEWTER_CITY_MUSEUM_1F", "dest_warp_id": "1" }, { "x": 25, "y": 4, "elevation": 0, "dest_map": "MAP_PEWTER_CITY_MUSEUM_1F", "dest_warp_id": "3" }, { "x": 15, "y": 16, "elevation": 0, "dest_map": "MAP_PEWTER_CITY_GYM", "dest_warp_id": "1" }, { "x": 28, "y": 18, "elevation": 0, "dest_map": "MAP_PEWTER_CITY_MART", "dest_warp_id": "1" }, { "x": 33, "y": 11, "elevation": 0, "dest_map": "MAP_PEWTER_CITY_HOUSE1", "dest_warp_id": "1" }, { "x": 17, "y": 25, "elevation": 0, "dest_map": "MAP_PEWTER_CITY_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 9, "y": 30, "elevation": 0, "dest_map": "MAP_PEWTER_CITY_HOUSE2", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 42, "y": 21, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY", "var_value": "0", "script": "PewterCity_EventScript_GymGuideTriggerTop" }, { "type": "trigger", "x": 42, "y": 22, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY", "var_value": "0", "script": "PewterCity_EventScript_GymGuideTriggerMid" }, { "type": "trigger", "x": 42, "y": 23, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY", "var_value": "0", "script": "PewterCity_EventScript_GymGuideTriggerBottom" }, { "type": "trigger", "x": 43, "y": 23, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY", "var_value": "0", "script": "PewterCity_EventScript_GymGuideTriggerRight" }, { "type": "trigger", "x": 46, "y": 21, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY", "var_value": "1", "script": "PewterCity_EventScript_RunningShoesAideTriggerTop" }, { "type": "trigger", "x": 46, "y": 22, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY", "var_value": "1", "script": "PewterCity_EventScript_RunningShoesAideTriggerMid" }, { "type": "trigger", "x": 46, "y": 23, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY", "var_value": "1", "script": "PewterCity_EventScript_RunningShoesAideTriggerBottom" } ], "bg_events": [ { "type": "sign", "x": 19, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_EventScript_MuseumSign" }, { "type": "sign", "x": 39, "y": 19, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_EventScript_PoliceNotice" }, { "type": "sign", "x": 11, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_EventScript_GymSign" }, { "type": "sign", "x": 20, "y": 30, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_EventScript_TrainerTips" }, { "type": "sign", "x": 31, "y": 25, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_EventScript_CitySign" }, { "type": "hidden_item", "x": 6, "y": 3, "elevation": 3, "item": "ITEM_POKE_BALL", "flag": "FLAG_HIDDEN_ITEM_PEWTER_CITY_POKE_BALL", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/PewterCity/scripts.inc ================================================ .equ LOCALID_MUSEUM_GUIDE, 2 .equ LOCALID_GYM_GUIDE, 5 .equ LOCALID_AIDE, 7 .set LOCALID_SPEAROW_MASTER, 8 .set LOCALID_GLOOM_MASTER, 9 .set TRAINER, VAR_0x8009 PewterCity_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, PewterCity_MapScript_FixLedgeForMasterTrainer map_script MAP_SCRIPT_ON_TRANSITION, PewterCity_OnTransition .byte 0 PewterCity_MapScript_FixLedgeForMasterTrainer:: goto_if_set FLAG_HIDE_MASTER_TRAINERS, EventScript_ReleaseEnd setmetatile 28, 30, 0x28A, 1 end PewterCity_OnTransition:: setworldmapflag FLAG_WORLD_MAP_PEWTER_CITY setvar VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F, 0 goto PewterCity_MapScript_SetMasterTrainerMovementTypes end PewterCity_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_SPEAROW callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PewterCity_MapScript_SpearowMasterMovementType setvar TRAINER, MASTER_GLOOM callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PewterCity_MapScript_GloomMasterMovementType end PewterCity_MapScript_SpearowMasterMovementType:: setobjectmovementtype LOCALID_SPEAROW_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PewterCity_MapScript_GloomMasterMovementType:: setobjectmovementtype LOCALID_GLOOM_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return @ Impossible to speak to this NPC from a facing dir != DIR_EAST normally, so they arent checked @ Additionally, no movement script exists for facing DIR_SOUTH, which would necessitate walking out of bounds PewterCity_EventScript_GymGuide:: lock faceplayer msgbox PewterCity_Text_BrocksLookingForChallengersFollowMe closemessage playbgm MUS_FOLLOW_ME, 0 call_if_eq VAR_FACING, DIR_EAST, PewterCity_EventScript_WalkToGymEast msgbox PewterCity_Text_GoTakeOnBrock closemessage applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GymGuideExit waitmovement 0 fadedefaultbgm removeobject LOCALID_GYM_GUIDE clearflag FLAG_HIDE_PEWTER_CITY_GYM_GUIDE release end PewterCity_EventScript_WalkToGymEast:: applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWaitForGuideEast applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadEast waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymEast applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymEast waitmovement 0 return @ Unused PewterCity_EventScript_WalkToGymWest:: applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWaitForGuideWest applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadWest waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymWest applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymWest waitmovement 0 return @ Unused PewterCity_EventScript_WalkToGymNorth:: applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWaitForGuideNorth applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadNorth waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymNorth applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymNorth waitmovement 0 return .macro walk_to_gym walk_left walk_left walk_left walk_up walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_right walk_right walk_right walk_right walk_right walk_right walk_right walk_right .endm .macro walk_to_gym_alt walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_down walk_down walk_down walk_down walk_down walk_down walk_right .endm PewterCity_Movement_PlayerWaitForGuideEast:: delay_16 delay_16 delay_4 walk_in_place_faster_down step_end PewterCity_Movement_PlayerWalkToGymEast:: walk_down walk_to_gym step_end PewterCity_Movement_PlayerWaitForGuideWest:: delay_16 step_end PewterCity_Movement_PlayerWalkToGymWest:: walk_left walk_left walk_left walk_left walk_left walk_to_gym_alt step_end PewterCity_Movement_PlayerWaitForGuideNorth:: delay_16 step_end PewterCity_Movement_PlayerWalkToGymNorth:: walk_up walk_left walk_left walk_left walk_left walk_to_gym_alt step_end PewterCity_Movement_GuideMoveToLeadEast:: walk_down walk_left walk_in_place_faster_up walk_in_place_up step_end PewterCity_Movement_GuideWalkToGymEast:: walk_to_gym walk_right walk_in_place_faster_left step_end PewterCity_Movement_GuideMoveToLeadWest:: walk_in_place_right step_end PewterCity_Movement_GuideWalkToGymWest:: walk_left walk_left walk_left walk_left walk_to_gym_alt walk_right walk_in_place_faster_left step_end PewterCity_Movement_GuideMoveToLeadNorth:: walk_in_place_down step_end PewterCity_Movement_GuideWalkToGymNorth:: walk_left walk_left walk_left walk_left walk_to_gym_alt walk_right walk_in_place_faster_left step_end PewterCity_Movement_GymGuideExit:: walk_down walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left step_end PewterCity_EventScript_GymGuideTriggerTop:: lockall setvar VAR_TEMP_1, 0 goto PewterCity_EventScript_GymGuideTrigger end PewterCity_EventScript_GymGuideTriggerMid:: lockall setvar VAR_TEMP_1, 1 goto PewterCity_EventScript_GymGuideTrigger end PewterCity_EventScript_GymGuideTriggerBottom:: lockall setvar VAR_TEMP_1, 2 goto PewterCity_EventScript_GymGuideTrigger end @ This trigger is inaccessible and its corresponding movement script isnt linked PewterCity_EventScript_GymGuideTriggerRight:: lockall setvar VAR_TEMP_1, 3 goto PewterCity_EventScript_GymGuideTrigger end PewterCity_EventScript_GymGuideTrigger:: textcolor NPC_TEXT_COLOR_MALE msgbox PewterCity_Text_BrocksLookingForChallengersFollowMe closemessage playbgm MUS_FOLLOW_ME, 0 call_if_eq VAR_TEMP_1, 0, PewterCity_EventScript_WalkToGymTop call_if_eq VAR_TEMP_1, 1, PewterCity_EventScript_WalkToGymMid call_if_eq VAR_TEMP_1, 2, PewterCity_EventScript_WalkToGymBottom msgbox PewterCity_Text_GoTakeOnBrock closemessage applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GymGuideExit waitmovement 0 fadedefaultbgm removeobject LOCALID_GYM_GUIDE clearflag FLAG_HIDE_PEWTER_CITY_GYM_GUIDE releaseall end PewterCity_EventScript_WalkToGymTop:: applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadTop waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymTop applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymTop waitmovement 0 return PewterCity_EventScript_WalkToGymMid:: applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadMid waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymMid applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymMid waitmovement 0 return PewterCity_EventScript_WalkToGymBottom:: applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadBottom waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymBottom applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymBottom waitmovement 0 return @ Unused PewterCity_EventScript_WalkToGymRight:: applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideApproachPlayerRight waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymRight applymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymRight waitmovement 0 return PewterCity_Movement_PlayerWalkToGymTop:: walk_left walk_to_gym step_end PewterCity_Movement_PlayerWalkToGymMid:: walk_up walk_left walk_to_gym step_end PewterCity_Movement_PlayerWalkToGymBottom:: walk_up walk_up walk_left walk_to_gym step_end PewterCity_Movement_PlayerWalkToGymRight:: walk_left walk_left walk_left walk_left walk_up walk_left walk_left walk_left walk_up walk_up walk_to_gym_alt step_end PewterCity_Movement_GuideMoveToLeadTop:: walk_left walk_down walk_in_place_faster_right walk_in_place_right step_end PewterCity_Movement_GuideMoveToLeadMid:: walk_down walk_in_place_down step_end PewterCity_Movement_GuideMoveToLeadBottom:: walk_down walk_down walk_in_place_down step_end PewterCity_Movement_GuideApproachPlayerRight:: walk_down walk_down walk_right walk_down walk_right walk_in_place_right step_end PewterCity_Movement_GuideWalkToGymTop:: walk_to_gym walk_right walk_in_place_faster_left step_end PewterCity_Movement_GuideWalkToGymMid:: walk_left walk_to_gym walk_right walk_in_place_faster_left step_end PewterCity_Movement_GuideWalkToGymBottom:: walk_up walk_left walk_to_gym walk_right walk_in_place_faster_left step_end PewterCity_Movement_GuideWalkToGymRight:: walk_left walk_left walk_left walk_up walk_left walk_left walk_left walk_up walk_up walk_to_gym_alt walk_right walk_in_place_faster_left step_end PewterCity_EventScript_Lass:: msgbox PewterCity_Text_ClefairyCameFromMoon, MSGBOX_NPC end PewterCity_EventScript_MuseumGuide:: lock faceplayer msgbox PewterCity_Text_DidYouCheckOutMuseum, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, PewterCity_EventScript_CheckedOutMuseum msgbox PewterCity_Text_ReallyYouHaveToGo closemessage delay 10 playbgm MUS_FOLLOW_ME, 0 call_if_eq VAR_FACING, DIR_NORTH, PewterCity_EventScript_LeadToMuseumNorth call_if_eq VAR_FACING, DIR_SOUTH, PewterCity_EventScript_LeadToMuseumSouth call_if_eq VAR_FACING, DIR_WEST, PewterCity_EventScript_LeadToMuseumWest call_if_eq VAR_FACING, DIR_EAST, PewterCity_EventScript_LeadToMuseumEast msgbox PewterCity_Text_ThisIsTheMuseum closemessage delay 10 applymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_MuseumGuideExit waitmovement 0 fadedefaultbgm removeobject LOCALID_MUSEUM_GUIDE clearflag FLAG_HIDE_PEWTER_MUSEUM_GUIDE release end PewterCity_EventScript_LeadToMuseumNorth:: applymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_GuideWalkToMuseumNorth applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToMuseumNorth waitmovement 0 return PewterCity_EventScript_LeadToMuseumSouth:: applymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_GuideWalkToMuseumSouth applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToMuseumSouth waitmovement 0 return PewterCity_EventScript_LeadToMuseumWest:: applymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_GuideWalkToMuseumWest applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToMuseumWest waitmovement 0 return PewterCity_EventScript_LeadToMuseumEast:: applymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_GuideWalkToMuseumEast applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToMuseumEast waitmovement 0 return PewterCity_EventScript_CheckedOutMuseum:: msgbox PewterCity_Text_WerentThoseFossilsAmazing release end .macro walk_to_museum walk_up walk_up walk_up walk_up walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_up walk_up walk_up walk_up walk_left walk_left walk_left walk_left walk_left walk_left .endm .macro walk_to_museum_south walk_up walk_up walk_up walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_up walk_up walk_up walk_up walk_left walk_left walk_left walk_left walk_left walk_left .endm PewterCity_Movement_PlayerWalkToMuseumNorth:: walk_up walk_to_museum delay_8 walk_in_place_faster_up step_end PewterCity_Movement_GuideWalkToMuseumNorth:: walk_to_museum walk_left walk_in_place_faster_up step_end PewterCity_Movement_PlayerWalkToMuseumSouth:: delay_16 delay_16 walk_left walk_to_museum_south delay_8 walk_in_place_faster_up step_end PewterCity_Movement_GuideWalkToMuseumSouth:: walk_left walk_up walk_to_museum_south walk_left walk_in_place_faster_up step_end PewterCity_Movement_PlayerWalkToMuseumWest:: walk_left walk_to_museum delay_8 walk_in_place_faster_up step_end PewterCity_Movement_GuideWalkToMuseumWest:: walk_to_museum walk_left walk_in_place_faster_up step_end PewterCity_Movement_PlayerWalkToMuseumEast:: walk_right walk_to_museum delay_8 walk_in_place_faster_up step_end PewterCity_Movement_GuideWalkToMuseumEast:: walk_to_museum walk_left walk_in_place_faster_up step_end PewterCity_Movement_MuseumGuideExit:: walk_down walk_right walk_right walk_right walk_right walk_right walk_right walk_right walk_down walk_down walk_down walk_right walk_right walk_right step_end PewterCity_EventScript_FatMan:: lock faceplayer famechecker FAMECHECKER_BROCK, 2 msgbox PewterCity_Text_BrockOnlySeriousTrainerHere release end PewterCity_EventScript_BugCatcher:: lock faceplayer msgbox PewterCity_Text_DoYouKnowWhatImDoing, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, PewterCity_EventScript_KnowWhatTheyreDoing msgbox PewterCity_Text_SprayingRepelToKeepWildMonsOut release end PewterCity_EventScript_KnowWhatTheyreDoing:: msgbox PewterCity_Text_ThatsRightItsHardWork release end PewterCity_EventScript_TrainerTips:: msgbox PewterCity_Text_TrainerTipsEarningEXP, MSGBOX_SIGN end PewterCity_EventScript_PoliceNotice:: msgbox PewterCity_Text_CallPoliceIfInfoOnThieves, MSGBOX_SIGN end PewterCity_EventScript_MuseumSign:: msgbox PewterCity_Text_MuseumOfScience, MSGBOX_SIGN end PewterCity_EventScript_GymSign:: lockall famechecker FAMECHECKER_BROCK, 0 msgbox PewterCity_Text_GymSign releaseall end PewterCity_EventScript_CitySign:: msgbox PewterCity_Text_CitySign, MSGBOX_SIGN end PewterCity_EventScript_RunningShoesAide:: lock faceplayer setvar VAR_TEMP_1, 0 call PewterCity_EventScript_AideGiveRunningShoes release end PewterCity_EventScript_RunningShoesAideTriggerTop:: lockall setvar VAR_TEMP_1, 1 call PewterCity_EventScript_AideGiveRunningShoes releaseall end PewterCity_EventScript_RunningShoesAideTriggerMid:: lockall setvar VAR_TEMP_1, 2 call PewterCity_EventScript_AideGiveRunningShoes releaseall end PewterCity_EventScript_RunningShoesAideTriggerBottom:: lockall setvar VAR_TEMP_1, 3 call PewterCity_EventScript_AideGiveRunningShoes releaseall end PewterCity_EventScript_AideGiveRunningShoes:: textcolor NPC_TEXT_COLOR_MALE call_if_eq VAR_TEMP_1, 1, PewterCity_EventScript_AideNoticePlayer call_if_eq VAR_TEMP_1, 2, PewterCity_EventScript_AideNoticePlayer call_if_eq VAR_TEMP_1, 3, PewterCity_EventScript_AideNoticePlayer waitse playse SE_PIN applymovement LOCALID_AIDE, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_AIDE, Common_Movement_Delay48 waitmovement 0 msgbox PewterCity_Text_OhPlayer call_if_eq VAR_TEMP_1, 0, PewterCity_EventScript_AideApproachPlayer0 call_if_eq VAR_TEMP_1, 1, PewterCity_EventScript_AideApproachPlayer1 call_if_eq VAR_TEMP_1, 2, PewterCity_EventScript_AideApproachPlayer2 call_if_eq VAR_TEMP_1, 3, PewterCity_EventScript_AideApproachPlayer3 msgbox PewterCity_Text_AskedToDeliverThis textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_KEY_ITEM message PewterCity_Text_ReceivedRunningShoesFromAide waitmessage waitfanfare call EventScript_RestorePrevTextColor msgbox PewterCity_Text_MustBeGoingBackToLab closemessage call_if_eq VAR_TEMP_1, 0, PewterCity_EventScript_AideExit0 call_if_eq VAR_TEMP_1, 1, PewterCity_EventScript_AideExit1 call_if_eq VAR_TEMP_1, 2, PewterCity_EventScript_AideExit2 call_if_eq VAR_TEMP_1, 3, PewterCity_EventScript_AideExit3 delay 30 checkplayergender goto_if_eq VAR_RESULT, FEMALE, PewterCity_EventScript_LetterFemale textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PewterCity_Text_RunningShoesLetterFromMom closemessage removeobject LOCALID_AIDE setvar VAR_MAP_SCENE_PEWTER_CITY, 2 return PewterCity_EventScript_LetterFemale:: textcolor 3 msgbox PewterCity_Text_RunningShoesLetterFromMomFemale closemessage removeobject LOCALID_AIDE setvar VAR_MAP_SCENE_PEWTER_CITY, 2 return PewterCity_EventScript_AideNoticePlayer:: applymovement LOCALID_AIDE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @ Aide already at player PewterCity_EventScript_AideApproachPlayer0:: closemessage delay 20 return PewterCity_EventScript_AideApproachPlayer1:: closemessage applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PewterCity_EventScript_AideApproachPlayer2:: closemessage applymovement LOCALID_AIDE, PewterCity_Movement_AideApproachPlayerMid waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PewterCity_EventScript_AideApproachPlayer3:: closemessage applymovement LOCALID_AIDE, PewterCity_Movement_AideApproachPlayerBottom waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PewterCity_EventScript_AideExit0:: applymovement LOCALID_AIDE, PewterCity_Movement_AideExit0 waitmovement 0 return PewterCity_EventScript_AideExit1:: applymovement LOCALID_AIDE, PewterCity_Movement_AideExit1 waitmovement 0 return PewterCity_EventScript_AideExit2:: applymovement LOCALID_AIDE, PewterCity_Movement_AideExit2 waitmovement 0 return PewterCity_EventScript_AideExit3:: applymovement LOCALID_AIDE, PewterCity_Movement_AideExit3 waitmovement 0 return PewterCity_Movement_AideApproachPlayerMid:: delay_4 walk_down step_end PewterCity_Movement_AideApproachPlayerBottom:: delay_4 walk_down walk_down step_end PewterCity_Movement_AideExit0:: walk_down walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left step_end PewterCity_Movement_AideExit1:: walk_left walk_down walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left step_end PewterCity_Movement_AideExit2:: walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left step_end PewterCity_Movement_AideExit3:: walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left step_end @ Unused PewterCity_Movement_WalkInPlaceLeft:: walk_in_place_left step_end ================================================ FILE: data/maps/PewterCity/text.inc ================================================ Text_DreamEaterTeach:: .string "Yawn!\n" .string "I must have dozed off in the sun.\p" .string "I had this weird dream about\n" .string "a DROWZEE eating my dream.\p" .string "And…\n" .string "I learned how to eat dreams…\p" .string "Oogh, this is too spooky!\p" .string "Let me teach it to a POKéMON so\n" .string "I can forget about it!$" Text_DreamEaterDeclined:: .string "…Snore…$" Text_DreamEaterWhichMon:: .string "Which POKéMON wants to learn\n" .string "DREAM EATER?$" Text_DreamEaterTaught:: .string "…ZZZ…\n" .string "I…can't eat…anymore…$" Text_DreamEaterReteach:: .string "Even after teaching you DREAM\n" .string "EATER, I still can't forget how to\l" .string "eat dreams!\p" .string "I'll keep teaching your POKéMON\n" .string "DREAM EATER for ¥5000.$" Text_DreamEaterReteach2:: .string "Do you want me to teach\n" .string "a POKéMON DREAM EATER?$" Text_DreamEaterNotEnoughMoney:: .string "The only thing spookier than\n" .string "DREAM EATER is not having the\l" .string "¥5000 to learn it!\p" .string "I'll be happy to teach it to a\n" .string "POKéMON when you have enough money.$" PewterCity_Text_ClefairyCameFromMoon:: .string "CLEFAIRY came from the moon.\n" .string "That's what the rumor is.\p" .string "They appeared after MOON STONES\n" .string "fell on MT. MOON.$" PewterCity_Text_BrockOnlySeriousTrainerHere:: .string "There aren't many serious POKéMON\n" .string "TRAINERS here.\p" .string "They're all like BUG CATCHERS,\n" .string "you know, just hobbyists.\p" .string "But PEWTER GYM's BROCK isn't like\n" .string "that, not one bit.$" PewterCity_Text_DidYouCheckOutMuseum:: .string "Did you check out the MUSEUM?$" PewterCity_Text_WerentThoseFossilsAmazing:: .string "Weren't those fossils from MT. MOON\n" .string "amazing?$" PewterCity_Text_ReallyYouHaveToGo:: .string "Really?\n" .string "You absolutely have to go!$" PewterCity_Text_ThisIsTheMuseum:: .string "This is it, the MUSEUM.\p" .string "You have to pay to get in, but it's\n" .string "worth it. See you around!$" PewterCity_Text_DoYouKnowWhatImDoing:: .string "Psssst!\n" .string "Do you know what I'm doing?$" PewterCity_Text_ThatsRightItsHardWork:: .string "That's right!\n" .string "It's hard work!$" PewterCity_Text_SprayingRepelToKeepWildMonsOut:: .string "I'm spraying REPEL to keep wild\n" .string "POKéMON out of my garden!$" PewterCity_Text_BrocksLookingForChallengersFollowMe:: .string "You're a TRAINER, right?\p" .string "BROCK's looking for new\n" .string "challengers. Follow me!$" PewterCity_Text_GoTakeOnBrock:: .string "If you have the right stuff,\n" .string "go take on BROCK!$" PewterCity_Text_TrainerTipsEarningEXP:: .string "TRAINER TIPS\p" .string "All POKéMON that appear in battle,\n" .string "however briefly, earn EXP Points.$" PewterCity_Text_CallPoliceIfInfoOnThieves:: .string "NOTICE!\p" .string "Thieves have been stealing POKéMON\n" .string "fossils from MT. MOON.\p" .string "Please call the PEWTER POLICE if\n" .string "you have any information.$" PewterCity_Text_MuseumOfScience:: .string "PEWTER MUSEUM OF SCIENCE$" PewterCity_Text_GymSign:: .string "PEWTER CITY POKéMON GYM\n" .string "LEADER: BROCK\l" .string "The Rock-Solid POKéMON TRAINER!$" PewterCity_Text_CitySign:: .string "PEWTER CITY\n" .string "A Stone Gray City$" PewterCity_Text_OhPlayer:: .string "Oh, {PLAYER}{KUN}!$" PewterCity_Text_AskedToDeliverThis:: .string "I'm glad I caught up to you.\n" .string "I'm PROF. OAK's AIDE.\p" .string "I've been asked to deliver this,\n" .string "so here you go.$" PewterCity_Text_ReceivedRunningShoesFromAide:: .string "{PLAYER} received the\n" .string "letter from the AIDE.$" PewterCity_Text_SwitchedShoesWithRunningShoes:: .string "{PLAYER} switched shoes with the\n" .string "RUNNING SHOES.$" PewterCity_Text_ExplainRunningShoes:: .string "Press the B Button to run.\n" .string "But only where there's room to run!$" PewterCity_Text_MustBeGoingBackToLab:: .string "Well, I must be going back to\n" .string "the LAB.\p" .string "Bye-bye!$" PewterCity_Text_RunningShoesLetterFromMom:: .string "{PLAYER} opened the letter…\p" .string "Dear {PLAYER},\p" .string "I see my beloved challenger\n" .string "left home with his RUNNING SHOES.\p" .string "You can press the B Button to run,\n" .string "and the R Button can make it so\l" .string "you can run without holding B!\p" .string "Remember, I'll always cheer for\n" .string "you! Don't ever give up!\p" .string "From Mom$" PewterCity_Text_RunningShoesLetterFromMomFemale:: .string "{PLAYER} opened the letter…\p" .string "Dear {PLAYER},\p" .string "I see my beloved challenger\n" .string "left home with her RUNNING SHOES.\p" .string "You can press the B Button to run,\n" .string "and the R Button can make it so\l" .string "you can run without holding B!\p" .string "Remember, I'll always cheer for\n" .string "you! Don't ever give up!\p" .string "From Mom$" ================================================ FILE: data/maps/PewterCity_Gym/map.json ================================================ { "id": "MAP_PEWTER_CITY_GYM", "name": "PewterCity_Gym", "layout": "LAYOUT_PEWTER_CITY_GYM", "music": "MUS_GYM", "region_map_section": "MAPSEC_PEWTER_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BROCK", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Gym_EventScript_Brock", "flag": "FLAG_TEMP_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 3, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "PewterCity_Gym_EventScript_Liam", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GYM_GUY", "in_connection": false, "x": 7, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Gym_EventScript_GymGuy", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 14, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "2" }, { "x": 6, "y": 14, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "2" }, { "x": 7, "y": 14, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 8, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Gym_EventScript_GymStatue" } ], "level_scaling": "1" } ================================================ FILE: data/maps/PewterCity_Gym/scripts.inc ================================================ .equ CHECK_VISITOR_STATE, 6 .equ TYPE, VAR_0x8003 .equ ARGUMENT, VAR_0x8004 PewterCity_Gym_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PewterCity_Gym_OnTransition .byte 0 PewterCity_Gym_OnTransition:: setvar TYPE, CHECK_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_BROCK callnative UseBattleHouseVar call_if_eq VAR_RESULT, 1, PewterCity_Gym_EventScript_HideBrock end PewterCity_Gym_EventScript_HideBrock:: setflag FLAG_TEMP_1 return PewterCity_Gym_EventScript_Brock:: famechecker FAMECHECKER_BROCK, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, PewterCity_Gym_EventScript_Brock_ChallengeMode trainerbattle_single TRAINER_LEADER_BROCK, PewterCity_Gym_Text_BrockIntro, PewterCity_Gym_Text_BrockDefeat, PewterCity_Gym_EventScript_DefeatedBrock, NO_MUSIC settrainerflag TRAINER_LEADER_BROCK_CHALLENGE goto_if_unset FLAG_GOT_TM39_FROM_BROCK, PewterCity_Gym_EventScript_GiveTM39 msgbox PewterCity_Gym_Text_BrockPostBattle release end PewterCity_Gym_EventScript_Brock_ChallengeMode:: trainerbattle_single TRAINER_LEADER_BROCK_CHALLENGE, PewterCity_Gym_Text_BrockIntro, PewterCity_Gym_Text_BrockDefeat, PewterCity_Gym_EventScript_DefeatedBrock, NO_MUSIC settrainerflag TRAINER_LEADER_BROCK goto_if_unset FLAG_GOT_TM39_FROM_BROCK, PewterCity_Gym_EventScript_GiveTM39 msgbox PewterCity_Gym_Text_BrockPostBattle release end PewterCity_Gym_EventScript_DefeatedBrock:: famechecker FAMECHECKER_BROCK, 1 setflag FLAG_DEFEATED_BROCK setflag FLAG_BADGE01_GET setvar VAR_MAP_SCENE_PEWTER_CITY, 1 setflag FLAG_HIDE_PEWTER_CITY_GYM_GUIDE clearflag FLAG_HIDE_PEWTER_CITY_RUNNING_SHOES_GUY set_gym_trainers 1 setflag FLAG_HIDE_CHARMANDER_BALL setflag FLAG_HIDE_SQUIRTLE_BALL setflag FLAG_HIDE_BULBASAUR_BALL goto PewterCity_Gym_EventScript_GiveTM39 end PewterCity_Gym_EventScript_GiveTM39:: msgbox PewterCity_Gym_Text_TakeThisWithYou checkitemspace ITEM_TM39 goto_if_eq VAR_RESULT, FALSE, PewterCity_Gym_EventScript_NoRoomForTM39 giveitem_msg PewterCity_Gym_Text_ReceivedTM39FromBrock, ITEM_TM39 setflag FLAG_GOT_TM39_FROM_BROCK msgbox PewterCity_Gym_Text_ExplainTM39 release end PewterCity_Gym_EventScript_NoRoomForTM39:: msgbox PewterCity_Gym_Text_DontHaveRoomForThis release end PewterCity_Gym_EventScript_Liam:: trainerbattle_single TRAINER_CAMPER_LIAM, PewterCity_Gym_Text_LiamIntro, PewterCity_Gym_Text_LiamDefeat msgbox PewterCity_Gym_Text_LiamPostBattle, MSGBOX_AUTOCLOSE end PewterCity_Gym_EventScript_GymGuy:: lock faceplayer goto_if_set FLAG_DEFEATED_BROCK, PewterCity_Gym_EventScript_GymGuyPostVictory msgbox PewterCity_Gym_Text_LetMeTakeYouToTheTop, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, PewterCity_Gym_EventScript_GymGuyTakeMeToTop goto_if_eq VAR_RESULT, NO, PewterCity_Gym_EventScript_GymGuyDontTakeMeToTop end PewterCity_Gym_EventScript_GymGuyPostVictory:: msgbox PewterCity_Gym_Text_YoureChampMaterial release end PewterCity_Gym_EventScript_GymGuyTakeMeToTop:: msgbox PewterCity_Gym_Text_LetsGetHappening goto PewterCity_Gym_EventScript_GymGuyAdvice end PewterCity_Gym_EventScript_GymGuyDontTakeMeToTop:: msgbox PewterCity_Gym_Text_ItsFreeLetsGetHappening goto PewterCity_Gym_EventScript_GymGuyAdvice end PewterCity_Gym_EventScript_GymGuyAdvice:: msgbox PewterCity_Gym_Text_TryDifferentPartyOrders release end PewterCity_Gym_EventScript_GymStatue:: lockall goto_if_set FLAG_BADGE01_GET, PewterCity_Gym_EventScript_GymStatuePostVictory msgbox PewterCity_Gym_Text_GymStatue releaseall end PewterCity_Gym_EventScript_GymStatuePostVictory:: msgbox PewterCity_Gym_Text_GymStatuePlayerWon releaseall end ================================================ FILE: data/maps/PewterCity_Gym/text.inc ================================================ PewterCity_Gym_Text_BrockIntro:: .string "So, you're here. I'm BROCK.\n" .string "I'm PEWTER's GYM LEADER.\p" .string "My rock-hard willpower is evident\n" .string "even in my POKéMON.\p" .string "My POKéMON are all rock hard, and\n" .string "have true-grit determination.\p" .string "That's right - my POKéMON are all\n" .string "the ROCK type!\p" .string "Fuhaha! You're going to challenge\n" .string "me knowing that you'll lose?\p" .string "That's the TRAINER's honor that\n" .string "compels you to challenge me.\p" .string "Fine, then!\n" .string "Show me your best!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" @ NOTE: This defeat text actually causes a buffer overflow. It's too long for the gDisplayedStringBattle @ buffer that it's put into, and it stomps all over the gBattleTextBuffs after, as well as the otherwise @ unused array after that, sFlickerArray. Perhaps that's the reason why said array exists. PewterCity_Gym_Text_BrockDefeat:: .string "I took you for granted, and so\n" .string "I lost.\p" .string "As proof of your victory, I confer\n" .string "on you this…the official POKéMON\l" .string "LEAGUE BOULDERBADGE.\p" .string "{FONT_NORMAL}{PLAYER} received the BOULDERBADGE\n" .string "from BROCK!{PAUSE_MUSIC}{PLAY_BGM}{MUS_OBTAIN_BADGE}{PAUSE 0xFE}{PAUSE 0x56}{RESUME_MUSIC}\p" .string "{FONT_MALE}Just having the BOULDERBADGE makes\n" .string "your POKéMON more powerful.\p" .string "It also enables the use of the\n" .string "move FLASH outside of battle.\p" .string "Of course, a POKéMON must know the\n" .string "move FLASH to use it.$" PewterCity_Gym_Text_TakeThisWithYou:: .string "Wait!\n" .string "Take this with you.$" PewterCity_Gym_Text_ReceivedTM39FromBrock:: .string "{PLAYER} received TM39\n" .string "from BROCK.$" PewterCity_Gym_Text_ExplainTM39:: .string "A TM, Technical Machine, contains a\n" .string "technique for POKéMON.\p" .string "Using a TM teaches the move it\n" .string "contains to a POKéMON.\p" .string "A TM is good forever, it can be\n" .string "used as many times as you want.\p" .string "Anyways…\n" .string "TM39 contains ROCK TOMB.\p" .string "It hurls boulders at the foe and\n" .string "lowers its SPEED.$" PewterCity_Gym_Text_BrockPostBattle:: .string "There are all kinds of TRAINERS in\n" .string "this huge world of ours.\p" .string "You appear to be very gifted as a\n" .string "POKéMON TRAINER.\p" .string "So let me make a suggestion.\p" .string "Go to the GYM in CERULEAN and test\n" .string "your abilities.$" PewterCity_Gym_Text_DontHaveRoomForThis:: .string "You don't have room for this.$" PewterCity_Gym_Text_LiamIntro:: .string "Stop right there, kid!\p" .string "You're ten thousand light-years \n" .string "from facing BROCK!$" PewterCity_Gym_Text_LiamDefeat:: .string "Darn!\p" .string "Light-years isn't time…\n" .string "It measures distance!$" PewterCity_Gym_Text_LiamPostBattle:: .string "You're pretty hot.\n" .string "…But not as hot as BROCK!$" PewterCity_Gym_Text_LetMeTakeYouToTheTop:: .string "Hiya!\n" .string "Do you want to dream big?\p" .string "Do you dare to dream of becoming\n" .string "the POKéMON champ?\p" .string "I'm no TRAINER, but I can advise\n" .string "you on how to win.\p" .string "Let me take you to the top!$" PewterCity_Gym_Text_LetsGetHappening:: .string "All right!\n" .string "Let's get happening!$" PewterCity_Gym_Text_TryDifferentPartyOrders:: .string "The first POKéMON out in a match is\n" .string "at the left of the POKéMON LIST.\p" .string "By changing the order of POKéMON,\n" .string "you may gain an advantage.\p" .string "Try different orders to suit your\n" .string "opponent's party.$" PewterCity_Gym_Text_ItsFreeLetsGetHappening:: .string "It's a free service!\n" .string "Let's get happening!$" PewterCity_Gym_Text_YoureChampMaterial:: .string "Just as I thought!\n" .string "You're POKéMON champ material!$" PewterCity_Gym_Text_GymStatue:: .string "PEWTER POKéMON GYM\n" .string "LEADER: BROCK\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}$" PewterCity_Gym_Text_GymStatuePlayerWon:: .string "PEWTER POKéMON GYM\n" .string "LEADER: BROCK\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}, {PLAYER}$" ================================================ FILE: data/maps/PewterCity_House1/map.json ================================================ { "id": "MAP_PEWTER_CITY_HOUSE1", "name": "PewterCity_House1", "layout": "LAYOUT_HOUSE2", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_PEWTER_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_House1_EventScript_BaldingMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "x": 5, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_House1_EventScript_LittleBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NIDORAN_M", "x": 6, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_House1_EventScript_Nidoran", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 0, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "4" }, { "x": 4, "y": 7, "elevation": 0, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "4" }, { "x": 5, "y": 7, "elevation": 0, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "4" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/PewterCity_House1/scripts.inc ================================================ .set LOCALID_NIDORAN, 3 PewterCity_House1_MapScripts:: .byte 0 PewterCity_House1_EventScript_BaldingMan:: msgbox PewterCity_House1_Text_TradeMonsAreFinicky, MSGBOX_NPC end PewterCity_House1_EventScript_LittleBoy:: lock msgbox PewterCity_House1_Text_NidoranSit call PewterCity_House1_EventScript_DoNidoranCry release end PewterCity_House1_EventScript_Nidoran:: lock faceplayer call PewterCity_House1_EventScript_DoNidoranCry applymovement LOCALID_NIDORAN, Common_Movement_FaceOriginalDirection waitmovement 0 release end PewterCity_House1_EventScript_DoNidoranCry:: textcolor NPC_TEXT_COLOR_NEUTRAL waitse playmoncry SPECIES_NIDORAN_M, CRY_MODE_NORMAL msgbox PewterCity_House1_Text_Nidoran waitmoncry call EventScript_RestorePrevTextColor return ================================================ FILE: data/maps/PewterCity_House1/text.inc ================================================ PewterCity_House1_Text_Nidoran:: .string "NIDORAN♂: Bowbow!$" PewterCity_House1_Text_NidoranSit:: .string "NIDORAN, sit!$" PewterCity_House1_Text_TradeMonsAreFinicky:: .string "Our POKéMON's an outsider, so it's\n" .string "finicky and hard to handle.\p" .string "An outsider is a POKéMON that you\n" .string "get in a trade.\p" .string "It grows fast, but it may ignore an\n" .string "unskilled TRAINER in battle.\p" .string "If only we had some BADGES…$" ================================================ FILE: data/maps/PewterCity_House2/map.json ================================================ { "id": "MAP_PEWTER_CITY_HOUSE2", "name": "PewterCity_House2", "layout": "LAYOUT_HOUSE2", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_PEWTER_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 3, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_House2_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 5, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_House2_EventScript_LittleBoy", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 9, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Kabutops", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 0, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "6" }, { "x": 4, "y": 7, "elevation": 0, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "6" }, { "x": 5, "y": 7, "elevation": 0, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "6" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/PewterCity_House2/scripts.inc ================================================ .set LOCALID_KABUTOPS_MASTER, 3 .set TRAINER, VAR_0x8009 PewterCity_House2_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PewterCity_House2_MapScript_SetMasterTrainerMovementTypes .byte 0 PewterCity_House2_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_KABUTOPS callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PewterCity_House2_MapScript_KabutopsMasterMovementType end PewterCity_House2_MapScript_KabutopsMasterMovementType:: setobjectmovementtype LOCALID_KABUTOPS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PewterCity_House2_EventScript_OldMan:: msgbox PewterCity_House2_Text_MonsLearnTechniquesAsTheyGrow, MSGBOX_NPC end PewterCity_House2_EventScript_LittleBoy:: msgbox PewterCity_House2_Text_MonsEasierCatchIfStatused, MSGBOX_NPC end ================================================ FILE: data/maps/PewterCity_House2/text.inc ================================================ PewterCity_House2_Text_MonsLearnTechniquesAsTheyGrow:: .string "POKéMON learn new techniques as\n" .string "they grow.\p" .string "But some moves must be taught to\n" .string "them by people.$" PewterCity_House2_Text_MonsEasierCatchIfStatused:: .string "A POKéMON becomes easier to \n" .string "catch if it has a status problem.\p" .string "Sleep, poison, burn, or paralysis…\n" .string "Those are all effective.\p" .string "But catching POKéMON is never\n" .string "a sure thing!$" ================================================ FILE: data/maps/PewterCity_Mart/map.json ================================================ { "id": "MAP_PEWTER_CITY_MART", "name": "PewterCity_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_PEWTER_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Mart_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "x": 6, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Mart_EventScript_Boy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Mart_EventScript_Clerk", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "3" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "3" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/PewterCity_Mart/scripts.inc ================================================ PewterCity_Mart_MapScripts:: .byte 0 PewterCity_Mart_EventScript_Youngster:: msgbox PewterCity_Mart_Text_BoughtWeirdFishFromShadyGuy, MSGBOX_NPC end PewterCity_Mart_EventScript_Boy:: msgbox PewterCity_Mart_Text_GoodThingsIfRaiseMonsDiligently, MSGBOX_NPC end PewterCity_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart PewterCity_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 PewterCity_Mart_Items:: .2byte ITEM_POKE_BALL .2byte ITEM_POTION .2byte ITEM_ANTIDOTE .2byte ITEM_PARALYZE_HEAL .2byte ITEM_AWAKENING .2byte ITEM_BURN_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_REPEL .2byte ITEM_NONE release end ================================================ FILE: data/maps/PewterCity_Mart/text.inc ================================================ PewterCity_Mart_Text_BoughtWeirdFishFromShadyGuy:: .string "A shady old guy sucked me into\n" .string "buying this weird fish POKéMON!\p" .string "It's totally weak and it cost ¥500!$" PewterCity_Mart_Text_GoodThingsIfRaiseMonsDiligently:: .string "Good things can happen if you raise\n" .string "POKéMON diligently.\p" .string "Even the weak ones can surprise\n" .string "you if you don't give up on them.$" ================================================ FILE: data/maps/PewterCity_Museum_1F/map.json ================================================ { "id": "MAP_PEWTER_CITY_MUSEUM_1F", "name": "PewterCity_Museum_1F", "layout": "LAYOUT_PEWTER_CITY_MUSEUM_1F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_PEWTER_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 16, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_1F_EventScript_Scientist1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_1F_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 21, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_1F_EventScript_OldAmberScientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_AMBER", "in_connection": false, "x": 22, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_1F_EventScript_OldAmber", "flag": "FLAG_HIDE_OLD_AMBER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 26, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_1F_EventScript_Scientist2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 26, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_1F_EventScript_SeismicTossTutor", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 1, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Aerodactyl", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 13, "y": 9, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "0" }, { "x": 14, "y": 9, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "0" }, { "x": 15, "y": 9, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "0" }, { "x": 21, "y": 9, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "1" }, { "x": 22, "y": 9, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "1" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_PEWTER_CITY_MUSEUM_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 12, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F", "var_value": "0", "script": "PewterCity_Museum_1F_EventScript_EntranceTriggerLeft" }, { "type": "trigger", "x": 13, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F", "var_value": "0", "script": "PewterCity_Museum_1F_EventScript_EntranceTriggerMid" }, { "type": "trigger", "x": 14, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F", "var_value": "0", "script": "PewterCity_Museum_1F_EventScript_EntranceTriggerRight" } ], "bg_events": [ { "type": "sign", "x": 4, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_1F_EventScript_AerodactylFossil" }, { "type": "sign", "x": 4, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_1F_EventScript_KabutopsFossil" }, { "type": "sign", "x": 27, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "PewterCity_Museum_1F_EventScript_PokemonJournalBrock" }, { "type": "sign", "x": 26, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "PewterCity_Museum_1F_EventScript_PokemonJournalBrock" } ], "level_scaling": "0" } ================================================ FILE: data/maps/PewterCity_Museum_1F/scripts.inc ================================================ .set LOCALID_SCIENTIST1, 1 .set LOCALID_OLD_AMBER, 4 .set LOCALID_AERODACTYL_MASTER, 7 .set TRAINER, VAR_0x8009 PewterCity_Museum_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PewterCity_Museum_1F_MapScript_SetMasterTrainerMovementTypes .byte 0 PewterCity_Museum_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_AERODACTYL callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PewterCity_Museum_1F_MapScript_AerodactylMasterMovementType end PewterCity_Museum_1F_MapScript_AerodactylMasterMovementType:: setobjectmovementtype LOCALID_AERODACTYL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PewterCity_Museum_1F_EventScript_Scientist1:: lock faceplayer goto_if_eq VAR_FACING, DIR_WEST, PewterCity_Museum_1F_EventScript_Scientist1BehindCounter goto_if_eq VAR_FACING, DIR_SOUTH, PewterCity_Museum_1F_EventScript_Scientist1BehindCounter goto_if_eq VAR_FACING, DIR_NORTH, PewterCity_Museum_1F_EventScript_Scientist1BehindCounter msgbox PewterCity_Museum_1F_Text_PleaseEnjoyYourself release end PewterCity_Museum_1F_EventScript_Scientist1BehindCounter:: msgbox PewterCity_Museum_1F_Text_DoYouKnowWhatAmberIs, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, PewterCity_Museum_1F_EventScript_AmberHasGeneticMatter goto_if_eq VAR_RESULT, NO, PewterCity_Museum_1F_EventScript_ExplainAmber end PewterCity_Museum_1F_EventScript_AmberHasGeneticMatter:: msgbox PewterCity_Museum_1F_Text_AmberContainsGeneticMatter applymovement LOCALID_SCIENTIST1, Common_Movement_FaceOriginalDirection waitmovement 0 release end PewterCity_Museum_1F_EventScript_ExplainAmber:: msgbox PewterCity_Museum_1F_Text_AmberIsFossilizedSap applymovement LOCALID_SCIENTIST1, Common_Movement_FaceOriginalDirection waitmovement 0 release end PewterCity_Museum_1F_EventScript_EntranceTriggerLeft:: lockall setvar VAR_TEMP_1, 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 goto PewterCity_Museum_1F_EventScript_EntranceTrigger end PewterCity_Museum_1F_EventScript_EntranceTriggerMid:: lockall setvar VAR_TEMP_1, 1 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 goto PewterCity_Museum_1F_EventScript_EntranceTrigger end PewterCity_Museum_1F_EventScript_EntranceTriggerRight:: lockall setvar VAR_TEMP_1, 2 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 goto PewterCity_Museum_1F_EventScript_EntranceTrigger end PewterCity_Museum_1F_EventScript_EntranceTrigger:: textcolor NPC_TEXT_COLOR_MALE showmoneybox 0, 0 msgbox PewterCity_Museum_1F_Text_Its50YForChildsTicket, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, PewterCity_Museum_1F_EventScript_TryPayForTicket msgbox PewterCity_Museum_1F_Text_ComeAgain closemessage hidemoneybox applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ForcePlayerExit waitmovement 0 releaseall end PewterCity_Museum_1F_EventScript_TryPayForTicket:: checkmoney 50 goto_if_eq VAR_RESULT, FALSE, PewterCity_Museum_1F_EventScript_NotEnoughMoney closemessage call_if_eq VAR_TEMP_1, 0, PewterCity_Museum_1F_EventScript_PlayerApproachCounterLeft call_if_eq VAR_TEMP_1, 1, PewterCity_Museum_1F_EventScript_PlayerApproachCounterMid call_if_eq VAR_TEMP_1, 2, PewterCity_Museum_1F_EventScript_PlayerApproachCounterRight playse SE_SHOP removemoney 50 updatemoneybox waitse msgbox PewterCity_Museum_1F_Text_Right50YThankYou setvar VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F, 1 hidemoneybox releaseall end PewterCity_Museum_1F_EventScript_PlayerApproachCounterLeft:: applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ApproachCounterLeft waitmovement 0 return PewterCity_Museum_1F_EventScript_PlayerApproachCounterMid:: applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ApproachCounterMid waitmovement 0 return PewterCity_Museum_1F_EventScript_PlayerApproachCounterRight:: applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ApproachCounterRight waitmovement 0 return PewterCity_Museum_1F_EventScript_NotEnoughMoney:: msgbox PewterCity_Museum_1F_Text_DontHaveEnoughMoney closemessage hidemoneybox applymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ForcePlayerExit waitmovement 0 releaseall end PewterCity_Museum_1F_Movement_ForcePlayerExit:: walk_down step_end PewterCity_Museum_1F_Movement_ApproachCounterLeft:: walk_right walk_right delay_8 walk_in_place_right step_end PewterCity_Museum_1F_Movement_ApproachCounterMid:: walk_right delay_8 walk_in_place_right step_end PewterCity_Museum_1F_Movement_ApproachCounterRight:: delay_8 walk_in_place_right step_end PewterCity_Museum_1F_EventScript_Scientist2:: msgbox PewterCity_Museum_1F_Text_WeHaveTwoFossilsOnExhibit, MSGBOX_NPC end PewterCity_Museum_1F_EventScript_OldMan:: msgbox PewterCity_Museum_1F_Text_ShouldBeGratefulForLongLife, MSGBOX_NPC end PewterCity_Museum_1F_EventScript_OldAmberScientist:: lock faceplayer goto_if_set FLAG_GOT_OLD_AMBER, PewterCity_Museum_1F_EventScript_AlreadyGotOldAmber msgbox PewterCity_Museum_1F_Text_WantYouToGetAmberExamined checkitemspace ITEM_OLD_AMBER goto_if_eq VAR_RESULT, FALSE, PewterCity_Museum_1F_EventScript_NoRoomForOldAmber setflag FLAG_GOT_OLD_AMBER removeobject LOCALID_OLD_AMBER giveitem_msg PewterCity_Museum_1F_Text_ReceivedOldAmberFromMan, ITEM_OLD_AMBER, 1, MUS_OBTAIN_KEY_ITEM release end PewterCity_Museum_1F_EventScript_NoRoomForOldAmber:: msgbox PewterCity_Museum_1F_Text_DontHaveSpaceForThis release end PewterCity_Museum_1F_EventScript_AlreadyGotOldAmber:: msgbox PewterCity_Museum_1F_Text_GetOldAmberChecked release end PewterCity_Museum_1F_EventScript_OldAmber:: msgbox PewterCity_Museum_1F_Text_BeautifulPieceOfAmber, MSGBOX_NPC end PewterCity_Museum_1F_EventScript_AerodactylFossil:: lockall setvar VAR_0x8004, SPECIES_AERODACTYL setvar VAR_0x8005, 10 setvar VAR_0x8006, 3 special OpenMuseumFossilPic msgbox PewterCity_Museum_1F_Text_AerodactylFossil special CloseMuseumFossilPic releaseall end PewterCity_Museum_1F_EventScript_KabutopsFossil:: lockall setvar VAR_0x8004, SPECIES_KABUTOPS setvar VAR_0x8005, 10 setvar VAR_0x8006, 3 special OpenMuseumFossilPic msgbox PewterCity_Museum_1F_Text_KabutopsFossil special CloseMuseumFossilPic releaseall end ================================================ FILE: data/maps/PewterCity_Museum_1F/text.inc ================================================ PewterCity_Museum_1F_Text_Its50YForChildsTicket:: .string "Yes, yes.\n" .string "It's ¥50 for a child's ticket.\p" .string "Would you like to come in?$" PewterCity_Museum_1F_Text_ComeAgain:: .string "Come again!$" PewterCity_Museum_1F_Text_Right50YThankYou:: .string "Right, ¥50!\n" .string "Thank you!$" PewterCity_Museum_1F_Text_DontHaveEnoughMoney:: .string "You don't have enough money.$" PewterCity_Museum_1F_Text_PleaseEnjoyYourself:: .string "Please enjoy yourself.$" PewterCity_Museum_1F_Text_DoYouKnowWhatAmberIs:: .string "You can't sneak in the back way!\n" .string "Nice try, kid, but no.\p" .string "Oh, whatever!\n" .string "Do you know what AMBER is?$" PewterCity_Museum_1F_Text_AmberContainsGeneticMatter:: .string "AMBER contains the genetic matter\n" .string "of ancient POKéMON.\p" .string "There's a LAB somewhere trying to\n" .string "resurrect POKéMON from AMBER.$" PewterCity_Museum_1F_Text_AmberIsFossilizedSap:: .string "AMBER is actually sap, that gooey\n" .string "stuff that oozes from trees.\p" .string "The ancient sap fossilized over\n" .string "time to become rock-hard AMBER.$" PewterCity_Museum_1F_Text_ShouldBeGratefulForLongLife:: .string "I should be grateful for my long\n" .string "life.\p" .string "Never did I think I would get to\n" .string "see the bones of a dragon!$" PewterCity_Museum_1F_Text_WantYouToGetAmberExamined:: .string "Ssh! Listen, I need to share a\n" .string "secret with someone.\p" .string "I think that this chunk of AMBER\n" .string "contains POKéMON DNA!\p" .string "It would be a shattering scientific\n" .string "breakthrough if POKéMON could be\l" .string "resurrected from it.\p" .string "But, my colleagues just ignore\n" .string "what I have to say.\p" .string "So, I have a favor to ask!\p" .string "I want you to get this examined at\n" .string "a POKéMON LAB somewhere.$" PewterCity_Museum_1F_Text_ReceivedOldAmberFromMan:: .string "{PLAYER} received the OLD AMBER\n" .string "from the man.$" PewterCity_Museum_1F_Text_GetOldAmberChecked:: .string "Ssh!\n" .string "Get the OLD AMBER checked!$" PewterCity_Museum_1F_Text_DontHaveSpaceForThis:: .string "You don't have space for this.$" PewterCity_Museum_1F_Text_WeHaveTwoFossilsOnExhibit:: .string "We have two fossils of rare,\n" .string "prehistoric POKéMON on exhibit.$" PewterCity_Museum_1F_Text_BeautifulPieceOfAmber:: .string "There is a beautiful piece of\n" .string "AMBER in a clear gold color.$" PewterCity_Museum_1F_Text_AerodactylFossil:: .string "AERODACTYL Fossil\n" .string "A primitive and rare POKéMON.$" PewterCity_Museum_1F_Text_KabutopsFossil:: .string "KABUTOPS Fossil\n" .string "A primitive and rare POKéMON.$" ================================================ FILE: data/maps/PewterCity_Museum_2F/map.json ================================================ { "id": "MAP_PEWTER_CITY_MUSEUM_2F", "name": "PewterCity_Museum_2F", "layout": "LAYOUT_PEWTER_CITY_MUSEUM_2F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_PEWTER_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 10, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_2F_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 4, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_2F_EventScript_Man", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 0, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_2F_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 15, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_2F_EventScript_LittleGirl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 16, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_Museum_2F_EventScript_BaldingMan", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 3, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Golem", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 11, "y": 8, "elevation": 3, "dest_map": "MAP_PEWTER_CITY_MUSEUM_1F", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 3, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_2F_EventScript_MoonStone" }, { "type": "sign", "x": 15, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_2F_EventScript_SpaceShuttle" }, { "type": "sign", "x": 14, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_2F_EventScript_SpaceShuttle" }, { "type": "sign", "x": 16, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_2F_EventScript_SpaceShuttle" }, { "type": "sign", "x": 14, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_2F_EventScript_SpaceShuttle" }, { "type": "sign", "x": 15, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_2F_EventScript_SpaceShuttle" }, { "type": "sign", "x": 16, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_2F_EventScript_SpaceShuttle" }, { "type": "sign", "x": 3, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PewterCity_Museum_2F_EventScript_MoonStone" } ], "level_scaling": "0" } ================================================ FILE: data/maps/PewterCity_Museum_2F/scripts.inc ================================================ .set LOCALID_GOLEM_MASTER, 6 .set TRAINER, VAR_0x8009 PewterCity_Museum_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PewterCity_Museum_2F_MapScript_SetMasterTrainerMovementTypes .byte 0 PewterCity_Museum_2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_GOLEM callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PewterCity_Museum_2F_MapScript_GolemMasterMovementType end PewterCity_Museum_2F_MapScript_GolemMasterMovementType:: setobjectmovementtype LOCALID_GOLEM_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PewterCity_Museum_2F_EventScript_Man:: msgbox PewterCity_Museum_1F_Text_WhatsSpecialAboutMoonStone, MSGBOX_NPC end PewterCity_Museum_2F_EventScript_OldMan:: msgbox PewterCity_Museum_1F_Text_BoughtColorTVForMoonLanding, MSGBOX_NPC end PewterCity_Museum_2F_EventScript_Scientist:: msgbox PewterCity_Museum_1F_Text_RunningSpaceExhibitThisMonth, MSGBOX_NPC end PewterCity_Museum_2F_EventScript_LittleGirl:: msgbox PewterCity_Museum_1F_Text_AskedDaddyToCatchPikachu, MSGBOX_NPC end PewterCity_Museum_2F_EventScript_BaldingMan:: msgbox PewterCity_Museum_1F_Text_PikachuSoonIPromise, MSGBOX_NPC end PewterCity_Museum_2F_EventScript_SpaceShuttle:: msgbox PewterCity_Museum_1F_Text_SpaceShuttle, MSGBOX_SIGN end PewterCity_Museum_2F_EventScript_MoonStone:: callnative SetFirstDeoxysForm msgbox PewterCity_Museum_1F_Text_MeteoriteThatFellOnMtMoon, MSGBOX_SIGN end ================================================ FILE: data/maps/PewterCity_Museum_2F/text.inc ================================================ Text_SeismicTossTeach:: .string "The secrets of space…\n" .string "The mysteries of earth…\p" .string "There are so many things about\n" .string "which we know so little.\p" .string "But that should spur us to study\n" .string "harder, not toss in the towel.\p" .string "The only thing you should toss…\p" .string "Well, how about SEISMIC TOSS?\n" .string "Should I teach that to a POKéMON?$" Text_SeismicTossDeclined:: .string "Is that so?\n" .string "I'm sure you'll be back for it.$" Text_SeismicTossWhichMon:: .string "Which POKéMON wants to learn\n" .string "SEISMIC TOSS?$" Text_SeismicTossTaught:: .string "I hope you won't toss in the towel.\n" .string "Keep it up.$" Text_SeismicTossReteach:: .string "I see you still haven't tossed in\n" .string "the towel when it comes to raising\l" .string "your POKéMON.\p" .string "The only thing you should toss is\n" .string "another POKéMON with SEISMIC TOSS!\p" .string "I can teach it to your POKéMON\n" .string "again for ¥5000.$" Text_SeismicTossReteach2:: .string "Well, how about it?\n" .string "Should I teach SEISMIC TOSS to\l" .string "your POKéMON?$" Text_SeismicTossNotEnoughMoney:: .string "I'm afraid I have to toss in\n" .string "the towel on teaching your POKéMON\l" .string "if you don't have ¥5000…$" PewterCity_Museum_1F_Text_WhatsSpecialAboutMoonStone:: .string "MOON STONE, huh?\p" .string "What's so special about it?\n" .string "Looks like an ordinary rock to me.$" PewterCity_Museum_1F_Text_BoughtColorTVForMoonLanding:: .string "July 20, 1969!\p" .string "Humankind first set foot on the\n" .string "moon that day.\p" .string "I bought a color TV just so I\n" .string "could watch that news.$" PewterCity_Museum_1F_Text_RunningSpaceExhibitThisMonth:: .string "This month, we're running a space\n" .string "exhibit.$" PewterCity_Museum_1F_Text_AskedDaddyToCatchPikachu:: .string "I want a PIKACHU!\n" .string "It's so cute!\p" .string "I asked my daddy to catch me one!$" PewterCity_Museum_1F_Text_PikachuSoonIPromise:: .string "Yeah, a PIKACHU soon, I promise!$" PewterCity_Museum_1F_Text_SpaceShuttle:: .string "Space Shuttle$" PewterCity_Museum_1F_Text_MeteoriteThatFellOnMtMoon:: .string "A meteorite that fell on MT. MOON.\n" .string "It is thought to be a MOON STONE.$" ================================================ FILE: data/maps/PewterCity_PokemonCenter_1F/map.json ================================================ { "id": "MAP_PEWTER_CITY_POKEMON_CENTER_1F", "name": "PewterCity_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_PEWTER_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JIGGLYPUFF", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_PokemonCenter_1F_EventScript_Jigglypuff", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 4, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 13, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MysteryEventClub_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GBA_KID", "in_connection": false, "x": 10, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_PokemonCenter_1F_EventScript_GBAKid1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GBA_KID", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PewterCity_PokemonCenter_1F_EventScript_GBAKid2", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 3, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Jigglypuff", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 0, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "5" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "5" }, { "x": 8, "y": 8, "elevation": 0, "dest_map": "MAP_PEWTER_CITY", "dest_warp_id": "5" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_PEWTER_CITY_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/PewterCity_PokemonCenter_1F/scripts.inc ================================================ .set LOCALID_JIGGLYPUFF_MASTER, 10 .set TRAINER, VAR_0x8009 PewterCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PewterCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 PewterCity_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_PEWTER_CITY goto PewterCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes end PewterCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_JIGGLYPUFF callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PewterCity_PokemonCenter_1F_MapScript_JigglypuffMasterMovementType end PewterCity_PokemonCenter_1F_MapScript_JigglypuffMasterMovementType:: setobjectmovementtype LOCALID_JIGGLYPUFF_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PewterCity_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end PewterCity_PokemonCenter_1F_EventScript_Gentleman:: msgbox PewterCity_PokemonCenter_1F_Text_TeamRocketMtMoonImOnPhone, MSGBOX_NPC end PewterCity_PokemonCenter_1F_EventScript_Jigglypuff:: lock faceplayer fadeoutbgm 0 playbgm MUS_JIGGLYPUFF, 0 message PewterCity_PokemonCenter_1F_Text_Jigglypuff waitmessage delay 455 playbgm MUS_POKE_CENTER, 1 release end PewterCity_PokemonCenter_1F_EventScript_Youngster:: msgbox PewterCity_PokemonCenter_1F_Text_WhenJiggylypuffSingsMonsGetDrowsy, MSGBOX_NPC end PewterCity_PokemonCenter_1F_EventScript_GBAKid1:: lock msgbox PewterCity_PokemonCenter_1F_Text_TradingMyClefairyForPikachu release end PewterCity_PokemonCenter_1F_EventScript_GBAKid2:: msgbox PewterCity_PokemonCenter_1F_Text_TradingPikachuWithKid, MSGBOX_NPC end ================================================ FILE: data/maps/PewterCity_PokemonCenter_1F/text.inc ================================================ PewterCity_PokemonCenter_1F_Text_TeamRocketMtMoonImOnPhone:: .string "What!?\p" .string "TEAM ROCKET is at MT. MOON?\n" .string "Huh?\p" .string "I'm on the phone!\n" .string "Scram!$" PewterCity_PokemonCenter_1F_Text_Jigglypuff:: .string "JIGGLYPUFF: Puu pupuu!$" PewterCity_PokemonCenter_1F_Text_WhenJiggylypuffSingsMonsGetDrowsy:: .string "Yawn!\p" .string "When JIGGLYPUFF sings, POKéMON get\n" .string "drowsy…\p" .string "…Me, too…\n" .string "Snore…$" PewterCity_PokemonCenter_1F_Text_TradingMyClefairyForPikachu:: .string "I really want a PIKACHU, so I'm\n" .string "trading my CLEFAIRY for one.$" PewterCity_PokemonCenter_1F_Text_TradingPikachuWithKid:: .string "I'm trading POKéMON with that kid\n" .string "there.\p" .string "I had two PIKACHU, so I figured\n" .string "I might as well trade one.$" ================================================ FILE: data/maps/PewterCity_PokemonCenter_2F/map.json ================================================ { "id": "MAP_PEWTER_CITY_POKEMON_CENTER_2F", "name": "PewterCity_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_PEWTER_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_PEWTER_CITY_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/PewterCity_PokemonCenter_2F/scripts.inc ================================================ PewterCity_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS PewterCity_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end PewterCity_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end PewterCity_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/PokemonLeague_AgathasRoom/map.json ================================================ { "id": "MAP_POKEMON_LEAGUE_AGATHAS_ROOM", "name": "PokemonLeague_AgathasRoom", "layout": "LAYOUT_POKEMON_LEAGUE_AGATHAS_ROOM", "music": "MUS_POKE_TOWER", "region_map_section": "MAPSEC_POKEMON_LEAGUE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_AGATHA", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_AGATHA", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonLeague_AgathasRoom_EventScript_Agatha", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 12, "elevation": 0, "dest_map": "MAP_POKEMON_LEAGUE_BRUNOS_ROOM", "dest_warp_id": "1" }, { "x": 6, "y": 2, "elevation": 0, "dest_map": "MAP_POKEMON_LEAGUE_LANCES_ROOM", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonLeague_AgathasRoom/scripts.inc ================================================ PokemonLeague_AgathasRoom_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, PokemonLeague_AgathasRoom_OnResume map_script MAP_SCRIPT_ON_LOAD, PokemonLeague_AgathasRoom_OnLoad map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_AgathasRoom_OnWarp map_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_AgathasRoom_OnFrame .byte 0 PokemonLeague_AgathasRoom_OnResume:: setvar VAR_0x8004, 2 call PokemonLeague_EventScript_DoLightingEffect end PokemonLeague_AgathasRoom_OnLoad:: call_if_set FLAG_DEFEATED_AGATHA, PokemonLeague_AgathasRoom_EventScript_SetDoorOpen call_if_eq VAR_MAP_SCENE_POKEMON_LEAGUE, 3, PokemonLeague_AgathasRoom_EventScript_CloseEntry end PokemonLeague_AgathasRoom_EventScript_CloseEntry:: call PokemonLeague_EventScript_CloseEntry return PokemonLeague_AgathasRoom_EventScript_SetDoorOpen:: call PokemonLeague_EventScript_SetDoorOpen return PokemonLeague_AgathasRoom_OnWarp:: map_script_2 VAR_TEMP_1, 0, PokemonLeague_AgathasRoom_EventScript_TurnPlayerNorth .2byte 0 PokemonLeague_AgathasRoom_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end PokemonLeague_AgathasRoom_OnFrame:: map_script_2 VAR_MAP_SCENE_POKEMON_LEAGUE, 2, PokemonLeague_AgathasRoom_EventScript_EnterRoom .2byte 0 PokemonLeague_AgathasRoom_EventScript_EnterRoom:: lockall call PokemonLeague_EventScript_EnterRoom setvar VAR_MAP_SCENE_POKEMON_LEAGUE, 3 releaseall end PokemonLeague_AgathasRoom_EventScript_Agatha:: lock faceplayer famechecker FAMECHECKER_AGATHA, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 goto_if_set FLAG_DEFEATED_AGATHA, PokemonLeague_AgathasRoom_EventScript_PostBattle famechecker FAMECHECKER_AGATHA, 0 famechecker FAMECHECKER_AGATHA, 4 famechecker FAMECHECKER_OAK, 4 call_if_unset FLAG_SYS_GAME_CLEAR, PokemonLeague_AgathasRoom_EventScript_Intro call_if_set FLAG_SYS_GAME_CLEAR, PokemonLeague_AgathasRoom_EventScript_RematchIntro setflag FLAG_TEMP_3 setflag FLAG_TEMP_5 call_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_AgathasRoom_EventScript_GetDifficulty call_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_AgathasRoom_EventScript_GetDifficulty2 clearflag FLAG_TEMP_5 goto PokemonLeague_AgathasRoom_EventScript_DefeatedAgatha end PokemonLeague_AgathasRoom_EventScript_Intro:: msgbox PokemonLeague_AgathasRoom_Text_Intro return PokemonLeague_AgathasRoom_EventScript_RematchIntro:: msgbox PokemonLeague_AgathasRoom_Text_RematchIntro return PokemonLeague_AgathasRoom_EventScript_GetDifficulty:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_AgathasRoom_EventScript_Battle_ChallengeMode callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_AgathasRoom_EventScript_Battle return PokemonLeague_AgathasRoom_EventScript_GetDifficulty2:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_AgathasRoom_EventScript_Battle_ChallengeModeRematch callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_AgathasRoom_EventScript_Rematch return PokemonLeague_AgathasRoom_EventScript_Battle_ChallengeMode:: trainerbattle_no_intro TRAINER_ELITE_FOUR_AGATHA_CHALLENGE, PokemonLeague_AgathasRoom_Text_Defeat return PokemonLeague_AgathasRoom_EventScript_Battle:: trainerbattle_no_intro TRAINER_ELITE_FOUR_AGATHA, PokemonLeague_AgathasRoom_Text_Defeat return PokemonLeague_AgathasRoom_EventScript_Battle_ChallengeModeRematch:: trainerbattle_no_intro TRAINER_ELITE_FOUR_AGATHA_CHALLENGE_2, PokemonLeague_AgathasRoom_Text_Defeat return PokemonLeague_AgathasRoom_EventScript_Rematch:: trainerbattle_no_intro TRAINER_ELITE_FOUR_AGATHA_2, PokemonLeague_AgathasRoom_Text_Defeat return PokemonLeague_AgathasRoom_EventScript_PostBattle:: msgbox PokemonLeague_AgathasRoom_Text_PostBattle release end PokemonLeague_AgathasRoom_EventScript_DefeatedAgatha:: setflag FLAG_DEFEATED_AGATHA call PokemonLeague_EventScript_OpenDoor msgbox PokemonLeague_AgathasRoom_Text_PostBattle release end ================================================ FILE: data/maps/PokemonLeague_AgathasRoom/text.inc ================================================ PokemonLeague_AgathasRoom_Text_Intro:: .string "I am AGATHA of the ELITE FOUR.\p" .string "I hear OAK's taken a lot of\n" .string "interest in you, child.\p" .string "That old duff was once tough and\n" .string "handsome.\p" .string "But that was decades ago.\n" .string "He's a shadow of his former self.\p" .string "Now he just wants to fiddle with\n" .string "his POKéDEX.\p" .string "He's wrong.\n" .string "POKéMON are for battling!\p" .string "{PLAYER}! I'll show you how a real\n" .string "TRAINER battles!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" PokemonLeague_AgathasRoom_Text_RematchIntro:: .string "I am AGATHA of the ELITE FOUR.\p" .string "You're the child that OAK's taken\n" .string "under his wing, aren't you?\p" .string "That old duff was once tough and\n" .string "handsome.\p" .string "But that was decades ago.\n" .string "He's a shadow of his former self.\p" .string "Now he just wants to fiddle with\n" .string "his POKéDEX.\p" .string "He's wrong.\n" .string "POKéMON are for battling!\p" .string "{PLAYER}! I'll show you how a real\n" .string "TRAINER battles!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" PokemonLeague_AgathasRoom_Text_Defeat:: .string "Oh, my!\n" .string "You're something special, child!$" PokemonLeague_AgathasRoom_Text_PostBattle:: .string "You win!\p" .string "I see what the old duff sees in\n" .string "you now.\p" .string "I have nothing else to say.\n" .string "Run along now, child!$" ================================================ FILE: data/maps/PokemonLeague_BrunosRoom/map.json ================================================ { "id": "MAP_POKEMON_LEAGUE_BRUNOS_ROOM", "name": "PokemonLeague_BrunosRoom", "layout": "LAYOUT_POKEMON_LEAGUE_BRUNOS_ROOM", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_POKEMON_LEAGUE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_BRUNO", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BRUNO", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonLeague_BrunosRoom_EventScript_Bruno", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 12, "elevation": 0, "dest_map": "MAP_POKEMON_LEAGUE_LORELEIS_ROOM", "dest_warp_id": "1" }, { "x": 6, "y": 2, "elevation": 0, "dest_map": "MAP_POKEMON_LEAGUE_AGATHAS_ROOM", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonLeague_BrunosRoom/scripts.inc ================================================ .set LOCALID_BRUNO, 1 PokemonLeague_BrunosRoom_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, PokemonLeague_BrunosRoom_OnResume map_script MAP_SCRIPT_ON_LOAD, PokemonLeague_BrunosRoom_OnLoad map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_BrunosRoom_OnWarp map_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_BrunosRoom_OnFrame .byte 0 PokemonLeague_BrunosRoom_OnResume:: setvar VAR_0x8004, 1 call PokemonLeague_EventScript_DoLightingEffect end PokemonLeague_BrunosRoom_OnLoad:: call_if_set FLAG_DEFEATED_BRUNO, PokemonLeague_BrunosRoom_EventScript_SetDoorOpen call_if_eq VAR_MAP_SCENE_POKEMON_LEAGUE, 2, PokemonLeague_BrunosRoom_EventScript_CloseEntry end PokemonLeague_BrunosRoom_EventScript_CloseEntry:: call PokemonLeague_EventScript_CloseEntry return PokemonLeague_BrunosRoom_EventScript_SetDoorOpen:: call PokemonLeague_EventScript_SetDoorOpen return PokemonLeague_BrunosRoom_OnWarp:: map_script_2 VAR_TEMP_1, 0, PokemonLeague_BrunosRoom_EventScript_TurnPlayerNorth .2byte 0 PokemonLeague_BrunosRoom_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end PokemonLeague_BrunosRoom_OnFrame:: map_script_2 VAR_MAP_SCENE_POKEMON_LEAGUE, 1, PokemonLeague_BrunosRoom_EventScript_EnterRoom .2byte 0 PokemonLeague_BrunosRoom_EventScript_EnterRoom:: lockall call PokemonLeague_EventScript_EnterRoom setvar VAR_MAP_SCENE_POKEMON_LEAGUE, 2 releaseall end PokemonLeague_BrunosRoom_EventScript_Bruno:: lock faceplayer famechecker FAMECHECKER_BRUNO, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 goto_if_set FLAG_DEFEATED_BRUNO, PokemonLeague_BrunosRoom_EventScript_PostBattle famechecker FAMECHECKER_BRUNO, 0 famechecker FAMECHECKER_BRUNO, 1 call_if_unset FLAG_SYS_GAME_CLEAR, PokemonLeague_BrunosRoom_EventScript_Intro call_if_set FLAG_SYS_GAME_CLEAR, PokemonLeague_BrunosRoom_EventScript_RematchIntro setflag FLAG_TEMP_3 setflag FLAG_TEMP_5 call_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_BrunosRoom_EventScript_GetDifficulty call_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_BrunosRoom_EventScript_GetDifficulty2 clearflag FLAG_TEMP_5 goto PokemonLeague_BrunosRoom_EventScript_DefeatedBruno end PokemonLeague_BrunosRoom_EventScript_Intro:: msgbox PokemonLeague_BrunosRoom_Text_Intro return PokemonLeague_BrunosRoom_EventScript_RematchIntro:: msgbox PokemonLeague_BrunosRoom_Text_RematchIntro return PokemonLeague_BrunosRoom_EventScript_GetDifficulty:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_BrunosRoom_EventScript_Battle_ChallengeMode callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_BrunosRoom_EventScript_Battle return PokemonLeague_BrunosRoom_EventScript_GetDifficulty2:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_BrunosRoom_EventScript_Battle_ChallengeModeRematch callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_BrunosRoom_EventScript_Rematch return PokemonLeague_BrunosRoom_EventScript_Battle_ChallengeMode:: trainerbattle_no_intro TRAINER_ELITE_FOUR_BRUNO_CHALLENGE, PokemonLeague_BrunosRoom_Text_Defeat return PokemonLeague_BrunosRoom_EventScript_Battle:: trainerbattle_no_intro TRAINER_ELITE_FOUR_BRUNO, PokemonLeague_BrunosRoom_Text_Defeat return PokemonLeague_BrunosRoom_EventScript_Battle_ChallengeModeRematch:: trainerbattle_no_intro TRAINER_ELITE_FOUR_BRUNO_CHALLENGE_2, PokemonLeague_BrunosRoom_Text_Defeat return PokemonLeague_BrunosRoom_EventScript_Rematch:: trainerbattle_no_intro TRAINER_ELITE_FOUR_BRUNO_2, PokemonLeague_BrunosRoom_Text_Defeat return PokemonLeague_BrunosRoom_EventScript_PostBattle:: msgbox PokemonLeague_BrunosRoom_Text_PostBattle closemessage call_if_eq VAR_FACING, DIR_NORTH, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayRight call_if_eq VAR_FACING, DIR_SOUTH, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayLeft call_if_eq VAR_FACING, DIR_WEST, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown call_if_eq VAR_FACING, DIR_EAST, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown release end PokemonLeague_BrunosRoom_EventScript_DefeatedBruno:: setflag FLAG_DEFEATED_BRUNO call PokemonLeague_EventScript_OpenDoor msgbox PokemonLeague_BrunosRoom_Text_PostBattle closemessage call_if_eq VAR_FACING, DIR_NORTH, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayRight call_if_eq VAR_FACING, DIR_SOUTH, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayLeft call_if_eq VAR_FACING, DIR_WEST, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown call_if_eq VAR_FACING, DIR_EAST, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown release end PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayLeft:: applymovement LOCALID_BRUNO, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayRight:: applymovement LOCALID_BRUNO, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown:: applymovement LOCALID_BRUNO, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return ================================================ FILE: data/maps/PokemonLeague_BrunosRoom/text.inc ================================================ PokemonLeague_BrunosRoom_Text_Intro:: .string "I am BRUNO of the ELITE FOUR!\p" .string "Through rigorous training, people\n" .string "and POKéMON can become stronger\l" .string "without limit.\p" .string "I've lived and trained with my\n" .string "fighting POKéMON!\l" .string "And that will never change!\p" .string "{PLAYER}!\p" .string "We will grind you down with our\n" .string "superior power!\p" .string "Hoo hah!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" PokemonLeague_BrunosRoom_Text_RematchIntro:: .string "I am BRUNO of the ELITE FOUR!\p" .string "Through rigorous training, people\n" .string "and POKéMON can become stronger\l" .string "without limit.\p" .string "I've lived and trained with my\n" .string "fighting POKéMON!\l" .string "And that will never change!\p" .string "{PLAYER}!\p" .string "We will grind you down with our\n" .string "superior power!\p" .string "Hoo hah!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" PokemonLeague_BrunosRoom_Text_Defeat:: .string "Why?\n" .string "How could I lose?$" PokemonLeague_BrunosRoom_Text_PostBattle:: .string "My job is done.\n" .string "Go face your next challenge.$" ================================================ FILE: data/maps/PokemonLeague_ChampionsRoom/map.json ================================================ { "id": "MAP_POKEMON_LEAGUE_CHAMPIONS_ROOM", "name": "PokemonLeague_ChampionsRoom", "layout": "LAYOUT_POKEMON_LEAGUE_CHAMPIONS_ROOM", "music": "MUS_VICTORY_ROAD", "region_map_section": "MAPSEC_POKEMON_LEAGUE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "in_connection": false, "x": 6, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PROF_OAK", "in_connection": false, "x": 6, "y": 15, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_OAK_IN_CHAMP_ROOM" } ], "warp_events": [ { "x": 6, "y": 19, "elevation": 3, "dest_map": "MAP_POKEMON_LEAGUE_LANCES_ROOM", "dest_warp_id": "1" }, { "x": 6, "y": 2, "elevation": 3, "dest_map": "MAP_POKEMON_LEAGUE_HALL_OF_FAME", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonLeague_ChampionsRoom/scripts.inc ================================================ .equ LOCALID_RIVAL, 1 .equ LOCALID_PROF_OAK, 2 PokemonLeague_ChampionsRoom_MapScripts:: map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_ChampionsRoom_OnWarp map_script MAP_SCRIPT_ON_RESUME, PokemonLeague_ChampionsRoom_OnResume map_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_ChampionsRoom_OnFrame .byte 0 PokemonLeague_ChampionsRoom_OnResume:: setvar VAR_0x8004, 4 call PokemonLeague_EventScript_DoLightingEffect call_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerSquirtle call_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerBulbasaur call_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerCharmander end PokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerSquirtle:: goto_if_defeated TRAINER_CHAMPION_FIRST_SQUIRTLE, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger goto_if_defeated TRAINER_CHAMPION_REMATCH_SQUIRTLE, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger return PokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerBulbasaur:: goto_if_defeated TRAINER_CHAMPION_FIRST_BULBASAUR, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger goto_if_defeated TRAINER_CHAMPION_REMATCH_BULBASAUR, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger return PokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerCharmander:: goto_if_defeated TRAINER_CHAMPION_FIRST_CHARMANDER, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger goto_if_defeated TRAINER_CHAMPION_REMATCH_CHARMANDER, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger return PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger:: setvar VAR_TEMP_1, 1 return PokemonLeague_ChampionsRoom_OnWarp:: map_script_2 VAR_TEMP_1, 0, PokemonLeague_ChampionsRoom_EventScript_TurnPlayerNorth .2byte 0 PokemonLeague_ChampionsRoom_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end PokemonLeague_ChampionsRoom_OnFrame:: map_script_2 VAR_TEMP_1, 0, PokemonLeague_ChampionsRoom_EventScript_EnterRoom .2byte 0 PokemonLeague_ChampionsRoom_EventScript_EnterRoom:: lockall textcolor NPC_TEXT_COLOR_MALE setflag FLAG_TEMP_2 goto_if_questlog PokemonLeague_ChampionsRoom_EventScript_QuestLogFix applymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_ChampionsRoom_Movement_PlayerEnter waitmovement 0 delay 20 PokemonLeague_ChampionsRoom_EventScript_QuestLogFix: call_if_unset FLAG_SYS_GAME_CLEAR, PokemonLeague_ChampionsRoom_EventScript_Intro call_if_set FLAG_SYS_GAME_CLEAR, PokemonLeague_ChampionsRoom_EventScript_RematchIntro goto_if_questlog PokemonLeague_ChampionsRoom_EventScript_QuestLogEnd setflag FLAG_TEMP_3 setflag FLAG_TEMP_5 savebgm MUS_VICTORY_GYM_LEADER call_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_ChampionsRoom_EventScript_GetDifficulty call_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_ChampionsRoom_EventScript_GetDifficulty2 setflag FLAG_TEMP_4 clearflag FLAG_TEMP_5 setflag FLAG_DEFEATED_CHAMP setflag FLAG_TEMP_4 msgbox PokemonLeague_ChampionsRoom_Text_PostBattle playbgm MUS_SLOW_PALLET, 0 addobject LOCALID_PROF_OAK msgbox PokemonLeague_ChampionsRoom_Text_OakPlayer closemessage applymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_ChampionsRoom_Movement_PlayerWatchOakEnter applymovement LOCALID_RIVAL, PokemonLeague_ChampionsRoom_Movement_RivalWatchOakEnter applymovement LOCALID_PROF_OAK, PokemonLeague_ChampionsRoom_Movement_OakEnter waitmovement 0 delay 25 specialvar VAR_RESULT, GetStarterSpecies bufferspeciesname STR_VAR_1, VAR_RESULT msgbox PokemonLeague_ChampionsRoom_Text_OakCongratulations applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox PokemonLeague_ChampionsRoom_Text_OakImDisappointedRival closemessage applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 20 msgbox PokemonLeague_ChampionsRoom_Text_OakPlayerComeWithMe closemessage delay 13 applymovement LOCALID_PROF_OAK, PokemonLeague_ChampionsRoom_Movement_OakExit applymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_ChampionsRoom_Movement_PlayerExit waitmovement 0 playse SE_EXIT applymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_ChampionsRoom_Movement_PlayerExit2 waitmovement 0 setvar VAR_TEMP_1, 1 warp MAP_POKEMON_LEAGUE_HALL_OF_FAME, 5, 12 waitstate releaseall end PokemonLeague_ChampionsRoom_EventScript_QuestLogEnd:: call PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger releaseall end PokemonLeague_ChampionsRoom_EventScript_GetDifficulty:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_ChampionsRoom_EventScript_Battle_ChallengeMode callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_ChampionsRoom_EventScript_Battle return PokemonLeague_ChampionsRoom_EventScript_GetDifficulty2:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_ChampionsRoom_EventScript_Battle_ChallengeModeRematch callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_ChampionsRoom_EventScript_Rematch return PokemonLeague_ChampionsRoom_EventScript_Battle_ChallengeMode:: call_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_BattleSquirtle_ChallengeMode call_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_BattleBulbasaur_ChallengeMode call_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_BattleCharmander_ChallengeMode return PokemonLeague_ChampionsRoom_EventScript_Battle:: call_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_BattleSquirtle call_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_BattleBulbasaur call_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_BattleCharmander return PokemonLeague_ChampionsRoom_EventScript_Battle_ChallengeModeRematch:: call_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_RematchSquirtle_ChallengeMode call_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_RematchBulbasaur_ChallengeMode call_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_RematchCharmander_ChallengeMode return PokemonLeague_ChampionsRoom_EventScript_Rematch:: call_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_RematchSquirtle call_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_RematchBulbasaur call_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_RematchCharmander return PokemonLeague_ChampionsRoom_EventScript_Intro:: msgbox PokemonLeague_ChampionsRoom_Text_Intro return PokemonLeague_ChampionsRoom_EventScript_RematchIntro:: msgbox PokemonLeague_ChampionsRoom_Text_RematchIntro return PokemonLeague_ChampionsRoom_EventScript_BattleSquirtle_ChallengeMode:: trainerbattle_no_intro TRAINER_CHAMPION_FIRST_SQUIRTLE_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_BattleBulbasaur_ChallengeMode:: trainerbattle_no_intro TRAINER_CHAMPION_FIRST_BULBASAUR_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_BattleCharmander_ChallengeMode:: trainerbattle_no_intro TRAINER_CHAMPION_FIRST_CHARMANDER_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_BattleSquirtle:: trainerbattle_no_intro TRAINER_CHAMPION_FIRST_SQUIRTLE, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_BattleBulbasaur:: trainerbattle_no_intro TRAINER_CHAMPION_FIRST_BULBASAUR, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_BattleCharmander:: trainerbattle_no_intro TRAINER_CHAMPION_FIRST_CHARMANDER, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_RematchSquirtle_ChallengeMode:: trainerbattle_no_intro TRAINER_CHAMPION_REMATCH_SQUIRTLE_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_RematchBulbasaur_ChallengeMode:: trainerbattle_no_intro TRAINER_CHAMPION_REMATCH_BULBASAUR_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_RematchCharmander_ChallengeMode:: trainerbattle_no_intro TRAINER_CHAMPION_REMATCH_CHARMANDER_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_RematchSquirtle:: trainerbattle_no_intro TRAINER_CHAMPION_REMATCH_SQUIRTLE, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_RematchBulbasaur:: trainerbattle_no_intro TRAINER_CHAMPION_REMATCH_BULBASAUR, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_EventScript_RematchCharmander:: trainerbattle_no_intro TRAINER_CHAMPION_REMATCH_CHARMANDER, PokemonLeague_ChampionsRoom_Text_Defeat return PokemonLeague_ChampionsRoom_Movement_PlayerEnter:: walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up step_end PokemonLeague_ChampionsRoom_Movement_PlayerExit:: delay_16 walk_left walk_up walk_up walk_up walk_right walk_up walk_up step_end PokemonLeague_ChampionsRoom_Movement_PlayerExit2:: walk_up walk_up delay_8 set_invisible step_end PokemonLeague_ChampionsRoom_Movement_PlayerWatchOakEnter:: delay_8 walk_in_place_faster_down delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 walk_in_place_faster_left step_end PokemonLeague_ChampionsRoom_Movement_OakEnter:: delay_16 delay_16 walk_up walk_up walk_up walk_up walk_up walk_left walk_up walk_up walk_in_place_faster_down delay_16 step_end PokemonLeague_ChampionsRoom_Movement_OakExit:: walk_up walk_up walk_right walk_up walk_up walk_up walk_up delay_8 set_invisible step_end PokemonLeague_ChampionsRoom_Movement_RivalWatchOakEnter:: delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 walk_in_place_faster_left step_end ================================================ FILE: data/maps/PokemonLeague_ChampionsRoom/text.inc ================================================ PokemonLeague_ChampionsRoom_Text_Intro:: .string "{RIVAL}: Hey, {PLAYER}!\p" .string "I was looking forward to seeing\n" .string "you, {PLAYER}.\p" .string "My rival should be strong to keep\n" .string "me sharp.\p" .string "While working on my POKéDEX, I\n" .string "looked all over for POKéMON.\p" .string "Not only that, I assembled teams\n" .string "that would beat any POKéMON type.\p" .string "And now…\p" .string "I'm the POKéMON LEAGUE CHAMPION!\p" .string "{PLAYER}!\n" .string "Do you know what that means?\p" .string "I'll tell you.\p" .string "I am the most powerful TRAINER in\n" .string "the world!$" PokemonLeague_ChampionsRoom_Text_RematchIntro:: .string "{RIVAL}: Hey, {PLAYER}!\p" .string "You came back, {PLAYER}!\n" .string "Hahah, that is so great!\p" .string "My rival should be strong to keep\n" .string "me sharp.\p" .string "While working on my POKéDEX, I\n" .string "looked all over for POKéMON.\p" .string "Not only that, I assembled teams\n" .string "that would beat any POKéMON type.\p" .string "And now…\p" .string "I'm the POKéMON LEAGUE CHAMPION!\p" .string "{PLAYER}!\n" .string "Do you know what that means?\p" .string "I'll tell you.\p" .string "I am the most powerful TRAINER in\n" .string "the world!$" PokemonLeague_ChampionsRoom_Text_Defeat:: .string "NO!\n" .string "That can't be!\l" .string "You beat me at my best!\p" .string "After all that work to become\n" .string "the LEAGUE CHAMP?\p" .string "My reign is over already?\n" .string "It's not fair!$" PokemonLeague_ChampionsRoom_Text_PostBattle:: .string "Why?\n" .string "Why did I lose?\p" .string "I never made any mistakes raising\n" .string "my POKéMON…\p" .string "Darn it! You're the new POKéMON\n" .string "LEAGUE CHAMPION!\p" .string "Although I don't like to admit it…$" PokemonLeague_ChampionsRoom_Text_OakPlayer:: .string "OAK: {PLAYER}!$" PokemonLeague_ChampionsRoom_Text_OakCongratulations:: .string "OAK: So, you've won!\n" .string "Sincerely, congratulations!\p" .string "You're the new POKéMON LEAGUE\n" .string "CHAMPION!\p" .string "You've grown up so much since you\n" .string "first left with {STR_VAR_1} to work\l" .string "on the POKéDEX.\p" .string "{PLAYER}, you have come of age!$" PokemonLeague_ChampionsRoom_Text_OakImDisappointedRival:: .string "OAK: {RIVAL}…\n" .string "I'm disappointed in you.\p" .string "I came when I heard you'd beaten\n" .string "the ELITE FOUR.\p" .string "But, when I got here, you had\n" .string "already lost!\p" .string "{RIVAL}, do you understand why\n" .string "you lost?\p" .string "You have forgotten to treat your\n" .string "POKéMON with love and trust.\p" .string "Without them, you will never\n" .string "become a CHAMP again!$" PokemonLeague_ChampionsRoom_Text_OakPlayerComeWithMe:: .string "OAK: {PLAYER}.\p" .string "You understand that your victory\n" .string "was not just your own doing.\p" .string "The bond you share with your\n" .string "POKéMON is marvelous.\p" .string "{PLAYER}!\n" .string "Come with me!$" ================================================ FILE: data/maps/PokemonLeague_HallOfFame/map.json ================================================ { "id": "MAP_POKEMON_LEAGUE_HALL_OF_FAME", "name": "PokemonLeague_HallOfFame", "layout": "LAYOUT_POKEMON_LEAGUE_HALL_OF_FAME", "music": "MUS_SLOW_PALLET", "region_map_section": "MAPSEC_POKEMON_LEAGUE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PROF_OAK", "in_connection": false, "x": 6, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 12, "elevation": 3, "dest_map": "MAP_POKEMON_LEAGUE_CHAMPIONS_ROOM", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonLeague_HallOfFame/scripts.inc ================================================ .set LOCALID_PROF_OAK, 1 PokemonLeague_HallOfFame_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_HallOfFame_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_HallOfFame_OnWarp .byte 0 PokemonLeague_HallOfFame_OnWarp:: map_script_2 VAR_TEMP_1, 0, PokemonLeague_HallOfFame_EventScript_TurnPlayerNorth .2byte 0 PokemonLeague_HallOfFame_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end PokemonLeague_HallOfFame_OnFrame:: map_script_2 VAR_TEMP_1, 0, PokemonLeague_HallOfFame_EventScript_EnterRoom .2byte 0 PokemonLeague_HallOfFame_EventScript_EnterRoom:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_HallOfFame_Movement_EnterRoom waitmovement 0 applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterLeft applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 18 msgbox PokemonLeague_HallOfFame_Text_OakCongratulations closemessage applymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterUp applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 20 dofieldeffect FLDEFF_HALL_OF_FAME_RECORD waitfieldeffect FLDEFF_HALL_OF_FAME_RECORD delay 40 setvar VAR_TEMP_1, 1 call EventScript_SetDefeatedEliteFourFlagsVars setrespawn SPAWN_PALLET_TOWN fadescreenspeed FADE_TO_BLACK, 24 checkitem ITEM_OLD_SEA_MAP, 1 call_if_ne VAR_RESULT, TRUE, PokemonLeague_HallOfFame_EventScript_ActivateOldSeaMapEvent special EnterHallOfFame waitstate releaseall end PokemonLeague_HallOfFame_EventScript_ActivateOldSeaMapEvent:: clearflag FLAG_HIDE_LAVENDER_OUTSIDE_FUJI setflag FLAG_HIDE_POKEHOUSE_FUJI return PokemonLeague_HallOfFame_Movement_EnterRoom:: walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up step_end ================================================ FILE: data/maps/PokemonLeague_HallOfFame/text.inc ================================================ PokemonLeague_HallOfFame_Text_OakCongratulations:: .string "OAK: Er-hem!\n" .string "Congratulations, {PLAYER}!\p" .string "This floor is the POKéMON HALL OF\n" .string "FAME.\p" .string "POKéMON LEAGUE CHAMPIONS are\n" .string "honored for their exploits here.\p" .string "Their POKéMON are also recorded in\n" .string "the HALL OF FAME.\p" .string "{PLAYER}!\p" .string "You have worked hard to become\n" .string "the new LEAGUE CHAMPION.\p" .string "Congratulations, {PLAYER}, you and\n" .string "your POKéMON are HALL OF FAMERS!$" ================================================ FILE: data/maps/PokemonLeague_LancesRoom/map.json ================================================ { "id": "MAP_POKEMON_LEAGUE_LANCES_ROOM", "name": "PokemonLeague_LancesRoom", "layout": "LAYOUT_POKEMON_LEAGUE_LANCES_ROOM", "music": "MUS_VICTORY_ROAD", "region_map_section": "MAPSEC_POKEMON_LEAGUE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_LANCE", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LANCE", "in_connection": false, "x": 6, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonLeague_LancesRoom_EventScript_Lance", "flag": "0" } ], "warp_events": [ { "x": 23, "y": 13, "elevation": 3, "dest_map": "MAP_POKEMON_LEAGUE_AGATHAS_ROOM", "dest_warp_id": "1" }, { "x": 6, "y": 5, "elevation": 0, "dest_map": "MAP_POKEMON_LEAGUE_CHAMPIONS_ROOM", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonLeague_LancesRoom/scripts.inc ================================================ .set LOCALID_LANCE, 1 PokemonLeague_LancesRoom_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, PokemonLeague_LancesRoom_OnResume map_script MAP_SCRIPT_ON_LOAD, PokemonLeague_LancesRoom_OnLoad map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_LancesRoom_OnWarp map_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_LancesRoom_OnFrame .byte 0 PokemonLeague_LancesRoom_OnResume:: setvar VAR_0x8004, 3 call PokemonLeague_EventScript_DoLightingEffect end PokemonLeague_LancesRoom_OnLoad:: call_if_eq VAR_MAP_SCENE_POKEMON_LEAGUE, 4, PokemonLeague_LancesRoom_EventScript_CloseEntry call_if_set FLAG_DEFEATED_LANCE, PokemonLeague_LancesRoom_EventScript_SetDoorOpen end PokemonLeague_LancesRoom_EventScript_CloseEntry:: call PokemonLeague_LancesRoom_EventScript_SetEntryClosed return PokemonLeague_LancesRoom_EventScript_SetDoorOpen:: call PokemonLeague_EventScript_SetDoorOpenLance return PokemonLeague_LancesRoom_OnWarp:: map_script_2 VAR_TEMP_1, 0, PokemonLeague_LancesRoom_EventScript_TurnPlayerNorth .2byte 0 PokemonLeague_LancesRoom_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end PokemonLeague_LancesRoom_OnFrame:: map_script_2 VAR_MAP_SCENE_POKEMON_LEAGUE, 3, PokemonLeague_LancesRoom_EventScript_EnterRoom .2byte 0 PokemonLeague_LancesRoom_EventScript_EnterRoom:: lockall applymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_LancesRoom_Movement_WalkThroughCorridor waitmovement 0 setflag FLAG_TEMP_2 call PokemonLeague_LancesRoom_EventScript_SetEntryClosed playse SE_UNLOCK special DrawWholeMapView waitse setvar VAR_MAP_SCENE_POKEMON_LEAGUE, 4 releaseall end PokemonLeague_LancesRoom_EventScript_SetEntryClosed:: setmetatile 5, 14, METATILE_PokemonLeague_Entry_TopLeft_Closed, 1 setmetatile 6, 14, METATILE_PokemonLeague_Entry_TopMid_Closed, 1 setmetatile 7, 14, METATILE_PokemonLeague_Entry_TopRight_Closed, 1 setmetatile 5, 15, METATILE_PokemonLeague_Entry_BottomLeft_Closed, 1 setmetatile 6, 15, METATILE_PokemonLeague_Entry_BottomMid_Closed, 1 setmetatile 7, 15, METATILE_PokemonLeague_Entry_BottomRight_Closed, 1 setmetatile 6, 16, METATILE_PokemonLeague_Floor_ShadeFull_Lance, 0 setmetatile 7, 16, METATILE_PokemonLeague_Floor_ShadeFull_Lance, 0 return PokemonLeague_LancesRoom_Movement_WalkThroughCorridor:: walk_up walk_up walk_left walk_left walk_left walk_left walk_left walk_left walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_left walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up step_end PokemonLeague_LancesRoom_EventScript_Lance:: lock faceplayer famechecker FAMECHECKER_LANCE, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 goto_if_set FLAG_DEFEATED_LANCE, PokemonLeague_LancesRoom_EventScript_PostBattle famechecker FAMECHECKER_LANCE, 0 famechecker FAMECHECKER_LANCE, 1 call_if_unset FLAG_SYS_GAME_CLEAR, PokemonLeague_LancesRoom_EventScript_Intro call_if_set FLAG_SYS_GAME_CLEAR, PokemonLeague_LancesRoom_EventScript_RematchIntro setflag FLAG_TEMP_3 setflag FLAG_TEMP_5 call_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LancesRoom_EventScript_GetDifficulty call_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LancesRoom_EventScript_GetDifficulty2 clearflag FLAG_TEMP_5 goto PokemonLeague_LancesRoom_EventScript_DefeatedLance end PokemonLeague_LancesRoom_EventScript_Intro:: msgbox PokemonLeague_LancesRoom_Text_Intro return PokemonLeague_LancesRoom_EventScript_RematchIntro:: msgbox PokemonLeague_LancesRoom_Text_RematchIntro return PokemonLeague_LancesRoom_EventScript_GetDifficulty:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_LancesRoom_EventScript_Battle_ChallengeMode callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_LancesRoom_EventScript_Battle return PokemonLeague_LancesRoom_EventScript_GetDifficulty2:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_LancesRoom_EventScript_Battle_ChallengeModeRematch callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_LancesRoom_EventScript_Rematch return PokemonLeague_LancesRoom_EventScript_Battle_ChallengeMode:: trainerbattle_no_intro TRAINER_ELITE_FOUR_LANCE_CHALLENGE, PokemonLeague_LancesRoom_Text_Defeat return PokemonLeague_LancesRoom_EventScript_Battle:: trainerbattle_no_intro TRAINER_ELITE_FOUR_LANCE, PokemonLeague_LancesRoom_Text_Defeat return PokemonLeague_LancesRoom_EventScript_Battle_ChallengeModeRematch:: trainerbattle_no_intro TRAINER_ELITE_FOUR_LANCE_CHALLENGE_2, PokemonLeague_LancesRoom_Text_Defeat return PokemonLeague_LancesRoom_EventScript_Rematch:: trainerbattle_no_intro TRAINER_ELITE_FOUR_LANCE_2, PokemonLeague_LancesRoom_Text_Defeat return PokemonLeague_LancesRoom_EventScript_PostBattle:: msgbox PokemonLeague_LancesRoom_Text_PostBattle release end PokemonLeague_LancesRoom_EventScript_DefeatedLance:: setvar VAR_0x8004, 0 special Script_TryGainNewFanFromCounter setflag FLAG_DEFEATED_LANCE call PokemonLeague_EventScript_OpenDoorLance msgbox PokemonLeague_LancesRoom_Text_PostBattle closemessage release end PokemonLeague_LancesRoom_EventScript_LanceMoveOutOfWayLeft:: applymovement LOCALID_LANCE, PokemonLeague_LancesRoom_Movement_LanceMoveOutOfWayLeft waitmovement 0 return PokemonLeague_LancesRoom_EventScript_LanceMoveOutOfWayRight:: applymovement LOCALID_LANCE, PokemonLeague_LancesRoom_Movement_LanceMoveOutOfWayRight waitmovement 0 return PokemonLeague_LancesRoom_Movement_LanceMoveOutOfWayLeft:: walk_left walk_in_place_faster_right step_end PokemonLeague_LancesRoom_Movement_LanceMoveOutOfWayRight:: walk_right walk_in_place_faster_left step_end ================================================ FILE: data/maps/PokemonLeague_LancesRoom/text.inc ================================================ PokemonLeague_LancesRoom_Text_Intro:: .string "Ah! I've heard about you,\n" .string "{PLAYER}!\p" .string "I lead the ELITE FOUR.\p" .string "You can call me LANCE the dragon\n" .string "TRAINER.\p" .string "You know that dragons are\n" .string "mythical POKéMON.\p" .string "They're hard to catch and raise,\n" .string "but their powers are superior.\p" .string "They're virtually indestructible.\n" .string "There's no being clever with them.\p" .string "Well, are you ready to lose?\p" .string "Your LEAGUE challenge ends with\n" .string "me, {PLAYER}!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" PokemonLeague_LancesRoom_Text_RematchIntro:: .string "Ah!\n" .string "So, you've returned, {PLAYER}!\p" .string "I lead the ELITE FOUR.\p" .string "You can call me LANCE the dragon\n" .string "TRAINER.\p" .string "You know that dragons are\n" .string "mythical POKéMON.\p" .string "They're hard to catch and raise,\n" .string "but their powers are superior.\p" .string "They're virtually indestructible.\n" .string "There's no being clever with them.\p" .string "Well, are you ready to lose?\p" .string "Your LEAGUE challenge ends with\n" .string "me, {PLAYER}!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" PokemonLeague_LancesRoom_Text_Defeat:: .string "That's it!\p" .string "I hate to admit it, but you are a\n" .string "POKéMON master!$" PokemonLeague_LancesRoom_Text_PostBattle:: .string "I still can't believe my dragons\n" .string "lost to you, {PLAYER}.\p" .string "You are now the POKéMON LEAGUE\n" .string "CHAMPION!\p" .string "…Or, you would have been, but\n" .string "you have one more challenge left.\p" .string "There is one more TRAINER to face!\n" .string "His name is…\p" .string "{RIVAL}!\p" .string "He beat the ELITE FOUR before\n" .string "you.\p" .string "He is the real POKéMON LEAGUE\n" .string "CHAMPION.$" ================================================ FILE: data/maps/PokemonLeague_LoreleisRoom/map.json ================================================ { "id": "MAP_POKEMON_LEAGUE_LORELEIS_ROOM", "name": "PokemonLeague_LoreleisRoom", "layout": "LAYOUT_POKEMON_LEAGUE_LORELEIS_ROOM", "music": "MUS_GYM", "region_map_section": "MAPSEC_POKEMON_LEAGUE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_LORELEI", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LORELEI", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonLeague_LoreleisRoom_EventScript_Lorelei", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 12, "elevation": 0, "dest_map": "MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 6, "y": 2, "elevation": 0, "dest_map": "MAP_POKEMON_LEAGUE_BRUNOS_ROOM", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonLeague_LoreleisRoom/scripts.inc ================================================ PokemonLeague_LoreleisRoom_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, PokemonLeague_LoreleisRoom_OnResume map_script MAP_SCRIPT_ON_LOAD, PokemonLeague_LoreleisRoom_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, PokemonLeague_LoreleisRoom_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_LoreleisRoom_OnWarp map_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_LoreleisRoom_OnFrame .byte 0 PokemonLeague_LoreleisRoom_OnResume:: setvar VAR_0x8004, 0 call PokemonLeague_EventScript_DoLightingEffect end PokemonLeague_LoreleisRoom_OnLoad:: call_if_set FLAG_DEFEATED_LORELEI, PokemonLeague_LoreleisRoom_EventScript_SetDoorOpen call_if_eq VAR_MAP_SCENE_POKEMON_LEAGUE, 1, PokemonLeague_LoreleisRoom_EventScript_CloseEntry end PokemonLeague_LoreleisRoom_EventScript_CloseEntry:: call PokemonLeague_EventScript_CloseEntry return PokemonLeague_LoreleisRoom_EventScript_SetDoorOpen:: call PokemonLeague_EventScript_SetDoorOpen return PokemonLeague_LoreleisRoom_OnTransition:: setworldmapflag FLAG_WORLD_MAP_POKEMON_LEAGUE_LORELEIS_ROOM end PokemonLeague_LoreleisRoom_OnWarp:: map_script_2 VAR_TEMP_1, 0, PokemonLeague_LoreleisRoom_EventScript_TurnPlayerNorth .2byte 0 PokemonLeague_LoreleisRoom_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end PokemonLeague_LoreleisRoom_OnFrame:: map_script_2 VAR_MAP_SCENE_POKEMON_LEAGUE, 0, PokemonLeague_LoreleisRoom_EventScript_EnterRoom .2byte 0 PokemonLeague_LoreleisRoom_EventScript_EnterRoom:: lockall call PokemonLeague_EventScript_EnterRoom setvar VAR_MAP_SCENE_POKEMON_LEAGUE, 1 releaseall end PokemonLeague_LoreleisRoom_EventScript_Lorelei:: lock faceplayer famechecker FAMECHECKER_LORELEI, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 goto_if_set FLAG_DEFEATED_LORELEI, PokemonLeague_LoreleisRoom_EventScript_PostBattle famechecker FAMECHECKER_LORELEI, 0 famechecker FAMECHECKER_LORELEI, 1 call_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LoreleisRoom_EventScript_Intro call_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LoreleisRoom_EventScript_RematchIntro setflag FLAG_TEMP_3 setflag FLAG_TEMP_5 call_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LoreleisRoom_EventScript_GetDifficulty call_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LoreleisRoom_EventScript_GetDifficulty2 clearflag FLAG_TEMP_5 goto PokemonLeague_LoreleisRoom_EventScript_DefeatedLorelei end PokemonLeague_LoreleisRoom_EventScript_Intro:: msgbox PokemonLeague_LoreleisRoom_Text_Intro return PokemonLeague_LoreleisRoom_EventScript_RematchIntro:: msgbox PokemonLeague_LoreleisRoom_Text_RematchIntro return PokemonLeague_LoreleisRoom_EventScript_GetDifficulty:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_LoreleisRoom_EventScript_Battle_ChallengeMode callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_LoreleisRoom_EventScript_Battle return PokemonLeague_LoreleisRoom_EventScript_GetDifficulty2:: callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, TRUE, PokemonLeague_LoreleisRoom_EventScript_Battle_ChallengeModeRematch callnative IsChallengeModeToVarResult call_if_eq VAR_RESULT, FALSE, PokemonLeague_LoreleisRoom_EventScript_Rematch return PokemonLeague_LoreleisRoom_EventScript_Battle_ChallengeMode:: trainerbattle_no_intro TRAINER_ELITE_FOUR_LORELEI_CHALLENGE, PokemonLeague_LoreleisRoom_Text_Defeat return PokemonLeague_LoreleisRoom_EventScript_Battle:: trainerbattle_no_intro TRAINER_ELITE_FOUR_LORELEI, PokemonLeague_LoreleisRoom_Text_Defeat return PokemonLeague_LoreleisRoom_EventScript_Battle_ChallengeModeRematch:: trainerbattle_no_intro TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2, PokemonLeague_LoreleisRoom_Text_Defeat return PokemonLeague_LoreleisRoom_EventScript_Rematch:: trainerbattle_no_intro TRAINER_ELITE_FOUR_LORELEI_2, PokemonLeague_LoreleisRoom_Text_Defeat return PokemonLeague_LoreleisRoom_EventScript_PostBattle:: msgbox PokemonLeague_LoreleisRoom_Text_PostBattle release end PokemonLeague_LoreleisRoom_EventScript_DefeatedLorelei:: setflag FLAG_DEFEATED_LORELEI call PokemonLeague_EventScript_OpenDoor msgbox PokemonLeague_LoreleisRoom_Text_PostBattle release end ================================================ FILE: data/maps/PokemonLeague_LoreleisRoom/text.inc ================================================ PokemonLeague_LoreleisRoom_Text_Intro:: .string "Welcome to the POKéMON LEAGUE.\p" .string "I am LORELEI of the ELITE FOUR.\p" .string "No one can best me when it comes\n" .string "to icy POKéMON.\p" .string "Freezing moves are powerful.\p" .string "Your POKéMON will be at my mercy\n" .string "when they are frozen solid.\p" .string "Hahaha!\n" .string "Are you ready?{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" PokemonLeague_LoreleisRoom_Text_RematchIntro:: .string "Welcome to the POKéMON LEAGUE.\p" .string "I, LORELEI of the ELITE FOUR,\n" .string "have returned!\p" .string "You know how it goes.\n" .string "No one can best me when it comes\l" .string "to icy POKéMON.\p" .string "Freezing moves are powerful.\p" .string "Your POKéMON will be at my mercy\n" .string "when they are frozen solid.\p" .string "Hahaha!\n" .string "Are you ready?{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" PokemonLeague_LoreleisRoom_Text_Defeat:: .string "…Things shouldn't be this way!$" PokemonLeague_LoreleisRoom_Text_PostBattle:: .string "You're better than I thought.\n" .string "Go on ahead.\p" .string "You only got a taste of the\n" .string "POKéMON LEAGUE's power.$" ================================================ FILE: data/maps/PokemonMansion_1F/map.json ================================================ { "id": "MAP_POKEMON_MANSION_1F", "name": "PokemonMansion_1F", "layout": "LAYOUT_POKEMON_MANSION_1F", "music": "MUS_POKE_MANSION", "region_map_section": "MAPSEC_POKEMON_MANSION", "requires_flash": false, "weather": "WEATHER_SHADE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 22, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "PokemonMansion_1F_EventScript_Ted", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 29, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_1F_EventScript_ItemCarbos", "flag": "FLAG_HIDE_POKEMON_MANSION_1F_CARBOS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 22, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_1F_EventScript_ItemEscapeRope", "flag": "FLAG_HIDE_POKEMON_MANSION_1F_ESCAPE_ROPE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 27, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_1F_EventScript_ItemProtein", "flag": "FLAG_HIDE_POKEMON_MANSION_1F_PROTEIN" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 8, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "PokemonMansion_1F_EventScript_Johnson", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 26, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Magmar", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 7, "y": 33, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "0" }, { "x": 8, "y": 33, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "0" }, { "x": 9, "y": 33, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "0" }, { "x": 10, "y": 13, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_2F", "dest_warp_id": "2" }, { "x": 25, "y": 27, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_B1F", "dest_warp_id": "0" }, { "x": 34, "y": 33, "elevation": 3, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "0" }, { "x": 35, "y": 34, "elevation": 0, "dest_map": "MAP_CINNABAR_ISLAND", "dest_warp_id": "0" }, { "x": 19, "y": 22, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_3F", "dest_warp_id": "3" }, { "x": 20, "y": 22, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_3F", "dest_warp_id": "4" }, { "x": 11, "y": 13, "elevation": 0, "dest_map": "MAP_POKEMON_MANSION_2F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 5, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "PokemonMansion_1F_EventScript_Statue" }, { "type": "hidden_item", "x": 2, "y": 21, "elevation": 0, "item": "ITEM_MOON_STONE", "flag": "FLAG_HIDDEN_ITEM_POKEMON_MANSION_1F_MOON_STONE", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonMansion_1F/scripts.inc ================================================ .set LOCALID_MAGMAR_MASTER, 6 .set TRAINER, VAR_0x8009 PokemonMansion_1F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, PokemonMansion_1F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, PokemonMansion_1F_OnTransition .byte 0 PokemonMansion_1F_OnLoad:: call_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_PressSwitch_1F end PokemonMansion_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_POKEMON_MANSION_1F goto PokemonMansion_1F_MapScript_SetMasterTrainerMovementTypes end PokemonMansion_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MAGMAR callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PokemonMansion_1F_MapScript_MagmarMasterMovementType end PokemonMansion_1F_MapScript_MagmarMasterMovementType:: setobjectmovementtype LOCALID_MAGMAR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PokemonMansion_1F_EventScript_Statue:: lockall setvar VAR_0x8004, 0 call PokemonMansion_EventScript_SecretSwitch playse SE_UNLOCK special DrawWholeMapView waitse releaseall end PokemonMansion_1F_EventScript_Ted:: trainerbattle_single TRAINER_SCIENTIST_TED, PokemonMansion_1F_Text_TedIntro, PokemonMansion_1F_Text_TedDefeat msgbox PokemonMansion_1F_Text_TedPostBattle, MSGBOX_AUTOCLOSE end PokemonMansion_1F_EventScript_Johnson:: trainerbattle_single TRAINER_YOUNGSTER_JOHNSON, PokemonMansion_1F_Text_JohnsonIntro, PokemonMansion_1F_Text_JohnsonDefeat msgbox PokemonMansion_1F_Text_JohnsonPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/PokemonMansion_1F/text.inc ================================================ PokemonMansion_1F_Text_TedIntro:: .string "Who are you?\n" .string "There shouldn't be anyone here.$" PokemonMansion_1F_Text_TedDefeat:: .string "Ouch!$" PokemonMansion_1F_Text_TedPostBattle:: .string "A key? I don't know what you're\n" .string "talking about.$" PokemonMansion_1F_Text_JohnsonIntro:: .string "W-w-waah! You startled me!\n" .string "I thought you were a ghost.$" PokemonMansion_1F_Text_JohnsonDefeat:: .string "Tch!\n" .string "I can't get any wins.$" PokemonMansion_1F_Text_JohnsonPostBattle:: .string "I was exploring here by myself,\n" .string "but I feel spooked.\p" .string "I ought to go soon.$" ================================================ FILE: data/maps/PokemonMansion_2F/map.json ================================================ { "id": "MAP_POKEMON_MANSION_2F", "name": "PokemonMansion_2F", "layout": "LAYOUT_POKEMON_MANSION_2F", "music": "MUS_POKE_MANSION", "region_map_section": "MAPSEC_POKEMON_MANSION", "requires_flash": false, "weather": "WEATHER_SHADE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BURGLAR", "x": 5, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "PokemonMansion_2F_EventScript_Arnie", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 36, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_2F_EventScript_ItemCalcium", "flag": "FLAG_HIDE_POKEMON_MANSION_2F_CALCIUM" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 18, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_2F_EventScript_ItemZinc", "flag": "FLAG_HIDE_POKEMON_MANSION_2F_ZINC" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 35, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_2F_EventScript_ItemHPUp", "flag": "FLAG_HIDE_POKEMON_MANSION_2F_HP_UP" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 20, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Muk", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 9, "y": 3, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_3F", "dest_warp_id": "0" }, { "x": 34, "y": 22, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_3F", "dest_warp_id": "1" }, { "x": 6, "y": 14, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_1F", "dest_warp_id": "3" }, { "x": 9, "y": 14, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_3F", "dest_warp_id": "2" }, { "x": 27, "y": 17, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_3F", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 2, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "PokemonMansion_2F_EventScript_Statue" }, { "type": "sign", "x": 6, "y": 31, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PokemonMansion_2F_EventScript_DiaryJuly10th" }, { "type": "sign", "x": 25, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PokemonMansion_2F_EventScript_DiaryJuly5th" } ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonMansion_2F/scripts.inc ================================================ .set LOCALID_MUK_MASTER, 5 .set TRAINER, VAR_0x8009 PokemonMansion_2F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, PokemonMansion_2F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, PokemonMansion_2F_MapScript_SetMasterTrainerMovementTypes .byte 0 PokemonMansion_2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MUK callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PokemonMansion_2F_MapScript_MukMasterMovementType end PokemonMansion_2F_MapScript_MukMasterMovementType:: setobjectmovementtype LOCALID_MUK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PokemonMansion_2F_OnLoad:: call_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_PressSwitch_2F end PokemonMansion_2F_EventScript_Statue:: lockall setvar VAR_0x8004, 1 call PokemonMansion_EventScript_SecretSwitch playse SE_UNLOCK special DrawWholeMapView waitse releaseall end PokemonMansion_2F_EventScript_DiaryJuly5th:: msgbox PokemonMansion_1F_Text_NewMonDiscoveredInGuyanaJungle, MSGBOX_SIGN end PokemonMansion_2F_EventScript_DiaryJuly10th:: msgbox PokemonMansion_1F_Text_ChristenedDiscoveredMonMew, MSGBOX_SIGN end PokemonMansion_2F_EventScript_Arnie:: trainerbattle_single TRAINER_BURGLAR_ARNIE, PokemonMansion_1F_Text_ArnieIntro, PokemonMansion_1F_Text_ArnieDefeat msgbox PokemonMansion_1F_Text_ArniePostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/PokemonMansion_2F/text.inc ================================================ PokemonMansion_Text_PressSecretSwitch:: .string "A secret switch!\p" .string "Press it?$" PokemonMansion_Text_WhoWouldnt:: .string "Who wouldn't?$" PokemonMansion_Text_NotQuiteYet:: .string "Not quite yet!$" PokemonMansion_1F_Text_ArnieIntro:: .string "I can't get out!\n" .string "This old place is one big puzzle.$" PokemonMansion_1F_Text_ArnieDefeat:: .string "Oh, no!\n" .string "My bag of loot!$" PokemonMansion_1F_Text_ArniePostBattle:: .string "The switches here open and close\n" .string "alternating sets of doors.$" PokemonMansion_1F_Text_NewMonDiscoveredInGuyanaJungle:: .string "Diary: July 5\n" .string "Guyana, South America\p" .string "A new POKéMON was discovered deep\n" .string "in the jungle.$" PokemonMansion_1F_Text_ChristenedDiscoveredMonMew:: .string "Diary: July 10\n" .string "We christened the newly discovered\l" .string "POKéMON, MEW.$" ================================================ FILE: data/maps/PokemonMansion_3F/map.json ================================================ { "id": "MAP_POKEMON_MANSION_3F", "name": "PokemonMansion_3F", "layout": "LAYOUT_POKEMON_MANSION_3F", "music": "MUS_POKE_MANSION", "region_map_section": "MAPSEC_POKEMON_MANSION", "requires_flash": false, "weather": "WEATHER_SHADE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BURGLAR", "x": 7, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "PokemonMansion_3F_EventScript_Simon", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 22, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "PokemonMansion_3F_EventScript_Braydon", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 9, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_3F_EventScript_ItemMaxPotion", "flag": "FLAG_HIDE_POKEMON_MANSION_3F_MAX_POTION" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 32, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_3F_EventScript_ItemIron", "flag": "FLAG_HIDE_POKEMON_MANSION_3F_IRON" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 36, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Ditto", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 8, "y": 3, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_2F", "dest_warp_id": "0" }, { "x": 34, "y": 18, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_2F", "dest_warp_id": "1" }, { "x": 11, "y": 11, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_2F", "dest_warp_id": "3" }, { "x": 18, "y": 18, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_1F", "dest_warp_id": "7" }, { "x": 19, "y": 18, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_1F", "dest_warp_id": "8" }, { "x": 23, "y": 18, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_2F", "dest_warp_id": "4" }, { "x": 20, "y": 18, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_1F", "dest_warp_id": "8" }, { "x": 24, "y": 18, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_2F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 8, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PokemonMansion_3F_EventScript_DiaryFeb6th" }, { "type": "sign", "x": 12, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "PokemonMansion_3F_EventScript_Statue" }, { "type": "hidden_item", "x": 36, "y": 13, "elevation": 3, "item": "ITEM_RARE_CANDY", "flag": "FLAG_HIDDEN_ITEM_POKEMON_MANSION_3F_RARE_CANDY", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonMansion_3F/scripts.inc ================================================ .set LOCALID_DITTO_MASTER, 5 .set TRAINER, VAR_0x8009 PokemonMansion_3F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, PokemonMansion_3F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, PokemonMansion_3F_MapScript_SetMasterTrainerMovementTypes .byte 0 PokemonMansion_3F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_DITTO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PokemonMansion_3F_MapScript_DittoMasterMovementType end PokemonMansion_3F_MapScript_DittoMasterMovementType:: setobjectmovementtype LOCALID_DITTO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PokemonMansion_3F_OnLoad:: call_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_PressSwitch_3F end PokemonMansion_3F_EventScript_Statue:: lockall setvar VAR_0x8004, 2 call PokemonMansion_EventScript_SecretSwitch playse SE_UNLOCK special DrawWholeMapView waitse releaseall end PokemonMansion_3F_EventScript_DiaryFeb6th:: msgbox PokemonMansion_1F_Text_MewGaveBirthToMewtwo, MSGBOX_SIGN end PokemonMansion_3F_EventScript_Simon:: trainerbattle_single TRAINER_BURGLAR_SIMON, PokemonMansion_1F_Text_SimonIntro, PokemonMansion_1F_Text_SimonDefeat msgbox PokemonMansion_1F_Text_SimonPostBattle, MSGBOX_AUTOCLOSE end PokemonMansion_3F_EventScript_Braydon:: trainerbattle_single TRAINER_SCIENTIST_BRAYDON, PokemonMansion_1F_Text_BraydonIntro, PokemonMansion_1F_Text_BraydonDefeat msgbox PokemonMansion_1F_Text_BraydonPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/PokemonMansion_3F/text.inc ================================================ PokemonMansion_1F_Text_SimonIntro:: .string "This place is, like, huge!$" PokemonMansion_1F_Text_SimonDefeat:: .string "Ayah!$" PokemonMansion_1F_Text_SimonPostBattle:: .string "I wonder where my partner went.$" PokemonMansion_1F_Text_BraydonIntro:: .string "My mentor once lived here.$" PokemonMansion_1F_Text_BraydonDefeat:: .string "Whew!\n" .string "Overwhelming!$" PokemonMansion_1F_Text_BraydonPostBattle:: .string "So, you're stuck?\n" .string "Try jumping off over there!$" PokemonMansion_1F_Text_MewGaveBirthToMewtwo:: .string "Diary: Feb. 6\n" .string "MEW gave birth.\p" .string "We named the newborn MEWTWO.$" ================================================ FILE: data/maps/PokemonMansion_B1F/map.json ================================================ { "id": "MAP_POKEMON_MANSION_B1F", "name": "PokemonMansion_B1F", "layout": "LAYOUT_POKEMON_MANSION_B1F", "music": "MUS_POKE_MANSION", "region_map_section": "MAPSEC_POKEMON_MANSION", "requires_flash": false, "weather": "WEATHER_SHADE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 6, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_B1F_EventScript_ItemTM22", "flag": "FLAG_HIDE_POKEMON_MANSION_B1F_TM22" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BURGLAR", "x": 20, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "PokemonMansion_B1F_EventScript_Lewis", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 34, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "6", "script": "PokemonMansion_B1F_EventScript_Ivan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 23, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_B1F_EventScript_ItemTM14", "flag": "FLAG_HIDE_POKEMON_MANSION_B1F_TM14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 2, "y": 29, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_B1F_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_POKEMON_MANSION_B1F_FULL_RESTORE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonMansion_B1F_EventScript_ItemSecretKey", "flag": "FLAG_HIDE_POKEMON_MANSION_B1F_SECRET_KEY" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 25, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Mewtwo", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 9, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Mew", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 34, "y": 29, "elevation": 3, "dest_map": "MAP_POKEMON_MANSION_1F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 21, "y": 27, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PokemonMansion_B1F_EventScript_DiarySep1st" }, { "type": "sign", "x": 24, "y": 29, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "PokemonMansion_B1F_EventScript_Statue" }, { "type": "sign", "x": 27, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "PokemonMansion_B1F_EventScript_Statue" }, { "type": "hidden_item", "x": 35, "y": 5, "elevation": 3, "item": "ITEM_ELIXIR", "flag": "FLAG_HIDDEN_ITEM_POKEMON_MANSION_B1F_ELIXIR", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/PokemonMansion_B1F/scripts.inc ================================================ .set LOCALID_MEWTWO_MASTER, 7 .set LOCALID_MEW_MASTER, 8 .set TRAINER, VAR_0x8009 PokemonMansion_B1F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, PokemonMansion_B1F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, PokemonMansion_B1F_MapScript_SetMasterTrainerMovementTypes .byte 0 PokemonMansion_B1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MEWTWO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PokemonMansion_B1F_MapScript_MewtwoMasterMovementType setvar TRAINER, MASTER_MEW callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PokemonMansion_B1F_MapScript_MewMasterMovementType end PokemonMansion_B1F_MapScript_MewtwoMasterMovementType:: setobjectmovementtype LOCALID_MEWTWO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PokemonMansion_B1F_MapScript_MewMasterMovementType:: setobjectmovementtype LOCALID_MEW_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PokemonMansion_B1F_OnLoad:: call_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_PressSwitch_B1F end PokemonMansion_B1F_EventScript_Statue:: lockall setvar VAR_0x8004, 3 call PokemonMansion_EventScript_SecretSwitch playse SE_UNLOCK special DrawWholeMapView waitse releaseall end PokemonMansion_B1F_EventScript_DiarySep1st:: msgbox PokemonMansion_B1F_Text_MewtwoIsFarTooPowerful, MSGBOX_SIGN end PokemonMansion_B1F_EventScript_Lewis:: trainerbattle_single TRAINER_BURGLAR_LEWIS, PokemonMansion_B1F_Text_LewisIntro, PokemonMansion_B1F_Text_LewisDefeat msgbox PokemonMansion_B1F_Text_LewisPostBattle, MSGBOX_AUTOCLOSE end PokemonMansion_B1F_EventScript_Ivan:: trainerbattle_single TRAINER_SCIENTIST_IVAN, PokemonMansion_B1F_Text_IvanIntro, PokemonMansion_B1F_Text_IvanDefeat msgbox PokemonMansion_B1F_Text_IvanPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/PokemonMansion_B1F/text.inc ================================================ PokemonMansion_B1F_Text_LewisIntro:: .string "Uh-oh…\n" .string "Where am I now?$" PokemonMansion_B1F_Text_LewisDefeat:: .string "Awooh!$" PokemonMansion_B1F_Text_LewisPostBattle:: .string "You can find stuff lying around.\n" .string "The residents must've left them.$" PokemonMansion_B1F_Text_IvanIntro:: .string "This place is ideal for a lab.\n" .string "Look at all this space.$" PokemonMansion_B1F_Text_IvanDefeat:: .string "What was that for?$" PokemonMansion_B1F_Text_IvanPostBattle:: .string "I like it here.\n" .string "It's conducive to my studies.$" PokemonMansion_B1F_Text_MewtwoIsFarTooPowerful:: .string "Diary: Sept. 1\n" .string "MEWTWO is far too powerful.\p" .string "We have failed to curb its vicious\n" .string "tendencies…$" ================================================ FILE: data/maps/PokemonTower_1F/map.json ================================================ { "id": "MAP_POKEMON_TOWER_1F", "name": "PokemonTower_1F", "layout": "LAYOUT_POKEMON_TOWER_1F", "music": "MUS_POKE_TOWER", "region_map_section": "MAPSEC_POKEMON_TOWER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 18, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_1F_EventScript_WorkerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 18, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_1F_EventScript_Channeler", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 15, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_1F_EventScript_Woman1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 7, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_1F_EventScript_Woman2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 8, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_1F_EventScript_BaldingMan", "flag": "0" } ], "warp_events": [ { "x": 10, "y": 19, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "0" }, { "x": 11, "y": 18, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "0" }, { "x": 12, "y": 19, "elevation": 3, "dest_map": "MAP_LAVENDER_TOWN", "dest_warp_id": "0" }, { "x": 18, "y": 9, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_2F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "2" } ================================================ FILE: data/maps/PokemonTower_1F/scripts.inc ================================================ PokemonTower_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_1F_OnTransition .byte 0 PokemonTower_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_POKEMON_TOWER_1F end PokemonTower_1F_EventScript_Channeler:: msgbox PokemonTower_1F_Text_SenseSpiritsUpToMischief, MSGBOX_NPC end PokemonTower_1F_EventScript_Woman1:: msgbox PokemonTower_1F_Text_GrowlitheWhyDidYouDie, MSGBOX_NPC end PokemonTower_1F_EventScript_BaldingMan:: msgbox PokemonTower_1F_Text_CameToPrayForDepartedClefairy, MSGBOX_NPC end PokemonTower_1F_EventScript_Woman2:: lock faceplayer checkplayergender goto_if_eq VAR_RESULT, MALE, PokemonTower_1F_EventScript_Woman2MalePlayer msgbox PokemonTower_1F_Text_ComeToPayRespectsGirl release end PokemonTower_1F_EventScript_Woman2MalePlayer:: msgbox PokemonTower_1F_Text_ComeToPayRespectsSon release end PokemonTower_1F_EventScript_WorkerF:: msgbox PokemonTower_1F_Text_ErectedInMemoryOfDeadMons, MSGBOX_NPC end ================================================ FILE: data/maps/PokemonTower_1F/text.inc ================================================ PokemonTower_1F_Text_ErectedInMemoryOfDeadMons:: .string "POKéMON TOWER was erected in the\n" .string "memory of POKéMON that died.$" PokemonTower_1F_Text_ComeToPayRespectsSon:: .string "Did you come to pay respects?\p" .string "Bless your POKéMON-loving heart,\n" .string "son.$" PokemonTower_1F_Text_ComeToPayRespectsGirl:: .string "Did you come to pay respects?\p" .string "Bless your POKéMON-loving heart,\n" .string "girl.$" PokemonTower_1F_Text_CameToPrayForDepartedClefairy:: .string "I came to pray for my dearly\n" .string "departed CLEFAIRY.\p" .string "Sniff!\n" .string "I'm awash in tears…$" PokemonTower_1F_Text_GrowlitheWhyDidYouDie:: .string "My GROWLITHE…\n" .string "Why did you die?$" PokemonTower_1F_Text_SenseSpiritsUpToMischief:: .string "I am a CHANNELER.\p" .string "There are spirits up to mischief.\n" .string "I sense them high in the TOWER.$" ================================================ FILE: data/maps/PokemonTower_2F/map.json ================================================ { "id": "MAP_POKEMON_TOWER_2F", "name": "PokemonTower_2F", "layout": "LAYOUT_POKEMON_TOWER_2F", "music": "MUS_POKE_TOWER", "region_map_section": "MAPSEC_POKEMON_TOWER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "in_connection": false, "x": 16, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_TOWER_RIVAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 3, "y": 7, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_2F_EventScript_Channeler", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 10, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_3F", "dest_warp_id": "0" }, { "x": 18, "y": 10, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_1F", "dest_warp_id": "3" } ], "coord_events": [ { "type": "trigger", "x": 17, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_POKEMON_TOWER_2F", "var_value": "0", "script": "PokemonTower_2F_EventScript_RivalTriggerRight" }, { "type": "trigger", "x": 16, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_POKEMON_TOWER_2F", "var_value": "0", "script": "PokemonTower_2F_EventScript_RivalTriggerDown" } ], "bg_events": [ ], "level_scaling": "2" } ================================================ FILE: data/maps/PokemonTower_2F/scripts.inc ================================================ .set LOCALID_RIVAL, 1 PokemonTower_2F_MapScripts:: .byte 0 PokemonTower_2F_EventScript_Channeler:: msgbox PokemonTower_2F_Text_SilphScopeCouldUnmaskGhosts, MSGBOX_NPC end PokemonTower_2F_EventScript_RivalTriggerRight:: lockall setvar VAR_TEMP_1, 0 goto PokemonTower_2F_EventScript_Rival end PokemonTower_2F_EventScript_RivalTriggerDown:: lockall setvar VAR_TEMP_1, 1 goto PokemonTower_2F_EventScript_Rival end PokemonTower_2F_EventScript_Rival:: textcolor NPC_TEXT_COLOR_MALE playbgm MUS_ENCOUNTER_RIVAL, 0 call_if_eq VAR_TEMP_1, 0, PokemonTower_2F_EventScript_RivalFacePlayerRight call_if_eq VAR_TEMP_1, 1, PokemonTower_2F_EventScript_RivalFacePlayerDown applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_RIVAL, Common_Movement_Delay48 waitmovement 0 msgbox PokemonTower_2F_Text_RivalIntro setvar VAR_LAST_TALKED, LOCALID_RIVAL call_if_eq VAR_STARTER_MON, 2, PokemonTower_2F_EventScript_RivalSquirtle call_if_eq VAR_STARTER_MON, 1, PokemonTower_2F_EventScript_RivalBulbasaur call_if_eq VAR_STARTER_MON, 0, PokemonTower_2F_EventScript_RivalCharmander msgbox PokemonTower_2F_Text_RivalPostBattle closemessage playbgm MUS_RIVAL_EXIT, 0 call_if_eq VAR_TEMP_1, 0, PokemonTower_2F_EventScript_RivalExitRight call_if_eq VAR_TEMP_1, 1, PokemonTower_2F_EventScript_RivalExitDown playse SE_EXIT delay 25 fadedefaultbgm removeobject LOCALID_RIVAL setvar VAR_MAP_SCENE_POKEMON_TOWER_2F, 1 releaseall end PokemonTower_2F_EventScript_RivalFacePlayerRight:: applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterRight applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PokemonTower_2F_EventScript_RivalFacePlayerDown:: applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PokemonTower_2F_EventScript_RivalSquirtle:: trainerbattle_no_intro TRAINER_RIVAL_POKEMON_TOWER_SQUIRTLE, PokemonTower_2F_Text_RivalDefeat return PokemonTower_2F_EventScript_RivalBulbasaur:: trainerbattle_no_intro TRAINER_RIVAL_POKEMON_TOWER_BULBASAUR, PokemonTower_2F_Text_RivalDefeat return PokemonTower_2F_EventScript_RivalCharmander:: trainerbattle_no_intro TRAINER_RIVAL_POKEMON_TOWER_CHARMANDER, PokemonTower_2F_Text_RivalDefeat return PokemonTower_2F_EventScript_RivalExitRight:: applymovement LOCALID_RIVAL, PokemonTower_2F_Movement_RivalExitRight waitmovement 0 return PokemonTower_2F_EventScript_RivalExitDown:: applymovement LOCALID_RIVAL, PokemonTower_2F_Movement_RivalExitDown waitmovement 0 return PokemonTower_2F_Movement_RivalExitRight:: walk_down walk_right walk_right walk_down walk_down walk_down walk_down walk_in_place_faster_right step_end PokemonTower_2F_Movement_RivalExitDown:: walk_right walk_right walk_down walk_down walk_down walk_down walk_down walk_in_place_faster_right step_end ================================================ FILE: data/maps/PokemonTower_2F/text.inc ================================================ PokemonTower_2F_Text_RivalIntro:: .string "{RIVAL}: Hey, {PLAYER}!\n" .string "What brings you here?\l" .string "Is your POKéMON dead?\p" .string "Hey! It's alive!\p" .string "I can at least make them faint!\n" .string "Let's go!$" PokemonTower_2F_Text_RivalDefeat:: .string "What?\n" .string "You stinker!\p" .string "I took it easy on you, too!$" PokemonTower_2F_Text_RivalPostBattle:: .string "How's your POKéDEX coming?\n" .string "I just caught a CUBONE!\p" .string "I can't find the bigger MAROWAK.\n" .string "Where could they be?\p" .string "I bet there aren't any left!\p" .string "Well, I better get going.\n" .string "I've got a lot to accomplish,\l" .string "unlike you.\p" .string "Smell ya later!$" PokemonTower_2F_Text_SilphScopeCouldUnmaskGhosts:: .string "Even we could not identify the\n" .string "wayward ghosts.\p" .string "A SILPH SCOPE might be able to\n" .string "unmask them.$" ================================================ FILE: data/maps/PokemonTower_3F/map.json ================================================ { "id": "MAP_POKEMON_TOWER_3F", "name": "PokemonTower_3F", "layout": "LAYOUT_POKEMON_TOWER_3F", "music": "MUS_POKE_TOWER", "region_map_section": "MAPSEC_POKEMON_TOWER", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 10, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "PokemonTower_3F_EventScript_Patricia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "PokemonTower_3F_EventScript_Carly", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 12, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "PokemonTower_3F_EventScript_Hope", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 13, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_3F_EventScript_ItemEscapeRope", "flag": "FLAG_HIDE_POKEMON_TOWER_3F_ESCAPE_ROPE" } ], "warp_events": [ { "x": 4, "y": 10, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_2F", "dest_warp_id": "0" }, { "x": 18, "y": 10, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_4F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "2" } ================================================ FILE: data/maps/PokemonTower_3F/scripts.inc ================================================ PokemonTower_3F_MapScripts:: .byte 0 PokemonTower_3F_EventScript_Patricia:: trainerbattle_single TRAINER_CHANNELER_PATRICIA, PokemonTower_3F_Text_PatriciaIntro, PokemonTower_3F_Text_PatriciaDefeat msgbox PokemonTower_3F_Text_PatriciaPostBattle, MSGBOX_AUTOCLOSE end PokemonTower_3F_EventScript_Carly:: trainerbattle_single TRAINER_CHANNELER_CARLY, PokemonTower_3F_Text_CarlyIntro, PokemonTower_3F_Text_CarlyDefeat msgbox PokemonTower_3F_Text_CarlyPostBattle, MSGBOX_AUTOCLOSE end PokemonTower_3F_EventScript_Hope:: trainerbattle_single TRAINER_CHANNELER_HOPE, PokemonTower_3F_Text_HopeIntro, PokemonTower_3F_Text_HopeDefeat msgbox PokemonTower_3F_Text_HopePostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/PokemonTower_3F/text.inc ================================================ PokemonTower_3F_Text_HopeIntro:: .string "Urrg… Awaa…\n" .string "Huhu… Graa…$" PokemonTower_3F_Text_HopeDefeat:: .string "Hwa!\n" .string "I'm saved!$" PokemonTower_3F_Text_HopePostBattle:: .string "The ghosts can be identified by\n" .string "the SILPH SCOPE.$" PokemonTower_3F_Text_CarlyIntro:: .string "Kekeke…\n" .string "Kwaaah!$" PokemonTower_3F_Text_CarlyDefeat:: .string "Hmm?\n" .string "What am I doing?$" PokemonTower_3F_Text_CarlyPostBattle:: .string "Sorry!\n" .string "I was possessed!$" PokemonTower_3F_Text_PatriciaIntro:: .string "Be gone!\n" .string "Malevolent spirit!$" PokemonTower_3F_Text_PatriciaDefeat:: .string "Whew!\n" .string "The spirit left!$" PokemonTower_3F_Text_PatriciaPostBattle:: .string "The others above…\n" .string "They must have been possessed.$" ================================================ FILE: data/maps/PokemonTower_4F/map.json ================================================ { "id": "MAP_POKEMON_TOWER_4F", "name": "PokemonTower_4F", "layout": "LAYOUT_POKEMON_TOWER_4F", "music": "MUS_POKE_TOWER", "region_map_section": "MAPSEC_POKEMON_TOWER", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 17, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "PokemonTower_4F_EventScript_Laurel", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "PokemonTower_4F_EventScript_Jody", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 4, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "PokemonTower_4F_EventScript_Paula", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_4F_EventScript_ItemElixir", "flag": "FLAG_HIDE_POKEMON_TOWER_4F_ELIXIR" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 8, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_4F_EventScript_ItemAwakening", "flag": "FLAG_HIDE_POKEMON_TOWER_4F_AWAKENING" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 11, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_4F_EventScript_ItemGreatBall", "flag": "FLAG_HIDE_POKEMON_TOWER_4F_GREAT_BALL" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 19, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Lapras", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 4, "y": 10, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_5F", "dest_warp_id": "0" }, { "x": 18, "y": 10, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_3F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "2" } ================================================ FILE: data/maps/PokemonTower_4F/scripts.inc ================================================ .set LOCALID_LAPRAS_MASTER, 7 .set TRAINER, VAR_0x8009 PokemonTower_4F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_4F_MapScript_SetMasterTrainerMovementTypes .byte 0 PokemonTower_4F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_LAPRAS callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PokemonTower_4F_MapScript_LaprasMasterMovementType end PokemonTower_4F_MapScript_LaprasMasterMovementType:: setobjectmovementtype LOCALID_LAPRAS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PokemonTower_4F_EventScript_Paula:: trainerbattle_single TRAINER_CHANNELER_PAULA, PokemonTower_4F_Text_PaulaIntro, PokemonTower_4F_Text_PaulaDefeat msgbox PokemonTower_4F_Text_PaulaPostBattle, MSGBOX_AUTOCLOSE end PokemonTower_4F_EventScript_Laurel:: trainerbattle_single TRAINER_CHANNELER_LAUREL, PokemonTower_4F_Text_LaurelIntro, PokemonTower_4F_Text_LaurelDefeat msgbox PokemonTower_4F_Text_LaurelPostBattle, MSGBOX_AUTOCLOSE end PokemonTower_4F_EventScript_Jody:: trainerbattle_single TRAINER_CHANNELER_JODY, PokemonTower_4F_Text_JodyIntro, PokemonTower_4F_Text_JodyDefeat msgbox PokemonTower_4F_Text_JodyPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/PokemonTower_4F/text.inc ================================================ PokemonTower_4F_Text_PaulaIntro:: .string "Ghost! No!\n" .string "Kwaaah!$" PokemonTower_4F_Text_PaulaDefeat:: .string "Where is the ghost?$" PokemonTower_4F_Text_PaulaPostBattle:: .string "I must have been dreaming…$" PokemonTower_4F_Text_LaurelIntro:: .string "Be cursed with me!\n" .string "Kwaaah!$" PokemonTower_4F_Text_LaurelDefeat:: .string "What!$" PokemonTower_4F_Text_LaurelPostBattle:: .string "We can't determine the identity of\n" .string "the ghosts…$" PokemonTower_4F_Text_JodyIntro:: .string "Huhuhu…\n" .string "Beat me not!$" PokemonTower_4F_Text_JodyDefeat:: .string "Huh?\n" .string "Who? What?$" PokemonTower_4F_Text_JodyPostBattle:: .string "May the departed POKéMON rest in\n" .string "peace…$" ================================================ FILE: data/maps/PokemonTower_5F/map.json ================================================ { "id": "MAP_POKEMON_TOWER_5F", "name": "PokemonTower_5F", "layout": "LAYOUT_POKEMON_TOWER_5F", "music": "MUS_POKE_TOWER", "region_map_section": "MAPSEC_POKEMON_TOWER", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 11, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "PokemonTower_5F_EventScript_Ruth", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 19, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "PokemonTower_5F_EventScript_Tammy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 7, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "PokemonTower_5F_EventScript_Karina", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 11, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "PokemonTower_5F_EventScript_Janae", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 12, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_5F_EventScript_Channeler", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 6, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_5F_EventScript_ItemNugget", "flag": "FLAG_HIDE_POKEMON_TOWER_5F_NUGGET" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 11, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_5F_EventScript_ItemCleanseTag", "flag": "FLAG_HIDE_POKEMON_TOWER_5F_CLEANSE_TAG" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 4, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Hypno", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 4, "y": 10, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_4F", "dest_warp_id": "0" }, { "x": 18, "y": 10, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_6F", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 8, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "PokemonTower_5F_EventScript_PurifiedZone" }, { "type": "trigger", "x": 11, "y": 8, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "PokemonTower_5F_EventScript_PurifiedZone" }, { "type": "trigger", "x": 12, "y": 8, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "PokemonTower_5F_EventScript_PurifiedZone" }, { "type": "trigger", "x": 10, "y": 9, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "PokemonTower_5F_EventScript_PurifiedZone" }, { "type": "trigger", "x": 9, "y": 8, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "1", "script": "PokemonTower_5F_EventScript_ExitPurifiedZone" }, { "type": "trigger", "x": 12, "y": 9, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "PokemonTower_5F_EventScript_PurifiedZone" }, { "type": "trigger", "x": 10, "y": 10, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "PokemonTower_5F_EventScript_PurifiedZone" }, { "type": "trigger", "x": 11, "y": 10, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "PokemonTower_5F_EventScript_PurifiedZone" }, { "type": "trigger", "x": 12, "y": 10, "elevation": 0, "var": "VAR_TEMP_1", "var_value": "0", "script": "PokemonTower_5F_EventScript_PurifiedZone" }, { "type": "trigger", "x": 9, "y": 9, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "1", "script": "PokemonTower_5F_EventScript_ExitPurifiedZone" }, { "type": "trigger", "x": 9, "y": 10, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "1", "script": "PokemonTower_5F_EventScript_ExitPurifiedZone" }, { "type": "trigger", "x": 10, "y": 11, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "1", "script": "PokemonTower_5F_EventScript_ExitPurifiedZone" }, { "type": "trigger", "x": 11, "y": 11, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "1", "script": "PokemonTower_5F_EventScript_ExitPurifiedZone" }, { "type": "trigger", "x": 12, "y": 11, "elevation": 0, "var": "VAR_TEMP_1", "var_value": "1", "script": "PokemonTower_5F_EventScript_ExitPurifiedZone" }, { "type": "trigger", "x": 13, "y": 8, "elevation": 0, "var": "VAR_TEMP_1", "var_value": "1", "script": "PokemonTower_5F_EventScript_ExitPurifiedZone" }, { "type": "trigger", "x": 13, "y": 9, "elevation": 0, "var": "VAR_TEMP_1", "var_value": "1", "script": "PokemonTower_5F_EventScript_ExitPurifiedZone" }, { "type": "trigger", "x": 13, "y": 10, "elevation": 0, "var": "VAR_TEMP_1", "var_value": "1", "script": "PokemonTower_5F_EventScript_ExitPurifiedZone" } ], "bg_events": [ { "type": "hidden_item", "x": 7, "y": 3, "elevation": 3, "item": "ITEM_BIG_MUSHROOM", "flag": "FLAG_HIDDEN_ITEM_POKEMON_TOWER_5F_BIG_MUSHROOM", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/PokemonTower_5F/scripts.inc ================================================ .set LOCALID_HYPNO_MASTER, 8 .set TRAINER, VAR_0x8009 PokemonTower_5F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_5F_MapScript_SetMasterTrainerMovementTypes .byte 0 PokemonTower_5F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_HYPNO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PokemonTower_5F_MapScript_HypnoMasterMovementType end PokemonTower_5F_MapScript_HypnoMasterMovementType:: setobjectmovementtype LOCALID_HYPNO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PokemonTower_5F_EventScript_Channeler:: msgbox PokemonTower_5F_Text_RestHereInPurifiedSpace, MSGBOX_NPC end PokemonTower_5F_EventScript_PurifiedZone:: lockall fadescreen FADE_TO_WHITE special HealPlayerParty fadescreen FADE_FROM_WHITE msgbox PokemonTower_5F_Text_PurifiedZoneMonsFullyHealed setvar VAR_TEMP_1, 1 releaseall end PokemonTower_5F_EventScript_ExitPurifiedZone:: lockall setvar VAR_TEMP_1, 0 releaseall end PokemonTower_5F_EventScript_Tammy:: trainerbattle_single TRAINER_CHANNELER_TAMMY, PokemonTower_5F_Text_TammyIntro, PokemonTower_5F_Text_TammyDefeat msgbox PokemonTower_5F_Text_TammyPostBattle, MSGBOX_AUTOCLOSE end PokemonTower_5F_EventScript_Ruth:: trainerbattle_single TRAINER_CHANNELER_RUTH, PokemonTower_5F_Text_RuthIntro, PokemonTower_5F_Text_RuthDefeat msgbox PokemonTower_5F_Text_RuthPostBattle, MSGBOX_AUTOCLOSE end PokemonTower_5F_EventScript_Karina:: trainerbattle_single TRAINER_CHANNELER_KARINA, PokemonTower_5F_Text_KarinaIntro, PokemonTower_5F_Text_KarinaDefeat msgbox PokemonTower_5F_Text_KarinaPostBattle, MSGBOX_AUTOCLOSE end PokemonTower_5F_EventScript_Janae:: trainerbattle_single TRAINER_CHANNELER_JANAE, PokemonTower_5F_Text_JanaeIntro, PokemonTower_5F_Text_JanaeDefeat msgbox PokemonTower_5F_Text_JanaePostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/PokemonTower_5F/text.inc ================================================ PokemonTower_5F_Text_RestHereInPurifiedSpace:: .string "Come, child!\n" .string "I have purified this space.\l" .string "You can rest here.$" PokemonTower_5F_Text_TammyIntro:: .string "Give…me…\n" .string "your…all…$" PokemonTower_5F_Text_TammyDefeat:: .string "Gasp!$" PokemonTower_5F_Text_TammyPostBattle:: .string "I was under possession.$" PokemonTower_5F_Text_RuthIntro:: .string "You…shall…\n" .string "join…us…$" PokemonTower_5F_Text_RuthDefeat:: .string "What a nightmare!$" PokemonTower_5F_Text_RuthPostBattle:: .string "I was possessed.$" PokemonTower_5F_Text_KarinaIntro:: .string "Zombies!$" PokemonTower_5F_Text_KarinaDefeat:: .string "Ha?$" PokemonTower_5F_Text_KarinaPostBattle:: .string "I regained my senses.$" PokemonTower_5F_Text_JanaeIntro:: .string "Urgah…\n" .string "Urff…$" PokemonTower_5F_Text_JanaeDefeat:: .string "Whoo!$" PokemonTower_5F_Text_JanaePostBattle:: .string "I fell to evil spirits despite my\n" .string "training in the mountains…$" PokemonTower_5F_Text_PurifiedZoneMonsFullyHealed:: .string "Entered the purified and protected\n" .string "zone.\p" .string "{PLAYER}'s POKéMON were fully\n" .string "healed.$" ================================================ FILE: data/maps/PokemonTower_6F/map.json ================================================ { "id": "MAP_POKEMON_TOWER_6F", "name": "PokemonTower_6F", "layout": "LAYOUT_POKEMON_TOWER_6F", "music": "MUS_POKE_TOWER", "region_map_section": "MAPSEC_POKEMON_TOWER", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 13, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "PokemonTower_6F_EventScript_Angelica", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 18, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "PokemonTower_6F_EventScript_Jennifer", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "PokemonTower_6F_EventScript_Emilia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_6F_EventScript_ItemRareCandy", "flag": "FLAG_HIDE_POKEMON_TOWER_6F_RARE_CANDY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 15, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_6F_EventScript_ItemXAccuracy", "flag": "FLAG_HIDE_POKEMON_TOWER_6F_X_ACCURACY" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Raichu", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 11, "y": 16, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_7F", "dest_warp_id": "0" }, { "x": 18, "y": 10, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_5F", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 11, "y": 15, "elevation": 3, "var": "VAR_MAP_SCENE_POKEMON_TOWER_6F", "var_value": "0", "script": "PokemonTower_6F_EventScript_MarowakGhost" }, { "type": "trigger", "x": 12, "y": 16, "elevation": 3, "var": "VAR_MAP_SCENE_POKEMON_TOWER_6F", "var_value": "0", "script": "PokemonTower_6F_EventScript_MarowakGhost" } ], "bg_events": [ ], "level_scaling": "2" } ================================================ FILE: data/maps/PokemonTower_6F/scripts.inc ================================================ .set LOCALID_RAICHU_MASTER, 6 .set TRAINER, VAR_0x8009 PokemonTower_6F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_6F_MapScript_SetMasterTrainerMovementTypes .byte 0 PokemonTower_6F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_RAICHU callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PokemonTower_6F_MapScript_RaichuMasterMovementType end PokemonTower_6F_MapScript_RaichuMasterMovementType:: setobjectmovementtype LOCALID_RAICHU_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PokemonTower_6F_EventScript_MarowakGhost:: lockall textcolor NPC_TEXT_COLOR_MON msgbox PokemonTower_6F_Text_BeGoneIntruders goto_if_questlog EventScript_ReleaseEnd setwildbattle SPECIES_MAROWAK, 30 special StartMarowakBattle waitstate special QuestLog_CutRecording goto_if_eq VAR_RESULT, FALSE, PokemonTower_6F_EventScript_DefeatedMarowakGhost @ VAR_RESULT set by CB2_EndMarowakBattle applymovement OBJ_EVENT_ID_PLAYER, PokemonTower_6F_Movement_ForcePlayerUp waitmovement 0 releaseall end PokemonTower_6F_EventScript_DefeatedMarowakGhost:: message PokemonTower_6F_Text_GhostWasCubonesMother waitmessage waitse playmoncry SPECIES_MAROWAK, CRY_MODE_NORMAL waitbuttonpress waitmoncry msgbox PokemonTower_6F_Text_MothersSpiritWasCalmed setvar VAR_MAP_SCENE_POKEMON_TOWER_6F, 1 releaseall end PokemonTower_6F_Movement_ForcePlayerUp:: walk_up step_end PokemonTower_6F_EventScript_Angelica:: trainerbattle_single TRAINER_CHANNELER_ANGELICA, PokemonTower_6F_Text_AngelicaIntro, PokemonTower_6F_Text_AngelicaDefeat msgbox PokemonTower_6F_Text_AngelicaPostBattle, MSGBOX_AUTOCLOSE end PokemonTower_6F_EventScript_Emilia:: trainerbattle_single TRAINER_CHANNELER_EMILIA, PokemonTower_6F_Text_EmiliaIntro, PokemonTower_6F_Text_EmiliaDefeat msgbox PokemonTower_6F_Text_EmiliaPostBattle, MSGBOX_AUTOCLOSE end PokemonTower_6F_EventScript_Jennifer:: trainerbattle_single TRAINER_CHANNELER_JENNIFER, PokemonTower_6F_Text_JenniferIntro, PokemonTower_6F_Text_JenniferDefeat msgbox PokemonTower_6F_Text_JenniferPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/PokemonTower_6F/text.inc ================================================ PokemonTower_6F_Text_AngelicaIntro:: .string "Give…me…\n" .string "blood…$" PokemonTower_6F_Text_AngelicaDefeat:: .string "Groan!$" PokemonTower_6F_Text_AngelicaPostBattle:: .string "I feel anemic and weak…$" PokemonTower_6F_Text_EmiliaIntro:: .string "Urff…\n" .string "Kwaah!$" PokemonTower_6F_Text_EmiliaDefeat:: .string "Something fell out!$" PokemonTower_6F_Text_EmiliaPostBattle:: .string "My hair didn't fall out!\n" .string "It was a malevolent spirit!$" PokemonTower_6F_Text_JenniferIntro:: .string "Ke…ke…ke…\n" .string "ke…ke…ke!$" PokemonTower_6F_Text_JenniferDefeat:: .string "Keee!$" PokemonTower_6F_Text_JenniferPostBattle:: .string "What's going on here?$" PokemonTower_6F_Text_BeGoneIntruders:: .string "Be gone…\n" .string "Intruders…$" PokemonTower_6F_Text_GhostWasCubonesMother:: .string "The ghost was the restless spirit\n" .string "of CUBONE's mother!$" PokemonTower_6F_Text_MothersSpiritWasCalmed:: .string "The mother's spirit was calmed.\p" .string "It departed to the afterlife…$" ================================================ FILE: data/maps/PokemonTower_7F/map.json ================================================ { "id": "MAP_POKEMON_TOWER_7F", "name": "PokemonTower_7F", "layout": "LAYOUT_POKEMON_TOWER_7F", "music": "MUS_POKE_TOWER", "region_map_section": "MAPSEC_POKEMON_TOWER", "requires_flash": false, "weather": "WEATHER_FOG_HORIZONTAL", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MR_FUJI", "in_connection": false, "x": 11, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PokemonTower_7F_EventScript_MrFuji", "flag": "FLAG_HIDE_TOWER_FUJI" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 9, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "PokemonTower_7F_EventScript_Grunt1", "flag": "FLAG_HIDE_TOWER_ROCKET_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 13, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "PokemonTower_7F_EventScript_Grunt2", "flag": "FLAG_HIDE_TOWER_ROCKET_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "PokemonTower_7F_EventScript_Grunt3", "flag": "FLAG_HIDE_TOWER_ROCKET_3" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 11, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Weepinbell", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 11, "y": 16, "elevation": 3, "dest_map": "MAP_POKEMON_TOWER_6F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 11, "y": 4, "elevation": 3, "item": "ITEM_SOOTHE_BELL", "flag": "FLAG_HIDDEN_ITEM_POKEMON_TOWER_7F_SOOTHE_BELL", "quantity": 1, "underfoot": true } ], "level_scaling": "2" } ================================================ FILE: data/maps/PokemonTower_7F/scripts.inc ================================================ .set LOCALID_GRUNT1, 2 .set LOCALID_GRUNT2, 3 .set LOCALID_GRUNT3, 4 .set LOCALID_WEEPINBELL_MASTER, 5 .set TRAINER, VAR_0x8009 PokemonTower_7F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_7F_MapScript_SetMasterTrainerMovementTypes .byte 0 PokemonTower_7F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_WEEPINBELL callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PokemonTower_7F_MapScript_WeepinbellMasterMovementType end PokemonTower_7F_MapScript_WeepinbellMasterMovementType:: setobjectmovementtype LOCALID_WEEPINBELL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PokemonTower_7F_EventScript_MrFuji:: lock faceplayer famechecker FAMECHECKER_MRFUJI, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 setflag FLAG_HIDE_TOWER_FUJI clearflag FLAG_HIDE_POKEHOUSE_FUJI setflag FLAG_RESCUED_MR_FUJI msgbox PokemonTower_7F_Text_MrFujiThankYouFollowMe closemessage warp MAP_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE, 4, 7 waitstate release end PokemonTower_7F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_19, PokemonTower_7F_Text_Grunt1Intro, PokemonTower_7F_Text_Grunt1Defeat, PokemonTower_7F_EventScript_DefeatedGrunt1 msgbox PokemonTower_7F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end PokemonTower_7F_EventScript_DefeatedGrunt1:: msgbox PokemonTower_7F_Text_Grunt1PostBattle closemessage getplayerxy VAR_0x8004, VAR_0x8005 goto_if_eq VAR_0x8004, 10, PokemonTower_7F_EventScript_Grunt1ExitMid goto_if_eq VAR_0x8004, 11, PokemonTower_7F_EventScript_Grunt1ExitRight goto_if_eq VAR_0x8004, 9, PokemonTower_7F_EventScript_Grunt1ExitLeft applymovement LOCALID_GRUNT1, PokemonTower_7F_Movement_Grunt1Exit waitmovement 0 goto PokemonTower_7F_EventScript_RemoveGrunt1 end PokemonTower_7F_EventScript_Grunt1ExitMid:: applymovement LOCALID_GRUNT1, PokemonTower_7F_Movement_Grunt1ExitMid waitmovement 0 goto PokemonTower_7F_EventScript_RemoveGrunt1 end PokemonTower_7F_EventScript_Grunt1ExitRight:: applymovement LOCALID_GRUNT1, PokemonTower_7F_Movement_Grunt1ExitRight waitmovement 0 goto PokemonTower_7F_EventScript_RemoveGrunt1 end PokemonTower_7F_EventScript_Grunt1ExitLeft:: applymovement LOCALID_GRUNT1, PokemonTower_7F_Movement_Grunt1ExitLeft waitmovement 0 playse SE_EXIT delay 25 goto PokemonTower_7F_EventScript_RemoveGrunt1 end PokemonTower_7F_EventScript_RemoveGrunt1:: removeobject LOCALID_GRUNT1 release end PokemonTower_7F_Movement_Grunt1ExitMid:: walk_down walk_right walk_down walk_down walk_down walk_right walk_down walk_down step_end PokemonTower_7F_Movement_Grunt1ExitRight:: walk_down walk_down walk_down walk_down walk_right walk_down walk_down step_end PokemonTower_7F_Movement_Grunt1Exit:: walk_down walk_down walk_down walk_down walk_down walk_down step_end PokemonTower_7F_Movement_Grunt1ExitLeft:: walk_right walk_down walk_down walk_down walk_down walk_right walk_down walk_down walk_in_place_faster_left step_end PokemonTower_7F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_20, PokemonTower_7F_Text_Grunt2Intro, PokemonTower_7F_Text_Grunt2Defeat, PokemonTower_7F_EventScript_DefeatedGrunt2 msgbox PokemonTower_7F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end PokemonTower_7F_EventScript_DefeatedGrunt2:: famechecker FAMECHECKER_MRFUJI, 1 msgbox PokemonTower_7F_Text_Grunt2PostBattle closemessage getplayerxy VAR_0x8004, VAR_0x8005 goto_if_eq VAR_0x8004, 12, PokemonTower_7F_EventScript_Grunt2ExitLeft goto_if_eq VAR_0x8004, 13, PokemonTower_7F_EventScript_Grunt2ExitRight applymovement LOCALID_GRUNT2, PokemonTower_7F_Movement_Grunt2Exit waitmovement 0 goto PokemonTower_7F_EventScript_RemoveGrunt2 end PokemonTower_7F_EventScript_Grunt2ExitLeft:: applymovement LOCALID_GRUNT2, PokemonTower_7F_Movement_Grunt2ExitLeft waitmovement 0 goto PokemonTower_7F_EventScript_RemoveGrunt2 end PokemonTower_7F_EventScript_Grunt2ExitRight:: applymovement LOCALID_GRUNT2, PokemonTower_7F_Movement_Grunt2ExitRight waitmovement 0 goto PokemonTower_7F_EventScript_RemoveGrunt2 end PokemonTower_7F_EventScript_RemoveGrunt2:: removeobject LOCALID_GRUNT2 release end PokemonTower_7F_Movement_Grunt2ExitLeft:: walk_down walk_down walk_down walk_left walk_down walk_down walk_down step_end PokemonTower_7F_Movement_Grunt2Exit:: walk_down walk_down walk_down walk_down walk_down walk_down step_end PokemonTower_7F_Movement_Grunt2ExitRight:: walk_left walk_down walk_down walk_down walk_down walk_down walk_down walk_down step_end PokemonTower_7F_EventScript_Grunt3:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_21, PokemonTower_7F_Text_Grunt3Intro, PokemonTower_7F_Text_Grunt3Defeat, PokemonTower_7F_EventScript_DefeatedGrunt3 msgbox PokemonTower_7F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE end PokemonTower_7F_EventScript_DefeatedGrunt3:: msgbox PokemonTower_7F_Text_Grunt3PostBattle closemessage getplayerxy VAR_0x8004, VAR_0x8005 goto_if_eq VAR_0x8004, 10, PokemonTower_7F_EventScript_Grunt3ExitRight goto_if_eq VAR_0x8004, 9, PokemonTower_7F_EventScript_Grunt3ExitLeft applymovement LOCALID_GRUNT3, PokemonTower_7F_Movement_Grunt3Exit waitmovement 0 goto PokemonTower_7F_EventScript_RemoveGrunt3 end PokemonTower_7F_EventScript_Grunt3ExitRight:: applymovement LOCALID_GRUNT3, PokemonTower_7F_Movement_Grunt3ExitRight waitmovement 0 goto PokemonTower_7F_EventScript_RemoveGrunt3 end PokemonTower_7F_EventScript_Grunt3ExitLeft:: applymovement LOCALID_GRUNT3, PokemonTower_7F_Movement_Grunt3ExitLeft waitmovement 0 goto PokemonTower_7F_EventScript_RemoveGrunt3 end PokemonTower_7F_EventScript_RemoveGrunt3:: removeobject LOCALID_GRUNT3 release end PokemonTower_7F_EventScript_Unused:: release end PokemonTower_7F_Movement_Grunt3ExitRight:: walk_down walk_down walk_down walk_down walk_down walk_right walk_down step_end PokemonTower_7F_Movement_Grunt3Exit:: walk_down walk_down walk_down walk_down walk_down walk_down step_end PokemonTower_7F_Movement_Grunt3ExitLeft:: walk_right walk_down walk_down walk_down walk_down walk_down walk_down walk_down step_end ================================================ FILE: data/maps/PokemonTower_7F/text.inc ================================================ PokemonTower_7F_Text_Grunt1Intro:: .string "What do you want?\n" .string "Why are you here?$" PokemonTower_7F_Text_Grunt1Defeat:: .string "I give up!$" PokemonTower_7F_Text_Grunt1PostBattle:: .string "I'm not going to forget this!$" PokemonTower_7F_Text_Grunt2Intro:: .string "This old guy marched right up to\n" .string "our HIDEOUT.\p" .string "Then, he starts ranting about how\n" .string "TEAM ROCKET's abusing POKéMON.\p" .string "So, we're just talking it over as\n" .string "adults.$" PokemonTower_7F_Text_Grunt2Defeat:: .string "Please!\n" .string "No more!$" PokemonTower_7F_Text_Grunt2PostBattle:: .string "POKéMON are only good for making\n" .string "money. Why not use them?\p" .string "You stay out of our business!$" PokemonTower_7F_Text_Grunt3Intro:: .string "You're not saving anyone, kid!$" PokemonTower_7F_Text_Grunt3Defeat:: .string "Don't fight us ROCKETS!$" PokemonTower_7F_Text_Grunt3PostBattle:: .string "You're not getting away with this!$" PokemonTower_7F_Text_MrFujiThankYouFollowMe:: .string "MR. FUJI: Heh?\n" .string "You came to save me?\p" .string "Thank you. But, I came here of my\n" .string "own free will.\p" .string "I came to calm the spirit of\n" .string "CUBONE's mother.\p" .string "I think MAROWAK's spirit has\n" .string "finally left us.\p" .string "I must thank you for your kind\n" .string "concern.\p" .string "Follow me to my home, POKéMON\n" .string "HOUSE, at the foot of this tower.$" ================================================ FILE: data/maps/PowerPlant/map.json ================================================ { "id": "MAP_POWER_PLANT", "name": "PowerPlant", "layout": "LAYOUT_POWER_PLANT", "music": "MUS_POKE_MANSION", "region_map_section": "MAPSEC_POWER_PLANT", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 7, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PowerPlant_EventScript_ItemMaxPotion", "flag": "FLAG_HIDE_POWER_PLANT_MAX_POTION" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 40, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PowerPlant_EventScript_ItemTM17", "flag": "FLAG_HIDE_POWER_PLANT_TM17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 46, "y": 37, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PowerPlant_EventScript_ItemTM25", "flag": "FLAG_HIDE_POWER_PLANT_TM25" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 45, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PowerPlant_EventScript_ItemThunderStone", "flag": "FLAG_HIDE_POWER_PLANT_THUNDER_STONE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 26, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PowerPlant_EventScript_ItemElixir", "flag": "FLAG_HIDE_POWER_PLANT_ELIXIR" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ZAPDOS", "in_connection": false, "x": 5, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PowerPlant_EventScript_Zapdos", "flag": "FLAG_HIDE_ZAPDOS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 36, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PowerPlant_EventScript_Electrode2", "flag": "FLAG_HIDE_POWER_PLANT_ELECTRODE_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 30, "y": 38, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "PowerPlant_EventScript_Electrode1", "flag": "FLAG_HIDE_POWER_PLANT_ELECTRODE_1" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 41, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Voltorb", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 27, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Zapdos", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 4, "y": 39, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "2" }, { "x": 5, "y": 38, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "2" }, { "x": 6, "y": 39, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "2" }, { "x": 1, "y": 11, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "4" }, { "x": 0, "y": 13, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 29, "y": 16, "elevation": 3, "item": "ITEM_MAX_ELIXIR", "flag": "FLAG_HIDDEN_ITEM_POWER_PLANT_MAX_ELIXIR", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 8, "y": 12, "elevation": 3, "item": "ITEM_THUNDER_STONE", "flag": "FLAG_HIDDEN_ITEM_POWER_PLANT_THUNDER_STONE", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/PowerPlant/scripts.inc ================================================ .set LOCALID_VOLTORB_MASTER, 9 .set LOCALID_ZAPDOS_MASTER, 10 .set TRAINER, VAR_0x8009 PowerPlant_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, PowerPlant_OnResume map_script MAP_SCRIPT_ON_TRANSITION, PowerPlant_OnTransition .byte 0 PowerPlant_OnResume:: call_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, PowerPlant_EventScript_TryRemoveStaticMon end PowerPlant_EventScript_TryRemoveStaticMon:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return removeobject VAR_LAST_TALKED return PowerPlant_OnTransition:: setworldmapflag FLAG_WORLD_MAP_POWER_PLANT call_if_set FLAG_FOUGHT_ZAPDOS, PowerPlant_EventScript_HideZapdos call_if_unset FLAG_FOUGHT_ZAPDOS, PowerPlant_EventScript_TryShowZapdos call_if_unset FLAG_FOUGHT_POWER_PLANT_ELECTRODE_1, PowerPlant_EventScript_ShowElectrode1 call_if_unset FLAG_FOUGHT_POWER_PLANT_ELECTRODE_2, PowerPlant_EventScript_ShowElectrode2 goto PowerPlant_MapScript_SetMasterTrainerMovementTypes end PowerPlant_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_VOLTORB callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PowerPlant_MapScript_VoltorbMasterMovementType setvar TRAINER, MASTER_ZAPDOS callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, PowerPlant_MapScript_ZapdosMasterMovementType end PowerPlant_MapScript_VoltorbMasterMovementType:: setobjectmovementtype LOCALID_VOLTORB_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PowerPlant_MapScript_ZapdosMasterMovementType:: setobjectmovementtype LOCALID_ZAPDOS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return PowerPlant_EventScript_TryShowZapdos:: goto_if_set FLAG_ZAPDOS_FLEW_AWAY, EventScript_Return clearflag FLAG_HIDE_ZAPDOS return PowerPlant_EventScript_HideZapdos:: setflag FLAG_HIDE_ZAPDOS return PowerPlant_EventScript_ShowElectrode1:: clearflag FLAG_HIDE_POWER_PLANT_ELECTRODE_1 return PowerPlant_EventScript_ShowElectrode2:: clearflag FLAG_HIDE_POWER_PLANT_ELECTRODE_2 return PowerPlant_EventScript_Zapdos:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer setwildbattle SPECIES_ZAPDOS, 50 waitse playmoncry SPECIES_ZAPDOS, CRY_MODE_ENCOUNTER message Text_Gyaoo waitmessage waitmoncry delay 10 playbgm MUS_ENCOUNTER_GYM_LEADER, 0 waitbuttonpress setflag FLAG_SYS_SPECIAL_WILD_BATTLE special StartLegendaryBattle waitstate clearflag FLAG_SYS_SPECIAL_WILD_BATTLE specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, PowerPlant_EventScript_DefeatedZapdos goto_if_eq VAR_RESULT, B_OUTCOME_RAN, PowerPlant_EventScript_RanFromZapdos goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, PowerPlant_EventScript_RanFromZapdos setflag FLAG_FOUGHT_ZAPDOS release end PowerPlant_EventScript_DefeatedZapdos:: setflag FLAG_ZAPDOS_FLEW_AWAY setvar VAR_0x8004, SPECIES_ZAPDOS goto EventScript_MonFlewAway end PowerPlant_EventScript_RanFromZapdos:: setvar VAR_0x8004, SPECIES_ZAPDOS goto EventScript_MonFlewAway end PowerPlant_EventScript_Electrode1:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer setwildbattle SPECIES_ELECTRODE, 34 waitse playmoncry SPECIES_ELECTRODE, CRY_MODE_ENCOUNTER delay 40 waitmoncry setflag FLAG_SYS_SPECIAL_WILD_BATTLE dowildbattle clearflag FLAG_SYS_SPECIAL_WILD_BATTLE special QuestLog_CutRecording specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, PowerPlant_EventScript_FoughtElectrode1 goto_if_eq VAR_RESULT, B_OUTCOME_RAN, PowerPlant_EventScript_FoughtElectrode1 goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, PowerPlant_EventScript_FoughtElectrode1 setflag FLAG_FOUGHT_POWER_PLANT_ELECTRODE_1 release end PowerPlant_EventScript_FoughtElectrode1:: setflag FLAG_FOUGHT_POWER_PLANT_ELECTRODE_1 goto EventScript_RemoveStaticMon end PowerPlant_EventScript_Electrode2:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer setwildbattle SPECIES_ELECTRODE, 34 waitse playmoncry SPECIES_ELECTRODE, CRY_MODE_ENCOUNTER delay 40 waitmoncry setflag FLAG_SYS_SPECIAL_WILD_BATTLE dowildbattle clearflag FLAG_SYS_SPECIAL_WILD_BATTLE special QuestLog_CutRecording specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, PowerPlant_EventScript_FoughtElectrode2 goto_if_eq VAR_RESULT, B_OUTCOME_RAN, PowerPlant_EventScript_FoughtElectrode2 goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, PowerPlant_EventScript_FoughtElectrode2 setflag FLAG_FOUGHT_POWER_PLANT_ELECTRODE_2 release end PowerPlant_EventScript_FoughtElectrode2:: setflag FLAG_FOUGHT_POWER_PLANT_ELECTRODE_2 goto EventScript_RemoveStaticMon end ================================================ FILE: data/maps/Prototype_SeviiIsle_6/map.json ================================================ { "id": "MAP_PROTOTYPE_SEVII_ISLE_6", "name": "Prototype_SeviiIsle_6", "layout": "LAYOUT_PROTOTYPE_SEVII_ISLE_6", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_SEVII_ISLE_6", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Prototype_SeviiIsle_6/scripts.inc ================================================ Prototype_SeviiIsle_6_MapScripts:: .byte 0 ================================================ FILE: data/maps/Prototype_SeviiIsle_7/map.json ================================================ { "id": "MAP_PROTOTYPE_SEVII_ISLE_7", "name": "Prototype_SeviiIsle_7", "layout": "LAYOUT_PROTOTYPE_SEVII_ISLE_7", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_SEVII_ISLE_7", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Prototype_SeviiIsle_7/scripts.inc ================================================ Prototype_SeviiIsle_7_MapScripts:: .byte 0 ================================================ FILE: data/maps/Prototype_SeviiIsle_8/map.json ================================================ { "id": "MAP_PROTOTYPE_SEVII_ISLE_8", "name": "Prototype_SeviiIsle_8", "layout": "LAYOUT_PROTOTYPE_SEVII_ISLE_8", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_SEVII_ISLE_8", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Prototype_SeviiIsle_8/scripts.inc ================================================ Prototype_SeviiIsle_8_MapScripts:: .byte 0 ================================================ FILE: data/maps/Prototype_SeviiIsle_9/map.json ================================================ { "id": "MAP_PROTOTYPE_SEVII_ISLE_9", "name": "Prototype_SeviiIsle_9", "layout": "LAYOUT_PROTOTYPE_SEVII_ISLE_9", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_SEVII_ISLE_9", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Prototype_SeviiIsle_9/scripts.inc ================================================ Prototype_SeviiIsle_9_MapScripts:: .byte 0 ================================================ FILE: data/maps/RS_BattleTower/map.json ================================================ { "id": "MAP_RS_BATTLE_TOWER", "name": "RS_BattleTower", "layout": "LAYOUT_RS_BATTLE_TOWER", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 9, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleTower_Outside_EventScript_160275", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 11, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleTower_Outside_EventScript_16026C", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 19, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleTower_Outside_EventScript_160263", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 19, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NavelRock_Harbor_EventScript_Sailor", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 19, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 8, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleFrontier_OutsideEast_EventScript_OldWoman", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SUDOWOODO", "in_connection": false, "x": 8, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleFrontier_OutsideEast_EventScript_Sudowoodo", "flag": "FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO" } ], "warp_events": [ { "x": 14, "y": 8, "elevation": 0, "dest_map": "MAP_RS_BATTLE_TOWER_LOBBY", "dest_warp_id": 0 }, { "x": 11, "y": 18, "elevation": 0, "dest_map": "MAP_ARTISAN_CAVE_B1F", "dest_warp_id": 0 } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 16, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "BattleTower_Outside_EventScript_16025A" } ], "level_scaling": "0" } ================================================ FILE: data/maps/RS_BattleTower/scripts.inc ================================================ .set LOCALID_SUDOWOODO, 7 RS_BattleTower_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleFrontier_OutsideEast_OnResume map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_OutsideEast_OnTransition .byte 0 BattleFrontier_OutsideEast_OnResume: call_if_set FLAG_SYS_CTRL_OBJ_DELETE, BattleFrontier_OutsideEast_EventScript_TryRemoveSudowoodo end BattleFrontier_OutsideEast_EventScript_TryRemoveSudowoodo:: specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_CAUGHT goto_if_ne EventScript_Return removeobject VAR_LAST_TALKED return BattleFrontier_OutsideEast_OnTransition: call_if_unset FLAG_DEFEATED_SUDOWOODO, BattleFrontier_OutsideEast_EventScript_ShowSudowoodo end BattleFrontier_OutsideEast_EventScript_ShowSudowoodo:: goto_if_set FLAG_CAUGHT_SUDOWOODO, EventScript_Return clearflag FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO return BattleTower_Outside_EventScript_16025A:: msgbox BattleTower_Outside_Text_199C6F, MSGBOX_SIGN end BattleTower_Outside_EventScript_160263:: msgbox BattleTower_Outside_Text_199CA4, MSGBOX_NPC end BattleTower_Outside_EventScript_16026C:: msgbox BattleTower_Outside_Text_199E9C, MSGBOX_NPC end BattleTower_Outside_EventScript_160275:: msgbox BattleTower_Outside_Text_199ED4, MSGBOX_NPC end BattleFrontier_OutsideEast_EventScript_OldWoman:: lock faceplayer goto_if_set FLAG_DEFEATED_SUDOWOODO, BattleFrontier_OutsideEast_EventScript_OldWomanSudowoodoGone goto_if_set FLAG_CAUGHT_SUDOWOODO, BattleFrontier_OutsideEast_EventScript_OldWomanSudowoodoGone goto_if_set FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO, BattleFrontier_OutsideEast_EventScript_OldWomanSudowoodoGone msgbox BattleFrontier_OutsideEast_Text_OddTreeHereSeemsToWiggle, MSGBOX_DEFAULT turnobject 6, DIR_SOUTH //remove later release end BattleFrontier_OutsideEast_EventScript_OldWomanSudowoodoGone:: msgbox BattleFrontier_OutsideEast_Text_OnceAnOddTreePastHere, MSGBOX_DEFAULT turnobject 6, DIR_SOUTH //remove later release end BattleFrontier_OutsideEast_Text_OddTreeHereSeemsToWiggle: //change text to match EM later .string "Excuse me, young one.\n" .string "Have you good eyesight?\p" .string "There is an odd tree here, and to\n" .string "my tired eyes it seems to wiggle.$" BattleFrontier_OutsideEast_Text_OnceAnOddTreePastHere: //change text to match EM later .string "Excuse me, young one.\n" .string "Have you a good memory?\p" .string "I have this feeling there once was\n" .string "an odd tree here.$" BattleFrontier_OutsideEast_EventScript_Sudowoodo:: lock faceplayer waitse playse SE_SUDOWOODO_SHAKE applymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShake waitmovement 0 checkitem ITEM_FRESH_WATER, 1 compare VAR_RESULT, TRUE goto_if_eq BattleFrontier_OutsideEast_EventScript_AskWaterSudowoodo release end BattleFrontier_OutsideEast_EventScript_AskWaterSudowoodo:: msgbox BattleFrontier_OutsideEast_Text_UseFreshWater MSGBOX_YESNO compare VAR_RESULT, YES goto_if_eq BattleFrontier_OutsideEast_EventScript_WaterSudowoodo release end BattleFrontier_OutsideEast_Text_UseFreshWater:: .string "It's a weird tree.\n" .string "Water it with a FRESH WATER?$" BattleFrontier_OutsideEast_EventScript_WaterSudowoodo:: lock faceplayer removeitem ITEM_FRESH_WATER, 1 playse SE_SUDOWOODO_SHAKE applymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShakeAngry waitmovement 0 applymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShakeAngry waitmovement 0 applymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShakeAngry waitmovement 0 msgbox gText_Sudowoodo_Attacked, MSGBOX_DEFAULT closemessage waitse playmoncry SPECIES_SUDOWOODO, 2 delay 40 waitmoncry setvar VAR_LAST_TALKED, LOCALID_SUDOWOODO setwildbattle SPECIES_SUDOWOODO, 40, ITEM_NONE setflag FLAG_SYS_CTRL_OBJ_DELETE dowildbattle clearflag FLAG_SYS_CTRL_OBJ_DELETE specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_WON goto_if_eq BattleFrontier_OutsideEast_EventScript_DefeatedSudowoodo compare VAR_RESULT, B_OUTCOME_RAN goto_if_eq BattleFrontier_OutsideEast_EventScript_RanFromSudowoodo compare VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED goto_if_eq BattleFrontier_OutsideEast_EventScript_RanFromSudowoodo setflag FLAG_CAUGHT_SUDOWOODO release end gText_Sudowoodo_Attacked:: .string "The weird tree doesn't like the\n" .string "FRESH WATER!\p" .string "The weird tree attacked!$" BattleFrontier_OutsideEast_EventScript_DefeatedSudowoodo:: setflag FLAG_DEFEATED_SUDOWOODO goto BattleFrontier_OutsideEast_EventScript_RanFromSudowoodo end BattleFrontier_OutsideEast_EventScript_RanFromSudowoodo:: fadescreenswapbuffers FADE_TO_BLACK removeobject VAR_LAST_TALKED fadescreenswapbuffers FADE_FROM_BLACK msgbox Text_WeirdTreeFledSomewhere release end Text_WeirdTreeFledSomewhere:: .string "The weird tree fled elsewhere…$" BattleFrontier_OutsideEast_Movement_SudowoodoShake: face_right delay_8 face_down delay_8 face_left delay_8 face_down delay_8 face_right delay_8 face_down delay_8 face_left delay_8 face_down step_end BattleFrontier_OutsideEast_Movement_SudowoodoShakeAngry: face_right delay_2 face_down delay_2 face_left delay_2 face_down delay_2 face_right delay_2 face_down delay_2 face_left delay_2 face_down step_end ================================================ FILE: data/maps/RS_BattleTower/text.inc ================================================ BattleTower_Outside_Text_199C6F:: .string "BATTLE TOWER\n" .string "“Win it all and be the best!”$" BattleTower_Outside_Text_199CA4:: .string "This is the BATTLE TOWER.\p" .string "TRAINERS bring their best POKéMON\n" .string "for elimination-style matches.$" BattleTower_Outside_Text_199E9C:: .string "I'm not leaving until I've beaten\n" .string "35 TRAINERS in a row!$" BattleTower_Outside_Text_199ED4:: .string "Gee, there're a lot of\n" .string "tough-looking TRAINERS here.\l" .string "I'm not good enough to enter yet…$" ================================================ FILE: data/maps/RS_BattleTower_BattleRoom/map.json ================================================ { "id": "MAP_RS_BATTLE_TOWER_BATTLE_ROOM", "name": "RS_BattleTower_BattleRoom", "layout": "LAYOUT_RS_BATTLE_TOWER_BATTLE_ROOM", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_LINK", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_VAR_0", "in_connection": false, "x": 5, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_BATTLE_TOWER_OPPONENT" }, { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 1, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 0, "dest_map": "MAP_RS_BATTLE_TOWER_LOBBY", "dest_warp_id": 2 }, { "x": 6, "y": 8, "elevation": 0, "dest_map": "MAP_RS_BATTLE_TOWER_LOBBY", "dest_warp_id": 2 } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/RS_BattleTower_BattleRoom/scripts.inc ================================================ RS_BattleTower_BattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleTower_BattleRoom_MapScript2_1608E1 .byte 0 BattleTower_BattleRoom_MapScript2_1608E1:: map_script_2 VAR_TEMP_0, 0, BattleTower_BattleRoom_EventScript_1608EB .2byte 0 BattleTower_BattleRoom_EventScript_1608EB:: setvar VAR_TEMP_0, 1 applymovement OBJ_EVENT_ID_PLAYER, BattleTower_BattleRoom_Movement_160AB7 waitmovement 0 BattleTower_BattleRoom_EventScript_1608FA:: special ChooseNextBattleTowerTrainer addobject 1 applymovement 1, BattleTower_BattleRoom_Movement_160AC0 waitmovement 0 compare VAR_LAST_TALKED, 0 call_if_eq BattleTower_BattleRoom_EventScript_TextcolorMale compare VAR_LAST_TALKED, 1 call_if_eq BattleTower_BattleRoom_EventScript_TextcolorFemale special PrintBattleTowerTrainerGreeting msgbox gStringVar4, MSGBOX_DEFAULT waitmessage closemessage callnative HealPlayerPartyOak setvar VAR_0x8004, 0 setvar VAR_0x8005, 0 special StartSpecialBattle waitstate switch VAR_RESULT case 1, BattleTower_BattleRoom_EventScript_160961 special LoadPlayerParty setvar VAR_0x8004, 0 setvar VAR_0x8005, 5 special SetBattleTowerProperty setvar VAR_0x8004, 14 special SetBattleTowerProperty setvar VAR_0x8004, 3 //special sub_810FF60 //fan club thing warp MAP_RS_BATTLE_TOWER_LOBBY, 255, 6, 6 waitstate BattleTower_BattleRoom_EventScript_160961:: setvar VAR_0x8004, 6 special SetBattleTowerProperty switch VAR_RESULT case 8, BattleTower_BattleRoom_EventScript_160A56 applymovement 1, BattleTower_BattleRoom_Movement_160AC6 waitmovement 0 removeobject 1 applymovement 2, BattleTower_BattleRoom_Movement_160ACB waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleTower_BattleRoom_Movement_160ABC waitmovement 0 textcolor 0x1 msgbox BattleTower_BattleRoom_Text_19ACDC, MSGBOX_DEFAULT special LoadPlayerParty special SavePlayerParty special SetBattleTowerParty playfanfare MUS_RS_HEAL waitfanfare callnative HealPlayerPartyOak BattleTower_BattleRoom_EventScript_1609B2:: textcolor 0x1 msgbox BattleTower_BattleRoom_Text_19AD09, MSGBOX_YESNO switch VAR_RESULT case NO, BattleTower_BattleRoom_EventScript_1609E0 case YES, BattleTower_BattleRoom_EventScript_160A3C case 127, BattleTower_BattleRoom_EventScript_1609E0 BattleTower_BattleRoom_EventScript_1609E0:: textcolor 0x1 msgbox BattleTower_BattleRoom_Text_19AD3C, MSGBOX_YESNO switch VAR_RESULT case NO, BattleTower_BattleRoom_EventScript_160A0E case YES, BattleTower_BattleRoom_EventScript_160A94 case 127, BattleTower_BattleRoom_EventScript_160A0E BattleTower_BattleRoom_EventScript_160A0E:: textcolor 0x1 msgbox BattleTower_BattleRoom_Text_19AD66, MSGBOX_YESNO switch VAR_RESULT case NO, BattleTower_BattleRoom_EventScript_1609B2 case YES, BattleTower_BattleRoom_EventScript_160AB1 case 127, BattleTower_BattleRoom_EventScript_1609B2 BattleTower_BattleRoom_EventScript_160A3C:: closemessage applymovement OBJ_EVENT_ID_PLAYER, BattleTower_BattleRoom_Movement_160ABE waitmovement 0 applymovement 2, BattleTower_BattleRoom_Movement_160AD0 waitmovement 0 goto BattleTower_BattleRoom_EventScript_1608FA BattleTower_BattleRoom_EventScript_160A56:: special LoadPlayerParty setvar VAR_0x8004, 0 setvar VAR_0x8005, 4 special SetBattleTowerProperty setvar VAR_0x8004, 2 setvar VAR_0x8005, 1 special SetBattleTowerProperty setvar VAR_0x8004, 7 special SetBattleTowerProperty setvar VAR_0x8004, 14 special SetBattleTowerProperty setvar VAR_0x8004, 3 //special sub_810FF60 //fan club thing warp MAP_RS_BATTLE_TOWER_LOBBY, 255, 6, 6 waitstate BattleTower_BattleRoom_EventScript_160A94:: setvar VAR_0x8004, 2 special SaveBattleTowerProgress textcolor 0x3 message BattleTower_BattleRoom_Text_1C6CE1 delay 60 waitmessage playse SE_SAVE waitse msgbox BattleTower_BattleRoom_Text_1C6D05, MSGBOX_DEFAULT BattleTower_BattleRoom_EventScript_160AB1:: fadescreen FADE_TO_BLACK special BattleTower_SoftReset end BattleTower_BattleRoom_EventScript_TextcolorMale:: textcolor 0x0 return BattleTower_BattleRoom_EventScript_TextcolorFemale:: textcolor 0x1 return BattleTower_BattleRoom_Movement_160AB7:: walk_up walk_up walk_up face_right step_end BattleTower_BattleRoom_Movement_160ABC:: face_down step_end BattleTower_BattleRoom_Movement_160ABE:: face_right step_end BattleTower_BattleRoom_Movement_160AC0:: walk_down walk_down walk_down walk_down face_left step_end BattleTower_BattleRoom_Movement_160AC6:: walk_up walk_up walk_up walk_up step_end BattleTower_BattleRoom_Movement_160ACB:: walk_right walk_right walk_right walk_up step_end BattleTower_BattleRoom_Movement_160AD0:: walk_down walk_left walk_left walk_left face_right step_end ================================================ FILE: data/maps/RS_BattleTower_BattleRoom/text.inc ================================================ BattleTower_BattleRoom_Text_19ACDC:: .string "We will restore your POKéMON to\n" .string "full health.$" BattleTower_BattleRoom_Text_19AD09:: .string "You will be facing opponent no. {STR_VAR_1}.\n" .string "Are you ready?$" BattleTower_BattleRoom_Text_19AD3C:: .string "Would you like to save and\n" .string "quit the game?$" BattleTower_BattleRoom_Text_19AD66:: .string "Would you like to cancel your\n" .string "BATTLE ROOM challenge?$" BattleTower_BattleRoom_Text_1C6CE1:: .string "SAVING...\n" .string "DON'T TURN OFF THE POWER.$" BattleTower_BattleRoom_Text_1C6D05:: .string "{PLAYER} saved the game.$" ================================================ FILE: data/maps/RS_BattleTower_Corridor/map.json ================================================ { "id": "MAP_RS_BATTLE_TOWER_CORRIDOR", "name": "RS_BattleTower_Corridor", "layout": "LAYOUT_RS_BATTLE_TOWER_CORRIDOR", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 9, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/RS_BattleTower_Corridor/scripts.inc ================================================ RS_BattleTower_Corridor_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, BattleTower_Corridor_MapScript1_160850 map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleTower_Corridor_MapScript2_160881 .byte 0 BattleTower_Corridor_MapScript1_160850:: compare VAR_0x8006, 1 goto_if_eq BattleTower_Corridor_EventScript_16086E setmetatile 12, 0, 0x287, 0 setmetatile 12, 1, 0x28F, 0 end BattleTower_Corridor_EventScript_16086E:: setmetatile 15, 0, 0x287, 0 setmetatile 15, 1, 0x28F, 0 end BattleTower_Corridor_MapScript2_160881:: map_script_2 VAR_TEMP_0, 0, BattleTower_Corridor_EventScript_16088B .2byte 0 BattleTower_Corridor_EventScript_16088B:: setvar VAR_TEMP_0, 1 compare VAR_0x8006, 1 goto_if_eq BattleTower_Corridor_EventScript_1608B1 applymovement 1, BattleTower_Corridor_Movement_1608D5 applymovement OBJ_EVENT_ID_PLAYER, BattleTower_Corridor_Movement_1608D4 waitmovement 0 goto BattleTower_Corridor_EventScript_1608C2 BattleTower_Corridor_EventScript_1608B1:: applymovement 1, BattleTower_Corridor_Movement_1608D2 applymovement OBJ_EVENT_ID_PLAYER, BattleTower_Corridor_Movement_1608D1 waitmovement 0 BattleTower_Corridor_EventScript_1608C2:: setvar VAR_TEMP_0, 0 warp MAP_RS_BATTLE_TOWER_BATTLE_ROOM, 255, 4, 8 waitstate end BattleTower_Corridor_Movement_1608D1:: walk_right BattleTower_Corridor_Movement_1608D2:: walk_right walk_right BattleTower_Corridor_Movement_1608D4:: walk_right BattleTower_Corridor_Movement_1608D5:: walk_right walk_right walk_right walk_up set_invisible step_end ================================================ FILE: data/maps/RS_BattleTower_Corridor/text.inc ================================================ ================================================ FILE: data/maps/RS_BattleTower_Elevator/map.json ================================================ { "id": "MAP_RS_BATTLE_TOWER_ELEVATOR", "name": "RS_BattleTower_Elevator", "layout": "LAYOUT_RS_BATTLE_TOWER_ELEVATOR", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/RS_BattleTower_Elevator/scripts.inc ================================================ RS_BattleTower_Elevator_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleTower_Elevator_MapScript2_1607DA map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleTower_Elevator_MapScript2_160821 .byte 0 BattleTower_Elevator_MapScript2_1607DA:: map_script_2 VAR_TEMP_0, 0, BattleTower_Elevator_EventScript_1607E4 .2byte 0 BattleTower_Elevator_EventScript_1607E4:: setvar VAR_TEMP_0, 1 applymovement 1, BattleTower_Elevator_Movement_160835 applymovement OBJ_EVENT_ID_PLAYER, BattleTower_Elevator_Movement_160839 waitmovement 0 special AnimateElevator waitstate delay 64 applymovement 1, BattleTower_Elevator_Movement_16083D applymovement OBJ_EVENT_ID_PLAYER, BattleTower_Elevator_Movement_160841 waitmovement 0 setvar VAR_TEMP_0, 0 warp MAP_RS_BATTLE_TOWER_CORRIDOR, 255, 8, 1 waitstate end BattleTower_Elevator_MapScript2_160821:: map_script_2 VAR_TEMP_1, 0, BattleTower_Elevator_EventScript_16082B .2byte 0 BattleTower_Elevator_EventScript_16082B:: setvar VAR_TEMP_1, 1 turnobject OBJ_EVENT_ID_PLAYER, 2 end BattleTower_Elevator_Movement_160835:: walk_up walk_right face_down step_end BattleTower_Elevator_Movement_160839:: walk_up walk_up face_down step_end BattleTower_Elevator_Movement_16083D:: walk_down walk_left walk_down set_invisible step_end BattleTower_Elevator_Movement_160841:: delay_16 delay_16 walk_down walk_down step_end ================================================ FILE: data/maps/RS_BattleTower_Elevator/text.inc ================================================ ================================================ FILE: data/maps/RS_BattleTower_Lobby/map.json ================================================ { "id": "MAP_RS_BATTLE_TOWER_LOBBY", "name": "RS_BattleTower_Lobby", "layout": "LAYOUT_RS_BATTLE_TOWER_LOBBY", "music": "MUS_B_TOWER_RS", "region_map_section": "MAPSEC_BATTLE_FRONTIER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleTower_Lobby_EventScript_16049E", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 12, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleTower_Lobby_EventScript_1606A5", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 10, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleTower_Lobby_EventScript_160715", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleTower_Lobby_EventScript_16071E", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SCOTT", "in_connection": false, "x": 7, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "BattleTower_Lobby_EventScript_Scott", "flag": "FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 0, "dest_map": "MAP_RS_BATTLE_TOWER", "dest_warp_id": 0 }, { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_RS_BATTLE_TOWER_BATTLE_ROOM", "dest_warp_id": 0 } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 3, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "BattleTower_Lobby_EventScript_160727" } ], "level_scaling": "0" } ================================================ FILE: data/maps/RS_BattleTower_Lobby/scripts.inc ================================================ RS_BattleTower_Lobby_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleTower_Lobby_MapScript1_160293 map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleTower_Lobby_MapScript2_160302 map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleTower_Lobby_MapScript2_1602EE .byte 0 BattleTower_Lobby_MapScript1_160293:: call BattleTower_Lobby_EventScript_16029C end BattleTower_Lobby_EventScript_16029C:: setvar VAR_0x8004, 10 special SetBattleTowerProperty goto_if_set FLAG_TEMP_1, BattleTower_Lobby_EventScript_160662 checkitem ITEM_EON_TICKET, 1 compare VAR_RESULT, TRUE goto_if_eq BattleTower_Lobby_EventScript_HideScott checkitem ITEM_AURORA_TICKET, 1 compare VAR_RESULT, TRUE goto_if_eq BattleTower_Lobby_EventScript_CheckShouldGiveEonTicket callnative GetBestBattleTowerStreakToVar0x8007 compare VAR_0x8007, 28 goto_if_lt BattleTower_Lobby_EventScript_HideScott clearflag FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER callnative TryInitBattleTowerAwardManObjectEvent return BattleTower_Lobby_EventScript_CheckShouldGiveEonTicket:: callnative GetBestBattleTowerStreakToVar0x8007 compare VAR_0x8007, 56 goto_if_lt BattleTower_Lobby_EventScript_HideScott clearflag FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER callnative TryInitBattleTowerAwardManObjectEvent return BattleTower_Lobby_EventScript_HideScott:: setflag FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER return BattleTower_Lobby_MapScript2_1602EE:: map_script_2 VAR_TEMP_1, 0, BattleTower_Lobby_EventScript_1602F8 .2byte 0 BattleTower_Lobby_EventScript_1602F8:: setvar VAR_TEMP_1, 1 turnobject OBJ_EVENT_ID_PLAYER, 2 end BattleTower_Lobby_MapScript2_160302:: map_script_2 VAR_TEMP_0, 0, BattleTower_Lobby_EventScript_16032C map_script_2 VAR_TEMP_0, 1, BattleTower_Lobby_EventScript_160330 map_script_2 VAR_TEMP_0, 2, BattleTower_Lobby_EventScript_160342 map_script_2 VAR_TEMP_0, 3, BattleTower_Lobby_EventScript_160419 map_script_2 VAR_TEMP_0, 4, BattleTower_Lobby_EventScript_16044B .2byte 0 BattleTower_Lobby_EventScript_16032C:: special BattleTowerMapScript2 end BattleTower_Lobby_EventScript_160330:: lock faceplayer textcolor 0x1 clearflag FLAG_SYS_IS_LINKING msgbox BattleTower_Lobby_Text_19A3FD, MSGBOX_DEFAULT closemessage setvar VAR_TEMP_0, 5 release end BattleTower_Lobby_EventScript_160342:: lock faceplayer clearflag FLAG_SYS_IS_LINKING textcolor 0x1 message BattleTower_Lobby_Text_19A487 waitmessage setvar VAR_0x8004, 0 special BattleTowerUtil compare VAR_RESULT, 6 goto_if_eq BattleTower_Lobby_EventScript_16037D special AwardBattleTowerRibbons compare VAR_RESULT, 0 goto_if_eq BattleTower_Lobby_EventScript_16037D message BattleTower_Lobby_Text_19A6BE waitmessage playfanfare MUS_OBTAIN_ITEM waitfanfare msgbox BattleTower_Lobby_Text_19A719, MSGBOX_DEFAULT BattleTower_Lobby_EventScript_16037D:: setvar VAR_0x8004, 8 special BattleTowerUtil compare VAR_RESULT, 1 goto_if_eq BattleTower_Lobby_EventScript_1603AD message BattleTower_Lobby_Text_19A589 waitmessage setvar VAR_0x8004, 13 special SetBattleTowerProperty special DetermineBattleTowerPrize setvar VAR_0x8004, 3 special SaveBattleTowerProgress playse SE_SAVE waitse BattleTower_Lobby_EventScript_1603AD:: setvar VAR_0x8004, 0 setvar VAR_0x8005, 3 special SetBattleTowerProperty message BattleTower_Lobby_Text_19A4BB waitmessage special GiveBattleTowerPrize switch VAR_RESULT case 0, BattleTower_Lobby_EventScript_160408 textcolor 0x3 message BattleTower_Lobby_Text_19A506 waitmessage playfanfare MUS_OBTAIN_ITEM waitfanfare setvar VAR_0x8004, 9 textcolor 0x1 special BattleTowerUtil compare VAR_RESULT, 49 goto_if_ne BattleTower_Lobby_EventScript_1603F8 msgbox BattleTower_Lobby_Text_19A617, MSGBOX_DEFAULT BattleTower_Lobby_EventScript_1603F8:: msgbox BattleTower_Lobby_Text_199FA9, MSGBOX_DEFAULT closemessage setvar VAR_TEMP_0, 5 release end BattleTower_Lobby_EventScript_160408:: msgbox BattleTower_Lobby_Text_19A520, MSGBOX_DEFAULT waitmessage closemessage setvar VAR_TEMP_0, 5 release end BattleTower_Lobby_EventScript_160419:: lock faceplayer textcolor 0x1 clearflag FLAG_SYS_IS_LINKING message BattleTower_Lobby_Text_19A571 waitmessage message BattleTower_Lobby_Text_19A589 waitmessage setvar VAR_0x8004, 13 special SetBattleTowerProperty setvar VAR_0x8004, 0 special SaveBattleTowerProgress playse SE_SAVE waitse msgbox BattleTower_Lobby_Text_199FA9, MSGBOX_DEFAULT closemessage setvar VAR_TEMP_0, 5 release end BattleTower_Lobby_EventScript_16044B:: lock faceplayer textcolor 0x1 message BattleTower_Lobby_Text_19A5B1 waitmessage message BattleTower_Lobby_Text_19A5CE waitmessage setvar VAR_0x8004, 1 special SaveBattleTowerProgress playse SE_SAVE waitse setvar VAR_0x8004, 8 setvar VAR_0x8005, 0 special SetBattleTowerProperty setvar VAR_TEMP_0, 5 special SavePlayerParty setflag FLAG_SYS_IS_LINKING callnative RecalculatePartyStats special SetBattleTowerParty msgbox BattleTower_Lobby_Text_19A0A8, MSGBOX_DEFAULT closemessage call BattleTower_Lobby_EventScript_160664 warp MAP_RS_BATTLE_TOWER_ELEVATOR, 255, 2, 6 setvar VAR_TEMP_0, 0 waitstate BattleTower_Lobby_EventScript_16049E:: lock faceplayer setvar VAR_0x8004, 0 special BattleTowerUtil compare VAR_RESULT, 6 goto_if_eq BattleTower_Lobby_EventScript_160342 special SavePlayerParty msgbox BattleTower_Lobby_Text_199F2C, MSGBOX_DEFAULT BattleTower_Lobby_EventScript_1604BE:: message BattleTower_Lobby_Text_199F79 waitmessage multichoice 18, 6, MULTICHOICE_CHALLENGE_INFO_EXIT, 0 switch VAR_RESULT case 0, BattleTower_Lobby_EventScript_1604FA case 1, BattleTower_Lobby_EventScript_160600 case 2, BattleTower_Lobby_EventScript_160652 case 127, BattleTower_Lobby_EventScript_160652 BattleTower_Lobby_EventScript_1604FA:: message BattleTower_Lobby_Text_19A024 waitmessage multichoice 18, 6, MULTICHOICE_BATTLE_TOWER_LEVELS, 0 switch VAR_RESULT case 2, BattleTower_Lobby_EventScript_160652 case 127, BattleTower_Lobby_EventScript_160652 special CheckPartyBattleTowerBanlist compare VAR_0x8004, 1 goto_if_eq BattleTower_Lobby_EventScript_16060D setvar VAR_0x8004, 1 copyvar VAR_0x8005, VAR_RESULT copyvar VAR_0x8006, VAR_RESULT special SetBattleTowerProperty msgbox BattleTower_Lobby_Text_19A07B, MSGBOX_DEFAULT setflag FLAG_TEMP_1 fadescreen FADE_TO_BLACK special ChooseBattleTowerPlayerParty waitstate clearflag FLAG_TEMP_1 compare VAR_RESULT, 0 goto_if_eq BattleTower_Lobby_EventScript_16064F msgbox BattleTower_Lobby_Text_199FDA, MSGBOX_YESNO switch VAR_RESULT case NO, BattleTower_Lobby_EventScript_16064F case YES, BattleTower_Lobby_EventScript_160587 case 127, BattleTower_Lobby_EventScript_16064F BattleTower_Lobby_EventScript_160587:: setvar VAR_0x8004, 5 special SetBattleTowerProperty setvar VAR_TEMP_0, 0 setvar VAR_0x8004, 11 special SetBattleTowerProperty setvar VAR_0x8004, 0 setvar VAR_0x8005, 1 special SetBattleTowerProperty setvar VAR_0x8004, 8 setvar VAR_0x8005, 0 special SetBattleTowerProperty setdynamicwarp MAP_RS_BATTLE_TOWER_LOBBY, 255, 6, 6 special LoadPlayerParty closemessage delay 2 call EventScript_AskSaveGame setvar VAR_TEMP_0, 5 //erasebox 0, 0, 15, 10 compare VAR_RESULT, 0 goto_if_eq BattleTower_Lobby_EventScript_160642 incrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER special SavePlayerParty setflag FLAG_SYS_IS_LINKING callnative RecalculatePartyStats special SetBattleTowerParty msgbox BattleTower_Lobby_Text_19A0A8, MSGBOX_DEFAULT closemessage call BattleTower_Lobby_EventScript_160664 warp MAP_RS_BATTLE_TOWER_ELEVATOR, 255, 2, 6 setvar VAR_TEMP_0, 0 waitstate BattleTower_Lobby_EventScript_160600:: msgbox BattleTower_Lobby_Text_19A0D1, MSGBOX_DEFAULT goto BattleTower_Lobby_EventScript_1604BE BattleTower_Lobby_EventScript_16060D:: switch VAR_RESULT case 0, BattleTower_Lobby_EventScript_160628 case 1, BattleTower_Lobby_EventScript_160635 BattleTower_Lobby_EventScript_160628:: textcolor 0x1 msgbox BattleTower_Lobby_Text_19A249, MSGBOX_DEFAULT goto BattleTower_Lobby_EventScript_160662 BattleTower_Lobby_EventScript_160635:: msgbox BattleTower_Lobby_Text_19A32D, MSGBOX_DEFAULT goto BattleTower_Lobby_EventScript_160662 BattleTower_Lobby_EventScript_160642:: setvar VAR_0x8004, 12 special SetBattleTowerProperty goto BattleTower_Lobby_EventScript_160652 BattleTower_Lobby_EventScript_16064F:: special LoadPlayerParty BattleTower_Lobby_EventScript_160652:: msgbox BattleTower_Lobby_Text_199FA9, MSGBOX_DEFAULT setvar VAR_0x8004, 11 special SetBattleTowerProperty BattleTower_Lobby_EventScript_160662:: release end BattleTower_Lobby_EventScript_160664:: applymovement 1, BattleTower_Lobby_Movement_160693 applymovement OBJ_EVENT_ID_PLAYER, BattleTower_Lobby_Movement_160693 waitmovement 0 opendoor 6, 1 waitdooranim applymovement 1, BattleTower_Lobby_Movement_160697 applymovement OBJ_EVENT_ID_PLAYER, BattleTower_Lobby_Movement_16069A waitmovement 0 closedoor 6, 1 waitdooranim return BattleTower_Lobby_Movement_160693:: walk_up walk_up walk_up step_end BattleTower_Lobby_Movement_160697:: walk_up set_invisible step_end BattleTower_Lobby_Movement_16069A:: walk_up walk_up set_invisible step_end @ 816069E walk_fast_up walk_fast_up walk_fast_up walk_fast_up walk_fast_up set_invisible step_end BattleTower_Lobby_EventScript_1606A5:: msgbox BattleTower_Lobby_Text_19A747, MSGBOX_NPC end BattleTower_Lobby_EventScript_160715:: msgbox BattleTower_Lobby_Text_19A8AE, MSGBOX_NPC end BattleTower_Lobby_EventScript_16071E:: msgbox BattleTower_Lobby_Text_19A946, MSGBOX_NPC end BattleTower_Lobby_EventScript_160727:: lockall callnative ShowBattleTowerRecords waitbuttonpress callnative RemoveRecordsWindow releaseall end BattleTower_Lobby_EventScript_Scott:: lock faceplayer checkitem ITEM_EON_TICKET, 1 compare VAR_RESULT, TRUE goto_if_eq BattleTower_Lobby_EventScript_Scott_GaveEonTicket checkitem ITEM_AURORA_TICKET, 1 compare VAR_RESULT, TRUE goto_if_eq BattleTower_Lobby_EventScript_Scott_TryGiveEonTicket msgbox BattleTower_Lobby_Text_Scott28Wins, MSGBOX_DEFAULT giveitem ITEM_AURORA_TICKET, 1 setflag FLAG_RECEIVED_AURORA_TICKET setflag FLAG_ENABLE_SHIP_BIRTH_ISLAND msgbox BattleTower_Lobby_Text_ScottExplainAuroraTicket, MSGBOX_DEFAULT release end BattleTower_Lobby_EventScript_Scott_TryGiveEonTicket:: callnative GetBestBattleTowerStreakToVar0x8007 compare VAR_0x8007, 56 goto_if_lt BattleTower_Lobby_EventScript_Scott_GaveAuroraTicket msgbox BattleTower_Lobby_Text_Scott56Wins, MSGBOX_DEFAULT giveitem ITEM_EON_TICKET, 1 msgbox BattleTower_Lobby_Text_ScottExplainEonTicket, MSGBOX_DEFAULT release end BattleTower_Lobby_EventScript_Scott_GaveAuroraTicket:: msgbox BattleTower_Lobby_Text_ScottGaveAuroraTicket, MSGBOX_DEFAULT release end BattleTower_Lobby_EventScript_Scott_GaveEonTicket:: msgbox BattleTower_Lobby_Text_ScottGaveEonTicket, MSGBOX_DEFAULT release end ================================================ FILE: data/maps/RS_BattleTower_Lobby/text.inc ================================================ BattleTower_Lobby_Text_199F2C:: .string "Welcome to the BATTLE TOWER!\p" .string "Please register with me to enter\n" .string "a BATTLE ROOM.$" BattleTower_Lobby_Text_199F79:: .string "Would you like to make a\n" .string "BATTLE ROOM challenge?$" BattleTower_Lobby_Text_199FA9:: .string "We'll be looking forward to your\n" .string "next challenge.$" BattleTower_Lobby_Text_199FDA:: .string "Before entering a BATTLE ROOM\n" .string "your progress must be saved.\lIs that okay?$" BattleTower_Lobby_Text_19A024:: .string "There are two BATTLE ROOMS,\n" .string "Level 50 and Open Level.\l" .string "Which would you like to challenge?$" BattleTower_Lobby_Text_19A07B:: .string "Please select the POKéMON you wish\n" .string "to enter.$" BattleTower_Lobby_Text_19A0A8:: .string "I'll direct you to your BATTLE\nROOM now.$" BattleTower_Lobby_Text_19A0D1:: .string "The BATTLE TOWER is a facility made\n" .string "especially for POKéMON battles.\p" .string "Within the TOWER are many\nBATTLE ROOMS.\p" .string "The BATTLE ROOMs come in two styles,\n" .string "Level 50 and Open Level.\p" .string "The level 50 BATTLE ROOMS are\n" .string "open to POKéMON up to and\l" .string "including Level 50.\p" .string "No other TRAINERS in the room\n" .string "will have POKéMON below Level 50.\p" .string "The Open Level BATTLE ROOMS\n" .string "are open to POKéMON of all levels.\p" .string "The levels of your opponents will\n" .string "be adjusted to match the levels\l" .string "of your POKéMON.\p" .string "However, no other TRAINERS in the\n" .string "room will have POKéMON that are\lbelow Level 60.\p" .string "In each BATTLE ROOM, seven\n" .string "TRAINERS await your challenge.\p" .string "Beat all seven, and you will be\n" .string "rewarded with a fabulous prize.\p" .string "You may also take a break from your\n" .string "challenge by saving your progress.\p" .string "Make sure you save properly\n" .string "or you won't be able to\lresume your challenge.$" BattleTower_Lobby_Text_19A249:: .string "Excuse me!\p" .string "You don't have three eligible\nPOKéMON.\p" .string "You must have three different\n" .string "POKéMON of Level 50 or less\lto enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" .string "EGGS are ineligible.\p" .string "Please come see me when\nyou are ready.$" BattleTower_Lobby_Text_19A32D:: .string "Excuse me!\p" .string "You don't have three eligible\nPOKéMON.\p" .string "You must have three different\nPOKéMON " .string "to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" .string "EGGS are ineligible.\p" .string "Please come see me when\nyou are ready.$" BattleTower_Lobby_Text_19A3FD:: .string "Excuse me!\p" .string "You didn't save before you quit your\n" .string "challenge last time.\p" .string "Because of that, your challenge so\n" .string "far has been disqualified. Sorry!$" BattleTower_Lobby_Text_19A487:: .string "Congratulations!\n" .string "You've beaten all seven TRAINERS!\p" .string "$" BattleTower_Lobby_Text_19A4BB:: .string "For beating your challenge, you\n" .string "have earned this fabulous prize!\p" .string "$" BattleTower_Lobby_Text_19A506:: .string "{PLAYER} received the prize\n" .string "{STR_VAR_1}.$" BattleTower_Lobby_Text_19A520:: .string "Oh, your BAG appears to be full.\p" .string "Please make room in your BAG,\n" .string "then come see me.$" BattleTower_Lobby_Text_19A571:: .string "Thank you for playing!\p" .string "$" BattleTower_Lobby_Text_19A589:: .string "Your record will be saved.\n" .string "Please wait.$" BattleTower_Lobby_Text_19A5B1:: .string "We've been waiting for you!\p" .string "$" BattleTower_Lobby_Text_19A5CE:: .string "Before entering a BATTLE ROOM,\n" .string "your progress will be saved.\lPlease wait.$" BattleTower_Lobby_Text_19A617:: .string "You're finally about to face the\n" .string "50th TRAINER.\p" .string "From here on, every time you beat\n" .string "seven TRAINERS in a row, your\l" .string "POKéMON will receive a\lcommemorative RIBBON.\p" .string "Good luck!$" BattleTower_Lobby_Text_19A6BE:: .string "Here are some RIBBONS for beating\n" .string "seven tough TRAINERS in a row.\p" .string "{COLOR DARK_GRAY}{PLAYER} received some RIBBONS!$" BattleTower_Lobby_Text_19A719:: .string "{COLOR DARK_GRAY}{PLAYER} put the RIBBONS on the\n" .string "challenger POKéMON.$" BattleTower_Lobby_Text_19A747:: .string "Hello, hello!\n" .string "Where are you from, TRAINER?\p" .string "…\p" .string "KANTO? PALLET TOWN?\n" .string "That's quite a ways away!$" BattleTower_Lobby_Text_19A8AE:: .string "The number of matches you win in\n" .string "a row is recorded.\p" .string "The record is posted beside the\n" .string "registration counter.$" BattleTower_Lobby_Text_19A946:: .string "Once you're in the BATTLE TOWER,\n" .string "you can't leave until you lose or\l" .string "beat seven TRAINERS in a row.\p" .string "You'd best be certain that you're\n" .string "up to the challenge.$" BattleTower_Lobby_Text_Scott28Wins:: .string "SCOTT: I heard about you!\n" .string "How you ruled the BATTLE TOWER!\l" .string "You beat 28 TRAINERS in a row?\p" .string "That's fantastic!\n" .string "I want you to have this!$" BattleTower_Lobby_Text_ScottExplainAuroraTicket:: .string "Bring that ticket to your\n" .string "friend at the VERMILION HARBOR.\p" .string "He'll be able to take you to a\n" .string "small island south of SIX ISLAND.\p" .string "There's a strange stone and\n" .string "nothing else there.\p" .string "It's nice and private, though,\n" .string "so it's a good vacation spot!$" BattleTower_Lobby_Text_Scott56Wins:: .string "SCOTT: Oh my! I heard about you!\n" .string "How you crushed the BATTLE TOWER!\p" .string "You beat 56 TRAINERS in a row?\p" .string "That's ridiculously spectacular!\n" .string "You've got to have this!$" BattleTower_Lobby_Text_ScottExplainEonTicket:: .string "Bring that ticket to your\n" .string "friend at the VERMILION HARBOR.\p" .string "He'll be able to take you to an\n" .string "island that's not far from here.\p" .string "There's a nice little grove there,\n" .string "perfect for a relaxing picnic\l" .string "when you're not training.$" BattleTower_Lobby_Text_ScottGaveAuroraTicket:: .string "I'll be expecting to hear even\n" .string "greater things about you now!$" BattleTower_Lobby_Text_ScottGaveEonTicket:: .string "This BATTLE TOWER has been a\n" .string "huge success but…\p" .string "Perhaps it's time to push\n" .string "this project to a new frontier…$" ================================================ FILE: data/maps/RecordCorner/map.json ================================================ { "id": "MAP_RECORD_CORNER", "name": "RecordCorner", "layout": "LAYOUT_RECORD_CORNER", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SPECIAL_AREA", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST", "x": 10, "y": 5, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RecordCorner_EventScript_Attendant", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 9, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 9, "y": 9, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 11, "y": 9, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 10, "y": 9, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" } ], "coord_events": [ { "type": "trigger", "x": 6, "y": 4, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "RecordCorner_EventScript_Spot0" }, { "type": "trigger", "x": 6, "y": 6, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "RecordCorner_EventScript_Spot1" }, { "type": "trigger", "x": 13, "y": 4, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "RecordCorner_EventScript_Spot2" }, { "type": "trigger", "x": 13, "y": 6, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "RecordCorner_EventScript_Spot3" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/RecordCorner/scripts.inc ================================================ RecordCorner_MapScripts:: .byte 0 ================================================ FILE: data/maps/RockTunnel_1F/map.json ================================================ { "id": "MAP_ROCK_TUNNEL_1F", "name": "RockTunnel_1F", "layout": "LAYOUT_ROCK_TUNNEL_1F", "music": "MUS_MT_MOON", "region_map_section": "MAPSEC_ROCK_TUNNEL", "requires_flash": true, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 26, "y": 28, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "RockTunnel_1F_EventScript_Dana", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 39, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "RockTunnel_1F_EventScript_Ariana", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 45, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "RockTunnel_1F_EventScript_Leah", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 20, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "RockTunnel_1F_EventScript_Lucas", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 5, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "RockTunnel_1F_EventScript_Oliver", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 7, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "RockTunnel_1F_EventScript_Lenny", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKE_MANIAC", "x": 27, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "RockTunnel_1F_EventScript_Ashton", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 37, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RockTunnel_1F_EventScript_ItemRepel", "flag": "FLAG_HIDE_ROCK_TUNNEL_1F_REPEL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 33, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RockTunnel_1F_EventScript_ItemPearl", "flag": "FLAG_HIDE_ROCK_TUNNEL_1F_PEARL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 22, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RockTunnel_1F_EventScript_ItemEscapeRope", "flag": "FLAG_HIDE_ROCK_TUNNEL_1F_ESCAPE_ROPE" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 9, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Geodude", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 17, "y": 2, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "0" }, { "x": 45, "y": 2, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_B1F", "dest_warp_id": "0" }, { "x": 4, "y": 2, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_B1F", "dest_warp_id": "1" }, { "x": 20, "y": 13, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_B1F", "dest_warp_id": "2" }, { "x": 45, "y": 21, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_B1F", "dest_warp_id": "3" }, { "x": 18, "y": 37, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 14, "y": 33, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "RockTunnel_1F_EventScript_RouteSign" } ], "level_scaling": "2" } ================================================ FILE: data/maps/RockTunnel_1F/scripts.inc ================================================ .set LOCALID_GEODUDE_MASTER, 11 .set TRAINER, VAR_0x8009 RockTunnel_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RockTunnel_1F_OnTransition .byte 0 RockTunnel_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_ROCK_TUNNEL_1F goto RockTunnel_1F_MapScript_SetMasterTrainerMovementTypes end RockTunnel_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_GEODUDE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, RockTunnel_1F_MapScript_GeodudeMasterMovementType end RockTunnel_1F_MapScript_GeodudeMasterMovementType:: setobjectmovementtype LOCALID_GEODUDE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return RockTunnel_1F_EventScript_RouteSign:: msgbox RockTunnel_1F_Text_RouteSign, MSGBOX_SIGN end RockTunnel_1F_EventScript_Lenny:: trainerbattle_single TRAINER_HIKER_LENNY, RockTunnel_1F_Text_LennyIntro, RockTunnel_1F_Text_LennyDefeat msgbox RockTunnel_1F_Text_LennyPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_1F_EventScript_Oliver:: trainerbattle_single TRAINER_HIKER_OLIVER, RockTunnel_1F_Text_OliverIntro, RockTunnel_1F_Text_OliverDefeat msgbox RockTunnel_1F_Text_OliverPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_1F_EventScript_Lucas:: trainerbattle_single TRAINER_HIKER_LUCAS, RockTunnel_1F_Text_LucasIntro, RockTunnel_1F_Text_LucasDefeat msgbox RockTunnel_1F_Text_LucasPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_1F_EventScript_Ashton:: trainerbattle_single TRAINER_POKEMANIAC_ASHTON, RockTunnel_1F_Text_AshtonIntro, RockTunnel_1F_Text_AshtonDefeat msgbox RockTunnel_1F_Text_AshtonPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_1F_EventScript_Leah:: trainerbattle_single TRAINER_PICNICKER_LEAH, RockTunnel_1F_Text_LeahIntro, RockTunnel_1F_Text_LeahDefeat msgbox RockTunnel_1F_Text_LeahPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_1F_EventScript_Ariana:: trainerbattle_single TRAINER_PICNICKER_ARIANA, RockTunnel_1F_Text_ArianaIntro, RockTunnel_1F_Text_ArianaDefeat msgbox RockTunnel_1F_Text_ArianaPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_1F_EventScript_Dana:: trainerbattle_single TRAINER_PICNICKER_DANA, RockTunnel_1F_Text_DanaIntro, RockTunnel_1F_Text_DanaDefeat msgbox RockTunnel_1F_Text_DanaPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/RockTunnel_1F/text.inc ================================================ RockTunnel_1F_Text_LennyIntro:: .string "This tunnel goes a long way, kid!$" RockTunnel_1F_Text_LennyDefeat:: .string "Doh!\n" .string "You win!$" RockTunnel_1F_Text_LennyPostBattle:: .string "Watch for ONIX.\n" .string "They appear only occasionally.\p" .string "High-level ones can put the\n" .string "squeeze on you!$" RockTunnel_1F_Text_OliverIntro:: .string "Hmm.\n" .string "Maybe I'm lost in here…$" RockTunnel_1F_Text_OliverDefeat:: .string "Ease up!\n" .string "What am I doing?\l" .string "Which way is out?$" RockTunnel_1F_Text_OliverPostBattle:: .string "That sleeping POKéMON on ROUTE 12\n" .string "forced me to take this detour.$" RockTunnel_1F_Text_LucasIntro:: .string "Outsiders like you need to show me\n" .string "some respect!$" RockTunnel_1F_Text_LucasDefeat:: .string "I give!$" RockTunnel_1F_Text_LucasPostBattle:: .string "You're talented enough to hike!$" RockTunnel_1F_Text_AshtonIntro:: .string "POKéMON fight!\n" .string "Ready, go!$" RockTunnel_1F_Text_AshtonDefeat:: .string "Game over!$" RockTunnel_1F_Text_AshtonPostBattle:: .string "Oh well, I'll get a ZUBAT as I go!$" RockTunnel_1F_Text_LeahIntro:: .string "Eek!\p" .string "Don't try anything funny in the\n" .string "dark!$" RockTunnel_1F_Text_LeahDefeat:: .string "It was too dark…$" RockTunnel_1F_Text_LeahPostBattle:: .string "I saw a MACHOP in this tunnel.$" RockTunnel_1F_Text_DanaIntro:: .string "I came this far looking for wild\n" .string "POKéMON.$" RockTunnel_1F_Text_DanaDefeat:: .string "I'm out of POKéMON!$" RockTunnel_1F_Text_DanaPostBattle:: .string "You looked cute and harmless.\n" .string "Was I ever wrong!$" RockTunnel_1F_Text_ArianaIntro:: .string "You have POKéMON!\n" .string "Let's start!$" RockTunnel_1F_Text_ArianaDefeat:: .string "You play hard!$" RockTunnel_1F_Text_ArianaPostBattle:: .string "Whew!\n" .string "I'm all sweaty now.$" RockTunnel_1F_Text_RouteSign:: .string "ROCK TUNNEL\n" .string "CERULEAN CITY - LAVENDER TOWN$" ================================================ FILE: data/maps/RockTunnel_B1F/map.json ================================================ { "id": "MAP_ROCK_TUNNEL_B1F", "name": "RockTunnel_B1F", "layout": "LAYOUT_ROCK_TUNNEL_B1F", "music": "MUS_MT_MOON", "region_map_section": "MAPSEC_ROCK_TUNNEL", "requires_flash": true, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKE_MANIAC", "x": 2, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "RockTunnel_B1F_EventScript_Cooper", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 5, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "RockTunnel_B1F_EventScript_Dudley", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 11, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "RockTunnel_B1F_EventScript_Sofia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 36, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "RockTunnel_B1F_EventScript_Allen", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 41, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "RockTunnel_B1F_EventScript_Eric", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKE_MANIAC", "x": 23, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "RockTunnel_B1F_EventScript_Steve", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 15, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "RockTunnel_B1F_EventScript_Martha", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKE_MANIAC", "x": 29, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "RockTunnel_B1F_EventScript_Winston", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 2, "y": 29, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RockTunnel_B1F_EventScript_RockSlideTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 2, "y": 37, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RockTunnel_B1F_EventScript_ItemRevive", "flag": "FLAG_HIDE_ROCK_TUNNEL_B1F_REVIVE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 9, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RockTunnel_B1F_EventScript_ItemMaxEther", "flag": "FLAG_HIDE_ROCK_TUNNEL_B1F_MAX_ETHER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 1, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 1, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 4, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 2, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 39, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 42, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 43, "y": 28, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 45, "y": 30, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_19" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 45, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1A" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 25, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1B" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 27, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1C" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 23, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1D" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 26, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1E" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 24, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1F" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 27, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_11" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 10, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Zubat", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 38, "y": 28, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_1F", "dest_warp_id": "1" }, { "x": 33, "y": 3, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_1F", "dest_warp_id": "2" }, { "x": 27, "y": 12, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_1F", "dest_warp_id": "3" }, { "x": 2, "y": 3, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_1F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "2" } ================================================ FILE: data/maps/RockTunnel_B1F/scripts.inc ================================================ .set LOCALID_ZUBAT_MASTER, 27 .set TRAINER, VAR_0x8009 RockTunnel_B1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RockTunnel_B1F_MapScript_SetMasterTrainerMovementTypes .byte 0 RockTunnel_B1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_ZUBAT callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, RockTunnel_B1F_MapScript_ZubatMasterMovementType end RockTunnel_B1F_MapScript_ZubatMasterMovementType:: setobjectmovementtype LOCALID_ZUBAT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return RockTunnel_B1F_EventScript_Sofia:: trainerbattle_single TRAINER_PICNICKER_SOFIA, RockTunnel_B1F_Text_SofiaIntro, RockTunnel_B1F_Text_SofiaDefeat msgbox RockTunnel_B1F_Text_SofiaPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_B1F_EventScript_Martha:: trainerbattle_single TRAINER_PICNICKER_MARTHA, RockTunnel_B1F_Text_MarthaIntro, RockTunnel_B1F_Text_MarthaDefeat msgbox RockTunnel_B1F_Text_MarthaPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_B1F_EventScript_Dudley:: trainerbattle_single TRAINER_HIKER_DUDLEY, RockTunnel_B1F_Text_DudleyIntro, RockTunnel_B1F_Text_DudleyDefeat msgbox RockTunnel_B1F_Text_DudleyPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_B1F_EventScript_Allen:: trainerbattle_single TRAINER_HIKER_ALLEN, RockTunnel_B1F_Text_AllenIntro, RockTunnel_B1F_Text_AllenDefeat msgbox RockTunnel_B1F_Text_AllenPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_B1F_EventScript_Eric:: trainerbattle_single TRAINER_HIKER_ERIC, RockTunnel_B1F_Text_EricIntro, RockTunnel_B1F_Text_EricDefeat msgbox RockTunnel_B1F_Text_EricPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_B1F_EventScript_Cooper:: trainerbattle_single TRAINER_POKEMANIAC_COOPER, RockTunnel_B1F_Text_CooperIntro, RockTunnel_B1F_Text_CooperDefeat msgbox RockTunnel_B1F_Text_CooperPostBattle, MSGBOX_AUTOCLOSE end RockTunnel_B1F_EventScript_Steve:: trainerbattle_single TRAINER_POKEMANIAC_STEVE, RockTunnel_B1F_Text_SteveIntro, RockTunnel_B1F_Text_SteveDefeat msgbox RockTunnel_B1F_Text_StevePostBattle, MSGBOX_AUTOCLOSE end RockTunnel_B1F_EventScript_Winston:: trainerbattle_single TRAINER_POKEMANIAC_WINSTON, RockTunnel_B1F_Text_WinstonIntro, RockTunnel_B1F_Text_WinstonDefeat msgbox RockTunnel_B1F_Text_WinstonPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/RockTunnel_B1F/text.inc ================================================ RockTunnel_B1F_Text_SofiaIntro:: .string "Do you know how you can avoid\n" .string "getting lost in the mountains?\p" .string "You can bend twigs as trail\n" .string "markers.$" RockTunnel_B1F_Text_SofiaDefeat:: .string "Ohhh!\n" .string "I did my best!$" RockTunnel_B1F_Text_SofiaPostBattle:: .string "I want to go home!$" RockTunnel_B1F_Text_DudleyIntro:: .string "Hahaha!\n" .string "Can you beat my power?$" RockTunnel_B1F_Text_DudleyDefeat:: .string "Oops!\n" .string "Outmuscled!$" RockTunnel_B1F_Text_DudleyPostBattle:: .string "I go for power because I hate\n" .string "thinking.$" RockTunnel_B1F_Text_CooperIntro:: .string "You have a POKéDEX?\n" .string "I want one, too.$" RockTunnel_B1F_Text_CooperDefeat:: .string "Shoot!\n" .string "I am so jealous!$" RockTunnel_B1F_Text_CooperPostBattle:: .string "When you finish your POKéDEX,\n" .string "can I have it?$" RockTunnel_B1F_Text_SteveIntro:: .string "Um… Do you know about POKéMON\n" .string "cosplay?$" RockTunnel_B1F_Text_SteveDefeat:: .string "Well, that's that.$" RockTunnel_B1F_Text_StevePostBattle:: .string "POKéMON cosplay is dressing up as\n" .string "POKéMON for fun.\p" .string "CLEFAIRY is a favorite.$" RockTunnel_B1F_Text_AllenIntro:: .string "My POKéMON techniques will leave\n" .string "you crying!$" RockTunnel_B1F_Text_AllenDefeat:: .string "I give!\n" .string "You're a better technician!$" RockTunnel_B1F_Text_AllenPostBattle:: .string "In mountains, you'll often find\n" .string "ROCK-type POKéMON.$" RockTunnel_B1F_Text_MarthaIntro:: .string "I don't often come here, but I will\n" .string "battle you.$" RockTunnel_B1F_Text_MarthaDefeat:: .string "Oh!\n" .string "I lost!$" RockTunnel_B1F_Text_MarthaPostBattle:: .string "I like tiny POKéMON.\n" .string "Big ones are too scary!$" RockTunnel_B1F_Text_EricIntro:: .string "Hit me with your best shot!$" RockTunnel_B1F_Text_EricDefeat:: .string "Fired away!$" RockTunnel_B1F_Text_EricPostBattle:: .string "I'll raise my POKéMON to beat\n" .string "yours, kid.$" RockTunnel_B1F_Text_WinstonIntro:: .string "I draw illustrations of POKéMON\n" .string "when I'm home.$" RockTunnel_B1F_Text_WinstonDefeat:: .string "Whew…\n" .string "I'm exhausted…$" RockTunnel_B1F_Text_WinstonPostBattle:: .string "I'm an artist, not a fighter.\n" .string "I'll go home to draw.$" ================================================ FILE: data/maps/RocketHideout_B1F/map.json ================================================ { "id": "MAP_ROCKET_HIDEOUT_B1F", "name": "RocketHideout_B1F", "layout": "LAYOUT_ROCKET_HIDEOUT_B1F", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_ROCKET_HIDEOUT", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": -1, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 4, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "RocketHideout_B1F_EventScript_Grunt2", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 24, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "RocketHideout_B1F_EventScript_Grunt1", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 6, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "RocketHideout_B1F_EventScript_Grunt4", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 10, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "RocketHideout_B1F_EventScript_Grunt3", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 21, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "RocketHideout_B1F_EventScript_Grunt5", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 16, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B1F_EventScript_ItemEscapeRope", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B1F_ESCAPE_ROPE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 1, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B1F_EventScript_ItemHyperPotion", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B1F_HYPER_POTION" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 1, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Arbok", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 12, "y": 2, "elevation": 3, "dest_map": "MAP_CELADON_CITY_GAME_CORNER", "dest_warp_id": "3" }, { "x": 17, "y": 2, "elevation": 3, "dest_map": "MAP_ROCKET_HIDEOUT_B2F", "dest_warp_id": "1" }, { "x": 15, "y": 30, "elevation": 3, "dest_map": "MAP_ROCKET_HIDEOUT_B2F", "dest_warp_id": "2" }, { "x": 23, "y": 25, "elevation": 0, "dest_map": "MAP_ROCKET_HIDEOUT_ELEVATOR", "dest_warp_id": "1" }, { "x": 24, "y": 25, "elevation": 0, "dest_map": "MAP_ROCKET_HIDEOUT_ELEVATOR", "dest_warp_id": "1" }, { "x": 25, "y": 25, "elevation": 0, "dest_map": "MAP_ROCKET_HIDEOUT_ELEVATOR", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 16, "y": 17, "elevation": 0, "item": "ITEM_PP_UP", "flag": "FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B1F_PP_UP", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/RocketHideout_B1F/scripts.inc ================================================ .set LOCALID_ARBOK_MASTER, 8 .set TRAINER, VAR_0x8009 RocketHideout_B1F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, RocketHideout_B1F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, RocketHideout_B1F_OnTransition .byte 0 RocketHideout_B1F_OnLoad:: call_if_not_defeated TRAINER_TEAM_ROCKET_GRUNT_12 RocketHideout_B1F_EventScript_SetBarrier end RocketHideout_B1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F goto RocketHideout_B1F_MapScript_SetMasterTrainerMovementTypes end RocketHideout_B1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_ARBOK callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, RocketHideout_B1F_MapScript_ArbokMasterMovementType end RocketHideout_B1F_MapScript_ArbokMasterMovementType:: setobjectmovementtype LOCALID_ARBOK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return RocketHideout_B1F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_8, RocketHideout_B1F_Text_Grunt1Intro, RocketHideout_B1F_Text_Grunt1Defeat msgbox RocketHideout_B1F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end RocketHideout_B1F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_9, RocketHideout_B1F_Text_Grunt2Intro, RocketHideout_B1F_Text_Grunt2Defeat msgbox RocketHideout_B1F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end RocketHideout_B1F_EventScript_Grunt3:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_10, RocketHideout_B1F_Text_Grunt3Intro, RocketHideout_B1F_Text_Grunt3Defeat msgbox RocketHideout_B1F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE end RocketHideout_B1F_EventScript_Grunt4:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_11, RocketHideout_B1F_Text_Grunt4Intro, RocketHideout_B1F_Text_Grunt4Defeat msgbox RocketHideout_B1F_Text_Grunt4PostBattle, MSGBOX_AUTOCLOSE end RocketHideout_B1F_EventScript_Grunt5:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_12, RocketHideout_B1F_Text_Grunt5Intro, RocketHideout_B1F_Text_Grunt5Defeat, RocketHideout_B1F_EventScript_DefeatedGrunt5 msgbox RocketHideout_B1F_Text_Grunt5PostBattle, MSGBOX_AUTOCLOSE end RocketHideout_B1F_EventScript_DefeatedGrunt5:: call RocketHideout_B1F_EventScript_RemoveBarrier playse SE_UNLOCK special DrawWholeMapView waitse release end RocketHideout_B1F_EventScript_SetBarrier:: setmetatile 20, 19, METATILE_SilphCo_HideoutBarrier_TopLeft_Floor, 1 setmetatile 21, 19, METATILE_SilphCo_HideoutBarrier_TopRight_Floor, 1 setmetatile 20, 20, METATILE_SilphCo_HideoutBarrier_BottomLeft, 1 setmetatile 21, 20, METATILE_SilphCo_HideoutBarrier_BottomRight, 1 setmetatile 20, 21, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 setmetatile 21, 21, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 return RocketHideout_B1F_EventScript_RemoveBarrier:: setmetatile 20, 19, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 setmetatile 21, 19, METATILE_SilphCo_HideoutFloor, 0 setmetatile 20, 20, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 setmetatile 21, 20, METATILE_SilphCo_HideoutFloor, 0 setmetatile 20, 21, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 setmetatile 21, 21, METATILE_SilphCo_HideoutFloor, 0 return ================================================ FILE: data/maps/RocketHideout_B1F/text.inc ================================================ RocketHideout_B1F_Text_Grunt1Intro:: .string "Who are you?\n" .string "How did you get here?$" RocketHideout_B1F_Text_Grunt1Defeat:: .string "Oww!\n" .string "Beaten!$" RocketHideout_B1F_Text_Grunt1PostBattle:: .string "Blast it… You're dissing TEAM\n" .string "ROCKET, aren't you?$" RocketHideout_B1F_Text_Grunt2Intro:: .string "You broke into TEAM ROCKET's\n" .string "operation? What nerve!$" RocketHideout_B1F_Text_Grunt2Defeat:: .string "Boom!$" RocketHideout_B1F_Text_Grunt2PostBattle:: .string "You're not going to get away with\n" .string "this, brat!$" RocketHideout_B1F_Text_Grunt3Intro:: .string "Intruder alert!$" RocketHideout_B1F_Text_Grunt3Defeat:: .string "I can't do it!$" RocketHideout_B1F_Text_Grunt3PostBattle:: .string "SILPH SCOPE? Humph!\n" .string "I don't know where it is.$" RocketHideout_B1F_Text_Grunt4Intro:: .string "Why did you come here?$" RocketHideout_B1F_Text_Grunt4Defeat:: .string "This won't do!$" RocketHideout_B1F_Text_Grunt4PostBattle:: .string "Okay, I'll talk…\n" .string "Take the elevator to see my BOSS.$" RocketHideout_B1F_Text_Grunt5Intro:: .string "Are you lost, you little mouse?$" RocketHideout_B1F_Text_Grunt5Defeat:: .string "Why…?$" RocketHideout_B1F_Text_Grunt5PostBattle:: .string "Uh-oh, that ruckus somehow opened\n" .string "the door!$" ================================================ FILE: data/maps/RocketHideout_B2F/map.json ================================================ { "id": "MAP_ROCKET_HIDEOUT_B2F", "name": "RocketHideout_B2F", "layout": "LAYOUT_ROCKET_HIDEOUT_B2F", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_ROCKET_HIDEOUT", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": -2, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 20, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "RocketHideout_B2F_EventScript_Grunt", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 15, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B2F_EventScript_ItemXSpeed", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B2F_X_SPEED" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B2F_EventScript_ItemMoonStone", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B2F_MOON_STONE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B2F_EventScript_ItemTM12", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B2F_TM12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 0, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B2F_EventScript_ItemSuperPotion", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B2F_SUPER_POTION" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 0, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Rhydon", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 21, "y": 2, "elevation": 3, "dest_map": "MAP_ROCKET_HIDEOUT_B3F", "dest_warp_id": "0" }, { "x": 28, "y": 2, "elevation": 3, "dest_map": "MAP_ROCKET_HIDEOUT_B1F", "dest_warp_id": "1" }, { "x": 23, "y": 12, "elevation": 3, "dest_map": "MAP_ROCKET_HIDEOUT_B1F", "dest_warp_id": "2" }, { "x": 28, "y": 16, "elevation": 0, "dest_map": "MAP_ROCKET_HIDEOUT_ELEVATOR", "dest_warp_id": "1" }, { "x": 29, "y": 16, "elevation": 0, "dest_map": "MAP_ROCKET_HIDEOUT_ELEVATOR", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "2" } ================================================ FILE: data/maps/RocketHideout_B2F/scripts.inc ================================================ .set LOCALID_RHYDON_MASTER, 6 .set TRAINER, VAR_0x8009 RocketHideout_B2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RocketHideout_B2F_MapScript_SetMasterTrainerMovementTypes .byte 0 RocketHideout_B2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_RHYDON callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, RocketHideout_B2F_MapScript_RhydonMasterMovementType end RocketHideout_B2F_MapScript_RhydonMasterMovementType:: setobjectmovementtype LOCALID_RHYDON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return RocketHideout_B2F_EventScript_Grunt:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_13, RocketHideout_B2F_Text_GruntIntro, RocketHideout_B2F_Text_GruntDefeat msgbox RocketHideout_B2F_Text_GruntPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/RocketHideout_B2F/text.inc ================================================ RocketHideout_B2F_Text_GruntIntro:: .string "BOSS said you can see ghosts with\n" .string "the SILPH SCOPE.$" RocketHideout_B2F_Text_GruntDefeat:: .string "I surrender!$" RocketHideout_B2F_Text_GruntPostBattle:: .string "The TEAM ROCKET HQ has four\n" .string "underground floors.\p" .string "Think you can reach the BOSS?$" ================================================ FILE: data/maps/RocketHideout_B3F/map.json ================================================ { "id": "MAP_ROCKET_HIDEOUT_B3F", "name": "RocketHideout_B3F", "layout": "LAYOUT_ROCKET_HIDEOUT_B3F", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_ROCKET_HIDEOUT", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": -3, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 19, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "RocketHideout_B3F_EventScript_Grunt2", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 2, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "RocketHideout_B3F_EventScript_Grunt1", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B3F_EventScript_ItemRareCandy", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B3F_RARE_CANDY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 19, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B3F_EventScript_ItemTM21", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B3F_TM21" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 14, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B3F_EventScript_ItemBlackGlasses", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B3F_BLACK_GLASSES" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Weezing", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 18, "y": 2, "elevation": 3, "dest_map": "MAP_ROCKET_HIDEOUT_B2F", "dest_warp_id": "0" }, { "x": 15, "y": 18, "elevation": 3, "dest_map": "MAP_ROCKET_HIDEOUT_B4F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 1, "y": 3, "elevation": 3, "item": "ITEM_NUGGET", "flag": "FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B3F_NUGGET", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/RocketHideout_B3F/scripts.inc ================================================ .set LOCALID_WEEZING_MASTER, 6 .set TRAINER, VAR_0x8009 RocketHideout_B3F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RocketHideout_B3F_MapScript_SetMasterTrainerMovementTypes .byte 0 RocketHideout_B3F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_WEEZING callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, RocketHideout_B3F_MapScript_WeezingMasterMovementType end RocketHideout_B3F_MapScript_WeezingMasterMovementType:: setobjectmovementtype LOCALID_WEEZING_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return RocketHideout_B3F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_14, RocketHideout_B3F_Text_Grunt1Intro, RocketHideout_B3F_Text_Grunt1Defeat msgbox RocketHideout_B3F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end RocketHideout_B3F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_15, RocketHideout_B3F_Text_Grunt2Intro, RocketHideout_B3F_Text_Grunt2Defeat msgbox RocketHideout_B3F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/RocketHideout_B3F/text.inc ================================================ RocketHideout_B3F_Text_Grunt1Intro:: .string "Stop meddling in TEAM ROCKET's\n" .string "affairs or else!$" RocketHideout_B3F_Text_Grunt1Defeat:: .string "Oof!\n" .string "Taken down!$" RocketHideout_B3F_Text_Grunt1PostBattle:: .string "SILPH SCOPE?\n" .string "Oh, that machine the BOSS stole.\p" .string "It's here somewhere.$" RocketHideout_B3F_Text_Grunt2Intro:: .string "We got word from upstairs that you\n" .string "were coming!$" RocketHideout_B3F_Text_Grunt2Defeat:: .string "What?\n" .string "I lost? No!$" RocketHideout_B3F_Text_Grunt2PostBattle:: .string "Go ahead and go!\p" .string "But you can't run the elevator\n" .string "without the LIFT KEY.$" ================================================ FILE: data/maps/RocketHideout_B4F/map.json ================================================ { "id": "MAP_ROCKET_HIDEOUT_B4F", "name": "RocketHideout_B4F", "layout": "LAYOUT_ROCKET_HIDEOUT_B4F", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_ROCKET_HIDEOUT", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": -4, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GIOVANNI", "in_connection": false, "x": 19, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B4F_EventScript_Giovanni", "flag": "FLAG_HIDE_HIDEOUT_GIOVANNI" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 20, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B4F_EventScript_SilphScope", "flag": "FLAG_HIDE_SILPH_SCOPE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "RocketHideout_B4F_EventScript_Grunt1", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 3, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B4F_EventScript_LiftKey", "flag": "FLAG_HIDE_LIFT_KEY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 19, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B4F_EventScript_Grunt3", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 16, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B4F_EventScript_Grunt2", "flag": "FLAG_HIDE_MISC_KANTO_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 1, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B4F_EventScript_ItemTM49", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B4F_TM49" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 4, "y": 14, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B4F_EventScript_ItemMaxEther", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B4F_MAX_ETHER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 6, "y": 23, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "RocketHideout_B4F_EventScript_ItemCalcium", "flag": "FLAG_HIDE_ROCKET_HIDEOUT_B4F_CALCIUM" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_YOUNGSTER", "in_connection": false, "x": 8, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Persian", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 11, "y": 15, "elevation": 3, "dest_map": "MAP_ROCKET_HIDEOUT_B3F", "dest_warp_id": "1" }, { "x": 20, "y": 23, "elevation": 0, "dest_map": "MAP_ROCKET_HIDEOUT_ELEVATOR", "dest_warp_id": "1" }, { "x": 21, "y": 23, "elevation": 0, "dest_map": "MAP_ROCKET_HIDEOUT_ELEVATOR", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 22, "y": 6, "elevation": 3, "item": "ITEM_NEST_BALL", "flag": "FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B4F_NEST_BALL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 16, "y": 6, "elevation": 3, "item": "ITEM_NET_BALL", "flag": "FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B4F_NET_BALL", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/RocketHideout_B4F/scripts.inc ================================================ .equ LOCALID_GIOVANNI, 1 .equ LOCALID_SILPH_SCOPE, 2 .equ LOCALID_LIFT_KEY, 4 .set LOCALID_PERSIAN_MASTER, 10 .set TRAINER, VAR_0x8009 .equ NUM_DOOR_GRUNTS_DEFEATED, VAR_TEMP_1 RocketHideout_B4F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, RocketHideout_B4F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, RocketHideout_B4F_MapScript_SetMasterTrainerMovementTypes .byte 0 RocketHideout_B4F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PERSIAN callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, RocketHideout_B4F_MapScript_PersianMasterMovementType end RocketHideout_B4F_MapScript_PersianMasterMovementType:: setobjectmovementtype LOCALID_PERSIAN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return RocketHideout_B4F_OnLoad:: setvar NUM_DOOR_GRUNTS_DEFEATED, 0 call_if_defeated TRAINER_TEAM_ROCKET_GRUNT_16, RocketHideout_B4F_EventScript_CountGruntDefeated call_if_defeated TRAINER_TEAM_ROCKET_GRUNT_17, RocketHideout_B4F_EventScript_CountGruntDefeated call_if_ne NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_SetBarrier end RocketHideout_B4F_EventScript_CountGruntDefeated:: addvar NUM_DOOR_GRUNTS_DEFEATED, 1 return RocketHideout_B4F_EventScript_Giovanni:: lock faceplayer famechecker FAMECHECKER_GIOVANNI, 0 message RocketHideout_B4F_Text_GiovanniIntro waitmessage playbgm MUS_ENCOUNTER_ROCKET, 0 waitbuttonpress trainerbattle_no_intro TRAINER_BOSS_GIOVANNI, RocketHideout_B4F_Text_GiovanniDefeat msgbox RocketHideout_B4F_Text_GiovanniPostBattle fadescreen FADE_TO_BLACK closemessage removeobject LOCALID_GIOVANNI addobject LOCALID_SILPH_SCOPE clearflag FLAG_HIDE_SILPH_SCOPE setflag FLAG_HIDE_CELADON_ROCKETS famechecker FAMECHECKER_GIOVANNI, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 fadescreen FADE_FROM_BLACK release end RocketHideout_B4F_EventScript_SilphScope:: lock faceplayer removeobject LOCALID_SILPH_SCOPE giveitem ITEM_SILPH_SCOPE goto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull release end RocketHideout_B4F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_18, RocketHideout_B4F_Text_Grunt1Intro, RocketHideout_B4F_Text_Grunt1Defeat, RocketHideout_B4F_EventScript_DefeatedGrunt1 msgbox RocketHideout_B4F_Text_Grunt1PostBattle release end RocketHideout_B4F_EventScript_DefeatedGrunt1:: msgbox RocketHideout_B4F_Text_Grunt1PostBattle addobject LOCALID_LIFT_KEY clearflag FLAG_HIDE_LIFT_KEY release end RocketHideout_B4F_EventScript_LiftKey:: lock faceplayer setflag FLAG_CAN_USE_ROCKET_HIDEOUT_LIFT removeobject LOCALID_LIFT_KEY giveitem ITEM_LIFT_KEY goto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull release end RocketHideout_B4F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_16, RocketHideout_B4F_Text_Grunt2Intro, RocketHideout_B4F_Text_Grunt2Defeat, RocketHideout_B4F_EventScript_DefeatedGrunt2 msgbox RocketHideout_B4F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end RocketHideout_B4F_EventScript_DefeatedGrunt2:: setvar NUM_DOOR_GRUNTS_DEFEATED, 0 call_if_defeated TRAINER_TEAM_ROCKET_GRUNT_16, RocketHideout_B4F_EventScript_CountGruntDefeated call_if_defeated TRAINER_TEAM_ROCKET_GRUNT_17, RocketHideout_B4F_EventScript_CountGruntDefeated call_if_eq NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_RemoveBarrier call_if_eq NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_DrawMapForBarrierRemoval release end RocketHideout_B4F_EventScript_Grunt3:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_17, RocketHideout_B4F_Text_Grunt3Intro, RocketHideout_B4F_Text_Grunt3Defeat, RocketHideout_B4F_EventScript_DefeatedGrunt3 msgbox RocketHideout_B4F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE end RocketHideout_B4F_EventScript_DefeatedGrunt3:: setvar NUM_DOOR_GRUNTS_DEFEATED, 0 call_if_defeated TRAINER_TEAM_ROCKET_GRUNT_16, RocketHideout_B4F_EventScript_CountGruntDefeated call_if_defeated TRAINER_TEAM_ROCKET_GRUNT_17, RocketHideout_B4F_EventScript_CountGruntDefeated call_if_eq NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_RemoveBarrier call_if_eq NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_DrawMapForBarrierRemoval release end RocketHideout_B4F_EventScript_DrawMapForBarrierRemoval:: playse SE_UNLOCK special DrawWholeMapView waitse return RocketHideout_B4F_EventScript_SetBarrier:: setmetatile 17, 12, METATILE_SilphCo_HideoutBarrier_TopLeft_Floor, 1 setmetatile 18, 12, METATILE_SilphCo_HideoutBarrier_TopRight_Floor, 1 setmetatile 17, 13, METATILE_SilphCo_HideoutBarrier_BottomLeft, 1 setmetatile 18, 13, METATILE_SilphCo_HideoutBarrier_BottomRight, 1 setmetatile 17, 14, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 setmetatile 18, 14, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 return RocketHideout_B4F_EventScript_RemoveBarrier:: setmetatile 17, 12, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 setmetatile 18, 12, METATILE_SilphCo_HideoutFloor, 0 setmetatile 17, 13, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 setmetatile 18, 13, METATILE_SilphCo_HideoutFloor, 0 setmetatile 17, 14, METATILE_SilphCo_HideoutFloor_ShadeFull, 0 setmetatile 18, 14, METATILE_SilphCo_HideoutFloor, 0 return ================================================ FILE: data/maps/RocketHideout_B4F/text.inc ================================================ RocketHideout_B4F_Text_GiovanniIntro:: .string "So! I must say, I am impressed you\n" .string "got here.\p" .string "TEAM ROCKET captures POKéMON from\n" .string "around the world.\p" .string "They're important tools for keeping\n" .string "our criminal enterprise going.\p" .string "I am the leader, GIOVANNI!\p" .string "For your insolence, you will feel a\n" .string "world of pain!$" RocketHideout_B4F_Text_GiovanniDefeat:: .string "WHAT!\n" .string "This can't be!$" RocketHideout_B4F_Text_GiovanniPostBattle:: .string "I see that you raise POKéMON with\n" .string "utmost care.\p" .string "A child like you would never\n" .string "understand what I hope to achieve.\p" .string "I shall step aside this time!\p" .string "I hope we meet again…$" RocketHideout_B4F_Text_Grunt2Intro:: .string "I know you!\n" .string "You ruined our plans at MT. MOON!$" RocketHideout_B4F_Text_Grunt2Defeat:: .string "Burned again!$" RocketHideout_B4F_Text_Grunt2PostBattle:: .string "Do you have something against TEAM\n" .string "ROCKET?$" RocketHideout_B4F_Text_Grunt3Intro:: .string "How can you not see the beauty of\n" .string "our evil?$" RocketHideout_B4F_Text_Grunt3Defeat:: .string "Ayaya!$" RocketHideout_B4F_Text_Grunt3PostBattle:: .string "BOSS!\n" .string "I'm sorry I failed you!$" RocketHideout_B4F_Text_Grunt1Intro:: .string "The elevator doesn't work?\n" .string "Who has the LIFT KEY?$" RocketHideout_B4F_Text_Grunt1Defeat:: .string "No!$" RocketHideout_B4F_Text_Grunt1PostBattle:: .string "Oh, no!\n" .string "I dropped the LIFT KEY!$" ================================================ FILE: data/maps/RocketHideout_Elevator/map.json ================================================ { "id": "MAP_ROCKET_HIDEOUT_ELEVATOR", "name": "RocketHideout_Elevator", "layout": "LAYOUT_ROCKET_HIDEOUT_ELEVATOR", "music": "MUS_ROCKET_HIDEOUT", "region_map_section": "MAPSEC_ROCKET_HIDEOUT", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_2", "connections": null, "object_events": [], "warp_events": [ { "x": 1, "y": 5, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 0, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "RocketHideout_Elevator_EventScript_FloorSelect" } ], "level_scaling": "0" } ================================================ FILE: data/maps/RocketHideout_Elevator/scripts.inc ================================================ RocketHideout_Elevator_MapScripts:: .byte 0 RocketHideout_Elevator_EventScript_FloorSelect:: lockall goto_if_unset FLAG_CAN_USE_ROCKET_HIDEOUT_LIFT, RocketHideout_Elevator_EventScript_NeedKey setvar VAR_0x8004, 2 call_if_unset FLAG_TEMP_2, EventScript_GetElevatorFloor copyvar VAR_0x8005, VAR_ELEVATOR_FLOOR special DrawElevatorCurrentFloorWindow message Text_WantWhichFloor waitmessage setvar VAR_0x8004, 2 specialvar VAR_RESULT, InitElevatorFloorSelectMenuPos switch VAR_RESULT case 0, RocketHideout_Elevator_EventScript_FloorSelectFromB1F case 1, RocketHideout_Elevator_EventScript_FloorSelectFromB2F case 2, RocketHideout_Elevator_EventScript_FloorSelectFromB4F end RocketHideout_Elevator_EventScript_FloorSelectFromB1F:: multichoicedefault 0, 0, MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR, 0, FALSE goto RocketHideout_Elevator_EventScript_ChooseFloor end RocketHideout_Elevator_EventScript_FloorSelectFromB2F:: multichoicedefault 0, 0, MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR, 1, FALSE goto RocketHideout_Elevator_EventScript_ChooseFloor end RocketHideout_Elevator_EventScript_FloorSelectFromB4F:: multichoicedefault 0, 0, MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR, 2, FALSE goto RocketHideout_Elevator_EventScript_ChooseFloor end RocketHideout_Elevator_EventScript_ChooseFloor:: switch VAR_RESULT case 0, RocketHideout_Elevator_EventScript_ToB1F case 1, RocketHideout_Elevator_EventScript_ToB2F case 2, RocketHideout_Elevator_EventScript_ToB4F case 3, RocketHideout_Elevator_EventScript_ExitFloorSelect case 127, RocketHideout_Elevator_EventScript_ExitFloorSelect end RocketHideout_Elevator_EventScript_ToB1F:: setvar VAR_0x8006, 3 setdynamicwarp MAP_ROCKET_HIDEOUT_B1F, 255, 24, 25 goto_if_eq VAR_ELEVATOR_FLOOR, 3, RocketHideout_Elevator_EventScript_ExitFloorSelect call RocketHideout_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 3 goto RocketHideout_Elevator_EventScript_ExitFloorSelect end RocketHideout_Elevator_EventScript_ToB2F:: setvar VAR_0x8006, 2 setdynamicwarp MAP_ROCKET_HIDEOUT_B2F, 255, 28, 16 goto_if_eq VAR_ELEVATOR_FLOOR, 2, RocketHideout_Elevator_EventScript_ExitFloorSelect call RocketHideout_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 2 goto RocketHideout_Elevator_EventScript_ExitFloorSelect end RocketHideout_Elevator_EventScript_ToB4F:: setvar VAR_0x8006, 0 setdynamicwarp MAP_ROCKET_HIDEOUT_B4F, 255, 20, 23 goto_if_eq VAR_ELEVATOR_FLOOR, 0, RocketHideout_Elevator_EventScript_ExitFloorSelect call RocketHideout_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 0 goto RocketHideout_Elevator_EventScript_ExitFloorSelect end RocketHideout_Elevator_EventScript_ExitFloorSelect:: special CloseElevatorCurrentFloorWindow releaseall end RocketHideout_Elevator_EventScript_MoveElevator:: special CloseElevatorCurrentFloorWindow closemessage waitse special AnimateElevator waitstate setflag FLAG_TEMP_2 return RocketHideout_Elevator_EventScript_NeedKey:: msgbox RocketHideout_Elevator_Text_AppearsToNeedAKey releaseall end ================================================ FILE: data/maps/RocketHideout_Elevator/text.inc ================================================ RocketHideout_Elevator_Text_AppearsToNeedAKey:: .string "It appears to need a key.$" ================================================ FILE: data/maps/Route1/map.json ================================================ { "id": "MAP_ROUTE1", "name": "Route1", "layout": "LAYOUT_ROUTE1", "music": "MUS_ROUTE1", "region_map_section": "MAPSEC_ROUTE_1", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": -12, "map": "MAP_VIRIDIAN_CITY" }, { "direction": "down", "offset": 0, "map": "MAP_PALLET_TOWN" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 6, "y": 28, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route1_EventScript_MartClerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 19, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route1_EventScript_Boy", "flag": "0" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 9, "y": 31, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route1_EventScript_RouteSign" } ], "level_scaling": "1" } ================================================ FILE: data/maps/Route1/scripts.inc ================================================ Route1_MapScripts:: .byte 0 Route1_EventScript_MartClerk:: lock faceplayer goto_if_set FLAG_GOT_POTION_ON_ROUTE_1, Route1_EventScript_AlreadyGotPotion msgbox Route1_Text_WorkAtPokeMartTakeSample textcolor NPC_TEXT_COLOR_NEUTRAL checkitemspace ITEM_POTION goto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull bufferitemname STR_VAR_2, ITEM_POTION playfanfare MUS_LEVEL_UP message Text_ObtainedTheX waitmessage waitfanfare additem ITEM_POTION msgbox Route1_Text_PutPotionAway call EventScript_RestorePrevTextColor setflag FLAG_GOT_POTION_ON_ROUTE_1 release end Route1_EventScript_AlreadyGotPotion:: msgbox Route1_Text_ComeSeeUsIfYouNeedPokeBalls release end Route1_EventScript_Boy:: msgbox Route1_Text_CanJumpFromLedges, MSGBOX_NPC end Route1_EventScript_RouteSign:: msgbox Route1_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route1/text.inc ================================================ Route1_Text_WorkAtPokeMartTakeSample:: .string "Hi!\n" .string "I work at a POKéMON MART.\p" .string "It's part of a convenient chain\n" .string "selling all sorts of items.\p" .string "Please, visit us in VIRIDIAN CITY.\p" .string "I know, I'll give you a sample.\n" .string "Here you go!$" Route1_Text_ComeSeeUsIfYouNeedPokeBalls:: .string "Please come see us if you need\n" .string "POKé BALLS for catching POKéMON.$" Route1_Text_PutPotionAway:: .string "{PLAYER} put the POTION away in\n" .string "the BAG's MEDICINE POCKET.$" Route1_Text_CanJumpFromLedges:: .string "See those ledges along the road?\p" .string "It's a bit scary, but you can jump\n" .string "from them.\p" .string "You can get back to PALLET TOWN\n" .string "quicker that way.$" Route1_Text_RouteSign:: .string "ROUTE 1\n" .string "PALLET TOWN - VIRIDIAN CITY$" ================================================ FILE: data/maps/Route10/map.json ================================================ { "id": "MAP_ROUTE10", "name": "Route10", "layout": "LAYOUT_ROUTE10", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_10", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": 0, "map": "MAP_LAVENDER_TOWN" }, { "direction": "left", "offset": 0, "map": "MAP_ROUTE9" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 7, "y": 60, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route10_EventScript_Carol", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 4, "y": 62, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route10_EventScript_Clark", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKE_MANIAC", "x": 15, "y": 70, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route10_EventScript_Herman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 4, "y": 68, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route10_EventScript_Trent", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKE_MANIAC", "x": 13, "y": 44, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route10_EventScript_Mark", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 9, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route10_EventScript_Heidi", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 10, "y": 20, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_10_CUT_TREE_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 10, "y": 22, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_10_CUT_TREE_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 10, "y": 24, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_10_CUT_TREE_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 10, "y": 26, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_10_CUT_TREE_4" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_YOUNGSTER", "in_connection": false, "x": 17, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Rattata", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 2, "y": 42, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Electabuzz", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 2, "y": 70, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Charmeleon", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 10, "y": 62, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Alakazam", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 5, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route10_EventScript_SwaggerTutor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 19, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_1F", "dest_warp_id": "0" }, { "x": 8, "y": 57, "elevation": 3, "dest_map": "MAP_ROCK_TUNNEL_1F", "dest_warp_id": "5" }, { "x": 7, "y": 40, "elevation": 3, "dest_map": "MAP_POWER_PLANT", "dest_warp_id": "1" }, { "x": 13, "y": 20, "elevation": 0, "dest_map": "MAP_ROUTE10_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 2, "y": 37, "elevation": 3, "dest_map": "MAP_POWER_PLANT", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 15, "y": 59, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route10_EventScript_SouthRockTunnelSign" }, { "type": "sign", "x": 6, "y": 42, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route10_EventScript_PowerPlantSign" }, { "type": "sign", "x": 7, "y": 21, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route10_EventScript_NorthRockTunnelSign" }, { "type": "hidden_item", "x": 10, "y": 19, "elevation": 0, "item": "ITEM_SUPER_POTION", "flag": "FLAG_HIDDEN_ITEM_ROUTE10_SUPER_POTION", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 12, "y": 40, "elevation": 3, "item": "ITEM_MAX_ETHER", "flag": "FLAG_HIDDEN_ITEM_ROUTE10_MAX_ETHER", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 6, "y": 26, "elevation": 3, "item": "ITEM_CHERI_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE10_CHERI_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 17, "y": 29, "elevation": 3, "item": "ITEM_PERSIM_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE10_PERSIM_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 20, "y": 57, "elevation": 3, "item": "ITEM_KELPSY_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE10_KELPSY_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/Route10/scripts.inc ================================================ .set LOCALID_RATTATA_MASTER, 11 .set LOCALID_ELECTABUZZ_MASTER, 12 .set LOCALID_CHARMELEON_MASTER, 13 .set LOCALID_ALAKAZAM_MASTER, 14 .set TRAINER, VAR_0x8009 Route10_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route10_MapScript_SetMasterTrainerMovementTypes .byte 0 Route10_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_RATTATA callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route10_MapScript_RattataMasterMovementType setvar TRAINER, MASTER_ELECTABUZZ callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route10_MapScript_ElectabuzzMasterMovementType setvar TRAINER, MASTER_CHARMELEON callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route10_MapScript_CharmeleonMasterMovementType setvar TRAINER, MASTER_ALAKAZAM callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route10_MapScript_AlakazamMasterMovementType end Route10_MapScript_RattataMasterMovementType:: setobjectmovementtype LOCALID_RATTATA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route10_MapScript_ElectabuzzMasterMovementType:: setobjectmovementtype LOCALID_ELECTABUZZ_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route10_MapScript_CharmeleonMasterMovementType:: setobjectmovementtype LOCALID_CHARMELEON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route10_MapScript_AlakazamMasterMovementType:: setobjectmovementtype LOCALID_ALAKAZAM_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route10_EventScript_NorthRockTunnelSign:: msgbox Route10_Text_RockTunnelDetourToLavender, MSGBOX_SIGN end Route10_EventScript_SouthRockTunnelSign:: msgbox Route10_Text_RockTunnel, MSGBOX_SIGN end Route10_EventScript_PowerPlantSign:: msgbox Route10_Text_PowerPlant, MSGBOX_SIGN end ================================================ FILE: data/maps/Route10/text.inc ================================================ Route10_Text_MarkIntro:: .string "Wow, you came all the way here?\n" .string "Maybe you're a POKéMANIAC, too?\l" .string "Want to see my collection?$" Route10_Text_MarkDefeat:: .string "Humph.\n" .string "I'm not angry!$" Route10_Text_MarkPostBattle:: .string "I have more rare POKéMON at home!$" Route10_Text_ClarkIntro:: .string "Ha-hahah-ah-ha!$" Route10_Text_ClarkDefeat:: .string "Ha-haha!\n" .string "Not laughing!\l" .string "Ha-hay fever! Haha-ha-choo!$" Route10_Text_ClarkPostBattle:: .string "Haha-ha-choo!\n" .string "Ha-choo!\l" .string "Snort! Snivel!$" Route10_Text_HermanIntro:: .string "Hi, kid!\n" .string "Want to see my POKéMON?$" Route10_Text_HermanDefeat:: .string "Oh, no!\n" .string "My POKéMON!$" Route10_Text_HermanPostBattle:: .string "I don't like you.\n" .string "I don't like anyone better than me!$" Route10_Text_HeidiIntro:: .string "I've been out at a POKéMON GYM\n" .string "a few times.\p" .string "…But I always lose.$" Route10_Text_HeidiDefeat:: .string "Ohh!\n" .string "After all my training!$" Route10_Text_HeidiPostBattle:: .string "I noticed some POKéMANIACS\n" .string "prowling around.\p" .string "Can you imagine? Them?\n" .string "Up here in the mountains?$" Route10_Text_TrentIntro:: .string "Ah!\n" .string "This mountain air is delicious!$" Route10_Text_TrentDefeat:: .string "That cleared my head!$" Route10_Text_TrentPostBattle:: .string "I feel bloated on mountain air!$" Route10_Text_CarolIntro:: .string "I'm feeling a bit faint.\n" .string "I haven't hiked in some time.$" Route10_Text_CarolDefeat:: .string "I'm too tired.\n" .string "I wasn't up for it.$" Route10_Text_CarolPostBattle:: .string "The POKéMON here in the mountains\n" .string "are so chunky…\p" .string "I wish there were pink POKéMON\n" .string "with a floral pattern!$" Route10_Text_RockTunnelDetourToLavender:: .string "ROCK TUNNEL\n" .string "Detour to LAVENDER TOWN$" Route10_Text_RockTunnel:: .string "ROCK TUNNEL$" Route10_Text_PowerPlant:: .string "POWER PLANT$" ================================================ FILE: data/maps/Route10_PokemonCenter_1F/map.json ================================================ { "id": "MAP_ROUTE10_POKEMON_CENTER_1F", "name": "Route10_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_ROUTE_10", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route10_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 9, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route10_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 2, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route10_PokemonCenter_1F_EventScript_FatMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route10_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route10_PokemonCenter_1F_EventScript_Aide", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "3" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "3" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE10", "dest_warp_id": "3" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_ROUTE10_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Route10_PokemonCenter_1F/scripts.inc ================================================ .equ REQUIRED_OWNED_MONS, 20 Route10_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route10_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 Route10_PokemonCenter_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_ROUTE10_POKEMON_CENTER_1F setrespawn SPAWN_ROUTE10 end Route10_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end Route10_PokemonCenter_1F_EventScript_FatMan:: msgbox Route10_PokemonCenter_1F_Text_NuggetUselessSoldFor5000, MSGBOX_NPC end Route10_PokemonCenter_1F_EventScript_Gentleman:: msgbox Route10_PokemonCenter_1F_Text_EveryTypeStrongerThanOthers, MSGBOX_NPC end Route10_PokemonCenter_1F_EventScript_Youngster:: msgbox Route10_PokemonCenter_1F_Text_HeardGhostsHauntLavender, MSGBOX_NPC end Route10_PokemonCenter_1F_EventScript_Aide:: lock faceplayer call Route10_PokemonCenter_1F_EventScript_GetAideRequestInfo goto_if_set FLAG_GOT_EVERSTONE_FROM_OAKS_AIDE, Route10_PokemonCenter_1F_EventScript_AlreadyGotEverstone msgbox Route10_PokemonCenter_1F_Text_GiveEverstoneIfCaught20Mons, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons setvar VAR_0x8004, 0 specialvar VAR_RESULT, GetPokedexCount buffernumberstring STR_VAR_3, VAR_0x8006 call Route10_PokemonCenter_1F_EventScript_GetAideRequestInfo goto_if_lt VAR_0x8006, REQUIRED_OWNED_MONS, Aide_EventScript_HaventCaughtEnough msgbox Route10_PokemonCenter_1F_Text_GreatHereYouGo checkitemspace ITEM_EVERSTONE goto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem giveitem_msg Route10_PokemonCenter_1F_Text_ReceivedEverstoneFromAide, ITEM_EVERSTONE setflag FLAG_GOT_EVERSTONE_FROM_OAKS_AIDE msgbox Route10_PokemonCenter_1F_Text_ExplainEverstone release end Route10_PokemonCenter_1F_EventScript_AlreadyGotEverstone:: msgbox Route10_PokemonCenter_1F_Text_ExplainEverstone release end Route10_PokemonCenter_1F_EventScript_GetAideRequestInfo:: buffernumberstring STR_VAR_1, REQUIRED_OWNED_MONS bufferitemname STR_VAR_2, ITEM_EVERSTONE return ================================================ FILE: data/maps/Route10_PokemonCenter_1F/text.inc ================================================ Route10_PokemonCenter_1F_Text_EveryTypeStrongerThanOthers:: .string "The types of POKéMON match up\n" .string "differently with each other.\p" .string "Every type is stronger than some\n" .string "types and weaker than others.$" Route10_PokemonCenter_1F_Text_NuggetUselessSoldFor5000:: .string "A NUGGET is totally useless.\n" .string "So I sold it for ¥5000.$" Route10_PokemonCenter_1F_Text_HeardGhostsHauntLavender:: .string "I heard that ghosts haunt\n" .string "LAVENDER TOWN.$" Route10_PokemonCenter_1F_Text_GiveEverstoneIfCaught20Mons:: .string "Oh… {PLAYER}!\n" .string "I've been looking for you!\p" .string "It's me, one of the ever-present\n" .string "AIDES to PROF. OAK.\p" .string "If your POKéDEX has complete data\n" .string "on twenty species, I'm supposed to\l" .string "give you a reward from PROF. OAK.\p" .string "He entrusted me with this\n" .string "EVERSTONE.\p" .string "So, {PLAYER}, let me ask you.\p" .string "Have you gathered data on at least\n" .string "twenty kinds of POKéMON?$" Route10_PokemonCenter_1F_Text_GreatHereYouGo:: .string "Great! You have caught or owned\n" .string "{STR_VAR_3} kinds of POKéMON!\p" .string "Congratulations!\n" .string "Here you go!$" Route10_PokemonCenter_1F_Text_ReceivedEverstoneFromAide:: .string "{PLAYER} received the EVERSTONE\n" .string "from the AIDE.$" Route10_PokemonCenter_1F_Text_ExplainEverstone:: .string "Making POKéMON evolve certainly\n" .string "can add to the POKéDEX.\p" .string "However, at times, you may not\n" .string "want a certain POKéMON to evolve.\p" .string "In that case, give the EVERSTONE\n" .string "to that POKéMON.\p" .string "It will prevent evolution according\n" .string "to the PROFESSOR.$" ================================================ FILE: data/maps/Route10_PokemonCenter_2F/map.json ================================================ { "id": "MAP_ROUTE10_POKEMON_CENTER_2F", "name": "Route10_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_ROUTE_10", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_ROUTE10_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route10_PokemonCenter_2F/scripts.inc ================================================ Route10_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS Route10_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end Route10_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end Route10_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/Route11/map.json ================================================ { "id": "MAP_ROUTE11", "name": "Route11", "layout": "LAYOUT_ROUTE11", "music": "MUS_ROUTE11", "region_map_section": "MAPSEC_ROUTE_11", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": -10, "map": "MAP_VERMILION_CITY" }, { "direction": "right", "offset": -59, "map": "MAP_ROUTE12" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 19, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route11_EventScript_Eddie", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 16, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route11_EventScript_Hugo", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 31, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route11_EventScript_Dillon", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 28, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP", "movement_range_x": 8, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route11_EventScript_Dave", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 38, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route11_EventScript_Jasper", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 50, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route11_EventScript_Darian", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ENGINEER", "x": 42, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route11_EventScript_Braxton", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 50, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route11_EventScript_Yasu", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 57, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route11_EventScript_Dirk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ENGINEER", "x": 32, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "6", "script": "Route11_EventScript_Bernie", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 42, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route11_EventScript_ItemXDefend", "flag": "FLAG_HIDE_ROUTE11_X_DEFEND" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 63, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route11_EventScript_ItemGreatBall", "flag": "FLAG_HIDE_ROUTE11_GREAT_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 13, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route11_EventScript_ItemAwakening", "flag": "FLAG_HIDE_ROUTE11_AWAKENING" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 59, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Metapod", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 12, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Sandshrew", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 7, "elevation": 0, "dest_map": "MAP_DIGLETTS_CAVE_SOUTH_ENTRANCE", "dest_warp_id": "0" }, { "x": 58, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE11_EAST_ENTRANCE_1F", "dest_warp_id": "0" }, { "x": 65, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE11_EAST_ENTRANCE_1F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 3, "y": 7, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route11_EventScript_DiglettsCaveSign" }, { "type": "hidden_item", "x": 58, "y": 5, "elevation": 0, "item": "ITEM_ESCAPE_ROPE", "flag": "FLAG_HIDDEN_ITEM_ROUTE11_ESCAPE_ROPE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 58, "y": 3, "elevation": 3, "item": "ITEM_TAMATO_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE11_TAMATO_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/Route11/scripts.inc ================================================ .set LOCALID_SANDSHREW_MASTER, 15 .set LOCALID_METAPOD_MASTER, 14 .set TRAINER, VAR_0x8009 Route11_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route11_MapScript_SetMasterTrainerMovementTypes .byte 0 Route11_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_SANDSHREW callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route11_MapScript_SandshrewMasterMovementType setvar TRAINER, MASTER_METAPOD callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route11_MapScript_MetapodMasterMovementType end Route11_MapScript_SandshrewMasterMovementType:: setobjectmovementtype LOCALID_SANDSHREW_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route11_MapScript_MetapodMasterMovementType:: setobjectmovementtype LOCALID_METAPOD_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route11_EventScript_DiglettsCaveSign:: msgbox Route11_Text_DiglettsCave, MSGBOX_SIGN end ================================================ FILE: data/maps/Route11/text.inc ================================================ Route11_Text_HugoIntro:: .string "Win, lose, or draw!$" Route11_Text_HugoDefeat:: .string "Atcha!\n" .string "Didn't go my way!$" Route11_Text_HugoPostBattle:: .string "POKéMON is life!\n" .string "And to live is to gamble!$" Route11_Text_JasperIntro:: .string "Competition!\n" .string "I can't get enough!$" Route11_Text_JasperDefeat:: .string "I had a chance!$" Route11_Text_JasperPostBattle:: .string "You can't be a coward in the world\n" .string "of POKéMON!$" Route11_Text_EddieIntro:: .string "Let's go, but don't cheat!$" Route11_Text_EddieDefeat:: .string "Huh?\n" .string "That's not right!$" Route11_Text_EddiePostBattle:: .string "I did my best.\n" .string "I have no regrets.$" Route11_Text_BraxtonIntro:: .string "Careful!\n" .string "I'm laying down some cables!$" Route11_Text_BraxtonDefeat:: .string "That was electric!$" Route11_Text_BraxtonPostBattle:: .string "Spread the word to save energy!$" Route11_Text_DillonIntro:: .string "I just became a TRAINER.\n" .string "But, I think I can win.$" Route11_Text_DillonDefeat:: .string "My POKéMON couldn't win…\n" .string "Haven't they grown enough?$" Route11_Text_DillonPostBattle:: .string "What now?\n" .string "Leave me alone!$" Route11_Text_DirkIntro:: .string "Fwahaha!\n" .string "I have never lost!$" Route11_Text_DirkDefeat:: .string "My first loss!$" Route11_Text_DirkPostBattle:: .string "Luck of the draw!\n" .string "Just luck!$" Route11_Text_DarianIntro:: .string "I have never won before…$" Route11_Text_DarianDefeat:: .string "I saw this coming…$" Route11_Text_DarianPostBattle:: .string "It's just luck.\n" .string "Luck of the draw.$" Route11_Text_YasuIntro:: .string "I'm the best in my class.\n" .string "I train every morning.$" Route11_Text_YasuDefeat:: .string "Darn!\n" .string "My POKéMON need to be stronger!$" Route11_Text_YasuPostBattle:: .string "There's a fat POKéMON that comes\n" .string "down from the mountains.\p" .string "I bet it'd be strong if you can\n" .string "catch it.$" Route11_Text_BernieIntro:: .string "Watch out for live wires!$" Route11_Text_BernieDefeat:: .string "Whoa!\n" .string "You spark plug!$" Route11_Text_BerniePostBattle:: .string "Well, better get back to work.$" Route11_Text_DaveIntro:: .string "I raised my POKéMON carefully.\n" .string "They should be ready by now!$" Route11_Text_DaveDefeat:: .string "Bye-bye!\n" .string "Thank you, and good-bye!$" Route11_Text_DavePostBattle:: .string "Tch…\n" .string "I better go find stronger ones!$" Route11_Text_DiglettsCave:: .string "DIGLETT'S CAVE$" ================================================ FILE: data/maps/Route11_EastEntrance_1F/map.json ================================================ { "id": "MAP_ROUTE11_EAST_ENTRANCE_1F", "name": "Route11_EastEntrance_1F", "layout": "LAYOUT_ENTRANCE_1F", "music": "MUS_VERMILLION", "region_map_section": "MAPSEC_ROUTE_11", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route11_EastEntrance_1F_EventScript_TopGuard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "x": 4, "y": 10, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route11_EastEntrance_1F_EventScript_BottomGuard", "flag": "0" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE11", "dest_warp_id": "1" }, { "x": 1, "y": 7, "elevation": 3, "dest_map": "MAP_ROUTE11", "dest_warp_id": "1" }, { "x": 11, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE11", "dest_warp_id": "2" }, { "x": 11, "y": 7, "elevation": 3, "dest_map": "MAP_ROUTE11", "dest_warp_id": "2" }, { "x": 9, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE11_EAST_ENTRANCE_2F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route11_EastEntrance_1F/scripts.inc ================================================ Route11_EastEntrance_1F_MapScripts:: .byte 0 Route11_EastEntrance_1F_EventScript_TopGuard:: msgbox Route11_EastEntrance_1F_Text_ManInLavenderRatesNames, MSGBOX_NPC end Route11_EastEntrance_1F_EventScript_BottomGuard:: msgbox Route11_EastEntrance_1F_Text_RockTunnelToReachLavender, MSGBOX_NPC end ================================================ FILE: data/maps/Route11_EastEntrance_1F/text.inc ================================================ Route11_EastEntrance_1F_Text_ManInLavenderRatesNames:: .string "Don't you think it's hard to think\n" .string "up good names for POKéMON?\p" .string "Especially if you've caught a\n" .string "whole bunch?\p" .string "In LAVENDER TOWN, there's a man\n" .string "who rates POKéMON nicknames.\p" .string "He can even help you rename your\n" .string "POKéMON, too.$" Route11_EastEntrance_1F_Text_RockTunnelToReachLavender:: .string "If you're aiming to reach LAVENDER\n" .string "TOWN, take ROCK TUNNEL.\p" .string "You can get to ROCK TUNNEL from\n" .string "CERULEAN CITY.$" ================================================ FILE: data/maps/Route11_EastEntrance_2F/map.json ================================================ { "id": "MAP_ROUTE11_EAST_ENTRANCE_2F", "name": "Route11_EastEntrance_2F", "layout": "LAYOUT_ENTRANCE_2F", "music": "MUS_VERMILLION", "region_map_section": "MAPSEC_ROUTE_11", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 7, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route11_EastEntrance_2F_EventScript_Turner", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 2, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route11_EastEntrance_2F_EventScript_Aide", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BLACK_BELT", "in_connection": false, "x": 3, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Primeape", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 10, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE11_EAST_ENTRANCE_1F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route11_EastEntrance_2F_EventScript_LeftBinoculars" }, { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route11_EastEntrance_2F_EventScript_RightBinoculars" } ], "level_scaling": "0" } ================================================ FILE: data/maps/Route11_EastEntrance_2F/scripts.inc ================================================ .equ REQUIRED_CAUGHT_MONS, 30 .set LOCALID_PRIMEAPE_MASTER, 3 .set TRAINER, VAR_0x8009 Route11_EastEntrance_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route11_EastEntrance_2F_MapScript_SetMasterTrainerMovementTypes .byte 0 Route11_EastEntrance_2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PRIMEAPE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route11_EastEntrance_2F_MapScript_PrimeapeMasterMovementType end Route11_EastEntrance_2F_MapScript_PrimeapeMasterMovementType:: setobjectmovementtype LOCALID_PRIMEAPE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route11_EastEntrance_2F_EventScript_LeftBinoculars:: lockall goto_if_set FLAG_WOKE_UP_ROUTE_12_SNORLAX, Route11_EastEntrance_2F_EventScript_LeftBinocularsSnorlaxGone Route11_EastEntrance_2F_EventScript_SnorlaxPresent: msgbox Route11_EastEntrance_2F_Text_BigMonAsleepOnRoad releaseall end Route11_EastEntrance_2F_EventScript_LeftBinocularsSnorlaxGone:: goto_if_unset FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS, Route11_EastEntrance_2F_EventScript_SnorlaxPresent msgbox Route11_EastEntrance_2F_Text_WhatABreathtakingView releaseall end Route11_EastEntrance_2F_EventScript_RightBinoculars:: msgbox Route11_EastEntrance_2F_Text_RockTunnelGoodRouteToLavender, MSGBOX_SIGN end Route11_EastEntrance_2F_EventScript_Turner:: lock faceplayer callnative IsVersionFireRedToVarResult compare VAR_RESULT, FALSE goto_if_eq Route11_EastEntrance_2F_EventScript_Turner_LG setvar VAR_0x8008, INGAME_TRADE_NIDORINA_FR call EventScript_GetInGameTradeSpeciesInfo goto_if_set FLAG_DID_NINA_TRADE, Route11_EastEntrance_2F_EventScript_AlreadyTraded msgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Route11_EastEntrance_2F_EventScript_DeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, Route11_EastEntrance_2F_EventScript_DeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, Route11_EastEntrance_2F_EventScript_NotRequestedMon call EventScript_DoInGameTrade msgbox Trade_Text_HeyThanks setflag FLAG_DID_NINA_TRADE release end Route11_EastEntrance_2F_EventScript_Turner_LG:: setvar VAR_0x8008, INGAME_TRADE_NIDORINO_LG call EventScript_GetInGameTradeSpeciesInfo goto_if_set FLAG_DID_NINO_TRADE, Route11_EastEntrance_2F_EventScript_AlreadyTraded msgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Route11_EastEntrance_2F_EventScript_DeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, Route11_EastEntrance_2F_EventScript_DeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, Route11_EastEntrance_2F_EventScript_NotRequestedMon call EventScript_DoInGameTrade msgbox Trade_Text_HeyThanks setflag FLAG_DID_NINO_TRADE release end Route11_EastEntrance_2F_EventScript_DeclineTrade:: msgbox Trade_Text_AwwOhWell release end Route11_EastEntrance_2F_EventScript_NotRequestedMon:: bufferspeciesname STR_VAR_1, VAR_0x8009 msgbox Trade_Text_WhatThatsNoMon release end Route11_EastEntrance_2F_EventScript_AlreadyTraded:: msgbox Trade_Text_IsntMyOldMonGreat release end Route11_EastEntrance_2F_EventScript_Aide:: lock faceplayer call Route11_EastEntrance_2F_EventScript_GetAideRequestInfo goto_if_set FLAG_GOT_ITEMFINDER, Route11_EastEntrance_2F_EventScript_AlreadyGotItemfinder msgbox Route11_EastEntrance_2F_Text_GiveItemfinderIfCaught30, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons setvar VAR_0x8004, 0 specialvar VAR_RESULT, GetPokedexCount buffernumberstring STR_VAR_3, VAR_0x8006 call Route11_EastEntrance_2F_EventScript_GetAideRequestInfo goto_if_lt VAR_0x8006, REQUIRED_CAUGHT_MONS, Aide_EventScript_HaventCaughtEnough msgbox Route11_EastEntrance_2F_Text_GreatHereYouGo checkitemspace ITEM_ITEMFINDER goto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem giveitem_msg Route11_EastEntrance_2F_Text_ReceivedItemfinderFromAide, ITEM_ITEMFINDER setflag FLAG_GOT_ITEMFINDER msgbox Route11_EastEntrance_2F_Text_ExplainItemfinder release end Route11_EastEntrance_2F_EventScript_AlreadyGotItemfinder:: msgbox Route11_EastEntrance_2F_Text_ExplainItemfinder release end Route11_EastEntrance_2F_EventScript_GetAideRequestInfo:: buffernumberstring STR_VAR_1, REQUIRED_CAUGHT_MONS bufferitemname STR_VAR_2, ITEM_ITEMFINDER return ================================================ FILE: data/maps/Route11_EastEntrance_2F/text.inc ================================================ Route11_EastEntrance_2F_Text_GiveItemfinderIfCaught30:: .string "Hi! Remember me?\n" .string "I'm one of PROF. OAK's AIDES.\p" .string "If your POKéDEX has complete data\n" .string "on {STR_VAR_1} species, I'm supposed to\l" .string "give you a reward.\p" .string "PROF. OAK entrusted me with the\n" .string "{STR_VAR_2} for you.\p" .string "So, {PLAYER}, let me ask you.\p" .string "Have you gathered data on at least\n" .string "{STR_VAR_1} kinds of POKéMON?$" Route11_EastEntrance_2F_Text_GreatHereYouGo:: .string "Great! You have caught or owned\n" .string "{STR_VAR_3} kinds of POKéMON!\p" .string "Congratulations!\n" .string "Here you go!$" Route11_EastEntrance_2F_Text_ReceivedItemfinderFromAide:: .string "{PLAYER} received the {STR_VAR_2}\n" .string "from the AIDE.$" Route11_EastEntrance_2F_Text_ExplainItemfinder:: .string "There are items on the ground that\n" .string "may be hidden from view.\p" .string "Use the ITEMFINDER to detect any\n" .string "hidden items close to you.\p" .string "The machine is a bit limited.\n" .string "It can't pinpoint item locations.\p" .string "What it does is show the direction\n" .string "where the item is.\p" .string "Use it to get your bearings, then\n" .string "search the suspect area by hand.$" Route11_EastEntrance_2F_Text_BigMonAsleepOnRoad:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "A big POKéMON is asleep on a road!$" Route11_EastEntrance_2F_Text_WhatABreathtakingView:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "What a breathtaking view!$" Route11_EastEntrance_2F_Text_RockTunnelGoodRouteToLavender:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "To get to LAVENDER TOWN from\n" .string "CERULEAN CITY…\p" .string "ROCK TUNNEL appears to be a good\n" .string "route to take.$" ================================================ FILE: data/maps/Route12/map.json ================================================ { "id": "MAP_ROUTE12", "name": "Route12", "layout": "LAYOUT_ROUTE12", "music": "MUS_ROUTE11", "region_map_section": "MAPSEC_ROUTE_12", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_LAVENDER_TOWN" }, { "direction": "down", "offset": -48, "map": "MAP_ROUTE13" }, { "direction": "left", "offset": 59, "map": "MAP_ROUTE11" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 17, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route12_EventScript_Ned", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 9, "y": 39, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route12_EventScript_Chip", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 16, "y": 46, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route12_EventScript_Hank", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 13, "y": 58, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route12_EventScript_Elliot", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SNORLAX", "in_connection": false, "x": 14, "y": 69, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route12_EventScript_Snorlax", "flag": "FLAG_HIDE_ROUTE_12_SNORLAX" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKER_2", "x": 13, "y": 91, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT", "movement_range_x": 4, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route12_EventScript_Luca", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 10, "y": 98, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route12_EventScript_Justin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 18, "y": 107, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route12_EventScript_Andrew", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 11, "y": 99, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_12_CUT_TREE_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 18, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route12_EventScript_ItemTM48", "flag": "FLAG_HIDE_ROUTE12_TM48" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 9, "y": 100, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route12_EventScript_ItemIron", "flag": "FLAG_HIDE_ROUTE12_IRON" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNG_COUPLE_F", "x": 19, "y": 63, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "Route12_EventScript_Gia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNG_COUPLE_M", "x": 19, "y": 62, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "Route12_EventScript_Jes", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 12, "y": 110, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_12_CUT_TREE_2" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BEAUTY", "in_connection": false, "x": 7, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Squirtle", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 20, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Seadra", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 20, "y": 90, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Goldeen", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 9, "y": 110, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Poliwag", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 12, "y": 85, "elevation": 0, "dest_map": "MAP_ROUTE12_FISHING_HOUSE", "dest_warp_id": "1" }, { "x": 14, "y": 14, "elevation": 3, "dest_map": "MAP_ROUTE12_NORTH_ENTRANCE_1F", "dest_warp_id": "0" }, { "x": 15, "y": 14, "elevation": 3, "dest_map": "MAP_ROUTE12_NORTH_ENTRANCE_1F", "dest_warp_id": "1" }, { "x": 14, "y": 20, "elevation": 3, "dest_map": "MAP_ROUTE12_NORTH_ENTRANCE_1F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 17, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route12_EventScript_RouteSign" }, { "type": "sign", "x": 15, "y": 68, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route12_EventScript_FishingSign" }, { "type": "hidden_item", "x": 18, "y": 56, "elevation": 3, "item": "ITEM_HYPER_POTION", "flag": "FLAG_HIDDEN_ITEM_ROUTE12_HYPER_POTION", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 14, "y": 69, "elevation": 3, "item": "ITEM_LEFTOVERS", "flag": "FLAG_HIDDEN_ITEM_ROUTE12_LEFTOVERS", "quantity": 1, "underfoot": true }, { "type": "hidden_item", "x": 9, "y": 115, "elevation": 3, "item": "ITEM_RARE_CANDY", "flag": "FLAG_HIDDEN_ITEM_ROUTE12_RARE_CANDY", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/Route12/scripts.inc ================================================ .set LOCALID_SQUIRTLE_MASTER, 15 .set LOCALID_SEADRA_MASTER, 16 .set LOCALID_GOLDEEN_MASTER, 17 .set LOCALID_POLIWAG_MASTER, 18 .set TRAINER, VAR_0x8009 Route12_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route12_OnTransition map_script MAP_SCRIPT_ON_RESUME, Route12_OnResume .byte 0 Route12_OnTransition:: call_if_set FLAG_WOKE_UP_ROUTE_12_SNORLAX, Route12_EventScript_HideSnorlax call_if_unset FLAG_WOKE_UP_ROUTE_12_SNORLAX, Route12_EventScript_TryShowSnorlax goto Route12_MapScript_SetMasterTrainerMovementTypes end Route12_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_SQUIRTLE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route12_MapScript_SquirtleMasterMovementType setvar TRAINER, MASTER_SEADRA callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route12_MapScript_SeadraMasterMovementType setvar TRAINER, MASTER_GOLDEEN callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route12_MapScript_GoldeenMasterMovementType setvar TRAINER, MASTER_POLIWAG callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route12_MapScript_PoliwagMasterMovementType end Route12_MapScript_SquirtleMasterMovementType:: setobjectmovementtype LOCALID_SQUIRTLE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route12_MapScript_SeadraMasterMovementType:: setobjectmovementtype LOCALID_SEADRA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return Route12_MapScript_GoldeenMasterMovementType:: setobjectmovementtype LOCALID_GOLDEEN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return Route12_MapScript_PoliwagMasterMovementType:: setobjectmovementtype LOCALID_POLIWAG_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route12_EventScript_HideSnorlax:: setflag FLAG_HIDE_ROUTE_12_SNORLAX return Route12_EventScript_TryShowSnorlax:: goto_if_set FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS, EventScript_Return clearflag FLAG_HIDE_ROUTE_12_SNORLAX return Route12_OnResume:: call_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, Route12_EventScript_TryRemoveSnorlax end Route12_EventScript_TryRemoveSnorlax:: specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_CAUGHT goto_if_ne EventScript_Return removeobject VAR_LAST_TALKED return Route12_EventScript_Snorlax:: lock faceplayer goto_if_unset FLAG_GOT_POKE_FLUTE, Route12_EventScript_SnorlaxNoPokeFlute goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording msgbox Text_WantToUsePokeFlute, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Route12_EventScript_DontUsePokeFlute call EventScript_AwakenSnorlax setwildbattle SPECIES_SNORLAX, 30 waitse playmoncry SPECIES_SNORLAX, CRY_MODE_ENCOUNTER delay 40 waitmoncry setflag FLAG_HIDE_ROUTE_12_SNORLAX setflag FLAG_SYS_SPECIAL_WILD_BATTLE dowildbattle clearflag FLAG_SYS_SPECIAL_WILD_BATTLE specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, Route12_EventScript_FoughtSnorlax goto_if_eq VAR_RESULT, B_OUTCOME_RAN, Route12_EventScript_FoughtSnorlax goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, Route12_EventScript_FoughtSnorlax setflag FLAG_WOKE_UP_ROUTE_12_SNORLAX release end Route12_EventScript_DontUsePokeFlute:: release end Route12_EventScript_FoughtSnorlax:: setflag FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS fadescreenswapbuffers FADE_TO_BLACK removeobject VAR_LAST_TALKED fadescreenswapbuffers FADE_FROM_BLACK msgbox Text_SnorlaxReturnedToMountains release end Route12_EventScript_SnorlaxNoPokeFlute:: msgbox Route12_Text_MonSprawledOutInSlumber release end Route12_EventScript_RouteSign:: msgbox Route12_Text_RouteSign, MSGBOX_SIGN end Route12_EventScript_FishingSign:: msgbox Route12_Text_SportfishingArea, MSGBOX_SIGN end ================================================ FILE: data/maps/Route12/text.inc ================================================ Route12_Text_MonSprawledOutInSlumber:: .string "A POKéMON is sprawled out in\n" .string "a deep and comfortable slumber.$" Text_SnorlaxWokeUp:: .string "SNORLAX woke up!\p" .string "It attacked in a grumpy rage!$" Text_SnorlaxReturnedToMountains:: .string "SNORLAX calmed down.\n" .string "It gave a huge yawn…\l" .string "And returned to the mountains.$" Text_WantToUsePokeFlute:: .string "Want to use the POKé FLUTE?$" Text_PlayedPokeFlute:: .string "{PLAYER} played the POKé FLUTE.$" Route12_Text_NedIntro:: .string "Yeah!\n" .string "I got a bite here!$" Route12_Text_NedDefeat:: .string "Tch!\n" .string "Just a small fry…$" Route12_Text_NedPostBattle:: .string "Hang on!\n" .string "My line's snagged!$" Route12_Text_ChipIntro:: .string "Be patient.\n" .string "Fishing is a waiting game.$" Route12_Text_ChipDefeat:: .string "That one got away!$" Route12_Text_ChipPostBattle:: .string "With a better ROD, I could catch\n" .string "better POKéMON…$" Route12_Text_JustinIntro:: .string "I'm searching for a MOON STONE.\n" .string "Have you found one?$" Route12_Text_JustinDefeat:: .string "Oww!$" Route12_Text_JustinPostBattle:: .string "I could have made my POKéMON\n" .string "evolve with a MOON STONE.\p" .string "I would have won then, I bet.$" Route12_Text_LucaIntro:: .string "Electricity is my specialty.\p" .string "I don't know a thing about POKéMON\n" .string "of the sea, though.$" Route12_Text_LucaDefeat:: .string "Unplugged!$" Route12_Text_LucaPostBattle:: .string "Water conducts electricity, so you\n" .string "should zap sea POKéMON.$" Route12_Text_HankIntro:: .string "The FISHING FOOL versus POKéMON\n" .string "KID!$" Route12_Text_HankDefeat:: .string "Touch too much!$" Route12_Text_HankPostBattle:: .string "I guess you get to be good at\n" .string "what you like.\p" .string "Well, you beat me at POKéMON,\n" .string "but you can't top me at fishing.$" Route12_Text_ElliotIntro:: .string "I love fishing, don't get me wrong.\p" .string "But it'd be best if I also had more\n" .string "work.$" Route12_Text_ElliotDefeat:: .string "It's not easy…$" Route12_Text_ElliotPostBattle:: .string "It's all right.\n" .string "Losing doesn't bug me anymore.$" Route12_Text_AndrewIntro:: .string "What's catching?\p" .string "You never know what you could\n" .string "catch!$" Route12_Text_AndrewDefeat:: .string "Lost it!$" Route12_Text_AndrewPostBattle:: .string "What, MAGIKARP?\p" .string "I catch them all the time, sure.\n" .string "But, boy are they wimpy.$" Route12_Text_RouteSign:: .string "ROUTE 12 \n" .string "North to LAVENDER$" Route12_Text_SportfishingArea:: .string "SPORTFISHING AREA$" Route12_Text_JesIntro:: .string "JES: If I win, I'm going to\n" .string "propose to GIA.$" Route12_Text_JesDefeat:: .string "JES: Oh, please, why couldn't you\n" .string "let us win?$" Route12_Text_JesPostBattle:: .string "JES: Oh, GIA, forgive me,\n" .string "my love!$" Route12_Text_JesNotEnoughMons:: .string "JES: GIA and I, we'll be\n" .string "together forever.\p" .string "We won't battle unless you have\n" .string "two POKéMON of your own.$" Route12_Text_GiaIntro:: .string "GIA: Hey, JES…\p" .string "If we win, I'll marry you!$" Route12_Text_GiaDefeat:: .string "GIA: Oh, but why?$" Route12_Text_GiaPostBattle:: .string "GIA: JES, you silly!\n" .string "You ruined this!$" Route12_Text_GiaNotEnoughMons:: .string "GIA: I can't bear to battle\n" .string "without my JES!\p" .string "Don't you have one more POKéMON?$" ================================================ FILE: data/maps/Route12_FishingHouse/map.json ================================================ { "id": "MAP_ROUTE12_FISHING_HOUSE", "name": "Route12_FishingHouse", "layout": "LAYOUT_HOUSE4", "music": "MUS_CELADON", "region_map_section": "MAPSEC_ROUTE_12", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route12_FishingHouse_EventScript_FishingGuruBrother", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 8, "elevation": 0, "dest_map": "MAP_ROUTE12", "dest_warp_id": "0" }, { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_ROUTE12", "dest_warp_id": "0" }, { "x": 4, "y": 8, "elevation": 0, "dest_map": "MAP_ROUTE12", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 9, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route12_FishingHouse_EventScript_MagikarpRecordSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/Route12_FishingHouse/scripts.inc ================================================ Route12_FishingHouse_MapScripts:: .byte 0 Route12_FishingHouse_EventScript_FishingGuruBrother:: lock faceplayer goto_if_set FLAG_GOT_SUPER_ROD, Route12_FishingHouse_EventScript_CheckMagikarpRecord msgbox Route12_FishingHouse_Text_DoYouLikeToFish, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, Route12_FishingHouse_EventScript_GiveSuperRod msgbox Route12_FishingHouse_Text_OhThatsDisappointing release end Route12_FishingHouse_EventScript_GiveSuperRod:: checkitemspace ITEM_SUPER_ROD goto_if_eq VAR_RESULT, FALSE, Route12_FishingHouse_EventScript_NoRoomForSuperRod additem ITEM_SUPER_ROD msgbox Route12_FishingHouse_Text_TakeThisAndFish msgreceiveditem Route12_FishingHouse_Text_ReceivedSuperRod, ITEM_SUPER_ROD setflag FLAG_GOT_SUPER_ROD msgbox Route12_FishingHouse_Text_IfYouCatchBigMagikarpShowMe release end Route12_FishingHouse_EventScript_NoRoomForSuperRod:: msgbox Route12_FishingHouse_Text_NoRoomForGift release end Route12_FishingHouse_EventScript_CheckMagikarpRecord:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording setvar VAR_0x8004, SPECIES_MAGIKARP specialvar VAR_RESULT, DoesPlayerPartyContainSpecies goto_if_eq VAR_RESULT, FALSE, Route12_FishingHouse_EventScript_NoMagikarpInParty special GetMagikarpSizeRecordInfo msgbox Route12_FishingHouse_Text_OhMagikarpAllowMeToSee special ChoosePartyMon waitstate copyvar VAR_RESULT, VAR_0x8004 goto_if_ge VAR_RESULT, PARTY_SIZE, Route12_FishingHouse_EventScript_CancelShowMon special CompareMagikarpSize goto_if_eq VAR_RESULT, 1, Route12_FishingHouse_EventScript_NotMagikarp goto_if_eq VAR_RESULT, 2, Route12_FishingHouse_EventScript_NotRecordMagikarp goto_if_eq VAR_RESULT, 3, Route12_FishingHouse_EventScript_NewRecordMagikarp goto_if_eq VAR_RESULT, 4, Route12_FishingHouse_EventScript_TieRecordMagikarp release end Route12_FishingHouse_EventScript_NoMagikarpInParty:: msgbox Route12_FishingHouse_Text_TryFishingBringMeMagikarp release end Route12_FishingHouse_EventScript_CancelShowMon:: release end Route12_FishingHouse_EventScript_NotMagikarp:: msgbox Route12_FishingHouse_Text_DoesntLookLikeMagikarp release end Route12_FishingHouse_EventScript_NotRecordMagikarp:: goto_if_unset FLAG_GOT_RECORD_SETTING_MAGIKARP, Route12_FishingHouse_EventScript_NewRecordMagikarp msgbox Route12_FishingHouse_Text_HmmXInchesDoesntMeasureUp release end Route12_FishingHouse_EventScript_TieRecordMagikarp:: goto_if_unset FLAG_GOT_RECORD_SETTING_MAGIKARP, Route12_FishingHouse_EventScript_NewRecordMagikarp msgbox Route12_FishingHouse_Text_HuhXInchesSameSizeAsLast release end Route12_FishingHouse_EventScript_NewRecordMagikarp:: setflag FLAG_GOT_RECORD_SETTING_MAGIKARP msgbox Route12_FishingHouse_Text_WhoaXInchesTakeThis giveitem ITEM_NET_BALL goto_if_eq VAR_RESULT, FALSE, Route12_FishingHouse_EventScript_NoRoomForNetBall msgbox Route12_FishingHouse_Text_LookForwardToGreaterRecords release end Route12_FishingHouse_EventScript_NoRoomForNetBall:: msgbox Route12_FishingHouse_Text_NoRoomForGift release end Route12_FishingHouse_EventScript_MagikarpRecordSign:: lockall goto_if_set FLAG_GOT_RECORD_SETTING_MAGIKARP, Route12_FishingHouse_EventScript_MagikarpRecordSignRecordSet msgbox Route12_FishingHouse_Text_BlankChartOfSomeSort releaseall end Route12_FishingHouse_EventScript_MagikarpRecordSignRecordSet:: special GetMagikarpSizeRecordInfo msgbox Route12_FishingHouse_Text_MostGiganticMagikarpXInches releaseall end ================================================ FILE: data/maps/Route12_FishingHouse/text.inc ================================================ Route12_FishingHouse_Text_DoYouLikeToFish:: .string "I'm the FISHING GURU's younger\n" .string "brother.\p" .string "I simply looove fishing!\n" .string "I can't bear to go without.\p" .string "Tell me, do you like to fish?$" Route12_FishingHouse_Text_TakeThisAndFish:: .string "Grand! I like your style.\n" .string "I think we can be friends.\p" .string "Take this and fish, young friend!$" Route12_FishingHouse_Text_ReceivedSuperRod:: .string "{PLAYER} received a SUPER ROD from\n" .string "the FISHING GURU's brother.$" Route12_FishingHouse_Text_IfYouCatchBigMagikarpShowMe:: .string "Fishing is a way of life!\n" .string "It is like the finest poetry.\p" .string "From the seas to rivers, go out\n" .string "and land the big one, my friend.\p" .string "Now, I have a request.\p" .string "If you catch a big MAGIKARP \n" .string "with that ROD, I want to see it.\p" .string "As much as I love to fish, I also\n" .string "love seeing gigantic MAGIKARP.$" Route12_FishingHouse_Text_OhThatsDisappointing:: .string "Oh…\n" .string "That's so disappointing…$" Route12_FishingHouse_Text_TryFishingBringMeMagikarp:: .string "Hello there, {PLAYER}!\n" .string "Have you been fishing?\p" .string "Try fishing with the SUPER ROD in\n" .string "any body of water.\p" .string "You'll find different POKéMON in\n" .string "different places.\p" .string "Oh, and don't forget to bring me\n" .string "gigantic MAGIKARP.$" Route12_FishingHouse_Text_OhMagikarpAllowMeToSee:: .string "Oh? {PLAYER}?\n" .string "Why, if it isn't a MAGIKARP!\p" .string "Allow me to see it, quick!$" Route12_FishingHouse_Text_WhoaXInchesTakeThis:: .string "… … …Whoa!\n" .string "{STR_VAR_2} inches!\p" .string "You have a rare appreciation for\n" .string "the fine, poetic aspects of fishing!\p" .string "You must take this.\n" .string "I insist!$" Route12_FishingHouse_Text_LookForwardToGreaterRecords:: .string "I'll look forward to seeing greater\n" .string "records from you!$" Route12_FishingHouse_Text_HuhXInchesSameSizeAsLast:: .string "Huh?\n" .string "{STR_VAR_2} inches?\p" .string "This is the same size as the one\n" .string "I saw before.$" Route12_FishingHouse_Text_HmmXInchesDoesntMeasureUp:: .string "Hmm…\n" .string "This one is {STR_VAR_2} inches long.\p" .string "It doesn't measure up to the\n" .string "{STR_VAR_3}-inch one you brought before.$" Route12_FishingHouse_Text_DoesntLookLikeMagikarp:: .string "Uh… That doesn't look much like\n" .string "a MAGIKARP.$" Route12_FishingHouse_Text_NoRoomForGift:: .string "Oh, no!\p" .string "I had a gift for you, but you have\n" .string "no room for it.$" Route12_FishingHouse_Text_MostGiganticMagikarpXInches:: .string "The most gigantic MAGIKARP\n" .string "I have ever witnessed…\p" .string "{STR_VAR_3} inches!$" Route12_FishingHouse_Text_BlankChartOfSomeSort:: .string "It's a blank chart of some sort.\p" .string "It has spaces for writing in\n" .string "records of some kind.$" ================================================ FILE: data/maps/Route12_NorthEntrance_1F/map.json ================================================ { "id": "MAP_ROUTE12_NORTH_ENTRANCE_1F", "name": "Route12_NorthEntrance_1F", "layout": "LAYOUT_ROUTE12_NORTH_ENTRANCE_1F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_12", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "x": 1, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route12_NorthEntrance_1F_EventScript_Guard", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 1, "elevation": 3, "dest_map": "MAP_ROUTE12", "dest_warp_id": "1" }, { "x": 6, "y": 1, "elevation": 0, "dest_map": "MAP_ROUTE12", "dest_warp_id": "2" }, { "x": 5, "y": 11, "elevation": 3, "dest_map": "MAP_ROUTE12", "dest_warp_id": "3" }, { "x": 6, "y": 11, "elevation": 3, "dest_map": "MAP_ROUTE12", "dest_warp_id": "3" }, { "x": 8, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE12_NORTH_ENTRANCE_2F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route12_NorthEntrance_1F/scripts.inc ================================================ Route12_NorthEntrance_1F_MapScripts:: .byte 0 Route12_NorthEntrance_1F_EventScript_Guard:: msgbox Route12_NorthEntrance_1F_Text_LookoutSpotUpstairs, MSGBOX_NPC end ================================================ FILE: data/maps/Route12_NorthEntrance_1F/text.inc ================================================ Route12_NorthEntrance_1F_Text_LookoutSpotUpstairs:: .string "There's a lookout spot upstairs.\n" .string "The view is magnificent.$" ================================================ FILE: data/maps/Route12_NorthEntrance_2F/map.json ================================================ { "id": "MAP_ROUTE12_NORTH_ENTRANCE_2F", "name": "Route12_NorthEntrance_2F", "layout": "LAYOUT_ENTRANCE_2F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_12", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 7, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route12_NorthEntrance_2F_EventScript_Lass", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BIRD_KEEPER", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Pidgeot", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 10, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE12_NORTH_ENTRANCE_1F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route12_NorthEntrance_2F_EventScript_LeftBinoculars" }, { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route12_NorthEntrance_2F_EventScript_RightBinoculars" } ], "level_scaling": "0" } ================================================ FILE: data/maps/Route12_NorthEntrance_2F/scripts.inc ================================================ .set LOCALID_PIDGEOT_MASTER, 2 .set TRAINER, VAR_0x8009 Route12_NorthEntrance_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route12_NorthEntrance_MapScript_SetMasterTrainerMovementTypes .byte 0 Route12_NorthEntrance_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PIDGEOT callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route12_NorthEntrance_MapScript_PidgeotMasterMovementType end Route12_NorthEntrance_MapScript_PidgeotMasterMovementType:: setobjectmovementtype LOCALID_PIDGEOT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route12_NorthEntrance_2F_EventScript_LeftBinoculars:: msgbox Route12_NorthEntrance_2F_Text_TheresManFishing, MSGBOX_SIGN end Route12_NorthEntrance_2F_EventScript_RightBinoculars:: msgbox Route12_NorthEntrance_2F_Text_ItsPokemonTower, MSGBOX_SIGN end Route12_NorthEntrance_2F_EventScript_Lass:: lock faceplayer goto_if_set FLAG_GOT_TM27, Route12_NorthEntrance_2F_EventScript_ExplainTM27 checkplayergender call_if_eq VAR_RESULT, MALE, Route12_NorthEntrance_2F_EventScript_TakeTMMale call_if_eq VAR_RESULT, FEMALE, Route12_NorthEntrance_2F_EventScript_TakeTMFemale checkitemspace ITEM_TM27 goto_if_eq VAR_RESULT, FALSE, Route12_NorthEntrance_2F_EventScript_NoRoomForTM27 giveitem_msg Route12_NorthEntrance_2F_Text_ReceivedTM27FromLittleGirl, ITEM_TM27 msgbox Route12_NorthEntrance_2F_Text_ExplainTM27 setflag FLAG_GOT_TM27 release end Route12_NorthEntrance_2F_EventScript_TakeTMMale:: msgbox Route12_NorthEntrance_2F_Text_TakeTMDontNeedAnymoreMale return Route12_NorthEntrance_2F_EventScript_TakeTMFemale:: msgbox Route12_NorthEntrance_2F_Text_TakeTMDontNeedAnymoreFemale return Route12_NorthEntrance_2F_EventScript_NoRoomForTM27:: msgbox Route12_NorthEntrance_2F_Text_DontHaveRoomForThis release end Route12_NorthEntrance_2F_EventScript_ExplainTM27:: msgbox Route12_NorthEntrance_2F_Text_ExplainTM27 release end ================================================ FILE: data/maps/Route12_NorthEntrance_2F/text.inc ================================================ @ Male and female text identical, differ (presumably) in JP Route12_NorthEntrance_2F_Text_TakeTMDontNeedAnymoreMale:: .string "My POKéMON's ashes are stored in\n" .string "POKéMON TOWER.\p" .string "You can have this TM.\n" .string "I don't need it anymore…$" Route12_NorthEntrance_2F_Text_TakeTMDontNeedAnymoreFemale:: .string "My POKéMON's ashes are stored in\n" .string "POKéMON TOWER.\p" .string "You can have this TM.\n" .string "I don't need it anymore…$" Route12_NorthEntrance_2F_Text_ReceivedTM27FromLittleGirl:: .string "{PLAYER} received TM27\n" .string "from the little girl.$" Route12_NorthEntrance_2F_Text_ExplainTM27:: .string "TM27 is a move called RETURN…\p" .string "If you treat your POKéMON good,\n" .string "it will return your love by working\l" .string "its hardest in battle.$" Route12_NorthEntrance_2F_Text_DontHaveRoomForThis:: .string "You don't have room for this.$" Route12_NorthEntrance_2F_Text_TheresManFishing:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "There's a man fishing!$" Route12_NorthEntrance_2F_Text_ItsPokemonTower:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "It's POKéMON TOWER!$" ================================================ FILE: data/maps/Route13/map.json ================================================ { "id": "MAP_ROUTE13", "name": "Route13", "layout": "LAYOUT_ROUTE13", "music": "MUS_ROUTE11", "region_map_section": "MAPSEC_ROUTE_13", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 48, "map": "MAP_ROUTE12" }, { "direction": "left", "offset": 0, "map": "MAP_ROUTE14" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 62, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route13_EventScript_Alma", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 63, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route13_EventScript_Sebastian", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 54, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route13_EventScript_Susie", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 42, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route13_EventScript_Sheila", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 43, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route13_EventScript_Lola", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 35, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route13_EventScript_Valerie", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 29, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route13_EventScript_Gwen", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 9, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route13_EventScript_Robert", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 16, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route13_EventScript_Perry", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 14, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route13_EventScript_Jared", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 44, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_13_CUT_TREE" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 57, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Seaking", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 56, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Kakuna", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 41, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route13_EventScript_RouteSign" }, { "type": "sign", "x": 37, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route13_EventScript_TrainerTips2" }, { "type": "sign", "x": 21, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route13_EventScript_TrainerTips1" }, { "type": "hidden_item", "x": 23, "y": 14, "elevation": 3, "item": "ITEM_PP_UP", "flag": "FLAG_HIDDEN_ITEM_ROUTE13_PP_UP", "quantity": 1, "underfoot": false } ], "level_scaling": "3" } ================================================ FILE: data/maps/Route13/scripts.inc ================================================ .set LOCALID_SEAKING_MASTER, 12 .set LOCALID_KAKUNA_MASTER, 13 .set TRAINER, VAR_0x8009 Route13_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route13_MapScript_SetMasterTrainerMovementTypes .byte 0 Route13_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_SEAKING callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route13_MapScript_SeakingMasterMovementType setvar TRAINER, MASTER_KAKUNA callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route13_MapScript_KakunaMasterMovementType end Route13_MapScript_SeakingMasterMovementType:: setobjectmovementtype LOCALID_SEAKING_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return Route13_MapScript_KakunaMasterMovementType:: setobjectmovementtype LOCALID_KAKUNA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route13_EventScript_TrainerTips1:: msgbox Route13_Text_LookToLeftOfThatPost, MSGBOX_SIGN end Route13_EventScript_TrainerTips2:: msgbox Route13_Text_SelectToSwitchItems, MSGBOX_SIGN end Route13_EventScript_RouteSign:: msgbox Route13_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route13/text.inc ================================================ Route13_Text_SebastianIntro:: .string "My bird POKéMON want to battle\n" .string "with you!$" Route13_Text_SebastianDefeat:: .string "My PIDGEY and PIDGEOTTO combo\n" .string "lost?$" Route13_Text_SebastianPostBattle:: .string "My POKéMON look happy even though\n" .string "they lost.$" Route13_Text_SusieIntro:: .string "I'm told I'm good for a kid.$" Route13_Text_SusieDefeat:: .string "Ohh!\n" .string "I lost!$" Route13_Text_SusiePostBattle:: .string "I want to become a good TRAINER.\n" .string "I'll train hard, just watch.$" Route13_Text_ValerieIntro:: .string "Wow!\n" .string "Your BADGES are too cool!$" Route13_Text_ValerieDefeat:: .string "Not enough!$" Route13_Text_ValeriePostBattle:: .string "You got those BADGES from GYM\n" .string "LEADERS. I know!$" Route13_Text_GwenIntro:: .string "My cute POKéMON wish to make your\n" .string "acquaintance.$" Route13_Text_GwenDefeat:: .string "Good going!\n" .string "You totally won!$" Route13_Text_GwenPostBattle:: .string "You have to make POKéMON battle\n" .string "to toughen them up.$" Route13_Text_AlmaIntro:: .string "I found CARBOS in a cave once\n" .string "while I was spelunking.$" Route13_Text_AlmaDefeat:: .string "Oh, too bad!\n" .string "I just messed up!$" Route13_Text_AlmaPostBattle:: .string "CARBOS boosted the SPEED of my\n" .string "POKéMON.$" Route13_Text_PerryIntro:: .string "I'm not going to lose.\n" .string "Not when the wind's blowing my way!$" Route13_Text_PerryDefeat:: .string "The wind turned!$" Route13_Text_PerryPostBattle:: .string "I'm beat.\n" .string "I guess I'll FLY home.$" Route13_Text_LolaIntro:: .string "Sure, I'll play with you, sweetie.$" Route13_Text_LolaDefeat:: .string "Oh!\n" .string "You little beast!$" Route13_Text_LolaPostBattle:: .string "I wonder which is stronger, male or\n" .string "female POKéMON?$" Route13_Text_SheilaIntro:: .string "Do you want to battle some\n" .string "POKéMON with me?$" Route13_Text_SheilaDefeat:: .string "It's over already?$" Route13_Text_SheilaPostBattle:: .string "I don't know anything about\n" .string "POKéMON actually.\p" .string "The ones I use… I picked them\n" .string "for their looks!$" Route13_Text_JaredIntro:: .string "What're you lookin' at?$" Route13_Text_JaredDefeat:: .string "Dang!\n" .string "Stripped gears!$" Route13_Text_JaredPostBattle:: .string "Get lost!$" Route13_Text_RobertIntro:: .string "I always go with bird POKéMON.\n" .string "I've dedicated myself to them.$" Route13_Text_RobertDefeat:: .string "Out of power!$" Route13_Text_RobertPostBattle:: .string "I wish I could fly like PIDGEY and\n" .string "PIDGEOTTO…$" Route13_Text_LookToLeftOfThatPost:: .string "TRAINER TIPS\p" .string "Look, look!\n" .string "Look to the left of that post!$" Route13_Text_SelectToSwitchItems:: .string "TRAINER TIPS\p" .string "Use SELECT to switch items in the\n" .string "ITEMS window.$" Route13_Text_RouteSign:: .string "ROUTE 13\n" .string "North to SILENCE BRIDGE$" ================================================ FILE: data/maps/Route14/map.json ================================================ { "id": "MAP_ROUTE14", "name": "Route14", "layout": "LAYOUT_ROUTE14", "music": "MUS_ROUTE11", "region_map_section": "MAPSEC_ROUTE_14", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": 40, "map": "MAP_ROUTE15" }, { "direction": "right", "offset": 0, "map": "MAP_ROUTE13" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 7, "y": 37, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route14_EventScript_Gerald", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 18, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route14_EventScript_Donald", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 10, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route14_EventScript_Beck", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 16, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route14_EventScript_Marlon", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 7, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route14_EventScript_Isaac", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 7, "y": 34, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route14_EventScript_Malik", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 8, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route14_EventScript_Mitch", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 7, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route14_EventScript_Carter", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 10, "y": 37, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 6, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route14_EventScript_Lukas", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 18, "y": 47, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route14_EventScript_Benny", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 7, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_14_CUT_TREE_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 12, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_14_CUT_TREE_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 1, "y": 47, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_14_CUT_TREE_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 13, "y": 51, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route14_EventScript_Jan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 12, "y": 51, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route14_EventScript_Kiri", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 7, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Vileplume", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 20, "y": 54, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Ivysaur", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 17, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route14_EventScript_RouteSign" }, { "type": "hidden_item", "x": 9, "y": 20, "elevation": 3, "item": "ITEM_ZINC", "flag": "FLAG_HIDDEN_ITEM_ROUTE14_ZINC", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 19, "y": 53, "elevation": 3, "item": "ITEM_GREPA_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE14_GREPA_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "3" } ================================================ FILE: data/maps/Route14/scripts.inc ================================================ .set LOCALID_VILEPLUME_MASTER, 16 .set LOCALID_IVYSAUR_MASTER, 17 .set TRAINER, VAR_0x8009 Route14_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route14_MapScript_SetMasterTrainerMovementTypes .byte 0 Route14_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_VILEPLUME callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route14_MapScript_VileplumeMasterMovementType setvar TRAINER, MASTER_IVYSAUR callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route14_MapScript_IvysaurMasterMovementType end Route14_MapScript_VileplumeMasterMovementType:: setobjectmovementtype LOCALID_VILEPLUME_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route14_MapScript_IvysaurMasterMovementType:: setobjectmovementtype LOCALID_IVYSAUR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route14_EventScript_RouteSign:: msgbox Route14_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route14/text.inc ================================================ Route14_Text_CarterIntro:: .string "You need to use TMs to teach good\n" .string "moves to POKéMON.$" Route14_Text_CarterDefeat:: .string "Not good enough quite yet.$" Route14_Text_CarterPostBattle:: .string "You have some HMs, right? POKéMON\n" .string "can't forget those moves easily.$" Route14_Text_MitchIntro:: .string "My bird POKéMON should be ready\n" .string "for battle.$" Route14_Text_MitchDefeat:: .string "Not ready yet!$" Route14_Text_MitchPostBattle:: .string "My bird POKéMON need to learn\n" .string "better moves.$" Route14_Text_BeckIntro:: .string "They have TMs on sale at the\n" .string "CELADON DEPT. STORE.\p" .string "TMs aren't really rare, but not\n" .string "many people have HMs.$" Route14_Text_BeckDefeat:: .string "Aww, bummer!$" Route14_Text_BeckPostBattle:: .string "Try teaching POKéMON a move that's\n" .string "the same type as it.\p" .string "That apparently boosts the power\n" .string "of the move.$" Route14_Text_MarlonIntro:: .string "Have you taught your bird POKéMON\n" .string "how to FLY?\p" .string "You'll be able to soar with it into\n" .string "the sky!$" Route14_Text_MarlonDefeat:: .string "Shot down in flames!$" Route14_Text_MarlonPostBattle:: .string "Bird POKéMON are my one true love.\n" .string "I don't want to raise anything else.$" Route14_Text_DonaldIntro:: .string "Have you heard the legend of the\n" .string "winged mirages?$" Route14_Text_DonaldDefeat:: .string "Why?\n" .string "Why'd I lose?$" Route14_Text_DonaldPostBattle:: .string "Well, the winged mirages are the\n" .string "legendary bird POKéMON.\p" .string "There are three of them: ARTICUNO,\n" .string "ZAPDOS, and MOLTRES.$" Route14_Text_BennyIntro:: .string "I'm not into it, but okay.\n" .string "Let's go!$" Route14_Text_BennyDefeat:: .string "I knew it!$" Route14_Text_BennyPostBattle:: .string "Winning, losing… It's insignificant\n" .string "under this huge sky.$" Route14_Text_LukasIntro:: .string "C'mon, c'mon.\n" .string "Let's go, let's go, let's go!$" Route14_Text_LukasDefeat:: .string "Arrg!\n" .string "Lost! Get lost!$" Route14_Text_LukasPostBattle:: .string "What, what, what?\n" .string "What do you want still?$" Route14_Text_IsaacIntro:: .string "I need to burn some time.\n" .string "Shut up and battle.$" Route14_Text_IsaacDefeat:: .string "What?\n" .string "You!?$" Route14_Text_IsaacPostBattle:: .string "Raising POKéMON is a drag, man.$" Route14_Text_GeraldIntro:: .string "We ride out here because of the\n" .string "wide-open spaces.$" Route14_Text_GeraldDefeat:: .string "Wipeout!$" Route14_Text_GeraldPostBattle:: .string "It's cool you made your POKéMON so\n" .string "strong.\p" .string "Might is right!\n" .string "And you know it!$" Route14_Text_MalikIntro:: .string "POKéMON battle?\n" .string "Cool! Rumble!$" Route14_Text_MalikDefeat:: .string "Blown away!$" Route14_Text_MalikPostBattle:: .string "You know who'd win, you and me\n" .string "one-on-one!$" Route14_Text_RouteSign:: .string "ROUTE 14\n" .string "West to FUCHSIA CITY$" Route14_Text_KiriIntro:: .string "KIRI: JAN, let's try really,\n" .string "really hard together.$" Route14_Text_KiriDefeat:: .string "KIRI: Whimper…\n" .string "We lost, didn't we?$" Route14_Text_KiriPostBattle:: .string "KIRI: Did we lose because of me?$" Route14_Text_KiriNotEnoughMons:: .string "KIRI: We can battle if you have\n" .string "two POKéMON.$" Route14_Text_JanIntro:: .string "JAN: KIRI, here we go!\n" .string "We have to try hard!$" Route14_Text_JanDefeat:: .string "JAN: Eeeeh!\n" .string "No fair!$" Route14_Text_JanPostBattle:: .string "JAN: KIRI, don't cry!\n" .string "We'll just try harder next time.$" Route14_Text_JanNotEnoughMons:: .string "JAN: You want to battle?\n" .string "You don't have enough POKéMON.$" ================================================ FILE: data/maps/Route15/map.json ================================================ { "id": "MAP_ROUTE15", "name": "Route15", "layout": "LAYOUT_ROUTE15", "music": "MUS_ROUTE11", "region_map_section": "MAPSEC_ROUTE_15", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": -10, "map": "MAP_FUCHSIA_CITY" }, { "direction": "right", "offset": -40, "map": "MAP_ROUTE14" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 22, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route15_EventScript_Yazmin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 31, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route15_EventScript_Edwin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 37, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route15_EventScript_Chester", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 44, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route15_EventScript_Kindra", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 50, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route15_EventScript_Olivia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 59, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route15_EventScript_Alex", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 63, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route15_EventScript_Ernest", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 52, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route15_EventScript_Becky", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 54, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route15_EventScript_Grace", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 28, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route15_EventScript_Celia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 20, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route15_EventScript_ItemTM18", "flag": "FLAG_HIDE_ROUTE15_TM18" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 39, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route15_EventScript_Ron", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 40, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route15_EventScript_Mya", "flag": "0" }, { "type": "clone", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "x": 73, "y": 7, "target_local_id": 13, "target_map": "MAP_ROUTE14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 17, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Tangela", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 43, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Venomoth", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_BIRD_KEEPER", "in_connection": false, "x": 61, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Dodrio", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 9, "y": 11, "elevation": 3, "dest_map": "MAP_ROUTE15_WEST_ENTRANCE_1F", "dest_warp_id": "0" }, { "x": 16, "y": 11, "elevation": 3, "dest_map": "MAP_ROUTE15_WEST_ENTRANCE_1F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 41, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route15_EventScript_RouteSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/Route15/scripts.inc ================================================ .set LOCALID_TANGELA_MASTER, 15 .set LOCALID_VENOMOTH_MASTER, 16 .set LOCALID_DODRIO_MASTER, 17 .set TRAINER, VAR_0x8009 Route15_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route15_MapScript_SetMasterTrainerMovementTypes .byte 0 Route15_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_TANGELA callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route15_MapScript_TangelaMasterMovementType setvar TRAINER, MASTER_VENOMOTH callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route15_MapScript_VenomothMasterMovementType setvar TRAINER, MASTER_DODRIO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route15_MapScript_DodrioMasterMovementType end Route15_MapScript_TangelaMasterMovementType:: setobjectmovementtype LOCALID_TANGELA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route15_MapScript_VenomothMasterMovementType:: setobjectmovementtype LOCALID_VENOMOTH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route15_MapScript_DodrioMasterMovementType:: setobjectmovementtype LOCALID_DODRIO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route15_EventScript_RouteSign:: msgbox Route15_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route15/text.inc ================================================ Route15_Text_KindraIntro:: .string "I just got some POKéMON in trades.\n" .string "Can I try them out on you?$" Route15_Text_KindraDefeat:: .string "Not good enough!$" Route15_Text_KindraPostBattle:: .string "You can't change the nickname of\n" .string "any POKéMON you get in a trade.\p" .string "Only the Original TRAINER can get\n" .string "the nickname changed.$" Route15_Text_BeckyIntro:: .string "You look gentle, so I think I can\n" .string "beat you.\p" .string "I'll give it a go!$" Route15_Text_BeckyDefeat:: .string "No, wrong!$" Route15_Text_BeckyPostBattle:: .string "I'm afraid of BIKERS. They look so\n" .string "ugly and mean!$" Route15_Text_EdwinIntro:: .string "When I whistle, I can summon bird\n" .string "POKéMON.$" Route15_Text_EdwinDefeat:: .string "Ow!\n" .string "That's tragic!$" Route15_Text_EdwinPostBattle:: .string "Maybe I'm not cut out for battles.\n" .string "I'm not the right type, I guess.$" Route15_Text_ChesterIntro:: .string "Hmm? My birds are shivering!\n" .string "You're good, aren't you?$" Route15_Text_ChesterDefeat:: .string "Just as I thought!$" Route15_Text_ChesterPostBattle:: .string "This is so obvious, you should know\n" .string "this, but…\p" .string "Moves like EARTHQUAKE and FISSURE\n" .string "have no effect on bird POKéMON.$" Route15_Text_GraceIntro:: .string "Oh, you're a little cutie!\n" .string "So like a darling POKéMON!$" Route15_Text_GraceDefeat:: .string "You looked so cute, too!$" Route15_Text_GracePostBattle:: .string "I forgive you.\n" .string "I can take it.\l" .string "I'm a big girl now.$" Route15_Text_OliviaIntro:: .string "I raise POKéMON for protection\n" .string "because I live alone.$" Route15_Text_OliviaDefeat:: .string "POKéMON isn't about winning or\n" .string "losing for me.$" Route15_Text_OliviaPostBattle:: .string "I love having my POKéMON greet me\n" .string "when I get home.\p" .string "It's so reassuring.$" Route15_Text_ErnestIntro:: .string "Hey, kid! C'mon!\n" .string "I just got these off some loser!$" Route15_Text_ErnestDefeat:: .string "Why not?$" Route15_Text_ErnestPostBattle:: .string "Life's too short.\n" .string "It's cool to live as an outlaw.\l" .string "TEAM ROCKET RULES!$" Route15_Text_AlexIntro:: .string "Fork over all your cash when you\n" .string "lose to me, kid!$" Route15_Text_AlexDefeat:: .string "That can't be true!$" Route15_Text_AlexPostBattle:: .string "I was just joking about the money.\n" .string "Don't take me all serious.$" Route15_Text_CeliaIntro:: .string "What's cool and happening?\n" .string "Trading POKéMON!$" Route15_Text_CeliaDefeat:: .string "I said trade!$" Route15_Text_CeliaPostBattle:: .string "I trade POKéMON with my friends\n" .string "all the time.$" Route15_Text_YazminIntro:: .string "Want to play with my POKéMON?$" Route15_Text_YazminDefeat:: .string "I was too impatient!$" Route15_Text_YazminPostBattle:: .string "I'll go train with weaker people.$" Route15_Text_RouteSign:: .string "ROUTE 15\n" .string "West to FUCHSIA CITY$" Route15_Text_MyaIntro:: .string "MYA: You're perfect.\n" .string "Help me train my little brother?$" Route15_Text_MyaDefeat:: .string "MYA: RON, you have to focus!\n" .string "Concentrate on what you're doing!$" Route15_Text_MyaPostBattle:: .string "MYA: Okay, we'll turn it up.\n" .string "I'll add to our training menu!$" Route15_Text_MyaNotEnoughMons:: .string "MYA: Do you want to challenge us?\n" .string "You'll need two POKéMON, though.$" Route15_Text_RonIntro:: .string "RON: My sister gets scary when we\n" .string "lose.$" Route15_Text_RonDefeat:: .string "RON: Oh, no, no…\n" .string "Sis, I'm sorry!$" Route15_Text_RonPostBattle:: .string "RON: Oh, bleah…\n" .string "I wish I had a nice sister…$" Route15_Text_RonNotEnoughMons:: .string "RON: Did you want to battle with\n" .string "my sister and me?\p" .string "You need two POKéMON, then.$" ================================================ FILE: data/maps/Route15_WestEntrance_1F/map.json ================================================ { "id": "MAP_ROUTE15_WEST_ENTRANCE_1F", "name": "Route15_WestEntrance_1F", "layout": "LAYOUT_ENTRANCE_1F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_15", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route15_WestEntrance_1F_EventScript_Guard", "flag": "0" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE15", "dest_warp_id": "0" }, { "x": 1, "y": 7, "elevation": 3, "dest_map": "MAP_ROUTE15", "dest_warp_id": "0" }, { "x": 11, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE15", "dest_warp_id": "1" }, { "x": 11, "y": 7, "elevation": 3, "dest_map": "MAP_ROUTE15", "dest_warp_id": "1" }, { "x": 9, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE15_WEST_ENTRANCE_2F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route15_WestEntrance_1F/scripts.inc ================================================ Route15_WestEntrance_1F_MapScripts:: .byte 0 Route15_WestEntrance_1F_EventScript_Guard:: msgbox Route15_WestEntrance_1F_Text_OaksAideCameByHere, MSGBOX_NPC end ================================================ FILE: data/maps/Route15_WestEntrance_1F/text.inc ================================================ Route15_WestEntrance_1F_Text_OaksAideCameByHere:: .string "Are you the kid who's working on\n" .string "a POKéDEX?\p" .string "PROF. OAK's AIDE came by here.$" ================================================ FILE: data/maps/Route15_WestEntrance_2F/map.json ================================================ { "id": "MAP_ROUTE15_WEST_ENTRANCE_2F", "name": "Route15_WestEntrance_2F", "layout": "LAYOUT_ENTRANCE_2F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_15", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route15_WestEntrance_2F_EventScript_Aide", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 3, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Scyther", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 10, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE15_WEST_ENTRANCE_1F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route15_WestEntrance_2F_EventScript_LeftBinoculars" }, { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route15_WestEntrance_2F_EventScript_RightBinoculars" } ], "level_scaling": "0" } ================================================ FILE: data/maps/Route15_WestEntrance_2F/scripts.inc ================================================ .equ REQUIRED_CAUGHT_MONS, 50 .set LOCALID_SCYTHER_MASTER, 16 .set TRAINER, VAR_0x8009 Route15_WestEntrance_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route15_WestEntrance_2F_MapScript_SetMasterTrainerMovementTypes .byte 0 Route15_WestEntrance_2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_SCYTHER callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route15_WestEntrance_2F_MapScript_ScytherMasterMovementType end Route15_WestEntrance_2F_MapScript_ScytherMasterMovementType:: setobjectmovementtype LOCALID_SCYTHER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route15_WestEntrance_2F_EventScript_LeftBinoculars:: lockall msgbox Route15_WestEntrance_2F_Text_LargeShiningBird showmonpic SPECIES_ARTICUNO, 10, 3 delay 20 waitbuttonpress hidemonpic setvar VAR_0x8004, SPECIES_ARTICUNO special SetSeenMon releaseall end Route15_WestEntrance_2F_EventScript_RightBinoculars:: msgbox Route15_WestEntrance_2F_Text_SmallIslandOnHorizon, MSGBOX_SIGN end Route15_WestEntrance_2F_EventScript_Aide:: lock faceplayer call Route15_WestEntrance_2F_EventScript_GetAideRequestInfo goto_if_set FLAG_GOT_EXP_SHARE_FROM_OAKS_AIDE, Route15_WestEntrance_2F_EventScript_AlreadyGotExpShare msgbox Route15_WestEntrance_2F_Text_GiveItemIfCaughtEnough, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons setvar VAR_0x8004, 0 specialvar VAR_RESULT, GetPokedexCount buffernumberstring STR_VAR_3, VAR_0x8006 call Route15_WestEntrance_2F_EventScript_GetAideRequestInfo goto_if_lt VAR_0x8006, REQUIRED_CAUGHT_MONS, Aide_EventScript_HaventCaughtEnough msgbox Route15_WestEntrance_2F_Text_GreatHereYouGo checkitemspace ITEM_EXP_SHARE goto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem giveitem_msg Route15_WestEntrance_2F_Text_ReceivedItemFromAide, ITEM_EXP_SHARE setflag FLAG_GOT_EXP_SHARE_FROM_OAKS_AIDE msgbox Route15_WestEntrance_2F_Text_ExplainExpShare release end Route15_WestEntrance_2F_EventScript_AlreadyGotExpShare:: msgbox Route15_WestEntrance_2F_Text_ExplainExpShare release end Route15_WestEntrance_2F_EventScript_GetAideRequestInfo:: buffernumberstring STR_VAR_1, REQUIRED_CAUGHT_MONS bufferitemname STR_VAR_2, ITEM_EXP_SHARE return ================================================ FILE: data/maps/Route15_WestEntrance_2F/text.inc ================================================ Route15_WestEntrance_2F_Text_GiveItemIfCaughtEnough:: .string "Hi! Remember me?\n" .string "I'm one of PROF. OAK's AIDES.\p" .string "If your POKéDEX has complete data\n" .string "on {STR_VAR_1} species, I'm supposed to\l" .string "give you a reward.\p" .string "PROF. OAK entrusted me with the\n" .string "{STR_VAR_2} for you.\p" .string "So, {PLAYER}, let me ask you.\p" .string "Have you gathered data on at least\n" .string "{STR_VAR_1} kinds of POKéMON?$" Route15_WestEntrance_2F_Text_GreatHereYouGo:: .string "Great! You have caught or owned\n" .string "{STR_VAR_3} kinds of POKéMON!\p" .string "Congratulations!\n" .string "Here you go!$" Route15_WestEntrance_2F_Text_ReceivedItemFromAide:: .string "{PLAYER} received the {STR_VAR_2}\n" .string "from the AIDE.$" Route15_WestEntrance_2F_Text_ExplainExpShare:: .string "EXP. SHARE is an item to be held\n" .string "by a POKéMON.\p" .string "The POKéMON will receive a share\n" .string "of the EXP. Points without having\l" .string "to battle.$" Route15_WestEntrance_2F_Text_LargeShiningBird:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "A large, shining bird is flying\n" .string "toward the sea.$" Route15_WestEntrance_2F_Text_SmallIslandOnHorizon:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "It looks like a small island on\n" .string "the horizon!$" ================================================ FILE: data/maps/Route16/map.json ================================================ { "id": "MAP_ROUTE16", "name": "Route16", "layout": "LAYOUT_ROUTE16", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_16", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": 0, "map": "MAP_ROUTE17" }, { "direction": "right", "offset": -10, "map": "MAP_CELADON_CITY" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 16, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route16_EventScript_Lao", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUE_BALL", "x": 14, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route16_EventScript_Koji", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUE_BALL", "x": 12, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route16_EventScript_Luke", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 8, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route16_EventScript_Ruben", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 10, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route16_EventScript_Hideo", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUE_BALL", "x": 6, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route16_EventScript_Camron", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 41, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_16_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNG_COUPLE_F", "x": 30, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route16_EventScript_Lea", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNG_COUPLE_M", "x": 31, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route16_EventScript_Jed", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SNORLAX", "in_connection": false, "x": 31, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route16_EventScript_Snorlax", "flag": "FLAG_HIDE_ROUTE_16_SNORLAX" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BIRD_KEEPER", "in_connection": false, "x": 4, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Pidgeotto", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 36, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Snorlax", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 28, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Eevee", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 10, "y": 5, "elevation": 0, "dest_map": "MAP_ROUTE16_HOUSE", "dest_warp_id": "1" }, { "x": 20, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE16_NORTH_ENTRANCE_1F", "dest_warp_id": "0" }, { "x": 27, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE16_NORTH_ENTRANCE_1F", "dest_warp_id": "1" }, { "x": 20, "y": 13, "elevation": 3, "dest_map": "MAP_ROUTE16_NORTH_ENTRANCE_1F", "dest_warp_id": "2" }, { "x": 27, "y": 13, "elevation": 3, "dest_map": "MAP_ROUTE16_NORTH_ENTRANCE_1F", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 6, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route16_EventScript_RouteSign" }, { "type": "sign", "x": 33, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route16_EventScript_CyclingRoadSign" }, { "type": "hidden_item", "x": 31, "y": 13, "elevation": 3, "item": "ITEM_LEFTOVERS", "flag": "FLAG_HIDDEN_ITEM_ROUTE16_LEFTOVERS", "quantity": 1, "underfoot": true } ], "level_scaling": "2" } ================================================ FILE: data/maps/Route16/scripts.inc ================================================ .set LOCALID_PIDGEOTTO_MASTER, 11 .set LOCALID_SNORLAX_MASTER, 12 .set LOCALID_EEVEE_MASTER, 13 .set TRAINER, VAR_0x8009 Route16_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, Route16_OnResume map_script MAP_SCRIPT_ON_TRANSITION, Route16_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, Route16_OnWarp .byte 0 Route16_OnResume:: call_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, Route16_EventScript_RemoveSnorlax end Route16_EventScript_RemoveSnorlax:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return removeobject VAR_LAST_TALKED return Route16_OnTransition:: call_if_set FLAG_WOKE_UP_ROUTE_16_SNORLAX, Route16_EventScript_HideSnorlax call_if_unset FLAG_WOKE_UP_ROUTE_16_SNORLAX, Route16_EventScript_TryShowSnorlax call_if_eq VAR_MAP_SCENE_ROUTE16, 1, Route16_OnTransitionCyclingRoad goto Route16_MapScript_SetMasterTrainerMovementTypes end Route16_OnTransitionCyclingRoad:: setflag FLAG_SYS_ON_CYCLING_ROAD return Route16_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PIDGEOTTO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route16_MapScript_PidgeottoMasterMovementType setvar TRAINER, MASTER_SNORLAX callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route16_MapScript_SnorlaxMasterMovementType setvar TRAINER, MASTER_EEVEE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route16_MapScript_EeveeMasterMovementType end Route16_MapScript_PidgeottoMasterMovementType:: setobjectmovementtype LOCALID_PIDGEOTTO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route16_MapScript_SnorlaxMasterMovementType:: setobjectmovementtype LOCALID_SNORLAX_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route16_MapScript_EeveeMasterMovementType:: setobjectmovementtype LOCALID_EEVEE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route16_EventScript_HideSnorlax:: setflag FLAG_HIDE_ROUTE_16_SNORLAX return Route16_EventScript_TryShowSnorlax:: goto_if_set FLAG_ROUTE_16_SNORLAX_RETURNED_TO_MOUNTAINS, EventScript_Return clearflag FLAG_HIDE_ROUTE_16_SNORLAX return Route16_OnWarp:: map_script_2 VAR_MAP_SCENE_ROUTE16, 1, Route16_OnWarpCyclingRoad .2byte 0 Route16_OnWarpCyclingRoad:: special ForcePlayerOntoBike end Route16_EventScript_Snorlax:: lock faceplayer goto_if_unset FLAG_GOT_POKE_FLUTE, Route16_EventScript_SnorlaxNoPokeFlute goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording msgbox Text_WantToUsePokeFlute, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Route16_EventScript_DontUsePokeFlute call EventScript_AwakenSnorlax setwildbattle SPECIES_SNORLAX, 30 waitse playmoncry SPECIES_SNORLAX, CRY_MODE_ENCOUNTER delay 40 waitmoncry setflag FLAG_HIDE_ROUTE_16_SNORLAX setflag FLAG_SYS_SPECIAL_WILD_BATTLE dowildbattle clearflag FLAG_SYS_SPECIAL_WILD_BATTLE specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, Route16_EventScript_FoughtSnorlax goto_if_eq VAR_RESULT, B_OUTCOME_RAN, Route16_EventScript_FoughtSnorlax goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, Route16_EventScript_FoughtSnorlax setflag FLAG_WOKE_UP_ROUTE_16_SNORLAX release end Route16_EventScript_DontUsePokeFlute:: release end Route16_EventScript_FoughtSnorlax:: setflag FLAG_ROUTE_16_SNORLAX_RETURNED_TO_MOUNTAINS fadescreenswapbuffers FADE_TO_BLACK removeobject VAR_LAST_TALKED fadescreenswapbuffers FADE_FROM_BLACK msgbox Text_SnorlaxReturnedToMountains release end Route16_EventScript_SnorlaxNoPokeFlute:: msgbox Route16_Text_MonSprawledOutInSlumber release end Route16_EventScript_CyclingRoadSign:: msgbox Route16_Text_CyclingRoadSign, MSGBOX_SIGN end Route16_EventScript_RouteSign:: msgbox Route16_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route16/text.inc ================================================ Route16_Text_LaoIntro:: .string "What do you want?$" Route16_Text_LaoDefeat:: .string "Don't you dare laugh!$" Route16_Text_LaoPostBattle:: .string "We like just hanging here.\n" .string "What's it to you?$" Route16_Text_KojiIntro:: .string "Nice BIKE!\n" .string "Hand it over!$" Route16_Text_KojiDefeat:: .string "Knockout!$" Route16_Text_KojiPostBattle:: .string "Forget it, who needs your BIKE!$" Route16_Text_LukeIntro:: .string "Come out and play, little mouse!$" Route16_Text_LukeDefeat:: .string "You little rat!$" Route16_Text_LukePostBattle:: .string "I hate losing!\n" .string "Get out of my face!$" Route16_Text_HideoIntro:: .string "Hey, you just bumped me!$" Route16_Text_HideoDefeat:: .string "Kaboom!$" Route16_Text_HideoPostBattle:: .string "We'll always be hanging around here\n" .string "even if you don't like it.\p" .string "You can detour to VERMILION from\n" .string "FUCHSIA going along the coast.$" Route16_Text_CamronIntro:: .string "I'm feeling hungry and mean!\n" .string "I need a punching bag!$" Route16_Text_CamronDefeat:: .string "Bad, bad, bad!$" Route16_Text_CamronPostBattle:: .string "If I'm going to have POKéMON, they\n" .string "may as well be ferocious.\p" .string "I'd use them to leave my enemies\n" .string "in tatters.$" Route16_Text_RubenIntro:: .string "Hey, there!\n" .string "Let's have ourselves a good time!$" Route16_Text_RubenDefeat:: .string "Don't make me mad!$" Route16_Text_RubenPostBattle:: .string "I get my kicks by harassing people\n" .string "with my stinking POKéMON.\p" .string "They're great for startling people.\n" .string "And, they bite, too.$" Route16_Text_MonSprawledOutInSlumber:: .string "A POKéMON is sprawled out in\n" .string "a deep and comfortable slumber.$" Route16_Text_CyclingRoadSign:: .string "Enjoy the slope!\n" .string "CYCLING ROAD$" Route16_Text_RouteSign:: .string "ROUTE 16\n" .string "CELADON CITY - FUCHSIA CITY$" Route16_Text_JedIntro:: .string "JED: Our love knows no bounds.\n" .string "We're in love and we show it!$" Route16_Text_JedDefeat:: .string "JED: Oh, no!\n" .string "My love has seen me as a loser!$" Route16_Text_JedPostBattle:: .string "JED: Listen, LEA.\n" .string "You need to focus less on me.$" Route16_Text_JedNotEnoughMons:: .string "JED: You have just one POKéMON?\n" .string "Is there no love in your heart?$" Route16_Text_LeaIntro:: .string "LEA: Sometimes, the intensity of\n" .string "our love scares me.$" Route16_Text_LeaDefeat:: .string "LEA: Ohh! But JED looks cool\n" .string "even in a loss!$" Route16_Text_LeaPostBattle:: .string "LEA: Ehehe, I'm sorry.\n" .string "JED is so cool.$" Route16_Text_LeaNotEnoughMons:: .string "LEA: Oh, you don't have two\n" .string "POKéMON with you?\p" .string "Doesn't it feel lonely for you or\n" .string "your POKéMON?$" ================================================ FILE: data/maps/Route16_House/map.json ================================================ { "id": "MAP_ROUTE16_HOUSE", "name": "Route16_House", "layout": "LAYOUT_HOUSE1", "music": "MUS_CELADON", "region_map_section": "MAPSEC_ROUTE_16", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route16_House_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FEAROW", "x": 9, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route16_House_EventScript_Fearow", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_ROUTE16", "dest_warp_id": "0" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_ROUTE16", "dest_warp_id": "0" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_ROUTE16", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route16_House/scripts.inc ================================================ Route16_House_MapScripts:: .byte 0 Route16_House_EventScript_Woman:: lock faceplayer goto_if_set FLAG_GOT_HM02, Route16_House_EventScript_AlreadyGotHM02 msgbox Route16_House_Text_FoundMySecretRetreat checkitemspace ITEM_HM02 goto_if_eq VAR_RESULT, FALSE, Route16_House_EventScript_NoRoomForHM02 giveitem_msg Route16_House_Text_ReceivedHM02FromGirl, ITEM_HM02 msgbox Route16_House_Text_ExplainHM02 setflag FLAG_GOT_HM02 release end Route16_House_EventScript_NoRoomForHM02:: msgbox Route16_House_Text_DontHaveAnyRoomForThis release end Route16_House_EventScript_AlreadyGotHM02:: msgbox Route16_House_Text_ExplainHM02 release end Route16_House_EventScript_Fearow:: lock faceplayer waitse playmoncry SPECIES_FEAROW, CRY_MODE_NORMAL msgbox Route16_House_Text_Fearow waitmoncry release end ================================================ FILE: data/maps/Route16_House/text.inc ================================================ Route16_House_Text_FoundMySecretRetreat:: .string "Oh, dear.\n" .string "You've found my secret retreat.\p" .string "Please don't tell anyone I'm here.\n" .string "I'll make it up to you with this!$" Route16_House_Text_ReceivedHM02FromGirl:: .string "{PLAYER} received HM02\n" .string "from the girl.$" Route16_House_Text_ExplainHM02:: .string "HM02 is FLY.\n" .string "It's a wonderfully convenient move.\p" .string "Please, put it to good use.$" Route16_House_Text_DontHaveAnyRoomForThis:: .string "You don't have any room for this.$" Route16_House_Text_Fearow:: .string "FEAROW: Kyueen!$" ================================================ FILE: data/maps/Route16_NorthEntrance_1F/map.json ================================================ { "id": "MAP_ROUTE16_NORTH_ENTRANCE_1F", "name": "Route16_NorthEntrance_1F", "layout": "LAYOUT_ROUTE16_NORTH_ENTRANCE_1F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_16", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 6, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route16_NorthEntrance_1F_EventScript_Guard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route16_NorthEntrance_1F_EventScript_OldMan", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Electrode", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 1, "y": 3, "elevation": 3, "dest_map": "MAP_ROUTE16", "dest_warp_id": "1" }, { "x": 11, "y": 3, "elevation": 3, "dest_map": "MAP_ROUTE16", "dest_warp_id": "2" }, { "x": 1, "y": 12, "elevation": 3, "dest_map": "MAP_ROUTE16", "dest_warp_id": "3" }, { "x": 11, "y": 12, "elevation": 3, "dest_map": "MAP_ROUTE16", "dest_warp_id": "4" }, { "x": 9, "y": 16, "elevation": 3, "dest_map": "MAP_ROUTE16_NORTH_ENTRANCE_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 12, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "1", "script": "EventScript_SetExitingCyclingRoad" }, { "type": "trigger", "x": 2, "y": 12, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "0", "script": "EventScript_SetEnteringCyclingRoad" }, { "type": "trigger", "x": 6, "y": 10, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerTop" }, { "type": "trigger", "x": 6, "y": 11, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerMidTop" }, { "type": "trigger", "x": 1, "y": 13, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "0", "script": "EventScript_SetEnteringCyclingRoad" }, { "type": "trigger", "x": 1, "y": 11, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "0", "script": "EventScript_SetEnteringCyclingRoad" }, { "type": "trigger", "x": 11, "y": 11, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "1", "script": "EventScript_SetExitingCyclingRoad" }, { "type": "trigger", "x": 11, "y": 13, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "1", "script": "EventScript_SetExitingCyclingRoad" }, { "type": "trigger", "x": 6, "y": 12, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerMid" }, { "type": "trigger", "x": 6, "y": 13, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerMidBottom" }, { "type": "trigger", "x": 6, "y": 14, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerBottom" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Route16_NorthEntrance_1F/scripts.inc ================================================ .set LOCALID_ELECTRODE_MASTER, 3 .set TRAINER, VAR_0x8009 Route16_NorthEntrance_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route16_NorthEntrance_1F_OnTransition .byte 0 Route16_NorthEntrance_1F_OnTransition:: clearflag FLAG_SYS_ON_CYCLING_ROAD call_if_set FLAG_GOT_BICYCLE, Route16_NorthEntrance_1F_EventScript_DisableNeedBikeTrigger goto Route16_NorthEntrance_1F_MapScript_SetMasterTrainerMovementTypes end Route16_NorthEntrance_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_ELECTRODE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route16_NorthEntrance_1F_MapScript_ElectrodeMasterMovementType end Route16_NorthEntrance_1F_MapScript_ElectrodeMasterMovementType:: setobjectmovementtype LOCALID_ELECTRODE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route16_NorthEntrance_1F_EventScript_DisableNeedBikeTrigger:: setvar VAR_TEMP_1, 1 return Route16_NorthEntrance_1F_EventScript_Guard:: msgbox Route16_NorthEntrance_1F_Text_CyclingRoadIsDownhillCourse, MSGBOX_NPC end Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerTop:: lockall setvar VAR_0x8008, 0 goto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger end Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerMidTop:: lockall setvar VAR_0x8008, 1 goto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger end Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerMid:: lockall setvar VAR_0x8008, 2 goto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger end Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerMidBottom:: lockall setvar VAR_0x8008, 3 goto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger end Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerBottom:: lockall setvar VAR_0x8008, 4 goto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger end Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger:: textcolor NPC_TEXT_COLOR_MALE msgbox Route16_NorthEntrance_1F_Text_ExcuseMeWaitUp closemessage applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 20 call_if_eq VAR_0x8008, 1, Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMidTop call_if_eq VAR_0x8008, 2, Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMid call_if_eq VAR_0x8008, 3, Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMidBottom call_if_eq VAR_0x8008, 4, Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterBottom msgbox Route16_NorthEntrance_1F_Text_NoPedestriansOnCyclingRoad closemessage applymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkRight waitmovement 0 releaseall end Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMidTop:: applymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkUp waitmovement 0 return Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMid:: applymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkUp2 waitmovement 0 return Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMidBottom:: applymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkUp3 waitmovement 0 return Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterBottom:: applymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkUp4 waitmovement 0 return Route16_NorthEntrance_1F_Movement_WalkUp:: walk_up step_end Route16_NorthEntrance_1F_Movement_WalkUp2:: walk_up walk_up step_end Route16_NorthEntrance_1F_Movement_WalkUp3:: walk_up walk_up walk_up step_end Route16_NorthEntrance_1F_Movement_WalkUp4:: walk_up walk_up walk_up walk_up step_end Route16_NorthEntrance_1F_Movement_WalkRight:: walk_right step_end Route16_NorthEntrance_1F_EventScript_OldMan:: msgbox Route16_NorthEntrance_1F_Text_HowdYouGetInGoodEffort, MSGBOX_NPC end ================================================ FILE: data/maps/Route16_NorthEntrance_1F/text.inc ================================================ Route16_NorthEntrance_1F_Text_NoPedestriansOnCyclingRoad:: .string "No pedestrians are allowed on\n" .string "CYCLING ROAD!$" Route16_NorthEntrance_1F_Text_CyclingRoadIsDownhillCourse:: .string "CYCLING ROAD is a downhill course\n" .string "by the sea. It's a great ride.$" Route16_NorthEntrance_1F_Text_ExcuseMeWaitUp:: .string "Excuse me!\n" .string "Wait up, please!$" Route16_NorthEntrance_1F_Text_HowdYouGetInGoodEffort:: .string "How'd you get in?\n" .string "Good effort!$" ================================================ FILE: data/maps/Route16_NorthEntrance_2F/map.json ================================================ { "id": "MAP_ROUTE16_NORTH_ENTRANCE_2F", "name": "Route16_NorthEntrance_2F", "layout": "LAYOUT_ENTRANCE_2F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_16", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 6, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route16_NorthEntrance_2F_EventScript_LittleBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 4, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route16_NorthEntrance_2F_EventScript_LittleGirl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 10, "y": 6, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route16_NorthEntrance_2F_EventScript_Aide", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_YOUNGSTER", "in_connection": false, "x": 7, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Lickitung", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 10, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE16_NORTH_ENTRANCE_1F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route16_NorthEntrance_2F_EventScript_LeftBinoculars" }, { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route16_NorthEntrance_2F_EventScript_RightBinoculars" } ], "level_scaling": "0" } ================================================ FILE: data/maps/Route16_NorthEntrance_2F/scripts.inc ================================================ .equ REQUIRED_CAUGHT_MONS, 40 .set LOCALID_LICKITUNG_MASTER, 4 .set TRAINER, VAR_0x8009 Route16_NorthEntrance_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route16_NorthEntrance_2F_MapScript_SetMasterTrainerMovementTypes .byte 0 Route16_NorthEntrance_2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_LICKITUNG callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route16_NorthEntrance_2F_MapScript_LickitungMasterMovementType end Route16_NorthEntrance_2F_MapScript_LickitungMasterMovementType:: setobjectmovementtype LOCALID_LICKITUNG_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route16_NorthEntrance_2F_EventScript_LittleBoy:: msgbox Route16_NorthEntrance_2F_Text_OnBikeRideWithGirlfriend, MSGBOX_NPC end Route16_NorthEntrance_2F_EventScript_LittleGirl:: msgbox Route16_NorthEntrance_2F_Text_RidingTogetherOnNewBikes, MSGBOX_NPC end Route16_NorthEntrance_2F_EventScript_LeftBinoculars:: msgbox Route16_NorthEntrance_2F_Text_ItsCeladonDeptStore, MSGBOX_SIGN end Route16_NorthEntrance_2F_EventScript_RightBinoculars:: msgbox Route16_NorthEntrance_2F_Text_LongPathOverWater, MSGBOX_SIGN end Route16_NorthEntrance_2F_EventScript_Aide:: lock faceplayer call Route16_NorthEntrance_2F_EventScript_GetAideRequestInfo goto_if_set FLAG_GOT_AMULET_COIN_FROM_OAKS_AIDE, Route16_NorthEntrance_2F_EventScript_AlreadyGotAmuletCoin msgbox Route16_NorthEntrance_2F_Text_GiveAmuletCoinIfCaught40, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons setvar VAR_0x8004, 0 specialvar VAR_RESULT, GetPokedexCount buffernumberstring STR_VAR_3, VAR_0x8006 call Route16_NorthEntrance_2F_EventScript_GetAideRequestInfo goto_if_lt VAR_0x8006, REQUIRED_CAUGHT_MONS, Aide_EventScript_HaventCaughtEnough msgbox Route16_NorthEntrance_2F_Text_GreatHereYouGo checkitemspace ITEM_AMULET_COIN goto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem giveitem_msg Route16_NorthEntrance_2F_Text_ReceivedAmuletCoinFromAide, ITEM_AMULET_COIN setflag FLAG_GOT_AMULET_COIN_FROM_OAKS_AIDE msgbox Route16_NorthEntrance_2F_Text_ExplainAmuletCoin release end Route16_NorthEntrance_2F_EventScript_AlreadyGotAmuletCoin:: msgbox Route16_NorthEntrance_2F_Text_ExplainAmuletCoin release end Route16_NorthEntrance_2F_EventScript_GetAideRequestInfo:: buffernumberstring STR_VAR_1, REQUIRED_CAUGHT_MONS bufferitemname STR_VAR_2, ITEM_AMULET_COIN return ================================================ FILE: data/maps/Route16_NorthEntrance_2F/text.inc ================================================ Route16_NorthEntrance_2F_Text_OnBikeRideWithGirlfriend:: .string "I'm on a relaxing ride on my new\n" .string "bike with my girlfriend.$" Route16_NorthEntrance_2F_Text_RidingTogetherOnNewBikes:: .string "We're going riding together on our\n" .string "new bikes.$" Route16_NorthEntrance_2F_Text_ItsCeladonDeptStore:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "It's the CELADON DEPT. STORE!$" Route16_NorthEntrance_2F_Text_LongPathOverWater:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "There's a long path over water far\n" .string "away.$" Route16_NorthEntrance_2F_Text_GiveAmuletCoinIfCaught40:: .string "Hi! Remember me?\n" .string "I'm one of PROF. OAK's AIDES.\p" .string "If your POKéDEX has complete data\n" .string "on 40 species, I'm supposed to\l" .string "give you a reward.\p" .string "PROF. OAK entrusted me with an\n" .string "AMULET COIN for you.\p" .string "So, {PLAYER}, let me ask you.\p" .string "Have you gathered data on at least\n" .string "40 kinds of POKéMON?$" Route16_NorthEntrance_2F_Text_GreatHereYouGo:: .string "Great! You have caught or owned\n" .string "{STR_VAR_3} kinds of POKéMON!\p" .string "Congratulations!\n" .string "Here you go!$" Route16_NorthEntrance_2F_Text_ReceivedAmuletCoinFromAide:: .string "{PLAYER} received the AMULET COIN\n" .string "from the AIDE.$" Route16_NorthEntrance_2F_Text_ExplainAmuletCoin:: .string "An AMULET COIN is an item to be\n" .string "held by a POKéMON.\p" .string "If the POKéMON appears in a winning\n" .string "battle, you will earn more money.$" ================================================ FILE: data/maps/Route17/map.json ================================================ { "id": "MAP_ROUTE17", "name": "Route17", "layout": "LAYOUT_ROUTE17", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_17", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ROUTE16" }, { "direction": "down", "offset": 0, "map": "MAP_ROUTE18" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 4, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 6, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route17_EventScript_Virgil", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUE_BALL", "x": 11, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 5, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route17_EventScript_Isaiah", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUE_BALL", "x": 15, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP", "movement_range_x": 4, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route17_EventScript_Raul", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 18, "y": 41, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 5, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route17_EventScript_Nikolas", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 7, "y": 38, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route17_EventScript_Billy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUE_BALL", "x": 2, "y": 61, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route17_EventScript_Jamal", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUE_BALL", "x": 21, "y": 61, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route17_EventScript_Zeek", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUE_BALL", "x": 18, "y": 94, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 5, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route17_EventScript_Corey", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 16, "y": 134, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP", "movement_range_x": 8, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route17_EventScript_William", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 4, "y": 116, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 5, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route17_EventScript_Jaxon", "flag": "0" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 12, "y": 97, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route17_EventScript_RouteSign" }, { "type": "sign", "x": 12, "y": 83, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route17_EventScript_TrainerTips2" }, { "type": "sign", "x": 12, "y": 68, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route17_EventScript_TrainerTips1" }, { "type": "sign", "x": 12, "y": 53, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route17_EventScript_ItemsNotice" }, { "type": "sign", "x": 12, "y": 125, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route17_EventScript_BallsNotice" }, { "type": "sign", "x": 11, "y": 157, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route17_EventScript_CyclingRoadSign" }, { "type": "hidden_item", "x": 18, "y": 83, "elevation": 3, "item": "ITEM_RARE_CANDY", "flag": "FLAG_HIDDEN_ITEM_ROUTE17_RARE_CANDY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 10, "y": 53, "elevation": 3, "item": "ITEM_FULL_RESTORE", "flag": "FLAG_HIDDEN_ITEM_ROUTE17_FULL_RESTORE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 4, "y": 68, "elevation": 3, "item": "ITEM_PP_UP", "flag": "FLAG_HIDDEN_ITEM_ROUTE17_PP_UP", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 4, "y": 125, "elevation": 3, "item": "ITEM_MAX_REVIVE", "flag": "FLAG_HIDDEN_ITEM_ROUTE17_MAX_REVIVE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 14, "y": 157, "elevation": 3, "item": "ITEM_MAX_ELIXIR", "flag": "FLAG_HIDDEN_ITEM_ROUTE17_MAX_ELIXIR", "quantity": 1, "underfoot": false } ], "level_scaling": "3" } ================================================ FILE: data/maps/Route17/scripts.inc ================================================ Route17_MapScripts:: .byte 0 Route17_EventScript_ItemsNotice:: msgbox Route17_Text_WatchOutForDiscardedItems, MSGBOX_SIGN end Route17_EventScript_TrainerTips1:: msgbox Route17_Text_SameSpeciesGrowDifferentRates, MSGBOX_SIGN end Route17_EventScript_TrainerTips2:: msgbox Route17_Text_PressBToStayInPlace, MSGBOX_SIGN end Route17_EventScript_RouteSign:: msgbox Route17_Text_RouteSign, MSGBOX_SIGN end Route17_EventScript_BallsNotice:: msgbox Route17_Text_DontThrowGameThrowBalls, MSGBOX_SIGN end Route17_EventScript_CyclingRoadSign:: msgbox Route17_Text_CyclingRoadSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route17/text.inc ================================================ Route17_Text_RaulIntro:: .string "There's no getting rich quick in\n" .string "battling kids.$" Route17_Text_RaulDefeat:: .string "Burned out!$" Route17_Text_RaulPostBattle:: .string "You can find good stuff lying\n" .string "around on CYCLING ROAD.\p" .string "There's good money in picking them\n" .string "up and selling them.$" Route17_Text_IsaiahIntro:: .string "I'm mighty proud of my bod, kiddo.\n" .string "Come on!$" Route17_Text_IsaiahDefeat:: .string "Whoo!$" Route17_Text_IsaiahPostBattle:: .string "I could belly-bump you outta\n" .string "here!$" Route17_Text_VirgilIntro:: .string "You heading to FUCHSIA?$" Route17_Text_VirgilDefeat:: .string "Crash and burn!$" Route17_Text_VirgilPostBattle:: .string "I love racing downhill!$" Route17_Text_BillyIntro:: .string "We're BIKERS!\n" .string "We rule the roads, man!$" Route17_Text_BillyDefeat:: .string "Smoked!$" Route17_Text_BillyPostBattle:: .string "Are you looking for adventure?$" Route17_Text_NikolasIntro:: .string "Let VOLTORB electrify you!$" Route17_Text_NikolasDefeat:: .string "Grounded out!$" Route17_Text_NikolasPostBattle:: .string "I got my VOLTORB at the abandoned\n" .string "POWER PLANT.$" Route17_Text_ZeekIntro:: .string "I leveled up my POKéMON, but it\n" .string "won't evolve. Why?$" Route17_Text_ZeekDefeat:: .string "Why, you!$" Route17_Text_ZeekPostBattle:: .string "Maybe some POKéMON need element\n" .string "STONES to evolve.$" Route17_Text_JamalIntro:: .string "I need a little exercise!$" Route17_Text_JamalDefeat:: .string "Whew!\n" .string "Good workout!$" Route17_Text_JamalPostBattle:: .string "I'm sure I lost weight there!$" Route17_Text_CoreyIntro:: .string "Be a rebel!$" Route17_Text_CoreyDefeat:: .string "Aaaargh!$" Route17_Text_CoreyPostBattle:: .string "Be ready to fight for your beliefs!$" Route17_Text_JaxonIntro:: .string "Nice BIKE!\n" .string "How's it handle?$" Route17_Text_JaxonDefeat:: .string "Shoot!$" Route17_Text_JaxonPostBattle:: .string "The slope makes it hard to steer.$" Route17_Text_WilliamIntro:: .string "Get lost, kid!\n" .string "I'm bushed!$" Route17_Text_WilliamDefeat:: .string "Are you satisfied?$" Route17_Text_WilliamPostBattle:: .string "I need to catch a few z's!$" Route17_Text_WatchOutForDiscardedItems:: .string "It's a notice.\p" .string "Watch out for discarded items.$" Route17_Text_SameSpeciesGrowDifferentRates:: .string "TRAINER TIPS\p" .string "All POKéMON are unique.\p" .string "Even POKéMON of the same species\n" .string "and level grow at different rates.$" Route17_Text_PressBToStayInPlace:: .string "TRAINER TIPS\p" .string "Press the B Button to stay in place\n" .string "while on a slope.$" Route17_Text_RouteSign:: .string "ROUTE 17\n" .string "CELADON CITY - FUCHSIA CITY$" Route17_Text_DontThrowGameThrowBalls:: .string "It's a notice!\p" .string "Don't throw the game, throw POKé\n" .string "BALLS instead!$" Route17_Text_CyclingRoadSign:: .string "CYCLING ROAD\n" .string "Slope ends here!$" ================================================ FILE: data/maps/Route18/map.json ================================================ { "id": "MAP_ROUTE18", "name": "Route18", "layout": "LAYOUT_ROUTE18", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_18", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ROUTE17" }, { "direction": "right", "offset": -10, "map": "MAP_FUCHSIA_CITY" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 46, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route18_EventScript_Jacob", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 41, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route18_EventScript_Ramiro", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 39, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "6", "script": "Route18_EventScript_Wilton", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 49, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Caterpie", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BIRD_KEEPER", "in_connection": false, "x": 39, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Fearow", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 46, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Rhyhorn", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 41, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE18_EAST_ENTRANCE_1F", "dest_warp_id": "0" }, { "x": 48, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE18_EAST_ENTRANCE_1F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 37, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route18_EventScript_CyclingRoadSign" }, { "type": "sign", "x": 52, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route18_EventScript_RouteSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/Route18/scripts.inc ================================================ .set LOCALID_CATERPIE_MASTER, 4 .set LOCALID_FEAROW_MASTER, 5 .set LOCALID_RHYHORN_MASTER, 6 .set TRAINER, VAR_0x8009 Route18_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route18_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, Route18_OnWarp .byte 0 Route18_OnTransition:: compare VAR_MAP_SCENE_ROUTE16, 1 call_if_eq Route18_OnTransitionCyclingRoad goto Route18_MapScript_SetMasterTrainerMovementTypes end Route18_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_CATERPIE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route18_MapScript_CaterpieMasterMovementType setvar TRAINER, MASTER_FEAROW callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route18_MapScript_FearowMasterMovementType setvar TRAINER, MASTER_RHYHORN callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route18_MapScript_RhyhornMasterMovementType end Route18_MapScript_CaterpieMasterMovementType:: setobjectmovementtype LOCALID_CATERPIE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route18_MapScript_FearowMasterMovementType:: setobjectmovementtype LOCALID_FEAROW_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route18_MapScript_RhyhornMasterMovementType:: setobjectmovementtype LOCALID_RHYHORN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route18_OnTransitionCyclingRoad:: setflag FLAG_SYS_ON_CYCLING_ROAD return Route18_OnWarp:: map_script_2 VAR_MAP_SCENE_ROUTE16, 1, Route18_OnWarpCyclingRoad .2byte 0 Route18_OnWarpCyclingRoad:: special ForcePlayerOntoBike end Route18_EventScript_RouteSign:: msgbox Route18_Text_RouteSign, MSGBOX_SIGN end Route18_EventScript_CyclingRoadSign:: msgbox Route18_Text_CyclingRoadSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route18/text.inc ================================================ Route18_Text_WiltonIntro:: .string "I always check every grassy area\n" .string "for new POKéMON.$" Route18_Text_WiltonDefeat:: .string "Tch!$" Route18_Text_WiltonPostBattle:: .string "I wish I had a BIKE!$" Route18_Text_RamiroIntro:: .string "Kurukkoo!\n" .string "How do you like my birdcall?$" Route18_Text_RamiroDefeat:: .string "I had to bug you!$" Route18_Text_RamiroPostBattle:: .string "I collect sea POKéMON on weekends\n" .string "because the sea is so close.$" Route18_Text_JacobIntro:: .string "This is my turf!\n" .string "Get out of here!$" Route18_Text_JacobDefeat:: .string "Darn!$" Route18_Text_JacobPostBattle:: .string "This is my fave area for catching\n" .string "POKéMON.$" Route18_Text_RouteSign:: .string "ROUTE 18\n" .string "CELADON CITY - FUCHSIA CITY$" Route18_Text_CyclingRoadSign:: .string "CYCLING ROAD\n" .string "No pedestrians permitted!$" ================================================ FILE: data/maps/Route18_EastEntrance_1F/map.json ================================================ { "id": "MAP_ROUTE18_EAST_ENTRANCE_1F", "name": "Route18_EastEntrance_1F", "layout": "LAYOUT_ENTRANCE_1F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_18", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route18_EastEntrance_1F_EventScript_Guard", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 11, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Koffing", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE18", "dest_warp_id": "0" }, { "x": 11, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE18", "dest_warp_id": "1" }, { "x": 9, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE18_EAST_ENTRANCE_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 2, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "0", "script": "EventScript_SetEnteringCyclingRoad" }, { "type": "trigger", "x": 6, "y": 4, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route18_EastEntrance_1F_EventScript_NeedBikeTriggerTop" }, { "type": "trigger", "x": 6, "y": 5, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route18_EastEntrance_1F_EventScript_NeedBikeTriggerMidTop" }, { "type": "trigger", "x": 6, "y": 6, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route18_EastEntrance_1F_EventScript_NeedBikeTriggerMid" }, { "type": "trigger", "x": 6, "y": 7, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route18_EastEntrance_1F_EventScript_NeedBikeTriggerMidBottom" }, { "type": "trigger", "x": 6, "y": 8, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "0", "script": "Route18_EastEntrance_1F_EventScript_NeedBikeTriggerBottom" }, { "type": "trigger", "x": 10, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "1", "script": "EventScript_SetExitingCyclingRoad" }, { "type": "trigger", "x": 11, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "1", "script": "EventScript_SetExitingCyclingRoad" }, { "type": "trigger", "x": 11, "y": 7, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "1", "script": "EventScript_SetExitingCyclingRoad" }, { "type": "trigger", "x": 1, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "0", "script": "EventScript_SetEnteringCyclingRoad" }, { "type": "trigger", "x": 1, "y": 7, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE16", "var_value": "0", "script": "EventScript_SetEnteringCyclingRoad" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Route18_EastEntrance_1F/scripts.inc ================================================ .set LOCALID_KOFFING_MASTER, 2 .set TRAINER, VAR_0x8009 Route18_EastEntrance_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route18_EastEntrance_1F_OnTransition .byte 0 Route18_EastEntrance_1F_OnTransition:: clearflag FLAG_SYS_ON_CYCLING_ROAD call_if_set FLAG_GOT_BICYCLE, Route18_EastEntrance_1F_EventScript_DisableNeedBikeTrigger goto Route18_EastEntrance_1F_MapScript_SetMasterTrainerMovementTypes end Route18_EastEntrance_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_KOFFING callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route18_EastEntrance_1F_MapScript_KoffingMasterMovementType end Route18_EastEntrance_1F_MapScript_KoffingMasterMovementType:: setobjectmovementtype LOCALID_KOFFING_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route18_EastEntrance_1F_EventScript_DisableNeedBikeTrigger:: setvar VAR_TEMP_1, 1 return Route18_EastEntrance_1F_EventScript_Guard:: msgbox Route18_EastEntrance_1F_Text_CyclingRoadAllUphillFromHere, MSGBOX_NPC end Route18_EastEntrance_1F_EventScript_NeedBikeTriggerTop:: lockall setvar VAR_0x8008, 0 goto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger end Route18_EastEntrance_1F_EventScript_NeedBikeTriggerMidTop:: lockall setvar VAR_0x8008, 1 goto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger end Route18_EastEntrance_1F_EventScript_NeedBikeTriggerMid:: lockall setvar VAR_0x8008, 2 goto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger end Route18_EastEntrance_1F_EventScript_NeedBikeTriggerMidBottom:: lockall setvar VAR_0x8008, 3 goto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger end Route18_EastEntrance_1F_EventScript_NeedBikeTriggerBottom:: lockall setvar VAR_0x8008, 4 goto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger end Route18_EastEntrance_1F_EventScript_NeedBikeTrigger:: textcolor NPC_TEXT_COLOR_MALE msgbox Route18_EastEntrance_1F_Text_ExcuseMe closemessage applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 20 call_if_eq VAR_0x8008, 1, Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterMidTop call_if_eq VAR_0x8008, 2, Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterMid call_if_eq VAR_0x8008, 3, Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterMidBottom call_if_eq VAR_0x8008, 4, Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterBottom msgbox Route18_EastEntrance_1F_Text_NeedBicycleForCyclingRoad closemessage applymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkRight waitmovement 0 releaseall end Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterMidTop:: applymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkUp waitmovement 0 return Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterMid:: applymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkUp2 waitmovement 0 return Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterMidBottom:: applymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkUp3 waitmovement 0 return Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterBottom:: applymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkUp4 waitmovement 0 return Route18_EastEntrance_1F_Movement_WalkUp:: walk_up step_end Route18_EastEntrance_1F_Movement_WalkUp2:: walk_up walk_up step_end Route18_EastEntrance_1F_Movement_WalkUp3:: walk_up walk_up walk_up step_end Route18_EastEntrance_1F_Movement_WalkUp4:: walk_up walk_up walk_up walk_up step_end Route18_EastEntrance_1F_Movement_WalkRight:: walk_right step_end ================================================ FILE: data/maps/Route18_EastEntrance_1F/text.inc ================================================ Route18_EastEntrance_1F_Text_NeedBicycleForCyclingRoad:: .string "You need a BICYCLE to go out on\n" .string "CYCLING ROAD!$" Route18_EastEntrance_1F_Text_CyclingRoadAllUphillFromHere:: .string "CYCLING ROAD is all uphill from\n" .string "here.$" Route18_EastEntrance_1F_Text_ExcuseMe:: .string "Excuse me!$" ================================================ FILE: data/maps/Route18_EastEntrance_2F/map.json ================================================ { "id": "MAP_ROUTE18_EAST_ENTRANCE_2F", "name": "Route18_EastEntrance_2F", "layout": "LAYOUT_ENTRANCE_2F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_18", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 5, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route18_EastEntrance_2F_EventScript_Haden", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 10, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Pinsir", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 10, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE18_EAST_ENTRANCE_1F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route18_EastEntrance_2F_EventScript_LeftBinoculars" }, { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route18_EastEntrance_2F_EventScript_RightBinoculars" } ], "level_scaling": "0" } ================================================ FILE: data/maps/Route18_EastEntrance_2F/scripts.inc ================================================ .set LOCALID_PINSIR_MASTER, 2 .set TRAINER, VAR_0x8009 Route18_EastEntrance_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route18_EastEntrance_2F_MapScript_SetMasterTrainerMovementTypes .byte 0 Route18_EastEntrance_2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PINSIR callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route18_EastEntrance_2F_MapScript_PinsirMasterMovementType end Route18_EastEntrance_2F_MapScript_PinsirMasterMovementType:: setobjectmovementtype LOCALID_PINSIR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route18_EastEntrance_2F_EventScript_LeftBinoculars:: msgbox Route18_EastEntrance_2F_Text_PalletTownInWest, MSGBOX_SIGN end Route18_EastEntrance_2F_EventScript_RightBinoculars:: msgbox Route18_EastEntrance_2F_Text_PeopleSwimming, MSGBOX_SIGN end Route18_EastEntrance_2F_EventScript_Haden:: lock faceplayer setvar VAR_0x8008, INGAME_TRADE_LICKITUNG call EventScript_GetInGameTradeSpeciesInfo callnative IsVersionFireRedToVarResult compare VAR_RESULT, TRUE call_if_eq Route18_EastEntrance_2F_EventScript_Haden_SetFRRequestedSpecies callnative IsVersionFireRedToVarResult compare VAR_RESULT, FALSE call_if_eq Route18_EastEntrance_2F_EventScript_Haden_SetLGRequestedSpecies goto_if_set FLAG_DID_MARC_TRADE, Route18_EastEntrance_2F_EventScript_AlreadyTraded msgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Route18_EastEntrance_2F_EventScript_DeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, Route18_EastEntrance_2F_EventScript_DeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, Route18_EastEntrance_2F_EventScript_NotRequestedMon call EventScript_DoInGameTrade msgbox Trade_Text_HeyThanks setflag FLAG_DID_MARC_TRADE release end Route18_EastEntrance_2F_EventScript_Haden_SetFRRequestedSpecies:: setvar 0x8009, SPECIES_GOLDUCK return Route18_EastEntrance_2F_EventScript_Haden_SetLGRequestedSpecies:: setvar 0x8009, SPECIES_SLOWBRO return Route18_EastEntrance_2F_EventScript_DeclineTrade:: msgbox Trade_Text_AwwOhWell release end Route18_EastEntrance_2F_EventScript_NotRequestedMon:: bufferspeciesname STR_VAR_1, VAR_0x8009 msgbox Trade_Text_WhatThatsNoMon release end Route18_EastEntrance_2F_EventScript_AlreadyTraded:: msgbox Trade_Text_IsntMyOldMonGreat release end ================================================ FILE: data/maps/Route18_EastEntrance_2F/text.inc ================================================ Route18_EastEntrance_2F_Text_PalletTownInWest:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "PALLET TOWN is in the west.$" Route18_EastEntrance_2F_Text_PeopleSwimming:: .string "Let's see what the binoculars have\n" .string "to show…\p" .string "There are people swimming.$" ================================================ FILE: data/maps/Route19/map.json ================================================ { "id": "MAP_ROUTE19", "name": "Route19", "layout": "LAYOUT_ROUTE19", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_19", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": -12, "map": "MAP_FUCHSIA_CITY" }, { "direction": "left", "offset": 40, "map": "MAP_ROUTE20" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_LAND", "in_connection": false, "x": 15, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 6, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route19_EventScript_Reece", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_LAND", "in_connection": false, "x": 10, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route19_EventScript_Richard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 12, "y": 17, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route19_EventScript_Tony", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 18, "y": 33, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN", "movement_range_x": 5, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route19_EventScript_Matthew", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 8, "y": 27, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route19_EventScript_Douglas", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 16, "y": 22, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "6", "script": "Route19_EventScript_David", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 11, "y": 47, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route19_EventScript_Axle", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 14, "y": 48, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route19_EventScript_Alice", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 12, "y": 49, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route19_EventScript_Connie", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 9, "y": 48, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route19_EventScript_Anya", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 8, "y": 41, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route19_EventScript_Lia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TUBER_M_WATER", "in_connection": false, "x": 9, "y": 41, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route19_EventScript_Luc", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BEAUTY", "in_connection": false, "x": 16, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Staryu", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 20, "y": 28, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Horsea", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 14, "y": 56, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Shellder", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 13, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route19_EventScript_RouteSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/Route19/scripts.inc ================================================ .set LOCALID_STARYU_MASTER, 13 .set LOCALID_HORSEA_MASTER, 14 .set LOCALID_SHELLDER_MASTER, 15 .set TRAINER, VAR_0x8009 Route19_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route19_MapScript_SetMasterTrainerMovementTypes .byte 0 Route19_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_STARYU callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route19_MapScript_StaryuMasterMovementType setvar TRAINER, MASTER_HORSEA callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route19_MapScript_HorseaMasterMovementType setvar TRAINER, MASTER_SHELLDER callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route19_MapScript_ShellderMasterMovementType end Route19_MapScript_StaryuMasterMovementType:: setobjectmovementtype LOCALID_STARYU_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route19_MapScript_HorseaMasterMovementType:: setobjectmovementtype LOCALID_HORSEA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return Route19_MapScript_ShellderMasterMovementType:: setobjectmovementtype LOCALID_SHELLDER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return Route19_EventScript_RouteSign:: msgbox Route19_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route19/text.inc ================================================ Route19_Text_RichardIntro:: .string "I have to exercise and warm up\n" .string "before going out for a swim.$" Route19_Text_RichardDefeat:: .string "All warmed up!$" Route19_Text_RichardPostBattle:: .string "Thanks, kid!\n" .string "I'm ready for a swim.$" Route19_Text_ReeceIntro:: .string "Wait! Slow down!\n" .string "You'll have a heart attack!$" Route19_Text_ReeceDefeat:: .string "Ooh!\n" .string "That's chilly!$" Route19_Text_ReecePostBattle:: .string "Watch out for TENTACOOL.\n" .string "They sting so painfully.$" Route19_Text_MatthewIntro:: .string "I love swimming!\n" .string "What about you?$" Route19_Text_MatthewDefeat:: .string "Belly flop!$" Route19_Text_MatthewPostBattle:: .string "I can beat even marine POKéMON\n" .string "at swimming.$" Route19_Text_DouglasIntro:: .string "What's beyond the horizon?$" Route19_Text_DouglasDefeat:: .string "Glub!$" Route19_Text_DouglasPostBattle:: .string "I see a couple of islands over\n" .string "yonder!$" Route19_Text_DavidIntro:: .string "I tried diving for POKéMON, but it\n" .string "was a no-go.$" Route19_Text_DavidDefeat:: .string "Help!$" Route19_Text_DavidPostBattle:: .string "I guess you have to fish for sea\n" .string "POKéMON.$" Route19_Text_TonyIntro:: .string "I look at the sea to forget all\n" .string "the bad things that happened.$" Route19_Text_TonyDefeat:: .string "Ooh!\n" .string "Traumatic!$" Route19_Text_TonyPostBattle:: .string "I'm looking at the sea to forget\n" .string "the bad thing that happened!$" Route19_Text_AnyaIntro:: .string "Oh, I just love your ride!\n" .string "Can I have it if I win?$" Route19_Text_AnyaDefeat:: .string "Oh! I lost!$" Route19_Text_AnyaPostBattle:: .string "It's still a long way to go to\n" .string "SEAFOAM ISLANDS…\p" .string "I want to go back to FUCHSIA…$" Route19_Text_AliceIntro:: .string "Swimming's great!\n" .string "Sunburns aren't!$" Route19_Text_AliceDefeat:: .string "Shocker!$" Route19_Text_AlicePostBattle:: .string "My boyfriend wanted to swim to\n" .string "SEAFOAM ISLANDS.$" Route19_Text_AxleIntro:: .string "Ahoy, there!\n" .string "These waters are treacherous!$" Route19_Text_AxleDefeat:: .string "Ooh!\n" .string "Dangerous!$" Route19_Text_AxlePostBattle:: .string "M-my legs! They cramped up!\n" .string "Glub, glub…$" Route19_Text_ConnieIntro:: .string "I swam here with my friends…\n" .string "I'm tired…$" Route19_Text_ConnieDefeat:: .string "I'm exhausted…$" Route19_Text_ConniePostBattle:: .string "If I were to ride a POKéMON on\n" .string "the sea, I'd like a LAPRAS.\p" .string "LAPRAS is so big, I bet it\n" .string "would keep me dry on water.$" Route19_Text_RouteSign:: .string "SEA ROUTE 19\n" .string "FUCHSIA CITY - SEAFOAM ISLANDS$" Route19_Text_LiaIntro:: .string "LIA: I'm looking after my brother.\n" .string "He just became a TRAINER.$" Route19_Text_LiaDefeat:: .string "LIA: That's no way to treat my\n" .string "little brother!$" Route19_Text_LiaPostBattle:: .string "LIA: Do you have a younger\n" .string "brother?\p" .string "I hope you're teaching him all\n" .string "sorts of things.$" Route19_Text_LiaNotEnoughMons:: .string "LIA: I want to battle together\n" .string "with my little brother.\p" .string "Don't you have two POKéMON?$" Route19_Text_LucIntro:: .string "LUC: My big sis taught me how\n" .string "to swim and train POKéMON.$" Route19_Text_LucDefeat:: .string "LUC: Oh, wow!\n" .string "Someone tougher than my big sis!$" Route19_Text_LucPostBattle:: .string "LUC: My big sis is strong and nice.\n" .string "I think she's awesome!$" Route19_Text_LucNotEnoughMons:: .string "LUC: I don't want to if I can't\n" .string "battle you with my big sis.\p" .string "Don't you have two POKéMON?$" ================================================ FILE: data/maps/Route19_UnusedHouse/map.json ================================================ { "id": "MAP_ROUTE19_UNUSED_HOUSE", "name": "Route19_UnusedHouse", "layout": "LAYOUT_HOUSE2", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_19", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route19_UnusedHouse/scripts.inc ================================================ Route19_UnusedHouse_MapScripts:: .byte 0 ================================================ FILE: data/maps/Route2/map.json ================================================ { "id": "MAP_ROUTE2", "name": "Route2", "layout": "LAYOUT_ROUTE2", "music": "MUS_ROUTE1", "region_map_section": "MAPSEC_ROUTE_2", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": -12, "map": "MAP_PEWTER_CITY" }, { "direction": "down", "offset": -12, "map": "MAP_VIRIDIAN_CITY" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 16, "y": 62, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_2_CUT_TREE_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 15, "y": 69, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_2_CUT_TREE_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 11, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_2_CUT_TREE_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 18, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_2_CUT_TREE_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 54, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_EventScript_ItemEther", "flag": "FLAG_HIDE_ROUTE2_ETHER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 64, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_EventScript_ItemParalyzeHeal", "flag": "FLAG_HIDE_ROUTE2_PARALYZE_HEAL" }, { "type": "clone", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "x": 6, "y": 85, "target_local_id": 8, "target_map": "MAP_VIRIDIAN_CITY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_BIRD_KEEPER", "in_connection": false, "x": 2, "y": 71, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Pidgey", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 21, "y": 75, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Parasect", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 5, "y": 13, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE", "dest_warp_id": "3" }, { "x": 6, "y": 13, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE", "dest_warp_id": "3" }, { "x": 5, "y": 51, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE", "dest_warp_id": "1" }, { "x": 17, "y": 11, "elevation": 3, "dest_map": "MAP_DIGLETTS_CAVE_NORTH_ENTRANCE", "dest_warp_id": "1" }, { "x": 17, "y": 22, "elevation": 0, "dest_map": "MAP_ROUTE2_HOUSE", "dest_warp_id": "1" }, { "x": 18, "y": 46, "elevation": 3, "dest_map": "MAP_ROUTE2_EAST_BUILDING", "dest_warp_id": "1" }, { "x": 18, "y": 41, "elevation": 3, "dest_map": "MAP_ROUTE2_EAST_BUILDING", "dest_warp_id": "3" }, { "x": 19, "y": 41, "elevation": 3, "dest_map": "MAP_ROUTE2_EAST_BUILDING", "dest_warp_id": "3" }, { "x": 19, "y": 46, "elevation": 3, "dest_map": "MAP_ROUTE2_EAST_BUILDING", "dest_warp_id": "1" }, { "x": 6, "y": 51, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 14, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route2_EventScript_DiglettsCaveSign" }, { "type": "sign", "x": 7, "y": 73, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route2_EventScript_RouteSign" } ], "level_scaling": "1" } ================================================ FILE: data/maps/Route2/scripts.inc ================================================ .set LOCALID_PIDGEY_MASTER, 8 .set LOCALID_PARASECT_MASTER, 9 .set TRAINER, VAR_0x8009 Route2_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, Route2_MapScript_FixLedgeForMasterTrainer map_script MAP_SCRIPT_ON_TRANSITION, Route2_MapScript_SetMasterTrainerMovementTypes .byte 0 Route2_MapScript_FixLedgeForMasterTrainer:: goto_if_set FLAG_HIDE_MASTER_TRAINERS, EventScript_ReleaseEnd setmetatile 2, 70, 0x2D7, 1 end Route2_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PIDGEY callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route2_MapScript_PidgeyMasterMovementType setvar TRAINER, MASTER_PARASECT callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route2_MapScript_ParasectMasterMovementType end Route2_MapScript_PidgeyMasterMovementType:: setobjectmovementtype LOCALID_PIDGEY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route2_MapScript_ParasectMasterMovementType:: setobjectmovementtype LOCALID_PARASECT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route2_EventScript_RouteSign:: msgbox Route2_Text_RouteSign, MSGBOX_SIGN end Route2_EventScript_DiglettsCaveSign:: msgbox Route2_Text_DiglettsCave, MSGBOX_SIGN end ================================================ FILE: data/maps/Route2/text.inc ================================================ Route2_Text_RouteSign:: .string "ROUTE 2\n" .string "VIRIDIAN CITY - PEWTER CITY$" Route2_Text_DiglettsCave:: .string "DIGLETT'S CAVE$" ================================================ FILE: data/maps/Route20/map.json ================================================ { "id": "MAP_ROUTE20", "name": "Route20", "layout": "LAYOUT_ROUTE20", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_20", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": 0, "map": "MAP_CINNABAR_ISLAND" }, { "direction": "right", "offset": -40, "map": "MAP_ROUTE19" }, { "direction": "dive", "offset": 0, "map": "MAP_ROUTE20_UNDERWATER" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 8, "y": 11, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route20_EventScript_Melissa", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 16, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route20_EventScript_Missy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 34, "y": 7, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route20_EventScript_Nora", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "x": 43, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route20_EventScript_Roger", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 23, "y": 10, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP", "movement_range_x": 5, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route20_EventScript_Dean", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 73, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route20_EventScript_Irene", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 111, "y": 9, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT", "movement_range_x": 5, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route20_EventScript_Barry", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 106, "y": 11, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT", "movement_range_x": 5, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route20_EventScript_Darrin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 93, "y": 10, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route20_EventScript_Shirley", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 54, "y": 11, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route20_EventScript_Tiffany", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 69, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route20_EventScript_Camper", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 82, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Blastoise", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 76, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Tentacool", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 63, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Cloyster", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 40, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Wartortle", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 22, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Tentacruel", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 60, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_1F", "dest_warp_id": "3" }, { "x": 72, "y": 14, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_1F", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 68, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route20_EventScript_SeafoamIslandsSign" }, { "type": "sign", "x": 64, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route20_EventScript_SeafoamIslandsSign" }, { "type": "hidden_item", "x": 23, "y": 6, "elevation": 3, "item": "ITEM_STARDUST", "flag": "FLAG_HIDDEN_ITEM_ROUTE20_STARDUST", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/Route20/scripts.inc ================================================ .set LOCALID_BLASTOISE_MASTER, 12 .set LOCALID_TENTACOOL_MASTER, 13 .set LOCALID_CLOYSTER_MASTER, 14 .set LOCALID_WARTORTLE_MASTER, 15 .set LOCALID_TENTACRUEL_MASTER, 16 .set TRAINER, VAR_0x8009 Route20_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route20_OnTransition .byte 0 Route20_OnTransition:: call_if_unset FLAG_STOPPED_SEAFOAM_B3F_CURRENT, Route20_EventScript_ResetSeafoamBouldersForB3F call_if_unset FLAG_STOPPED_SEAFOAM_B4F_CURRENT, Route20_EventScript_ResetSeafoamBouldersForB4F goto Route20_MapScript_SetMasterTrainerMovementTypes end Route20_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_BLASTOISE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route20_MapScript_BlastoiseMasterMovementType setvar TRAINER, MASTER_TENTACOOL callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route20_MapScript_TentacoolMasterMovementType setvar TRAINER, MASTER_CLOYSTER callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route20_MapScript_CloysterMasterMovementType setvar TRAINER, MASTER_WARTORTLE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route20_MapScript_WartortleMasterMovementType setvar TRAINER, MASTER_TENTACRUEL callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route20_MapScript_TentacruelMasterMovementType end Route20_MapScript_BlastoiseMasterMovementType:: setobjectmovementtype LOCALID_BLASTOISE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return Route20_MapScript_TentacoolMasterMovementType:: setobjectmovementtype LOCALID_TENTACOOL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route20_MapScript_CloysterMasterMovementType:: setobjectmovementtype LOCALID_CLOYSTER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return Route20_MapScript_WartortleMasterMovementType:: setobjectmovementtype LOCALID_WARTORTLE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return Route20_MapScript_TentacruelMasterMovementType:: setobjectmovementtype LOCALID_TENTACRUEL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route20_EventScript_ResetSeafoamBouldersForB3F:: clearflag FLAG_HIDE_SEAFOAM_1F_BOULDER_1 clearflag FLAG_HIDE_SEAFOAM_1F_BOULDER_2 setflag FLAG_HIDE_SEAFOAM_B1F_BOULDER_1 setflag FLAG_HIDE_SEAFOAM_B1F_BOULDER_2 setflag FLAG_HIDE_SEAFOAM_B2F_BOULDER_1 setflag FLAG_HIDE_SEAFOAM_B2F_BOULDER_2 setflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_1 setflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_2 return Route20_EventScript_ResetSeafoamBouldersForB4F:: clearflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_3 clearflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_4 clearflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_5 clearflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_6 setflag FLAG_HIDE_SEAFOAM_B4F_BOULDER_1 setflag FLAG_HIDE_SEAFOAM_B4F_BOULDER_2 return Route20_EventScript_SeafoamIslandsSign:: msgbox Route20_Text_SeafoamIslands, MSGBOX_SIGN end ================================================ FILE: data/maps/Route20/text.inc ================================================ Route20_Text_BarryIntro:: .string "The water is shallow here.\n" .string "There are many people swimming.$" Route20_Text_BarryDefeat:: .string "Splash!$" Route20_Text_BarryPostBattle:: .string "I wish I could ride my POKéMON.\n" .string "I bet you're not tired.$" Route20_Text_ShirleyIntro:: .string "SEAFOAM is a quiet getaway.\n" .string "I'm vacationing here.$" Route20_Text_ShirleyDefeat:: .string "Quit it!$" Route20_Text_ShirleyPostBattle:: .string "There's a huge cavern underneath\n" .string "this island.$" Route20_Text_TiffanyIntro:: .string "I love floating with the fishes\n" .string "here among the waves.$" Route20_Text_TiffanyDefeat:: .string "Yowch!$" Route20_Text_TiffanyPostBattle:: .string "Want to float with me?$" Route20_Text_IreneIntro:: .string "Are you on vacation, too?$" Route20_Text_IreneDefeat:: .string "No mercy at all!$" Route20_Text_IrenePostBattle:: .string "SEAFOAM used to be a single island\n" .string "in the distant past.$" Route20_Text_DeanIntro:: .string "Check out my buff physique!$" Route20_Text_DeanDefeat:: .string "Wimpy!$" Route20_Text_DeanPostBattle:: .string "I should've been buffing up my\n" .string "POKéMON, not me!$" Route20_Text_DarrinIntro:: .string "Why are you riding a POKéMON?\n" .string "Can't you swim?$" Route20_Text_DarrinDefeat:: .string "Ouch!\n" .string "Torpedoed!$" Route20_Text_DarrinPostBattle:: .string "Riding a POKéMON sure looks fun!$" Route20_Text_RogerIntro:: .string "I rode my bird POKéMON here.$" Route20_Text_RogerDefeat:: .string "Oh, no!\n" .string "Now what am I to do?$" Route20_Text_RogerPostBattle:: .string "My birds are exhausted.\n" .string "They can't FLY me back!$" Route20_Text_NoraIntro:: .string "My boyfriend gave me big pearls.$" Route20_Text_NoraDefeat:: .string "Oh, no!\n" .string "My pearls were in them!$" Route20_Text_NoraPostBattle:: .string "Will my pearls grow bigger inside\n" .string "CLOYSTER?$" Route20_Text_MissyIntro:: .string "I swam here from CINNABAR ISLAND.\n" .string "It wasn't easy, I tell you.$" Route20_Text_MissyDefeat:: .string "I'm so disappointed!$" Route20_Text_MissyPostBattle:: .string "POKéMON have taken over an\n" .string "abandoned mansion on CINNABAR.\p" .string "They call it the POKéMON MANSION\n" .string "now.$" Route20_Text_MelissaIntro:: .string "CINNABAR, in the west, has a LAB\n" .string "for POKéMON.\p" .string "My daddy works there.$" Route20_Text_MelissaDefeat:: .string "Wait!\n" .string "You're supposed to wait!$" Route20_Text_MelissaPostBattle:: .string "CINNABAR is a volcanic island.\p" .string "I heard it rose out of the sea\n" .string "when a volcano erupted.$" Route20_Text_SeafoamIslands:: .string "SEAFOAM ISLANDS$" Route20_Text_MistyTrainsHere:: .string "Strong TRAINERS and WATER POKéMON\n" .string "are common sights in these parts.\p" .string "They say that MISTY of the\n" .string "CERULEAN GYM trains here.$" ================================================ FILE: data/maps/Route20_Underwater/map.json ================================================ { "id": "MAP_ROUTE20_UNDERWATER", "name": "Route20_Underwater", "layout": "LAYOUT_ROUTE20_UNDERWATER", "music": "MUS_UNDERWATER", "region_map_section": "MAPSEC_ROUTE_20", "requires_flash": false, "weather": "WEATHER_UNDERWATER_BUBBLES", "map_type": "MAP_TYPE_UNDERWATER", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "emerge", "offset": 0, "map": "MAP_ROUTE20" } ], "object_events": [ ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 67, "y": 6, "elevation": 3, "item": "ITEM_BIG_PEARL", "flag": "FLAG_HIDDEN_ITEM_ROUTE20_UNDERWATER_BIG_PEARL", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/Route20_Underwater/scripts.inc ================================================ Route20_Underwater_MapScripts:: .byte 0 ================================================ FILE: data/maps/Route20_Underwater/text.inc ================================================ ================================================ FILE: data/maps/Route21_North/map.json ================================================ { "id": "MAP_ROUTE21_NORTH", "name": "Route21_North", "layout": "LAYOUT_ROUTE21_NORTH", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_21", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_PALLET_TOWN" }, { "direction": "down", "offset": 0, "map": "MAP_ROUTE21_SOUTH" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 7, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "Route21_North_EventScript_Ronald", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 16, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "Route21_North_EventScript_Wade", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 12, "y": 44, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN", "movement_range_x": 4, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route21_North_EventScript_Spencer", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 14, "y": 35, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route21_North_EventScript_Lil", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TUBER_M_WATER", "in_connection": false, "x": 15, "y": 35, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route21_North_EventScript_Ian", "flag": "0" }, { "type": "clone", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "x": 13, "y": -3, "target_local_id": 2, "target_map": "MAP_PALLET_TOWN" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_BEAUTY", "in_connection": false, "x": 8, "y": 30, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Slowbro", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 17, "y": 42, "elevation": 3, "item": "ITEM_PEARL", "flag": "FLAG_HIDDEN_ITEM_ROUTE21_NORTH_PEARL", "quantity": 1, "underfoot": false } ], "level_scaling": "3" } ================================================ FILE: data/maps/Route21_North/scripts.inc ================================================ .set LOCALID_SLOWBRO_MASTER, 7 .set TRAINER, VAR_0x8009 Route21_North_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route21_North_MapScript_SetMasterTrainerMovementTypes .byte 0 Route21_North_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_SLOWBRO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route21_North_MapScript_SlowbroMasterMovementType end Route21_North_MapScript_SlowbroMasterMovementType:: setobjectmovementtype LOCALID_SLOWBRO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ================================================ FILE: data/maps/Route21_North/text.inc ================================================ Route21_North_Text_RonaldIntro:: .string "You want to know if the fish are\n" .string "biting?$" Route21_North_Text_RonaldDefeat:: .string "Dang!$" Route21_North_Text_RonaldPostBattle:: .string "I can't catch anything good.\n" .string "Not one good POKéMON to be had!$" Route21_North_Text_WadeIntro:: .string "I got a big haul!\n" .string "Wanna go for it?$" Route21_North_Text_WadeDefeat:: .string "Heheh, MAGIKARP just don't make\n" .string "the grade, do they?$" Route21_North_Text_WadePostBattle:: .string "I seem to only catch MAGIKARP!$" Route21_North_Text_SpencerIntro:: .string "The sea cleanses my body and soul!$" Route21_North_Text_SpencerDefeat:: .string "Ayah!$" Route21_North_Text_SpencerPostBattle:: .string "The sea is great and all, but I\n" .string "like the mountains, too.$" ================================================ FILE: data/maps/Route21_South/map.json ================================================ { "id": "MAP_ROUTE21_SOUTH", "name": "Route21_South", "layout": "LAYOUT_ROUTE21_SOUTH", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_21", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ROUTE21_NORTH" }, { "direction": "down", "offset": 0, "map": "MAP_CINNABAR_ISLAND" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 11, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "Route21_South_EventScript_Claude", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 14, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "Route21_South_EventScript_Nolan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 15, "y": 24, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route21_South_EventScript_Jack", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 15, "y": 38, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route21_South_EventScript_Jerome", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 10, "y": 29, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route21_South_EventScript_Roland", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BEAUTY", "in_connection": false, "x": 5, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Slowpoke", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 4, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Psyduck", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "3" } ================================================ FILE: data/maps/Route21_South/scripts.inc ================================================ .set LOCALID_SLOWPOKE_MASTER, 6 .set LOCALID_PSYDUCK_MASTER, 7 .set TRAINER, VAR_0x8009 Route21_South_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route21_South_MapScript_SetMasterTrainerMovementTypes .byte 0 Route21_South_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_SLOWPOKE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route21_South_MapScript_SlowpokeMasterMovementType setvar TRAINER, MASTER_PSYDUCK callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route21_South_MapScript_PsyduckMasterMovementType end Route21_South_MapScript_SlowpokeMasterMovementType:: setobjectmovementtype LOCALID_SLOWPOKE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route21_South_MapScript_PsyduckMasterMovementType:: setobjectmovementtype LOCALID_PSYDUCK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return ================================================ FILE: data/maps/Route21_South/text.inc ================================================ Route21_South_Text_JackIntro:: .string "I caught my POKéMON at sea.$" Route21_South_Text_JackDefeat:: .string "Diver!!\n" .string "Down!!$" Route21_South_Text_JackPostBattle:: .string "Where'd you catch your POKéMON?$" Route21_South_Text_JeromeIntro:: .string "Right now, I'm in a triathlon meet.$" Route21_South_Text_JeromeDefeat:: .string "Pant…\n" .string "Pant… Pant…$" Route21_South_Text_JeromePostBattle:: .string "I'm beat! But, I still have the\n" .string "bike race and marathon left!$" Route21_South_Text_RolandIntro:: .string "Ahh!\n" .string "Feel the sun and the wind!$" Route21_South_Text_RolandDefeat:: .string "Yow!\n" .string "I lost!$" Route21_South_Text_RolandPostBattle:: .string "I'm sunburnt to a crisp!$" Route21_South_Text_ClaudeIntro:: .string "Hey, don't scare away the fish!$" Route21_South_Text_ClaudeDefeat:: .string "Sorry! I'm just so frustrated from\n" .string "not catching anything.$" Route21_South_Text_ClaudePostBattle:: .string "Sheesh, I haven't caught a thing.\n" .string "Could this place actually be a\l" .string "giant pool or something?$" Route21_South_Text_NolanIntro:: .string "Keep me company till I get a hit.$" Route21_South_Text_NolanDefeat:: .string "That burned some time.$" Route21_South_Text_NolanPostBattle:: .string "Oh wait!\n" .string "I got a bite! Yeah!$" Route21_North_Text_LilIntro:: .string "LIL: Huh? A battle?\n" .string "IAN, can't you do it alone?$" Route21_North_Text_LilDefeat:: .string "LIL: Oh, see?\n" .string "We lost. Happy now?$" Route21_North_Text_LilPostBattle:: .string "LIL: I'm tired.\n" .string "Can't we go home already?$" Route21_North_Text_LilNotEnoughMons:: .string "LIL: Huh? A battle?\n" .string "I can't be bothered to do it alone.\l" .string "Bring two POKéMON, won't you?$" Route21_North_Text_IanIntro:: .string "IAN: My sis doesn't get enough\n" .string "exercise, so I made her come.$" Route21_North_Text_IanDefeat:: .string "IAN: Awww, Sis!\n" .string "Get it together!$" Route21_North_Text_IanPostBattle:: .string "IAN: Come on, Sis!\p" .string "You're not going to lose weight\n" .string "like this!$" Route21_North_Text_IanNotEnoughMons:: .string "IAN: We want a two-on-two battle.\n" .string "So can you bring two POKéMON?$" ================================================ FILE: data/maps/Route22/map.json ================================================ { "id": "MAP_ROUTE22", "name": "Route22", "layout": "LAYOUT_ROUTE22", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_22", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ROUTE23" }, { "direction": "right", "offset": -10, "map": "MAP_VIRIDIAN_CITY" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "in_connection": false, "x": 25, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_ROUTE_22_RIVAL" } ], "warp_events": [ { "x": 8, "y": 5, "elevation": 0, "dest_map": "MAP_ROUTE22_NORTH_ENTRANCE", "dest_warp_id": "2" }, { "x": 9, "y": 5, "elevation": 0, "dest_map": "MAP_ROUTE22_NORTH_ENTRANCE", "dest_warp_id": "2" } ], "coord_events": [ { "type": "trigger", "x": 33, "y": 4, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE22", "var_value": "1", "script": "Route22_EventScript_EarlyRivalTriggerTop" }, { "type": "trigger", "x": 33, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE22", "var_value": "1", "script": "Route22_EventScript_EarlyRivalTriggerMid" }, { "type": "trigger", "x": 33, "y": 6, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE22", "var_value": "1", "script": "Route22_EventScript_EarlyRivalTriggerBottom" }, { "type": "trigger", "x": 33, "y": 4, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE22", "var_value": "3", "script": "Route22_EventScript_LateRivalTriggerTop" }, { "type": "trigger", "x": 33, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE22", "var_value": "3", "script": "Route22_EventScript_LateRivalTriggerMid" }, { "type": "trigger", "x": 33, "y": 6, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE22", "var_value": "3", "script": "Route22_EventScript_LateRivalTriggerBottom" } ], "bg_events": [ { "type": "sign", "x": 7, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route22_EventScript_LeagueGateSign" } ], "level_scaling": "1" } ================================================ FILE: data/maps/Route22/scripts.inc ================================================ .set LOCALID_RIVAL, 1 Route22_MapScripts:: .byte 0 Route22_EventScript_EarlyRivalTriggerTop:: lockall setvar VAR_TEMP_1, 0 goto Route22_EventScript_EarlyRival end Route22_EventScript_EarlyRivalTriggerMid:: lockall setvar VAR_TEMP_1, 1 setobjectxyperm LOCALID_RIVAL, 25, 5 goto Route22_EventScript_EarlyRival end Route22_EventScript_EarlyRivalTriggerBottom:: lockall setvar VAR_TEMP_1, 2 setobjectxyperm LOCALID_RIVAL, 25, 5 goto Route22_EventScript_EarlyRival end Route22_EventScript_EarlyRival:: textcolor NPC_TEXT_COLOR_MALE playbgm MUS_ENCOUNTER_RIVAL, 0 addobject LOCALID_RIVAL call_if_eq VAR_TEMP_1, 0, Route22_EventScript_EarlyRivalApproach call_if_eq VAR_TEMP_1, 1, Route22_EventScript_EarlyRivalApproach call_if_eq VAR_TEMP_1, 2, Route22_EventScript_EarlyRivalApproachBottom delay 6 msgbox Route22_Text_EarlyRivalIntro call_if_eq VAR_STARTER_MON, 2, Route22_EventScript_EarlyRivalSquirtle call_if_eq VAR_STARTER_MON, 1, Route22_EventScript_EarlyRivalBulbasaur call_if_eq VAR_STARTER_MON, 0, Route22_EventScript_EarlyRivalCharmander msgbox Route22_Text_EarlyRivalPostBattle closemessage delay 10 playbgm MUS_RIVAL_EXIT, 0 call_if_eq VAR_TEMP_1, 0, Route22_EventScript_EarlyRivalExit call_if_eq VAR_TEMP_1, 1, Route22_EventScript_EarlyRivalExit call_if_eq VAR_TEMP_1, 2, Route22_EventScript_EarlyRivalExitBottom fadedefaultbgm removeobject LOCALID_RIVAL setvar VAR_MAP_SCENE_ROUTE22, 2 releaseall end Route22_EventScript_EarlyRivalApproach:: applymovement LOCALID_RIVAL, Route22_Movement_RivalApproach waitmovement 0 return Route22_EventScript_EarlyRivalApproachBottom:: applymovement LOCALID_RIVAL, Route22_Movement_RivalApproachBottom applymovement OBJ_EVENT_ID_PLAYER, Route22_Movement_PlayerFaceRival waitmovement 0 return Route22_EventScript_EarlyRivalSquirtle:: trainerbattle_earlyrival TRAINER_RIVAL_ROUTE22_EARLY_SQUIRTLE, 0, Route22_Text_EarlyRivalDefeat, Text_RivalVictory return Route22_EventScript_EarlyRivalBulbasaur:: trainerbattle_earlyrival TRAINER_RIVAL_ROUTE22_EARLY_BULBASAUR, 0, Route22_Text_EarlyRivalDefeat, Text_RivalVictory return Route22_EventScript_EarlyRivalCharmander:: trainerbattle_earlyrival TRAINER_RIVAL_ROUTE22_EARLY_CHARMANDER, 0, Route22_Text_EarlyRivalDefeat, Text_RivalVictory return Route22_EventScript_EarlyRivalExit:: applymovement LOCALID_RIVAL, Route22_Movement_EarlyRivalExit waitmovement 0 return Route22_EventScript_EarlyRivalExitBottom:: applymovement LOCALID_RIVAL, Route22_Movement_EarlyRivalExitBottom waitmovement 0 return Route22_Movement_UnusedRivalExit:: walk_right walk_right walk_right walk_right walk_right walk_right walk_right step_end Route22_Movement_EarlyRivalExit:: walk_down walk_right walk_right walk_right walk_right walk_right walk_down walk_down walk_down walk_down walk_down walk_down step_end Route22_Movement_EarlyRivalExitBottom:: walk_right walk_right walk_right walk_right walk_down walk_down walk_down walk_down walk_down walk_down walk_down step_end Route22_Movement_RivalApproach:: walk_right walk_right walk_right walk_right walk_right walk_right walk_right step_end Route22_Movement_RivalApproachBottom:: walk_right walk_right walk_right walk_right walk_right walk_right walk_right walk_right walk_in_place_faster_down step_end Route22_Movement_PlayerFaceRival:: delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_8 walk_in_place_faster_up step_end Route22_EventScript_LateRivalTriggerTop:: lockall setvar VAR_TEMP_1, 0 goto Route22_EventScript_LateRival end Route22_EventScript_LateRivalTriggerMid:: lockall setvar VAR_TEMP_1, 1 setobjectxyperm LOCALID_RIVAL, 25, 5 goto Route22_EventScript_LateRival end Route22_EventScript_LateRivalTriggerBottom:: lockall setvar VAR_TEMP_1, 2 setobjectxyperm LOCALID_RIVAL, 25, 5 goto Route22_EventScript_LateRival end Route22_EventScript_LateRival:: textcolor NPC_TEXT_COLOR_MALE playbgm MUS_ENCOUNTER_RIVAL, 0 addobject LOCALID_RIVAL call_if_eq VAR_TEMP_1, 0, Route22_EventScript_LateRivalApproach call_if_eq VAR_TEMP_1, 1, Route22_EventScript_LateRivalApproach call_if_eq VAR_TEMP_1, 2, Route22_EventScript_LateRivalApproachBottom msgbox Route22_Text_LateRivalIntro setvar VAR_LAST_TALKED, LOCALID_RIVAL call_if_eq VAR_STARTER_MON, 2, Route22_EventScript_LateRivalSquirtle call_if_eq VAR_STARTER_MON, 1, Route22_EventScript_LateRivalBulbasaur call_if_eq VAR_STARTER_MON, 0, Route22_EventScript_LateRivalCharmander msgbox Route22_Text_LateRivalPostBattle closemessage delay 10 playbgm MUS_RIVAL_EXIT, 0 applymovement LOCALID_RIVAL, Route22_Movement_LateRivalExit waitmovement 0 fadedefaultbgm removeobject LOCALID_RIVAL setvar VAR_MAP_SCENE_ROUTE22, 4 releaseall end Route22_EventScript_LateRivalApproach:: applymovement LOCALID_RIVAL, Route22_Movement_RivalApproach waitmovement 0 return Route22_EventScript_LateRivalApproachBottom:: applymovement LOCALID_RIVAL, Route22_Movement_RivalApproachBottom applymovement OBJ_EVENT_ID_PLAYER, Route22_Movement_PlayerFaceRival waitmovement 0 return Route22_EventScript_LateRivalSquirtle:: trainerbattle_no_intro TRAINER_RIVAL_ROUTE22_LATE_SQUIRTLE, Route22_Text_LateRivalDefeat return Route22_EventScript_LateRivalBulbasaur:: trainerbattle_no_intro TRAINER_RIVAL_ROUTE22_LATE_BULBASAUR, Route22_Text_LateRivalDefeat return Route22_EventScript_LateRivalCharmander:: trainerbattle_no_intro TRAINER_RIVAL_ROUTE22_LATE_CHARMANDER, Route22_Text_LateRivalDefeat return Route22_Movement_LateRivalExit:: walk_left walk_left walk_left walk_left walk_left walk_left walk_left step_end Route22_EventScript_LeagueGateSign:: msgbox Route22_Text_LeagueGateSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route22/text.inc ================================================ Route22_Text_EarlyRivalIntro:: .string "{RIVAL}: Hey! {PLAYER}!\p" .string "You're off to the POKéMON LEAGUE?\n" .string "Forget about it!\p" .string "You probably don't have any\n" .string "BADGES, do you?\p" .string "The guard won't let you through\n" .string "without them.\p" .string "By the way, did your POKéMON get\n" .string "any stronger?$" Route22_Text_EarlyRivalDefeat:: .string "Awww!\n" .string "You just lucked out!$" Route22_Text_EarlyRivalPostBattle:: .string "I heard the POKéMON LEAGUE is\n" .string "crawling with tough TRAINERS.\p" .string "I have to figure out how to get\n" .string "past them.\p" .string "You should quit dawdling and get a\n" .string "move on!$" Route22_Text_LateRivalIntro:: .string "{RIVAL}: What? {PLAYER}!\n" .string "What a surprise to see you here!\p" .string "So you're going to the POKéMON\n" .string "LEAGUE?\p" .string "You collected all the BADGES, too?\n" .string "That's cool!\p" .string "Then I'll whip you, {PLAYER}, as a\n" .string "warm-up for the POKéMON LEAGUE!\p" .string "Come on!$" Route22_Text_LateRivalDefeat:: .string "What!?\p" .string "I was just careless, you!$" Route22_Text_LateRivalPostBattle:: .string "That loosened me up.\n" .string "I'm ready for the POKéMON LEAGUE!\p" .string "{PLAYER}, you need more practice.\p" .string "But hey, you know that!\n" .string "I'm out of here. Smell ya!$" Route22_Text_LeagueGateSign:: .string "POKéMON LEAGUE\n" .string "Front Gate$" ================================================ FILE: data/maps/Route22_NorthEntrance/map.json ================================================ { "id": "MAP_ROUTE22_NORTH_ENTRANCE", "name": "Route22_NorthEntrance", "layout": "LAYOUT_ROUTE22_NORTH_ENTRANCE", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_ROUTE_22", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route22_NorthEntrance_EventScript_BoulderBadgeGuard", "flag": "0" } ], "warp_events": [ { "x": 7, "y": 1, "elevation": 3, "dest_map": "MAP_ROUTE23", "dest_warp_id": "2" }, { "x": 6, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE22", "dest_warp_id": "0" }, { "x": 7, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE22", "dest_warp_id": "0" }, { "x": 8, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE22", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 2, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "0", "script": "Route22_NorthEntrance_EventScript_BoulderBadgeGuardTrigger" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route22_NorthEntrance/scripts.inc ================================================ Route22_NorthEntrance_MapScripts:: .byte 0 Route22_NorthEntrance_EventScript_BoulderBadgeGuard:: lock faceplayer setvar VAR_TEMP_1, 1 bufferstdstring STR_VAR_1, STDSTRING_BOULDER_BADGE goto Route22_NorthEntrance_EventScript_BadgeGuard end Route22_NorthEntrance_EventScript_BoulderBadgeGuardTrigger:: lockall setvar VAR_TEMP_1, 1 setvar VAR_0x8009, 1 bufferstdstring STR_VAR_1, STDSTRING_BOULDER_BADGE goto Route23_EventScript_BadgeGuardTrigger end ================================================ FILE: data/maps/Route23/map.json ================================================ { "id": "MAP_ROUTE23", "name": "Route23", "layout": "LAYOUT_ROUTE23", "music": "MUS_VICTORY_ROAD", "region_map_section": "MAPSEC_ROUTE_23", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_INDIGO_PLATEAU_EXTERIOR" }, { "direction": "down", "offset": 0, "map": "MAP_ROUTE22" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 15, "y": 149, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route23_EventScript_CascadeBadgeGuard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 8, "y": 140, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route23_EventScript_ThunderBadgeGuard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 14, "y": 123, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route23_EventScript_RainbowBadgeGuard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 16, "y": 112, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route23_EventScript_SoulBadgeGuard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 10, "y": 94, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route23_EventScript_MarshBadgeGuard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 14, "y": 61, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route23_EventScript_VolcanoBadgeGuard", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 6, "y": 35, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route23_EventScript_EarthBadgeGuard", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 2, "y": 103, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Dratini", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 13, "y": 73, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Nidoqueen", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 3, "y": 53, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Nidoking", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 3, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Charizard", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 20, "y": 29, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Venusaur", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 5, "y": 28, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_1F", "dest_warp_id": "1" }, { "x": 18, "y": 28, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_2F", "dest_warp_id": "6" }, { "x": 8, "y": 153, "elevation": 3, "dest_map": "MAP_ROUTE22_NORTH_ENTRANCE", "dest_warp_id": "0" }, { "x": 9, "y": 154, "elevation": 0, "dest_map": "MAP_ROUTE22_NORTH_ENTRANCE", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 13, "y": 149, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "1", "script": "Route23_EventScript_CascadeBadgeGuardTrigger" }, { "type": "trigger", "x": 7, "y": 140, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "2", "script": "Route23_EventScript_ThunderBadgeGuardTrigger" }, { "type": "trigger", "x": 12, "y": 123, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "3", "script": "Route23_EventScript_RainbowBadgeGuardTrigger" }, { "type": "trigger", "x": 11, "y": 111, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 9, "y": 94, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "5", "script": "Route23_EventScript_MarshBadgeGuardTrigger" }, { "type": "trigger", "x": 12, "y": 61, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "6", "script": "Route23_EventScript_VolcanoBadgeGuardTrigger" }, { "type": "trigger", "x": 1, "y": 35, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "7", "script": "Route23_EventScript_EarthBadgeGuardTrigger" }, { "type": "trigger", "x": 1, "y": 34, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "7", "script": "Route23_EventScript_EarthBadgeGuardTrigger" }, { "type": "trigger", "x": 1, "y": 32, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "7", "script": "Route23_EventScript_EarthBadgeGuardTrigger" }, { "type": "trigger", "x": 1, "y": 33, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "7", "script": "Route23_EventScript_EarthBadgeGuardTrigger" }, { "type": "trigger", "x": 1, "y": 31, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "7", "script": "Route23_EventScript_EarthBadgeGuardTrigger" }, { "type": "trigger", "x": 1, "y": 36, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "7", "script": "Route23_EventScript_EarthBadgeGuardTrigger" }, { "type": "trigger", "x": 5, "y": 35, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "7", "script": "Route23_EventScript_EarthBadgeGuardTrigger" }, { "type": "trigger", "x": 4, "y": 35, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "7", "script": "Route23_EventScript_EarthBadgeGuardTrigger" }, { "type": "trigger", "x": 10, "y": 60, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "6", "script": "Route23_EventScript_VolcanoBadgeGuardTrigger" }, { "type": "trigger", "x": 13, "y": 61, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "6", "script": "Route23_EventScript_VolcanoBadgeGuardTrigger" }, { "type": "trigger", "x": 11, "y": 60, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "6", "script": "Route23_EventScript_VolcanoBadgeGuardTrigger" }, { "type": "trigger", "x": 8, "y": 94, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "5", "script": "Route23_EventScript_MarshBadgeGuardTrigger" }, { "type": "trigger", "x": 5, "y": 92, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "5", "script": "Route23_EventScript_MarshBadgeGuardTrigger" }, { "type": "trigger", "x": 7, "y": 94, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "5", "script": "Route23_EventScript_MarshBadgeGuardTrigger" }, { "type": "trigger", "x": 4, "y": 92, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "5", "script": "Route23_EventScript_MarshBadgeGuardTrigger" }, { "type": "trigger", "x": 3, "y": 92, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "5", "script": "Route23_EventScript_MarshBadgeGuardTrigger" }, { "type": "trigger", "x": 2, "y": 92, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "5", "script": "Route23_EventScript_MarshBadgeGuardTrigger" }, { "type": "trigger", "x": 4, "y": 139, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "2", "script": "Route23_EventScript_ThunderBadgeGuardTrigger" }, { "type": "trigger", "x": 5, "y": 139, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "2", "script": "Route23_EventScript_ThunderBadgeGuardTrigger" }, { "type": "trigger", "x": 6, "y": 140, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "2", "script": "Route23_EventScript_ThunderBadgeGuardTrigger" }, { "type": "trigger", "x": 10, "y": 122, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "3", "script": "Route23_EventScript_RainbowBadgeGuardTrigger" }, { "type": "trigger", "x": 11, "y": 122, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "3", "script": "Route23_EventScript_RainbowBadgeGuardTrigger" }, { "type": "trigger", "x": 13, "y": 123, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "3", "script": "Route23_EventScript_RainbowBadgeGuardTrigger" }, { "type": "trigger", "x": 8, "y": 109, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 9, "y": 109, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 10, "y": 109, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 11, "y": 109, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 12, "y": 109, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 12, "y": 111, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 14, "y": 112, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 13, "y": 112, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 15, "y": 112, "elevation": 1, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "4", "script": "Route23_EventScript_SoulBadgeGuardTrigger" }, { "type": "trigger", "x": 12, "y": 148, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "1", "script": "Route23_EventScript_CascadeBadgeGuardTrigger" }, { "type": "trigger", "x": 11, "y": 148, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "1", "script": "Route23_EventScript_CascadeBadgeGuardTrigger" }, { "type": "trigger", "x": 14, "y": 149, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "1", "script": "Route23_EventScript_CascadeBadgeGuardTrigger" }, { "type": "trigger", "x": 10, "y": 148, "elevation": 0, "var": "VAR_MAP_SCENE_ROUTE23", "var_value": "1", "script": "Route23_EventScript_CascadeBadgeGuardTrigger" } ], "bg_events": [ { "type": "hidden_item", "x": 19, "y": 42, "elevation": 0, "item": "ITEM_FULL_RESTORE", "flag": "FLAG_HIDDEN_ITEM_ROUTE23_FULL_RESTORE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 20, "y": 72, "elevation": 0, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_ROUTE23_ULTRA_BALL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 11, "y": 101, "elevation": 3, "item": "ITEM_MAX_ETHER", "flag": "FLAG_HIDDEN_ITEM_ROUTE23_MAX_ETHER", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 3, "y": 18, "elevation": 3, "item": "ITEM_LUM_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE23_LUM_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 2, "y": 29, "elevation": 3, "item": "ITEM_SITRUS_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE23_SITRUS_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 10, "y": 67, "elevation": 3, "item": "ITEM_ASPEAR_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE23_ASPEAR_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 3, "y": 128, "elevation": 3, "item": "ITEM_LEPPA_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE23_LEPPA_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 9, "y": 8, "elevation": 3, "item": "ITEM_MAX_ELIXIR", "flag": "FLAG_HIDDEN_ITEM_ROUTE23_MAX_ELIXIR", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 3, "y": 31, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route23_EventScript_VictoryRoadGateSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/Route23/scripts.inc ================================================ .set LOCALID_CASCADE_BADGE_GUARD, 1 .set LOCALID_THUNDER_BADGE_GUARD, 2 .set LOCALID_RAINBOW_BADGE_GUARD, 3 .set LOCALID_SOUL_BADGE_GUARD, 4 .set LOCALID_MARSH_BADGE_GUARD, 5 .set LOCALID_VOLCANO_BADGE_GUARD, 6 .set LOCALID_EARTH_BADGE_GUARD, 7 .set LOCALID_DRATINI_MASTER, 8 .set LOCALID_NIDOQUEEN_MASTER, 9 .set LOCALID_NIDOKING_MASTER, 10 .set LOCALID_CHARIZARD_MASTER, 11 .set LOCALID_VENUSAUR_MASTER, 12 .set TRAINER, VAR_0x8009 Route23_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route23_MapScript_SetMasterTrainerMovementTypes .byte 0 Route23_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_DRATINI callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route23_MapScript_DratiniMasterMovementType setvar TRAINER, MASTER_NIDOQUEEN callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route23_MapScript_NidoqueenMMasterMovementType setvar TRAINER, MASTER_NIDOKING callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route23_MapScript_NidokingMasterMovementType setvar TRAINER, MASTER_CHARIZARD callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route23_MapScript_CharizardMasterMovementType setvar TRAINER, MASTER_VENUSAUR callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route23_MapScript_VenusaurMasterMovementType end Route23_MapScript_DratiniMasterMovementType:: setobjectmovementtype LOCALID_DRATINI_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route23_MapScript_NidoqueenMMasterMovementType:: setobjectmovementtype LOCALID_NIDOQUEEN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route23_MapScript_NidokingMasterMovementType:: setobjectmovementtype LOCALID_NIDOKING_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route23_MapScript_CharizardMasterMovementType:: setobjectmovementtype LOCALID_CHARIZARD_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route23_MapScript_VenusaurMasterMovementType:: setobjectmovementtype LOCALID_VENUSAUR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route23_EventScript_CascadeBadgeGuard:: lock faceplayer setvar VAR_TEMP_1, 2 bufferstdstring STR_VAR_1, STDSTRING_CASCADE_BADGE goto Route23_EventScript_BadgeGuard end Route23_EventScript_ThunderBadgeGuard:: lock faceplayer setvar VAR_TEMP_1, 3 bufferstdstring STR_VAR_1, STDSTRING_THUNDER_BADGE goto Route23_EventScript_BadgeGuard end Route23_EventScript_RainbowBadgeGuard:: lock faceplayer setvar VAR_TEMP_1, 4 bufferstdstring STR_VAR_1, STDSTRING_RAINBOW_BADGE goto Route23_EventScript_BadgeGuard end Route23_EventScript_SoulBadgeGuard:: lock faceplayer setvar VAR_TEMP_1, 5 bufferstdstring STR_VAR_1, STDSTRING_SOUL_BADGE goto Route23_EventScript_BadgeGuard end Route23_EventScript_MarshBadgeGuard:: lock faceplayer setvar VAR_TEMP_1, 6 bufferstdstring STR_VAR_1, STDSTRING_MARSH_BADGE goto Route23_EventScript_BadgeGuard end Route23_EventScript_VolcanoBadgeGuard:: lock faceplayer setvar VAR_TEMP_1, 7 bufferstdstring STR_VAR_1, STDSTRING_VOLCANO_BADGE goto Route23_EventScript_BadgeGuard end Route23_EventScript_EarthBadgeGuard:: lock faceplayer setvar VAR_TEMP_1, 8 bufferstdstring STR_VAR_1, STDSTRING_EARTH_BADGE goto Route23_EventScript_BadgeGuard end Route23_EventScript_CascadeBadgeGuardTrigger:: lockall setvar VAR_TEMP_1, 2 setvar VAR_0x8009, LOCALID_CASCADE_BADGE_GUARD bufferstdstring STR_VAR_1, STDSTRING_CASCADE_BADGE goto Route23_EventScript_BadgeGuardTrigger end Route23_EventScript_ThunderBadgeGuardTrigger:: lockall setvar VAR_TEMP_1, 3 setvar VAR_0x8009, LOCALID_THUNDER_BADGE_GUARD bufferstdstring STR_VAR_1, STDSTRING_THUNDER_BADGE goto Route23_EventScript_BadgeGuardTrigger end Route23_EventScript_RainbowBadgeGuardTrigger:: lockall setvar VAR_TEMP_1, 4 setvar VAR_0x8009, LOCALID_RAINBOW_BADGE_GUARD bufferstdstring STR_VAR_1, STDSTRING_RAINBOW_BADGE goto Route23_EventScript_BadgeGuardTrigger end Route23_EventScript_SoulBadgeGuardTrigger:: lockall setvar VAR_TEMP_1, 5 setvar VAR_0x8009, LOCALID_SOUL_BADGE_GUARD bufferstdstring STR_VAR_1, STDSTRING_SOUL_BADGE goto Route23_EventScript_BadgeGuardTrigger end Route23_EventScript_MarshBadgeGuardTrigger:: lockall setvar VAR_TEMP_1, 6 setvar VAR_0x8009, LOCALID_MARSH_BADGE_GUARD bufferstdstring STR_VAR_1, STDSTRING_MARSH_BADGE goto Route23_EventScript_BadgeGuardTrigger end Route23_EventScript_VolcanoBadgeGuardTrigger:: lockall setvar VAR_TEMP_1, 7 setvar VAR_0x8009, LOCALID_VOLCANO_BADGE_GUARD bufferstdstring STR_VAR_1, STDSTRING_VOLCANO_BADGE goto Route23_EventScript_BadgeGuardTrigger end Route23_EventScript_EarthBadgeGuardTrigger:: lockall setvar VAR_TEMP_1, 8 setvar VAR_0x8009, LOCALID_EARTH_BADGE_GUARD bufferstdstring STR_VAR_1, STDSTRING_EARTH_BADGE goto Route23_EventScript_BadgeGuardTrigger end Route23_EventScript_VictoryRoadGateSign:: msgbox Route23_Text_VictoryRoadGateSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route23/text.inc ================================================ Route23_Text_VictoryRoadGateSign:: .string "VICTORY ROAD GATE -\n" .string "POKéMON LEAGUE$" ================================================ FILE: data/maps/Route23_UnusedHouse/map.json ================================================ { "id": "MAP_ROUTE23_UNUSED_HOUSE", "name": "Route23_UnusedHouse", "layout": "LAYOUT_HOUSE2", "music": "MUS_VICTORY_ROAD", "region_map_section": "MAPSEC_ROUTE_23", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route23_UnusedHouse/scripts.inc ================================================ Route23_UnusedHouse_MapScripts:: .byte 0 ================================================ FILE: data/maps/Route24/map.json ================================================ { "id": "MAP_ROUTE24", "name": "Route24", "layout": "LAYOUT_ROUTE24", "music": "MUS_ROUTE24", "region_map_section": "MAPSEC_ROUTE_24", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": -12, "map": "MAP_CERULEAN_CITY" }, { "direction": "right", "offset": 0, "map": "MAP_ROUTE25" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 12, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route24_EventScript_Rocket", "flag": "FLAG_HIDE_NUGGET_BRIDGE_ROCKET" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 12, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route24_EventScript_Ethan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 10, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route24_EventScript_Reli", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 12, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route24_EventScript_Timmy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 10, "y": 28, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route24_EventScript_Ali", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 12, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route24_EventScript_Cale", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 5, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route24_EventScript_Shane", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 11, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route24_EventScript_ItemTM45", "flag": "FLAG_HIDE_ROUTE24_TM45" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 3, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Venonat", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 16, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Exeggcute", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 14, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route24_EventScript_RolloutTutor", "flag": "0" } ], "warp_events": [ ], "coord_events": [ { "type": "trigger", "x": 10, "y": 15, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE24", "var_value": "0", "script": "Route24_EventScript_RocketTriggerLeft" }, { "type": "trigger", "x": 11, "y": 15, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE24", "var_value": "0", "script": "Route24_EventScript_RocketTriggerRight" } ], "bg_events": [ { "type": "hidden_item", "x": 19, "y": 4, "elevation": 3, "item": "ITEM_PECHA_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE24_PECHA_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "1" } ================================================ FILE: data/maps/Route24/scripts.inc ================================================ .equ LOCALID_ROCKET, 1 .set LOCALID_VENONAT_MASTER, 9 .set LOCALID_EXEGGCUTE_MASTER, 10 .set TRAINER, VAR_0x8009 Route24_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route24_MapScript_SetMasterTrainerMovementTypes .byte 0 Route24_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_VENONAT callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route24_MapScript_VenonatMasterMovementType setvar TRAINER, MASTER_EXEGGCUTE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route24_MapScript_ExeggcuteMasterMovementType end Route24_MapScript_VenonatMasterMovementType:: setobjectmovementtype LOCALID_VENONAT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route24_MapScript_ExeggcuteMasterMovementType:: setobjectmovementtype LOCALID_EXEGGCUTE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route24_EventScript_Rocket:: lock faceplayer goto_if_eq VAR_MAP_SCENE_ROUTE24, 1, Route24_EventScript_RocketPostBattle msgbox Route24_Text_JustEarnedFabulousPrize checkitemspace ITEM_NUGGET goto_if_eq VAR_RESULT, FALSE, Route24_EventScript_NoRoomForNugget call Route24_EventScript_BattleRocket release end Route24_EventScript_NoRoomForNugget:: msgbox Route24_Text_YouDontHaveAnyRoom release end Route24_EventScript_RocketPostBattle:: msgbox Route24_Text_YoudBecomeTopRocketLeader release end Route24_EventScript_RocketTriggerLeft:: lockall setvar VAR_TEMP_1, 0 goto Route24_EventScript_RocketTrigger end Route24_EventScript_RocketTriggerRight:: lockall setvar VAR_TEMP_1, 1 goto Route24_EventScript_RocketTrigger end Route24_EventScript_RocketTrigger:: textcolor NPC_TEXT_COLOR_MALE call_if_eq VAR_TEMP_1, 0, Route24_EventScript_RocketApproachPlayer call_if_eq VAR_TEMP_1, 1, Route24_EventScript_RocketMotionToPlayer applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox Route24_Text_JustEarnedFabulousPrize checkitemspace ITEM_NUGGET goto_if_eq VAR_RESULT, FALSE, Route24_EventScript_NoRoomForNuggetTrigger call Route24_EventScript_BattleRocket releaseall end Route24_EventScript_BattleRocket:: giveitem_msg Route24_Text_ReceivedNuggetFromMysteryTrainer, ITEM_NUGGET message Route24_Text_JoinTeamRocket waitmessage playbgm MUS_ENCOUNTER_ROCKET, 0 waitbuttonpress setvar VAR_LAST_TALKED, LOCALID_ROCKET setvar VAR_MAP_SCENE_ROUTE24, 1 trainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_6, Route24_Text_RocketDefeat msgbox Route24_Text_YoudBecomeTopRocketLeader return Route24_EventScript_RocketApproachPlayer:: applymovement LOCALID_ROCKET, Route24_Movement_RocketApproachPlayer waitmovement 0 return Route24_EventScript_RocketMotionToPlayer:: applymovement LOCALID_ROCKET, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return Route24_EventScript_NoRoomForNuggetTrigger:: msgbox Route24_Text_YouDontHaveAnyRoom closemessage applymovement OBJ_EVENT_ID_PLAYER, Route24_Movement_WalkDown waitmovement 0 call_if_eq VAR_TEMP_1, 0, Route24_EventScript_RocketWalkBackToPos release end Route24_EventScript_RocketWalkBackToPos:: applymovement LOCALID_ROCKET, Route24_Movement_RocketWalkBackToPos waitmovement 0 return Route24_Movement_RocketApproachPlayer:: walk_left step_end Route24_Movement_RocketWalkBackToPos:: walk_right walk_in_place_faster_left step_end Route24_Movement_WalkDown:: walk_down step_end ================================================ FILE: data/maps/Route24/text.inc ================================================ Route24_Text_JustEarnedFabulousPrize:: .string "Congratulations! You beat our\n" .string "five contest TRAINERS!\p" .string "You just earned a fabulous prize!$" Route24_Text_ReceivedNuggetFromMysteryTrainer:: .string "{PLAYER} received a NUGGET\n" .string "from the mystery TRAINER!$" Route24_Text_YouDontHaveAnyRoom:: .string "You don't have any room!$" Route24_Text_JoinTeamRocket:: .string "By the way, how would you like to\n" .string "join TEAM ROCKET?\p" .string "We're a group of professional\n" .string "criminals specializing in POKéMON!\p" .string "Want to join?\p" .string "Are you sure?\p" .string "Come on, join us!\p" .string "I'm telling you to join!\p" .string "…Okay, you need convincing!\p" .string "I'll make you an offer you can't\n" .string "refuse!$" Route24_Text_RocketDefeat:: .string "Arrgh!\n" .string "You are good!$" Route24_Text_YoudBecomeTopRocketLeader:: .string "With your ability, you'd become\n" .string "a top leader in TEAM ROCKET.\p" .string "Come on, think of the opportunity!\n" .string "Don't let this chance go to waste.$" Route24_Text_ShaneIntro:: .string "I saw your feat from the grass!$" Route24_Text_ShaneDefeat:: .string "I thought not!$" Route24_Text_ShanePostBattle:: .string "I hid because the people on the\n" .string "bridge frightened me.$" Route24_Text_EthanIntro:: .string "Okay! I'm No. 5!\n" .string "I'll stomp you!$" Route24_Text_EthanDefeat:: .string "Whoa!\n" .string "Too much!$" Route24_Text_EthanPostBattle:: .string "I did my best. I have no regrets!$" Route24_Text_ReliIntro:: .string "I'm No. 4!\n" .string "Getting tired?$" Route24_Text_ReliDefeat:: .string "I lost, too!$" Route24_Text_ReliPostBattle:: .string "I did my best, so I've no regrets!$" Route24_Text_TimmyIntro:: .string "Here's No. 3!\n" .string "I won't be easy!$" Route24_Text_TimmyDefeat:: .string "Ow!\n" .string "Stomped flat!$" Route24_Text_TimmyPostBattle:: .string "I did my best. I have no regrets!$" Route24_Text_AliIntro:: .string "I'm second!\n" .string "Now it's serious!$" Route24_Text_AliDefeat:: .string "How could I lose?$" Route24_Text_AliPostBattle:: .string "I did my best. I have no regrets!$" Route24_Text_CaleIntro:: .string "People call this the NUGGET\n" .string "BRIDGE!\p" .string "Beat us five TRAINERS and win\n" .string "a fabulous prize!\p" .string "Think you got what it takes?$" Route24_Text_CaleDefeat:: .string "Whoo!\n" .string "Good stuff!$" Route24_Text_CalePostBattle:: .string "I did my best. I have no regrets!$" ================================================ FILE: data/maps/Route25/map.json ================================================ { "id": "MAP_ROUTE25", "name": "Route25", "layout": "LAYOUT_ROUTE25", "music": "MUS_ROUTE24", "region_map_section": "MAPSEC_ROUTE_25", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": 0, "map": "MAP_ROUTE24" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 11, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route25_EventScript_Franklin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 18, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route25_EventScript_Joey", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 17, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route25_EventScript_Wayne", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 22, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route25_EventScript_Dan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 22, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route25_EventScript_Kelsey", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 27, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route25_EventScript_Nob", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 28, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route25_EventScript_Flint", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 36, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route25_EventScript_Chad", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 42, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route25_EventScript_Haley", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 26, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route25_EventScript_ItemTM43", "flag": "FLAG_HIDE_ROUTE25_TM43" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 30, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_25_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 49, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route25_EventScript_Beauty", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 49, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route25_EventScript_Man", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 60, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Starmie", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 51, "y": 4, "elevation": 0, "dest_map": "MAP_ROUTE25_SEA_COTTAGE", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 48, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route25_EventScript_SeaCottageSign" }, { "type": "hidden_item", "x": 14, "y": 2, "elevation": 3, "item": "ITEM_ELIXIR", "flag": "FLAG_HIDDEN_ITEM_ROUTE25_ELIXIR", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 58, "y": 6, "elevation": 3, "item": "ITEM_ETHER", "flag": "FLAG_HIDDEN_ITEM_ROUTE25_ETHER", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 33, "y": 8, "elevation": 3, "item": "ITEM_ORAN_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE25_ORAN_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 40, "y": 3, "elevation": 3, "item": "ITEM_POMEG_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE25_POMEG_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "1" } ================================================ FILE: data/maps/Route25/scripts.inc ================================================ .set LOCALID_STARMIE_MASTER, 14 .set TRAINER, VAR_0x8009 Route25_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route25_MapScript_SetMasterTrainerMovementTypes .byte 0 Route25_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_STARMIE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route25_MapScript_StarmieMasterMovementType end Route25_MapScript_StarmieMasterMovementType:: setobjectmovementtype LOCALID_STARMIE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route25_EventScript_SeaCottageSign:: msgbox Route25_Text_SeaCottageSign, MSGBOX_SIGN end Route25_EventScript_Man:: msgbox Route25_Text_AreYouHereAlone, MSGBOX_NPC end ================================================ FILE: data/maps/Route25/text.inc ================================================ Route25_Text_JoeyIntro:: .string "Local TRAINERS come here to\n" .string "practice.$" Route25_Text_JoeyDefeat:: .string "You're decent.$" Route25_Text_JoeyPostBattle:: .string "All POKéMON have weaknesses.\n" .string "Even the strongest ones.\p" .string "That's why it's best to raise\n" .string "POKéMON of different types.$" Route25_Text_DanIntro:: .string "Dad took me to a great party on\n" .string "the S.S. ANNE at VERMILION CITY.$" Route25_Text_DanDefeat:: .string "I'm not mad!$" Route25_Text_DanPostBattle:: .string "On the S.S. ANNE, I saw TRAINERS\n" .string "from around the world.$" Route25_Text_FlintIntro:: .string "I'm a cool guy.\n" .string "I've got a girlfriend!$" Route25_Text_FlintDefeat:: .string "Aww, darn…$" Route25_Text_FlintPostBattle:: .string "Oh, well.\n" .string "My girlfriend will cheer me up.$" Route25_Text_KelseyIntro:: .string "Hi!\n" .string "My boyfriend is cool!$" Route25_Text_KelseyDefeat:: .string "My conditioning isn't the best…$" Route25_Text_KelseyPostBattle:: .string "I wish my boyfriend was as good\n" .string "as you.$" Route25_Text_ChadIntro:: .string "I had this feeling…\n" .string "I knew I had to battle you!$" Route25_Text_ChadDefeat:: .string "I knew I'd lose, too!$" Route25_Text_ChadPostBattle:: .string "If your POKéMON gets confused,\n" .string "switch it out.\p" .string "That's a good tactic.$" Route25_Text_HaleyIntro:: .string "My friend has many cute POKéMON.\n" .string "I'm so jealous!$" Route25_Text_HaleyDefeat:: .string "I'm not so jealous!$" Route25_Text_HaleyPostBattle:: .string "You came from MT. MOON?\n" .string "May I have a CLEFAIRY?$" Route25_Text_FranklinIntro:: .string "I just got down from MT. MOON,\n" .string "but I've still got gas in the tank!$" Route25_Text_FranklinDefeat:: .string "You worked hard!$" Route25_Text_FranklinPostBattle:: .string "Drat!\n" .string "A ZUBAT bit me back in that cave.$" Route25_Text_NobIntro:: .string "I'm off to see a POKéMANIAC's\n" .string "collection at the cape.$" Route25_Text_NobDefeat:: .string "You done got me, and real good,\n" .string "too!$" Route25_Text_NobPostBattle:: .string "The POKéMANIAC sure lives up to\n" .string "his name.\p" .string "His collection includes many rare\n" .string "species of POKéMON.$" Route25_Text_WayneIntro:: .string "You're going to see BILL?\n" .string "First, we battle!$" Route25_Text_WayneDefeat:: .string "You're something.$" Route25_Text_WaynePostBattle:: .string "The trail below is a shortcut to\n" .string "CERULEAN CITY.$" Route25_Text_SeaCottageSign:: .string "SEA COTTAGE\n" .string "BILL lives here!$" Route25_Text_MistyHighHopesAboutThisPlace:: .string "This cape is a famous date spot.\p" .string "MISTY, the GYM LEADER, has high\n" .string "hopes about this place.$" Route25_Text_AreYouHereAlone:: .string "Hello, are you here alone?\p" .string "If you're out at CERULEAN's cape…\n" .string "Well, it should be as a couple.$" ================================================ FILE: data/maps/Route25_SeaCottage/map.json ================================================ { "id": "MAP_ROUTE25_SEA_COTTAGE", "name": "Route25_SeaCottage", "layout": "LAYOUT_ROUTE25_SEA_COTTAGE", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_ROUTE_25", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BILL", "x": 7, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route25_SeaCottage_EventScript_Bill", "flag": "FLAG_HIDE_BILL_HUMAN_SEA_COTTAGE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLEFAIRY", "x": 10, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route25_SeaCottage_EventScript_Bill", "flag": "FLAG_HIDE_BILL_CLEFAIRY" } ], "warp_events": [ { "x": 6, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE25", "dest_warp_id": "0" }, { "x": 7, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE25", "dest_warp_id": "0" }, { "x": 8, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE25", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 4, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "Route25_SeaCottage_EventScript_Computer" } ], "level_scaling": "0" } ================================================ FILE: data/maps/Route25_SeaCottage/scripts.inc ================================================ .equ LOCALID_BILL_HUMAN, 1 .equ LOCALID_BILL_CLEFAIRY, 2 .equ BILL_IN_TELEPORTER, FLAG_TEMP_2 .equ RETURN_AFTER_SS_TICKET, FLAG_TEMP_3 Route25_SeaCottage_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route25_SeaCottage_OnTransition .byte 0 Route25_SeaCottage_OnTransition:: call_if_unset FLAG_HELPED_BILL_IN_SEA_COTTAGE, Route25_SeaCottage_EventScript_HideClefairyBill call_if_set FLAG_GOT_SS_TICKET, Route25_SeaCottage_EventScript_SetReturnedAfterSSTicket end Route25_SeaCottage_EventScript_HideClefairyBill:: clearflag FLAG_HIDE_BILL_CLEFAIRY setobjectxyperm LOCALID_BILL_HUMAN, 3, 3 return Route25_SeaCottage_EventScript_SetReturnedAfterSSTicket:: setflag RETURN_AFTER_SS_TICKET return Route25_SeaCottage_EventScript_Bill:: lock faceplayer goto_if_set RETURN_AFTER_SS_TICKET, Route25_SeaCottage_EventScript_BillGoLookAtPC goto_if_set FLAG_GOT_SS_TICKET, Route25_SeaCottage_EventScript_BillGoToSSAnne goto_if_set FLAG_HELPED_BILL_IN_SEA_COTTAGE, Route25_SeaCottage_EventScript_BillGiveSSTicket checkplayergender goto_if_eq VAR_RESULT, MALE, Route25_SeaCottage_EventScript_BillAskForHelpMale goto_if_eq VAR_RESULT, FEMALE, Route25_SeaCottage_EventScript_BillAskForHelpFemale end Route25_SeaCottage_EventScript_BillAskForHelpMale:: msgbox Route25_SeaCottage_Text_ImBillHelpMeOutPal, MSGBOX_YESNO goto Route25_SeaCottage_EventScript_BillAskForHelp end Route25_SeaCottage_EventScript_BillAskForHelpFemale:: msgbox Route25_SeaCottage_Text_ImBillHelpMeOutLady, MSGBOX_YESNO goto Route25_SeaCottage_EventScript_BillAskForHelp end Route25_SeaCottage_EventScript_BillAskForHelp:: call_if_eq VAR_RESULT, NO, Route25_SeaCottage_EventScript_DeclineHelpBill msgbox Route25_SeaCottage_Text_RunCellSeparationOnPC closemessage delay 10 call_if_eq VAR_FACING, DIR_SOUTH, Route25_SeaCottage_EventScript_BillWalkToTeleporterSouth call_if_eq VAR_FACING, DIR_NORTH, Route25_SeaCottage_EventScript_BillWalkToTeleporter call_if_eq VAR_FACING, DIR_WEST, Route25_SeaCottage_EventScript_BillWalkToTeleporter call_if_eq VAR_FACING, DIR_EAST, Route25_SeaCottage_EventScript_BillWalkToTeleporter opendoor 10, 3 waitdooranim applymovement LOCALID_BILL_CLEFAIRY, Route25_SeaCottage_Movement_BillEnterTeleporter waitmovement 0 removeobject LOCALID_BILL_CLEFAIRY playse SE_CONTEST_CURTAIN_FALL closedoor 10, 3 waitdooranim setflag BILL_IN_TELEPORTER release end @ Just returns after message, execution continues as if player had said yes Route25_SeaCottage_EventScript_DeclineHelpBill:: checkplayergender call_if_eq VAR_RESULT, MALE, Route25_SeaCottage_EventScript_DeclineHelpBillMale call_if_eq VAR_RESULT, FEMALE, Route25_SeaCottage_EventScript_DeclineHelpBillFemale return Route25_SeaCottage_EventScript_DeclineHelpBillMale:: msgbox Route25_SeaCottage_Text_NoPleaseChief return Route25_SeaCottage_EventScript_DeclineHelpBillFemale:: msgbox Route25_SeaCottage_Text_NoPleaseBeautiful return Route25_SeaCottage_EventScript_BillWalkToTeleporterSouth:: applymovement LOCALID_BILL_CLEFAIRY, Route25_SeaCottage_Movement_BillWalkToTeleporterSouth waitmovement 0 return Route25_SeaCottage_EventScript_BillWalkToTeleporter:: applymovement LOCALID_BILL_CLEFAIRY, Route25_SeaCottage_Movement_BillWalkToTeleporter waitmovement 0 return Route25_SeaCottage_EventScript_BillGoToSSAnne:: msgbox Route25_SeaCottage_Text_SSAnnePartyYouGoInstead release end Route25_SeaCottage_EventScript_BillGiveSSTicket:: famechecker FAMECHECKER_BILL, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 checkplayergender call_if_eq VAR_RESULT, MALE, Route25_SeaCottage_EventScript_BillThanksMale call_if_eq VAR_RESULT, FEMALE, Route25_SeaCottage_EventScript_BillThanksFemale checkitemspace ITEM_SS_TICKET goto_if_eq VAR_RESULT, FALSE, Route25_SeaCottage_EventScript_NoRoomForSSTicket giveitem_msg Route25_SeaCottage_Text_ReceivedSSTicketFromBill, ITEM_SS_TICKET, 1, MUS_OBTAIN_KEY_ITEM setflag FLAG_GOT_SS_TICKET_DUP setflag FLAG_HIDE_NUGGET_BRIDGE_ROCKET setflag FLAG_GOT_SS_TICKET setflag FLAG_SYS_NOT_SOMEONES_PC goto Route25_SeaCottage_EventScript_BillGoToSSAnne end Route25_SeaCottage_EventScript_BillThanksMale:: msgbox Route25_SeaCottage_Text_ThanksBudTakeThis return Route25_SeaCottage_EventScript_BillThanksFemale:: msgbox Route25_SeaCottage_Text_ThanksLadyTakeThis return Route25_SeaCottage_EventScript_NoRoomForSSTicket:: msgbox Route25_SeaCottage_Text_YouveGotTooMuchStuff release end Route25_SeaCottage_EventScript_BillGoLookAtPC:: msgbox Route25_SeaCottage_Text_CheckOutRareMonsOnPC release end Route25_SeaCottage_Movement_BillWalkToTeleporter:: walk_up walk_up step_end Route25_SeaCottage_Movement_BillWalkToTeleporterSouth:: walk_right walk_up walk_up walk_left walk_in_place_faster_up step_end Route25_SeaCottage_Movement_BillEnterTeleporter:: walk_up step_end Route25_SeaCottage_EventScript_Computer:: lockall goto_if_set RETURN_AFTER_SS_TICKET, Route25_SeaCottage_EventScript_OpenBillsMonList goto_if_set BILL_IN_TELEPORTER, Route25_SeaCottage_EventScript_RunCellSeparator msgbox Route25_SeaCottage_Text_TeleporterIsDisplayed releaseall end Route25_SeaCottage_EventScript_RunCellSeparator:: fadeoutbgm 0 msgbox Route25_SeaCottage_Text_InitiatedTeleportersCellSeparator closemessage clearflag BILL_IN_TELEPORTER setflag FLAG_HELPED_BILL_IN_SEA_COTTAGE special SpawnCameraObject applymovement OBJ_EVENT_ID_CAMERA, Route25_SeaCottage_Movement_CameraPanToTeleporters waitmovement 0 delay 35 playse SE_PIN waitse setvar VAR_0x8004, 0 special AnimateTeleporterHousing delay 10 call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE setvar VAR_0x8004, 1 special AnimateTeleporterHousing playse SE_WARP_IN special AnimateTeleporterCable waitse call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE call Route25_SeaCottage_EventScript_PlayTeleporterBeepSE opendoor 3, 3 waitdooranim fadeinbgm 0 addobject LOCALID_BILL_HUMAN clearflag FLAG_HIDE_BILL_HUMAN_SEA_COTTAGE delay 50 playfanfare MUS_LEVEL_UP applymovement LOCALID_BILL_HUMAN, Route25_SeaCottage_Movement_BillExitTeleporter waitmovement 0 waitfanfare applymovement OBJ_EVENT_ID_CAMERA, Route25_SeaCottage_Movement_CameraPanBackFromTeleporters waitmovement 0 playse SE_CONTEST_CURTAIN_FALL closedoor 3, 3 waitdooranim applymovement LOCALID_BILL_HUMAN, Route25_SeaCottage_Movement_BillWalkToMiddleOfRoom waitmovement 0 special RemoveCameraObject releaseall end Route25_SeaCottage_EventScript_PlayTeleporterBeepSE:: playse SE_BALL waitse delay 20 return Route25_SeaCottage_Movement_CameraPanToTeleporters:: walk_up walk_up walk_right walk_right step_end Route25_SeaCottage_Movement_CameraPanBackFromTeleporters:: delay_16 delay_16 walk_down walk_down walk_left walk_left step_end Route25_SeaCottage_EventScript_OpenBillsMonList:: msgbox Route25_SeaCottage_Text_BillsFavoriteMonList goto Route25_SeaCottage_EventScript_BillsMonList end Route25_SeaCottage_EventScript_BillsMonList:: message Route25_SeaCottage_Text_SeeWhichMon waitmessage multichoice 0, 0, MULTICHOICE_EEVEELUTIONS, FALSE switch VAR_RESULT case 0, Route25_SeaCottage_EventScript_ViewEevee case 1, Route25_SeaCottage_EventScript_ViewFlareon case 2, Route25_SeaCottage_EventScript_ViewJolteon case 3, Route25_SeaCottage_EventScript_ViewVaporeon case 4, Route25_SeaCottage_EventScript_ExitBillsMonList case 127, Route25_SeaCottage_EventScript_ExitBillsMonList end Route25_SeaCottage_EventScript_ViewEevee:: showmonpic SPECIES_EEVEE, 10, 3 waitbuttonpress hidemonpic setvar VAR_0x8004, SPECIES_EEVEE special SetSeenMon goto Route25_SeaCottage_EventScript_BillsMonList end Route25_SeaCottage_EventScript_ViewFlareon:: showmonpic SPECIES_FLAREON, 10, 3 waitbuttonpress hidemonpic setvar VAR_0x8004, SPECIES_FLAREON special SetSeenMon goto Route25_SeaCottage_EventScript_BillsMonList end Route25_SeaCottage_EventScript_ViewJolteon:: showmonpic SPECIES_JOLTEON, 10, 3 waitbuttonpress hidemonpic setvar VAR_0x8004, SPECIES_JOLTEON special SetSeenMon goto Route25_SeaCottage_EventScript_BillsMonList end Route25_SeaCottage_EventScript_ViewVaporeon:: showmonpic SPECIES_VAPOREON, 10, 3 waitbuttonpress hidemonpic setvar VAR_0x8004, SPECIES_VAPOREON special SetSeenMon goto Route25_SeaCottage_EventScript_BillsMonList end Route25_SeaCottage_EventScript_ExitBillsMonList:: releaseall end Route25_SeaCottage_Movement_BillWalkToMiddleOfRoom:: walk_right walk_right walk_right walk_right walk_down walk_down step_end Route25_SeaCottage_Movement_BillExitTeleporter:: walk_down step_end ================================================ FILE: data/maps/Route25_SeaCottage/text.inc ================================================ Route25_SeaCottage_Text_ImBillHelpMeOutPal:: .string "Hiya! I'm a POKéMON…\n" .string "…No I'm not!\p" .string "Call me BILL!\n" .string "I'm a true-blue POKéMANIAC!\p" .string "Hey!\n" .string "What's with that skeptical look?\p" .string "I'm not joshing you, pal.\p" .string "I screwed up an experiment and got\n" .string "combined with a POKéMON!\p" .string "So, how about it?\n" .string "Help me out here!$" Route25_SeaCottage_Text_ImBillHelpMeOutLady:: .string "Hiya! I'm a POKéMON…\n" .string "…No I'm not!\p" .string "Call me BILL!\n" .string "I'm a true-blue POKéMANIAC!\p" .string "Hey!\n" .string "What's with that skeptical look?\p" .string "I'm not joshing you, lady.\p" .string "I screwed up an experiment and got\n" .string "combined with a POKéMON!\p" .string "So, how about it?\n" .string "Help me out here!$" Route25_SeaCottage_Text_RunCellSeparationOnPC:: .string "Wait till I get inside the\n" .string "TELEPORTER.\p" .string "When I do, go to my PC and run\n" .string "the Cell Separation System.$" Route25_SeaCottage_Text_NoPleaseChief:: .string "No!?\n" .string "Now don't be so cold!\p" .string "Come on, you gotta help a guy in\n" .string "deep, deep trouble!\p" .string "What do you say, chief?\n" .string "Please?\l" .string "Okay?\l" .string "All right!$" Route25_SeaCottage_Text_NoPleaseBeautiful:: .string "No!?\n" .string "Now don't be so cold!\p" .string "Come on, you gotta help a guy in\n" .string "deep, deep trouble!\p" .string "What do you say, beautiful?\n" .string "Please?\l" .string "Okay?\l" .string "All right!$" Route25_SeaCottage_Text_ThanksBudTakeThis:: .string "BILL: Yeehah!\n" .string "Thanks, bud! I owe you one!\p" .string "So, did you come to see my\n" .string "POKéMON collection?\p" .string "You didn't?\n" .string "That's a bummer.\p" .string "I've got to thank you…\n" .string "Oh, here, maybe this'll do.$" Route25_SeaCottage_Text_ThanksLadyTakeThis:: .string "BILL: Yeehah!\n" .string "Thanks, lady! I owe you one!\p" .string "So, did you come to see my\n" .string "POKéMON collection?\p" .string "You didn't?\n" .string "That's a bummer.\p" .string "I've got to thank you…\n" .string "Oh, here, maybe this'll do.$" Route25_SeaCottage_Text_ReceivedSSTicketFromBill:: .string "{PLAYER} received an S.S. TICKET\n" .string "from BILL.$" Route25_SeaCottage_Text_YouveGotTooMuchStuff:: .string "You've got too much stuff!$" Route25_SeaCottage_Text_SSAnnePartyYouGoInstead:: .string "That cruise ship S.S. ANNE is in\n" .string "VERMILION CITY.\p" .string "I hear there are lots of TRAINERS\n" .string "on board, too.\p" .string "They invited me to their party, but\n" .string "I can't stand fancy do's.\p" .string "Why don't you go instead of me?\n" .string "Go on and have a good time.$" Route25_SeaCottage_Text_CheckOutRareMonsOnPC:: .string "BILL: Feel like checking out some\n" .string "of my rare POKéMON on my PC?\p" .string "Go on, check out my PC.$" Route25_SeaCottage_Text_TeleporterIsDisplayed:: .string "TELEPORTER is displayed on the PC\n" .string "monitor.$" Route25_SeaCottage_Text_InitiatedTeleportersCellSeparator:: .string "{PLAYER} initiated the TELEPORTER's\n" .string "Cell Separator.$" Route25_SeaCottage_Text_BillsFavoriteMonList:: .string "BILL's favorite POKéMON list!$" Route25_SeaCottage_Text_SeeWhichMon:: .string "Which POKéMON do you want to see?$" ================================================ FILE: data/maps/Route2_EastBuilding/map.json ================================================ { "id": "MAP_ROUTE2_EAST_BUILDING", "name": "Route2_EastBuilding", "layout": "LAYOUT_ROUTE2_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 4, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_EastBuilding_EventScript_Aide", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKER", "x": 10, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_EastBuilding_EventScript_Rocker", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 10, "elevation": 0, "dest_map": "MAP_ROUTE2", "dest_warp_id": "5" }, { "x": 7, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE2", "dest_warp_id": "5" }, { "x": 8, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE2", "dest_warp_id": "5" }, { "x": 7, "y": 1, "elevation": 3, "dest_map": "MAP_ROUTE2", "dest_warp_id": "6" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route2_EastBuilding/scripts.inc ================================================ .equ REQUIRED_SEEN_MONS, 10 Route2_EastBuilding_MapScripts:: .byte 0 Route2_EastBuilding_EventScript_Aide:: lock faceplayer call Route2_EastBuilding_EventScript_GetAideRequestInfo goto_if_set FLAG_GOT_HM05, Route2_EastBuilding_EventScript_AlreadyGotHM05 msgbox Route2_EastBuilding_Text_GiveHM05IfSeen10Mons, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons setvar VAR_0x8004, 0 specialvar VAR_RESULT, GetPokedexCount buffernumberstring STR_VAR_3, VAR_0x8006 call Route2_EastBuilding_EventScript_GetAideRequestInfo goto_if_lt VAR_0x8006, REQUIRED_SEEN_MONS, Aide_EventScript_HaventCaughtEnough msgbox Route2_EastBuilding_Text_GreatHereYouGo checkitemspace ITEM_HM05 goto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem giveitem_msg Route2_EastBuilding_Text_ReceivedHM05FromAide, ITEM_HM05 setflag FLAG_GOT_HM05 msgbox Route2_EastBuilding_Text_ExplainHM05 release end Route2_EastBuilding_EventScript_AlreadyGotHM05:: msgbox Route2_EastBuilding_Text_ExplainHM05 release end Route2_EastBuilding_EventScript_GetAideRequestInfo:: buffernumberstring STR_VAR_1, REQUIRED_SEEN_MONS bufferitemname STR_VAR_2, ITEM_HM05 return Route2_EastBuilding_EventScript_Rocker:: msgbox Route2_EastBuilding_Text_CanGetThroughRockTunnel, MSGBOX_NPC end ================================================ FILE: data/maps/Route2_EastBuilding/text.inc ================================================ Route2_EastBuilding_Text_GiveHM05IfSeen10Mons:: .string "Hi! Remember me?\n" .string "I'm one of PROF. OAK's AIDES.\p" .string "If your POKéDEX has complete data\n" .string "on ten species, I'm supposed to\l" .string "give you a reward.\p" .string "PROF. OAK entrusted me with\n" .string "HM05 for you.\p" .string "So, {PLAYER}, let me ask you.\p" .string "Have you gathered data on at least\n" .string "ten kinds of POKéMON?$" Route2_EastBuilding_Text_GreatHereYouGo:: .string "Great! You have caught or owned\n" .string "{STR_VAR_3} kinds of POKéMON!\p" .string "Congratulations!\n" .string "Here you go!$" Route2_EastBuilding_Text_ReceivedHM05FromAide:: .string "{PLAYER} received HM05\n" .string "from the AIDE.$" Route2_EastBuilding_Text_ExplainHM05:: .string "HM05 contains the hidden move\n" .string "FLASH.\p" .string "FLASH lights up even the darkest\n" .string "of caves and dungeons.$" Route2_EastBuilding_Text_CanGetThroughRockTunnel:: .string "Once a POKéMON learns FLASH, you\n" .string "can get through ROCK TUNNEL.$" ================================================ FILE: data/maps/Route2_House/map.json ================================================ { "id": "MAP_ROUTE2_HOUSE", "name": "Route2_House", "layout": "LAYOUT_HOUSE2", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_House_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GBA_KID", "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_House_EventScript_Reyley", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 0, "dest_map": "MAP_ROUTE2", "dest_warp_id": "4" }, { "x": 4, "y": 7, "elevation": 0, "dest_map": "MAP_ROUTE2", "dest_warp_id": "4" }, { "x": 5, "y": 7, "elevation": 0, "dest_map": "MAP_ROUTE2", "dest_warp_id": "4" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route2_House/scripts.inc ================================================ Route2_House_MapScripts:: .byte 0 Route2_House_EventScript_Scientist:: msgbox Route2_House_Text_FaintedMonsCanUseFieldMoves, MSGBOX_NPC end Route2_House_EventScript_Reyley:: lock faceplayer setvar VAR_0x8008, INGAME_TRADE_MR_MIME call EventScript_GetInGameTradeSpeciesInfo goto_if_set FLAG_DID_MIMIEN_TRADE, Route2_House_EventScript_AlreadyTraded msgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Route2_House_EventScript_DeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, Route2_House_EventScript_DeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, Route2_House_EventScript_NotRequestedMon call EventScript_DoInGameTrade msgbox Trade_Text_HeyThanks setflag FLAG_DID_MIMIEN_TRADE release end Route2_House_EventScript_DeclineTrade:: msgbox Trade_Text_AwwOhWell release end Route2_House_EventScript_NotRequestedMon:: bufferspeciesname STR_VAR_1, VAR_0x8009 msgbox Trade_Text_WhatThatsNoMon release end Route2_House_EventScript_AlreadyTraded:: msgbox Trade_Text_IsntMyOldMonGreat release end ================================================ FILE: data/maps/Route2_House/text.inc ================================================ Route2_House_Text_FaintedMonsCanUseFieldMoves:: .string "A fainted POKéMON just has no\n" .string "energy left to battle.\p" .string "It can still use moves like CUT\n" .string "outside of battle.$" ================================================ FILE: data/maps/Route2_ViridianForest_NorthEntrance/map.json ================================================ { "id": "MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE", "name": "Route2_ViridianForest_NorthEntrance", "layout": "LAYOUT_ROUTE2_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_ViridianForest_NorthEntrance_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 4, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_ViridianForest_NorthEntrance_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 10, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_ViridianForest_NorthEntrance_EventScript_CooltrainerF", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Butterfree", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 10, "elevation": 3, "dest_map": "MAP_VIRIDIAN_FOREST", "dest_warp_id": "2" }, { "x": 7, "y": 10, "elevation": 3, "dest_map": "MAP_VIRIDIAN_FOREST", "dest_warp_id": "2" }, { "x": 8, "y": 10, "elevation": 3, "dest_map": "MAP_VIRIDIAN_FOREST", "dest_warp_id": "2" }, { "x": 7, "y": 1, "elevation": 3, "dest_map": "MAP_ROUTE2", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Route2_ViridianForest_NorthEntrance/scripts.inc ================================================ .set LOCALID_BUTTERFREE_MASTER, 4 .set TRAINER, VAR_0x8009 Route2_ViridianForest_NorthEntrance_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route2_ViridianForest_NorthEntrance_MapScript_SetMasterTrainerMovementTypes .byte 0 Route2_ViridianForest_NorthEntrance_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_BUTTERFREE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route2_ViridianForest_NorthEntrance_MapScript_ButterfreeMasterMovementType end Route2_ViridianForest_NorthEntrance_MapScript_ButterfreeMasterMovementType:: setobjectmovementtype LOCALID_BUTTERFREE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route2_ViridianForest_NorthEntrance_EventScript_Youngster:: msgbox Route2_ViridianForest_NorthEntrance_Text_ManyMonsOnlyInForests, MSGBOX_NPC end Route2_ViridianForest_NorthEntrance_EventScript_OldMan:: msgbox Route2_ViridianForest_NorthEntrance_Text_CanCutSkinnyTrees, MSGBOX_NPC end Route2_ViridianForest_NorthEntrance_EventScript_CooltrainerF:: msgbox Route2_ViridianForest_NorthEntrance_Text_CanCancelEvolution, MSGBOX_NPC end ================================================ FILE: data/maps/Route2_ViridianForest_NorthEntrance/text.inc ================================================ Route2_ViridianForest_NorthEntrance_Text_ManyMonsOnlyInForests:: .string "Many POKéMON live only in forests \n" .string "and caves.\p" .string "You need to be persistent and look\n" .string "everywhere to get different kinds.$" Route2_ViridianForest_NorthEntrance_Text_CanCutSkinnyTrees:: .string "Have you noticed the skinny trees\n" .string "on the roadside?\p" .string "They can be cut down by a special\n" .string "POKéMON move, I hear.$" Route2_ViridianForest_NorthEntrance_Text_CanCancelEvolution:: .string "Do you know the evolution-cancel\n" .string "technique?\p" .string "When a POKéMON is evolving, you\n" .string "can stop the process.\p" .string "It's a technique for raising\n" .string "POKéMON the way they are.$" ================================================ FILE: data/maps/Route2_ViridianForest_SouthEntrance/map.json ================================================ { "id": "MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE", "name": "Route2_ViridianForest_SouthEntrance", "layout": "LAYOUT_ROUTE2_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 10, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_ViridianForest_SouthEntrance_EventScript_Woman1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "x": 4, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route2_ViridianForest_SouthEntrance_EventScript_Woman2", "flag": "0" } ], "warp_events": [ { "x": 6, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE2", "dest_warp_id": "2" }, { "x": 7, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE2", "dest_warp_id": "2" }, { "x": 8, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE2", "dest_warp_id": "2" }, { "x": 7, "y": 1, "elevation": 3, "dest_map": "MAP_VIRIDIAN_FOREST", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route2_ViridianForest_SouthEntrance/scripts.inc ================================================ Route2_ViridianForest_SouthEntrance_MapScripts:: .byte 0 Route2_ViridianForest_SouthEntrance_EventScript_Woman1:: msgbox Route2_ViridianForest_SouthEntrance_Text_ForestIsMaze, MSGBOX_NPC end Route2_ViridianForest_SouthEntrance_EventScript_Woman2:: msgbox Route2_ViridianForest_SouthEntrance_Text_RattataHasWickedBite, MSGBOX_NPC end ================================================ FILE: data/maps/Route2_ViridianForest_SouthEntrance/text.inc ================================================ Route2_ViridianForest_SouthEntrance_Text_ForestIsMaze:: .string "Are you going to VIRIDIAN FOREST?\n" .string "It's a natural maze in there.\l" .string "Be careful you don't get lost.$" Route2_ViridianForest_SouthEntrance_Text_RattataHasWickedBite:: .string "RATTATA may be small, but don't\n" .string "underestimate its wicked bite.\p" .string "Have you caught one already?$" ================================================ FILE: data/maps/Route3/map.json ================================================ { "id": "MAP_ROUTE3", "name": "Route3", "layout": "LAYOUT_ROUTE3", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_3", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 60, "map": "MAP_ROUTE4" }, { "direction": "left", "offset": -10, "map": "MAP_PEWTER_CITY" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 70, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route3_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 40, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route3_EventScript_Robin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 32, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route3_EventScript_James", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 30, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route3_EventScript_Sally", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 25, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route3_EventScript_Greg", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 29, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route3_EventScript_Calvin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 19, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route3_EventScript_Janice", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 12, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route3_EventScript_Colton", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 17, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route3_EventScript_Ben", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 43, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_NidoranF", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 72, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route3_EventScript_RouteSign" }, { "type": "hidden_item", "x": 26, "y": 9, "elevation": 3, "item": "ITEM_ORAN_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE3_ORAN_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "1" } ================================================ FILE: data/maps/Route3/scripts.inc ================================================ .set LOCALID_NIDORAN_F_MASTER, 10 .set TRAINER, VAR_0x8009 Route3_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route3_MapScript_SetMasterTrainerMovementTypes .byte 0 Route3_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_NIDORAN_F callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route3_MapScript_NidoranFMasterMovementType end Route3_MapScript_NidoranFMasterMovementType:: setobjectmovementtype LOCALID_NIDORAN_F_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route3_EventScript_Youngster:: msgbox Route3_Text_TunnelFromCeruleanTiring, MSGBOX_NPC end Route3_EventScript_RouteSign:: msgbox Route3_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route3/text.inc ================================================ Route3_Text_TunnelFromCeruleanTiring:: .string "Whew… I better take a rest…\n" .string "Groan…\p" .string "That tunnel from CERULEAN takes a\n" .string "lot out of you!$" Route3_Text_ColtonIntro:: .string "Hey!\n" .string "I saw you in VIRIDIAN FOREST!$" Route3_Text_ColtonDefeat:: .string "You beat me again!$" Route3_Text_ColtonPostBattle:: .string "There are other kinds of POKéMON\n" .string "than the ones you find in forests.$" Route3_Text_BenIntro:: .string "Hi!\n" .string "I like shorts!\p" .string "They're delightfully comfy and\n" .string "easy to wear!$" Route3_Text_BenDefeat:: .string "I don't believe it!$" Route3_Text_BenPostBattle:: .string "Are you using a POKéMON CENTER's\n" .string "PC for storing your POKéMON?\p" .string "Each BOX can hold up to\n" .string "30 POKéMON.$" Route3_Text_JaniceIntro:: .string "Excuse me!\n" .string "You looked at me, didn't you?$" Route3_Text_JaniceDefeat:: .string "You're mean!$" Route3_Text_JanicePostBattle:: .string "You shouldn't be staring if you\n" .string "don't want to battle!$" Route3_Text_GregIntro:: .string "Are you a TRAINER?\n" .string "Let's get with it right away!$" Route3_Text_GregDefeat:: .string "If I had new POKéMON, I would've\n" .string "won!$" Route3_Text_GregPostBattle:: .string "If a POKéMON BOX on the PC gets\n" .string "full, just switch to another BOX.$" Route3_Text_SallyIntro:: .string "That look you gave me…\n" .string "It's so intriguing!$" Route3_Text_SallyDefeat:: .string "Be nice!$" Route3_Text_SallyPostBattle:: .string "You can avoid battles by not\n" .string "letting TRAINERS see you.$" Route3_Text_CalvinIntro:: .string "Hey! You're not wearing shorts!\n" .string "What's wrong with you?$" Route3_Text_CalvinDefeat:: .string "Lost!\n" .string "Lost! Lost!$" Route3_Text_CalvinPostBattle:: .string "I always wear shorts, even in\n" .string "winter. That's my policy.$" Route3_Text_JamesIntro:: .string "I'll battle you with the POKéMON\n" .string "I just caught.$" Route3_Text_JamesDefeat:: .string "Done like dinner!$" Route3_Text_JamesPostBattle:: .string "Trained POKéMON are stronger than\n" .string "the wild ones.$" Route3_Text_RobinIntro:: .string "Eek!\n" .string "Did you touch me?$" Route3_Text_RobinDefeat:: .string "That's it?$" Route3_Text_RobinPostBattle:: .string "ROUTE 4 is at the foot of\n" .string "MT. MOON.$" Route3_Text_RouteSign:: .string "ROUTE 3\n" .string "MT. MOON AHEAD$" ================================================ FILE: data/maps/Route4/map.json ================================================ { "id": "MAP_ROUTE4", "name": "Route4", "layout": "LAYOUT_ROUTE4", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_4", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": -60, "map": "MAP_ROUTE3" }, { "direction": "right", "offset": -10, "map": "MAP_CERULEAN_CITY" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 9, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 75, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route4_EventScript_Crissy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 67, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_EventScript_ItemTM05", "flag": "FLAG_HIDE_ROUTE4_TM05" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 15, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_EventScript_Boy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 47, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_EventScript_MegaPunchTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 50, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_EventScript_MegaKickTutor", "flag": "0" }, { "type": "clone", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "x": 109, "y": 3, "target_local_id": 12, "target_map": "MAP_CERULEAN_CITY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 58, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Bulbasaur", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 20, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_NidoranM", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 85, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Ekans", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER", "in_connection": false, "x": 98, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Golduck", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 19, "y": 5, "elevation": 3, "dest_map": "MAP_MT_MOON_1F", "dest_warp_id": "3" }, { "x": 32, "y": 5, "elevation": 0, "dest_map": "MAP_MT_MOON_B1F", "dest_warp_id": "7" }, { "x": 12, "y": 5, "elevation": 0, "dest_map": "MAP_ROUTE4_POKEMON_CENTER_1F", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 18, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route4_EventScript_MtMoonSign" }, { "type": "sign", "x": 34, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route4_EventScript_RouteSign" }, { "type": "hidden_item", "x": 43, "y": 2, "elevation": 3, "item": "ITEM_GREAT_BALL", "flag": "FLAG_HIDDEN_ITEM_ROUTE4_GREAT_BALL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 5, "y": 4, "elevation": 3, "item": "ITEM_PERSIM_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE4_PERSIM_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 67, "y": 17, "elevation": 3, "item": "ITEM_HONDEW_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE4_HONDEW_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "3" } ================================================ FILE: data/maps/Route4/scripts.inc ================================================ .set LOCALID_BULBASAUR_MASTER, 8 .set LOCALID_NIDORAN_M_MASTER, 9 .set LOCALID_EKANS_MASTER, 10 .set LOCALID_GOLDUCK_MASTER, 11 .set TRAINER, VAR_0x8009 Route4_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route4_MapScript_SetMasterTrainerMovementTypes .byte 0 Route4_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_BULBASAUR callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route4_MapScript_BulbasaurMasterMovementType setvar TRAINER, MASTER_NIDORAN_M callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route4_MapScript_NidoranMMasterMovementType setvar TRAINER, MASTER_EKANS callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route4_MapScript_EkansMasterMovementType setvar TRAINER, MASTER_GOLDUCK callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route4_MapScript_GolduckMasterMovementType end Route4_MapScript_BulbasaurMasterMovementType:: setobjectmovementtype LOCALID_BULBASAUR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route4_MapScript_NidoranMMasterMovementType:: setobjectmovementtype LOCALID_NIDORAN_M_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route4_MapScript_EkansMasterMovementType:: setobjectmovementtype LOCALID_EKANS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route4_MapScript_GolduckMasterMovementType:: setobjectmovementtype LOCALID_GOLDUCK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM return Route4_EventScript_Woman:: msgbox Route4_Text_TrippedOverGeodude, MSGBOX_NPC end Route4_EventScript_MtMoonSign:: msgbox Route4_Text_MtMoonEntrance, MSGBOX_SIGN end Route4_EventScript_RouteSign:: msgbox Route4_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route4/text.inc ================================================ Route4_Text_TrippedOverGeodude:: .string "Ouch! I tripped over a rocky\n" .string "POKéMON, GEODUDE!$" Route4_Text_CrissyIntro:: .string "I came to MT. MOON in search of\n" .string "mushroom POKéMON.$" Route4_Text_CrissyDefeat:: .string "After all I did to catch them!$" Route4_Text_CrissyPostBattle:: .string "There might not be any more\n" .string "mushrooms here.\p" .string "I think I got them all.$" Route4_Text_MtMoonEntrance:: .string "MT. MOON\n" .string "Tunnel Entrance$" Route4_Text_RouteSign:: .string "ROUTE 4\n" .string "MT. MOON - CERULEAN CITY$" Text_MegaPunchTeach:: .string "A punch of roaring ferocity!\p" .string "Packed with destructive power!\p" .string "When the chips are down,\n" .string "MEGA PUNCH is the ultimate attack!\l" .string "You agree, yes?\p" .string "Now!\n" .string "Let me teach it to your POKéMON!$" Text_MegaPunchDeclined:: .string "You'll be back when you understand\n" .string "the worth of MEGA PUNCH.$" Text_MegaPunchWhichMon:: .string "Fine!\n" .string "Which POKéMON will learn it?$" Text_MegaPunchTaught:: .string "Now, we are comrades in the way of\n" .string "punching!\p" .string "You should go before you're seen\n" .string "by the misguided fool who trains\l" .string "only his silly kicking over there.$" Text_MegaPunchReteach:: .string "A punch so powerful, you can't\n" .string "help but want to learn it again!\p" .string "I can teach you the power-packed\n" .string "MEGA PUNCH again for ¥5000!$" Text_MegaPunchReteach2:: .string "Do you want me to teach MEGA PUNCH\n" .string "to your POKéMON?$" Text_MegaPunchNotEnoughMoney:: .string "Money is packed with power too,\n" .string "and without ¥5000, I can't teach\l" .string "MEGA PUNCH to your POKéMON!$" Text_MegaKickTeach:: .string "A kick of brutal ferocity!\p" .string "Packed with destructive power!\p" .string "When you get right down to it,\n" .string "MEGA KICK is the ultimate attack!\l" .string "Don't you agree?\p" .string "Okay!\n" .string "I'll teach it to your POKéMON!$" Text_MegaKickDeclined:: .string "You'll come crawling back when you\n" .string "realize the value of MEGA KICK.$" Text_MegaKickWhichMon:: .string "All right!\n" .string "Which POKéMON wants to learn it?$" Text_MegaKickTaught:: .string "Now, we are soul mates in the way\n" .string "of kicking!\p" .string "You should run before you're seen\n" .string "by the deluded nitwit who trains\l" .string "only simple punching over there.$" Text_MegaKickReteach:: .string "A kick so powerful, you can't\n" .string "help but want to learn it again!\p" .string "I can teach you the power-packed\n" .string "MEGA KICK again for ¥5000!$" Text_MegaKickReteach2:: .string "Do you want me to teach MEGA KICK\n" .string "to your POKéMON?$" Text_MegaKickNotEnoughMoney:: .string "Money is packed with power too,\n" .string "and without ¥5000, I can't teach\l" .string "MEGA KICK to your POKéMON!$" Route4_Text_PeopleLikeAndRespectBrock:: .string "Oh, wow, that's the BOULDERBADGE!\n" .string "You got it from BROCK, didn't you?\p" .string "BROCK is cool. He's not just tough.\n" .string "People like and respect him.\p" .string "I want to become a GYM LEADER\n" .string "like him.$" ================================================ FILE: data/maps/Route4_PokemonCenter_1F/map.json ================================================ { "id": "MAP_ROUTE4_POKEMON_CENTER_1F", "name": "Route4_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_ROUTE_4", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 1, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_PokemonCenter_1F_EventScript_MagikarpSalesman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_PokemonCenter_1F_EventScript_Boy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 14, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLIPBOARD", "in_connection": false, "x": 12, "y": 6, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route4_PokemonCenter_1F_EventScript_Newspaper", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_YOUNGSTER", "in_connection": false, "x": 3, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Magikarp", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE4", "dest_warp_id": "2" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE4", "dest_warp_id": "2" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE4", "dest_warp_id": "2" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_ROUTE4_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Route4_PokemonCenter_1F/scripts.inc ================================================ .equ MAGIKARP_PRICE, 500 .set LOCALID_MAGIKARP_MASTER, 9 .set TRAINER, VAR_0x8009 Route4_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route4_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 Route4_PokemonCenter_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_ROUTE4_POKEMON_CENTER_1F setrespawn SPAWN_ROUTE4 goto Route4_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes end Route4_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MAGIKARP callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route4_PokemonCenter_1F_MapScript_MagikarpMasterMovementType end Route4_PokemonCenter_1F_MapScript_MagikarpMasterMovementType:: setobjectmovementtype LOCALID_MAGIKARP_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route4_PokemonCenter_1F_EventScript_Boy:: msgbox Route4_PokemonCenter_1F_Text_CanHaveSixMonsWithYou, MSGBOX_NPC end Route4_PokemonCenter_1F_EventScript_Gentleman:: lock msgbox Route4_PokemonCenter_1F_Text_TeamRocketAttacksCerulean release end Route4_PokemonCenter_1F_EventScript_MagikarpSalesman:: lock faceplayer goto_if_set FLAG_BOUGHT_MAGIKARP, Route4_PokemonCenter_1F_EventScript_AlreadyBoughtMagikarp showmoneybox 0, 0 checkplayergender goto_if_eq VAR_RESULT, MALE, Route4_PokemonCenter_1F_EventScript_AskBuyMagikarpMale goto_if_eq VAR_RESULT, FEMALE, Route4_PokemonCenter_1F_EventScript_AskBuyMagikarpFemale end Route4_PokemonCenter_1F_EventScript_AskBuyMagikarpMale:: msgbox Route4_PokemonCenter_1F_Text_LaddieBuyMagikarpForJust500, MSGBOX_YESNO goto Route4_PokemonCenter_1F_EventScript_TryBuyMagikarp end Route4_PokemonCenter_1F_EventScript_AskBuyMagikarpFemale:: msgbox Route4_PokemonCenter_1F_Text_SweetieBuyMagikarpForJust500, MSGBOX_YESNO goto Route4_PokemonCenter_1F_EventScript_TryBuyMagikarp end Route4_PokemonCenter_1F_EventScript_TryBuyMagikarp:: goto_if_eq VAR_RESULT, NO, Route4_PokemonCenter_1F_EventScript_DeclineMagikarp checkmoney MAGIKARP_PRICE goto_if_eq VAR_RESULT, FALSE, Route4_PokemonCenter_1F_EventScript_NotEnoughMoney textcolor NPC_TEXT_COLOR_NEUTRAL setvar VAR_TEMP_1, SPECIES_MAGIKARP givemon SPECIES_MAGIKARP, 5 goto_if_eq VAR_RESULT, 0, Route4_PokemonCenter_1F_EventScript_BuyMagikarpParty goto_if_eq VAR_RESULT, 1, Route4_PokemonCenter_1F_EventScript_BuyMagikarpPC goto_if_eq VAR_RESULT, 2, Route4_PokemonCenter_1F_EventScript_NoRoomForMagikarp end Route4_PokemonCenter_1F_EventScript_BuyMagikarpParty:: call Route4_PokemonCenter_1F_EventScript_PayForMagikarp callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, Route4_PokemonCenter_1F_EventScript_NicknameMagikarpParty msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Route4_PokemonCenter_1F_EventScript_EndPurchaseMagikarp Route4_PokemonCenter_1F_EventScript_NicknameMagikarpParty:: call EventScript_GetGiftMonPartySlot fadescreen FADE_TO_BLACK hidemoneybox special ChangePokemonNickname waitstate goto Route4_PokemonCenter_1F_EventScript_BoughtMagikarp end Route4_PokemonCenter_1F_EventScript_BuyMagikarpPC:: call Route4_PokemonCenter_1F_EventScript_PayForMagikarp callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, Route4_PokemonCenter_1F_EventScript_NicknameMagikarpPC msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, Route4_PokemonCenter_1F_EventScript_TransferMagikarpCloseMoneyBox Route4_PokemonCenter_1F_EventScript_NicknameMagikarpPC:: fadescreen FADE_TO_BLACK hidemoneybox special ChangeBoxPokemonNickname waitstate lock faceplayer goto Route4_PokemonCenter_1F_EventScript_TransferMagikarp end Route4_PokemonCenter_1F_EventScript_TransferMagikarpCloseMoneyBox:: call EventScript_TransferredToPC goto Route4_PokemonCenter_1F_EventScript_EndPurchaseMagikarp end Route4_PokemonCenter_1F_EventScript_TransferMagikarp:: call EventScript_TransferredToPC goto Route4_PokemonCenter_1F_EventScript_BoughtMagikarp end Route4_PokemonCenter_1F_EventScript_EndPurchaseMagikarp:: hidemoneybox goto Route4_PokemonCenter_1F_EventScript_BoughtMagikarp end Route4_PokemonCenter_1F_EventScript_BoughtMagikarp:: setflag FLAG_BOUGHT_MAGIKARP release end Route4_PokemonCenter_1F_EventScript_PayForMagikarp:: removemoney MAGIKARP_PRICE updatemoneybox playfanfare MUS_LEVEL_UP message Route4_PokemonCenter_1F_Text_PaidOutrageouslyForMagikarp waitmessage waitfanfare bufferspeciesname STR_VAR_1, SPECIES_MAGIKARP return Route4_PokemonCenter_1F_EventScript_DeclineMagikarp:: msgbox Route4_PokemonCenter_1F_Text_OnlyDoingThisAsFavorToYou hidemoneybox release end Route4_PokemonCenter_1F_EventScript_NotEnoughMoney:: msgbox Route4_PokemonCenter_1F_Text_YoullNeedMoreMoney hidemoneybox release end Route4_PokemonCenter_1F_EventScript_AlreadyBoughtMagikarp:: msgbox Route4_PokemonCenter_1F_Text_IDontGiveRefunds release end Route4_PokemonCenter_1F_EventScript_NoRoomForMagikarp:: textcolor NPC_TEXT_COLOR_MALE msgbox Route4_PokemonCenter_1F_Text_NoRoomForMorePokemon hidemoneybox release end Route4_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end Route4_PokemonCenter_1F_EventScript_Youngster:: msgbox Route4_PokemonCenter_1F_Text_ShouldStoreMonsUsingPC, MSGBOX_NPC end Route4_PokemonCenter_1F_EventScript_Newspaper:: lock msgbox Route4_PokemonCenter_1F_Text_ItsANewspaper release end ================================================ FILE: data/maps/Route4_PokemonCenter_1F/text.inc ================================================ Route4_PokemonCenter_1F_Text_CanHaveSixMonsWithYou:: .string "Okay, set six POKé BALLS in my\n" .string "belt…\p" .string "Yeah, that'll do it. At most, you\n" .string "can have six POKéMON with you.$" Route4_PokemonCenter_1F_Text_TeamRocketAttacksCerulean:: .string "TEAM ROCKET attacks CERULEAN\n" .string "citizens…\p" .string "Not a day goes by without TEAM\n" .string "ROCKET being in the news.$" Route4_PokemonCenter_1F_Text_LaddieBuyMagikarpForJust500:: .string "MAN: Hello there, laddie!\n" .string "Have I got a deal just for you!\p" .string "I'll let you have a secret POKéMON\n" .string "- a MAGIKARP - for just ¥500!\p" .string "So, you'll buy it, am I right?$" Route4_PokemonCenter_1F_Text_SweetieBuyMagikarpForJust500:: .string "MAN: Hello there, sweetie pie!\n" .string "Have I got a deal just for you!\p" .string "I'll let you have a secret POKéMON\n" .string "- a MAGIKARP - for just ¥500!\p" .string "So, you'll buy it, am I right?$" Route4_PokemonCenter_1F_Text_PaidOutrageouslyForMagikarp:: .string "{PLAYER} paid an outrageous ¥500\n" .string "and bought the MAGIKARP…$" Route4_PokemonCenter_1F_Text_OnlyDoingThisAsFavorToYou:: .string "No? You say no? I'm only doing this\n" .string "as a favor to you!$" Route4_PokemonCenter_1F_Text_NoRoomForMorePokemon:: .string "There's no more room for any more\n" .string "POKéMON, it looks like.$" Route4_PokemonCenter_1F_Text_YoullNeedMoreMoney:: .string "You'll need more money than that!$" Route4_PokemonCenter_1F_Text_IDontGiveRefunds:: .string "MAN: Well, I don't give refunds.\n" .string "You knew what you were getting!$" Route4_PokemonCenter_1F_Text_ShouldStoreMonsUsingPC:: .string "Sometimes, you'll have too many\n" .string "POKéMON with you to add any more.\p" .string "In that case, you should just\n" .string "store some using any PC.$" Route4_PokemonCenter_1F_Text_ItsANewspaper:: .string "It's a newspaper.$" ================================================ FILE: data/maps/Route4_PokemonCenter_2F/map.json ================================================ { "id": "MAP_ROUTE4_POKEMON_CENTER_2F", "name": "Route4_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_ROUTE_4", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "in_connection": false, "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_ROUTE4_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Route4_PokemonCenter_2F/scripts.inc ================================================ Route4_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS Route4_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end Route4_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end Route4_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/Route5/map.json ================================================ { "id": "MAP_ROUTE5", "name": "Route5", "layout": "LAYOUT_ROUTE5", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_5", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_CERULEAN_CITY" }, { "direction": "down", "offset": 0, "map": "MAP_SAFFRON_CITY_CONNECTION" } ], "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_MASTER_BLACK_BELT", "in_connection": false, "x": 23, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Mankey", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 31, "y": 31, "elevation": 0, "dest_map": "MAP_UNDERGROUND_PATH_NORTH_ENTRANCE", "dest_warp_id": "1" }, { "x": 23, "y": 25, "elevation": 0, "dest_map": "MAP_ROUTE5_POKEMON_DAY_CARE", "dest_warp_id": "1" }, { "x": 24, "y": 32, "elevation": 3, "dest_map": "MAP_ROUTE5_SOUTH_ENTRANCE", "dest_warp_id": "1" }, { "x": 25, "y": 32, "elevation": 3, "dest_map": "MAP_ROUTE5_SOUTH_ENTRANCE", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 32, "y": 32, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route5_EventScript_UndergroundPathSign" } ], "level_scaling": "2" } ================================================ FILE: data/maps/Route5/scripts.inc ================================================ .set LOCALID_MANKEY_MASTER, 1 .set TRAINER, VAR_0x8009 Route5_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route5_MapScript_SetMasterTrainerMovementTypes .byte 0 Route5_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MANKEY callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route5_MapScript_MankeyMasterMovementType end Route5_MapScript_MankeyMasterMovementType:: setobjectmovementtype LOCALID_MANKEY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route5_EventScript_UndergroundPathSign:: msgbox Route5_Text_UndergroundPathSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route5/text.inc ================================================ Route5_Text_UndergroundPathSign:: .string "UNDERGROUND PATH\n" .string "CERULEAN CITY - VERMILION CITY$" ================================================ FILE: data/maps/Route5_PokemonDayCare/map.json ================================================ { "id": "MAP_ROUTE5_POKEMON_DAY_CARE", "name": "Route5_PokemonDayCare", "layout": "LAYOUT_ROUTE5_POKEMON_DAY_CARE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_5", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route5_PokemonDayCare_EventScript_DaycareMan", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 0, "dest_map": "MAP_ROUTE5", "dest_warp_id": "1" }, { "x": 4, "y": 7, "elevation": 0, "dest_map": "MAP_ROUTE5", "dest_warp_id": "1" }, { "x": 5, "y": 7, "elevation": 0, "dest_map": "MAP_ROUTE5", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route5_PokemonDayCare/scripts.inc ================================================ @ Handled by data/scripts/day_care.inc Route5_PokemonDayCare_MapScripts:: .byte 0 ================================================ FILE: data/maps/Route5_PokemonDayCare/text.inc ================================================ Route5_PokemonDayCare_Text_WantMeToRaiseMon:: .string "I run the DAY-CARE service.\p" .string "Would you like me to raise one of\n" .string "your POKéMON?$" Route5_PokemonDayCare_Text_ComeAgain:: .string "Come again.$" Route5_PokemonDayCare_Text_WhichMonShouldIRaise:: .string "Which POKéMON should I raise?$" Route5_PokemonDayCare_Text_ComeAnytimeYouLike:: .string "Fine.\n" .string "Come anytime you like.$" Route5_PokemonDayCare_Text_LookAfterMonForAWhile:: .string "Fine, I'll look after your\n" .string "{STR_VAR_1} for a while.$" Route5_PokemonDayCare_Text_ComeSeeMeInAWhile:: .string "Come see me in a while.$" Route5_PokemonDayCare_Text_MonNeedsToSpendMoreTime:: .string "You're back already?\p" .string "Your {STR_VAR_1} needs to spend\n" .string "some more time with me.$" Route5_PokemonDayCare_Text_OweMeXForMonsReturn:: .string "You owe me ¥{STR_VAR_2} for the return\n" .string "of this POKéMON.$" Route5_PokemonDayCare_Text_ThankYouHeresMon:: .string "Thank you!\n" .string "Here's your POKéMON.$" Route5_PokemonDayCare_Text_PlayerGotMonBack:: .string "{PLAYER} got {STR_VAR_2} back\n" .string "from the DAY-CARE MAN.$" Route5_PokemonDayCare_Text_OnlyHaveOneMonWithYou:: .string "Oh? You only have one POKéMON\n" .string "with you.$" Route5_PokemonDayCare_Text_WhatWillYouBattleWith:: .string "If you leave me that POKéMON,\n" .string "what will you battle with?$" Route5_PokemonDayCare_Text_MonHasGrownByXLevels:: .string "Your {STR_VAR_1} has grown a lot.\n" .string "Yes, quite a lot, I'd say.\p" .string "Let me see… It started at {STR_VAR_3},\n" .string "so by level it's grown by {STR_VAR_2}.\p" .string "Aren't I great?$" Route5_PokemonDayCare_Text_YouveGotNoRoomForIt:: .string "You can't take this POKéMON back\n" .string "if you've got no room for it.$" Route5_PokemonDayCare_Text_DontHaveEnoughMoney:: .string "You don't have enough money.$" ================================================ FILE: data/maps/Route5_SouthEntrance/map.json ================================================ { "id": "MAP_ROUTE5_SOUTH_ENTRANCE", "name": "Route5_SouthEntrance", "layout": "LAYOUT_SAFFRON_CITY_NORTH_SOUTH_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_5", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "x": 1, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route5_SouthEntrance_EventScript_Guard", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 9, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "9" }, { "x": 4, "y": 1, "elevation": 3, "dest_map": "MAP_ROUTE5", "dest_warp_id": "2" }, { "x": 4, "y": 9, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "9" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_ROUTE5", "dest_warp_id": "3" } ], "coord_events": [ { "type": "trigger", "x": 3, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route5_SouthEntrance_EventScript_GuardTriggerLeft" }, { "type": "trigger", "x": 4, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route5_SouthEntrance_EventScript_GuardTriggerMid" }, { "type": "trigger", "x": 5, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route5_SouthEntrance_EventScript_GuardTriggerRight" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route5_SouthEntrance/scripts.inc ================================================ Route5_SouthEntrance_MapScripts:: .byte 0 Route5_SouthEntrance_EventScript_Guard:: msgbox Route5_SouthEntrance_Text_HiHowsItGoing, MSGBOX_NPC end Route5_SouthEntrance_EventScript_GuardTriggerLeft:: lockall setvar VAR_TEMP_1, 0 goto Route5_SouthEntrance_EventScript_GuardTrigger end Route5_SouthEntrance_EventScript_GuardTriggerMid:: lockall setvar VAR_TEMP_1, 1 goto Route5_SouthEntrance_EventScript_GuardTrigger end Route5_SouthEntrance_EventScript_GuardTriggerRight:: lockall setvar VAR_TEMP_1, 2 goto Route5_SouthEntrance_EventScript_GuardTrigger end Route5_SouthEntrance_EventScript_GuardTrigger:: textcolor NPC_TEXT_COLOR_MALE applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 goto_if_set FLAG_GOT_TEA, Route5_SouthEntrance_EventScript_GiveTea msgbox Route5_SouthEntrance_Text_ThirstyOnGuardDuty closemessage applymovement OBJ_EVENT_ID_PLAYER, Route5_SouthEntrance_Movement_BlockPlayerEntry waitmovement 0 releaseall end Route5_SouthEntrance_EventScript_GiveTea:: removeitem ITEM_TEA goto Route5_SouthEntrance_EventScript_GuardDrinkTea end Route5_SouthEntrance_EventScript_GuardDrinkTea:: msgbox Route5_SouthEntrance_Text_ThatTeaLooksTasty closemessage call_if_eq VAR_TEMP_1, 0, Route5_SouthEntrance_EventScript_WalkToGuardLeft call_if_eq VAR_TEMP_1, 1, Route5_SouthEntrance_EventScript_WalkToGuardMid call_if_eq VAR_TEMP_1, 2, Route5_SouthEntrance_EventScript_WalkToGuardRight msgbox Route5_SouthEntrance_Text_ThanksIllShareTeaWithGuards setvar VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES, 1 releaseall end Route5_SouthEntrance_EventScript_WalkToGuardLeft:: applymovement OBJ_EVENT_ID_PLAYER, Route5_SouthEntrance_Movement_WalkToGuardLeft waitmovement 0 return Route5_SouthEntrance_EventScript_WalkToGuardMid:: applymovement OBJ_EVENT_ID_PLAYER, Route5_SouthEntrance_Movement_WalkToGuardMid waitmovement 0 return Route5_SouthEntrance_EventScript_WalkToGuardRight:: applymovement OBJ_EVENT_ID_PLAYER, Route5_SouthEntrance_Movement_WalkToGuardRight waitmovement 0 return Route5_SouthEntrance_Movement_WalkToGuardMid:: walk_left step_end Route5_SouthEntrance_Movement_WalkToGuardRight:: walk_left walk_left step_end Route5_SouthEntrance_Movement_WalkToGuardLeft:: walk_in_place_left step_end Route5_SouthEntrance_Movement_BlockPlayerEntry:: walk_up step_end ================================================ FILE: data/maps/Route5_SouthEntrance/text.inc ================================================ Route5_SouthEntrance_Text_ThirstyOnGuardDuty:: .string "I'm on guard duty.\n" .string "Gee, I'm thirsty, though!\p" .string "Oh, wait there, the road's closed.$" Route5_SouthEntrance_Text_ThatTeaLooksTasty:: .string "Oh, that TEA…\n" .string "It looks awfully tasty…$" Route5_SouthEntrance_Text_ThanksIllShareTeaWithGuards:: .string "Huh? I can have this drink?\n" .string "Gee, thanks!\l" .string "… …\l" .string "Glug, glug…\l" .string "… …\l" .string "Gulp…\l" .string "If you want to go to SAFFRON\l" .string "CITY…\l" .string "… …\l" .string "You can go on through.\p" .string "I'll share this TEA with the other\n" .string "guards!$" Route5_SouthEntrance_Text_HiHowsItGoing:: .string "Hi, how's it going?$" ================================================ FILE: data/maps/Route6/map.json ================================================ { "id": "MAP_ROUTE6", "name": "Route6", "layout": "LAYOUT_ROUTE6", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_6", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_SAFFRON_CITY_CONNECTION" }, { "direction": "down", "offset": -12, "map": "MAP_VERMILION_CITY" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 3, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route6_EventScript_Keigo", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 12, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "Route6_EventScript_Ricky", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 13, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "Route6_EventScript_Nancy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 20, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route6_EventScript_Elijah", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 13, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route6_EventScript_Isabelle", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 13, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route6_EventScript_Jeff", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 21, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Vulpix", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 19, "y": 13, "elevation": 0, "dest_map": "MAP_UNDERGROUND_PATH_SOUTH_ENTRANCE", "dest_warp_id": "1" }, { "x": 12, "y": 5, "elevation": 3, "dest_map": "MAP_ROUTE6_NORTH_ENTRANCE", "dest_warp_id": "2" }, { "x": 13, "y": 5, "elevation": 3, "dest_map": "MAP_ROUTE6_NORTH_ENTRANCE", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 21, "y": 15, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route6_EventScript_UndergroundPathSign" }, { "type": "hidden_item", "x": 5, "y": 5, "elevation": 3, "item": "ITEM_SITRUS_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE6_SITRUS_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 19, "y": 5, "elevation": 3, "item": "ITEM_RARE_CANDY", "flag": "FLAG_HIDDEN_ITEM_ROUTE6_RARE_CANDY", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/Route6/scripts.inc ================================================ .set LOCALID_VULPIX_MASTER, 7 .set TRAINER, VAR_0x8009 Route6_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route6_MapScript_SetMasterTrainerMovementTypes .byte 0 Route6_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_VULPIX callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route6_MapScript_VulpixMasterMovementType end Route6_MapScript_VulpixMasterMovementType:: setobjectmovementtype LOCALID_VULPIX_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route6_EventScript_UndergroundPathSign:: msgbox Route6_Text_UndergroundPathSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route6/text.inc ================================================ Route6_Text_RickyIntro:: .string "Who's there?\n" .string "Quit listening in on us!$" Route6_Text_RickyDefeat:: .string "I just can't win!$" Route6_Text_RickyPostBattle:: .string "Whisper…\n" .string "Whisper…$" Route6_Text_NancyIntro:: .string "Excuse me!\n" .string "This is a private conversation!$" Route6_Text_NancyDefeat:: .string "Ugh!\n" .string "I hate losing.$" Route6_Text_NancyPostBattle:: .string "Whisper…\n" .string "Whisper…$" Route6_Text_KeigoIntro:: .string "There aren't many bugs out here.$" Route6_Text_KeigoDefeat:: .string "No!\n" .string "You're kidding!$" Route6_Text_KeigoPostBattle:: .string "I like bugs, so I'm going back to\n" .string "VIRIDIAN FOREST.$" Route6_Text_JeffIntro:: .string "Huh?\n" .string "You want to talk to me?$" Route6_Text_JeffDefeat:: .string "This stinks…\n" .string "I couldn't beat your challenge…$" Route6_Text_JeffPostBattle:: .string "I should bring more POKéMON with\n" .string "me. I'll feel safer that way.$" Route6_Text_IsabelleIntro:: .string "Me?\n" .string "Well, okay. I'll play!$" Route6_Text_IsabelleDefeat:: .string "Things just didn't work…$" Route6_Text_IsabellePostBattle:: .string "I want to get stronger.\n" .string "What's your secret?$" Route6_Text_ElijahIntro:: .string "I've never seen you around.\n" .string "Are you good?$" Route6_Text_ElijahDefeat:: .string "You're too good!$" Route6_Text_ElijahPostBattle:: .string "Are my POKéMON weak?\n" .string "Or, am I just bad?\l" .string "Which do you think?$" Route6_Text_UndergroundPathSign:: .string "UNDERGROUND PATH\n" .string "CERULEAN CITY - VERMILION CITY$" ================================================ FILE: data/maps/Route6_NorthEntrance/map.json ================================================ { "id": "MAP_ROUTE6_NORTH_ENTRANCE", "name": "Route6_NorthEntrance", "layout": "LAYOUT_SAFFRON_CITY_NORTH_SOUTH_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_6", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "x": 7, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route6_NorthEntrance_EventScript_Guard", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 1, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "11" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "11" }, { "x": 4, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE6", "dest_warp_id": "1" }, { "x": 5, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE6", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 3, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route6_NorthEntrance_EventScript_GuardTriggerLeft" }, { "type": "trigger", "x": 4, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route6_NorthEntrance_EventScript_GuardTriggerMid" }, { "type": "trigger", "x": 5, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route6_NorthEntrance_EventScript_GuardTriggerRight" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/Route6_NorthEntrance/scripts.inc ================================================ Route6_NorthEntrance_MapScripts:: .byte 0 Route6_NorthEntrance_EventScript_Guard:: msgbox Route6_NorthEntrance_Text_HiHowsItGoing, MSGBOX_NPC end Route6_NorthEntrance_EventScript_GuardTriggerLeft:: lockall setvar VAR_TEMP_1, 0 goto Route6_NorthEntrance_EventScript_GuardTrigger end Route6_NorthEntrance_EventScript_GuardTriggerMid:: lockall setvar VAR_TEMP_1, 1 goto Route6_NorthEntrance_EventScript_GuardTrigger end Route6_NorthEntrance_EventScript_GuardTriggerRight:: lockall setvar VAR_TEMP_1, 2 goto Route6_NorthEntrance_EventScript_GuardTrigger end Route6_NorthEntrance_EventScript_GuardTrigger:: textcolor NPC_TEXT_COLOR_MALE applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 goto_if_set FLAG_GOT_TEA, Route6_NorthEntrance_EventScript_GiveTea msgbox Route6_NorthEntrance_Text_ThirstyOnGuardDuty closemessage applymovement OBJ_EVENT_ID_PLAYER, Route6_NorthEntrance_Movement_BlockPlayerEntry waitmovement 0 releaseall end Route6_NorthEntrance_EventScript_GiveTea:: removeitem ITEM_TEA goto Route6_NorthEntrance_EventScript_GuardDrinkTea end Route6_NorthEntrance_EventScript_GuardDrinkTea:: msgbox Route6_NorthEntrance_Text_ThatTeaLooksTasty closemessage call_if_eq VAR_TEMP_1, 0, Route6_NorthEntrance_EventScript_WalkToGuardLeft call_if_eq VAR_TEMP_1, 1, Route6_NorthEntrance_EventScript_WalkToGuardMid call_if_eq VAR_TEMP_1, 2, Route6_NorthEntrance_EventScript_WalkToGuardRight msgbox Route6_NorthEntrance_Text_ThanksIllShareTeaWithGuards setvar VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES, 1 releaseall end Route6_NorthEntrance_EventScript_WalkToGuardLeft:: applymovement OBJ_EVENT_ID_PLAYER, Route6_NorthEntrance_Movement_WalkToGuardLeft waitmovement 0 return Route6_NorthEntrance_EventScript_WalkToGuardMid:: applymovement OBJ_EVENT_ID_PLAYER, Route6_NorthEntrance_Movement_WalkToGuardMid waitmovement 0 return Route6_NorthEntrance_EventScript_WalkToGuardRight:: applymovement OBJ_EVENT_ID_PLAYER, Route6_NorthEntrance_Movement_WalkToGuardRight waitmovement 0 return Route6_NorthEntrance_Movement_WalkToGuardLeft:: walk_right walk_right step_end Route6_NorthEntrance_Movement_WalkToGuardMid:: walk_right step_end Route6_NorthEntrance_Movement_WalkToGuardRight:: walk_in_place_right step_end Route6_NorthEntrance_Movement_BlockPlayerEntry:: walk_down step_end ================================================ FILE: data/maps/Route6_NorthEntrance/text.inc ================================================ Route6_NorthEntrance_Text_ThirstyOnGuardDuty:: .string "I'm on guard duty.\n" .string "Gee, I'm thirsty, though!\p" .string "Oh, wait there, the road's closed.$" Route6_NorthEntrance_Text_ThatTeaLooksTasty:: .string "Oh, that TEA…\n" .string "It looks awfully tasty…$" Route6_NorthEntrance_Text_ThanksIllShareTeaWithGuards:: .string "Huh? I can have this drink?\n" .string "Gee, thanks!\l" .string "… …\l" .string "Glug, glug…\l" .string "… …\l" .string "Gulp…\l" .string "If you want to go to SAFFRON\l" .string "CITY…\l" .string "… …\l" .string "You can go on through.\p" .string "I'll share this TEA with the other\n" .string "guards!$" Route6_NorthEntrance_Text_HiHowsItGoing:: .string "Hi, how's it going?$" ================================================ FILE: data/maps/Route6_UnusedHouse/map.json ================================================ { "id": "MAP_ROUTE6_UNUSED_HOUSE", "name": "Route6_UnusedHouse", "layout": "LAYOUT_HOUSE2", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_6", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Route6_UnusedHouse/scripts.inc ================================================ Route6_UnusedHouse_MapScripts:: .byte 0 ================================================ FILE: data/maps/Route7/map.json ================================================ { "id": "MAP_ROUTE7", "name": "Route7", "layout": "LAYOUT_ROUTE7", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_7", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": -10, "map": "MAP_CELADON_CITY" }, { "direction": "right", "offset": -10, "map": "MAP_SAFFRON_CITY_CONNECTION" } ], "object_events": [ { "type": "clone", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "x": -8, "y": 12, "target_local_id": 10, "target_map": "MAP_CELADON_CITY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 18, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Growlithe", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 7, "y": 14, "elevation": 0, "dest_map": "MAP_UNDERGROUND_PATH_WEST_ENTRANCE", "dest_warp_id": "1" }, { "x": 15, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE7_EAST_ENTRANCE", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 5, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route7_EventScript_UndergroundPathSign" }, { "type": "hidden_item", "x": 16, "y": 15, "elevation": 3, "item": "ITEM_QUALOT_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE7_QUALOT_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/Route7/scripts.inc ================================================ .set LOCALID_GROWLITHE_MASTER, 2 .set TRAINER, VAR_0x8009 Route7_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route7_MapScript_SetMasterTrainerMovementTypes .byte 0 Route7_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_GROWLITHE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route7_MapScript_GrowlitheMasterMovementType end Route7_MapScript_GrowlitheMasterMovementType:: setobjectmovementtype LOCALID_GROWLITHE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route7_EventScript_UndergroundPathSign:: msgbox Route7_Text_UndergroundPathSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route7/text.inc ================================================ Route7_Text_UndergroundPathSign:: .string "UNDERGROUND PATH\n" .string "CELADON CITY - LAVENDER TOWN$" ================================================ FILE: data/maps/Route7_EastEntrance/map.json ================================================ { "id": "MAP_ROUTE7_EAST_ENTRANCE", "name": "Route7_EastEntrance", "layout": "LAYOUT_SAFFRON_CITY_EAST_WEST_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_7", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route7_EastEntrance_EventScript_Guard", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Sandslash", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 1, "y": 5, "elevation": 3, "dest_map": "MAP_ROUTE7", "dest_warp_id": "1" }, { "x": 1, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE7", "dest_warp_id": "1" }, { "x": 11, "y": 5, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "8" }, { "x": 11, "y": 6, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "8" } ], "coord_events": [ { "type": "trigger", "x": 6, "y": 4, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route7_EastEntrance_EventScript_GuardTriggerTop" }, { "type": "trigger", "x": 6, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route7_EastEntrance_EventScript_GuardTriggerMid" }, { "type": "trigger", "x": 6, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route7_EastEntrance_EventScript_GuardTriggerBottom" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Route7_EastEntrance/scripts.inc ================================================ .set LOCALID_SANDSLASH_MASTER, 2 .set TRAINER, VAR_0x8009 Route7_EastEntrance_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route7_EastEntrance_MapScript_SetMasterTrainerMovementTypes .byte 0 Route7_EastEntrance_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_SANDSLASH callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route7_EastEntrance_MapScript_SandslashMasterMovementType end Route7_EastEntrance_MapScript_SandslashMasterMovementType:: setobjectmovementtype LOCALID_SANDSLASH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route7_EastEntrance_EventScript_Guard:: msgbox Route7_EastEntrance_Text_HiHowsItGoing, MSGBOX_NPC end Route7_EastEntrance_EventScript_GuardTriggerTop:: lockall setvar VAR_TEMP_1, 0 goto Route7_EastEntrance_EventScript_GuardTrigger end Route7_EastEntrance_EventScript_GuardTriggerMid:: lockall setvar VAR_TEMP_1, 1 goto Route7_EastEntrance_EventScript_GuardTrigger end Route7_EastEntrance_EventScript_GuardTriggerBottom:: lockall setvar VAR_TEMP_1, 2 goto Route7_EastEntrance_EventScript_GuardTrigger end Route7_EastEntrance_EventScript_GuardTrigger:: textcolor NPC_TEXT_COLOR_MALE applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto_if_set FLAG_GOT_TEA, Route7_EastEntrance_EventScript_GiveTea msgbox Route7_EastEntrance_Text_ThirstyOnGuardDuty closemessage applymovement OBJ_EVENT_ID_PLAYER, Route7_EastEntrance_Movement_BlockPlayerEntry waitmovement 0 releaseall end Route7_EastEntrance_EventScript_GiveTea:: removeitem ITEM_TEA goto Route7_EastEntrance_EventScript_GuardDrinkTea end Route7_EastEntrance_EventScript_GuardDrinkTea:: msgbox Route7_EastEntrance_Text_ThatTeaLooksTasty closemessage call_if_eq VAR_TEMP_1, 0, Route7_EastEntrance_WalkToGuardTop call_if_eq VAR_TEMP_1, 1, Route7_EastEntrance_WalkToGuardMid call_if_eq VAR_TEMP_1, 2, Route7_EastEntrance_WalkToGuardBottom msgbox Route7_EastEntrance_Text_ThanksIllShareTeaWithGuards setvar VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES, 1 releaseall end Route7_EastEntrance_WalkToGuardTop:: applymovement OBJ_EVENT_ID_PLAYER, Route7_EastEntrance_Movement_WalkToGuardTop waitmovement 0 return Route7_EastEntrance_WalkToGuardMid:: applymovement OBJ_EVENT_ID_PLAYER, Route7_EastEntrance_Movement_WalkToGuardMid waitmovement 0 return Route7_EastEntrance_WalkToGuardBottom:: applymovement OBJ_EVENT_ID_PLAYER, Route7_EastEntrance_Movement_WalkToGuardBottom waitmovement 0 return Route7_EastEntrance_Movement_WalkToGuardMid:: walk_up step_end Route7_EastEntrance_Movement_WalkToGuardBottom:: walk_up walk_up step_end Route7_EastEntrance_Movement_WalkToGuardTop:: walk_in_place_up step_end Route7_EastEntrance_Movement_BlockPlayerEntry:: walk_left step_end ================================================ FILE: data/maps/Route7_EastEntrance/text.inc ================================================ Route7_EastEntrance_Text_ThirstyOnGuardDuty:: .string "I'm on guard duty.\n" .string "Gee, I'm thirsty, though!\p" .string "Oh, wait there, the road's closed.$" Route7_EastEntrance_Text_ThatTeaLooksTasty:: .string "Oh, that TEA…\n" .string "It looks awfully tasty…$" Route7_EastEntrance_Text_ThanksIllShareTeaWithGuards:: .string "Huh? I can have this drink?\n" .string "Gee, thanks!\l" .string "… …\l" .string "Glug, glug…\l" .string "… …\l" .string "Gulp…\l" .string "If you want to go to SAFFRON\l" .string "CITY…\l" .string "… …\l" .string "You can go on through.\p" .string "I'll share this TEA with the other\n" .string "guards!$" Route7_EastEntrance_Text_HiHowsItGoing:: .string "Hi, how's it going?$" ================================================ FILE: data/maps/Route8/map.json ================================================ { "id": "MAP_ROUTE8", "name": "Route8", "layout": "LAYOUT_ROUTE8", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_8", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": -10, "map": "MAP_SAFFRON_CITY_CONNECTION" }, { "direction": "right", "offset": 0, "map": "MAP_LAVENDER_TOWN" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 62, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "6", "script": "Route8_EventScript_Julia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 55, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route8_EventScript_Rich", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 51, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route8_EventScript_Glenn", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 29, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route8_EventScript_Paige", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 29, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "6", "script": "Route8_EventScript_Leslie", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 29, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route8_EventScript_Andrea", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 29, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "6", "script": "Route8_EventScript_Megan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 21, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route8_EventScript_Stan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route8_EventScript_Aidan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 33, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_8_CUT_TREE_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 47, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_8_CUT_TREE_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 40, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route8_EventScript_Eli", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 41, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route8_EventScript_Anne", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 14, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP", "movement_range_x": 5, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route8_EventScript_Ricardo", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 24, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT", "movement_range_x": 5, "movement_range_y": 5, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route8_EventScript_Jaren", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 40, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Beedrill", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 13, "y": 4, "elevation": 0, "dest_map": "MAP_UNDERGROUND_PATH_EAST_ENTRANCE", "dest_warp_id": "1" }, { "x": 7, "y": 10, "elevation": 3, "dest_map": "MAP_ROUTE8_WEST_ENTRANCE", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 16, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route8_EventScript_UndergroundPathSign" }, { "type": "hidden_item", "x": 42, "y": 10, "elevation": 3, "item": "ITEM_RAWST_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE8_RAWST_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 38, "y": 11, "elevation": 3, "item": "ITEM_LUM_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE8_LUM_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 42, "y": 15, "elevation": 3, "item": "ITEM_LEPPA_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE8_LEPPA_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/Route8/scripts.inc ================================================ .set LOCALID_BEEDRILL_MASTER, 16 .set TRAINER, VAR_0x8009 Route8_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route8_MapScript_SetMasterTrainerMovementTypes .byte 0 Route8_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_BEEDRILL callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route8_MapScript_BeedrillMasterMovementType end Route8_MapScript_BeedrillMasterMovementType:: setobjectmovementtype LOCALID_BEEDRILL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route8_EventScript_UndergroundPathSign:: msgbox Route8_Text_UndergroundPathSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route8/text.inc ================================================ Route8_Text_AidanIntro:: .string "You look good at POKéMON, but how\n" .string "is your chemistry grade?$" Route8_Text_AidanDefeat:: .string "Ow!\n" .string "Meltdown!$" Route8_Text_AidanPostBattle:: .string "I am better at school than this!$" Route8_Text_StanIntro:: .string "All right!\n" .string "Let's roll the dice!$" Route8_Text_StanDefeat:: .string "Drat!\n" .string "Came up short!$" Route8_Text_StanPostBattle:: .string "Lady luck's not with me today.$" Route8_Text_GlennIntro:: .string "You should be informed.\n" .string "You need strategy to win at this!$" Route8_Text_GlennDefeat:: .string "It's not logical!$" Route8_Text_GlennPostBattle:: .string "Go with GRIMER first…and…\n" .string "…and…then…$" Route8_Text_PaigeIntro:: .string "I like NIDORAN, so I collect them!$" Route8_Text_PaigeDefeat:: .string "Why?\n" .string "Why??$" Route8_Text_PaigePostBattle:: .string "When POKéMON grow up, they get\n" .string "ugly! They shouldn't evolve.$" Route8_Text_LeslieIntro:: .string "School is fun, but so are POKéMON.$" Route8_Text_LeslieDefeat:: .string "You made it clear to me that\n" .string "I should stick with school.$" Route8_Text_LesliePostBattle:: .string "I was planning on getting some\n" .string "fresh air for a change, but…\p" .string "We're stuck here because of the\n" .string "gates at SAFFRON.$" Route8_Text_AndreaIntro:: .string "MEOWTH is so cute, meow, meow,\n" .string "meow!$" Route8_Text_AndreaDefeat:: .string "Meeeeyow!$" Route8_Text_AndreaPostBattle:: .string "I think PIDGEY and RATTATA are\n" .string "cute, too!$" Route8_Text_MeganIntro:: .string "We must look silly standing here\n" .string "like this.$" Route8_Text_MeganDefeat:: .string "Look what you did to my poor, cute\n" .string "POKéMON!$" Route8_Text_MeganPostBattle:: .string "SAFFRON's gatekeeper won't let us\n" .string "go through.\p" .string "I know he's doing his job, but I\n" .string "think he's mean.$" Route8_Text_RichIntro:: .string "I'm a rambling, gambling dude!$" Route8_Text_RichDefeat:: .string "Missed the big score!$" Route8_Text_RichPostBattle:: .string "Gambling and POKéMON are like\n" .string "eating peanuts! I just can't stop!$" Route8_Text_JuliaIntro:: .string "What's a cute, round, and fluffy\n" .string "POKéMON?$" Route8_Text_JuliaDefeat:: .string "Stop!\p" .string "Don't be so mean to my CLEFAIRY!$" Route8_Text_JuliaPostBattle:: .string "I read that CLEFAIRY evolves when\n" .string "it's exposed to a MOON STONE.\p" .string "I read that in a POKéMON JOURNAL.\n" .string "I wonder if it's true?$" Route8_Text_UndergroundPathSign:: .string "UNDERGROUND PATH\n" .string "CELADON CITY - LAVENDER TOWN$" Route8_Text_EliIntro:: .string "ELI: Twin power is fantastic.\n" .string "Did you know?$" Route8_Text_EliDefeat:: .string "ELI: But…\n" .string "We used our twin power…$" Route8_Text_EliPostBattle:: .string "ELI: I caught my POKéMON with\n" .string "ANNE!$" Route8_Text_EliNotEnoughMons:: .string "ELI: We can't battle if you don't\n" .string "have two POKéMON.$" Route8_Text_AnneIntro:: .string "ANNE: We'll shock you with our twin\n" .string "power!$" Route8_Text_AnneDefeat:: .string "ANNE: Our twin power…$" Route8_Text_AnnePostBattle:: .string "ANNE: I'm raising POKéMON with\n" .string "ELI.$" Route8_Text_AnneNotEnoughMons:: .string "ANNE: Hi, hi! Let's battle!\n" .string "But bring two POKéMON.$" Route8_Text_RicardoIntro:: .string "My bike's acting up, man.$" Route8_Text_RicardoDefeat:: .string "Aww, man.\n" .string "I'm not into this.$" Route8_Text_RicardoPostBattle:: .string "I got grass caught up in my\n" .string "spokes, man.$" Route8_Text_JarenIntro:: .string "Clear the way, or I'll run you\n" .string "down!$" Route8_Text_JarenDefeat:: .string "You for real, kid?$" Route8_Text_JarenPostBattle:: .string "Don't think you're all special and\n" .string "all just because of this.$" ================================================ FILE: data/maps/Route8_WestEntrance/map.json ================================================ { "id": "MAP_ROUTE8_WEST_ENTRANCE", "name": "Route8_WestEntrance", "layout": "LAYOUT_SAFFRON_CITY_EAST_WEST_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_ROUTE_8", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POLICEMAN", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route8_WestEntrance_EventScript_Guard", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Cubone", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 1, "y": 4, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "10" }, { "x": 1, "y": 5, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "10" }, { "x": 11, "y": 5, "elevation": 3, "dest_map": "MAP_ROUTE8", "dest_warp_id": "1" }, { "x": 11, "y": 6, "elevation": 3, "dest_map": "MAP_ROUTE8", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 6, "y": 4, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route8_WestEntrance_EventScript_GuardTriggerTop" }, { "type": "trigger", "x": 6, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route8_WestEntrance_EventScript_GuardTriggerMid" }, { "type": "trigger", "x": 6, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES", "var_value": "0", "script": "Route8_WestEntrance_EventScript_GuardTriggerBottom" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/Route8_WestEntrance/scripts.inc ================================================ .set LOCALID_CUBONE_MASTER, 2 .set TRAINER, VAR_0x8009 Route8_WestEntrance_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route8_WestEntrance_MapScript_SetMasterTrainerMovementTypes .byte 0 Route8_WestEntrance_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_CUBONE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route8_WestEntrance_MapScript_CuboneMasterMovementType end Route8_WestEntrance_MapScript_CuboneMasterMovementType:: setobjectmovementtype LOCALID_CUBONE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route8_WestEntrance_EventScript_Guard:: msgbox Route8_WestEntrance_Text_HiHowsItGoing, MSGBOX_NPC end Route8_WestEntrance_EventScript_GuardTriggerTop:: lockall setvar VAR_TEMP_1, 0 goto Route8_WestEntrance_EventScript_GuardTrigger end Route8_WestEntrance_EventScript_GuardTriggerMid:: lockall setvar VAR_TEMP_1, 1 goto Route8_WestEntrance_EventScript_GuardTrigger end Route8_WestEntrance_EventScript_GuardTriggerBottom:: lockall setvar VAR_TEMP_1, 2 goto Route8_WestEntrance_EventScript_GuardTrigger end Route8_WestEntrance_EventScript_GuardTrigger:: textcolor NPC_TEXT_COLOR_MALE applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto_if_set FLAG_GOT_TEA, Route8_WestEntrance_EventScript_GiveTea msgbox Route8_WestEntrance_Text_ThirstyOnGuardDuty closemessage applymovement OBJ_EVENT_ID_PLAYER, Route8_WestEntrance_Movement_BlockPlayerEntry waitmovement 0 releaseall end Route8_WestEntrance_EventScript_GiveTea:: removeitem ITEM_TEA goto Route8_WestEntrance_EventScript_GuardDrinkTea end @ Unused Route8_WestEntrance_EventScript_GiveSodaPop:: removeitem ITEM_SODA_POP goto Route8_WestEntrance_EventScript_GuardDrinkTea end @ Unused Route8_WestEntrance_EventScript_GiveLemonade:: removeitem ITEM_LEMONADE goto Route8_WestEntrance_EventScript_GuardDrinkTea end Route8_WestEntrance_EventScript_GuardDrinkTea:: msgbox Route8_WestEntrance_Text_ThatTeaLooksTasty closemessage call_if_eq VAR_TEMP_1, 0, Route8_WestEntrance_EventScript_WalkToGuardTop call_if_eq VAR_TEMP_1, 1, Route8_WestEntrance_EventScript_WalkToGuardMid call_if_eq VAR_TEMP_1, 2, Route8_WestEntrance_EventScript_WalkToGuardBottom msgbox Route8_WestEntrance_Text_ThanksIllShareTeaWithGuards setvar VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES, 1 releaseall end Route8_WestEntrance_EventScript_WalkToGuardTop:: applymovement OBJ_EVENT_ID_PLAYER, Route8_WestEntrance_Movement_WalkToGuardTop waitmovement 0 return Route8_WestEntrance_EventScript_WalkToGuardMid:: applymovement OBJ_EVENT_ID_PLAYER, Route8_WestEntrance_Movement_WalkToGuardMid waitmovement 0 return Route8_WestEntrance_EventScript_WalkToGuardBottom:: applymovement OBJ_EVENT_ID_PLAYER, Route8_WestEntrance_Movement_WalkToGuardBottom waitmovement 0 return Route8_WestEntrance_Movement_WalkToGuardMid:: walk_up step_end Route8_WestEntrance_Movement_WalkToGuardBottom:: walk_up walk_up step_end Route8_WestEntrance_Movement_WalkToGuardTop:: walk_in_place_up step_end Route8_WestEntrance_Movement_BlockPlayerEntry:: walk_right step_end ================================================ FILE: data/maps/Route8_WestEntrance/text.inc ================================================ Route8_WestEntrance_Text_ThirstyOnGuardDuty:: .string "I'm on guard duty.\n" .string "Gee, I'm thirsty, though!\p" .string "Oh, wait there, the road's closed.$" Route8_WestEntrance_Text_ThatTeaLooksTasty:: .string "Oh, that TEA…\n" .string "It looks awfully tasty…$" Route8_WestEntrance_Text_ThanksIllShareTeaWithGuards:: .string "Huh? I can have this drink?\n" .string "Gee, thanks!\l" .string "… …\l" .string "Glug, glug…\l" .string "… …\l" .string "Gulp…\l" .string "If you want to go to SAFFRON\l" .string "CITY…\l" .string "… …\l" .string "You can go on through.\p" .string "I'll share this TEA with the other\n" .string "guards!$" Route8_WestEntrance_Text_HiHowsItGoing:: .string "Hi, how's it going?$" ================================================ FILE: data/maps/Route9/map.json ================================================ { "id": "MAP_ROUTE9", "name": "Route9", "layout": "LAYOUT_ROUTE9", "music": "MUS_ROUTE3", "region_map_section": "MAPSEC_ROUTE_9", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": -10, "map": "MAP_CERULEAN_CITY" }, { "direction": "right", "offset": 0, "map": "MAP_ROUTE10" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 14, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route9_EventScript_Alicia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 20, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route9_EventScript_Jeremy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 61, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route9_EventScript_Alan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 26, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route9_EventScript_Chris", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 26, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "Route9_EventScript_Brent", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 49, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "Route9_EventScript_Conner", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 53, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "Route9_EventScript_Brice", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 60, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "Route9_EventScript_Caitlin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 36, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "Route9_EventScript_Drew", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 2, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_ROUTE_9_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route9_EventScript_ItemTM40", "flag": "FLAG_HIDE_ROUTE9_TM40" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 65, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Route9_EventScript_ItemBurnHeal", "flag": "FLAG_HIDE_ROUTE9_BURN_HEAL" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 58, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Ninetales", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 29, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Route9_EventScript_RouteSign" }, { "type": "hidden_item", "x": 15, "y": 7, "elevation": 0, "item": "ITEM_ETHER", "flag": "FLAG_HIDDEN_ITEM_ROUTE9_ETHER", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 63, "y": 2, "elevation": 3, "item": "ITEM_RARE_CANDY", "flag": "FLAG_HIDDEN_ITEM_ROUTE9_RARE_CANDY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 48, "y": 2, "elevation": 3, "item": "ITEM_CHESTO_BERRY", "flag": "FLAG_HIDDEN_ITEM_ROUTE9_CHESTO_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/Route9/scripts.inc ================================================ .set LOCALID_NINETALES_MASTER, 13 .set TRAINER, VAR_0x8009 Route9_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route9_MapScript_SetMasterTrainerMovementTypes .byte 0 Route9_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_NINETALES callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, Route9_MapScript_NinetalesMasterMovementType end Route9_MapScript_NinetalesMasterMovementType:: setobjectmovementtype LOCALID_NINETALES_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return Route9_EventScript_RouteSign:: msgbox Route9_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/Route9/text.inc ================================================ Route9_Text_AliciaIntro:: .string "You have POKéMON with you!\n" .string "You're mine!$" Route9_Text_AliciaDefeat:: .string "You deceived me…$" Route9_Text_AliciaPostBattle:: .string "The tunnel coming up is pitch-black\n" .string "inside.\p" .string "You'll need FLASH to get through\n" .string "there.$" Route9_Text_ChrisIntro:: .string "Who's that walking there with those\n" .string "good-looking POKéMON?$" Route9_Text_ChrisDefeat:: .string "Out like a light!$" Route9_Text_ChrisPostBattle:: .string "Keep walking!$" Route9_Text_DrewIntro:: .string "I'm taking the ROCK TUNNEL to\n" .string "go to LAVENDER…$" Route9_Text_DrewDefeat:: .string "Can't measure up…$" Route9_Text_DrewPostBattle:: .string "Are you off to ROCK TUNNEL, too?$" Route9_Text_CaitlinIntro:: .string "Don't you dare patronize me!$" Route9_Text_CaitlinDefeat:: .string "No!\n" .string "You're too much.$" Route9_Text_CaitlinPostBattle:: .string "You're obviously talented.\n" .string "Good luck to you!$" Route9_Text_JeremyIntro:: .string "Bwahaha!\n" .string "Great! I was bored, eh!$" Route9_Text_JeremyDefeat:: .string "Keep it coming, eh!\p" .string "Oh wait.\n" .string "I'm out of POKéMON!$" Route9_Text_JeremyPostBattle:: .string "You sure had guts standing up to\n" .string "me there, eh?$" Route9_Text_BriceIntro:: .string "Hahaha!\n" .string "Aren't you a little toughie!$" Route9_Text_BriceDefeat:: .string "What's that?$" Route9_Text_BricePostBattle:: .string "Hahaha!\n" .string "Kids should be tough!$" Route9_Text_BrentIntro:: .string "I got up early every day to raise\n" .string "my POKéMON from cocoons!$" Route9_Text_BrentDefeat:: .string "WHAT?\p" .string "What a total waste of time!$" Route9_Text_BrentPostBattle:: .string "I have to collect more than bugs\n" .string "to get stronger…$" Route9_Text_AlanIntro:: .string "Hahahaha!\n" .string "Bring it on!$" Route9_Text_AlanDefeat:: .string "Hahahaha!\n" .string "You beat me fair!$" Route9_Text_AlanPostBattle:: .string "Hahahaha!\n" .string "Us hearty guys always laugh!$" Route9_Text_ConnerIntro:: .string "Go, my super BUG POKéMON!$" Route9_Text_ConnerDefeat:: .string "My bugs…$" Route9_Text_ConnerPostBattle:: .string "If you don't like BUG POKéMON,\n" .string "you bug me!$" Route9_Text_RouteSign:: .string "ROUTE 9\n" .string "CERULEAN CITY - ROCK TUNNEL$" ================================================ FILE: data/maps/SSAnne_1F_Corridor/map.json ================================================ { "id": "MAP_SSANNE_1F_CORRIDOR", "name": "SSAnne_1F_Corridor", "layout": "LAYOUT_SSANNE_1F_CORRIDOR", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 18, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Corridor_EventScript_Sailor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 12, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Corridor_EventScript_WorkerM", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 8, "elevation": 3, "dest_map": "MAP_SSANNE_2F_CORRIDOR", "dest_warp_id": "0" }, { "x": 2, "y": 18, "elevation": 3, "dest_map": "MAP_SSANNE_KITCHEN", "dest_warp_id": "0" }, { "x": 19, "y": 1, "elevation": 3, "dest_map": "MAP_SSANNE_EXTERIOR", "dest_warp_id": "2" }, { "x": 20, "y": 0, "elevation": 0, "dest_map": "MAP_SSANNE_EXTERIOR", "dest_warp_id": "3" }, { "x": 3, "y": 20, "elevation": 0, "dest_map": "MAP_SSANNE_KITCHEN", "dest_warp_id": "0" }, { "x": 28, "y": 17, "elevation": 3, "dest_map": "MAP_SSANNE_B1F_CORRIDOR", "dest_warp_id": "0" }, { "x": 5, "y": 10, "elevation": 3, "dest_map": "MAP_SSANNE_1F_ROOM1", "dest_warp_id": "0" }, { "x": 8, "y": 10, "elevation": 3, "dest_map": "MAP_SSANNE_1F_ROOM2", "dest_warp_id": "0" }, { "x": 11, "y": 10, "elevation": 3, "dest_map": "MAP_SSANNE_1F_ROOM3", "dest_warp_id": "0" }, { "x": 14, "y": 10, "elevation": 3, "dest_map": "MAP_SSANNE_1F_ROOM4", "dest_warp_id": "0" }, { "x": 17, "y": 10, "elevation": 3, "dest_map": "MAP_SSANNE_1F_ROOM5", "dest_warp_id": "0" }, { "x": 23, "y": 10, "elevation": 3, "dest_map": "MAP_SSANNE_1F_ROOM7", "dest_warp_id": "0" }, { "x": 20, "y": 10, "elevation": 3, "dest_map": "MAP_SSANNE_1F_ROOM6", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_1F_Corridor/scripts.inc ================================================ SSAnne_1F_Corridor_MapScripts:: .byte 0 SSAnne_1F_Corridor_EventScript_WorkerM:: msgbox SSAnne_1F_Corridor_Text_LeStrongSilentType, MSGBOX_NPC end SSAnne_1F_Corridor_EventScript_Sailor:: msgbox SSAnne_1F_Corridor_Text_PassengersAreRestless, MSGBOX_NPC end ================================================ FILE: data/maps/SSAnne_1F_Corridor/text.inc ================================================ SSAnne_1F_Corridor_Text_LeStrongSilentType:: .string "Bonjour!\n" .string "I am le waiter on this ship!\p" .string "I will be happy to serve you\n" .string "anything you please!\p" .string "… … …\n" .string "Ah! Le strong silent type!$" SSAnne_1F_Corridor_Text_PassengersAreRestless:: .string "The passengers are restless from\n" .string "this long voyage.\p" .string "You might be challenged by the\n" .string "more bored ones!$" ================================================ FILE: data/maps/SSAnne_1F_Room1/map.json ================================================ { "id": "MAP_SSANNE_1F_ROOM1", "name": "SSAnne_1F_Room1", "layout": "LAYOUT_SSANNE_ROOM1", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Room1_EventScript_Gentleman", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 1, "elevation": 0, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "6" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_1F_Room1/scripts.inc ================================================ SSAnne_1F_Room1_MapScripts:: .byte 0 SSAnne_1F_Room1_EventScript_Gentleman:: msgbox SSAnne_1F_Room1_Text_ImAGlobalPoliceAgent, MSGBOX_NPC end ================================================ FILE: data/maps/SSAnne_1F_Room1/text.inc ================================================ SSAnne_1F_Room1_Text_ImAGlobalPoliceAgent:: .string "Ssh…!\n" .string "I'm a GLOBAL POLICE agent.\p" .string "I'm on the trail of TEAM ROCKET.\n" .string "They're up to nothing good!$" ================================================ FILE: data/maps/SSAnne_1F_Room2/map.json ================================================ { "id": "MAP_SSANNE_1F_ROOM2", "name": "SSAnne_1F_Room2", "layout": "LAYOUT_SSANNE_ROOM1", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 5, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SSAnne_1F_Room2_EventScript_Ann", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "x": 0, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SSAnne_1F_Room2_EventScript_Tyler", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 2, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "1", "script": "SSAnne_1F_Room2_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 5, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Room2_EventScript_ItemTM31", "flag": "FLAG_HIDE_SSANNE_1F_ROOM2_TM31" } ], "warp_events": [ { "x": 2, "y": 1, "elevation": 0, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "7" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_1F_Room2/scripts.inc ================================================ SSAnne_1F_Room2_MapScripts:: .byte 0 SSAnne_1F_Room2_EventScript_Woman:: msgbox SSAnne_1F_Room2_Text_CruisingAroundWorld, MSGBOX_NPC end SSAnne_1F_Room2_EventScript_Ann:: trainerbattle_single TRAINER_LASS_ANN, SSAnne_1F_Room2_Text_AnnIntro, SSAnne_1F_Room2_Text_AnnDefeat msgbox SSAnne_1F_Room2_Text_AnnPostBattle, MSGBOX_AUTOCLOSE end SSAnne_1F_Room2_EventScript_Tyler:: trainerbattle_single TRAINER_YOUNGSTER_TYLER, SSAnne_1F_Room2_Text_TylerIntro, SSAnne_1F_Room2_Text_TylerDefeat msgbox SSAnne_1F_Room2_Text_TylerPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_1F_Room2/text.inc ================================================ SSAnne_1F_Room2_Text_TylerIntro:: .string "I love POKéMON!\n" .string "Do you?$" SSAnne_1F_Room2_Text_TylerDefeat:: .string "Wow! \n" .string "You're great!$" SSAnne_1F_Room2_Text_TylerPostBattle:: .string "Listen, listen!\n" .string "Let me be your friend, okay?\p" .string "Then we can trade POKéMON and\n" .string "do stuff.$" SSAnne_1F_Room2_Text_AnnIntro:: .string "I collected these POKéMON\n" .string "from all around the world!$" SSAnne_1F_Room2_Text_AnnDefeat:: .string "Oh, no!\n" .string "I went around the world for these!$" SSAnne_1F_Room2_Text_AnnPostBattle:: .string "You hurt my poor POKéMON!\p" .string "I demand that you heal them at a\n" .string "POKéMON CENTER!$" SSAnne_1F_Room2_Text_CruisingAroundWorld:: .string "We are cruising around the world,\n" .string "my children and I.$" ================================================ FILE: data/maps/SSAnne_1F_Room3/map.json ================================================ { "id": "MAP_SSANNE_1F_ROOM3", "name": "SSAnne_1F_Room3", "layout": "LAYOUT_SSANNE_ROOM1", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "x": 3, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP", "movement_range_x": 2, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Room3_EventScript_LittleGirl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WIGGLYTUFF", "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Room3_EventScript_Wigglytuff", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 0, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Room3_EventScript_BaldingMan", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 1, "elevation": 0, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "8" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_1F_Room3/scripts.inc ================================================ SSAnne_1F_Room3_MapScripts:: .byte 0 SSAnne_1F_Room3_EventScript_LittleGirl:: msgbox SSAnne_1F_Room3_Text_AlwaysTravelWithWigglytuff, MSGBOX_NPC end SSAnne_1F_Room3_EventScript_BaldingMan:: msgbox SSAnne_1F_Room3_Text_CruiseIsElegantAndCozy, MSGBOX_NPC end SSAnne_1F_Room3_EventScript_Wigglytuff:: lock faceplayer waitse playmoncry SPECIES_WIGGLYTUFF, CRY_MODE_NORMAL msgbox SSAnne_1F_Room3_Text_Wigglytuff waitmoncry release end ================================================ FILE: data/maps/SSAnne_1F_Room3/text.inc ================================================ SSAnne_1F_Room3_Text_CruiseIsElegantAndCozy:: .string "A world cruise is so elegant yet\n" .string "cozy!$" SSAnne_1F_Room3_Text_AlwaysTravelWithWigglytuff:: .string "I always travel with WIGGLYTUFF.\n" .string "I never leave home without it.$" SSAnne_1F_Room3_Text_Wigglytuff:: .string "WIGGLYTUFF: Puup pupuu!$" ================================================ FILE: data/maps/SSAnne_1F_Room4/map.json ================================================ { "id": "MAP_SSANNE_1F_ROOM4", "name": "SSAnne_1F_Room4", "layout": "LAYOUT_SSANNE_ROOM1", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Room4_EventScript_Woman", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 1, "elevation": 0, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "9" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_1F_Room4/scripts.inc ================================================ SSAnne_1F_Room4_MapScripts:: .byte 0 SSAnne_1F_Room4_EventScript_Woman:: lock faceplayer checkplayergender goto_if_eq VAR_RESULT, MALE, SSAnne_1F_Room4_EventScript_WomanPlayerMale msgbox SSAnne_1F_Room4_Text_WaitressCherryPiePlease release end SSAnne_1F_Room4_EventScript_WomanPlayerMale:: msgbox SSAnne_1F_Room4_Text_WaiterCherryPiePlease release end ================================================ FILE: data/maps/SSAnne_1F_Room4/text.inc ================================================ SSAnne_1F_Room4_Text_WaiterCherryPiePlease:: .string "Waiter, I would like a cherry pie,\n" .string "please!$" SSAnne_1F_Room4_Text_WaitressCherryPiePlease:: .string "Waitress, I would like a cherry\n" .string "pie, please!$" ================================================ FILE: data/maps/SSAnne_1F_Room5/map.json ================================================ { "id": "MAP_SSANNE_1F_ROOM5", "name": "SSAnne_1F_Room5", "layout": "LAYOUT_SSANNE_ROOM1", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 2, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SSAnne_1F_Room5_EventScript_Arthur", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 1, "elevation": 0, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "10" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_1F_Room5/scripts.inc ================================================ SSAnne_1F_Room5_MapScripts:: .byte 0 SSAnne_1F_Room5_EventScript_Arthur:: trainerbattle_single TRAINER_GENTLEMAN_ARTHUR, SSAnne_1F_Room5_Text_ArthurIntro, SSAnne_1F_Room5_Text_ArthurDefeat msgbox SSAnne_1F_Room5_Text_ArthurPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_1F_Room5/text.inc ================================================ SSAnne_1F_Room5_Text_ArthurIntro:: .string "You insolent pup!\n" .string "How dare you barge in!$" SSAnne_1F_Room5_Text_ArthurDefeat:: .string "Humph! You rude child!\n" .string "You have no sense of courtesy!$" SSAnne_1F_Room5_Text_ArthurPostBattle:: .string "I wish to be left alone!\n" .string "Get out!$" ================================================ FILE: data/maps/SSAnne_1F_Room6/map.json ================================================ { "id": "MAP_SSANNE_1F_ROOM6", "name": "SSAnne_1F_Room6", "layout": "LAYOUT_SSANNE_ROOM1", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Room6_EventScript_Woman", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 1, "elevation": 0, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "12" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_1F_Room6/scripts.inc ================================================ SSAnne_1F_Room6_MapScripts:: map_script MAP_SCRIPT_ON_LOAD SSAnne_1F_Room6_MapScript_MakePc .byte 0 SSAnne_1F_Room6_MapScript_MakePc: setmetatile 0, 0, 0x3D0, 1 setmetatile 0, 1, 0x062, 1 setmetatile 0, 2, 0x3D1, 0 setmetatile 1, 2, 0x31D, 0 end SSAnne_1F_Room6_EventScript_Woman:: lock faceplayer msgbox SSAnne_1F_Room6_Text_TakeAShortRest, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, SSAnne_1F_Room6_EventScript_DeclineHeal closemessage call EventScript_OutOfCenterPartyHeal msgbox SSAnne_1F_Room6_Text_GladEveryoneIsRefreshed release end SSAnne_1F_Room6_EventScript_DeclineHeal:: checkplayergender goto_if_eq VAR_RESULT, MALE, SSAnne_1F_Room6_EventScript_DeclineHealMale msgbox SSAnne_1F_Room6_Text_SorryYouLookLikeMySister release end SSAnne_1F_Room6_EventScript_DeclineHealMale:: msgbox SSAnne_1F_Room6_Text_SorryYouLookLikeMyBrother release end ================================================ FILE: data/maps/SSAnne_1F_Room6/text.inc ================================================ SSAnne_1F_Room6_Text_TakeAShortRest:: .string "You look tired. Would you like to\n" .string "take a short rest?$" SSAnne_1F_Room6_Text_GladEveryoneIsRefreshed:: .string "I'm glad to see that everyone is\n" .string "looking refreshed and chipper.$" SSAnne_1F_Room6_Text_SorryYouLookLikeMyBrother:: .string "Oh, I'm sorry for fussing over you.\n" .string "You look like my little brother…$" SSAnne_1F_Room6_Text_SorryYouLookLikeMySister:: .string "Oh, I'm sorry for fussing over you.\n" .string "You look like my little sister…$" ================================================ FILE: data/maps/SSAnne_1F_Room7/map.json ================================================ { "id": "MAP_SSANNE_1F_ROOM7", "name": "SSAnne_1F_Room7", "layout": "LAYOUT_SSANNE_ROOM1", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 4, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SSAnne_1F_Room7_EventScript_Thomas", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 1, "elevation": 0, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "11" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_1F_Room7/scripts.inc ================================================ SSAnne_1F_Room7_MapScripts:: .byte 0 SSAnne_1F_Room7_EventScript_Thomas:: trainerbattle_single TRAINER_GENTLEMAN_THOMAS, SSAnne_1F_Room7_Text_ThomasIntro, SSAnne_1F_Room7_Text_ThomasDefeat msgbox SSAnne_1F_Room7_Text_ThomasPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_1F_Room7/text.inc ================================================ SSAnne_1F_Room7_Text_ThomasIntro:: .string "I am but a solitary traveler…\p" .string "My sole companions and friends are\n" .string "POKéMON I caught on my journeys…$" SSAnne_1F_Room7_Text_ThomasDefeat:: .string "My, my friends…$" SSAnne_1F_Room7_Text_ThomasPostBattle:: .string "You should be nice to friends!$" ================================================ FILE: data/maps/SSAnne_2F_Corridor/map.json ================================================ { "id": "MAP_SSANNE_2F_CORRIDOR", "name": "SSAnne_2F_Corridor", "layout": "LAYOUT_SSANNE_2F_CORRIDOR", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "x": 30, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SS_ANNE_RIVAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 2, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Corridor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 2, "y": 2, "elevation": 3, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "0" }, { "x": 3, "y": 12, "elevation": 3, "dest_map": "MAP_SSANNE_3F_CORRIDOR", "dest_warp_id": "1" }, { "x": 30, "y": 2, "elevation": 3, "dest_map": "MAP_SSANNE_CAPTAINS_OFFICE", "dest_warp_id": "0" }, { "x": 6, "y": 10, "elevation": 0, "dest_map": "MAP_SSANNE_2F_ROOM1", "dest_warp_id": "0" }, { "x": 10, "y": 10, "elevation": 0, "dest_map": "MAP_SSANNE_2F_ROOM2", "dest_warp_id": "0" }, { "x": 14, "y": 10, "elevation": 0, "dest_map": "MAP_SSANNE_2F_ROOM3", "dest_warp_id": "0" }, { "x": 18, "y": 10, "elevation": 0, "dest_map": "MAP_SSANNE_2F_ROOM4", "dest_warp_id": "0" }, { "x": 22, "y": 10, "elevation": 0, "dest_map": "MAP_SSANNE_2F_ROOM5", "dest_warp_id": "0" }, { "x": 26, "y": 10, "elevation": 0, "dest_map": "MAP_SSANNE_2F_ROOM6", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 30, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR", "var_value": "0", "script": "SSAnne_2F_Corridor_EventScript_RivalTriggerLeft" }, { "type": "trigger", "x": 31, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR", "var_value": "0", "script": "SSAnne_2F_Corridor_EventScript_RivalTriggerMid" }, { "type": "trigger", "x": 32, "y": 6, "elevation": 3, "var": "VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR", "var_value": "0", "script": "SSAnne_2F_Corridor_EventScript_RivalTriggerRight" } ], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_2F_Corridor/scripts.inc ================================================ .set LOCALID_RIVAL, 1 SSAnne_2F_Corridor_MapScripts:: .byte 0 SSAnne_2F_Corridor_EventScript_RivalTriggerLeft:: lockall setvar VAR_TEMP_1, 0 goto SSAnne_2F_Corridor_EventScript_RivalTrigger end SSAnne_2F_Corridor_EventScript_RivalTriggerMid:: lockall setvar VAR_TEMP_1, 1 goto SSAnne_2F_Corridor_EventScript_RivalTrigger end SSAnne_2F_Corridor_EventScript_RivalTriggerRight:: lockall setvar VAR_TEMP_1, 2 goto SSAnne_2F_Corridor_EventScript_RivalTrigger end SSAnne_2F_Corridor_EventScript_RivalTrigger:: textcolor NPC_TEXT_COLOR_MALE playse SE_EXIT delay 5 playbgm MUS_ENCOUNTER_RIVAL, 0 addobject LOCALID_RIVAL delay 10 applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 20 call_if_eq VAR_TEMP_1, 0, SSAnne_2F_Corridor_EventScript_RivalApproachLeft call_if_eq VAR_TEMP_1, 1, SSAnne_2F_Corridor_EventScript_RivalApproachMid call_if_eq VAR_TEMP_1, 2, SSAnne_2F_Corridor_EventScript_RivalApproachRight msgbox SSAnne_2F_Corridor_Text_RivalIntro setvar VAR_LAST_TALKED, LOCALID_RIVAL call_if_eq VAR_STARTER_MON, 2, SSAnne_2F_Corridor_EventScript_RivalSquirtle call_if_eq VAR_STARTER_MON, 1, SSAnne_2F_Corridor_EventScript_RivalBulbasaur call_if_eq VAR_STARTER_MON, 0, SSAnne_2F_Corridor_EventScript_RivalCharmander msgbox SSAnne_2F_Corridor_Text_RivalPostBattle closemessage delay 10 playbgm MUS_RIVAL_EXIT, 0 call_if_eq VAR_TEMP_1, 0, SSAnne_2F_Corridor_EventScript_RivalExitLeft call_if_eq VAR_TEMP_1, 1, SSAnne_2F_Corridor_EventScript_RivalExitMid call_if_eq VAR_TEMP_1, 2, SSAnne_2F_Corridor_EventScript_RivalExitRight fadedefaultbgm removeobject LOCALID_RIVAL setvar VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR, 1 releaseall end SSAnne_2F_Corridor_EventScript_RivalApproachLeft:: applymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalApproachLeft waitmovement 0 return SSAnne_2F_Corridor_EventScript_RivalApproachMid:: applymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalApproachMid applymovement OBJ_EVENT_ID_PLAYER, SSAnne_2F_Corridor_Movement_PlayerFaceRivalMid waitmovement 0 return SSAnne_2F_Corridor_EventScript_RivalApproachRight:: applymovement OBJ_EVENT_ID_PLAYER, SSAnne_2F_Corridor_Movement_PlayerFaceRivalRight applymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalApproachRight waitmovement 0 return SSAnne_2F_Corridor_EventScript_RivalSquirtle:: trainerbattle_no_intro TRAINER_RIVAL_SS_ANNE_SQUIRTLE, SSAnne_2F_Corridor_Text_RivalDefeat return SSAnne_2F_Corridor_EventScript_RivalBulbasaur:: trainerbattle_no_intro TRAINER_RIVAL_SS_ANNE_BULBASAUR, SSAnne_2F_Corridor_Text_RivalDefeat return SSAnne_2F_Corridor_EventScript_RivalCharmander:: trainerbattle_no_intro TRAINER_RIVAL_SS_ANNE_CHARMANDER, SSAnne_2F_Corridor_Text_RivalDefeat return SSAnne_2F_Corridor_EventScript_RivalExitLeft:: applymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalExitLeft waitmovement 0 return SSAnne_2F_Corridor_EventScript_RivalExitMid:: applymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalExitMid waitmovement 0 return SSAnne_2F_Corridor_EventScript_RivalExitRight:: applymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalExitRight waitmovement 0 return SSAnne_2F_Corridor_Movement_PlayerFaceRivalRight:: delay_16 delay_16 delay_16 delay_16 walk_in_place_faster_left step_end SSAnne_2F_Corridor_Movement_PlayerFaceRivalMid:: delay_16 delay_16 delay_16 delay_16 walk_in_place_faster_left step_end SSAnne_2F_Corridor_Movement_RivalApproachLeft:: walk_down walk_down walk_down step_end SSAnne_2F_Corridor_Movement_RivalApproachMid:: walk_down walk_down walk_down walk_down walk_in_place_faster_right step_end SSAnne_2F_Corridor_Movement_RivalApproachRight:: walk_down walk_down walk_down walk_down walk_right delay_4 step_end SSAnne_2F_Corridor_Movement_RivalExitLeft:: walk_right walk_down walk_down walk_down walk_down walk_down walk_down walk_down step_end SSAnne_2F_Corridor_Movement_RivalExitMid:: walk_down walk_down walk_down walk_down walk_down walk_down walk_down step_end SSAnne_2F_Corridor_Movement_RivalExitRight:: walk_down walk_down walk_down walk_down walk_down walk_down walk_down step_end SSAnne_2F_Corridor_EventScript_Sailor:: msgbox SSAnne_2F_Corridor_Text_ThisShipIsLuxuryLiner, MSGBOX_NPC end ================================================ FILE: data/maps/SSAnne_2F_Corridor/text.inc ================================================ SSAnne_2F_Corridor_Text_ThisShipIsLuxuryLiner:: .string "This ship, she is a luxury liner for\n" .string "TRAINERS of the world!\p" .string "At every port, we hold parties with\n" .string "invited TRAINERS.$" SSAnne_2F_Corridor_Text_RivalIntro:: .string "{RIVAL}: Bonjour!\n" .string "{PLAYER}!\p" .string "Imagine seeing you here!\n" .string "{PLAYER}, were you really invited?\p" .string "So how's your POKéDEX coming?\p" .string "I already caught 40 kinds, pal.\n" .string "Different kinds are everywhere.\p" .string "Crawl around in grassy areas, and\n" .string "look hard for them.$" SSAnne_2F_Corridor_Text_RivalDefeat:: .string "Humph!\p" .string "At least you're raising your\n" .string "POKéMON!$" SSAnne_2F_Corridor_Text_RivalPostBattle:: .string "{RIVAL}: I heard there was a CUT\n" .string "master on board.\p" .string "But he was just a seasick old man!\p" .string "CUT itself is really useful.\n" .string "Yup, it'll be handy.\p" .string "You should go see him, too.\n" .string "Smell ya!$" ================================================ FILE: data/maps/SSAnne_2F_Room1/map.json ================================================ { "id": "MAP_SSANNE_2F_ROOM1", "name": "SSAnne_2F_Room1", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 1, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Room1_EventScript_Gentleman", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_2F_CORRIDOR", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_2F_Room1/scripts.inc ================================================ SSAnne_2F_Room1_MapScripts:: .byte 0 SSAnne_2F_Room1_EventScript_Gentleman:: lock faceplayer message SSAnne_2F_Room1_Text_SleepingMonLookedLikeThis waitmessage setvar VAR_0x8004, SPECIES_SNORLAX special SetSeenMon showmonpic SPECIES_SNORLAX, 10, 3 waitbuttonpress hidemonpic release end ================================================ FILE: data/maps/SSAnne_2F_Room1/text.inc ================================================ SSAnne_2F_Room1_Text_SleepingMonLookedLikeThis:: .string "I've journeyed far and wide, but in\n" .string "all my travels I've never seen\l" .string "any POKéMON sleep like this one!\p" .string "It was something like this!$" ================================================ FILE: data/maps/SSAnne_2F_Room2/map.json ================================================ { "id": "MAP_SSANNE_2F_ROOM2", "name": "SSAnne_2F_Room2", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SSAnne_2F_Room2_EventScript_Dale", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 1, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SSAnne_2F_Room2_EventScript_Brooks", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 3, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Room2_EventScript_ItemStardust", "flag": "FLAG_HIDE_SSANNE_2F_ROOM2_STARDUST" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_2F_CORRIDOR", "dest_warp_id": "4" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_2F_Room2/scripts.inc ================================================ SSAnne_2F_Room2_MapScripts:: .byte 0 SSAnne_2F_Room2_EventScript_Dale:: trainerbattle_single TRAINER_FISHERMAN_DALE, SSAnne_2F_Room2_Text_DaleIntro, SSAnne_2F_Room2_Text_DaleDefeat msgbox SSAnne_2F_Room2_Text_DalePostBattle, MSGBOX_AUTOCLOSE end SSAnne_2F_Room2_EventScript_Brooks:: trainerbattle_single TRAINER_GENTLEMAN_BROOKS, SSAnne_2F_Room2_Text_BrooksIntro, SSAnne_2F_Room2_Text_BrooksDefeat msgbox SSAnne_2F_Room2_Text_BrooksPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_2F_Room2/text.inc ================================================ SSAnne_2F_Room2_Text_BrooksIntro:: .string "Competing against the young keeps\n" .string "me youthful.$" SSAnne_2F_Room2_Text_BrooksDefeat:: .string "Good match!\n" .string "Ah, I feel young again!$" SSAnne_2F_Room2_Text_BrooksPostBattle:: .string "Fifteen years ago, I would\n" .string "have won!$" SSAnne_2F_Room2_Text_DaleIntro:: .string "Check out what I fished up!$" SSAnne_2F_Room2_Text_DaleDefeat:: .string "I'm all out!$" SSAnne_2F_Room2_Text_DalePostBattle:: .string "Party?\p" .string "The cruise ship's party should be\n" .string "over by now.$" ================================================ FILE: data/maps/SSAnne_2F_Room3/map.json ================================================ { "id": "MAP_SSANNE_2F_ROOM3", "name": "SSAnne_2F_Room3", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Room3_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "x": 3, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Room3_EventScript_OldMan", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_2F_CORRIDOR", "dest_warp_id": "5" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_2F_Room3/scripts.inc ================================================ SSAnne_2F_Room3_MapScripts:: .byte 0 SSAnne_2F_Room3_EventScript_Gentleman:: msgbox SSAnne_2F_Room3_Text_SeenMonsFerryPeople, MSGBOX_NPC end SSAnne_2F_Room3_EventScript_OldMan:: msgbox SSAnne_2F_Room3_Text_SomeTreesCanBeCutDown, MSGBOX_NPC end ================================================ FILE: data/maps/SSAnne_2F_Room3/text.inc ================================================ SSAnne_2F_Room3_Text_SeenMonsFerryPeople:: .string "Ah, yes, I have seen some POKéMON\n" .string "ferry people across the water!$" SSAnne_2F_Room3_Text_SomeTreesCanBeCutDown:: .string "Small trees can be chopped down\n" .string "using the move CUT.\p" .string "But remember this!\n" .string "CUT is an HM technique.\p" .string "Once learned, it is not so easily\n" .string "discarded.$" ================================================ FILE: data/maps/SSAnne_2F_Room4/map.json ================================================ { "id": "MAP_SSANNE_2F_ROOM4", "name": "SSAnne_2F_Room4", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 0, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SSAnne_2F_Room4_EventScript_Lamar", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 3, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SSAnne_2F_Room4_EventScript_Dawn", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Room4_EventScript_ItemXAttack", "flag": "FLAG_HIDE_SSANNE_2F_ROOM4_X_ATTACK" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_2F_CORRIDOR", "dest_warp_id": "6" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_2F_Room4/scripts.inc ================================================ SSAnne_2F_Room4_MapScripts:: .byte 0 SSAnne_2F_Room4_EventScript_Lamar:: trainerbattle_single TRAINER_GENTLEMAN_LAMAR, SSAnne_2F_Room4_Text_LamarIntro, SSAnne_2F_Room4_Text_LamarDefeat msgbox SSAnne_2F_Room4_Text_LamarPostBattle, MSGBOX_AUTOCLOSE end SSAnne_2F_Room4_EventScript_Dawn:: trainerbattle_single TRAINER_LASS_DAWN, SSAnne_2F_Room4_Text_DawnIntro, SSAnne_2F_Room4_Text_DawnDefeat msgbox SSAnne_2F_Room4_Text_DawnPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_2F_Room4/text.inc ================================================ SSAnne_2F_Room4_Text_LamarIntro:: .string "Which do you find more worthy,\n" .string "a strong or a rare POKéMON?$" SSAnne_2F_Room4_Text_LamarDefeat:: .string "I must salute you!$" SSAnne_2F_Room4_Text_LamarPostBattle:: .string "Personally, I prefer strong and\n" .string "rare POKéMON.$" SSAnne_2F_Room4_Text_DawnIntro:: .string "I don't believe I saw you at the\n" .string "party?$" SSAnne_2F_Room4_Text_DawnDefeat:: .string "Take it easy!$" SSAnne_2F_Room4_Text_DawnPostBattle:: .string "Oh, I adore your strong POKéMON!\n" .string "Oh, how I envy you for them!$" ================================================ FILE: data/maps/SSAnne_2F_Room5/map.json ================================================ { "id": "MAP_SSANNE_2F_ROOM5", "name": "SSAnne_2F_Room5", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 5, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Room5_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Room5_EventScript_LittleBoy", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_2F_CORRIDOR", "dest_warp_id": "7" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_2F_Room5/scripts.inc ================================================ SSAnne_2F_Room5_MapScripts:: .byte 0 SSAnne_2F_Room5_EventScript_Gentleman:: msgbox SSAnne_2F_Room5_Text_HaveYouGoneToSafariZone, MSGBOX_NPC end SSAnne_2F_Room5_EventScript_LittleBoy:: msgbox SSAnne_2F_Room5_Text_WeThinkSafariZoneIsAwesome, MSGBOX_NPC end ================================================ FILE: data/maps/SSAnne_2F_Room5/text.inc ================================================ SSAnne_2F_Room5_Text_HaveYouGoneToSafariZone:: .string "Have you gone to the SAFARI ZONE\n" .string "in FUCHSIA CITY?\p" .string "There are many kinds of rare\n" .string "POKéMON.$" SSAnne_2F_Room5_Text_WeThinkSafariZoneIsAwesome:: .string "Me and my daddy think the SAFARI\n" .string "ZONE is awesome!\l" .string "I wish we could go there again.$" ================================================ FILE: data/maps/SSAnne_2F_Room6/map.json ================================================ { "id": "MAP_SSANNE_2F_ROOM6", "name": "SSAnne_2F_Room6", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "x": 1, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Room6_EventScript_Woman2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_2F_Room6_EventScript_Woman1", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_2F_CORRIDOR", "dest_warp_id": "8" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_2F_Room6/scripts.inc ================================================ SSAnne_2F_Room6_MapScripts:: .byte 0 SSAnne_2F_Room6_EventScript_Woman1:: msgbox SSAnne_2F_Room6_Text_CaptainIsAwfullySick, MSGBOX_NPC end SSAnne_2F_Room6_EventScript_Woman2:: msgbox SSAnne_2F_Room6_Text_ManyPeopleGetSeasick, MSGBOX_NPC end ================================================ FILE: data/maps/SSAnne_2F_Room6/text.inc ================================================ SSAnne_2F_Room6_Text_CaptainIsAwfullySick:: .string "The CAPTAIN said he's awfully sick.\n" .string "He was all pale.$" SSAnne_2F_Room6_Text_ManyPeopleGetSeasick:: .string "I hear many people get seasick.$" ================================================ FILE: data/maps/SSAnne_3F_Corridor/map.json ================================================ { "id": "MAP_SSANNE_3F_CORRIDOR", "name": "SSAnne_3F_Corridor", "layout": "LAYOUT_SSANNE_3F_CORRIDOR", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 10, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_3F_Corridor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 1, "y": 4, "elevation": 3, "dest_map": "MAP_SSANNE_DECK", "dest_warp_id": "0" }, { "x": 18, "y": 2, "elevation": 3, "dest_map": "MAP_SSANNE_2F_CORRIDOR", "dest_warp_id": "1" }, { "x": 0, "y": 5, "elevation": 0, "dest_map": "MAP_SSANNE_DECK", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_3F_Corridor/scripts.inc ================================================ SSAnne_3F_Corridor_MapScripts:: .byte 0 SSAnne_3F_Corridor_EventScript_Sailor:: msgbox SSAnne_3F_Corridor_Text_CaptainTeachesCutToMons, MSGBOX_NPC end ================================================ FILE: data/maps/SSAnne_3F_Corridor/text.inc ================================================ SSAnne_3F_Corridor_Text_CaptainTeachesCutToMons:: .string "Our CAPTAIN is a sword master.\n" .string "He's awesome at using CUT.\p" .string "They say he even teaches CUT\n" .string "to POKéMON!$" ================================================ FILE: data/maps/SSAnne_B1F_Corridor/map.json ================================================ { "id": "MAP_SSANNE_B1F_CORRIDOR", "name": "SSAnne_B1F_Corridor", "layout": "LAYOUT_SSANNE_B1F_CORRIDOR", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 19, "y": 3, "elevation": 3, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "5" }, { "x": 2, "y": 2, "elevation": 0, "dest_map": "MAP_SSANNE_B1F_ROOM1", "dest_warp_id": "0" }, { "x": 6, "y": 2, "elevation": 0, "dest_map": "MAP_SSANNE_B1F_ROOM2", "dest_warp_id": "0" }, { "x": 10, "y": 2, "elevation": 0, "dest_map": "MAP_SSANNE_B1F_ROOM3", "dest_warp_id": "0" }, { "x": 14, "y": 2, "elevation": 0, "dest_map": "MAP_SSANNE_B1F_ROOM4", "dest_warp_id": "0" }, { "x": 18, "y": 2, "elevation": 0, "dest_map": "MAP_SSANNE_B1F_ROOM5", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [ { "type": "hidden_item", "x": 21, "y": 5, "elevation": 3, "item": "ITEM_HYPER_POTION", "flag": "FLAG_HIDDEN_ITEM_SSANNE_B1F_CORRIDOR_HYPER_POTION", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_B1F_Corridor/scripts.inc ================================================ SSAnne_B1F_Corridor_MapScripts:: .byte 0 ================================================ FILE: data/maps/SSAnne_B1F_Room1/map.json ================================================ { "id": "MAP_SSANNE_B1F_ROOM1", "name": "SSAnne_B1F_Room1", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "x": 5, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SSAnne_B1F_Room1_EventScript_Barny", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 3, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SSAnne_B1F_Room1_EventScript_Phillip", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_B1F_CORRIDOR", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_B1F_Room1/scripts.inc ================================================ SSAnne_B1F_Room1_MapScripts:: .byte 0 SSAnne_B1F_Room1_EventScript_Barny:: trainerbattle_single TRAINER_FISHERMAN_BARNY, SSAnne_B1F_Room1_Text_BarnyIntro, SSAnne_B1F_Room1_Text_BarnyDefeat msgbox SSAnne_B1F_Room1_Text_BarnyPostBattle, MSGBOX_AUTOCLOSE end SSAnne_B1F_Room1_EventScript_Phillip:: trainerbattle_single TRAINER_SAILOR_PHILLIP, SSAnne_B1F_Room1_Text_PhillipIntro, SSAnne_B1F_Room1_Text_PhillipDefeat msgbox SSAnne_B1F_Room1_Text_PhillipPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_B1F_Room1/text.inc ================================================ SSAnne_B1F_Room1_Text_PhillipIntro:: .string "Matey, you're walking the plank if\n" .string "you lose!$" SSAnne_B1F_Room1_Text_PhillipDefeat:: .string "Argh!\n" .string "Beaten by a kid!$" SSAnne_B1F_Room1_Text_PhillipPostBattle:: .string "When we're out at sea, jellyfish\n" .string "POKéMON sometimes drift by.$" SSAnne_B1F_Room1_Text_BarnyIntro:: .string "Hello, stranger!\p" .string "I can't tell if you're from the seas\n" .string "or mountains, but stop and chat.\p" .string "All my POKéMON are from the sea.$" SSAnne_B1F_Room1_Text_BarnyDefeat:: .string "Darn!\n" .string "I let that one get away!$" SSAnne_B1F_Room1_Text_BarnyPostBattle:: .string "I was going to make you my\n" .string "assistant, too!$" ================================================ FILE: data/maps/SSAnne_B1F_Room2/map.json ================================================ { "id": "MAP_SSANNE_B1F_ROOM2", "name": "SSAnne_B1F_Room2", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SSAnne_B1F_Room2_EventScript_Huey", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 3, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_B1F_Room2_EventScript_ItemTM44", "flag": "FLAG_HIDE_SSANNE_B1F_ROOM2_TM44" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_B1F_CORRIDOR", "dest_warp_id": "2" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_B1F_Room2/scripts.inc ================================================ SSAnne_B1F_Room2_MapScripts:: .byte 0 SSAnne_B1F_Room2_EventScript_Huey:: trainerbattle_single TRAINER_SAILOR_HUEY, SSAnne_B1F_Room2_Text_HueyIntro, SSAnne_B1F_Room2_Text_HueyDefeat msgbox SSAnne_B1F_Room2_Text_HueyPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_B1F_Room2/text.inc ================================================ SSAnne_B1F_Room2_Text_HueyIntro:: .string "Even us sailors have POKéMON, too!$" SSAnne_B1F_Room2_Text_HueyDefeat:: .string "Okay, you're not bad.$" SSAnne_B1F_Room2_Text_HueyPostBattle:: .string "We caught all our POKéMON while\n" .string "we were out at sea.$" ================================================ FILE: data/maps/SSAnne_B1F_Room3/map.json ================================================ { "id": "MAP_SSANNE_B1F_ROOM3", "name": "SSAnne_B1F_Room3", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SSAnne_B1F_Room3_EventScript_Dylan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 1, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_B1F_Room3_EventScript_ItemEther", "flag": "FLAG_HIDE_SSANNE_B1F_ROOM3_ETHER" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_B1F_CORRIDOR", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_B1F_Room3/scripts.inc ================================================ SSAnne_B1F_Room3_MapScripts:: .byte 0 SSAnne_B1F_Room3_EventScript_Dylan:: trainerbattle_single TRAINER_SAILOR_DYLAN, SSAnne_B1F_Room3_Text_DylanIntro, SSAnne_B1F_Room3_Text_DylanDefeat msgbox SSAnne_B1F_Room3_Text_DylanPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_B1F_Room3/text.inc ================================================ SSAnne_B1F_Room3_Text_DylanIntro:: .string "I like feisty kids like you!$" SSAnne_B1F_Room3_Text_DylanDefeat:: .string "Argh!\n" .string "Lost it!$" SSAnne_B1F_Room3_Text_DylanPostBattle:: .string "Sea POKéMON live in deep water.\n" .string "You'll need a ROD to fish them up!$" ================================================ FILE: data/maps/SSAnne_B1F_Room4/map.json ================================================ { "id": "MAP_SSANNE_B1F_ROOM4", "name": "SSAnne_B1F_Room4", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 3, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SSAnne_B1F_Room4_EventScript_Duncan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 2, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SSAnne_B1F_Room4_EventScript_Leonard", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_B1F_CORRIDOR", "dest_warp_id": "4" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_B1F_Room4/scripts.inc ================================================ SSAnne_B1F_Room4_MapScripts:: .byte 0 SSAnne_B1F_Room4_EventScript_Leonard:: trainerbattle_single TRAINER_SAILOR_LEONARD, SSAnne_B1F_Room4_Text_LeonardIntro, SSAnne_B1F_Room4_Text_LeonardDefeat msgbox SSAnne_B1F_Room4_Text_LeonardPostBattle, MSGBOX_AUTOCLOSE end SSAnne_B1F_Room4_EventScript_Duncan:: trainerbattle_single TRAINER_SAILOR_DUNCAN, SSAnne_B1F_Room4_Text_DuncanIntro, SSAnne_B1F_Room4_Text_DuncanDefeat msgbox SSAnne_B1F_Room4_Text_DuncanPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_B1F_Room4/text.inc ================================================ SSAnne_B1F_Room4_Text_LeonardIntro:: .string "You know what they say about\n" .string "sailors and battling!$" SSAnne_B1F_Room4_Text_LeonardDefeat:: .string "Right!\n" .string "Good battle, mate!$" SSAnne_B1F_Room4_Text_LeonardPostBattle:: .string "Hahaha!\n" .string "Want to be a sailor, mate?$" SSAnne_B1F_Room4_Text_DuncanIntro:: .string "Come on, then!\n" .string "My sailor's pride is at stake!$" SSAnne_B1F_Room4_Text_DuncanDefeat:: .string "Your spirit sank me!$" SSAnne_B1F_Room4_Text_DuncanPostBattle:: .string "Did you see the FISHING GURU in\n" .string "VERMILION CITY?$" ================================================ FILE: data/maps/SSAnne_B1F_Room5/map.json ================================================ { "id": "MAP_SSANNE_B1F_ROOM5", "name": "SSAnne_B1F_Room5", "layout": "LAYOUT_SSANNE_ROOM2", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_B1F_Room5_EventScript_Boy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MACHOKE", "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_B1F_Room5_EventScript_Machoke", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 2, "y": 2, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_B1F_Room5_EventScript_ItemSuperPotion", "flag": "FLAG_HIDE_SSANNE_B1F_ROOM5_SUPER_POTION" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_B1F_CORRIDOR", "dest_warp_id": "5" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_B1F_Room5/scripts.inc ================================================ SSAnne_B1F_Room5_MapScripts:: .byte 0 SSAnne_B1F_Room5_EventScript_Boy:: msgbox SSAnne_B1F_Room5_Text_MachokeHasStrengthToMoveRocks, MSGBOX_NPC end SSAnne_B1F_Room5_EventScript_Machoke:: lock faceplayer waitse playmoncry SPECIES_MACHOKE, CRY_MODE_NORMAL msgbox SSAnne_B1F_Room5_Text_Machoke waitmoncry release end ================================================ FILE: data/maps/SSAnne_B1F_Room5/text.inc ================================================ SSAnne_B1F_Room5_Text_MachokeHasStrengthToMoveRocks:: .string "My buddy MACHOKE is super strong!\p" .string "He has enough STRENGTH to move\n" .string "big rocks!$" SSAnne_B1F_Room5_Text_Machoke:: .string "MACHOKE: Gwoh! Goggoh!$" ================================================ FILE: data/maps/SSAnne_CaptainsOffice/map.json ================================================ { "id": "MAP_SSANNE_CAPTAINS_OFFICE", "name": "SSAnne_CaptainsOffice", "layout": "LAYOUT_SSANNE_CAPTAINS_OFFICE", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAPTAIN", "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_CaptainsOffice_EventScript_Captain", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_SSANNE_2F_CORRIDOR", "dest_warp_id": "2" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 2, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SSAnne_CaptainsOffice_EventScript_Book" }, { "type": "sign", "x": 5, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SSAnne_CaptainsOffice_EventScript_TrashCan" }, { "type": "sign", "x": 2, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SSAnne_CaptainsOffice_EventScript_Book" } ], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_CaptainsOffice/scripts.inc ================================================ .set LOCALID_CAPTAIN, 1 SSAnne_CaptainsOffice_MapScripts:: .byte 0 SSAnne_CaptainsOffice_EventScript_Captain:: lock goto_if_set FLAG_GOT_HM01, SSAnne_CaptainsOffice_EventScript_AlreadyGotCut msgbox SSAnne_CaptainsOffice_Text_CaptainIFeelSeasick textcolor NPC_TEXT_COLOR_NEUTRAL message SSAnne_CaptainsOffice_Text_RubbedCaptainsBack waitmessage playfanfare MUS_RS_HEAL waitfanfare call EventScript_RestorePrevTextColor delay 50 applymovement LOCALID_CAPTAIN, Common_Movement_FacePlayer waitmovement 0 msgbox SSAnne_CaptainsOffice_Text_ThankYouHaveHMForCut giveitem_msg SSAnne_CaptainsOffice_Text_ObtainedHM01FromCaptain, ITEM_HM01, 1, MUS_OBTAIN_KEY_ITEM msgbox SSAnne_CaptainsOffice_Text_ExplainCut setflag FLAG_GOT_HM01 setvar VAR_MAP_SCENE_VERMILION_CITY, 1 release end @ Unused SSAnne_CaptainsOffice_EventScript_NoRoomForCut:: msgbox SSAnne_CaptainsOffice_Text_YouHaveNoRoomForThis closemessage applymovement LOCALID_CAPTAIN, Common_Movement_FaceOriginalDirection waitmovement 0 release end SSAnne_CaptainsOffice_EventScript_AlreadyGotCut:: applymovement LOCALID_CAPTAIN, Common_Movement_FacePlayer waitmovement 0 msgbox SSAnne_CaptainsOffice_Text_SSAnneWillSetSailSoon release end SSAnne_CaptainsOffice_EventScript_TrashCan:: msgbox SSAnne_CaptainsOffice_Text_YuckShouldntHaveLooked, MSGBOX_SIGN end SSAnne_CaptainsOffice_EventScript_Book:: msgbox SSAnne_CaptainsOffice_Text_HowToConquerSeasickness, MSGBOX_SIGN end ================================================ FILE: data/maps/SSAnne_CaptainsOffice/text.inc ================================================ SSAnne_CaptainsOffice_Text_CaptainIFeelSeasick:: .string "CAPTAIN: Ooargh…\n" .string "I feel hideous…\l" .string "Urrp! Seasick…$" SSAnne_CaptainsOffice_Text_RubbedCaptainsBack:: .string "{PLAYER} rubbed the CAPTAIN's\n" .string "back!\p" .string "Rub-rub…\n" .string "Rub-rub…$" SSAnne_CaptainsOffice_Text_ThankYouHaveHMForCut:: .string "CAPTAIN: Whew! Thank you!\n" .string "I'm feeling much better now.\p" .string "You want to see my hidden CUT\n" .string "technique?\p" .string "I could show you my prized CUT\n" .string "technique if I weren't so ill…\p" .string "I know! You can have this!\n" .string "This HIDDEN MACHINE!\p" .string "Teach CUT to your POKéMON, and\n" .string "you can see it CUT anytime!$" SSAnne_CaptainsOffice_Text_ObtainedHM01FromCaptain:: .string "{PLAYER} obtained HM01\n" .string "from the CAPTAIN!$" SSAnne_CaptainsOffice_Text_ExplainCut:: .string "Using CUT, you can chop down\n" .string "small trees.\p" .string "Why not try it with the trees\n" .string "around VERMILION CITY?$" SSAnne_CaptainsOffice_Text_SSAnneWillSetSailSoon:: .string "CAPTAIN: …Whew!\p" .string "Now that I'm not sick anymore,\n" .string "I guess it's time.\p" .string "The S.S. ANNE will set sail soon!\p" .string "Farewell, until our return to\n" .string "VERMILION CITY!$" SSAnne_CaptainsOffice_Text_YouHaveNoRoomForThis:: .string "Oh, no!\n" .string "You have no room for this!$" SSAnne_CaptainsOffice_Text_YuckShouldntHaveLooked:: .string "Yuck!\n" .string "Shouldn't have looked!$" SSAnne_CaptainsOffice_Text_HowToConquerSeasickness:: .string "How to Conquer Seasickness…\n" .string "The CAPTAIN's reading this!$" ================================================ FILE: data/maps/SSAnne_Deck/map.json ================================================ { "id": "MAP_SSANNE_DECK", "name": "SSAnne_Deck", "layout": "LAYOUT_SSANNE_DECK", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 12, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SSAnne_Deck_EventScript_Trevor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 14, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Deck_EventScript_BaldingMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 13, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Deck_EventScript_Sailor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 6, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SSAnne_Deck_EventScript_Edmond", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "x": 11, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Deck_EventScript_Youngster", "flag": "0" } ], "warp_events": [ { "x": 16, "y": 8, "elevation": 3, "dest_map": "MAP_SSANNE_3F_CORRIDOR", "dest_warp_id": "0" }, { "x": 16, "y": 9, "elevation": 3, "dest_map": "MAP_SSANNE_3F_CORRIDOR", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_Deck/scripts.inc ================================================ SSAnne_Deck_MapScripts:: .byte 0 SSAnne_Deck_EventScript_Youngster:: msgbox SSAnne_Deck_Text_ShipDepartingSoon, MSGBOX_NPC end SSAnne_Deck_EventScript_BaldingMan:: msgbox SSAnne_Deck_Text_FeelSeasick, MSGBOX_NPC end SSAnne_Deck_EventScript_Sailor:: msgbox SSAnne_Deck_Text_ScrubbingDecksHardWork, MSGBOX_NPC end SSAnne_Deck_EventScript_Edmond:: trainerbattle_single TRAINER_SAILOR_EDMOND, SSAnne_Deck_Text_EdmondIntro, SSAnne_Deck_Text_EdmondDefeat msgbox SSAnne_Deck_Text_EdmondPostBattle, MSGBOX_AUTOCLOSE end SSAnne_Deck_EventScript_Trevor:: trainerbattle_single TRAINER_SAILOR_TREVOR, SSAnne_Deck_Text_TrevorIntro, SSAnne_Deck_Text_TrevorDefeat msgbox SSAnne_Deck_Text_TrevorPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SSAnne_Deck/text.inc ================================================ SSAnne_Deck_Text_ShipDepartingSoon:: .string "The party's over.\n" .string "The ship will be departing soon.$" SSAnne_Deck_Text_ScrubbingDecksHardWork:: .string "Whew!\n" .string "Scrubbing decks is hard work!$" SSAnne_Deck_Text_FeelSeasick:: .string "Urf… I feel ill…\p" .string "I got seasick, so I stepped out to\n" .string "get some air…$" SSAnne_Deck_Text_EdmondIntro:: .string "Hey, matey!\p" .string "Let's do a little jig!$" SSAnne_Deck_Text_EdmondDefeat:: .string "You're impressive!$" SSAnne_Deck_Text_EdmondPostBattle:: .string "How many kinds of POKéMON do you\n" .string "think there are in this big world?$" SSAnne_Deck_Text_TrevorIntro:: .string "Ahoy, there!\n" .string "Are you seasick?$" SSAnne_Deck_Text_TrevorDefeat:: .string "I was just careless!$" SSAnne_Deck_Text_TrevorPostBattle:: .string "My pa said there are 100 kinds of\n" .string "POKéMON. I think there are more.$" ================================================ FILE: data/maps/SSAnne_Exterior/map.json ================================================ { "id": "MAP_SSANNE_EXTERIOR", "name": "SSAnne_Exterior", "layout": "LAYOUT_SSANNE_EXTERIOR", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SS_ANNE", "in_connection": false, "x": 30, "y": 16, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SS_ANNE" } ], "warp_events": [ { "x": 31, "y": 5, "elevation": 0, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "0" }, { "x": 32, "y": 5, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "1" }, { "x": 32, "y": 14, "elevation": 3, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "2" }, { "x": 33, "y": 15, "elevation": 0, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "3" }, { "x": 33, "y": 5, "elevation": 0, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 58, "y": 28, "elevation": 3, "item": "ITEM_LAVA_COOKIE", "flag": "FLAG_HIDDEN_ITEM_SSANNE_EXTERIOR_LAVA_COOKIE", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_Exterior/scripts.inc ================================================ .set LOCALID_SS_ANNE, 1 SSAnne_Exterior_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SSAnne_Exterior_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, SSAnne_Exterior_OnFrame .byte 0 SSAnne_Exterior_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SSANNE_EXTERIOR end SSAnne_Exterior_OnFrame:: map_script_2 VAR_MAP_SCENE_VERMILION_CITY, 1, SSAnne_Exterior_ExitSSAnne .2byte 0 SSAnne_Exterior_ExitSSAnne:: lockall getplayerxy VAR_0x8004, VAR_0x8005 call_if_le VAR_0x8005, 6, SSAnne_Exterior_WalkDown call_if_ge VAR_0x8005, 7, SSAnne_Exterior_WalkInPlaceDown fadenewbgm MUS_SURF delay 50 special DoSSAnneDepartureCutscene waitstate removeobject LOCALID_SS_ANNE applymovement OBJ_EVENT_ID_PLAYER, SSAnne_Exterior_Movement_Exit waitmovement 0 setvar VAR_MAP_SCENE_VERMILION_CITY, 2 setvar VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER, 0 warp MAP_VERMILION_CITY, 23, 34 waitstate releaseall end SSAnne_Exterior_WalkDown:: applymovement OBJ_EVENT_ID_PLAYER, SSAnne_Exterior_Movement_WalkDown waitmovement 0 return SSAnne_Exterior_WalkInPlaceDown:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return SSAnne_Exterior_Movement_Exit:: walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up walk_up step_end SSAnne_Exterior_Movement_WalkDown:: walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_down walk_down step_end ================================================ FILE: data/maps/SSAnne_Kitchen/map.json ================================================ { "id": "MAP_SSANNE_KITCHEN", "name": "SSAnne_Kitchen", "layout": "LAYOUT_SSANNE_KITCHEN", "music": "MUS_SS_ANNE", "region_map_section": "MAPSEC_S_S_ANNE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHEF", "x": 1, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Kitchen_EventScript_Chef1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHEF", "x": 6, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Kitchen_EventScript_Chef2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHEF", "x": 10, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Kitchen_EventScript_Chef3", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHEF", "x": 8, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Kitchen_EventScript_Chef4", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHEF", "x": 14, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Kitchen_EventScript_Chef5", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHEF", "x": 14, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Kitchen_EventScript_Chef6", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHEF", "x": 14, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Kitchen_EventScript_Chef7", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 1, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_Kitchen_EventScript_ItemGreatBall", "flag": "FLAG_HIDE_SSANNE_KITCHEN_GREAT_BALL" } ], "warp_events": [ { "x": 7, "y": 1, "elevation": 0, "dest_map": "MAP_SSANNE_1F_CORRIDOR", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [ { "type": "hidden_item", "x": 14, "y": 8, "elevation": 0, "item": "ITEM_CHESTO_BERRY", "flag": "FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_CHESTO_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 14, "y": 4, "elevation": 0, "item": "ITEM_PECHA_BERRY", "flag": "FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_PECHA_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 14, "y": 6, "elevation": 0, "item": "ITEM_CHERI_BERRY", "flag": "FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_CHERI_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "2" } ================================================ FILE: data/maps/SSAnne_Kitchen/scripts.inc ================================================ SSAnne_Kitchen_MapScripts:: .byte 0 SSAnne_Kitchen_EventScript_Chef1:: msgbox SSAnne_Kitchen_Text_BusyOutOfTheWay, MSGBOX_NPC end SSAnne_Kitchen_EventScript_Chef2:: msgbox SSAnne_Kitchen_Text_SawOddBerryInTrash, MSGBOX_NPC end SSAnne_Kitchen_EventScript_Chef3:: msgbox SSAnne_Kitchen_Text_SoBusyImDizzy, MSGBOX_NPC end SSAnne_Kitchen_EventScript_Chef4:: lock faceplayer msgbox SSAnne_Kitchen_Text_IAmLeChefMainCourseIs random 3 copyvar VAR_0x8008, VAR_RESULT call_if_eq VAR_0x8008, 0, SSAnne_Kitchen_EventScript_SalmonDuSalad call_if_eq VAR_0x8008, 1, SSAnne_Kitchen_EventScript_EelsAuBarbecue call_if_eq VAR_0x8008, 2, SSAnne_Kitchen_EventScript_PrimeBeefsteak release end SSAnne_Kitchen_EventScript_SalmonDuSalad:: msgbox SSAnne_Kitchen_Text_SalmonDuSalad return SSAnne_Kitchen_EventScript_EelsAuBarbecue:: msgbox SSAnne_Kitchen_Text_EelsAuBarbecue return SSAnne_Kitchen_EventScript_PrimeBeefsteak:: msgbox SSAnne_Kitchen_Text_PrimeBeefsteak return SSAnne_Kitchen_EventScript_Chef5:: msgbox SSAnne_Kitchen_Text_PeelSpudsEveryDay, MSGBOX_NPC end SSAnne_Kitchen_EventScript_Chef6:: msgbox SSAnne_Kitchen_Text_HearAboutSnorlaxItsAGlutton, MSGBOX_NPC end SSAnne_Kitchen_EventScript_Chef7:: msgbox SSAnne_Kitchen_Text_OnlyGetToPeelOnions, MSGBOX_NPC end ================================================ FILE: data/maps/SSAnne_Kitchen/text.inc ================================================ SSAnne_Kitchen_Text_BusyOutOfTheWay:: .string "You, mon petit!\n" .string "We're busy here!\l" .string "Out of the way!$" SSAnne_Kitchen_Text_SawOddBerryInTrash:: .string "I saw an odd BERRY in the trash.\n" .string "I wonder what that was?$" SSAnne_Kitchen_Text_SoBusyImDizzy:: .string "I'm so busy I'm getting dizzy!\n" .string "You have to give me room here!$" SSAnne_Kitchen_Text_PeelSpudsEveryDay:: .string "Hum-de-hum-de-ho…\p" .string "I peel spuds every day!\n" .string "Hum-hum…$" SSAnne_Kitchen_Text_HearAboutSnorlaxItsAGlutton:: .string "Did you hear about SNORLAX?\n" .string "It's a glutton.\p" .string "No other POKéMON eats and sleeps\n" .string "the way SNORLAX can and does!$" SSAnne_Kitchen_Text_OnlyGetToPeelOnions:: .string "Snivel… Sniff…\p" .string "I only get to peel onions…\n" .string "Snivel…$" SSAnne_Kitchen_Text_IAmLeChefMainCourseIs:: .string "Er-hem!\n" .string "Indeed I am le CHEF!\p" .string "Le main course is$" SSAnne_Kitchen_Text_SalmonDuSalad:: .string "Salmon du Salad!\p" .string "Les guests may gripe it's fish\n" .string "again, however!$" SSAnne_Kitchen_Text_EelsAuBarbecue:: .string "Eels au Barbecue!\p" .string "Les guests will mutiny, I fear.$" SSAnne_Kitchen_Text_PrimeBeefsteak:: .string "Prime Beefsteak!\p" .string "But, have I enough fillets du\n" .string "beef?$" ================================================ FILE: data/maps/SafariZone_Center/map.json ================================================ { "id": "MAP_SAFARI_ZONE_CENTER", "name": "SafariZone_Center", "layout": "LAYOUT_SAFARI_ZONE_CENTER", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 24, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_Center_EventScript_ItemNugget", "flag": "FLAG_HIDE_SAFARI_ZONE_CENTER_NUGGET" } ], "warp_events": [ { "x": 25, "y": 30, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE", "dest_warp_id": "0" }, { "x": 26, "y": 30, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE", "dest_warp_id": "0" }, { "x": 27, "y": 30, "elevation": 3, "dest_map": "MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE", "dest_warp_id": "0" }, { "x": 25, "y": 5, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "9" }, { "x": 26, "y": 5, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "10" }, { "x": 27, "y": 5, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "11" }, { "x": 8, "y": 17, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "6" }, { "x": 8, "y": 18, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "7" }, { "x": 8, "y": 19, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "8" }, { "x": 43, "y": 15, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_EAST", "dest_warp_id": "3" }, { "x": 43, "y": 16, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_EAST", "dest_warp_id": "4" }, { "x": 43, "y": 17, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_EAST", "dest_warp_id": "5" }, { "x": 29, "y": 25, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_CENTER_REST_HOUSE", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 30, "y": 26, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_Center_EventScript_RestHouseSign" }, { "type": "sign", "x": 25, "y": 27, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_Center_EventScript_TrainerTips" }, { "type": "hidden_item", "x": 27, "y": 15, "elevation": 3, "item": "ITEM_LEAF_STONE", "flag": "FLAG_HIDDEN_ITEM_SAFARI_ZONE_CENTER_LEAF_STONE", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 33, "y": 20, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_Center_EventScript_AreaSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_Center/scripts.inc ================================================ SafariZone_Center_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SafariZone_Center_OnTransition .byte 0 SafariZone_Center_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SAFARI_ZONE_CENTER end SafariZone_Center_EventScript_RestHouseSign:: msgbox SafariZone_Center_Text_RestHouse, MSGBOX_SIGN end SafariZone_Center_EventScript_TrainerTips:: msgbox SafariZone_Center_Text_PressStartToCheckTime, MSGBOX_SIGN end SafariZone_Center_EventScript_AreaSign:: msgbox SafariZone_Center_Text_CenterArea, MSGBOX_SIGN end ================================================ FILE: data/maps/SafariZone_Center/text.inc ================================================ SafariZone_Center_Text_RestHouse:: .string "REST HOUSE$" SafariZone_Center_Text_PressStartToCheckTime:: .string "TRAINER TIPS\p" .string "Press START to check\n" .string "remaining time.$" SafariZone_Center_Text_CenterArea:: .string "CENTER AREA$" ================================================ FILE: data/maps/SafariZone_Center_RestHouse/map.json ================================================ { "id": "MAP_SAFARI_ZONE_CENTER_REST_HOUSE", "name": "SafariZone_Center_RestHouse", "layout": "LAYOUT_SAFARI_ZONE_REST_HOUSE", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 3, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_Center_RestHouse_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "x": 7, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_Center_RestHouse_EventScript_Sara", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "12" }, { "x": 4, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "12" }, { "x": 5, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "12" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_Center_RestHouse/scripts.inc ================================================ SafariZone_Center_RestHouse_MapScripts:: .byte 0 SafariZone_Center_RestHouse_EventScript_Sara:: msgbox SafariZone_Center_Text_WhereDidErikGo, MSGBOX_NPC end SafariZone_Center_RestHouse_EventScript_Scientist:: msgbox SafariZone_Center_Text_CatchingMonsAsGifts, MSGBOX_NPC end ================================================ FILE: data/maps/SafariZone_Center_RestHouse/text.inc ================================================ SafariZone_Center_Text_WhereDidErikGo:: .string "SARA: Where did my boyfriend,\n" .string "ERIK, go?$" SafariZone_Center_Text_CatchingMonsAsGifts:: .string "I'm catching POKéMON to take home\n" .string "as gifts.$" ================================================ FILE: data/maps/SafariZone_East/map.json ================================================ { "id": "MAP_SAFARI_ZONE_EAST", "name": "SafariZone_East", "layout": "LAYOUT_SAFARI_ZONE_EAST", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 13, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_East_EventScript_ItemMaxPotion", "flag": "FLAG_HIDE_SAFARI_ZONE_EAST_MAX_POTION" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 37, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_East_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_SAFARI_ZONE_EAST_FULL_RESTORE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 31, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_East_EventScript_ItemTM11", "flag": "FLAG_HIDE_SAFARI_ZONE_EAST_TM11" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 36, "y": 17, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_East_EventScript_ItemLeafStone", "flag": "FLAG_HIDE_SAFARI_ZONE_EAST_LEAF_STONE" } ], "warp_events": [ { "x": 8, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "6" }, { "x": 8, "y": 10, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "7" }, { "x": 8, "y": 11, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "8" }, { "x": 8, "y": 26, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "9" }, { "x": 8, "y": 27, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "10" }, { "x": 8, "y": 28, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "11" }, { "x": 40, "y": 14, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_EAST_REST_HOUSE", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 18, "y": 27, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_East_EventScript_AreaSign" }, { "type": "sign", "x": 43, "y": 15, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_East_EventScript_RestHouseSign" }, { "type": "sign", "x": 17, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_East_EventScript_TrainerTips" } ], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_East/scripts.inc ================================================ SafariZone_East_MapScripts:: .byte 0 SafariZone_East_EventScript_RestHouseSign:: msgbox SafariZone_East_Text_RestHouse, MSGBOX_SIGN end SafariZone_East_EventScript_TrainerTips:: msgbox SafariZone_East_Text_TimeDeclinesOnlyWhileYouWalk, MSGBOX_SIGN end SafariZone_East_EventScript_AreaSign:: msgbox SafariZone_East_Text_AreaSign, MSGBOX_SIGN end ================================================ FILE: data/maps/SafariZone_East/text.inc ================================================ SafariZone_East_Text_RestHouse:: .string "REST HOUSE$" SafariZone_East_Text_TimeDeclinesOnlyWhileYouWalk:: .string "TRAINER TIPS\p" .string "The remaining time declines only\n" .string "while you walk.$" SafariZone_East_Text_AreaSign:: .string "AREA 1\n" .string "WEST: CENTER AREA$" ================================================ FILE: data/maps/SafariZone_East_RestHouse/map.json ================================================ { "id": "MAP_SAFARI_ZONE_EAST_REST_HOUSE", "name": "SafariZone_East_RestHouse", "layout": "LAYOUT_SAFARI_ZONE_REST_HOUSE", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 3, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_East_RestHouse_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKER", "x": 6, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_East_RestHouse_EventScript_Rocker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 7, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_East_RestHouse_EventScript_BaldingMan", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_EAST", "dest_warp_id": "6" }, { "x": 4, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_EAST", "dest_warp_id": "6" }, { "x": 5, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_EAST", "dest_warp_id": "6" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_East_RestHouse/scripts.inc ================================================ SafariZone_East_RestHouse_MapScripts:: .byte 0 SafariZone_East_RestHouse_EventScript_Rocker:: msgbox SafariZone_East_Text_CaughtChanseyAllWorthwhile, MSGBOX_NPC end SafariZone_East_RestHouse_EventScript_Scientist:: msgbox SafariZone_East_Text_HowManyDidYouCatch, MSGBOX_NPC end SafariZone_East_RestHouse_EventScript_BaldingMan:: msgbox SafariZone_East_Text_TiredFromAllTheFun, MSGBOX_NPC end ================================================ FILE: data/maps/SafariZone_East_RestHouse/text.inc ================================================ SafariZone_East_Text_HowManyDidYouCatch:: .string "How many did you catch?\n" .string "I'm bushed from the effort!$" SafariZone_East_Text_CaughtChanseyAllWorthwhile:: .string "I caught a CHANSEY!\p" .string "That makes this all worthwhile.$" SafariZone_East_Text_TiredFromAllTheFun:: .string "Whew!\n" .string "I'm tired from all the fun!$" ================================================ FILE: data/maps/SafariZone_North/map.json ================================================ { "id": "MAP_SAFARI_ZONE_NORTH", "name": "SafariZone_North", "layout": "LAYOUT_SAFARI_ZONE_NORTH", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 33, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_North_EventScript_ItemProtein", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTH_PROTEIN" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 28, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_North_EventScript_ItemTM47", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTH_TM47" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 29, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_North_EventScript_ItemQuickClaw", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTH_QUICK_CLAW" }, { "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 13, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_North_EventScript_Worker2", "flag": "FLAG_SYS_GAME_CLEAR" }, { "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 14, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_North_EventScript_Worker1", "flag": "FLAG_SYS_GAME_CLEAR" } ], "warp_events": [ { "x": 10, "y": 36, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "0" }, { "x": 11, "y": 36, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "1" }, { "x": 12, "y": 36, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "2" }, { "x": 20, "y": 36, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "3" }, { "x": 21, "y": 36, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "4" }, { "x": 22, "y": 36, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "5" }, { "x": 48, "y": 33, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_EAST", "dest_warp_id": "0" }, { "x": 48, "y": 34, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_EAST", "dest_warp_id": "1" }, { "x": 48, "y": 35, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_EAST", "dest_warp_id": "2" }, { "x": 30, "y": 36, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "3" }, { "x": 31, "y": 36, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "4" }, { "x": 32, "y": 36, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "5" }, { "x": 43, "y": 10, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH_REST_HOUSE", "dest_warp_id": "1" }, { "x": 12, "y": 6, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH_WEST", "dest_warp_id": "0" }, { "x": 13, "y": 6, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH_WEST", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 13, "y": 29, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_North_EventScript_TrainerTips1" }, { "type": "sign", "x": 23, "y": 33, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_North_EventScript_AreaSign" }, { "type": "sign", "x": 29, "y": 34, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_North_EventScript_TrainerTips2" }, { "type": "sign", "x": 34, "y": 30, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_North_EventScript_TrainerTips3" }, { "type": "sign", "x": 44, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_North_EventScript_RestHouseSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_North/scripts.inc ================================================ SafariZone_North_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SafariZone_North_EventScript_MakeExtension .byte 0 SafariZone_North_EventScript_MakeExtension:: goto_if_unset FLAG_SYS_GAME_CLEAR, EventScript_ReleaseEnd setmetatile 12, 2, 0x0DB, 1 setmetatile 12, 3, 0x0DB, 1 setmetatile 12, 4, 0x0DB, 1 setmetatile 12, 5, 0x0DB, 1 setmetatile 12, 6, 0x2EA, 0 setmetatile 13, 2, 0x0DD, 1 setmetatile 13, 3, 0x0DD, 1 setmetatile 13, 4, 0x0DD, 1 setmetatile 13, 5, 0x0DD, 1 setmetatile 13, 6, 0x2EB, 0 setmetatile 14, 2, 0x0E6, 1 setmetatile 14, 3, 0x0E6, 1 setmetatile 14, 4, 0x0E6, 1 setmetatile 14, 5, 0x0E6, 1 setmetatile 14, 6, 0x358, 1 setmetatile 11, 2, 0x304, 1 setmetatile 11, 3, 0x2FC, 1 setmetatile 11, 4, 0x304, 1 setmetatile 11, 5, 0x30C, 1 setmetatile 15, 2, 0x303, 1 setmetatile 15, 3, 0x2FB, 1 setmetatile 15, 4, 0x303, 1 setmetatile 15, 5, 0x30B, 1 end SafariZone_North_EventScript_RestHouseSign:: msgbox SafariZone_North_Text_RestHouse, MSGBOX_SIGN end SafariZone_North_EventScript_TrainerTips1:: msgbox SafariZone_North_Text_SecretHouseStillAhead, MSGBOX_SIGN end SafariZone_North_EventScript_AreaSign:: msgbox SafariZone_North_Text_Area2, MSGBOX_SIGN end SafariZone_North_EventScript_TrainerTips2:: msgbox SafariZone_North_Text_ZigzagThroughTallGrass, MSGBOX_SIGN end SafariZone_North_EventScript_TrainerTips3:: msgbox SafariZone_North_Text_WinFreeHMFindSecretHouse, MSGBOX_SIGN end SafariZone_North_EventScript_Worker1:: msgbox SafariZone_North_Text_Worker1, MSGBOX_NPC turnobject 5, DIR_NORTH end SafariZone_North_Text_Worker1:: .string "Are you enjoying the SAFARI GAME?\p" .string "We're working, so please go on with\n" .string "your excursion and leave us be.$" SafariZone_North_EventScript_Worker2:: msgbox SafariZone_North_Text_Worker2, MSGBOX_DEFAULT release end SafariZone_North_Text_Worker2:: .string "…If we cut through here…\n" .string "…Hmm…$" ================================================ FILE: data/maps/SafariZone_North/text.inc ================================================ SafariZone_North_Text_RestHouse:: .string "REST HOUSE$" SafariZone_North_Text_SecretHouseStillAhead:: .string "TRAINER TIPS\p" .string "The SECRET HOUSE is still ahead.$" SafariZone_North_Text_Area2:: .string "AREA 2$" SafariZone_North_Text_ZigzagThroughTallGrass:: .string "TRAINER TIPS\p" .string "POKéMON hide in tall grass.\p" .string "Zigzag through grassy areas to\n" .string "flush them out.$" SafariZone_North_Text_WinFreeHMFindSecretHouse:: .string "TRAINER TIPS\p" .string "Win a free HM for finding the\n" .string "SECRET HOUSE.$" ================================================ FILE: data/maps/SafariZone_NorthEast/map.json ================================================ { "id": "MAP_SAFARI_ZONE_NORTH_EAST", "name": "SafariZone_NorthEast", "layout": "LAYOUT_SAFARI_ZONE_NORTH_EAST", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 40, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 41, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 37, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 40, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 40, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 44, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 19, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthEast_EventScript_ItemGlitterMail", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTHEAST_GLITTER_MAIL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 30, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthEast_EventScript_ItemWhiteHerb", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTHEAST_WHITE_HERB" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 44, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthEast_EventScript_ItemMaxRevive", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTHEAST_MAX_REVIVE" } ], "warp_events": [ { "x": 9, "y": 15, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH_WEST", "dest_warp_id": "3" }, { "x": 9, "y": 16, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH_WEST", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 10, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_NorthEast_EventScript_AreaSign" }, { "type": "hidden_item", "x": 28, "y": 13, "elevation": 3, "item": "ITEM_SALAC_BERRY", "flag": "FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHEAST_SALAC_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 37, "y": 11, "elevation": 3, "item": "ITEM_BRIGHT_POWDER", "flag": "FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHEAST_BRIGHTPOWDER", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 16, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_NorthEast_EventScript_RoughTerrainSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_NorthEast/scripts.inc ================================================ SafariZone_NorthEast_MapScripts:: .byte 0 SafariZone_NorthEast_EventScript_AreaSign:: msgbox SafariZone_NorthEast_Text_AreaSign, MSGBOX_SIGN end SafariZone_NorthEast_Text_AreaSign:: .string "AREA 5$" SafariZone_NorthEast_EventScript_RoughTerrainSign:: msgbox SafariZone_NorthEast_Text_RoughTerrainSign, MSGBOX_SIGN end SafariZone_NorthEast_Text_RoughTerrainSign:: .string "NOTICE!\p" .string "Rough terrain ahead!\n" .string "Exercise caution while exploring!$" ================================================ FILE: data/maps/SafariZone_NorthEast/text.inc ================================================ ================================================ FILE: data/maps/SafariZone_NorthWest/map.json ================================================ { "id": "MAP_SAFARI_ZONE_NORTH_WEST", "name": "SafariZone_NorthWest", "layout": "LAYOUT_SAFARI_ZONE_NORTH_WEST", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 34, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_EventScript_ItemSunStone", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTHWEST_SUN_STONE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 44, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_EventScript_ItemRareCandy", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTHWEST_RARE_CANDY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 20, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_EventScript_ItemPPMax", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTHWEST_PP_MAX" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 7, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 8, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 17, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 19, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_18" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 14, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 15, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 13, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_14" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 19, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_EventScript_ItemKingsRock", "flag": "FLAG_HIDE_SAFARI_ZONE_NORTHWEST_KINGS_ROCK" } ], "warp_events": [ { "x": 12, "y": 30, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "13" }, { "x": 13, "y": 30, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "14" }, { "x": 14, "y": 26, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH_WEST_REST_HOUSE", "dest_warp_id": "0" }, { "x": 44, "y": 15, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH_EAST", "dest_warp_id": "0" }, { "x": 44, "y": 16, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH_EAST", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 12, "y": 26, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_NorthWest_EventScript_RestHouseSign" }, { "type": "sign", "x": 21, "y": 26, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_NorthWest_EventScript_AreaSign" }, { "type": "hidden_item", "x": 19, "y": 23, "elevation": 3, "item": "ITEM_LIECHI_BERRY", "flag": "FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_LIECHI_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 43, "y": 27, "elevation": 3, "item": "ITEM_SITRUS_BERRY", "flag": "FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_SITRUS_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 34, "y": 6, "elevation": 3, "item": "ITEM_SHELL_BELL", "flag": "FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_SHELL_BELL", "quantity": 1, "underfoot": true } ], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_NorthWest/scripts.inc ================================================ SafariZone_NorthWest_MapScripts:: .byte 0 SafariZone_NorthWest_EventScript_RestHouseSign:: msgbox SafariZone_NorthWest_Text_RestHouseSign, MSGBOX_SIGN end SafariZone_NorthWest_Text_RestHouseSign:: .string "REST HOUSE\n" .string "Fill up on steps inside!$" SafariZone_NorthWest_EventScript_AreaSign:: msgbox SafariZone_NorthWest_Text_AreaSign, MSGBOX_SIGN end SafariZone_NorthWest_Text_AreaSign:: .string "AREA 4$" ================================================ FILE: data/maps/SafariZone_NorthWest/text.inc ================================================ ================================================ FILE: data/maps/SafariZone_NorthWest_RestHouse/map.json ================================================ { "id": "MAP_SAFARI_ZONE_NORTH_WEST_REST_HOUSE", "name": "SafariZone_NorthWest_RestHouse", "layout": "LAYOUT_SAFARI_ZONE_REST_HOUSE", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 10, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_RestHouse_EventScript_Worker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 9, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_RestHouse_EventScript_Stepmonger", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 4, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 3, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_RestHouse_EventScript_SuperNerd", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 1, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_RestHouse_EventScript_LittleBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 2, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_RestHouse_EventScript_OldWoman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 10, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_RestHouse_EventScript_Lass", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLIPBOARD", "in_connection": false, "x": 8, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_NorthWest_RestHouse_EventScript_Clipboard", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 9, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH_WEST", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_NorthWest_RestHouse/scripts.inc ================================================ SafariZone_NorthWest_RestHouse_MapScripts:: map_script MAP_SCRIPT_ON_LOAD SafariZone_NorthWest_RestHouse_MapScript_MakePC .byte 0 SafariZone_NorthWest_RestHouse_MapScript_MakePC:: setmetatile 2, 0, 0x300, 1 setmetatile 2, 1, 0x062, 1 setmetatile 2, 2, 0x301, 0 setmetatile 4, 0, 0x2C8, 1 setmetatile 4, 1, 0x2CA, 1 setmetatile 5, 0, 0x2C9, 1 setmetatile 5, 1, 0x2CB, 1 end SafariZone_NorthWest_RestHouse_EventScript_OldWoman:: msgbox SafariZone_NorthWest_RestHouse_Text_OldWoman, MSGBOX_NPC end SafariZone_NorthWest_RestHouse_Text_OldWoman:: .string "My grandson has a lot of energy,\n" .string "but getting here has worn me out!$" SafariZone_NorthWest_RestHouse_EventScript_LittleBoy:: msgbox SafariZone_NorthWest_RestHouse_Text_LittleBoy, MSGBOX_NPC end SafariZone_NorthWest_RestHouse_Text_LittleBoy:: .string "Me and Grandma are here to see\n" .string "the new POKéMON!\p" .string "There are so many here I've never\n" .string "seen before!$" SafariZone_NorthWest_RestHouse_EventScript_SuperNerd:: msgbox SafariZone_NorthWest_RestHouse_Text_SuperNerd, MSGBOX_NPC end SafariZone_NorthWest_RestHouse_Text_SuperNerd:: .string "I saw a weird, noodley POKéMON\n" .string "hiding in the rocks on the\l" .string "ridge behind us.\p" .string "Too bad I don't have a POKéMON\n" .string "that can learn ROCK SMASH!$" SafariZone_NorthWest_RestHouse_EventScript_Lass:: msgbox SafariZone_NorthWest_RestHouse_Text_Lass, MSGBOX_NPC end SafariZone_NorthWest_RestHouse_Text_Lass:: .string "These REST HOUSES are so nice.\n" .string "I love sprawling out here.\p" .string "Our steps aren't counted while we're\n" .string "resting, so they're not wasted!$" SafariZone_NorthWest_RestHouse_EventScript_Worker:: msgbox SafariZone_NorthWest_RestHouse_Text_Worker, MSGBOX_NPC end SafariZone_NorthWest_RestHouse_Text_Worker:: .string "We thought we'd have to landscape\n" .string "this whole area to make it a\l" .string "suitable POKéMON habitat.\p" .string "But we cut through the trees and\n" .string "discovered a lovely natural vista.\p" .string "We imported rare POKéMON to fill it!\n" .string "I hope you're enjoying yourself!$" SafariZone_NorthWest_RestHouse_EventScript_Clipboard:: msgbox SafariZone_NorthWest_RestHouse_Text_Clipboard, MSGBOX_NPC end SafariZone_NorthWest_RestHouse_Text_Clipboard:: .string "It's a message from the SAFARI\n" .string "ZONE WARDEN.\p" .string "“I just heard that the SAFARI ZONE\n" .string "in HOENN has opened a new wing\l" .string "with exotic POKéMON!\p" .string "We can't allow our beloved SAFARI\n" .string "ZONE to become out of date!\p" .string "I'm putting a team together to\n" .string "scout for viable expansion sites.\p" .string "Interested employees please sign up\n" .string "at the office.”\p" .string "- WARDEN BAOBA$" SafariZone_NorthWest_RestHouse_EventScript_Stepmonger:: callnative SafariZoneCheckSteps goto_if_eq VAR_RESULT, 600, SafariZone_NorthWest_RestHouse_EventScript_StepmongerFull msgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_0 showmoneybox 0, 0 msgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_2 checkmoney 750 goto_if_eq VAR_RESULT, FALSE, SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_5 removemoney 750 updatemoneybox textcolor 3 playfanfare MUS_LEVEL_UP msgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_3 waitfanfare call EventScript_RestorePrevTextColor msgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_4, MSGBOX_NPC hidemoneybox callnative SafariZoneRefillSteps release end SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_2: msgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_2, MSGBOX_NPC hidemoneybox end SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_5: msgbox FuchsiaCity_SafariZone_Entrance_Text_OopsNotEnoughMoney hidemoneybox release end SafariZone_NorthWest_RestHouse_EventScript_StepmongerFull: msgbox SafariZone_NorthWest_RestHouse_Text_StepmongerFull, MSGBOX_NPC end SafariZone_NorthWest_RestHouse_Text_StepmongerFull: .string "Welcome to AREA 4!\nYour step allowance is full.\pWe don't count time spent\ninside REST HOUSES.\pCome back when you run low\non steps!$" SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_0: .string "Welcome to AREA 4!\nDo you need more steps?$" SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_1: .string "I can refill your step allowance\nfor ¥750.\pDo you want to refill your steps?$" SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_2: .string "Okay, I wish you the best of luck\non your SAFARI GAME!$" SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_3: .string "{PLAYER}'s steps were refilled!$" SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_4: .string "Your steps are topped up!\nGood luck on your wild excursion!$" ================================================ FILE: data/maps/SafariZone_NorthWest_RestHouse/text.inc ================================================ ================================================ FILE: data/maps/SafariZone_North_RestHouse/map.json ================================================ { "id": "MAP_SAFARI_ZONE_NORTH_REST_HOUSE", "name": "SafariZone_North_RestHouse", "layout": "LAYOUT_SAFARI_ZONE_REST_HOUSE", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 3, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_North_RestHouse_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 7, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_North_RestHouse_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_North_RestHouse_EventScript_Fisher", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 11, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_North_RestHouse_EventScript_BaldingMan", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "12" }, { "x": 4, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "12" }, { "x": 5, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "12" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_North_RestHouse/scripts.inc ================================================ SafariZone_North_RestHouse_MapScripts:: .byte 0 SafariZone_North_RestHouse_EventScript_Fisher:: msgbox SafariZone_East_Text_PrizeInDeepestPartOfSafariZone, MSGBOX_NPC end SafariZone_North_RestHouse_EventScript_Scientist:: msgbox SafariZone_East_Text_KeepAnyItemFoundOnSafari, MSGBOX_NPC end SafariZone_North_RestHouse_EventScript_Gentleman:: msgbox SafariZone_East_Text_MyEeveeEvolvedIntoFlareon, MSGBOX_NPC end ================================================ FILE: data/maps/SafariZone_North_RestHouse/text.inc ================================================ SafariZone_East_Text_KeepAnyItemFoundOnSafari:: .string "You can keep any item you find in\n" .string "the SAFARI ZONE.\p" .string "But, you'll run out of time if you\n" .string "try for all of them at once.$" SafariZone_East_Text_PrizeInDeepestPartOfSafariZone:: .string "Go to the deepest part of the\n" .string "SAFARI ZONE. You will win a prize!$" SafariZone_East_Text_MyEeveeEvolvedIntoFlareon:: .string "My EEVEE evolved into FLAREON.\p" .string "But, a friend's EEVEE turned into a\n" .string "VAPOREON. I wonder why?$" ================================================ FILE: data/maps/SafariZone_SecretHouse/map.json ================================================ { "id": "MAP_SAFARI_ZONE_SECRET_HOUSE", "name": "SafariZone_SecretHouse", "layout": "LAYOUT_SAFARI_ZONE_SECRET_HOUSE", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_SecretHouse_EventScript_Attendant", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "9" }, { "x": 4, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "9" }, { "x": 5, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "9" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_SecretHouse/scripts.inc ================================================ SafariZone_SecretHouse_MapScripts:: .byte 0 SafariZone_SecretHouse_EventScript_Attendant:: lock faceplayer goto_if_set FLAG_GOT_HM03, SafariZone_SecretHouse_EventScript_ExplainSurf msgbox SafariZone_SecretHouse_Text_CongratsYouveWon checkitemspace ITEM_HM03 goto_if_eq VAR_RESULT, FALSE, SafariZone_SecretHouse_EventScript_NoRoomForHM03 giveitem_msg SafariZone_SecretHouse_Text_ReceivedHM03FromAttendant, ITEM_HM03 msgbox SafariZone_SecretHouse_Text_ExplainSurf setflag FLAG_GOT_HM03 release end SafariZone_SecretHouse_EventScript_NoRoomForHM03:: msgbox SafariZone_SecretHouse_Text_DontHaveRoomForPrize release end SafariZone_SecretHouse_EventScript_ExplainSurf:: msgbox SafariZone_SecretHouse_Text_ExplainSurf release end ================================================ FILE: data/maps/SafariZone_SecretHouse/text.inc ================================================ SafariZone_SecretHouse_Text_CongratsYouveWon:: .string "Ah! Finally!\p" .string "You're the first person to reach\n" .string "the SECRET HOUSE!\p" .string "Although I made a campaign\n" .string "for our grand opening,\p" .string "I was getting worried that no one\n" .string "would win our campaign prize.\p" .string "Congratulations!\n" .string "You have won!$" SafariZone_SecretHouse_Text_ReceivedHM03FromAttendant:: .string "{PLAYER} received HM03\n" .string "from the attendant!$" SafariZone_SecretHouse_Text_ExplainSurf:: .string "HM03 is SURF.\p" .string "POKéMON will be able to ferry you\n" .string "across water using it.\p" .string "And, this HM isn't disposable, so\n" .string "you can use it over and over.\p" .string "You're super lucky for winning this\n" .string "fabulous prize!$" SafariZone_SecretHouse_Text_DontHaveRoomForPrize:: .string "You don't have room for this\n" .string "fabulous prize!$" ================================================ FILE: data/maps/SafariZone_West/map.json ================================================ { "id": "MAP_SAFARI_ZONE_WEST", "name": "SafariZone_West", "layout": "LAYOUT_SAFARI_ZONE_WEST", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 28, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_West_EventScript_ItemGoldTeeth", "flag": "FLAG_HIDE_SAFARI_ZONE_WEST_GOLD_TEETH" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_West_EventScript_ItemTM32", "flag": "FLAG_HIDE_SAFARI_ZONE_WEST_TM32" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 16, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_West_EventScript_ItemMaxPotion", "flag": "FLAG_HIDE_SAFARI_ZONE_WEST_MAX_POTION" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 27, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_West_EventScript_ItemMaxRevive", "flag": "FLAG_HIDE_SAFARI_ZONE_WEST_MAX_REVIVE" } ], "warp_events": [ { "x": 30, "y": 5, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "0" }, { "x": 31, "y": 5, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "1" }, { "x": 32, "y": 5, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "2" }, { "x": 37, "y": 5, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "3" }, { "x": 38, "y": 5, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "4" }, { "x": 39, "y": 5, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_NORTH", "dest_warp_id": "5" }, { "x": 40, "y": 26, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "6" }, { "x": 40, "y": 27, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "7" }, { "x": 40, "y": 28, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_CENTER", "dest_warp_id": "8" }, { "x": 12, "y": 7, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_SECRET_HOUSE", "dest_warp_id": "1" }, { "x": 19, "y": 18, "elevation": 0, "dest_map": "MAP_SAFARI_ZONE_WEST_REST_HOUSE", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 27, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_West_EventScript_LostTeethNotice" }, { "type": "sign", "x": 36, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_West_EventScript_TrainerTips" }, { "type": "sign", "x": 35, "y": 26, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_West_EventScript_AreaSign" }, { "type": "sign", "x": 22, "y": 19, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SafariZone_West_EventScript_RestHouseSign" }, { "type": "hidden_item", "x": 13, "y": 11, "elevation": 3, "item": "ITEM_REVIVE", "flag": "FLAG_HIDDEN_ITEM_SAFARI_ZONE_WEST_REVIVE", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_West/scripts.inc ================================================ SafariZone_West_MapScripts:: .byte 0 SafariZone_West_EventScript_RestHouseSign:: msgbox SafariZone_West_Text_RestHouse, MSGBOX_SIGN end SafariZone_West_EventScript_LostTeethNotice:: msgbox SafariZone_West_Text_PleaseFindWardensLostTeeth, MSGBOX_SIGN end SafariZone_West_EventScript_TrainerTips:: msgbox SafariZone_West_Text_SearchForSecretHouse, MSGBOX_SIGN end SafariZone_West_EventScript_AreaSign:: msgbox SafariZone_West_Text_AreaSign, MSGBOX_SIGN end ================================================ FILE: data/maps/SafariZone_West/text.inc ================================================ SafariZone_West_Text_RestHouse:: .string "REST HOUSE$" SafariZone_West_Text_PleaseFindWardensLostTeeth:: .string "REQUEST NOTICE\p" .string "Please find the SAFARI WARDEN's\n" .string "lost GOLD TEETH.\l" .string "They're around here somewhere.\p" .string "Reward offered!\n" .string "Contact: WARDEN$" SafariZone_West_Text_SearchForSecretHouse:: .string "TRAINER TIPS\p" .string "Zone Exploration Campaign!\n" .string "The Search for the SECRET HOUSE!$" SafariZone_West_Text_AreaSign:: .string "AREA 3\n" .string "EAST: CENTER AREA$" ================================================ FILE: data/maps/SafariZone_West_RestHouse/map.json ================================================ { "id": "MAP_SAFARI_ZONE_WEST_REST_HOUSE", "name": "SafariZone_West_RestHouse", "layout": "LAYOUT_SAFARI_ZONE_REST_HOUSE", "music": "MUS_EVOLUTION", "region_map_section": "MAPSEC_KANTO_SAFARI_ZONE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "x": 3, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_West_RestHouse_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "x": 2, "y": 2, "elevation": 0, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_West_RestHouse_EventScript_Man", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "x": 7, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SafariZone_West_RestHouse_EventScript_CooltrainerF", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "10" }, { "x": 4, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "10" }, { "x": 5, "y": 9, "elevation": 3, "dest_map": "MAP_SAFARI_ZONE_WEST", "dest_warp_id": "10" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SafariZone_West_RestHouse/scripts.inc ================================================ SafariZone_West_RestHouse_MapScripts:: .byte 0 SafariZone_West_RestHouse_EventScript_Man:: msgbox SafariZone_West_Text_BaitMakesMonStickAround, MSGBOX_NPC end SafariZone_West_RestHouse_EventScript_Scientist:: msgbox SafariZone_West_Text_RocksMakeMonRunButEasierCatch, MSGBOX_NPC end SafariZone_West_RestHouse_EventScript_CooltrainerF:: msgbox SafariZone_West_Text_HikedLotsDidntSeeMonIWanted, MSGBOX_NPC end ================================================ FILE: data/maps/SafariZone_West_RestHouse/text.inc ================================================ SafariZone_West_Text_KogaPatrolsSafariEverySoOften:: .string "The SAFARI ZONE's huge, wouldn't\n" .string "you say?\p" .string "FUCHSIA's GYM LEADER, KOGA, \n" .string "patrols the grounds every so often.\p" .string "Thanks to him, we can play here\n" .string "knowing that we're safe.$" SafariZone_West_Text_RocksMakeMonRunButEasierCatch:: .string "Tossing ROCKS at POKéMON might\n" .string "make them run, but they'll be\l" .string "easier to catch.$" SafariZone_West_Text_BaitMakesMonStickAround:: .string "Using BAIT will make POKéMON more\n" .string "likely to stick around if they get\l" .string "busy eating.$" SafariZone_West_Text_HikedLotsDidntSeeMonIWanted:: .string "I hiked a lot, but I didn't see any\n" .string "POKéMON I wanted.$" ================================================ FILE: data/maps/SaffronCity/map.json ================================================ { "id": "MAP_SAFFRON_CITY", "name": "SaffronCity", "layout": "LAYOUT_SAFFRON_CITY", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ROUTE5" }, { "direction": "down", "offset": 12, "map": "MAP_ROUTE6" }, { "direction": "left", "offset": 10, "map": "MAP_ROUTE7" }, { "direction": "right", "offset": 10, "map": "MAP_ROUTE8" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 22, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_RocketGrunt1", "flag": "FLAG_HIDE_SAFFRON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 26, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_RocketGrunt2", "flag": "FLAG_HIDE_SAFFRON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 46, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_RocketGrunt3", "flag": "FLAG_HIDE_SAFFRON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 27, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_RocketGrunt4", "flag": "FLAG_HIDE_SAFFRON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 25, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 7, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_RocketGrunt5", "flag": "FLAG_HIDE_SAFFRON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 34, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_DoorGuardGrunt", "flag": "FLAG_HIDE_SAFFRON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 30, "y": 39, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 5, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_RocketGrunt7", "flag": "FLAG_HIDE_SAFFRON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 48, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_RocketGrunt6", "flag": "FLAG_HIDE_SAFFRON_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 37, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_Youngster", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 21, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_WorkerM", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 39, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_Man", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 44, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_Boy", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PIDGEOT", "in_connection": false, "x": 45, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_Pidgeot", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 32, "y": 39, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 5, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_Lass", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 47, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_BattleGirl", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 39, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Ponyta", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 15, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Rapidash", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 25, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Clefairy", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 48, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_IN_PLACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_EventScript_DynamicPunchTutor", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" } ], "warp_events": [ { "x": 33, "y": 30, "elevation": 0, "dest_map": "MAP_SILPH_CO_1F", "dest_warp_id": "1" }, { "x": 22, "y": 14, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY_COPYCATS_HOUSE_1F", "dest_warp_id": "1" }, { "x": 40, "y": 12, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY_DOJO", "dest_warp_id": "1" }, { "x": 46, "y": 12, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "1" }, { "x": 27, "y": 21, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY_HOUSE", "dest_warp_id": "1" }, { "x": 40, "y": 21, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY_MART", "dest_warp_id": "1" }, { "x": 24, "y": 38, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 43, "y": 38, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY_MR_PSYCHICS_HOUSE", "dest_warp_id": "1" }, { "x": 8, "y": 27, "elevation": 3, "dest_map": "MAP_ROUTE7_EAST_ENTRANCE", "dest_warp_id": "2" }, { "x": 34, "y": 5, "elevation": 3, "dest_map": "MAP_ROUTE5_SOUTH_ENTRANCE", "dest_warp_id": "2" }, { "x": 58, "y": 27, "elevation": 3, "dest_map": "MAP_ROUTE8_WEST_ENTRANCE", "dest_warp_id": "1" }, { "x": 34, "y": 46, "elevation": 3, "dest_map": "MAP_ROUTE6_NORTH_ENTRANCE", "dest_warp_id": "0" }, { "x": 35, "y": 46, "elevation": 3, "dest_map": "MAP_ROUTE6_NORTH_ENTRANCE", "dest_warp_id": "0" }, { "x": 35, "y": 5, "elevation": 3, "dest_map": "MAP_ROUTE5_SOUTH_ENTRANCE", "dest_warp_id": "2" }, { "x": 47, "y": 21, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 29, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_EventScript_CitySign" }, { "type": "sign", "x": 42, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_EventScript_DojoSign" }, { "type": "sign", "x": 13, "y": 25, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_EventScript_SilphProductSign" }, { "type": "sign", "x": 18, "y": 30, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_EventScript_TrainerTips2" }, { "type": "sign", "x": 29, "y": 31, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_EventScript_SilphCoSign" }, { "type": "sign", "x": 54, "y": 25, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_EventScript_TrainerTips1" }, { "type": "sign", "x": 50, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_EventScript_GymSign" }, { "type": "sign", "x": 40, "y": 38, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_EventScript_MrPsychicsHouseSign" }, { "type": "sign", "x": 49, "y": 22, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_EventScript_TrainerFanClubSign" } ], "connections_no_include": "", "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity/scripts.inc ================================================ .set LOCALID_DOOR_GUARD_GRUNT, 6 .set LOCALID_PONYTA_MASTER, 16 .set LOCALID_RAPIDASH_MASTER, 17 .set LOCALID_CLEFAIRY_MASTER, 18 .set TRAINER, VAR_0x8009 SaffronCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_OnTransition .byte 0 SaffronCity_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SAFFRON_CITY call_if_unset FLAG_RESCUED_MR_FUJI, SaffronCity_EventScript_MoveDoorGuardGrunt goto SaffronCity_MapScript_SetMasterTrainerMovementTypes end SaffronCity_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PONYTA callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SaffronCity_MapScript_PonytaMasterMovementType setvar TRAINER, MASTER_RAPIDASH callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SaffronCity_MapScript_RapidashMasterMovementType setvar TRAINER, MASTER_CLEFAIRY callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SaffronCity_MapScript_ClefairyMasterMovementType end SaffronCity_MapScript_PonytaMasterMovementType:: setobjectmovementtype LOCALID_PONYTA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SaffronCity_MapScript_RapidashMasterMovementType:: setobjectmovementtype LOCALID_RAPIDASH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SaffronCity_MapScript_ClefairyMasterMovementType:: setobjectmovementtype LOCALID_CLEFAIRY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SaffronCity_EventScript_MoveDoorGuardGrunt:: setobjectxyperm LOCALID_DOOR_GUARD_GRUNT, 33, 31 return SaffronCity_EventScript_RocketGrunt1:: msgbox SaffronCity_Text_WhatDoYouWantGetLost, MSGBOX_NPC end SaffronCity_EventScript_RocketGrunt2:: msgbox SaffronCity_Text_BossTakeTownForTeamRocket, MSGBOX_NPC end SaffronCity_EventScript_RocketGrunt3:: msgbox SaffronCity_Text_DontGetDefiantOrIllHurtYou, MSGBOX_NPC end SaffronCity_EventScript_RocketGrunt4:: msgbox SaffronCity_Text_SaffronBelongsToTeamRocket, MSGBOX_NPC end SaffronCity_EventScript_RocketGrunt5:: msgbox SaffronCity_Text_CriminalLifeMakesMeFeelAlive, MSGBOX_NPC end SaffronCity_EventScript_RocketGrunt6:: msgbox SaffronCity_Text_WatchWhereYoureWalking, MSGBOX_NPC end SaffronCity_EventScript_RocketGrunt7:: msgbox SaffronCity_Text_WeCanExploitMonsAroundWorld, MSGBOX_NPC end SaffronCity_EventScript_DoorGuardGrunt:: lock goto_if_set FLAG_RESCUED_MR_FUJI, SaffronCity_EventScript_DoorGuardAsleep applymovement LOCALID_DOOR_GUARD_GRUNT, Common_Movement_FacePlayer waitmovement 0 msgbox SaffronCity_Text_ImASecurityGuard release end SaffronCity_EventScript_DoorGuardAsleep:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox SaffronCity_Text_HesTakingASnooze release end SaffronCity_EventScript_WorkerM:: msgbox SaffronCity_Text_YouBeatTeamRocket, MSGBOX_NPC end SaffronCity_EventScript_Youngster:: msgbox SaffronCity_Text_SafeToGoOutAgain, MSGBOX_NPC end SaffronCity_EventScript_Lass:: msgbox SaffronCity_Text_PeopleComingBackToSaffron, MSGBOX_NPC end SaffronCity_EventScript_Boy:: msgbox SaffronCity_Text_FlewHereOnPidgeot, MSGBOX_NPC end SaffronCity_EventScript_Pidgeot:: lock faceplayer waitse playmoncry SPECIES_PIDGEOT, CRY_MODE_NORMAL msgbox SaffronCity_Text_Pidgeot waitmoncry release end SaffronCity_EventScript_Man:: msgbox SaffronCity_Text_SawRocketBossEscaping, MSGBOX_NPC end SaffronCity_EventScript_CitySign:: msgbox SaffronCity_Text_CitySign, MSGBOX_SIGN end SaffronCity_EventScript_DojoSign:: msgbox SaffronCity_Text_FightingDojo, MSGBOX_SIGN end SaffronCity_EventScript_GymSign:: lockall famechecker FAMECHECKER_SABRINA, 0 msgbox SaffronCity_Text_GymSign releaseall end SaffronCity_EventScript_TrainerTips1:: msgbox SaffronCity_Text_FullHealCuresStatus, MSGBOX_SIGN end SaffronCity_EventScript_TrainerTips2:: msgbox SaffronCity_Text_GreatBallImprovedCatchRate, MSGBOX_SIGN end SaffronCity_EventScript_SilphCoSign:: msgbox SaffronCity_Text_SilphCoSign, MSGBOX_SIGN end SaffronCity_EventScript_MrPsychicsHouseSign:: msgbox SaffronCity_Text_MrPsychicsHouse, MSGBOX_SIGN end SaffronCity_EventScript_SilphProductSign:: msgbox SaffronCity_Text_SilphsLatestProduct, MSGBOX_SIGN end SaffronCity_EventScript_TrainerFanClubSign:: msgbox SaffronCity_Text_TrainerFanClubSign, MSGBOX_SIGN end ================================================ FILE: data/maps/SaffronCity/text.inc ================================================ SaffronCity_Text_WhatDoYouWantGetLost:: .string "What do you want?\n" .string "Get lost!$" SaffronCity_Text_BossTakeTownForTeamRocket:: .string "BOSS said he'll take this town\n" .string "in the name of TEAM ROCKET!$" SaffronCity_Text_DontGetDefiantOrIllHurtYou:: .string "Don't get defiant!\n" .string "Or I'll have to hurt you!$" SaffronCity_Text_SaffronBelongsToTeamRocket:: .string "SAFFRON belongs to TEAM ROCKET!$" SaffronCity_Text_CriminalLifeMakesMeFeelAlive:: .string "My life as a criminal makes me feel\n" .string "so alive!$" SaffronCity_Text_WatchWhereYoureWalking:: .string "Ow!\n" .string "Watch where you're walking!$" SaffronCity_Text_WeCanExploitMonsAroundWorld:: .string "With SILPH under control, we can\n" .string "exploit POKéMON around the world!\p" .string "We'll get stinking rich, yeahah!$" SaffronCity_Text_YouBeatTeamRocket:: .string "You beat TEAM ROCKET all alone?\n" .string "That's amazing!$" SaffronCity_Text_SafeToGoOutAgain:: .string "Yeah! TEAM ROCKET is gone!\n" .string "It's safe to go out again!$" SaffronCity_Text_PeopleComingBackToSaffron:: .string "People fled from here in droves\n" .string "when those ROCKETS came.\p" .string "They should be flocking back to\n" .string "SAFFRON now.$" SaffronCity_Text_FlewHereOnPidgeot:: .string "I flew here on my PIDGEOT when\n" .string "I read about SILPH.\p" .string "It's already over?\n" .string "I missed the media action…$" SaffronCity_Text_Pidgeot:: .string "PIDGEOT: Bi bibii!$" SaffronCity_Text_SawRocketBossEscaping:: .string "I saw the ROCKET BOSS escaping\n" .string "SILPH's building.$" SaffronCity_Text_ImASecurityGuard:: .string "I'm a security guard.\p" .string "Suspicious kids I don't allow in!$" SaffronCity_Text_HesTakingASnooze:: .string "…\n" .string "Snore…\p" .string "Hah! He's taking a snooze!$" SaffronCity_Text_CitySign:: .string "SAFFRON CITY\n" .string "Shining, Golden Land of Commerce$" SaffronCity_Text_FightingDojo:: .string "FIGHTING DOJO$" SaffronCity_Text_GymSign:: .string "SAFFRON CITY POKéMON GYM\n" .string "LEADER: SABRINA\l" .string "The Master of PSYCHIC POKéMON!$" SaffronCity_Text_FullHealCuresStatus:: .string "TRAINER TIPS\p" .string "FULL HEAL cures all ailments like\n" .string "burns, paralysis, poisoning,\l" .string "freezing, and sleep.\p" .string "It costs a bit more, but it's more\n" .string "convenient than buying other items.$" SaffronCity_Text_GreatBallImprovedCatchRate:: .string "TRAINER TIPS\p" .string "The new GREAT BALL offers improved\n" .string "catching rates.\p" .string "Try it on those hard-to-catch\n" .string "POKéMON.$" SaffronCity_Text_SilphCoSign:: .string "SILPH CO. OFFICE BUILDING$" SaffronCity_Text_MrPsychicsHouse:: .string "MR. PSYCHIC'S HOUSE$" SaffronCity_Text_SilphsLatestProduct:: .string "SILPH's latest product!\n" .string "Release to be determined…$" SaffronCity_Text_TrainerFanClubSign:: .string "POKéMON TRAINER FAN CLUB\p" .string "Many TRAINERS have scribbled their\n" .string "names on this sign.$" SaffronCity_Text_HowCanClubNotRecognizeLance:: .string "This FAN CLUB…\n" .string "No one here has a clue!\p" .string "How could they not recognize\n" .string "the brilliance that is LANCE?\p" .string "He stands for justice!\n" .string "He's cool, and yet passionate!\l" .string "He's the greatest, LANCE!$" ================================================ FILE: data/maps/SaffronCity_Connection/map.json ================================================ { "id": "MAP_SAFFRON_CITY_CONNECTION", "name": "SaffronCity_Connection", "layout": "LAYOUT_SAFFRON_CITY_CONNECTION", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_ROUTE5" }, { "direction": "down", "offset": 0, "map": "MAP_ROUTE6" }, { "direction": "left", "offset": 10, "map": "MAP_ROUTE7" }, { "direction": "right", "offset": 10, "map": "MAP_ROUTE8" } ], "object_events": [ ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity_Connection/scripts.inc ================================================ SaffronCity_Connection_MapScripts:: .byte 0 ================================================ FILE: data/maps/SaffronCity_CopycatsHouse_1F/map.json ================================================ { "id": "MAP_SAFFRON_CITY_COPYCATS_HOUSE_1F", "name": "SaffronCity_CopycatsHouse_1F", "layout": "LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_1F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 8, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_CopycatsHouse_1F_EventScript_CopycatsDad", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "x": 3, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_CopycatsHouse_1F_EventScript_CopycatsMom", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANSEY", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_CopycatsHouse_1F_EventScript_Chansey", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 8, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "1" }, { "x": 4, "y": 8, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "1" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "1" }, { "x": 10, "y": 2, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_COPYCATS_HOUSE_2F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity_CopycatsHouse_1F/scripts.inc ================================================ SaffronCity_CopycatsHouse_1F_MapScripts:: .byte 0 SaffronCity_CopycatsHouse_1F_EventScript_CopycatsMom:: msgbox SaffronCity_CopycatsHouse_1F_Text_DaughterIsSelfCentered, MSGBOX_NPC end SaffronCity_CopycatsHouse_1F_EventScript_CopycatsDad:: msgbox SaffronCity_CopycatsHouse_1F_Text_DaughterLikesToMimicPeople, MSGBOX_NPC end SaffronCity_CopycatsHouse_1F_EventScript_Chansey:: lock faceplayer waitse playmoncry SPECIES_CHANSEY, CRY_MODE_NORMAL msgbox SaffronCity_CopycatsHouse_1F_Text_Chansey waitmoncry release end ================================================ FILE: data/maps/SaffronCity_CopycatsHouse_1F/text.inc ================================================ SaffronCity_CopycatsHouse_1F_Text_DaughterIsSelfCentered:: .string "My daughter is so self-centered.\n" .string "She has but a few friends.$" SaffronCity_CopycatsHouse_1F_Text_DaughterLikesToMimicPeople:: .string "My daughter likes to mimic people.\n" .string "It's rather vexing.\p" .string "Her mimicry has earned her the\n" .string "nickname COPYCAT around here.$" SaffronCity_CopycatsHouse_1F_Text_Chansey:: .string "CHANSEY: Chaan! Sii!$" ================================================ FILE: data/maps/SaffronCity_CopycatsHouse_2F/map.json ================================================ { "id": "MAP_SAFFRON_CITY_COPYCATS_HOUSE_2F", "name": "SaffronCity_CopycatsHouse_2F", "layout": "LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_2F", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_DODUO", "x": 6, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_CopycatsHouse_2F_EventScript_Doduo", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PIKACHU", "x": 4, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_CopycatsHouse_2F_EventScript_Doll", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JIGGLYPUFF", "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_CopycatsHouse_2F_EventScript_Doll", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_CopycatsHouse_2F_EventScript_Copycat", "flag": "0" } ], "warp_events": [ { "x": 10, "y": 2, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_COPYCATS_HOUSE_1F", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 1, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_CopycatsHouse_2F_EventScript_Computer" }, { "type": "sign", "x": 3, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_CopycatsHouse_2F_EventScript_Game" }, { "type": "hidden_item", "x": 2, "y": 1, "elevation": 0, "item": "ITEM_NUGGET", "flag": "FLAG_HIDDEN_ITEM_SAFFRON_CITY_COPYCATS_HOUSE_2F_NUGGET", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity_CopycatsHouse_2F/scripts.inc ================================================ SaffronCity_CopycatsHouse_2F_MapScripts:: .byte 0 SaffronCity_CopycatsHouse_2F_EventScript_Doduo:: lock faceplayer waitse playmoncry SPECIES_DODUO, CRY_MODE_NORMAL msgbox SaffronCity_CopycatsHouse_2F_Text_Doduo waitmoncry release end SaffronCity_CopycatsHouse_2F_EventScript_Doll:: lock msgbox SaffronCity_CopycatsHouse_2F_Text_RareMonOnlyDoll release end SaffronCity_CopycatsHouse_2F_EventScript_Copycat:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer checkitem ITEM_POKE_DOLL goto_if_eq VAR_RESULT, TRUE, EventScript_MimicTutor checkplayergender call_if_eq VAR_RESULT, MALE, SaffronCity_CopycatsHouse_2F_EventScript_MimicPlayerMale call_if_eq VAR_RESULT, FEMALE, SaffronCity_CopycatsHouse_2F_EventScript_MimicPlayerFemale release end SaffronCity_CopycatsHouse_2F_EventScript_MimicPlayerMale:: msgbox SaffronCity_CopycatsHouse_2F_Text_MimickingFavoriteHobbyMale return SaffronCity_CopycatsHouse_2F_EventScript_MimicPlayerFemale:: msgbox SaffronCity_CopycatsHouse_2F_Text_MimickingFavoriteHobbyFemale return SaffronCity_CopycatsHouse_2F_EventScript_Computer:: msgbox SaffronCity_CopycatsHouse_2F_Text_MySecrets, MSGBOX_SIGN end SaffronCity_CopycatsHouse_2F_EventScript_Game:: msgbox SaffronCity_CopycatsHouse_2F_Text_MarioWearingABucket, MSGBOX_SIGN end ================================================ FILE: data/maps/SaffronCity_CopycatsHouse_2F/text.inc ================================================ SaffronCity_CopycatsHouse_2F_Text_MimickingFavoriteHobbyMale:: .string "{PLAYER}: Hi!\n" .string "Do you like POKéMON?\p" .string "{PLAYER}: Uh, no, I just asked you.\p" .string "{PLAYER}: Huh?\n" .string "You're strange!\p" .string "COPYCAT: Hmm? Quit mimicking?\n" .string "But, that's my favorite hobby!$" SaffronCity_CopycatsHouse_2F_Text_MimickingFavoriteHobbyFemale:: .string "{PLAYER}: Hi.\n" .string "You must like POKéMON.\p" .string "{PLAYER}: No, not me.\n" .string "I asked you.\p" .string "{PLAYER}: Pardon?\n" .string "You're weird!\l" .string " \l" .string "COPYCAT: Hmm? Quit mimicking?\l" .string "But that's my favorite hobby!$" Text_MimicTeach:: .string "Oh wow!\n" .string "A POKé DOLL!\p" .string "For me?\n" .string "Thank you!\p" .string "You know what?\n" .string "I can teach the move MIMIC.$" Text_MimicDeclined:: .string "Don't you like MIMIC?$" Text_MimicWhichMon:: .string "I really love MIMIC!\n" .string "Who's going to learn it?$" Text_MimicTaughtMale:: .string "{PLAYER}: Hi!\n" .string "Thanks for earlier!\p" .string "{PLAYER}: Pardon?\p" .string "{PLAYER}: Is it that fun to mimic my\n" .string "every move?\p" .string "COPYCAT: You bet!\n" .string "It's a scream!$" Text_MimicTaughtFemale:: .string "{PLAYER}: Hi!\n" .string "Thanks for what you did for us.\p" .string "{PLAYER}: Pardon?\p" .string "{PLAYER}: Is it really that fun to\n" .string "copy what I say and do?\p" .string "COPYCAT: You bet!\n" .string "It's a scream!$" Text_MimicReteach:: .string "{PLAYER}: Hi!\n" .string "Could you teach us MIMIC again?\p" .string "{PLAYER}: Pardon?\p" .string "{PLAYER}: Is it that fun to copy my\n" .string "every word?\p" .string "COPYCAT: Absolutely!\n" .string "It's a scream!\p" .string "I can reteach MIMIC if you'll give\n" .string "me ¥5000 for more dolls!$" Text_MimicReteach2:: .string "Is that okay?\n" .string "Should I mimic teaching MIMIC?$" Text_MimicNotEnoughMoney:: .string "{PLAYER}: ¥5000?\n" .string "But a POKé DOLL only costs ¥1000!\p" .string "I don't have enough money for\n" .string "that right now…\p" .string "COPYCAT: I want to buy five\n" .string "POKé DOLLS! So I need ¥5000!\p" .string "I'll mimic teaching MIMIC to\n" .string "your POKéMON when you have it!$" Text_MimicTaughtMale2:: .string "{PLAYER}: Okay!\n" .string "Thanks for that!\p" .string "{PLAYER}: Pardon?\p" .string "{PLAYER}: Is it that fun to mimic my\n" .string "every move?\p" .string "COPYCAT: You bet!\n" .string "It's a scream!$" Text_MimicTaughtFemale2:: .string "{PLAYER}: Okay!\n" .string "Thanks for what you did for us.\p" .string "{PLAYER}: Pardon?\p" .string "{PLAYER}: Is it really that fun to\n" .string "copy what I say and do?\p" .string "COPYCAT: You bet!\n" .string "It's a scream!$" SaffronCity_CopycatsHouse_2F_Text_Doduo:: .string "DODUO: Giiih!\p" .string "PRETTY MIRROR LOOK AT ME,\n" .string "SEE HOW PRETTY I CAN BE?$" SaffronCity_CopycatsHouse_2F_Text_RareMonOnlyDoll:: .string "This is a rare POKéMON!\n" .string "Huh? It's only a doll!$" SaffronCity_CopycatsHouse_2F_Text_MarioWearingABucket:: .string "A game with MARIO wearing a bucket\n" .string "on his head!$" SaffronCity_CopycatsHouse_2F_Text_MySecrets:: .string "…\p" .string "My Secrets!\p" .string "Skill: Mimicry!\n" .string "Hobby: Collecting dolls!\l" .string "Favorite POKéMON: CLEFAIRY!$" ================================================ FILE: data/maps/SaffronCity_Dojo/map.json ================================================ { "id": "MAP_SAFFRON_CITY_DOJO", "name": "SaffronCity_Dojo", "layout": "LAYOUT_SAFFRON_CITY_DOJO", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "7", "script": "SaffronCity_Dojo_EventScript_Hitoshi", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 1, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "7", "script": "SaffronCity_Dojo_EventScript_Hideki", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 11, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "7", "script": "SaffronCity_Dojo_EventScript_Aaron", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 1, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "7", "script": "SaffronCity_Dojo_EventScript_Mike", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SaffronCity_Dojo_EventScript_MasterKoichi", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_Dojo_EventScript_HitmonleeBall", "flag": "FLAG_HIDE_DOJO_HITMONLEE_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 7, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_Dojo_EventScript_HitmonchanBall", "flag": "FLAG_HIDE_DOJO_HITMONCHAN_BALL" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BLACK_BELT", "in_connection": false, "x": 2, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Hitmonlee", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BLACK_BELT", "in_connection": false, "x": 10, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Hitmonchan", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 5, "y": 14, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "2" }, { "x": 6, "y": 14, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "2" }, { "x": 7, "y": 14, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "2" } ], "coord_events": [ { "type": "trigger", "x": 5, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_SAFFRON_CITY_DOJO", "var_value": "0", "script": "SaffronCity_Dojo_EventScript_TriggerMasterBattleLeft" }, { "type": "trigger", "x": 7, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_SAFFRON_CITY_DOJO", "var_value": "0", "script": "SaffronCity_Dojo_EventScript_TriggerMasterBattleRight" } ], "bg_events": [ { "type": "sign", "x": 3, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_Dojo_EventScript_Statue" }, { "type": "sign", "x": 9, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_Dojo_EventScript_Statue" }, { "type": "sign", "x": 5, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_Dojo_EventScript_LeftScroll" }, { "type": "sign", "x": 7, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_Dojo_EventScript_RightScroll" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SaffronCity_Dojo/scripts.inc ================================================ .equ LOCALID_KARATE_MASTER, 5 .set LOCALID_HITMONLEE_MASTER, 8 .set LOCALID_HITMONCHAN_MASTER, 9 .set TRAINER, VAR_0x8009 SaffronCity_Dojo_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_Dojo_MapScript_SetMasterTrainerMovementTypes .byte 0 SaffronCity_Dojo_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_HITMONLEE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SaffronCity_Dojo_MapScript_HitmonleeMasterMovementType setvar TRAINER, MASTER_HITMONCHAN callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SaffronCity_Dojo_MapScript_HitmonchanMasterMovementType end SaffronCity_Dojo_MapScript_HitmonleeMasterMovementType:: setobjectmovementtype LOCALID_HITMONLEE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SaffronCity_Dojo_MapScript_HitmonchanMasterMovementType:: setobjectmovementtype LOCALID_HITMONCHAN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SaffronCity_Dojo_EventScript_TriggerMasterBattleLeft:: lockall setvar VAR_MAP_SCENE_SAFFRON_CITY_DOJO, 1 applymovement LOCALID_KARATE_MASTER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 releaseall end SaffronCity_Dojo_EventScript_TriggerMasterBattleRight:: lockall setvar VAR_MAP_SCENE_SAFFRON_CITY_DOJO, 1 applymovement LOCALID_KARATE_MASTER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 releaseall end SaffronCity_Dojo_EventScript_HitmonleeBall:: lock faceplayer goto_if_set FLAG_GOT_HITMON_FROM_DOJO, SaffronCity_Dojo_EventScript_AlreadyGotHitmon showmonpic SPECIES_HITMONLEE, 10, 3 setvar VAR_TEMP_1, SPECIES_HITMONLEE applymovement LOCALID_KARATE_MASTER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 textcolor NPC_TEXT_COLOR_MALE msgbox SaffronCity_Dojo_Text_YouWantHitmonlee, MSGBOX_YESNO call EventScript_RestorePrevTextColor goto_if_eq VAR_RESULT, YES, SaffronCity_Dojo_EventScript_GiveHitmon hidemonpic release end SaffronCity_Dojo_EventScript_AlreadyGotHitmon:: msgbox SaffronCity_Dojo_Text_BetterNotGetGreedy release end SaffronCity_Dojo_EventScript_HitmonchanBall:: lock faceplayer goto_if_set FLAG_GOT_HITMON_FROM_DOJO, SaffronCity_Dojo_EventScript_AlreadyGotHitmon showmonpic SPECIES_HITMONCHAN, 10, 3 setvar VAR_TEMP_1, SPECIES_HITMONCHAN applymovement LOCALID_KARATE_MASTER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 textcolor NPC_TEXT_COLOR_MALE msgbox SaffronCity_Dojo_Text_YouWantHitmonchan, MSGBOX_YESNO call EventScript_RestorePrevTextColor goto_if_eq VAR_RESULT, YES, SaffronCity_Dojo_EventScript_GiveHitmon hidemonpic release end SaffronCity_Dojo_EventScript_GiveHitmon:: hidemonpic givemon VAR_TEMP_1, 25 goto_if_eq VAR_RESULT, 0, SaffronCity_Dojo_EventScript_ReceivedHitmonParty goto_if_eq VAR_RESULT, 1, SaffronCity_Dojo_EventScript_ReceivedHitmonPC goto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon release end SaffronCity_Dojo_EventScript_ReceivedHitmonParty:: removeobject VAR_LAST_TALKED bufferspeciesname STR_VAR_1, VAR_TEMP_1 playfanfare MUS_LEVEL_UP message SaffronCity_Dojo_Text_ReceivedMonFromKarateMaster waitmessage waitfanfare setflag FLAG_GOT_HITMON_FROM_DOJO callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, SaffronCity_Dojo_EventScript_NicknameHitmonParty msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, SaffronCity_Dojo_EventScript_EndGiveMon SaffronCity_Dojo_EventScript_NicknameHitmonParty:: call EventScript_GetGiftMonPartySlot call EventScript_ChangePokemonNickname goto SaffronCity_Dojo_EventScript_EndGiveMon end SaffronCity_Dojo_EventScript_ReceivedHitmonPC:: removeobject VAR_LAST_TALKED bufferspeciesname STR_VAR_1, VAR_TEMP_1 playfanfare MUS_LEVEL_UP message SaffronCity_Dojo_Text_ReceivedMonFromKarateMaster waitmessage waitfanfare setflag FLAG_GOT_HITMON_FROM_DOJO callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, SaffronCity_Dojo_EventScript_NicknameHitmonPC msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, SaffronCity_Dojo_EventScript_TransferredHitmonToPC SaffronCity_Dojo_EventScript_NicknameHitmonPC:: call EventScript_NameReceivedBoxMon goto SaffronCity_Dojo_EventScript_TransferredHitmonToPC end SaffronCity_Dojo_EventScript_TransferredHitmonToPC:: call EventScript_TransferredToPC goto SaffronCity_Dojo_EventScript_EndGiveMon end SaffronCity_Dojo_EventScript_EndGiveMon:: release end SaffronCity_Dojo_EventScript_Statue:: msgbox SaffronCity_Dojo_Text_FightingDojo, MSGBOX_SIGN end SaffronCity_Dojo_EventScript_LeftScroll:: msgbox SaffronCity_Dojo_Text_EnemiesOnEverySide, MSGBOX_SIGN end SaffronCity_Dojo_EventScript_RightScroll:: msgbox SaffronCity_Dojo_Text_GoesAroundComesAround, MSGBOX_SIGN end SaffronCity_Dojo_EventScript_Hitoshi:: trainerbattle_single TRAINER_BLACK_BELT_HITOSHI, SaffronCity_Dojo_Text_HitoshiIntro, SaffronCity_Dojo_Text_HitoshiDefeat msgbox SaffronCity_Dojo_Text_HitoshiPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Dojo_EventScript_Hideki:: trainerbattle_single TRAINER_BLACK_BELT_HIDEKI, SaffronCity_Dojo_Text_HidekiIntro, SaffronCity_Dojo_Text_HidekiDefeat msgbox SaffronCity_Dojo_Text_HidekiPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Dojo_EventScript_Aaron:: trainerbattle_single TRAINER_BLACK_BELT_AARON, SaffronCity_Dojo_Text_AaronIntro, SaffronCity_Dojo_Text_AaronDefeat msgbox SaffronCity_Dojo_Text_AaronPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Dojo_EventScript_Mike:: trainerbattle_single TRAINER_BLACK_BELT_MIKE, SaffronCity_Dojo_Text_MikeIntro, SaffronCity_Dojo_Text_MikeDefeat msgbox SaffronCity_Dojo_Text_MikePostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Dojo_EventScript_MasterKoichi:: trainerbattle_single TRAINER_BLACK_BELT_KOICHI, SaffronCity_Dojo_Text_MasterKoichiIntro, SaffronCity_Dojo_Text_MasterKoichiDefeat, SaffronCity_Dojo_EventScript_DefeatedMasterKoichi goto_if_set FLAG_GOT_HITMON_FROM_DOJO, SaffronCity_Dojo_EventScript_MasterKoichiAlreadyGotHitmon msgbox SaffronCity_Dojo_Text_ChoosePrizedFightingMon, MSGBOX_AUTOCLOSE end SaffronCity_Dojo_EventScript_MasterKoichiAlreadyGotHitmon:: msgbox SaffronCity_Dojo_Text_StayAndTrainWithUs release end SaffronCity_Dojo_EventScript_DefeatedMasterKoichi:: setvar VAR_MAP_SCENE_SAFFRON_CITY_DOJO, 1 release end ================================================ FILE: data/maps/SaffronCity_Dojo/text.inc ================================================ SaffronCity_Dojo_Text_MasterKoichiIntro:: .string "Grunt!\p" .string "I am the KARATE MASTER!\n" .string "I am the LEADER here!\p" .string "You wish to challenge us?\n" .string "Expect no mercy!\p" .string "Fwaaa!$" SaffronCity_Dojo_Text_MasterKoichiDefeat:: .string "Hwa!\n" .string "Arrgh! Beaten!$" SaffronCity_Dojo_Text_ChoosePrizedFightingMon:: .string "Indeed, I have lost!\p" .string "But, I beseech you, do not take\n" .string "our emblem as your trophy!\p" .string "In return, I will give you a prized\n" .string "FIGHTING POKéMON!\p" .string "Choose whichever one you like!$" SaffronCity_Dojo_Text_StayAndTrainWithUs:: .string "Grunt!\n" .string "Stay and train at karate with us!$" SaffronCity_Dojo_Text_MikeIntro:: .string "Hoargh!\n" .string "Take your shoes off!$" SaffronCity_Dojo_Text_MikeDefeat:: .string "I give up!$" SaffronCity_Dojo_Text_MikePostBattle:: .string "You wait 'til you see our MASTER!\n" .string "I'm a small fry compared to him!$" SaffronCity_Dojo_Text_HidekiIntro:: .string "I hear you're good!\n" .string "Show me!$" SaffronCity_Dojo_Text_HidekiDefeat:: .string "Judge!\n" .string "One point!$" SaffronCity_Dojo_Text_HidekiPostBattle:: .string "Our MASTER is a pro fighter.\n" .string "Be prepared to lose!$" SaffronCity_Dojo_Text_AaronIntro:: .string "Hiyah!\n" .string "I have no fear for anything tough!\p" .string "I shatter boulders for training\n" .string "every day!$" SaffronCity_Dojo_Text_AaronDefeat:: .string "Yow!\n" .string "Stubbed fingers!$" SaffronCity_Dojo_Text_AaronPostBattle:: .string "The only thing that frightens us is\n" .string "psychic power!$" SaffronCity_Dojo_Text_HitoshiIntro:: .string "Hwaah!\p" .string "You're trespassing in our\n" .string "FIGHTING DOJO!$" SaffronCity_Dojo_Text_HitoshiDefeat:: .string "Oof!\n" .string "I give up!$" SaffronCity_Dojo_Text_HitoshiPostBattle:: .string "The prime fighters across the land\n" .string "train here.$" SaffronCity_Dojo_Text_YouWantHitmonlee:: .string "You want the hard-kicking\n" .string "HITMONLEE?$" SaffronCity_Dojo_Text_ReceivedMonFromKarateMaster:: .string "{PLAYER} received the {STR_VAR_1}\n" .string "from the KARATE MASTER.$" SaffronCity_Dojo_Text_YouWantHitmonchan:: .string "You want the piston-punching\n" .string "HITMONCHAN?$" SaffronCity_Dojo_Text_BetterNotGetGreedy:: .string "Better not get greedy…$" SaffronCity_Dojo_Text_EnemiesOnEverySide:: .string "Enemies on every side!$" SaffronCity_Dojo_Text_GoesAroundComesAround:: .string "What goes around comes around.$" SaffronCity_Dojo_Text_FightingDojo:: .string "FIGHTING DOJO$" ================================================ FILE: data/maps/SaffronCity_Gym/map.json ================================================ { "id": "MAP_SAFFRON_CITY_GYM", "name": "SaffronCity_Gym", "layout": "LAYOUT_SAFFRON_CITY_GYM", "music": "MUS_GYM", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_M", "x": 24, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SaffronCity_Gym_EventScript_Cameron", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_M", "x": 24, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SaffronCity_Gym_EventScript_Johan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_M", "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SaffronCity_Gym_EventScript_Preston", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 14, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SaffronCity_Gym_EventScript_Amanda", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 4, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SaffronCity_Gym_EventScript_Stacy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 4, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SaffronCity_Gym_EventScript_Tasha", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SABRINA", "in_connection": false, "x": 14, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_Gym_EventScript_Sabrina", "flag": "FLAG_TEMP_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_M", "x": 24, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SaffronCity_Gym_EventScript_Tyron", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GYM_GUY", "in_connection": false, "x": 15, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_Gym_EventScript_GymGuy", "flag": "0" } ], "warp_events": [ { "x": 13, "y": 23, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "3" }, { "x": 14, "y": 23, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "3" }, { "x": 15, "y": 23, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "3" }, { "x": 18, "y": 20, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "32" }, { "x": 0, "y": 4, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "22" }, { "x": 0, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "20" }, { "x": 0, "y": 12, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "30" }, { "x": 0, "y": 15, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "11" }, { "x": 0, "y": 20, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "28" }, { "x": 0, "y": 23, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "19" }, { "x": 8, "y": 4, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "18" }, { "x": 8, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "7" }, { "x": 8, "y": 12, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "17" }, { "x": 8, "y": 15, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "15" }, { "x": 8, "y": 20, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "26" }, { "x": 8, "y": 23, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "13" }, { "x": 12, "y": 4, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "24" }, { "x": 12, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "12" }, { "x": 16, "y": 4, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "10" }, { "x": 16, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "9" }, { "x": 18, "y": 15, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "5" }, { "x": 20, "y": 4, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "23" }, { "x": 20, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "4" }, { "x": 20, "y": 12, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "21" }, { "x": 20, "y": 15, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "16" }, { "x": 20, "y": 20, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "27" }, { "x": 20, "y": 23, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "14" }, { "x": 28, "y": 4, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "25" }, { "x": 28, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "8" }, { "x": 28, "y": 12, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "31" }, { "x": 28, "y": 15, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "6" }, { "x": 28, "y": 20, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "29" }, { "x": 28, "y": 23, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY_GYM", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 12, "y": 20, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 16, "y": 20, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_Gym_EventScript_GymStatue" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SaffronCity_Gym/scripts.inc ================================================ .equ CHECK_VISITOR_STATE, 6 .equ TYPE, VAR_0x8003 .equ ARGUMENT, VAR_0x8004 SaffronCity_Gym_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_Gym_OnTransition .byte 0 SaffronCity_Gym_OnTransition:: setvar TYPE, CHECK_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_SABRINA callnative UseBattleHouseVar call_if_eq VAR_RESULT, 1, SaffronCity_Gym_EventScript_HideSabrina end SaffronCity_Gym_EventScript_HideSabrina:: setflag FLAG_TEMP_1 return SaffronCity_Gym_EventScript_Sabrina:: famechecker FAMECHECKER_SABRINA, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, SaffronCity_Gym_EventScript_Sabrina_ChallengeMode trainerbattle_single TRAINER_LEADER_SABRINA, SaffronCity_Gym_Text_SabrinaIntro, SaffronCity_Gym_Text_SabrinaDefeat, SaffronCity_Gym_EventScript_DefeatedSabrina, NO_MUSIC settrainerflag TRAINER_LEADER_SABRINA_CHALLENGE goto_if_unset FLAG_GOT_TM04_FROM_SABRINA, SaffronCity_Gym_EventScript_GiveTM04 msgbox SaffronCity_Gym_Text_ExplainTM04 release end SaffronCity_Gym_EventScript_Sabrina_ChallengeMode:: trainerbattle_single TRAINER_LEADER_SABRINA_CHALLENGE, SaffronCity_Gym_Text_SabrinaIntro, SaffronCity_Gym_Text_SabrinaDefeat, SaffronCity_Gym_EventScript_DefeatedSabrina, NO_MUSIC settrainerflag TRAINER_LEADER_SABRINA goto_if_unset FLAG_GOT_TM04_FROM_SABRINA, SaffronCity_Gym_EventScript_GiveTM04 msgbox SaffronCity_Gym_Text_ExplainTM04 release end SaffronCity_Gym_EventScript_DefeatedSabrina:: famechecker FAMECHECKER_SABRINA, 2 famechecker FAMECHECKER_SABRINA, 3 clearflag FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS setflag FLAG_DEFEATED_SABRINA setflag FLAG_BADGE06_GET set_gym_trainers 6 goto SaffronCity_Gym_EventScript_GiveTM04 end SaffronCity_Gym_EventScript_GiveTM04:: msgbox SaffronCity_Gym_Text_ExplainMarshBadgeTakeThis checkitemspace ITEM_TM04 goto_if_eq VAR_RESULT, FALSE, SaffronCity_Gym_EventScript_NoRoomForTM04 giveitem_msg SaffronCity_Gym_Text_ReceivedTM04FromSabrina, ITEM_TM04 setflag FLAG_GOT_TM04_FROM_SABRINA msgbox SaffronCity_Gym_Text_SabrinaPostBattle release end SaffronCity_Gym_EventScript_NoRoomForTM04:: msgbox SaffronCity_Gym_Text_BagFullOfOtherItems release end SaffronCity_Gym_EventScript_Johan:: trainerbattle_single TRAINER_PSYCHIC_JOHAN, SaffronCity_Gym_Text_JohanIntro, SaffronCity_Gym_Text_JohanDefeat msgbox SaffronCity_Gym_Text_JohanPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Gym_EventScript_Tyron:: trainerbattle_single TRAINER_PSYCHIC_TYRON, SaffronCity_Gym_Text_TyronIntro, SaffronCity_Gym_Text_TyronDefeat famechecker FAMECHECKER_SABRINA, 5 msgbox SaffronCity_Gym_Text_TyronPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Gym_EventScript_Cameron:: trainerbattle_single TRAINER_PSYCHIC_CAMERON, SaffronCity_Gym_Text_CameronIntro, SaffronCity_Gym_Text_CameronDefeat msgbox SaffronCity_Gym_Text_CameronPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Gym_EventScript_Preston:: trainerbattle_single TRAINER_PSYCHIC_PRESTON, SaffronCity_Gym_Text_PrestonIntro, SaffronCity_Gym_Text_PrestonDefeat msgbox SaffronCity_Gym_Text_PrestonPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Gym_EventScript_Amanda:: trainerbattle_single TRAINER_CHANNELER_AMANDA, SaffronCity_Gym_Text_AmandaIntro, SaffronCity_Gym_Text_AmandaDefeat msgbox SaffronCity_Gym_Text_AmandaPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Gym_EventScript_Stacy:: trainerbattle_single TRAINER_CHANNELER_STACY, SaffronCity_Gym_Text_StacyIntro, SaffronCity_Gym_Text_StacyDefeat msgbox SaffronCity_Gym_Text_StacyPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Gym_EventScript_Tasha:: trainerbattle_single TRAINER_CHANNELER_TASHA, SaffronCity_Gym_Text_TashaIntro, SaffronCity_Gym_Text_TashaDefeat msgbox SaffronCity_Gym_Text_TashaPostBattle, MSGBOX_AUTOCLOSE end SaffronCity_Gym_EventScript_GymGuy:: lock faceplayer goto_if_set FLAG_DEFEATED_SABRINA, SaffronCity_Gym_EventScript_GymGuyPostVictory msgbox SaffronCity_Gym_Text_GymGuyAdvice release end SaffronCity_Gym_EventScript_GymGuyPostVictory:: msgbox SaffronCity_Gym_Text_GymGuyPostVictory release end SaffronCity_Gym_EventScript_GymStatue:: lockall goto_if_set FLAG_BADGE06_GET, SaffronCity_Gym_EventScript_GymStatuePostVictory msgbox SaffronCity_Gym_Text_GymStatue releaseall end SaffronCity_Gym_EventScript_GymStatuePostVictory:: msgbox SaffronCity_Gym_Text_GymStatuePlayerWon releaseall end ================================================ FILE: data/maps/SaffronCity_Gym/text.inc ================================================ SaffronCity_Gym_Text_SabrinaIntro:: .string "I had a vision of your arrival.\p" .string "I have had psychic powers since\n" .string "I was a child.\p" .string "It started when a spoon I\n" .string "carelessly tossed, bent.\p" .string "I dislike battling, but if you wish,\n" .string "I will show you my powers!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" SaffronCity_Gym_Text_SabrinaDefeat:: .string "This loss shocks me!\n" .string "But, a loss is a loss.\p" .string "I admit, I didn't work hard enough\n" .string "to win.\p" .string "Your victory has earned you the\n" .string "MARSHBADGE.$" SaffronCity_Gym_Text_SabrinaPostBattle:: .string "Psychic power isn't something that\n" .string "only a few people have.\p" .string "Everyone has psychic power.\n" .string "People just don't realize it.$" SaffronCity_Gym_Text_ExplainMarshBadgeTakeThis:: .string "The MARSHBADGE makes POKéMON up\n" .string "to Lv. 70 obey you.\p" .string "Stronger POKéMON will become wild,\n" .string "ignoring your orders in battle.\p" .string "Just don't raise your POKéMON too\n" .string "much to avoid that problem.\p" .string "Wait, please take this TM with you.$" SaffronCity_Gym_Text_ReceivedTM04FromSabrina:: .string "{PLAYER} received TM04 from\n" .string "SABRINA.$" SaffronCity_Gym_Text_ExplainTM04:: .string "TM04 is CALM MIND.\p" .string "It makes the POKéMON concentrate\n" .string "to raise both SP. ATK and SP. DEF.$" SaffronCity_Gym_Text_BagFullOfOtherItems:: .string "Your BAG is full of other items.$" SaffronCity_Gym_Text_AmandaIntro:: .string "SABRINA is far younger than I,\n" .string "but she has earned my respect.$" SaffronCity_Gym_Text_AmandaDefeat:: .string "Not good enough!$" SaffronCity_Gym_Text_AmandaPostBattle:: .string "In a battle of equals, the one\n" .string "with the stronger will wins.\p" .string "If you wish to beat SABRINA, focus\n" .string "and will yourself to victory.$" SaffronCity_Gym_Text_JohanIntro:: .string "Does our unseen power scare you?$" SaffronCity_Gym_Text_JohanDefeat:: .string "I never foresaw this!$" SaffronCity_Gym_Text_JohanPostBattle:: .string "PSYCHIC POKéMON fear only ghosts\n" .string "and bugs!$" SaffronCity_Gym_Text_StacyIntro:: .string "POKéMON take on the appearance of\n" .string "their TRAINERS.\p" .string "Your POKéMON must be tough, then!$" SaffronCity_Gym_Text_StacyDefeat:: .string "I knew it!$" SaffronCity_Gym_Text_StacyPostBattle:: .string "I have much to learn still…\p" .string "I must master PSYCHIC and teach it\n" .string "to my POKéMON…$" SaffronCity_Gym_Text_TyronIntro:: .string "You understand, don't you?\p" .string "That power alone isn't enough to\n" .string "win in the world of POKéMON?$" SaffronCity_Gym_Text_TyronDefeat:: .string "I don't believe this!$" SaffronCity_Gym_Text_TyronPostBattle:: .string "SABRINA just wiped out the KARATE\n" .string "MASTER next door.$" SaffronCity_Gym_Text_TashaIntro:: .string "You and I, our POKéMON shall\n" .string "battle!$" SaffronCity_Gym_Text_TashaDefeat:: .string "I lost after all!$" SaffronCity_Gym_Text_TashaPostBattle:: .string "I knew that this was going to take\n" .string "place.$" SaffronCity_Gym_Text_CameronIntro:: .string "SABRINA is young, but she's also\n" .string "our highly skilled LEADER.\p" .string "You won't reach her easily!$" SaffronCity_Gym_Text_CameronDefeat:: .string "Ow!\n" .string "Down and out!$" SaffronCity_Gym_Text_CameronPostBattle:: .string "There used to be two POKéMON GYMS\n" .string "in SAFFRON.\p" .string "The FIGHTING DOJO next door lost\n" .string "its GYM status, though.\p" .string "We simply creamed them when we\n" .string "decided to have just one GYM.$" SaffronCity_Gym_Text_PrestonIntro:: .string "SAFFRON POKéMON GYM is famous for\n" .string "training psychics.\p" .string "You want to see SABRINA, don't\n" .string "you? I can tell!$" SaffronCity_Gym_Text_PrestonDefeat:: .string "Arrrgh!$" SaffronCity_Gym_Text_PrestonPostBattle:: .string "That's right! I used telepathy to\n" .string "read your mind!$" SaffronCity_Gym_Text_GymGuyAdvice:: .string "Yo!\n" .string "Champ in the making!\p" .string "SABRINA's POKéMON use psychic\n" .string "power instead of force.\p" .string "FIGHTING POKéMON are especially\n" .string "weak against PSYCHIC POKéMON.\p" .string "They'll get destroyed before they\n" .string "can even aim a punch!$" SaffronCity_Gym_Text_GymGuyPostVictory:: .string "Psychic power, huh?\p" .string "If I had that, I'd make a bundle\n" .string "at the slots!$" SaffronCity_Gym_Text_GymStatue:: .string "SAFFRON POKéMON GYM\n" .string "LEADER: SABRINA\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}$" SaffronCity_Gym_Text_GymStatuePlayerWon:: .string "SAFFRON POKéMON GYM\n" .string "LEADER: SABRINA\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}, {PLAYER}$" ================================================ FILE: data/maps/SaffronCity_House/map.json ================================================ { "id": "MAP_SAFFRON_CITY_HOUSE", "name": "SaffronCity_House", "layout": "LAYOUT_HOUSE5", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PIDGEY", "x": 0, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_House_EventScript_Pidgey", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_House_EventScript_Lass", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_House_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLIPBOARD", "x": 5, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "4" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "4" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "4" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 5, "y": 4, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SaffronCity_House_EventScript_Letter" } ], "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity_House/scripts.inc ================================================ SaffronCity_House_MapScripts:: .byte 0 SaffronCity_House_EventScript_Lass:: msgbox SaffronCity_House_Text_DontLookAtMyLetter, MSGBOX_NPC end SaffronCity_House_EventScript_Youngster:: msgbox SaffronCity_House_Text_GettingCopycatPokeDoll, MSGBOX_NPC end SaffronCity_House_EventScript_Pidgey:: lock faceplayer waitse playmoncry SPECIES_PIDGEY, CRY_MODE_NORMAL msgbox SaffronCity_House_Text_Pidgey waitmoncry release end SaffronCity_House_EventScript_Letter:: msgbox SaffronCity_House_Text_ExplainPPUp, MSGBOX_SIGN end ================================================ FILE: data/maps/SaffronCity_House/text.inc ================================================ SaffronCity_House_Text_DontLookAtMyLetter:: .string "…Thank you for writing.\n" .string "I hope to see you soon!\p" .string "…Hey!\n" .string "Don't look at my letter!$" SaffronCity_House_Text_Pidgey:: .string "PIDGEY: Kurukkoo!$" SaffronCity_House_Text_GettingCopycatPokeDoll:: .string "The COPYCAT is cute!\n" .string "I'm getting her a POKé DOLL.$" SaffronCity_House_Text_ExplainPPUp:: .string "I was given a PP UP as a gift.\p" .string "It's used to increase the PP of\n" .string "a POKéMON's move.\p" .string "I should use it on a powerful move\n" .string "with only a few PP.$" ================================================ FILE: data/maps/SaffronCity_Mart/map.json ================================================ { "id": "MAP_SAFFRON_CITY_MART", "name": "SaffronCity_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "x": 1, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_Mart_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 9, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_Mart_EventScript_Lass", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "5" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "5" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "5" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity_Mart/scripts.inc ================================================ SaffronCity_Mart_MapScripts:: .byte 0 SaffronCity_Mart_EventScript_Lass:: msgbox SaffronCity_Mart_Text_ReviveIsCostly, MSGBOX_NPC end SaffronCity_Mart_EventScript_Youngster:: msgbox SaffronCity_Mart_Text_MaxRepelMoreEffectiveThanSuper, MSGBOX_NPC end SaffronCity_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart SaffronCity_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 SaffronCity_Mart_Items:: .2byte ITEM_GREAT_BALL .2byte ITEM_HYPER_POTION .2byte ITEM_REVIVE .2byte ITEM_FULL_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_MAX_REPEL .2byte ITEM_NONE release end ================================================ FILE: data/maps/SaffronCity_Mart/text.inc ================================================ SaffronCity_Mart_Text_MaxRepelMoreEffectiveThanSuper:: .string "MAX REPEL keeps weaker POKéMON\n" .string "from appearing.\p" .string "MAX REPEL stays effective longer\n" .string "than SUPER REPEL.$" SaffronCity_Mart_Text_ReviveIsCostly:: .string "REVIVE is costly, but it revives\n" .string "fainted POKéMON!$" ================================================ FILE: data/maps/SaffronCity_MrPsychicsHouse/map.json ================================================ { "id": "MAP_SAFFRON_CITY_MR_PSYCHICS_HOUSE", "name": "SaffronCity_MrPsychicsHouse", "layout": "LAYOUT_HOUSE5", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_MrPsychicsHouse_EventScript_MrPsychic", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Kadabra", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "7" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "7" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "7" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity_MrPsychicsHouse/scripts.inc ================================================ .set LOCALID_KADABRA_MASTER, 2 .set TRAINER, VAR_0x8009 SaffronCity_MrPsychicsHouse_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_MrPsychicsHouse_MapScript_SetMasterTrainerMovementTypes .byte 0 SaffronCity_MrPsychicsHouse_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_KADABRA callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SaffronCity_MrPsychicsHouse_MapScript_KadabraMasterMovementType end SaffronCity_MrPsychicsHouse_MapScript_KadabraMasterMovementType:: setobjectmovementtype LOCALID_KADABRA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SaffronCity_MrPsychicsHouse_EventScript_MrPsychic:: lock faceplayer goto_if_set FLAG_GOT_TM29_FROM_MR_PSYCHIC, SaffronCity_MrPsychicsHouse_EventScript_AlreadyGotTM29 msgbox SaffronCity_MrPsychicsHouse_Text_YouWantedThis checkitemspace ITEM_TM29 goto_if_eq VAR_RESULT, FALSE, SaffronCity_MrPsychicsHouse_EventScript_NoRoomForTM29 giveitem_msg SaffronCity_MrPsychicsHouse_Text_ReceivedTM29FromMrPsychic, ITEM_TM29 msgbox SaffronCity_MrPsychicsHouse_Text_ExplainTM29 setflag FLAG_GOT_TM29_FROM_MR_PSYCHIC release end SaffronCity_MrPsychicsHouse_EventScript_NoRoomForTM29:: msgbox SaffronCity_MrPsychicsHouse_Text_YouveNoRoom release end SaffronCity_MrPsychicsHouse_EventScript_AlreadyGotTM29:: msgbox SaffronCity_MrPsychicsHouse_Text_ExplainTM29 release end ================================================ FILE: data/maps/SaffronCity_MrPsychicsHouse/text.inc ================================================ SaffronCity_MrPsychicsHouse_Text_YouWantedThis:: .string "…Wait! Don't say a word!\p" .string "You wanted this!$" SaffronCity_MrPsychicsHouse_Text_ReceivedTM29FromMrPsychic:: .string "{PLAYER} received TM29\n" .string "from MR. PSYCHIC.$" SaffronCity_MrPsychicsHouse_Text_ExplainTM29:: .string "You already know, don't you?\n" .string "TM29 is PSYCHIC.\p" .string "It's an attack that may also lower\n" .string "the target's special stats.$" SaffronCity_MrPsychicsHouse_Text_YouveNoRoom:: .string "Where do you plan to put this?\n" .string "You've no room.$" ================================================ FILE: data/maps/SaffronCity_PokemonCenter_1F/map.json ================================================ { "id": "MAP_SAFFRON_CITY_POKEMON_CENTER_1F", "name": "SaffronCity_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonCenter_1F_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 2, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonCenter_1F_EventScript_PokemonJournalSabrina", "flag": "FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 3, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonCenter_1F_EventScript_PokemonJournalSabrina", "flag": "FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "6" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "6" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "6" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_SAFFRON_CITY_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity_PokemonCenter_1F/scripts.inc ================================================ SaffronCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 SaffronCity_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_SAFFRON_CITY end SaffronCity_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end SaffronCity_PokemonCenter_1F_EventScript_Gentleman:: msgbox SaffronCity_PokemonCenter_1F_Text_SilphCoVictimOfFame, MSGBOX_NPC end SaffronCity_PokemonCenter_1F_EventScript_Woman:: msgbox SaffronCity_PokemonCenter_1F_Text_GrowthRatesDifferBySpecies, MSGBOX_NPC end SaffronCity_PokemonCenter_1F_EventScript_Youngster:: lock faceplayer goto_if_eq VAR_MAP_SCENE_SILPH_CO_11F, 1, SaffronCity_PokemonCenter_1F_EventScript_YoungsterRocketsGone msgbox SaffronCity_PokemonCenter_1F_Text_GreatIfEliteFourCameBeatRockets release end SaffronCity_PokemonCenter_1F_EventScript_YoungsterRocketsGone:: msgbox SaffronCity_PokemonCenter_1F_Text_TeamRocketTookOff release end ================================================ FILE: data/maps/SaffronCity_PokemonCenter_1F/text.inc ================================================ SaffronCity_PokemonCenter_1F_Text_GrowthRatesDifferBySpecies:: .string "POKéMON growth rates differ from\n" .string "species to species.$" SaffronCity_PokemonCenter_1F_Text_SilphCoVictimOfFame:: .string "SILPH CO. is widely known to all.\p" .string "It's a victim of its own fame - it\n" .string "attracted TEAM ROCKET.$" SaffronCity_PokemonCenter_1F_Text_GreatIfEliteFourCameBeatRockets:: .string "Sigh…\n" .string "Wouldn't this be great?\p" .string "If the ELITE FOUR came and\n" .string "stomped TEAM ROCKET?$" SaffronCity_PokemonCenter_1F_Text_TeamRocketTookOff:: .string "TEAM ROCKET took off!\n" .string "We can go out safely again!\l" .string "That's great!$" ================================================ FILE: data/maps/SaffronCity_PokemonCenter_2F/map.json ================================================ { "id": "MAP_SAFFRON_CITY_POKEMON_CENTER_2F", "name": "SaffronCity_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_SAFFRON_CITY_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity_PokemonCenter_2F/scripts.inc ================================================ SaffronCity_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS SaffronCity_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end SaffronCity_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end SaffronCity_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/SaffronCity_PokemonTrainerFanClub/map.json ================================================ { "id": "MAP_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB", "name": "SaffronCity_PokemonTrainerFanClub", "layout": "LAYOUT_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_SAFFRON_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 7, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 6, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 3, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 3, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 9, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_Woman", "flag": "FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKER", "in_connection": false, "x": 7, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_Rocker", "flag": "FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 9, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_Beauty", "flag": "FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 5, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_BlackBelt", "flag": "FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 2, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_PokemonJournalBruno", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 3, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SaffronCity_PokemonTrainerFanClub_EventScript_PokemonJournalBruno", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" } ], "warp_events": [ { "x": 5, "y": 15, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "14" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SaffronCity_PokemonTrainerFanClub/scripts.inc ================================================ .set LOCALID_BATTLE_GIRL, 1 .set LOCALID_LITTLE_GIRL, 2 .set LOCALID_YOUNGSTER, 3 .set LOCALID_GENTLEMAN, 4 .set LOCALID_WOMAN, 5 .set LOCALID_ROCKER, 6 .set LOCALID_BEAUTY, 7 .set LOCALID_BLACK_BELT, 8 SaffronCity_PokemonTrainerFanClub_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, SaffronCity_PokemonTrainerFanClub_OnFrame map_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_PokemonTrainerFanClub_OnTransition .byte 0 SaffronCity_PokemonTrainerFanClub_OnFrame:: map_script_2 VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 1, SaffronCity_PokemonTrainerFanClub_EventScript_MeetFirstFans .2byte 0 SaffronCity_PokemonTrainerFanClub_EventScript_MeetFirstFans:: lockall textcolor NPC_TEXT_COLOR_FEMALE applymovement LOCALID_BATTLE_GIRL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN applymovement LOCALID_BATTLE_GIRL, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_BATTLE_GIRL, Common_Movement_Delay48 waitmovement 0 msgbox SaffronCity_PokemonTrainerFanClub_Text_HuhYou closemessage applymovement LOCALID_BATTLE_GIRL, SaffronCity_PokemonTrainerFanClub_Movement_FanApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox SaffronCity_PokemonTrainerFanClub_Text_YourePlayerWereYourFansNow setvar VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 2 releaseall end SaffronCity_PokemonTrainerFanClub_Movement_FanApproachPlayer:: delay_16 delay_8 walk_down delay_16 walk_down delay_8 walk_left step_end @ Unused, leftover from RS LilycoveCity_PokemonTrainerFanClub_Movement_FanApproachPlayer:: delay_8 walk_in_place_faster_down walk_down walk_down walk_down walk_left walk_left step_end @ Unused, leftover from RS LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlWatchPlayer:: walk_fast_left walk_fast_left walk_fast_down walk_fast_down walk_fast_left walk_fast_down step_end @ Unused, leftover from RS LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlMoveCloserToPlayer:: walk_down walk_in_place_faster_right step_end @ Unused, leftover from RS LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlHideFromPlayer:: jump_in_place_right walk_fast_up walk_fast_up walk_fast_right walk_in_place_faster_down step_end SaffronCity_PokemonTrainerFanClub_OnTransition:: goto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 1, SaffronCity_PokemonTrainerFanClub_EventScript_SetMemberPosForFirstMeeting goto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 2, SaffronCity_PokemonTrainerFanClub_EventScript_UpdateFanMemberPositions end SaffronCity_PokemonTrainerFanClub_EventScript_UpdateFanMemberPositions:: special Script_TryLoseFansFromPlayTime setvar VAR_0x8004, FANCLUB_MEMBER1 specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer call_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember1ToFarTable setvar VAR_0x8004, FANCLUB_MEMBER2 specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer call_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember2ToFarTable setvar VAR_0x8004, FANCLUB_MEMBER3 specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer call_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember3ToFarTable setvar VAR_0x8004, FANCLUB_MEMBER4 specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer call_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember4ToFarTable setvar VAR_0x8004, FANCLUB_MEMBER5 specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer call_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember5ToFarTable setvar VAR_0x8004, FANCLUB_MEMBER6 specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer call_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember6ToFarTable setvar VAR_0x8004, FANCLUB_MEMBER7 specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer call_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember7ToFarTable setvar VAR_0x8004, FANCLUB_MEMBER8 specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer call_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember8ToFarTable end SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember1ToFarTable:: setobjectxyperm LOCALID_BATTLE_GIRL, 5, 2 setobjectmovementtype LOCALID_BATTLE_GIRL, MOVEMENT_TYPE_FACE_UP return SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember2ToFarTable:: setobjectxyperm LOCALID_YOUNGSTER, 7, 4 setobjectmovementtype LOCALID_YOUNGSTER, MOVEMENT_TYPE_FACE_LEFT return SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember3ToFarTable:: setobjectxyperm LOCALID_GENTLEMAN, 2, 2 setobjectmovementtype LOCALID_GENTLEMAN, MOVEMENT_TYPE_FACE_UP return SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember4ToFarTable:: setobjectxyperm LOCALID_LITTLE_GIRL, 3, 4 setobjectmovementtype LOCALID_LITTLE_GIRL, MOVEMENT_TYPE_FACE_RIGHT return SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember5ToFarTable:: setobjectxyperm LOCALID_ROCKER, 4, 6 setobjectmovementtype LOCALID_ROCKER, MOVEMENT_TYPE_FACE_UP return SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember6ToFarTable:: setobjectxyperm LOCALID_WOMAN, 10, 3 setobjectmovementtype LOCALID_WOMAN, MOVEMENT_TYPE_FACE_UP return SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember7ToFarTable:: setobjectxyperm LOCALID_BEAUTY, 7, 5 setobjectmovementtype LOCALID_BEAUTY, MOVEMENT_TYPE_FACE_LEFT return SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember8ToFarTable:: setobjectxyperm LOCALID_BLACK_BELT, 9, 6 setobjectmovementtype LOCALID_BLACK_BELT, MOVEMENT_TYPE_FACE_LEFT return SaffronCity_PokemonTrainerFanClub_EventScript_SetMemberPosForFirstMeeting:: call SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember4ToFarTable call SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember5ToFarTable call SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember6ToFarTable call SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember7ToFarTable call SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember8ToFarTable end SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirl:: lock faceplayer setvar VAR_0x8004, FANCLUB_MEMBER1 special Script_BufferFanClubTrainerName goto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 0, SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlPlayerNotChampion specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer goto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlPlayersFan specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlOnlyNonFan msgbox SaffronCity_PokemonTrainerFanClub_Text_WasYourFanNotAnymore release end SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlPlayersFan:: specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlOnlyFan msgbox SaffronCity_PokemonTrainerFanClub_Text_AlwaysCheerForYou release end SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlOnlyFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_IllAlwaysBelieveInYou release end SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlOnlyNonFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_EveryonesYourFanButICantBe release end SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlPlayerNotChampion:: msgbox SaffronCity_PokemonTrainerFanClub_Text_TrainersCoolWhenBattling release end SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirl:: lock faceplayer setvar VAR_0x8004, FANCLUB_MEMBER4 special Script_BufferFanClubTrainerName goto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 0, SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlPlayerNotChampion specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer goto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlPlayersFan specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlOnlyNonFan msgbox SaffronCity_PokemonTrainerFanClub_Text_WantToBeLikeSabrina release end SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlPlayersFan:: specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlOnlyFan msgbox SaffronCity_PokemonTrainerFanClub_Text_WantToBeLikeYouOneDay release end SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlOnlyFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_EveryoneButMeStoppedBeingYourFan release end SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlOnlyNonFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_WontStopBeingSabrinasFan release end SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlPlayerNotChampion:: msgbox SaffronCity_PokemonTrainerFanClub_Text_CanIBecomeCoolTrainerOneDay release end SaffronCity_PokemonTrainerFanClub_EventScript_Youngster:: lock faceplayer setvar VAR_0x8004, FANCLUB_MEMBER2 special Script_BufferFanClubTrainerName goto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 0, SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterPlayerNotChampion specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer goto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterPlayersFan specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterOnlyNonFan msgbox SaffronCity_PokemonTrainerFanClub_Text_BrocksMyHero release end SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterPlayersFan:: specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterOnlyFan msgbox SaffronCity_PokemonTrainerFanClub_Text_CanYouAutographShorts release end SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterOnlyFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_CountingOnYou release end SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterOnlyNonFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_BrocksFanToBitterEnd release end SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterPlayerNotChampion:: msgbox SaffronCity_PokemonTrainerFanClub_Text_BrocksLastWordOnCool release end SaffronCity_PokemonTrainerFanClub_EventScript_Gentleman:: lock faceplayer setvar VAR_0x8004, FANCLUB_MEMBER3 special Script_BufferFanClubTrainerName goto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 0, SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanPlayerNotChampion specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer goto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanPlayersFan specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanOnlyNonFan msgbox SaffronCity_PokemonTrainerFanClub_Text_HmmAndYouAre release end SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanPlayersFan:: specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanOnlyFan msgbox SaffronCity_PokemonTrainerFanClub_Text_HadPleasureOfWatchingYouBattle release end SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanOnlyFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_NeverSeenTrainerOfYourMagnificence release end SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanOnlyNonFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_YouveStillAWaysToGo release end SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanPlayerNotChampion:: msgbox SaffronCity_PokemonTrainerFanClub_Text_YoullBeTalkedAboutIfYouKeepWinning release end SaffronCity_PokemonTrainerFanClub_EventScript_Woman:: lock faceplayer setvar VAR_0x8004, FANCLUB_MEMBER6 special Script_BufferFanClubTrainerName specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer goto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_WomanPlayersFan specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_WomanOnlyNonFan msgbox SaffronCity_PokemonTrainerFanClub_Text_TrainerHasBeenOnFire release end SaffronCity_PokemonTrainerFanClub_EventScript_WomanPlayersFan:: specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_WomanOnlyFan msgbox SaffronCity_PokemonTrainerFanClub_Text_AdoreWayYouBattle release end SaffronCity_PokemonTrainerFanClub_EventScript_WomanOnlyFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_ImYourNumberOneFan release end SaffronCity_PokemonTrainerFanClub_EventScript_WomanOnlyNonFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_EveryoneTalksAboutYou release end SaffronCity_PokemonTrainerFanClub_EventScript_Rocker:: lock faceplayer setvar VAR_0x8004, FANCLUB_MEMBER5 special Script_BufferFanClubTrainerName specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer goto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_RockerPlayersFan specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_RockerOnlyNonFan msgbox SaffronCity_PokemonTrainerFanClub_Text_LoveWayTrainerTalks release end SaffronCity_PokemonTrainerFanClub_EventScript_RockerPlayersFan:: specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_RockerOnlyFan msgbox SaffronCity_PokemonTrainerFanClub_Text_TheWayYouBattleIsCool release end SaffronCity_PokemonTrainerFanClub_EventScript_RockerOnlyFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_ImOnlyOneLeftOfYourFans release end SaffronCity_PokemonTrainerFanClub_EventScript_RockerOnlyNonFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_ImLoneTrainerFan release end SaffronCity_PokemonTrainerFanClub_EventScript_Beauty:: lock faceplayer setvar VAR_0x8004, FANCLUB_MEMBER7 special Script_BufferFanClubTrainerName specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer goto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_BeautyPlayersFan specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_BeautyOnlyNonFan msgbox SaffronCity_PokemonTrainerFanClub_Text_WhyCantOthersSeeMastersDignity release end SaffronCity_PokemonTrainerFanClub_EventScript_BeautyPlayersFan:: specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_BeautyOnlyFan msgbox SaffronCity_PokemonTrainerFanClub_Text_YouReallyAreAmazing release end SaffronCity_PokemonTrainerFanClub_EventScript_BeautyOnlyFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_ImYourOnlyFan release end SaffronCity_PokemonTrainerFanClub_EventScript_BeautyOnlyNonFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_BelieveInMasterWithAllMyHeart release end SaffronCity_PokemonTrainerFanClub_EventScript_BlackBelt:: lock faceplayer setvar VAR_0x8004, FANCLUB_MEMBER8 special Script_BufferFanClubTrainerName specialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer goto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltPlayersFan specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltOnlyNonFan msgbox SaffronCity_PokemonTrainerFanClub_Text_OnlyMasterHasMyRespect release end SaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltPlayersFan:: specialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub goto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltOnlyFan msgbox SaffronCity_PokemonTrainerFanClub_Text_YourBattleStyleIsEducational release end SaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltOnlyFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_WontStopBeingYourFan release end SaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltOnlyNonFan:: msgbox SaffronCity_PokemonTrainerFanClub_Text_NeverBeFanOfAnyoneButMaster release end ================================================ FILE: data/maps/SaffronCity_PokemonTrainerFanClub/text.inc ================================================ SaffronCity_PokemonTrainerFanClub_Text_HuhYou:: .string "Huh?\n" .string "You…$" SaffronCity_PokemonTrainerFanClub_Text_YourePlayerWereYourFansNow:: .string "Are you maybe…\n" .string "… …\p" .string "You are!\n" .string "You are {PLAYER}!\p" .string "We were just talking about you!\p" .string "We were talking about how an\n" .string "incredibly good TRAINER appeared.\p" .string "And that someone is you!\n" .string "You're so cool!\p" .string "So, we decided that we'll become\n" .string "your FAN CLUB!\p" .string "We all hope you'll keep battling\n" .string "and show us how cool you are.\p" .string "That way, maybe other people will\n" .string "become fans just like me.$" SaffronCity_PokemonTrainerFanClub_Text_AlwaysCheerForYou:: .string "I'll always be cheering for you!\p" .string "Go, {PLAYER}, go!$" SaffronCity_PokemonTrainerFanClub_Text_IllAlwaysBelieveInYou:: .string "I'll always believe in you,\n" .string "{PLAYER}.\p" .string "Please show the others what you're\n" .string "like when you battle seriously.$" SaffronCity_PokemonTrainerFanClub_Text_WasYourFanNotAnymore:: .string "I'm sorry.\n" .string "I was your fan before.\p" .string "But now, you seem to have lost\n" .string "the drive you had before.\p" .string "Lately, I think {STR_VAR_1} has been\n" .string "a lot cooler.$" SaffronCity_PokemonTrainerFanClub_Text_EveryonesYourFanButICantBe:: .string "Oh!\n" .string "{PLAYER}!\p" .string "Everyone's been all excited about\n" .string "you recently.\p" .string "I can understand why.\n" .string "I know that you're strong.\p" .string "But, do you know what?\p" .string "Once I became {STR_VAR_1}'s fan,\n" .string "I can't just stop being a fan.$" SaffronCity_PokemonTrainerFanClub_Text_TrainersCoolWhenBattling:: .string "I think TRAINERS are so cool when\n" .string "they're battling.\p" .string "Don't you think so, too?$" SaffronCity_PokemonTrainerFanClub_Text_CanYouAutographShorts:: .string "Oh! It's {PLAYER}!\n" .string "Too cool!\p" .string "Oh!\n" .string "Oh, yeah!\p" .string "Can you autograph something?\n" .string "How about my shorts?$" SaffronCity_PokemonTrainerFanClub_Text_CountingOnYou:: .string "However hot it's been…\p" .string "And however cold it may get…\p" .string "I've always believed in, and worn,\n" .string "shorts!\p" .string "I'm counting on you to keep\n" .string "winning!\p" .string "I believe in you just as much as\n" .string "I believe in shorts!$" SaffronCity_PokemonTrainerFanClub_Text_BrocksMyHero:: .string "BROCK's my hero!\n" .string "He's a man among men!\p" .string "Heheh, I got my mom to do\n" .string "something for me.\p" .string "I got her to embroider “BROCK”\n" .string "on my shorts!$" SaffronCity_PokemonTrainerFanClub_Text_BrocksFanToBitterEnd:: .string "… …\p" .string "… …\n" .string "I'm BROCK's fan!\p" .string "Even if I were his only fan,\n" .string "I swear it on my rock-hard will,\l" .string "and on my shorts!\p" .string "I'll be his fan to the bitter end!$" SaffronCity_PokemonTrainerFanClub_Text_BrocksLastWordOnCool:: .string "BROCK's the last word on cool,\n" .string "end of story!\p" .string "Now there's a guy who I want to\n" .string "be like!$" SaffronCity_PokemonTrainerFanClub_Text_HadPleasureOfWatchingYouBattle:: .string "{PLAYER}, I've had the pleasure of\n" .string "watching you battle.\p" .string "It brings back sweet memories of\n" .string "my own long-lost youth.\p" .string "May you continue to find success.\n" .string "You have a fan in me!$" SaffronCity_PokemonTrainerFanClub_Text_NeverSeenTrainerOfYourMagnificence:: .string "I have journeyed far and wide\n" .string "across the lands.\p" .string "But never have I seen a TRAINER\n" .string "of your magnificence.\p" .string "Take courage in your abilities\n" .string "and keep battling on!\p" .string "Make that a promise to me,\n" .string "my young idol!$" SaffronCity_PokemonTrainerFanClub_Text_HmmAndYouAre:: .string "Hmm…\n" .string "And you are?\p" .string "Were you hoping to sign up for\n" .string "a membership in our FAN CLUB?$" SaffronCity_PokemonTrainerFanClub_Text_YouveStillAWaysToGo:: .string "Ah, so you are the much-\n" .string "talked-about {PLAYER}.\p" .string "You certainly do have the look of\n" .string "a winner.\p" .string "But for me to accept you as\n" .string "a true POKéMON great…\p" .string "… …\p" .string "You've still a ways to go!$" SaffronCity_PokemonTrainerFanClub_Text_YoullBeTalkedAboutIfYouKeepWinning:: .string "All of us gathered here are fans\n" .string "of POKéMON TRAINERS.\p" .string "The way they look in battle…\n" .string "They are the picture of coolness.\p" .string "Perhaps you will be talked about\n" .string "here, too, if you keep winning.$" SaffronCity_PokemonTrainerFanClub_Text_WantToBeLikeYouOneDay:: .string "It's {PLAYER}!\n" .string "It's {PLAYER}!\p" .string "I want to be like {PLAYER} one day!$" SaffronCity_PokemonTrainerFanClub_Text_EveryoneButMeStoppedBeingYourFan:: .string "Everyone stopped being {PLAYER}'s\n" .string "fan…\p" .string "But that means I can have {PLAYER}\n" .string "all to myself!\p" .string "Yay! Go for it!\n" .string "My one and only {PLAYER}!$" SaffronCity_PokemonTrainerFanClub_Text_WantToBeLikeSabrina:: .string "Do you know what?\n" .string "I want to be like SABRINA!\p" .string "I want to be a psychic girl just\n" .string "like her!$" SaffronCity_PokemonTrainerFanClub_Text_WontStopBeingSabrinasFan:: .string "Even if I'm the only one, I won't\n" .string "stop being SABRINA's fan.\p" .string "My dream is to be like SABRINA,\n" .string "cute, but cool.\p" .string "I want to be a psychic girl just\n" .string "like her!$" SaffronCity_PokemonTrainerFanClub_Text_CanIBecomeCoolTrainerOneDay:: .string "I wonder if I can become a cool\n" .string "TRAINER one day?$" SaffronCity_PokemonTrainerFanClub_Text_TheWayYouBattleIsCool:: .string "Oh, man, oh, man!\n" .string "Cool! Too cool!\p" .string "…Huh?\n" .string "No, not you.\p" .string "Just the way you battle.\n" .string "That's cool.$" SaffronCity_PokemonTrainerFanClub_Text_ImOnlyOneLeftOfYourFans:: .string "Yo, {PLAYER}!\p" .string "Looks like I'm the only one left\n" .string "out of your fans.\p" .string "But, you know, I like being an only\n" .string "fan… It's less stressful.\p" .string "Keep up and at it!$" SaffronCity_PokemonTrainerFanClub_Text_LoveWayTrainerTalks:: .string "{STR_VAR_1}'s cool, huh?\n" .string "I love the way he talks.\p" .string "I'd really relish a chance to meet\n" .string "him in person once.$" SaffronCity_PokemonTrainerFanClub_Text_ImLoneTrainerFan:: .string "Huh, can you believe it?\n" .string "Everyone turned into your fans.\p" .string "So after all we've been through,\n" .string "I'm the lone {STR_VAR_1} fan?\p" .string "Eh, being the one and only\n" .string "{STR_VAR_1} fan's my style, anyway.$" SaffronCity_PokemonTrainerFanClub_Text_AdoreWayYouBattle:: .string "Oh, my goodness!\n" .string "Is it really you, {PLAYER}?\p" .string "I have to tell you, I adore the\n" .string "way you battle.\p" .string "I hope you'll keep at it.\n" .string "I'll be your number one fan!$" SaffronCity_PokemonTrainerFanClub_Text_ImYourNumberOneFan:: .string "Oh, my goodness!\n" .string "If it isn't {PLAYER}!\p" .string "It's so disappointing… I realized\n" .string "I'm your number-one-and-only fan!\p" .string "Well, it can't be helped!\n" .string "Let me cheer you on, at least!\p" .string "Hurray, hurray, {PLAYER}!$" SaffronCity_PokemonTrainerFanClub_Text_TrainerHasBeenOnFire:: .string "Recently, {STR_VAR_1} has been on\n" .string "fire.\p" .string "The way he battles… It's just \n" .string "the way that I like it!$" SaffronCity_PokemonTrainerFanClub_Text_EveryoneTalksAboutYou:: .string "Oh, hello!\n" .string "If it isn't {PLAYER}!\p" .string "Lately, all everyone talks about\n" .string "is you.\p" .string "I'm feeling lonesome because I\n" .string "prefer {STR_VAR_1}.$" SaffronCity_PokemonTrainerFanClub_Text_YouReallyAreAmazing:: .string "Amazing!\n" .string "{PLAYER}, you really are amazing!\p" .string "Instead of just watching, maybe\n" .string "I should become a TRAINER, too.$" SaffronCity_PokemonTrainerFanClub_Text_ImYourOnlyFan:: .string "I'm your only fan…\n" .string "Sigh… This is lonely…\p" .string "Can't you try harder and make the\n" .string "others take notice of you?$" SaffronCity_PokemonTrainerFanClub_Text_WhyCantOthersSeeMastersDignity:: .string "Master {STR_VAR_1} is so dignified…\n" .string "He is so my type.\p" .string "Why can't the others see the\n" .string "dignity he simply oozes?$" SaffronCity_PokemonTrainerFanClub_Text_BelieveInMasterWithAllMyHeart:: .string "I believe in Master {STR_VAR_1}\n" .string "with all my heart.\p" .string "Even if I am the only one to\n" .string "believe in him.\p" .string "I won't ever feel lonesome, though.\p" .string "Not if I keep thinking about Master\n" .string "{STR_VAR_1}.$" SaffronCity_PokemonTrainerFanClub_Text_YourBattleStyleIsEducational:: .string "Hiyah!\p" .string "Your battling style is most\n" .string "educational.\p" .string "I hope that you will keep plugging\n" .string "away at success, hiyah!$" SaffronCity_PokemonTrainerFanClub_Text_WontStopBeingYourFan:: .string "Instead of just watching others\n" .string "battle, battle yourself!\p" .string "…My DOJO's MASTER chewed me out\n" .string "like that…\p" .string "But I won't let that stop me from\n" .string "being your fan!\p" .string "I can't stop being your fan!$" SaffronCity_PokemonTrainerFanClub_Text_OnlyMasterHasMyRespect:: .string "Hiyah! There is but one TRAINER\n" .string "who has my respect.\p" .string "And that is none other than my\n" .string "MASTER at the FIGHTING DOJO.\p" .string "You should become a fan of my\n" .string "MASTER like me! Hiyah!$" SaffronCity_PokemonTrainerFanClub_Text_NeverBeFanOfAnyoneButMaster:: .string "Hiyah! I respect my MASTER at the\n" .string "FIGHTING DOJO.\p" .string "I will never become a fan of\n" .string "anyone other than my MASTER!\p" .string "I will even sneak out of the DOJO\n" .string "to spread word of his greatness.\p" .string "Hiyah!$" ================================================ FILE: data/maps/SeafoamIslands_1F/map.json ================================================ { "id": "MAP_SEAFOAM_ISLANDS_1F", "name": "SeafoamIslands_1F", "layout": "LAYOUT_SEAFOAM_ISLANDS_1F", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_SEAFOAM_ISLANDS", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 22, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "FLAG_HIDE_SEAFOAM_B1F_BOULDER_1", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_1F_BOULDER_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 32, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "FLAG_HIDE_SEAFOAM_B1F_BOULDER_2", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_1F_BOULDER_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 11, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SeafoamIslands_1F_EventScript_ItemIceHeal", "flag": "FLAG_HIDE_SEAFOAM_ISLANDS_1F_ICE_HEAL" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BEAUTY", "in_connection": false, "x": 27, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Seel", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 10, "y": 6, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "0" }, { "x": 31, "y": 4, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "1" }, { "x": 28, "y": 19, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "2" }, { "x": 6, "y": 21, "elevation": 3, "dest_map": "MAP_ROUTE20", "dest_warp_id": "0" }, { "x": 32, "y": 21, "elevation": 3, "dest_map": "MAP_ROUTE20", "dest_warp_id": "1" }, { "x": 21, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "9" }, { "x": 30, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "10" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SeafoamIslands_1F/scripts.inc ================================================ .set LOCALID_SEEL_MASTER, 4 .set TRAINER, VAR_0x8009 SeafoamIslands_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SeafoamIslands_1F_OnTransition .byte 0 SeafoamIslands_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F goto SeafoamIslands_1F_MapScript_SetMasterTrainerMovementTypes end SeafoamIslands_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_SEEL callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SeafoamIslands_1F_MapScript_SeelMasterMovementType end SeafoamIslands_1F_MapScript_SeelMasterMovementType:: setobjectmovementtype LOCALID_SEEL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ================================================ FILE: data/maps/SeafoamIslands_B1F/map.json ================================================ { "id": "MAP_SEAFOAM_ISLANDS_B1F", "name": "SeafoamIslands_B1F", "layout": "LAYOUT_SEAFOAM_ISLANDS_B1F", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_SEAFOAM_ISLANDS", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 22, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "FLAG_HIDE_SEAFOAM_B2F_BOULDER_1", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_B1F_BOULDER_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 30, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "FLAG_HIDE_SEAFOAM_B2F_BOULDER_2", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_B1F_BOULDER_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 19, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SeafoamIslands_B1F_EventScript_ItemWaterStone", "flag": "FLAG_HIDE_SEAFOAM_ISLANDS_B1F_WATER_STONE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 24, "y": 14, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SeafoamIslands_B1F_EventScript_ItemRevive", "flag": "FLAG_HIDE_SEAFOAM_ISLANDS_B1F_REVIVE" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BEAUTY", "in_connection": false, "x": 20, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Dewgong", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 10, "y": 6, "elevation": 4, "dest_map": "MAP_SEAFOAM_ISLANDS_1F", "dest_warp_id": "0" }, { "x": 31, "y": 4, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_1F", "dest_warp_id": "1" }, { "x": 28, "y": 19, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_1F", "dest_warp_id": "2" }, { "x": 7, "y": 3, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "3" }, { "x": 17, "y": 9, "elevation": 4, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "4" }, { "x": 25, "y": 19, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "5" }, { "x": 32, "y": 14, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "6" }, { "x": 23, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "7" }, { "x": 28, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "8" }, { "x": 21, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_1F", "dest_warp_id": "5" }, { "x": 29, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_1F", "dest_warp_id": "6" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/SeafoamIslands_B1F/scripts.inc ================================================ .set LOCALID_DEWGONG_MASTER, 5 .set TRAINER, VAR_0x8009 SeafoamIslands_B1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SeafoamIslands_B1F_MapScript_SetMasterTrainerMovementTypes .byte 0 SeafoamIslands_B1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_DEWGONG callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SeafoamIslands_B1F_MapScript_DewgongMasterMovementType end SeafoamIslands_B1F_MapScript_DewgongMasterMovementType:: setobjectmovementtype LOCALID_DEWGONG_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ================================================ FILE: data/maps/SeafoamIslands_B2F/map.json ================================================ { "id": "MAP_SEAFOAM_ISLANDS_B2F", "name": "SeafoamIslands_B2F", "layout": "LAYOUT_SEAFOAM_ISLANDS_B2F", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_SEAFOAM_ISLANDS", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 22, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "FLAG_HIDE_SEAFOAM_B3F_BOULDER_1", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_B2F_BOULDER_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 30, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "FLAG_HIDE_SEAFOAM_B3F_BOULDER_2", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_B2F_BOULDER_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 18, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SeafoamIslands_B2F_EventScript_ItemBigPearl", "flag": "FLAG_HIDE_SEAFOAM_ISLANDS_B2F_BIG_PEARL" } ], "warp_events": [ { "x": 7, "y": 17, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B3F", "dest_warp_id": "0" }, { "x": 32, "y": 4, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B3F", "dest_warp_id": "1" }, { "x": 31, "y": 17, "elevation": 4, "dest_map": "MAP_SEAFOAM_ISLANDS_B3F", "dest_warp_id": "2" }, { "x": 7, "y": 4, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "3" }, { "x": 17, "y": 9, "elevation": 4, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "4" }, { "x": 25, "y": 19, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "5" }, { "x": 32, "y": 14, "elevation": 4, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "6" }, { "x": 22, "y": 7, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "7" }, { "x": 29, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B1F", "dest_warp_id": "8" }, { "x": 24, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B3F", "dest_warp_id": "5" }, { "x": 27, "y": 8, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B3F", "dest_warp_id": "6" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/SeafoamIslands_B2F/scripts.inc ================================================ SeafoamIslands_B2F_MapScripts:: .byte 0 ================================================ FILE: data/maps/SeafoamIslands_B3F/map.json ================================================ { "id": "MAP_SEAFOAM_ISLANDS_B3F", "name": "SeafoamIslands_B3F", "layout": "LAYOUT_SEAFOAM_ISLANDS_B3F", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_SEAFOAM_ISLANDS", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 23, "y": 8, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SEAFOAM_B3F_BOULDER_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 24, "y": 8, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SEAFOAM_B3F_BOULDER_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 12, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "FLAG_HIDE_SEAFOAM_B4F_BOULDER_2", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_B3F_BOULDER_5" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 13, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_B3F_BOULDER_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 9, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_B3F_BOULDER_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 6, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "FLAG_HIDE_SEAFOAM_B4F_BOULDER_1", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_SEAFOAM_B3F_BOULDER_3" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 23, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Dragonair", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 8, "y": 14, "elevation": 4, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "0" }, { "x": 31, "y": 4, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "1" }, { "x": 31, "y": 16, "elevation": 4, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "2" }, { "x": 12, "y": 9, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B4F", "dest_warp_id": "0" }, { "x": 29, "y": 5, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B4F", "dest_warp_id": "1" }, { "x": 23, "y": 9, "elevation": 1, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "7" }, { "x": 24, "y": 9, "elevation": 1, "dest_map": "MAP_SEAFOAM_ISLANDS_B2F", "dest_warp_id": "8" }, { "x": 6, "y": 18, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B4F", "dest_warp_id": "2" }, { "x": 9, "y": 18, "elevation": 3, "dest_map": "MAP_SEAFOAM_ISLANDS_B4F", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 5, "y": 12, "elevation": 0, "item": "ITEM_NUGGET", "flag": "FLAG_HIDDEN_ITEM_SEAFOAM_ISLANDS_B3F_NUGGET", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/SeafoamIslands_B3F/scripts.inc ================================================ .equ NUM_BOULDERS_PRESENT, VAR_TEMP_2 .set LOCALID_DRAGONAIR_MASTER, 7 .set TRAINER, VAR_0x8009 SeafoamIslands_B3F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SeafoamIslands_B3F_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, SeafoamIslands_B3F_OnFrame .byte 0 SeafoamIslands_B3F_OnTransition:: call_if_unset FLAG_STOPPED_SEAFOAM_B3F_CURRENT, SeafoamIslands_B3F_EventScript_CheckStoppedCurrent call_if_set FLAG_STOPPED_SEAFOAM_B3F_CURRENT, SeafoamIslands_B3F_EventScript_SetNoCurrentLayout goto SeafoamIslands_B3F_MapScript_SetMasterTrainerMovementTypes end SeafoamIslands_B3F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_DRAGONAIR callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SeafoamIslands_B3F_MapScript_DragonairMasterMovementType end SeafoamIslands_B3F_MapScript_DragonairMasterMovementType:: setobjectmovementtype LOCALID_DRAGONAIR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SeafoamIslands_B3F_EventScript_CheckStoppedCurrent:: setvar NUM_BOULDERS_PRESENT, 0 call_if_unset FLAG_HIDE_SEAFOAM_B3F_BOULDER_1, SeafoamIslands_B3F_EventScript_AddBoulderPresent call_if_unset FLAG_HIDE_SEAFOAM_B3F_BOULDER_2, SeafoamIslands_B3F_EventScript_AddBoulderPresent call_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B3F_EventScript_StoppedCurrent return SeafoamIslands_B3F_EventScript_StoppedCurrent:: setflag FLAG_STOPPED_SEAFOAM_B3F_CURRENT return SeafoamIslands_B3F_EventScript_SetNoCurrentLayout:: setmaplayoutindex LAYOUT_SEAFOAM_ISLANDS_B3F_CURRENT_STOPPED return SeafoamIslands_B3F_OnFrame:: map_script_2 VAR_TEMP_1, 1, SeafoamIslands_B3F_EventScript_EnterByFalling .2byte 0 SeafoamIslands_B3F_EventScript_EnterByFalling:: lockall setvar NUM_BOULDERS_PRESENT, 0 call_if_unset FLAG_HIDE_SEAFOAM_B3F_BOULDER_1, SeafoamIslands_B3F_EventScript_AddBoulderPresent call_if_unset FLAG_HIDE_SEAFOAM_B3F_BOULDER_2, SeafoamIslands_B3F_EventScript_AddBoulderPresent goto_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B3F_EventScript_CurrentBlocked getplayerxy VAR_0x8008, VAR_0x8009 call_if_lt VAR_0x8008, 24, SeafoamIslands_B3F_EventScript_RideCurrentFar call_if_ge VAR_0x8008, 24, SeafoamIslands_B3F_EventScript_RideCurrentClose setvar VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F, 1 warp MAP_SEAFOAM_ISLANDS_B4F, 27, 21 waitstate releaseall end SeafoamIslands_B3F_EventScript_AddBoulderPresent:: addvar NUM_BOULDERS_PRESENT, 1 return SeafoamIslands_B3F_EventScript_RideCurrentFar:: applymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B3F_Movement_RideCurrentFar waitmovement 0 return SeafoamIslands_B3F_EventScript_RideCurrentClose:: applymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B3F_Movement_RideCurrentClose waitmovement 0 return SeafoamIslands_B3F_EventScript_CurrentBlocked:: setvar VAR_TEMP_1, 0 releaseall end SeafoamIslands_B3F_Movement_RideCurrentFar:: walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_right walk_fast_right walk_fast_right walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down step_end SeafoamIslands_B3F_Movement_RideCurrentClose:: walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_right walk_fast_right walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down walk_fast_down step_end ================================================ FILE: data/maps/SeafoamIslands_B4F/map.json ================================================ { "id": "MAP_SEAFOAM_ISLANDS_B4F", "name": "SeafoamIslands_B4F", "layout": "LAYOUT_SEAFOAM_ISLANDS_B4F", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_SEAFOAM_ISLANDS", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 8, "y": 18, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SEAFOAM_B4F_BOULDER_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 9, "y": 18, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SEAFOAM_B4F_BOULDER_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ARTICUNO", "in_connection": false, "x": 9, "y": 2, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SeafoamIslands_B4F_EventScript_Articuno", "flag": "FLAG_HIDE_ARTICUNO" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 22, "y": 19, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SeafoamIslands_B4F_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_SEAFOAM_ISLANDS_B4F_ULTRA_BALL" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 11, "y": 7, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Articuno", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 15, "y": 9, "elevation": 4, "dest_map": "MAP_SEAFOAM_ISLANDS_B3F", "dest_warp_id": "3" }, { "x": 32, "y": 5, "elevation": 4, "dest_map": "MAP_SEAFOAM_ISLANDS_B3F", "dest_warp_id": "4" }, { "x": 8, "y": 17, "elevation": 1, "dest_map": "MAP_SEAFOAM_ISLANDS_B3F", "dest_warp_id": "7" }, { "x": 9, "y": 17, "elevation": 1, "dest_map": "MAP_SEAFOAM_ISLANDS_B3F", "dest_warp_id": "8" } ], "coord_events": [ { "type": "trigger", "x": 26, "y": 19, "elevation": 1, "var": "VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F", "var_value": "0", "script": "SeafoamIslands_B4F_EventScript_UpwardCurrent" }, { "type": "trigger", "x": 27, "y": 19, "elevation": 1, "var": "VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F", "var_value": "0", "script": "SeafoamIslands_B4F_EventScript_UpwardCurrent" }, { "type": "trigger", "x": 28, "y": 19, "elevation": 1, "var": "VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F", "var_value": "0", "script": "SeafoamIslands_B4F_EventScript_UpwardCurrent" } ], "bg_events": [ { "type": "hidden_item", "x": 13, "y": 8, "elevation": 0, "item": "ITEM_WATER_STONE", "flag": "FLAG_HIDDEN_ITEM_SEAFOAM_ISLANDS_B4F_WATER_STONE", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 30, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SeafoamIslands_B4F_EventScript_FastCurrentSign" }, { "type": "sign", "x": 14, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SeafoamIslands_B4F_EventScript_BoulderHintSign" } ], "level_scaling": "4" } ================================================ FILE: data/maps/SeafoamIslands_B4F/scripts.inc ================================================ .equ NUM_BOULDERS_PRESENT, VAR_TEMP_2 .set LOCALID_ARTICUNO_MASTER, 5 .set TRAINER, VAR_0x8009 SeafoamIslands_B4F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SeafoamIslands_B4F_OnTransition map_script MAP_SCRIPT_ON_RESUME, SeafoamIslands_B4F_OnResume map_script MAP_SCRIPT_ON_LOAD, SeafoamIslands_B4F_OnLoad map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, SeafoamIslands_B4F_OnWarp map_script MAP_SCRIPT_ON_FRAME_TABLE, SeafoamIslands_B4F_OnFrame .byte 0 SeafoamIslands_B4F_OnResume:: call_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, SeafoamIslands_B4F_EventScript_TryRemoveArticuno end SeafoamIslands_B4F_EventScript_TryRemoveArticuno:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return removeobject VAR_LAST_TALKED return SeafoamIslands_B4F_OnTransition:: call_if_set FLAG_FOUGHT_ARTICUNO, SeafoamIslands_B4F_EventScript_HideArticuno call_if_unset FLAG_FOUGHT_ARTICUNO, SeafoamIslands_B4F_EventScript_TryShowArticuno call_if_unset FLAG_STOPPED_SEAFOAM_B4F_CURRENT, SeafoamIslands_B4F_EventScript_CheckStoppedCurrent call_if_set FLAG_STOPPED_SEAFOAM_B4F_CURRENT, SeafoamIslands_B4F_EventScript_SetNoCurrentLayout goto SeafoamIslands_B4F_MapScript_SetMasterTrainerMovementTypes end SeafoamIslands_B4F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_ARTICUNO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SeafoamIslands_B4F_MapScript_ArticunoMasterMovementType end SeafoamIslands_B4F_MapScript_ArticunoMasterMovementType:: setobjectmovementtype LOCALID_ARTICUNO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SeafoamIslands_B4F_EventScript_CheckStoppedCurrent:: setvar NUM_BOULDERS_PRESENT, 0 call_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_1, SeafoamIslands_B4F_EventScript_AddBoulderPresent call_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_2, SeafoamIslands_B4F_EventScript_AddBoulderPresent call_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B4F_EventScript_StoppedCurrent return SeafoamIslands_B4F_EventScript_StoppedCurrent:: setflag FLAG_STOPPED_SEAFOAM_B4F_CURRENT return SeafoamIslands_B4F_EventScript_SetNoCurrentLayout:: setmaplayoutindex LAYOUT_SEAFOAM_ISLANDS_B4F_CURRENT_STOPPED return SeafoamIslands_B4F_EventScript_TryShowArticuno:: goto_if_set FLAG_ARTICUNO_FLEW_AWAY, EventScript_Return clearflag FLAG_HIDE_ARTICUNO return SeafoamIslands_B4F_EventScript_HideArticuno:: setflag FLAG_HIDE_ARTICUNO return SeafoamIslands_B4F_OnLoad:: setvar NUM_BOULDERS_PRESENT, 0 call_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_1, SeafoamIslands_B4F_EventScript_AddBoulderPresent call_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_2, SeafoamIslands_B4F_EventScript_AddBoulderPresent goto_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B4F_EventScript_SetCalmWaterNearStairs end SeafoamIslands_B4F_EventScript_SetCalmWaterNearStairs:: setmetatile 12, 14, METATILE_General_CalmWater, 0 setmetatile 13, 14, METATILE_General_CalmWater, 0 end SeafoamIslands_B4F_OnWarp:: map_script_2 VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F, 1, SeafoamIslands_B4F_EventScript_WarpInOnCurrent .2byte 0 SeafoamIslands_B4F_EventScript_WarpInOnCurrent:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH special ForcePlayerToStartSurfing end SeafoamIslands_B4F_OnFrame:: map_script_2 VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F, 1, SeafoamIslands_B4F_EventScript_EnterOnCurrent map_script_2 VAR_TEMP_1, 1, SeafoamIslands_B4F_EventScript_EnterByFalling .2byte 0 @ The current the player is forced in on from B3F SeafoamIslands_B4F_EventScript_EnterOnCurrent:: lockall applymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B4F_Movement_EnterOnCurrent waitmovement 0 setvar VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F, 0 releaseall end SeafoamIslands_B4F_Movement_EnterOnCurrent:: walk_fast_up walk_fast_up walk_fast_up step_end @ The current the player lands on when entering the map by falling SeafoamIslands_B4F_EventScript_EnterByFalling:: lockall setvar NUM_BOULDERS_PRESENT, 0 call_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_1, SeafoamIslands_B4F_EventScript_AddBoulderPresent call_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_2, SeafoamIslands_B4F_EventScript_AddBoulderPresent goto_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B4F_EventScript_CurrentBlocked getplayerxy VAR_0x8008, VAR_0x8009 call_if_lt VAR_0x8008, 9, SeafoamIslands_B4F_EventScript_RideCurrentFar call_if_ge VAR_0x8008, 9, SeafoamIslands_B4F_EventScript_RideCurrentClose special SeafoamIslandsB4F_CurrentDumpsPlayerOnLand setvar VAR_TEMP_1, 0 releaseall end SeafoamIslands_B4F_EventScript_AddBoulderPresent:: addvar NUM_BOULDERS_PRESENT, 1 return SeafoamIslands_B4F_EventScript_RideCurrentFar:: applymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B4F_Movement_RideCurrentFar waitmovement 0 return SeafoamIslands_B4F_EventScript_RideCurrentClose:: applymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B4F_Movement_RideCurrentClose waitmovement 0 return SeafoamIslands_B4F_EventScript_CurrentBlocked:: setvar VAR_TEMP_1, 0 releaseall end SeafoamIslands_B4F_Movement_RideCurrentFar:: walk_up walk_up walk_up walk_right walk_right walk_right walk_right walk_up step_end SeafoamIslands_B4F_Movement_RideCurrentClose:: walk_up walk_up walk_up walk_right walk_right walk_right walk_up step_end @ Triggers blocking re-entry to B3F SeafoamIslands_B4F_EventScript_UpwardCurrent:: lockall applymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B4F_Movement_WalkUp waitmovement 0 releaseall end SeafoamIslands_B4F_Movement_WalkUp:: walk_up step_end SeafoamIslands_B4F_EventScript_Articuno:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer setwildbattle SPECIES_ARTICUNO, 50 waitse playmoncry SPECIES_ARTICUNO, CRY_MODE_ENCOUNTER message Text_Gyaoo waitmessage waitmoncry delay 10 playbgm MUS_ENCOUNTER_GYM_LEADER, 0 waitbuttonpress setflag FLAG_SYS_SPECIAL_WILD_BATTLE special StartLegendaryBattle waitstate clearflag FLAG_SYS_SPECIAL_WILD_BATTLE specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, SeafoamIslands_B4F_EventScript_DefeatedArticuno goto_if_eq VAR_RESULT, B_OUTCOME_RAN, SeafoamIslands_B4F_EventScript_RanFromArticuno goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, SeafoamIslands_B4F_EventScript_RanFromArticuno setflag FLAG_FOUGHT_ARTICUNO release end SeafoamIslands_B4F_EventScript_DefeatedArticuno:: setflag FLAG_ARTICUNO_FLEW_AWAY setvar VAR_0x8004, SPECIES_ARTICUNO goto EventScript_MonFlewAway end SeafoamIslands_B4F_EventScript_RanFromArticuno:: setvar VAR_0x8004, SPECIES_ARTICUNO goto EventScript_MonFlewAway end SeafoamIslands_B4F_EventScript_BoulderHintSign:: msgbox SeafoamIslands_B4F_Text_BouldersMightChangeWaterFlow, MSGBOX_SIGN end SeafoamIslands_B4F_EventScript_FastCurrentSign:: msgbox SeafoamIslands_B4F_Text_DangerFastCurrent, MSGBOX_SIGN end ================================================ FILE: data/maps/SeafoamIslands_B4F/text.inc ================================================ Text_RockSlideTeach:: .string "When you're up on a rocky mountain\n" .string "like this, rockslides are a threat.\p" .string "Can you imagine?\n" .string "Boulders tumbling down on you?\p" .string "That'd be, like, waaaaaaaaaaah!\n" .string "Total terror!\p" .string "You don't seem to be scared.\n" .string "Want to try using ROCK SLIDE?$" Text_RockSlideDeclined:: .string "Oh, so you are scared after all.$" Text_RockSlideWhichMon:: .string "Which POKéMON should I teach\n" .string "ROCK SLIDE?$" Text_RockSlideTaught:: .string "It might be scary to use it in this\n" .string "tunnel…$" Text_RockSlideReteach:: .string "You really aren't afraid of rockslides\n" .string "if you're here spelunking again.\p" .string "I can teach you ROCK SLIDE\n" .string "once more if you can pay ¥5000.$" Text_RockSlideReteach2:: .string "Would you like me to teach\n" .string "ROCK SLIDE?$" Text_RockSlideNotEnoughMoney:: .string "Supplies for exploring caves\n" .string "don't come cheap.\p" .string "If I don't charge for my services,\n" .string "I can't afford to keep exploring!\p" .string "If you want to learn ROCK SLIDE,\n" .string "come back with ¥5000.$" SeafoamIslands_B4F_Text_BouldersMightChangeWaterFlow:: .string "Hint: Boulders might change the\n" .string "flow of water.$" SeafoamIslands_B4F_Text_DangerFastCurrent:: .string "DANGER\n" .string "Fast current!$" ================================================ FILE: data/maps/SevenIsland/map.json ================================================ { "id": "MAP_SEVEN_ISLAND", "name": "SevenIsland", "layout": "LAYOUT_SEVEN_ISLAND", "music": "MUS_SEVII_67", "region_map_section": "MAPSEC_SEVEN_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": -10, "map": "MAP_SEVEN_ISLAND_TRAINER_TOWER" }, { "direction": "down", "offset": 0, "map": "MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 7, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_EventScript_SwordsDanceTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_EventScript_OldWoman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 15, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_EventScript_Scientist", "flag": "0" } ], "warp_events": [ { "x": 12, "y": 9, "elevation": 0, "dest_map": "MAP_SEVEN_ISLAND_HOUSE_ROOM1", "dest_warp_id": "0" }, { "x": 5, "y": 9, "elevation": 0, "dest_map": "MAP_SEVEN_ISLAND_MART", "dest_warp_id": "0" }, { "x": 12, "y": 3, "elevation": 0, "dest_map": "MAP_SEVEN_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "0" }, { "x": 16, "y": 13, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_HARBOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 17, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_EventScript_IslandSign" }, { "type": "sign", "x": 10, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_EventScript_IslandMailbox" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SevenIsland/scripts.inc ================================================ .equ CHECK_BOXES_MOVED, 9 .equ CHECK_ANY_VISITORS, 10 .equ CREATE_VISITOR_STRING, 12 .equ TYPE, VAR_0x8003 SevenIsland_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_OnTransition .byte 0 SevenIsland_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SEVEN_ISLAND end SevenIsland_EventScript_IslandSign:: msgbox SevenIsland_Text_IslandSign, MSGBOX_SIGN end SevenIsland_EventScript_OldWoman:: msgbox SevenIsland_Text_IslandsMadeInSevenDays, MSGBOX_NPC end SevenIsland_EventScript_Scientist:: msgbox SevenIsland_Text_IslandVirtuallyUntouched, MSGBOX_NPC end SevenIsland_EventScript_IslandMailbox:: setvar TYPE, CHECK_BOXES_MOVED callnative UseBattleHouseVar compare VAR_RESULT, 1 goto_if_eq SevenIsland_EventScript_BattleHouse msgbox SevenIsland_Text_FadedWriting, MSGBOX_SIGN end SevenIsland_EventScript_BattleHouse:: setvar TYPE, CHECK_ANY_VISITORS callnative UseBattleHouseVar compare VAR_RESULT, 0 goto_if_eq SevenIsland_EventScript_BattleHouseNoVisitors switch VAR_RESULT case 1, SevenIsland_EventScript_Buffer1 case 2, SevenIsland_EventScript_Buffer2 case 3, SevenIsland_EventScript_Buffer3 case 4, SevenIsland_EventScript_Buffer4 case 5, SevenIsland_EventScript_Buffer5 case 6, SevenIsland_EventScript_Buffer6 case 7, SevenIsland_EventScript_Buffer7 end SevenIsland_EventScript_BattleHouseNoVisitors:: msgbox SevenIsland_Text_BattleHouseWithNoVisitors, MSGBOX_SIGN end SevenIsland_EventScript_Buffer1:: setvar TYPE, CREATE_VISITOR_STRING callnative UseBattleHouseVar msgbox SevenIsland_Text_BattleHouseOneVisitor, MSGBOX_SIGN end SevenIsland_EventScript_Buffer2:: setvar TYPE, CREATE_VISITOR_STRING callnative UseBattleHouseVar msgbox SevenIsland_Text_BattleHouseTwoVisitors, MSGBOX_SIGN end SevenIsland_EventScript_Buffer3:: setvar TYPE, CREATE_VISITOR_STRING callnative UseBattleHouseVar msgbox SevenIsland_Text_BattleHouseThreeVisitors, MSGBOX_SIGN end SevenIsland_EventScript_Buffer4:: setvar TYPE, CREATE_VISITOR_STRING callnative UseBattleHouseVar msgbox SevenIsland_Text_BattleHouseFourVisitors, MSGBOX_SIGN end SevenIsland_EventScript_Buffer5:: setvar TYPE, CREATE_VISITOR_STRING callnative UseBattleHouseVar msgbox SevenIsland_Text_BattleHouseFiveVisitors, MSGBOX_SIGN end SevenIsland_EventScript_Buffer6:: setvar TYPE, CREATE_VISITOR_STRING callnative UseBattleHouseVar msgbox SevenIsland_Text_BattleHouseSixVisitors, MSGBOX_SIGN end SevenIsland_EventScript_Buffer7:: setvar TYPE, CREATE_VISITOR_STRING callnative UseBattleHouseVar msgbox SevenIsland_Text_BattleHouseSevenVisitors, MSGBOX_SIGN end ================================================ FILE: data/maps/SevenIsland/text.inc ================================================ Text_SwordsDanceTeach:: .string "Not many people come out here.\p" .string "If I train here, I'm convinced that\n" .string "I'll get stronger and stronger.\p" .string "Yep, stronger and stronger…\p" .string "How would you like to learn a move\n" .string "like that? It's SWORDS DANCE.$" Text_SwordsDanceDeclined:: .string "Well, that's fine, too.$" Text_SwordsDanceWhichMon:: .string "All right, pick which POKéMON\n" .string "I should teach it to.$" Text_SwordsDanceReteach:: .string "I'm still trying to get stronger\n" .string "and stronger…\p" .string "I've heard that vitamins strengthen\n" .string "POKéMON, but they're so expensive!\p" .string "So, I started charging ¥5000 to\n" .string "teach other POKéMON SWORDS DANCE.$" Text_SwordsDanceReteach2:: .string "Would you like me to teach your\n" .string "POKéMON the move SWORDS DANCE?$" Text_SwordsDanceNotEnoughMoney:: .string "You don't have ¥5000?\p" .string "I'm sorry, but I need the money\n" .string "to make my POKéMON strong.\p" .string "I'll teach SWORDS DANCE to you\n" .string "when you come back with enough.$" Text_SwordsDanceTaught:: .string "If only we could keep getting\n" .string "stronger and stronger, eh?$" SevenIsland_Text_IslandSign:: .string "SEVEN ISLAND\n" .string "Quest Island of Infinity$" SevenIsland_Text_IslandsMadeInSevenDays:: .string "These islands are called the SEVII\n" .string "ISLANDS because there are seven.\p" .string "…Or at least that's what the young\n" .string "people believe.\p" .string "The truth is, these islands are so\n" .string "named because they are said to\l" .string "have been made in seven days.$" SevenIsland_Text_IslandVirtuallyUntouched:: .string "This island has been left virtually\n" .string "untouched in its natural state.\p" .string "It could be a little difficult to\n" .string "hike around because of that.$" SevenIsland_Text_FadedWriting:: .string "The writing is too faded to read…$" SevenIsland_Text_BattleHouseWithNoVisitors:: .string "BATTLE HOUSE\n" .string "…The sign-in sheet is empty.$" SevenIsland_Text_BattleHouseOneVisitor:: .string "BATTLE HOUSE\n" .string "There is one person signed in:\p" .string "{STR_VAR_1}.$" SevenIsland_Text_BattleHouseTwoVisitors:: .string "BATTLE HOUSE\n" .string "There are two people signed in:\p" .string "{STR_VAR_1}.$" SevenIsland_Text_BattleHouseThreeVisitors:: .string "BATTLE HOUSE\n" .string "There are three people signed in:\p" .string "{STR_VAR_1}.$" SevenIsland_Text_BattleHouseFourVisitors:: .string "BATTLE HOUSE\n" .string "There are four people signed in:\p" .string "{STR_VAR_1}.$" SevenIsland_Text_BattleHouseFiveVisitors:: .string "BATTLE HOUSE\n" .string "There are five people signed in:\p" .string "{STR_VAR_1}.$" SevenIsland_Text_BattleHouseSixVisitors:: .string "BATTLE HOUSE\n" .string "There are six people signed in:\p" .string "{STR_VAR_1}.$" SevenIsland_Text_BattleHouseSevenVisitors:: .string "BATTLE HOUSE\n" .string "There are seven people signed in:\p" .string "{STR_VAR_1}.$" ================================================ FILE: data/maps/SevenIsland_Harbor/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_HARBOR", "name": "SevenIsland_Harbor", "layout": "LAYOUT_ISLAND_HARBOR", "music": "MUS_SEVII_67", "region_map_section": "MAPSEC_SEVEN_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "x": 8, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_Harbor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_Harbor/scripts.inc ================================================ SevenIsland_Harbor_MapScripts:: .byte 0 SevenIsland_Harbor_EventScript_Sailor:: lock faceplayer message Text_WhereDoYouWantToSail waitmessage setvar VAR_0x8004, SEAGALLOP_SEVEN_ISLAND goto EventScript_ChooseDestFromIsland end ================================================ FILE: data/maps/SevenIsland_House_Room1/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_HOUSE_ROOM1", "name": "SevenIsland_House_Room1", "layout": "LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1", "music": "MUS_SEVII_67", "region_map_section": "MAPSEC_SEVEN_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_House_Room1_EventScript_OldWoman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SPEAROW", "in_connection": false, "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_House_Room1_EventScript_Spearow", "flag": "FLAG_TEMP_1" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND", "dest_warp_id": "0" }, { "x": 4, "y": 1, "elevation": 0, "dest_map": "MAP_SEVEN_ISLAND_HOUSE_ROOM2", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_House_Room1_EventScript_Box" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SevenIsland_House_Room1/scripts.inc ================================================ .equ LOCALID_OLD_WOMAN, 1 .equ LOCALID_SPEAROW, 2 .equ SET_SPEAROW_STATE, 0 .equ SET_TOLD_FAMECHECKER, 1 .equ SET_VISITOR_STATE, 2 .equ SET_LEVEL_GROWTH, 3 .equ CHECK_SPEAROW_STATE, 4 .equ CHECK_TOLD_FAMECHECKER, 5 .equ CHECK_VISITOR_STATE, 6 .equ CHECK_LEVEL_GROWTH, 7 .equ SET_BOXES_MOVED, 8 .equ CHECK_BOXES_MOVED, 9 .equ CHECK_ANY_VISITORS, 10 .equ CHECK_ALL_TOLD, 11 .equ CREATE_VISITOR_STRING, 12 .equ TYPE, VAR_0x8003 .equ ARGUMENT, VAR_0x8004 .equ LEADER_READY, VAR_0x8006 SevenIsland_House_Room1_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_House_Room1_OnTransition .byte 0 SevenIsland_House_Room1_OnTransition:: setvar LEADER_READY, 0 setvar TYPE, CHECK_BOXES_MOVED callnative UseBattleHouseVar call_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_SetTrainerVisitingLayout setvar TYPE, CHECK_SPEAROW_STATE callnative UseBattleHouseVar call_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_HideSpearow setvar TYPE, CHECK_ALL_TOLD callnative UseBattleHouseVar call_if_eq VAR_RESULT, 7, SevenIsland_House_Room1_EventScript_WalkSpearow end SevenIsland_House_Room1_EventScript_SetTrainerVisitingLayout:: setmaplayoutindex LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1_DOOR_OPEN return SevenIsland_House_Room1_EventScript_HideSpearow:: setflag FLAG_TEMP_1 return SevenIsland_House_Room1_EventScript_WalkSpearow:: setobjectmovementtype LOCALID_SPEAROW, MOVEMENT_TYPE_WANDER_AROUND return SevenIsland_House_Room1_EventScript_OldWoman:: @ buffernumberstring STR_VAR_1, VAR_BATTLE_HOUSE2 @ buffernumberstring STR_VAR_2, VAR_BATTLE_HOUSE2 @ msgbox TESTTESTTEST lock faceplayer setvar TYPE, CHECK_SPEAROW_STATE callnative UseBattleHouseVar goto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_SpearowGone setvar TYPE, CHECK_BOXES_MOVED callnative UseBattleHouseVar goto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_OldWomanBasementOpen msgbox SevenIsland_House_Room1_Text_OnlyEnjoymentWatchingBattles textcolor 3 msgbox SevenIsland_House_Room1_Text_ShowFameChecker, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, SevenIsland_House_Room1_EventScript_ShowingFameChecker textcolor 1 msgbox SevenIsland_House_Room1_Text_NoShowFameChecker release end SevenIsland_House_Room1_EventScript_ShowingFameChecker:: textcolor 1 message SevenIsland_House_Room1_Text_ManyTrainersWhich waitmessage setvar VAR_0x8004, LISTMENU_GYM_LEADERS special ListMenu waitstate switch VAR_RESULT case 0, SevenIsland_House_Room1_EventScript_Brock case 1, SevenIsland_House_Room1_EventScript_Misty case 2, SevenIsland_House_Room1_EventScript_LtSurge case 3, SevenIsland_House_Room1_EventScript_Erika case 4, SevenIsland_House_Room1_EventScript_Koga case 5, SevenIsland_House_Room1_EventScript_Sabrina case 6, SevenIsland_House_Room1_EventScript_Blaine case 8, SevenIsland_House_Room1_EventScript_RefuseToSelectLeader case 127, SevenIsland_House_Room1_EventScript_RefuseToSelectLeader end SevenIsland_House_Room1_EventScript_Brock:: setvar 0x8004, FAMECHECKER_BROCK bufferstring 0, gText_Brock bufferstring 1, SevenIsland_House_Room1_Text_HeString bufferstring 2, gFameCheckerFlavorTextOriginLocation_Brock0 callnative CheckFilledFameCheckerFor0x8004 goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson goto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson SevenIsland_House_Room1_EventScript_Misty:: setvar 0x8004, FAMECHECKER_MISTY bufferstring 0, gText_Misty bufferstring 1, SevenIsland_House_Room1_Text_SheString bufferstring 2, gFameCheckerFlavorTextOriginLocation_Misty0 callnative CheckFilledFameCheckerFor0x8004 goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson goto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson SevenIsland_House_Room1_EventScript_LtSurge:: setvar 0x8004, FAMECHECKER_LTSURGE bufferstring 0, gText_LtSurge bufferstring 1, SevenIsland_House_Room1_Text_HeString bufferstring 2, gFameCheckerFlavorTextOriginLocation_LtSurge0 callnative CheckFilledFameCheckerFor0x8004 goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson goto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson SevenIsland_House_Room1_EventScript_Erika:: setvar 0x8004, FAMECHECKER_ERIKA bufferstring 0, gText_Erika bufferstring 1, SevenIsland_House_Room1_Text_SheString bufferstring 2, gFameCheckerFlavorTextOriginLocation_Erika0 callnative CheckFilledFameCheckerFor0x8004 goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson goto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson SevenIsland_House_Room1_EventScript_Koga:: setvar 0x8004, FAMECHECKER_KOGA bufferstring 0, gText_Koga bufferstring 1, SevenIsland_House_Room1_Text_HeString bufferstring 2, gFameCheckerFlavorTextOriginLocation_Koga0 callnative CheckFilledFameCheckerFor0x8004 goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson goto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson SevenIsland_House_Room1_EventScript_Sabrina:: setvar 0x8004, FAMECHECKER_SABRINA bufferstring 0, gText_Sabrina bufferstring 1, SevenIsland_House_Room1_Text_SheString bufferstring 2, gFameCheckerFlavorTextOriginLocation_Sabrina0 callnative CheckFilledFameCheckerFor0x8004 goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson goto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson SevenIsland_House_Room1_EventScript_Blaine:: setvar 0x8004, FAMECHECKER_BLAINE bufferstring 0, gText_Blaine bufferstring 1, SevenIsland_House_Room1_Text_HeString bufferstring 2, gFameCheckerFlavorTextOriginLocation_Blaine0 callnative CheckFilledFameCheckerFor0x8004 goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson goto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson SevenIsland_House_Room1_EventScript_RefuseToSelectLeader:: msgbox SevenIsland_House_Room1_Text_NoShowFameChecker release end SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson:: setvar TYPE, CHECK_TOLD_FAMECHECKER @ ARGUMENT already set callnative UseBattleHouseVar goto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_AlreadyShownPerson msgbox SevenIsland_House_Room1_Text_FullFamecheckerForPerson goto_if_ge VAR_BATTLE_HOUSE, 1, SevenIsland_House_Room1_EventScript_AlreadyUnlockedBasement msgbox SevenIsland_House_Room1_Text_FirstFullFamecheckerPerson SevenIsland_House_Room1_SendOutSpearow:: turnobject LOCALID_OLD_WOMAN, DIR_EAST msgbox SevenIsland_House_Room1_Text_CallSpearow lockall turnobject LOCALID_SPEAROW, DIR_WEST waitse playmoncry SPECIES_SPEAROW, 0 msgbox SevenIsland_House_Room1_Text_Spearow waitmoncry release applymovement LOCALID_SPEAROW, SevenIsland_House_Room1_Movement_SpearowToTable waitmovement 0 playse SE_LEDGE applymovement LOCALID_SPEAROW, SevenIsland_House_Room1_Movement_SpearowFinishToTable waitmovement 0 msgbox SevenIsland_House_Room1_Text_DeliverToLeader release waitse playmoncry SPECIES_SPEAROW, 0 msgbox SevenIsland_House_Room1_Text_Spearow waitmoncry release playse SE_LEDGE applymovement LOCALID_SPEAROW, SevenIsland_House_Room1_Movement_SpearowExitHouse waitmovement 0 playse SE_EXIT removeobject LOCALID_SPEAROW faceplayer goto_if_ge VAR_BATTLE_HOUSE, 1, SevenIsland_House_Room1_EventScript_SpearowLeftAlreadyUnlockedBasement setvar TYPE, SET_SPEAROW_STATE callnative UseBattleHouseVar setvar TYPE, SET_TOLD_FAMECHECKER @ ARGUMENT already set callnative UseBattleHouseVar msgbox SevenIsland_House_Room1_Text_FirstTakeTime release end SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson:: msgbox SevenIsland_House_Room1_Text_NotFullFamecheckerForPerson release end SevenIsland_House_Room1_Movement_SpearowToTable:: walk_fast_up walk_fast_up walk_fast_left walk_fast_left step_end SevenIsland_House_Room1_Movement_SpearowFinishToTable:: jump_left walk_left step_end SevenIsland_House_Room1_Movement_SpearowExitHouse:: jump_2_down walk_fast_left walk_fast_down delay_8 set_invisible step_end SevenIsland_House_Room1_EventScript_AlreadyShownPerson:: msgbox SevenIsland_House_Room1_Text_AlreadyShownPerson goto SevenIsland_House_Room1_EventScript_ShowingFameChecker SevenIsland_House_Room1_EventScript_AlreadyUnlockedBasement:: msgbox SevenIsland_House_Room1_Text_InviteBasementOpen goto SevenIsland_House_Room1_SendOutSpearow SevenIsland_House_Room1_EventScript_SpearowLeftAlreadyUnlockedBasement:: setvar TYPE, SET_SPEAROW_STATE callnative UseBattleHouseVar setvar TYPE, SET_TOLD_FAMECHECKER @ ARGUMENT already set callnative UseBattleHouseVar msgbox SevenIsland_House_Room1_Text_TakeTime release end SevenIsland_House_Room1_EventScript_SpearowGone:: msgbox SevenIsland_House_Room1_Text_SpearowNotBackYet release end SevenIsland_House_Room1_EventScript_Spearow:: lock faceplayer waitse playmoncry SPECIES_SPEAROW, 0 msgbox SevenIsland_House_Room1_Text_Spearow waitmoncry release end SevenIsland_House_Room1_EventScript_OldWomanBasementOpen:: setvar TYPE, CHECK_ALL_TOLD callnative UseBattleHouseVar copyvar VAR_0x8000, VAR_RESULT setvar TYPE, CHECK_ANY_VISITORS callnative UseBattleHouseVar goto_if_ge VAR_0x8000, 7, SevenIsland_House_Room1_EventScript_OldWomanToldAll goto_if_eq VAR_RESULT, 0, SevenIsland_House_Room1_EventScript_OldWomanNoVisitors goto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_OldWomanOneVisitor switch VAR_RESULT case 2, SevenIsland_House_Room1_EventScript_Buffer2 case 3, SevenIsland_House_Room1_EventScript_Buffer3 case 4, SevenIsland_House_Room1_EventScript_Buffer4 case 5, SevenIsland_House_Room1_EventScript_Buffer5 case 6, SevenIsland_House_Room1_EventScript_Buffer6 case 7, SevenIsland_House_Room1_EventScript_Buffer7 goto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors SevenIsland_House_Room1_EventScript_OldWomanNoVisitors:: msgbox SevenIsland_House_Room1_Text_OldWomanNoVisitors goto SevenIsland_House_Room1_EventScript_ShowFameCheckerQuestion end SevenIsland_House_Room1_EventScript_OldWomanOneVisitor:: msgbox SevenIsland_House_Room1_Text_OldWomanOneVisitor goto SevenIsland_House_Room1_EventScript_ShowFameCheckerQuestion end SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors:: msgbox SevenIsland_House_Room1_Text_OldWomanMultiVisitors goto SevenIsland_House_Room1_EventScript_ShowFameCheckerQuestion end SevenIsland_House_Room1_EventScript_ShowFameCheckerQuestion:: textcolor 3 msgbox SevenIsland_House_Room1_Text_ShowFameChecker, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, SevenIsland_House_Room1_EventScript_ShowingFameChecker textcolor 1 msgbox SevenIsland_House_Room1_Text_NoShowFameChecker2 release end SevenIsland_House_Room1_EventScript_OldWomanToldAll:: goto_if_eq VAR_RESULT, 0, SevenIsland_House_Room1_EventScript_OldWomanToldAllNoVisitors goto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_OldWomanToldAllOneVisitor switch VAR_RESULT case 2, SevenIsland_House_Room1_EventScript_Buffer2All case 3, SevenIsland_House_Room1_EventScript_Buffer3All case 4, SevenIsland_House_Room1_EventScript_Buffer4All case 5, SevenIsland_House_Room1_EventScript_Buffer5All case 6, SevenIsland_House_Room1_EventScript_Buffer6All case 7, SevenIsland_House_Room1_EventScript_Buffer7All goto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors SevenIsland_House_Room1_EventScript_OldWomanToldAllNoVisitors:: msgbox SevenIsland_House_Room1_Text_OldWomanToldAllNoVisitors release end SevenIsland_House_Room1_EventScript_OldWomanToldAllOneVisitor:: msgbox SevenIsland_House_Room1_Text_OldWomanToldAllOneVisitor release end SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors:: msgbox SevenIsland_House_Room1_Text_OldWomanToldAllMultiVisitors release end SevenIsland_House_Room1_EventScript_Buffer2:: bufferstring 1, SevenIsland_House_Room1_Text_Two goto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors SevenIsland_House_Room1_EventScript_Buffer3:: bufferstring 1, SevenIsland_House_Room1_Text_Three goto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors SevenIsland_House_Room1_EventScript_Buffer4:: bufferstring 1, SevenIsland_House_Room1_Text_Four goto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors SevenIsland_House_Room1_EventScript_Buffer5:: bufferstring 1, SevenIsland_House_Room1_Text_Five goto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors SevenIsland_House_Room1_EventScript_Buffer6:: bufferstring 1, SevenIsland_House_Room1_Text_Six goto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors SevenIsland_House_Room1_EventScript_Buffer7:: bufferstring 1, SevenIsland_House_Room1_Text_Seven goto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors SevenIsland_House_Room1_EventScript_Buffer2All:: bufferstring 1, SevenIsland_House_Room1_Text_Two goto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors SevenIsland_House_Room1_EventScript_Buffer3All:: bufferstring 1, SevenIsland_House_Room1_Text_Three goto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors SevenIsland_House_Room1_EventScript_Buffer4All:: bufferstring 1, SevenIsland_House_Room1_Text_Four goto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors SevenIsland_House_Room1_EventScript_Buffer5All:: bufferstring 1, SevenIsland_House_Room1_Text_Five goto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors SevenIsland_House_Room1_EventScript_Buffer6All:: bufferstring 1, SevenIsland_House_Room1_Text_Six goto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors SevenIsland_House_Room1_EventScript_Buffer7All:: bufferstring 1, SevenIsland_House_Room1_Text_Seven goto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors SevenIsland_House_Room1_EventScript_Box:: msgbox SevenIsland_House_Room1_Text_SlightBreezeAroundBox, MSGBOX_SIGN end ================================================ FILE: data/maps/SevenIsland_House_Room1/text.inc ================================================ SevenIsland_House_Room1_Text_OnlyEnjoymentWatchingBattles:: .string "I may not look like much now,\n" .string "but when I was younger…\p" .string "I flew everywhere, challenging\n" .string "TRAINERS wherever I found them.\p" .string "Now, my only source of enjoyment\n" .string "is reminiscing about the past while\l" .string "watching tough TRAINERS battle.\p" .string "Wait, those BADGES…\n" .string "You've beaten the GYMS of KANTO?\l" .string "Funny, you don't look like much.\p" .string "But, then, you must know many\n" .string "tough TRAINERS from your travels.\p" .string "Can you stay a while and tell\n" .string "a bored old woman about them?$" SevenIsland_House_Room1_Text_ShowFameChecker:: .string "Show her the FAME CHECKER?$" SevenIsland_House_Room1_Text_NoShowFameChecker:: .string "I see…\n" .string "Well, go on with your travels then…$" SevenIsland_House_Room1_Text_ManyTrainersWhich:: .string "There are many TRAINERS in here.\n" .string "Who do you want to tell me about?$" SevenIsland_House_Room1_Text_NotFullFamecheckerForPerson:: .string "Hmm… {STR_VAR_1}…?\p" .string "There's not enough information on\n" .string "{STR_VAR_1} for me to be able to\l" .string "truly tell how {STR_VAR_2} battles.\p" .string "Maybe once you've gathered more\n" .string "knowledge, you can show me again.$" SevenIsland_House_Room1_Text_FullFamecheckerForPerson:: .string "…!\p" .string "Yes, {STR_VAR_1} seems like exactly\n" .string "the type of battler I like to watch.$" SevenIsland_House_Room1_Text_FirstFullFamecheckerPerson:: .string "Let me tell you something. There's\n" .string "a hidden room in the basement.\p" .string "I once trained my POKéMON there and\n" .string "invited others down to battle too.\p" .string "I think I'm going to reopen the\n" .string "basement room and invite {STR_VAR_1}\l" .string "here to train.$" SevenIsland_House_Room1_Text_CallSpearow:: .string "SPEAROW!\n" .string "Come here please!$" SevenIsland_House_Room1_Text_DeliverToLeader:: .string "Take this invitation to {STR_VAR_1}\n" .string "in the {STR_VAR_3} GYM!$" SevenIsland_House_Room1_Text_FirstTakeTime:: .string "It'll take time for SPEAROW\n" .string "to return with a reply.\p" .string "You don't have to wait here\n" .string "with me. Come back later.\p" .string "In the mean time, I'll start\n" .string "renovating the basement.$" SevenIsland_House_Room1_Text_TakeTime:: .string "It'll take time for SPEAROW\n" .string "to return with a reply.\p" .string "You don't have to wait here\n" .string "with me. Come back later.$" SevenIsland_House_Room1_Text_AlreadyShownPerson:: .string "{STR_VAR_1}?\p" .string "We've already invited {STR_VAR_1}\n" .string "to train here with us.$" SevenIsland_House_Room1_Text_SpearowNotBackYet:: .string "SPEAROW hasn't come back yet.\n" .string "We'll have to wait a little longer\l" .string "for the reply to our invitation.$" SevenIsland_House_Room1_Text_InviteBasementOpen:: .string "I'm going to pen an invitation to\n" .string "{STR_VAR_1} and send it right now!$" SevenIsland_House_Room1_Text_HeString:: .string "he$" SevenIsland_House_Room1_Text_SheString:: .string "she$" SevenIsland_House_Room1_Text_Spearow:: .string "SPEAROW: Tetweet!$" SevenIsland_House_Room1_Text_SlightBreezeAroundBox:: .string "There is a slight breeze blowing\n" .string "around the box.$" SevenIsland_House_Room1_Text_OldWomanNoVisitors:: .string "Hello, {PLAYER}.\n" .string "Have you come to train?\p" .string "Right now no one is visiting\n" .string "in the basement, but if you've\l" .string "learned about more tough TRAINERS,\l" .string "I'd like to hear about them!$" SevenIsland_House_Room1_Text_OldWomanOneVisitor:: .string "Hello, {PLAYER}.\n" .string "Have you come to train?\p" .string "Right now {STR_VAR_1} is visiting\n" .string "in the basement.\p" .string "Or have you learned about\n" .string "more tough TRAINERS?$" SevenIsland_House_Room1_Text_OldWomanMultiVisitors:: .string "Hello, {PLAYER}.\n" .string "Have you come to train?\p" .string "Right now {STR_VAR_2} TRAINERS are\n" .string "visiting in the basement.\p" .string "Or have you learned about\n" .string "more tough TRAINERS?$" SevenIsland_House_Room1_Text_OldWomanToldAllNoVisitors:: .string "Hello, {PLAYER}.\n" .string "Have you come to train?\p" .string "Right now no one is visiting\n" .string "in the basement.\p" .string "Despite that, my heart is filled\n" .string "with joy at the battles I've\l" .string "watched thanks to you.$" SevenIsland_House_Room1_Text_OldWomanToldAllOneVisitor:: .string "Hello, {PLAYER}.\n" .string "Have you come to train?\p" .string "Right now {STR_VAR_1} is visiting\n" .string "in the basement.\p" .string "I can't thank you enough for\n" .string "filling my life with the joy of\l" .string "watching great battles again.$" SevenIsland_House_Room1_Text_OldWomanToldAllMultiVisitors:: .string "Hello, {PLAYER}.\n" .string "Have you come to train?\p" .string "Right now {STR_VAR_2} TRAINERS are\n" .string "visiting in the basement.\p" .string "I can't thank you enough for\n" .string "filling my life with the joy of\l" .string "watching great battles again.$" SevenIsland_House_Room1_Text_NoShowFameChecker2:: .string "Okay, {PLAYER}, let me know\n" .string "when you've learned more.$" SevenIsland_House_Room1_Text_Two:: .string "two$" SevenIsland_House_Room1_Text_Three:: .string "three$" SevenIsland_House_Room1_Text_Four:: .string "four$" SevenIsland_House_Room1_Text_Five:: .string "five$" SevenIsland_House_Room1_Text_Six:: .string "six$" SevenIsland_House_Room1_Text_Seven:: .string "seven$" ================================================ FILE: data/maps/SevenIsland_House_Room2/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_HOUSE_ROOM2", "name": "SevenIsland_House_Room2", "layout": "LAYOUT_SEVEN_ISLAND_HOUSE_ROOM2", "music": "MUS_SEVII_67", "region_map_section": "MAPSEC_SEVEN_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BROCK", "in_connection": false, "x": 0, "y": 6, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_House_Room2_Eventscript_Brock", "flag": "FLAG_TEMP_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MISTY", "in_connection": false, "x": 5, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_House_Room2_Eventscript_Misty", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LT_SURGE", "in_connection": false, "x": 8, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_IN_PLACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_House_Room2_Eventscript_LtSurge", "flag": "FLAG_TEMP_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ERIKA", "in_connection": false, "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_House_Room2_Eventscript_Erika", "flag": "FLAG_TEMP_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_KOGA", "in_connection": false, "x": 7, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_House_Room2_Eventscript_Koga", "flag": "FLAG_TEMP_5" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SABRINA", "in_connection": false, "x": 3, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_House_Room2_Eventscript_Sabrina", "flag": "FLAG_TEMP_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLAINE", "in_connection": false, "x": 10, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_House_Room2_Eventscript_Blaine", "flag": "FLAG_TEMP_7" } ], "warp_events": [ { "x": 3, "y": 1, "elevation": 0, "dest_map": "MAP_SEVEN_ISLAND_HOUSE_ROOM1", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 4, "y": 5, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "SevenIsland_House_Room2_Eventscript_Trigger" } ], "bg_events": [ { "type": "sign", "x": 1, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_House_Room2_EventScript_LeftPainting" }, { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_House_Room2_EventScript_MiddlePainting" }, { "type": "sign", "x": 5, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_House_Room2_EventScript_MiddlePainting" }, { "type": "sign", "x": 10, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_House_Room2_EventScript_RightPainting" }, { "type": "sign", "x": 11, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_EAST", "script": "SevenIsland_House_Room2_EventScript_HealingMachine" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SevenIsland_House_Room2/scripts.inc ================================================ .equ LOCALID_BROCK, 1 .equ LOCALID_MISTY, 2 .equ LOCALID_LT_SURGE, 3 .equ LOCALID_ERIKA, 4 .equ LOCALID_KOGA, 5 .equ LOCALID_SABRINA, 6 .equ LOCALID_BLAINE, 7 .equ SET_SPEAROW_STATE, 0 .equ SET_TOLD_FAMECHECKER, 1 .equ SET_VISITOR_STATE, 2 .equ SET_LEVEL_GROWTH, 3 .equ CHECK_SPEAROW_STATE, 4 .equ CHECK_TOLD_FAMECHECKER, 5 .equ CHECK_VISITOR_STATE, 6 .equ CHECK_LEVEL_GROWTH, 7 .equ SET_BOXES_MOVED, 8 .equ CHECK_BOXES_MOVED, 9 .equ TYPE, VAR_TEMP_3 .equ ARGUMENT, VAR_TEMP_4 .equ LEADER_READY, VAR_TEMP_6 .equ X_COORD, VAR_TEMP_7 .equ Y_COORD, VAR_TEMP_8 SevenIsland_House_Room2_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_House_Room2_OnTransition .byte 0 SevenIsland_House_Room2_OnTransition:: setvar TYPE, CHECK_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_BROCK callnative UseBattleHouseVar call_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideBrock setvar ARGUMENT, FAMECHECKER_MISTY callnative UseBattleHouseVar call_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideMisty setvar ARGUMENT, FAMECHECKER_LTSURGE callnative UseBattleHouseVar call_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideLtSurge setvar ARGUMENT, FAMECHECKER_ERIKA callnative UseBattleHouseVar call_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideErika setvar ARGUMENT, FAMECHECKER_KOGA callnative UseBattleHouseVar call_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideKoga setvar ARGUMENT, FAMECHECKER_SABRINA callnative UseBattleHouseVar call_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideSabrina setvar ARGUMENT, FAMECHECKER_BLAINE callnative UseBattleHouseVar call_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideBlaine end SevenIsland_House_Room2_HideBrock:: setflag FLAG_TEMP_1 return SevenIsland_House_Room2_HideMisty:: setflag FLAG_TEMP_2 return SevenIsland_House_Room2_HideLtSurge:: setflag FLAG_TEMP_3 return SevenIsland_House_Room2_HideErika:: setflag FLAG_TEMP_4 return SevenIsland_House_Room2_HideKoga:: setflag FLAG_TEMP_5 return SevenIsland_House_Room2_HideSabrina:: setflag FLAG_TEMP_6 return SevenIsland_House_Room2_HideBlaine:: setflag FLAG_TEMP_7 return SevenIsland_House_Room2_EventScript_LeftPainting:: msgbox SevenIsland_House_Room2_Text_LeftPainting, MSGBOX_SIGN end SevenIsland_House_Room2_Text_LeftPainting:: .string "It's a photo of a young woman.\n" .string "She's surrounded by happy,\l" .string "strong-looking POKéMON.$" SevenIsland_House_Room2_EventScript_MiddlePainting:: msgbox SevenIsland_House_Room2_Text_MiddlePainting, MSGBOX_SIGN end SevenIsland_House_Room2_Text_MiddlePainting:: .string "It's a photo of a young woman.\n" .string "A SPEAROW perches on her arm.$" SevenIsland_House_Room2_EventScript_RightPainting:: call_if_eq VAR_STARTER_MON, 0, SevenIsland_House_Room2_EventScript_BufferBulbasaur call_if_eq VAR_STARTER_MON, 1, SevenIsland_House_Room2_EventScript_BufferSquirtle call_if_ge VAR_STARTER_MON, 2, SevenIsland_House_Room2_EventScript_BufferCharmander msgbox SevenIsland_House_Room2_Text_RightPainting, MSGBOX_SIGN end SevenIsland_House_Room2_Text_RightPainting:: .string "It's a photo of a TRAINER battle.\p" .string "A young woman is ordering her\n" .string "{STR_VAR_1} to attack an opposing\l" .string "{STR_VAR_2}.\p" .string "A SPEAROW hovers above the battle,\n" .string "watching intently.$" SevenIsland_House_Room2_EventScript_BufferBulbasaur:: bufferspeciesname STR_VAR_1, SPECIES_VENUSAUR bufferspeciesname STR_VAR_2, SPECIES_CHARIZARD return SevenIsland_House_Room2_EventScript_BufferSquirtle:: bufferspeciesname STR_VAR_1, SPECIES_BLASTOISE bufferspeciesname STR_VAR_2, SPECIES_VENUSAUR return SevenIsland_House_Room2_EventScript_BufferCharmander:: bufferspeciesname STR_VAR_1, SPECIES_CHARIZARD bufferspeciesname STR_VAR_2, SPECIES_BLASTOISE return SevenIsland_House_Room2_EventScript_HealingMachine:: msgbox SevenIsland_House_Room2_Text_HealPokemon, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, SevenIsland_House_Room2_EventScript_HealPokemon release end SevenIsland_House_Room2_Text_HealPokemon:: .string "Use the machine to heal\n" .string "your POKéMON?$" SevenIsland_House_Room2_EventScript_HealPokemon:: release applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 24 dofieldeffect FLDEFF_POKECENTER_HEAL waitfieldeffect FLDEFF_POKECENTER_HEAL special HealPlayerParty release end SevenIsland_House_Room2_Eventscript_Trigger:: goto_if_eq LEADER_READY, 0, EventScript_ReleaseEnd applymovement OBJ_EVENT_ID_PLAYER, SevenIsland_House_Room2_Movement_StepFastestRight waitmovement 0 switch LEADER_READY case LOCALID_BROCK, SevenIsland_House_Room2_Eventscript_BrockBattle case LOCALID_MISTY, SevenIsland_House_Room2_Eventscript_MistyBattle case LOCALID_LT_SURGE, SevenIsland_House_Room2_Eventscript_LtSurgeBattle case LOCALID_ERIKA, SevenIsland_House_Room2_Eventscript_ErikaBattle case LOCALID_KOGA, SevenIsland_House_Room2_Eventscript_KogaBattle case LOCALID_SABRINA, SevenIsland_House_Room2_Eventscript_SabrinaBattle case LOCALID_BLAINE, SevenIsland_House_Room2_Eventscript_BlaineBattle release end @ LEADER BROCK SevenIsland_House_Room2_Eventscript_Brock:: lock faceplayer goto_if_eq LEADER_READY, 1, SevenIsland_House_Room2_Eventscript_BrockReady goto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_BrockOtherLeaderReady msgbox SevenIsland_House_Room2_Text_Brock_Intro, MSGBOX_YESNO goto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_BrockDeclined closemessage getplayerxy X_COORD, Y_COORD call_if_eq Y_COORD, 6, SevenIsland_House_Room2_Eventscript_MoveBrockDown call_if_ne Y_COORD, 6, SevenIsland_House_Room2_Eventscript_MoveBrockLeft applymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_BrockToMat waitmovement 0 setobjectxyperm LOCALID_BROCK, 7, 5 setobjectmovementtypeinstant LOCALID_BROCK, MOVEMENT_TYPE_FACE_LEFT setvar LEADER_READY, LOCALID_BROCK msgbox SevenIsland_House_Room2_Text_BrockSquareUp, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Brock_Intro: .string "BROCK: …You sure look different\n" .string "from when we first met!\p" .string "I have a request for you, since\n" .string "you're now the CHAMPION.\p" .string "The truth is, GYM LEADERS have a\n" .string "right to challenge the CHAMPION!\p" .string "…Please allow me the privilege of\n" .string "facing you in battle once again!\p" .string "Allow me to show you the true\n" .string "rock-hard strength of my POKéMON!$" SevenIsland_House_Room2_Text_BrockSquareUp: .string "BROCK: Take your place and we'll\n" .string "start our battle!$" SevenIsland_House_Room2_Eventscript_BrockReady: msgbox SevenIsland_House_Room2_Text_BrockSquareUp, MSGBOX_DEFAULT release getplayerxy X_COORD, Y_COORD call_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront applymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 release end SevenIsland_House_Room2_Eventscript_BrockOtherLeaderReady: msgbox SevenIsland_House_Room2_Text_BrockOtherLeader, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_BrockOtherLeader: .string "BROCK: Don't underestimate the other\n" .string "GYM LEADERS, {PLAYER}.\p" .string "We'll use our best POKéMON against\n" .string "the POKéMON LEAGUE CHAMPION!$" SevenIsland_House_Room2_Eventscript_BrockDeclined:: msgbox SevenIsland_House_Room2_Text_Brock_Declined, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Brock_Declined: .string "I guess my POKéMON and I will keep\n" .string "training to stay rock-hard and tough!$" SevenIsland_House_Room2_Eventscript_MoveBrockDown: applymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_BrockAroundPlayer waitmovement 0 return SevenIsland_House_Room2_Eventscript_MoveBrockLeft: applymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_BrockRight waitmovement 0 return SevenIsland_House_Room2_Movement_BrockAroundPlayer: walk_down walk_right walk_right walk_up step_end SevenIsland_House_Room2_Movement_BrockRight: walk_right walk_right step_end SevenIsland_House_Room2_Movement_BrockToMat: walk_right walk_right walk_right walk_right walk_right walk_up walk_in_place_faster_left step_end SevenIsland_House_Room2_Eventscript_BrockBattle: setvar TYPE, SET_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_BROCK callnative UseBattleHouseVar applymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 0 msgbox SevenIsland_House_Room2_Text_BrockBeforeBattle, MSGBOX_DEFAULT release callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeBrockBattle trainerbattle_no_intro TRAINER_BROCK_REMATCH, SevenIsland_House_Room2_Text_BrockLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_BrockExit release end SevenIsland_House_Room2_Text_BrockBeforeBattle: .string "BROCK: No matter what kind of\n" .string "opponent you may be, my ROCK-type\l" .string "POKéMON will take you on!\p" .string "That's the promise of my\n" .string "rock-hard will!$" SevenIsland_House_Room2_Text_BrockLoss: .string "BROCK: I knew you were strong,\n" .string "but this…$" SevenIsland_House_Room2_Eventscript_ChallengeBrockBattle: trainerbattle_no_intro TRAINER_BROCK_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_BrockLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_BrockExit release end SevenIsland_House_Room2_Eventscript_BrockExit: applymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 0 msgbox SevenIsland_House_Room2_Text_BrockExit, MSGBOX_DEFAULT release applymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_LeaderExits waitmovement 0 playse SE_EXIT setvar LEADER_READY, 0 removeobject LOCALID_BROCK release end SevenIsland_House_Room2_Text_BrockExit: .string "BROCK: I have other ambitions that\n" .string "I've chosen to postpone for a bit.\p" .string "Right now I'm more interested in\n" .string "training to grow strong enough to\l" .string "one day face and defeat you!\p" .string "I should be getting back to my GYM.\n" .string "I look forward to our next battle.$" @ LEADER MISTY SevenIsland_House_Room2_Eventscript_Misty:: lock faceplayer goto_if_eq LEADER_READY, 2, SevenIsland_House_Room2_Eventscript_MistyReady goto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_MistyOtherLeaderReady msgbox SevenIsland_House_Room2_Text_Misty_Intro, MSGBOX_YESNO goto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_MistyDeclined closemessage getplayerxy X_COORD, Y_COORD call_if_eq Y_COORD, 3, SevenIsland_House_Room2_Eventscript_MoveMistyRight call_if_ne Y_COORD, 3, SevenIsland_House_Room2_Eventscript_MoveMistyDown setobjectxyperm LOCALID_MISTY, 7, 5 setobjectmovementtypeinstant LOCALID_MISTY, MOVEMENT_TYPE_FACE_LEFT setvar LEADER_READY, LOCALID_MISTY msgbox SevenIsland_House_Room2_Text_MistySquareUp, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Misty_Intro: .string "MISTY: I heard an interesting\n" .string "rumor!\p" .string "Not only did you defeat those\n" .string "TEAM ROCKET guys, but you battled\l" .string "that other kid from PALLET TOWN\l" .string "to become the CHAMPION!\p" .string "Argh!\n" .string "I just can't take it any more!\p" .string "I just absolutely have to battle\n" .string "you again!\l" .string "You got that? No refusing!$" SevenIsland_House_Room2_Text_MistySquareUp: .string "MISTY: Stand opposite me and\n" .string "we'll get started!$" SevenIsland_House_Room2_Eventscript_MistyReady: msgbox SevenIsland_House_Room2_Text_MistySquareUp, MSGBOX_DEFAULT release getplayerxy X_COORD, Y_COORD call_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront applymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 release end SevenIsland_House_Room2_Eventscript_MistyOtherLeaderReady: msgbox SevenIsland_House_Room2_Text_MistyOtherLeader, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_MistyOtherLeader: .string "MISTY: The lady upstairs isn't the\n" .string "only one who likes seeing battles.\p" .string "I hope you'll use a WATER-type\n" .string "so I can see how you handle them!$" SevenIsland_House_Room2_Eventscript_MistyDeclined:: msgbox SevenIsland_House_Room2_Text_Misty_Declined, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Misty_Declined: .string "But I said no refusing!\n" .string "Argh, fine…\p" .string "My new policy on POKéMON is to\n" .string "train hard to defeat you!\p" .string "When we finally have our rematch,\n" .string "we'll overwhelm you!$" SevenIsland_House_Room2_Eventscript_MoveMistyRight: applymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_MistyAroundPlayer waitmovement 0 return SevenIsland_House_Room2_Eventscript_MoveMistyDown: applymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_MistyDownToMat waitmovement 0 return SevenIsland_House_Room2_Movement_MistyAroundPlayer: walk_right walk_down walk_down walk_down walk_right walk_in_place_faster_left step_end SevenIsland_House_Room2_Movement_MistyDownToMat: walk_down walk_down walk_down walk_right walk_right walk_in_place_faster_left step_end SevenIsland_House_Room2_Eventscript_MistyBattle: setvar TYPE, SET_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_MISTY callnative UseBattleHouseVar applymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 1 msgbox SevenIsland_House_Room2_Text_MistyBeforeBattle, MSGBOX_DEFAULT release callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeMistyBattle trainerbattle_no_intro TRAINER_MISTY_REMATCH, SevenIsland_House_Room2_Text_MistyLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_MistyExit release end SevenIsland_House_Room2_Text_MistyBeforeBattle: .string "MISTY: My adorable POKéMON are\n" .string "ready to take you on!\p" .string "The ultimate offense of WATER-type\n" .string "POKéMON! I hope you're ready!$" SevenIsland_House_Room2_Text_MistyLoss: .string "MISTY: Hmph!\nHow annoying!$" SevenIsland_House_Room2_Eventscript_ChallengeMistyBattle: trainerbattle_no_intro TRAINER_MISTY_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_MistyLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_MistyExit release end SevenIsland_House_Room2_Eventscript_MistyExit: applymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 1 msgbox SevenIsland_House_Room2_Text_MistyExit, MSGBOX_DEFAULT release applymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_LeaderExits waitmovement 0 playse SE_EXIT setvar LEADER_READY, 0 removeobject LOCALID_MISTY release end SevenIsland_House_Room2_Text_MistyExit: .string "MISTY: I lost…\p" .string "I need to try swimming around in my\n" .string "GYM for a bit so that I can clear\l" .string "my head of these feelings.\p" .string "…I definitely won't lose next time!$" @ LEADER LTSURGE SevenIsland_House_Room2_Eventscript_LtSurge:: lock faceplayer goto_if_eq LEADER_READY, 3, SevenIsland_House_Room2_Eventscript_LtSurgeReady goto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_LtSurgeOtherLeaderReady msgbox SevenIsland_House_Room2_Text_LtSurge_Intro, MSGBOX_YESNO goto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_LtSurgeDeclined closemessage getplayerxy X_COORD, Y_COORD call_if_eq Y_COORD, 5, SevenIsland_House_Room2_Eventscript_MoveLtSurgeLeft call_if_ne Y_COORD, 5, SevenIsland_House_Room2_Eventscript_MoveLtSurgeDown setobjectxyperm LOCALID_LT_SURGE, 7, 5 setobjectmovementtypeinstant LOCALID_LT_SURGE, MOVEMENT_TYPE_FACE_LEFT setvar LEADER_READY, LOCALID_LT_SURGE msgbox SevenIsland_House_Room2_Text_LtSurgeSquareUp, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_LtSurge_Intro: .string "LT. SURGE: Hey there, kid!\p" .string "Pretty shocking you made it through\n" .string "the POKéMON LEAGUE!\p" .string "No doubt some ELECTRIC-types\n" .string "had a hand in that, right?\p" .string "All right, then.\p" .string "How about you show me what kind\n" .string "of POKéMON you've raised?$" SevenIsland_House_Room2_Text_LtSurgeSquareUp: .string "LT. SURGE: Fall in, soldier!\n" .string "We'll short your POKéMON out!$" SevenIsland_House_Room2_Eventscript_LtSurgeReady: msgbox SevenIsland_House_Room2_Text_LtSurgeSquareUp, MSGBOX_DEFAULT release getplayerxy X_COORD, Y_COORD call_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront applymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 release end SevenIsland_House_Room2_Eventscript_LtSurgeOtherLeaderReady: msgbox SevenIsland_House_Room2_Text_LtSurgeOtherLeader, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_LtSurgeOtherLeader: .string "LT. SURGE: The other GYM LEADERS\n" .string "may not have the discipline that\l" .string "I do, but they train just as hard.$" SevenIsland_House_Room2_Eventscript_LtSurgeDeclined:: msgbox SevenIsland_House_Room2_Text_LtSurge_Declined, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_LtSurge_Declined: .string "Hahaha!\n" .string "Afraid we'd fry you?\p" .string "If you let me keep training my\n" .string "team, we'll be even harder to beat!$" SevenIsland_House_Room2_Eventscript_MoveLtSurgeLeft: applymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_LtSurgeAroundPlayer waitmovement 0 return SevenIsland_House_Room2_Eventscript_MoveLtSurgeDown: applymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_LtSurgeToMat waitmovement 0 return SevenIsland_House_Room2_Movement_LtSurgeAroundPlayer: walk_left walk_down walk_in_place_faster_left step_end SevenIsland_House_Room2_Movement_LtSurgeToMat: walk_down walk_left walk_in_place_faster_left step_end SevenIsland_House_Room2_Eventscript_LtSurgeBattle: setvar TYPE, SET_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_LTSURGE callnative UseBattleHouseVar applymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 0 msgbox SevenIsland_House_Room2_Text_LtSurgeBeforeBattle, MSGBOX_DEFAULT release callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeLtSurgeBattle trainerbattle_no_intro TRAINER_LT_SURGE_REMATCH, SevenIsland_House_Room2_Text_LtSurgeLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_LtSurgeExit release end SevenIsland_House_Room2_Text_LtSurgeBeforeBattle: .string "LT. SURGE: Trainers like us have\n" .string "no need for words!\p" .string "Let's go, kid!$" SevenIsland_House_Room2_Text_LtSurgeLoss: .string "LT. SURGE: Absolutely shocking!$" SevenIsland_House_Room2_Eventscript_ChallengeLtSurgeBattle: trainerbattle_no_intro TRAINER_LT_SURGE_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_LtSurgeLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_LtSurgeExit release end SevenIsland_House_Room2_Eventscript_LtSurgeExit: applymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 0 msgbox SevenIsland_House_Room2_Text_LtSurgeExit, MSGBOX_DEFAULT release applymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_LeaderExits waitmovement 0 playse SE_EXIT setvar LEADER_READY, 0 removeobject LOCALID_LT_SURGE release end SevenIsland_House_Room2_Text_LtSurgeExit: .string "LT. SURGE: Looks like there's still\n" .string "a gap between our skill levels that\l" .string "I need to close, kid!\p" .string "This is the first time I've felt\n" .string "like this since I left home!\p" .string "I have to return to base.\n" .string "I can't leave my troops without\l" .string "their CO for long!$" @ LEADER ERIKA SevenIsland_House_Room2_Eventscript_Erika:: lock faceplayer goto_if_eq LEADER_READY, 4, SevenIsland_House_Room2_Eventscript_ErikaReady goto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_ErikaOtherLeaderReady msgbox SevenIsland_House_Room2_Text_Erika_Intro, MSGBOX_YESNO goto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_ErikaDeclined closemessage getplayerxy X_COORD, Y_COORD call_if_eq Y_COORD, 3, SevenIsland_House_Room2_Eventscript_MoveErikaRight call_if_ne Y_COORD, 3, SevenIsland_House_Room2_Eventscript_MoveErikaDown setobjectxyperm LOCALID_ERIKA, 7, 5 setobjectmovementtypeinstant LOCALID_ERIKA, MOVEMENT_TYPE_FACE_LEFT setvar LEADER_READY, LOCALID_ERIKA msgbox SevenIsland_House_Room2_Text_ErikaSquareUp, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Erika_Intro: .string "ERIKA: Oh, if it isn't the one who's\n" .string "been trying to fill the POKéDEX.\p" .string "I hope things have been going well\n" .string "for you since our last encounter.\p" .string "…I see. You've certainly been busy.\n" .string "I'm not particularly fond of those\l" .string "kinds of public things…\p" .string "However, battles are different.\n" .string "That's what you came for, isn't it?$" SevenIsland_House_Room2_Text_ErikaSquareUp: .string "ERIKA: Plant yourself over there\n" .string "and we'll begin.$" SevenIsland_House_Room2_Eventscript_ErikaReady: msgbox SevenIsland_House_Room2_Text_ErikaSquareUp, MSGBOX_DEFAULT release getplayerxy X_COORD, Y_COORD call_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront applymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 release end SevenIsland_House_Room2_Eventscript_ErikaOtherLeaderReady: msgbox SevenIsland_House_Room2_Text_ErikaOtherLeader, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_ErikaOtherLeader: .string "ERIKA: …Zzz…zzz…\n" .string "Oh, you're preparing for a battle?$" SevenIsland_House_Room2_Eventscript_ErikaDeclined:: msgbox SevenIsland_House_Room2_Text_Erika_Declined, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Erika_Declined: .string "… … … …$" SevenIsland_House_Room2_Eventscript_MoveErikaRight: applymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_ErikaAroundPlayer waitmovement 0 return SevenIsland_House_Room2_Eventscript_MoveErikaDown: applymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_ErikaDownToMat waitmovement 0 return SevenIsland_House_Room2_Movement_ErikaAroundPlayer: walk_right walk_down walk_down walk_down walk_right walk_right walk_right walk_right walk_right walk_in_place_faster_left step_end SevenIsland_House_Room2_Movement_ErikaDownToMat: walk_down walk_down walk_down walk_right walk_right walk_right walk_right walk_right walk_right walk_in_place_faster_left step_end SevenIsland_House_Room2_Eventscript_ErikaBattle: setvar TYPE, SET_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_ERIKA callnative UseBattleHouseVar applymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 1 msgbox SevenIsland_House_Room2_Text_ErikaBeforeBattle, MSGBOX_DEFAULT release callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeErikaBattle trainerbattle_no_intro TRAINER_ERIKA_REMATCH, SevenIsland_House_Room2_Text_ErikaLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_ErikaExit release end SevenIsland_House_Room2_Text_ErikaBeforeBattle: .string "ERIKA: I graciously accept your\n" .string "challenge. I shall not lose!$" SevenIsland_House_Room2_Text_ErikaLoss: .string "ERIKA: Oh!\n" .string "It appears it is my loss… … … …$" SevenIsland_House_Room2_Eventscript_ChallengeErikaBattle: trainerbattle_no_intro TRAINER_ERIKA_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_ErikaLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_ErikaExit release end SevenIsland_House_Room2_Eventscript_ErikaExit: applymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 1 msgbox SevenIsland_House_Room2_Text_ErikaExit, MSGBOX_DEFAULT release applymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_LeaderExits waitmovement 0 playse SE_EXIT setvar LEADER_READY, 0 removeobject LOCALID_ERIKA release end SevenIsland_House_Room2_Text_ErikaExit: .string "ERIKA: Simply marvelous.\p" .string "That was an effort worthy of\n" .string "at least ten RAINBOWBADGES.\p" .string "I feel inspired by our rematch.\n" .string "I should return to CELADON and\l" .string "tend to my flowers.\p" .string "…Until next time, {PLAYER}.$" @ LEADER KOGA SevenIsland_House_Room2_Eventscript_Koga:: lock faceplayer goto_if_eq LEADER_READY, 5, SevenIsland_House_Room2_Eventscript_KogaReady goto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_KogaOtherLeaderReady msgbox SevenIsland_House_Room2_Text_Koga_Intro, MSGBOX_YESNO goto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_KogaDeclined closemessage getplayerxy X_COORD, Y_COORD call_if_eq Y_COORD, 7, SevenIsland_House_Room2_Eventscript_MoveKogaRight call_if_ne Y_COORD, 7, SevenIsland_House_Room2_Eventscript_MoveKogaUp setobjectxyperm LOCALID_KOGA, 7, 5 setobjectmovementtypeinstant LOCALID_KOGA, MOVEMENT_TYPE_FACE_LEFT setvar LEADER_READY, LOCALID_KOGA msgbox SevenIsland_House_Room2_Text_KogaSquareUp, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Koga_Intro: .string "KOGA: Fwahahaha!\n" .string "If it isn't the child.\p" .string "It seems we are fated to meet\n" .string "again and again.\p" .string "You have come at a truly opportune\n" .string "time; I was just thinking that I\l" .string "wanted to test my newly-refined\l" .string "sinister techniques… in a battle\l" .string "that will end in your utter defeat!\p" .string "Fwahahaha!\n" .string "What do you say?$" SevenIsland_House_Room2_Text_KogaSquareUp: .string "KOGA: Ready yourself, child!$" SevenIsland_House_Room2_Eventscript_KogaReady: msgbox SevenIsland_House_Room2_Text_KogaSquareUp, MSGBOX_DEFAULT release getplayerxy X_COORD, Y_COORD call_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront applymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 release end SevenIsland_House_Room2_Eventscript_KogaOtherLeaderReady: msgbox SevenIsland_House_Room2_Text_KogaOtherLeader, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_KogaOtherLeader: .string "KOGA: I should bring my daughter\n" .string "here to learn from the battle\l" .string "styles of the other GYM LEADERS.$" SevenIsland_House_Room2_Eventscript_KogaDeclined:: msgbox SevenIsland_House_Room2_Text_Koga_Declined, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Koga_Declined: .string "What? Hmph.\p" .string "How did you beat the POKéMON\n" .string "LEAGUE with such little resolve?$" SevenIsland_House_Room2_Eventscript_MoveKogaRight: applymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_KogaAroundPlayer waitmovement 0 return SevenIsland_House_Room2_Eventscript_MoveKogaUp: applymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_KogaToMat waitmovement 0 return SevenIsland_House_Room2_Movement_KogaAroundPlayer: walk_right walk_up walk_up walk_up walk_left walk_in_place_faster_left step_end SevenIsland_House_Room2_Movement_KogaToMat: walk_up walk_up walk_up walk_in_place_faster_left step_end SevenIsland_House_Room2_Eventscript_KogaBattle: setvar TYPE, SET_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_KOGA callnative UseBattleHouseVar applymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 0 msgbox SevenIsland_House_Room2_Text_KogaBeforeBattle, MSGBOX_DEFAULT release callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeKogaBattle trainerbattle_no_intro TRAINER_KOGA_REMATCH, SevenIsland_House_Room2_Text_KogaLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_KogaExit release end SevenIsland_House_Room2_Text_KogaBeforeBattle: .string "KOGA: Fwahahaha!\p" .string "Today I'll not only defeat you,\n" .string "but I will also demonstrate my\l" .string "fatherly dignity to my daughter!$" SevenIsland_House_Room2_Text_KogaLoss: .string "KOGA: …If I am not strong enough\n" .string "to defeat you now, there is but\l" .string "one thing to do.\p" .string "I must hone my skills.$" SevenIsland_House_Room2_Eventscript_ChallengeKogaBattle: trainerbattle_no_intro TRAINER_KOGA_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_KogaLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_KogaExit release end SevenIsland_House_Room2_Eventscript_KogaExit: applymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 0 msgbox SevenIsland_House_Room2_Text_KogaExit, MSGBOX_DEFAULT release applymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_LeaderExits waitmovement 0 playse SE_EXIT setvar LEADER_READY, 0 removeobject LOCALID_KOGA release end SevenIsland_House_Room2_Text_KogaExit: .string "KOGA: With TRAINERS like you and\n" .string "{RIVAL}, the POKéMON LEAGUE must\l" .string "be a place of formidable strength!\l" .string "It's truly a thing to be proud of!\p" .string "As it so happens, I have been\n" .string "thinking of aiming to join the\l" .string "ELITE FOUR myself…\p" .string "…But I'll never get there if I\n" .string "neglect my duties as a GYM LEADER!\p" .string "I must travel back to FUCHSIA CITY.\n" .string "Farewell, child.$" @ LEADER SABRINA SevenIsland_House_Room2_Eventscript_Sabrina:: lock faceplayer goto_if_eq LEADER_READY, 6, SevenIsland_House_Room2_Eventscript_SabrinaReady goto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_SabrinaOtherLeaderReady msgbox SevenIsland_House_Room2_Text_Sabrina_Intro, MSGBOX_YESNO goto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_SabrinaDeclined closemessage getplayerxy X_COORD, Y_COORD call_if_eq Y_COORD, 6, SevenIsland_House_Room2_Eventscript_MoveSabrinaRight call_if_ne Y_COORD, 6, SevenIsland_House_Room2_Eventscript_MoveSabrinaUp setobjectxyperm LOCALID_SABRINA, 7, 5 setobjectmovementtypeinstant LOCALID_SABRINA, MOVEMENT_TYPE_FACE_LEFT setvar LEADER_READY, LOCALID_SABRINA msgbox SevenIsland_House_Room2_Text_SabrinaSquareUp, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Sabrina_Intro: .string "SABRINA: …It's true that psychic\n" .string "power is a potent ability.\p" .string "However, some things cannot be\n" .string "overcome with that power alone.\p" .string "I finally understand that now, after\n" .string "losing to you in our last battle.\p" .string "I won't be relying on just psychic\n" .string "power this time.\p" .string "My true strength… my true self…\n" .string "Allow me to test them against you!$" SevenIsland_House_Room2_Text_SabrinaSquareUp: .string "SABRINA: You are fated to stand\n" .string "over there for this battle.$" SevenIsland_House_Room2_Eventscript_SabrinaReady: msgbox SevenIsland_House_Room2_Text_SabrinaSquareUp, MSGBOX_DEFAULT release getplayerxy X_COORD, Y_COORD call_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront applymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 release end SevenIsland_House_Room2_Eventscript_SabrinaOtherLeaderReady: msgbox SevenIsland_House_Room2_Text_SabrinaOtherLeader, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_SabrinaOtherLeader: .string "SABRINA: I don't need to peer into\n" .string "the future to know who will win\l" .string "this match.$" SevenIsland_House_Room2_Eventscript_SabrinaDeclined:: msgbox SevenIsland_House_Room2_Text_Sabrina_Declined, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Sabrina_Declined: .string "I foresaw that you would decline,\n" .string "but we will battle again eventually.$" SevenIsland_House_Room2_Eventscript_MoveSabrinaRight: applymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_SabrinaAroundPlayer waitmovement 0 return SevenIsland_House_Room2_Eventscript_MoveSabrinaUp: applymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_SabrinaUpToMat waitmovement 0 return SevenIsland_House_Room2_Movement_SabrinaAroundPlayer: walk_right walk_up walk_up walk_right walk_right walk_right walk_in_place_faster_left step_end SevenIsland_House_Room2_Movement_SabrinaUpToMat: walk_up walk_up walk_right walk_right walk_right walk_right walk_in_place_faster_left step_end SevenIsland_House_Room2_Eventscript_SabrinaBattle: setvar TYPE, SET_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_SABRINA callnative UseBattleHouseVar applymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 1 msgbox SevenIsland_House_Room2_Text_SabrinaBeforeBattle, MSGBOX_DEFAULT release callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeSabrinaBattle trainerbattle_no_intro TRAINER_SABRINA_REMATCH, SevenIsland_House_Room2_Text_SabrinaLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_SabrinaExit release end SevenIsland_House_Room2_Text_SabrinaBeforeBattle: .string "SABRINA: I foresaw that we would\n" .string "be here by looking into the future.\p" .string "But I intentionally didn't look to\n" .string "see who will win our battle.\p" .string "Let's find out together!$" SevenIsland_House_Room2_Text_SabrinaLoss: .string "SABRINA: I won't encounter another\n" .string "TRAINER like you for around another\l" .string "three years.$" SevenIsland_House_Room2_Eventscript_ChallengeSabrinaBattle: trainerbattle_no_intro TRAINER_SABRINA_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_SabrinaLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_SabrinaExit release end SevenIsland_House_Room2_Eventscript_SabrinaExit: applymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 1 msgbox SevenIsland_House_Room2_Text_SabrinaExit, MSGBOX_DEFAULT release applymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_LeaderExits waitmovement 0 playse SE_EXIT setvar LEADER_READY, 0 removeobject LOCALID_SABRINA release end SevenIsland_House_Room2_Text_SabrinaExit: .string "SABRINA: There was once a time\n" .string "when I was shocked to lose to you.\l" .string "That feeling is gone now.\p" .string "It's been replaced with a desire\n" .string "to grow strong and live freely,\l" .string "as you do.\p" .string "If I don't make it back to my GYM\n" .string "in the near future, I will miss\l" .string "a challenger.\p" .string "Don't worry, {PLAYER}.\n" .string "We will battle again soon.$" @ LEADER BLAINE SevenIsland_House_Room2_Eventscript_Blaine:: lock faceplayer goto_if_eq LEADER_READY, 7, SevenIsland_House_Room2_Eventscript_BlaineReady goto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_BlaineOtherLeaderReady msgbox SevenIsland_House_Room2_Text_Blaine_Intro, MSGBOX_YESNO goto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_BlaineDeclined closemessage getplayerxy X_COORD, Y_COORD call_if_eq Y_COORD, 5, SevenIsland_House_Room2_Eventscript_MoveBlaineLeft call_if_ne Y_COORD, 5, SevenIsland_House_Room2_Eventscript_MoveBlaineUp setobjectxyperm LOCALID_BLAINE, 7, 5 setobjectmovementtypeinstant LOCALID_BLAINE, MOVEMENT_TYPE_FACE_LEFT setvar LEADER_READY, LOCALID_BLAINE msgbox SevenIsland_House_Room2_Text_BlaineSquareUp, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Blaine_Intro: .string "BLAINE: Hah!\n" .string "Well done, becoming CHAMPION!\p" .string "I'm taking the opportunity to train\n" .string "with the other LEADERS here, but\l" .string "I can't stay away from CINNABAR\l" .string "for too long.\p" .string "The volcano beneath my GYM is\n" .string "showing signs of waking up!\p" .string "But since you came all this way,\n" .string "we should have a red-hot battle!$" SevenIsland_House_Room2_Text_BlaineSquareUp: .string "BLAINE: Square up, challenger!$" SevenIsland_House_Room2_Eventscript_BlaineReady: msgbox SevenIsland_House_Room2_Text_BlaineSquareUp, MSGBOX_DEFAULT release getplayerxy X_COORD, Y_COORD call_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront applymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 release end SevenIsland_House_Room2_Eventscript_BlaineOtherLeaderReady: msgbox SevenIsland_House_Room2_Text_BlaineOtherLeader, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_BlaineOtherLeader: .string "BLAINE: We GYM LEADERS battle\n" .string "each other all the time, but it's\l" .string "nice to have a dedicated space\l" .string "now that we can practice in.$" SevenIsland_House_Room2_Eventscript_BlaineDeclined:: msgbox SevenIsland_House_Room2_Text_Blaine_Declined, MSGBOX_DEFAULT release end SevenIsland_House_Room2_Text_Blaine_Declined: .string "No?\n" .string "But I'm all fired up!$" SevenIsland_House_Room2_Eventscript_MoveBlaineLeft: applymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_BlaineAroundPlayer waitmovement 0 return SevenIsland_House_Room2_Eventscript_MoveBlaineUp: applymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_BlaineUpToMat waitmovement 0 return SevenIsland_House_Room2_Movement_BlaineAroundPlayer: walk_left walk_up walk_left walk_left walk_in_place_faster_left step_end SevenIsland_House_Room2_Movement_BlaineUpToMat: walk_up walk_left walk_left walk_left walk_in_place_faster_left step_end SevenIsland_House_Room2_Eventscript_BlaineBattle: setvar TYPE, SET_VISITOR_STATE setvar ARGUMENT, FAMECHECKER_BLAINE callnative UseBattleHouseVar applymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 0 msgbox SevenIsland_House_Room2_Text_BlaineBeforeBattle, MSGBOX_DEFAULT release callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeBlaineBattle trainerbattle_no_intro TRAINER_BLAINE_REMATCH, SevenIsland_House_Room2_Text_BlaineLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_BlaineExit release end SevenIsland_House_Room2_Text_BlaineBeforeBattle: .string "BLAINE: Here's a quiz for you!\n" .string "Whose POKéMON are about to be\l" .string "reduced to ashes?$" SevenIsland_House_Room2_Text_BlaineLoss: .string "BLAINE: …Apparently mine, hah!$" SevenIsland_House_Room2_Eventscript_ChallengeBlaineBattle: trainerbattle_no_intro TRAINER_BLAINE_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_BlaineLoss setvar TYPE, SET_LEVEL_GROWTH callnative UseBattleHouseVar goto SevenIsland_House_Room2_Eventscript_BlaineExit release end SevenIsland_House_Room2_Eventscript_BlaineExit: applymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_StepFastestLeft waitmovement 0 textcolor 0 msgbox SevenIsland_House_Room2_Text_BlaineExit, MSGBOX_DEFAULT release applymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_LeaderExits waitmovement 0 playse SE_EXIT setvar LEADER_READY, 0 removeobject LOCALID_BLAINE release end SevenIsland_House_Room2_Text_BlaineExit: .string "BLAINE: Hah!\n" .string "What a rematch!\p" .string "I feel a fire burning within me,\n" .string "the need to keep getting stronger!\p" .string "CINNABAR ISLAND's volcano is getting\n" .string "more and more active every day…\p" .string "I should head back and keep an\n" .string "eye on it.$" SevenIsland_House_Room2_Eventscript_CheckInFront: goto_if_eq Y_COORD, 5, EventScript_ReleaseEnd return SevenIsland_House_Room2_Movement_LeaderExits: walk_up walk_left walk_left walk_left walk_left walk_up walk_up walk_up delay_4 set_invisible step_end SevenIsland_House_Room2_Movement_StepFastestLeft: walk_in_place_faster_left step_end SevenIsland_House_Room2_Movement_StepFastestRight: walk_in_place_faster_right step_end ================================================ FILE: data/maps/SevenIsland_Mart/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_MART", "name": "SevenIsland_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SEVEN_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_Mart_EventScript_Lass", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "x": 9, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_Mart_EventScript_Fisher", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "x": 5, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_Mart_EventScript_Hiker", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_Mart/scripts.inc ================================================ SevenIsland_Mart_MapScripts:: .byte 0 SevenIsland_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart SevenIsland_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 SevenIsland_Mart_Items:: .2byte ITEM_ULTRA_BALL .2byte ITEM_GREAT_BALL .2byte ITEM_FULL_RESTORE .2byte ITEM_MAX_POTION .2byte ITEM_HYPER_POTION .2byte ITEM_REVIVE .2byte ITEM_FULL_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_MAX_REPEL .2byte ITEM_NONE release end SevenIsland_Mart_EventScript_Lass:: msgbox SevenIsland_Mart_Text_MonHavePersonalitiesOfTheirOwn, MSGBOX_NPC end SevenIsland_Mart_EventScript_Hiker:: msgbox SevenIsland_Mart_Text_PreparationsCompleteForRuins, MSGBOX_NPC end SevenIsland_Mart_EventScript_Fisher:: msgbox SevenIsland_Mart_Text_NeedToFishOnSevenIsland, MSGBOX_NPC end ================================================ FILE: data/maps/SevenIsland_Mart/text.inc ================================================ SevenIsland_Mart_Text_MonHavePersonalitiesOfTheirOwn:: .string "POKéMON have personalities of their\n" .string "own, just like people.\p" .string "My PIKACHU has a HASTY nature,\n" .string "so it grew to be a speedy POKéMON.$" SevenIsland_Mart_Text_PreparationsCompleteForRuins:: .string "Okay, preparations are complete\n" .string "for me to explore the RUINS.$" SevenIsland_Mart_Text_NeedToFishOnSevenIsland:: .string "I need to fish on SEVEN ISLAND.\p" .string "That will complete my fishing tour\n" .string "of the SEVII ISLANDS.\p" .string "I'd better stock up on some\n" .string "POKé BALLS first, though.$" ================================================ FILE: data/maps/SevenIsland_PokemonCenter_1F/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_POKEMON_CENTER_1F", "name": "SevenIsland_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SEVEN_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 11, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_PokemonCenter_1F_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_PokemonCenter_1F_EventScript_Sailor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_PokemonCenter_1F_EventScript_Beauty", "flag": "0" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 3, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_PokemonCenter_1F_EventScript_PokemonJournal", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 2, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_PokemonCenter_1F_EventScript_PokemonJournal", "flag": "FLAG_HIDE_POSTGAME_GOSSIPERS" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND", "dest_warp_id": "2" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_SEVEN_ISLAND_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_PokemonCenter_1F/scripts.inc ================================================ SevenIsland_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 SevenIsland_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_SEVEN_ISLAND end SevenIsland_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end SevenIsland_PokemonCenter_1F_EventScript_OldMan:: msgbox SevenIsland_PokemonCenter_1F_Text_EventsDependingOnConnections, MSGBOX_NPC end SevenIsland_PokemonCenter_1F_EventScript_Sailor:: msgbox SevenIsland_PokemonCenter_1F_Text_DidYouRideSeagallopHere, MSGBOX_NPC end SevenIsland_PokemonCenter_1F_EventScript_Beauty:: msgbox SevenIsland_PokemonCenter_1F_Text_CheckOutTrainerTower, MSGBOX_NPC end ================================================ FILE: data/maps/SevenIsland_PokemonCenter_1F/text.inc ================================================ SevenIsland_PokemonCenter_1F_Text_EventsDependingOnConnections:: .string "On this island, different events\n" .string "occur depending on connections.\p" .string "What are those connections?\p" .string "They are for you to discover on\n" .string "your own.$" SevenIsland_PokemonCenter_1F_Text_DidYouRideSeagallopHere:: .string "Did you ride a SEAGALLOP ferry\n" .string "to get here?\p" .string "There are at least ten of those\n" .string "high-speed ships.\p" .string "I don't know where they all go,\n" .string "though.$" SevenIsland_PokemonCenter_1F_Text_CheckOutTrainerTower:: .string "If you're confident, you should\n" .string "check out TRAINER TOWER.$" ================================================ FILE: data/maps/SevenIsland_PokemonCenter_2F/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_POKEMON_CENTER_2F", "name": "SevenIsland_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SEVEN_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_SEVEN_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_PokemonCenter_2F/scripts.inc ================================================ SevenIsland_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS SevenIsland_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end SevenIsland_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end SevenIsland_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/SevenIsland_SevaultCanyon/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_SEVAULT_CANYON", "name": "SevenIsland_SevaultCanyon", "layout": "LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON", "music": "MUS_ROUTE110", "region_map_section": "MAPSEC_SEVAULT_CANYON", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": -48, "map": "MAP_SEVEN_ISLAND_TANOBY_RUINS" }, { "direction": "left", "offset": -19, "map": "MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BATTLE_GIRL", "in_connection": false, "x": 13, "y": 44, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SevenIsland_SevaultCanyon_EventScript_Cyndy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TAMER", "x": 13, "y": 37, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SevenIsland_SevaultCanyon_EventScript_Evan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEMON_RANGER_M", "x": 3, "y": 36, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SevenIsland_SevaultCanyon_EventScript_Jackson", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEMON_RANGER_F", "x": 3, "y": 37, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SevenIsland_SevaultCanyon_EventScript_Katelyn", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 7, "y": 57, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_SevaultCanyon_EventScript_Leroy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 11, "y": 64, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_SevaultCanyon_EventScript_Michelle", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 14, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_SevaultCanyon_EventScript_Lex", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 14, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_SevaultCanyon_EventScript_Nya", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 3, "y": 42, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_12" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 13, "y": 48, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 7, "y": 45, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_13" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 12, "y": 48, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_15" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 15, "y": 47, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_16" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 16, "y": 48, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_17" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 17, "y": 48, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCK_SMASH_ROCK", "in_connection": false, "x": 11, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_RockSmash", "flag": "FLAG_TEMP_1B" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 18, "y": 46, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_SevaultCanyon_EventScript_ItemKingsRock", "flag": "FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_KINGS_ROCK" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 7, "y": 39, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_SevaultCanyon_EventScript_ItemMaxElixir", "flag": "FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_MAX_ELIXIR" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_SevaultCanyon_EventScript_ItemNugget", "flag": "FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_NUGGET" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 8, "y": 27, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_SevaultCanyon_EventScript_BlackBelt", "flag": "0" } ], "warp_events": [ { "x": 7, "y": 18, "elevation": 5, "dest_map": "MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY", "dest_warp_id": "0" }, { "x": 14, "y": 62, "elevation": 0, "dest_map": "MAP_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 15, "y": 67, "elevation": 3, "item": "ITEM_CHERI_BERRY", "flag": "FLAG_HIDDEN_ITEM_SEVEN_ISLAND_SEVAULT_CANYON_CHERI_BERRY", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 16, "y": 72, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_SevaultCanyon_EventScript_RouteSign" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SevenIsland_SevaultCanyon/scripts.inc ================================================ SevenIsland_SevaultCanyon_MapScripts:: .byte 0 SevenIsland_SevaultCanyon_EventScript_RouteSign:: msgbox SevenIsland_SevaultCanyon_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/SevenIsland_SevaultCanyon/text.inc ================================================ SevenIsland_SevaultCanyon_Text_CyndyIntro:: .string "My conditioning's in top form!$" SevenIsland_SevaultCanyon_Text_CyndyDefeat:: .string "Huh?\n" .string "Something's not right…$" SevenIsland_SevaultCanyon_Text_CyndyPostBattle:: .string "The way I am now, I may have to\n" .string "hold off on TRAINER TOWER…$" SevenIsland_SevaultCanyon_Text_EvanIntro:: .string "It doesn't matter if you happen to\n" .string "have the strongest POKéMON…\p" .string "It doesn't mean a thing if you don't\n" .string "know how to use them properly!$" SevenIsland_SevaultCanyon_Text_EvanDefeat:: .string "You're a master at this.$" SevenIsland_SevaultCanyon_Text_EvanPostBattle:: .string "You see them every so often,\n" .string "TRAINERS with awesome POKéMON\l" .string "who have no idea what to do.\p" .string "Before training POKéMON, TRAINERS\n" .string "themselves need to grow up.$" SevenIsland_SevaultCanyon_Text_JacksonIntro:: .string "I work to protect the environment.\n" .string "In turn, nature protects me!$" SevenIsland_SevaultCanyon_Text_JacksonDefeat:: .string "Whoa! You're tough!\n" .string "How about protecting me?$" SevenIsland_SevaultCanyon_Text_JacksonPostBattle:: .string "From far out among the stars, our\n" .string "planet is just a drop of water.\p" .string "But we want to protect that drop\n" .string "of water for everyone.$" SevenIsland_SevaultCanyon_Text_KatelynIntro:: .string "Those shoes you have are pretty\n" .string "snazzy.$" SevenIsland_SevaultCanyon_Text_KatelynDefeat:: .string "You're hot stuff in spite of your\n" .string "cute looks.$" SevenIsland_SevaultCanyon_Text_KatelynPostBattle:: .string "Your mom bought those snazzy\n" .string "RUNNING SHOES for you?\p" .string "She must adore you.$" SevenIsland_SevaultCanyon_Text_LeroyIntro:: .string "You look strong.\n" .string "Let me battle you, please!$" SevenIsland_SevaultCanyon_Text_LeroyDefeat:: .string "I knew it!\n" .string "You're as tough as I thought!$" SevenIsland_SevaultCanyon_Text_LeroyPostBattle:: .string "The way you battle has given me\n" .string "a lot of useful data.\p" .string "Thanks so much!$" SevenIsland_SevaultCanyon_Text_MichelleIntro:: .string "I was given the best possible\n" .string "education to become this strong.\p" .string "I don't want to lose to anyone!$" SevenIsland_SevaultCanyon_Text_MichelleDefeat:: .string "Thank you. I feel like I've been\n" .string "set free by losing to you.$" SevenIsland_SevaultCanyon_Text_MichellePostBattle:: .string "For some reason, I get furious\n" .string "over the slightest thing.\p" .string "I'll calm myself by breathing\n" .string "deeply.$" SevenIsland_SevaultCanyon_Text_LexIntro:: .string "LEX: My darling NYA, together\n" .string "we could win!$" SevenIsland_SevaultCanyon_Text_LexDefeat:: .string "LEX: I seem to have been too\n" .string "careless…$" SevenIsland_SevaultCanyon_Text_LexPostBattle:: .string "LEX: I think it was a good\n" .string "experience for NYA.\p" .string "You have my gratitude.$" SevenIsland_SevaultCanyon_Text_LexNotEnoughMons:: .string "LEX: May I ask you to battle the\n" .string "both of us at the same time?$" SevenIsland_SevaultCanyon_Text_NyaIntro:: .string "NYA: I'll do my best so I won't\n" .string "drag down my mentor, LEX!$" SevenIsland_SevaultCanyon_Text_NyaDefeat:: .string "NYA: Oh, no…\n" .string "I'm so sorry, I…$" SevenIsland_SevaultCanyon_Text_NyaPostBattle:: .string "NYA: I think I'm going to need\n" .string "much more seasoning and tutoring\l" .string "under LEX…\p" .string "…So, LEX, please, may I stay with\n" .string "you like this?$" SevenIsland_SevaultCanyon_Text_NyaNotEnoughMons:: .string "NYA: I'm sorry, but may we battle\n" .string "in two-on-two style?$" SevenIsland_SevaultCanyon_Text_RouteSign:: .string "SEVAULT CANYON\n" .string "TANOBY RUINS AHEAD$" SevenIsland_SevaultCanyon_Text_BrunoTrainedWithBrawly:: .string "Training by oneself is certainly\n" .string "not a bad thing.\p" .string "But it's also not bad to aim for\n" .string "the top with a partner.\p" .string "Even BRUNO…\n" .string "He trained with a fellow by the\l" .string "name of BRAWLY before.$" ================================================ FILE: data/maps/SevenIsland_SevaultCanyon_Entrance/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE", "name": "SevenIsland_SevaultCanyon_Entrance", "layout": "LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE", "music": "MUS_ROUTE110", "region_map_section": "MAPSEC_CANYON_ENTRANCE", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_SEVEN_ISLAND" }, { "direction": "right", "offset": 19, "map": "MAP_SEVEN_ISLAND_SEVAULT_CANYON" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_AROMA_LADY", "x": 12, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "SevenIsland_SevaultCanyon_Entrance_EventScript_Miah", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNG_COUPLE_F", "x": 3, "y": 34, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_SevaultCanyon_Entrance_EventScript_Eve", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNG_COUPLE_M", "x": 4, "y": 34, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_SevaultCanyon_Entrance_EventScript_Jon", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEMON_RANGER_M", "x": 11, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SevenIsland_SevaultCanyon_Entrance_EventScript_Nicolas", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEMON_RANGER_F", "x": 10, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SevenIsland_SevaultCanyon_Entrance_EventScript_Madeline", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JUGGLER", "x": 11, "y": 17, "elevation": 5, "movement_type": "MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_SevaultCanyon_Entrance_EventScript_Mason", "flag": "0" }, { "type": "clone", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "x": 7, "y": -2, "target_local_id": 1, "target_map": "MAP_SEVEN_ISLAND" } ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 8, "y": 29, "elevation": 5, "item": "ITEM_RAWST_BERRY", "flag": "FLAG_HIDDEN_ITEM_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE_RAWST_BERRY", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 14, "y": 26, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_SevaultCanyon_Entrance_EventScript_RouteSign" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SevenIsland_SevaultCanyon_Entrance/scripts.inc ================================================ SevenIsland_SevaultCanyon_Entrance_MapScripts:: .byte 0 SevenIsland_SevaultCanyon_Entrance_EventScript_RouteSign:: msgbox SevenIsland_SevaultCanyon_Entrance_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/SevenIsland_SevaultCanyon_Entrance/text.inc ================================================ SevenIsland_SevaultCanyon_Entrance_Text_MiahIntro:: .string "Kyahaha!\n" .string "I'll flick you away effortlessly!$" SevenIsland_SevaultCanyon_Entrance_Text_MiahDefeat:: .string "Tch!\n" .string "Too strong for me!$" SevenIsland_SevaultCanyon_Entrance_Text_MiahPostBattle:: .string "What's that?\n" .string "I don't act the way I look?\p" .string "Heh, that's a part of my strategy!$" SevenIsland_SevaultCanyon_Entrance_Text_MasonIntro:: .string "Howdy!\n" .string "Are you a member of my fan club?$" SevenIsland_SevaultCanyon_Entrance_Text_MasonDefeat:: .string "Oh, so you're not a fan…\p" .string "Well, I can change that.\n" .string "Let me sing for you!$" SevenIsland_SevaultCanyon_Entrance_Text_MasonPostBattle:: .string "Lalalah…\n" .string "My POKéMON, I send them out,\l" .string "all the girls scream and shout!$" SevenIsland_SevaultCanyon_Entrance_Text_NicolasIntro:: .string "This island is too spread out…\n" .string "It's not easy patrolling the place.$" SevenIsland_SevaultCanyon_Entrance_Text_NicolasDefeat:: .string "Uh-huh…$" SevenIsland_SevaultCanyon_Entrance_Text_NicolasPostBattle:: .string "TRAINERS like you from cities,\n" .string "they sure are tough.\p" .string "You'll be headed for the TOWER,\n" .string "won't you?$" SevenIsland_SevaultCanyon_Entrance_Text_MadelineIntro:: .string "I punish people who abuse\n" .string "POKéMON!$" SevenIsland_SevaultCanyon_Entrance_Text_MadelineDefeat:: .string "You don't seem to be a problem\n" .string "TRAINER.$" SevenIsland_SevaultCanyon_Entrance_Text_MadelinePostBattle:: .string "If you treat your POKéMON with\n" .string "kindness, they'll understand.$" SevenIsland_SevaultCanyon_Entrance_Text_EveIntro:: .string "EVE: I'll team up with JON and\n" .string "battle together.$" SevenIsland_SevaultCanyon_Entrance_Text_EveDefeat:: .string "EVE: Me and JON, we lost.\n" .string "Ehehe.$" SevenIsland_SevaultCanyon_Entrance_Text_EvePostBattle:: .string "EVE: I'm going to work harder with\n" .string "JON.$" SevenIsland_SevaultCanyon_Entrance_Text_EveNotEnoughMons:: .string "EVE: I want to team up with JON\n" .string "when I battle you.\p" .string "Come back with two POKéMON, okay?$" SevenIsland_SevaultCanyon_Entrance_Text_JonIntro:: .string "JON: When I'm with EVE, it feels\n" .string "like we could never lose.$" SevenIsland_SevaultCanyon_Entrance_Text_JonDefeat:: .string "JON: When I'm with EVE,\n" .string "it doesn't feel like I've lost!$" SevenIsland_SevaultCanyon_Entrance_Text_JonPostBattle:: .string "JON: When I'm with EVE, I feel\n" .string "giddy whether I win or lose.\p" .string "It's magical!$" SevenIsland_SevaultCanyon_Entrance_Text_JonNotEnoughMons:: .string "JON: If it's with EVE, I'll be\n" .string "happy to battle with you.\p" .string "So, I'd like to make it a\n" .string "two-on-two battle, if I may.$" SevenIsland_SevaultCanyon_Entrance_Text_RouteSign:: .string "SEVAULT CANYON ENTRANCE\p" .string "TRAINERS are asked to refrain from\n" .string "damaging plants in the CANYON.$" ================================================ FILE: data/maps/SevenIsland_SevaultCanyon_House/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE", "name": "SevenIsland_SevaultCanyon_House", "layout": "LAYOUT_HOUSE3", "music": "MUS_SEVII_67", "region_map_section": "MAPSEC_SEVAULT_CANYON", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_SevaultCanyon_House_EventScript_BaldingMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANSEY", "in_connection": false, "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_SevaultCanyon_House_EventScript_Chansey", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 6, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SevenIsland_SevaultCanyon_House_EventScript_ItemLuckyPunch", "flag": "FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE_LUCKY_PUNCH" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_SEVAULT_CANYON", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_SevaultCanyon_House/scripts.inc ================================================ .set LOCALID_BALDING_MAN, 1 SevenIsland_SevaultCanyon_House_MapScripts:: .byte 0 SevenIsland_SevaultCanyon_House_EventScript_BaldingMan:: lock goto_if_set FLAG_TEMP_2, SevenIsland_SevaultCanyon_House_EventScript_AlreadyDanced playbgm MUS_SCHOOL, 0 applymovement LOCALID_BALDING_MAN, SevenIsland_SevaultCanyon_House_Movement_ChanseyDance waitmovement 0 fadedefaultbgm delay 30 applymovement LOCALID_BALDING_MAN, Common_Movement_FacePlayer waitmovement 0 msgbox SevenIsland_SevaultCanyon_House_Text_ChanseyDanceJoinIn textcolor NPC_TEXT_COLOR_NEUTRAL msgbox SevenIsland_SevaultCanyon_House_Text_WouldYouLikeToDance, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, SevenIsland_SevaultCanyon_House_EventScript_DeclineDance msgbox SevenIsland_SevaultCanyon_House_Text_DancedChanseyDance closemessage call EventScript_RestorePrevTextColor call_if_ne VAR_FACING, DIR_SOUTH, SevenIsland_SevaultCanyon_House_EventScript_PlayerFaceDown delay 30 playbgm MUS_SCHOOL, 0 applymovement OBJ_EVENT_ID_PLAYER, SevenIsland_SevaultCanyon_House_Movement_ChanseyDance waitmovement 0 fadedefaultbgm delay 30 call EventScript_OutOfCenterPartyHeal msgbox SevenIsland_SevaultCanyon_House_Text_YoureAllChipperNow setflag FLAG_TEMP_2 release end SevenIsland_SevaultCanyon_House_EventScript_PlayerFaceDown:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return SevenIsland_SevaultCanyon_House_EventScript_AlreadyDanced:: applymovement LOCALID_BALDING_MAN, Common_Movement_FacePlayer waitmovement 0 msgbox SevenIsland_SevaultCanyon_House_Text_ChanseyDanceJoinIn release end SevenIsland_SevaultCanyon_House_EventScript_DeclineDance:: textcolor NPC_TEXT_COLOR_MALE msgbox SevenIsland_SevaultCanyon_House_Text_ComeOnDance release end SevenIsland_SevaultCanyon_House_Movement_ChanseyDance:: walk_in_place_down delay_16 walk_in_place_down delay_16 walk_in_place_down delay_16 walk_in_place_down delay_16 walk_in_place_faster_right delay_4 walk_in_place_faster_up delay_4 walk_in_place_faster_left delay_4 walk_in_place_faster_down delay_4 step_end SevenIsland_SevaultCanyon_House_EventScript_Chansey:: lock faceplayer waitse playmoncry SPECIES_CHANSEY, CRY_MODE_NORMAL msgbox SevenIsland_SevaultCanyon_House_Text_Chansey waitmoncry release end ================================================ FILE: data/maps/SevenIsland_SevaultCanyon_House/text.inc ================================================ SevenIsland_SevaultCanyon_House_Text_ChanseyDanceJoinIn:: .string "Dance, dance!\n" .string "CHANSEY Dance!\p" .string "You join in, too!\n" .string "Dance, dance!$" SevenIsland_SevaultCanyon_House_Text_WouldYouLikeToDance:: .string "Would you like to dance?$" SevenIsland_SevaultCanyon_House_Text_ComeOnDance:: .string "Come on, dance!$" SevenIsland_SevaultCanyon_House_Text_DancedChanseyDance:: .string "{PLAYER} danced the CHANSEY Dance!$" SevenIsland_SevaultCanyon_House_Text_YoureAllChipperNow:: .string "Ahahahaha!\p" .string "There, you're all chipper now!\n" .string "Lucky!$" SevenIsland_SevaultCanyon_House_Text_Chansey:: .string "CHANSEY: Chansi! Chansi!$" ================================================ FILE: data/maps/SevenIsland_SevaultCanyon_TanobyKey/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY", "name": "SevenIsland_SevaultCanyon_TanobyKey", "layout": "LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_TANOBY_KEY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 7, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 8, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 6, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 8, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 6, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 6, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" } ], "warp_events": [ { "x": 7, "y": 13, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_SEVAULT_CANYON", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 2, "elevation": 3, "var": "VAR_TEMP_1", "var_value": "99", "script": "SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch1" }, { "type": "trigger", "x": 9, "y": 8, "elevation": 3, "var": "VAR_TEMP_7", "var_value": "99", "script": "SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch7" }, { "type": "trigger", "x": 5, "y": 8, "elevation": 3, "var": "VAR_TEMP_6", "var_value": "99", "script": "SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch6" }, { "type": "trigger", "x": 9, "y": 6, "elevation": 3, "var": "VAR_TEMP_5", "var_value": "99", "script": "SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch5" }, { "type": "trigger", "x": 5, "y": 6, "elevation": 3, "var": "VAR_TEMP_4", "var_value": "99", "script": "SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch4" }, { "type": "trigger", "x": 10, "y": 4, "elevation": 3, "var": "VAR_TEMP_3", "var_value": "99", "script": "SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch3" }, { "type": "trigger", "x": 4, "y": 4, "elevation": 3, "var": "VAR_TEMP_2", "var_value": "99", "script": "SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch2" } ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/SevenIsland_SevaultCanyon_TanobyKey/scripts.inc ================================================ .set LOCALID_BOULDER1, 1 .set LOCALID_BOULDER2, 2 .set LOCALID_BOULDER3, 3 .set LOCALID_BOULDER4, 4 .set LOCALID_BOULDER5, 5 .set LOCALID_BOULDER6, 6 .set LOCALID_BOULDER7, 7 .equ NUM_SWITCHES_PRESSED, VAR_TEMP_8 SevenIsland_SevaultCanyon_TanobyKey_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_SevaultCanyon_TanobyKey_OnTransition .byte 0 SevenIsland_SevaultCanyon_TanobyKey_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY call_if_set FLAG_SYS_UNLOCKED_TANOBY_RUINS, SevenIsland_SevaultCanyon_TanobyKey_EventScript_MoveBouldersToSolvedPos setvar VAR_TEMP_1, 0 setvar VAR_TEMP_2, 0 setvar VAR_TEMP_3, 0 setvar VAR_TEMP_4, 0 setvar VAR_TEMP_5, 0 setvar VAR_TEMP_6, 0 setvar VAR_TEMP_7, 0 setvar NUM_SWITCHES_PRESSED, 0 end SevenIsland_SevaultCanyon_TanobyKey_EventScript_MoveBouldersToSolvedPos:: setobjectxyperm LOCALID_BOULDER1, 7, 2 setobjectxyperm LOCALID_BOULDER2, 4, 4 setobjectxyperm LOCALID_BOULDER3, 10, 4 setobjectxyperm LOCALID_BOULDER4, 5, 6 setobjectxyperm LOCALID_BOULDER5, 9, 6 setobjectxyperm LOCALID_BOULDER6, 5, 8 setobjectxyperm LOCALID_BOULDER7, 9, 8 return SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch1:: lockall goto_if_eq VAR_TEMP_1, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed call SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed setvar VAR_TEMP_1, 100 goto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved releaseall end SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch2:: lockall goto_if_eq VAR_TEMP_2, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed call SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed setvar VAR_TEMP_2, 100 goto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved releaseall end SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch3:: lockall goto_if_eq VAR_TEMP_3, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed call SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed setvar VAR_TEMP_3, 100 goto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved releaseall end SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch4:: lockall goto_if_eq VAR_TEMP_4, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed call SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed setvar VAR_TEMP_4, 100 goto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved releaseall end SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch5:: lockall goto_if_eq VAR_TEMP_5, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed call SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed setvar VAR_TEMP_5, 100 goto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved releaseall end SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch6:: lockall goto_if_eq VAR_TEMP_6, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed call SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed setvar VAR_TEMP_6, 100 goto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved releaseall end SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch7:: lockall goto_if_eq VAR_TEMP_7, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed call SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed setvar VAR_TEMP_7, 100 goto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved releaseall end SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed:: addvar NUM_SWITCHES_PRESSED, 1 playse SE_TRUCK_MOVE setvar VAR_0x8004, 1 setvar VAR_0x8005, 1 setvar VAR_0x8006, 8 setvar VAR_0x8007, 3 special ShakeScreen delay 60 return SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolvedShakeScreen:: setvar VAR_0x8004, 2 setvar VAR_0x8005, 2 setvar VAR_0x8006, 10 setvar VAR_0x8007, 3 special ShakeScreen delay 60 setvar VAR_0x8004, 3 setvar VAR_0x8005, 3 setvar VAR_0x8006, 12 setvar VAR_0x8007, 2 special ShakeScreen delay 60 playse SE_LAVARIDGE_FALL_WARP waitse return SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed:: releaseall end SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved:: call SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolvedShakeScreen msgbox SevenIsland_SevaultCanyon_TanobyKey_Text_MysteriousRumbleFarAway setflag FLAG_SYS_UNLOCKED_TANOBY_RUINS releaseall end ================================================ FILE: data/maps/SevenIsland_SevaultCanyon_TanobyKey/text.inc ================================================ SevenIsland_SevaultCanyon_TanobyKey_Text_MysteriousRumbleFarAway:: .string "A mysterious rumble echoed\n" .string "somewhere far away.$" ================================================ FILE: data/maps/SevenIsland_TanobyRuins/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_TANOBY_RUINS", "name": "SevenIsland_TanobyRuins", "layout": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS", "music": "MUS_ROUTE110", "region_map_section": "MAPSEC_TANOBY_RUINS", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 48, "map": "MAP_SEVEN_ISLAND_SEVAULT_CANYON" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_RUIN_MANIAC", "x": 35, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_TanobyRuins_EventScript_Brandon", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_RUIN_MANIAC", "x": 121, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_TanobyRuins_EventScript_Benjamin", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PAINTER", "x": 85, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_TanobyRuins_EventScript_Edna", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 85, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_TanobyRuins_EventScript_Clifford", "flag": "0" } ], "warp_events": [ { "x": 120, "y": 10, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER", "dest_warp_id": "0" }, { "x": 103, "y": 10, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER", "dest_warp_id": "0" }, { "x": 88, "y": 8, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER", "dest_warp_id": "0" }, { "x": 44, "y": 11, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER", "dest_warp_id": "0" }, { "x": 32, "y": 9, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER", "dest_warp_id": "0" }, { "x": 12, "y": 15, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER", "dest_warp_id": "0" }, { "x": 11, "y": 6, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 33, "y": 10, "elevation": 3, "item": "ITEM_HEART_SCALE", "flag": "FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 86, "y": 9, "elevation": 3, "item": "ITEM_HEART_SCALE", "flag": "FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_2", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 125, "y": 5, "elevation": 3, "item": "ITEM_HEART_SCALE", "flag": "FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_3", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 8, "y": 2, "elevation": 3, "item": "ITEM_HEART_SCALE", "flag": "FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_4", "quantity": 1, "underfoot": false } ], "level_scaling": "5" } ================================================ FILE: data/maps/SevenIsland_TanobyRuins/scripts.inc ================================================ SevenIsland_TanobyRuins_MapScripts:: .byte 0 ================================================ FILE: data/maps/SevenIsland_TanobyRuins/text.inc ================================================ SevenIsland_TanobyRuins_Text_BrandonIntro:: .string "Do you know anything about this\n" .string "stone chamber?$" SevenIsland_TanobyRuins_Text_BrandonDefeat:: .string "That was uncalled for.\n" .string "You didn't have to be so rough.$" SevenIsland_TanobyRuins_Text_BrandonPostBattle:: .string "The TANOBY RUINS date back at\n" .string "least 1,500 years.\p" .string "But it's a baffling mystery as to\n" .string "why it was built in the first place.$" SevenIsland_TanobyRuins_Text_BenjaminIntro:: .string "A mystic POKéMON is said to sleep\n" .string "inside here.$" SevenIsland_TanobyRuins_Text_BenjaminDefeat:: .string "I'm not much good in battle.$" SevenIsland_TanobyRuins_Text_BenjaminPostBattle:: .string "I hear there are other ruins like\n" .string "the one here.\p" .string "Might they be the resting places\n" .string "of other mystic POKéMON?$" SevenIsland_TanobyRuins_Text_EdnaIntro:: .string "CLIFFORD is teaching me how to\n" .string "paint.$" SevenIsland_TanobyRuins_Text_EdnaDefeat:: .string "We might get in trouble for being\n" .string "noisy here.$" SevenIsland_TanobyRuins_Text_EdnaPostBattle:: .string "I said that I wanted to paint an\n" .string "old building.\p" .string "So CLIFFORD brought me here.$" SevenIsland_TanobyRuins_Text_CliffordIntro:: .string "Today, in addition to our lesson,\n" .string "we came to see the chamber.$" SevenIsland_TanobyRuins_Text_CliffordDefeat:: .string "My, how extraordinary.$" SevenIsland_TanobyRuins_Text_CliffordPostBattle:: .string "Ah, so you are studying POKéMON\n" .string "on your own…\p" .string "Yes, you certainly are quite the\n" .string "extraordinary person, indeed.$" ================================================ FILE: data/maps/SevenIsland_TanobyRuins_DilfordChamber/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER", "name": "SevenIsland_TanobyRuins_DilfordChamber", "layout": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_DILFORD_CHAMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": null, "object_events": [], "warp_events": [ { "x": 11, "y": 15, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_TanobyRuins_DilfordChamber/scripts.inc ================================================ SevenIsland_TanobyRuins_DilfordChamber_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_DilfordChamber_OnTransition .byte 0 SevenIsland_TanobyRuins_DilfordChamber_OnTransition:: call EventScript_TryDarkenRuins end ================================================ FILE: data/maps/SevenIsland_TanobyRuins_LiptooChamber/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER", "name": "SevenIsland_TanobyRuins_LiptooChamber", "layout": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_LIPTOO_CHAMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": null, "object_events": [], "warp_events": [ { "x": 11, "y": 15, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_TanobyRuins_LiptooChamber/scripts.inc ================================================ SevenIsland_TanobyRuins_LiptooChamber_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_LiptooChamber_OnTransition .byte 0 SevenIsland_TanobyRuins_LiptooChamber_OnTransition:: call EventScript_TryDarkenRuins end ================================================ FILE: data/maps/SevenIsland_TanobyRuins_MoneanChamber/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER", "name": "SevenIsland_TanobyRuins_MoneanChamber", "layout": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_MONEAN_CHAMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": null, "object_events": [], "warp_events": [ { "x": 11, "y": 15, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_TanobyRuins_MoneanChamber/scripts.inc ================================================ SevenIsland_TanobyRuins_MoneanChamber_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_MoneanChamber_OnTransition .byte 0 SevenIsland_TanobyRuins_MoneanChamber_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER call EventScript_TryDarkenRuins end ================================================ FILE: data/maps/SevenIsland_TanobyRuins_RixyChamber/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER", "name": "SevenIsland_TanobyRuins_RixyChamber", "layout": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_RIXY_CHAMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": null, "object_events": [], "warp_events": [ { "x": 11, "y": 15, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS", "dest_warp_id": "5" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_TanobyRuins_RixyChamber/scripts.inc ================================================ SevenIsland_TanobyRuins_RixyChamber_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_RixyChamber_OnTransition .byte 0 SevenIsland_TanobyRuins_RixyChamber_OnTransition:: call EventScript_TryDarkenRuins end ================================================ FILE: data/maps/SevenIsland_TanobyRuins_ScufibChamber/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER", "name": "SevenIsland_TanobyRuins_ScufibChamber", "layout": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_SCUFIB_CHAMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": null, "object_events": [], "warp_events": [ { "x": 11, "y": 15, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS", "dest_warp_id": "4" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_TanobyRuins_ScufibChamber/scripts.inc ================================================ SevenIsland_TanobyRuins_ScufibChamber_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_ScufibChamber_OnTransition .byte 0 SevenIsland_TanobyRuins_ScufibChamber_OnTransition:: call EventScript_TryDarkenRuins end ================================================ FILE: data/maps/SevenIsland_TanobyRuins_ViapoisChamber/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER", "name": "SevenIsland_TanobyRuins_ViapoisChamber", "layout": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_VIAPOIS_CHAMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": null, "object_events": [], "warp_events": [ { "x": 11, "y": 15, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS", "dest_warp_id": "6" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_TanobyRuins_ViapoisChamber/scripts.inc ================================================ SevenIsland_TanobyRuins_ViapoisChamber_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_ViapoisChamber_OnTransition .byte 0 SevenIsland_TanobyRuins_ViapoisChamber_OnTransition:: call EventScript_TryDarkenRuins end ================================================ FILE: data/maps/SevenIsland_TanobyRuins_WeepthChamber/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER", "name": "SevenIsland_TanobyRuins_WeepthChamber", "layout": "LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_WEEPTH_CHAMBER", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_INDOOR_1", "connections": null, "object_events": [], "warp_events": [ { "x": 11, "y": 15, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TANOBY_RUINS", "dest_warp_id": "2" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_TanobyRuins_WeepthChamber/scripts.inc ================================================ SevenIsland_TanobyRuins_WeepthChamber_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_WeepthChamber_OnTransition .byte 0 SevenIsland_TanobyRuins_WeepthChamber_OnTransition:: call EventScript_TryDarkenRuins end ================================================ FILE: data/maps/SevenIsland_TrainerTower/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_TRAINER_TOWER", "name": "SevenIsland_TrainerTower", "layout": "LAYOUT_SEVEN_ISLAND_TRAINER_TOWER", "music": "MUS_ROUTE110", "region_map_section": "MAPSEC_TRAINER_TOWER", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": 10, "map": "MAP_SEVEN_ISLAND" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_M", "x": 18, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_TrainerTower_EventScript_Dario", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_F", "x": 18, "y": 29, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SevenIsland_TrainerTower_EventScript_Rodette", "flag": "0" } ], "warp_events": [ { "x": 20, "y": 7, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_LOBBY", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 11, "y": 27, "elevation": 3, "item": "ITEM_BIG_PEARL", "flag": "FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_BIG_PEARL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 9, "y": 30, "elevation": 3, "item": "ITEM_PEARL", "flag": "FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_PEARL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 21, "y": 32, "elevation": 3, "item": "ITEM_HONDEW_BERRY", "flag": "FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_HONDEW_BERRY", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 18, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_TrainerTower_EventScript_TrainerTowerSign" }, { "type": "sign", "x": 12, "y": 30, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SevenIsland_TrainerTower_EventScript_TrainerTowerAheadSign" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SevenIsland_TrainerTower/scripts.inc ================================================ SevenIsland_TrainerTower_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TrainerTower_OnTransition .byte 0 SevenIsland_TrainerTower_OnTransition:: setvar VAR_MAP_SCENE_TRAINER_TOWER, 0 end SevenIsland_TrainerTower_EventScript_TrainerTowerSign:: msgbox SevenIsland_TrainerTower_Text_TrainerTowerSign, MSGBOX_SIGN end SevenIsland_TrainerTower_EventScript_TrainerTowerAheadSign:: msgbox SevenIsland_TrainerTower_Text_TrainerTowerAhead, MSGBOX_SIGN end ================================================ FILE: data/maps/SevenIsland_TrainerTower/text.inc ================================================ SevenIsland_TrainerTower_Text_DarioIntro:: .string "I sensed your approach.$" SevenIsland_TrainerTower_Text_DarioDefeat:: .string "Give up…$" SevenIsland_TrainerTower_Text_DarioPostBattle:: .string "In your future, I sense that you\n" .string "will meet many others.\p" .string "I think you will be linked to each\n" .string "other by a strange power.$" SevenIsland_TrainerTower_Text_RodetteIntro:: .string "Somewhere on this island, peculiar\n" .string "POKéMON are sleeping.$" SevenIsland_TrainerTower_Text_RodetteDefeat:: .string "What an amazing TRAINER!$" SevenIsland_TrainerTower_Text_RodettePostBattle:: .string "Somewhere on this island, peculiar\n" .string "POKéMON are sleeping.\p" .string "Could it be that they're waiting\n" .string "for you?$" SevenIsland_TrainerTower_Text_TrainerTowerSign:: .string "TRAINER TOWER ENTRANCE\n" .string "Rise to the Challenge, TRAINERS!$" SevenIsland_TrainerTower_Text_TrainerTowerAhead:: .string "TRAINER TOWER AHEAD$" ================================================ FILE: data/maps/SevenIsland_UnusedHouse/map.json ================================================ { "id": "MAP_SEVEN_ISLAND_UNUSED_HOUSE", "name": "SevenIsland_UnusedHouse", "layout": "LAYOUT_HOUSE4", "music": "MUS_SEVII_67", "region_map_section": "MAPSEC_SEVEN_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/SevenIsland_UnusedHouse/scripts.inc ================================================ SevenIsland_UnusedHouse_MapScripts:: .byte 0 ================================================ FILE: data/maps/SilphCo_10F/map.json ================================================ { "id": "MAP_SILPH_CO_10F", "name": "SilphCo_10F", "layout": "LAYOUT_SILPH_CO_10F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 10, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 2, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SilphCo_10F_EventScript_Travis", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 10, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_10F_EventScript_WorkerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 0, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SilphCo_10F_EventScript_Grunt", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_10F_EventScript_ItemCarbos", "flag": "FLAG_HIDE_SILPH_CO_10F_CARBOS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 2, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_10F_EventScript_ItemUltraBall", "flag": "FLAG_HIDE_SILPH_CO_10F_ULTRA_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 3, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_10F_EventScript_ItemRareCandy", "flag": "FLAG_HIDE_SILPH_CO_10F_RARE_CANDY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 3, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 3, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_10F_EventScript_WorkerBro", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 11, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_10F_EventScript_WorkerM", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" } ], "warp_events": [ { "x": 6, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_11F", "dest_warp_id": "0" }, { "x": 10, "y": 14, "elevation": 3, "dest_map": "MAP_SILPH_CO_4F", "dest_warp_id": "3" }, { "x": 14, "y": 9, "elevation": 3, "dest_map": "MAP_SILPH_CO_4F", "dest_warp_id": "5" }, { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_9F", "dest_warp_id": "3" }, { "x": 14, "y": 17, "elevation": 3, "dest_map": "MAP_SILPH_CO_4F", "dest_warp_id": "4" }, { "x": 13, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 12, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_10F_EventScript_Door" }, { "type": "sign", "x": 13, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_10F_EventScript_Door" }, { "type": "sign", "x": 12, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_10F_EventScript_Door" }, { "type": "sign", "x": 13, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_10F_EventScript_Door" }, { "type": "hidden_item", "x": 9, "y": 9, "elevation": 0, "item": "ITEM_HP_UP", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_10F_HP_UP", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 7, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_10F_EventScript_FloorSign" }, { "type": "sign", "x": 10, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_10F_EventScript_Painting" }, { "type": "sign", "x": 11, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_10F_EventScript_Painting" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_10F/scripts.inc ================================================ SilphCo_10F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_10F_OnLoad .byte 0 SilphCo_10F_OnLoad:: call_if_unset FLAG_SILPH_10F_DOOR, EventScript_Close10FDoor end SilphCo_10F_EventScript_WorkerF:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_10F_EventScript_WorkerFRocketsGone msgbox SilphCo_10F_Text_WaaaImScared release end SilphCo_10F_EventScript_WorkerFRocketsGone:: msgbox SilphCo_10F_Text_KeepMeCryingASecret release end SilphCo_10F_EventScript_FloorSign:: msgbox SilphCo_10F_Text_FloorSign, MSGBOX_SIGN end SilphCo_10F_EventScript_Travis:: trainerbattle_single TRAINER_SCIENTIST_TRAVIS, SilphCo_10F_Text_TravisIntro, SilphCo_10F_Text_TravisDefeat msgbox SilphCo_10F_Text_TravisPostBattle, MSGBOX_AUTOCLOSE end SilphCo_10F_EventScript_Grunt:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_39, SilphCo_10F_Text_GruntIntro, SilphCo_10F_Text_GruntDefeat msgbox SilphCo_10F_Text_GruntPostBattle, MSGBOX_AUTOCLOSE end SilphCo_10F_EventScript_WorkerBro:: msgbox SilphCo_10F_Text_WorkerBro, MSGBOX_NPC end SilphCo_10F_Text_WorkerBro: .string "I am one of the four SILPH\n" .string "BROTHERS!\p" .string "I'm a janitor!\n" .string "I keep this whole place sparkling!$" SilphCo_10F_EventScript_WorkerM:: msgbox SilphCo_10F_Text_WorkerM, MSGBOX_NPC end SilphCo_10F_Text_WorkerM: .string "Ahh!\n" .string "You startled me!\p" .string "…\n" .string "What am I doing?\l" .string "…Okay, you caught me.\p" .string "I never wanted to be an office\n" .string "drone, I wanted to be an artist!\p" .string "I'm replacing some of the paintings\n" .string "around here with some of my own\l" .string "to see if people like them.\p" .string "Don't worry, I'm putting the old\n" .string "paintings in storage.\p" .string "I'd never take such derivative\n" .string "work home for myself.$" SilphCo_10F_EventScript_Painting:: goto_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_10F_EventScript_NewPainting msgbox Text_Painting, MSGBOX_SIGN end SilphCo_10F_EventScript_NewPainting:: msgbox SilphCo_10F_Text_NewPainting, MSGBOX_SIGN end SilphCo_10F_Text_NewPainting: .string "It's a gorgeous painting of a lush,\n" .string "verdant landscape at sunset.$" ================================================ FILE: data/maps/SilphCo_10F/text.inc ================================================ SilphCo_10F_Text_GruntIntro:: .string "Welcome to 10F!\n" .string "So good of you to join me!$" SilphCo_10F_Text_GruntDefeat:: .string "I'm stunned!$" SilphCo_10F_Text_GruntPostBattle:: .string "Nice try, but the boardroom is up\n" .string "one more floor.$" SilphCo_10F_Text_TravisIntro:: .string "Enough of your silly games!$" SilphCo_10F_Text_TravisDefeat:: .string "No continues left!$" SilphCo_10F_Text_TravisPostBattle:: .string "Are you satisfied with beating me?\n" .string "Then go on home!$" SilphCo_10F_Text_WaaaImScared:: .string "Waaaaa!\n" .string "I'm scared!$" SilphCo_10F_Text_KeepMeCryingASecret:: .string "I know you saw me crying before…\n" .string "Please, don't tell anyone!$" SilphCo_10F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "10F$" ================================================ FILE: data/maps/SilphCo_11F/map.json ================================================ { "id": "MAP_SILPH_CO_11F", "name": "SilphCo_11F", "layout": "LAYOUT_SILPH_CO_11F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 11, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_11F_EventScript_President", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 11, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_11F_EventScript_Secretary", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GIOVANNI", "in_connection": false, "x": 6, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 16, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "SilphCo_11F_EventScript_Grunt1", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 16, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_11F_EventScript_ItemZinc", "flag": "FLAG_HIDE_SILPH_CO_11F_ZINC" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 2, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "SilphCo_11F_EventScript_Grunt2", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 4, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_11F_EventScript_WorkerM", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 15, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_11F_EventScript_DevonSpy", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 12, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Wigglytuff", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 7, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_10F", "dest_warp_id": "0" }, { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_SILPH_CO_7F", "dest_warp_id": "1" }, { "x": 13, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 5, "y": 15, "elevation": 3, "var": "VAR_MAP_SCENE_SILPH_CO_11F", "var_value": "0", "script": "SilphCo_11F_EventScript_GiovanniTriggerLeft" }, { "type": "trigger", "x": 6, "y": 15, "elevation": 3, "var": "VAR_MAP_SCENE_SILPH_CO_11F", "var_value": "0", "script": "SilphCo_11F_EventScript_GiovanniTriggerRight" } ], "bg_events": [ { "type": "sign", "x": 5, "y": 16, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_11F_EventScript_Door" }, { "type": "sign", "x": 5, "y": 17, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_11F_EventScript_Door" }, { "type": "sign", "x": 6, "y": 16, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_11F_EventScript_Door" }, { "type": "sign", "x": 6, "y": 17, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_11F_EventScript_Door" }, { "type": "hidden_item", "x": 10, "y": 18, "elevation": 0, "item": "ITEM_REVIVE", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_11F_REVIVE", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 8, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_11F_EventScript_FloorSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_11F/scripts.inc ================================================ .set LOCALID_GIOVANNI, 3 .set LOCALID_GRUNT1, 4 .set LOCALID_GRUNT2, 6 .set LOCALID_WORKERM, 7 .set LOCALID_WIGGLYTUFF_MASTER, 9 .set TRAINER, VAR_0x8009 SilphCo_11F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_11F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, SilphCo_11F_MapScript_SetMasterTrainerMovementTypes .byte 0 SilphCo_11F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_WIGGLYTUFF callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SilphCo_11F_MapScript_WigglytuffMasterMovementType end SilphCo_11F_MapScript_WigglytuffMasterMovementType:: setobjectmovementtype LOCALID_WIGGLYTUFF_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SilphCo_11F_OnLoad:: call_if_unset FLAG_SILPH_11F_DOOR, EventScript_Close11FDoor end SilphCo_11F_EventScript_President:: lock faceplayer goto_if_set FLAG_GOT_MASTER_BALL_FROM_SILPH, SilphCo_11F_EventScript_AlreadyGotMasterBall checkplayergender call_if_eq VAR_RESULT, MALE, SilphCo_11F_EventScript_PresidentThanksMale call_if_eq VAR_RESULT, FEMALE, SilphCo_11F_EventScript_PresidentThanksFemale checkitemspace ITEM_MASTER_BALL goto_if_eq VAR_RESULT, FALSE, SilphCo_11F_EventScript_NoRoomForMasterBall giveitem_msg SilphCo_11F_Text_ObtainedMasterBallFromPresident, ITEM_MASTER_BALL, 1, MUS_OBTAIN_KEY_ITEM msgbox SilphCo_11F_Text_ThatsOurSecretPrototype setflag FLAG_GOT_MASTER_BALL_FROM_SILPH release end SilphCo_11F_EventScript_PresidentThanksMale:: msgbox SilphCo_11F_Text_ThanksForSavingMeDearBoy return SilphCo_11F_EventScript_PresidentThanksFemale:: msgbox SilphCo_11F_Text_ThanksForSavingMeDearGirl return SilphCo_11F_EventScript_NoRoomForMasterBall:: msgbox SilphCo_11F_Text_YouHaveNoRoomForThis release end SilphCo_11F_EventScript_AlreadyGotMasterBall:: msgbox SilphCo_11F_Text_ThatsOurSecretPrototype release end SilphCo_11F_EventScript_Secretary:: msgbox SilphCo_11F_Text_ThanksForRescuingUs, MSGBOX_NPC end SilphCo_11F_EventScript_GiovanniTriggerLeft:: lockall setvar VAR_TEMP_1, 0 goto SilphCo_11F_EventScript_BattleGiovanni end SilphCo_11F_EventScript_GiovanniTriggerRight:: lockall setvar VAR_TEMP_1, 1 goto SilphCo_11F_EventScript_BattleGiovanni end SilphCo_11F_EventScript_BattleGiovanni:: textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_GIOVANNI, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 25 msgbox SilphCo_11F_Text_GiovanniIntro closemessage call_if_eq VAR_TEMP_1, 0, SilphCo_11F_EventScript_GiovanniApproachLeft call_if_eq VAR_TEMP_1, 1, SilphCo_11F_EventScript_GiovanniApproachRight setvar VAR_LAST_TALKED, LOCALID_GIOVANNI trainerbattle_no_intro TRAINER_BOSS_GIOVANNI_2, SilphCo_11F_Text_GiovanniDefeat msgbox SilphCo_11F_Text_GiovanniPostBattle closemessage fadescreen FADE_TO_BLACK removeobject LOCALID_GIOVANNI removeobject LOCALID_GRUNT1 removeobject LOCALID_GRUNT2 playbgm MUS_GSC_PEWTER 0 addobject LOCALID_WORKERM fadescreen FADE_FROM_BLACK setvar VAR_MAP_SCENE_SILPH_CO_11F, 1 setflag FLAG_HIDE_SAFFRON_ROCKETS clearflag FLAG_HIDE_SAFFRON_CIVILIANS releaseall end SilphCo_11F_EventScript_GiovanniApproachLeft:: applymovement LOCALID_GIOVANNI, SilphCo_11F_Movement_GiovanniApproachLeft applymovement OBJ_EVENT_ID_PLAYER, SilphCo_11F_Movement_PlayerFaceGiovanni waitmovement 0 return SilphCo_11F_EventScript_GiovanniApproachRight:: applymovement LOCALID_GIOVANNI, SilphCo_11F_Movement_GiovanniApproachRight waitmovement 0 return SilphCo_11F_Movement_GiovanniApproachLeft:: walk_down walk_down walk_down walk_down walk_in_place_faster_left step_end SilphCo_11F_Movement_GiovanniApproachRight:: walk_down walk_down walk_down step_end SilphCo_11F_Movement_PlayerFaceGiovanni:: delay_16 delay_16 delay_16 delay_8 delay_4 walk_in_place_faster_right step_end @ Unused SilphCo_11F_EventScript_Monitor:: msgbox SilphCo_11F_Text_MonitorHasMonsOnIt, MSGBOX_SIGN end SilphCo_11F_EventScript_FloorSign:: msgbox SilphCo_11F_Text_FloorSign, MSGBOX_SIGN end SilphCo_11F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_40, SilphCo_11F_Text_Grunt1Intro, SilphCo_11F_Text_Grunt1Defeat msgbox SilphCo_11F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end SilphCo_11F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_41, SilphCo_11F_Text_Grunt2Intro, SilphCo_11F_Text_Grunt2Defeat msgbox SilphCo_11F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end SilphCo_11F_EventScript_WorkerM:: msgbox SilphCo_11F_Text_WorkerM, MSGBOX_NPC end SilphCo_11F_Text_WorkerM: .string "Excuse me!\p" .string "Do you have an appointment to see\n" .string "the PRESIDENT?\p" .string "Oh, {PLAYER}!\n" .string "Sorry, go on ahead.$" SilphCo_11F_EventScript_DevonSpy:: call_if_unset FLAG_MET_DEVON_SPY, SilphCo_11F_EventScript_DevonSpyFirstTime goto_if_questlog EventScript_ReleaseEnd msgbox SilphCo_11F_Text_DevonSpy release faceplayer playse SE_PIN applymovement 8, Common_Movement_ExclamationMark waitmovement 0 applymovement 8, Common_Movement_Delay48 waitmovement 0 lock message SilphCo_11F_Text_DevonSpyYoureBack waitmessage pokemart SilphCo_11F_DevonSpy_Items msgbox SilphCo_11F_Text_DevonSpyComeBackLater release turnobject 8, DIR_WEST end SilphCo_11F_EventScript_DevonSpyFirstTime:: msgbox SilphCo_11F_Text_DevonSpyFirstTime release faceplayer playse SE_PIN applymovement 8, Common_Movement_ExclamationMark waitmovement 0 applymovement 8, Common_Movement_Delay48 waitmovement 0 msgbox SilphCo_11F_Text_Explain, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq SilphCo_11F_EventScript_DevonSpyFirstTimeNo SilphCo_11F_EventScript_DevonSpyFirstTimeYes:: setflag FLAG_MET_DEVON_SPY goto_if_questlog EventScript_ReleaseEnd lock message SilphCo_11F_Text_DevonSpyAccepted waitmessage pokemart SilphCo_11F_DevonSpy_Items msgbox SilphCo_11F_Text_DevonSpyComeBackLater release turnobject 8, DIR_WEST end .align 2 SilphCo_11F_DevonSpy_Items:: .2byte ITEM_NET_BALL .2byte ITEM_NEST_BALL .2byte ITEM_REPEAT_BALL .2byte ITEM_TIMER_BALL .2byte ITEM_LUXURY_BALL .2byte ITEM_DIVE_BALL .2byte ITEM_NONE release end SilphCo_11F_EventScript_DevonSpyFirstTimeNo:: msgbox SilphCo_11F_Text_DevonSpyComeOn, MSGBOX_YESNO compare VAR_RESULT, NO goto_if_eq SilphCo_11F_EventScript_DevonSpyFirstTimeNo goto SilphCo_11F_EventScript_DevonSpyFirstTimeYes SilphCo_11F_Text_DevonSpy: .string "POKé… TEAR?\n" .string "Lets TRAINERS make dolls anywhere?\l" .string "That can't be right…$" SilphCo_11F_Text_DevonSpyYoureBack: .string "Gah!\p" .string "I-I'm just checking how sturdy\n" .string "the walls are!\p" .string "Oh, it's you again, kid.\p" .string "I've got the imported POKé BALLS\n" .string "if you've got the cash.$" SilphCo_11F_Text_DevonSpyFirstTime: .string "Getting the MASTER BALL research\n" .string "and development was a huge score…\p" .string "Bringing back the next big project's\n" .string "intel will be a massive payday!$" SilphCo_11F_Text_Explain: .string "Gah!\p" .string "Where did you come from?\p" .string "Wait! It's not what you think!\n" .string "I'm not with TEAM ROCKET!\p" .string "I work for SILPH, but I also\n" .string "work for another company that's\l" .string "based very far away.\p" .string "They pay me to pass along info\n" .string "about SILPH's product development.\p" .string "Listen kid, I've got a good thing\n" .string "going on for myself here, and I'm\l" .string "willing to pay for your silence.\p" .string "Well, more like sell to you at cost\n" .string "for your silence, hehehe.\p" .string "I have special POKé BALLS that I\n" .string "imported from my company abroad.\p" .string "I'll sell them to you for cheap\n" .string "if you forget you ever saw me.$" SilphCo_11F_Text_DevonSpyComeOn: .string "Oh come on, kid.\n" .string "Help me help you help me.$" SilphCo_11F_Text_DevonSpyAccepted: .string "Excellent!\n" .string "You'll love these POKé BALLS, kid.\p" .string "This is all of them,\n" .string "which ones are you interested in?$" SilphCo_11F_Text_DevonSpyComeBackLater: .string "I'll sell these to you anytime as\n" .string "long as you promise to keep quiet.$" ================================================ FILE: data/maps/SilphCo_11F/text.inc ================================================ SilphCo_11F_Text_ThanksForSavingMeDearBoy:: .string "PRESIDENT: Oh, dear boy!\n" .string "Thank you for saving SILPH.\p" .string "I will never forget you saved us in\n" .string "our moment of peril.\p" .string "I have to thank you in some way.\p" .string "Because I am rich, I can give you\n" .string "anything.\p" .string "Here, maybe this will do.$" SilphCo_11F_Text_ThanksForSavingMeDearGirl:: .string "PRESIDENT: Oh, dear girl!\n" .string "Thank you for saving SILPH.\p" .string "I will never forget you saved us in\n" .string "our moment of peril.\p" .string "I have to thank you in some way.\p" .string "Because I am rich, I can give you\n" .string "anything.\p" .string "Here, maybe this will do.$" SilphCo_11F_Text_ObtainedMasterBallFromPresident:: .string "{PLAYER} obtained a MASTER BALL\n" .string "from the PRESIDENT!$" SilphCo_11F_Text_ThatsOurSecretPrototype:: .string "PRESIDENT: You can't buy that\n" .string "anywhere.\p" .string "It's our secret prototype MASTER\n" .string "BALL.\p" .string "It will catch any POKéMON without\n" .string "fail!\p" .string "You should be quiet about using it,\n" .string "though.$" SilphCo_11F_Text_YouHaveNoRoomForThis:: .string "You have no room for this.$" SilphCo_11F_Text_ThanksForRescuingUs:: .string "SECRETARY: Thank you for rescuing\n" .string "all of us.\p" .string "We, from the PRESIDENT down,\n" .string "are indebted to you.$" SilphCo_11F_Text_GiovanniIntro:: .string "Ah, {PLAYER}!\n" .string "So we meet again!\p" .string "The PRESIDENT and I are discussing\n" .string "a vital business proposition.\p" .string "Keep your nose out of grown-up\n" .string "matters…\p" .string "Or, experience a world of pain!$" SilphCo_11F_Text_GiovanniDefeat:: .string "Arrgh!!\n" .string "I lost again!?$" SilphCo_11F_Text_GiovanniPostBattle:: .string "Blast it all!\n" .string "You ruined our plans for SILPH!\p" .string "But, TEAM ROCKET will never fall!\p" .string "{PLAYER}! Never forget that all\n" .string "POKéMON exist for TEAM ROCKET!\p" .string "I must go, but I shall return!$" SilphCo_11F_Text_Grunt2Intro:: .string "Stop right there!\n" .string "Don't you move!$" SilphCo_11F_Text_Grunt2Defeat:: .string "Don't…\n" .string "Please!$" SilphCo_11F_Text_Grunt2PostBattle:: .string "So, you want to see my BOSS?$" SilphCo_11F_Text_Grunt1Intro:: .string "Halt! Do you have an appointment\n" .string "with my BOSS?$" SilphCo_11F_Text_Grunt1Defeat:: .string "Gaah!\n" .string "Demolished!$" SilphCo_11F_Text_Grunt1PostBattle:: .string "Watch your step…\n" .string "My BOSS likes his POKéMON tough!$" SilphCo_11F_Text_MonitorHasMonsOnIt:: .string "The monitor has POKéMON on it!$" SilphCo_11F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "11F$" ================================================ FILE: data/maps/SilphCo_1F/map.json ================================================ { "id": "MAP_SILPH_CO_1F", "name": "SilphCo_1F", "layout": "LAYOUT_SILPH_CO_1F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 1, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 3, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_1F_EventScript_Receptionist", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 5, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_1F_EventScript_CouchWoman", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 6, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_1F_EventScript_CouchMan", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 14, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_1F_EventScript_WalkingWoman", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 30, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_1F_EventScript_CushionMan", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 18, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_1F_EventScript_FountainMan", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 9, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Kingler", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 7, "y": 21, "elevation": 0, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "0" }, { "x": 8, "y": 20, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "0" }, { "x": 9, "y": 20, "elevation": 3, "dest_map": "MAP_SAFFRON_CITY", "dest_warp_id": "0" }, { "x": 31, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_2F", "dest_warp_id": "3" }, { "x": 22, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 30, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_1F_EventScript_FloorSign" }, { "type": "sign", "x": 12, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_1F_EventScript_Painting" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_1F/scripts.inc ================================================ .set LOCALID_KINGLER_MASTER, 7 .set TRAINER, VAR_0x8009 SilphCo_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SilphCo_1F_OnTransition .byte 0 SilphCo_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SILPH_CO_1F goto SilphCo_1F_MapScript_SetMasterTrainerMovementTypes end SilphCo_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_KINGLER callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SilphCo_1F_MapScript_KinglerMasterMovementType end SilphCo_1F_MapScript_KinglerMasterMovementType:: setobjectmovementtype LOCALID_KINGLER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SilphCo_1F_EventScript_Receptionist:: msgbox SilphCo_1F_Text_WelcomePresidentInBoardroom, MSGBOX_NPC end SilphCo_1F_EventScript_FloorSign:: msgbox SilphCo_1F_Text_FloorSign, MSGBOX_SIGN end SilphCo_1F_EventScript_CouchWoman:: msgbox SilphCo_1F_Text_CouchWoman, MSGBOX_NPC end SilphCo_1F_Text_CouchWoman: .string "I was captured by TEAM ROCKET.\p" .string "I wonder if our insurance plan\n" .string "covers that kind of thing…?$" SilphCo_1F_EventScript_CouchMan:: msgbox SilphCo_1F_Text_CouchMan, MSGBOX_NPC end SilphCo_1F_Text_CouchMan: .string "I heard that the one who took on\n" .string "TEAM ROCKET was actually some kid!\p" .string "Wait, could it be you…?\n" .string "No, no, couldn't be…$" SilphCo_1F_EventScript_FountainMan:: msgbox SilphCo_1F_Text_FountainMan, MSGBOX_NPC end SilphCo_1F_Text_FountainMan: .string "Any tool can be used for good\n" .string "or evil, depending on the user.\p" .string "I shudder to think what would've\n" .string "happened if TEAM ROCKET had gotten\l" .string "their hands on SILPH technology…$" SilphCo_1F_EventScript_CushionMan:: msgbox SilphCo_1F_Text_CushionMan, MSGBOX_NPC end SilphCo_1F_Text_CushionMan: .string "I came back from playing hooky only\n" .string "to find out the company had been\l" .string "taken over!\l" .string "That was quite a surprise, for sure.$" SilphCo_1F_EventScript_WalkingWoman:: msgbox SilphCo_1F_Text_WalkingWoman, MSGBOX_NPC end SilphCo_1F_Text_WalkingWoman: .string "A lot of work's piled up, so we\n" .string "need to get cracking!$" SilphCo_1F_EventScript_Painting:: goto_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_1F_EventScript_NewPainting msgbox Text_Painting, MSGBOX_SIGN end SilphCo_1F_EventScript_NewPainting:: msgbox SilphCo_1F_Text_NewPainting, MSGBOX_SIGN end SilphCo_1F_Text_NewPainting: .string "It's a gorgeous painting of a cabin\n" .string "surrounded by a field of flowers.$" ================================================ FILE: data/maps/SilphCo_1F/text.inc ================================================ SilphCo_1F_Text_WelcomePresidentInBoardroom:: .string "Welcome.\p" .string "The PRESIDENT is in the boardroom\n" .string "on 11F.$" SilphCo_1F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "1F$" ================================================ FILE: data/maps/SilphCo_2F/map.json ================================================ { "id": "MAP_SILPH_CO_2F", "name": "SilphCo_2F", "layout": "LAYOUT_SILPH_CO_2F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 2, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 29, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "SilphCo_2F_EventScript_Grunt2", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 28, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SilphCo_2F_EventScript_Jerry", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 20, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SilphCo_2F_EventScript_Grunt1", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 5, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_2F_EventScript_Connor", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 10, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_2F_EventScript_ThunderWaveTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 19, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_2F_EventScript_Scientist", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 18, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_2F_EventScript_WorkerF1", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 24, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_2F_EventScript_Woman", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 5, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_2F_EventScript_WorkerM", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 32, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_2F_EventScript_WorkerF2", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" } ], "warp_events": [ { "x": 28, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_3F", "dest_warp_id": "0" }, { "x": 2, "y": 6, "elevation": 3, "dest_map": "MAP_SILPH_CO_3F", "dest_warp_id": "8" }, { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_SILPH_CO_8F", "dest_warp_id": "5" }, { "x": 30, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_1F", "dest_warp_id": "3" }, { "x": 7, "y": 19, "elevation": 3, "dest_map": "MAP_SILPH_CO_6F", "dest_warp_id": "1" }, { "x": 33, "y": 19, "elevation": 3, "dest_map": "MAP_SILPH_CO_8F", "dest_warp_id": "2" }, { "x": 22, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 5, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_2F_EventScript_Door1" }, { "type": "sign", "x": 6, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_2F_EventScript_Door1" }, { "type": "sign", "x": 5, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_2F_EventScript_Door1" }, { "type": "sign", "x": 6, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_2F_EventScript_Door1" }, { "type": "sign", "x": 5, "y": 15, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_2F_EventScript_Door2" }, { "type": "sign", "x": 6, "y": 15, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_2F_EventScript_Door2" }, { "type": "sign", "x": 5, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_2F_EventScript_Door2" }, { "type": "sign", "x": 6, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_2F_EventScript_Door2" }, { "type": "hidden_item", "x": 11, "y": 21, "elevation": 0, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_2F_ULTRA_BALL", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 29, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_2F_EventScript_FloorSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_2F/scripts.inc ================================================ SilphCo_2F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_2F_OnLoad .byte 0 SilphCo_2F_OnLoad:: call_if_unset FLAG_SILPH_2F_DOOR_1, EventScript_Close2FDoor1 call_if_unset FLAG_SILPH_2F_DOOR_2, EventScript_Close2FDoor2 end SilphCo_2F_EventScript_ThunderWaveTutor:: goto EventScript_ThunderWaveTutor end SilphCo_2F_EventScript_FloorSign:: msgbox SilphCo_2F_Text_FloorSign, MSGBOX_SIGN end SilphCo_2F_EventScript_Connor:: trainerbattle_single TRAINER_SCIENTIST_CONNOR, SilphCo_2F_Text_ConnorIntro, SilphCo_2F_Text_ConnorDefeat msgbox SilphCo_2F_Text_ConnorPostBattle, MSGBOX_AUTOCLOSE end SilphCo_2F_EventScript_Jerry:: trainerbattle_single TRAINER_SCIENTIST_JERRY, SilphCo_2F_Text_JerryIntro, SilphCo_2F_Text_JerryDefeat msgbox SilphCo_2F_Text_JerryPostBattle, MSGBOX_AUTOCLOSE end SilphCo_2F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_23, SilphCo_2F_Text_Grunt1Intro, SilphCo_2F_Text_Grunt1Defeat msgbox SilphCo_2F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end SilphCo_2F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_24, SilphCo_2F_Text_Grunt2Intro, SilphCo_2F_Text_Grunt2Defeat msgbox SilphCo_2F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end SilphCo_2F_EventScript_Scientist:: msgbox SilphCo_2F_Text_Scientist, MSGBOX_NPC end SilphCo_2F_Text_Scientist: .string "Now that we're not working on the\n" .string "MASTER BALL anymore, we're pivoting\l" .string "to other projects.$" SilphCo_2F_EventScript_WorkerF1:: msgbox SilphCo_2F_Text_WorkerF1, MSGBOX_NPC end SilphCo_2F_Text_WorkerF1: .string "Maybe our next product can be a\n" .string "security system to keep people\l" .string "like TEAM ROCKET out!$" SilphCo_2F_EventScript_WorkerF2:: msgbox SilphCo_2F_Text_WorkerF2, MSGBOX_NPC end SilphCo_2F_Text_WorkerF2: .string "Programming is hard work!\p" .string "Can you imagine how difficult\n" .string "coding a PORYGON would be?\p" .string "To create a POKéMON out of\n" .string "code like that…\l" .string "It's unbelievable!$" SilphCo_2F_EventScript_Woman:: msgbox SilphCo_2F_Text_Woman, MSGBOX_NPC end SilphCo_2F_Text_Woman: .string "We're constantly in and out of\n" .string "meetings all day long.\p" .string "I wish they would just let me\n" .string "work in peace…$" SilphCo_2F_EventScript_WorkerM:: textcolor 3 msgbox SilphCo_2F_Text_WorkerM release end SilphCo_2F_Text_WorkerM: .string "…\p" .string "He's asleep on the job!$" ================================================ FILE: data/maps/SilphCo_2F/text.inc ================================================ SilphCo_2F_Text_ConnorIntro:: .string "Help!\n" .string "I'm a SILPH employee.$" SilphCo_2F_Text_ConnorDefeat:: .string "How did you know\n" .string "I was a ROCKET?$" SilphCo_2F_Text_ConnorPostBattle:: .string "I work for both SILPH and TEAM\n" .string "ROCKET.$" SilphCo_2F_Text_JerryIntro:: .string "It's off-limits here!\n" .string "Go home!$" SilphCo_2F_Text_JerryDefeat:: .string "You're good.$" SilphCo_2F_Text_JerryPostBattle:: .string "Can you solve the maze in here?\n" .string "It's not easy, I tell you!$" SilphCo_2F_Text_Grunt1Intro:: .string "No kids are allowed in here!$" SilphCo_2F_Text_Grunt1Defeat:: .string "Tough!$" SilphCo_2F_Text_Grunt1PostBattle:: .string "Diamond-shaped tiles are teleport\n" .string "blocks.\p" .string "They're transporters for this\n" .string "high-tech building.$" SilphCo_2F_Text_Grunt2Intro:: .string "Hey, kid!\n" .string "What are you wandering here for?$" SilphCo_2F_Text_Grunt2Defeat:: .string "I goofed!$" SilphCo_2F_Text_Grunt2PostBattle:: .string "SILPH CO. will be associated with\n" .string "TEAM ROCKET!$" Text_ThunderWaveTeach:: .string "Eeek!\n" .string "No! Stop! Help!\p" .string "Oh, you're not with TEAM ROCKET.\n" .string "I'm sorry, I thought…\p" .string "Will you forgive me if I teach\n" .string "you the THUNDER WAVE technique?$" Text_ThunderWaveDeclined:: .string "Oh…\n" .string "But THUNDER WAVE is convenient…$" Text_ThunderWaveWhichMon:: .string "Which POKéMON should I teach\n" .string "THUNDER WAVE?$" Text_ThunderWaveTaught:: .string "THUNDER WAVE causes paralysis in\n" .string "the target POKéMON.\p" .string "A paralyzed POKéMON may be unable\n" .string "to move in battle.\p" .string "It's an ELECTRIC-type move, so it\n" .string "won't work on some POKéMON.$" Text_ThunderWaveReteach:: .string "Eeek!\n" .string "No! Stop! Help!\p" .string "…Oh, it's you again.\n" .string "Sorry, I'm still a little jumpy.\p" .string "I can teach you the THUNDER WAVE\n" .string "technique again if you'd like,\l" .string "but I'd have to charge you ¥5000.$" Text_ThunderWaveReteach2:: .string "Would you like me to teach you\n" .string "the THUNDER WAVE technique?$" Text_ThunderWaveNotEnoughMoney:: .string "I'm sorry, it's company policy\n" .string "to charge to teach this move.\p" .string "If I taught it to you for free\n" .string "again, I could get in trouble.\p" .string "Come back when you have ¥5000\n" .string "and I'll teach you THUNDER WAVE.$" SilphCo_2F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "2F$" ================================================ FILE: data/maps/SilphCo_3F/map.json ================================================ { "id": "MAP_SILPH_CO_3F", "name": "SilphCo_3F", "layout": "LAYOUT_SILPH_CO_3F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 3, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 25, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SilphCo_3F_EventScript_Grunt", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 31, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_3F_EventScript_WorkerM", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 4, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_3F_EventScript_Jose", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 8, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_RocketWarehouse_EventScript_ItemUpGrade", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_UP_GRADE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 13, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT", "movement_range_x": 10, "movement_range_y": 13, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_3F_EventScript_WorkerMWalking", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 4, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_3F_EventScript_WorkerF", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 13, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_3F_EventScript_Scientist", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" } ], "warp_events": [ { "x": 28, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_2F", "dest_warp_id": "0" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_SILPH_CO_5F", "dest_warp_id": "1" }, { "x": 13, "y": 14, "elevation": 3, "dest_map": "MAP_SILPH_CO_7F", "dest_warp_id": "4" }, { "x": 30, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_4F", "dest_warp_id": "2" }, { "x": 2, "y": 14, "elevation": 3, "dest_map": "MAP_SILPH_CO_9F", "dest_warp_id": "2" }, { "x": 3, "y": 20, "elevation": 3, "dest_map": "MAP_SILPH_CO_5F", "dest_warp_id": "4" }, { "x": 29, "y": 14, "elevation": 3, "dest_map": "MAP_SILPH_CO_3F", "dest_warp_id": "7" }, { "x": 32, "y": 20, "elevation": 3, "dest_map": "MAP_SILPH_CO_3F", "dest_warp_id": "6" }, { "x": 33, "y": 5, "elevation": 3, "dest_map": "MAP_SILPH_CO_2F", "dest_warp_id": "1" }, { "x": 22, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 10, "y": 12, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_3F_EventScript_Door1" }, { "type": "sign", "x": 10, "y": 13, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_3F_EventScript_Door1" }, { "type": "sign", "x": 21, "y": 12, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_3F_EventScript_Door2" }, { "type": "sign", "x": 21, "y": 13, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_3F_EventScript_Door2" }, { "type": "sign", "x": 9, "y": 12, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_3F_EventScript_Door1" }, { "type": "sign", "x": 9, "y": 13, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_3F_EventScript_Door1" }, { "type": "sign", "x": 20, "y": 12, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_3F_EventScript_Door2" }, { "type": "sign", "x": 20, "y": 13, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_3F_EventScript_Door2" }, { "type": "hidden_item", "x": 34, "y": 18, "elevation": 0, "item": "ITEM_PROTEIN", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_3F_PROTEIN", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 29, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_3F_EventScript_FloorSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_3F/scripts.inc ================================================ SilphCo_3F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_3F_OnLoad .byte 0 SilphCo_3F_OnLoad:: call_if_unset FLAG_SILPH_3F_DOOR_1, EventScript_Close3FDoor1 call_if_unset FLAG_SILPH_3F_DOOR_2, EventScript_Close3FDoor2 end SilphCo_3F_EventScript_WorkerM:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_3F_EventScript_WorkerMRocketsGone msgbox SilphCo_3F_Text_WhatAmIToDo release end SilphCo_3F_EventScript_WorkerMRocketsGone:: msgbox SilphCo_3F_Text_YouAndYourMonsSavedUs release end SilphCo_3F_EventScript_FloorSign:: msgbox SilphCo_3F_Text_FloorSign, MSGBOX_SIGN end SilphCo_3F_EventScript_Jose:: trainerbattle_single TRAINER_SCIENTIST_JOSE, SilphCo_3F_Text_JoseIntro, SilphCo_3F_Text_JoseDefeat msgbox SilphCo_3F_Text_JosePostBattle, MSGBOX_AUTOCLOSE end SilphCo_3F_EventScript_Grunt:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_25, SilphCo_3F_Text_GruntIntro, SilphCo_3F_Text_GruntDefeat msgbox SilphCo_3F_Text_GruntPostBattle, MSGBOX_AUTOCLOSE end SilphCo_3F_EventScript_WorkerMWalking:: msgbox SilphCo_3F_Text_WorkerMWalking, MSGBOX_NPC end SilphCo_3F_Text_WorkerMWalking: .string "Sometimes, when I get stuck on\n" .string "a problem, I stroll the office.\p" .string "If you put on a serious face and\n" .string "walk fast, people think you're\l" .string "doing something important!$" SilphCo_3F_EventScript_WorkerF:: msgbox SilphCo_3F_Text_WorkerF, MSGBOX_NPC end SilphCo_3F_Text_WorkerF: .string "To be honest, I kind of miss\n" .string "TEAM ROCKET.\p" .string "It was scary, but at least I\n" .string "had an excuse to not work.$" SilphCo_3F_EventScript_Scientist:: lock msgbox SilphCo_3F_Text_Scientist release msgbox SilphCo_3F_Text_Scientist2, MSGBOX_NPC turnobject 7, DIR_NORTH end SilphCo_3F_Text_Scientist: .string "Uh huh…\n" .string "No, of course not!\l" .string "There's no way that'd work…\p" .string "…Unless…\p" .string "I have to run this by the team.\n" .string "I'll call you back.$" SilphCo_3F_Text_Scientist2:: .string "Excuse me, I have to make\n" .string "another phone call.$" ================================================ FILE: data/maps/SilphCo_3F/text.inc ================================================ SilphCo_3F_Text_WhatAmIToDo:: .string "I work for SILPH CO.\n" .string "What am I to do?$" SilphCo_3F_Text_YouAndYourMonsSavedUs:: .string "{PLAYER}!\n" .string "You and your POKéMON saved us!$" SilphCo_3F_Text_GruntIntro:: .string "Quit messing with us, kid!$" SilphCo_3F_Text_GruntDefeat:: .string "I give up!$" SilphCo_3F_Text_GruntPostBattle:: .string "A hint? You can open doors with\n" .string "a CARD KEY!$" SilphCo_3F_Text_JoseIntro:: .string "I support TEAM ROCKET more than\n" .string "I support SILPH CO.!$" SilphCo_3F_Text_JoseDefeat:: .string "You really got me!$" SilphCo_3F_Text_JosePostBattle:: .string "Humph…\p" .string "TEAM ROCKET said that if I helped\n" .string "them, they'd let me study POKéMON.$" SilphCo_3F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "3F$" ================================================ FILE: data/maps/SilphCo_4F/map.json ================================================ { "id": "MAP_SILPH_CO_4F", "name": "SilphCo_4F", "layout": "LAYOUT_SILPH_CO_4F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 4, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 33, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SilphCo_4F_EventScript_Grunt2", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 10, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "SilphCo_4F_EventScript_Grunt1", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 14, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SilphCo_4F_EventScript_Rodney", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_4F_EventScript_WorkerM", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 3, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_4F_EventScript_ItemMaxRevive", "flag": "FLAG_HIDE_SILPH_CO_4F_MAX_REVIVE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 4, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_4F_EventScript_ItemEscapeRope", "flag": "FLAG_HIDE_SILPH_CO_4F_ESCAPE_ROPE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 2, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_4F_EventScript_ItemFullHeal", "flag": "FLAG_HIDE_SILPH_CO_4F_FULL_HEAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 30, "y": 18, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "FiveIsland_RocketWarehouse_EventScript_ItemTM36", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_TM36" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 28, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_4F_EventScript_BaldingMan", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 32, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_4F_EventScript_WorkerF", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 12, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_4F_EventScript_Scientist", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 12, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_4F_EventScript_WorkerM2", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MASTER_BLACK_BELT", "in_connection": false, "x": 7, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Machop", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 28, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_5F", "dest_warp_id": "0" }, { "x": 18, "y": 6, "elevation": 3, "dest_map": "MAP_SILPH_CO_6F", "dest_warp_id": "3" }, { "x": 30, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_3F", "dest_warp_id": "3" }, { "x": 12, "y": 9, "elevation": 3, "dest_map": "MAP_SILPH_CO_10F", "dest_warp_id": "1" }, { "x": 2, "y": 20, "elevation": 3, "dest_map": "MAP_SILPH_CO_10F", "dest_warp_id": "4" }, { "x": 18, "y": 14, "elevation": 3, "dest_map": "MAP_SILPH_CO_10F", "dest_warp_id": "2" }, { "x": 22, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 3, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Door1" }, { "type": "sign", "x": 4, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Door1" }, { "type": "sign", "x": 3, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Door1" }, { "type": "sign", "x": 4, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Door1" }, { "type": "sign", "x": 15, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Door2" }, { "type": "sign", "x": 14, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Door2" }, { "type": "sign", "x": 14, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Door2" }, { "type": "sign", "x": 15, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Door2" }, { "type": "hidden_item", "x": 35, "y": 20, "elevation": 0, "item": "ITEM_IRON", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_4F_IRON", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 29, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_FloorSign" }, { "type": "sign", "x": 14, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Painting" }, { "type": "sign", "x": 15, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_4F_EventScript_Painting" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_4F/scripts.inc ================================================ .set LOCALID_MACHOP_MASTER, 13 .set TRAINER, VAR_0x8009 SilphCo_4F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_4F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, SilphCo_4F_MapScript_SetMasterTrainerMovementTypes .byte 0 SilphCo_4F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MACHOP callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, SilphCo_4F_MapScript_MachopMasterMovementType end SilphCo_4F_MapScript_MachopMasterMovementType:: setobjectmovementtype LOCALID_MACHOP_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return SilphCo_4F_OnLoad:: call_if_unset FLAG_SILPH_4F_DOOR_1, EventScript_Close4FDoor1 call_if_unset FLAG_SILPH_4F_DOOR_2, EventScript_Close4FDoor2 end SilphCo_4F_EventScript_WorkerM:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_4F_EventScript_WorkerMRocketsGone msgbox SilphCo_4F_Text_CantYouSeeImHiding release end SilphCo_4F_EventScript_WorkerMRocketsGone:: msgbox SilphCo_4F_Text_TeamRocketIsGone release end SilphCo_4F_EventScript_FloorSign:: msgbox SilphCo_4F_Text_FloorSign, MSGBOX_SIGN end SilphCo_4F_EventScript_Rodney:: trainerbattle_single TRAINER_SCIENTIST_RODNEY, SilphCo_4F_Text_RodneyIntro, SilphCo_4F_Text_RodneyDefeat msgbox SilphCo_4F_Text_RodneyPostBattle, MSGBOX_AUTOCLOSE end SilphCo_4F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_26, SilphCo_4F_Text_Grunt1Intro, SilphCo_4F_Text_Grunt1Defeat msgbox SilphCo_4F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end SilphCo_4F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_27, SilphCo_4F_Text_Grunt2Intro, SilphCo_4F_Text_Grunt2Defeat msgbox SilphCo_4F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end SilphCo_4F_EventScript_BaldingMan:: msgbox SilphCo_4F_Text_BaldingMan, MSGBOX_NPC end SilphCo_4F_Text_BaldingMan: .string "My office mate brings the most\n" .string "disgusting-smelling food.\p" .string "I wish she would take her lunch\n" .string "break somewhere else.$" SilphCo_4F_EventScript_WorkerF:: msgbox SilphCo_4F_Text_WorkerF, MSGBOX_NPC end SilphCo_4F_Text_WorkerF: .string "Between you and me, I'm trying\n" .string "to impress my office mate.\p" .string "He's due for a promotion, and I\n" .string "want to be the first one he thinks\l" .string "to promote!$" SilphCo_4F_EventScript_WorkerM2:: msgbox SilphCo_4F_Text_WorkerM2, MSGBOX_NPC end SilphCo_4F_Text_WorkerM2: .string "I'm on my break, kid.\n" .string "I can't give you a tour now.$" SilphCo_4F_EventScript_Scientist:: msgbox SilphCo_4F_Text_Scientist, MSGBOX_NPC end SilphCo_4F_Text_Scientist: .string "What? Why are you looking at\n" .string "me like that?\p" .string "There was a TEAM ROCKET SCIENTIST\n" .string "in here during the takeover?\p" .string "Well, I'm obviously not him.\n" .string "We must look completely different.$" SilphCo_4F_EventScript_Painting:: goto_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_4F_EventScript_NewPainting msgbox Text_Painting, MSGBOX_SIGN end SilphCo_4F_EventScript_NewPainting:: msgbox SilphCo_4F_Text_NewPainting, MSGBOX_SIGN end SilphCo_4F_Text_NewPainting: .string "It's a gorgeous painting of a POKéMON\n" .string "swimming in an underwater paradise.$" ================================================ FILE: data/maps/SilphCo_4F/text.inc ================================================ SilphCo_4F_Text_CantYouSeeImHiding:: .string "Sssh!\n" .string "Can't you see I'm hiding?$" SilphCo_4F_Text_TeamRocketIsGone:: .string "Huh?\n" .string "TEAM ROCKET is gone?$" SilphCo_4F_Text_Grunt1Intro:: .string "TEAM ROCKET has taken control\n" .string "of SILPH CO.!$" SilphCo_4F_Text_Grunt1Defeat:: .string "Arrgh!$" SilphCo_4F_Text_Grunt1PostBattle:: .string "Fwahahaha!\n" .string "My BOSS has been after this place!$" SilphCo_4F_Text_RodneyIntro:: .string "My POKéMON is my loyal servant.$" SilphCo_4F_Text_RodneyDefeat:: .string "Darn!\n" .string "You weak POKéMON!$" SilphCo_4F_Text_RodneyPostBattle:: .string "The doors are electronically\n" .string "locked.\p" .string "It takes a CARD KEY to open the\n" .string "doors here.$" SilphCo_4F_Text_Grunt2Intro:: .string "Intruder spotted!$" SilphCo_4F_Text_Grunt2Defeat:: .string "Who are you?$" SilphCo_4F_Text_Grunt2PostBattle:: .string "I better tell the BOSS on 11F!$" SilphCo_4F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "4F$" ================================================ FILE: data/maps/SilphCo_5F/map.json ================================================ { "id": "MAP_SILPH_CO_5F", "name": "SilphCo_5F", "layout": "LAYOUT_SILPH_CO_5F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 5, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 35, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SilphCo_5F_EventScript_Grunt2", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JUGGLER", "x": 23, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SilphCo_5F_EventScript_Dalton", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 16, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_5F_EventScript_WorkerM", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 11, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SilphCo_5F_EventScript_Beau", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 9, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SilphCo_5F_EventScript_Grunt1", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 4, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_5F_EventScript_ItemProtein", "flag": "FLAG_HIDE_SILPH_CO_5F_PROTEIN" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 1, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_5F_EventScript_ItemTM01", "flag": "FLAG_HIDE_SILPH_CO_5F_TM01" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 22, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_5F_EventScript_ItemCardKey", "flag": "FLAG_HIDE_SILPH_CO_5F_CARD_KEY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 2, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_5F_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 27, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_5F_EventScript_WorkerM2", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 25, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_5F_EventScript_Scientist2", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 25, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_5F_EventScript_WorkerF", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" } ], "warp_events": [ { "x": 28, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_4F", "dest_warp_id": "0" }, { "x": 15, "y": 7, "elevation": 3, "dest_map": "MAP_SILPH_CO_3F", "dest_warp_id": "1" }, { "x": 30, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_6F", "dest_warp_id": "2" }, { "x": 10, "y": 20, "elevation": 3, "dest_map": "MAP_SILPH_CO_9F", "dest_warp_id": "1" }, { "x": 2, "y": 20, "elevation": 3, "dest_map": "MAP_SILPH_CO_3F", "dest_warp_id": "5" }, { "x": 33, "y": 5, "elevation": 3, "dest_map": "MAP_SILPH_CO_7F", "dest_warp_id": "2" }, { "x": 22, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 13, "y": 16, "elevation": 0, "item": "ITEM_ELIXIR", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_5F_ELIXIR", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 8, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door1" }, { "type": "sign", "x": 8, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door1" }, { "type": "sign", "x": 8, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door2" }, { "type": "sign", "x": 8, "y": 19, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door2" }, { "type": "sign", "x": 19, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door3" }, { "type": "sign", "x": 19, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door3" }, { "type": "sign", "x": 7, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door1" }, { "type": "sign", "x": 7, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door1" }, { "type": "sign", "x": 7, "y": 19, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door2" }, { "type": "sign", "x": 7, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door2" }, { "type": "sign", "x": 18, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door3" }, { "type": "sign", "x": 18, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_Door3" }, { "type": "sign", "x": 28, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_PokemonReport3" }, { "type": "sign", "x": 30, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_PokemonReport2" }, { "type": "sign", "x": 25, "y": 15, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_PokemonReport1" }, { "type": "hidden_item", "x": 32, "y": 9, "elevation": 0, "item": "ITEM_PP_UP", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_5F_PP_UP", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 29, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_5F_EventScript_FloorSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_5F/scripts.inc ================================================ SilphCo_5F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_5F_OnLoad .byte 0 SilphCo_5F_OnLoad:: call_if_unset FLAG_SILPH_5F_DOOR_1, EventScript_Close5FDoor1 call_if_unset FLAG_SILPH_5F_DOOR_2, EventScript_Close5FDoor2 call_if_unset FLAG_SILPH_5F_DOOR_3, EventScript_Close5FDoor3 call_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_5F_EventScript_ScientistMovementType end SilphCo_5F_EventScript_ScientistMovementType:: setobjectmovementtype 9, MOVEMENT_TYPE_WANDER_AROUND return SilphCo_5F_EventScript_WorkerM:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_5F_EventScript_WorkerMRocketsGone msgbox SilphCo_5F_Text_RocketsInUproarAboutIntruder release end SilphCo_5F_EventScript_WorkerMRocketsGone:: msgbox SilphCo_5F_Text_YoureOurHeroThankYou release end SilphCo_5F_EventScript_PokemonReport1:: msgbox SilphCo_5F_Text_PorygonFirstVRMon, MSGBOX_SIGN end SilphCo_5F_EventScript_PokemonReport2:: msgbox SilphCo_5F_Text_Over350TechniquesConfirmed, MSGBOX_SIGN end SilphCo_5F_EventScript_PokemonReport3:: msgbox SilphCo_5F_Text_SomeMonsEvolveWhenTraded, MSGBOX_SIGN end SilphCo_5F_EventScript_FloorSign:: msgbox SilphCo_5F_Text_FloorSign, MSGBOX_SIGN end SilphCo_5F_EventScript_Beau:: trainerbattle_single TRAINER_SCIENTIST_BEAU, SilphCo_5F_Text_BeauIntro, SilphCo_5F_Text_BeauDefeat msgbox SilphCo_5F_Text_BeauPostBattle, MSGBOX_AUTOCLOSE end SilphCo_5F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_28, SilphCo_5F_Text_Grunt1Intro, SilphCo_5F_Text_Grunt1Defeat msgbox SilphCo_5F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end SilphCo_5F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_29, SilphCo_5F_Text_Grunt2Intro, SilphCo_5F_Text_Grunt2Defeat msgbox SilphCo_5F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end SilphCo_5F_EventScript_Dalton:: trainerbattle_single TRAINER_JUGGLER_DALTON, SilphCo_5F_Text_DaltonIntro, SilphCo_5F_Text_DaltonDefeat msgbox SilphCo_5F_Text_DaltonPostBattle, MSGBOX_AUTOCLOSE end SilphCo_5F_EventScript_WorkerM2:: msgbox SilphCo_5F_Text_WorkerM2, MSGBOX_NPC end SilphCo_5F_Text_WorkerM2: .string "Synergy!\n" .string "Disruption!\l" .string "Paradigm shift!$" SilphCo_5F_EventScript_WorkerF:: msgbox SilphCo_5F_Text_WorkerF, MSGBOX_NPC end SilphCo_5F_Text_WorkerF: .string "Is it just me or is this guy\n" .string "not actually saying anything?$" SilphCo_5F_EventScript_Scientist2:: msgbox SilphCo_5F_Text_Scientist2, MSGBOX_NPC end SilphCo_5F_Text_Scientist2: .string "He-he's a visionary!\n" .string "I've got to take notes!$" ================================================ FILE: data/maps/SilphCo_5F/text.inc ================================================ SilphCo_5F_Text_RocketsInUproarAboutIntruder:: .string "TEAM ROCKET is in an uproar over\n" .string "some intruder.\p" .string "That's you, right?$" SilphCo_5F_Text_YoureOurHeroThankYou:: .string "TEAM ROCKET took off!\n" .string "You're our hero! Thank you!$" SilphCo_5F_Text_Grunt1Intro:: .string "I heard a kid was wandering\n" .string "around.$" SilphCo_5F_Text_Grunt1Defeat:: .string "Boom!$" SilphCo_5F_Text_Grunt1PostBattle:: .string "It's not smart to pick a fight with\n" .string "TEAM ROCKET!$" SilphCo_5F_Text_BeauIntro:: .string "We study POKé BALL technology on\n" .string "this floor.$" SilphCo_5F_Text_BeauDefeat:: .string "Dang!\n" .string "Blast it!$" SilphCo_5F_Text_BeauPostBattle:: .string "We worked on the ultimate POKé\n" .string "BALL which would catch anything.$" SilphCo_5F_Text_DaltonIntro:: .string "Whaaat?\p" .string "There shouldn't be any children\n" .string "here!$" SilphCo_5F_Text_DaltonDefeat:: .string "Oh, goodness!$" SilphCo_5F_Text_DaltonPostBattle:: .string "You're only on 5F.\n" .string "It's a long way to my BOSS!$" SilphCo_5F_Text_Grunt2Intro:: .string "Show TEAM ROCKET a little respect!$" SilphCo_5F_Text_Grunt2Defeat:: .string "Cough…\n" .string "Cough…$" SilphCo_5F_Text_Grunt2PostBattle:: .string "Which reminds me.\p" .string "KOFFING evolves into WEEZING!$" SilphCo_5F_Text_PorygonFirstVRMon:: .string "It's a POKéMON REPORT!\p" .string "POKéMON LAB created PORYGON,\n" .string "the first virtual-reality POKéMON.$" SilphCo_5F_Text_Over350TechniquesConfirmed:: .string "It's a POKéMON REPORT!\p" .string "Over 350 POKéMON techniques have\n" .string "been confirmed.$" SilphCo_5F_Text_SomeMonsEvolveWhenTraded:: .string "It's a POKéMON REPORT!\p" .string "Some POKéMON have been confirmed\n" .string "to evolve when they are traded.$" SilphCo_5F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "5F$" SilphCo_5F_Text_RocketBossLookingForStrongMons:: .string "Those thugs that took over our\n" .string "building…\p" .string "Their BOSS said he was looking for\n" .string "strong POKéMON.\p" .string "I hope our PRESIDENT managed to\n" .string "avoid trouble…$" ================================================ FILE: data/maps/SilphCo_6F/map.json ================================================ { "id": "MAP_SILPH_CO_6F", "name": "SilphCo_6F", "layout": "LAYOUT_SILPH_CO_6F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 6, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 21, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SilphCo_6F_EventScript_Grunt1", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 23, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_6F_EventScript_WorkerM1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 24, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_6F_EventScript_WorkerF1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 22, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_6F_EventScript_WorkerM2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 14, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_6F_EventScript_WorkerM3", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 16, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_6F_EventScript_WorkerF2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SilphCo_6F_EventScript_Taylor", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 2, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_6F_EventScript_ItemHPUp", "flag": "FLAG_HIDE_SILPH_CO_6F_HP_UP" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 1, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_6F_EventScript_ItemXSpecial", "flag": "FLAG_HIDE_SILPH_CO_6F_X_SPECIAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 18, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SilphCo_6F_EventScript_Grunt2", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 3, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_6F_EventScript_SuperNerd", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" } ], "warp_events": [ { "x": 14, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_7F", "dest_warp_id": "0" }, { "x": 29, "y": 5, "elevation": 3, "dest_map": "MAP_SILPH_CO_2F", "dest_warp_id": "4" }, { "x": 26, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_5F", "dest_warp_id": "2" }, { "x": 2, "y": 6, "elevation": 3, "dest_map": "MAP_SILPH_CO_4F", "dest_warp_id": "1" }, { "x": 20, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 6, "y": 15, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_6F_EventScript_Door" }, { "type": "sign", "x": 6, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_6F_EventScript_Door" }, { "type": "sign", "x": 5, "y": 15, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_6F_EventScript_Door" }, { "type": "sign", "x": 5, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_6F_EventScript_Door" }, { "type": "hidden_item", "x": 1, "y": 8, "elevation": 0, "item": "ITEM_CARBOS", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_6F_CARBOS", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 25, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_6F_EventScript_FloorSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_6F/scripts.inc ================================================ SilphCo_6F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_6F_OnLoad .byte 0 SilphCo_6F_OnLoad:: call_if_unset FLAG_SILPH_6F_DOOR, EventScript_Close6FDoor end SilphCo_6F_EventScript_WorkerM2:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerM2RocketsGone msgbox SilphCo_6F_Text_TargetedSilphForOurMonProducts release end SilphCo_6F_EventScript_WorkerM2RocketsGone:: msgbox SilphCo_6F_Text_ComeWorkForSilphWhenYoureOlder release end SilphCo_6F_EventScript_WorkerM3:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerM3RocketsGone msgbox SilphCo_6F_Text_RocketsTookOverBuilding release end SilphCo_6F_EventScript_WorkerM3RocketsGone:: msgbox SilphCo_6F_Text_BetterGetBackToWork release end SilphCo_6F_EventScript_WorkerM1:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerM1RocketsGone msgbox SilphCo_6F_Text_HelpMePlease release end SilphCo_6F_EventScript_WorkerM1RocketsGone:: msgbox SilphCo_6F_Text_WeGotEngaged release end SilphCo_6F_EventScript_WorkerF1:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerF1RocketsGone msgbox SilphCo_6F_Text_ThatManIsSuchACoward release end SilphCo_6F_EventScript_WorkerF1RocketsGone:: msgbox SilphCo_6F_Text_NeedsMeToLookAfterHim release end SilphCo_6F_EventScript_WorkerF2:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerF2RocketsGone msgbox SilphCo_6F_Text_RocketsTryingToConquerWorld release end SilphCo_6F_EventScript_WorkerF2RocketsGone:: msgbox SilphCo_6F_Text_RocketsRanAwayBecauseOfYou release end SilphCo_6F_EventScript_FloorSign:: msgbox SilphCo_6F_Text_FloorSign, MSGBOX_SIGN end SilphCo_6F_EventScript_Taylor:: trainerbattle_single TRAINER_SCIENTIST_TAYLOR, SilphCo_6F_Text_TaylorIntro, SilphCo_6F_Text_TaylorDefeat msgbox SilphCo_6F_Text_TaylorPostBattle, MSGBOX_AUTOCLOSE end SilphCo_6F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_30, SilphCo_6F_Text_Grunt1Intro, SilphCo_6F_Text_Grunt1Defeat msgbox SilphCo_6F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end SilphCo_6F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_31, SilphCo_6F_Text_Grunt2Intro, SilphCo_6F_Text_Grunt2Defeat msgbox SilphCo_6F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end SilphCo_6F_EventScript_SuperNerd:: msgbox SilphCo_6F_Text_SuperNerd, MSGBOX_NPC end SilphCo_6F_Text_SuperNerd: .string "I am one of the four SILPH\n" .string "BROTHERS!\p" .string "I make sure the company inventory\n" .string "counts are correct!$" ================================================ FILE: data/maps/SilphCo_6F/text.inc ================================================ SilphCo_6F_Text_RocketsTookOverBuilding:: .string "The ROCKETS came and took over\n" .string "the building!$" SilphCo_6F_Text_BetterGetBackToWork:: .string "Well, better get back to work.$" SilphCo_6F_Text_HelpMePlease:: .string "Oh dear, oh dear.\n" .string "Help me, please!$" SilphCo_6F_Text_WeGotEngaged:: .string "We got engaged.\n" .string "Heheh!$" SilphCo_6F_Text_ThatManIsSuchACoward:: .string "That man next to me…\n" .string "He's such a coward!$" SilphCo_6F_Text_NeedsMeToLookAfterHim:: .string "He's so helpless, he needs\n" .string "someone like me to look after him.$" SilphCo_6F_Text_RocketsTryingToConquerWorld:: .string "TEAM ROCKET is trying to conquer\n" .string "the world with POKéMON.$" SilphCo_6F_Text_RocketsRanAwayBecauseOfYou:: .string "TEAM ROCKET ran away, and it's all\n" .string "because of you!$" SilphCo_6F_Text_TargetedSilphForOurMonProducts:: .string "They must have targeted SILPH for\n" .string "our POKéMON products.$" SilphCo_6F_Text_ComeWorkForSilphWhenYoureOlder:: .string "Come work for SILPH when you\n" .string "get older.$" SilphCo_6F_Text_Grunt1Intro:: .string "I am one of the four ROCKET\n" .string "BROTHERS!$" SilphCo_6F_Text_Grunt1Defeat:: .string "Flame out!$" SilphCo_6F_Text_Grunt1PostBattle:: .string "No matter!\n" .string "My brothers will avenge me!$" SilphCo_6F_Text_TaylorIntro:: .string "That rotten PRESIDENT!\p" .string "Serves him right for shipping me\n" .string "off to the TIKSI BRANCH!\p" .string "That's why TEAM ROCKET came after\n" .string "us, I'm sure of it!$" SilphCo_6F_Text_TaylorDefeat:: .string "Shoot!$" SilphCo_6F_Text_TaylorPostBattle:: .string "TIKSI BRANCH?\n" .string "It's in Russian no-man's-land!$" SilphCo_6F_Text_Grunt2Intro:: .string "You dare betray TEAM ROCKET?$" SilphCo_6F_Text_Grunt2Defeat:: .string "You traitor!$" SilphCo_6F_Text_Grunt2PostBattle:: .string "If you stand for justice, you\n" .string "betray us bad guys!$" SilphCo_6F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "6F$" ================================================ FILE: data/maps/SilphCo_7F/map.json ================================================ { "id": "MAP_SILPH_CO_7F", "name": "SilphCo_7F", "layout": "LAYOUT_SILPH_CO_7F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 7, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "in_connection": false, "x": 2, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SILPH_RIVAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 0, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_7F_EventScript_LaprasGuy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 24, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SilphCo_7F_EventScript_Grunt1", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 24, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SilphCo_7F_EventScript_Grunt2", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 13, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SilphCo_7F_EventScript_Grunt3", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_7F_EventScript_WorkerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 13, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_7F_EventScript_WorkerM1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 9, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_7F_EventScript_WorkerM2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 3, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SilphCo_7F_EventScript_Joshua", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 0, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_7F_EventScript_ItemCalcium", "flag": "FLAG_HIDE_SILPH_CO_7F_CALCIUM" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 30, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_7F_EventScript_ItemTM08", "flag": "FLAG_HIDE_SILPH_CO_7F_TM08" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 4, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_7F_EventScript_WorkerBro", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 27, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_7F_EventScript_WorkerFPhone", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" } ], "warp_events": [ { "x": 19, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_6F", "dest_warp_id": "0" }, { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_SILPH_CO_11F", "dest_warp_id": "1" }, { "x": 25, "y": 17, "elevation": 3, "dest_map": "MAP_SILPH_CO_5F", "dest_warp_id": "5" }, { "x": 27, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_8F", "dest_warp_id": "3" }, { "x": 5, "y": 4, "elevation": 3, "dest_map": "MAP_SILPH_CO_3F", "dest_warp_id": "2" }, { "x": 23, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 2, "y": 4, "elevation": 3, "var": "VAR_MAP_SCENE_SILPH_CO_7F", "var_value": "0", "script": "SilphCo_7F_EventScript_RivalTriggerTop" }, { "type": "trigger", "x": 2, "y": 5, "elevation": 3, "var": "VAR_MAP_SCENE_SILPH_CO_7F", "var_value": "0", "script": "SilphCo_7F_EventScript_RivalTriggerBottom" } ], "bg_events": [ { "type": "sign", "x": 11, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door1" }, { "type": "sign", "x": 12, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door1" }, { "type": "sign", "x": 11, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door1" }, { "type": "sign", "x": 12, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door1" }, { "type": "sign", "x": 24, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door2" }, { "type": "sign", "x": 25, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door2" }, { "type": "sign", "x": 25, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door2" }, { "type": "sign", "x": 24, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door2" }, { "type": "sign", "x": 25, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door3" }, { "type": "sign", "x": 26, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door3" }, { "type": "sign", "x": 25, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door3" }, { "type": "sign", "x": 26, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Door3" }, { "type": "hidden_item", "x": 22, "y": 11, "elevation": 0, "item": "ITEM_ZINC", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_7F_ZINC", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 20, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_FloorSign" }, { "type": "sign", "x": 13, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Painting" }, { "type": "sign", "x": 14, "y": 9, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_7F_EventScript_Painting" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_7F/scripts.inc ================================================ .set LOCALID_RIVAL, 1 .set LOCALID_WORKER_M2, 8 SilphCo_7F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_7F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, SilphCo_7F_OnTransition .byte 0 SilphCo_7F_OnLoad:: call_if_unset FLAG_SILPH_7F_DOOR_1, EventScript_Close7FDoor1 call_if_unset FLAG_SILPH_7F_DOOR_2, EventScript_Close7FDoor2 call_if_unset FLAG_SILPH_7F_DOOR_3, EventScript_Close7FDoor3 end SilphCo_7F_OnTransition:: call_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_7F_EventScript_SetObjRocketsGone end SilphCo_7F_EventScript_SetObjRocketsGone:: setobjectmovementtype LOCALID_WORKER_M2, MOVEMENT_TYPE_FACE_UP return SilphCo_7F_EventScript_RivalTriggerTop:: lockall setvar VAR_TEMP_1, 0 goto SilphCo_7F_EventScript_RivalScene end SilphCo_7F_EventScript_RivalTriggerBottom:: lockall setvar VAR_TEMP_1, 1 goto SilphCo_7F_EventScript_RivalScene end SilphCo_7F_EventScript_RivalScene:: textcolor NPC_TEXT_COLOR_MALE playbgm MUS_ENCOUNTER_RIVAL, 0 applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_RIVAL, Common_Movement_Delay48 waitmovement 0 msgbox SilphCo_7F_Text_RivalWhatKeptYou call_if_eq VAR_TEMP_1, 0, SilphCo_7F_EventScript_RivalApproachTop call_if_eq VAR_TEMP_1, 1, SilphCo_7F_EventScript_RivalApproachBottom msgbox SilphCo_7F_Text_RivalIntro setvar VAR_LAST_TALKED, LOCALID_RIVAL call_if_eq VAR_STARTER_MON, 2, SilphCo_7F_EventScript_RivalSquirtle call_if_eq VAR_STARTER_MON, 1, SilphCo_7F_EventScript_RivalBulbasaur call_if_eq VAR_STARTER_MON, 0, SilphCo_7F_EventScript_RivalCharmander msgbox SilphCo_7F_Text_RivalPostBattle closemessage playbgm MUS_RIVAL_EXIT, 0 call_if_eq VAR_TEMP_1, 0, SilphCo_7F_EventScript_RivalExitTop call_if_eq VAR_TEMP_1, 1, SilphCo_7F_EventScript_RivalExitBottom call SilphCo_7F_EventScript_RivalGivesLinkBracelet playse SE_WARP_IN fadedefaultbgm removeobject LOCALID_RIVAL waitse setvar VAR_MAP_SCENE_SILPH_CO_7F, 1 releaseall end SilphCo_7F_EventScript_RivalApproachTop:: closemessage applymovement LOCALID_RIVAL, SilphCo_7F_Movement_RivalApproachTop waitmovement 0 return SilphCo_7F_EventScript_RivalApproachBottom:: return SilphCo_7F_EventScript_RivalSquirtle:: trainerbattle_no_intro TRAINER_RIVAL_SILPH_SQUIRTLE, SilphCo_7F_Text_RivalDefeat return SilphCo_7F_EventScript_RivalBulbasaur:: trainerbattle_no_intro TRAINER_RIVAL_SILPH_BULBASAUR, SilphCo_7F_Text_RivalDefeat return SilphCo_7F_EventScript_RivalCharmander:: trainerbattle_no_intro TRAINER_RIVAL_SILPH_CHARMANDER, SilphCo_7F_Text_RivalDefeat return SilphCo_7F_EventScript_RivalExitTop:: applymovement LOCALID_RIVAL, SilphCo_7F_Movement_RivalExitTop waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return SilphCo_7F_EventScript_RivalExitBottom:: applymovement LOCALID_RIVAL, SilphCo_7F_Movement_RivalExitBottom waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return SilphCo_7F_Movement_RivalApproachTop:: walk_up step_end SilphCo_7F_Movement_RivalExitTop:: walk_right walk_right walk_right delay_16 face_left delay_16 walk_left walk_up walk_left step_end SilphCo_7F_Movement_RivalExitBottom:: walk_left walk_up walk_up walk_right walk_right walk_right delay_16 face_left delay_16 walk_left walk_left face_down step_end SilphCo_7F_EventScript_LaprasGuy:: lock faceplayer goto_if_set FLAG_GOT_LAPRAS_FROM_SILPH, SilphCo_7F_EventScript_AlreadyGotLapras msgbox SilphCo_7F_Text_HaveMonForSavingUs setvar VAR_TEMP_1, SPECIES_LAPRAS givemon SPECIES_LAPRAS, 25 goto_if_eq VAR_RESULT, 0, SilphCo_7F_EventScript_ReceiveLaprasParty goto_if_eq VAR_RESULT, 1, SilphCo_7F_EventScript_ReceiveLaprasPC goto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon release end SilphCo_7F_EventScript_ReceiveLaprasParty:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message SilphCo_7F_Text_ObtainedLaprasFromEmployee waitmessage waitfanfare bufferspeciesname STR_VAR_1, SPECIES_LAPRAS callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, SilphCo_7F_EventScript_NicknameLaprasParty msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, SilphCo_7F_EventScript_EndReceiveLapras SilphCo_7F_EventScript_NicknameLaprasParty:: call EventScript_GetGiftMonPartySlot call EventScript_ChangePokemonNickname goto SilphCo_7F_EventScript_EndReceiveLapras end SilphCo_7F_EventScript_ReceiveLaprasPC:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message SilphCo_7F_Text_ObtainedLaprasFromEmployee waitmessage waitfanfare bufferspeciesname STR_VAR_1, SPECIES_LAPRAS callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, SilphCo_7F_EventScript_NicknameLaprasPC msgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, SilphCo_7F_EventScript_LaprasTransferredToPC SilphCo_7F_EventScript_NicknameLaprasPC:: call EventScript_NameReceivedBoxMon goto SilphCo_7F_EventScript_LaprasTransferredToPC end SilphCo_7F_EventScript_LaprasTransferredToPC:: call EventScript_TransferredToPC goto SilphCo_7F_EventScript_EndReceiveLapras end SilphCo_7F_EventScript_EndReceiveLapras:: textcolor NPC_TEXT_COLOR_MALE msgbox SilphCo_7F_Text_ExplainLapras setflag FLAG_GOT_LAPRAS_FROM_SILPH release end SilphCo_7F_EventScript_AlreadyGotLapras:: msgbox SilphCo_7F_Text_RocketBossWentToBoardroom release end SilphCo_7F_EventScript_WorkerM1:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_7F_EventScript_WorkerM1RocketsGone msgbox SilphCo_7F_Text_RocketsAfterMasterBall release end SilphCo_7F_EventScript_WorkerM1RocketsGone:: msgbox SilphCo_7F_Text_CanceledMasterBallProject release end SilphCo_7F_EventScript_WorkerM2:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_7F_EventScript_WorkerM2RocketsGone msgbox SilphCo_7F_Text_BadIfTeamRocketTookOver release end SilphCo_7F_EventScript_WorkerM2RocketsGone:: msgbox SilphCo_7F_Text_WowYouChasedOffTeamRocket release end SilphCo_7F_EventScript_WorkerF:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_7F_EventScript_WorkerFRocketsGone msgbox SilphCo_7F_Text_ReallyDangerousHere release end SilphCo_7F_EventScript_WorkerFRocketsGone:: msgbox SilphCo_7F_Text_ThankYouSoMuch release end SilphCo_7F_EventScript_FloorSign:: msgbox SilphCo_7F_Text_FloorSign, MSGBOX_SIGN end SilphCo_7F_EventScript_Joshua:: trainerbattle_single TRAINER_SCIENTIST_JOSHUA, SilphCo_7F_Text_JoshuaIntro, SilphCo_7F_Text_JoshuaDefeat msgbox SilphCo_7F_Text_JoshuaPostBattle, MSGBOX_AUTOCLOSE end SilphCo_7F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_33, SilphCo_7F_Text_Grunt1Intro, SilphCo_7F_Text_Grunt1Defeat msgbox SilphCo_7F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end SilphCo_7F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_34, SilphCo_7F_Text_Grunt2Intro, SilphCo_7F_Text_Grunt2Defeat msgbox SilphCo_7F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end SilphCo_7F_EventScript_Grunt3:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_35, SilphCo_7F_Text_Grunt3Intro, SilphCo_7F_Text_Grunt3Defeat msgbox SilphCo_7F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE end SilphCo_7F_EventScript_RivalGivesLinkBracelet:: msgbox SilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_0 giveitem_msg SilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_1, ITEM_LINK_BRACELET, 1, MUS_OBTAIN_KEY_ITEM msgbox SilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_2 closemessage call_if_eq VAR_TEMP_1, 0, SilphCo_7F_EventScript_RivalToWarpTileTop call_if_eq VAR_TEMP_1, 1, SilphCo_7F_EventScript_RivalToWarpTileBottom return SilphCo_7F_EventScript_RivalToWarpTileTop: applymovement 1, Movement_RivalToWarpTileTop waitmovement 0 return SilphCo_7F_EventScript_RivalToWarpTileBottom: applymovement 1, Movement_RivalToWarpTileBottom waitmovement 0 return Movement_RivalToWarpTileTop: walk_right walk_right delay_16 step_end Movement_RivalToWarpTileBottom: walk_right walk_right walk_right delay_16 step_end SilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_0: .string "Oh, yeah, right.\pYou're so far behind me now that\nthis probably won't matter but…\pI found a pair of bracelets that\ncan evolve certain POKéMON, but\lthey barely work unless you give\lone to someone else.\pHere, {PLAYER}. I feel sorry for\nyou, so you can have this.$" SilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_1: .string "{PLAYER} received a LINK BRACELET\nfrom {RIVAL}!$" SilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_2: .string "All right, I'm really going this\ntime. Smell ya!$" SilphCo_7F_EventScript_WorkerBro:: msgbox SilphCo_7F_Text_WorkerBro, MSGBOX_NPC end SilphCo_7F_Text_WorkerBro: .string "I am one of the four SILPH\n" .string "BROTHERS!\p" .string "I make sure the company servers\n" .string "are working properly!$" SilphCo_7F_EventScript_WorkerFPhone:: lock msgbox SilphCo_7F_Text_WorkerFPhone release msgbox SilphCo_7F_Text_WorkerFPhone2, MSGBOX_NPC turnobject 13, DIR_NORTH end SilphCo_7F_Text_WorkerFPhone: .string "Have you tried doing what I\n" .string "suggested earlier?\p" .string "I'm telling you it'd work.\n" .string "Okay, call me back.$" SilphCo_7F_Text_WorkerFPhone2: .string "My coworker downstairs asks\n" .string "me for help all the time.\p" .string "I usually figure out the\n" .string "solution pretty quickly…\p" .string "But does he ever listen to\n" .string "me the first time?\p" .string "No!\n" .string "Of course not!$" SilphCo_7F_EventScript_Painting:: goto_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_7F_EventScript_NewPainting msgbox Text_Painting, MSGBOX_SIGN end SilphCo_7F_EventScript_NewPainting:: msgbox SilphCo_7F_Text_NewPainting, MSGBOX_SIGN end SilphCo_7F_Text_NewPainting: .string "It's a gorgeous painting of a bird\n" .string "POKéMON darting between the trees.$" ================================================ FILE: data/maps/SilphCo_7F/text.inc ================================================ SilphCo_7F_Text_HaveMonForSavingUs:: .string "Oh! Hi! You're not a ROCKET!\n" .string "You came to save us?\l" .string "Why, thank you!\p" .string "I want you to have this POKéMON\n" .string "for saving us.$" SilphCo_7F_Text_ObtainedLaprasFromEmployee:: .string "{PLAYER} obtained a LAPRAS from\n" .string "the SILPH employee!$" SilphCo_7F_Text_ExplainLapras:: .string "It's a LAPRAS.\n" .string "It's a very intelligent POKéMON.\p" .string "We kept it in our lab, but it will\n" .string "be much better off with you.\p" .string "I think you will be a good TRAINER\n" .string "for LAPRAS!\p" .string "It's a good swimmer.\n" .string "It'll give you a lift across water!$" SilphCo_7F_Text_RocketBossWentToBoardroom:: .string "TEAM ROCKET's BOSS went to the\n" .string "boardroom!\p" .string "Is our PRESIDENT okay?\n" .string "I'm worried.$" SilphCo_7F_Text_RocketsAfterMasterBall:: .string "TEAM ROCKET was after the MASTER\n" .string "BALL, which catches any POKéMON.$" SilphCo_7F_Text_CanceledMasterBallProject:: .string "We canceled the MASTER BALL\n" .string "project because of TEAM ROCKET.$" SilphCo_7F_Text_BadIfTeamRocketTookOver:: .string "It would be bad if TEAM ROCKET\n" .string "took over SILPH or our POKéMON.$" SilphCo_7F_Text_WowYouChasedOffTeamRocket:: .string "Wow!\p" .string "You chased off TEAM ROCKET all by\n" .string "yourself?$" SilphCo_7F_Text_ReallyDangerousHere:: .string "You!\n" .string "It's really dangerous here!\p" .string "You came to save me?\n" .string "You can't!$" SilphCo_7F_Text_ThankYouSoMuch:: .string "Thank you so much!$" SilphCo_7F_Text_Grunt3Intro:: .string "Uh-oh!\n" .string "I smell a little mouse!$" SilphCo_7F_Text_Grunt3Defeat:: .string "Lights out!$" SilphCo_7F_Text_Grunt3PostBattle:: .string "You won't find my BOSS by just\n" .string "scurrying around!$" SilphCo_7F_Text_JoshuaIntro:: .string "Heheh!\p" .string "You mistook me for a SILPH worker?$" SilphCo_7F_Text_JoshuaDefeat:: .string "I'm done!$" SilphCo_7F_Text_JoshuaPostBattle:: .string "Despite your age, you are a\n" .string "skilled TRAINER!$" SilphCo_7F_Text_Grunt1Intro:: .string "I am one of the four ROCKET\n" .string "BROTHERS!$" SilphCo_7F_Text_Grunt1Defeat:: .string "Aack!\n" .string "Brothers, I lost!$" SilphCo_7F_Text_Grunt1PostBattle:: .string "Doesn't matter.\n" .string "My brothers will repay the favor!$" SilphCo_7F_Text_Grunt2Intro:: .string "A child intruder?\n" .string "That must be you!$" SilphCo_7F_Text_Grunt2Defeat:: .string "Fine!\n" .string "I lost!$" SilphCo_7F_Text_Grunt2PostBattle:: .string "Go on home before my BOSS gets\n" .string "ticked off!$" SilphCo_7F_Text_RivalWhatKeptYou:: .string "{RIVAL}: What kept you, {PLAYER}?$" SilphCo_7F_Text_RivalIntro:: .string "{RIVAL}: Hahaha! I thought you'd\n" .string "turn up if I waited here!\p" .string "I guess TEAM ROCKET slowed you\n" .string "down! Not that I care!\p" .string "I saw you in SAFFRON, so I decided\n" .string "to see if you got better!$" SilphCo_7F_Text_RivalDefeat:: .string "Oh, man!\n" .string "So, you are ready for BOSS\l" .string "ROCKET!$" SilphCo_7F_Text_RivalPostBattle:: .string "Well, {PLAYER}!\n" .string "I'm moving on up and ahead!\p" .string "By checking my POKéDEX, I'm\n" .string "starting to see what's strong and\l" .string "how they evolve!\p" .string "Am I a genius or what?\p" .string "I'm going to the POKéMON LEAGUE to\n" .string "boot out the ELITE FOUR.\p" .string "I'll become the world's most\n" .string "powerful TRAINER!\p" .string "{PLAYER}, well, good luck to you!\n" .string "Don't sweat it!\l" .string "Smell ya!$" SilphCo_7F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "7F$" ================================================ FILE: data/maps/SilphCo_8F/map.json ================================================ { "id": "MAP_SILPH_CO_8F", "name": "SilphCo_8F", "layout": "LAYOUT_SILPH_CO_8F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 8, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 28, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SilphCo_8F_EventScript_Grunt1", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 10, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "SilphCo_8F_EventScript_Grunt2", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SilphCo_8F_EventScript_Parker", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_8F_EventScript_WorkerM", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 24, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_8F_EventScript_ItemIron", "flag": "FLAG_HIDE_SILPH_CO_8F_IRON" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 29, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_8F_EventScript_Scientist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 0, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_8F_EventScript_ScientistBro", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 9, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_8F_EventScript_WorkerF", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WIGGLYTUFF", "in_connection": false, "x": 9, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SSAnne_1F_Room3_EventScript_Wigglytuff", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" } ], "warp_events": [ { "x": 16, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_9F", "dest_warp_id": "0" }, { "x": 11, "y": 10, "elevation": 3, "dest_map": "MAP_SILPH_CO_8F", "dest_warp_id": "4" }, { "x": 10, "y": 6, "elevation": 3, "dest_map": "MAP_SILPH_CO_2F", "dest_warp_id": "5" }, { "x": 28, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_7F", "dest_warp_id": "3" }, { "x": 2, "y": 12, "elevation": 3, "dest_map": "MAP_SILPH_CO_8F", "dest_warp_id": "1" }, { "x": 2, "y": 17, "elevation": 3, "dest_map": "MAP_SILPH_CO_2F", "dest_warp_id": "2" }, { "x": 22, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 6, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_8F_EventScript_Door" }, { "type": "sign", "x": 6, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_8F_EventScript_Door" }, { "type": "sign", "x": 5, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_8F_EventScript_Door" }, { "type": "sign", "x": 5, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_8F_EventScript_Door" }, { "type": "hidden_item", "x": 29, "y": 10, "elevation": 0, "item": "ITEM_NUGGET", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_8F_NUGGET", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 27, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_8F_EventScript_FloorSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_8F/scripts.inc ================================================ SilphCo_8F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_8F_OnLoad .byte 0 SilphCo_8F_OnLoad:: call_if_unset FLAG_SILPH_8F_DOOR, EventScript_Close8FDoor call_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_8F_EventScript_ScientistPosition end SilphCo_8F_EventScript_ScientistPosition:: setobjectmovementtype 6, MOVEMENT_TYPE_WANDER_AROUND setobjectxyperm 6, 26, 11 return SilphCo_8F_EventScript_WorkerM:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_8F_EventScript_WorkerMRocketsGone msgbox SilphCo_8F_Text_WonderIfSilphIsFinished release end SilphCo_8F_EventScript_WorkerMRocketsGone:: msgbox SilphCo_8F_Text_ThanksForSavingUs release end SilphCo_8F_EventScript_FloorSign:: msgbox SilphCo_8F_Text_FloorSign, MSGBOX_SIGN end SilphCo_8F_EventScript_Parker:: trainerbattle_single TRAINER_SCIENTIST_PARKER, SilphCo_8F_Text_ParkerIntro, SilphCo_8F_Text_ParkerDefeat msgbox SilphCo_8F_Text_ParkerPostBattle, MSGBOX_AUTOCLOSE end SilphCo_8F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_32, SilphCo_8F_Text_Grunt1Intro, SilphCo_8F_Text_Grunt1Defeat msgbox SilphCo_8F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end SilphCo_8F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_36, SilphCo_8F_Text_Grunt2Intro, SilphCo_8F_Text_Grunt2Defeat msgbox SilphCo_8F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end SilphCo_8F_EventScript_ScientistBro:: msgbox SilphCo_8F_Text_ScientistBro, MSGBOX_NPC end SilphCo_8F_Text_ScientistBro: .string "I am one of the four SILPH\n" .string "BROTHERS!\p" .string "I'm not actually sure what I do\n" .string "for the company…\p" .string "Nobody has come to give me\n" .string "work to do in a while…\p" .string "Have they forgotten about me?\n" .string "Do I just come in and do nothing?\p" .string "At least I'm still getting paid.$" SilphCo_8F_EventScript_WorkerF:: msgbox SilphCo_8F_Text_WorkerF, MSGBOX_NPC end SilphCo_8F_Text_WorkerF: .string "Can't talk, I've gotta eat fast!\n" .string "My lunch break is almost over!\p" .string "Hurry up, WIGGLYTUFF!\n" .string "Don't make me late again!$" ================================================ FILE: data/maps/SilphCo_8F/text.inc ================================================ SilphCo_8F_Text_WonderIfSilphIsFinished:: .string "I wonder if SILPH is finished…$" SilphCo_8F_Text_ThanksForSavingUs:: .string "Thanks for saving us!$" SilphCo_8F_Text_Grunt1Intro:: .string "That's as far as you'll go!$" SilphCo_8F_Text_Grunt1Defeat:: .string "Not enough grit!$" SilphCo_8F_Text_Grunt1PostBattle:: .string "If you don't turn back…\n" .string "I'll call for backup!$" SilphCo_8F_Text_ParkerIntro:: .string "You're causing us problems!$" SilphCo_8F_Text_ParkerDefeat:: .string "Huh?\n" .string "I lost?$" SilphCo_8F_Text_ParkerPostBattle:: .string "So, what do you think of SILPH\n" .string "BUILDING's maze?$" SilphCo_8F_Text_Grunt2Intro:: .string "I am one of the four ROCKET\n" .string "BROTHERS!$" SilphCo_8F_Text_Grunt2Defeat:: .string "Whoo!\n" .string "Oh, Brothers!$" SilphCo_8F_Text_Grunt2PostBattle:: .string "I'll leave you up to my brothers.$" SilphCo_8F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "8F$" SilphCo_8F_Text_ToRocketBossMonsAreTools:: .string "TEAM ROCKET's BOSS is terribly\n" .string "cruel!\p" .string "To him, POKéMON are just tools to\n" .string "be used.\p" .string "What will happen if that tyrant\n" .string "takes over our company…$" ================================================ FILE: data/maps/SilphCo_9F/map.json ================================================ { "id": "MAP_SILPH_CO_9F", "name": "SilphCo_9F", "layout": "LAYOUT_SILPH_CO_9F", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 9, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 26, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SilphCo_9F_EventScript_Ed", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 15, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SilphCo_9F_EventScript_Grunt2", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 2, "y": 16, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_HealWoman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 1, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "SilphCo_9F_EventScript_Grunt1", "flag": "FLAG_HIDE_SILPH_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 10, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_BragWorkerM", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_WorkerF", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 6, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_Scientist", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PIDGEY", "in_connection": false, "x": 9, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_House3_EventScript_Pidgey", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 19, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_Newbie", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 20, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_Woman", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 26, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_LittleBoy", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 26, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_LittleGirl", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GBA_KID", "in_connection": false, "x": 23, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_GBAKid", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 20, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_SeelGirl", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEEL", "in_connection": false, "x": 19, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonFanClub_EventScript_Seel", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_M", "in_connection": false, "x": 1, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_SleepTalkTutor", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 3, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SilphCo_9F_EventScript_NightmareTutor", "flag": "FLAG_HIDE_SAFFRON_CIVILIANS" } ], "warp_events": [ { "x": 16, "y": 2, "elevation": 0, "dest_map": "MAP_SILPH_CO_8F", "dest_warp_id": "0" }, { "x": 22, "y": 18, "elevation": 3, "dest_map": "MAP_SILPH_CO_5F", "dest_warp_id": "3" }, { "x": 9, "y": 4, "elevation": 3, "dest_map": "MAP_SILPH_CO_3F", "dest_warp_id": "4" }, { "x": 18, "y": 2, "elevation": 3, "dest_map": "MAP_SILPH_CO_10F", "dest_warp_id": "3" }, { "x": 24, "y": 3, "elevation": 0, "dest_map": "MAP_SILPH_CO_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 11, "y": 14, "elevation": 3, "item": "ITEM_MAX_POTION", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_9F_MAX_POTION", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 3, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door1" }, { "type": "sign", "x": 3, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door1" }, { "type": "sign", "x": 13, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door2" }, { "type": "sign", "x": 13, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door2" }, { "type": "sign", "x": 21, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door3" }, { "type": "sign", "x": 22, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door3" }, { "type": "sign", "x": 22, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door3" }, { "type": "sign", "x": 21, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door3" }, { "type": "sign", "x": 21, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door4" }, { "type": "sign", "x": 21, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door4" }, { "type": "sign", "x": 22, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door4" }, { "type": "sign", "x": 22, "y": 13, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door4" }, { "type": "sign", "x": 2, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door1" }, { "type": "sign", "x": 2, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door1" }, { "type": "sign", "x": 12, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door2" }, { "type": "sign", "x": 12, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_Door2" }, { "type": "hidden_item", "x": 5, "y": 8, "elevation": 0, "item": "ITEM_CALCIUM", "flag": "FLAG_HIDDEN_ITEM_SILPH_CO_9F_CALCIUM", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 17, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_9F_EventScript_FloorSign" } ], "level_scaling": "3" } ================================================ FILE: data/maps/SilphCo_9F/scripts.inc ================================================ SilphCo_9F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SilphCo_9F_OnLoad .byte 0 SilphCo_9F_OnLoad:: call_if_unset FLAG_SILPH_9F_DOOR_1, EventScript_Close9FDoor1 call_if_unset FLAG_SILPH_9F_DOOR_2, EventScript_Close9FDoor2 call_if_unset FLAG_SILPH_9F_DOOR_3, EventScript_Close9FDoor3 call_if_unset FLAG_SILPH_9F_DOOR_4, EventScript_Close9FDoor4 end SilphCo_9F_EventScript_HealWoman:: lock faceplayer goto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_9F_EventScript_HealWomanRocketsGone msgbox SilphCo_9F_Text_YouShouldTakeQuickNap closemessage call EventScript_OutOfCenterPartyHeal msgbox SilphCo_9F_Text_DontGiveUp release end SilphCo_9F_EventScript_HealWomanRocketsGone:: msgbox SilphCo_9F_Text_ThankYouSoMuch release end SilphCo_9F_EventScript_FloorSign:: msgbox SilphCo_9F_Text_FloorSign, MSGBOX_SIGN end SilphCo_9F_EventScript_Ed:: trainerbattle_single TRAINER_SCIENTIST_ED, SilphCo_9F_Text_EdIntro, SilphCo_9F_Text_EdDefeat msgbox SilphCo_9F_Text_EdPostBattle, MSGBOX_AUTOCLOSE end SilphCo_9F_EventScript_Grunt1:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_37, SilphCo_9F_Text_Grunt1Intro, SilphCo_9F_Text_Grunt1Defeat msgbox SilphCo_9F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE end SilphCo_9F_EventScript_Grunt2:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_38, SilphCo_9F_Text_Grunt2Intro, SilphCo_9F_Text_Grunt2Defeat msgbox SilphCo_9F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE end SilphCo_9F_EventScript_Woman:: msgbox SilphCo_9F_Text_Woman, MSGBOX_NPC end SilphCo_9F_Text_Woman: .string "Oh, hello.\n" .string "Do your parents work here?\p" .string "SILPH CO. provides childcare\n" .string "for workers who need it.\p" .string "Fortunately, we were out on\n" .string "a trip when the ROCKETS came.$" SilphCo_9F_EventScript_GBAKid:: msgbox SilphCo_9F_Text_GBAKid, MSGBOX_NPC end SilphCo_9F_Text_GBAKid: .string "Hey, aren't you the TRAINER\n" .string "that stopped TEAM ROCKET?\l" .string "What are you doing back here?\p" .string "Did you miss some of the stuff\n" .string "the ROCKETS dropped?$" SilphCo_9F_EventScript_LittleGirl:: msgbox SilphCo_9F_Text_LittleGirl, MSGBOX_NPC end SilphCo_9F_Text_LittleGirl: .string "If a mean guy took over this room,\n" .string "you know what I'd do?\p" .string "I tell him to go home, but I'd\n" .string "be really loud!\l" .string "He'd have to listen after that!$" SilphCo_9F_EventScript_LittleBoy:: msgbox SilphCo_9F_Text_LittleBoy, MSGBOX_NPC end SilphCo_9F_Text_LittleBoy: .string "What's your favorite POKéMON?\p" .string "I don't have one, but I do have\n" .string "a least favorite.\p" .string "…\n" .string "It's SEEL…$" SilphCo_9F_EventScript_SeelGirl:: msgbox SilphCo_9F_Text_SeelGirl, MSGBOX_NPC end SilphCo_9F_Text_SeelGirl: .string "My SEEL gets jealous when I spend\n" .string "time with other kids.\p" .string "My friend gets jealous when I spend\n" .string "time with SEEL.\p" .string "I just can't win!$" SilphCo_9F_EventScript_Newbie:: msgbox SilphCo_9F_Text_Newbie, MSGBOX_NPC end SilphCo_9F_Text_Newbie: .string "I'm new a brand new hire.\n" .string "It's hard learning my way around.\p" .string "And who decided these pads were\n" .string "a good idea, anyway?\p" .string "I try to go to the water cooler\n" .string "and suddenly I'm four floors up\l" .string "and totally lost.$" SilphCo_9F_EventScript_WorkerF:: msgbox SilphCo_9F_Text_WorkerF release end SilphCo_9F_Text_WorkerF: .string "I can't believe you fought\n" .string "all those ROCKETS.\p" .string "You're so brave!$" SilphCo_9F_EventScript_BragWorkerM:: msgbox SilphCo_9F_Text_BragWorkerM release end SilphCo_9F_Text_BragWorkerM: .string "PIDGEY and I took on two\n" .string "of those ROCKET GRUNTS solo!\p" .string "They had two big RHYDON and four\n" .string "humongous GYARADOS between them!\p" .string "It was no use, though, PIDGEY\n" .string "and I wiped the floor with them.\p" .string "I doubt they'll be back any time\n" .string "soon after the thrashing they got.$" SilphCo_9F_EventScript_Scientist:: msgbox SilphCo_9F_Text_Scientist, MSGBOX_NPC end SilphCo_9F_Text_Scientist: .string "I remember this story differently.\p" .string "It was one ROCKET GRUNT with a\n" .string "RATTATA and a ZUBAT.\p" .string "PIDGEY lost so badly that the\n" .string "GRUNT said it wasn't worth stealing.\p" .string "Then he shoved them both\n" .string "in a utility closet.$" ================================================ FILE: data/maps/SilphCo_9F/text.inc ================================================ SilphCo_9F_Text_YouShouldTakeQuickNap:: .string "You look tired.\n" .string "You should take a quick nap.$" SilphCo_9F_Text_DontGiveUp:: .string "Don't give up!$" SilphCo_9F_Text_ThankYouSoMuch:: .string "Thank you so much.$" SilphCo_9F_Text_Grunt1Intro:: .string "Your POKéMON seem to adore you,\n" .string "kid!$" SilphCo_9F_Text_Grunt1Defeat:: .string "Ghaaah!$" SilphCo_9F_Text_Grunt1PostBattle:: .string "If I had started as a TRAINER at\n" .string "your age…$" SilphCo_9F_Text_EdIntro:: .string "Your POKéMON have weak points!\n" .string "I can nail them!$" SilphCo_9F_Text_EdDefeat:: .string "You hammered me!$" SilphCo_9F_Text_EdPostBattle:: .string "Exploiting weak spots does work.\n" .string "Think about type advantages.$" SilphCo_9F_Text_Grunt2Intro:: .string "I am one of the four ROCKET\n" .string "BROTHERS!$" SilphCo_9F_Text_Grunt2Defeat:: .string "Warg!\n" .string "Brothers, I lost!$" SilphCo_9F_Text_Grunt2PostBattle:: .string "My brothers will avenge me!$" SilphCo_9F_Text_FloorSign:: .string "SILPH CO. HEAD OFFICE\n" .string "9F$" ================================================ FILE: data/maps/SilphCo_Elevator/map.json ================================================ { "id": "MAP_SILPH_CO_ELEVATOR", "name": "SilphCo_Elevator", "layout": "LAYOUT_SILPH_CO_ELEVATOR", "music": "MUS_SILPH", "region_map_section": "MAPSEC_SILPH_CO", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 0, "y": 2, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SilphCo_Elevator_EventScript_FloorSelect" } ], "level_scaling": "0" } ================================================ FILE: data/maps/SilphCo_Elevator/scripts.inc ================================================ SilphCo_Elevator_MapScripts:: .byte 0 SilphCo_Elevator_EventScript_FloorSelect:: lockall setvar VAR_0x8004, 1 call_if_unset FLAG_TEMP_2, EventScript_GetElevatorFloor copyvar VAR_0x8005, VAR_ELEVATOR_FLOOR special DrawElevatorCurrentFloorWindow message Text_WantWhichFloor waitmessage setvar VAR_0x8004, LISTMENU_SILPHCO_FLOORS specialvar VAR_RESULT, InitElevatorFloorSelectMenuPos special ListMenu waitstate switch VAR_RESULT case 0, SilphCo_Elevator_EventScript_To11F case 1, SilphCo_Elevator_EventScript_To10F case 2, SilphCo_Elevator_EventScript_To9F case 3, SilphCo_Elevator_EventScript_To8F case 4, SilphCo_Elevator_EventScript_To7F case 5, SilphCo_Elevator_EventScript_To6F case 6, SilphCo_Elevator_EventScript_To5F case 7, SilphCo_Elevator_EventScript_To4F case 8, SilphCo_Elevator_EventScript_To3F case 9, SilphCo_Elevator_EventScript_To2F case 10, SilphCo_Elevator_EventScript_To1F case 11, SilphCo_Elevator_EventScript_ExitFloorSelect case 127, SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To1F:: setvar VAR_0x8006, 4 setdynamicwarp MAP_SILPH_CO_1F, 255, 22, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 4, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 4 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To2F:: setvar VAR_0x8006, 5 setdynamicwarp MAP_SILPH_CO_2F, 255, 22, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 5, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 5 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To3F:: setvar VAR_0x8006, 6 setdynamicwarp MAP_SILPH_CO_3F, 255, 22, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 6, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 6 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To4F:: setvar VAR_0x8006, 7 setdynamicwarp MAP_SILPH_CO_4F, 255, 22, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 7, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 7 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To5F:: setvar VAR_0x8006, 8 setdynamicwarp MAP_SILPH_CO_5F, 255, 22, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 8, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 8 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To6F:: setvar VAR_0x8006, 9 setdynamicwarp MAP_SILPH_CO_6F, 255, 20, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 9, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 9 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To7F:: setvar VAR_0x8006, 10 setdynamicwarp MAP_SILPH_CO_7F, 255, 23, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 10, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 10 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To8F:: setvar VAR_0x8006, 11 setdynamicwarp MAP_SILPH_CO_8F, 255, 22, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 11, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 11 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To9F:: setvar VAR_0x8006, 12 setdynamicwarp MAP_SILPH_CO_9F, 255, 24, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 12, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 12 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To10F:: setvar VAR_0x8006, 13 setdynamicwarp MAP_SILPH_CO_10F, 255, 13, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 13, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 13 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_To11F:: setvar VAR_0x8006, 14 setdynamicwarp MAP_SILPH_CO_11F, 255, 13, 3 goto_if_eq VAR_ELEVATOR_FLOOR, 14, SilphCo_Elevator_EventScript_ExitFloorSelect call SilphCo_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 14 goto SilphCo_Elevator_EventScript_ExitFloorSelect end SilphCo_Elevator_EventScript_ExitFloorSelect:: special CloseElevatorCurrentFloorWindow releaseall end SilphCo_Elevator_EventScript_MoveElevator:: special CloseElevatorCurrentFloorWindow closemessage waitse special AnimateElevator waitstate setflag FLAG_TEMP_2 return ================================================ FILE: data/maps/SixIsland/map.json ================================================ { "id": "MAP_SIX_ISLAND", "name": "SixIsland", "layout": "LAYOUT_SIX_ISLAND", "music": "MUS_SEVII_45", "region_map_section": "MAPSEC_SIX_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "right", "offset": -40, "map": "MAP_SIX_ISLAND_WATER_PATH" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 11, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_EventScript_Boy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 16, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_EventScript_Hiker", "flag": "0" } ], "warp_events": [ { "x": 12, "y": 24, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_HARBOR", "dest_warp_id": "0" }, { "x": 12, "y": 11, "elevation": 0, "dest_map": "MAP_SIX_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "0" }, { "x": 18, "y": 17, "elevation": 0, "dest_map": "MAP_SIX_ISLAND_HOUSE", "dest_warp_id": "0" }, { "x": 20, "y": 11, "elevation": 0, "dest_map": "MAP_SIX_ISLAND_MART", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 10, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SixIsland_EventScript_IslandSign" }, { "type": "hidden_item", "x": 10, "y": 7, "elevation": 3, "item": "ITEM_LEPPA_BERRY", "flag": "FLAG_HIDDEN_ITEM_SIX_ISLAND_LEPPA_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland/scripts.inc ================================================ SixIsland_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SixIsland_OnTransition .byte 0 SixIsland_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SIX_ISLAND end SixIsland_EventScript_Hiker:: msgbox SixIsland_Text_ThatWayToWaterPathRuinValley, MSGBOX_NPC end SixIsland_EventScript_Boy:: msgbox SixIsland_Text_SkyAtNightIsFantastic, MSGBOX_NPC end SixIsland_EventScript_IslandSign:: msgbox SixIsland_Text_IslandSign, MSGBOX_SIGN end ================================================ FILE: data/maps/SixIsland/text.inc ================================================ SixIsland_Text_IslandSign:: .string "SIX ISLAND\n" .string "Fortune Island of Aged Wisdom$" SixIsland_Text_ThatWayToWaterPathRuinValley:: .string "Keep going this way and you'll get\n" .string "to the WATER PATH.\p" .string "Stay on that and you'll get to\n" .string "the RUIN VALLEY.$" SixIsland_Text_SkyAtNightIsFantastic:: .string "When you're this far away from the\n" .string "city, the sky at night is fantastic.$" ================================================ FILE: data/maps/SixIsland_AlteringCave/map.json ================================================ { "id": "MAP_SIX_ISLAND_ALTERING_CAVE", "name": "SixIsland_AlteringCave", "layout": "LAYOUT_SIX_ISLAND_ALTERING_CAVE", "music": "MUS_SEVII_CAVE", "region_map_section": "MAPSEC_ALTERING_CAVE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 18, "y": 22, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_OUTCAST_ISLAND", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_AlteringCave/scripts.inc ================================================ SixIsland_AlteringCave_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SixIsland_AlteringCave_OnTransition .byte 0 SixIsland_AlteringCave_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE end ================================================ FILE: data/maps/SixIsland_DottedHole_1F/map.json ================================================ { "id": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "name": "SixIsland_DottedHole_1F", "layout": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_1F", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_DOTTED_HOLE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 6, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_RUIN_VALLEY", "dest_warp_id": "0" }, { "x": 6, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_B1F", "dest_warp_id": "0" }, { "x": 13, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM", "dest_warp_id": "0" }, { "x": 6, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_B1F", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_DottedHole_1F/scripts.inc ================================================ SixIsland_DottedHole_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SixIsland_DottedHole_1F_OnTransition .byte 0 SixIsland_DottedHole_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F end SixIsland_DottedHole_B1F_EventScript_BrailleUp:: lockall braillemessage Braille_Text_Up waitbuttonpress releaseall end SixIsland_DottedHole_B4F_EventScript_BrailleDown:: lockall braillemessage Braille_Text_Down waitbuttonpress releaseall end SixIsland_DottedHole_B3F_EventScript_BrailleRight:: lockall braillemessage Braille_Text_Right waitbuttonpress releaseall end SixIsland_DottedHole_B2F_EventScript_BrailleLeft:: lockall braillemessage Braille_Text_Left waitbuttonpress releaseall end ================================================ FILE: data/maps/SixIsland_DottedHole_B1F/map.json ================================================ { "id": "MAP_SIX_ISLAND_DOTTED_HOLE_B1F", "name": "SixIsland_DottedHole_B1F", "layout": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_B1F", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_DOTTED_HOLE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 6, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "1" }, { "x": 6, "y": 1, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_B2F", "dest_warp_id": "0" }, { "x": 11, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" }, { "x": 6, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" }, { "x": 1, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 6, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "SixIsland_DottedHole_B1F_EventScript_BrailleUp" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_DottedHole_B1F/scripts.inc ================================================ SixIsland_DottedHole_B1F_MapScripts:: .byte 0 ================================================ FILE: data/maps/SixIsland_DottedHole_B2F/map.json ================================================ { "id": "MAP_SIX_ISLAND_DOTTED_HOLE_B2F", "name": "SixIsland_DottedHole_B2F", "layout": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_B2F", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_DOTTED_HOLE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 6, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_B1F", "dest_warp_id": "1" }, { "x": 6, "y": 1, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" }, { "x": 11, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" }, { "x": 6, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" }, { "x": 1, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_B3F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 6, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "SixIsland_DottedHole_B2F_EventScript_BrailleLeft" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_DottedHole_B2F/scripts.inc ================================================ SixIsland_DottedHole_B2F_MapScripts:: .byte 0 ================================================ FILE: data/maps/SixIsland_DottedHole_B3F/map.json ================================================ { "id": "MAP_SIX_ISLAND_DOTTED_HOLE_B3F", "name": "SixIsland_DottedHole_B3F", "layout": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_B3F", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_DOTTED_HOLE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 6, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_B2F", "dest_warp_id": "4" }, { "x": 6, "y": 1, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" }, { "x": 11, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_B4F", "dest_warp_id": "0" }, { "x": 6, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" }, { "x": 1, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 6, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "SixIsland_DottedHole_B3F_EventScript_BrailleRight" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_DottedHole_B3F/scripts.inc ================================================ SixIsland_DottedHole_B3F_MapScripts:: .byte 0 ================================================ FILE: data/maps/SixIsland_DottedHole_B4F/map.json ================================================ { "id": "MAP_SIX_ISLAND_DOTTED_HOLE_B4F", "name": "SixIsland_DottedHole_B4F", "layout": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_B4F", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_DOTTED_HOLE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ ], "warp_events": [ { "x": 6, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_B3F", "dest_warp_id": "2" }, { "x": 6, "y": 1, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" }, { "x": 11, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" }, { "x": 6, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM", "dest_warp_id": "1" }, { "x": 1, "y": 5, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 6, "y": 5, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "SixIsland_DottedHole_B4F_EventScript_BrailleDown" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_DottedHole_B4F/scripts.inc ================================================ SixIsland_DottedHole_B4F_MapScripts:: .byte 0 ================================================ FILE: data/maps/SixIsland_DottedHole_SapphireRoom/map.json ================================================ { "id": "MAP_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM", "name": "SixIsland_DottedHole_SapphireRoom", "layout": "LAYOUT_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM", "music": "MUS_SEVII_DUNGEON", "region_map_section": "MAPSEC_DOTTED_HOLE", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAPPHIRE", "in_connection": false, "x": 7, "y": 7, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_DottedHole_SapphireRoom_EventScript_Sapphire", "flag": "FLAG_HIDE_SAPPHIRE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 5, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_DOTTED_HOLE_SCIENTIST" } ], "warp_events": [ { "x": 11, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "2" }, { "x": 5, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_B4F", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 7, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "SixIsland_DottedHole_SapphireRoom_EventScript_BrailleMessage" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_DottedHole_SapphireRoom/scripts.inc ================================================ .equ LOCALID_SAPPHIRE, 1 .equ LOCALID_THIEF, 2 SixIsland_DottedHole_SapphireRoom_MapScripts:: .byte 0 SixIsland_DottedHole_SapphireRoom_EventScript_Sapphire:: lock faceplayer textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_KEY_ITEM message SixIsland_DottedHole_SapphireRoom_Text_FoundSapphire waitmessage waitfanfare closemessage setobjectxyperm LOCALID_THIEF, 5, 0 addobject LOCALID_THIEF playse SE_FALL applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefFallIn waitmovement 0 playse SE_M_STRENGTH call_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft call_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft call_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown call_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown setvar VAR_0x8004, 3 setvar VAR_0x8005, 0 setvar VAR_0x8006, 12 setvar VAR_0x8007, 3 special ShakeScreen delay 60 call_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireNorth call_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireSouth call_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireEast call_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireWest textcolor NPC_TEXT_COLOR_MALE msgbox SixIsland_DottedHole_SapphireRoom_Text_IWasRightInTailingYou closemessage call_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireNorth call_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireSouth call_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireEast call_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireWest removeobject LOCALID_SAPPHIRE call_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft2 call_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft2 call_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown2 call_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown2 msgbox SixIsland_DottedHole_SapphireRoom_Text_SellToTeamRocketTellPassword closemessage call_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitNorth call_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitSouth call_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitEast call_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitWest playse SE_EXIT delay 35 removeobject LOCALID_THIEF setflag FLAG_LEARNED_YES_NAH_CHANSEY release end @ Lots of redundant scripts below SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft2:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown2:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireNorth:: applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromLeft waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireSouth:: applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromLeft waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireEast:: applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromBelow waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireWest:: applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromBelow waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireNorth:: applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromLeft waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireSouth:: applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromLeft waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireEast:: applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromBelow waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireWest:: applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromBelow waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitNorth:: applymovement OBJ_EVENT_ID_PLAYER, SixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitNorth waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitSouth:: applymovement OBJ_EVENT_ID_PLAYER, SixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitSouth waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitEast:: applymovement OBJ_EVENT_ID_PLAYER, SixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitEastWest waitmovement 0 return SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitWest:: applymovement OBJ_EVENT_ID_PLAYER, SixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit applymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitEastWest waitmovement 0 return SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromLeft:: walk_up walk_up walk_in_place_faster_right step_end SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromBelow:: walk_right walk_right walk_in_place_faster_up step_end SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromLeft:: walk_right step_end SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromBelow:: walk_up step_end SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitNorth:: walk_fast_up walk_fast_right walk_fast_right walk_fast_right walk_fast_down walk_fast_right walk_fast_right step_end SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitSouth:: walk_fast_down walk_fast_right walk_fast_right walk_fast_right walk_fast_up walk_fast_right walk_fast_right step_end SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitEastWest:: walk_fast_right walk_fast_right walk_fast_right walk_fast_right walk_fast_up step_end SixIsland_DottedHole_SapphireRoom_Movement_ThiefFallIn:: face_down disable_anim slide_down slide_down slide_down slide_down slide_down slide_down slide_down slide_down slide_down restore_anim step_end SixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit:: delay_16 walk_in_place_faster_right step_end SixIsland_DottedHole_SapphireRoom_EventScript_BrailleMessage:: lockall setvar VAR_0x8005, 130 braillemessage_wait Braille_Text_LetTheTwo braillemessage_wait Braille_Text_Glittering braillemessage_wait Braille_Text_Stones braillemessage_wait Braille_Text_OneInRed braillemessage_wait Braille_Text_OneInBlue braillemessage_wait Braille_Text_ConnectThe braillemessage_wait Braille_Text_Past braillemessage_wait Braille_Text_TwoFriends braillemessage_wait Braille_Text_Sharing braillemessage_wait Braille_Text_PowerOpen braillemessage_wait Braille_Text_AWindowTo braillemessage_wait Braille_Text_ANewWorld braillemessage_wait Braille_Text_ThatGlows braillemessage_wait Braille_Text_TheNext braillemessage_wait Braille_Text_WorldWaits braillemessage Braille_Text_ForYou waitbuttonpress releaseall end ================================================ FILE: data/maps/SixIsland_DottedHole_SapphireRoom/text.inc ================================================ SixIsland_DottedHole_SapphireRoom_Text_FoundSapphire:: .string "{PLAYER} found a SAPPHIRE!$" SixIsland_DottedHole_SapphireRoom_Text_IWasRightInTailingYou:: .string "Fufu… Fufufufu…\n" .string "I guessed right.\p" .string "I was right in tailing you!$" SixIsland_DottedHole_SapphireRoom_Text_SellToTeamRocketTellPassword:: .string "I knew that there was a SAPPHIRE\n" .string "here, so it belongs to me!\p" .string "I'll sell it to TEAM ROCKET for\n" .string "serious money.\p" .string "…D-don't glare at me like that!\p" .string "If you want it back, why don't you\n" .string "go get it after I sell it?\p" .string "I'll even tell you one of the\n" .string "passwords to TEAM ROCKET's\l" .string "WAREHOUSE.\p" .string "The WAREHOUSE password I know is\n" .string "“Yes, nah, CHANSEY.”\p" .string "I'm done.\n" .string "Don't think badly of me!$" ================================================ FILE: data/maps/SixIsland_GreenPath/map.json ================================================ { "id": "MAP_SIX_ISLAND_GREEN_PATH", "name": "SixIsland_GreenPath", "layout": "LAYOUT_SIX_ISLAND_GREEN_PATH", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_GREEN_PATH", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_SIX_ISLAND_OUTCAST_ISLAND" }, { "direction": "right", "offset": 0, "map": "MAP_SIX_ISLAND_WATER_PATH" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_F", "x": 11, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SixIsland_GreenPath_EventScript_Jaclyn", "flag": "0" } ], "warp_events": [ { "x": 67, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_PATTERN_BUSH", "dest_warp_id": "0" }, { "x": 68, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_PATTERN_BUSH", "dest_warp_id": "1" }, { "x": 69, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_PATTERN_BUSH", "dest_warp_id": "2" }, { "x": 46, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_PATTERN_BUSH", "dest_warp_id": 3 }, { "x": 47, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_PATTERN_BUSH", "dest_warp_id": "4" }, { "x": 48, "y": 9, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_PATTERN_BUSH", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 41, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SixIsland_GreenPath_EventScript_LeftRouteSign" }, { "type": "sign", "x": 75, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SixIsland_GreenPath_EventScript_RightRouteSign" }, { "type": "hidden_item", "x": 12, "y": 9, "elevation": 3, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_SIX_ISLAND_GREEN_PATH_ULTRA_BALL", "quantity": 1, "underfoot": false } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_GreenPath/scripts.inc ================================================ SixIsland_GreenPath_MapScripts:: .byte 0 SixIsland_GreenPath_EventScript_RightRouteSign:: msgbox SixIsland_GreenPath_Text_LeftRouteSign, MSGBOX_SIGN end SixIsland_GreenPath_EventScript_LeftRouteSign:: msgbox SixIsland_GreenPath_Text_RightRouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/SixIsland_GreenPath/text.inc ================================================ SixIsland_GreenPath_Text_JaclynIntro:: .string "…Huh?\p" .string "I was envisioning my house, but\n" .string "this is where I TELEPORT?$" SixIsland_GreenPath_Text_JaclynDefeat:: .string "Big boo-boo!$" SixIsland_GreenPath_Text_JaclynPostBattle:: .string "I am so scatterbrained!\p" .string "I need to focus so I can TELEPORT\n" .string "properly to my house!$" SixIsland_GreenPath_Text_LeftRouteSign:: .string "GREEN PATH\n" .string "PATTERN BUSH AHEAD$" SixIsland_GreenPath_Text_RightRouteSign:: .string "GREEN PATH\n" .string "Think Green, Keep Nature Clean!$" ================================================ FILE: data/maps/SixIsland_Harbor/map.json ================================================ { "id": "MAP_SIX_ISLAND_HARBOR", "name": "SixIsland_Harbor", "layout": "LAYOUT_ISLAND_HARBOR", "music": "MUS_SEVII_45", "region_map_section": "MAPSEC_SIX_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 8, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_Harbor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_SIX_ISLAND", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SixIsland_Harbor/scripts.inc ================================================ SixIsland_Harbor_MapScripts:: .byte 0 SixIsland_Harbor_EventScript_Sailor:: lock faceplayer message Text_WhereDoYouWantToSail waitmessage setvar VAR_0x8004, SEAGALLOP_SIX_ISLAND goto EventScript_ChooseDestFromIsland end ================================================ FILE: data/maps/SixIsland_House/map.json ================================================ { "id": "MAP_SIX_ISLAND_HOUSE", "name": "SixIsland_House", "layout": "LAYOUT_HOUSE3", "music": "MUS_SEVII_45", "region_map_section": "MAPSEC_SIX_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 7, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_House_EventScript_OldMan", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SixIsland_House/scripts.inc ================================================ SixIsland_House_MapScripts:: .byte 0 SixIsland_House_EventScript_OldMan:: msgbox SixIsland_House_Text_GoodPlaceForNatureAndHistory, MSGBOX_NPC end ================================================ FILE: data/maps/SixIsland_House/text.inc ================================================ SixIsland_House_Text_GoodPlaceForNatureAndHistory:: .string "There's nothing that young people'd\n" .string "find exciting here on this island.\p" .string "But, this is a good place in terms\n" .string "of nature and history.\p" .string "Relax and enjoy your stay.$" ================================================ FILE: data/maps/SixIsland_Mart/map.json ================================================ { "id": "MAP_SIX_ISLAND_MART", "name": "SixIsland_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SIX_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "in_connection": false, "x": 8, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_Mart_EventScript_OldWoman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 7, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_Mart_EventScript_Picnicker", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SixIsland_Mart/scripts.inc ================================================ SixIsland_Mart_MapScripts:: .byte 0 SixIsland_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart SixIsland_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 SixIsland_Mart_Items:: .2byte ITEM_ULTRA_BALL .2byte ITEM_FULL_RESTORE .2byte ITEM_MAX_POTION .2byte ITEM_REVIVE .2byte ITEM_FULL_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_MAX_REPEL .2byte ITEM_DREAM_MAIL .2byte ITEM_NONE release end SixIsland_Mart_EventScript_Picnicker:: msgbox SixIsland_Mart_Text_ShouldBuyMailAndWriteLetter, MSGBOX_NPC end ================================================ FILE: data/maps/SixIsland_Mart/text.inc ================================================ SixIsland_Mart_Text_AgathaOldestEverEliteFourMember:: .string "Play with POKéMON lots and live\n" .string "a long life!\p" .string "Take AGATHA, for example.\p" .string "She set a record for being the\n" .string "oldest-ever ELITE FOUR member.\p" .string "She spurs me to do bigger things.$" SixIsland_Mart_Text_ShouldBuyMailAndWriteLetter:: .string "I should buy some MAIL and write\n" .string "him a letter…$" ================================================ FILE: data/maps/SixIsland_OutcastIsland/map.json ================================================ { "id": "MAP_SIX_ISLAND_OUTCAST_ISLAND", "name": "SixIsland_OutcastIsland", "layout": "LAYOUT_SIX_ISLAND_OUTCAST_ISLAND", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_OUTCAST_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": 0, "map": "MAP_SIX_ISLAND_GREEN_PATH" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKET_M", "in_connection": false, "x": 9, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_OutcastIsland_EventScript_Rocket", "flag": "FLAG_HIDE_FIVE_ISLAND_ROCKETS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 12, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_OutcastIsland_EventScript_Tylor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 13, "y": 34, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_OutcastIsland_EventScript_Mymo", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 14, "y": 61, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT", "movement_range_x": 2, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_OutcastIsland_EventScript_Nicole", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 10, "y": 44, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_OutcastIsland_EventScript_Ava", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TUBER_M_WATER", "in_connection": false, "x": 11, "y": 44, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_OutcastIsland_EventScript_Geb", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 11, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_OutcastIsland_EventScript_ItemPPUp", "flag": "FLAG_HIDE_SIX_ISLAND_OUTCAST_ISLAND_PP_UP" } ], "warp_events": [ { "x": 7, "y": 21, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_ALTERING_CAVE", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 16, "y": 23, "elevation": 3, "item": "ITEM_STAR_PIECE", "flag": "FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_STAR_PIECE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 6, "y": 24, "elevation": 3, "item": "ITEM_NET_BALL", "flag": "FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_NET_BALL", "quantity": 1, "underfoot": false } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_OutcastIsland/scripts.inc ================================================ SixIsland_OutcastIsland_MapScripts:: .byte 0 SixIsland_OutcastIsland_EventScript_Rocket:: trainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_46, SixIsland_OutcastIsland_Text_RocketIntro, SixIsland_OutcastIsland_Text_RocketDefeat msgbox SixIsland_OutcastIsland_Text_RocketPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SixIsland_OutcastIsland/text.inc ================================================ SixIsland_OutcastIsland_Text_RocketIntro:: .string "There're no rare POKéMON around\n" .string "these parts! Not a one!\p" .string "That burns me up, man.\n" .string "I'll take it out on you!$" SixIsland_OutcastIsland_Text_RocketDefeat:: .string "…Huh?$" SixIsland_OutcastIsland_Text_RocketPostBattle:: .string "So listen, you haven't seen any\n" .string "rare POKéMON, have you?$" SixIsland_OutcastIsland_Text_TylorIntro:: .string "I'm having no luck at all.\n" .string "A battle'd be a change of pace!$" SixIsland_OutcastIsland_Text_TylorDefeat:: .string "Nope, no luck at all…$" SixIsland_OutcastIsland_Text_TylorPostBattle:: .string "I can't very well go home without\n" .string "catching something, though.$" SixIsland_OutcastIsland_Text_MymoIntro:: .string "Gasp… Gasp…\p" .string "I swam here from SIX ISLE PORT\n" .string "in one go.$" SixIsland_OutcastIsland_Text_MymoDefeat:: .string "Gasp…\n" .string "Gasp…$" SixIsland_OutcastIsland_Text_MymoPostBattle:: .string "I'm only at the halfway point…\n" .string "I'm beat…$" SixIsland_OutcastIsland_Text_NicoleIntro:: .string "It's not so easy sending POKéMON\n" .string "out while swimming, you know?$" SixIsland_OutcastIsland_Text_NicoleDefeat:: .string "I didn't lose to you at swimming.\n" .string "This doesn't bother me.$" SixIsland_OutcastIsland_Text_NicolePostBattle:: .string "Are you headed for the island up\n" .string "past here?\p" .string "I didn't see anything interesting\n" .string "there.$" SixIsland_OutcastIsland_Text_AvaIntro:: .string "AVA: Let's have a two-on-two\n" .string "marine battle!$" SixIsland_OutcastIsland_Text_AvaDefeat:: .string "AVA: Oh, you're amazing!\n" .string "Even better, you're on your own!$" SixIsland_OutcastIsland_Text_AvaPostBattle:: .string "AVA: You know, I do prefer the\n" .string "sea over any pool.$" SixIsland_OutcastIsland_Text_AvaNotEnoughMons:: .string "AVA: You're challenging us to\n" .string "a battle?\p" .string "You'll need at least two POKéMON\n" .string "if you want to do that.$" SixIsland_OutcastIsland_Text_GebIntro:: .string "GEB: Big Sister, help!\n" .string "Please battle with me!$" SixIsland_OutcastIsland_Text_GebDefeat:: .string "GEB: Wow, Big Sister, this person's\n" .string "really good!$" SixIsland_OutcastIsland_Text_GebPostBattle:: .string "GEB: I'm hanging onto my sister\n" .string "because I can't touch the bottom.$" SixIsland_OutcastIsland_Text_GebNotEnoughMons:: .string "GEB: Please battle against me and\n" .string "my sister!\p" .string "…Oh, you don't have two POKéMON?$" ================================================ FILE: data/maps/SixIsland_PatternBush/map.json ================================================ { "id": "MAP_SIX_ISLAND_PATTERN_BUSH", "name": "SixIsland_PatternBush", "layout": "LAYOUT_SIX_ISLAND_PATTERN_BUSH", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_PATTERN_BUSH", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 48, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SixIsland_PatternBush_EventScript_Bethany", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKEMON_BREEDER", "x": 10, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SixIsland_PatternBush_EventScript_Allison", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 51, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SixIsland_PatternBush_EventScript_Garret", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 12, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SixIsland_PatternBush_EventScript_Jonah", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 37, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN", "movement_range_x": 2, "movement_range_y": 5, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_PatternBush_EventScript_Vance", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 32, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SixIsland_PatternBush_EventScript_Nash", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 52, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SixIsland_PatternBush_EventScript_Cordell", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 8, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "SixIsland_PatternBush_EventScript_Dalia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 39, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SixIsland_PatternBush_EventScript_Joana", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "in_connection": false, "x": 3, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SixIsland_PatternBush_EventScript_Riley", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 19, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT", "movement_range_x": 5, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_PatternBush_EventScript_Marcy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_RUIN_MANIAC", "x": 30, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SixIsland_PatternBush_EventScript_Layton", "flag": "0" } ], "warp_events": [ { "x": 54, "y": 26, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_GREEN_PATH", "dest_warp_id": "0" }, { "x": 55, "y": 26, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_GREEN_PATH", "dest_warp_id": "1" }, { "x": 56, "y": 26, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_GREEN_PATH", "dest_warp_id": "2" }, { "x": 3, "y": 26, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_GREEN_PATH", "dest_warp_id": "3" }, { "x": 4, "y": 26, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_GREEN_PATH", "dest_warp_id": "4" }, { "x": 5, "y": 26, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_GREEN_PATH", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_PatternBush/scripts.inc ================================================ SixIsland_PatternBush_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SixIsland_PatternBush_OnTransition .byte 0 SixIsland_PatternBush_OnTransition:: setworldmapflag FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH getplayerxy VAR_TEMP_1, VAR_TEMP_2 call_if_ge VAR_TEMP_1, 50, SixIsland_PatternBush_EventScript_SetEscapeRightExit call_if_le VAR_TEMP_1, 49, SixIsland_PatternBush_EventScript_SetEscapeLeftExit end SixIsland_PatternBush_EventScript_SetEscapeRightExit:: setescapewarp MAP_SIX_ISLAND_GREEN_PATH, 255, 64, 10 return SixIsland_PatternBush_EventScript_SetEscapeLeftExit:: setescapewarp MAP_SIX_ISLAND_GREEN_PATH, 255, 45, 10 return SixIsland_PatternBush_EventScript_Bethany:: trainerbattle_single TRAINER_PKMN_BREEDER_BETHANY, SixIsland_PatternBush_Text_BethanyIntro, SixIsland_PatternBush_Text_BethanyDefeat msgbox SixIsland_PatternBush_Text_BethanyPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Allison:: trainerbattle_single TRAINER_PKMN_BREEDER_ALLISON, SixIsland_PatternBush_Text_AllisonIntro, SixIsland_PatternBush_Text_AllisonDefeat msgbox SixIsland_PatternBush_Text_AllisonPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Garret:: trainerbattle_single TRAINER_BUG_CATCHER_GARRET, SixIsland_PatternBush_Text_GarretIntro, SixIsland_PatternBush_Text_GarretDefeat msgbox SixIsland_PatternBush_Text_GarretPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Jonah:: trainerbattle_single TRAINER_BUG_CATCHER_JONAH, SixIsland_PatternBush_Text_JonahIntro, SixIsland_PatternBush_Text_JonahDefeat msgbox SixIsland_PatternBush_Text_JonahPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Vance:: trainerbattle_single TRAINER_BUG_CATCHER_VANCE, SixIsland_PatternBush_Text_VanceIntro, SixIsland_PatternBush_Text_VanceDefeat msgbox SixIsland_PatternBush_Text_VancePostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Nash:: trainerbattle_single TRAINER_YOUNGSTER_NASH, SixIsland_PatternBush_Text_NashIntro, SixIsland_PatternBush_Text_NashDefeat msgbox SixIsland_PatternBush_Text_NashPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Cordell:: trainerbattle_single TRAINER_YOUNGSTER_CORDELL, SixIsland_PatternBush_Text_CordellIntro, SixIsland_PatternBush_Text_CordellDefeat msgbox SixIsland_PatternBush_Text_CordellPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Dalia:: trainerbattle_single TRAINER_LASS_DALIA, SixIsland_PatternBush_Text_DaliaIntro, SixIsland_PatternBush_Text_DaliaDefeat msgbox SixIsland_PatternBush_Text_DaliaPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Joana:: trainerbattle_single TRAINER_LASS_JOANA, SixIsland_PatternBush_Text_JoanaIntro, SixIsland_PatternBush_Text_JoanaDefeat msgbox SixIsland_PatternBush_Text_JoanaPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Riley:: trainerbattle_single TRAINER_CAMPER_RILEY, SixIsland_PatternBush_Text_RileyIntro, SixIsland_PatternBush_Text_RileyDefeat msgbox SixIsland_PatternBush_Text_RileyPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Marcy:: trainerbattle_single TRAINER_PICNICKER_MARCY, SixIsland_PatternBush_Text_MarcyIntro, SixIsland_PatternBush_Text_MarcyDefeat msgbox SixIsland_PatternBush_Text_MarcyPostBattle, MSGBOX_AUTOCLOSE end SixIsland_PatternBush_EventScript_Layton:: trainerbattle_single TRAINER_RUIN_MANIAC_LAYTON, SixIsland_PatternBush_Text_LaytonIntro, SixIsland_PatternBush_Text_LaytonDefeat msgbox SixIsland_PatternBush_Text_LaytonPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/SixIsland_PatternBush/text.inc ================================================ SixIsland_PatternBush_Text_BethanyIntro:: .string "I'm curious, how do you raise your\n" .string "POKéMON?$" SixIsland_PatternBush_Text_BethanyDefeat:: .string "You raise your POKéMON with a\n" .string "whole lot of love!$" SixIsland_PatternBush_Text_BethanyPostBattle:: .string "In the same way your mother raised\n" .string "you full of love, you should raise\l" .string "your POKéMON.$" SixIsland_PatternBush_Text_AllisonIntro:: .string "I'm working to preserve the natural\n" .string "ecology of POKéMON here.$" SixIsland_PatternBush_Text_AllisonDefeat:: .string "Oh, for someone so young, you are\n" .string "tremendous!$" SixIsland_PatternBush_Text_AllisonPostBattle:: .string "I'm not saying that you shouldn't\n" .string "catch POKéMON.\p" .string "I just want people to raise their\n" .string "POKéMON responsibly.$" SixIsland_PatternBush_Text_GarretIntro:: .string "I caught a BUG POKéMON that lives\n" .string "only around here!$" SixIsland_PatternBush_Text_GarretDefeat:: .string "Heheh…\n" .string "Isn't my POKéMON awesome?$" SixIsland_PatternBush_Text_GarretPostBattle:: .string "There's a girl near the BUSH who\n" .string "measures HERACROSS for TRAINERS.$" SixIsland_PatternBush_Text_JonahIntro:: .string "You know, it just doesn't feel right\n" .string "if I don't use BUG POKéMON.$" SixIsland_PatternBush_Text_JonahDefeat:: .string "It's okay, losing is a fun part of\n" .string "POKéMON's appeal, too.$" SixIsland_PatternBush_Text_JonahPostBattle:: .string "By the way, “appeal” is a weird\n" .string "word, if you think about it.\p" .string "Like, is it like an orange peel?\n" .string "Or like a ringing bell?$" SixIsland_PatternBush_Text_VanceIntro:: .string "Yeah, yeah, yeah!\n" .string "Look at all the BUG POKéMON!$" SixIsland_PatternBush_Text_VanceDefeat:: .string "I got beat while I was still busy\n" .string "celebrating!$" SixIsland_PatternBush_Text_VancePostBattle:: .string "I'm going to bring my little brother\n" .string "here next time.$" SixIsland_PatternBush_Text_NashIntro:: .string "Look, look! There are funny\n" .string "patterns on the ground.$" SixIsland_PatternBush_Text_NashDefeat:: .string "Super awesome!$" SixIsland_PatternBush_Text_NashPostBattle:: .string "The funny patterns on the ground…\p" .string "They look like the patterns on my\n" .string "grandpa's clothes.$" SixIsland_PatternBush_Text_CordellIntro:: .string "I bet you think I'm just some guy,\n" .string "don't you, eh?$" SixIsland_PatternBush_Text_CordellDefeat:: .string "I bet you think I'm weak,\n" .string "don't you, eh?$" SixIsland_PatternBush_Text_CordellPostBattle:: .string "Ayup, you townies come around all\n" .string "so dandy with a hat that flashy…\p" .string "How about giving me that?$" SixIsland_PatternBush_Text_DaliaIntro:: .string "Take a deep breath.\n" .string "Isn't the air delicious?$" SixIsland_PatternBush_Text_DaliaDefeat:: .string "If you'd like, I can teach you how\n" .string "to breathe properly.$" SixIsland_PatternBush_Text_DaliaPostBattle:: .string "First, exhale.\n" .string "Blow everything out.\p" .string "When you can't exhale anymore,\n" .string "inhale the clean air!\p" .string "Isn't it refreshing?$" SixIsland_PatternBush_Text_JoanaIntro:: .string "I love BUG POKéMON.\n" .string "That's why I'm here all the time.\p" .string "Am I the only girl like that?$" SixIsland_PatternBush_Text_JoanaDefeat:: .string "I lost, but I'm still laughing.\n" .string "Am I the only girl like that?$" SixIsland_PatternBush_Text_JoanaPostBattle:: .string "I'm going to keep on collecting\n" .string "BUG POKéMON.\p" .string "Am I the only girl like that?$" SixIsland_PatternBush_Text_RileyIntro:: .string "This is a good spot.\n" .string "I'll pitch my tent here.$" SixIsland_PatternBush_Text_RileyDefeat:: .string "Wimped out…$" SixIsland_PatternBush_Text_RileyPostBattle:: .string "I'm going to observe the night sky\n" .string "here.$" SixIsland_PatternBush_Text_MarcyIntro:: .string "Oh, yuck!\n" .string "I think a bug stung me!$" SixIsland_PatternBush_Text_MarcyDefeat:: .string "It wasn't a bug.\n" .string "I cut my shin on some grass.$" SixIsland_PatternBush_Text_MarcyPostBattle:: .string "A little cut like that…\n" .string "A little spit's enough to cure it!$" SixIsland_PatternBush_Text_LaytonIntro:: .string "Have you noticed something odd\n" .string "about these parts?$" SixIsland_PatternBush_Text_LaytonDefeat:: .string "Have you taken a good look around\n" .string "your feet?$" SixIsland_PatternBush_Text_LaytonPostBattle:: .string "There are places here in PATTERN\n" .string "BUSH where grass won't grow.\p" .string "What could be the cause of such\n" .string "a phenomenon?$" ================================================ FILE: data/maps/SixIsland_PokemonCenter_1F/map.json ================================================ { "id": "MAP_SIX_ISLAND_POKEMON_CENTER_1F", "name": "SixIsland_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SIX_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLUE", "in_connection": false, "x": 5, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SIX_ISLAND_POKECENTER_RIVAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 13, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_PokemonCenter_1F_EventScript_Hiker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_PokemonCenter_1F_EventScript_OldMan", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_SIX_ISLAND", "dest_warp_id": "1" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_SIX_ISLAND_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SixIsland_PokemonCenter_1F/scripts.inc ================================================ .equ LOCALID_RIVAL, 3 SixIsland_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SixIsland_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad map_script MAP_SCRIPT_ON_FRAME_TABLE, SixIsland_PokemonCenter_1F_OnFrame .byte 0 SixIsland_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_SIX_ISLAND call_if_eq VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F, 0, SixIsland_PokemonCenter_1F_EventScript_ShowRival end SixIsland_PokemonCenter_1F_EventScript_ShowRival:: clearflag FLAG_HIDE_SIX_ISLAND_POKECENTER_RIVAL return SixIsland_PokemonCenter_1F_OnFrame:: map_script_2 VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F, 0, SixIsland_PokemonCenter_1F_EventScript_RivalScene .2byte 0 SixIsland_PokemonCenter_1F_EventScript_RivalScene:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playbgm MUS_ENCOUNTER_RIVAL, 0 applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_RIVAL, Common_Movement_Delay48 waitmovement 0 delay 25 applymovement LOCALID_RIVAL, SixIsland_PokemonCenter_1F_Movement_RivalApproach waitmovement 0 msgbox SixIsland_PokemonCenter_1F_Text_RivalImpossibleToGetAllMonsAroundHere closemessage applymovement OBJ_EVENT_ID_PLAYER, SixIsland_PokemonCenter_1F_Movement_PlayerWatchRivalExit applymovement LOCALID_RIVAL, SixIsland_PokemonCenter_1F_Movement_RivalExit waitmovement 0 fadedefaultbgm playse SE_EXIT delay 35 removeobject LOCALID_RIVAL setvar VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F, 1 setvar VAR_MAP_SCENE_FOUR_ISLAND, 1 releaseall end SixIsland_PokemonCenter_1F_Movement_RivalApproach:: walk_right walk_right walk_down walk_down step_end SixIsland_PokemonCenter_1F_Movement_RivalExit:: delay_16 delay_4 walk_down step_end SixIsland_PokemonCenter_1F_Movement_PlayerWatchRivalExit:: walk_left walk_in_place_faster_right step_end SixIsland_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end SixIsland_PokemonCenter_1F_EventScript_Hiker:: msgbox SixIsland_PokemonCenter_1F_Text_SomethingHiddenOnThisIsland, MSGBOX_NPC end SixIsland_PokemonCenter_1F_EventScript_OldMan:: msgbox SixIsland_PokemonCenter_1F_Text_SomeMonsEvolveByTradingWithHeldItem, MSGBOX_NPC end ================================================ FILE: data/maps/SixIsland_PokemonCenter_1F/text.inc ================================================ SixIsland_PokemonCenter_1F_Text_SomethingHiddenOnThisIsland:: .string "For ten years, I've searched for\n" .string "RUINS.\p" .string "No, make that twenty years.\p" .string "I get this feeling that there's\n" .string "something hidden on this island.$" SixIsland_PokemonCenter_1F_Text_SomeMonsEvolveByTradingWithHeldItem:: .string "You know of POKéMON that evolve\n" .string "only upon trading, yes?\p" .string "But did you know that there are\n" .string "still others?\p" .string "Some POKéMON evolve only when\n" .string "traded while holding specific items.$" SixIsland_PokemonCenter_1F_Text_RivalImpossibleToGetAllMonsAroundHere:: .string "{RIVAL}: Hey, {PLAYER}!\n" .string "How's your POKéDEX filling up?\p" .string "It looks like it's impossible to get\n" .string "all the POKéMON by hanging around\l" .string "just these parts.\p" .string "Maybe there are POKéMON we don't\n" .string "know about somewhere far away…\p" .string "… … … … … … … … …\p" .string "Well, if I can't do it, there's no\n" .string "way for you to get it done.\p" .string "I'm not going to get all desperate\n" .string "over this.\p" .string "I'll keep collecting POKéMON at my\n" .string "own pace while I train them.\p" .string "That's what I'll do.\n" .string "So there's no point staying here.\l" .string "I may as well leave for home.\p" .string "That's that, then!\n" .string "Smell ya later!$" ================================================ FILE: data/maps/SixIsland_PokemonCenter_2F/map.json ================================================ { "id": "MAP_SIX_ISLAND_POKEMON_CENTER_2F", "name": "SixIsland_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SIX_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "in_connection": false, "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "in_connection": false, "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_SIX_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SixIsland_PokemonCenter_2F/scripts.inc ================================================ SixIsland_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS SixIsland_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end SixIsland_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end SixIsland_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/SixIsland_RuinValley/map.json ================================================ { "id": "MAP_SIX_ISLAND_RUIN_VALLEY", "name": "SixIsland_RuinValley", "layout": "LAYOUT_SIX_ISLAND_RUIN_VALLEY", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_RUIN_VALLEY", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "right", "offset": -80, "map": "MAP_SIX_ISLAND_WATER_PATH" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 24, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_RuinValley_EventScript_Scientist", "flag": "FLAG_HIDE_RUIN_VALLEY_SCIENTIST" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_RUIN_MANIAC", "x": 32, "y": 11, "elevation": 5, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SixIsland_RuinValley_EventScript_Stanly", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_RUIN_MANIAC", "x": 33, "y": 16, "elevation": 5, "movement_type": "MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SixIsland_RuinValley_EventScript_Foster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_RUIN_MANIAC", "x": 31, "y": 24, "elevation": 5, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_RuinValley_EventScript_Larry", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 14, "y": 10, "elevation": 5, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "SixIsland_RuinValley_EventScript_Daryl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKE_MANIAC", "x": 21, "y": 29, "elevation": 5, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_RuinValley_EventScript_Hector", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 17, "y": 10, "elevation": 5, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 17, "y": 12, "elevation": 5, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 18, "y": 11, "elevation": 5, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 6, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 6, "y": 34, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 41, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 41, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 42, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_RuinValley_EventScript_ItemHPUp", "flag": "FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_HP_UP" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 19, "y": 11, "elevation": 5, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_RuinValley_EventScript_ItemFullRestore", "flag": "FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_FULL_RESTORE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 43, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_RuinValley_EventScript_ItemSunStone", "flag": "FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_SUN_STONE" } ], "warp_events": [ { "x": 24, "y": 24, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_DOTTED_HOLE_1F", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 24, "y": 24, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SixIsland_RuinValley_EventScript_DottedHoleDoor" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_RuinValley/scripts.inc ================================================ .set LOCALID_SCIENTIST, 1 SixIsland_RuinValley_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SixIsland_RuinValley_OnLoad .byte 0 SixIsland_RuinValley_OnLoad:: call_if_set FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE, SixIsland_RuinValley_EventScript_OpenDottedHoleDoor end SixIsland_RuinValley_EventScript_OpenDottedHoleDoor:: setmetatile 24, 24, METATILE_SeviiIslands67_DottedHoleDoor_Open, 0 return SixIsland_RuinValley_EventScript_Scientist:: lock msgbox SixIsland_RuinValley_Text_CantFigureOutHowToGetInside applymovement LOCALID_SCIENTIST, Common_Movement_FacePlayer waitmovement 0 msgbox SixIsland_RuinValley_Text_IFoundThisPlace applymovement LOCALID_SCIENTIST, Common_Movement_FaceOriginalDirection waitmovement 0 release end SixIsland_RuinValley_EventScript_DottedHoleDoor:: lockall goto_if_set FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE, SixIsland_RuinValley_EventScript_DottedHoleDoorOpen msgbox SixIsland_RuinValley_Text_CheckDoorMoreThoroughly, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, SixIsland_RuinValley_EventScript_IgnoreDottedHoleDoor msgbox SixIsland_RuinValley_Text_SeveralDotsOnTheDoor braillemessage Braille_Text_Cut waitbuttonpress releaseall end SixIsland_RuinValley_EventScript_DottedHoleDoorOpen:: msgbox SixIsland_RuinValley_Text_DoorIsOpen releaseall end SixIsland_RuinValley_EventScript_IgnoreDottedHoleDoor:: msgbox SixIsland_RuinValley_Text_LeftDoorAlone releaseall end ================================================ FILE: data/maps/SixIsland_RuinValley/text.inc ================================================ SixIsland_RuinValley_Text_CantFigureOutHowToGetInside:: .string "I can't figure out how I'm supposed\n" .string "to get inside.$" SixIsland_RuinValley_Text_IFoundThisPlace:: .string "Let me tell you, I found this\n" .string "place.\p" .string "Don't look so envious, will you?$" SixIsland_RuinValley_Text_CheckDoorMoreThoroughly:: .string "The door doesn't budge at all.\n" .string "Check it more thoroughly?$" SixIsland_RuinValley_Text_LeftDoorAlone:: .string "{PLAYER} left the door alone.$" SixIsland_RuinValley_Text_SeveralDotsOnTheDoor:: .string "On closer inspection, there are\n" .string "several dots on the door…$" SixIsland_RuinValley_Text_DoorIsOpen:: .string "The door is open.$" SixIsland_RuinValley_Text_StanlyIntro:: .string "There appear to be many secrets\n" .string "still unsolved in this world.$" SixIsland_RuinValley_Text_StanlyDefeat:: .string "Hmm…$" SixIsland_RuinValley_Text_StanlyPostBattle:: .string "I suggest to you that you, too,\n" .string "give a thought to the secrets and\l" .string "mysteries of our world once a day.$" SixIsland_RuinValley_Text_FosterIntro:: .string "I'm curious, what compelled you to\n" .string "come here?$" SixIsland_RuinValley_Text_FosterDefeat:: .string "It's been so long since I battled,\n" .string "my instincts are off.$" SixIsland_RuinValley_Text_FosterPostBattle:: .string "There are several ruins on the\n" .string "SEVII ISLANDS.\p" .string "The majority of them date back\n" .string "a long way.$" SixIsland_RuinValley_Text_LarryIntro:: .string "It's been said that there are\n" .string "mysterious stones on this island.\p" .string "I suspect it has something to do\n" .string "with the ruins here.$" SixIsland_RuinValley_Text_LarryDefeat:: .string "Oh, interesting.$" SixIsland_RuinValley_Text_LarryPostBattle:: .string "Those ruins over there…\p" .string "I haven't had any luck in finding\n" .string "how I can get inside.$" SixIsland_RuinValley_Text_DarylIntro:: .string "A battle with you, so high up!$" SixIsland_RuinValley_Text_DarylDefeat:: .string "Oh, the heartbreak of losing so\n" .string "easily to you!$" SixIsland_RuinValley_Text_DarylPostBattle:: .string "Experience the joy of climbing!$" SixIsland_RuinValley_Text_HectorIntro:: .string "I'm pretty familiar with the land\n" .string "around these parts.$" SixIsland_RuinValley_Text_HectorDefeat:: .string "You don't need to be so pushy.\n" .string "I'll be happy to tell you.$" SixIsland_RuinValley_Text_HectorPostBattle:: .string "The door to the ruins…\n" .string "It has these strange patterns\l" .string "engraved on the outside.\p" .string "I don't know what they mean,\n" .string "though.$" ================================================ FILE: data/maps/SixIsland_WaterPath/map.json ================================================ { "id": "MAP_SIX_ISLAND_WATER_PATH", "name": "SixIsland_WaterPath", "layout": "LAYOUT_SIX_ISLAND_WATER_PATH", "music": "MUS_SEVII_ROUTE", "region_map_section": "MAPSEC_WATER_PATH", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "left", "offset": 0, "map": "MAP_SIX_ISLAND_GREEN_PATH" }, { "direction": "left", "offset": 40, "map": "MAP_SIX_ISLAND" }, { "direction": "left", "offset": 80, "map": "MAP_SIX_ISLAND_RUIN_VALLEY" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_AROMA_LADY", "x": 12, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SixIsland_WaterPath_EventScript_Rose", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JUGGLER", "x": 11, "y": 52, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "SixIsland_WaterPath_EventScript_Edward", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M_WATER", "in_connection": false, "x": 13, "y": 35, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SixIsland_WaterPath_EventScript_Samir", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 15, "y": 45, "elevation": 1, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_WaterPath_EventScript_Denise", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 6, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_WaterPath_EventScript_Miu", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 7, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "SixIsland_WaterPath_EventScript_Mia", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 11, "y": 76, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "SixIsland_WaterPath_EventScript_Earl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 19, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_WaterPath_EventScript_ItemElixir", "flag": "FLAG_HIDE_SIX_ISLAND_WATER_PATH_ELIXIR" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 87, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_WaterPath_EventScript_ItemDragonScale", "flag": "FLAG_HIDE_SIX_ISLAND_WATER_PATH_DRAGON_SCALE" } ], "warp_events": [ { "x": 5, "y": 13, "elevation": 0, "dest_map": "MAP_SIX_ISLAND_WATER_PATH_HOUSE1", "dest_warp_id": "0" }, { "x": 11, "y": 19, "elevation": 0, "dest_map": "MAP_SIX_ISLAND_WATER_PATH_HOUSE2", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 8, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SixIsland_WaterPath_EventScript_HornWantedSign" }, { "type": "hidden_item", "x": 15, "y": 76, "elevation": 3, "item": "ITEM_ASPEAR_BERRY", "flag": "FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_ASPEAR_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 3, "y": 8, "elevation": 3, "item": "ITEM_ORAN_BERRY", "flag": "FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_ORAN_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 13, "y": 63, "elevation": 3, "item": "ITEM_QUALOT_BERRY", "flag": "FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_QUALOT_BERRY", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 12, "y": 54, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SixIsland_WaterPath_EventScript_RouteSign" } ], "level_scaling": "5" } ================================================ FILE: data/maps/SixIsland_WaterPath/scripts.inc ================================================ SixIsland_WaterPath_MapScripts:: .byte 0 SixIsland_WaterPath_EventScript_HornWantedSign:: msgbox SixIsland_WaterPath_Text_WantedUltimateHorn, MSGBOX_SIGN end SixIsland_WaterPath_EventScript_RouteSign:: msgbox SixIsland_WaterPath_Text_RouteSign, MSGBOX_SIGN end ================================================ FILE: data/maps/SixIsland_WaterPath/text.inc ================================================ SixIsland_WaterPath_Text_RoseIntro:: .string "I let a pleasant breeze lead me\n" .string "all the way here.$" SixIsland_WaterPath_Text_RoseDefeat:: .string "Giggle… You're so cute when you're\n" .string "determined.$" SixIsland_WaterPath_Text_RosePostBattle:: .string "I want to go to the woods over\n" .string "there, but…\p" .string "There are lots of BUG POKéMON.\n" .string "They scare me a little.$" SixIsland_WaterPath_Text_EdwardIntro:: .string "I'm practicing in secret so no one\n" .string "can see me.$" SixIsland_WaterPath_Text_EdwardDefeat:: .string "Nobody saw me losing, right?$" SixIsland_WaterPath_Text_EdwardPostBattle:: .string "As a performer, I don't want people\n" .string "to know about the effort I put in.$" SixIsland_WaterPath_Text_SamirIntro:: .string "What, you're suggesting that you're\n" .string "sick of seeing SWIMMERS like me?\p" .string "Aww, don't be hatin'!$" SixIsland_WaterPath_Text_SamirDefeat:: .string "Oh, no, no, no.$" SixIsland_WaterPath_Text_SamirPostBattle:: .string "I couldn't lift the stigma of being\n" .string "a SWIMMER…$" SixIsland_WaterPath_Text_DeniseIntro:: .string "My boyfriend's always busy, so I\n" .string "come swimming by myself.$" SixIsland_WaterPath_Text_DeniseDefeat:: .string "Awww, I knew this would happen!$" SixIsland_WaterPath_Text_DenisePostBattle:: .string "When I can't be with my boyfriend,\n" .string "I spend time with the POKéMON he\l" .string "gave me.$" SixIsland_WaterPath_Text_EarlIntro:: .string "Tell me, where are the mountains\n" .string "around these parts?$" SixIsland_WaterPath_Text_EarlDefeat:: .string "I lost my way while I was busy\n" .string "battling!$" SixIsland_WaterPath_Text_EarlPostBattle:: .string "Aren't there any mountains around\n" .string "these parts?$" SixIsland_WaterPath_Text_MiuIntro:: .string "MIU: Hello, POKéMON!\n" .string "It's time to play!$" SixIsland_WaterPath_Text_MiuDefeat:: .string "MIU: Oh, no!\n" .string "Mommy!$" SixIsland_WaterPath_Text_MiuPostBattle:: .string "MIU: It makes me all sad inside\n" .string "when we lose…$" SixIsland_WaterPath_Text_MiuNotEnoughMons:: .string "MIU: MIA and I are TWINS.\n" .string "We want to battle together.$" SixIsland_WaterPath_Text_MiaIntro:: .string "MIA: Hello, POKéMON!\n" .string "It's time to battle!$" SixIsland_WaterPath_Text_MiaDefeat:: .string "MIA: You're mean!\n" .string "You're bad for winning!$" SixIsland_WaterPath_Text_MiaPostBattle:: .string "MIA: Ohh…\n" .string "I'm sorry, my POKéMON…$" SixIsland_WaterPath_Text_MiaNotEnoughMons:: .string "MIA: Oh, you only have one\n" .string "POKéMON?\p" .string "Don't you feel lonesome?$" SixIsland_WaterPath_Text_WantedUltimateHorn:: .string "Wanted!\n" .string "The Ultimate Horn!$" SixIsland_WaterPath_Text_RouteSign:: .string "WATER PATH\n" .string "Leads to RUIN VALLEY$" ================================================ FILE: data/maps/SixIsland_WaterPath_House1/map.json ================================================ { "id": "MAP_SIX_ISLAND_WATER_PATH_HOUSE1", "name": "SixIsland_WaterPath_House1", "layout": "LAYOUT_HOUSE4", "music": "MUS_SEVII_45", "region_map_section": "MAPSEC_WATER_PATH", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 3, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_WaterPath_House1_EventScript_Beauty", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_WATER_PATH", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 9, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SixIsland_WaterPath_House1_EventScript_SizeRecord" } ], "level_scaling": "0" } ================================================ FILE: data/maps/SixIsland_WaterPath_House1/scripts.inc ================================================ SixIsland_WaterPath_House1_MapScripts:: .byte 0 SixIsland_WaterPath_House1_EventScript_Beauty:: lock faceplayer goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording setvar VAR_0x8004, SPECIES_HERACROSS specialvar VAR_RESULT, DoesPlayerPartyContainSpecies goto_if_eq VAR_RESULT, FALSE, SixIsland_WaterPath_House1_EventScript_NoHeracrossInParty special GetHeracrossSizeRecordInfo msgbox SixIsland_WaterPath_House1_Text_MayIMeasureHeracross special ChoosePartyMon waitstate copyvar VAR_RESULT, VAR_0x8004 goto_if_ge VAR_RESULT, PARTY_SIZE, SixIsland_WaterPath_House1_EventScript_DontShowMon special CompareHeracrossSize goto_if_eq VAR_RESULT, 1, SixIsland_WaterPath_House1_EventScript_ShownNonHeracross goto_if_eq VAR_RESULT, 2, SixIsland_WaterPath_House1_EventScript_ShownSmallHeracross goto_if_eq VAR_RESULT, 3, SixIsland_WaterPath_House1_EventScript_ShownBigHeracross goto_if_eq VAR_RESULT, 4, SixIsland_WaterPath_House1_EventScript_ShownTiedHeracross release end SixIsland_WaterPath_House1_EventScript_NoHeracrossInParty:: msgbox SixIsland_WaterPath_House1_Text_LoveItNeedItHeracross release end SixIsland_WaterPath_House1_EventScript_DontShowMon:: release end SixIsland_WaterPath_House1_EventScript_ShownNonHeracross:: msgbox SixIsland_WaterPath_House1_Text_ThisWontDo release end SixIsland_WaterPath_House1_EventScript_ShownSmallHeracross:: goto_if_unset FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1, SixIsland_WaterPath_House1_EventScript_ShownBigHeracross msgbox SixIsland_WaterPath_House1_Text_ItsXInchesYInchesWasBiggest release end SixIsland_WaterPath_House1_EventScript_ShownTiedHeracross:: goto_if_unset FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1, SixIsland_WaterPath_House1_EventScript_ShownBigHeracross msgbox SixIsland_WaterPath_House1_Text_ItsXInchesSameAsBefore release end SixIsland_WaterPath_House1_EventScript_ShownBigHeracross:: setflag FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1 msgbox SixIsland_WaterPath_House1_Text_ItsXInchesDeserveReward giveitem ITEM_NEST_BALL goto_if_eq VAR_RESULT, FALSE, SixIsland_WaterPath_House1_EventScript_NoRoomForNestBall msgbox SixIsland_WaterPath_House1_Text_WantToSeeBiggerOne release end SixIsland_WaterPath_House1_EventScript_NoRoomForNestBall:: msgbox SixIsland_WaterPath_House1_Text_YourBagIsFull release end SixIsland_WaterPath_House1_EventScript_SizeRecord:: lockall goto_if_set FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1, SixIsland_WaterPath_House1_EventScript_SizeRecordNonEmpty msgbox SixIsland_WaterPath_House1_Text_BlankChartOfSomeSort releaseall end SixIsland_WaterPath_House1_EventScript_SizeRecordNonEmpty:: special GetHeracrossSizeRecordInfo msgbox SixIsland_WaterPath_House1_Text_BiggestHeracrossIsXInches releaseall end ================================================ FILE: data/maps/SixIsland_WaterPath_House1/text.inc ================================================ SixIsland_WaterPath_House1_Text_LoveItNeedItHeracross:: .string "Hera, hera, HERACROSS!\n" .string "Big and shiny, it's the bug boss!\l" .string "Love it, need it, HERACROSS!$" SixIsland_WaterPath_House1_Text_MayIMeasureHeracross:: .string "Eeeeek!\n" .string "That's a HERACROSS!\p" .string "Please, please, may I measure how\n" .string "big it is?$" SixIsland_WaterPath_House1_Text_ItsXInchesDeserveReward:: .string "Eeeek, it's {STR_VAR_2} inches!\n" .string "I've never seen anything like this!\l" .string "You deserve a reward!$" SixIsland_WaterPath_House1_Text_WantToSeeBiggerOne:: .string "I want to see a much, much bigger\n" .string "HERACROSS than that one.\p" .string "Oh, how I adore them, big\n" .string "HERACROSS!$" SixIsland_WaterPath_House1_Text_ItsXInchesSameAsBefore:: .string "Huh? This {STR_VAR_2}-inch measurement…\n" .string "Oh, boo! It's the same as before.$" SixIsland_WaterPath_House1_Text_ItsXInchesYInchesWasBiggest:: .string "Oh, it's just {STR_VAR_2} inches.\n" .string "The HERACROSS before was bigger.\p" .string "It was {STR_VAR_3} inches, the biggest\n" .string "HERACROSS you've brought me.$" SixIsland_WaterPath_House1_Text_ThisWontDo:: .string "Oh, no! This won't do!\p" .string "HERACROSS looks much more macho\n" .string "and cool, and has a lovely horn!$" SixIsland_WaterPath_House1_Text_YourBagIsFull:: .string "Your BAG is full.\n" .string "My reward won't fit.$" SixIsland_WaterPath_House1_Text_BiggestHeracrossIsXInches:: .string "The biggest HERACROSS that I have\n" .string "ever seen measured so far is:\p" .string "{STR_VAR_3} inches!$" SixIsland_WaterPath_House1_Text_BlankChartOfSomeSort:: .string "It's a blank chart of some sort.\p" .string "It has spaces for writing in\n" .string "records of some kind.$" ================================================ FILE: data/maps/SixIsland_WaterPath_House2/map.json ================================================ { "id": "MAP_SIX_ISLAND_WATER_PATH_HOUSE2", "name": "SixIsland_WaterPath_House2", "layout": "LAYOUT_HOUSE3", "music": "MUS_SEVII_45", "region_map_section": "MAPSEC_WATER_PATH", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "SixIsland_WaterPath_House2_EventScript_Man", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_SIX_ISLAND_WATER_PATH", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/SixIsland_WaterPath_House2/scripts.inc ================================================ SixIsland_WaterPath_House2_MapScripts:: .byte 0 SixIsland_WaterPath_House2_EventScript_Man:: msgbox SixIsland_WaterPath_House2_Text_MyNeighborMeasuredMe, MSGBOX_NPC end ================================================ FILE: data/maps/SixIsland_WaterPath_House2/text.inc ================================================ SixIsland_WaterPath_House2_Text_MyNeighborMeasuredMe:: .string "My height is 67.0 inches on the\n" .string "button.\p" .string "I know it is this precisely because\n" .string "my neighbor measured me.$" ================================================ FILE: data/maps/SouthernIsland_Exterior/map.json ================================================ { "id": "MAP_SOUTHERN_ISLAND_EXTERIOR", "name": "SouthernIsland_Exterior", "layout": "LAYOUT_SOUTHERN_ISLAND_EXTERIOR", "music": "MUS_ABANDONED_SHIP", "region_map_section": "MAPSEC_SOUTHERN_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 13, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NavelRock_Harbor_EventScript_Sailor", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 13, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_NONE", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "0" } ], "warp_events": [ { "x": 14, "y": 6, "elevation": 0, "dest_map": "MAP_SOUTHERN_ISLAND_INTERIOR", "dest_warp_id": 0 }, { "x": 15, "y": 6, "elevation": 0, "dest_map": "MAP_SOUTHERN_ISLAND_INTERIOR", "dest_warp_id": 1 } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 16, "y": 7, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SouthernIsland_Exterior_EventScript_Sign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/SouthernIsland_Exterior/scripts.inc ================================================ SouthernIsland_Exterior_MapScripts:: .byte 0 SouthernIsland_Exterior_EventScript_Sign:: msgbox SouthernIsland_Exterior_Text_Sign, MSGBOX_SIGN end SouthernIsland_Exterior_Text_Sign:: .string "“Those whose memories fade seek to\n" .string "carve them in their hearts…”$" ================================================ FILE: data/maps/SouthernIsland_Exterior/text.inc ================================================ ================================================ FILE: data/maps/SouthernIsland_Interior/map.json ================================================ { "id": "MAP_SOUTHERN_ISLAND_INTERIOR", "name": "SouthernIsland_Interior", "layout": "LAYOUT_SOUTHERN_ISLAND_INTERIOR", "music": "MUS_ABANDONED_SHIP", "region_map_section": "MAPSEC_SOUTHERN_ISLAND", "requires_flash": false, "weather": "WEATHER_SHADE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_VAR_0", "in_connection": false, "x": 13, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_LATI" } ], "warp_events": [ { "x": 13, "y": 18, "elevation": 0, "dest_map": "MAP_SOUTHERN_ISLAND_EXTERIOR", "dest_warp_id": 0 }, { "x": 14, "y": 18, "elevation": 0, "dest_map": "MAP_SOUTHERN_ISLAND_EXTERIOR", "dest_warp_id": 1 } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 13, "y": 11, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "SouthernIsland_Interior_EventScript_TryLatiEncounter" } ], "level_scaling": "0" } ================================================ FILE: data/maps/SouthernIsland_Interior/scripts.inc ================================================ .set LOCALID_LATI, 1 SouthernIsland_Interior_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, SouthernIsland_Interior_OnResume map_script MAP_SCRIPT_ON_LOAD, SouthernIsland_Interior_OnLoad .byte 0 SouthernIsland_Interior_OnResume: call_if_set FLAG_SYS_CTRL_OBJ_DELETE, SouthernIsland_Interior_EventScript_TryRemoveLati end SouthernIsland_Interior_EventScript_TryRemoveLati:: specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_CAUGHT goto_if_ne EventScript_Return removeobject LOCALID_LATI return SouthernIsland_Interior_OnLoad: callnative IsVersionFireRedToVarResult compare VAR_RESULT, TRUE call_if_eq SouthernIsland_Interior_EventScript_SetUpLatios compare VAR_RESULT, FALSE call_if_eq SouthernIsland_Interior_EventScript_SetUpLatias end SouthernIsland_Interior_EventScript_SetUpLatios:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_LATIOS setvar VAR_TEMP_4, SPECIES_LATIOS return SouthernIsland_Interior_EventScript_SetUpLatias:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_LATIAS setvar VAR_TEMP_4, SPECIES_LATIAS return SouthernIsland_Interior_EventScript_TryLatiEncounter:: lockall setvar VAR_0x8008, 12 goto SouthernIsland_Interior_EventScript_Lati end SouthernIsland_Interior_EventScript_Lati:: goto_if_set FLAG_TEMP_2, SouthernIsland_Interior_EventScript_Sign callnative IsVersionFireRedToVarResult compare VAR_RESULT, TRUE call_if_eq SouthernIsland_Interior_EventScript_CheckDefeatedLatios compare VAR_RESULT, FALSE call_if_eq SouthernIsland_Interior_EventScript_CheckDefeatedLatias callnative IsVersionFireRedToVarResult compare VAR_RESULT, TRUE call_if_eq SouthernIsland_Interior_EventScript_CheckCaughtLatios compare VAR_RESULT, FALSE call_if_eq SouthernIsland_Interior_EventScript_CheckCaughtLatias setflag FLAG_TEMP_2 goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording special SpawnCameraObject applymovement OBJ_EVENT_ID_CAMERA, SouthernIsland_Interior_Movement_CameraPanUp waitmovement 0 delay 50 waitse playmoncry VAR_TEMP_4, 0 delay 30 waitmoncry addobject LOCALID_LATI delay 30 applymovement OBJ_EVENT_ID_CAMERA, SouthernIsland_Interior_Movement_CameraPanDown applymovement LOCALID_LATI, SouthernIsland_Interior_Movement_LatiApproach waitmovement 0 delay 50 special RemoveCameraObject setvar VAR_LAST_TALKED, LOCALID_LATI callnative IsVersionFireRedToVarResult compare VAR_RESULT, TRUE call_if_eq SouthernIsland_Interior_EventScript_SetLatiosBattleVars compare VAR_RESULT, FALSE call_if_eq SouthernIsland_Interior_EventScript_SetLatiasBattleVars setflag FLAG_SYS_CTRL_OBJ_DELETE special StartSouthernIslandBattle waitstate clearflag FLAG_SYS_CTRL_OBJ_DELETE specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_WON goto_if_eq SouthernIsland_Interior_EventScript_LatiDefeated compare VAR_RESULT, B_OUTCOME_RAN goto_if_eq SouthernIsland_Interior_EventScript_RanFromLati compare VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED goto_if_eq SouthernIsland_Interior_EventScript_RanFromLati callnative IsVersionFireRedToVarResult compare VAR_RESULT, TRUE call_if_eq SouthernIsland_Interior_EventScript_SetCaughtLatios compare VAR_RESULT, FALSE call_if_eq SouthernIsland_Interior_EventScript_SetCaughtLatias releaseall end SouthernIsland_Interior_EventScript_CheckDefeatedLatios:: goto_if_set FLAG_DEFEATED_LATIOS, SouthernIsland_Interior_EventScript_Sign return SouthernIsland_Interior_EventScript_CheckDefeatedLatias:: goto_if_set FLAG_DEFEATED_LATIAS, SouthernIsland_Interior_EventScript_Sign return SouthernIsland_Interior_EventScript_SetCaughtLatios:: setflag FLAG_CAUGHT_LATIOS return SouthernIsland_Interior_EventScript_SetCaughtLatias:: setflag FLAG_CAUGHT_LATIAS return SouthernIsland_Interior_EventScript_CheckCaughtLatios:: goto_if_set FLAG_CAUGHT_LATIOS, SouthernIsland_Interior_EventScript_Sign return SouthernIsland_Interior_EventScript_CheckCaughtLatias:: goto_if_set FLAG_CAUGHT_LATIAS, SouthernIsland_Interior_EventScript_Sign return SouthernIsland_Interior_EventScript_LatiDefeated:: callnative IsVersionFireRedToVarResult compare VAR_RESULT, TRUE call_if_eq SouthernIsland_Interior_EventScript_SetDefeatedLatios compare VAR_RESULT, FALSE call_if_eq SouthernIsland_Interior_EventScript_SetDefeatedLatias copyvar VAR_0x8004, VAR_TEMP_4 goto EventScript_MonFlewAway end SouthernIsland_Interior_EventScript_SetDefeatedLatios:: setflag FLAG_DEFEATED_LATIOS return SouthernIsland_Interior_EventScript_SetDefeatedLatias:: setflag FLAG_DEFEATED_LATIAS return SouthernIsland_Interior_EventScript_RanFromLati:: copyvar VAR_0x8004, VAR_TEMP_4 goto EventScript_MonFlewAway end SouthernIsland_Interior_EventScript_Sign:: signmsg msgbox SouthernIsland_Interior_Text_Sign, MSGBOX_SIGN normalmsg releaseall end SouthernIsland_Interior_EventScript_SetLatiosBattleVars:: setvar VAR_0x8004, SPECIES_LATIOS setvar VAR_0x8005, 50 @ level setvar VAR_0x8006, ITEM_SOUL_DEW special CreateEnemyEventMon return SouthernIsland_Interior_EventScript_SetLatiasBattleVars:: setvar VAR_0x8004, SPECIES_LATIAS setvar VAR_0x8005, 50 @ level setvar VAR_0x8006, ITEM_SOUL_DEW special CreateEnemyEventMon return SouthernIsland_Interior_Movement_CameraPanUp: walk_up walk_up walk_up step_end SouthernIsland_Interior_Movement_CameraPanDown: delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 delay_16 walk_down walk_down walk_down walk_in_place_faster_up step_end SouthernIsland_Interior_Movement_LatiApproach: walk_down walk_down walk_down walk_down walk_down delay_16 delay_16 walk_down walk_down walk_down walk_down step_end SouthernIsland_Interior_Text_Sign: .string "“All dreams are but another reality.\n" .string "Never forget…”$" ================================================ FILE: data/maps/SouthernIsland_Interior/text.inc ================================================ ================================================ FILE: data/maps/ThreeIsland/map.json ================================================ { "id": "MAP_THREE_ISLAND", "name": "ThreeIsland", "layout": "LAYOUT_THREE_ISLAND", "music": "MUS_RUSTBORO", "region_map_section": "MAPSEC_THREE_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": 0, "map": "MAP_THREE_ISLAND_PORT" }, { "direction": "left", "offset": -20, "map": "MAP_THREE_ISLAND_BOND_BRIDGE" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 7, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_AntiBiker1", "flag": "FLAG_HIDE_THREE_ISLAND_ANTIBIKERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 8, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_AntiBiker2", "flag": "FLAG_HIDE_THREE_ISLAND_ANTIBIKERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUE_BALL", "x": 8, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_Biker", "flag": "FLAG_HIDE_THREE_ISLAND_LONE_BIKER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 9, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_Biker", "flag": "FLAG_HIDE_THREE_ISLAND_BIKERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 9, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_Biker", "flag": "FLAG_HIDE_THREE_ISLAND_BIKERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 10, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_Biker", "flag": "FLAG_HIDE_THREE_ISLAND_BIKERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 10, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_Biker", "flag": "FLAG_HIDE_THREE_ISLAND_BIKERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 11, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_Biker", "flag": "FLAG_HIDE_THREE_ISLAND_BIKERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 20, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_THREE_ISLAND_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 18, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_ItemZinc", "flag": "FLAG_HIDE_THREE_ISLAND_ZINC" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 15, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 14, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_LittleBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_DODUO", "in_connection": false, "x": 15, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_Doduo", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 15, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_EventScript_Biker6", "flag": "FLAG_HIDE_THREE_ISLAND_BIKERS" } ], "warp_events": [ { "x": 3, "y": 31, "elevation": 0, "dest_map": "MAP_THREE_ISLAND_HOUSE1", "dest_warp_id": "0" }, { "x": 14, "y": 27, "elevation": 0, "dest_map": "MAP_THREE_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "0" }, { "x": 18, "y": 12, "elevation": 0, "dest_map": "MAP_THREE_ISLAND_MART", "dest_warp_id": "0" }, { "x": 4, "y": 6, "elevation": 0, "dest_map": "MAP_THREE_ISLAND_HOUSE2", "dest_warp_id": "0" }, { "x": 12, "y": 6, "elevation": 0, "dest_map": "MAP_THREE_ISLAND_HOUSE3", "dest_warp_id": "0" }, { "x": 12, "y": 12, "elevation": 0, "dest_map": "MAP_THREE_ISLAND_HOUSE4", "dest_warp_id": "0" }, { "x": 13, "y": 19, "elevation": 0, "dest_map": "MAP_THREE_ISLAND_HOUSE5", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 27, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "2", "script": "ThreeIsland_EventScript_BikerBossIntroTrigger" }, { "type": "trigger", "x": 8, "y": 27, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "2", "script": "ThreeIsland_EventScript_BikerBossIntroTrigger" }, { "type": "trigger", "x": 9, "y": 27, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "2", "script": "ThreeIsland_EventScript_BikerBossIntroTrigger" }, { "type": "trigger", "x": 10, "y": 27, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "2", "script": "ThreeIsland_EventScript_BikerBossIntroTrigger" }, { "type": "trigger", "x": 7, "y": 26, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "3", "script": "ThreeIsland_EventScript_BattleBikersTriggerLeft" }, { "type": "trigger", "x": 8, "y": 26, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "3", "script": "ThreeIsland_EventScript_BattleBikersTriggerMidLeft" }, { "type": "trigger", "x": 9, "y": 26, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "3", "script": "ThreeIsland_EventScript_BattleBikersTriggerMid" }, { "type": "trigger", "x": 11, "y": 27, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "2", "script": "ThreeIsland_EventScript_BikerBossIntroTrigger" }, { "type": "trigger", "x": 10, "y": 26, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "3", "script": "ThreeIsland_EventScript_BattleBikersTriggerMidRight" }, { "type": "trigger", "x": 11, "y": 26, "elevation": 3, "var": "VAR_MAP_SCENE_THREE_ISLAND", "var_value": "3", "script": "ThreeIsland_EventScript_BattleBikersTriggerRight" } ], "bg_events": [ { "type": "sign", "x": 12, "y": 31, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ThreeIsland_EventScript_IslandSign" }, { "type": "hidden_item", "x": 5, "y": 13, "elevation": 3, "item": "ITEM_PP_UP", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_PP_UP", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/ThreeIsland/scripts.inc ================================================ .equ LOCALID_ANTIBIKER1, 1 .equ LOCALID_ANTIBIKER2, 2 .equ LOCALID_PAXTON, 3 .equ LOCALID_BIKER1, 5 .equ LOCALID_BIKER2, 7 .equ LOCALID_BIKER3, 4 .equ LOCALID_BIKER4, 6 .equ LOCALID_BIKER5, 8 .equ LOCALID_BIKER6, 14 ThreeIsland_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_OnTransition .byte 0 ThreeIsland_OnTransition:: setworldmapflag FLAG_WORLD_MAP_THREE_ISLAND call_if_set FLAG_RESCUED_LOSTELLE, ThreeIsland_EventScript_HideAntiBikers call_if_eq VAR_MAP_SCENE_THREE_ISLAND, 4, ThreeIsland_EventScript_SetAntiBikersMovementAfterBikers end ThreeIsland_EventScript_HideAntiBikers:: setflag FLAG_HIDE_THREE_ISLAND_ANTIBIKERS return ThreeIsland_EventScript_SetAntiBikersMovementAfterBikers:: setobjectmovementtype LOCALID_ANTIBIKER1, MOVEMENT_TYPE_LOOK_AROUND setobjectmovementtype LOCALID_ANTIBIKER2, MOVEMENT_TYPE_LOOK_AROUND return ThreeIsland_EventScript_Biker:: lock setvar VAR_TEMP_1, 2 call ThreeIsland_EventScript_BikerArgumentScene release end ThreeIsland_EventScript_AntiBiker1:: lock goto_if_set FLAG_GOT_FULL_RESTORE_FROM_THREE_ISLAND_DEFENDER, ThreeIsland_EventScript_AntiBiker1GotFullRestore goto_if_eq VAR_MAP_SCENE_THREE_ISLAND, 4, ThreeIsland_EventScript_GiveFullRestore setvar VAR_TEMP_1, 0 call ThreeIsland_EventScript_BikerArgumentScene release end ThreeIsland_EventScript_AntiBiker1GotFullRestore:: applymovement LOCALID_ANTIBIKER1, Common_Movement_FacePlayer waitmovement 0 msgbox ThreeIsland_Text_YouveGotImpressiveMons release end ThreeIsland_EventScript_GiveFullRestore:: applymovement LOCALID_ANTIBIKER1, Common_Movement_FacePlayer waitmovement 0 msgbox ThreeIsland_Text_ThankYouOhYourMonGotHurt checkitemspace ITEM_FULL_RESTORE goto_if_eq VAR_RESULT, FALSE, ThreeIsland_EventScript_NoRoomForFullRestore msgreceiveditem ThreeIsland_Text_GivenFullRestore, ITEM_FULL_RESTORE additem ITEM_FULL_RESTORE setflag FLAG_GOT_FULL_RESTORE_FROM_THREE_ISLAND_DEFENDER msgbox ThreeIsland_Text_YouveGotImpressiveMons release end ThreeIsland_EventScript_NoRoomForFullRestore:: msgbox ThreeIsland_Text_OhYourBagIsFull release end ThreeIsland_EventScript_BikerArgumentScene:: call_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PlayerFaceLeft call_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PlayerFaceLeft applymovement LOCALID_ANTIBIKER1, ThreeIsland_Movement_SpeakRight waitmovement 0 msgbox ThreeIsland_Text_GoBackToKanto call_if_eq VAR_TEMP_1, 0, ThreeIsland_EventScript_PlayerFaceRight call_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PlayerFaceRight call_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PlayerFaceBiker applymovement LOCALID_BIKER1, ThreeIsland_Movement_SpeakLeft waitmovement 0 msgbox ThreeIsland_Text_BossIsOnHisWay call_if_eq VAR_TEMP_1, 0, ThreeIsland_EventScript_PlayerFaceUp call_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PlayerFaceUp call_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PlayerFaceAntiBiker applymovement LOCALID_ANTIBIKER2, ThreeIsland_Movement_SpeakRight waitmovement 0 msgbox ThreeIsland_Text_GetOffIslandNow call_if_eq VAR_TEMP_1, 0, ThreeIsland_EventScript_PlayerFaceRight call_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PlayerFaceRight call_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PlayerFaceBiker applymovement LOCALID_BIKER3, ThreeIsland_Movement_SpeakLeft waitmovement 0 msgbox ThreeIsland_Text_WhosGonnaMakeMe return ThreeIsland_EventScript_PlayerFaceUp:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return @ Unused ThreeIsland_EventScript_PlayerFaceDown:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return ThreeIsland_EventScript_PlayerFaceLeft:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return ThreeIsland_EventScript_PlayerFaceRight:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return ThreeIsland_EventScript_PlayerFaceBiker:: getplayerxy VAR_0x8004, VAR_0x8005 goto_if_ge VAR_0x8004, 9, ThreeIsland_EventScript_PlayerFaceUp goto ThreeIsland_EventScript_PlayerFaceRight end ThreeIsland_EventScript_PlayerFaceAntiBiker:: getplayerxy VAR_0x8004, VAR_0x8005 goto_if_ge VAR_0x8004, 9, ThreeIsland_EventScript_PlayerFaceLeft goto ThreeIsland_EventScript_PlayerFaceUp end ThreeIsland_EventScript_AntiBiker2:: lock goto_if_eq VAR_MAP_SCENE_THREE_ISLAND, 4, ThreeIsland_EventScript_AntiBiker2BikersGone setvar VAR_TEMP_1, 1 call ThreeIsland_EventScript_BikerArgumentScene release end ThreeIsland_EventScript_AntiBiker2BikersGone:: applymovement LOCALID_ANTIBIKER2, Common_Movement_FacePlayer waitmovement 0 msgbox ThreeIsland_Text_LostelleWentOffTowardsBondBridge release end ThreeIsland_EventScript_BikerBossIntroTrigger:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_ANTIBIKER1, ThreeIsland_Movement_SpeakRight waitmovement 0 msgbox ThreeIsland_Text_AreYouBossGoBackToKanto applymovement LOCALID_PAXTON, ThreeIsland_Movement_SpeakLeft waitmovement 0 msgbox ThreeIsland_Text_JustGotHerePal applymovement LOCALID_ANTIBIKER1, ThreeIsland_Movement_SpeakRight waitmovement 0 msgbox ThreeIsland_Text_FollowersRaisingHavoc applymovement LOCALID_PAXTON, ThreeIsland_Movement_SpeakLeft waitmovement 0 msgbox ThreeIsland_Text_OughtToBeThankingUs applymovement LOCALID_ANTIBIKER1, ThreeIsland_Movement_SpeakRight waitmovement 0 msgbox ThreeIsland_Text_YouCowardsToughInPack setvar VAR_MAP_SCENE_THREE_ISLAND, 3 releaseall end ThreeIsland_Movement_SpeakLeft:: walk_in_place_left step_end ThreeIsland_Movement_SpeakRight:: walk_in_place_right step_end ThreeIsland_EventScript_BattleBikersTriggerLeft:: lockall setvar VAR_TEMP_1, 0 goto ThreeIsland_EventScript_BattleBikersScene end ThreeIsland_EventScript_BattleBikersTriggerMidLeft:: lockall setvar VAR_TEMP_1, 1 goto ThreeIsland_EventScript_BattleBikersScene end ThreeIsland_EventScript_BattleBikersTriggerMid:: lockall setvar VAR_TEMP_1, 2 goto ThreeIsland_EventScript_BattleBikersScene end ThreeIsland_EventScript_BattleBikersTriggerMidRight:: lockall setvar VAR_TEMP_1, 3 goto ThreeIsland_EventScript_BattleBikersScene end ThreeIsland_EventScript_BattleBikersTriggerRight:: lockall setvar VAR_TEMP_1, 4 goto ThreeIsland_EventScript_BattleBikersScene end ThreeIsland_EventScript_BattleBikersScene:: textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_BIKER1, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN applymovement LOCALID_BIKER1, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_BIKER1, Common_Movement_Delay48 waitmovement 0 applymovement LOCALID_BIKER1, ThreeIsland_Movement_BikerApproach waitmovement 0 playbgm MUS_ENCOUNTER_BOY, 0 msgbox ThreeIsland_Text_WannaMakeSomethingOfYourStaring, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, ThreeIsland_EventScript_LeaveBikersAlone msgbox ThreeIsland_Text_Biker1Intro setvar VAR_LAST_TALKED, LOCALID_BIKER1 trainerbattle_no_intro TRAINER_BIKER_GOON, ThreeIsland_Text_Biker1Defeat applymovement LOCALID_BIKER1, ThreeIsland_Movement_BikerSpeak waitmovement 0 msgbox ThreeIsland_Text_Biker1PostBattle closemessage applymovement LOCALID_BIKER2, ThreeIsland_Movement_BikerApproach waitmovement 0 playbgm MUS_ENCOUNTER_BOY, 0 msgbox ThreeIsland_Text_Biker2Intro setvar VAR_LAST_TALKED, LOCALID_BIKER2 trainerbattle_no_intro TRAINER_BIKER_GOON_2, ThreeIsland_Text_Biker2Defeat applymovement LOCALID_BIKER2, ThreeIsland_Movement_BikerSpeak waitmovement 0 msgbox ThreeIsland_Text_Biker2PostBattle closemessage applymovement LOCALID_BIKER3, ThreeIsland_Movement_BikerApproach waitmovement 0 playbgm MUS_ENCOUNTER_BOY, 0 msgbox ThreeIsland_Text_Biker3Intro setvar VAR_LAST_TALKED, LOCALID_BIKER3 trainerbattle_no_intro TRAINER_BIKER_GOON_3, ThreeIsland_Text_Biker3Defeat applymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement LOCALID_BIKER4, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_BIKER5, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox ThreeIsland_Text_Biker3PostBattle closemessage delay 45 call_if_eq VAR_TEMP_1, 0, ThreeIsland_EventScript_PaxtonApproachLeft call_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PaxtonApproachMidLeft call_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PaxtonApproachMid call_if_eq VAR_TEMP_1, 3, ThreeIsland_EventScript_PaxtonApproachMidRight call_if_eq VAR_TEMP_1, 4, ThreeIsland_EventScript_PaxtonApproachRight playbgm MUS_ENCOUNTER_BOY, 0 msgbox ThreeIsland_Text_PaxtonIntro setvar VAR_LAST_TALKED, LOCALID_PAXTON trainerbattle_no_intro TRAINER_CUE_BALL_PAXTON, ThreeIsland_Text_PaxtonDefeat msgbox ThreeIsland_Text_PaxtonPostBattle closemessage fadescreen FADE_TO_BLACK removeobject LOCALID_PAXTON removeobject LOCALID_BIKER1 removeobject LOCALID_BIKER2 removeobject LOCALID_BIKER3 removeobject LOCALID_BIKER4 removeobject LOCALID_BIKER5 removeobject LOCALID_BIKER6 fadescreen FADE_FROM_BLACK setvar VAR_MAP_SCENE_THREE_ISLAND, 4 releaseall end ThreeIsland_EventScript_PaxtonApproachLeft:: applymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachLeft waitmovement 0 return ThreeIsland_EventScript_PaxtonApproachMidLeft:: applymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachMidLeft waitmovement 0 return ThreeIsland_EventScript_PaxtonApproachMid:: applymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachMid applymovement OBJ_EVENT_ID_PLAYER, ThreeIsland_Movement_PlayerFacePaxton waitmovement 0 return ThreeIsland_EventScript_PaxtonApproachMidRight:: applymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, ThreeIsland_Movement_PlayerFacePaxton applymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachMidRight waitmovement 0 return ThreeIsland_EventScript_PaxtonApproachRight:: applymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, ThreeIsland_Movement_PlayerFacePaxton applymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachRight waitmovement 0 return ThreeIsland_EventScript_LeaveBikersAlone:: msgbox ThreeIsland_Text_ThatsSmart closemessage applymovement OBJ_EVENT_ID_PLAYER, ThreeIsland_Movement_PlayerLeaveBikers waitmovement 0 applymovement LOCALID_BIKER1, ThreeIsland_Movement_Biker1ReturnToPack waitmovement 0 fadedefaultbgm releaseall end ThreeIsland_Movement_PlayerLeaveBikers:: walk_down step_end ThreeIsland_Movement_BikerApproach:: walk_down step_end ThreeIsland_Movement_Biker1ReturnToPack:: walk_up walk_in_place_faster_left step_end ThreeIsland_Movement_BikerSpeak:: walk_in_place_down step_end ThreeIsland_Movement_PaxtonApproachLeft:: walk_down walk_left walk_in_place_faster_down step_end ThreeIsland_Movement_PaxtonApproachMidLeft:: walk_down step_end ThreeIsland_Movement_PaxtonApproachMid:: walk_down walk_down walk_in_place_faster_right step_end ThreeIsland_Movement_PlayerFacePaxton:: delay_16 delay_16 walk_in_place_faster_left step_end ThreeIsland_Movement_PaxtonApproachMidRight:: walk_down walk_down walk_right walk_in_place_faster_right step_end ThreeIsland_Movement_PaxtonApproachRight:: walk_down walk_down walk_right walk_right walk_in_place_faster_right step_end ThreeIsland_EventScript_Woman:: msgbox ThreeIsland_Text_WouldntWantToSeeBikersHereAgain, MSGBOX_NPC end ThreeIsland_EventScript_LittleBoy:: msgbox ThreeIsland_Text_WhenDodouEvolvesGoingToPlayGame, MSGBOX_NPC end ThreeIsland_EventScript_Doduo:: lock faceplayer waitse playmoncry SPECIES_DODUO, CRY_MODE_NORMAL msgbox ThreeIsland_Text_Doduo waitmoncry release end ThreeIsland_EventScript_IslandSign:: msgbox ThreeIsland_Text_IslandSign, MSGBOX_SIGN end ThreeIsland_EventScript_Biker6:: msgbox ThreeIsland_Text_IslandBelongsToUs, MSGBOX_NPC end ================================================ FILE: data/maps/ThreeIsland/text.inc ================================================ ThreeIsland_Text_IslandSign:: .string "THREE ISLAND\n" .string "Kin Island of Family Bonding$" ThreeIsland_Text_IslandBelongsToUs:: .string "Hyahoo!\p" .string "From this day on, this island\n" .string "belongs to us!$" ThreeIsland_Text_GoBackToKanto:: .string "We don't need you people bringing\n" .string "your noise and trouble here!\p" .string "We're asking you to go back to\n" .string "KANTO!$" ThreeIsland_Text_BossIsOnHisWay:: .string "Hey, go cry somewhere else.\n" .string "Our boss is on his way.\p" .string "When he gets here, we'll give you\n" .string "a k-rad motorbike show you won't\l" .string "soon forget!$" ThreeIsland_Text_GetOffIslandNow:: .string "W-what!? Not on your life!\n" .string "Get off the island now!$" ThreeIsland_Text_WhosGonnaMakeMe:: .string "Who's gonna make me?$" ThreeIsland_Text_AreYouBossGoBackToKanto:: .string "Are you the boss?\n" .string "Go back to KANTO right now!$" ThreeIsland_Text_JustGotHerePal:: .string "Hah?\p" .string "I just got here, pal.\p" .string "What's with the hostile attitude?\n" .string "It's mighty cold of you!$" ThreeIsland_Text_FollowersRaisingHavoc:: .string "Your gang of followers have been\n" .string "raising havoc on their bikes.\p" .string "Do you have any idea how much\n" .string "trouble they've caused us on the\l" .string "island?$" ThreeIsland_Text_OughtToBeThankingUs:: .string "No, man, I don't get it at all.\p" .string "Look at this place.\n" .string "What do you do for entertainment?\p" .string "You ought to be thanking us for\n" .string "livening up this sleepy village.\p" .string "But hey, if you insist, you can try\n" .string "making us leave.$" ThreeIsland_Text_YouCowardsToughInPack:: .string "Grr… You cowards…\n" .string "So tough in a pack…$" ThreeIsland_Text_WannaMakeSomethingOfYourStaring:: .string "You, what are you staring at?\n" .string "Don't you know it's not polite?\p" .string "You wanna make something of it\n" .string "or what?$" ThreeIsland_Text_ThatsSmart:: .string "That's smart.\n" .string "Keep your nose out of this.$" ThreeIsland_Text_Biker1Intro:: .string "Heh, I like your guts.\n" .string "You'll be losing money to me, but…$" ThreeIsland_Text_Biker1Defeat:: .string "Wha…\n" .string "What is this kid?!$" ThreeIsland_Text_Biker1PostBattle:: .string "Aww, man…\n" .string "Don't you dare laugh!$" ThreeIsland_Text_Biker2Intro:: .string "Aren't you from KANTO?\n" .string "You should be on our side!$" ThreeIsland_Text_Biker2Defeat:: .string "Stop fooling around!$" ThreeIsland_Text_Biker2PostBattle:: .string "What's the matter with you,\n" .string "getting all hot like that?\p" .string "Totally uncool, man!$" ThreeIsland_Text_Biker3Intro:: .string "We invited the boss out here,\n" .string "but you had to mess it up!\p" .string "You embarrassed us, man!$" ThreeIsland_Text_Biker3Defeat:: .string "… … … … … …$" ThreeIsland_Text_Biker3PostBattle:: .string "Boss, I'm telling you, you've gotta\n" .string "do something about this kid!$" ThreeIsland_Text_PaxtonIntro:: .string "I've been watching you, and I'd say\n" .string "you've done enough.\p" .string "What are you, their friend or\n" .string "something?\p" .string "Then I guess you'll be battling me\n" .string "in their place.$" ThreeIsland_Text_PaxtonDefeat:: .string "All right, enough!\n" .string "We'll leave like you wanted!\p" .string "We'll be happy to see the last of\n" .string "this boring island!$" ThreeIsland_Text_PaxtonPostBattle:: .string "Humph! Yeah, go right on hanging\n" .string "around with these hayseeds!$" ThreeIsland_Text_ThankYouOhYourMonGotHurt:: .string "Thank you! Those goons were\n" .string "nothing but bad trouble.\p" .string "Oh, look, your POKéMON got hurt\n" .string "on my account.$" ThreeIsland_Text_GivenFullRestore:: .string "{PLAYER} was given\n" .string "a FULL RESTORE.$" ThreeIsland_Text_OhYourBagIsFull:: .string "Oh?\n" .string "Your BAG is full.$" ThreeIsland_Text_YouveGotImpressiveMons:: .string "You've got seriously impressive\n" .string "POKéMON with you.$" ThreeIsland_Text_LostelleWentOffTowardsBondBridge:: .string "It'd be fantastic if someone as\n" .string "strong as you lived here.\p" .string "I hope you'll at least stay here\n" .string "a while.\p" .string "…I beg your pardon?\n" .string "You're looking for LOSTELLE?\p" .string "LOSTELLE went off towards BOND\n" .string "BRIDGE a while ago.$" ThreeIsland_Text_WouldntWantToSeeBikersHereAgain:: .string "THREE ISLAND is actually the most\n" .string "populous of the islands here.\p" .string "Still, it could be less sleepy.\p" .string "But I wouldn't want to see goons\n" .string "like those BIKERS here again.$" ThreeIsland_Text_WhenDodouEvolvesGoingToPlayGame:: .string "I'm going to train my DODUO in the\n" .string "BERRY FOREST.\p" .string "When it evolves, I'm going to play\n" .string "a game on TWO ISLAND.$" ThreeIsland_Text_Doduo:: .string "DODUO: Gigiih!$" ================================================ FILE: data/maps/ThreeIsland_BerryForest/map.json ================================================ { "id": "MAP_THREE_ISLAND_BERRY_FOREST", "name": "ThreeIsland_BerryForest", "layout": "LAYOUT_THREE_ISLAND_BERRY_FOREST", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_BERRY_FOREST", "requires_flash": false, "weather": "WEATHER_SHADE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 4, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_BerryForest_EventScript_Lostelle", "flag": "FLAG_HIDE_LOSTELLE_IN_BERRY_FOREST" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 12, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 19, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 23, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 38, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 44, "y": 23, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_5" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 44, "y": 29, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 16, "y": 43, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_10" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 17, "y": 39, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_9" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 14, "y": 39, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_8" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 11, "y": 39, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BERRY_FOREST_CUT_TREE_7" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_BerryForest_EventScript_ItemMaxEther", "flag": "FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_MAX_ETHER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 27, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_BerryForest_EventScript_ItemFullHeal", "flag": "FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_FULL_HEAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 43, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_BerryForest_EventScript_ItemMaxElixir", "flag": "FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_MAX_ELIXIR" } ], "warp_events": [ { "x": 43, "y": 41, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BOND_BRIDGE", "dest_warp_id": "1" }, { "x": 42, "y": 41, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BOND_BRIDGE", "dest_warp_id": "0" }, { "x": 44, "y": 41, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BOND_BRIDGE", "dest_warp_id": "2" }, { "x": 75, "y": 41, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BOND_BRIDGE", "dest_warp_id": "3" }, { "x": 76, "y": 41, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BOND_BRIDGE", "dest_warp_id": "4" }, { "x": 77, "y": 41, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BOND_BRIDGE", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 7, "y": 27, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ThreeIsland_BerryForest_EventScript_BewareSign" }, { "type": "sign", "x": 39, "y": 35, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ThreeIsland_BerryForest_EventScript_WelcomeSign" }, { "type": "hidden_item", "x": 31, "y": 25, "elevation": 3, "item": "ITEM_POMEG_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_POMEG_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 15, "y": 15, "elevation": 3, "item": "ITEM_KELPSY_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 25, "y": 24, "elevation": 3, "item": "ITEM_QUALOT_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_QUALOT_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 11, "y": 24, "elevation": 3, "item": "ITEM_HONDEW_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 37, "y": 18, "elevation": 3, "item": "ITEM_ORAN_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ORAN_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 14, "y": 23, "elevation": 3, "item": "ITEM_CHERI_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHERI_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 47, "y": 5, "elevation": 3, "item": "ITEM_CHESTO_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHESTO_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 7, "y": 30, "elevation": 3, "item": "ITEM_PECHA_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PECHA_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 16, "y": 5, "elevation": 3, "item": "ITEM_RAWST_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_RAWST_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 25, "y": 6, "elevation": 3, "item": "ITEM_ASPEAR_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ASPEAR_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 46, "y": 32, "elevation": 3, "item": "ITEM_PERSIM_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 43, "y": 16, "elevation": 3, "item": "ITEM_GREPA_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 8, "y": 5, "elevation": 3, "item": "ITEM_LUM_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_LUM_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 49, "y": 25, "elevation": 3, "item": "ITEM_TAMATO_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 38, "y": 11, "elevation": 3, "item": "ITEM_SITRUS_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_SITRUS_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 67, "y": 36, "elevation": 3, "item": "ITEM_LIECHI_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_RAWST_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 77, "y": 34, "elevation": 3, "item": "ITEM_STARF_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_LUM_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 77, "y": 25, "elevation": 3, "item": "ITEM_GANLON_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHESTO_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 67, "y": 21, "elevation": 3, "item": "ITEM_LANSAT_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PECHA_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 60, "y": 33, "elevation": 3, "item": "ITEM_SALAC_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 71, "y": 32, "elevation": 3, "item": "ITEM_APICOT_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHERI_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 60, "y": 25, "elevation": 3, "item": "ITEM_PETAYA_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ASPEAR_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/ThreeIsland_BerryForest/scripts.inc ================================================ .set LOCALID_LOSTELLE, 1 ThreeIsland_BerryForest_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_BerryForest_OnTransition .byte 0 ThreeIsland_BerryForest_OnTransition:: setworldmapflag FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST getplayerxy VAR_RESULT, VAR_TEMP_1 goto_if_ge VAR_RESULT, 59, ThreeIsland_BerryForest_SetNewAreaEscapeWarp setescapewarp MAP_THREE_ISLAND_BOND_BRIDGE, 255, 12, 26 end ThreeIsland_BerryForest_SetNewAreaEscapeWarp:: setescapewarp MAP_THREE_ISLAND_BOND_BRIDGE, 255, 28, 5 end ThreeIsland_BerryForest_EventScript_Lostelle:: lock faceplayer msgbox ThreeIsland_BerryForest_Text_HelpScaryPokemon playse SE_PIN applymovement LOCALID_LOSTELLE, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_LOSTELLE, ThreeIsland_BerryForest_Movement_LostelleLookAround waitmovement 0 msgbox ThreeIsland_BerryForest_Text_HereItComesAgain goto_if_questlog EventScript_ReleaseEnd waitse playmoncry SPECIES_HYPNO, CRY_MODE_ENCOUNTER waitmoncry setwildbattle SPECIES_HYPNO, 30 dowildbattle special QuestLog_CutRecording applymovement LOCALID_LOSTELLE, Common_Movement_FacePlayer waitmovement 0 msgbox ThreeIsland_BerryForest_Text_ThankYouHaveThis giveitem ITEM_KELPSY_BERRY call_if_eq VAR_RESULT, FALSE, ThreeIsland_BerryForest_EventScript_NoRoomForBerry special BufferBigGuyOrBigGirlString msgbox ThreeIsland_BerryForest_Text_LetsGoHome closemessage setflag FLAG_RESCUED_LOSTELLE setflag FLAG_HIDE_LOSTELLE_IN_BERRY_FOREST setvar VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 2 clearflag FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE warp MAP_TWO_ISLAND_JOYFUL_GAME_CORNER, 6, 6 waitstate release end ThreeIsland_BerryForest_EventScript_NoRoomForBerry:: msgbox ThreeIsland_BerryForest_Text_BerryPouchIsFull return ThreeIsland_BerryForest_Movement_LostelleLookAround:: walk_in_place_faster_left delay_16 walk_in_place_faster_right delay_8 walk_in_place_faster_left step_end ThreeIsland_BerryForest_EventScript_WelcomeSign:: msgbox ThreeIsland_BerryForest_Text_WelcomeToBerryForest, MSGBOX_SIGN end ThreeIsland_BerryForest_EventScript_BewareSign:: msgbox ThreeIsland_BerryForest_Text_BewareWildBerryLovingMons, MSGBOX_SIGN end ================================================ FILE: data/maps/ThreeIsland_BerryForest/text.inc ================================================ ThreeIsland_BerryForest_Text_HelpScaryPokemon:: .string "LOSTELLE: Whimper… Sniff…\n" .string "Oh! Please, help!\p" .string "A scary POKéMON appeared there\n" .string "a little while ago.\p" .string "It kept scaring.\n" .string "It made LOSTELLE scared.\p" .string "I'm too scared to move!\n" .string "But I want to go home…$" ThreeIsland_BerryForest_Text_HereItComesAgain:: .string "Oh! Here it comes again!\n" .string "No! Go away! It's scaring me!\p" .string "Waaaaaaah!\n" .string "I want my daddy!$" ThreeIsland_BerryForest_Text_ThankYouHaveThis:: .string "Ohh! That was so scary!\n" .string "Thank you!\p" .string "LOSTELLE came to pick some\n" .string "BERRIES.\p" .string "You can have this!$" ThreeIsland_BerryForest_Text_LetsGoHome:: .string "What's your name?\p" .string "LOSTELLE's scared, so can I go\n" .string "with you to my daddy's house?\p" .string "Okay!\n" .string "Let's go home!$" ThreeIsland_BerryForest_Text_BerryPouchIsFull:: .string "Your BERRY POUCH is full.\n" .string "I guess you don't want this.$" ThreeIsland_BerryForest_Text_WelcomeToBerryForest:: .string "Welcome to the BERRY FOREST\p" .string "Be friendly and share BERRIES with\n" .string "others and POKéMON.$" ThreeIsland_BerryForest_Text_BewareWildBerryLovingMons:: .string "Beware of wild, BERRY-loving\n" .string "POKéMON!$" ================================================ FILE: data/maps/ThreeIsland_BondBridge/map.json ================================================ { "id": "MAP_THREE_ISLAND_BOND_BRIDGE", "name": "ThreeIsland_BondBridge", "layout": "LAYOUT_THREE_ISLAND_BOND_BRIDGE", "music": "MUS_ROUTE104", "region_map_section": "MAPSEC_BOND_BRIDGE", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "right", "offset": 20, "map": "MAP_THREE_ISLAND" }, { "direction": "dive", "offset": 0, "map": "MAP_THREE_ISLAND_BOND_BRIDGE_UNDERWATER" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_AROMA_LADY", "x": 27, "y": 30, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "ThreeIsland_BondBridge_EventScript_Nikki", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_AROMA_LADY", "x": 68, "y": 30, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "ThreeIsland_BondBridge_EventScript_Violet", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TUBER_F", "in_connection": false, "x": 33, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "ThreeIsland_BondBridge_EventScript_Amira", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TUBER_F", "in_connection": false, "x": 50, "y": 31, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "ThreeIsland_BondBridge_EventScript_Alexis", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_WATER_2", "x": 36, "y": 24, "elevation": 1, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "ThreeIsland_BondBridge_EventScript_Tisha", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 77, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "ThreeIsland_BondBridge_EventScript_Joy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 78, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "ThreeIsland_BondBridge_EventScript_Meg", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 72, "y": 28, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BOND_BRIDGE_CUT_TREE_1" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 86, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_BOND_BRIDGE_CUT_TREE_2" } ], "warp_events": [ { "x": 11, "y": 26, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BERRY_FOREST", "dest_warp_id": 1 }, { "x": 12, "y": 26, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BERRY_FOREST", "dest_warp_id": "0" }, { "x": 13, "y": 26, "elevation": 0, "dest_map": "MAP_THREE_ISLAND_BERRY_FOREST", "dest_warp_id": 2 }, { "x": 27, "y": 5, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BERRY_FOREST", "dest_warp_id": "3" }, { "x": 28, "y": 5, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BERRY_FOREST", "dest_warp_id": "4" }, { "x": 29, "y": 5, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_BERRY_FOREST", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 19, "y": 32, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ThreeIsland_BondBridge_EventScript_BerryForestSign" }, { "type": "hidden_item", "x": 61, "y": 25, "elevation": 0, "item": "ITEM_MAX_REPEL", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_MAX_REPEL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 44, "y": 32, "elevation": 3, "item": "ITEM_PEARL", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_PEARL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 33, "y": 27, "elevation": 3, "item": "ITEM_STARDUST", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_STARDUST", "quantity": 1, "underfoot": false }, { "type": "sign", "x": 91, "y": 29, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ThreeIsland_BondBridge_EventScript_BondBridgeSign" } ], "level_scaling": "4" } ================================================ FILE: data/maps/ThreeIsland_BondBridge/scripts.inc ================================================ ThreeIsland_BondBridge_MapScripts:: .byte 0 ThreeIsland_BondBridge_EventScript_BerryForestSign:: msgbox ThreeIsland_BondBridge_Text_BerryForestAhead, MSGBOX_SIGN end ThreeIsland_BondBridge_EventScript_BondBridgeSign:: msgbox ThreeIsland_BondBridge_Text_BondBridgeSign, MSGBOX_SIGN end ================================================ FILE: data/maps/ThreeIsland_BondBridge/text.inc ================================================ ThreeIsland_BondBridge_Text_NikkiIntro:: .string "The salty tang of the sea…\n" .string "It tickles my heart.$" ThreeIsland_BondBridge_Text_NikkiDefeat:: .string "…Sniff, sniff…\n" .string "Something smells unpleasant…$" ThreeIsland_BondBridge_Text_NikkiPostBattle:: .string "Perhaps that reek is your sweaty\n" .string "POKéMON's body odor…$" ThreeIsland_BondBridge_Text_VioletIntro:: .string "Where are you off to in such\n" .string "a hurry?$" ThreeIsland_BondBridge_Text_VioletDefeat:: .string "You're raising some wonderful\n" .string "POKéMON.$" ThreeIsland_BondBridge_Text_VioletPostBattle:: .string "If you keep going this way, you'll\n" .string "eventually reach BERRY FOREST.$" ThreeIsland_BondBridge_Text_AmiraIntro:: .string "My mommy said that I can't swim\n" .string "without my float ring.$" ThreeIsland_BondBridge_Text_AmiraDefeat:: .string "Waaah!\n" .string "Waaah!$" ThreeIsland_BondBridge_Text_AmiraPostBattle:: .string "This year, I'm going to finally\n" .string "learn how to swim!$" ThreeIsland_BondBridge_Text_AlexisIntro:: .string "Yay, yay!\n" .string "POKéMON!$" ThreeIsland_BondBridge_Text_AlexisDefeat:: .string "What happens now?$" ThreeIsland_BondBridge_Text_AlexisPostBattle:: .string "Did I just win?\n" .string "Or did I lose?$" ThreeIsland_BondBridge_Text_TishaIntro:: .string "Oh, no, don't come here!\n" .string "Please, stay away from me!$" ThreeIsland_BondBridge_Text_TishaDefeat:: .string "Okay, you've won!\n" .string "Now will you please go away?$" ThreeIsland_BondBridge_Text_TishaPostBattle:: .string "A POKéMON bit through my \n" .string "swimsuit.\p" .string "I can't get out of the water!$" ThreeIsland_BondBridge_Text_JoyIntro:: .string "JOY: We'll teach you what our\n" .string "favorite POKéMON is!$" ThreeIsland_BondBridge_Text_JoyDefeat:: .string "JOY: Ohh…\n" .string "MEG!$" ThreeIsland_BondBridge_Text_JoyPostBattle:: .string "JOY: Wasn't that fun?\n" .string "I hope we can battle again!$" ThreeIsland_BondBridge_Text_JoyNotEnoughMons:: .string "JOY: I really want to battle with\n" .string "MEG.\p" .string "One POKéMON isn't enough.$" ThreeIsland_BondBridge_Text_MegIntro:: .string "MEG: We'll show you our favorite\n" .string "POKéMON.$" ThreeIsland_BondBridge_Text_MegDefeat:: .string "MEG: Ohh…\n" .string "JOY!$" ThreeIsland_BondBridge_Text_MegPostBattle:: .string "MEG: JOY, wasn't that fun?$" ThreeIsland_BondBridge_Text_MegNotEnoughMons:: .string "MEG: I want to battle together\n" .string "with JOY.\p" .string "One POKéMON isn't enough.$" ThreeIsland_BondBridge_Text_BerryForestAhead:: .string "BERRY FOREST AHEAD$" ThreeIsland_BondBridge_Text_BondBridgeSign:: .string "BOND BRIDGE\n" .string "Please be quiet when crossing.\p" .string "BERRY FOREST AHEAD$" ================================================ FILE: data/maps/ThreeIsland_BondBridge_Underwater/map.json ================================================ { "id": "MAP_THREE_ISLAND_BOND_BRIDGE_UNDERWATER", "name": "ThreeIsland_BondBridge_Underwater", "layout": "LAYOUT_THREE_ISLAND_BOND_BRIDGE_UNDERWATER", "music": "MUS_UNDERWATER", "region_map_section": "MAPSEC_UNDERWATER_124", "requires_flash": false, "weather": "WEATHER_UNDERWATER_BUBBLES", "map_type": "MAP_TYPE_UNDERWATER", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "emerge", "offset": 0, "map": "MAP_THREE_ISLAND_BOND_BRIDGE" } ], "object_events": [ ], "warp_events": [ ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 30, "y": 11, "elevation": 3, "item": "ITEM_HEART_SCALE", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_UNDERWATER_HEART_SCALE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 55, "y": 36, "elevation": 3, "item": "ITEM_DIVE_BALL", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_UNDERWATER_DIVE_BALL", "quantity": 1, "underfoot": false } ], "level_scaling": "5" } ================================================ FILE: data/maps/ThreeIsland_BondBridge_Underwater/scripts.inc ================================================ ThreeIsland_BondBridge_Underwater_MapScripts:: .byte 0 ================================================ FILE: data/maps/ThreeIsland_BondBridge_Underwater/text.inc ================================================ ================================================ FILE: data/maps/ThreeIsland_DunsparceTunnel/map.json ================================================ { "id": "MAP_THREE_ISLAND_DUNSPARCE_TUNNEL", "name": "ThreeIsland_DunsparceTunnel", "layout": "LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL", "music": "MUS_PETALBURG_WOODS", "region_map_section": "MAPSEC_THREE_ISLE_PATH", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 23, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_DunsparceTunnel_EventScript_Prospector", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 4, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_PORT", "dest_warp_id": "0" }, { "x": 25, "y": 5, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_PORT", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 21, "y": 3, "elevation": 0, "item": "ITEM_NUGGET", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_DUNSPARCE_TUNNEL_NUGGET", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/ThreeIsland_DunsparceTunnel/scripts.inc ================================================ .set LOCALID_PROSPECTOR, 1 ThreeIsland_DunsparceTunnel_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_DunsparceTunnel_OnTransition .byte 0 ThreeIsland_DunsparceTunnel_OnTransition:: setworldmapflag FLAG_WORLD_MAP_THREE_ISLAND_DUNSPARCE_TUNNEL call_if_set FLAG_SYS_RECEIVED_EXTENDED_DEX, ThreeIsland_DunsparceTunnel_EventScript_SetLayoutDugOut call_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, ThreeIsland_DunsparceTunnel_EventScript_MoveProspectorToWall end ThreeIsland_DunsparceTunnel_EventScript_SetLayoutDugOut:: setmaplayoutindex LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL_DUG_OUT return ThreeIsland_DunsparceTunnel_EventScript_MoveProspectorToWall:: setobjectxyperm LOCALID_PROSPECTOR, 6, 3 setobjectmovementtype LOCALID_PROSPECTOR, MOVEMENT_TYPE_FACE_RIGHT return ThreeIsland_DunsparceTunnel_EventScript_Prospector:: lock faceplayer goto_if_set FLAG_GOT_NUGGET_FROM_DUNSPARCE_TUNNEL, ThreeIsland_DunsparceTunnel_EventScript_ProspectorAlreadyGaveNugget goto_if_set FLAG_SYS_RECEIVED_EXTENDED_DEX, ThreeIsland_DunsparceTunnel_EventScript_ProspectorStruckGold msgbox ThreeIsland_DunsparceTunnel_Text_ProspectingForGold closemessage applymovement LOCALID_PROSPECTOR, Common_Movement_FaceOriginalDirection waitmovement 0 release end ThreeIsland_DunsparceTunnel_EventScript_ProspectorStruckGold:: msgbox ThreeIsland_DunsparceTunnel_Text_StruckGoldThisIsForYou goto_if_set FLAG_GOT_DOME_FOSSIL, ThreeIsland_DunsparceTunnel_EventScript_GiveHelixFossil bufferitemnameplural 0, ITEM_DOME_FOSSIL, 1 giveitem_msg ThreeIsland_DunsparceTunnel_Text_ObtainedFossil, ITEM_DOME_FOSSIL, 1, MUS_OBTAIN_KEY_ITEM goto_if_eq VAR_RESULT, FALSE, ThreeIsland_DunsparceTunnel_EventScript_NoRoomForNugget setflag FLAG_GOT_NUGGET_FROM_DUNSPARCE_TUNNEL goto ThreeIsland_DunsparceTunnel_EventScript_ProspectorAlreadyGaveNugget end ThreeIsland_DunsparceTunnel_EventScript_GiveHelixFossil:: bufferitemnameplural 0, ITEM_HELIX_FOSSIL, 1 giveitem_msg ThreeIsland_DunsparceTunnel_Text_ObtainedFossil, ITEM_HELIX_FOSSIL, 1, MUS_OBTAIN_KEY_ITEM goto_if_eq VAR_RESULT, FALSE, ThreeIsland_DunsparceTunnel_EventScript_NoRoomForNugget setflag FLAG_GOT_NUGGET_FROM_DUNSPARCE_TUNNEL goto ThreeIsland_DunsparceTunnel_EventScript_ProspectorAlreadyGaveNugget end ThreeIsland_DunsparceTunnel_EventScript_NoRoomForNugget:: msgbox ThreeIsland_DunsparceTunnel_Text_WhoopsBagCrammedFull release end ThreeIsland_DunsparceTunnel_EventScript_ProspectorAlreadyGaveNugget:: call_if_set FLAG_GOT_DOME_FOSSIL, ThreeIsland_DunsparceTunnel_EventScript_BufferHelix call_if_unset FLAG_GOT_DOME_FOSSIL, ThreeIsland_DunsparceTunnel_EventScript_BufferDome msgbox ThreeIsland_DunsparceTunnel_Text_ThatsANugget release end ThreeIsland_DunsparceTunnel_EventScript_BufferHelix:: bufferitemnameplural 0, ITEM_HELIX_FOSSIL, 1 return ThreeIsland_DunsparceTunnel_EventScript_BufferDome:: bufferitemnameplural 0, ITEM_DOME_FOSSIL, 1 return ================================================ FILE: data/maps/ThreeIsland_DunsparceTunnel/text.inc ================================================ ThreeIsland_DunsparceTunnel_Text_ProspectingForGold:: .string "Hey, there!\n" .string "How's it going?\p" .string "What am I doing here, you ask?\n" .string "Why, I'm prospecting for gold!\p" .string "When I strike it rich, I'm buying\n" .string "a house in KANTO.$" ThreeIsland_DunsparceTunnel_Text_StruckGoldThisIsForYou:: .string "Hey, there! How's it going?\n" .string "Did you hear? I've struck gold!\p" .string "You remembered that I was\n" .string "prospecting, didn't you?\p" .string "You can't begin to imagine just\n" .string "how happy I am.\p" .string "I also found something peculiar\n" .string "while digging through here.\p" .string "I'm feeling generous now that\n" .string "I'm rich, so this is for you!$" ThreeIsland_DunsparceTunnel_Text_ThatsANugget:: .string "That's a {STR_VAR_1}!\p" .string "I can't give you any of its ancient\n" .string "wisdom, so that'll have to do!$" ThreeIsland_DunsparceTunnel_Text_WhoopsBagCrammedFull:: .string "Whoops, your BAG is crammed full!\n" .string "I'll give this to you later.$" ThreeIsland_DunsparceTunnel_Text_ObtainedFossil:: .string "{PLAYER} received a {STR_VAR_1}\nfrom the prospector!$" ================================================ FILE: data/maps/ThreeIsland_Harbor/map.json ================================================ { "id": "MAP_THREE_ISLAND_HARBOR", "name": "ThreeIsland_Harbor", "layout": "LAYOUT_ISLAND_HARBOR", "music": "MUS_RUSTBORO", "region_map_section": "MAPSEC_THREE_ISLE_PORT", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 8, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_Harbor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_PORT", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ThreeIsland_Harbor/scripts.inc ================================================ ThreeIsland_Harbor_MapScripts:: .byte 0 ThreeIsland_Harbor_EventScript_Sailor:: lock faceplayer message Text_WhereDoYouWantToSail waitmessage setvar VAR_0x8004, SEAGALLOP_THREE_ISLAND goto EventScript_ChooseDestFromIsland end ================================================ FILE: data/maps/ThreeIsland_House1/map.json ================================================ { "id": "MAP_THREE_ISLAND_HOUSE1", "name": "ThreeIsland_House1", "layout": "LAYOUT_THREE_ISLAND_HOUSE1", "music": "MUS_RUSTBORO", "region_map_section": "MAPSEC_THREE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 3, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_House1_EventScript_Lostelle", "flag": "FLAG_HIDE_LOSTELLE_IN_HER_HOME" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_THREE_ISLAND", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 2, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ThreeIsland_House1_EventScript_DisplayCase" } ], "level_scaling": "0" } ================================================ FILE: data/maps/ThreeIsland_House1/scripts.inc ================================================ ThreeIsland_House1_MapScripts:: .byte 0 ThreeIsland_House1_EventScript_Lostelle:: lock faceplayer special BufferBigGuyOrBigGirlString msgbox ThreeIsland_House1_Text_YoureAlwaysSoCool release end ThreeIsland_House1_EventScript_DisplayCase:: msgbox ThreeIsland_House1_Text_RareRocksGemsDisplayed, MSGBOX_SIGN end ================================================ FILE: data/maps/ThreeIsland_House1/text.inc ================================================ ThreeIsland_House1_Text_YoureAlwaysSoCool:: .string "LOSTELLE: Hi, {PLAYER}!\n" .string "You're always so cool!\p" .string "I'll make lunch for you, too, one\n" .string "day, {PLAYER}.$" ThreeIsland_House1_Text_RareRocksGemsDisplayed:: .string "Rare rocks and gems are displayed.$" ================================================ FILE: data/maps/ThreeIsland_House2/map.json ================================================ { "id": "MAP_THREE_ISLAND_HOUSE2", "name": "ThreeIsland_House2", "layout": "LAYOUT_HOUSE3", "music": "MUS_RUSTBORO", "region_map_section": "MAPSEC_THREE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKER", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_House2_EventScript_Rocker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_House2_EventScript_Man", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_THREE_ISLAND", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ThreeIsland_House2/scripts.inc ================================================ ThreeIsland_House2_MapScripts:: .byte 0 ThreeIsland_House2_EventScript_Man:: lock faceplayer famechecker FAMECHECKER_SABRINA, 1 msgbox ThreeIsland_House2_Text_IAdmireSabrina release end ThreeIsland_House2_EventScript_Rocker:: msgbox ThreeIsland_House2_Text_CantMakeThisSpoonBend, MSGBOX_NPC end ================================================ FILE: data/maps/ThreeIsland_House2/text.inc ================================================ ThreeIsland_House2_Text_CantMakeThisSpoonBend:: .string "Urrrrrrrrgggghhhh…\n" .string "Kwaaaaah!\p" .string "…It's useless! I can't make this\n" .string "spoon bend with my mind.\p" .string "Maybe I really don't have any\n" .string "psychic powers.$" ThreeIsland_House2_Text_IAdmireSabrina:: .string "You know about a girl GYM LEADER\n" .string "in SAFFRON CITY?\p" .string "She uses PSYCHIC-type POKéMON,\n" .string "right?\p" .string "I admire her, I really do.\p" .string "I've heard that she's one cool\n" .string "customer and beautiful, too.$" ================================================ FILE: data/maps/ThreeIsland_House3/map.json ================================================ { "id": "MAP_THREE_ISLAND_HOUSE3", "name": "ThreeIsland_House3", "layout": "LAYOUT_HOUSE3", "music": "MUS_RUSTBORO", "region_map_section": "MAPSEC_THREE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_House3_EventScript_Beauty", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_THREE_ISLAND", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ThreeIsland_House3/scripts.inc ================================================ ThreeIsland_House3_MapScripts:: .byte 0 ThreeIsland_House3_EventScript_Beauty:: msgbox ThreeIsland_House3_Text_WantedToLiveSomewhereQuiet, MSGBOX_NPC end ================================================ FILE: data/maps/ThreeIsland_House3/text.inc ================================================ ThreeIsland_House3_Text_WantedToLiveSomewhereQuiet:: .string "I bought this house because I\n" .string "wanted to live somewhere quiet.\p" .string "Today, I think I'll go out fishing.$" ================================================ FILE: data/maps/ThreeIsland_House4/map.json ================================================ { "id": "MAP_THREE_ISLAND_HOUSE4", "name": "ThreeIsland_House4", "layout": "LAYOUT_HOUSE3", "music": "MUS_RUSTBORO", "region_map_section": "MAPSEC_THREE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_House4_EventScript_BaldingMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 6, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_House4_EventScript_LittleBoy", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_THREE_ISLAND", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ThreeIsland_House4/scripts.inc ================================================ ThreeIsland_House4_MapScripts:: .byte 0 ThreeIsland_House4_EventScript_BaldingMan:: msgbox ThreeIsland_House4_Text_GhostsInBerryForest, MSGBOX_NPC end ThreeIsland_House4_EventScript_LittleBoy:: msgbox ThreeIsland_House4_Text_PapaKeepsLyingToMe, MSGBOX_NPC end ================================================ FILE: data/maps/ThreeIsland_House4/text.inc ================================================ ThreeIsland_House4_Text_GhostsInBerryForest:: .string "You must never, ever go out to\n" .string "the BERRY FOREST alone.\p" .string "Why?\n" .string "There are ghosts there.$" ThreeIsland_House4_Text_PapaKeepsLyingToMe:: .string "Papa keeps lying to me, and won't\n" .string "let me go out and play!$" ================================================ FILE: data/maps/ThreeIsland_House5/map.json ================================================ { "id": "MAP_THREE_ISLAND_HOUSE5", "name": "ThreeIsland_House5", "layout": "LAYOUT_HOUSE3", "music": "MUS_RUSTBORO", "region_map_section": "MAPSEC_THREE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_House5_EventScript_LittleGirl", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_THREE_ISLAND", "dest_warp_id": "6" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ThreeIsland_House5/scripts.inc ================================================ ThreeIsland_House5_MapScripts:: .byte 0 ThreeIsland_House5_EventScript_LittleGirl:: lock faceplayer goto_if_set FLAG_RESCUED_LOSTELLE, ThreeIsland_House5_EventScript_LittleGirlLostelleFound msgbox ThreeIsland_House5_Text_ImNotLostelle release end ThreeIsland_House5_EventScript_LittleGirlLostelleFound:: msgbox ThreeIsland_House5_Text_IllGoPlayWithLostelle release end ================================================ FILE: data/maps/ThreeIsland_House5/text.inc ================================================ ThreeIsland_House5_Text_ImNotLostelle:: .string "Me?\n" .string "I'm not LOSTELLE.\p" .string "She's probably gone to the\n" .string "BERRY FOREST, I think.\p" .string "She picks BERRIES there for making\n" .string "lunch.$" ThreeIsland_House5_Text_IllGoPlayWithLostelle:: .string "I think I'll go play with LOSTELLE\n" .string "today.$" ================================================ FILE: data/maps/ThreeIsland_Mart/map.json ================================================ { "id": "MAP_THREE_ISLAND_MART", "name": "ThreeIsland_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_THREE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PICNICKER", "in_connection": false, "x": 2, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_Mart_EventScript_Picnicker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_Mart_EventScript_BugCatcher", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 6, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_Mart_EventScript_Youngster", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_THREE_ISLAND", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ThreeIsland_Mart/scripts.inc ================================================ ThreeIsland_Mart_MapScripts:: .byte 0 ThreeIsland_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart ThreeIsland_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 ThreeIsland_Mart_Items:: .2byte ITEM_ULTRA_BALL .2byte ITEM_HYPER_POTION .2byte ITEM_REVIVE .2byte ITEM_FULL_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_MAX_REPEL .2byte ITEM_NONE release end ThreeIsland_Mart_EventScript_Picnicker:: msgbox ThreeIsland_Mart_Text_TrueThatCeldadonDeptStoreBigger, MSGBOX_NPC end ThreeIsland_Mart_EventScript_BugCatcher:: msgbox ThreeIsland_Mart_Text_PeopleHealWithBerriesFromForest, MSGBOX_NPC end ThreeIsland_Mart_EventScript_Youngster:: msgbox ThreeIsland_Mart_Text_BikersWereAboutToTrashMart, MSGBOX_NPC end ================================================ FILE: data/maps/ThreeIsland_Mart/text.inc ================================================ ThreeIsland_Mart_Text_TrueThatCeldadonDeptStoreBigger:: .string "Is it true?\p" .string "CELADON DEPT. STORE is several\n" .string "times bigger than this shop?$" ThreeIsland_Mart_Text_PeopleHealWithBerriesFromForest:: .string "I sometimes buy medicine here.\p" .string "But a lot of people heal POKéMON\n" .string "with BERRIES from BERRY FOREST.\p" .string "After all, BERRIES are free and\n" .string "they never run out.$" ThreeIsland_Mart_Text_BikersWereAboutToTrashMart:: .string "Those BIKERS were about to trash\n" .string "this POKéMON MART.\p" .string "Am I glad they decided to leave!$" ================================================ FILE: data/maps/ThreeIsland_PokemonCenter_1F/map.json ================================================ { "id": "MAP_THREE_ISLAND_POKEMON_CENTER_1F", "name": "ThreeIsland_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_THREE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ROCKER", "in_connection": false, "x": 12, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_PokemonCenter_1F_EventScript_Rocker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 3, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_PokemonCenter_1F_EventScript_Lass", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 11, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_PokemonCenter_1F_EventScript_Sailor", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_THREE_ISLAND", "dest_warp_id": "1" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_THREE_ISLAND_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ThreeIsland_PokemonCenter_1F/scripts.inc ================================================ ThreeIsland_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 ThreeIsland_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_THREE_ISLAND end ThreeIsland_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end ThreeIsland_PokemonCenter_1F_EventScript_Sailor:: msgbox ThreeIsland_PokemonCenter_1F_Text_ImpossibleToSurfBetweenIslands, MSGBOX_NPC end ThreeIsland_PokemonCenter_1F_EventScript_Lass:: msgbox ThreeIsland_PokemonCenter_1F_Text_AlwaysBerriesInBerryForest, MSGBOX_NPC end ThreeIsland_PokemonCenter_1F_EventScript_Rocker:: msgbox ThreeIsland_PokemonCenter_1F_Text_PCNetworkCanLinkWithKanto, MSGBOX_NPC end ================================================ FILE: data/maps/ThreeIsland_PokemonCenter_1F/text.inc ================================================ ThreeIsland_PokemonCenter_1F_Text_PCNetworkCanLinkWithKanto:: .string "Hey, did you hear the news?\p" .string "The PC network here can now link\n" .string "with PCs in KANTO.\p" .string "I don't know how that came about,\n" .string "but it's fantastic!$" ThreeIsland_PokemonCenter_1F_Text_ImpossibleToSurfBetweenIslands:: .string "It's impossible to SURF between the\n" .string "islands around these parts.\p" .string "The tides are too fast and\n" .string "treacherous.$" ThreeIsland_PokemonCenter_1F_Text_AlwaysBerriesInBerryForest:: .string "Let's crush BERRIES!\n" .string "…That'd be wasting BERRIES?\p" .string "You can always find some BERRIES\n" .string "on the ground in BERRY FOREST.$" ================================================ FILE: data/maps/ThreeIsland_PokemonCenter_2F/map.json ================================================ { "id": "MAP_THREE_ISLAND_POKEMON_CENTER_2F", "name": "ThreeIsland_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_THREE_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_THREE_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/ThreeIsland_PokemonCenter_2F/scripts.inc ================================================ ThreeIsland_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS ThreeIsland_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end ThreeIsland_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end ThreeIsland_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/ThreeIsland_Port/map.json ================================================ { "id": "MAP_THREE_ISLAND_PORT", "name": "ThreeIsland_Port", "layout": "LAYOUT_THREE_ISLAND_PORT", "music": "MUS_ROUTE104", "region_map_section": "MAPSEC_THREE_ISLE_PORT", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 0, "map": "MAP_THREE_ISLAND" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 14, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_Port_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 8, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT", "movement_range_x": 3, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_Port_EventScript_Biker1", "flag": "FLAG_HIDE_THREE_ISLAND_BIKERS" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 13, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ThreeIsland_Port_EventScript_Biker2", "flag": "FLAG_HIDE_THREE_ISLAND_BIKERS" } ], "warp_events": [ { "x": 16, "y": 4, "elevation": 0, "dest_map": "MAP_THREE_ISLAND_DUNSPARCE_TUNNEL", "dest_warp_id": "0" }, { "x": 38, "y": 5, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_DUNSPARCE_TUNNEL", "dest_warp_id": "1" }, { "x": 12, "y": 13, "elevation": 3, "dest_map": "MAP_THREE_ISLAND_HARBOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 39, "y": 7, "elevation": 3, "item": "ITEM_TAMATO_BERRY", "flag": "FLAG_HIDDEN_ITEM_THREE_ISLAND_PORT_TAMATO_BERRY", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/ThreeIsland_Port/scripts.inc ================================================ ThreeIsland_Port_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_Port_OnTransition .byte 0 ThreeIsland_Port_OnTransition:: clearflag FLAG_SYS_PC_STORAGE_DISABLED setflag FLAG_SEVII_DETOUR_FINISHED end ThreeIsland_Port_EventScript_Woman:: lock faceplayer goto_if_ge VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 2, ThreeIsland_Port_EventScript_WomanLostelleFound goto_if_ge VAR_MAP_SCENE_THREE_ISLAND, 4, ThreeIsland_Port_EventScript_WomanBikersGone msgbox ThreeIsland_Port_Text_IllCallThePolice release end ThreeIsland_Port_EventScript_WomanLostelleFound:: msgbox ThreeIsland_Port_Text_EverythingTurnedOutForBest release end ThreeIsland_Port_EventScript_WomanBikersGone:: msgbox ThreeIsland_Port_Text_ThankGoodnessBikersGone release end ThreeIsland_Port_EventScript_Biker1:: msgbox ThreeIsland_Port_Text_WereKantoRiderFederation, MSGBOX_NPC end ThreeIsland_Port_EventScript_Biker2:: lock msgbox ThreeIsland_Port_Text_ForkOverMoney release end ================================================ FILE: data/maps/ThreeIsland_Port/text.inc ================================================ ThreeIsland_Port_Text_WereKantoRiderFederation:: .string "We're the KANTO RIDER FEDERATION!\n" .string "Vroom! Vavavavooom! Vroom!\p" .string "My bike's wimpy, so I have to\n" .string "make exhaust noises myself!$" ThreeIsland_Port_Text_ForkOverMoney:: .string "Hey, hey, lady!\n" .string "Fork over some spending money!$" ThreeIsland_Port_Text_IllCallThePolice:: .string "Aiyeeh!\p" .string "Wh-who are you?!\n" .string "I… I'll call the police!$" ThreeIsland_Port_Text_ThankGoodnessBikersGone:: .string "Those BIKERS…\n" .string "Are they gone?\p" .string "Oh, thank goodness!\n" .string "They certainly had me terrified!$" ThreeIsland_Port_Text_EverythingTurnedOutForBest:: .string "Those BIKERS ran off, and\n" .string "LOSTELLE was found safe.\p" .string "Everything turned out for the best!$" ================================================ FILE: data/maps/TradeCenter/map.json ================================================ { "id": "MAP_TRADE_CENTER", "name": "TradeCenter", "layout": "LAYOUT_TRADE_CENTER", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_SPECIAL_AREA", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST", "x": 9, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TradeCenter_EventScript_Attendant", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" }, { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" } ], "coord_events": [ { "type": "trigger", "x": 4, "y": 5, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "TradeCenter_EventScript_Chair0" }, { "type": "trigger", "x": 7, "y": 5, "elevation": 3, "var": "VAR_TEMP_0", "var_value": "0", "script": "TradeCenter_EventScript_Chair1" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TradeCenter/scripts.inc ================================================ TradeCenter_MapScripts:: .byte 0 ================================================ FILE: data/maps/TrainerTower_1F/map.json ================================================ { "id": "MAP_TRAINER_TOWER_1F", "name": "TrainerTower_1F", "layout": "LAYOUT_TRAINER_TOWER_1F", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TRAINER_TOWER_DUDE", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_TEMP_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer1", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_SinglesTrainer", "flag": "FLAG_TEMP_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_KnockoutTrainer", "flag": "FLAG_TEMP_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer2", "flag": "FLAG_TEMP_5" } ], "warp_events": [ { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_2F", "dest_warp_id": "1" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_LOBBY", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 13, "elevation": 3, "var": "VAR_TEMP_E", "var_value": "0", "script": "TrainerTower_EventScript_SingleBattleTrigger" }, { "type": "trigger", "x": 9, "y": 12, "elevation": 0, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerTop" }, { "type": "trigger", "x": 9, "y": 13, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerBottom" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_1F/scripts.inc ================================================ TrainerTower_1F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 @ All Trainer Tower floors/roof share these scripts for their object events TrainerTower_EventScript_DoublesTrainer1:: call TrainerTower_EventScript_SpeakToDoublesTrainer1 end TrainerTower_EventScript_SinglesTrainer:: call TrainerTower_EventScript_SpeakToSinglesTrainer end TrainerTower_EventScript_KnockoutTrainer:: call TrainerTower_EventScript_SpeakToKnockoutTrainer end TrainerTower_EventScript_DoublesTrainer2:: call TrainerTower_EventScript_SpeakToDoublesTrainer2 end TrainerTower_EventScript_Owner:: call TrainerTower_EventScript_SpeakToOwner end ================================================ FILE: data/maps/TrainerTower_2F/map.json ================================================ { "id": "MAP_TRAINER_TOWER_2F", "name": "TrainerTower_2F", "layout": "LAYOUT_TRAINER_TOWER_2F", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TRAINER_TOWER_DUDE", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_Owner", "flag": "FLAG_TEMP_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer1", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_SinglesTrainer", "flag": "FLAG_TEMP_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_KnockoutTrainer", "flag": "FLAG_TEMP_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer2", "flag": "FLAG_TEMP_5" } ], "warp_events": [ { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_3F", "dest_warp_id": "1" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_1F", "dest_warp_id": "0" }, { "x": 13, "y": 5, "elevation": 0, "dest_map": "MAP_TRAINER_TOWER_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 13, "elevation": 3, "var": "VAR_TEMP_E", "var_value": "0", "script": "TrainerTower_EventScript_SingleBattleTrigger" }, { "type": "trigger", "x": 9, "y": 12, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerTop" }, { "type": "trigger", "x": 9, "y": 13, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerBottom" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_2F/scripts.inc ================================================ TrainerTower_2F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 @ Below scripts are unused, the identical versions in the 1F script are used instead TrainerTower_2F_EventScript_DoublesTrainer1:: call TrainerTower_EventScript_SpeakToDoublesTrainer1 end TrainerTower_2F_EventScript_SinglesTrainer:: call TrainerTower_EventScript_SpeakToSinglesTrainer end TrainerTower_2F_EventScript_KnockoutTrainer:: call TrainerTower_EventScript_SpeakToKnockoutTrainer end TrainerTower_2F_EventScript_DoublesTrainer2:: call TrainerTower_EventScript_SpeakToDoublesTrainer2 end TrainerTower_2F_EventScript_Owner:: call TrainerTower_EventScript_SpeakToOwner end ================================================ FILE: data/maps/TrainerTower_3F/map.json ================================================ { "id": "MAP_TRAINER_TOWER_3F", "name": "TrainerTower_3F", "layout": "LAYOUT_TRAINER_TOWER_3F", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TRAINER_TOWER_DUDE", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_Owner", "flag": "FLAG_TEMP_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer1", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_SinglesTrainer", "flag": "FLAG_TEMP_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_KnockoutTrainer", "flag": "FLAG_TEMP_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer2", "flag": "FLAG_TEMP_5" } ], "warp_events": [ { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_4F", "dest_warp_id": "1" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_2F", "dest_warp_id": "0" }, { "x": 13, "y": 5, "elevation": 0, "dest_map": "MAP_TRAINER_TOWER_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 13, "elevation": 3, "var": "VAR_TEMP_E", "var_value": "0", "script": "TrainerTower_EventScript_SingleBattleTrigger" }, { "type": "trigger", "x": 9, "y": 12, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerTop" }, { "type": "trigger", "x": 9, "y": 13, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerBottom" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_3F/scripts.inc ================================================ TrainerTower_3F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 @ Below scripts are unused, the identical versions in the 1F script are used instead TrainerTower_3F_EventScript_DoublesTrainer1:: call TrainerTower_EventScript_SpeakToDoublesTrainer1 end TrainerTower_3F_EventScript_SinglesTrainer:: call TrainerTower_EventScript_SpeakToSinglesTrainer end TrainerTower_3F_EventScript_KnockoutTrainer:: call TrainerTower_EventScript_SpeakToKnockoutTrainer end TrainerTower_3F_EventScript_DoublesTrainer2:: call TrainerTower_EventScript_SpeakToDoublesTrainer2 end TrainerTower_3F_EventScript_Owner:: call TrainerTower_EventScript_SpeakToOwner end ================================================ FILE: data/maps/TrainerTower_4F/map.json ================================================ { "id": "MAP_TRAINER_TOWER_4F", "name": "TrainerTower_4F", "layout": "LAYOUT_TRAINER_TOWER_4F", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TRAINER_TOWER_DUDE", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_Owner", "flag": "FLAG_TEMP_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer1", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_SinglesTrainer", "flag": "FLAG_TEMP_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_KnockoutTrainer", "flag": "FLAG_TEMP_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer2", "flag": "FLAG_TEMP_5" } ], "warp_events": [ { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_5F", "dest_warp_id": "1" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_3F", "dest_warp_id": "0" }, { "x": 13, "y": 5, "elevation": 0, "dest_map": "MAP_TRAINER_TOWER_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 13, "elevation": 3, "var": "VAR_TEMP_E", "var_value": "0", "script": "TrainerTower_EventScript_SingleBattleTrigger" }, { "type": "trigger", "x": 9, "y": 12, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerTop" }, { "type": "trigger", "x": 9, "y": 13, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerBottom" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_4F/scripts.inc ================================================ TrainerTower_4F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 @ Below scripts are unused, the identical versions in the 1F script are used instead TrainerTower_4F_EventScript_DoublesTrainer1:: call TrainerTower_EventScript_SpeakToDoublesTrainer1 end TrainerTower_4F_EventScript_SinglesTrainer:: call TrainerTower_EventScript_SpeakToSinglesTrainer end TrainerTower_4F_EventScript_KnockoutTrainer:: call TrainerTower_EventScript_SpeakToKnockoutTrainer end TrainerTower_4F_EventScript_DoublesTrainer2:: call TrainerTower_EventScript_SpeakToDoublesTrainer2 end TrainerTower_4F_EventScript_Owner:: call TrainerTower_EventScript_SpeakToOwner end ================================================ FILE: data/maps/TrainerTower_5F/map.json ================================================ { "id": "MAP_TRAINER_TOWER_5F", "name": "TrainerTower_5F", "layout": "LAYOUT_TRAINER_TOWER_5F", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TRAINER_TOWER_DUDE", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_Owner", "flag": "FLAG_TEMP_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer1", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_SinglesTrainer", "flag": "FLAG_TEMP_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_KnockoutTrainer", "flag": "FLAG_TEMP_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer2", "flag": "FLAG_TEMP_5" } ], "warp_events": [ { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_6F", "dest_warp_id": "1" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_4F", "dest_warp_id": "0" }, { "x": 13, "y": 5, "elevation": 0, "dest_map": "MAP_TRAINER_TOWER_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 13, "elevation": 3, "var": "VAR_TEMP_E", "var_value": "0", "script": "TrainerTower_EventScript_SingleBattleTrigger" }, { "type": "trigger", "x": 9, "y": 12, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerTop" }, { "type": "trigger", "x": 9, "y": 13, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerBottom" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_5F/scripts.inc ================================================ TrainerTower_5F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 @ Below scripts are unused, the identical versions in the 1F script are used instead TrainerTower_5F_EventScript_DoublesTrainer1:: call TrainerTower_EventScript_SpeakToDoublesTrainer1 end TrainerTower_5F_EventScript_SinglesTrainer:: call TrainerTower_EventScript_SpeakToSinglesTrainer end TrainerTower_5F_EventScript_KnockoutTrainer:: call TrainerTower_EventScript_SpeakToKnockoutTrainer end TrainerTower_5F_EventScript_DoublesTrainer2:: call TrainerTower_EventScript_SpeakToDoublesTrainer2 end TrainerTower_5F_EventScript_Owner:: call TrainerTower_EventScript_SpeakToOwner end ================================================ FILE: data/maps/TrainerTower_6F/map.json ================================================ { "id": "MAP_TRAINER_TOWER_6F", "name": "TrainerTower_6F", "layout": "LAYOUT_TRAINER_TOWER_6F", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TRAINER_TOWER_DUDE", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_Owner", "flag": "FLAG_TEMP_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer1", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_SinglesTrainer", "flag": "FLAG_TEMP_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_KnockoutTrainer", "flag": "FLAG_TEMP_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer2", "flag": "FLAG_TEMP_5" } ], "warp_events": [ { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_7F", "dest_warp_id": "1" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_5F", "dest_warp_id": "0" }, { "x": 13, "y": 5, "elevation": 0, "dest_map": "MAP_TRAINER_TOWER_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 13, "elevation": 3, "var": "VAR_TEMP_E", "var_value": "0", "script": "TrainerTower_EventScript_SingleBattleTrigger" }, { "type": "trigger", "x": 9, "y": 12, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerTop" }, { "type": "trigger", "x": 9, "y": 13, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerBottom" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_6F/scripts.inc ================================================ TrainerTower_6F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 @ Below scripts are unused, the identical versions in the 1F script are used instead TrainerTower_6F_EventScript_DoublesTrainer1:: call TrainerTower_EventScript_SpeakToDoublesTrainer1 end TrainerTower_6F_EventScript_SinglesTrainer:: call TrainerTower_EventScript_SpeakToSinglesTrainer end TrainerTower_6F_EventScript_KnockoutTrainer:: call TrainerTower_EventScript_SpeakToKnockoutTrainer end TrainerTower_6F_EventScript_DoublesTrainer2:: call TrainerTower_EventScript_SpeakToDoublesTrainer2 end TrainerTower_6F_EventScript_Owner:: call TrainerTower_EventScript_SpeakToOwner end ================================================ FILE: data/maps/TrainerTower_7F/map.json ================================================ { "id": "MAP_TRAINER_TOWER_7F", "name": "TrainerTower_7F", "layout": "LAYOUT_TRAINER_TOWER_7F", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TRAINER_TOWER_DUDE", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_Owner", "flag": "FLAG_TEMP_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer1", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_SinglesTrainer", "flag": "FLAG_TEMP_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_KnockoutTrainer", "flag": "FLAG_TEMP_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer2", "flag": "FLAG_TEMP_5" } ], "warp_events": [ { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_8F", "dest_warp_id": "1" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_6F", "dest_warp_id": "0" }, { "x": 13, "y": 5, "elevation": 0, "dest_map": "MAP_TRAINER_TOWER_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 13, "elevation": 3, "var": "VAR_TEMP_E", "var_value": "0", "script": "TrainerTower_EventScript_SingleBattleTrigger" }, { "type": "trigger", "x": 9, "y": 12, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerTop" }, { "type": "trigger", "x": 9, "y": 13, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerBottom" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_7F/scripts.inc ================================================ TrainerTower_7F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 @ Below scripts are unused, the identical versions in the 1F script are used instead TrainerTower_7F_EventScript_DoublesTrainer1:: call TrainerTower_EventScript_SpeakToDoublesTrainer1 end TrainerTower_7F_EventScript_SinglesTrainer:: call TrainerTower_EventScript_SpeakToSinglesTrainer end TrainerTower_7F_EventScript_KnockoutTrainer:: call TrainerTower_EventScript_SpeakToKnockoutTrainer end TrainerTower_7F_EventScript_DoublesTrainer2:: call TrainerTower_EventScript_SpeakToDoublesTrainer2 end TrainerTower_7F_EventScript_Owner:: call TrainerTower_EventScript_SpeakToOwner end ================================================ FILE: data/maps/TrainerTower_8F/map.json ================================================ { "id": "MAP_TRAINER_TOWER_8F", "name": "TrainerTower_8F", "layout": "LAYOUT_TRAINER_TOWER_8F", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TRAINER_TOWER_DUDE", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_Owner", "flag": "FLAG_TEMP_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer1", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 15, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_SinglesTrainer", "flag": "FLAG_TEMP_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_KnockoutTrainer", "flag": "FLAG_TEMP_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 11, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_DoublesTrainer2", "flag": "FLAG_TEMP_5" } ], "warp_events": [ { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_ROOF", "dest_warp_id": "1" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_7F", "dest_warp_id": "0" }, { "x": 13, "y": 5, "elevation": 0, "dest_map": "MAP_TRAINER_TOWER_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 10, "y": 13, "elevation": 3, "var": "VAR_TEMP_E", "var_value": "0", "script": "TrainerTower_EventScript_SingleBattleTrigger" }, { "type": "trigger", "x": 9, "y": 12, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerTop" }, { "type": "trigger", "x": 9, "y": 13, "elevation": 3, "var": "VAR_TEMP_F", "var_value": "0", "script": "TrainerTower_EventScript_DoubleBattleTriggerBottom" } ], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_8F/scripts.inc ================================================ TrainerTower_8F_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 @ Below scripts are unused, the identical versions in the 1F script are used instead TrainerTower_8F_EventScript_DoublesTrainer1:: call TrainerTower_EventScript_SpeakToDoublesTrainer1 end TrainerTower_8F_EventScript_SinglesTrainer:: call TrainerTower_EventScript_SpeakToSinglesTrainer end TrainerTower_8F_EventScript_KnockoutTrainer:: call TrainerTower_EventScript_SpeakToKnockoutTrainer end TrainerTower_8F_EventScript_DoublesTrainer2:: call TrainerTower_EventScript_SpeakToDoublesTrainer2 end TrainerTower_8F_EventScript_Owner:: call TrainerTower_EventScript_SpeakToOwner end ================================================ FILE: data/maps/TrainerTower_Elevator/map.json ================================================ { "id": "MAP_TRAINER_TOWER_ELEVATOR", "name": "TrainerTower_Elevator", "layout": "LAYOUT_TRAINER_TOWER_ELEVATOR", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [], "warp_events": [ { "x": 2, "y": 5, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 0, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "TrainerTower_Elevator_EventScript_FloorSelect" } ], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_Elevator/scripts.inc ================================================ TrainerTower_Elevator_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 TrainerTower_Elevator_EventScript_FloorSelect:: lockall setvar VAR_0x8004, 6 call_if_unset FLAG_TEMP_2, EventScript_GetElevatorFloor copyvar VAR_0x8005, VAR_ELEVATOR_FLOOR special DrawElevatorCurrentFloorWindow message Text_WantWhichFloor waitmessage setvar VAR_0x8004, 6 specialvar VAR_RESULT, InitElevatorFloorSelectMenuPos switch VAR_RESULT case 0, TrainerTower_Elevator_EventScript_FloorSelectFromRoof case 1, TrainerTower_Elevator_EventScript_FloorSelectFromLobby end TrainerTower_Elevator_EventScript_FloorSelectFromRoof:: multichoicedefault 0, 0, MULTICHOICE_ROOFTOP_B1F, 0, FALSE goto TrainerTower_Elevator_EventScript_ChooseFloor end TrainerTower_Elevator_EventScript_FloorSelectFromLobby:: multichoicedefault 0, 0, MULTICHOICE_ROOFTOP_B1F, 1, FALSE goto TrainerTower_Elevator_EventScript_ChooseFloor end TrainerTower_Elevator_EventScript_ChooseFloor:: switch VAR_RESULT case 0, TrainerTower_Elevator_EventScript_SelectRoof case 1, TrainerTower_Elevator_EventScript_SelectLobby case 2, TrainerTower_Elevator_EventScript_CloseFloorSelect case SCR_MENU_CANCEL, TrainerTower_Elevator_EventScript_CloseFloorSelect end TrainerTower_Elevator_EventScript_SelectLobby:: setvar VAR_0x8006, 3 setdynamicwarp MAP_TRAINER_TOWER_LOBBY, 17, 8 goto_if_eq VAR_ELEVATOR_FLOOR, 3, TrainerTower_Elevator_EventScript_CloseFloorSelect call TrainerTower_Elevator_EventScript_MoveElevator setvar VAR_ELEVATOR_FLOOR, 3 special CloseElevatorCurrentFloorWindow delay 25 applymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Elevator_Movement_ExitElevator waitmovement 0 warp MAP_TRAINER_TOWER_LOBBY, 17, 8 waitstate releaseall end TrainerTower_Elevator_EventScript_SelectRoof:: goto TrainerTower_Elevator_EventScript_CloseFloorSelect end TrainerTower_Elevator_EventScript_CloseFloorSelect:: special CloseElevatorCurrentFloorWindow releaseall end TrainerTower_Elevator_EventScript_MoveElevator:: special CloseElevatorCurrentFloorWindow closemessage waitse special AnimateElevator waitstate setflag FLAG_TEMP_2 return TrainerTower_Elevator_Movement_ExitElevator:: walk_in_place_faster_down delay_16 walk_down walk_right walk_right walk_down step_end ================================================ FILE: data/maps/TrainerTower_Lobby/map.json ================================================ { "id": "MAP_TRAINER_TOWER_LOBBY", "name": "TrainerTower_Lobby", "layout": "LAYOUT_TRAINER_TOWER_LOBBY", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 4, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_Lobby_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST", "x": 14, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_Lobby_EventScript_MartClerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST", "x": 11, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_Lobby_EventScript_Receptionist", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "x": 12, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_Lobby_EventScript_CooltrainerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 2, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_Lobby_EventScript_BaldingMan", "flag": "0" } ], "warp_events": [ { "x": 9, "y": 2, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_1F", "dest_warp_id": "1" }, { "x": 9, "y": 15, "elevation": 3, "dest_map": "MAP_SEVEN_ISLAND_TRAINER_TOWER", "dest_warp_id": "0" }, { "x": 17, "y": 8, "elevation": 0, "dest_map": "MAP_TRAINER_TOWER_ELEVATOR", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 9, "y": 7, "elevation": 3, "var": "VAR_MAP_SCENE_TRAINER_TOWER", "var_value": "0", "script": "TrainerTower_Lobby_EventScript_EntryTrigger" } ], "bg_events": [ { "type": "sign", "x": 8, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "TrainerTower_Lobby_EventScript_ShowRecords" } ], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_Lobby/scripts.inc ================================================ .set LOCALID_NURSE, 1 .set LOCALID_MART_CLERK, 2 .set LOCALID_RECEPTIONIST, 3 .set LOCALID_COOLTRAINER_F, 4 .set LOCALID_BALDING_MAN, 5 TrainerTower_Lobby_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_Lobby_OnResume map_script MAP_SCRIPT_ON_RETURN_TO_FIELD, TrainerTower_Lobby_OnReturnToField map_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_Lobby_OnTransition map_script MAP_SCRIPT_ON_LOAD, TrainerTower_Lobby_OnLoad map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_Lobby_OnFrame .byte 0 TrainerTower_Lobby_OnResume:: setvar VAR_TEMP_2, 0 ttower_resumetimer ttower_shouldexit goto_if_eq VAR_RESULT, FALSE, TrainerTower_Lobby_OnResumeEnd @ Never reached, above always FALSE setvar VAR_TEMP_0, 0 setobjectxy OBJ_EVENT_ID_PLAYER, 9, 7 applymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_FaceReceptionist TrainerTower_Lobby_OnResumeEnd:: end TrainerTower_Lobby_OnReturnToField:: addobject LOCALID_NURSE addobject LOCALID_MART_CLERK addobject LOCALID_RECEPTIONIST addobject LOCALID_COOLTRAINER_F addobject LOCALID_BALDING_MAN end TrainerTower_Lobby_OnLoad:: call_if_eq VAR_TEMP_D, 17, TrainerTower_Lobby_OpenCounterBarrier end TrainerTower_Lobby_OpenCounterBarrier:: setmetatile 17, 10, METATILE_TrainerTower_Floor_ShadeBottomLeft, 0 return TrainerTower_Lobby_OnTransition:: setworldmapflag FLAG_WORLD_MAP_TRAINER_TOWER_LOBBY getplayerxy VAR_TEMP_D, VAR_RESULT end TrainerTower_Lobby_OnFrame:: map_script_2 VAR_TEMP_0, 0, TrainerTower_Lobby_EventScript_Enter map_script_2 VAR_TEMP_D, 17, TrainerTower_Lobby_EventScript_ExitElevator .2byte 0 TrainerTower_Lobby_EventScript_ExitElevator:: lockall applymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_ExitElevator waitmovement 0 setmetatile 17, 10, METATILE_TrainerTower_CounterBarrier, 1 special DrawWholeMapView playse SE_CLICK waitse setvar VAR_TEMP_D, 0 releaseall end TrainerTower_Lobby_Movement_ExitElevator:: walk_down walk_down step_end TrainerTower_Lobby_EventScript_Enter:: setvar VAR_TEMP_0, 1 ttower_getchallengestatus switch VAR_RESULT case CHALLENGE_STATUS_LOST, TrainerTower_Lobby_EventScript_LostChallenge case CHALLENGE_STATUS_UNK, TrainerTower_Lobby_EventScript_ExitChallengeSpeakToReceptionist case CHALLENGE_STATUS_NORMAL, TrainerTower_Lobby_EventScript_EnterEnd TrainerTower_Lobby_EventScript_LostChallenge:: lock faceplayer applymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_FaceReceptionist textcolor NPC_TEXT_COLOR_FEMALE msgbox TrainerTower_Lobby_Text_TooBadComeBackTryAgain goto TrainerTower_Lobby_EventScript_ExitChallenge @ Presumably E-Reader related TrainerTower_Lobby_EventScript_ExitChallengeSpeakToReceptionist:: lock faceplayer applymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_FaceReceptionist textcolor NPC_TEXT_COLOR_FEMALE msgbox TrainerTower_Lobby_Text_MoveCounterHereWhenTrainersSwitch TrainerTower_Lobby_EventScript_ExitChallenge:: closemessage applymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_WalkDown waitmovement 0 setvar VAR_MAP_SCENE_TRAINER_TOWER, 0 release TrainerTower_Lobby_EventScript_EnterEnd:: end TrainerTower_Lobby_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end TrainerTower_Lobby_EventScript_Receptionist:: lock faceplayer ttower_getbeatchallenge goto_if_eq VAR_RESULT, TRUE, TrainerTower_Lobby_EventScript_ThanksForCompeting msgbox TrainerTower_Lobby_Text_GiveItYourBest goto TrainerTower_Lobby_EventScript_ReceptionistEnd TrainerTower_Lobby_EventScript_ThanksForCompeting:: msgbox TrainerTower_Lobby_Text_ThanksForCompeting TrainerTower_Lobby_EventScript_ReceptionistEnd:: release end TrainerTower_Lobby_EventScript_MartClerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart TrainerTower_Lobby_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 TrainerTower_Lobby_Mart_Items:: .2byte ITEM_ULTRA_BALL .2byte ITEM_GREAT_BALL .2byte ITEM_FULL_RESTORE .2byte ITEM_MAX_POTION .2byte ITEM_HYPER_POTION .2byte ITEM_REVIVE .2byte ITEM_FULL_HEAL .2byte ITEM_ESCAPE_ROPE .2byte ITEM_MAX_REPEL .2byte ITEM_NONE release end TrainerTower_Lobby_EventScript_CantEnterInNuzlockeMode: callnative CheckNoFreeHealsMode goto_if_eq VAR_RESULT, TRUE, TrainerTower_Lobby_EventScript_CantEnterInBothModes signmsg textcolor NPC_TEXT_COLOR_NEUTRAL msgbox TrainerTower_Lobby_Text_CantEnterInNuzlockeMode call EventScript_RestorePrevTextColor normalmsg goto TrainerTower_Lobby_EventScript_DeclineChallenge TrainerTower_Lobby_Text_CantEnterInNuzlockeMode: .string "The TRAINER TOWER cannot be\n" .string "entered in NUZLOCKE MODE.$" TrainerTower_Lobby_EventScript_CantEnterInBothModes: signmsg textcolor NPC_TEXT_COLOR_NEUTRAL msgbox TrainerTower_Lobby_Text_CantEnterInBothModes call EventScript_RestorePrevTextColor normalmsg goto TrainerTower_Lobby_EventScript_DeclineChallenge TrainerTower_Lobby_Text_CantEnterInBothModes: .string "The TRAINER TOWER cannot be\n" .string "entered in the NUZLOCKE or\l" .string "NO FREE HEALS MODES.$" TrainerTower_Lobby_EventScript_CantEnterInNoFreeHealsMode: signmsg textcolor NPC_TEXT_COLOR_NEUTRAL msgbox TrainerTower_Lobby_Text_CantEnterInNoFreeHealsMode call EventScript_RestorePrevTextColor normalmsg goto TrainerTower_Lobby_EventScript_DeclineChallenge TrainerTower_Lobby_Text_CantEnterInNoFreeHealsMode: .string "The TRAINER TOWER cannot be\n" .string "entered in NO FREE HEALS MODE.$" TrainerTower_Lobby_EventScript_EntryTrigger:: lockall applymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_FaceReceptionist textcolor NPC_TEXT_COLOR_FEMALE msgbox TrainerTower_Lobby_Text_WelcomeToTrainerTower callnative CheckNuzlockeMode goto_if_eq VAR_RESULT, TRUE, TrainerTower_Lobby_EventScript_CantEnterInNuzlockeMode callnative CheckNoFreeHealsMode goto_if_eq VAR_RESULT, TRUE, TrainerTower_Lobby_EventScript_CantEnterInNoFreeHealsMode ttower_getnumfloors goto_if_eq VAR_RESULT, FALSE, TrainerTower_Lobby_EventScript_AllFloorsUsed msgbox TrainerTower_Lobby_Text_TrainersUpToFloorNum goto TrainerTower_Lobby_EventScript_AskEnterChallenge TrainerTower_Lobby_EventScript_AllFloorsUsed:: msgbox TrainerTower_Lobby_Text_TrainersUpEighthFloor TrainerTower_Lobby_EventScript_AskEnterChallenge:: message TrainerTower_Lobby_Text_LikeToChallengeTrainers waitmessage multichoice 18, 6, MULTICHOICE_YES_NO_INFO, FALSE switch VAR_RESULT case 0, TrainerTower_Lobby_EventScript_ChooseChallenge case 1, TrainerTower_Lobby_EventScript_DeclineChallenge case 2, TrainerTower_Lobby_EventScript_ChallengeInfo case SCR_MENU_CANCEL, TrainerTower_Lobby_EventScript_DeclineChallenge end TrainerTower_Lobby_EventScript_ChallengeInfo:: msgbox TrainerTower_Lobby_Text_ExplainTrainerTower goto TrainerTower_Lobby_EventScript_AskEnterChallenge end TrainerTower_Lobby_EventScript_ChooseChallenge:: multichoice 13, 3, MULTICHOICE_TRAINER_TOWER_MODE, FALSE switch VAR_RESULT case 0, TrainerTower_Lobby_EventScript_BeginChallenge case 1, TrainerTower_Lobby_EventScript_BeginChallenge case 2, TrainerTower_Lobby_EventScript_BeginChallenge case 3, TrainerTower_Lobby_EventScript_BeginChallenge case 4, TrainerTower_Lobby_EventScript_DeclineChallenge case SCR_MENU_CANCEL, TrainerTower_Lobby_EventScript_DeclineChallenge end TrainerTower_Lobby_EventScript_BeginChallenge:: copyvar VAR_0x8005, VAR_RESULT setvar VAR_MAP_SCENE_TRAINER_TOWER, 1 special HealPlayerParty msgbox TrainerTower_Lobby_Text_StartClockGetSetGo ttower_startchallenge releaseall end TrainerTower_Lobby_EventScript_DeclineChallenge:: msgbox TrainerTower_Lobby_Text_PleaseVisitUsAgain closemessage applymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_WalkDown waitmovement 0 releaseall end TrainerTower_Lobby_Movement_FaceReceptionist:: face_right step_end TrainerTower_Lobby_Movement_WalkDown:: walk_down step_end TrainerTower_Lobby_EventScript_ShowRecords:: lockall fadescreen FADE_TO_BLACK setvar VAR_0x8004, 1 special ShowBattleRecords waitstate releaseall end TrainerTower_Lobby_EventScript_CooltrainerF:: msgbox TrainerTower_Lobby_Text_WonderWhatKindsOfTrainers, MSGBOX_NPC end TrainerTower_Lobby_EventScript_BaldingMan:: msgbox TrainerTower_Lobby_Text_StairsTougherThanAnyBattle, MSGBOX_NPC end ================================================ FILE: data/maps/TrainerTower_Lobby/text.inc ================================================ @ All Trainer Tower text (Lobby and Roof) is interleaved here TrainerTower_Lobby_Text_WelcomeToTrainerTower:: .string "Hello!\p" .string "Welcome to TRAINER TOWER where\n" .string "TRAINERS gather from all over!$" TrainerTower_Lobby_Text_TrainersUpToFloorNum:: .string "TRAINERS from all over the world\n" .string "gather here to battle.\p" .string "Let me see…\p" .string "Right now, there are TRAINERS only\n" .string "up to Floor {STR_VAR_1}.$" TrainerTower_Lobby_Text_TrainersUpEighthFloor:: .string "TRAINERS are awaiting your\n" .string "challenge up to the eighth floor.$" TrainerTower_Lobby_Text_LikeToChallengeTrainers:: .string "Would you like to challenge the\n" .string "waiting TRAINERS?$" TrainerTower_Lobby_Text_StartClockGetSetGo:: .string "Okay, I'll get the clock started,\n" .string "so give it everything you have.\p" .string "On your marks…\p" .string "Get set…\p" .string "Go!$" TrainerTower_Lobby_Text_PleaseVisitUsAgain:: .string "Please do visit us again!$" TrainerTower_Lobby_Text_TooBadComeBackTryAgain:: .string "That was too bad.\p" .string "I think you put in a tremendous\n" .string "effort in your battling.\p" .string "Please come back and try again!$" TrainerTower_Lobby_Text_GiveItYourBest:: .string "I hope you give it your best.$" TrainerTower_Lobby_Text_MoveCounterHereWhenTrainersSwitch:: .string "When the TRAINERS switch places,\n" .string "the movement can be hectic.\p" .string "To avoid the stampede, we moved\n" .string "the reception counter here.\p" .string "I'm sorry for the inconvenience.$" TrainerTower_Roof_Text_ImOwnerBattledPerfectly:: .string "Hello…\p" .string "I am the owner of this TOWER…\p" .string "How the sky soars above this\n" .string "rooftop…\p" .string "The caress of the winds up here…\p" .string "It's all so perfect…\p" .string "The way you battled…\n" .string "It, too, was perfection…$" TrainerTower_Roof_Text_ThisIsForYou:: .string "This is for you…$" TrainerTower_Roof_Text_DoneItInRecordTime:: .string "Oh!\n" .string "Stupendous!\p" .string "It's marvelous how you've come up\n" .string "here so quickly.\p" .string "The fact is, you've done it in\n" .string "record time…\p" .string "I'll have your record posted at\n" .string "the reception counter.$" TrainerTower_Roof_Text_TookSweetTimeGettingHere:: .string "You seem to have taken your sweet\n" .string "time getting here…$" TrainerTower_Roof_Text_IdLikeToSeeBetterTime:: .string "What I would like to see is a\n" .string "better time out of you…\p" .string "I'm counting on you.\p" .string "Until then, farewell…$" TrainerTower_Text_XMinYZSec:: .string "{STR_VAR_1} min. {STR_VAR_2}.{STR_VAR_3} sec.$" TrainerTower_Lobby_Text_NeedTwoMonsForDouble:: .string "This is a two-on-two battle.\p" .string "You may not battle unless you have\n" .string "at least two POKéMON.$" TrainerTower_Lobby_Text_ExplainTrainerTower:: .string "Here at TRAINER TOWER, there is an\n" .string "event called TIME ATTACK.\p" .string "You will be timed on how quickly\n" .string "you can get from the reception\l" .string "counter to the OWNER on the roof.\p" .string "The best times will be recorded on\n" .string "the Time Board.\p" .string "Try competing with friends to see\n" .string "who can beat it the fastest.\p" .string "You will not earn any EXP. Points\n" .string "or money by beating TRAINERS here.$" TrainerTower_Lobby_Text_ThanksForCompeting:: .string "Thank you for competing!$" TrainerTower_Lobby_Text_WonderWhatKindsOfTrainers:: .string "I'm here to see how good I am.\p" .string "I wonder what kinds of TRAINERS\n" .string "are waiting for me?\p" .string "It's nerve-racking!$" TrainerTower_Lobby_Text_StairsTougherThanAnyBattle:: .string "Gasp, gasp…\n" .string "Gasp…\p" .string "Never mind battling! These stairs…\n" .string "They're tougher than any battle…$" ================================================ FILE: data/maps/TrainerTower_Roof/map.json ================================================ { "id": "MAP_TRAINER_TOWER_ROOF", "name": "TrainerTower_Roof", "layout": "LAYOUT_TRAINER_TOWER_ROOF", "music": "MUS_TRAINER_TOWER", "region_map_section": "MAPSEC_TRAINER_TOWER_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TRAINER_TOWER_DUDE", "x": 9, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TrainerTower_EventScript_Owner", "flag": "FLAG_TEMP_6" } ], "warp_events": [ { "x": 13, "y": 5, "elevation": 0, "dest_map": "MAP_TRAINER_TOWER_ELEVATOR", "dest_warp_id": "0" }, { "x": 4, "y": 6, "elevation": 3, "dest_map": "MAP_TRAINER_TOWER_8F", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TrainerTower_Roof/scripts.inc ================================================ TrainerTower_Roof_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame .byte 0 @ Below script is unused, the identical version in the 1F script is used instead TrainerTower_Roof_EventScript_Owner:: call TrainerTower_EventScript_SpeakToOwner end ================================================ FILE: data/maps/TwoIsland/map.json ================================================ { "id": "MAP_TWO_ISLAND", "name": "TwoIsland", "layout": "LAYOUT_TWO_ISLAND", "music": "MUS_FORTREE", "region_map_section": "MAPSEC_TWO_ISLAND", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": -3, "map": "MAP_TWO_ISLAND_CAPE_BRINK" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 28, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 31, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_EventScript_Woman", "flag": "FLAG_HIDE_TWO_ISLAND_WOMAN" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "in_connection": false, "x": 30, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_EventScript_Beauty", "flag": "FLAG_HIDE_TWO_ISLAND_BEAUTY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 26, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_EventScript_Sailor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SUPER_NERD", "in_connection": false, "x": 27, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_EventScript_SuperNerd", "flag": "FLAG_HIDE_TWO_ISLAND_SUPER_NERD" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 30, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_TWO_ISLAND_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 39, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_EventScript_ItemRevive", "flag": "FLAG_HIDE_TWO_ISLAND_REVIVE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 37, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_EventScript_LittleBoy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 24, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_EventScript_Boy", "flag": "0" } ], "warp_events": [ { "x": 39, "y": 9, "elevation": 0, "dest_map": "MAP_TWO_ISLAND_JOYFUL_GAME_CORNER", "dest_warp_id": "0" }, { "x": 33, "y": 9, "elevation": 0, "dest_map": "MAP_TWO_ISLAND_HOUSE", "dest_warp_id": "0" }, { "x": 21, "y": 7, "elevation": 0, "dest_map": "MAP_TWO_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "0" }, { "x": 10, "y": 8, "elevation": 3, "dest_map": "MAP_TWO_ISLAND_HARBOR", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 29, "y": 8, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "TwoIsland_EventScript_IslandSign" }, { "type": "sign", "x": 40, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "TwoIsland_EventScript_JoyfulGameCornerSign" }, { "type": "sign", "x": 8, "y": 3, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "TwoIsland_EventScript_FastCurrentSign" } ], "level_scaling": "4" } ================================================ FILE: data/maps/TwoIsland/scripts.inc ================================================ TwoIsland_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, TwoIsland_OnTransition .byte 0 TwoIsland_OnTransition:: setworldmapflag FLAG_WORLD_MAP_TWO_ISLAND setflag FLAG_VISITED_TWO_ISLAND call TwoIsland_EventScript_SetShopState end TwoIsland_EventScript_SetShopState:: goto_if_set FLAG_SYS_CAN_LINK_WITH_RS, TwoIsland_EventScript_SetShopStateAfterHoennLink goto_if_set FLAG_SYS_GAME_CLEAR, TwoIsland_EventScript_SetShopStateAfterChampion goto_if_set FLAG_RESCUED_LOSTELLE, TwoIsland_EventScript_SetShopStateAfterLostelleRescue goto TwoIsland_EventScript_SetShopStateDefault end TwoIsland_EventScript_SetShopStateAfterHoennLink:: goto_if_unset FLAG_TWO_ISLAND_SHOP_INTRODUCED, TwoIsland_EventScript_SetShopInitial goto_if_unset FLAG_TWO_ISLAND_SHOP_EXPANDED_1, TwoIsland_EventScript_SetShopExpanded1 goto_if_unset FLAG_TWO_ISLAND_SHOP_EXPANDED_2, TwoIsland_EventScript_SetShopExpanded2 goto TwoIsland_EventScript_SetShopExpanded3 end TwoIsland_EventScript_SetShopStateAfterChampion:: goto_if_unset FLAG_TWO_ISLAND_SHOP_INTRODUCED, TwoIsland_EventScript_SetShopInitial goto_if_unset FLAG_RESCUED_LOSTELLE, TwoIsland_EventScript_SetShopInitial goto_if_unset FLAG_TWO_ISLAND_SHOP_EXPANDED_1, TwoIsland_EventScript_SetShopExpanded1 goto TwoIsland_EventScript_SetShopExpanded2 end TwoIsland_EventScript_SetShopStateAfterLostelleRescue:: goto_if_unset FLAG_TWO_ISLAND_SHOP_INTRODUCED, TwoIsland_EventScript_SetShopInitial goto TwoIsland_EventScript_SetShopExpanded1 end TwoIsland_EventScript_SetShopStateDefault:: goto TwoIsland_EventScript_SetShopInitial end TwoIsland_EventScript_SetShopInitial:: setvar VAR_MAP_SCENE_TWO_ISLAND, 1 return TwoIsland_EventScript_SetShopExpanded1:: setvar VAR_MAP_SCENE_TWO_ISLAND, 2 clearflag FLAG_HIDE_TWO_ISLAND_WOMAN return TwoIsland_EventScript_SetShopExpanded2:: setvar VAR_MAP_SCENE_TWO_ISLAND, 3 clearflag FLAG_HIDE_TWO_ISLAND_BEAUTY return TwoIsland_EventScript_SetShopExpanded3:: setvar VAR_MAP_SCENE_TWO_ISLAND, 4 clearflag FLAG_HIDE_TWO_ISLAND_SUPER_NERD return TwoIsland_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer goto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 4, TwoIsland_EventScript_ClerkShopExpanded3 goto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 3, TwoIsland_EventScript_ClerkShopExpanded2 goto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 2, TwoIsland_EventScript_ClerkShopExpanded1 goto TwoIsland_EventScript_ClerkShopInitial end TwoIsland_EventScript_ClerkShopExpanded3:: goto_if_set FLAG_TWO_ISLAND_SHOP_EXPANDED_3, TwoIsland_EventScript_ClerkShopSkipIntro setflag FLAG_TWO_ISLAND_SHOP_EXPANDED_3 message TwoIsland_Text_BringingItemsFromDistantLands waitmessage goto TwoIsland_EventScript_ShopExpanded3 end TwoIsland_EventScript_ClerkShopExpanded2:: goto_if_set FLAG_TWO_ISLAND_SHOP_EXPANDED_2, TwoIsland_EventScript_ClerkShopSkipIntro setflag FLAG_TWO_ISLAND_SHOP_EXPANDED_2 message TwoIsland_Text_HopeYouGiveItYourBest waitmessage goto TwoIsland_EventScript_ShopExpanded2 end TwoIsland_EventScript_ClerkShopExpanded1:: goto_if_set FLAG_TWO_ISLAND_SHOP_EXPANDED_1, TwoIsland_EventScript_ClerkShopSkipIntro setflag FLAG_TWO_ISLAND_SHOP_EXPANDED_1 message TwoIsland_Text_AddedMerchandiseForLostelle waitmessage goto TwoIsland_EventScript_ShopExpanded1 end TwoIsland_EventScript_ClerkShopInitial:: goto_if_set FLAG_TWO_ISLAND_SHOP_INTRODUCED, TwoIsland_EventScript_ClerkShopSkipIntro setflag FLAG_TWO_ISLAND_SHOP_INTRODUCED message TwoIsland_Text_WelcomeToShopMerchandiseLimited waitmessage goto TwoIsland_EventScript_ShopInitial end TwoIsland_EventScript_ClerkShopSkipIntro:: message Text_MayIHelpYou waitmessage goto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 4, TwoIsland_EventScript_ShopExpanded3 goto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 3, TwoIsland_EventScript_ShopExpanded2 goto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 2, TwoIsland_EventScript_ShopExpanded1 goto TwoIsland_EventScript_ShopInitial end TwoIsland_EventScript_ShopInitial:: pokemart TwoIsland_Items_ShopInitial msgbox Text_PleaseComeAgain release end .align 2 TwoIsland_Items_ShopInitial:: .2byte ITEM_GREAT_BALL .2byte ITEM_FRESH_WATER .2byte ITEM_NONE release end TwoIsland_EventScript_ShopExpanded1:: pokemart TwoIsland_Items_ShopExpanded1 msgbox Text_PleaseComeAgain release end .align 2 TwoIsland_Items_ShopExpanded1:: .2byte ITEM_ULTRA_BALL .2byte ITEM_GREAT_BALL .2byte ITEM_SODA_POP .2byte ITEM_FRESH_WATER .2byte ITEM_NONE release end TwoIsland_EventScript_ShopExpanded2:: pokemart TwoIsland_Items_ShopExpanded2 msgbox Text_PleaseComeAgain release end .align 2 TwoIsland_Items_ShopExpanded2:: .2byte ITEM_ULTRA_BALL .2byte ITEM_GREAT_BALL .2byte ITEM_LEMONADE .2byte ITEM_SODA_POP .2byte ITEM_FRESH_WATER .2byte ITEM_MOOMOO_MILK .2byte ITEM_MOON_STONE .2byte ITEM_SUN_STONE .2byte ITEM_NONE release end TwoIsland_EventScript_ShopExpanded3:: pokemart TwoIsland_Items_ShopExpanded3 msgbox Text_PleaseComeAgain release end .align 2 TwoIsland_Items_ShopExpanded3:: .2byte ITEM_ULTRA_BALL .2byte ITEM_REPEAT_BALL .2byte ITEM_TIMER_BALL .2byte ITEM_LEMONADE .2byte ITEM_SODA_POP .2byte ITEM_FRESH_WATER .2byte ITEM_MOOMOO_MILK .2byte ITEM_LAVA_COOKIE .2byte ITEM_MOON_STONE .2byte ITEM_SUN_STONE .2byte ITEM_NONE release end TwoIsland_EventScript_Sailor:: msgbox TwoIsland_Text_FellowMovedFromCeladonCity, MSGBOX_NPC end TwoIsland_EventScript_Woman:: msgbox TwoIsland_Text_ShopkeepersBrotherWorksGameCorner, MSGBOX_NPC end TwoIsland_EventScript_Beauty:: lock faceplayer famechecker FAMECHECKER_BRUNO, 4 msgbox TwoIsland_Text_BrunoCameToIslandWhileBack release end TwoIsland_EventScript_SuperNerd:: msgbox TwoIsland_Text_BuyRareItemsHere, MSGBOX_NPC end TwoIsland_EventScript_Boy:: msgbox TwoIsland_Text_OldWomanLivesOutOnCape, MSGBOX_NPC end TwoIsland_EventScript_LittleBoy:: msgbox TwoIsland_Text_HaveYouTriedJumpingGame, MSGBOX_NPC end TwoIsland_EventScript_IslandSign:: msgbox TwoIsland_Text_IslandSign, MSGBOX_SIGN end TwoIsland_EventScript_JoyfulGameCornerSign:: msgbox TwoIsland_Text_JoyfulGameCornerSign, MSGBOX_SIGN end TwoIsland_EventScript_FastCurrentSign:: msgbox TwoIsland_Text_DangerFastCurrent, MSGBOX_SIGN end ================================================ FILE: data/maps/TwoIsland/text.inc ================================================ TwoIsland_Text_IslandSign:: .string "TWO ISLAND\n" .string "Boon Island for Two$" TwoIsland_Text_JoyfulGameCornerSign:: .string "Skip & Chomp!\n" .string "Joyful GAME CORNER$" TwoIsland_Text_DangerFastCurrent:: .string "DANGER! FAST CURRENT!\n" .string "Fishing and surfing prohibited!$" TwoIsland_Text_WelcomeToShopMerchandiseLimited:: .string "Oh!\n" .string "Hello, welcome to my shop!\p" .string "We've only opened up recently.\p" .string "Our merchandise is limited, but I\n" .string "hope we can serve your needs.$" TwoIsland_Text_AddedMerchandiseForLostelle:: .string "I can't tell you how grateful I am\n" .string "for your rescue of LOSTELLE.\p" .string "Thanks to your feat, the people of\n" .string "THREE ISLAND have changed their\l" .string "attitudes about KANTO people.\p" .string "And, I'm from KANTO, you see.\p" .string "The people of THREE ISLAND\n" .string "helped me add to my merchandise.$" TwoIsland_Text_HopeYouGiveItYourBest:: .string "Hi! I'm giving it my best here.\n" .string "I hope you do too, {PLAYER}.$" TwoIsland_Text_BringingItemsFromDistantLands:: .string "Oh, hello, {PLAYER}!\n" .string "Welcome!\p" .string "I've started bringing in items from\n" .string "distant lands.\p" .string "I've got some rare items in, too.\n" .string "Please have a look!$" TwoIsland_Text_FellowMovedFromCeladonCity:: .string "That fellow there, he moved here\n" .string "from CELADON CITY.\p" .string "He started up a shop with his\n" .string "younger brother.\p" .string "You have to wonder if he knew what\n" .string "he was getting into.$" TwoIsland_Text_ShopkeepersBrotherWorksGameCorner:: .string "The shopkeeper's brother took\n" .string "a job at the GAME CORNER.\p" .string "He's trying to pull together money\n" .string "so they can buy more merchandise.$" TwoIsland_Text_BrunoCameToIslandWhileBack:: .string "Listen, listen.\n" .string "Did you know?\p" .string "A famous TRAINER came to the\n" .string "ISLAND a little while back.\p" .string "He's one of the ELITE FOUR.\n" .string "His name is BRUNO.\p" .string "He went away disappointed when he\n" .string "found out that they were all sold\l" .string "out of Rage Candybars.$" TwoIsland_Text_BuyRareItemsHere:: .string "The discerning TRAINER knows to\n" .string "buy rare items here!$" TwoIsland_Text_OldWomanLivesOutOnCape:: .string "There's an old woman who lives in\n" .string "a cottage out on the cape.\p" .string "She gives the eye to POKéMON.\n" .string "It's a bit unnerving.$" TwoIsland_Text_HaveYouTriedJumpingGame:: .string "Boing! Boing!\n" .string "Have you tried the jumping game?\p" .string "The POKéMON you can enter…\n" .string "Boing!\p" .string "Some go boing!\p" .string "And some go boooooooing!\p" .string "Did you know that?\n" .string "Boing!$" ================================================ FILE: data/maps/TwoIsland_CapeBrink/map.json ================================================ { "id": "MAP_TWO_ISLAND_CAPE_BRINK", "name": "TwoIsland_CapeBrink", "layout": "LAYOUT_TWO_ISLAND_CAPE_BRINK", "music": "MUS_ROUTE119", "region_map_section": "MAPSEC_CAPE_BRINK", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "down", "offset": 3, "map": "MAP_TWO_ISLAND" } ], "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_POKEMON_RANGER_F", "in_connection": false, "x": 14, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT", "movement_range_x": 4, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "CapeBrink_EventScript_Helena", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 15, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "CapeBrink_EventScript_Atticus", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_FISHER", "in_connection": false, "x": 22, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CapeBrink_EventScript_Deforest", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_BIRD_KEEPER", "in_connection": false, "x": 17, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "CapeBrink_EventScript_Spedo", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 19, "y": 17, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "CapeBrink_EventScript_Caspara", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_F_LAND", "in_connection": false, "x": 23, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "0", "script": "CapeBrink_EventScript_Sedef", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_TUBER_M_LAND", "in_connection": false, "x": 16, "y": 25, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CapeBrink_EventScript_Tuber", "flag": "0" } ], "warp_events": [ { "x": 39, "y": 7, "elevation": 0, "dest_map": "MAP_TWO_ISLAND_CAPE_BRINK_HOUSE", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 43, "y": 19, "elevation": 3, "item": "ITEM_PP_MAX", "flag": "FLAG_HIDDEN_ITEM_TWO_ISLAND_CAPE_BRINK_PP_MAX", "quantity": 1, "underfoot": true }, { "type": "hidden_item", "x": 42, "y": 4, "elevation": 3, "item": "ITEM_RARE_CANDY", "flag": "FLAG_HIDDEN_ITEM_TWO_ISLAND_CAPE_BRINK_RARE_CANDY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 43, "y": 13, "elevation": 3, "item": "ITEM_GREPA_BERRY", "flag": "FLAG_HIDDEN_ITEM_CAPE_BRINK_GREPA_BERRY", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 11, "y": 18, "elevation": 3, "item": "ITEM_BIG_PEARL", "flag": "FLAG_HIDDEN_ITEM_CAPE_BRINK_BIG_PEARL", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/TwoIsland_CapeBrink/scripts.inc ================================================ TwoIsland_CapeBrink_MapScripts:: .byte 0 CapeBrink_EventScript_Helena:: trainerbattle_single TRAINER_PKMN_RANGER_HELENA, CapeBrink_Text_HelenaIntro, CapeBrink_Text_HelenaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle compare VAR_RESULT, TRUE goto_if_eq CapeBrink_EventScript_HelenaRematch msgbox CapeBrink_Text_HelenaPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_EventScript_HelenaRematch:: trainerbattle_rematch TRAINER_PKMN_RANGER_HELENA, CapeBrink_Text_HelenaRematchIntro, CapeBrink_Text_HelenaDefeat msgbox CapeBrink_Text_HelenaPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_Text_HelenaIntro: .string "I'm combing the beach for litter,\n" .string "but I guess I can do a quick battle.$" CapeBrink_Text_HelenaDefeat: .string "I'm all washed up!$" CapeBrink_Text_HelenaPostBattle: .string "It's important to keep the oceans\n" .string "clear of our trash.\p" .string "Try to get things that are reusable\n" .string "or refillable so you're throwing\l" .string "less stuff away.$" CapeBrink_Text_HelenaRematchIntro: .string "I'm combing the beach for litter,\n" .string "but found a TRAINER instead!$" CapeBrink_EventScript_Atticus:: trainerbattle_single TRAINER_COOLTRAINER_ATTICUS, CapeBrink_Text_AtticusIntro, CapeBrink_Text_AtticusDefeat specialvar VAR_RESULT, ShouldTryRematchBattle compare VAR_RESULT, TRUE goto_if_eq CapeBrink_EventScript_AtticusRematch msgbox CapeBrink_Text_AtticusPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_EventScript_AtticusRematch:: trainerbattle_rematch TRAINER_COOLTRAINER_ATTICUS, CapeBrink_Text_AtticusRematchIntro, CapeBrink_Text_AtticusDefeat msgbox CapeBrink_Text_AtticusPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_Text_AtticusIntro: .string "TWO ISLAND has absolutely nothing\n" .string "going on…\l" .string "Hey, cure my boredom with a battle!$" CapeBrink_Text_AtticusDefeat: .string "…And now I'm bored again…$" CapeBrink_Text_AtticusPostBattle: .string "TRAINERS come here to battle\n" .string "each other.\p" .string "This island is so sleepy that\n" .string "there's not much else to do here.$" CapeBrink_Text_AtticusRematchIntro: .string "…Yawn…\n" .string "…So bored…\p" .string "Oh, a battle?\n" .string "You bet! Bring it on!$" CapeBrink_EventScript_Deforest:: trainerbattle_single TRAINER_FISHERMAN_DEFOREST, CapeBrink_Text_DeforestIntro, CapeBrink_Text_DeforestDefeat specialvar VAR_RESULT, ShouldTryRematchBattle compare VAR_RESULT, TRUE goto_if_eq CapeBrink_EventScript_DeforestRematch msgbox CapeBrink_Text_DeforestPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_EventScript_DeforestRematch:: trainerbattle_rematch TRAINER_FISHERMAN_DEFOREST, CapeBrink_Text_DeforestRematchIntro, CapeBrink_Text_DeforestRematchDefeat msgbox CapeBrink_Text_DeforestPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_Text_DeforestIntro: .string "Ach! Nothing's biting!\p" .string "I'll take my frustration out\n" .string "on your POKéMON!$" CapeBrink_Text_DeforestDefeat: .string "Like a fish out of water!$" CapeBrink_Text_DeforestPostBattle: .string "These fast-moving currents make it\n" .string "impossible to catch fish, but I\l" .string "still keep trying.$" CapeBrink_Text_DeforestRematchIntro: .string "You want another battle? Sure,\n" .string "it's not like I've hooked anything.$" CapeBrink_Text_DeforestRematchDefeat: .string "Why won't my POLIWHIRL evolve\n" .string "into POLITOED?$" CapeBrink_EventScript_Spedo:: trainerbattle_single TRAINER_BIRD_KEEPER_SPEDO, CapeBrink_Text_SpedoIntro, CapeBrink_Text_SpedoDefeat specialvar VAR_RESULT, ShouldTryRematchBattle compare VAR_RESULT, TRUE goto_if_eq CapeBrink_EventScript_SpedoRematch msgbox CapeBrink_Text_SpedoPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_EventScript_SpedoRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_SPEDO, CapeBrink_Text_SpedoRematchIntro, CapeBrink_Text_SpedoDefeat msgbox CapeBrink_Text_SpedoPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_Text_SpedoIntro: .string "We may not be able to swim or\n" .string "SURF, but my POKéMON sure can FLY!$" CapeBrink_Text_SpedoDefeat: .string "Crash landing!$" CapeBrink_Text_SpedoPostBattle: .string "Even if it's too dangerous to get\n" .string "in the water, I still have fun\l" .string "hanging out on the beach.$" CapeBrink_Text_SpedoRematchIntro: .string "Can't swim and can't SURF,\n" .string "so let's have fun by battling!$" CapeBrink_EventScript_Caspara:: trainerbattle_single TRAINER_COOLTRAINER_CASPARA, CapeBrink_Text_CasparaIntro, CapeBrink_Text_CasparaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle compare VAR_RESULT, TRUE goto_if_eq CapeBrink_EventScript_CasparaRematch msgbox CapeBrink_Text_CasparaPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_EventScript_CasparaRematch:: trainerbattle_rematch TRAINER_COOLTRAINER_CASPARA, CapeBrink_Text_CasparaRematchIntro, CapeBrink_Text_CasparaDefeat msgbox CapeBrink_Text_CasparaPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_Text_CasparaIntro: .string "Hey! You're in my sun!\n" .string "Get out of here, kid!$" CapeBrink_Text_CasparaDefeat: .string "Great, now go somewhere else.$" CapeBrink_Text_CasparaPostBattle: .string "The sun is really bad for you,\n" .string "especially without sunscreen.\p" .string "Sometimes I wonder if tanning\n" .string "like this is really worth it.$" CapeBrink_Text_CasparaRematchIntro: .string "You don't have to keep bothering me,\n" .string "that chair over there is free.\p" .string "Another battle?\n" .string "…If it makes you go away, then fine.$" CapeBrink_EventScript_Sedef:: trainerbattle_single TRAINER_SWIMMER_FEMALE_SEDEF, CapeBrink_Text_SedefIntro, CapeBrink_Text_SedefDefeat specialvar VAR_RESULT, ShouldTryRematchBattle compare VAR_RESULT, TRUE goto_if_eq CapeBrink_EventScript_SedefRematch msgbox CapeBrink_Text_SedefPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_EventScript_SedefRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_SEDEF, CapeBrink_Text_SedefRematchIntro, CapeBrink_Text_SedefDefeat msgbox CapeBrink_Text_SedefPostBattle, MSGBOX_AUTOCLOSE end CapeBrink_Text_SedefIntro: .string "I'm the best SWIMMER in the world!\n" .string "Watch me sink your POKéMON!$" CapeBrink_Text_SedefDefeat: .string "Caught in a riptide!$" CapeBrink_Text_SedefPostBattle: .string "I could easily swim in these\n" .string "currents, I just prefer lying here.$" CapeBrink_Text_SedefRematchIntro: .string "I'm the best relaxer in the world!\n" .string "I'll beat you while snoozing!$" CapeBrink_EventScript_Tuber:: msgbox CapeBrink_Text_Tuber, MSGBOX_NPC end CapeBrink_Text_Tuber: .string "This beach is famous for attracting\n" .string "strong TRAINERS from all over.\p" .string "I like watching their battles\n" .string "from up here.$" ================================================ FILE: data/maps/TwoIsland_CapeBrink_House/map.json ================================================ { "id": "MAP_TWO_ISLAND_CAPE_BRINK_HOUSE", "name": "TwoIsland_CapeBrink_House", "layout": "LAYOUT_HOUSE3", "music": "MUS_FORTREE", "region_map_section": "MAPSEC_CAPE_BRINK", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CHANNELER", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_CapeBrink_House_EventScript_StarterTutor", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_TWO_ISLAND_CAPE_BRINK", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/TwoIsland_CapeBrink_House/scripts.inc ================================================ TwoIsland_CapeBrink_House_MapScripts:: .byte 0 @ See move_tutors.inc ================================================ FILE: data/maps/TwoIsland_CapeBrink_House/text.inc ================================================ Text_UltimateMoveThatMon:: .string "I perfected the ultimate move of\n" .string "its type…\p" .string "But will no one take it for\n" .string "future use?\p" .string "…Hm? Hmmm!\p" .string "Y-you…\n" .string "Th-that {STR_VAR_1}…$" Text_JustMistaken:: .string "…No…\n" .string "I was just mistaken.$" Text_AllowMeToTeachMonUltimateMove:: .string "Oh! This is the one!\n" .string "This is the POKéMON!\p" .string "This {STR_VAR_1} is worthy of\n" .string "learning my ultimate move!\p" .string "Will you allow it?\p" .string "Will you allow your {STR_VAR_1} to\n" .string "learn my {STR_VAR_2}?$" Text_YouRejectIt:: .string "Gaah! You reject it?\n" .string "No, I won't be dissuaded!$" Text_LetMeConferUltimateMove:: .string "You will allow it?\p" .string "Then, let me confer my ultimate\n" .string "{STR_VAR_2} on your {STR_VAR_1}.\p" .string "Ggggrah-awooo!$" Text_TaughtMove:: .string "Gasp, gasp, gasp…\p" .string "I didn't think I could teach that\n" .string "move while I still lived…$" Text_MakeBestUseOfMove:: .string "I implore you to make the best\n" .string "use of that move and gain power!$" Text_PassedOnEverythingIKnow:: .string "Gasp, gasp, gasp…\p" .string "I have no regrets now.\n" .string "I've passed on everything I know.\p" .string "Now I can live out my life knowing\n" .string "my work is done.$" Text_FeelRejuvenated:: .string "After I passed on my knowledge to\n" .string "you, I felt so much relief.\p" .string "In fact, I feel rejuvenated,\n" .string "as if I were younger again!\p" .string "I feel young enough to keep\n" .string "teaching my ultimate moves.$" Text_NotTheRightPokemon:: .string "But, that {STR_VAR_1}…\p" .string "No, it cannot learn one\n" .string "of my moves.$" Text_RightPokemon:: .string "But, that {STR_VAR_1}…\n" .string "Oh! Yes! This is the one!\p" .string "This {STR_VAR_1} is worthy of\n" .string "learning an ultimate move!\p" .string "Will you allow it?\p" .string "Will you allow your {STR_VAR_1} to\n" .string "learn my {STR_VAR_2}?$" ================================================ FILE: data/maps/TwoIsland_Harbor/map.json ================================================ { "id": "MAP_TWO_ISLAND_HARBOR", "name": "TwoIsland_Harbor", "layout": "LAYOUT_ISLAND_HARBOR", "music": "MUS_FORTREE", "region_map_section": "MAPSEC_TWO_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEAGALLOP", "in_connection": false, "x": 8, "y": 9, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 8, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_Harbor_EventScript_Sailor", "flag": "0" } ], "warp_events": [ { "x": 8, "y": 2, "elevation": 3, "dest_map": "MAP_TWO_ISLAND", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/TwoIsland_Harbor/scripts.inc ================================================ TwoIsland_Harbor_MapScripts:: .byte 0 TwoIsland_Harbor_EventScript_Sailor:: lock faceplayer message Text_WhereDoYouWantToSail waitmessage setvar VAR_0x8004, SEAGALLOP_TWO_ISLAND goto EventScript_ChooseDestFromTwoIsland end ================================================ FILE: data/maps/TwoIsland_House/map.json ================================================ { "id": "MAP_TWO_ISLAND_HOUSE", "name": "TwoIsland_House", "layout": "LAYOUT_HOUSE3", "music": "MUS_FORTREE", "region_map_section": "MAPSEC_TWO_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 7, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_House_EventScript_MoveManiac", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_House_EventScript_EffortWoman", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_TWO_ISLAND", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/TwoIsland_House/scripts.inc ================================================ .equ CHECKED_MUSHROOMS, FLAG_TEMP_1 .equ HAS_BIG_MUSHROOM, FLAG_TEMP_2 .equ HAS_TINY_MUSHROOMS, FLAG_TEMP_3 .equ HAS_BOTH_MUSHROOMS, FLAG_TEMP_4 TwoIsland_House_MapScripts:: .byte 0 TwoIsland_House_EventScript_MoveManiac:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer clearflag HAS_BIG_MUSHROOM clearflag HAS_TINY_MUSHROOMS clearflag HAS_BOTH_MUSHROOMS goto_if_set CHECKED_MUSHROOMS, TwoIsland_House_EventScript_CheckPlayerHasMushrooms msgbox TwoIsland_House_Text_TeachMonMoveForMushroom setflag CHECKED_MUSHROOMS goto TwoIsland_House_EventScript_CheckPlayerHasMushrooms end TwoIsland_House_EventScript_CheckPlayerHasMushrooms:: checkitem ITEM_BIG_MUSHROOM call_if_eq VAR_RESULT, TRUE, TwoIsland_House_EventScript_SetHasBigMushroom checkitem ITEM_TINY_MUSHROOM, 2 call_if_eq VAR_RESULT, TRUE, TwoIsland_House_EventScript_SetHasTinyMushrooms goto_if_set HAS_BIG_MUSHROOM, TwoIsland_House_EventScript_CheckAlsoHasTinyMushrooms goto_if_set HAS_TINY_MUSHROOMS, TwoIsland_House_EventScript_CheckAlsoHasBigMushroom goto TwoIsland_House_EventScript_EndTutorMove end TwoIsland_House_EventScript_CheckAlsoHasTinyMushrooms:: call_if_set HAS_TINY_MUSHROOMS, TwoIsland_House_EventScript_SetHasBothMushrooms goto TwoIsland_House_EventScript_AskTutorMon end TwoIsland_House_EventScript_CheckAlsoHasBigMushroom:: call_if_set HAS_BIG_MUSHROOM, TwoIsland_House_EventScript_SetHasBothMushrooms goto TwoIsland_House_EventScript_AskTutorMon end TwoIsland_House_EventScript_AskTutorMon:: msgbox TwoIsland_House_Text_WantMeToTeachMove, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, TwoIsland_House_EventScript_EndTutorMove goto TwoIsland_House_EventScript_ChooseMonToTutor end TwoIsland_House_EventScript_ChooseMonToTutor:: setvar VAR_TEMP_0, 1 msgbox TwoIsland_House_Text_TutorWhichMon special SelectMoveTutorMon waitstate goto_if_ge VAR_0x8004, PARTY_SIZE, TwoIsland_House_EventScript_EndTutorMove special IsSelectedMonEgg goto_if_eq VAR_RESULT, TRUE, TwoIsland_House_EventScript_CantTutorEgg goto_if_eq VAR_0x8005, 0, TwoIsland_House_EventScript_NoMoveToTutorMon goto TwoIsland_House_EventScript_ChooseMoveToTeach end TwoIsland_House_EventScript_ChooseMoveToTeach:: msgbox TwoIsland_House_Text_TeachWhichMove special DisplayMoveTutorMenu waitstate goto_if_eq VAR_0x8004, 0, TwoIsland_House_EventScript_ChooseMonToTutor goto_if_set HAS_BOTH_MUSHROOMS, TwoIsland_House_EventScript_ChooseMushroom goto_if_set HAS_BIG_MUSHROOM, TwoIsland_House_EventScript_GiveBigMushroom goto_if_set HAS_TINY_MUSHROOMS, TwoIsland_House_EventScript_GiveTinyMushrooms end TwoIsland_House_EventScript_GiveBigMushroom:: removeitem ITEM_BIG_MUSHROOM textcolor NPC_TEXT_COLOR_NEUTRAL msgbox TwoIsland_House_Text_HandedOverOneBigMushroom call EventScript_RestorePrevTextColor goto TwoIsland_House_EventScript_EndTutorMove end TwoIsland_House_EventScript_GiveTinyMushrooms:: removeitem ITEM_TINY_MUSHROOM, 2 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox TwoIsland_House_Text_HandedOverTwoTinyMushrooms call EventScript_RestorePrevTextColor goto TwoIsland_House_EventScript_EndTutorMove end TwoIsland_House_EventScript_ChooseMushroom:: message TwoIsland_House_Text_IllNeedMushroomOrTwo waitmessage multichoice 0, 0, MULTICHOICE_MUSHROOMS, TRUE switch VAR_RESULT case 0, TwoIsland_House_EventScript_GiveTinyMushrooms case 1, TwoIsland_House_EventScript_GiveBigMushroom end TwoIsland_House_EventScript_NoMoveToTutorMon:: msgbox TwoIsland_House_Text_NoMoveICanTeachThatMon goto TwoIsland_House_EventScript_ChooseMonToTutor end TwoIsland_House_EventScript_CantTutorEgg:: msgbox TwoIsland_House_Text_CantTeachAnEgg goto TwoIsland_House_EventScript_ChooseMonToTutor end TwoIsland_House_EventScript_EndTutorMove:: setvar VAR_TEMP_0, 0 msgbox TwoIsland_House_Text_NeedMushroomOrTwoToLearnMove release end TwoIsland_House_EventScript_SetHasBigMushroom:: setflag HAS_BIG_MUSHROOM return TwoIsland_House_EventScript_SetHasTinyMushrooms:: setflag HAS_TINY_MUSHROOMS return TwoIsland_House_EventScript_SetHasBothMushrooms:: setflag HAS_BOTH_MUSHROOMS return TwoIsland_House_EventScript_EffortWoman:: lock faceplayer bufferleadmonspeciesname 0 msgbox TwoIsland_House_Text_OhYourPokemon, MSGBOX_DEFAULT specialvar VAR_RESULT, LeadMonHasEffortRibbon compare VAR_RESULT, TRUE call_if_eq TwoIsland_House_EventScript_MonHasEffortRibbon specialvar VAR_RESULT, AreLeadMonEVsMaxedOut compare VAR_RESULT, FALSE call_if_eq TwoIsland_House_EventScript_MonEVsNotMaxed msgbox TwoIsland_House_Text_PleaseGiveItThisEffortRibbon, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_ITEM message TwoIsland_House_Text_ReceivedEffortRibbon waitfanfare msgbox TwoIsland_House_Text_PutEffortRibbonOnMon, MSGBOX_DEFAULT special GiveLeadMonEffortRibbon release end TwoIsland_House_EventScript_MonEVsNotMaxed:: msgbox TwoIsland_House_Text_GoForItLittleHarder, MSGBOX_DEFAULT release end TwoIsland_House_EventScript_MonHasEffortRibbon:: msgbox TwoIsland_House_Text_EffortRibbonLooksGoodOnIt, MSGBOX_DEFAULT release end TwoIsland_House_Text_OhYourPokemon: .string "Oh?\n" .string "Your {STR_VAR_1}…$" TwoIsland_House_Text_PleaseGiveItThisEffortRibbon: .string "Went for it stupendously!\p" .string "As its reward, please give it this\n" .string "EFFORT RIBBON.$" TwoIsland_House_Text_ReceivedEffortRibbon: .string "{COLOR DARK_GRAY}{PLAYER} received the EFFORT RIBBON.$" TwoIsland_House_Text_PutEffortRibbonOnMon: .string "{COLOR DARK_GRAY}{PLAYER} put the EFFORT RIBBON\n" .string "on {STR_VAR_1}.$" TwoIsland_House_Text_GoForItLittleHarder: .string "You have to go for it a\n" .string "little harder.\p" .string "If you do, I'll give your POKéMON\n" .string "something nice.$" TwoIsland_House_Text_EffortRibbonLooksGoodOnIt: .string "Oh! Your {STR_VAR_1}, that EFFORT\n" .string "RIBBON looks good on it!$" ================================================ FILE: data/maps/TwoIsland_House/text.inc ================================================ TwoIsland_House_Text_TeachMonMoveForMushroom:: .string "I'm the POKéMON MOVE MANIAC.\p" .string "I know every single move that\n" .string "POKéMON learn growing up.\p" .string "I'm also a mushroom maniac.\p" .string "Bring me two TINYMUSHROOMS,\n" .string "or one BIG MUSHROOM.\p" .string "If you do that for me, I'll teach\n" .string "a move to one POKéMON.$" TwoIsland_House_Text_WantMeToTeachMove:: .string "Sniff, sniff…\n" .string "Hm! You smell of MUSHROOMS!\p" .string "Do you want me to teach a move\n" .string "to a POKéMON of yours?$" TwoIsland_House_Text_TutorWhichMon:: .string "Which POKéMON needs tutoring?$" TwoIsland_House_Text_TeachWhichMove:: .string "Which move should I teach?$" TwoIsland_House_Text_NoMoveICanTeachThatMon:: .string "Sorry…\p" .string "It doesn't appear as if I have a\n" .string "move I can teach that POKéMON.$" TwoIsland_House_Text_IllNeedMushroomOrTwo:: .string "Then, I'll need a MUSHROOM or two.\n" .string "What are you going to give me?$" TwoIsland_House_Text_HandedOverTwoTinyMushrooms:: .string "{PLAYER} handed over two\n" .string "TINYMUSHROOMS in exchange.$" TwoIsland_House_Text_HandedOverOneBigMushroom:: .string "{PLAYER} handed over one\n" .string "BIG MUSHROOM in exchange.$" TwoIsland_House_Text_NeedMushroomOrTwoToLearnMove:: .string "If your POKéMON need to learn a\n" .string "move, I need a MUSHROOM or two.$" TwoIsland_House_Text_CantTeachAnEgg:: .string "Hunh? There isn't a single move\n" .string "that I can teach an EGG.$" ================================================ FILE: data/maps/TwoIsland_JoyfulGameCorner/map.json ================================================ { "id": "MAP_TWO_ISLAND_JOYFUL_GAME_CORNER", "name": "TwoIsland_JoyfulGameCorner", "layout": "LAYOUT_TWO_ISLAND_JOYFUL_GAME_CORNER", "music": "MUS_RS_GAME_CORNER", "region_map_section": "MAPSEC_TWO_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "in_connection": false, "x": 5, "y": 5, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_JoyfulGameCorner_EventScript_LostellesDaddy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BIKER", "in_connection": false, "x": 5, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_TWO_ISLAND_GAME_CORNER_BIKER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 6, "y": 5, "elevation": 1, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_JoyfulGameCorner_EventScript_Lostelle", "flag": "FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_JoyfulGameCorner_EventScript_InfoMan", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_TWO_ISLAND", "dest_warp_id": "0" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 1, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "TwoIsland_JoyfulGameCorner_EventScript_ShowPokemonJumpRecords" }, { "type": "sign", "x": 0, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "TwoIsland_JoyfulGameCorner_EventScript_ShowDodrioBerryPickingRecords" } ], "level_scaling": "4" } ================================================ FILE: data/maps/TwoIsland_JoyfulGameCorner/scripts.inc ================================================ .equ LOCALID_DADDY, 1 .equ LOCALID_BIKER, 2 .equ LOCALID_LOSTELLE, 3 TwoIsland_JoyfulGameCorner_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, TwoIsland_JoyfulGameCorner_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, TwoIsland_JoyfulGameCorner_OnWarp map_script MAP_SCRIPT_ON_FRAME_TABLE, TwoIsland_JoyfulGameCorner_OnFrame map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad .byte 0 TwoIsland_JoyfulGameCorner_OnTransition:: call_if_set FLAG_GOT_MOON_STONE_FROM_JOYFUL_GAME_CORNER, TwoIsland_JoyfulGameCorner_EventScript_SetLostelleReturnedPos end TwoIsland_JoyfulGameCorner_EventScript_SetLostelleReturnedPos:: setobjectxyperm LOCALID_DADDY, 6, 2 setobjectmovementtype LOCALID_DADDY, MOVEMENT_TYPE_FACE_DOWN setobjectmovementtype LOCALID_LOSTELLE, MOVEMENT_TYPE_LOOK_AROUND setvar VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 4 return TwoIsland_JoyfulGameCorner_OnWarp:: map_script_2 VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 2, TwoIsland_JoyfulGameCorner_EventScript_TurnPlayerNorth map_script_2 VAR_CABLE_CLUB_STATE, USING_MINIGAME, EventScript_CheckTurnAttendant .2byte 0 TwoIsland_JoyfulGameCorner_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end TwoIsland_JoyfulGameCorner_OnFrame:: map_script_2 VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 0, TwoIsland_JoyfulGameCorner_EventScript_HelpFindLostelleScene map_script_2 VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 2, TwoIsland_JoyfulGameCorner_EventScript_FoundLostelleScene map_script_2 VAR_CABLE_CLUB_STATE, USING_MINIGAME, CableClub_EventScript_ExitMinigameRoom .2byte 0 TwoIsland_JoyfulGameCorner_EventScript_FoundLostelleScene:: lockall textcolor NPC_TEXT_COLOR_MALE msgbox TwoIsland_JoyfulGameCorner_Text_YouRescuedLostelle textcolor NPC_TEXT_COLOR_FEMALE special BufferBigGuyOrBigGirlString msgbox TwoIsland_JoyfulGameCorner_Text_LostelleItsOkayDaddy closemessage applymovement LOCALID_LOSTELLE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 setvar VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 3 releaseall end TwoIsland_JoyfulGameCorner_EventScript_HelpFindLostelleScene:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_DADDY, TwoIsland_JoyfulGameCorner_Movement_DaddyPacing waitmovement 0 msgbox TwoIsland_JoyfulGameCorner_Text_WhereHasLostelleGottenTo closemessage applymovement LOCALID_DADDY, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN applymovement LOCALID_DADDY, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_DADDY, Common_Movement_Delay48 waitmovement 0 applymovement LOCALID_DADDY, TwoIsland_JoyfulGameCorner_Movement_DaddyApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox TwoIsland_JoyfulGameCorner_Text_PleaseHelpFindLostelle closemessage playse SE_RS_DOOR waitse applymovement OBJ_EVENT_ID_PLAYER, TwoIsland_JoyfulGameCorner_Movement_PlayerFaceDaddy waitmovement 0 playbgm MUS_ENCOUNTER_BOY, 0 addobject LOCALID_BIKER applymovement LOCALID_BIKER, TwoIsland_JoyfulGameCorner_Movement_BikerLookAround waitmovement 0 msgbox TwoIsland_JoyfulGameCorner_Text_IsThisOnlyThreeIsland applymovement LOCALID_BIKER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox TwoIsland_JoyfulGameCorner_Text_ThisIsTwoIslandMoveIt msgbox TwoIsland_JoyfulGameCorner_Text_TheseIslandsAreConfusing closemessage applymovement LOCALID_BIKER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_EXIT removeobject LOCALID_BIKER fadedefaultbgm delay 60 msgbox TwoIsland_JoyfulGameCorner_Text_PunkScuffedUpMyFloor clearflag FLAG_HIDE_THREE_ISLAND_LONE_BIKER setvar VAR_MAP_SCENE_THREE_ISLAND, 2 setvar VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 1 releaseall end TwoIsland_JoyfulGameCorner_Movement_DaddyPacing:: walk_left walk_right walk_right delay_8 walk_in_place_faster_up delay_16 step_end TwoIsland_JoyfulGameCorner_Movement_DaddyApproachPlayer:: walk_down walk_down walk_down walk_in_place_faster_left step_end TwoIsland_JoyfulGameCorner_Movement_PlayerFaceDaddy:: walk_left walk_in_place_faster_right step_end TwoIsland_JoyfulGameCorner_Movement_BikerLookAround:: walk_in_place_faster_left delay_8 walk_in_place_faster_right delay_8 walk_in_place_faster_up step_end TwoIsland_JoyfulGameCorner_EventScript_InfoMan:: lock faceplayer goto_if_eq VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 4, JoyfulGameCorner_EventScript_InfoMan2 goto_if_set FLAG_RESCUED_LOSTELLE, TwoIsland_JoyfulGameCorner_EventScript_GetGamesGoingSoon msgbox TwoIsland_JoyfulGameCorner_Text_NotRunningAnyGamesToday release end TwoIsland_JoyfulGameCorner_EventScript_GetGamesGoingSoon:: msgbox TwoIsland_JoyfulGameCorner_Text_GetGamesGoingSoon release end @ Only referred to as Lostelles Daddy in text TwoIsland_JoyfulGameCorner_EventScript_LostellesDaddy:: lock faceplayer goto_if_eq VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 4, JoyfulGameCorner_EventScript_MinigameAttendant goto_if_set FLAG_GOT_MOON_STONE_FROM_JOYFUL_GAME_CORNER, TwoIsland_JoyfulGameCorner_EventScript_GetGameCornerRunning goto_if_eq VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 3, TwoIsland_JoyfulGameCorner_EventScript_GiveDaddyMeteorite msgbox TwoIsland_JoyfulGameCorner_Text_PleaseGoToThreeIsland release end TwoIsland_JoyfulGameCorner_EventScript_GiveDaddyMeteorite:: goto_if_set FLAG_NO_ROOM_FOR_JOYFUL_GAME_CORNER_MOON_STONE, TwoIsland_JoyfulGameCorner_EventScript_ReceiveMoonStone msgbox TwoIsland_JoyfulGameCorner_Text_ThisIsForMe setvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 2 textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_OBTAIN_TMHM message TwoIsland_JoyfulGameCorner_Text_HandedMeteoriteToLostellesDaddy waitmessage waitfanfare call EventScript_RestorePrevTextColor removeitem ITEM_METEORITE msgbox TwoIsland_JoyfulGameCorner_Text_OhThisIsFromBill goto TwoIsland_JoyfulGameCorner_EventScript_ReceiveMoonStone end TwoIsland_JoyfulGameCorner_EventScript_ReceiveMoonStone:: checkitemspace ITEM_MOON_STONE goto_if_eq VAR_RESULT, FALSE, TwoIsland_JoyfulGameCorner_EventScript_NoRoomForMoonStone additem ITEM_MOON_STONE setflag FLAG_GOT_MOON_STONE_FROM_JOYFUL_GAME_CORNER msgreceiveditem TwoIsland_JoyfulGameCorner_Text_ReceivedMoonStoneFromLostellesDaddy, ITEM_MOON_STONE release end TwoIsland_JoyfulGameCorner_EventScript_GetGameCornerRunning:: msgbox TwoIsland_JoyfulGameCorner_Text_IllGetGameCornerRunning release end TwoIsland_JoyfulGameCorner_EventScript_NoRoomForMoonStone:: setflag FLAG_NO_ROOM_FOR_JOYFUL_GAME_CORNER_MOON_STONE msgbox TwoIsland_JoyfulGameCorner_Text_NotGoingToFitInBag release end TwoIsland_JoyfulGameCorner_EventScript_Lostelle:: lock faceplayer msgbox TwoIsland_JoyfulGameCorner_Text_PleaseShowMeYouBeingCool release end ================================================ FILE: data/maps/TwoIsland_JoyfulGameCorner/text.inc ================================================ TwoIsland_JoyfulGameCorner_Text_WhereHasLostelleGottenTo:: .string "Now, where's LOSTELLE gotten to\n" .string "today?\p" .string "She always brings me lunch every\n" .string "day right about now…$" TwoIsland_JoyfulGameCorner_Text_PleaseHelpFindLostelle:: .string "Hm? You, there!\n" .string "Are you a friend of LOSTELLE's?\p" .string "Have you seen LOSTELLE around?\n" .string "I don't know where she might be.\l" .string "She should've been here long ago.\p" .string "LOSTELLE's a cutie - she got my\n" .string "looks - so what if someone…\p" .string "What if something's happened to\n" .string "my LOSTELLE?!\p" .string "Please, help me find her!\n" .string "Please go search THREE ISLAND!$" TwoIsland_JoyfulGameCorner_Text_IsThisOnlyThreeIsland:: .string "Hah? What is this GAME CORNER?\n" .string "How much sadder can this get?\p" .string "Those clowns…\p" .string "They said they'd be waiting on the\n" .string "island, so where are they?\p" .string "Hey, you! Is this the only THREE\n" .string "ISLAND around here?$" TwoIsland_JoyfulGameCorner_Text_ThisIsTwoIslandMoveIt:: .string "Try waking up before you crawl out\n" .string "of bed, you punk.\p" .string "This is TWO ISLAND!\p" .string "Move it! Get your filthy motorbike\n" .string "out of my place!$" TwoIsland_JoyfulGameCorner_Text_TheseIslandsAreConfusing:: .string "Huh…\n" .string "Oh, oh, gotcha.\p" .string "Tch…\n" .string "These islands are confusing…$" TwoIsland_JoyfulGameCorner_Text_PunkScuffedUpMyFloor:: .string "Would you look at that?\n" .string "That punk scuffed up my floor.$" TwoIsland_JoyfulGameCorner_Text_PleaseGoToThreeIsland:: .string "Hey, but listen! I'm begging you,\n" .string "you have to go to THREE ISLAND.\p" .string "If anything were to happen to my\n" .string "LOSTELLE…\p" .string "My place is the house with the red\n" .string "roof on THREE ISLAND.\p" .string "She may just show up late here,\n" .string "so I can't run off anywhere.\p" .string "That's why I have to get you to do\n" .string "me this big favor.$" TwoIsland_JoyfulGameCorner_Text_NotRunningAnyGamesToday:: .string "I'm sorry.\n" .string "We're not running any games today.$" TwoIsland_JoyfulGameCorner_Text_GetGamesGoingSoon:: .string "We'll get the games going soon\n" .string "for you!$" TwoIsland_JoyfulGameCorner_Text_YouRescuedLostelle:: .string "So you rescued LOSTELLE?\n" .string "How can I thank you?\p" .string "LOSTELLE, darling, forgive me!\p" .string "Daddy didn't know you were scared\n" .string "and in trouble!$" TwoIsland_JoyfulGameCorner_Text_LostelleItsOkayDaddy:: .string "LOSTELLE: It's okay, Daddy.\n" .string "I got to be friends with {PLAYER}!$" TwoIsland_JoyfulGameCorner_Text_ThisIsForMe:: .string "Oh, what's that?\n" .string "You're saying that this is for me?\p" .string "How did you know that I love rare\n" .string "rocks and gems?\p" .string "You sure know how to make a guy\n" .string "happy.$" TwoIsland_JoyfulGameCorner_Text_HandedMeteoriteToLostellesDaddy:: .string "{PLAYER} handed the METEORITE\n" .string "to LOSTELLE's daddy.$" TwoIsland_JoyfulGameCorner_Text_OhThisIsFromBill:: .string "Oh, I see, this is from BILL!\n" .string "You have to thank him for me!\p" .string "You know, you've been fantastic.\n" .string "I want you to have this.$" TwoIsland_JoyfulGameCorner_Text_ReceivedMoonStoneFromLostellesDaddy:: .string "{PLAYER} received a MOON STONE\n" .string "from LOSTELLE's daddy.$" TwoIsland_JoyfulGameCorner_Text_NotGoingToFitInBag:: .string "Your BAG's not going to fit another\n" .string "thing…$" TwoIsland_JoyfulGameCorner_Text_IllGetGameCornerRunning:: .string "All right, I'll get the GAME CORNER\n" .string "running right away.\p" .string "You have to come visit with a\n" .string "friend.$" TwoIsland_JoyfulGameCorner_Text_PleaseShowMeYouBeingCool:: .string "Listen, listen!\p" .string "Please show me you being cool\n" .string "again!$" ================================================ FILE: data/maps/TwoIsland_PokemonCenter_1F/map.json ================================================ { "id": "MAP_TWO_ISLAND_POKEMON_CENTER_1F", "name": "TwoIsland_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_TWO_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GBA_KID", "in_connection": false, "x": 11, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_PokemonCenter_1F_EventScript_GBAKid", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "TwoIsland_PokemonCenter_1F_EventScript_BugCatcher", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_TWO_ISLAND", "dest_warp_id": "2" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_TWO_ISLAND_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/TwoIsland_PokemonCenter_1F/scripts.inc ================================================ TwoIsland_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, TwoIsland_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 TwoIsland_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_TWO_ISLAND end TwoIsland_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end TwoIsland_PokemonCenter_1F_EventScript_GBAKid:: msgbox TwoIsland_PokemonCenter_1F_Text_HaveYouVisitedGameCorner, MSGBOX_NPC end TwoIsland_PokemonCenter_1F_EventScript_BugCatcher:: msgbox TwoIsland_PokemonCenter_1F_Text_OldLadyLivesOutOnCape, MSGBOX_NPC end ================================================ FILE: data/maps/TwoIsland_PokemonCenter_1F/text.inc ================================================ TwoIsland_PokemonCenter_1F_Text_HaveYouVisitedGameCorner:: .string "Have you visited the GAME CORNER\n" .string "already?\p" .string "It's no good to go alone.\n" .string "You have to take a friend along.$" TwoIsland_PokemonCenter_1F_Text_OldLadyLivesOutOnCape:: .string "Not many people live on\n" .string "TWO ISLAND.\p" .string "There is this old lady who lives\n" .string "out on the cape.\p" .string "She's been there since I don't know\n" .string "when.$" ================================================ FILE: data/maps/TwoIsland_PokemonCenter_2F/map.json ================================================ { "id": "MAP_TWO_ISLAND_POKEMON_CENTER_2F", "name": "TwoIsland_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_TWO_ISLAND", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_TWO_ISLAND_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/TwoIsland_PokemonCenter_2F/scripts.inc ================================================ TwoIsland_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS TwoIsland_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end TwoIsland_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end TwoIsland_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/UndergroundPath_EastEntrance/map.json ================================================ { "id": "MAP_UNDERGROUND_PATH_EAST_ENTRANCE", "name": "UndergroundPath_EastEntrance", "layout": "LAYOUT_UNDERGROUND_PATH_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_UNDERGROUND_PATH_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 5, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UndergroundPath_EastEntrance_EventScript_Woman", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE8", "dest_warp_id": "0" }, { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE8", "dest_warp_id": "0" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE8", "dest_warp_id": "0" }, { "x": 7, "y": 4, "elevation": 3, "dest_map": "MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/UndergroundPath_EastEntrance/scripts.inc ================================================ UndergroundPath_EastEntrance_MapScripts:: .byte 0 UndergroundPath_EastEntrance_EventScript_Woman:: msgbox UndergroundPath_EastEntrance_Text_DoYouGoToCeladonDeptStore, MSGBOX_NPC end ================================================ FILE: data/maps/UndergroundPath_EastEntrance/text.inc ================================================ UndergroundPath_EastEntrance_Text_DoYouGoToCeladonDeptStore:: .string "The DEPARTMENT STORE in CELADON\n" .string "has a great selection.\p" .string "Do you go there very often?$" ================================================ FILE: data/maps/UndergroundPath_EastWestTunnel/map.json ================================================ { "id": "MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL", "name": "UndergroundPath_EastWestTunnel", "layout": "LAYOUT_UNDERGROUND_PATH_EAST_WEST_TUNNEL", "music": "MUS_ROUTE1", "region_map_section": "MAPSEC_UNDERGROUND_PATH_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 51, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Nidorino", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 53, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Nidorina", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 17, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Onix", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 76, "y": 3, "elevation": 3, "dest_map": "MAP_UNDERGROUND_PATH_EAST_ENTRANCE", "dest_warp_id": "3" }, { "x": 3, "y": 4, "elevation": 3, "dest_map": "MAP_UNDERGROUND_PATH_WEST_ENTRANCE", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 7, "y": 3, "elevation": 3, "item": "ITEM_POTION", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_POTION", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 17, "y": 5, "elevation": 3, "item": "ITEM_PARALYZE_HEAL", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_PARALYZE_HEAL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 31, "y": 4, "elevation": 3, "item": "ITEM_AWAKENING", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_AWAKENING", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 45, "y": 3, "elevation": 3, "item": "ITEM_BURN_HEAL", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_BURN_HEAL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 70, "y": 3, "elevation": 3, "item": "ITEM_ICE_HEAL", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ICE_HEAL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 55, "y": 2, "elevation": 3, "item": "ITEM_ETHER", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ETHER", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 62, "y": 5, "elevation": 3, "item": "ITEM_ANTIDOTE", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ANTIDOTE", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/UndergroundPath_EastWestTunnel/scripts.inc ================================================ .set LOCALID_NIDORINO_MASTER, 1 .set LOCALID_NIDORINA_MASTER, 2 .set LOCALID_ONIX_MASTER, 3 .set TRAINER, VAR_0x8009 UndergroundPath_EastWestTunnel_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, UndergroundPath_EastWestTunnel_OnTransition .byte 0 UndergroundPath_EastWestTunnel_OnTransition:: setworldmapflag FLAG_WORLD_MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL goto UndergroundPath_EastWestTunnel_MapScript_SetMasterTrainerMovementTypes end UndergroundPath_EastWestTunnel_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_NIDORINO callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, UndergroundPath_EastWestTunnel_MapScript_NidorinoMasterMovementType setvar TRAINER, MASTER_NIDORINA callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, UndergroundPath_EastWestTunnel_MapScript_NidorinaMasterMovementType setvar TRAINER, MASTER_ONIX callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, UndergroundPath_EastWestTunnel_MapScript_OnixMasterMovementType end UndergroundPath_EastWestTunnel_MapScript_NidorinoMasterMovementType:: setobjectmovementtype LOCALID_NIDORINO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return UndergroundPath_EastWestTunnel_MapScript_NidorinaMasterMovementType:: setobjectmovementtype LOCALID_NIDORINA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return UndergroundPath_EastWestTunnel_MapScript_OnixMasterMovementType:: setobjectmovementtype LOCALID_ONIX_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ================================================ FILE: data/maps/UndergroundPath_NorthEntrance/map.json ================================================ { "id": "MAP_UNDERGROUND_PATH_NORTH_ENTRANCE", "name": "UndergroundPath_NorthEntrance", "layout": "LAYOUT_UNDERGROUND_PATH_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_UNDERGROUND_PATH", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "x": 5, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UndergroundPath_NorthEntrance_EventScript_Saige", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE5", "dest_warp_id": "0" }, { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE5", "dest_warp_id": "0" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE5", "dest_warp_id": "0" }, { "x": 7, "y": 4, "elevation": 3, "dest_map": "MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/UndergroundPath_NorthEntrance/scripts.inc ================================================ UndergroundPath_NorthEntrance_MapScripts:: .byte 0 UndergroundPath_NorthEntrance_EventScript_Saige:: lock faceplayer callnative IsVersionFireRedToVarResult goto_if_eq VAR_RESULT, FALSE, UndergroundPath_NorthEntrance_EventScript_Saige_LG setvar VAR_0x8008, INGAME_TRADE_NIDORAN_F_FR call EventScript_GetInGameTradeSpeciesInfo goto_if_set FLAG_DID_MS_NIDO_TRADE, UndergroundPath_NorthEntrance_EventScript_AlreadyTraded msgbox Trade_Text_DoYouHaveMonWantToTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, UndergroundPath_NorthEntrance_EventScript_DeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, UndergroundPath_NorthEntrance_EventScript_DeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, UndergroundPath_NorthEntrance_EventScript_NotRequestedMon call EventScript_DoInGameTrade msgbox Trade_Text_ThanksYoureAPal setflag FLAG_DID_MS_NIDO_TRADE release end UndergroundPath_NorthEntrance_EventScript_Saige_LG:: setvar VAR_0x8008, INGAME_TRADE_NIDORAN_M_LG call EventScript_GetInGameTradeSpeciesInfo goto_if_set FLAG_DID_MR_NIDO_TRADE, UndergroundPath_NorthEntrance_EventScript_AlreadyTraded msgbox Trade_Text_DoYouHaveMonWantToTradeForMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, UndergroundPath_NorthEntrance_EventScript_DeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, UndergroundPath_NorthEntrance_EventScript_DeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, UndergroundPath_NorthEntrance_EventScript_NotRequestedMon call EventScript_DoInGameTrade msgbox Trade_Text_ThanksYoureAPal setflag FLAG_DID_MR_NIDO_TRADE release end UndergroundPath_NorthEntrance_EventScript_DeclineTrade:: msgbox Trade_Text_ThatsTooBad release end UndergroundPath_NorthEntrance_EventScript_NotRequestedMon:: bufferspeciesname STR_VAR_1, VAR_0x8009 msgbox Trade_Text_ThisIsNoMon release end UndergroundPath_NorthEntrance_EventScript_AlreadyTraded:: msgbox Trade_Text_HowIsMyOldMon release end ================================================ FILE: data/maps/UndergroundPath_NorthSouthTunnel/map.json ================================================ { "id": "MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL", "name": "UndergroundPath_NorthSouthTunnel", "layout": "LAYOUT_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL", "music": "MUS_ROUTE1", "region_map_section": "MAPSEC_UNDERGROUND_PATH", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 2, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Magneton", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 5, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Magnemite", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 4, "y": 3, "elevation": 3, "dest_map": "MAP_UNDERGROUND_PATH_NORTH_ENTRANCE", "dest_warp_id": "3" }, { "x": 3, "y": 60, "elevation": 3, "dest_map": "MAP_UNDERGROUND_PATH_SOUTH_ENTRANCE", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "hidden_item", "x": 5, "y": 30, "elevation": 3, "item": "ITEM_POTION", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_POTION", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 5, "y": 6, "elevation": 3, "item": "ITEM_ANTIDOTE", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ANTIDOTE", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 2, "y": 57, "elevation": 3, "item": "ITEM_BURN_HEAL", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_BURN_HEAL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 1, "y": 24, "elevation": 3, "item": "ITEM_AWAKENING", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_AWAKENING", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 6, "y": 53, "elevation": 3, "item": "ITEM_ICE_HEAL", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ICE_HEAL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 3, "y": 15, "elevation": 3, "item": "ITEM_PARALYZE_HEAL", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_PARALYZE_HEAL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 3, "y": 39, "elevation": 3, "item": "ITEM_ETHER", "flag": "FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ETHER", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/UndergroundPath_NorthSouthTunnel/scripts.inc ================================================ .set LOCALID_MAGNETON_MASTER, 1 .set LOCALID_MAGNEMITE_MASTER, 2 .set TRAINER, VAR_0x8009 UndergroundPath_NorthSouthTunnel_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, UndergroundPath_NorthSouthTunnel_OnTransition .byte 0 UndergroundPath_NorthSouthTunnel_OnTransition:: setworldmapflag FLAG_WORLD_MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL goto UndergroundPath_NorthSouthTunnel_MapScript_SetMasterTrainerMovementTypes end UndergroundPath_NorthSouthTunnel_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MAGNEMITE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, UndergroundPath_NorthSouthTunnel_MapScript_MagnemiteMasterMovementType setvar TRAINER, MASTER_MAGNETON callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, UndergroundPath_NorthSouthTunnel_MapScript_MagnetonMasterMovementType end UndergroundPath_NorthSouthTunnel_MapScript_MagnemiteMasterMovementType:: setobjectmovementtype LOCALID_MAGNEMITE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return UndergroundPath_NorthSouthTunnel_MapScript_MagnetonMasterMovementType:: setobjectmovementtype LOCALID_MAGNETON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ================================================ FILE: data/maps/UndergroundPath_SouthEntrance/map.json ================================================ { "id": "MAP_UNDERGROUND_PATH_SOUTH_ENTRANCE", "name": "UndergroundPath_SouthEntrance", "layout": "LAYOUT_UNDERGROUND_PATH_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_UNDERGROUND_PATH", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 5, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UndergroundPath_SouthEntrance_EventScript_Woman", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE6", "dest_warp_id": "0" }, { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE6", "dest_warp_id": "0" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE6", "dest_warp_id": "0" }, { "x": 7, "y": 4, "elevation": 3, "dest_map": "MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/UndergroundPath_SouthEntrance/scripts.inc ================================================ UndergroundPath_SouthEntrance_MapScripts:: .byte 0 UndergroundPath_SouthEntrance_EventScript_Woman:: msgbox UndergroundPath_SouthEntrance_Text_PeopleLoseThingsInTheDarkness, MSGBOX_NPC end ================================================ FILE: data/maps/UndergroundPath_SouthEntrance/text.inc ================================================ UndergroundPath_SouthEntrance_Text_PeopleLoseThingsInTheDarkness:: .string "People often lose things in the\n" .string "darkness of the UNDERGROUND PATH.$" ================================================ FILE: data/maps/UndergroundPath_WestEntrance/map.json ================================================ { "id": "MAP_UNDERGROUND_PATH_WEST_ENTRANCE", "name": "UndergroundPath_WestEntrance", "layout": "LAYOUT_UNDERGROUND_PATH_ENTRANCE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_UNDERGROUND_PATH_2", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 5, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UndergroundPath_WestEntrance_EventScript_BaldingMan", "flag": "0" } ], "warp_events": [ { "x": 5, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE7", "dest_warp_id": "0" }, { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE7", "dest_warp_id": "0" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_ROUTE7", "dest_warp_id": "0" }, { "x": 7, "y": 4, "elevation": 3, "dest_map": "MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/UndergroundPath_WestEntrance/scripts.inc ================================================ UndergroundPath_WestEntrance_MapScripts:: .byte 0 UndergroundPath_WestEntrance_EventScript_BaldingMan:: msgbox UndergroundPath_WestEntrance_Text_SleepyMonNearCeladon, MSGBOX_NPC end ================================================ FILE: data/maps/UndergroundPath_WestEntrance/text.inc ================================================ UndergroundPath_WestEntrance_Text_SleepyMonNearCeladon:: .string "I heard a sleepy POKéMON appeared\n" .string "out near CELADON CITY, too.$" ================================================ FILE: data/maps/UnionRoom/map.json ================================================ { "id": "MAP_UNION_ROOM", "name": "UnionRoom", "layout": "LAYOUT_UNION_ROOM", "music": "MUS_UNION_ROOM", "region_map_section": "MAPSEC_SPECIAL_AREA", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_LINK", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST", "x": 3, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UnionRoom_EventScript_Attendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 1, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UnionRoom_EventScript_Player4", "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_4" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_7", "x": 7, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UnionRoom_EventScript_Player8", "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_8" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_6", "x": 1, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UnionRoom_EventScript_Player7", "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_7" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_5", "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UnionRoom_EventScript_Player6", "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_6" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_4", "x": 13, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UnionRoom_EventScript_Player5", "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_5" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UnionRoom_EventScript_Player3", "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_3" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 13, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UnionRoom_EventScript_Player2", "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 4, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "UnionRoom_EventScript_Player1", "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_1" } ], "warp_events": [ { "x": 7, "y": 11, "elevation": 3, "dest_map": "MAP_DYNAMIC", "dest_warp_id": "WARP_ID_DYNAMIC" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/UnionRoom/scripts.inc ================================================ UnionRoom_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, UnionRoom_OnResume map_script MAP_SCRIPT_ON_TRANSITION, UnionRoom_OnTransition .byte 0 UnionRoom_OnResume:: setflag FLAG_HIDE_UNION_ROOM_PLAYER_1 setflag FLAG_HIDE_UNION_ROOM_PLAYER_2 setflag FLAG_HIDE_UNION_ROOM_PLAYER_3 setflag FLAG_HIDE_UNION_ROOM_PLAYER_4 setflag FLAG_HIDE_UNION_ROOM_PLAYER_5 setflag FLAG_HIDE_UNION_ROOM_PLAYER_6 setflag FLAG_HIDE_UNION_ROOM_PLAYER_7 setflag FLAG_HIDE_UNION_ROOM_PLAYER_8 removeobject LOCALID_UNION_ROOM_PLAYER_1 removeobject LOCALID_UNION_ROOM_PLAYER_2 removeobject LOCALID_UNION_ROOM_PLAYER_3 removeobject LOCALID_UNION_ROOM_PLAYER_4 removeobject LOCALID_UNION_ROOM_PLAYER_5 removeobject LOCALID_UNION_ROOM_PLAYER_6 removeobject LOCALID_UNION_ROOM_PLAYER_7 removeobject LOCALID_UNION_ROOM_PLAYER_8 special RunUnionRoom end UnionRoom_OnTransition:: end UnionRoom_EventScript_Player1:: lock faceplayer setvar VAR_RESULT, 1 waitstate release end UnionRoom_EventScript_Player2:: lock faceplayer setvar VAR_RESULT, 2 waitstate release end UnionRoom_EventScript_Player3:: lock faceplayer setvar VAR_RESULT, 3 waitstate release end UnionRoom_EventScript_Player4:: lock faceplayer setvar VAR_RESULT, 4 waitstate release end UnionRoom_EventScript_Player5:: lock faceplayer setvar VAR_RESULT, 5 waitstate release end UnionRoom_EventScript_Player6:: lock faceplayer setvar VAR_RESULT, 6 waitstate release end UnionRoom_EventScript_Player7:: lock faceplayer setvar VAR_RESULT, 7 waitstate release end UnionRoom_EventScript_Player8:: lock faceplayer setvar VAR_RESULT, 8 waitstate release end UnionRoom_EventScript_Attendant:: lock faceplayer setvar VAR_RESULT, 9 waitstate release end UnionRoom_EventScript_Unused:: lockall setvar VAR_RESULT, 10 waitstate releaseall end ================================================ FILE: data/maps/VermilionCity/map.json ================================================ { "id": "MAP_VERMILION_CITY", "name": "VermilionCity", "layout": "LAYOUT_VERMILION_CITY", "music": "MUS_VERMILLION", "region_map_section": "MAPSEC_VERMILION_CITY", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 12, "map": "MAP_ROUTE6" }, { "direction": "right", "offset": 10, "map": "MAP_ROUTE11" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 22, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 17, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_EventScript_OldMan1", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_2", "in_connection": false, "x": 36, "y": 10, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_EventScript_OldMan2", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MACHOP", "in_connection": false, "x": 35, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 2, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_EventScript_Machop", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 31, "y": 30, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_EventScript_Sailor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 24, "y": 33, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_EventScript_FerrySailor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 19, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_VERMILION_CITY_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 25, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_EventScript_OaksAide", "flag": "FLAG_HIDE_VERMILION_CITY_OAKS_AIDE" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BLACK_BELT", "in_connection": false, "x": 40, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Machamp", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BIRD_KEEPER", "in_connection": false, "x": 12, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Farfetchd", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 22, "y": 34, "elevation": 3, "dest_map": "MAP_SSANNE_EXTERIOR", "dest_warp_id": "1" }, { "x": 23, "y": 34, "elevation": 3, "dest_map": "MAP_SSANNE_EXTERIOR", "dest_warp_id": "1" }, { "x": 24, "y": 34, "elevation": 3, "dest_map": "MAP_SSANNE_EXTERIOR", "dest_warp_id": "1" }, { "x": 9, "y": 6, "elevation": 0, "dest_map": "MAP_VERMILION_CITY_HOUSE1", "dest_warp_id": "1" }, { "x": 15, "y": 6, "elevation": 3, "dest_map": "MAP_VERMILION_CITY_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 12, "y": 17, "elevation": 0, "dest_map": "MAP_VERMILION_CITY_POKEMON_FAN_CLUB", "dest_warp_id": "1" }, { "x": 19, "y": 17, "elevation": 0, "dest_map": "MAP_VERMILION_CITY_HOUSE2", "dest_warp_id": "1" }, { "x": 29, "y": 17, "elevation": 0, "dest_map": "MAP_VERMILION_CITY_MART", "dest_warp_id": "1" }, { "x": 28, "y": 24, "elevation": 0, "dest_map": "MAP_VERMILION_CITY_HOUSE3", "dest_warp_id": "1" }, { "x": 14, "y": 25, "elevation": 0, "dest_map": "MAP_VERMILION_CITY_GYM", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 22, "y": 33, "elevation": 0, "var": "VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER", "var_value": "0", "script": "VermilionCity_EventScript_CheckTicketLeft" }, { "type": "trigger", "x": 23, "y": 33, "elevation": 0, "var": "VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER", "var_value": "0", "script": "VermilionCity_EventScript_CheckTicketRight" }, { "type": "trigger", "x": 22, "y": 32, "elevation": 0, "var": "VAR_TEMP_1", "var_value": "0", "script": "VermilionCity_EventScript_ExitedTicketCheck" }, { "type": "trigger", "x": 23, "y": 32, "elevation": 0, "var": "VAR_TEMP_1", "var_value": "0", "script": "VermilionCity_EventScript_ExitedTicketCheck" } ], "bg_events": [ { "type": "sign", "x": 33, "y": 6, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_EventScript_CitySign" }, { "type": "sign", "x": 10, "y": 17, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_EventScript_PokemonFanClubSign" }, { "type": "sign", "x": 10, "y": 24, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_EventScript_GymSign" }, { "type": "sign", "x": 34, "y": 18, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_EventScript_HarborSign" }, { "type": "sign", "x": 45, "y": 17, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_EventScript_SnorlaxNotice" }, { "type": "hidden_item", "x": 14, "y": 11, "elevation": 3, "item": "ITEM_MAX_ETHER", "flag": "FLAG_HIDDEN_ITEM_VERMILION_CITY_MAX_ETHER", "quantity": 1, "underfoot": false } ], "level_scaling": "0" } ================================================ FILE: data/maps/VermilionCity/scripts.inc ================================================ .equ LOCALID_FERRY_SAILOR, 6 .set LOCALID_MACHAMP_MASTER, 9 .set LOCALID_FARFETCHD_MASTER, 10 .set TRAINER, VAR_0x8009 .equ HAS_TICKETS, 16 .equ NEEDS_SHOW_EON, 17 .equ NEEDS_SHOW_AURORA, 18 .equ NEEDS_SHOW_MYSTIC, 19 .equ NEEDS_SHOW_OLD_SEA_MAP, 20 .equ HAS_NO_TICKETS, 21 .equ F, 1 .equ N, 2 .equ NF, 3 .equ B, 4 .equ BF, 5 .equ BN, 6 .equ BNF, 7 .equ S, 8 .equ SF, 9 .equ SN, 10 .equ SNF, 11 .equ SB, 12 .equ SBF, 13 .equ SBN, 14 .equ SBNF, 15 VermilionCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, VermilionCity_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, VermilionCity_OnFrame .byte 0 VermilionCity_OnFrame:: map_script_2 VAR_MAP_SCENE_VERMILION_CITY, 2, VermilionCity_EventScript_ExitSSAnne .2byte 0 VermilionCity_EventScript_ExitSSAnne:: lockall applymovement OBJ_EVENT_ID_PLAYER, VermilionCity_Movement_ExitSSAnne waitmovement 0 setvar VAR_MAP_SCENE_VERMILION_CITY, 3 releaseall end VermilionCity_Movement_ExitSSAnne:: walk_up walk_up step_end VermilionCity_OnTransition:: setworldmapflag FLAG_WORLD_MAP_VERMILION_CITY call_if_set FLAG_TALKED_TO_OAKS_AIDE_IN_VERMILION, VermilionCity_EventScript_HideOaksAide goto VermilionCity_MapScript_SetMasterTrainerMovementTypes end VermilionCity_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MACHAMP callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, VermilionCity_MapScript_MachampMasterMovementType setvar TRAINER, MASTER_FARFETCHD callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, VermilionCity_MapScript_FarfetchdMasterMovementType end VermilionCity_MapScript_MachampMasterMovementType:: setobjectmovementtype LOCALID_MACHAMP_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return VermilionCity_MapScript_FarfetchdMasterMovementType:: setobjectmovementtype LOCALID_FARFETCHD_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return VermilionCity_EventScript_HideOaksAide:: setflag FLAG_HIDE_VERMILION_CITY_OAKS_AIDE return VermilionCity_EventScript_Woman:: msgbox VermilionCity_Text_GrimerMultipliesInSludge, MSGBOX_NPC end VermilionCity_EventScript_OldMan1:: lock faceplayer goto_if_eq VAR_MAP_SCENE_VERMILION_CITY, 3, VermilionCity_EventScript_OldMan1SSAnneLeft msgbox VermilionCity_Text_DidYouSeeSSAnneInHarbor release end VermilionCity_EventScript_OldMan1SSAnneLeft:: msgbox VermilionCity_Text_SSAnneHasDepartedForYear release end VermilionCity_EventScript_FerrySailor:: lock faceplayer goto_if_eq VAR_MAP_SCENE_VERMILION_CITY, 3, VermilionCity_EventScript_CheckSeagallopPresent msgbox VermilionCity_Text_WelcomeToTheSSAnne release end VermilionCity_EventScript_CheckSeagallopPresent:: setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY goto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, VermilionCity_EventScript_ChooseSeagallopDestRainbowPass goto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 1, VermilionCity_EventScript_ChooseSeagallopDestTriPass msgbox VermilionCity_Text_TheShipSetSail release end VermilionCity_EventScript_SetSailToBattleTower:: msgbox VermilionCity_Text_Seagallop13Departing setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY setvar VAR_0x8006, SEAGALLOP_BATTLE_TOWER goto EventScript_SetSail end VermilionCity_EventScript_SetSailToSouthernIsland:: msgbox VermilionCity_Text_Seagallop13Departing setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY setvar VAR_0x8006, SEAGALLOP_SOUTHERN_ISLAND goto EventScript_SetSail end VermilionCity_EventScript_SetSailToFarawayIsland:: msgbox VermilionCity_Text_Seagallop14Departing setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY setvar VAR_0x8006, SEAGALLOP_FARAWAY_ISLAND goto EventScript_SetSail end VermilionCity_EventScript_ChooseSeagallopDestRainbowPass:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording setvar VAR_RESULT, 0 callnative CheckEventTickets switch VAR_RESULT case NEEDS_SHOW_EON, VermilionCity_EventScript_ShowEonTicket case NEEDS_SHOW_AURORA, VermilionCity_EventScript_ShowAuroraTicket case NEEDS_SHOW_MYSTIC, VermilionCity_EventScript_ShowMysticTicket case NEEDS_SHOW_OLD_SEA_MAP, VermilionCity_EventScript_ShowOldSeaMap case HAS_TICKETS, VermilionCity_EventScript_HasTicketsRainbowPass setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY message VermilionCity_Text_BoardSeagallopRainbowPass waitmessage multichoice 13, 6, MULTICHOICE_SEVII_BATTLE_TOWER, FALSE switch VAR_RESULT case 0, EventScript_SeviiDestinationsPage1 case 1, VermilionCity_EventScript_SetSailToBattleTower case 2, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_HasTicketsRainbowPass:: setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY message VermilionCity_Text_BoardSeagallopRainbowPass waitmessage multichoice 13, 5, MULTICHOICE_SEVII_BATTLE_TOWER_OTHER, FALSE switch VAR_RESULT case 0, EventScript_SeviiDestinationsPage1 case 1, VermilionCity_EventScript_SetSailToBattleTower case 2, VermilionCity_EventScript_EventIslandsMultichoice case 3, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_ShowOldSeaMap:: setflag FLAG_SHOWN_OLD_SEA_MAP msgbox VermilionCity_Text_OldSeaMapTakeYouToFarawayIsland goto VermilionCity_EventScript_CheckSeagallopPresentTrigger VermilionCity_EventScript_ShowMysticTicket:: setflag FLAG_SHOWN_MYSTIC_TICKET msgbox VermilionCity_Text_OhMysticTicketTakeYouToNavelRock goto VermilionCity_EventScript_CheckSeagallopPresentTrigger VermilionCity_EventScript_ShowAuroraTicket:: setflag FLAG_SHOWN_AURORA_TICKET msgbox VermilionCity_Text_OhAuroraTicketTakeYouToBirthIsland goto VermilionCity_EventScript_CheckSeagallopPresentTrigger EventScript_SailToNavelRock:: msgbox VermilionCity_Text_Seagallop10Departing setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY setvar VAR_0x8006, SEAGALLOP_NAVEL_ROCK goto EventScript_SetSail end EventScript_SailToBirthIsland:: msgbox VermilionCity_Text_Seagallop12Departing setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY setvar VAR_0x8006, SEAGALLOP_BIRTH_ISLAND goto EventScript_SetSail end VermilionCity_EventScript_ChooseSeagallopDestTriPass:: setvar VAR_RESULT, 0 callnative CheckEventTickets switch VAR_RESULT case NEEDS_SHOW_EON, VermilionCity_EventScript_ShowEonTicket case NEEDS_SHOW_AURORA, VermilionCity_EventScript_ShowAuroraTicket case NEEDS_SHOW_MYSTIC, VermilionCity_EventScript_ShowMysticTicket case NEEDS_SHOW_OLD_SEA_MAP, VermilionCity_EventScript_ShowOldSeaMap case HAS_TICKETS, VermilionCity_EventScript_HasTicketsTriPass message VermilionCity_Text_BoardSeagallopTriPass waitmessage setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY VermilionCity_EventScript_TriPassOriginalMultichoice: multichoice 19, 5, MULTICHOICE_SEAGALLOP_123, FALSE switch VAR_RESULT case 0, EventScript_SailToOneIsland2 case 1, EventScript_SailToTwoIsland2 case 2, EventScript_SailToThreeIsland2 case 3, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_ShowEonTicket:: setflag FLAG_SHOWN_EON_TICKET msgbox VermilionCity_Text_OhEonTicketTakeYouToSouthernIsland goto VermilionCity_EventScript_CheckSeagallopPresentTrigger VermilionCity_EventScript_HasTicketsTriPass:: message VermilionCity_Text_BoardSeagallopTriPass waitmessage setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY multichoice 13, 6, MULTICHOICE_SEVII_OTHER, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_TriPassOriginalMultichoice case 1, VermilionCity_EventScript_EventIslandsMultichoice case 2, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_EventIslandsMultichoice:: setvar VAR_RESULT, 1 callnative CheckEventTickets buffernumberstring STR_VAR_1, VAR_RESULT switch VAR_RESULT case F, VermilionCity_EventScript_Faraway case N, VermilionCity_EventScript_Navel case NF, VermilionCity_EventScript_NavelFaraway case B, VermilionCity_EventScript_Birth case BF, VermilionCity_EventScript_BirthFaraway case BN, VermilionCity_EventScript_BirthNavel case BNF, VermilionCity_EventScript_BirthNavelFaraway case S, VermilionCity_EventScript_Southern case SF, VermilionCity_EventScript_SouthernFaraway case SN, VermilionCity_EventScript_SouthernNavel case SNF, VermilionCity_EventScript_SouthernNavelFaraway case SB, VermilionCity_EventScript_SouthernBirth case SBF, VermilionCity_EventScript_SouthernBirthFaraway case SBN, VermilionCity_EventScript_SouthernBirthNavel case SBNF, VermilionCity_EventScript_SouthernBirthNavelFaraway end VermilionCity_EventScript_Faraway:: multichoice 13, 8, MULTICHOICE_FARAWAY, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_SetSailToFarawayIsland case 1, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_Navel:: multichoice 13, 8, MULTICHOICE_NAVEL, FALSE switch VAR_RESULT case 0, EventScript_SailToNavelRock case 1, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_NavelFaraway:: multichoice 13, 6, MULTICHOICE_NAVEL_FARAWAY, FALSE switch VAR_RESULT case 0, EventScript_SailToNavelRock case 1, VermilionCity_EventScript_SetSailToFarawayIsland case 2, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_Birth:: multichoice 13, 8, MULTICHOICE_BIRTH, FALSE switch VAR_RESULT case 0, EventScript_SailToBirthIsland case 1, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_BirthFaraway:: multichoice 13, 6, MULTICHOICE_BIRTH_FARAWAY, FALSE switch VAR_RESULT case 0, EventScript_SailToBirthIsland case 1, VermilionCity_EventScript_SetSailToFarawayIsland case 2, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_BirthNavel:: multichoice 13, 6, MULTICHOICE_BIRTH_NAVEL, FALSE switch VAR_RESULT case 0, EventScript_SailToBirthIsland case 1, EventScript_SailToNavelRock case 2, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_BirthNavelFaraway:: multichoice 13, 5, MULTICHOICE_BIRTH_NAVEL_FARAWAY, FALSE switch VAR_RESULT case 0, EventScript_SailToBirthIsland case 1, EventScript_SailToNavelRock case 2, VermilionCity_EventScript_SetSailToFarawayIsland case 3, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_Southern:: multichoice 13, 8, MULTICHOICE_SOUTHERN, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_SetSailToSouthernIsland case 1, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_SouthernFaraway:: multichoice 13, 6, MULTICHOICE_SOUTHERN_FARAWAY, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_SetSailToSouthernIsland case 1, VermilionCity_EventScript_SetSailToFarawayIsland case 2, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_SouthernNavel:: multichoice 13, 6, MULTICHOICE_SOUTHERN_NAVEL, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_SetSailToSouthernIsland case 1, EventScript_SailToNavelRock case 2, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_SouthernNavelFaraway:: multichoice 13, 5, MULTICHOICE_SOUTHERN_NAVEL_FARAWAY, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_SetSailToSouthernIsland case 1, EventScript_SailToNavelRock case 2, VermilionCity_EventScript_SetSailToFarawayIsland case 3, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_SouthernBirth:: multichoice 13, 6, MULTICHOICE_SOUTHERN_BIRTH, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_SetSailToSouthernIsland case 1, EventScript_SailToBirthIsland case 2, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_SouthernBirthFaraway:: multichoice 13, 5, MULTICHOICE_SOUTHERN_BIRTH_FARAWAY, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_SetSailToSouthernIsland case 1, EventScript_SailToBirthIsland case 2, VermilionCity_EventScript_SetSailToFarawayIsland case 3, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_SouthernBirthNavel:: multichoice 13, 5, MULTICHOICE_SOUTHERN_BIRTH_NAVEL, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_SetSailToSouthernIsland case 1, EventScript_SailToBirthIsland case 2, EventScript_SailToNavelRock case 3, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_SouthernBirthNavelFaraway:: multichoice 13, 3, MULTICHOICE_SOUTHERN_BIRTH_NAVEL_FARAWAY, FALSE switch VAR_RESULT case 0, VermilionCity_EventScript_SetSailToSouthernIsland case 1, EventScript_SailToBirthIsland case 2, EventScript_SailToNavelRock case 3, VermilionCity_EventScript_SetSailToFarawayIsland case 4, EventScript_CancelSail case 127, EventScript_CancelSail end VermilionCity_EventScript_CheckTicketLeft:: lockall goto VermilionCity_EventScript_CheckTicket end VermilionCity_EventScript_CheckTicketRight:: lockall goto VermilionCity_EventScript_CheckTicket end VermilionCity_EventScript_ExitedTicketCheck:: lockall setvar VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER, 0 releaseall end VermilionCity_EventScript_CheckTicket:: textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_FERRY_SAILOR, Common_Movement_WalkInPlaceFasterLeft applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 goto_if_eq VAR_MAP_SCENE_VERMILION_CITY, 3, VermilionCity_EventScript_CheckSeagallopPresentTrigger msgbox VermilionCity_Text_DoYouHaveATicket goto_if_unset FLAG_GOT_SS_TICKET, VermilionCity_EventScript_DontHaveSSTicket msgbox VermilionCity_Text_FlashedSSTicket setvar VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER, 1 releaseall end VermilionCity_EventScript_DontHaveSSTicket:: msgbox VermilionCity_Text_DontHaveNeededSSTicket closemessage goto VermilionCity_EventScript_WalkUpPier end VermilionCity_EventScript_CheckSeagallopPresentTrigger:: setvar VAR_0x8004, SEAGALLOP_VERMILION_CITY goto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, VermilionCity_EventScript_ChooseSeagallopDestRainbowPass goto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 1, VermilionCity_EventScript_ChooseSeagallopDestTriPass msgbox VermilionCity_Text_TheShipSetSail closemessage goto VermilionCity_EventScript_WalkUpPier end VermilionCity_EventScript_Sailor:: msgbox VermilionCity_Text_SSAnneVisitsOnceAYear, MSGBOX_NPC end VermilionCity_EventScript_OaksAide:: lock faceplayer setflag FLAG_TALKED_TO_OAKS_AIDE_IN_VERMILION msgbox VermilionCity_Text_Route2AideHasPackageForYou release end VermilionCity_EventScript_OldMan2:: msgbox VermilionCity_Text_BuildingOnThisLand, MSGBOX_NPC end VermilionCity_EventScript_Machop:: lock faceplayer waitse playmoncry SPECIES_MACHOP, CRY_MODE_NORMAL msgbox VermilionCity_Text_Machop waitmoncry msgbox VermilionCity_Text_MachopStompingLandFlat release end VermilionCity_EventScript_CitySign:: msgbox VermilionCity_Text_CitySign, MSGBOX_SIGN end VermilionCity_EventScript_SnorlaxNotice:: msgbox VermilionCity_Text_SnorlaxBlockingRoute12, MSGBOX_SIGN end VermilionCity_EventScript_PokemonFanClubSign:: msgbox VermilionCity_Text_PokemonFanClubSign, MSGBOX_SIGN end VermilionCity_EventScript_GymSign:: lockall famechecker FAMECHECKER_LTSURGE, 0 msgbox VermilionCity_Text_GymSign releaseall end VermilionCity_EventScript_HarborSign:: msgbox VermilionCity_Text_VermilionHarbor, MSGBOX_SIGN end ================================================ FILE: data/maps/VermilionCity/text.inc ================================================ VermilionCity_Text_GrimerMultipliesInSludge:: .string "We're careful about pollution here.\p" .string "We've heard GRIMER multiplies in\n" .string "toxic sludge.$" VermilionCity_Text_DidYouSeeSSAnneInHarbor:: .string "Did you see the S.S. ANNE moored\n" .string "in the harbor?$" VermilionCity_Text_SSAnneHasDepartedForYear:: .string "So, the S.S. ANNE has departed?\p" .string "She'll be back in VERMILION about\n" .string "this time next year.$" VermilionCity_Text_BuildingOnThisLand:: .string "I'm putting up a building on this\n" .string "plot of land. I own it all.\p" .string "My POKéMON is tamping the land\n" .string "to lay the foundation.$" VermilionCity_Text_Machop:: .string "MACHOP: Guoh! Gogogoh!$" VermilionCity_Text_MachopStompingLandFlat:: .string "A MACHOP is stomping the land flat.$" VermilionCity_Text_SSAnneVisitsOnceAYear:: .string "The S.S. ANNE is a famous luxury\n" .string "cruise ship.\p" .string "It visits VERMILION once a year.$" VermilionCity_Text_CitySign:: .string "VERMILION CITY\n" .string "The Port of Exquisite Sunsets$" VermilionCity_Text_SnorlaxBlockingRoute12:: .string "NOTICE!\p" .string "ROUTE 12 may be blocked off by a\n" .string "sleeping POKéMON.\p" .string "Detour through ROCK TUNNEL to\n" .string "LAVENDER TOWN.\p" .string "VERMILION POLICE$" VermilionCity_Text_PokemonFanClubSign:: .string "POKéMON FAN CLUB\n" .string "All POKéMON fans welcome!$" VermilionCity_Text_GymSign:: .string "VERMILION CITY POKéMON GYM\n" .string "LEADER: LT. SURGE\l" .string "The Lightning American!$" VermilionCity_Text_VermilionHarbor:: .string "VERMILION HARBOR$" VermilionCity_Text_WelcomeToTheSSAnne:: .string "Welcome to the S.S. ANNE!$" VermilionCity_Text_DoYouHaveATicket:: .string "Welcome to the S.S. ANNE!\p" .string "Excuse me, do you have a ticket?$" VermilionCity_Text_FlashedSSTicket:: .string "{FONT_NORMAL}{PLAYER} flashed the S.S. TICKET!\p" .string "{FONT_MALE}Great!\n" .string "Welcome to the S.S. ANNE!$" VermilionCity_Text_DontHaveNeededSSTicket:: .string "{FONT_NORMAL}{PLAYER} doesn't have the needed\n" .string "S.S. TICKET.\p" .string "{FONT_MALE}Sorry!\p" .string "You need a ticket to get aboard.$" VermilionCity_Text_TheShipSetSail:: .string "The ship set sail.$" VermilionCity_Text_BoardSeagallopTriPass:: .string "Ah, you have a TRI-PASS.\p" .string "Would you like to board\n" .string "a SEAGALLOP ferry?$" VermilionCity_Text_Seagallop7Departing:: .string "Okay, everything's in order.\p" .string "SEAGALLOP HI-SPEED 7 will be\n" .string "departing immediately.$" VermilionCity_Text_BoardSeagallopRainbowPass:: .string "Ah, you have a RAINBOW PASS.\p" .string "Would you like to board\n" .string "a SEAGALLOP ferry?$" VermilionCity_Text_OldSeaMapTakeYouToFarawayIsland:: .string "What do you have there?\n" .string "A tattered old map, eh?\p" .string "Let's have a look.\n" .string "… … … … … …\p" .string "Where you're trying to go is an\n" .string "island that's far, far away.\p" .string "I can take you there, but it'll\n" .string "be a long trip.\p" .string "Let me know when you're ready\n" .string "to leave.$" VermilionCity_Text_OhEonTicketTakeYouToSouthernIsland:: .string "Oh! That's an EON TICKET!\n" .string "Now that is rare.\p" .string "It points to a tiny spit of an\n" .string "island south of HOENN.\p" .string "We'll be happy to take you to\n" .string "SOUTHERN ISLAND anytime.$" VermilionCity_Text_OhMysticTicketTakeYouToNavelRock:: .string "Oh! That's a MYSTICTICKET!\n" .string "Now that is rare.\p" .string "We'll be happy to take you to\n" .string "NAVEL ROCK anytime.$" VermilionCity_Text_OhAuroraTicketTakeYouToBirthIsland:: .string "Oh! That's an AURORATICKET!\n" .string "Now that is rare.\p" .string "We'll be happy to take you to\n" .string "BIRTH ISLAND anytime.$" VermilionCity_Text_BoardSeagallopFerry:: .string "Would you like to board\n" .string "a SEAGALLOP ferry?$" VermilionCity_Text_Seagallop10Departing:: .string "Okay, everything's in order for you\n" .string "to board a special ferry.\p" .string "SEAGALLOP HI-SPEED 10 will be\n" .string "departing immediately.$" VermilionCity_Text_Seagallop12Departing:: .string "Okay, everything's in order for you\n" .string "to board a special ferry.\p" .string "SEAGALLOP HI-SPEED 12 will be\n" .string "departing immediately.$" VermilionCity_Text_Seagallop14Departing:: .string "Okay, everything's in order for you\n" .string "to board a special ferry.\p" .string "SEAGALLOP HI-SPEED 14 will be\n" .string "departing immediately.$" VermilionCity_Text_Seagallop13Departing:: .string "Okay, everything's in order for you\n" .string "to board a special ferry to HOENN.\p" .string "SEAGALLOP HI-SPEED 13 will be\n" .string "departing immediately.$" VermilionCity_Text_Route2AideHasPackageForYou:: .string "Oh, hello, {PLAYER}!\n" .string "How are you doing?\p" .string "It's me, one of PROF. OAK's AIDES.\p" .string "Did you meet the other AIDE?\p" .string "He had a package from PROF. OAK\n" .string "for you, {PLAYER}.\p" .string "He said he'd look for you around\n" .string "ROUTE 2, {PLAYER}.\p" .string "If you're in the ROUTE 2 area,\n" .string "please look for him.$" ================================================ FILE: data/maps/VermilionCity_Gym/map.json ================================================ { "id": "MAP_VERMILION_CITY_GYM", "name": "VermilionCity_Gym", "layout": "LAYOUT_VERMILION_CITY_GYM", "music": "MUS_GYM", "region_map_section": "MAPSEC_VERMILION_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LT_SURGE", "in_connection": false, "x": 5, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_Gym_EventScript_LtSurge", "flag": "FLAG_TEMP_2" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ENGINEER", "x": 2, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "VermilionCity_Gym_EventScript_Baily", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "in_connection": false, "x": 8, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "VermilionCity_Gym_EventScript_Dwayne", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GYM_GUY", "in_connection": false, "x": 4, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_Gym_EventScript_GymGuy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 7, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "VermilionCity_Gym_EventScript_Tucker", "flag": "0" } ], "warp_events": [ { "x": 4, "y": 19, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "9" }, { "x": 5, "y": 19, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "9" }, { "x": 6, "y": 19, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "9" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 3, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 7, "y": 17, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 1, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan1" }, { "type": "sign", "x": 3, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan2" }, { "type": "sign", "x": 5, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan3" }, { "type": "sign", "x": 7, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan4" }, { "type": "sign", "x": 9, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan5" }, { "type": "sign", "x": 1, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan6" }, { "type": "sign", "x": 3, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan7" }, { "type": "sign", "x": 5, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan8" }, { "type": "sign", "x": 7, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan9" }, { "type": "sign", "x": 9, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan10" }, { "type": "sign", "x": 1, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan11" }, { "type": "sign", "x": 3, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan12" }, { "type": "sign", "x": 5, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan13" }, { "type": "sign", "x": 7, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan14" }, { "type": "sign", "x": 9, "y": 14, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_Gym_EventScript_TrashCan15" } ], "level_scaling": "2" } ================================================ FILE: data/maps/VermilionCity_Gym/scripts.inc ================================================ .equ FOUND_FIRST_SWITCH, FLAG_TEMP_1 .equ SWITCH1_ID, VAR_0x8004 .equ SWITCH2_ID, VAR_0x8005 .equ TRASH_CAN_ID, VAR_0x8008 .equ CHECK_VISITOR_STATE, 6 .equ TYPE, VAR_0x8003 .equ ARGUMENT, VAR_0x8004 VermilionCity_Gym_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, VermilionCity_Gym_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, VermilionCity_Gym_OnTransition .byte 0 VermilionCity_Gym_OnLoad:: call_if_set FOUND_FIRST_SWITCH, VermilionCity_Gym_EventScript_SetOneBeamOff call_if_set FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES, VermilionCity_Gym_EventScript_SetBeamsOff end VermilionCity_Gym_EventScript_SetOneBeamOff:: setmetatile 3, 6, METATILE_VermilionGym_Beam_Node_TopLeft_HalfOn, 1 setmetatile 4, 6, METATILE_VermilionGym_Beam_Node_TopLeft_Edge_HalfOn, 1 setmetatile 5, 6, METATILE_VermilionGym_Beam_MidTop_HalfOn, 1 setmetatile 6, 6, METATILE_VermilionGym_Beam_Node_TopRight_Edge_HalfOn, 1 setmetatile 7, 6, METATILE_VermilionGym_Beam_Node_TopRight_HalfOn, 1 setmetatile 3, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_HalfOn, 1 setmetatile 4, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_HalfOn, 1 setmetatile 5, 7, METATILE_VermilionGym_Beam_MidBottom_HalfOn, 1 setmetatile 6, 7, METATILE_VermilionGym_Beam_Node_BottomRight_Edge_HalfOn, 1 setmetatile 7, 7, METATILE_VermilionGym_Beam_Node_BottomRight_HalfOn, 1 return VermilionCity_Gym_EventScript_SetBeamsOff:: setmetatile 3, 6, METATILE_VermilionGym_Beam_Node_TopLeft_Off, 1 setmetatile 4, 6, METATILE_VermilionGym_Beam_Node_TopLeft_Edge_Off, 0 setmetatile 5, 6, METATILE_VermilionGym_Floor, 0 setmetatile 6, 6, METATILE_VermilionGym_Beam_Node_TopRight_Edge_Off, 0 setmetatile 7, 6, METATILE_VermilionGym_Beam_Node_TopRight_Off, 1 setmetatile 3, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_Off, 1 setmetatile 4, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_Off, 0 setmetatile 5, 7, METATILE_VermilionGym_Floor, 0 setmetatile 6, 7, METATILE_VermilionGym_Beam_Node_BottomRight_Edge_Off, 0 setmetatile 7, 7, METATILE_VermilionGym_Beam_Node_BottomRight_Off, 1 return VermilionCity_Gym_OnTransition:: call VermilionCity_Gym_EventScript_InitTrashCans setvar TYPE, CHECK_VISITOR_STATE copyvar VAR_0x800A, ARGUMENT setvar ARGUMENT, FAMECHECKER_LTSURGE callnative UseBattleHouseVar call_if_eq VAR_RESULT, 1, VermilionCity_Gym_EventScript_HideLtSurge copyvar ARGUMENT, VAR_0x800A end VermilionCity_Gym_EventScript_HideLtSurge:: setflag FLAG_TEMP_2 return VermilionCity_Gym_EventScript_InitTrashCans:: goto_if_set FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES, EventScript_Return special SetVermilionTrashCans copyvar VAR_TEMP_0, SWITCH1_ID copyvar VAR_TEMP_1, SWITCH2_ID return VermilionCity_Gym_EventScript_TrashCan1:: lockall setvar TRASH_CAN_ID, 1 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan2:: lockall setvar TRASH_CAN_ID, 2 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan3:: lockall setvar TRASH_CAN_ID, 3 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan4:: lockall setvar TRASH_CAN_ID, 4 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan5:: lockall setvar TRASH_CAN_ID, 5 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan6:: lockall setvar TRASH_CAN_ID, 6 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan7:: lockall setvar TRASH_CAN_ID, 7 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan8:: lockall setvar TRASH_CAN_ID, 8 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan9:: lockall setvar TRASH_CAN_ID, 9 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan10:: lockall setvar TRASH_CAN_ID, 10 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan11:: lockall setvar TRASH_CAN_ID, 11 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan12:: lockall setvar TRASH_CAN_ID, 12 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan13:: lockall setvar TRASH_CAN_ID, 13 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan14:: lockall setvar TRASH_CAN_ID, 14 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan15:: lockall setvar TRASH_CAN_ID, 15 goto VermilionCity_Gym_EventScript_TrashCan end VermilionCity_Gym_EventScript_TrashCan:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording copyvar SWITCH1_ID, VAR_TEMP_0 copyvar SWITCH2_ID, VAR_TEMP_1 goto_if_set FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES, VermilionCity_Gym_EventScript_LocksAlreadyOpen goto_if_set FOUND_FIRST_SWITCH, VermilionCity_Gym_EventScript_TrySwitchTwo goto_if_eq SWITCH1_ID, TRASH_CAN_ID, VermilionCity_Gym_EventScript_FoundSwitchOne msgbox VermilionCity_Gym_Text_NopeOnlyTrashHere releaseall end VermilionCity_Gym_EventScript_FoundSwitchOne:: msgbox VermilionCity_Gym_Text_SwitchUnderTrashFirstLockOpened playse SE_PIN waitse call VermilionCity_Gym_EventScript_SetOneBeamOff special DrawWholeMapView setflag FOUND_FIRST_SWITCH releaseall end VermilionCity_Gym_EventScript_TrySwitchTwo:: goto_if_eq SWITCH2_ID, TRASH_CAN_ID, VermilionCity_Gym_EventScript_FoundSwitchTwo msgbox VermilionCity_Gym_Text_OnlyTrashLocksWereReset clearflag FOUND_FIRST_SWITCH special SetVermilionTrashCans copyvar VAR_TEMP_0, SWITCH1_ID copyvar VAR_TEMP_1, SWITCH2_ID call VermilionCity_Gym_EventScript_SetBeamsOn special DrawWholeMapView releaseall end VermilionCity_Gym_EventScript_FoundSwitchTwo:: msgbox VermilionCity_Gym_Text_SecondLockOpened closemessage call VermilionCity_Gym_EventScript_SetBeamsOff special DrawWholeMapView playse SE_UNLOCK waitse setflag FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES releaseall end VermilionCity_Gym_EventScript_LocksAlreadyOpen:: msgbox VermilionCity_Gym_Text_NopeOnlyTrashHere releaseall end VermilionCity_Gym_EventScript_SetBeamsOn:: setmetatile 3, 6, METATILE_VermilionGym_Beam_Node_TopLeft_On, 1 setmetatile 4, 6, METATILE_VermilionGym_Beam_Node_TopLeft_Edge_On, 1 setmetatile 5, 6, METATILE_VermilionGym_Beam_MidTop, 1 setmetatile 6, 6, METATILE_VermilionGym_Beam_Node_TopRight_Edge_On, 1 setmetatile 7, 6, METATILE_VermilionGym_Beam_Node_TopRight_On, 1 setmetatile 3, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_On, 1 setmetatile 4, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_On, 1 setmetatile 5, 7, METATILE_VermilionGym_Beam_MidBottom, 1 setmetatile 6, 7, METATILE_VermilionGym_Beam_Node_BottomRight_Edge_On, 1 setmetatile 7, 7, METATILE_VermilionGym_Beam_Node_BottomRight_On, 1 return VermilionCity_Gym_EventScript_LtSurge:: famechecker FAMECHECKER_LTSURGE, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, VermilionCity_Gym_EventScript_LtSurge_ChallengeMode trainerbattle_single TRAINER_LEADER_LT_SURGE, VermilionCity_Gym_Text_LtSurgeIntro, VermilionCity_Gym_Text_LtSurgeDefeat, VermilionCity_Gym_EventScript_DefeatedLtSurge, NO_MUSIC settrainerflag TRAINER_LEADER_LT_SURGE_CHALLENGE goto_if_unset FLAG_GOT_TM34_FROM_SURGE, VermilionCity_Gym_EventScript_GiveTM34 msgbox VermilionCity_Gym_Text_LtSurgePostBattle release end VermilionCity_Gym_EventScript_LtSurge_ChallengeMode:: trainerbattle_single TRAINER_LEADER_LT_SURGE_CHALLENGE, VermilionCity_Gym_Text_LtSurgeIntro, VermilionCity_Gym_Text_LtSurgeDefeat, VermilionCity_Gym_EventScript_DefeatedLtSurge, NO_MUSIC settrainerflag TRAINER_LEADER_LT_SURGE goto_if_unset FLAG_GOT_TM34_FROM_SURGE, VermilionCity_Gym_EventScript_GiveTM34 msgbox VermilionCity_Gym_Text_LtSurgePostBattle release end VermilionCity_Gym_EventScript_DefeatedLtSurge:: famechecker FAMECHECKER_LTSURGE, 1 call_if_unset FLAG_GOT_HM05, VermilionCity_Gym_EventScript_ShowOaksAide clearflag FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL setflag FLAG_DEFEATED_LT_SURGE setflag FLAG_BADGE03_GET set_gym_trainers 3 goto VermilionCity_Gym_EventScript_GiveTM34 end VermilionCity_Gym_EventScript_ShowOaksAide:: clearflag FLAG_HIDE_VERMILION_CITY_OAKS_AIDE return VermilionCity_Gym_EventScript_GiveTM34:: msgbox VermilionCity_Gym_Text_ExplainThunderBadgeTakeThis checkitemspace ITEM_TM34 goto_if_eq VAR_RESULT, FALSE, VermilionCity_Gym_EventScript_NoRoomForTM34 giveitem_msg VermilionCity_Gym_Text_ReceivedTM34FromLtSurge, ITEM_TM34 setflag FLAG_GOT_TM34_FROM_SURGE msgbox VermilionCity_Gym_Text_ExplainTM34 release end VermilionCity_Gym_EventScript_NoRoomForTM34:: msgbox VermilionCity_Gym_Text_MakeRoomInYourBag release end VermilionCity_Gym_EventScript_Dwayne:: trainerbattle_single TRAINER_SAILOR_DWAYNE, VermilionCity_Gym_Text_DwayneIntro, VermilionCity_Gym_Text_DwayneDefeat famechecker FAMECHECKER_LTSURGE, 4 msgbox VermilionCity_Gym_Text_DwaynePostBattle, MSGBOX_AUTOCLOSE end VermilionCity_Gym_EventScript_Baily:: trainerbattle_single TRAINER_ENGINEER_BAILY, VermilionCity_Gym_Text_BailyIntro, VermilionCity_Gym_Text_BailyDefeat msgbox VermilionCity_Gym_Text_BailyPostBattle, MSGBOX_AUTOCLOSE end VermilionCity_Gym_EventScript_Tucker:: trainerbattle_single TRAINER_GENTLEMAN_TUCKER, VermilionCity_Gym_Text_TuckerIntro, VermilionCity_Gym_Text_TuckerDefeat, VermilionCity_Gym_EventScript_DefeatedTucker famechecker FAMECHECKER_LTSURGE, 3 msgbox VermilionCity_Gym_Text_TuckerPostBattle, MSGBOX_AUTOCLOSE end VermilionCity_Gym_EventScript_DefeatedTucker:: famechecker FAMECHECKER_LTSURGE, 2 release end VermilionCity_Gym_EventScript_GymGuy:: lock faceplayer goto_if_set FLAG_DEFEATED_LT_SURGE, VermilionCity_Gym_EventScript_GymGuyPostVictory msgbox VermilionCity_Gym_Text_GymGuyAdvice release end VermilionCity_Gym_EventScript_GymGuyPostVictory:: msgbox VermilionCity_Gym_Text_GymGuyPostVictory release end VermilionCity_Gym_EventScript_GymStatue:: lockall goto_if_set FLAG_BADGE03_GET, VermilionCity_Gym_EventScript_GymStatuePostVictory msgbox VermilionCity_Gym_Text_GymStatue releaseall end VermilionCity_Gym_EventScript_GymStatuePostVictory:: msgbox VermilionCity_Gym_Text_GymStatuePlayerWon releaseall end ================================================ FILE: data/maps/VermilionCity_Gym/text.inc ================================================ VermilionCity_Gym_Text_LtSurgeIntro:: .string "Hey, kid! What do you think you're\n" .string "doing here?\p" .string "You won't live long in combat!\n" .string "Not with your puny power!\p" .string "I tell you, kid, electric POKéMON\n" .string "saved me during the war!\p" .string "They zapped my enemies into\n" .string "paralysis!\p" .string "The same as I'll do to you!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$" VermilionCity_Gym_Text_LtSurgePostBattle:: .string "A little word of advice, kid!\p" .string "Electricity is sure powerful!\p" .string "But, it's useless against GROUND-\n" .string "type POKéMON!$" VermilionCity_Gym_Text_ExplainThunderBadgeTakeThis:: .string "The THUNDERBADGE cranks up your\n" .string "POKéMON's SPEED!\p" .string "It also lets your POKéMON FLY\n" .string "lightning-quick anytime, kid!\p" .string "You're special, kid!\n" .string "Take this!$" VermilionCity_Gym_Text_ReceivedTM34FromLtSurge:: .string "{PLAYER} received TM34\n" .string "from LT. SURGE.$" VermilionCity_Gym_Text_ExplainTM34:: .string "TM34 contains SHOCK WAVE!\p" .string "Teach it to an ELECTRIC POKéMON!$" VermilionCity_Gym_Text_MakeRoomInYourBag:: .string "Yo, kid, make room in your BAG!$" VermilionCity_Gym_Text_LtSurgeDefeat:: .string "Now that's a shocker!\p" .string "You're the real deal, kid!\p" .string "Fine, then, take the THUNDERBADGE!$" VermilionCity_Gym_Text_TuckerIntro:: .string "When I was in the Army, LT. SURGE\n" .string "was my strict CO.\p" .string "He was a hard taskmaster.$" VermilionCity_Gym_Text_TuckerDefeat:: .string "Stop!\n" .string "You're very good!$" VermilionCity_Gym_Text_TuckerPostBattle:: .string "It's not easy opening that door.\p" .string "LT. SURGE was always famous for\n" .string "his cautious nature in the Army.$" VermilionCity_Gym_Text_BailyIntro:: .string "I'm a lightweight, but I'm good\n" .string "with electricity!\p" .string "That's why I joined this GYM.$" VermilionCity_Gym_Text_BailyDefeat:: .string "Fried!$" VermilionCity_Gym_Text_BailyPostBattle:: .string "Okay, I'll talk!\p" .string "LT. SURGE said he hid door\n" .string "switches inside something.$" VermilionCity_Gym_Text_DwayneIntro:: .string "This is no place for kids!\n" .string "Not even if you're good!$" VermilionCity_Gym_Text_DwayneDefeat:: .string "Wow!\n" .string "Surprised me!$" VermilionCity_Gym_Text_DwaynePostBattle:: .string "LT. SURGE installed the traps in\n" .string "the GYM himself.\p" .string "He set up double locks everywhere.\n" .string "Let me give you a hint.\p" .string "When you open the first lock, the\n" .string "second lock is right next to it.$" VermilionCity_Gym_Text_GymGuyAdvice:: .string "Yo!\n" .string "Champ in the making!\p" .string "LT. SURGE has a nickname.\p" .string "People refer to him as the\n" .string "Lightning American!\p" .string "He's an expert on electric\n" .string "POKéMON.\p" .string "BIRD/WATER-type POKéMON match\n" .string "poorly against the ELECTRIC type.\p" .string "Beware of paralysis, too.\p" .string "LT. SURGE is very cautious.\p" .string "He's locked himself in, so it won't\n" .string "be easy getting to him.$" VermilionCity_Gym_Text_GymGuyPostVictory:: .string "Whew!\n" .string "That match was electric!$" VermilionCity_Gym_Text_GymStatue:: .string "VERMILION POKéMON GYM\n" .string "LEADER: LT. SURGE\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}$" VermilionCity_Gym_Text_GymStatuePlayerWon:: .string "VERMILION POKéMON GYM\n" .string "LEADER: LT. SURGE\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}, {PLAYER}$" VermilionCity_Gym_Text_NopeOnlyTrashHere:: .string "Nope!\n" .string "There's only trash here.$" VermilionCity_Gym_Text_SwitchUnderTrashFirstLockOpened:: .string "Hey! There's a switch under the\n" .string "trash! Turn it on!\p" .string "The first electric lock opened!$" VermilionCity_Gym_Text_SecondLockOpened:: .string "The second electric lock opened!\n" .string "The motorized door opened!$" VermilionCity_Gym_Text_OnlyTrashLocksWereReset:: .string "Nope!\n" .string "There's only trash here.\p" .string "Hey!\n" .string "The electric locks were reset!$" ================================================ FILE: data/maps/VermilionCity_House1/map.json ================================================ { "id": "MAP_VERMILION_CITY_HOUSE1", "name": "VermilionCity_House1", "layout": "LAYOUT_HOUSE1", "music": "MUS_FUCHSIA", "region_map_section": "MAPSEC_VERMILION_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FISHER", "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_House1_EventScript_FishingGuru", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "3" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "3" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "3" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/VermilionCity_House1/scripts.inc ================================================ VermilionCity_House1_MapScripts:: .byte 0 VermilionCity_House1_EventScript_FishingGuru:: lock faceplayer goto_if_set FLAG_GOT_OLD_ROD, VermilionCity_House1_EventScript_AlreadyGotOldRod msgbox VermilionCity_House1_Text_ImFishingGuruDoYouLikeToFish, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, VermilionCity_House1_EventScript_GiveOldRod msgbox VermilionCity_House1_Text_OhThatsSoDisappointing release end VermilionCity_House1_EventScript_AlreadyGotOldRod:: msgbox VermilionCity_House1_Text_HowAreTheFishBiting release end VermilionCity_House1_EventScript_GiveOldRod:: checkitemspace ITEM_OLD_ROD goto_if_eq VAR_RESULT, FALSE, VermilionCity_House1_EventScript_NoRoomForOldRod additem ITEM_OLD_ROD msgbox VermilionCity_House1_Text_TakeThisAndFish msgreceiveditem VermilionCity_House1_Text_ReceivedOldRodFromFishingGuru, ITEM_OLD_ROD setflag FLAG_GOT_OLD_ROD msgbox VermilionCity_House1_Text_FishingIsAWayOfLife release end VermilionCity_House1_EventScript_NoRoomForOldRod:: msgbox VermilionCity_House1_Text_NoRoomForNiceGift release end ================================================ FILE: data/maps/VermilionCity_House1/text.inc ================================================ VermilionCity_House1_Text_ImFishingGuruDoYouLikeToFish:: .string "I'm the FISHING GURU!\p" .string "I simply looove fishing!\n" .string "I can't bear to go without.\p" .string "Tell me, do you like to fish?$" VermilionCity_House1_Text_TakeThisAndFish:: .string "Grand! I like your style.\n" .string "I think we can be friends.\p" .string "Take this and fish, young friend!$" VermilionCity_House1_Text_ReceivedOldRodFromFishingGuru:: .string "{PLAYER} received an OLD ROD from\n" .string "the FISHING GURU.$" VermilionCity_House1_Text_FishingIsAWayOfLife:: .string "Fishing is a way of life!\n" .string "It is like the finest poetry.\p" .string "From the seas to rivers, go out\n" .string "and land the big one, my friend.$" VermilionCity_House1_Text_OhThatsSoDisappointing:: .string "Oh…\n" .string "That's so disappointing…$" VermilionCity_House1_Text_HowAreTheFishBiting:: .string "Hello there, {PLAYER}!\p" .string "How are the fish biting?$" VermilionCity_House1_Text_NoRoomForNiceGift:: .string "Oh, no!\p" .string "I had a nice gift for you, but you\n" .string "have no room for it!$" ================================================ FILE: data/maps/VermilionCity_House2/map.json ================================================ { "id": "MAP_VERMILION_CITY_HOUSE2", "name": "VermilionCity_House2", "layout": "LAYOUT_HOUSE1", "music": "MUS_VERMILLION", "region_map_section": "MAPSEC_VERMILION_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "in_connection": false, "x": 4, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_House2_EventScript_Elyssa", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_House2_EventScript_FuryCutterTutor", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "6" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "6" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "6" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/VermilionCity_House2/scripts.inc ================================================ VermilionCity_House2_MapScripts:: .byte 0 VermilionCity_House2_EventScript_Elyssa:: lock faceplayer setvar VAR_0x8008, INGAME_TRADE_FARFETCHD call EventScript_GetInGameTradeSpeciesInfo goto_if_set FLAG_DID_CH_DING_TRADE, VermilionCity_House2_EventScript_AlreadyTraded msgbox VermilionCity_House2_Text_DoYouHaveMonWantToTradeForMyMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, VermilionCity_House2_EventScript_DeclineTrade call EventScript_ChooseMonForInGameTrade goto_if_ge VAR_0x8004, PARTY_SIZE, VermilionCity_House2_EventScript_DeclineTrade call EventScript_GetInGameTradeSpecies goto_if_ne VAR_RESULT, VAR_0x8009, VermilionCity_House2_EventScript_NotRequestedMon call EventScript_DoInGameTrade msgbox VermilionCity_House2_Text_ThankYou setflag FLAG_DID_CH_DING_TRADE release end VermilionCity_House2_EventScript_DeclineTrade:: msgbox VermilionCity_House2_Text_ThatsTooBad release end VermilionCity_House2_EventScript_NotRequestedMon:: bufferspeciesname STR_VAR_1, VAR_0x8009 msgbox VermilionCity_House2_Text_ThisIsNoMon release end VermilionCity_House2_EventScript_AlreadyTraded:: msgbox VermilionCity_House2_Text_HowIsMyOldMon release end ================================================ FILE: data/maps/VermilionCity_House2/text.inc ================================================ VermilionCity_House2_Text_DoYouHaveMonWantToTradeForMyMon:: .string "Hi!\n" .string "Do you have a {STR_VAR_1}?\p" .string "Want to trade it for my\n" .string "{STR_VAR_2}?$" VermilionCity_House2_Text_ThatsTooBad:: .string "That's too bad.$" VermilionCity_House2_Text_ThisIsNoMon:: .string "…This is no {STR_VAR_1}.\p" .string "If you get one, please trade it\n" .string "to me!$" VermilionCity_House2_Text_ThankYou:: .string "Thank you!$" VermilionCity_House2_Text_HowIsMyOldMon:: .string "How is my old {STR_VAR_2}?\p" .string "My {STR_VAR_1} is doing great!$" ================================================ FILE: data/maps/VermilionCity_House3/map.json ================================================ { "id": "MAP_VERMILION_CITY_HOUSE3", "name": "VermilionCity_House3", "layout": "LAYOUT_HOUSE1", "music": "MUS_VERMILLION", "region_map_section": "MAPSEC_VERMILION_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_House3_EventScript_Boy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PIDGEY", "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 2, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_House3_EventScript_Pidgey", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLIPBOARD", "x": 6, "y": 4, "elevation": 0, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 2, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_House3_EventScript_Lass", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "8" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "8" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "8" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 6, "y": 4, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_House3_EventScript_Letter" } ], "level_scaling": "0" } ================================================ FILE: data/maps/VermilionCity_House3/scripts.inc ================================================ VermilionCity_House3_MapScripts:: .byte 0 VermilionCity_House3_EventScript_Boy:: msgbox VermilionCity_House3_Text_PidgeyFlyLetterToSaffron, MSGBOX_NPC end VermilionCity_House3_EventScript_Lass:: msgbox VermilionCity_House3_Text_SendMyPidgeyToUnionRoom, MSGBOX_NPC end VermilionCity_House3_EventScript_Pidgey:: lock faceplayer waitse playmoncry SPECIES_PIDGEY, CRY_MODE_NORMAL msgbox VermilionCity_House3_Text_Pidgey waitmoncry release end VermilionCity_House3_EventScript_Letter:: msgbox VermilionCity_House3_Text_DearPippiLetter, MSGBOX_SIGN end ================================================ FILE: data/maps/VermilionCity_House3/text.inc ================================================ VermilionCity_House3_Text_PidgeyFlyLetterToSaffron:: .string "I'm getting my PIDGEY to fly a\n" .string "letter to SAFFRON in the north.$" VermilionCity_House3_Text_Pidgey:: .string "PIDGEY: Kurukkoo!$" VermilionCity_House3_Text_DearPippiLetter:: .string "Dear PIPPI,\n" .string "I hope to see you soon.\p" .string "I heard SAFFRON has problems with\n" .string "TEAM ROCKET.\p" .string "VERMILION appears to be safe.$" VermilionCity_House3_Text_SendMyPidgeyToUnionRoom:: .string "I want to exchange MAIL with all\n" .string "sorts of people.\p" .string "I send my PIDGEY to a UNION ROOM\n" .string "to exchange MAIL for me.$" ================================================ FILE: data/maps/VermilionCity_Mart/map.json ================================================ { "id": "MAP_VERMILION_CITY_MART", "name": "VermilionCity_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_VERMILION_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_Mart_EventScript_CooltrainerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 9, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_Mart_EventScript_BaldingMan", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "7" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "7" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "7" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/VermilionCity_Mart/scripts.inc ================================================ VermilionCity_Mart_MapScripts:: .byte 0 VermilionCity_Mart_EventScript_CooltrainerF:: msgbox VermilionCity_Mart_Text_MonsGoodOrBadDependingOnTrainer, MSGBOX_NPC end VermilionCity_Mart_EventScript_BaldingMan:: msgbox VermilionCity_Mart_Text_TeamRocketAreWickedPeople, MSGBOX_NPC end VermilionCity_Mart_EventScript_Clerk:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer message Text_MayIHelpYou waitmessage pokemart VermilionCity_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 VermilionCity_Mart_Items:: .2byte ITEM_POKE_BALL .2byte ITEM_SUPER_POTION .2byte ITEM_ANTIDOTE .2byte ITEM_PARALYZE_HEAL .2byte ITEM_AWAKENING .2byte ITEM_ICE_HEAL .2byte ITEM_REPEL .2byte ITEM_NONE release end ================================================ FILE: data/maps/VermilionCity_Mart/text.inc ================================================ VermilionCity_Mart_Text_TeamRocketAreWickedPeople:: .string "There are wicked people who will\n" .string "use POKéMON for criminal acts.\p" .string "TEAM ROCKET traffics in rare\n" .string "POKéMON, for example.\p" .string "They also abandon POKéMON that\n" .string "they consider unpopular or useless.\p" .string "That's the sort of horrid people\n" .string "they are, TEAM ROCKET.$" VermilionCity_Mart_Text_MonsGoodOrBadDependingOnTrainer:: .string "I think POKéMON can be good or\n" .string "bad. It depends on the TRAINER.$" ================================================ FILE: data/maps/VermilionCity_PokemonCenter_1F/map.json ================================================ { "id": "MAP_VERMILION_CITY_POKEMON_CENTER_1F", "name": "VermilionCity_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_VERMILION_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MAN", "in_connection": false, "x": 4, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonCenter_1F_EventScript_Man", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_HIKER", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonCenter_1F_EventScript_Hiker", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 14, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 6, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonCenter_1F_EventScript_VSSeekerWoman", "flag": "0" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 2, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonCenter_1F_EventScript_PokemonJournalLtSurge", "flag": "FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL" }, { "type": "object", "graphics_id": "0", "in_connection": false, "x": 3, "y": 1, "elevation": 0, "movement_type": "MOVEMENT_TYPE_INVISIBLE", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonCenter_1F_EventScript_PokemonJournalLtSurge", "flag": "FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "4" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "4" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "4" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_VERMILION_CITY_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/VermilionCity_PokemonCenter_1F/scripts.inc ================================================ VermilionCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, VermilionCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 VermilionCity_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_VERMILION_CITY end VermilionCity_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end VermilionCity_PokemonCenter_1F_EventScript_Man:: msgbox VermilionCity_PokemonCenter_1F_Text_PoisonedMonFaintedWhileWalking, MSGBOX_NPC end VermilionCity_PokemonCenter_1F_EventScript_Hiker:: msgbox VermilionCity_PokemonCenter_1F_Text_TrainerMonsStrongerThanWild, MSGBOX_NPC end VermilionCity_PokemonCenter_1F_EventScript_Youngster:: msgbox VermilionCity_PokemonCenter_1F_Text_AllMonWeakToSpecificTypes, MSGBOX_NPC end ================================================ FILE: data/maps/VermilionCity_PokemonCenter_1F/text.inc ================================================ VermilionCity_PokemonCenter_1F_Text_TrainerMonsStrongerThanWild:: .string "Even if they are the same level,\n" .string "POKéMON can have very different\l" .string "stats and abilities.\p" .string "A POKéMON raised by a TRAINER is\n" .string "stronger than one in the wild.$" VermilionCity_PokemonCenter_1F_Text_PoisonedMonFaintedWhileWalking:: .string "My POKéMON was poisoned!\n" .string "It fainted while we were walking!$" VermilionCity_PokemonCenter_1F_Text_AllMonWeakToSpecificTypes:: .string "It is true that a higher-level\n" .string "POKéMON will be more powerful…\p" .string "But, all POKéMON will have weak\n" .string "points against specific types.\p" .string "So, there appears to be no\n" .string "universally strong POKéMON.$" VermilionCity_PokemonCenter_1F_Text_UrgeToBattleSomeoneAgain:: .string "The urge to battle with someone\n" .string "you've tangled with before…\p" .string "Have you ever had that urge?\n" .string "I'm sure you have.\p" .string "I wanted to battle certain people\n" .string "again over and over, too.\p" .string "So, I've been giving these away.\n" .string "Please, take one!$" VermilionCity_PokemonCenter_1F_Text_UseDeviceForRematches:: .string "Use that device and you'll find\n" .string "TRAINERS looking for a rematch.\p" .string "You have to charge its battery to\n" .string "use it, though.$" VermilionCity_PokemonCenter_1F_Text_ExplainVSSeeker:: .string "How do you use the VS SEEKER?\n" .string "There's nothing to it.\p" .string "Use it like beep-beep-beep, and\n" .string "TRAINERS around you will notice.\p" .string "If any TRAINER wants a rematch,\n" .string "it will let you know immediately.\p" .string "Charge its battery and use it\n" .string "while you're on a road.$" ================================================ FILE: data/maps/VermilionCity_PokemonCenter_2F/map.json ================================================ { "id": "MAP_VERMILION_CITY_POKEMON_CENTER_2F", "name": "VermilionCity_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_VERMILION_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_VERMILION_CITY_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/VermilionCity_PokemonCenter_2F/scripts.inc ================================================ VermilionCity_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS VermilionCity_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end VermilionCity_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end VermilionCity_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/VermilionCity_PokemonFanClub/map.json ================================================ { "id": "MAP_VERMILION_CITY_POKEMON_FAN_CLUB", "name": "VermilionCity_PokemonFanClub", "layout": "LAYOUT_VERMILION_CITY_POKEMON_FAN_CLUB", "music": "MUS_VERMILLION", "region_map_section": "MAPSEC_VERMILION_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 5, "y": 4, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonFanClub_EventScript_Chairman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WORKER_F", "in_connection": false, "x": 6, "y": 4, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonFanClub_EventScript_WorkerF", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PIKACHU", "in_connection": false, "x": 7, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonFanClub_EventScript_Pikachu", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SEEL", "in_connection": false, "x": 4, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonFanClub_EventScript_Seel", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 4, "y": 5, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonFanClub_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 7, "y": 5, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VermilionCity_PokemonFanClub_EventScript_FatMan", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_COOLTRAINER_M", "in_connection": false, "x": 10, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Krabby", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 4, "y": 10, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "5" }, { "x": 5, "y": 10, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "5" }, { "x": 6, "y": 10, "elevation": 3, "dest_map": "MAP_VERMILION_CITY", "dest_warp_id": "5" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 2, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_PokemonFanClub_EventScript_RulesSign1" }, { "type": "sign", "x": 9, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VermilionCity_PokemonFanClub_EventScript_RulesSign2" } ], "level_scaling": "0" } ================================================ FILE: data/maps/VermilionCity_PokemonFanClub/scripts.inc ================================================ .set LOCALID_WOMAN, 5 .set LOCALID_FAT_MAN, 6 .set SPOKE_TO_WOMAN_LAST, FLAG_TEMP_2 .set SPOKE_TO_FAT_MAN_LAST, FLAG_TEMP_3 .set LOCALID_KRABBY_MASTER, 7 .set TRAINER, VAR_0x8009 VermilionCity_PokemonFanClub_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, VermilionCity_PokemonFanClub_MapScript_SetMasterTrainerMovementTypes .byte 0 VermilionCity_PokemonFanClub_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_KRABBY callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, VermilionCity_PokemonFanClub_MapScript_KrabbyMasterMovementType end VermilionCity_PokemonFanClub_MapScript_KrabbyMasterMovementType:: setobjectmovementtype LOCALID_KRABBY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return VermilionCity_PokemonFanClub_EventScript_Chairman:: lock faceplayer goto_if_set FLAG_GOT_BIKE_VOUCHER, VermilionCity_PokemonFanClub_EventScript_AlreadyHeardStory msgbox VermilionCity_PokemonFanClub_Text_DidYouComeToHearAboutMyMons, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, VermilionCity_PokemonFanClub_EventScript_ChairmanStory msgbox VermilionCity_PokemonFanClub_Text_ComeBackToHearStory release end VermilionCity_PokemonFanClub_EventScript_AlreadyHeardStory:: msgbox VermilionCity_PokemonFanClub_Text_DidntComeToSeeAboutMonsAgain release end VermilionCity_PokemonFanClub_EventScript_ChairmanStory:: msgbox VermilionCity_PokemonFanClub_Text_ChairmansStory checkitemspace ITEM_BIKE_VOUCHER goto_if_eq VAR_RESULT, FALSE, VermilionCity_PokemonFanClub_EventScript_NoRoomForBikeVoucher setflag FLAG_GOT_BIKE_VOUCHER giveitem_msg VermilionCity_PokemonFanClub_Text_ReceivedBikeVoucherFromChairman, ITEM_BIKE_VOUCHER, 1, MUS_OBTAIN_KEY_ITEM msgbox VermilionCity_PokemonFanClub_Text_ExplainBikeVoucher release end VermilionCity_PokemonFanClub_EventScript_NoRoomForBikeVoucher:: msgbox VermilionCity_PokemonFanClub_Text_MakeRoomForThis release end VermilionCity_PokemonFanClub_EventScript_WorkerF:: lock faceplayer goto_if_set FLAG_SYS_GAME_CLEAR, VermilionCity_PokemonFanClub_EventScript_WorkerFGameClear msgbox VermilionCity_PokemonFanClub_Text_ChairmanVeryVocalAboutPokemon release end VermilionCity_PokemonFanClub_EventScript_WorkerFGameClear:: famechecker FAMECHECKER_DAISY, 1 msgbox VermilionCity_PokemonFanClub_Text_ChairmanReallyAdoresHisMons release end VermilionCity_PokemonFanClub_EventScript_Woman:: lock faceplayer goto_if_set SPOKE_TO_FAT_MAN_LAST, VermilionCity_PokemonFanClub_EventScript_WomanSpokeToFatMan msgbox VermilionCity_PokemonFanClub_Text_AdoreMySeel closemessage applymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection waitmovement 0 setflag SPOKE_TO_WOMAN_LAST release end VermilionCity_PokemonFanClub_EventScript_WomanSpokeToFatMan:: msgbox VermilionCity_PokemonFanClub_Text_SeelFarMoreAttractive closemessage applymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection waitmovement 0 clearflag SPOKE_TO_FAT_MAN_LAST release end VermilionCity_PokemonFanClub_EventScript_FatMan:: lock faceplayer goto_if_set SPOKE_TO_WOMAN_LAST, VermilionCity_PokemonFanClub_EventScript_FatManSpokeToWoman msgbox VermilionCity_PokemonFanClub_Text_AdmirePikachusTail closemessage applymovement LOCALID_FAT_MAN, Common_Movement_FaceOriginalDirection waitmovement 0 setflag SPOKE_TO_FAT_MAN_LAST release end VermilionCity_PokemonFanClub_EventScript_FatManSpokeToWoman:: msgbox VermilionCity_PokemonFanClub_Text_PikachuTwiceAsCute closemessage applymovement LOCALID_FAT_MAN, Common_Movement_FaceOriginalDirection waitmovement 0 clearflag SPOKE_TO_WOMAN_LAST release end VermilionCity_PokemonFanClub_EventScript_Pikachu:: lock faceplayer waitse playmoncry SPECIES_PIKACHU, CRY_MODE_NORMAL msgbox VermilionCity_PokemonFanClub_Text_Pikachu waitmoncry release end VermilionCity_PokemonFanClub_EventScript_Seel:: lock faceplayer waitse playmoncry SPECIES_SEEL, CRY_MODE_NORMAL msgbox VermilionCity_PokemonFanClub_Text_Seel waitmoncry release end VermilionCity_PokemonFanClub_EventScript_RulesSign1:: msgbox VermilionCity_PokemonFanClub_Text_ListenPolitelyToOtherTrainers, MSGBOX_SIGN end VermilionCity_PokemonFanClub_EventScript_RulesSign2:: msgbox VermilionCity_PokemonFanClub_Text_SomeoneBragsBragBack, MSGBOX_SIGN end ================================================ FILE: data/maps/VermilionCity_PokemonFanClub/text.inc ================================================ VermilionCity_PokemonFanClub_Text_AdmirePikachusTail:: .string "Won't you admire my PIKACHU's\n" .string "adorable tail?$" VermilionCity_PokemonFanClub_Text_PikachuTwiceAsCute:: .string "Humph!\p" .string "My PIKACHU is twice as cute as\n" .string "that one!$" VermilionCity_PokemonFanClub_Text_AdoreMySeel:: .string "I just adore my SEEL!\n" .string "It's so lovable!\p" .string "It squeals, “Kyuuuh,” when I\n" .string "hug it!$" VermilionCity_PokemonFanClub_Text_SeelFarMoreAttractive:: .string "Oh, dear!\p" .string "My SEEL is far more attractive.\n" .string "By double, I would say.$" VermilionCity_PokemonFanClub_Text_Pikachu:: .string "PIKACHU: Chu! Pikachu!$" VermilionCity_PokemonFanClub_Text_Seel:: .string "SEEL: Kyuoo!$" VermilionCity_PokemonFanClub_Text_DidYouComeToHearAboutMyMons:: .string "I chair the POKéMON Fan Club!\p" .string "I raise more than a hundred\n" .string "POKéMON!\p" .string "I'm very fussy when it comes to\n" .string "POKéMON! I surely am!\p" .string "So…\p" .string "Did you come visit to hear about\n" .string "my POKéMON?$" VermilionCity_PokemonFanClub_Text_ChairmansStory:: .string "Good!\n" .string "Then listen up!\p" .string "My favorite RAPIDASH…\p" .string "It's…cute…lovely…smart… \n" .string "plus…amazing…you think so?…\l" .string "oh yes…it's…stunning…\l" .string "kindly…love it!\p" .string "Hug it…when…sleeping…warm\n" .string "and cuddly…spectacular…\l" .string "ravishing…\l" .string "…Oops! Look at the time!\l" .string "I kept you too long!\p" .string "Thanks for hearing me out!\n" .string "I want you to have this!$" VermilionCity_PokemonFanClub_Text_ReceivedBikeVoucherFromChairman:: .string "{PLAYER} received a BIKE VOUCHER\n" .string "from the CHAIRMAN.$" VermilionCity_PokemonFanClub_Text_ExplainBikeVoucher:: .string "Take that BIKE VOUCHER to the\n" .string "BIKE SHOP in CERULEAN CITY.\p" .string "Exchange that for a BICYCLE\n" .string "free of charge!\p" .string "Don't worry, my favorite FEAROW\n" .string "will FLY me anywhere I need to go.\p" .string "So, I have no need for a BICYCLE.\p" .string "I hope you like cycling!$" VermilionCity_PokemonFanClub_Text_ComeBackToHearStory:: .string "Oh. Come back when you want to\n" .string "hear my story!$" VermilionCity_PokemonFanClub_Text_DidntComeToSeeAboutMonsAgain:: .string "Hello, {PLAYER}!\p" .string "Did you come see me about my\n" .string "POKéMON again?\p" .string "No?\n" .string "Too bad!$" VermilionCity_PokemonFanClub_Text_MakeRoomForThis:: .string "Make room for this!$" VermilionCity_PokemonFanClub_Text_ChairmanVeryVocalAboutPokemon:: .string "Our CHAIRMAN is very vocal about\n" .string "POKéMON.$" VermilionCity_PokemonFanClub_Text_ListenPolitelyToOtherTrainers:: .string "Let's all listen politely to other\n" .string "TRAINERS!$" VermilionCity_PokemonFanClub_Text_SomeoneBragsBragBack:: .string "If someone brags, brag right back!$" VermilionCity_PokemonFanClub_Text_ChairmanReallyAdoresHisMons:: .string "Our CHAIRMAN really does adore his\n" .string "POKéMON.\p" .string "But the person who is most liked by\n" .string "POKéMON is DAISY, I think.$" ================================================ FILE: data/maps/VictoryRoad_1F/map.json ================================================ { "id": "MAP_VICTORY_ROAD_1F", "name": "VictoryRoad_1F", "layout": "LAYOUT_VICTORY_ROAD_1F", "music": "MUS_MT_MOON", "region_map_section": "MAPSEC_KANTO_VICTORY_ROAD", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 5, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "VictoryRoad_1F_EventScript_Rolando", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 14, "y": 6, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "VictoryRoad_1F_EventScript_Naomi", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VictoryRoad_1F_EventScript_ItemRareCandy", "flag": "FLAG_HIDE_VICTORY_ROAD_1F_RARE_CANDY" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 14, "y": 1, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VictoryRoad_1F_EventScript_ItemTM02", "flag": "FLAG_HIDE_VICTORY_ROAD_1F_TM02" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 7, "y": 18, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 4, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 16, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_HIKER", "in_connection": false, "x": 8, "y": 11, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Graveler", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 2, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_2F", "dest_warp_id": "0" }, { "x": 11, "y": 20, "elevation": 3, "dest_map": "MAP_ROUTE23", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 20, "y": 16, "elevation": 3, "var": "VAR_MAP_SCENE_VICTORY_ROAD_1F", "var_value": "99", "script": "VictoryRoad_1F_EventScript_FloorSwitch" } ], "bg_events": [ { "type": "hidden_item", "x": 12, "y": 12, "elevation": 0, "item": "ITEM_ULTRA_BALL", "flag": "FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 16, "y": 1, "elevation": 0, "item": "ITEM_FULL_RESTORE", "flag": "FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_FULL_RESTORE", "quantity": 1, "underfoot": false } ], "level_scaling": "4" } ================================================ FILE: data/maps/VictoryRoad_1F/scripts.inc ================================================ .set LOCALID_GRAVELER_MASTER, 8 .set TRAINER, VAR_0x8009 .set LOCALID_BOULDER, 5 VictoryRoad_1F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, VictoryRoad_1F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, VictoryRoad_1F_OnTransition .byte 0 VictoryRoad_1F_OnLoad:: call_if_ne VAR_MAP_SCENE_VICTORY_ROAD_1F, 100, VictoryRoad_1F_EventScript_SetRockBarrier call_if_eq VAR_MAP_SCENE_VICTORY_ROAD_1F, 100, VictoryRoad_1F_EventScript_MoveSwitchBoulder end VictoryRoad_1F_EventScript_SetRockBarrier:: setmetatile 12, 14, METATILE_Cave_RockBarrier_Top, 1 setmetatile 12, 15, METATILE_Cave_RockBarrier_Bottom, 1 return VictoryRoad_1F_EventScript_MoveSwitchBoulder:: setobjectxyperm LOCALID_BOULDER, 20, 16 end VictoryRoad_1F_OnTransition:: setworldmapflag FLAG_WORLD_MAP_VICTORY_ROAD_1F goto VictoryRoad_1F_MapScript_SetMasterTrainerMovementTypes end VictoryRoad_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_GRAVELER callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, VictoryRoad_1F_MapScript_GravelerMasterMovementType end VictoryRoad_1F_MapScript_GravelerMasterMovementType:: setobjectmovementtype LOCALID_GRAVELER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return VictoryRoad_1F_EventScript_FloorSwitch:: lockall goto_if_eq VAR_MAP_SCENE_VICTORY_ROAD_1F, 100, VictoryRoad_1F_EventScript_FloorSwitchAlreadyPressed setmetatile 12, 14, METATILE_Cave_Floor_Ledge_Top, 0 setmetatile 12, 15, METATILE_Cave_Floor_Ledge_Bottom, 0 playse SE_ICE_BREAK special DrawWholeMapView waitse copyobjectxytoperm LOCALID_BOULDER setvar VAR_MAP_SCENE_VICTORY_ROAD_1F, 100 releaseall end VictoryRoad_1F_EventScript_FloorSwitchAlreadyPressed:: releaseall end VictoryRoad_1F_EventScript_Naomi:: trainerbattle_single TRAINER_COOLTRAINER_NAOMI, VictoryRoad_1F_Text_NaomiIntro, VictoryRoad_1F_Text_NaomiDefeat msgbox VictoryRoad_1F_Text_NaomiPostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_1F_EventScript_Rolando:: trainerbattle_single TRAINER_COOLTRAINER_ROLANDO, VictoryRoad_1F_Text_RolandoIntro, VictoryRoad_1F_Text_RolandoDefeat msgbox VictoryRoad_1F_Text_RolandoPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/VictoryRoad_1F/text.inc ================================================ VictoryRoad_1F_Text_NaomiIntro:: .string "I wonder if you are good enough\n" .string "for me?$" VictoryRoad_1F_Text_NaomiDefeat:: .string "I lost out…$" VictoryRoad_1F_Text_NaomiPostBattle:: .string "I never wanted to lose to anybody,\n" .string "especially to a younger kid…$" VictoryRoad_1F_Text_RolandoIntro:: .string "I can see you're good.\n" .string "Let me see exactly how good!$" VictoryRoad_1F_Text_RolandoDefeat:: .string "I had a chance…$" VictoryRoad_1F_Text_RolandoPostBattle:: .string "Tch!\n" .string "I concede, you are better than I!$" ================================================ FILE: data/maps/VictoryRoad_2F/map.json ================================================ { "id": "MAP_VICTORY_ROAD_2F", "name": "VictoryRoad_2F", "layout": "LAYOUT_VICTORY_ROAD_2F", "music": "MUS_MT_MOON", "region_map_section": "MAPSEC_KANTO_VICTORY_ROAD", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_POKE_MANIAC", "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "VictoryRoad_2F_EventScript_Dawson", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 20, "y": 11, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "VictoryRoad_2F_EventScript_Daisuke", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JUGGLER", "x": 31, "y": 16, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "VictoryRoad_2F_EventScript_Nelson", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TAMER", "x": 26, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP", "movement_range_x": 4, "movement_range_y": 4, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "VictoryRoad_2F_EventScript_Vincent", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_JUGGLER", "x": 36, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "VictoryRoad_2F_EventScript_Gregory", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VictoryRoad_2F_EventScript_ItemGuardSpec", "flag": "FLAG_HIDE_VICTORY_ROAD_2F_GUARD_SPEC" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 40, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VictoryRoad_2F_EventScript_ItemTM07", "flag": "FLAG_HIDE_VICTORY_ROAD_2F_TM07" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 25, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VictoryRoad_2F_EventScript_ItemFullHeal", "flag": "FLAG_HIDE_VICTORY_ROAD_2F_FULL_HEAL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 14, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VictoryRoad_2F_EventScript_ItemTM37", "flag": "FLAG_HIDE_VICTORY_ROAD_2F_TM37" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 8, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 6, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 33, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_VICTORY_ROAD_2F_BOULDER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 40, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VictoryRoad_2F_EventScript_DoubleEdgeTutor", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 27, "y": 17, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Moltres", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 1, "y": 9, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_1F", "dest_warp_id": "0" }, { "x": 3, "y": 3, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_3F", "dest_warp_id": "0" }, { "x": 34, "y": 9, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_3F", "dest_warp_id": "1" }, { "x": 38, "y": 9, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_3F", "dest_warp_id": "2" }, { "x": 36, "y": 17, "elevation": 4, "dest_map": "MAP_VICTORY_ROAD_3F", "dest_warp_id": "3" }, { "x": 49, "y": 13, "elevation": 0, "dest_map": "MAP_ROUTE23", "dest_warp_id": "1" }, { "x": 48, "y": 12, "elevation": 3, "dest_map": "MAP_ROUTE23", "dest_warp_id": "1" }, { "x": 47, "y": 13, "elevation": 0, "dest_map": "MAP_ROUTE23", "dest_warp_id": "1" }, { "x": 34, "y": 19, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_3F", "dest_warp_id": "4" } ], "coord_events": [ { "type": "trigger", "x": 2, "y": 19, "elevation": 3, "var": "VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1", "var_value": "99", "script": "VictoryRoad_2F_EventScript_FloorSwitch1" }, { "type": "trigger", "x": 14, "y": 19, "elevation": 3, "var": "VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2", "var_value": "99", "script": "VictoryRoad_2F_EventScript_FloorSwitch2" } ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/VictoryRoad_2F/scripts.inc ================================================ .set LOCALID_MOLTRES_MASTER, 14 .set TRAINER, VAR_0x8009 .set LOCALID_BOULDER1, 11 .set LOCALID_BOULDER2, 12 VictoryRoad_2F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, VictoryRoad_2F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, VictoryRoad_2F_MapScript_SetMasterTrainerMovementTypes .byte 0 VictoryRoad_2F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_MOLTRES callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, VictoryRoad_2F_MapScript_MoltresMasterMovementType end VictoryRoad_2F_MapScript_MoltresMasterMovementType:: setobjectmovementtype LOCALID_MOLTRES_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return VictoryRoad_2F_OnLoad:: call_if_ne VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1, 100, VictoryRoad_2F_EventScript_SetRockBarrier1 call_if_eq VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1, 100, VictoryRoad_2F_EventScript_MoveSwitch1Boulder call_if_ne VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2, 100, VictoryRoad_2F_EventScript_SetRockBarrier2 call_if_eq VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2, 100, VictoryRoad_2F_EventScript_MoveSwitch2Boulder end VictoryRoad_2F_EventScript_MoveSwitch1Boulder:: setobjectxyperm LOCALID_BOULDER1, 2, 19 return VictoryRoad_2F_EventScript_MoveSwitch2Boulder:: setobjectxyperm LOCALID_BOULDER2, 14, 19 return VictoryRoad_2F_EventScript_SetRockBarrier1:: setmetatile 13, 10, METATILE_Cave_RockBarrier_Top, 1 setmetatile 13, 11, METATILE_Cave_RockBarrier_Bottom, 1 return VictoryRoad_2F_EventScript_SetRockBarrier2:: setmetatile 33, 16, METATILE_Cave_RockBarrier_Top, 1 setmetatile 33, 17, METATILE_Cave_RockBarrier_Bottom, 1 return VictoryRoad_2F_EventScript_FloorSwitch1:: lockall goto_if_eq VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1, 100, VictoryRoad_2F_EventScript_FloorSwitch1AlreadyPressed setmetatile 13, 10, METATILE_Cave_Floor_Ledge_Top, 0 setmetatile 13, 11, METATILE_Cave_Floor_Ledge_Bottom, 0 playse SE_ICE_BREAK special DrawWholeMapView waitse copyobjectxytoperm LOCALID_BOULDER1 setvar VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1, 100 releaseall end VictoryRoad_2F_EventScript_FloorSwitch1AlreadyPressed:: releaseall end VictoryRoad_2F_EventScript_FloorSwitch2:: lockall goto_if_eq VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2, 100, VictoryRoad_2F_EventScript_FloorSwitch2AlreadyPressed setmetatile 33, 16, METATILE_Cave_Floor_Ledge_Top, 0 setmetatile 33, 17, METATILE_Cave_Floor_Ledge_Bottom, 0 playse SE_ICE_BREAK special DrawWholeMapView waitse copyobjectxytoperm LOCALID_BOULDER2 setvar VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2, 100 releaseall end VictoryRoad_2F_EventScript_FloorSwitch2AlreadyPressed:: releaseall end VictoryRoad_2F_EventScript_Dawson:: trainerbattle_single TRAINER_POKEMANIAC_DAWSON, VictoryRoad_2F_Text_DawsonIntro, VictoryRoad_2F_Text_DawsonDefeat msgbox VictoryRoad_2F_Text_DawsonPostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_2F_EventScript_Daisuke:: trainerbattle_single TRAINER_BLACK_BELT_DAISUKE, VictoryRoad_2F_Text_DaisukeIntro, VictoryRoad_2F_Text_DaisukeDefeat msgbox VictoryRoad_2F_Text_DaisukePostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_2F_EventScript_Nelson:: trainerbattle_single TRAINER_JUGGLER_NELSON, VictoryRoad_2F_Text_NelsonIntro, VictoryRoad_2F_Text_NelsonDefeat msgbox VictoryRoad_2F_Text_NelsonPostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_2F_EventScript_Gregory:: trainerbattle_single TRAINER_JUGGLER_GREGORY, VictoryRoad_2F_Text_GregoryIntro, VictoryRoad_2F_Text_GregoryDefeat msgbox VictoryRoad_2F_Text_GregoryPostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_2F_EventScript_Vincent:: trainerbattle_single TRAINER_TAMER_VINCENT, VictoryRoad_2F_Text_VincentIntro, VictoryRoad_2F_Text_VincentDefeat msgbox VictoryRoad_2F_Text_VincentPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/VictoryRoad_2F/text.inc ================================================ VictoryRoad_2F_Text_DawsonIntro:: .string "If you can get through here,\n" .string "you can go meet the ELITE FOUR.$" VictoryRoad_2F_Text_DawsonDefeat:: .string "No!\n" .string "Unbelievable!$" VictoryRoad_2F_Text_DawsonPostBattle:: .string "I can beat you when it comes to\n" .string "knowledge about POKéMON!$" VictoryRoad_2F_Text_DaisukeIntro:: .string "This here is VICTORY ROAD.\n" .string "It's the final test for TRAINERS!$" VictoryRoad_2F_Text_DaisukeDefeat:: .string "Atcho!$" VictoryRoad_2F_Text_DaisukePostBattle:: .string "If you get stuck, try moving some\n" .string "boulders around.$" VictoryRoad_2F_Text_NelsonIntro:: .string "Ah, so you wish to challenge the\n" .string "ELITE FOUR?$" VictoryRoad_2F_Text_NelsonDefeat:: .string "You got me!$" VictoryRoad_2F_Text_NelsonPostBattle:: .string "{RIVAL} also came through here.$" VictoryRoad_2F_Text_VincentIntro:: .string "Come on!\n" .string "I'll whip you!$" VictoryRoad_2F_Text_VincentDefeat:: .string "I got whipped!$" VictoryRoad_2F_Text_VincentPostBattle:: .string "You earned the right to be on\n" .string "VICTORY ROAD…$" VictoryRoad_2F_Text_GregoryIntro:: .string "Is VICTORY ROAD too tough?$" VictoryRoad_2F_Text_GregoryDefeat:: .string "Well done!$" VictoryRoad_2F_Text_GregoryPostBattle:: .string "Many TRAINERS give up their\n" .string "challenge here and go home.$" @ Unused, old text for Moltres VictoryRoad_2F_Text_Gyaoo:: .string "ギヤーオ!$" ================================================ FILE: data/maps/VictoryRoad_3F/map.json ================================================ { "id": "MAP_VICTORY_ROAD_3F", "name": "VictoryRoad_3F", "layout": "LAYOUT_VICTORY_ROAD_3F", "music": "MUS_MT_MOON", "region_map_section": "MAPSEC_KANTO_VICTORY_ROAD", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_UNDERGROUND", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 40, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "VictoryRoad_3F_EventScript_George", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 21, "y": 5, "elevation": 4, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "VictoryRoad_3F_EventScript_Alexa", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 10, "y": 17, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "VictoryRoad_3F_EventScript_Colby", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 11, "y": 16, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "VictoryRoad_3F_EventScript_Caroline", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 38, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VictoryRoad_3F_EventScript_ItemMaxRevive", "flag": "FLAG_HIDE_VICTORY_ROAD_3F_MAX_REVIVE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 12, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "VictoryRoad_3F_EventScript_ItemTM50", "flag": "FLAG_HIDE_VICTORY_ROAD_3F_TM50" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 19, "y": 15, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 33, "y": 18, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "FLAG_HIDE_VICTORY_ROAD_2F_BOULDER", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_HIDE_VICTORY_ROAD_3F_BOULDER" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 35, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", "in_connection": false, "x": 32, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 38, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "VictoryRoad_3F_EventScript_Ray", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_F", "in_connection": false, "x": 39, "y": 13, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "VictoryRoad_3F_EventScript_Tyra", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_SCIENTIST", "in_connection": false, "x": 40, "y": 19, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Golbat", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 5, "y": 2, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_2F", "dest_warp_id": "1" }, { "x": 34, "y": 9, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_2F", "dest_warp_id": "2" }, { "x": 37, "y": 10, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_2F", "dest_warp_id": "3" }, { "x": 39, "y": 17, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_2F", "dest_warp_id": "4" }, { "x": 34, "y": 18, "elevation": 3, "dest_map": "MAP_VICTORY_ROAD_2F", "dest_warp_id": "8" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 7, "elevation": 3, "var": "VAR_MAP_SCENE_VICTORY_ROAD_3F", "var_value": "99", "script": "VictoryRoad_3F_EventScript_FloorSwitch" } ], "bg_events": [ ], "level_scaling": "4" } ================================================ FILE: data/maps/VictoryRoad_3F/scripts.inc ================================================ .set LOCALID_GOLBAT_MASTER, 13 .set TRAINER, VAR_0x8009 .set LOCALID_BOULDER1, 7 .set LOCALID_BOULDER2, 10 VictoryRoad_3F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, VictoryRoad_3F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, VictoryRoad_3F_MapScript_SetMasterTrainerMovementTypes .byte 0 VictoryRoad_3F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_GOLBAT callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, VictoryRoad_3F_MapScript_GolbatMasterMovementType end VictoryRoad_3F_MapScript_GolbatMasterMovementType:: setobjectmovementtype LOCALID_GOLBAT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return VictoryRoad_3F_OnLoad:: call_if_ne VAR_MAP_SCENE_VICTORY_ROAD_3F, 100, VictoryRoad_3F_EventScript_SetRockBarrier call_if_eq VAR_MAP_SCENE_VICTORY_ROAD_3F, 100, VictoryRoad_3F_EventScript_MoveSwitchBoulder end VictoryRoad_3F_EventScript_MoveSwitchBoulder:: setobjectxyperm LOCALID_BOULDER2, 7 ,7 return VictoryRoad_3F_EventScript_SetRockBarrier:: setmetatile 12, 12, METATILE_Cave_RockBarrier_Top, 1 setmetatile 12, 13, METATILE_Cave_RockBarrier_Bottom, 1 return VictoryRoad_3F_EventScript_FloorSwitch:: lockall goto_if_eq VAR_MAP_SCENE_VICTORY_ROAD_3F, 100, VictoryRoad_3F_EventScript_FloorSwitchAlreadyPressed setmetatile 12, 12, METATILE_Cave_Floor_Ledge_Top, 0 setmetatile 12, 13, METATILE_Cave_Floor_Ledge_Bottom, 0 playse SE_ICE_BREAK special DrawWholeMapView waitse copyobjectxytoperm LOCALID_BOULDER1 copyobjectxytoperm LOCALID_BOULDER2 setvar VAR_MAP_SCENE_VICTORY_ROAD_3F, 100 releaseall end VictoryRoad_3F_EventScript_FloorSwitchAlreadyPressed:: releaseall end VictoryRoad_3F_EventScript_George:: trainerbattle_single TRAINER_COOLTRAINER_GEORGE, VictoryRoad_3F_Text_GeorgeIntro, VictoryRoad_3F_Text_GeorgeDefeat msgbox VictoryRoad_3F_Text_GeorgePostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_3F_EventScript_Colby:: trainerbattle_single TRAINER_COOLTRAINER_COLBY, VictoryRoad_3F_Text_ColbyIntro, VictoryRoad_3F_Text_ColbyDefeat msgbox VictoryRoad_3F_Text_ColbyPostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_3F_EventScript_Caroline:: trainerbattle_single TRAINER_COOLTRAINER_CAROLINE, VictoryRoad_3F_Text_CarolineIntro, VictoryRoad_3F_Text_CarolineDefeat msgbox VictoryRoad_3F_Text_CarolinePostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_3F_EventScript_Alexa:: trainerbattle_single TRAINER_COOLTRAINER_ALEXA, VictoryRoad_3F_Text_AlexaIntro, VictoryRoad_3F_Text_AlexaDefeat msgbox VictoryRoad_3F_Text_AlexaPostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_3F_EventScript_Ray:: trainerbattle_double TRAINER_COOL_COUPLE_RAY_TYRA, VictoryRoad_3F_Text_RayIntro, VictoryRoad_3F_Text_RayDefeat, VictoryRoad_3F_Text_RayNotEnoughMons msgbox VictoryRoad_3F_Text_RayPostBattle, MSGBOX_AUTOCLOSE end VictoryRoad_3F_EventScript_Tyra:: trainerbattle_double TRAINER_COOL_COUPLE_RAY_TYRA, VictoryRoad_3F_Text_TyraIntro, VictoryRoad_3F_Text_TyraDefeat, VictoryRoad_3F_Text_TyraNotEnoughMons msgbox VictoryRoad_3F_Text_TyraPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/VictoryRoad_3F/text.inc ================================================ Text_DoubleEdgeTeach:: .string "You should be proud of yourself,\n" .string "having battled your way through\l" .string "VICTORY ROAD so courageously.\p" .string "In recognition of your feat,\n" .string "I'll teach you DOUBLE-EDGE.\p" .string "Would you like me to teach that\n" .string "technique?$" Text_DoubleEdgeDeclined:: .string "I'll teach you the technique\n" .string "anytime.$" Text_DoubleEdgeWhichMon:: .string "Which POKéMON should I teach\n" .string "DOUBLE-EDGE?$" Text_DoubleEdgeTaught:: .string "Keep that drive going for the\n" .string "POKéMON LEAGUE!\p" .string "Take a run at them and knock 'em\n" .string "out!$" Text_DoubleEdgeReteach:: .string "Back again?\p" .string "I'll teach you the DOUBLE-EDGE\n" .string "technique again, but it'll cost\l" .string "you ¥5000.$" Text_DoubleEdgeReteach2:: .string "Would you like me to teach that\n" .string "technique?$" Text_DoubleEdgeNotEnoughMoney:: .string "Hey! You don't have enough money\n" .string "to pay for this!\p" .string "If you want to learn DOUBLE-EDGE\n" .string "again, come back with ¥5000!$" VictoryRoad_3F_Text_GeorgeIntro:: .string "I heard rumors of a child prodigy.$" VictoryRoad_3F_Text_GeorgeDefeat:: .string "The rumors were true!$" VictoryRoad_3F_Text_GeorgePostBattle:: .string "So, it was you who beat GIOVANNI\n" .string "of TEAM ROCKET?$" VictoryRoad_3F_Text_AlexaIntro:: .string "TRAINERS live to seek stronger\n" .string "opponents.$" VictoryRoad_3F_Text_AlexaDefeat:: .string "Oh!\n" .string "So strong!$" VictoryRoad_3F_Text_AlexaPostBattle:: .string "By fighting tough battles, you get\n" .string "stronger.$" VictoryRoad_3F_Text_CarolineIntro:: .string "I'll show you just how good you\n" .string "are. Not!$" VictoryRoad_3F_Text_CarolineDefeat:: .string "I'm furious!$" VictoryRoad_3F_Text_CarolinePostBattle:: .string "You showed me just how good\n" .string "I was…$" VictoryRoad_3F_Text_ColbyIntro:: .string "Only the chosen can pass here!$" VictoryRoad_3F_Text_ColbyDefeat:: .string "I don't believe it!$" VictoryRoad_3F_Text_ColbyPostBattle:: .string "All TRAINERS here are headed to\n" .string "the POKéMON LEAGUE.\p" .string "Don't let down your guard.$" VictoryRoad_3F_Text_RayIntro:: .string "RAY: Together, the two of us are\n" .string "destined for greatness!$" VictoryRoad_3F_Text_RayDefeat:: .string "RAY: Ludicrous!\n" .string "This can't be!$" VictoryRoad_3F_Text_RayPostBattle:: .string "RAY: You've beaten us.\n" .string "Greatness remains elusive…$" VictoryRoad_3F_Text_RayNotEnoughMons:: .string "RAY: Together, the two of us are\n" .string "striving for the pinnacle.\p" .string "We need you to bring two POKéMON\n" .string "into battle with us.$" VictoryRoad_3F_Text_TyraIntro:: .string "TYRA: We're trying to become\n" .string "champions together.$" VictoryRoad_3F_Text_TyraDefeat:: .string "TYRA: Oh, but…$" VictoryRoad_3F_Text_TyraPostBattle:: .string "TYRA: You've taught me that power\n" .string "can be infinite in shape and form.$" VictoryRoad_3F_Text_TyraNotEnoughMons:: .string "TYRA: You can't battle with us if\n" .string "you have only one POKéMON.$" ================================================ FILE: data/maps/ViridianCity/map.json ================================================ { "id": "MAP_VIRIDIAN_CITY", "name": "ViridianCity", "layout": "LAYOUT_VIRIDIAN_CITY", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_VIRIDIAN_CITY", "requires_flash": false, "weather": "WEATHER_SUNNY", "map_type": "MAP_TYPE_TOWN", "allow_cycling": true, "allow_escaping": false, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": [ { "direction": "up", "offset": 12, "map": "MAP_ROUTE2" }, { "direction": "down", "offset": 12, "map": "MAP_ROUTE1" }, { "direction": "left", "offset": 10, "map": "MAP_ROUTE22" } ], "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "in_connection": false, "x": 8, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_EventScript_DreamEaterTutor", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 11, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_VIRIDIAN_CITY_SOUTH_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN_1", "in_connection": false, "x": 33, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_EventScript_OldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "in_connection": false, "x": 21, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 2, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_EventScript_TutorialOldMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "in_connection": false, "x": 20, "y": 12, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 3, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 33, "y": 26, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 0, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 16, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_EventScript_Boy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CUT_TREE", "in_connection": false, "x": 18, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_CutTree", "flag": "FLAG_VIRIDIAN_CITY_NORTH_CUT_TREE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 17, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_EventScript_ItemPotion", "flag": "FLAG_HIDE_VIRIDIAN_CITY_POTION" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 7, "y": 32, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Abra", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 38, "y": 24, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Oddish", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 26, "y": 26, "elevation": 0, "dest_map": "MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F", "dest_warp_id": "1" }, { "x": 25, "y": 11, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY_HOUSE", "dest_warp_id": "1" }, { "x": 35, "y": 10, "elevation": 0, "dest_map": "MAP_VIRIDIAN_CITY_GYM", "dest_warp_id": "1" }, { "x": 25, "y": 18, "elevation": 0, "dest_map": "MAP_VIRIDIAN_CITY_SCHOOL", "dest_warp_id": "1" }, { "x": 36, "y": 19, "elevation": 0, "dest_map": "MAP_VIRIDIAN_CITY_MART", "dest_warp_id": "1" } ], "coord_events": [ { "type": "trigger", "x": 22, "y": 11, "elevation": 3, "var": "VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN", "var_value": "0", "script": "ViridianCity_EventScript_RoadBlocked" }, { "type": "trigger", "x": 35, "y": 11, "elevation": 3, "var": "VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR", "var_value": "0", "script": "ViridianCity_EventScript_GymDoorLocked" }, { "type": "trigger", "x": 20, "y": 8, "elevation": 3, "var": "VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN", "var_value": "1", "script": "ViridianCity_EventScript_TutorialTriggerLeft" }, { "type": "trigger", "x": 22, "y": 8, "elevation": 3, "var": "VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN", "var_value": "1", "script": "ViridianCity_EventScript_TutorialTriggerRight" } ], "bg_events": [ { "type": "sign", "x": 23, "y": 1, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_EventScript_TrainerTips1" }, { "type": "sign", "x": 31, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_EventScript_GymSign" }, { "type": "sign", "x": 20, "y": 31, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_EventScript_TrainerTips2" }, { "type": "sign", "x": 20, "y": 16, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_EventScript_CitySign" }, { "type": "sign", "x": 35, "y": 10, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_EventScript_GymDoor" } ], "level_scaling": "4" } ================================================ FILE: data/maps/ViridianCity/scripts.inc ================================================ .set LOCALID_OLD_MAN, 3 .set LOCALID_TUTORIAL_MAN, 4 .set LOCALID_WOMAN, 5 .set LOCALID_ABRA_MASTER, 10 .set LOCALID_ODDISH_MASTER, 11 .set TRAINER, VAR_0x8009 ViridianCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, ViridianCity_OnTransition .byte 0 ViridianCity_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_ABRA callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, ViridianCity_MapScript_AbraMasterMovementType setvar TRAINER, MASTER_ODDISH callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, ViridianCity_MapScript_OddishMasterMovementType end ViridianCity_MapScript_AbraMasterMovementType:: setobjectmovementtype LOCALID_ABRA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ViridianCity_MapScript_OddishMasterMovementType:: setobjectmovementtype LOCALID_ODDISH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ViridianCity_OnTransition:: setworldmapflag FLAG_WORLD_MAP_VIRIDIAN_CITY call_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 0, ViridianCity_EventScript_SetOldManBlockingRoad call_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 1, ViridianCity_EventScript_SetOldManStandingByRoad call_if_ge VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 2, ViridianCity_EventScript_SetOldManNormal call_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR, 0, ViridianCity_EventScript_TryUnlockGym goto ViridianCity_MapScript_SetMasterTrainerMovementTypes end ViridianCity_EventScript_SetOldManNormal:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_OLD_MAN_1 return ViridianCity_EventScript_SetOldManStandingByRoad:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_OLD_MAN_1 setobjectxyperm LOCALID_TUTORIAL_MAN, 21, 8 setobjectmovementtype LOCALID_TUTORIAL_MAN, MOVEMENT_TYPE_LOOK_AROUND return ViridianCity_EventScript_SetOldManBlockingRoad:: setvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN setobjectxyperm LOCALID_TUTORIAL_MAN, 21, 11 setobjectmovementtype LOCALID_TUTORIAL_MAN, MOVEMENT_TYPE_FACE_DOWN return ViridianCity_EventScript_TryUnlockGym:: goto_if_unset FLAG_BADGE02_GET, EventScript_Return goto_if_unset FLAG_BADGE03_GET, EventScript_Return goto_if_unset FLAG_BADGE04_GET, EventScript_Return goto_if_unset FLAG_BADGE05_GET, EventScript_Return goto_if_unset FLAG_BADGE06_GET, EventScript_Return goto_if_unset FLAG_BADGE07_GET, EventScript_Return setvar VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR, 1 return ViridianCity_EventScript_GymDoorLocked:: lockall textcolor NPC_TEXT_COLOR_NEUTRAL applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 20 msgbox ViridianCity_Text_GymDoorsAreLocked closemessage applymovement OBJ_EVENT_ID_PLAYER, ViridianCity_Movement_JumpDownLedge waitmovement 0 releaseall end ViridianCity_Movement_JumpDownLedge:: jump_2_down step_end ViridianCity_EventScript_CitySign:: msgbox ViridianCity_Text_CitySign, MSGBOX_SIGN end ViridianCity_EventScript_TrainerTips1:: msgbox ViridianCity_Text_CatchMonsForEasierBattles, MSGBOX_SIGN end ViridianCity_EventScript_TrainerTips2:: msgbox ViridianCity_Text_MovesLimitedByPP, MSGBOX_SIGN end ViridianCity_EventScript_GymSign:: msgbox ViridianCity_Text_GymSign, MSGBOX_SIGN end ViridianCity_EventScript_GymDoor:: msgbox ViridianCity_Text_GymDoorsAreLocked, MSGBOX_SIGN end ViridianCity_EventScript_Boy:: msgbox ViridianCity_Text_CanCarryMonsAnywhere, MSGBOX_NPC end @ Other old man, not the tutorial old man ViridianCity_EventScript_OldMan:: lock faceplayer goto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR, 1, ViridianCity_EventScript_OldManGymLeaderReturned msgbox ViridianCity_Text_GymClosedWonderWhoLeaderIs closemessage applymovement LOCALID_OLD_MAN, Common_Movement_FaceOriginalDirection waitmovement 0 release end ViridianCity_EventScript_OldManGymLeaderReturned:: msgbox ViridianCity_Text_ViridiansGymLeaderReturned release end ViridianCity_EventScript_TutorialOldMan:: lock faceplayer goto_if_set FLAG_BADGE01_GET, ViridianCity_EventScript_AskIfTeachyTVHelpful goto_if_ge VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 2, ViridianCity_EventScript_TutorialCompleted goto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 1, ViridianCity_EventScript_TutorialStart goto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 0, ViridianCity_EventScript_TutorialNotReady end ViridianCity_EventScript_AskIfTeachyTVHelpful:: msgbox ViridianCity_Text_HowsTeachyTVHelping, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, ViridianCity_EventScript_TeachyTVNotHelpful msgbox ViridianCity_Text_MyGrandsonOnTheShow release end ViridianCity_EventScript_TeachyTVNotHelpful:: msgbox ViridianCity_Text_TooBusyForTeachyTV release end ViridianCity_EventScript_TutorialCompleted:: msgbox ViridianCity_Text_WeakenMonsFirstToCatch release end ViridianCity_EventScript_TutorialStart:: call ViridianCity_EventScript_DoTutorialBattle release end @ Unused ViridianCity_EventScript_WatchToLearnBasics:: msgbox ViridianCity_Text_WatchThatToLearnBasics release end @ Unused. Starts battle after the post battle text, which is odd. ViridianCity_EventScript_TutorialUnused:: msgbox ViridianCity_Text_ThatWasEducationalTakeThis goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording special StartOldManTutorialBattle waitstate release end ViridianCity_EventScript_TutorialNotReady:: msgbox ViridianCity_Text_ThisIsPrivateProperty closemessage release end ViridianCity_EventScript_Youngster:: lock faceplayer msgbox ViridianCity_Text_WantToKnowAboutCaterpillarMons, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, ViridianCity_EventScript_YoungsterExplainCaterpillars goto_if_eq VAR_RESULT, NO, ViridianCity_EventScript_YoungsterDeclineExplanation end ViridianCity_EventScript_YoungsterExplainCaterpillars:: msgbox ViridianCity_Text_ExplainCaterpieWeedle release end ViridianCity_EventScript_YoungsterDeclineExplanation:: msgbox ViridianCity_Text_OhOkayThen release end ViridianCity_EventScript_Woman:: lock faceplayer goto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 0, ViridianCity_EventScript_WomanRoadBlocked msgbox ViridianCity_Text_GoShoppingInPewterOccasionally release end ViridianCity_EventScript_WomanRoadBlocked:: msgbox ViridianCity_Text_GrandpaHasntHadCoffeeYet closemessage applymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection waitmovement 0 release end ViridianCity_EventScript_DreamEaterTutor:: goto EventScript_DreamEaterTutor end ViridianCity_EventScript_RoadBlocked:: lockall textcolor NPC_TEXT_COLOR_MALE msgbox ViridianCity_Text_ThisIsPrivateProperty closemessage applymovement OBJ_EVENT_ID_PLAYER, ViridianCity_Movement_WalkDown waitmovement 0 releaseall end ViridianCity_Movement_WalkDown:: walk_down step_end ViridianCity_EventScript_TutorialTriggerLeft:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_TUTORIAL_MAN, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 call ViridianCity_EventScript_DoTutorialBattle release end ViridianCity_EventScript_TutorialTriggerRight:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_TUTORIAL_MAN, Common_Movement_WalkInPlaceFasterRight waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 call ViridianCity_EventScript_DoTutorialBattle release end ViridianCity_EventScript_DoTutorialBattle:: specialvar VAR_RESULT, CalculatePlayerPartyCount goto_if_ne VAR_RESULT, 1, ViridianCity_EventScript_SkipTutorialBattle msgbox ViridianCity_Text_ShowYouHowToCatchMons closemessage goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording special StartOldManTutorialBattle waitstate lock faceplayer msgbox ViridianCity_Text_ThatWasEducationalTakeThis setvar VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 2 giveitem ITEM_TEACHY_TV msgbox ViridianCity_Text_WatchThatToLearnBasics return ViridianCity_EventScript_SkipTutorialBattle:: msgbox ViridianCity_Text_SkipTutorial goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording setvar VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 2 giveitem ITEM_TEACHY_TV msgbox ViridianCity_Text_WatchThatToLearnBasics release end ================================================ FILE: data/maps/ViridianCity/text.inc ================================================ ViridianCity_Text_CanCarryMonsAnywhere:: .string "Those POKé BALLS at your waist!\n" .string "You have POKéMON, don't you?\p" .string "It's great that you can carry and\n" .string "use POKéMON anytime, anywhere.$" ViridianCity_Text_GymClosedWonderWhoLeaderIs:: .string "This POKéMON GYM is always closed.\p" .string "I wonder who the LEADER is?$" ViridianCity_Text_ViridiansGymLeaderReturned:: .string "VIRIDIAN GYM's LEADER returned!$" ViridianCity_Text_WantToKnowAboutCaterpillarMons:: .string "You want to know about the two\n" .string "kinds of caterpillar POKéMON?$" ViridianCity_Text_OhOkayThen:: .string "Oh, okay then!$" ViridianCity_Text_ExplainCaterpieWeedle:: .string "CATERPIE has no poison,\n" .string "but WEEDLE does.\p" .string "Watch that your POKéMON aren't\n" .string "stabbed by WEEDLE's POISON STING.$" ViridianCity_Text_GrandpaHasntHadCoffeeYet:: .string "Oh, Grandpa!\n" .string "Don't be so mean!\p" .string "I'm so sorry.\n" .string "He hasn't had his coffee yet.$" ViridianCity_Text_GoShoppingInPewterOccasionally:: .string "I go shopping in PEWTER CITY\n" .string "occasionally.\p" .string "I have to take the winding trail in\n" .string "VIRIDIAN FOREST when I go.$" ViridianCity_Text_ThisIsPrivateProperty:: .string "I absolutely forbid you from\n" .string "going through here!\p" .string "This is private property!$" ViridianCity_Text_ShowYouHowToCatchMons:: .string "Well, now, I've had my coffee, and\n" .string "that's what I need to get going!\p" .string "Hm?\n" .string "What is that red box you have?\p" .string "Ah, so you're working on your\n" .string "POKéDEX.\p" .string "Then let me give you a word of\n" .string "advice.\p" .string "Whenever you catch a POKéMON,\n" .string "the POKéDEX automatically updates\l" .string "its data.\p" .string "…You don't know how to catch\n" .string "a POKéMON?\p" .string "I suppose I had better show you\n" .string "then!$" ViridianCity_Text_SkipTutorial:: .string "Well, now, I've had my coffee, and\n" .string "that's what I need to get going!\p" .string "Hm?\n" .string "What is that red box you have?\p" .string "Ah, so you're working on your\n" .string "POKéDEX.\p" .string "Then let me give you a word of\n" .string "advice.\p" .string "Whenever you catch a POKéMON,\n" .string "the POKéDEX automatically updates\l" .string "its data.\p" .string "I see you already know how to\n" .string "catch POKéMON!\p" .string "Why don't you take this with you," .string "\nthen?$" ViridianCity_Text_ThatWasEducationalTakeThis:: .string "There! Now tell me, that was\n" .string "educational, was it not?\p" .string "And here, take this, too.$" ViridianCity_Text_WatchThatToLearnBasics:: .string "If there's something you don't\n" .string "understand, watch that.\p" .string "It will teach you about the basics\n" .string "of being a POKéMON TRAINER.$" ViridianCity_Text_WeakenMonsFirstToCatch:: .string "Well, now, I've had my coffee, and\n" .string "that's what I need to get going!\p" .string "But I made it too strong.\n" .string "It gave me a headache…\p" .string "Incidentally, are you filling your\n" .string "POKéDEX?\p" .string "At first, focus on weakening the\n" .string "POKéMON before trying to catch it.$" ViridianCity_Text_HowsTeachyTVHelping:: .string "Well, now, I've had my coffee, and\n" .string "that's what I need to get going!\p" .string "But I made it too strong.\n" .string "It gave me a headache…\p" .string "Incidentally, is my old TEACHY TV\n" .string "helping you?$" ViridianCity_Text_MyGrandsonOnTheShow:: .string "Wahaha!\n" .string "It's my grandson on the show!\p" .string "Since he's the one doing the\n" .string "teaching, you're bound to learn.$" ViridianCity_Text_TooBusyForTeachyTV:: .string "Hm… You're too busy to not even\n" .string "have the time for TEACHY TV…\p" .string "Time is money, and neither should\n" .string "be ill spent…$" ViridianCity_Text_CitySign:: .string "VIRIDIAN CITY \n" .string "The Eternally Green Paradise$" ViridianCity_Text_CatchMonsForEasierBattles:: .string "TRAINER TIPS\p" .string "Catch POKéMON and expand your\n" .string "collection.\p" .string "The more you have, the easier it\n" .string "is to battle.$" ViridianCity_Text_MovesLimitedByPP:: .string "TRAINER TIPS\p" .string "The battle moves of POKéMON are\n" .string "limited by their POWER POINTS, PP.\p" .string "To replenish PP, rest your tired\n" .string "POKéMON at a POKéMON CENTER.$" ViridianCity_Text_GymSign:: .string "VIRIDIAN CITY POKéMON GYM$" ViridianCity_Text_GymDoorsAreLocked:: .string "VIRIDIAN GYM's doors are locked…$" ================================================ FILE: data/maps/ViridianCity_Gym/map.json ================================================ { "id": "MAP_VIRIDIAN_CITY_GYM", "name": "ViridianCity_Gym", "layout": "LAYOUT_VIRIDIAN_CITY_GYM", "music": "MUS_GYM", "region_map_section": "MAPSEC_VIRIDIAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_GYM", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "ViridianCity_Gym_EventScript_Takashi", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 12, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "ViridianCity_Gym_EventScript_Yuji", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 11, "y": 14, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "ViridianCity_Gym_EventScript_Atsushi", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TAMER", "x": 10, "y": 10, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "ViridianCity_Gym_EventScript_Jason", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_TAMER", "x": 2, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "ViridianCity_Gym_EventScript_Cole", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BLACKBELT", "in_connection": false, "x": 3, "y": 11, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "2", "script": "ViridianCity_Gym_EventScript_Kiyo", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 6, "y": 8, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "ViridianCity_Gym_EventScript_Samuel", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GIOVANNI", "in_connection": false, "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_Gym_EventScript_Giovanni", "flag": "FLAG_HIDE_VIRIDIAN_GIOVANNI" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_COOLTRAINER_M", "in_connection": false, "x": 13, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "3", "script": "ViridianCity_Gym_EventScript_Warren", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GYM_GUY", "in_connection": false, "x": 16, "y": 20, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_Gym_EventScript_GymGuy", "flag": "0" } ], "warp_events": [ { "x": 16, "y": 22, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "2" }, { "x": 17, "y": 22, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "2" }, { "x": 18, "y": 22, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "2" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 15, "y": 20, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_Gym_EventScript_GymStatue" }, { "type": "sign", "x": 19, "y": 20, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_Gym_EventScript_GymStatue" }, { "type": "hidden_item", "x": 2, "y": 2, "elevation": 3, "item": "ITEM_MACHO_BRACE", "flag": "FLAG_HIDDEN_ITEM_VIRIDIAN_CITY_GYM_MACHO_BRACE", "quantity": 1, "underfoot": true } ], "level_scaling": "4" } ================================================ FILE: data/maps/ViridianCity_Gym/scripts.inc ================================================ .set LOCALID_GIOVANNI, 8 ViridianCity_Gym_MapScripts:: .byte 0 ViridianCity_Gym_EventScript_Giovanni:: famechecker FAMECHECKER_GIOVANNI, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005 callnative IsChallengeModeToVarResult goto_if_eq VAR_RESULT, TRUE, ViridianCity_Gym_EventScript_Giovanni_ChallengeMode trainerbattle_single TRAINER_LEADER_GIOVANNI, ViridianCity_Gym_Text_GiovanniIntro, ViridianCity_Gym_Text_GiovanniDefeat, ViridianCity_Gym_EventScript_DefeatedGiovanni, NO_MUSIC settrainerflag TRAINER_LEADER_GIOVANNI_CHALLENGE goto_if_unset FLAG_GOT_TM26_FROM_GIOVANNI, ViridianCity_Gym_EventScript_GiveTM26 msgbox ViridianCity_Gym_Text_GiovanniPostBattle closemessage fadescreen FADE_TO_BLACK removeobject 8 fadescreen FADE_FROM_BLACK release end ViridianCity_Gym_EventScript_Giovanni_ChallengeMode:: trainerbattle_single TRAINER_LEADER_GIOVANNI_CHALLENGE, ViridianCity_Gym_Text_GiovanniIntro, ViridianCity_Gym_Text_GiovanniDefeat, ViridianCity_Gym_EventScript_DefeatedGiovanni, NO_MUSIC settrainerflag TRAINER_LEADER_GIOVANNI goto_if_unset FLAG_GOT_TM26_FROM_GIOVANNI, ViridianCity_Gym_EventScript_GiveTM26 msgbox ViridianCity_Gym_Text_GiovanniPostBattle closemessage fadescreen FADE_TO_BLACK removeobject LOCALID_GIOVANNI fadescreen FADE_FROM_BLACK release end ViridianCity_Gym_EventScript_DefeatedGiovanni:: famechecker FAMECHECKER_GIOVANNI, 3 setflag FLAG_HIDE_MISC_KANTO_ROCKETS setflag FLAG_DEFEATED_LEADER_GIOVANNI setflag FLAG_BADGE08_GET setvar VAR_MAP_SCENE_ROUTE22, 3 set_gym_trainers 8 goto ViridianCity_Gym_EventScript_GiveTM26 end ViridianCity_Gym_EventScript_GiveTM26:: msgbox ViridianCity_Gym_Text_ExplainEarthBadgeTakeThis checkitemspace ITEM_TM26 goto_if_eq VAR_RESULT, FALSE, ViridianCity_Gym_EventScript_NoRoomForTM26 giveitem_msg ViridianCity_Gym_Text_ReceivedTM26FromGiovanni, ITEM_TM26 setflag FLAG_GOT_TM26_FROM_GIOVANNI msgbox ViridianCity_Gym_Text_ExplainTM26 release end ViridianCity_Gym_EventScript_NoRoomForTM26:: msgbox ViridianCity_Gym_Text_YouDoNotHaveSpace release end ViridianCity_Gym_EventScript_Jason:: trainerbattle_single TRAINER_TAMER_JASON, ViridianCity_Gym_Text_JasonIntro, ViridianCity_Gym_Text_JasonDefeat msgbox ViridianCity_Gym_Text_JasonPostBattle, MSGBOX_AUTOCLOSE end ViridianCity_Gym_EventScript_Cole:: trainerbattle_single TRAINER_TAMER_COLE, ViridianCity_Gym_Text_ColeIntro, ViridianCity_Gym_Text_ColeDefeat msgbox ViridianCity_Gym_Text_ColePostBattle, MSGBOX_AUTOCLOSE end ViridianCity_Gym_EventScript_Atsushi:: trainerbattle_single TRAINER_BLACK_BELT_ATSUSHI, ViridianCity_Gym_Text_AtsushiIntro, ViridianCity_Gym_Text_AtsushiDefeat msgbox ViridianCity_Gym_Text_AtsushiPostBattle, MSGBOX_AUTOCLOSE end ViridianCity_Gym_EventScript_Kiyo:: trainerbattle_single TRAINER_BLACK_BELT_KIYO, ViridianCity_Gym_Text_KiyoIntro, ViridianCity_Gym_Text_KiyoDefeat msgbox ViridianCity_Gym_Text_KiyoPostBattle, MSGBOX_AUTOCLOSE end ViridianCity_Gym_EventScript_Takashi:: trainerbattle_single TRAINER_BLACK_BELT_TAKASHI, ViridianCity_Gym_Text_TakashiIntro, ViridianCity_Gym_Text_TakashiDefeat msgbox ViridianCity_Gym_Text_TakashiPostBattle, MSGBOX_AUTOCLOSE end ViridianCity_Gym_EventScript_Samuel:: trainerbattle_single TRAINER_COOLTRAINER_SAMUEL, ViridianCity_Gym_Text_SamuelIntro, ViridianCity_Gym_Text_SamuelDefeat msgbox ViridianCity_Gym_Text_SamuelPostBattle, MSGBOX_AUTOCLOSE end ViridianCity_Gym_EventScript_Yuji:: trainerbattle_single TRAINER_COOLTRAINER_YUJI, ViridianCity_Gym_Text_YujiIntro, ViridianCity_Gym_Text_YujiDefeat msgbox ViridianCity_Gym_Text_YujiPostBattle, MSGBOX_AUTOCLOSE end ViridianCity_Gym_EventScript_Warren:: trainerbattle_single TRAINER_COOLTRAINER_WARREN, ViridianCity_Gym_Text_WarrenIntro, ViridianCity_Gym_Text_WarrenDefeat msgbox ViridianCity_Gym_Text_WarrenPostBattle, MSGBOX_AUTOCLOSE end ViridianCity_Gym_EventScript_GymGuy:: lock faceplayer goto_if_set FLAG_DEFEATED_LEADER_GIOVANNI, ViridianCity_Gym_EventScript_GymGuyPostVictory msgbox ViridianCity_Gym_Text_GymGuyAdvice release end ViridianCity_Gym_EventScript_GymGuyPostVictory:: famechecker FAMECHECKER_GIOVANNI, 4 msgbox ViridianCity_Gym_Text_GymGuyPostVictory release end ViridianCity_Gym_EventScript_GymStatue:: lockall goto_if_set FLAG_BADGE08_GET, ViridianCity_Gym_EventScript_GymStatuePostVictory msgbox ViridianCity_Gym_Text_GymStatue releaseall end ViridianCity_Gym_EventScript_GymStatuePostVictory:: msgbox ViridianCity_Gym_Text_GymStatuePlayerWon releaseall end ================================================ FILE: data/maps/ViridianCity_Gym/text.inc ================================================ ViridianCity_Gym_Text_GiovanniIntro:: .string "Fwahahaha!\n" .string "Welcome to my hideout!\p" .string "It shall be so until I can restore\n" .string "TEAM ROCKET to its former glory.\p" .string "But, you have found me again.\n" .string "So be it.\l" .string "This time, I'm not holding back!\p" .string "Once more, you shall face\n" .string "GIOVANNI, the greatest TRAINER!{PLAY_BGM}{MUS_ENCOUNTER_ROCKET}$" ViridianCity_Gym_Text_GiovanniDefeat:: .string "Ha!\n" .string "That was a truly intense fight.\l" .string "You have won!\p" .string "As proof, here is the EARTHBADGE!\n" .string "{PAUSE_MUSIC}{PLAY_BGM}{MUS_OBTAIN_BADGE}{PAUSE 0xFE}{PAUSE 0x56}{RESUME_MUSIC}$" ViridianCity_Gym_Text_GiovanniPostBattle:: .string "Having lost in this fashion, \n" .string "I can't face my followers.\l" .string "I have betrayed their trust.\p" .string "As of today, TEAM ROCKET is\n" .string "finished forever!\p" .string "As for myself, I shall dedicate\n" .string "my life to training again.\p" .string "Let us meet again someday!\n" .string "Farewell!$" ViridianCity_Gym_Text_ExplainEarthBadgeTakeThis:: .string "The EARTHBADGE makes POKéMON of\n" .string "any level obey without question.\p" .string "It is evidence of your mastery as\n" .string "a POKéMON TRAINER.\p" .string "With it, you can challenge the\n" .string "POKéMON LEAGUE.\p" .string "Also, take this TM.\p" .string "Consider it a gift for your POKéMON\n" .string "LEAGUE challenge.$" ViridianCity_Gym_Text_ReceivedTM26FromGiovanni:: .string "{PLAYER} received TM26\n" .string "from GIOVANNI.$" ViridianCity_Gym_Text_ExplainTM26:: .string "TM26 contains EARTHQUAKE.\p" .string "It is a powerful attack that causes\n" .string "a massive tremor.\p" .string "I made it when I ran the GYM here,\n" .string "far too long ago… $" ViridianCity_Gym_Text_YouDoNotHaveSpace:: .string "You do not have space for this!$" ViridianCity_Gym_Text_YujiIntro:: .string "Heh!\n" .string "You must be running out of steam\l" .string "by now!$" ViridianCity_Gym_Text_YujiDefeat:: .string "I ran out of gas!$" ViridianCity_Gym_Text_YujiPostBattle:: .string "You'll need power to keep up with\n" .string "our GYM LEADER.$" ViridianCity_Gym_Text_AtsushiIntro:: .string "Rrrroar!\n" .string "I'm working myself into a rage!$" ViridianCity_Gym_Text_AtsushiDefeat:: .string "Wargh!$" ViridianCity_Gym_Text_AtsushiPostBattle:: .string "I'm still not worthy!$" ViridianCity_Gym_Text_JasonIntro:: .string "POKéMON and I, we make wonderful\n" .string "music together!$" ViridianCity_Gym_Text_JasonDefeat:: .string "You are in perfect harmony!$" ViridianCity_Gym_Text_JasonPostBattle:: .string "Do you know the identity of our\n" .string "GYM LEADER?$" ViridianCity_Gym_Text_KiyoIntro:: .string "Karate is the ultimate form of\n" .string "martial arts!$" ViridianCity_Gym_Text_KiyoDefeat:: .string "Aiyah!$" ViridianCity_Gym_Text_KiyoPostBattle:: .string "If my POKéMON were as good at\n" .string "karate as I…$" ViridianCity_Gym_Text_WarrenIntro:: .string "The truly talented win with style.$" ViridianCity_Gym_Text_WarrenDefeat:: .string "I lost my grip!$" ViridianCity_Gym_Text_WarrenPostBattle:: .string "The LEADER will scold me for\n" .string "losing this way…$" ViridianCity_Gym_Text_TakashiIntro:: .string "I'm the KARATE KING!\n" .string "Your fate rests with me!$" ViridianCity_Gym_Text_TakashiDefeat:: .string "Ayah!$" ViridianCity_Gym_Text_TakashiPostBattle:: .string "The POKéMON LEAGUE?\n" .string "You? Don't get cocky!$" ViridianCity_Gym_Text_ColeIntro:: .string "Your POKéMON will cower at the\n" .string "crack of my whip!$" ViridianCity_Gym_Text_ColeDefeat:: .string "Yowch!\n" .string "Whiplash!$" ViridianCity_Gym_Text_ColePostBattle:: .string "Wait!\n" .string "I was just careless!$" ViridianCity_Gym_Text_SamuelIntro:: .string "VIRIDIAN GYM was closed for a\n" .string "long time.\p" .string "But now, our LEADER is back!$" ViridianCity_Gym_Text_SamuelDefeat:: .string "I was beaten?$" ViridianCity_Gym_Text_SamuelPostBattle:: .string "You can go on to the POKéMON\n" .string "LEAGUE only by defeating our GYM\l" .string "LEADER!$" ViridianCity_Gym_Text_GymGuyAdvice:: .string "Yo!\n" .string "Champ in the making!\p" .string "Even I don't know the VIRIDIAN\n" .string "LEADER's identity.\p" .string "But one thing's certain.\n" .string "This will be the toughest of all\l" .string "the GYM LEADERS.\p" .string "Also, I heard that the TRAINERS\n" .string "here like GROUND-type POKéMON.$" ViridianCity_Gym_Text_GymGuyPostVictory:: .string "Blow me away! GIOVANNI was the\n" .string "GYM LEADER of VIRIDIAN?$" ViridianCity_Gym_Text_GymStatue:: .string "VIRIDIAN POKéMON GYM\n" .string "LEADER: ?\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}$" ViridianCity_Gym_Text_GymStatuePlayerWon:: .string "VIRIDIAN POKéMON GYM\n" .string "LEADER: GIOVANNI\p" .string "WINNING TRAINERS:\n" .string "{RIVAL}, {PLAYER}$" ================================================ FILE: data/maps/ViridianCity_House/map.json ================================================ { "id": "MAP_VIRIDIAN_CITY_HOUSE", "name": "ViridianCity_House", "layout": "LAYOUT_VIRIDIAN_CITY_HOUSE", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_VIRIDIAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BALDING_MAN", "x": 7, "y": 4, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_House_EventScript_BaldingMan", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "x": 2, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 2, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_House_EventScript_LittleGirl", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SPEAROW", "x": 6, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT", "movement_range_x": 4, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_House_EventScript_Speary", "flag": "0" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 0, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "1" }, { "x": 4, "y": 7, "elevation": 0, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "1" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "1" } ], "coord_events": [], "bg_events": [ { "type": "sign", "x": 7, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_House_EventScript_NicknameSign" } ], "level_scaling": "0" } ================================================ FILE: data/maps/ViridianCity_House/scripts.inc ================================================ ViridianCity_House_MapScripts:: .byte 0 ViridianCity_House_EventScript_BaldingMan:: msgbox ViridianCity_House_Text_NicknamingIsFun, MSGBOX_NPC end ViridianCity_House_EventScript_LittleGirl:: msgbox ViridianCity_House_Text_MyDaddyLovesMonsToo, MSGBOX_NPC end ViridianCity_House_EventScript_Speary:: lock faceplayer waitse playmoncry SPECIES_SPEAROW, CRY_MODE_NORMAL msgbox ViridianCity_House_Text_Speary waitmoncry release end ViridianCity_House_EventScript_NicknameSign:: msgbox ViridianCity_House_Text_SpearowNameSpeary, MSGBOX_SIGN end ================================================ FILE: data/maps/ViridianCity_House/text.inc ================================================ ViridianCity_House_Text_NicknamingIsFun:: .string "Coming up with nicknames is fun,\n" .string "but it's not so easy to do.\p" .string "Clever names are nice, but simple\n" .string "names are easier to remember.$" ViridianCity_House_Text_MyDaddyLovesMonsToo:: .string "My daddy loves POKéMON, too.$" ViridianCity_House_Text_Speary:: .string "SPEARY: Tetweet!$" ViridianCity_House_Text_SpearowNameSpeary:: .string "SPEAROW\n" .string "Name: SPEARY$" ================================================ FILE: data/maps/ViridianCity_Mart/map.json ================================================ { "id": "MAP_VIRIDIAN_CITY_MART", "name": "ViridianCity_Mart", "layout": "LAYOUT_MART", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_VIRIDIAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 2, "y": 3, "elevation": 0, "movement_type": "MOVEMENT_TYPE_FACE_RIGHT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_Mart_EventScript_Clerk", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_Mart_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "in_connection": false, "x": 9, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_UP_AND_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_Mart_EventScript_Woman", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_YOUNGSTER", "in_connection": false, "x": 4, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Meowth", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "4" }, { "x": 4, "y": 7, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "4" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "4" } ], "coord_events": [ ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ViridianCity_Mart/scripts.inc ================================================ .set LOCALID_CLERK, 1 .set LOCALID_MEOWTH_MASTER, 4 .set TRAINER, VAR_0x8009 ViridianCity_Mart_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, ViridianCity_Mart_OnLoad map_script MAP_SCRIPT_ON_FRAME_TABLE, ViridianCity_Mart_OnFrame map_script MAP_SCRIPT_ON_TRANSITION, ViridianCity_Mart_MapScript_SetMasterTrainerMovementTypes .byte 0 ViridianCity_Mart_OnLoad:: goto_if_unset FLAG_SYS_POKEDEX_GET, ViridianCity_Mart_EventScript_HideQuestionnaire end ViridianCity_Mart_MapScript_SetMasterTrainerMovementTypes: setvar TRAINER, MASTER_MEOWTH callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, ViridianCity_Mart_MapScript_MeowthMasterMovementType end ViridianCity_Mart_MapScript_MeowthMasterMovementType:: setobjectmovementtype LOCALID_MEOWTH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ViridianCity_Mart_EventScript_HideQuestionnaire:: setmetatile 1, 3, METATILE_Mart_CounterMid_Top, 1 setmetatile 1, 4, METATILE_Mart_CounterMid_Bottom, 1 end ViridianCity_Mart_OnFrame:: map_script_2 VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 0, ViridianCity_Mart_EventScript_ParcelScene .2byte 0 ViridianCity_Mart_EventScript_ParcelScene:: lockall textcolor NPC_TEXT_COLOR_MALE applymovement LOCALID_CLERK, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox ViridianCity_Mart_Text_YouCameFromPallet closemessage applymovement LOCALID_CLERK, ViridianCity_Mart_Movement_FacePlayer applymovement OBJ_EVENT_ID_PLAYER, ViridianCity_Mart_Movement_ApproachCounter waitmovement 0 msgbox ViridianCity_Mart_Text_TakeThisToProfOak setvar VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 1 giveitem_msg ViridianCity_Mart_Text_ReceivedOaksParcelFromClerk, ITEM_OAKS_PARCEL, 1, MUS_OBTAIN_KEY_ITEM setvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 5 releaseall end ViridianCity_Mart_Movement_ApproachCounter:: walk_up walk_up walk_up walk_up walk_in_place_faster_left step_end ViridianCity_Mart_Movement_FacePlayer:: delay_16 delay_16 delay_16 delay_16 walk_in_place_faster_right step_end ViridianCity_Mart_EventScript_Clerk:: lock faceplayer goto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 1, ViridianCity_Mart_EventScript_SayHiToOak goto_if_questlog EventScript_ReleaseEnd message Text_MayIHelpYou waitmessage pokemart ViridianCity_Mart_Items msgbox Text_PleaseComeAgain release end .align 2 ViridianCity_Mart_Items:: .2byte ITEM_POKE_BALL .2byte ITEM_POTION .2byte ITEM_ANTIDOTE .2byte ITEM_PARALYZE_HEAL .2byte ITEM_NONE release end ViridianCity_Mart_EventScript_SayHiToOak:: msgbox ViridianCity_Mart_Text_SayHiToOakForMe release end ViridianCity_Mart_EventScript_Woman:: msgbox ViridianCity_Mart_Text_ShopDoesGoodBusinessInAntidotes, MSGBOX_NPC end ViridianCity_Mart_EventScript_Youngster:: msgbox ViridianCity_Mart_Text_GotToBuySomePotions, MSGBOX_NPC end ================================================ FILE: data/maps/ViridianCity_Mart/text.inc ================================================ ViridianCity_Mart_Text_YouCameFromPallet:: .string "Hey!\n" .string "You came from PALLET TOWN?$" ViridianCity_Mart_Text_TakeThisToProfOak:: .string "You know PROF. OAK, right?\p" .string "His order came in.\n" .string "Can I get you to take it to him?$" ViridianCity_Mart_Text_ReceivedOaksParcelFromClerk:: .string "{PLAYER} received OAK'S PARCEL\n" .string "from the POKéMON MART clerk.$" ViridianCity_Mart_Text_SayHiToOakForMe:: .string "Okay, thanks! Please say hi to\n" .string "PROF. OAK for me, too.$" ViridianCity_Mart_Text_ShopDoesGoodBusinessInAntidotes:: .string "This shop does good business in\n" .string "ANTIDOTES, I've heard.$" ViridianCity_Mart_Text_GotToBuySomePotions:: .string "I've got to buy some POTIONS.\p" .string "You never know when your POKéMON\n" .string "will need quick healing.$" ================================================ FILE: data/maps/ViridianCity_PokemonCenter_1F/map.json ================================================ { "id": "MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F", "name": "ViridianCity_PokemonCenter_1F", "layout": "LAYOUT_POKEMON_CENTER_1F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_VIRIDIAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_NURSE", "in_connection": false, "x": 7, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_PokemonCenter_1F_EventScript_Nurse", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST", "in_connection": false, "x": 9, "y": 9, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", "flag": "FLAG_HIDE_NATIONAL_DEX_AIDE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "in_connection": false, "x": 12, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_PokemonCenter_1F_EventScript_Gentleman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 4, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_PokemonCenter_1F_EventScript_Boy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 2, "y": 3, "elevation": 3, "movement_type": "MOVEMENT_TYPE_WANDER_AROUND", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_PokemonCenter_1F_EventScript_Youngster", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_CLERK", "in_connection": false, "x": 8, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_SoftlockClerk", "flag": "FLAG_TEMP_8" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_PSYCHIC_M", "in_connection": false, "x": 14, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Drowzee", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 6, "y": 8, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "0" }, { "x": 7, "y": 8, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "0" }, { "x": 8, "y": 8, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "0" }, { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F", "dest_warp_id": "0" } ], "coord_events": [ { "type": "trigger", "x": 7, "y": 8, "elevation": 0, "var": "VAR_TEMP_0", "var_value": "0", "script": "NationalDexAideEvent" } ], "bg_events": [ ], "level_scaling": "0" } ================================================ FILE: data/maps/ViridianCity_PokemonCenter_1F/scripts.inc ================================================ .set LOCALID_DROWZEE_MASTER, 7 .set TRAINER, VAR_0x8009 ViridianCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, ViridianCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad .byte 0 ViridianCity_PokemonCenter_1F_MapScript_DrowzeeMasterMovementType: setobjectmovementtype LOCALID_DROWZEE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ViridianCity_PokemonCenter_1F_OnTransition:: setrespawn SPAWN_VIRIDIAN_CITY goto ViridianCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes end ViridianCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_DROWZEE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, ViridianCity_PokemonCenter_1F_MapScript_DrowzeeMasterMovementType end ViridianCity_PokemonCenter_1F_EventScript_Nurse:: lock faceplayer call EventScript_PkmnCenterNurse release end ViridianCity_PokemonCenter_1F_EventScript_Boy:: msgbox ViridianCity_PokemonCenter_1F_Text_PokeCenterInEveryTown, MSGBOX_NPC end ViridianCity_PokemonCenter_1F_EventScript_Gentleman:: msgbox ViridianCity_PokemonCenter_1F_Text_FeelFreeToUsePC, MSGBOX_NPC end ViridianCity_PokemonCenter_1F_EventScript_Youngster:: msgbox ViridianCity_PokemonCenter_1F_Text_PokeCentersHealMons, MSGBOX_NPC end ================================================ FILE: data/maps/ViridianCity_PokemonCenter_1F/text.inc ================================================ ViridianCity_PokemonCenter_1F_Text_FeelFreeToUsePC:: .string "Please feel free to use that PC in\n" .string "the corner.\p" .string "The receptionist told me so.\n" .string "It's so kind of her!$" ViridianCity_PokemonCenter_1F_Text_PokeCenterInEveryTown:: .string "There's a POKéMON CENTER in every\n" .string "town ahead.\p" .string "They charge no money, so don't\n" .string "be shy about healing POKéMON.$" ViridianCity_PokemonCenter_1F_Text_PokeCentersHealMons:: .string "POKéMON CENTERS heal your tired,\n" .string "hurt, or fainted POKéMON.\p" .string "They make all POKéMON completely\n" .string "healthy.$" ================================================ FILE: data/maps/ViridianCity_PokemonCenter_2F/map.json ================================================ { "id": "MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F", "name": "ViridianCity_PokemonCenter_2F", "layout": "LAYOUT_POKEMON_CENTER_2F", "music": "MUS_POKE_CENTER", "region_map_section": "MAPSEC_VIRIDIAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": null, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_UnionRoomAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 2, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_WirelessClubAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST", "x": 10, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "Common_EventScript_DirectCornerAttendant", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_MG_DELIVERYMAN", "x": 1, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "CableClub_EventScript_MysteryGiftMan", "flag": "FLAG_HIDE_MG_DELIVERYMEN" } ], "warp_events": [ { "x": 1, "y": 6, "elevation": 4, "dest_map": "MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F", "dest_warp_id": "3" }, { "x": 5, "y": 1, "elevation": 0, "dest_map": "MAP_UNION_ROOM", "dest_warp_id": "0" }, { "x": 9, "y": 1, "elevation": 0, "dest_map": "MAP_TRADE_CENTER", "dest_warp_id": "0" } ], "coord_events": [], "bg_events": [], "level_scaling": "0" } ================================================ FILE: data/maps/ViridianCity_PokemonCenter_2F/scripts.inc ================================================ ViridianCity_PokemonCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp map_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition .byte 0 @ The below 3 are unused and leftover from RS ViridianCity_PokemonCenter_2F_EventScript_Colosseum:: call CableClub_EventScript_Colosseum end ViridianCity_PokemonCenter_2F_EventScript_TradeCenter:: call CableClub_EventScript_TradeCenter end ViridianCity_PokemonCenter_2F_EventScript_RecordCorner:: call CableClub_EventScript_RecordCorner end ================================================ FILE: data/maps/ViridianCity_School/map.json ================================================ { "id": "MAP_VIRIDIAN_CITY_SCHOOL", "name": "ViridianCity_School", "layout": "LAYOUT_VIRIDIAN_CITY_SCHOOL", "music": "MUS_PEWTER", "region_map_section": "MAPSEC_VIRIDIAN_CITY", "requires_flash": false, "weather": "WEATHER_NONE", "map_type": "MAP_TYPE_INDOOR", "allow_cycling": false, "allow_escaping": false, "allow_running": false, "show_map_name": false, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "in_connection": false, "x": 6, "y": 2, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_School_EventScript_Woman", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_LASS", "in_connection": false, "x": 4, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianCity_School_EventScript_Lass", "flag": "0" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 8, "y": 7, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Bellsprout", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 3, "y": 7, "elevation": 0, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "3" }, { "x": 4, "y": 7, "elevation": 0, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "3" }, { "x": 5, "y": 7, "elevation": 3, "dest_map": "MAP_VIRIDIAN_CITY", "dest_warp_id": "3" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 4, "y": 4, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_School_EventScript_Notebook" }, { "type": "sign", "x": 5, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_School_EventScript_Blackboard" }, { "type": "sign", "x": 4, "y": 1, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianCity_School_EventScript_Blackboard" }, { "type": "sign", "x": 9, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "ViridianCity_School_EventScript_PokemonJournal" }, { "type": "sign", "x": 8, "y": 2, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "ViridianCity_School_EventScript_PokemonJournal" } ], "level_scaling": "0" } ================================================ FILE: data/maps/ViridianCity_School/scripts.inc ================================================ .set LOCALID_WOMAN, 1 .set LOCALID_LASS, 2 .set LOCALID_BELLSPROUT_MASTER, 3 .set TRAINER, VAR_0x8009 ViridianCity_School_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, ViridianCity_School_MapScript_SetMasterTrainerMovementTypes .byte 0 ViridianCity_School_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_BELLSPROUT callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, ViridianCity_School_MapScript_BellsproutMasterMovementType end ViridianCity_School_MapScript_BellsproutMasterMovementType:: setobjectmovementtype LOCALID_BELLSPROUT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ViridianCity_School_EventScript_Lass:: lock faceplayer msgbox ViridianCity_School_Text_TryingToMemorizeNotes closemessage applymovement LOCALID_LASS, Common_Movement_WalkInPlaceFasterUp waitmovement 0 release end ViridianCity_School_EventScript_Woman:: lock faceplayer msgbox ViridianCity_School_Text_ReadBlackboardCarefully closemessage applymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection waitmovement 0 release end ViridianCity_School_EventScript_Notebook:: lockall msgbox ViridianCity_School_Text_NotebookFirstPage msgbox ViridianCity_School_Text_TurnThePage, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, ViridianCity_School_EventScript_StopReadingNotebook msgbox ViridianCity_School_Text_NotebookSecondPage msgbox ViridianCity_School_Text_TurnThePage, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, ViridianCity_School_EventScript_StopReadingNotebook msgbox ViridianCity_School_Text_NotebookThirdPage msgbox ViridianCity_School_Text_TurnThePage, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, ViridianCity_School_EventScript_StopReadingNotebook msgbox ViridianCity_School_Text_NotebookFourthPage applymovement LOCALID_LASS, Common_Movement_WalkInPlaceFasterUp waitmovement 0 textcolor NPC_TEXT_COLOR_FEMALE msgbox ViridianCity_School_Text_HeyDontLookAtMyNotes releaseall end ViridianCity_School_EventScript_StopReadingNotebook:: releaseall end ViridianCity_School_EventScript_Blackboard:: lockall msgbox ViridianCity_School_Text_BlackboardListsStatusProblems goto ViridianCity_School_EventScript_ChooseBlackboardTopic end ViridianCity_School_EventScript_ChooseBlackboardTopic:: message ViridianCity_School_Text_ReadWhichTopic waitmessage multichoicegrid 7, 1, MULTICHOICE_TRAINER_SCHOOL_WHITEBOARD, 3, FALSE switch VAR_RESULT case 0, ViridianCity_School_EventScript_ReadSleep case 1, ViridianCity_School_EventScript_ReadPoison case 2, ViridianCity_School_EventScript_ReadParalysis case 3, ViridianCity_School_EventScript_ReadBurn case 4, ViridianCity_School_EventScript_ReadFreeze case 5, ViridianCity_School_EventScript_ExitBlackboard case 127, ViridianCity_School_EventScript_ExitBlackboard end ViridianCity_School_EventScript_ReadSleep:: msgbox ViridianCity_School_Text_ExplainSleep goto ViridianCity_School_EventScript_ChooseBlackboardTopic end ViridianCity_School_EventScript_ReadBurn:: msgbox ViridianCity_School_Text_ExplainBurn goto ViridianCity_School_EventScript_ChooseBlackboardTopic end ViridianCity_School_EventScript_ReadPoison:: msgbox ViridianCity_School_Text_ExplainPoison goto ViridianCity_School_EventScript_ChooseBlackboardTopic end ViridianCity_School_EventScript_ReadFreeze:: msgbox ViridianCity_School_Text_ExplainFreeze goto ViridianCity_School_EventScript_ChooseBlackboardTopic end ViridianCity_School_EventScript_ReadParalysis:: msgbox ViridianCity_School_Text_ExplainParalysis goto ViridianCity_School_EventScript_ChooseBlackboardTopic end ViridianCity_School_EventScript_ExitBlackboard:: releaseall end ================================================ FILE: data/maps/ViridianCity_School/text.inc ================================================ ViridianCity_School_Text_TryingToMemorizeNotes:: .string "Whew! I'm trying to memorize all my\n" .string "notes.$" ViridianCity_School_Text_ReadBlackboardCarefully:: .string "Okay!\p" .string "Be sure to read what's on the\n" .string "blackboard carefully!$" ViridianCity_School_Text_NotebookFirstPage:: .string "Let's check out the notebook.\p" .string "First page…\p" .string "POKé BALLS are used to catch\n" .string "POKéMON.\p" .string "Up to six POKéMON can be carried\n" .string "in your party.\p" .string "People who raise and battle\n" .string "with POKéMON are called TRAINERS.$" ViridianCity_School_Text_NotebookSecondPage:: .string "Second page…\p" .string "A healthy POKéMON may be hard to\n" .string "catch, so weaken it first.\p" .string "Poison, burn, or cause another\n" .string "status problem to weaken it.$" ViridianCity_School_Text_NotebookThirdPage:: .string "Third page…\p" .string "POKéMON TRAINERS seek others to\n" .string "engage in POKéMON battles.\p" .string "To TRAINERS, the taste of victory\n" .string "is sweet, indeed.\p" .string "Battles are constantly waged at\n" .string "POKéMON GYMS everywhere.$" ViridianCity_School_Text_NotebookFourthPage:: .string "Fourth page…\p" .string "The ultimate goal for all POKéMON\n" .string "TRAINERS is simple.\p" .string "It is to defeat the top eight\n" .string "POKéMON GYM LEADERS.\p" .string "Do so to earn the right to face…\p" .string "The ELITE FOUR of the POKéMON\n" .string "LEAGUE!$" ViridianCity_School_Text_TurnThePage:: .string "Turn the page?$" ViridianCity_School_Text_HeyDontLookAtMyNotes:: .string "GIRL: Hey!\n" .string "Don't look at my notes!$" ViridianCity_School_Text_BlackboardListsStatusProblems:: .string "The blackboard lists POKéMON\n" .string "STATUS problems during battles.$" ViridianCity_School_Text_ReadWhichTopic:: .string "Which topic do you want to read?$" ViridianCity_School_Text_ExplainSleep:: .string "A POKéMON can't attack if it's\n" .string "asleep.\p" .string "POKéMON will stay asleep even\n" .string "after battles.\p" .string "Use AWAKENING to awaken one\n" .string "from sleep.$" ViridianCity_School_Text_ExplainBurn:: .string "A burn reduces ATTACK power.\n" .string "It also causes ongoing HP loss.\p" .string "A burn remains after a battle.\n" .string "Use BURN HEAL to cure a burn.$" ViridianCity_School_Text_ExplainPoison:: .string "When poisoned, a POKéMON's health\n" .string "steadily drops.\p" .string "Poison lingers after battles.\n" .string "Use an ANTIDOTE to cure poison!$" ViridianCity_School_Text_ExplainFreeze:: .string "A frozen POKéMON becomes\n" .string "helplessly immobile.\p" .string "It stays frozen even after the\n" .string "battle ends.\p" .string "Use ICE HEAL to thaw out the\n" .string "suffering POKéMON.$" ViridianCity_School_Text_ExplainParalysis:: .string "Paralysis reduces SPEED and may\n" .string "prevent the POKéMON from moving.\p" .string "Paralysis remains after battles.\n" .string "Use PARLYZ HEAL for treatment.$" ================================================ FILE: data/maps/ViridianForest/map.json ================================================ { "id": "MAP_VIRIDIAN_FOREST", "name": "ViridianForest", "layout": "LAYOUT_VIRIDIAN_FOREST", "music": "MUS_VIRIDIAN_FOREST", "region_map_section": "MAPSEC_VIRIDIAN_FOREST", "requires_flash": false, "weather": "WEATHER_SHADE", "map_type": "MAP_TYPE_ROUTE", "allow_cycling": true, "allow_escaping": true, "allow_running": true, "show_map_name": true, "floor_number": 0, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ { "type": "object", "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "in_connection": false, "x": 29, "y": 58, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianForest_EventScript_Youngster", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BOY", "in_connection": false, "x": 45, "y": 58, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianForest_EventScript_Boy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 47, "y": 45, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "5", "script": "ViridianForest_EventScript_Rick", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 47, "y": 29, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "ViridianForest_EventScript_Doug", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 7, "y": 22, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_LEFT", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "4", "script": "ViridianForest_EventScript_Sammy", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 5, "y": 41, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianForest_EventScript_ItemPokeBall", "flag": "FLAG_HIDE_VIRIDIAN_FOREST_POKE_BALL" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 40, "y": 21, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianForest_EventScript_ItemAntidote", "flag": "FLAG_HIDE_VIRIDIAN_FOREST_ANTIDOTE" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 21, "y": 34, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianForest_EventScript_ItemPotion", "flag": "FLAG_HIDE_VIRIDIAN_FOREST_POTION" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 43, "y": 6, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "ViridianForest_EventScript_Anthony", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "in_connection": false, "x": 16, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_UP", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NORMAL", "trainer_sight_or_berry_tree_id": "1", "script": "ViridianForest_EventScript_Charlie", "flag": "0" }, { "type": "object", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "in_connection": false, "x": 49, "y": 60, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 1, "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "ViridianForest_EventScript_ItemPotion2", "flag": "FLAG_HIDE_VIRIDIAN_FOREST_POTION_2" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_LASS", "in_connection": false, "x": 13, "y": 5, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Pikachu", "flag": "FLAG_HIDE_MASTER_TRAINERS" }, { "graphics_id": "OBJ_EVENT_GFX_MASTER_BUG_CATCHER", "in_connection": false, "x": 29, "y": 44, "elevation": 3, "movement_type": "MOVEMENT_TYPE_FACE_DOWN", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "MasterTrainer_EventScript_Weedle", "flag": "FLAG_HIDE_MASTER_TRAINERS" } ], "warp_events": [ { "x": 29, "y": 62, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE", "dest_warp_id": "3" }, { "x": 28, "y": 62, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE", "dest_warp_id": "3" }, { "x": 5, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE", "dest_warp_id": "1" }, { "x": 6, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE", "dest_warp_id": "1" }, { "x": 30, "y": 62, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE", "dest_warp_id": "3" }, { "x": 4, "y": 9, "elevation": 3, "dest_map": "MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE", "dest_warp_id": "1" } ], "coord_events": [ ], "bg_events": [ { "type": "sign", "x": 39, "y": 59, "elevation": 3, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianForest_EventScript_TrainerTips1" }, { "type": "sign", "x": 43, "y": 26, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianForest_EventScript_TrainerTips3" }, { "type": "sign", "x": 9, "y": 29, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianForest_EventScript_TrainerTips4" }, { "type": "sign", "x": 6, "y": 12, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianForest_EventScript_ExitSign" }, { "type": "sign", "x": 28, "y": 44, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianForest_EventScript_TrainerTips2" }, { "type": "sign", "x": 31, "y": 60, "elevation": 0, "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "ViridianForest_EventScript_TrainerTips5" }, { "type": "hidden_item", "x": 3, "y": 22, "elevation": 3, "item": "ITEM_POTION", "flag": "FLAG_HIDDEN_ITEM_VIRIDIAN_FOREST_POTION", "quantity": 1, "underfoot": false }, { "type": "hidden_item", "x": 28, "y": 57, "elevation": 0, "item": "ITEM_ANTIDOTE", "flag": "FLAG_HIDDEN_ITEM_VIRIDIAN_FOREST_ANTIDOTE", "quantity": 1, "underfoot": false } ], "level_scaling": "1" } ================================================ FILE: data/maps/ViridianForest/scripts.inc ================================================ .set LOCALID_PIKACHU_MASTER, 12 .set LOCALID_WEEDLE_MASTER, 13 .set TRAINER, VAR_0x8009 ViridianForest_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, ViridianForest_OnTransition .byte 0 ViridianForest_OnTransition:: setworldmapflag FLAG_WORLD_MAP_VIRIDIAN_FOREST goto ViridianForest_MapScript_SetMasterTrainerMovementTypes end ViridianForest_MapScript_SetMasterTrainerMovementTypes:: setvar TRAINER, MASTER_PIKACHU callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, ViridianForest_MapScript_PikachuMasterMovementType setvar TRAINER, MASTER_WEEDLE callnative ShouldChangeMasterTrainerMovementType call_if_eq VAR_RESULT, FALSE, ViridianForest_MapScript_WeedleMasterMovementType end ViridianForest_MapScript_PikachuMasterMovementType:: setobjectmovementtype LOCALID_PIKACHU_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ViridianForest_MapScript_WeedleMasterMovementType:: setobjectmovementtype LOCALID_WEEDLE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP return ViridianForest_EventScript_Youngster:: msgbox ViridianForest_Text_FriendsItchingToBattle, MSGBOX_NPC end ViridianForest_EventScript_Boy:: msgbox ViridianForest_Text_RanOutOfPokeBalls, MSGBOX_NPC end ViridianForest_EventScript_TrainerTips1:: msgbox ViridianForest_Text_AvoidGrassyAreasWhenWeak, MSGBOX_SIGN end ViridianForest_EventScript_TrainerTips2:: msgbox ViridianForest_Text_UseAntidoteForPoison, MSGBOX_SIGN end ViridianForest_EventScript_TrainerTips3:: msgbox ViridianForest_Text_ContactOakViaPCToRatePokedex, MSGBOX_SIGN end ViridianForest_EventScript_TrainerTips4:: msgbox ViridianForest_Text_CantCatchOwnedMons, MSGBOX_SIGN end ViridianForest_EventScript_TrainerTips5:: msgbox ViridianForest_Text_WeakenMonsBeforeCapture, MSGBOX_SIGN end ViridianForest_EventScript_ExitSign:: msgbox ViridianForest_Text_LeavingViridianForest, MSGBOX_SIGN end ViridianForest_EventScript_Rick:: trainerbattle_single TRAINER_BUG_CATCHER_RICK, ViridianForest_Text_RickIntro, ViridianForest_Text_RickDefeat msgbox ViridianForest_Text_RickPostBattle, MSGBOX_AUTOCLOSE end ViridianForest_EventScript_Doug:: trainerbattle_single TRAINER_BUG_CATCHER_DOUG, ViridianForest_Text_DougIntro, ViridianForest_Text_DougDefeat msgbox ViridianForest_Text_DougPostBattle, MSGBOX_AUTOCLOSE end ViridianForest_EventScript_Sammy:: trainerbattle_single TRAINER_BUG_CATCHER_SAMMY, ViridianForest_Text_SammyIntro, ViridianForest_Text_SammyDefeat msgbox ViridianForest_Text_SammyPostBattle, MSGBOX_AUTOCLOSE end ViridianForest_EventScript_Anthony:: trainerbattle_single TRAINER_BUG_CATCHER_ANTHONY, ViridianForest_Text_AnthonyIntro, ViridianForest_Text_AnthonyDefeat msgbox ViridianForest_Text_AnthonyPostBattle, MSGBOX_AUTOCLOSE end ViridianForest_EventScript_Charlie:: trainerbattle_single TRAINER_BUG_CATCHER_CHARLIE, ViridianForest_Text_CharlieIntro, ViridianForest_Text_CharlieDefeat msgbox ViridianForest_Text_CharliePostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/maps/ViridianForest/text.inc ================================================ ViridianForest_Text_FriendsItchingToBattle:: .string "I came here with some friends to\n" .string "catch us some BUG POKéMON!\p" .string "They're all itching to get into\n" .string "some POKéMON battles!$" ViridianForest_Text_RickIntro:: .string "Hey! You have POKéMON!\n" .string "Come on!\l" .string "Let's battle 'em!$" ViridianForest_Text_RickDefeat:: .string "No!\nCATERPIE can't hack it!$" ViridianForest_Text_RickPostBattle:: .string "Ssh! You'll scare the bugs away.\n" .string "Another time, okay?$" ViridianForest_Text_DougIntro:: .string "Yo!\n" .string "You can't jam out if you're a\l" .string "POKéMON TRAINER!$" ViridianForest_Text_DougDefeat:: .string "Huh?\n" .string "I ran out of POKéMON!$" ViridianForest_Text_DougPostBattle:: .string "That totally stinks! I'm going to\n" .string "catch some stronger ones!$" ViridianForest_Text_SammyIntro:: .string "Hey, wait up!\n" .string "What's the hurry? Why the rush?$" ViridianForest_Text_SammyDefeat:: .string "I give!\n" .string "You're good at this!$" ViridianForest_Text_SammyPostBattle:: .string "Sometimes, you can find stuff on\n" .string "the ground.\p" .string "I'm looking for the stuff I\n" .string "dropped. Can you help me?$" ViridianForest_Text_AnthonyIntro:: .string "I might be little, but I won't like\n" .string "it if you go easy on me!$" ViridianForest_Text_AnthonyDefeat:: .string "Oh, boo.\n" .string "Nothing went right.$" ViridianForest_Text_AnthonyPostBattle:: .string "I lost some of my allowance…$" ViridianForest_Text_CharlieIntro:: .string "Did you know that POKéMON evolve?$" ViridianForest_Text_CharlieDefeat:: .string "Oh!\n" .string "I lost!$" ViridianForest_Text_CharliePostBattle:: .string "BUG POKéMON evolve quickly.\n" .string "They're a lot of fun!$" ViridianForest_Text_RanOutOfPokeBalls:: .string "I was throwing POKé BALLS to\n" .string "catch POKéMON, and I ran out.\p" .string "That's why you can never have too\n" .string "many POKé BALLS.$" ViridianForest_Text_AvoidGrassyAreasWhenWeak:: .string "TRAINER TIPS\p" .string "If your POKéMON are weak and you\n" .string "want to avoid battles, stay away\l" .string "from grassy areas!$" ViridianForest_Text_UseAntidoteForPoison:: .string "For poison, use ANTIDOTE!\n" .string "Get it at POKéMON MARTS!$" ViridianForest_Text_ContactOakViaPCToRatePokedex:: .string "TRAINER TIPS\p" .string "Contact PROF. OAK via a PC to\n" .string "get your POKéDEX evaluated!$" ViridianForest_Text_CantCatchOwnedMons:: .string "TRAINER TIPS\p" .string "You can't catch a POKéMON that\n" .string "belongs to someone else.\p" .string "Throw POKé BALLS only at wild\n" .string "POKéMON to catch them!$" ViridianForest_Text_WeakenMonsBeforeCapture:: .string "TRAINER TIPS\p" .string "Weaken POKéMON before attempting\n" .string "capture!\p" .string "When healthy, they may escape!$" ViridianForest_Text_LeavingViridianForest:: .string "LEAVING VIRIDIAN FOREST\n" .string "PEWTER CITY AHEAD$" ================================================ FILE: data/maps/map_groups.json ================================================ { "group_order": [ "gMapGroup_Link", "gMapGroup_Dungeons", "gMapGroup_SpecialArea", "gMapGroup_TownsAndRoutes", "gMapGroup_IndoorPallet", "gMapGroup_IndoorViridian", "gMapGroup_IndoorPewter", "gMapGroup_IndoorCerulean", "gMapGroup_IndoorLavender", "gMapGroup_IndoorVermilion", "gMapGroup_IndoorCeladon", "gMapGroup_IndoorFuchsia", "gMapGroup_IndoorCinnabar", "gMapGroup_IndoorIndigoPlateau", "gMapGroup_IndoorSaffron", "gMapGroup_IndoorRoute2", "gMapGroup_IndoorRoute4", "gMapGroup_IndoorRoute5", "gMapGroup_IndoorRoute6", "gMapGroup_IndoorRoute7", "gMapGroup_IndoorRoute8", "gMapGroup_IndoorRoute10", "gMapGroup_IndoorRoute11", "gMapGroup_IndoorRoute12", "gMapGroup_IndoorRoute15", "gMapGroup_IndoorRoute16", "gMapGroup_IndoorRoute18", "gMapGroup_IndoorRoute19", "gMapGroup_IndoorRoute22", "gMapGroup_IndoorRoute23", "gMapGroup_IndoorRoute25", "gMapGroup_IndoorSevenIsland", "gMapGroup_IndoorOneIsland", "gMapGroup_IndoorTwoIsland", "gMapGroup_IndoorThreeIsland", "gMapGroup_IndoorFourIsland", "gMapGroup_IndoorFiveIsland", "gMapGroup_IndoorSixIsland", "gMapGroup_IndoorThreeIslandRoute", "gMapGroup_IndoorFiveIslandRoute", "gMapGroup_IndoorTwoIslandRoute", "gMapGroup_IndoorSixIslandRoute", "gMapGroup_IndoorSevenIslandRoute", "gMapGroup_RSE" ], "gMapGroup_Link": [ "BattleColosseum_2P", "TradeCenter", "RecordCorner", "BattleColosseum_4P", "UnionRoom" ], "gMapGroup_Dungeons": [ "ViridianForest", "MtMoon_1F", "MtMoon_B1F", "MtMoon_B2F", "SSAnne_Exterior", "SSAnne_1F_Corridor", "SSAnne_2F_Corridor", "SSAnne_3F_Corridor", "SSAnne_B1F_Corridor", "SSAnne_Deck", "SSAnne_Kitchen", "SSAnne_CaptainsOffice", "SSAnne_1F_Room1", "SSAnne_1F_Room2", "SSAnne_1F_Room3", "SSAnne_1F_Room4", "SSAnne_1F_Room5", "SSAnne_1F_Room7", "SSAnne_2F_Room1", "SSAnne_2F_Room2", "SSAnne_2F_Room3", "SSAnne_2F_Room4", "SSAnne_2F_Room5", "SSAnne_2F_Room6", "SSAnne_B1F_Room1", "SSAnne_B1F_Room2", "SSAnne_B1F_Room3", "SSAnne_B1F_Room4", "SSAnne_B1F_Room5", "SSAnne_1F_Room6", "UndergroundPath_NorthEntrance", "UndergroundPath_NorthSouthTunnel", "UndergroundPath_SouthEntrance", "UndergroundPath_WestEntrance", "UndergroundPath_EastWestTunnel", "UndergroundPath_EastEntrance", "DiglettsCave_NorthEntrance", "DiglettsCave_B1F", "DiglettsCave_SouthEntrance", "VictoryRoad_1F", "VictoryRoad_2F", "VictoryRoad_3F", "RocketHideout_B1F", "RocketHideout_B2F", "RocketHideout_B3F", "RocketHideout_B4F", "RocketHideout_Elevator", "SilphCo_1F", "SilphCo_2F", "SilphCo_3F", "SilphCo_4F", "SilphCo_5F", "SilphCo_6F", "SilphCo_7F", "SilphCo_8F", "SilphCo_9F", "SilphCo_10F", "SilphCo_11F", "SilphCo_Elevator", "PokemonMansion_1F", "PokemonMansion_2F", "PokemonMansion_3F", "PokemonMansion_B1F", "SafariZone_Center", "SafariZone_East", "SafariZone_North", "SafariZone_West", "SafariZone_Center_RestHouse", "SafariZone_East_RestHouse", "SafariZone_North_RestHouse", "SafariZone_West_RestHouse", "SafariZone_SecretHouse", "SafariZone_NorthWest", "SafariZone_NorthEast", "SafariZone_NorthWest_RestHouse", "CeruleanCave_1F", "CeruleanCave_2F", "CeruleanCave_B1F", "PokemonLeague_LoreleisRoom", "PokemonLeague_BrunosRoom", "PokemonLeague_AgathasRoom", "PokemonLeague_LancesRoom", "PokemonLeague_ChampionsRoom", "PokemonLeague_HallOfFame", "RockTunnel_1F", "RockTunnel_B1F", "SeafoamIslands_1F", "SeafoamIslands_B1F", "SeafoamIslands_B2F", "SeafoamIslands_B3F", "SeafoamIslands_B4F", "PokemonTower_1F", "PokemonTower_2F", "PokemonTower_3F", "PokemonTower_4F", "PokemonTower_5F", "PokemonTower_6F", "PokemonTower_7F", "PowerPlant", "MtEmber_RubyPath_B4F", "MtEmber_Exterior", "MtEmber_SummitPath_1F", "MtEmber_SummitPath_2F", "MtEmber_SummitPath_3F", "MtEmber_Summit", "MtEmber_RubyPath_B5F", "MtEmber_RubyPath_1F", "MtEmber_RubyPath_B1F", "MtEmber_RubyPath_B2F", "MtEmber_RubyPath_B3F", "MtEmber_RubyPath_B1F_Stairs", "MtEmber_RubyPath_B2F_Stairs", "ThreeIsland_BerryForest", "FourIsland_IcefallCave_Entrance", "FourIsland_IcefallCave_1F", "FourIsland_IcefallCave_B1F", "FourIsland_IcefallCave_Back", "FiveIsland_RocketWarehouse", "SixIsland_DottedHole_1F", "SixIsland_DottedHole_B1F", "SixIsland_DottedHole_B2F", "SixIsland_DottedHole_B3F", "SixIsland_DottedHole_B4F", "SixIsland_DottedHole_SapphireRoom", "SixIsland_PatternBush", "SixIsland_AlteringCave" ], "gMapGroup_SpecialArea": [ "NavelRock_Exterior", "TrainerTower_1F", "TrainerTower_2F", "TrainerTower_3F", "TrainerTower_4F", "TrainerTower_5F", "TrainerTower_6F", "TrainerTower_7F", "TrainerTower_8F", "TrainerTower_Roof", "TrainerTower_Lobby", "TrainerTower_Elevator", "FiveIsland_LostCave_Entrance", "FiveIsland_LostCave_Room1", "FiveIsland_LostCave_Room2", "FiveIsland_LostCave_Room3", "FiveIsland_LostCave_Room4", "FiveIsland_LostCave_Room5", "FiveIsland_LostCave_Room6", "FiveIsland_LostCave_Room7", "FiveIsland_LostCave_Room8", "FiveIsland_LostCave_Room9", "FiveIsland_LostCave_Room10", "FiveIsland_LostCave_Room11", "FiveIsland_LostCave_Room12", "FiveIsland_LostCave_Room13", "FiveIsland_LostCave_Room14", "SevenIsland_TanobyRuins_MoneanChamber", "SevenIsland_TanobyRuins_LiptooChamber", "SevenIsland_TanobyRuins_WeepthChamber", "SevenIsland_TanobyRuins_DilfordChamber", "SevenIsland_TanobyRuins_ScufibChamber", "SevenIsland_TanobyRuins_RixyChamber", "SevenIsland_TanobyRuins_ViapoisChamber", "ThreeIsland_DunsparceTunnel", "SevenIsland_SevaultCanyon_TanobyKey", "NavelRock_1F", "NavelRock_Summit", "NavelRock_Base", "NavelRock_SummitPath_2F", "NavelRock_SummitPath_3F", "NavelRock_SummitPath_4F", "NavelRock_SummitPath_5F", "NavelRock_BasePath_B1F", "NavelRock_BasePath_B2F", "NavelRock_BasePath_B3F", "NavelRock_BasePath_B4F", "NavelRock_BasePath_B5F", "NavelRock_BasePath_B6F", "NavelRock_BasePath_B7F", "NavelRock_BasePath_B8F", "NavelRock_BasePath_B9F", "NavelRock_BasePath_B10F", "NavelRock_BasePath_B11F", "NavelRock_B1F", "NavelRock_Fork", "BirthIsland_Exterior", "OneIsland_KindleRoad_EmberSpa", "BirthIsland_Harbor", "NavelRock_Harbor", "FarawayIsland_Exterior", "FarawayIsland_Interior", "ArtisanCave_B1F", "ArtisanCave_1F", "SouthernIsland_Exterior", "SouthernIsland_Interior", "CeruleanCave_1F_Blue", "CeruleanCave_2F_Blue", "CeruleanCave_B1F_Blue", "CeruleanCave_1F_Yellow", "CeruleanCave_2F_Yellow", "CeruleanCave_B1F_Yellow" ], "gMapGroup_TownsAndRoutes": [ "PalletTown", "ViridianCity", "PewterCity", "CeruleanCity", "LavenderTown", "VermilionCity", "CeladonCity", "FuchsiaCity", "CinnabarIsland", "IndigoPlateau_Exterior", "SaffronCity", "SaffronCity_Connection", "OneIsland", "TwoIsland", "ThreeIsland", "FourIsland", "FiveIsland", "SevenIsland", "SixIsland", "Route1", "Route2", "Route3", "Route4", "Route5", "Route6", "Route7", "Route8", "Route9", "Route10", "Route11", "Route12", "Route13", "Route14", "Route15", "Route16", "Route17", "Route18", "Route19", "Route20", "Route21_North", "Route21_South", "Route22", "Route23", "Route24", "Route25", "OneIsland_KindleRoad", "OneIsland_TreasureBeach", "TwoIsland_CapeBrink", "ThreeIsland_BondBridge", "ThreeIsland_Port", "Prototype_SeviiIsle_6", "Prototype_SeviiIsle_7", "Prototype_SeviiIsle_8", "Prototype_SeviiIsle_9", "FiveIsland_ResortGorgeous", "FiveIsland_WaterLabyrinth", "FiveIsland_Meadow", "FiveIsland_MemorialPillar", "SixIsland_OutcastIsland", "SixIsland_GreenPath", "SixIsland_WaterPath", "SixIsland_RuinValley", "SevenIsland_TrainerTower", "SevenIsland_SevaultCanyon_Entrance", "SevenIsland_SevaultCanyon", "SevenIsland_TanobyRuins", "Route20_Underwater", "ThreeIsland_BondBridge_Underwater", "FourIsland_Base" ], "gMapGroup_IndoorPallet": [ "PalletTown_PlayersHouse_1F", "PalletTown_PlayersHouse_2F", "PalletTown_RivalsHouse", "PalletTown_ProfessorOaksLab" ], "gMapGroup_IndoorViridian": [ "ViridianCity_House", "ViridianCity_Gym", "ViridianCity_School", "ViridianCity_Mart", "ViridianCity_PokemonCenter_1F", "ViridianCity_PokemonCenter_2F" ], "gMapGroup_IndoorPewter": [ "PewterCity_Museum_1F", "PewterCity_Museum_2F", "PewterCity_Gym", "PewterCity_Mart", "PewterCity_House1", "PewterCity_PokemonCenter_1F", "PewterCity_PokemonCenter_2F", "PewterCity_House2" ], "gMapGroup_IndoorCerulean": [ "CeruleanCity_House1", "CeruleanCity_House2", "CeruleanCity_House3", "CeruleanCity_PokemonCenter_1F", "CeruleanCity_PokemonCenter_2F", "CeruleanCity_Gym", "CeruleanCity_BikeShop", "CeruleanCity_Mart", "CeruleanCity_House4", "CeruleanCity_House5" ], "gMapGroup_IndoorLavender": [ "LavenderTown_PokemonCenter_1F", "LavenderTown_PokemonCenter_2F", "LavenderTown_VolunteerPokemonHouse", "LavenderTown_House1", "LavenderTown_House2", "LavenderTown_Mart" ], "gMapGroup_IndoorVermilion": [ "VermilionCity_House1", "VermilionCity_PokemonCenter_1F", "VermilionCity_PokemonCenter_2F", "VermilionCity_PokemonFanClub", "VermilionCity_House2", "VermilionCity_Mart", "VermilionCity_Gym", "VermilionCity_House3" ], "gMapGroup_IndoorCeladon": [ "CeladonCity_DepartmentStore_1F", "CeladonCity_DepartmentStore_2F", "CeladonCity_DepartmentStore_3F", "CeladonCity_DepartmentStore_4F", "CeladonCity_DepartmentStore_5F", "CeladonCity_DepartmentStore_Roof", "CeladonCity_DepartmentStore_Elevator", "CeladonCity_Condominiums_1F", "CeladonCity_Condominiums_2F", "CeladonCity_Condominiums_3F", "CeladonCity_Condominiums_Roof", "CeladonCity_Condominiums_RoofRoom", "CeladonCity_PokemonCenter_1F", "CeladonCity_PokemonCenter_2F", "CeladonCity_GameCorner", "CeladonCity_GameCorner_PrizeRoom", "CeladonCity_Gym", "CeladonCity_Restaurant", "CeladonCity_House1", "CeladonCity_Hotel" ], "gMapGroup_IndoorFuchsia": [ "FuchsiaCity_SafariZone_Entrance", "FuchsiaCity_Mart", "FuchsiaCity_SafariZone_Office", "FuchsiaCity_Gym", "FuchsiaCity_House1", "FuchsiaCity_PokemonCenter_1F", "FuchsiaCity_PokemonCenter_2F", "FuchsiaCity_WardensHouse", "FuchsiaCity_House2", "FuchsiaCity_House3" ], "gMapGroup_IndoorCinnabar": [ "CinnabarIsland_Gym", "CinnabarIsland_PokemonLab_Entrance", "CinnabarIsland_PokemonLab_Lounge", "CinnabarIsland_PokemonLab_ResearchRoom", "CinnabarIsland_PokemonLab_ExperimentRoom", "CinnabarIsland_PokemonCenter_1F", "CinnabarIsland_PokemonCenter_2F", "CinnabarIsland_Mart" ], "gMapGroup_IndoorIndigoPlateau": [ "IndigoPlateau_PokemonCenter_1F", "IndigoPlateau_PokemonCenter_2F" ], "gMapGroup_IndoorSaffron": [ "SaffronCity_CopycatsHouse_1F", "SaffronCity_CopycatsHouse_2F", "SaffronCity_Dojo", "SaffronCity_Gym", "SaffronCity_House", "SaffronCity_Mart", "SaffronCity_PokemonCenter_1F", "SaffronCity_PokemonCenter_2F", "SaffronCity_MrPsychicsHouse", "SaffronCity_PokemonTrainerFanClub" ], "gMapGroup_IndoorRoute2": [ "Route2_ViridianForest_SouthEntrance", "Route2_House", "Route2_EastBuilding", "Route2_ViridianForest_NorthEntrance" ], "gMapGroup_IndoorRoute4": [ "Route4_PokemonCenter_1F", "Route4_PokemonCenter_2F" ], "gMapGroup_IndoorRoute5": [ "Route5_PokemonDayCare", "Route5_SouthEntrance" ], "gMapGroup_IndoorRoute6": [ "Route6_NorthEntrance", "Route6_UnusedHouse" ], "gMapGroup_IndoorRoute7": [ "Route7_EastEntrance" ], "gMapGroup_IndoorRoute8": [ "Route8_WestEntrance" ], "gMapGroup_IndoorRoute10": [ "Route10_PokemonCenter_1F", "Route10_PokemonCenter_2F" ], "gMapGroup_IndoorRoute11": [ "Route11_EastEntrance_1F", "Route11_EastEntrance_2F" ], "gMapGroup_IndoorRoute12": [ "Route12_NorthEntrance_1F", "Route12_NorthEntrance_2F", "Route12_FishingHouse" ], "gMapGroup_IndoorRoute15": [ "Route15_WestEntrance_1F", "Route15_WestEntrance_2F" ], "gMapGroup_IndoorRoute16": [ "Route16_House", "Route16_NorthEntrance_1F", "Route16_NorthEntrance_2F" ], "gMapGroup_IndoorRoute18": [ "Route18_EastEntrance_1F", "Route18_EastEntrance_2F" ], "gMapGroup_IndoorRoute19": [ "Route19_UnusedHouse" ], "gMapGroup_IndoorRoute22": [ "Route22_NorthEntrance" ], "gMapGroup_IndoorRoute23": [ "Route23_UnusedHouse" ], "gMapGroup_IndoorRoute25": [ "Route25_SeaCottage" ], "gMapGroup_IndoorSevenIsland": [ "SevenIsland_House_Room1", "SevenIsland_House_Room2", "SevenIsland_Mart", "SevenIsland_PokemonCenter_1F", "SevenIsland_PokemonCenter_2F", "SevenIsland_UnusedHouse", "SevenIsland_Harbor" ], "gMapGroup_IndoorOneIsland": [ "OneIsland_PokemonCenter_1F", "OneIsland_PokemonCenter_2F", "OneIsland_House1", "OneIsland_House2", "OneIsland_Harbor", "OneIsland_KindleRoad_GlassWorkshop" ], "gMapGroup_IndoorTwoIsland": [ "TwoIsland_JoyfulGameCorner", "TwoIsland_House", "TwoIsland_PokemonCenter_1F", "TwoIsland_PokemonCenter_2F", "TwoIsland_Harbor" ], "gMapGroup_IndoorThreeIsland": [ "ThreeIsland_House1", "ThreeIsland_PokemonCenter_1F", "ThreeIsland_PokemonCenter_2F", "ThreeIsland_Mart", "ThreeIsland_House2", "ThreeIsland_House3", "ThreeIsland_House4", "ThreeIsland_House5" ], "gMapGroup_IndoorFourIsland": [ "FourIsland_PokemonDayCare", "FourIsland_PokemonCenter_1F", "FourIsland_PokemonCenter_2F", "FourIsland_House1", "FourIsland_LoreleisHouse", "FourIsland_Harbor", "FourIsland_House2", "FourIsland_Mart", "FourIsland_Base_CableCarStation", "FourIsland_CableCarStation" ], "gMapGroup_IndoorFiveIsland": [ "FiveIsland_PokemonCenter_1F", "FiveIsland_PokemonCenter_2F", "FiveIsland_Harbor", "FiveIsland_House1", "FiveIsland_House2" ], "gMapGroup_IndoorSixIsland": [ "SixIsland_PokemonCenter_1F", "SixIsland_PokemonCenter_2F", "SixIsland_Harbor", "SixIsland_House", "SixIsland_Mart" ], "gMapGroup_IndoorThreeIslandRoute": [ "ThreeIsland_Harbor" ], "gMapGroup_IndoorFiveIslandRoute": [ "FiveIsland_ResortGorgeous_House" ], "gMapGroup_IndoorTwoIslandRoute": [ "TwoIsland_CapeBrink_House" ], "gMapGroup_IndoorSixIslandRoute": [ "SixIsland_WaterPath_House1", "SixIsland_WaterPath_House2" ], "gMapGroup_IndoorSevenIslandRoute": [ "SevenIsland_SevaultCanyon_House" ], "gMapGroup_RSE": [ "RS_BattleTower", "RS_BattleTower_Lobby", "RS_BattleTower_Elevator", "RS_BattleTower_Corridor", "RS_BattleTower_BattleRoom", "BattleFrontier_OutsideWest", "BattleFrontier_OutsideEast", "BattleFrontier_ReceptionGate", "BattleFrontier_PokemonCenter_1F", "BattleFrontier_PokemonCenter_2F", "BattleFrontier_Mart", "BattleFrontier_ExchangeServiceCorner", "BattleFrontier_RankingHall", "BattleFrontier_ScottsHouse", "BattleFrontier_Lounge1", "BattleFrontier_Lounge2", "BattleFrontier_Lounge3", "BattleFrontier_Lounge4", "BattleFrontier_Lounge5", "BattleFrontier_Lounge6", "BattleFrontier_Lounge7", "BattleFrontier_Lounge8" ] } ================================================ FILE: data/maps.s ================================================ #include "constants/global.h" #include "constants/layouts.h" #include "constants/maps.h" #include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/items.h" #include "constants/weather.h" .include "asm/macros.inc" .include "constants/constants.inc" .section .rodata .include "data/layouts/layouts.inc" .include "data/layouts/layouts_table.inc" .include "data/maps/headers.inc" .include "data/maps/groups.inc" .include "data/maps/connections.inc" ================================================ FILE: data/multiboot_berry_glitch_fix.s ================================================ .section .rodata gMultiBootProgram_BerryGlitchFix_Start:: .incbin "data/mb_berry_fix.gba" gMultiBootProgram_BerryGlitchFix_End:: ================================================ FILE: data/multiboot_ereader.s ================================================ .section .rodata gMultiBootProgram_EReader_Start:: .incbin "data/mb_ereader.gba" gMultiBootProgram_EReader_End:: ================================================ FILE: data/multiboot_pokemon_colosseum.s ================================================ .section .rodata gMultiBootProgram_PokemonColosseum_Start:: .incbin "data/mb_colosseum.gba" gMultiBootProgram_PokemonColosseum_End:: ================================================ FILE: data/mystery_event_msg.s ================================================ @ These are event scripts. They should not be moved to C. #include "constants/global.h" #include "constants/flags.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/species.h" #include "constants/vars.h" #include "constants/items.h" #include "constants/region_map_sections.h" .include "asm/macros.inc" .include "asm/macros/event.inc" .include "constants/constants.inc" .section .rodata .align 2 MysteryEventScript_StampCard:: setvaddress MysteryEventScript_StampCard setorcopyvar VAR_RESULT, 1 specialvar VAR_0x8008, GetMysteryGiftCardStat setorcopyvar VAR_RESULT, 0 specialvar VAR_0x8009, GetMysteryGiftCardStat subvar VAR_0x8008, VAR_0x8009 buffernumberstring STR_VAR_1, VAR_0x8008 lock faceplayer vmessage sText_MysteryGiftStampCard waitmessage waitbuttonpress release end sText_MysteryGiftStampCard: .string "Thank you for using the STAMP CARD\n" .string "System.\p" .string "You have {STR_VAR_1} more to collect to\n" .string "fill your STAMP CARD.$" MysteryEventScript_SurfPichu:: setvaddress MysteryEventScript_SurfPichu vgoto_if_unset FLAG_MYSTERY_GIFT_DONE, SurfPichu_GiveIfPossible returnram SurfPichu_GiveIfPossible: specialvar VAR_EVENT_PICHU_SLOT, CalculatePlayerPartyCount vgoto_if_eq VAR_EVENT_PICHU_SLOT, PARTY_SIZE, SurfPichu_FullParty setflag FLAG_MYSTERY_GIFT_DONE vcall SurfPichu_GiveEgg lock faceplayer vmessage sText_MysteryGiftEgg waitmessage waitbuttonpress playfanfare MUS_OBTAIN_ITEM waitfanfare release end SurfPichu_FullParty: lock faceplayer vmessage sText_FullParty waitmessage waitbuttonpress release end SurfPichu_GiveEgg: giveegg SPECIES_PICHU setmonmodernfatefulencounter VAR_EVENT_PICHU_SLOT setmonmetlocation VAR_EVENT_PICHU_SLOT, METLOC_FATEFUL_ENCOUNTER vgoto_if_eq VAR_EVENT_PICHU_SLOT, 1, SurfPichu_Slot1 vgoto_if_eq VAR_EVENT_PICHU_SLOT, 2, SurfPichu_Slot2 vgoto_if_eq VAR_EVENT_PICHU_SLOT, 3, SurfPichu_Slot3 vgoto_if_eq VAR_EVENT_PICHU_SLOT, 4, SurfPichu_Slot4 vgoto_if_eq VAR_EVENT_PICHU_SLOT, 5, SurfPichu_Slot5 return SurfPichu_Slot1: setmonmove 1, 2, MOVE_SURF return SurfPichu_Slot2: setmonmove 2, 2, MOVE_SURF return SurfPichu_Slot3: setmonmove 3, 2, MOVE_SURF return SurfPichu_Slot4: setmonmove 4, 2, MOVE_SURF return SurfPichu_Slot5: setmonmove 5, 2, MOVE_SURF return sText_MysteryGiftEgg: .string "Thank you for using the MYSTERY\n" .string "GIFT System.\p" .string "From the POKéMON CENTER we\n" .string "have a gift - a POKéMON EGG!\p" .string "Please raise it with love and\n" .string "kindness.$" sText_FullParty: .string "Oh, your party appears to be full.\p" .string "Please come see me after storing\n" .string "a POKéMON on a PC.$" MysteryEventScript_VisitingTrainer:: setvaddress MysteryEventScript_VisitingTrainer special ValidateEReaderTrainer vgoto_if_eq VAR_RESULT, 0, MysteryEventScript_VisitingTrainerArrived lock faceplayer vmessage sText_MysteryGiftVisitingTrainer waitmessage waitbuttonpress release end MysteryEventScript_VisitingTrainerArrived: lock faceplayer vmessage sText_MysteryGiftVisitingTrainer_2 waitmessage waitbuttonpress release end sText_MysteryGiftVisitingTrainer: .string "Thank you for using the MYSTERY\n" .string "GIFT System.\p" .string "By holding this WONDER CARD, you\n" .string "may take part in a survey at a\l" .string "POKéMON MART.\p" .string "Use these surveys to invite\n" .string "TRAINERS to the SEVII ISLANDS.\p" .string "…Let me give you a secret\n" .string "password for a survey:\p" .string "“GIVE ME\n" .string "AWESOME TRAINER”\p" .string "Write that in on a survey and send\n" .string "it to the WIRELESS\l" .string "COMMUNICATION SYSTEM.$" sText_MysteryGiftVisitingTrainer_2: .string "Thank you for using the MYSTERY\n" .string "GIFT System.\p" .string "A TRAINER has arrived in the SEVII\n" .string "ISLANDS looking for you.\p" .string "We hope you will enjoy\n" .string "battling the visiting TRAINER.\p" .string "You may invite other TRAINERS by\n" .string "entering other passwords.\p" .string "Try looking for other passwords\n" .string "that may work.$" MysteryEventScript_BattleCard:: setvaddress MysteryEventScript_BattleCard vgoto_if_set FLAG_MYSTERY_GIFT_DONE, MysteryEventScript_BattleCardInfo setorcopyvar VAR_RESULT, 2 specialvar VAR_0x8008, GetMysteryGiftCardStat vgoto_if_ne VAR_0x8008, 3, MysteryEventScript_BattleCardInfo lock faceplayer vmessage sText_MysteryGiftBattleCountCard_2 waitmessage waitbuttonpress giveitem ITEM_POTION release setflag FLAG_MYSTERY_GIFT_DONE end MysteryEventScript_BattleCardInfo: lock faceplayer vmessage sText_MysteryGiftBattleCountCard waitmessage waitbuttonpress release end sText_MysteryGiftBattleCountCard: .string "Thank you for using the MYSTERY\n" .string "GIFT System.\p" .string "Your BATTLE COUNT CARD keeps\n" .string "track of your battle record against\l" .string "TRAINERS with the same CARD.\p" .string "Look for and battle TRAINERS who\n" .string "have the same CARD as you.\p" .string "You may check the overall rankings\n" .string "by reading the NEWS.\p" .string "Please do give it a try!$" sText_MysteryGiftBattleCountCard_2: .string "Thank you for using the MYSTERY\n" .string "GIFT System.\p" .string "Congratulations!\p" .string "You have won a prize for winning\n" .string "three battles!\p" .string "We hope you will be inspired to\n" .string "battle some more.$" MysteryEventScript_AuroraTicket:: setvaddress MysteryEventScript_AuroraTicket lock faceplayer vgoto_if_set FLAG_RECEIVED_AURORA_TICKET, AuroraTicket_Obtained vgoto_if_set FLAG_FOUGHT_DEOXYS, AuroraTicket_Obtained checkitem ITEM_AURORA_TICKET, 1 vgoto_if_eq VAR_RESULT, TRUE, AuroraTicket_Obtained vmessage sText_AuroraTicket1 waitmessage waitbuttonpress checkitemspace ITEM_AURORA_TICKET, 1 vgoto_if_eq VAR_RESULT, FALSE, AuroraTicket_NoBagSpace giveitem ITEM_AURORA_TICKET setflag FLAG_ENABLE_SHIP_BIRTH_ISLAND setflag FLAG_RECEIVED_AURORA_TICKET vmessage sText_AuroraTicket2 waitmessage waitbuttonpress release end AuroraTicket_NoBagSpace: vmessage sText_AuroraTicketNoPlace waitmessage waitbuttonpress release end AuroraTicket_Obtained: vmessage sText_AuroraTicketGot waitmessage waitbuttonpress release end sText_AuroraTicket1: .string "Thank you for using the MYSTERY\n" .string "GIFT System.\p" .string "You must be {PLAYER}.\n" .string "There is a ticket here for you.$" sText_AuroraTicket2: .string "It appears to be for use at the\n" .string "VERMILION CITY port.\p" .string "Why not give it a try and see what\n" .string "it is about?$" sText_AuroraTicketGot: .string "Thank you for using the MYSTERY\n" .string "GIFT System.$" sText_AuroraTicketNoPlace: .string "Oh, I'm sorry, {PLAYER}. Your BAG's\n" .string "KEY ITEMS POCKET is full.\p" .string "Please store something on your PC,\n" .string "then come back for this.$" MysteryEventScript_MysticTicket:: setvaddress MysteryEventScript_MysticTicket lock faceplayer vgoto_if_set FLAG_RECEIVED_MYSTIC_TICKET, MysticTicket_Obtained vgoto_if_set FLAG_FOUGHT_LUGIA, MysticTicket_Obtained vgoto_if_set FLAG_FOUGHT_HO_OH, MysticTicket_Obtained checkitem ITEM_MYSTIC_TICKET, 1 vgoto_if_eq VAR_RESULT, TRUE, MysticTicket_Obtained vmessage sText_MysticTicket2 waitmessage waitbuttonpress checkitemspace ITEM_MYSTIC_TICKET, 1 vgoto_if_eq VAR_RESULT, FALSE, MysticTicket_NoBagSpace giveitem ITEM_MYSTIC_TICKET setflag FLAG_ENABLE_SHIP_NAVEL_ROCK setflag FLAG_RECEIVED_MYSTIC_TICKET vmessage sText_MysticTicket1 waitmessage waitbuttonpress release end MysticTicket_NoBagSpace: vmessage sText_MysticTicketNoPlace waitmessage waitbuttonpress release end MysticTicket_Obtained: vmessage sText_MysticTicketGot waitmessage waitbuttonpress release end sText_MysticTicket2: .string "Thank you for using the MYSTERY\n" .string "GIFT System.\p" .string "You must be {PLAYER}.\n" .string "There is a ticket here for you.$" sText_MysticTicket1: .string "It appears to be for use at the\n" .string "VERMILION CITY port.\p" .string "Why not give it a try and see what\n" .string "it is about?$" sText_MysticTicketGot: .string "Thank you for using the MYSTERY\n" .string "GIFT System.$" sText_MysticTicketNoPlace: .string "Oh, I'm sorry, {PLAYER}. Your BAG's\n" .string "KEY ITEMS POCKET is full.\p" .string "Please store something on your PC,\n" .string "then come back for this.$" MysteryEventScript_AlteringCave:: setvaddress MysteryEventScript_AlteringCave addvar VAR_ALTERING_CAVE_WILD_SET, 1 vgoto_if_ne VAR_ALTERING_CAVE_WILD_SET, 10, MysteryEventScript_AlteringCave_ setvar VAR_ALTERING_CAVE_WILD_SET, 0 MysteryEventScript_AlteringCave_: lock faceplayer vmessage sText_MysteryGiftAlteringCave waitmessage waitbuttonpress release end sText_MysteryGiftAlteringCave: .string "Thank you for using the MYSTERY\n" .string "GIFT System.\p" .string "Recently, there have been rumors\n" .string "of rare POKéMON appearances.\p" .string "The rumors are about ALTERING\n" .string "CAVE on OUTCAST ISLAND.\p" .string "Why not visit there and check if\n" .string "the rumors are indeed true?$" ================================================ FILE: data/mystery_event_script_cmd_table.s ================================================ .section script_data, "aw", %progbits .align 2 gMysteryEventScriptCmdTable:: .4byte MEScrCmd_nop .4byte MEScrCmd_checkcompat .4byte MEScrCmd_end .4byte MEScrCmd_setmsg .4byte MEScrCmd_setstatus .4byte MEScrCmd_runscript .4byte MEScrCmd_initramscript .4byte MEScrCmd_setenigmaberry .4byte MEScrCmd_giveribbon .4byte MEScrCmd_givenationaldex .4byte MEScrCmd_addrareword .4byte MEScrCmd_setrecordmixinggift .4byte MEScrCmd_givepokemon .4byte MEScrCmd_addtrainer .4byte MEScrCmd_enableresetrtc .4byte MEScrCmd_checksum .4byte MEScrCmd_crc gMysteryEventScriptCmdTableEnd:: ================================================ FILE: data/script_cmd_table.inc ================================================ .align 2 gScriptCmdTable:: .4byte ScrCmd_nop @ 0x00 .4byte ScrCmd_nop1 @ 0x01 .4byte ScrCmd_end @ 0x02 .4byte ScrCmd_return @ 0x03 .4byte ScrCmd_call @ 0x04 .4byte ScrCmd_goto @ 0x05 .4byte ScrCmd_goto_if @ 0x06 .4byte ScrCmd_call_if @ 0x07 .4byte ScrCmd_gotostd @ 0x08 .4byte ScrCmd_callstd @ 0x09 .4byte ScrCmd_gotostd_if @ 0x0a .4byte ScrCmd_callstd_if @ 0x0b .4byte ScrCmd_returnram @ 0x0c .4byte ScrCmd_endram @ 0x0d .4byte ScrCmd_setmysteryeventstatus @ 0x0e .4byte ScrCmd_loadword @ 0x0f .4byte ScrCmd_loadbyte @ 0x10 .4byte ScrCmd_setptr @ 0x11 .4byte ScrCmd_loadbytefromptr @ 0x12 .4byte ScrCmd_setptrbyte @ 0x13 .4byte ScrCmd_copylocal @ 0x14 .4byte ScrCmd_copybyte @ 0x15 .4byte ScrCmd_setvar @ 0x16 .4byte ScrCmd_addvar @ 0x17 .4byte ScrCmd_subvar @ 0x18 .4byte ScrCmd_copyvar @ 0x19 .4byte ScrCmd_setorcopyvar @ 0x1a .4byte ScrCmd_compare_local_to_local @ 0x1b .4byte ScrCmd_compare_local_to_value @ 0x1c .4byte ScrCmd_compare_local_to_ptr @ 0x1d .4byte ScrCmd_compare_ptr_to_local @ 0x1e .4byte ScrCmd_compare_ptr_to_value @ 0x1f .4byte ScrCmd_compare_ptr_to_ptr @ 0x20 .4byte ScrCmd_compare_var_to_value @ 0x21 .4byte ScrCmd_compare_var_to_var @ 0x22 .4byte ScrCmd_callnative @ 0x23 .4byte ScrCmd_gotonative @ 0x24 .4byte ScrCmd_special @ 0x25 .4byte ScrCmd_specialvar @ 0x26 .4byte ScrCmd_waitstate @ 0x27 .4byte ScrCmd_delay @ 0x28 .4byte ScrCmd_setflag @ 0x29 .4byte ScrCmd_clearflag @ 0x2a .4byte ScrCmd_checkflag @ 0x2b .4byte ScrCmd_initclock @ 0x2c .4byte ScrCmd_dotimebasedevents @ 0x2d .4byte ScrCmd_gettime @ 0x2e .4byte ScrCmd_playse @ 0x2f .4byte ScrCmd_waitse @ 0x30 .4byte ScrCmd_playfanfare @ 0x31 .4byte ScrCmd_waitfanfare @ 0x32 .4byte ScrCmd_playbgm @ 0x33 .4byte ScrCmd_savebgm @ 0x34 .4byte ScrCmd_fadedefaultbgm @ 0x35 .4byte ScrCmd_fadenewbgm @ 0x36 .4byte ScrCmd_fadeoutbgm @ 0x37 .4byte ScrCmd_fadeinbgm @ 0x38 .4byte ScrCmd_warp @ 0x39 .4byte ScrCmd_warpsilent @ 0x3a .4byte ScrCmd_warpdoor @ 0x3b .4byte ScrCmd_warphole @ 0x3c .4byte ScrCmd_warpteleport @ 0x3d .4byte ScrCmd_setwarp @ 0x3e .4byte ScrCmd_setdynamicwarp @ 0x3f .4byte ScrCmd_setdivewarp @ 0x40 .4byte ScrCmd_setholewarp @ 0x41 .4byte ScrCmd_getplayerxy @ 0x42 .4byte ScrCmd_getpartysize @ 0x43 .4byte ScrCmd_additem @ 0x44 .4byte ScrCmd_removeitem @ 0x45 .4byte ScrCmd_checkitemspace @ 0x46 .4byte ScrCmd_checkitem @ 0x47 .4byte ScrCmd_checkitemtype @ 0x48 .4byte ScrCmd_addpcitem @ 0x49 .4byte ScrCmd_checkpcitem @ 0x4a .4byte ScrCmd_adddecoration @ 0x4b .4byte ScrCmd_removedecoration @ 0x4c .4byte ScrCmd_checkdecor @ 0x4d .4byte ScrCmd_checkdecorspace @ 0x4e .4byte ScrCmd_applymovement @ 0x4f .4byte ScrCmd_applymovementat @ 0x50 .4byte ScrCmd_waitmovement @ 0x51 .4byte ScrCmd_waitmovementat @ 0x52 .4byte ScrCmd_removeobject @ 0x53 .4byte ScrCmd_removeobjectat @ 0x54 .4byte ScrCmd_addobject @ 0x55 .4byte ScrCmd_addobjectat @ 0x56 .4byte ScrCmd_setobjectxy @ 0x57 .4byte ScrCmd_showobjectat @ 0x58 .4byte ScrCmd_hideobjectat @ 0x59 .4byte ScrCmd_faceplayer @ 0x5a .4byte ScrCmd_turnobject @ 0x5b .4byte ScrCmd_trainerbattle @ 0x5c .4byte ScrCmd_dotrainerbattle @ 0x5d .4byte ScrCmd_gotopostbattlescript @ 0x5e .4byte ScrCmd_gotobeatenscript @ 0x5f .4byte ScrCmd_checktrainerflag @ 0x60 .4byte ScrCmd_settrainerflag @ 0x61 .4byte ScrCmd_cleartrainerflag @ 0x62 .4byte ScrCmd_setobjectxyperm @ 0x63 .4byte ScrCmd_copyobjectxytoperm @ 0x64 .4byte ScrCmd_setobjectmovementtype @ 0x65 .4byte ScrCmd_waitmessage @ 0x66 .4byte ScrCmd_message @ 0x67 .4byte ScrCmd_closemessage @ 0x68 .4byte ScrCmd_lockall @ 0x69 .4byte ScrCmd_lock @ 0x6a .4byte ScrCmd_releaseall @ 0x6b .4byte ScrCmd_release @ 0x6c .4byte ScrCmd_waitbuttonpress @ 0x6d .4byte ScrCmd_yesnobox @ 0x6e .4byte ScrCmd_multichoice @ 0x6f .4byte ScrCmd_multichoicedefault @ 0x70 .4byte ScrCmd_multichoicegrid @ 0x71 .4byte ScrCmd_drawbox @ 0x72 .4byte ScrCmd_erasebox @ 0x73 .4byte ScrCmd_drawboxtext @ 0x74 .4byte ScrCmd_showmonpic @ 0x75 .4byte ScrCmd_hidemonpic @ 0x76 .4byte ScrCmd_showcontestpainting @ 0x77 .4byte ScrCmd_braillemessage @ 0x78 .4byte ScrCmd_givemon @ 0x79 .4byte ScrCmd_giveegg @ 0x7a .4byte ScrCmd_setmonmove @ 0x7b .4byte ScrCmd_checkpartymove @ 0x7c .4byte ScrCmd_bufferspeciesname @ 0x7d .4byte ScrCmd_bufferleadmonspeciesname @ 0x7e .4byte ScrCmd_bufferpartymonnick @ 0x7f .4byte ScrCmd_bufferitemname @ 0x80 .4byte ScrCmd_bufferdecorationname @ 0x81 .4byte ScrCmd_buffermovename @ 0x82 .4byte ScrCmd_buffernumberstring @ 0x83 .4byte ScrCmd_bufferstdstring @ 0x84 .4byte ScrCmd_bufferstring @ 0x85 .4byte ScrCmd_pokemart @ 0x86 .4byte ScrCmd_pokemartdecoration @ 0x87 .4byte ScrCmd_pokemartdecoration2 @ 0x88 .4byte ScrCmd_playslotmachine @ 0x89 .4byte ScrCmd_setberrytree @ 0x8a .4byte ScrCmd_choosecontestmon @ 0x8b .4byte ScrCmd_startcontest @ 0x8c .4byte ScrCmd_showcontestresults @ 0x8d .4byte ScrCmd_contestlinktransfer @ 0x8e .4byte ScrCmd_random @ 0x8f .4byte ScrCmd_addmoney @ 0x90 .4byte ScrCmd_removemoney @ 0x91 .4byte ScrCmd_checkmoney @ 0x92 .4byte ScrCmd_showmoneybox @ 0x93 .4byte ScrCmd_hidemoneybox @ 0x94 .4byte ScrCmd_updatemoneybox @ 0x95 .4byte ScrCmd_getpokenewsactive @ 0x96 .4byte ScrCmd_fadescreen @ 0x97 .4byte ScrCmd_fadescreenspeed @ 0x98 .4byte ScrCmd_setflashlevel @ 0x99 .4byte ScrCmd_animateflash @ 0x9a .4byte ScrCmd_messageautoscroll @ 0x9b .4byte ScrCmd_dofieldeffect @ 0x9c .4byte ScrCmd_setfieldeffectargument @ 0x9d .4byte ScrCmd_waitfieldeffect @ 0x9e .4byte ScrCmd_setrespawn @ 0x9f .4byte ScrCmd_checkplayergender @ 0xa0 .4byte ScrCmd_playmoncry @ 0xa1 .4byte ScrCmd_setmetatile @ 0xa2 .4byte ScrCmd_resetweather @ 0xa3 .4byte ScrCmd_setweather @ 0xa4 .4byte ScrCmd_doweather @ 0xa5 .4byte ScrCmd_setstepcallback @ 0xa6 .4byte ScrCmd_setmaplayoutindex @ 0xa7 .4byte ScrCmd_setobjectsubpriority @ 0xa8 .4byte ScrCmd_resetobjectsubpriority @ 0xa9 .4byte ScrCmd_createvobject @ 0xaa .4byte ScrCmd_turnvobject @ 0xab .4byte ScrCmd_opendoor @ 0xac .4byte ScrCmd_closedoor @ 0xad .4byte ScrCmd_waitdooranim @ 0xae .4byte ScrCmd_setdooropen @ 0xaf .4byte ScrCmd_setdoorclosed @ 0xb0 .4byte ScrCmd_addelevmenuitem @ 0xb1 .4byte ScrCmd_showelevmenu @ 0xb2 .4byte ScrCmd_checkcoins @ 0xb3 .4byte ScrCmd_addcoins @ 0xb4 .4byte ScrCmd_removecoins @ 0xb5 .4byte ScrCmd_setwildbattle @ 0xb6 .4byte ScrCmd_dowildbattle @ 0xb7 .4byte ScrCmd_setvaddress @ 0xb8 .4byte ScrCmd_vgoto @ 0xb9 .4byte ScrCmd_vcall @ 0xba .4byte ScrCmd_vgoto_if @ 0xbb .4byte ScrCmd_vcall_if @ 0xbc .4byte ScrCmd_vmessage @ 0xbd .4byte ScrCmd_vbuffermessage @ 0xbe .4byte ScrCmd_vbufferstring @ 0xbf .4byte ScrCmd_showcoinsbox @ 0xc0 .4byte ScrCmd_hidecoinsbox @ 0xc1 .4byte ScrCmd_updatecoinsbox @ 0xc2 .4byte ScrCmd_incrementgamestat @ 0xc3 .4byte ScrCmd_setescapewarp @ 0xc4 .4byte ScrCmd_waitmoncry @ 0xc5 .4byte ScrCmd_bufferboxname @ 0xc6 .4byte ScrCmd_textcolor @ 0xc7 .4byte ScrCmd_loadhelp @ 0xc8 .4byte ScrCmd_unloadhelp @ 0xc9 .4byte ScrCmd_signmsg @ 0xca .4byte ScrCmd_normalmsg @ 0xcb .4byte ScrCmd_comparestat @ 0xcc .4byte ScrCmd_setmonmodernfatefulencounter @ 0xcd .4byte ScrCmd_checkmonmodernfatefulencounter @ 0xce .4byte ScrCmd_trywondercardscript @ 0xcf .4byte ScrCmd_setworldmapflag @ 0xd0 .4byte ScrCmd_warpspinenter @ 0xd1 .4byte ScrCmd_setmonmetlocation @ 0xd2 .4byte ScrCmd_getbraillestringwidth @ 0xd3 .4byte ScrCmd_bufferitemnameplural @ 0xd4 .4byte ScrCmd_fadescreenswapbuffers @ 0xd5 .4byte ScrCmd_setobjectmovementtypeinstant @ 0xd6 .4byte ScrCmd_resetobjectmovementtype @ 0xd7 gScriptCmdTableEnd:: .4byte ScrCmd_nop ================================================ FILE: data/scripts/aide.inc ================================================ Aide_EventScript_HaventCaughtEnough:: msgbox Aide_Text_HaventCaughtEnoughMonsForItem release end Aide_EventScript_NoRoomForItem:: msgbox Aide_Text_DontHaveAnyRoomForItem release end Aide_EventScript_DeclineCheckMons:: msgbox Aide_Text_GetEnoughMonsComeBackForItem release end ================================================ FILE: data/scripts/bag_full.inc ================================================ EventScript_BagIsFull:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox Text_TooBadBagFull release end @ Unused EventScript_BagIsFullRet:: msgbox Text_TooBadBagFull return @ Unused EventScript_NoRoomForAnotherDecor:: msgbox Text_NoRoomForAnotherDecor release end @ Unused EventScript_NoRoomForAnotherDecorRet:: msgbox Text_NoRoomForAnotherDecor return ================================================ FILE: data/scripts/cable_club.inc ================================================ CableClub_OnTransition:: call CableClub_EventScript_HideOrShowMysteryGiftMan end CableClub_EventScript_HideOrShowMysteryGiftMan:: specialvar VAR_RESULT, ValidateSavedWonderCard goto_if_eq VAR_RESULT, FALSE, EventScript_HideMysteryGiftMan clearflag FLAG_HIDE_MG_DELIVERYMEN return EventScript_HideMysteryGiftMan:: setflag FLAG_HIDE_MG_DELIVERYMEN return CableClub_EventScript_MysteryGiftMan:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording trywondercardscript @ Unused EventScript_MysteryGiftThankYou:: msgbox Text_ThankYouForAccessingMysteryGift, MSGBOX_NPC end CableClub_OnWarp:: map_script_2 VAR_CABLE_CLUB_STATE, USING_SINGLE_BATTLE, EventScript_CheckTurnAttendant map_script_2 VAR_CABLE_CLUB_STATE, USING_DOUBLE_BATTLE, EventScript_CheckTurnAttendant map_script_2 VAR_CABLE_CLUB_STATE, USING_MULTI_BATTLE, EventScript_CheckTurnAttendant map_script_2 VAR_CABLE_CLUB_STATE, USING_TRADE_CENTER, EventScript_CheckTurnAttendant map_script_2 VAR_CABLE_CLUB_STATE, USING_UNION_ROOM, EventScript_CheckTurnAttendant map_script_2 VAR_CABLE_CLUB_STATE, USING_BERRY_CRUSH, EventScript_CheckTurnAttendant map_script_2 VAR_CABLE_CLUB_STATE, USING_MINIGAME, EventScript_CheckTurnAttendant .2byte 0 EventScript_CheckTurnAttendant:: goto_if_eq VAR_0x8007, 0, EventScript_CheckTurnAttendantEnd turnobject VAR_0x8007, DIR_WEST EventScript_CheckTurnAttendantEnd: end CableClub_OnLoad:: goto_if_eq VAR_CABLE_CLUB_STATE, USING_SINGLE_BATTLE, EventScript_OnLoadFromColosseum goto_if_eq VAR_CABLE_CLUB_STATE, USING_DOUBLE_BATTLE, EventScript_OnLoadFromColosseum goto_if_eq VAR_CABLE_CLUB_STATE, USING_MULTI_BATTLE, EventScript_OnLoadFromColosseum goto_if_eq VAR_CABLE_CLUB_STATE, USING_TRADE_CENTER, EventScript_OnLoadFromTradeCenter goto_if_eq VAR_CABLE_CLUB_STATE, USING_UNION_ROOM, EventScript_OnLoadFromUnionRoom goto_if_eq VAR_CABLE_CLUB_STATE, USING_BERRY_CRUSH, EventScript_OnLoadFromBerryCrush goto_if_eq VAR_CABLE_CLUB_STATE, USING_MINIGAME, EventScript_OnLoadFromGameCorner end EventScript_OnLoadFromColosseum:: call CableClub_EventScript_OpenDirectCornerBarrier end EventScript_OnLoadFromTradeCenter:: call CableClub_EventScript_OpenDirectCornerBarrier end EventScript_OnLoadFromUnionRoom:: call CableClub_EventScript_OpenUnionRoomBarrier end EventScript_OnLoadFromBerryCrush:: call CableClub_EventScript_OpenDirectCornerBarrier end EventScript_OnLoadFromGameCorner:: call CableClub_EventScript_OpenGameCornerBarrier end CableClub_OnFrame:: map_script_2 VAR_MAP_SCENE_POKEMON_CENTER_TEALA, 1, CableClub_EventScript_Tutorial map_script_2 VAR_CABLE_CLUB_STATE, USING_SINGLE_BATTLE, CableClub_EventScript_ExitLinkRoom map_script_2 VAR_CABLE_CLUB_STATE, USING_DOUBLE_BATTLE, CableClub_EventScript_ExitLinkRoom map_script_2 VAR_CABLE_CLUB_STATE, USING_MULTI_BATTLE, CableClub_EventScript_ExitLinkRoom map_script_2 VAR_CABLE_CLUB_STATE, USING_TRADE_CENTER, CableClub_EventScript_ExitTradeCenter map_script_2 VAR_CABLE_CLUB_STATE, USING_UNION_ROOM, CableClub_EventScript_ExitUnionRoom map_script_2 VAR_CABLE_CLUB_STATE, USING_BERRY_CRUSH, CableClub_EventScript_ExitLinkRoom map_script_2 VAR_CABLE_CLUB_STATE, USING_MINIGAME, CableClub_EventScript_ExitMinigameRoom .2byte 0 CableClub_EventScript_ExitLinkRoom:: lockall clearflag FLAG_SYS_IS_LINKING callnative RecalculatePartyStats call CableClub_EventScript_CloseLinkAndExitLinkRoom call CableClub_EventScript_CloseDirectCornerBarrier special DrawWholeMapView playse SE_CLICK erasebox 0, 0, 29, 19 releaseall end CableClub_EventScript_ExitMinigameRoom:: lockall call CableClub_EventScript_CloseLinkAndExitLinkRoom call CableClub_EventScript_CloseGameCornerBarrier special DrawWholeMapView playse SE_CLICK erasebox 0, 0, 29, 19 releaseall end CableClub_EventScript_CloseLinkAndExitLinkRoom:: special CloseLink special HelpSystem_Enable special QuestLog_StartRecordingInputsAfterDeferredEvent setvar VAR_CABLE_CLUB_STATE, 0 textcolor NPC_TEXT_COLOR_FEMALE goto_if_eq VAR_0x8007, 0, CableClub_EventScript_PlayerExitLinkRoom applymovement VAR_0x8007, Movement_AttendantFaceLeft waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom waitmovement 0 applymovement VAR_0x8007, Movement_AttendantFaceDown waitmovement 0 return CableClub_EventScript_ExitTradeCenter:: lockall clearflag FLAG_SYS_IS_LINKING callnative RecalculatePartyStats call CableClub_EventScript_PlayerExitTradeCenter call CableClub_EventScript_CloseDirectCornerBarrier special DrawWholeMapView playse SE_CLICK erasebox 0, 0, 29, 19 releaseall end CableClub_EventScript_PlayerExitTradeCenter:: special CloseLink special HelpSystem_Enable special QuestLog_StartRecordingInputsAfterDeferredEvent setvar VAR_CABLE_CLUB_STATE, 0 textcolor NPC_TEXT_COLOR_FEMALE goto_if_eq VAR_0x8007, 0, CableClub_EventScript_PlayerExitLinkRoom applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerFaceAttendantRight waitmovement 0 applymovement VAR_0x8007, Movement_AttendantFaceLeft waitmovement 0 call CableClub_EventScript_TrainerCardDataOverwritten return CableClub_EventScript_ExitUnionRoom:: lockall clearflag FLAG_SYS_IS_LINKING callnative RecalculatePartyStats call CableClub_EventScript_PlayerExitUnionRoom call CableClub_EventScript_CloseUnionRoomBarrier special DrawWholeMapView playse SE_CLICK erasebox 0, 0, 29, 19 releaseall end CableClub_EventScript_PlayerExitUnionRoom:: special HelpSystem_Enable special QuestLog_StartRecordingInputsAfterDeferredEvent setvar VAR_CABLE_CLUB_STATE, 0 textcolor NPC_TEXT_COLOR_FEMALE goto_if_eq VAR_0x8007, 0, CableClub_EventScript_PlayerExitLinkRoom applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerFaceAttendantRight waitmovement 0 applymovement VAR_0x8007, Movement_AttendantFaceLeft waitmovement 0 call CableClub_EventScript_TrainerCardDataOverwritten return CableClub_EventScript_TrainerCardDataOverwritten:: message CableClub_Text_TrainerCardDataOverwritten waitmessage playse SE_PIN message CableClub_Text_HopeToSeeYouAgain waitmessage applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom waitmovement 0 applymovement VAR_0x8007, Movement_AttendantFaceDown waitmovement 0 return CableClub_EventScript_PlayerExitLinkRoom:: applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom waitmovement 0 return CableClub_EventScript_Tutorial:: lockall textcolor NPC_TEXT_COLOR_FEMALE applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox CableClub_Text_FirstTimeRightThisWay closemessage applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachCounter waitmovement 0 delay 30 msgbox CableClub_Text_ExplainWirelessClubFirstTime setvar VAR_MAP_SCENE_POKEMON_CENTER_TEALA, 2 releaseall end Movement_PlayerApproachCounter: walk_up walk_up step_end CableClub_EventScript_WelcomeToCableClub:: message CableClub_Text_WelcomeWhichCableClubService waitmessage delay 15 goto CableClub_EventScript_SelectCableClubRoom end CableClub_EventScript_UnusedWelcomeToCableClub:: msgbox CableClub_Text_WhichService goto CableClub_EventScript_SelectCableClubRoom end CableClub_EventScript_SelectCableClubRoom:: setvar VAR_0x8004, 0 multichoice 0, 0, MULTICHOICE_TRADE_CENTER_COLOSSEUM, FALSE switch VAR_RESULT case 0, CableClub_EventScript_TradeCenter case 1, CableClub_EventScript_Colosseum case 2, CableClub_EventScript_AbortLink case SCR_MENU_CANCEL, CableClub_EventScript_AbortLink end CableClub_EventScript_Colosseum:: copyvar VAR_0x8007, VAR_LAST_TALKED goto CableClub_EventScript_SelectBattleMode end CableClub_EventScript_SelectBattleMode:: message CableClub_Text_PlayWhichBattleMode waitmessage multichoice 0, 0, MULTICHOICE_SINGLE_DOUBLE_MULTI_INFO_EXIT, FALSE switch VAR_RESULT case 0, CableClub_EventScript_SingleBattleMode case 1, CableClub_EventScript_DoubleBattleMode case 2, CableClub_EventScript_MultiBattleMode case 3, CableClub_EventScript_BattleModeInfo case 4, CableClub_EventScript_AbortLink case SCR_MENU_CANCEL, CableClub_EventScript_AbortLink end CableClub_EventScript_BattleModeInfo:: msgbox CableClub_Text_ExplainBattleModes goto CableClub_EventScript_SelectBattleMode end CableClub_EventScript_SingleBattleMode:: setvar VAR_0x8004, USING_SINGLE_BATTLE goto CableClub_EventScript_TryEnterColosseum end CableClub_EventScript_DoubleBattleMode:: special HasEnoughMonsForDoubleBattle goto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, CableClub_EventScript_NeedTwoMonsForDoubleBattle setvar VAR_0x8004, USING_DOUBLE_BATTLE goto CableClub_EventScript_TryEnterColosseum end CableClub_EventScript_NeedTwoMonsForDoubleBattle:: msgbox CableClub_Text_NeedTwoMonsForDoubleBattle goto CableClub_EventScript_SelectBattleMode end CableClub_EventScript_MultiBattleMode:: setvar VAR_0x8004, USING_MULTI_BATTLE goto CableClub_EventScript_TryEnterColosseum end CableClub_EventScript_TryEnterColosseum:: call EventScript_AskSaveGame goto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink message CableClub_Text_PleaseWaitBCancel waitmessage special HelpSystem_Disable textcolor NPC_TEXT_COLOR_NEUTRAL special TryBattleLinkup waitstate call EventScript_RestorePrevTextColor goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterColosseum goto_if_eq VAR_RESULT, LINKUP_SOMEONE_NOT_READY, CableClub_EventScript_AbortLinkSomeoneNotReady goto_if_eq VAR_RESULT, LINKUP_DIFF_SELECTIONS, CableClub_EventScript_AbortLinkDifferentSelections goto_if_eq VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS, CableClub_EventScript_AbortLinkIncorrectNumberOfBattlers goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_AbortLink goto_if_eq VAR_RESULT, LINKUP_CONNECTION_ERROR, CableClub_EventScript_AbortLinkConnectionError end CableClub_EventScript_EnterColosseum:: setflag FLAG_SYS_IS_LINKING callnative RecalculatePartyStats special HealPlayerParty special SavePlayerParty special LoadPlayerBag copyvar VAR_CABLE_CLUB_STATE, VAR_0x8004 messageautoscroll CableClub_Text_PleaseEnter waitmessage call CableClub_EventScript_OpenDirectCornerBarrier special DrawWholeMapView playse SE_CLICK delay 60 applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 closemessage applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft waitmovement 0 opendoor 9, 1 waitdooranim applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 hideobjectat OBJ_EVENT_ID_PLAYER, 0 closedoor 9, 1 waitdooranim release goto_if_eq VAR_0x8004, USING_MULTI_BATTLE, CableClub_EventScript_WarpTo4PColosseum special SetCableClubWarp warp MAP_BATTLE_COLOSSEUM_2P, 6, 8 special DoCableClubWarp waitstate end @ Unused CableClub_EventScript_PlayerApproachLinkRoomRight:: applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomRight waitmovement 0 return CableClub_EventScript_WarpTo4PColosseum:: special SetCableClubWarp warp MAP_BATTLE_COLOSSEUM_4P, 5, 8 special DoCableClubWarp waitstate end CableClub_EventScript_AbortLinkIncorrectNumberOfBattlers:: switch VAR_0x8004 case USING_SINGLE_BATTLE, CableClub_EventScript_AbortLinkWrongNumberForSingleBattle case USING_DOUBLE_BATTLE, CableClub_EventScript_AbortLinkWrongNumberForDoubleBattle case USING_MULTI_BATTLE, CableClub_EventScript_AbortLinkNeedFourPlayers goto CableClub_EventScript_AbortLinkIncorrectNumberOfParticipants end CableClub_EventScript_AbortLinkNeedFourPlayers:: special CloseLink msgbox CableClub_Text_NeedFourPlayers goto CableClub_EventScript_ConfirmNumberAndRestart end CableClub_EventScript_AbortLinkWrongNumberForDoubleBattle:: special CloseLink msgbox CableClub_Text_CantDoubleBattleWithXPlayers goto CableClub_EventScript_ConfirmNumberAndRestart end CableClub_EventScript_AbortLinkWrongNumberForSingleBattle:: special CloseLink msgbox CableClub_Text_CantSingleBattleWithXPlayers goto CableClub_EventScript_ConfirmNumberAndRestart end CableClub_EventScript_ConfirmNumberAndRestart:: special CloseLink @ Redundant special HelpSystem_Enable msgbox CableClub_Text_PleaseConfirmNumberAndRestart release end CableClub_EventScript_TradeCenter:: copyvar VAR_0x8007, VAR_LAST_TALKED call CableClub_EventScript_CheckPartyTradeRequirements goto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink call EventScript_AskSaveGame goto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink message CableClub_Text_PleaseWaitBCancel waitmessage special HelpSystem_Disable textcolor NPC_TEXT_COLOR_NEUTRAL special TryTradeLinkup waitstate call EventScript_RestorePrevTextColor goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterTradeCenter goto_if_eq VAR_RESULT, LINKUP_SOMEONE_NOT_READY, CableClub_EventScript_AbortLinkSomeoneNotReady goto_if_eq VAR_RESULT, LINKUP_DIFF_SELECTIONS, CableClub_EventScript_AbortLinkDifferentSelections goto_if_eq VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS, CableClub_EventScript_AbortLinkIncorrectNumberOfParticipants goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_AbortLink goto_if_eq VAR_RESULT, LINKUP_CONNECTION_ERROR, CableClub_EventScript_AbortLinkConnectionError goto_if_eq VAR_RESULT, LINKUP_PLAYER_NOT_READY, CableClub_EventScript_AbortLinkPlayerNotReady goto_if_eq VAR_RESULT, LINKUP_PARTNER_NOT_READY, CableClub_EventScript_AbortLinkOtherTrainerNotReady end CableClub_EventScript_EnterTradeCenter:: setflag FLAG_SYS_IS_LINKING callnative RecalculatePartyStats setvar VAR_0x8004, USING_TRADE_CENTER copyvar VAR_CABLE_CLUB_STATE, VAR_0x8004 messageautoscroll CableClub_Text_PleaseEnter waitmessage call CableClub_EventScript_OpenDirectCornerBarrier special DrawWholeMapView playse SE_CLICK delay 60 applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 closemessage applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft waitmovement 0 opendoor 9, 1 waitdooranim applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 hideobjectat OBJ_EVENT_ID_PLAYER, 0 closedoor 9, 1 waitdooranim release special SetCableClubWarp setwarp MAP_TRADE_CENTER, 5, 8 special DoCableClubWarp waitstate end CableClub_EventScript_CheckPartyTradeRequirements:: specialvar VAR_RESULT, CalculatePlayerPartyCount goto_if_lt VAR_RESULT, 2, CableClub_EventScript_NeedTwoMonsToTrade specialvar VAR_RESULT, DoesPartyHaveEnigmaBerry goto_if_eq VAR_RESULT, TRUE, CableClub_EventScript_CantTradeEnigmaBerry setvar VAR_RESULT, TRUE return CableClub_EventScript_NeedTwoMonsToTrade:: msgbox CableClub_Text_NeedTwoMonsToTrade setvar VAR_RESULT, FALSE return CableClub_EventScript_CantTradeEnigmaBerry:: msgbox CableClub_Text_CantTradeEnigmaBerry setvar VAR_RESULT, FALSE return @ Record Corner is nopped in FRLG CableClub_EventScript_RecordCorner:: end CableClub_EventScript_AbortLinkPlayerNotReady:: special CloseLink special HelpSystem_Enable msgbox CableClub_Text_NotSetUpForFarAwayRegion release end CableClub_EventScript_AbortLinkOtherTrainerNotReady:: special CloseLink special HelpSystem_Enable msgbox CableClub_Text_OtherTrainerNotReady release end CableClub_EventScript_AbortLinkConnectionError:: special CloseLink special HelpSystem_Enable msgbox CableClub_Text_LinkErrorPleaseReset release end CableClub_EventScript_AbortLinkSomeoneNotReady:: special CloseLink special HelpSystem_Enable msgbox CableClub_Text_SomeoneIsNotReadyToLink release end CableClub_EventScript_AbortLinkDifferentSelections:: special CloseLink special HelpSystem_Enable msgbox CableClub_Text_PlayersMadeDifferentSelections release end CableClub_EventScript_AbortLink:: special CloseLink special HelpSystem_Enable msgbox CableClub_Text_PleaseVisitAgain release end CableClub_EventScript_AbortMinigame:: special CloseLink special HelpSystem_Enable msgbox CableClub_Text_ComeAgain release end @ Unused CableClub_EventScript_CableClubWarp:: special SetCableClubWarp special DoCableClubWarp waitstate end CableClub_EventScript_AbortLinkIncorrectNumberOfParticipants:: special CloseLink special HelpSystem_Enable msgbox CableClub_Text_IncorrectNumberOfParticipants release end CableClub_EventScript_AbortLinkPlayerHasBadEgg:: special CloseLink special HelpSystem_Enable msgbox CableClub_Text_YouHaveAMonThatCantBeTaken release end CableClub_EventScript_WirelessClubAdjustements:: msgbox Text_WirelessClubUndergoingAdjustments release end CableClub_EventScript_NotReadyYet:: msgbox Text_AppearsToBeUndergoingAdjustments releaseall end Movement_AttendantFaceDown:: face_down step_end @ Unused Movement_AttendantFaceRight:: face_right step_end Movement_AttendantFaceLeft:: face_left step_end Movement_PlayerExitLinkRoom:: walk_down walk_down step_end Movement_PlayerApproachLinkRoomRight:: walk_right walk_up walk_up step_end Movement_PlayerApproachLinkRoomLeft:: walk_left walk_up walk_up step_end Movement_PlayerEnterLinkRoom:: walk_up step_end @ Unused Movement_PlayerFaceAttendantLeft:: face_left step_end Movement_PlayerFaceAttendantRight:: face_right step_end Movement_PlayerEnterMinigameRoom:: walk_left walk_up walk_up walk_up step_end CableClub_EventScript_ShowBattleRecords:: goto_if_questlog EventScript_ReleaseEnd lockall fadescreen FADE_TO_BLACK setvar VAR_0x8004, 0 special ShowBattleRecords waitstate releaseall end BattleColosseum_2P_EventScript_PlayerSpot0:: setvar VAR_0x8005, 0 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterColosseumPlayerSpot waitstate end BattleColosseum_2P_EventScript_PlayerSpot1:: setvar VAR_0x8005, 1 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterColosseumPlayerSpot waitstate end BattleColosseum_4P_EventScript_PlayerSpot0:: fadescreen FADE_TO_BLACK special ChooseHalfPartyForBattle waitstate goto_if_eq VAR_RESULT, 0, BattleColosseum_4P_EventScript_CancelSpotTrigger setvar VAR_0x8005, 0 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterColosseumPlayerSpot waitstate end BattleColosseum_4P_EventScript_PlayerSpot1:: fadescreen FADE_TO_BLACK special ChooseHalfPartyForBattle waitstate goto_if_eq VAR_RESULT, 0, BattleColosseum_4P_EventScript_CancelSpotTrigger setvar VAR_0x8005, 1 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterColosseumPlayerSpot waitstate end BattleColosseum_4P_EventScript_PlayerSpot2:: fadescreen FADE_TO_BLACK special ChooseHalfPartyForBattle waitstate goto_if_eq VAR_RESULT, 0, BattleColosseum_4P_EventScript_CancelSpotTrigger setvar VAR_0x8005, 2 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterColosseumPlayerSpot waitstate end BattleColosseum_4P_EventScript_PlayerSpot3:: fadescreen FADE_TO_BLACK special ChooseHalfPartyForBattle waitstate goto_if_eq VAR_RESULT, 0, BattleColosseum_4P_EventScript_CancelSpotTrigger setvar VAR_0x8005, 3 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterColosseumPlayerSpot waitstate end BattleColosseum_4P_EventScript_CancelSpotTrigger:: end TradeCenter_EventScript_Chair0:: setvar VAR_0x8005, 0 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterTradeSeat waitstate end TradeCenter_EventScript_Chair1:: setvar VAR_0x8005, 1 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterTradeSeat waitstate end @ Unused TradeCenter_EventScript_Chair2:: setvar VAR_0x8005, 2 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterTradeSeat waitstate end @ Unused TradeCenter_EventScript_Chair3:: setvar VAR_0x8005, 3 textcolor NPC_TEXT_COLOR_NEUTRAL special EnterTradeSeat waitstate end @ Nop in FRLG @ Separate labels to match GetDirectionForEventScript RecordCorner_EventScript_Spot0:: RecordCorner_EventScript_Spot1:: RecordCorner_EventScript_Spot2:: RecordCorner_EventScript_Spot3:: end CableClub_EventScript_ReadTrainerCard:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox Text_LookedAtPlayersTrainerCard fadescreen FADE_TO_BLACK special Script_ShowLinkTrainerCard waitstate end CableClub_EventScript_ReadTrainerCardColored:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox Text_LookedAtPlayersTrainerCardColored fadescreen FADE_TO_BLACK special Script_ShowLinkTrainerCard waitstate end CableClub_EventScript_TooBusyToNotice:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox Text_TrainerTooBusyToNotice closemessage end BattleColosseum_2P_EventScript_Attendant:: textcolor NPC_TEXT_COLOR_NEUTRAL special Script_FacePlayer msgbox Text_TakeSeatStartBattle special Script_ClearHeldMovement closemessage end TradeCenter_EventScript_Attendant:: textcolor NPC_TEXT_COLOR_NEUTRAL special Script_FacePlayer msgbox Text_TakeSeatStartTrade special Script_ClearHeldMovement closemessage end @ Nop in FRLG RecordCorner_EventScript_Attendant:: end TradeCenter_ConfirmLeaveRoom:: textcolor NPC_TEXT_COLOR_NEUTRAL msgbox Text_TerminateLinkIfYouLeaveRoom, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, TradeCenter_TerminateLink erasebox 0, 0, 29, 19 releaseall end TradeCenter_TerminateLink:: textcolor NPC_TEXT_COLOR_NEUTRAL messageautoscroll Text_TerminateLinkConfirmation waitmessage special ExitLinkRoom end CableClub_EventScript_DoLinkRoomExit:: special CleanupLinkRoomState special ReturnFromLinkRoom waitstate end CableClub_EventScript_UnionRoomAttendant:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer goto_if_unset FLAG_SYS_POKEDEX_GET, CableClub_EventScript_WirelessClubAdjustements specialvar VAR_RESULT, IsBadEggInParty goto_if_eq VAR_RESULT, TRUE, CableClub_EventScript_AbortLinkPlayerHasBadEgg copyvar VAR_0x8007, VAR_LAST_TALKED specialvar VAR_RESULT, IsWirelessAdapterConnected goto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_UnionRoomAdapterNotConnected message CableClub_Text_WelcomeUnionRoomEnter waitmessage goto CableClub_EventScript_AskEnterUnionRoom end CableClub_EventScript_AskEnterUnionRoom:: multichoice 18, 6, MULTICHOICE_YES_NO_INFO, FALSE switch VAR_RESULT case 0, CableClub_EventScript_EnterUnionRoom case 1, CableClub_EventScript_AbortLink case 2, CableClub_EventScript_UnionRoomInfo case SCR_MENU_CANCEL, CableClub_EventScript_AbortLink end CableClub_EventScript_UnionRoomInfo:: message CableClub_Text_UnionRoomInfo waitmessage goto CableClub_EventScript_AskEnterUnionRoom end CableClub_EventScript_EnterUnionRoom:: call CableClub_EventScript_CheckPartyUnionRoomRequirements goto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_AbortLink call EventScript_AskSaveGame goto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink msgbox CableClub_Text_EnjoyUnionRoom closemessage setflag FLAG_SYS_IS_LINKING callnative RecalculatePartyStats special HealPlayerParty setvar VAR_0x8004, USING_UNION_ROOM copyvar VAR_CABLE_CLUB_STATE, VAR_0x8004 special HelpSystem_Disable call CableClub_EventScript_OpenUnionRoomBarrier special DrawWholeMapView playse SE_CLICK delay 60 applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft waitmovement 0 opendoor 5, 1 waitdooranim applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 hideobjectat OBJ_EVENT_ID_PLAYER, 0 closedoor 5, 1 waitdooranim special Script_ResetUnionRoomTrade special SetCableClubWarp warpspinenter MAP_UNION_ROOM, 7, 11 waitstate special RunUnionRoom waitstate end CableClub_EventScript_CheckPartyUnionRoomRequirements:: specialvar VAR_RESULT, CountPartyNonEggMons goto_if_lt VAR_RESULT, 2, CableClub_EventScript_NeedTwoMonsForUnionRoom specialvar VAR_RESULT, DoesPartyHaveEnigmaBerry goto_if_eq VAR_RESULT, TRUE, CableClub_EventScript_NoEnigmaBerryInUnionRoom setvar VAR_RESULT, TRUE return CableClub_EventScript_NeedTwoMonsForUnionRoom:: msgbox CableClub_Text_NeedTwoMonsForUnionRoom goto EventScript_SetResultFalse end CableClub_EventScript_NoEnigmaBerryInUnionRoom:: msgbox CableClub_Text_NoEnigmaBerryInUnionRoom goto EventScript_SetResultFalse end CableClub_EventScript_UnionRoomAdapterNotConnected:: msgbox CableClub_Text_UnionRoomAdapterNotConnected release return CableClub_EventScript_WirelessClubAttendant:: lock faceplayer goto_if_unset FLAG_SYS_POKEDEX_GET, CableClub_EventScript_WirelessClubAdjustements msgbox CableClub_Text_AskAboutLinking, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CableClub_EventScript_DontAskAboutLinking msgbox CableClub_Text_ExplainWirelessClub release return CableClub_EventScript_DontAskAboutLinking:: msgbox CableClub_Text_HopeYouEnjoyWirelessSystem release return CableClub_EventScript_DirectCornerAttendant:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer goto_if_unset FLAG_SYS_POKEDEX_GET, CableClub_EventScript_WirelessClubAdjustements specialvar VAR_RESULT, IsBadEggInParty goto_if_eq VAR_RESULT, TRUE, CableClub_EventScript_AbortLinkPlayerHasBadEgg specialvar VAR_RESULT, IsWirelessAdapterConnected goto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_WelcomeToCableClub message CableClub_Text_WelcomeWhichDirectCornerRoom waitmessage delay 15 goto CableClub_EventScript_DirectCornerSelectService end CableClub_EventScript_DirectCornerSelectService:: goto_if_unset FLAG_GOT_POWDER_JAR, CableClub_EventScript_DirectCornerNoBerry multichoice 0, 0, MULTICHOICE_TRADE_COLOSSEUM_CRUSH, FALSE switch VAR_RESULT case 0, CableClub_EventScript_WirelessTrade case 1, CableClub_EventScript_WirelessBattleSelect case 2, CableClub_EventScript_WirelessBerryCrush case 3, CableClub_EventScript_AbortLink case SCR_MENU_CANCEL, CableClub_EventScript_AbortLink end CableClub_EventScript_DirectCornerNoBerry:: multichoice 0, 0, MULTICHOICE_TRADE_COLOSSEUM_2, FALSE switch VAR_RESULT case 0, CableClub_EventScript_WirelessTrade case 1, CableClub_EventScript_WirelessBattleSelect case 2, CableClub_EventScript_AbortLink case SCR_MENU_CANCEL, CableClub_EventScript_AbortLink end CableClub_EventScript_WirelessTrade:: msgbox CableClub_Text_TradePokemon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CableClub_EventScript_AbortLink call CableClub_EventScript_CheckPartyTradeRequirements goto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_AbortLink setvar VAR_0x8004, LINK_GROUP_TRADE goto CableClub_EventScript_SaveAndChooseLinkLeader end CableClub_EventScript_WirelessBattleSelect:: message CableClub_Text_PlayWhichBattleMode waitmessage multichoice 0, 0, MULTICHOICE_SINGLE_DOUBLE_MULTI_INFO_EXIT, FALSE switch VAR_RESULT case 0, CableClub_EventScript_WirelessSingleBattle case 1, CableClub_EventScript_WirelessDoubleBattle case 2, CableClub_EventScript_WirelessMultiBattle case 3, CableClub_EventScript_WirelessBattleInfo case 4, CableClub_EventScript_AbortLink case SCR_MENU_CANCEL, CableClub_EventScript_AbortLink end CableClub_EventScript_WirelessSingleBattle:: setvar VAR_0x8004, LINK_GROUP_SINGLE_BATTLE goto CableClub_EventScript_SaveAndChooseLinkLeader end CableClub_EventScript_WirelessDoubleBattle:: special HasEnoughMonsForDoubleBattle goto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, CableClub_EventScript_TwoMonsNeededForWirelessDoubleBattle setvar VAR_0x8004, LINK_GROUP_DOUBLE_BATTLE goto CableClub_EventScript_SaveAndChooseLinkLeader end CableClub_EventScript_TwoMonsNeededForWirelessDoubleBattle:: msgbox CableClub_Text_NeedTwoMonsForDoubleBattle goto CableClub_EventScript_WirelessBattleSelect end CableClub_EventScript_WirelessMultiBattle:: setvar VAR_0x8004, LINK_GROUP_MULTI_BATTLE goto CableClub_EventScript_SaveAndChooseLinkLeader end CableClub_EventScript_WirelessBattleInfo:: msgbox CableClub_Text_ExplainBattleModes goto CableClub_EventScript_WirelessBattleSelect end CableClub_EventScript_WirelessBerryCrush:: msgbox CableClub_Text_UseBerryCrush, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CableClub_EventScript_AbortLink special HasAtLeastOneBerry goto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_NeedBerryForBerryCrush setvar VAR_0x8004, LINK_GROUP_BERRY_CRUSH goto CableClub_EventScript_SaveAndChooseLinkLeader end CableClub_EventScript_NeedBerryForBerryCrush:: msgbox CableClub_Text_NeedBerryForBerryCrush goto CableClub_EventScript_DirectCornerSelectService end CableClub_EventScript_SaveAndChooseLinkLeader:: call EventScript_AskSaveGame goto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink switch VAR_0x8004 case LINK_GROUP_TRADE, CableClub_EventScript_ChooseLinkLeaderFrom2 case LINK_GROUP_SINGLE_BATTLE, CableClub_EventScript_ChooseLinkLeaderFrom2 case LINK_GROUP_DOUBLE_BATTLE, CableClub_EventScript_ChooseLinkLeaderFrom2 case LINK_GROUP_MULTI_BATTLE, CableClub_EventScript_ChooseLinkLeaderFrom4 case LINK_GROUP_BERRY_CRUSH, CableClub_EventScript_ChooseLinkLeader end CableClub_EventScript_ChooseLinkLeaderFrom2:: textcolor NPC_TEXT_COLOR_NEUTRAL message CableClub_Text_ChooseGroupLeaderOfTwo waitmessage call EventScript_RestorePrevTextColor multichoice 13, 6, MULTICHOICE_JOIN_OR_LEAD, FALSE switch VAR_RESULT case 0, CableClub_EventScript_TryJoinGroup2Players case 1, CableClub_EventScript_TryLeadGroup2Players case 2, CableClub_EventScript_AbortLink case SCR_MENU_CANCEL, CableClub_EventScript_AbortLink end CableClub_EventScript_TryLeadGroup2Players:: call CableClub_EventScript_TryBecomeLinkLeader goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom2 goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryLeadGroup2Players release return CableClub_EventScript_TryJoinGroup2Players:: call CableClub_EventScript_TryJoinLinkGroup goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom2 goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinGroup2Players release return CableClub_EventScript_ChooseLinkLeaderFrom4:: textcolor NPC_TEXT_COLOR_NEUTRAL message CableClub_Text_ChooseGroupLeaderOfFour waitmessage call EventScript_RestorePrevTextColor multichoice 13, 6, MULTICHOICE_JOIN_OR_LEAD, FALSE switch VAR_RESULT case 0, CableClub_EventScript_TryJoinGroup4Players case 1, CableClub_EventScript_TryLeadGroup4Players case 2, CableClub_EventScript_AbortLink case SCR_MENU_CANCEL, CableClub_EventScript_AbortLink end CableClub_EventScript_TryLeadGroup4Players:: call CableClub_EventScript_TryBecomeLinkLeader goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom4 goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryLeadGroup4Players release return CableClub_EventScript_TryJoinGroup4Players:: call CableClub_EventScript_TryJoinLinkGroup goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom4 goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinGroup4Players release return CableClub_EventScript_ChooseLinkLeader:: textcolor NPC_TEXT_COLOR_NEUTRAL message CableClub_Text_ChooseGroupLeader waitmessage call EventScript_RestorePrevTextColor multichoice 13, 6, MULTICHOICE_JOIN_OR_LEAD, FALSE switch VAR_RESULT case 0, CableClub_EventScript_TryJoinGroupXPlayers case 1, CableClub_EventScript_TryLeadGroupXPlayers case 2, CableClub_EventScript_AbortLink case SCR_MENU_CANCEL, CableClub_EventScript_AbortLink end CableClub_EventScript_TryLeadGroupXPlayers:: call CableClub_EventScript_TryBecomeLinkLeader goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeader goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryLeadGroupXPlayers release return CableClub_EventScript_TryJoinGroupXPlayers:: call CableClub_EventScript_TryJoinLinkGroup goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeader goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinGroupXPlayers release return CableClub_EventScript_TryBecomeLinkLeader:: special HelpSystem_Disable special TryBecomeLinkLeader waitstate return CableClub_EventScript_TryJoinLinkGroup:: special HelpSystem_Disable special TryJoinLinkGroup waitstate return CableClub_EventScript_EnterWirelessLinkRoom:: setflag FLAG_SYS_IS_LINKING callnative RecalculatePartyStats messageautoscroll CableClub_Text_DirectYouToYourRoom waitmessage delay 60 closemessage copyvar VAR_0x8007, VAR_LAST_TALKED call CableClub_EventScript_OpenDirectCornerBarrier special DrawWholeMapView playse SE_CLICK delay 60 applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 closemessage applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft waitmovement 0 opendoor 9, 1 waitdooranim applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 hideobjectat OBJ_EVENT_ID_PLAYER, 0 closedoor 9, 1 waitdooranim release waitstate end CableClub_EventScript_ShowWirelessCommunicationScreen:: goto_if_questlog EventScript_ReleaseEnd lockall goto_if_unset FLAG_SYS_POKEDEX_GET, CableClub_EventScript_NotReadyYet specialvar VAR_RESULT, IsWirelessAdapterConnected goto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_AdapterNotConnected special HelpSystem_Disable fadescreen FADE_TO_BLACK special ShowWirelessCommunicationScreen waitstate msgbox CableClub_Text_ParticipantsStepUpToCounter special HelpSystem_Enable releaseall end CableClub_EventScript_AdapterNotConnected:: msgbox CableClub_Text_AdapterNotConnected releaseall end CableClub_EventScript_OpenUnionRoomBarrier:: setmetatile 5, 3, METATILE_PokemonCenter_Floor_ShadeLeft, 0 return CableClub_EventScript_CloseUnionRoomBarrier:: setmetatile 5, 3, METATILE_PokemonCenter_CounterBarrier, 1 return CableClub_EventScript_OpenDirectCornerBarrier:: setmetatile 9, 3, METATILE_PokemonCenter_Floor_ShadeLeft, 0 return CableClub_EventScript_CloseDirectCornerBarrier:: setmetatile 9, 3, METATILE_PokemonCenter_CounterBarrier, 1 return CableClub_EventScript_OpenGameCornerBarrier:: setmetatile 5, 3, METATILE_GameCorner_CheckeredFloor_ShadeLeft, 0 return CableClub_EventScript_CloseGameCornerBarrier:: setmetatile 5, 3, METATILE_GameCorner_CounterBarrier, 1 return JoyfulGameCorner_EventScript_InfoMan2:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer message Text_DescribeWhichGame waitmessage multichoice 0, 0, MULTICHOICE_POKEJUMP_DODRIO, FALSE switch VAR_RESULT case 0, CableClub_EventScript_PokemonJumpInfo case 1, CableClub_EventScript_DodrioBerryPickingInfo case 2, CableClub_EventScript_MinigameInfoExit case SCR_MENU_CANCEL, CableClub_EventScript_MinigameInfoExit end CableClub_EventScript_PokemonJumpInfo:: msgbox Text_PokemonJumpInfo release end CableClub_EventScript_DodrioBerryPickingInfo:: msgbox Text_DodrioBerryPickingInfo release end CableClub_EventScript_MinigameInfoExit:: msgbox Text_TalkToManToPlay release end JoyfulGameCorner_EventScript_MinigameAttendant:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer message Text_WelcomeCanYouWait waitmessage specialvar VAR_RESULT, IsWirelessAdapterConnected goto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_AdapterNotConnectedMinigame delay 60 special HelpSystem_Disable message Text_PlayWhichGame waitmessage multichoice 0, 0, MULTICHOICE_POKEJUMP_DODRIO, FALSE switch VAR_RESULT case 0, CableClub_EventScript_PlayPokemonJump case 1, CableClub_EventScript_PlayDodrioBerryPicking case 2, CableClub_EventScript_AbortMinigame case SCR_MENU_CANCEL, CableClub_EventScript_AbortMinigame end CableClub_EventScript_PlayPokemonJump:: setvar VAR_0x8005, 0 special IsPokemonJumpSpeciesInParty goto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_NoEligiblePkmn msgbox Text_EnterWhichPokemon setvar VAR_0x8005, 0 special ChooseMonForWirelessMinigame waitstate goto_if_ge VAR_0x8004, PARTY_SIZE, CableClub_EventScript_AbortMinigame call EventScript_AskSaveGame goto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortMinigame setvar VAR_0x8004, LINK_GROUP_POKEMON_JUMP goto CableClub_EventScript_ChooseLinkLeaderMinigame end CableClub_EventScript_PlayDodrioBerryPicking:: setvar VAR_0x8005, 1 special IsDodrioInParty goto_if_eq VAR_RESULT, 0, CableClub_EventScript_NoEligiblePkmn msgbox Text_EnterWhichPokemon setvar VAR_0x8005, 1 special ChooseMonForWirelessMinigame waitstate goto_if_ge VAR_0x8004, PARTY_SIZE, CableClub_EventScript_AbortMinigame call EventScript_AskSaveGame goto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortMinigame setvar VAR_0x8004, LINK_GROUP_BERRY_PICKING goto CableClub_EventScript_ChooseLinkLeaderMinigame end CableClub_EventScript_ChooseLinkLeaderMinigame:: textcolor NPC_TEXT_COLOR_NEUTRAL message CableClub_Text_ChooseGroupLeader waitmessage call EventScript_RestorePrevTextColor multichoice 13, 6, MULTICHOICE_JOIN_OR_LEAD, FALSE switch VAR_RESULT case 0, CableClub_EventScript_TryJoinMinigameLinkGroup case 1, CableClub_EventScript_TryBecomeMinigameLinkLeader case 2, CableClub_EventScript_AbortMinigame case SCR_MENU_CANCEL, CableClub_EventScript_AbortMinigame end CableClub_EventScript_TryBecomeMinigameLinkLeader:: call CableClub_EventScript_TryBecomeLinkLeader goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterMinigame goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderMinigame goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryBecomeMinigameLinkLeader release return CableClub_EventScript_TryJoinMinigameLinkGroup:: call CableClub_EventScript_TryJoinLinkGroup goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterMinigame goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderMinigame goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinMinigameLinkGroup release return CableClub_EventScript_EnterMinigame:: messageautoscroll Text_AllGoodToGo waitmessage delay 120 closemessage copyvar VAR_0x8007, VAR_LAST_TALKED call CableClub_EventScript_OpenGameCornerBarrier special DrawWholeMapView playse SE_CLICK delay 60 applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 closemessage applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterMinigameRoom waitmovement 0 hideobjectat OBJ_EVENT_ID_PLAYER, 0 release waitstate end CableClub_EventScript_AdapterNotConnectedMinigame:: msgbox Text_AdapterNotConnectedMinigame release end CableClub_EventScript_NoEligiblePkmn:: msgbox EventScript_ExplainPokemonJumpRequirements, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CableClub_EventScript_AbortMinigame call_if_eq VAR_0x8005, 0, CableClub_EventScript_ExplainPokemonJumpRequirements call_if_eq VAR_0x8005, 1, CableClub_EventScript_ExplainDodrioBerryPickingRequirements goto CableClub_EventScript_AbortMinigame end CableClub_EventScript_ExplainPokemonJumpRequirements:: msgbox Text_ShortJumpingPokemonAllowed return CableClub_EventScript_ExplainDodrioBerryPickingRequirements:: msgbox Text_OnlyDodrioAllowed return TwoIsland_JoyfulGameCorner_EventScript_ShowPokemonJumpRecords:: goto_if_questlog EventScript_ReleaseEnd lockall special ShowPokemonJumpRecords waitstate releaseall end TwoIsland_JoyfulGameCorner_EventScript_ShowDodrioBerryPickingRecords:: goto_if_questlog EventScript_ReleaseEnd lockall special ShowDodrioBerryPickingRecords waitstate releaseall end CableClub_Text_WelcomeWhichCableClubService:: .string "Welcome to the POKéMON CABLE\n" .string "CLUB.\p" .string "Which of our services do you wish\n" .string "to use?$" CableClub_Text_WhichService:: .string "Which of our services do you wish\n" .string "to use?$" CableClub_Text_TradeMonsUsingLinkCable:: .string "Trade POKéMON with another player\n" .string "using a GBA Game Link cable.$" CableClub_Text_BattleUsingLinkCable:: .string "You may battle another TRAINER\n" .string "using a GBA Game Link cable.$" CableClub_Text_NeedTwoMonsForDoubleBattle:: .string "For a DOUBLE BATTLE, you must\n" .string "have at least two POKéMON.$" CableClub_Text_NeedTwoMonsToTrade:: .string "For trading, you must have at\n" .string "least two POKéMON with you.$" CableClub_Text_CantTradeEnigmaBerry:: .string "A POKéMON holding the {STR_VAR_1}\n" .string "BERRY can't be traded.$" CableClub_Text_PleaseWaitBCancel:: .string "Please wait.\n" .string "… … B Button: Cancel$" CableClub_Text_WhenAllPlayersReadyAConfirmBCancel:: .string "When all players are ready…\n" .string "A Button: Confirm\l" .string "B Button: Cancel$" CableClub_Text_StartLinkWithXPlayersAConfirmBCancel:: .string "Start link with {STR_VAR_1} players.\n" .string "A Button: Confirm\l" .string "B Button: Cancel$" CableClub_Text_AwaitingLinkupBCancel:: .string "Awaiting linkup…\n" .string "… … B Button: Cancel$" CableClub_Text_PleaseEnter:: .string "Please enter.$" CableClub_Text_DirectYouToYourRoom:: .string "I'll direct you to your room now.$" CableClub_Text_SomeoneIsNotReadyToLink:: .string "Someone is not ready to link.\p" .string "Please come back after everyone\n" .string "has made preparations.$" CableClub_Text_LinkErrorPleaseReset:: .string "Sorry, we have a link error…\n" .string "Please reset and try again.$" CableClub_Text_PlayersMadeDifferentSelections:: .string "The link partners appear to have\n" .string "made different selections.$" CableClub_Text_PleaseVisitAgain:: .string "Please do visit again.$" CableClub_Text_IncorrectNumberOfParticipants:: .string "The number of participants is\n" .string "incorrect.$" CableClub_Text_CantSingleBattleWithXPlayers:: .string "The SINGLE BATTLE Mode can't be\n" .string "played by {STR_VAR_1} players.$" CableClub_Text_CantDoubleBattleWithXPlayers:: .string "The DOUBLE BATTLE Mode can't be\n" .string "played by {STR_VAR_1} players.$" CableClub_Text_NeedFourPlayers:: .string "There must be four players to play\n" .string "this Battle Mode.$" CableClub_Text_PleaseConfirmNumberAndRestart:: .string "Please confirm the number of\n" .string "players and start again.$" Text_TerminateLinkIfYouLeaveRoom:: .string "The link will be terminated if you\n" .string "leave the room. Is that okay?$" Text_TerminateLinkConfirmation:: .string "Terminating link…\n" .string "You will be escorted out of\l" .string "the room. Please wait.$" Text_TrainerTooBusyToNotice:: .string "This TRAINER is too busy to\n" .string "notice…$" Text_LookedAtPlayersTrainerCard:: .string "Score! Got to look at {STR_VAR_1}'s\n" .string "TRAINER CARD!$" Text_LookedAtPlayersTrainerCardColored:: .string "Score! Got to look at {STR_VAR_1}'s\n" .string "TRAINER CARD!\p" .string "It's a {STR_VAR_2} card!$" Text_TakeSeatStartBattle:: .string "Please take your seat and start\n" .string "your battle.$" Text_TakeSeatStartTrade:: .string "Please take your seat and start\n" .string "your trade.$" CableClub_Text_TrainerCardDataOverwritten:: .string "The TRAINER CARD data will\n" .string "be overwritten.$" CableClub_Text_HopeToSeeYouAgain:: .string "I hope to see you again!$" CableClub_Text_NotSetUpForFarAwayRegion:: .string "I'm awfully sorry.\p" .string "We're not set up to conduct trades\n" .string "with TRAINERS far away in another\l" .string "region yet…$" CableClub_Text_OtherTrainerNotReady:: .string "The other TRAINER is not ready.$" CableClub_Text_YouHaveAMonThatCantBeTaken:: .string "You have at least one POKéMON\n" .string "that can't be taken.$" CableClub_Text_AdapterNotConnected:: .string "The Wireless Adapter is not\n" .string "connected properly.$" CableClub_Text_ParticipantsStepUpToCounter:: .string "Participants are asked to step up\n" .string "to the reception counter.$" CableClub_Text_YouMayTradeHere:: .string "You may trade your POKéMON here\n" .string "with another TRAINER.$" CableClub_Text_YouMayBattleHere:: .string "You may battle with your friends\n" .string "here.$" CableClub_Text_CanMakeBerryPowder:: .string "Two to five TRAINERS can make\n" .string "BERRY POWDER together.$" CableClub_Text_CancelSelectedItem:: .string "Cancels the selected MENU item.$" CableClub_Text_NeedBerryForBerryCrush:: .string "To use the BERRY CRUSH service,\n" .string "you must have at least one BERRY.$" CableClub_Text_NeedTwoMonsForUnionRoom:: .string "To enter the UNION ROOM, you must\n" .string "have at least two POKéMON.$" CableClub_Text_NoEnigmaBerryInUnionRoom:: .string "No POKéMON holding the {STR_VAR_1}\n" .string "BERRY may enter the UNION ROOM.$" CableClub_Text_UnionRoomAdapterNotConnected:: .string "This is the POKéMON WIRELESS CLUB\n" .string "UNION ROOM.\p" .string "Unfortunately, your Wireless\n" .string "Adapter is not connected properly.\p" .string "Please do come again.$" Text_PlayerIsPlayingRightNowGoForIt:: .string "It appears as if {STR_VAR_1} is playing\n" .string "right now.\l" .string "Go for it!$" Text_DescribeWhichGame:: .string "I can explain game rules to you,\n" .string "if you'd like.\p" .string "Which game should I describe?$" Text_PokemonJumpInfo:: .string "“POKéMON JUMP”\p" .string "Make your POKéMON skip the\n" .string "VINE WHIP rope with the A Button.\p" .string "Only mini POKéMON around 28 inches\n" .string "or less may participate.\p" .string "POKéMON that only swim, burrow, or\n" .string "fly are not good at jumping.\p" .string "As a result, those POKéMON may not\n" .string "participate.\p" .string "Good things happen if everyone\n" .string "jumps in time.$" Text_DodrioBerryPickingInfo:: .string "“DODRIO BERRY-PICKING”\p" .string "Command DODRIO's three heads to\n" .string "catch falling BERRIES.\p" .string "Press right, up, or left on the\n" .string "{PLUS} Control Pad to move the heads.\p" .string "To play this game, you must have\n" .string "a DODRIO.$" Text_TalkToManToPlay:: .string "If you want to play a game,\n" .string "please tell the man beside me.$" Text_WelcomeCanYouWait:: .string "Hi, welcome!\n" .string "You can play games over the\l" .string "Wireless Communication System.\p" .string "Can you wait just a little bit?$" CableClub_Text_ComeAgain:: .string "All right, come again!$" Text_AdapterNotConnectedMinigame:: .string "The Wireless Adapter isn't\n" .string "connected.\p" .string "Come back when it's hooked up!$" Text_PlayWhichGame:: .string "All right, which game did you want\n" .string "to play?$" Text_EnterWhichPokemon:: .string "Which POKéMON would you like to\n" .string "enter?$" Text_AllGoodToGo:: .string "Okay, you're all good to go.\n" .string "Don't let the others beat you!$" EventScript_ExplainPokemonJumpRequirements:: .string "It doesn't look like you have any\n" .string "POKéMON that you can enter…\p" .string "Would you like me to explain what\n" .string "kinds of POKéMON can enter?$" Text_ShortJumpingPokemonAllowed:: .string "“POKéMON JUMP” is open to POKéMON\n" .string "around 28 inches or less.\p" .string "What you can't enter are those\n" .string "POKéMON that can't jump.\p" .string "You know, like POKéMON that only\n" .string "swim, burrow, or fly.\p" .string "That's all you need to know.$" Text_OnlyDodrioAllowed:: .string "“DODRIO BERRY-PICKING”…\n" .string "Well, the name says it all.\p" .string "You have to have a DODRIO to play\n" .string "this game.$" CableClub_Text_WelcomeWhichDirectCornerRoom:: .string "Welcome to the POKéMON WIRELESS\n" .string "CLUB DIRECT CORNER.\p" .string "You may interact directly with\n" .string "your friends here.\p" .string "Which room would you like to\n" .string "enter?$" CableClub_Text_TradePokemon:: .string "Would you like to trade POKéMON?$" CableClub_Text_PlayWhichBattleMode:: .string "Which Battle Mode would you like\n" .string "to play?$" CableClub_Text_UseBerryCrush:: .string "Would you like to use the\n" .string "BERRY CRUSH System?$" CableClub_Text_ExplainBattleModes:: .string "There are three Battle Modes.\p" .string "SINGLE BATTLE is for two TRAINERS\n" .string "with one or more POKéMON each.\p" .string "Each TRAINER can have one POKéMON\n" .string "in battle at a time.\p" .string "DOUBLE BATTLE is for two TRAINERS\n" .string "with two or more POKéMON each.\p" .string "Each TRAINER will send out two\n" .string "POKéMON in battle at a time.\p" .string "MULTI BATTLE is for four TRAINERS\n" .string "with one or more POKéMON each.\p" .string "Each TRAINER can have one POKéMON\n" .string "in battle at a time.$" CableClub_Text_ChooseGroupLeaderOfTwo:: .string "Please decide which of you two\n" .string "will become the LEADER.\p" .string "The other player must then choose\n" .string "“JOIN GROUP.”$" CableClub_Text_ChooseGroupLeaderOfFour:: .string "Please decide which of you four\n" .string "will become the GROUP LEADER.\p" .string "The other players must then choose\n" .string "“JOIN GROUP.”$" CableClub_Text_ChooseGroupLeader:: .string "Please decide which of you will\n" .string "become the GROUP LEADER.\p" .string "The other players must then choose\n" .string "“JOIN GROUP.”$" CableClub_Text_WelcomeUnionRoomEnter:: .string "Welcome to the POKéMON WIRELESS\n" .string "CLUB UNION ROOM.\p" .string "You may interact directly with\n" .string "other TRAINERS here, some of\l" .string "whom you may not even know.\p" .string "Would you like to enter the ROOM?$" CableClub_Text_UnionRoomInfo:: .string "The TRAINERS in the UNION ROOM\n" .string "will be those players around you\l" .string "who have also entered the ROOM.\p" .string "You may do all sorts of things\n" .string "here, such as exchanging greetings.\p" .string "You may enter two POKéMON up to\n" .string "Lv. 30 for a one-on-one battle.\p" .string "You may take part in a chat with\n" .string "two to five people.\p" .string "Or, you may register a POKéMON for\n" .string "trade.\p" .string "Would you like to enter the ROOM?$" CableClub_Text_EnjoyUnionRoom:: .string "I hope you enjoy your time in\n" .string "the UNION ROOM.$" CableClub_Text_FirstTimeRightThisWay:: .string "Hello!\n" .string "My name is TEALA.\p" .string "This must be your first time\n" .string "up here.\p" .string "I'll show you how the Wireless\n" .string "Communication System works.\p" .string "First, I need to show you this\n" .string "floor of our POKéMON CENTER.\p" .string "Right this way, please.$" CableClub_Text_ExplainWirelessClubFirstTime:: .string "On the top floor, there are two\n" .string "rooms.\p" .string "First, the room on the left.\n" .string "It's the UNION ROOM.\p" .string "You may link up with TRAINERS\n" .string "around you who have also entered\l" .string "the UNION ROOM.\p" .string "With them, you may do things like\n" .string "chat, battle, and trade.\p" .string "Second, the room on the right is\n" .string "the DIRECT CORNER.\p" .string "You may trade or battle POKéMON\n" .string "with your friends in this room.\p" .string "If the Wireless Adapter isn't\n" .string "connected, you may still link up\l" .string "using a GBA Game Link cable.\p" .string "If that is the case, you must go\n" .string "to the DIRECT CORNER.\p" .string "I hope you enjoy the Wireless \n" .string "Communication System.$" CableClub_Text_AskAboutLinking:: .string "Hello, {PLAYER}!\p" .string "It's me, TEALA, the POKéMON\n" .string "CENTER 2F attendant.\p" .string "Is there something you needed to\n" .string "ask me about linking?$" CableClub_Text_ExplainWirelessClub:: .string "Let me explain how the POKéMON\n" .string "WIRELESS CLUB works.\p" .string "On this, the top floor, there are\n" .string "two rooms.\p" .string "First, the room on the left.\n" .string "It's the UNION ROOM.\p" .string "You may link up with TRAINERS\n" .string "around you who have also entered\l" .string "the UNION ROOM.\p" .string "With them, you may do things like\n" .string "chat, battle, and trade.\p" .string "Second, the room on the right is\n" .string "the DIRECT CORNER.\p" .string "You may trade or battle POKéMON\n" .string "with your friends in this room.\p" .string "Sometimes, you may not be able to\n" .string "find your friends in the UNION ROOM\l" .string "or the DIRECT CORNER.\p" .string "In that case, please move closer\n" .string "to your friends.\p" .string "If the Wireless Adapter isn't\n" .string "connected, you may still link up\l" .string "using a GBA Game Link cable.\p" .string "If that is the case, you must go\n" .string "to the DIRECT CORNER.\p" .string "I hope you enjoy the Wireless \n" .string "Communication System.$" CableClub_Text_HopeYouEnjoyWirelessSystem:: .string "I hope you enjoy the Wireless\n" .string "Communication System.$" ================================================ FILE: data/scripts/cave_of_origin.inc ================================================ @ All unused / leftover scripts from RS CaveOfOrigin_EventScript_Shake1:: lockall setvar VAR_TEMP_1, 1 goto CaveOfOrigin_EventScript_Shake end CaveOfOrigin_EventScript_Shake2:: lockall setvar VAR_TEMP_2, 1 goto CaveOfOrigin_EventScript_Shake end CaveOfOrigin_EventScript_Shake3:: lockall setvar VAR_TEMP_3, 1 goto CaveOfOrigin_EventScript_Shake end CaveOfOrigin_EventScript_Shake:: setvar VAR_0x8004, 1 setvar VAR_0x8005, 1 setvar VAR_0x8006, 8 setvar VAR_0x8007, 5 special ShakeScreen waitstate releaseall end CaveOfOrigin_EventScript_DisableShakes:: setvar VAR_TEMP_1, 1 setvar VAR_TEMP_2, 1 setvar VAR_TEMP_3, 1 setvar VAR_TEMP_4, 1 setvar VAR_TEMP_5, 1 return ================================================ FILE: data/scripts/day_care.inc ================================================ Route5_PokemonDayCare_EventScript_DaycareMan:: goto_if_questlog EventScript_ReleaseEnd lock faceplayer showmoneybox 0, 0 specialvar VAR_RESULT, IsThereMonInRoute5Daycare goto_if_eq VAR_RESULT, TRUE, Route5_PokemonDayCare_EventScript_CheckOnMon msgbox Route5_PokemonDayCare_Text_WantMeToRaiseMon, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, Route5_PokemonDayCare_EventScript_TryGiveMon msgbox Route5_PokemonDayCare_Text_ComeAgain goto Route5_PokemonDayCare_EventScript_CloseMoneyBox end Route5_PokemonDayCare_EventScript_TryGiveMon:: specialvar VAR_RESULT, CountPartyNonEggMons goto_if_eq VAR_RESULT, 1, Route5_PokemonDayCare_EventScript_OnlyOneMonInParty msgbox Route5_PokemonDayCare_Text_WhichMonShouldIRaise fadescreen FADE_TO_BLACK hidemoneybox special ChooseSendDaycareMon waitstate showmoneybox 0, 0 goto_if_ge VAR_0x8004, PARTY_SIZE, Route5_PokemonDayCare_EventScript_ComeAgain specialvar VAR_RESULT, CountPartyAliveNonEggMons_IgnoreVar0x8004Slot goto_if_eq VAR_RESULT, 0, Route5_PokemonDayCare_EventScript_OnlyOneAliveMonInParty specialvar VAR_0x8005, GetSelectedMonNicknameAndSpecies msgbox Route5_PokemonDayCare_Text_LookAfterMonForAWhile waitse playmoncry VAR_0x8005, CRY_MODE_NORMAL msgbox Route5_PokemonDayCare_Text_ComeSeeMeInAWhile waitmoncry special PutMonInRoute5Daycare incrementgamestat GAME_STAT_USED_DAYCARE goto Route5_PokemonDayCare_EventScript_CloseMoneyBox end Route5_PokemonDayCare_EventScript_ComeAgain:: msgbox Route5_PokemonDayCare_Text_ComeAnytimeYouLike goto Route5_PokemonDayCare_EventScript_CloseMoneyBox end Route5_PokemonDayCare_EventScript_OnlyOneMonInParty:: msgbox Route5_PokemonDayCare_Text_OnlyHaveOneMonWithYou goto Route5_PokemonDayCare_EventScript_CloseMoneyBox end Route5_PokemonDayCare_EventScript_OnlyOneAliveMonInParty:: msgbox Route5_PokemonDayCare_Text_WhatWillYouBattleWith goto Route5_PokemonDayCare_EventScript_CloseMoneyBox end Route5_PokemonDayCare_EventScript_CheckOnMon:: setvar VAR_0x8004, 0 specialvar VAR_RESULT, GetNumLevelsGainedForRoute5DaycareMon call_if_ne VAR_RESULT, 0, Route5_PokemonDayCare_EventScript_MonHasGrownByXLevels call_if_eq VAR_RESULT, 0, Route5_PokemonDayCare_EventScript_NotEnoughTime special GetCostToWithdrawRoute5DaycareMon msgbox Route5_PokemonDayCare_Text_OweMeXForMonsReturn, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, Route5_PokemonDayCare_EventScript_TryRetrieveMon goto Route5_PokemonDayCare_EventScript_ComeAgain end Route5_PokemonDayCare_EventScript_MonHasGrownByXLevels:: callnative GetStartingLevelOfRoute5DaycareMon msgbox Route5_PokemonDayCare_Text_MonHasGrownByXLevels return Route5_PokemonDayCare_EventScript_NotEnoughTime:: msgbox Route5_PokemonDayCare_Text_MonNeedsToSpendMoreTime return Route5_PokemonDayCare_EventScript_TryRetrieveMon:: specialvar VAR_RESULT, CalculatePlayerPartyCount goto_if_eq VAR_RESULT, PARTY_SIZE, Route5_PokemonDayCare_EventScript_NoRoomInParty Route5_PokemonDayCare_EventScript_TryRetrieveMon_Continue:: specialvar VAR_RESULT, IsEnoughForCostInVar0x8005 goto_if_eq VAR_RESULT, TRUE, Route5_PokemonDayCare_EventScript_RetrieveMon msgbox Route5_PokemonDayCare_Text_DontHaveEnoughMoney goto Route5_PokemonDayCare_EventScript_CloseMoneyBox end Route5_PokemonDayCare_EventScript_RetrieveMon:: setvar VAR_0x8004, 0 specialvar VAR_RESULT, TakePokemonFromRoute5Daycare compare VAR_RESULT, 9999 //boxes full goto_if_eq Route5_PokemonDayCare_EventScript_StorageAndPartyFull special SubtractMoneyFromVar0x8005 updatemoneybox copyvar VAR_0x8008, VAR_RESULT getpartysize subvar VAR_RESULT, 1 @bufferpartymonnick STR_VAR_1, VAR_RESULT @ done by TakePokemonFromRoute5Daycare into STR_VAR_1 copyvar VAR_RESULT, VAR_0x8008 msgbox Route5_PokemonDayCare_Text_ThankYouHeresMon textcolor NPC_TEXT_COLOR_NEUTRAL waitse playmoncry VAR_RESULT, CRY_MODE_NORMAL msgbox Route5_PokemonDayCare_Text_PlayerGotMonBack waitmoncry compare VAR_MON_BOX_ID, 9999 //not sent to box call_if_ne Route5_PokemonDayCare_EventScript_SentToBoxNum call EventScript_RestorePrevTextColor goto Route5_PokemonDayCare_EventScript_CloseMoneyBox end Route5_PokemonDayCare_EventScript_NoRoomInParty:: callnative CheckDaycareMonsHaveMail goto_if_ne VAR_RESULT, TRUE, Route5_PokemonDayCare_EventScript_TryRetrieveMon_Continue @ this mon has mail Route5_PokemonDayCare_EventScript_StorageAndPartyFull:: msgbox Route5_PokemonDayCare_Text_YouveGotNoRoomForIt goto Route5_PokemonDayCare_EventScript_CloseMoneyBox end Route5_PokemonDayCare_EventScript_SentToBoxNum:: copyvar VAR_TEMP_1, VAR_RESULT call EventScript_TransferredToPC_Nickname return EventScript_TransferredToPC_Nickname:: bufferboxname STR_VAR_1, VAR_PC_BOX_TO_SEND_MON call_if_unset FLAG_SYS_NOT_SOMEONES_PC, EventScript_TransferredSomeonesPC call_if_set FLAG_SYS_NOT_SOMEONES_PC, EventScript_TransferredBillsPC return Route5_PokemonDayCare_EventScript_CloseMoneyBox:: hidemoneybox release end EventScript_EggHatch:: lockall msgbox DayCare_Text_Huh special EggHatch waitstate releaseall end ================================================ FILE: data/scripts/fame_checker.inc ================================================ ViridianCity_School_EventScript_PokemonJournal:: lock faceplayer famechecker FAMECHECKER_OAK, 3 famechecker FAMECHECKER_DAISY, 3 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureProfOak release end EventScript_PokemonJournalUnused1:: lock faceplayer famechecker FAMECHECKER_DAISY, 1 famechecker FAMECHECKER_OAK, 4 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureProfOak release end EventScript_PokemonJournalUnused2:: lock faceplayer famechecker FAMECHECKER_DAISY, 4 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureProfOak release end FourIsland_PokemonCenter_1F_EventScript_PokemonJournal:: lockall famechecker FAMECHECKER_DAISY, 5 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureDaisyOak releaseall end Route4_EventScript_Boy:: lock faceplayer famechecker FAMECHECKER_BROCK, 3 msgbox Route4_Text_PeopleLikeAndRespectBrock release end MtMoon_1F_EventScript_BaldingMan:: lock faceplayer famechecker FAMECHECKER_BROCK, 4 msgbox MtMoon_1F_Text_BrockHelpsExcavateFossils release end PewterCity_Museum_1F_EventScript_PokemonJournalBrock:: lockall famechecker FAMECHECKER_BROCK, 5 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureBrock releaseall end Route20_EventScript_Camper:: lock faceplayer famechecker FAMECHECKER_MISTY, 3 msgbox Route20_Text_MistyTrainsHere release end Route25_EventScript_Beauty:: lock faceplayer famechecker FAMECHECKER_MISTY, 4 msgbox Route25_Text_MistyHighHopesAboutThisPlace release end CeruleanCity_PokemonCenter_1F_EventScript_PokemonJournalMisty:: lock faceplayer famechecker FAMECHECKER_MISTY, 5 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureMisty release end VermilionCity_PokemonCenter_1F_EventScript_PokemonJournalLtSurge:: lockall famechecker FAMECHECKER_LTSURGE, 5 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureLtSurge releaseall end CeladonCity_Condominiums_2F_EventScript_PokemonJournalErika:: lock faceplayer famechecker FAMECHECKER_ERIKA, 5 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureErika release end FuchsiaCity_WardensHouse_EventScript_PokemonJournalKoga:: lock faceplayer famechecker FAMECHECKER_KOGA, 4 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureKoga release end SafariZone_North_RestHouse_EventScript_BaldingMan:: lock faceplayer famechecker FAMECHECKER_KOGA, 5 msgbox SafariZone_West_Text_KogaPatrolsSafariEverySoOften release end SaffronCity_PokemonCenter_1F_EventScript_PokemonJournalSabrina:: lock faceplayer famechecker FAMECHECKER_SABRINA, 4 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureSabrina release end CinnabarIsland_Gym_EventScript_BlaineFujiPhoto:: lockall famechecker FAMECHECKER_BLAINE, 4 famechecker FAMECHECKER_MRFUJI, 4 msgbox CinnabarIsland_Gym_Text_PhotoOfBlaineAndFuji releaseall end FiveIsland_ResortGorgeous_House_EventScript_PokemonJournal:: lockall famechecker FAMECHECKER_BLAINE, 5 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureBlaine releaseall end FourIsland_Mart_EventScript_OldMan:: lock faceplayer famechecker FAMECHECKER_LORELEI, 2 msgbox FourIsland_Mart_Text_LoreleiGrewUpOnThisIsland release end FiveIsland_PokemonCenter_1F_EventScript_PokemonJournal:: lock faceplayer famechecker FAMECHECKER_LORELEI, 3 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureLorelei release end SaffronCity_PokemonTrainerFanClub_EventScript_PokemonJournalBruno:: lock faceplayer famechecker FAMECHECKER_BRUNO, 2 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureBruno release end SevenIsland_SevaultCanyon_EventScript_BlackBelt:: lock faceplayer famechecker FAMECHECKER_BRUNO, 5 msgbox SevenIsland_SevaultCanyon_Text_BrunoTrainedWithBrawly release end IndigoPlateau_PokemonCenter_1F_EventScript_BlackBelt:: lock faceplayer famechecker FAMECHECKER_AGATHA, 1 famechecker FAMECHECKER_AGATHA, 2 msgbox IndigoPlateau_PokemonCenter_1F_Text_AgathaWhuppedUs release end SevenIsland_PokemonCenter_1F_EventScript_PokemonJournal:: lock faceplayer famechecker FAMECHECKER_AGATHA, 3 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureAgatha release end SixIsland_Mart_EventScript_OldWoman:: lock faceplayer famechecker FAMECHECKER_AGATHA, 5 msgbox SixIsland_Mart_Text_AgathaOldestEverEliteFourMember release end EventScript_LanceUnused:: lock faceplayer famechecker FAMECHECKER_LANCE, 0 msgbox gFameCheckerFlavorText_Lance0 release end SaffronCity_EventScript_BattleGirlUnused:: lock faceplayer famechecker FAMECHECKER_LANCE, 1 msgbox SaffronCity_Text_HowCanClubNotRecognizeLance release end SaffronCity_EventScript_BattleGirl:: lock faceplayer famechecker FAMECHECKER_LANCE, 2 msgbox SaffronCity_Text_HowCanClubNotRecognizeLance release end CeladonCity_DepartmentStore_2F_EventScript_Woman:: lock faceplayer famechecker FAMECHECKER_LANCE, 3 msgbox CeladonCity_DepartmentStore_2F_Text_LanceComesToBuyCapes release end IndigoPlateau_PokemonCenter_1F_EventScript_PokemonJournal:: lock faceplayer famechecker FAMECHECKER_LANCE, 4 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureLance release end IndigoPlateau_PokemonCenter_1F_EventScript_CooltrainerM:: lock faceplayer famechecker FAMECHECKER_LANCE, 5 msgbox IndigoPlateau_PokemonCenter_1F_Text_LancesCousinGymLeaderFarAway release end LavenderTown_PokemonCenter_1F_EventScript_BaldingMan:: lock faceplayer famechecker FAMECHECKER_MRFUJI, 3 msgbox LavenderTown_PokemonCenter_1F_Text_HearMrFujiNotFromAroundHere release end CinnabarIsland_PokemonCenter_1F_EventScript_PokemonJournalMrFuji:: lock faceplayer famechecker FAMECHECKER_MRFUJI, 5 textcolor NPC_TEXT_COLOR_NEUTRAL msgbox PokemonJournal_Text_SpecialFeatureMrFuji release end SilphCo_5F_EventScript_Scientist:: lock faceplayer famechecker FAMECHECKER_GIOVANNI, 1 msgbox SilphCo_5F_Text_RocketBossLookingForStrongMons release end SilphCo_8F_EventScript_Scientist:: lock faceplayer famechecker FAMECHECKER_GIOVANNI, 2 msgbox SilphCo_8F_Text_ToRocketBossMonsAreTools release end ================================================ FILE: data/scripts/field_moves.inc ================================================ EventScript_CutTree:: goto_if_questlog EventScript_ReleaseEnd lockall goto_if_unset FLAG_BADGE02_GET, EventScript_CantCutTree checkpartymove MOVE_CUT goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantCutTree setfieldeffectargument 0, VAR_RESULT bufferpartymonnick STR_VAR_1, VAR_RESULT buffermovename STR_VAR_2, MOVE_CUT msgbox Text_CutTreeDown, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DontCutTree msgbox Text_MonUsedMove closemessage dofieldeffect FLDEFF_USE_CUT_ON_TREE waitstate goto EventScript_CutTreeDown end EventScript_FldEffCut:: lockall dofieldeffect FLDEFF_USE_CUT_ON_TREE waitstate goto EventScript_CutTreeDown end EventScript_CutTreeDown:: applymovement VAR_LAST_TALKED, Movement_CutTreeDown waitmovement 0 removeobject VAR_LAST_TALKED releaseall end Movement_CutTreeDown:: cut_tree step_end EventScript_CantCutTree:: msgbox Text_TreeCanBeCutDown, MSGBOX_SIGN releaseall end EventScript_DontCutTree:: closemessage releaseall end Text_CutTreeDown:: .string "This tree looks like it can be CUT\n" .string "down!\p" .string "Would you like to CUT it?$" Text_MonUsedMove:: .string "{STR_VAR_1} used {STR_VAR_2}!$" Text_TreeCanBeCutDown:: .string "This tree looks like it can be CUT\n" .string "down!$" EventScript_RockSmash:: goto_if_questlog EventScript_ReleaseEnd lockall goto_if_unset FLAG_BADGE06_GET, EventScript_CantSmashRock checkpartymove MOVE_ROCK_SMASH goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSmashRock setfieldeffectargument 0, VAR_RESULT bufferpartymonnick STR_VAR_1, VAR_RESULT buffermovename STR_VAR_2, MOVE_ROCK_SMASH msgbox Text_UseRockSmash, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DontSmashRock msgbox Text_MonUsedMove closemessage dofieldeffect FLDEFF_USE_ROCK_SMASH waitstate goto EventScript_UseRockSmash end EventScript_FldEffRockSmash:: lockall dofieldeffect FLDEFF_USE_ROCK_SMASH waitstate goto EventScript_UseRockSmash end EventScript_UseRockSmash:: applymovement VAR_LAST_TALKED, Movement_BreakRock waitmovement 0 removeobject VAR_LAST_TALKED special RockSmashWildEncounter goto_if_eq VAR_RESULT, FALSE, EventScript_RockSmashNoEncounter waitstate releaseall end EventScript_RockSmashNoEncounter:: releaseall end Movement_BreakRock:: rock_smash_break step_end EventScript_CantSmashRock:: msgbox Text_MonMaySmashRock, MSGBOX_SIGN end EventScript_DontSmashRock:: closemessage releaseall end Text_UseRockSmash:: .string "This rock appears to be breakable.\n" .string "Would you like to use ROCK SMASH?$" Text_MonMaySmashRock:: .string "It's a rugged rock, but a POKéMON\n" .string "may be able to smash it.$" EventScript_StrengthBoulder:: goto_if_questlog EventScript_ReleaseEnd lockall goto_if_unset FLAG_BADGE04_GET, EventScript_CantMoveBoulder goto_if_set FLAG_SYS_USE_STRENGTH, EventScript_AlreadyUsedStrength checkpartymove MOVE_STRENGTH goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantMoveBoulder setfieldeffectargument 0, VAR_RESULT msgbox Text_UseStrength, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DontUseStrength closemessage dofieldeffect FLDEFF_USE_STRENGTH waitstate goto EventScript_UseStrength end EventScript_FldEffStrength:: lockall dofieldeffect FLDEFF_USE_STRENGTH waitstate goto EventScript_UseStrength end EventScript_UseStrength:: setflag FLAG_SYS_USE_STRENGTH msgbox Text_MonUsedStrengthCanMoveBoulders, MSGBOX_SIGN end EventScript_CantMoveBoulder:: msgbox Text_MonMayPushBoulder, MSGBOX_SIGN end EventScript_AlreadyUsedStrength:: msgbox Text_StrengthMadeMovingBouldersPossible, MSGBOX_SIGN end EventScript_DontUseStrength:: closemessage releaseall end Text_UseStrength:: .string "It's a big boulder, but a POKéMON\n" .string "may be able to push it aside.\p" .string "Would you like to use STRENGTH?$" Text_MonUsedStrengthCanMoveBoulders:: .string "{STR_VAR_1} used STRENGTH!\p" .string "{STR_VAR_1}'s STRENGTH made it\n" .string "possible to move boulders around!$" Text_MonMayPushBoulder:: .string "It's a big boulder, but a POKéMON\n" .string "may be able to push it aside.$" Text_StrengthMadeMovingBouldersPossible:: .string "STRENGTH made it possible to move\n" .string "boulders around.$" EventScript_Waterfall:: goto_if_questlog EventScript_ReleaseEnd lockall checkpartymove MOVE_WATERFALL goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_WaterCrashingDown bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT msgbox Text_UseWaterfall, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_EndWaterfall msgbox Text_MonUsedWaterfall dofieldeffect FLDEFF_USE_WATERFALL goto EventScript_EndWaterfall EventScript_CantUseWaterfall:: lockall EventScript_WaterCrashingDown: msgbox Text_WallOfWaterCrashingDown EventScript_EndWaterfall: releaseall end Text_WallOfWaterCrashingDown:: .string "A wall of water is crashing down\n" .string "with a mighty roar.$" Text_UseWaterfall:: .string "It's a large waterfall.\n" .string "Would you like to use WATERFALL?$" Text_MonUsedWaterfall:: .string "{STR_VAR_1} used WATERFALL.$" EventScript_DeepWater:: lockall checkpartymove MOVE_DIVE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_MayGoUnderwater bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT setfieldeffectargument 1, 1 msgbox Text_SeaIsDeepUseDive, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_EndDive msgbox Text_MonUsedDive dofieldeffect FLDEFF_USE_DIVE goto EventScript_EndDive end EventScript_CantDive:: lockall EventScript_MayGoUnderwater: msgbox Text_MonMayGoUnderwater EventScript_EndDive: releaseall end EventScript_TrySurface:: lockall checkpartymove MOVE_DIVE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSurface bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT setfieldeffectargument 1, 1 msgbox Text_LightFilteringUseDive, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_EndSurface msgbox Text_MonUsedDive dofieldeffect FLDEFF_USE_DIVE goto EventScript_EndSurface end EventScript_CantSurface:: lockall msgbox Text_MonMaySurface, MSGBOX_DEFAULT goto EventScript_EndSurface end EventScript_ObstacleCantSurface:: lockall msgbox Text_DiveCantBeUsedHere EventScript_EndSurface: releaseall end Text_MonMayGoUnderwater:: .string "The sea is deep here. A POKéMON\n" .string "may be able to go underwater.$" Text_SeaIsDeepUseDive:: .string "The sea is deep here.\n" .string "Would you like to use DIVE?$" Text_MonUsedDive:: .string "{STR_VAR_1} used DIVE.$" Text_MonMaySurface:: .string "Light is filtering down from above.\n" .string "A POKéMON may be able to surface.$" Text_LightFilteringUseDive:: .string "Light is filtering down from above.\n" .string "Would you like to use DIVE?$" Text_DiveCantBeUsedHere:: .string "There is an obstacle above.\n" .string "DIVE can't be used here.$" EventScript_FailSweetScent:: msgbox Text_LooksLikeNothingHere, MSGBOX_SIGN end Text_LooksLikeNothingHere:: .string "Looks like there's nothing here…$" EventScript_EnableAutoRun:: msgbox AutoRunEnabled MSGBOX_SIGN end AutoRunEnabled: .string "Pressing R toggles running by default.\nAuto running is now enabled.$" ================================================ FILE: data/scripts/flash.inc ================================================ EventScript_FldEffFlash:: animateflash 0 setflashlevel 0 end ================================================ FILE: data/scripts/flavor_text.inc ================================================ @ Flavor text for interacting with various background objects EventScript_Bookshelf:: msgbox Text_Bookshelf, MSGBOX_SIGN end EventScript_PokeMartShelf:: msgbox Text_PokeMartShelf, MSGBOX_SIGN end EventScript_Food:: msgbox Text_Food, MSGBOX_SIGN end EventScript_VideoGame:: msgbox Text_VideoGame, MSGBOX_SIGN end EventScript_Computer:: msgbox Text_Computer, MSGBOX_SIGN end EventScript_ImpressiveMachine:: msgbox Text_ImpressiveMachine, MSGBOX_SIGN end EventScript_Blueprints:: msgbox Text_Blueprints, MSGBOX_SIGN end EventScript_Burglary:: msgbox Text_Burglary, MSGBOX_SIGN end EventScript_PlayerFacingTVScreen:: msgbox Text_PlayerFacingTVScreen, MSGBOX_SIGN end EventScript_Cabinet:: msgbox Text_DishesPlatesNeatlyLinedUp, MSGBOX_SIGN end EventScript_Kitchen:: msgbox Text_Kitchen, MSGBOX_SIGN end EventScript_Dresser:: msgbox Text_Dresser, MSGBOX_SIGN end EventScript_Snacks:: msgbox Text_Snacks, MSGBOX_SIGN end EventScript_Painting:: msgbox Text_Painting, MSGBOX_SIGN end EventScript_PowerPlantMachine:: msgbox Text_PowerPlantMachine, MSGBOX_SIGN end EventScript_Telephone:: msgbox Text_Telephone, MSGBOX_SIGN end EventScript_AdvertisingPoster:: msgbox Text_AdvertisingPoster, MSGBOX_SIGN end EventScript_TastyFood:: msgbox Text_TastyFood, MSGBOX_SIGN end EventScript_TrashBin:: msgbox Text_TrashBin, MSGBOX_SIGN end EventScript_Cup:: msgbox Text_Cup, MSGBOX_SIGN end EventScript_PolishedWindow:: msgbox Text_PolishedWindow, MSGBOX_SIGN end EventScript_BeautifulSkyWindow:: msgbox Text_BeautifulSkyWindow, MSGBOX_SIGN end EventScript_BlinkingLights:: msgbox Text_BlinkingLights, MSGBOX_SIGN end EventScript_NeatlyLinedUpTools:: msgbox Text_NeatlyLinedUpTools, MSGBOX_SIGN end EventScript_PokemartSign:: msgbox Text_PokemartSign, MSGBOX_SIGN end EventScript_PokecenterSign:: msgbox Text_PokecenterSign, MSGBOX_SIGN end EventScript_Indigo_UltimateGoal:: msgbox Text_Indigo_UltimateGoal, MSGBOX_SIGN end EventScript_Indigo_HighestAuthority:: msgbox Text_Indigo_HighestAuthority, MSGBOX_SIGN end EventScript_SafariZone_ExtensionSign:: msgbox Text_SafariZone_ExtensionSign, MSGBOX_SIGN end Text_SafariZone_ExtensionSign:: .string "The SAFARI ZONE's expansion project\n" .string "is finally complete!\p" .string "The new AREA 4 is straight ahead!$" ================================================ FILE: data/scripts/fuji_event.inc ================================================ EventScript_FujiOutside:: lock faceplayer msgbox EventScript_FujiOutside_Text_0, MSGBOX_YESNO EventScript_FujiOutside_2: compare VAR_RESULT, NO goto_if_eq EventScript_FujiOutside_3 msgbox EventScript_FujiOutside_Text_2, MSGBOX_DEFAULT checkitemspace ITEM_OLD_SEA_MAP, 1 compare VAR_RESULT, FALSE goto_if_eq EventScript_FujiOutside_6 giveitem_msg EventScript_FujiOutside_Text_3, ITEM_OLD_SEA_MAP, 1, MUS_OBTAIN_KEY_ITEM setflag FLAG_RECEIVED_OLD_SEA_MAP msgbox EventScript_FujiOutside_Text_4, MSGBOX_NPC getplayerxy VAR_RESULT, VAR_0x8003 compare VAR_RESULT, 9 goto_if_ne EventScript_FujiOutside_9 applymovement 4, Movement_FujiToHouseAroundPlayer waitmovement 0 EventScript_FujiOutside_8: opendoor 10, 11 waitdooranim applymovement 4, PalletTown_Movement_OakEnterLab waitmovement 0 closedoor 10, 11 waitdooranim setflag FLAG_HIDE_LAVENDER_OUTSIDE_FUJI clearflag FLAG_HIDE_POKEHOUSE_FUJI release end EventScript_FujiOutside_3: msgbox EventScript_FujiOutside_Text_1, MSGBOX_YESNO goto EventScript_FujiOutside_2 EventScript_FujiOutside_6: msgbox LavenderTown_VolunteerPokemonHouse_Text_MustMakeRoomForThis, MSGBOX_DEFAULT release end EventScript_FujiOutside_9: applymovement 4, Movement_FujiToHouse waitmovement 0 goto EventScript_FujiOutside_8 Movement_FujiToHouse: walk_right walk_right face_up step_end Movement_FujiToHouseAroundPlayer: walk_down walk_right walk_right walk_up step_end EventScript_FujiOutside_Text_0: .string "MR. FUJI: {PLAYER}!\nHow is your quest going?\pAh, you and your POKéMON are\nthe POKéMON LEAGUE CHAMPIONS!\pCongratulations!\nYour deep love for your POKéMON\lis obvious to anyone.\pI have a favor to ask.\pThere is an island far from KANTO\nwhere a certain POKéMON lives.\pThat POKéMON was mistreated by\nhumans in the past.\pI was hoping you would befriend\nthat POKéMON and show it that\lhumans can be kind and gentle.\pWill you do this for me?$" EventScript_FujiOutside_Text_1: .string "Helping this POKéMON is very\nimportant to me, {PLAYER}.\pPlease tell me you'll help.$" EventScript_FujiOutside_Text_2: .string "MR. FUJI: Thank you, {PLAYER}.\pI have an old map to the island.\nI'm sure you've befriended a sailor\lor two during your quest.\pThey will be able to read this\nmap and take you there.$" EventScript_FujiOutside_Text_3: .string "{PLAYER} received an OLD SEA MAP\nfrom MR. FUJI.$" EventScript_FujiOutside_Text_4: .string "MR. FUJI: I know you will treat that\nPOKéMON with love and kindness.\pThank you, {PLAYER}.$" ================================================ FILE: data/scripts/fuji_event.pory ================================================ script EventScript_FujiOutside{ lock faceplayer msgbox("MR. FUJI: {PLAYER}!\nHow is your quest going?\pAh, you and your POKéMON are\nthe POKéMON LEAGUE CHAMPIONS!\pCongratulations!\nYour deep love for your POKéMON\lis obvious to anyone.\pI have a favor to ask.\pThere is an island far from KANTO\nwhere a certain POKéMON lives.\pThat POKéMON was mistreated by\nhumans in the past.\pI was hoping you would befriend\nthat POKéMON and show it that\lhumans can be kind and gentle.\pWill you do this for me?", MSGBOX_YESNO) while(var(VAR_RESULT) == NO) { msgbox("Helping this POKéMON is very\nimportant to me, {PLAYER}.\pPlease tell me you'll help.", MSGBOX_YESNO) } msgbox("MR. FUJI: Thank you, {PLAYER}.\pI have an old map to the island.\nI'm sure you've befriended a sailor\lor two during your quest.\pThey will be able to read this\nmap and take you there.", MSGBOX_DEFAULT) checkitemspace(ITEM_OLD_SEA_MAP, 1) if(var(VAR_RESULT) == FALSE) { msgbox(LavenderTown_VolunteerPokemonHouse_Text_MustMakeRoomForThis, MSGBOX_DEFAULT) release end } giveitem_msg("{PLAYER} received an OLD SEA MAP\nfrom MR. FUJI.$", ITEM_OLD_SEA_MAP, 1, MUS_OBTAIN_KEY_ITEM) setflag(FLAG_RECEIVED_OLD_SEA_MAP) msgbox("MR. FUJI: I know you will treat that\nPOKéMON with love and kindness.\pThank you, {PLAYER}.", MSGBOX_NPC) getplayerxy(VAR_RESULT, VAR_0x8003) if(var(VAR_RESULT) != 9) { applymovement(4, Movement_FujiToHouse) waitmovement(0) } else { applymovement(4, Movement_FujiToHouseAroundPlayer) waitmovement(0) } opendoor(10, 11) waitdooranim applymovement(4, PalletTown_Movement_OakEnterLab) waitmovement(0) closedoor(10, 11) waitdooranim setflag(FLAG_HIDE_LAVENDER_OUTSIDE_FUJI) clearflag(FLAG_HIDE_POKEHOUSE_FUJI) release end } movement Movement_FujiToHouse { walk_right * 2 face_up } movement Movement_FujiToHouseAroundPlayer { walk_down walk_right * 2 walk_up } ================================================ FILE: data/scripts/hall_of_fame.inc ================================================ EventScript_SetDefeatedEliteFourFlagsVars:: clearflag FLAG_HIDE_MASTER_TRAINERS clearflag FLAG_HIDE_POSTGAME_GOSSIPERS call EventScript_ResetEliteFour special Script_UpdateTrainerFanClubGameClear call_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, EventScript_SetReadyTryGiveNationalDexScene call EventScript_ResetLegendaries return EventScript_SetReadyTryGiveNationalDexScene:: setvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 2 return EventScript_ResetLegendaries:: clearflag FLAG_LUGIA_FLEW_AWAY clearflag FLAG_HO_OH_FLEW_AWAY clearflag FLAG_DEOXYS_FLEW_AWAY clearflag FLAG_MEW_FLEW_AWAY clearflag FLAG_MEWTWO_FLEW_AWAY clearflag FLAG_ARTICUNO_FLEW_AWAY clearflag FLAG_ZAPDOS_FLEW_AWAY clearflag FLAG_MOLTRES_FLEW_AWAY clearflag FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS clearflag FLAG_ROUTE_16_SNORLAX_RETURNED_TO_MOUNTAINS clearflag FLAG_DEFEATED_LATIOS clearflag FLAG_DEFEATED_LATIAS clearflag FLAG_DEFEATED_SUDOWOODO special InitRoamer return EventScript_ResetEliteFourEnd:: call EventScript_ResetEliteFour end EventScript_ResetEliteFour:: clearflag FLAG_DEFEATED_LORELEI clearflag FLAG_DEFEATED_BRUNO clearflag FLAG_DEFEATED_AGATHA clearflag FLAG_DEFEATED_LANCE clearflag FLAG_DEFEATED_CHAMP cleartrainerflag TRAINER_CHAMPION_FIRST_SQUIRTLE cleartrainerflag TRAINER_CHAMPION_FIRST_BULBASAUR cleartrainerflag TRAINER_CHAMPION_FIRST_CHARMANDER cleartrainerflag TRAINER_CHAMPION_REMATCH_SQUIRTLE cleartrainerflag TRAINER_CHAMPION_REMATCH_BULBASAUR cleartrainerflag TRAINER_CHAMPION_REMATCH_CHARMANDER setvar VAR_MAP_SCENE_POKEMON_LEAGUE, 0 return ================================================ FILE: data/scripts/hole.inc ================================================ @ Unused EventScript_CheckFallDownHole:: map_script_2 VAR_ICE_STEP_COUNT, 0, EventScript_FallDownHole .2byte 0 @ Unused EventScript_FixCrackedGround:: copyvar VAR_ICE_STEP_COUNT, 1 end EventScript_FallDownHole:: lockall delay 20 applymovement OBJ_EVENT_ID_PLAYER, Movement_SetInvisible waitmovement 0 playse SE_FALL delay 60 warphole MAP_UNDEFINED waitstate end @ Differs from the script above by assuming the warp destination has already been set EventScript_DoFallWarp:: lockall delay 20 applymovement OBJ_EVENT_ID_PLAYER, Movement_SetInvisible waitmovement 0 playse SE_FALL delay 60 special DoFallWarp waitstate end Movement_SetInvisible: set_invisible step_end ================================================ FILE: data/scripts/item_ball_scripts.inc ================================================ Route2_EventScript_ItemEther:: finditem ITEM_ETHER end Route2_EventScript_ItemParalyzeHeal:: finditem ITEM_PARALYZE_HEAL end ViridianForest_EventScript_ItemPokeBall:: finditem ITEM_POKE_BALL end ViridianForest_EventScript_ItemAntidote:: finditem ITEM_ANTIDOTE end ViridianForest_EventScript_ItemPotion:: finditem ITEM_POTION end MtMoon_1F_EventScript_ItemParalyzeHeal:: finditem ITEM_PARALYZE_HEAL end MtMoon_1F_EventScript_ItemTM09:: finditem ITEM_TM09 end MtMoon_1F_EventScript_ItemPotion:: finditem ITEM_POTION end MtMoon_1F_EventScript_ItemRareCandy:: finditem ITEM_RARE_CANDY end MtMoon_1F_EventScript_ItemEscapeRope:: finditem ITEM_ESCAPE_ROPE end MtMoon_1F_EventScript_ItemMoonStone:: finditem ITEM_MOON_STONE end MtMoon_B2F_EventScript_ItemStarPiece:: finditem ITEM_STAR_PIECE end MtMoon_B2F_EventScript_ItemTM46:: finditem ITEM_TM46 end Route4_EventScript_ItemTM05:: finditem ITEM_TM05 end Route24_EventScript_ItemTM45:: finditem ITEM_TM45 end Route25_EventScript_ItemTM43:: finditem ITEM_TM43 end SSAnne_1F_Room2_EventScript_ItemTM31:: finditem ITEM_TM31 end SSAnne_2F_Room2_EventScript_ItemStardust:: finditem ITEM_STARDUST end SSAnne_2F_Room4_EventScript_ItemXAttack:: finditem ITEM_X_ATTACK end SSAnne_B1F_Room2_EventScript_ItemTM44:: finditem ITEM_TM44 end SSAnne_B1F_Room3_EventScript_ItemEther:: finditem ITEM_ETHER end SSAnne_B1F_Room5_EventScript_ItemSuperPotion:: finditem ITEM_SUPER_POTION end SSAnne_Kitchen_EventScript_ItemGreatBall:: finditem ITEM_GREAT_BALL end Route9_EventScript_ItemTM40:: finditem ITEM_TM40 end RocketHideout_B1F_EventScript_ItemEscapeRope:: finditem ITEM_ESCAPE_ROPE end RocketHideout_B1F_EventScript_ItemHyperPotion:: finditem ITEM_HYPER_POTION end RocketHideout_B2F_EventScript_ItemXSpeed:: finditem ITEM_X_SPEED end RocketHideout_B2F_EventScript_ItemMoonStone:: finditem ITEM_MOON_STONE end RocketHideout_B2F_EventScript_ItemTM12:: finditem ITEM_TM12 end RocketHideout_B2F_EventScript_ItemSuperPotion:: finditem ITEM_SUPER_POTION end RocketHideout_B3F_EventScript_ItemRareCandy:: finditem ITEM_RARE_CANDY end RocketHideout_B3F_EventScript_ItemTM21:: finditem ITEM_TM21 end RocketHideout_B4F_EventScript_ItemTM49:: finditem ITEM_TM49 end RocketHideout_B4F_EventScript_ItemMaxEther:: finditem ITEM_MAX_ETHER end RocketHideout_B4F_EventScript_ItemCalcium:: finditem ITEM_CALCIUM end PokemonTower_3F_EventScript_ItemEscapeRope:: finditem ITEM_ESCAPE_ROPE end PokemonTower_4F_EventScript_ItemElixir:: finditem ITEM_ELIXIR end PokemonTower_4F_EventScript_ItemAwakening:: finditem ITEM_AWAKENING end PokemonTower_4F_EventScript_ItemGreatBall:: finditem ITEM_GREAT_BALL end PokemonTower_5F_EventScript_ItemNugget:: finditem ITEM_NUGGET end PokemonTower_6F_EventScript_ItemRareCandy:: finditem ITEM_RARE_CANDY end PokemonTower_6F_EventScript_ItemXAccuracy:: finditem ITEM_X_ACCURACY end Route12_EventScript_ItemTM48:: finditem ITEM_TM48 end Route12_EventScript_ItemIron:: finditem ITEM_IRON end Route15_EventScript_ItemTM18:: finditem ITEM_TM18 end SafariZone_Center_EventScript_ItemNugget:: finditem ITEM_NUGGET end SafariZone_East_EventScript_ItemMaxPotion:: finditem ITEM_MAX_POTION end SafariZone_East_EventScript_ItemFullRestore:: finditem ITEM_FULL_RESTORE end SafariZone_East_EventScript_ItemTM11:: finditem ITEM_TM11 end SafariZone_East_EventScript_ItemLeafStone:: finditem ITEM_LEAF_STONE end SafariZone_North_EventScript_ItemProtein:: finditem ITEM_PROTEIN end SafariZone_North_EventScript_ItemTM47:: finditem ITEM_TM47 end SafariZone_West_EventScript_ItemTM32:: finditem ITEM_TM32 end SafariZone_West_EventScript_ItemGoldTeeth:: finditem ITEM_GOLD_TEETH end SafariZone_West_EventScript_ItemMaxPotion:: finditem ITEM_MAX_POTION end SafariZone_West_EventScript_ItemMaxRevive:: finditem ITEM_MAX_REVIVE end SilphCo_3F_EventScript_ItemHyperPotion:: finditem ITEM_HYPER_POTION end SilphCo_4F_EventScript_ItemMaxRevive:: finditem ITEM_MAX_REVIVE end SilphCo_4F_EventScript_ItemEscapeRope:: finditem ITEM_ESCAPE_ROPE end SilphCo_4F_EventScript_ItemFullHeal:: finditem ITEM_FULL_HEAL end SilphCo_5F_EventScript_ItemProtein:: finditem ITEM_PROTEIN end SilphCo_5F_EventScript_ItemTM01:: finditem ITEM_TM01 end SilphCo_5F_EventScript_ItemCardKey:: finditem ITEM_CARD_KEY end SilphCo_6F_EventScript_ItemHPUp:: finditem ITEM_HP_UP end SilphCo_6F_EventScript_ItemXSpecial:: finditem ITEM_X_SPECIAL end SilphCo_7F_EventScript_ItemCalcium:: finditem ITEM_CALCIUM end SilphCo_7F_EventScript_ItemTM08:: finditem ITEM_TM08 end SilphCo_10F_EventScript_ItemCarbos:: finditem ITEM_CARBOS end SilphCo_10F_EventScript_ItemUltraBall:: finditem ITEM_ULTRA_BALL end SilphCo_10F_EventScript_ItemRareCandy:: finditem ITEM_RARE_CANDY end PowerPlant_EventScript_ItemMaxPotion:: finditem ITEM_MAX_POTION end PowerPlant_EventScript_ItemTM17:: finditem ITEM_TM17 end PowerPlant_EventScript_ItemTM25:: finditem ITEM_TM25 end PowerPlant_EventScript_ItemThunderStone:: finditem ITEM_THUNDER_STONE end PowerPlant_EventScript_ItemElixir:: finditem ITEM_ELIXIR end PokemonMansion_1F_EventScript_ItemCarbos:: finditem ITEM_CARBOS end PokemonMansion_1F_EventScript_ItemEscapeRope:: finditem ITEM_ESCAPE_ROPE end PokemonMansion_2F_EventScript_ItemCalcium:: finditem ITEM_CALCIUM end PokemonMansion_3F_EventScript_ItemMaxPotion:: finditem ITEM_MAX_POTION end PokemonMansion_3F_EventScript_ItemIron:: finditem ITEM_IRON end PokemonMansion_B1F_EventScript_ItemTM14:: finditem ITEM_TM14 end PokemonMansion_B1F_EventScript_ItemFullRestore:: finditem ITEM_FULL_RESTORE end PokemonMansion_B1F_EventScript_ItemTM22:: finditem ITEM_TM22 end PokemonMansion_B1F_EventScript_ItemSecretKey:: finditem ITEM_SECRET_KEY end VictoryRoad_1F_EventScript_ItemRareCandy:: finditem ITEM_RARE_CANDY end VictoryRoad_1F_EventScript_ItemTM02:: finditem ITEM_TM02 end VictoryRoad_2F_EventScript_ItemGuardSpec:: finditem ITEM_GUARD_SPEC end VictoryRoad_2F_EventScript_ItemTM07:: finditem ITEM_TM07 end VictoryRoad_2F_EventScript_ItemFullHeal:: finditem ITEM_FULL_HEAL end VictoryRoad_2F_EventScript_ItemTM37:: finditem ITEM_TM37 end VictoryRoad_3F_EventScript_ItemMaxRevive:: finditem ITEM_MAX_REVIVE end VictoryRoad_3F_EventScript_ItemTM50:: finditem ITEM_TM50 end CeruleanCave_1F_EventScript_ItemMaxElixir:: finditem ITEM_MAX_ELIXIR end CeruleanCave_1F_EventScript_ItemNugget:: finditem ITEM_NUGGET end CeruleanCave_1F_EventScript_ItemFullRestore:: finditem ITEM_FULL_RESTORE end CeruleanCave_2F_EventScript_ItemFullRestore:: finditem ITEM_FULL_RESTORE end CeruleanCave_2F_EventScript_ItemPPUp:: finditem ITEM_PP_UP end CeruleanCave_2F_EventScript_ItemUltraBall:: finditem ITEM_ULTRA_BALL end CeruleanCave_B1F_EventScript_ItemMaxRevive:: finditem ITEM_MAX_REVIVE end CeruleanCave_B1F_EventScript_ItemUltraBall:: finditem ITEM_ULTRA_BALL end FuchsiaCity_WardensHouse_EventScript_ItemRareCandy:: finditem ITEM_RARE_CANDY end TwoIsland_EventScript_ItemRevive:: finditem ITEM_REVIVE end ThreeIsland_EventScript_ItemZinc:: finditem ITEM_ZINC end ViridianForest_EventScript_ItemPotion2:: finditem ITEM_POTION end MtMoon_B2F_EventScript_ItemRevive:: finditem ITEM_REVIVE end MtMoon_B2F_EventScript_ItemAntidote:: finditem ITEM_ANTIDOTE end Route11_EventScript_ItemXDefend:: finditem ITEM_X_DEFEND end Route9_EventScript_ItemBurnHeal:: finditem ITEM_BURN_HEAL end RockTunnel_1F_EventScript_ItemRepel:: finditem ITEM_REPEL end RockTunnel_1F_EventScript_ItemPearl:: finditem ITEM_PEARL end RockTunnel_1F_EventScript_ItemEscapeRope:: finditem ITEM_ESCAPE_ROPE end RockTunnel_B1F_EventScript_ItemRevive:: finditem ITEM_REVIVE end RockTunnel_B1F_EventScript_ItemMaxEther:: finditem ITEM_MAX_ETHER end SilphCo_8F_EventScript_ItemIron:: finditem ITEM_IRON end SilphCo_11F_EventScript_ItemZinc:: finditem ITEM_ZINC end PokemonMansion_1F_EventScript_ItemProtein:: finditem ITEM_PROTEIN end PokemonMansion_2F_EventScript_ItemZinc:: finditem ITEM_ZINC end PokemonMansion_2F_EventScript_ItemHPUp:: finditem ITEM_HP_UP end ViridianCity_EventScript_ItemPotion:: finditem ITEM_POTION end Route11_EventScript_ItemGreatBall:: finditem ITEM_GREAT_BALL end Route11_EventScript_ItemAwakening:: finditem ITEM_AWAKENING end PokemonTower_5F_EventScript_ItemCleanseTag:: finditem ITEM_CLEANSE_TAG end CeladonCity_EventScript_ItemEther:: finditem ITEM_ETHER end CeladonCity_EventScript_ItemSunStone:: finditem ITEM_SUN_STONE end RocketHideout_B3F_EventScript_ItemBlackGlasses:: finditem ITEM_BLACK_GLASSES end SafariZone_North_EventScript_ItemQuickClaw:: finditem ITEM_QUICK_CLAW end SeafoamIslands_1F_EventScript_ItemIceHeal:: finditem ITEM_ICE_HEAL end SeafoamIslands_B1F_EventScript_ItemWaterStone:: finditem ITEM_WATER_STONE end SeafoamIslands_B1F_EventScript_ItemRevive:: finditem ITEM_REVIVE end SeafoamIslands_B2F_EventScript_ItemBigPearl:: finditem ITEM_BIG_PEARL end SeafoamIslands_B4F_EventScript_ItemUltraBall:: finditem ITEM_ULTRA_BALL end FourIsland_EventScript_ItemStarPiece:: finditem ITEM_STAR_PIECE end FourIsland_EventScript_ItemStardust:: finditem ITEM_STARDUST end OneIsland_KindleRoad_EventScript_ItemEther:: finditem ITEM_ETHER end OneIsland_KindleRoad_EventScript_ItemMaxRepel:: finditem ITEM_MAX_REPEL end OneIsland_KindleRoad_EventScript_ItemCarbos:: finditem ITEM_CARBOS end FiveIsland_Meadow_EventScript_ItemMaxPotion:: finditem ITEM_MAX_POTION end FiveIsland_Meadow_EventScript_ItemPPUp:: finditem ITEM_PP_UP end FiveIsland_MemorialPillar_EventScript_ItemMetalCoat:: finditem ITEM_METAL_COAT end SixIsland_OutcastIsland_EventScript_ItemPPUp:: finditem ITEM_PP_UP end SixIsland_WaterPath_EventScript_ItemElixir:: finditem ITEM_ELIXIR end SixIsland_WaterPath_EventScript_ItemDragonScale:: finditem ITEM_DRAGON_SCALE end SixIsland_RuinValley_EventScript_ItemFullRestore:: finditem ITEM_FULL_RESTORE end SixIsland_RuinValley_EventScript_ItemHPUp:: finditem ITEM_HP_UP end SixIsland_RuinValley_EventScript_ItemSunStone:: finditem ITEM_SUN_STONE end SevenIsland_SevaultCanyon_EventScript_ItemKingsRock:: finditem ITEM_KINGS_ROCK end SevenIsland_SevaultCanyon_EventScript_ItemMaxElixir:: finditem ITEM_MAX_ELIXIR end SevenIsland_SevaultCanyon_EventScript_ItemNugget:: finditem ITEM_NUGGET end ThreeIsland_BerryForest_EventScript_ItemMaxEther:: finditem ITEM_MAX_ETHER end ThreeIsland_BerryForest_EventScript_ItemFullHeal:: finditem ITEM_FULL_HEAL end ThreeIsland_BerryForest_EventScript_ItemMaxElixir:: finditem ITEM_MAX_ELIXIR end MtEmber_Exterior_EventScript_ItemUltraBall:: finditem ITEM_ULTRA_BALL end MtEmber_Exterior_EventScript_ItemFireStone:: finditem ITEM_FIRE_STONE end MtEmber_Exterior_EventScript_ItemDireHit:: finditem ITEM_DIRE_HIT end FourIsland_IcefallCave_1F_EventScript_ItemUltraBall:: finditem ITEM_ULTRA_BALL end FourIsland_IcefallCave_1F_EventScript_ItemHM07:: finditem ITEM_HM07 end FourIsland_IcefallCave_B1F_EventScript_ItemFullRestore:: finditem ITEM_FULL_RESTORE end FourIsland_IcefallCave_B1F_EventScript_ItemNeverMeltIce:: finditem ITEM_NEVER_MELT_ICE end FiveIsland_RocketWarehouse_EventScript_ItemBigPearl:: finditem ITEM_BIG_PEARL end FiveIsland_RocketWarehouse_EventScript_ItemTM36:: finditem ITEM_TM36 end FiveIsland_RocketWarehouse_EventScript_ItemPearl:: finditem ITEM_PEARL end FiveIsland_RocketWarehouse_EventScript_ItemUpGrade:: finditem ITEM_UP_GRADE end FiveIsland_LostCave_Room10_EventScript_ItemSilkScarf:: finditem ITEM_SILK_SCARF end FiveIsland_LostCave_Room11_EventScript_ItemLaxIncense:: finditem ITEM_LAX_INCENSE end FiveIsland_LostCave_Room12_EventScript_ItemSeaIncense:: finditem ITEM_SEA_INCENSE end FiveIsland_LostCave_Room13_EventScript_ItemMaxRevive:: finditem ITEM_MAX_REVIVE end FiveIsland_LostCave_Room14_EventScript_ItemRareCandy:: finditem ITEM_RARE_CANDY end SevenIsland_SevaultCanyon_House_EventScript_ItemLuckyPunch:: finditem ITEM_LUCKY_PUNCH end SilphCo_4F_EventScript_ItemTM41:: finditem ITEM_TM41 end SafariZone_NorthWest_EventScript_ItemKingsRock:: finditem ITEM_KINGS_ROCK end SafariZone_NorthWest_EventScript_ItemSunStone:: finditem ITEM_SUN_STONE end SafariZone_NorthWest_EventScript_ItemPPMax:: finditem ITEM_PP_MAX end SafariZone_NorthWest_EventScript_ItemRareCandy:: finditem ITEM_RARE_CANDY end SafariZone_NorthEast_EventScript_ItemMaxRevive:: finditem ITEM_MAX_REVIVE end SafariZone_NorthEast_EventScript_ItemWhiteHerb:: finditem ITEM_WHITE_HERB end SafariZone_NorthEast_EventScript_ItemGlitterMail:: finditem ITEM_GLITTER_MAIL end ArtisanCave_B1F_EventScript_ItemHPUp:: finditem ITEM_HP_UP end ArtisanCave_1F_EventScript_ItemCarbos:: finditem ITEM_CARBOS end ================================================ FILE: data/scripts/itemfinder.inc ================================================ EventScript_ItemfinderDigUpUnderfootItem:: lockall textcolor NPC_TEXT_COLOR_NEUTRAL waitse call EventScript_TryPickUpHiddenItem goto_if_eq VAR_0x8007, TRUE, EventScript_DigUpItemPutInPocket goto_if_eq VAR_0x8007, FALSE, EventScript_DigUpItemBagIsFull end EventScript_DigUpItemPutInPocket:: message Text_DugUpItemFromGround waitfanfare waitmessage delay 60 msgbox Text_PutItemAway special SetHiddenItemFlag releaseall end EventScript_DigUpItemBagIsFull:: msgbox Text_DugUpItemFromGround msgbox Text_TooBadBagFull setvar VAR_RESULT, 0 releaseall end ================================================ FILE: data/scripts/master_trainers.inc ================================================ .equ BEAUTY, 0 .equ LASS, 0 .equ SWIMMER, 0 .equ BIRD_KEEPER, 1 .equ COOLTRAINER, 1 .equ BLACK_BELT, 2 .equ HIKER, 2 .equ BUG_CATCHER, 3 .equ YOUNGSTER, 3 .equ PSYCHIC, 4 .equ SCIENTIST, 4 .equ TRAINER, VAR_0x8009 .equ CLASS, VAR_0x8006 .equ HAVE_TITLE, VAR_0x8007 MasterTrainer_EventScript_Bulbasaur:: bufferspeciesname STR_VAR_1, SPECIES_BULBASAUR setvar TRAINER, SPECIES_BULBASAUR setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_BULBASAUR, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_BULBASAUR, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_BULBASAUR goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Ivysaur:: bufferspeciesname STR_VAR_1, SPECIES_IVYSAUR setvar TRAINER, SPECIES_IVYSAUR setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_IVYSAUR, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_IVYSAUR, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_IVYSAUR goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Venusaur:: bufferspeciesname STR_VAR_1, SPECIES_VENUSAUR setvar TRAINER, SPECIES_VENUSAUR setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_VENUSAUR, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_VENUSAUR, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_VENUSAUR goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Charmander:: bufferspeciesname STR_VAR_1, SPECIES_CHARMANDER setvar TRAINER, SPECIES_CHARMANDER setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_CHARMANDER, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_CHARMANDER, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_CHARMANDER goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Charmeleon:: bufferspeciesname STR_VAR_1, SPECIES_CHARMELEON setvar TRAINER, SPECIES_CHARMELEON setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_CHARMELEON, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_CHARMELEON, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_CHARMELEON goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Charizard:: bufferspeciesname STR_VAR_1, SPECIES_CHARIZARD setvar TRAINER, SPECIES_CHARIZARD setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_CHARIZARD, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_CHARIZARD, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_CHARIZARD goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Squirtle:: bufferspeciesname STR_VAR_1, SPECIES_SQUIRTLE setvar TRAINER, SPECIES_SQUIRTLE setvar CLASS, BEAUTY setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SQUIRTLE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SQUIRTLE, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SQUIRTLE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Wartortle:: bufferspeciesname STR_VAR_1, SPECIES_WARTORTLE setvar TRAINER, SPECIES_WARTORTLE setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_WARTORTLE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_WARTORTLE, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_WARTORTLE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Blastoise:: bufferspeciesname STR_VAR_1, SPECIES_BLASTOISE setvar TRAINER, SPECIES_BLASTOISE setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_BLASTOISE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_BLASTOISE, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_BLASTOISE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Caterpie:: bufferspeciesname STR_VAR_1, SPECIES_CATERPIE setvar TRAINER, SPECIES_CATERPIE setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_CATERPIE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_CATERPIE, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_CATERPIE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Metapod:: bufferspeciesname STR_VAR_1, SPECIES_METAPOD setvar TRAINER, SPECIES_METAPOD setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_METAPOD, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_METAPOD, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_METAPOD goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Butterfree:: bufferspeciesname STR_VAR_1, SPECIES_BUTTERFREE setvar TRAINER, SPECIES_BUTTERFREE setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_BUTTERFREE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_BUTTERFREE, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_BUTTERFREE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Weedle:: bufferspeciesname STR_VAR_1, SPECIES_WEEDLE setvar TRAINER, SPECIES_WEEDLE setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_WEEDLE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_WEEDLE, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_WEEDLE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Kakuna:: bufferspeciesname STR_VAR_1, SPECIES_KAKUNA setvar TRAINER, SPECIES_KAKUNA setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_KAKUNA, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_KAKUNA, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_KAKUNA goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Beedrill:: bufferspeciesname STR_VAR_1, SPECIES_BEEDRILL setvar TRAINER, SPECIES_BEEDRILL setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_BEEDRILL, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_BEEDRILL, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_BEEDRILL goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Pidgey:: bufferspeciesname STR_VAR_1, SPECIES_PIDGEY setvar TRAINER, SPECIES_PIDGEY setvar CLASS, BIRD_KEEPER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PIDGEY, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PIDGEY, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PIDGEY goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Pidgeotto:: bufferspeciesname STR_VAR_1, SPECIES_PIDGEOTTO setvar TRAINER, SPECIES_PIDGEOTTO setvar CLASS, BIRD_KEEPER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PIDGEOTTO, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PIDGEOTTO, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PIDGEOTTO goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Pidgeot:: bufferspeciesname STR_VAR_1, SPECIES_PIDGEOT setvar TRAINER, SPECIES_PIDGEOT setvar CLASS, BIRD_KEEPER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PIDGEOT, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PIDGEOT, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PIDGEOT goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Rattata:: bufferspeciesname STR_VAR_1, SPECIES_RATTATA setvar TRAINER, SPECIES_RATTATA setvar CLASS, YOUNGSTER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_RATTATA, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_RATTATA, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_RATTATA goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Raticate:: bufferspeciesname STR_VAR_1, SPECIES_RATICATE setvar TRAINER, SPECIES_RATICATE setvar CLASS, YOUNGSTER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_RATICATE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_RATICATE, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_RATICATE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Spearow:: bufferspeciesname STR_VAR_1, SPECIES_SPEAROW setvar TRAINER, SPECIES_SPEAROW setvar CLASS, BIRD_KEEPER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SPEAROW, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SPEAROW, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SPEAROW goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Fearow:: bufferspeciesname STR_VAR_1, SPECIES_FEAROW setvar TRAINER, SPECIES_FEAROW setvar CLASS, BIRD_KEEPER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_FEAROW, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_FEAROW, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_FEAROW goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Ekans:: bufferspeciesname STR_VAR_1, SPECIES_EKANS setvar TRAINER, SPECIES_EKANS setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_EKANS, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_EKANS, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_EKANS goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Arbok:: bufferspeciesname STR_VAR_1, SPECIES_ARBOK setvar TRAINER, SPECIES_ARBOK setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ARBOK, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_ARBOK, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_ARBOK goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Pikachu:: bufferspeciesname STR_VAR_1, SPECIES_PIKACHU setvar TRAINER, SPECIES_PIKACHU setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PIKACHU, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PIKACHU, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PIKACHU goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Raichu:: bufferspeciesname STR_VAR_1, SPECIES_RAICHU setvar TRAINER, SPECIES_RAICHU setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_RAICHU, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_RAICHU, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_RAICHU goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Sandshrew:: bufferspeciesname STR_VAR_1, SPECIES_SANDSHREW setvar TRAINER, SPECIES_SANDSHREW setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SANDSHREW, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SANDSHREW, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SANDSHREW goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Sandslash:: bufferspeciesname STR_VAR_1, SPECIES_SANDSLASH setvar TRAINER, SPECIES_SANDSLASH setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SANDSLASH, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SANDSLASH, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SANDSLASH goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_NidoranF:: bufferspeciesname STR_VAR_1, SPECIES_NIDORAN_F setvar TRAINER, SPECIES_NIDORAN_F setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_NIDORAN_F, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_NIDORAN_F, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_NIDORAN_F goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Nidorina:: bufferspeciesname STR_VAR_1, SPECIES_NIDORINA setvar TRAINER, SPECIES_NIDORINA setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_NIDORINA, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_NIDORINA, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_NIDORINA goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Nidoqueen:: bufferspeciesname STR_VAR_1, SPECIES_NIDOQUEEN setvar TRAINER, SPECIES_NIDOQUEEN setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_NIDOQUEEN, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_NIDOQUEEN, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_NIDOQUEEN goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_NidoranM:: bufferspeciesname STR_VAR_1, SPECIES_NIDORAN_M setvar TRAINER, SPECIES_NIDORAN_M setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_NIDORAN_M, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_NIDORAN_M, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_NIDORAN_M goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Nidorino:: bufferspeciesname STR_VAR_1, SPECIES_NIDORINO setvar TRAINER, SPECIES_NIDORINO setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_NIDORINO, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_NIDORINO, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_NIDORINO goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Nidoking:: bufferspeciesname STR_VAR_1, SPECIES_NIDOKING setvar TRAINER, SPECIES_NIDOKING setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_NIDOKING, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_NIDOKING, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_NIDOKING goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Clefairy:: bufferspeciesname STR_VAR_1, SPECIES_CLEFAIRY setvar TRAINER, SPECIES_CLEFAIRY setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_CLEFAIRY, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_CLEFAIRY, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_CLEFAIRY goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Clefable:: bufferspeciesname STR_VAR_1, SPECIES_CLEFABLE setvar TRAINER, SPECIES_CLEFABLE setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_CLEFABLE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_CLEFABLE, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_CLEFABLE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Vulpix:: bufferspeciesname STR_VAR_1, SPECIES_VULPIX setvar TRAINER, SPECIES_VULPIX setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_VULPIX, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_VULPIX, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_VULPIX goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Ninetales:: bufferspeciesname STR_VAR_1, SPECIES_NINETALES setvar TRAINER, SPECIES_NINETALES setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_NINETALES, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_NINETALES, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_NINETALES goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Jigglypuff:: bufferspeciesname STR_VAR_1, SPECIES_JIGGLYPUFF setvar TRAINER, SPECIES_JIGGLYPUFF setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_JIGGLYPUFF, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_JIGGLYPUFF, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_JIGGLYPUFF goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Wigglytuff:: bufferspeciesname STR_VAR_1, SPECIES_WIGGLYTUFF setvar TRAINER, SPECIES_WIGGLYTUFF setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_WIGGLYTUFF, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_WIGGLYTUFF, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_WIGGLYTUFF goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Zubat:: bufferspeciesname STR_VAR_1, SPECIES_ZUBAT setvar TRAINER, SPECIES_ZUBAT setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ZUBAT, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_ZUBAT, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_ZUBAT goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Golbat:: bufferspeciesname STR_VAR_1, SPECIES_GOLBAT setvar TRAINER, SPECIES_GOLBAT setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GOLBAT, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GOLBAT, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GOLBAT goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Oddish:: bufferspeciesname STR_VAR_1, SPECIES_ODDISH setvar TRAINER, SPECIES_ODDISH setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ODDISH, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_ODDISH, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_ODDISH goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Gloom:: bufferspeciesname STR_VAR_1, SPECIES_GLOOM setvar TRAINER, SPECIES_GLOOM setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GLOOM, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GLOOM, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GLOOM goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Vileplume:: bufferspeciesname STR_VAR_1, SPECIES_VILEPLUME setvar TRAINER, SPECIES_VILEPLUME setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_VILEPLUME, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_VILEPLUME, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_VILEPLUME goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Paras:: bufferspeciesname STR_VAR_1, SPECIES_PARAS setvar TRAINER, SPECIES_PARAS setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PARAS, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PARAS, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PARAS goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Parasect:: bufferspeciesname STR_VAR_1, SPECIES_PARASECT setvar TRAINER, SPECIES_PARASECT setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PARASECT, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PARASECT, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PARASECT goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Venonat:: bufferspeciesname STR_VAR_1, SPECIES_VENONAT setvar TRAINER, SPECIES_VENONAT setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_VENONAT, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_VENONAT, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_VENONAT goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Venomoth:: bufferspeciesname STR_VAR_1, SPECIES_VENOMOTH setvar TRAINER, SPECIES_VENOMOTH setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_VENOMOTH, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_VENOMOTH, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_VENOMOTH goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Diglett:: bufferspeciesname STR_VAR_1, SPECIES_DIGLETT setvar TRAINER, SPECIES_DIGLETT setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DIGLETT, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_DIGLETT, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_DIGLETT goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Dugtrio:: bufferspeciesname STR_VAR_1, SPECIES_DUGTRIO setvar TRAINER, SPECIES_DUGTRIO setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DUGTRIO, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_DUGTRIO, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_DUGTRIO goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Meowth:: bufferspeciesname STR_VAR_1, SPECIES_MEOWTH setvar TRAINER, SPECIES_MEOWTH setvar CLASS, YOUNGSTER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MEOWTH, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MEOWTH, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MEOWTH goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Persian:: bufferspeciesname STR_VAR_1, SPECIES_PERSIAN setvar TRAINER, SPECIES_PERSIAN setvar CLASS, YOUNGSTER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PERSIAN, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PERSIAN, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PERSIAN goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Psyduck:: bufferspeciesname STR_VAR_1, SPECIES_PSYDUCK setvar TRAINER, SPECIES_PSYDUCK setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PSYDUCK, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PSYDUCK, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PSYDUCK goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Golduck:: bufferspeciesname STR_VAR_1, SPECIES_GOLDUCK setvar TRAINER, SPECIES_GOLDUCK setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GOLDUCK, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GOLDUCK, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GOLDUCK goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Mankey:: bufferspeciesname STR_VAR_1, SPECIES_MANKEY setvar TRAINER, SPECIES_MANKEY setvar CLASS, BLACK_BELT setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MANKEY, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MANKEY, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MANKEY goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Primeape:: bufferspeciesname STR_VAR_1, SPECIES_PRIMEAPE setvar TRAINER, SPECIES_PRIMEAPE setvar CLASS, BLACK_BELT setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PRIMEAPE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PRIMEAPE, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PRIMEAPE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Growlithe:: bufferspeciesname STR_VAR_1, SPECIES_GROWLITHE setvar TRAINER, SPECIES_GROWLITHE setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GROWLITHE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GROWLITHE, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GROWLITHE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Arcanine:: bufferspeciesname STR_VAR_1, SPECIES_ARCANINE setvar TRAINER, SPECIES_ARCANINE setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ARCANINE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_ARCANINE, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_ARCANINE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Poliwag:: bufferspeciesname STR_VAR_1, SPECIES_POLIWAG setvar TRAINER, SPECIES_POLIWAG setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_POLIWAG, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_POLIWAG, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_POLIWAG goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Poliwhirl:: bufferspeciesname STR_VAR_1, SPECIES_POLIWHIRL setvar TRAINER, SPECIES_POLIWHIRL setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_POLIWHIRL, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_POLIWHIRL, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_POLIWHIRL goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Poliwrath:: bufferspeciesname STR_VAR_1, SPECIES_POLIWRATH setvar TRAINER, SPECIES_POLIWRATH setvar CLASS, BLACK_BELT setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_POLIWRATH, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_POLIWRATH, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_POLIWRATH goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Abra:: bufferspeciesname STR_VAR_1, SPECIES_ABRA setvar TRAINER, SPECIES_ABRA setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ABRA, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_ABRA, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_ABRA goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Kadabra:: bufferspeciesname STR_VAR_1, SPECIES_KADABRA setvar TRAINER, SPECIES_KADABRA setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_KADABRA, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_KADABRA, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_KADABRA goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Alakazam:: bufferspeciesname STR_VAR_1, SPECIES_ALAKAZAM setvar TRAINER, SPECIES_ALAKAZAM setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ALAKAZAM, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_ALAKAZAM, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_ALAKAZAM goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Machop:: bufferspeciesname STR_VAR_1, SPECIES_MACHOP setvar TRAINER, SPECIES_MACHOP setvar CLASS, BLACK_BELT setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MACHOP, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MACHOP, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MACHOP goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Machoke:: bufferspeciesname STR_VAR_1, SPECIES_MACHOKE setvar TRAINER, SPECIES_MACHOKE setvar CLASS, BLACK_BELT setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MACHOKE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MACHOKE, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MACHOKE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Machamp:: bufferspeciesname STR_VAR_1, SPECIES_MACHAMP setvar TRAINER, SPECIES_MACHAMP setvar CLASS, BLACK_BELT setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MACHAMP, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MACHAMP, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MACHAMP goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Bellsprout:: bufferspeciesname STR_VAR_1, SPECIES_BELLSPROUT setvar TRAINER, SPECIES_BELLSPROUT setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_BELLSPROUT, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_BELLSPROUT, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_BELLSPROUT goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Weepinbell:: bufferspeciesname STR_VAR_1, SPECIES_WEEPINBELL setvar TRAINER, SPECIES_WEEPINBELL setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_WEEPINBELL, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_WEEPINBELL, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_WEEPINBELL goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Victreebel:: bufferspeciesname STR_VAR_1, SPECIES_VICTREEBEL setvar TRAINER, SPECIES_VICTREEBEL setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_VICTREEBEL, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_VICTREEBEL, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_VICTREEBEL goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Tentacool:: bufferspeciesname STR_VAR_1, SPECIES_TENTACOOL setvar TRAINER, SPECIES_TENTACOOL setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_TENTACOOL, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_TENTACOOL, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_TENTACOOL goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Tentacruel:: bufferspeciesname STR_VAR_1, SPECIES_TENTACRUEL setvar TRAINER, SPECIES_TENTACRUEL setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_TENTACRUEL, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_TENTACRUEL, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_TENTACRUEL goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Geodude:: bufferspeciesname STR_VAR_1, SPECIES_GEODUDE setvar TRAINER, SPECIES_GEODUDE setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GEODUDE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GEODUDE, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GEODUDE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Graveler:: bufferspeciesname STR_VAR_1, SPECIES_GRAVELER setvar TRAINER, SPECIES_GRAVELER setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GRAVELER, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GRAVELER, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GRAVELER goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Golem:: bufferspeciesname STR_VAR_1, SPECIES_GOLEM setvar TRAINER, SPECIES_GOLEM setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GOLEM, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GOLEM, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GOLEM goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Ponyta:: bufferspeciesname STR_VAR_1, SPECIES_PONYTA setvar TRAINER, SPECIES_PONYTA setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PONYTA, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PONYTA, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PONYTA goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Rapidash:: bufferspeciesname STR_VAR_1, SPECIES_RAPIDASH setvar TRAINER, SPECIES_RAPIDASH setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_RAPIDASH, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_RAPIDASH, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_RAPIDASH goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Slowpoke:: bufferspeciesname STR_VAR_1, SPECIES_SLOWPOKE setvar TRAINER, SPECIES_SLOWPOKE setvar CLASS, BEAUTY setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SLOWPOKE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SLOWPOKE, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SLOWPOKE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Slowbro:: bufferspeciesname STR_VAR_1, SPECIES_SLOWBRO setvar TRAINER, SPECIES_SLOWBRO setvar CLASS, BEAUTY setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SLOWBRO, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SLOWBRO, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SLOWBRO goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Magnemite:: bufferspeciesname STR_VAR_1, SPECIES_MAGNEMITE setvar TRAINER, SPECIES_MAGNEMITE setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MAGNEMITE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MAGNEMITE, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MAGNEMITE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Magneton:: bufferspeciesname STR_VAR_1, SPECIES_MAGNETON setvar TRAINER, SPECIES_MAGNETON setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MAGNETON, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MAGNETON, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MAGNETON goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Farfetchd:: bufferspeciesname STR_VAR_1, SPECIES_FARFETCHD setvar TRAINER, SPECIES_FARFETCHD setvar CLASS, BIRD_KEEPER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_FARFETCHD, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_FARFETCHD, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_FARFETCHD goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Doduo:: bufferspeciesname STR_VAR_1, SPECIES_DODUO setvar TRAINER, SPECIES_DODUO setvar CLASS, BIRD_KEEPER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DODUO, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_DODUO, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_DODUO goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Dodrio:: bufferspeciesname STR_VAR_1, SPECIES_DODRIO setvar TRAINER, SPECIES_DODRIO setvar CLASS, BIRD_KEEPER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DODRIO, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_DODRIO, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_DODRIO goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Seel:: bufferspeciesname STR_VAR_1, SPECIES_SEEL setvar TRAINER, SPECIES_SEEL setvar CLASS, BEAUTY setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SEEL, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SEEL, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SEEL goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Dewgong:: bufferspeciesname STR_VAR_1, SPECIES_DEWGONG setvar TRAINER, SPECIES_DEWGONG setvar CLASS, BEAUTY setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DEWGONG, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_DEWGONG, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_DEWGONG goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Grimer:: bufferspeciesname STR_VAR_1, SPECIES_GRIMER setvar TRAINER, SPECIES_GRIMER setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GRIMER, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GRIMER, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GRIMER goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Muk:: bufferspeciesname STR_VAR_1, SPECIES_MUK setvar TRAINER, SPECIES_MUK setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MUK, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MUK, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MUK goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Shellder:: bufferspeciesname STR_VAR_1, SPECIES_SHELLDER setvar TRAINER, SPECIES_SHELLDER setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SHELLDER, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SHELLDER, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SHELLDER goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Cloyster:: bufferspeciesname STR_VAR_1, SPECIES_CLOYSTER setvar TRAINER, SPECIES_CLOYSTER setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_CLOYSTER, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_CLOYSTER, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_CLOYSTER goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Gastly:: bufferspeciesname STR_VAR_1, SPECIES_GASTLY setvar TRAINER, SPECIES_GASTLY setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GASTLY, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GASTLY, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GASTLY goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Haunter:: bufferspeciesname STR_VAR_1, SPECIES_HAUNTER setvar TRAINER, SPECIES_HAUNTER setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_HAUNTER, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_HAUNTER, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_HAUNTER goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Gengar:: bufferspeciesname STR_VAR_1, SPECIES_GENGAR setvar TRAINER, SPECIES_GENGAR setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GENGAR, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GENGAR, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GENGAR goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Onix:: bufferspeciesname STR_VAR_1, SPECIES_ONIX setvar TRAINER, SPECIES_ONIX setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ONIX, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_ONIX, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_ONIX goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Drowzee:: bufferspeciesname STR_VAR_1, SPECIES_DROWZEE setvar TRAINER, SPECIES_DROWZEE setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DROWZEE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_DROWZEE, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_DROWZEE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Hypno:: bufferspeciesname STR_VAR_1, SPECIES_HYPNO setvar TRAINER, SPECIES_HYPNO setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_HYPNO, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_HYPNO, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_HYPNO goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Krabby:: bufferspeciesname STR_VAR_1, SPECIES_KRABBY setvar TRAINER, SPECIES_KRABBY setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_KRABBY, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_KRABBY, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_KRABBY goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Kingler:: bufferspeciesname STR_VAR_1, SPECIES_KINGLER setvar TRAINER, SPECIES_KINGLER setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_KINGLER, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_KINGLER, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_KINGLER goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Voltorb:: bufferspeciesname STR_VAR_1, SPECIES_VOLTORB setvar TRAINER, SPECIES_VOLTORB setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_VOLTORB, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_VOLTORB, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_VOLTORB goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Electrode:: bufferspeciesname STR_VAR_1, SPECIES_ELECTRODE setvar TRAINER, SPECIES_ELECTRODE setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ELECTRODE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_ELECTRODE, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_ELECTRODE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Exeggcute:: bufferspeciesname STR_VAR_1, SPECIES_EXEGGCUTE setvar TRAINER, SPECIES_EXEGGCUTE setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_EXEGGCUTE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_EXEGGCUTE, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_EXEGGCUTE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Exeggutor:: bufferspeciesname STR_VAR_1, SPECIES_EXEGGUTOR setvar TRAINER, SPECIES_EXEGGUTOR setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_EXEGGUTOR, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_EXEGGUTOR, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_EXEGGUTOR goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Cubone:: bufferspeciesname STR_VAR_1, SPECIES_CUBONE setvar TRAINER, SPECIES_CUBONE setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_CUBONE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_CUBONE, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_CUBONE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Marowak:: bufferspeciesname STR_VAR_1, SPECIES_MAROWAK setvar TRAINER, SPECIES_MAROWAK setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MAROWAK, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MAROWAK, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MAROWAK goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Hitmonlee:: bufferspeciesname STR_VAR_1, SPECIES_HITMONLEE setvar TRAINER, SPECIES_HITMONLEE setvar CLASS, BLACK_BELT setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_HITMONLEE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_HITMONLEE, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_HITMONLEE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Hitmonchan:: bufferspeciesname STR_VAR_1, SPECIES_HITMONCHAN setvar TRAINER, SPECIES_HITMONCHAN setvar CLASS, BLACK_BELT setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_HITMONCHAN, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_HITMONCHAN, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_HITMONCHAN goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Lickitung:: bufferspeciesname STR_VAR_1, SPECIES_LICKITUNG setvar TRAINER, SPECIES_LICKITUNG setvar CLASS, YOUNGSTER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_LICKITUNG, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_LICKITUNG, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_LICKITUNG goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Koffing:: bufferspeciesname STR_VAR_1, SPECIES_KOFFING setvar TRAINER, SPECIES_KOFFING setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_KOFFING, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_KOFFING, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_KOFFING goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Weezing:: bufferspeciesname STR_VAR_1, SPECIES_WEEZING setvar TRAINER, SPECIES_WEEZING setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_WEEZING, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_WEEZING, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_WEEZING goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Rhyhorn:: bufferspeciesname STR_VAR_1, SPECIES_RHYHORN setvar TRAINER, SPECIES_RHYHORN setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_RHYHORN, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_RHYHORN, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_RHYHORN goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Rhydon:: bufferspeciesname STR_VAR_1, SPECIES_RHYDON setvar TRAINER, SPECIES_RHYDON setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_RHYDON, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_RHYDON, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_RHYDON goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Chansey:: bufferspeciesname STR_VAR_1, SPECIES_CHANSEY setvar TRAINER, SPECIES_CHANSEY setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_CHANSEY, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_CHANSEY, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_CHANSEY goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Tangela:: bufferspeciesname STR_VAR_1, SPECIES_TANGELA setvar TRAINER, SPECIES_TANGELA setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_TANGELA, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_TANGELA, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_TANGELA goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Kangaskhan:: bufferspeciesname STR_VAR_1, SPECIES_KANGASKHAN setvar TRAINER, SPECIES_KANGASKHAN setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_KANGASKHAN, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_KANGASKHAN, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_KANGASKHAN goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Horsea:: bufferspeciesname STR_VAR_1, SPECIES_HORSEA setvar TRAINER, SPECIES_HORSEA setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_HORSEA, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_HORSEA, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_HORSEA goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Seadra:: bufferspeciesname STR_VAR_1, SPECIES_SEADRA setvar TRAINER, SPECIES_SEADRA setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SEADRA, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SEADRA, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SEADRA goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Goldeen:: bufferspeciesname STR_VAR_1, SPECIES_GOLDEEN setvar TRAINER, SPECIES_GOLDEEN setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GOLDEEN, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GOLDEEN, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GOLDEEN goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Seaking:: bufferspeciesname STR_VAR_1, SPECIES_SEAKING setvar TRAINER, SPECIES_SEAKING setvar CLASS, SWIMMER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SEAKING, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SEAKING, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SEAKING goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Staryu:: bufferspeciesname STR_VAR_1, SPECIES_STARYU setvar TRAINER, SPECIES_STARYU setvar CLASS, BEAUTY setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_STARYU, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_STARYU, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_STARYU goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Starmie:: bufferspeciesname STR_VAR_1, SPECIES_STARMIE setvar TRAINER, SPECIES_STARMIE setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_STARMIE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_STARMIE, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_STARMIE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_MrMime:: bufferspeciesname STR_VAR_1, SPECIES_MR_MIME setvar TRAINER, SPECIES_MR_MIME setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MR_MIME, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MR_MIME, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MR_MIME goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Scyther:: bufferspeciesname STR_VAR_1, SPECIES_SCYTHER setvar TRAINER, SPECIES_SCYTHER setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SCYTHER, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SCYTHER, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SCYTHER goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Jynx:: bufferspeciesname STR_VAR_1, SPECIES_JYNX setvar TRAINER, SPECIES_JYNX setvar CLASS, PSYCHIC setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_JYNX, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_JYNX, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_JYNX goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Electabuzz:: bufferspeciesname STR_VAR_1, SPECIES_ELECTABUZZ setvar TRAINER, SPECIES_ELECTABUZZ setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ELECTABUZZ, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_ELECTABUZZ, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_ELECTABUZZ goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Magmar:: bufferspeciesname STR_VAR_1, SPECIES_MAGMAR setvar TRAINER, SPECIES_MAGMAR setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MAGMAR, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MAGMAR, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MAGMAR goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Pinsir:: bufferspeciesname STR_VAR_1, SPECIES_PINSIR setvar TRAINER, SPECIES_PINSIR setvar CLASS, BUG_CATCHER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PINSIR, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PINSIR, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PINSIR goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Tauros:: bufferspeciesname STR_VAR_1, SPECIES_TAUROS setvar TRAINER, SPECIES_TAUROS setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_TAUROS, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_TAUROS, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_TAUROS goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Magikarp:: bufferspeciesname STR_VAR_1, SPECIES_MAGIKARP setvar TRAINER, SPECIES_MAGIKARP setvar CLASS, YOUNGSTER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MAGIKARP, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_MAGIKARP, Text_BugCatcherYoungster_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_MAGIKARP goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Gyarados:: bufferspeciesname STR_VAR_1, SPECIES_GYARADOS setvar TRAINER, SPECIES_GYARADOS setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_GYARADOS, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_GYARADOS, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_GYARADOS goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Lapras:: bufferspeciesname STR_VAR_1, SPECIES_LAPRAS setvar TRAINER, SPECIES_LAPRAS setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_LAPRAS, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_LAPRAS, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_LAPRAS goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Ditto:: bufferspeciesname STR_VAR_1, SPECIES_DITTO setvar TRAINER, SPECIES_DITTO setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DITTO, MasterTrainer_EventScript_HaveTitleNoBattle call MasterTrainer_EventScript_NoBattleContinue settrainerflag MASTER_DITTO clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_Eevee:: bufferspeciesname STR_VAR_1, SPECIES_EEVEE setvar TRAINER, SPECIES_EEVEE setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_EEVEE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_EEVEE, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_EEVEE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Vaporeon:: bufferspeciesname STR_VAR_1, SPECIES_VAPOREON setvar TRAINER, SPECIES_VAPOREON setvar CLASS, LASS setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_VAPOREON, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_VAPOREON, Text_BeautyLass_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_VAPOREON goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Jolteon:: bufferspeciesname STR_VAR_1, SPECIES_JOLTEON setvar TRAINER, SPECIES_JOLTEON setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_JOLTEON, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_JOLTEON, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_JOLTEON goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Flareon:: bufferspeciesname STR_VAR_1, SPECIES_FLAREON setvar TRAINER, SPECIES_FLAREON setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_FLAREON, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_FLAREON, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_FLAREON goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Porygon:: bufferspeciesname STR_VAR_1, SPECIES_PORYGON setvar TRAINER, SPECIES_PORYGON setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_PORYGON, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_PORYGON, Text_PsychicScientist_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_PORYGON goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Omanyte:: bufferspeciesname STR_VAR_1, SPECIES_OMANYTE setvar TRAINER, SPECIES_OMANYTE setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_OMANYTE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_OMANYTE, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_OMANYTE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Omastar:: bufferspeciesname STR_VAR_1, SPECIES_OMASTAR setvar TRAINER, SPECIES_OMASTAR setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_OMASTAR, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_OMASTAR, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_OMASTAR goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Kabuto:: bufferspeciesname STR_VAR_1, SPECIES_KABUTO setvar TRAINER, SPECIES_KABUTO setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_KABUTO, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_KABUTO, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_KABUTO goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Kabutops:: bufferspeciesname STR_VAR_1, SPECIES_KABUTOPS setvar TRAINER, SPECIES_KABUTOPS setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_KABUTOPS, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_KABUTOPS, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_KABUTOPS goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Aerodactyl:: bufferspeciesname STR_VAR_1, SPECIES_AERODACTYL setvar TRAINER, SPECIES_AERODACTYL setvar CLASS, HIKER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_AERODACTYL, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_AERODACTYL, Text_BlackBeltHiker_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_AERODACTYL goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Snorlax:: bufferspeciesname STR_VAR_1, SPECIES_SNORLAX setvar TRAINER, SPECIES_SNORLAX setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_SNORLAX, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_SNORLAX, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_SNORLAX goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Articuno:: bufferspeciesname STR_VAR_1, SPECIES_ARTICUNO setvar TRAINER, SPECIES_ARTICUNO setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ARTICUNO, MasterTrainer_EventScript_HaveTitleNoBattle call MasterTrainer_EventScript_NoBattleContinue settrainerflag MASTER_ARTICUNO clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_Zapdos:: bufferspeciesname STR_VAR_1, SPECIES_ZAPDOS setvar TRAINER, SPECIES_ZAPDOS setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_ZAPDOS, MasterTrainer_EventScript_HaveTitleNoBattle call MasterTrainer_EventScript_NoBattleContinue settrainerflag MASTER_ZAPDOS clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_Moltres:: bufferspeciesname STR_VAR_1, SPECIES_MOLTRES setvar TRAINER, SPECIES_MOLTRES setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MOLTRES, MasterTrainer_EventScript_HaveTitleNoBattle call MasterTrainer_EventScript_NoBattleContinue settrainerflag MASTER_MOLTRES clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_Dratini:: bufferspeciesname STR_VAR_1, SPECIES_DRATINI setvar TRAINER, SPECIES_DRATINI setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DRATINI, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_DRATINI, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_DRATINI goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Dragonair:: bufferspeciesname STR_VAR_1, SPECIES_DRAGONAIR setvar TRAINER, SPECIES_DRAGONAIR setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DRAGONAIR, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_DRAGONAIR, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_DRAGONAIR goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Dragonite:: bufferspeciesname STR_VAR_1, SPECIES_DRAGONITE setvar TRAINER, SPECIES_DRAGONITE setvar CLASS, COOLTRAINER setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_DRAGONITE, MasterTrainer_EventScript_HaveTitle call MasterTrainer_EventScript_DetermineScript trainerbattle_no_intro MASTER_DRAGONITE, Text_BirdKeeperCooltrainer_BattleLoss bufferspeciesname STR_VAR_1, SPECIES_DRAGONITE goto MasterTrainer_EventScript_DetermineContinueScript MasterTrainer_EventScript_Mewtwo:: bufferspeciesname STR_VAR_1, SPECIES_MEWTWO setvar TRAINER, SPECIES_MEWTWO setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MEWTWO, MasterTrainer_EventScript_HaveTitleNoBattle call MasterTrainer_EventScript_NoBattleContinue settrainerflag MASTER_MEWTWO clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_Mew:: bufferspeciesname STR_VAR_1, SPECIES_MEW setvar TRAINER, SPECIES_MEW setvar CLASS, SCIENTIST setflag FLAG_MASTER_TRAINER_BATTLE setvar HAVE_TITLE, FALSE call_if_defeated MASTER_MEW, MasterTrainer_EventScript_HaveTitleNoBattle call MasterTrainer_EventScript_NoBattleContinue settrainerflag MASTER_MEW clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_HaveTitle: setvar HAVE_TITLE, TRUE return MasterTrainer_EventScript_HaveTitleNoBattle: msgbox Text_Scientist_HaveTitleNoBattle MSGBOX_NPC clearflag FLAG_MASTER_TRAINER_BATTLE end Text_Scientist_HaveTitleNoBattle: .string "Oh, good to see you again.\n" .string "How's your {STR_VAR_1} doing?$" MasterTrainer_EventScript_DetermineScript: lock switch CLASS case BEAUTY, MasterTrainer_EventScript_BeautyLass case BIRD_KEEPER, MasterTrainer_EventScript_BirdKeeperCooltrainer case BLACK_BELT, MasterTrainer_EventScript_BlackBeltHiker case BUG_CATCHER, MasterTrainer_EventScript_BugCatcherYoungster case PSYCHIC, MasterTrainer_EventScript_PsychicScientist return MasterTrainer_EventScript_DetermineContinueScript: switch CLASS case BEAUTY, MasterTrainer_EventScript_BeautyLassContinue case BIRD_KEEPER, MasterTrainer_EventScript_BirdKeeperCooltrainerContinue case BLACK_BELT, MasterTrainer_EventScript_BlackBeltHikerContinue case BUG_CATCHER, MasterTrainer_EventScript_BugCatcherYoungsterContinue case PSYCHIC, MasterTrainer_EventScript_PsychicScientistContinue end MasterTrainer_EventScript_BeautyLass: faceplayer msgbox Text_BeautyLass_Intro, MSGBOX_DEFAULT callnative CheckMasterPokemonInSlot1 compare VAR_RESULT, TRUE goto_if_ne MasterTrainer_EventScript_BeautyLass_NoMon compare HAVE_TITLE, TRUE call_if_eq MasterTrainer_EventScript_BeautyLass_HaveTitleAskBattle compare HAVE_TITLE, FALSE call_if_eq MasterTrainer_EventScript_BeautyLass_AskBattle return MasterTrainer_EventScript_BirdKeeperCooltrainer: faceplayer msgbox Text_BirdKeeperCooltrainer_Intro, MSGBOX_DEFAULT callnative CheckMasterPokemonInSlot1 compare VAR_RESULT, TRUE goto_if_ne MasterTrainer_EventScript_BirdKeeperCooltrainer_NoMon compare HAVE_TITLE, TRUE call_if_eq MasterTrainer_EventScript_BirdKeeperCooltrainer_HaveTitleAskBattle compare HAVE_TITLE, FALSE call_if_eq MasterTrainer_EventScript_BirdKeeperCooltrainer_AskBattle return MasterTrainer_EventScript_BugCatcherYoungster: faceplayer msgbox Text_BugCatcherYoungster_Intro, MSGBOX_DEFAULT callnative CheckMasterPokemonInSlot1 compare VAR_RESULT, TRUE goto_if_ne MasterTrainer_EventScript_BugCatcherYoungster_NoMon compare HAVE_TITLE, TRUE call_if_eq MasterTrainer_EventScript_BugCatcherYoungster_HaveTitleAskBattle compare HAVE_TITLE, FALSE call_if_eq MasterTrainer_EventScript_BugCatcherYoungster_AskBattle return MasterTrainer_EventScript_PsychicScientist: faceplayer msgbox Text_PsychicScientist_Intro, MSGBOX_DEFAULT callnative CheckMasterPokemonInSlot1 compare VAR_RESULT, TRUE goto_if_ne MasterTrainer_EventScript_PsychicScientist_NoMon compare HAVE_TITLE, TRUE call_if_eq MasterTrainer_EventScript_PsychicScientist_HaveTitleAskBattle compare HAVE_TITLE, FALSE call_if_eq MasterTrainer_EventScript_PsychicScientist_AskBattle return MasterTrainer_EventScript_BlackBeltHiker: faceplayer msgbox Text_BlackBeltHiker_Intro, MSGBOX_DEFAULT callnative CheckMasterPokemonInSlot1 compare VAR_RESULT, TRUE goto_if_ne MasterTrainer_EventScript_BlackBeltHiker_NoMon compare HAVE_TITLE, TRUE call_if_eq MasterTrainer_EventScript_BlackBeltHiker_HaveTitleAskBattle compare HAVE_TITLE, FALSE call_if_eq MasterTrainer_EventScript_BlackBeltHiker_AskBattle return MasterTrainer_EventScript_BeautyLassContinue: special LoadPlayerParty specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_LOST goto_if_eq MasterTrainer_EventScript_BeautyLass_LostBattle compare VAR_RESULT, B_OUTCOME_DREW goto_if_eq MasterTrainer_EventScript_BeautyLass_LostBattle compare HAVE_TITLE, TRUE goto_if_ne MasterTrainer_EventScript_BeautyLass_ConferTitle msgbox Text_BeautyLass_AfterBattleWon, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_BirdKeeperCooltrainerContinue: special LoadPlayerParty specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_LOST goto_if_eq MasterTrainer_EventScript_BirdKeeperCooltrainer_LostBattle compare VAR_RESULT, B_OUTCOME_DREW goto_if_eq MasterTrainer_EventScript_BirdKeeperCooltrainer_LostBattle compare HAVE_TITLE, TRUE goto_if_ne MasterTrainer_EventScript_BirdKeeperCooltrainer_ConferTitle msgbox Text_BirdKeeperCooltrainer_AfterBattleWon, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_BugCatcherYoungsterContinue: special LoadPlayerParty specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_LOST goto_if_eq MasterTrainer_EventScript_BugCatcherYoungster_LostBattle compare VAR_RESULT, B_OUTCOME_DREW goto_if_eq MasterTrainer_EventScript_BugCatcherYoungster_LostBattle compare HAVE_TITLE, TRUE goto_if_ne MasterTrainer_EventScript_BugCatcherYoungster_ConferTitle msgbox Text_BugCatcherYoungster_AfterBattleWon, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_PsychicScientistContinue: special LoadPlayerParty specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_LOST goto_if_eq MasterTrainer_EventScript_PsychicScientist_LostBattle compare VAR_RESULT, B_OUTCOME_DREW goto_if_eq MasterTrainer_EventScript_PsychicScientist_LostBattle compare HAVE_TITLE, TRUE goto_if_ne MasterTrainer_EventScript_PsychicScientist_ConferTitle msgbox Text_PsychicScientist_AfterBattleWon, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_BlackBeltHikerContinue: special LoadPlayerParty specialvar VAR_RESULT, GetBattleOutcome compare VAR_RESULT, B_OUTCOME_LOST goto_if_eq MasterTrainer_EventScript_BlackBeltHiker_LostBattle compare VAR_RESULT, B_OUTCOME_DREW goto_if_eq MasterTrainer_EventScript_BlackBeltHiker_LostBattle compare HAVE_TITLE, TRUE goto_if_ne MasterTrainer_EventScript_BlackBeltHiker_ConferTitle msgbox Text_BlackBeltHiker_AfterBattleWon, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE release end MasterTrainer_EventScript_BeautyLass_NoMon: msgbox Text_BeautyLass_NoMon, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BirdKeeperCooltrainer_NoMon: msgbox Text_BirdKeeperCooltrainer_NoMon, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BugCatcherYoungster_NoMon: msgbox Text_BugCatcherYoungster_NoMon, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_PsychicScientist_NoMon: msgbox Text_PsychicScientist_NoMon, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BlackBeltHiker_NoMon: msgbox Text_BlackBeltHiker_NoMon, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BeautyLass_HaveTitleAskBattle: msgbox Text_BeautyLass_HaveTitleAskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_BeautyLass_DeclinedBattle msgbox Text_BeautyLass_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_BirdKeeperCooltrainer_HaveTitleAskBattle: msgbox Text_BirdKeeperCooltrainer_HaveTitleAskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_BirdKeeperCooltrainer_DeclinedBattle msgbox Text_BirdKeeperCooltrainer_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_BugCatcherYoungster_HaveTitleAskBattle: msgbox Text_BugCatcherYoungster_HaveTitleAskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_BugCatcherYoungster_DeclinedBattle msgbox Text_BugCatcherYoungster_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_PsychicScientist_HaveTitleAskBattle: msgbox Text_PsychicScientist_HaveTitleAskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_PsychicScientist_DeclinedBattle msgbox Text_PsychicScientist_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_BlackBeltHiker_HaveTitleAskBattle: msgbox Text_BlackBeltHiker_HaveTitleAskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_BlackBeltHiker_DeclinedBattle msgbox Text_BlackBeltHiker_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_BeautyLass_AskBattle: msgbox Text_BeautyLass_AskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_BeautyLass_DeclinedBattle msgbox Text_BeautyLass_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_BirdKeeperCooltrainer_AskBattle: msgbox Text_BirdKeeperCooltrainer_AskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_BirdKeeperCooltrainer_DeclinedBattle msgbox Text_BirdKeeperCooltrainer_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_BugCatcherYoungster_AskBattle: msgbox Text_BugCatcherYoungster_AskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_BugCatcherYoungster_DeclinedBattle msgbox Text_BugCatcherYoungster_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_PsychicScientist_AskBattle: msgbox Text_PsychicScientist_AskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_PsychicScientist_DeclinedBattle msgbox Text_PsychicScientist_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_BlackBeltHiker_AskBattle: msgbox Text_BlackBeltHiker_AskBattle, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_ne MasterTrainer_EventScript_BlackBeltHiker_DeclinedBattle msgbox Text_BlackBeltHiker_AcceptedBattle, MSGBOX_DEFAULT special SavePlayerParty callnative ClearAllButFirstPokemon callnative HealPlayerPartyOak return MasterTrainer_EventScript_BeautyLass_DeclinedBattle: msgbox Text_BeautyLass_DeclinedBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BirdKeeperCooltrainer_DeclinedBattle: msgbox Text_BirdKeeperCooltrainer_DeclinedBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BugCatcherYoungster_DeclinedBattle: msgbox Text_BugCatcherYoungster_DeclinedBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_PsychicScientist_DeclinedBattle: msgbox Text_PsychicScientist_DeclinedBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BlackBeltHiker_DeclinedBattle: msgbox Text_BlackBeltHiker_DeclinedBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BeautyLass_LostBattle: msgbox Text_BeautyLass_LostBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BirdKeeperCooltrainer_LostBattle: msgbox Text_BirdKeeperCooltrainer_LostBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BugCatcherYoungster_LostBattle: msgbox Text_BugCatcherYoungster_LostBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_PsychicScientist_LostBattle: msgbox Text_PsychicScientist_LostBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BlackBeltHiker_LostBattle: msgbox Text_BlackBeltHiker_LostBattle, MSGBOX_DEFAULT release clearflag FLAG_MASTER_TRAINER_BATTLE end MasterTrainer_EventScript_BeautyLass_ConferTitle: msgbox Text_BeautyLass_GiveTitle, MSGBOX_DEFAULT message Text_MasterTrainer_EarnTitle waitmessage playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress msgbox Text_BeautyLass_AnotherBattleSometime, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE resetobjectmovementtype VAR_LAST_TALKED release end MasterTrainer_EventScript_BirdKeeperCooltrainer_ConferTitle: msgbox Text_BirdKeeperCooltrainer_GiveTitle, MSGBOX_DEFAULT message Text_MasterTrainer_EarnTitle waitmessage playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress msgbox Text_BirdKeeperCooltrainer_AnotherBattleSometime, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE resetobjectmovementtype VAR_LAST_TALKED release end MasterTrainer_EventScript_BugCatcherYoungster_ConferTitle: msgbox Text_BugCatcherYoungster_GiveTitle, MSGBOX_DEFAULT message Text_MasterTrainer_EarnTitle waitmessage playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress msgbox Text_BugCatcherYoungster_AnotherBattleSometime, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE resetobjectmovementtype VAR_LAST_TALKED release end MasterTrainer_EventScript_PsychicScientist_ConferTitle: msgbox Text_PsychicScientist_GiveTitle, MSGBOX_DEFAULT message Text_MasterTrainer_EarnTitle waitmessage playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress msgbox Text_PsychicScientist_AnotherBattleSometime, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE resetobjectmovementtype VAR_LAST_TALKED release end MasterTrainer_EventScript_BlackBeltHiker_ConferTitle: msgbox Text_BlackBeltHiker_GiveTitle, MSGBOX_DEFAULT message Text_MasterTrainer_EarnTitle waitmessage playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress msgbox Text_BlackBeltHiker_AnotherBattleSometime, MSGBOX_DEFAULT clearflag FLAG_MASTER_TRAINER_BATTLE resetobjectmovementtype VAR_LAST_TALKED release end MasterTrainer_EventScript_NoBattleContinue: faceplayer msgbox Text_PsychicScientist_Intro, MSGBOX_DEFAULT msgbox Text_Scientist_SeePowerfulMon, MSGBOX_DEFAULT callnative CheckMasterPokemonInSlot1 compare VAR_RESULT, FALSE goto_if_eq MasterTrainer_EventScript_ReleaseEndClearFlag callnative CheckSlot1EVTotal compare VAR_RESULT, FALSE goto_if_eq MasterTrainer_EventScript_ReleaseEndClearFlag msgbox Text_Scientist_ShowPowerfulMon, MSGBOX_DEFAULT message Text_MasterTrainer_EarnTitle waitmessage playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress resetobjectmovementtype VAR_LAST_TALKED return MasterTrainer_EventScript_ReleaseEndClearFlag: clearflag FLAG_MASTER_TRAINER_BATTLE release end Text_Scientist_SeePowerfulMon: .string "It would be wonderful to see a truly\n" .string "powerful {STR_VAR_1}, even just once.$" Text_Scientist_ShowPowerfulMon: .string "What do we have here?\p" .string "That {STR_VAR_1}!\n" .string "It's got a special vibe to it!\p" .string "The way it holds itself, it just\n" .string "radiates strength…\l" .string "Wonderful!\p" .string "I thank you… You showed me a\n" .string "a truly amazing POKéMON.\p" .string "I think you deserve the title of\n" .string "{STR_VAR_1} MASTER!$" Text_BeautyLass_Intro: .string "I'm the {STR_VAR_1} MASTER!\p" .string "My goal is to find the ultimate\n" .string "{STR_VAR_1}!$" Text_BirdKeeperCooltrainer_Intro: .string "I'm the {STR_VAR_1} MASTER!\p" .string "I aim to find the ultimate\n" .string "{STR_VAR_1}!$" Text_BugCatcherYoungster_Intro: .string "I'm the {STR_VAR_1} MASTER!\n" .string "I seek the ultimate {STR_VAR_1}!$" Text_PsychicScientist_Intro: .string "I am the {STR_VAR_1} MASTER!\n" .string "I seek the ultimate {STR_VAR_1}.$" Text_BlackBeltHiker_Intro: .string "I am the {STR_VAR_1} MASTER!\p" .string "My only desire is to find the\n" .string "ultimate {STR_VAR_1}!$" Text_BeautyLass_NoMon: .string "Don't forget to put your {STR_VAR_1}\n" .string "in the top-left position of your\l" .string "party if you want to battle me!$" Text_BirdKeeperCooltrainer_NoMon: .string "If you want to battle me, you've\n" .string "got to put your {STR_VAR_1} in the\l" .string "top-left position of your party!$" Text_BugCatcherYoungster_NoMon: .string "If you're interested in battling me,\n" .string "you gotta put your {STR_VAR_1} in\l" .string "the top-left position of your party!$" Text_PsychicScientist_NoMon: .string "If you wish to battle me, you\n" .string "must put your {STR_VAR_1} in the\l" .string "top-left position of your party!$" Text_BlackBeltHiker_NoMon: .string "Set your {STR_VAR_1} in the top\n" .string "left of your party if you wish\l" .string "to face me in battle!$" Text_BeautyLass_AskBattle: .string "Hey, your {STR_VAR_1} looks pretty\n" .string "strong!\p" .string "Can I battle it with my {STR_VAR_1}?\n" .string "Pleeeease?$" Text_BirdKeeperCooltrainer_AskBattle: .string "What's this? I see you have a\n" .string "strong-looking {STR_VAR_1}!\p" .string "Why don't you have it battle my\n" .string "{STR_VAR_1}?$" Text_BugCatcherYoungster_AskBattle: .string "Heeey, you have a powerful\n" .string "{STR_VAR_1}, don't you?\p" .string "C'mon, you should have it battle\n" .string "my own {STR_VAR_1}!$" Text_PsychicScientist_AskBattle: .string "Oh? I see you have a very\n" .string "potent-looking {STR_VAR_1}…\p" .string "Would you be interested in battling\n" .string "my {STR_VAR_1}?$" Text_BlackBeltHiker_AskBattle: .string "Hmm? Your {STR_VAR_1} seems very\n" .string "strong!\p" .string "Why not have it face off against\n" .string "my {STR_VAR_1}?$" Text_BeautyLass_HaveTitleAskBattle: .string "Hey there! Has your {STR_VAR_1}\n" .string "gotten any stronger?\p" .string "Can I battle it with my {STR_VAR_1}?\n" .string "Pleeeease?$" Text_BirdKeeperCooltrainer_HaveTitleAskBattle: .string "Oh, hey there! Has your\n" .string "{STR_VAR_1} gotten any stronger?\p" .string "Why don't you have it battle my\n" .string "{STR_VAR_1}?$" Text_BugCatcherYoungster_HaveTitleAskBattle: .string "Hey, how's it going? Still training\n" .string "your {STR_VAR_1}, I bet!\p" .string "C'mon, you should have it battle\n" .string "my own {STR_VAR_1}!$" Text_PsychicScientist_HaveTitleAskBattle: .string "Oh, good to see you again.\n" .string "How's your {STR_VAR_1} doing?\p" .string "Would you be interested in battling\n" .string "my {STR_VAR_1}?$" Text_BlackBeltHiker_HaveTitleAskBattle: .string "Ahoy, you there! How is your\n" .string "{STR_VAR_1} doing these days?\p" .string "Why not have it face off against\n" .string "my {STR_VAR_1}?$" Text_BeautyLass_DeclinedBattle: .string "Boo!\n" .string "I wanted to show off my {STR_VAR_1}!$" Text_BirdKeeperCooltrainer_DeclinedBattle: .string "Too bad! That means I can't show\n" .string "you how amazing my {STR_VAR_1} is!$" Text_BugCatcherYoungster_DeclinedBattle: .string "Tsk! I really would have liked to\n" .string "see your {STR_VAR_1} in action…$" Text_PsychicScientist_DeclinedBattle: .string "It is unfortunate I can't show you\n" .string "the power of my {STR_VAR_1}.$" Text_BlackBeltHiker_DeclinedBattle: .string "Hmm, perhaps my {STR_VAR_1} is\n" .string "frightening you?$" Text_BeautyLass_AcceptedBattle: .string "Let's see which is the stronger\n" .string "{STR_VAR_1}!$" Text_BirdKeeperCooltrainer_AcceptedBattle: // a/an .string "All right!\n" .string "It's time for {STR_VAR_3} {STR_VAR_1} battle!$" Text_BugCatcherYoungster_AcceptedBattle: .string "Let's find out whose {STR_VAR_1}\n" .string "is the most powerful!$" Text_PsychicScientist_AcceptedBattle: .string "Well then, I hope you're ready!\n" .string "Come on, {STR_VAR_1}!$" Text_BlackBeltHiker_AcceptedBattle: .string "Let's do this, {STR_VAR_1}!\n" .string "Let's have an honorable battle!$" Text_BeautyLass_LostBattle: .string "Hee hee! I knew my {STR_VAR_1}\n" .string "was the best of the best!$" Text_BirdKeeperCooltrainer_LostBattle: .string "Hahaha! I knew my {STR_VAR_1}\n" .string "was the best of them all!$" Text_BugCatcherYoungster_LostBattle: .string "We did it! I knew my\n" .string "{STR_VAR_1} was the best there is!$" Text_PsychicScientist_LostBattle: .string "Heh heh heh… I knew my {STR_VAR_1}\n" .string "was the best, most powerful\l" .string "of them all.$" Text_BlackBeltHiker_LostBattle: .string "Bahaha! Of course my {STR_VAR_1}\n" .string "is the best of them all!$" Text_BeautyLass_BattleLoss: .string "That strength is the real deal!$" Text_BirdKeeperCooltrainer_BattleLoss: .string "That strength is the real thing.$" Text_BugCatcherYoungster_BattleLoss: .string "That strength is no joke!$" Text_PsychicScientist_BattleLoss: .string "That seems like true strength.$" Text_BlackBeltHiker_BattleLoss: .string "That's some real strength!$" Text_BeautyLass_AfterBattleWon: //already have title .string "Oh wow… Your {STR_VAR_1} is way\n" .string "stronger than I thought!\p" .string "We should have another battle\n" .string "sometime, since we both love\l" .string "{STR_VAR_1} so much!$" Text_BirdKeeperCooltrainer_AfterBattleWon: //already have title .string "I can't believe it… Your\n" .string "{STR_VAR_1}… It's too powerful!\p" .string "We both seem to love {STR_VAR_1},\n" .string "so let's battle again sometime!$" Text_BugCatcherYoungster_AfterBattleWon: //already have title .string "Aw, c'mon! Your {STR_VAR_1}\n" .string "is way too strong!\p" .string "I'd love to battle again sometime,\n" .string "as a fellow {STR_VAR_1} fan!$" Text_PsychicScientist_AfterBattleWon: //already have title .string "I can't believe this… Your\n" .string "{STR_VAR_1} is too strong!\p" .string "As two {STR_VAR_1} fanatics,\n" .string "we should definitely battle again\l" .string "sometime!$" Text_BlackBeltHiker_AfterBattleWon: //already have title .string "B-but how…? Your {STR_VAR_1} is\n" .string "more powerful than any I've seen\l" .string "before!\p" .string "As two {STR_VAR_1} fanatics,\n" .string "we are almost family!\l" .string "We must battle again sometime!$" Text_BeautyLass_GiveTitle: // a/an .string "Oh wow… Your {STR_VAR_1} is way\n" .string "stronger than I thought!\p" .string "I think you deserve to be called\n" .string "{STR_VAR_3} {STR_VAR_1} MASTER!$" Text_BirdKeeperCooltrainer_GiveTitle: .string "I can't believe it… Your\n" .string "{STR_VAR_1}… It's too powerful!\p" .string "You are the one who deserves the\n" .string "title of {STR_VAR_1} MASTER!$" Text_BugCatcherYoungster_GiveTitle: .string "Aw, c'mon! Your {STR_VAR_1}\n" .string "is way too strong!\p" .string "You definitely deserve the title\n" .string "of {STR_VAR_1} MASTER!$" Text_PsychicScientist_GiveTitle: .string "I can't believe this… Your\n" .string "{STR_VAR_1} is too strong!\p" .string "I think you deserve the title of\n" .string "{STR_VAR_1} MASTER!$" Text_BlackBeltHiker_GiveTitle: .string "B-but how…? Your {STR_VAR_1} is\n" .string "more powerful than any I've seen\l" .string "before!\p" .string "You are truly worthy of the title\n" .string "{STR_VAR_1} MASTER!$" Text_MasterTrainer_EarnTitle: .string "{COLOR DARK_GRAY}You have earned the title of\n" .string "{STR_VAR_1} MASTER!$" Text_BeautyLass_AnotherBattleSometime: .string "We should have another battle\n" .string "sometime, since we both love\l" .string "{STR_VAR_1} so much!$" Text_BirdKeeperCooltrainer_AnotherBattleSometime: .string "We both seem to love {STR_VAR_1},\n" .string "so let's battle again sometime!$" Text_BugCatcherYoungster_AnotherBattleSometime: .string "I'd love to battle again sometime,\n" .string "as a fellow {STR_VAR_1} fan!$" Text_PsychicScientist_AnotherBattleSometime: .string "As two {STR_VAR_1} fanatics,\n" .string "we should definitely battle again\l" .string "sometime!$" Text_BlackBeltHiker_AnotherBattleSometime: .string "As two {STR_VAR_1} fanatics,\n" .string "we are almost family!\l" .string "We must battle again sometime!$" ================================================ FILE: data/scripts/move_tutors.inc ================================================ VictoryRoad_2F_EventScript_DoubleEdgeTutor:: lock faceplayer goto_if_set FLAG_TUTOR_DOUBLE_EDGE, EventScript_DoubleEdgeReteach msgbox Text_DoubleEdgeTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DoubleEdgeDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_DoubleEdgeDeclined msgbox Text_DoubleEdgeWhichMon setvar VAR_0x8005, MOVETUTOR_DOUBLE_EDGE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_DoubleEdgeDeclined setflag FLAG_TUTOR_DOUBLE_EDGE goto EventScript_DoubleEdgeTaught end EventScript_DoubleEdgeDeclined:: msgbox Text_DoubleEdgeDeclined release end EventScript_DoubleEdgeTaught:: msgbox Text_DoubleEdgeTaught release end EventScript_DoubleEdgeReteach:: lock faceplayer msgbox Text_DoubleEdgeReteach showmoneybox 0, 0 msgbox Text_DoubleEdgeReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DoubleEdgeDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_DoubleEdgeNotEnoughMoney msgbox Text_DoubleEdgeWhichMon setvar VAR_0x8005, MOVETUTOR_DOUBLE_EDGE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_DoubleEdgeDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_DoubleEdgeTaught hidemoneybox release end EventScript_DoubleEdgeNotEnoughMoney:: msgbox Text_DoubleEdgeNotEnoughMoney hidemoneybox release end EventScript_DoubleEdgeDeclined2:: msgbox Text_DoubleEdgeDeclined hidemoneybox release end EventScript_ThunderWaveTutor:: lock faceplayer goto_if_set FLAG_TUTOR_THUNDER_WAVE, EventScript_ThunderWaveReteach msgbox Text_ThunderWaveTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_ThunderWaveDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_ThunderWaveDeclined msgbox Text_ThunderWaveWhichMon setvar VAR_0x8005, MOVETUTOR_THUNDER_WAVE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_ThunderWaveDeclined setflag FLAG_TUTOR_THUNDER_WAVE goto EventScript_ThunderWaveTaught end EventScript_ThunderWaveDeclined:: msgbox Text_ThunderWaveDeclined release end EventScript_ThunderWaveTaught:: msgbox Text_ThunderWaveTaught release end EventScript_ThunderWaveReteach:: lock faceplayer msgbox Text_ThunderWaveReteach showmoneybox 0, 0 msgbox Text_ThunderWaveReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_ThunderWaveDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_ThunderWaveNotEnoughMoney msgbox Text_ThunderWaveWhichMon setvar VAR_0x8005, MOVETUTOR_THUNDER_WAVE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_ThunderWaveDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_ThunderWaveTaught hidemoneybox release end EventScript_ThunderWaveNotEnoughMoney:: msgbox Text_ThunderWaveNotEnoughMoney hidemoneybox release end EventScript_ThunderWaveDeclined2:: msgbox Text_ThunderWaveDeclined hidemoneybox release end RockTunnel_B1F_EventScript_RockSlideTutor:: lock faceplayer goto_if_set FLAG_TUTOR_ROCK_SLIDE, EventScript_RockSlideReteach msgbox Text_RockSlideTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_RockSlideDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_RockSlideDeclined msgbox Text_RockSlideWhichMon setvar VAR_0x8005, MOVETUTOR_ROCK_SLIDE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_RockSlideDeclined setflag FLAG_TUTOR_ROCK_SLIDE goto EventScript_RockSlideTaught end EventScript_RockSlideDeclined:: msgbox Text_RockSlideDeclined release end EventScript_RockSlideTaught:: msgbox Text_RockSlideTaught release end EventScript_RockSlideReteach:: lock faceplayer msgbox Text_RockSlideReteach showmoneybox 0, 0 msgbox Text_RockSlideReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_RockSlideDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_RockSlideNotEnoughMoney msgbox Text_RockSlideWhichMon setvar VAR_0x8005, MOVETUTOR_ROCK_SLIDE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_RockSlideDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_RockSlideTaught hidemoneybox release end EventScript_RockSlideNotEnoughMoney:: msgbox Text_RockSlideNotEnoughMoney hidemoneybox release end EventScript_RockSlideDeclined2:: msgbox Text_RockSlideDeclined hidemoneybox release end MtEmber_Exterior_EventScript_ExplosionTutor:: lock faceplayer goto_if_set FLAG_TUTOR_EXPLOSION, EventScript_ExplosionReteach msgbox Text_ExplosionTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_ExplosionDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_ExplosionDeclined msgbox Text_ExplosionWhichMon setvar VAR_0x8005, MOVETUTOR_EXPLOSION call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_ExplosionDeclined setflag FLAG_TUTOR_EXPLOSION goto EventScript_ExplosionTaught end EventScript_ExplosionDeclined:: msgbox Text_ExplosionDeclined release end EventScript_ExplosionTaught:: msgbox Text_ExplosionTaught release end EventScript_ExplosionReteach:: lock faceplayer msgbox Text_ExplosionReteach showmoneybox 0, 0 msgbox Text_ExplosionReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_ExplosionDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_ExplosionNotEnoughMoney msgbox Text_ExplosionWhichMon setvar VAR_0x8005, MOVETUTOR_EXPLOSION call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_ExplosionDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_ExplosionTaught hidemoneybox release end EventScript_ExplosionDeclined2:: msgbox Text_ExplosionDeclined hidemoneybox release end EventScript_ExplosionNotEnoughMoney:: msgbox Text_ExplosionNotEnoughMoney hidemoneybox release end Route4_EventScript_MegaPunchTutor:: lock faceplayer goto_if_set FLAG_TUTOR_MEGA_PUNCH, EventScript_MegaPunchReteach msgbox Text_MegaPunchTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_MegaPunchDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_MegaPunchDeclined msgbox Text_MegaPunchWhichMon setvar VAR_0x8005, MOVETUTOR_MEGA_PUNCH call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_MegaPunchDeclined setflag FLAG_TUTOR_MEGA_PUNCH goto EventScript_MegaPunchTaught end EventScript_MegaPunchDeclined:: msgbox Text_MegaPunchDeclined release end EventScript_MegaPunchTaught:: msgbox Text_MegaPunchTaught release end EventScript_MegaPunchReteach:: lock faceplayer msgbox Text_MegaPunchReteach showmoneybox 0, 0 msgbox Text_MegaPunchReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_MegaPunchDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_MegaPunchNotEnoughMoney msgbox Text_MegaPunchWhichMon setvar VAR_0x8005, MOVETUTOR_MEGA_PUNCH call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_MegaPunchDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_MegaPunchTaught hidemoneybox release end EventScript_MegaPunchDeclined2:: msgbox Text_MegaPunchDeclined hidemoneybox release end EventScript_MegaPunchNotEnoughMoney:: msgbox Text_MegaPunchNotEnoughMoney hidemoneybox release end Route4_EventScript_MegaKickTutor:: lock faceplayer goto_if_set FLAG_TUTOR_MEGA_KICK, EventScript_MegaKickReteach msgbox Text_MegaKickTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_MegaKickDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_MegaKickDeclined msgbox Text_MegaKickWhichMon setvar VAR_0x8005, MOVETUTOR_MEGA_KICK call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_MegaKickDeclined setflag FLAG_TUTOR_MEGA_KICK goto EventScript_MegaKickTaught end EventScript_MegaKickDeclined:: msgbox Text_MegaKickDeclined release end EventScript_MegaKickTaught:: msgbox Text_MegaKickTaught release end EventScript_MegaKickReteach:: lock faceplayer msgbox Text_MegaKickReteach showmoneybox 0, 0 msgbox Text_MegaKickReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_MegaKickDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_MegaKickNotEnoughMoney msgbox Text_MegaKickWhichMon setvar VAR_0x8005, MOVETUTOR_MEGA_KICK call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_MegaKickDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_MegaKickTaught hidemoneybox release end EventScript_MegaKickDeclined2:: msgbox Text_MegaKickDeclined hidemoneybox release end EventScript_MegaKickNotEnoughMoney:: msgbox Text_MegaKickNotEnoughMoney hidemoneybox release end EventScript_DreamEaterTutor:: lock faceplayer goto_if_set FLAG_TUTOR_DREAM_EATER, EventScript_DreamEaterReteach msgbox Text_DreamEaterTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DreamEaterDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_DreamEaterDeclined msgbox Text_DreamEaterWhichMon setvar VAR_0x8005, MOVETUTOR_DREAM_EATER call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_DreamEaterDeclined setflag FLAG_TUTOR_DREAM_EATER goto EventScript_DreamEaterTaught end EventScript_DreamEaterDeclined:: msgbox Text_DreamEaterDeclined release end EventScript_DreamEaterTaught:: msgbox Text_DreamEaterTaught release end EventScript_DreamEaterReteach:: lock faceplayer msgbox Text_DreamEaterReteach showmoneybox 0, 0 msgbox Text_DreamEaterReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DreamEaterDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_DreamEaterNotEnoughMoney msgbox Text_DreamEaterWhichMon setvar VAR_0x8005, MOVETUTOR_DREAM_EATER call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_DreamEaterDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_DreamEaterTaught hidemoneybox release end EventScript_DreamEaterDeclined2:: msgbox Text_DreamEaterDeclined hidemoneybox release end EventScript_DreamEaterNotEnoughMoney:: msgbox Text_DreamEaterNotEnoughMoney hidemoneybox release end EventScript_SoftboiledTutor:: lock faceplayer goto_if_set FLAG_TUTOR_SOFT_BOILED, EventScript_SoftboiledReteach msgbox Text_SoftboiledTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SoftboiledDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_SoftboiledDeclined msgbox Text_SoftboiledWhichMon setvar VAR_0x8005, MOVETUTOR_SOFT_BOILED call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_SoftboiledDeclined setflag FLAG_TUTOR_SOFT_BOILED goto EventScript_SoftboiledTaught end EventScript_SoftboiledDeclined:: msgbox Text_SoftboiledDeclined release end EventScript_SoftboiledTaught:: msgbox Text_SoftboiledTaught release end EventScript_SoftboiledReteach:: lock faceplayer msgbox Text_SoftboiledReteach showmoneybox 0, 0 msgbox Text_SoftboiledReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SoftboiledDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_SoftboiledNotEnoughMoney msgbox Text_SoftboiledWhichMon setvar VAR_0x8005, MOVETUTOR_SOFT_BOILED call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_SoftboiledDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_SoftboiledTaught hidemoneybox release end EventScript_SoftboiledDeclined2:: msgbox Text_SoftboiledDeclined hidemoneybox release end EventScript_SoftboiledNotEnoughMoney:: msgbox Text_SoftboiledNotEnoughMoney hidemoneybox release end FuchsiaCity_EventScript_SubstituteTutor:: lock faceplayer goto_if_set FLAG_TUTOR_SUBSTITUTE, EventScript_SubstituteReteach msgbox Text_SubstituteTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SubstituteDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_SubstituteDeclined msgbox Text_SubstituteWhichMon setvar VAR_0x8005, MOVETUTOR_SUBSTITUTE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_SubstituteDeclined setflag FLAG_TUTOR_SUBSTITUTE goto EventScript_SubstituteTaught end EventScript_SubstituteDeclined:: msgbox Text_SubstituteDeclined release end EventScript_SubstituteTaught:: msgbox Text_SubstituteTaught release end EventScript_SubstituteReteach:: lock faceplayer msgbox Text_SubstituteReteach showmoneybox 0, 0 msgbox Text_SubstituteReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SubstituteDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_SubstituteNotEnoughMoney msgbox Text_SubstituteWhichMon setvar VAR_0x8005, MOVETUTOR_SUBSTITUTE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_SubstituteDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_SubstituteTaught hidemoneybox release end EventScript_SubstituteDeclined2:: msgbox Text_SubstituteDeclined hidemoneybox release end EventScript_SubstituteNotEnoughMoney:: msgbox Text_SubstituteNotEnoughMoney hidemoneybox release end SevenIsland_EventScript_SwordsDanceTutor:: lock faceplayer goto_if_set FLAG_TUTOR_SWORDS_DANCE, EventScript_SwordsDanceReteach msgbox Text_SwordsDanceTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SwordsDanceDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_SwordsDanceDeclined msgbox Text_SwordsDanceWhichMon setvar VAR_0x8005, MOVETUTOR_SWORDS_DANCE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_SwordsDanceDeclined setflag FLAG_TUTOR_SWORDS_DANCE goto EventScript_SwordsDanceTaught end EventScript_SwordsDanceDeclined:: msgbox Text_SwordsDanceDeclined release end EventScript_SwordsDanceTaught:: msgbox Text_SwordsDanceTaught release end EventScript_SwordsDanceReteach:: lock faceplayer msgbox Text_SwordsDanceReteach showmoneybox 0, 0 msgbox Text_SwordsDanceReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SwordsDanceDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_SwordsDanceNotEnoughMoney msgbox Text_SwordsDanceWhichMon setvar VAR_0x8005, MOVETUTOR_SWORDS_DANCE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_SwordsDanceDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_SwordsDanceTaught hidemoneybox release end EventScript_SwordsDanceDeclined2:: msgbox Text_SwordsDanceDeclined hidemoneybox release end EventScript_SwordsDanceNotEnoughMoney:: msgbox Text_SwordsDanceNotEnoughMoney hidemoneybox release end PewterCity_Museum_1F_EventScript_SeismicTossTutor:: lock faceplayer goto_if_set FLAG_TUTOR_SEISMIC_TOSS, EventScript_SeismicTossReteach msgbox Text_SeismicTossTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SeismicTossDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_SeismicTossDeclined msgbox Text_SeismicTossWhichMon setvar VAR_0x8005, MOVETUTOR_SEISMIC_TOSS call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_SeismicTossDeclined setflag FLAG_TUTOR_SEISMIC_TOSS goto EventScript_SeismicTossTaught end EventScript_SeismicTossDeclined:: msgbox Text_SeismicTossDeclined release end EventScript_SeismicTossTaught:: msgbox Text_SeismicTossTaught release end EventScript_SeismicTossReteach:: lock faceplayer msgbox Text_SeismicTossReteach showmoneybox 0, 0 msgbox Text_SeismicTossReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SeismicTossDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_SeismicTossNotEnoughMoney msgbox Text_SeismicTossWhichMon setvar VAR_0x8005, MOVETUTOR_SEISMIC_TOSS call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_SeismicTossDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_SeismicTossTaught hidemoneybox release end EventScript_SeismicTossDeclined2:: msgbox Text_SeismicTossDeclined hidemoneybox release end EventScript_SeismicTossNotEnoughMoney:: msgbox Text_SeismicTossNotEnoughMoney hidemoneybox release end EventScript_CounterTutor:: lock faceplayer goto_if_set FLAG_TUTOR_COUNTER, EventScript_CounterReteach msgbox Text_CounterTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_CounterDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_CounterDeclined msgbox Text_CounterWhichMon setvar VAR_0x8005, MOVETUTOR_COUNTER call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_CounterDeclined setflag FLAG_TUTOR_COUNTER goto EventScript_CounterTaught end EventScript_CounterDeclined:: msgbox Text_CounterDeclined release end EventScript_CounterTaught:: msgbox Text_CounterTaught release end EventScript_CounterReteach:: lock faceplayer msgbox Text_CounterReteach showmoneybox 0, 0 msgbox Text_CounterReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_CounterDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_CounterNotEnoughMoney msgbox Text_CounterWhichMon setvar VAR_0x8005, MOVETUTOR_COUNTER call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_CounterDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_CounterTaught hidemoneybox release end EventScript_CounterDeclined2:: msgbox Text_CounterDeclined hidemoneybox release end EventScript_CounterNotEnoughMoney:: msgbox Text_CounterNotEnoughMoney hidemoneybox release end EventScript_MetronomeTutor:: lock faceplayer goto_if_set FLAG_TUTOR_METRONOME, EventScript_MetronomeReteach msgbox Text_MetronomeTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_MetronomeDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_MetronomeDeclined msgbox Text_MetronomeWhichMon setvar VAR_0x8005, MOVETUTOR_METRONOME call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_MetronomeDeclined setflag FLAG_TUTOR_METRONOME goto EventScript_MetronomeTaught end EventScript_MetronomeDeclined:: msgbox Text_MetronomeDeclined release end EventScript_MetronomeTaught:: msgbox Text_MetronomeTaught release end EventScript_MetronomeReteach:: lock faceplayer msgbox Text_MetronomeReteach showmoneybox 0, 0 msgbox Text_MetronomeReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_MetronomeDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_MetronomeNotEnoughMoney msgbox Text_MetronomeWhichMon setvar VAR_0x8005, MOVETUTOR_METRONOME call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_MetronomeDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_MetronomeTaught hidemoneybox release end EventScript_MetronomeDeclined2:: msgbox Text_MetronomeDeclined hidemoneybox release end EventScript_MetronomeNotEnoughMoney:: msgbox Text_MetronomeNotEnoughMoney hidemoneybox release end EventScript_MimicTutor:: goto_if_set FLAG_TUTOR_MIMIC, EventScript_MimicReteach msgbox Text_MimicTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_MimicDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_MimicDeclined msgbox Text_MimicWhichMon setvar VAR_0x8005, MOVETUTOR_MIMIC call EventScript_ChooseMoveTutorMon lock faceplayer goto_if_eq VAR_RESULT, 0, EventScript_MimicDeclined removeitem ITEM_POKE_DOLL, 1 setflag FLAG_TUTOR_MIMIC goto EventScript_MimicTaught end EventScript_MimicDeclined:: msgbox Text_MimicDeclined release end EventScript_MimicTaught:: checkplayergender call_if_eq VAR_RESULT, MALE, EventScript_MimicTaughtMale call_if_eq VAR_RESULT, FEMALE, EventScript_MimicTaughtFemale release end EventScript_MimicTaughtMale:: msgbox Text_MimicTaughtMale return EventScript_MimicTaughtFemale:: msgbox Text_MimicTaughtFemale return EventScript_MimicReteach:: lock faceplayer msgbox Text_MimicReteach showmoneybox 0, 0 msgbox Text_MimicReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_MimicDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_MimicNotEnoughMoney msgbox Text_MimicWhichMon setvar VAR_0x8005, MOVETUTOR_MIMIC call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_MimicDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox goto EventScript_MimicTaught2 end EventScript_MimicDeclined2:: msgbox Text_MimicDeclined hidemoneybox release end EventScript_MimicNotEnoughMoney:: msgbox Text_MimicNotEnoughMoney hidemoneybox release end EventScript_MimicTaught2:: checkplayergender call_if_eq VAR_RESULT, MALE, EventScript_MimicTaughtMale2 call_if_eq VAR_RESULT, FEMALE, EventScript_MimicTaughtFemale2 hidemoneybox release end EventScript_MimicTaughtMale2:: msgbox Text_MimicTaughtMale2 return EventScript_MimicTaughtFemale2:: msgbox Text_MimicTaughtFemale2 return FourIsland_House1_EventScript_BodySlamTutor:: lock faceplayer goto_if_set FLAG_TUTOR_BODY_SLAM, EventScript_BodySlamReteach msgbox Text_BodySlamTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_BodySlamDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, EventScript_BodySlamDeclined msgbox Text_BodySlamWhichMon setvar VAR_0x8005, MOVETUTOR_BODY_SLAM call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_BodySlamDeclined setflag FLAG_TUTOR_BODY_SLAM goto EventScript_BodySlamTaught end EventScript_BodySlamDeclined:: msgbox Text_BodySlamDeclined release end EventScript_BodySlamTaught:: msgbox Text_BodySlamTaught release end EventScript_BodySlamReteach:: lock faceplayer msgbox Text_BodySlamReteach showmoneybox 0, 0 msgbox Text_BodySlamReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_BodySlamDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_BodySlamNotEnoughMoney msgbox Text_BodySlamWhichMon setvar VAR_0x8005, MOVETUTOR_BODY_SLAM call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, EventScript_BodySlamDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox Text_BodySlamTaught hidemoneybox release end EventScript_BodySlamDeclined2:: msgbox Text_BodySlamDeclined hidemoneybox release end EventScript_BodySlamNotEnoughMoney:: msgbox Text_BodySlamNotEnoughMoney hidemoneybox release end .set LOCALID_CAPE_BRINK_TUTOR, 1 TwoIsland_CapeBrink_House_EventScript_StarterTutor:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock faceplayer goto_if_set FLAG_LEARNED_ALL_MOVES_AT_CAPE_BRINK, CapeBrinkTutor_EventScript_TaughtAllMoves goto_if_set FLAG_TEMP_2, CapeBrinkTutor_EventScript_MoveJustTaught bufferleadmonspeciesname STR_VAR_1 msgbox Text_UltimateMoveThatMon specialvar VAR_RESULT, CapeBrinkGetMoveToTeachLeadPokemon goto_if_eq VAR_RESULT, FALSE, CapeBrinkTutor_EventScript_NoLeadStarter copyvar VAR_0x8009, VAR_0x8005 call_if_eq VAR_FACING, DIR_NORTH, CapeBrinkTutor_EventScript_JumpInPlaceDown call_if_eq VAR_FACING, DIR_SOUTH, CapeBrinkTutor_EventScript_JumpInPlaceUp call_if_eq VAR_FACING, DIR_EAST, CapeBrinkTutor_EventScript_JumpInPlaceLeft call_if_eq VAR_FACING, DIR_WEST, CapeBrinkTutor_EventScript_JumpInPlaceRight msgbox Text_AllowMeToTeachMonUltimateMove, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CapeBrinkTutor_EventScript_DeclineMove msgbox Text_LetMeConferUltimateMove closemessage fadescreen FADE_TO_BLACK goto CapeBrinkTutor_EventScript_ChooseMon @ Unused CapeBrinkTutor_EventScript_FadeTaughtMove:: fadescreen FADE_FROM_BLACK goto CapeBrinkTutor_EventScript_TaughtMove end CapeBrinkTutor_EventScript_MoveJustTaught:: msgbox Text_MakeBestUseOfMove release end CapeBrinkTutor_EventScript_TaughtAllMoves:: msgbox Text_FeelRejuvenated bufferleadmonspeciesname 0 specialvar VAR_RESULT, CapeBrinkGetMoveToTeachLeadPokemon goto_if_eq VAR_RESULT, FALSE, CapeBrinkTutor_EventScript_NoLeadStarter2 copyvar VAR_0x8009, VAR_0x8005 call_if_eq VAR_FACING, DIR_NORTH, CapeBrinkTutor_EventScript_JumpInPlaceDown call_if_eq VAR_FACING, DIR_SOUTH, CapeBrinkTutor_EventScript_JumpInPlaceUp call_if_eq VAR_FACING, DIR_EAST, CapeBrinkTutor_EventScript_JumpInPlaceLeft call_if_eq VAR_FACING, DIR_WEST, CapeBrinkTutor_EventScript_JumpInPlaceRight msgbox Text_RightPokemon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CapeBrinkTutor_EventScript_DeclineMove msgbox Text_LetMeConferUltimateMove closemessage fadescreen FADE_TO_BLACK goto CapeBrinkTutor_EventScript_ChooseMon release end CapeBrinkTutor_EventScript_NoLeadStarter2:: msgbox Text_NotTheRightPokemon release end CapeBrinkTutor_EventScript_TaughtMove:: copyvar VAR_0x8005, VAR_0x8009 specialvar VAR_RESULT, HasLearnedAllMovesFromCapeBrinkTutor goto_if_eq VAR_RESULT, TRUE, CapeBrinkTutor_EventScript_LearnedAllMoves msgbox Text_TaughtMove setflag FLAG_TEMP_2 release end CapeBrinkTutor_EventScript_LearnedAllMoves:: msgbox Text_PassedOnEverythingIKnow setflag FLAG_LEARNED_ALL_MOVES_AT_CAPE_BRINK release end CapeBrinkTutor_EventScript_ChooseMon:: call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, CapeBrinkTutor_EventScript_DeclineMove goto CapeBrinkTutor_EventScript_TaughtMove end CapeBrinkTutor_EventScript_JumpInPlaceDown:: applymovement LOCALID_CAPE_BRINK_TUTOR, Movement_JumpInPlaceDown waitmovement 0 return CapeBrinkTutor_EventScript_JumpInPlaceUp:: applymovement LOCALID_CAPE_BRINK_TUTOR, Movement_JumpInPlaceUp waitmovement 0 return CapeBrinkTutor_EventScript_JumpInPlaceLeft:: applymovement LOCALID_CAPE_BRINK_TUTOR, Movement_JumpInPlaceLeft waitmovement 0 return CapeBrinkTutor_EventScript_JumpInPlaceRight:: applymovement LOCALID_CAPE_BRINK_TUTOR, Movement_JumpInPlaceRight waitmovement 0 return CapeBrinkTutor_EventScript_DeclineMove:: msgbox Text_YouRejectIt release end CapeBrinkTutor_EventScript_NoLeadStarter:: msgbox Text_JustMistaken release end EventScript_ChooseMoveTutorMon:: special ChooseMonForMoveTutor waitstate lock faceplayer return EventScript_CanOnlyBeLearnedOnce:: textcolor NPC_TEXT_COLOR_NEUTRAL special DisableMsgBoxWalkaway signmsg msgbox Text_MoveCanOnlyBeLearnedOnce, MSGBOX_YESNO normalmsg call EventScript_RestorePrevTextColor return Movement_JumpInPlaceDown: jump_in_place_down step_end Movement_JumpInPlaceUp: jump_in_place_up step_end Movement_JumpInPlaceLeft: jump_in_place_left step_end Movement_JumpInPlaceRight: jump_in_place_right step_end VermilionCity_House2_EventScript_FuryCutterTutor:: lock faceplayer goto_if_set FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER, EventScript_FuryCutterReteach msgbox MoveTutor_Text_FuryCutterTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_FuryCutterDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_FuryCutterDeclined msgbox MoveTutor_Text_FuryCutterWhichMon, MSGBOX_DEFAULT setvar VAR_0x8005, MOVETUTOR_FURY_CUTTER call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_FuryCutterDeclined setflag FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER goto MoveTutor_EventScript_FuryCutterTaught end MoveTutor_EventScript_FuryCutterDeclined:: msgbox MoveTutor_Text_FuryCutterDeclined, MSGBOX_DEFAULT release end MoveTutor_EventScript_FuryCutterTaught:: msgbox MoveTutor_Text_FuryCutterTaught, MSGBOX_DEFAULT release end EventScript_FuryCutterReteach:: lock faceplayer msgbox Text_FuryCutterReteach showmoneybox 0, 0 msgbox Text_FuryCutterReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_FuryCutterDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_FuryCutterNotEnoughMoney msgbox MoveTutor_Text_FuryCutterWhichMon setvar VAR_0x8005, MOVETUTOR_FURY_CUTTER call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_FuryCutterDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox MoveTutor_Text_FuryCutterTaught hidemoneybox release end EventScript_FuryCutterNotEnoughMoney:: msgbox Text_FuryCutterNotEnoughMoney hidemoneybox release end EventScript_FuryCutterDeclined2:: msgbox MoveTutor_Text_FuryCutterDeclined hidemoneybox release end MoveTutor_Text_FuryCutterTeach: .string "There's a move that gets stronger\n" .string "when you keep using it in a row.\p" .string "It's a BUG-type move, and it is\n" .string "wickedly cool.\p" .string "It's called FURY CUTTER.\n" .string "Want me to teach it to a POKéMON?$" MoveTutor_Text_FuryCutterDeclined: .string "We're not on the same wavelength.$" MoveTutor_Text_FuryCutterWhichMon: .string "Yay!\n" .string "Show me the POKéMON I should teach.$" MoveTutor_Text_FuryCutterTaught: .string "I get a thrill watching to see if\n" .string "the move keeps hitting in succession!$" Text_FuryCutterReteach:: .string "You want your POKéMON to learn\n" .string "FURY CUTTER over and over so they\l" .string "can keep using it over and over?\p" .string "I can teach you FURY CUTTER\n" .string "again if you give me ¥5000.$" Text_FuryCutterReteach2:: .string "Want me to teach FURY CUTTER\n" .string "to a POKéMON?$" Text_FuryCutterNotEnoughMoney:: .string "I can't teach FURY CUTTER over\n" .string "and over if you can't pay!\p" .string "Come back with ¥5000 next\n" .string "time and I'll teach it again.$" Route24_EventScript_RolloutTutor:: lock faceplayer goto_if_set FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT, EventScript_RolloutReteach msgbox MoveTutor_Text_RolloutTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_RolloutDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_RolloutDeclined msgbox MoveTutor_Text_RolloutWhichMon, MSGBOX_DEFAULT setvar VAR_0x8005, MOVETUTOR_ROLLOUT call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_RolloutDeclined setflag FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT goto MoveTutor_EventScript_RolloutTaught end MoveTutor_EventScript_RolloutDeclined:: msgbox MoveTutor_Text_RolloutDeclined, MSGBOX_DEFAULT release end MoveTutor_EventScript_RolloutTaught:: msgbox MoveTutor_Text_RolloutTaught, MSGBOX_DEFAULT release end EventScript_RolloutReteach:: lock faceplayer msgbox Text_RolloutReteach showmoneybox 0, 0 msgbox Text_RolloutReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_RolloutDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_RolloutNotEnoughMoney msgbox MoveTutor_Text_RolloutWhichMon setvar VAR_0x8005, MOVETUTOR_ROLLOUT call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_RolloutDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox MoveTutor_Text_RolloutTaught hidemoneybox release end EventScript_RolloutNotEnoughMoney:: msgbox Text_RolloutNotEnoughMoney hidemoneybox release end EventScript_RolloutDeclined2:: msgbox MoveTutor_Text_RolloutDeclined hidemoneybox release end MoveTutor_Text_RolloutTeach: .string "Did you know that you can go from\n" .string "here a long way in that direction\l" .string "without changing direction?\p" .string "I might even be able to roll\n" .string "that way.\p" .string "Do you think your POKéMON will\n" .string "want to roll, too?\p" .string "I can teach one the move ROLLOUT\n" .string "if you'd like.$" MoveTutor_Text_RolloutDeclined: .string "You don't need to be shy about it.\n" .string "Let's roll!$" MoveTutor_Text_RolloutWhichMon: .string "Ehehe, sure thing! It'd be great if\n" .string "the POKéMON looked like me.$" MoveTutor_Text_RolloutTaught: .string "Rolling around in the grass makes me\n" .string "happy. Come on, let's roll!$" Text_RolloutReteach:: .string "I wonder if I could roll down\n" .string "NUGGET BRIDGE to CERULEAN…\p" .string "Oh, do you want me to teach\n" .string "ROLLOUT to your POKéMON again?\p" .string "I can do it, but I have to charge\n" .string "¥5000 for my services!$" Text_RolloutReteach2:: .string "Want me to teach ROLLOUT\n" .string "to one of your POKéMON?$" Text_RolloutNotEnoughMoney:: .string "Whoa!\n" .string "Hold on a minute!\p" .string "How can I teach you ROLLOUT if\n" .string "you don't have a bankroll to pay\l" .string "me with?\p" .string "Come back to me with ¥5000 and\n" .string "we'll get your POKéMON rolling!$" SaffronCity_EventScript_DynamicPunchTutor:: lock faceplayer goto_if_set FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH, EventScript_DynamicPunchReteach msgbox MoveTutor_Text_DynamicPunchTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_DynamicPunchDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_DynamicPunchDeclined msgbox MoveTutor_Text_DynamicPunchWhichMon, MSGBOX_DEFAULT setvar VAR_0x8005, MOVETUTOR_DYNAMIC_PUNCH call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_DynamicPunchDeclined setflag FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH goto MoveTutor_EventScript_DynamicPunchTaught turnobject 19, DIR_NORTH end MoveTutor_EventScript_DynamicPunchDeclined:: msgbox MoveTutor_Text_DynamicPunchDeclined, MSGBOX_DEFAULT release turnobject 19, DIR_NORTH end MoveTutor_EventScript_DynamicPunchTaught:: msgbox MoveTutor_Text_DynamicPunchTaught, MSGBOX_DEFAULT release turnobject 19, DIR_NORTH end EventScript_DynamicPunchReteach:: lock faceplayer msgbox Text_DynamicPunchReteach showmoneybox 0, 0 msgbox Text_DynamicPunchReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DynamicPunchDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_DynamicPunchNotEnoughMoney msgbox MoveTutor_Text_DynamicPunchWhichMon setvar VAR_0x8005, MOVETUTOR_DYNAMIC_PUNCH call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_DynamicPunchDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox MoveTutor_Text_DynamicPunchTaught hidemoneybox release turnobject 19, DIR_NORTH end EventScript_DynamicPunchNotEnoughMoney:: msgbox Text_DynamicPunchNotEnoughMoney hidemoneybox release turnobject 19, DIR_NORTH end EventScript_DynamicPunchDeclined2:: msgbox MoveTutor_Text_DynamicPunchDeclined hidemoneybox release turnobject 19, DIR_NORTH end MoveTutor_Text_DynamicPunchTeach: .string "I can't do this anymore!\p" .string "It's utterly hopeless!\p" .string "I'm a FIGHTING-type TRAINER,\n" .string "so I can't win at the SAFFRON GYM\l" .string "no matter how hard I try!\p" .string "Argh! Punch! Punch! Punch!\n" .string "Punch! Punch! Punch!\p" .string "What, don't look at me that way!\n" .string "I'm only hitting the wall!\p" .string "Or do you want me to teach your\n" .string "POKéMON DYNAMICPUNCH?$" MoveTutor_Text_DynamicPunchDeclined: .string "Darn! You're even making fun of me?\n" .string "Punch! Punch! Punch!$" MoveTutor_Text_DynamicPunchWhichMon: .string "What? You do? You're a good person!\n" .string "Which POKéMON should I teach?$" MoveTutor_Text_DynamicPunchTaught: .string "I want you to win at the SAFFRON\n" .string "GYM using that DYNAMICPUNCH!$" Text_DynamicPunchReteach:: .string "Argh! Punch! Punch! Punch!\n" .string "Punch! Punch! Punch!\p" .string "I'm still so frustrated about\n" .string "losing in the GYM!\p" .string "Do you want me to teach your\n" .string "POKéMON DYNAMICPUNCH again?\p" .string "I'll do it for ¥5000!\n" .string "I need to buy REVIVES!$" Text_DynamicPunchReteach2:: .string "Do you want me to teach your\n" .string "POKéMON DYNAMICPUNCH?$" Text_DynamicPunchNotEnoughMoney:: .string "Are you mocking me for needing\n" .string "money for POKéMON medicine?\p" .string "Using items in battle is the only\n" .string "possible way I can win here!\p" .string "Let me know when you have ¥5000.\n" .string "Until then…\p" .string "Argh! Punch! Punch! Punch!\n" .string "Punch! Punch! Punch!$" SilphCo_9F_EventScript_SleepTalkTutor:: lock faceplayer goto_if_set FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK, EventScript_SleepTalkReteach msgbox MoveTutor_Text_SleepTalkTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SleepTalkDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SleepTalkDeclined msgbox MoveTutor_Text_SleepTalkWhichMon, MSGBOX_DEFAULT setvar VAR_0x8005, MOVETUTOR_SLEEP_TALK call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_SleepTalkDeclined setflag FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK goto MoveTutor_EventScript_SleepTalkTaught turnobject 16, DIR_EAST end MoveTutor_EventScript_SleepTalkDeclined:: msgbox MoveTutor_Text_SleepTalkDeclined, MSGBOX_DEFAULT release turnobject 16, DIR_EAST end MoveTutor_EventScript_SleepTalkTaught:: msgbox MoveTutor_Text_SleepTalkTaught, MSGBOX_DEFAULT release turnobject 16, DIR_EAST end EventScript_SleepTalkReteach:: lock faceplayer msgbox Text_SleepTalkReteach showmoneybox 0, 0 msgbox Text_SleepTalkReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SleepTalkDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_SleepTalkNotEnoughMoney msgbox MoveTutor_Text_SleepTalkWhichMon setvar VAR_0x8005, MOVETUTOR_SLEEP_TALK call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_SleepTalkDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox MoveTutor_Text_SleepTalkTaught hidemoneybox release turnobject 16, DIR_EAST end EventScript_SleepTalkNotEnoughMoney:: msgbox Text_SleepTalkNotEnoughMoney hidemoneybox release turnobject 16, DIR_EAST end EventScript_SleepTalkDeclined2:: msgbox MoveTutor_Text_SleepTalkDeclined hidemoneybox release turnobject 16, DIR_EAST end MoveTutor_Text_SleepTalkTeach: .string "…ZZZ…\n" .string "…Zzz…zzz…\p" .string "Mrr… mhm…\n" .string "use… mmm…\p" .string "Oh!\n" .string "Was I talking in my sleep?\p" .string "I was dreaming that I wanted\n" .string "my POKéMON to use a move,\l" .string "but it was asleep!\p" .string "I can teach your POKéMON how\n" .string "to SLEEP TALK so they can attack\l" .string "while sleeping if you want.\p" .string "Are you interested in teaching\n" .string "your POKéMON SLEEP TALK?$" MoveTutor_Text_SleepTalkDeclined: .string "Oh, fine, fine.\p" .string "Then back to my nap, I still have\n" .string "some time left on my break!$" MoveTutor_Text_SleepTalkWhichMon: .string "Okay!\n" .string "Which POKéMON should I teach?$" MoveTutor_Text_SleepTalkTaught: .string "Now that POKéMON can attack\n" .string "while sleeping with SLEEP TALK!\p" .string "I wonder if humans can SLEEP TALK\n" .string "to nap while working?\p" .string "Yawn…\n" .string "…Zzz…zzz…$" Text_SleepTalkReteach:: .string "…ZZZ…\n" .string "…Huh?\l" .string "…Oh, you're back.\p" .string "Yawn… Do you want me to teach\n" .string "your POKéMON SLEEP TALK again?\p" .string "I lost my bonus by always\n" .string "oversleeping on my breaks…\p" .string "I'll do it for some extra money.\n" .string "How does ¥5000 sound?$" Text_SleepTalkReteach2:: .string "Are you interested in teaching\n" .string "your POKéMON SLEEP TALK?$" Text_SleepTalkNotEnoughMoney:: .string "Oh, you don't have enough money.\n" .string "Why don't you think up some way\l" .string "to make some and come back later?\p" .string "Now, if you'll excuse me…\n" .string "…Zzz…zzz…$" SilphCo_9F_EventScript_NightmareTutor:: lock faceplayer goto_if_set FLAG_MOVE_TUTOR_TAUGHT_NIGHTMARE, EventScript_NightmareReteach msgbox MoveTutor_Text_NightmareTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_NightmareDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_NightmareDeclined msgbox MoveTutor_Text_NightmareWhichMon, MSGBOX_DEFAULT setvar VAR_0x8005, MOVETUTOR_NIGHTMARE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_NightmareDeclined setflag FLAG_MOVE_TUTOR_TAUGHT_NIGHTMARE goto MoveTutor_EventScript_NightmareTaught turnobject 17, DIR_SOUTH end MoveTutor_EventScript_NightmareDeclined:: msgbox MoveTutor_Text_NightmareDeclined, MSGBOX_DEFAULT release turnobject 17, DIR_SOUTH end MoveTutor_EventScript_NightmareTaught:: msgbox MoveTutor_Text_NightmareTaught, MSGBOX_DEFAULT release turnobject 17, DIR_SOUTH end EventScript_NightmareReteach:: lock faceplayer msgbox Text_NightmareReteach showmoneybox 0, 0 msgbox Text_NightmareReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_NightmareDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_NightmareNotEnoughMoney msgbox MoveTutor_Text_NightmareWhichMon setvar VAR_0x8005, MOVETUTOR_NIGHTMARE call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_NightmareDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox MoveTutor_Text_NightmareTaught hidemoneybox release turnobject 17, DIR_SOUTH end EventScript_NightmareNotEnoughMoney:: msgbox Text_NightmareNotEnoughMoney hidemoneybox release turnobject 17, DIR_SOUTH end EventScript_NightmareDeclined2:: msgbox MoveTutor_Text_NightmareDeclined hidemoneybox release turnobject 17, DIR_SOUTH end MoveTutor_Text_NightmareTeach: .string "Waaah!\n" .string "Oh no, not another one…\p" .string "I keep having nightmares that\n" .string "TEAM ROCKET comes back and locks\l" .string "me up again.\p" .string "I haven't had a good night's sleep\n" .string "since they took over.\p" .string "I can teach your POKéMON to give\n" .string "nightmares just like TEAM ROCKET.$" .string "Do you want your POKéMON\n" .string "to learn NIGHTMARE?$" MoveTutor_Text_NightmareDeclined: .string "You don't want to risk it\n" .string "giving you nightmares too?$" MoveTutor_Text_NightmareWhichMon: .string "Alright.\n" .string "Which POKéMON should learn it?$" MoveTutor_Text_NightmareTaught: .string "Now that POKéMON can inflict\n" .string "nightmares on sleeping foes.\p" .string "Now if only I could find some\n" .string "way of getting rid of my nightmares…$" Text_NightmareReteach:: .string "Ahh!\n" .string "Ugh, again?\p" .string "I thought that napping at work\n" .string "where it all happened might cure\l" .string "my nightmares, but…\p" .string "Are you back to teach your\n" .string "POKéMON NIGHTMARE again?\p" .string "If you have ¥5000, I'll show\n" .string "one of them how to use it.$" Text_NightmareReteach2:: .string "Do you want your POKéMON\n" .string "to learn NIGHTMARE?$" Text_NightmareNotEnoughMoney:: .string "You don't have ¥5000?\p" .string "I don't want to keep reliving\n" .string "these nightmares for nothing.\p" .string "Come back when you can pay me\n" .string "the full amount, okay?$" CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_SelfdestructTutor:: lock faceplayer goto_if_set FLAG_MOVE_TUTOR_TAUGHT_SELFDESTRUCT, EventScript_SelfdestructReteach msgbox MoveTutor_Text_SelfdestructTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SelfdestructDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SelfdestructDeclined msgbox MoveTutor_Text_SelfdestructWhichMon, MSGBOX_DEFAULT setvar VAR_0x8005, MOVETUTOR_SELF_DESTRUCT call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_SelfdestructDeclined setflag FLAG_MOVE_TUTOR_TAUGHT_SELFDESTRUCT goto MoveTutor_EventScript_SelfdestructTaught turnobject 17, DIR_SOUTH end MoveTutor_EventScript_SelfdestructDeclined:: msgbox MoveTutor_Text_SelfdestructDeclined, MSGBOX_DEFAULT release turnobject 17, DIR_SOUTH end MoveTutor_EventScript_SelfdestructTaught:: msgbox MoveTutor_Text_SelfdestructTaught, MSGBOX_DEFAULT release turnobject 17, DIR_SOUTH end EventScript_SelfdestructReteach:: lock faceplayer msgbox Text_SelfdestructReteach showmoneybox 0, 0 msgbox Text_SelfdestructReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SelfdestructDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_SelfdestructNotEnoughMoney msgbox MoveTutor_Text_SelfdestructWhichMon setvar VAR_0x8005, MOVETUTOR_SELF_DESTRUCT call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_SelfdestructDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox MoveTutor_Text_SelfdestructTaught hidemoneybox release turnobject 17, DIR_SOUTH end EventScript_SelfdestructNotEnoughMoney:: msgbox Text_SelfdestructNotEnoughMoney hidemoneybox release turnobject 17, DIR_SOUTH end EventScript_SelfdestructDeclined2:: msgbox MoveTutor_Text_SelfdestructDeclined hidemoneybox release turnobject 17, DIR_SOUTH end MoveTutor_Text_SelfdestructTeach: .string "There's no doubt about it.\n" .string "I've run the tests a hundred times.\p" .string "The volcano that sleeps beneath us\n" .string "isn't asleep at all!\p" .string "It'll erupt and destroy this entire\n" .string "town within three years for sure!\p" .string "It'll be like the whole island\n" .string "self-destructed in a fiery inferno!\p" .string "POKéMON can use a similar move to\n" .string "explode and deal damage, actually.\p" .string "Do you want me to teach your\n" .string "POKéMON how to use SELFDESTRUCT?$" MoveTutor_Text_SelfdestructDeclined: .string "Is SELFDESTRUCT too risky for\n" .string "you to use in battle?$" MoveTutor_Text_SelfdestructWhichMon: .string "So which POKéMON should learn\n" .string "this high-risk move?$" MoveTutor_Text_SelfdestructTaught: .string "Now the terrifying power of\n" .string "SELFDESTRUCT is yours to command!\p" .string "We won't be able to control the\n" .string "volcano in the same way, though…\p" .string "The only thing to do now is start\n" .string "making evacuation plans.\p" .string "Let's hope you're standing on some\n" .string "other rock in three years' time!$" Text_SelfdestructReteach:: .string "When the volcano goes, we'll\n" .string "have to save our equipment…\l" .string "Oh, hello again!\p" .string "I'm just planning for the imminent\n" .string "destruction of everything here.\p" .string "Do you want to learn SELFDESTRUCT\n" .string "again before the inevitable occurs?\p" .string "I'm taking donations for the\n" .string "evacuation plans.\p" .string "Donate ¥5000 and I'll teach one of\n" .string "your POKéMON SELFDESTRUCT.$" Text_SelfdestructReteach2:: .string "Do you want me to teach your\n" .string "POKéMON how to use SELFDESTRUCT?$" Text_SelfdestructNotEnoughMoney:: .string "We need every bit of financial\n" .string "support we can get to prepare\l" .string "for the eruption.\p" .string "I can't offer you my services\n" .string "for less than a ¥5000 donation.$" MtEmber_Exterior_EventScript_SkyAttackTutor:: lock faceplayer goto_if_set FLAG_MOVE_TUTOR_TAUGHT_SKY_ATTACK, EventScript_SkyAttackReteach msgbox MoveTutor_Text_SkyAttackTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SkyAttackDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SkyAttackDeclined msgbox MoveTutor_Text_SkyAttackWhichMon, MSGBOX_DEFAULT setvar VAR_0x8005, MOVETUTOR_SKY_ATTACK call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_SkyAttackDeclined setflag FLAG_MOVE_TUTOR_TAUGHT_SKY_ATTACK goto MoveTutor_EventScript_SkyAttackTaught turnobject 17, DIR_SOUTH end MoveTutor_EventScript_SkyAttackDeclined:: msgbox MoveTutor_Text_SkyAttackDeclined, MSGBOX_DEFAULT release turnobject 17, DIR_SOUTH end MoveTutor_EventScript_SkyAttackTaught:: msgbox MoveTutor_Text_SkyAttackTaught, MSGBOX_DEFAULT release turnobject 17, DIR_SOUTH end EventScript_SkyAttackReteach:: lock faceplayer msgbox Text_SkyAttackReteach showmoneybox 0, 0 msgbox Text_SkyAttackReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SkyAttackDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_SkyAttackNotEnoughMoney msgbox MoveTutor_Text_SkyAttackWhichMon setvar VAR_0x8005, MOVETUTOR_SKY_ATTACK call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_SkyAttackDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox MoveTutor_Text_SkyAttackTaught hidemoneybox release turnobject 17, DIR_SOUTH end EventScript_SkyAttackNotEnoughMoney:: msgbox Text_SkyAttackNotEnoughMoney hidemoneybox release turnobject 17, DIR_SOUTH end EventScript_SkyAttackDeclined2:: msgbox MoveTutor_Text_SkyAttackDeclined hidemoneybox release turnobject 17, DIR_SOUTH end MoveTutor_Text_SkyAttackTeach: .string "We're so high up, it's like we can\n" .string "touch the sky.\p" .string "Bird POKéMON must feel like\n" .string "this all the time…\p" .string "How, you ask?\n" .string "Do you not know?\p" .string "They can learn a move that brings\n" .string "the sky crashing down on others!\p" .string "Would you like me to teach your\n" .string "POKéMON SKY ATTACK?$" MoveTutor_Text_SkyAttackDeclined: .string "I suppose not everyone wants\n" .string "to touch the sky.$" MoveTutor_Text_SkyAttackWhichMon: .string "Who should learn SKY ATTACK?$" MoveTutor_Text_SkyAttackTaught: .string "SKY ATTACK is the ultimate\n" .string "FLYING-type move.\p" .string "Your POKéMON will make good\n" .string "use of its power, I'm sure.$" Text_SkyAttackReteach:: .string "Did you climb all the way back up\n" .string "here again for the thrill?\p" .string "Being this close to the sky\n" .string "feels amazing, right?\p" .string "If you're interested, I can\n" .string "teach your POKéMON SKY ATTACK.\p" .string "This time, though, I'll need ¥5000\n" .string "to do it!$" Text_SkyAttackReteach2:: .string "Would you like me to teach your\n" .string "POKéMON SKY ATTACK?$" Text_SkyAttackNotEnoughMoney:: .string "You don't have enough money,\n" .string "what a shame.\p" .string "You'll have to climb back up here\n" .string "again once you have ¥5000!$" Route10_EventScript_SwaggerTutor:: lock faceplayer goto_if_set FLAG_MOVE_TUTOR_TAUGHT_SWAGGER, EventScript_SwaggerReteach msgbox MoveTutor_Text_SwaggerTeach, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SwaggerDeclined call EventScript_CanOnlyBeLearnedOnce goto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SwaggerDeclined msgbox MoveTutor_Text_SwaggerWhichMon, MSGBOX_DEFAULT setvar VAR_0x8005, MOVETUTOR_SWAGGER call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_SwaggerDeclined setflag FLAG_MOVE_TUTOR_TAUGHT_SWAGGER goto MoveTutor_EventScript_SwaggerTaught turnobject 17, DIR_SOUTH end MoveTutor_EventScript_SwaggerDeclined:: msgbox MoveTutor_Text_SwaggerDeclined, MSGBOX_DEFAULT release turnobject 17, DIR_SOUTH end MoveTutor_EventScript_SwaggerTaught:: msgbox MoveTutor_Text_SwaggerTaught, MSGBOX_DEFAULT release turnobject 17, DIR_SOUTH end EventScript_SwaggerReteach:: lock faceplayer msgbox Text_SwaggerReteach showmoneybox 0, 0 msgbox Text_SwaggerReteach2, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_SwaggerDeclined2 checkmoney 5000, 0 goto_if_eq VAR_RESULT, FALSE, EventScript_SwaggerNotEnoughMoney msgbox MoveTutor_Text_SwaggerWhichMon setvar VAR_0x8005, MOVETUTOR_SWAGGER call EventScript_ChooseMoveTutorMon goto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_SwaggerDeclined showmoneybox 0, 0 removemoney 5000 updatemoneybox msgbox MoveTutor_Text_SwaggerTaught hidemoneybox release turnobject 17, DIR_SOUTH end EventScript_SwaggerNotEnoughMoney:: msgbox Text_SwaggerNotEnoughMoney hidemoneybox release turnobject 17, DIR_SOUTH end EventScript_SwaggerDeclined2:: msgbox MoveTutor_Text_SwaggerDeclined hidemoneybox release turnobject 17, DIR_SOUTH end MoveTutor_Text_SwaggerTeach: .string "Heh! My POKéMON totally rules!\n" .string "It's cooler than any POKéMON!\p" .string "I was lipping off with a swagger in\n" .string "my step like that when some guy\l" .string "named {RIVAL} challenged me.\p" .string "He beat us without any effort and\n" .string "took the swagger out of my step.\p" .string "If you'd like, I'll teach the move\n" .string "SWAGGER to a POKéMON of yours.$" MoveTutor_Text_SwaggerDeclined: .string "What, no? Can't you get into\n" .string "the spirit of things?$" MoveTutor_Text_SwaggerWhichMon: .string "All right, which POKéMON wants to\n" .string "learn how to SWAGGER?$" MoveTutor_Text_SwaggerTaught: .string "I'll just praise my POKéMON from\n" .string "now on without the swagger.$" Text_SwaggerReteach:: .string "I've been humbled by losing\n" .string "so badly to that {RIVAL} guy.\p" .string "But I still know how to walk\n" .string "with a swagger in my step!\p" .string "I can teach your POKéMON how\n" .string "to use SWAGGER again.\p" .string "However, the price of learning how\n" .string "to swagger like me is a cool ¥5000.$" Text_SwaggerReteach2:: .string "Do you want me to teach the move\n" .string "SWAGGER to a POKéMON of yours?$" Text_SwaggerNotEnoughMoney:: .string "No money, no SWAGGER!\n" .string "Come back with ¥5000 next time!$" ================================================ FILE: data/scripts/movement.inc ================================================ Common_Movement_QuestionMark:: emote_question_mark step_end Common_Movement_ExclamationMark:: emote_exclamation_mark step_end Common_Movement_Delay48:: delay_16 delay_16 delay_16 step_end Common_Movement_FacePlayer:: face_player step_end @ Unused Common_Movement_FaceAwayPlayer:: face_away_player step_end Common_Movement_FaceOriginalDirection:: face_original_direction step_end Common_Movement_WalkInPlaceFasterLeft:: walk_in_place_faster_left step_end Common_Movement_WalkInPlaceFasterUp:: walk_in_place_faster_up step_end Common_Movement_WalkInPlaceFasterRight:: walk_in_place_faster_right step_end Common_Movement_WalkInPlaceFasterDown:: walk_in_place_faster_down step_end Common_Movement_FaceRight:: face_right step_end Common_Movement_FaceDown:: face_down step_end Common_Movement_WalkUp5:: walk_up walk_up walk_up walk_up walk_up step_end @ Unused Common_Movement_WalkUp4:: walk_up walk_up walk_up walk_up step_end Common_Movement_Delay32:: delay_16 delay_16 step_end @ Unused Common_Movement_WalkUp:: walk_up step_end @ Unused Common_Movement_WalkUp2:: walk_up walk_up step_end ================================================ FILE: data/scripts/mystery_event_club.inc ================================================ .equ GAVE_PROFILE, VAR_TEMP_1 MysteryEventClub_EventScript_Woman:: lock faceplayer goto_if_eq GAVE_PROFILE, TRUE, EventScript_AlreadyGaveProfile goto_if_set FLAG_SYS_SET_TRAINER_CARD_PROFILE, EventScript_GivenProfileBefore msgbox Text_IdLoveToHearYourProfile goto EventScript_AskForProfile end EventScript_AlreadyGaveProfile: msgbox Text_TellMoreNextTime release end EventScript_AskForProfile: message Text_TellMeWhatsYourProfile waitmessage multichoice 18, 6, MULTICHOICE_YES_NO_INFO_2, FALSE switch VAR_RESULT case 0, EventScript_AcceptGiveProfile case 1, EventScript_DeclineGiveProfile case 2, EventScript_ProfileInfo case SCR_MENU_CANCEL, EventScript_DeclineGiveProfile end EventScript_ProfileInfo: msgbox Text_ExplainProfile goto EventScript_AskForProfile end EventScript_AcceptGiveProfile: msgbox Text_WhatsYourProfile closemessage goto EventScript_GiveProfile end EventScript_CancelGiveProfile: msgbox Text_DecidedNotTo release end EventScript_GaveProfile: setvar GAVE_PROFILE, TRUE setvar VAR_0x8004, 0 special ShowEasyChatMessage waitmessage delay 80 msgbox Text_ProfileSaysSomethingAboutYou release end EventScript_DeclineGiveProfile: msgbox Text_DontBeLikeThat release end EventScript_GivenProfileBefore: msgbox Text_HiWeMeetAgain goto EventScript_AskForNewProfile end EventScript_AskForNewProfile: message Text_ChangeYourProfile waitmessage multichoice 18, 6, MULTICHOICE_YES_NO_INFO_2, FALSE switch VAR_RESULT case 0, EventScript_AcceptGiveNewProfile case 1, EventScript_DeclineGiveNewProfile case 2, EventScript_ProfileInfo2 case SCR_MENU_CANCEL, EventScript_DeclineGiveNewProfile end EventScript_ProfileInfo2: msgbox Text_ExplainProfile goto EventScript_AskForNewProfile end EventScript_AcceptGiveNewProfile: msgbox Text_WhatAreYouLikeNow closemessage goto EventScript_GiveProfile end EventScript_DeclineGiveNewProfile: msgbox Text_LikeProfileWayItIs release end EventScript_GaveSpecialProfile: setvar GAVE_PROFILE, TRUE setvar VAR_0x8004, 0 special ShowEasyChatMessage waitmessage delay 80 msgbox Text_HeardThatBefore release end EventScript_GiveProfile: setvar VAR_0x8004, EASY_CHAT_TYPE_PROFILE call Common_ShowEasyChatScreen lock faceplayer goto_if_eq VAR_0x8004, 0, EventScript_GaveSpecialProfile goto_if_eq VAR_RESULT, FALSE, EventScript_CancelGiveProfile goto_if_eq VAR_RESULT, TRUE, EventScript_GaveProfile end Text_IdLoveToHearYourProfile: .string "Hi, glad to meet you!\p" .string "…That's unfriendly of you.\n" .string "How about saying hi back?\p" .string "So, come on, tell me about\n" .string "yourself.\p" .string "I'd love to hear your profile!$" Text_TellMeWhatsYourProfile: .string "Tell me something good about\n" .string "yourself. What's your profile?$" Text_ExplainProfile: .string "A profile is written using four\n" .string "words or phrases.\p" .string "There're plenty of words to choose\n" .string "from for your profile.\p" .string "The words and phrases are placed\n" .string "in several convenient groups.\p" .string "First, choose a group, then choose\n" .string "a word or phrase.\p" .string "…It's easier than it sounds.\n" .string "Why don't you try it?$" Text_WhatsYourProfile: .string "What's your profile?$" Text_DontBeLikeThat: .string "Aww… Don't be like that.\n" .string "You can tell me your profile.$" Text_DecidedNotTo: .string "Oh, you've decided not to?\n" .string "You're fickle, aren't you?$" Text_HiWeMeetAgain: .string "Hi!\n" .string "We meet again!$" Text_ChangeYourProfile: .string "Would you like to change your\n" .string "profile?$" Text_WhatAreYouLikeNow: .string "What are you like now?\n" .string "I'd really like to know.$" Text_LikeProfileWayItIs: .string "Okay, you like your profile the\n" .string "way it is.\p" .string "I think so, too.$" Text_ProfileSaysSomethingAboutYou: .string "Hmhm…\p" .string "Your profile really says something\n" .string "about who you are.\p" .string "Now that I know you better, it \n" .string "makes us better friends than ever!$" Text_HeardThatBefore: .string "Oh, I've heard that before…\p" .string "My cousin, who lives far away,\n" .string "always used to say that, I think.$" Text_TellMoreNextTime: .string "Please tell me more about\n" .string "yourself next time!$" ================================================ FILE: data/scripts/national_dex_aide.inc ================================================ PokemonCenter_1F_OnLoad:: callnative ShouldSpawnSoftlockClerk goto_if_unset FLAG_SYS_POKEDEX_GET, PokemonCenter_1F_OnLoad_2 compare VAR_RESULT, 0 goto_if_eq PokemonCenter_1F_OnLoad_2 PokemonCenter_1F_OnLoad_1: goto_if_set FLAG_SYS_NATIONAL_DEX, PokemonCenter_1F_OnLoad_7 goto_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, PokemonCenter_1F_OnLoad_7 callnative HasNationalMonToVarResult compare VAR_RESULT, 0 goto_if_eq PokemonCenter_1F_OnLoad_12 specialvar VAR_RESULT, GetPlayerFacingDirection compare VAR_RESULT, DIR_NORTH goto_if_ne PokemonCenter_1F_OnLoad_15 release end PokemonCenter_1F_OnLoad_2: setflag FLAG_TEMP_8 goto PokemonCenter_1F_OnLoad_1 PokemonCenter_1F_OnLoad_7: setvar VAR_TEMP_0, 1 release end PokemonCenter_1F_OnLoad_12: setvar VAR_TEMP_0, 1 release end PokemonCenter_1F_OnLoad_15: callnative CoordsOfPMCExitWarpTo80068007 getplayerxy VAR_0x8008, VAR_0x8009 compare VAR_0x8008, VAR_0x8006 goto_if_eq PokemonCenter_1F_OnLoad_19 PokemonCenter_1F_OnLoad_17: release end PokemonCenter_1F_OnLoad_18: goto PokemonCenter_1F_OnLoad_17 PokemonCenter_1F_OnLoad_19: compare VAR_0x8009, VAR_0x8007 goto_if_eq PokemonCenter_1F_OnLoad_18 goto PokemonCenter_1F_OnLoad_17 NationalDexAideEvent:: callnative HasNationalMonToVarResult compare VAR_RESULT, 0 goto_if_eq NationalDexAideEvent_2 goto_if_set FLAG_SYS_NATIONAL_DEX, NationalDexAideEvent_5 goto_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, NationalDexAideEvent_5 callnative HideWarpArrowSprite lockall applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark waitmovement 0 delay 60 applymovement OBJ_EVENT_ID_PLAYER, NationalDexAideEvent_Movement_BackStep waitmovement 0 playse SE_EXIT getplayerxy VAR_0x8008, VAR_0x8009 addvar VAR_0x8009, 1 setobjectxyperm 2, VAR_0x8008, VAR_0x8009 addobject 2 applymovement 2, Common_Movement_WalkInPlaceFasterUp waitmovement 0 textcolor 0 msgbox NationalDexAideEvent_Text_0 closemessage textcolor 3 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox NationalDexAideEvent_Text_1 closemessage applymovement 2, Common_Movement_WalkInPlaceFasterDown waitmovement 0 textcolor 0 msgbox NationalDexAideEvent_Text_2 applymovement 2, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox NationalDexAideEvent_Text_3 closemessage applymovement 2, Common_Movement_WalkInPlaceFasterUp waitmovement 0 playfanfare MUS_OBTAIN_KEY_ITEM textcolor 3 message PalletTown_ProfessorOaksLab_Text_PlayersPokedexWasUpgraded waitmessage waitfanfare closemessage textcolor 0 special EnableNationalPokedex msgbox NationalDexAideEvent_Text_4 closemessage delay 20 playse SE_EXIT applymovement 2, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 5 removeobject 2 setvar VAR_TEMP_0, 1 releaseall end NationalDexAideEvent_2: setvar VAR_TEMP_0, 1 release end NationalDexAideEvent_5: setvar VAR_TEMP_0, 1 release end NationalDexAideEvent_Movement_BackStep: lock_facing_direction walk_up unlock_facing_direction step_end NationalDexAideEvent_Text_0: .string "{PLAYER}! Hi!\nI've been looking for you!\pRemember me?\nI'm one of PROF. OAK'S AIDES.\pPROF. OAK has improved the\nPOKéDEX again and I'm supposed\lto upgrade yours.\pCan I see your POKéDEX?$" NationalDexAideEvent_Text_1: .string "The AIDE took your POKéDEX\nunit.$" NationalDexAideEvent_Text_2: .string "… … … … … …\p… … … … … …$" NationalDexAideEvent_Text_3: .string "…And that's done!\pNow this unit can record data on\na lot more POKéMON.\pHere you go!$" NationalDexAideEvent_Text_4: .string "Keep catching POKéMON to fill up\nyour improved POKéDEX!\pI better get back to the LAB.\nSee you, {PLAYER}!$" ================================================ FILE: data/scripts/national_dex_aide.pory ================================================ const LOCALID_AIDE = 2 script PokemonCenter_1F_OnLoad { callnative(ShouldSpawnSoftlockClerk) if(!flag(FLAG_SYS_POKEDEX_GET) || !var(VAR_RESULT)) { setflag(FLAG_TEMP_8) } if(flag(FLAG_SYS_NATIONAL_DEX) || !flag(FLAG_SYS_RECEIVED_EXTENDED_DEX)) { setvar(VAR_TEMP_0, 1) release end } callnative(HasNationalMonToVarResult) if(!var(VAR_RESULT)) { setvar(VAR_TEMP_0, 1) release end } specialvar(VAR_RESULT, GetPlayerFacingDirection) if(var(VAR_RESULT) != DIR_NORTH) { callnative(CoordsOfPMCExitWarpTo80068007) getplayerxy(VAR_0x8008, VAR_0x8009) if((var(VAR_0x8008) == VAR_0x8006) && (var(VAR_0x8009) == VAR_0x8007)) { //goto(NationalDexAideEvent) } release end } release end } script NationalDexAideEvent { callnative(HasNationalMonToVarResult) if(!var(VAR_RESULT)) { setvar(VAR_TEMP_0, 1) release end } if(flag(FLAG_SYS_NATIONAL_DEX) || !flag(FLAG_SYS_RECEIVED_EXTENDED_DEX)) { setvar(VAR_TEMP_0, 1) release end } callnative(HideWarpArrowSprite) lockall applymovement(OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown) waitmovement(0) playse(SE_PIN) applymovement(OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark) waitmovement(0) delay(60) applymovement(OBJ_EVENT_ID_PLAYER, NationalDexAideEvent_Movement_BackStep) waitmovement(0) playse(SE_EXIT) getplayerxy(VAR_0x8008, VAR_0x8009) addvar(VAR_0x8009, 1) setobjectxyperm(LOCALID_AIDE, VAR_0x8008, VAR_0x8009) addobject(LOCALID_AIDE) applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterUp) waitmovement(0) textcolor(0) msgbox("{PLAYER}! Hi!\nI've been looking for you!\pRemember me?\nI'm one of PROF. OAK'S AIDES.\pPROF. OAK has improved the\nPOKéDEX again and I'm supposed\lto upgrade yours.\pCan I see your POKéDEX?") closemessage textcolor(3) applymovement(OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown) waitmovement(0) msgbox("The AIDE took your POKéDEX\nunit.") closemessage applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterDown) waitmovement(0) textcolor(0) msgbox("… … … … … …\p… … … … … …") applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterUp) waitmovement(0) msgbox("…And that's done!\pNow this unit can record data on\na lot more POKéMON.\pHere you go!") closemessage applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterUp) waitmovement(0) playfanfare(MUS_OBTAIN_KEY_ITEM) textcolor(3) message(PalletTown_ProfessorOaksLab_Text_PlayersPokedexWasUpgraded) waitmessage waitfanfare closemessage textcolor(0) special(EnableNationalPokedex) msgbox("Keep catching POKéMON to fill up\nyour improved POKéDEX!\pI better get back to the LAB.\nSee you, {PLAYER}!") closemessage delay(20) playse(SE_EXIT) applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterDown) waitmovement(0) delay(5) removeobject(LOCALID_AIDE) setvar(VAR_TEMP_0, 1) releaseall end }movement NationalDexAideEvent_Movement_BackStep { lock_facing_direction walk_up unlock_facing_direction } ================================================ FILE: data/scripts/obtain_item.inc ================================================ @ Unused, handled by textcolor script cmd EventScript_SaveTextColor:: copyvar VAR_PREV_TEXT_COLOR, VAR_TEXT_COLOR return EventScript_RestorePrevTextColor:: copyvar VAR_TEXT_COLOR, VAR_PREV_TEXT_COLOR return Std_ObtainItem:: copyvar VAR_PREV_TEXT_COLOR, VAR_TEXT_COLOR textcolor NPC_TEXT_COLOR_NEUTRAL additem VAR_0x8000, VAR_0x8001 copyvar VAR_0x8007, VAR_RESULT call EventScript_ObtainItemMessage copyvar VAR_TEXT_COLOR, VAR_PREV_TEXT_COLOR return EventScript_ObtainItemMessage:: bufferitemnameplural STR_VAR_2, VAR_0x8000, VAR_0x8001 checkitemtype VAR_0x8000 call EventScript_BufferPocketNameTryFanfare call_if_eq VAR_0x8007, TRUE, EventScript_ObtainedItem call_if_eq VAR_0x8007, FALSE, EventScript_NoRoomForItem return EventScript_BufferPocketNameTryFanfare:: switch VAR_RESULT case POCKET_ITEMS, EventScript_BufferItemsPocket case POCKET_KEY_ITEMS, EventScript_BufferKeyItemsPocket case POCKET_POKE_BALLS, EventScript_BufferPokeBallsPocket case POCKET_TM_CASE, EventScript_BufferTMCase case POCKET_BERRY_POUCH, EventScript_BufferBerryPouch case POCKET_MEDICINE, EventScript_BufferMedicinePocket case POCKET_HELD_ITEMS, EventScript_BufferHeldItemsPocket end EventScript_BufferItemsPocket:: bufferstdstring STR_VAR_3, STDSTRING_ITEMS_POCKET call_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem return EventScript_BufferKeyItemsPocket:: bufferstdstring STR_VAR_3, STDSTRING_KEY_ITEMS_POCKET call_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem return EventScript_BufferPokeBallsPocket:: bufferstdstring STR_VAR_3, STDSTRING_POKEBALLS_POCKET call_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem return EventScript_BufferTMCase:: bufferstdstring STR_VAR_3, STDSTRING_TM_CASE call_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedTMHM return EventScript_BufferBerryPouch:: bufferstdstring STR_VAR_3, STDSTRING_BERRY_POUCH call_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem return EventScript_BufferMedicinePocket:: bufferstdstring 2, STDSTRING_MEDICINE_POCKET call_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem return EventScript_BufferHeldItemsPocket:: bufferstdstring 2, STDSTRING_HELD_ITEMS_POCKET call_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem return EventScript_ObtainedItem:: message Text_ObtainedTheX waitfanfare waitmessage msgbox Text_PutItemAway setvar VAR_RESULT, 1 return EventScript_NoRoomForItem:: setvar VAR_RESULT, FALSE return EventScript_PlayFanfareObtainedItem:: playfanfare MUS_LEVEL_UP return EventScript_PlayFanfareObtainedTMHM:: playfanfare MUS_LEVEL_UP return Std_ObtainDecoration:: adddecoration VAR_0x8000 copyvar VAR_0x8007, VAR_RESULT call EventScript_ObtainDecorMessage return EventScript_ObtainDecorMessage:: bufferdecorationname STR_VAR_2, VAR_0x8000 call_if_eq VAR_0x8007, TRUE, EventScript_ObtainedDecor call_if_eq VAR_0x8007, FALSE, EventScript_NoRoomForDecor return EventScript_ObtainedDecor:: playfanfare MUS_OBTAIN_ITEM message Text_ObtainedTheDecor waitfanfare waitmessage msgbox Text_DecorTransferredToPC setvar VAR_RESULT, TRUE return EventScript_NoRoomForDecor:: setvar VAR_RESULT, FALSE return Std_FindItem:: lock faceplayer waitse copyvar VAR_0x8004, VAR_0x8000 copyvar VAR_0x8005, VAR_0x8001 checkitemspace VAR_0x8000, VAR_0x8001 copyvar VAR_0x8007, VAR_RESULT bufferitemname STR_VAR_2, VAR_0x8000 checkitemtype VAR_0x8000 call EventScript_BufferPocketNameTryFanfare call_if_eq VAR_0x8007, TRUE, EventScript_PickUpItem call_if_eq VAR_0x8007, FALSE, EventScript_NoRoomToPickUpItem release return EventScript_PickUpItem:: removeobject VAR_LAST_TALKED additem VAR_0x8004, VAR_0x8005 specialvar VAR_RESULT, BufferTMHMMoveName copyvar VAR_0x8008, VAR_RESULT call_if_eq VAR_0x8008, TRUE, EventScript_FoundTMHM call_if_eq VAR_0x8008, FALSE, EventScript_FoundItem waitfanfare waitmessage msgbox Text_PutItemAway return EventScript_FoundTMHM:: message Text_FoundTMHMContainsMove return EventScript_FoundItem:: message Text_FoundOneItem return EventScript_NoRoomToPickUpItem:: msgbox Text_ObtainedTheX msgbox Text_TooBadBagFull setvar VAR_RESULT, FALSE return EventScript_HiddenItemScript:: lockall textcolor NPC_TEXT_COLOR_NEUTRAL waitse goto_if_eq VAR_0x8005, 0, EventScript_TryPickUpHiddenCoins call EventScript_TryPickUpHiddenItem goto_if_eq VAR_0x8007, TRUE, EventScript_PickedUpHiddenItem goto_if_eq VAR_0x8007, FALSE, EventScript_NoRoomForHiddenItem end EventScript_TryPickUpHiddenItem:: additem VAR_0x8005, VAR_0x8006 copyvar VAR_0x8007, VAR_RESULT bufferitemname STR_VAR_2, VAR_0x8005 checkitemtype VAR_0x8005 call EventScript_BufferPocketNameTryFanfare return EventScript_PickedUpHiddenItem:: call_if_eq VAR_0x8006, 1, EventScript_FoundSingleItem call_if_ne VAR_0x8006, 1, EventScript_FoundMultipleItems waitfanfare waitmessage msgbox Text_PutItemAway special SetHiddenItemFlag releaseall end EventScript_FoundSingleItem:: message Text_FoundOneItem return EventScript_FoundCoins:: buffernumberstring STR_VAR_1, VAR_0x8006 message Text_FoundXCoins return EventScript_FoundMultipleItems:: buffernumberstring STR_VAR_1, VAR_0x8006 message Text_FoundXItems return EventScript_NoRoomForHiddenItem:: msgbox Text_FoundOneItem msgbox Text_TooBadBagFull setvar VAR_RESULT, 0 releaseall end EventScript_TryPickUpHiddenCoins:: goto_if_unset FLAG_GOT_COIN_CASE, EventScript_NoCaseForHiddenCoins checkcoins VAR_RESULT specialvar VAR_RESULT, CheckAddCoins goto_if_eq VAR_RESULT, FALSE, EventScript_HiddenCoinsButCaseIsFull addcoins VAR_0x8006 bufferstdstring STR_VAR_2, STDSTRING_COINS call EventScript_PlayFanfareObtainedItem call EventScript_FoundCoins waitfanfare waitmessage msgbox Text_PutCoinsAwayInCoinCase special SetHiddenItemFlag releaseall end EventScript_HiddenCoinsButCaseIsFull:: buffernumberstring STR_VAR_1, VAR_0x8006 bufferstdstring STR_VAR_2, STDSTRING_COINS msgbox Text_FoundXCoins msgbox Text_CoinCaseIsFull setvar VAR_RESULT, 0 releaseall end EventScript_NoCaseForHiddenCoins:: buffernumberstring STR_VAR_1, VAR_0x8006 bufferstdstring STR_VAR_2, STDSTRING_COINS msgbox Text_FoundXCoins msgbox Text_NothingToPutThemIn setvar VAR_RESULT, 0 releaseall end ================================================ FILE: data/scripts/pc.inc ================================================ EventScript_PC:: goto_if_questlog EventScript_ReleaseEnd lockall goto_if_set FLAG_SYS_PC_STORAGE_DISABLED, EventScript_PCDisabled setvar VAR_0x8004, HELPCONTEXT_PC special Script_SetHelpContext setvar VAR_0x8004, 0 special AnimatePcTurnOn playse SE_PC_ON msgbox Text_BootedUpPC goto EventScript_PCMainMenu end @ For when the player first arrives on One Island EventScript_PCDisabled:: msgbox OneIsland_PokemonCenter_1F_Text_UsualPCServicesUnavailable releaseall end EventScript_PCMainMenu:: message Text_AccessWhichPC waitmessage special CreatePCMenu waitstate goto EventScript_ChoosePCMenu end EventScript_ChoosePCMenu:: switch VAR_RESULT case 0, EventScript_AccessPokemonStorage case 1, EventScript_AccessPlayersPC case 2, EventScript_AccessProfOaksPC case 3, EventScript_AccessHallOfFame case 4, EventScript_TurnOffPC case SCR_MENU_CANCEL, EventScript_TurnOffPC end EventScript_AccessPlayersPC:: playse SE_PC_LOGIN msgbox Text_AccessedPlayersPC special PlayerPC waitstate goto EventScript_PCMainMenu end EventScript_AccessPokemonStorage:: playse SE_PC_LOGIN call_if_unset FLAG_SYS_NOT_SOMEONES_PC, EventScript_AccessSomeonesPC call_if_set FLAG_SYS_NOT_SOMEONES_PC, EventScript_AccessBillsPC msgbox Text_OpenedPkmnStorage special ShowPokemonStorageSystemPC waitstate setvar VAR_0x8004, HELPCONTEXT_PC special Script_SetHelpContext goto EventScript_PCMainMenu end EventScript_AccessSomeonesPC:: msgbox Text_AccessedSomeonesPC return EventScript_AccessBillsPC:: msgbox Text_AccessedBillsPC return EventScript_TurnOffPC:: setvar VAR_0x8004, 0 playse SE_PC_OFF special AnimatePcTurnOff special SetHelpContextForMap releaseall end EventScript_AccessHallOfFame:: goto_if_unset FLAG_SYS_GAME_CLEAR, EventScript_TurnOffPC playse SE_PC_LOGIN setvar VAR_0x8004, HELPCONTEXT_PC_MISC special BackupHelpContext special Script_SetHelpContext special HallOfFamePCBeginFade waitstate special RestoreHelpContext goto EventScript_ChoosePCMenu end EventScript_AccessProfOaksPC:: goto_if_unset FLAG_SYS_POKEDEX_GET, EventScript_TurnOffPC playse SE_PC_LOGIN msgbox Text_AccessedProfOaksPC msgbox Text_HavePokedexRated, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_ExitOaksPC setflag FLAG_OAKS_RATING_IS_VIA_PC call PokedexRating_EventScript_Rate clearflag FLAG_OAKS_RATING_IS_VIA_PC goto EventScript_ExitOaksPC end EventScript_ExitOaksPC:: msgbox Text_ClosedLinkToProfOaksPC goto EventScript_PCMainMenu end ================================================ FILE: data/scripts/pc_transfer.inc ================================================ EventScript_GetGiftMonPartySlot:: getpartysize subvar VAR_RESULT, 1 copyvar VAR_0x8004, VAR_RESULT return EventScript_NameReceivedBoxMon:: fadescreen FADE_TO_BLACK special ChangeBoxPokemonNickname waitstate lock faceplayer return EventScript_TransferredToPC:: bufferboxname STR_VAR_1, VAR_PC_BOX_TO_SEND_MON bufferspeciesname STR_VAR_2, VAR_TEMP_1 call_if_unset FLAG_SYS_NOT_SOMEONES_PC, EventScript_TransferredSomeonesPC call_if_set FLAG_SYS_NOT_SOMEONES_PC, EventScript_TransferredBillsPC return EventScript_TransferredSomeonesPC:: specialvar VAR_RESULT, ShouldShowBoxWasFullMessage goto_if_eq VAR_RESULT, TRUE, EventScript_TransferredSomeonesPCBoxFull msgbox Text_MonSentToBoxInSomeonesPC return EventScript_TransferredSomeonesPCBoxFull:: specialvar VAR_RESULT, GetPCBoxToSendMon bufferboxname STR_VAR_3, VAR_RESULT msgbox Text_MonSentToBoxSomeonesBoxFull return EventScript_TransferredBillsPC:: specialvar VAR_RESULT, ShouldShowBoxWasFullMessage goto_if_eq VAR_RESULT, TRUE, EventScript_TransferredBillsPCBoxFull msgbox Text_MonSentToBoxInBillsPC return EventScript_TransferredBillsPCBoxFull:: specialvar VAR_RESULT, GetPCBoxToSendMon bufferboxname STR_VAR_3, VAR_RESULT msgbox Text_MonSentToBoxBillsBoxFull return ================================================ FILE: data/scripts/pkmn_center_nurse.inc ================================================ EventScript_PkmnCenterNurse:: goto_if_questlog EventScript_ReleaseEnd callnative CheckTrainerCardStars compare VAR_RESULT, 2 goto_if_ge EventScript_PkmnCenterNurseTrainerCard message Text_WelcomeWantToHealPkmn waitmessage multichoice 19, 8, MULTICHOICE_YES_NO, FALSE | (TRUE << 1) switch VAR_RESULT case 0, EventScript_PkmnCenterNurse_HealPkmn case 1 EventScript_PkmnCenterNurse_Goodbye case SCR_MENU_CANCEL, EventScript_PkmnCenterNurse_Goodbye end EventScript_PkmnCenterNurse_HealPkmn:: incrementgamestat GAME_STAT_USED_POKECENTER message Text_TakeYourPkmnForFewSeconds waitmessage call EventScript_PkmnCenterNurse_TakeAndHealPkmn special SetUsedPkmnCenterQuestLogEvent goto EventScript_PkmnCenterNurse_ReturnPkmn end EventScript_PkmnCenterNurse_TakeAndHealPkmn:: applymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 dofieldeffect FLDEFF_POKECENTER_HEAL callnative CableClub_OnResumeFunc waitfieldeffect FLDEFF_POKECENTER_HEAL applymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterDown waitmovement 0 special HealPlayerParty return EventScript_PkmnCenterNurse_CheckTrainerTowerAndUnionRoom:: specialvar VAR_RESULT, IsPlayerNotInTrainerTowerLobby goto_if_eq VAR_RESULT, FALSE, EventScript_PkmnCenterNurse_ReturnPkmn specialvar VAR_RESULT, BufferUnionRoomPlayerName copyvar VAR_0x8008, VAR_RESULT goto_if_eq VAR_0x8008, 0, EventScript_PkmnCenterNurse_ReturnPkmn goto_if_eq VAR_0x8008, 1, EventScript_PkmnCenterNurse_PlayerWaitingInUionRoom end EventScript_PkmnCenterNurse_ReturnPkmn:: message Text_RestoredPkmnToFullHealth waitmessage applymovement VAR_LAST_TALKED, Movement_Bow waitmovement 0 msgbox Text_WeHopeToSeeYouAgain return EventScript_PkmnCenterNurse_PlayerWaitingInUionRoom:: goto_if_set FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER, EventScript_PkmnCenterNurse_ReturnPkmn msgbox Text_RestoredPkmnToFullHealth setflag FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER message Text_PlayerIsPlayingRightNowGoForIt waitmessage applymovement VAR_LAST_TALKED, Movement_Bow waitmovement 0 msgbox Text_WeHopeToSeeYouAgain return EventScript_PkmnCenterNurse_Goodbye:: msgbox Text_WeHopeToSeeYouAgain return Movement_Bow:: nurse_joy_bow delay_4 step_end EventScript_PkmnCenterNurseTrainerCard:: goto_if_unset FLAG_SHOWN_COPPER_CARD_TO_NURSE, EventScript_PkmnCenterNurseTrainerCardFirst message Text_WelcomeTrainerCard waitmessage multichoice 19, 8, MULTICHOICE_YES_NO, FALSE | (TRUE << 1) switch VAR_RESULT case 0, EventScript_PkmnCenterNurse_HealPkmnTrainerCard case 1 EventScript_PkmnCenterNurse_Goodbye case SCR_MENU_CANCEL, EventScript_PkmnCenterNurse_Goodbye end EventScript_PkmnCenterNurseTrainerCardFirst:: message Text_WelcomeTrainerCardFirst waitmessage setflag FLAG_SHOWN_COPPER_CARD_TO_NURSE multichoice 19, 8, MULTICHOICE_YES_NO, FALSE | (TRUE << 1) switch VAR_RESULT case 0, EventScript_PkmnCenterNurse_HealPkmnTrainerCard case 1 EventScript_PkmnCenterNurse_Goodbye case SCR_MENU_CANCEL, EventScript_PkmnCenterNurse_Goodbye end EventScript_PkmnCenterNurse_HealPkmnTrainerCard:: incrementgamestat GAME_STAT_USED_POKECENTER message Text_TakeYourPkmnForFewSecondsTrainerCard waitmessage call EventScript_PkmnCenterNurse_TakeAndHealPkmn special SetUsedPkmnCenterQuestLogEvent goto EventScript_PkmnCenterNurse_ReturnPkmnTrainerCard end EventScript_PkmnCenterNurse_ReturnPkmnTrainerCard:: applymovement VAR_LAST_TALKED, Movement_Bow waitmovement 0 msgbox Text_WeHopeToSeeYouAgain return Text_WelcomeTrainerCardFirst:: .string "Welcome to our POKéMON CENTER!\p" .string "Would you like me to…\n" .string "Th-that TRAINER CARD!\p" .string "That wonderful shade!\n" .string "And all those stars!\p" .string "I've seen several TRAINERS\n" .string "with BRONZE CARDS up to now…\p" .string "But you're the first to top them\n" .string "with that TRAINER CARD.\p" .string "Please, {PLAYER}, may I have the\n" .string "honor of healing your POKéMON?$" Text_TakeYourPkmnForFewSecondsTrainerCard:: .string "I will be pleased to take your\n" .string "POKéMON for a few seconds.$" Text_WelcomeTrainerCard:: .string "Great to see you, {PLAYER}!\n" .string "You want the usual, right?$" EventScript_SoftlockClerk:: goto_if_set FLAG_TEMP_7, EventScript_SoftlockClerk_GaveAlready msgbox Text_SoftlockClerk_Initial, MSGBOX_NPC textcolor 3 checkitemspace ITEM_POKE_BALL, 5 compare VAR_RESULT, FALSE goto_if_eq EventScript_SoftlockClerk_NoRoom giveitem_msg PalletTown_ProfessorOaksLab_Text_ReceivedFivePokeBalls, ITEM_POKE_BALL, 5 setflag FLAG_TEMP_7 release end EventScript_SoftlockClerk_GaveAlready:: msgbox Text_SoftlockClerk_GaveAlready, MSGBOX_NPC end EventScript_SoftlockClerk_NoRoom:: msgbox CeladonCity_Restaurant_Text_MakeRoomForThis, MSGBOX_NPC end Text_SoftlockClerk_Initial:: .string "Hello, TRAINER!\p" .string "We've partnered with the POKéMON\n" .string "CENTER to do a special giveaway!\p" .string "Congratulations, you're the lucky\n" .string "winner! Enjoy your prize!$" Text_SoftlockClerk_GaveAlready:: .string "Hello, TRAINER!\n" .string "Put those POKé BALLS to good use!$" ================================================ FILE: data/scripts/pokedex_rating.inc ================================================ PokedexRating_EventScript_RateInPerson:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording call_if_set FLAG_OAK_SAW_DEX_COMPLETION, PokedexRating_EventScript_DexCompleteIntro call_if_unset FLAG_OAK_SAW_DEX_COMPLETION, PokedexRating_EventScript_NormalIntro call PokedexRating_EventScript_Rate return PokedexRating_EventScript_DexCompleteIntro:: msgbox PokedexRating_Text_LoveSeeingYourPokedex return PokedexRating_EventScript_NormalIntro:: msgbox PokedexRating_Text_HowIsPokedexComingAlong return PokedexRating_EventScript_ShowRatingMsg:: copyvar VAR_0x8004, VAR_0x8009 special GetProfOaksRatingMessage waitmessage call_if_eq VAR_RESULT, FALSE, PokedexRating_EventScript_NormalFanfare call_if_eq VAR_RESULT, TRUE, PokedexRating_EventScript_DexCompleteFanfare waitfanfare waitbuttonpress return PokedexRating_EventScript_NormalFanfare:: playfanfare MUS_DEX_RATING return PokedexRating_EventScript_DexCompleteFanfare:: playfanfare MUS_EVOLVED return PokedexRating_EventScript_Rate:: setvar VAR_0x8004, HELPCONTEXT_PC_MISC special BackupHelpContext special Script_SetHelpContext setvar VAR_0x8004, 0 specialvar VAR_RESULT, GetPokedexCount copyvar VAR_0x8008, VAR_0x8005 copyvar VAR_0x8009, VAR_0x8006 copyvar VAR_0x800A, VAR_RESULT buffernumberstring STR_VAR_1, VAR_0x8008 @ Num Kanto Seen buffernumberstring STR_VAR_2, VAR_0x8009 @ Num Kanto Caught msgbox PokedexRating_Text_SeenXOwnedY call_if_unset FLAG_OAKS_RATING_IS_VIA_PC, PokedexRating_EventScript_SetTextColor call PokedexRating_EventScript_ShowRatingMsg goto_if_eq VAR_0x800A, FALSE, PokedexRating_EventScript_EndRating @ National Dex not enabled setvar VAR_0x8004, 1 specialvar VAR_RESULT, GetPokedexCount copyvar VAR_0x8008, VAR_0x8005 copyvar VAR_0x8009, VAR_0x8006 buffernumberstring STR_VAR_1, VAR_0x8008 @ Num National Seen buffernumberstring STR_VAR_2, VAR_0x8009 @ Num National Caught msgbox PokedexRating_Text_NationalDexSeenXOwnedY specialvar VAR_RESULT, HasAllMons goto_if_eq VAR_RESULT, FALSE, PokedexRating_EventScript_DexIncomplete goto_if_eq VAR_RESULT, TRUE, PokedexRating_EventScript_DexComplete end PokedexRating_EventScript_SetTextColor:: textcolor NPC_TEXT_COLOR_MALE return PokedexRating_EventScript_DexIncomplete:: msgbox PokedexRating_Text_LookForwardToFilledNationalDex goto PokedexRating_EventScript_EndRating end PokedexRating_EventScript_DexComplete:: setflag FLAG_OAK_SAW_DEX_COMPLETION msgbox PokedexRating_Text_YouveCompletedDex goto PokedexRating_EventScript_EndRating end PokedexRating_EventScript_EndRating:: special RestoreHelpContext return ================================================ FILE: data/scripts/pokemon_league.inc ================================================ PokemonLeague_EventScript_OpenDoor:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_Delay32 waitmovement 0 playse SE_RS_DOOR call PokemonLeague_EventScript_SetDoorOpen special DrawWholeMapView setflag FLAG_TEMP_4 return PokemonLeague_EventScript_EnterRoom:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkUp5 waitmovement 0 setflag FLAG_TEMP_2 playse SE_UNLOCK call PokemonLeague_EventScript_CloseEntry special DrawWholeMapView return PokemonLeague_EventScript_SetDoorOpen:: setmetatile 6, 1, METATILE_PokemonLeague_Door_Top_Open, 1 setmetatile 6, 2, METATILE_PokemonLeague_Door_Mid_Open, 0 return PokemonLeague_EventScript_PreventExit:: lockall textcolor NPC_TEXT_COLOR_MALE msgbox Text_VoiceRangOutDontRunAway closemessage applymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_Movement_ForcePlayerIn waitmovement 0 releaseall end PokemonLeague_EventScript_OpenDoorLance:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_Delay32 waitmovement 0 playse SE_RS_DOOR setmetatile 6, 4, METATILE_PokemonLeague_Door_Top_Open, 1 setmetatile 6, 5, METATILE_PokemonLeague_Door_Mid_Open, 0 special DrawWholeMapView setflag FLAG_TEMP_4 return PokemonLeague_EventScript_SetDoorOpenLance:: setmetatile 6, 4, METATILE_PokemonLeague_Door_Top_Open, 1 setmetatile 6, 5, METATILE_PokemonLeague_Door_Mid_Open, 0 return PokemonLeague_EventScript_CloseEntry:: setmetatile 5, 11, METATILE_PokemonLeague_Entry_TopLeft_Closed, 1 setmetatile 6, 11, METATILE_PokemonLeague_Entry_TopMid_Closed, 1 setmetatile 7, 11, METATILE_PokemonLeague_Entry_TopRight_Closed, 1 setmetatile 5, 12, METATILE_PokemonLeague_Entry_BottomLeft_Closed, 1 setmetatile 6, 12, METATILE_PokemonLeague_Entry_BottomMid_Closed, 1 setmetatile 7, 12, METATILE_PokemonLeague_Entry_BottomRight_Closed, 1 return PokemonLeague_Movement_ForcePlayerIn:: walk_up step_end PokemonLeague_EventScript_DoLightingEffect:: special DoPokemonLeagueLightingEffect return ================================================ FILE: data/scripts/pokemon_mansion.inc ================================================ PokemonMansion_EventScript_SecretSwitch:: msgbox PokemonMansion_Text_PressSecretSwitch, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, PokemonMansion_EventScript_DontPressSwitch msgbox PokemonMansion_Text_WhoWouldnt goto_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_ResetSwitch setflag FLAG_POKEMON_MANSION_SWITCH_STATE switch VAR_0x8004 case 0, PokemonMansion_EventScript_PressSwitch_1F case 1, PokemonMansion_EventScript_PressSwitch_2F case 2, PokemonMansion_EventScript_PressSwitch_3F case 3, PokemonMansion_EventScript_PressSwitch_B1F end PokemonMansion_EventScript_ResetSwitch:: clearflag FLAG_POKEMON_MANSION_SWITCH_STATE switch VAR_0x8004 case 0, PokemonMansion_EventScript_ResetSwitch_1F case 1, PokemonMansion_EventScript_ResetSwitch_2F case 2, PokemonMansion_EventScript_ResetSwitch_3F case 3, PokemonMansion_EventScript_ResetSwitch_B1F end PokemonMansion_EventScript_DontPressSwitch:: msgbox PokemonMansion_Text_NotQuiteYet releaseall end PokemonMansion_EventScript_PressSwitch_1F:: setmetatile 22, 10, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 23, 10, METATILE_PokemonMansion_Floor, 0 setmetatile 24, 10, METATILE_PokemonMansion_Floor, 0 setmetatile 22, 11, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 23, 11, METATILE_PokemonMansion_Floor, 0 setmetatile 24, 11, METATILE_PokemonMansion_Floor, 0 setmetatile 27, 25, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 28, 25, METATILE_PokemonMansion_Floor, 0 setmetatile 29, 25, METATILE_PokemonMansion_Floor, 0 setmetatile 27, 26, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 28, 26, METATILE_PokemonMansion_Floor, 0 setmetatile 29, 26, METATILE_PokemonMansion_Floor, 0 setmetatile 32, 25, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 33, 25, METATILE_PokemonMansion_Floor, 0 setmetatile 34, 25, METATILE_PokemonMansion_Floor, 0 setmetatile 32, 26, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 33, 26, METATILE_PokemonMansion_Floor, 0 setmetatile 34, 26, METATILE_PokemonMansion_Floor, 0 setmetatile 31, 18, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1 setmetatile 32, 18, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1 setmetatile 33, 18, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1 setmetatile 31, 19, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1 setmetatile 32, 19, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1 setmetatile 33, 19, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1 setmetatile 5, 4, METATILE_PokemonMansion_Statue_RedEyes, 0 return PokemonMansion_EventScript_ResetSwitch_1F:: setmetatile 22, 10, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1 setmetatile 23, 10, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1 setmetatile 24, 10, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1 setmetatile 22, 11, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1 setmetatile 23, 11, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1 setmetatile 24, 11, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1 setmetatile 27, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1 setmetatile 28, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1 setmetatile 29, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1 setmetatile 27, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1 setmetatile 28, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1 setmetatile 29, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1 setmetatile 32, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1 setmetatile 33, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1 setmetatile 34, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1 setmetatile 32, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1 setmetatile 33, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1 setmetatile 34, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1 setmetatile 31, 18, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 32, 18, METATILE_PokemonMansion_Floor, 0 setmetatile 33, 18, METATILE_PokemonMansion_Floor, 0 setmetatile 31, 19, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 32, 19, METATILE_PokemonMansion_Floor, 0 setmetatile 33, 19, METATILE_PokemonMansion_Floor, 0 setmetatile 5, 4, METATILE_PokemonMansion_Statue_BlackEyes, 0 return PokemonMansion_EventScript_PressSwitch_2F:: setmetatile 24, 14, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 25, 14, METATILE_PokemonMansion_Floor, 0 setmetatile 26, 14, METATILE_PokemonMansion_Floor, 0 setmetatile 24, 15, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 25, 15, METATILE_PokemonMansion_Floor, 0 setmetatile 26, 15, METATILE_PokemonMansion_Floor, 0 setmetatile 10, 28, METATILE_PokemonMansion_Wall_EndPost_Mid, 1 setmetatile 10, 29, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1 setmetatile 10, 30, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 10, 31, METATILE_PokemonMansion_Floor, 0 setmetatile 10, 32, METATILE_PokemonMansion_Wall_EndCap, 0 setmetatile 12, 4, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1 setmetatile 12, 5, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1 setmetatile 12, 6, METATILE_PokemonMansion_Barrier_Vertical_MidShadow, 1 setmetatile 12, 7, METATILE_PokemonMansion_Barrier_Vertical_Mid, 1 setmetatile 12, 8, METATILE_PokemonMansion_Barrier_Vertical_Bottom, 1 setmetatile 2, 15, METATILE_PokemonMansion_Statue_RedEyes, 0 return PokemonMansion_EventScript_ResetSwitch_2F:: setmetatile 24, 14, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1 setmetatile 25, 14, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1 setmetatile 26, 14, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1 setmetatile 24, 15, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1 setmetatile 25, 15, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1 setmetatile 26, 15, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1 setmetatile 10, 28, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1 setmetatile 10, 29, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1 setmetatile 10, 30, METATILE_PokemonMansion_Barrier_Vertical_MidShadow, 1 setmetatile 10, 31, METATILE_PokemonMansion_Barrier_Vertical_Mid, 1 setmetatile 10, 32, METATILE_PokemonMansion_Barrier_Vertical_Bottom, 1 setmetatile 12, 4, METATILE_PokemonMansion_Wall_EndPost_Mid, 1 setmetatile 12, 5, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1 setmetatile 12, 6, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 12, 7, METATILE_PokemonMansion_Floor, 0 setmetatile 12, 8, METATILE_PokemonMansion_Wall_EndCap, 0 setmetatile 2, 15, METATILE_PokemonMansion_Statue_BlackEyes, 0 return PokemonMansion_EventScript_PressSwitch_3F:: setmetatile 17, 11, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 18, 11, METATILE_PokemonMansion_Floor, 0 setmetatile 19, 11, METATILE_PokemonMansion_Floor, 0 setmetatile 17, 12, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 18, 12, METATILE_PokemonMansion_Floor, 0 setmetatile 19, 12, METATILE_PokemonMansion_Floor, 0 setmetatile 21, 4, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1 setmetatile 21, 5, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1 setmetatile 21, 6, METATILE_PokemonMansion_Barrier_Vertical_MidShadow, 1 setmetatile 21, 7, METATILE_PokemonMansion_Barrier_Vertical_Mid, 1 setmetatile 21, 8, METATILE_PokemonMansion_Barrier_Vertical_Bottom, 1 setmetatile 12, 4, METATILE_PokemonMansion_Statue_RedEyes, 0 return PokemonMansion_EventScript_ResetSwitch_3F:: setmetatile 17, 11, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1 setmetatile 18, 11, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1 setmetatile 19, 11, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1 setmetatile 17, 12, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1 setmetatile 18, 12, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1 setmetatile 19, 12, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1 setmetatile 21, 4, METATILE_PokemonMansion_Wall_EndPost_Mid, 1 setmetatile 21, 5, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1 setmetatile 21, 6, METATILE_PokemonMansion_Floor_ShadeFull, 0 setmetatile 21, 7, METATILE_PokemonMansion_Floor, 0 setmetatile 21, 8, METATILE_PokemonMansion_Wall_EndCap, 0 setmetatile 12, 4, METATILE_PokemonMansion_Statue_BlackEyes, 0 return PokemonMansion_EventScript_PressSwitch_B1F:: setmetatile 33, 20, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1 setmetatile 34, 20, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1 setmetatile 35, 20, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1 setmetatile 33, 21, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft_Basement, 1 setmetatile 34, 21, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid_Basement, 1 setmetatile 35, 21, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight_Basement, 1 setmetatile 16, 26, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1 setmetatile 16, 27, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1 setmetatile 16, 28, METATILE_PokemonMansion_Barrier_Vertical_MidShadow_Basement, 1 setmetatile 16, 29, METATILE_PokemonMansion_Barrier_Vertical_Mid_Basement, 1 setmetatile 16, 30, METATILE_PokemonMansion_Barrier_Vertical_Bottom_Basement, 1 setmetatile 12, 8, METATILE_PokemonMansion_Wall_EndPost_Mid, 1 setmetatile 12, 9, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1 setmetatile 12, 10, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0 setmetatile 12, 11, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 12, 12, METATILE_PokemonMansion_Wall_EndCap_Basement, 0 setmetatile 20, 22, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0 setmetatile 21, 22, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 22, 22, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 20, 23, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0 setmetatile 21, 23, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 22, 23, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 24, 28, METATILE_PokemonMansion_Statue_RedEyes_Basement, 0 setmetatile 27, 4, METATILE_PokemonMansion_Statue_RedEyes_Basement, 0 return PokemonMansion_EventScript_ResetSwitch_B1F:: setmetatile 33, 20, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0 setmetatile 34, 20, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 35, 20, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 33, 21, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0 setmetatile 34, 21, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 35, 21, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 16, 26, METATILE_PokemonMansion_Wall_EndPost_Mid, 1 setmetatile 16, 27, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1 setmetatile 16, 28, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0 setmetatile 16, 29, METATILE_PokemonMansion_BasementFloor, 0 setmetatile 16, 30, METATILE_PokemonMansion_Wall_EndCap_Basement, 0 setmetatile 12, 8, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1 setmetatile 12, 9, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1 setmetatile 12, 10, METATILE_PokemonMansion_Barrier_Vertical_MidShadow_Basement, 1 setmetatile 12, 11, METATILE_PokemonMansion_Barrier_Vertical_Mid_Basement, 1 setmetatile 12, 12, METATILE_PokemonMansion_Barrier_Vertical_Bottom_Basement, 1 setmetatile 20, 22, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1 setmetatile 21, 22, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1 setmetatile 22, 22, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1 setmetatile 20, 23, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft_Basement, 1 setmetatile 21, 23, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid_Basement, 1 setmetatile 22, 23, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight_Basement, 1 setmetatile 24, 28, METATILE_PokemonMansion_Statue_BlackEyes_Basement, 0 setmetatile 27, 4, METATILE_PokemonMansion_Statue_BlackEyes_Basement, 0 return ================================================ FILE: data/scripts/questionnaire.inc ================================================ EventScript_Questionnaire:: lockall textcolor NPC_TEXT_COLOR_NEUTRAL msgbox Text_FillOutQuestionnaire, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DeclineQuestionnaire setvar VAR_0x8004, EASY_CHAT_TYPE_QUESTIONNAIRE call Common_ShowEasyChatScreen lock faceplayer specialvar VAR_0x8008, GetMartClerkObjectId textcolor NPC_TEXT_COLOR_MALE goto_if_eq VAR_0x8004, 0, EventScript_EnableMysteryGift goto_if_eq VAR_RESULT, 0, EventScript_DeclineQuestionnaire goto_if_eq VAR_RESULT, 1, EventScript_TookQuestionnaire end EventScript_EnableMysteryGift:: applymovement VAR_0x8008, Common_Movement_FaceDown waitmovement 0 playse SE_PIN applymovement VAR_0x8008, Common_Movement_ExclamationMark waitmovement 0 applymovement VAR_0x8008, Common_Movement_Delay48 waitmovement 0 msgbox Text_YouKnowThoseWords setflag FLAG_SYS_MYSTERY_GIFT_ENABLED textcolor NPC_TEXT_COLOR_NEUTRAL special DisableMsgBoxWalkaway signmsg msgbox Text_YouCanAccessMysteryGift normalmsg releaseall end EventScript_DeclineQuestionnaire:: releaseall end EventScript_TookQuestionnaire:: applymovement VAR_0x8008, Common_Movement_FaceDown waitmovement 0 msgbox Text_QuestionnaireThankYou releaseall end ================================================ FILE: data/scripts/repel.inc ================================================ EventScript_RepelWoreOff:: checkitem VAR_LAST_REPEL_USED, 1 goto_if_eq VAR_RESULT, TRUE, EventScript_UseAnother lock msgbox Text_RepelWoreOff, MSGBOX_SIGN release end EventScript_UseAnother: lock msgbox Text_UseAnother, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_UsedRepel release end EventScript_UsedRepel: bufferitemname STR_VAR_1, VAR_LAST_REPEL_USED playse SE_REPEL lock msgbox Text_UsedNewRepel, MSGBOX_SIGN removeitem VAR_LAST_REPEL_USED, 1 waitse callnative HandleUseExpiredRepel release end Text_RepelWoreOff:: .string "REPEL's effect wore off…$" Text_UseAnother:: .string "REPEL's effect wore off!\n" .string "Use another?$" Text_UsedNewRepel:: .string "{PLAYER} used the\n" .string "{STR_VAR_1}.$" ================================================ FILE: data/scripts/route23.inc ================================================ Route23_EventScript_MissingBoulderBadge:: msgbox Text_OnlySkilledTrainersAllowedThrough playse SE_BOO msgbox Text_CantLetYouPass release end Route23_EventScript_MissingBadge:: message Text_OnlyPassWithBadgeDontHaveYet waitmessage playse SE_BOO waitbuttonpress closemessage waitse release end Route23_EventScript_AlreadyRecognizedBoulderBadge:: message Text_OhThatsBadgeGoRightAhead waitmessage playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress release end Route23_EventScript_AlreadyRecognizedBadge:: msgbox Text_OnlyPassWithBadgeOhGoAhead release end @ Duplicate of the below, only used for Boulder Badge Route22_NorthEntrance_EventScript_BadgeGuard:: goto_if_ge VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1, Route23_EventScript_AlreadyRecognizedBoulderBadge switch VAR_TEMP_1 case 1, Route23_EventScript_CheckBoulderBadge case 2, Route23_EventScript_CheckCascadeBadge case 3, Route23_EventScript_CheckThunderBadge case 4, Route23_EventScript_CheckRainbowBadge case 5, Route23_EventScript_CheckSoulBadge case 6, Route23_EventScript_CheckMarshBadge case 7, Route23_EventScript_CheckVolcanoBadge case 8, Route23_EventScript_CheckEarthBadge end Route23_EventScript_BadgeGuard:: goto_if_ge VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1, Route23_EventScript_AlreadyRecognizedBadge switch VAR_TEMP_1 case 1, Route23_EventScript_CheckBoulderBadge case 2, Route23_EventScript_CheckCascadeBadge case 3, Route23_EventScript_CheckThunderBadge case 4, Route23_EventScript_CheckRainbowBadge case 5, Route23_EventScript_CheckSoulBadge case 6, Route23_EventScript_CheckMarshBadge case 7, Route23_EventScript_CheckVolcanoBadge case 8, Route23_EventScript_CheckEarthBadge end Route23_EventScript_CheckBoulderBadge:: goto_if_set FLAG_BADGE01_GET, Route23_EventScript_RecognizeBoulderBadge goto Route23_EventScript_MissingBoulderBadge end Route23_EventScript_CheckCascadeBadge:: goto_if_set FLAG_BADGE02_GET, Route23_EventScript_RecognizeBadge goto Route23_EventScript_MissingBadge end Route23_EventScript_CheckThunderBadge:: goto_if_set FLAG_BADGE03_GET, Route23_EventScript_RecognizeBadge goto Route23_EventScript_MissingBadge end Route23_EventScript_CheckRainbowBadge:: goto_if_set FLAG_BADGE04_GET, Route23_EventScript_RecognizeBadge goto Route23_EventScript_MissingBadge end Route23_EventScript_CheckSoulBadge:: goto_if_set FLAG_BADGE05_GET, Route23_EventScript_RecognizeBadge goto Route23_EventScript_MissingBadge end Route23_EventScript_CheckMarshBadge:: goto_if_set FLAG_BADGE06_GET, Route23_EventScript_RecognizeBadge goto Route23_EventScript_MissingBadge end Route23_EventScript_CheckVolcanoBadge:: goto_if_set FLAG_BADGE07_GET, Route23_EventScript_RecognizeBadge goto Route23_EventScript_MissingBadge end Route23_EventScript_CheckEarthBadge:: goto_if_set FLAG_BADGE08_GET, Route23_EventScript_RecognizeBadge goto Route23_EventScript_MissingBadge end Route23_EventScript_RecognizeBoulderBadge:: message Text_OhThatsBadgeGoRightAhead waitmessage playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress copyvar VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1 release end Route23_EventScript_RecognizeBadge:: msgbox Text_OnlyPassWithBadgeOhGoAhead copyvar VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1 release end Route23_EventScript_BadgeGuardTrigger:: textcolor NPC_TEXT_COLOR_MALE applymovement VAR_0x8009, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 switch VAR_TEMP_1 case 1, Route23_EventScript_CheckBoulderBadgeTrigger case 2, Route23_EventScript_CheckCascadeBadgeTrigger case 3, Route23_EventScript_CheckThunderBadgeTrigger case 4, Route23_EventScript_CheckRainbowBadgeTrigger case 5, Route23_EventScript_CheckSoulBadgeTrigger case 6, Route23_EventScript_CheckMarshBadgeTrigger case 7, Route23_EventScript_CheckVolcanoBadgeTrigger case 8, Route23_EventScript_CheckEarthBadgeTrigger end Route23_EventScript_CheckBoulderBadgeTrigger:: goto_if_set FLAG_BADGE01_GET, Route23_EventScript_RecognizeBoulderBadgeTrigger goto Route23_EventScript_MissingBoulderBadgeTrigger end Route23_EventScript_CheckCascadeBadgeTrigger:: goto_if_set FLAG_BADGE02_GET, Route23_EventScript_RecognizeBadgeTrigger goto Route23_EventScript_MissingBadgeTrigger end Route23_EventScript_CheckThunderBadgeTrigger:: goto_if_set FLAG_BADGE03_GET, Route23_EventScript_RecognizeBadgeTrigger goto Route23_EventScript_MissingBadgeTrigger end Route23_EventScript_CheckRainbowBadgeTrigger:: goto_if_set FLAG_BADGE04_GET, Route23_EventScript_RecognizeBadgeTrigger goto Route23_EventScript_MissingBadgeTrigger end Route23_EventScript_CheckSoulBadgeTrigger:: goto_if_set FLAG_BADGE05_GET, Route23_EventScript_RecognizeBadgeTrigger goto Route23_EventScript_MissingBadgeTrigger end Route23_EventScript_CheckMarshBadgeTrigger:: goto_if_set FLAG_BADGE06_GET, Route23_EventScript_RecognizeBadgeTrigger goto Route23_EventScript_MissingBadgeTrigger end Route23_EventScript_CheckVolcanoBadgeTrigger:: goto_if_set FLAG_BADGE07_GET, Route23_EventScript_RecognizeBadgeTrigger goto Route23_EventScript_MissingBadgeTrigger end Route23_EventScript_CheckEarthBadgeTrigger:: goto_if_set FLAG_BADGE08_GET, Route23_EventScript_RecognizeBadgeTrigger goto Route23_EventScript_MissingBadgeTrigger end Route23_EventScript_MissingBoulderBadgeTrigger:: msgbox Text_OnlySkilledTrainersAllowedThrough playse SE_BOO msgbox Text_CantLetYouPass closemessage applymovement OBJ_EVENT_ID_PLAYER, Route23_Movement_WalkDown applymovement VAR_0x8009, Common_Movement_WalkInPlaceFasterDown waitmovement 0 releaseall end Route23_EventScript_MissingBadgeTrigger:: message Text_OnlyPassWithBadgeDontHaveYet waitmessage playse SE_BOO waitbuttonpress closemessage waitse applymovement OBJ_EVENT_ID_PLAYER, Route23_Movement_WalkDown applymovement VAR_0x8009, Common_Movement_WalkInPlaceFasterDown waitmovement 0 releaseall end Route23_EventScript_RecognizeBoulderBadgeTrigger:: message Text_OhThatsBadgeGoRightAhead waitmessage playfanfare MUS_LEVEL_UP waitfanfare waitbuttonpress copyvar VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1 releaseall end Route23_EventScript_RecognizeBadgeTrigger:: msgbox Text_OnlyPassWithBadgeOhGoAhead copyvar VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1 releaseall end Route23_Movement_WalkDown:: walk_down step_end ================================================ FILE: data/scripts/safari_zone.inc ================================================ SafariZone_EventScript_OutOfBallsMidBattle:: setvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 3 special ExitSafariMode setwarp MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 4, 1 end SafariZone_EventScript_Exit:: setvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 1 special ExitSafariMode warp MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 4, 1 waitstate end SafariZone_EventScript_RetirePrompt:: lockall msgbox SafariZone_Text_WouldYouLikeToExit, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, SafariZone_EventScript_Retire releaseall end SafariZone_EventScript_Retire:: goto SafariZone_EventScript_Exit SafariZone_EventScript_TimesUp:: lockall playse SE_DING_DONG msgbox SafariZone_Text_TimesUp goto SafariZone_EventScript_Exit end SafariZone_EventScript_OutOfBalls:: lockall playse SE_DING_DONG msgbox SafariZone_Text_OutOfBalls goto SafariZone_EventScript_Exit end ================================================ FILE: data/scripts/seagallop.inc ================================================ @ Separate selection menus for before the Rainbow Pass is obtained EventScript_ChooseDestFromOneIsland:: goto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, EventScript_SeviiDestinationsPage1 goto_if_ge VAR_MAP_SCENE_CINNABAR_ISLAND, 4, EventScript_ChooseDestFromOneIslandVermilionAllowed multichoice 19, 6, MULTICHOICE_ISLAND_23, FALSE switch VAR_RESULT case 0, EventScript_SailToTwoIsland2 case 1, EventScript_SailToThreeIsland2 case 2, EventScript_CancelSail case SCR_MENU_CANCEL, EventScript_CancelSail end EventScript_ChooseDestFromOneIslandVermilionAllowed:: multichoice 19, 5, MULTICHOICE_SEAGALLOP_V23, FALSE switch VAR_RESULT case 0, EventScript_SailToVermilion2 case 1, EventScript_SailToTwoIsland2 case 2, EventScript_SailToThreeIsland2 case 3, EventScript_CancelSail case SCR_MENU_CANCEL, EventScript_CancelSail end EventScript_ChooseDestFromTwoIsland:: goto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, EventScript_SeviiDestinationsPage1 goto_if_ge VAR_MAP_SCENE_CINNABAR_ISLAND, 4, EventScript_ChooseDestFromTwoIslandVermilionAllowed multichoice 19, 6, MULTICHOICE_ISLAND_13, FALSE switch VAR_RESULT case 0, EventScript_SailToOneIsland2 case 1, EventScript_SailToThreeIsland2 case 2, EventScript_CancelSail case SCR_MENU_CANCEL, EventScript_CancelSail end EventScript_ChooseDestFromTwoIslandVermilionAllowed:: multichoice 19, 5, MULTICHOICE_SEAGALLOP_V13, FALSE switch VAR_RESULT case 0, EventScript_SailToVermilion2 case 1, EventScript_SailToOneIsland2 case 2, EventScript_SailToThreeIsland2 case 3, EventScript_CancelSail case SCR_MENU_CANCEL, EventScript_CancelSail end EventScript_SailToVermilion2:: setvar VAR_0x8006, SEAGALLOP_VERMILION_CITY goto EventScript_SailToDest end EventScript_SailToOneIsland2:: setvar VAR_0x8006, SEAGALLOP_ONE_ISLAND goto EventScript_SailToDest end EventScript_SailToTwoIsland2:: setvar VAR_0x8006, SEAGALLOP_TWO_ISLAND goto EventScript_SailToDest end EventScript_SailToThreeIsland2:: setvar VAR_0x8006, SEAGALLOP_THREE_ISLAND goto EventScript_SailToDest end EventScript_ChooseDestFromIsland:: goto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, EventScript_SeviiDestinationsPage1 goto_if_ge VAR_MAP_SCENE_CINNABAR_ISLAND, 4, EventScript_ChooseDestFromIslandVermilionAllowed multichoice 19, 6, MULTICHOICE_ISLAND_12, FALSE switch VAR_RESULT case 0, EventScript_SailToOneIsland2 case 1, EventScript_SailToTwoIsland2 case 2, EventScript_CancelSail case SCR_MENU_CANCEL, EventScript_CancelSail end EventScript_ChooseDestFromIslandVermilionAllowed:: multichoice 19, 5, MULTICHOICE_SEAGALLOP_V12, FALSE switch VAR_RESULT case 0, EventScript_SailToVermilion2 case 1, EventScript_SailToOneIsland2 case 2, EventScript_SailToTwoIsland2 case 3, EventScript_CancelSail case SCR_MENU_CANCEL, EventScript_CancelSail end EventScript_SailToDest:: specialvar VAR_RESULT, GetSeagallopNumber buffernumberstring STR_VAR_1, VAR_RESULT goto_if_eq VAR_0x8004, SEAGALLOP_VERMILION_CITY, EventScript_DepartingVermilion goto_if_ne VAR_0x8004, SEAGALLOP_VERMILION_CITY, EventScript_DepartingNotVermilion end EventScript_DepartingVermilion:: msgbox VermilionCity_Text_Seagallop7Departing goto EventScript_SetSail end EventScript_DepartingNotVermilion:: msgbox Text_AllAboardSeagallopNum goto EventScript_SetSail end EventScript_SetSail:: closemessage delay 20 goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording fadescreen FADE_TO_BLACK special DoSeagallopFerryScene waitstate end EventScript_CancelSail:: specialvar VAR_RESULT, IsPlayerLeftOfVermilionSailor goto_if_eq VAR_RESULT, TRUE, VermilionCity_EventScript_WalkUpPier release end VermilionCity_EventScript_WalkUpPier:: closemessage applymovement LOCALID_FERRY_SAILOR, Common_Movement_FaceOriginalDirection applymovement OBJ_EVENT_ID_PLAYER, VermilionCity_Movement_WalkUp waitmovement 0 releaseall end VermilionCity_Movement_WalkUp:: walk_up step_end EventScript_SeviiDestinationsPage1:: setvar VAR_0x8005, 0 special DrawSeagallopDestinationMenu waitstate specialvar VAR_0x8006, GetSelectedSeagallopDestination switch VAR_0x8006 case SEAGALLOP_VERMILION_CITY, EventScript_SailToVermilionCity case SEAGALLOP_ONE_ISLAND, EventScript_SailToOneIsland case SEAGALLOP_TWO_ISLAND, EventScript_SailToTwoIsland case SEAGALLOP_THREE_ISLAND, EventScript_SailToThreeIsland case SEAGALLOP_FOUR_ISLAND, EventScript_SailToFourIsland case SEAGALLOP_MORE, EventScript_SeviiDestinationsPage2 case SCR_MENU_CANCEL, EventScript_CancelSail end EventScript_SeviiDestinationsPage2:: setvar VAR_0x8005, 1 special DrawSeagallopDestinationMenu waitstate specialvar VAR_0x8006, GetSelectedSeagallopDestination switch VAR_0x8006 case SEAGALLOP_FOUR_ISLAND, EventScript_SailToFourIsland case SEAGALLOP_FIVE_ISLAND, EventScript_SailToFiveIsland case SEAGALLOP_SIX_ISLAND, EventScript_SailToSixIsland case SEAGALLOP_SEVEN_ISLAND, EventScript_SailToSevenIsland case SEAGALLOP_MORE, EventScript_SeviiDestinationsPage1 case SCR_MENU_CANCEL, EventScript_CancelSail end EventScript_SailToVermilionCity:: setvar VAR_0x8006, SEAGALLOP_VERMILION_CITY goto EventScript_SailToDest end EventScript_SailToOneIsland:: setvar VAR_0x8006, SEAGALLOP_ONE_ISLAND goto EventScript_SailToDest end EventScript_SailToTwoIsland:: setvar VAR_0x8006, SEAGALLOP_TWO_ISLAND goto EventScript_SailToDest end EventScript_SailToThreeIsland:: setvar VAR_0x8006, SEAGALLOP_THREE_ISLAND goto EventScript_SailToDest end EventScript_SailToFourIsland:: setvar VAR_0x8006, SEAGALLOP_FOUR_ISLAND goto EventScript_SailToDest end EventScript_SailToFiveIsland:: setvar VAR_0x8006, SEAGALLOP_FIVE_ISLAND goto EventScript_SailToDest end EventScript_SailToSixIsland:: setvar VAR_0x8006, SEAGALLOP_SIX_ISLAND goto EventScript_SailToDest end EventScript_SailToSevenIsland:: setvar VAR_0x8006, SEAGALLOP_SEVEN_ISLAND goto EventScript_SailToDest end ================================================ FILE: data/scripts/set_gym_trainers.inc ================================================ EventScript_SetGymTrainers:: switch VAR_0x8008 case 1, EventScript_SetPewterGymTrainers case 2, EventScript_SetCeruleanGymTrainers case 3, EventScript_SetVermilionGymTrainers case 4, EventScript_SetCeladonGymTrainers case 5, EventScript_SetFuchsiaGymTrainers case 6, EventScript_SetSaffronGymTrainers case 7, EventScript_SetCinnabarGymTrainers case 8, EventScript_SetViridianGymTrainers end EventScript_SetPewterGymTrainers:: settrainerflag TRAINER_CAMPER_LIAM return EventScript_SetCeruleanGymTrainers:: settrainerflag TRAINER_PICNICKER_DIANA settrainerflag TRAINER_SWIMMER_MALE_LUIS return EventScript_SetVermilionGymTrainers:: settrainerflag TRAINER_SAILOR_DWAYNE settrainerflag TRAINER_ENGINEER_BAILY settrainerflag TRAINER_GENTLEMAN_TUCKER return EventScript_SetCeladonGymTrainers:: settrainerflag TRAINER_LASS_KAY settrainerflag TRAINER_LASS_LISA settrainerflag TRAINER_PICNICKER_TINA settrainerflag TRAINER_BEAUTY_BRIDGET settrainerflag TRAINER_BEAUTY_TAMIA settrainerflag TRAINER_BEAUTY_LORI settrainerflag TRAINER_COOLTRAINER_MARY return EventScript_SetFuchsiaGymTrainers:: settrainerflag TRAINER_TAMER_PHIL settrainerflag TRAINER_TAMER_EDGAR settrainerflag TRAINER_JUGGLER_KIRK settrainerflag TRAINER_JUGGLER_SHAWN settrainerflag TRAINER_JUGGLER_KAYDEN settrainerflag TRAINER_JUGGLER_NATE return EventScript_SetSaffronGymTrainers:: settrainerflag TRAINER_PSYCHIC_JOHAN settrainerflag TRAINER_PSYCHIC_TYRON settrainerflag TRAINER_PSYCHIC_CAMERON settrainerflag TRAINER_PSYCHIC_PRESTON settrainerflag TRAINER_CHANNELER_AMANDA settrainerflag TRAINER_CHANNELER_STACY settrainerflag TRAINER_CHANNELER_TASHA return EventScript_SetCinnabarGymTrainers:: settrainerflag TRAINER_SUPER_NERD_ERIK settrainerflag TRAINER_SUPER_NERD_AVERY settrainerflag TRAINER_SUPER_NERD_DEREK settrainerflag TRAINER_SUPER_NERD_ZAC settrainerflag TRAINER_BURGLAR_QUINN settrainerflag TRAINER_BURGLAR_RAMON settrainerflag TRAINER_BURGLAR_DUSTY return EventScript_SetViridianGymTrainers:: settrainerflag TRAINER_TAMER_JASON settrainerflag TRAINER_TAMER_COLE settrainerflag TRAINER_BLACK_BELT_ATSUSHI settrainerflag TRAINER_BLACK_BELT_KIYO settrainerflag TRAINER_BLACK_BELT_TAKASHI settrainerflag TRAINER_COOLTRAINER_SAMUEL settrainerflag TRAINER_COOLTRAINER_YUJI settrainerflag TRAINER_COOLTRAINER_WARREN return ================================================ FILE: data/scripts/silphco_doors.inc ================================================ EventScript_NeedCardKey:: msgbox Text_ItNeedsCardKey releaseall end EventScript_DoorUnlocked:: msgbox Text_TheDoorIsOpen releaseall end EventScript_Close2FDoor1:: setmetatile 5, 8, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 6, 8, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 5, 9, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 6, 9, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 6, 10, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close2FDoor2:: setmetatile 5, 15, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 6, 15, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 5, 16, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 6, 16, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 6, 17, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close3FDoor1:: setmetatile 9, 11, METATILE_SilphCo_VerticalBarrier_TopLeft, 1 setmetatile 10, 11, METATILE_SilphCo_VerticalBarrier_TopRight, 1 setmetatile 9, 12, METATILE_SilphCo_VerticalBarrier_MidLeft, 1 setmetatile 10, 12, METATILE_SilphCo_VerticalBarrier_MidRight, 1 setmetatile 9, 13, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1 setmetatile 10, 13, METATILE_SilphCo_VerticalBarrier_BottomRight, 1 return EventScript_Close3FDoor2:: setmetatile 20, 11, METATILE_SilphCo_VerticalBarrier_TopLeft, 1 setmetatile 21, 11, METATILE_SilphCo_VerticalBarrier_TopRight, 1 setmetatile 20, 12, METATILE_SilphCo_VerticalBarrier_MidLeft, 1 setmetatile 21, 12, METATILE_SilphCo_VerticalBarrier_MidRight, 1 setmetatile 20, 13, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1 setmetatile 21, 13, METATILE_SilphCo_VerticalBarrier_BottomRight, 1 return EventScript_Close4FDoor1:: setmetatile 3, 16, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 4, 16, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 3, 17, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 4, 17, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 4, 18, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close4FDoor2:: setmetatile 14, 11, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 15, 11, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 14, 12, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 15, 12, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 15, 13, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close5FDoor1:: setmetatile 7, 8, METATILE_SilphCo_VerticalBarrier_TopLeft, 1 setmetatile 8, 8, METATILE_SilphCo_VerticalBarrier_TopRight, 1 setmetatile 7, 9, METATILE_SilphCo_VerticalBarrier_MidLeft, 1 setmetatile 8, 9, METATILE_SilphCo_VerticalBarrier_MidRight, 1 setmetatile 7, 10, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1 setmetatile 8, 10, METATILE_SilphCo_VerticalBarrier_BottomRight, 1 return EventScript_Close5FDoor2:: setmetatile 7, 17, METATILE_SilphCo_VerticalBarrier_TopLeft, 1 setmetatile 8, 17, METATILE_SilphCo_VerticalBarrier_TopRight, 1 setmetatile 7, 18, METATILE_SilphCo_VerticalBarrier_MidLeft, 1 setmetatile 8, 18, METATILE_SilphCo_VerticalBarrier_MidRight, 1 setmetatile 7, 19, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1 setmetatile 8, 19, METATILE_SilphCo_VerticalBarrier_BottomRight, 1 return EventScript_Close5FDoor3:: setmetatile 18, 12, METATILE_SilphCo_VerticalBarrier_TopLeft, 1 setmetatile 19, 12, METATILE_SilphCo_VerticalBarrier_TopRight, 1 setmetatile 18, 13, METATILE_SilphCo_VerticalBarrier_MidLeft, 1 setmetatile 19, 13, METATILE_SilphCo_VerticalBarrier_MidRight, 1 setmetatile 18, 14, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1 setmetatile 19, 14, METATILE_SilphCo_VerticalBarrier_BottomRight, 1 return EventScript_Close6FDoor:: setmetatile 5, 14, METATILE_SilphCo_VerticalBarrier_TopLeft, 1 setmetatile 6, 14, METATILE_SilphCo_VerticalBarrier_TopRight, 1 setmetatile 5, 15, METATILE_SilphCo_VerticalBarrier_MidLeft, 1 setmetatile 6, 15, METATILE_SilphCo_VerticalBarrier_MidRight, 1 setmetatile 5, 16, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1 setmetatile 6, 16, METATILE_SilphCo_VerticalBarrier_BottomRight, 1 return EventScript_Close7FDoor1:: setmetatile 11, 8, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 12, 8, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 11, 9, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 12, 9, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 12, 10, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close7FDoor2:: setmetatile 24, 7, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 25, 7, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 24, 8, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 25, 8, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 25, 9, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close7FDoor3:: setmetatile 25, 13, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 26, 13, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 25, 14, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 26, 14, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 26, 15, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close8FDoor:: setmetatile 5, 9, METATILE_SilphCo_VerticalBarrier_TopLeft, 1 setmetatile 6, 9, METATILE_SilphCo_VerticalBarrier_TopRight, 1 setmetatile 5, 10, METATILE_SilphCo_VerticalBarrier_MidLeft, 1 setmetatile 6, 10, METATILE_SilphCo_VerticalBarrier_MidRight, 1 setmetatile 5, 11, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1 setmetatile 6, 11, METATILE_SilphCo_VerticalBarrier_BottomRight, 1 return EventScript_Close9FDoor1:: setmetatile 2, 9, METATILE_SilphCo_VerticalBarrier_TopLeft, 1 setmetatile 3, 9, METATILE_SilphCo_VerticalBarrier_TopRight, 1 setmetatile 2, 10, METATILE_SilphCo_VerticalBarrier_MidLeft, 1 setmetatile 3, 10, METATILE_SilphCo_VerticalBarrier_MidRight, 1 setmetatile 2, 11, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1 setmetatile 3, 11, METATILE_SilphCo_VerticalBarrier_BottomRight, 1 return EventScript_Close9FDoor2:: setmetatile 12, 15, METATILE_SilphCo_VerticalBarrier_TopLeft, 1 setmetatile 13, 15, METATILE_SilphCo_VerticalBarrier_TopRight, 1 setmetatile 12, 16, METATILE_SilphCo_VerticalBarrier_MidLeft, 1 setmetatile 13, 16, METATILE_SilphCo_VerticalBarrier_MidRight, 1 setmetatile 12, 17, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1 setmetatile 13, 17, METATILE_SilphCo_VerticalBarrier_BottomRight, 1 return EventScript_Close9FDoor3:: setmetatile 21, 6, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 22, 6, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 21, 7, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 22, 7, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 22, 8, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close9FDoor4:: setmetatile 21, 12, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 22, 12, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 21, 13, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 22, 13, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 22, 14, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close10FDoor:: setmetatile 12, 11, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 13, 11, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 12, 12, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 13, 12, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 13, 13, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Close11FDoor:: setmetatile 5, 16, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1 setmetatile 6, 16, METATILE_SilphCo_HorizontalBarrier_TopRight, 1 setmetatile 5, 17, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1 setmetatile 6, 17, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1 setmetatile 6, 18, METATILE_SilphCo_Floor_ShadeFull, 0 return EventScript_Open2FDoor1:: setmetatile 5, 8, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 6, 8, METATILE_SilphCo_Floor, 0 setmetatile 5, 9, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 6, 9, METATILE_SilphCo_Floor, 0 setmetatile 6, 10, METATILE_SilphCo_Floor, 0 return EventScript_Open2FDoor2:: setmetatile 5, 15, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 6, 15, METATILE_SilphCo_Floor, 0 setmetatile 5, 16, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 6, 16, METATILE_SilphCo_Floor, 0 setmetatile 6, 17, METATILE_SilphCo_Floor, 0 return EventScript_Open3FDoor1:: setmetatile 9, 11, METATILE_SilphCo_Wall_LeftEdge, 1 setmetatile 10, 11, METATILE_SilphCo_Wall_RightEdge, 1 setmetatile 9, 12, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 10, 12, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 9, 13, METATILE_SilphCo_Floor_WallLeftCorner, 0 setmetatile 10, 13, METATILE_SilphCo_Floor_WallRightCorner, 0 return EventScript_Open3FDoor2:: setmetatile 20, 11, METATILE_SilphCo_Wall_LeftEdge, 1 setmetatile 21, 11, METATILE_SilphCo_Wall_RightEdge, 1 setmetatile 20, 12, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 21, 12, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 20, 13, METATILE_SilphCo_Floor_WallLeftCorner, 0 setmetatile 21, 13, METATILE_SilphCo_Floor_WallRightCorner, 0 return EventScript_Open4FDoor1:: setmetatile 3, 16, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 4, 16, METATILE_SilphCo_Floor, 0 setmetatile 3, 17, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 4, 17, METATILE_SilphCo_Floor, 0 setmetatile 4, 18, METATILE_SilphCo_Floor, 0 return EventScript_Open4FDoor2:: setmetatile 14, 11, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 15, 11, METATILE_SilphCo_Floor, 0 setmetatile 14, 12, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 15, 12, METATILE_SilphCo_Floor, 0 setmetatile 15, 13, METATILE_SilphCo_Floor, 0 return EventScript_Open5FDoor1:: setmetatile 7, 8, METATILE_SilphCo_Wall_LeftEdge, 1 setmetatile 8, 8, METATILE_SilphCo_Wall_RightEdge, 1 setmetatile 7, 9, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 8, 9, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 7, 10, METATILE_SilphCo_Floor_WallLeftCorner, 0 setmetatile 8, 10, METATILE_SilphCo_Floor_WallRightCorner, 0 return EventScript_Open5FDoor2:: setmetatile 7, 17, METATILE_SilphCo_Wall_LeftEdge, 1 setmetatile 8, 17, METATILE_SilphCo_Wall_RightEdge, 1 setmetatile 7, 18, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 8, 18, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 7, 19, METATILE_SilphCo_Floor_WallLeftCorner, 0 setmetatile 8, 19, METATILE_SilphCo_Floor_WallRightCorner, 0 return EventScript_Open5FDoor3:: setmetatile 18, 12, METATILE_SilphCo_Wall_LeftEdge, 1 setmetatile 19, 12, METATILE_SilphCo_Wall_RightEdge, 1 setmetatile 18, 13, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 19, 13, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 18, 14, METATILE_SilphCo_Floor_WallLeftCorner, 0 setmetatile 19, 14, METATILE_SilphCo_Floor_WallRightCorner, 0 return EventScript_Open6FDoor:: setmetatile 5, 14, METATILE_SilphCo_Wall_LeftEdge, 1 setmetatile 6, 14, METATILE_SilphCo_Wall_RightEdge, 1 setmetatile 5, 15, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 6, 15, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 5, 16, METATILE_SilphCo_Floor_WallLeftCorner, 0 setmetatile 6, 16, METATILE_SilphCo_Floor_WallRightCorner, 0 return EventScript_Open7FDoor1:: setmetatile 11, 8, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 12, 8, METATILE_SilphCo_Floor, 0 setmetatile 11, 9, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 12, 9, METATILE_SilphCo_Floor, 0 setmetatile 12, 10, METATILE_SilphCo_Floor, 0 return EventScript_Open7FDoor2:: setmetatile 24, 7, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 25, 7, METATILE_SilphCo_Floor, 0 setmetatile 24, 8, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 25, 8, METATILE_SilphCo_Floor, 0 setmetatile 25, 9, METATILE_SilphCo_Floor, 0 return EventScript_Open7FDoor3:: setmetatile 25, 13, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 26, 13, METATILE_SilphCo_Floor, 0 setmetatile 25, 14, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 26, 14, METATILE_SilphCo_Floor, 0 setmetatile 26, 15, METATILE_SilphCo_Floor, 0 return EventScript_Open8FDoor:: setmetatile 5, 9, METATILE_SilphCo_Wall_LeftEdge, 1 setmetatile 6, 9, METATILE_SilphCo_Wall_RightEdge, 1 setmetatile 5, 10, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 6, 10, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 5, 11, METATILE_SilphCo_Floor_WallLeftCorner, 0 setmetatile 6, 11, METATILE_SilphCo_Floor_WallRightCorner, 0 return EventScript_Open9FDoor1:: setmetatile 2, 9, METATILE_SilphCo_Wall_LeftEdge, 1 setmetatile 3, 9, METATILE_SilphCo_Wall_RightEdge, 1 setmetatile 2, 10, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 3, 10, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 2, 11, METATILE_SilphCo_Floor_WallLeftCorner, 0 setmetatile 3, 11, METATILE_SilphCo_Floor_WallRightCorner, 0 return EventScript_Open9FDoor2:: setmetatile 12, 15, METATILE_SilphCo_Wall_LeftEdge, 1 setmetatile 13, 15, METATILE_SilphCo_Wall_RightEdge, 1 setmetatile 12, 16, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 13, 16, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 12, 17, METATILE_SilphCo_Floor_WallLeftCorner, 0 setmetatile 13, 17, METATILE_SilphCo_Floor_WallRightCorner, 0 return EventScript_Open9FDoor3:: setmetatile 21, 6, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 22, 6, METATILE_SilphCo_Floor, 0 setmetatile 21, 7, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 22, 7, METATILE_SilphCo_Floor, 0 setmetatile 22, 8, METATILE_SilphCo_Floor, 0 return EventScript_Open9FDoor4:: setmetatile 21, 12, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 22, 12, METATILE_SilphCo_Floor, 0 setmetatile 21, 13, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 22, 13, METATILE_SilphCo_Floor, 0 setmetatile 22, 14, METATILE_SilphCo_Floor, 0 return EventScript_Open10FDoor:: setmetatile 12, 11, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 13, 11, METATILE_SilphCo_Floor, 0 setmetatile 12, 12, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 13, 12, METATILE_SilphCo_Floor, 0 setmetatile 13, 13, METATILE_SilphCo_Floor, 0 return EventScript_Open11FDoor:: setmetatile 5, 16, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 6, 16, METATILE_SilphCo_Floor, 0 setmetatile 5, 17, METATILE_SilphCo_Floor_ShadeFull, 0 setmetatile 6, 17, METATILE_SilphCo_Floor, 0 setmetatile 6, 18, METATILE_SilphCo_Floor, 0 return SilphCo_2F_EventScript_Door1:: lockall setvar VAR_TEMP_1, 1 setvar VAR_0x8004, FLAG_SILPH_2F_DOOR_1 goto_if_set FLAG_SILPH_2F_DOOR_1, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_2F_EventScript_Door2:: lockall setvar VAR_TEMP_1, 2 setvar VAR_0x8004, FLAG_SILPH_2F_DOOR_2 goto_if_set FLAG_SILPH_2F_DOOR_2, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_3F_EventScript_Door1:: lockall setvar VAR_TEMP_1, 3 setvar VAR_0x8004, FLAG_SILPH_3F_DOOR_1 goto_if_set FLAG_SILPH_3F_DOOR_1, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_3F_EventScript_Door2:: lockall setvar VAR_TEMP_1, 4 setvar VAR_0x8004, FLAG_SILPH_3F_DOOR_2 goto_if_set FLAG_SILPH_3F_DOOR_2, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_4F_EventScript_Door1:: lockall setvar VAR_TEMP_1, 5 setvar VAR_0x8004, FLAG_SILPH_4F_DOOR_1 goto_if_set FLAG_SILPH_4F_DOOR_1, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_4F_EventScript_Door2:: lockall setvar VAR_TEMP_1, 6 setvar VAR_0x8004, FLAG_SILPH_4F_DOOR_2 goto_if_set FLAG_SILPH_4F_DOOR_2, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_5F_EventScript_Door1:: lockall setvar VAR_TEMP_1, 7 setvar VAR_0x8004, FLAG_SILPH_5F_DOOR_1 goto_if_set FLAG_SILPH_5F_DOOR_1, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_5F_EventScript_Door2:: lockall setvar VAR_TEMP_1, 8 setvar VAR_0x8004, FLAG_SILPH_5F_DOOR_2 goto_if_set FLAG_SILPH_5F_DOOR_2, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_5F_EventScript_Door3:: lockall setvar VAR_TEMP_1, 9 setvar VAR_0x8004, FLAG_SILPH_5F_DOOR_3 goto_if_set FLAG_SILPH_5F_DOOR_3, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_6F_EventScript_Door:: lockall setvar VAR_TEMP_1, 10 setvar VAR_0x8004, FLAG_SILPH_6F_DOOR goto_if_set FLAG_SILPH_6F_DOOR, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_7F_EventScript_Door1:: lockall setvar VAR_TEMP_1, 11 setvar VAR_0x8004, FLAG_SILPH_7F_DOOR_1 goto_if_set FLAG_SILPH_7F_DOOR_1, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_7F_EventScript_Door2:: lockall setvar VAR_TEMP_1, 12 setvar VAR_0x8004, FLAG_SILPH_7F_DOOR_2 goto_if_set FLAG_SILPH_7F_DOOR_2, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_7F_EventScript_Door3:: lockall setvar VAR_TEMP_1, 13 setvar VAR_0x8004, FLAG_SILPH_7F_DOOR_3 goto_if_set FLAG_SILPH_7F_DOOR_3, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_8F_EventScript_Door:: lockall setvar VAR_TEMP_1, 14 setvar VAR_0x8004, FLAG_SILPH_8F_DOOR goto_if_set FLAG_SILPH_8F_DOOR, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_9F_EventScript_Door1:: lockall setvar VAR_TEMP_1, 15 setvar VAR_0x8004, FLAG_SILPH_9F_DOOR_1 goto_if_set FLAG_SILPH_9F_DOOR_1, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_9F_EventScript_Door2:: lockall setvar VAR_TEMP_1, 16 setvar VAR_0x8004, FLAG_SILPH_9F_DOOR_2 goto_if_set FLAG_SILPH_9F_DOOR_2, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_9F_EventScript_Door3:: lockall setvar VAR_TEMP_1, 17 setvar VAR_0x8004, FLAG_SILPH_9F_DOOR_3 goto_if_set FLAG_SILPH_9F_DOOR_3, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_9F_EventScript_Door4:: lockall setvar VAR_TEMP_1, 18 setvar VAR_0x8004, FLAG_SILPH_9F_DOOR_4 goto_if_set FLAG_SILPH_9F_DOOR_4, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_10F_EventScript_Door:: lockall setvar VAR_TEMP_1, 19 setvar VAR_0x8004, FLAG_SILPH_10F_DOOR goto_if_set FLAG_SILPH_10F_DOOR, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end SilphCo_11F_EventScript_Door:: lockall setvar VAR_TEMP_1, 20 setvar VAR_0x8004, FLAG_SILPH_11F_DOOR goto_if_set FLAG_SILPH_11F_DOOR, EventScript_DoorUnlocked goto EventScript_TryUnlockDoor end EventScript_TryUnlockDoor:: goto_if_set FLAG_HIDE_SILPH_CO_5F_CARD_KEY, EventScript_OpenDoor goto EventScript_NeedCardKey end EventScript_OpenDoor:: playfanfare MUS_LEVEL_UP msgbox Text_CardKeyOpenedDoor waitfanfare call_if_eq VAR_TEMP_1, 1, EventScript_Open2FDoor1 call_if_eq VAR_TEMP_1, 2, EventScript_Open2FDoor2 call_if_eq VAR_TEMP_1, 3, EventScript_Open3FDoor1 call_if_eq VAR_TEMP_1, 4, EventScript_Open3FDoor2 call_if_eq VAR_TEMP_1, 5, EventScript_Open4FDoor1 call_if_eq VAR_TEMP_1, 6, EventScript_Open4FDoor2 call_if_eq VAR_TEMP_1, 7, EventScript_Open5FDoor1 call_if_eq VAR_TEMP_1, 8, EventScript_Open5FDoor2 call_if_eq VAR_TEMP_1, 9, EventScript_Open5FDoor3 call_if_eq VAR_TEMP_1, 10, EventScript_Open6FDoor call_if_eq VAR_TEMP_1, 11, EventScript_Open7FDoor1 call_if_eq VAR_TEMP_1, 12, EventScript_Open7FDoor2 call_if_eq VAR_TEMP_1, 13, EventScript_Open7FDoor3 call_if_eq VAR_TEMP_1, 14, EventScript_Open8FDoor call_if_eq VAR_TEMP_1, 15, EventScript_Open9FDoor1 call_if_eq VAR_TEMP_1, 16, EventScript_Open9FDoor2 call_if_eq VAR_TEMP_1, 17, EventScript_Open9FDoor3 call_if_eq VAR_TEMP_1, 18, EventScript_Open9FDoor4 call_if_eq VAR_TEMP_1, 19, EventScript_Open10FDoor call_if_eq VAR_TEMP_1, 20, EventScript_Open11FDoor waitse playse SE_UNLOCK special DrawWholeMapView waitse special SetHiddenItemFlag releaseall end ================================================ FILE: data/scripts/static_pokemon.inc ================================================ EventScript_RemoveStaticMon:: fadescreenswapbuffers FADE_TO_BLACK removeobject VAR_LAST_TALKED fadescreenswapbuffers FADE_FROM_BLACK release end EventScript_MonFlewAway:: fadescreenswapbuffers FADE_TO_BLACK removeobject VAR_LAST_TALKED fadescreenswapbuffers FADE_FROM_BLACK bufferspeciesname STR_VAR_1, VAR_0x8004 msgbox Text_MonFlewAway release end EventScript_AwakenSnorlax:: message Text_PlayedPokeFlute waitmessage playfanfare MUS_POKE_FLUTE waitfanfare msgbox Text_SnorlaxWokeUp return ================================================ FILE: data/scripts/std_msgbox.inc ================================================ Std_MsgboxNPC:: lock faceplayer message 0x0 waitmessage waitbuttonpress release return Std_MsgboxSign:: lockall message 0x0 waitmessage waitbuttonpress releaseall return Std_MsgboxDefault:: message 0x0 waitmessage waitbuttonpress return Std_MsgboxYesNo:: message 0x0 waitmessage yesnobox 20, 8 return Std_ReceivedItem:: textcolor NPC_TEXT_COLOR_NEUTRAL call_if_eq VAR_0x8002, MUS_LEVEL_UP, EventScript_ReceivedItemFanfare1 call_if_eq VAR_0x8002, MUS_OBTAIN_KEY_ITEM, EventScript_ReceivedItemFanfare2 message 0x0 waitmessage waitfanfare call_if_eq VAR_0x8002, MUS_LEVEL_UP, EventScript_ReceivedItemWaitFanfare putitemaway VAR_0x8000, VAR_0x8001 call EventScript_RestorePrevTextColor return EventScript_ReceivedItemFanfare1:: playfanfare MUS_LEVEL_UP return EventScript_ReceivedItemFanfare2:: playfanfare MUS_OBTAIN_KEY_ITEM return EventScript_ReceivedItemWaitFanfare:: delay 50 return EventScript_UnusedReturn:: return EventScript_AskSaveGame:: special Field_AskSaveTheGame waitstate return ================================================ FILE: data/scripts/surf.inc ================================================ EventScript_UseSurf:: goto_if_questlog EventScript_UseSurfEnd checkpartymove MOVE_SURF goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_UseSurfEnd bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT lockall msgbox Text_WantToSurf, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_UseSurfRelease msgbox Text_UsedSurf dofieldeffect FLDEFF_USE_SURF EventScript_UseSurfRelease: releaseall EventScript_UseSurfEnd: end EventScript_CurrentTooFast:: lockall msgbox Text_CurrentTooFast releaseall end ================================================ FILE: data/scripts/trainer_battle.inc ================================================ EventScript_DoTrainerBattleFromApproach:: lock special PlayTrainerEncounterMusic special EndTrainerApproach waitstate goto EventScript_DoTrainerBattle EventScript_TryDoNormalTrainerBattle:: lock faceplayer applymovement VAR_LAST_TALKED, Movement_RevealTrainer waitmovement 0 specialvar VAR_RESULT, Script_HasTrainerBeenFought goto_if_ne VAR_RESULT, FALSE, EventScript_NoTrainerBattle special PlayTrainerEncounterMusic special SetUpTrainerMovement goto EventScript_DoTrainerBattle EventScript_NoTrainerBattle:: gotopostbattlescript EventScript_TryDoDoubleTrainerBattle:: lock faceplayer call EventScript_RevealTrainer specialvar VAR_RESULT, Script_HasTrainerBeenFought goto_if_ne VAR_RESULT, FALSE, EventScript_NoDoubleTrainerBattle special HasEnoughMonsForDoubleBattle goto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, EventScript_NotEnoughMonsForDoubleBattle special PlayTrainerEncounterMusic special SetUpTrainerMovement goto EventScript_DoTrainerBattle EventScript_NotEnoughMonsForDoubleBattle:: special ShowTrainerCantBattleSpeech waitmessage waitbuttonpress release end EventScript_NoDoubleTrainerBattle:: gotopostbattlescript EventScript_DoNoIntroTrainerBattle:: applymovement VAR_LAST_TALKED, Movement_RevealTrainer waitmovement 0 special PlayTrainerEncounterMusic goto_if_questlog EventScript_EndQuestLogBattle dotrainerbattle gotopostbattlescript EventScript_TryDoRematchBattle:: call EventScript_RevealTrainer specialvar VAR_RESULT, IsTrainerReadyForRematch goto_if_eq VAR_RESULT, FALSE, EventScript_NoRematchBattle special PlayTrainerEncounterMusic special SetUpTrainerMovement special ShowTrainerIntroSpeech waitmessage waitbuttonpress goto_if_questlog EventScript_EndQuestLogRematch special StartRematchBattle waitstate releaseall end EventScript_NoRematchBattle:: gotopostbattlescript EventScript_TryDoDoubleRematchBattle:: specialvar VAR_RESULT, IsTrainerReadyForRematch goto_if_eq VAR_RESULT, FALSE, EventScript_NoDoubleRematchBattle special HasEnoughMonsForDoubleBattle goto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, EventScript_NotEnoughMonsForDoubleRematchBattle special PlayTrainerEncounterMusic special SetUpTrainerMovement special ShowTrainerIntroSpeech waitmessage waitbuttonpress goto_if_questlog EventScript_EndQuestLogRematch special StartRematchBattle waitstate releaseall end EventScript_NoDoubleRematchBattle:: gotopostbattlescript EventScript_NotEnoughMonsForDoubleRematchBattle:: special ShowTrainerCantBattleSpeech waitmessage waitbuttonpress release end EventScript_EndQuestLogRematch:: releaseall end EventScript_RevealTrainer:: applymovement VAR_LAST_TALKED, Movement_RevealTrainer waitmovement 0 return Movement_RevealTrainer:: reveal_trainer step_end EventScript_DoTrainerBattle:: special ShowTrainerIntroSpeech waitmessage waitbuttonpress goto_if_questlog EventScript_EndQuestLogBattle dotrainerbattle specialvar VAR_RESULT, GetTrainerBattleMode goto_if_eq VAR_RESULT, TRAINER_BATTLE_SINGLE, EventScript_EndTrainerBattle goto_if_eq VAR_RESULT, TRAINER_BATTLE_CONTINUE_SCRIPT, EventScript_EndTrainerBattleContinueScript goto_if_eq VAR_RESULT, TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, EventScript_EndTrainerBattleContinueScript goto_if_eq VAR_RESULT, TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, EventScript_EndTrainerBattleContinueScript goto_if_eq VAR_RESULT, TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, EventScript_EndTrainerBattleContinueScript EventScript_EndTrainerBattle:: releaseall end EventScript_EndTrainerBattleContinueScript:: gotobeatenscript EventScript_EndQuestLogBattle:: special SetBattledTrainerFlag releaseall end Std_MsgboxAutoclose:: message 0x0 waitmessage waitbuttonpress release return ================================================ FILE: data/scripts/trainer_card.inc ================================================ .set LOCALID_STICKER_MAN, 1 CeladonCity_GameCorner_EventScript_PhotoPrinter:: lockall showmoneybox 0, 0 msgbox CeladonCity_GameCorner_Text_TryPokemonPrinter, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_EventScript_DeclinePhoto checkmoney 50 goto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_EventScript_NotEnoughMoneyForPhoto playse SE_SHOP removemoney 50 updatemoneybox waitse message CeladonCity_GameCorner_Text_ChoosePrintType waitmessage multichoice 21, 0, MULTICHOICE_TRAINER_CARD_ICON_TINT, TRUE switch VAR_RESULT case 0, CeladonCity_GameCorner_EventScript_PrintTypeNormal case 1, CeladonCity_GameCorner_EventScript_PrintTypeBlack case 2, CeladonCity_GameCorner_EventScript_PrintTypePink case 3, CeladonCity_GameCorner_EventScript_PrintTypeSepia end CeladonCity_GameCorner_EventScript_PrintTypeNormal:: setvar VAR_0x8004, MON_ICON_TINT_NORMAL goto CeladonCity_GameCorner_EventScript_PrintPhoto end CeladonCity_GameCorner_EventScript_PrintTypeBlack:: setvar VAR_0x8004, MON_ICON_TINT_BLACK goto CeladonCity_GameCorner_EventScript_PrintPhoto end CeladonCity_GameCorner_EventScript_PrintTypePink:: setvar VAR_0x8004, MON_ICON_TINT_PINK goto CeladonCity_GameCorner_EventScript_PrintPhoto end CeladonCity_GameCorner_EventScript_PrintTypeSepia:: setvar VAR_0x8004, MON_ICON_TINT_SEPIA goto CeladonCity_GameCorner_EventScript_PrintPhoto end CeladonCity_GameCorner_EventScript_PrintPhoto:: message CeladonCity_GameCorner_Text_BigSmileForPhoto waitmessage playse MUS_PHOTO dofieldeffect FLDEFF_PHOTO_FLASH delay 60 special UpdateTrainerCardPhotoIcons msgbox CeladonCity_GameCorner_Text_PrintIsReadyCheckTrainerCard hidemoneybox releaseall end CeladonCity_GameCorner_EventScript_DeclinePhoto:: hidemoneybox releaseall end CeladonCity_GameCorner_EventScript_NotEnoughMoneyForPhoto:: msgbox CeladonCity_GameCorner_Text_DontHaveEnoughMoney hidemoneybox releaseall end FourIsland_House2_EventScript_StickerMan:: lock specialvar VAR_0x8008, StickerManGetBragFlags goto_if_unset FLAG_MET_STICKER_MAN, FourIsland_House2_EventScript_MeetStickerMan goto_if_set FLAG_MET_STICKER_MAN, FourIsland_House2_EventScript_StickerManAskForBrag end FourIsland_House2_EventScript_MeetStickerMan:: setflag FLAG_MET_STICKER_MAN msgbox FourIsland_House2_Text_WishICouldShowOffStickers applymovement LOCALID_STICKER_MAN, Common_Movement_FacePlayer waitmovement 0 playse SE_PIN applymovement LOCALID_STICKER_MAN, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_STICKER_MAN, Common_Movement_Delay48 waitmovement 0 goto_if_eq VAR_0x8008, 0, FourIsland_House2_EventScript_StickerManNothingToBrag message FourIsland_House2_Text_GiveYouStickerIfYouBrag waitmessage goto FourIsland_House2_EventScript_ChooseBrag end FourIsland_House2_EventScript_StickerManAskForBrag:: applymovement LOCALID_STICKER_MAN, Common_Movement_FacePlayer waitmovement 0 goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording goto_if_eq VAR_0x8008, 0, FourIsland_House2_EventScript_NothingToBragAbout message FourIsland_House2_Text_BragAboutWhatToday waitmessage goto FourIsland_House2_EventScript_ChooseBrag end FourIsland_House2_EventScript_NothingToBragAbout:: msgbox FourIsland_House2_Text_BragAboutSomethingForMe release end FourIsland_House2_EventScript_ChooseBrag:: switch VAR_0x8008 case 1, FourIsland_House2_EventScript_ChooseBragHoF case 2, FourIsland_House2_EventScript_ChooseBragEggs case 4, FourIsland_House2_EventScript_ChooseBragLinkWins case 3, FourIsland_House2_EventScript_ChooseBragHoFEggs case 5, FourIsland_House2_EventScript_ChooseBragHoFLinkWins case 6, FourIsland_House2_EventScript_ChooseBragEggsLinkWins case 7, FourIsland_House2_EventScript_ChooseBragHofEggsLinkWins end FourIsland_House2_EventScript_ChooseBragHoF:: multichoice 15, 8, MULTICHOICE_HOF_QUIT, FALSE switch VAR_RESULT case 0, FourIsland_House2_EventScript_BragHoF case 1, FourIsland_House2_EventScript_QuitBrag case SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag end FourIsland_House2_EventScript_ChooseBragEggs:: multichoice 16, 8, MULTICHOICE_EGGS_QUIT, FALSE switch VAR_RESULT case 0, FourIsland_House2_EventScript_BragEggs case 1, FourIsland_House2_EventScript_QuitBrag case SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag end FourIsland_House2_EventScript_ChooseBragLinkWins:: multichoice 15, 8, MULTICHOICE_VICTORIES_QUIT, FALSE switch VAR_RESULT case 0, FourIsland_House2_EventScript_BragLinkWins case 1, FourIsland_House2_EventScript_QuitBrag case SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag end FourIsland_House2_EventScript_ChooseBragHoFEggs:: multichoice 15, 6, MULTICHOICE_HOF_EGGS_QUIT, FALSE switch VAR_RESULT case 0, FourIsland_House2_EventScript_BragHoF case 1, FourIsland_House2_EventScript_BragEggs case 2, FourIsland_House2_EventScript_QuitBrag case SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag end FourIsland_House2_EventScript_ChooseBragHoFLinkWins:: multichoice 15, 6, MULTICHOICE_HOF_VICTORIES_QUIT, FALSE switch VAR_RESULT case 0, FourIsland_House2_EventScript_BragHoF case 1, FourIsland_House2_EventScript_BragLinkWins case 2, FourIsland_House2_EventScript_QuitBrag case SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag end FourIsland_House2_EventScript_ChooseBragEggsLinkWins:: multichoice 15, 6, MULTICHOICE_EGGS_VICTORIES_QUIT, FALSE switch VAR_RESULT case 0, FourIsland_House2_EventScript_BragEggs case 1, FourIsland_House2_EventScript_BragLinkWins case 2, FourIsland_House2_EventScript_QuitBrag case SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag end FourIsland_House2_EventScript_ChooseBragHofEggsLinkWins:: multichoice 15, 5, MULTICHOICE_HOF_EGGS_VICTORIES_QUIT, FALSE switch VAR_RESULT case 0, FourIsland_House2_EventScript_BragHoF case 1, FourIsland_House2_EventScript_BragEggs case 2, FourIsland_House2_EventScript_BragLinkWins case 3, FourIsland_House2_EventScript_QuitBrag case SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag end FourIsland_House2_EventScript_StickerManNothingToBrag:: msgbox FourIsland_House2_Text_GiveYouStickerIfYouBrag release end FourIsland_House2_EventScript_BragHoF:: goto_if_le VAR_0x8004, 39, FourIsland_House2_EventScript_BragHoFLowest goto_if_le VAR_0x8004, 99, FourIsland_House2_EventScript_BragHoFLow goto_if_le VAR_0x8004, 199, FourIsland_House2_EventScript_BragHoFHigh goto_if_ge VAR_0x8004, 200, FourIsland_House2_EventScript_BragHoFHighest end FourIsland_House2_EventScript_BragHoFLowest:: goto_if_eq VAR_HOF_BRAG_STATE, 1, FourIsland_House2_EventScript_AlreadyBraggedHoF setvar VAR_HOF_BRAG_STATE, 1 msgbox FourIsland_House2_Text_WowHoFLowest goto FourIsland_House2_EventScript_BraggedHoF end FourIsland_House2_EventScript_BragHoFLow:: goto_if_eq VAR_HOF_BRAG_STATE, 2, FourIsland_House2_EventScript_AlreadyBraggedHoF setvar VAR_HOF_BRAG_STATE, 2 msgbox FourIsland_House2_Text_WowHoFLow goto FourIsland_House2_EventScript_BraggedHoF end FourIsland_House2_EventScript_BragHoFHigh:: goto_if_eq VAR_HOF_BRAG_STATE, 3, FourIsland_House2_EventScript_AlreadyBraggedHoF setvar VAR_HOF_BRAG_STATE, 3 msgbox FourIsland_House2_Text_WowHoFHigh goto FourIsland_House2_EventScript_BraggedHoF end FourIsland_House2_EventScript_BragHoFHighest:: goto_if_eq VAR_HOF_BRAG_STATE, 4, FourIsland_House2_EventScript_AlreadyBraggedHoFMax setvar VAR_HOF_BRAG_STATE, 4 msgbox FourIsland_House2_Text_WowHoFHighest goto FourIsland_House2_EventScript_BraggedHoF end FourIsland_House2_EventScript_AlreadyBraggedHoF:: msgbox FourIsland_House2_Text_ComeBackWithBetterStoryHoF release end FourIsland_House2_EventScript_AlreadyBraggedHoFMax:: msgbox FourIsland_House2_Text_LivingLegendHoF release end FourIsland_House2_EventScript_BraggedHoF:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message FourIsland_House2_Text_HoFStickerApplied waitmessage waitfanfare delay 90 release end FourIsland_House2_EventScript_BragEggs:: goto_if_le VAR_0x8005, 99, FourIsland_House2_EventScript_BragEggsLowest goto_if_le VAR_0x8005, 199, FourIsland_House2_EventScript_BragEggsLow goto_if_le VAR_0x8005, 299, FourIsland_House2_EventScript_BragEggsHigh goto_if_ge VAR_0x8005, 300, FourIsland_House2_EventScript_BragEggsHighest end FourIsland_House2_EventScript_BragEggsLowest:: goto_if_eq VAR_EGG_BRAG_STATE, 1, FourIsland_House2_EventScript_AlreadyBraggedEggs setvar VAR_EGG_BRAG_STATE, 1 msgbox FourIsland_House2_Text_WowEggsLowest goto FourIsland_House2_EventScript_BraggedEggs end FourIsland_House2_EventScript_BragEggsLow:: goto_if_eq VAR_EGG_BRAG_STATE, 2, FourIsland_House2_EventScript_AlreadyBraggedEggs setvar VAR_EGG_BRAG_STATE, 2 msgbox FourIsland_House2_Text_WowEggsLow goto FourIsland_House2_EventScript_BraggedEggs end FourIsland_House2_EventScript_BragEggsHigh:: goto_if_eq VAR_EGG_BRAG_STATE, 3, FourIsland_House2_EventScript_AlreadyBraggedEggs setvar VAR_EGG_BRAG_STATE, 3 msgbox FourIsland_House2_Text_WowEggsHigh goto FourIsland_House2_EventScript_BraggedEggs end FourIsland_House2_EventScript_BragEggsHighest:: goto_if_eq VAR_EGG_BRAG_STATE, 4, FourIsland_House2_EventScript_AlreadyBraggedEggsMax setvar VAR_EGG_BRAG_STATE, 4 msgbox FourIsland_House2_Text_WowEggsHighest goto FourIsland_House2_EventScript_BraggedEggs end FourIsland_House2_EventScript_AlreadyBraggedEggs:: msgbox FourIsland_House2_Text_ComeBackWithBetterStoryEggs release end FourIsland_House2_EventScript_AlreadyBraggedEggsMax:: msgbox FourIsland_House2_Text_LivingLegendEggs release end FourIsland_House2_EventScript_BraggedEggs:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message FourIsland_House2_Text_EggStickerApplied waitmessage waitfanfare delay 90 release end FourIsland_House2_EventScript_BragLinkWins:: goto_if_le VAR_0x8006, 19, FourIsland_House2_EventScript_BragLinkWinsLowest goto_if_le VAR_0x8006, 49, FourIsland_House2_EventScript_BragLinkWinsLow goto_if_le VAR_0x8006, 99, FourIsland_House2_EventScript_BragLinkWinsHigh goto_if_ge VAR_0x8006, 100, FourIsland_House2_EventScript_BragLinkWinsHighest end FourIsland_House2_EventScript_BragLinkWinsLowest:: goto_if_eq VAR_LINK_WIN_BRAG_STATE, 1, FourIsland_House2_EventScript_AlreadyBraggedLinkWins setvar VAR_LINK_WIN_BRAG_STATE, 1 msgbox FourIsland_House2_Text_WowLinkWinsLowest goto FourIsland_House2_EventScript_BraggedLinkWins end FourIsland_House2_EventScript_BragLinkWinsLow:: goto_if_eq VAR_LINK_WIN_BRAG_STATE, 2, FourIsland_House2_EventScript_AlreadyBraggedLinkWins setvar VAR_LINK_WIN_BRAG_STATE, 2 msgbox FourIsland_House2_Text_WowLinkWinsLow goto FourIsland_House2_EventScript_BraggedLinkWins end FourIsland_House2_EventScript_BragLinkWinsHigh:: goto_if_eq VAR_LINK_WIN_BRAG_STATE, 3, FourIsland_House2_EventScript_AlreadyBraggedLinkWins setvar VAR_LINK_WIN_BRAG_STATE, 3 msgbox FourIsland_House2_Text_WowLinkWinsHigh goto FourIsland_House2_EventScript_BraggedLinkWins end FourIsland_House2_EventScript_BragLinkWinsHighest:: goto_if_eq VAR_LINK_WIN_BRAG_STATE, 4, FourIsland_House2_EventScript_AlreadyBraggedLinkWinsMax setvar VAR_LINK_WIN_BRAG_STATE, 4 msgbox FourIsland_House2_Text_WowLinkWinsHighest goto FourIsland_House2_EventScript_BraggedLinkWins end FourIsland_House2_EventScript_AlreadyBraggedLinkWins:: msgbox FourIsland_House2_Text_ComeBackWithBetterStoryLinkWins release end FourIsland_House2_EventScript_AlreadyBraggedLinkWinsMax:: msgbox FourIsland_House2_Text_LivingLegendLinkWins release end FourIsland_House2_EventScript_BraggedLinkWins:: textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message FourIsland_House2_Text_VictoryStickerApplied waitmessage waitfanfare delay 90 release end FourIsland_House2_EventScript_QuitBrag:: release end ================================================ FILE: data/scripts/trainer_tower.inc ================================================ @ Local IDs apply to all floors (not lobby or roof) .equ LOCALID_TRAINER_DOUBLES1, 2 .equ LOCALID_TRAINER_SINGLES, 3 .equ LOCALID_TRAINER_KNOCKOUT, 4 .equ LOCALID_TRAINER_DOUBLES2, 5 .equ HIDE_TRAINER_DOUBLES1, FLAG_TEMP_2 .equ HIDE_TRAINER_SINGLES, FLAG_TEMP_3 .equ HIDE_TRAINER_KNOCKOUT, FLAG_TEMP_4 .equ HIDE_TRAINER_DOUBLES2, FLAG_TEMP_5 .equ HIDE_OWNER, FLAG_TEMP_6 .equ DISABLE_SINGLES_TRIGGER, VAR_TEMP_E .equ DISABLE_DOUBLES_TRIGGER, VAR_TEMP_F @@ Map scripts TrainerTower_OnResume:: setvar VAR_TEMP_2, 0 ttower_resumetimer end TrainerTower_OnTransition:: ttower_initfloor switch VAR_RESULT case CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_SetObjectsSingles case CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_SetObjectsDoubles case CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_SetObjectsKnockout setflag HIDE_TRAINER_DOUBLES1 setflag HIDE_TRAINER_SINGLES setflag HIDE_TRAINER_KNOCKOUT setflag HIDE_TRAINER_DOUBLES2 setvar DISABLE_SINGLES_TRIGGER, TRUE setvar DISABLE_DOUBLES_TRIGGER, TRUE end TrainerTower_EventScript_SetObjectsSingles:: setflag HIDE_TRAINER_DOUBLES1 setflag HIDE_TRAINER_KNOCKOUT setflag HIDE_TRAINER_DOUBLES2 setvar DISABLE_DOUBLES_TRIGGER, TRUE setobjectxyperm LOCALID_TRAINER_SINGLES, 15, 13 setobjectmovementtype LOCALID_TRAINER_SINGLES, MOVEMENT_TYPE_FACE_LEFT goto TrainerTower_EventScript_HideOwner TrainerTower_EventScript_SetObjectsDoubles:: setflag HIDE_TRAINER_SINGLES setflag HIDE_TRAINER_KNOCKOUT setvar DISABLE_SINGLES_TRIGGER, TRUE ttower_isfloorcleared goto_if_eq VAR_RESULT, TRUE, TrainerTower_EventScript_SetObjectsDoublesAlreadyBeaten setobjectxyperm LOCALID_TRAINER_DOUBLES1, 10, 12 setobjectmovementtype LOCALID_TRAINER_DOUBLES1, MOVEMENT_TYPE_FACE_LEFT setobjectxyperm LOCALID_TRAINER_DOUBLES2, 10, 13 setobjectmovementtype LOCALID_TRAINER_DOUBLES2, MOVEMENT_TYPE_FACE_LEFT goto TrainerTower_EventScript_HideOwner TrainerTower_EventScript_SetObjectsDoublesAlreadyBeaten:: setobjectxyperm LOCALID_TRAINER_DOUBLES1, 10, 12 setobjectmovementtype LOCALID_TRAINER_DOUBLES1, MOVEMENT_TYPE_FACE_DOWN setobjectxyperm LOCALID_TRAINER_DOUBLES2, 11, 12 setobjectmovementtype LOCALID_TRAINER_DOUBLES2, MOVEMENT_TYPE_FACE_DOWN goto TrainerTower_EventScript_HideOwner @ Knockout challenge re-uses trainer objects TrainerTower_EventScript_SetObjectsKnockout:: setflag HIDE_TRAINER_DOUBLES2 setvar DISABLE_DOUBLES_TRIGGER, TRUE setobjectxyperm LOCALID_TRAINER_DOUBLES1, 10, 10 setobjectmovementtype LOCALID_TRAINER_DOUBLES1, MOVEMENT_TYPE_FACE_DOWN setobjectxyperm LOCALID_TRAINER_SINGLES, 14, 13 setobjectmovementtype LOCALID_TRAINER_SINGLES, MOVEMENT_TYPE_FACE_LEFT setobjectxyperm LOCALID_TRAINER_KNOCKOUT, 10, 16 setobjectmovementtype LOCALID_TRAINER_KNOCKOUT, MOVEMENT_TYPE_FACE_UP TrainerTower_EventScript_HideOwner: setflag HIDE_OWNER end TrainerTower_OnFrame:: map_script_2 VAR_TEMP_2, 0, TrainerTower_EventScript_EnterFloor .2byte 0 TrainerTower_EventScript_EnterFloor:: setvar VAR_TEMP_2, 1 ttower_isfloorcleared goto_if_eq VAR_RESULT, FALSE, TrainerTower_EventScript_EndEnterFloor setvar DISABLE_SINGLES_TRIGGER, TRUE setvar DISABLE_DOUBLES_TRIGGER, TRUE TrainerTower_EventScript_EndEnterFloor: ttower_shouldexit goto_if_eq VAR_RESULT, TRUE, TrainerTower_EventScript_WarpToLobby end @ Never reached TrainerTower_EventScript_WarpToLobby:: warp MAP_TRAINER_TOWER_LOBBY, 9, 7 waitstate @@ Battle scripts TrainerTower_EventScript_TriggerBattle:: ttower_getchallengetype switch VAR_RESULT case CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_DoSingleBattle case CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_DoDoubleBattle case CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_DoKnockoutBattle TrainerTower_EventScript_DoSingleBattle: ttower_encountermusic applymovement LOCALID_TRAINER_SINGLES, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_TRAINER_SINGLES, Common_Movement_Delay48 waitmovement 0 setvar DISABLE_SINGLES_TRIGGER, TRUE applymovement LOCALID_TRAINER_SINGLES, TrainerTower_Movement_SingleTrainerApproach waitmovement 0 ttower_getspeech TRAINER_TOWER_TEXT_INTRO, 0 msgbox gStringVar4 closemessage goto TrainerTower_EventScript_DoBattle TrainerTower_EventScript_DoDoubleBattle:: ttower_getspeech TRAINER_TOWER_TEXT_INTRO, VAR_TEMP_3 msgbox gStringVar4 setvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_SPEECH setvar VAR_0x8005, TRAINER_TOWER_TEXT_INTRO addvar VAR_TEMP_3, 1 goto_if_eq VAR_TEMP_3, 1, TrainerTower_EventScript_DoSecondTrainerIntro setvar VAR_TEMP_3, 0 TrainerTower_EventScript_DoSecondTrainerIntro: copyvar VAR_0x8006, VAR_TEMP_3 special CallTrainerTowerFunc msgbox gStringVar4 closemessage goto TrainerTower_EventScript_DoBattle TrainerTower_EventScript_DoKnockoutBattle:: switch VAR_TEMP_1 case 0, TrainerTower_EventScript_DoKnockoutBattle1 case 1, TrainerTower_EventScript_DoKnockoutBattle2 case 2, TrainerTower_EventScript_DoKnockoutBattle3 TrainerTower_EventScript_DoKnockoutBattle1: ttower_encountermusic applymovement LOCALID_TRAINER_KNOCKOUT, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_TRAINER_KNOCKOUT, Common_Movement_Delay48 waitmovement 0 applymovement LOCALID_TRAINER_KNOCKOUT, TrainerTower_Movement_BottomKnockoutTrainerApproach waitmovement 0 goto TrainerTower_EventScript_DoKnockoutBattleIntro TrainerTower_EventScript_DoKnockoutBattle2:: ttower_encountermusic applymovement LOCALID_TRAINER_DOUBLES1, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_TRAINER_DOUBLES1, Common_Movement_Delay48 waitmovement 0 applymovement LOCALID_TRAINER_DOUBLES1, TrainerTower_Movement_TopKnockoutTrainerApproach waitmovement 0 goto TrainerTower_EventScript_DoKnockoutBattleIntro TrainerTower_EventScript_DoKnockoutBattle3:: ttower_encountermusic applymovement LOCALID_TRAINER_SINGLES, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_TRAINER_SINGLES, Common_Movement_Delay48 waitmovement 0 applymovement LOCALID_TRAINER_SINGLES, TrainerTower_Movement_RightKnockoutTrainerApproach waitmovement 0 TrainerTower_EventScript_DoKnockoutBattleIntro: ttower_getspeech TRAINER_TOWER_TEXT_INTRO, VAR_TEMP_1 msgbox gStringVar4 closemessage TrainerTower_EventScript_DoBattle: ttower_dobattle waitstate switch VAR_RESULT case B_OUTCOME_WON, TrainerTower_EventScript_WonBattle case B_OUTCOME_LOST, TrainerTower_EventScript_WarpToLobbyLost case B_OUTCOME_DREW, TrainerTower_EventScript_WarpToLobbyLost TrainerTower_EventScript_WonBattle: ttower_getchallengetype switch VAR_RESULT case CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_SetFloorCleared case CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_MoveDoublesTrainers case CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_CheckNextKnockoutBattle TrainerTower_EventScript_CheckNextKnockoutBattle: switch VAR_TEMP_1 case 0, TrainerTower_EventScript_DoSecondKnockoutBattle case 1, TrainerTower_EventScript_DoThirdKnockoutBattle case 2, TrainerTower_EventScript_MoveLastKnockoutTrainer TrainerTower_EventScript_DoSecondKnockoutBattle: addvar VAR_TEMP_1, 1 goto TrainerTower_EventScript_DoKnockoutBattle TrainerTower_EventScript_DoThirdKnockoutBattle:: addvar VAR_TEMP_1, 1 goto TrainerTower_EventScript_DoKnockoutBattle TrainerTower_EventScript_MoveDoublesTrainers:: applymovement LOCALID_TRAINER_DOUBLES2, TrainerTower_Movement_DoublesTrainer2OutOfWay waitmovement 0 applymovement LOCALID_TRAINER_DOUBLES1, TrainerTower_Movement_DoublesTrainer1FaceDown goto TrainerTower_EventScript_SetFloorCleared TrainerTower_EventScript_MoveLastKnockoutTrainer:: applymovement LOCALID_TRAINER_SINGLES, TrainerTower_Movement_LastKnockoutTrainerOutOfWay TrainerTower_EventScript_SetFloorCleared: ttower_clearedfloor end TrainerTower_EventScript_WarpToLobbyLost:: special HealPlayerParty ttower_setlost warp MAP_TRAINER_TOWER_LOBBY, 9, 7 waitstate @@ Speaking to trainers after battle TrainerTower_EventScript_SpeakToDoublesTrainer1:: ttower_getchallengetype switch VAR_RESULT case CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_DoublesTrainer1PostBattle case CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_DoublesTrainer1PostBattle case CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_KnockoutTrainer2PostBattle TrainerTower_EventScript_DoublesTrainer1PostBattle: setvar VAR_0x8006, 0 goto TrainerTower_EventScript_DoPostBattleText TrainerTower_EventScript_KnockoutTrainer2PostBattle:: setvar VAR_0x8006, 1 goto TrainerTower_EventScript_DoPostBattleText TrainerTower_EventScript_SpeakToSinglesTrainer:: ttower_getchallengetype switch VAR_RESULT case CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_SinglesTrainerPostBattle case CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_SinglesTrainerPostBattle case CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_KnockoutTrainer3PostBattle TrainerTower_EventScript_SinglesTrainerPostBattle: setvar VAR_0x8006, 0 goto TrainerTower_EventScript_DoPostBattleText TrainerTower_EventScript_KnockoutTrainer3PostBattle:: setvar VAR_0x8006, 2 goto TrainerTower_EventScript_DoPostBattleText TrainerTower_EventScript_SpeakToKnockoutTrainer:: setvar VAR_0x8006, 0 goto TrainerTower_EventScript_DoPostBattleText TrainerTower_EventScript_SpeakToDoublesTrainer2:: setvar VAR_0x8006, 1 TrainerTower_EventScript_DoPostBattleText: ttower_getspeech TRAINER_TOWER_TEXT_AFTER lock faceplayer msgbox gStringVar4 release return @@ Speaking to owner TrainerTower_EventScript_SpeakToOwner:: lock faceplayer ttower_getownerstate switch VAR_RESULT case 0, TrainerTower_Roof_EventScript_Arrived case 1, TrainerTower_Roof_EventScript_GivePrize case 2, TrainerTower_Roof_EventScript_OwnerEnd TrainerTower_Roof_EventScript_Arrived: msgbox TrainerTower_Roof_Text_ImOwnerBattledPerfectly TrainerTower_Roof_EventScript_GivePrize: ttower_giveprize switch VAR_RESULT case 0, TrainerTower_Roof_EventScript_ReceivePrize case 1, TrainerTower_Roof_EventScript_NoRoomForPrize case 2, TrainerTower_Roof_EventScript_CheckFinalTime TrainerTower_Roof_EventScript_ReceivePrize: msgbox TrainerTower_Roof_Text_ThisIsForYou textcolor NPC_TEXT_COLOR_NEUTRAL playfanfare MUS_LEVEL_UP message Text_ObtainedTheX waitfanfare waitmessage bufferstdstring STR_VAR_3, STDSTRING_ITEMS_POCKET msgbox Text_PutItemAway call EventScript_RestorePrevTextColor goto TrainerTower_Roof_EventScript_CheckFinalTime TrainerTower_Roof_EventScript_NoRoomForPrize:: msgbox TrainerTower_Roof_Text_ThisIsForYou msgbox Text_BagIsFull goto TrainerTower_Roof_EventScript_CheckFinalTime TrainerTower_Roof_EventScript_CheckFinalTime:: ttower_checkfinaltime switch VAR_RESULT case 0, TrainerTower_Roof_EventScript_NewRecord case 1, TrainerTower_Roof_EventScript_NoNewRecord case 2, TrainerTower_Roof_EventScript_OwnerEnd TrainerTower_Roof_EventScript_NewRecord: msgbox TrainerTower_Roof_Text_DoneItInRecordTime goto TrainerTower_Roof_EventScript_OwnerEnd TrainerTower_Roof_EventScript_NoNewRecord:: msgbox TrainerTower_Roof_Text_TookSweetTimeGettingHere TrainerTower_Roof_EventScript_OwnerEnd: msgbox TrainerTower_Roof_Text_IdLikeToSeeBetterTime release return TrainerTower_EventScript_ShowTime:: lockall ttower_gettime msgbox TrainerTower_Text_XMinYZSec releaseall end @@ Battle triggers TrainerTower_EventScript_SingleBattleTrigger:: goto TrainerTower_EventScript_TriggerBattle TrainerTower_EventScript_DoubleBattleTriggerTop:: setvar VAR_TEMP_3, 0 ttower_checkdoubles goto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, TrainerTower_EventScript_IneligibleForDoubleBattle ttower_encountermusic applymovement LOCALID_TRAINER_DOUBLES1, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_TRAINER_DOUBLES1, Common_Movement_Delay48 goto TrainerTower_EventScript_TriggerDoubleBattle TrainerTower_EventScript_DoubleBattleTriggerBottom:: setvar VAR_TEMP_3, 1 ttower_checkdoubles goto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, TrainerTower_EventScript_IneligibleForDoubleBattle ttower_encountermusic applymovement LOCALID_TRAINER_DOUBLES2, Common_Movement_ExclamationMark waitmovement 0 applymovement LOCALID_TRAINER_DOUBLES2, Common_Movement_Delay48 TrainerTower_EventScript_TriggerDoubleBattle: waitmovement 0 setvar DISABLE_DOUBLES_TRIGGER, TRUE goto TrainerTower_EventScript_TriggerBattle TrainerTower_EventScript_IneligibleForDoubleBattle:: lockall playse SE_DING_DONG msgbox TrainerTower_Lobby_Text_NeedTwoMonsForDouble closemessage applymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Movement_PushPlayerBack waitmovement 0 releaseall end TrainerTower_Movement_SingleTrainerApproach: walk_left TrainerTower_Movement_RightKnockoutTrainerApproach:: walk_left walk_left TrainerTower_Movement_PushPlayerBack: walk_left step_end TrainerTower_Movement_BottomKnockoutTrainerApproach:: walk_up walk_up step_end TrainerTower_Movement_TopKnockoutTrainerApproach:: walk_down walk_down step_end TrainerTower_Movement_DoublesTrainer2OutOfWay:: walk_right TrainerTower_Movement_LastKnockoutTrainerOutOfWay: walk_up face_down step_end TrainerTower_Movement_DoublesTrainer1FaceDown:: face_down step_end ================================================ FILE: data/scripts/trainers.inc ================================================ Route3_EventScript_Ben:: trainerbattle_single TRAINER_YOUNGSTER_BEN, Route3_Text_BenIntro, Route3_Text_BenDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route3_EventScript_BenRematch msgbox Route3_Text_BenPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_BenRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_BEN, Route3_Text_BenRematchIntro, Route3_Text_BenDefeat msgbox Route3_Text_BenPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_Calvin:: trainerbattle_single TRAINER_YOUNGSTER_CALVIN, Route3_Text_CalvinIntro, Route3_Text_CalvinDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route3_EventScript_CalvinRematch msgbox Route3_Text_CalvinPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_CalvinRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_CALVIN, Route3_Text_CalvinRematchIntro, Route3_Text_CalvinDefeat msgbox Route3_Text_CalvinPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_Colton:: trainerbattle_single TRAINER_BUG_CATCHER_COLTON, Route3_Text_ColtonIntro, Route3_Text_ColtonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route3_EventScript_ColtonRematch msgbox Route3_Text_ColtonPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_ColtonRematch:: trainerbattle_rematch TRAINER_BUG_CATCHER_COLTON, Route3_Text_ColtonRematchIntro, Route3_Text_ColtonDefeat msgbox Route3_Text_ColtonPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_Greg:: trainerbattle_single TRAINER_BUG_CATCHER_GREG, Route3_Text_GregIntro, Route3_Text_GregDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route3_EventScript_GregRematch msgbox Route3_Text_GregPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_GregRematch:: trainerbattle_rematch TRAINER_BUG_CATCHER_GREG, Route3_Text_GregRematchIntro, Route3_Text_GregDefeat msgbox Route3_Text_GregPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_James:: trainerbattle_single TRAINER_BUG_CATCHER_JAMES, Route3_Text_JamesIntro, Route3_Text_JamesDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route3_EventScript_JamesRematch msgbox Route3_Text_JamesPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_JamesRematch:: trainerbattle_rematch TRAINER_BUG_CATCHER_JAMES, Route3_Text_JamesRematchIntro, Route3_Text_JamesDefeat msgbox Route3_Text_JamesPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_Janice:: trainerbattle_single TRAINER_LASS_JANICE, Route3_Text_JaniceIntro, Route3_Text_JaniceDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route3_EventScript_JaniceRematch msgbox Route3_Text_JanicePostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_JaniceRematch:: trainerbattle_rematch TRAINER_LASS_JANICE, Route3_Text_JaniceRematchIntro, Route3_Text_JaniceDefeat msgbox Route3_Text_JanicePostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_Sally:: trainerbattle_single TRAINER_LASS_SALLY, Route3_Text_SallyIntro, Route3_Text_SallyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route3_EventScript_SallyRematch msgbox Route3_Text_SallyPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_SallyRematch:: trainerbattle_rematch TRAINER_LASS_SALLY, Route3_Text_SallyRematchIntro, Route3_Text_SallyDefeat msgbox Route3_Text_SallyPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_Robin:: trainerbattle_single TRAINER_LASS_ROBIN, Route3_Text_RobinIntro, Route3_Text_RobinDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route3_EventScript_RobinRematch msgbox Route3_Text_RobinPostBattle, MSGBOX_AUTOCLOSE end Route3_EventScript_RobinRematch:: trainerbattle_rematch TRAINER_LASS_ROBIN, Route3_Text_RobinRematchIntro, Route3_Text_RobinDefeat msgbox Route3_Text_RobinPostBattle, MSGBOX_AUTOCLOSE end Route4_EventScript_Crissy:: trainerbattle_single TRAINER_LASS_CRISSY, Route4_Text_CrissyIntro, Route4_Text_CrissyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route4_EventScript_CrissyRematch msgbox Route4_Text_CrissyPostBattle, MSGBOX_AUTOCLOSE end Route4_EventScript_CrissyRematch:: trainerbattle_rematch TRAINER_LASS_CRISSY, Route4_Text_CrissyRematchIntro, Route4_Text_CrissyDefeat msgbox Route4_Text_CrissyPostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_Timmy:: trainerbattle_single TRAINER_YOUNGSTER_TIMMY, Route24_Text_TimmyIntro, Route24_Text_TimmyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route24_EventScript_TimmyRematch msgbox Route24_Text_TimmyPostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_TimmyRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_TIMMY, Route24_Text_TimmyRematchIntro, Route24_Text_TimmyDefeat msgbox Route24_Text_TimmyPostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_Cale:: trainerbattle_single TRAINER_BUG_CATCHER_CALE, Route24_Text_CaleIntro, Route24_Text_CaleDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route24_EventScript_CaleRematch msgbox Route24_Text_CalePostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_CaleRematch:: trainerbattle_rematch TRAINER_BUG_CATCHER_CALE, Route24_Text_CaleRematchIntro, Route24_Text_CaleDefeat msgbox Route24_Text_CalePostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_Reli:: trainerbattle_single TRAINER_LASS_RELI, Route24_Text_ReliIntro, Route24_Text_ReliDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route24_EventScript_ReliRematch msgbox Route24_Text_ReliPostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_ReliRematch:: trainerbattle_rematch TRAINER_LASS_RELI, Route24_Text_ReliRematchIntro, Route24_Text_ReliDefeat msgbox Route24_Text_ReliPostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_Ali:: trainerbattle_single TRAINER_LASS_ALI, Route24_Text_AliIntro, Route24_Text_AliDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route24_EventScript_AliRematch msgbox Route24_Text_AliPostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_AliRematch:: trainerbattle_rematch TRAINER_LASS_ALI, Route24_Text_AliRematchIntro, Route24_Text_AliDefeat msgbox Route24_Text_AliPostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_Shane:: trainerbattle_single TRAINER_CAMPER_SHANE, Route24_Text_ShaneIntro, Route24_Text_ShaneDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route24_EventScript_ShaneRematch msgbox Route24_Text_ShanePostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_ShaneRematch:: trainerbattle_rematch TRAINER_CAMPER_SHANE, Route24_Text_ShaneRematchIntro, Route24_Text_ShaneDefeat msgbox Route24_Text_ShanePostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_Ethan:: trainerbattle_single TRAINER_CAMPER_ETHAN, Route24_Text_EthanIntro, Route24_Text_EthanDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route24_EventScript_EthanRematch msgbox Route24_Text_EthanPostBattle, MSGBOX_AUTOCLOSE end Route24_EventScript_EthanRematch:: trainerbattle_rematch TRAINER_CAMPER_ETHAN, Route24_Text_EthanRematchIntro, Route24_Text_EthanDefeat msgbox Route24_Text_EthanPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_Joey:: trainerbattle_single TRAINER_YOUNGSTER_JOEY, Route25_Text_JoeyIntro, Route25_Text_JoeyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route25_EventScript_JoeyRematch msgbox Route25_Text_JoeyPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_JoeyRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_JOEY, Route25_Text_JoeyRematchIntro, Route25_Text_JoeyDefeat msgbox Route25_Text_JoeyPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_Dan:: trainerbattle_single TRAINER_YOUNGSTER_DAN, Route25_Text_DanIntro, Route25_Text_DanDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route25_EventScript_DanRematch msgbox Route25_Text_DanPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_DanRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_DAN, Route25_Text_DanRematchIntro, Route25_Text_DanDefeat msgbox Route25_Text_DanPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_Chad:: trainerbattle_single TRAINER_YOUNGSTER_CHAD, Route25_Text_ChadIntro, Route25_Text_ChadDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route25_EventScript_ChadRematch msgbox Route25_Text_ChadPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_ChadRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_CHAD, Route25_Text_ChadRematchIntro, Route25_Text_ChadDefeat msgbox Route25_Text_ChadPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_Kelsey:: trainerbattle_single TRAINER_PICNICKER_KELSEY, Route25_Text_KelseyIntro, Route25_Text_KelseyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route25_EventScript_KelseyRematch msgbox Route25_Text_KelseyPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_KelseyRematch:: trainerbattle_rematch TRAINER_PICNICKER_KELSEY, Route25_Text_KelseyRematchIntro, Route25_Text_KelseyDefeat msgbox Route25_Text_KelseyPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_Haley:: trainerbattle_single TRAINER_LASS_HALEY, Route25_Text_HaleyIntro, Route25_Text_HaleyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route25_EventScript_HaleyRematch msgbox Route25_Text_HaleyPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_HaleyRematch:: trainerbattle_rematch TRAINER_LASS_HALEY, Route25_Text_HaleyRematchIntro, Route25_Text_HaleyDefeat msgbox Route25_Text_HaleyPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_Franklin:: trainerbattle_single TRAINER_HIKER_FRANKLIN, Route25_Text_FranklinIntro, Route25_Text_FranklinDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route25_EventScript_FranklinRematch msgbox Route25_Text_FranklinPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_FranklinRematch:: trainerbattle_rematch TRAINER_HIKER_FRANKLIN, Route25_Text_FranklinRematchIntro, Route25_Text_FranklinDefeat msgbox Route25_Text_FranklinPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_Nob:: trainerbattle_single TRAINER_HIKER_NOB, Route25_Text_NobIntro, Route25_Text_NobDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route25_EventScript_NobRematch msgbox Route25_Text_NobPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_NobRematch:: trainerbattle_rematch TRAINER_HIKER_NOB, Route25_Text_NobRematchIntro, Route25_Text_NobDefeat msgbox Route25_Text_NobPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_Wayne:: trainerbattle_single TRAINER_HIKER_WAYNE, Route25_Text_WayneIntro, Route25_Text_WayneDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route25_EventScript_WayneRematch msgbox Route25_Text_WaynePostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_WayneRematch:: trainerbattle_rematch TRAINER_HIKER_WAYNE, Route25_Text_WayneRematchIntro, Route25_Text_WayneDefeat msgbox Route25_Text_WaynePostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_Flint:: trainerbattle_single TRAINER_CAMPER_FLINT, Route25_Text_FlintIntro, Route25_Text_FlintDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route25_EventScript_FlintRematch msgbox Route25_Text_FlintPostBattle, MSGBOX_AUTOCLOSE end Route25_EventScript_FlintRematch:: trainerbattle_rematch TRAINER_CAMPER_FLINT, Route25_Text_FlintRematchIntro, Route25_Text_FlintDefeat msgbox Route25_Text_FlintPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_Keigo:: trainerbattle_single TRAINER_BUG_CATCHER_KEIGO, Route6_Text_KeigoIntro, Route6_Text_KeigoDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route6_EventScript_KeigoRematch msgbox Route6_Text_KeigoPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_KeigoRematch:: trainerbattle_rematch TRAINER_BUG_CATCHER_KEIGO, Route6_Text_KeigoRematchIntro, Route6_Text_KeigoDefeat msgbox Route6_Text_KeigoPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_Elijah:: trainerbattle_single TRAINER_BUG_CATCHER_ELIJAH, Route6_Text_ElijahIntro, Route6_Text_ElijahDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route6_EventScript_ElijahRematch msgbox Route6_Text_ElijahPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_ElijahRematch:: trainerbattle_rematch TRAINER_BUG_CATCHER_ELIJAH, Route6_Text_ElijahRematchIntro, Route6_Text_ElijahDefeat msgbox Route6_Text_ElijahPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_Ricky:: trainerbattle_single TRAINER_CAMPER_RICKY, Route6_Text_RickyIntro, Route6_Text_RickyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route6_EventScript_RickyRematch msgbox Route6_Text_RickyPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_RickyRematch:: trainerbattle_rematch TRAINER_CAMPER_RICKY, Route6_Text_RickyRematchIntro, Route6_Text_RickyDefeat msgbox Route6_Text_RickyPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_Jeff:: trainerbattle_single TRAINER_CAMPER_JEFF, Route6_Text_JeffIntro, Route6_Text_JeffDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route6_EventScript_JeffRematch msgbox Route6_Text_JeffPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_JeffRematch:: trainerbattle_rematch TRAINER_CAMPER_JEFF, Route6_Text_JeffRematchIntro, Route6_Text_JeffDefeat msgbox Route6_Text_JeffPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_Nancy:: trainerbattle_single TRAINER_PICNICKER_NANCY, Route6_Text_NancyIntro, Route6_Text_NancyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route6_EventScript_NancyRematch msgbox Route6_Text_NancyPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_NancyRematch:: trainerbattle_rematch TRAINER_PICNICKER_NANCY, Route6_Text_NancyRematchIntro, Route6_Text_NancyDefeat msgbox Route6_Text_NancyPostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_Isabelle:: trainerbattle_single TRAINER_PICNICKER_ISABELLE, Route6_Text_IsabelleIntro, Route6_Text_IsabelleDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route6_EventScript_IsabelleRematch msgbox Route6_Text_IsabellePostBattle, MSGBOX_AUTOCLOSE end Route6_EventScript_IsabelleRematch:: trainerbattle_rematch TRAINER_PICNICKER_ISABELLE, Route6_Text_IsabelleRematchIntro, Route6_Text_IsabelleDefeat msgbox Route6_Text_IsabellePostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Eddie:: trainerbattle_single TRAINER_YOUNGSTER_EDDIE, Route11_Text_EddieIntro, Route11_Text_EddieDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_EddieRematch msgbox Route11_Text_EddiePostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_EddieRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_EDDIE, Route11_Text_EddieRematchIntro, Route11_Text_EddieDefeat msgbox Route11_Text_EddiePostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Dillon:: trainerbattle_single TRAINER_YOUNGSTER_DILLON, Route11_Text_DillonIntro, Route11_Text_DillonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_DillonRematch msgbox Route11_Text_DillonPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_DillonRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_DILLON, Route11_Text_DillonRematchIntro, Route11_Text_DillonDefeat msgbox Route11_Text_DillonPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Yasu:: trainerbattle_single TRAINER_YOUNGSTER_YASU, Route11_Text_YasuIntro, Route11_Text_YasuDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_YasuRematch msgbox Route11_Text_YasuPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_YasuRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_YASU, Route11_Text_YasuRematchIntro, Route11_Text_YasuDefeat msgbox Route11_Text_YasuPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Dave:: trainerbattle_single TRAINER_YOUNGSTER_DAVE, Route11_Text_DaveIntro, Route11_Text_DaveDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_DaveRematch msgbox Route11_Text_DavePostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_DaveRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_DAVE, Route11_Text_DaveRematchIntro, Route11_Text_DaveDefeat msgbox Route11_Text_DavePostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Braxton:: trainerbattle_single TRAINER_ENGINEER_BRAXTON, Route11_Text_BraxtonIntro, Route11_Text_BraxtonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_BraxtonRematch msgbox Route11_Text_BraxtonPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_BraxtonRematch:: trainerbattle_rematch TRAINER_ENGINEER_BRAXTON, Route11_Text_BraxtonRematchIntro, Route11_Text_BraxtonDefeat msgbox Route11_Text_BraxtonPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Bernie:: trainerbattle_single TRAINER_ENGINEER_BERNIE, Route11_Text_BernieIntro, Route11_Text_BernieDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_BernieRematch msgbox Route11_Text_BerniePostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_BernieRematch:: trainerbattle_rematch TRAINER_ENGINEER_BERNIE, Route11_Text_BernieRematchIntro, Route11_Text_BernieDefeat msgbox Route11_Text_BerniePostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Hugo:: trainerbattle_single TRAINER_GAMER_HUGO, Route11_Text_HugoIntro, Route11_Text_HugoDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_HugoRematch msgbox Route11_Text_HugoPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_HugoRematch:: trainerbattle_rematch TRAINER_GAMER_HUGO, Route11_Text_HugoRematchIntro, Route11_Text_HugoDefeat msgbox Route11_Text_HugoPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Jasper:: trainerbattle_single TRAINER_GAMER_JASPER, Route11_Text_JasperIntro, Route11_Text_JasperDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_JasperRematch msgbox Route11_Text_JasperPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_JasperRematch:: trainerbattle_rematch TRAINER_GAMER_JASPER, Route11_Text_JasperRematchIntro, Route11_Text_JasperDefeat msgbox Route11_Text_JasperPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Dirk:: trainerbattle_single TRAINER_GAMER_DIRK, Route11_Text_DirkIntro, Route11_Text_DirkDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_DirkRematch msgbox Route11_Text_DirkPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_DirkRematch:: trainerbattle_rematch TRAINER_GAMER_DIRK, Route11_Text_DirkRematchIntro, Route11_Text_DirkDefeat msgbox Route11_Text_DirkPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_Darian:: trainerbattle_single TRAINER_GAMER_DARIAN, Route11_Text_DarianIntro, Route11_Text_DarianDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route11_EventScript_DarianRematch msgbox Route11_Text_DarianPostBattle, MSGBOX_AUTOCLOSE end Route11_EventScript_DarianRematch:: trainerbattle_rematch TRAINER_GAMER_DARIAN, Route11_Text_DarianRematchIntro, Route11_Text_DarianDefeat msgbox Route11_Text_DarianPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_Brent:: trainerbattle_single TRAINER_BUG_CATCHER_BRENT, Route9_Text_BrentIntro, Route9_Text_BrentDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route9_EventScript_BrentRematch msgbox Route9_Text_BrentPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_BrentRematch:: trainerbattle_rematch TRAINER_BUG_CATCHER_BRENT, Route9_Text_BrentRematchIntro, Route9_Text_BrentDefeat msgbox Route9_Text_BrentPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_Conner:: trainerbattle_single TRAINER_BUG_CATCHER_CONNER, Route9_Text_ConnerIntro, Route9_Text_ConnerDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route9_EventScript_ConnerRematch msgbox Route9_Text_ConnerPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_ConnerRematch:: trainerbattle_rematch TRAINER_BUG_CATCHER_CONNER, Route9_Text_ConnerRematchIntro, Route9_Text_ConnerDefeat msgbox Route9_Text_ConnerPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_Chris:: trainerbattle_single TRAINER_CAMPER_CHRIS, Route9_Text_ChrisIntro, Route9_Text_ChrisDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route9_EventScript_ChrisRematch msgbox Route9_Text_ChrisPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_ChrisRematch:: trainerbattle_rematch TRAINER_CAMPER_CHRIS, Route9_Text_ChrisRematchIntro, Route9_Text_ChrisDefeat msgbox Route9_Text_ChrisPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_Drew:: trainerbattle_single TRAINER_CAMPER_DREW, Route9_Text_DrewIntro, Route9_Text_DrewDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route9_EventScript_DrewRematch msgbox Route9_Text_DrewPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_DrewRematch:: trainerbattle_rematch TRAINER_CAMPER_DREW, Route9_Text_DrewRematchIntro, Route9_Text_DrewDefeat msgbox Route9_Text_DrewPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_Alicia:: trainerbattle_single TRAINER_PICNICKER_ALICIA, Route9_Text_AliciaIntro, Route9_Text_AliciaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route9_EventScript_AliciaRematch msgbox Route9_Text_AliciaPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_AliciaRematch:: trainerbattle_rematch TRAINER_PICNICKER_ALICIA, Route9_Text_AliciaRematchIntro, Route9_Text_AliciaDefeat msgbox Route9_Text_AliciaPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_Caitlin:: trainerbattle_single TRAINER_PICNICKER_CAITLIN, Route9_Text_CaitlinIntro, Route9_Text_CaitlinDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route9_EventScript_CaitlinRematch msgbox Route9_Text_CaitlinPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_CaitlinRematch:: trainerbattle_rematch TRAINER_PICNICKER_CAITLIN, Route9_Text_CaitlinRematchIntro, Route9_Text_CaitlinDefeat msgbox Route9_Text_CaitlinPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_Alan:: trainerbattle_single TRAINER_HIKER_ALAN, Route9_Text_AlanIntro, Route9_Text_AlanDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route9_EventScript_AlanRematch msgbox Route9_Text_AlanPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_AlanRematch:: trainerbattle_rematch TRAINER_HIKER_ALAN, Route9_Text_AlanRematchIntro, Route9_Text_AlanDefeat msgbox Route9_Text_AlanPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_Brice:: trainerbattle_single TRAINER_HIKER_BRICE, Route9_Text_BriceIntro, Route9_Text_BriceDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route9_EventScript_BriceRematch msgbox Route9_Text_BricePostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_BriceRematch:: trainerbattle_rematch TRAINER_HIKER_BRICE, Route9_Text_BriceRematchIntro, Route9_Text_BriceDefeat msgbox Route9_Text_BricePostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_Jeremy:: trainerbattle_single TRAINER_HIKER_JEREMY, Route9_Text_JeremyIntro, Route9_Text_JeremyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route9_EventScript_JeremyRematch msgbox Route9_Text_JeremyPostBattle, MSGBOX_AUTOCLOSE end Route9_EventScript_JeremyRematch:: trainerbattle_rematch TRAINER_HIKER_JEREMY, Route9_Text_JeremyRematchIntro, Route9_Text_JeremyDefeat msgbox Route9_Text_JeremyPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_Heidi:: trainerbattle_single TRAINER_PICNICKER_HEIDI, Route10_Text_HeidiIntro, Route10_Text_HeidiDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route10_EventScript_HeidiRematch msgbox Route10_Text_HeidiPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_HeidiRematch:: trainerbattle_rematch TRAINER_PICNICKER_HEIDI, Route10_Text_HeidiRematchIntro, Route10_Text_HeidiDefeat msgbox Route10_Text_HeidiPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_Carol:: trainerbattle_single TRAINER_PICNICKER_CAROL, Route10_Text_CarolIntro, Route10_Text_CarolDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route10_EventScript_CarolRematch msgbox Route10_Text_CarolPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_CarolRematch:: trainerbattle_rematch TRAINER_PICNICKER_CAROL, Route10_Text_CarolRematchIntro, Route10_Text_CarolDefeat msgbox Route10_Text_CarolPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_Mark:: trainerbattle_single TRAINER_POKEMANIAC_MARK, Route10_Text_MarkIntro, Route10_Text_MarkDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route10_EventScript_MarkRematch msgbox Route10_Text_MarkPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_MarkRematch:: trainerbattle_rematch TRAINER_POKEMANIAC_MARK, Route10_Text_MarkRematchIntro, Route10_Text_MarkDefeat msgbox Route10_Text_MarkPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_Herman:: trainerbattle_single TRAINER_POKEMANIAC_HERMAN, Route10_Text_HermanIntro, Route10_Text_HermanDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route10_EventScript_HermanRematch msgbox Route10_Text_HermanPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_HermanRematch:: trainerbattle_rematch TRAINER_POKEMANIAC_HERMAN, Route10_Text_HermanRematchIntro, Route10_Text_HermanDefeat msgbox Route10_Text_HermanPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_Clark:: trainerbattle_single TRAINER_HIKER_CLARK, Route10_Text_ClarkIntro, Route10_Text_ClarkDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route10_EventScript_ClarkRematch msgbox Route10_Text_ClarkPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_ClarkRematch:: trainerbattle_rematch TRAINER_HIKER_CLARK, Route10_Text_ClarkRematchIntro, Route10_Text_ClarkDefeat msgbox Route10_Text_ClarkPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_Trent:: trainerbattle_single TRAINER_HIKER_TRENT, Route10_Text_TrentIntro, Route10_Text_TrentDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route10_EventScript_TrentRematch msgbox Route10_Text_TrentPostBattle, MSGBOX_AUTOCLOSE end Route10_EventScript_TrentRematch:: trainerbattle_rematch TRAINER_HIKER_TRENT, Route10_Text_TrentRematchIntro, Route10_Text_TrentDefeat msgbox Route10_Text_TrentPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Paige:: trainerbattle_single TRAINER_LASS_PAIGE, Route8_Text_PaigeIntro, Route8_Text_PaigeDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_PaigeRematch msgbox Route8_Text_PaigePostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_PaigeRematch:: trainerbattle_rematch TRAINER_LASS_PAIGE, Route8_Text_PaigeRematchIntro, Route8_Text_PaigeDefeat msgbox Route8_Text_PaigePostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Andrea:: trainerbattle_single TRAINER_LASS_ANDREA, Route8_Text_AndreaIntro, Route8_Text_AndreaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_AndreaRematch msgbox Route8_Text_AndreaPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_AndreaRematch:: trainerbattle_rematch TRAINER_LASS_ANDREA, Route8_Text_AndreaRematchIntro, Route8_Text_AndreaDefeat msgbox Route8_Text_AndreaPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Megan:: trainerbattle_single TRAINER_LASS_MEGAN, Route8_Text_MeganIntro, Route8_Text_MeganDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_MeganRematch msgbox Route8_Text_MeganPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_MeganRematch:: trainerbattle_rematch TRAINER_LASS_MEGAN, Route8_Text_MeganRematchIntro, Route8_Text_MeganDefeat msgbox Route8_Text_MeganPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Julia:: trainerbattle_single TRAINER_LASS_JULIA, Route8_Text_JuliaIntro, Route8_Text_JuliaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_JuliaRematch msgbox Route8_Text_JuliaPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_JuliaRematch:: trainerbattle_rematch TRAINER_LASS_JULIA, Route8_Text_JuliaRematchIntro, Route8_Text_JuliaDefeat msgbox Route8_Text_JuliaPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Aidan:: trainerbattle_single TRAINER_SUPER_NERD_AIDAN, Route8_Text_AidanIntro, Route8_Text_AidanDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_AidanRematch msgbox Route8_Text_AidanPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_AidanRematch:: trainerbattle_rematch TRAINER_SUPER_NERD_AIDAN, Route8_Text_AidanRematchIntro, Route8_Text_AidanDefeat msgbox Route8_Text_AidanPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Glenn:: trainerbattle_single TRAINER_SUPER_NERD_GLENN, Route8_Text_GlennIntro, Route8_Text_GlennDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_GlennRematch msgbox Route8_Text_GlennPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_GlennRematch:: trainerbattle_rematch TRAINER_SUPER_NERD_GLENN, Route8_Text_GlennRematchIntro, Route8_Text_GlennDefeat msgbox Route8_Text_GlennPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Leslie:: trainerbattle_single TRAINER_SUPER_NERD_LESLIE, Route8_Text_LeslieIntro, Route8_Text_LeslieDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_LeslieRematch msgbox Route8_Text_LesliePostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_LeslieRematch:: trainerbattle_rematch TRAINER_SUPER_NERD_LESLIE, Route8_Text_LeslieRematchIntro, Route8_Text_LeslieDefeat msgbox Route8_Text_LesliePostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Stan:: trainerbattle_single TRAINER_GAMER_STAN, Route8_Text_StanIntro, Route8_Text_StanDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_StanRematch msgbox Route8_Text_StanPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_StanRematch:: trainerbattle_rematch TRAINER_GAMER_STAN, Route8_Text_StanRematchIntro, Route8_Text_StanDefeat msgbox Route8_Text_StanPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Rich:: trainerbattle_single TRAINER_GAMER_RICH, Route8_Text_RichIntro, Route8_Text_RichDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_RichRematch msgbox Route8_Text_RichPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_RichRematch:: trainerbattle_rematch TRAINER_GAMER_RICH, Route8_Text_RichRematchIntro, Route8_Text_RichDefeat msgbox Route8_Text_RichPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Eli:: trainerbattle_double TRAINER_TWINS_ELI_ANNE, Route8_Text_EliIntro, Route8_Text_EliDefeat, Route8_Text_EliNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_EliRematch msgbox Route8_Text_EliPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_EliRematch:: trainerbattle_rematch_double TRAINER_TWINS_ELI_ANNE, Route8_Text_EliRematchIntro, Route8_Text_EliDefeat, Route8_Text_EliNotEnoughMons msgbox Route8_Text_EliPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Anne:: trainerbattle_double TRAINER_TWINS_ELI_ANNE, Route8_Text_AnneIntro, Route8_Text_AnneDefeat, Route8_Text_AnneNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_AnneRematch msgbox Route8_Text_AnnePostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_AnneRematch:: trainerbattle_rematch_double TRAINER_TWINS_ELI_ANNE, Route8_Text_AnneRematchIntro, Route8_Text_AnneDefeat, Route8_Text_AnneNotEnoughMons msgbox Route8_Text_AnnePostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Ricardo:: trainerbattle_single TRAINER_BIKER_RICARDO, Route8_Text_RicardoIntro, Route8_Text_RicardoDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_RicardoRematch msgbox Route8_Text_RicardoPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_RicardoRematch:: trainerbattle_rematch TRAINER_BIKER_RICARDO, Route8_Text_RicardoRematchIntro, Route8_Text_RicardoDefeat msgbox Route8_Text_RicardoPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_Jaren:: trainerbattle_single TRAINER_BIKER_JAREN, Route8_Text_JarenIntro, Route8_Text_JarenDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route8_EventScript_JarenRematch msgbox Route8_Text_JarenPostBattle, MSGBOX_AUTOCLOSE end Route8_EventScript_JarenRematch:: trainerbattle_rematch TRAINER_BIKER_JAREN, Route8_Text_JarenRematchIntro, Route8_Text_JarenDefeat msgbox Route8_Text_JarenPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_Ned:: trainerbattle_single TRAINER_FISHERMAN_NED, Route12_Text_NedIntro, Route12_Text_NedDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route12_EventScript_NedRematch msgbox Route12_Text_NedPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_NedRematch:: trainerbattle_rematch TRAINER_FISHERMAN_NED, Route12_Text_NedRematchIntro, Route12_Text_NedDefeat msgbox Route12_Text_NedPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_Chip:: trainerbattle_single TRAINER_FISHERMAN_CHIP, Route12_Text_ChipIntro, Route12_Text_ChipDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route12_EventScript_ChipRematch msgbox Route12_Text_ChipPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_ChipRematch:: trainerbattle_rematch TRAINER_FISHERMAN_CHIP, Route12_Text_ChipRematchIntro, Route12_Text_ChipDefeat msgbox Route12_Text_ChipPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_Hank:: trainerbattle_single TRAINER_FISHERMAN_HANK, Route12_Text_HankIntro, Route12_Text_HankDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route12_EventScript_HankRematch msgbox Route12_Text_HankPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_HankRematch:: trainerbattle_rematch TRAINER_FISHERMAN_HANK, Route12_Text_HankRematchIntro, Route12_Text_HankDefeat msgbox Route12_Text_HankPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_Elliot:: trainerbattle_single TRAINER_FISHERMAN_ELLIOT, Route12_Text_ElliotIntro, Route12_Text_ElliotDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route12_EventScript_ElliotRematch msgbox Route12_Text_ElliotPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_ElliotRematch:: trainerbattle_rematch TRAINER_FISHERMAN_ELLIOT, Route12_Text_ElliotRematchIntro, Route12_Text_ElliotDefeat msgbox Route12_Text_ElliotPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_Andrew:: trainerbattle_single TRAINER_FISHERMAN_ANDREW, Route12_Text_AndrewIntro, Route12_Text_AndrewDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route12_EventScript_AndrewRematch msgbox Route12_Text_AndrewPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_AndrewRematch:: trainerbattle_rematch TRAINER_FISHERMAN_ANDREW, Route12_Text_AndrewRematchIntro, Route12_Text_AndrewDefeat msgbox Route12_Text_AndrewPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_Luca:: trainerbattle_single TRAINER_ROCKER_LUCA, Route12_Text_LucaIntro, Route12_Text_LucaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route12_EventScript_LucaRematch msgbox Route12_Text_LucaPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_LucaRematch:: trainerbattle_rematch TRAINER_ROCKER_LUCA, Route12_Text_LucaRematchIntro, Route12_Text_LucaDefeat msgbox Route12_Text_LucaPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_Justin:: trainerbattle_single TRAINER_CAMPER_JUSTIN, Route12_Text_JustinIntro, Route12_Text_JustinDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route12_EventScript_JustinRematch msgbox Route12_Text_JustinPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_JustinRematch:: trainerbattle_rematch TRAINER_CAMPER_JUSTIN, Route12_Text_JustinRematchIntro, Route12_Text_JustinDefeat msgbox Route12_Text_JustinPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_Jes:: trainerbattle_double TRAINER_YOUNG_COUPLE_GIA_JES, Route12_Text_JesIntro, Route12_Text_JesDefeat, Route12_Text_JesNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route12_EventScript_JesRematch msgbox Route12_Text_JesPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_JesRematch:: trainerbattle_rematch_double TRAINER_YOUNG_COUPLE_GIA_JES, Route12_Text_JesRematchIntro, Route12_Text_JesDefeat, Route12_Text_JesNotEnoughMons msgbox Route12_Text_JesPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_Gia:: trainerbattle_double TRAINER_YOUNG_COUPLE_GIA_JES, Route12_Text_GiaIntro, Route12_Text_GiaDefeat, Route12_Text_GiaNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route12_EventScript_GiaRematch msgbox Route12_Text_GiaPostBattle, MSGBOX_AUTOCLOSE end Route12_EventScript_GiaRematch:: trainerbattle_rematch_double TRAINER_YOUNG_COUPLE_GIA_JES, Route12_Text_GiaRematchIntro, Route12_Text_GiaDefeat, Route12_Text_GiaNotEnoughMons msgbox Route12_Text_GiaPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Jared:: trainerbattle_single TRAINER_BIKER_JARED, Route13_Text_JaredIntro, Route13_Text_JaredDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_JaredRematch msgbox Route13_Text_JaredPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_JaredRematch:: trainerbattle_rematch TRAINER_BIKER_JARED, Route13_Text_JaredRematchIntro, Route13_Text_JaredDefeat msgbox Route13_Text_JaredPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Lola:: trainerbattle_single TRAINER_BEAUTY_LOLA, Route13_Text_LolaIntro, Route13_Text_LolaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_LolaRematch msgbox Route13_Text_LolaPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_LolaRematch:: trainerbattle_rematch TRAINER_BEAUTY_LOLA, Route13_Text_LolaRematchIntro, Route13_Text_LolaDefeat msgbox Route13_Text_LolaPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Sheila:: trainerbattle_single TRAINER_BEAUTY_SHEILA, Route13_Text_SheilaIntro, Route13_Text_SheilaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_SheilaRematch msgbox Route13_Text_SheilaPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_SheilaRematch:: trainerbattle_rematch TRAINER_BEAUTY_SHEILA, Route13_Text_SheilaRematchIntro, Route13_Text_SheilaDefeat msgbox Route13_Text_SheilaPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Sebastian:: trainerbattle_single TRAINER_BIRD_KEEPER_SEBASTIAN, Route13_Text_SebastianIntro, Route13_Text_SebastianDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_SebastianRematch msgbox Route13_Text_SebastianPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_SebastianRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_SEBASTIAN, Route13_Text_SebastianRematchIntro, Route13_Text_SebastianDefeat msgbox Route13_Text_SebastianPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Perry:: trainerbattle_single TRAINER_BIRD_KEEPER_PERRY, Route13_Text_PerryIntro, Route13_Text_PerryDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_PerryRematch msgbox Route13_Text_PerryPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_PerryRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_PERRY, Route13_Text_PerryRematchIntro, Route13_Text_PerryDefeat msgbox Route13_Text_PerryPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Robert:: trainerbattle_single TRAINER_BIRD_KEEPER_ROBERT, Route13_Text_RobertIntro, Route13_Text_RobertDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_RobertRematch msgbox Route13_Text_RobertPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_RobertRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_ROBERT, Route13_Text_RobertRematchIntro, Route13_Text_RobertDefeat msgbox Route13_Text_RobertPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Alma:: trainerbattle_single TRAINER_PICNICKER_ALMA, Route13_Text_AlmaIntro, Route13_Text_AlmaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_AlmaRematch msgbox Route13_Text_AlmaPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_AlmaRematch:: trainerbattle_rematch TRAINER_PICNICKER_ALMA, Route13_Text_AlmaRematchIntro, Route13_Text_AlmaDefeat msgbox Route13_Text_AlmaPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Susie:: trainerbattle_single TRAINER_PICNICKER_SUSIE, Route13_Text_SusieIntro, Route13_Text_SusieDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_SusieRematch msgbox Route13_Text_SusiePostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_SusieRematch:: trainerbattle_rematch TRAINER_PICNICKER_SUSIE, Route13_Text_SusieRematchIntro, Route13_Text_SusieDefeat msgbox Route13_Text_SusiePostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Valerie:: trainerbattle_single TRAINER_PICNICKER_VALERIE, Route13_Text_ValerieIntro, Route13_Text_ValerieDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_ValerieRematch msgbox Route13_Text_ValeriePostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_ValerieRematch:: trainerbattle_rematch TRAINER_PICNICKER_VALERIE, Route13_Text_ValerieRematchIntro, Route13_Text_ValerieDefeat msgbox Route13_Text_ValeriePostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_Gwen:: trainerbattle_single TRAINER_PICNICKER_GWEN, Route13_Text_GwenIntro, Route13_Text_GwenDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route13_EventScript_GwenRematch msgbox Route13_Text_GwenPostBattle, MSGBOX_AUTOCLOSE end Route13_EventScript_GwenRematch:: trainerbattle_rematch TRAINER_PICNICKER_GWEN, Route13_Text_GwenRematchIntro, Route13_Text_GwenDefeat msgbox Route13_Text_GwenPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Malik:: trainerbattle_single TRAINER_BIKER_MALIK, Route14_Text_MalikIntro, Route14_Text_MalikDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_MalikRematch msgbox Route14_Text_MalikPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_MalikRematch:: trainerbattle_rematch TRAINER_BIKER_MALIK, Route14_Text_MalikRematchIntro, Route14_Text_MalikDefeat msgbox Route14_Text_MalikPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Lukas:: trainerbattle_single TRAINER_BIKER_LUKAS, Route14_Text_LukasIntro, Route14_Text_LukasDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_LukasRematch msgbox Route14_Text_LukasPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_LukasRematch:: trainerbattle_rematch TRAINER_BIKER_LUKAS, Route14_Text_LukasRematchIntro, Route14_Text_LukasDefeat msgbox Route14_Text_LukasPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Isaac:: trainerbattle_single TRAINER_BIKER_ISAAC, Route14_Text_IsaacIntro, Route14_Text_IsaacDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_IsaacRematch msgbox Route14_Text_IsaacPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_IsaacRematch:: trainerbattle_rematch TRAINER_BIKER_ISAAC, Route14_Text_IsaacRematchIntro, Route14_Text_IsaacDefeat msgbox Route14_Text_IsaacPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Gerald:: trainerbattle_single TRAINER_BIKER_GERALD, Route14_Text_GeraldIntro, Route14_Text_GeraldDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_GeraldRematch msgbox Route14_Text_GeraldPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_GeraldRematch:: trainerbattle_rematch TRAINER_BIKER_GERALD, Route14_Text_GeraldRematchIntro, Route14_Text_GeraldDefeat msgbox Route14_Text_GeraldPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Donald:: trainerbattle_single TRAINER_BIRD_KEEPER_DONALD, Route14_Text_DonaldIntro, Route14_Text_DonaldDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_DonaldRematch msgbox Route14_Text_DonaldPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_DonaldRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_DONALD, Route14_Text_DonaldRematchIntro, Route14_Text_DonaldDefeat msgbox Route14_Text_DonaldPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Benny:: trainerbattle_single TRAINER_BIRD_KEEPER_BENNY, Route14_Text_BennyIntro, Route14_Text_BennyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_BennyRematch msgbox Route14_Text_BennyPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_BennyRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_BENNY, Route14_Text_BennyRematchIntro, Route14_Text_BennyDefeat msgbox Route14_Text_BennyPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Carter:: trainerbattle_single TRAINER_BIRD_KEEPER_CARTER, Route14_Text_CarterIntro, Route14_Text_CarterDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_CarterRematch msgbox Route14_Text_CarterPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_CarterRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_CARTER, Route14_Text_CarterRematchIntro, Route14_Text_CarterDefeat msgbox Route14_Text_CarterPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Mitch:: trainerbattle_single TRAINER_BIRD_KEEPER_MITCH, Route14_Text_MitchIntro, Route14_Text_MitchDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_MitchRematch msgbox Route14_Text_MitchPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_MitchRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_MITCH, Route14_Text_MitchRematchIntro, Route14_Text_MitchDefeat msgbox Route14_Text_MitchPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Beck:: trainerbattle_single TRAINER_BIRD_KEEPER_BECK, Route14_Text_BeckIntro, Route14_Text_BeckDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_BeckRematch msgbox Route14_Text_BeckPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_BeckRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_BECK, Route14_Text_BeckRematchIntro, Route14_Text_BeckDefeat msgbox Route14_Text_BeckPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Marlon:: trainerbattle_single TRAINER_BIRD_KEEPER_MARLON, Route14_Text_MarlonIntro, Route14_Text_MarlonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_MarlonRematch msgbox Route14_Text_MarlonPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_MarlonRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_MARLON, Route14_Text_MarlonRematchIntro, Route14_Text_MarlonDefeat msgbox Route14_Text_MarlonPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Kiri:: trainerbattle_double TRAINER_TWINS_KIRI_JAN, Route14_Text_KiriIntro, Route14_Text_KiriDefeat, Route14_Text_KiriNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_KiriRematch msgbox Route14_Text_KiriPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_KiriRematch:: trainerbattle_rematch_double TRAINER_TWINS_KIRI_JAN, Route14_Text_KiriRematchIntro, Route14_Text_KiriDefeat, Route14_Text_KiriNotEnoughMons msgbox Route14_Text_KiriPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_Jan:: trainerbattle_double TRAINER_TWINS_KIRI_JAN, Route14_Text_JanIntro, Route14_Text_JanDefeat, Route14_Text_JanNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route14_EventScript_JanRematch msgbox Route14_Text_JanPostBattle, MSGBOX_AUTOCLOSE end Route14_EventScript_JanRematch:: trainerbattle_rematch_double TRAINER_TWINS_KIRI_JAN, Route14_Text_JanRematchIntro, Route14_Text_JanDefeat, Route14_Text_JanNotEnoughMons msgbox Route14_Text_JanPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Ernest:: trainerbattle_single TRAINER_BIKER_ERNEST, Route15_Text_ErnestIntro, Route15_Text_ErnestDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_ErnestRematch msgbox Route15_Text_ErnestPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_ErnestRematch:: trainerbattle_rematch TRAINER_BIKER_ERNEST, Route15_Text_ErnestRematchIntro, Route15_Text_ErnestDefeat msgbox Route15_Text_ErnestPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Alex:: trainerbattle_single TRAINER_BIKER_ALEX, Route15_Text_AlexIntro, Route15_Text_AlexDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_AlexRematch msgbox Route15_Text_AlexPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_AlexRematch:: trainerbattle_rematch TRAINER_BIKER_ALEX, Route15_Text_AlexRematchIntro, Route15_Text_AlexDefeat msgbox Route15_Text_AlexPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Grace:: trainerbattle_single TRAINER_BEAUTY_GRACE, Route15_Text_GraceIntro, Route15_Text_GraceDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_GraceRematch msgbox Route15_Text_GracePostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_GraceRematch:: trainerbattle_rematch TRAINER_BEAUTY_GRACE, Route15_Text_GraceRematchIntro, Route15_Text_GraceDefeat msgbox Route15_Text_GracePostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Olivia:: trainerbattle_single TRAINER_BEAUTY_OLIVIA, Route15_Text_OliviaIntro, Route15_Text_OliviaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_OliviaRematch msgbox Route15_Text_OliviaPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_OliviaRematch:: trainerbattle_rematch TRAINER_BEAUTY_OLIVIA, Route15_Text_OliviaRematchIntro, Route15_Text_OliviaDefeat msgbox Route15_Text_OliviaPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Edwin:: trainerbattle_single TRAINER_BIRD_KEEPER_EDWIN, Route15_Text_EdwinIntro, Route15_Text_EdwinDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_EdwinRematch msgbox Route15_Text_EdwinPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_EdwinRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_EDWIN, Route15_Text_EdwinRematchIntro, Route15_Text_EdwinDefeat msgbox Route15_Text_EdwinPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Chester:: trainerbattle_single TRAINER_BIRD_KEEPER_CHESTER, Route15_Text_ChesterIntro, Route15_Text_ChesterDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_ChesterRematch msgbox Route15_Text_ChesterPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_ChesterRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_CHESTER, Route15_Text_ChesterRematchIntro, Route15_Text_ChesterDefeat msgbox Route15_Text_ChesterPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Yazmin:: trainerbattle_single TRAINER_PICNICKER_YAZMIN, Route15_Text_YazminIntro, Route15_Text_YazminDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_YazminRematch msgbox Route15_Text_YazminPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_YazminRematch:: trainerbattle_rematch TRAINER_PICNICKER_YAZMIN, Route15_Text_YazminRematchIntro, Route15_Text_YazminDefeat msgbox Route15_Text_YazminPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Kindra:: trainerbattle_single TRAINER_PICNICKER_KINDRA, Route15_Text_KindraIntro, Route15_Text_KindraDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_KindraRematch msgbox Route15_Text_KindraPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_KindraRematch:: trainerbattle_rematch TRAINER_PICNICKER_KINDRA, Route15_Text_KindraRematchIntro, Route15_Text_KindraDefeat msgbox Route15_Text_KindraPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Becky:: trainerbattle_single TRAINER_PICNICKER_BECKY, Route15_Text_BeckyIntro, Route15_Text_BeckyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_BeckyRematch msgbox Route15_Text_BeckyPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_BeckyRematch:: trainerbattle_rematch TRAINER_PICNICKER_BECKY, Route15_Text_BeckyRematchIntro, Route15_Text_BeckyDefeat msgbox Route15_Text_BeckyPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Celia:: trainerbattle_single TRAINER_PICNICKER_CELIA, Route15_Text_CeliaIntro, Route15_Text_CeliaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_CeliaRematch msgbox Route15_Text_CeliaPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_CeliaRematch:: trainerbattle_rematch TRAINER_PICNICKER_CELIA, Route15_Text_CeliaRematchIntro, Route15_Text_CeliaDefeat msgbox Route15_Text_CeliaPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Mya:: trainerbattle_double TRAINER_CRUSH_KIN_RON_MYA, Route15_Text_MyaIntro, Route15_Text_MyaDefeat, Route15_Text_MyaNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_MyaRematch msgbox Route15_Text_MyaPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_MyaRematch:: trainerbattle_rematch_double TRAINER_CRUSH_KIN_RON_MYA, Route15_Text_MyaRematchIntro, Route15_Text_MyaDefeat, Route15_Text_MyaNotEnoughMons msgbox Route15_Text_MyaPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_Ron:: trainerbattle_double TRAINER_CRUSH_KIN_RON_MYA, Route15_Text_RonIntro, Route15_Text_RonDefeat, Route15_Text_RonNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route15_EventScript_RonRematch msgbox Route15_Text_RonPostBattle, MSGBOX_AUTOCLOSE end Route15_EventScript_RonRematch:: trainerbattle_rematch_double TRAINER_CRUSH_KIN_RON_MYA, Route15_Text_RonRematchIntro, Route15_Text_RonDefeat, Route15_Text_RonNotEnoughMons msgbox Route15_Text_RonPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_Lao:: trainerbattle_single TRAINER_BIKER_LAO, Route16_Text_LaoIntro, Route16_Text_LaoDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route16_EventScript_LaoRematch msgbox Route16_Text_LaoPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_LaoRematch:: trainerbattle_rematch TRAINER_BIKER_LAO, Route16_Text_LaoRematchIntro, Route16_Text_LaoDefeat msgbox Route16_Text_LaoPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_Hideo:: trainerbattle_single TRAINER_BIKER_HIDEO, Route16_Text_HideoIntro, Route16_Text_HideoDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route16_EventScript_HideoRematch msgbox Route16_Text_HideoPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_HideoRematch:: trainerbattle_rematch TRAINER_BIKER_HIDEO, Route16_Text_HideoRematchIntro, Route16_Text_HideoDefeat msgbox Route16_Text_HideoPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_Ruben:: trainerbattle_single TRAINER_BIKER_RUBEN, Route16_Text_RubenIntro, Route16_Text_RubenDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route16_EventScript_RubenRematch msgbox Route16_Text_RubenPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_RubenRematch:: trainerbattle_rematch TRAINER_BIKER_RUBEN, Route16_Text_RubenRematchIntro, Route16_Text_RubenDefeat msgbox Route16_Text_RubenPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_Koji:: trainerbattle_single TRAINER_CUE_BALL_KOJI, Route16_Text_KojiIntro, Route16_Text_KojiDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route16_EventScript_KojiRematch msgbox Route16_Text_KojiPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_KojiRematch:: trainerbattle_rematch TRAINER_CUE_BALL_KOJI, Route16_Text_KojiRematchIntro, Route16_Text_KojiDefeat msgbox Route16_Text_KojiPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_Luke:: trainerbattle_single TRAINER_CUE_BALL_LUKE, Route16_Text_LukeIntro, Route16_Text_LukeDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route16_EventScript_LukeRematch msgbox Route16_Text_LukePostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_LukeRematch:: trainerbattle_rematch TRAINER_CUE_BALL_LUKE, Route16_Text_LukeRematchIntro, Route16_Text_LukeDefeat msgbox Route16_Text_LukePostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_Camron:: trainerbattle_single TRAINER_CUE_BALL_CAMRON, Route16_Text_CamronIntro, Route16_Text_CamronDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route16_EventScript_CamronRematch msgbox Route16_Text_CamronPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_CamronRematch:: trainerbattle_rematch TRAINER_CUE_BALL_CAMRON, Route16_Text_CamronRematchIntro, Route16_Text_CamronDefeat msgbox Route16_Text_CamronPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_Jed:: trainerbattle_double TRAINER_YOUNG_COUPLE_LEA_JED, Route16_Text_JedIntro, Route16_Text_JedDefeat, Route16_Text_JedNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route16_EventScript_JedRematch msgbox Route16_Text_JedPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_JedRematch:: trainerbattle_rematch_double TRAINER_YOUNG_COUPLE_LEA_JED, Route16_Text_JedRematchIntro, Route16_Text_JedDefeat, Route16_Text_JedNotEnoughMons msgbox Route16_Text_JedPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_Lea:: trainerbattle_double TRAINER_YOUNG_COUPLE_LEA_JED, Route16_Text_LeaIntro, Route16_Text_LeaDefeat, Route16_Text_LeaNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route16_EventScript_LeaRematch msgbox Route16_Text_LeaPostBattle, MSGBOX_AUTOCLOSE end Route16_EventScript_LeaRematch:: trainerbattle_rematch_double TRAINER_YOUNG_COUPLE_LEA_JED, Route16_Text_LeaRematchIntro, Route16_Text_LeaDefeat, Route16_Text_LeaNotEnoughMons msgbox Route16_Text_LeaPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_Billy:: trainerbattle_single TRAINER_BIKER_BILLY, Route17_Text_BillyIntro, Route17_Text_BillyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_BillyRematch msgbox Route17_Text_BillyPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_BillyRematch:: trainerbattle_rematch TRAINER_BIKER_BILLY, Route17_Text_BillyRematchIntro, Route17_Text_BillyDefeat msgbox Route17_Text_BillyPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_Nikolas:: trainerbattle_single TRAINER_BIKER_NIKOLAS, Route17_Text_NikolasIntro, Route17_Text_NikolasDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_NikolasRematch msgbox Route17_Text_NikolasPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_NikolasRematch:: trainerbattle_rematch TRAINER_BIKER_NIKOLAS, Route17_Text_NikolasRematchIntro, Route17_Text_NikolasDefeat msgbox Route17_Text_NikolasPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_Jaxon:: trainerbattle_single TRAINER_BIKER_JAXON, Route17_Text_JaxonIntro, Route17_Text_JaxonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_JaxonRematch msgbox Route17_Text_JaxonPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_JaxonRematch:: trainerbattle_rematch TRAINER_BIKER_JAXON, Route17_Text_JaxonRematchIntro, Route17_Text_JaxonDefeat msgbox Route17_Text_JaxonPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_William:: trainerbattle_single TRAINER_BIKER_WILLIAM, Route17_Text_WilliamIntro, Route17_Text_WilliamDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_WilliamRematch msgbox Route17_Text_WilliamPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_WilliamRematch:: trainerbattle_rematch TRAINER_BIKER_WILLIAM, Route17_Text_WilliamRematchIntro, Route17_Text_WilliamDefeat msgbox Route17_Text_WilliamPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_Raul:: trainerbattle_single TRAINER_CUE_BALL_RAUL, Route17_Text_RaulIntro, Route17_Text_RaulDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_RaulRematch msgbox Route17_Text_RaulPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_RaulRematch:: trainerbattle_rematch TRAINER_CUE_BALL_RAUL, Route17_Text_RaulRematchIntro, Route17_Text_RaulDefeat msgbox Route17_Text_RaulPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_Isaiah:: trainerbattle_single TRAINER_CUE_BALL_ISAIAH, Route17_Text_IsaiahIntro, Route17_Text_IsaiahDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_IsaiahRematch msgbox Route17_Text_IsaiahPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_IsaiahRematch:: trainerbattle_rematch TRAINER_CUE_BALL_ISAIAH, Route17_Text_IsaiahRematchIntro, Route17_Text_IsaiahDefeat msgbox Route17_Text_IsaiahPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_Zeek:: trainerbattle_single TRAINER_CUE_BALL_ZEEK, Route17_Text_ZeekIntro, Route17_Text_ZeekDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_ZeekRematch msgbox Route17_Text_ZeekPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_ZeekRematch:: trainerbattle_rematch TRAINER_CUE_BALL_ZEEK, Route17_Text_ZeekRematchIntro, Route17_Text_ZeekDefeat msgbox Route17_Text_ZeekPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_Jamal:: trainerbattle_single TRAINER_CUE_BALL_JAMAL, Route17_Text_JamalIntro, Route17_Text_JamalDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_JamalRematch msgbox Route17_Text_JamalPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_JamalRematch:: trainerbattle_rematch TRAINER_CUE_BALL_JAMAL, Route17_Text_JamalRematchIntro, Route17_Text_JamalDefeat msgbox Route17_Text_JamalPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_Corey:: trainerbattle_single TRAINER_CUE_BALL_COREY, Route17_Text_CoreyIntro, Route17_Text_CoreyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_CoreyRematch msgbox Route17_Text_CoreyPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_CoreyRematch:: trainerbattle_rematch TRAINER_CUE_BALL_COREY, Route17_Text_CoreyRematchIntro, Route17_Text_CoreyDefeat msgbox Route17_Text_CoreyPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_Virgil:: trainerbattle_single TRAINER_BIKER_VIRGIL, Route17_Text_VirgilIntro, Route17_Text_VirgilDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route17_EventScript_VirgilRematch msgbox Route17_Text_VirgilPostBattle, MSGBOX_AUTOCLOSE end Route17_EventScript_VirgilRematch:: trainerbattle_rematch TRAINER_BIKER_VIRGIL, Route17_Text_VirgilRematchIntro, Route17_Text_VirgilDefeat msgbox Route17_Text_VirgilPostBattle, MSGBOX_AUTOCLOSE end Route18_EventScript_Wilton:: trainerbattle_single TRAINER_BIRD_KEEPER_WILTON, Route18_Text_WiltonIntro, Route18_Text_WiltonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route18_EventScript_WiltonRematch msgbox Route18_Text_WiltonPostBattle, MSGBOX_AUTOCLOSE end Route18_EventScript_WiltonRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_WILTON, Route18_Text_WiltonRematchIntro, Route18_Text_WiltonDefeat msgbox Route18_Text_WiltonPostBattle, MSGBOX_AUTOCLOSE end Route18_EventScript_Ramiro:: trainerbattle_single TRAINER_BIRD_KEEPER_RAMIRO, Route18_Text_RamiroIntro, Route18_Text_RamiroDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route18_EventScript_RamiroRematch msgbox Route18_Text_RamiroPostBattle, MSGBOX_AUTOCLOSE end Route18_EventScript_RamiroRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_RAMIRO, Route18_Text_RamiroRematchIntro, Route18_Text_RamiroDefeat msgbox Route18_Text_RamiroPostBattle, MSGBOX_AUTOCLOSE end Route18_EventScript_Jacob:: trainerbattle_single TRAINER_BIRD_KEEPER_JACOB, Route18_Text_JacobIntro, Route18_Text_JacobDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route18_EventScript_JacobRematch msgbox Route18_Text_JacobPostBattle, MSGBOX_AUTOCLOSE end Route18_EventScript_JacobRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_JACOB, Route18_Text_JacobRematchIntro, Route18_Text_JacobDefeat msgbox Route18_Text_JacobPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Richard:: trainerbattle_single TRAINER_SWIMMER_MALE_RICHARD, Route19_Text_RichardIntro, Route19_Text_RichardDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_RichardRematch msgbox Route19_Text_RichardPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_RichardRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_RICHARD, Route19_Text_RichardRematchIntro, Route19_Text_RichardDefeat msgbox Route19_Text_RichardPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Reece:: trainerbattle_single TRAINER_SWIMMER_MALE_REECE, Route19_Text_ReeceIntro, Route19_Text_ReeceDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_ReeceRematch msgbox Route19_Text_ReecePostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_ReeceRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_REECE, Route19_Text_ReeceRematchIntro, Route19_Text_ReeceDefeat msgbox Route19_Text_ReecePostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Matthew:: trainerbattle_single TRAINER_SWIMMER_MALE_MATTHEW, Route19_Text_MatthewIntro, Route19_Text_MatthewDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_MatthewRematch msgbox Route19_Text_MatthewPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_MatthewRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_MATTHEW, Route19_Text_MatthewRematchIntro, Route19_Text_MatthewDefeat msgbox Route19_Text_MatthewPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Douglas:: trainerbattle_single TRAINER_SWIMMER_MALE_DOUGLAS, Route19_Text_DouglasIntro, Route19_Text_DouglasDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_DouglasRematch msgbox Route19_Text_DouglasPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_DouglasRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_DOUGLAS, Route19_Text_DouglasRematchIntro, Route19_Text_DouglasDefeat msgbox Route19_Text_DouglasPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_David:: trainerbattle_single TRAINER_SWIMMER_MALE_DAVID, Route19_Text_DavidIntro, Route19_Text_DavidDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_DavidRematch msgbox Route19_Text_DavidPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_DavidRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_DAVID, Route19_Text_DavidRematchIntro, Route19_Text_DavidDefeat msgbox Route19_Text_DavidPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Tony:: trainerbattle_single TRAINER_SWIMMER_MALE_TONY, Route19_Text_TonyIntro, Route19_Text_TonyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_TonyRematch msgbox Route19_Text_TonyPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_TonyRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_TONY, Route19_Text_TonyRematchIntro, Route19_Text_TonyDefeat msgbox Route19_Text_TonyPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Axle:: trainerbattle_single TRAINER_SWIMMER_MALE_AXLE, Route19_Text_AxleIntro, Route19_Text_AxleDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_AxleRematch msgbox Route19_Text_AxlePostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_AxleRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_AXLE, Route19_Text_AxleRematchIntro, Route19_Text_AxleDefeat msgbox Route19_Text_AxlePostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Anya:: trainerbattle_single TRAINER_SWIMMER_FEMALE_ANYA, Route19_Text_AnyaIntro, Route19_Text_AnyaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_AnyaRematch msgbox Route19_Text_AnyaPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_AnyaRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_ANYA, Route19_Text_AnyaRematchIntro, Route19_Text_AnyaDefeat msgbox Route19_Text_AnyaPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Alice:: trainerbattle_single TRAINER_SWIMMER_FEMALE_ALICE, Route19_Text_AliceIntro, Route19_Text_AliceDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_AliceRematch msgbox Route19_Text_AlicePostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_AliceRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_ALICE, Route19_Text_AliceRematchIntro, Route19_Text_AliceDefeat msgbox Route19_Text_AlicePostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Connie:: trainerbattle_single TRAINER_SWIMMER_FEMALE_CONNIE, Route19_Text_ConnieIntro, Route19_Text_ConnieDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_ConnieRematch msgbox Route19_Text_ConniePostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_ConnieRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_CONNIE, Route19_Text_ConnieRematchIntro, Route19_Text_ConnieDefeat msgbox Route19_Text_ConniePostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Lia:: trainerbattle_double TRAINER_SIS_AND_BRO_LIA_LUC, Route19_Text_LiaIntro, Route19_Text_LiaDefeat, Route19_Text_LiaNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_LiaRematch msgbox Route19_Text_LiaPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_LiaRematch:: trainerbattle_rematch_double TRAINER_SIS_AND_BRO_LIA_LUC, Route19_Text_LiaRematchIntro, Route19_Text_LiaDefeat, Route19_Text_LiaNotEnoughMons msgbox Route19_Text_LiaPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_Luc:: trainerbattle_double TRAINER_SIS_AND_BRO_LIA_LUC, Route19_Text_LucIntro, Route19_Text_LucDefeat, Route19_Text_LucNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route19_EventScript_LucRematch msgbox Route19_Text_LucPostBattle, MSGBOX_AUTOCLOSE end Route19_EventScript_LucRematch:: trainerbattle_rematch_double TRAINER_SIS_AND_BRO_LIA_LUC, Route19_Text_LucRematchIntro, Route19_Text_LucDefeat, Route19_Text_LucNotEnoughMons msgbox Route19_Text_LucPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Barry:: trainerbattle_single TRAINER_SWIMMER_MALE_BARRY, Route20_Text_BarryIntro, Route20_Text_BarryDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_BarryRematch msgbox Route20_Text_BarryPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_BarryRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_BARRY, Route20_Text_BarryRematchIntro, Route20_Text_BarryDefeat msgbox Route20_Text_BarryPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Dean:: trainerbattle_single TRAINER_SWIMMER_MALE_DEAN, Route20_Text_DeanIntro, Route20_Text_DeanDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_DeanRematch msgbox Route20_Text_DeanPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_DeanRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_DEAN, Route20_Text_DeanRematchIntro, Route20_Text_DeanDefeat msgbox Route20_Text_DeanPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Darrin:: trainerbattle_single TRAINER_SWIMMER_MALE_DARRIN, Route20_Text_DarrinIntro, Route20_Text_DarrinDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_DarrinRematch msgbox Route20_Text_DarrinPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_DarrinRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_DARRIN, Route20_Text_DarrinRematchIntro, Route20_Text_DarrinDefeat msgbox Route20_Text_DarrinPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Tiffany:: trainerbattle_single TRAINER_SWIMMER_FEMALE_TIFFANY, Route20_Text_TiffanyIntro, Route20_Text_TiffanyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_TiffanyRematch msgbox Route20_Text_TiffanyPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_TiffanyRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_TIFFANY, Route20_Text_TiffanyRematchIntro, Route20_Text_TiffanyDefeat msgbox Route20_Text_TiffanyPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Nora:: trainerbattle_single TRAINER_SWIMMER_FEMALE_NORA, Route20_Text_NoraIntro, Route20_Text_NoraDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_NoraRematch msgbox Route20_Text_NoraPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_NoraRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_NORA, Route20_Text_NoraRematchIntro, Route20_Text_NoraDefeat msgbox Route20_Text_NoraPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Melissa:: trainerbattle_single TRAINER_SWIMMER_FEMALE_MELISSA, Route20_Text_MelissaIntro, Route20_Text_MelissaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_MelissaRematch msgbox Route20_Text_MelissaPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_MelissaRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_MELISSA, Route20_Text_MelissaRematchIntro, Route20_Text_MelissaDefeat msgbox Route20_Text_MelissaPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Shirley:: trainerbattle_single TRAINER_SWIMMER_FEMALE_SHIRLEY, Route20_Text_ShirleyIntro, Route20_Text_ShirleyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_ShirleyRematch msgbox Route20_Text_ShirleyPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_ShirleyRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_SHIRLEY, Route20_Text_ShirleyRematchIntro, Route20_Text_ShirleyDefeat msgbox Route20_Text_ShirleyPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Roger:: trainerbattle_single TRAINER_BIRD_KEEPER_ROGER, Route20_Text_RogerIntro, Route20_Text_RogerDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_RogerRematch msgbox Route20_Text_RogerPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_RogerRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_ROGER, Route20_Text_RogerRematchIntro, Route20_Text_RogerDefeat msgbox Route20_Text_RogerPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Missy:: trainerbattle_single TRAINER_PICNICKER_MISSY, Route20_Text_MissyIntro, Route20_Text_MissyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_MissyRematch msgbox Route20_Text_MissyPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_MissyRematch:: trainerbattle_rematch TRAINER_PICNICKER_MISSY, Route20_Text_MissyRematchIntro, Route20_Text_MissyDefeat msgbox Route20_Text_MissyPostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_Irene:: trainerbattle_single TRAINER_PICNICKER_IRENE, Route20_Text_IreneIntro, Route20_Text_IreneDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route20_EventScript_IreneRematch msgbox Route20_Text_IrenePostBattle, MSGBOX_AUTOCLOSE end Route20_EventScript_IreneRematch:: trainerbattle_rematch TRAINER_PICNICKER_IRENE, Route20_Text_IreneRematchIntro, Route20_Text_IreneDefeat msgbox Route20_Text_IrenePostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_Ronald:: trainerbattle_single TRAINER_FISHERMAN_RONALD, Route21_North_Text_RonaldIntro, Route21_North_Text_RonaldDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_RonaldRematch msgbox Route21_North_Text_RonaldPostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_RonaldRematch:: trainerbattle_rematch TRAINER_FISHERMAN_RONALD, Route21_North_Text_RonaldRematchIntro, Route21_North_Text_RonaldDefeat msgbox Route21_North_Text_RonaldPostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_Claude:: trainerbattle_single TRAINER_FISHERMAN_CLAUDE, Route21_South_Text_ClaudeIntro, Route21_South_Text_ClaudeDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_ClaudeRematch msgbox Route21_South_Text_ClaudePostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_ClaudeRematch:: trainerbattle_rematch TRAINER_FISHERMAN_CLAUDE, Route21_South_Text_ClaudeRematchIntro, Route21_South_Text_ClaudeDefeat msgbox Route21_South_Text_ClaudePostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_Wade:: trainerbattle_single TRAINER_FISHERMAN_WADE, Route21_North_Text_WadeIntro, Route21_North_Text_WadeDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_WadeRematch msgbox Route21_North_Text_WadePostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_WadeRematch:: trainerbattle_rematch TRAINER_FISHERMAN_WADE, Route21_North_Text_WadeRematchIntro, Route21_North_Text_WadeDefeat msgbox Route21_North_Text_WadePostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_Nolan:: trainerbattle_single TRAINER_FISHERMAN_NOLAN, Route21_South_Text_NolanIntro, Route21_South_Text_NolanDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_NolanRematch msgbox Route21_South_Text_NolanPostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_NolanRematch:: trainerbattle_rematch TRAINER_FISHERMAN_NOLAN, Route21_South_Text_NolanRematchIntro, Route21_South_Text_NolanDefeat msgbox Route21_South_Text_NolanPostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_Spencer:: trainerbattle_single TRAINER_SWIMMER_MALE_SPENCER, Route21_North_Text_SpencerIntro, Route21_North_Text_SpencerDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_SpencerRematch msgbox Route21_North_Text_SpencerPostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_SpencerRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_SPENCER, Route21_North_Text_SpencerRematchIntro, Route21_North_Text_SpencerDefeat msgbox Route21_North_Text_SpencerPostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_Jack:: trainerbattle_single TRAINER_SWIMMER_MALE_JACK, Route21_South_Text_JackIntro, Route21_South_Text_JackDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_JackRematch msgbox Route21_South_Text_JackPostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_JackRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_JACK, Route21_South_Text_JackRematchIntro, Route21_South_Text_JackDefeat msgbox Route21_South_Text_JackPostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_Jerome:: trainerbattle_single TRAINER_SWIMMER_MALE_JEROME, Route21_South_Text_JeromeIntro, Route21_South_Text_JeromeDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_JeromeRematch msgbox Route21_South_Text_JeromePostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_JeromeRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_JEROME, Route21_South_Text_JeromeRematchIntro, Route21_South_Text_JeromeDefeat msgbox Route21_South_Text_JeromePostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_Roland:: trainerbattle_single TRAINER_SWIMMER_MALE_ROLAND, Route21_South_Text_RolandIntro, Route21_South_Text_RolandDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_RolandRematch msgbox Route21_South_Text_RolandPostBattle, MSGBOX_AUTOCLOSE end Route21_South_EventScript_RolandRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_ROLAND, Route21_South_Text_RolandRematchIntro, Route21_South_Text_RolandDefeat msgbox Route21_South_Text_RolandPostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_Lil:: trainerbattle_double TRAINER_SIS_AND_BRO_LIL_IAN, Route21_North_Text_LilIntro, Route21_North_Text_LilDefeat, Route21_North_Text_LilNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_LilRematch msgbox Route21_North_Text_LilPostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_LilRematch:: trainerbattle_rematch_double TRAINER_SIS_AND_BRO_LIL_IAN, Route21_North_Text_LilRematchIntro, Route21_North_Text_LilDefeat, Route21_North_Text_LilNotEnoughMons msgbox Route21_North_Text_LilPostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_Ian:: trainerbattle_double TRAINER_SIS_AND_BRO_LIL_IAN, Route21_North_Text_IanIntro, Route21_North_Text_IanDefeat, Route21_North_Text_IanNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_IanRematch msgbox Route21_North_Text_IanPostBattle, MSGBOX_AUTOCLOSE end Route21_North_EventScript_IanRematch:: trainerbattle_rematch_double TRAINER_SIS_AND_BRO_LIL_IAN, Route21_North_Text_IanRematchIntro, Route21_North_Text_IanDefeat, Route21_North_Text_IanNotEnoughMons msgbox Route21_North_Text_IanPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Maria:: trainerbattle_single TRAINER_SWIMMER_FEMALE_MARIA, OneIsland_KindleRoad_Text_MariaIntro, OneIsland_KindleRoad_Text_MariaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_MariaRematch msgbox OneIsland_KindleRoad_Text_MariaPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_MariaRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_MARIA, OneIsland_KindleRoad_Text_MariaRematchIntro, OneIsland_KindleRoad_Text_MariaDefeat msgbox OneIsland_KindleRoad_Text_MariaPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Abigail:: trainerbattle_single TRAINER_SWIMMER_FEMALE_ABIGAIL, OneIsland_KindleRoad_Text_AbigailIntro, OneIsland_KindleRoad_Text_AbigailDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_AbigailRematch msgbox OneIsland_KindleRoad_Text_AbigailPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_AbigailRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_ABIGAIL, OneIsland_KindleRoad_Text_AbigailRematchIntro, OneIsland_KindleRoad_Text_AbigailDefeat msgbox OneIsland_KindleRoad_Text_AbigailPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Finn:: trainerbattle_single TRAINER_SWIMMER_MALE_FINN, OneIsland_KindleRoad_Text_FinnIntro, OneIsland_KindleRoad_Text_FinnDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_FinnRematch msgbox OneIsland_KindleRoad_Text_FinnPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_FinnRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_FINN, OneIsland_KindleRoad_Text_FinnRematchIntro, OneIsland_KindleRoad_Text_FinnDefeat msgbox OneIsland_KindleRoad_Text_FinnPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Garrett:: trainerbattle_single TRAINER_SWIMMER_MALE_GARRETT, OneIsland_KindleRoad_Text_GarrettIntro, OneIsland_KindleRoad_Text_GarrettDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_GarrettRematch msgbox OneIsland_KindleRoad_Text_GarrettPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_GarrettRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_GARRETT, OneIsland_KindleRoad_Text_GarrettRematchIntro, OneIsland_KindleRoad_Text_GarrettDefeat msgbox OneIsland_KindleRoad_Text_GarrettPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Tommy:: trainerbattle_single TRAINER_FISHERMAN_TOMMY, OneIsland_KindleRoad_Text_TommyIntro, OneIsland_KindleRoad_Text_TommyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_TommyRematch msgbox OneIsland_KindleRoad_Text_TommyPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_TommyRematch:: trainerbattle_rematch TRAINER_FISHERMAN_TOMMY, OneIsland_KindleRoad_Text_TommyRematchIntro, OneIsland_KindleRoad_Text_TommyDefeat msgbox OneIsland_KindleRoad_Text_TommyPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Sharon:: trainerbattle_single TRAINER_CRUSH_GIRL_SHARON, OneIsland_KindleRoad_Text_SharonIntro, OneIsland_KindleRoad_Text_SharonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_SharonRematch msgbox OneIsland_KindleRoad_Text_SharonPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_SharonRematch:: trainerbattle_rematch TRAINER_CRUSH_GIRL_SHARON, OneIsland_KindleRoad_Text_SharonRematchIntro, OneIsland_KindleRoad_Text_SharonDefeat msgbox OneIsland_KindleRoad_Text_SharonPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Tanya:: trainerbattle_single TRAINER_CRUSH_GIRL_TANYA, OneIsland_KindleRoad_Text_TanyaIntro, OneIsland_KindleRoad_Text_TanyaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_TanyaRematch msgbox OneIsland_KindleRoad_Text_TanyaPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_TanyaRematch:: trainerbattle_rematch TRAINER_CRUSH_GIRL_TANYA, OneIsland_KindleRoad_Text_TanyaRematchIntro, OneIsland_KindleRoad_Text_TanyaDefeat msgbox OneIsland_KindleRoad_Text_TanyaPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Shea:: trainerbattle_single TRAINER_BLACK_BELT_SHEA, OneIsland_KindleRoad_Text_SheaIntro, OneIsland_KindleRoad_Text_SheaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_SheaRematch msgbox OneIsland_KindleRoad_Text_SheaPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_SheaRematch:: trainerbattle_rematch TRAINER_BLACK_BELT_SHEA, OneIsland_KindleRoad_Text_SheaRematchIntro, OneIsland_KindleRoad_Text_SheaDefeat msgbox OneIsland_KindleRoad_Text_SheaPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Hugh:: trainerbattle_single TRAINER_BLACK_BELT_HUGH, OneIsland_KindleRoad_Text_HughIntro, OneIsland_KindleRoad_Text_HughDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_HughRematch msgbox OneIsland_KindleRoad_Text_HughPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_HughRematch:: trainerbattle_rematch TRAINER_BLACK_BELT_HUGH, OneIsland_KindleRoad_Text_HughRematchIntro, OneIsland_KindleRoad_Text_HughDefeat msgbox OneIsland_KindleRoad_Text_HughPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Bryce:: trainerbattle_single TRAINER_CAMPER_BRYCE, OneIsland_KindleRoad_Text_BryceIntro, OneIsland_KindleRoad_Text_BryceDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_BryceRematch msgbox OneIsland_KindleRoad_Text_BrycePostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_BryceRematch:: trainerbattle_rematch TRAINER_CAMPER_BRYCE, OneIsland_KindleRoad_Text_BryceRematchIntro, OneIsland_KindleRoad_Text_BryceDefeat msgbox OneIsland_KindleRoad_Text_BrycePostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Claire:: trainerbattle_single TRAINER_PICNICKER_CLAIRE, OneIsland_KindleRoad_Text_ClaireIntro, OneIsland_KindleRoad_Text_ClaireDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_ClaireRematch msgbox OneIsland_KindleRoad_Text_ClairePostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_ClaireRematch:: trainerbattle_rematch TRAINER_PICNICKER_CLAIRE, OneIsland_KindleRoad_Text_ClaireRematchIntro, OneIsland_KindleRoad_Text_ClaireDefeat msgbox OneIsland_KindleRoad_Text_ClairePostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Kia:: trainerbattle_double TRAINER_CRUSH_KIN_MIK_KIA, OneIsland_KindleRoad_Text_KiaIntro, OneIsland_KindleRoad_Text_KiaDefeat, OneIsland_KindleRoad_Text_KiaNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_KiaRematch msgbox OneIsland_KindleRoad_Text_KiaPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_KiaRematch:: trainerbattle_rematch_double TRAINER_CRUSH_KIN_MIK_KIA, OneIsland_KindleRoad_Text_KiaRematchIntro, OneIsland_KindleRoad_Text_KiaDefeat, OneIsland_KindleRoad_Text_KiaNotEnoughMons msgbox OneIsland_KindleRoad_Text_KiaPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_Mik:: trainerbattle_double TRAINER_CRUSH_KIN_MIK_KIA, OneIsland_KindleRoad_Text_MikIntro, OneIsland_KindleRoad_Text_MikDefeat, OneIsland_KindleRoad_Text_MikNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_MikRematch msgbox OneIsland_KindleRoad_Text_MikPostBattle, MSGBOX_AUTOCLOSE end OneIsland_KindleRoad_EventScript_MikRematch:: trainerbattle_rematch_double TRAINER_CRUSH_KIN_MIK_KIA, OneIsland_KindleRoad_Text_MikRematchIntro, OneIsland_KindleRoad_Text_MikDefeat, OneIsland_KindleRoad_Text_MikNotEnoughMons msgbox OneIsland_KindleRoad_Text_MikPostBattle, MSGBOX_AUTOCLOSE end OneIsland_TreasureBeach_EventScript_Amara:: trainerbattle_single TRAINER_SWIMMER_FEMALE_AMARA, OneIsland_TreasureBeach_Text_AmaraIntro, OneIsland_TreasureBeach_Text_AmaraDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, OneIsland_TreasureBeach_EventScript_AmaraRematch msgbox OneIsland_TreasureBeach_Text_AmaraPostBattle, MSGBOX_AUTOCLOSE end OneIsland_TreasureBeach_EventScript_AmaraRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_AMARA, OneIsland_TreasureBeach_Text_AmaraRematchIntro, OneIsland_TreasureBeach_Text_AmaraDefeat msgbox OneIsland_TreasureBeach_Text_AmaraPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_Nikki:: trainerbattle_single TRAINER_AROMA_LADY_NIKKI, ThreeIsland_BondBridge_Text_NikkiIntro, ThreeIsland_BondBridge_Text_NikkiDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_NikkiRematch msgbox ThreeIsland_BondBridge_Text_NikkiPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_NikkiRematch:: trainerbattle_rematch TRAINER_AROMA_LADY_NIKKI, ThreeIsland_BondBridge_Text_NikkiRematchIntro, ThreeIsland_BondBridge_Text_NikkiDefeat msgbox ThreeIsland_BondBridge_Text_NikkiPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_Violet:: trainerbattle_single TRAINER_AROMA_LADY_VIOLET, ThreeIsland_BondBridge_Text_VioletIntro, ThreeIsland_BondBridge_Text_VioletDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_VioletRematch msgbox ThreeIsland_BondBridge_Text_VioletPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_VioletRematch:: trainerbattle_rematch TRAINER_AROMA_LADY_VIOLET, ThreeIsland_BondBridge_Text_VioletRematchIntro, ThreeIsland_BondBridge_Text_VioletDefeat msgbox ThreeIsland_BondBridge_Text_VioletPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_Amira:: trainerbattle_single TRAINER_TUBER_AMIRA, ThreeIsland_BondBridge_Text_AmiraIntro, ThreeIsland_BondBridge_Text_AmiraDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_AmiraRematch msgbox ThreeIsland_BondBridge_Text_AmiraPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_AmiraRematch:: trainerbattle_rematch TRAINER_TUBER_AMIRA, ThreeIsland_BondBridge_Text_AmiraRematchIntro, ThreeIsland_BondBridge_Text_AmiraDefeat msgbox ThreeIsland_BondBridge_Text_AmiraPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_Alexis:: trainerbattle_single TRAINER_TUBER_ALEXIS, ThreeIsland_BondBridge_Text_AlexisIntro, ThreeIsland_BondBridge_Text_AlexisDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_AlexisRematch msgbox ThreeIsland_BondBridge_Text_AlexisPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_AlexisRematch:: trainerbattle_rematch TRAINER_TUBER_ALEXIS, ThreeIsland_BondBridge_Text_AlexisRematchIntro, ThreeIsland_BondBridge_Text_AlexisDefeat msgbox ThreeIsland_BondBridge_Text_AlexisPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_Tisha:: trainerbattle_single TRAINER_SWIMMER_FEMALE_TISHA, ThreeIsland_BondBridge_Text_TishaIntro, ThreeIsland_BondBridge_Text_TishaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_TishaRematch msgbox ThreeIsland_BondBridge_Text_TishaPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_TishaRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_TISHA, ThreeIsland_BondBridge_Text_TishaRematchIntro, ThreeIsland_BondBridge_Text_TishaDefeat msgbox ThreeIsland_BondBridge_Text_TishaPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_Joy:: trainerbattle_double TRAINER_TWINS_JOY_MEG, ThreeIsland_BondBridge_Text_JoyIntro, ThreeIsland_BondBridge_Text_JoyDefeat, ThreeIsland_BondBridge_Text_JoyNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_JoyRematch msgbox ThreeIsland_BondBridge_Text_JoyPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_JoyRematch:: trainerbattle_rematch_double TRAINER_TWINS_JOY_MEG, ThreeIsland_BondBridge_Text_JoyRematchIntro, ThreeIsland_BondBridge_Text_JoyDefeat, ThreeIsland_BondBridge_Text_JoyNotEnoughMons msgbox ThreeIsland_BondBridge_Text_JoyPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_Meg:: trainerbattle_double TRAINER_TWINS_JOY_MEG, ThreeIsland_BondBridge_Text_MegIntro, ThreeIsland_BondBridge_Text_MegDefeat, ThreeIsland_BondBridge_Text_MegNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_MegRematch msgbox ThreeIsland_BondBridge_Text_MegPostBattle, MSGBOX_AUTOCLOSE end ThreeIsland_BondBridge_EventScript_MegRematch:: trainerbattle_rematch_double TRAINER_TWINS_JOY_MEG, ThreeIsland_BondBridge_Text_MegRematchIntro, ThreeIsland_BondBridge_Text_MegDefeat, ThreeIsland_BondBridge_Text_MegNotEnoughMons msgbox ThreeIsland_BondBridge_Text_MegPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_Daisy:: trainerbattle_single TRAINER_PAINTER_DAISY, FiveIsland_ResortGorgeous_Text_DaisyIntro, FiveIsland_ResortGorgeous_Text_DaisyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_DaisyRematch msgbox FiveIsland_ResortGorgeous_Text_DaisyPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_DaisyRematch:: trainerbattle_rematch TRAINER_PAINTER_DAISY, FiveIsland_ResortGorgeous_Text_DaisyRematchIntro, FiveIsland_ResortGorgeous_Text_DaisyDefeat msgbox FiveIsland_ResortGorgeous_Text_DaisyPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_Celina:: trainerbattle_single TRAINER_PAINTER_CELINA, FiveIsland_ResortGorgeous_Text_CelinaIntro, FiveIsland_ResortGorgeous_Text_CelinaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_CelinaRematch msgbox FiveIsland_ResortGorgeous_Text_CelinaPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_CelinaRematch:: trainerbattle_rematch TRAINER_PAINTER_CELINA, FiveIsland_ResortGorgeous_Text_CelinaRematchIntro, FiveIsland_ResortGorgeous_Text_CelinaDefeat msgbox FiveIsland_ResortGorgeous_Text_CelinaPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_Rayna:: trainerbattle_single TRAINER_PAINTER_RAYNA, FiveIsland_ResortGorgeous_Text_RaynaIntro, FiveIsland_ResortGorgeous_Text_RaynaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_RaynaRematch msgbox FiveIsland_ResortGorgeous_Text_RaynaPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_RaynaRematch:: trainerbattle_rematch TRAINER_PAINTER_RAYNA, FiveIsland_ResortGorgeous_Text_RaynaRematchIntro, FiveIsland_ResortGorgeous_Text_RaynaDefeat msgbox FiveIsland_ResortGorgeous_Text_RaynaPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_Jacki:: trainerbattle_single TRAINER_LADY_JACKI, FiveIsland_ResortGorgeous_Text_JackiIntro, FiveIsland_ResortGorgeous_Text_JackiDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_JackiRematch msgbox FiveIsland_ResortGorgeous_Text_JackiPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_JackiRematch:: trainerbattle_rematch TRAINER_LADY_JACKI, FiveIsland_ResortGorgeous_Text_JackiRematchIntro, FiveIsland_ResortGorgeous_Text_JackiDefeat msgbox FiveIsland_ResortGorgeous_Text_JackiPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_Gillian:: trainerbattle_single TRAINER_LADY_GILLIAN, FiveIsland_ResortGorgeous_Text_GillianIntro, FiveIsland_ResortGorgeous_Text_GillianDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_GillianRematch msgbox FiveIsland_ResortGorgeous_Text_GillianPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_GillianRematch:: trainerbattle_rematch TRAINER_LADY_GILLIAN, FiveIsland_ResortGorgeous_Text_GillianRematchIntro, FiveIsland_ResortGorgeous_Text_GillianDefeat msgbox FiveIsland_ResortGorgeous_Text_GillianPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_Destin:: trainerbattle_single TRAINER_YOUNGSTER_DESTIN, FiveIsland_ResortGorgeous_Text_DestinIntro, FiveIsland_ResortGorgeous_Text_DestinDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_DestinRematch msgbox FiveIsland_ResortGorgeous_Text_DestinPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_DestinRematch:: trainerbattle_rematch TRAINER_YOUNGSTER_DESTIN, FiveIsland_ResortGorgeous_Text_DestinRematchIntro, FiveIsland_ResortGorgeous_Text_DestinDefeat msgbox FiveIsland_ResortGorgeous_Text_DestinPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_Toby:: trainerbattle_single TRAINER_SWIMMER_MALE_TOBY, FiveIsland_ResortGorgeous_Text_TobyIntro, FiveIsland_ResortGorgeous_Text_TobyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_TobyRematch msgbox FiveIsland_ResortGorgeous_Text_TobyPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_ResortGorgeous_EventScript_TobyRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_TOBY, FiveIsland_ResortGorgeous_Text_TobyRematchIntro, FiveIsland_ResortGorgeous_Text_TobyDefeat msgbox FiveIsland_ResortGorgeous_Text_TobyPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_WaterLabyrinth_EventScript_Alize:: trainerbattle_single TRAINER_PKMN_BREEDER_ALIZE, FiveIsland_WaterLabyrinth_Text_AlizeIntro, FiveIsland_WaterLabyrinth_Text_AlizeDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_WaterLabyrinth_EventScript_AlizeRematch msgbox FiveIsland_WaterLabyrinth_Text_AlizePostBattle, MSGBOX_AUTOCLOSE end FiveIsland_WaterLabyrinth_EventScript_AlizeRematch:: trainerbattle_rematch TRAINER_PKMN_BREEDER_ALIZE, FiveIsland_WaterLabyrinth_Text_AlizeRematchIntro, FiveIsland_WaterLabyrinth_Text_AlizeDefeat msgbox FiveIsland_WaterLabyrinth_Text_AlizePostBattle, MSGBOX_AUTOCLOSE end FiveIsland_MemorialPillar_EventScript_Milo:: trainerbattle_single TRAINER_BIRD_KEEPER_MILO, FiveIsland_MemorialPillar_Text_MiloIntro, FiveIsland_MemorialPillar_Text_MiloDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_MemorialPillar_EventScript_MiloRematch msgbox FiveIsland_MemorialPillar_Text_MiloPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_MemorialPillar_EventScript_MiloRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_MILO, FiveIsland_MemorialPillar_Text_MiloRematchIntro, FiveIsland_MemorialPillar_Text_MiloDefeat msgbox FiveIsland_MemorialPillar_Text_MiloPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_MemorialPillar_EventScript_Chaz:: trainerbattle_single TRAINER_BIRD_KEEPER_CHAZ, FiveIsland_MemorialPillar_Text_ChazIntro, FiveIsland_MemorialPillar_Text_ChazDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_MemorialPillar_EventScript_ChazRematch msgbox FiveIsland_MemorialPillar_Text_ChazPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_MemorialPillar_EventScript_ChazRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_CHAZ, FiveIsland_MemorialPillar_Text_ChazRematchIntro, FiveIsland_MemorialPillar_Text_ChazDefeat msgbox FiveIsland_MemorialPillar_Text_ChazPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_MemorialPillar_EventScript_Harold:: trainerbattle_single TRAINER_BIRD_KEEPER_HAROLD, FiveIsland_MemorialPillar_Text_HaroldIntro, FiveIsland_MemorialPillar_Text_HaroldDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FiveIsland_MemorialPillar_EventScript_HaroldRematch msgbox FiveIsland_MemorialPillar_Text_HaroldPostBattle, MSGBOX_AUTOCLOSE end FiveIsland_MemorialPillar_EventScript_HaroldRematch:: trainerbattle_rematch TRAINER_BIRD_KEEPER_HAROLD, FiveIsland_MemorialPillar_Text_HaroldRematchIntro, FiveIsland_MemorialPillar_Text_HaroldDefeat msgbox FiveIsland_MemorialPillar_Text_HaroldPostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_Tylor:: trainerbattle_single TRAINER_FISHERMAN_TYLOR, SixIsland_OutcastIsland_Text_TylorIntro, SixIsland_OutcastIsland_Text_TylorDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_TylorRematch msgbox SixIsland_OutcastIsland_Text_TylorPostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_TylorRematch:: trainerbattle_rematch TRAINER_FISHERMAN_TYLOR, SixIsland_OutcastIsland_Text_TylorRematchIntro, SixIsland_OutcastIsland_Text_TylorDefeat msgbox SixIsland_OutcastIsland_Text_TylorPostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_Mymo:: trainerbattle_single TRAINER_SWIMMER_MALE_MYMO, SixIsland_OutcastIsland_Text_MymoIntro, SixIsland_OutcastIsland_Text_MymoDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_MymoRematch msgbox SixIsland_OutcastIsland_Text_MymoPostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_MymoRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_MYMO, SixIsland_OutcastIsland_Text_MymoRematchIntro, SixIsland_OutcastIsland_Text_MymoDefeat msgbox SixIsland_OutcastIsland_Text_MymoPostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_Nicole:: trainerbattle_single TRAINER_SWIMMER_FEMALE_NICOLE, SixIsland_OutcastIsland_Text_NicoleIntro, SixIsland_OutcastIsland_Text_NicoleDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_NicoleRematch msgbox SixIsland_OutcastIsland_Text_NicolePostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_NicoleRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_NICOLE, SixIsland_OutcastIsland_Text_NicoleRematchIntro, SixIsland_OutcastIsland_Text_NicoleDefeat msgbox SixIsland_OutcastIsland_Text_NicolePostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_Ava:: trainerbattle_double TRAINER_SIS_AND_BRO_AVA_GEB, SixIsland_OutcastIsland_Text_AvaIntro, SixIsland_OutcastIsland_Text_AvaDefeat, SixIsland_OutcastIsland_Text_AvaNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_AvaRematch msgbox SixIsland_OutcastIsland_Text_AvaPostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_AvaRematch:: trainerbattle_rematch_double TRAINER_SIS_AND_BRO_AVA_GEB, SixIsland_OutcastIsland_Text_AvaRematchIntro, SixIsland_OutcastIsland_Text_AvaDefeat, SixIsland_OutcastIsland_Text_AvaNotEnoughMons msgbox SixIsland_OutcastIsland_Text_AvaPostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_Geb:: trainerbattle_double TRAINER_SIS_AND_BRO_AVA_GEB, SixIsland_OutcastIsland_Text_GebIntro, SixIsland_OutcastIsland_Text_GebDefeat, SixIsland_OutcastIsland_Text_GebNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_GebRematch msgbox SixIsland_OutcastIsland_Text_GebPostBattle, MSGBOX_AUTOCLOSE end SixIsland_OutcastIsland_EventScript_GebRematch:: trainerbattle_rematch_double TRAINER_SIS_AND_BRO_AVA_GEB, SixIsland_OutcastIsland_Text_GebRematchIntro, SixIsland_OutcastIsland_Text_GebDefeat, SixIsland_OutcastIsland_Text_GebNotEnoughMons msgbox SixIsland_OutcastIsland_Text_GebPostBattle, MSGBOX_AUTOCLOSE end SixIsland_GreenPath_EventScript_Jaclyn:: trainerbattle_single TRAINER_PSYCHIC_JACLYN, SixIsland_GreenPath_Text_JaclynIntro, SixIsland_GreenPath_Text_JaclynDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_GreenPath_EventScript_JaclynRematch msgbox SixIsland_GreenPath_Text_JaclynPostBattle, MSGBOX_AUTOCLOSE end SixIsland_GreenPath_EventScript_JaclynRematch:: trainerbattle_rematch TRAINER_PSYCHIC_JACLYN, SixIsland_GreenPath_Text_JaclynRematchIntro, SixIsland_GreenPath_Text_JaclynDefeat msgbox SixIsland_GreenPath_Text_JaclynPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_Rose:: trainerbattle_single TRAINER_AROMA_LADY_ROSE, SixIsland_WaterPath_Text_RoseIntro, SixIsland_WaterPath_Text_RoseDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_RoseRematch msgbox SixIsland_WaterPath_Text_RosePostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_RoseRematch:: trainerbattle_rematch TRAINER_AROMA_LADY_ROSE, SixIsland_WaterPath_Text_RoseRematchIntro, SixIsland_WaterPath_Text_RoseDefeat msgbox SixIsland_WaterPath_Text_RosePostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_Edward:: trainerbattle_single TRAINER_JUGGLER_EDWARD, SixIsland_WaterPath_Text_EdwardIntro, SixIsland_WaterPath_Text_EdwardDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_EdwardRematch msgbox SixIsland_WaterPath_Text_EdwardPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_EdwardRematch:: trainerbattle_rematch TRAINER_JUGGLER_EDWARD, SixIsland_WaterPath_Text_EdwardRematchIntro, SixIsland_WaterPath_Text_EdwardDefeat msgbox SixIsland_WaterPath_Text_EdwardPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_Samir:: trainerbattle_single TRAINER_SWIMMER_MALE_SAMIR, SixIsland_WaterPath_Text_SamirIntro, SixIsland_WaterPath_Text_SamirDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_SamirRematch msgbox SixIsland_WaterPath_Text_SamirPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_SamirRematch:: trainerbattle_rematch TRAINER_SWIMMER_MALE_SAMIR, SixIsland_WaterPath_Text_SamirRematchIntro, SixIsland_WaterPath_Text_SamirDefeat msgbox SixIsland_WaterPath_Text_SamirPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_Denise:: trainerbattle_single TRAINER_SWIMMER_FEMALE_DENISE, SixIsland_WaterPath_Text_DeniseIntro, SixIsland_WaterPath_Text_DeniseDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_DeniseRematch msgbox SixIsland_WaterPath_Text_DenisePostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_DeniseRematch:: trainerbattle_rematch TRAINER_SWIMMER_FEMALE_DENISE, SixIsland_WaterPath_Text_DeniseRematchIntro, SixIsland_WaterPath_Text_DeniseDefeat msgbox SixIsland_WaterPath_Text_DenisePostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_Miu:: trainerbattle_double TRAINER_TWINS_MIU_MIA, SixIsland_WaterPath_Text_MiuIntro, SixIsland_WaterPath_Text_MiuDefeat, SixIsland_WaterPath_Text_MiuNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_MiuRematch msgbox SixIsland_WaterPath_Text_MiuPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_MiuRematch:: trainerbattle_rematch_double TRAINER_TWINS_MIU_MIA, SixIsland_WaterPath_Text_MiuRematchIntro, SixIsland_WaterPath_Text_MiuDefeat, SixIsland_WaterPath_Text_MiuNotEnoughMons msgbox SixIsland_WaterPath_Text_MiuPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_Mia:: trainerbattle_double TRAINER_TWINS_MIU_MIA, SixIsland_WaterPath_Text_MiaIntro, SixIsland_WaterPath_Text_MiaDefeat, SixIsland_WaterPath_Text_MiaNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_MiaRematch msgbox SixIsland_WaterPath_Text_MiaPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_MiaRematch:: trainerbattle_rematch_double TRAINER_TWINS_MIU_MIA, SixIsland_WaterPath_Text_MiaRematchIntro, SixIsland_WaterPath_Text_MiaDefeat, SixIsland_WaterPath_Text_MiaNotEnoughMons msgbox SixIsland_WaterPath_Text_MiaPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_Earl:: trainerbattle_single TRAINER_HIKER_EARL, SixIsland_WaterPath_Text_EarlIntro, SixIsland_WaterPath_Text_EarlDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_EarlRematch msgbox SixIsland_WaterPath_Text_EarlPostBattle, MSGBOX_AUTOCLOSE end SixIsland_WaterPath_EventScript_EarlRematch:: trainerbattle_rematch TRAINER_HIKER_EARL, SixIsland_WaterPath_Text_EarlRematchIntro, SixIsland_WaterPath_Text_EarlDefeat msgbox SixIsland_WaterPath_Text_EarlPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_Stanly:: trainerbattle_single TRAINER_RUIN_MANIAC_STANLY, SixIsland_RuinValley_Text_StanlyIntro, SixIsland_RuinValley_Text_StanlyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_StanlyRematch msgbox SixIsland_RuinValley_Text_StanlyPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_StanlyRematch:: trainerbattle_rematch TRAINER_RUIN_MANIAC_STANLY, SixIsland_RuinValley_Text_StanlyRematchIntro, SixIsland_RuinValley_Text_StanlyDefeat msgbox SixIsland_RuinValley_Text_StanlyPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_Foster:: trainerbattle_single TRAINER_RUIN_MANIAC_FOSTER, SixIsland_RuinValley_Text_FosterIntro, SixIsland_RuinValley_Text_FosterDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_FosterRematch msgbox SixIsland_RuinValley_Text_FosterPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_FosterRematch:: trainerbattle_rematch TRAINER_RUIN_MANIAC_FOSTER, SixIsland_RuinValley_Text_FosterRematchIntro, SixIsland_RuinValley_Text_FosterDefeat msgbox SixIsland_RuinValley_Text_FosterPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_Larry:: trainerbattle_single TRAINER_RUIN_MANIAC_LARRY, SixIsland_RuinValley_Text_LarryIntro, SixIsland_RuinValley_Text_LarryDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_LarryRematch msgbox SixIsland_RuinValley_Text_LarryPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_LarryRematch:: trainerbattle_rematch TRAINER_RUIN_MANIAC_LARRY, SixIsland_RuinValley_Text_LarryRematchIntro, SixIsland_RuinValley_Text_LarryDefeat msgbox SixIsland_RuinValley_Text_LarryPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_Daryl:: trainerbattle_single TRAINER_HIKER_DARYL, SixIsland_RuinValley_Text_DarylIntro, SixIsland_RuinValley_Text_DarylDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_DarylRematch msgbox SixIsland_RuinValley_Text_DarylPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_DarylRematch:: trainerbattle_rematch TRAINER_HIKER_DARYL, SixIsland_RuinValley_Text_DarylRematchIntro, SixIsland_RuinValley_Text_DarylDefeat msgbox SixIsland_RuinValley_Text_DarylPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_Hector:: trainerbattle_single TRAINER_POKEMANIAC_HECTOR, SixIsland_RuinValley_Text_HectorIntro, SixIsland_RuinValley_Text_HectorDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_HectorRematch msgbox SixIsland_RuinValley_Text_HectorPostBattle, MSGBOX_AUTOCLOSE end SixIsland_RuinValley_EventScript_HectorRematch:: trainerbattle_rematch TRAINER_POKEMANIAC_HECTOR, SixIsland_RuinValley_Text_HectorRematchIntro, SixIsland_RuinValley_Text_HectorDefeat msgbox SixIsland_RuinValley_Text_HectorPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TrainerTower_EventScript_Dario:: trainerbattle_single TRAINER_PSYCHIC_DARIO, SevenIsland_TrainerTower_Text_DarioIntro, SevenIsland_TrainerTower_Text_DarioDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_TrainerTower_EventScript_DarioRematch msgbox SevenIsland_TrainerTower_Text_DarioPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TrainerTower_EventScript_DarioRematch:: trainerbattle_rematch TRAINER_PSYCHIC_DARIO, SevenIsland_TrainerTower_Text_DarioRematchIntro, SevenIsland_TrainerTower_Text_DarioDefeat msgbox SevenIsland_TrainerTower_Text_DarioPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TrainerTower_EventScript_Rodette:: trainerbattle_single TRAINER_PSYCHIC_RODETTE, SevenIsland_TrainerTower_Text_RodetteIntro, SevenIsland_TrainerTower_Text_RodetteDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_TrainerTower_EventScript_RodetteRematch msgbox SevenIsland_TrainerTower_Text_RodettePostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TrainerTower_EventScript_RodetteRematch:: trainerbattle_rematch TRAINER_PSYCHIC_RODETTE, SevenIsland_TrainerTower_Text_RodetteRematchIntro, SevenIsland_TrainerTower_Text_RodetteDefeat msgbox SevenIsland_TrainerTower_Text_RodettePostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_Miah:: trainerbattle_single TRAINER_AROMA_LADY_MIAH, SevenIsland_SevaultCanyon_Entrance_Text_MiahIntro, SevenIsland_SevaultCanyon_Entrance_Text_MiahDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_MiahRematch msgbox SevenIsland_SevaultCanyon_Entrance_Text_MiahPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_MiahRematch:: trainerbattle_rematch TRAINER_AROMA_LADY_MIAH, SevenIsland_SevaultCanyon_Entrance_Text_MiahRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_MiahDefeat msgbox SevenIsland_SevaultCanyon_Entrance_Text_MiahPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_Eve:: trainerbattle_double TRAINER_YOUNG_COUPLE_EVE_JON, SevenIsland_SevaultCanyon_Entrance_Text_EveIntro, SevenIsland_SevaultCanyon_Entrance_Text_EveDefeat, SevenIsland_SevaultCanyon_Entrance_Text_EveNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_EveRematch msgbox SevenIsland_SevaultCanyon_Entrance_Text_EvePostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_EveRematch:: trainerbattle_rematch_double TRAINER_YOUNG_COUPLE_EVE_JON, SevenIsland_SevaultCanyon_Entrance_Text_EveRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_EveDefeat, SevenIsland_SevaultCanyon_Entrance_Text_EveNotEnoughMons msgbox SevenIsland_SevaultCanyon_Entrance_Text_EvePostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_Jon:: trainerbattle_double TRAINER_YOUNG_COUPLE_EVE_JON, SevenIsland_SevaultCanyon_Entrance_Text_JonIntro, SevenIsland_SevaultCanyon_Entrance_Text_JonDefeat, SevenIsland_SevaultCanyon_Entrance_Text_JonNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_JonRematch msgbox SevenIsland_SevaultCanyon_Entrance_Text_JonPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_JonRematch:: trainerbattle_rematch_double TRAINER_YOUNG_COUPLE_EVE_JON, SevenIsland_SevaultCanyon_Entrance_Text_JonRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_JonDefeat, SevenIsland_SevaultCanyon_Entrance_Text_JonNotEnoughMons msgbox SevenIsland_SevaultCanyon_Entrance_Text_JonPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_Mason:: trainerbattle_single TRAINER_JUGGLER_MASON, SevenIsland_SevaultCanyon_Entrance_Text_MasonIntro, SevenIsland_SevaultCanyon_Entrance_Text_MasonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_MasonRematch msgbox SevenIsland_SevaultCanyon_Entrance_Text_MasonPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_MasonRematch:: trainerbattle_rematch TRAINER_JUGGLER_MASON, SevenIsland_SevaultCanyon_Entrance_Text_MasonRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_MasonDefeat msgbox SevenIsland_SevaultCanyon_Entrance_Text_MasonPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_Nicolas:: trainerbattle_single TRAINER_PKMN_RANGER_NICOLAS, SevenIsland_SevaultCanyon_Entrance_Text_NicolasIntro, SevenIsland_SevaultCanyon_Entrance_Text_NicolasDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_NicolasRematch msgbox SevenIsland_SevaultCanyon_Entrance_Text_NicolasPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_NicolasRematch:: trainerbattle_rematch TRAINER_PKMN_RANGER_NICOLAS, SevenIsland_SevaultCanyon_Entrance_Text_NicolasRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_NicolasDefeat msgbox SevenIsland_SevaultCanyon_Entrance_Text_NicolasPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_Madeline:: trainerbattle_single TRAINER_PKMN_RANGER_MADELINE, SevenIsland_SevaultCanyon_Entrance_Text_MadelineIntro, SevenIsland_SevaultCanyon_Entrance_Text_MadelineDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_MadelineRematch msgbox SevenIsland_SevaultCanyon_Entrance_Text_MadelinePostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_Entrance_EventScript_MadelineRematch:: trainerbattle_rematch TRAINER_PKMN_RANGER_MADELINE, SevenIsland_SevaultCanyon_Entrance_Text_MadelineRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_MadelineDefeat msgbox SevenIsland_SevaultCanyon_Entrance_Text_MadelinePostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_Cyndy:: trainerbattle_single TRAINER_CRUSH_GIRL_CYNDY, SevenIsland_SevaultCanyon_Text_CyndyIntro, SevenIsland_SevaultCanyon_Text_CyndyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_CyndyRematch msgbox SevenIsland_SevaultCanyon_Text_CyndyPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_CyndyRematch:: trainerbattle_rematch TRAINER_CRUSH_GIRL_CYNDY, SevenIsland_SevaultCanyon_Text_CyndyRematchIntro, SevenIsland_SevaultCanyon_Text_CyndyDefeat msgbox SevenIsland_SevaultCanyon_Text_CyndyPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_Evan:: trainerbattle_single TRAINER_TAMER_EVAN, SevenIsland_SevaultCanyon_Text_EvanIntro, SevenIsland_SevaultCanyon_Text_EvanDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_EvanRematch msgbox SevenIsland_SevaultCanyon_Text_EvanPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_EvanRematch:: trainerbattle_rematch TRAINER_TAMER_EVAN, SevenIsland_SevaultCanyon_Text_EvanRematchIntro, SevenIsland_SevaultCanyon_Text_EvanDefeat msgbox SevenIsland_SevaultCanyon_Text_EvanPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_Jackson:: trainerbattle_single TRAINER_PKMN_RANGER_JACKSON, SevenIsland_SevaultCanyon_Text_JacksonIntro, SevenIsland_SevaultCanyon_Text_JacksonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_JacksonRematch msgbox SevenIsland_SevaultCanyon_Text_JacksonPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_JacksonRematch:: trainerbattle_rematch TRAINER_PKMN_RANGER_JACKSON, SevenIsland_SevaultCanyon_Text_JacksonRematchIntro, SevenIsland_SevaultCanyon_Text_JacksonDefeat msgbox SevenIsland_SevaultCanyon_Text_JacksonPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_Katelyn:: trainerbattle_single TRAINER_PKMN_RANGER_KATELYN, SevenIsland_SevaultCanyon_Text_KatelynIntro, SevenIsland_SevaultCanyon_Text_KatelynDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_KatelynRematch msgbox SevenIsland_SevaultCanyon_Text_KatelynPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_KatelynRematch:: trainerbattle_rematch TRAINER_PKMN_RANGER_KATELYN, SevenIsland_SevaultCanyon_Text_KatelynRematchIntro, SevenIsland_SevaultCanyon_Text_KatelynDefeat msgbox SevenIsland_SevaultCanyon_Text_KatelynPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_Leroy:: trainerbattle_single TRAINER_COOLTRAINER_LEROY, SevenIsland_SevaultCanyon_Text_LeroyIntro, SevenIsland_SevaultCanyon_Text_LeroyDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_LeroyRematch msgbox SevenIsland_SevaultCanyon_Text_LeroyPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_LeroyRematch:: trainerbattle_rematch TRAINER_COOLTRAINER_LEROY, SevenIsland_SevaultCanyon_Text_LeroyRematchIntro, SevenIsland_SevaultCanyon_Text_LeroyDefeat msgbox SevenIsland_SevaultCanyon_Text_LeroyPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_Michelle:: trainerbattle_single TRAINER_COOLTRAINER_MICHELLE, SevenIsland_SevaultCanyon_Text_MichelleIntro, SevenIsland_SevaultCanyon_Text_MichelleDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_MichelleRematch msgbox SevenIsland_SevaultCanyon_Text_MichellePostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_MichelleRematch:: trainerbattle_rematch TRAINER_COOLTRAINER_MICHELLE, SevenIsland_SevaultCanyon_Text_MichelleRematchIntro, SevenIsland_SevaultCanyon_Text_MichelleDefeat msgbox SevenIsland_SevaultCanyon_Text_MichellePostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_Lex:: trainerbattle_double TRAINER_COOL_COUPLE_LEX_NYA, SevenIsland_SevaultCanyon_Text_LexIntro, SevenIsland_SevaultCanyon_Text_LexDefeat, SevenIsland_SevaultCanyon_Text_LexNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_LexRematch msgbox SevenIsland_SevaultCanyon_Text_LexPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_LexRematch:: trainerbattle_rematch_double TRAINER_COOL_COUPLE_LEX_NYA, SevenIsland_SevaultCanyon_Text_LexRematchIntro, SevenIsland_SevaultCanyon_Text_LexDefeat, SevenIsland_SevaultCanyon_Text_LexNotEnoughMons msgbox SevenIsland_SevaultCanyon_Text_LexPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_Nya:: trainerbattle_double TRAINER_COOL_COUPLE_LEX_NYA, SevenIsland_SevaultCanyon_Text_NyaIntro, SevenIsland_SevaultCanyon_Text_NyaDefeat, SevenIsland_SevaultCanyon_Text_NyaNotEnoughMons specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_NyaRematch msgbox SevenIsland_SevaultCanyon_Text_NyaPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_SevaultCanyon_EventScript_NyaRematch:: trainerbattle_rematch_double TRAINER_COOL_COUPLE_LEX_NYA, SevenIsland_SevaultCanyon_Text_NyaRematchIntro, SevenIsland_SevaultCanyon_Text_NyaDefeat, SevenIsland_SevaultCanyon_Text_NyaNotEnoughMons msgbox SevenIsland_SevaultCanyon_Text_NyaPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TanobyRuins_EventScript_Brandon:: trainerbattle_single TRAINER_RUIN_MANIAC_BRANDON, SevenIsland_TanobyRuins_Text_BrandonIntro, SevenIsland_TanobyRuins_Text_BrandonDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_TanobyRuins_EventScript_BrandonRematch msgbox SevenIsland_TanobyRuins_Text_BrandonPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TanobyRuins_EventScript_BrandonRematch:: trainerbattle_rematch TRAINER_RUIN_MANIAC_BRANDON, SevenIsland_TanobyRuins_Text_BrandonRematchIntro, SevenIsland_TanobyRuins_Text_BrandonDefeat msgbox SevenIsland_TanobyRuins_Text_BrandonPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TanobyRuins_EventScript_Benjamin:: trainerbattle_single TRAINER_RUIN_MANIAC_BENJAMIN, SevenIsland_TanobyRuins_Text_BenjaminIntro, SevenIsland_TanobyRuins_Text_BenjaminDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_TanobyRuins_EventScript_BenjaminRematch msgbox SevenIsland_TanobyRuins_Text_BenjaminPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TanobyRuins_EventScript_BenjaminRematch:: trainerbattle_rematch TRAINER_RUIN_MANIAC_BENJAMIN, SevenIsland_TanobyRuins_Text_BenjaminRematchIntro, SevenIsland_TanobyRuins_Text_BenjaminDefeat msgbox SevenIsland_TanobyRuins_Text_BenjaminPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TanobyRuins_EventScript_Edna:: trainerbattle_single TRAINER_PAINTER_EDNA, SevenIsland_TanobyRuins_Text_EdnaIntro, SevenIsland_TanobyRuins_Text_EdnaDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_TanobyRuins_EventScript_EdnaRematch msgbox SevenIsland_TanobyRuins_Text_EdnaPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TanobyRuins_EventScript_EdnaRematch:: trainerbattle_rematch TRAINER_PAINTER_EDNA, SevenIsland_TanobyRuins_Text_EdnaRematchIntro, SevenIsland_TanobyRuins_Text_EdnaDefeat msgbox SevenIsland_TanobyRuins_Text_EdnaPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TanobyRuins_EventScript_Clifford:: trainerbattle_single TRAINER_GENTLEMAN_CLIFFORD, SevenIsland_TanobyRuins_Text_CliffordIntro, SevenIsland_TanobyRuins_Text_CliffordDefeat specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SevenIsland_TanobyRuins_EventScript_CliffordRematch msgbox SevenIsland_TanobyRuins_Text_CliffordPostBattle, MSGBOX_AUTOCLOSE end SevenIsland_TanobyRuins_EventScript_CliffordRematch:: trainerbattle_rematch TRAINER_GENTLEMAN_CLIFFORD, SevenIsland_TanobyRuins_Text_CliffordRematchIntro, SevenIsland_TanobyRuins_Text_CliffordDefeat msgbox SevenIsland_TanobyRuins_Text_CliffordPostBattle, MSGBOX_AUTOCLOSE end ================================================ FILE: data/scripts/white_out.inc ================================================ EventScript_AfterWhiteOutHeal:: lockall textcolor NPC_TEXT_COLOR_FEMALE msgbox Text_FirstShouldRestoreMonsHealth call EventScript_PkmnCenterNurse_TakeAndHealPkmn call_if_unset FLAG_DEFEATED_BROCK, EventScript_AfterWhiteOutHealMsgPreBrock call_if_set FLAG_DEFEATED_BROCK, EventScript_AfterWhiteOutHealMsg applymovement VAR_LAST_TALKED, Movement_Bow waitmovement 0 fadedefaultbgm releaseall end EventScript_NuzlockeHaveMons_Nurse:: lockall textcolor 1 msgbox Text_SwappedForYou_NuzlockeOnly applymovement VAR_LAST_TALKED, Movement_Bow waitmovement 0 fadedefaultbgm releaseall end EventScript_NoPMCHaveMons_Nurse:: lockall textcolor 1 msgbox Text_SwappedForYou_NoPMCOnly applymovement VAR_LAST_TALKED, Movement_Bow waitmovement 0 fadedefaultbgm releaseall end Text_SwappedForYou_NuzlockeOnly:: .string "I've swapped a POKéMON from your\n" .string "BOX with a POKéMON in your party.\p" .string "If your POKéMON's energy, HP, is\n" .string "low, come see us before they faint.\p" .string "If you're planning to go far in the\n" .string "field, you should buy some POTIONS\l" .string "at the POKéMON MART.\p" .string "We hope you excel!$" Text_SwappedForYou_NoPMCOnly:: .string "I've swapped a POKéMON from your\n" .string "BOX with a POKéMON in your party.\p" .string "If you're planning to go far in the\n" .string "field, you should buy some POTIONS\l" .string "at the POKéMON MART.\p" .string "We hope you excel!$" EventScript_AfterWhiteOutHealMsgPreBrock:: textcolor 1 msgbox Text_MonsHealedShouldBuyPotions return EventScript_AfterWhiteOutHealMsg:: textcolor 1 msgbox Text_MonsHealed return @ LOCALID_MOM set by PalletTown_PlayersHouse_1F EventScript_AfterWhiteOutMomHeal:: lockall textcolor NPC_TEXT_COLOR_FEMALE applymovement LOCALID_MOM, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox Text_HadQuiteAnExperienceTakeRest call EventScript_OutOfCenterPartyHeal textcolor 1 msgbox Text_MomExplainHPGetPotions fadedefaultbgm releaseall end EventScript_NuzlockeGameOver:: lockall textcolor 3 signmsg msgbox Text_NuzlockeGameOver msgbox EventScript_NuzlockeGameOver_Text_0, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_1 msgbox EventScript_NuzlockeGameOver_Text_3, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_7 setvar VAR_TEMP_9, 2 goto EventScript_NuzlockeGameOver_Loop return EventScript_NuzlockeGameOver_1: msgbox EventScript_NuzlockeGameOver_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_4 setvar VAR_TEMP_9, 1 goto EventScript_NuzlockeGameOver_Loop return EventScript_NuzlockeGameOver_4: msgbox EventScript_NuzlockeGameOver_Text_2 callnative DoSoftReset return EventScript_NuzlockeGameOver_7: msgbox EventScript_NuzlockeGameOver_Text_4 normalmsg callnative TurnOffNuzlockeMode callnative ResetTintFilter goto EventScript_AfterWhiteOutHeal return EventScript_NuzlockeGameOver_Loop:: switch VAR_TEMP_9 case 1, EventScript_NuzlockeGameOver_Loop_2 case 2, EventScript_NuzlockeGameOver_Loop_3 return EventScript_NuzlockeGameOver_Loop_2: msgbox EventScript_NuzlockeGameOver_Text_3, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_4 setvar VAR_TEMP_9, 2 goto EventScript_NuzlockeGameOver_Loop return EventScript_NuzlockeGameOver_Loop_3: msgbox EventScript_NuzlockeGameOver_Text_0, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_7 setvar VAR_TEMP_9, 1 goto EventScript_NuzlockeGameOver_Loop return EventScript_NuzlockeGameOver_Loop_4: msgbox EventScript_NuzlockeGameOver_Text_4 normalmsg callnative TurnOffNuzlockeMode callnative ResetTintFilter goto EventScript_AfterWhiteOutHeal return EventScript_NuzlockeGameOver_Loop_7: msgbox EventScript_NuzlockeGameOver_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_10 setvar VAR_TEMP_9, 1 goto EventScript_NuzlockeGameOver_Loop return EventScript_NuzlockeGameOver_Loop_10: msgbox EventScript_NuzlockeGameOver_Text_2 callnative DoSoftReset return EventScript_NuzlockeGameOver_Text_0: .string "Would you like to reset to the\nlast save point?$" EventScript_NuzlockeGameOver_Text_1: .string "Are you sure?\pYou will lose all progress since\nyou last saved.$" EventScript_NuzlockeGameOver_Text_2: .string "The game will now reset.$" EventScript_NuzlockeGameOver_Text_3: .string "Would you like to turn off\nNUZLOCKE MODE and heal your party?$" EventScript_NuzlockeGameOver_Text_4: .string "NUZLOCKE MODE has been turned off.$" EventScript_NuzlockeGameOver_Mom:: lockall textcolor 3 signmsg msgbox Text_NuzlockeGameOver msgbox EventScript_NuzlockeGameOver_Text_0, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Mom_1 msgbox EventScript_NuzlockeGameOver_Text_3, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Mom_7 setvar VAR_TEMP_9, 2 goto EventScript_NuzlockeGameOver_Loop_Mom return EventScript_NuzlockeGameOver_Mom_1: msgbox EventScript_NuzlockeGameOver_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Mom_4 setvar VAR_TEMP_9, 1 goto EventScript_NuzlockeGameOver_Loop_Mom return EventScript_NuzlockeGameOver_Mom_4: msgbox EventScript_NuzlockeGameOver_Text_2 callnative DoSoftReset return EventScript_NuzlockeGameOver_Mom_7: msgbox EventScript_NuzlockeGameOver_Text_4 normalmsg callnative TurnOffNuzlockeMode callnative ResetTintFilter goto EventScript_AfterWhiteOutMomHeal return EventScript_NuzlockeGameOver_Loop_Mom:: switch VAR_TEMP_9 case 1, EventScript_NuzlockeGameOver_Loop_Mom_2 case 2, EventScript_NuzlockeGameOver_Loop_Mom_3 return EventScript_NuzlockeGameOver_Loop_Mom_2: msgbox EventScript_NuzlockeGameOver_Text_3, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_Mom_4 setvar VAR_TEMP_9, 2 goto EventScript_NuzlockeGameOver_Loop_Mom return EventScript_NuzlockeGameOver_Loop_Mom_3: msgbox EventScript_NuzlockeGameOver_Text_0, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_Mom_7 setvar VAR_TEMP_9, 1 goto EventScript_NuzlockeGameOver_Loop_Mom return EventScript_NuzlockeGameOver_Loop_Mom_4: msgbox EventScript_NuzlockeGameOver_Text_4 normalmsg callnative TurnOffNuzlockeMode callnative ResetTintFilter goto EventScript_AfterWhiteOutMomHeal return EventScript_NuzlockeGameOver_Loop_Mom_7: msgbox EventScript_NuzlockeGameOver_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_Mom_10 setvar VAR_TEMP_9, 1 goto EventScript_NuzlockeGameOver_Loop_Mom return EventScript_NuzlockeGameOver_Loop_Mom_10: msgbox EventScript_NuzlockeGameOver_Text_2 callnative DoSoftReset return Text_NuzlockeGameOver:: .string "You have no more POKéMON that can\n" .string "battle in your POKéMON PC.\p" .string "You can either reset to the last\n" .string "time you saved, or turn off\l" .string "NUZLOCKE MODE and heal your party.$" EventScript_NuzlockeHaveMons_Mom:: lockall textcolor 1 applymovement 1, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox Text_SwappedForYou_NuzlockeOnly_Mom fadedefaultbgm releaseall end EventScript_NoPMCHaveMons_Mom:: lockall textcolor 1 applymovement 1, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox Text_SwappedForYou_NoPMCOnly_Mom fadedefaultbgm releaseall end Text_SwappedForYou_NuzlockeOnly_Mom:: .string "MOM: {PLAYER}!\n" .string "Welcome home.\p" .string "It sounds like you had quite\n" .string "an experience.\p" .string "I've swapped a POKéMON from your\n" .string "BOX with a POKéMON in your party.\p" .string "I just heard from PROF. OAK.\p" .string "He said that POKéMON's energy is\n" .string "measured in HP.\p" .string "If your POKéMON lose their HP,\n" .string "you can restore them at any\l" .string "POKéMON CENTER before they faint.\p" .string "If you're going to travel far away,\n" .string "the smart TRAINER stocks up on\l" .string "POTIONS at the POKéMON MART.\p" .string "Make me proud, honey!\p" .string "Take care!$" Text_SwappedForYou_NoPMCOnly_Mom:: .string "MOM: {PLAYER}!\n" .string "Welcome home.\p" .string "It sounds like you had quite\n" .string "an experience.\p" .string "I've swapped a POKéMON from your\n" .string "BOX with a POKéMON in your party.\p" .string "I just heard from PROF. OAK.\p" .string "He said that POKéMON's energy is\n" .string "measured in HP.\p" .string "If you're going to travel far away,\n" .string "the smart TRAINER stocks up on\l" .string "POTIONS at the POKéMON MART to\l" .string "restore their POKéMON's HP.\p" .string "Make me proud, honey!\p" .string "Take care!$" EventScript_FieldPoison:: lockall textcolor NPC_TEXT_COLOR_NEUTRAL special TryFieldPoisonWhiteOut waitstate goto_if_eq VAR_RESULT, TRUE, EventScript_FieldWhiteOut releaseall end EventScript_FieldWhiteOut:: checkmoney 1 goto_if_eq VAR_RESULT, FALSE, EventScript_FieldWhiteOutNoMoney goto_if_eq VAR_RESULT, TRUE, EventScript_FieldWhiteOutHasMoney end EventScript_FieldWhiteOutNoMoney:: msgbox Text_WhitedOut goto EventScript_FieldWhiteOutFade end EventScript_FieldWhiteOutHasMoney:: special OverworldWhiteOutGetMoneyLoss msgbox Text_WhitedOutLostMoney goto EventScript_FieldWhiteOutFade end EventScript_FieldWhiteOutFade:: special Script_FadeOutMapMusic waitstate fadescreen FADE_TO_BLACK special SetCB2WhiteOut waitstate end EventScript_BothGameOver:: lockall textcolor 3 signmsg msgbox EventScript_BothGameOver_Text_0 msgbox EventScript_BothGameOver_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_1 msgbox EventScript_BothGameOver_Text_4, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_7 setvar VAR_TEMP_9, 2 goto EventScript_BothGameOver_Loop return EventScript_BothGameOver_1: msgbox EventScript_BothGameOver_Text_2, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_4 setvar VAR_TEMP_9, 1 goto EventScript_BothGameOver_Loop return EventScript_BothGameOver_4: msgbox EventScript_BothGameOver_Text_3 callnative DoSoftReset return EventScript_BothGameOver_7: msgbox EventScript_BothGameOver_Text_5 normalmsg callnative TurnOffNuzlockeMode callnative TurnOffNoPMC callnative ResetTintFilter goto EventScript_AfterWhiteOutHeal return EventScript_BothGameOver_Loop:: switch VAR_TEMP_9 case 1, EventScript_BothGameOver_Loop_2 case 2, EventScript_BothGameOver_Loop_3 return EventScript_BothGameOver_Loop_2: msgbox EventScript_BothGameOver_Text_4, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_4 setvar VAR_TEMP_9, 2 goto EventScript_BothGameOver_Loop return EventScript_BothGameOver_Loop_3: msgbox EventScript_BothGameOver_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_7 setvar VAR_TEMP_9, 1 goto EventScript_BothGameOver_Loop return EventScript_BothGameOver_Loop_4: msgbox EventScript_BothGameOver_Text_5 normalmsg callnative TurnOffNuzlockeMode callnative TurnOffNoPMC callnative ResetTintFilter goto EventScript_AfterWhiteOutHeal return EventScript_BothGameOver_Loop_7: msgbox EventScript_BothGameOver_Text_2, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_10 setvar VAR_TEMP_9, 1 goto EventScript_BothGameOver_Loop return EventScript_BothGameOver_Loop_10: msgbox EventScript_BothGameOver_Text_3 callnative DoSoftReset return EventScript_BothGameOver_Text_0: .string "You have no more POKéMON that can\nbattle in your POKéMON PC.\pYou can either reset to the last\ntime you saved, or turn off\lNUZLOCKE MODE and NO FREE HEALS\land heal your party.$" EventScript_BothGameOver_Text_1: .string "Would you like to reset to the\nlast save point?$" EventScript_BothGameOver_Text_2: .string "Are you sure?\pYou will lose all progress since\nyou last saved.$" EventScript_BothGameOver_Text_3: .string "The game will now reset.$" EventScript_BothGameOver_Text_4: .string "Would you like to turn off NUZLOCKE\nMODE and NO FREE HEALS and heal\lyour party?$" EventScript_BothGameOver_Text_5: .string "NUZLOCKE MODE and NO FREE HEALS\nhave been turned off.$" EventScript_BothGameOver_Mom:: lockall textcolor 3 signmsg msgbox EventScript_BothGameOver_Mom_Text_0 msgbox EventScript_BothGameOver_Mom_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Mom_1 msgbox EventScript_BothGameOver_Mom_Text_4, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Mom_7 setvar VAR_TEMP_9, 2 goto EventScript_BothGameOver_Loop_Mom return EventScript_BothGameOver_Mom_1: msgbox EventScript_BothGameOver_Mom_Text_2, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Mom_4 setvar VAR_TEMP_9, 1 goto EventScript_BothGameOver_Loop_Mom return EventScript_BothGameOver_Mom_4: msgbox EventScript_BothGameOver_Mom_Text_3 callnative DoSoftReset return EventScript_BothGameOver_Mom_7: msgbox EventScript_BothGameOver_Mom_Text_5 normalmsg callnative TurnOffNuzlockeMode callnative TurnOffNoPMC callnative ResetTintFilter goto EventScript_AfterWhiteOutMomHeal return EventScript_BothGameOver_Loop_Mom:: switch VAR_TEMP_9 case 1, EventScript_BothGameOver_Loop_Mom_2 case 2, EventScript_BothGameOver_Loop_Mom_3 return EventScript_BothGameOver_Loop_Mom_2: msgbox EventScript_BothGameOver_Mom_Text_4, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_Mom_4 setvar VAR_TEMP_9, 2 goto EventScript_BothGameOver_Loop_Mom return EventScript_BothGameOver_Loop_Mom_3: msgbox EventScript_BothGameOver_Mom_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_Mom_7 setvar VAR_TEMP_9, 1 goto EventScript_BothGameOver_Loop_Mom return EventScript_BothGameOver_Loop_Mom_4: msgbox EventScript_BothGameOver_Mom_Text_5 normalmsg callnative TurnOffNuzlockeMode callnative TurnOffNoPMC callnative ResetTintFilter goto EventScript_AfterWhiteOutMomHeal return EventScript_BothGameOver_Loop_Mom_7: msgbox EventScript_BothGameOver_Mom_Text_2, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_Mom_10 setvar VAR_TEMP_9, 1 goto EventScript_BothGameOver_Loop_Mom return EventScript_BothGameOver_Loop_Mom_10: msgbox EventScript_BothGameOver_Mom_Text_3 callnative DoSoftReset return EventScript_BothGameOver_Mom_Text_0: .string "You have no more POKéMON that can\nbattle in your POKéMON PC.\pYou can either reset to the last\ntime you saved, or turn off\lNUZLOCKE MODE and NO FREE HEALS\land heal your party.$" EventScript_BothGameOver_Mom_Text_1: .string "Would you like to reset to the\nlast save point?$" EventScript_BothGameOver_Mom_Text_2: .string "Are you sure?\pYou will lose all progress since\nyou last saved.$" EventScript_BothGameOver_Mom_Text_3: .string "The game will now reset.$" EventScript_BothGameOver_Mom_Text_4: .string "Would you like to turn off NUZLOCKE\nMODE and NO FREE HEALS and heal\lyour party?$" EventScript_BothGameOver_Mom_Text_5: .string "NUZLOCKE MODE and NO FREE HEALS\nhave been turned off.$" EventScript_NoPMCGameOver_Mom:: lockall textcolor 3 signmsg msgbox EventScript_NoPMCGameOver_Mom_Text_0 msgbox EventScript_NoPMCGameOver_Mom_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Mom_1 msgbox EventScript_NoPMCGameOver_Mom_Text_4, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Mom_7 setvar VAR_TEMP_9, 2 goto EventScript_NoPMCGameOver_Loop_Mom return EventScript_NoPMCGameOver_Mom_1: msgbox EventScript_NoPMCGameOver_Mom_Text_2, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Mom_4 setvar VAR_TEMP_9, 1 goto EventScript_NoPMCGameOver_Loop_Mom return EventScript_NoPMCGameOver_Mom_4: msgbox EventScript_NoPMCGameOver_Mom_Text_3 callnative DoSoftReset return EventScript_NoPMCGameOver_Mom_7: msgbox EventScript_NoPMCGameOver_Mom_Text_5 normalmsg callnative TurnOffNoPMC callnative ResetTintFilter goto EventScript_AfterWhiteOutMomHeal return EventScript_NoPMCGameOver_Loop_Mom:: switch VAR_TEMP_9 case 1, EventScript_NoPMCGameOver_Loop_Mom_2 case 2, EventScript_NoPMCGameOver_Loop_Mom_3 return EventScript_NoPMCGameOver_Loop_Mom_2: msgbox EventScript_NoPMCGameOver_Mom_Text_4, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_Mom_4 setvar VAR_TEMP_9, 2 goto EventScript_NoPMCGameOver_Loop_Mom return EventScript_NoPMCGameOver_Loop_Mom_3: msgbox EventScript_NoPMCGameOver_Mom_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_Mom_7 setvar VAR_TEMP_9, 1 goto EventScript_NoPMCGameOver_Loop_Mom return EventScript_NoPMCGameOver_Loop_Mom_4: msgbox EventScript_NoPMCGameOver_Mom_Text_5 normalmsg callnative TurnOffNoPMC callnative ResetTintFilter goto EventScript_AfterWhiteOutMomHeal return EventScript_NoPMCGameOver_Loop_Mom_7: msgbox EventScript_NoPMCGameOver_Mom_Text_2, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_Mom_10 setvar VAR_TEMP_9, 1 goto EventScript_NoPMCGameOver_Loop_Mom return EventScript_NoPMCGameOver_Loop_Mom_10: msgbox EventScript_NoPMCGameOver_Mom_Text_3 callnative DoSoftReset return EventScript_NoPMCGameOver_Mom_Text_0: .string "You have no more POKéMON that can\nbattle in your POKéMON PC.\pYou can either reset to the last\ntime you saved, or turn off\lNO FREE HEALS and heal your party.$" EventScript_NoPMCGameOver_Mom_Text_1: .string "Would you like to reset to the\nlast save point?$" EventScript_NoPMCGameOver_Mom_Text_2: .string "Are you sure?\pYou will lose all progress since\nyou last saved.$" EventScript_NoPMCGameOver_Mom_Text_3: .string "The game will now reset.$" EventScript_NoPMCGameOver_Mom_Text_4: .string "Would you like to turn off\nNO FREE HEALS and heal your party?$" EventScript_NoPMCGameOver_Mom_Text_5: .string "NO FREE HEALS has been turned off.$" EventScript_NoPMCGameOver:: lockall textcolor 3 signmsg msgbox EventScript_NoPMCGameOver_Text_0 msgbox EventScript_NoPMCGameOver_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_1 msgbox EventScript_NoPMCGameOver_Text_4, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_7 setvar VAR_TEMP_9, 2 goto EventScript_NoPMCGameOver_Loop return EventScript_NoPMCGameOver_1: msgbox EventScript_NoPMCGameOver_Text_2, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_4 setvar VAR_TEMP_9, 1 goto EventScript_NoPMCGameOver_Loop return EventScript_NoPMCGameOver_4: msgbox EventScript_NoPMCGameOver_Text_3 callnative DoSoftReset return EventScript_NoPMCGameOver_7: msgbox EventScript_NoPMCGameOver_Text_5 normalmsg callnative TurnOffNoPMC callnative ResetTintFilter goto EventScript_AfterWhiteOutHeal return EventScript_NoPMCGameOver_Loop:: switch VAR_TEMP_9 case 1, EventScript_NoPMCGameOver_Loop_2 case 2, EventScript_NoPMCGameOver_Loop_3 return EventScript_NoPMCGameOver_Loop_2: msgbox EventScript_NoPMCGameOver_Text_4, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_4 setvar VAR_TEMP_9, 2 goto EventScript_NoPMCGameOver_Loop return EventScript_NoPMCGameOver_Loop_3: msgbox EventScript_NoPMCGameOver_Text_1, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_7 setvar VAR_TEMP_9, 1 goto EventScript_NoPMCGameOver_Loop return EventScript_NoPMCGameOver_Loop_4: msgbox EventScript_NoPMCGameOver_Text_5 normalmsg callnative TurnOffNoPMC callnative ResetTintFilter goto EventScript_AfterWhiteOutHeal return EventScript_NoPMCGameOver_Loop_7: msgbox EventScript_NoPMCGameOver_Text_2, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_10 setvar VAR_TEMP_9, 1 goto EventScript_NoPMCGameOver_Loop return EventScript_NoPMCGameOver_Loop_10: msgbox EventScript_NoPMCGameOver_Text_3 callnative DoSoftReset return EventScript_NoPMCGameOver_Text_0: .string "You have no more POKéMON that can\nbattle in your POKéMON PC.\pYou can either reset to the last\ntime you saved, or turn off\lNO FREE HEALS and heal your party.$" EventScript_NoPMCGameOver_Text_1: .string "Would you like to reset to the\nlast save point?$" EventScript_NoPMCGameOver_Text_2: .string "Are you sure?\pYou will lose all progress since\nyou last saved.$" EventScript_NoPMCGameOver_Text_3: .string "The game will now reset.$" EventScript_NoPMCGameOver_Text_4: .string "Would you like to turn off\nNO FREE HEALS and heal your party?$" EventScript_NoPMCGameOver_Text_5: .string "NO FREE HEALS has been turned off.$" ================================================ FILE: data/sound_data.s ================================================ .section .rodata .include "asm/macros/m4a.inc" .include "asm/macros/music_voice.inc" .include "sound/voice_groups.inc" .include "sound/keysplit_tables.inc" .include "sound/programmable_wave_data.inc" .include "sound/music_player_table.inc" .include "sound/song_table.inc" .include "sound/direct_sound_data.inc" .align 2 ================================================ FILE: data/specials.inc ================================================ .macro def_special ptr .global SPECIAL_\ptr .set SPECIAL_\ptr, __special__ .set __special__, __special__ + 1 .4byte \ptr .endm .set __special__, 0 .align 2 gSpecials:: def_special HealPlayerParty def_special SetCableClubWarp def_special DoCableClubWarp def_special ReturnFromLinkRoom def_special CleanupLinkRoomState def_special ExitLinkRoom def_special NullFieldSpecial @ Secret Base specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special TryBattleLinkup def_special TryTradeLinkup def_special TryRecordMixLinkup def_special CloseLink def_special EnterColosseumPlayerSpot def_special EnterTradeSeat def_special StartWiredCableClubTrade def_special CableClub_AskSaveTheGame def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special SavePlayerParty def_special LoadPlayerParty def_special ChooseHalfPartyForBattle def_special Script_ShowLinkTrainerCard def_special NullFieldSpecial @ Berry Tree specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special IsEnigmaBerryValid def_special GetTrainerBattleMode def_special ShowTrainerIntroSpeech def_special ShowTrainerCantBattleSpeech def_special Script_HasTrainerBeenFought def_special EndTrainerApproach def_special PlayTrainerEncounterMusic def_special ShouldTryRematchBattle def_special IsTrainerReadyForRematch def_special StartRematchBattle def_special ShowPokemonStorageSystemPC def_special HasEnoughMonsForDoubleBattle def_special NullFieldSpecial @ Hoenn TV specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special HasLeadMonBeenRenamed def_special NullFieldSpecial @ Contest specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special TryContestLinkup def_special Field_AskSaveTheGame def_special DoWateringBerryTreeAnim def_special ShowEasyChatScreen def_special ShowEasyChatMessage def_special NullFieldSpecial @ Mauville Man specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special GetHeracrossSizeRecordInfo def_special CompareHeracrossSize def_special GetMagikarpSizeRecordInfo def_special CompareMagikarpSize def_special NameRaterWasNicknameChanged def_special BufferMonNickname def_special IsMonOTIDNotPlayers def_special NullFieldSpecial def_special NullFieldSpecial def_special BufferRandomHobbyOrLifestyleString def_special NullFieldSpecial def_special RegisteredItemHandleBikeSwap def_special CalculatePlayerPartyCount def_special CountPartyNonEggMons def_special CountPartyAliveNonEggMons_IgnoreVar0x8004Slot def_special NullFieldSpecial @ Contest specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial @ Mauville Gym specials def_special NullFieldSpecial def_special ShowFieldMessageStringVar4 def_special DrawWholeMapView def_special GetPlayerXY def_special SetMewAboveGrass def_special DestroyMewEmergingGrassSprite def_special NullFieldSpecial def_special GetPlayerTrainerIdOnesDigit def_special BufferBigGuyOrBigGirlString def_special BufferSonOrDaughterString def_special SetHiddenItemFlag def_special NullFieldSpecial @ Cable Car specials def_special NullFieldSpecial def_special Overworld_PlaySpecialMapMusic def_special NullFieldSpecial @ Wall Clock specials def_special NullFieldSpecial def_special NullFieldSpecial def_special StartOldManTutorialBattle def_special ChangePokemonNickname def_special ChoosePartyMon def_special NullFieldSpecial @ Berry Blender/Roulette specials def_special NullFieldSpecial def_special NullFieldSpecial def_special Script_IsFanClubMemberFanOfPlayer def_special Script_GetNumFansOfPlayerInTrainerFanClub def_special Script_BufferFanClubTrainerName def_special Script_TryLoseFansFromPlayTimeAfterLinkBattle def_special Script_TryLoseFansFromPlayTime def_special Script_SetPlayerGotFirstFans def_special Script_UpdateTrainerFanClubGameClear def_special Script_TryGainNewFanFromCounter def_special RockSmashWildEncounter def_special NullFieldSpecial @ Gabby and Ty specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special GetBattleOutcome def_special GetDaycareMonNicknames def_special GetDaycareState def_special RejectEggFromDayCare def_special GiveEggFromDaycare def_special SetDaycareCompatibilityString def_special GetSelectedMonNicknameAndSpecies def_special StoreSelectedPokemonInDaycare def_special ChooseSendDaycareMon def_special ShowDaycareLevelMenu def_special GetNumLevelsGainedFromDaycare def_special GetDaycareCost def_special TakePokemonFromDaycare def_special ScriptHatchMon def_special EggHatch def_special DaycareMonReceivedMail def_special ShowBattleRecords def_special IsEnoughForCostInVar0x8005 def_special SubtractMoneyFromVar0x8005 def_special TryFieldPoisonWhiteOut def_special SetCB2WhiteOut def_special NullFieldSpecial @ Rotating gate puzzle specials def_special NullFieldSpecial def_special NullFieldSpecial @ SS Tidal specials def_special NullFieldSpecial def_special EnterSafariMode def_special ExitSafariMode def_special NullFieldSpecial @ Misc Hoenn specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special GetPokedexCount def_special GetProfOaksRatingMessage def_special AnimatePcTurnOn def_special AnimatePcTurnOff def_special GetElevatorFloor def_special NullFieldSpecial @ Lottery Corner specials def_special NullFieldSpecial def_special SelectMoveTutorMon def_special SelectMoveDeleterMove def_special MoveDeleterForgetMove def_special BufferMoveDeleterNicknameAndMove def_special GetNumMovesSelectedMonHas def_special DisplayMoveTutorMenu def_special NullFieldSpecial @ Hoenn Cycling Road specials def_special NullFieldSpecial def_special GetPlayerAvatarBike def_special NullFieldSpecial def_special NullFieldSpecial def_special GetLeadMonFriendship def_special BattleTowerMapScript2 def_special ChooseNextBattleTowerTrainer def_special CheckPartyBattleTowerBanlist def_special PrintBattleTowerTrainerGreeting def_special BufferEReaderTrainerGreeting def_special StartSpecialBattle def_special SetBattleTowerProperty def_special BattleTowerUtil def_special SetBattleTowerParty def_special SaveBattleTowerProgress def_special BattleTower_SoftReset def_special DetermineBattleTowerPrize def_special GiveBattleTowerPrize def_special AwardBattleTowerRibbons def_special ChooseBattleTowerPlayerParty def_special ValidateEReaderTrainer def_special NullFieldSpecial def_special ReducePlayerPartyToThree def_special BedroomPC def_special PlayerPC def_special ShowTownMap def_special GetInGameTradeSpeciesInfo def_special CreateInGameTradePokemon def_special DoInGameTradeScene def_special GetTradeSpecies def_special NullFieldSpecial @ Misc Hoenn specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special CreatePCMenu def_special HallOfFamePCBeginFade def_special ShowDiploma def_special NullFieldSpecial @ Check lead mon Contest strength specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special LookThroughPorthole def_special DoSoftReset def_special EnterHallOfFame def_special AnimateElevator def_special NullFieldSpecial @ ShowGlassWorkshopMenu def_special SpawnCameraObject def_special RemoveCameraObject def_special NullFieldSpecial @ Misc Hoenn specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special BufferEReaderTrainerName def_special GetRandomSlotMachineId def_special GetPlayerFacingDirection def_special NullFieldSpecial @ Abandoned Ship room key specials def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special LeadMonHasEffortRibbon def_special GiveLeadMonEffortRibbon def_special AreLeadMonEVsMaxedOut def_special Script_FacePlayer def_special Script_ClearHeldMovement def_special InitRoamer def_special NullFieldSpecial def_special PlayerHasGrassPokemonInParty def_special NullFieldSpecial def_special NullFieldSpecial def_special IsStarterFirstStageInParty def_special NullFieldSpecial def_special IsThereRoomInAnyBoxForMorePokemon def_special NullFieldSpecial def_special DrawElevatorCurrentFloorWindow def_special NullFieldSpecial def_special IsPokerusInParty def_special SetIcefallCaveCrackedIceMetatiles def_special ShakeScreen def_special StartGroudonKyogreBattle def_special StartLegendaryBattle def_special StartRegiBattle def_special SetUpTrainerMovement def_special NullFieldSpecial def_special NullFieldSpecial def_special StartDroughtWeatherBlend def_special DoDiveWarp def_special DoFallWarp def_special NullFieldSpecial def_special NullFieldSpecial def_special SetEReaderTrainerGfxId def_special StartSouthernIslandBattle def_special NullFieldSpecial def_special NullFieldSpecial def_special NullFieldSpecial def_special GetPartyMonSpecies def_special IsSelectedMonEgg def_special NullFieldSpecial def_special NullFieldSpecial def_special LoadPlayerBag def_special Script_FadeOutMapMusic def_special NullFieldSpecial def_special NullFieldSpecial def_special HasAllKantoMons def_special IsMonOTNameNotPlayers def_special NullFieldSpecial def_special Dummy_TryEnableBravoTrainerBattleTower def_special DoesPartyHaveEnigmaBerry def_special NullFieldSpecial def_special SetPostgameFlags def_special StartMarowakBattle def_special ForcePlayerOntoBike def_special ListMenu def_special ReturnToListMenu def_special DoPicboxCancel def_special SetVermilionTrashCans def_special SeafoamIslandsB4F_CurrentDumpsPlayerOnLand def_special SampleResortGorgeousMonAndReward def_special CheckAddCoins def_special GetDaycarePokemonCount def_special CloseElevatorCurrentFloorWindow def_special ForcePlayerToStartSurfing def_special GetStarterSpecies def_special SetSeenMon def_special VsSeekerResetObjectMovementAfterChargeComplete def_special ShouldShowBoxWasFullMessage def_special ChangeBoxPokemonNickname def_special UpdateTrainerCardPhotoIcons def_special StickerManGetBragFlags def_special SetUsedPkmnCenterQuestLogEvent def_special IsWirelessAdapterConnected def_special TryBecomeLinkLeader def_special TryJoinLinkGroup def_special RunUnionRoom def_special ShowWirelessCommunicationScreen def_special EnableNationalPokedex def_special SetWalkingIntoSignVars def_special DisableMsgBoxWalkaway def_special VsSeekerFreezeObjectsAfterChargeComplete def_special SetFlavorTextFlagFromSpecialVars def_special UpdatePickStateFromSpecialVar8005 def_special OverworldWhiteOutGetMoneyLoss def_special PutMonInRoute5Daycare def_special GetCostToWithdrawRoute5DaycareMon def_special IsThereMonInRoute5Daycare def_special GetNumLevelsGainedForRoute5DaycareMon def_special TakePokemonFromRoute5Daycare def_special DoSeagallopFerryScene def_special DoesPlayerPartyContainSpecies def_special Script_SetHelpContext def_special BackupHelpContext def_special RestoreHelpContext def_special ValidateSavedWonderCard def_special SetUnlockedPokedexFlags def_special InitUnionRoom def_special BufferUnionRoomPlayerName def_special QuestLog_StartRecordingInputsAfterDeferredEvent def_special GetMartClerkObjectId def_special GetMysteryGiftCardStat def_special GetQuestLogState def_special QuestLog_CutRecording def_special WonderNews_GetRewardInfo def_special GetPCBoxToSendMon def_special OpenMuseumFossilPic def_special CloseMuseumFossilPic def_special ChooseMonForMoveTutor def_special ChooseMonForWirelessMinigame def_special SetBattledTrainerFlag def_special SetHelpContextForMap def_special DoSSAnneDepartureCutscene def_special IsPokemonJumpSpeciesInParty def_special IsNationalPokedexEnabled def_special CallTrainerTowerFunc def_special ShowPokemonJumpRecords def_special BufferTMHMMoveName def_special DaisyMassageServices def_special HelpSystem_Disable def_special HelpSystem_Enable def_special SetPostgameFlags def_special HasAtLeastOneBerry def_special DisplayBerryPowderVendorMenu def_special RemoveBerryPowderVendorMenu def_special Script_HasEnoughBerryPowder def_special Script_TakeBerryPowder def_special PrintPlayerBerryPowderAmount def_special DoPokemonLeagueLightingEffect def_special ShowBerryCrushRankings def_special CapeBrinkGetMoveToTeachLeadPokemon def_special HasLearnedAllMovesFromCapeBrinkTutor def_special DoCredits def_special ShowDodrioBerryPickingRecords def_special DrawSeagallopDestinationMenu def_special GetSelectedSeagallopDestination def_special GetSeagallopNumber def_special GetPlayerFacingDirection def_special DoDeoxysTriangleInteraction def_special SetDeoxysTrianglePalette def_special IsPlayerLeftOfVermilionSailor def_special IsBadEggInParty def_special ReadTrainerTowerAndValidate def_special HasAllMons def_special IsPlayerNotInTrainerTowerLobby def_special BrailleCursorToggle def_special Script_ResetUnionRoomTrade def_special PlayerPartyContainsSpeciesWithPlayerID def_special AnimateTeleporterHousing def_special IsDodrioInParty def_special AnimateTeleporterCable def_special InitElevatorFloorSelectMenuPos def_special UpdateLoreleiDollCollection def_special LoopWingFlapSound def_special CreateEnemyEventMon gSpecialsEnd:: ================================================ FILE: data/text/aide.inc ================================================ Aide_Text_HaventCaughtEnoughMonsForItem:: .string "Let's see…\n" .string "Uh-oh! You have caught only\l" .string "{STR_VAR_3} kinds of POKéMON!\p" .string "You need {STR_VAR_1} kinds\n" .string "if you want the {STR_VAR_2}.$" Aide_Text_GetEnoughMonsComeBackForItem:: .string "…Oh. I see.\p" .string "When you get {STR_VAR_1} kinds of POKéMON,\n" .string "come back for the {STR_VAR_2}.$" Aide_Text_DontHaveAnyRoomForItem:: .string "Oh! I see you don't have any\n" .string "room for the {STR_VAR_2}.$" ================================================ FILE: data/text/braille.inc ================================================ Braille_Text_Up:: .braille "UP$" Braille_Text_Down:: .braille "DOWN$" Braille_Text_Right:: .braille "RIGHT$" Braille_Text_Left:: .braille "LEFT$" Braille_Text_Cut:: .braille "CUT$" Braille_Text_ABC:: .braille "ABC$" Braille_Text_GHI:: .braille "GHI$" Braille_Text_MNO:: .braille "MNO$" Braille_Text_TUV:: .braille "TUV$" Braille_Text_DEF:: .braille "DEF$" Braille_Text_JKL:: .braille "JKL$" Braille_Text_PQRS:: .braille "PQRS$" Braille_Text_WXYZ:: .braille "WXYZ$" Braille_Text_Period:: .braille ".$" Braille_Text_Comma:: .braille ",$" Braille_Text_Everything:: .braille "EVERYTHING$" Braille_Text_HasMeaning1:: .braille "HAS MEANING$" Braille_Text_Existence:: .braille "EXISTENCE$" Braille_Text_HasMeaning2:: .braille "HAS MEANING$" Braille_Text_BeingAlive:: .braille "BEING ALIVE$" Braille_Text_HasMeaning3:: .braille "HAS MEANING$" Braille_Text_HaveDreams:: .braille "HAVE DREAMS$" Braille_Text_UsePower:: .braille "USE POWER.$" Braille_Text_LetTheTwo:: .braille "LET THE TWO$" Braille_Text_Glittering:: .braille "GLITTERING$" Braille_Text_Stones:: .braille "STONES$" Braille_Text_OneInRed:: .braille "ONE IN RED$" Braille_Text_OneInBlue:: .braille "ONE IN BLUE$" Braille_Text_ConnectThe:: .braille "CONNECT THE$" Braille_Text_Past:: .braille "PAST.$" Braille_Text_TwoFriends:: .braille "TWO FRIENDS$" Braille_Text_Sharing:: .braille "SHARING$" Braille_Text_PowerOpen:: .braille "POWER OPEN$" Braille_Text_AWindowTo:: .braille "A WINDOW TO$" Braille_Text_ANewWorld:: .braille "A NEW WORLD$" Braille_Text_ThatGlows:: .braille "THAT GLOWS.$" Braille_Text_TheNext:: .braille "THE NEXT$" Braille_Text_WorldWaits:: .braille "WORLD WAITS$" Braille_Text_ForYou:: .braille "FOR YOU.$" ================================================ FILE: data/text/day_care.inc ================================================ @ Same as Hoenn's day-care text, used by the Four Island Day-Care. Unused text translated in Emerald DayCare_Text_ImDaycareManSpeakToMyWife:: .string "I'm the DAY-CARE MAN.\p" .string "I help take care of the precious\n" .string "POKéMON of TRAINERS.\p" .string "If you'd like me to raise your\n" .string "POKéMON, have a word with my wife.$" DayCare_Text_DoYouWantEgg:: .string "Ah, it's you!\p" .string "We were raising your POKéMON, and\n" .string "my goodness, were we surprised!\p" .string "Your POKéMON had an EGG!\p" .string "We don't know how it got there,\n" .string "but your POKéMON had it.\p" .string "You do want it, yes?$" DayCare_Text_YourMonIsDoingFine:: .string "Ah, it's you! Good to see you.\n" .string "Your {STR_VAR_1}'s doing fine.$" DayCare_Text_IllKeepIt:: .string "Well then, I'll keep it.\n" .string "Thanks!$" DayCare_Text_YouHaveNoRoomForIt:: .string "You have no room for it…\n" .string "Come back when you've made room.$" DayCare_Text_ReceivedEgg:: .string "{PLAYER} received the EGG from\n" .string "the DAY-CARE MAN.$" DayCare_Text_TakeGoodCareOfIt:: .string "Take good care of it.$" DayCare_Text_YourMonsAreDoingFine:: .string "Ah, it's you! Your {STR_VAR_1} and\n" .string "{STR_VAR_2} are doing fine.$" DayCare_Text_IWillKeepDoYouWantIt:: .string "I really will keep it.\n" .string "You do want this, yes?$" DayCare_Text_WouldYouLikeUsToRaiseMon:: .string "I'm the DAY-CARE LADY.\p" .string "We can raise POKéMON for you.\p" .string "Would you like us to raise one?$" DayCare_Text_WhichMonShouldWeRaise:: .string "Which POKéMON should we raise for\n" .string "you?$" DayCare_Text_WellRaiseYourMon:: .string "Fine, we'll raise your {STR_VAR_1}\n" .string "for a while.\p" .string "Come back for it later.$" DayCare_Text_WeCanRaiseOneMore:: .string "We can raise two of your POKéMON.\p" .string "Would you like us to raise one\n" .string "more POKéMON for you?$" DayCare_Text_HusbandWasLookingForYou:: .string "My husband was looking for you.$" DayCare_Text_FineThenComeAgain:: .string "Oh, fine, then.\n" .string "Come again.$" DayCare_Text_NotEnoughMoney:: .string "You don't have enough money…$" DayCare_Text_TakeOtherOneBackToo:: .string "Will you take back the other one,\n" .string "too?$" DayCare_Text_ComeAgain:: .string "Fine.\n" .string "Come again.$" DayCare_Text_GoodToSeeYou:: .string "Ah, it's you!\n" .string "Good to see you.\p" .string "Your POKéMON can only be doing\n" .string "good!$" DayCare_Text_YourMonHasGrownXLevels:: .string "By level, your {STR_VAR_1} has\n" .string "grown by {STR_VAR_2}.$" DayCare_Text_YourPartyIsFull:: .string "Your POKéMON party is full.\n" .string "Make room, then come see me.$" DayCare_Text_ItWillCostX:: .string "If you want your {STR_VAR_1} back,\n" .string "it will cost ¥{STR_VAR_2}.$" DayCare_Text_HeresYourMon:: .string "Perfect!\n" .string "Here's your POKéMON.$" DayCare_Text_TookBackMon:: .string "{PLAYER} took back {STR_VAR_2} from\n" .string "the DAY-CARE LADY.$" DayCare_Text_YouHaveJustOneMon:: .string "Oh? But you have just one\n" .string "POKéMON.\p" .string "Come back another time.$" DayCare_Text_TakeYourMonBack:: .string "Will you take your POKéMON back?$" DayCare_Text_WhatWillYouBattleWith:: .string "If you leave me that POKéMON,\n" .string "what will you battle with?\p" .string "Come back another time.$" DayCare_Text_Huh:: .string "Huh?$" ================================================ FILE: data/text/fame_checker.inc ================================================ gFameCheckerFlavorText_ProfOak0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}OAK POKéMON RESEARCH LAB$" gFameCheckerFlavorText_ProfOak1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}To make a complete guide on all\n" .string "the POKéMON in the world…\p" .string "That was my dream!$" gFameCheckerFlavorText_ProfOak2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PROF. OAK may not look like much,\n" .string "but he's the authority on POKéMON.\p" .string "Many POKéMON TRAINERS hold him in\n" .string "high regard.$" gFameCheckerFlavorText_ProfOak3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PROF. OAK reportedly lives with his\n" .string "grandchildren, DAISY and {RIVAL}.$" gFameCheckerFlavorText_ProfOak4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I hear OAK's taken a lot of\n" .string "interest in you, child.\p" .string "That old duff was once tough and\n" .string "handsome.\p" .string "But that was decades ago.\n" .string "He's a shadow of his former self.$" gFameCheckerFlavorText_ProfOak5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PROF. OAK is going to have his own\n" .string "radio show soon.\p" .string "The program will be called PROF.\n" .string "OAK'S POKéMON SEMINAR.$" gFameCheckerFlavorText_Daisy0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}If you show DAISY your POKéMON,\n" .string "she can tell how much it likes you.\p" .string "Occasionally, she will even groom\n" .string "a POKéMON for you.$" gFameCheckerFlavorText_Daisy1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}But the person who is most liked by\n" .string "POKéMON is DAISY, I think.$" gFameCheckerFlavorText_Daisy2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}She was gently grooming POKéMON…\n" .string "She was a little angel.\p" .string "That little girl's name…\n" .string "I think it was DAISY.$" gFameCheckerFlavorText_Daisy3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PROF. OAK reportedly lives with his\n" .string "grandchildren, DAISY and {RIVAL}.$" gFameCheckerFlavorText_Daisy4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}A girl from PALLET TOWN, DAISY,\n" .string "she enjoys TEA every day.\p" .string "She visits the CELADON DEPT. STORE\n" .string "to buy some TEA.$" gFameCheckerFlavorText_Daisy5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The Spring POKéMON CONTEST's\n" .string "Grand Champion is DAISY OAK of\l" .string "PALLET TOWN!$" gFameCheckerFlavorText_Brock0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PEWTER CITY POKéMON GYM\n" .string "LEADER: BROCK\l" .string "The Rock-Solid POKéMON TRAINER!$" gFameCheckerFlavorText_Brock1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My rock-hard willpower is evident\n" .string "in even my POKéMON.\p" .string "My POKéMON are all rock hard and\n" .string "have true-grit determination.\p" .string "That's right - my POKéMON are all\n" .string "the ROCK type!$" gFameCheckerFlavorText_Brock2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}There aren't many serious POKéMON\n" .string "TRAINERS here.\p" .string "They're all like BUG CATCHERS,\n" .string "you know, just hobbyists.\p" .string "But PEWTER GYM's BROCK isn't like\n" .string "that, not one bit.$" gFameCheckerFlavorText_Brock3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BROCK is cool. He's not just tough.\n" .string "People like and respect him.\p" .string "I want to become a GYM LEADER\n" .string "like him.$" gFameCheckerFlavorText_Brock4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Hi, I'm excavating for fossils here\n" .string "under MT. MOON.\p" .string "Sometimes, BROCK of PEWTER GYM\n" .string "lends me a hand.$" gFameCheckerFlavorText_Brock5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BROCK rarely laughs, but is said to\n" .string "be unable to stop if he starts.$" gFameCheckerFlavorText_Misty0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}CERULEAN CITY POKéMON GYM\n" .string "LEADER: MISTY\l" .string "The Tomboyish Mermaid!$" gFameCheckerFlavorText_Misty1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My policy is an all-out offensive\n" .string "with WATER-type POKéMON!$" gFameCheckerFlavorText_Misty2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}MISTY is a TRAINER who's going to\n" .string "keep improving.\p" .string "She won't lose to someone like you!$" gFameCheckerFlavorText_Misty3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Strong TRAINERS and WATER POKéMON\n" .string "are common sights in these parts.\p" .string "They say that MISTY of the\n" .string "CERULEAN GYM trains here.$" gFameCheckerFlavorText_Misty4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}This cape is a famous date spot.\p" .string "MISTY, the GYM LEADER, has high\n" .string "hopes about this place.$" gFameCheckerFlavorText_Misty5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}MISTY is said to worship LORELEI\n" .string "of the ELITE FOUR.$" gFameCheckerFlavorText_LtSurge0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}VERMILION CITY POKéMON GYM\n" .string "LEADER: LT. SURGE\l" .string "The Lightning American!$" gFameCheckerFlavorText_LtSurge1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I tell you, kid, electric POKéMON\n" .string "saved me during the war!$" gFameCheckerFlavorText_LtSurge2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}When I was in the Army, LT. SURGE\n" .string "was my strict CO.\p" .string "He was a hard taskmaster.$" gFameCheckerFlavorText_LtSurge3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}LT. SURGE was always famous for\n" .string "his cautious nature in the Army.$" gFameCheckerFlavorText_LtSurge4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}LT. SURGE installed the traps in\n" .string "the GYM himself.\p" .string "He set up double locks everywhere.$" gFameCheckerFlavorText_LtSurge5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}LT. SURGE is rumored to have been\n" .string "a pilot while home in America.\p" .string "He used the electricity generated\n" .string "by POKéMON to power his plane.$" gFameCheckerFlavorText_Erika0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}CELADON CITY POKéMON GYM\n" .string "LEADER: ERIKA\l" .string "The Nature-Loving Princess!$" gFameCheckerFlavorText_Erika1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am a student of the art of\n" .string "flower arranging.\p" .string "My POKéMON are solely of the\n" .string "GRASS type.$" gFameCheckerFlavorText_Erika2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Our LEADER ERIKA might be quiet,\n" .string "but she's famous around here.$" gFameCheckerFlavorText_Erika3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}We only use GRASS-type POKéMON at\n" .string "our GYM.\p" .string "Why? We also use them for making\n" .string "flower arrangements!$" gFameCheckerFlavorText_Erika4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I would never collect POKéMON if\n" .string "they were unattractive.$" gFameCheckerFlavorText_Erika5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Rumor has it that if you peek into\n" .string "CELADON GYM, you can often\l" .string "see ERIKA snoozing.$" gFameCheckerFlavorText_Koga0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}FUCHSIA CITY POKéMON GYM\n" .string "LEADER: KOGA\l" .string "The Poisonous Ninja Master$" gFameCheckerFlavorText_Koga1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Despair to the creeping horror of\n" .string "POISON-type POKéMON!$" gFameCheckerFlavorText_Koga2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Even though I've lost, I will keep\n" .string "training according to the teachings\l" .string "of KOGA, my ninja master.$" gFameCheckerFlavorText_Koga3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My father is the GYM LEADER of\n" .string "this town.\p" .string "I'm training to use POISON POKéMON\n" .string "as well as my father.$" gFameCheckerFlavorText_Koga4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}KOGA is said to have a thorough\n" .string "knowledge of medicine.\p" .string "He even concocts medicine to nurse\n" .string "his POKéMON to health.$" gFameCheckerFlavorText_Koga5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The SAFARI ZONE's huge, wouldn't\n" .string "you say?\p" .string "FUCHSIA's GYM LEADER, KOGA, \n" .string "patrols the grounds every so often.\p" .string "Thanks to him, we can play here\n" .string "knowing that we're safe.$" gFameCheckerFlavorText_Sabrina0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}SAFFRON CITY POKéMON GYM\n" .string "LEADER: SABRINA\l" .string "The Master of PSYCHIC POKéMON!$" gFameCheckerFlavorText_Sabrina1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}You know about a girl GYM LEADER\n" .string "in SAFFRON CITY?\p" .string "She uses PSYCHIC-type POKéMON,\n" .string "right?$" gFameCheckerFlavorText_Sabrina2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I have had psychic powers since\n" .string "I was a child.\p" .string "It started when a spoon I\n" .string "carelessly tossed, bent.$" gFameCheckerFlavorText_Sabrina3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I dislike battling, but if you wish,\n" .string "I will show you my powers!$" gFameCheckerFlavorText_Sabrina4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}People say that SABRINA can\n" .string "communicate with her POKéMON\l" .string "during battle without speaking.$" gFameCheckerFlavorText_Sabrina5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}SABRINA just wiped out the KARATE\n" .string "MASTER next door.$" gFameCheckerFlavorText_Blaine0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}CINNABAR ISLAND POKéMON GYM\n" .string "LEADER: BLAINE\l" .string "The Hotheaded Quiz Master!$" gFameCheckerFlavorText_Blaine1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My fiery POKéMON are all rough\n" .string "and ready with intense heat!\p" .string "They incinerate all challengers!$" gFameCheckerFlavorText_Blaine2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Our LEADER, BLAINE, became lost\n" .string "in the mountains but good.\p" .string "Night fell when a fiery bird\n" .string "POKéMON appeared.\p" .string "Its light allowed BLAINE to find\n" .string "his way down safely.$" gFameCheckerFlavorText_Blaine3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}CINNABAR GYM's BLAINE is quite the\n" .string "odd fellow.\p" .string "He's lived on the island since way\n" .string "before the LAB was built.$" gFameCheckerFlavorText_Blaine4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}It's a photo of BLAINE and\n" .string "MR. FUJI.\p" .string "They're standing shoulder to\n" .string "shoulder with big grins.$" gFameCheckerFlavorText_Blaine5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BLAINE is said to remove his dark\n" .string "shades only when he is thinking up\l" .string "new quiz questions.$" gFameCheckerFlavorText_Lorelei0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am LORELEI of the ELITE FOUR.$" gFameCheckerFlavorText_Lorelei1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}No one can best me when it comes\n" .string "to icy POKéMON.$" gFameCheckerFlavorText_Lorelei2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Where was this person born?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}We've had a great and powerful\n" .string "TRAINER grow up on this island.\p" .string "I bet even you'd know her.\n" .string "It's LORELEI of the ELITE FOUR!$" gFameCheckerFlavorText_Lorelei3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Known for her logical, calculated,\n" .string "and cool battling style, LORELEI\l" .string "has a surprising secret!$" gFameCheckerFlavorText_Lorelei4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Did you know that LORELEI has lots\n" .string "and lots of stuffed dolls?\p" .string "Every time she comes back to\n" .string "FOUR ISLAND, her collection grows!$" gFameCheckerFlavorText_Lorelei5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The LAPRAS she has, I imagine it\n" .string "to be the one she met as a child.\p" .string "I believe it was in ICEFALL CAVE\n" .string "that she caught it.\p" .string "Perhaps that POKéMON has been with\n" .string "her ever since.$" gFameCheckerFlavorText_Bruno0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am BRUNO of the ELITE FOUR!$" gFameCheckerFlavorText_Bruno1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I've lived and trained with my\n" .string "fighting POKéMON!$" gFameCheckerFlavorText_Bruno2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BRUNO apparently joined the ELITE\n" .string "FOUR out of his burning ambition to\l" .string "battle the best TRAINERS.$" gFameCheckerFlavorText_Bruno3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BRUNO, who's a senior ahead of me,\n" .string "visits the SPA on occasion.\p" .string "He comes to rehab injuries, both\n" .string "his own and his POKéMON's.$" gFameCheckerFlavorText_Bruno4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}He's one of the ELITE FOUR.\n" .string "His name is BRUNO.\p" .string "He went away disappointed when he\n" .string "found out that they were all sold\l" .string "out of Rage Candybars.$" gFameCheckerFlavorText_Bruno5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Even BRUNO…\n" .string "He trained with a fellow by the\l" .string "name of BRAWLY before.$" gFameCheckerFlavorText_Agatha0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am AGATHA of the ELITE FOUR.$" gFameCheckerFlavorText_Agatha1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}AGATHA's GHOST-type POKéMON are\n" .string "horrifically terrifying in toughness.$" gFameCheckerFlavorText_Agatha2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}That old lady's also got a really\n" .string "short fuse, too.\p" .string "It doesn't take anything to get\n" .string "that scary lady hollering.$" gFameCheckerFlavorText_Agatha3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}In her youth, AGATHA and PROF.\n" .string "OAK were rivals who vied for\l" .string "supremacy as TRAINERS.$" gFameCheckerFlavorText_Agatha4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I hear OAK's taken a lot of\n" .string "interest in you, child.\p" .string "That old duff was once tough and\n" .string "handsome.\p" .string "But that was decades ago.\n" .string "He's a shadow of his former self.$" gFameCheckerFlavorText_Agatha5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Take AGATHA, for example.\p" .string "She set a record for being the\n" .string "oldest-ever ELITE FOUR member.$" gFameCheckerFlavorText_Lance0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I lead the ELITE FOUR.\p" .string "You can call me LANCE the dragon\n" .string "TRAINER.$" gFameCheckerFlavorText_Lance1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}You know that dragons are\n" .string "mythical POKéMON.\p" .string "They're hard to catch and raise,\n" .string "but their powers are superior.\p" .string "They're virtually indestructible.\n" .string "There's no being clever with them.$" gFameCheckerFlavorText_Lance2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}He stands for justice!\n" .string "He's cool, and yet passionate!\l" .string "He's the greatest, LANCE!$" gFameCheckerFlavorText_Lance3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}We have a customer, LANCE, who\n" .string "occasionally comes.\p" .string "He always buys capes.\p" .string "I wonder… Does he have many\n" .string "identical capes at home?$" gFameCheckerFlavorText_Lance4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}LANCE's grandfather is thought to\n" .string "be the elder of a famous clan of\l" .string "dragon masters.$" gFameCheckerFlavorText_Lance5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}From what I've heard, LANCE has\n" .string "a cousin who's a GYM LEADER\l" .string "somewhere far away.$" gFameCheckerFlavorText_Bill0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}After all, BILL's world-famous as a\n" .string "POKéMANIAC.\p" .string "He invented the POKéMON Storage\n" .string "System on PC, too.$" gFameCheckerFlavorText_Bill1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BILL has lots of POKéMON!\n" .string "He collects rare ones, too!$" gFameCheckerFlavorText_Bill2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}He's my grandson!\p" .string "He always liked collecting things,\n" .string "even as a child!$" gFameCheckerFlavorText_Bill3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BILL is a POKéMANIAC, so he loves\n" .string "every kind.\p" .string "Apparently, the first one he caught\n" .string "was an ABRA.$" gFameCheckerFlavorText_Bill4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BILL's hometown is GOLDENROD CITY,\n" .string "where his folks still live.\p" .string "I've heard that it's quite the\n" .string "festive, bustling city.$" gFameCheckerFlavorText_Bill5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Apparently, BILL simply can't\n" .string "stomach milk at all.$" gFameCheckerFlavorText_MrFuji0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}He's really kind.\p" .string "He looks after abandoned and\n" .string "orphaned POKéMON.$" gFameCheckerFlavorText_MrFuji1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}This old guy marched right up to\n" .string "our HIDEOUT.\p" .string "Then, he starts ranting about how\n" .string "TEAM ROCKET's abusing POKéMON.\p" .string "So, we're just talking it over as\n" .string "adults.$" gFameCheckerFlavorText_MrFuji2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}POKéMON FAN MAGAZINE\n" .string "Monthly Grand Prize Drawing!\p" .string "The application form is…\p" .string "Gone! It's been clipped out.\n" .string "Someone must have applied already.$" gFameCheckerFlavorText_MrFuji3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I hear that MR. FUJI's not from\n" .string "these parts originally, either.$" gFameCheckerFlavorText_MrFuji4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}It's a photo of BLAINE and\n" .string "MR. FUJI.\p" .string "They're standing shoulder to\n" .string "shoulder with big grins.$" gFameCheckerFlavorText_MrFuji5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Editor: The shy MR. FUJI turned\n" .string "down our interview requests.\p" .string "He is a kindly man who is adored\n" .string "and respected in LAVENDER TOWN.$" gFameCheckerFlavorText_Giovanni0:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}TEAM ROCKET captures POKéMON from\n" .string "around the world.\p" .string "They're important tools for keeping\n" .string "our criminal enterprise going.\p" .string "I am the leader, GIOVANNI!$" gFameCheckerFlavorText_Giovanni1:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Those thugs that took over our\n" .string "building…\p" .string "Their BOSS said he was looking for\n" .string "strong POKéMON.$" gFameCheckerFlavorText_Giovanni2:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}TEAM ROCKET's BOSS is terribly\n" .string "cruel!\p" .string "To him, POKéMON are just tools to\n" .string "be used.$" gFameCheckerFlavorText_Giovanni3:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Welcome to my hideout!\p" .string "It shall be so until I can restore\n" .string "TEAM ROCKET to its former glory.$" gFameCheckerFlavorText_Giovanni4:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Blow me away! GIOVANNI was the\n" .string "GYM LEADER of VIRIDIAN?$" gFameCheckerFlavorText_Giovanni5:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}You… You're not GIOVANNI's kid,\n" .string "are you?\p" .string "No, that can't be right.\n" .string "GIOVANNI's kid has red hair.$" gFameCheckerPersonName_ProfOak:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}PROF. OAK$" gFameCheckerPersonQuote_ProfOak:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: PROF. OAK\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Why do POKéMON compete and battle\n" .string "so hard for you?\p" .string "They do so because they can see\n" .string "the love and trust you have\l" .string "towards POKéMON.\p" .string "Never forget that.$" gFameCheckerPersonName_Daisy:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}DAISY$" gFameCheckerPersonQuote_Daisy:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: DAISY\n" .string "To: {PLAYER}\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}While I was comfortably enjoying\n" .string "my tea breaks, you've grown very\l" .string "skilled and powerful.\p" .string "I hope you'll remain a good rival\n" .string "to my little brother.$" gFameCheckerPersonName_Brock:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}BROCK$" gFameCheckerPersonQuote_Brock:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: BROCK\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}In this big world of ours, there\n" .string "must be many tough TRAINERS.\p" .string "Let's both keep training and\n" .string "making ourselves stronger!$" gFameCheckerPersonName_Misty:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}MISTY$" gFameCheckerPersonQuote_Misty:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: MISTY\n" .string "To: {PLAYER}\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I'm going to keep training here at\n" .string "this GYM.\p" .string "When I get better, I'd love to hit\n" .string "the road and travel.$" gFameCheckerPersonName_LtSurge:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}LT. SURGE$" gFameCheckerPersonQuote_LtSurge:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: LT. SURGE\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Hey, kid!\n" .string "You electrified me in our battle!\p" .string "I didn't know that there were\n" .string "gutsy TRAINERS like you.\p" .string "It made me change my mind about\n" .string "you!$" gFameCheckerPersonName_Erika:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}ERIKA$" gFameCheckerPersonQuote_Erika:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: ERIKA\n" .string "To: {PLAYER}\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am so glad that there are strong\n" .string "TRAINERS like you.\p" .string "That awareness alone inspires and\n" .string "motivates me to try harder.\p" .string "Please visit me again.\n" .string "Zzz…$" gFameCheckerPersonName_Koga:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}KOGA$" gFameCheckerPersonQuote_Koga:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: KOGA\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}You and I, we must both set our\n" .string "sights higher and work towards\l" .string "meeting our challenges.\p" .string "Now, I must go train my daughter.$" gFameCheckerPersonName_Sabrina:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}SABRINA$" gFameCheckerPersonQuote_Sabrina:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: SABRINA\n" .string "To: {PLAYER}\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The love you have towards your\n" .string "POKéMON…\p" .string "It was a power that was never\n" .string "bested by my psychic power.$" gFameCheckerPersonName_Blaine:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}BLAINE$" gFameCheckerPersonQuote_Blaine:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: BLAINE\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My fire POKéMON!\n" .string "They'll become even more powerful!\p" .string "And now, a quiz. How many kinds of\n" .string "FIRE-type POKéMON are there?$" gFameCheckerPersonName_Lorelei:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}LORELEI$" gFameCheckerPersonQuote_Lorelei:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: LORELEI\n" .string "To: {PLAYER}\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I needed to thank you for your\n" .string "help.\p" .string "But that has nothing to do with our\n" .string "battles.\p" .string "You'd better watch out next time!$" gFameCheckerPersonName_Bruno:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}BRUNO$" gFameCheckerPersonQuote_Bruno:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: BRUNO\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The super power of your POKéMON\n" .string "and you I've experienced myself.\p" .string "Next time, maybe I should show you\n" .string "how to train yourself.$" gFameCheckerPersonName_Agatha:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}AGATHA$" gFameCheckerPersonQuote_Agatha:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: AGATHA\n" .string "To: {PLAYER}\p" .string "{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}When you grow older, don't you\n" .string "dare go soft like that coot OAK!\p" .string "Be like me and keep battling on!$" gFameCheckerPersonName_Lance:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}LANCE$" gFameCheckerPersonQuote_Lance:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: LANCE\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I'm considering going back to my\n" .string "hometown.\p" .string "I want to retrain my DRAGON-type\n" .string "POKéMON and strengthen them.\p" .string "I'd like to invite you to my\n" .string "hometown one day.$" gFameCheckerPersonName_Bill:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}BILL$" gFameCheckerPersonQuote_Bill:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: BILL\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Hey, there! CELIO had nothing but\n" .string "praise for you.\p" .string "Hearing that makes me happy.\p" .string "When you catch some rare POKéMON,\n" .string "come show me, okay? Promise!$" gFameCheckerPersonName_MrFuji:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}MR. FUJI$" gFameCheckerPersonQuote_MrFuji:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: MR. FUJI\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Instead of hoping for the happiness\n" .string "of just your POKéMON…\p" .string "…Can I get you to wish for the\n" .string "happiness of all POKéMON?$" gFameCheckerPersonName_Giovanni:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}GIOVANNI$" gFameCheckerPersonQuote_Giovanni:: .string "{COLOR BLUE}{SHADOW LIGHT_BLUE}From: GIOVANNI\n" .string "To: {PLAYER}\p" .string "{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}There is nothing that I wish to say\n" .string "to you.\p" .string "I will concentrate solely on\n" .string "bettering myself, and none other.$" gFameCheckerFlavorTextOriginLocation_ProfOak0:: .string "PALLET TOWN$" gFameCheckerFlavorTextOriginLocation_ProfOak1:: .string "RESEARCH LAB$" gFameCheckerFlavorTextOriginLocation_ProfOak2:: .string "RESEARCH LAB$" gFameCheckerFlavorTextOriginLocation_ProfOak3:: .string "VIRIDIAN CITY$" gFameCheckerFlavorTextOriginLocation_ProfOak4:: .string "POKéMON LEAGUE$" gFameCheckerFlavorTextOriginLocation_ProfOak5:: .string "RESEARCH LAB$" gFameCheckerFlavorTextOriginLocation_Daisy0:: .string "RESEARCH LAB$" gFameCheckerFlavorTextOriginLocation_Daisy1:: .string "VERMILION CITY$" gFameCheckerFlavorTextOriginLocation_Daisy2:: .string "WATER LABYRINTH$" gFameCheckerFlavorTextOriginLocation_Daisy3:: .string "VIRIDIAN CITY$" gFameCheckerFlavorTextOriginLocation_Daisy4:: .string "CELADON MANSION$" gFameCheckerFlavorTextOriginLocation_Daisy5:: .string "FOUR ISLAND$" gFameCheckerFlavorTextOriginLocation_Brock0:: .string "PEWTER CITY$" gFameCheckerFlavorTextOriginLocation_Brock1:: .string "PEWTER GYM$" gFameCheckerFlavorTextOriginLocation_Brock2:: .string "PEWTER CITY$" gFameCheckerFlavorTextOriginLocation_Brock3:: .string "ROUTE 4$" gFameCheckerFlavorTextOriginLocation_Brock4:: .string "MT. MOON$" gFameCheckerFlavorTextOriginLocation_Brock5:: .string "PEWTER MUSEUM$" gFameCheckerFlavorTextOriginLocation_Misty0:: .string "CERULEAN CITY$" gFameCheckerFlavorTextOriginLocation_Misty1:: .string "CERULEAN GYM$" gFameCheckerFlavorTextOriginLocation_Misty2:: .string "CERULEAN GYM$" gFameCheckerFlavorTextOriginLocation_Misty3:: .string "SEAFOAM ISLANDS$" gFameCheckerFlavorTextOriginLocation_Misty4:: .string "CERULEAN CAPE$" gFameCheckerFlavorTextOriginLocation_Misty5:: .string "CERULEAN CITY$" gFameCheckerFlavorTextOriginLocation_LtSurge0:: .string "VERMILION CITY$" gFameCheckerFlavorTextOriginLocation_LtSurge1:: .string "VERMILION GYM$" gFameCheckerFlavorTextOriginLocation_LtSurge2:: .string "VERMILION GYM$" gFameCheckerFlavorTextOriginLocation_LtSurge3:: .string "VERMILION GYM$" gFameCheckerFlavorTextOriginLocation_LtSurge4:: .string "VERMILION GYM$" gFameCheckerFlavorTextOriginLocation_LtSurge5:: .string "VERMILION CITY$" gFameCheckerFlavorTextOriginLocation_Erika0:: .string "CELADON CITY$" gFameCheckerFlavorTextOriginLocation_Erika1:: .string "CELADON GYM$" gFameCheckerFlavorTextOriginLocation_Erika2:: .string "CELADON GYM$" gFameCheckerFlavorTextOriginLocation_Erika3:: .string "CELADON GYM$" gFameCheckerFlavorTextOriginLocation_Erika4:: .string "CELADON GYM$" gFameCheckerFlavorTextOriginLocation_Erika5:: .string "CELADON MANSION$" gFameCheckerFlavorTextOriginLocation_Koga0:: .string "FUCHSIA CITY$" gFameCheckerFlavorTextOriginLocation_Koga1:: .string "FUCHSIA GYM$" gFameCheckerFlavorTextOriginLocation_Koga2:: .string "FUCHSIA GYM$" gFameCheckerFlavorTextOriginLocation_Koga3:: .string "FUCHSIA CITY$" gFameCheckerFlavorTextOriginLocation_Koga4:: .string "FUCHSIA CITY$" gFameCheckerFlavorTextOriginLocation_Koga5:: .string "SAFARI ZONE$" gFameCheckerFlavorTextOriginLocation_Sabrina0:: .string "SAFFRON CITY$" gFameCheckerFlavorTextOriginLocation_Sabrina1:: .string "THREE ISLAND$" gFameCheckerFlavorTextOriginLocation_Sabrina2:: .string "SAFFRON GYM$" gFameCheckerFlavorTextOriginLocation_Sabrina3:: .string "SAFFRON GYM$" gFameCheckerFlavorTextOriginLocation_Sabrina4:: .string "SAFFRON CITY$" gFameCheckerFlavorTextOriginLocation_Sabrina5:: .string "SAFFRON GYM$" gFameCheckerFlavorTextOriginLocation_Blaine0:: .string "CINNABAR ISLAND$" gFameCheckerFlavorTextOriginLocation_Blaine1:: .string "CINNABAR GYM$" gFameCheckerFlavorTextOriginLocation_Blaine2:: .string "CINNABAR GYM$" gFameCheckerFlavorTextOriginLocation_Blaine3:: .string "CINNABAR ISLAND$" gFameCheckerFlavorTextOriginLocation_Blaine4:: .string "CINNABAR GYM$" gFameCheckerFlavorTextOriginLocation_Blaine5:: .string "RESORT GORGEOUS$" gFameCheckerFlavorTextOriginLocation_Lorelei0:: .string "POKéMON LEAGUE$" gFameCheckerFlavorTextOriginLocation_Lorelei1:: .string "POKéMON LEAGUE$" gFameCheckerFlavorTextOriginLocation_Lorelei2:: .string "FOUR ISLAND$" gFameCheckerFlavorTextOriginLocation_Lorelei3:: .string "FIVE ISLAND$" gFameCheckerFlavorTextOriginLocation_Lorelei4:: .string "FOUR ISLAND$" gFameCheckerFlavorTextOriginLocation_Lorelei5:: .string "FOUR ISLAND$" gFameCheckerFlavorTextOriginLocation_Bruno0:: .string "POKéMON LEAGUE$" gFameCheckerFlavorTextOriginLocation_Bruno1:: .string "POKéMON LEAGUE$" gFameCheckerFlavorTextOriginLocation_Bruno2:: .string "SAFFRON CITY$" gFameCheckerFlavorTextOriginLocation_Bruno3:: .string "EMBER SPA$" gFameCheckerFlavorTextOriginLocation_Bruno4:: .string "TWO ISLAND$" gFameCheckerFlavorTextOriginLocation_Bruno5:: .string "SEVAULT CANYON$" gFameCheckerFlavorTextOriginLocation_Agatha0:: .string "POKéMON LEAGUE$" gFameCheckerFlavorTextOriginLocation_Agatha1:: .string "INDIGO PLATEAU$" gFameCheckerFlavorTextOriginLocation_Agatha2:: .string "INDIGO PLATEAU$" gFameCheckerFlavorTextOriginLocation_Agatha3:: .string "SEVEN ISLAND$" gFameCheckerFlavorTextOriginLocation_Agatha4:: .string "POKéMON LEAGUE$" gFameCheckerFlavorTextOriginLocation_Agatha5:: .string "SIX ISLAND$" gFameCheckerFlavorTextOriginLocation_Lance0:: .string "POKéMON LEAGUE$" gFameCheckerFlavorTextOriginLocation_Lance1:: .string "POKéMON LEAGUE$" gFameCheckerFlavorTextOriginLocation_Lance2:: .string "SAFFRON CITY$" gFameCheckerFlavorTextOriginLocation_Lance3:: .string "CELADON DEPT.$" gFameCheckerFlavorTextOriginLocation_Lance4:: .string "INDIGO PLATEAU$" gFameCheckerFlavorTextOriginLocation_Lance5:: .string "INDIGO PLATEAU$" gFameCheckerFlavorTextOriginLocation_Bill0:: .string "CERULEAN CITY$" gFameCheckerFlavorTextOriginLocation_Bill1:: .string "CERULEAN CITY$" gFameCheckerFlavorTextOriginLocation_Bill2:: .string "FUCHSIA CITY$" gFameCheckerFlavorTextOriginLocation_Bill3:: .string "ONE ISLAND$" gFameCheckerFlavorTextOriginLocation_Bill4:: .string "ONE ISLAND$" gFameCheckerFlavorTextOriginLocation_Bill5:: .string "ONE ISLAND$" gFameCheckerFlavorTextOriginLocation_MrFuji0:: .string "LAVENDER TOWN$" gFameCheckerFlavorTextOriginLocation_MrFuji1:: .string "POKéMON TOWER$" gFameCheckerFlavorTextOriginLocation_MrFuji2:: .string "LAVENDER TOWN$" gFameCheckerFlavorTextOriginLocation_MrFuji3:: .string "LAVENDER TOWN$" gFameCheckerFlavorTextOriginLocation_MrFuji4:: .string "CINNABAR GYM$" gFameCheckerFlavorTextOriginLocation_MrFuji5:: .string "CINNABAR ISLAND$" gFameCheckerFlavorTextOriginLocation_Giovanni0:: .string "ROCKET HIDEOUT$" gFameCheckerFlavorTextOriginLocation_Giovanni1:: .string "SILPH CO.$" gFameCheckerFlavorTextOriginLocation_Giovanni2:: .string "SILPH CO.$" gFameCheckerFlavorTextOriginLocation_Giovanni3:: .string "VIRIDIAN GYM$" gFameCheckerFlavorTextOriginLocation_Giovanni4:: .string "VIRIDIAN GYM$" gFameCheckerFlavorTextOriginLocation_Giovanni5:: .string "ROCKET WAREHOUSE$" gFameCheckerFlavorTextOriginObjectName_ProfOak0:: .string "SIGN$" gFameCheckerFlavorTextOriginObjectName_ProfOak1:: .string "PROF. OAK$" gFameCheckerFlavorTextOriginObjectName_ProfOak2:: .string "AIDE$" gFameCheckerFlavorTextOriginObjectName_ProfOak3:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_ProfOak4:: .string "AGATHA$" gFameCheckerFlavorTextOriginObjectName_ProfOak5:: .string "AIDE$" gFameCheckerFlavorTextOriginObjectName_Daisy0:: .string "AIDE$" gFameCheckerFlavorTextOriginObjectName_Daisy1:: .string "WOMAN$" gFameCheckerFlavorTextOriginObjectName_Daisy2:: .string "MAN$" gFameCheckerFlavorTextOriginObjectName_Daisy3:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Daisy4:: .string "OLD LADY$" gFameCheckerFlavorTextOriginObjectName_Daisy5:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Brock0:: .string "SIGN$" gFameCheckerFlavorTextOriginObjectName_Brock1:: .string "BROCK$" gFameCheckerFlavorTextOriginObjectName_Brock2:: .string "YOUNG MAN$" gFameCheckerFlavorTextOriginObjectName_Brock3:: .string "BOY$" gFameCheckerFlavorTextOriginObjectName_Brock4:: .string "MAN$" gFameCheckerFlavorTextOriginObjectName_Brock5:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Misty0:: .string "SIGN$" gFameCheckerFlavorTextOriginObjectName_Misty1:: .string "MISTY$" gFameCheckerFlavorTextOriginObjectName_Misty2:: .string "LUIS$" gFameCheckerFlavorTextOriginObjectName_Misty3:: .string "YOUNG MAN$" gFameCheckerFlavorTextOriginObjectName_Misty4:: .string "DAME$" gFameCheckerFlavorTextOriginObjectName_Misty5:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_LtSurge0:: .string "SIGN$" gFameCheckerFlavorTextOriginObjectName_LtSurge1:: .string "LT. SURGE$" gFameCheckerFlavorTextOriginObjectName_LtSurge2:: .string "TUCKER$" gFameCheckerFlavorTextOriginObjectName_LtSurge3:: .string "TUCKER$" gFameCheckerFlavorTextOriginObjectName_LtSurge4:: .string "DWAYNE$" gFameCheckerFlavorTextOriginObjectName_LtSurge5:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Erika0:: .string "SIGN$" gFameCheckerFlavorTextOriginObjectName_Erika1:: .string "ERIKA$" gFameCheckerFlavorTextOriginObjectName_Erika2:: .string "LOLA$" gFameCheckerFlavorTextOriginObjectName_Erika3:: .string "TAMIA$" gFameCheckerFlavorTextOriginObjectName_Erika4:: .string "ERIKA$" gFameCheckerFlavorTextOriginObjectName_Erika5:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Koga0:: .string "SIGN$" gFameCheckerFlavorTextOriginObjectName_Koga1:: .string "KOGA$" gFameCheckerFlavorTextOriginObjectName_Koga2:: .string "KIRK$" gFameCheckerFlavorTextOriginObjectName_Koga3:: .string "JANINE$" gFameCheckerFlavorTextOriginObjectName_Koga4:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Koga5:: .string "MAN$" gFameCheckerFlavorTextOriginObjectName_Sabrina0:: .string "SIGN$" gFameCheckerFlavorTextOriginObjectName_Sabrina1:: .string "YOUNG MAN$" gFameCheckerFlavorTextOriginObjectName_Sabrina2:: .string "SABRINA$" gFameCheckerFlavorTextOriginObjectName_Sabrina3:: .string "SABRINA$" gFameCheckerFlavorTextOriginObjectName_Sabrina4:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Sabrina5:: .string "TYRON$" gFameCheckerFlavorTextOriginObjectName_Blaine0:: .string "SIGN$" gFameCheckerFlavorTextOriginObjectName_Blaine1:: .string "BLAINE$" gFameCheckerFlavorTextOriginObjectName_Blaine2:: .string "DEREK$" gFameCheckerFlavorTextOriginObjectName_Blaine3:: .string "WOMAN$" gFameCheckerFlavorTextOriginObjectName_Blaine4:: .string "PHOTO$" gFameCheckerFlavorTextOriginObjectName_Blaine5:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Lorelei0:: .string "LORELEI$" gFameCheckerFlavorTextOriginObjectName_Lorelei1:: .string "LORELEI$" gFameCheckerFlavorTextOriginObjectName_Lorelei2:: .string "OLD MAN$" gFameCheckerFlavorTextOriginObjectName_Lorelei3:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Lorelei4:: .string "LITTLE GIRL$" gFameCheckerFlavorTextOriginObjectName_Lorelei5:: .string "OLD LADY$" gFameCheckerFlavorTextOriginObjectName_Bruno0:: .string "BRUNO$" gFameCheckerFlavorTextOriginObjectName_Bruno1:: .string "BRUNO$" gFameCheckerFlavorTextOriginObjectName_Bruno2:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Bruno3:: .string "CRUSHER$" gFameCheckerFlavorTextOriginObjectName_Bruno4:: .string "WOMAN$" gFameCheckerFlavorTextOriginObjectName_Bruno5:: .string "CRUSHER$" gFameCheckerFlavorTextOriginObjectName_Agatha0:: .string "AGATHA$" gFameCheckerFlavorTextOriginObjectName_Agatha1:: .string "CRUSHER$" gFameCheckerFlavorTextOriginObjectName_Agatha2:: .string "CRUSHER$" gFameCheckerFlavorTextOriginObjectName_Agatha3:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Agatha4:: .string "AGATHA$" gFameCheckerFlavorTextOriginObjectName_Agatha5:: .string "OLD LADY$" gFameCheckerFlavorTextOriginObjectName_Lance0:: .string "LANCE$" gFameCheckerFlavorTextOriginObjectName_Lance1:: .string "LANCE$" gFameCheckerFlavorTextOriginObjectName_Lance2:: .string "WOMAN$" gFameCheckerFlavorTextOriginObjectName_Lance3:: .string "LITTLE GIRL$" gFameCheckerFlavorTextOriginObjectName_Lance4:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Lance5:: .string "YOUNG MAN$" gFameCheckerFlavorTextOriginObjectName_Bill0:: .string "{RIVAL}$" gFameCheckerFlavorTextOriginObjectName_Bill1:: .string "LITTLE BOY$" gFameCheckerFlavorTextOriginObjectName_Bill2:: .string "OLD MAN$" gFameCheckerFlavorTextOriginObjectName_Bill3:: .string "CELIO$" gFameCheckerFlavorTextOriginObjectName_Bill4:: .string "CELIO$" gFameCheckerFlavorTextOriginObjectName_Bill5:: .string "CELIO$" gFameCheckerFlavorTextOriginObjectName_MrFuji0:: .string "LITTLE GIRL$" gFameCheckerFlavorTextOriginObjectName_MrFuji1:: .string "TEAM ROCKET$" gFameCheckerFlavorTextOriginObjectName_MrFuji2:: .string "MAGAZINE$" gFameCheckerFlavorTextOriginObjectName_MrFuji3:: .string "MAN$" gFameCheckerFlavorTextOriginObjectName_MrFuji4:: .string "PHOTO$" gFameCheckerFlavorTextOriginObjectName_MrFuji5:: .string "POKéMON JOURNAL$" gFameCheckerFlavorTextOriginObjectName_Giovanni0:: .string "GIOVANNI$" gFameCheckerFlavorTextOriginObjectName_Giovanni1:: .string "SCIENTIST$" gFameCheckerFlavorTextOriginObjectName_Giovanni2:: .string "SCIENTIST$" gFameCheckerFlavorTextOriginObjectName_Giovanni3:: .string "GIOVANNI$" gFameCheckerFlavorTextOriginObjectName_Giovanni4:: .string "MAN$" gFameCheckerFlavorTextOriginObjectName_Giovanni5:: .string "GIDEON$" PokemonJournal_Text_SpecialFeatureBrock:: .string "POKéMON JOURNAL\p" .string "Special Feature: PEWTER GYM\n" .string "LEADER BROCK!\p" .string "BROCK rarely laughs, but is said to\n" .string "be unable to stop if he starts.$" PokemonJournal_Text_SpecialFeatureMisty:: .string "POKéMON JOURNAL\p" .string "Special Feature: CERULEAN GYM\n" .string "LEADER MISTY!\p" .string "MISTY is said to worship LORELEI\n" .string "of the ELITE FOUR.$" PokemonJournal_Text_SpecialFeatureLtSurge:: .string "POKéMON JOURNAL\p" .string "Special Feature: VERMILION GYM\n" .string "LEADER LT. SURGE!\p" .string "LT. SURGE is rumored to have been\n" .string "a pilot while home in America.\p" .string "He used the electricity generated\n" .string "by POKéMON to power his plane.$" PokemonJournal_Text_SpecialFeatureErika:: .string "POKéMON JOURNAL\p" .string "Special Feature: CELADON GYM\n" .string "LEADER ERIKA!\p" .string "Rumor has it that if you peek into\n" .string "CELADON GYM, you can often\l" .string "see ERIKA snoozing.$" PokemonJournal_Text_SpecialFeatureKoga:: .string "POKéMON JOURNAL\p" .string "Special Feature: FUCHSIA GYM\n" .string "LEADER KOGA!\p" .string "KOGA is said to have a thorough\n" .string "knowledge of medicine.\p" .string "He even concocts medicine to nurse\n" .string "his POKéMON to health.$" PokemonJournal_Text_SpecialFeatureSabrina:: .string "POKéMON JOURNAL\p" .string "Special Feature: SAFFRON GYM\n" .string "LEADER SABRINA!\p" .string "People say that SABRINA can\n" .string "communicate with her POKéMON\l" .string "during battle without speaking.$" PokemonJournal_Text_SpecialFeatureBlaine:: .string "POKéMON JOURNAL\p" .string "Special Feature: CINNABAR GYM\n" .string "LEADER BLAINE!\p" .string "BLAINE is said to remove his dark\n" .string "shades only when he is thinking up\l" .string "new quiz questions.$" PokemonJournal_Text_SpecialFeatureLorelei:: .string "POKéMON JOURNAL\p" .string "Special Feature:\n" .string "ELITE FOUR's LORELEI!\p" .string "Known for her logical, calculated,\n" .string "and cool battling style, LORELEI\l" .string "has a surprising secret!$" PokemonJournal_Text_SpecialFeatureBruno:: .string "POKéMON JOURNAL\p" .string "Special Feature:\n" .string "ELITE FOUR's BRUNO!\p" .string "BRUNO apparently joined the ELITE\n" .string "FOUR out of his burning ambition to\l" .string "battle the best TRAINERS.$" PokemonJournal_Text_SpecialFeatureAgatha:: .string "POKéMON JOURNAL\p" .string "Special Feature:\n" .string "ELITE FOUR's AGATHA!\p" .string "In her youth, AGATHA and PROF.\n" .string "OAK were rivals who vied for\l" .string "supremacy as TRAINERS.$" PokemonJournal_Text_SpecialFeatureLance:: .string "POKéMON JOURNAL\p" .string "Special Feature:\n" .string "ELITE FOUR's LANCE!\p" .string "LANCE's grandfather is thought to\n" .string "be the elder of a famous clan of\l" .string "dragon masters.$" PokemonJournal_Text_SpecialFeatureProfOak:: .string "POKéMON JOURNAL\p" .string "Special Feature: PROF. OAK,\n" .string "the POKéMON Researcher!\p" .string "PROF. OAK reportedly lives with his\n" .string "grandchildren DAISY and {RIVAL}.$" PokemonJournal_Text_SpecialFeatureDaisyOak:: .string "This is a POKéMON JOURNAL from\n" .string "years ago…\p" .string "POKéMON JOURNAL\n" .string "CONTEST Special!\p" .string "The Spring POKéMON CONTEST's\n" .string "Grand Champion is DAISY OAK of\l" .string "PALLET TOWN!$" PokemonJournal_Text_SpecialFeatureMrFuji:: .string "POKéMON JOURNAL\p" .string "Special Feature:\n" .string "MR. FUJI of POKéMON HOUSE!\p" .string "Editor: The shy MR. FUJI turned\n" .string "down our interview requests.\p" .string "He is a kindly man who is adored\n" .string "and respected in LAVENDER TOWN.$" ================================================ FILE: data/text/flavor_text.inc ================================================ @ Flavor text for interacting with various background objects Text_Bookshelf:: .string "It's crammed full of POKéMON\n" .string "books.$" Text_ATownMap:: .string "A TOWN MAP.$" Text_PokeMartShelf:: .string "Wow!\n" .string "Tons of POKéMON stuff!$" Text_DishesPlatesNeatlyLinedUp:: .string "Dishes and plates are neatly\n" .string "lined up.$" Text_Kitchen:: .string "It smells delicious!\n" .string "Somebody's been cooking here.$" Text_Dresser:: .string "It's a nicely made dresser.\n" .string "It will hold a lot of stuff.$" Text_Snacks:: .string "There's a pile of snacks here.$" Text_PokemartSign:: .string "All your item needs fulfilled!\n" .string "POKéMON MART$" Text_PokecenterSign:: .string "Heal Your POKéMON!\n" .string "POKéMON CENTER$" Text_Indigo_UltimateGoal:: .string "INDIGO PLATEAU\p" .string "The ultimate goal of TRAINERS!\n" .string "POKéMON LEAGUE HQ$" Text_Indigo_HighestAuthority:: .string "INDIGO PLATEAU\p" .string "The highest POKéMON authority!\n" .string "POKéMON LEAGUE HQ$" Text_Food:: .string "It should be packed with all kinds\n" .string "of delicious things to eat.$" Text_Blueprints:: .string "It's a blueprint of some sort.\n" .string "It's filled with diagrams and text.$" Text_Painting:: .string "It's a pretty picture of a POKéMON.\n" .string "It looks like it's feeling good.$" Text_PowerPlantMachine:: .string "What could this machine be?\n" .string "Better not mess around with it!$" Text_Telephone:: .string "It's a telephone.\n" .string "Better not use it.$" Text_Computer:: .string "It's all complicated words and\n" .string "numbers that make no sense…$" Text_AdvertisingPoster:: .string "It's an advertising poster about\n" .string "all kinds of products.$" Text_TastyFood:: .string "Oh, that smells tasty!\n" .string "It might get the stomach growling!$" Text_TrashBin:: .string "Inside this…\n" .string "……\p" .string "There's nothing here!$" Text_Cup:: .string "It's a cup with a POKéMON mark\n" .string "on it.$" Text_PolishedWindow:: .string "The window is very well polished.$" Text_BeautifulSkyWindow:: .string "Outside the window…\p" .string "The sky looks fantastically\n" .string "beautiful.$" Text_BlinkingLights:: .string "Lights in different colors are\n" .string "flashing on and off.$" Text_NeatlyLinedUpTools:: .string "All sorts of tools are lined up\n" .string "neatly.$" Text_ImpressiveMachine:: .string "It's a machine of some sort.\n" .string "It sure is impressive.$" Text_VideoGame:: .string "It's the latest video game!\n" .string "It sure looks fun!$" Text_Burglary:: .string "There are obvious signs of burglary\n" .string "here…$" Text_PlayerFacingTVScreen:: .string "There's a POKéMON on TV!\n" .string "It looks like it's having fun.$" ================================================ FILE: data/text/help_system.inc ================================================ Help_Text_WhatShouldIDo:: .string "What should I do in this situation?$" Help_Text_HowDoIDoThis:: .string "How do I do this?$" Help_Text_WhatDoesThisTermMean:: .string "What does this term mean?$" Help_Text_AboutThisGame:: .string "About this game$" Help_Text_TypeMatchupList:: .string "Type Matchup List$" Help_Text_Exit:: .string "EXIT$" Help_Text_Cancel:: .string "CANCEL$" Help_Text_DescWhatShouldIDo:: .string "Select to obtain hints for getting\n" .string "over challenging situations.$" Help_Text_DescHowDoIDoThis:: .string "Detailed instructions are given for\n" .string "various operations.$" Help_Text_DescWhatDoesThisTermMean:: .string "Detailed descriptions are given for\n" .string "terms that appear in the game.$" Help_Text_DescAboutThisGame:: .string "Detailed descriptions are given\n" .string "about this game.$" Help_Text_DescTypeMatchupList:: .string "The matchups of POKéMON types\n" .string "and moves are listed.$" Help_Text_DescExit:: .string "Select to exit the HELP System.$" Help_Text_Greetings:: .string "Greetings! This is the HELP System.\n" .string "Call me up whenever and wherever you\l" .string "need by pressing the L Button.\l" .string "The help messages change to suit the\l" .string "situation, so check them often, please.$" Help_Text_PlayingForFirstTime:: .string "I'm playing for the first time. Help!$" Help_Text_WhatShouldIBeDoing:: .string "What should I be doing?$" Help_Text_CantGetOutOfRoom:: .string "I can't get out of a room!$" Help_Text_CantFindPersonIWant:: .string "I can't find the person I want.$" Help_Text_TalkedToEveryoneNowWhat:: .string "I've talked to everyone. Now what?$" Help_Text_SomeoneBlockingMyWay:: .string "There's someone blocking my way!$" Help_Text_ICantGoOn:: .string "I can't go on!$" Help_Text_OutOfThingsToDo:: .string "I'm out of things to do.$" Help_Text_WhatHappenedToItemIGot:: .string "What happened to the item I got?$" Help_Text_WhatAreMyAdventureBasics:: .string "What are the basics of my adventure?$" Help_Text_HowAreRoadsForestsDifferent:: .string "How are roads and forests different?$" Help_Text_HowAreCavesDifferent:: .string "How are caves different?$" Help_Text_HowDoIProgress:: .string "How do I progress?$" Help_Text_WhenCanIUseItem:: .string "When can I use items?$" Help_Text_WhatsABattle:: .string "What's a battle?$" Help_Text_HowDoIPrepareForBattle:: .string "How do I prepare for battle?$" Help_Text_WhatIsAMonsVitality:: .string "What is a POKéMON's vitality?$" Help_Text_MyMonsAreHurt:: .string "My POKéMON are hurt!$" Help_Text_WhatIsStatusProblem:: .string "What is a status problem?$" Help_Text_WhatHappensIfAllMyMonsFaint:: .string "What happens if all my POKéMON faint?$" Help_Text_CantCatchMons:: .string "I can't catch POKéMON!$" Help_Text_RanOutOfPotions:: .string "I ran out of POTIONS.$" Help_Text_CanIBuyPokeBalls:: .string "Can I buy POKé BALLS?$" Help_Text_WhatsATrainer:: .string "What's a TRAINER?$" Help_Text_HowDoIWinAgainstTrainer:: .string "How do I win against a TRAINER?$" Help_Text_WhereDoMonsAppear:: .string "Where do POKéMON appear?$" Help_Text_WhatAreMoves:: .string "What are POKéMON moves?$" Help_Text_WhatAreHiddenMoves:: .string "What are HIDDEN moves?$" Help_Text_WhatMovesShouldIUse:: .string "What moves should I use?$" Help_Text_WantToAddMoreMoves:: .string "I want to add more moves.$" Help_Text_WantToMakeMonStronger:: .string "I want to make my POKéMON stronger.$" Help_Text_FoeMonsTooStrong:: .string "The foe POKéMON are too strong!$" Help_Text_WhatDoIDoInCave:: .string "What do I do in a cave?$" Help_Text_NothingIWantToKnow:: .string "There's nothing that I want to know!$" Help_Text_WhatsPokemonCenter:: .string "What's a POKéMON CENTER?$" Help_Text_WhatsPokemonMart:: .string "What's a POKéMON MART?$" Help_Text_WantToEndGame:: .string "I want to end the game.$" Help_Text_WhatsAMon:: .string "What's a POKéMON?$" Help_Text_WhatIsThatPersonLike:: .string "What is that person like?$" Help_Text_WhatDoesHiddenMoveDo:: .string "What does a HIDDEN move do?$" Help_Text_WhatDoIDoInSafari:: .string "What do I do in a SAFARI GAME?$" Help_Text_WhatAreSafariRules:: .string "What are the SAFARI GAME rules?$" Help_Text_WantToEndSafari:: .string "I want to end this SAFARI GAME!$" Help_Text_WhatIsAGym:: .string "What is a GYM?$" Help_Text_AnswerPlayingForFirstTime:: .string "You become the main character,\n" .string "exploring the world of POKéMON.\l" .string "By talking to people and solving\l" .string "mysteries, new paths will open to you.\l" .string "Strive for the goal together with your\l" .string "wonderful POKéMON.$" Help_Text_AnswerWhatShouldIBeDoing:: .string "When you come across another person,\n" .string "go up to them and press the A Button.\l" .string "That will get them to talk and interact\l" .string "with your character. You may also\l" .string "examine various items and objects in\l" .string "the same way. Talk to people and check\l" .string "things often to obtain information.$" Help_Text_AnswerCantGetOutOfRoom:: .string "On the stairs or the exits of a\n" .string "building is a red mat. Move your\l" .string "character to stand on top of the\l" .string "red mat. Press the {PLUS} Control Pad \l" .string "toward the stairs or the exit to\l" .string "advance.$" Help_Text_AnswerCantFindPersonIWant:: .string "This isn't something you should worry\n" .string "about too much.\l" .string "Talk to other people, check signs,\l" .string "check things, and so on.\l" .string "Sometimes, you may need to just move\l" .string "to a new town or place.$" Help_Text_AnswerTalkedToEveryoneNowWhat:: .string "Try moving on to a new road, town, or\n" .string "place.$" Help_Text_AnswerSomeoneBlockingMyWay:: .string "There could be something in the town\n" .string "or inside a building that is the cause.\l" .string "Try talking to the people in the area\l" .string "again. If there is a problem that they\l" .string "need solved, you may have to help.\l" .string "Afterwards, try talking to the person\l" .string "blocking your way again.$" Help_Text_AnswerICantGoOn:: .string "Try talking to people by going up to\n" .string "them and pressing the A Button.\l" .string "Also, try checking things like odd trees\l" .string "and strange rocks with the A Button.\l" .string "Press the {PLUS} Control Pad and try going\l" .string "to places that look impassable, too.$" Help_Text_AnswerOutOfThingsToDo:: .string "Try going to places where you \n" .string "haven't visited yet.\l" .string "Also, check everything that looks\l" .string "suspicious by pressing the A Button.$" Help_Text_AnswerWhatHappenedToItemIGot:: .string "Any item that you are given by another\n" .string "character goes in your BAG.\l" .string "The item is automatically sorted and\l" .string "placed in one of five pockets.\l" .string "For instructions on the BAG's use,\l" .string "please refer to the HELP System's\l" .string "“How do I do this?” heading.$" Help_Text_AnswerWhatAreMyAdventureBasics:: .string "If POKéMON are hurt in battle,\n" .string "take them to a POKéMON CENTER and\l" .string "have them healed by the staff.\l" .string "Get in the habit of saving your\l" .string "game and recording your progress.\l" .string "Stock up on healing items at\l" .string "POKéMON MARTS before traveling far.$" Help_Text_AnswerHowAreRoadsForestsDifferent:: .string "Forests are basically the same as\n" .string "roads but they can be like mazes.\l" .string "All forests have a way out, so don't\l" .string "give up if you get lost.$" Help_Text_AnswerHowAreCavesDifferent:: .string "Caves are dark and dangerous. Wild\n" .string "POKéMON can appear anywhere in them.\l" .string "If there is an emergency, rush to a\l" .string "POKéMON CENTER or use items.\l" .string "New towns await discovery beyond some\l" .string "caves, so don't give up.$" Help_Text_AnswerHowDoIProgress:: .string "The object of the game is to train\n" .string "your POKéMON and move forward.\l" .string "You must collect info and solve\l" .string "problems. For example, what do you\l" .string "need to get around an obstacle?\l" .string "What would get that impeding\l" .string "person out of the way?$" Help_Text_AnswerWhenCanIUseItem:: .string "There are several kinds of items.\n" .string "Some can be used only on the field.\l" .string "Some are only for use during battle.\l" .string "Some can be used anytime.\l" .string "Try using an item - if it can't be used,\l" .string "you will be alerted.$" Help_Text_AnswerWhatsABattle:: .string "In a battle, POKéMON try to reduce\n" .string "one another's vitality, expressed as\l" .string "HP. If a POKéMON's HP falls to zero,\l" .string "it faints, and the other POKéMON\l" .string "wins. By winning a battle, POKéMON\l" .string "earn EXP. Points, which help them\l" .string "level up (grow stronger).$" Help_Text_AnswerHowDoIPrepareForBattle:: .string "First, fully heal the POKéMON in your\n" .string "party (the POKéMON with you) at any\l" .string "POKéMON CENTER.\l" .string "You should also buy healing items for\l" .string "emergencies at a POKéMON MART.$" Help_Text_AnswerWhatIsAMonsVitality:: .string "A POKéMON's vitality is expressed in HP.\n" .string "If a POKéMON is hurt in battle, HP is\l" .string "subtracted. If its HP drops to zero,\l" .string "the POKéMON faints.\l" .string "Heal hurt or fainted POKéMON at a\l" .string "POKéMON CENTER or by using items.$" Help_Text_AnswerMyMonsAreHurt:: .string "A POKéMON CENTER is like an inn for\n" .string "POKéMON. It will fully heal POKéMON of\l" .string "any status problems and fully restore\l" .string "their HP using a special machine.\l" .string "This service is free, so get in the\l" .string "habit of healing your POKéMON often.$" Help_Text_AnswerWhatIsStatusProblem:: .string "A status problem refers to an ailment\n" .string "that is inflicted on a POKéMON by its\l" .string "foe's attack. These include burns,\l" .string "paralysis, poisoning, sleep, and\l" .string "freezing. These can be healed by\l" .string "visiting a POKéMON CENTER or using\l" .string "the appropriate item.$" Help_Text_AnswerWhatHappensIfAllMyMonsFaint:: .string "If all the POKéMON in your party\n" .string "(all the POKéMON with you) faint, you\l" .string "lose some MONEY, and you are\l" .string "returned home or to a POKéMON\l" .string "CENTER. To reduce that chance, visit\l" .string "POKéMON CENTERS often. Also, get\l" .string "in the habit of saving often.$" Help_Text_AnswerCantCatchMons:: .string "If a wild POKéMON escapes from a POKé\n" .string "BALL, it's obviously still feisty.\l" .string "Try reducing its HP some more, and\l" .string "try to weaken it with paralysis or sleep\l" .string "before trying to catch it.\l" .string "If the POKé BALL rocks for a while,\l" .string "the quarry is close to being caught!$" Help_Text_AnswerRanOutOfPotions:: .string "There are shops, known as POKéMON\n" .string "MARTS, that sell items.\l" .string "You will not find POKéMON MARTS on\l" .string "roads, in forests, or in caves.\l" .string "Stock up on needed items while you are\l" .string "visiting a town with a POKéMON MART.$" Help_Text_AnswerCanIBuyPokeBalls:: .string "You may buy POKé BALLS at any\n" .string "POKéMON MART in any town.\l" .string "You will not find POKéMON MARTS on\l" .string "roads, in forests, or in caves.\l" .string "Stock up on POKé BALLS while you are\l" .string "visiting a town with a POKéMON MART.$" Help_Text_AnswerWhatsATrainer:: .string "A TRAINER is a person who raises\n" .string "POKéMON through battling.\l" .string "TRAINERS will challenge you \l" .string "wherever they are - it could be on\l" .string "a road, in forests, caves, anywhere.\l" .string "If your eyes meet, you have to accept\l" .string "their challenge. So be careful!$" Help_Text_AnswerHowDoIWinAgainstTrainer:: .string "To beat a TRAINER in battle, use\n" .string "POKéMON that have type advantages\l" .string "over the foe's POKéMON. You may also\l" .string "use highly trained POKéMON with\l" .string "overwhelming power. Outnumbering the\l" .string "foe's POKéMON is another obvious\l" .string "tactic.$" Help_Text_AnswerWhereDoMonsAppear:: .string "Wild POKéMON will appear in tall grass,\n" .string "on roads, and in forests. They will\l" .string "appear anywhere in dark caves.\l" .string "There are no wild POKéMON or TRAINERS\l" .string "in towns, so they are safe places.$" Help_Text_AnswerWhatAreMoves:: .string "POKéMON may learn up to four different\n" .string "techniques, or moves. There is a great\l" .string "variety of moves including attacks and\l" .string "those with special effects. The kinds\l" .string "of moves that can be learned vary\l" .string "for each POKéMON. Some moves\l" .string "can be learned from machines.$" Help_Text_AnswerWhatAreHiddenMoves:: .string "HIDDEN moves are those that are\n" .string "especially important for your\l" .string "adventure. To use such a move outside\l" .string "of battle, open the “POKéMON” MENU\l" .string "and make the POKéMON that knows the\l" .string "move use it. A fainted POKéMON may use\l" .string "a HIDDEN move outside of battle.$" Help_Text_AnswerWhatMovesShouldIUse:: .string "Select “FIGHT,” and the MENU of moves\n" .string "will appear. Consider the type\l" .string "matchups, and use the most effective\l" .string "moves. You can check the effects of\l" .string "moves by opening “POKéMON,”\l" .string "picking a POKéMON, opening “SUMMARY,”\l" .string "then opening “POKéMON SKILLS.”$" Help_Text_AnswerWantToAddMoreMoves:: .string "The most a POKéMON can learn is four\n" .string "moves. They are learned as the\l" .string "POKéMON levels up. It can also be\l" .string "taught a move using a TM (Technical\l" .string "Machine) or HM (Hidden Machine).\l" .string "There are also people who teach moves.$" Help_Text_AnswerWantToMakeMonStronger:: .string "The key to making your POKéMON\n" .string "strong is to battle and win often.\l" .string "The EXP. (Experience) Points earned\l" .string "by winning battles accumulate to\l" .string "level up POKéMON that participated in\l" .string "them. Battle wild POKéMON often to\l" .string "level up your party.$" Help_Text_AnswerFoeMonsTooStrong:: .string "If your foes are too strong, try\n" .string "leveling up your POKéMON some more.\l" .string "Go back the way you came and battle\l" .string "wild POKéMON to level up your party.\l" .string "You may also battle TRAINERS whom you\l" .string "have not battled before.$" Help_Text_AnswerWhatDoIDoInCave:: .string "Unlike roads and forests, wild POKéMON\n" .string "can appear anywhere in caves.\l" .string "If your POKéMON are hurt in a cave,\l" .string "rush to a POKéMON CENTER or use items\l" .string "to heal them right away. It is very\l" .string "dangerous to force your luck in caves.$" Help_Text_AnswerNothingIWantToKnow:: .string "Trust your own knowledge and power.\n" .string "Believe in yourself and find your way!$" Help_Text_AnswerWhatsPokemonCenter:: .string "A POKéMON CENTER is identified by its\n" .string "red roof and a “P.C” sign. Every\l" .string "POKéMON CENTER offers such services as\l" .string "fully healing POKéMON and free PC use,\l" .string "making it essential for your travels.\l" .string "On the upper floor are facilities for\l" .string "linking with friends and others.$" Help_Text_AnswerWhatsPokemonMart:: .string "A POKéMON MART is identified by its\n" .string "blue roof and a “MART” sign.\l" .string "Items can be bought and sold at any\l" .string "POKéMON MART. Some MARTS carry items\l" .string "that are available only in their towns.$" Help_Text_AnswerWantToEndGame:: .string "You can safely end your game by\n" .string "selecting “SAVE” on the MENU.\l" .string "Once you have saved, the game can be\l" .string "safely turned off. When the game is\l" .string "turned back on, you can resume from\l" .string "where you last saved.$" Help_Text_AnswerWhatsAMon:: .string "POKéMON are living beings about which\n" .string "many mysteries still remain. You may\l" .string "see them in grass, the sea, and caves.\l" .string "They appear to obey the wishes of the\l" .string "TRAINERS that caught them.$" Help_Text_AnswerWhatIsThatPersonLike:: .string "Use the FAME CHECKER among the\n" .string "KEY ITEMS in your BAG.\l" .string "It may give you a hint, so try it out.$" Help_Text_AnswerWhatDoesHiddenMoveDo:: .string "A HIDDEN move is taught to a POKéMON\n" .string "using an HM (Hidden Machine).\l" .string "A HIDDEN move is important for helping\l" .string "your adventure. For example, one is\l" .string "used to light up dark caves. Another\l" .string "cuts down small trees. There is one\l" .string "for traveling on water, and so on.$" Help_Text_AnswerWhatDoIDoInSafari:: .string "Try to catch wild POKéMON by throwing\n" .string "the special SAFARI BALLS.\l" .string "You may keep any item you find, too.$" Help_Text_AnswerWhatAreSafariRules:: .string "Your SAFARI GAME ends once you have\n" .string "traveled a certain distance or thrown\l" .string "all your SAFARI BALLS.\l" .string "Open the MENU to check the remaining\l" .string "number of steps and SAFARI BALLS.$" Help_Text_AnswerWantToEndSafari:: .string "If you would like to cut your SAFARI\n" .string "GAME short, open the MENU and select\l" .string "“RETIRE” at the top of the list.$" Help_Text_AnswerWhatIsAGym:: .string "POKéMON GYMS are operated by the\n" .string "POKéMON LEAGUE and are training\l" .string "facilities for TRAINERS. They are all\l" .string "across the land in cities and towns.\l" .string "Each one is headed by a LEADER, who\l" .string "is a very skilled TRAINER. Beat the\l" .string "LEADER to collect a BADGE.$" Help_Text_UsingPokedex:: .string " Using “POKéDEX”$" Help_Text_UsingPokemon:: .string " Using “POKéMON”$" Help_Text_UsingSummary:: .string " Using “SUMMARY”$" Help_Text_UsingSwitch:: .string " Using “SWITCH”$" Help_Text_UsingItem:: .string " Using “ITEM”$" Help_Text_UsingBag:: .string " Using “BAG”$" Help_Text_UsingAnItem:: .string " Using an item$" Help_Text_UsingKeyItem:: .string " Using a key item$" Help_Text_UsingPokeBall:: .string " Using a POKé BALL$" Help_Text_UsingPlayer:: .string " Using “{PLAYER}”$" Help_Text_UsingSave:: .string " Using “SAVE”$" Help_Text_UsingOption:: .string " Using “OPTION”$" Help_Text_UsingPotion:: .string " Using a POTION$" Help_Text_UsingTownMap:: .string " Using the TOWN MAP$" Help_Text_UsingTM:: .string " Using a TM$" Help_Text_UsingHM:: .string " Using an HM$" Help_Text_UsingMoveOutsideOfBattle:: .string "Using a move outside of battle$" Help_Text_RidingBicycle:: .string " Riding the BICYCLE$" Help_Text_EnteringName:: .string "Entering a name$" Help_Text_UsingPC:: .string "Using a PC$" Help_Text_UsingBillsPC:: .string " Using “{STR_VAR_1}'S PC”$" Help_Text_UsingWithdraw:: .string " Using “WITHDRAW”$" Help_Text_UsingDeposit:: .string " Using “DEPOSIT”$" Help_Text_UsingMove:: .string " Using “MOVE”$" Help_Text_MovingItems:: .string " Moving items$" Help_Text_UsingPlayersPC:: .string " Using “{PLAYER}'s PC”$" Help_Text_UsingWithdrawItem:: .string " Using “WITHDRAW ITEM”$" Help_Text_UsingDepositItem:: .string " Using “DEPOSIT ITEM”$" Help_Text_UsingMailbox:: .string " Using “MAILBOX”$" Help_Text_UsingProfOaksPC:: .string " Using “PROF. OAK'S PC”$" Help_Text_OpeningMenu:: .string "Opening the MENU$" Help_Text_UsingFight:: .string " Using “FIGHT”$" Help_Text_UsingPokemon2:: .string " Using “POKéMON”$" Help_Text_UsingShift:: .string " Using “SHIFT”$" Help_Text_UsingSummary2:: .string " Using “SUMMARY”$" Help_Text_UsingBag2:: .string " Using “BAG”$" Help_Text_ReadingPokedex:: .string " Reading the “POKéDEX”$" Help_Text_UsingHomePC:: .string "Using the PC at home$" Help_Text_UsingItemStorage:: .string "Using the Item Storage System$" Help_Text_UsingWithdrawItem2:: .string " Using “WITHDRAW ITEM”$" Help_Text_UsingDepositItem2:: .string " Using “DEPOSIT ITEM”$" Help_Text_UsingMailbox2:: .string "Using the MAILBOX$" Help_Text_UsingRun:: .string " Using “RUN”$" Help_Text_RegisterKeyItem:: .string " “REGISTER” a key item$" Help_Text_UsingBall:: .string " Using “BALL”$" Help_Text_UsingBait:: .string " Using “BAIT”$" Help_Text_UsingRock:: .string " Using “ROCK”$" Help_Text_UsingHallOfFame:: .string " Using “HALL OF FAME”$" Help_Text_UsingKeySystem:: .string " Using “KEY SYSTEM SETTINGS”$" Help_Text_SortingBag:: .string " Sorting the BAG$" Help_Text_HowToUsePokedex:: .string "{CIRCLE_1} Select “POKéDEX” on the MENU.\n" .string "{CIRCLE_2} Choose POKéMON using commands such\n" .string " as “POKéMON LIST,”\n" .string " “HABITATS OF POKéMON,” and\n" .string " “SEARCH.”\n" .string "{CIRCLE_3} Select a POKéMON to obtain detailed\n" .string " information.$" Help_Text_HowToUsePokemon:: .string "{CIRCLE_1} Select “POKéMON” on the MENU.\n" .string "{CIRCLE_2} Choose a POKéMON in your party.\n" .string "{CIRCLE_3} Select “SUMMARY,” “SWITCH,”\n" .string " or “ITEM.”$" Help_Text_HowToUseSummary:: .string "{CIRCLE_1} Select “SUMMARY.”\n" .string "{CIRCLE_2} Press left or right on the {PLUS} Control\n" .string " Pad to check the information:\n" .string " “POKéMON INFO”\n" .string " “POKéMON SKILLS”\n" .string " “KNOWN MOVES”$" Help_Text_HowToUseSwitch:: .string "{CIRCLE_1} Choose the POKéMON you want to\n" .string " switch around.\n" .string "{CIRCLE_2} Select “SWITCH.”\n" .string "{CIRCLE_3} Select the POKéMON to switch with\n" .string " the first one.\n" .string "The POKéMON at the left of the screen\n" .string "will be the first one out in a battle.$" Help_Text_HowToUseItem:: .string "{CIRCLE_1} Select “ITEM.”\n" .string "{CIRCLE_2} Select whether you want to “GIVE”\n" .string " an item to the POKéMON to hold,\n" .string " or “TAKE” an item it is holding.\n" .string "A POKéMON can hold no more than one\n" .string "item!$" Help_Text_HowToUseBag:: .string "{CIRCLE_1} Select “BAG” on the MENU.\n" .string "{CIRCLE_2} Press left or right on the {PLUS} Control\n" .string " Pad to check the data headings:\n" .string " “ITEMS” “MEDICINE”\n" .string " “KEY ITEMS” “HELD ITEMS”\n" .string " “POKé BALLS”\n" .string " Press up or down to select an item.$" Help_Text_HowToUseAnItem:: .string "{CIRCLE_1} Select the “ITEMS” POCKET.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad to select an item.\n" .string "{CIRCLE_3} Select “USE” to use the selected\n" .string " item.\n" .string "Some items may not be used depending\n" .string "on the place and/or situation.$" Help_Text_HowToUseKeyItem:: .string "{CIRCLE_1} Select the “KEY ITEMS” POCKET.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad to select a key item.\n" .string "{CIRCLE_3} Select “USE” to use the selected\n" .string " key item.$" Help_Text_HowToUsePokeBall:: .string "{CIRCLE_1} While battling a wild POKéMON,\n" .string " select the BAG's “POKé BALLS”\n" .string " POCKET.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad to select a POKé BALL.\n" .string "{CIRCLE_3} Select “USE” to throw the selected\n" .string " POKé BALL.$" Help_Text_HowToUsePlayer:: .string "{CIRCLE_1} Select “{PLAYER}” on the MENU.\n" .string "{CIRCLE_2} Your TRAINER CARD is displayed face\n" .string " up with basic information. Press the\n" .string " A Button to turn the CARD over.\n" .string "{CIRCLE_3} A variety of data can be found on\n" .string " the reverse side of the CARD.$" Help_Text_HowToUseSave:: .string "{CIRCLE_1} Select “SAVE” on the MENU.\n" .string "{CIRCLE_2} Select “YES” and your progress is\n" .string " recorded in the save file.\n" .string "Once the game is saved, you may turn\n" .string "off the game. Your game can be resumed\n" .string "from where you saved.$" Help_Text_HowToUseOption:: .string "{CIRCLE_1} Select “OPTION” on the MENU.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad to select an optional item, then\n" .string " press left or right to alter the\n" .string " settings.\n" .string "{CIRCLE_3} Press the B Button after making\n" .string " changes to save them.$" Help_Text_HowToUsePotion:: .string "{CIRCLE_1} Open the MENU.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad and select “BAG.”\n" .string "{CIRCLE_3} Select “POTION” in the “MEDICINE”\n" .string " POCKET.\n" .string "{CIRCLE_4} Select “USE.”\n" .string "{CIRCLE_5} Select the POKéMON to be healed.$" Help_Text_HowToUseTownMap:: .string "{CIRCLE_1} Open the MENU.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad and select “BAG.”\n" .string "{CIRCLE_3} Press left or right to open the\n" .string " “KEY ITEMS” POCKET, then press\n" .string " up or down to select “TOWN MAP.” \n" .string "{CIRCLE_4} Select “USE” to open the TOWN MAP.$" Help_Text_HowToUseTM:: .string "{CIRCLE_1} Open the MENU.\n" .string "{CIRCLE_2} Open the “KEY ITEMS” POCKET in the\n" .string " “BAG.”\n" .string "{CIRCLE_3} “OPEN” the TM CASE.\n" .string "{CIRCLE_4} Select and “USE” a TM.\n" .string "{CIRCLE_5} Select a POKéMON that can learn the\n" .string " move in the TM.$" Help_Text_HowToUseHM:: .string "{CIRCLE_1} Open the MENU.\n" .string "{CIRCLE_2} Open the “KEY ITEMS” POCKET in the\n" .string " “BAG.”\n" .string "{CIRCLE_3} “OPEN” the TM CASE.\n" .string "{CIRCLE_4} Select and “USE” an HM.\n" .string "{CIRCLE_5} Select a POKéMON that can learn it.\n" .string "HMs are hard to remove, so be careful!$" Help_Text_HowToUseMoveOutsideOfBattle:: .string "{CIRCLE_1} Open the MENU.\n" .string "{CIRCLE_2} Select “POKéMON.”\n" .string "{CIRCLE_3} Select a POKéMON that knows an\n" .string " HM move. The usable HM move(s)\n" .string " will be shown in blue. Select and\n" .string " use the desired move to destroy an\n" .string " obstacle, fly, surf, etc.$" Help_Text_HowToRideBicycle:: .string "{CIRCLE_1} Open the MENU. Open the\n" .string " “KEY ITEMS” POCKET in the “BAG”\n" .string " and select the “BICYCLE.”\n" .string "{CIRCLE_2} The BICYCLE can be ridden by\n" .string " selecting “USE.” You may also\n" .string " “REGISTER” it for instant use by\n" .string " pressing SELECT.$" Help_Text_HowToEnterName:: .string "{CIRCLE_1} Move the cursor to the letter you\n" .string " want with the {PLUS} Control Pad, then\n" .string " press the A Button to enter it.\n" .string "{CIRCLE_2} Press the B Button to back up.\n" .string "{CIRCLE_3} Press SELECT to switch between\n" .string " uppercase and lowercase letters.\n" .string "{CIRCLE_4} Press the A Button on “OK.”$" Help_Text_HowToUsePC:: .string "{CIRCLE_1} Go to any POKéMON CENTER, go up\n" .string " to the PC, then press the A Button.$" Help_Text_HowToUseBillsPC:: .string "{CIRCLE_1} Select “{STR_VAR_1}'S PC” on the PC.\n" .string "{CIRCLE_2} Select from one of the top three\n" .string " MENU items to access the POKéMON\n" .string " Storage System.\n" .string "If you catch a POKéMON when you have\n" .string "six in your party, the POKéMON is sent\n" .string "automatically to a BOX in the System!$" Help_Text_HowToUseWithdraw:: .string "{CIRCLE_1} Select a POKéMON in the open BOX\n" .string " with the {PLUS} Control Pad.\n" .string "{CIRCLE_2} Select “WITHDRAW” to remove the\n" .string " POKéMON from the BOX and add it to\n" .string " your party.\n" .string "You may not withdraw a POKéMON if you\n" .string "already have six POKéMON with you!$" Help_Text_HowToUseDeposit:: .string "{CIRCLE_1} Select a POKéMON in your party with\n" .string " the {PLUS} Control Pad.\n" .string "{CIRCLE_2} Select “DEPOSIT.”\n" .string "{CIRCLE_3} Select the BOX, then press the\n" .string " A Button to store the POKéMON.\n" .string "If you have only one POKéMON with you,\n" .string "it may not be stored!$" Help_Text_HowToUseMove:: .string "{CIRCLE_1} Select a POKéMON in the open BOX.\n" .string "{CIRCLE_2} Pick up the POKéMON by selecting\n" .string " “MOVE” and move it anywhere with\n" .string " the {PLUS} Control Pad.\n" .string "{CIRCLE_3} Move the POKéMON to the BOX name\n" .string " and press left or right to move it\n" .string " to another BOX.$" Help_Text_HowToMoveItems:: .string "{CIRCLE_1} Faintly shown POKéMON can be made\n" .string " to hold an item by selecting it and\n" .string " pressing the A Button.\n" .string "{CIRCLE_2} Clearly shown POKéMON can be made\n" .string " to give the item they are holding to\n" .string " another POKéMON, or return the item\n" .string " to the BAG with the A Button.$" Help_Text_HowToUsePlayersPC:: .string "{CIRCLE_1} Select “{PLAYER}'s PC” on the PC.\n" .string "{CIRCLE_2} Select either “ITEM STORAGE” or\n" .string " “MAILBOX.”\n" .string "You may store things in your own PC\n" .string "if your BAG is full. You may also\n" .string "withdraw items stored in your PC.$" Help_Text_HowToUseWithdrawItem:: .string "{CIRCLE_1} Select “WITHDRAW ITEM.”\n" .string "{CIRCLE_2} Select the item to be withdrawn.\n" .string "{CIRCLE_3} The item can be withdrawn and\n" .string " placed in the BAG's ITEMS POCKET.\n" .string " It may also be directly given to a\n" .string " POKéMON to hold.$" Help_Text_HowToUseDepositItem:: .string "{CIRCLE_1} Select “DEPOSIT ITEM.”\n" .string "{CIRCLE_2} Select the item in the BAG to be\n" .string " deposited using the {PLUS} Control Pad.\n" .string "{CIRCLE_3} If there is more than one \n" .string " item to be deposited, enter the\n" .string " quantity with the {PLUS} Control Pad,\n" .string " then press the A Button.$" Help_Text_HowToUseMailbox:: .string "When MAIL is taken from a POKéMON,\n" .string "it is moved to the MAILBOX. If it has\n" .string "no MAIL, the MAILBOX can't be used.\n" .string "{CIRCLE_1} Select “{PLAYER}'S PC” on the PC.\n" .string "{CIRCLE_2} Select “MAILBOX” to read MAIL or\n" .string " make a POKéMON hold MAIL.$" Help_Text_HowToUseProfOaksPC:: .string "{CIRCLE_1} Select “PROF. OAK'S PC” on the PC.\n" .string "{CIRCLE_2} PROF. OAK will evaluate your\n" .string " POKéDEX.\n" .string "His evaluations should give you hints\n" .string "for catching more POKéMON!$" Help_Text_HowToOpenMenu:: .string "{CIRCLE_1} Press START.\n" .string "{CIRCLE_2} The MENU will open on the right.\n" .string "{CIRCLE_3} Depending on the situation, the MENU\n" .string " may feature different headings.\n" .string "The MENU will not open in certain\n" .string "situations such as when talking, doing\n" .string "something, battling, etc.$" Help_Text_HowToUseFight:: .string "{CIRCLE_1} Select “FIGHT.”\n" .string "{CIRCLE_2} Select one of the moves shown,\n" .string "and that move will be used!$" Help_Text_HowToUsePokemon2:: .string "{CIRCLE_1} Select “POKéMON.”\n" .string "{CIRCLE_2} Select the POKéMON in your party\n" .string " that you want to use.\n" .string "{CIRCLE_3} If you have two or more POKéMON\n" .string " with you, they may be switched by\n" .string " selecting “SHIFT.” Check POKéMON\n" .string " data by selecting “SUMMARY.”$" Help_Text_HowToUseShift:: .string "This command switches the POKéMON in\n" .string "battle with another one in your party.\n" .string "{CIRCLE_1} Select the POKéMON to be sent out.\n" .string "{CIRCLE_2} Select “SHIFT.”\n" .string "{CIRCLE_3} The selected POKéMON will switch\n" .string " places with the POKéMON in battle!$" Help_Text_HowToUseSummary2:: .string "{CIRCLE_1} Select “SUMMARY.”\n" .string "{CIRCLE_2} Press left or right on the {PLUS} Control\n" .string " Pad to check the information:\n" .string " “POKéMON INFO”\n" .string " “POKéMON SKILLS”\n" .string " “KNOWN MOVES”$" Help_Text_HowToUseBag2:: .string "{CIRCLE_1} Select “BAG.”\n" .string "{CIRCLE_2} Press left or right on the {PLUS} Control\n" .string " Pad to check the data headings:\n" .string " “ITEMS”\n" .string " “KEY ITEMS”\n" .string " “POKé BALLS”\n" .string " Press up or down to select an item.$" Help_Text_HowToReadPokedex:: .string "{CIRCLE_1} POKéMON that you have caught are\n" .string " identified by a POKé BALL mark on\n" .string " the POKéDEX list.\n" .string "{CIRCLE_2} A caught POKéMON will provide a\n" .string " large amount of data.\n" .string "{CIRCLE_3} Select “NEXT DATA” to display the\n" .string " TOWN MAP with its habitat(s).$" Help_Text_HowToUseHomePC:: .string "{CIRCLE_1} Go up to the PC at home, then press\n" .string " the A Button.\n" .string "{CIRCLE_2} The PC will turn on.\n" .string "{CIRCLE_3} Select either “ITEM STORAGE” or\n" .string " “MAILBOX.”$" Help_Text_HowToUseItemStorage:: .string "{CIRCLE_1} Select “WITHDRAW ITEM” to withdraw\n" .string " an item stored on your PC.\n" .string "{CIRCLE_2} Select “DEPOSIT ITEM” to put \n" .string " an item from your BAG into your PC.$" Help_Text_HowToUseWithdrawItem2:: .string "{CIRCLE_1} Select “WITHDRAW ITEM.”\n" .string "{CIRCLE_2} Select the item to be withdrawn.\n" .string "{CIRCLE_3} The item can be withdrawn and\n" .string " placed in the BAG's ITEMS POCKET.\n" .string " It may also be directly given to a\n" .string " POKéMON to hold.$" Help_Text_HowToUseDepositItem2:: .string "{CIRCLE_1} Select “DEPOSIT ITEM.”\n" .string "{CIRCLE_2} Select the item in the BAG to be\n" .string " deposited using the {PLUS} Control Pad.\n" .string "{CIRCLE_3} If there is nothing in the BAG, this\n" .string " command can't be used!$" Help_Text_HowToUseMailbox2:: .string "When MAIL is taken from a POKéMON,\n" .string "it is moved to the MAILBOX. If it has\n" .string "no MAIL, the MAILBOX can't be used.\n" .string "{CIRCLE_1} Select MAIL by name to read it or\n" .string " make a POKéMON hold it.$" Help_Text_HowToUseRun:: .string "You may not “RUN” from a TRAINER\n" .string "battle!\n" .string "{CIRCLE_1} You may “RUN” from a wild POKéMON.\n" .string "{CIRCLE_2} Your chance of escape is improved\n" .string " if your POKéMON in battle is fast.$" Help_Text_HowToRegisterKeyItem:: .string "You may “REGISTER” certain key items\n" .string "for instant use by pressing SELECT!\n" .string "{CIRCLE_1} Open the “KEY ITEMS” POCKET.\n" .string "{CIRCLE_2} Select the key item, then select\n" .string " “REGISTER.”\n" .string "{CIRCLE_3} Only items that have a use in the\n" .string " field can be registered.$" Help_Text_HowToUseBall:: .string "{CIRCLE_1} Select to throw the special POKé\n" .string " BALL used only in the SAFARI ZONE.\n" .string "When wild POKéMON appear, throw lots\n" .string "of SAFARI BALLS to catch them!$" Help_Text_HowToUseBait:: .string "{CIRCLE_1} Select to throw the special food\n" .string " used only in the SAFARI ZONE.\n" .string "It is POKéMON food rolled up into\n" .string "a ball for easy eating. When BAIT is\n" .string "thrown, the wild POKéMON may get\n" .string "attracted by it, and may not flee!$" Help_Text_HowToUseRock:: .string "{CIRCLE_1} Select to throw a rock lying on\n" .string " the ground in the SAFARI ZONE.\n" .string "Throwing a rock at a POKéMON may \n" .string "make it run away, but it becomes easier\n" .string "to catch!$" Help_Text_HowToUseHallOfFame:: .string "{CIRCLE_1} Select “HALL OF FAME” on the PC.\n" .string "{CIRCLE_2} The POKéMON that have entered the\n" .string " HALL OF FAME can be examined.$" Help_Text_HowToUseKeySystemSettings:: .string "{CIRCLE_1} Select “KEY SYSTEM SETTINGS” on\n" .string " the MENU.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad to select a key, then press left\n" .string " or right to alter the settings.\n" .string "{CIRCLE_3} Press the A or B Button after\n" .string " making changes to save them.$" Help_Text_HowToSortBag:: .string "{CIRCLE_1} Press START while in the BAG menu.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad to select a sorting scheme.\n" .string "Depending on the POCKET, items can be\n" .string "sorted by NAME, TYPE, AMOUNT, and\n" .string "NUMBER.$" Help_Text_HP:: .string "HP$" Help_Text_EXP:: .string "EXP. {LEFT_PAREN}EXP. Points{RIGHT_PAREN}$" Help_Text_Moves:: .string "MOVES$" Help_Text_Attack:: .string "ATTACK$" Help_Text_Defense:: .string "DEFENSE$" Help_Text_SpAtk:: .string "SP. ATK$" Help_Text_SpDef:: .string "SP. DEF$" Help_Text_Speed:: .string "SPEED$" Help_Text_Level:: .string "Lv. {LEFT_PAREN}Level{RIGHT_PAREN}$" Help_Text_Type:: .string "TYPE$" Help_Text_OT:: .string "OT$" Help_Text_Item:: .string "ITEM$" Help_Text_Ability:: .string "ABILITY$" Help_Text_Money:: .string "MONEY$" Help_Text_MoveType:: .string "MOVE TYPE$" Help_Text_Nature:: .string "NATURE$" Help_Text_IDNo:: .string "ID No.$" Help_Text_PP:: .string "PP$" Help_Text_Power:: .string "POWER$" Help_Text_Accuracy:: .string "ACCURACY$" Help_Text_FNT:: .string "FNT$" Help_Text_Items:: .string "ITEMS$" Help_Text_KeyItems:: .string "KEY ITEMS$" Help_Text_PokeBalls:: .string "POKé BALLS$" Help_Text_Pokedex:: .string "POKéDEX$" Help_Text_PlayTime:: .string "PLAY TIME$" Help_Text_Badges:: .string "BADGES$" Help_Text_TextSpeed:: .string "TEXT SPEED$" Help_Text_BattleScene:: .string "BATTLE SCENE$" Help_Text_BattleStyle:: .string "BATTLE STYLE$" Help_Text_Sound:: .string "SOUND$" Help_Text_ButtonMode:: .string "BUTTON MODE$" Help_Text_Frame:: .string "FRAME$" Help_Text_Cancel2:: .string "SAVE AND EXIT$" Help_Text_TM:: .string "TM$" Help_Text_HM:: .string "HM$" Help_Text_HMMove:: .string "HM MOVE$" Help_Text_Evolution:: .string "EVOLUTION$" Help_Text_StatusProblem:: .string "STATUS PROBLEM$" Help_Text_Pokemon:: .string "POKéMON$" Help_Text_IDNo2:: .string "ID No.$" Help_Text_Money2:: .string "MONEY$" Help_Text_Badges2:: .string "BADGES$" Help_Text_Version:: .string "VERSION$" Help_Text_Difficulty:: .string "DIFFICULTY$" Help_Text_Nuzlocke:: .string "NUZLOCKE$" Help_Text_Nuzlocke_Catching:: .string " Catching POKéMON in NUZLOCKE MODE$" Help_Text_NuzlockeLosing:: .string " Losing battles in NUZLOCKE MODE$" Help_Text_IvCalc:: .string "IV CALCULATION$" Help_Text_EvCalc:: .string "EV CALCULATION$" Help_Text_NoFreeHeals:: .string "NO FREE HEALS$" Help_Text_DefineHP:: .string "HP indicates a POKéMON's vitality.\n" .string "If a POKéMON's HP drops to zero, it\l" .string "faints and is unable to battle.\l" .string "So, the key in battle is to try to\l" .string "reduce the foe's HP to zero.\l" .string "If your POKéMON are hurt, restore their\l" .string "HP at a POKéMON CENTER or use items.$" Help_Text_DefineEXP:: .string "EXP. Points stands for “Experience\n" .string "Points.” POKéMON gain EXP. Points by\l" .string "participating in winning battles.\l" .string "When a POKéMON accumulates sufficient\l" .string "EXP. Points, it levels up. The EXP. Bar\l" .string "indicates accumulated EXP. Points.\l" .string "It returns to zero upon leveling up.$" Help_Text_DefineMoves:: .string "POKéMON may learn up to four different\n" .string "moves. There are many kinds of moves\l" .string "including attacks and those with\l" .string "special effects. The kinds of moves\l" .string "that can be learned vary for each\l" .string "POKéMON. Some moves can be learned\l" .string "from items.$" Help_Text_DefineAttack:: .string "ATTACK indicates the power of an\n" .string "offensive move. The higher this stat,\l" .string "the more powerful the move.\l" .string "It is applied for the following move\l" .string "types: NORMAL, POISON, GROUND,\l" .string "FLYING, BUG, FIGHTING, ROCK, GHOST,\l" .string "and STEEL.$" Help_Text_DefineDefense:: .string "DEFENSE indicates the resistance a\n" .string "POKéMON has against physical attacks.\l" .string "The higher this stat, the less damage\l" .string "sustained from a foe's physical hit.$" Help_Text_DefineSpAtk:: .string "SP. ATK (Special Attack) indicates the\n" .string "power of a special attack move.\l" .string "The higher this stat, the more powerful\l" .string "the special attack move.\l" .string "It is applied for the following move\l" .string "types: FIRE, WATER, ELECTRIC, GRASS,\l" .string "ICE, PSYCHIC, DRAGON, and DARK.$" Help_Text_DefineSpDef:: .string "SP. DEF (Special Defense) indicates\n" .string "the resistance a POKéMON has against\l" .string "special attacks.\l" .string "The higher this stat, the less damage\l" .string "sustained from a foe's special attack.$" Help_Text_DefineSpeed:: .string "SPEED indicates the agility of a\n" .string "POKéMON. If this stat exceeds the foe's\l" .string "in battle, the POKéMON can make a move\l" .string "before its slower opponent.$" Help_Text_DefineLevel:: .string "Lv. (Level) indicates the growth and\n" .string "strength of a POKéMON.\l" .string "In general, when a POKéMON levels up,\l" .string "its stats such as HP, ATTACK, and\l" .string "DEFENSE rise, making it stronger.\l" .string "POKéMON may learn a new move upon\l" .string "leveling up.$" Help_Text_DefineType:: .string "POKéMON and moves are classified by\n" .string "type. Every type has advantageous and\l" .string "disadvantageous matchups against\l" .string "other types. For example, like a rock-\l" .string "paper-scissors game, the WATER type is\l" .string "strong against the FIRE type and weak\l" .string "against the GRASS type.$" Help_Text_DefineOT:: .string "OT stands for “Original TRAINER,”\n" .string "the first TRAINER to have caught the\l" .string "selected POKéMON.\l" .string "Even if the POKéMON is traded, the OT\l" .string "name will remain unchanged.$" Help_Text_DefineItem:: .string "All POKéMON can be made to hold one\n" .string "item each. Some items will be used by\l" .string "the POKéMON automatically in certain\l" .string "situations. To make a POKéMON hold an\l" .string "item, select the item from the BAG and\l" .string "“GIVE” it to the POKéMON.$" Help_Text_DefineAbility:: .string "All POKéMON have a special ABILITY.\n" .string "There are many different kinds of these\l" .string "abilities, some used in battle, some\l" .string "elsewhere. The abilities differ from\l" .string "species to species. Some species may\l" .string "have more than one kind of ability.$" Help_Text_DefineMoney:: .string "Whenever you win a battle against a\n" .string "TRAINER, you are given prize money.\l" .string "Save up your prize money so you can\l" .string "enjoy shopping at POKéMON MARTS!$" Help_Text_DefineMoveType:: .string "Moves are also classified by types.\n" .string "If a POKéMON of a certain type uses\l" .string "a move of the same type, the move's\l" .string "power is boosted. If the move's type\l" .string "has a matchup advantage against the\l" .string "target, its effectiveness is also\l" .string "boosted.$" Help_Text_DefineNature:: .string "All POKéMON have a personality,\n" .string "or “NATURE.” The POKéMON's\l" .string "nature appears to affect how the\l" .string "POKéMON will grow upon leveling up.$" Help_Text_DefineIDNo:: .string "The ID No. is a special number assigned\n" .string "specifically to you as a TRAINER.\l" .string "Together with the OT name, the ID No.\l" .string "is used to precisely identify the\l" .string "Original TRAINER.\l" .string "The ID No. does not change even if the\l" .string "POKéMON is traded.$" Help_Text_DefinePP:: .string "PP stands for “Power Points.”\n" .string "It indicates the number of times a\l" .string "certain move can be used in battle.\l" .string "Like HP, PP can be restored by visiting\l" .string "a POKéMON CENTER or using certain\l" .string "items.$" Help_Text_DefinePower:: .string "POWER indicates the strength of an\n" .string "attack. The higher this number, the\l" .string "greater the damage that can be\l" .string "inflicted on the foe!$" Help_Text_DefineAccuracy:: .string "ACCURACY indicates the probability of\n" .string "the move hitting the foe.\l" .string "The higher this number, the more likely\l" .string "the move will strike the target.$" Help_Text_DefineFNT:: .string "FNT stands for “fainted.”\n" .string "A POKéMON faints if its HP is reduced\l" .string "to zero. It becomes incapable of taking\l" .string "part in battle.\l" .string "Restore a fainted POKéMON at a POKéMON\l" .string "CENTER, or use an item.$" Help_Text_DefineItems:: .string "Ordinary items bought at any POKéMON\n" .string "MART are placed in the ITEMS POCKET.\l" .string "Items may be used, given to a POKéMON\l" .string "to hold, or tossed out as garbage.$" Help_Text_DefineKeyItems:: .string "Important items that you find or\n" .string "receive from people are placed in the\l" .string "KEY ITEMS POCKET. Key items may be\l" .string "used, and some may be registered\l" .string "for use instantly with SELECT. Once\l" .string "registered, the item can be used\l" .string "without opening the MENU and BAG.$" Help_Text_DefinePokeBalls:: .string "POKé BALLS, which are used for\n" .string "catching wild POKéMON, are placed in\l" .string "the POKé BALLS POCKET.\l" .string "POKé BALLS may be bought at POKéMON\l" .string "MARTS. They may be used, given to a\l" .string "POKéMON to hold, or tossed out as\l" .string "garbage.$" Help_Text_DefinePokedex:: .string "This indicates the number of species of\n" .string "POKéMON you have caught and/or\l" .string "evolved to fill the POKéDEX.\l" .string "Try hard to catch all sorts of\l" .string "POKéMON!$" Help_Text_DefinePlayTime:: .string "This is the total amount of time that\n" .string "you have played this game.$" Help_Text_DefineBadges:: .string "The POKéMON LEAGUE BADGES that you\n" .string "have won are registered and shown.\l" .string "Earn BADGES by defeating GYM LEADERS\l" .string "in various cities and towns.$" Help_Text_DefineTextSpeed:: .string "You can adjust how quickly the text is\n" .string "displayed. Choose one: SLOW, MID,\l" .string "FAST, or INSTANT.$" Help_Text_DefineBattleScene:: .string "Press the A Button to go to a submenu\n" .string "with options to change battle-related\n" .string "animations and delays.$" Help_Text_DefineBattleStyle:: .string "You can choose whether or not you can\n" .string "switch POKéMON after a foe faints.\l" .string "Set to “SWITCH” if you would like the\l" .string "chance to switch POKéMON after a foe\l" .string "faints. Set to “PREDICT” to be told\l" .string "what the foe's next POKéMON will be\l" .string "beforehand. “SET” turns this off.$" Help_Text_DefineSound:: .string "You can choose between MONO and\n" .string "STEREO sound output.$" Help_Text_DefineButtonMode:: .string "Set to “HELP” to display help messages\n" .string "by pressing the L Button.\l" .string "Set to “LR” to enable the switching\l" .string "of the POKéDEX pages and BAG POCKETS\l" .string "using the L and R Buttons.\l" .string "Set to “L=A” to make the L Button\l" .string "work the same as the A Button.$" Help_Text_DefineFrame:: .string "You may choose the design of the frame\n" .string "around certain menus. Try them out and\l" .string "see what you like.$" Help_Text_DefineCancel2:: .string "The settings will be changed to the\n" .string "selections shown in red, and you will\l" .string "return to the MENU.$" Help_Text_DefineTM:: .string "A TM (Technical Machine) is a device\n" .string "used to teach a move to a POKéMON.\l" .string "There are many different kinds.\l" .string "Moves can be taught only to those\l" .string "POKéMON capable of using them.\l" .string "A TM breaks after a single use.$" Help_Text_DefineHM:: .string "An HM (Hidden Machine) is a device used\n" .string "to teach a HIDDEN move to a POKéMON.\l" .string "A HIDDEN move can be taught only to\l" .string "those POKéMON capable of using it.\l" .string "Unlike a TM, an HM can be used over\l" .string "and over. A HIDDEN move can be tough\l" .string "for a POKéMON to forget.$" Help_Text_DefineHMMove:: .string "HIDDEN moves are those that are\n" .string "especially important for your\l" .string "adventure. To use such a move outside\l" .string "of battle, open the “POKéMON” MENU\l" .string "and make the POKéMON that knows the\l" .string "move use it. A fainted POKéMON may use\l" .string "a HIDDEN move outside of battle.$" Help_Text_DefineEvolution:: .string "Among POKéMON, there are some that\n" .string "undergo major changes (evolution) upon\l" .string "growing to certain levels. Evolution\l" .string "causes a POKéMON to alter form, change\l" .string "its name, and perhaps change the moves\l" .string "it may learn. Some POKéMON evolve\l" .string "due to reasons other than leveling up.$" Help_Text_DefineStatusProblem:: .string "Status problems include:\n" .string "Sleep: Can't use moves.\l" .string "Poison: Causes steady HP loss.\l" .string "Paralysis: May prevent moves.\l" .string "Burn: HP loss and lowers ATTACK.\l" .string "Freeze: Can't use moves.\l" .string "These can be healed with items, etc.$" Help_Text_DefinePokemon:: .string "POKéMON is a name given to describe\n" .string "wondrous creatures that inhabit all\l" .string "corners of this world.\l" .string "People raise POKéMON to be their pets,\l" .string "use them for battling, and so on.$" Help_Text_DefineIDNo2:: .string "The ID No. is a special number assigned\n" .string "specifically to you as a TRAINER.\l" .string "Together with the OT name, the ID No.\l" .string "is used to precisely identify the\l" .string "Original TRAINER.\l" .string "The ID No. does not change even if the\l" .string "POKéMON is traded.$" Help_Text_DefineMoney2:: .string "Whenever you win a battle against a\n" .string "TRAINER, you are given prize money.\l" .string "Save up your prize money so you can\l" .string "enjoy shopping at POKéMON MARTS!$" Help_Text_DefineBadges2:: .string "This indicates the number of POKéMON\n" .string "LEAGUE BADGES that you have won.\l" .string "Earn BADGES by defeating GYM LEADERS\l" .string "in various cities and towns.$" Help_Text_DefineVersion:: .string "You can change your game version\n" .string "between FIRERED VERSION and\l" .string "LEAFGREEN VERSION. Your game version\l" .string "determines what POKéMON are available,\l" .string "themes graphics for some interfaces,\l" .string "what the titlescreen looks like, and the\l" .string "text entries of your POKéDEX data.$" Help_Text_DefineDifficulty:: .string "You can adjust the game's difficulty.\n" .string "In EASY MODE, POKéMON battles with\l" .string "TRAINERS are easier than normal.\l" .string "In CHALLENGE MODE, POKéMON battles\l" .string "with TRAINERS are more difficult than\l" .string "normal and BADGE boosts are disabled.\l" .string "NORMAL MODE is the standard difficulty.$" Help_Text_DefineNuzlocke:: .string "Turning on the NUZLOCKE key imposes\n" .string "additional rules on your journey to\l" .string "increase the difficulty. POKéMON that\l" .string "have fainted can't be healed, and only\l" .string "the first wild POKéMON seen in an area\l" .string "is usable in battle. If you run out of\l" .string "POKéMON, this key can be turned off.$" Help_Text_DefineNuzlocke_Catching:: .string "Only the first POKéMON encountered in\n" .string "an area will be usable in battle.\l" .string "Further POKéMON caught in the area will\l" .string "be fainted upon capture. If the first\l" .string "encounter is a POKéMON that was caught\l" .string "previously and wasn't fainted, it won't\l" .string "count as the first if not caught.$" Help_Text_DefineNuzlockeLosing:: .string "If you lose a battle and white out in\n" .string "NUZLOCKE MODE, a non-fainted POKéMON\l" .string "will be withdrawn from the PC STORAGE\l" .string "SYSTEM. If you don't have any POKéMON\l" .string "left that can battle, you will be given\l" .string "the choice to soft reset or to turn off\l" .string "NUZLOCKE MODE and heal your party.$" Help_Text_DefineIvCalc:: .string "You can alter how your POKéMON's\n" .string "potential, or INDIVIDUAL VALUES,\l" .string "affect their stats. ALL ZERO calculates\l" .string "stats as if there is no potential, ALL\l" .string "PERFECT with the best potential, and\l" .string "STANDARD with actual IVs. This only\l" .string "alters calculation, not actual IVs.$" Help_Text_DefineEvCalc:: .string "You can adjust how your POKéMON's\n" .string "growth from defeating other POKéMON,\l" .string "or EFFORT VALUES, affect their stats.\l" .string "ALL ZERO makes stats not affected by\l" .string "EFFORT VALUES. STANDARD is the normal\l" .string "way. This only alters stat calculation,\l" .string "POKéMON will still gain EFFORT VALUES.$" Help_Text_DefineNoFreeHeals:: .string "You can disable free POKéMON party\n" .string "heals by switching NO FREE HEALS to ON.\l" .string "This will disable several full party\l" .string "heals, most notably from POKéMON\l" .string "CENTERS. Additionally, the PC STORAGE\l" .string "SYSTEM will not heal POKéMON sent to\l" .string "it when ON. To heal, use items instead.$" Help_Text_TheHelpSystem:: .string "The HELP System$" Help_Text_TheGame:: .string "The game$" Help_Text_WirelessAdapter:: .string "Wireless Adapter$" Help_Text_GameFundamentals1:: .string "Game fundamentals 1$" Help_Text_GameFundamentals2:: .string "Game fundamentals 2$" Help_Text_GameFundamentals3:: .string "Game fundamentals 3$" Help_Text_WhatArePokemon:: .string "What are POKéMON?$" Help_Text_DescTheHelpSystem:: .string "The help messages change depending on\n" .string "how much you have progressed in the\l" .string "game. They are designed to support you\l" .string "when you need them. If there is\l" .string "anything that you don't understand,\l" .string "please look up the HELP System!$" Help_Text_DescTheGame:: .string "You become the main character to\n" .string "explore the world of POKéMON!\l" .string "By talking to people and solving\l" .string "mysteries, new paths will open to you.\l" .string "Strive for the goal together with your\l" .string "wonderful POKéMON!$" Help_Text_DescWirelessAdapter:: .string "This game communicates over a wireless\n" .string "link using the Wireless Adapter.\p" .string "Go wireless anywhere, anytime, and\n" .string "with anybody!\p" .string "Try playing with the Wireless Adapter\n" .string "always attached!$" Help_Text_DescGameFundamentals1:: .string "Visit every city and town, travel every\n" .string "road, explore every cave, and face\l" .string "every challenge as you strive to\l" .string "become the greatest TRAINER of\l" .string "POKéMON!$" Help_Text_DescGameFundamentals2:: .string "On your adventure, you will be faced\n" .string "with many obstacles. Every obstacle\l" .string "can be overcome by doing something\l" .string "or by solving mysteries. Some obstacles\l" .string "are affected by something that happens\l" .string "far away.$" Help_Text_DescGameFundamentals3:: .string "Some of the obstacles in your way can\n" .string "be removed once your POKéMON learn\l" .string "specific moves.$" Help_Text_DescWhatArePokemon:: .string "POKéMON are wondrous creatures that\n" .string "are shrouded in mystery. You may meet\l" .string "them all over the world…in tall\l" .string "grass, caves, the sea, and more.\l" .string "They appear to grow obedient to the\l" .string "TRAINERS that caught them.$" Help_Text_UsingTypeMatchupList:: .string "Using the Type Matchup List$" Help_Text_OwnMoveDark:: .string "Own move type: DARK$" Help_Text_OwnPokemonDark:: .string "Own POKéMON type: DARK$" Help_Text_OwnMoveRock:: .string "Own move type: ROCK$" Help_Text_OwnPokemonRock:: .string "Own POKéMON type: ROCK$" Help_Text_OwnMovePsychic:: .string "Own move type: PSYCHIC$" Help_Text_OwnPokemonPsychic:: .string "Own POKéMON type: PSYCHIC$" Help_Text_OwnMoveFighting:: .string "Own move type: FIGHTING$" Help_Text_OwnPokemonFighting:: .string "Own POKéMON type: FIGHTING$" Help_Text_OwnMoveGrass:: .string "Own move type: GRASS$" Help_Text_OwnPokemonGrass:: .string "Own POKéMON type: GRASS$" Help_Text_OwnMoveGhost:: .string "Own move type: GHOST$" Help_Text_OwnPokemonGhost:: .string "Own POKéMON type: GHOST$" Help_Text_OwnMoveIce:: .string "Own move type: ICE$" Help_Text_OwnPokemonIce:: .string "Own POKéMON type: ICE$" Help_Text_OwnMoveGround:: .string "Own move type: GROUND$" Help_Text_OwnPokemonGround:: .string "Own POKéMON type: GROUND$" Help_Text_OwnMoveElectric:: .string "Own move type: ELECTRIC$" Help_Text_OwnPokemonElectric:: .string "Own POKéMON type: ELECTRIC$" Help_Text_OwnMovePoison:: .string "Own move type: POISON$" Help_Text_OwnPokemonPoison:: .string "Own POKéMON type: POISON$" Help_Text_OwnMoveDragon:: .string "Own move type: DRAGON$" Help_Text_OwnPokemonDragon:: .string "Own POKéMON type: DRAGON$" Help_Text_OwnMoveNormal:: .string "Own move type: NORMAL$" Help_Text_OwnPokemonNormal:: .string "Own POKéMON type: NORMAL$" Help_Text_OwnMoveSteel:: .string "Own move type: STEEL$" Help_Text_OwnPokemonSteel:: .string "Own POKéMON type: STEEL$" Help_Text_OwnMoveFlying:: .string "Own move type: FLYING$" Help_Text_OwnPokemonFlying:: .string "Own POKéMON type: FLYING$" Help_Text_OwnMoveFire:: .string "Own move type: FIRE$" Help_Text_OwnPokemonFire:: .string "Own POKéMON type: FIRE$" Help_Text_OwnMoveWater:: .string "Own move type: WATER$" Help_Text_OwnPokemonWater:: .string "Own POKéMON type: WATER$" Help_Text_OwnMoveBug:: .string "Own move type: BUG$" Help_Text_OwnPokemonBug:: .string "Own POKéMON type: BUG$" Help_Text_HowToUseTypeMatchupList:: .string "Depending on the matchup of the\n" .string "move type and the target POKéMON's\l" .string "type, the move's effectiveness varies:\l" .string "{CIRCLE_DOT}: Super effective!\l" .string "{TRIANGLE}: Not very effective\l" .string "{BIG_MULT_X}: Not effective at all\l" .string "(No changes for other matchups.)$" Help_Text_TypeMatchupOwnMoveDark:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: PSYCHIC, GHOST\p" .string " {TRIANGLE}: FIGHTING, DARK, STEEL$" Help_Text_TypeMatchupOwnPokemonDark:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: FIGHTING, BUG\p" .string " {TRIANGLE}: GHOST, DARK\p" .string " {BIG_MULT_X}: PSYCHIC$" Help_Text_TypeMatchupOwnMoveRock:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: FIRE, ICE, FLYING, BUG\p" .string " {TRIANGLE}: FIGHTING, GROUND, STEEL$" Help_Text_TypeMatchupOwnPokemonRock:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: WATER, GRASS, FIGHTING,\n" .string " GROUND, STEEL\p" .string " {TRIANGLE}: NORMAL, FIRE, POISON, FLYING$" Help_Text_TypeMatchupOwnMovePsychic:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: FIGHTING, POISON\p" .string " {TRIANGLE}: PSYCHIC, STEEL\p" .string " {BIG_MULT_X}: DARK$" Help_Text_TypeMatchupOwnPokemonPsychic:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: BUG, GHOST, DARK\p" .string " {TRIANGLE}: FIGHTING, PSYCHIC$" Help_Text_TypeMatchupOwnMoveFighting:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: NORMAL, ICE, ROCK, DARK, STEEL\p" .string " {TRIANGLE}: POISON, FLYING, PSYCHIC, BUG\p" .string " {BIG_MULT_X}: GHOST$" Help_Text_TypeMatchupOwnPokemonFighting:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: FLYING, PSYCHIC\p" .string " {TRIANGLE}: BUG, ROCK, DARK$" Help_Text_TypeMatchupOwnMoveGrass:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: WATER, GROUND, ROCK\p" .string " {TRIANGLE}: FIRE, GRASS, POISON, FLYING,\n" .string " BUG, DRAGON, STEEL$" Help_Text_TypeMatchupOwnPokemonGrass:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: FIRE, ICE, POISON, FLYING, BUG\p" .string " {TRIANGLE}: WATER, ELECTRIC, GRASS, GROUND$" Help_Text_TypeMatchupOwnMoveGhost:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: PSYCHIC, GHOST\p" .string " {TRIANGLE}: DARK, STEEL\p" .string " {BIG_MULT_X}: NORMAL$" Help_Text_TypeMatchupOwnPokemonGhost:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: GHOST, DARK\p" .string " {TRIANGLE}: POISON, BUG\p" .string " {BIG_MULT_X}: NORMAL, FIGHTING$" Help_Text_TypeMatchupOwnMoveIce:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: GRASS, GROUND, FLYING, DRAGON\p" .string " {TRIANGLE}: FIRE, WATER, ICE, STEEL$" Help_Text_TypeMatchupOwnPokemonIce:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: FIRE, FIGHTING, ROCK, STEEL\p" .string " {TRIANGLE}: ICE$" Help_Text_TypeMatchupOwnMoveGround:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: FIRE, ELECTRIC, POISON, ROCK,\n" .string " STEEL\p" .string " {TRIANGLE}: GRASS, BUG\n" .string " {BIG_MULT_X}: FLYING$" Help_Text_TypeMatchupOwnPokemonGround:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: WATER, GRASS, ICE\p" .string " {TRIANGLE}: POISON, ROCK\p" .string " {BIG_MULT_X}: ELECTRIC$" Help_Text_TypeMatchupOwnMoveElectric:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: WATER, FLYING\p" .string " {TRIANGLE}: ELECTRIC, GRASS, DRAGON\p" .string " {BIG_MULT_X}: GROUND$" Help_Text_TypeMatchupOwnPokemonElectric:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: GROUND\p" .string " {TRIANGLE}: ELECTRIC, FLYING, STEEL$" Help_Text_TypeMatchupOwnMovePoison:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: GRASS\p" .string " {TRIANGLE}: POISON, GROUND, ROCK, GHOST\p" .string " {BIG_MULT_X}: STEEL$" Help_Text_TypeMatchupOwnPokemonPoison:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: GROUND, PSYCHIC\p" .string " {TRIANGLE}: GRASS, FIGHTING, POISON, BUG$" Help_Text_TypeMatchupOwnMoveDragon:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: DRAGON\p" .string " {TRIANGLE}: STEEL$" Help_Text_TypeMatchupOwnPokemonDragon:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: ICE, DRAGON\p" .string " {TRIANGLE}: FIRE, WATER, ELECTRIC, GRASS$" Help_Text_TypeMatchupOwnMoveNormal:: .string "Effect on the opposing POKéMON:\p" .string " {TRIANGLE}: ROCK, STEEL\p" .string " {BIG_MULT_X}: GHOST$" Help_Text_TypeMatchupOwnPokemonNormal:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: FIGHTING\p" .string " {BIG_MULT_X}: GHOST$" Help_Text_TypeMatchupOwnMoveSteel:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: ICE, ROCK\p" .string " {TRIANGLE}: FIRE, WATER, ELECTRIC, STEEL$" Help_Text_TypeMatchupOwnPokemonSteel:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: FIRE, FIGHTING, GROUND\n" .string " {TRIANGLE}: NORMAL, GRASS, ICE, FLYING,\l" .string " PSYCHIC, BUG, ROCK, GHOST,\l" .string " DRAGON, DARK, STEEL\l" .string " {BIG_MULT_X}: POISON$" Help_Text_TypeMatchupOwnMoveFlying:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: GRASS, FIGHTING, BUG\p" .string " {TRIANGLE}: ELECTRIC, ROCK, STEEL$" Help_Text_TypeMatchupOwnPokemonFlying:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: ELECTRIC, ICE, ROCK\p" .string " {TRIANGLE}: GRASS, FIGHTING, BUG\p" .string " {BIG_MULT_X}: GROUND$" Help_Text_TypeMatchupOwnMoveFire:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: GRASS, ICE, BUG, STEEL\p" .string " {TRIANGLE}: FIRE, WATER, ROCK, DRAGON$" Help_Text_TypeMatchupOwnPokemonFire:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: WATER, GROUND, ROCK\p" .string " {TRIANGLE}: FIRE, GRASS, ICE, BUG, STEEL$" Help_Text_TypeMatchupOwnMoveWater:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: FIRE, GROUND, ROCK\p" .string " {TRIANGLE}: WATER, GRASS, DRAGON$" Help_Text_TypeMatchupOwnPokemonWater:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: ELECTRIC, GRASS\p" .string " {TRIANGLE}: FIRE, WATER, ICE, STEEL$" Help_Text_TypeMatchupOwnMoveBug:: .string "Effect on the opposing POKéMON:\p" .string " {CIRCLE_DOT}: GRASS, PSYCHIC, DARK\p" .string " {TRIANGLE}: FIRE, FIGHTING, POISON,\n" .string " FLYING, GHOST, STEEL$" Help_Text_TypeMatchupOwnPokemonBug:: .string "Effect of foe's move on own POKéMON:\p" .string " {CIRCLE_DOT}: FIRE, FLYING, ROCK\p" .string " {TRIANGLE}: GRASS, FIGHTING, GROUND$" Help_Text_UsingOptionsSubmenu:: .string " Using “BATTLE SCENE”$" Help_Text_HowToUseOptionSubmenu:: .string "{CIRCLE_1} Select “BATTLE SCENE” on the MENU.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad to select an optional item, then\n" .string " press left or right to alter the\n" .string " settings.\n" .string "{CIRCLE_3} Press the A or B Button after\n" .string " making changes to go back.$" Help_Text_DefineBattleTransitions:: .string "Set this option to OFF to skip the\n" .string "animations that play while transitioning\n" .string "from the field to a battle.\n" .string "When set to OFF, the screen cuts to\n" .string "black and then instantly moves to the\n" .string "battlefield. This does not skip some\n" .string "special TRAINER battle transitions.$" Help_Text_DefineBattleIntroAnims:: .string "Set this option to OFF to skip the\n" .string "sliding animations that happen at the\n" .string "start of every battle.$" Help_Text_DefineMoveAnimations:: .string "Set this option to OFF to disable\n" .string "POKéMON move animations in battle.\n" .string "\n" .string "Additionally, pressing the A or B\n" .string "Buttons will skip in-battle text\n" .string "delays when this is set to OFF.$" Help_Text_DefineHpBarAnimSpeed:: .string "You can adjust how quickly the health\n" .string "bars animate. Choose one: STANDARD,\n" .string "FAST, FASTER, INSTANT.$" Help_Text_DefineExpBarAnimSpeed:: .string "You can adjust how quickly the\n" .string "Experience bar animates. Choose\n" .string "either STANDARD or INSTANT.$" Help_Text_DefineBack:: .string "The settings will be changed to the\n" .string "selections shown in red, and you will\n" .string "return to the OPTION MENU.$" Help_Text_BattleTransitions:: .string "BATTLE TRANSITIONS$" Help_Text_BattleIntroAnim:: .string "BATTLE INTRO ANIM$" Help_Text_MoveAnimations:: .string "MOVE ANIMATIONS$" Help_Text_HpBarAnimSpeed:: .string "HP BAR ANIM SPEED$" Help_Text_ExpBarAnimSpeed:: .string "EXP. BAR ANIM SPEED$" Help_Text_Back:: .string "BACK$" Help_Text_AdvancedKeys:: .string "ADVANCED KEYS$" Help_Text_DefineAdvancedKeys:: .string "Press the A Button to go to a submenu\n" .string "with options to modify the difficulty\n" .string "by changing experience gain or adding\n" .string "additional rules onto the gameplay\n" .string "experience.$" Help_Text_DefineAdvancedKeysBack:: .string "The settings will be changed to the\n" .string "selections shown in red, and you will\n" .string "return to the KEY SYSTEM MENU.$" Help_Text_UsingKeySystemSubmenu:: .string " Using “ADVANCED KEYS”$" Help_Text_HowToUseKeySystemSubmenu:: .string "{CIRCLE_1} Select “ADVANCED KEYS” on the MENU.\n" .string "{CIRCLE_2} Press up or down on the {PLUS} Control\n" .string " Pad to select an optional item, then\n" .string " press left or right to alter the\n" .string " settings.\n" .string "{CIRCLE_3} Press the A or B Button after\n" .string " making changes to go back.$" Help_Text_ExpMod:: .string "EXP. MODIFIER$" Help_Text_DefineExpMod:: .string "This option allows you to modify the\n" .string "amount of Experience Points your\l" .string "POKéMON earn from battle.\l" .string "0× disables Experience Point gains.\l" .string "1/2× halves given Experience Points.\l" .string "1× is the standard modifier.\l" .string "2× doubles given Experience Points.$" Help_Text_FRExclusives:: .string " POKéMON exclusive to FIRERED$" Help_Text_LGExclusives:: .string " POKéMON exclusive to LEAFGREEN$" Help_Text_DefineFRExclusives:: .string "The POKéMON exclusive to FIRERED\n" .string "VERSION are EKANS, ODDISH, PSYDUCK,\l" .string "GROWLITHE, SHELLDER, SCYTHER,\l" .string "ELECTABUZZ, WOOPER, MURKROW,\l" .string "QWILFISH, DELIBIRD, SKARMORY,\l" .string "LATIOS, and their evolutionary\l" .string "relatives.$" Help_Text_DefineLGExclusives:: .string "The POKéMON exclusive to LEAFGREEN\n" .string "VERSION are SANDSHREW, VULPIX,\l" .string "BELLSPROUT, SLOWPOKE, STARYU,\l" .string "MAGMAR, PINSIR, MARILL,\l" .string "MISDREAVUS, SNEASEL, REMORAID,\l" .string "MANTINE, LATIAS, and their\l" .string "evolutionary relatives.$" ================================================ FILE: data/text/ingame_trade.inc ================================================ Trade_Text_LookingForMonWannaTradeForMon:: .string "I'm looking for the POKéMON\n" .string "{STR_VAR_1}!\p" .string "Wanna trade one for my\n" .string "{STR_VAR_2}?$" Trade_Text_AwwOhWell:: .string "Awww!\n" .string "Oh, well…$" Trade_Text_WhatThatsNoMon:: .string "What?\n" .string "That's no {STR_VAR_1}!$" Trade_Text_HeyThanks:: .string "Hey, thanks!$" Trade_Text_IsntMyOldMonGreat:: .string "Isn't my old {STR_VAR_2} great?$" Trade_Text_DoYouHaveMonWouldYouTradeForMon:: .string "Hello, there! Do you happen to\n" .string "have a {STR_VAR_1}?\p" .string "Would you agree to a trade for\n" .string "my {STR_VAR_2}?$" Trade_Text_WellIfYouDontWantTo:: .string "Well, if you don't want to…$" Trade_Text_ThisIsntMon:: .string "Hmmm?\n" .string "This isn't a {STR_VAR_1}.\p" .string "Think of me if you get one.$" Trade_Text_Thanks:: .string "Thanks!$" Trade_Text_HasTradedMonGrownStronger:: .string "The {STR_VAR_2} that I traded you,\n" .string "has it grown stronger?$" Trade_Text_DoYouHaveMonWantToTradeForMon:: .string "Hi!\n" .string "Do you have a {STR_VAR_1}?\p" .string "Want to trade it for my\n" .string "{STR_VAR_2}?$" Trade_Text_ThatsTooBad:: .string "That's too bad.$" Trade_Text_ThisIsNoMon:: .string "…This is no {STR_VAR_1}.\p" .string "If you get one, trade it with me.$" Trade_Text_ThanksYoureAPal:: .string "Thanks, you're a pal!$" Trade_Text_HowIsMyOldMon:: .string "How is my old {STR_VAR_2}?\n" .string "My {STR_VAR_1} is doing great!$" ================================================ FILE: data/text/itemfinder.inc ================================================ Text_DugUpItemFromGround:: .string "{PLAYER} dug up one {STR_VAR_2}\n" .string "from deep in the ground.$" ================================================ FILE: data/text/new_game_intro.inc ================================================ gOtherText_NewName:: .string "NEW NAME$" gNameChoice_Green:: .string "GREEN$" gNameChoice_Red:: .string "RED$" gNameChoice_Leaf:: .string "LEAF$" gNameChoice_Fire:: .string "FIRE$" gNameChoice_Gary:: .string "GARY$" gNameChoice_Kaz:: .string "KAZ$" gNameChoice_Toru:: .string "TORU$" gNameChoice_Ash:: .string "ASH$" gNameChoice_Kene:: .string "KENE$" gNameChoice_Geki:: .string "GEKI$" gNameChoice_Jak:: .string "JAK$" gNameChoice_Janne:: .string "JANNE$" gNameChoice_Jonn:: .string "JONN$" gNameChoice_Kamon:: .string "KAMON$" gNameChoice_Karl:: .string "KARL$" gNameChoice_Taylor:: .string "TAYLOR$" gNameChoice_Oscar:: .string "OSCAR$" gNameChoice_Hiro:: .string "HIRO$" gNameChoice_Max:: .string "MAX$" gNameChoice_Jon:: .string "JON$" gNameChoice_Ralph:: .string "RALPH$" gNameChoice_Kay:: .string "KAY$" gNameChoice_Tosh:: .string "TOSH$" gNameChoice_Roak:: .string "ROAK$" gNameChoice_Omi:: .string "OMI$" gNameChoice_Jodi:: .string "JODI$" gNameChoice_Amanda:: .string "AMANDA$" gNameChoice_Hillary:: .string "HILLARY$" gNameChoice_Makey:: .string "MAKEY$" gNameChoice_Michi:: .string "MICHI$" gNameChoice_Paula:: .string "PAULA$" gNameChoice_June:: .string "JUNE$" gNameChoice_Cassie:: .string "CASSIE$" gNameChoice_Rey:: .string "REY$" gNameChoice_Seda:: .string "SEDA$" gNameChoice_Kiko:: .string "KIKO$" gNameChoice_Mina:: .string "MINA$" gNameChoice_Norie:: .string "NORIE$" gNameChoice_Sai:: .string "SAI$" gNameChoice_Momo:: .string "MOMO$" gNameChoice_Suzi:: .string "SUZI$" gControlsGuide_Text_Intro:: .string "The various buttons will be explained in\n" .string "the order of their importance.$" gControlsGuide_Text_DPad:: .string "Moves the main character.\n" .string "Also used to choose various data\n" .string "headings.$" gControlsGuide_Text_AButton:: .string "Used to confirm a choice, check\n" .string "things, chat, and scroll text.$" gControlsGuide_Text_BButton:: .string "Used to exit, cancel a choice,\n" .string "and cancel a mode.$" gControlsGuide_Text_StartButton:: .string "Press this button to open the\n" .string "MENU.$" gControlsGuide_Text_SelectButton:: .string "Used to shift items and to use\n" .string "a registered item.$" gControlsGuide_Text_LRButtons:: .string "If you need help playing the\n" .string "game, or on how to do things,\n" .string "press the L Button.$" gOakSpeech_Text_AskPlayerGender:: .string "Now tell me. Are you a boy?\n" .string "Or are you a girl?$" gPikachuIntro_Text_Page1:: .string "In the world which you are about to\n" .string "enter, you will embark on a grand\n" .string "adventure with you as the hero.\n" .string "\n" .string "Speak to people and check things\n" .string "wherever you go, be it towns, roads,\n" .string "or caves. Gather information and\n" .string "hints from every source.$" gPikachuIntro_Text_Page2:: .string "New paths will open to you by helping\n" .string "people in need, overcoming challenges,\n" .string "and solving mysteries.\n" .string "\n" .string "At times, you will be challenged by\n" .string "others and attacked by wild creatures.\n" .string "Be brave and keep pushing on.$" gPikachuIntro_Text_Page3:: .string "Through your adventure, we hope\n" .string "that you will interact with all sorts\n" .string "of people and achieve personal growth.\n" .string "That is our biggest objective.\n" .string "\n" .string "Press the A Button, and let your\n" .string "adventure begin!$" gOakSpeech_Text_WelcomeToTheWorld:: .string "Hello, there!\n" .string "Glad to meet you!\p" .string "Welcome to the world of POKéMON!\p" .string "My name is OAK.\p" .string "People affectionately refer to me\n" .string "as the POKéMON PROFESSOR.\p$" gOakSpeech_Text_ThisWorld:: .string "This world…$" gOakSpeech_Text_IsInhabitedFarAndWide:: .string "…is inhabited far and wide by\n" .string "creatures called POKéMON.\p$" gOakSpeech_Text_IStudyPokemon:: .string "For some people, POKéMON are pets.\n" .string "Others use them for battling.\p" .string "As for myself…\p" .string "I study POKéMON as a profession.\p$" gOakSpeech_Text_TellMeALittleAboutYourself:: .string "But first, tell me a little about\n" .string "yourself.\p$" gOakSpeech_Text_YourNameWhatIsIt:: .string "Let's begin with your name.\n" .string "What is it?\p$" gOakSpeech_Text_SoYourNameIsPlayer:: .string "Right…\n" .string "So your name is {PLAYER}.$" gOakSpeech_Text_WhatWasHisName:: .string "This is my grandson.\p" .string "He's been your rival since you both\n" .string "were babies.\p" .string "…Erm, what was his name now?$" gOakSpeech_Text_YourRivalsNameWhatWasIt:: .string "Your rival's name, what was it now?$" gOakSpeech_Text_ConfirmRivalName:: .string "…Er, was it {RIVAL}?$" gOakSpeech_Text_RememberRivalsName:: .string "That's right! I remember now!\n" .string "His name is {RIVAL}!\p$" gOakSpeech_Text_LetsGo:: .string "{PLAYER}!\p" .string "Your very own POKéMON legend is\n" .string "about to unfold!\p" .string "A world of dreams and adventures\n" .string "with POKéMON awaits! Let's go!$" ================================================ FILE: data/text/obtain_item.inc ================================================ Text_ObtainedTheX:: .string "Obtained the {STR_VAR_2}!$" Text_BagIsFull:: .string "The BAG is full…$" Text_PutItemAway:: .string "{PLAYER} put the {STR_VAR_2}\n" .string "in the {STR_VAR_3}.$" Text_FoundOneItem:: .string "{PLAYER} found one {STR_VAR_2}!$" Text_TooBadBagFull:: .string "Too bad!\n" .string "The BAG is full…$" Text_FoundXCoins:: .string "{PLAYER} found\n" .string "{STR_VAR_1} {STR_VAR_2}!$" Text_PutCoinsAwayInCoinCase:: .string "{PLAYER} put the COINS away in\n" .string "the COIN CASE.$" Text_CoinCaseIsFull:: .string "Too bad!\n" .string "The COIN CASE is full…$" Text_NothingToPutThemIn:: .string "Too bad!\n" .string "There's nothing to put them in…$" Text_FoundXItems:: .string "{PLAYER} found\n" .string "{STR_VAR_1} {STR_VAR_2}(s)!$" Text_ObtainedTheDecor:: .string "Obtained the {STR_VAR_2}!$" Text_NoRoomForAnotherDecor:: .string "Too bad! There's no room left for\n" .string "another {STR_VAR_2}…$" Text_DecorTransferredToPC:: .string "The {STR_VAR_2} was transferred\n" .string "to the PC.$" ================================================ FILE: data/text/pc.inc ================================================ Text_BootedUpPC:: .string "{PLAYER} booted up the PC.$" Text_AccessWhichPC:: .string "Which PC should be accessed?$" Text_AccessedSomeonesPC:: .string "Accessed Someone's PC.$" Text_OpenedPkmnStorage:: .string "POKéMON Storage System opened.$" Text_AccessedPlayersPC:: .string "Accessed {PLAYER}'s PC.$" Text_AccessedBillsPC:: .string "Accessed BILL's PC.$" ================================================ FILE: data/text/pc_transfer.inc ================================================ Text_MonSentToBoxInSomeonesPC:: .string "{STR_VAR_2} was transferred to\n" .string "Someone's PC.\p" .string "It was placed in \n" .string "BOX “{STR_VAR_1}.”$" Text_MonSentToBoxInBillsPC:: .string "{STR_VAR_2} was transferred to\n" .string "BILL'S PC.\p" .string "It was placed in \n" .string "BOX “{STR_VAR_1}.”$" Text_MonSentToBoxSomeonesBoxFull:: .string "BOX “{STR_VAR_3}” on\n" .string "Someone's PC was full.\p" .string "{STR_VAR_2} was transferred to\n" .string "BOX “{STR_VAR_1}.”$" Text_MonSentToBoxBillsBoxFull:: .string "BOX “{STR_VAR_3}” on\n" .string "BILL'S PC was full.\p" .string "{STR_VAR_2} was transferred to\n" .string "BOX “{STR_VAR_1}.”$" Text_PlayerObtainedTheMon:: .string "{PLAYER} obtained\n" .string "the {STR_VAR_1}!$" Text_NoMoreRoomForPokemon:: .string "There's no more room for POKéMON!\p" .string "The POKéMON BOXES are full and\n" .string "can't accept any more!$" ================================================ FILE: data/text/poke_mart.inc ================================================ Text_MayIHelpYou:: .string "Hi, there!\n" .string "May I help you?$" Text_FillOutQuestionnaire:: .string "There is a questionnaire.\n" .string "Would you like to fill it out?$" Text_QuestionnaireThankYou:: .string "Thank you for taking the time to\n" .string "fill out our questionnaire.\p" .string "Your feedback will be used for\n" .string "future reference.$" Text_YouKnowThoseWords:: .string "Oh, hello!\n" .string "You know those words?\p" .string "That means you must know about\n" .string "the MYSTERY GIFT.\p" .string "From now on, you should be\n" .string "receiving MYSTERY GIFTS!$" Text_YouCanAccessMysteryGift:: .string "Once you save your game, you can\n" .string "access the MYSTERY GIFT.$" Text_ThankYouForAccessingMysteryGift:: .string "Thank you for accessing the\n" .string "MYSTERY GIFT System.$" ================================================ FILE: data/text/pokedex_rating.inc ================================================ PokedexRating_Text_HowIsPokedexComingAlong:: .string "OAK: Good to see you!\n" .string "How is your POKéDEX coming along?\p" .string "Here, let me take a look.$" PokedexRating_Text_SeenXOwnedY:: .string "The amount of progress you've made\n" .string "on your POKéDEX is:\p" .string "{STR_VAR_1} POKéMON seen and\n" .string "{STR_VAR_2} POKéMON owned.\p" .string "{FONT_NORMAL}PROF. OAK's rating:$" PokedexRating_Text_LessThan10:: .string "You still have lots to do.\p" .string "Go into every patch of grass you\n" .string "see and look for POKéMON!$" PokedexRating_Text_LessThan20:: .string "It looks as if you're getting on\n" .string "the right track!\p" .string "I've given one of my AIDES a FLASH\n" .string "HM. Make sure you go get it!$" PokedexRating_Text_LessThan30:: .string "Your POKéDEX could use a bit more\n" .string "volume still!\p" .string "Try to catch other species of\n" .string "POKéMON!$" PokedexRating_Text_LessThan40:: .string "Good, it's apparent that you're\n" .string "trying hard!\p" .string "I've given one of my AIDES an\n" .string "ITEMFINDER. Be sure to collect it!$" PokedexRating_Text_LessThan50:: .string "Your POKéDEX is coming along quite\n" .string "well!\p" .string "I've given one of my AIDES an\n" .string "AMULET COIN. Be sure to get it!$" PokedexRating_Text_LessThan60:: .string "Ah, you've finally topped 50\n" .string "species!\p" .string "I've given one of my AIDES an EXP.\n" .string "SHARE. Be sure to go get it!$" PokedexRating_Text_LessThan70:: .string "Hoho! This is turning into quite the\n" .string "respectable POKéDEX!$" PokedexRating_Text_LessThan80:: .string "Very good!\p" .string "I think you'll collect even more\n" .string "POKéMON by going fishing!$" PokedexRating_Text_LessThan90:: .string "Wonderful! Let me guess… You\n" .string "like to collect things, don't you?$" PokedexRating_Text_LessThan100:: .string "I'm impressed!\n" .string "It must have been difficult to do!$" PokedexRating_Text_LessThan110:: .string "You've finally hit 100 species!\n" .string "I can't believe how good you are!$" PokedexRating_Text_LessThan120:: .string "You even have the evolved forms\n" .string "of POKéMON! Super!$" PokedexRating_Text_LessThan130:: .string "Excellent! Trade with friends to\n" .string "get some more!$" PokedexRating_Text_LessThan140:: .string "Outstanding!\n" .string "You've become a real pro at this!$" PokedexRating_Text_LessThan150:: .string "I have nothing left to say!\n" .string "You're the POKéMON PROFESSOR now!$" PokedexRating_Text_Complete:: .string "Your POKéDEX is entirely complete!\n" .string "Congratulations!!$" PokedexRating_Text_NationalDexSeenXOwnedY:: .string "And your NATIONAL POKéDEX is:\p" .string "{STR_VAR_1} POKéMON seen and\n" .string "{STR_VAR_2} POKéMON owned.$" PokedexRating_Text_LookForwardToFilledNationalDex:: .string "I'll be looking forward to seeing\n" .string "you fill the NATIONAL POKéDEX!$" PokedexRating_Text_YouveCompletedDex:: .string "Finally…\p" .string "You've finally completed the\n" .string "POKéDEX!\p" .string "It's magnificent!\n" .string "Truly, this is a fantastic feat!$" PokedexRating_Text_Wroooaaarrr:: .string "Wroooooooaaaaaarrrr!$" PokedexRating_Text_ThankYouMadeDreamReality:: .string "Thank you, {PLAYER}!\n" .string "Sincerely, thank you!\l" .string "You've made my dream a reality!$" PokedexRating_Text_LoveSeeingYourPokedex:: .string "OAK: Ah, welcome!\p" .string "Tell me, how is your POKéDEX\n" .string "coming along?\p" .string "Wahaha!\p" .string "Actually, I know how it is, but I\n" .string "love seeing it anyway!\p" .string "Let's see…$" ================================================ FILE: data/text/pokedude.inc ================================================ Pokedude_Text_SpeedierBattlerGoesFirst:: .string "POKé DUDE: The speedier of the\n" .string "battlers gets to attack first.$" Pokedude_Text_MyRattataFasterThanPidgey:: .string "It looks like my RATTATA was\n" .string "faster than the PIDGEY.$" Pokedude_Text_BattlersTakeTurnsAttacking:: .string "The battlers take turns attacking\n" .string "and reducing each other's HP.$" Pokedude_Text_MyRattataWonGetsEXP:: .string "My RATTATA reduced the foe's HP\n" .string "to zero, so it wins!\p" .string "The POKéMON that took part in the\n" .string "battle get EXP. Points.\p" .string "When a POKéMON collects enough\n" .string "EXP. Points, it levels up.\p" .string "Leveling up makes your POKéMON\n" .string "stronger than before.$" Pokedude_Text_UhOhRattataPoisoned:: .string "POKé DUDE: Uh-oh…\n" .string "My RATTATA has been poisoned…\p" .string "If a POKéMON is poisoned, it loses\n" .string "HP steadily.$" Pokedude_Text_HealStatusRightAway:: .string "If a POKéMON develops a status\n" .string "problem, heal it right away.$" Pokedude_Text_UsingItemTakesTurn:: .string "Using an item on a POKéMON uses\n" .string "up one turn, though.\p" .string "Now, it's the opponent's turn!$" Pokedude_Text_YayWeManagedToWin:: .string "Yay!\n" .string "We managed to win!$" Pokedude_Text_WaterNotVeryEffectiveAgainstGrass:: .string "POKé DUDE: The move BUBBLE is\n" .string "a WATER-type attack.\p" .string "The targeted ODDISH is a\n" .string "GRASS/POISON-type POKéMON.\p" .string "The WATER-type attack is absorbed\n" .string "by the GRASS-type POKéMON…\p" .string "As a result, the move becomes not\n" .string "very effective, and inflicts only\l" .string "half the usual damage.$" Pokedude_Text_GrassEffectiveAgainstWater:: .string "Uh-oh, this is not good!\p" .string "The ABSORB attack you just saw\n" .string "is a GRASS-type move.\p" .string "POLIWAG is a WATER-type POKéMON.\p" .string "So, ABSORB becomes super\n" .string "effective, doubling the damage.$" Pokedude_Text_LetsTryShiftingMons:: .string "It's not going to be easy to win\n" .string "with this matchup…\p" .string "Let's try shifting POKéMON!$" Pokedude_Text_ShiftingUsesTurn:: .string "Shifting POKéMON in and out uses\n" .string "up one turn.\p" .string "Now, it's the opponent's turn.$" Pokedude_Text_ButterfreeDoubleResistsGrass:: .string "BUTTERFREE is a BUG/FLYING-type\n" .string "POKéMON.\p" .string "Against this POKéMON, a GRASS-\n" .string "type attack…\p" .string "…inflicts only half the usual\n" .string "damage on a BUG-type POKéMON…\p" .string "…And, it also causes only half the\n" .string "damage on a FLYING-type POKéMON.\p" .string "Therefore, BUTTERFREE, being a\n" .string "BUG/FLYING POKéMON, only takes\l" .string "one quarter of the usual damage.$" Pokedude_Text_ButterfreeGoodAgainstOddish:: .string "ODDISH is a GRASS/POISON-type\n" .string "POKéMON.\p" .string "A FLYING- or PSYCHIC-type attack\n" .string "is super effective against it.\p" .string "One of those types of attacks will\n" .string "inflict double the usual damage.\p" .string "Okay, here we go!$" Pokedude_Text_YeahWeWon:: .string "Yeah!\n" .string "We won!$" Pokedude_Text_WeakenMonBeforeCatching:: .string "POKé DUDE: When you're trying to\n" .string "catch a POKéMON, don't throw any\l" .string "POKé BALLS right away.\p" .string "First, you need to weaken it by\n" .string "reducing its HP.$" Pokedude_Text_BestIfTargetStatused:: .string "Okay, that should be good enough.\p" .string "But, if it's possible, it would be\n" .string "best if the target has a status\l" .string "problem.\p" .string "For instance, it would be easier\n" .string "to catch if it were asleep or\l" .string "paralyzed.$" Pokedude_Text_CantDoubleUpOnStatus:: .string "This will make the POKéMON a lot\n" .string "easier to catch!\p" .string "Oh, yes. If you paralyze a\n" .string "POKéMON, you can't make it fall\l" .string "asleep on top of paralysis.\p" .string "In other words, you can't double\n" .string "up status problems, okay?$" Pokedude_Text_LetMeThrowBall:: .string "Okay!\n" .string "Let me throw my POKé BALL!$" Pokedude_Text_PickBestKindOfBall:: .string "Before you throw a POKé BALL,\n" .string "consider the condition and the\l" .string "type of POKéMON, and pick the kind\l" .string "of BALL that would work best.$" ================================================ FILE: data/text/route23.inc ================================================ Text_OnlySkilledTrainersAllowedThrough:: .string "Only truly skilled TRAINERS are\n" .string "allowed through.\p" .string "You don't have the {STR_VAR_1}\n" .string "yet!$" Text_CantLetYouPass:: .string "Rules are rules.\n" .string "I can't let you pass.$" Text_OhThatsBadgeGoRightAhead:: .string "Oh! That is the {STR_VAR_1}!\n" .string "Go right ahead.$" Text_OnlyPassWithBadgeDontHaveYet:: .string "You can pass here only if you have\n" .string "the {STR_VAR_1}.\p" .string "You don't have the {STR_VAR_1}\n" .string "yet.\p" .string "You have to have it to get to\n" .string "the POKéMON LEAGUE.$" Text_OnlyPassWithBadgeOhGoAhead:: .string "You can pass here only if you have\n" .string "the {STR_VAR_1}.\p" .string "Oh! That is the {STR_VAR_1}!{PAUSE_MUSIC}{PLAY_BGM}{MUS_LEVEL_UP}{PAUSE 0x60}{RESUME_MUSIC}\p" .string "Okay, then.\n" .string "Please, go right ahead.$" ================================================ FILE: data/text/safari_zone.inc ================================================ @ The text here is a copy/paste from Hoenn's Safari Zone, and any unused text was left untranslated SafariZone_Text_WouldYouLikeToExit:: .string "Would you like to exit the SAFARI\n" .string "ZONE right now?$" SafariZone_Text_TimesUp:: .string "PA: Ding-dong!\p" .string "Time's up!\p" .string "PA: Your SAFARI GAME is over!$" SafariZone_Text_OutOfBalls:: .string "PA: Ding-dong!\p" .string "You are out of SAFARI BALLS!\p" .string "PA: Your SAFARI GAME is over!$" SafariZone_Text_ExcuseMeYourPCBoxIsFull:: .string "Excuse me!\n" .string "Your PC BOX is full.$" ================================================ FILE: data/text/save.inc ================================================ gText_WouldYouLikeToSaveTheGame:: .string "Would you like to save the game?$" gText_AlreadySaveFile_WouldLikeToOverwrite:: .string "There is already a saved file.\n" .string "Is it okay to overwrite it?$" gText_SavingDontTurnOffThePower:: .string "SAVING…\n" .string "DON'T TURN OFF THE POWER.$" gText_PlayerSavedTheGame:: .string "{PLAYER} saved the game.$" gText_DifferentGameFile:: .string "WARNING!\p" .string "There is a different game file that\n" .string "is already saved.\p" .string "If you save now, the other file's\n" .string "adventure, including items and\l" .string "POKéMON, will be entirely lost.\p" .string "Are you sure you want to save now\n" .string "and overwrite the other save file?$" ================================================ FILE: data/text/seagallop.inc ================================================ Text_AllAboardSeagallopNum:: .string "All right!\n" .string "All aboard SEAGALLOP HI-SPEED {STR_VAR_1}!$" ================================================ FILE: data/text/sign_lady.inc ================================================ @ For the NPC in Pallet Town that talks about the Trainer Tips sign PalletTown_Text_HmmIsThatRight:: .string "Hmm…\n" .string "Is that right…$" PalletTown_Text_OhLookLook:: .string "Oh!\n" .string "Look, look!$" PalletTown_Text_ReadItReadIt:: .string "Read it, read it!$" @ Used by sign PalletTown_Text_PressStartToOpenMenu:: .string "TRAINER TIPS\p" .string "Press START to open the MENU!$" PalletTown_Text_SignsAreUsefulArentThey:: .string "Signs are useful, aren't they?$" PalletTown_Text_LookCopiedTrainerTipsSign:: .string "Look, look!\p" .string "I copied what it said on one of\n" .string "those TRAINER TIPS signs!$" @ Used by NPC PalletTown_Text_PressStartToOpenMenuCopy:: .string "TRAINER TIPS!\p" .string "Press START to open the MENU!$" ================================================ FILE: data/text/surf.inc ================================================ Text_WantToSurf:: .string "The water is dyed a deep blue…\n" .string "Would you like to SURF?$" Text_UsedSurf:: .string "{STR_VAR_1} used SURF!$" Text_CurrentTooFast:: .string "The current is much too fast!\n" .string "SURF can't be used here…$" ================================================ FILE: data/text/trainer_card.inc ================================================ CeladonCity_GameCorner_Text_TryPokemonPrinter:: .string "It's a POKéMON PRINTER!\p" .string "It can put a print of your POKéMON\n" .string "on the back of your TRAINER CARD.\p" .string "It costs only ¥50.\n" .string "Would you like to try it?$" CeladonCity_GameCorner_Text_DontHaveEnoughMoney:: .string "You don't have enough money.$" CeladonCity_GameCorner_Text_ChoosePrintType:: .string "Please choose the print type.$" CeladonCity_GameCorner_Text_BigSmileForPhoto:: .string "A big smile for the photo, please!\n" .string "Three… Two… One…\p" .string "Flash!$" CeladonCity_GameCorner_Text_PrintIsReadyCheckTrainerCard:: .string "Your POKéMON print is ready!\n" .string "Check your TRAINER CARD.$" FourIsland_House2_Text_WishICouldShowOffStickers:: .string "Giggle…\n" .string "I collected a ton of STICKERS.\l" .string "I wish I could show them off…$" FourIsland_House2_Text_GiveYouStickerIfYouBrag:: .string "Oh, excellent!\n" .string "You've come to the right place!\p" .string "Look, look! See? See?\n" .string "These are my STICKERS!\l" .string "Look how many I got!\p" .string "I bet you want some.\n" .string "I bet you do!\p" .string "I'll give a STICKER if you can tell\n" .string "me something awesome about\l" .string "yourself.\p" .string "What will you brag about?$" FourIsland_House2_Text_BragAboutSomethingForMe:: .string "Brag about something for me.\n" .string "I'll give you a STICKER.$" FourIsland_House2_Text_BragAboutWhatToday:: .string "Oh, hi!\n" .string "Here comes the braggart.\p" .string "What are you going to brag about\n" .string "today?$" FourIsland_House2_Text_WowHoFLowest:: .string "Oh, wow, you made it into the\n" .string "HALL OF FAME.\p" .string "That's pretty good, yup!\n" .string "I'll give you one of these.$" FourIsland_House2_Text_WowHoFLow:: .string "Oh, wow, you've entered the\n" .string "HALL OF FAME often!\p" .string "That's impressive, yup!\n" .string "I'll give you one of these.$" FourIsland_House2_Text_WowHoFHigh:: .string "Whoa! You've made it into the\n" .string "HALL OF FAME that often?\l" .string "That's seriously incredible, yup!\p" .string "You own the POKéMON LEAGUE!\n" .string "I'll give you one of these.$" FourIsland_House2_Text_WowHoFHighest:: .string "No way! You've gone into the\n" .string "HALL OF FAME that many times?\p" .string "You're beyond incredible, yup!\n" .string "That's it, I have to give you this.$" FourIsland_House2_Text_HoFStickerApplied:: .string "The HALL OF FAME STICKER was\n" .string "applied to the TRAINER CARD.$" FourIsland_House2_Text_ComeBackWithBetterStoryHoF:: .string "Hmm…\p" .string "Come back with a better story next\n" .string "time, okay?$" FourIsland_House2_Text_LivingLegendHoF:: .string "Oh, no, no can do.\p" .string "You're practically a living legend.\n" .string "I have no SITCKERS left to give.$" FourIsland_House2_Text_WowEggsLowest:: .string "Oh, wow, there are POKéMON EGGS?\n" .string "I didn't know that!\p" .string "That's pretty good, yup!\n" .string "I'll give you one of these.$" FourIsland_House2_Text_WowEggsLow:: .string "You've hatched that many EGGS?\n" .string "You really must like them!\p" .string "That's impressive, yup!\n" .string "I'll give you one of these.$" FourIsland_House2_Text_WowEggsHigh:: .string "Whoa! You've hatched a whole\n" .string "bunch of EGGS!\p" .string "You're an EGG-hatching machine!\n" .string "I'll give you one of these.$" FourIsland_House2_Text_WowEggsHighest:: .string "Wh… You hatched that many EGGS?\p" .string "What's behind your love of EGGS?\n" .string "It's beyond incredible, yup!\p" .string "You're too awesome, I tell you.\n" .string "That's it, I have to give you this.$" FourIsland_House2_Text_EggStickerApplied:: .string "The EGG STICKER was applied\n" .string "to the TRAINER CARD.$" FourIsland_House2_Text_ComeBackWithBetterStoryEggs:: .string "Hmm…\p" .string "Come back with a better story next\n" .string "time, okay?$" FourIsland_House2_Text_LivingLegendEggs:: .string "Oh, no, no can do.\p" .string "You're practically a living legend.\n" .string "I have no SITCKERS left to give.$" FourIsland_House2_Text_WowLinkWinsLowest:: .string "Oh, wow, you've had success\n" .string "link battling?\p" .string "You're pretty strong, yup!\n" .string "I'll give you one of these.$" FourIsland_House2_Text_WowLinkWinsLow:: .string "You've beaten your friends a lot\n" .string "link battling, huh?\p" .string "You're impressively strong, yup!\n" .string "I'll give you one of these.$" FourIsland_House2_Text_WowLinkWinsHigh:: .string "Whoa! You've beaten your friends\n" .string "a frightful number of times.\p" .string "Have you lost friends over this?\n" .string "I'll give you one of these.$" FourIsland_House2_Text_WowLinkWinsHighest:: .string "Wh… Wickedly whoa!\n" .string "You've won mind-blowingly often!\p" .string "It just knocks me out thinking\n" .string "about how tough you are.\p" .string "You're the stuff of nightmares!\n" .string "That's it, I have to give you this.$" FourIsland_House2_Text_VictoryStickerApplied:: .string "The VICTORY STICKER was applied\n" .string "to the TRAINER CARD.$" FourIsland_House2_Text_ComeBackWithBetterStoryLinkWins:: .string "Hmm…\p" .string "Come back with a better story next\n" .string "time, okay?$" FourIsland_House2_Text_LivingLegendLinkWins:: .string "Oh, no, no can do.\p" .string "You're practically a living legend.\n" .string "I have no SITCKERS left to give.$" ================================================ FILE: data/text/trainers.inc ================================================ VSSeeker_Text_BatteryNotChargedNeedXSteps:: .string "The battery isn't charged enough.\p" .string "No. of steps required to fully\n" .string "charge the battery: {STR_VAR_1}{PAUSE_UNTIL_PRESS}$" VSSeeker_Text_NoTrainersWithinRange:: .string "There are no TRAINERS within range\n" .string "who can battle…\p" .string "The VS SEEKER was turned off.{PAUSE_UNTIL_PRESS}$" VSSeeker_Text_TrainersNotReady:: .string "The other TRAINERS don't appear\n" .string "to be ready for battle.\p" .string "Let's wait till later.{PAUSE_UNTIL_PRESS}$" Route3_Text_ColtonRematchIntro:: .string "Hey!\n" .string "I saw you in VIRIDIAN FOREST!$" Route3_Text_BenRematchIntro:: .string "Hi! I like shorts!\n" .string "They're comfy and easy to wear!\p" .string "You should be wearing shorts, too!$" Route3_Text_JaniceRematchIntro:: .string "Excuse me!\n" .string "You keep looking at me, don't you?$" Route3_Text_GregRematchIntro:: .string "You're a TRAINER, aren't you?\n" .string "Let's get with it right away!$" Route3_Text_SallyRematchIntro:: .string "That look you give me…\n" .string "It intrigues me so!$" Route3_Text_CalvinRematchIntro:: .string "Hey! What's wrong with you?\n" .string "You're still not wearing shorts!$" Route3_Text_JamesRematchIntro:: .string "I'll battle you with the POKéMON\n" .string "I started raising.$" Route3_Text_RobinRematchIntro:: .string "Eek!\n" .string "Did you push me?$" Route4_Text_CrissyRematchIntro:: .string "I always catch mushroom POKéMON\n" .string "on MT. MOON.$" Route6_Text_RickyRematchIntro:: .string "Oh! You're that nosy kid who\n" .string "eavesdropped on us!$" Route6_Text_NancyRematchIntro:: .string "Excuse me! Didn't I tell you that\n" .string "this is a private conversation?\p" .string "You shouldn't be listening in,\n" .string "you uncouth person!$" Route6_Text_KeigoRematchIntro:: .string "I'm trying to find something good\n" .string "that's not a BUG POKéMON, but…$" Route6_Text_JeffRematchIntro:: .string "Huh?\n" .string "You want to go with me again?$" Route6_Text_IsabelleRematchIntro:: .string "Me?\n" .string "Well, okay. I'll play this once.$" Route6_Text_ElijahRematchIntro:: .string "Hey, long time!\n" .string "Have you gotten better?$" Route8_Text_AidanRematchIntro:: .string "You are good at POKéMON, but how\n" .string "is your chemistry grade?$" Route8_Text_StanRematchIntro:: .string "All right!\n" .string "Let's play another game!$" Route8_Text_GlennRematchIntro:: .string "You need strategy to win at\n" .string "battling.\p" .string "Are you following my advice?$" Route8_Text_PaigeRematchIntro:: .string "I've collected many NIDORAN.\n" .string "I don't want them to evolve, but…$" Route8_Text_LeslieRematchIntro:: .string "School is fun, but I still think\n" .string "POKéMON are fun, too.$" Route8_Text_AndreaRematchIntro:: .string "MEOWTH and PERSIAN are so cute,\n" .string "meow, meow, meow!$" Route8_Text_MeganRematchIntro:: .string "We may look silly standing here\n" .string "like this, but I can still battle.$" Route8_Text_RichRematchIntro:: .string "I'm a rambling, gambling dude!\n" .string "I'm on a winning streak!$" Route8_Text_JuliaRematchIntro:: .string "What's a cute, round, and fluffy\n" .string "POKéMON?\p" .string "You already know, don't you?$" Route8_Text_RicardoRematchIntro:: .string "My bike's still acting up, man.$" Route8_Text_JarenRematchIntro:: .string "Okay, kid!\n" .string "Don't expect mercy this time!$" Route8_Text_EliRematchIntro:: .string "ELI: Our twin power became even\n" .string "better!$" Route8_Text_AnneRematchIntro:: .string "ANNE: Our twin power powered up!$" Route9_Text_AliciaRematchIntro:: .string "We're to battle again?\n" .string "This time, you're mine!$" Route9_Text_ChrisRematchIntro:: .string "I haven't forgotten you were with\n" .string "those good-looking POKéMON.$" Route9_Text_DrewRematchIntro:: .string "I'm taking ROCK TUNNEL to go to\n" .string "LAVENDER…\p" .string "But I keep getting stopped by\n" .string "everyone along the way…$" Route9_Text_CaitlinRematchIntro:: .string "Don't you dare patronize me today!\n" .string "We're playing for keeps!$" Route9_Text_JeremyRematchIntro:: .string "Bwahaha!\n" .string "Great! I was bored again, eh!$" Route9_Text_BriceRematchIntro:: .string "Hahaha!\n" .string "A little toughie, as always!$" Route9_Text_BrentRematchIntro:: .string "I got up early every day to train\n" .string "my POKéMON from cocoons!$" Route9_Text_AlanRematchIntro:: .string "Hahahaha!\n" .string "I'll win this time!$" Route9_Text_ConnerRematchIntro:: .string "Go win, my super BUG POKéMON!$" Route10_Text_MarkRematchIntro:: .string "Wow, you came here again?\n" .string "Maybe you're a POKéMANIAC, too?\l" .string "Want to see my collection?$" Route10_Text_ClarkRematchIntro:: .string "Ha-hahah-ah-ha!\n" .string "I can't stop sneezing!$" Route10_Text_HermanRematchIntro:: .string "Hi, kid!\n" .string "Did I show you my POKéMON?$" Route10_Text_HeidiRematchIntro:: .string "I went out to a POKéMON GYM again.\p" .string "…But I lost as usual.$" Route10_Text_TrentRematchIntro:: .string "Ah!\n" .string "This mountain air is delicious!\l" .string "It's so good, I can't leave!$" Route10_Text_CarolRematchIntro:: .string "My head is starting to spin.\n" .string "I've been hiking for too long…$" Route11_Text_HugoRematchIntro:: .string "Win, lose, or draw!\n" .string "Now for our rematch!$" Route11_Text_JasperRematchIntro:: .string "Competing is the ultimate thrill.\n" .string "I still can't get enough!$" Route11_Text_EddieRematchIntro:: .string "You know, right?\n" .string "Let's go, but don't cheat!$" Route11_Text_BraxtonRematchIntro:: .string "Hi, there!\p" .string "But be careful!\n" .string "I'm still laying down some cables!$" Route11_Text_DillonRematchIntro:: .string "I became a TRAINER a while ago.\n" .string "But, I think I can win.$" Route11_Text_DirkRematchIntro:: .string "Fwahaha!\n" .string "I have never lost!\p" .string "…And if I did, I've forgotten all\n" .string "about it!$" Route11_Text_DarianRematchIntro:: .string "I have never won before…\p" .string "Perhaps I am destined to remain\n" .string "that way…$" Route11_Text_YasuRematchIntro:: .string "I'm the best in my class.\n" .string "I train every morning and night!$" Route11_Text_BernieRematchIntro:: .string "Keep your eyes out for live wires!$" Route11_Text_DaveRematchIntro:: .string "I raised my POKéMON carefully.\n" .string "They should be ready by now.\l" .string "This time, they should win, too.$" Route12_Text_NedRematchIntro:: .string "Yeah!\n" .string "I got a bite, here!\l" .string "Th-this might be the real thing!$" Route12_Text_ChipRematchIntro:: .string "You're finally here.\n" .string "Fishing is a waiting game.$" Route12_Text_JustinRematchIntro:: .string "Still can't find a MOON STONE…\n" .string "Have you found one?$" Route12_Text_LucaRematchIntro:: .string "Electricity has always been my\n" .string "specialty.\p" .string "I don't know a thing about POKéMON\n" .string "of the sea, though.$" Route12_Text_HankRematchIntro:: .string "The FISHING FOOL vs. POKéMON KID!\n" .string "Another round, fight!$" Route12_Text_ElliotRematchIntro:: .string "I love fishing, don't get me wrong.\n" .string "But, I wish I had more work…\l" .string "…It's hard to give up fishing!$" Route12_Text_AndrewRematchIntro:: .string "What's catching?\p" .string "You'll never know unless you beat\n" .string "me!$" Route12_Text_JesRematchIntro:: .string "JES: I'll win here today and\n" .string "propose to my GIA.$" Route12_Text_GiaRematchIntro:: .string "GIA: Hey, JES…\n" .string "I've been waiting a long time now.\p" .string "If we win today, I'll marry you!$" Route13_Text_SebastianRematchIntro:: .string "My bird POKéMON remember you!$" Route13_Text_SusieRematchIntro:: .string "I want to be the best TRAINER \n" .string "while I'm a kid!$" Route13_Text_ValerieRematchIntro:: .string "Wow!\n" .string "You got more cool BADGES!$" Route13_Text_GwenRematchIntro:: .string "My cutely grown POKéMON wish to\n" .string "become reacquainted with you.$" Route13_Text_AlmaRematchIntro:: .string "I cleaned out my savings and\n" .string "bought more CARBOS.$" Route13_Text_PerryRematchIntro:: .string "I'm not going to lose this time.\n" .string "The wind's blowing my way!$" Route13_Text_LolaRematchIntro:: .string "Oh, you're back?\p" .string "Sure, I'll play again with you,\n" .string "sweetie.$" Route13_Text_SheilaRematchIntro:: .string "Can't you forget that you battled\n" .string "with me?$" Route13_Text_JaredRematchIntro:: .string "What're you starin' at?$" Route13_Text_RobertRematchIntro:: .string "I always go with bird POKéMON.\n" .string "I've dedicated myself to them.$" Route14_Text_CarterRematchIntro:: .string "I used TMs to teach good moves\n" .string "to my POKéMON.$" Route14_Text_MitchRematchIntro:: .string "My bird POKéMON should be ready\n" .string "for battle this time.$" Route14_Text_BeckRematchIntro:: .string "Are you using TMs on POKéMON?\n" .string "Just holding them is useless.$" Route14_Text_MarlonRematchIntro:: .string "Have you taught your bird POKéMON\n" .string "how to FLY?\p" .string "You'll be able to soar with it into\n" .string "the sky! Give it a try.$" Route14_Text_DonaldRematchIntro:: .string "The legend of the winged mirages…\n" .string "You've heard it, right?$" Route14_Text_BennyRematchIntro:: .string "I'm really not into it, but okay.\n" .string "Let's go!$" Route14_Text_LukasRematchIntro:: .string "Hey!\n" .string "I remember you!\p" .string "C'mon, c'mon.\n" .string "Let's go, let's go, let's go!$" Route14_Text_IsaacRematchIntro:: .string "You're here again, huh?\n" .string "Shut up and battle.$" Route14_Text_GeraldRematchIntro:: .string "We've been riding here because of\n" .string "the wide-open spaces.$" Route14_Text_MalikRematchIntro:: .string "POKéMON battle, right?\n" .string "Cool! Rumble!$" Route14_Text_KiriRematchIntro:: .string "KIRI: JAN, I hope we win today.$" Route14_Text_JanRematchIntro:: .string "JAN: KIRI, here we go!\n" .string "Let's win for sure this time!$" Route15_Text_KindraRematchIntro:: .string "I'm going to keep battling with the\n" .string "POKéMON I got in trades.$" Route15_Text_BeckyRematchIntro:: .string "You look gentle, so I think I can\n" .string "beat you.\p" .string "I'll give it one more go!$" Route15_Text_EdwinRematchIntro:: .string "When I whistle, bird POKéMON\n" .string "gather around.\p" .string "They're amazingly cute!$" Route15_Text_ChesterRematchIntro:: .string "Hmm? My birds are shivering!\n" .string "Wait, aren't you that TRAINER…$" Route15_Text_GraceRematchIntro:: .string "Oh, you're a little cutie!\n" .string "So like a darling POKéMON!\l" .string "I remember you now!$" Route15_Text_OliviaRematchIntro:: .string "I raise POKéMON for protection\n" .string "because I live alone.\p" .string "That hasn't changed.$" Route15_Text_ErnestRematchIntro:: .string "Hey, kid! C'mon!\n" .string "I got these off some loser!$" Route15_Text_AlexRematchIntro:: .string "Fork over all your cash when you\n" .string "lose to me, kid!$" Route15_Text_CeliaRematchIntro:: .string "What's cool and happening?\n" .string "Trading POKéMON, of course.$" Route15_Text_YazminRematchIntro:: .string "Want to play with my POKéMON\n" .string "again?$" Route15_Text_MyaRematchIntro:: .string "MYA: Hi, we keep meeting,\n" .string "don't we?\p" .string "Help me train my little brother\n" .string "again?$" Route15_Text_RonRematchIntro:: .string "RON: My sister's gotten more\n" .string "powerful…$" Route16_Text_LaoRematchIntro:: .string "What do you want?$" Route16_Text_KojiRematchIntro:: .string "Nice BIKE!\n" .string "Hand it over quick!$" Route16_Text_LukeRematchIntro:: .string "Come out and play, little mouse.\n" .string "I'll treat you right!$" Route16_Text_HideoRematchIntro:: .string "Hey, wait a second!\n" .string "Don't call me and then run away!$" Route16_Text_CamronRematchIntro:: .string "I'm feeling hungry and mean!\n" .string "I really need a punching bag!$" Route16_Text_RubenRematchIntro:: .string "Hey, there!\n" .string "We'll have ourselves a good time!$" Route16_Text_JedRematchIntro:: .string "JED: Are you here to see our\n" .string "love, which knows no bounds?$" Route16_Text_LeaRematchIntro:: .string "LEA: Sometimes, the intensity of\n" .string "our love scares me.$" Route17_Text_RaulRematchIntro:: .string "I told you, there's no getting rich\n" .string "quick in battling kids.$" Route17_Text_IsaiahRematchIntro:: .string "I'm mighty proud of my bod, kiddo.\n" .string "Come on!$" Route17_Text_VirgilRematchIntro:: .string "You out for a stroll?$" Route17_Text_BillyRematchIntro:: .string "We're BIKERS!\n" .string "We rule the roads, man!$" Route17_Text_NikolasRematchIntro:: .string "VOLTORB's going to seriously\n" .string "electrify you today!$" Route17_Text_ZeekRematchIntro:: .string "I leveled up my POKéMON, but it\n" .string "absolutely won't evolve. Why?$" Route17_Text_JamalRematchIntro:: .string "Gaah! I really need to exercise\n" .string "and seriously trim some flab!$" Route17_Text_CoreyRematchIntro:: .string "Be a rebel!$" Route17_Text_JaxonRematchIntro:: .string "Yep, that's a nice BIKE!\n" .string "How's it handle?$" Route17_Text_WilliamRematchIntro:: .string "Get lost, kid!\n" .string "I'm bushed!$" Route18_Text_WiltonRematchIntro:: .string "I've been checking every grassy\n" .string "area for new POKéMON.\p" .string "But it's not always easy…$" Route18_Text_RamiroRematchIntro:: .string "Koorukukukoo!\n" .string "Is my birdcall getting better?$" Route18_Text_JacobRematchIntro:: .string "I warned you before, this is my\n" .string "turf!\p" .string "I don't want you coming around.$" Route19_Text_RichardRematchIntro:: .string "I'm almost warmed up to go\n" .string "out for a swim.$" Route19_Text_ReeceRematchIntro:: .string "Wait! Slow down!\n" .string "What if you have a heart attack?$" Route19_Text_MatthewRematchIntro:: .string "I love swimming!\n" .string "I guess you're the surfing type.$" Route19_Text_DouglasRematchIntro:: .string "What's beyond the horizon?\n" .string "Have you seen?$" Route19_Text_DavidRematchIntro:: .string "I tried diving for POKéMON again,\n" .string "but it was a no-go like before.$" Route19_Text_TonyRematchIntro:: .string "I look at the sea to forget all\n" .string "the bad things that happened.\p" .string "…Like losing to you the last time!$" Route19_Text_AnyaRematchIntro:: .string "You always get to ride your\n" .string "POKéMON…\p" .string "It looks so relaxing.\n" .string "Can I have it if I win?$" Route19_Text_AliceRematchIntro:: .string "Swimming's great!\n" .string "Sunburns aren't!$" Route19_Text_AxleRematchIntro:: .string "These waters are treacherous!\n" .string "You shouldn't come back here!$" Route19_Text_ConnieRematchIntro:: .string "I swam here with my friends…\n" .string "I'm tired…\l" .string "Must we really battle again?$" Route19_Text_LiaRematchIntro:: .string "LIA: You know my brother just\n" .string "became a TRAINER, right?\p" .string "I want to make him better, so I\n" .string "need your help again.$" Route19_Text_LucRematchIntro:: .string "LUC: My big sis taught me all\n" .string "about POKéMON.\p" .string "I wonder if I'm better?$" Route20_Text_BarryRematchIntro:: .string "The water is shallow here.\n" .string "There are many people swimming.$" Route20_Text_ShirleyRematchIntro:: .string "Are you jealous that I'm\n" .string "vacationing on SEAFOAM?$" Route20_Text_TiffanyRematchIntro:: .string "I love floating with the fishes\n" .string "here among the waves.$" Route20_Text_IreneRematchIntro:: .string "Were you on vacation, too?$" Route20_Text_DeanRematchIntro:: .string "Check out my physique!\p" .string "It's even more buff than ever\n" .string "before!$" Route20_Text_DarrinRematchIntro:: .string "Why are you riding a POKéMON?\n" .string "Haven't you learned to swim yet?$" Route20_Text_RogerRematchIntro:: .string "I rode my bird POKéMON here.$" Route20_Text_NoraRematchIntro:: .string "My boyfriend gave me big pearls.\n" .string "And, they've grown bigger!$" Route20_Text_MissyRematchIntro:: .string "I swam here from CINNABAR ISLAND.\n" .string "It wasn't easy, like I said.$" Route20_Text_MelissaRematchIntro:: .string "CINNABAR, in the west, has a LAB\n" .string "for POKéMON.\p" .string "My daddy works there.$" Route21_North_Text_RonaldRematchIntro:: .string "You want to know if the fish are\n" .string "biting?$" Route21_North_Text_WadeRematchIntro:: .string "I got a big haul again!\n" .string "Wanna go for it once more?$" Route21_North_Text_SpencerRematchIntro:: .string "The sea cleanses my body and soul!$" Route21_South_Text_JackRematchIntro:: .string "I caught my POKéMON at sea.\n" .string "And that's where I train them.$" Route21_South_Text_JeromeRematchIntro:: .string "Right now, I'm in another triathlon\n" .string "meet!$" Route21_South_Text_RolandRematchIntro:: .string "Ahh!\n" .string "Feel the sun and the wind!$" Route21_South_Text_ClaudeRematchIntro:: .string "Hey, cut it out already.\n" .string "You always scare away the fish!$" Route21_South_Text_NolanRematchIntro:: .string "Keep me company till I get a hit.$" Route21_North_Text_LilRematchIntro:: .string "LIL: Huh? A battle again?\n" .string "IAN, can't you do it alone?$" Route21_North_Text_IanRematchIntro:: .string "IAN: My sis is still a slob.\n" .string "Help me get her into shape!$" Route25_Text_JoeyRematchIntro:: .string "I won't lose while I'm here!$" Route25_Text_DanRematchIntro:: .string "Dad took me to a great party on\n" .string "the S.S. ANNE at VERMILION CITY.$" Route25_Text_FlintRematchIntro:: .string "I'm a cool guy.\n" .string "I've got a girlfriend!\p" .string "I'll show her how cool I am for\n" .string "sure this time!$" Route25_Text_KelseyRematchIntro:: .string "Hi!\n" .string "My boyfriend is cool!\l" .string "My conditioning's good today!$" Route25_Text_ChadRematchIntro:: .string "I had this feeling…\n" .string "I knew I had to battle you again!$" Route25_Text_HaleyRematchIntro:: .string "My friend has many cute POKéMON.\n" .string "I'm so jealous!$" Route25_Text_FranklinRematchIntro:: .string "I just trained up on MT. MOON,\n" .string "but I've still got gas in the tank!$" Route25_Text_NobRematchIntro:: .string "A POKéMANIAC lives on the cape.\n" .string "Have you seen his collection?$" Route25_Text_WayneRematchIntro:: .string "You're going to see BILL again?\n" .string "First, we battle!$" Route24_Text_ShaneRematchIntro:: .string "I saw your feat from the grass!$" Route24_Text_EthanRematchIntro:: .string "Okay!\n" .string "I'll stomp you!$" Route24_Text_ReliRematchIntro:: .string "You always look so busy…\n" .string "Aren't you getting tired?$" Route24_Text_TimmyRematchIntro:: .string "You really must love coming to\n" .string "NUGGET BRIDGE.$" Route24_Text_AliRematchIntro:: .string "The time we battled…\p" .string "Even though I was the second in\n" .string "line, I was the best, wasn't I?$" Route24_Text_CaleRematchIntro:: .string "People call this the NUGGET\n" .string "BRIDGE!\p" .string "You've already beaten us, so you're\n" .string "not allowed to take the challenge…\p" .string "…But, you're welcome to battle with\n" .string "us again.$" OneIsland_TreasureBeach_Text_AmaraRematchIntro:: .string "Lying back, rocked by the waves…\n" .string "I don't notice time slipping by…$" OneIsland_KindleRoad_Text_MariaRematchIntro:: .string "The weather's gorgeous!\n" .string "I'll try not to spoil it.$" OneIsland_KindleRoad_Text_AbigailRematchIntro:: .string "My sunburn is starting to hurt…$" OneIsland_KindleRoad_Text_FinnRematchIntro:: .string "The fire bird's mountain casts\n" .string "a huge shadow…$" OneIsland_KindleRoad_Text_GarrettRematchIntro:: .string "I have this strong feeling that\n" .string "I can win this time!$" OneIsland_KindleRoad_Text_TommyRematchIntro:: .string "Wait! Wait a second!\n" .string "I'm sure I've hooked a big one!$" OneIsland_KindleRoad_Text_SharonRematchIntro:: .string "You'll help me out with my\n" .string "training again?$" OneIsland_KindleRoad_Text_TanyaRematchIntro:: .string "We haven't missed a single day of\n" .string "training yet!$" OneIsland_KindleRoad_Text_SheaRematchIntro:: .string "Every morning, before breakfast,\n" .string "I swim around this island…\l" .string "Three times!$" OneIsland_KindleRoad_Text_HughRematchIntro:: .string "Dress appropriately for battle!\n" .string "Lose that frivolous outfit, I said!$" OneIsland_KindleRoad_Text_BryceRematchIntro:: .string "You know, everything tastes great\n" .string "when you're out in the wild.$" OneIsland_KindleRoad_Text_ClaireRematchIntro:: .string "I ate too much again, so will you\n" .string "battle us for some exercise?$" OneIsland_KindleRoad_Text_KiaRematchIntro:: .string "KIA: My big brother and I make\n" .string "an awesome combination!\p" .string "We won't lose this time!$" OneIsland_KindleRoad_Text_MikRematchIntro:: .string "MIK: Together with KIA, we're\n" .string "afraid of nothing!\p" .string "We'll prove it to you this time!$" ThreeIsland_BondBridge_Text_NikkiRematchIntro:: .string "Are we to battle again?$" ThreeIsland_BondBridge_Text_VioletRematchIntro:: .string "From where have you come, and\n" .string "where are you bound?$" ThreeIsland_BondBridge_Text_AmiraRematchIntro:: .string "I want to swim without my float\n" .string "ring soon.$" ThreeIsland_BondBridge_Text_AlexisRematchIntro:: .string "Yay, yay!\n" .string "POKéMON!$" ThreeIsland_BondBridge_Text_TishaRematchIntro:: .string "Oh, no, didn't I tell you already?\n" .string "Please, stay away from me!$" ThreeIsland_BondBridge_Text_JoyRematchIntro:: .string "JOY: We've gotten stronger!\n" .string "Lots and lots!$" ThreeIsland_BondBridge_Text_MegRematchIntro:: .string "MEG: You can't beat us today!$" FiveIsland_WaterLabyrinth_Text_AlizeRematchIntro:: .string "Oh, hello!\p" .string "Are you raising your POKéMON in a\n" .string "good environment?$" FiveIsland_ResortGorgeous_Text_DaisyRematchIntro:: .string "With these hands, I will create\n" .string "my victory today.$" FiveIsland_ResortGorgeous_Text_CelinaRematchIntro:: .string "Must I repeat myself?\n" .string "I'm trying to paint.\l" .string "Please keep out of my sight!$" FiveIsland_ResortGorgeous_Text_RaynaRematchIntro:: .string "I haven't made any progress…\n" .string "I still can't get the right angle…$" FiveIsland_ResortGorgeous_Text_JackiRematchIntro:: .string "Oh, you will give me another\n" .string "opportunity to match wits with you?$" FiveIsland_ResortGorgeous_Text_GillianRematchIntro:: .string "They're almost finished making the\n" .string "pool for my POKéMON.\p" .string "You must drop in for a visit.$" FiveIsland_ResortGorgeous_Text_DestinRematchIntro:: .string "I'm a good runner.\n" .string "I've gotten even faster!$" FiveIsland_ResortGorgeous_Text_TobyRematchIntro:: .string "I say, friend!\n" .string "Let us enjoy our time together!$" FiveIsland_MemorialPillar_Text_MiloRematchIntro:: .string "I'm the eldest of the BIRD\n" .string "BROTHERS. Remember me?\p" .string "That's right, I'm the one who loves\n" .string "birds for their beaks!$" FiveIsland_MemorialPillar_Text_ChazRematchIntro:: .string "I'm the middle kid of the BIRD\n" .string "BROTHERS.\p" .string "I'm the one that loves wings.\n" .string "Let's battle again!$" FiveIsland_MemorialPillar_Text_HaroldRematchIntro:: .string "I'm the youngest of the BIRD\n" .string "BROTHERS.\p" .string "I love birds for their down.\n" .string "I didn't think I'd see you again!$" SixIsland_OutcastIsland_Text_TylorRematchIntro:: .string "I'm still having no luck at all.\n" .string "A battle'd be a change of pace!$" SixIsland_OutcastIsland_Text_MymoRematchIntro:: .string "Gasp… Gasp…\p" .string "I swam here from SIX ISLAND's port\n" .string "in one go again.$" SixIsland_OutcastIsland_Text_NicoleRematchIntro:: .string "You always come along while I'm\n" .string "swimming.$" SixIsland_OutcastIsland_Text_AvaRematchIntro:: .string "AVA: Let's have another\n" .string "two-on-two marine battle today!$" SixIsland_OutcastIsland_Text_GebRematchIntro:: .string "GEB: My big sister and I are way\n" .string "tougher than before!$" SixIsland_GreenPath_Text_JaclynRematchIntro:: .string "…Huh?\p" .string "I envision my house, but TELEPORT\n" .string "always brings me here!$" SixIsland_WaterPath_Text_RoseRematchIntro:: .string "Oh, hello.\n" .string "A pleasant breeze is blowing again.$" SixIsland_WaterPath_Text_EdwardRematchIntro:: .string "Hehehe, I'm practicing in secret\n" .string "again.$" SixIsland_WaterPath_Text_SamirRematchIntro:: .string "What, you're sick of seeing\n" .string "SWIMMERS like me?\p" .string "Aww, don't be hatin'!\n" .string "Battle with me again.$" SixIsland_WaterPath_Text_DeniseRematchIntro:: .string "Sigh…\n" .string "My boyfriend's busy again…$" SixIsland_WaterPath_Text_EarlRematchIntro:: .string "Come on, tell me, where are the\n" .string "mountains around these parts?$" SixIsland_WaterPath_Text_MiuRematchIntro:: .string "MIU: Hello, POKéMON!\n" .string "It's time to play again!$" SixIsland_WaterPath_Text_MiaRematchIntro:: .string "MIA: Hello, POKéMON!\n" .string "It's time to battle again!$" SixIsland_RuinValley_Text_StanlyRematchIntro:: .string "There appear to be many secrets\n" .string "still unsolved in this world.$" SixIsland_RuinValley_Text_FosterRematchIntro:: .string "Hi, didn't we meet before?\n" .string "What compelled you to come back?$" SixIsland_RuinValley_Text_LarryRematchIntro:: .string "It's been said that there are\n" .string "mysterious stones on this island.\p" .string "Have you discovered anything since\n" .string "we last met?$" SixIsland_RuinValley_Text_DarylRematchIntro:: .string "A rematch with you, so high up!$" SixIsland_RuinValley_Text_HectorRematchIntro:: .string "I'm pretty familiar with the land\n" .string "around these parts.$" SevenIsland_TrainerTower_Text_DarioRematchIntro:: .string "I sensed your approach.$" SevenIsland_TrainerTower_Text_RodetteRematchIntro:: .string "Somewhere on this island, peculiar\n" .string "POKéMON are sleeping.$" SevenIsland_SevaultCanyon_Entrance_Text_MiahRematchIntro:: .string "Kyahaha!\p" .string "Coming back won't change a thing.\n" .string "I'll flick you away effortlessly!$" SevenIsland_SevaultCanyon_Entrance_Text_MasonRematchIntro:: .string "Howdy! You're a member of my\n" .string "fan club, isn't that right?$" SevenIsland_SevaultCanyon_Entrance_Text_NicolasRematchIntro:: .string "This island is too spread out…\n" .string "Patrolling the place is a drag…$" SevenIsland_SevaultCanyon_Entrance_Text_MadelineRematchIntro:: .string "I don't forgive people who abuse\n" .string "POKéMON!$" SevenIsland_SevaultCanyon_Entrance_Text_EveRematchIntro:: .string "EVE: I'll team up with JON and\n" .string "battle together again.$" SevenIsland_SevaultCanyon_Entrance_Text_JonRematchIntro:: .string "JON: When I'm with EVE, it feels\n" .string "like we could never lose, not ever.$" SevenIsland_SevaultCanyon_Text_CyndyRematchIntro:: .string "Let's have another battle.\n" .string "My conditioning's in top form!$" SevenIsland_SevaultCanyon_Text_EvanRematchIntro:: .string "It doesn't matter if you happen to\n" .string "have the strongest POKéMON…\p" .string "It doesn't mean a thing if you don't\n" .string "know how to use them properly!$" SevenIsland_SevaultCanyon_Text_JacksonRematchIntro:: .string "I work to protect the environment.\n" .string "In turn, nature protects me!$" SevenIsland_SevaultCanyon_Text_KatelynRematchIntro:: .string "Every time we meet, you have those\n" .string "snazzy shoes on.$" SevenIsland_SevaultCanyon_Text_LeroyRematchIntro:: .string "You must have gotten tougher.\n" .string "Let me battle you, please!$" SevenIsland_SevaultCanyon_Text_MichelleRematchIntro:: .string "I was given the best possible\n" .string "education to become this strong.\p" .string "I won't lose this time.\n" .string "Absolutely not!$" SevenIsland_SevaultCanyon_Text_LexRematchIntro:: .string "LEX: My darling NYA, together\n" .string "we will win for certain!$" SevenIsland_SevaultCanyon_Text_NyaRematchIntro:: .string "NYA: I won't drag down my mentor\n" .string "LEX! We're going to win!$" SevenIsland_TanobyRuins_Text_BrandonRematchIntro:: .string "Have you discovered anything about\n" .string "this stone chamber?$" SevenIsland_TanobyRuins_Text_BenjaminRematchIntro:: .string "A mystic POKéMON is said to sleep\n" .string "inside here.$" SevenIsland_TanobyRuins_Text_EdnaRematchIntro:: .string "My teacher is showing me how to\n" .string "paint some more.$" SevenIsland_TanobyRuins_Text_CliffordRematchIntro:: .string "Today, in addition to our lesson,\n" .string "we came to see the chamber again.$" ================================================ FILE: data/text/white_out.inc ================================================ Text_FirstShouldRestoreMonsHealth:: .string "First, you should restore your\n" .string "POKéMON to full health.$" Text_MonsHealedShouldBuyPotions:: .string "Your POKéMON have been healed\n" .string "to perfect health.\p" .string "If your POKéMON's energy, HP,\n" .string "is down, please come see us.\p" .string "If you're planning to go far in the\n" .string "field, you should buy some POTIONS\l" .string "at the POKéMON MART.\p" .string "We hope you excel!$" Text_MonsHealed:: .string "Your POKéMON have been healed\n" .string "to perfect health.\p" .string "We hope you excel!$" Text_HadQuiteAnExperienceTakeRest:: .string "MOM: {PLAYER}!\n" .string "Welcome home.\p" .string "It sounds like you had quite\n" .string "an experience.\p" .string "Maybe you should take a quick\n" .string "rest.$" Text_MomExplainHPGetPotions:: .string "MOM: Oh, good! You and your\n" .string "POKéMON are looking great.\p" .string "I just heard from PROF. OAK.\p" .string "He said that POKéMON's energy is\n" .string "measured in HP.\p" .string "If your POKéMON lose their HP,\n" .string "you can restore them at any\l" .string "POKéMON CENTER.\p" .string "If you're going to travel far away,\n" .string "the smart TRAINER stocks up on\l" .string "POTIONS at the POKéMON MART.\p" .string "Make me proud, honey!\p" .string "Take care!$" Text_WhitedOutLostMoney:: .string "{PLAYER} is out of usable\n" .string "POKéMON!\p" .string "{PLAYER} panicked and lost ¥{STR_VAR_1}…\p" .string "… … … …\p" .string "{PLAYER} whited out!$" Text_WhitedOut:: .string "{PLAYER} is out of usable\n" .string "POKéMON!\p" .string "{PLAYER} whited out!$" ================================================ FILE: data/tilesets/primary/building/palettes/00.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 156 213 255 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/primary/building/palettes/01.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/primary/building/palettes/02.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/primary/building/palettes/03.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 222 213 131 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/primary/building/palettes/04.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 238 246 172 197 180 197 222 205 90 189 172 246 238 156 205 189 131 189 164 123 148 131 106 106 106 106 213 222 230 238 180 115 ================================================ FILE: data/tilesets/primary/building/palettes/05.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 213 222 222 164 180 189 255 0 255 131 115 74 213 213 148 197 189 139 172 156 115 148 131 90 197 197 205 205 82 65 0 0 0 ================================================ FILE: data/tilesets/primary/building/palettes/06.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 213 222 246 164 172 222 98 98 123 65 74 106 238 213 205 222 172 164 205 131 123 189 98 82 222 222 222 172 180 189 139 148 164 106 123 123 222 74 0 213 213 57 ================================================ FILE: data/tilesets/primary/building/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 ================================================ FILE: data/tilesets/primary/building/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 ================================================ FILE: data/tilesets/primary/building/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/building/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/building/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/building/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/building/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/building/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/building/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 0 0 0 ================================================ FILE: data/tilesets/primary/general/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 184 248 136 128 208 96 56 144 48 56 88 16 112 96 96 64 56 48 64 72 104 136 216 184 248 192 112 232 128 104 192 48 64 160 224 192 112 200 160 64 176 136 24 160 104 ================================================ FILE: data/tilesets/primary/general/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 123 123 131 32 49 57 230 238 238 90 189 139 90 90 115 238 213 197 222 197 164 189 148 139 148 106 106 123 74 74 90 57 65 115 205 164 ================================================ FILE: data/tilesets/primary/general/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/primary/general/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/primary/general/palettes/04.pal ================================================ JASC-PAL 0100 16 255 0 0 230 246 255 189 222 255 139 164 255 106 164 230 74 148 222 74 123 222 82 156 230 205 222 238 172 189 205 123 123 131 90 90 115 49 115 197 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/primary/general/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 216 224 232 168 184 200 120 120 128 88 88 112 64 72 104 224 216 160 208 192 128 192 168 104 168 144 72 232 224 136 216 192 136 208 184 104 184 224 160 168 216 160 112 200 160 ================================================ FILE: data/tilesets/primary/general/palettes/06.pal ================================================ JASC-PAL 0100 16 255 255 0 205 230 246 180 213 255 123 156 238 98 139 213 65 123 189 49 98 180 82 123 205 238 246 246 205 222 238 49 115 197 139 189 255 115 164 255 65 139 222 57 115 222 82 148 230 ================================================ FILE: data/tilesets/primary/general/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/general/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/general/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/general/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/general/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/general/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/general/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/general/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/primary/general/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 148 148 164 205 189 197 255 255 255 222 213 230 255 255 156 0 238 139 0 189 139 115 115 131 90 106 180 115 139 197 189 41 16 222 74 32 255 98 49 255 222 131 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 148 148 164 205 189 197 255 255 255 189 148 49 156 115 90 197 238 148 156 197 74 106 164 41 115 222 255 0 180 255 0 115 255 0 82 222 0 57 180 255 0 255 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 148 148 164 205 189 197 255 255 255 222 213 230 189 172 180 255 0 255 255 0 255 115 115 131 90 106 180 115 139 197 172 82 49 205 115 82 139 255 255 255 115 0 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 148 148 164 205 189 197 255 255 255 255 213 115 189 148 49 139 98 74 90 106 180 255 205 139 230 172 90 230 148 65 180 98 24 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 148 148 164 205 189 197 255 255 255 115 115 131 205 57 16 255 98 49 0 115 255 255 0 255 82 255 255 255 255 172 255 213 115 213 180 106 164 131 74 222 213 230 ================================================ FILE: data/tilesets/secondary/battlefrontier/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/00.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 255 0 255 115 189 246 98 172 238 115 189 246 98 164 222 82 139 197 74 115 172 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/01.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 255 189 131 238 148 115 222 106 98 205 65 82 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/02.pal ================================================ JASC-PAL 0100 16 24 41 82 180 255 131 131 197 98 57 139 49 57 82 0 222 148 115 106 90 90 164 98 90 65 57 49 255 197 148 222 106 98 205 65 82 164 213 197 115 197 164 65 180 131 24 164 106 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/03.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 213 213 213 189 189 189 164 164 164 131 131 139 255 0 255 255 0 255 65 49 65 238 213 205 222 180 164 189 148 139 156 115 115 131 90 90 98 65 82 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/04.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 255 0 255 255 0 255 255 0 255 255 0 255 82 106 213 65 90 189 57 82 164 49 74 148 172 197 230 139 164 222 106 131 213 82 106 213 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/05.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 238 230 164 222 205 131 213 180 106 205 156 82 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/06.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 197 139 205 172 115 180 148 90 156 106 57 115 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/07.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 238 230 164 222 205 131 213 180 106 205 156 82 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/08.pal ================================================ JASC-PAL 0100 16 222 205 131 180 255 131 131 197 98 57 139 49 57 82 0 222 148 115 106 90 90 164 98 90 65 57 49 255 197 148 222 106 98 205 65 82 164 213 197 222 205 115 189 172 82 156 139 49 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/09.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 255 189 131 238 148 115 222 106 98 205 65 82 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 205 205 197 180 180 164 123 213 164 139 139 148 0 0 0 0 0 0 0 0 0 180 213 255 148 164 238 255 213 49 0 0 0 205 115 82 168 80 64 128 72 64 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/11.pal ================================================ JASC-PAL 0100 16 98 197 0 164 98 90 255 255 255 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 255 213 49 156 139 49 238 148 115 205 65 82 197 139 205 172 115 180 98 197 0 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsideeast/palettes/12.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 255 238 148 255 230 41 205 180 41 156 139 49 230 213 197 197 164 148 164 123 98 115 82 57 106 90 49 255 180 131 222 131 90 189 82 57 164 32 24 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/00.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 255 0 255 115 189 246 98 172 238 115 189 246 98 164 222 82 139 197 74 115 172 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/01.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 255 189 131 238 148 115 222 106 98 205 65 82 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/02.pal ================================================ JASC-PAL 0100 16 24 41 82 180 255 131 131 197 98 57 139 49 57 82 0 222 148 115 106 90 90 164 98 90 65 57 49 255 197 148 222 106 98 205 65 82 164 213 197 115 197 164 65 180 131 24 164 106 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/03.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 213 213 213 189 189 189 164 164 164 131 131 139 255 0 255 255 0 255 65 49 65 238 213 205 222 180 164 189 148 139 156 115 115 131 90 90 98 65 82 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/04.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 255 0 255 255 0 255 255 0 255 255 0 255 82 106 213 65 90 189 57 82 164 49 74 148 172 197 230 139 164 222 106 131 213 82 106 213 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/05.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 238 230 164 222 205 131 213 180 106 205 156 82 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/06.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 197 139 205 172 115 180 148 90 156 106 57 115 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/07.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 205 115 189 172 82 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 164 189 98 131 156 65 98 123 32 65 90 0 156 139 49 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/08.pal ================================================ JASC-PAL 0100 16 222 205 131 180 255 131 131 197 98 57 139 49 57 82 0 222 148 115 106 90 90 164 98 90 65 57 49 255 197 148 222 106 98 205 65 82 164 213 197 222 205 115 189 172 82 156 139 49 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/09.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 255 255 148 197 197 115 213 238 255 139 139 148 98 98 123 65 74 106 213 205 222 180 213 255 148 164 238 131 148 197 238 148 16 205 115 82 172 82 65 131 74 65 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 205 205 197 180 180 164 123 213 164 139 139 148 0 0 0 0 0 0 0 0 0 180 213 255 148 164 238 255 213 49 0 0 0 205 115 82 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/11.pal ================================================ JASC-PAL 0100 16 98 197 0 164 98 90 255 255 255 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 255 213 49 156 139 49 238 148 115 205 65 82 197 139 205 172 115 180 98 197 0 ================================================ FILE: data/tilesets/secondary/battlefrontieroutsidewest/palettes/12.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 255 238 148 255 230 41 205 180 41 156 139 49 230 213 197 197 164 148 164 123 98 115 82 57 106 90 49 255 180 131 222 131 90 189 82 57 164 32 24 115 197 164 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/07.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 213 222 246 164 172 222 98 98 123 65 74 106 123 197 246 74 180 213 65 123 164 49 106 123 189 238 180 106 222 115 74 180 98 57 131 82 131 197 230 98 156 172 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 0 156 164 148 189 197 205 213 213 222 230 238 238 246 255 255 246 32 222 131 131 106 246 32 222 222 189 172 197 139 131 189 106 90 139 115 98 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/battlefrontierrankinghall/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 82 0 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 115 205 164 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 131 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 222 205 131 205 180 106 180 139 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 82 0 57 115 24 98 65 74 131 106 82 65 57 49 255 0 255 255 0 255 255 0 255 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 213 230 189 57 172 131 222 230 246 230 172 123 106 205 164 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 255 152 144 72 120 112 56 123 123 131 90 90 115 65 74 106 222 230 238 184 168 104 168 152 120 255 222 255 248 168 200 240 128 192 240 112 184 184 88 120 238 213 156 205 189 123 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 148 222 213 98 57 148 49 57 82 0 57 115 24 98 65 74 131 106 82 65 57 49 164 164 49 115 106 49 255 0 255 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 148 222 213 98 57 148 49 56 88 16 56 144 48 98 65 74 131 106 82 65 57 49 164 164 49 115 106 49 255 0 255 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/berry_forest/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/00.pal ================================================ JASC-PAL 0100 16 205 156 156 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/01.pal ================================================ JASC-PAL 0100 16 205 156 156 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/02.pal ================================================ JASC-PAL 0100 16 205 156 156 82 82 106 131 131 139 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/03.pal ================================================ JASC-PAL 0100 16 205 156 156 82 82 106 131 131 139 172 172 164 255 255 255 230 180 74 255 246 131 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/07.pal ================================================ JASC-PAL 0100 16 172 189 115 82 82 106 131 131 139 172 172 139 205 205 180 238 238 222 131 148 139 172 189 172 205 205 205 213 222 213 255 255 255 164 123 74 189 148 98 222 172 123 172 180 106 197 205 131 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/08.pal ================================================ JASC-PAL 0100 16 172 189 115 65 74 106 139 139 131 197 197 197 255 255 255 0 0 0 246 197 197 74 74 213 123 123 246 180 180 0 213 197 65 246 246 32 148 82 74 205 49 41 255 123 74 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/09.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/10.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/11.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/12.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/bike_shop/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/00.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/01.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/02.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/03.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 222 213 131 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/04.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 238 246 172 197 180 197 222 205 90 189 172 246 238 156 205 189 131 189 164 123 148 131 106 106 106 106 213 222 230 238 180 115 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/05.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 213 222 222 164 180 189 255 0 255 131 115 74 213 213 148 197 189 139 172 156 115 148 131 90 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/06.pal ================================================ JASC-PAL 0100 16 213 213 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/burgled_house/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 255 213 131 246 180 82 213 148 41 180 172 148 148 139 123 255 255 222 230 230 197 180 74 24 213 98 49 90 156 139 131 197 180 172 230 205 156 222 115 148 189 106 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 230 238 255 213 205 246 164 164 180 156 197 156 106 156 139 246 255 255 0 0 0 180 74 24 213 98 49 123 106 164 156 156 197 197 197 230 156 222 115 148 189 106 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 238 255 255 213 222 238 189 205 197 156 164 172 0 0 0 189 139 90 222 172 106 246 189 115 82 156 164 115 197 222 213 98 82 246 148 131 148 205 90 49 131 24 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 123 123 148 246 255 255 205 213 213 0 0 0 255 123 123 172 123 115 139 230 98 115 189 57 246 230 24 189 180 49 148 148 246 123 123 180 222 222 255 180 172 213 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 49 57 74 172 164 255 131 123 230 106 98 172 82 74 180 82 74 98 246 255 255 115 172 65 123 189 74 148 205 90 98 90 148 139 156 213 57 57 106 148 205 90 0 255 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 197 238 255 172 205 213 131 164 180 123 156 180 98 139 148 246 255 255 164 123 115 180 74 24 213 98 49 98 139 148 172 205 213 197 238 255 156 222 115 148 189 98 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cable_club/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cave/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/cave/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 123 123 131 32 49 57 230 238 238 90 189 139 90 90 115 238 213 197 222 197 164 189 148 139 148 106 106 123 74 74 90 57 65 115 205 164 ================================================ FILE: data/tilesets/secondary/cave/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/cave/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 123 197 255 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/cave/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 230 246 255 189 222 255 139 189 255 115 164 255 65 139 222 57 115 205 82 148 230 205 222 238 172 189 205 123 123 131 90 90 115 49 115 197 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/cave/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/cave/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 205 230 246 180 213 255 123 180 246 98 148 230 65 123 189 49 98 180 82 131 222 213 230 238 172 189 205 123 123 131 90 90 115 238 246 246 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/cave/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cave/palettes/08.pal ================================================ JASC-PAL 0100 16 74 115 172 189 189 156 172 172 139 148 139 115 123 115 90 32 49 57 255 0 255 255 0 255 255 0 255 222 197 189 205 180 156 189 148 139 148 115 106 115 65 74 82 49 65 90 90 98 ================================================ FILE: data/tilesets/secondary/cave/palettes/09.pal ================================================ JASC-PAL 0100 16 213 222 213 189 189 156 172 172 139 148 139 115 123 115 90 255 238 164 230 197 139 205 172 123 164 123 90 148 115 74 106 65 41 74 74 57 0 0 0 98 139 197 74 115 172 57 98 156 ================================================ FILE: data/tilesets/secondary/cave/palettes/10.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 0 0 0 255 238 164 230 197 139 205 172 123 172 139 106 213 197 189 205 180 156 189 148 139 148 115 106 115 65 74 82 49 65 90 90 98 ================================================ FILE: data/tilesets/secondary/cave/palettes/11.pal ================================================ JASC-PAL 0100 16 74 115 172 189 189 156 172 172 139 148 139 115 123 115 90 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 238 222 148 222 205 115 205 180 98 189 172 98 ================================================ FILE: data/tilesets/secondary/cave/palettes/12.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/cave/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cave/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cave/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 82 0 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 115 205 164 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/03.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 222 205 131 205 180 106 180 139 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/08.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 255 222 222 230 123 123 131 82 82 106 197 238 255 172 213 255 123 164 222 98 139 189 246 230 139 197 180 115 172 156 90 123 164 189 148 189 238 255 205 139 230 131 115 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 255 222 222 230 123 123 131 82 82 106 197 197 205 255 213 164 222 123 82 189 90 57 189 230 222 131 189 164 106 148 139 246 238 189 222 213 156 213 189 123 197 180 106 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/10.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 255 222 222 230 123 123 131 82 82 106 238 230 255 222 197 255 180 148 222 131 106 172 255 0 255 115 189 246 74 148 205 41 115 172 148 164 180 246 238 148 213 172 74 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 180 205 213 148 164 180 123 123 131 82 82 106 205 222 238 197 213 222 164 180 197 222 180 82 230 238 238 255 205 139 222 106 98 197 74 65 98 189 148 115 205 164 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/12.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 213 222 164 180 189 131 139 148 90 123 123 131 90 90 115 65 74 106 180 148 222 131 106 172 189 230 222 148 205 180 115 172 148 106 148 139 74 115 106 115 205 164 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_city/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 180 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 238 246 238 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 213 131 82 156 205 246 98 156 238 57 123 222 222 139 106 189 98 74 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 148 148 148 180 180 180 255 255 255 238 246 238 222 238 222 197 205 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 139 139 148 74 156 90 65 139 139 115 205 90 148 238 74 189 255 98 156 131 82 197 115 123 255 164 123 238 238 172 82 115 82 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 139 139 148 222 213 246 238 238 255 123 156 246 106 197 255 131 222 255 156 230 255 115 90 98 189 115 131 246 189 115 222 189 246 255 230 115 90 98 213 255 172 197 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 156 131 57 213 197 106 246 238 148 213 222 238 222 230 255 41 106 82 57 131 115 172 131 115 197 156 148 238 180 164 180 139 123 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 41 123 123 41 156 156 49 189 172 65 230 189 65 246 230 106 90 74 131 106 74 156 131 65 172 156 74 172 156 106 205 180 106 222 205 98 230 222 106 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/celadon_gym/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/00.pal ================================================ JASC-PAL 0100 16 74 115 172 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/08.pal ================================================ JASC-PAL 0100 16 74 115 172 197 205 222 172 180 197 156 164 180 115 123 139 148 156 164 255 0 255 255 0 255 255 0 255 205 246 172 172 213 148 139 180 131 115 156 106 82 123 90 57 98 74 65 65 74 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/09.pal ================================================ JASC-PAL 0100 16 197 205 222 197 205 222 172 180 197 156 164 180 115 123 139 255 246 164 205 189 106 156 131 57 82 74 32 90 106 115 255 0 255 65 65 74 16 16 24 98 139 197 74 115 172 57 98 156 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/10.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 0 0 0 255 238 180 230 205 164 189 180 164 172 164 156 205 246 172 172 213 148 139 180 131 115 156 106 82 123 90 57 98 74 65 65 74 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/11.pal ================================================ JASC-PAL 0100 16 74 115 172 197 205 222 172 180 197 156 164 180 115 123 139 148 156 164 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 123 189 156 106 156 139 98 123 123 90 98 115 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/12.pal ================================================ JASC-PAL 0100 16 197 205 222 197 205 222 172 180 197 156 164 180 115 123 139 238 238 164 205 205 106 172 172 90 123 131 74 115 123 139 82 90 32 65 65 74 16 16 24 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_cave/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/01.pal ================================================ JASC-PAL 0100 16 115 205 164 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/02.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/03.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/04.pal ================================================ JASC-PAL 0100 16 115 205 164 213 238 255 172 205 255 139 180 238 106 156 230 74 139 189 65 123 189 82 139 205 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/05.pal ================================================ JASC-PAL 0100 16 115 205 164 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 213 238 255 172 205 255 139 180 238 106 156 230 65 123 172 41 98 156 74 115 197 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/08.pal ================================================ JASC-PAL 0100 16 115 205 164 90 139 164 115 164 189 139 189 213 172 222 238 139 197 98 156 222 106 189 230 139 222 205 172 246 230 189 255 246 213 164 164 180 82 82 106 123 123 139 205 205 222 255 255 255 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 180 106 90 222 180 65 238 164 156 246 238 131 230 205 98 205 131 123 0 0 255 0 0 255 0 0 255 0 0 255 164 164 180 82 82 106 123 123 139 205 205 222 255 255 255 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/10.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 255 238 197 222 205 172 180 164 123 123 123 131 90 90 115 65 74 106 123 180 222 180 222 255 255 213 164 230 189 82 213 164 57 205 139 32 172 90 16 115 205 164 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/11.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 255 238 197 222 205 172 180 164 123 123 123 131 90 90 115 65 74 106 230 222 131 189 180 82 180 230 172 139 213 131 106 180 106 90 164 90 57 131 65 115 205 164 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/12.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 238 222 180 205 189 156 180 164 123 123 123 131 90 90 115 65 74 106 139 197 98 106 164 65 172 222 238 148 197 213 115 164 189 90 139 164 74 123 148 115 205 164 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_city/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/00.pal ================================================ JASC-PAL 0100 16 205 156 156 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/01.pal ================================================ JASC-PAL 0100 16 205 156 156 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/02.pal ================================================ JASC-PAL 0100 16 205 156 156 82 82 106 131 131 139 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/03.pal ================================================ JASC-PAL 0100 16 205 156 156 82 82 106 131 131 139 172 172 164 255 255 255 230 180 74 255 246 131 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/07.pal ================================================ JASC-PAL 0100 16 172 189 115 156 205 246 98 156 238 0 0 0 0 0 0 123 164 172 148 189 197 172 205 213 205 222 230 98 123 148 123 148 172 148 172 197 98 98 123 148 139 131 222 205 213 255 255 255 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/08.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/09.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/10.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/11.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/12.pal ================================================ JASC-PAL 0100 16 172 189 115 123 164 172 222 189 172 246 213 189 246 230 180 255 246 213 164 189 213 189 205 230 222 230 246 98 123 148 123 148 172 148 172 197 98 98 123 148 139 131 205 189 197 255 255 255 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cerulean_gym/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 180 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 238 246 238 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 213 131 82 156 205 246 98 156 238 57 123 222 222 139 106 189 98 74 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 148 148 148 180 180 180 255 255 255 238 246 238 222 238 222 197 205 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 139 139 148 180 156 172 205 189 189 230 222 189 90 115 90 131 197 115 205 238 115 123 82 74 180 98 98 255 139 74 238 246 172 255 230 74 106 90 82 255 0 255 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 139 139 148 205 189 189 246 246 255 148 131 180 205 189 230 123 98 255 82 172 148 255 98 98 90 115 90 131 197 115 205 238 115 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 106 90 82 148 115 82 172 131 90 213 172 90 230 180 90 164 90 172 197 115 205 230 148 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_gym/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/00.pal ================================================ JASC-PAL 0100 16 115 205 164 189 255 139 131 213 98 57 148 49 57 82 0 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 115 205 164 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 222 205 131 205 180 106 180 139 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/08.pal ================================================ JASC-PAL 0100 16 115 205 164 139 82 57 164 106 82 205 148 123 222 164 139 172 189 238 213 222 246 156 131 90 189 164 115 222 205 156 255 238 189 164 164 180 82 82 106 123 123 139 205 205 222 255 255 255 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 246 230 230 189 197 197 156 172 172 131 123 123 82 65 74 106 123 123 131 123 123 131 98 164 222 74 131 197 139 222 189 106 189 156 106 189 156 74 156 123 90 90 115 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/10.pal ================================================ JASC-PAL 0100 16 115 205 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/11.pal ================================================ JASC-PAL 0100 16 115 205 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/12.pal ================================================ JASC-PAL 0100 16 115 205 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/cinnabar_island/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 156 213 255 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/01.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/02.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/03.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 222 213 131 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/04.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 238 246 172 197 180 197 222 205 90 189 172 246 238 156 205 189 131 189 164 123 148 131 106 106 106 106 213 222 230 238 180 115 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/05.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 213 222 222 164 180 189 255 0 255 131 115 74 213 213 148 197 189 139 172 156 115 148 131 90 197 197 205 205 82 65 0 0 0 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/06.pal ================================================ JASC-PAL 0100 16 213 213 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 139 139 148 180 180 164 255 255 255 205 197 106 246 238 148 255 255 222 98 98 123 238 238 238 82 222 123 131 255 164 82 164 57 230 139 98 189 98 74 213 213 213 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 148 148 164 180 180 164 255 255 255 213 213 213 106 156 164 131 189 197 172 222 230 238 180 222 180 115 164 213 213 180 255 0 255 156 205 246 98 156 238 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 148 148 164 180 180 164 255 255 255 213 213 213 148 205 180 115 172 148 106 148 139 197 238 255 172 213 255 123 164 222 98 139 189 123 164 189 148 189 238 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 148 148 164 205 189 197 255 255 255 255 213 115 189 148 49 139 98 74 90 106 180 255 205 139 230 172 90 230 148 65 180 98 24 238 213 172 222 156 139 123 123 123 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 115 115 115 180 180 164 238 238 238 213 222 164 115 156 148 230 213 115 180 172 90 139 148 90 98 123 180 148 156 156 189 197 197 246 230 164 180 189 131 205 213 213 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 131 131 82 164 164 98 197 197 156 106 164 172 197 205 213 205 156 32 172 148 197 205 164 230 230 197 255 205 197 106 230 230 230 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/condominiums/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 213 222 164 180 189 131 139 148 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/department_store/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/department_store/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/department_store/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/department_store/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/department_store/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/department_store/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/department_store/palettes/06.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/department_store/palettes/07.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/department_store/palettes/08.pal ================================================ JASC-PAL 0100 16 139 222 156 82 82 106 115 123 131 98 90 65 139 123 82 197 172 90 230 230 238 205 115 74 238 172 82 238 213 82 131 189 57 164 222 82 156 139 172 205 172 222 213 205 230 246 255 255 ================================================ FILE: data/tilesets/secondary/department_store/palettes/09.pal ================================================ JASC-PAL 0100 16 139 222 156 82 82 106 131 131 131 172 123 82 205 131 65 213 148 65 205 148 82 238 164 82 238 180 82 148 106 74 189 197 213 222 230 230 156 172 172 90 131 238 106 164 255 156 189 255 ================================================ FILE: data/tilesets/secondary/department_store/palettes/10.pal ================================================ JASC-PAL 0100 16 139 222 156 82 82 106 131 131 131 57 106 82 41 156 98 90 205 115 197 172 90 156 131 82 213 205 106 230 197 238 180 189 164 213 222 189 156 172 172 205 180 213 189 197 213 230 246 238 ================================================ FILE: data/tilesets/secondary/department_store/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/department_store/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/department_store/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/department_store/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/department_store/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/00.pal ================================================ JASC-PAL 0100 16 74 115 172 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/08.pal ================================================ JASC-PAL 0100 16 74 115 172 197 172 123 172 139 90 148 106 65 123 74 41 255 0 255 255 0 255 255 0 255 255 0 255 222 222 156 189 189 123 148 148 106 115 106 90 82 74 65 57 49 41 65 65 74 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/09.pal ================================================ JASC-PAL 0100 16 74 115 172 197 172 123 172 139 90 148 106 65 123 74 41 164 180 230 139 156 222 98 106 139 65 65 57 255 0 255 255 0 255 65 65 74 0 0 0 98 139 197 74 115 172 57 98 156 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/10.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 0 0 0 255 238 180 222 205 148 197 172 123 172 139 90 222 222 156 189 189 123 148 148 106 115 106 90 82 74 65 57 49 41 65 65 74 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/11.pal ================================================ JASC-PAL 0100 16 74 115 172 197 172 123 172 139 90 148 106 65 123 74 41 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 230 222 164 213 197 131 197 172 106 172 148 74 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/12.pal ================================================ JASC-PAL 0100 16 74 115 172 180 180 98 164 164 74 139 139 49 123 115 41 255 238 180 222 205 148 197 172 123 172 139 90 222 222 156 189 189 123 148 148 82 115 106 49 90 82 41 57 49 41 65 65 74 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/digletts_cave/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 246 246 255 205 197 213 156 156 164 222 230 255 172 205 213 156 189 172 189 230 148 139 205 123 106 131 98 238 131 106 205 106 106 255 246 41 255 205 148 189 197 115 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 172 172 189 222 213 205 238 238 238 123 139 74 148 205 98 205 246 123 255 238 230 222 222 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 156 156 139 164 148 65 213 164 106 230 213 131 246 238 205 0 0 0 197 189 123 222 213 139 246 238 180 238 205 172 205 205 213 255 148 131 255 255 115 156 197 230 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_1/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/00.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 189 189 131 115 189 246 98 172 238 115 189 246 98 164 222 82 139 197 74 115 172 115 197 164 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/01.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 255 189 131 238 148 115 222 106 98 205 65 82 115 197 164 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/02.pal ================================================ JASC-PAL 0100 16 24 41 82 180 255 131 131 197 98 57 139 49 57 82 0 222 148 115 106 90 90 164 98 90 65 57 49 255 197 148 222 106 98 205 65 82 164 213 197 115 197 164 65 180 131 24 164 106 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/03.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 213 213 213 189 189 189 164 164 164 131 131 139 65 180 131 164 213 197 65 49 65 238 213 205 222 180 164 189 148 139 156 115 115 131 90 90 98 65 82 115 197 164 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/04.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 255 0 255 255 0 255 255 0 255 156 164 189 82 106 213 65 90 189 57 82 156 41 65 139 172 197 230 139 164 222 106 131 213 82 106 213 115 197 164 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/05.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 131 197 246 106 180 222 238 230 164 222 205 131 213 180 106 205 156 82 115 197 164 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/07.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 238 222 172 230 156 98 197 90 65 65 74 106 106 106 123 131 90 49 90 65 49 57 57 57 222 222 197 172 180 148 131 148 115 106 123 65 156 205 230 156 156 156 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/08.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 213 222 246 131 131 139 98 98 123 65 74 106 164 205 189 139 180 172 115 156 139 98 139 131 189 172 180 156 139 148 230 106 57 205 49 24 148 57 24 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/09.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 213 222 246 164 172 222 98 98 123 65 74 106 98 98 123 65 74 106 115 123 164 49 49 74 189 238 180 106 222 115 74 180 98 57 131 82 131 197 230 98 156 172 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/10.pal ================================================ JASC-PAL 0100 16 115 197 164 82 82 106 148 148 164 205 189 197 255 255 255 222 213 230 189 172 180 255 205 106 230 189 106 205 156 82 255 0 255 255 0 255 255 0 255 255 0 255 57 139 49 106 106 123 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 74 74 98 106 106 115 0 0 0 0 0 0 148 106 57 189 139 57 213 189 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/12.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 213 222 246 164 172 222 98 98 123 65 74 106 238 213 205 222 172 164 205 131 123 189 98 82 222 222 222 172 180 189 139 148 164 106 123 123 222 74 0 213 213 57 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_2/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/08.pal ================================================ JASC-PAL 0100 16 74 115 172 189 189 156 172 172 139 148 139 115 123 115 90 255 0 255 255 0 255 255 0 255 255 0 255 222 197 189 205 180 156 189 148 139 148 115 106 115 65 74 82 49 65 90 90 98 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/09.pal ================================================ JASC-PAL 0100 16 213 222 213 189 189 156 172 172 139 148 139 115 123 115 90 255 238 164 230 197 139 205 172 123 164 123 90 148 115 74 106 65 41 74 74 57 0 0 0 98 139 197 74 115 172 57 98 156 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/10.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 0 0 0 255 238 164 230 197 139 205 172 123 172 139 106 213 197 189 205 180 156 189 148 139 148 115 106 115 65 74 82 49 65 90 90 98 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/11.pal ================================================ JASC-PAL 0100 16 74 115 172 189 189 156 172 172 139 148 139 115 123 115 90 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 238 222 148 222 205 115 205 180 98 189 172 98 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/12.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_3/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/08.pal ================================================ JASC-PAL 0100 16 74 115 172 189 189 156 172 172 139 148 139 115 123 115 90 255 0 255 255 0 255 255 0 255 255 0 255 222 197 189 205 180 156 189 148 139 148 115 106 115 65 74 82 49 65 90 90 98 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/09.pal ================================================ JASC-PAL 0100 16 213 222 213 189 189 156 172 172 139 148 139 115 123 115 90 255 238 164 230 197 139 205 172 123 164 123 90 148 115 74 106 65 41 74 74 57 0 0 0 98 139 197 74 115 172 57 98 156 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/10.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 0 0 0 255 238 164 230 197 139 205 172 123 172 139 106 213 197 189 205 180 156 189 148 139 148 115 106 115 65 74 82 49 65 90 90 98 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/11.pal ================================================ JASC-PAL 0100 16 74 115 172 189 189 156 172 172 139 148 139 115 123 115 90 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 238 222 148 222 205 115 205 180 98 189 172 98 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/12.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/dummy_4/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/08.pal ================================================ JASC-PAL 0100 16 172 189 197 82 82 106 131 131 131 131 115 90 189 131 90 205 156 90 238 180 90 172 172 131 222 222 172 172 180 205 238 230 172 255 255 246 255 255 246 197 205 222 205 213 230 230 230 246 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/09.pal ================================================ JASC-PAL 0100 16 172 189 197 82 82 106 131 131 131 246 246 189 180 180 139 205 156 90 230 230 131 222 213 131 205 205 115 197 180 115 255 0 255 123 123 98 156 156 98 205 148 197 90 164 205 90 189 246 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/10.pal ================================================ JASC-PAL 0100 16 172 189 197 82 82 106 131 131 131 123 189 222 123 156 189 164 222 246 189 238 238 74 139 98 106 172 106 123 205 123 90 148 115 139 197 131 197 238 123 197 172 74 255 0 255 230 230 106 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fan_club_daycare/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/00.pal ================================================ JASC-PAL 0100 16 115 205 164 189 255 139 131 213 98 57 139 49 57 82 0 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 115 205 164 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 131 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 222 205 131 205 180 106 180 139 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/08.pal ================================================ JASC-PAL 0100 16 115 205 164 65 74 106 123 123 131 98 90 82 115 106 98 148 131 131 180 156 131 189 172 98 213 205 131 238 222 139 90 106 164 98 139 230 115 205 255 255 0 255 255 0 255 98 106 115 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 65 74 106 123 123 131 139 90 82 189 123 115 222 148 131 255 197 156 156 156 172 189 197 213 230 238 238 49 98 90 74 148 131 82 197 148 106 230 172 164 238 172 98 106 115 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/10.pal ================================================ JASC-PAL 0100 16 115 205 164 65 74 106 123 123 131 180 164 90 0 0 255 255 238 197 238 238 205 189 180 172 172 172 156 205 205 172 139 123 49 164 148 74 205 197 123 230 213 139 106 172 123 123 197 139 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/11.pal ================================================ JASC-PAL 0100 16 197 197 197 180 238 82 139 213 82 90 164 49 57 90 90 74 123 74 90 98 49 139 131 49 65 57 49 57 139 98 123 197 49 123 197 82 57 139 49 115 205 164 57 172 156 255 0 255 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/12.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 131 205 180 106 238 180 139 222 148 131 189 123 115 139 90 82 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_city/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 156 131 57 213 197 106 246 238 148 213 222 238 222 230 255 41 106 82 57 131 115 172 131 115 197 156 148 238 180 164 180 139 123 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 156 131 57 213 197 106 246 238 148 156 205 246 115 172 222 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 131 131 131 180 180 164 255 255 255 172 131 115 197 156 148 238 180 164 255 222 197 255 238 238 230 164 98 255 197 98 205 164 156 180 139 123 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/fuchsia_gym/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 131 131 131 180 180 164 255 255 255 255 164 115 255 222 189 123 164 238 172 205 238 213 230 238 164 255 180 238 164 0 139 90 197 213 156 255 255 255 148 255 0 255 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/08.pal ================================================ JASC-PAL 0100 16 0 255 0 82 82 106 131 131 131 180 180 164 255 255 255 255 255 123 205 180 98 246 230 172 74 131 197 139 197 255 164 255 180 238 246 246 164 74 32 213 115 57 238 148 98 255 189 98 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 255 0 255 255 0 255 255 255 255 255 0 255 131 172 238 246 230 172 82 180 172 32 115 123 255 148 115 230 106 90 90 213 156 255 189 82 16 123 255 131 189 246 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 230 230 230 172 148 197 205 164 230 230 197 255 238 230 123 189 172 98 255 255 148 131 255 255 74 131 197 230 189 164 255 0 255 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 172 172 156 230 230 205 197 197 172 172 172 164 189 189 164 255 0 255 131 172 238 106 197 106 197 180 74 255 0 255 222 222 222 213 139 57 255 255 255 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 222 238 255 255 0 255 255 0 255 32 156 222 139 197 255 180 98 0 197 123 0 205 139 0 213 164 0 230 180 0 230 197 65 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/game_corner/palettes/15.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 230 230 205 205 205 180 172 172 148 222 222 222 156 115 197 131 172 238 106 197 106 197 180 74 0 0 0 213 139 57 238 222 131 255 255 255 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 180 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 238 246 238 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 255 0 255 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 164 164 164 180 189 189 255 255 255 238 246 238 213 230 222 197 205 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/08.pal ================================================ JASC-PAL 0100 16 139 222 156 82 82 106 115 123 131 98 90 65 139 123 82 197 172 90 230 230 238 205 115 74 238 172 82 238 213 82 131 189 57 164 222 82 156 139 172 205 172 222 213 205 230 246 255 255 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_1/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 148 172 139 180 197 164 213 222 197 238 255 213 115 156 180 197 222 238 123 197 189 156 222 213 213 255 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 230 222 156 189 98 74 230 156 98 213 205 156 115 156 180 246 238 189 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/09.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 156 213 255 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 131 131 131 180 180 164 255 255 255 189 164 82 222 197 106 230 222 156 123 197 189 156 222 213 213 255 246 255 0 255 255 0 255 213 131 65 222 230 222 246 238 189 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/generic_building_2/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/01.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/02.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/03.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 222 213 131 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/04.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 238 246 172 197 180 197 222 205 90 189 172 246 238 156 205 189 131 189 164 123 148 131 106 106 106 106 213 222 230 238 180 115 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/05.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 213 222 222 164 180 189 255 0 255 131 115 74 213 213 148 197 189 139 172 156 115 148 131 90 197 197 205 205 82 65 0 0 0 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/06.pal ================================================ JASC-PAL 0100 16 213 213 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 180 180 164 255 255 255 156 189 255 82 123 197 49 90 156 106 164 148 82 139 123 106 164 222 222 230 148 189 197 115 90 148 197 222 164 32 189 230 255 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 131 131 139 172 172 164 255 255 255 213 222 222 180 197 213 156 172 197 230 106 90 189 65 49 255 131 115 139 41 24 197 255 205 238 197 106 255 255 213 255 246 172 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 172 172 164 255 255 255 139 222 148 156 238 164 197 255 205 172 246 180 238 238 197 255 0 255 255 0 255 0 255 156 189 65 49 255 222 123 246 197 0 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/10.pal ================================================ JASC-PAL 0100 16 90 0 255 238 230 156 230 189 131 131 189 172 205 82 65 255 148 0 106 164 148 82 139 123 82 82 106 123 123 123 180 180 164 255 255 255 156 213 197 164 172 139 90 0 255 90 0 255 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 148 148 164 205 189 197 255 255 255 115 115 131 255 0 255 0 255 156 106 164 148 82 139 123 255 0 255 255 255 172 255 213 115 213 180 106 164 131 74 222 213 230 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hall_of_fame/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 139 139 139 189 189 164 255 255 255 230 222 246 255 238 213 255 0 0 115 115 164 131 139 230 164 164 255 156 106 16 115 115 139 213 213 172 222 172 82 189 139 49 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 139 139 148 180 180 164 255 255 255 255 0 0 255 0 0 255 0 0 255 0 0 172 90 49 205 98 57 246 139 98 255 205 139 255 0 0 255 0 0 255 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 139 139 139 189 189 164 255 255 255 230 222 246 148 148 197 189 189 246 205 106 49 246 180 49 255 246 131 255 0 0 189 172 82 213 205 98 148 115 41 172 139 57 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 123 123 131 189 189 164 255 255 255 213 197 74 213 180 131 148 115 41 172 139 57 213 213 180 106 139 49 131 172 74 164 205 106 197 255 172 115 90 57 255 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 139 139 139 189 189 164 255 255 255 222 197 74 230 230 106 230 222 246 148 98 123 197 131 156 197 164 189 123 164 189 131 197 98 172 238 139 90 156 57 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 65 74 106 139 139 139 180 180 164 255 255 255 189 180 49 222 213 82 123 115 49 156 148 16 213 213 180 98 156 139 123 180 189 172 222 230 255 205 139 246 246 164 222 131 90 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/hoenn_building/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/01.pal ================================================ JASC-PAL 0100 16 255 0 255 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/02.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/03.pal ================================================ JASC-PAL 0100 16 255 0 255 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/04.pal ================================================ JASC-PAL 0100 16 255 0 255 222 230 255 197 213 255 164 197 238 123 172 230 90 148 197 65 123 180 90 164 205 205 222 238 172 189 205 123 123 131 90 90 115 32 98 139 238 230 139 222 197 139 205 180 106 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/05.pal ================================================ JASC-PAL 0100 16 255 0 255 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 222 230 255 197 213 255 164 197 238 123 172 230 41 82 164 41 57 131 74 123 197 205 222 238 172 189 205 123 123 131 90 90 115 32 98 139 238 230 139 222 197 139 205 180 106 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 205 65 222 172 65 180 98 0 213 213 139 189 189 115 148 148 82 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/10.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 213 230 197 156 172 139 123 123 131 90 90 115 65 74 106 222 172 65 180 98 0 131 65 0 205 205 123 164 164 57 115 189 246 74 148 213 49 115 180 189 197 164 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 255 255 255 255 213 213 222 180 180 164 148 148 139 123 123 131 82 82 106 197 222 205 148 172 156 98 131 106 230 139 24 197 98 0 172 65 0 230 213 139 205 180 106 172 148 82 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 255 148 148 139 222 222 230 205 205 213 180 180 164 255 0 255 222 222 205 205 205 189 172 172 164 255 0 255 255 0 255 255 0 255 255 0 255 230 213 139 205 180 106 115 205 164 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/indigo_plateau/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 123 123 131 65 49 65 230 238 238 90 189 139 90 90 115 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 230 246 255 189 222 255 139 189 255 115 164 255 65 139 222 57 115 222 82 148 230 205 222 238 172 189 205 123 123 131 90 90 115 49 115 197 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 205 230 246 180 213 255 123 180 246 98 148 230 65 123 189 49 98 180 82 131 222 213 230 238 172 189 205 123 123 131 90 90 115 238 246 246 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 172 172 164 205 213 213 180 189 189 148 156 156 106 115 115 197 246 230 106 205 164 57 156 115 222 106 98 222 213 123 255 180 148 197 189 98 238 246 255 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/09.pal ================================================ JASC-PAL 0100 16 65 123 180 238 246 255 222 230 238 189 205 230 156 164 189 139 139 156 98 98 123 57 57 106 197 98 98 172 65 106 32 74 156 197 148 0 246 213 24 222 238 255 255 255 255 74 106 139 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 148 148 164 205 189 197 255 255 255 255 213 115 189 148 49 139 98 74 90 106 180 255 205 139 230 172 90 230 148 65 180 98 24 238 213 172 222 156 139 123 123 123 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 148 148 164 172 172 164 164 222 255 115 180 205 65 139 164 41 106 148 205 213 213 238 230 139 189 180 98 139 131 65 0 0 0 255 255 255 230 172 90 189 246 255 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/12.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 224 224 200 104 120 64 128 144 112 65 74 106 98 98 123 232 152 96 176 176 144 160 168 216 189 238 180 106 222 115 74 180 98 57 131 82 128 192 224 96 152 168 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/13.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/island_harbor/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lab/palettes/00.pal ================================================ JASC-PAL 0100 16 238 238 246 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/lab/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/lab/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/lab/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 255 0 255 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/secondary/lab/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lab/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lab/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lab/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 139 131 148 180 172 180 189 197 213 255 255 255 255 205 139 230 164 98 197 131 65 172 90 24 82 148 197 131 189 222 189 230 255 123 123 123 197 180 74 246 238 148 ================================================ FILE: data/tilesets/secondary/lab/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 139 131 148 180 172 180 189 197 213 255 255 255 222 222 180 197 197 148 156 156 106 230 164 98 172 90 24 172 164 65 139 123 24 246 238 148 0 0 0 246 238 148 ================================================ FILE: data/tilesets/secondary/lab/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lab/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lab/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lab/palettes/12.pal ================================================ JASC-PAL 0100 16 238 238 246 82 82 106 139 131 148 180 172 180 189 197 213 255 255 255 139 197 139 156 205 246 98 156 238 90 123 180 222 205 106 213 230 246 255 189 180 230 106 65 255 131 115 246 238 148 ================================================ FILE: data/tilesets/secondary/lab/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lab/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lab/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 255 255 172 222 255 148 189 238 106 156 230 57 148 197 32 131 172 82 148 213 205 222 238 172 189 205 123 123 131 90 90 115 230 213 148 238 230 139 222 197 139 213 189 106 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 222 255 255 172 222 255 148 189 238 106 156 230 41 90 172 41 57 148 74 123 197 205 222 238 172 189 205 123 123 131 90 90 115 230 213 148 238 230 139 222 197 139 213 189 106 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 115 205 164 148 164 180 123 123 131 65 74 106 205 82 74 172 32 41 255 246 189 238 230 156 222 205 131 189 164 90 148 131 49 123 90 24 123 123 131 65 74 106 205 222 238 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 255 255 255 230 246 238 148 164 180 123 123 131 90 90 115 65 74 106 172 172 106 213 213 148 180 205 180 148 180 148 131 164 131 106 139 106 197 222 197 139 172 139 90 115 90 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 255 255 255 213 230 222 148 164 180 123 123 131 90 90 115 82 82 106 213 238 255 164 189 222 123 148 180 255 238 139 222 180 65 255 255 189 164 98 98 213 148 148 197 123 131 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 255 255 255 255 0 255 255 0 255 123 123 131 255 0 255 82 82 106 213 238 255 164 189 222 123 148 180 255 238 139 222 180 65 255 255 189 156 213 255 115 189 246 98 164 222 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 246 246 255 222 205 246 205 172 255 172 139 213 123 123 131 90 90 115 65 74 106 230 222 131 213 189 98 222 197 255 172 139 213 148 115 189 139 106 180 255 246 164 172 148 82 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/lavender_town/palettes/15.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 246 230 172 246 213 180 222 189 164 180 148 123 139 98 90 90 57 74 123 123 131 65 74 106 205 222 238 ================================================ FILE: data/tilesets/secondary/mart/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/mart/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 238 246 238 ================================================ FILE: data/tilesets/secondary/mart/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/mart/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 164 172 164 180 189 189 238 246 246 238 246 238 213 230 222 197 205 197 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/mart/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mart/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mart/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mart/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/mart/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 189 139 172 230 172 205 246 205 0 0 0 ================================================ FILE: data/tilesets/secondary/mart/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 164 172 164 180 189 189 238 246 246 238 246 238 213 230 222 197 205 197 255 0 255 255 0 255 156 205 255 106 164 238 74 139 230 57 131 205 41 98 189 255 0 255 ================================================ FILE: data/tilesets/secondary/mart/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mart/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mart/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mart/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mart/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mart/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/00.pal ================================================ JASC-PAL 0100 16 115 205 164 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/01.pal ================================================ JASC-PAL 0100 16 115 205 164 222 230 230 197 205 213 172 189 205 123 123 131 65 49 65 230 238 238 90 189 139 90 90 115 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/02.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/03.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/04.pal ================================================ JASC-PAL 0100 16 115 205 164 213 238 255 172 205 255 139 180 238 106 156 230 74 139 189 65 123 189 82 139 205 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/05.pal ================================================ JASC-PAL 0100 16 115 205 164 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/06.pal ================================================ JASC-PAL 0100 16 115 205 164 213 238 255 172 205 255 139 180 238 106 156 230 65 123 172 41 98 156 74 115 197 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/07.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 172 123 123 139 98 98 115 74 74 90 49 49 65 24 24 41 0 0 41 41 49 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/08.pal ================================================ JASC-PAL 0100 16 74 115 172 197 197 180 172 172 156 148 148 123 123 123 106 255 0 255 255 0 255 255 0 255 255 0 255 213 172 172 197 156 148 172 123 123 131 82 74 115 49 49 90 24 24 90 90 98 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/09.pal ================================================ JASC-PAL 0100 16 74 115 172 197 197 180 172 172 156 148 148 123 123 123 106 255 238 164 230 197 139 205 172 123 164 123 90 148 115 74 106 65 41 74 74 57 0 0 0 98 139 197 74 115 172 57 98 156 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/10.pal ================================================ JASC-PAL 0100 16 74 115 172 255 0 255 255 0 255 255 0 255 0 0 0 255 238 164 230 197 139 205 172 123 172 139 106 213 172 172 197 156 148 172 123 123 131 82 74 115 49 49 90 24 24 90 90 98 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/11.pal ================================================ JASC-PAL 0100 16 74 115 172 197 197 180 172 172 156 148 148 123 123 123 106 164 172 172 255 230 65 123 123 106 255 255 255 74 65 74 238 238 230 189 189 180 230 230 205 205 205 180 180 180 164 164 164 148 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/12.pal ================================================ JASC-PAL 0100 16 74 115 172 139 205 246 98 172 197 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 139 90 90 106 65 65 82 49 49 49 32 32 24 16 16 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/mt_ember/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/museum/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/museum/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 180 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 238 246 238 ================================================ FILE: data/tilesets/secondary/museum/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 213 131 82 156 205 246 98 156 238 57 123 222 222 139 106 189 98 74 ================================================ FILE: data/tilesets/secondary/museum/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 148 148 148 180 180 180 255 255 255 238 246 238 222 238 222 197 205 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 90 90 90 115 106 98 148 123 98 ================================================ FILE: data/tilesets/secondary/museum/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/museum/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/museum/palettes/06.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/museum/palettes/07.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/museum/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 106 98 74 139 123 74 164 139 74 222 205 74 123 123 123 189 197 205 238 246 238 98 90 98 156 131 106 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/museum/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 98 98 74 164 139 82 222 205 74 255 0 255 255 0 255 213 213 156 222 230 172 246 246 238 90 90 98 115 115 106 156 131 106 205 131 82 238 164 106 ================================================ FILE: data/tilesets/secondary/museum/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 98 98 74 164 139 82 222 205 74 65 123 164 82 139 197 98 189 213 148 213 213 180 238 230 189 197 205 238 246 238 222 222 172 205 131 82 246 172 106 ================================================ FILE: data/tilesets/secondary/museum/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/museum/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/museum/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/museum/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/museum/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 255 0 255 197 213 205 180 197 189 164 172 172 131 148 139 255 0 255 246 205 74 255 0 255 180 189 197 180 189 197 189 197 197 164 172 172 131 139 139 106 106 106 90 90 82 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 255 255 0 255 197 213 205 180 197 189 164 172 172 131 148 139 255 0 255 255 0 255 255 0 255 255 255 255 255 255 255 246 246 238 222 222 213 189 189 180 156 156 139 98 98 90 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 255 238 238 164 197 213 205 180 197 189 164 172 172 205 205 106 205 205 197 172 172 90 123 131 74 82 90 32 106 106 82 74 74 74 0 0 0 98 139 197 74 115 172 57 98 156 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 255 238 238 230 172 172 164 74 74 74 0 0 0 255 246 180 238 222 123 197 205 123 197 213 205 255 255 255 255 255 255 246 246 238 222 222 213 189 189 180 156 156 139 98 98 90 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 255 230 197 65 197 213 205 180 197 189 164 172 172 205 205 197 255 230 65 123 123 131 255 255 255 74 65 74 238 238 230 189 189 180 238 238 230 222 222 213 205 205 197 156 156 164 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 197 213 205 180 197 189 164 172 172 131 148 139 255 0 255 255 0 255 255 0 255 139 156 180 139 139 164 131 139 148 115 115 131 90 90 106 82 82 82 57 65 65 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/navel_rock/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 139 49 57 82 0 115 98 98 65 57 49 255 255 255 139 213 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 189 139 24 172 106 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 238 238 238 222 222 230 172 189 205 131 131 139 65 49 65 139 230 189 74 205 131 65 172 115 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 115 205 164 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/02.pal ================================================ JASC-PAL 0100 16 24 41 82 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 115 82 74 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 197 172 139 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 238 246 189 139 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 172 32 41 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 222 230 238 230 213 164 205 197 148 222 180 164 156 164 189 82 106 213 65 90 189 57 82 156 41 65 139 172 197 230 139 164 222 106 131 213 82 106 213 189 148 139 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 238 222 164 222 205 131 205 180 106 180 139 74 238 230 172 246 238 205 222 205 131 255 0 255 65 189 139 115 205 164 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 246 246 255 222 230 246 189 197 222 156 172 189 123 123 131 90 90 115 65 74 106 156 205 246 98 156 238 57 123 222 255 205 180 246 164 131 222 139 106 189 98 74 123 205 164 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 246 246 255 222 230 246 189 197 222 156 172 189 123 123 131 90 90 115 65 74 106 156 205 246 98 156 238 57 123 222 246 238 197 230 222 148 213 189 106 197 148 74 222 205 123 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 82 205 148 246 246 255 189 197 222 156 172 189 123 123 131 90 90 115 65 74 106 156 205 246 98 156 238 98 156 238 205 139 148 189 123 131 164 90 106 139 65 82 32 172 98 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 238 255 255 156 230 197 148 222 189 139 213 189 255 0 255 255 0 255 255 0 255 189 238 213 115 205 164 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 156 230 197 148 222 189 139 213 189 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 189 238 213 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pallet_town/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 139 49 57 82 0 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 255 0 255 255 0 255 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 115 205 164 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 131 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 222 205 131 205 180 106 180 139 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/08.pal ================================================ JASC-PAL 0100 16 24 41 82 246 246 255 230 238 255 197 205 222 148 164 180 123 123 131 90 90 115 65 74 106 156 205 246 98 156 238 57 123 222 222 106 98 205 82 74 222 230 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 205 246 98 156 238 57 123 222 222 197 139 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 230 238 255 180 197 213 131 148 164 123 123 131 90 90 115 57 65 98 255 246 238 213 197 189 172 156 148 131 123 115 246 213 246 238 189 213 197 115 180 172 106 131 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 123 123 131 230 238 255 197 205 222 164 180 197 156 205 246 98 156 238 57 65 98 255 246 238 213 197 189 172 156 148 131 123 115 57 123 222 238 238 246 213 222 222 197 197 213 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pewter_city/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/01.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/02.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/03.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 222 213 131 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/04.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 238 246 172 197 180 197 222 205 90 189 172 246 238 156 205 189 131 189 164 123 148 131 106 106 106 106 213 222 230 238 180 115 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/05.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 213 222 222 164 180 189 255 0 255 131 115 74 213 213 148 197 189 139 172 156 115 148 131 90 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/06.pal ================================================ JASC-PAL 0100 16 213 213 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/07.pal ================================================ JASC-PAL 0100 16 131 131 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 82 106 123 123 139 205 205 197 255 255 255 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 172 172 164 222 213 139 180 172 98 156 148 82 213 255 197 164 230 148 123 172 148 148 213 164 156 74 41 180 90 65 213 131 106 238 164 139 246 238 205 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 172 172 164 156 189 131 222 205 115 156 148 82 123 106 57 74 131 164 98 172 205 49 139 49 106 205 164 156 148 82 115 164 106 205 230 197 238 255 238 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/12.pal ================================================ JASC-PAL 0100 16 131 131 131 98 74 49 131 106 82 164 139 115 197 189 139 148 148 156 172 172 172 172 189 115 205 222 148 98 131 131 131 164 164 164 197 197 82 82 106 123 123 139 205 205 197 255 255 255 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pewter_gym/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/07.pal ================================================ JASC-PAL 0100 16 197 222 205 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 131 131 139 197 189 213 255 255 255 131 205 139 230 189 115 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/09.pal ================================================ JASC-PAL 0100 16 0 255 0 82 82 106 148 148 164 205 189 197 255 255 255 189 148 49 156 115 90 197 238 148 156 197 74 106 164 41 197 222 205 139 180 172 172 205 180 123 123 139 255 98 49 238 222 164 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/10.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 189 98 74 255 131 115 255 0 255 255 0 255 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 189 230 255 189 230 255 156 189 213 90 131 180 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/11.pal ================================================ JASC-PAL 0100 16 230 222 156 82 82 106 123 123 123 180 180 164 222 230 230 180 213 230 131 180 205 98 156 164 57 115 139 255 65 0 205 49 0 8 90 255 0 57 197 255 180 0 0 230 115 255 255 255 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 164 172 164 180 189 189 255 255 255 115 115 123 213 205 156 238 238 172 197 180 139 230 222 156 246 246 205 0 82 123 57 139 180 115 197 238 222 230 222 131 131 139 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_center/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/02.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/03.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 222 213 131 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/04.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 238 246 172 197 180 197 222 205 90 189 172 246 238 156 205 189 131 189 164 123 148 131 106 106 106 106 213 222 230 238 180 115 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/05.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 213 222 222 164 180 189 222 164 115 131 115 74 213 213 148 197 189 139 172 156 115 148 131 90 197 197 205 205 82 65 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/06.pal ================================================ JASC-PAL 0100 16 213 213 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 255 255 255 222 222 222 106 115 115 189 230 255 123 205 255 98 180 246 49 139 213 180 180 164 172 213 222 156 197 205 180 156 222 156 131 205 139 197 230 131 172 222 98 148 197 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 255 255 255 222 222 222 106 115 115 222 230 238 180 197 205 148 164 180 131 139 139 238 238 238 230 230 230 213 213 213 139 213 156 123 189 139 230 222 123 213 205 106 189 180 90 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 255 255 255 222 222 222 106 115 115 230 197 246 180 82 205 148 57 180 230 222 123 189 180 82 230 230 172 222 213 139 222 164 164 205 139 139 205 180 238 189 148 230 164 131 205 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/11.pal ================================================ JASC-PAL 0100 16 82 164 164 255 255 255 230 230 230 123 123 123 189 189 197 148 148 156 213 213 222 98 98 106 180 180 164 230 172 164 197 131 131 180 82 205 148 57 180 106 189 189 82 164 164 57 139 139 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 74 90 98 98 123 139 164 197 197 222 238 238 255 255 255 123 123 123 180 82 205 131 49 164 131 164 164 230 213 156 255 0 255 213 131 222 255 246 156 90 16 131 41 49 57 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_league/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 230 255 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/07.pal ================================================ JASC-PAL 0100 16 148 148 148 82 131 106 131 180 156 180 230 205 180 0 0 255 0 0 148 148 156 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 82 82 106 123 123 139 205 205 197 255 255 255 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/08.pal ================================================ JASC-PAL 0100 16 148 148 148 164 98 74 222 148 123 255 189 164 139 82 57 172 197 230 213 222 238 0 0 0 0 0 0 189 164 115 0 0 0 255 238 189 82 82 106 123 123 139 205 205 197 255 255 255 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/12.pal ================================================ JASC-PAL 0100 16 148 148 148 164 98 74 222 148 123 255 189 164 139 82 57 189 131 156 246 205 238 139 115 49 156 131 90 189 164 115 222 205 156 255 238 189 82 82 106 123 123 139 205 205 197 255 255 255 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_mansion/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 230 180 74 255 246 131 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 115 115 115 180 180 164 238 238 246 82 123 82 90 131 90 106 156 106 131 172 131 180 156 222 106 82 156 139 115 189 213 189 255 255 0 255 65 106 65 255 255 255 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 115 115 115 180 180 164 238 238 246 98 139 98 106 156 106 131 172 131 148 189 148 180 156 222 205 139 32 222 172 57 246 238 164 255 0 255 82 123 82 255 255 255 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 115 115 115 180 180 164 238 238 246 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 172 123 32 238 189 74 74 205 205 164 255 255 255 255 255 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 131 106 189 156 123 205 230 230 255 115 115 123 106 156 106 255 0 255 255 0 255 255 0 255 255 0 255 106 82 156 156 131 205 205 172 246 189 164 230 115 115 123 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/pokemon_tower/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 230 180 74 255 246 131 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/06.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/07.pal ================================================ JASC-PAL 0100 16 156 205 156 156 65 65 57 106 16 0 0 139 98 123 156 131 156 180 164 189 213 197 197 148 213 205 172 230 222 197 164 156 164 205 197 189 82 82 106 123 123 139 246 238 222 255 255 255 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/08.pal ================================================ JASC-PAL 0100 16 156 205 156 180 180 90 222 222 148 246 246 180 156 65 65 222 131 131 189 98 98 255 0 255 255 0 255 255 0 255 164 156 164 205 197 189 82 82 106 123 123 139 246 238 222 255 255 255 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/09.pal ================================================ JASC-PAL 0100 16 156 205 156 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/10.pal ================================================ JASC-PAL 0100 16 156 205 156 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/11.pal ================================================ JASC-PAL 0100 16 156 205 156 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/power_plant/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 230 180 74 255 246 131 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/06.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/07.pal ================================================ JASC-PAL 0100 16 172 189 115 82 82 106 131 131 139 197 189 213 255 255 255 106 197 106 255 205 90 82 148 197 189 230 255 139 98 41 156 123 65 180 148 90 205 172 115 246 213 172 205 106 90 255 148 131 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/08.pal ================================================ JASC-PAL 0100 16 172 189 115 82 82 106 131 131 139 230 222 246 255 255 255 255 205 98 255 255 148 189 230 255 180 148 90 255 139 180 197 180 131 213 213 164 238 238 213 106 197 106 205 106 90 131 115 16 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/09.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/10.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/11.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/restaurant_hotel/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 255 205 189 115 172 172 115 156 156 115 131 131 115 98 106 90 255 0 255 255 0 255 255 0 255 197 230 230 180 213 213 172 189 197 131 156 156 90 115 115 74 82 82 49 57 57 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 255 205 189 115 172 172 115 156 156 115 131 131 115 238 222 123 255 0 255 222 180 57 189 148 57 148 115 74 106 106 82 74 74 74 0 0 0 98 139 197 74 115 172 57 98 156 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 255 255 0 255 255 0 255 255 0 255 0 0 0 238 238 180 230 213 123 205 180 98 156 156 115 197 230 230 180 213 213 172 189 197 131 156 156 90 115 115 74 82 82 49 57 57 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 255 205 189 115 172 172 115 156 156 115 131 131 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 164 156 98 148 139 98 115 123 98 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/rock_tunnel/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 139 49 57 82 0 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/01.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 115 82 74 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 197 172 139 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 238 246 189 139 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 172 32 41 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 222 205 131 205 180 106 180 139 74 238 238 164 255 0 255 255 0 255 180 222 164 131 213 164 115 205 164 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/08.pal ================================================ JASC-PAL 0100 16 123 197 180 74 74 90 123 123 131 189 197 189 255 0 255 205 222 222 90 90 65 131 115 74 148 148 115 189 189 131 238 238 139 238 238 246 74 98 65 74 156 65 115 197 98 156 230 98 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/09.pal ================================================ JASC-PAL 0100 16 123 197 180 74 74 90 123 123 131 205 213 213 205 156 115 238 172 115 106 123 74 156 148 98 197 172 115 222 205 139 230 222 156 90 90 49 213 180 230 164 139 197 148 115 172 123 98 131 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/10.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 238 172 115 205 156 115 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 156 148 98 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/safari_zone_building/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/00.pal ================================================ JASC-PAL 0100 16 115 205 164 189 255 139 131 213 98 57 148 49 57 82 0 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 115 205 164 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/03.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 222 205 131 205 180 106 180 139 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 197 197 197 222 222 230 148 164 180 123 123 131 65 74 106 246 246 255 205 164 255 164 131 205 123 90 164 255 0 255 255 0 255 255 0 255 164 131 205 205 164 255 90 90 115 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 255 255 255 205 205 213 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 238 246 255 238 139 230 189 82 238 148 115 222 246 255 172 230 255 123 205 213 197 106 74 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/10.pal ================================================ JASC-PAL 0100 16 24 255 82 238 238 238 222 222 230 123 123 131 172 189 205 65 74 106 222 222 205 205 205 189 180 180 164 213 213 164 189 189 139 148 148 98 32 82 164 156 205 246 82 164 205 115 205 164 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/11.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 197 197 205 49 98 164 172 222 180 139 189 148 106 156 115 82 131 90 65 115 74 255 0 255 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/12.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 255 222 222 230 139 156 172 123 123 131 82 82 106 213 205 32 246 238 74 164 131 205 164 156 16 205 197 106 255 255 148 139 189 148 74 131 197 197 197 205 115 189 246 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_city/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 230 222 164 222 205 131 205 180 106 213 213 197 197 197 180 164 164 148 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 238 246 238 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 255 0 255 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 164 164 164 180 189 189 255 255 255 238 246 238 213 230 222 197 205 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 131 197 189 213 255 255 255 180 123 148 230 139 230 255 222 255 213 213 222 213 98 65 246 139 106 255 0 255 255 0 255 255 0 255 205 246 255 98 197 238 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 131 197 189 213 255 255 255 148 148 156 180 139 222 205 172 246 222 205 255 106 123 172 131 148 197 156 172 230 65 205 82 180 255 197 246 164 115 255 230 148 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/saffron_gym/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/school/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/school/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/school/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 230 180 74 255 246 131 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/school/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/06.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/07.pal ================================================ JASC-PAL 0100 16 172 189 115 82 82 106 131 131 139 197 189 213 255 255 255 172 148 90 213 189 131 255 230 172 255 255 98 255 197 197 98 156 74 148 205 123 98 156 172 123 180 197 156 205 222 189 230 246 ================================================ FILE: data/tilesets/secondary/school/palettes/08.pal ================================================ JASC-PAL 0100 16 172 189 115 82 82 106 131 131 139 197 189 213 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 123 131 82 139 148 82 156 164 90 172 180 106 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/09.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/10.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/11.pal ================================================ JASC-PAL 0100 16 172 189 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/school/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/00.pal ================================================ JASC-PAL 0100 16 106 205 172 189 255 139 131 213 98 57 148 49 57 82 0 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/01.pal ================================================ JASC-PAL 0100 16 106 205 172 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 115 205 164 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/02.pal ================================================ JASC-PAL 0100 16 106 205 172 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/03.pal ================================================ JASC-PAL 0100 16 106 205 172 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/04.pal ================================================ JASC-PAL 0100 16 106 205 172 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/05.pal ================================================ JASC-PAL 0100 16 106 205 172 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 222 205 131 205 180 106 180 139 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/08.pal ================================================ JASC-PAL 0100 16 106 205 172 82 82 106 131 131 131 139 164 164 164 189 189 205 222 222 205 238 238 90 139 115 139 148 115 106 189 197 82 180 106 115 222 148 148 246 180 131 123 57 197 106 74 238 148 74 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/09.pal ================================================ JASC-PAL 0100 16 106 205 172 82 82 106 131 131 131 98 106 148 115 131 197 139 164 230 164 213 246 197 197 197 238 230 205 255 0 255 106 98 90 131 115 90 156 139 90 131 139 90 164 156 90 189 172 90 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/10.pal ================================================ JASC-PAL 0100 16 106 205 172 82 82 106 131 131 131 139 164 164 164 189 189 205 222 222 205 238 238 90 139 115 0 0 0 0 0 0 82 180 106 115 222 148 205 197 57 230 230 139 238 131 74 255 180 98 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/11.pal ================================================ JASC-PAL 0100 16 106 205 172 82 82 106 131 131 131 0 0 0 0 0 0 0 0 0 205 238 238 222 255 255 0 0 0 106 189 197 106 246 230 164 255 238 0 0 0 131 123 57 197 106 74 238 148 74 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/12.pal ================================================ JASC-PAL 0100 16 106 205 172 82 82 106 131 131 131 255 255 255 90 230 255 213 255 255 148 238 255 90 139 115 0 0 0 0 0 0 82 180 106 115 222 148 148 246 180 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sea_cottage/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/08.pal ================================================ JASC-PAL 0100 16 115 205 164 189 213 230 189 197 230 172 180 213 148 156 172 156 238 255 164 246 255 213 255 255 205 230 238 238 238 246 180 205 238 123 180 230 90 156 197 98 123 172 82 98 131 65 74 82 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 189 213 230 189 197 230 172 180 213 148 156 172 255 238 164 238 230 139 230 205 90 197 172 74 156 123 57 106 82 115 65 57 74 0 0 0 98 139 197 74 115 172 57 98 156 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/10.pal ================================================ JASC-PAL 0100 16 115 205 164 255 0 255 255 0 255 255 0 255 0 0 0 238 238 180 238 222 148 189 222 156 205 230 238 238 238 246 180 205 238 123 180 230 90 156 197 98 123 172 82 98 131 65 74 82 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/11.pal ================================================ JASC-PAL 0100 16 115 205 164 189 213 230 189 197 230 172 180 213 148 156 172 156 238 255 164 246 255 213 255 255 106 230 255 41 205 255 32 131 255 32 82 197 32 74 131 205 230 172 189 213 172 0 0 0 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/12.pal ================================================ JASC-PAL 0100 16 115 205 164 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seafoam_islands/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/01.pal ================================================ JASC-PAL 0100 16 115 205 164 222 230 230 197 205 213 172 189 205 123 123 131 65 49 65 230 238 238 90 189 139 90 90 115 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/02.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 213 238 255 172 205 255 139 180 238 106 156 230 74 139 189 65 123 189 82 139 205 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 255 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 213 238 255 172 205 255 139 180 238 106 156 230 65 123 172 41 98 156 74 115 197 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 0 230 246 255 189 222 255 139 164 255 106 164 230 74 148 222 74 123 222 82 156 230 205 222 238 172 189 205 123 123 131 90 90 115 49 115 197 144 136 136 120 112 112 104 96 104 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/08.pal ================================================ JASC-PAL 0100 16 248 0 0 128 192 160 96 160 128 120 120 128 88 88 112 64 72 104 216 224 232 192 208 224 160 176 192 200 208 232 168 184 240 112 144 208 88 112 184 80 72 184 232 208 152 200 184 120 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 248 112 184 240 96 160 216 120 120 128 88 88 112 64 72 104 240 240 208 224 224 184 184 184 144 168 168 128 152 152 112 224 216 112 240 152 112 216 112 96 128 224 176 48 160 120 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 255 205 222 238 156 172 189 123 123 131 90 90 115 65 74 106 255 255 180 255 238 123 156 115 65 238 197 246 213 156 213 189 106 172 238 230 74 238 189 0 222 156 0 255 255 255 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/11.pal ================================================ JASC-PAL 0100 16 115 205 164 238 238 246 197 205 222 172 172 197 139 156 172 123 123 131 90 90 115 65 74 106 123 139 222 115 189 246 255 230 156 255 189 65 238 164 41 213 131 16 180 82 0 255 205 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/12.pal ================================================ JASC-PAL 0100 16 248 0 248 144 136 136 120 112 112 104 96 104 120 120 128 144 128 96 128 168 144 112 176 104 176 168 144 224 224 216 213 213 197 180 180 164 148 148 131 123 123 90 98 98 74 96 152 120 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_123/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/02.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 213 238 255 172 205 255 139 180 238 106 156 230 74 139 189 65 123 189 82 139 205 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 255 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 213 238 255 172 205 255 139 180 238 106 156 230 65 123 172 41 98 156 74 115 197 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/07.pal ================================================ JASC-PAL 0100 16 49 49 255 238 180 139 230 148 82 197 131 74 172 98 49 131 131 139 98 98 123 65 74 106 41 49 90 131 156 197 148 180 222 246 238 238 230 222 222 197 197 148 180 172 115 115 197 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 255 131 197 164 98 164 131 123 123 131 90 90 115 65 74 106 222 230 238 197 213 230 164 180 197 255 222 255 222 172 230 172 123 189 148 98 164 115 65 131 238 213 156 205 189 123 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 255 156 156 222 255 238 189 123 123 131 90 90 115 65 74 106 222 230 238 197 213 230 164 180 197 255 222 139 230 172 98 213 139 74 197 115 49 156 90 16 115 189 246 74 131 197 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/10.pal ================================================ JASC-PAL 0100 16 115 205 164 205 222 230 164 180 197 123 123 131 90 90 115 65 74 106 205 197 148 180 172 123 156 148 106 230 156 106 197 115 74 172 98 49 148 82 32 205 222 230 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/11.pal ================================================ JASC-PAL 0100 16 240 144 56 72 40 48 144 104 104 120 144 176 56 80 96 112 200 160 168 192 224 48 56 88 120 120 128 216 192 160 192 216 224 120 72 72 184 144 136 48 56 64 224 224 232 160 224 192 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/12.pal ================================================ JASC-PAL 0100 16 49 49 255 255 255 255 0 0 0 0 0 0 197 197 172 148 148 139 98 98 123 65 74 106 41 49 90 139 205 246 115 189 238 255 230 139 222 189 98 180 156 74 139 123 32 115 82 41 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_45/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 123 123 131 32 49 57 230 238 238 90 189 139 90 90 115 238 213 197 222 197 164 189 148 139 148 106 106 123 74 74 90 57 65 115 205 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 230 246 255 189 222 255 139 189 255 115 164 255 65 139 222 57 115 222 82 148 230 205 222 238 172 189 205 123 123 131 90 90 115 49 115 197 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 205 230 246 180 213 255 123 180 246 98 148 230 65 123 189 49 98 180 82 131 222 213 230 238 172 189 205 123 123 131 90 90 115 238 246 246 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 248 144 152 80 120 128 64 120 120 128 88 88 112 64 72 104 216 224 232 216 224 160 176 192 112 248 200 80 224 152 48 208 120 32 216 120 32 152 96 40 232 208 152 200 184 120 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 255 238 246 255 197 213 222 139 156 172 123 123 131 90 90 115 65 74 106 115 172 246 65 123 172 49 90 139 32 74 123 189 230 164 115 156 90 148 131 74 156 213 255 98 164 230 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 197 255 156 156 189 98 115 131 49 57 57 0 238 230 164 197 180 115 156 131 65 57 32 8 238 156 106 213 131 82 189 106 57 148 82 24 90 49 16 131 90 90 98 65 82 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/11.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 213 213 189 180 180 148 156 156 123 131 131 139 98 98 123 65 74 106 41 49 90 205 213 230 139 180 213 238 230 189 222 213 172 189 172 106 172 148 98 115 197 164 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 255 131 197 164 98 164 131 123 123 131 90 90 115 65 74 106 222 230 238 197 213 230 164 180 197 255 222 255 222 172 230 172 123 189 148 98 164 115 65 131 238 213 156 205 189 123 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/sevii_islands_67/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/02.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 213 238 255 172 205 255 139 180 238 106 156 230 74 139 189 65 123 189 82 139 205 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 255 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 213 238 255 172 205 255 139 180 238 106 156 230 65 123 172 41 98 156 74 115 197 205 222 238 172 189 205 123 123 131 90 90 115 49 115 172 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/07.pal ================================================ JASC-PAL 0100 16 248 0 0 224 240 248 184 216 248 136 160 248 104 160 224 72 144 216 72 120 216 80 152 224 200 216 232 168 184 200 112 136 136 144 136 136 48 112 192 56 80 0 104 88 88 64 56 48 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 248 192 144 120 152 120 112 120 120 128 88 88 112 64 72 104 216 224 232 208 224 240 176 192 208 248 232 224 224 160 136 184 136 112 160 104 80 136 80 56 232 208 152 200 184 120 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 255 156 156 222 255 238 189 123 123 131 90 90 115 65 74 106 222 230 238 197 213 230 164 180 197 255 222 139 230 172 98 213 139 74 197 115 49 156 90 16 115 189 246 74 131 197 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/10.pal ================================================ JASC-PAL 0100 16 115 205 164 205 222 230 164 180 197 123 123 131 90 90 115 65 74 106 205 197 148 180 172 123 156 148 106 230 156 106 197 115 74 172 98 49 148 82 32 205 222 230 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/11.pal ================================================ JASC-PAL 0100 16 248 0 248 180 255 131 131 197 98 57 139 49 57 82 0 222 148 115 106 90 90 164 98 90 65 57 49 255 197 148 232 224 136 216 192 136 115 139 139 148 139 139 208 184 104 24 164 106 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/12.pal ================================================ JASC-PAL 0100 16 49 49 255 255 255 255 0 0 0 0 0 0 197 197 172 148 148 139 98 98 123 65 74 106 41 49 90 139 205 246 115 189 238 255 230 139 222 189 98 180 156 74 139 123 32 115 82 41 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seviiislands5/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 123 123 131 32 49 57 230 238 238 90 189 139 90 90 115 238 213 197 222 197 164 189 148 139 148 106 106 123 74 74 90 57 65 115 205 164 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 230 246 255 189 222 255 139 189 255 115 164 255 65 139 222 57 115 222 82 148 230 205 222 238 172 189 205 123 123 131 90 90 115 49 115 197 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 205 230 246 180 213 255 123 180 246 98 148 230 65 123 189 49 98 180 82 131 222 213 230 238 172 189 205 123 123 131 90 90 115 238 246 246 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 248 168 152 144 128 120 112 120 120 128 88 88 112 64 72 104 216 224 232 192 208 224 160 176 192 224 232 248 192 200 216 120 120 128 88 88 112 64 72 104 232 208 152 200 184 120 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 82 0 57 115 24 98 65 74 131 106 82 65 57 49 208 224 184 56 168 128 216 224 240 224 168 120 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 238 246 255 197 213 222 172 189 197 139 156 172 123 123 131 90 90 115 65 74 106 255 0 255 131 172 148 189 180 164 172 164 156 148 139 139 123 115 115 106 98 106 115 205 164 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/11.pal ================================================ JASC-PAL 0100 16 115 197 164 0 0 0 0 0 0 189 148 139 184 184 168 131 131 139 98 98 123 65 74 106 41 49 90 246 246 246 246 246 238 222 222 213 205 205 189 172 172 156 148 148 123 112 200 160 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/12.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 213 213 189 180 180 148 156 156 123 131 131 139 98 98 123 65 74 106 41 49 90 205 213 230 139 180 213 238 230 189 222 213 172 189 172 106 172 148 98 115 197 164 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/seviiislands6/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 255 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 255 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 255 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 255 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 255 222 255 255 172 222 255 148 189 238 106 156 230 57 148 197 32 131 172 82 148 213 205 222 238 172 189 205 123 123 131 90 90 115 230 213 148 238 230 139 222 197 139 213 189 106 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 255 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 222 255 255 172 222 255 148 189 238 106 156 230 41 90 172 41 57 148 74 123 197 205 222 238 172 189 205 123 123 131 90 90 115 230 213 148 238 230 139 222 197 139 213 189 106 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/07.pal ================================================ JASC-PAL 0100 16 156 205 156 82 82 106 115 115 139 148 148 172 189 189 205 222 222 230 255 255 255 180 180 74 205 205 98 255 255 98 98 98 172 131 131 213 164 164 255 131 98 41 164 139 82 205 180 123 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/08.pal ================================================ JASC-PAL 0100 16 156 205 156 82 82 106 131 131 139 197 189 213 255 255 255 90 156 57 131 180 49 172 205 49 197 230 98 222 255 148 222 172 98 255 197 98 255 222 156 131 98 41 164 139 82 205 180 123 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/09.pal ================================================ JASC-PAL 0100 16 156 205 156 82 82 106 131 131 139 197 189 213 255 255 255 255 0 255 230 222 164 213 197 131 197 172 106 172 148 74 255 0 255 255 0 255 255 0 255 131 98 41 164 139 82 205 180 123 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/10.pal ================================================ JASC-PAL 0100 16 156 205 156 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/11.pal ================================================ JASC-PAL 0100 16 156 205 156 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/ss_anne/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/00.pal ================================================ JASC-PAL 0100 16 106 172 82 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/01.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/02.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/03.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 222 213 131 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/04.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 238 246 172 197 180 197 222 205 90 189 172 246 238 156 205 189 131 189 164 123 148 131 106 106 106 106 213 222 230 238 180 115 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/05.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 213 222 222 164 180 189 255 0 255 131 115 74 213 213 148 197 189 139 172 156 115 148 131 90 197 197 205 205 82 65 0 0 0 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/06.pal ================================================ JASC-PAL 0100 16 213 213 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/07.pal ================================================ JASC-PAL 0100 16 106 172 82 82 82 106 131 131 131 98 131 131 139 172 172 164 205 189 98 106 131 90 98 106 98 156 197 164 172 139 139 156 139 115 123 123 205 213 156 180 197 156 164 172 156 90 0 255 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/08.pal ================================================ JASC-PAL 0100 16 106 172 82 82 82 106 230 222 164 156 148 90 123 115 115 205 197 106 164 156 90 189 172 90 246 246 222 238 238 164 98 106 90 205 213 156 139 148 106 98 98 106 205 139 189 213 148 74 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/09.pal ================================================ JASC-PAL 0100 16 106 172 82 82 82 106 230 222 164 156 148 90 123 115 115 205 197 106 164 156 90 189 172 90 246 246 222 238 238 164 98 106 90 205 213 156 139 148 106 98 98 106 131 205 82 230 213 82 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/10.pal ================================================ JASC-PAL 0100 16 106 172 82 82 82 106 230 222 164 156 148 90 123 115 115 205 197 106 164 156 90 189 172 90 246 246 222 238 238 164 98 106 90 205 213 156 139 148 106 98 98 106 90 0 255 222 222 230 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/11.pal ================================================ JASC-PAL 0100 16 106 172 82 82 82 106 230 222 164 156 148 90 123 115 115 205 197 106 164 156 90 189 172 90 246 246 222 238 238 164 98 106 90 205 213 156 139 148 106 98 98 106 90 0 255 139 148 139 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/12.pal ================================================ JASC-PAL 0100 16 106 172 82 82 82 106 230 222 164 156 148 90 123 115 115 205 197 106 164 156 90 189 172 90 246 246 222 238 238 164 98 106 90 205 213 156 139 148 106 98 98 106 90 0 255 156 197 213 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/tanoby_ruins/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/01.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/02.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/03.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 222 213 131 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/04.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 238 246 172 197 180 197 222 205 90 189 172 246 238 156 205 189 131 189 164 123 148 131 106 106 106 106 213 222 230 238 180 115 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/05.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 213 222 222 164 180 189 255 0 255 131 115 74 213 213 148 197 189 139 172 156 115 148 131 90 197 197 205 205 82 65 0 0 0 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/06.pal ================================================ JASC-PAL 0100 16 213 213 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 238 246 255 197 213 222 139 156 172 123 123 131 90 90 115 65 74 106 115 172 246 65 123 172 49 90 139 32 74 123 189 230 164 115 156 90 148 131 74 156 213 255 98 164 230 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 123 74 148 148 106 180 230 213 246 205 172 213 222 213 90 197 189 65 189 180 49 172 164 32 213 205 90 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 255 0 255 255 131 115 106 197 106 164 255 180 238 197 115 213 131 74 189 213 230 123 156 180 90 123 156 156 180 205 222 230 238 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/10.pal ================================================ JASC-PAL 0100 16 90 0 255 172 213 255 139 189 246 123 172 222 98 180 230 106 148 213 255 0 255 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 189 230 255 189 230 255 156 189 213 90 131 180 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 148 148 148 123 123 123 98 98 98 82 82 106 255 213 90 230 164 74 255 0 255 222 230 238 197 205 156 205 139 115 172 172 172 222 230 189 230 172 139 0 0 0 255 255 255 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 205 205 205 255 131 65 222 98 32 255 0 255 222 213 90 197 189 65 189 180 49 172 164 32 213 205 90 148 148 148 230 230 230 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/trainer_tower/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 172 222 172 189 238 197 139 189 139 205 246 213 172 222 172 74 106 156 90 131 180 213 222 222 156 189 213 238 139 98 189 98 74 156 65 49 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/00.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/01.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 139 180 222 131 115 16 164 148 49 197 180 74 222 205 106 246 238 148 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/02.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 197 189 213 255 255 255 106 197 106 230 213 123 255 205 90 255 238 197 90 90 115 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/03.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 180 74 255 246 131 65 98 156 90 123 180 115 156 197 222 213 131 164 164 172 205 205 213 238 238 246 106 172 115 156 205 139 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/04.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 230 238 246 172 197 180 197 222 205 90 189 172 246 238 156 205 189 131 189 164 123 148 131 106 106 106 106 213 222 230 238 180 115 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/05.pal ================================================ JASC-PAL 0100 16 213 213 172 82 82 106 123 123 123 172 172 164 255 255 255 213 222 222 164 180 189 255 0 255 131 115 74 213 213 148 197 189 139 172 156 115 148 131 90 255 0 255 255 0 255 0 0 0 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/06.pal ================================================ JASC-PAL 0100 16 213 213 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/07.pal ================================================ JASC-PAL 0100 16 172 189 115 82 82 106 123 123 123 172 172 164 255 255 255 148 148 156 205 205 197 148 139 90 172 164 106 197 189 131 82 139 148 115 164 172 156 189 197 180 90 74 205 115 90 238 156 123 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/08.pal ================================================ JASC-PAL 0100 16 172 189 115 82 82 106 123 123 123 172 172 164 255 255 255 255 255 156 197 197 156 172 172 139 148 148 131 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/09.pal ================================================ JASC-PAL 0100 16 172 189 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/10.pal ================================================ JASC-PAL 0100 16 172 189 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/11.pal ================================================ JASC-PAL 0100 16 172 189 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/12.pal ================================================ JASC-PAL 0100 16 172 189 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/underground_path/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/underwater/palettes/00.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 255 0 255 115 189 246 98 172 238 115 189 246 98 164 222 82 139 197 74 115 172 115 197 164 ================================================ FILE: data/tilesets/secondary/underwater/palettes/01.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 255 189 131 238 148 115 222 106 98 205 65 82 115 197 164 ================================================ FILE: data/tilesets/secondary/underwater/palettes/02.pal ================================================ JASC-PAL 0100 16 24 41 82 180 255 131 131 197 98 57 139 49 57 82 0 222 148 115 106 90 90 164 98 90 65 57 49 255 197 148 222 106 98 205 65 82 164 213 197 115 197 164 65 180 131 24 164 106 ================================================ FILE: data/tilesets/secondary/underwater/palettes/03.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 213 213 213 189 189 189 164 164 164 131 131 139 255 0 255 255 0 255 65 49 65 238 213 205 222 180 164 189 148 139 156 115 115 131 90 90 98 65 82 115 197 164 ================================================ FILE: data/tilesets/secondary/underwater/palettes/04.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 255 0 255 255 0 255 255 0 255 255 0 255 82 106 213 65 90 189 57 82 164 49 74 148 172 197 230 139 164 222 106 131 213 82 106 213 115 197 164 ================================================ FILE: data/tilesets/secondary/underwater/palettes/05.pal ================================================ JASC-PAL 0100 16 24 41 82 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 115 189 246 98 172 238 238 230 164 222 205 131 213 180 106 205 156 82 115 197 164 ================================================ FILE: data/tilesets/secondary/underwater/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 115 148 189 82 115 156 57 82 131 32 49 106 197 164 255 148 115 222 90 49 180 41 49 90 255 0 255 213 213 255 98 57 189 74 32 156 41 8 139 16 0 123 41 41 41 ================================================ FILE: data/tilesets/secondary/underwater/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 0 115 148 189 82 115 156 57 82 131 32 49 106 197 164 255 148 115 222 90 49 180 41 49 90 255 0 255 213 213 255 88 48 176 74 32 156 41 8 139 16 0 123 41 41 41 ================================================ FILE: data/tilesets/secondary/underwater/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 0 131 164 205 98 131 172 74 98 148 49 65 123 255 0 255 255 0 255 255 0 255 41 49 90 255 0 255 255 0 255 115 74 213 82 41 189 57 16 164 32 0 139 41 123 238 ================================================ FILE: data/tilesets/secondary/underwater/palettes/09.pal ================================================ JASC-PAL 0100 16 0 0 0 255 0 255 255 0 255 255 0 255 255 0 255 8 8 139 255 0 255 255 0 255 0 0 74 57 41 139 49 8 139 24 0 123 16 8 115 8 8 82 8 8 65 41 24 238 ================================================ FILE: data/tilesets/secondary/underwater/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 255 0 255 255 0 255 255 0 255 255 0 255 24 24 180 255 0 255 255 0 255 0 0 106 82 74 156 82 49 164 65 24 164 49 8 156 24 0 131 0 0 123 41 123 238 ================================================ FILE: data/tilesets/secondary/underwater/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 213 213 255 156 156 255 131 131 255 106 106 246 74 74 222 180 0 255 180 0 255 0 0 139 197 164 255 180 148 255 148 115 222 115 74 205 90 49 180 57 16 164 41 123 238 ================================================ FILE: data/tilesets/secondary/underwater/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/underwater/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/underwater/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/underwater/palettes/15.pal ================================================ JASC-PAL 0100 16 115 197 164 255 213 180 255 197 148 222 148 115 123 65 65 57 74 123 41 57 98 24 41 82 16 32 57 222 230 238 255 197 90 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 131 131 131 180 180 164 255 255 255 189 164 82 222 197 106 230 222 156 123 197 189 156 222 213 213 255 246 255 0 255 255 0 255 213 131 65 222 230 222 246 238 189 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 148 172 139 180 197 164 213 222 197 238 255 213 115 156 180 197 222 238 123 197 189 156 222 213 213 255 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 230 222 156 189 98 74 230 156 98 213 205 156 115 156 180 246 238 189 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_1/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 131 131 131 180 180 164 255 255 255 189 164 82 222 197 106 230 222 156 123 197 189 156 222 213 213 255 246 255 0 255 255 0 255 213 131 65 222 230 222 246 238 189 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 148 172 139 180 197 164 213 222 197 238 255 213 115 156 180 197 222 238 123 197 189 156 222 213 213 255 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 230 222 156 189 98 74 230 156 98 213 205 156 115 156 180 246 238 189 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/12.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/unused_gatehouse_2/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 123 123 131 32 49 57 230 238 238 90 189 139 90 90 115 238 213 197 222 197 164 189 148 139 148 106 106 123 74 74 90 57 65 115 205 164 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/02.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 230 246 255 189 222 255 139 189 255 115 164 255 65 139 222 57 115 222 82 148 230 205 222 238 172 189 205 123 123 131 90 90 115 49 115 197 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 205 230 246 180 213 255 123 180 246 98 148 230 65 123 189 49 98 180 82 131 222 213 230 238 172 189 205 123 123 131 90 90 115 238 246 246 238 230 139 230 213 139 213 197 106 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/07.pal ================================================ JASC-PAL 0100 16 115 205 164 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/08.pal ================================================ JASC-PAL 0100 16 115 205 164 255 246 172 255 189 32 222 156 0 189 106 57 123 123 131 90 90 115 65 74 106 255 255 255 205 205 222 255 230 131 238 205 123 197 164 90 131 164 197 255 0 255 180 156 49 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 74 123 180 90 164 213 57 90 148 213 148 49 238 180 82 205 205 222 115 189 246 74 131 197 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/10.pal ================================================ JASC-PAL 0100 16 115 205 164 115 82 41 255 189 32 222 156 0 189 106 57 123 123 131 90 90 115 65 74 106 189 255 139 131 213 98 106 180 98 255 230 131 238 205 123 197 164 90 131 164 197 255 0 255 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/11.pal ================================================ JASC-PAL 0100 16 115 205 164 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/12.pal ================================================ JASC-PAL 0100 16 115 205 164 246 238 189 222 205 131 205 180 106 180 139 74 246 246 255 172 189 205 222 106 98 213 164 156 213 148 49 65 74 106 123 123 131 16 123 74 49 148 106 98 189 148 164 230 197 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_city/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 246 222 90 246 197 65 238 164 57 172 189 205 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 90 131 180 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 246 238 164 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 172 172 164 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 164 164 172 205 205 213 238 238 246 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 255 255 255 32 180 230 172 255 230 189 189 115 238 222 164 255 255 180 205 82 65 255 131 115 189 180 106 205 197 123 222 222 148 164 164 98 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 65 74 106 90 90 115 123 123 131 148 164 180 172 189 205 205 222 238 246 246 255 255 0 255 255 0 255 205 82 65 255 131 115 230 172 57 222 213 0 222 180 65 255 222 98 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 131 131 131 180 180 164 255 255 255 222 180 65 238 197 82 189 148 49 246 238 164 213 213 222 156 156 205 180 180 246 82 106 156 123 148 197 189 197 255 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/vermilion_gym/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 90 16 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/01.pal ================================================ JASC-PAL 0100 16 255 0 255 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 197 164 189 148 139 148 106 106 115 65 74 82 49 65 115 205 164 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/02.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/03.pal ================================================ JASC-PAL 0100 16 255 0 255 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 164 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/04.pal ================================================ JASC-PAL 0100 16 255 0 255 222 230 255 197 213 255 164 197 238 123 172 230 90 148 197 65 123 180 90 164 205 205 222 238 172 189 205 123 123 131 90 90 115 32 98 139 238 230 139 222 197 139 205 180 106 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/05.pal ================================================ JASC-PAL 0100 16 255 0 255 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 213 197 131 197 172 106 172 148 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/06.pal ================================================ JASC-PAL 0100 16 255 0 255 222 230 255 197 213 255 164 197 238 123 172 230 41 82 164 41 57 131 74 123 197 205 222 238 172 189 205 123 123 131 90 90 115 32 98 139 238 230 139 222 197 139 205 180 106 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/07.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/08.pal ================================================ JASC-PAL 0100 16 65 65 82 74 74 90 123 123 131 106 139 205 115 197 238 164 230 238 131 115 57 180 172 65 222 205 65 246 246 205 213 205 205 90 90 115 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 205 65 222 172 65 180 98 0 213 213 139 189 189 115 148 148 82 255 0 255 115 205 164 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/10.pal ================================================ JASC-PAL 0100 16 65 65 82 74 74 90 123 123 131 106 139 205 172 213 230 115 98 65 148 123 65 238 172 65 230 213 74 65 123 123 65 156 131 65 205 156 74 123 65 90 172 74 123 213 98 172 238 106 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 246 246 205 213 213 213 148 164 180 123 123 131 90 90 115 65 74 106 246 230 131 222 205 65 172 238 106 123 213 98 106 197 82 90 172 74 74 123 65 115 205 164 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/12.pal ================================================ JASC-PAL 0100 16 115 205 164 246 246 255 213 230 197 156 172 139 123 123 131 90 90 115 65 74 106 222 172 65 180 98 0 131 65 0 205 205 123 164 164 57 115 189 246 74 148 213 49 115 180 189 197 164 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_city/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/00.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 82 0 115 98 98 65 57 49 255 0 255 139 222 189 255 197 115 238 131 106 197 49 65 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/01.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 230 197 205 213 172 189 205 131 131 139 65 49 65 230 238 238 90 189 139 255 0 255 238 213 197 222 189 164 189 148 139 156 115 115 123 82 82 90 57 74 115 205 164 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/02.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 156 123 98 197 172 139 255 205 139 238 148 115 222 106 98 205 82 74 172 32 41 74 131 197 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/03.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 205 222 238 172 189 205 148 164 180 123 123 131 90 90 115 65 74 106 230 222 131 205 180 106 156 213 255 115 189 246 98 164 222 74 131 197 49 98 164 115 205 164 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/04.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 172 189 189 139 156 156 106 115 115 65 255 255 213 255 238 180 238 222 156 172 197 197 148 189 189 123 180 180 230 246 255 189 222 222 172 213 222 148 205 205 255 255 255 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/05.pal ================================================ JASC-PAL 0100 16 0 0 0 222 230 238 172 189 205 123 123 131 90 90 115 65 74 106 230 222 164 222 205 131 205 180 106 180 139 74 238 230 139 222 197 139 213 189 106 189 230 164 172 222 164 115 205 164 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/08.pal ================================================ JASC-PAL 0100 16 0 0 0 189 255 139 131 213 98 57 148 49 57 82 0 57 115 24 98 65 74 131 106 82 65 57 49 255 0 255 255 0 255 255 0 255 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/09.pal ================================================ JASC-PAL 0100 16 115 205 164 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 213 230 189 57 172 131 222 230 246 230 172 123 106 205 164 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/10.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 222 230 246 189 197 222 148 164 180 123 123 131 90 90 115 65 74 106 49 139 49 57 82 0 49 180 98 238 230 164 222 205 131 213 180 106 205 156 82 106 205 164 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/11.pal ================================================ JASC-PAL 0100 16 0 0 0 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_forest/palettes/15.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/00.pal ================================================ JASC-PAL 0100 16 32 32 57 82 82 106 123 123 123 180 180 164 255 255 255 172 148 65 213 197 106 246 238 148 82 148 197 172 205 246 222 230 230 106 197 106 164 255 180 205 82 65 255 131 115 148 148 139 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/01.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 123 123 123 180 180 164 255 255 255 197 197 148 213 213 172 189 230 255 156 189 213 131 115 16 164 148 49 197 180 74 222 205 106 255 230 156 222 213 230 238 246 238 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/02.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 131 131 139 197 189 213 255 255 255 139 197 139 230 213 123 255 205 90 255 238 197 115 115 123 230 238 246 156 205 246 98 156 238 255 0 255 230 139 98 189 98 74 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/03.pal ================================================ JASC-PAL 0100 16 90 0 255 82 82 106 164 164 164 180 189 189 255 255 255 238 246 238 213 230 222 197 205 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/04.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/05.pal ================================================ JASC-PAL 0100 16 90 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/06.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/07.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 139 139 148 197 189 213 255 255 255 205 197 106 246 238 148 255 255 222 98 98 123 238 238 238 82 222 123 131 255 164 82 164 57 255 0 255 255 0 255 172 106 74 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/08.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 139 139 148 197 189 213 255 255 255 222 222 238 230 205 131 189 197 82 222 230 115 238 230 148 74 123 180 131 131 139 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/09.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/10.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/11.pal ================================================ JASC-PAL 0100 16 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/12.pal ================================================ JASC-PAL 0100 16 255 0 255 82 82 106 123 123 123 180 180 164 230 230 230 255 255 255 180 115 82 213 156 123 123 123 123 106 156 148 139 189 180 180 222 213 255 0 255 213 213 213 230 189 123 246 197 156 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/13.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/14.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: data/tilesets/secondary/viridian_gym/palettes/15.pal ================================================ JASC-PAL 0100 16 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 90 0 255 0 0 0 ================================================ FILE: docs/bugs_and_glitches.md ================================================ # Bugs and Glitches These are known bugs and glitches in the original Pokémon FireRed game: code that clearly does not work as intended, or that only works in limited circumstances but has the possibility to fail or crash. Defining the `BUGFIX` and `UBFIX` preprocessor variables will fix some of these automatically. `UBFIX` will already be defined for MODERN builds. Fixes are written in the `diff` format. If you've used Git before, this should look familiar: ```diff this is some code -delete red - lines +add green + lines ``` ## Contents - [Bug 1](#bug-1) ## Bug 1 A brief description of the bug and how to reproduce it in the vanilla game **Fix:** Code to edit, in which routines, or data to edit, using the above mentioned diff syntax. ================================================ FILE: docs/legacy_WSL1_INSTALL.md ================================================ ### Setting up WSL1 (Legacy Portion) 1. Certain packages are required to build pokefirered. Install these packages by running the following command: ```bash sudo apt install build-essential git libpng-dev gdebi-core ``` > Note: If the above command does not work, try the above command but replacing `apt` with `apt-get`. 2. Once the packages have finished installing, download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`. 3. WSL has its own file system that's not accessible from Windows, but Windows files *are* accessible from WSL. To install the devkitPro package, you'll need to change to the **current working directory** where the package file was saved. For example, if the package file was saved to **C:\Users\\_\_\Downloads** (the Downloads location for most users), enter this command, where *\* is your **Windows** username: ```bash cd /mnt/c/Users//Downloads ``` > Note 1: The Windows C:\ drive is called /mnt/c/ in WSL. > Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "/mnt/c/users//Downloads folder"`. > Note 3: Windows path names are case-insensitive so adhering to capitalization isn't needed 4. Once the directory has been changed to the folder containing the devkitPro pacman package, run the following commands to install devkitARM. ```bash sudo gdebi devkitpro-pacman.amd64.deb sudo dkp-pacman -Sy sudo dkp-pacman -S gba-dev ``` The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation. > Note: `devkitpro-pacman.amd64.deb` is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead. 5. Run the following command to set devkitPro related environment variables (alternatively, close and re-open WSL): ```bash source /etc/profile.d/devkit-env.sh ``` Proceed to [Choosing where to store pokefirered (WSL1) of the current INSTALL.md](/INSTALL.md#choosing-where-to-store-pokefirered-WSL1). ================================================ FILE: firered.sha1 ================================================ 41cb23d8dccc8ebd7c649cd8fbb58eeace6e2fdc pokefirered.gba ================================================ FILE: firered_rev1.sha1 ================================================ dd5945db9b930750cb39d00c84da8571feebf417 pokefirered_rev1.gba ================================================ FILE: graphics/battle_anims/backgrounds/bug.pal ================================================ JASC-PAL 0100 16 0 0 0 131 123 74 139 139 90 156 156 115 172 172 139 189 189 164 205 205 180 222 222 205 238 238 230 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/backgrounds/sky.pal ================================================ JASC-PAL 0100 16 0 0 0 106 205 197 222 0 0 189 0 0 156 0 0 123 0 0 98 0 0 0 0 0 255 255 255 230 246 238 205 238 230 180 230 222 156 222 213 131 213 205 106 205 197 0 0 0 ================================================ FILE: graphics/battle_anims/backgrounds/solarbeam.pal ================================================ JASC-PAL 0100 16 0 0 0 255 197 74 255 205 98 255 213 123 255 222 148 255 230 172 255 238 197 255 246 222 255 255 255 255 189 74 255 238 180 255 230 139 255 222 106 255 213 74 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/backgrounds/water_muddy.pal ================================================ JASC-PAL 0100 16 0 0 0 131 49 0 148 74 32 164 106 65 180 131 106 197 164 139 213 189 180 230 222 213 255 255 255 148 74 32 164 106 65 197 164 139 230 222 213 255 255 255 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/masks/stat1.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 222 255 205 189 255 164 156 255 123 115 222 90 74 197 57 32 172 24 0 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/masks/stat2.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 255 255 189 255 255 123 255 255 57 255 189 41 255 131 32 255 65 16 255 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/masks/stat3.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 238 222 246 222 189 246 205 156 246 197 123 246 197 123 246 164 90 213 131 57 180 106 24 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/masks/stat4.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 189 255 255 123 255 255 57 255 255 57 205 238 57 156 230 57 106 213 65 57 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/masks/stat5.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 230 230 230 205 205 205 180 180 189 164 164 164 139 139 148 115 115 123 98 98 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/masks/stat6.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 205 246 230 156 246 213 106 246 197 57 246 180 32 213 148 16 180 123 0 148 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/masks/stat7.pal ================================================ JASC-PAL 0100 16 0 0 0 255 8 8 255 65 16 255 131 32 255 189 41 255 255 57 255 255 123 255 255 189 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/masks/stat8.pal ================================================ JASC-PAL 0100 16 0 0 0 0 148 0 32 172 24 74 197 57 115 222 90 156 255 123 189 255 164 222 255 205 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/black_ball.pal ================================================ JASC-PAL 0100 16 156 205 98 156 205 98 156 205 98 131 205 131 156 205 0 24 0 106 156 8 98 0 213 131 24 197 0 164 8 106 156 8 98 164 8 106 156 205 131 24 213 98 156 8 106 164 205 98 ================================================ FILE: graphics/battle_anims/sprites/blue_light_wall.pal ================================================ JASC-PAL 0100 16 164 148 139 98 90 255 115 106 255 139 131 255 164 156 255 180 180 255 205 205 255 230 230 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 164 156 255 180 180 255 205 205 255 ================================================ FILE: graphics/battle_anims/sprites/blue_orb.pal ================================================ JASC-PAL 0100 16 0 0 0 139 222 255 65 148 255 0 74 255 0 57 205 0 49 156 0 41 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/blue_ring.pal ================================================ JASC-PAL 0100 16 164 148 139 0 0 0 49 148 255 0 230 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/blue_ring_2.pal ================================================ JASC-PAL 0100 16 164 148 139 0 0 0 255 255 255 230 255 230 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/brown_orb.pal ================================================ JASC-PAL 0100 16 0 0 0 131 49 0 148 74 32 164 106 65 180 131 106 197 164 139 213 189 180 230 222 213 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/flower.pal ================================================ JASC-PAL 0100 16 164 148 139 255 139 0 255 156 8 255 172 24 255 197 41 255 213 57 255 230 74 255 255 90 255 255 255 255 74 106 255 115 148 255 164 197 255 205 238 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/glowy_blue_orb.pal ================================================ JASC-PAL 0100 16 0 0 0 197 246 246 148 180 246 98 123 246 49 65 246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/glowy_green_orb.pal ================================================ JASC-PAL 0100 16 0 0 0 205 246 197 106 246 98 8 246 0 8 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/gray_light_wall.pal ================================================ JASC-PAL 0100 16 164 148 139 123 123 123 139 139 139 156 156 156 172 172 172 197 197 197 213 213 213 230 230 230 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 197 197 197 213 213 213 ================================================ FILE: graphics/battle_anims/sprites/hit_2.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 205 255 255 156 255 255 106 255 255 57 255 255 8 255 255 8 205 255 8 156 255 8 106 255 8 57 255 8 8 255 8 8 106 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/ice_crystals.pal ================================================ JASC-PAL 0100 16 106 148 139 98 90 255 115 106 255 139 131 255 164 156 255 180 180 255 205 205 255 230 230 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 180 180 255 205 205 255 230 230 255 ================================================ FILE: graphics/battle_anims/sprites/ice_cube.pal ================================================ JASC-PAL 0100 16 106 148 139 98 90 255 115 106 255 139 131 255 164 156 255 180 180 255 205 205 255 230 230 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 180 180 255 205 205 255 230 230 255 ================================================ FILE: graphics/battle_anims/sprites/mud_sand.pal ================================================ JASC-PAL 0100 16 164 148 139 115 106 98 82 82 82 164 164 164 255 255 255 197 180 115 164 148 82 131 115 57 98 82 24 74 57 0 205 205 197 131 131 131 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/music_notes_2.pal ================================================ JASC-PAL 0100 80 0 0 0 255 255 255 255 189 189 255 123 123 255 57 57 255 0 0 213 0 0 0 0 0 197 148 197 238 246 246 238 222 180 246 205 123 246 189 57 255 172 0 213 148 0 0 0 0 0 0 0 238 246 246 238 246 180 246 246 123 246 246 57 255 246 0 213 205 0 0 0 0 197 148 197 238 246 246 189 246 180 139 246 123 90 246 57 41 255 0 41 213 0 0 0 0 0 0 0 238 246 246 172 238 230 115 238 222 57 230 205 0 230 197 0 189 156 0 0 0 197 148 197 238 246 246 172 205 246 115 164 246 57 123 246 0 82 255 0 57 205 0 0 0 0 0 0 238 246 246 222 180 246 205 123 246 189 57 246 172 0 255 148 0 205 0 0 0 197 148 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 238 246 246 164 222 246 98 197 246 82 164 205 65 139 172 49 106 139 0 0 0 197 148 197 255 255 255 230 222 213 205 189 180 180 156 139 164 131 106 123 98 82 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/orange_light_wall.pal ================================================ JASC-PAL 0100 16 164 148 139 255 205 32 255 205 57 255 213 90 255 222 123 255 230 156 255 238 189 255 246 222 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 222 123 255 230 156 255 238 189 ================================================ FILE: graphics/battle_anims/sprites/pink_heart.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 255 180 255 238 115 222 230 57 189 222 0 156 189 8 131 156 24 115 123 32 90 90 49 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/purple_gas_cloud.pal ================================================ JASC-PAL 0100 16 106 148 139 98 90 255 115 106 255 139 131 255 164 156 255 180 180 255 205 205 255 230 230 255 213 0 213 0 0 0 0 0 0 0 0 0 0 0 0 180 180 255 205 205 255 230 230 255 ================================================ FILE: graphics/battle_anims/sprites/purple_ring.pal ================================================ JASC-PAL 0100 16 164 148 139 0 0 0 156 24 255 180 49 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/red_heart.pal ================================================ JASC-PAL 0100 16 0 0 0 255 238 205 255 189 164 255 139 131 255 90 90 255 41 57 213 41 57 180 41 57 139 41 57 106 41 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/red_light_wall.pal ================================================ JASC-PAL 0100 16 164 148 139 255 74 106 255 98 123 255 123 148 255 148 164 255 172 189 255 197 205 255 222 230 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 148 164 255 172 189 255 197 205 ================================================ FILE: graphics/battle_anims/sprites/red_orb_2.pal ================================================ JASC-PAL 0100 16 0 0 0 255 172 74 255 90 41 255 8 8 213 8 8 172 8 8 139 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/sap_drip_2.pal ================================================ JASC-PAL 0100 16 148 246 197 255 255 255 255 255 205 238 205 164 222 164 131 222 115 106 230 65 82 180 32 90 131 0 106 90 0 82 57 0 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/slash_2.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 230 238 255 205 230 255 180 222 255 156 205 255 131 197 255 106 189 255 90 164 230 82 148 213 74 123 189 65 106 172 57 90 156 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/sleep_powder.pal ================================================ JASC-PAL 0100 16 0 197 246 255 255 255 230 246 189 213 246 123 197 246 57 180 246 0 156 222 24 131 197 49 106 172 74 82 148 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/spark.pal ================================================ JASC-PAL 0100 16 164 148 139 255 139 0 255 156 8 255 172 24 255 197 41 255 213 57 255 230 74 255 255 90 255 255 255 255 74 106 255 115 148 255 164 197 255 205 238 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/sparkle_2.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 255 255 148 255 230 74 255 205 0 230 156 0 205 106 0 189 57 0 255 148 24 255 98 16 255 49 8 255 0 0 156 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/stun_spore.pal ================================================ JASC-PAL 0100 16 0 197 246 255 255 255 255 246 164 255 246 82 255 246 0 255 246 0 246 213 0 238 180 0 230 148 0 230 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/whip_hit.pal ================================================ JASC-PAL 0100 16 98 197 197 255 255 255 222 246 230 189 246 205 156 246 180 123 238 156 90 238 131 57 238 115 57 238 115 65 205 90 74 180 74 82 148 57 90 123 41 106 98 24 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/sprites/white_circle_of_light.pal ================================================ JASC-PAL 0100 16 0 0 0 246 255 246 222 238 230 197 230 213 172 213 197 156 205 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/unused/flying.pal ================================================ JASC-PAL 0100 16 106 148 139 148 148 255 189 197 255 222 222 255 238 238 255 238 246 255 255 255 255 238 246 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 205 213 255 205 205 255 230 230 255 ================================================ FILE: graphics/battle_anims/unused/line_sketch_2.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 255 0 255 255 148 255 255 148 205 255 148 156 255 0 0 0 0 0 0 0 0 0 255 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 ================================================ FILE: graphics/battle_anims/unused/spinning_ball_2.pal ================================================ JASC-PAL 0100 32 98 156 131 57 57 57 156 156 156 255 255 255 255 205 0 255 255 98 213 98 24 255 123 32 106 65 172 65 24 172 255 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 98 156 131 57 57 57 156 156 156 255 255 255 57 123 0 90 189 0 123 255 8 230 106 148 255 139 255 255 205 0 255 255 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_anims/unused/unknown.pal ================================================ JASC-PAL 0100 16 98 0 49 131 131 41 156 197 32 172 0 32 189 0 24 180 197 8 156 0 8 131 65 0 90 0 0 49 65 0 32 0 8 8 197 8 0 0 24 16 65 32 32 197 32 65 131 41 ================================================ FILE: graphics/battle_interface/healthbar.pal ================================================ JASC-PAL 0100 16 0 0 0 57 57 57 255 255 255 213 205 189 131 131 139 74 65 90 82 106 90 255 213 82 255 180 65 222 106 90 115 255 172 90 213 131 255 230 57 205 172 8 255 90 57 172 65 74 ================================================ FILE: graphics/battle_interface/healthbox.pal ================================================ JASC-PAL 0100 16 0 0 0 65 65 65 255 255 222 222 213 180 197 189 115 123 148 131 82 106 98 32 57 0 57 82 65 255 230 0 255 156 148 65 205 255 0 0 255 0 255 0 255 0 0 106 148 255 ================================================ FILE: graphics/battle_interface/textbox1.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 255 0 0 82 98 156 106 139 189 255 255 255 106 90 115 213 205 213 65 74 123 41 49 49 255 0 255 230 222 230 255 0 255 156 123 24 205 172 74 41 82 106 ================================================ FILE: graphics/battle_interface/textbox2.pal ================================================ JASC-PAL 0100 16 0 0 0 74 57 115 82 98 156 106 139 189 41 49 49 255 255 255 106 90 115 222 213 222 90 82 82 180 189 180 139 156 213 90 74 131 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/building/terrain.pal ================================================ JASC-PAL 0100 48 0 0 0 246 255 255 255 255 255 230 230 230 230 230 230 246 246 246 230 238 238 238 238 238 238 238 238 246 255 255 255 255 255 255 255 180 255 255 197 255 255 222 255 255 238 246 246 246 0 0 0 246 255 255 255 255 255 213 213 213 230 230 230 238 238 238 230 238 238 222 230 222 238 238 238 246 255 255 255 255 255 255 255 180 255 255 197 255 255 222 255 255 238 246 246 246 0 0 0 164 213 255 238 255 255 180 230 255 205 238 255 222 246 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/cave/terrain.pal ================================================ JASC-PAL 0100 48 0 0 0 197 172 106 205 197 90 156 131 98 180 148 106 180 164 106 197 180 106 255 0 255 213 197 115 230 222 106 164 139 82 205 180 106 189 164 106 180 156 98 172 148 90 189 156 106 0 0 0 197 172 106 205 197 90 148 123 82 164 131 90 172 156 90 189 180 90 255 0 255 213 197 115 230 222 106 164 139 82 197 172 106 189 164 106 180 156 98 172 148 90 189 156 106 0 0 0 106 74 65 148 115 82 180 139 90 213 180 131 230 213 156 0 0 0 180 139 90 180 139 90 180 139 90 213 180 131 106 74 65 148 115 82 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/grass/terrain.pal ================================================ JASC-PAL 0100 48 0 0 0 230 255 230 164 246 123 131 230 123 197 255 148 230 255 189 156 238 115 197 246 189 172 238 164 255 0 255 238 246 246 189 222 246 205 230 246 213 230 246 222 238 246 222 246 222 0 0 0 230 255 230 148 230 106 115 213 106 172 246 115 189 255 148 139 222 98 189 238 180 164 230 156 255 0 255 238 246 246 189 222 246 205 230 246 213 230 246 222 238 246 222 246 222 0 0 0 123 205 115 164 222 148 82 164 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/1.pal ================================================ JASC-PAL 0100 48 0 0 0 238 238 238 255 255 255 213 213 213 222 222 230 238 238 246 222 230 230 222 230 222 230 230 238 246 246 255 238 238 238 205 172 205 213 189 213 222 205 222 238 222 238 230 230 230 0 0 0 230 238 238 255 255 255 205 205 205 213 213 222 230 238 238 222 230 230 222 230 222 230 230 238 246 246 255 238 238 238 189 189 189 197 197 197 205 205 205 222 222 222 230 230 230 0 0 0 115 180 255 197 246 255 148 213 255 172 222 255 180 238 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/2.pal ================================================ JASC-PAL 0100 48 0 0 0 238 238 238 255 255 255 213 213 213 222 222 230 238 238 246 222 230 230 222 230 222 230 230 238 246 246 255 238 238 238 189 189 189 197 197 197 205 205 205 222 222 222 230 230 230 0 0 0 230 238 238 255 255 255 205 205 205 213 213 222 230 238 238 222 230 230 222 230 222 230 230 238 246 246 255 238 238 238 189 189 189 197 197 197 205 205 205 222 222 222 230 230 230 0 0 0 115 180 255 197 246 255 148 213 255 172 222 255 180 238 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/agatha.pal ================================================ JASC-PAL 0100 48 0 0 0 255 238 255 238 230 246 205 156 222 213 172 230 222 189 238 222 197 238 213 172 230 230 213 246 230 213 238 246 246 255 222 197 148 230 213 180 238 230 205 246 238 230 238 230 255 0 0 0 255 238 255 230 222 246 189 139 205 213 172 230 213 180 230 222 189 238 197 156 213 230 205 246 222 197 238 246 246 255 222 197 148 230 213 180 238 230 205 246 238 230 238 230 255 0 0 0 255 213 106 255 255 230 255 230 148 255 238 164 255 255 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/bruno.pal ================================================ JASC-PAL 0100 48 0 0 0 246 246 246 246 246 238 213 205 156 222 213 164 238 230 197 230 222 189 222 213 172 238 230 213 238 238 205 246 246 255 222 197 148 230 213 180 238 230 205 246 238 230 238 238 238 0 0 0 246 246 246 238 238 230 197 189 139 205 197 164 230 222 189 213 213 189 213 205 164 222 222 213 230 230 205 246 246 255 222 197 148 230 213 180 238 230 205 246 238 230 238 238 238 0 0 0 82 238 164 222 255 230 148 238 164 172 246 189 197 246 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/champion.pal ================================================ JASC-PAL 0100 48 0 0 0 246 246 255 246 255 255 213 205 205 213 213 213 238 238 238 230 222 230 230 222 222 238 230 238 238 246 246 255 255 255 197 172 230 222 197 238 238 222 246 246 230 255 238 238 238 0 0 0 246 246 255 246 255 255 213 205 205 213 205 213 238 238 238 230 222 230 230 222 222 238 230 238 238 246 246 255 255 255 197 172 230 222 197 238 238 222 246 246 230 255 238 238 238 0 0 0 131 197 255 213 255 255 164 222 255 189 230 255 197 246 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/gym.pal ================================================ JASC-PAL 0100 48 0 0 0 246 255 255 255 255 255 230 230 230 230 230 230 246 246 246 230 238 238 238 238 238 238 238 238 246 255 255 255 255 255 222 222 189 230 230 205 238 238 222 246 246 238 246 246 246 0 0 0 246 255 255 255 255 255 213 213 213 230 230 230 238 238 246 230 238 238 222 230 222 238 238 238 246 255 255 255 255 255 213 213 213 230 230 230 238 238 238 246 246 246 246 246 246 0 0 0 131 197 255 213 255 255 164 222 255 189 230 255 197 246 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/lance.pal ================================================ JASC-PAL 0100 48 0 0 0 238 246 238 222 238 246 123 197 172 148 205 189 189 230 213 180 222 205 148 213 189 205 230 222 205 230 230 246 246 255 222 197 148 230 213 180 238 230 205 246 238 230 222 238 246 0 0 0 238 246 238 213 230 246 106 180 156 148 205 189 180 213 205 180 222 205 139 197 180 205 230 222 197 222 222 246 246 255 222 197 148 230 213 180 238 230 205 246 238 230 222 238 246 0 0 0 131 197 255 213 255 255 164 222 255 189 230 255 197 246 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/leader.pal ================================================ JASC-PAL 0100 48 0 0 0 246 255 255 255 255 255 230 230 230 230 230 230 246 246 246 230 238 238 238 238 238 238 238 238 246 255 255 255 255 255 222 222 189 230 230 205 238 238 222 246 246 238 246 246 246 0 0 0 246 255 255 255 255 255 213 213 213 230 230 230 238 238 246 230 238 238 222 230 222 238 238 238 246 255 255 255 255 255 213 213 213 230 230 230 238 238 238 246 246 246 246 246 246 0 0 0 255 222 115 255 255 213 255 230 156 255 238 172 255 246 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/link.pal ================================================ JASC-PAL 0100 48 0 0 0 246 255 255 255 255 255 230 230 230 230 230 230 246 246 246 230 238 238 238 238 238 238 238 238 246 255 255 255 255 255 213 213 213 230 230 230 238 238 238 246 246 246 246 246 246 0 0 0 246 255 255 255 255 255 213 213 213 230 230 230 238 238 246 230 238 238 222 230 222 238 238 238 238 246 246 255 255 255 213 213 213 230 230 230 238 238 238 246 246 246 246 246 246 0 0 0 164 213 255 238 255 255 180 230 255 205 238 255 222 246 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/lorelei.pal ================================================ JASC-PAL 0100 48 0 0 0 238 255 255 230 246 255 156 189 230 172 197 230 205 230 238 189 213 238 189 222 230 222 238 246 213 238 246 246 246 255 222 197 148 230 213 180 238 230 205 246 238 230 230 246 246 0 0 0 238 255 255 230 246 255 139 172 213 172 197 230 197 222 230 189 213 238 164 197 222 222 238 246 213 230 238 246 246 255 222 197 148 230 213 180 238 230 205 246 238 230 230 246 246 0 0 0 115 205 255 230 255 255 148 213 255 164 222 255 205 238 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/indoor/plain.pal ================================================ JASC-PAL 0100 48 0 0 0 230 255 230 197 255 148 238 238 172 230 238 180 180 238 131 230 246 197 205 238 148 230 246 213 189 246 139 238 246 246 189 222 246 205 230 246 213 230 246 222 238 246 222 246 222 0 0 0 230 255 230 197 255 148 238 238 172 230 238 180 180 238 131 230 246 197 205 238 148 230 246 213 189 246 139 238 246 246 189 222 246 205 230 246 213 230 246 222 238 246 222 246 222 0 0 0 156 213 255 238 255 255 180 230 255 205 238 255 222 246 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/longgrass/terrain.pal ================================================ JASC-PAL 0100 48 0 0 0 205 255 189 148 230 106 115 213 106 180 238 131 222 246 172 139 222 98 180 230 172 156 222 148 255 0 255 197 255 180 106 197 74 131 213 98 156 230 123 172 238 148 180 246 172 0 0 0 205 255 189 139 222 98 98 197 98 164 230 131 222 246 172 123 213 90 180 230 172 156 222 148 255 0 255 197 255 180 106 197 74 123 205 98 148 222 123 172 238 148 172 246 172 0 0 0 115 213 82 98 180 90 90 148 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/mountain/terrain.pal ================================================ JASC-PAL 0100 48 0 0 0 255 255 255 222 222 180 197 189 148 205 197 164 246 246 213 230 230 197 230 230 230 205 197 172 222 222 213 255 255 255 222 230 230 230 230 238 230 238 238 238 246 246 246 246 255 0 0 0 255 255 255 213 213 172 189 172 139 197 189 156 238 238 205 222 222 189 230 230 230 205 197 172 222 222 213 255 255 255 222 230 230 230 230 238 230 238 238 238 246 246 246 246 255 0 0 0 131 98 90 164 131 98 197 156 106 213 180 131 230 213 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/pond/terrain.pal ================================================ JASC-PAL 0100 48 0 0 0 255 255 255 115 189 246 189 255 115 205 255 156 131 205 255 222 255 205 164 238 164 246 255 238 156 230 255 255 255 255 205 230 246 213 230 246 230 238 246 238 246 255 246 246 246 0 0 0 255 255 255 98 164 230 164 246 98 197 255 139 115 189 238 205 255 197 148 230 156 230 255 222 139 213 255 255 255 255 205 230 246 213 230 246 222 238 246 230 238 246 246 246 246 0 0 0 205 246 255 148 213 238 123 189 230 90 148 222 49 106 189 16 74 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/sand/terrain.pal ================================================ JASC-PAL 0100 48 0 0 0 255 255 238 246 246 148 238 230 123 230 222 98 238 238 156 246 246 189 255 255 246 255 255 197 230 230 131 255 255 255 189 222 246 205 230 246 222 238 246 230 246 246 246 246 222 0 0 0 255 255 238 238 238 139 230 222 139 222 213 90 238 230 156 238 238 189 255 255 246 255 246 197 230 222 106 255 255 255 189 222 246 205 230 246 222 238 246 230 246 246 246 246 222 0 0 0 197 197 74 164 156 32 222 222 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/underwater/terrain.pal ================================================ JASC-PAL 0100 48 0 0 0 197 230 255 139 156 213 148 197 246 172 205 255 139 180 222 189 213 255 148 189 230 205 222 255 197 230 255 205 230 255 148 164 238 156 189 238 172 205 238 189 213 246 197 222 255 0 0 0 197 230 255 131 139 197 148 197 246 172 205 255 131 164 213 189 213 255 148 180 222 205 222 255 197 230 255 205 230 255 148 164 238 156 189 238 172 205 238 189 213 246 197 222 255 0 0 0 98 164 230 131 197 255 172 238 255 255 255 255 205 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 98 98 172 131 131 230 172 172 255 255 255 255 ================================================ FILE: graphics/battle_terrain/unused/building/palette.pal ================================================ JASC-PAL 0100 48 0 0 0 255 255 255 222 197 164 238 222 180 238 230 205 230 205 164 246 238 230 222 213 180 230 213 172 0 0 0 0 0 0 246 246 156 246 246 180 246 246 205 246 246 230 246 246 246 0 0 0 255 255 255 222 197 164 238 222 180 238 230 205 230 205 164 246 238 230 222 213 180 246 246 205 0 0 0 0 0 0 246 246 156 246 246 180 246 246 205 246 246 230 246 246 246 0 0 0 246 205 139 255 238 164 246 222 156 255 238 172 255 246 180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/building/palette2.pal ================================================ JASC-PAL 0100 48 0 0 0 255 255 255 205 189 148 222 213 172 238 230 197 205 197 156 246 238 222 213 205 164 222 213 156 0 0 0 0 0 0 213 189 148 230 213 180 238 230 213 246 238 230 246 246 246 0 0 0 255 255 255 205 189 148 222 213 172 238 230 197 205 197 156 246 238 222 213 205 164 222 213 156 0 0 0 0 0 0 213 189 148 230 213 180 238 230 213 246 238 230 246 246 246 0 0 0 164 197 246 205 246 255 180 222 255 189 230 255 197 238 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/building/palette3.pal ================================================ JASC-PAL 0100 48 0 0 0 255 255 255 205 189 148 222 213 172 238 230 197 205 197 156 246 238 222 213 205 164 222 213 156 0 0 0 0 0 0 213 189 148 230 213 180 238 230 213 246 238 230 246 246 246 0 0 0 255 255 255 205 189 148 222 213 172 238 230 197 205 197 156 246 238 222 213 205 164 222 213 156 0 0 0 0 0 0 213 189 148 230 213 180 238 230 213 246 238 230 246 246 246 0 0 0 255 222 65 255 255 180 255 238 74 255 246 115 255 255 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/groudon.pal ================================================ JASC-PAL 0100 48 0 0 0 246 246 189 222 213 106 180 156 106 197 172 123 205 189 115 213 197 148 197 172 106 230 222 172 255 189 49 238 230 123 213 115 32 222 172 106 230 197 139 230 213 156 238 230 180 0 0 0 246 246 189 222 213 106 180 156 106 197 172 123 205 189 115 213 197 148 197 172 106 230 222 172 255 189 49 238 230 123 82 106 172 148 156 164 197 189 164 230 213 180 238 230 180 0 0 0 106 74 65 148 115 82 180 139 90 213 180 131 230 213 156 0 0 0 205 148 74 230 156 57 255 172 49 255 189 49 205 148 74 205 148 74 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/kyogre.pal ================================================ JASC-PAL 0100 48 0 0 0 246 246 189 90 148 222 148 213 238 180 222 222 106 172 230 172 213 213 123 189 230 205 222 197 0 0 0 0 0 0 172 139 82 189 156 106 213 197 148 230 213 164 238 230 180 0 0 0 246 246 189 90 148 222 148 213 238 180 222 222 106 172 230 172 213 213 123 189 230 205 222 197 0 0 0 0 0 0 172 139 82 189 156 106 213 197 148 230 213 164 238 230 180 0 0 0 98 164 230 131 197 255 172 238 255 255 255 255 205 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/plain.pal ================================================ JASC-PAL 0100 48 0 0 0 238 255 230 156 230 156 230 230 148 230 238 164 189 230 148 230 246 180 205 230 172 172 238 172 0 0 0 0 0 0 164 222 246 180 230 230 197 238 222 213 246 213 230 255 205 0 0 0 238 255 230 156 230 156 230 230 148 230 238 164 189 230 148 230 246 180 205 230 172 172 238 172 0 0 0 0 0 0 164 222 246 180 230 230 197 238 222 213 246 213 230 255 205 0 0 0 74 189 65 172 230 172 106 205 90 131 213 115 156 213 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/stadium/battle_frontier.pal ================================================ JASC-PAL 0100 48 0 0 0 255 255 255 189 189 156 213 213 197 230 230 213 197 197 180 238 238 222 205 205 189 197 197 180 0 0 0 0 0 0 222 230 230 230 230 238 230 238 238 238 246 246 246 246 255 0 0 0 255 255 255 189 189 156 213 213 197 230 230 213 197 197 180 238 238 222 205 205 189 197 197 180 0 0 0 0 0 0 222 230 230 230 230 238 230 238 238 238 246 246 246 246 255 0 0 0 172 189 213 238 238 246 180 197 222 205 222 238 222 230 246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/stadium/palette1.pal ================================================ JASC-PAL 0100 48 0 0 0 230 246 255 65 131 213 131 197 255 148 205 246 82 148 222 172 213 246 106 172 238 98 164 246 82 148 230 98 164 246 65 164 213 106 189 230 139 205 238 180 230 238 205 238 246 0 0 0 255 255 255 189 189 156 213 213 197 230 230 213 197 197 180 238 238 222 205 205 189 197 197 180 0 0 0 0 0 0 222 230 230 230 230 238 230 238 238 238 246 246 246 246 255 0 0 0 255 213 65 255 246 197 255 213 82 255 230 115 255 246 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/stadium/palette2.pal ================================================ JASC-PAL 0100 48 0 0 0 222 222 222 222 106 0 156 148 156 172 164 172 197 106 49 189 180 189 172 123 98 238 131 0 230 115 0 246 131 0 139 139 139 156 148 156 180 172 180 197 189 197 205 197 213 0 0 0 255 255 255 189 189 156 213 213 197 230 230 213 197 197 180 238 238 222 205 205 189 197 197 180 0 0 0 0 0 0 222 230 230 230 230 238 230 238 238 238 246 246 246 246 255 0 0 0 123 205 164 189 255 230 139 222 180 156 238 197 172 255 213 0 0 0 213 49 0 255 222 139 213 106 57 246 180 16 255 197 90 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/stadium/palette3.pal ================================================ JASC-PAL 0100 48 0 0 0 230 246 230 222 197 148 246 222 172 230 222 189 230 205 156 213 230 205 238 213 164 246 222 172 238 205 164 230 213 164 65 172 156 98 197 180 139 213 213 164 230 222 197 238 230 0 0 0 230 246 230 205 172 131 238 213 164 238 222 189 213 180 139 238 230 222 222 197 148 230 205 156 222 189 148 230 213 164 65 172 156 98 197 180 139 213 213 164 230 222 197 238 230 0 0 0 255 213 65 255 246 197 255 213 82 255 230 115 255 246 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/stadium/palette4.pal ================================================ JASC-PAL 0100 48 0 0 0 230 246 230 197 156 205 230 205 238 205 222 230 205 172 213 213 213 230 213 189 222 213 156 238 205 164 222 230 180 238 65 172 156 98 197 180 139 213 213 164 230 222 197 238 230 0 0 0 230 246 230 197 139 205 230 205 238 205 222 230 205 156 213 213 213 230 213 180 222 213 156 238 205 156 213 230 180 238 65 172 156 98 197 180 139 213 213 164 230 222 197 238 230 0 0 0 189 90 230 230 213 246 189 115 230 197 139 230 213 189 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/stadium/palette5.pal ================================================ JASC-PAL 0100 48 0 0 0 230 246 230 139 172 238 180 213 255 180 213 255 148 180 238 189 222 255 164 197 246 164 197 255 148 180 246 180 213 255 65 172 156 98 197 180 139 213 213 164 230 222 197 238 230 0 0 0 230 246 230 131 164 230 180 213 255 180 213 255 148 180 238 189 222 255 164 197 246 164 197 255 148 180 246 180 213 255 65 172 156 98 197 180 139 213 213 164 230 222 197 238 230 0 0 0 90 148 238 172 238 255 106 172 238 123 189 246 164 222 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/stadium/palette6.pal ================================================ JASC-PAL 0100 48 0 0 0 230 246 230 246 156 90 197 197 197 197 205 205 230 164 123 197 222 213 213 180 156 255 189 90 255 172 90 255 172 32 65 172 156 98 197 180 139 213 213 164 230 222 197 238 230 0 0 0 230 246 230 230 115 32 164 164 164 172 189 180 205 131 74 180 213 205 180 148 115 255 148 32 246 131 32 255 172 32 65 172 156 98 197 180 139 213 213 164 230 222 197 238 230 0 0 0 238 189 49 255 255 131 238 197 57 246 222 74 255 246 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/unused/stadium/palette7.pal ================================================ JASC-PAL 0100 48 0 0 0 246 238 246 197 115 205 246 180 246 238 205 238 205 131 213 238 213 238 222 164 230 222 148 230 213 131 222 238 156 246 172 106 172 205 148 205 230 189 230 238 213 238 238 230 238 0 0 0 246 238 246 197 115 205 246 180 246 238 205 238 205 131 213 238 213 238 222 164 230 222 148 230 213 131 222 238 156 246 172 106 172 205 148 205 230 189 230 238 213 238 238 230 238 0 0 0 246 172 0 255 238 131 255 180 16 255 197 41 255 238 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_terrain/water/terrain.pal ================================================ JASC-PAL 0100 48 0 0 0 246 255 255 131 180 238 123 164 238 139 205 246 205 230 246 230 246 255 180 222 246 156 213 255 255 0 255 255 255 255 205 222 238 222 238 238 230 246 246 246 246 255 246 246 255 0 0 0 246 255 255 106 189 238 106 156 230 131 197 238 205 230 246 230 246 255 180 222 246 156 213 255 255 0 255 255 255 255 205 222 230 213 230 238 230 238 246 246 255 255 246 246 255 0 0 0 0 0 0 0 0 0 0 0 0 246 255 255 180 230 255 139 205 246 106 172 238 49 148 197 16 98 180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_transitions/agatha_bg.pal ================================================ JASC-PAL 0100 16 172 49 49 115 115 115 148 148 148 180 180 180 213 213 213 255 82 172 255 98 189 255 115 205 255 131 222 255 148 238 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_transitions/blue_bg.pal ================================================ JASC-PAL 0100 16 172 49 49 115 115 115 148 148 148 180 180 180 213 213 213 197 197 65 213 213 82 230 230 98 246 246 115 255 255 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_transitions/bruno_bg.pal ================================================ JASC-PAL 0100 16 172 49 49 115 115 115 148 148 148 180 180 180 213 213 213 8 213 8 32 238 32 49 246 49 74 255 74 123 255 123 230 123 139 246 139 156 255 156 172 255 172 189 255 189 205 230 123 139 ================================================ FILE: graphics/battle_transitions/green_bg.pal ================================================ JASC-PAL 0100 16 230 123 139 246 139 156 255 156 172 255 172 189 255 189 205 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_transitions/lance_bg.pal ================================================ JASC-PAL 0100 16 172 49 49 115 115 115 148 148 148 180 180 180 213 213 213 0 0 131 16 16 148 32 32 164 49 49 180 65 65 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_transitions/lorelei_bg.pal ================================================ JASC-PAL 0100 16 172 49 49 115 115 115 148 148 148 180 180 180 213 213 213 189 0 189 205 16 205 222 32 222 238 49 238 255 65 255 106 180 213 123 197 230 139 213 246 156 230 255 172 246 255 255 255 255 ================================================ FILE: graphics/battle_transitions/red_bg.pal ================================================ JASC-PAL 0100 16 106 180 213 123 197 230 139 213 246 156 230 255 172 246 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/battle_transitions/sliding_pokeball.pal ================================================ JASC-PAL 0100 16 98 172 238 246 8 0 238 213 180 222 180 148 255 255 255 222 230 238 189 205 230 156 180 222 98 156 180 148 0 0 197 197 197 238 230 164 222 205 131 213 180 106 205 156 82 0 0 0 ================================================ FILE: graphics/battle_transitions/unused_trainer.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 164 148 205 131 115 123 90 82 57 74 123 41 57 98 24 41 82 16 32 57 222 230 238 255 197 90 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/berry_pouch/background_female.pal ================================================ JASC-PAL 0100 16 0 65 90 255 0 255 41 57 82 213 139 115 255 0 255 255 0 255 255 172 148 164 205 238 189 238 255 255 255 205 180 189 180 148 148 148 238 230 172 106 106 106 106 156 238 0 90 131 ================================================ FILE: graphics/cable_car/bg.pal ================================================ JASC-PAL 0100 64 0 0 0 230 106 189 230 106 189 230 106 189 230 106 189 230 106 189 230 106 189 255 230 139 238 205 123 222 189 115 205 172 106 189 156 98 180 139 90 230 106 189 230 106 189 230 106 189 0 0 0 189 255 148 156 222 98 131 197 74 106 164 49 82 115 24 57 82 0 230 106 189 230 106 189 230 106 189 230 106 189 230 106 189 230 106 189 230 106 189 230 106 189 230 106 189 0 0 0 213 238 255 189 230 255 164 222 255 139 213 255 115 205 255 98 205 255 197 205 222 189 189 197 180 164 164 156 131 131 131 90 90 123 65 65 230 106 189 230 106 189 230 106 189 0 0 0 197 205 246 172 189 238 156 172 238 131 156 230 115 139 230 98 123 230 65 74 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/cave_transition/black.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/cave_transition/enter.pal ================================================ JASC-PAL 0100 8 148 197 172 16 16 16 32 32 32 49 49 49 65 65 65 82 82 82 98 98 98 115 115 115 ================================================ FILE: graphics/cave_transition/exit.pal ================================================ JASC-PAL 0100 8 131 131 131 148 148 148 164 164 164 180 180 180 197 197 197 213 213 213 230 230 230 255 255 255 ================================================ FILE: graphics/cave_transition/white.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ================================================ FILE: graphics/contest/interface.pal ================================================ JASC-PAL 0100 256 0 0 0 255 255 255 230 230 230 197 197 197 148 148 148 74 65 82 0 255 0 0 255 0 65 74 123 139 123 131 82 82 197 189 82 74 131 74 98 74 74 131 131 139 222 106 164 164 0 0 0 115 123 156 90 65 57 148 197 106 123 98 65 131 123 49 222 189 148 164 131 106 115 164 82 164 148 57 90 106 139 180 172 82 82 139 49 255 230 189 222 131 41 246 246 222 205 148 115 255 106 115 255 57 57 156 0 0 164 222 255 106 148 255 49 82 255 255 255 115 246 222 65 230 106 0 255 255 255 189 189 197 131 131 139 98 98 123 65 74 106 41 49 90 0 0 0 255 255 115 246 222 90 238 189 65 238 164 41 230 131 16 230 106 0 255 41 0 255 148 82 255 255 164 255 255 255 189 189 197 131 131 139 98 98 123 65 74 106 41 49 90 0 0 0 255 131 106 197 24 16 164 222 255 106 148 255 49 82 255 255 197 255 255 139 255 213 0 139 148 255 164 65 205 57 246 222 65 230 106 0 255 255 255 65 74 106 65 74 106 197 255 255 246 246 90 205 205 65 255 255 180 180 180 24 74 65 82 255 255 255 156 156 156 255 156 156 0 0 0 255 255 255 255 148 148 255 123 98 255 0 0 148 148 148 0 0 0 197 255 255 246 246 90 205 205 65 255 255 180 180 180 24 74 65 82 255 255 255 156 156 156 255 156 156 0 0 0 255 255 255 255 148 148 255 123 98 255 0 0 148 148 148 0 0 0 197 255 255 246 246 90 205 205 65 255 255 180 180 180 24 74 65 82 255 255 255 156 156 156 255 156 156 0 0 0 255 255 255 255 148 148 255 123 98 255 0 0 148 148 148 0 0 0 197 255 255 213 255 213 156 222 148 222 255 230 123 189 115 74 65 82 255 255 255 156 156 156 255 156 156 0 0 0 255 255 255 255 148 148 255 123 98 255 0 0 148 148 148 0 0 0 0 172 255 0 0 0 255 255 255 230 230 213 0 0 0 197 197 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 197 255 255 0 0 0 0 0 0 0 0 0 65 0 0 123 0 0 189 0 0 255 8 0 255 65 0 255 123 0 255 189 0 255 255 0 255 255 123 255 255 255 189 189 197 131 131 139 98 98 123 65 74 106 41 49 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/contest/japanese/palette.pal ================================================ JASC-PAL 0100 256 0 0 0 255 255 255 230 230 230 197 197 197 148 148 148 74 65 82 0 255 0 0 255 0 65 74 123 139 123 131 82 82 197 189 82 74 131 74 98 74 74 131 131 139 222 106 164 164 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 230 230 230 230 238 230 238 238 238 246 246 246 246 255 0 0 0 255 255 255 172 172 148 213 213 189 230 230 213 189 189 172 238 238 222 197 197 180 0 0 0 156 156 131 197 197 189 139 139 131 98 98 98 0 0 0 0 0 0 0 0 0 0 0 0 115 106 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 148 156 131 139 156 123 131 156 131 123 164 123 115 164 0 0 0 115 106 156 255 255 255 205 156 255 172 148 197 230 222 246 139 131 172 213 189 238 0 0 0 238 238 230 189 172 197 222 213 213 189 172 189 0 0 0 0 0 0 0 0 0 0 0 0 255 164 131 213 131 90 255 189 172 197 98 74 74 65 82 255 255 255 156 156 156 0 0 0 0 0 0 255 255 255 148 148 148 255 123 98 131 246 90 255 246 74 131 148 255 0 0 0 164 238 98 131 205 90 213 255 148 98 197 49 74 65 82 255 255 255 156 156 156 0 0 0 0 0 0 255 255 255 148 148 148 255 123 98 131 246 90 255 246 74 131 148 255 0 0 0 246 246 90 205 205 65 255 255 180 180 180 24 74 65 82 255 255 255 156 156 156 0 0 0 0 0 0 255 255 255 148 148 148 255 123 98 131 246 90 255 246 74 131 148 255 0 0 0 115 205 255 115 180 205 156 238 255 49 98 148 74 65 82 255 255 255 156 156 156 0 0 0 0 0 0 255 255 255 148 148 148 255 123 98 131 246 90 255 246 74 131 148 255 0 0 0 0 0 0 255 255 255 230 230 213 0 0 0 197 197 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 230 230 213 0 0 0 197 197 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 230 230 213 0 0 0 197 197 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 230 230 213 0 0 0 197 197 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 74 65 82 255 255 255 222 222 222 172 172 197 255 0 0 0 0 255 255 255 0 0 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 164 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/contest/results.pal ================================================ JASC-PAL 0100 256 0 0 0 255 255 255 189 189 197 131 131 139 98 98 123 65 74 106 41 49 90 255 106 115 255 57 57 205 32 0 246 213 0 255 123 98 156 180 90 164 148 57 90 106 139 180 172 82 0 0 0 255 255 255 189 189 197 131 131 139 98 98 123 65 74 106 41 49 90 164 222 255 106 148 255 24 57 205 246 213 0 255 123 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 189 189 197 131 131 139 98 98 123 65 74 106 41 49 90 255 197 255 255 139 255 213 0 139 246 213 0 255 123 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 189 189 197 131 131 139 98 98 123 65 74 106 41 49 90 180 255 197 148 255 164 65 172 57 246 213 0 255 123 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 189 189 197 131 131 139 98 98 123 65 74 106 41 49 90 255 255 164 246 213 0 230 106 0 246 213 0 255 123 98 0 0 0 0 0 0 0 0 0 0 0 0 197 255 255 255 255 255 213 213 213 131 131 139 98 98 123 65 74 106 41 49 90 164 222 255 106 148 255 49 82 255 180 255 197 148 255 164 65 172 57 0 0 0 0 0 0 0 0 0 197 255 255 255 255 255 213 213 213 131 131 139 98 98 123 65 74 106 41 49 90 255 139 230 255 139 230 255 49 156 255 255 0 255 255 0 189 172 0 41 49 90 41 49 90 0 0 0 197 123 131 255 255 255 230 246 255 205 238 255 180 238 255 156 230 255 139 230 255 255 205 230 255 255 139 255 230 255 255 255 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 197 255 255 255 255 255 213 213 213 131 131 139 98 98 123 65 74 106 41 49 90 255 172 197 255 172 172 255 180 148 255 189 123 255 197 98 255 205 82 156 156 156 156 156 156 156 156 156 197 255 255 255 255 255 213 213 213 131 131 139 98 98 123 65 74 106 41 49 90 164 222 255 106 148 255 49 82 255 180 255 197 148 255 164 65 172 57 0 0 0 0 0 0 0 0 0 0 0 0 164 222 255 106 230 222 49 238 189 0 255 156 0 255 156 82 255 98 164 255 49 255 255 0 255 172 16 255 90 32 255 8 57 230 57 106 205 115 156 180 164 205 164 222 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/credits/pokeball_blastoise.pal ================================================ JASC-PAL 0100 16 0 0 0 148 197 246 131 180 246 106 164 246 90 148 255 57 98 164 24 49 82 172 222 246 131 172 197 98 131 148 65 82 98 32 41 49 16 98 255 8 65 164 0 32 82 0 0 0 ================================================ FILE: graphics/credits/pokeball_charizard.pal ================================================ JASC-PAL 0100 16 0 0 0 230 98 90 213 65 82 189 32 74 172 0 74 115 0 49 57 0 24 255 131 98 197 98 74 148 74 57 98 49 32 49 24 16 255 0 8 164 0 0 82 0 0 0 0 0 ================================================ FILE: graphics/credits/pokeball_pikachu.pal ================================================ JASC-PAL 0100 16 0 0 0 255 230 57 255 213 41 255 189 16 255 172 0 164 115 0 82 57 0 255 255 82 213 213 65 180 180 57 148 148 41 106 106 32 255 90 0 164 57 0 82 24 0 0 0 0 ================================================ FILE: graphics/credits/pokeball_venusaur.pal ================================================ JASC-PAL 0100 16 0 0 0 131 205 131 90 164 115 49 115 98 16 115 123 8 74 82 0 32 41 172 255 156 131 197 123 98 148 90 65 98 57 32 49 24 16 180 0 8 115 0 0 57 0 0 0 0 ================================================ FILE: graphics/credits/white_circle.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ================================================ FILE: graphics/dodrio_berry_picking/bg.pal ================================================ JASC-PAL 0100 16 230 246 255 82 180 172 82 205 189 156 156 131 106 156 148 123 123 98 189 172 98 189 189 139 74 172 156 172 172 131 74 156 123 115 115 82 139 139 106 164 164 115 197 197 148 230 246 255 ================================================ FILE: graphics/dodrio_berry_picking/shiny.pal ================================================ JASC-PAL 0100 16 238 255 238 41 41 41 213 222 90 172 180 49 90 98 16 246 131 164 197 82 82 255 255 156 255 205 98 139 106 16 148 148 148 82 82 82 255 205 230 131 139 16 0 0 0 255 255 255 ================================================ FILE: graphics/dodrio_berry_picking/tree_border.pal ================================================ JASC-PAL 0100 16 230 246 255 246 246 222 230 230 180 139 238 139 246 246 189 197 246 164 246 230 197 230 246 255 230 213 180 205 197 164 148 222 148 222 238 255 139 205 139 213 238 246 222 246 255 213 205 164 ================================================ FILE: graphics/easy_chat/text.pal ================================================ JASC-PAL 0100 5 0 0 0 255 255 255 98 98 98 222 213 222 65 139 74 ================================================ FILE: graphics/easy_chat/text_input_frame_green.pal ================================================ JASC-PAL 0100 16 115 197 164 189 255 139 156 230 106 123 180 90 180 213 255 139 180 230 115 139 172 0 0 0 255 131 131 238 82 82 255 238 180 255 255 213 115 115 115 180 189 180 222 213 222 255 255 255 ================================================ FILE: graphics/easy_chat/text_input_frame_orange.pal ================================================ JASC-PAL 0100 16 115 197 164 255 189 115 255 139 57 205 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 238 180 255 255 213 115 115 115 180 189 180 222 213 222 255 255 255 ================================================ FILE: graphics/easy_chat/title_text.pal ================================================ JASC-PAL 0100 4 0 0 0 0 0 0 57 205 255 172 172 238 ================================================ FILE: graphics/evolution_scene/gray_transition_intro.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/evolution_scene/transition.pal ================================================ JASC-PAL 0100 32 0 0 0 16 16 16 24 32 32 41 49 49 49 65 74 65 82 90 74 98 115 90 115 131 106 131 148 115 148 172 131 164 189 139 180 213 156 197 230 172 213 255 0 0 0 0 0 0 0 0 0 65 90 106 74 98 115 82 106 131 90 115 139 98 131 156 106 139 164 115 148 180 123 156 189 131 172 205 139 180 213 148 189 230 156 197 238 172 213 255 0 0 0 0 0 0 ================================================ FILE: graphics/evolution_scene/unused.pal ================================================ JASC-PAL 0100 16 0 0 0 90 90 90 98 106 106 115 123 123 131 131 131 148 148 148 156 164 164 172 172 172 189 189 189 197 205 205 213 213 213 230 230 230 246 246 246 255 255 255 0 0 0 0 0 0 ================================================ FILE: graphics/fame_checker/silhouette.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/fame_checker/unk.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_effects/palettes/ash.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 98 98 98 213 213 139 172 172 90 139 139 65 230 246 205 189 238 180 131 222 180 98 172 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_effects/palettes/general_0.pal ================================================ JASC-PAL 0100 16 255 0 238 246 230 197 238 213 180 222 180 148 255 255 255 222 230 238 189 205 230 156 180 222 98 156 180 0 0 0 0 0 0 238 230 164 222 213 139 213 189 115 197 180 90 0 0 0 ================================================ FILE: graphics/field_effects/palettes/general_1.pal ================================================ JASC-PAL 0100 16 255 0 238 189 255 139 131 213 98 57 139 49 57 82 0 49 65 0 98 172 238 98 172 197 139 205 246 148 230 255 148 131 98 180 172 148 164 230 197 115 205 164 65 180 139 24 164 106 ================================================ FILE: graphics/field_effects/palettes/small_sparkle.pal ================================================ JASC-PAL 0100 16 131 172 74 255 255 255 205 246 255 156 213 255 74 197 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/field_specials/champion_room_lighting_0.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 ================================================ FILE: graphics/field_specials/champion_room_lighting_1.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 82 106 82 82 106 82 82 106 82 82 106 82 172 230 41 115 205 ================================================ FILE: graphics/field_specials/champion_room_lighting_2.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 82 106 82 82 106 82 172 230 41 115 205 131 238 255 82 172 230 ================================================ FILE: graphics/field_specials/champion_room_lighting_3.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 172 230 41 115 205 131 238 255 82 172 230 82 172 230 41 115 205 ================================================ FILE: graphics/field_specials/champion_room_lighting_4.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 131 238 255 82 172 230 82 172 230 41 115 205 41 115 205 0 65 189 ================================================ FILE: graphics/field_specials/champion_room_lighting_5.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 172 230 41 115 205 41 115 205 0 65 189 0 65 189 82 82 106 ================================================ FILE: graphics/field_specials/champion_room_lighting_6.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 41 115 205 0 65 189 0 65 189 82 82 106 82 82 106 82 82 106 ================================================ FILE: graphics/field_specials/champion_room_lighting_7.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 0 65 189 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 ================================================ FILE: graphics/field_specials/champion_room_lighting_8.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 131 238 255 255 213 131 230 164 98 197 115 74 164 82 65 172 172 98 148 148 74 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 ================================================ FILE: graphics/field_specials/deoxys_rock_0.pal ================================================ JASC-PAL 0100 16 106 156 197 32 32 32 82 82 82 139 139 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_1.pal ================================================ JASC-PAL 0100 16 106 156 197 41 32 32 82 82 82 139 139 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_10.pal ================================================ JASC-PAL 0100 16 106 156 197 205 32 32 255 82 82 255 205 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_2.pal ================================================ JASC-PAL 0100 16 0 0 0 49 32 32 90 82 82 148 148 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_3.pal ================================================ JASC-PAL 0100 16 0 0 0 65 32 32 115 82 82 156 148 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_4.pal ================================================ JASC-PAL 0100 16 0 0 0 74 32 32 123 82 82 164 156 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_5.pal ================================================ JASC-PAL 0100 16 0 0 0 98 32 32 139 82 82 172 156 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_6.pal ================================================ JASC-PAL 0100 16 0 0 0 98 32 32 148 82 82 180 164 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_7.pal ================================================ JASC-PAL 0100 16 0 0 0 106 32 32 156 82 82 189 164 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_8.pal ================================================ JASC-PAL 0100 16 0 0 0 123 32 32 172 82 82 197 172 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/deoxys_rock_9.pal ================================================ JASC-PAL 0100 16 0 0 0 131 32 32 180 82 82 205 172 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/field_specials/elite_four_lighting_0.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 ================================================ FILE: graphics/field_specials/elite_four_lighting_1.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 82 106 82 82 106 82 82 106 82 82 106 41 115 205 82 82 106 ================================================ FILE: graphics/field_specials/elite_four_lighting_10.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 0 41 156 82 82 106 82 82 106 82 82 106 82 82 106 0 41 156 ================================================ FILE: graphics/field_specials/elite_four_lighting_11.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 131 238 255 255 213 131 230 164 98 197 115 74 164 82 65 172 172 98 148 148 74 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 82 82 106 ================================================ FILE: graphics/field_specials/elite_four_lighting_2.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 82 106 82 82 106 82 82 106 41 115 205 131 238 255 0 41 156 ================================================ FILE: graphics/field_specials/elite_four_lighting_3.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 82 106 82 82 106 41 115 205 131 238 255 82 172 230 0 65 189 ================================================ FILE: graphics/field_specials/elite_four_lighting_4.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 82 106 41 115 205 131 238 255 82 172 230 41 115 205 41 115 205 ================================================ FILE: graphics/field_specials/elite_four_lighting_5.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 41 115 205 131 238 255 82 172 230 41 115 205 0 65 189 82 172 230 ================================================ FILE: graphics/field_specials/elite_four_lighting_6.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 131 238 255 82 172 230 41 115 205 0 65 189 0 41 156 131 238 255 ================================================ FILE: graphics/field_specials/elite_four_lighting_7.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 82 172 230 41 115 205 0 65 189 0 41 156 82 82 106 90 180 238 ================================================ FILE: graphics/field_specials/elite_four_lighting_8.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 41 115 205 0 65 189 0 41 156 82 82 106 82 82 106 41 115 205 ================================================ FILE: graphics/field_specials/elite_four_lighting_9.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 106 123 123 123 255 74 0 255 213 131 230 164 98 197 115 74 164 82 65 255 255 180 189 189 115 0 65 189 0 41 156 82 82 106 82 82 106 82 82 106 0 65 189 ================================================ FILE: graphics/interface/bag.pal ================================================ JASC-PAL 0100 16 82 205 180 255 246 180 255 230 123 238 205 98 213 172 98 65 74 106 123 123 123 90 90 90 172 172 172 164 123 65 255 255 255 222 106 0 189 74 0 131 41 0 213 222 230 230 238 246 ================================================ FILE: graphics/interface/blank.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 189 189 197 131 131 139 98 98 123 65 74 106 41 49 90 148 255 164 139 246 115 65 205 57 0 0 0 0 0 0 0 0 0 0 0 0 213 213 205 74 74 74 ================================================ FILE: graphics/interface/dex_caught_pokeball.pal ================================================ JASC-PAL 0100 16 123 156 131 238 238 238 0 0 0 213 213 189 172 164 123 255 131 123 238 49 0 222 49 16 197 49 41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/interface/pokemon_types.pal ================================================ JASC-PAL 0100 16 123 156 131 238 49 0 246 131 49 255 180 16 222 230 49 123 205 82 156 222 222 106 148 246 164 65 164 172 172 123 222 222 197 189 164 57 255 90 139 82 123 139 65 65 65 255 255 255 ================================================ FILE: graphics/interface/red_arrow.pal ================================================ JASC-PAL 0100 16 115 164 197 255 82 0 131 32 0 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/interface/save_failed_screen.pal ================================================ JASC-PAL 0100 16 16 115 230 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 0 0 0 74 205 238 49 164 238 0 90 131 24 98 197 16 115 230 ================================================ FILE: graphics/interface/std_menu.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/interface/text_pp.pal ================================================ JASC-PAL 0100 16 238 222 0 255 246 139 255 148 0 255 238 115 238 0 0 246 222 156 32 32 32 222 222 222 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/intro/copyright.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 32 24 57 57 49 82 82 82 106 106 106 131 131 139 156 156 164 180 180 197 205 205 222 230 230 255 255 255 ================================================ FILE: graphics/intro/game_freak/bg.pal ================================================ JASC-PAL 0100 16 0 0 0 24 41 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 82 82 180 180 180 255 255 255 ================================================ FILE: graphics/intro/game_freak/sparkles.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 32 0 0 74 0 0 115 24 24 123 49 49 139 82 82 156 106 106 172 139 139 189 164 164 205 197 197 222 222 222 238 255 255 255 0 0 0 0 0 0 ================================================ FILE: graphics/intro/gengar.pal ================================================ JASC-PAL 0100 16 197 222 205 255 255 255 222 222 222 123 123 123 255 0 255 255 0 255 255 0 255 65 41 74 255 180 123 238 98 74 205 57 32 197 131 180 164 98 148 131 65 123 90 57 90 16 16 16 ================================================ FILE: graphics/intro/nidorino.pal ================================================ JASC-PAL 0100 16 197 222 205 255 106 82 222 65 41 180 24 0 57 238 189 82 205 156 0 164 115 255 255 255 255 0 255 222 180 205 189 131 189 139 90 148 106 57 98 205 205 222 131 131 131 16 16 16 ================================================ FILE: graphics/intro/scene_2/bg.pal ================================================ JASC-PAL 0100 48 0 0 0 131 238 115 82 189 74 57 164 57 115 213 98 16 123 16 164 255 131 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 148 0 164 222 98 0 0 0 82 98 115 98 189 123 139 156 172 65 139 98 238 246 246 106 172 57 189 189 213 148 213 82 106 180 41 164 131 41 115 98 49 82 74 57 222 222 230 32 65 90 24 115 65 0 0 0 156 230 156 131 205 148 106 180 131 65 139 98 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/intro/scene_2/nidorino_close.pal ================================================ JASC-PAL 0100 16 255 123 41 65 148 90 49 115 74 106 57 98 49 115 98 82 205 156 49 164 115 255 255 255 106 189 115 90 41 82 222 180 205 189 131 189 139 90 148 205 205 222 131 131 131 16 16 16 ================================================ FILE: graphics/intro/scene_3/bg.pal ================================================ JASC-PAL 0100 32 0 0 0 82 98 115 98 189 123 139 156 172 65 139 98 238 246 246 106 172 57 189 189 213 148 213 82 106 180 41 164 131 41 115 98 49 82 74 57 222 222 230 32 65 90 24 115 65 0 0 0 164 238 139 57 148 57 131 213 115 156 230 156 131 205 148 106 180 131 65 139 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 ================================================ FILE: graphics/item_menu/bag_window_pal.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 0 0 0 0 0 0 0 0 0 255 156 148 255 255 255 189 90 82 ================================================ FILE: graphics/item_menu/bg_female.pal ================================================ JASC-PAL 0100 16 0 65 90 255 0 255 41 57 82 213 139 115 255 0 255 255 0 255 255 172 148 246 205 115 238 230 172 255 255 205 222 139 74 148 148 148 238 230 172 106 106 106 213 180 82 205 65 0 ================================================ FILE: graphics/items/icon_palettes/acro_bike.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 164 90 57 246 246 246 172 189 172 98 98 98 197 180 65 230 164 123 106 57 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/aguav_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 213 74 106 189 74 82 148 65 74 98 74 139 238 74 230 238 106 189 213 82 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/amulet_coin.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 246 255 205 32 180 156 41 230 180 16 255 238 65 205 180 32 246 246 180 41 82 41 115 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/antidote.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 205 205 205 156 156 156 255 238 98 255 180 41 255 213 74 246 197 57 255 255 180 90 90 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/apicot_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 148 172 230 189 222 106 238 238 123 57 74 131 139 180 74 106 131 189 82 106 164 115 156 49 197 213 238 90 131 32 123 98 24 205 205 98 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/aspear_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 205 180 74 246 230 82 255 255 106 131 148 131 172 197 180 230 213 90 131 115 65 180 222 205 0 0 0 ================================================ FILE: graphics/items/icon_palettes/aurora_ticket.pal ================================================ JASC-PAL 0100 16 164 164 123 49 49 49 238 238 123 65 205 238 57 156 222 90 74 164 57 57 82 98 238 246 180 255 255 57 123 189 123 148 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/awakening.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 205 205 205 156 156 156 131 238 255 74 180 197 106 213 230 90 197 213 213 255 255 90 90 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/bead_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 106 131 131 164 189 238 156 90 230 98 82 246 213 123 172 205 230 65 98 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/belue_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 156 123 230 123 90 197 156 222 115 205 172 255 238 230 172 189 180 123 82 156 49 49 115 32 82 57 156 172 156 106 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/berry_juice.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 189 131 205 222 131 172 189 98 238 189 115 164 148 90 131 148 57 230 213 156 98 82 32 90 106 16 139 123 65 205 131 74 238 255 255 230 255 213 180 213 164 ================================================ FILE: graphics/items/icon_palettes/berry_pouch.pal ================================================ JASC-PAL 0100 16 164 222 106 49 49 49 98 106 98 238 213 82 222 115 57 246 246 246 172 156 65 255 205 57 57 98 0 90 82 57 139 106 57 197 172 82 246 238 139 230 172 57 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/bicycle.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 180 98 98 246 246 246 172 189 172 98 98 98 197 180 65 246 172 172 115 65 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/bike_voucher.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 205 49 230 238 238 238 156 156 238 238 82 156 164 164 172 156 156 82 90 90 180 189 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/black_flute.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 115 115 115 49 49 49 148 148 148 82 82 82 222 222 98 222 222 139 238 238 189 180 180 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/black_type_enhancing_item.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 205 205 74 65 74 98 90 98 131 123 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/blue_flute.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 139 172 246 74 106 172 172 205 255 106 139 222 205 74 65 205 115 106 222 164 148 164 74 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/blue_orb.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 106 115 230 156 156 222 74 82 197 57 65 148 205 205 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/blue_scarf.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 90 90 197 131 131 246 82 82 148 106 106 213 180 172 255 123 123 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/blue_shard.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 172 180 255 115 90 197 32 8 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/bluk_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 57 65 98 180 115 238 115 82 189 230 148 255 57 65 123 131 90 205 123 205 65 65 156 65 65 115 65 0 0 0 ================================================ FILE: graphics/items/icon_palettes/bright_powder.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 131 172 131 74 115 74 57 98 57 156 213 156 213 255 213 172 230 172 246 255 246 131 189 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/burn_heal.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 205 205 205 156 156 156 139 246 139 82 189 82 115 222 115 106 213 106 222 255 222 90 90 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/calcium.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 246 148 90 57 213 131 74 255 205 164 180 106 49 189 148 41 255 197 115 197 222 197 230 246 230 172 197 172 246 65 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/carbos.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 246 148 90 57 90 189 189 164 246 246 65 139 139 189 148 41 255 197 115 197 222 197 230 246 230 172 197 172 41 164 246 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/card_key.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 90 74 74 222 230 230 230 106 106 189 197 197 156 164 164 139 123 90 230 246 246 246 156 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/charcoal.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 98 98 98 139 139 139 189 189 189 230 230 230 255 255 255 65 65 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/cheri_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 164 230 115 238 98 82 205 90 65 255 222 189 123 189 74 213 246 123 41 106 8 131 65 49 255 156 139 222 106 82 189 74 49 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/chesto_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 115 230 98 90 172 205 148 255 57 65 123 238 213 106 172 172 106 123 90 74 131 90 205 197 180 106 ================================================ FILE: graphics/items/icon_palettes/choice_band.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 180 180 197 238 238 255 98 98 106 213 213 238 222 222 238 115 115 197 222 115 115 156 156 238 82 82 164 180 180 255 246 246 255 230 139 139 246 205 205 222 90 90 ================================================ FILE: graphics/items/icon_palettes/cleanse_tag.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 115 115 82 82 82 255 255 255 222 222 222 180 180 180 148 148 148 164 57 57 189 82 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/coin_case.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 90 90 172 57 57 123 16 16 65 65 65 123 123 123 238 238 123 197 172 57 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/contest_pass.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 230 106 230 98 74 222 222 255 189 189 222 189 180 106 197 98 74 148 148 180 230 172 139 222 213 139 238 238 246 246 238 156 222 123 98 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/cornn_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 230 164 230 156 115 82 123 106 164 189 139 213 98 82 131 82 65 106 156 148 98 98 180 82 49 148 82 123 213 82 49 98 82 ================================================ FILE: graphics/items/icon_palettes/dark_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 205 230 230 189 213 213 164 205 205 139 189 197 123 180 180 98 164 172 82 156 164 123 123 148 123 123 123 98 98 123 255 255 255 238 246 246 82 82 82 ================================================ FILE: graphics/items/icon_palettes/deep_sea_scale.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 189 230 255 246 255 255 222 255 238 164 213 255 197 246 255 238 255 180 82 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/deep_sea_tooth.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 197 255 246 238 255 230 230 255 172 172 230 246 246 230 222 222 205 230 230 164 106 115 172 197 197 131 131 123 65 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/devon_goods.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 123 139 123 246 246 246 230 230 230 189 205 189 164 180 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/devon_scope.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 197 238 255 156 197 213 106 148 164 65 115 139 255 238 139 197 156 74 205 230 156 98 98 98 115 172 65 148 148 148 255 255 255 74 74 74 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/dire_hit.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 189 90 180 131 49 255 213 131 255 255 255 164 148 148 238 213 189 123 57 8 255 230 205 205 148 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/dive_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 41 115 213 65 139 230 90 164 255 139 205 255 148 238 246 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/items/icon_palettes/dragon_fang.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 238 230 180 172 164 189 164 156 131 106 98 230 205 197 255 255 255 222 213 205 148 139 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/dragon_scale.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 148 213 238 172 238 255 106 172 205 65 123 156 156 222 255 172 238 222 213 238 189 246 246 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/dragon_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 205 230 255 180 213 255 156 197 255 139 189 255 172 180 213 213 180 172 255 180 131 123 123 148 123 123 123 98 98 123 255 255 255 230 246 255 82 82 82 ================================================ FILE: graphics/items/icon_palettes/dream_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 197 255 246 172 238 205 156 222 172 123 189 148 98 164 123 74 139 98 49 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/durin_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 115 180 65 197 246 156 57 115 16 164 230 98 197 172 90 74 156 49 139 106 41 49 90 24 246 205 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/electric_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 255 255 189 255 238 156 255 230 123 255 222 90 255 205 57 255 197 24 255 197 0 123 123 148 123 123 123 98 98 123 255 255 255 255 255 222 82 82 82 ================================================ FILE: graphics/items/icon_palettes/elixir.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 238 164 255 189 156 230 164 131 205 205 131 180 106 65 164 164 90 246 246 164 255 222 213 106 49 65 197 131 115 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/energy_powder.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 246 238 164 164 148 148 82 197 115 115 222 222 156 238 238 189 115 65 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/energy_root.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 205 131 213 164 90 255 230 164 139 90 16 205 156 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/enigma_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 246 230 74 74 74 230 222 197 205 189 164 131 131 131 180 180 180 180 164 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/eon_ticket.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 246 246 65 139 156 82 205 205 139 205 238 139 189 98 90 156 49 213 180 139 164 115 57 246 115 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/escape_rope.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 148 123 41 189 164 82 123 98 16 98 74 8 213 82 49 222 222 230 189 189 197 156 156 164 172 41 8 222 197 115 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/ether.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 213 230 230 222 172 230 189 139 197 164 197 197 131 82 139 123 156 164 230 255 255 246 213 255 74 41 98 156 106 164 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/everstone.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 148 172 189 180 205 213 222 246 255 106 139 156 205 230 238 65 98 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/exp_share.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 131 148 131 172 189 172 65 82 65 255 255 148 222 222 115 230 230 255 197 197 222 164 164 189 189 205 189 106 123 106 131 131 156 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/fab_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 246 255 222 180 197 246 213 222 255 255 255 172 115 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/fame_checker.pal ================================================ JASC-PAL 0100 16 230 197 57 49 49 49 98 106 98 238 123 41 74 74 57 98 156 148 115 205 189 0 0 0 0 0 0 255 172 65 197 197 205 213 246 246 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/fighting_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 246 213 189 238 197 156 238 180 123 238 164 90 230 148 57 230 131 24 230 115 0 123 123 148 123 123 123 98 98 123 255 255 255 255 238 230 82 82 82 ================================================ FILE: graphics/items/icon_palettes/figy_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 255 255 213 246 238 139 230 213 148 205 189 123 238 148 49 189 106 65 213 230 123 139 148 74 0 0 0 156 123 57 ================================================ FILE: graphics/items/icon_palettes/fire_stone.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 238 49 246 148 49 222 205 16 222 115 16 255 255 238 197 197 106 230 230 123 123 123 32 255 238 156 255 255 139 164 164 74 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/fire_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 255 230 189 255 222 156 255 205 131 255 197 98 255 189 65 255 180 41 238 172 32 123 123 148 123 123 123 98 98 123 255 255 255 255 238 222 82 82 82 ================================================ FILE: graphics/items/icon_palettes/fluffy_tail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 246 139 222 222 90 197 139 82 238 172 115 255 222 164 131 74 16 246 230 246 180 148 172 139 98 131 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/flying_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 213 246 255 189 238 255 172 238 255 156 238 255 172 222 238 180 205 222 197 197 197 123 123 148 123 123 123 98 98 123 255 255 255 246 246 255 82 82 82 ================================================ FILE: graphics/items/icon_palettes/focus_band.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 189 82 82 238 123 123 139 74 74 205 98 98 238 238 189 213 213 164 189 189 131 255 222 123 230 172 49 197 139 16 255 164 172 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/fresh_water.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 172 189 246 213 255 255 197 213 213 156 172 172 98 115 172 65 82 139 65 131 49 115 180 98 148 164 222 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/full_heal.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 205 238 230 0 197 189 0 255 246 65 222 213 0 180 172 0 213 115 32 255 123 0 123 123 0 246 255 65 156 172 0 222 238 0 172 189 0 197 213 0 ================================================ FILE: graphics/items/icon_palettes/full_restore.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 156 230 65 172 255 148 123 197 32 90 123 49 213 213 164 148 148 98 255 255 213 255 255 230 180 180 131 238 238 180 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/ganlon_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 156 148 205 222 213 131 197 189 246 115 106 164 74 65 115 164 148 90 213 213 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/ghost_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 238 222 246 230 205 246 230 189 246 222 172 246 213 148 246 197 123 238 180 98 222 123 123 148 123 123 123 98 98 123 255 255 255 255 238 255 82 82 82 ================================================ FILE: graphics/items/icon_palettes/glitter_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 238 148 238 238 115 230 205 106 246 164 115 139 123 90 164 148 115 222 222 106 230 156 106 197 189 148 255 255 238 180 180 65 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/go_goggles.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 230 139 255 255 246 222 180 49 222 131 0 139 139 139 90 90 90 189 189 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/gold_teeth.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 230 57 222 106 106 255 189 189 189 90 90 246 172 172 255 255 230 148 148 8 197 197 57 148 49 49 123 123 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/good_rod.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 246 98 180 205 65 82 82 139 123 123 180 115 139 41 197 222 230 156 180 189 106 131 139 205 90 57 246 131 98 255 255 255 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/grass_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 213 246 230 197 246 213 180 246 205 156 238 197 139 238 180 123 238 172 106 238 164 123 123 148 123 123 123 98 98 123 255 255 255 238 246 246 82 82 82 ================================================ FILE: graphics/items/icon_palettes/great_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 49 65 148 0 0 0 49 82 213 57 148 255 57 213 255 189 49 49 246 74 74 255 172 172 255 0 255 ================================================ FILE: graphics/items/icon_palettes/green_scarf.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 115 197 115 156 238 156 82 148 82 123 213 123 180 255 180 139 230 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/green_shard.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 148 246 139 90 197 115 8 90 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/grepa_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 230 57 222 189 74 238 197 74 156 139 74 255 255 115 90 164 32 139 213 32 0 0 0 49 98 82 ================================================ FILE: graphics/items/icon_palettes/ground_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 255 255 189 255 255 156 255 255 123 255 255 90 246 238 90 230 213 82 222 197 65 123 123 148 123 123 123 98 98 123 255 255 255 255 255 222 82 82 82 ================================================ FILE: graphics/items/icon_palettes/guard_spec.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 106 213 115 74 164 74 172 238 156 255 255 255 148 156 148 213 230 213 32 115 32 222 255 230 90 172 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/harbor_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 106 148 172 139 205 222 238 255 255 246 246 197 205 238 238 230 230 180 115 106 65 139 131 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/hard_stone.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 246 246 123 115 115 156 148 148 90 82 82 205 197 205 82 74 74 238 230 230 98 90 90 74 65 65 180 172 172 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/heal_powder.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 230 205 238 238 98 57 123 57 197 197 98 90 172 90 139 205 139 115 115 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/heart_scale.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 205 205 197 230 197 205 205 238 205 238 238 238 238 238 123 123 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/hoenn_fossil.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 189 180 82 74 65 0 139 131 32 98 90 0 222 213 115 139 90 0 0 0 0 213 213 131 98 98 41 164 164 82 123 123 41 246 246 164 164 123 41 0 0 0 ================================================ FILE: graphics/items/icon_palettes/hondew_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 255 238 74 205 197 74 148 222 74 115 197 74 82 156 74 74 98 74 197 255 74 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/hp_up.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 246 148 90 57 90 189 90 164 246 164 65 139 65 189 148 41 255 197 115 197 222 197 230 246 230 172 197 172 106 164 238 74 131 205 148 205 255 0 0 0 ================================================ FILE: graphics/items/icon_palettes/hyper_potion.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 131 205 197 222 238 255 255 255 164 189 205 255 98 172 131 156 172 230 255 255 255 197 255 82 106 123 197 57 131 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/iapapa_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 255 255 213 255 238 123 238 205 148 213 180 123 238 148 49 205 115 65 172 115 49 0 0 0 0 0 0 0 0 0 115 123 49 ================================================ FILE: graphics/items/icon_palettes/ice_heal.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 205 205 205 156 156 156 255 189 180 246 106 106 246 164 164 246 139 139 255 222 222 90 90 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/ice_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 230 246 255 213 246 255 197 246 255 172 238 255 156 238 255 139 230 246 131 213 238 123 123 148 123 123 123 98 98 123 255 255 255 255 255 255 82 82 82 ================================================ FILE: graphics/items/icon_palettes/iron.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 246 148 90 57 189 189 90 246 246 164 139 139 65 189 148 41 255 197 115 197 222 197 230 246 230 172 197 172 49 164 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/itemfinder.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 238 106 255 255 255 74 74 74 213 98 98 98 172 238 123 74 74 255 189 189 65 139 205 139 213 255 189 189 189 106 106 106 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/kanto_fossil.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 164 123 0 189 148 41 197 156 57 222 189 106 123 82 0 106 65 0 65 49 0 238 222 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/kelpsy_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 98 230 139 213 255 115 172 255 90 82 98 98 82 156 197 197 123 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/key.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 106 106 106 74 65 74 255 255 255 164 164 164 156 156 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 164 90 90 213 90 90 ================================================ FILE: graphics/items/icon_palettes/kings_rock.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 213 90 246 230 123 197 180 57 164 148 32 131 115 32 74 57 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/lansat_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 189 164 222 139 106 139 205 164 197 106 74 49 115 74 246 197 172 98 164 123 131 57 32 164 230 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/lava_cookie_and_letter.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 238 255 205 197 230 0 0 0 205 139 65 230 180 24 180 98 41 57 49 16 98 98 57 172 172 131 115 65 24 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/lax_incense.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 172 16 172 115 32 255 222 156 222 189 123 156 98 8 205 148 16 255 246 189 246 197 65 49 98 49 197 230 197 98 98 49 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/leaf_stone.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 106 148 106 90 131 82 139 180 139 156 172 123 123 139 90 90 106 57 74 90 41 57 98 57 197 213 164 123 164 123 74 115 65 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/leftovers.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 82 82 156 139 82 123 148 32 180 90 90 123 74 74 255 255 255 255 139 106 238 255 213 205 230 172 246 98 98 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/lemonade.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 230 255 205 205 230 164 164 189 238 238 164 197 197 131 255 255 205 255 197 156 222 164 123 255 222 180 255 148 115 131 213 180 213 65 65 238 98 98 255 164 172 ================================================ FILE: graphics/items/icon_palettes/leppa_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 180 164 98 255 148 49 205 74 49 230 115 49 238 230 98 90 213 82 65 156 65 49 115 65 156 82 57 255 222 49 ================================================ FILE: graphics/items/icon_palettes/liechi_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 246 255 172 74 172 82 16 246 238 197 164 156 131 213 205 148 213 115 49 255 230 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/light_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 156 230 222 41 164 164 16 255 255 255 90 90 0 222 222 139 189 189 0 131 131 0 255 255 197 74 74 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/link_bracelet.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 98 82 205 156 131 255 197 197 255 238 238 255 222 222 255 74 74 180 106 106 222 172 205 246 148 180 222 115 148 189 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/lucky_egg.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 238 246 205 213 222 164 172 180 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/lucky_punch.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 115 57 255 222 106 255 172 115 172 90 49 115 65 16 255 255 255 139 139 139 230 230 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/lum_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 222 74 115 197 74 82 164 74 74 98 74 164 255 74 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/luxury_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 156 74 57 180 82 57 222 90 57 255 148 57 255 213 57 230 180 106 255 255 148 213 156 49 255 238 82 ================================================ FILE: graphics/items/icon_palettes/mach_bike.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 106 123 189 172 189 172 246 255 246 98 98 98 172 172 74 156 164 156 164 180 255 139 49 0 57 74 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/macho_brace.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 230 238 74 131 82 106 164 115 139 197 148 180 238 189 197 205 213 156 164 172 213 222 230 74 90 98 238 238 246 255 255 222 156 156 49 57 82 65 49 106 57 ================================================ FILE: graphics/items/icon_palettes/magma_emblem.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 164 8 57 222 82 82 230 115 82 238 148 82 246 180 82 255 213 82 255 238 106 255 255 180 0 0 0 ================================================ FILE: graphics/items/icon_palettes/magnet.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 156 148 115 57 57 148 156 255 57 57 115 90 90 180 148 164 148 74 90 74 172 189 172 172 82 82 255 189 189 197 197 255 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/mago_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 255 230 156 255 148 131 255 189 156 230 123 115 172 90 65 255 246 164 222 213 115 197 172 98 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/magost_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 189 156 230 131 98 172 90 65 255 164 139 49 156 82 98 205 82 49 98 82 255 230 156 0 0 0 ================================================ FILE: graphics/items/icon_palettes/master_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 106 49 197 115 49 205 180 57 246 205 65 255 0 0 0 180 0 148 230 32 197 255 197 255 0 0 0 ================================================ FILE: graphics/items/icon_palettes/max_elixir.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 246 180 156 255 255 131 230 230 238 238 156 65 180 180 213 213 90 255 255 205 213 255 255 65 106 106 115 197 197 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/max_ether.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 238 255 189 255 156 164 230 131 205 205 222 106 180 65 164 164 180 246 246 255 222 255 213 49 106 65 131 197 115 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/max_potion.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 65 156 230 148 172 255 32 123 197 49 90 123 180 180 197 115 115 131 230 230 246 246 255 246 148 148 164 205 205 222 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/max_repel.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 213 230 230 180 197 197 123 139 139 0 0 0 0 0 0 213 205 189 139 131 115 0 0 0 0 0 0 0 0 0 255 246 230 189 172 106 246 230 164 ================================================ FILE: graphics/items/icon_palettes/mech_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 246 213 222 213 131 139 131 172 180 172 90 98 90 172 172 106 222 222 180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/mental_herb.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 255 255 148 230 230 123 205 205 164 246 246 172 255 255 156 238 238 57 148 148 106 197 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/metal_coat.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 238 238 180 197 197 82 106 106 255 255 255 0 0 0 0 0 0 0 0 0 106 131 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/metal_powder.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 213 213 213 156 156 156 90 90 90 238 238 238 205 148 213 156 106 164 238 197 246 115 65 123 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/meteorite.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 131 82 82 90 57 57 205 131 123 180 139 172 213 156 205 230 189 205 156 106 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/miracle_seed.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 238 222 222 123 238 238 90 197 197 49 131 131 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/moomoo_milk.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 246 230 238 238 213 230 230 180 180 180 115 213 148 213 255 255 255 238 164 238 156 82 156 255 189 255 131 131 57 180 106 180 123 49 139 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/moon_stone.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 230 213 172 197 180 131 156 139 90 115 98 222 246 230 106 131 115 74 98 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/mushroom.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 213 57 32 255 115 90 255 164 131 238 213 74 246 230 98 238 222 222 222 205 205 180 164 164 139 123 123 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/mystic_ticket.pal ================================================ JASC-PAL 0100 16 164 164 123 49 49 49 180 222 238 255 255 255 230 164 222 139 74 172 115 74 98 189 115 197 123 148 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/mystic_water.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 90 90 213 156 222 255 197 213 213 172 172 222 255 255 255 74 0 0 74 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/nanab_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 180 131 205 106 106 123 90 65 255 222 131 255 238 131 164 156 74 213 197 90 238 148 106 0 0 0 ================================================ FILE: graphics/items/icon_palettes/nest_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 82 123 57 57 98 57 98 148 65 123 197 57 180 246 57 255 0 255 246 246 156 172 172 74 230 230 131 ================================================ FILE: graphics/items/icon_palettes/net_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 74 106 123 65 65 65 74 123 139 74 180 197 57 230 238 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/items/icon_palettes/never_melt_ice.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 255 74 90 98 164 213 230 222 246 255 115 164 197 49 123 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/nomel_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 246 98 197 197 41 98 98 16 255 255 246 230 230 74 164 164 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/normal_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 238 238 238 230 230 238 230 230 230 222 222 222 213 213 213 205 205 205 197 197 197 123 123 148 123 123 123 98 98 123 255 255 255 255 255 255 82 82 82 ================================================ FILE: graphics/items/icon_palettes/nugget.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 172 74 255 205 74 255 230 98 255 238 139 255 255 255 156 115 16 131 90 0 197 156 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/oaks_parcel.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 222 131 205 180 90 148 123 32 115 90 16 115 115 24 197 197 82 164 164 49 205 82 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/old_amber.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 197 123 0 230 148 0 246 180 0 246 246 180 156 82 0 180 115 0 255 255 255 255 255 106 238 197 131 255 197 49 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/old_key.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 222 197 205 189 164 148 131 106 98 82 57 255 246 246 0 0 0 189 230 197 164 197 164 106 139 106 57 90 57 213 255 246 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/old_rod.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 156 106 8 197 156 65 115 65 16 230 189 106 197 222 230 156 180 189 106 131 139 205 90 57 246 131 98 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/old_sea_map.pal ================================================ JASC-PAL 0100 16 98 197 98 49 49 49 213 180 139 222 205 164 197 172 123 148 131 106 180 148 106 197 123 115 180 90 82 115 90 57 0 0 0 0 0 0 65 49 24 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/oran_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 164 246 106 106 189 90 213 255 82 82 131 189 197 255 230 238 255 156 164 189 82 123 205 0 0 0 ================================================ FILE: graphics/items/icon_palettes/orange_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 205 139 164 222 131 246 246 164 123 98 82 189 164 115 172 148 115 255 255 238 164 164 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/pamtre_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 139 123 189 115 180 98 238 222 180 90 74 139 115 98 164 180 164 230 156 213 139 49 115 49 115 106 74 205 189 148 164 148 106 82 74 41 65 49 115 0 0 0 ================================================ FILE: graphics/items/icon_palettes/paralyze_heal.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 205 205 205 156 156 156 255 255 148 197 197 57 238 238 98 222 222 90 255 255 213 90 90 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/pearl.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 197 197 180 230 222 189 189 189 238 238 189 255 255 255 230 230 230 148 164 164 74 74 74 213 172 172 156 205 197 164 164 164 123 139 139 255 255 205 0 0 0 ================================================ FILE: graphics/items/icon_palettes/pecha_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 197 156 238 148 115 172 90 65 255 246 213 98 205 82 90 189 65 49 115 65 255 230 156 255 180 115 ================================================ FILE: graphics/items/icon_palettes/persim_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 205 156 230 156 115 189 115 82 98 106 65 115 222 82 74 172 65 49 98 65 255 238 164 255 189 131 ================================================ FILE: graphics/items/icon_palettes/petaya_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 164 123 139 74 49 197 123 82 255 213 197 213 189 148 197 238 139 164 139 98 98 49 16 131 189 106 106 164 82 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/pinap_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 189 180 98 246 230 74 222 205 82 205 180 82 148 139 90 123 222 90 82 189 90 74 106 65 255 246 148 106 106 65 ================================================ FILE: graphics/items/icon_palettes/pink_scarf.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 213 131 156 255 172 205 164 98 131 230 139 180 255 197 230 246 156 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/poison_barb.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 197 148 197 238 189 238 98 98 98 213 213 213 255 230 255 148 98 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/poison_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 255 222 197 255 205 172 255 189 148 255 180 123 230 148 156 205 123 189 180 98 222 123 123 148 123 123 123 98 98 123 255 255 255 255 238 230 82 82 82 ================================================ FILE: graphics/items/icon_palettes/poke_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 156 74 57 180 82 57 222 90 57 255 148 57 255 213 57 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/items/icon_palettes/poke_doll.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 98 65 0 255 213 222 246 180 213 213 148 180 164 98 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/poke_flute.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 213 82 57 164 32 8 238 238 246 123 123 131 197 172 49 238 213 98 255 246 131 246 115 90 205 205 213 189 57 32 148 98 41 0 0 0 0 0 0 255 255 255 ================================================ FILE: graphics/items/icon_palettes/pokeblock_case.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 197 115 106 230 222 246 197 180 205 189 230 255 82 123 164 246 197 189 131 230 148 139 180 238 123 106 131 123 74 65 230 156 148 49 90 131 255 255 255 238 180 172 ================================================ FILE: graphics/items/icon_palettes/pomeg_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 148 49 205 74 49 131 57 49 230 115 49 255 222 82 0 0 0 90 180 82 0 0 0 49 98 82 ================================================ FILE: graphics/items/icon_palettes/potion.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 164 131 205 197 238 222 255 255 255 164 205 189 131 98 172 131 172 156 230 255 255 230 197 255 82 123 106 90 57 131 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/powder_jar.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 139 131 49 213 172 49 255 238 74 131 98 49 230 205 57 115 246 115 74 189 82 98 74 49 255 180 49 238 189 49 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/pp_max.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 246 246 90 148 57 255 230 90 255 255 230 139 139 8 148 189 41 197 255 115 222 197 197 246 230 230 197 172 172 197 123 197 172 82 172 238 148 238 230 205 74 ================================================ FILE: graphics/items/icon_palettes/pp_up.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 246 148 90 57 189 90 189 246 164 246 139 65 139 189 148 41 255 197 115 197 222 197 230 246 230 172 197 172 98 189 189 74 164 164 49 139 139 0 0 0 ================================================ FILE: graphics/items/icon_palettes/protein.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 246 148 90 57 197 98 98 246 164 164 139 65 65 189 148 41 255 197 115 197 222 197 230 246 230 172 197 172 246 164 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/psychic_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 255 230 230 255 222 213 255 213 205 255 197 197 255 189 180 255 180 172 255 172 164 123 123 148 123 123 123 98 98 123 255 255 255 255 246 246 82 82 82 ================================================ FILE: graphics/items/icon_palettes/qualot_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 213 131 238 156 115 246 189 123 255 246 131 0 0 0 156 139 74 189 180 98 222 213 115 238 246 123 ================================================ FILE: graphics/items/icon_palettes/question_mark.pal ================================================ JASC-PAL 0100 16 115 164 98 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/quick_claw.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 197 197 197 255 255 255 222 197 106 255 222 213 205 156 82 172 123 57 123 123 123 246 246 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/rabuta_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 139 213 115 246 238 205 197 189 131 148 139 82 49 98 24 65 139 41 115 189 90 82 82 32 172 238 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/rainbow_pass.pal ================================================ JASC-PAL 0100 16 164 164 123 49 49 49 65 82 180 74 148 255 238 156 98 255 246 90 74 115 205 205 115 148 139 230 255 98 205 255 255 189 164 0 0 0 255 255 197 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/rare_candy.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 156 189 255 98 115 213 123 148 238 41 57 156 82 98 197 213 238 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/rawst_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 98 90 123 131 148 172 148 213 213 139 180 213 148 230 230 90 213 82 65 156 65 49 106 65 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/razz_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 172 41 222 90 49 246 139 41 156 65 41 131 238 65 65 172 65 41 90 57 255 230 65 0 0 0 ================================================ FILE: graphics/items/icon_palettes/red_flute.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 246 172 139 172 106 74 255 205 172 222 139 106 65 74 205 106 115 205 148 164 222 65 74 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/red_orb.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 115 106 222 156 156 197 82 74 148 65 57 255 205 205 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/red_scarf.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 189 82 82 238 123 123 139 74 74 205 98 98 255 164 172 222 115 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/red_shard.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 148 139 197 90 115 90 8 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/repeat_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 156 74 57 180 82 57 222 90 57 255 148 57 255 213 57 246 246 139 180 164 57 222 205 57 246 238 57 ================================================ FILE: graphics/items/icon_palettes/repel.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 213 230 230 180 197 197 123 139 139 0 0 0 0 0 0 230 90 57 189 49 16 0 0 0 0 0 0 0 0 0 139 230 139 49 123 49 82 180 82 ================================================ FILE: graphics/items/icon_palettes/retro_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 139 74 123 205 65 98 156 230 246 172 172 205 148 90 172 98 65 65 98 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/return_to_field_arrow.pal ================================================ JASC-PAL 0100 16 255 255 255 57 57 57 172 172 189 205 205 222 255 255 255 131 131 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/revival_herb.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 180 230 115 115 164 82 222 197 123 65 82 41 148 148 115 49 123 16 65 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/revive.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 246 197 230 230 123 164 164 57 255 255 255 74 74 0 222 238 238 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/rock_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 246 238 222 238 230 197 238 222 172 230 213 148 222 197 115 222 189 90 213 180 65 123 123 148 123 123 123 98 98 123 255 255 255 255 255 255 82 82 82 ================================================ FILE: graphics/items/icon_palettes/ruby.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 123 49 65 197 82 90 222 123 123 238 148 148 255 172 172 255 197 197 255 222 222 255 238 238 230 156 156 255 205 205 139 65 82 255 213 213 255 180 180 164 74 82 ================================================ FILE: graphics/items/icon_palettes/sacred_ash.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 222 106 172 172 41 98 98 24 246 246 164 156 156 156 115 115 115 205 205 205 82 82 82 222 222 222 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/safari_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 74 98 0 98 123 24 156 180 82 115 98 0 197 180 57 222 213 123 16 90 49 74 148 98 106 180 139 ================================================ FILE: graphics/items/icon_palettes/salac_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 123 189 115 49 115 41 164 213 131 213 246 180 74 139 74 230 246 123 205 222 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/sapphire.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 65 49 123 90 82 197 123 123 222 148 148 238 172 172 255 197 197 255 222 222 255 238 238 255 156 156 230 205 205 255 82 65 139 213 213 255 180 180 255 82 74 164 ================================================ FILE: graphics/items/icon_palettes/scanner.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 148 0 0 230 0 82 106 164 156 180 238 197 222 255 98 90 41 222 213 65 41 65 115 0 0 0 0 0 0 0 0 0 0 0 0 82 82 106 238 238 255 ================================================ FILE: graphics/items/icon_palettes/scope_lens.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 164 180 197 106 123 139 213 90 74 123 156 213 197 213 230 65 82 98 82 115 172 148 164 180 246 238 82 238 197 74 148 115 41 238 246 255 115 82 8 0 0 0 ================================================ FILE: graphics/items/icon_palettes/sea_incense.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 98 164 246 74 115 197 197 222 246 172 197 222 49 90 156 131 197 255 180 164 115 164 148 98 115 98 49 238 230 197 74 98 115 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/secret_key.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 148 148 49 115 106 16 255 255 238 189 197 41 197 197 98 90 90 90 205 213 205 156 164 156 238 246 238 115 115 115 0 0 0 255 115 115 197 74 74 230 90 90 ================================================ FILE: graphics/items/icon_palettes/shadow_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 197 172 164 98 74 65 74 57 57 255 98 98 255 238 238 197 82 82 139 115 106 156 131 123 156 164 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/sharp_beak.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 222 90 213 172 57 139 98 32 255 246 189 255 230 156 106 65 24 189 148 57 49 74 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/shell.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 213 213 213 246 238 205 205 197 255 255 222 255 255 255 230 230 230 164 180 180 74 74 74 213 172 172 156 205 197 164 164 164 123 139 139 255 255 205 0 0 0 ================================================ FILE: graphics/items/icon_palettes/shoal_salt.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 238 205 131 131 131 131 197 164 82 205 205 205 238 238 238 115 90 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/silk_scarf.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 255 255 222 230 230 197 205 205 106 123 115 255 255 255 238 246 246 82 98 90 172 180 180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/silph_scope.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 246 139 139 106 164 222 189 65 65 255 189 189 148 205 255 74 98 156 197 213 197 139 164 139 65 90 65 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/silver_powder.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 139 213 139 115 115 115 106 189 106 156 156 156 197 197 197 65 115 65 238 238 238 213 213 213 189 230 189 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/sitrus_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 238 106 213 180 74 139 115 57 230 180 65 238 213 90 106 213 90 0 0 0 82 131 74 172 115 49 ================================================ FILE: graphics/items/icon_palettes/smoke_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 189 230 213 164 230 148 123 205 255 246 255 115 115 115 246 222 246 230 205 246 148 98 164 197 148 213 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/soda_pop.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 49 74 74 90 123 123 139 189 197 189 238 246 82 156 205 131 205 255 255 255 255 238 230 230 197 180 180 57 131 180 189 213 255 156 205 238 106 189 230 0 0 0 ================================================ FILE: graphics/items/icon_palettes/soft_sand.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 213 156 213 156 98 156 115 57 115 238 180 238 246 230 156 205 172 115 255 246 213 148 106 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/soot_sack.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 238 238 255 246 197 156 148 139 172 74 74 106 213 205 238 230 230 246 180 172 205 238 238 255 222 172 123 189 139 90 156 106 65 131 123 156 98 65 49 0 0 0 ================================================ FILE: graphics/items/icon_palettes/soothe_bell.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 230 230 230 82 82 82 123 123 123 164 164 164 205 205 205 213 115 106 131 49 49 164 90 82 255 189 189 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/soul_dew.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 65 90 180 98 123 213 205 222 255 222 197 246 172 148 213 41 65 156 222 238 238 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/spell_tag.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 148 148 82 82 82 255 255 255 205 205 205 156 156 156 148 148 148 197 98 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/spelon_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 123 115 255 230 156 205 90 82 172 90 74 255 197 115 255 189 172 230 106 98 131 65 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/ss_ticket.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 213 222 222 49 106 139 82 164 222 98 180 238 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/star.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 98 156 213 41 98 156 24 57 115 123 180 238 246 164 164 222 115 115 255 222 222 156 74 74 255 255 255 131 49 49 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/starf_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 164 230 106 123 189 65 213 255 197 98 148 213 238 222 65 238 90 65 82 148 57 222 172 57 189 238 156 65 106 41 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/steel_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 222 222 222 213 213 213 197 197 197 189 189 189 148 172 180 115 164 172 82 156 164 123 123 148 123 123 123 98 98 123 255 255 255 238 246 246 82 82 82 ================================================ FILE: graphics/items/icon_palettes/stick.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 123 189 8 180 213 74 74 148 0 32 98 0 197 213 180 230 230 197 180 180 139 98 98 57 255 255 246 205 238 98 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/sun_stone.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 197 98 41 255 172 115 131 74 41 230 115 57 255 238 205 246 131 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/super_potion.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 131 131 255 222 131 255 255 238 230 189 106 197 98 90 180 139 65 255 246 180 255 172 148 148 106 49 148 82 74 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/super_repel.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 213 230 230 180 197 197 123 139 139 0 0 0 0 0 0 213 189 189 139 115 115 0 0 0 0 0 0 0 0 0 246 246 255 148 148 172 205 205 230 ================================================ FILE: graphics/items/icon_palettes/super_rod.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 197 197 148 131 131 82 82 139 123 123 180 90 82 82 197 222 230 156 180 189 106 131 139 205 90 57 246 131 98 255 255 255 82 238 82 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/tamato_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 148 49 205 74 49 131 57 49 230 115 49 255 213 49 0 0 0 49 164 82 115 222 82 49 98 82 ================================================ FILE: graphics/items/icon_palettes/tea.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 180 172 156 238 230 230 131 115 106 205 255 156 246 230 222 197 180 156 131 255 32 98 82 65 205 189 172 148 230 24 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/teachy_tv.pal ================================================ JASC-PAL 0100 16 164 164 123 49 49 49 98 106 98 255 205 74 74 74 57 98 156 148 115 205 189 148 131 74 205 164 74 255 230 74 213 205 172 156 139 115 222 180 74 82 98 98 115 115 115 246 246 238 ================================================ FILE: graphics/items/icon_palettes/thick_club.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 238 205 189 197 164 156 156 131 213 213 172 131 131 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/thunder_stone.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 246 139 213 139 74 148 74 213 238 123 106 180 106 41 115 41 180 205 90 172 246 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/tm_case.pal ================================================ JASC-PAL 0100 16 32 148 57 49 49 49 74 74 82 123 148 131 180 205 238 246 230 41 82 98 123 230 189 41 90 115 98 82 148 197 180 148 41 0 0 0 106 98 41 205 230 246 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/town_map.pal ================================================ JASC-PAL 0100 16 164 222 106 49 49 49 148 98 41 238 139 41 57 90 139 246 230 41 90 82 74 148 131 156 205 222 238 156 164 189 197 180 41 131 123 41 238 246 255 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/tri_pass.pal ================================================ JASC-PAL 0100 16 164 164 123 49 49 49 57 98 189 82 156 255 57 148 65 74 172 65 41 172 106 98 205 255 106 222 255 41 197 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/tropic_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 246 172 172 238 139 106 172 74 246 172 131 197 123 82 238 222 139 230 156 115 90 131 74 156 222 123 230 246 189 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/twisted_spoon.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 255 106 131 131 230 246 246 156 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/ultra_ball.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 82 82 123 123 131 164 164 197 222 205 246 255 255 255 57 74 90 82 98 106 115 131 148 164 180 197 213 172 16 255 213 57 255 246 90 255 0 255 255 0 255 ================================================ FILE: graphics/items/icon_palettes/up_grade.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 213 213 180 131 131 106 238 255 213 98 98 74 255 246 222 172 172 148 238 238 197 230 189 189 230 148 0 238 238 213 197 197 197 131 131 131 255 222 0 164 213 164 ================================================ FILE: graphics/items/icon_palettes/vs_seeker.pal ================================================ JASC-PAL 0100 16 164 222 106 49 49 49 222 238 238 180 197 197 49 82 148 255 255 255 65 131 230 115 205 255 148 156 180 74 90 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/wailmer_pail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 180 180 213 139 139 197 90 90 148 246 246 238 222 222 213 189 189 180 222 222 255 131 131 123 57 57 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/water_stone.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 98 82 205 156 131 255 197 197 255 238 238 255 222 222 255 74 74 180 106 106 222 172 205 246 148 180 222 115 148 189 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/water_tm_hm.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 74 74 98 205 230 246 180 213 246 164 205 246 139 197 238 115 180 238 90 172 238 74 164 238 123 123 148 123 123 123 98 98 123 255 255 255 238 246 246 82 82 82 ================================================ FILE: graphics/items/icon_palettes/watmel_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 197 172 156 213 90 90 148 57 222 148 123 246 172 148 139 197 74 115 172 49 255 222 205 180 238 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/wave_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 148 222 246 98 131 230 238 255 255 255 246 230 238 222 172 123 156 246 65 98 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/wepear_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 222 74 115 197 74 90 164 74 74 98 74 180 246 98 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/white_flute.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 230 230 230 164 164 164 230 230 230 197 197 197 222 98 222 222 139 222 238 189 238 180 98 180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/white_herb.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 230 213 230 213 189 213 246 230 246 255 238 255 238 222 238 148 123 148 197 172 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/wiki_berry.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 115 230 98 90 172 205 164 255 57 65 123 131 90 205 90 213 82 65 156 65 74 98 65 0 0 0 ================================================ FILE: graphics/items/icon_palettes/wood_mail.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 222 205 148 213 148 106 172 131 74 255 246 222 148 106 49 230 205 197 189 123 82 238 172 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/x_accuracy.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 115 189 164 82 148 238 180 222 255 255 255 156 148 156 230 213 230 115 49 98 255 230 246 172 98 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/x_attack.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 230 131 123 164 74 74 238 156 172 255 255 255 156 148 148 230 213 213 131 49 49 255 230 222 197 98 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/x_defend.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 123 131 230 74 74 164 172 156 238 255 255 255 148 148 156 213 213 230 57 57 139 222 230 255 115 98 197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/x_special.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 205 205 106 156 156 74 230 230 172 255 255 255 156 156 148 230 230 213 106 106 32 255 255 222 164 164 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/x_speed.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 106 205 205 74 156 156 172 230 230 255 255 255 148 156 156 213 230 230 32 106 106 222 255 255 90 164 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/yellow_flute.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 255 255 230 230 115 139 139 74 238 238 172 205 205 90 74 205 65 115 205 106 164 222 148 74 172 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/yellow_scarf.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 197 197 74 238 238 115 148 148 41 213 213 82 255 255 139 230 230 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/yellow_shard.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 255 230 90 197 172 65 90 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/items/icon_palettes/zinc.pal ================================================ JASC-PAL 0100 16 180 180 180 49 49 49 246 255 246 148 90 57 189 131 49 238 205 106 123 106 0 189 148 41 255 197 115 197 222 197 230 246 230 172 197 172 131 222 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/mail/bead/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 65 90 123 98 123 156 213 230 238 238 255 255 139 189 164 255 148 131 213 106 90 164 156 189 255 197 82 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/dream/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 255 189 205 222 164 197 197 148 189 172 131 189 255 213 230 0 0 0 205 255 213 230 255 230 0 0 0 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/fab/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 238 205 222 255 230 238 213 230 238 238 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/glitter/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 255 255 172 255 238 123 255 238 0 255 41 41 255 238 230 255 189 41 238 180 0 0 0 0 0 0 0 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/harbor/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 24 172 255 255 255 148 115 205 255 74 172 255 16 57 230 0 0 0 0 0 0 0 0 0 0 0 0 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/mech/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 230 230 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 230 230 189 197 189 139 172 164 115 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/orange/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 246 213 148 238 180 74 205 139 65 189 246 222 148 222 197 131 189 164 255 255 148 189 180 123 139 123 65 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/retro/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 246 106 41 255 246 156 255 205 65 148 238 82 172 106 49 189 164 57 123 213 246 0 0 0 255 230 90 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/shadow/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 139 139 164 123 123 139 106 106 123 90 90 98 0 0 0 0 0 0 0 0 0 213 65 16 148 49 0 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/tropic/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 230 255 98 197 246 131 189 246 65 123 213 41 255 180 98 255 255 148 123 180 24 197 238 65 205 156 90 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/wave/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 0 172 246 65 90 156 106 131 197 197 222 255 82 156 197 230 246 255 0 0 0 0 0 0 0 0 0 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/mail/wood/palette.pal ================================================ JASC-PAL 0100 16 139 164 189 139 131 74 164 180 82 189 180 106 222 205 106 180 156 65 246 213 156 189 164 90 222 164 123 255 205 180 98 197 197 57 148 148 82 82 82 139 139 139 205 205 205 255 255 255 ================================================ FILE: graphics/main_menu/bg.pal ================================================ JASC-PAL 0100 16 139 148 255 255 255 255 49 57 82 90 98 115 8 8 16 148 156 172 205 222 238 180 180 189 189 205 222 32 32 49 123 131 139 49 82 123 41 123 197 57 139 213 90 164 230 139 197 246 ================================================ FILE: graphics/main_menu/textbox.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 255 255 255 98 98 98 213 213 205 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/misc/option_menu.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 99 99 99 214 214 206 230 8 8 255 189 115 33 156 8 148 247 148 49 82 206 165 197 247 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/naming_screen/buttons.pal ================================================ JASC-PAL 0100 16 106 156 213 255 255 255 57 57 57 139 139 131 197 189 180 230 222 213 74 115 139 123 172 197 172 115 74 213 156 115 98 156 57 148 189 106 189 164 32 230 222 90 57 57 57 57 57 57 ================================================ FILE: graphics/naming_screen/cursor.pal ================================================ JASC-PAL 0100 16 106 156 213 255 8 8 222 57 74 180 65 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 230 222 213 0 0 0 230 222 213 0 0 0 ================================================ FILE: graphics/naming_screen/keyboard.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 0 0 0 0 0 0 0 0 0 123 172 197 213 156 115 148 189 106 ================================================ FILE: graphics/naming_screen/menu.pal ================================================ JASC-PAL 0100 16 106 156 213 255 255 255 115 115 115 139 139 131 172 172 164 197 189 180 230 222 213 197 230 156 213 238 189 230 246 222 0 0 0 0 0 0 213 205 82 230 222 90 238 230 139 246 238 197 ================================================ FILE: graphics/naming_screen/page_swap_lower.pal ================================================ JASC-PAL 0100 16 106 156 213 255 255 255 57 57 57 115 115 115 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 172 115 74 189 131 90 213 156 115 246 205 164 255 230 197 ================================================ FILE: graphics/naming_screen/page_swap_others.pal ================================================ JASC-PAL 0100 16 106 156 213 255 255 255 57 57 57 115 115 115 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 98 156 57 123 172 82 148 189 106 197 230 156 213 238 189 ================================================ FILE: graphics/naming_screen/page_swap_upper.pal ================================================ JASC-PAL 0100 16 106 156 213 255 255 255 57 57 57 115 115 115 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 74 115 139 98 139 164 123 172 197 156 205 230 180 222 246 ================================================ FILE: graphics/naming_screen/rival.pal ================================================ JASC-PAL 0100 16 115 197 164 255 213 180 255 197 148 222 148 115 123 65 65 213 172 65 156 106 32 106 74 32 115 189 0 65 123 0 32 65 16 213 115 164 164 65 115 82 32 65 230 230 49 0 0 0 ================================================ FILE: graphics/oak_speech/leaf/pal.pal ================================================ JASC-PAL 0100 32 115 197 164 255 238 205 246 205 180 213 164 148 172 131 106 106 74 65 205 164 139 164 123 98 115 74 49 74 41 16 222 222 222 180 180 180 131 131 131 82 82 90 41 41 49 255 255 255 0 0 0 131 189 213 106 156 180 82 131 156 49 90 115 32 65 90 0 0 255 255 255 189 222 222 82 172 172 57 98 98 0 213 131 123 189 106 98 164 82 74 139 57 49 98 24 16 ================================================ FILE: graphics/oak_speech/oak/pal.pal ================================================ JASC-PAL 0100 32 115 197 164 255 230 205 222 189 156 197 148 115 106 74 65 238 222 148 205 189 115 172 156 90 139 123 65 98 90 49 255 0 255 205 205 222 123 131 156 57 74 106 255 255 255 0 0 0 0 0 255 172 148 222 131 115 172 82 65 115 230 222 180 205 197 156 180 172 139 164 156 123 123 115 90 82 57 49 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/oak_speech/pikachu_intro/pikachu.pal ================================================ JASC-PAL 0100 16 205 205 180 255 255 255 255 246 106 246 213 0 238 172 0 197 139 0 131 82 0 255 0 255 255 0 255 180 180 180 255 74 74 230 0 0 180 0 0 106 106 106 16 16 16 255 0 255 ================================================ FILE: graphics/oak_speech/platform.pal ================================================ JASC-PAL 0100 16 189 189 164 65 139 131 82 148 139 106 164 156 131 180 172 156 197 189 180 213 205 205 230 222 230 246 238 0 0 0 255 0 255 139 189 164 156 205 172 180 222 197 205 238 222 115 172 156 ================================================ FILE: graphics/oak_speech/red/pal.pal ================================================ JASC-PAL 0100 32 115 197 164 255 230 205 222 189 156 197 148 131 148 106 90 106 74 65 205 164 139 164 123 98 115 74 49 82 65 32 222 222 222 180 180 180 131 131 131 82 82 90 57 57 65 255 255 255 0 0 0 131 189 213 106 156 180 82 131 156 49 90 115 32 65 90 0 0 255 238 238 74 205 205 49 164 164 32 98 98 0 213 131 123 189 106 98 164 82 74 139 57 49 98 24 16 ================================================ FILE: graphics/oak_speech/rival/pal.pal ================================================ JASC-PAL 0100 32 115 197 164 255 230 205 222 189 156 197 148 115 106 74 65 238 189 74 213 156 57 189 123 41 139 82 41 164 123 106 222 222 222 197 197 197 139 139 139 98 98 98 65 65 65 255 255 255 0 0 0 180 148 180 139 106 139 106 74 106 82 49 82 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 246 131 131 205 82 82 ================================================ FILE: graphics/object_events/palettes/22.pal ================================================ JASC-PAL 0100 16 115 197 164 255 213 180 255 197 148 222 148 115 123 65 65 57 74 123 41 57 98 24 41 82 16 32 57 222 230 238 115 205 115 74 148 82 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/object_events/palettes/23.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 164 148 205 131 115 123 90 82 98 98 115 41 57 65 164 106 82 74 49 57 205 205 222 106 213 65 65 172 32 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/object_events/palettes/839C588.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 98 98 98 213 213 139 172 172 90 139 139 65 230 246 205 189 238 180 131 222 180 98 172 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/object_events/palettes/839D3A8.pal ================================================ JASC-PAL 0100 16 131 172 74 255 255 255 205 246 255 156 213 255 74 197 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/object_events/palettes/black_sand_footprints.pal ================================================ JASC-PAL 0100 16 255 0 238 246 230 197 238 213 180 222 180 148 255 255 255 222 230 238 189 205 230 156 180 222 98 156 180 0 0 0 0 0 0 238 230 164 222 213 139 120 112 112 104 96 104 0 0 0 ================================================ FILE: graphics/object_events/palettes/bridge_reflection.pal ================================================ JASC-PAL 0100 16 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 74 115 172 ================================================ FILE: graphics/object_events/palettes/cable_car.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 164 222 222 98 139 139 139 180 180 131 131 139 98 98 123 65 74 106 41 49 90 139 205 246 98 172 238 255 255 148 238 213 82 213 172 16 180 106 0 139 65 0 ================================================ FILE: graphics/object_events/palettes/lady.pal ================================================ JASC-PAL 0100 16 0 0 0 255 213 180 246 189 148 222 148 115 123 65 65 222 131 57 189 106 41 123 65 24 148 197 238 98 131 205 57 98 156 197 197 213 139 139 148 74 74 90 255 255 255 0 0 0 ================================================ FILE: graphics/object_events/palettes/meteorite.pal ================================================ JASC-PAL 0100 16 106 156 197 32 32 32 82 82 82 139 139 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/object_events/palettes/npc_blue.pal ================================================ JASC-PAL 0100 16 115 197 164 255 213 180 246 189 148 222 148 115 123 65 65 255 222 74 213 172 32 131 98 0 164 139 238 106 82 189 65 57 98 238 115 65 172 65 57 74 49 49 255 255 255 0 0 0 ================================================ FILE: graphics/object_events/palettes/npc_blue_reflection.pal ================================================ JASC-PAL 0100 16 98 172 238 255 255 255 255 255 230 255 230 197 205 148 148 255 255 139 246 230 65 238 197 32 197 222 238 156 180 230 131 148 205 255 197 139 246 156 106 205 115 90 255 255 255 82 82 82 ================================================ FILE: graphics/object_events/palettes/npc_green.pal ================================================ JASC-PAL 0100 16 115 197 164 255 213 180 246 189 148 222 148 115 123 65 65 222 189 65 164 131 32 82 82 32 131 205 49 57 139 0 32 65 16 222 148 189 164 74 131 82 32 65 255 255 255 0 0 0 ================================================ FILE: graphics/object_events/palettes/npc_green_reflection.pal ================================================ JASC-PAL 0100 16 98 172 238 255 255 255 255 255 230 255 230 197 205 148 148 238 222 98 222 197 74 197 172 65 164 238 148 131 205 123 106 172 74 246 156 213 213 131 189 189 115 148 255 255 255 82 82 82 ================================================ FILE: graphics/object_events/palettes/npc_pink.pal ================================================ JASC-PAL 0100 16 115 197 164 255 213 180 246 189 148 222 148 115 123 65 65 255 164 180 213 106 123 139 65 82 148 197 238 98 131 205 57 57 74 197 197 213 139 139 148 74 74 90 255 255 255 0 0 0 ================================================ FILE: graphics/object_events/palettes/npc_pink_reflection.pal ================================================ JASC-PAL 0100 16 98 172 238 255 255 255 255 255 230 255 230 197 205 148 148 255 222 238 255 180 205 238 164 172 205 255 255 180 230 255 123 164 213 222 222 230 180 180 180 139 139 148 255 255 255 82 82 82 ================================================ FILE: graphics/object_events/palettes/npc_white.pal ================================================ JASC-PAL 0100 16 115 197 164 255 213 180 246 189 148 222 148 115 123 65 65 205 172 98 123 115 65 57 57 24 230 106 74 148 57 41 82 16 0 197 197 213 139 139 148 74 74 90 255 255 255 0 0 0 ================================================ FILE: graphics/object_events/palettes/npc_white_reflection.pal ================================================ JASC-PAL 0100 16 98 172 238 255 255 255 255 255 230 255 230 197 205 148 148 230 205 131 205 180 106 164 139 65 255 197 139 246 156 106 205 115 90 222 222 230 180 180 180 139 139 148 255 255 255 82 82 82 ================================================ FILE: graphics/object_events/palettes/player.pal ================================================ JASC-PAL 0100 16 131 123 164 172 123 65 255 197 148 222 148 115 123 65 65 65 65 213 57 57 123 115 164 197 106 41 41 238 238 255 180 180 213 255 106 74 197 57 57 255 222 90 189 156 57 0 0 0 ================================================ FILE: graphics/object_events/palettes/player_reflection.pal ================================================ JASC-PAL 0100 16 197 255 246 238 189 180 255 255 230 255 230 197 205 148 148 123 164 238 115 131 197 172 213 255 172 123 98 255 255 255 222 222 255 255 230 172 255 172 172 255 255 172 230 205 115 82 82 82 ================================================ FILE: graphics/object_events/palettes/player_unused.pal ================================================ JASC-PAL 0100 16 115 197 164 172 123 65 255 197 148 222 148 115 123 65 65 65 65 213 57 57 123 115 164 197 106 41 41 238 238 255 180 180 213 255 106 74 197 57 57 255 222 90 189 156 57 0 0 0 ================================================ FILE: graphics/object_events/palettes/rs_quinty_plump.pal ================================================ JASC-PAL 0100 16 0 0 0 41 41 32 41 41 41 90 90 82 139 139 115 180 180 164 213 156 16 238 197 16 255 222 98 0 90 197 0 131 238 156 180 205 213 230 238 255 255 255 0 139 0 0 205 0 ================================================ FILE: graphics/object_events/palettes/rs_quinty_plump_reflection.pal ================================================ JASC-PAL 0100 16 255 255 255 139 139 131 139 139 139 189 189 180 238 238 213 255 255 255 255 255 115 255 255 115 255 255 197 98 189 255 98 230 255 255 255 255 255 255 255 255 255 255 98 238 98 98 255 98 ================================================ FILE: graphics/object_events/palettes/seagallop.pal ================================================ JASC-PAL 0100 16 65 123 180 238 246 255 222 230 238 189 205 230 156 164 189 139 139 156 98 98 123 57 57 106 197 98 98 172 65 106 32 74 156 197 148 0 246 213 24 222 238 255 255 255 255 74 106 139 ================================================ FILE: graphics/object_events/palettes/snow_footprints.pal ================================================ JASC-PAL 0100 16 255 0 238 246 230 197 238 213 180 222 180 148 255 255 255 222 230 238 189 205 230 156 180 222 98 156 180 0 0 0 0 0 0 238 230 164 222 213 139 192 216 224 186 207 235 0 0 0 ================================================ FILE: graphics/object_events/palettes/ss_anne.pal ================================================ JASC-PAL 0100 16 57 115 180 49 131 197 65 65 82 139 106 57 32 82 139 189 90 32 222 156 49 246 205 74 172 148 90 82 82 106 213 213 238 106 106 139 131 139 172 205 180 123 255 255 255 16 16 24 ================================================ FILE: graphics/object_events/palettes/three_island_grass.pal ================================================ JASC-PAL 0100 32 255 0 238 189 255 139 131 213 98 160 160 48 112 104 48 49 65 0 98 172 238 98 172 197 139 205 246 148 230 255 148 131 98 180 172 148 248 248 144 216 208 96 216 208 96 160 160 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/object_events/palettes/underwater_sprites.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 164 148 205 131 115 123 90 82 98 123 156 74 90 131 49 65 106 24 41 82 131 164 197 255 197 90 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/pokedex/area_markers/marker.pal ================================================ JASC-PAL 0100 16 0 0 0 255 197 115 255 139 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokedex/kanto_dex_bgpals.pal ================================================ JASC-PAL 0100 256 156 156 189 0 0 0 197 180 139 230 222 197 246 246 238 255 255 255 123 98 57 164 148 98 213 197 164 255 246 238 238 238 230 213 213 213 156 156 156 255 255 0 205 65 57 255 139 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 156 156 189 0 0 0 197 180 139 230 222 197 246 246 238 255 255 255 123 98 57 164 148 98 213 197 164 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 205 65 57 255 139 57 156 156 189 0 0 0 197 180 139 230 222 197 246 246 238 255 255 255 123 98 57 164 148 98 213 197 164 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 205 65 57 255 139 57 156 156 189 0 0 0 197 180 139 230 222 197 246 246 238 255 255 255 123 98 57 164 148 98 213 197 164 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 205 65 57 255 139 57 156 156 189 0 0 0 197 180 139 230 222 197 246 246 238 255 255 255 123 98 57 164 148 98 213 197 164 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 205 65 57 255 139 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 156 156 189 0 0 0 197 180 139 230 222 197 246 246 238 255 255 255 123 98 57 164 148 98 213 197 164 255 246 238 238 238 230 213 213 213 156 156 156 255 255 0 205 65 57 255 139 57 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 197 180 139 ================================================ FILE: graphics/pokedex/national_dex_bgpals.pal ================================================ JASC-PAL 0100 256 156 156 189 0 0 0 197 180 139 230 222 197 238 246 246 255 255 255 123 98 57 164 148 98 213 197 164 255 246 238 238 238 230 213 213 213 156 156 156 255 255 0 205 65 57 255 139 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 156 156 189 0 0 0 197 180 139 230 222 197 238 246 246 255 255 255 123 98 57 164 148 98 213 197 164 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 205 65 57 255 139 57 156 156 189 0 0 0 197 180 139 230 222 197 238 246 246 255 255 255 123 98 57 164 148 98 213 197 164 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 205 65 57 255 139 57 156 156 189 0 0 0 197 180 139 230 222 197 238 246 246 255 255 255 123 98 57 164 148 98 213 197 164 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 205 65 57 255 139 57 156 156 189 0 0 0 197 180 139 230 222 197 238 246 246 255 255 255 123 98 57 164 148 98 213 197 164 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 205 65 57 255 139 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 156 156 189 0 0 0 197 180 139 230 222 197 238 246 246 255 255 255 123 98 57 164 148 98 213 197 164 255 246 238 238 238 230 213 213 213 156 156 156 255 255 0 205 65 57 255 139 57 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 197 24 ================================================ FILE: graphics/pokedex/silhouette_sprite_pal.pal ================================================ JASC-PAL 0100 16 0 0 0 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 ================================================ FILE: graphics/pokemon/abra/normal.pal ================================================ JASC-PAL 0100 16 246 246 246 255 0 255 255 0 255 255 0 255 255 0 255 213 180 82 172 131 41 148 106 16 98 49 0 255 0 255 255 0 255 246 246 164 255 238 41 222 205 32 131 90 16 16 16 16 ================================================ FILE: graphics/pokemon/abra/shiny.pal ================================================ JASC-PAL 0100 16 115 197 148 255 0 255 255 0 255 255 0 255 255 0 255 230 139 164 205 115 148 131 82 98 98 65 82 255 0 255 255 0 255 255 246 115 255 222 90 238 180 49 115 74 49 16 16 16 ================================================ FILE: graphics/pokemon/absol/normal.pal ================================================ JASC-PAL 0100 16 123 156 180 255 255 255 222 222 238 197 197 213 148 148 172 255 123 115 205 41 32 123 41 49 172 172 205 131 131 172 90 90 131 41 57 57 148 164 164 115 131 131 82 98 98 0 0 0 ================================================ FILE: graphics/pokemon/absol/shiny.pal ================================================ JASC-PAL 0100 16 123 156 180 255 255 255 238 222 230 222 189 213 197 156 189 49 180 255 0 115 189 123 41 49 172 172 205 131 131 172 90 90 131 41 57 57 205 115 98 172 82 65 131 41 24 0 0 0 ================================================ FILE: graphics/pokemon/aerodactyl/normal.pal ================================================ JASC-PAL 0100 16 156 213 180 255 0 255 255 0 255 255 0 255 189 131 197 148 98 180 98 74 148 74 49 98 222 98 98 139 49 49 16 16 16 230 222 238 205 205 222 148 172 180 74 98 82 255 255 255 ================================================ FILE: graphics/pokemon/aerodactyl/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 0 255 255 0 255 255 0 255 98 148 255 65 115 230 16 82 180 24 24 106 222 98 98 139 49 49 16 16 16 246 197 238 230 164 222 180 123 180 123 57 131 255 255 255 ================================================ FILE: graphics/pokemon/aggron/normal.pal ================================================ JASC-PAL 0100 16 148 172 156 74 74 65 106 106 106 139 139 139 172 172 172 57 57 65 123 106 106 156 139 139 189 172 172 222 205 205 255 255 255 172 57 74 222 106 106 255 131 131 106 189 255 0 0 0 ================================================ FILE: graphics/pokemon/aggron/shiny.pal ================================================ JASC-PAL 0100 16 148 172 156 32 90 90 65 123 115 90 156 148 148 197 205 74 41 24 123 123 90 156 156 123 189 189 156 222 222 197 255 255 255 172 57 74 222 106 106 255 131 131 255 123 82 0 0 0 ================================================ FILE: graphics/pokemon/aipom/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 213 131 255 180 98 230 139 57 180 82 32 106 255 246 197 255 238 164 238 197 90 197 156 82 139 106 65 255 0 255 213 213 213 123 123 123 90 90 90 0 0 0 ================================================ FILE: graphics/pokemon/aipom/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 131 164 230 98 139 189 57 106 115 32 65 255 238 230 255 222 213 238 189 180 222 123 131 189 82 90 255 0 255 213 213 213 123 123 123 90 90 90 16 16 16 ================================================ FILE: graphics/pokemon/alakazam/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 222 222 180 180 180 90 90 90 213 180 82 180 131 41 131 90 8 82 49 8 255 0 255 255 0 255 255 246 172 255 238 41 222 197 24 123 106 16 16 16 16 ================================================ FILE: graphics/pokemon/alakazam/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 222 222 180 180 180 90 90 90 230 123 189 189 82 148 131 41 106 82 0 41 255 0 255 255 0 255 255 205 74 213 172 0 172 115 0 123 32 0 16 16 16 ================================================ FILE: graphics/pokemon/altaria/normal.pal ================================================ JASC-PAL 0100 16 115 205 139 255 255 255 131 131 148 197 197 213 255 164 131 255 98 65 131 32 8 172 213 255 115 180 238 98 139 197 65 106 156 238 246 255 222 222 238 172 180 197 41 57 90 0 0 0 ================================================ FILE: graphics/pokemon/altaria/shiny.pal ================================================ JASC-PAL 0100 16 115 205 139 255 255 255 131 131 148 197 197 213 255 164 131 255 98 65 131 32 8 255 238 131 255 205 98 222 172 65 156 106 0 238 246 255 222 222 238 172 180 197 123 74 0 0 0 0 ================================================ FILE: graphics/pokemon/ampharos/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 238 74 255 197 16 213 148 0 148 74 0 255 0 255 230 230 230 172 172 172 98 106 106 16 16 16 255 98 0 197 65 0 139 32 0 90 0 0 255 0 255 ================================================ FILE: graphics/pokemon/ampharos/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 180 213 213 148 180 189 115 156 139 82 106 255 0 255 230 230 230 172 172 172 98 106 106 16 16 16 131 205 246 65 106 205 32 65 156 49 74 139 255 0 255 ================================================ FILE: graphics/pokemon/anorith/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 172 205 172 139 172 139 115 139 115 90 115 90 246 238 197 230 205 148 197 164 98 148 82 74 255 123 82 222 82 32 222 222 222 180 180 189 106 106 123 0 0 0 ================================================ FILE: graphics/pokemon/anorith/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 213 172 230 180 139 197 148 106 164 115 74 246 238 197 230 205 148 197 164 98 131 90 32 255 82 74 222 82 32 222 222 222 180 180 189 106 106 123 41 41 57 ================================================ FILE: graphics/pokemon/arbok/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 230 16 230 197 24 222 156 65 255 172 131 230 106 65 197 65 24 156 32 65 16 16 16 222 164 197 189 131 172 148 90 131 98 57 90 255 0 255 205 205 205 255 255 255 ================================================ FILE: graphics/pokemon/arbok/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 74 238 222 24 189 172 16 180 197 230 148 164 197 106 123 156 49 65 98 16 16 16 222 180 65 180 139 24 139 98 24 98 57 0 255 0 255 205 205 205 255 255 255 ================================================ FILE: graphics/pokemon/arcanine/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 246 222 222 213 131 106 98 255 98 65 197 49 32 82 16 16 255 255 197 255 246 148 238 197 115 172 98 32 255 156 106 238 115 49 197 82 74 98 16 0 16 16 16 ================================================ FILE: graphics/pokemon/arcanine/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 246 222 222 213 90 90 90 255 98 65 197 49 32 82 16 16 255 246 238 255 238 197 230 197 156 148 115 82 255 230 115 222 189 74 180 148 32 115 82 0 16 16 16 ================================================ FILE: graphics/pokemon/ariados/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 172 57 255 123 41 205 82 0 139 32 0 74 0 0 255 238 90 222 180 74 148 115 49 189 148 255 148 90 238 106 49 172 189 189 189 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/ariados/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 139 189 205 106 164 139 65 123 115 16 82 82 8 49 255 238 90 222 180 74 148 115 49 148 213 255 98 164 230 32 82 180 189 189 189 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/armaldo/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 189 222 139 139 189 115 115 172 90 90 139 246 238 197 255 222 106 222 180 98 57 65 82 255 98 74 189 57 0 222 222 222 180 180 189 106 106 123 0 0 0 ================================================ FILE: graphics/pokemon/armaldo/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 197 189 213 164 156 180 131 123 148 98 90 246 238 197 255 222 106 222 180 98 115 65 57 255 98 74 189 57 0 222 222 222 222 98 82 180 57 41 0 0 0 ================================================ FILE: graphics/pokemon/aron/normal.pal ================================================ JASC-PAL 0100 16 148 172 156 74 74 65 106 106 106 139 139 139 172 172 172 57 57 65 123 106 106 156 139 139 189 172 172 222 205 205 255 255 255 172 57 74 222 106 106 255 131 131 106 189 255 0 0 0 ================================================ FILE: graphics/pokemon/aron/shiny.pal ================================================ JASC-PAL 0100 16 148 172 156 32 90 90 65 123 115 90 156 148 148 197 205 74 41 24 123 123 90 156 156 123 189 189 156 222 222 197 255 255 255 172 57 74 222 106 106 255 131 131 255 123 82 0 0 0 ================================================ FILE: graphics/pokemon/articuno/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 213 238 255 197 205 255 139 180 230 98 148 205 57 106 164 74 74 106 255 0 255 255 0 255 156 172 197 123 139 164 98 115 131 189 41 57 230 98 115 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/articuno/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 238 246 255 205 230 255 156 189 246 98 148 213 82 106 156 255 0 255 255 0 255 139 164 213 90 115 164 74 74 106 189 41 57 230 98 115 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/azumarill/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 205 205 205 156 156 156 106 106 106 16 16 16 131 205 255 90 172 230 49 131 197 74 74 131 255 0 255 255 0 255 230 82 0 197 41 0 123 0 0 255 0 255 ================================================ FILE: graphics/pokemon/azumarill/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 205 205 205 156 156 156 106 106 106 16 16 16 255 238 82 255 213 57 213 172 24 131 90 41 255 0 255 255 0 255 238 74 65 197 24 57 123 0 0 255 0 255 ================================================ FILE: graphics/pokemon/azurill/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 49 65 90 106 148 255 74 115 255 156 189 255 123 123 148 238 123 115 189 74 65 57 90 189 222 98 90 222 238 255 90 131 246 57 90 148 255 255 255 255 255 255 0 0 0 ================================================ FILE: graphics/pokemon/azurill/shiny.pal ================================================ JASC-PAL 0100 16 156 189 255 32 106 82 148 230 148 90 180 123 205 255 172 255 0 255 222 98 49 180 65 49 65 156 98 222 98 90 222 238 255 123 205 131 255 0 255 255 255 255 255 255 255 0 0 0 ================================================ FILE: graphics/pokemon/bagon/normal.pal ================================================ JASC-PAL 0100 16 197 197 98 74 74 98 123 115 148 123 123 222 172 172 255 197 131 98 255 148 98 255 148 98 131 148 148 172 164 189 222 213 238 255 255 255 0 0 0 0 0 0 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/bagon/shiny.pal ================================================ JASC-PAL 0100 16 197 197 98 16 98 32 98 156 106 98 197 98 148 230 148 197 131 98 255 148 98 255 148 98 131 148 148 172 164 189 222 213 238 255 255 255 0 0 0 0 0 0 255 255 255 41 41 41 ================================================ FILE: graphics/pokemon/baltoy/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 98 82 82 131 131 98 255 255 255 156 164 65 197 197 98 230 230 172 222 65 98 246 148 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 ================================================ FILE: graphics/pokemon/baltoy/shiny.pal ================================================ JASC-PAL 0100 16 255 255 255 98 82 82 131 131 98 255 255 255 205 180 57 246 222 98 230 230 172 90 172 106 115 189 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 ================================================ FILE: graphics/pokemon/banette/normal.pal ================================================ JASC-PAL 0100 16 213 230 213 255 255 255 255 255 49 230 164 24 255 189 49 230 49 49 222 123 49 189 90 16 131 65 41 255 255 49 255 255 49 189 189 205 148 148 172 115 115 139 74 74 98 0 0 0 ================================================ FILE: graphics/pokemon/banette/shiny.pal ================================================ JASC-PAL 0100 16 213 230 213 255 255 255 255 255 49 230 164 24 255 189 49 230 49 49 222 123 49 189 90 16 131 65 41 255 255 49 255 255 49 189 205 238 139 172 205 90 148 172 32 82 123 0 0 0 ================================================ FILE: graphics/pokemon/barboach/normal.pal ================================================ JASC-PAL 0100 16 164 156 90 57 65 82 115 115 131 164 164 172 189 189 197 213 213 222 238 246 246 0 0 0 197 222 238 255 189 41 74 90 156 90 106 180 90 115 205 139 164 222 164 197 255 255 255 255 ================================================ FILE: graphics/pokemon/barboach/shiny.pal ================================================ JASC-PAL 0100 16 164 156 90 57 65 82 115 115 131 164 164 172 189 189 197 213 213 222 238 246 246 0 0 0 255 246 123 255 189 41 131 82 0 164 115 0 197 148 24 230 180 57 255 213 90 255 255 255 ================================================ FILE: graphics/pokemon/bayleef/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 172 246 238 106 222 189 41 164 131 24 106 82 0 106 197 49 74 164 16 49 123 8 16 82 16 197 197 197 98 98 98 16 16 16 213 139 82 172 49 0 ================================================ FILE: graphics/pokemon/bayleef/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 238 197 255 213 180 230 156 123 189 98 65 123 74 57 230 189 49 189 148 24 123 98 8 82 65 16 197 197 197 98 98 98 16 16 16 222 156 115 172 57 57 ================================================ FILE: graphics/pokemon/beautifly/normal.pal ================================================ JASC-PAL 0100 16 148 197 246 90 90 82 139 139 123 255 255 255 172 172 106 230 222 115 255 255 49 255 255 197 156 156 115 197 197 115 238 238 180 255 255 238 0 0 0 255 148 41 156 131 255 24 24 0 ================================================ FILE: graphics/pokemon/beautifly/shiny.pal ================================================ JASC-PAL 0100 16 148 197 246 90 24 65 156 65 131 255 255 255 172 148 106 246 238 148 255 255 213 255 255 197 197 156 115 230 197 115 255 238 180 255 255 238 0 0 0 255 148 41 156 131 255 24 24 0 ================================================ FILE: graphics/pokemon/beedrill/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 246 164 255 222 74 222 180 57 139 115 0 238 230 255 222 205 246 189 172 197 164 148 172 255 148 106 205 49 82 156 0 8 98 98 98 24 24 24 255 0 255 ================================================ FILE: graphics/pokemon/beedrill/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 246 106 189 205 65 148 164 24 74 90 0 238 230 255 222 205 246 189 172 197 164 148 172 90 139 222 49 98 180 0 0 115 98 98 98 24 24 24 255 0 255 ================================================ FILE: graphics/pokemon/beldum/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 205 205 205 172 172 172 148 139 148 115 106 115 222 222 222 131 74 74 255 106 106 213 74 82 131 205 255 255 255 255 90 164 255 74 131 213 57 98 180 49 57 115 16 16 16 ================================================ FILE: graphics/pokemon/beldum/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 238 172 82 205 139 49 172 106 16 139 74 0 255 205 115 156 65 65 255 106 106 255 74 82 238 238 246 255 255 255 213 213 222 164 164 172 115 106 115 82 74 82 16 16 16 ================================================ FILE: graphics/pokemon/bellossom/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 156 213 74 115 172 49 82 98 41 230 230 106 180 180 57 131 131 24 82 197 49 57 139 0 16 90 16 246 106 0 213 32 0 131 0 0 164 164 164 16 16 16 ================================================ FILE: graphics/pokemon/bellossom/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 156 255 189 123 230 123 65 180 213 246 90 164 197 41 98 139 8 90 205 131 49 148 98 32 82 74 255 131 172 205 49 106 148 24 82 164 164 164 16 16 16 ================================================ FILE: graphics/pokemon/bellsprout/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 246 255 189 82 98 41 255 172 131 238 115 65 189 65 32 255 238 115 222 197 115 197 148 41 189 238 131 156 213 74 115 172 49 205 156 41 156 115 32 106 65 0 16 16 16 ================================================ FILE: graphics/pokemon/bellsprout/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 82 98 41 222 189 189 180 148 148 139 106 106 255 246 98 222 205 57 180 164 16 246 213 82 205 172 41 164 131 0 205 156 41 156 115 32 106 65 0 16 16 16 ================================================ FILE: graphics/pokemon/blastoise/normal.pal ================================================ JASC-PAL 0100 16 139 205 164 255 255 255 222 213 213 148 164 164 106 74 49 172 49 57 222 164 115 255 213 106 238 172 65 189 139 57 156 115 65 156 197 238 115 148 230 74 131 148 74 74 115 16 16 16 ================================================ FILE: graphics/pokemon/blastoise/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 213 205 205 148 164 164 32 65 32 172 49 57 180 172 65 213 189 57 238 205 74 115 139 8 65 90 8 222 205 246 213 180 255 156 148 197 57 57 106 16 16 16 ================================================ FILE: graphics/pokemon/blaziken/normal.pal ================================================ JASC-PAL 0100 16 148 197 148 255 246 246 205 180 180 172 148 148 148 115 123 255 123 82 222 98 49 180 65 49 74 41 65 238 213 172 205 180 156 148 123 90 255 230 156 255 213 106 230 172 90 0 0 0 ================================================ FILE: graphics/pokemon/blaziken/shiny.pal ================================================ JASC-PAL 0100 16 148 197 148 255 246 246 205 180 180 172 148 148 148 115 123 197 82 49 131 49 32 106 24 8 74 0 0 238 230 222 222 213 205 180 65 49 255 255 255 255 180 82 222 123 49 0 0 0 ================================================ FILE: graphics/pokemon/blissey/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 222 222 180 180 180 106 106 106 0 255 0 255 213 222 255 172 197 238 123 156 213 74 98 189 32 49 0 255 0 0 255 0 213 74 98 172 16 32 16 16 16 ================================================ FILE: graphics/pokemon/blissey/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 238 255 180 197 222 90 106 131 0 255 0 255 238 246 255 213 230 246 172 197 222 115 139 180 74 82 0 255 0 238 123 156 222 90 98 172 49 65 16 16 16 ================================================ FILE: graphics/pokemon/breloom/normal.pal ================================================ JASC-PAL 0100 16 238 238 238 255 255 255 255 238 156 246 213 123 213 172 106 82 24 16 98 74 57 57 82 24 164 131 82 172 213 98 148 189 74 115 148 49 238 123 74 172 49 16 0 0 0 222 74 41 ================================================ FILE: graphics/pokemon/breloom/shiny.pal ================================================ JASC-PAL 0100 16 148 148 139 255 255 255 255 238 180 255 230 148 230 189 106 82 24 16 98 74 57 57 82 24 189 148 82 255 115 74 222 98 49 180 65 49 255 222 139 238 139 49 0 0 0 255 180 90 ================================================ FILE: graphics/pokemon/bulbasaur/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 131 238 197 98 213 164 98 148 156 41 90 98 255 106 98 222 74 65 189 41 32 205 205 205 16 16 16 189 255 115 156 213 74 123 172 65 90 115 65 255 0 255 ================================================ FILE: graphics/pokemon/bulbasaur/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 205 255 41 164 230 0 106 172 0 24 90 0 255 106 98 222 74 65 189 41 32 205 205 205 16 16 16 57 197 90 16 156 49 0 115 8 0 57 0 255 0 255 ================================================ FILE: graphics/pokemon/butterfree/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 16 16 16 255 0 255 180 180 197 123 123 156 82 82 115 65 65 90 255 189 180 255 123 82 205 98 106 148 32 16 230 230 230 197 197 197 156 205 197 90 180 139 ================================================ FILE: graphics/pokemon/butterfree/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 246 213 16 16 16 255 0 255 189 189 205 123 123 156 106 90 131 98 65 98 98 246 106 82 222 106 65 180 90 41 98 82 255 222 180 246 180 156 246 180 123 213 131 123 ================================================ FILE: graphics/pokemon/cacnea/normal.pal ================================================ JASC-PAL 0100 16 255 172 98 205 238 115 172 205 98 139 172 82 106 139 65 230 255 156 123 205 106 74 156 57 65 115 41 131 131 131 49 82 41 255 238 255 255 213 74 189 156 65 255 238 148 16 16 16 ================================================ FILE: graphics/pokemon/cacnea/shiny.pal ================================================ JASC-PAL 0100 16 255 172 98 238 189 90 205 156 57 172 123 24 139 90 0 255 222 123 205 106 57 172 74 24 139 41 0 131 131 131 74 24 0 255 238 255 255 213 74 189 156 65 255 238 148 16 16 16 ================================================ FILE: graphics/pokemon/cacturne/normal.pal ================================================ JASC-PAL 0100 16 255 172 98 180 213 115 156 189 98 131 164 82 106 139 65 98 197 106 82 172 98 65 164 90 49 131 74 98 115 74 57 82 41 205 238 115 255 230 74 139 115 115 82 82 90 16 16 16 ================================================ FILE: graphics/pokemon/cacturne/shiny.pal ================================================ JASC-PAL 0100 16 255 172 98 238 189 90 205 156 57 172 123 24 139 90 0 205 106 57 172 74 24 139 41 0 106 8 0 106 57 0 74 24 0 255 222 123 255 230 74 139 115 115 82 82 90 16 16 16 ================================================ FILE: graphics/pokemon/camerupt/normal.pal ================================================ JASC-PAL 0100 16 106 106 156 24 24 24 82 49 24 189 82 41 230 106 24 238 172 74 74 74 139 131 131 189 189 180 189 0 0 0 189 123 106 238 238 205 213 213 131 172 172 90 74 74 32 255 255 255 ================================================ FILE: graphics/pokemon/camerupt/shiny.pal ================================================ JASC-PAL 0100 16 106 106 156 41 41 24 41 41 57 57 65 82 115 106 123 148 139 156 222 172 74 255 246 115 222 213 222 0 0 0 197 139 57 255 255 255 238 189 156 197 148 115 115 74 49 255 255 255 ================================================ FILE: graphics/pokemon/carvanha/normal.pal ================================================ JASC-PAL 0100 16 156 131 213 41 41 90 172 197 255 98 74 57 49 74 156 65 123 189 98 164 222 189 57 57 246 57 57 255 131 131 205 148 41 238 189 41 255 205 82 123 57 57 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/carvanha/shiny.pal ================================================ JASC-PAL 0100 16 156 131 213 41 41 90 172 197 255 98 74 57 123 156 24 156 189 57 189 222 90 49 148 131 82 180 164 115 213 197 205 148 41 238 189 41 255 205 82 0 98 82 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/cascoon/normal.pal ================================================ JASC-PAL 0100 16 197 246 197 106 98 115 139 139 148 172 172 180 0 0 0 172 156 189 222 180 230 238 213 230 238 230 255 115 0 0 246 197 0 189 49 0 148 148 0 246 255 197 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/cascoon/shiny.pal ================================================ JASC-PAL 0100 16 197 246 197 49 98 16 82 148 24 115 180 57 0 0 0 139 205 74 172 230 98 213 255 148 238 255 172 115 0 0 246 197 0 189 49 0 148 148 0 246 255 197 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/castform/normal/normal.pal ================================================ JASC-PAL 0100 16 197 197 148 90 82 82 205 189 189 230 222 222 246 246 238 0 0 0 255 255 255 222 222 246 0 0 0 0 0 0 0 0 0 0 0 0 148 148 148 74 82 74 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/castform/normal/shiny.pal ================================================ JASC-PAL 0100 16 197 197 148 98 90 90 205 164 189 230 197 222 255 222 255 0 0 0 255 246 65 230 180 32 0 0 0 0 0 0 0 0 0 0 0 0 148 148 148 74 82 74 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/castform/rainy/normal.pal ================================================ JASC-PAL 0100 16 197 197 148 57 65 90 98 115 189 115 139 213 148 180 205 0 0 0 205 238 246 180 197 222 139 205 222 131 180 197 82 98 131 197 197 197 148 139 148 90 90 82 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/castform/rainy/shiny.pal ================================================ JASC-PAL 0100 16 197 197 148 57 65 90 98 115 189 115 139 213 148 180 205 0 0 0 205 238 246 180 197 222 139 205 222 131 180 197 82 98 131 197 197 197 148 139 148 90 90 82 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/castform/snowy/normal.pal ================================================ JASC-PAL 0100 16 197 197 148 41 82 57 123 82 189 139 115 213 148 180 205 0 0 0 197 180 255 156 156 197 139 205 172 115 164 139 98 74 115 189 230 230 82 115 106 74 82 74 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/castform/snowy/shiny.pal ================================================ JASC-PAL 0100 16 197 197 148 41 82 57 123 82 189 139 115 213 148 180 205 0 0 0 197 180 255 156 156 197 139 205 172 115 164 139 98 74 115 189 230 230 82 115 106 74 82 74 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/castform/sunny/normal.pal ================================================ JASC-PAL 0100 16 197 197 148 98 49 41 205 90 74 238 123 74 255 156 65 0 0 0 255 246 106 230 213 106 255 156 98 213 131 74 148 90 65 213 205 230 0 0 0 90 90 82 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/castform/sunny/shiny.pal ================================================ JASC-PAL 0100 16 197 197 148 98 49 41 205 90 74 238 123 74 255 156 65 0 0 0 255 246 106 230 213 106 255 156 98 213 131 74 148 90 65 213 205 230 0 0 0 90 90 82 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/caterpie/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 222 255 238 238 123 213 205 98 255 172 115 238 123 49 197 65 65 123 98 57 189 255 115 156 213 74 123 156 98 82 98 41 255 0 255 115 115 115 16 16 16 ================================================ FILE: graphics/pokemon/caterpie/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 238 115 230 238 123 213 205 98 255 172 115 238 123 49 197 98 98 172 98 57 255 255 123 246 222 115 222 180 57 139 106 41 255 0 255 131 131 131 16 16 16 ================================================ FILE: graphics/pokemon/celebi/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 255 213 197 238 164 123 213 115 65 189 65 32 139 32 255 255 255 172 238 255 115 189 230 57 139 205 0 98 180 255 0 255 180 180 189 106 115 131 16 16 16 ================================================ FILE: graphics/pokemon/celebi/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 230 255 238 230 255 205 197 238 164 156 222 106 131 172 57 65 255 255 255 189 222 238 106 213 90 74 180 65 41 148 41 222 32 222 180 180 189 106 115 131 49 49 49 ================================================ FILE: graphics/pokemon/chansey/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 246 238 164 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 255 172 172 255 131 90 230 82 49 255 230 230 255 213 213 238 172 189 246 115 115 164 57 41 ================================================ FILE: graphics/pokemon/chansey/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 246 238 164 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 180 238 106 148 213 82 106 189 49 255 255 230 255 238 205 246 205 139 230 172 98 123 90 16 ================================================ FILE: graphics/pokemon/charizard/normal.pal ================================================ JASC-PAL 0100 16 123 213 156 246 106 65 222 197 131 41 172 189 32 123 148 24 82 115 255 230 156 246 213 139 246 189 32 16 16 16 255 197 98 255 148 65 213 106 82 172 65 0 213 213 213 255 255 255 ================================================ FILE: graphics/pokemon/charizard/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 230 98 49 189 189 106 230 98 106 197 65 74 156 32 41 0 0 0 222 213 131 255 164 82 16 16 16 131 164 156 98 131 131 65 90 90 32 57 57 213 213 213 255 255 255 ================================================ FILE: graphics/pokemon/charmander/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 180 180 180 255 255 255 255 230 156 255 213 106 230 172 90 246 98 0 255 164 8 255 197 98 255 148 65 222 74 74 156 65 24 24 74 49 65 164 123 148 205 222 ================================================ FILE: graphics/pokemon/charmander/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 180 180 180 255 255 255 255 255 180 255 230 148 246 197 115 213 82 8 246 123 8 255 246 90 255 213 49 222 164 8 131 82 16 24 74 49 65 164 123 148 205 222 ================================================ FILE: graphics/pokemon/charmeleon/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 131 131 131 8 98 197 255 230 156 255 213 106 230 172 90 246 115 0 255 164 24 255 197 74 255 172 115 255 106 74 213 74 74 148 49 16 197 205 205 16 16 16 ================================================ FILE: graphics/pokemon/charmeleon/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 106 106 106 8 98 197 255 246 180 246 230 139 222 197 106 222 74 49 238 115 49 255 172 57 255 238 82 255 213 74 230 156 16 148 82 24 197 205 205 16 16 16 ================================================ FILE: graphics/pokemon/chikorita/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 255 131 205 238 98 156 197 8 74 115 0 98 172 74 57 131 41 0 90 0 0 57 0 205 205 205 156 156 156 98 98 98 16 16 16 213 131 82 148 0 0 ================================================ FILE: graphics/pokemon/chikorita/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 148 246 238 90 205 197 57 131 106 16 246 189 106 213 156 74 164 98 24 90 65 41 205 205 205 156 156 156 156 131 74 16 16 16 222 156 115 172 57 57 ================================================ FILE: graphics/pokemon/chimecho/normal.pal ================================================ JASC-PAL 0100 16 148 197 148 0 0 0 255 123 148 156 197 230 197 230 255 115 148 180 255 255 255 164 164 164 255 230 148 255 213 90 65 74 106 197 74 98 123 41 65 246 90 115 246 189 90 172 115 74 ================================================ FILE: graphics/pokemon/chimecho/shiny.pal ================================================ JASC-PAL 0100 16 148 197 148 0 0 0 255 189 90 148 230 148 205 255 172 98 189 98 255 255 255 164 164 164 255 230 148 255 213 90 49 123 74 197 106 24 148 74 0 255 148 24 246 189 90 172 115 74 ================================================ FILE: graphics/pokemon/chinchou/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 205 230 255 164 205 255 139 156 255 98 123 213 65 90 172 0 57 115 255 246 172 255 222 123 213 180 90 180 139 57 106 57 0 139 98 24 164 0 0 16 16 16 ================================================ FILE: graphics/pokemon/chinchou/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 148 238 255 123 222 255 82 180 255 41 139 222 8 90 180 24 57 131 213 255 115 164 246 65 123 205 74 90 172 49 57 139 24 32 82 24 148 57 0 16 16 16 ================================================ FILE: graphics/pokemon/clamperl/normal.pal ================================================ JASC-PAL 0100 16 148 246 156 255 255 255 205 213 213 139 164 148 197 213 246 139 189 205 74 139 131 41 65 131 98 139 246 49 90 205 0 41 82 123 189 255 0 0 0 255 123 213 213 115 131 115 74 90 ================================================ FILE: graphics/pokemon/clamperl/shiny.pal ================================================ JASC-PAL 0100 16 148 246 156 255 255 255 205 213 213 139 164 148 197 213 246 139 189 205 74 139 131 41 65 131 197 65 180 148 8 123 0 41 82 222 131 205 0 0 0 255 230 156 230 172 90 115 74 90 ================================================ FILE: graphics/pokemon/claydol/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 82 82 41 106 106 65 148 156 123 98 98 24 156 148 189 197 197 213 255 255 255 255 197 164 246 123 90 172 90 0 255 213 115 180 164 123 255 255 255 255 255 255 106 255 106 ================================================ FILE: graphics/pokemon/claydol/shiny.pal ================================================ JASC-PAL 0100 16 255 255 255 82 82 41 106 106 65 148 156 123 98 98 24 156 148 189 197 197 213 255 255 255 246 238 90 246 205 57 197 156 16 255 213 115 180 164 123 255 255 255 255 255 255 106 255 106 ================================================ FILE: graphics/pokemon/clefable/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 197 197 197 148 148 148 255 172 172 255 197 180 238 148 148 222 98 98 156 90 90 16 16 16 255 106 41 222 57 90 123 106 98 82 65 57 74 65 65 255 0 255 ================================================ FILE: graphics/pokemon/clefable/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 197 197 197 148 148 148 255 213 189 255 222 246 246 189 180 230 156 131 172 106 98 16 16 16 255 106 41 222 32 16 123 222 90 82 180 49 41 139 8 255 0 255 ================================================ FILE: graphics/pokemon/clefairy/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 197 197 197 131 131 131 238 90 74 180 57 41 205 131 82 172 98 49 156 82 32 115 41 8 255 0 255 255 197 164 255 156 131 230 131 123 156 90 82 16 16 16 ================================================ FILE: graphics/pokemon/clefairy/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 197 197 197 148 148 148 238 90 74 180 57 41 123 222 90 82 180 49 41 139 8 0 98 0 255 0 255 255 222 246 246 189 180 230 156 131 172 106 98 16 16 16 ================================================ FILE: graphics/pokemon/cleffa/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 205 156 255 164 131 222 115 65 197 74 0 98 49 32 213 164 41 164 106 0 123 74 0 90 49 0 255 0 255 205 0 0 156 0 0 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/cleffa/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 222 222 255 189 197 238 123 148 180 82 82 32 98 0 123 222 90 82 180 49 41 139 8 0 98 0 255 0 255 205 0 0 156 0 0 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/cloyster/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 255 0 255 213 172 230 172 123 189 98 123 115 74 32 82 255 0 255 255 0 255 255 0 255 255 0 255 213 222 197 180 189 156 131 139 106 74 82 65 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/cloyster/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 0 255 115 164 213 74 123 172 32 82 131 0 41 90 255 0 255 255 0 255 255 0 255 255 0 255 197 197 197 148 148 148 98 98 98 65 65 65 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/combusken/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 255 222 156 213 189 148 180 148 123 156 123 57 255 213 98 246 180 82 197 148 57 123 106 90 139 57 49 255 255 255 255 164 57 255 106 57 213 90 57 90 57 49 16 16 16 ================================================ FILE: graphics/pokemon/combusken/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 255 255 255 222 180 131 172 123 90 123 90 74 255 238 172 255 213 98 238 156 49 123 106 90 106 41 32 255 255 255 230 106 49 197 74 49 139 57 49 90 57 49 16 16 16 ================================================ FILE: graphics/pokemon/corphish/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 123 16 213 90 8 172 82 8 98 65 49 246 238 197 230 205 148 205 172 106 148 115 65 255 213 90 238 180 65 255 197 65 205 205 205 131 131 131 0 0 0 ================================================ FILE: graphics/pokemon/corphish/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 148 148 213 106 106 180 74 74 139 41 41 255 255 238 255 222 148 255 189 90 213 148 65 255 213 90 255 205 205 255 197 197 205 205 205 131 131 131 0 0 0 ================================================ FILE: graphics/pokemon/corsola/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 222 222 172 172 172 131 131 139 90 90 98 255 213 222 255 172 197 230 106 139 189 57 90 139 16 16 255 0 255 255 0 255 255 0 255 189 57 90 16 16 16 ================================================ FILE: graphics/pokemon/corsola/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 205 230 255 164 189 222 123 148 189 74 98 156 156 238 255 123 205 255 74 156 230 41 106 197 8 65 148 255 0 255 255 0 255 255 0 255 238 98 98 16 16 16 ================================================ FILE: graphics/pokemon/cradily/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 148 230 123 115 180 106 82 131 90 57 90 74 255 213 172 255 172 115 246 106 32 255 246 123 255 222 41 230 172 0 213 213 213 172 172 180 180 82 74 0 0 0 ================================================ FILE: graphics/pokemon/cradily/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 180 189 222 123 156 189 90 123 139 65 65 255 213 172 255 172 115 246 106 32 255 246 156 255 230 41 230 172 0 213 213 213 172 172 180 180 82 74 0 0 0 ================================================ FILE: graphics/pokemon/crawdaunt/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 106 0 189 65 0 139 57 32 246 238 197 230 205 148 197 164 98 148 115 65 255 230 90 246 172 49 82 156 246 65 115 172 197 197 230 24 65 106 0 0 0 ================================================ FILE: graphics/pokemon/crawdaunt/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 148 0 205 106 0 156 74 32 238 238 238 222 222 222 180 189 180 131 139 131 255 238 139 246 197 41 222 156 238 164 90 189 222 156 238 123 65 139 0 0 0 ================================================ FILE: graphics/pokemon/crobat/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 139 246 197 90 205 156 57 180 115 24 148 255 0 255 255 0 255 74 156 189 32 106 148 16 74 115 255 213 0 213 148 0 164 164 164 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/crobat/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 213 238 246 180 197 222 131 148 164 74 106 255 0 255 255 0 255 139 189 32 74 139 0 41 82 0 255 213 0 213 148 0 164 164 164 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/croconaw/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 131 205 255 90 172 230 49 131 197 74 74 131 230 65 32 123 0 0 255 172 90 255 90 32 205 41 24 123 0 0 255 230 98 230 180 82 156 115 8 16 16 16 ================================================ FILE: graphics/pokemon/croconaw/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 164 246 222 115 213 205 74 164 180 49 106 139 230 65 32 123 0 0 98 180 230 57 98 197 49 90 156 32 65 106 255 230 98 230 180 82 156 115 8 16 16 16 ================================================ FILE: graphics/pokemon/cubone/normal.pal ================================================ JASC-PAL 0100 16 74 205 139 222 189 106 197 156 74 148 106 49 82 49 24 238 238 238 205 205 180 139 139 106 90 90 49 246 230 205 255 213 164 230 180 139 255 0 255 255 0 255 41 41 41 255 255 255 ================================================ FILE: graphics/pokemon/cubone/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 172 180 115 131 131 74 74 82 24 49 57 0 230 230 213 197 197 172 139 139 106 90 90 49 255 238 197 238 213 148 205 164 90 255 0 255 255 0 255 41 41 41 255 255 255 ================================================ FILE: graphics/pokemon/cyndaquil/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 98 131 189 65 82 139 41 65 98 24 41 82 255 238 164 230 205 106 180 156 82 139 98 32 255 222 0 255 156 0 255 98 0 238 0 0 139 139 139 16 16 16 ================================================ FILE: graphics/pokemon/cyndaquil/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 156 106 189 98 65 139 65 57 98 57 41 255 230 115 222 197 82 172 139 49 139 82 24 255 222 0 255 156 0 255 98 0 238 0 0 139 139 139 16 16 16 ================================================ FILE: graphics/pokemon/delcatty/normal.pal ================================================ JASC-PAL 0100 16 172 205 139 255 255 255 255 255 156 255 222 98 255 189 65 222 156 65 115 74 82 246 180 197 189 131 90 106 74 156 74 41 123 0 0 0 222 148 164 197 123 139 164 90 106 131 57 74 ================================================ FILE: graphics/pokemon/delcatty/shiny.pal ================================================ JASC-PAL 0100 16 172 205 139 255 255 255 255 255 189 255 255 156 255 222 98 246 172 65 139 82 65 255 180 98 205 123 57 139 106 172 98 65 156 0 0 0 255 123 82 238 82 49 189 65 32 164 49 32 ================================================ FILE: graphics/pokemon/delibird/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 189 106 255 115 16 213 65 0 148 49 0 255 0 255 255 246 139 255 205 65 205 139 41 123 65 0 90 90 90 213 213 213 172 172 180 131 131 131 16 16 16 ================================================ FILE: graphics/pokemon/delibird/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 131 197 205 90 164 148 65 115 90 41 82 255 0 255 255 246 139 255 205 65 205 139 41 123 65 0 139 123 82 238 238 197 213 205 139 148 139 90 49 49 49 ================================================ FILE: graphics/pokemon/deoxys/normal.pal ================================================ JASC-PAL 0100 16 205 205 255 115 74 49 213 106 106 255 131 74 255 172 131 115 213 172 131 164 156 57 98 90 82 74 65 156 156 131 139 8 205 222 106 230 123 115 82 197 197 213 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/deoxys/shiny.pal ================================================ JASC-PAL 0100 16 205 205 255 106 90 24 197 189 65 255 222 57 255 246 139 115 213 172 82 172 123 57 98 90 82 74 65 156 156 131 106 8 156 0 98 230 115 115 106 197 197 213 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/dewgong/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 230 246 238 197 205 238 172 180 205 65 82 131 238 90 57 197 57 65 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 213 205 205 123 115 115 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/dewgong/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 238 238 213 213 205 189 180 172 156 139 131 115 238 90 57 197 57 65 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 213 205 205 131 123 123 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/diglett/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 172 148 255 106 90 213 57 74 230 230 180 180 172 115 131 123 74 90 82 32 123 123 123 16 16 16 222 156 90 197 123 65 164 90 65 106 32 0 255 0 255 ================================================ FILE: graphics/pokemon/diglett/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 123 156 197 82 115 156 41 74 115 230 230 180 180 172 115 131 123 74 90 82 32 123 123 123 16 16 16 230 164 98 197 123 65 164 90 32 106 32 0 255 0 255 ================================================ FILE: graphics/pokemon/ditto/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 0 255 255 0 255 255 0 255 255 0 255 255 246 197 238 238 156 213 213 115 164 180 82 131 115 41 90 0 255 255 0 255 255 0 255 255 0 255 255 49 49 49 255 255 255 ================================================ FILE: graphics/pokemon/ditto/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 0 255 255 0 255 255 0 255 255 0 255 255 139 230 255 106 205 246 74 164 230 32 123 197 24 74 139 0 255 255 0 255 255 0 255 255 0 255 255 49 49 49 255 255 255 ================================================ FILE: graphics/pokemon/dodrio/normal.pal ================================================ JASC-PAL 0100 16 213 213 197 238 180 98 213 148 57 164 123 74 98 74 49 238 222 172 197 180 131 98 90 65 255 205 230 246 131 164 156 57 57 213 205 205 131 131 131 90 82 74 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/dodrio/shiny.pal ================================================ JASC-PAL 0100 16 213 213 197 197 205 74 156 164 32 115 123 0 74 82 0 255 246 139 238 189 82 123 90 0 255 213 230 246 131 164 180 65 65 213 205 205 131 131 131 65 65 65 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/doduo/normal.pal ================================================ JASC-PAL 0100 16 213 213 205 255 0 255 255 0 255 255 0 255 255 0 255 213 164 106 189 139 82 148 98 65 90 65 32 238 222 172 205 180 131 115 106 49 255 0 255 98 98 98 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/doduo/shiny.pal ================================================ JASC-PAL 0100 16 213 213 205 255 0 255 255 0 255 255 0 255 255 0 255 197 205 74 156 164 32 115 123 0 74 82 0 255 246 164 230 205 123 131 106 24 255 0 255 98 98 98 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/donphan/normal.pal ================================================ JASC-PAL 0100 16 230 230 205 255 255 255 164 197 197 123 156 156 82 115 115 49 82 82 230 222 213 213 205 205 172 164 164 131 123 123 197 123 90 148 57 41 222 222 222 189 189 189 90 90 90 16 16 16 ================================================ FILE: graphics/pokemon/donphan/shiny.pal ================================================ JASC-PAL 0100 16 230 230 205 255 255 255 246 189 106 213 148 82 156 82 57 106 74 49 222 222 180 205 205 156 156 156 115 115 115 82 197 123 90 148 57 41 222 222 222 189 189 189 90 90 90 16 16 16 ================================================ FILE: graphics/pokemon/dragonair/normal.pal ================================================ JASC-PAL 0100 16 131 222 131 255 255 255 230 246 246 213 213 230 106 106 123 123 197 246 82 131 205 32 65 139 24 49 90 16 16 16 123 49 123 123 189 246 82 164 213 98 131 164 32 74 115 255 0 255 ================================================ FILE: graphics/pokemon/dragonair/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 222 222 230 180 180 197 106 106 123 255 246 164 246 189 74 213 139 16 131 82 41 16 16 16 123 49 123 230 148 213 205 115 197 156 65 156 90 57 98 255 0 255 ================================================ FILE: graphics/pokemon/dragonite/normal.pal ================================================ JASC-PAL 0100 16 222 189 213 172 148 82 255 230 123 255 205 82 213 180 90 115 98 57 123 197 197 82 164 164 49 115 106 255 246 205 213 213 164 156 156 106 213 213 222 115 115 115 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/dragonite/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 98 115 82 156 180 123 123 156 98 90 106 65 49 57 49 222 156 213 180 115 180 115 74 123 255 246 205 213 213 164 156 156 106 213 213 222 115 115 115 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/dratini/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 238 238 197 205 205 156 123 123 82 255 0 255 255 0 255 255 0 255 255 0 255 139 115 172 139 16 180 197 164 230 164 131 197 115 82 148 57 24 90 16 16 16 ================================================ FILE: graphics/pokemon/dratini/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 238 238 197 197 197 156 123 123 82 255 0 255 255 0 255 255 0 255 255 0 255 189 90 131 139 16 180 238 148 197 205 106 164 164 65 131 123 32 90 16 16 16 ================================================ FILE: graphics/pokemon/drowzee/normal.pal ================================================ JASC-PAL 0100 16 205 205 213 255 255 255 222 205 238 255 0 255 255 0 255 255 0 255 255 0 255 189 139 82 148 106 65 106 82 41 74 49 16 255 238 148 255 222 65 222 189 41 148 106 0 16 16 16 ================================================ FILE: graphics/pokemon/drowzee/shiny.pal ================================================ JASC-PAL 0100 16 222 222 205 255 255 255 222 205 238 255 0 255 255 0 255 255 0 255 255 0 255 189 98 106 148 57 65 106 16 24 65 0 8 246 222 213 230 189 205 189 148 164 123 82 98 16 16 16 ================================================ FILE: graphics/pokemon/dugtrio/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 255 189 172 255 106 90 222 74 98 230 230 180 180 172 115 131 123 74 90 82 32 106 106 106 16 16 16 230 164 98 197 123 65 164 82 65 106 65 24 255 0 255 ================================================ FILE: graphics/pokemon/dugtrio/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 123 156 197 82 115 156 41 74 115 230 230 180 180 172 115 131 123 74 90 82 32 123 123 123 16 16 16 230 164 98 197 123 65 164 90 32 106 32 0 255 0 255 ================================================ FILE: graphics/pokemon/dunsparce/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 32 82 139 74 172 189 131 205 213 189 222 230 90 90 90 139 139 139 197 205 213 106 90 41 189 139 32 222 189 57 230 230 131 246 246 197 255 255 255 ================================================ FILE: graphics/pokemon/dunsparce/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 164 65 74 222 106 123 238 164 164 238 213 197 90 90 90 139 139 139 238 213 197 106 90 41 189 139 32 222 189 57 230 230 131 246 246 197 255 255 255 ================================================ FILE: graphics/pokemon/dusclops/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 82 57 49 90 90 106 255 255 255 106 98 90 139 139 115 180 180 164 148 131 123 213 197 180 172 172 148 0 0 0 0 0 0 0 0 0 255 255 0 255 0 0 24 24 24 ================================================ FILE: graphics/pokemon/dusclops/shiny.pal ================================================ JASC-PAL 0100 16 255 255 255 90 65 57 139 32 0 255 255 255 156 41 16 189 74 49 222 106 82 148 131 123 213 197 180 172 172 148 0 0 0 0 0 0 0 0 0 255 255 0 255 0 0 24 24 24 ================================================ FILE: graphics/pokemon/duskull/normal.pal ================================================ JASC-PAL 0100 16 123 164 172 57 57 49 106 106 90 139 139 123 180 180 148 238 230 189 222 213 172 255 255 230 74 65 65 172 164 123 255 164 172 90 90 82 0 0 0 139 74 90 238 82 24 255 255 255 ================================================ FILE: graphics/pokemon/duskull/shiny.pal ================================================ JASC-PAL 0100 16 123 164 172 90 0 0 156 41 16 189 74 49 222 106 82 238 230 189 222 213 172 255 255 230 74 65 65 172 164 123 255 164 172 123 8 0 0 0 0 139 74 90 238 82 24 255 255 255 ================================================ FILE: graphics/pokemon/dustox/normal.pal ================================================ JASC-PAL 0100 16 148 148 255 90 74 74 131 148 131 156 180 156 0 0 0 180 106 148 213 148 197 230 197 213 180 213 115 197 255 148 189 148 82 238 238 49 205 197 49 246 82 49 197 82 49 24 24 24 ================================================ FILE: graphics/pokemon/dustox/shiny.pal ================================================ JASC-PAL 0100 16 148 148 255 90 74 74 148 98 65 172 123 90 0 0 0 180 106 148 213 148 197 230 197 213 230 172 90 255 230 156 189 148 82 238 238 49 205 197 49 246 82 49 197 82 49 24 24 24 ================================================ FILE: graphics/pokemon/eevee/normal.pal ================================================ JASC-PAL 0100 16 139 205 164 255 255 255 255 246 205 213 205 156 189 172 106 131 115 74 230 0 0 255 0 255 255 0 255 255 0 255 16 16 16 230 180 115 213 156 90 164 115 49 90 74 32 255 0 255 ================================================ FILE: graphics/pokemon/eevee/shiny.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 246 255 255 222 230 246 172 180 213 106 123 148 230 98 41 255 0 255 255 0 255 255 0 255 16 16 16 238 238 213 222 222 205 172 172 172 82 82 82 255 0 255 ================================================ FILE: graphics/pokemon/egg/normal.pal ================================================ JASC-PAL 0100 16 164 255 148 65 74 74 148 156 156 246 246 213 238 230 164 205 197 131 123 205 74 106 148 82 230 0 0 230 0 0 230 0 0 230 0 0 230 0 0 230 0 0 230 0 0 131 230 230 ================================================ FILE: graphics/pokemon/ekans/normal.pal ================================================ JASC-PAL 0100 16 205 205 189 255 255 255 246 115 74 197 65 24 156 41 41 255 0 255 255 230 156 255 213 106 230 164 115 131 82 16 255 0 255 16 16 16 222 164 197 189 115 164 156 74 131 106 32 90 ================================================ FILE: graphics/pokemon/ekans/shiny.pal ================================================ JASC-PAL 0100 16 205 205 189 255 255 255 246 115 74 197 65 24 156 16 0 255 0 255 255 230 156 255 213 106 230 172 90 131 82 16 255 0 255 16 16 16 213 197 98 172 156 57 131 115 16 90 74 0 ================================================ FILE: graphics/pokemon/electabuzz/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 222 222 222 115 106 90 16 16 16 255 0 255 255 0 255 255 172 123 255 82 32 189 49 8 255 0 255 255 255 213 255 255 172 255 230 57 222 189 82 115 90 16 ================================================ FILE: graphics/pokemon/electabuzz/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 222 222 222 115 115 115 16 16 16 255 0 255 255 0 255 255 172 123 255 82 32 189 49 8 255 0 255 255 230 148 255 205 41 238 131 0 205 98 0 164 41 0 ================================================ FILE: graphics/pokemon/electrike/normal.pal ================================================ JASC-PAL 0100 16 197 197 246 65 82 65 82 139 90 106 180 123 156 222 131 255 238 32 213 213 24 172 197 65 148 49 57 213 57 49 0 0 0 0 0 0 0 0 0 255 255 255 197 205 222 24 24 24 ================================================ FILE: graphics/pokemon/electrike/shiny.pal ================================================ JASC-PAL 0100 16 197 197 246 74 74 131 49 123 189 90 156 213 123 197 255 255 238 32 197 213 98 172 197 65 148 49 57 213 57 49 0 0 0 0 0 0 0 0 0 255 255 255 197 205 222 24 24 24 ================================================ FILE: graphics/pokemon/electrode/normal.pal ================================================ JASC-PAL 0100 16 148 189 230 255 255 255 238 238 238 205 205 205 164 156 156 90 82 82 255 0 255 255 0 255 255 0 255 255 0 255 255 180 156 255 123 74 230 65 0 180 49 0 131 16 16 16 16 16 ================================================ FILE: graphics/pokemon/electrode/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 238 238 238 222 222 230 180 172 172 90 82 82 255 0 255 255 0 255 255 0 255 255 0 255 115 197 255 74 156 213 32 115 172 32 74 131 32 32 90 16 16 16 ================================================ FILE: graphics/pokemon/elekid/normal.pal ================================================ JASC-PAL 0100 16 148 205 172 255 255 255 255 230 156 246 197 74 230 172 0 180 106 0 123 82 0 246 148 16 156 49 0 115 16 0 255 0 255 205 205 205 164 164 164 106 106 106 49 49 65 16 16 16 ================================================ FILE: graphics/pokemon/elekid/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 230 82 238 205 65 189 156 24 148 115 0 123 82 0 246 148 16 156 49 0 115 16 0 255 0 255 205 205 205 164 164 164 115 98 49 57 49 32 16 16 16 ================================================ FILE: graphics/pokemon/entei/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 189 98 180 148 74 131 98 32 82 57 0 255 123 41 230 41 0 156 0 0 255 230 148 255 205 0 213 148 0 213 213 213 172 172 172 98 98 98 16 16 16 ================================================ FILE: graphics/pokemon/entei/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 164 115 213 123 82 156 74 49 115 49 41 164 172 189 115 123 139 65 65 74 255 213 172 255 205 0 213 148 0 213 213 213 172 172 172 98 98 98 16 16 16 ================================================ FILE: graphics/pokemon/espeon/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 255 0 255 255 0 255 131 57 65 213 57 65 49 49 49 82 57 106 123 82 180 180 115 230 213 172 230 238 222 238 16 16 16 0 24 148 255 255 255 ================================================ FILE: graphics/pokemon/espeon/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 255 0 255 255 0 255 131 90 0 255 164 65 49 49 49 41 98 41 74 156 65 106 205 74 164 230 90 213 255 156 16 16 16 82 41 90 255 255 255 ================================================ FILE: graphics/pokemon/exeggcute/normal.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 222 222 222 255 205 74 230 156 0 16 16 16 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 222 197 255 189 164 238 156 131 197 131 98 148 49 16 ================================================ FILE: graphics/pokemon/exeggcute/shiny.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 222 222 222 255 205 74 230 156 0 16 16 16 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 255 164 246 238 98 230 197 65 213 164 57 123 90 41 ================================================ FILE: graphics/pokemon/exeggutor/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 255 238 164 255 222 106 230 172 90 131 82 24 180 156 74 139 115 65 90 57 8 189 255 115 156 213 74 115 172 49 82 98 41 222 222 222 98 98 98 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/exeggutor/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 238 164 255 222 106 230 172 90 164 106 32 222 189 82 180 148 32 106 82 0 255 189 123 222 148 82 180 106 41 115 41 0 222 222 222 98 98 98 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/exploud/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 189 238 164 156 222 123 115 180 82 74 139 255 222 90 222 180 74 156 115 24 255 115 82 213 74 49 156 57 24 106 49 24 213 222 255 131 131 131 0 0 0 ================================================ FILE: graphics/pokemon/exploud/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 213 172 189 189 156 164 139 106 123 115 82 90 255 238 172 246 197 82 238 172 24 255 139 82 213 82 49 164 49 24 115 74 0 222 197 222 131 131 131 57 49 74 ================================================ FILE: graphics/pokemon/farfetchd/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 213 213 213 230 230 164 197 197 131 255 222 90 230 172 90 156 115 41 205 255 139 123 205 65 74 131 24 205 189 123 180 148 82 139 90 41 98 65 0 16 16 16 ================================================ FILE: graphics/pokemon/farfetchd/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 213 213 213 230 230 164 197 197 131 255 230 106 230 172 90 189 106 41 205 255 139 139 189 57 98 148 16 246 189 180 213 148 139 172 106 98 131 65 57 16 16 16 ================================================ FILE: graphics/pokemon/fearow/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 238 213 172 197 189 164 98 82 49 16 16 16 255 139 148 246 90 90 205 57 74 255 205 123 246 180 90 213 156 57 172 115 82 123 65 0 246 180 90 255 255 255 ================================================ FILE: graphics/pokemon/fearow/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 222 205 164 197 180 139 98 82 49 16 16 16 255 205 74 255 164 0 197 123 0 255 246 131 255 230 90 213 197 49 180 164 8 115 98 0 246 180 90 255 255 255 ================================================ FILE: graphics/pokemon/feebas/normal.pal ================================================ JASC-PAL 0100 16 49 148 98 90 74 57 180 164 115 213 213 131 238 238 156 115 164 41 164 205 98 148 131 82 180 106 106 230 123 98 82 82 115 164 172 197 205 222 255 230 222 230 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/feebas/shiny.pal ================================================ JASC-PAL 0100 16 49 148 98 98 65 74 172 139 148 205 172 180 238 205 213 115 164 41 164 205 98 139 106 115 180 106 106 230 123 98 82 82 115 164 172 197 205 222 255 230 222 230 255 255 255 41 41 41 ================================================ FILE: graphics/pokemon/feraligatr/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 131 205 255 90 172 230 49 131 197 74 74 131 197 197 197 255 172 90 255 90 32 205 41 24 123 0 0 255 255 156 255 213 82 205 172 65 156 115 8 16 16 16 ================================================ FILE: graphics/pokemon/feraligatr/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 115 238 222 82 205 197 74 156 164 41 98 123 197 197 197 106 156 246 49 98 213 41 65 156 0 49 90 255 255 156 246 222 115 213 180 74 156 115 8 16 16 16 ================================================ FILE: graphics/pokemon/flaaffy/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 205 205 222 156 156 180 115 115 139 74 74 74 255 197 164 255 148 123 238 90 65 205 57 24 172 0 0 131 197 255 82 131 197 41 65 139 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/flaaffy/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 222 205 189 180 148 148 131 82 106 82 49 255 222 238 255 197 213 230 139 156 180 98 106 148 65 74 98 230 16 49 180 0 32 106 0 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/flareon/normal.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 255 238 106 255 230 41 222 197 32 148 115 8 255 0 255 255 0 255 255 0 255 115 115 123 16 16 16 255 0 255 255 172 49 255 123 0 230 65 0 131 32 32 ================================================ FILE: graphics/pokemon/flareon/shiny.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 255 255 197 255 255 57 238 205 8 164 106 0 255 0 255 255 0 255 255 0 255 115 115 123 16 16 16 255 0 255 246 189 65 222 164 41 172 115 8 98 57 24 ================================================ FILE: graphics/pokemon/flygon/normal.pal ================================================ JASC-PAL 0100 16 148 197 148 74 106 24 156 49 49 123 156 65 49 90 90 213 255 131 172 222 115 156 189 98 148 213 156 106 164 115 90 131 90 255 180 180 230 115 115 205 49 49 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/flygon/shiny.pal ================================================ JASC-PAL 0100 16 148 197 148 74 106 24 139 82 0 123 156 65 8 90 139 213 255 131 172 222 115 156 189 98 106 189 238 74 156 205 41 123 172 255 197 82 222 164 49 189 131 16 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/forretress/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 98 41 90 172 74 139 197 131 189 230 180 230 246 222 238 255 0 255 255 0 255 131 16 49 189 41 65 246 98 115 255 189 205 255 0 255 255 255 255 ================================================ FILE: graphics/pokemon/forretress/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 115 82 49 180 156 74 222 197 106 246 230 139 255 246 156 255 0 255 255 0 255 82 65 32 106 74 49 180 139 65 222 197 98 255 0 255 255 255 255 ================================================ FILE: graphics/pokemon/furret/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 255 197 255 238 148 230 197 74 197 156 65 172 131 41 156 98 74 123 65 57 74 24 24 197 49 24 156 0 0 255 148 98 115 115 115 65 65 65 32 32 41 ================================================ FILE: graphics/pokemon/furret/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 246 230 255 230 222 222 189 172 230 98 139 148 123 90 197 65 115 164 32 90 131 0 65 197 49 24 156 0 0 255 148 98 115 115 115 65 65 65 32 32 41 ================================================ FILE: graphics/pokemon/gardevoir/normal.pal ================================================ JASC-PAL 0100 16 156 164 82 238 238 255 197 205 222 164 180 205 131 148 180 123 82 82 115 41 57 255 156 131 230 82 57 131 205 255 255 255 255 205 255 172 148 230 148 115 189 115 49 123 74 16 16 16 ================================================ FILE: graphics/pokemon/gardevoir/shiny.pal ================================================ JASC-PAL 0100 16 156 164 82 238 238 255 213 189 222 180 164 205 156 131 180 123 82 82 115 41 57 255 197 90 230 131 32 131 205 255 197 238 246 189 230 255 123 197 238 82 172 213 32 115 123 16 16 16 ================================================ FILE: graphics/pokemon/gastly/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 222 222 222 222 82 57 180 41 16 255 0 255 189 148 180 139 98 131 115 74 106 82 49 90 213 172 205 189 148 180 139 98 131 255 0 255 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/gastly/shiny.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 222 222 222 222 82 57 180 41 16 255 0 255 172 131 230 148 115 197 90 57 148 82 41 98 156 222 255 115 180 213 74 139 172 255 0 255 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/gengar/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 222 222 222 123 123 123 255 180 123 238 98 74 205 57 32 255 0 255 255 0 255 255 0 255 255 0 255 197 131 180 156 106 131 106 90 98 90 49 90 16 16 16 ================================================ FILE: graphics/pokemon/gengar/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 222 222 222 123 123 123 255 172 213 238 131 172 197 90 131 255 0 255 255 0 255 255 0 255 255 0 255 164 164 189 123 123 148 82 82 106 41 41 65 16 16 16 ================================================ FILE: graphics/pokemon/geodude/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 205 205 205 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 205 213 131 172 180 98 123 131 90 65 74 16 16 16 16 ================================================ FILE: graphics/pokemon/geodude/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 205 205 205 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 238 189 49 205 164 24 164 123 0 106 65 0 16 16 16 ================================================ FILE: graphics/pokemon/girafarig/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 65 49 32 90 82 57 123 106 57 164 148 82 213 205 139 189 139 16 238 180 49 255 222 65 255 246 123 16 16 16 238 106 115 255 172 189 180 213 230 255 0 255 ================================================ FILE: graphics/pokemon/girafarig/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 65 49 32 90 65 41 123 90 49 156 123 65 205 172 106 189 139 16 230 156 41 246 197 57 255 230 82 16 16 16 82 164 230 164 213 255 180 213 230 255 0 255 ================================================ FILE: graphics/pokemon/glalie/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 230 246 205 205 222 164 164 189 123 123 148 82 82 106 164 205 255 123 164 230 74 139 197 255 0 255 205 205 213 164 164 172 123 123 131 82 82 90 41 41 57 ================================================ FILE: graphics/pokemon/glalie/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 246 255 213 230 238 180 197 205 148 164 172 74 98 106 255 148 90 230 74 65 205 8 41 255 0 255 205 205 213 164 164 172 123 123 131 82 82 90 0 0 0 ================================================ FILE: graphics/pokemon/gligar/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 90 90 90 148 148 148 90 65 123 115 90 164 180 131 213 222 189 255 246 222 255 24 49 115 16 90 148 74 139 189 98 197 238 213 90 57 255 148 106 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/gligar/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 90 90 90 148 148 148 57 65 123 82 98 172 131 156 213 180 197 255 222 238 246 24 49 98 32 65 139 65 90 180 82 156 222 213 90 57 255 148 106 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/gloom/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 246 238 189 255 189 65 255 115 0 197 106 41 180 90 197 213 205 180 205 115 74 172 82 57 131 57 24 98 49 0 156 164 205 123 131 164 74 90 123 16 49 74 16 16 16 ================================================ FILE: graphics/pokemon/gloom/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 246 246 246 255 213 131 255 172 90 213 131 49 156 49 0 213 213 213 238 180 98 197 139 57 156 98 16 115 57 16 180 189 131 139 148 90 98 106 49 57 65 8 16 16 16 ================================================ FILE: graphics/pokemon/golbat/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 213 213 213 98 98 98 0 0 0 172 205 255 139 180 238 98 131 205 57 57 123 205 106 180 172 82 156 148 57 123 98 16 82 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/pokemon/golbat/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 213 213 213 98 98 98 0 0 0 164 189 57 123 148 0 82 106 0 41 65 0 255 180 172 238 139 131 197 98 90 139 41 32 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/pokemon/goldeen/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 222 222 230 189 189 197 139 139 148 98 98 106 255 197 123 238 123 65 213 65 16 180 49 0 131 16 0 238 123 65 213 65 16 65 172 164 0 106 98 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/goldeen/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 222 222 230 189 189 197 139 139 148 98 98 106 255 222 24 255 156 8 213 115 0 172 74 0 131 32 0 255 180 139 213 139 98 65 172 164 0 106 98 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/golduck/normal.pal ================================================ JASC-PAL 0100 16 98 213 131 255 255 255 213 213 213 255 172 172 222 24 24 139 0 0 255 255 164 213 213 106 164 164 57 115 115 16 255 0 255 164 197 255 139 172 213 123 123 180 49 82 106 16 16 16 ================================================ FILE: graphics/pokemon/golduck/shiny.pal ================================================ JASC-PAL 0100 16 238 238 238 255 255 255 197 197 197 238 49 74 222 24 24 139 0 0 246 189 197 222 123 148 189 98 106 123 74 90 255 0 255 115 205 255 74 164 230 32 123 189 0 49 106 16 16 16 ================================================ FILE: graphics/pokemon/golem/normal.pal ================================================ JASC-PAL 0100 16 115 197 164 255 255 255 222 222 222 180 0 0 255 82 82 180 189 98 148 164 98 106 123 65 74 82 16 238 205 115 213 180 90 156 139 57 82 65 8 255 0 255 115 115 115 16 16 16 ================================================ FILE: graphics/pokemon/golem/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 205 205 205 180 0 0 255 82 82 213 148 82 172 106 41 131 65 0 98 32 0 255 213 180 230 172 139 189 131 98 131 74 41 255 0 255 131 131 131 16 16 16 ================================================ FILE: graphics/pokemon/gorebyss/normal.pal ================================================ JASC-PAL 0100 16 148 197 197 255 255 255 230 222 213 205 189 172 255 205 205 246 172 189 238 131 172 213 98 148 148 74 90 131 90 131 98 57 106 123 106 98 0 0 0 205 115 255 172 106 213 148 90 172 ================================================ FILE: graphics/pokemon/gorebyss/shiny.pal ================================================ JASC-PAL 0100 16 148 197 197 255 255 255 230 222 213 205 189 172 255 246 180 255 222 98 246 189 74 213 156 41 148 106 32 131 90 131 98 57 106 123 106 98 0 0 0 205 115 255 172 106 213 148 90 172 ================================================ FILE: graphics/pokemon/granbull/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 90 57 82 156 98 148 213 115 213 230 156 238 238 189 255 255 0 255 131 57 0 230 197 131 16 16 16 49 57 65 82 90 90 164 164 156 255 255 255 ================================================ FILE: graphics/pokemon/granbull/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 98 82 65 148 115 90 205 172 131 230 205 172 246 222 189 255 0 255 90 82 0 205 189 106 16 16 16 49 57 65 82 90 90 164 164 156 255 255 255 ================================================ FILE: graphics/pokemon/graveler/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 205 205 205 148 148 148 16 16 16 238 49 49 189 32 57 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 197 213 131 164 180 115 115 131 82 82 74 16 ================================================ FILE: graphics/pokemon/graveler/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 205 205 205 148 148 148 16 16 16 238 49 49 189 32 57 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 205 148 41 164 106 0 123 65 0 82 24 0 ================================================ FILE: graphics/pokemon/grimer/normal.pal ================================================ JASC-PAL 0100 16 238 238 238 213 213 222 172 180 189 131 139 156 65 74 90 230 189 222 197 156 180 148 106 156 90 49 115 238 222 238 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/grimer/shiny.pal ================================================ JASC-PAL 0100 16 238 238 238 213 213 222 172 180 189 131 139 156 65 74 90 197 238 156 180 213 139 139 172 98 82 115 41 222 246 180 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/groudon/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 205 57 74 172 148 164 156 123 139 123 90 98 255 123 131 123 32 41 255 32 41 172 41 57 255 205 49 197 197 205 255 255 255 255 189 189 156 106 49 57 57 57 16 16 16 ================================================ FILE: graphics/pokemon/groudon/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 131 131 8 172 148 164 156 123 139 123 90 98 230 230 106 98 98 0 197 197 74 164 164 41 255 205 49 197 197 205 255 255 255 255 255 139 156 106 49 57 57 57 16 16 16 ================================================ FILE: graphics/pokemon/grovyle/normal.pal ================================================ JASC-PAL 0100 16 197 148 131 16 82 74 90 180 106 139 230 148 189 255 180 57 131 65 131 41 49 230 65 41 255 115 82 255 222 82 57 131 148 189 65 65 213 139 82 82 164 189 0 0 0 255 238 255 ================================================ FILE: graphics/pokemon/grovyle/shiny.pal ================================================ JASC-PAL 0100 16 197 148 131 148 74 49 74 164 148 148 205 213 180 230 238 65 123 115 205 156 123 238 189 156 255 238 197 255 222 82 213 82 57 180 131 98 213 139 82 255 106 82 0 0 0 255 238 255 ================================================ FILE: graphics/pokemon/growlithe/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 246 222 222 213 106 106 106 255 0 255 255 0 255 255 0 255 255 246 180 230 213 148 205 180 115 115 98 32 255 197 82 238 139 74 197 82 32 115 57 16 16 16 16 ================================================ FILE: graphics/pokemon/growlithe/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 246 222 222 213 82 82 82 255 0 255 255 0 255 255 0 255 255 246 180 230 213 148 180 164 106 115 98 32 255 238 82 230 197 41 189 156 0 123 90 0 16 16 16 ================================================ FILE: graphics/pokemon/grumpig/normal.pal ================================================ JASC-PAL 0100 16 148 197 148 148 148 148 123 123 123 98 98 98 74 74 74 255 180 213 238 139 172 213 106 131 230 172 238 205 139 213 180 115 189 123 82 139 156 74 98 246 205 255 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/grumpig/shiny.pal ================================================ JASC-PAL 0100 16 148 197 148 172 172 172 131 131 131 82 82 82 57 57 57 255 180 213 238 139 172 213 106 131 246 222 106 213 189 65 189 164 41 131 123 0 156 74 98 255 238 172 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/gulpin/normal.pal ================================================ JASC-PAL 0100 16 98 189 131 74 106 57 131 164 115 164 222 148 197 238 180 156 189 139 65 65 65 106 106 106 156 156 156 172 148 74 205 172 16 246 222 90 255 238 164 255 148 123 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon/gulpin/shiny.pal ================================================ JASC-PAL 0100 16 98 189 131 74 106 57 98 123 164 131 180 238 156 213 255 98 148 197 65 65 65 106 106 106 156 156 156 164 49 32 180 65 49 222 98 49 255 139 82 255 148 123 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon/gyarados/normal.pal ================================================ JASC-PAL 0100 16 139 213 180 222 230 246 172 180 197 106 123 148 139 189 255 115 156 230 123 131 164 57 57 98 255 230 156 197 197 123 98 106 57 255 131 123 205 49 49 148 32 0 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/gyarados/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 222 230 246 172 180 197 106 123 148 255 197 90 255 139 65 213 90 49 123 57 57 255 255 148 205 205 131 106 106 90 255 98 57 205 49 49 148 32 0 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/hariyama/normal.pal ================================================ JASC-PAL 0100 16 115 164 115 246 230 197 230 213 164 197 172 115 139 106 82 238 164 106 213 131 90 172 98 65 131 74 49 98 98 148 49 49 98 246 213 115 238 189 82 205 156 65 24 24 24 255 255 255 ================================================ FILE: graphics/pokemon/hariyama/shiny.pal ================================================ JASC-PAL 0100 16 115 164 115 255 238 172 246 205 131 246 189 82 205 139 57 222 189 197 189 156 164 156 106 131 115 82 90 98 98 148 49 49 98 255 90 74 205 82 65 156 82 65 24 24 24 255 255 255 ================================================ FILE: graphics/pokemon/haunter/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 197 148 222 148 106 180 98 82 131 90 57 115 255 0 255 255 0 255 255 0 255 255 0 255 222 49 49 180 24 24 98 16 16 222 222 222 115 115 115 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/haunter/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 213 164 222 197 131 205 131 90 164 82 49 98 255 0 255 255 0 255 255 0 255 255 0 255 74 156 197 32 115 156 0 65 106 213 213 213 115 115 115 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/heracross/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 156 180 255 123 139 222 98 106 180 49 57 98 255 0 255 255 255 139 255 222 90 197 164 41 139 106 0 255 0 255 213 213 213 156 156 156 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/heracross/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 156 213 205 123 189 164 82 156 98 57 98 255 0 255 255 255 139 255 222 90 197 164 41 139 106 0 255 0 255 213 213 213 156 156 156 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/hitmonchan/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 222 205 222 197 180 197 164 148 164 115 98 115 255 148 90 230 98 57 189 49 16 139 32 0 255 0 255 238 213 156 205 180 123 164 139 82 106 82 16 16 16 16 ================================================ FILE: graphics/pokemon/hitmonchan/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 222 205 222 197 180 197 164 148 164 115 98 115 90 148 213 49 106 172 8 65 131 0 24 90 255 0 255 238 230 139 197 189 98 156 148 57 98 90 0 16 16 16 ================================================ FILE: graphics/pokemon/hitmonlee/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 230 180 148 205 164 131 164 123 90 131 90 57 98 57 24 255 0 255 255 0 255 230 230 189 197 189 164 115 98 98 255 238 139 238 205 115 115 123 32 41 41 41 255 255 255 ================================================ FILE: graphics/pokemon/hitmonlee/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 172 180 74 131 139 32 90 98 0 49 57 0 32 41 0 255 0 255 255 0 255 189 164 139 148 123 98 106 82 57 238 255 148 197 205 115 115 123 32 41 41 41 255 255 255 ================================================ FILE: graphics/pokemon/hitmontop/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 238 156 230 205 123 189 164 82 131 98 16 255 0 255 139 213 255 98 172 238 74 131 205 82 90 148 255 0 255 205 205 205 148 148 156 98 98 106 16 16 16 ================================================ FILE: graphics/pokemon/hitmontop/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 246 205 230 222 180 180 172 148 131 90 65 255 0 255 246 148 222 205 106 189 172 74 164 115 49 123 255 0 255 205 205 205 148 148 156 98 98 106 16 16 16 ================================================ FILE: graphics/pokemon/ho_oh/normal.pal ================================================ JASC-PAL 0100 16 205 205 164 255 255 255 255 172 0 255 90 0 205 65 0 156 16 0 255 238 131 255 230 0 230 172 0 164 106 0 156 246 172 65 213 82 16 148 16 197 197 197 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/ho_oh/shiny.pal ================================================ JASC-PAL 0100 16 205 205 164 255 255 255 255 230 57 255 172 24 205 123 24 148 74 49 238 238 238 222 222 222 180 180 189 123 123 139 255 172 0 255 74 0 156 41 24 213 213 222 123 106 65 16 16 16 ================================================ FILE: graphics/pokemon/hoothoot/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 255 189 230 246 164 222 213 90 205 189 41 172 156 32 148 131 24 123 106 16 90 74 0 255 230 172 255 180 106 230 123 41 123 123 123 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/hoothoot/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 189 238 238 106 255 238 115 246 222 57 230 189 49 213 148 41 197 131 32 139 82 32 255 230 172 255 180 106 230 123 41 123 123 123 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/hoppip/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 156 115 255 98 82 213 65 16 164 16 0 255 0 255 131 230 57 98 205 57 65 164 32 32 98 16 255 0 255 255 255 82 246 197 0 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/hoppip/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 148 205 32 106 180 8 90 139 41 57 90 16 255 0 255 189 246 57 131 222 57 82 172 24 32 98 16 255 0 255 255 255 82 246 197 0 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/horsea/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 0 255 255 0 255 98 82 41 156 131 74 189 222 255 164 197 238 131 148 180 57 82 98 255 255 172 230 205 74 255 115 115 197 41 41 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/horsea/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 0 255 255 0 255 123 82 41 172 123 82 115 205 213 74 164 172 32 123 131 16 74 82 255 197 172 238 172 139 255 115 115 197 41 41 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/houndoom/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 139 123 123 82 74 74 57 49 49 41 32 32 255 213 139 238 164 82 189 123 57 148 82 24 255 106 49 180 49 8 255 0 255 255 0 255 180 164 164 16 16 16 ================================================ FILE: graphics/pokemon/houndoom/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 123 156 230 74 98 180 49 65 139 65 74 90 255 230 197 213 172 148 172 131 90 123 82 65 255 106 49 180 49 8 255 0 255 255 0 255 222 197 213 16 16 16 ================================================ FILE: graphics/pokemon/houndour/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 139 123 123 82 74 74 57 49 49 41 32 32 255 213 139 238 164 82 189 123 57 148 82 24 255 106 49 180 49 8 255 0 255 255 0 255 180 164 164 16 16 16 ================================================ FILE: graphics/pokemon/houndour/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 123 164 197 82 123 164 57 82 115 49 65 82 255 230 197 213 172 148 172 131 90 123 82 65 255 106 49 180 49 8 255 0 255 255 0 255 222 189 197 16 16 16 ================================================ FILE: graphics/pokemon/huntail/normal.pal ================================================ JASC-PAL 0100 16 49 106 189 255 255 255 238 180 98 222 148 0 156 106 65 180 238 238 156 222 246 123 197 222 74 156 180 49 98 123 0 0 0 255 131 148 205 115 148 148 57 90 213 197 213 164 131 148 ================================================ FILE: graphics/pokemon/huntail/shiny.pal ================================================ JASC-PAL 0100 16 49 106 189 255 255 255 255 222 115 230 156 0 164 115 65 172 255 172 148 230 148 115 197 115 57 148 82 32 106 57 0 0 0 255 131 148 205 115 148 148 57 90 213 197 213 164 131 148 ================================================ FILE: graphics/pokemon/hypno/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 255 238 156 255 222 98 205 180 106 98 74 32 189 156 82 213 197 222 115 106 131 255 0 255 255 0 255 255 0 255 255 0 255 156 156 156 98 98 98 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/hypno/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 180 213 238 139 172 197 98 131 123 57 57 172 98 106 213 213 222 115 106 131 255 0 255 255 0 255 255 0 255 255 0 255 156 156 156 98 98 98 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/icon_palettes/icon_palette_0.pal ================================================ JASC-PAL 0100 16 98 156 131 131 131 115 189 189 189 255 255 255 189 164 65 246 246 41 213 98 65 246 148 41 139 123 255 98 74 205 238 115 156 255 180 164 164 197 255 106 172 156 98 98 90 65 65 65 ================================================ FILE: graphics/pokemon/icon_palettes/icon_palette_1.pal ================================================ JASC-PAL 0100 16 98 156 131 115 115 115 189 189 189 255 255 255 123 156 74 156 205 74 148 246 74 238 115 156 246 148 246 189 164 90 246 230 41 246 246 172 213 213 106 230 74 41 98 98 90 65 65 65 ================================================ FILE: graphics/pokemon/icon_palettes/icon_palette_2.pal ================================================ JASC-PAL 0100 16 98 156 131 123 123 123 189 189 180 255 255 255 115 115 205 164 172 246 180 131 90 238 197 139 197 172 41 246 246 41 246 98 82 148 123 205 197 164 205 189 41 156 98 98 90 65 65 65 ================================================ FILE: graphics/pokemon/igglybuff/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 205 156 255 148 115 222 115 65 197 74 0 148 32 16 255 230 180 255 0 255 205 0 0 156 0 0 205 0 0 156 0 0 98 0 0 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/igglybuff/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 213 238 246 172 197 222 115 139 180 57 90 156 24 49 255 238 238 255 0 255 205 0 0 156 0 0 90 197 24 74 172 24 41 82 0 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/illumise/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 0 90 213 123 123 123 74 74 74 0 0 0 205 139 222 180 98 205 139 82 156 49 41 49 255 230 115 230 180 74 156 131 82 172 197 238 139 172 205 90 106 139 255 255 255 ================================================ FILE: graphics/pokemon/illumise/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 0 90 213 123 123 123 74 74 74 0 0 0 255 230 115 230 180 74 189 139 82 49 41 49 255 148 82 222 90 32 164 49 32 131 205 255 90 172 230 32 115 189 255 255 255 ================================================ FILE: graphics/pokemon/ivysaur/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 98 139 49 255 189 180 255 123 123 213 90 139 139 230 222 123 205 189 131 230 90 115 189 41 82 139 148 16 16 16 24 90 82 205 123 57 139 90 57 189 41 65 ================================================ FILE: graphics/pokemon/ivysaur/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 90 139 49 255 255 82 255 222 8 222 180 0 205 238 65 164 213 49 123 222 32 82 180 0 123 172 8 16 16 16 74 90 24 222 139 65 180 131 16 139 115 16 ================================================ FILE: graphics/pokemon/jigglypuff/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 205 189 255 148 131 255 115 98 222 65 49 156 156 106 32 115 65 24 230 230 230 164 49 0 213 57 49 16 16 16 255 205 197 255 172 164 230 115 115 164 74 74 ================================================ FILE: graphics/pokemon/jigglypuff/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 164 230 148 98 230 131 90 197 106 57 156 65 156 106 32 115 65 24 230 230 230 164 49 0 213 57 49 16 16 16 255 222 238 246 189 230 222 156 189 131 82 106 ================================================ FILE: graphics/pokemon/jirachi/normal.pal ================================================ JASC-PAL 0100 16 115 197 164 205 213 222 156 164 172 41 65 115 230 238 246 82 115 255 131 164 255 106 115 115 197 0 0 238 82 82 180 139 49 230 197 82 255 230 90 255 246 148 255 255 255 0 0 0 ================================================ FILE: graphics/pokemon/jirachi/shiny.pal ================================================ JASC-PAL 0100 16 115 197 164 255 180 164 156 164 172 41 65 115 255 230 230 230 74 49 255 123 106 123 98 90 197 0 0 238 82 82 180 139 49 230 197 82 255 230 90 255 246 148 255 255 255 0 0 0 ================================================ FILE: graphics/pokemon/jolteon/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 246 238 115 255 222 49 213 189 49 156 139 57 106 82 32 255 0 255 189 49 49 106 0 0 255 0 255 255 0 255 222 230 222 139 148 164 98 98 98 41 41 41 255 255 255 ================================================ FILE: graphics/pokemon/jolteon/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 222 255 131 197 238 32 156 197 0 123 164 0 74 115 0 255 0 255 189 49 49 106 0 0 255 0 255 255 0 255 222 222 230 139 148 164 98 98 98 41 41 41 255 255 255 ================================================ FILE: graphics/pokemon/jumpluff/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 98 65 8 123 164 255 90 131 213 65 106 197 57 82 148 16 16 16 255 255 222 246 238 180 238 222 148 205 189 115 156 139 82 255 139 41 213 65 0 65 230 57 49 156 49 ================================================ FILE: graphics/pokemon/jumpluff/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 115 57 98 255 205 172 246 164 164 222 123 156 164 74 106 16 16 16 255 238 246 246 213 238 222 172 213 205 139 172 164 98 164 255 139 41 213 65 0 65 230 57 49 156 49 ================================================ FILE: graphics/pokemon/jynx/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 213 213 213 98 98 115 213 139 238 172 106 197 148 74 172 255 164 156 238 65 65 180 74 74 106 8 0 255 246 172 255 238 82 213 197 57 123 106 24 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/jynx/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 213 213 213 98 98 115 213 139 238 172 106 197 148 74 172 255 172 230 255 131 189 213 90 148 148 24 82 255 230 222 213 189 180 172 148 139 115 90 82 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/kabuto/normal.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 180 180 180 255 197 197 238 74 65 255 0 255 255 255 139 255 213 49 222 180 41 164 106 0 255 0 255 230 172 65 189 139 41 156 98 24 106 57 8 16 16 16 ================================================ FILE: graphics/pokemon/kabuto/shiny.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 180 180 180 255 172 164 238 74 65 255 0 255 255 255 139 255 213 49 238 180 32 164 106 0 255 0 255 180 230 74 156 205 57 115 164 32 82 123 16 16 16 16 ================================================ FILE: graphics/pokemon/kabutops/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 230 222 197 189 189 180 156 156 148 106 106 106 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 246 222 148 222 189 115 172 148 90 90 74 24 16 16 16 ================================================ FILE: graphics/pokemon/kabutops/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 222 222 213 189 189 180 156 156 148 106 106 106 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 222 255 90 189 222 74 148 180 41 82 115 0 16 16 16 ================================================ FILE: graphics/pokemon/kadabra/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 90 90 90 246 139 139 230 57 41 213 180 82 172 131 41 139 82 16 106 65 8 222 222 222 180 180 180 255 255 189 255 238 41 222 189 16 131 106 16 16 16 16 ================================================ FILE: graphics/pokemon/kadabra/shiny.pal ================================================ JASC-PAL 0100 16 106 205 148 255 255 255 90 90 90 246 139 139 246 65 49 230 164 180 205 123 172 156 82 115 90 49 49 222 222 222 180 180 180 255 255 197 255 238 139 246 189 82 123 98 0 16 16 16 ================================================ FILE: graphics/pokemon/kakuna/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 230 156 246 222 90 205 189 82 164 139 24 139 123 0 255 0 255 255 0 255 255 0 255 115 115 115 57 57 57 16 16 16 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/pokemon/kakuna/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 238 90 197 230 49 156 189 8 115 148 0 74 106 0 255 0 255 255 0 255 255 0 255 106 106 106 57 57 57 16 16 16 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/pokemon/kangaskhan/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 213 213 213 255 246 139 222 213 106 189 24 24 16 16 16 222 180 213 164 115 156 180 189 131 139 148 98 106 106 82 213 189 131 189 164 106 156 115 90 82 65 16 ================================================ FILE: graphics/pokemon/kangaskhan/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 213 213 213 255 255 148 238 205 106 189 24 24 16 16 16 238 205 180 189 156 139 139 156 82 98 115 41 57 74 0 238 222 180 213 205 156 172 164 115 98 90 49 ================================================ FILE: graphics/pokemon/kecleon/normal.pal ================================================ JASC-PAL 0100 16 156 255 255 65 98 65 82 139 90 98 180 131 123 213 139 164 238 156 255 255 255 139 74 57 189 90 65 238 106 74 197 172 74 222 197 90 246 238 123 139 123 90 172 197 123 0 0 0 ================================================ FILE: graphics/pokemon/kecleon/shiny.pal ================================================ JASC-PAL 0100 16 156 255 255 65 98 65 82 139 90 98 180 131 123 213 139 164 238 156 255 255 255 49 131 197 90 172 230 123 197 255 238 156 74 255 180 74 255 255 180 139 123 90 172 197 123 0 0 0 ================================================ FILE: graphics/pokemon/kingdra/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 222 246 156 189 246 74 156 189 74 74 131 255 0 255 246 106 82 189 57 49 255 255 156 246 230 74 230 172 57 172 106 0 213 213 213 123 123 123 16 16 16 ================================================ FILE: graphics/pokemon/kingdra/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 197 238 213 172 230 156 115 180 106 65 123 255 0 255 131 205 24 82 156 24 255 255 156 246 230 74 230 172 57 172 106 0 213 213 213 123 123 123 16 16 16 ================================================ FILE: graphics/pokemon/kingler/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 255 156 98 238 106 41 180 98 57 139 49 32 246 213 156 230 189 139 189 139 82 98 74 16 213 164 106 255 16 255 255 16 255 255 16 255 222 222 246 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/kingler/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 180 189 123 139 148 82 98 106 41 57 65 41 222 230 65 197 189 32 156 148 0 115 106 0 180 164 16 255 16 255 255 16 255 255 16 255 222 222 246 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/kirlia/normal.pal ================================================ JASC-PAL 0100 16 156 164 82 238 238 255 197 205 222 164 180 205 131 148 180 123 82 82 115 41 57 255 156 131 230 82 57 106 123 148 255 255 255 205 255 172 148 230 148 115 189 115 49 123 74 16 16 16 ================================================ FILE: graphics/pokemon/kirlia/shiny.pal ================================================ JASC-PAL 0100 16 156 164 82 238 238 255 213 189 222 180 164 205 156 131 180 123 82 82 115 41 57 255 197 90 230 131 32 106 123 148 197 238 246 189 230 255 123 197 238 82 172 213 32 115 123 16 16 16 ================================================ FILE: graphics/pokemon/koffing/normal.pal ================================================ JASC-PAL 0100 16 164 205 197 255 255 255 222 222 222 246 238 148 213 205 106 238 65 65 197 24 32 255 0 255 255 0 255 238 213 106 197 180 41 222 139 213 189 123 180 156 82 148 106 49 98 16 16 16 ================================================ FILE: graphics/pokemon/koffing/shiny.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 222 222 222 246 238 148 213 205 106 255 98 74 213 57 32 255 0 255 255 0 255 205 139 164 148 82 123 164 222 205 148 189 189 106 148 148 41 82 82 16 16 16 ================================================ FILE: graphics/pokemon/krabby/normal.pal ================================================ JASC-PAL 0100 16 213 213 197 255 255 255 222 222 222 255 0 255 238 205 148 230 189 123 180 148 65 115 82 16 255 0 255 255 0 255 255 0 255 255 156 115 238 82 32 189 82 24 139 32 24 16 16 16 ================================================ FILE: graphics/pokemon/krabby/shiny.pal ================================================ JASC-PAL 0100 16 213 213 197 255 255 255 222 222 222 255 0 255 255 246 205 222 205 164 180 164 123 115 98 57 255 0 255 255 0 255 255 0 255 255 222 74 213 180 32 172 139 0 131 98 0 16 16 16 ================================================ FILE: graphics/pokemon/kyogre/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 255 205 49 205 189 205 156 139 148 90 82 106 41 82 148 115 41 57 255 8 16 189 32 41 131 205 255 222 222 222 90 164 255 74 131 213 57 98 180 49 57 115 16 16 16 ================================================ FILE: graphics/pokemon/kyogre/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 255 205 49 222 205 222 156 139 148 90 82 106 164 24 156 115 41 57 255 8 16 189 32 41 255 156 255 246 246 246 255 123 255 230 90 222 197 57 189 131 0 123 16 16 16 ================================================ FILE: graphics/pokemon/lairon/normal.pal ================================================ JASC-PAL 0100 16 148 172 156 74 74 65 106 106 106 139 139 139 172 172 172 57 57 65 123 106 106 156 139 139 189 172 172 222 205 205 255 255 255 172 57 74 222 106 106 255 131 131 106 189 255 0 0 0 ================================================ FILE: graphics/pokemon/lairon/shiny.pal ================================================ JASC-PAL 0100 16 148 172 156 32 90 90 65 123 115 90 156 148 148 197 205 74 41 24 123 123 90 156 156 123 189 189 156 222 222 197 255 255 255 172 57 74 222 106 106 255 131 131 255 123 82 0 0 0 ================================================ FILE: graphics/pokemon/lanturn/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 172 172 172 164 205 255 139 172 255 98 139 230 57 106 205 0 82 139 255 238 123 255 230 82 213 180 90 180 139 57 131 82 8 16 16 16 255 115 0 180 0 0 ================================================ FILE: graphics/pokemon/lanturn/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 172 172 172 230 156 255 205 131 246 164 98 222 131 65 197 106 41 139 255 255 106 238 238 65 180 180 41 139 139 8 90 90 8 16 16 16 255 115 0 205 49 0 ================================================ FILE: graphics/pokemon/lapras/normal.pal ================================================ JASC-PAL 0100 16 148 213 172 255 255 255 230 90 41 164 0 0 255 238 148 230 197 106 131 106 49 238 222 213 213 197 189 164 148 139 98 82 90 156 205 246 115 180 230 115 139 197 49 74 106 41 41 41 ================================================ FILE: graphics/pokemon/lapras/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 230 90 41 164 0 0 238 205 213 222 172 180 139 82 106 238 222 213 213 197 189 164 148 139 98 82 90 205 189 246 172 156 230 131 98 189 82 65 139 41 41 41 ================================================ FILE: graphics/pokemon/larvitar/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 197 238 197 180 222 180 123 172 123 74 98 74 255 0 255 255 164 90 238 82 41 189 57 32 106 32 0 255 0 255 255 0 255 197 197 197 98 98 98 16 16 16 ================================================ FILE: graphics/pokemon/larvitar/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 246 82 205 222 74 156 172 41 90 115 0 255 0 255 230 156 172 189 98 131 148 57 98 90 41 65 255 0 255 255 0 255 197 197 197 98 98 98 16 16 16 ================================================ FILE: graphics/pokemon/latias/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 238 238 255 213 213 238 172 164 205 123 115 148 255 205 90 205 164 74 115 172 238 90 106 180 255 164 115 255 255 255 255 106 106 222 90 90 205 74 82 139 49 65 16 16 16 ================================================ FILE: graphics/pokemon/latias/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 238 238 255 213 213 238 172 164 205 123 115 148 131 246 65 49 123 24 115 189 255 90 139 180 255 255 90 255 255 255 255 205 41 238 172 0 238 131 0 189 57 0 16 16 16 ================================================ FILE: graphics/pokemon/latios/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 205 205 205 172 172 172 148 139 148 115 106 115 222 222 222 131 74 74 255 106 106 213 74 82 156 205 255 255 255 255 90 164 255 74 131 213 57 98 180 49 57 115 16 16 16 ================================================ FILE: graphics/pokemon/latios/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 246 246 246 213 213 213 180 172 172 148 139 148 246 246 246 180 82 0 230 123 41 255 164 65 189 255 255 255 255 255 172 238 222 74 205 164 32 164 123 0 98 65 16 16 16 ================================================ FILE: graphics/pokemon/ledian/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 197 131 255 90 32 197 57 16 131 49 16 255 255 189 246 230 115 205 180 57 164 123 0 0 74 164 0 24 115 213 213 213 180 180 180 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/ledian/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 222 41 255 164 0 205 123 0 131 74 16 255 255 205 246 238 131 205 189 74 164 131 16 0 74 164 0 24 115 213 213 213 180 180 180 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/ledyba/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 156 49 238 82 24 180 65 41 123 49 24 255 255 189 246 230 115 205 180 57 164 123 0 0 74 164 0 24 115 205 205 205 180 180 180 115 115 115 16 16 16 ================================================ FILE: graphics/pokemon/ledyba/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 222 41 255 164 0 205 123 0 131 74 16 255 255 205 246 238 131 205 189 74 164 131 16 0 74 164 0 24 115 213 213 213 180 180 180 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/lickitung/normal.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 255 255 164 230 213 115 131 123 32 255 164 148 255 131 82 230 74 24 197 32 16 255 0 255 255 205 180 255 164 131 238 106 82 205 82 49 148 16 0 16 16 16 ================================================ FILE: graphics/pokemon/lickitung/shiny.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 255 255 164 230 213 115 131 123 32 255 222 148 255 123 131 213 82 90 172 41 49 255 0 255 255 238 123 246 222 106 205 180 65 172 139 24 131 90 0 16 16 16 ================================================ FILE: graphics/pokemon/lileep/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 213 139 230 164 222 180 115 172 139 65 123 98 24 74 255 172 106 238 123 57 189 98 16 255 246 123 255 222 41 230 172 0 213 213 213 172 172 180 115 115 115 0 0 0 ================================================ FILE: graphics/pokemon/lileep/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 213 139 148 238 205 115 205 172 82 172 139 32 123 90 255 172 106 238 123 57 189 98 16 255 246 123 255 222 41 230 172 0 213 213 213 172 172 180 115 115 115 41 41 57 ================================================ FILE: graphics/pokemon/linoone/normal.pal ================================================ JASC-PAL 0100 16 115 172 115 65 57 32 139 98 65 172 139 115 205 172 139 230 213 197 0 0 0 131 115 90 197 180 148 222 213 180 255 246 246 57 82 131 123 139 222 255 172 180 255 197 205 255 238 255 ================================================ FILE: graphics/pokemon/linoone/shiny.pal ================================================ JASC-PAL 0100 16 115 172 115 65 57 32 197 98 65 222 131 74 238 164 74 255 238 197 0 0 0 131 115 90 197 180 148 222 213 180 255 246 246 189 139 49 255 205 106 255 172 180 255 197 205 255 238 255 ================================================ FILE: graphics/pokemon/lombre/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 98 106 65 90 148 106 148 74 57 131 197 148 189 230 180 222 255 197 205 74 49 131 148 65 139 180 49 172 213 57 255 115 65 205 246 82 255 255 255 197 197 205 255 8 57 ================================================ FILE: graphics/pokemon/lombre/shiny.pal ================================================ JASC-PAL 0100 16 197 197 205 98 106 65 90 148 106 172 90 41 172 213 57 205 246 82 222 255 197 213 106 57 65 131 139 90 156 164 106 172 180 255 172 90 148 197 205 255 255 255 197 197 205 255 8 57 ================================================ FILE: graphics/pokemon/lotad/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 255 213 74 213 172 57 139 115 49 49 65 90 123 213 74 98 189 49 74 172 41 74 139 41 49 74 32 172 255 123 148 180 222 82 139 205 49 115 148 255 255 255 16 16 16 ================================================ FILE: graphics/pokemon/lotad/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 255 213 74 213 172 57 139 115 49 49 65 90 148 197 205 106 172 180 90 156 164 65 131 139 24 82 98 172 255 123 213 139 156 180 106 123 148 74 90 255 255 255 16 16 16 ================================================ FILE: graphics/pokemon/loudred/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 164 156 222 123 115 180 90 82 139 57 57 106 255 222 90 213 164 24 156 115 24 255 115 82 213 74 49 156 57 24 106 49 24 205 205 205 115 115 115 0 0 0 ================================================ FILE: graphics/pokemon/loudred/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 180 197 189 131 164 156 90 139 131 65 106 255 246 131 255 197 49 213 131 16 255 115 82 197 65 49 156 41 24 123 57 0 238 205 213 115 115 115 49 49 65 ================================================ FILE: graphics/pokemon/ludicolo/normal.pal ================================================ JASC-PAL 0100 16 98 148 197 74 106 74 106 139 90 156 197 98 164 238 90 205 255 139 246 246 148 213 213 123 180 180 115 255 255 255 205 205 222 197 131 115 246 164 98 139 106 82 213 180 74 41 41 41 ================================================ FILE: graphics/pokemon/ludicolo/shiny.pal ================================================ JASC-PAL 0100 16 98 148 197 49 115 106 82 139 131 90 156 148 148 197 205 164 222 222 255 230 156 255 213 106 230 172 90 255 255 255 205 205 222 197 131 115 246 164 98 164 106 82 213 180 74 41 41 41 ================================================ FILE: graphics/pokemon/lugia/normal.pal ================================================ JASC-PAL 0100 16 222 222 197 255 255 255 222 222 230 189 189 197 156 156 180 98 98 98 123 164 246 90 115 255 0 98 189 0 65 131 238 90 0 156 65 0 156 156 180 98 98 98 16 16 16 16 16 16 ================================================ FILE: graphics/pokemon/lugia/shiny.pal ================================================ JASC-PAL 0100 16 222 222 197 255 255 255 213 230 255 172 197 230 131 156 197 74 90 139 255 139 172 246 106 148 205 74 123 106 65 82 238 90 0 156 65 0 246 139 139 222 90 98 148 32 41 16 16 16 ================================================ FILE: graphics/pokemon/lunatone/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 255 238 164 230 213 148 213 197 131 197 172 123 172 156 106 156 131 98 139 115 82 123 98 74 98 74 57 82 57 41 238 90 90 213 74 82 189 57 74 164 49 74 16 16 16 ================================================ FILE: graphics/pokemon/lunatone/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 255 238 164 230 213 148 213 197 131 197 172 123 172 156 106 156 131 98 139 115 82 123 98 74 98 74 57 82 57 41 98 148 255 65 115 222 32 82 189 0 49 156 16 16 16 ================================================ FILE: graphics/pokemon/luvdisc/normal.pal ================================================ JASC-PAL 0100 16 98 205 148 115 57 49 164 106 82 255 255 255 222 205 230 230 156 131 205 148 148 255 164 123 246 213 148 90 98 189 90 98 139 0 0 0 0 0 0 0 0 0 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/luvdisc/shiny.pal ================================================ JASC-PAL 0100 16 98 205 148 115 57 49 164 106 82 255 255 255 222 205 230 246 197 49 246 172 16 255 230 82 255 255 131 90 98 189 90 98 139 0 0 0 0 0 0 0 0 0 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/machamp/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 238 246 115 205 213 74 164 172 41 115 98 0 255 57 57 189 49 65 82 82 82 255 0 255 230 230 230 197 238 205 172 213 180 131 172 131 57 90 65 16 16 16 ================================================ FILE: graphics/pokemon/machamp/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 238 246 115 197 205 74 164 172 41 115 98 0 255 57 57 156 0 0 82 82 82 255 0 255 213 213 213 180 197 131 139 156 90 98 115 49 57 74 8 16 16 16 ================================================ FILE: graphics/pokemon/machoke/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 238 246 115 205 189 74 180 164 65 98 74 8 255 0 255 238 49 49 197 0 0 156 0 0 222 222 222 205 197 246 172 164 213 131 123 156 65 65 106 16 16 16 ================================================ FILE: graphics/pokemon/machoke/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 238 246 115 197 205 74 164 172 41 115 98 0 255 0 255 115 156 222 74 115 180 16 57 123 222 230 172 180 189 131 139 148 90 98 106 49 57 65 8 16 16 16 ================================================ FILE: graphics/pokemon/machop/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 230 197 115 197 180 57 189 172 57 98 106 16 255 0 255 255 57 57 197 0 0 156 0 0 213 213 213 189 222 197 164 197 172 123 148 131 49 74 57 16 16 16 ================================================ FILE: graphics/pokemon/machop/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 238 246 115 197 205 74 164 172 41 98 106 16 255 0 255 255 57 57 197 0 0 156 0 0 255 246 189 222 205 148 180 164 106 139 123 65 98 82 24 16 16 16 ================================================ FILE: graphics/pokemon/magby/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 197 131 255 123 98 213 82 57 148 49 32 255 0 255 255 255 180 246 213 57 213 172 0 172 131 0 255 0 255 255 0 255 197 197 197 115 115 123 16 16 16 ================================================ FILE: graphics/pokemon/magby/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 246 115 255 213 41 230 131 49 148 65 32 255 0 255 255 255 238 255 246 148 238 205 90 197 123 65 255 0 255 255 0 255 197 197 197 115 115 123 16 16 16 ================================================ FILE: graphics/pokemon/magcargo/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 189 106 255 131 74 222 90 32 148 32 0 255 213 115 255 238 156 255 213 115 255 197 0 164 106 90 172 172 172 131 131 131 98 98 98 65 65 65 16 16 16 ================================================ FILE: graphics/pokemon/magcargo/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 180 238 205 148 197 172 98 172 106 65 139 255 180 238 255 230 255 255 180 238 255 180 238 139 74 106 213 98 74 156 82 57 106 49 41 74 41 16 16 16 16 ================================================ FILE: graphics/pokemon/magikarp/normal.pal ================================================ JASC-PAL 0100 16 90 123 197 255 255 255 222 222 230 172 172 189 115 115 139 16 16 16 238 255 131 238 213 98 131 106 16 255 180 148 255 123 90 197 49 49 255 172 115 255 106 32 222 74 74 139 8 0 ================================================ FILE: graphics/pokemon/magikarp/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 222 222 230 172 172 189 115 115 139 16 16 16 238 255 131 222 197 90 131 106 16 255 255 172 255 230 49 246 189 82 255 255 98 255 222 32 230 164 41 156 82 41 ================================================ FILE: graphics/pokemon/magmar/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 213 213 213 106 106 106 41 41 41 255 0 255 255 0 255 255 246 98 255 213 0 222 164 32 139 98 8 255 164 65 255 74 8 205 41 65 139 8 0 255 0 255 ================================================ FILE: graphics/pokemon/magmar/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 213 213 213 106 106 106 41 41 41 255 0 255 255 0 255 255 238 255 255 197 213 205 156 172 123 74 90 255 164 172 238 123 131 213 82 90 164 41 49 255 0 255 ================================================ FILE: graphics/pokemon/magnemite/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 230 230 230 255 98 65 205 49 49 82 205 246 41 131 172 180 180 180 139 139 139 98 82 82 57 49 49 213 246 222 180 213 189 148 189 156 90 131 98 16 16 16 ================================================ FILE: graphics/pokemon/magnemite/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 213 213 213 82 74 74 57 49 49 82 74 74 57 49 49 180 180 180 139 139 139 82 74 74 57 49 49 238 238 189 197 197 148 156 156 106 115 115 65 16 16 16 ================================================ FILE: graphics/pokemon/magneton/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 222 222 222 255 98 57 213 41 49 82 205 246 57 148 172 180 180 180 139 139 139 82 74 74 57 49 49 213 246 222 180 213 189 148 189 156 90 131 98 16 16 16 ================================================ FILE: graphics/pokemon/magneton/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 213 213 213 106 98 98 57 49 49 106 98 98 57 49 49 180 180 180 139 139 139 82 74 74 57 49 49 255 246 230 238 222 197 197 180 156 156 139 115 16 16 16 ================================================ FILE: graphics/pokemon/makuhita/normal.pal ================================================ JASC-PAL 0100 16 148 197 148 156 156 164 131 131 148 90 90 115 49 57 90 255 213 82 238 189 49 205 156 82 255 90 74 205 82 65 156 82 65 0 0 0 255 230 123 123 90 57 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/makuhita/shiny.pal ================================================ JASC-PAL 0100 16 148 197 148 255 90 74 205 82 65 156 82 65 123 49 32 255 230 156 255 205 98 230 164 82 255 90 74 205 82 65 156 82 65 0 0 0 255 246 189 123 90 57 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/manectric/normal.pal ================================================ JASC-PAL 0100 16 197 197 197 57 65 74 82 90 131 115 131 197 139 172 238 255 255 74 222 230 106 180 197 106 139 123 65 172 32 16 0 0 0 0 0 0 0 0 0 255 255 255 197 197 230 24 24 24 ================================================ FILE: graphics/pokemon/manectric/shiny.pal ================================================ JASC-PAL 0100 16 197 197 197 41 41 57 57 65 82 115 106 123 148 139 156 255 222 131 230 197 98 197 156 90 164 123 57 82 106 197 0 0 0 0 0 0 0 0 0 255 255 255 197 197 230 24 24 24 ================================================ FILE: graphics/pokemon/mankey/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 222 222 222 255 230 189 238 180 139 238 115 98 189 74 49 16 16 16 255 197 131 222 164 115 197 123 74 115 65 0 255 246 205 246 222 180 213 189 156 106 74 41 ================================================ FILE: graphics/pokemon/mankey/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 222 222 222 255 230 189 238 180 139 230 139 98 189 74 49 16 16 16 238 197 139 197 156 98 156 115 57 98 57 0 213 230 148 180 197 115 139 156 74 82 98 16 ================================================ FILE: graphics/pokemon/mantine/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 148 164 213 90 106 139 41 65 98 24 41 74 255 0 255 205 230 255 180 205 255 156 164 197 246 230 246 230 205 230 213 189 205 164 148 164 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/mantine/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 164 205 238 123 156 238 74 98 197 16 49 148 255 0 255 205 230 255 180 205 255 156 189 213 230 246 255 205 230 255 172 205 238 139 164 205 74 82 115 16 16 16 ================================================ FILE: graphics/pokemon/mareep/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 238 131 230 197 98 197 148 41 139 90 24 74 180 230 32 148 189 0 74 148 0 32 106 255 222 0 230 172 0 180 123 0 164 164 164 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/mareep/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 213 205 238 148 180 222 90 131 172 65 90 74 180 230 32 148 189 0 74 148 0 32 106 255 222 0 230 172 0 180 123 0 164 164 164 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/marill/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 222 230 222 156 156 156 98 98 98 16 16 16 156 189 255 106 148 255 74 115 255 49 65 90 57 90 189 255 0 255 246 131 0 213 74 0 148 24 0 255 0 255 ================================================ FILE: graphics/pokemon/marill/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 222 230 222 156 156 156 98 98 98 16 16 16 156 255 156 123 230 131 90 205 106 49 123 65 49 164 74 255 0 255 255 115 148 213 74 115 164 41 57 255 0 255 ================================================ FILE: graphics/pokemon/marowak/normal.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 230 230 213 197 197 172 139 139 106 82 82 57 16 16 16 197 57 16 255 222 180 246 197 148 238 164 106 164 106 65 222 189 106 197 156 74 164 115 49 98 57 24 ================================================ FILE: graphics/pokemon/marowak/shiny.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 230 230 213 197 197 172 139 139 106 82 82 57 16 16 16 197 57 16 255 222 180 246 197 148 230 148 82 189 115 57 213 222 139 172 180 98 131 139 57 65 74 0 ================================================ FILE: graphics/pokemon/marshtomp/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 222 222 255 197 197 238 172 172 213 131 131 156 255 164 82 246 123 57 205 98 32 164 123 90 255 255 255 172 238 238 148 213 213 106 189 189 98 148 156 90 90 115 16 16 16 ================================================ FILE: graphics/pokemon/marshtomp/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 238 238 255 213 213 238 189 189 213 148 148 156 255 230 156 255 180 65 205 131 24 164 123 90 255 255 255 246 205 246 230 172 246 205 123 230 156 106 172 106 49 123 16 16 16 ================================================ FILE: graphics/pokemon/masquerain/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 65 65 90 148 164 197 180 205 238 197 238 238 106 74 32 205 139 49 255 156 74 222 222 205 255 255 255 90 16 8 131 65 32 172 16 8 222 57 32 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/masquerain/shiny.pal ================================================ JASC-PAL 0100 16 255 255 255 49 123 74 98 180 98 148 230 148 205 255 172 82 74 32 106 106 49 164 148 115 222 222 41 255 255 41 90 16 8 131 65 32 172 16 8 222 57 32 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/mawile/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 205 205 205 213 131 172 189 98 139 156 74 106 0 0 0 255 222 139 255 197 90 213 156 74 156 123 57 0 0 0 197 197 197 164 164 164 131 131 131 82 82 82 ================================================ FILE: graphics/pokemon/mawile/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 205 205 205 255 123 82 222 98 49 180 65 49 0 0 0 255 222 139 255 197 90 213 156 74 156 123 57 0 0 0 238 156 197 205 123 164 164 90 131 131 49 90 ================================================ FILE: graphics/pokemon/medicham/normal.pal ================================================ JASC-PAL 0100 16 139 213 139 255 255 255 255 156 148 230 123 123 205 90 82 123 82 74 0 0 0 164 139 106 164 164 164 131 131 131 255 230 131 255 205 90 238 238 213 213 213 197 189 189 172 139 139 123 ================================================ FILE: graphics/pokemon/medicham/shiny.pal ================================================ JASC-PAL 0100 16 139 213 139 255 255 255 139 189 246 98 148 205 74 115 172 74 90 115 0 0 0 164 139 106 164 164 164 131 131 131 255 230 131 255 205 90 238 205 164 230 172 139 205 148 115 123 90 74 ================================================ FILE: graphics/pokemon/meditite/normal.pal ================================================ JASC-PAL 0100 16 139 189 139 255 255 255 238 230 230 205 197 197 148 123 123 255 131 106 230 90 57 180 65 49 180 57 90 115 41 65 0 0 0 197 222 255 139 189 246 98 148 205 74 115 172 74 90 115 ================================================ FILE: graphics/pokemon/meditite/shiny.pal ================================================ JASC-PAL 0100 16 139 189 139 255 255 255 246 230 238 213 189 205 164 115 123 255 131 106 255 139 57 180 65 49 180 57 90 115 41 65 0 0 0 255 131 106 230 90 57 180 65 49 180 57 90 115 41 65 ================================================ FILE: graphics/pokemon/meganium/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 189 255 123 156 230 82 106 189 49 32 139 16 98 74 0 246 164 156 255 57 90 205 32 57 123 16 57 205 205 205 106 106 106 16 16 16 255 222 32 230 172 0 ================================================ FILE: graphics/pokemon/meganium/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 98 246 230 41 213 197 16 131 115 8 74 57 0 255 180 65 255 123 16 205 74 0 139 74 0 205 205 205 106 106 106 16 16 16 255 222 32 230 172 0 ================================================ FILE: graphics/pokemon/meowth/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 148 255 213 0 205 164 0 255 115 82 213 90 57 16 16 16 230 230 230 238 156 49 205 123 16 148 65 0 255 255 180 255 230 131 230 180 65 156 106 0 ================================================ FILE: graphics/pokemon/meowth/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 148 255 213 0 205 164 0 255 115 82 213 90 57 16 16 16 230 230 230 255 123 139 222 82 98 139 41 57 255 238 148 255 197 106 213 156 65 131 74 0 ================================================ FILE: graphics/pokemon/metagross/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 205 205 205 172 172 172 148 139 148 115 106 115 222 222 222 131 74 74 255 106 106 213 74 82 131 205 255 197 222 255 90 164 255 74 131 213 57 98 180 49 57 115 16 16 16 ================================================ FILE: graphics/pokemon/metagross/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 238 172 82 205 139 49 172 106 16 139 74 0 255 205 115 131 74 74 255 106 106 213 74 82 238 238 246 255 255 255 213 213 222 172 172 180 139 131 139 98 90 98 16 16 16 ================================================ FILE: graphics/pokemon/metang/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 205 205 205 172 172 172 148 139 148 115 106 115 222 222 222 131 74 74 255 106 106 213 74 82 131 205 255 255 255 255 90 164 255 74 131 213 57 98 180 49 57 115 16 16 16 ================================================ FILE: graphics/pokemon/metang/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 238 172 82 205 139 49 172 106 16 139 74 0 255 205 115 156 65 65 255 106 106 255 74 82 238 238 246 255 255 255 213 213 222 172 172 180 123 115 123 82 74 82 16 16 16 ================================================ FILE: graphics/pokemon/metapod/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 255 115 156 213 74 115 172 49 82 98 41 255 0 255 255 0 255 255 0 255 255 0 255 197 197 197 16 16 16 255 255 255 255 255 255 255 255 255 255 255 255 ================================================ FILE: graphics/pokemon/metapod/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 197 139 255 148 106 230 98 74 131 65 32 255 0 255 255 0 255 255 0 255 255 0 255 197 197 197 16 16 16 255 255 255 255 255 255 255 255 255 255 255 255 ================================================ FILE: graphics/pokemon/mew/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 213 213 213 24 90 164 82 180 255 255 0 255 255 0 255 255 0 255 255 0 255 222 148 131 246 213 230 255 197 205 255 164 148 213 74 82 156 57 57 41 41 41 ================================================ FILE: graphics/pokemon/mew/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 213 213 213 24 90 164 74 148 213 255 0 255 255 0 255 255 0 255 255 0 255 139 180 246 230 246 255 197 238 255 164 213 246 82 139 205 74 115 180 41 41 41 ================================================ FILE: graphics/pokemon/mewtwo/normal.pal ================================================ JASC-PAL 0100 16 230 213 213 230 230 246 189 189 213 139 139 180 82 82 106 230 180 255 180 131 213 139 90 172 115 49 148 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/mewtwo/shiny.pal ================================================ JASC-PAL 0100 16 230 213 213 230 230 230 180 180 180 148 148 148 74 74 57 189 238 90 148 205 65 90 148 32 65 90 41 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/mightyena/normal.pal ================================================ JASC-PAL 0100 16 57 164 164 0 0 0 0 0 0 172 172 180 148 139 156 74 82 106 49 49 65 32 32 41 222 230 238 197 205 213 255 197 90 172 123 90 222 57 57 164 16 16 255 255 255 0 0 0 ================================================ FILE: graphics/pokemon/mightyena/shiny.pal ================================================ JASC-PAL 0100 16 57 164 164 0 0 0 0 0 0 255 205 106 213 172 74 164 123 82 131 90 57 98 57 16 255 238 172 255 222 123 255 255 255 172 123 90 74 98 172 49 57 115 255 255 255 0 0 0 ================================================ FILE: graphics/pokemon/milotic/normal.pal ================================================ JASC-PAL 0100 16 246 246 148 115 57 49 164 106 82 222 189 156 255 213 180 255 230 213 148 172 197 139 197 255 213 98 65 238 131 90 180 82 65 230 131 139 255 164 131 106 98 123 246 246 238 0 0 0 ================================================ FILE: graphics/pokemon/milotic/shiny.pal ================================================ JASC-PAL 0100 16 246 246 148 115 57 49 164 106 82 222 189 156 255 213 180 255 238 222 222 197 0 255 230 32 148 156 205 180 189 238 90 98 148 230 131 139 255 164 131 106 98 123 246 246 238 0 0 0 ================================================ FILE: graphics/pokemon/miltank/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 213 222 255 172 164 213 123 115 139 74 74 255 230 156 238 197 123 197 156 82 148 106 32 0 82 255 164 164 164 90 90 90 49 49 49 24 24 32 180 57 98 ================================================ FILE: graphics/pokemon/miltank/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 246 238 230 238 238 156 172 189 90 98 131 255 255 255 222 213 197 172 156 115 139 106 74 0 82 255 213 74 49 139 57 32 90 24 16 41 24 24 238 106 115 ================================================ FILE: graphics/pokemon/minun/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 255 246 222 255 238 197 238 213 131 189 172 131 123 115 82 98 156 255 90 123 230 49 90 131 238 82 57 41 49 65 98 98 115 65 65 98 148 148 148 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/minun/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 255 246 222 255 238 164 255 213 106 205 148 82 139 82 16 148 197 205 82 139 131 49 115 106 238 82 57 41 49 65 98 98 115 65 65 98 148 148 148 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/misdreavus/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 16 16 16 41 74 65 74 106 115 115 156 148 148 189 180 255 0 246 255 246 82 172 16 74 238 90 148 255 213 197 123 32 0 189 32 24 255 90 41 255 148 189 255 255 255 ================================================ FILE: graphics/pokemon/misdreavus/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 16 16 16 98 82 16 156 139 49 213 197 98 246 230 123 255 0 255 255 246 82 82 65 32 230 189 65 255 230 106 123 41 8 172 57 24 255 90 41 255 197 49 255 255 255 ================================================ FILE: graphics/pokemon/moltres/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 222 222 222 180 0 0 255 213 156 255 148 74 255 98 0 238 0 0 238 172 74 205 123 32 131 49 0 255 246 65 255 222 16 255 172 0 189 82 0 16 16 16 ================================================ FILE: graphics/pokemon/moltres/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 222 222 222 180 0 0 255 213 156 255 148 74 255 98 0 189 49 41 255 115 90 205 49 32 164 16 32 255 222 205 255 172 164 230 115 106 172 57 57 16 16 16 ================================================ FILE: graphics/pokemon/mr_mime/normal.pal ================================================ JASC-PAL 0100 16 205 205 180 205 213 222 131 131 172 65 74 123 41 49 74 255 148 139 238 74 57 189 74 57 123 41 41 255 230 222 255 205 197 230 164 156 106 65 57 189 123 106 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/mr_mime/shiny.pal ================================================ JASC-PAL 0100 16 205 205 180 205 213 222 131 131 172 65 74 123 41 49 74 180 230 82 139 189 41 98 148 0 41 90 0 255 238 238 255 205 205 230 172 172 139 90 82 189 123 106 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/mudkip/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 180 189 246 156 172 222 139 156 180 123 115 123 255 180 82 246 156 65 205 131 65 164 123 90 197 205 255 255 255 255 123 197 255 90 172 230 49 131 197 74 74 131 16 16 16 ================================================ FILE: graphics/pokemon/mudkip/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 255 238 156 255 205 106 230 172 90 213 156 74 255 180 82 246 156 65 205 131 65 164 123 90 255 246 197 255 255 255 222 156 238 197 115 222 139 82 156 106 49 123 16 16 16 ================================================ FILE: graphics/pokemon/muk/normal.pal ================================================ JASC-PAL 0100 16 197 238 222 238 222 238 230 189 222 197 156 180 148 106 156 90 49 115 213 213 222 172 180 189 131 139 156 65 74 90 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/muk/shiny.pal ================================================ JASC-PAL 0100 16 238 238 238 197 246 156 180 230 148 139 189 106 98 148 65 57 106 24 213 213 222 172 180 189 131 139 156 65 74 90 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/murkrow/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 172 139 238 57 65 172 16 32 41 65 65 57 82 82 82 106 106 139 164 164 255 0 255 106 74 16 156 123 32 213 180 41 255 255 82 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/murkrow/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 172 139 238 57 65 172 16 32 98 41 90 156 57 139 197 90 164 238 131 197 255 0 255 106 74 16 156 123 32 213 180 41 255 255 82 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/natu/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 156 230 74 82 197 74 74 148 65 49 98 41 255 222 65 205 172 57 131 98 32 255 74 0 205 57 0 131 41 0 205 205 205 148 148 148 82 82 82 41 41 41 ================================================ FILE: graphics/pokemon/natu/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 255 65 164 230 49 115 189 8 65 106 0 255 222 65 189 148 32 139 90 0 255 164 57 213 106 16 115 74 0 205 205 205 148 148 148 82 82 82 41 41 41 ================================================ FILE: graphics/pokemon/nidoking/normal.pal ================================================ JASC-PAL 0100 16 123 180 213 255 255 255 230 230 213 197 197 164 115 115 90 255 0 255 255 0 255 197 115 189 65 197 180 41 148 123 0 98 74 230 180 238 213 123 230 164 90 156 106 49 123 16 16 16 ================================================ FILE: graphics/pokemon/nidoking/shiny.pal ================================================ JASC-PAL 0100 16 180 164 115 255 255 255 230 230 213 197 197 164 115 115 90 255 0 255 255 0 255 74 164 222 189 139 172 123 98 115 74 49 65 139 222 255 98 180 255 57 123 213 57 82 131 16 16 16 ================================================ FILE: graphics/pokemon/nidoqueen/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 213 213 213 238 230 164 230 205 139 189 172 90 115 90 41 255 156 139 230 65 49 172 16 0 222 255 255 156 213 222 90 180 205 106 139 172 57 82 90 16 16 16 ================================================ FILE: graphics/pokemon/nidoqueen/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 213 213 213 255 213 230 238 180 205 197 148 172 139 98 115 255 156 139 238 74 57 172 16 0 205 205 139 172 172 106 139 139 74 106 98 41 65 57 8 16 16 16 ================================================ FILE: graphics/pokemon/nidoran_f/normal.pal ================================================ JASC-PAL 0100 16 222 222 189 222 255 255 197 230 238 148 205 189 90 164 148 74 98 98 255 82 65 189 49 74 65 139 230 82 139 180 57 106 148 255 0 255 255 0 255 255 0 255 255 255 255 16 16 16 ================================================ FILE: graphics/pokemon/nidoran_f/shiny.pal ================================================ JASC-PAL 0100 16 222 222 189 246 213 255 213 180 238 180 148 205 148 115 172 98 65 123 238 74 57 197 32 16 98 139 65 65 106 32 32 74 0 255 0 255 255 0 255 255 0 255 255 255 255 16 16 16 ================================================ FILE: graphics/pokemon/nidoran_m/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 16 16 16 255 106 82 222 65 41 180 24 0 24 205 156 0 164 115 0 98 65 255 0 255 238 189 238 230 156 213 189 98 189 98 65 106 205 205 205 131 131 131 ================================================ FILE: graphics/pokemon/nidoran_m/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 16 16 16 255 106 82 222 65 41 180 24 0 180 131 131 148 90 98 106 49 57 255 0 255 172 222 255 164 189 255 115 156 213 57 90 156 197 197 197 131 131 131 ================================================ FILE: graphics/pokemon/nidorina/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 213 213 213 131 131 131 74 131 246 16 98 180 24 57 115 255 156 139 238 74 57 197 32 16 222 255 255 197 230 238 139 197 205 90 148 180 57 90 98 16 16 16 ================================================ FILE: graphics/pokemon/nidorina/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 197 197 197 131 131 131 115 139 90 82 106 57 41 65 16 255 156 139 238 74 57 197 32 16 255 213 255 246 180 238 213 148 205 164 90 131 106 49 74 16 16 16 ================================================ FILE: graphics/pokemon/nidorino/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 255 106 82 222 65 41 180 24 0 57 238 189 74 205 164 0 164 115 255 0 255 16 16 16 230 172 238 222 148 205 172 123 189 106 65 123 197 197 197 131 131 131 ================================================ FILE: graphics/pokemon/nidorino/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 255 106 82 222 65 41 180 24 0 180 131 131 148 90 98 106 49 57 255 0 255 16 16 16 172 222 255 164 189 255 115 156 213 57 90 156 197 197 197 131 131 131 ================================================ FILE: graphics/pokemon/nincada/normal.pal ================================================ JASC-PAL 0100 16 131 180 115 230 213 213 205 164 106 172 139 98 156 115 82 131 197 106 98 164 106 115 74 57 246 238 230 74 123 90 205 189 180 180 172 148 156 139 123 123 115 98 90 82 82 41 41 41 ================================================ FILE: graphics/pokemon/nincada/shiny.pal ================================================ JASC-PAL 0100 16 131 180 115 255 238 164 205 164 106 172 139 98 156 115 82 156 213 74 115 172 49 115 74 57 246 238 230 82 98 41 255 213 106 230 172 90 205 148 65 180 123 41 131 90 8 41 41 41 ================================================ FILE: graphics/pokemon/ninetales/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 106 41 222 32 16 180 16 0 255 0 255 255 0 255 255 0 255 255 0 255 238 222 115 205 156 98 255 238 180 246 230 115 230 197 106 131 106 41 16 16 16 ================================================ FILE: graphics/pokemon/ninetales/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 106 41 222 32 16 180 16 0 255 0 255 255 0 255 255 0 255 255 0 255 205 180 180 156 131 123 246 230 222 230 205 213 189 164 172 131 106 115 16 16 16 ================================================ FILE: graphics/pokemon/ninjask/normal.pal ================================================ JASC-PAL 0100 16 131 180 115 255 255 255 246 213 82 222 172 82 139 106 65 246 106 16 180 57 32 131 57 57 222 74 16 213 213 205 172 180 180 139 148 148 123 123 123 90 90 123 65 65 90 0 0 0 ================================================ FILE: graphics/pokemon/ninjask/shiny.pal ================================================ JASC-PAL 0100 16 131 180 115 255 255 255 246 213 82 222 172 82 139 106 65 246 106 16 180 57 32 131 57 57 222 74 16 255 213 106 255 213 106 230 172 90 205 148 65 180 123 41 131 90 8 0 0 0 ================================================ FILE: graphics/pokemon/noctowl/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 172 230 205 98 205 164 65 156 115 57 156 123 106 123 90 74 98 65 49 74 41 24 197 49 24 156 0 0 197 197 197 115 115 115 255 238 115 16 16 16 ================================================ FILE: graphics/pokemon/noctowl/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 255 172 213 222 90 189 189 57 156 148 32 213 164 74 180 115 0 123 82 0 82 57 0 197 49 24 156 0 0 197 197 197 115 115 115 238 246 115 16 16 16 ================================================ FILE: graphics/pokemon/nosepass/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 57 57 82 197 197 197 98 115 123 131 148 164 148 189 180 189 213 222 139 57 24 205 90 24 246 139 41 255 197 164 255 255 255 74 82 82 0 0 0 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/nosepass/shiny.pal ================================================ JASC-PAL 0100 16 180 172 213 106 74 57 197 197 197 106 82 49 172 139 65 222 180 74 246 213 115 189 57 24 230 90 24 246 139 41 255 197 164 255 255 255 82 57 24 0 0 0 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/numel/normal.pal ================================================ JASC-PAL 0100 16 148 148 246 106 98 32 246 222 0 205 180 57 222 205 32 246 246 164 213 213 148 255 238 106 148 222 24 180 246 49 115 164 57 90 115 106 148 148 82 230 222 238 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/numel/shiny.pal ================================================ JASC-PAL 0100 16 205 197 180 131 98 74 238 197 156 197 156 98 205 164 123 246 246 213 213 213 172 255 222 172 90 172 230 123 197 255 49 131 197 74 98 90 131 131 65 230 222 238 255 255 255 24 24 24 ================================================ FILE: graphics/pokemon/nuzleaf/normal.pal ================================================ JASC-PAL 0100 16 49 148 246 74 57 65 205 205 238 255 255 255 123 148 82 180 205 131 230 238 180 156 123 156 205 156 98 230 197 148 98 197 131 148 238 131 65 115 57 106 82 98 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/nuzleaf/shiny.pal ================================================ JASC-PAL 0100 16 180 213 156 74 57 65 205 205 238 255 255 255 180 65 49 222 98 49 255 123 82 115 90 90 156 123 123 189 164 156 98 197 131 148 238 131 65 115 57 106 82 98 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/octillery/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 180 106 246 106 49 213 57 16 131 0 0 255 0 255 255 255 172 255 213 82 213 156 41 148 90 0 213 213 213 172 172 180 123 123 131 90 90 90 16 16 16 ================================================ FILE: graphics/pokemon/octillery/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 189 90 197 156 65 148 106 24 82 65 49 255 0 255 230 255 172 205 230 82 164 172 41 98 98 0 213 213 213 172 172 180 123 123 131 90 90 90 16 16 16 ================================================ FILE: graphics/pokemon/oddish/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 180 41 49 230 74 65 197 230 123 156 213 74 115 172 49 74 90 32 255 0 255 255 0 255 255 0 255 148 180 197 115 148 164 74 106 131 41 57 74 16 16 16 ================================================ FILE: graphics/pokemon/oddish/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 180 41 49 230 74 65 197 238 16 172 222 16 156 189 16 98 131 49 255 0 255 255 0 255 255 0 255 139 222 57 115 197 32 65 164 32 0 74 0 16 16 16 ================================================ FILE: graphics/pokemon/omanyte/normal.pal ================================================ JASC-PAL 0100 16 222 222 189 255 255 255 230 230 230 255 0 255 255 0 255 98 98 98 16 16 16 255 255 172 238 230 139 205 197 106 172 164 74 98 90 16 131 205 197 98 172 164 57 131 123 16 90 82 ================================================ FILE: graphics/pokemon/omanyte/shiny.pal ================================================ JASC-PAL 0100 16 222 222 189 255 255 255 230 230 230 255 0 255 255 0 255 98 98 98 16 16 16 255 246 156 246 222 139 213 189 115 172 148 82 123 98 41 213 156 238 172 115 205 131 74 172 90 41 148 ================================================ FILE: graphics/pokemon/omastar/normal.pal ================================================ JASC-PAL 0100 16 222 222 197 255 238 180 246 213 98 180 156 65 16 16 16 255 0 255 255 0 255 255 255 172 238 230 139 205 197 106 172 164 74 106 98 16 156 230 222 131 205 197 98 172 164 16 98 90 ================================================ FILE: graphics/pokemon/omastar/shiny.pal ================================================ JASC-PAL 0100 16 222 222 197 255 238 180 246 213 98 180 156 65 16 16 16 255 0 255 255 0 255 255 255 222 238 246 90 213 222 74 172 180 57 98 106 24 222 172 255 189 139 238 148 98 205 98 49 164 ================================================ FILE: graphics/pokemon/onix/normal.pal ================================================ JASC-PAL 0100 16 172 222 205 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 238 230 230 222 213 213 189 180 180 123 131 106 82 74 74 16 16 16 ================================================ FILE: graphics/pokemon/onix/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 230 230 156 205 205 131 164 164 90 123 123 49 82 82 8 16 16 16 ================================================ FILE: graphics/pokemon/paras/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 246 255 230 230 230 164 164 164 255 246 90 222 213 57 255 123 123 230 57 57 180 8 8 255 0 255 255 172 98 238 139 49 189 131 49 131 82 32 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/paras/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 246 255 230 230 230 164 164 164 255 255 205 246 238 115 255 213 65 238 156 49 139 115 16 255 0 255 230 139 32 197 106 32 148 74 32 106 41 0 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/parasect/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 246 255 213 213 213 156 139 164 255 213 82 213 205 49 255 106 106 238 49 49 197 49 57 139 8 8 255 0 255 255 131 82 222 106 49 180 65 49 106 24 8 16 16 16 ================================================ FILE: graphics/pokemon/parasect/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 246 255 230 230 230 164 164 164 255 246 90 213 205 49 255 213 90 255 172 49 213 131 8 156 74 0 255 0 255 255 189 82 213 148 41 172 106 0 131 65 0 16 16 16 ================================================ FILE: graphics/pokemon/pelipper/normal.pal ================================================ JASC-PAL 0100 16 131 189 139 131 90 65 230 172 90 255 213 98 255 238 156 82 82 90 148 213 230 57 156 180 115 189 213 222 222 238 246 246 255 139 65 90 189 139 57 0 0 0 156 156 172 32 98 123 ================================================ FILE: graphics/pokemon/pelipper/shiny.pal ================================================ JASC-PAL 0100 16 131 189 139 131 90 65 238 189 90 255 230 106 255 238 189 82 82 90 156 238 123 90 156 57 123 205 90 230 205 255 246 246 255 139 65 90 189 139 57 0 0 0 156 156 172 32 98 123 ================================================ FILE: graphics/pokemon/persian/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 222 222 222 16 16 16 255 189 156 246 82 65 164 16 0 189 164 74 148 123 32 115 90 16 255 0 255 255 0 255 255 255 172 255 230 131 222 180 82 131 82 0 ================================================ FILE: graphics/pokemon/persian/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 222 222 222 16 16 16 255 123 82 222 98 49 180 65 49 255 189 205 230 123 180 148 57 98 255 0 255 255 0 255 255 255 238 255 246 197 222 213 131 164 131 41 ================================================ FILE: graphics/pokemon/phanpy/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 172 213 238 156 189 238 98 148 197 82 82 148 255 0 255 255 172 139 246 106 82 189 57 49 131 0 0 255 0 255 255 0 255 213 213 213 139 139 139 16 16 16 ================================================ FILE: graphics/pokemon/phanpy/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 246 255 189 230 255 106 180 230 65 98 180 255 0 255 255 164 123 255 82 65 197 49 57 131 0 0 255 0 255 255 0 255 213 213 213 139 139 139 16 16 16 ================================================ FILE: graphics/pokemon/pichu/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 197 255 238 131 230 180 65 197 139 0 131 82 0 255 0 255 255 0 255 255 115 74 197 65 41 115 32 8 205 205 205 115 115 115 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/pichu/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 90 255 222 41 222 180 0 172 131 0 131 82 0 255 0 255 255 0 255 255 82 0 197 0 0 115 0 0 205 205 205 115 115 115 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/pidgeot/normal.pal ================================================ JASC-PAL 0100 16 139 222 213 255 255 255 213 197 213 255 246 189 246 238 156 213 205 115 255 172 115 238 98 65 197 65 65 255 213 180 255 230 49 205 156 123 172 123 90 123 90 74 98 65 49 16 16 16 ================================================ FILE: graphics/pokemon/pidgeot/shiny.pal ================================================ JASC-PAL 0100 16 205 197 172 255 255 255 164 164 164 255 255 148 255 230 115 246 205 90 255 205 24 246 172 8 238 156 0 255 238 49 238 205 16 205 172 16 180 131 0 148 90 0 98 41 0 16 16 16 ================================================ FILE: graphics/pokemon/pidgeotto/normal.pal ================================================ JASC-PAL 0100 16 205 197 172 255 255 255 205 189 213 246 246 164 246 230 106 230 197 106 255 172 115 238 98 65 197 65 65 205 156 123 172 123 90 123 90 74 90 57 41 255 0 255 32 32 32 255 0 255 ================================================ FILE: graphics/pokemon/pidgeotto/shiny.pal ================================================ JASC-PAL 0100 16 205 197 172 255 255 255 164 164 164 255 255 205 246 238 172 222 197 131 255 255 65 255 213 24 246 172 0 197 180 123 164 148 90 131 115 57 82 65 16 255 0 255 32 32 32 255 0 255 ================================================ FILE: graphics/pokemon/pidgey/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 197 197 197 255 246 189 255 230 139 222 197 98 255 180 172 230 123 115 180 74 65 205 139 98 172 98 57 123 90 74 90 57 41 255 0 255 16 16 16 255 0 255 ================================================ FILE: graphics/pokemon/pidgey/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 189 189 255 255 197 255 255 139 213 213 90 255 255 32 255 197 0 189 148 65 230 222 0 189 180 0 148 139 0 106 98 0 255 0 255 16 16 16 255 0 255 ================================================ FILE: graphics/pokemon/pikachu/normal.pal ================================================ JASC-PAL 0100 16 205 205 180 255 255 255 255 255 123 255 238 0 238 189 0 197 139 0 131 82 0 255 0 255 255 0 255 255 0 255 255 74 74 230 0 0 180 0 0 106 106 106 16 16 16 255 0 255 ================================================ FILE: graphics/pokemon/pikachu/shiny.pal ================================================ JASC-PAL 0100 16 205 205 180 255 255 255 255 230 49 246 205 32 238 156 0 205 98 0 131 82 24 255 0 255 255 0 255 255 0 255 255 49 0 205 57 0 180 32 0 106 106 106 16 16 16 255 0 255 ================================================ FILE: graphics/pokemon/piloswine/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 197 115 197 164 82 164 131 57 123 98 24 82 57 0 255 0 255 255 189 131 222 139 82 180 98 41 255 0 255 222 222 222 180 180 189 123 123 139 16 16 16 ================================================ FILE: graphics/pokemon/piloswine/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 238 156 222 213 115 189 180 90 148 139 57 82 57 0 255 0 255 255 189 131 222 139 82 180 98 41 255 0 255 222 222 222 180 180 189 123 123 139 16 16 16 ================================================ FILE: graphics/pokemon/pineco/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 255 0 255 255 0 255 255 0 255 41 74 123 57 115 164 82 172 180 131 213 213 180 238 246 156 164 164 255 74 57 255 0 255 255 0 255 255 255 255 ================================================ FILE: graphics/pokemon/pineco/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 255 0 255 255 0 255 255 0 255 90 65 65 148 90 82 172 139 82 230 197 106 255 230 131 156 164 164 255 74 57 255 0 255 255 0 255 255 255 255 ================================================ FILE: graphics/pokemon/pinsir/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 238 238 205 213 213 180 172 172 131 90 90 74 255 0 255 255 0 255 255 0 255 255 0 255 172 139 115 230 197 156 205 164 131 139 115 90 90 65 41 16 16 16 ================================================ FILE: graphics/pokemon/pinsir/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 255 238 189 230 197 156 180 156 106 98 74 57 255 0 255 255 0 255 255 0 255 255 0 255 82 82 148 123 139 222 98 106 180 57 65 106 32 41 82 16 16 16 ================================================ FILE: graphics/pokemon/plusle/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 255 246 222 255 238 197 238 213 131 189 172 131 123 115 82 238 156 115 222 98 74 139 90 49 238 82 57 41 49 65 98 98 115 65 65 98 148 148 148 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/plusle/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 255 246 222 255 238 164 255 213 106 205 148 82 139 82 16 238 90 49 205 49 8 148 16 0 164 32 16 41 49 65 98 98 115 65 65 98 148 148 148 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/politoed/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 255 164 255 230 82 230 180 41 156 98 0 205 255 131 156 238 49 123 189 24 49 123 0 255 180 106 230 106 49 180 57 0 205 205 205 131 131 131 16 16 16 ================================================ FILE: graphics/pokemon/politoed/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 230 238 246 205 238 213 164 205 123 82 123 156 230 255 115 197 255 74 148 205 49 90 148 255 172 90 230 106 49 164 57 32 205 205 205 131 131 131 16 16 16 ================================================ FILE: graphics/pokemon/poliwag/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 222 222 180 172 189 98 98 98 255 0 255 255 0 255 255 0 255 255 189 172 255 139 123 238 90 74 172 180 222 131 139 180 82 90 148 41 57 82 16 16 16 ================================================ FILE: graphics/pokemon/poliwag/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 222 222 189 189 189 98 98 98 255 0 255 255 0 255 255 0 255 255 189 172 255 139 123 238 90 74 123 205 255 82 164 222 41 123 180 0 65 123 16 16 16 ================================================ FILE: graphics/pokemon/poliwhirl/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 222 222 189 189 189 164 164 164 255 0 255 255 0 255 255 0 255 123 123 123 82 82 82 255 0 255 180 189 230 131 148 197 98 106 148 32 57 98 16 16 16 ================================================ FILE: graphics/pokemon/poliwhirl/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 222 222 189 189 189 164 164 164 255 0 255 255 0 255 255 0 255 123 123 123 82 82 82 255 0 255 106 213 255 65 172 222 24 131 180 0 65 115 16 16 16 ================================================ FILE: graphics/pokemon/poliwrath/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 230 230 230 189 189 189 164 164 164 255 0 255 255 0 255 255 0 255 123 123 123 82 82 82 16 16 16 156 189 213 131 156 172 82 106 148 49 49 106 255 0 255 ================================================ FILE: graphics/pokemon/poliwrath/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 222 222 189 189 189 164 164 164 255 0 255 255 0 255 255 0 255 123 123 123 82 82 82 16 16 16 148 189 131 106 148 90 65 106 49 24 65 8 255 0 255 ================================================ FILE: graphics/pokemon/ponyta/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 255 246 180 255 238 123 238 205 106 139 82 24 255 0 255 255 0 255 255 0 255 255 230 32 255 172 16 255 98 0 213 0 0 172 172 172 90 90 90 16 16 16 ================================================ FILE: graphics/pokemon/ponyta/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 255 255 222 255 246 189 246 213 156 131 98 41 255 0 255 255 0 255 255 0 255 139 230 255 98 197 255 57 131 255 49 90 197 156 156 156 90 90 90 16 16 16 ================================================ FILE: graphics/pokemon/poochyena/normal.pal ================================================ JASC-PAL 0100 16 115 197 164 213 205 222 255 230 131 255 164 123 123 90 82 164 156 172 131 123 139 74 82 98 49 49 65 197 189 205 255 213 90 180 139 90 222 74 65 172 57 65 255 255 255 0 0 0 ================================================ FILE: graphics/pokemon/poochyena/shiny.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 180 139 197 213 255 164 123 123 90 82 213 172 74 148 106 65 115 74 41 82 41 0 255 205 106 123 172 238 57 74 131 222 74 65 172 57 65 255 255 255 0 0 0 ================================================ FILE: graphics/pokemon/porygon/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 115 213 255 57 189 213 41 156 139 8 90 106 255 197 164 255 148 139 222 98 82 148 16 24 222 222 230 255 0 255 255 0 255 255 0 255 255 0 255 41 41 41 255 255 255 ================================================ FILE: graphics/pokemon/porygon/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 238 238 238 205 238 205 172 205 98 65 115 131 189 255 57 115 246 24 82 205 0 49 156 222 222 230 255 0 255 255 0 255 255 0 255 255 0 255 41 41 41 255 255 255 ================================================ FILE: graphics/pokemon/porygon2/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 213 172 255 148 139 222 98 82 180 32 16 255 0 255 148 238 255 106 205 255 65 164 222 32 123 197 0 49 156 213 213 213 180 180 189 106 106 123 16 16 16 ================================================ FILE: graphics/pokemon/porygon2/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 123 180 255 65 123 246 24 82 205 0 49 156 255 0 255 255 238 238 238 205 238 197 164 197 139 106 148 98 65 115 213 213 213 180 180 189 106 106 123 16 16 16 ================================================ FILE: graphics/pokemon/primeape/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 222 222 222 123 123 123 65 65 65 255 148 90 189 74 49 230 180 139 205 139 90 156 106 65 90 49 0 0 0 0 255 255 213 255 230 180 230 189 139 123 90 41 ================================================ FILE: graphics/pokemon/primeape/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 222 222 222 123 123 123 65 65 65 255 148 90 189 74 49 205 197 106 164 156 65 123 115 24 82 74 8 0 0 0 255 222 156 238 180 115 197 139 74 115 49 0 ================================================ FILE: graphics/pokemon/psyduck/normal.pal ================================================ JASC-PAL 0100 16 238 238 238 255 238 189 246 222 139 222 180 82 131 90 0 255 255 255 222 222 222 148 148 148 255 0 255 255 0 255 255 0 255 255 230 164 255 213 74 230 164 49 148 90 16 16 16 16 ================================================ FILE: graphics/pokemon/psyduck/shiny.pal ================================================ JASC-PAL 0100 16 238 238 238 238 255 255 213 246 246 172 205 205 49 82 82 255 255 255 222 222 222 148 148 148 255 0 255 255 0 255 255 0 255 156 238 238 148 213 222 106 172 180 24 98 106 16 16 16 ================================================ FILE: graphics/pokemon/pupitar/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 230 255 139 197 238 115 156 197 41 90 131 255 0 255 180 65 0 205 205 213 172 172 172 123 123 131 255 0 255 255 0 255 255 0 255 65 65 98 16 16 16 ================================================ FILE: graphics/pokemon/pupitar/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 189 255 213 156 230 156 106 189 98 65 115 255 0 255 180 65 0 205 205 213 172 172 172 123 123 131 255 0 255 255 0 255 255 0 255 65 65 98 16 16 16 ================================================ FILE: graphics/pokemon/quagsire/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 16 49 65 32 65 98 57 90 156 255 0 255 74 139 205 98 164 230 172 205 238 197 238 246 255 0 255 255 0 255 98 82 123 148 98 148 255 115 180 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/quagsire/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 74 57 65 98 74 98 90 65 90 255 0 255 148 98 164 189 123 205 230 164 230 255 189 238 255 0 255 255 0 255 98 82 123 148 98 148 255 115 180 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/question_mark/circled/normal.pal ================================================ JASC-PAL 0100 16 156 205 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 205 205 205 172 172 172 255 255 255 0 0 0 ================================================ FILE: graphics/pokemon/question_mark/circled/shiny.pal ================================================ JASC-PAL 0100 16 123 172 172 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 172 172 172 139 139 139 222 222 222 32 32 32 ================================================ FILE: graphics/pokemon/question_mark/double/normal.pal ================================================ JASC-PAL 0100 16 0 255 0 255 255 255 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon/question_mark/double/shiny.pal ================================================ JASC-PAL 0100 16 0 255 0 255 255 255 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon/quilava/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 98 131 189 65 82 139 41 65 98 24 41 82 255 238 164 230 205 106 180 156 82 139 98 32 255 222 0 255 156 0 255 98 0 238 0 0 180 180 180 16 16 16 ================================================ FILE: graphics/pokemon/quilava/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 156 106 189 98 65 139 65 57 98 57 41 255 230 115 222 197 82 172 139 49 139 82 24 255 222 0 255 156 0 255 98 0 238 0 0 180 180 180 16 16 16 ================================================ FILE: graphics/pokemon/qwilfish/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 255 0 255 148 0 0 57 74 98 74 90 164 90 131 197 115 172 238 106 82 49 197 180 82 230 222 115 238 255 164 213 82 98 255 164 148 255 255 255 ================================================ FILE: graphics/pokemon/qwilfish/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 255 0 255 148 0 0 98 57 90 148 41 131 189 82 164 222 115 189 115 65 98 189 139 180 230 189 222 255 222 246 213 82 98 255 164 148 255 255 255 ================================================ FILE: graphics/pokemon/raichu/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 222 123 255 197 32 222 164 90 156 106 49 246 230 205 255 222 41 222 205 82 189 131 65 148 98 49 139 82 49 98 65 24 106 106 106 16 16 16 205 41 41 ================================================ FILE: graphics/pokemon/raichu/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 189 57 255 148 41 230 115 24 123 57 32 222 222 156 205 180 115 164 139 74 172 115 49 131 82 49 123 65 32 115 74 8 106 106 106 16 16 16 230 0 0 ================================================ FILE: graphics/pokemon/raikou/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 238 148 255 205 65 213 156 41 139 98 16 213 180 255 180 115 255 123 41 222 65 16 148 197 0 0 255 0 255 213 213 213 164 164 164 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/raikou/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 213 82 246 156 49 197 106 8 82 74 16 255 255 148 238 230 74 189 180 41 106 98 0 197 0 0 255 0 255 222 222 197 180 189 164 123 131 106 16 16 16 ================================================ FILE: graphics/pokemon/ralts/normal.pal ================================================ JASC-PAL 0100 16 156 164 82 238 238 255 197 205 222 164 180 205 131 148 180 123 82 82 115 41 57 255 156 131 230 82 57 131 205 255 255 255 255 205 255 172 148 230 148 115 189 115 49 123 74 16 16 16 ================================================ FILE: graphics/pokemon/ralts/shiny.pal ================================================ JASC-PAL 0100 16 156 164 82 238 238 255 213 189 222 180 164 205 156 131 180 123 82 82 115 41 57 255 197 90 230 131 32 131 205 255 197 238 246 189 230 255 123 197 238 82 172 213 32 115 123 16 16 16 ================================================ FILE: graphics/pokemon/rapidash/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 255 246 180 255 238 123 230 205 82 197 164 49 148 106 24 255 0 255 255 0 255 255 230 32 255 197 16 255 98 0 205 0 0 156 156 156 90 90 90 16 16 16 ================================================ FILE: graphics/pokemon/rapidash/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 246 246 197 238 230 189 205 197 156 156 148 65 123 106 32 255 0 255 255 0 255 197 205 230 156 164 189 115 123 148 74 82 106 156 156 156 90 90 90 16 16 16 ================================================ FILE: graphics/pokemon/raticate/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 197 148 222 131 98 246 246 164 238 222 139 213 189 131 180 156 115 222 189 82 197 156 65 164 123 49 115 74 0 213 213 213 180 180 180 115 115 115 16 16 16 ================================================ FILE: graphics/pokemon/raticate/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 205 156 222 131 98 255 255 197 230 230 156 205 205 131 131 131 49 246 156 106 230 106 65 189 90 49 131 74 49 213 213 213 180 180 180 115 115 115 16 16 16 ================================================ FILE: graphics/pokemon/rattata/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 0 0 0 230 205 115 205 172 148 238 74 90 164 24 57 213 148 213 180 115 180 131 98 139 98 49 82 222 222 197 205 205 180 180 180 148 90 98 98 16 16 16 ================================================ FILE: graphics/pokemon/rattata/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 0 0 0 238 156 115 205 131 98 189 115 180 123 82 131 238 222 156 205 189 123 172 156 90 115 106 49 222 222 222 197 197 197 164 164 164 90 98 98 16 16 16 ================================================ FILE: graphics/pokemon/rayquaza/normal.pal ================================================ JASC-PAL 0100 16 156 156 255 57 82 57 65 131 65 74 131 115 90 189 139 148 222 180 0 0 0 49 82 172 74 156 189 246 98 98 197 148 98 222 213 238 255 255 255 222 205 0 255 238 0 24 24 24 ================================================ FILE: graphics/pokemon/rayquaza/shiny.pal ================================================ JASC-PAL 0100 16 156 156 255 57 57 57 57 57 57 82 82 82 123 123 123 164 164 164 0 0 0 49 82 148 74 156 172 246 98 98 197 148 98 230 222 255 255 255 255 222 205 0 255 238 0 0 0 0 ================================================ FILE: graphics/pokemon/regice/normal.pal ================================================ JASC-PAL 0100 16 197 246 148 49 57 90 90 98 123 156 164 222 189 213 238 222 255 255 131 115 180 255 255 255 238 255 255 0 0 0 0 0 0 0 0 0 205 180 32 255 255 172 255 230 0 24 24 24 ================================================ FILE: graphics/pokemon/regice/shiny.pal ================================================ JASC-PAL 0100 16 197 246 148 0 98 197 0 148 189 74 213 255 172 238 255 230 255 255 65 164 255 255 255 255 213 255 255 0 0 0 0 0 0 0 0 0 180 123 32 255 230 98 255 189 0 24 24 24 ================================================ FILE: graphics/pokemon/regirock/normal.pal ================================================ JASC-PAL 0100 16 98 197 148 82 74 41 148 139 115 205 197 172 230 222 172 238 230 222 180 172 148 139 90 57 189 131 57 238 131 57 238 172 106 0 0 0 0 0 0 180 65 0 238 115 57 24 24 24 ================================================ FILE: graphics/pokemon/regirock/shiny.pal ================================================ JASC-PAL 0100 16 98 197 148 98 24 0 148 74 32 180 106 65 205 139 98 238 164 131 131 65 24 139 90 57 189 131 57 238 131 57 238 172 106 0 0 0 0 0 0 180 65 0 238 115 57 24 24 24 ================================================ FILE: graphics/pokemon/registeel/normal.pal ================================================ JASC-PAL 0100 16 148 197 98 90 82 82 131 131 123 189 189 180 222 213 230 238 238 238 115 115 90 139 131 106 172 172 123 0 0 0 0 0 0 255 255 255 213 106 131 255 180 164 246 90 172 24 24 24 ================================================ FILE: graphics/pokemon/registeel/shiny.pal ================================================ JASC-PAL 0100 16 148 197 98 90 82 82 90 123 106 115 180 164 172 222 197 213 238 238 115 115 90 139 131 106 172 172 123 0 0 0 0 0 0 255 255 255 180 65 49 255 123 82 222 98 49 24 24 24 ================================================ FILE: graphics/pokemon/relicanth/normal.pal ================================================ JASC-PAL 0100 16 98 246 255 246 222 180 213 189 148 180 148 106 139 115 74 106 82 65 189 164 164 0 0 0 164 139 131 139 115 106 123 98 90 82 65 57 246 90 65 205 65 49 255 246 222 139 123 82 ================================================ FILE: graphics/pokemon/relicanth/shiny.pal ================================================ JASC-PAL 0100 16 98 246 255 246 222 180 213 189 148 180 148 106 139 115 74 106 82 65 172 230 246 0 0 0 139 197 213 106 164 180 74 131 148 24 82 98 246 90 65 205 65 49 255 246 222 139 123 82 ================================================ FILE: graphics/pokemon/remoraid/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 213 246 246 180 222 213 139 172 189 98 139 164 57 74 123 139 0 0 255 0 255 255 0 255 255 0 255 213 213 213 172 172 180 123 123 131 90 90 90 41 41 57 ================================================ FILE: graphics/pokemon/remoraid/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 213 246 222 180 230 172 123 180 131 82 139 98 57 106 139 0 0 255 0 255 255 0 255 255 0 255 213 213 213 172 172 180 123 123 131 90 90 90 41 41 57 ================================================ FILE: graphics/pokemon/rhydon/normal.pal ================================================ JASC-PAL 0100 16 164 213 213 255 255 255 255 238 197 230 213 172 180 164 115 123 106 57 230 82 57 164 49 16 115 32 16 255 0 255 255 0 255 222 222 213 197 197 189 139 139 148 90 90 98 16 16 16 ================================================ FILE: graphics/pokemon/rhydon/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 255 238 197 230 213 172 180 164 115 123 106 57 230 82 57 164 49 16 115 32 16 255 0 255 255 0 255 255 238 197 230 213 180 189 172 139 131 115 82 16 16 16 ================================================ FILE: graphics/pokemon/rhyhorn/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 230 230 238 189 189 205 131 131 172 90 90 123 65 65 90 172 57 41 90 8 0 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/rhyhorn/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 238 180 156 197 139 115 156 98 74 115 57 32 74 16 0 172 57 41 90 8 0 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/roselia/normal.pal ================================================ JASC-PAL 0100 16 148 197 148 0 0 0 180 238 115 246 213 74 205 222 213 65 98 49 131 156 164 98 148 74 123 205 98 172 197 197 164 49 74 246 90 131 255 164 189 41 90 148 82 148 213 98 180 255 ================================================ FILE: graphics/pokemon/roselia/shiny.pal ================================================ JASC-PAL 0100 16 148 197 148 0 0 0 189 255 115 246 213 74 255 238 172 82 98 41 213 172 90 115 172 49 156 213 74 255 213 106 123 65 139 180 98 205 205 139 222 41 49 65 115 106 123 148 139 156 ================================================ FILE: graphics/pokemon/sableye/normal.pal ================================================ JASC-PAL 0100 16 98 205 205 74 49 74 139 98 139 197 123 189 213 148 213 148 131 213 197 222 255 255 255 255 197 41 32 106 74 115 172 180 205 82 205 65 32 222 255 164 115 164 0 0 0 255 82 74 ================================================ FILE: graphics/pokemon/sableye/shiny.pal ================================================ JASC-PAL 0100 16 98 205 205 115 82 65 131 82 57 213 164 123 246 197 164 230 148 90 255 230 156 255 255 255 82 213 74 106 74 57 230 164 90 32 222 255 255 230 106 180 123 90 0 0 0 148 255 148 ================================================ FILE: graphics/pokemon/salamence/normal.pal ================================================ JASC-PAL 0100 16 172 222 98 57 65 98 82 98 148 123 123 222 172 172 255 123 74 49 189 115 74 222 123 82 255 148 98 131 148 148 172 164 189 222 213 238 255 255 255 0 0 0 255 255 41 24 24 24 ================================================ FILE: graphics/pokemon/salamence/shiny.pal ================================================ JASC-PAL 0100 16 172 222 98 16 98 32 98 156 106 106 197 106 148 230 148 123 74 49 189 115 74 222 123 82 255 148 98 131 148 148 172 164 189 222 213 238 255 255 255 0 0 0 255 255 41 24 24 24 ================================================ FILE: graphics/pokemon/sandshrew/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 255 0 255 230 222 16 205 180 0 172 131 16 115 74 24 131 98 16 255 0 255 255 0 255 205 189 180 230 213 197 238 238 222 131 131 131 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/sandshrew/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 255 0 255 213 222 98 172 197 82 131 156 41 65 90 0 98 115 41 255 0 255 255 0 255 180 180 164 205 205 189 238 238 222 139 139 139 82 82 82 16 16 16 ================================================ FILE: graphics/pokemon/sandslash/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 246 230 213 238 222 106 222 197 32 197 164 57 131 98 0 255 255 255 222 213 180 139 139 139 82 82 82 205 164 74 172 131 49 139 98 24 90 65 16 16 16 16 255 0 255 ================================================ FILE: graphics/pokemon/sandslash/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 246 238 156 222 197 115 189 164 74 164 148 65 98 82 0 238 238 222 205 205 189 139 139 139 74 74 74 246 98 98 213 90 74 180 74 49 106 82 32 65 49 32 255 0 255 ================================================ FILE: graphics/pokemon/sceptile/normal.pal ================================================ JASC-PAL 0100 16 123 106 156 255 230 106 255 197 82 197 131 57 255 238 180 255 106 82 213 82 57 164 74 49 57 98 32 123 98 90 255 255 255 189 255 115 156 213 74 115 172 49 90 123 32 16 16 16 ================================================ FILE: graphics/pokemon/sceptile/shiny.pal ================================================ JASC-PAL 0100 16 123 106 156 255 106 82 213 82 57 164 74 49 255 238 180 255 230 106 255 180 82 197 131 57 57 98 32 123 98 90 255 255 255 189 246 255 164 222 230 90 180 164 82 139 131 16 16 16 ================================================ FILE: graphics/pokemon/scizor/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 197 115 255 98 16 205 57 0 123 32 0 255 0 255 255 205 16 255 139 41 189 139 41 255 0 255 255 0 255 197 197 205 148 148 156 90 90 106 16 16 16 ================================================ FILE: graphics/pokemon/scizor/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 230 98 180 189 65 106 115 65 74 82 16 255 0 255 255 205 16 255 139 41 189 139 41 255 0 255 255 0 255 197 197 205 98 197 82 49 123 32 16 16 16 ================================================ FILE: graphics/pokemon/scyther/normal.pal ================================================ JASC-PAL 0100 16 213 213 197 255 255 255 222 222 222 189 189 189 115 115 115 246 230 123 205 197 90 255 255 172 246 230 123 205 57 57 156 139 49 189 255 115 156 222 74 115 172 65 65 98 32 16 16 16 ================================================ FILE: graphics/pokemon/scyther/shiny.pal ================================================ JASC-PAL 0100 16 213 213 197 255 255 255 222 222 222 189 189 189 115 115 115 255 123 90 205 123 90 255 255 189 238 238 148 205 57 57 156 139 49 139 222 49 98 189 49 65 148 8 57 90 8 16 16 16 ================================================ FILE: graphics/pokemon/seadra/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 213 238 197 164 222 230 131 189 205 106 131 156 74 106 131 32 65 90 255 255 172 222 197 82 148 123 65 106 82 41 255 0 255 222 222 222 156 156 156 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/seadra/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 106 180 172 106 164 205 65 115 164 57 82 123 49 41 65 0 0 82 255 213 148 238 180 131 172 82 123 106 82 41 255 0 255 222 222 222 156 156 156 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/seaking/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 213 213 222 172 180 189 131 139 156 90 90 98 255 197 205 246 123 90 164 57 65 255 0 255 255 164 123 246 123 90 222 65 32 164 49 32 82 82 82 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/seaking/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 230 246 164 213 246 139 131 164 57 90 115 8 255 197 205 246 123 90 164 57 65 255 0 255 255 246 131 255 205 90 213 164 49 156 106 0 82 82 82 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/sealeo/normal.pal ================================================ JASC-PAL 0100 16 82 139 82 57 82 115 65 106 164 106 148 213 139 172 255 0 0 0 156 156 180 189 189 213 222 222 255 189 156 123 213 180 148 238 205 172 90 123 148 189 205 255 255 230 189 255 255 255 ================================================ FILE: graphics/pokemon/sealeo/shiny.pal ================================================ JASC-PAL 0100 16 82 139 82 90 49 139 180 98 205 213 148 238 246 197 255 0 0 0 156 156 180 189 189 213 222 222 255 189 148 82 230 189 106 255 222 164 156 74 180 255 238 255 255 246 197 255 255 255 ================================================ FILE: graphics/pokemon/seedot/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 82 82 32 131 123 115 255 255 255 156 90 49 213 148 49 213 180 82 123 148 82 180 205 131 230 238 180 246 197 98 255 238 172 0 0 0 0 0 0 0 0 0 246 57 0 ================================================ FILE: graphics/pokemon/seedot/shiny.pal ================================================ JASC-PAL 0100 16 255 255 255 82 82 32 131 123 115 255 255 255 197 57 41 230 82 32 255 139 82 148 139 139 180 172 172 222 213 213 246 197 98 255 238 172 0 0 0 0 0 0 0 0 0 246 57 0 ================================================ FILE: graphics/pokemon/seel/normal.pal ================================================ JASC-PAL 0100 16 123 213 148 230 230 246 197 197 230 156 164 189 82 82 106 255 230 180 205 189 139 131 106 65 255 123 106 197 115 123 148 65 24 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/seel/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 238 238 213 213 205 189 180 172 156 139 131 115 255 255 197 213 180 131 115 106 49 255 156 123 238 115 82 148 57 41 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/sentret/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 238 222 139 230 197 82 205 164 65 180 139 57 148 106 32 115 65 16 90 41 8 57 8 0 222 65 24 180 32 16 255 131 115 115 115 115 65 65 65 16 16 16 ================================================ FILE: graphics/pokemon/sentret/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 246 172 238 222 123 205 164 65 205 172 74 197 82 115 148 41 82 82 16 65 57 8 0 222 65 24 180 32 16 255 131 115 115 115 115 65 65 65 16 16 16 ================================================ FILE: graphics/pokemon/seviper/normal.pal ================================================ JASC-PAL 0100 16 148 197 197 255 255 255 57 49 49 255 230 90 222 189 65 139 41 180 255 189 172 238 90 82 205 65 57 131 123 65 41 32 32 139 123 123 82 74 74 0 0 0 164 49 255 90 49 65 ================================================ FILE: graphics/pokemon/seviper/shiny.pal ================================================ JASC-PAL 0100 16 148 197 197 255 255 255 57 49 49 205 255 115 172 222 82 180 49 106 255 189 172 90 131 180 57 90 139 82 123 16 41 32 32 139 123 123 82 74 74 0 0 0 213 82 139 90 49 65 ================================================ FILE: graphics/pokemon/sharpedo/normal.pal ================================================ JASC-PAL 0100 16 156 255 156 57 65 74 65 98 123 65 139 148 148 189 189 213 123 131 222 189 65 255 222 98 172 156 180 222 205 246 238 230 255 156 74 90 238 49 24 255 255 255 0 0 0 106 57 74 ================================================ FILE: graphics/pokemon/sharpedo/shiny.pal ================================================ JASC-PAL 0100 16 156 255 156 98 0 82 131 0 115 164 16 148 197 49 180 213 123 131 222 189 65 255 222 98 172 156 180 222 205 246 238 230 255 156 74 90 238 49 24 255 255 255 0 0 0 106 57 74 ================================================ FILE: graphics/pokemon/shedinja/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 213 197 65 180 164 57 164 131 49 139 115 41 82 74 41 0 0 0 0 0 0 0 0 0 115 90 41 246 230 98 255 255 255 222 222 222 189 189 189 123 123 123 16 16 16 ================================================ FILE: graphics/pokemon/shedinja/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 255 230 189 246 197 156 213 164 123 180 131 90 139 106 74 0 0 0 255 0 255 255 0 255 123 82 57 255 246 230 255 255 255 238 222 238 213 180 197 131 106 131 16 16 16 ================================================ FILE: graphics/pokemon/shelgon/normal.pal ================================================ JASC-PAL 0100 16 148 246 148 74 65 57 98 90 74 123 123 98 0 0 0 106 57 57 189 90 32 246 115 74 82 82 115 148 139 180 205 205 205 238 238 205 246 246 0 197 197 0 180 180 189 24 24 24 ================================================ FILE: graphics/pokemon/shelgon/shiny.pal ================================================ JASC-PAL 0100 16 148 246 148 57 49 41 82 74 57 106 106 82 0 0 0 106 57 57 172 32 0 246 82 32 0 115 65 74 148 57 189 205 180 222 238 205 246 246 0 197 197 0 156 180 164 24 24 24 ================================================ FILE: graphics/pokemon/shellder/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 222 205 238 213 180 230 180 139 189 115 123 139 90 57 98 255 98 41 197 65 74 123 32 16 255 0 255 255 0 255 255 0 255 255 0 255 106 106 106 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/shellder/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 213 213 238 255 180 65 255 139 24 213 98 0 148 32 0 255 98 41 197 65 74 123 32 16 255 0 255 255 0 255 255 0 255 255 0 255 106 106 106 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/shiftry/normal.pal ================================================ JASC-PAL 0100 16 49 148 197 82 49 49 131 131 115 255 255 255 115 65 74 156 90 98 222 123 82 246 197 131 230 222 255 189 180 197 0 0 0 74 123 41 98 172 98 131 213 98 255 213 98 0 0 0 ================================================ FILE: graphics/pokemon/shiftry/shiny.pal ================================================ JASC-PAL 0100 16 49 148 197 82 49 49 172 106 82 255 255 255 115 16 0 180 49 32 222 98 49 255 139 98 255 238 156 222 172 74 0 0 0 90 131 49 139 205 82 189 255 115 255 156 82 0 0 0 ================================================ FILE: graphics/pokemon/shroomish/normal.pal ================================================ JASC-PAL 0100 16 148 148 139 98 74 49 148 106 49 213 164 90 238 197 139 255 230 172 255 255 213 90 131 74 123 172 106 139 197 131 164 213 148 65 82 49 172 197 131 0 0 0 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/shroomish/shiny.pal ================================================ JASC-PAL 0100 16 148 148 139 123 98 74 172 123 65 222 189 123 246 213 164 255 238 189 255 255 230 180 65 49 222 98 49 255 115 74 255 189 106 164 49 32 255 172 98 0 0 0 0 0 0 255 255 255 ================================================ FILE: graphics/pokemon/shuckle/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 148 131 115 115 82 16 189 139 41 238 197 74 255 255 90 255 0 255 230 156 131 246 205 180 255 0 255 131 32 0 197 57 16 246 115 57 255 180 123 255 255 255 ================================================ FILE: graphics/pokemon/shuckle/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 148 131 115 115 82 16 189 139 41 238 197 74 255 255 90 255 0 255 164 189 189 189 213 213 255 0 255 24 65 115 49 98 189 65 156 238 139 205 246 255 255 255 ================================================ FILE: graphics/pokemon/shuppet/normal.pal ================================================ JASC-PAL 0100 16 98 197 197 74 65 74 148 131 139 164 164 172 172 189 197 123 115 123 106 213 246 82 189 213 246 213 49 189 180 0 123 180 65 106 148 65 0 0 0 0 0 0 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/shuppet/shiny.pal ================================================ JASC-PAL 0100 16 98 197 197 49 74 82 57 123 131 98 172 180 139 205 213 49 115 123 106 213 246 82 189 213 246 213 49 189 180 0 123 180 65 106 148 65 0 0 0 0 0 0 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/silcoon/normal.pal ================================================ JASC-PAL 0100 16 197 246 197 106 106 115 139 139 148 172 172 180 0 0 0 189 189 205 222 213 230 238 238 230 255 255 255 16 16 24 246 164 0 197 123 0 0 0 0 246 255 197 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/silcoon/shiny.pal ================================================ JASC-PAL 0100 16 197 246 197 164 106 24 205 148 65 230 164 90 0 0 0 255 189 90 255 222 148 255 246 197 255 255 255 16 16 24 90 131 189 65 90 139 0 0 0 246 255 197 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/skarmory/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 230 238 197 197 205 164 164 172 123 123 131 82 82 82 255 156 123 246 98 82 197 57 49 148 32 0 255 222 0 205 148 0 255 0 255 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/skarmory/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 230 197 197 189 164 148 139 123 115 115 98 82 90 74 115 213 74 74 172 41 41 106 32 49 74 32 255 222 0 205 148 0 255 0 255 255 0 255 16 16 16 ================================================ FILE: graphics/pokemon/skiploom/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 139 238 57 98 205 57 65 172 32 24 98 0 255 0 255 255 238 115 255 213 0 246 164 0 172 90 0 255 0 255 255 0 255 213 213 213 164 164 164 16 16 16 ================================================ FILE: graphics/pokemon/skiploom/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 148 213 222 106 189 172 90 148 98 49 82 255 0 255 255 238 115 255 213 0 238 156 16 156 90 16 255 0 255 255 0 255 213 213 213 164 164 164 16 16 16 ================================================ FILE: graphics/pokemon/skitty/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 255 246 148 255 205 98 205 156 65 131 106 65 0 0 0 0 0 0 255 205 189 197 106 180 123 0 106 0 0 0 255 172 148 255 131 106 197 82 57 131 41 49 ================================================ FILE: graphics/pokemon/skitty/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 255 246 164 255 222 115 213 164 65 131 106 65 0 0 0 0 0 0 255 180 98 255 106 74 115 24 32 0 0 0 255 123 82 238 82 49 189 65 32 164 49 32 ================================================ FILE: graphics/pokemon/slaking/normal.pal ================================================ JASC-PAL 0100 16 115 156 164 90 65 49 139 106 82 172 139 106 197 172 148 213 205 180 246 238 213 90 98 123 205 205 238 238 238 255 255 255 255 139 49 65 197 82 115 222 131 148 16 0 0 255 255 255 ================================================ FILE: graphics/pokemon/slaking/shiny.pal ================================================ JASC-PAL 0100 16 115 156 164 74 65 49 106 98 74 139 123 106 197 172 148 213 205 180 246 238 213 189 131 65 255 197 106 255 238 148 255 255 255 164 49 32 213 82 41 255 123 82 16 0 0 255 255 255 ================================================ FILE: graphics/pokemon/slakoth/normal.pal ================================================ JASC-PAL 0100 16 139 148 205 0 0 0 82 57 41 115 82 41 139 106 65 65 65 65 156 156 156 205 205 205 255 255 255 139 49 65 189 90 74 213 123 106 255 164 139 180 148 106 205 180 139 230 205 164 ================================================ FILE: graphics/pokemon/slakoth/shiny.pal ================================================ JASC-PAL 0100 16 139 148 205 41 32 32 57 49 49 82 74 74 156 106 139 65 65 65 156 156 156 205 205 205 255 255 255 156 41 24 180 65 49 222 98 49 255 123 82 156 90 131 197 123 172 230 189 205 ================================================ FILE: graphics/pokemon/slowbro/normal.pal ================================================ JASC-PAL 0100 16 164 213 213 255 255 255 255 238 156 255 222 123 222 189 90 139 98 24 230 246 189 197 213 156 156 172 98 82 98 49 230 82 41 255 189 148 255 139 106 230 106 106 148 57 57 16 16 16 ================================================ FILE: graphics/pokemon/slowbro/shiny.pal ================================================ JASC-PAL 0100 16 213 213 205 255 255 255 255 238 156 255 205 98 230 172 90 164 115 32 230 197 106 189 156 65 148 115 24 98 65 0 230 82 41 197 180 222 164 156 213 123 115 172 74 65 123 16 16 16 ================================================ FILE: graphics/pokemon/slowking/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 123 57 205 74 32 156 32 0 205 74 32 230 106 49 255 180 115 148 106 0 255 189 49 255 255 139 82 82 65 148 148 123 180 180 172 222 222 205 255 255 255 ================================================ FILE: graphics/pokemon/slowking/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 98 164 246 49 90 189 131 32 74 180 90 115 213 123 148 255 180 197 148 106 0 238 189 65 255 255 139 82 82 65 148 148 123 180 180 172 222 222 205 255 255 255 ================================================ FILE: graphics/pokemon/slowpoke/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 222 213 213 255 255 189 255 246 131 230 197 90 131 82 8 255 0 255 246 65 32 180 41 41 106 98 98 255 180 148 255 131 98 230 90 106 156 49 49 16 16 16 ================================================ FILE: graphics/pokemon/slowpoke/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 213 205 205 255 255 189 255 255 148 238 213 106 156 74 32 255 0 255 246 65 32 139 32 32 106 98 98 255 205 205 238 180 197 197 139 156 139 74 90 16 16 16 ================================================ FILE: graphics/pokemon/slugma/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 189 106 255 131 74 222 90 32 148 32 0 255 213 115 255 238 156 255 213 115 246 164 0 255 0 255 255 0 255 255 0 255 255 0 255 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/slugma/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 213 213 213 180 180 180 123 123 123 74 74 74 230 230 230 255 238 156 255 213 115 246 164 0 255 0 255 255 0 255 255 0 255 255 0 255 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/smeargle/normal.pal ================================================ JASC-PAL 0100 16 189 213 213 255 255 255 24 156 0 222 222 189 172 172 139 139 131 82 246 131 0 180 0 0 106 90 49 74 57 16 106 222 65 65 197 24 0 98 0 197 197 197 148 148 156 16 16 16 ================================================ FILE: graphics/pokemon/smeargle/shiny.pal ================================================ JASC-PAL 0100 16 189 213 213 255 255 255 197 74 65 238 222 156 205 172 98 180 115 74 246 131 0 180 0 0 106 65 32 74 57 16 255 156 131 238 106 82 172 49 41 197 197 197 148 148 156 16 16 16 ================================================ FILE: graphics/pokemon/smoochum/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 172 41 255 148 164 222 74 123 139 16 90 255 230 82 222 205 49 148 131 24 255 197 164 246 230 172 222 197 131 139 131 74 213 213 213 180 180 180 0 0 0 ================================================ FILE: graphics/pokemon/smoochum/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 213 189 24 255 189 213 230 139 123 164 65 57 255 255 172 255 230 74 172 148 16 255 222 230 246 246 205 213 197 139 139 131 74 197 197 197 131 131 131 41 41 57 ================================================ FILE: graphics/pokemon/sneasel/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 139 172 156 82 123 106 57 90 74 41 57 41 255 205 213 255 115 106 197 74 74 131 16 32 230 74 74 106 98 123 189 180 197 255 230 90 205 131 0 16 16 16 ================================================ FILE: graphics/pokemon/sneasel/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 172 205 238 139 180 197 98 131 90 49 65 255 255 164 255 230 74 222 180 98 156 98 57 230 74 74 106 98 123 189 180 197 255 255 255 205 222 238 16 16 16 ================================================ FILE: graphics/pokemon/snorlax/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 123 164 148 98 131 115 57 98 82 57 82 65 255 255 197 246 246 156 238 222 156 139 139 74 213 164 106 197 139 82 189 24 24 213 213 222 106 106 115 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/snorlax/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 74 156 205 65 115 189 41 90 131 41 90 98 246 238 189 246 230 180 238 213 164 156 156 82 222 156 98 180 123 57 148 90 24 213 213 222 106 106 115 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/snorunt/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 222 222 222 255 123 82 180 65 49 180 115 49 255 238 164 255 213 106 230 172 90 139 213 255 156 139 139 65 148 213 139 123 123 82 74 74 57 49 49 41 32 32 255 255 255 ================================================ FILE: graphics/pokemon/snorunt/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 222 222 222 255 205 82 180 131 49 148 98 16 172 246 255 139 213 255 106 180 222 255 197 180 156 139 139 255 57 41 139 123 123 82 74 74 57 49 49 41 32 32 255 255 255 ================================================ FILE: graphics/pokemon/snubbull/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 164 41 41 255 0 255 148 41 57 230 98 106 238 180 164 255 205 197 255 131 41 16 16 16 65 65 82 98 115 115 148 164 164 65 139 172 172 222 246 222 222 222 255 255 255 ================================================ FILE: graphics/pokemon/snubbull/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 197 49 65 255 0 255 90 90 139 148 156 164 197 205 197 222 222 222 255 148 74 16 16 16 123 49 65 156 74 98 205 106 139 65 139 172 255 197 180 238 213 197 255 255 255 ================================================ FILE: graphics/pokemon/solrock/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 255 238 164 238 213 115 222 180 74 180 148 82 238 148 57 205 123 49 172 98 41 139 82 32 123 98 74 57 41 24 255 172 98 213 74 82 139 115 115 82 82 90 16 16 16 ================================================ FILE: graphics/pokemon/solrock/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 255 238 164 238 213 115 222 180 74 180 148 82 255 115 106 255 65 57 222 32 24 189 0 0 123 98 74 57 41 24 255 172 98 0 205 255 139 115 115 82 82 90 16 16 16 ================================================ FILE: graphics/pokemon/spearow/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 222 197 213 197 156 172 156 115 106 98 82 255 131 115 246 82 90 197 65 82 123 24 0 246 180 90 213 156 57 172 115 16 123 65 0 255 213 172 24 24 24 ================================================ FILE: graphics/pokemon/spearow/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 222 172 213 197 156 172 156 115 106 98 82 255 255 82 255 222 0 238 164 0 131 57 0 238 222 115 197 180 74 156 139 32 98 82 0 255 255 148 24 24 24 ================================================ FILE: graphics/pokemon/spheal/normal.pal ================================================ JASC-PAL 0100 16 98 197 98 16 16 57 74 82 139 106 123 213 156 164 255 197 197 255 255 255 255 106 90 49 164 148 106 213 197 148 230 213 172 246 230 189 222 222 255 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon/spheal/shiny.pal ================================================ JASC-PAL 0100 16 98 197 98 16 16 57 90 49 139 180 98 205 213 148 238 246 197 255 255 255 255 106 90 49 164 148 106 230 205 148 238 222 172 255 238 189 255 222 255 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon/spinarak/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 205 255 115 148 230 65 98 189 32 82 123 41 49 82 16 255 255 90 180 164 49 148 123 49 255 156 82 238 49 0 148 49 0 189 189 189 123 123 123 16 16 16 ================================================ FILE: graphics/pokemon/spinarak/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 180 213 222 139 172 189 82 106 156 57 74 90 32 49 74 230 172 205 172 90 123 106 65 82 255 156 82 238 49 0 148 49 0 189 189 189 123 123 123 16 16 16 ================================================ FILE: graphics/pokemon/spinda/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 246 230 172 230 213 164 197 180 131 172 148 106 222 139 74 222 106 57 180 90 41 156 57 24 115 65 16 172 65 90 255 255 0 255 255 0 123 98 74 90 65 49 16 16 16 ================================================ FILE: graphics/pokemon/spinda/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 246 230 172 230 213 164 197 180 131 172 148 106 180 197 90 148 164 57 115 131 24 82 98 0 49 65 0 172 65 90 255 255 0 255 255 0 123 98 74 90 65 49 16 16 16 ================================================ FILE: graphics/pokemon/spoink/normal.pal ================================================ JASC-PAL 0100 16 213 255 255 172 172 164 139 139 148 106 115 123 49 49 41 255 230 255 255 205 189 230 172 131 148 74 74 197 139 90 24 24 24 0 0 0 74 74 74 255 255 255 98 82 82 0 0 0 ================================================ FILE: graphics/pokemon/spoink/shiny.pal ================================================ JASC-PAL 0100 16 213 255 255 255 205 172 246 180 139 205 164 123 98 74 57 172 172 172 139 139 139 82 82 82 49 49 49 106 106 106 0 0 0 0 0 0 172 123 106 255 255 255 98 82 82 0 0 0 ================================================ FILE: graphics/pokemon/squirtle/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 213 148 82 189 106 0 98 41 0 213 205 205 255 230 156 255 213 106 230 172 90 213 131 57 205 49 24 180 222 238 139 197 213 131 148 172 65 115 98 16 16 16 ================================================ FILE: graphics/pokemon/squirtle/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 148 205 41 106 156 24 74 115 32 213 205 205 255 230 156 255 213 106 230 172 90 213 131 57 148 32 0 189 238 246 148 230 246 82 197 213 65 106 139 16 16 16 ================================================ FILE: graphics/pokemon/stantler/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 213 115 230 180 90 180 131 49 123 65 0 255 0 255 255 255 172 255 222 131 255 222 82 230 164 32 213 0 255 180 180 180 123 123 123 74 74 74 16 16 16 ================================================ FILE: graphics/pokemon/stantler/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 255 106 197 230 90 148 180 49 65 90 0 255 0 255 255 255 172 230 230 139 255 222 82 197 148 65 213 0 255 255 189 106 230 115 41 131 65 41 16 16 16 ================================================ FILE: graphics/pokemon/starmie/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 189 148 205 148 98 164 131 65 131 82 32 98 255 246 148 246 213 82 197 164 16 106 82 0 255 0 255 255 189 164 246 65 82 205 49 90 123 16 0 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/starmie/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 148 205 246 106 164 213 65 123 172 0 57 106 255 139 156 255 98 115 197 57 74 131 16 32 255 0 255 115 189 246 74 148 205 8 82 139 8 41 98 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/staryu/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 16 16 16 255 255 180 246 213 82 197 172 16 115 90 0 238 213 172 213 180 115 164 115 49 106 65 32 255 213 213 238 156 139 230 98 65 172 65 32 197 156 82 255 255 255 ================================================ FILE: graphics/pokemon/staryu/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 16 16 16 255 255 180 246 213 82 197 172 16 115 90 0 230 230 205 189 189 164 148 148 123 98 98 74 156 255 255 106 213 255 65 172 222 8 115 164 172 164 139 255 255 255 ================================================ FILE: graphics/pokemon/steelix/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 255 0 255 57 57 82 74 90 123 131 156 172 189 205 197 222 230 222 255 0 255 255 0 255 255 0 255 255 0 255 213 82 65 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/steelix/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 255 0 255 98 82 57 139 106 82 189 156 90 230 197 115 255 230 139 255 0 255 255 0 255 255 0 255 255 0 255 213 82 65 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/sudowoodo/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 230 197 106 189 156 82 148 115 49 98 74 16 255 0 255 139 255 139 41 222 49 41 172 49 24 106 32 255 205 0 222 148 0 156 106 0 180 180 180 16 16 16 ================================================ FILE: graphics/pokemon/sudowoodo/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 222 57 180 189 24 123 139 24 82 90 24 255 0 255 255 205 172 255 115 74 205 74 49 131 57 41 255 205 0 222 148 0 156 106 0 180 180 180 16 16 16 ================================================ FILE: graphics/pokemon/suicune/normal.pal ================================================ JASC-PAL 0100 16 205 205 180 255 255 255 189 238 255 123 189 255 90 115 213 57 74 148 213 180 255 172 106 255 139 49 230 82 57 139 164 0 0 213 213 213 180 180 180 148 148 148 106 106 106 16 16 16 ================================================ FILE: graphics/pokemon/suicune/shiny.pal ================================================ JASC-PAL 0100 16 205 205 180 255 255 255 238 255 255 197 230 255 106 164 230 49 82 156 106 189 255 57 139 222 8 90 180 32 57 98 164 0 0 213 205 230 189 172 197 139 123 148 98 82 106 16 16 16 ================================================ FILE: graphics/pokemon/sunflora/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 131 90 16 197 123 32 222 164 24 238 205 8 230 222 90 255 255 164 255 246 16 222 57 0 255 0 255 82 98 41 115 172 49 156 213 74 189 255 115 ================================================ FILE: graphics/pokemon/sunflora/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 16 16 16 255 0 255 98 82 0 148 123 0 205 172 32 238 222 82 230 222 90 255 255 164 255 255 164 222 57 0 255 0 255 82 74 0 123 115 0 180 172 41 230 222 74 ================================================ FILE: graphics/pokemon/sunkern/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 74 57 41 82 74 41 106 98 49 180 164 49 180 164 57 213 205 49 255 255 0 255 0 255 32 98 16 82 164 57 115 213 41 164 246 57 16 16 16 115 115 139 255 255 255 ================================================ FILE: graphics/pokemon/sunkern/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 74 57 41 82 57 41 106 74 49 164 106 32 172 115 49 213 164 49 255 213 90 255 0 255 32 98 16 82 164 57 156 230 49 205 255 98 16 16 16 115 115 139 255 255 255 ================================================ FILE: graphics/pokemon/surskit/normal.pal ================================================ JASC-PAL 0100 16 255 255 255 49 90 90 90 164 213 90 139 180 123 197 213 255 213 90 205 172 49 123 106 16 255 255 255 238 123 139 230 106 90 172 139 16 32 115 148 255 255 255 255 255 255 205 255 156 ================================================ FILE: graphics/pokemon/surskit/shiny.pal ================================================ JASC-PAL 0100 16 189 205 255 41 49 65 115 106 123 74 82 98 148 139 156 255 213 90 205 172 49 123 106 16 255 255 255 255 180 82 255 115 24 172 139 16 74 82 98 255 255 255 255 255 255 205 255 156 ================================================ FILE: graphics/pokemon/swablu/normal.pal ================================================ JASC-PAL 0100 16 123 172 123 180 180 222 131 131 148 90 90 115 57 106 131 213 213 230 0 0 0 156 156 197 123 205 255 98 172 230 90 148 205 213 255 255 148 197 197 172 230 255 238 238 246 255 255 255 ================================================ FILE: graphics/pokemon/swablu/shiny.pal ================================================ JASC-PAL 0100 16 123 172 123 180 180 222 131 131 148 90 90 115 156 106 0 213 213 230 0 0 0 156 156 197 255 238 131 255 205 98 222 172 65 213 255 255 148 197 197 255 238 131 238 238 246 255 255 255 ================================================ FILE: graphics/pokemon/swalot/normal.pal ================================================ JASC-PAL 0100 16 65 156 123 115 90 148 156 106 213 189 139 255 213 172 255 255 255 255 49 49 49 82 82 82 106 106 106 205 205 205 131 123 65 255 213 90 255 41 0 255 238 148 90 57 106 0 0 0 ================================================ FILE: graphics/pokemon/swalot/shiny.pal ================================================ JASC-PAL 0100 16 98 189 131 65 74 115 90 115 156 98 148 197 131 180 238 255 255 255 49 49 49 82 82 82 106 106 106 205 205 205 180 65 49 222 98 49 255 139 82 255 148 123 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon/swampert/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 197 230 255 172 189 230 131 164 197 41 49 98 255 213 74 246 156 65 205 131 65 139 98 74 156 74 90 57 82 131 139 205 255 90 172 230 49 131 197 82 106 164 16 16 16 ================================================ FILE: graphics/pokemon/swampert/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 230 246 255 205 213 230 180 139 230 74 65 106 255 197 74 246 106 82 222 98 49 180 65 49 139 65 24 106 49 123 246 205 246 230 172 246 197 115 222 139 82 156 16 16 16 ================================================ FILE: graphics/pokemon/swellow/normal.pal ================================================ JASC-PAL 0100 16 131 172 98 41 49 90 65 82 123 90 106 172 123 139 205 123 90 90 148 148 148 205 213 213 255 255 255 197 49 49 230 106 98 255 148 139 230 172 74 255 238 82 131 57 82 0 0 0 ================================================ FILE: graphics/pokemon/swellow/shiny.pal ================================================ JASC-PAL 0100 16 131 172 98 16 82 57 49 148 98 90 172 148 148 213 205 123 90 90 148 148 148 205 213 213 255 255 255 213 123 16 246 180 57 255 197 115 230 189 74 255 238 82 131 57 82 0 0 0 ================================================ FILE: graphics/pokemon/swinub/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 197 115 197 164 82 164 131 57 123 98 24 90 65 0 57 41 0 255 189 131 222 139 82 180 98 41 255 0 255 222 222 222 180 180 189 123 123 139 16 16 16 ================================================ FILE: graphics/pokemon/swinub/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 230 230 189 205 197 148 164 164 106 123 131 57 65 90 49 49 57 246 213 131 222 164 65 205 123 32 255 0 255 222 222 222 180 180 189 123 123 139 16 16 16 ================================================ FILE: graphics/pokemon/taillow/normal.pal ================================================ JASC-PAL 0100 16 131 172 98 41 49 90 74 90 148 90 106 172 123 139 205 123 90 90 148 148 148 205 213 213 255 255 255 197 49 49 230 106 98 255 148 139 230 189 74 255 238 82 131 57 82 0 0 0 ================================================ FILE: graphics/pokemon/taillow/shiny.pal ================================================ JASC-PAL 0100 16 131 172 98 16 82 57 49 148 98 90 172 148 148 213 205 123 90 90 148 148 148 205 213 213 255 255 255 213 123 16 246 180 57 255 197 115 230 189 74 255 238 82 131 57 82 0 0 0 ================================================ FILE: graphics/pokemon/tangela/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 172 222 246 131 189 213 65 123 148 32 65 82 255 131 131 213 65 82 148 41 41 255 0 255 255 0 255 255 0 255 255 0 255 180 180 180 82 82 82 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/tangela/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 123 222 57 82 180 16 41 139 0 0 74 0 255 131 131 222 90 90 148 41 41 255 0 255 255 0 255 255 0 255 255 0 255 180 180 180 82 82 82 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/tauros/normal.pal ================================================ JASC-PAL 0100 16 131 213 172 255 255 255 230 230 238 205 197 255 148 180 172 90 82 106 255 0 255 189 156 82 156 131 65 115 90 32 74 49 0 246 197 98 230 164 74 189 123 49 115 82 24 16 16 16 ================================================ FILE: graphics/pokemon/tauros/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 238 222 255 205 197 255 164 148 205 90 74 106 255 0 255 123 205 49 82 180 24 24 123 0 49 74 24 255 255 98 255 230 82 213 189 57 131 106 49 16 16 16 ================================================ FILE: graphics/pokemon/teddiursa/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 180 106 213 156 90 164 131 57 123 98 24 90 65 0 255 246 164 238 213 156 213 172 82 255 0 255 255 0 255 222 222 222 180 180 189 106 106 123 16 16 16 ================================================ FILE: graphics/pokemon/teddiursa/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 246 123 164 222 106 123 180 74 90 148 49 57 98 32 255 246 164 238 222 123 172 197 90 255 0 255 255 0 255 222 222 222 180 180 189 106 106 123 16 16 16 ================================================ FILE: graphics/pokemon/tentacool/normal.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 255 197 189 255 82 74 180 41 32 131 16 16 213 197 148 180 172 115 131 131 65 82 82 32 213 213 213 148 213 246 106 180 230 65 164 148 32 82 131 16 16 16 ================================================ FILE: graphics/pokemon/tentacool/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 115 197 139 74 156 98 32 115 57 16 74 16 213 197 148 180 172 115 131 131 65 82 82 32 213 213 213 213 213 255 172 172 230 131 131 189 74 74 131 16 16 16 ================================================ FILE: graphics/pokemon/tentacruel/normal.pal ================================================ JASC-PAL 0100 16 189 213 197 255 255 255 255 197 189 255 82 74 180 41 32 131 16 16 222 205 156 180 172 115 139 139 65 90 90 32 213 213 213 148 205 246 106 180 230 65 164 156 32 82 131 16 16 16 ================================================ FILE: graphics/pokemon/tentacruel/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 148 189 82 106 148 41 65 106 0 8 49 0 230 213 164 180 172 115 131 131 65 82 82 32 222 255 255 180 222 255 139 180 213 98 139 172 24 65 98 16 16 16 ================================================ FILE: graphics/pokemon/togepi/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 246 246 255 180 180 197 106 106 123 16 16 16 197 24 0 255 255 205 255 246 172 222 197 115 172 148 74 106 57 0 222 115 115 197 24 0 106 131 222 0 74 213 205 205 205 ================================================ FILE: graphics/pokemon/togepi/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 246 246 255 180 180 197 106 106 123 16 16 16 197 24 0 255 255 205 255 230 172 213 180 115 172 131 57 106 57 0 106 131 222 0 74 213 222 115 115 197 24 0 205 205 205 ================================================ FILE: graphics/pokemon/togetic/normal.pal ================================================ JASC-PAL 0100 16 131 197 139 230 230 238 205 205 205 172 172 189 131 131 148 90 90 115 16 16 16 255 0 255 255 0 255 255 0 255 139 0 0 222 115 115 180 0 0 106 131 222 0 41 197 255 255 255 ================================================ FILE: graphics/pokemon/togetic/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 246 230 222 172 189 180 139 148 139 32 106 90 57 16 16 16 255 0 255 255 0 255 255 0 255 139 0 0 106 131 222 0 41 197 222 115 115 180 0 0 255 255 230 ================================================ FILE: graphics/pokemon/torchic/normal.pal ================================================ JASC-PAL 0100 16 49 164 82 255 222 148 213 189 148 180 148 123 123 115 123 255 213 98 255 197 82 213 156 57 139 123 90 156 205 255 255 255 255 255 164 57 255 106 57 213 90 57 90 57 49 16 16 16 ================================================ FILE: graphics/pokemon/torchic/shiny.pal ================================================ JASC-PAL 0100 16 49 164 82 222 180 131 172 123 90 123 90 74 123 115 123 255 164 57 238 90 41 189 57 24 123 90 74 156 205 255 255 255 255 255 238 172 255 222 115 230 164 74 90 57 49 16 16 16 ================================================ FILE: graphics/pokemon/torkoal/normal.pal ================================================ JASC-PAL 0100 16 148 197 197 238 222 213 213 205 197 189 172 164 255 156 106 230 123 74 197 82 57 148 74 49 131 131 131 90 90 90 49 49 49 255 156 0 197 131 8 255 57 0 90 49 57 0 0 0 ================================================ FILE: graphics/pokemon/torkoal/shiny.pal ================================================ JASC-PAL 0100 16 148 197 197 255 238 230 222 213 205 205 189 180 255 230 156 255 213 106 222 156 74 148 90 0 213 123 123 180 90 90 123 32 32 255 156 0 197 131 8 255 57 0 82 0 0 0 0 0 ================================================ FILE: graphics/pokemon/totodile/normal.pal ================================================ JASC-PAL 0100 16 205 197 164 255 255 255 148 213 255 106 180 230 49 131 197 74 74 131 180 180 180 255 197 115 255 90 32 205 41 16 123 0 0 255 90 32 205 41 16 255 197 82 172 131 41 16 16 16 ================================================ FILE: graphics/pokemon/totodile/shiny.pal ================================================ JASC-PAL 0100 16 205 197 164 255 255 255 156 246 189 106 222 180 65 172 148 32 106 90 180 180 180 131 180 255 74 106 197 49 74 164 49 65 106 255 123 74 197 74 57 255 197 82 172 131 41 16 16 16 ================================================ FILE: graphics/pokemon/trapinch/normal.pal ================================================ JASC-PAL 0100 16 189 205 156 115 65 65 205 123 115 238 156 74 255 189 123 197 74 49 172 197 98 222 246 115 123 148 74 0 0 0 0 0 0 0 0 0 65 65 49 255 255 255 0 0 0 32 32 32 ================================================ FILE: graphics/pokemon/trapinch/shiny.pal ================================================ JASC-PAL 0100 16 189 205 156 24 49 41 90 131 123 123 164 156 156 197 189 197 74 49 172 197 98 222 246 115 123 148 74 0 0 0 0 0 0 0 0 0 65 65 49 255 255 255 0 0 0 32 32 32 ================================================ FILE: graphics/pokemon/treecko/normal.pal ================================================ JASC-PAL 0100 16 123 106 156 255 213 123 255 197 82 230 156 74 74 189 131 255 106 82 213 82 57 164 74 49 24 65 57 74 139 90 255 255 255 189 255 115 156 213 74 115 172 49 82 98 41 16 16 16 ================================================ FILE: graphics/pokemon/treecko/shiny.pal ================================================ JASC-PAL 0100 16 123 106 156 255 213 123 255 197 82 230 156 74 255 106 82 255 238 197 238 189 156 205 156 123 156 65 41 213 82 57 255 255 255 172 230 238 148 205 213 74 164 148 82 139 131 16 16 16 ================================================ FILE: graphics/pokemon/tropius/normal.pal ================================================ JASC-PAL 0100 16 16 123 189 32 98 32 57 172 65 123 222 139 189 246 156 106 74 41 164 115 49 189 139 82 205 164 106 238 189 57 255 255 106 255 255 255 0 0 0 230 106 139 164 82 106 82 197 90 ================================================ FILE: graphics/pokemon/tropius/shiny.pal ================================================ JASC-PAL 0100 16 16 123 189 49 90 0 106 148 0 172 213 32 205 246 65 106 74 41 222 156 8 246 189 41 255 222 74 238 189 57 255 255 106 255 255 255 0 0 0 230 106 139 164 82 106 139 180 0 ================================================ FILE: graphics/pokemon/typhlosion/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 98 139 180 65 82 123 41 57 98 0 8 74 255 238 148 213 197 106 164 139 74 98 74 16 255 222 0 255 156 0 255 98 0 238 8 0 16 16 16 255 255 197 ================================================ FILE: graphics/pokemon/typhlosion/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 213 106 90 172 65 74 131 41 65 106 32 41 255 230 115 222 197 82 172 139 49 139 82 24 255 222 0 255 156 0 255 98 0 238 0 0 16 16 16 255 246 156 ================================================ FILE: graphics/pokemon/tyranitar/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 197 238 197 164 213 164 115 164 115 57 82 57 255 0 255 98 180 255 74 156 230 32 123 189 0 74 139 213 82 0 148 41 0 197 197 197 115 115 115 16 16 16 ================================================ FILE: graphics/pokemon/tyranitar/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 246 213 148 222 189 123 172 139 82 106 74 41 255 0 255 238 172 213 213 148 197 164 98 156 106 49 98 213 82 0 148 41 0 197 197 197 115 115 115 16 16 16 ================================================ FILE: graphics/pokemon/tyrogue/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 222 255 238 172 255 205 131 205 172 98 156 131 49 90 230 139 65 205 98 41 180 49 0 115 0 0 230 139 65 180 49 0 213 213 213 172 172 172 16 16 16 ================================================ FILE: graphics/pokemon/tyrogue/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 238 230 205 205 197 172 156 148 131 106 98 90 90 82 65 82 180 255 65 139 230 49 82 180 32 65 131 230 139 65 180 49 0 213 213 213 172 172 172 16 16 16 ================================================ FILE: graphics/pokemon/umbreon/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 49 41 41 65 57 57 90 82 82 148 131 131 180 164 164 139 98 0 205 148 41 255 197 0 255 238 139 255 0 255 16 16 16 255 90 57 255 255 255 ================================================ FILE: graphics/pokemon/umbreon/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 49 41 41 65 57 57 90 82 82 148 131 131 180 164 164 32 74 148 41 106 230 98 180 255 148 230 255 255 0 255 16 16 16 255 213 16 255 255 255 ================================================ FILE: graphics/pokemon/unown/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 255 0 255 222 222 222 255 255 255 16 16 16 164 164 164 115 115 115 82 82 82 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/pokemon/unown/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 0 255 255 0 255 255 0 255 98 205 255 255 255 255 16 16 16 41 115 255 32 65 156 49 57 106 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/pokemon/ursaring/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 222 197 115 197 164 82 164 131 57 123 98 24 74 49 0 255 246 164 255 213 123 213 172 82 180 131 41 255 0 255 222 222 222 180 180 189 123 123 139 16 16 16 ================================================ FILE: graphics/pokemon/ursaring/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 164 230 65 131 205 41 98 172 16 65 139 0 57 82 0 255 246 164 255 213 123 213 172 82 180 131 41 255 0 255 222 222 222 180 180 189 123 123 139 16 16 16 ================================================ FILE: graphics/pokemon/vaporeon/normal.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 230 230 230 172 172 205 255 238 123 230 189 74 139 123 41 115 139 180 90 115 156 49 65 123 90 90 115 131 238 213 98 205 180 57 164 139 16 106 82 41 41 41 ================================================ FILE: graphics/pokemon/vaporeon/shiny.pal ================================================ JASC-PAL 0100 16 213 213 213 255 255 255 230 230 230 172 172 205 255 255 156 230 197 74 139 139 16 172 90 115 180 115 156 131 57 90 90 90 115 255 197 246 230 172 230 189 131 197 123 65 139 41 41 41 ================================================ FILE: graphics/pokemon/venomoth/normal.pal ================================================ JASC-PAL 0100 16 98 205 139 255 255 255 230 230 230 172 197 197 230 213 172 197 172 139 164 131 106 98 82 57 238 230 98 246 213 82 16 16 16 246 222 255 238 197 255 213 172 222 172 139 205 98 74 115 ================================================ FILE: graphics/pokemon/venomoth/shiny.pal ================================================ JASC-PAL 0100 16 197 197 148 255 255 255 230 230 230 172 197 197 230 213 172 197 172 139 164 131 106 98 82 57 238 230 98 246 213 82 16 16 16 156 213 255 139 189 238 139 172 230 98 131 197 49 74 115 ================================================ FILE: graphics/pokemon/venonat/normal.pal ================================================ JASC-PAL 0100 16 148 213 156 255 255 255 148 115 164 213 213 213 123 123 123 255 180 172 255 123 82 197 82 32 238 189 156 189 139 106 131 82 49 164 139 189 139 106 156 106 82 115 65 57 82 16 16 16 ================================================ FILE: graphics/pokemon/venonat/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 148 115 164 213 213 213 131 131 131 156 230 255 106 180 255 57 131 197 238 189 156 189 139 106 139 90 57 180 123 197 148 82 164 106 65 115 65 16 82 16 16 16 ================================================ FILE: graphics/pokemon/venusaur/normal.pal ================================================ JASC-PAL 0100 16 238 238 238 32 98 49 98 156 115 90 205 148 139 238 189 139 57 0 189 106 49 16 16 16 230 74 65 255 131 115 156 246 139 222 205 49 255 238 82 65 164 24 106 205 65 255 255 255 ================================================ FILE: graphics/pokemon/venusaur/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 16 82 32 131 164 0 180 213 16 213 246 49 131 49 0 189 106 49 16 16 16 246 123 0 255 197 41 156 246 139 255 238 82 255 255 255 41 164 16 82 205 57 255 255 255 ================================================ FILE: graphics/pokemon/vibrava/normal.pal ================================================ JASC-PAL 0100 16 148 197 148 139 238 180 98 197 148 49 139 98 255 255 164 230 213 139 189 180 123 222 222 255 189 189 222 205 205 205 123 115 57 0 0 0 164 164 164 131 131 131 82 82 82 255 255 255 ================================================ FILE: graphics/pokemon/vibrava/shiny.pal ================================================ JASC-PAL 0100 16 148 197 148 255 180 123 246 123 74 197 82 24 255 255 164 230 213 139 189 180 123 222 222 255 189 189 222 205 205 205 123 115 57 0 0 0 164 164 164 131 131 131 106 106 106 255 255 255 ================================================ FILE: graphics/pokemon/victreebel/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 180 131 41 213 213 213 255 164 115 213 74 32 255 230 156 255 213 106 230 172 90 189 255 115 156 213 74 115 172 49 82 98 41 180 123 49 106 65 0 16 16 16 ================================================ FILE: graphics/pokemon/victreebel/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 131 148 8 213 213 213 90 156 222 49 115 180 255 255 156 230 255 106 189 213 65 238 213 115 197 172 74 156 131 32 106 82 16 180 123 49 106 65 0 16 16 16 ================================================ FILE: graphics/pokemon/vigoroth/normal.pal ================================================ JASC-PAL 0100 16 74 123 164 82 65 32 115 49 49 115 82 41 139 106 65 65 65 65 131 131 131 205 205 205 255 255 255 139 65 90 213 57 49 255 98 98 230 230 230 172 131 98 90 90 82 0 0 0 ================================================ FILE: graphics/pokemon/vigoroth/shiny.pal ================================================ JASC-PAL 0100 16 74 123 164 82 65 32 115 49 49 115 82 41 139 106 65 65 65 65 205 148 82 246 213 115 255 255 255 172 74 0 230 82 24 255 164 98 255 238 156 172 131 98 90 90 82 0 0 0 ================================================ FILE: graphics/pokemon/vileplume/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 164 41 197 156 41 180 106 32 255 98 98 238 49 49 197 65 82 139 32 24 255 205 213 246 172 180 115 131 164 90 98 131 65 74 98 24 41 74 16 16 16 ================================================ FILE: graphics/pokemon/vileplume/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 255 255 255 230 156 230 172 90 189 131 49 255 238 123 246 205 90 230 164 41 172 90 24 255 255 238 255 246 205 98 180 74 90 148 74 74 115 65 32 74 24 16 16 16 ================================================ FILE: graphics/pokemon/volbeat/normal.pal ================================================ JASC-PAL 0100 16 148 197 148 222 222 222 139 139 148 74 74 82 0 0 0 246 131 115 230 82 98 205 57 82 139 49 74 255 230 82 222 189 82 98 74 49 164 180 197 123 139 164 74 82 106 255 255 255 ================================================ FILE: graphics/pokemon/volbeat/shiny.pal ================================================ JASC-PAL 0100 16 148 197 148 222 222 222 139 139 148 74 74 82 0 0 0 123 197 255 90 172 230 49 131 197 74 74 131 255 230 82 222 189 82 98 74 49 205 139 222 164 82 189 65 32 82 255 255 255 ================================================ FILE: graphics/pokemon/voltorb/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 213 213 180 172 172 90 82 82 255 0 255 255 0 255 255 0 255 255 0 255 255 131 131 255 172 156 255 82 32 230 65 0 205 65 65 131 16 16 16 16 16 ================================================ FILE: graphics/pokemon/voltorb/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 222 213 213 180 172 172 90 82 82 255 0 255 255 0 255 255 0 255 255 0 255 49 90 205 82 106 238 41 65 197 0 24 156 0 0 115 0 0 74 16 16 16 ================================================ FILE: graphics/pokemon/vulpix/normal.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 255 230 180 255 222 148 16 16 16 238 156 74 205 123 41 172 90 8 255 131 74 222 106 41 189 65 41 148 49 0 246 189 123 230 148 106 197 115 74 131 57 0 ================================================ FILE: graphics/pokemon/vulpix/shiny.pal ================================================ JASC-PAL 0100 16 213 213 180 255 255 255 246 255 230 213 222 189 16 16 16 197 180 41 156 139 0 115 98 0 246 205 8 222 180 0 180 139 0 123 82 0 246 238 82 222 213 0 197 180 0 90 74 0 ================================================ FILE: graphics/pokemon/wailmer/normal.pal ================================================ JASC-PAL 0100 16 131 172 90 32 49 74 49 106 156 74 131 180 98 156 205 255 238 205 238 213 164 205 180 131 0 0 0 156 139 98 148 197 238 57 82 123 106 98 74 131 139 156 180 189 197 255 255 255 ================================================ FILE: graphics/pokemon/wailmer/shiny.pal ================================================ JASC-PAL 0100 16 131 172 90 82 41 123 148 106 189 180 139 222 213 172 255 255 238 205 238 213 164 205 180 131 0 0 0 156 139 98 246 205 255 115 74 156 106 98 74 131 139 156 180 189 197 255 255 255 ================================================ FILE: graphics/pokemon/wailord/normal.pal ================================================ JASC-PAL 0100 16 148 197 197 238 230 255 213 205 222 180 172 180 180 156 172 131 115 131 148 172 255 82 131 255 49 98 255 41 82 197 49 57 90 123 106 98 82 74 74 0 0 0 180 205 255 41 82 123 ================================================ FILE: graphics/pokemon/wailord/shiny.pal ================================================ JASC-PAL 0100 16 148 197 197 238 230 255 213 205 222 180 172 180 180 156 172 131 115 131 230 197 255 213 172 255 172 131 213 131 90 172 82 41 123 123 106 98 82 74 74 0 0 0 246 222 255 115 74 156 ================================================ FILE: graphics/pokemon/walrein/normal.pal ================================================ JASC-PAL 0100 16 98 115 148 49 82 123 57 115 172 90 139 197 131 180 230 164 131 90 255 197 98 255 222 131 255 255 164 197 49 49 238 131 131 123 180 255 197 205 222 0 0 0 222 230 255 255 255 255 ================================================ FILE: graphics/pokemon/walrein/shiny.pal ================================================ JASC-PAL 0100 16 98 115 148 82 74 123 164 90 189 197 131 222 230 180 238 164 131 90 255 197 98 255 222 131 255 255 164 197 49 49 238 131 131 123 180 255 197 205 222 0 0 0 222 230 255 255 255 255 ================================================ FILE: graphics/pokemon/wartortle/normal.pal ================================================ JASC-PAL 0100 16 255 238 230 255 255 255 230 238 230 197 213 222 197 49 0 205 131 32 148 98 98 106 74 24 246 238 139 222 197 139 189 139 57 213 189 255 172 139 238 123 106 197 82 65 123 16 16 16 ================================================ FILE: graphics/pokemon/wartortle/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 197 238 197 156 213 164 197 49 0 164 148 65 98 115 32 65 82 0 255 222 115 230 172 90 189 139 57 230 205 238 205 172 230 164 139 180 82 65 106 16 16 16 ================================================ FILE: graphics/pokemon/weedle/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 205 205 205 131 131 148 255 205 115 238 172 65 213 139 106 139 41 16 255 205 180 230 106 106 205 41 0 139 41 16 255 238 180 238 172 115 255 0 255 24 24 24 ================================================ FILE: graphics/pokemon/weedle/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 205 205 205 131 131 148 255 246 106 255 222 65 230 180 49 156 98 24 246 197 213 230 164 205 180 115 148 115 65 98 255 238 180 213 197 106 255 0 255 24 24 24 ================================================ FILE: graphics/pokemon/weepinbell/normal.pal ================================================ JASC-PAL 0100 16 246 246 246 255 255 255 180 131 41 255 164 115 238 115 65 189 65 16 255 230 156 255 213 106 238 180 0 189 255 115 156 213 74 115 172 49 82 98 41 172 123 41 115 82 16 16 16 16 ================================================ FILE: graphics/pokemon/weepinbell/shiny.pal ================================================ JASC-PAL 0100 16 246 246 246 255 255 255 106 139 16 197 172 180 156 131 139 115 90 98 255 255 115 222 230 74 180 189 32 246 255 123 205 238 82 164 197 41 74 106 0 172 123 41 115 82 16 16 16 16 ================================================ FILE: graphics/pokemon/weezing/normal.pal ================================================ JASC-PAL 0100 16 139 205 156 255 255 255 230 230 230 230 205 57 255 230 0 222 98 32 164 32 0 255 255 123 230 213 115 197 180 41 238 172 197 213 148 172 180 106 139 139 65 98 98 41 65 16 16 16 ================================================ FILE: graphics/pokemon/weezing/shiny.pal ================================================ JASC-PAL 0100 16 205 205 205 255 255 255 222 222 222 172 90 156 205 123 172 222 98 32 164 32 0 213 139 197 180 106 164 139 65 123 172 222 213 148 189 189 106 148 148 41 82 82 8 49 49 16 16 16 ================================================ FILE: graphics/pokemon/whiscash/normal.pal ================================================ JASC-PAL 0100 16 164 156 90 0 0 0 82 98 148 98 115 164 115 139 180 148 180 222 222 164 57 255 213 74 172 238 255 57 74 115 139 106 49 131 148 172 131 197 230 106 189 222 131 222 255 255 255 255 ================================================ FILE: graphics/pokemon/whiscash/shiny.pal ================================================ JASC-PAL 0100 16 164 156 90 0 0 0 57 65 82 74 82 98 115 106 123 148 139 156 222 98 49 255 123 82 172 238 255 57 74 115 180 65 49 131 148 172 131 197 230 106 189 222 131 222 255 255 255 255 ================================================ FILE: graphics/pokemon/whismur/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 164 238 238 148 213 222 106 189 189 82 139 139 57 98 115 8 24 255 213 123 246 172 57 213 156 0 164 115 24 213 213 222 156 156 164 90 90 106 0 0 0 ================================================ FILE: graphics/pokemon/whismur/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 255 205 205 255 172 197 238 123 156 222 90 115 189 49 65 115 8 24 205 255 172 148 230 148 115 189 115 65 139 90 213 213 222 156 156 164 90 90 106 41 41 57 ================================================ FILE: graphics/pokemon/wigglytuff/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 148 222 205 230 49 49 82 164 139 32 90 98 156 106 32 115 65 24 230 230 230 205 205 205 16 16 16 255 222 205 255 197 172 246 148 148 205 106 98 156 74 74 ================================================ FILE: graphics/pokemon/wigglytuff/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 98 230 131 230 49 49 90 197 106 57 156 65 156 106 32 115 65 24 230 230 230 205 205 205 16 16 16 255 222 238 246 197 230 230 172 213 180 115 164 74 24 74 ================================================ FILE: graphics/pokemon/wingull/normal.pal ================================================ JASC-PAL 0100 16 156 205 255 57 57 57 139 139 139 222 213 255 197 189 230 246 238 255 49 82 139 222 131 0 255 172 49 139 90 16 82 115 230 115 164 255 98 98 98 0 0 0 0 0 0 255 205 106 ================================================ FILE: graphics/pokemon/wingull/shiny.pal ================================================ JASC-PAL 0100 16 156 205 255 57 57 57 131 156 164 222 197 246 205 172 230 246 238 255 41 106 41 222 131 0 255 172 49 139 90 16 90 156 57 123 205 90 98 98 98 0 0 0 0 0 0 255 205 106 ================================================ FILE: graphics/pokemon/wobbuffet/normal.pal ================================================ JASC-PAL 0100 16 222 222 222 255 0 255 164 16 0 197 57 0 222 82 0 255 139 0 41 74 82 32 115 148 74 156 189 106 189 222 156 213 238 255 0 255 16 16 16 82 82 82 131 131 131 255 255 255 ================================================ FILE: graphics/pokemon/wobbuffet/shiny.pal ================================================ JASC-PAL 0100 16 222 222 222 255 0 255 164 16 0 197 57 0 222 82 0 255 139 0 106 57 90 156 65 139 205 90 189 238 123 205 255 164 213 255 0 255 16 16 16 82 82 82 131 131 131 255 255 255 ================================================ FILE: graphics/pokemon/wooper/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 148 131 164 16 41 115 49 74 131 74 156 213 139 197 246 197 230 230 238 172 255 197 123 197 148 98 164 98 57 106 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/wooper/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 180 90 98 123 57 49 156 90 90 213 156 164 246 197 205 255 230 213 255 213 172 230 148 98 197 98 82 131 74 74 255 0 255 255 0 255 255 0 255 16 16 16 255 255 255 ================================================ FILE: graphics/pokemon/wurmple/normal.pal ================================================ JASC-PAL 0100 16 197 197 197 98 82 82 180 164 156 255 255 255 230 213 238 205 82 90 246 123 98 246 189 139 230 213 238 222 213 164 255 255 213 148 148 0 246 246 0 197 197 90 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/wurmple/shiny.pal ================================================ JASC-PAL 0100 16 197 197 197 98 82 82 180 164 156 255 255 255 230 213 238 164 82 139 189 131 164 222 164 197 230 213 238 222 213 164 255 255 213 148 148 0 246 246 0 197 197 90 0 0 0 24 24 24 ================================================ FILE: graphics/pokemon/wynaut/normal.pal ================================================ JASC-PAL 0100 16 197 148 98 41 74 82 74 156 189 106 189 222 156 213 238 164 49 65 222 90 98 65 57 57 131 123 123 106 98 98 205 205 197 255 255 255 57 123 164 123 41 57 0 0 0 205 246 164 ================================================ FILE: graphics/pokemon/wynaut/shiny.pal ================================================ JASC-PAL 0100 16 197 148 98 106 57 90 197 82 189 238 123 205 255 164 213 164 49 65 222 90 98 65 57 57 131 123 123 106 98 98 205 205 197 255 255 255 180 115 90 123 41 57 0 0 0 205 246 164 ================================================ FILE: graphics/pokemon/xatu/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 156 230 74 82 205 74 74 148 65 49 98 41 255 222 65 189 148 32 139 90 0 238 57 0 180 49 0 131 41 0 205 205 205 148 148 148 82 82 82 41 41 41 ================================================ FILE: graphics/pokemon/xatu/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 255 255 255 189 255 65 164 230 49 115 189 8 65 106 0 255 222 65 189 148 32 139 90 0 255 164 57 213 106 16 115 74 0 205 205 205 148 148 148 82 82 82 41 41 41 ================================================ FILE: graphics/pokemon/yanma/normal.pal ================================================ JASC-PAL 0100 16 205 205 172 148 49 0 255 0 255 213 65 0 255 123 65 255 222 148 16 16 16 49 106 0 82 180 32 131 238 32 74 74 82 255 0 255 115 131 139 164 180 213 230 255 255 255 0 255 ================================================ FILE: graphics/pokemon/yanma/shiny.pal ================================================ JASC-PAL 0100 16 205 205 172 0 65 148 255 0 255 41 115 230 74 180 255 115 230 255 16 16 16 49 106 0 82 180 32 131 238 32 74 74 82 255 0 255 115 131 139 164 180 213 230 255 255 255 0 255 ================================================ FILE: graphics/pokemon/zangoose/normal.pal ================================================ JASC-PAL 0100 16 148 197 197 255 255 255 230 222 230 189 172 180 148 131 139 106 90 98 255 98 106 205 90 106 139 65 82 255 164 148 213 139 230 123 106 98 213 197 205 0 0 0 180 98 205 123 57 131 ================================================ FILE: graphics/pokemon/zangoose/shiny.pal ================================================ JASC-PAL 0100 16 148 197 197 255 255 255 230 222 230 189 172 180 148 131 139 106 90 98 49 131 197 74 74 131 57 57 115 90 172 230 255 123 82 123 106 98 213 197 205 0 0 0 222 98 49 180 49 32 ================================================ FILE: graphics/pokemon/zapdos/normal.pal ================================================ JASC-PAL 0100 16 131 213 123 255 255 255 222 222 222 156 156 156 65 65 65 16 16 16 255 0 255 255 0 255 255 189 57 222 164 49 148 90 32 255 255 139 255 238 0 230 205 16 172 139 65 123 90 41 ================================================ FILE: graphics/pokemon/zapdos/shiny.pal ================================================ JASC-PAL 0100 16 213 213 189 255 255 255 222 222 222 156 156 156 90 90 90 16 16 16 255 0 255 255 0 255 255 106 65 213 65 32 156 57 41 255 238 32 255 197 0 205 148 0 156 98 0 115 57 0 ================================================ FILE: graphics/pokemon/zigzagoon/normal.pal ================================================ JASC-PAL 0100 16 156 189 131 74 65 41 172 123 90 205 156 123 238 189 156 255 238 197 65 57 49 106 90 74 197 172 139 230 213 172 255 255 255 164 32 0 205 57 32 164 148 123 123 90 74 16 0 0 ================================================ FILE: graphics/pokemon/zigzagoon/shiny.pal ================================================ JASC-PAL 0100 16 156 189 131 74 65 41 197 98 65 222 131 74 238 164 74 255 238 197 49 49 41 98 57 41 197 172 139 230 213 172 255 255 255 164 32 0 205 57 32 164 148 123 131 82 57 16 0 0 ================================================ FILE: graphics/pokemon/zubat/normal.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 213 213 213 98 98 98 16 16 16 255 0 255 189 205 255 139 180 238 106 139 189 74 65 123 246 131 222 213 115 189 180 82 156 115 32 90 255 0 255 255 0 255 ================================================ FILE: graphics/pokemon/zubat/shiny.pal ================================================ JASC-PAL 0100 16 230 230 230 255 255 255 213 213 213 98 98 98 16 16 16 255 0 255 148 180 98 106 139 57 65 98 16 24 57 0 238 222 213 205 180 172 164 139 131 106 82 74 255 0 255 255 0 255 ================================================ FILE: graphics/pokemon_jump/bg.pal ================================================ JASC-PAL 0100 16 156 156 197 106 222 156 106 230 230 139 230 255 156 238 255 197 246 255 189 213 131 230 213 115 238 230 131 246 246 156 222 222 172 106 230 172 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/pokemon_jump/bonuses.pal ================================================ JASC-PAL 0100 16 156 156 197 148 197 115 172 222 123 213 180 57 238 205 65 230 164 131 246 189 172 98 98 82 164 148 90 205 189 82 255 238 74 156 164 230 90 90 106 172 148 106 230 205 123 180 189 246 ================================================ FILE: graphics/pokemon_jump/interface.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 0 0 0 222 222 213 255 156 24 255 222 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon_jump/pal1.pal ================================================ JASC-PAL 0100 16 156 156 197 65 148 74 82 180 74 106 205 74 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 98 98 82 205 189 82 255 246 82 255 255 255 238 172 131 238 230 131 ================================================ FILE: graphics/pokemon_jump/pal2.pal ================================================ JASC-PAL 0100 16 0 0 0 49 123 57 65 139 57 82 164 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon_jump/venusaur.pal ================================================ JASC-PAL 0100 16 213 213 213 32 98 49 98 156 115 90 205 148 139 238 189 139 57 0 189 106 49 16 16 16 230 74 65 255 131 115 156 246 139 222 205 49 255 238 82 65 164 24 106 205 65 255 255 255 ================================================ FILE: graphics/pokemon_special_anim/bg.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 255 222 189 255 222 180 255 213 180 255 205 180 255 205 164 255 205 156 255 205 139 0 0 0 255 197 139 255 172 131 255 213 156 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon_special_anim/bg_tm_hm.pal ================================================ JASC-PAL 0100 16 0 0 0 222 238 255 213 238 255 213 230 255 213 230 255 205 230 255 205 222 255 205 222 255 197 222 255 0 0 0 189 222 255 172 213 255 205 230 255 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon_storage/interface.pal ================================================ JASC-PAL 0100 16 0 0 0 148 148 172 115 115 123 82 82 90 148 148 172 246 172 82 164 164 180 0 0 0 164 205 246 123 180 213 255 222 148 213 230 255 180 213 246 156 205 238 255 255 255 90 255 238 ================================================ FILE: graphics/pokemon_storage/interface_no_display_mon.pal ================================================ JASC-PAL 0100 16 255 246 148 148 148 172 115 115 123 82 82 90 139 139 164 164 123 0 164 164 180 0 0 0 164 205 246 123 180 213 197 189 24 213 230 255 180 213 246 156 205 238 180 180 180 90 255 238 ================================================ FILE: graphics/pokemon_storage/menu.pal ================================================ JASC-PAL 0100 16 0 90 57 148 148 172 255 255 255 0 0 0 222 222 246 90 189 238 164 164 180 98 98 115 0 0 0 82 82 90 189 238 98 164 222 74 164 230 74 180 230 115 148 205 57 148 148 172 ================================================ FILE: graphics/pokemon_storage/misc1.pal ================================================ JASC-PAL 0100 16 255 197 255 148 148 172 82 82 90 255 230 90 246 222 115 246 230 180 205 123 0 123 74 0 255 255 255 255 255 255 255 255 255 255 180 106 255 164 0 255 255 255 222 222 222 0 0 0 ================================================ FILE: graphics/pokemon_storage/misc2.pal ================================================ JASC-PAL 0100 16 0 0 0 148 148 172 82 82 90 255 255 255 205 255 255 90 189 238 90 164 205 82 131 164 82 106 123 82 82 90 0 0 0 222 222 246 164 164 180 148 148 172 115 115 123 82 82 90 ================================================ FILE: graphics/pokemon_storage/party_menu.pal ================================================ JASC-PAL 0100 16 0 0 0 131 172 180 41 106 98 82 98 115 74 172 164 57 139 139 164 213 246 115 189 98 255 255 255 123 189 255 0 123 255 41 90 164 123 205 180 8 74 65 164 238 148 65 82 90 ================================================ FILE: graphics/pokemon_storage/scrolling_bg_move_items.pal ================================================ JASC-PAL 0100 16 0 0 0 148 148 172 255 255 255 0 0 0 123 189 255 0 123 255 255 131 131 172 24 24 230 246 255 222 238 246 213 238 246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/pokemon_storage/unused.pal ================================================ JASC-PAL 0100 32 0 0 0 65 205 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 139 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 148 172 0 0 0 255 156 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 189 90 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 148 172 ================================================ FILE: graphics/pokemon_storage/unused_choose_box_menu.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 246 222 115 246 230 180 205 123 0 123 74 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/region_map/cursor.pal ================================================ JASC-PAL 0100 16 98 156 0 255 255 255 255 255 255 230 230 246 205 205 230 180 180 222 156 156 205 131 131 197 98 98 180 74 74 164 49 49 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/region_map/misc_icon.pal ================================================ JASC-PAL 0100 16 139 148 172 255 255 255 205 205 205 148 148 148 98 98 98 139 205 255 90 131 246 90 106 180 255 255 24 189 156 65 90 74 49 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/region_map/player_icon_leaf.pal ================================================ JASC-PAL 0100 16 115 197 164 172 123 65 255 197 148 222 148 115 123 65 65 65 65 213 57 57 123 115 164 197 106 41 41 238 238 255 180 180 213 255 106 74 197 57 57 255 222 90 189 156 57 0 0 0 ================================================ FILE: graphics/region_map/player_icon_red.pal ================================================ JASC-PAL 0100 16 115 197 164 172 123 65 255 197 148 222 148 115 123 65 65 65 65 213 57 57 123 115 164 197 106 41 41 238 238 255 180 180 213 255 106 74 197 57 57 255 222 90 189 156 57 0 0 0 ================================================ FILE: graphics/region_map/region_map.pal ================================================ JASC-PAL 0100 80 0 0 0 24 131 8 57 172 8 82 205 8 115 230 32 172 246 57 230 164 0 238 189 57 246 213 82 238 230 115 230 222 164 205 205 148 82 148 213 90 172 230 156 213 255 164 180 255 0 0 0 255 0 255 255 0 255 255 0 255 255 0 255 246 238 139 148 0 0 255 57 16 255 172 16 98 98 98 205 205 205 255 255 255 230 164 0 238 189 57 246 213 82 238 230 115 0 0 0 139 74 49 180 82 49 230 115 49 246 205 49 189 156 41 57 164 49 82 213 49 222 189 49 255 0 255 255 0 255 164 164 164 230 230 238 65 65 74 115 115 115 255 255 255 0 0 0 189 156 41 255 222 49 246 246 238 98 98 98 115 115 98 164 172 172 255 57 16 222 156 57 90 131 172 106 65 65 49 49 49 205 123 74 255 0 255 156 213 255 164 180 255 0 0 0 255 255 255 205 205 205 148 148 148 98 98 98 139 205 255 90 131 246 90 106 180 255 255 24 189 156 65 90 74 49 189 189 180 205 205 189 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/region_map/region_map_hoenn.pal ================================================ JASC-PAL 0100 32 0 0 0 156 213 255 164 180 255 123 180 213 74 156 230 41 131 230 65 106 205 0 115 172 32 74 197 0 57 139 213 255 123 172 238 49 98 213 0 57 172 8 0 115 0 205 205 148 0 0 0 255 255 255 238 230 172 238 230 115 238 189 57 246 213 82 230 164 0 255 172 16 255 57 16 246 0 0 148 0 0 205 205 205 98 98 98 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/region_map/switch_map_cursor.pal ================================================ JASC-PAL 0100 16 131 139 139 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/region_map/top_bar.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 255 164 74 230 222 139 0 0 0 0 0 0 0 0 0 16 115 230 ================================================ FILE: graphics/seagallop/ferry_and_wake.pal ================================================ JASC-PAL 0100 16 65 123 180 238 246 255 222 230 238 189 205 230 156 164 189 139 139 156 98 98 123 57 57 106 197 98 98 172 65 106 32 74 156 197 148 0 246 213 24 222 238 255 255 255 255 74 106 139 ================================================ FILE: graphics/slot_machine/firered/match_lines.pal ================================================ JASC-PAL 0100 16 222 222 222 213 57 0 205 90 0 255 255 255 238 172 0 0 164 238 238 131 0 238 131 0 0 222 0 0 222 0 139 255 255 255 238 106 255 238 106 148 255 148 148 255 148 0 0 0 ================================================ FILE: graphics/slot_machine/firered/payout_lights.pal ================================================ JASC-PAL 0100 48 222 222 222 255 255 255 238 172 0 255 255 131 255 180 65 255 255 255 255 255 131 255 255 131 255 180 65 255 180 65 255 90 0 255 90 0 222 41 0 255 205 32 156 0 0 0 0 0 222 222 222 255 255 255 238 172 0 255 180 65 255 90 0 255 255 131 255 180 65 255 255 255 255 255 131 255 255 131 255 180 65 255 180 65 255 90 0 255 205 32 156 0 0 0 0 0 222 222 222 255 255 255 238 172 0 255 90 0 222 41 0 255 180 65 255 90 0 255 255 131 255 180 65 255 255 255 255 255 131 255 255 131 255 180 65 255 205 32 156 0 0 0 0 0 ================================================ FILE: graphics/slot_machine/leafgreen/match_lines.pal ================================================ JASC-PAL 0100 16 222 222 222 65 156 41 90 164 57 255 255 255 139 222 82 0 180 255 255 148 0 255 148 0 0 238 0 0 238 0 139 255 255 255 238 106 255 238 106 148 255 148 148 255 148 0 0 0 ================================================ FILE: graphics/slot_machine/leafgreen/payout_lights.pal ================================================ JASC-PAL 0100 48 222 222 222 255 255 255 139 222 82 255 255 131 255 180 65 255 255 255 255 255 131 255 255 131 255 180 65 255 180 65 255 90 0 255 90 0 222 41 0 197 246 139 156 0 0 0 0 0 222 222 222 255 255 255 139 222 82 255 180 65 255 90 0 255 255 131 255 180 65 255 255 255 255 255 131 255 255 131 255 180 65 255 180 65 255 90 0 197 246 139 156 0 0 0 0 0 222 222 222 255 255 255 139 222 82 255 90 0 222 41 0 255 180 65 255 90 0 255 255 131 255 180 65 255 255 255 255 255 131 255 255 131 255 180 65 197 246 139 156 0 0 0 0 0 ================================================ FILE: graphics/summary_screen/hp_bar_red.pal ================================================ JASC-PAL 0100 16 189 189 148 255 90 57 172 65 74 123 131 148 98 106 123 255 213 82 255 180 65 139 205 255 82 164 238 0 0 0 0 0 0 180 172 139 156 148 115 131 139 156 98 106 123 255 255 255 ================================================ FILE: graphics/summary_screen/hp_bar_yellow.pal ================================================ JASC-PAL 0100 16 189 189 148 255 230 57 205 172 8 123 131 148 98 106 123 255 213 82 255 180 65 139 205 255 82 164 238 0 0 0 0 0 0 180 172 139 156 148 115 131 139 156 98 106 123 255 255 255 ================================================ FILE: graphics/summary_screen/marking.pal ================================================ JASC-PAL 0100 16 0 0 0 222 222 222 238 230 238 255 139 8 246 189 123 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/summary_screen/move_selection_cursor.pal ================================================ JASC-PAL 0100 16 0 0 0 230 57 0 0 90 213 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/summary_screen/text_header.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 238 222 0 255 246 139 0 0 0 0 0 0 0 0 0 16 115 230 ================================================ FILE: graphics/summary_screen/text_moves.pal ================================================ JASC-PAL 0100 16 0 0 0 238 222 0 255 246 139 255 148 0 255 238 115 238 0 0 246 222 156 32 32 32 222 222 222 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/teachy_tv/palettes.pal ================================================ JASC-PAL 0100 64 115 205 164 255 255 255 98 98 98 255 230 90 246 180 0 189 115 0 123 123 255 74 65 74 49 49 57 98 106 106 131 139 139 255 0 255 255 0 255 255 255 180 246 205 41 213 156 16 115 205 164 255 255 255 230 230 238 205 213 222 180 197 205 164 180 189 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 115 205 164 156 255 255 255 255 255 255 222 32 246 230 164 255 74 24 255 148 139 255 156 24 131 230 222 24 32 32 156 189 213 74 131 189 90 222 164 205 238 139 255 0 255 255 0 255 115 205 164 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 255 0 255 255 0 255 74 65 74 164 164 164 197 197 205 230 230 238 ================================================ FILE: graphics/text_window/stdpal_0.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 255 255 255 213 230 246 164 213 230 230 246 255 115 164 197 74 115 164 ================================================ FILE: graphics/text_window/stdpal_1.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 255 255 255 205 205 222 205 205 222 230 246 255 205 205 222 106 115 123 ================================================ FILE: graphics/text_window/stdpal_2.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 255 255 255 74 205 238 16 172 222 0 82 115 0 115 139 0 123 197 ================================================ FILE: graphics/text_window/stdpal_3.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 255 0 255 205 213 213 156 205 222 98 115 123 65 172 230 131 164 180 ================================================ FILE: graphics/text_window/stdpal_4.pal ================================================ JASC-PAL 0100 16 115 205 164 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 57 98 115 131 131 131 164 164 164 197 197 205 230 230 238 65 90 106 ================================================ FILE: graphics/title_screen/firered/background.pal ================================================ JASC-PAL 0100 16 255 255 139 0 0 0 123 123 123 197 197 197 222 222 222 255 255 255 0 0 0 123 123 123 197 197 197 222 222 222 255 255 255 65 180 164 139 0 0 172 24 0 213 57 0 255 90 0 ================================================ FILE: graphics/title_screen/firered/box_art_mon.pal ================================================ JASC-PAL 0100 16 0 0 255 0 0 0 82 205 180 255 0 255 255 0 255 255 0 255 32 0 0 49 0 0 65 0 0 90 0 0 123 32 0 156 32 0 180 49 0 205 65 0 222 90 0 230 123 0 ================================================ FILE: graphics/title_screen/firered/game_title_logo.pal ================================================ JASC-PAL 0100 256 0 255 41 0 0 0 255 238 16 246 222 41 246 238 246 255 246 24 246 246 41 246 246 246 246 255 255 255 246 255 32 0 255 106 65 156 32 0 238 246 222 24 246 222 32 255 238 41 255 238 49 255 255 16 255 255 24 255 255 246 255 255 255 123 106 156 24 41 32 32 32 74 32 0 230 115 82 164 16 0 246 106 82 172 246 238 32 255 230 24 246 230 41 246 238 41 246 230 49 246 238 49 255 246 32 255 246 41 255 255 32 255 255 41 32 24 32 32 32 41 197 156 41 197 164 41 156 156 156 164 164 156 172 172 172 180 189 180 41 0 230 189 189 189 197 189 189 197 197 197 205 205 213 8 8 197 246 230 24 246 230 32 255 238 24 255 238 32 32 32 32 32 41 32 41 32 32 41 41 32 49 32 32 49 41 32 41 32 41 49 32 41 24 41 41 32 32 90 16 24 106 24 32 98 41 32 82 41 32 98 41 41 82 41 41 98 0 0 115 8 8 131 32 24 115 32 24 131 32 41 115 41 41 115 32 41 131 41 41 131 57 41 41 57 41 49 57 49 41 57 57 57 65 41 41 74 41 41 65 57 57 74 57 57 57 74 74 65 65 74 82 74 82 82 57 131 82 90 82 90 90 90 90 98 98 98 98 106 115 106 106 131 98 115 139 98 106 139 115 98 180 139 57 172 131 65 156 115 90 156 131 82 115 82 139 123 82 131 115 98 131 131 98 123 115 123 123 123 123 131 139 131 139 148 123 131 205 172 24 213 172 16 205 164 32 213 172 32 222 189 24 230 189 16 213 189 32 222 189 32 230 205 24 230 205 32 230 213 32 238 222 32 180 148 57 189 156 49 180 148 74 180 172 90 156 148 123 139 148 139 164 148 115 172 156 106 197 156 49 205 180 49 197 172 90 205 189 82 222 205 49 230 222 49 205 205 74 222 213 65 49 0 230 213 213 213 222 230 230 222 230 230 255 0 246 255 0 255 16 8 197 16 16 189 32 16 164 41 16 164 32 16 180 41 16 189 8 8 205 8 16 205 24 8 213 24 16 205 41 8 213 41 16 213 49 8 213 57 16 213 16 8 230 24 8 230 24 16 230 24 24 230 8 8 246 8 16 246 16 8 246 16 16 246 32 8 230 32 16 230 32 8 238 32 8 246 41 8 230 41 16 230 49 16 230 49 8 238 32 32 156 24 32 172 41 41 156 41 32 164 74 49 180 82 49 172 82 65 164 90 74 164 24 32 189 57 41 189 41 32 213 57 32 213 74 41 189 90 57 189 74 49 197 74 41 205 49 49 49 197 197 197 189 189 189 156 156 156 172 172 172 139 139 139 115 115 115 255 255 255 16 16 16 98 98 98 246 246 246 82 82 82 230 230 230 213 213 213 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/title_screen/firered/slash.pal ================================================ JASC-PAL 0100 16 82 205 180 189 197 205 164 164 172 123 131 131 213 213 222 255 246 74 255 213 32 164 131 24 246 164 24 131 90 16 106 98 90 65 57 41 230 82 16 205 41 0 139 8 8 246 246 246 ================================================ FILE: graphics/title_screen/leafgreen/background.pal ================================================ JASC-PAL 0100 16 255 255 90 0 0 0 123 123 123 197 197 197 222 222 222 255 255 255 0 0 0 123 123 123 197 197 197 222 222 222 255 255 255 230 123 90 0 123 0 16 148 32 41 180 65 65 213 98 ================================================ FILE: graphics/title_screen/leafgreen/box_art_mon.pal ================================================ JASC-PAL 0100 16 246 148 98 0 0 0 246 148 98 255 0 255 255 0 255 255 0 255 0 32 32 0 49 41 0 65 49 0 82 57 16 98 74 24 115 90 41 148 115 74 180 139 98 205 156 131 230 172 ================================================ FILE: graphics/title_screen/leafgreen/game_title_logo.pal ================================================ JASC-PAL 0100 256 0 255 41 0 0 0 255 238 16 246 222 41 246 238 246 255 246 24 246 246 41 246 246 246 246 255 255 255 246 255 32 0 255 106 65 156 32 0 238 246 222 24 246 222 32 255 238 41 255 238 49 255 255 16 255 255 24 255 255 246 255 255 255 123 106 156 24 41 32 32 32 74 32 0 230 115 82 164 16 0 246 106 82 172 246 238 32 255 230 24 246 230 41 246 238 41 246 230 49 246 238 49 255 246 32 255 246 41 255 255 32 255 255 41 32 24 32 32 32 41 197 156 41 197 164 41 156 156 156 164 164 156 172 172 172 180 189 180 41 0 230 189 189 189 197 189 189 197 197 197 205 205 213 8 8 197 246 230 24 246 230 32 255 238 24 255 238 32 32 32 32 32 41 32 41 32 32 41 41 32 49 32 32 49 41 32 41 32 41 49 32 41 24 41 41 32 32 90 16 24 106 24 32 98 41 32 82 41 32 98 41 41 82 41 41 98 0 0 115 8 8 131 32 24 115 32 24 131 32 41 115 41 41 115 32 41 131 41 41 131 57 41 41 57 41 49 57 49 41 57 57 57 65 41 41 74 41 41 65 57 57 74 57 57 57 74 74 65 65 74 82 74 82 82 57 131 82 90 82 90 90 90 90 98 98 98 98 106 115 106 106 131 98 115 139 98 106 139 115 98 180 139 57 172 131 65 156 115 90 156 131 82 115 82 139 123 82 131 115 98 131 131 98 123 115 123 123 123 123 131 139 131 139 148 123 131 205 172 24 213 172 16 205 164 32 213 172 32 222 189 24 230 189 16 213 189 32 222 189 32 230 205 24 230 205 32 230 213 32 238 222 32 180 148 57 189 156 49 180 148 74 180 172 90 156 148 123 139 148 139 164 148 115 172 156 106 197 156 49 205 180 49 197 172 90 205 189 82 222 205 49 230 222 49 205 205 74 222 213 65 49 0 230 213 213 213 222 230 230 222 230 230 255 0 246 255 0 255 16 8 197 16 16 189 32 16 164 41 16 164 32 16 180 41 16 189 8 8 205 8 16 205 24 8 213 24 16 205 41 8 213 41 16 213 49 8 213 57 16 213 16 8 230 24 8 230 24 16 230 24 24 230 8 8 246 8 16 246 16 8 246 16 16 246 32 8 230 32 16 230 32 8 238 32 8 246 41 8 230 41 16 230 49 16 230 49 8 238 32 32 156 24 32 172 41 41 156 41 32 164 74 49 180 82 49 172 82 65 164 90 74 164 24 32 189 57 41 189 41 32 213 57 32 213 74 41 189 90 57 189 74 49 197 74 41 205 205 205 205 41 41 41 189 189 189 172 172 172 246 246 246 123 123 123 156 156 156 139 139 139 238 238 238 16 16 16 98 98 98 82 82 82 222 222 222 57 57 57 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/title_screen/leafgreen/slash.pal ================================================ JASC-PAL 0100 16 0 0 213 172 180 197 49 57 65 115 123 131 246 246 246 57 82 82 90 115 115 123 131 123 49 74 57 16 32 24 0 82 0 32 82 24 16 98 0 57 164 16 90 222 24 189 255 8 ================================================ FILE: graphics/tm_case/disc_types_1.pal ================================================ JASC-PAL 0100 256 205 164 238 74 74 98 238 238 238 230 230 238 230 230 230 222 222 222 213 213 213 205 205 205 197 197 197 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 255 255 255 205 164 238 0 0 0 74 74 98 255 230 189 255 222 156 255 205 131 255 197 98 255 189 65 255 180 41 238 172 32 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 255 238 222 205 164 238 0 0 0 74 74 98 205 230 246 180 213 246 164 205 246 139 197 238 115 180 238 90 172 238 74 164 238 0 0 0 0 0 0 0 0 0 255 255 255 205 205 205 238 246 246 205 164 238 0 0 0 74 74 98 213 246 230 197 246 213 180 246 205 156 238 197 139 238 180 123 238 172 106 238 164 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 238 246 246 205 164 238 0 0 0 74 74 98 255 255 189 255 238 156 255 230 123 255 222 90 255 205 57 255 197 24 255 197 0 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 255 255 222 205 164 238 0 0 0 74 74 98 246 238 222 238 230 197 238 222 172 230 213 148 222 197 115 222 189 90 213 180 65 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 255 255 255 205 164 238 0 0 0 74 74 98 255 255 189 255 255 156 255 255 123 255 255 90 246 238 90 230 213 82 222 197 65 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 255 255 222 205 164 238 0 0 0 74 74 98 230 246 255 213 246 255 197 246 255 172 238 255 156 238 255 139 230 246 131 213 238 0 0 0 0 0 0 0 0 0 255 255 255 205 205 205 255 255 255 205 164 238 0 0 0 74 74 98 213 246 255 189 238 255 172 238 255 156 238 255 172 222 238 180 205 222 197 197 197 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 246 246 255 205 164 238 0 0 0 74 74 98 246 213 189 238 197 156 238 180 123 238 164 90 230 148 57 230 131 24 230 115 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 255 238 230 205 164 238 0 0 0 74 74 98 238 222 246 230 205 246 230 189 246 222 172 246 213 148 246 197 123 238 180 98 222 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 255 238 255 205 164 238 0 0 0 74 74 98 255 255 189 255 255 156 255 255 123 255 255 90 255 238 57 255 238 24 255 222 0 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 255 255 222 205 164 238 0 0 0 74 74 98 255 222 197 255 205 172 255 189 148 255 180 123 230 148 156 205 123 189 180 98 222 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 255 238 230 205 164 238 0 0 0 74 74 98 255 230 230 255 222 213 255 213 205 255 197 197 255 189 180 255 180 172 255 172 164 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 255 246 246 205 164 238 0 0 0 74 74 98 222 222 222 213 213 213 197 197 197 189 189 189 148 172 180 115 164 172 82 156 164 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 238 246 246 205 164 238 0 0 0 74 74 98 205 230 230 189 213 213 164 205 205 139 189 197 123 180 180 98 164 172 82 156 164 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 238 246 246 205 164 238 ================================================ FILE: graphics/tm_case/disc_types_2.pal ================================================ JASC-PAL 0100 16 0 0 0 74 74 98 205 230 255 180 213 255 156 197 255 139 189 255 172 180 213 213 180 172 255 180 131 0 0 0 0 0 0 0 0 0 255 255 255 189 189 189 230 246 255 205 164 238 ================================================ FILE: graphics/tm_case/menu_female.pal ================================================ JASC-PAL 0100 64 0 65 90 255 0 255 41 57 82 213 139 115 255 0 255 255 0 255 255 172 148 197 230 205 238 230 172 255 255 197 180 180 180 230 255 238 139 106 172 115 115 115 164 205 172 148 180 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 189 213 213 238 255 255 222 246 255 255 255 255 164 222 255 16 172 222 0 82 115 0 115 139 0 123 197 205 164 238 106 164 222 82 123 197 164 172 131 255 172 148 238 238 238 90 90 65 115 115 90 189 189 164 213 139 115 222 156 0 238 180 16 246 213 57 255 246 123 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 189 213 213 238 255 255 222 246 255 255 255 255 164 222 255 24 82 180 0 90 131 24 82 180 24 82 180 ================================================ FILE: graphics/tm_case/menu_male.pal ================================================ JASC-PAL 0100 64 0 65 90 255 0 255 41 57 82 65 180 164 255 0 255 255 0 255 106 205 197 197 230 205 238 230 172 255 255 197 180 180 180 230 255 238 139 106 172 115 115 115 164 205 172 148 180 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 189 213 213 238 255 255 222 246 255 255 255 255 164 222 255 16 172 222 0 82 115 0 115 139 0 123 197 205 164 238 106 164 222 82 123 197 164 172 131 106 205 197 238 238 238 90 90 65 115 115 90 189 189 164 65 180 164 222 156 0 238 180 16 246 213 57 255 246 123 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 189 213 213 238 255 255 222 246 255 255 255 255 164 222 255 24 82 180 0 90 131 24 82 180 24 82 180 ================================================ FILE: graphics/trade/black.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trade/cursor.pal ================================================ JASC-PAL 0100 16 0 0 0 123 131 222 98 98 180 123 106 222 106 172 238 82 148 205 180 189 230 148 156 189 205 106 0 255 189 49 246 148 0 255 213 115 205 74 90 255 98 32 205 205 222 255 98 32 ================================================ FILE: graphics/trade/gba.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 230 230 230 205 205 205 180 180 180 156 156 156 213 180 106 205 156 82 49 255 106 ================================================ FILE: graphics/trade/gba_pal2.pal ================================================ JASC-PAL 0100 48 0 0 0 255 57 8 255 90 8 255 131 8 255 172 8 255 213 8 255 255 8 255 255 131 255 255 255 255 255 0 65 0 0 115 16 0 172 32 0 230 57 8 0 0 0 0 0 0 0 0 0 255 255 255 222 230 238 189 205 230 156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 230 230 230 205 205 205 180 180 180 156 156 156 213 180 106 205 156 82 49 255 106 0 0 0 255 255 255 222 230 238 189 205 230 156 180 222 0 16 172 32 32 106 16 16 90 0 0 74 255 255 189 230 230 164 205 205 148 189 180 115 139 139 90 74 74 57 8 32 32 ================================================ FILE: graphics/trade/link_mon.pal ================================================ JASC-PAL 0100 16 0 0 0 255 156 123 164 123 197 41 255 115 0 139 255 255 255 74 255 255 255 106 106 106 255 156 123 255 156 123 255 156 123 255 156 123 255 156 123 255 156 123 255 156 123 255 156 123 ================================================ FILE: graphics/trade/menu.pal ================================================ JASC-PAL 0100 48 0 0 0 57 57 172 98 98 180 123 106 222 82 90 213 82 148 205 131 115 230 148 156 189 205 106 0 246 148 0 49 49 90 255 213 115 205 74 90 255 98 32 205 205 222 255 255 213 0 0 0 0 8 16 0 16 32 0 24 49 0 41 65 0 49 82 0 57 98 0 65 115 0 82 131 0 90 148 0 98 164 0 106 180 0 123 197 0 131 213 0 139 230 0 156 255 0 0 0 0 8 16 0 16 32 0 24 49 0 41 65 0 49 82 0 57 98 0 65 115 0 82 131 0 90 148 0 98 164 0 106 180 0 123 197 0 131 213 0 139 230 0 156 255 ================================================ FILE: graphics/trade/shadow.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 222 230 238 189 205 230 156 180 222 0 16 172 32 32 106 16 16 90 0 0 74 255 255 189 230 230 164 205 205 148 189 180 115 139 139 90 74 74 57 32 32 32 ================================================ FILE: graphics/trade/text.pal ================================================ JASC-PAL 0100 16 0 0 0 74 74 74 255 0 0 0 255 0 0 0 255 255 255 0 0 255 255 255 0 255 213 213 205 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 115 115 115 255 255 255 ================================================ FILE: graphics/trade/unused1.pal ================================================ JASC-PAL 0100 16 0 0 0 255 57 8 255 90 8 255 131 8 255 172 8 255 213 8 255 255 8 255 255 131 255 255 255 255 255 0 65 0 0 115 16 0 172 32 0 230 57 8 0 0 0 0 0 0 ================================================ FILE: graphics/trade/wireless_signal_receive.pal ================================================ JASC-PAL 0100 256 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 ================================================ FILE: graphics/trade/wireless_signal_send.pal ================================================ JASC-PAL 0100 256 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 255 255 255 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 172 172 ================================================ FILE: graphics/trainer_card/blue.pal ================================================ JASC-PAL 0100 48 139 98 115 230 246 246 222 238 255 213 230 246 197 213 230 246 205 148 164 164 164 98 98 115 246 213 139 180 205 148 106 164 222 90 156 205 57 115 156 255 246 189 255 255 255 131 189 230 139 98 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 189 148 16 255 213 82 82 205 180 49 156 148 197 197 197 90 90 90 139 98 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 189 148 16 255 213 82 230 148 82 213 98 41 197 197 197 90 90 90 ================================================ FILE: graphics/trainer_card/bronze.pal ================================================ JASC-PAL 0100 48 139 98 115 246 246 205 246 238 197 238 230 189 230 222 156 246 205 148 164 164 164 98 98 115 246 238 139 222 197 139 213 189 139 197 180 123 164 123 82 255 255 205 255 255 255 230 205 156 139 98 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 189 148 16 255 213 82 82 205 180 65 172 164 197 197 197 90 90 90 0 0 0 32 65 123 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trainer_card/female_bg.pal ================================================ JASC-PAL 0100 16 139 98 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 189 148 16 255 213 82 230 148 82 213 98 41 197 197 197 90 90 90 ================================================ FILE: graphics/trainer_card/gold.pal ================================================ JASC-PAL 0100 48 139 98 115 255 246 230 246 238 213 246 246 197 246 238 180 246 222 106 164 164 164 98 98 115 255 255 148 246 222 49 246 205 8 238 189 0 189 148 57 255 255 197 255 255 255 246 230 82 139 98 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 189 148 16 255 213 82 82 205 180 65 172 164 197 197 197 90 90 90 0 0 0 32 65 123 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trainer_card/green.pal ================================================ JASC-PAL 0100 48 139 98 115 222 255 230 205 246 222 197 238 213 189 230 205 246 205 148 164 164 164 98 98 115 246 213 139 180 205 148 131 180 172 115 156 156 82 131 123 255 246 189 255 255 255 156 205 197 139 98 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 189 148 16 255 213 82 82 205 180 65 172 164 197 197 197 90 90 90 0 0 0 32 65 123 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trainer_card/rse/bronze.pal ================================================ JASC-PAL 0100 48 139 98 115 238 255 246 213 238 230 164 164 164 123 123 123 98 98 115 41 57 65 57 106 139 65 139 197 189 213 205 148 180 164 106 148 123 65 115 90 106 189 255 205 205 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106 180 213 41 123 164 0 0 0 0 0 0 98 98 115 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 106 189 255 205 205 205 0 0 0 ================================================ FILE: graphics/trainer_card/rse/copper.pal ================================================ JASC-PAL 0100 48 139 98 115 255 246 230 246 230 213 205 156 90 180 131 65 98 98 115 41 57 65 57 106 139 65 139 197 230 189 139 205 156 115 180 131 82 156 106 41 106 189 255 205 205 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106 180 213 41 123 164 0 0 0 0 0 0 98 98 115 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 106 189 255 205 205 205 0 0 0 ================================================ FILE: graphics/trainer_card/rse/female_bg.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 230 123 139 164 49 115 0 0 0 0 0 0 ================================================ FILE: graphics/trainer_card/rse/gold.pal ================================================ JASC-PAL 0100 48 139 98 115 246 246 222 246 238 172 164 164 164 123 123 123 98 98 115 41 57 65 57 106 139 65 139 197 246 230 139 230 213 49 213 197 57 156 115 57 106 189 255 205 205 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106 180 213 41 123 164 0 0 0 0 0 0 98 98 115 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 106 189 255 205 205 205 0 0 0 ================================================ FILE: graphics/trainer_card/rse/green.pal ================================================ JASC-PAL 0100 48 139 98 115 255 255 255 230 255 222 164 164 164 123 123 123 98 98 115 41 57 65 57 106 139 65 139 197 180 230 156 148 238 131 131 222 115 82 172 74 106 189 255 205 205 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106 180 213 41 123 164 0 0 0 0 0 0 98 98 115 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 106 189 255 205 205 205 0 0 0 ================================================ FILE: graphics/trainer_card/rse/silver.pal ================================================ JASC-PAL 0100 48 139 98 115 246 246 255 230 230 238 189 189 197 156 156 156 156 106 41 41 57 65 57 106 139 65 139 197 230 230 238 189 189 197 156 156 156 123 123 123 106 189 255 205 205 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106 180 213 41 123 164 0 0 0 0 0 0 98 98 115 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 255 255 255 230 230 238 164 164 164 123 123 123 106 189 255 205 205 205 0 0 0 ================================================ FILE: graphics/trainer_card/silver.pal ================================================ JASC-PAL 0100 48 139 98 115 238 246 246 238 246 246 238 238 238 230 230 230 246 205 148 164 164 164 98 98 115 255 238 131 205 205 164 197 205 205 172 180 172 131 139 156 246 246 197 255 255 255 213 222 222 139 98 115 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 189 148 16 255 213 82 82 205 180 65 172 164 197 197 197 90 90 90 0 0 0 32 65 123 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trainer_card/star.pal ================================================ JASC-PAL 0100 16 139 98 115 246 197 0 205 164 0 246 197 0 246 197 0 246 197 0 246 197 0 246 197 0 0 0 0 0 0 0 189 148 16 255 213 82 0 0 0 0 0 0 189 148 16 246 197 0 ================================================ FILE: graphics/trainer_card/stickers1.pal ================================================ JASC-PAL 0100 16 255 246 189 255 255 255 255 197 164 238 246 246 222 222 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trainer_card/stickers2.pal ================================================ JASC-PAL 0100 16 255 246 189 255 255 255 98 197 238 238 246 246 222 222 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trainer_card/stickers3.pal ================================================ JASC-PAL 0100 16 255 246 189 255 255 255 246 230 74 238 246 246 222 222 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trainer_card/stickers4.pal ================================================ JASC-PAL 0100 16 255 246 189 255 255 255 106 131 148 238 246 246 222 222 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trainer_card/unused.pal ================================================ JASC-PAL 0100 16 255 255 255 255 255 255 98 98 98 213 213 205 230 8 8 255 189 115 32 156 8 148 246 148 49 82 205 164 197 246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/trainers/palettes/aqua_admin_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 172 213 90 131 189 65 90 139 57 57 57 213 222 230 255 131 41 189 156 90 238 98 41 180 65 41 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/aqua_admin_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 172 213 90 131 189 65 90 139 57 57 57 213 222 230 255 131 41 189 156 90 222 82 24 164 49 24 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/aqua_grunt_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 172 213 90 131 189 65 90 139 57 57 57 213 222 230 164 74 65 189 156 90 255 106 98 205 82 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/aqua_grunt_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 172 213 90 131 189 65 90 139 57 57 57 213 222 230 255 164 197 189 156 90 255 115 148 213 82 115 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/aqua_leader_archie.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 131 156 180 106 123 148 82 90 115 57 65 98 213 213 222 82 90 156 24 32 49 148 156 222 106 115 213 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/aroma_lady.pal ================================================ JASC-PAL 0100 16 172 230 148 16 16 16 255 230 205 238 189 148 197 148 106 106 74 74 246 189 197 222 131 148 189 106 131 246 246 255 230 230 255 197 197 230 156 148 180 98 90 123 148 106 106 156 197 197 ================================================ FILE: graphics/trainers/palettes/battle_girl.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 90 131 189 65 90 139 41 65 98 49 41 65 205 213 222 255 164 82 230 106 0 197 65 65 156 106 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/beauty.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 230 222 148 197 180 98 139 123 57 230 123 115 213 74 65 74 74 90 131 131 197 156 156 222 213 222 246 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/biker.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 205 139 115 123 90 82 222 222 230 180 197 213 139 156 172 74 98 123 49 65 82 156 131 82 82 57 41 230 106 90 180 115 106 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/bird_keeper.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 205 148 115 123 90 82 49 90 139 106 164 222 74 131 180 32 74 82 246 131 115 222 98 98 222 189 131 172 139 106 205 222 255 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/black_belt.pal ================================================ JASC-PAL 0100 16 115 197 164 246 205 189 222 172 148 172 131 106 90 65 49 148 131 123 106 90 82 82 90 115 49 57 82 205 189 189 189 164 164 156 139 139 255 98 90 197 65 65 246 230 230 0 0 0 ================================================ FILE: graphics/trainers/palettes/bug_catcher.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 189 49 57 238 222 148 189 172 115 65 82 131 98 164 222 49 123 156 131 139 164 180 189 213 213 222 230 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/bug_maniac.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 49 123 156 49 65 131 65 74 74 222 222 164 197 197 139 205 213 213 156 139 74 98 164 222 106 115 115 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/burglar.pal ================================================ JASC-PAL 0100 16 139 230 156 16 16 16 255 222 205 238 180 148 197 139 106 106 90 90 230 230 246 205 205 230 180 180 213 131 131 164 65 82 98 189 172 98 156 139 90 197 197 156 156 156 115 115 115 74 ================================================ FILE: graphics/trainers/palettes/camper.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 164 238 156 139 205 106 106 164 65 32 82 32 205 205 213 115 115 148 41 57 90 230 106 139 189 65 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/champion_rival.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 222 164 74 197 123 8 49 65 82 205 139 255 115 82 131 156 106 172 106 123 131 197 205 180 213 82 90 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/champion_steven.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 180 148 189 148 115 123 90 82 189 115 205 164 82 172 82 82 90 49 49 57 213 222 238 172 189 213 123 148 164 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/channeler.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 98 131 123 49 82 74 222 205 238 115 115 148 41 57 90 180 172 205 197 65 82 148 32 49 98 0 16 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/collector.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 197 139 115 123 90 82 106 139 189 65 98 148 32 74 123 255 98 90 197 65 65 213 222 230 131 74 65 115 123 131 164 172 180 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/cool_couple.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 205 139 115 123 90 82 222 222 230 164 180 189 74 98 123 205 164 255 156 115 205 115 74 164 238 131 98 205 57 82 172 32 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/cool_trainer_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 205 139 115 123 90 82 222 222 230 164 180 189 74 98 123 205 164 255 156 115 205 115 74 164 238 131 98 205 57 82 172 32 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/cool_trainer_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 205 139 115 123 90 82 222 222 230 164 180 189 74 98 123 205 164 255 156 115 205 115 74 164 238 131 98 205 57 82 172 32 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/crush_girl.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 115 164 106 57 90 65 90 123 156 65 74 98 205 189 189 148 197 131 255 164 82 230 106 0 180 57 57 246 230 230 0 0 0 ================================================ FILE: graphics/trainers/palettes/crush_kin.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 148 131 123 106 90 82 90 123 156 65 74 98 205 189 189 189 164 164 255 164 82 230 106 0 180 57 57 246 230 230 0 0 0 ================================================ FILE: graphics/trainers/palettes/cue_ball.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 205 139 115 148 98 82 222 222 230 180 197 213 139 172 213 98 139 180 57 82 115 205 180 180 98 82 65 180 156 156 148 115 106 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/cycling_triathlete_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 57 41 57 57 74 106 131 131 156 139 156 238 115 131 205 98 106 172 205 197 255 230 90 65 189 74 41 139 74 82 255 255 255 0 0 24 ================================================ FILE: graphics/trainers/palettes/cycling_triathlete_m.pal ================================================ JASC-PAL 0100 16 115 197 164 238 189 139 189 148 115 139 106 82 57 41 57 115 90 106 156 131 156 156 213 255 106 164 222 82 131 197 205 197 255 230 90 65 189 74 41 139 74 82 255 255 255 0 0 24 ================================================ FILE: graphics/trainers/palettes/dragon_tamer.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 74 57 49 164 57 246 123 49 172 131 139 148 255 98 90 197 65 65 213 222 230 74 74 65 255 205 106 213 172 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/elite_four_agatha.pal ================================================ JASC-PAL 0100 16 213 222 238 246 230 205 230 189 156 189 148 123 115 90 82 115 65 82 164 74 90 213 106 131 90 82 65 139 123 90 189 197 139 230 230 189 156 164 156 205 205 222 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/elite_four_bruno.pal ================================================ JASC-PAL 0100 16 115 197 164 238 213 189 213 172 148 164 131 106 90 65 49 115 123 139 106 90 82 82 90 115 49 57 82 205 189 189 180 164 164 139 131 131 255 139 90 197 65 65 246 230 230 0 0 0 ================================================ FILE: graphics/trainers/palettes/elite_four_drake.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 172 148 164 131 106 98 57 65 139 131 164 106 98 123 41 49 57 57 65 82 197 197 213 255 222 106 189 156 90 106 131 238 65 106 172 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/elite_four_glacia.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 115 82 65 148 148 164 148 90 164 115 65 123 82 41 82 255 255 164 213 197 90 156 148 90 222 230 238 189 197 205 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/elite_four_lance.pal ================================================ JASC-PAL 0100 16 213 222 238 255 230 205 230 189 148 205 156 123 106 74 74 57 57 90 90 90 131 123 123 164 172 74 65 197 90 74 230 106 90 139 106 90 246 148 123 172 172 180 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/elite_four_lorelei.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 205 139 115 123 90 82 213 213 222 65 74 82 205 164 255 156 115 205 238 172 90 148 148 164 90 98 115 230 115 90 180 41 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/elite_four_phoebe.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 115 82 65 57 131 255 32 106 230 16 82 205 41 49 123 164 205 255 115 98 106 74 57 65 255 82 156 197 65 90 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/elite_four_sidney.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 180 148 189 139 106 98 57 65 131 106 74 106 98 123 41 49 57 57 65 82 197 197 213 238 213 139 197 164 106 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/emerald_brendan.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 164 148 205 131 115 123 90 82 98 123 156 74 90 131 49 65 106 24 41 82 222 230 238 139 222 115 98 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/emerald_may.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 164 148 205 131 115 123 90 82 98 98 115 41 57 65 164 106 82 74 49 57 205 205 222 139 222 115 98 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/engineer.pal ================================================ JASC-PAL 0100 16 172 238 164 16 16 16 255 222 205 238 180 148 197 139 106 106 74 74 74 74 115 255 255 255 172 180 197 115 123 172 197 148 65 230 98 98 197 57 57 255 222 82 222 180 74 139 115 57 ================================================ FILE: graphics/trainers/palettes/expert_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 180 180 172 90 131 189 65 90 139 57 57 57 213 222 230 139 139 131 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/expert_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 180 180 172 90 131 189 65 90 139 57 57 57 213 222 230 139 139 131 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/fisherman.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 65 65 106 98 98 131 213 172 82 172 131 74 205 205 222 164 164 189 49 49 74 246 123 49 189 106 49 238 238 255 0 0 24 ================================================ FILE: graphics/trainers/palettes/gamer.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 180 148 189 139 106 98 57 65 156 172 230 123 139 205 82 98 164 49 65 98 230 213 131 189 172 106 156 131 82 131 123 148 205 205 222 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/gentleman.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 189 139 106 98 65 57 164 148 131 123 106 98 82 74 65 41 41 32 213 213 205 180 180 172 148 148 139 197 156 49 139 115 24 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/guitarist.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 172 172 164 139 131 131 106 98 98 65 57 57 255 238 156 255 197 90 205 180 148 255 98 90 189 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/hex_maniac.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 164 123 156 139 90 131 106 65 106 74 41 74 213 222 230 189 205 213 205 57 82 115 41 65 180 49 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/hiker.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 148 148 148 98 98 98 131 197 205 98 164 172 172 131 49 131 98 41 131 123 82 205 189 123 172 164 115 213 205 213 0 0 24 ================================================ FILE: graphics/trainers/palettes/interviewer.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 148 148 172 65 90 139 41 65 98 49 41 65 205 213 222 98 197 255 90 156 189 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/juggler.pal ================================================ JASC-PAL 0100 16 213 222 238 255 222 205 238 180 148 197 139 106 106 74 74 74 74 98 106 90 164 156 123 205 98 123 57 123 180 90 172 213 90 205 106 65 123 123 148 189 197 205 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/kindler.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 115 82 65 246 246 230 222 222 189 180 180 139 123 115 74 172 213 246 115 180 205 57 123 139 255 82 57 255 156 90 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/lady.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 222 238 197 180 172 115 115 98 90 74 74 82 131 213 222 230 246 180 74 205 131 74 222 98 123 148 164 180 131 197 238 82 164 205 74 131 189 255 255 255 0 0 24 ================================================ FILE: graphics/trainers/palettes/lass.pal ================================================ JASC-PAL 0100 16 213 222 238 255 222 205 238 180 148 197 139 106 123 90 82 205 98 82 65 74 115 65 106 164 65 172 213 90 65 57 156 98 57 213 139 74 172 180 197 213 222 238 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_blaine.pal ================================================ JASC-PAL 0100 16 139 189 106 255 222 205 238 180 148 197 139 106 106 74 74 82 74 74 148 139 74 205 189 65 213 106 74 255 156 106 74 74 90 115 123 156 156 164 189 213 213 238 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_brawly.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 172 213 90 131 189 65 90 139 49 49 74 213 213 222 255 164 197 115 115 115 255 139 65 213 98 24 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_brock.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 213 148 115 123 90 82 123 156 98 90 115 74 230 164 82 172 106 24 197 148 115 172 197 139 74 74 82 213 213 222 123 131 131 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_erika.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 238 189 156 197 148 123 106 74 74 255 255 197 222 222 115 189 197 205 115 131 156 82 82 82 156 156 49 180 90 90 246 123 115 205 106 98 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_flannery.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 180 197 230 90 156 213 65 115 164 49 49 74 213 213 222 131 74 16 115 115 115 255 139 65 197 98 32 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_giovanni.pal ================================================ JASC-PAL 0100 16 115 197 164 246 222 205 205 180 148 172 131 98 123 90 82 205 115 205 164 82 115 222 172 90 213 213 222 49 57 57 164 180 189 98 115 123 74 82 82 148 164 172 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_koga.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 205 139 115 123 90 82 180 197 230 115 131 115 74 90 65 139 156 172 74 98 123 49 65 57 255 156 106 230 115 90 180 41 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_lt_surge.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 255 213 123 197 164 90 164 222 106 106 164 49 65 123 8 16 74 0 82 106 156 131 131 131 82 82 82 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_misty.pal ================================================ JASC-PAL 0100 16 213 222 238 255 222 205 238 180 148 213 148 115 123 90 82 164 106 82 205 115 82 255 189 115 74 82 156 98 115 246 74 65 106 222 222 246 255 0 255 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_norman.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 180 197 230 139 156 172 74 98 123 49 65 82 213 213 222 131 16 41 115 115 115 213 82 90 180 41 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_roxanne.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 172 213 90 131 189 65 90 139 57 57 57 213 222 230 255 164 197 189 156 90 255 115 148 213 82 115 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_sabrina.pal ================================================ JASC-PAL 0100 16 148 189 156 16 16 16 255 255 255 238 164 156 205 106 98 172 65 57 156 180 205 123 139 180 82 98 139 205 205 205 255 222 205 123 90 82 222 148 115 213 180 131 238 180 148 255 230 131 ================================================ FILE: graphics/trainers/palettes/leader_tate_and_liza.pal ================================================ JASC-PAL 0100 16 115 172 65 255 222 205 238 180 148 180 131 106 106 74 74 189 189 197 123 123 131 74 82 98 41 49 65 255 98 90 164 49 57 255 197 90 106 189 255 90 139 197 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_wallace.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 180 148 189 139 106 98 57 65 189 131 255 148 106 172 115 131 255 82 106 180 197 197 213 57 74 115 139 139 164 57 41 57 98 57 98 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_wattson.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 123 90 82 164 139 90 131 106 74 139 131 106 82 65 74 213 213 222 255 197 90 189 156 90 57 41 49 222 115 131 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leader_winona.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 172 189 213 139 156 205 74 98 148 49 65 82 205 213 222 115 57 123 255 197 90 189 123 222 148 90 172 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leaf.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 180 230 189 156 205 148 115 123 90 82 123 189 222 82 139 180 49 106 139 24 41 82 213 213 222 255 197 90 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/leaf_back_pic.pal ================================================ JASC-PAL 0100 16 131 123 164 180 131 65 255 230 180 222 189 156 139 98 74 90 98 189 57 57 123 115 164 197 90 65 41 238 238 255 197 197 222 255 115 90 205 98 74 255 222 106 222 180 106 0 0 0 ================================================ FILE: graphics/trainers/palettes/magma_admin_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 123 123 123 90 90 90 82 98 148 57 57 65 65 74 115 139 49 65 189 189 180 222 82 98 189 57 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/magma_admin_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 123 123 123 90 90 90 82 98 148 57 57 65 65 74 115 139 49 65 189 189 180 222 82 98 189 57 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/magma_grunt_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 123 123 123 90 90 90 82 98 148 57 57 65 65 74 115 139 49 65 189 189 180 222 82 98 189 57 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/magma_grunt_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 123 123 123 90 90 90 82 98 148 57 57 65 65 74 115 139 49 65 189 189 180 222 82 98 189 57 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/magma_leader_maxie.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 164 180 197 115 123 139 74 82 98 49 57 82 213 213 222 131 16 41 24 32 49 213 82 90 180 41 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_beauty.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 238 180 148 197 139 106 106 74 74 230 222 148 197 180 98 139 123 57 230 123 115 213 74 65 74 74 90 205 57 82 238 131 98 213 222 246 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_bird_keeper.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 230 180 148 205 148 115 123 90 82 156 32 16 238 131 98 205 57 82 172 32 57 106 164 222 74 131 180 222 189 131 172 139 106 49 90 139 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_black_belt.pal ================================================ JASC-PAL 0100 16 0 0 0 246 205 189 222 172 148 172 131 106 90 65 49 172 32 57 106 90 82 82 90 115 49 57 82 205 57 82 189 164 164 156 139 139 156 32 16 246 230 230 238 131 98 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_bug_catcher.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 238 180 148 197 139 106 106 74 74 189 49 57 238 222 148 189 172 115 172 32 57 238 131 98 205 57 82 131 139 164 180 189 213 213 222 230 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_cool_trainer_m.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 238 180 148 205 139 115 123 90 82 205 57 82 172 32 57 255 255 255 205 164 255 156 115 205 115 74 164 246 205 123 205 172 82 180 148 90 238 131 98 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_hiker.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 238 180 148 197 139 106 106 74 74 148 148 148 98 98 98 238 131 98 205 57 82 172 131 49 131 98 41 131 123 82 205 189 123 172 164 115 213 205 213 0 0 24 ================================================ FILE: graphics/trainers/palettes/master_lass.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 238 180 148 197 139 106 123 90 82 205 98 82 172 32 57 205 57 82 255 255 255 90 65 57 156 98 57 213 139 74 172 41 57 189 57 74 222 82 98 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_psychic_m.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 230 189 172 197 148 131 123 90 82 172 32 57 205 57 82 238 131 98 106 57 115 156 98 148 205 139 180 205 172 98 238 213 90 255 172 213 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_scientist.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 238 180 148 197 139 106 106 74 74 238 82 57 131 139 172 90 98 139 255 255 255 213 222 213 57 65 98 156 32 16 172 32 57 205 57 82 238 131 98 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_swimmer.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 180 148 189 139 106 98 57 65 168 224 136 136 176 56 72 88 32 232 128 96 200 56 80 168 32 56 205 205 255 56 72 16 106 106 205 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/master_youngster.pal ================================================ JASC-PAL 0100 16 0 0 0 255 222 205 230 197 156 197 148 115 123 90 82 213 213 222 238 131 98 205 57 82 230 98 90 172 74 57 172 32 57 246 205 123 205 172 82 180 148 90 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/ninja_boy.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 213 148 115 123 90 82 164 180 197 131 139 156 82 98 115 49 57 82 213 213 222 131 16 41 255 172 32 213 82 90 180 41 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/old_couple.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 180 180 172 90 131 189 65 90 139 57 57 57 213 222 230 139 139 131 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/old_man_back_pic.pal ================================================ JASC-PAL 0100 16 115 197 164 255 238 213 230 197 164 189 148 115 106 90 65 222 213 238 156 148 172 115 106 131 189 180 205 197 139 57 148 106 32 156 131 106 222 205 156 189 172 139 238 230 246 0 0 0 ================================================ FILE: graphics/trainers/palettes/painter.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 205 148 115 123 90 82 164 172 197 90 98 148 49 57 82 41 57 98 222 230 238 255 164 123 106 197 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/parasol_lady.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 123 82 65 90 131 189 65 90 139 41 65 98 255 98 90 197 65 65 255 156 106 131 74 65 255 205 106 213 172 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/picnicker.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 197 139 106 106 74 74 164 238 156 139 205 106 106 164 65 32 82 32 205 205 213 115 115 148 41 57 90 230 106 139 189 65 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/pokedude_back_pic.pal ================================================ JASC-PAL 0100 16 115 197 164 246 222 197 213 180 156 189 148 123 123 98 82 222 213 238 156 148 172 115 106 131 189 180 205 106 148 205 65 115 164 41 57 123 82 74 98 172 106 98 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/pokefan_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 90 172 189 65 123 180 255 0 255 32 57 82 197 205 213 180 139 90 131 90 41 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/pokefan_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 222 189 148 197 156 115 156 123 82 49 57 49 230 90 41 131 172 222 172 49 32 82 123 172 255 238 74 213 189 41 205 205 213 98 98 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/pokemaniac.pal ================================================ JASC-PAL 0100 16 115 197 164 246 213 197 222 172 139 197 139 115 123 90 82 222 222 230 180 197 213 139 156 172 74 98 123 49 65 90 106 49 24 255 180 106 238 131 65 180 106 49 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/pokemon_breeder.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 189 148 189 148 106 123 98 82 123 205 106 32 98 65 197 90 74 131 148 172 213 222 230 74 164 82 238 172 82 222 148 123 189 148 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/pokemon_ranger_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 230 189 148 189 139 106 139 106 82 82 49 49 131 139 172 98 106 131 49 57 82 189 189 197 255 205 65 246 148 82 205 106 74 131 74 49 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/pokemon_ranger_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 230 189 148 189 139 106 139 106 82 82 49 49 131 139 172 98 106 131 49 57 82 189 189 197 255 205 65 246 148 82 205 106 74 131 74 49 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/professor_oak.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 156 164 205 164 205 164 123 164 82 82 57 213 213 222 123 123 82 115 115 115 197 189 131 156 156 90 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/psychic_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 189 172 197 148 131 123 90 82 57 82 106 57 123 164 98 172 205 106 57 115 156 98 148 205 139 180 205 172 98 238 213 90 255 172 213 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/psychic_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 189 172 197 148 131 123 90 82 57 82 106 57 123 164 98 172 205 106 57 115 156 98 148 205 139 180 205 172 98 238 213 90 255 172 213 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/red.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 180 230 189 156 205 148 115 123 90 82 123 189 222 82 139 180 49 106 139 24 41 82 213 213 222 255 197 90 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/red_back_pic.pal ================================================ JASC-PAL 0100 16 131 123 164 180 131 65 255 230 180 222 189 156 139 98 74 90 98 189 57 57 123 115 164 197 90 65 41 238 238 255 197 197 222 255 115 90 205 98 74 255 222 106 222 180 106 0 0 0 ================================================ FILE: graphics/trainers/palettes/rich_boy.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 90 131 189 65 90 139 41 65 98 49 41 65 213 222 230 255 230 98 222 180 90 156 123 115 115 82 90 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rival_early.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 222 164 74 197 123 8 49 65 82 205 139 255 115 82 131 156 106 172 106 123 131 197 205 180 213 82 90 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rival_late.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 222 164 74 197 123 8 49 65 82 205 139 255 115 82 131 156 106 172 106 123 131 197 205 180 213 82 90 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rocker.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 230 197 156 197 156 115 123 98 82 123 164 189 82 123 148 205 222 205 139 65 49 172 172 197 65 82 90 189 213 255 255 131 98 197 131 82 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rocket_grunt_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 222 230 180 164 197 148 139 115 90 74 205 205 222 156 156 172 123 123 148 164 74 65 213 98 90 246 106 98 0 0 0 57 57 74 82 82 106 180 180 197 255 255 255 ================================================ FILE: graphics/trainers/palettes/rocket_grunt_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 222 230 180 164 197 148 139 115 90 74 205 205 222 156 156 172 123 123 148 164 74 65 213 98 90 246 106 98 0 0 0 57 57 74 82 82 106 180 180 197 255 255 255 ================================================ FILE: graphics/trainers/palettes/rs_aroma_lady.pal ================================================ JASC-PAL 0100 16 115 197 164 255 213 172 238 197 148 205 156 115 115 82 65 238 230 255 205 197 213 156 164 205 106 98 148 74 222 148 172 115 41 115 65 24 238 90 131 189 65 90 106 255 156 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_beauty.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 172 131 205 131 115 123 82 74 148 131 139 255 205 106 213 172 74 164 123 82 115 90 115 74 49 74 255 82 57 180 82 74 131 74 65 255 255 255 0 0 24 ================================================ FILE: graphics/trainers/palettes/rs_bird_keeper.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 164 180 197 131 139 156 90 98 115 57 65 82 213 213 222 131 16 41 24 32 49 213 82 90 180 41 57 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_black_belt.pal ================================================ JASC-PAL 0100 16 115 197 164 246 205 189 222 172 148 172 131 106 90 65 49 148 131 123 106 90 82 82 90 115 49 57 82 205 189 189 189 164 164 156 139 139 255 98 90 197 65 65 246 230 230 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_bug_catcher.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 213 148 115 123 90 82 222 222 164 197 197 139 156 139 74 41 57 98 197 197 238 246 238 213 189 49 57 98 164 222 49 123 156 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_camper.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 230 189 156 205 156 115 115 82 65 131 213 205 82 164 148 180 189 222 57 90 74 24 49 90 98 115 230 57 82 131 255 98 41 189 74 41 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_cool_trainer_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 238 197 156 205 156 115 115 82 65 238 156 115 205 90 74 0 189 222 123 41 24 180 230 139 139 180 57 74 90 32 255 246 189 213 205 131 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_cool_trainer_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 246 205 156 205 156 115 115 82 65 238 156 115 230 98 82 180 90 74 131 49 32 57 90 41 164 180 106 98 123 57 255 246 189 213 205 131 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_fisherman.pal ================================================ JASC-PAL 0100 16 115 197 164 255 213 189 222 172 148 180 131 115 82 57 57 123 98 106 82 82 123 213 172 82 180 139 82 205 205 222 123 82 49 49 49 74 246 123 49 189 106 49 238 238 255 0 0 24 ================================================ FILE: graphics/trainers/palettes/rs_gentleman.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 180 148 115 148 115 82 123 90 57 65 49 41 255 238 156 213 213 205 180 180 172 90 106 172 57 74 123 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_hiker.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 164 148 205 131 115 74 65 57 123 189 90 115 148 90 213 180 98 172 148 98 205 205 222 148 148 148 123 115 74 230 98 90 164 74 74 255 255 255 0 0 24 ================================================ FILE: graphics/trainers/palettes/rs_lady.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 222 238 180 180 156 123 106 172 106 74 82 82 32 213 222 230 255 230 106 213 172 90 222 98 123 148 164 180 180 238 106 148 213 82 123 189 65 255 255 255 0 0 24 ================================================ FILE: graphics/trainers/palettes/rs_lass.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 222 148 115 123 90 82 164 172 197 90 98 148 49 57 82 41 57 98 222 230 238 255 197 90 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_picnicker.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 246 205 156 205 156 115 115 82 65 131 213 205 82 164 148 180 189 222 57 90 74 24 49 90 98 115 230 57 82 131 255 98 41 189 74 41 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_pokemaniac.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 246 205 156 205 156 115 115 82 65 246 189 115 213 123 74 180 82 74 139 57 41 74 74 49 255 230 57 98 123 106 230 82 24 213 205 230 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_pokemon_breeder_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 255 98 90 164 49 65 255 148 131 49 49 74 213 222 230 205 74 74 115 148 197 49 74 123 57 115 164 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_pokemon_breeder_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 131 90 74 255 98 90 156 65 74 255 148 131 49 49 74 213 222 230 205 74 74 115 148 197 49 74 123 57 115 164 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_pokemon_ranger_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 131 90 65 82 49 49 131 139 156 82 90 115 49 57 82 213 213 222 255 205 65 255 131 74 205 98 74 156 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_pokemon_ranger_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 139 106 82 82 49 49 131 139 156 90 98 115 49 57 82 213 213 222 255 205 65 238 139 82 197 82 74 115 57 49 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_psychic_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 246 205 156 205 156 115 115 82 65 98 123 180 32 98 131 255 0 246 41 57 90 213 131 255 156 115 180 115 82 148 246 139 90 197 90 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_psychic_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 230 189 148 205 156 115 115 82 65 98 123 180 32 98 131 0 255 0 41 57 90 213 131 255 131 106 172 90 74 131 246 139 90 197 90 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_ruin_maniac.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 255 238 106 246 246 230 222 222 189 180 180 139 115 106 65 222 213 246 115 131 205 222 189 8 213 115 139 172 74 90 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_sailor.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 180 180 172 90 131 189 65 90 139 57 57 57 213 222 230 139 139 131 131 180 230 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_sis_and_bro.pal ================================================ JASC-PAL 0100 16 115 197 164 246 205 189 222 164 148 164 123 98 74 57 49 255 139 90 230 82 74 180 65 65 90 65 82 197 65 65 213 222 230 255 230 205 139 172 213 90 131 189 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_swimmer_f.pal ================================================ JASC-PAL 0100 16 115 197 164 246 205 189 222 164 148 164 123 98 74 57 49 255 139 90 230 82 74 180 65 65 90 65 82 197 65 65 213 222 230 255 230 205 139 172 213 90 131 189 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_swimmer_m.pal ================================================ JASC-PAL 0100 16 115 197 164 230 197 172 213 172 148 172 123 106 115 82 65 90 131 189 65 90 139 41 65 98 49 41 65 205 213 222 172 172 180 139 65 65 222 238 238 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_tuber_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 172 213 90 131 189 65 90 139 57 57 57 213 222 230 255 230 74 205 57 82 238 180 57 189 131 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_twins.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 172 213 90 131 189 65 90 139 57 57 57 213 222 230 255 230 74 180 82 98 238 180 57 189 131 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_young_couple.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 148 164 172 82 123 164 57 82 106 32 49 74 205 213 222 123 197 156 90 164 131 255 98 90 197 65 65 106 106 139 0 0 0 ================================================ FILE: graphics/trainers/palettes/rs_youngster.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 213 148 115 123 90 82 139 197 222 65 90 148 49 57 82 41 57 98 197 197 238 255 222 65 222 172 90 98 164 222 49 123 156 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/ruby_sapphire_brendan.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 164 148 205 131 115 123 90 82 98 123 156 74 90 131 49 65 106 24 41 82 222 230 238 255 197 90 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/ruby_sapphire_may.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 164 148 205 131 115 123 90 82 98 98 115 41 57 65 164 106 82 74 49 57 205 205 222 255 197 90 189 156 90 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/ruin_maniac.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 213 213 148 180 180 98 139 131 49 90 82 16 180 172 131 156 156 156 205 205 205 139 131 106 82 65 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/running_triathlete_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 90 131 189 65 90 139 41 65 98 49 41 65 205 213 222 180 139 90 139 65 65 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/running_triathlete_m.pal ================================================ JASC-PAL 0100 16 115 197 164 246 205 180 230 180 148 180 139 106 115 82 65 90 131 189 65 90 139 41 65 98 49 41 65 205 213 222 180 139 90 139 65 65 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/sailor.pal ================================================ JASC-PAL 0100 16 156 180 106 0 0 0 246 246 255 230 230 255 197 197 230 123 123 156 106 123 172 65 82 123 41 57 82 65 65 16 222 123 74 172 74 57 123 90 82 189 139 106 222 180 148 246 222 205 ================================================ FILE: graphics/trainers/palettes/school_kid_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 238 189 156 205 148 115 106 74 57 255 139 164 213 82 131 131 139 255 98 115 180 57 74 131 246 189 123 197 131 65 230 82 41 139 90 32 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/school_kid_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 180 148 213 148 115 123 90 82 172 164 115 65 90 148 49 57 82 131 123 82 197 197 238 255 222 65 205 189 123 98 164 222 49 123 156 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/scientist.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 238 82 57 131 139 172 90 98 139 230 172 222 172 123 172 57 65 98 131 139 148 180 189 197 213 222 213 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/sis_and_bro.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 180 148 189 139 106 98 57 65 255 230 131 213 180 90 172 106 49 255 164 164 222 106 115 172 74 74 189 197 230 123 148 205 65 74 115 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/sr_and_jr.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 90 131 189 65 90 139 41 65 98 49 41 65 205 213 222 180 139 90 131 90 41 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/super_nerd.pal ================================================ JASC-PAL 0100 16 115 197 164 255 230 205 222 189 148 197 148 115 106 74 65 255 98 90 197 65 65 123 123 148 82 82 98 205 205 222 164 164 180 189 156 90 49 49 65 74 49 24 255 255 255 0 0 24 ================================================ FILE: graphics/trainers/palettes/swimmer_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 222 180 148 189 139 106 98 57 65 255 230 131 213 180 90 172 106 49 255 164 164 222 106 115 172 74 74 205 205 255 164 172 238 106 106 205 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/swimmer_m.pal ================================================ JASC-PAL 0100 16 115 197 164 238 205 189 213 164 131 180 115 98 115 82 74 164 189 238 98 164 222 49 115 172 139 156 172 222 222 230 106 123 139 180 205 255 213 82 90 238 238 246 255 255 255 16 16 16 ================================================ FILE: graphics/trainers/palettes/swimming_triathlete_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 90 131 189 65 90 139 41 65 98 49 41 65 205 213 222 180 139 90 139 65 65 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/swimming_triathlete_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 90 131 189 65 90 139 41 65 98 49 41 65 205 213 222 180 139 90 139 65 65 255 98 90 197 65 65 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/tamer.pal ================================================ JASC-PAL 0100 16 172 213 172 255 222 205 238 180 148 197 139 106 106 74 74 90 90 98 115 123 139 139 148 164 156 172 180 74 49 41 180 123 65 156 65 65 238 148 90 197 205 213 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/tuber_f.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 189 222 189 148 180 148 106 98 57 65 230 164 98 197 131 57 148 90 57 255 139 156 213 74 90 139 41 57 205 205 255 164 172 238 106 106 205 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/tuber_m.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 139 172 213 90 131 189 65 90 139 57 57 57 213 222 230 255 230 74 205 57 82 238 180 57 189 131 74 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/twins.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 106 74 74 238 164 82 205 115 65 139 57 65 57 41 41 213 222 230 156 189 246 180 82 98 90 139 189 65 90 131 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/wally.pal ================================================ JASC-PAL 0100 16 115 197 164 255 238 213 222 180 164 189 148 115 123 90 82 156 148 172 115 106 131 189 205 98 148 172 74 222 222 230 98 148 49 65 106 24 98 156 222 180 180 205 255 255 255 0 0 0 ================================================ FILE: graphics/trainers/palettes/young_couple.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 238 180 148 197 139 106 98 65 57 255 255 255 139 180 230 106 131 180 82 74 115 0 0 24 255 115 90 197 82 65 222 230 238 189 197 213 123 131 148 0 0 0 ================================================ FILE: graphics/trainers/palettes/youngster.pal ================================================ JASC-PAL 0100 16 115 197 164 255 222 205 230 197 156 197 148 115 123 90 82 213 213 222 98 164 222 49 123 156 230 98 90 172 74 57 41 90 131 246 205 123 205 172 82 180 148 90 255 255 255 0 0 0 ================================================ FILE: graphics/union_room_chat/messages.pal ================================================ JASC-PAL 0100 16 0 0 0 246 246 255 0 0 0 205 205 230 49 213 0 222 230 213 0 0 255 205 213 222 255 0 0 222 213 197 255 189 0 230 230 222 197 197 197 41 32 32 0 0 0 57 57 57 ================================================ FILE: graphics/union_room_chat/objects.pal ================================================ JASC-PAL 0100 16 156 197 98 255 49 49 156 49 49 49 98 255 0 0 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 230 230 255 213 213 255 172 172 172 115 115 115 255 255 255 65 65 65 ================================================ FILE: graphics/union_room_chat/text_entry.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 213 205 205 255 255 255 255 255 255 41 41 41 255 156 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/union_room_chat/unused.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/unused/battle_anim_023.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 230 255 115 230 255 213 230 255 0 0 0 255 255 172 255 255 115 0 0 0 98 139 98 0 0 0 0 0 0 131 131 131 164 164 164 213 205 205 255 255 255 ================================================ FILE: graphics/unused/gray_palette.pal ================================================ JASC-PAL 0100 16 0 0 0 255 255 255 230 230 238 205 213 222 180 197 205 164 180 189 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/unused/old_pal1.pal ================================================ JASC-PAL 0100 16 16 139 0 0 0 0 148 65 65 0 0 0 148 65 32 16 0 0 148 65 32 8 8 0 148 65 32 148 8 8 148 65 65 24 16 0 16 139 98 32 0 0 0 16 139 0 0 0 ================================================ FILE: graphics/unused/old_pal2.pal ================================================ JASC-PAL 0100 16 16 139 0 0 0 0 148 65 65 0 0 0 148 65 32 16 0 0 148 65 32 8 8 0 148 65 32 16 0 0 148 65 65 0 0 0 16 139 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/unused/old_pal3.pal ================================================ JASC-PAL 0100 16 0 0 0 0 0 0 0 16 139 0 0 0 0 213 98 32 0 0 0 213 98 24 16 0 0 213 98 156 8 8 0 213 98 24 16 0 0 213 98 32 0 0 0 16 139 0 0 0 ================================================ FILE: graphics/unused/old_pal4.pal ================================================ JASC-PAL 0100 16 255 255 255 41 41 57 90 90 106 172 172 180 197 197 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ================================================ FILE: graphics/unused/old_pal5.pal ================================================ JASC-PAL 0100 16 98 156 131 115 115 115 189 189 189 255 255 255 189 164 41 246 246 41 222 106 32 246 131 41 115 98 246 98 74 205 238 115 156 246 148 246 115 172 246 8 8 8 90 90 90 65 65 65 ================================================ FILE: graphics/unused/old_pal6.pal ================================================ JASC-PAL 0100 16 98 156 131 115 115 115 189 189 189 255 255 255 115 148 74 156 205 74 148 246 74 238 115 156 246 148 246 189 164 41 246 246 41 8 8 8 8 8 8 8 8 8 90 90 90 65 65 65 ================================================ FILE: graphics/unused/old_pal7.pal ================================================ JASC-PAL 0100 16 98 156 131 115 115 115 156 156 156 255 255 255 98 115 246 115 172 246 164 98 41 230 172 139 189 164 41 246 246 41 246 98 82 148 123 205 197 164 205 213 41 156 90 90 90 65 65 65 ================================================ FILE: graphics/unused/red_palette.pal ================================================ JASC-PAL 0100 16 255 255 148 255 0 0 255 0 0 255 32 32 255 57 57 255 74 74 255 90 90 255 115 115 255 131 131 255 156 156 255 172 172 255 189 189 255 213 213 255 230 230 255 255 255 0 0 0 ================================================ FILE: graphics/weather/default.pal ================================================ JASC-PAL 0100 16 0 0 0 172 230 255 115 205 255 74 180 255 148 148 148 197 197 197 213 213 213 222 222 222 164 164 164 255 0 255 255 0 255 255 0 255 180 180 180 230 230 230 246 246 246 255 255 255 ================================================ FILE: graphics/wireless_status_screen/anim_00.pal ================================================ JASC-PAL 0100 16 0 0 0 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 74 246 255 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_01.pal ================================================ JASC-PAL 0100 16 0 0 0 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 74 246 255 57 213 230 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_02.pal ================================================ JASC-PAL 0100 16 0 0 0 90 90 90 90 90 90 90 90 90 90 90 90 74 246 255 57 213 230 49 180 205 0 32 98 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_03.pal ================================================ JASC-PAL 0100 16 0 0 0 90 90 90 90 90 90 90 90 90 74 246 255 57 213 230 49 180 205 41 148 180 0 32 98 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_04.pal ================================================ JASC-PAL 0100 16 0 0 0 90 90 90 90 90 90 74 246 255 57 213 230 49 180 205 41 148 180 24 123 164 0 32 98 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_05.pal ================================================ JASC-PAL 0100 16 0 0 0 90 90 90 74 246 255 57 213 230 49 180 205 41 148 180 24 123 164 16 90 139 0 32 98 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_06.pal ================================================ JASC-PAL 0100 16 0 0 0 74 246 255 57 213 230 49 180 205 41 148 180 24 123 164 16 90 139 8 57 115 0 32 98 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_07.pal ================================================ JASC-PAL 0100 16 0 0 0 57 213 230 49 180 205 41 148 180 24 123 164 16 90 139 8 57 115 8 57 115 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_08.pal ================================================ JASC-PAL 0100 16 0 0 0 49 180 205 41 148 180 24 123 164 16 90 139 8 57 115 8 57 115 90 90 90 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_09.pal ================================================ JASC-PAL 0100 16 0 0 0 41 148 180 24 123 164 16 90 139 8 57 115 8 57 115 90 90 90 90 90 90 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_10.pal ================================================ JASC-PAL 0100 16 0 0 0 24 123 164 16 90 139 8 57 115 8 57 115 90 90 90 90 90 90 90 90 90 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_11.pal ================================================ JASC-PAL 0100 16 0 0 0 16 90 139 8 57 115 8 57 115 90 90 90 90 90 90 90 90 90 90 90 90 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_12.pal ================================================ JASC-PAL 0100 16 0 0 0 8 57 115 8 57 115 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/anim_13.pal ================================================ JASC-PAL 0100 16 0 0 0 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wireless_status_screen/default.pal ================================================ JASC-PAL 0100 16 0 0 0 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 57 57 57 172 123 0 90 90 90 57 57 57 164 164 164 255 180 0 106 106 106 74 74 74 ================================================ FILE: graphics/wonder_card/bg0.pal ================================================ JASC-PAL 0100 16 90 197 148 213 213 213 74 74 74 98 106 106 213 189 74 238 213 82 246 246 213 255 255 255 230 230 213 238 238 213 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_card/bg1.pal ================================================ JASC-PAL 0100 16 90 197 148 82 82 106 131 131 139 197 189 213 205 230 255 115 139 197 49 74 82 0 0 0 0 0 0 222 255 246 197 255 222 222 238 255 156 180 222 156 106 115 172 139 164 255 255 255 ================================================ FILE: graphics/wonder_card/bg2.pal ================================================ JASC-PAL 0100 16 90 197 148 82 82 106 131 131 139 164 156 172 197 189 213 246 238 255 255 0 255 255 0 255 255 0 255 255 0 255 255 230 230 255 197 197 255 164 164 246 139 139 238 90 90 255 255 255 ================================================ FILE: graphics/wonder_card/bg3.pal ================================================ JASC-PAL 0100 16 90 197 148 82 82 106 131 131 139 164 156 172 197 189 213 246 238 255 255 0 255 255 0 255 255 0 255 255 0 255 238 255 230 213 255 189 189 230 156 164 213 131 148 197 106 255 255 255 ================================================ FILE: graphics/wonder_card/bg4.pal ================================================ JASC-PAL 0100 16 90 197 148 82 82 106 131 131 139 164 156 172 197 189 213 246 238 255 255 0 255 255 0 255 255 0 255 255 0 255 238 246 255 205 238 246 180 222 246 156 197 238 115 156 197 255 255 255 ================================================ FILE: graphics/wonder_card/bg5.pal ================================================ JASC-PAL 0100 16 90 197 148 82 82 106 131 131 139 164 156 172 197 189 213 246 238 255 255 0 255 255 0 255 255 0 255 255 0 255 238 238 197 230 230 139 222 222 115 213 213 90 189 189 57 255 255 255 ================================================ FILE: graphics/wonder_card/bg6.pal ================================================ JASC-PAL 0100 16 189 123 148 213 213 213 74 74 74 115 123 123 164 156 90 164 148 90 197 197 90 213 205 90 222 213 90 213 213 106 238 246 98 230 222 98 213 205 98 197 180 98 238 230 98 246 238 106 ================================================ FILE: graphics/wonder_card/bg7.pal ================================================ JASC-PAL 0100 16 189 123 148 213 213 213 74 74 74 115 123 123 156 156 156 139 139 148 180 180 197 197 189 205 205 205 222 189 189 189 197 230 222 189 213 213 180 197 197 156 164 172 222 222 230 230 230 238 ================================================ FILE: graphics/wonder_card/stamp_shadow_0.pal ================================================ JASC-PAL 0100 16 90 197 148 189 189 164 205 205 172 213 213 189 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_card/stamp_shadow_1.pal ================================================ JASC-PAL 0100 16 90 197 148 82 82 106 164 156 180 246 238 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_card/stamp_shadow_2.pal ================================================ JASC-PAL 0100 16 90 197 148 246 139 139 246 180 180 255 230 230 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_card/stamp_shadow_3.pal ================================================ JASC-PAL 0100 16 90 197 148 164 213 131 197 230 180 238 255 230 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_card/stamp_shadow_4.pal ================================================ JASC-PAL 0100 16 90 197 148 156 197 238 197 222 246 238 246 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_card/stamp_shadow_5.pal ================================================ JASC-PAL 0100 16 90 197 148 213 213 90 222 222 139 238 238 197 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_card/stamp_shadow_6.pal ================================================ JASC-PAL 0100 16 90 197 148 205 189 98 222 205 115 230 222 98 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_card/stamp_shadow_7.pal ================================================ JASC-PAL 0100 16 90 197 148 197 197 197 205 205 205 213 213 213 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_news/bg0.pal ================================================ JASC-PAL 0100 16 90 197 148 213 213 213 74 74 74 98 106 106 213 189 74 238 213 82 246 246 213 255 255 255 230 230 213 238 238 213 246 246 238 255 0 255 255 0 255 255 0 255 255 0 255 255 0 255 ================================================ FILE: graphics/wonder_news/bg6.pal ================================================ JASC-PAL 0100 16 189 123 148 213 213 213 74 74 74 115 123 123 164 156 90 164 148 90 197 197 90 213 205 90 222 213 90 213 213 106 238 246 98 230 222 98 213 205 98 197 180 98 238 230 98 246 238 106 ================================================ FILE: graphics/wonder_news/bg7.pal ================================================ JASC-PAL 0100 16 189 123 148 213 213 213 74 74 74 115 123 123 156 156 156 139 139 148 180 180 197 197 189 205 205 205 222 189 189 189 197 230 222 189 213 213 180 197 197 156 164 172 222 222 230 230 230 238 ================================================ FILE: graphics_file_rules.mk ================================================ TILESETGFXDIR := data/tilesets FONTGFXDIR := graphics/fonts FAMECHECKERGFXDIR := graphics/fame_checker INTERFACEGFXDIR := graphics/interface PARTYMENUGFXDIR := graphics/party_menu BTLANMSPRGFXDIR := graphics/battle_anims/sprites UNUSEDGFXDIR := graphics/unused UNKNOWNGFXDIR := graphics/unknown BATINTGFXDIR := graphics/battle_interface MASKSGFXDIR := graphics/battle_anims/masks BATTRANSGFXDIR := graphics/battle_transitions TYPESGFXDIR := graphics/types RAYQUAZAGFXDIR := graphics/rayquaza_scene ROULETTEGFXDIR := graphics/roulette SLOTMACHINEGFXDIR := graphics/slot_machine PSSGFXDIR := graphics/pokemon_storage EVENTOBJGFXDIR := graphics/object_events FIELDEFFECTSGFXDIR := graphics/field_effects MISCGFXDIR := graphics/misc TEXTWINDOWGFXDIR := graphics/text_window TEACHYTVGFXDIR := graphics/teachy_tv SSANNEGFXDIR := graphics/ss_anne ITEMPCGFXDIR := graphics/item_pc TITLESCREENGFXDIR := graphics/title_screen CREDITSGFXDIR := graphics/credits ITEMMENUGFXDIR := graphics/item_menu INTROGFXDIR := graphics/intro BATTLETERRAINGFXDIR := graphics/battle_terrain BERRYPOUCHGFXDIR := graphics/berry_pouch HALLOFFAMEGFXDIR := graphics/hall_of_fame MAPPREVIEWGFXDIR := graphics/map_preview NAMINGGFXDIR := graphics/naming_screen WALLPAPERGFXDIR := graphics/pokemon_storage/wallpapers JPCONTESTGFXDIR := graphics/contest/japanese types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark contest_types := cool beauty cute smart tough CASTFORMGFXDIR := graphics/pokemon/castform $(CASTFORMGFXDIR)/front.4bpp: $(CASTFORMGFXDIR)/normal/front.4bpp \ $(CASTFORMGFXDIR)/sunny/front.4bpp \ $(CASTFORMGFXDIR)/rainy/front.4bpp \ $(CASTFORMGFXDIR)/snowy/front.4bpp @cat $^ >$@ $(CASTFORMGFXDIR)/back.4bpp: $(CASTFORMGFXDIR)/normal/back.4bpp \ $(CASTFORMGFXDIR)/sunny/back.4bpp \ $(CASTFORMGFXDIR)/rainy/back.4bpp \ $(CASTFORMGFXDIR)/snowy/back.4bpp @cat $^ >$@ $(CASTFORMGFXDIR)/normal.gbapal: $(CASTFORMGFXDIR)/normal/normal.gbapal \ $(CASTFORMGFXDIR)/sunny/normal.gbapal \ $(CASTFORMGFXDIR)/rainy/normal.gbapal \ $(CASTFORMGFXDIR)/snowy/normal.gbapal @cat $^ >$@ $(CASTFORMGFXDIR)/shiny.gbapal: $(CASTFORMGFXDIR)/normal/shiny.gbapal \ $(CASTFORMGFXDIR)/sunny/shiny.gbapal \ $(CASTFORMGFXDIR)/rainy/shiny.gbapal \ $(CASTFORMGFXDIR)/snowy/shiny.gbapal @cat $^ >$@ $(FONTGFXDIR)/latin_small.latfont: $(FONTGFXDIR)/latin_small.png $(GFX) $< $@ $(FONTGFXDIR)/japanese_small.fwjpnfont: $(FONTGFXDIR)/japanese_small.png $(GFX) $< $@ $(FONTGFXDIR)/japanese_tall.fwjpnfont: $(FONTGFXDIR)/japanese_tall.png $(GFX) $< $@ $(FONTGFXDIR)/latin_normal.latfont: $(FONTGFXDIR)/latin_normal.png $(GFX) $< $@ $(FONTGFXDIR)/japanese_normal.fwjpnfont: $(FONTGFXDIR)/japanese_normal.png $(GFX) $< $@ $(FONTGFXDIR)/latin_male.latfont: $(FONTGFXDIR)/latin_male.png $(GFX) $< $@ $(FONTGFXDIR)/japanese_male.fwjpnfont: $(FONTGFXDIR)/japanese_male.png $(GFX) $< $@ $(FONTGFXDIR)/latin_female.latfont: $(FONTGFXDIR)/latin_female.png $(GFX) $< $@ $(FONTGFXDIR)/japanese_female.fwjpnfont: $(FONTGFXDIR)/japanese_female.png $(GFX) $< $@ $(FONTGFXDIR)/braille.fwjpnfont: $(FONTGFXDIR)/braille.png $(GFX) $< $@ $(FONTGFXDIR)/japanese_bold.fwjpnfont: $(FONTGFXDIR)/japanese_bold.png $(GFX) $< $@ graphics/title_screen/pokemon_logo.gbapal: %.gbapal: %.pal $(GFX) $< $@ -num_colors 224 graphics/pokemon_jump/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 63 -Wnum_tiles $(MISCGFXDIR)/japanese_hof.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 29 -Wnum_tiles $(MISCGFXDIR)/markings2.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 25 -Wnum_tiles $(INTERFACEGFXDIR)/menu.gbapal: $(INTERFACEGFXDIR)/menu_0.gbapal \ $(INTERFACEGFXDIR)/menu_1.gbapal @cat $^ >$@ $(BTLANMSPRGFXDIR)/ice_cube.4bpp: $(BTLANMSPRGFXDIR)/ice_cube_0.4bpp \ $(BTLANMSPRGFXDIR)/ice_cube_1.4bpp \ $(BTLANMSPRGFXDIR)/ice_cube_2.4bpp \ $(BTLANMSPRGFXDIR)/ice_cube_3.4bpp @cat $^ >$@ $(UNUSEDGFXDIR)/obi_palpak1.gbapal: $(UNUSEDGFXDIR)/old_pal1.gbapal \ $(UNUSEDGFXDIR)/old_pal2.gbapal \ $(UNUSEDGFXDIR)/old_pal3.gbapal @cat $^ >$@ $(UNUSEDGFXDIR)/obi_palpak3.gbapal: $(UNUSEDGFXDIR)/old_pal5.gbapal \ $(UNUSEDGFXDIR)/old_pal6.gbapal \ $(UNUSEDGFXDIR)/old_pal7.gbapal @cat $^ >$@ $(UNUSEDGFXDIR)/obi1.4bpp: $(UNUSEDGFXDIR)/old_bulbasaur.4bpp \ $(UNUSEDGFXDIR)/old_charizard.4bpp @cat $^ >$@ $(UNUSEDGFXDIR)/obi2.4bpp: $(UNUSEDGFXDIR)/old_bulbasaur2.4bpp \ $(UNUSEDGFXDIR)/old_battle_interface_1.4bpp \ $(UNUSEDGFXDIR)/old_battle_interface_2.4bpp \ $(UNUSEDGFXDIR)/old_battle_interface_3.4bpp @cat $^ >$@ $(INTERFACEGFXDIR)/hp_numbers.4bpp: $(INTERFACEGFXDIR)/hp_bar_anim.4bpp \ $(INTERFACEGFXDIR)/numbers1.4bpp \ $(INTERFACEGFXDIR)/numbers2.4bpp @cat $^ >$@ $(UNUSEDGFXDIR)/redyellowgreen_frame.bin: $(UNUSEDGFXDIR)/red_frame.bin \ $(UNUSEDGFXDIR)/yellow_frame.bin \ $(UNUSEDGFXDIR)/green_frame.bin \ $(UNUSEDGFXDIR)/blank_frame.bin @cat $^ >$@ $(UNUSEDGFXDIR)/color_frames.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 353 -Wnum_tiles $(BATINTGFXDIR)/unused_window2bar.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 5 -Wnum_tiles $(BATINTGFXDIR)/level_up_banner.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 36 -Wnum_tiles $(BATINTGFXDIR)/textbox.gbapal: $(BATINTGFXDIR)/textbox1.gbapal $(BATINTGFXDIR)/textbox2.gbapal cat $^ > $@ $(JPCONTESTGFXDIR)/composite_1.4bpp: $(JPCONTESTGFXDIR)/frame_1.4bpp \ $(JPCONTESTGFXDIR)/floor.4bpp \ $(JPCONTESTGFXDIR)/frame_2.4bpp \ $(JPCONTESTGFXDIR)/symbols.4bpp \ $(JPCONTESTGFXDIR)/meter.4bpp \ $(JPCONTESTGFXDIR)/classes.4bpp \ $(JPCONTESTGFXDIR)/numbers_2.4bpp @cat $^ >$@ $(JPCONTESTGFXDIR)/composite_2.4bpp: $(JPCONTESTGFXDIR)/interface.4bpp \ $(JPCONTESTGFXDIR)/audience.4bpp @cat $^ >$@ $(JPCONTESTGFXDIR)/voltage.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 36 -Wnum_tiles $(BTLANMSPRGFXDIR)/ice_crystals.4bpp: $(BTLANMSPRGFXDIR)/ice_crystals_0.4bpp \ $(BTLANMSPRGFXDIR)/ice_crystals_1.4bpp \ $(BTLANMSPRGFXDIR)/ice_crystals_2.4bpp \ $(BTLANMSPRGFXDIR)/ice_crystals_3.4bpp \ $(BTLANMSPRGFXDIR)/ice_crystals_4.4bpp @cat $^ >$@ $(BTLANMSPRGFXDIR)/mud_sand.4bpp: $(BTLANMSPRGFXDIR)/mud_sand_0.4bpp \ $(BTLANMSPRGFXDIR)/mud_sand_1.4bpp @cat $^ >$@ $(BTLANMSPRGFXDIR)/flower.4bpp: $(BTLANMSPRGFXDIR)/flower_0.4bpp \ $(BTLANMSPRGFXDIR)/flower_1.4bpp @cat $^ >$@ $(BTLANMSPRGFXDIR)/spark.4bpp: $(BTLANMSPRGFXDIR)/spark_0.4bpp \ $(BTLANMSPRGFXDIR)/spark_1.4bpp @cat $^ >$@ $(MASKSGFXDIR)/unused_level_up.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 14 -Wnum_tiles $(BATTRANSGFXDIR)/vs_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 16 -Wnum_tiles $(PARTYMENUGFXDIR)/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 62 -Wnum_tiles $(TYPESGFXDIR)/move_types.4bpp: $(types:%=$(TYPESGFXDIR)/%.4bpp) $(contest_types:%=$(TYPESGFXDIR)/contest_%.4bpp) @cat $^ >$@ $(TYPESGFXDIR)/move_types.gbapal: $(TYPESGFXDIR)/move_types_1.gbapal \ $(TYPESGFXDIR)/move_types_2.gbapal \ $(TYPESGFXDIR)/move_types_3.gbapal @cat $^ >$@ $(INTERFACEGFXDIR)/bag_screen.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 53 -Wnum_tiles $(RAYQUAZAGFXDIR)/rayquaza.8bpp: %.8bpp: %.png $(GFX) $< $@ -num_tiles 227 -Wnum_tiles $(RAYQUAZAGFXDIR)/overcast.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 313 -Wnum_tiles $(RAYQUAZAGFXDIR)/rayquaza_fly1.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 124 -Wnum_tiles $(RAYQUAZAGFXDIR)/rayquaza_tail_fix.4bpp: $(RAYQUAZAGFXDIR)/rayquaza_tail.4bpp cp $< $@ head -c 12 /dev/zero >> $@ $(RAYQUAZAGFXDIR)/chase_streaks.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 19 -Wnum_tiles $(RAYQUAZAGFXDIR)/rayquaza_chase.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 155 -Wnum_tiles graphics/picture_frame/frame5.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 86 -Wnum_tiles $(ROULETTEGFXDIR)/roulette_tilt.4bpp: $(ROULETTEGFXDIR)/shroomish.4bpp \ $(ROULETTEGFXDIR)/tailow.4bpp @cat $^ >$@ $(ROULETTEGFXDIR)/poke_icons2.4bpp: $(ROULETTEGFXDIR)/wynaut.4bpp \ $(ROULETTEGFXDIR)/azurill.4bpp \ $(ROULETTEGFXDIR)/skitty.4bpp \ $(ROULETTEGFXDIR)/makuhita.4bpp @cat $^ >$@ $(UNUSEDGFXDIR)/intro_birch_beauty.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 822 -Wnum_tiles $(PSSGFXDIR)/forest_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 55 -Wnum_tiles $(PSSGFXDIR)/forest.4bpp: $(PSSGFXDIR)/forest_frame.4bpp $(PSSGFXDIR)/forest_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/city_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 52 -Wnum_tiles $(PSSGFXDIR)/city.4bpp: $(PSSGFXDIR)/city_frame.4bpp $(PSSGFXDIR)/city_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/desert.4bpp: $(PSSGFXDIR)/desert_frame.4bpp $(PSSGFXDIR)/desert_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/savanna_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 45 -Wnum_tiles $(PSSGFXDIR)/savanna_bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 23 -Wnum_tiles $(PSSGFXDIR)/savanna.4bpp: $(PSSGFXDIR)/savanna_frame.4bpp $(PSSGFXDIR)/savanna_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/crag_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 49 -Wnum_tiles $(PSSGFXDIR)/crag.4bpp: $(PSSGFXDIR)/crag_frame.4bpp $(PSSGFXDIR)/crag_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/volcano_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 56 -Wnum_tiles $(PSSGFXDIR)/volcano.4bpp: $(PSSGFXDIR)/volcano_frame.4bpp $(PSSGFXDIR)/volcano_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/snow_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 57 -Wnum_tiles $(PSSGFXDIR)/snow.4bpp: $(PSSGFXDIR)/snow_frame.4bpp $(PSSGFXDIR)/snow_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/cave_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 55 -Wnum_tiles $(PSSGFXDIR)/cave.4bpp: $(PSSGFXDIR)/cave_frame.4bpp $(PSSGFXDIR)/cave_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/beach_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 46 -Wnum_tiles $(PSSGFXDIR)/beach_bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 23 -Wnum_tiles $(PSSGFXDIR)/beach.4bpp: $(PSSGFXDIR)/beach_frame.4bpp $(PSSGFXDIR)/beach_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/seafloor_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 54 -Wnum_tiles $(PSSGFXDIR)/seafloor.4bpp: $(PSSGFXDIR)/seafloor_frame.4bpp $(PSSGFXDIR)/seafloor_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/river_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 51 -Wnum_tiles $(PSSGFXDIR)/river_bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 11 -Wnum_tiles $(PSSGFXDIR)/river.4bpp: $(PSSGFXDIR)/river_frame.4bpp $(PSSGFXDIR)/river_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/sky_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 45 -Wnum_tiles $(PSSGFXDIR)/sky.4bpp: $(PSSGFXDIR)/sky_frame.4bpp $(PSSGFXDIR)/sky_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/polkadot_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 54 -Wnum_tiles $(PSSGFXDIR)/polkadot.4bpp: $(PSSGFXDIR)/polkadot_frame.4bpp $(PSSGFXDIR)/polkadot_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/pokecenter_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 35 -Wnum_tiles $(PSSGFXDIR)/pokecenter.4bpp: $(PSSGFXDIR)/pokecenter_frame.4bpp $(PSSGFXDIR)/pokecenter_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/machine_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 33 -Wnum_tiles $(PSSGFXDIR)/machine.4bpp: $(PSSGFXDIR)/machine_frame.4bpp $(PSSGFXDIR)/machine_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/plain_frame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 18 -Wnum_tiles $(PSSGFXDIR)/plain.4bpp: $(PSSGFXDIR)/plain_frame.4bpp $(PSSGFXDIR)/plain_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/friends_frame1.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 57 -Wnum_tiles $(PSSGFXDIR)/friends_frame2.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 57 -Wnum_tiles $(PSSGFXDIR)/zigzagoon.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/zigzagoon_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/screen.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/screen_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/horizontal.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/horizontal_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/diagonal.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/diagonal_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/block.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/block_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/ribbon.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/ribbon_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/pokecenter2.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/pokecenter2_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/frame.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/frame_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/blank.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/blank_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/circles.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/circles_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/azumarill.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/azumarill_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/pikachu.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/pikachu_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/legendary.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/legendary_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/dusclops.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/dusclops_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/ludicolo.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/ludicolo_bg.4bpp @cat $^ >$@ $(PSSGFXDIR)/whiscash.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/whiscash_bg.4bpp @cat $^ >$@ $(FIELDEFFECTSGFXDIR)/pics/underwater_bubbles.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(FIELDEFFECTSGFXDIR)/pics/bike_tire_tracks.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(FIELDEFFECTSGFXDIR)/pics/sand_disguise.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(FIELDEFFECTSGFXDIR)/pics/mountain_disguise.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(FIELDEFFECTSGFXDIR)/pics/tree_disguise.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(INTERFACEGFXDIR)/selector_outline.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 8 -Wnum_tiles graphics/tm_case/tm_case.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 91 -Wnum_tiles $(PKNAVGFXDIR)/header.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 53 -Wnum_tiles $(PKNAVGFXDIR)/outline.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 53 -Wnum_tiles $(PKNAVGFXDIR)/ui_matchcall.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 13 -Wnum_tiles $(INTERFACEGFXDIR)/region_map.8bpp: %.8bpp: %.png $(GFX) $< $@ -num_tiles 232 -Wnum_tiles $(INTERFACEGFXDIR)/region_map_affine.8bpp: %.8bpp: %.png $(GFX) $< $@ -num_tiles 233 -Wnum_tiles graphics/region_map/region_map_hoenn.8bpp: %.8bpp: %.png $(GFX) $< $@ -num_tiles 233 $(MISCGFXDIR)/birch_help.4bpp: $(MISCGFXDIR)/birch_bag.4bpp $(MISCGFXDIR)/birch_grass.4bpp @cat $^ >$@ $(FAMECHECKERGFXDIR)/spinning_pokeball.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 15 -Wnum_tiles $(FAMECHECKERGFXDIR)/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 165 -Wnum_tiles graphics/seagallop/water.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 41 -Wnum_tiles graphics/link/321start.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(TEXTWINDOWGFXDIR)/signpost.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 19 -Wnum_tiles $(SLOTMACHINEGFXDIR)/firered/combos_window.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 66 -Wnum_tiles $(SLOTMACHINEGFXDIR)/firered/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 138 -Wnum_tiles $(SLOTMACHINEGFXDIR)/leafgreen/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 134 -Wnum_tiles $(TEACHYTVGFXDIR)/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 233 -Wnum_tiles $(SSANNEGFXDIR)/smoke.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 17 -Wnum_tiles $(ITEMPCGFXDIR)/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 82 -Wnum_tiles $(TITLESCREENGFXDIR)/firered/box_art_mon.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 135 -Wnum_tiles $(TITLESCREENGFXDIR)/leafgreen/box_art_mon.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 123 -Wnum_tiles POKEDEXAREAMARKERSDATADIR := graphics/pokedex/area_markers POKEDEXAREAMARKERFILES := \ $(POKEDEXAREAMARKERSDATADIR)/marker_0.4bpp \ $(POKEDEXAREAMARKERSDATADIR)/marker_1.4bpp \ $(POKEDEXAREAMARKERSDATADIR)/marker_2.4bpp \ $(POKEDEXAREAMARKERSDATADIR)/marker_3.4bpp \ $(POKEDEXAREAMARKERSDATADIR)/marker_4.4bpp \ $(POKEDEXAREAMARKERSDATADIR)/marker_5.4bpp \ $(POKEDEXAREAMARKERSDATADIR)/marker_6.4bpp $(POKEDEXAREAMARKERSDATADIR)/marker.4bpp: $(POKEDEXAREAMARKERFILES) cat $^ > $@ graphics/pokemon/heracross/unk_icon.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 graphics/misc/emoticons.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(ITEMMENUGFXDIR)/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 55 -Wnum_tiles $(INTROGFXDIR)/scene_1/grass.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 397 -Wnum_tiles $(INTROGFXDIR)/scene_2/plants.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 17 -Wnum_tiles $(INTROGFXDIR)/scene_2/nidorino_close.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 170 -Wnum_tiles $(INTROGFXDIR)/scene_2/gengar_close.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 114 -Wnum_tiles $(INTROGFXDIR)/scene_3/gengar_anim.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 348 -Wnum_tiles $(BATTLETERRAINGFXDIR)/building/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 77 -Wnum_tiles $(BATTLETERRAINGFXDIR)/cave/anim.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 106 -Wnum_tiles $(BATTLETERRAINGFXDIR)/cave/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 84 -Wnum_tiles $(BATTLETERRAINGFXDIR)/grass/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 98 -Wnum_tiles $(BATTLETERRAINGFXDIR)/indoor/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 77 -Wnum_tiles $(BATTLETERRAINGFXDIR)/longgrass/anim.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 133 -Wnum_tiles $(BATTLETERRAINGFXDIR)/longgrass/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 98 -Wnum_tiles $(BATTLETERRAINGFXDIR)/mountain/anim.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 47 -Wnum_tiles $(BATTLETERRAINGFXDIR)/pond/anim.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 36 -Wnum_tiles $(BATTLETERRAINGFXDIR)/pond/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 75 -Wnum_tiles $(BATTLETERRAINGFXDIR)/sand/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 83 -Wnum_tiles $(BATTLETERRAINGFXDIR)/underwater/anim.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 26 -Wnum_tiles $(BATTLETERRAINGFXDIR)/underwater/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 85 -Wnum_tiles $(BATTLETERRAINGFXDIR)/water/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 81 -Wnum_tiles $(BERRYPOUCHGFXDIR)/background.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 52 -Wnum_tiles $(HALLOFFAMEGFXDIR)/hall_of_fame.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 29 -Wnum_tiles $(TILESETGFXDIR)/primary/general/anim/water_current_landwatersedge/7.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 47 -Wnum_tiles $(MAPPREVIEWGFXDIR)/altering_cave/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 391 -Wnum_tiles $(MAPPREVIEWGFXDIR)/berry_forest/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 395 -Wnum_tiles $(MAPPREVIEWGFXDIR)/digletts_cave/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 398 -Wnum_tiles $(MAPPREVIEWGFXDIR)/dotted_hole/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 317 -Wnum_tiles $(MAPPREVIEWGFXDIR)/icefall_cave/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 399 -Wnum_tiles $(MAPPREVIEWGFXDIR)/lost_cave/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 404 -Wnum_tiles $(MAPPREVIEWGFXDIR)/monean_chamber/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 326 -Wnum_tiles $(MAPPREVIEWGFXDIR)/mt_ember/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 355 -Wnum_tiles $(MAPPREVIEWGFXDIR)/mt_moon/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 364 -Wnum_tiles $(MAPPREVIEWGFXDIR)/pokemon_mansion/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 388 -Wnum_tiles $(MAPPREVIEWGFXDIR)/pokemon_tower/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 290 -Wnum_tiles $(MAPPREVIEWGFXDIR)/power_plant/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 368 -Wnum_tiles $(MAPPREVIEWGFXDIR)/rock_tunnel/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 407 -Wnum_tiles $(MAPPREVIEWGFXDIR)/rocket_hideout/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 194 -Wnum_tiles $(MAPPREVIEWGFXDIR)/rocket_warehouse/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 234 -Wnum_tiles $(MAPPREVIEWGFXDIR)/safari_zone/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 330 -Wnum_tiles $(MAPPREVIEWGFXDIR)/seafoam_islands/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 408 -Wnum_tiles $(MAPPREVIEWGFXDIR)/silph_co/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 355 -Wnum_tiles $(MAPPREVIEWGFXDIR)/victory_road/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 375 -Wnum_tiles $(MAPPREVIEWGFXDIR)/viridian_forest/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 389 -Wnum_tiles $(NAMINGGFXDIR)/cursor.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 5 -Wnum_tiles $(NAMINGGFXDIR)/cursor_squished.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 5 -Wnum_tiles $(NAMINGGFXDIR)/cursor_filled.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 5 -Wnum_tiles $(WALLPAPERGFXDIR)/beach/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 60 -Wnum_tiles $(WALLPAPERGFXDIR)/cave/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 61 -Wnum_tiles $(WALLPAPERGFXDIR)/city/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 40 -Wnum_tiles $(WALLPAPERGFXDIR)/crag/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 54 -Wnum_tiles $(WALLPAPERGFXDIR)/desert/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 52 -Wnum_tiles $(WALLPAPERGFXDIR)/forest/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 53 -Wnum_tiles $(WALLPAPERGFXDIR)/pokecenter/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 57 -Wnum_tiles $(WALLPAPERGFXDIR)/river/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 63 -Wnum_tiles $(WALLPAPERGFXDIR)/savanna/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 45 -Wnum_tiles $(WALLPAPERGFXDIR)/seafloor/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 53 -Wnum_tiles $(WALLPAPERGFXDIR)/simple/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 25 -Wnum_tiles $(WALLPAPERGFXDIR)/sky/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 52 -Wnum_tiles $(WALLPAPERGFXDIR)/snow/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 51 -Wnum_tiles $(WALLPAPERGFXDIR)/stars/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 37 -Wnum_tiles $(WALLPAPERGFXDIR)/tiles/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 31 -Wnum_tiles $(WALLPAPERGFXDIR)/volcano/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 57 -Wnum_tiles ================================================ FILE: include/AgbRfu_LinkManager.h ================================================ #ifndef GUARD_LINKMANAGER_H #define GUARD_LINKMANAGER_H //----------------------------------------------------------------- // Constant definition //----------------------------------------------------------------- // Link Manager operation mode (specified by u8 parent_child argument of rfu_LMAN_establishConnection) //#define MODE_CHILD 0 // Start Link Manager in CHILD mode //#define MODE_PARENT 1 // Start Link Manager in PARENT mode //Note: This value uses the item defined by AgbRFU_LL.h. #define MODE_P_C_SWITCH 2 // Start Link Manager in parent-child switching mode. // Value of lman.p_c_switch_flag #define PCSWITCH_1ST_SC_START 0x01 #define PCSWITCH_1ST_SC 0x02 #define PCSWITCH_2ND_SP_START 0x03 #define PCSWITCH_2ND_SP 0x04 #define PCSWITCH_3RD_SC_START 0x05 #define PCSWITCH_3RD_SC 0x06 #define PCSWITCH_CP 0x07 #define PCSWITCH_SC_LOCK 0x08 #define PCSWITCH_FORCE_SP_START 0x09 // Period for which parent-child switching search specified #define PCSWITCH_ALL_PERIOD 180 // Entire cycle 180 frames #define PCSWITCH_SP_PERIOD 40 // Child period 40 frames // Error code returned by Link Manager API (rfu_LMAN_...return value of function) #define LMAN_ERROR_MANAGER_BUSY 1 // Link Manager is already running. #define LMAN_ERROR_AGB_CLK_SLAVE 2 // AGB is clock slave so link manager cannot run. #define LMAN_ERROR_PID_NOT_FOUND 3 // Parent device information of the specified PID does not exist in rfuLinkStatus->partner[0-3]. #define LMAN_ERROR_ILLEGAL_PARAMETER 4 // Specified argument is unusual. #define LMAN_ERROR_NOW_LINK_RECOVERY 5 // New settings were ignored because link recovery was under way when current link recovery was ON and new settings turned link recovery OFF. #define LMAN_ERROR_NOW_COMMUNICATION 6 // New settings were ignored because currently communicating with NI. #define LMAN_ERROR_NOW_SEARCH_PARENT 7 // Parent search currently under way, so ignore new setting. // Details of messages and the related parameters returned by the u8 msg, u8 param_count, and lman.param[0-1] arguments of the LMAN callback generated by the operation of the Link Manager. // msg name msg No. param qty param[0] param[1] Description #define LMAN_MSG_INITIALIZE_COMPLETED 0x00 // 0 - - Generated when RFU reset and initial settings are completed #define LMAN_MSG_NEW_CHILD_CONNECT_DETECTED 0x10 // 1 Bit indicating slot - Generated when new child device connection was detected at RFU level. // with detected connection #define LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED 0x11 // 1 Bit indicating slot - Generated when game identification information from child device connected at RFU level is received and accepted (game serial numbers match). // where connection was accepted #define LMAN_MSG_NEW_CHILD_CONNECT_REJECTED 0x12 // 1 Bit indicating slot - Generated when the connection from the child device connected at RFU level is rejected (game identification information reception failed or game serial numbers do not match). // where connection was rejected #define LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED 0x13 // 0 - - Generated when SearchChild operation time expires. #define LMAN_MSG_END_WAIT_CHILD_NAME 0x14 // 0 - - Generated when reception of game identification information from all child devices completes after the SearchChild operation time expires. #define LMAN_MSG_PARENT_FOUND 0x20 // 1 Bit indicating - Generated when valid (game serial numbers match) parent devices are found during SearchParent. // rfuLinkStatus->partner[x] index number storing the valid parent devices (game serial number matches) from among the discovered parent devices. #define LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED 0x21 // 0 - - Generated when SearchParent time expires. #define LMAN_MSG_CONNECT_PARENT_SUCCESSED 0x22 // 1 Connected slot number - Generated when connection with parent device at RFU level succeeds. #define LMAN_MSG_CONNECT_PARENT_FAILED 0x23 // 1 Connection failure reason - Generated when connection with parent device at RFU level fails. #define LMAN_MSG_CHILD_NAME_SEND_COMPLETED 0x24 // 0 - - Generated when transmission of the child's game identification information to the parent device succeeds after connection with parent device at RFU level succeeds. #define LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED 0x25 // 0 - - Generated when transmission of the child's game identification information to the parent device fails after connection with parent device at RFU level succeeds. #define LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED 0x30 // 1 Bit indicating slot - Generated when a link cut is detected and that slot disconnects. (Generated only when link recovery is OFF.) // that was disconnected and where link cut was detected but link recover not attempted #define LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY 0x31 // 1 Bit indicating slot - Generated when a link cut is detected and the link recovery process starts. (Generated only when link recovery is ON.) // where link cut was detected and link recovery was started #define LMAN_MSG_LINK_RECOVERY_SUCCESSED 0x32 // 1 Bit indicating slot - Generated when link recovery succeeds. (Generated only when link recovery is ON.) // where link recovery succeeded #define LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED 0x33 // 1 Bit indicating slot - Generated when link recovery fails and that slot disconnects. (Generated only when link recovery is ON.) // where link recovery failed and that disconnected #define LMAN_MSG_LINK_DISCONNECTED_BY_USER 0x40 // 1 Generated on disconnection by execution of rfu_REQ_disconnect by disconnected user. // Slot indicated in bits *Note: If rfu_REQ_disconnect is used for disconnection during link recovery in the child device, the link recovery is also suspended, but the only message returned is DISCONNECTED_BY_USER. #define LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE 0x41 // 0 - - Generated when the AGB-RFU clock switches to AGB clock slave after a successful connection or link recovery in the child device. (This message is not generated when the AGB switches to a clock slave when an MSC callback completes.) #define LMAN_MSG_CHANGE_AGB_CLOCK_MASTER 0x45 // 0 - - Generated when the AGB-RFU intercommunication clock is switched to the AGB clock master in the child device. #define LMAN_MSG_RFU_POWER_DOWN 0x42 // 0 - - Generated when the RFU enters power conservation mode with rfu_LMAN_powerDownRFU. #define LMAN_MSG_MANAGER_STOPPED 0x43 // 0 - - Generated when the Link Manager is halted by rfu_LMAN_stopLMAN(0). (This message is not generated during SearchChild, SearchParent, ConnectParent, and LinkRecovery. A message (-PERIOD_EXPIRED, -SUCCESSED, -FAILED) corresponding to the operation completion is returned.) #define LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET 0x44 // 0 - - Generates when the Link Manager is forcibly halted by rfu_LMAN_stopLMAN(1) and RFU is reset. #define LMAN_MSG_RECV_DATA_REQ_COMPLETED 0x50 // 0 - - Generated when the execution of rfu_REQ_recvData completes. (This message is not notification of data reception from a RFU.) #define LMAN_MSG_REQ_API_ERROR 0xf0 // 2 REQ_commandID REQ_result REQ-API resulted in error. This message is also generated by an REQ-API executed by either the link manager or the user. #define LMAN_MSG_WATCH_DOG_TIMER_ERROR 0xf1 // 0 - - Generated when a MSC callback does not occur even after 6 seconds pass when the AGB is the clock slave. #define LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA 0xf2 // 0 - - Generated when an automatic starting DMA, such as HDMA, is issued at the same time the RFU attempts to send notification and to return the AGB to the clock master while the AGB is the clock slave and the exchange of that information (REQ command) fails. #define LMAN_MSG_LMAN_API_ERROR_RETURN 0xf3 // 1 Return error code - Generated when LMAN-API execution returns an error. #define LMAN_MSG_RFU_FATAL_ERROR 0xff // 0 - - Generated when the Link Manager cannot recongize a RFU because of the execution of rfu_REQBN_softReset_and_checkID. // Value of lman.childClockSlave_flag #define RFU_CHILD_CLOCK_SLAVE_OFF 0 // The child device is not operating in AGB clock slave mode. (The child device is in this mode in cases such as when the child has not established a connection or during link recovery.) #define RFU_CHILD_CLOCK_SLAVE_ON 1 // The child device is operating in AGB clock slave mode. (Child automatically enters this mode when a connection is established.) #define RFU_CHILD_CLOCK_SLAVE_OFF_REQ 2 // The child device has requested that AGB clock slave mode be halted. // State of Link Manager (values of lman.state, lman.next_state) #define LMAN_STATE_READY 0x00 // Waiting #define LMAN_STATE_SOFT_RESET_AND_CHECK_ID 0x01 // Requesting execution of rfu_REQBN_softResetAndCheckID (same as below) #define LMAN_STATE_RESET 0x02 // rfu_REQ_reset #define LMAN_STATE_CONFIG_SYSTEM 0x03 // rfu_REQ_configSystem #define LMAN_STATE_CONFIG_GAME_DATA 0x04 // rfu_REQ_configGameData #define LMAN_STATE_START_SEARCH_CHILD 0x05 // rfu_REQ_startSearchChild #define LMAN_STATE_POLL_SEARCH_CHILD 0x06 // rfu_REQ_pollSearchChild #define LMAN_STATE_END_SEARCH_CHILD 0x07 // rfu_REQ_endSearchChild #define LMAN_STATE_WAIT_RECV_CHILD_NAME 0x08 // Awaiting reception of game name from connected child device. #define LMAN_STATE_START_SEARCH_PARENT 0x09 // rfu_REQ_startSearchParent #define LMAN_STATE_POLL_SEARCH_PARENT 0x0a // rfu_REQ_pollSearchParent #define LMAN_STATE_END_SEARCH_PARENT 0x0b // rfu_REQ_endSearchParent #define LMAN_STATE_START_CONNECT_PARENT 0x0c // rfu_REQ_startConnectParent #define LMAN_STATE_POLL_CONNECT_PARENT 0x0d // rfu_REQ_pollConnectParent #define LMAN_STATE_END_CONNECT_PARENT 0x0e // rfu_REQ_endConnectParent #define LMAN_STATE_SEND_CHILD_NAME 0x0f // Sending child game name. #define LMAN_STATE_START_LINK_RECOVERY 0x10 // rfu_REQ_CHILD_startConnectRecovery #define LMAN_STATE_POLL_LINK_RECOVERY 0x11 // rfu_REQ_CHILD_pollConnectRecovery #define LMAN_STATE_END_LINK_RECOVERY 0x12 // rfu_REQ_CHILD_endConnectRecovery #define LMAN_STATE_MS_CHANGE 0x13 // rfu_REQ_changeMasterSlave #define LMAN_STATE_WAIT_CLOCK_MASTER 0x14 // Waiting for AGB-RFU intercommunication clock to become AGB clock master. #define LMAN_STATE_STOP_MODE 0x15 // rfu_REQ_stopMode #define LMAN_STATE_BACK_STATE 0x16 // Following the completion of link-recovery processing, return the Link Manager state to the state present before link-recovery processing was initiated. #define LMAN_FORCED_STOP_AND_RFU_RESET 0x17 // Attempt to forcibly stop Link Manager using rfu_LMAN_stopLMAN(1). #define LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER 0x18 // Attempt to return to AGB clock master after child fails in sending game name. // Parameter group used in initial setting run of the link manager (rfu_LMAN_initializeRFU) typedef struct InitializeParametersTag { // rfu_REQ_configSystem argument u8 maxMFrame; // Maximum number of times to re-transmit of RFU level u8 MC_TimerCount; // MC_Timer count (x16.7ms) u16 availSlot_flag; // Use RFU-API constant "AVAIL_SLOT1-4" to specify the maximum number of child devices (1 - 4) that can be connected to a parent device. // rfu_REQB_configGameData argument u8 mboot_flag; // Multiplayer boot flag u16 serialNo; // Game serial number u8 *gameName; // Game name u8 *userName; // User name // ON/OFF flag for parent fast search operation by child. u8 fastSearchParent_flag; // Flag indicating whether parent fast search operation to be performed by child. // Link recovery settings u8 linkRecovery_enable; // Determines whether or not to execute the link recovery process when a link cut occurs u16 linkRecovery_period; // Time to spend on the link recovery process (x 16.7 ms) Note: Runs for unlimited time when specifying 0. // Setting for NI-type data transmit/receive period u16 NI_failCounter_limit; // Limit for failCounter during NI type data transmit/receive (x 16.7 ms) Note: Runs for unlimited time when specifying 0. }INIT_PARAM; // Timer that counts with the V-Blank cycle typedef struct VblankTimerTag { u8 active; // Timer ON/OFF (bits 0 - 3 indicate ON/OFF for each connected slot) u16 count_max; // Maximum count value (x16.7ms) u16 count[RFU_CHILD_MAX]; // Current count value (x 16.7 ms) for each connected slot }VBL_TIMER; typedef struct linkManagerTag { /* 0x000 */ u8 acceptSlot_flag; /* 0x001 */ u8 acceptCount; /* 0x002 */ vu8 childClockSlave_flag; /* 0x003 */ vu8 parentAck_flag; /* 0x004 */ u8 state; /* 0x005 */ u8 next_state; /* 0x006 */ u8 parent_child; /* 0x007 */ u8 pcswitch_flag; /* 0x008 */ u8 RFU_powerOn_flag; /* 0x009 */ u8 linkRecovery_enable; /* 0x00a */ u8 linkRecovery_start_flag; /* 0x00b */ u8 fastSearchParent_flag; /* 0x00c */ u8 connectSlot_flag_old; /* 0x00d */ u8 reserveDisconnectSlot_flag; /* 0x00e */ u8 active; /* 0x00f */ u8 msc_exe_flag; /* 0x010 */ u8 child_slot; /* 0x011 */ u8 state_bak[2]; /* 0x014 */ u16 param[2]; /* 0x018 */ u16 NI_failCounter_limit; /* 0x01a */ u16 connect_period; /* 0x01c */ u16 pcswitch_period_bak; /* 0x01e */ u16 work; /* 0x020 */ u16 *acceptable_serialNo_list; /* 0x024 */ VBL_TIMER nameAcceptTimer; /* 0x030 */ VBL_TIMER linkRecoveryTimer; /* 0x03c */ INIT_PARAM *init_param; /* 0x040 */ void (*LMAN_callback)(u8, u8); /* 0x044 */ void (*MSC_callback)(u16); } LINK_MANAGER; extern struct linkManagerTag lman; u32 rfu_LMAN_REQBN_softReset_and_checkID(void); void rfu_LMAN_requestChangeAgbClockMaster(void); void rfu_LMAN_initializeRFU(INIT_PARAM *init_params); u8 rfu_LMAN_establishConnection(u8 parent_child, u16 connect_period, u16 name_accept_period, u16 *acceptable_serialNo_list); void rfu_LMAN_stopManager(bool8 forced_stop_and_RFU_reset_flag); void rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16)); void rfu_LMAN_REQ_sendData(bool8 clockChangeFlag); void rfu_LMAN_powerDownRFU(void); u8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period); u8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period); void rfu_LMAN_manager_entity(u32 rand); void rfu_LMAN_syncVBlank(void); u8 rfu_LMAN_initializeManager(void (*LMAN_callback_p)(u8, u8), void (*MSC_callback_p)(u16)); void rfu_LMAN_forceChangeSP(void); #endif //GUARD_LINKMANAGER_H ================================================ FILE: include/bag.h ================================================ #ifndef GUARD_BAG_H #define GUARD_BAG_H #include "menu_helpers.h" void InitBagWindows(void); void BagPrintTextOnWindow(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx); void BagPrintTextOnWin1CenteredColor0(const u8 * str, u8 unused); void BagDrawDepositItemTextBox(void); u8 ShowBagWindow(u8 whichWindow, u8 nItems); void HideBagWindow(u8 whichWindow); u8 OpenBagWindow(u8 whichWindow); void CloseBagWindow(u8 whichWindow); u8 GetBagWindow(u8 whichWindow); void BagCreateYesNoMenuBottomRight(u8 taskId, const struct YesNoFuncTable * ptrs); void BagCreateYesNoMenuTopRight(u8 taskId, const struct YesNoFuncTable * ptrs); void BagPrintMoneyAmount(void); void BagDrawTextBoxOnWindow(u8 windowId); #endif //GUARD_BAG_H ================================================ FILE: include/battle.h ================================================ #ifndef GUARD_BATTLE_H #define GUARD_BATTLE_H #include #include "global.h" #include "constants/battle.h" #include "constants/battle_script_commands.h" #include "battle_util.h" #include "battle_script_commands.h" #include "battle_main.h" #include "battle_ai_switch_items.h" #include "battle_gfx_sfx_util.h" #include "battle_util2.h" #include "battle_bg.h" /* Banks are a name given to what could be called a 'battlerId' or 'monControllerId'. Each bank has a value consisting of two bits. 0x1 bit is responsible for the side, 0 = player's side, 1 = opponent's side. 0x2 bit is responsible for the id of sent out pokemon. 0 means it's the first sent out pokemon, 1 it's the second one. (Triple battle didn't exist at the time yet.) */ #define GET_BATTLER_POSITION(battler)((gBattlerPositions[battler])) #define GET_BATTLER_SIDE(battler)((GetBattlerPosition(battler) & BIT_SIDE)) #define GET_BATTLER_SIDE2(battler)((GET_BATTLER_POSITION(battler) & BIT_SIDE)) // Used to exclude moves learned temporarily by Transform or Mimic #define MOVE_IS_PERMANENT(battler, moveSlot) \ (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) \ && !(gDisableStructs[battler].mimickedMoves & gBitTable[moveSlot])) // Battle Actions // These determine what each battler will do in a turn #define B_ACTION_USE_MOVE 0 #define B_ACTION_USE_ITEM 1 #define B_ACTION_SWITCH 2 #define B_ACTION_RUN 3 #define B_ACTION_SAFARI_WATCH_CAREFULLY 4 #define B_ACTION_SAFARI_BALL 5 #define B_ACTION_SAFARI_BAIT 6 #define B_ACTION_SAFARI_GO_NEAR 7 #define B_ACTION_SAFARI_RUN 8 #define B_ACTION_OLDMAN_THROW 9 #define B_ACTION_EXEC_SCRIPT 10 #define B_ACTION_TRY_FINISH 11 #define B_ACTION_FINISHED 12 #define B_ACTION_CANCEL_PARTNER 12 // when choosing an action #define B_ACTION_NOTHING_FAINTED 13 // when choosing an action #define B_ACTION_NONE 0xFF #define MAX_TRAINER_ITEMS 4 enum { BATTLER_AFFINE_NORMAL, BATTLER_AFFINE_EMERGE, BATTLER_AFFINE_RETURN, }; #define MOVE_TARGET_SELECTED 0 #define MOVE_TARGET_DEPENDS (1 << 0) #define MOVE_TARGET_USER_OR_SELECTED (1 << 1) #define MOVE_TARGET_RANDOM (1 << 2) #define MOVE_TARGET_BOTH (1 << 3) #define MOVE_TARGET_USER (1 << 4) #define MOVE_TARGET_FOES_AND_ALLY (1 << 5) #define MOVE_TARGET_OPPONENTS_FIELD (1 << 6) // For the second argument of GetMoveTarget, when no target override is needed #define NO_TARGET_OVERRIDE 0 struct TrainerMonNoItemDefaultMoves { u16 iv; u8 lvl; u16 species; }; struct TrainerMonItemDefaultMoves { u16 iv; u8 lvl; u16 species; u16 heldItem; }; struct TrainerMonNoItemCustomMoves { u16 iv; u8 lvl; u16 species; u16 moves[MAX_MON_MOVES]; }; struct TrainerMonItemCustomMoves { u16 iv; u8 lvl; u16 species; u16 heldItem; u8 abilityNum; u16 moves[MAX_MON_MOVES]; }; struct TrainerMonItemCustomMovesEVs { u16 iv; u8 lvl; u8 evs[NUM_STATS]; u8 nature; u16 species; u16 heldItem; u8 abilityNum; u16 moves[MAX_MON_MOVES]; }; #define NO_ITEM_DEFAULT_MOVES(party) { .NoItemDefaultMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = 0 #define NO_ITEM_CUSTOM_MOVES(party) { .NoItemCustomMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET #define ITEM_DEFAULT_MOVES(party) { .ItemDefaultMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_HELD_ITEM #define ITEM_CUSTOM_MOVES(party) { .ItemCustomMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM #define CUSTOM_MOVES_EVS(party) { .ItemCustomMovesEVs = party}, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_EVS union TrainerMonPtr { const struct TrainerMonNoItemDefaultMoves *NoItemDefaultMoves; const struct TrainerMonNoItemCustomMoves *NoItemCustomMoves; const struct TrainerMonItemDefaultMoves *ItemDefaultMoves; const struct TrainerMonItemCustomMoves *ItemCustomMoves; const struct TrainerMonItemCustomMovesEVs *ItemCustomMovesEVs; }; struct Trainer { /*0x00*/ u8 partyFlags; /*0x01*/ u8 trainerClass; /*0x02*/ u8 encounterMusic_gender; // last bit is gender /*0x03*/ u8 trainerPic; /*0x04*/ u8 trainerName[12]; /*0x10*/ u16 items[MAX_TRAINER_ITEMS]; /*0x18*/ bool8 doubleBattle; /*0x1C*/ u32 aiFlags; /*0x20*/ u8 partySize; /*0x24*/ const union TrainerMonPtr party; }; extern const struct Trainer gTrainers[]; extern const struct Trainer gMasterTrainers[]; struct ResourceFlags { u32 flags[4]; }; #define RESOURCE_FLAG_FLASH_FIRE 1 struct DisableStruct { /*0x00*/ u32 transformedMonPersonality; /*0x04*/ u16 disabledMove; /*0x06*/ u16 encoredMove; /*0x08*/ u8 protectUses; /*0x09*/ u8 stockpileCounter; /*0x0A*/ u8 substituteHP; /*0x0B*/ u8 disableTimer : 4; /*0x0B*/ u8 disableTimerStartValue : 4; /*0x0C*/ u8 encoredMovePos; /*0x0D*/ u8 unkD; /*0x0E*/ u8 encoreTimer : 4; /*0x0E*/ u8 encoreTimerStartValue : 4; /*0x0F*/ u8 perishSongTimer : 4; /*0x0F*/ u8 perishSongTimerStartValue : 4; /*0x10*/ u8 furyCutterCounter; /*0x11*/ u8 rolloutTimer : 4; /*0x11*/ u8 rolloutTimerStartValue : 4; /*0x12*/ u8 chargeTimer : 4; /*0x12*/ u8 chargeTimerStartValue : 4; /*0x13*/ u8 tauntTimer:4; /*0x13*/ u8 tauntTimer2:4; /*0x14*/ u8 battlerPreventingEscape; /*0x15*/ u8 battlerWithSureHit; /*0x16*/ u8 isFirstTurn; /*0x17*/ u8 unk17; /*0x18*/ u8 truantCounter : 1; /*0x18*/ u8 truantSwitchInHack : 1; // Unused here, but used in pokeemerald /*0x18*/ u8 unk18_a_2 : 2; /*0x18*/ u8 mimickedMoves : 4; /*0x19*/ u8 rechargeTimer; /*0x1A*/ u8 unk1A[2]; }; extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT]; struct ProtectStruct { /* field_0 */ u32 protected:1; u32 endured:1; u32 noValidMoves:1; u32 helpingHand:1; u32 bounceMove:1; u32 stealMove:1; u32 flag0Unknown:1; u32 prlzImmobility:1; /* field_1 */ u32 confusionSelfDmg:1; u32 targetNotAffected:1; u32 chargingTurn:1; u32 fleeType:2; // for RunAway and Smoke Ball u32 usedImprisonedMove:1; u32 loveImmobility:1; u32 usedDisabledMove:1; /* field_2 */ u32 usedTauntedMove:1; // 0x1 u32 flag2Unknown:1; // 0x2 u32 flinchImmobility:1; // 0x4 u32 notFirstStrike:1; // 0x8 u32 flag_x10 : 1; // 0x10 u32 flag_x20 : 1; // 0x20 u32 flag_x40 : 1; // 0x40 u32 flag_x80 : 1; // 0x80 u32 field3 : 8; u32 physicalDmg; u32 specialDmg; u8 physicalBattlerId; u8 specialBattlerId; u16 fieldE; }; extern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT]; struct SpecialStatus { u8 statLowered:1; // 0x1 u8 lightningRodRedirected:1; // 0x2 u8 restoredBattlerSprite:1; // 0x4 u8 intimidatedMon:1; // 0x8 u8 traced:1; // 0x10 u8 ppNotAffectedByPressure:1; u8 faintedHasReplacement:1; u8 focusBanded:1; u8 field1[3]; s32 dmg; s32 physicalDmg; s32 specialDmg; u8 physicalBattlerId; u8 specialBattlerId; u8 field12; u8 field13; }; extern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT]; struct SideTimer { /*0x00*/ u8 reflectTimer; /*0x01*/ u8 reflectBattlerId; /*0x02*/ u8 lightscreenTimer; /*0x03*/ u8 lightscreenBattlerId; /*0x04*/ u8 mistTimer; /*0x05*/ u8 mistBattlerId; /*0x06*/ u8 safeguardTimer; /*0x07*/ u8 safeguardBattlerId; /*0x08*/ u8 followmeTimer; /*0x09*/ u8 followmeTarget; /*0x0A*/ u8 spikesAmount; /*0x0B*/ u8 fieldB; }; extern struct SideTimer gSideTimers[]; struct WishFutureKnock { u8 futureSightCounter[MAX_BATTLERS_COUNT]; u8 futureSightAttacker[MAX_BATTLERS_COUNT]; s32 futureSightDmg[MAX_BATTLERS_COUNT]; u16 futureSightMove[MAX_BATTLERS_COUNT]; u8 wishCounter[MAX_BATTLERS_COUNT]; u8 wishMonId[MAX_BATTLERS_COUNT]; u8 weatherDuration; u8 knockedOffMons[2]; }; extern struct WishFutureKnock gWishFutureKnock; struct AI_ThinkingStruct { u8 aiState; u8 movesetIndex; u16 moveConsidered; s8 score[4]; u32 funcResult; u32 aiFlags; u8 aiAction; u8 aiLogicId; u8 filler12[6]; u8 simulatedRNG[4]; }; extern u8 gActiveBattler; extern u8 gBattlerTarget; extern u8 gAbsentBattlerFlags; extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT]; struct UsedMoves { u16 moves[MAX_BATTLERS_COUNT]; u16 unknown[MAX_BATTLERS_COUNT]; }; struct BattleHistory { /*0x00*/ u16 usedMoves[2][8]; // 0xFFFF means move not used (confuse self hit, etc) /*0x20*/ u8 abilities[MAX_BATTLERS_COUNT / 2]; /*0x22*/ u8 itemEffects[MAX_BATTLERS_COUNT / 2]; /*0x24*/ u16 trainerItems[MAX_BATTLERS_COUNT]; /*0x2C*/ u8 itemsNo; }; struct BattleScriptsStack { const u8 *ptr[8]; u8 size; }; struct BattleCallbacksStack { void (*function[8])(void); u8 size; }; struct StatsArray { u16 stats[NUM_STATS]; }; struct BattleResources { struct SecretBaseRecord *secretBase; struct ResourceFlags *flags; struct BattleScriptsStack *battleScriptsStack; struct BattleCallbacksStack *battleCallbackStack; struct StatsArray *beforeLvlUp; struct AI_ThinkingStruct *ai; struct BattleHistory *battleHistory; struct BattleScriptsStack *AI_ScriptsStack; }; extern struct BattleResources *gBattleResources; struct BattleResults { u8 playerFaintCounter; // 0x0 u8 opponentFaintCounter; // 0x1 u8 playerSwitchesCounter; // 0x2 u8 numHealingItemsUsed; // 0x3 u8 numRevivesUsed; // 0x4 u8 playerMonWasDamaged:1; // 0x5 u8 usedMasterBall:1; // 0x5 u8 caughtMonBall:4; // 0x5 u8 shinyWildMon:1; // 0x5 u8 unk5_7:1; // 0x5 u16 playerMon1Species; // 0x6 u8 playerMon1Name[11]; // 0x8 u8 battleTurnCounter; // 0x13 u8 playerMon2Name[11]; // 0x14 u8 pokeblockThrows; // 0x1F u16 lastOpponentSpecies; // 0x20 u16 lastUsedMovePlayer; // 0x22 u16 lastUsedMoveOpponent; // 0x24 u16 playerMon2Species; // 0x26 u16 caughtMonSpecies; // 0x28 u8 caughtMonNick[10]; // 0x2A u8 filler34[2]; u8 catchAttempts[11]; // 0x36 }; extern struct BattleResults gBattleResults; struct LinkBattlerHeader { u8 versionSignatureLo; u8 versionSignatureHi; u8 vsScreenHealthFlagsLo; u8 vsScreenHealthFlagsHi; struct BattleEnigmaBerry battleEnigmaBerry; }; struct BattleStruct { u8 turnEffectsTracker; u8 turnEffectsBattlerId; u8 filler2; // unused u8 turnCountersTracker; u8 wrappedMove[MAX_BATTLERS_COUNT * 2]; // Leftover from Ruby's ewram access. u8 moveTarget[MAX_BATTLERS_COUNT]; u8 expGetterMonId; u8 field_11; // unused u8 wildVictorySong; u8 dynamicMoveType; u8 wrappedBy[MAX_BATTLERS_COUNT]; u16 assistPossibleMoves[PARTY_SIZE * MAX_MON_MOVES]; // 6 mons, each of them knowing 4 moves u8 focusPunchBattlerId; u8 battlerPreventingSwitchout; u8 moneyMultiplier; u8 savedTurnActionNumber; u8 switchInAbilitiesCounter; u8 faintedActionsState; u8 faintedActionsBattlerId; // balign 2 u16 expValue; u8 scriptPartyIdx; // for printing the nickname u8 sentInPokes; bool8 selectionScriptFinished[MAX_BATTLERS_COUNT]; u8 battlerPartyIndexes[MAX_BATTLERS_COUNT]; u8 monToSwitchIntoId[MAX_BATTLERS_COUNT]; u8 battlerPartyOrders[MAX_BATTLERS_COUNT][3]; u8 runTries; u8 caughtMonNick[POKEMON_NAME_LENGTH + 1]; u8 field_78; // unused u8 safariRockThrowCounter; u8 safariBaitThrowCounter; u8 safariEscapeFactor; u8 safariCatchFactor; u8 linkBattleVsSpriteId_V; u8 linkBattleVsSpriteId_S; u8 formToChangeInto; u8 chosenMovePositions[MAX_BATTLERS_COUNT]; u8 stateIdAfterSelScript[MAX_BATTLERS_COUNT]; u8 field_88; // unused u8 field_89; // unused u8 field_8A; // unused u8 playerPartyIdx; u8 field_8C; // unused u8 field_8D; // unused u8 stringMoveType; u8 expGetterBattlerId; u8 field_90; // unused u8 absentBattlerFlags; u8 AI_monToSwitchIntoId[2]; u8 simulatedInputState[4]; // used by Oak/Old Man/Pokedude controllers u8 lastTakenMove[MAX_BATTLERS_COUNT * 2 * 2]; // ask gamefreak why they declared it that way u16 hpOnSwitchout[2]; u8 abilityPreventingSwitchout; u8 hpScale; u16 savedBattleTypeFlags; void (*savedCallback)(void); u8 synchronizeMoveEffect; u8 multiplayerId; u8 overworldWeatherDone; u8 atkCancellerTracker; u16 usedHeldItems[MAX_BATTLERS_COUNT]; u8 chosenItem[4]; // why is this an u8? u8 AI_itemType[2]; u8 AI_itemFlags[2]; u16 choicedMove[MAX_BATTLERS_COUNT]; u16 changedItems[MAX_BATTLERS_COUNT]; u8 intimidateBattler; u8 switchInItemsCounter; u8 field_DA; // battle tower related u8 turnSideTracker; u8 fillerDC[0xDF-0xDC]; u8 givenExpMons; u8 lastTakenMoveFrom[MAX_BATTLERS_COUNT * MAX_BATTLERS_COUNT * 2]; u16 castformPalette[MAX_BATTLERS_COUNT][16]; u8 wishPerishSongState; u8 wishPerishSongBattlerId; u8 lastAttackerToFaintOpponent; // align 4 union { struct LinkBattlerHeader linkBattlerHeader; struct MultiBattlePokemonTx multiBattleMons[3]; } multiBuffer; u8 padding_1E4[0x1C]; }; // size == 0x200 bytes extern struct BattleStruct *gBattleStruct; #define F_DYNAMIC_TYPE_1 (1 << 6) #define F_DYNAMIC_TYPE_2 (1 << 7) #define DYNAMIC_TYPE_MASK (F_DYNAMIC_TYPE_1 - 1) #define GET_MOVE_TYPE(move, typeArg) \ { \ if (gBattleStruct->dynamicMoveType) \ typeArg = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; \ else \ typeArg = gBattleMoves[move].type; \ } #define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY) #define IS_TYPE_SPECIAL(moveType)(moveType > TYPE_MYSTERY) #define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0)) #define IS_BATTLER_OF_TYPE(battlerId, type)((gBattleMons[battlerId].type1 == type || gBattleMons[battlerId].type2 == type)) #define SET_BATTLER_TYPE(battlerId, type) \ { \ gBattleMons[battlerId].type1 = type; \ gBattleMons[battlerId].type2 = type; \ } #define GET_STAT_BUFF_ID(n)((n & 0xF)) // first four bits 0x1, 0x2, 0x4, 0x8 #define GET_STAT_BUFF_VALUE2(n)((n & 0xF0)) #define GET_STAT_BUFF_VALUE(n)(((n >> 4) & 7)) // 0x10, 0x20, 0x40 #define STAT_BUFF_NEGATIVE 0x80 // 0x80, the sign bit #define SET_STAT_BUFF_VALUE(n)(((s8)(((s8)(n) << 4)) & 0xF0)) #define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + (stage << 4) + (goesDown << 7)) // NOTE: The members of this struct have hard-coded offsets // in include/constants/battle_script_commands.h struct BattleScripting { s32 painSplitHp; s32 bideDmg; u8 multihitString[6]; u8 dmgMultiplier; u8 twoTurnsMoveStringId; u8 animArg1; u8 animArg2; u16 tripleKickPower; u8 moveendState; u8 battlerWithAbility; u8 multihitMoveEffect; u8 battler; u8 animTurn; u8 animTargetsHit; u8 statChanger; bool8 statAnimPlayed; u8 getexpState; u8 battleStyle; u8 drawlvlupboxState; u8 learnMoveState; u8 pursuitDoublesAttacker; u8 reshowMainState; u8 reshowHelperState; u8 levelUpHP; }; struct BattleSpriteInfo { /*0x0*/ u16 invisible : 1; // 0x1 u16 lowHpSong : 1; // 0x2 u16 behindSubstitute : 1; // 0x4 u16 flag_x8 : 1; // 0x8 u16 hpNumbersNoBars : 1; // 0x10 /*0x2*/ u16 transformSpecies; }; struct BattleAnimationInfo { u16 animArg; // to fill up later u8 field_2; u8 field_3; u8 field_4; u8 field_5; u8 field_6; u8 field_7; u8 ballThrowCaseId; u8 introAnimActive:1; u8 wildMonInvisible:1; u8 field_9_x1C:3; u8 field_9_x20:1; u8 field_9_x40:1; u8 field_9_x80:1; u8 numBallParticles; u8 field_B; s16 ballSubpx; u8 field_E; u8 field_F; }; struct BattleHealthboxInfo { u8 partyStatusSummaryShown : 1; // x1 u8 healthboxIsBouncing : 1; // x2 u8 battlerIsBouncing : 1; // x4 u8 ballAnimActive : 1; // 0x8 u8 statusAnimActive : 1; // x10 u8 animFromTableActive : 1; // x20 u8 specialAnimActive : 1; // x40 u8 triedShinyMonAnim : 1; // x80 u8 finishedShinyMonAnim : 1; // x1 u8 opponentDrawPartyStatusSummaryDelay : 5; // x2 u8 healthboxBounceSpriteId; u8 battlerBounceSpriteId; u8 animationState; u8 partyStatusDelayTimer; u8 matrixNum; u8 shadowSpriteId; u8 soundTimer; u8 introEndDelay; }; struct BattleBarInfo { u8 healthboxSpriteId; s32 maxValue; s32 oldValue; s32 receivedValue; // if positive/negative, fills the bar to the left/right respectively s32 currValue; }; struct BattleSpriteData { struct BattleSpriteInfo *battlerData; struct BattleHealthboxInfo *healthBoxesData; struct BattleAnimationInfo *animationData; struct BattleBarInfo *battleBars; }; extern struct BattleSpriteData *gBattleSpritesDataPtr; #define BATTLE_BUFFER_LINK_SIZE 0x1000 extern u8 *gLinkBattleSendBuffer; extern u8 *gLinkBattleRecvBuffer; // Move this somewhere else #include "sprite.h" struct MonSpritesGfx { void *firstDecompressed; // ptr to the decompressed sprite of the first pokemon void *sprites[MAX_BATTLERS_COUNT]; struct SpriteTemplate templates[MAX_BATTLERS_COUNT]; struct SpriteFrameImage images[MAX_BATTLERS_COUNT][4]; u8 field_F4[0x80]; // unused u8 *barFontGfx; void *field_178; // freed but never allocated u16 *multiUseBuffer; }; struct PokedudeBattlerState { u8 action_idx; u8 move_idx; u8 timer; u8 msg_idx; u8 saved_bg0y; }; extern u16 gBattle_BG0_X; extern u16 gBattle_BG0_Y; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG3_X; extern u16 gBattle_BG3_Y; extern u16 gBattle_WIN0H; extern u16 gBattle_WIN0V; extern u16 gBattle_WIN1H; extern u16 gBattle_WIN1V; extern struct BattleSpritesGfx *gMonSpritesGfx; extern u8 gBattleOutcome; extern u16 gLastUsedItem; extern u32 gBattleTypeFlags; extern struct MonSpritesGfx *gMonSpritesGfxPtr; extern u16 gTrainerBattleOpponent_A; extern u16 gMoveToLearn; extern u16 gBattleMovePower; extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT]; extern u16 gCurrentMove; extern u16 gChosenMove; extern u16 gCalledMove; extern u8 gCritMultiplier; extern u16 gBattleWeather; extern u8 gLastUsedAbility; extern u8 gBattlerInMenuId; extern u8 gPotentialItemEffectBattler; extern u8 gBattlersCount; extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT]; extern s32 gBattleMoveDamage; extern u16 gIntroSlideFlags; extern u32 gTransformedPersonalities[MAX_BATTLERS_COUNT]; extern u8 gBattlerPositions[MAX_BATTLERS_COUNT]; extern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT]; extern u8 gBattleOutcome; extern u8 gBattleMonForms[MAX_BATTLERS_COUNT]; extern void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void); extern u32 gBattleControllerExecFlags; extern u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200]; extern u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200]; extern u8 gActionSelectionCursor[MAX_BATTLERS_COUNT]; extern void (*gPreBattleCallback1)(void); extern bool8 gDoingBattleAnim; extern struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT]; extern u8 *gBattleAnimBgTileBuffer; extern u8 *gBattleAnimBgTilemapBuffer; extern void (*gBattleMainFunc)(void); extern u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT]; extern u32 gUnusedFirstBattleVar1; extern u8 gUnusedFirstBattleVar2; extern u8 gBattlerAttacker; extern u8 gEffectBattler; extern u8 gMultiHitCounter; extern struct BattleScripting gBattleScripting; extern u8 gBattlerFainted; extern u32 gStatuses3[MAX_BATTLERS_COUNT]; extern u8 gSentPokesToOpponent[2]; extern const u8 *gBattlescriptCurrInstr; extern const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT]; extern u16 gLastMoves[MAX_BATTLERS_COUNT]; extern u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT]; extern u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT]; extern u16 gSideStatuses[2]; extern u32 gHitMarker; extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT]; extern u8 gMoveResultFlags; extern s32 gTakenDmg[MAX_BATTLERS_COUNT]; extern u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT]; extern u8 gCurrentActionFuncId; extern u8 gCurrMovePos; extern u8 gChosenMovePos; extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT]; extern u16 gDynamicBasePower; extern u16 gLastLandedMoves[MAX_BATTLERS_COUNT]; extern u8 gLastHitBy[MAX_BATTLERS_COUNT]; extern u8 gMultiUsePlayerCursor; extern u8 gNumberOfMovesToChoose; extern u16 gLastHitByType[MAX_BATTLERS_COUNT]; extern s32 gHpDealt; extern u16 gPauseCounterBattle; extern u16 gPaydayMoney; extern u16 gLockedMoves[MAX_BATTLERS_COUNT]; extern u8 gCurrentTurnActionNumber; extern u16 gExpShareExp; extern u8 gLeveledUpInBattle; extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT]; extern u16 gLastPrintedMoves[MAX_BATTLERS_COUNT]; extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT]; extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT]; extern u8 gBattleTerrain; extern struct MultiBattlePokemonTx gMultiPartnerParty[3]; extern u16 gRandomTurnNumber; #endif // GUARD_BATTLE_H ================================================ FILE: include/battle_ai_script_commands.h ================================================ #ifndef GUARD_BATTLE_AI_SCRIPT_COMMANDS_H #define GUARD_BATTLE_AI_SCRIPT_COMMANDS_H #include "global.h" // return values for BattleAI_ChooseMoveOrAction // 0 - 3 are move idx #define AI_CHOICE_FLEE 4 #define AI_CHOICE_WATCH 5 void BattleAI_HandleItemUseBeforeAISetup(void); void BattleAI_SetupAIData(void); u8 BattleAI_ChooseMoveOrAction(void); void ClearBankMoveHistory(u8 bank); void RecordAbilityBattle(u8 bank, u8 abilityId); void ClearBankAbilityHistory(u8 bank); void RecordItemEffectBattle(u8 bank, u8 itemEffect); void ClearBankItemEffectHistory(u8 bank); u8 BattleAI_ChooseMoveOrAction(void); #endif // GUARD_BATTLE_AI_SCRIPT_COMMANDS_H ================================================ FILE: include/battle_ai_switch_items.h ================================================ #ifndef GUARD_BATTLE_AI_SWITCH_ITEMS_H #define GUARD_BATTLE_AI_SWITCH_ITEMS_H #include "global.h" enum { AI_ITEM_FULL_RESTORE = 1, AI_ITEM_HEAL_HP, AI_ITEM_CURE_CONDITION, AI_ITEM_X_STAT, AI_ITEM_GUARD_SPECS, AI_ITEM_NOT_RECOGNIZABLE }; enum { AI_HEAL_CONFUSION, AI_HEAL_PARALYSIS, AI_HEAL_FREEZE, AI_HEAL_BURN, AI_HEAL_POISON, AI_HEAL_SLEEP, }; void AI_TrySwitchOrUseItem(void); u8 GetMostSuitableMonToSwitchInto(void); #endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H ================================================ FILE: include/battle_anim.h ================================================ #ifndef GUARD_BATTLE_ANIM_H #define GUARD_BATTLE_ANIM_H #include "battle.h" #include "data.h" #include "task.h" #include "constants/battle_anim.h" enum { BG_ANIM_SCREEN_SIZE, BG_ANIM_AREA_OVERFLOW_MODE, BG_ANIM_MOSAIC, BG_ANIM_CHAR_BASE_BLOCK, BG_ANIM_PRIORITY, BG_ANIM_PALETTES_MODE, BG_ANIM_SCREEN_BASE_BLOCK }; enum { BATTLER_COORD_X, BATTLER_COORD_Y, BATTLER_COORD_X_2, BATTLER_COORD_Y_PIC_OFFSET, BATTLER_COORD_Y_PIC_OFFSET_DEFAULT, }; enum { BATTLER_COORD_ATTR_HEIGHT, BATTLER_COORD_ATTR_WIDTH, BATTLER_COORD_ATTR_TOP, BATTLER_COORD_ATTR_BOTTOM, BATTLER_COORD_ATTR_LEFT, BATTLER_COORD_ATTR_RIGHT, BATTLER_COORD_ATTR_RAW_BOTTOM, }; // battle_anim_status_effects.s #define STAT_ANIM_PLUS1 15 #define STAT_ANIM_PLUS2 39 #define STAT_ANIM_MINUS1 22 #define STAT_ANIM_MINUS2 46 #define STAT_ANIM_MULTIPLE_PLUS1 55 #define STAT_ANIM_MULTIPLE_PLUS2 56 #define STAT_ANIM_MULTIPLE_MINUS1 57 #define STAT_ANIM_MULTIPLE_MINUS2 58 struct BattleAnimBgData { u8 *bgTiles; u16 *bgTilemap; u8 paletteId; u8 bgId; u16 tilesOffset; u16 unused; }; struct BattleAnimBackground { const u32 *image; const u32 *palette; const u32 *tilemap; }; #define ANIM_ARGS_COUNT 8 // Linear Translation #define sTransl_Speed data[0] #define sTransl_Duration data[0] // for Fast #define sTransl_InitX data[1] #define sTransl_DestX data[2] #define sTransl_InitY data[3] #define sTransl_DestY data[4] #define sTransl_ArcAmpl data[5] extern void (*gAnimScriptCallback)(void); extern bool8 gAnimScriptActive; extern u8 gAnimVisualTaskCount; extern u8 gAnimSoundTaskCount; extern struct DisableStruct *gAnimDisableStructPtr; extern u16 gAnimMovePower; extern u8 gAnimFriendship; extern u16 gWeatherMoveAnim; extern s16 gBattleAnimArgs[ANIM_ARGS_COUNT]; extern u8 gAnimMoveTurn; extern u8 gBattleAnimAttacker; extern u8 gBattleAnimTarget; extern u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT]; extern s32 gAnimMoveDmg; extern u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT]; extern u8 gAnimCustomPanning; extern const struct OamData gOamData_AffineOff_ObjNormal_8x8; extern const struct OamData gOamData_AffineOff_ObjNormal_16x16; extern const struct OamData gOamData_AffineOff_ObjNormal_32x32; extern const struct OamData gOamData_AffineOff_ObjNormal_64x64; extern const struct OamData gOamData_AffineOff_ObjNormal_16x8; extern const struct OamData gOamData_AffineOff_ObjNormal_32x8; extern const struct OamData gOamData_AffineOff_ObjNormal_32x16; extern const struct OamData gOamData_AffineOff_ObjNormal_64x32; extern const struct OamData gOamData_AffineOff_ObjNormal_8x16; extern const struct OamData gOamData_AffineOff_ObjNormal_8x32; extern const struct OamData gOamData_AffineOff_ObjNormal_16x32; extern const struct OamData gOamData_AffineOff_ObjNormal_32x64; extern const struct OamData gOamData_AffineNormal_ObjNormal_8x8; extern const struct OamData gOamData_AffineNormal_ObjNormal_16x16; extern const struct OamData gOamData_AffineNormal_ObjNormal_32x32; extern const struct OamData gOamData_AffineNormal_ObjNormal_64x64; extern const struct OamData gOamData_AffineNormal_ObjNormal_16x8; extern const struct OamData gOamData_AffineNormal_ObjNormal_32x8; extern const struct OamData gOamData_AffineNormal_ObjNormal_32x16; extern const struct OamData gOamData_AffineNormal_ObjNormal_64x32; extern const struct OamData gOamData_AffineNormal_ObjNormal_8x16; extern const struct OamData gOamData_AffineNormal_ObjNormal_8x32; extern const struct OamData gOamData_AffineNormal_ObjNormal_16x32; extern const struct OamData gOamData_AffineNormal_ObjNormal_32x64; extern const struct OamData gOamData_AffineDouble_ObjNormal_8x8; extern const struct OamData gOamData_AffineDouble_ObjNormal_16x16; extern const struct OamData gOamData_AffineDouble_ObjNormal_32x32; extern const struct OamData gOamData_AffineDouble_ObjNormal_64x64; extern const struct OamData gOamData_AffineDouble_ObjNormal_16x8; extern const struct OamData gOamData_AffineDouble_ObjNormal_32x8; extern const struct OamData gOamData_AffineDouble_ObjNormal_32x16; extern const struct OamData gOamData_AffineDouble_ObjNormal_64x32; extern const struct OamData gOamData_AffineDouble_ObjNormal_8x16; extern const struct OamData gOamData_AffineDouble_ObjNormal_8x32; extern const struct OamData gOamData_AffineDouble_ObjNormal_16x32; extern const struct OamData gOamData_AffineDouble_ObjNormal_32x64; extern const struct OamData gOamData_AffineOff_ObjBlend_8x8; extern const struct OamData gOamData_AffineOff_ObjBlend_16x16; extern const struct OamData gOamData_AffineOff_ObjBlend_32x32; extern const struct OamData gOamData_AffineOff_ObjBlend_64x64; extern const struct OamData gOamData_AffineOff_ObjBlend_16x8; extern const struct OamData gOamData_AffineOff_ObjBlend_32x8; extern const struct OamData gOamData_AffineOff_ObjBlend_32x16; extern const struct OamData gOamData_AffineOff_ObjBlend_64x32; extern const struct OamData gOamData_AffineOff_ObjBlend_8x16; extern const struct OamData gOamData_AffineOff_ObjBlend_8x32; extern const struct OamData gOamData_AffineOff_ObjBlend_16x32; extern const struct OamData gOamData_AffineOff_ObjBlend_32x64; extern const struct OamData gOamData_AffineNormal_ObjBlend_8x8; extern const struct OamData gOamData_AffineNormal_ObjBlend_16x16; extern const struct OamData gOamData_AffineNormal_ObjBlend_32x32; extern const struct OamData gOamData_AffineNormal_ObjBlend_64x64; extern const struct OamData gOamData_AffineNormal_ObjBlend_16x8; extern const struct OamData gOamData_AffineNormal_ObjBlend_32x8; extern const struct OamData gOamData_AffineNormal_ObjBlend_32x16; extern const struct OamData gOamData_AffineNormal_ObjBlend_64x32; extern const struct OamData gOamData_AffineNormal_ObjBlend_8x16; extern const struct OamData gOamData_AffineNormal_ObjBlend_8x32; extern const struct OamData gOamData_AffineNormal_ObjBlend_16x32; extern const struct OamData gOamData_AffineNormal_ObjBlend_32x64; extern const struct OamData gOamData_AffineDouble_ObjBlend_8x8; extern const struct OamData gOamData_AffineDouble_ObjBlend_16x16; extern const struct OamData gOamData_AffineDouble_ObjBlend_32x32; extern const struct OamData gOamData_AffineDouble_ObjBlend_64x64; extern const struct OamData gOamData_AffineDouble_ObjBlend_16x8; extern const struct OamData gOamData_AffineDouble_ObjBlend_32x8; extern const struct OamData gOamData_AffineDouble_ObjBlend_32x16; extern const struct OamData gOamData_AffineDouble_ObjBlend_64x32; extern const struct OamData gOamData_AffineDouble_ObjBlend_8x16; extern const struct OamData gOamData_AffineDouble_ObjBlend_8x32; extern const struct OamData gOamData_AffineDouble_ObjBlend_16x32; extern const struct OamData gOamData_AffineDouble_ObjBlend_32x64; extern const struct MonCoords gCastformFrontSpriteCoords[]; extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; extern const struct SpriteTemplate gFlashingHitSplatSpriteTemplate; extern const struct SpriteTemplate gBasicHitSplatSpriteTemplate; extern const struct SpriteTemplate gWaterHitSplatSpriteTemplate; extern const struct SpriteTemplate gWishStarSpriteTemplate; extern const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate; extern const struct SpriteTemplate gThoughtBubbleSpriteTemplate; extern const union AffineAnimCmd *const gAffineAnims_Bite[]; extern const union AffineAnimCmd *const gAffineAnims_Droplet[]; extern const union AffineAnimCmd *const gGrowingRingAffineAnimTable[]; extern const union AnimCmd *const gAnims_SmallBubblePair[]; extern const union AnimCmd *const gAnims_BasicFire[]; extern const union AnimCmd *const gAnims_WaterMudOrb[]; extern const union AnimCmd *const gAnims_WaterBubble[]; extern const union AnimCmd *const gMusicNotesAnimTable[]; extern const u8 *const gBattleAnims_StatusConditions[]; extern const u8 *const gBattleAnims_Moves[]; extern const u16 gMovesWithQuietBGM[]; void MoveBattlerSpriteToBG(u8 battlerId, u8); void ResetBattleAnimBg(u8); void ClearBattleAnimationVars(void); void DoMoveAnim(u16 move); void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim); void DestroyAnimSprite(struct Sprite *sprite); void DestroyAnimVisualTask(u8 taskId); void DestroyAnimSoundTask(u8 taskId); bool8 IsContest(void); s8 BattleAnimAdjustPanning(s8 pan); s8 BattleAnimAdjustPanning2(s8 pan); s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan); bool8 IsBattlerSpriteVisible(u8 battlerId); s16 KeepPanInRange(s16 a, s32 oldPan); void RelocateBattleBgPal(u16 paletteNum, u16 *dest, s32 offset, u8 largeScreen); void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value); s32 GetAnimBgAttribute(u8 bgId, u8 attributeId); void HandleIntroSlide(u8 terrain); void BattleIntroSlideEnd(u8 taskId); void CopyBattlerSpriteToBg(s32 bgId, u8 x, u8 y, u8 battlerPosition, u8 palno, u8 *tilesDest, u16 *tilemapDest, u16 tilesOffset); void SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite); void TryShinyAnimation(u8 battler, struct Pokemon *mon); u8 ItemIdToBallId(u16 itemId); u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId); u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 arg2, u8 ballId); void DoLoadHealthboxPalsForLevelUp(u8 *, u8 *, u8 battlerId); void DoFreeHealthboxPalsForLevelUp(u8 batterId); void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId); u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType); u8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType); u8 GetBattlerSpriteDefault_Y(u8 battlerId); u8 GetSubstituteSpriteDefault_Y(u8 battlerId); u8 GetGhostSpriteDefault_Y(u8 battlerId); u8 GetBattlerYCoordWithElevation(u8 battlerId); u8 GetAnimBattlerSpriteId(u8 animBattler); void StoreSpriteCallbackInData6(struct Sprite *sprite, SpriteCallback callback); void TranslateSpriteInCircle(struct Sprite *sprite); void TranslateSpriteInGrowingCircle(struct Sprite *sprite); void TranslateSpriteInEllipse(struct Sprite *sprite); void WaitAnimForDuration(struct Sprite *sprite); void ConvertPosDataToTranslateLinearData(struct Sprite *sprite); void TranslateSpriteLinear(struct Sprite *sprite); void TranslateSpriteLinearFixedPoint(struct Sprite *sprite); void TranslateSpriteLinearById(struct Sprite *sprite); void TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite); void TranslateSpriteLinearAndFlicker(struct Sprite *sprite); void DestroySpriteAndMatrix(struct Sprite *sprite); void RunStoredCallbackWhenAffineAnimEnds(struct Sprite *sprite); void RunStoredCallbackWhenAnimEnds(struct Sprite *sprite); void DestroyAnimSpriteAndDisableBlend(struct Sprite *sprite); void DestroyAnimVisualTaskAndDisableBlend(u8 taskId); void SetSpriteCoordsToAnimAttackerCoords(struct Sprite *sprite); void SetAnimSpriteInitialXOffset(struct Sprite *sprite, s16 xOffset); void InitAnimArcTranslation(struct Sprite *sprite); bool8 TranslateAnimHorizontalArc(struct Sprite *sprite); bool8 TranslateAnimVerticalArc(struct Sprite *sprite); void SetSpritePrimaryCoordsFromSecondaryCoords(struct Sprite *sprite); void InitSpritePosToAnimTarget(struct Sprite *sprite, bool8 respectMonPicOffsets); void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets); u8 GetBattlerSide(u8 battlerId); u8 GetBattlerPosition(u8 battlerId); u8 GetBattlerAtPosition(u8 position); bool8 IsBattlerSpritePresent(u8 battlerId); bool8 IsDoubleBattle(void); void GetBattleAnimBg1Data(struct BattleAnimBgData *animBgData); void GetBattleAnimBgData(struct BattleAnimBgData *animBgData, u32 bgId); void GetBattleAnimBgDataByPriorityRank(struct BattleAnimBgData *animBgData, u8 unused); void InitBattleAnimBg(u32 bgId); void AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset); void InitAnimBgTilemapBuffer(u32 bgId, const void *src); void AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src); u8 GetBattleBgPaletteNum(void); void ToggleBg3Mode(bool8 arg0); void Trade_MoveSelectedMonToTarget(struct Sprite *sprite); void InitSpriteDataForLinearTranslation(struct Sprite *sprite); void InitAnimLinearTranslation(struct Sprite *sprite); void StartAnimLinearTranslation(struct Sprite *sprite); void PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite); bool8 AnimTranslateLinear(struct Sprite *sprite); void AnimTranslateLinear_WithFollowup(struct Sprite *sprite); void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite); void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite); void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite); bool8 AnimFastTranslateLinear(struct Sprite *sprite); void InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite); void InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite); void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation); void PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode); void ResetSpriteRotScale(u8 spriteId); void SetBattlerSpriteYOffsetFromRotation(u8 spriteId); void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 xScale, s16 yScale, u16 rotation); void TryResetSpriteAffineState(struct Sprite *sprite); u16 ArcTan2Neg(s16 a, s16 b); void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor); u32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 a6, bool8 a7); u32 GetBattleMonSpritePalettesMask(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight); u8 GetSpritePalIdxByBattler(u8 a1); void AnimSpriteOnMonPos(struct Sprite *sprite); void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite); void AnimThrowProjectile(struct Sprite *sprite); void AnimTravelDiagonally(struct Sprite *sprite); s16 CloneBattlerSpriteWithBlend(u8 animBattler); void DestroySpriteWithActiveSheet(struct Sprite *sprite); void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds); bool8 RunAffineAnimFromTaskData(struct Task *task); void SetBattlerSpriteYOffsetFromYScale(u8 spriteId); void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId); void StorePointerInVars(s16 *lo, s16 *hi, const void *ptr); void *LoadPointerFromVars(s16 lo, s16 hi); void BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScale0, s16 yScale0, s16 xScale1, s16 yScale1, u16 duration); u8 BattleAnimHelper_RunSpriteSquash(struct Task *task); void InitPrioritiesForVisibleBattlers(void); u8 GetBattlerSpriteSubpriority(u8 battlerId); u8 GetBattlerSpriteBGPriority(u8 battlerId); u8 GetBattlerSpriteBGPriorityRank(u8 battlerId); u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templateId, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, u32 ignoreDeoxys); void DestroySpriteAndFreeResources_(struct Sprite *sprite); s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr); void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y); u8 CreateInvisibleSpriteCopy(s32 battlerId, u8 spriteId, s32 species); void AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite); void AnimTranslateLinearAndFlicker(struct Sprite *sprite); void AnimSpinningSparkle(struct Sprite *sprite); void AnimWeatherBallUp(struct Sprite *sprite); void AnimWeatherBallDown(struct Sprite *sprite); void AnimParticleBurst(struct Sprite *); void AnimMoveTwisterParticle(struct Sprite *); u32 UnpackSelectedBattlePalettes(s16 selector); void AnimTask_HorizontalShake(u8 taskId); void DestroyAnimSpriteAfterTimer(struct Sprite *sprite); void AnimWaterPulseRing(struct Sprite *sprite); u8 SmokescreenImpact(s16 x, s16 y, u8 a3); void InitStatsChangeAnimation(u8 taskId); void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *gfx, const u32 *tilemap, const u32 *palette); #endif // GUARD_BATTLE_ANIM_H ================================================ FILE: include/battle_bg.h ================================================ #ifndef GUARD_BATTLE_BG_H #define GUARD_BATTLE_BG_H #include "bg.h" extern const struct BgTemplate gBattleBgTemplates[]; void InitBattleBgsVideo(void); void DrawBattleEntryBackground(void); void InitLinkBattleVsScreen(u8 taskId); void LoadBattleMenuWindowGfx(void); void LoadBattleTextboxAndBackground(void); void BattleInitBgsAndWindows(void); void DrawMainBattleBackground(void); #endif // GUARD_BATTLE_BG_H ================================================ FILE: include/battle_controllers.h ================================================ #ifndef GUARD_BATTLE_CONTROLLERS_H #define GUARD_BATTLE_CONTROLLERS_H #include "global.h" #include "battle.h" enum { REQUEST_ALL_BATTLE, REQUEST_SPECIES_BATTLE, REQUEST_HELDITEM_BATTLE, REQUEST_MOVES_PP_BATTLE, REQUEST_MOVE1_BATTLE, REQUEST_MOVE2_BATTLE, REQUEST_MOVE3_BATTLE, REQUEST_MOVE4_BATTLE, REQUEST_PP_DATA_BATTLE, REQUEST_PPMOVE1_BATTLE, REQUEST_PPMOVE2_BATTLE, REQUEST_PPMOVE3_BATTLE, REQUEST_PPMOVE4_BATTLE, REQUEST_UNUSED_13_BATTLE, REQUEST_UNUSED_14_BATTLE, REQUEST_UNUSED_15_BATTLE, REQUEST_UNUSED_16_BATTLE, REQUEST_OTID_BATTLE, REQUEST_EXP_BATTLE, REQUEST_HP_EV_BATTLE, REQUEST_ATK_EV_BATTLE, REQUEST_DEF_EV_BATTLE, REQUEST_SPEED_EV_BATTLE, REQUEST_SPATK_EV_BATTLE, REQUEST_SPDEF_EV_BATTLE, REQUEST_FRIENDSHIP_BATTLE, REQUEST_POKERUS_BATTLE, REQUEST_MET_LOCATION_BATTLE, REQUEST_MET_LEVEL_BATTLE, REQUEST_MET_GAME_BATTLE, REQUEST_POKEBALL_BATTLE, REQUEST_ALL_IVS_BATTLE, REQUEST_HP_IV_BATTLE, REQUEST_ATK_IV_BATTLE, REQUEST_DEF_IV_BATTLE, REQUEST_SPEED_IV_BATTLE, REQUEST_SPATK_IV_BATTLE, REQUEST_SPDEF_IV_BATTLE, REQUEST_PERSONALITY_BATTLE, REQUEST_CHECKSUM_BATTLE, REQUEST_STATUS_BATTLE, REQUEST_LEVEL_BATTLE, REQUEST_HP_BATTLE, REQUEST_MAX_HP_BATTLE, REQUEST_ATK_BATTLE, REQUEST_DEF_BATTLE, REQUEST_SPEED_BATTLE, REQUEST_SPATK_BATTLE, REQUEST_SPDEF_BATTLE, REQUEST_COOL_BATTLE, REQUEST_BEAUTY_BATTLE, REQUEST_CUTE_BATTLE, REQUEST_SMART_BATTLE, REQUEST_TOUGH_BATTLE, REQUEST_SHEEN_BATTLE, REQUEST_COOL_RIBBON_BATTLE, REQUEST_BEAUTY_RIBBON_BATTLE, REQUEST_CUTE_RIBBON_BATTLE, REQUEST_SMART_RIBBON_BATTLE, REQUEST_TOUGH_RIBBON_BATTLE, }; // Special arguments for Battle Controller functions. enum { // Values given to the emit functions to choose gBattleBufferA or gBattleBufferB BUFFER_A, BUFFER_B }; enum { RESET_ACTION_MOVE_SELECTION, RESET_ACTION_SELECTION, RESET_MOVE_SELECTION, }; enum { BALL_NO_SHAKES, BALL_1_SHAKE, BALL_2_SHAKES, BALL_3_SHAKES_FAIL, BALL_3_SHAKES_SUCCESS, BALL_TRAINER_BLOCK, BALL_GHOST_DODGE, }; enum { LINK_STANDBY_MSG_STOP_BOUNCE, LINK_STANDBY_STOP_BOUNCE_ONLY, LINK_STANDBY_MSG_ONLY, }; #define RET_VALUE_LEVELLED_UP 11 #define INSTANT_HP_BAR_DROP 0x7FFF #define PARTY_SUMM_SKIP_DRAW_DELAY (1 << 7) // Special return values in gBattleBufferB from Battle Controller functions. #define RET_VALUE_LEVELED_UP 11 struct UnusedControllerStruct { u8 unk:7; u8 flag:1; }; struct HpAndStatus { u16 hp; u32 status; }; struct MovePpInfo { u16 moves[MAX_MON_MOVES]; u8 pp[MAX_MON_MOVES]; u8 ppBonuses; }; struct ChooseMoveStruct { u16 moves[MAX_MON_MOVES]; u8 currentPp[MAX_MON_MOVES]; u8 maxPp[MAX_MON_MOVES]; u16 species; u8 monType1; u8 monType2; }; enum { CONTROLLER_GETMONDATA, CONTROLLER_GETRAWMONDATA, CONTROLLER_SETMONDATA, CONTROLLER_SETRAWMONDATA, CONTROLLER_LOADMONSPRITE, CONTROLLER_SWITCHINANIM, CONTROLLER_RETURNMONTOBALL, CONTROLLER_DRAWTRAINERPIC, CONTROLLER_TRAINERSLIDE, CONTROLLER_TRAINERSLIDEBACK, CONTROLLER_FAINTANIMATION, CONTROLLER_PALETTEFADE, CONTROLLER_SUCCESSBALLTHROWANIM, CONTROLLER_BALLTHROWANIM, CONTROLLER_PAUSE, CONTROLLER_MOVEANIMATION, CONTROLLER_PRINTSTRING, CONTROLLER_PRINTSTRINGPLAYERONLY, CONTROLLER_CHOOSEACTION, CONTROLLER_UNKNOWNYESNOBOX, CONTROLLER_CHOOSEMOVE, CONTROLLER_OPENBAG, CONTROLLER_CHOOSEPOKEMON, CONTROLLER_23, CONTROLLER_HEALTHBARUPDATE, CONTROLLER_EXPUPDATE, CONTROLLER_STATUSICONUPDATE, CONTROLLER_STATUSANIMATION, CONTROLLER_STATUSXOR, CONTROLLER_DATATRANSFER, CONTROLLER_DMA3TRANSFER, CONTROLLER_PLAYBGM, CONTROLLER_32, CONTROLLER_TWORETURNVALUES, CONTROLLER_CHOSENMONRETURNVALUE, CONTROLLER_ONERETURNVALUE, CONTROLLER_ONERETURNVALUE_DUPLICATE, CONTROLLER_CLEARUNKVAR, CONTROLLER_SETUNKVAR, CONTROLLER_CLEARUNKFLAG, CONTROLLER_TOGGLEUNKFLAG, CONTROLLER_HITANIMATION, CONTROLLER_CANTSWITCH, CONTROLLER_PLAYSE, CONTROLLER_PLAYFANFARE, CONTROLLER_FAINTINGCRY, CONTROLLER_INTROSLIDE, CONTROLLER_INTROTRAINERBALLTHROW, CONTROLLER_DRAWPARTYSTATUSSUMMARY, CONTROLLER_HIDEPARTYSTATUSSUMMARY, CONTROLLER_ENDBOUNCE, CONTROLLER_SPRITEINVISIBILITY, CONTROLLER_BATTLEANIMATION, CONTROLLER_LINKSTANDBYMSG, CONTROLLER_RESETACTIONMOVESELECTION, CONTROLLER_ENDLINKBATTLE, /*new controllers should go here*/ CONTROLLER_TERMINATOR_NOP, CONTROLLER_CMDS_COUNT }; extern struct UnusedControllerStruct gUnusedControllerStruct; // general functions void HandleLinkBattleSetup(void); void SetUpBattleVars(void); void InitBattleControllers(void); void TryReceiveLinkBattleData(void); void PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data); // emitters void BtlController_EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck); void BtlController_EmitSetMonData(u8 bufferId, u8 requestId, u8 monToCheck, u8 bytes, void *data); void BtlController_EmitLoadMonSprite(u8 bufferId); void BtlController_EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit); void BtlController_EmitReturnMonToBall(u8 bufferId, bool8 skipAnim); void BtlController_EmitDrawTrainerPic(u8 bufferId); void BtlController_EmitTrainerSlide(u8 bufferId); void BtlController_EmitTrainerSlideBack(u8 bufferId); void BtlController_EmitFaintAnimation(u8 bufferId); void BtlController_EmitBallThrowAnim(u8 bufferId, u8 caseId); void BtlController_EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr); void BtlController_EmitPrintString(u8 bufferId, u16 stringId); void BtlController_EmitPrintSelectionString(u8 bufferId, u16 stringId); void BtlController_EmitChooseAction(u8 bufferId, u8 action, u16 itemId); void BtlController_EmitChooseMove(u8 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData); void BtlController_EmitChooseItem(u8 bufferId, u8 *arg1); void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 abilityId, u8 *arg4); void BtlController_EmitHealthBarUpdate(u8 bufferId, u16 hpValue); void BtlController_EmitExpUpdate(u8 bufferId, u8 partyId, u16 expPoints); void BtlController_EmitStatusIconUpdate(u8 bufferId, u32 status1, u32 status2); void BtlController_EmitStatusAnimation(u8 bufferId, bool8 status2, u32 status); void BtlController_EmitDataTransfer(u8 bufferId, u16 size, void *data); void BtlController_EmitTwoReturnValues(u8 bufferId, u8 arg1, u16 arg2); void BtlController_EmitChosenMonReturnValue(u8 bufferId, u8 b, u8 *c); void BtlController_EmitOneReturnValue(u8 bufferId, u16 arg1); void BtlController_EmitOneReturnValue_Duplicate(u8 bufferId, u16 b); void BtlController_EmitHitAnimation(u8 bufferId); void BtlController_EmitCantSwitch(u8 bufferId); void BtlController_EmitPlaySE(u8 bufferId, u16 songId); void BtlController_EmitPlayFanfare(u8 bufferId, u16 songId); void BtlController_EmitFaintingCry(u8 bufferId); void BtlController_EmitIntroSlide(u8 bufferId, u8 terrainId); void BtlController_EmitIntroTrainerBallThrow(u8 bufferId); void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus *hpAndStatus, u8 param); void BtlController_EmitHidePartyStatusSummary(u8 bufferId); void BtlController_EmitEndBounceEffect(u8 bufferId); void BtlController_EmitSpriteInvisibility(u8 bufferId, bool8 isInvisible); void BtlController_EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument); void BtlController_EmitLinkStandbyMsg(u8 bufferId, u8 mode); void BtlController_EmitResetActionMoveSelection(u8 bufferId, u8 caseId); void BtlController_EmitEndLinkBattle(u8 bufferId, u8 battleOutcome); // player controller void BattleControllerDummy(void); void SetControllerToPlayer(void); void PlayerHandleGetRawMonData(void); void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite); void SetCB2ToReshowScreenAfterMenu(void); void SetCB2ToReshowScreenAfterMenu2(void); void Task_PlayerController_RestoreBgmAfterCry(u8 taskId); void ActionSelectionCreateCursorAt(u8 cursorPos, u8 unused); void ActionSelectionDestroyCursorAt(u8 cursorPos); void InitMoveSelectionsVarsAndStrings(void); void SetBattleEndCallbacks(void); void MoveSelectionCreateCursorAt(u8 cursorPos, u8 arg1); void MoveSelectionDestroyCursorAt(u8 cursorPos); void HandleInputChooseMove(void); // opponent controller void SetControllerToOpponent(void); void OpponentBufferExecCompleted(void); // safari controller void SetControllerToSafari(void); // pokedude controller void SetControllerToPokedude(void); void InitPokedudePartyAndOpponent(void); // oak and old man controller void SetControllerToOakOrOldMan(void); // These flags are set to signal that the indicated message // was already emitted // Inflicting damage is key #define FIRST_BATTLE_MSG_FLAG_INFLICT_DMG 0x1 // Lowering stats is advantageous #define FIRST_BATTLE_MSG_FLAG_STAT_CHG 0x2 // Keep an eye on your HP #define FIRST_BATTLE_MSG_FLAG_HP_RESTORE 0x4 // #define FIRST_BATTLE_MSG_FLAG_PARTY_MENU 0x8 bool8 BtlCtrl_OakOldMan_TestState2Flag(u8 mask); void BtlCtrl_OakOldMan_SetState2Flag(u8 mask); void PrintOakText_InflictingDamageIsKey(void); void PrintOakText_HowDisappointing(void); void PrintOakText_OakNoRunningFromATrainer(void); void OakOldManHandleInputChooseMove(void); void BtlCtrl_DrawVoiceoverMessageFrame(void); void BtlCtrl_RemoveVoiceoverMessageFrame(void); // link opponent controller void SetControllerToLinkOpponent(void); // link partner controller void SetControllerToLinkPartner(void); #endif // GUARD_BATTLE_CONTROLLERS_H ================================================ FILE: include/battle_gfx_sfx_util.h ================================================ #ifndef GUARD_BATTLE_GFX_SFX_UTIL_H #define GUARD_BATTLE_GFX_SFX_UTIL_H void AllocateBattleSpritesData(void); void FreeBattleSpritesData(void); void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite); void SpriteCB_TrainerSlideIn(struct Sprite *sprite); void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status); bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId, u16 argument); void InitAndLaunchSpecialAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId); bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn); bool8 IsBattleSEPlaying(u8 battlerId); void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId); void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId); void DecompressGhostFrontPic(struct Pokemon *unused, u8 battlerId); void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId); void DecompressTrainerBackPalette(u16 a1, u8 a2); void BattleGfxSfxDummy3(u8 gender); void FreeTrainerFrontPicPaletteAndTile(u16 frontPicId); bool8 BattleLoadAllHealthBoxesGfx(u8 state); void LoadBattleBarGfx(u8 arg0); bool8 BattleInitAllSprites(u8 *state, u8 *battlerId); void ClearSpritesHealthboxAnimData(void); void CopyAllBattleSpritesInvisibilities(void); void CopyBattleSpriteInvisibility(u8 battlerId); void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 transformType); void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite); void LoadBattleMonGfxAndAnimate(u8 battlerId, bool8 loadMonSprite, u8 spriteId); void TrySetBehindSubstituteSpriteBit(u8 battlerId, u16 move); void ClearBehindSubstituteBit(u8 battlerId); void HandleLowHpMusicChange(struct Pokemon *mon, u8 battlerId); void BattleStopLowHpSound(void); void HandleBattleLowHpMusicChange(void); void SetBattlerSpriteAffineMode(u8 affineMode); void LoadAndCreateEnemyShadowSprites(void); void SpriteCB_SetInvisible(struct Sprite *sprite); void SetBattlerShadowSpriteCallback(u8 battlerId, u16 species); void HideBattlerShadowSprite(u8 battlerId); void BattleInterfaceSetWindowPals(void); void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute); void AllocateMonSpritesGfx(void); void FreeMonSpritesGfx(void); bool32 ShouldPlayNormalMonCry(struct Pokemon *mon); #endif // GUARD_BATTLE_GFX_SFX_UTIL_H ================================================ FILE: include/battle_interface.h ================================================ #ifndef GUARD_BATTLE_INTERFACE_H #define GUARD_BATTLE_INTERFACE_H #include "global.h" #include "battle_controllers.h" enum { HP_CURRENT, HP_MAX }; enum { HEALTH_BAR, EXP_BAR }; enum { HP_BAR_EMPTY, HP_BAR_RED, HP_BAR_YELLOW, HP_BAR_GREEN, HP_BAR_FULL, }; #define TAG_HEALTHBOX_PLAYER1_TILE 55039 #define TAG_HEALTHBOX_PLAYER2_TILE 55040 #define TAG_HEALTHBOX_OPPONENT1_TILE 55041 #define TAG_HEALTHBOX_OPPONENT2_TILE 55042 #define TAG_HEALTHBAR_PLAYER1_TILE 55044 #define TAG_HEALTHBAR_OPPONENT1_TILE 55045 #define TAG_HEALTHBAR_PLAYER2_TILE 55046 #define TAG_HEALTHBAR_OPPONENT2_TILE 55047 #define TAG_HEALTHBOX_PALS_1 55049 #define TAG_HEALTHBOX_PALS_2 55050 #define TAG_HEALTHBOX_SAFARI_TILE 55051 #define TAG_PARTY_SUMMARY_BAR_PLAYER_TILE 55052 #define TAG_PARTY_SUMMARY_BAR_OPPONENT_TILE 55053 #define TAG_PARTY_SUMMARY_BAR_PLAYER_PAL 55056 #define TAG_PARTY_SUMMARY_BAR_OPPONENT_PAL 55057 #define TAG_PARTY_SUMMARY_BALL_PLAYER_PAL 55058 #define TAG_PARTY_SUMMARY_BALL_OPPONENT_PAL 55059 #define TAG_PARTY_SUMMARY_BALL_PLAYER_TILE 55060 #define TAG_PARTY_SUMMARY_BALL_OPPONENT_TILE 55061 #define TAG_HEALTHBOX_PAL TAG_HEALTHBOX_PLAYER1_TILE #define TAG_HEALTHBAR_PAL TAG_HEALTHBAR_PLAYER1_TILE enum { HEALTHBOX_ALL, HEALTHBOX_CURRENT_HP, HEALTHBOX_MAX_HP, HEALTHBOX_LEVEL, HEALTHBOX_NICK, HEALTHBOX_HEALTH_BAR, HEALTHBOX_EXP_BAR, HEALTHBOX_UNUSED_7, HEALTHBOX_UNUSED_8, HEALTHBOX_STATUS_ICON, HEALTHBOX_SAFARI_ALL_TEXT, HEALTHBOX_SAFARI_BALLS_TEXT }; void Task_HidePartyStatusSummary(u8 taskId); u8 CreateBattlerHealthboxSprites(u8 battlerId); u8 CreateSafariPlayerHealthboxSprites(void); void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 currVal, s32 receivedValue); void SetHealthboxSpriteInvisible(u8 healthboxSpriteId); void SetHealthboxSpriteVisible(u8 healthboxSpriteId); void DestoryHealthboxSprite(u8 healthboxSpriteId); void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly); void UpdateOamPriorityInAllHealthboxes(u8 priority); void InitBattlerHealthboxCoords(u8 battlerId); void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); void SwapHpBarsWithHpText(void); u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, u8 isSwitchingMons, bool8 isBattleStart); void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId); u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); u8 GetHPBarLevel(s16 hp, s16 maxhp); void UpdateNickInHealthbox(u8 spriteId, struct Pokemon *mon); void TryAddPokeballIconToHealthbox(u8 spriteId, u8); s32 MoveBattleBar(u8 battler, u8 healthboxSpriteId, u8 whichBar, u8 arg3); #endif // GUARD_BATTLE_INTERFACE_H ================================================ FILE: include/battle_main.h ================================================ #ifndef GUARD_BATTLE_MAIN_H #define GUARD_BATTLE_MAIN_H #include "constants/abilities.h" struct TrainerMoney { u8 classId; u8 value; }; struct MultiBattlePokemonTx { /*0x00*/ u16 species; /*0x02*/ u16 heldItem; /*0x04*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; /*0x0F*/ u8 level; /*0x10*/ u16 hp; /*0x12*/ u16 maxhp; /*0x14*/ u32 status; /*0x18*/ u32 personality; /*0x1C*/ u8 gender; /*0x1D*/ u8 language; }; #define TYPE_NAME_LENGTH 6 #define ABILITY_NAME_LENGTH 12 // defines for the u8 array gTypeEffectiveness #define TYPE_EFFECT_ATK_TYPE(i)((gTypeEffectiveness[i + 0])) #define TYPE_EFFECT_DEF_TYPE(i)((gTypeEffectiveness[i + 1])) #define TYPE_EFFECT_MULTIPLIER(i)((gTypeEffectiveness[i + 2])) // defines for the gTypeEffectiveness multipliers #define TYPE_MUL_NO_EFFECT 0 #define TYPE_MUL_NOT_EFFECTIVE 5 #define TYPE_MUL_NORMAL 10 #define TYPE_MUL_SUPER_EFFECTIVE 20 // special type table Ids #define TYPE_FORESIGHT 0xFE #define TYPE_ENDTABLE 0xFF // defines for the 'DoBounceEffect' function #define BOUNCE_MON 0x0 #define BOUNCE_HEALTHBOX 0x1 extern const struct SpriteTemplate gUnknownDebugSprite; extern const struct OamData gOamData_BattlerOpponent; extern const struct OamData gOamData_BattlerPlayer; extern const u8 gTypeNames[][TYPE_NAME_LENGTH + 1]; extern const u8 gStatusConditionString_PoisonJpn[8]; extern const u8 gStatusConditionString_SleepJpn[8]; extern const u8 gStatusConditionString_ParalysisJpn[8]; extern const u8 gStatusConditionString_BurnJpn[8]; extern const u8 gStatusConditionString_IceJpn[8]; extern const u8 gStatusConditionString_ConfusionJpn[8]; extern const u8 gStatusConditionString_LoveJpn[8]; extern const u8 *const gStatusConditionStringsTable[7][2]; extern const u8 gTypeEffectiveness[336]; extern const struct TrainerMoney gTrainerMoneyTable[]; extern const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT]; extern const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1]; void CB2_InitBattle(void); void BattleMainCB2(void); void FreeRestoreBattleData(void); void VBlankCB_Battle(void); void SpriteCB_VsLetterDummy(struct Sprite *sprite); void SpriteCB_VsLetterInit(struct Sprite *sprite); void CB2_InitEndLinkBattle(void); u32 GetBattleBgTemplateData(u8 arrayId, u8 caseId); void SpriteCB_EnemyMon(struct Sprite *sprite); void SpriteCallbackDummy_2(struct Sprite *sprite); void SpriteCB_FaintOpponentMon(struct Sprite *sprite); void SpriteCB_ShowAsMoveTarget(struct Sprite *sprite); void SpriteCB_HideAsMoveTarget(struct Sprite *sprite); void SpriteCB_AllyMon(struct Sprite *sprite); void SetIdleSpriteCallback(struct Sprite *sprite); void SpriteCB_FaintSlideAnim(struct Sprite *sprite); void DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude); void EndBounceEffect(u8 battler, u8 which); void SpriteCB_PlayerThrowInit(struct Sprite *sprite); void UpdatePlayerPosInThrowAnim(struct Sprite *sprite); void BeginBattleIntroDummy(void); void BeginBattleIntro(void); void SwitchInClearSetData(void); void FaintClearSetData(void); void BattleTurnPassed(void); u8 IsRunningFromBattleImpossible(void); void UpdatePartyOwnerOnSwitch_NonMulti(u8 battler); void SwapTurnOrder(u8 id1, u8 id2); u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); bool8 TryRunFromBattle(u8 battler); #endif // GUARD_BATTLE_MAIN_H ================================================ FILE: include/battle_message.h ================================================ #ifndef GUARD_BATTLE_MESSAGE_H #define GUARD_BATTLE_MESSAGE_H #include "global.h" #include "constants/battle_string_ids.h" // for 0xFD #define B_TXT_BUFF1 0x0 #define B_TXT_BUFF2 0x1 #define B_TXT_COPY_VAR_1 0x2 #define B_TXT_COPY_VAR_2 0x3 #define B_TXT_COPY_VAR_3 0x4 #define B_TXT_PLAYER_MON1_NAME 0x5 #define B_TXT_OPPONENT_MON1_NAME 0x6 #define B_TXT_PLAYER_MON2_NAME 0x7 #define B_TXT_OPPONENT_MON2_NAME 0x8 #define B_TXT_LINK_PLAYER_MON1_NAME 0x9 #define B_TXT_LINK_OPPONENT_MON1_NAME 0xA #define B_TXT_LINK_PLAYER_MON2_NAME 0xB #define B_TXT_LINK_OPPONENT_MON2_NAME 0xC #define B_TXT_ATK_NAME_WITH_PREFIX_MON1 0xD #define B_TXT_ATK_PARTNER_NAME 0xE #define B_TXT_ATK_NAME_WITH_PREFIX 0xF #define B_TXT_DEF_NAME_WITH_PREFIX 0x10 #define B_TXT_EFF_NAME_WITH_PREFIX 0x11 // EFF = short for gEffectBank #define B_TXT_ACTIVE_NAME_WITH_PREFIX 0x12 #define B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX 0x13 #define B_TXT_CURRENT_MOVE 0x14 #define B_TXT_LAST_MOVE 0x15 #define B_TXT_LAST_ITEM 0x16 #define B_TXT_LAST_ABILITY 0x17 #define B_TXT_ATK_ABILITY 0x18 #define B_TXT_DEF_ABILITY 0x19 #define B_TXT_SCR_ACTIVE_ABILITY 0x1A #define B_TXT_EFF_ABILITY 0x1B #define B_TXT_TRAINER1_CLASS 0x1C #define B_TXT_TRAINER1_NAME 0x1D #define B_TXT_LINK_PLAYER_NAME 0x1E #define B_TXT_LINK_PARTNER_NAME 0x1F #define B_TXT_LINK_OPPONENT1_NAME 0x20 #define B_TXT_LINK_OPPONENT2_NAME 0x21 #define B_TXT_LINK_SCR_TRAINER_NAME 0x22 #define B_TXT_PLAYER_NAME 0x23 #define B_TXT_TRAINER1_LOSE_TEXT 0x24 #define B_TXT_TRAINER1_WIN_TEXT 0x25 #define B_TXT_26 0x26 #define B_TXT_PC_CREATOR_NAME 0x27 #define B_TXT_ATK_PREFIX1 0x28 #define B_TXT_DEF_PREFIX1 0x29 #define B_TXT_ATK_PREFIX2 0x2A #define B_TXT_DEF_PREFIX2 0x2B #define B_TXT_ATK_PREFIX3 0x2C #define B_TXT_DEF_PREFIX3 0x2D #define B_TXT_TRAINER2_LOSE_TEXT 0x2E #define B_TXT_TRAINER2_WIN_TEXT 0x2F #define B_TXT_BUFF3 0x30 // for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3 #define B_BUFF_STRING 0 #define B_BUFF_NUMBER 1 #define B_BUFF_MOVE 2 #define B_BUFF_TYPE 3 #define B_BUFF_MON_NICK_WITH_PREFIX 4 #define B_BUFF_STAT 5 #define B_BUFF_SPECIES 6 #define B_BUFF_MON_NICK 7 #define B_BUFF_NEGATIVE_FLAVOR 8 #define B_BUFF_ABILITY 9 #define B_BUFF_ITEM 10 #define B_BUFF_PLACEHOLDER_BEGIN 0xFD #define B_BUFF_EOS 0xFF #define PREPARE_FLAVOR_BUFFER(textVar, flavorId) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_NEGATIVE_FLAVOR; \ textVar[2] = flavorId; \ textVar[3] = B_BUFF_EOS; \ } #define PREPARE_STAT_BUFFER(textVar, statId) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_STAT; \ textVar[2] = statId; \ textVar[3] = B_BUFF_EOS; \ } #define PREPARE_ABILITY_BUFFER(textVar, abilityId) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_ABILITY; \ textVar[2] = abilityId; \ textVar[3] = B_BUFF_EOS; \ } #define PREPARE_TYPE_BUFFER(textVar, typeId) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_TYPE; \ textVar[2] = typeId; \ textVar[3] = B_BUFF_EOS; \ } #define PREPARE_BYTE_NUMBER_BUFFER(textVar, maxDigits, number) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_NUMBER; \ textVar[2] = 1; \ textVar[3] = maxDigits; \ textVar[4] = (number); \ textVar[5] = B_BUFF_EOS; \ } #define PREPARE_HWORD_NUMBER_BUFFER(textVar, maxDigits, number) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_NUMBER; \ textVar[2] = 2; \ textVar[3] = maxDigits; \ textVar[4] = (number); \ textVar[5] = (number & 0x0000FF00) >> 8; \ textVar[6] = B_BUFF_EOS; \ } #define PREPARE_WORD_NUMBER_BUFFER(textVar, maxDigits, number) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_NUMBER; \ textVar[2] = 4; \ textVar[3] = maxDigits; \ textVar[4] = (number); \ textVar[5] = (number & 0x0000FF00) >> 8; \ textVar[6] = (number & 0x00FF0000) >> 16; \ textVar[7] = (number & 0xFF000000) >> 24; \ textVar[8] = B_BUFF_EOS; \ } #define PREPARE_STRING_BUFFER(textVar, stringId) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_STRING; \ textVar[2] = stringId; \ textVar[3] = (stringId & 0xFF00) >> 8; \ textVar[4] = B_BUFF_EOS; \ } #define PREPARE_MOVE_BUFFER(textVar, move) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_MOVE; \ textVar[2] = move; \ textVar[3] = (move & 0xFF00) >> 8; \ textVar[4] = B_BUFF_EOS; \ } #define PREPARE_ITEM_BUFFER(textVar, item) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_ITEM; \ textVar[2] = item; \ textVar[3] = (item & 0xFF00) >> 8; \ textVar[4] = B_BUFF_EOS; \ } #define PREPARE_SPECIES_BUFFER(textVar, species) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_SPECIES; \ textVar[2] = species; \ textVar[3] = (species & 0xFF00) >> 8; \ textVar[4] = B_BUFF_EOS; \ } #define PREPARE_MON_NICK_WITH_PREFIX_BUFFER(textVar, bank, partyId) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_MON_NICK_WITH_PREFIX; \ textVar[2] = bank; \ textVar[3] = partyId; \ textVar[4] = B_BUFF_EOS; \ } #define PREPARE_MON_NICK_BUFFER(textVar, bank, partyId) \ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_MON_NICK; \ textVar[2] = bank; \ textVar[3] = partyId; \ textVar[4] = B_BUFF_EOS; \ } struct BattleMsgData { u16 currentMove; u16 originallyUsedMove; u16 lastItem; u8 lastAbility; u8 scrActive; u8 bakScriptPartyIdx; u8 hpScale; u8 itemEffectBattler; u8 moveType; u8 abilities[4]; u8 textBuffs[3][0x10]; }; void BufferStringBattle(u16 stringID); u32 BattleStringExpandPlaceholdersToDisplayedString(const u8 *src); u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst); void BattleHandleAddTextPrinter(const u8 *text, u8 arg1); void SetPpNumbersPaletteInMoveSelection(void); u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp); void BattlePutTextOnWindow(const u8 *text, u8 windowId_flags); bool8 BattleStringShouldBeColored(u16); extern struct BattleMsgData *gBattleMsgDataPtr; #define TEXT_BUFF_ARRAY_COUNT 16 extern u8 gDisplayedStringBattle[300]; extern u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT]; extern u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT]; extern u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT]; extern const u8 *const gBattleStringsTable[]; extern const u8 *const gStatNamesTable[]; extern const u8 *const gPokeblockWasTooXStringTable[]; extern const u8 *const gRefereeStringsTable[]; extern const u8 *const gStatNamesTable2[]; extern const u16 gMissStringIds[]; extern const u16 gTrappingMoves[]; extern const u8 gText_Sleep[]; extern const u8 gText_Poison[]; extern const u8 gText_Burn[]; extern const u8 gText_Paralysis[]; extern const u8 gText_Ice[]; extern const u8 gText_Confusion[]; extern const u8 gText_Love[]; extern const u8 gText_BattleTowerBan_Space[]; extern const u8 gText_BattleTowerBan_Newline1[]; extern const u8 gText_BattleTowerBan_Newline2[]; extern const u8 gText_BattleTowerBan_Is1[]; extern const u8 gText_BattleTowerBan_Is2[]; extern const u8 gText_SafariBalls[]; extern const u8 gText_HighlightRed_Left[]; extern const u8 gText_Win[]; extern const u8 gText_Loss[]; extern const u8 gText_Draw[]; #endif // GUARD_BATTLE_MESSAGE_H ================================================ FILE: include/battle_records.h ================================================ #ifndef GUARD_BATTLE_RECORDS_H #define GUARD_BATTLE_RECORDS_H void ClearPlayerLinkBattleRecords(void); void UpdatePlayerLinkBattleRecords(s32 battlerId); #endif // GUARD_BATTLE_RECORDS_H ================================================ FILE: include/battle_script_commands.h ================================================ #ifndef GUARD_BATTLE_SCRIPT_COMMANDS_H #define GUARD_BATTLE_SCRIPT_COMMANDS_H #include "global.h" // Arguments for 'flags' in HandleBattleWindow #define WINDOW_CLEAR (1 << 0) #define WINDOW_BG1 (1 << 7) void AI_CalcDmg(u8 attacker, u8 defender); u8 TypeCalc(u16 move, u8 attacker, u8 defender); u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility); u8 GetBattlerTurnOrderNum(u8 battlerId); void SetMoveEffect(bool8 primary, u8 certain); bool32 IsMonGettingExpSentOut(void); void BattleDestroyYesNoCursorAt(void); void BattleCreateYesNoCursorAt(void); void BufferMoveToLearnIntoBattleTextBuff2(void); void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags); bool8 UproarWakeUpCheck(u8 battlerId); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u16 gNaturePowerMoves[]; #endif // GUARD_BATTLE_SCRIPT_COMMANDS_H ================================================ FILE: include/battle_scripts.h ================================================ #ifndef GUARD_BATTLE_SCRIPTS_H #define GUARD_BATTLE_SCRIPTS_H #include "global.h" extern const u8 BattleScript_HitFromCritCalc[]; extern const u8 BattleScript_MoveEnd[]; extern const u8 BattleScript_MakeMoveMissed[]; extern const u8 BattleScript_PrintMoveMissed[]; extern const u8 BattleScript_MoveMissedPause[]; extern const u8 BattleScript_MoveMissed[]; extern const u8 BattleScript_ButItFailed[]; extern const u8 BattleScript_StatUp[]; extern const u8 BattleScript_StatDown[]; extern const u8 BattleScript_AlreadyAtFullHp[]; extern const u8 BattleScript_PresentHealTarget[]; extern const u8 BattleScript_MoveUsedMustRecharge[]; extern const u8 BattleScript_FaintAttacker[]; extern const u8 BattleScript_FaintTarget[]; extern const u8 BattleScript_GiveExp[]; extern const u8 BattleScript_HandleFaintedMon[]; extern const u8 BattleScript_LocalTrainerBattleWon[]; extern const u8 BattleScript_LocalTwoTrainersDefeated[]; extern const u8 BattleScript_LocalBattleWonLoseTexts[]; extern const u8 BattleScript_LocalBattleWonReward[]; extern const u8 BattleScript_PayDayMoneyAndPickUpItems[]; extern const u8 BattleScript_LocalBattleLost[]; extern const u8 BattleScript_LocalBattleLostPrintWhiteOut[]; extern const u8 BattleScript_LocalBattleLostEnd[]; extern const u8 BattleScript_EReaderOrSecretBaseTrainerEnd[]; extern const u8 BattleScript_MasterTrainerBattleWon[]; extern const u8 BattleScript_CheckDomeDrew[]; extern const u8 BattleScript_LinkBattleWonOrLost[]; extern const u8 BattleScript_BattleTowerTrainerBattleWon[]; extern const u8 BattleScript_SmokeBallEscape[]; extern const u8 BattleScript_RanAwayUsingMonAbility[]; extern const u8 BattleScript_GotAwaySafely[]; extern const u8 BattleScript_WildMonFled[]; extern const u8 BattleScript_PrintCantRunFromTrainer[]; extern const u8 BattleScript_PrintFailedToRunString[]; extern const u8 BattleScript_PrintCantEscapeFromBattle[]; extern const u8 BattleScript_PrintFullBox[]; extern const u8 BattleScript_ActionSwitch[]; extern const u8 BattleScript_Pausex20[]; extern const u8 BattleScript_LevelUp[]; extern const u8 BattleScript_RainContinuesOrEnds[]; extern const u8 BattleScript_DamagingWeatherContinues[]; extern const u8 BattleScript_SandStormHailEnds[]; extern const u8 BattleScript_SunlightContinues[]; extern const u8 BattleScript_SunlightFaded[]; extern const u8 BattleScript_OverworldWeatherStarts[]; extern const u8 BattleScript_SideStatusWoreOff[]; extern const u8 BattleScript_SafeguardProtected[]; extern const u8 BattleScript_SafeguardEnds[]; extern const u8 BattleScript_LeechSeedTurnDrain[]; extern const u8 BattleScript_BideStoringEnergy[]; extern const u8 BattleScript_BideAttack[]; extern const u8 BattleScript_BideNoEnergyToAttack[]; extern const u8 BattleScript_SuccessForceOut[]; extern const u8 BattleScript_MistProtected[]; extern const u8 BattleScript_RageIsBuilding[]; extern const u8 BattleScript_MoveUsedIsDisabled[]; extern const u8 BattleScript_SelectingDisabledMove[]; extern const u8 BattleScript_DisabledNoMore[]; extern const u8 BattleScript_SelectingDisabledMoveInPalace[]; extern const u8 BattleScript_SelectingUnusableMoveInPalace[]; extern const u8 BattleScript_EncoredNoMore[]; extern const u8 BattleScript_DestinyBondTakesLife[]; extern const u8 BattleScript_SpikesOnAttacker[]; extern const u8 BattleScript_SpikesOnTarget[]; extern const u8 BattleScript_SpikesOngBank1[]; extern const u8 BattleScript_PerishSongTakesLife[]; extern const u8 BattleScript_PerishSongCountGoesDown[]; extern const u8 BattleScript_AllStatsUp[]; extern const u8 BattleScript_RapidSpinAway[]; extern const u8 BattleScript_WrapFree[]; extern const u8 BattleScript_LeechSeedFree[]; extern const u8 BattleScript_SpikesFree[]; extern const u8 BattleScript_MonTookFutureAttack[]; extern const u8 BattleScript_NoMovesLeft[]; extern const u8 BattleScript_SelectingMoveWithNoPP[]; extern const u8 BattleScript_NoPPForMove[]; extern const u8 BattleScript_SelectingTormentedMove[]; extern const u8 BattleScript_MoveUsedIsTormented[]; extern const u8 BattleScript_SelectingTormentedMoveInPalace[]; extern const u8 BattleScript_SelectingNotAllowedMoveTaunt[]; extern const u8 BattleScript_MoveUsedIsTaunted[]; extern const u8 BattleScript_SelectingNotAllowedMoveTauntInPalace[]; extern const u8 BattleScript_WishComesTrue[]; extern const u8 BattleScript_IngrainTurnHeal[]; extern const u8 BattleScript_AtkDefDown[]; extern const u8 BattleScript_KnockedOff[]; extern const u8 BattleScript_MoveUsedIsImprisoned[]; extern const u8 BattleScript_SelectingImprisonedMove[]; extern const u8 BattleScript_SelectingImprisonedMoveInPalace[]; extern const u8 BattleScript_GrudgeTakesPp[]; extern const u8 BattleScript_MagicCoatBounce[]; extern const u8 BattleScript_SnatchedMove[]; extern const u8 BattleScript_EnduredMsg[]; extern const u8 BattleScript_OneHitKOMsg[]; extern const u8 BattleScript_SAtkDown2[]; extern const u8 BattleScript_FocusPunchSetUp[]; extern const u8 BattleScript_MoveUsedIsAsleep[]; extern const u8 BattleScript_MoveUsedWokeUp[]; extern const u8 BattleScript_MonWokeUpInUproar[]; extern const u8 BattleScript_PoisonTurnDmg[]; extern const u8 BattleScript_BurnTurnDmg[]; extern const u8 BattleScript_MoveUsedIsFrozen[]; extern const u8 BattleScript_MoveUsedUnfroze[]; extern const u8 BattleScript_DefrostedViaFireMove[]; extern const u8 BattleScript_MoveUsedIsParalyzed[]; extern const u8 BattleScript_MoveUsedFlinched[]; extern const u8 BattleScript_PrintUproarOverTurns[]; extern const u8 BattleScript_ThrashConfuses[]; extern const u8 BattleScript_MoveUsedIsConfused[]; extern const u8 BattleScript_MoveUsedIsConfusedNoMore[]; extern const u8 BattleScript_PrintPayDayMoneyString[]; extern const u8 BattleScript_WrapTurnDmg[]; extern const u8 BattleScript_WrapEnds[]; extern const u8 BattleScript_MoveUsedIsInLove[]; extern const u8 BattleScript_MoveUsedIsInLoveCantAttack[]; extern const u8 BattleScript_MoveUsedIsParalyzedCantAttack[]; extern const u8 BattleScript_NightmareTurnDmg[]; extern const u8 BattleScript_CurseTurnDmg[]; extern const u8 BattleScript_TargetPRLZHeal[]; extern const u8 BattleScript_MoveEffectSleep[]; extern const u8 BattleScript_YawnMakesAsleep[]; extern const u8 BattleScript_MoveEffectPoison[]; extern const u8 BattleScript_MoveEffectBurn[]; extern const u8 BattleScript_MoveEffectFreeze[]; extern const u8 BattleScript_MoveEffectParalysis[]; extern const u8 BattleScript_MoveEffectUproar[]; extern const u8 BattleScript_MoveEffectToxic[]; extern const u8 BattleScript_MoveEffectPayDay[]; extern const u8 BattleScript_MoveEffectWrap[]; extern const u8 BattleScript_MoveEffectConfusion[]; extern const u8 BattleScript_MoveEffectRecoil33[]; extern const u8 BattleScript_DoRecoil33[]; extern const u8 BattleScript_Recoil33End[]; extern const u8 BattleScript_ItemSteal[]; extern const u8 BattleScript_DrizzleActivates[]; extern const u8 BattleScript_SpeedBoostActivates[]; extern const u8 BattleScript_TraceActivates[]; extern const u8 BattleScript_RainDishActivates[]; extern const u8 BattleScript_SandstreamActivates[]; extern const u8 BattleScript_ShedSkinActivates[]; extern const u8 BattleScript_WeatherFormChanges[]; extern const u8 BattleScript_WeatherFormChangesLoop[]; extern const u8 BattleScript_CastformChange[]; extern const u8 BattleScript_DroughtActivates[]; extern const u8 BattleScript_TookAttack[]; extern const u8 BattleScript_SturdyPreventsOHKO[]; extern const u8 BattleScript_DampStopsExplosion[]; extern const u8 BattleScript_MoveHPDrain_PPLoss[]; extern const u8 BattleScript_MoveHPDrain[]; extern const u8 BattleScript_MonMadeMoveUseless_PPLoss[]; extern const u8 BattleScript_MonMadeMoveUseless[]; extern const u8 BattleScript_FlashFireBoost_PPLoss[]; extern const u8 BattleScript_FlashFireBoost[]; extern const u8 BattleScript_AbilityNoStatLoss[]; extern const u8 BattleScript_BRNPrevention[]; extern const u8 BattleScript_PRLZPrevention[]; extern const u8 BattleScript_PSNPrevention[]; extern const u8 BattleScript_ObliviousPreventsAttraction[]; extern const u8 BattleScript_FlinchPrevention[]; extern const u8 BattleScript_OwnTempoPrevents[]; extern const u8 BattleScript_SoundproofProtected[]; extern const u8 BattleScript_AbilityNoSpecificStatLoss[]; extern const u8 BattleScript_StickyHoldActivates[]; extern const u8 BattleScript_ColorChangeActivates[]; extern const u8 BattleScript_RoughSkinActivates[]; extern const u8 BattleScript_CuteCharmActivates[]; extern const u8 BattleScript_ApplySecondaryEffect[]; extern const u8 BattleScript_SynchronizeActivates[]; extern const u8 BattleScript_NoItemSteal[]; extern const u8 BattleScript_AbilityCuredStatus[]; extern const u8 BattleScript_IgnoresAndUsesRandomMove[]; extern const u8 BattleScript_MoveUsedLoafingAround[]; extern const u8 BattleScript_IgnoresAndFallsAsleep[]; extern const u8 BattleScript_SubstituteFade[]; extern const u8 BattleScript_BerryCurePrlzEnd2[]; extern const u8 BattleScript_BerryCureParRet[]; extern const u8 BattleScript_BerryCurePsnEnd2[]; extern const u8 BattleScript_BerryCurePsnRet[]; extern const u8 BattleScript_BerryCureBrnEnd2[]; extern const u8 BattleScript_BerryCureBrnRet[]; extern const u8 BattleScript_BerryCureFrzEnd2[]; extern const u8 BattleScript_BerryCureFrzRet[]; extern const u8 BattleScript_BerryCureSlpEnd2[]; extern const u8 BattleScript_BerryCureSlpRet[]; extern const u8 BattleScript_BerryCureConfusionEnd2[]; extern const u8 BattleScript_BerryCureConfusionRet[]; extern const u8 BattleScript_BerryCureChosenStatusEnd2[]; extern const u8 BattleScript_BerryCureChosenStatusRet[]; extern const u8 BattleScript_WhiteHerbEnd2[]; extern const u8 BattleScript_WhiteHerbRet[]; extern const u8 BattleScript_ItemHealHP_RemoveItem[]; extern const u8 BattleScript_BerryPPHealEnd2[]; extern const u8 BattleScript_ItemHealHP_End2[]; extern const u8 BattleScript_ItemHealHP_Ret[]; extern const u8 BattleScript_SelectingNotAllowedMoveChoiceItem[]; extern const u8 BattleScript_FocusBandActivates[]; extern const u8 BattleScript_BerryConfuseHealEnd2[]; extern const u8 BattleScript_BerryStatRaiseEnd2[]; extern const u8 BattleScript_BerryFocusEnergyEnd2[]; extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[]; extern const u8 BattleScript_AskIfWantsToForfeitMatch[]; extern const u8 BattleScript_PrintPlayerForfeited[]; extern const u8 BattleScript_PrintPlayerForfeitedLinkBattle[]; extern const u8 BattleScript_BallThrow[]; extern const u8 BattleScript_BallThrowByWally[]; extern const u8 BattleScript_SafariBallThrow[]; extern const u8 BattleScript_SuccessBallThrow[]; extern const u8 BattleScript_SuccessBallThrowForceNick[]; extern const u8 BattleScript_WallyBallThrow[]; extern const u8 BattleScript_ShakeBallThrow[]; extern const u8 BattleScript_TrainerBallBlock[]; extern const u8 BattleScript_RunByUsingItem[]; extern const u8 BattleScript_ActionWatchesCarefully[]; extern const u8 BattleScript_ActionGetNear[]; extern const u8 BattleScript_ActionThrowPokeblock[]; extern const u8 BattleScript_GhostGetOutGetOut[]; extern const u8 BattleScript_TooScaredToMove[]; extern const u8 BattleScript_IntimidateActivates[]; extern const u8 BattleScript_IntimidateActivatesEnd3[]; extern const u8 BattleScript_IgnoresWhileAsleep[]; extern const u8 BattleScript_IgnoresAndHitsItself[]; extern const u8 BattleScript_MoveEffectRecoil[]; extern const u8 BattleScript_FlushMessageBox[]; extern const u8 BattleScript_SpikesOnFaintedBattler[]; extern const u8 BattleScript_GhostBallDodge[]; extern const u8 BattleScript_OldMan_Pokedude_CaughtMessage[]; extern const u8 BattleScript_SilphScopeUnveiled[]; extern const u8 BattleScript_BattleTowerTrainerBattleWon[]; extern const u8 BattleScript_PickedUpItem[]; extern const u8 BattleScript_PickedUpItemSolo[]; extern const u8 *const gBattleScriptsForMoveEffects[]; extern const u8 *const gBattlescriptsForBallThrow[]; extern const u8 *const gBattlescriptsForRunningByItem[]; extern const u8 *const gBattlescriptsForUsingItem[]; extern const u8 *const gBattlescriptsForSafariActions[]; #endif // GUARD_BATTLE_SCRIPTS_H ================================================ FILE: include/battle_setup.h ================================================ #ifndef GUARD_BATTLE_SETUP_H #define GUARD_BATTLE_SETUP_H #include "global.h" void StartWildBattle(void); void StartRoamerBattle(void); void StartOldManTutorialBattle(void); void StartScriptedWildBattle(void); void StartMarowakBattle(void); void StartSouthernIslandBattle(void); void StartLegendaryBattle(void); void StartGroudonKyogreBattle(void); void StartRegiBattle(void); u8 BattleSetup_GetTerrainId(void); u8 BattleSetup_GetBattleTowerBattleTransition(void); const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data); void ConfigureAndSetUpOneTrainerBattle(u8 trainerEventObjId, const u8 *trainerScript); bool32 GetTrainerFlagFromScriptPointer(const u8 *data); void SetUpTrainerMovement(void); u8 GetTrainerBattleMode(void); u16 GetRivalBattleFlags(void); void SetBattledTrainerFlag(void); bool8 HasTrainerBeenFought(u16 trainerId); void SetTrainerFlag(u16 trainerId); void ClearTrainerFlag(u16 trainerId); void StartTrainerBattle(void); void StartRematchBattle(void); void ShowTrainerIntroSpeech(void); const u8 *BattleSetup_GetScriptAddrAfterBattle(void); const u8 *BattleSetup_GetTrainerPostBattleScript(void); void ShowTrainerCantBattleSpeech(void); void PlayTrainerEncounterMusic(void); const u8 *GetTrainerALoseText(void); const u8 *GetTrainerWonSpeech(void); s8 GetScaledLevel(void); bool8 IsWildMonNuzlockeDupe(u16 species); bool8 CheckNuzlockeDupeFlags(u16 species); void SetNuzlockeDupeFlags(u16 species); #endif // GUARD_BATTLE_SETUP_H ================================================ FILE: include/battle_tower.h ================================================ #ifndef GUARD_BATTLE_TOWER_H #define GUARD_BATTLE_TOWER_H #include "global.h" #include "constants/battle_tower.h" #define BATTLE_TOWER_EREADER_TRAINER_ID 200 #define BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID 100 struct BattleTowerTrainer { u8 trainerClass; u8 name[8]; u8 teamFlags; u16 greeting[6]; }; struct BattleTowerPokemonTemplate { u16 species; u8 heldItem; u8 teamFlags; u16 moves[4]; u8 evSpread; u8 nature; }; extern const u16 gBattleTowerBannedSpecies[]; void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); void ValidateEReaderTrainer(void); u8 GetBattleTowerTrainerFrontSpriteId(void); u8 GetEreaderTrainerFrontSpriteId(void); void CopyEReaderTrainerName5(u8 *dest); void GetBattleTowerTrainerName(u8 *text); u8 GetEreaderTrainerClassId(void); u8 GetBattleTowerTrainerClassNameId(void); s32 GetHighestLevelInPlayerParty(void); #endif //GUARD_BATTLE_TOWER_H ================================================ FILE: include/battle_transition.h ================================================ #ifndef GUARD_BATTLE_TRANSITION_H #define GUARD_BATTLE_TRANSITION_H #include "global.h" enum { MUGSHOT_LORELEI, MUGSHOT_BRUNO, MUGSHOT_AGATHA, MUGSHOT_LANCE, MUGSHOT_BLUE, MUGSHOT_OAK, MUGSHOTS_COUNT }; enum { B_TRANSITION_BLUR, B_TRANSITION_SWIRL, B_TRANSITION_SHUFFLE, B_TRANSITION_BIG_POKEBALL, B_TRANSITION_POKEBALLS_TRAIL, B_TRANSITION_CLOCKWISE_WIPE, B_TRANSITION_RIPPLE, B_TRANSITION_WAVE, B_TRANSITION_SLICE, B_TRANSITION_WHITE_BARS_FADE, B_TRANSITION_GRID_SQUARES, B_TRANSITION_ANGLED_WIPES, B_TRANSITION_LORELEI, B_TRANSITION_BRUNO, B_TRANSITION_AGATHA, B_TRANSITION_LANCE, B_TRANSITION_BLUE, B_TRANSITION_SPIRAL, B_TRANSITION_OAK, B_TRANSITION_COUNT }; extern const struct SpritePalette gSpritePalette_Pokeball; bool8 IsBattleTransitionDone(void); void BattleTransition_StartOnField(u8 transitionId); bool8 FldEff_PokeballTrail(void); #endif // GUARD_BATTLE_TRANSITION_H ================================================ FILE: include/battle_util.h ================================================ #ifndef GUARD_BATTLE_UTIL_H #define GUARD_BATTLE_UTIL_H #include "global.h" #define MOVE_LIMITATION_ZEROMOVE (1 << 0) #define MOVE_LIMITATION_PP (1 << 1) #define MOVE_LIMITATION_DISABLED (1 << 2) #define MOVE_LIMITATION_TORMENTED (1 << 3) #define MOVE_LIMITATION_TAUNT (1 << 4) #define MOVE_LIMITATION_IMPRISON (1 << 5) #define MOVE_LIMITATIONS_ALL 0xFF #define ABILITYEFFECT_ON_SWITCHIN 0 #define ABILITYEFFECT_ENDTURN 1 #define ABILITYEFFECT_MOVES_BLOCK 2 #define ABILITYEFFECT_ABSORBING 3 #define ABILITYEFFECT_ON_DAMAGE 4 #define ABILITYEFFECT_IMMUNITY 5 #define ABILITYEFFECT_FORECAST 6 #define ABILITYEFFECT_SYNCHRONIZE 7 #define ABILITYEFFECT_ATK_SYNCHRONIZE 8 #define ABILITYEFFECT_INTIMIDATE1 9 #define ABILITYEFFECT_INTIMIDATE2 10 #define ABILITYEFFECT_TRACE 11 #define ABILITYEFFECT_CHECK_OTHER_SIDE 12 #define ABILITYEFFECT_CHECK_BATTLER_SIDE 13 #define ABILITYEFFECT_FIELD_SPORT 14 #define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER 15 #define ABILITYEFFECT_COUNT_OTHER_SIDE 16 #define ABILITYEFFECT_COUNT_BATTLER_SIDE 17 #define ABILITYEFFECT_COUNT_ON_FIELD 18 #define ABILITYEFFECT_CHECK_ON_FIELD 19 #define ABILITYEFFECT_MUD_SPORT 253 #define ABILITYEFFECT_WATER_SPORT 254 #define ABILITYEFFECT_SWITCH_IN_WEATHER 255 #define ABILITY_ON_OPPOSING_FIELD(battlerId, abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, battlerId, abilityId, 0, 0)) #define ABILITY_ON_FIELD(abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, abilityId, 0, 0)) #define ABILITY_ON_FIELD2(abilityId)(AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, abilityId, 0, 0)) // For the first argument of ItemBattleEffects, to deteremine which block of item effects to try #define ITEMEFFECT_ON_SWITCH_IN 0 #define ITEMEFFECT_NORMAL 1 #define ITEMEFFECT_DUMMY 2 // Unused, empty #define ITEMEFFECT_MOVE_END 3 #define ITEMEFFECT_KINGSROCK_SHELLBELL 4 #define WEATHER_HAS_EFFECT ((!AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_AIR_LOCK, 0, 0))) #define WEATHER_HAS_EFFECT2 ((!AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_AIR_LOCK, 0, 0))) #define BS_GET_TARGET 0 #define BS_GET_ATTACKER 1 #define BS_GET_EFFECT_BANK 2 #define BS_GET_SCRIPTING_BANK 10 #define BS_GET_PLAYER1 11 #define BS_GET_OPPONENT1 12 #define BS_GET_PLAYER2 13 #define BS_GET_OPPONENT2 14 u8 GetBattlerForBattleScript(u8 caseId); void PressurePPLose(u8 target, u8 attacker, u16 move); void PressurePPLoseOnUsingImprison(u8 attacker); void PressurePPLoseOnUsingPerishSong(u8 attacker); void MarkBattlerForControllerExec(u8 battlerId); void MarkBattlerReceivedLinkData(u8 battlerId); void CancelMultiTurnMoves(u8 battler); bool8 WasUnableToUseMove(u8 battler); void PrepareStringBattle(u16 stringId, u8 battler); void ResetSentPokesToOpponentValue(void); void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler); void UpdateSentPokesToOpponentValue(u8 battler); void BattleScriptPush(const u8 *bsPtr); void BattleScriptPushCursor(void); void BattleScriptPop(void); u8 TrySetCantSelectMoveBattleScript(void); u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check); bool8 AreAllMovesUnusable(void); u8 GetImprisonedMovesCount(u8 battlerId, u16 move); u8 DoFieldEndTurnEffects(void); u8 DoBattlerEndTurnEffects(void); bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); void TryClearRageStatuses(void); u8 AtkCanceller_UnableToUseMove(void); bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); u8 CastformDataTypeChange(u8 battler); u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg); void BattleScriptExecute(const u8 *BS_ptr); void BattleScriptPushCursorAndCallback(const u8 *BS_ptr); u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn); void ClearFuryCutterDestinyBondGrudge(u8 battlerId); void HandleAction_RunBattleScript(void); u8 GetMoveTarget(u16 move, u8 setTarget); u8 IsMonDisobedient(void); #endif // GUARD_BATTLE_UTIL_H ================================================ FILE: include/battle_util2.h ================================================ #ifndef GUARD_BATTLE_UTIL2_H #define GUARD_BATTLE_UTIL2_H #include "global.h" void AllocateBattleResources(void); void FreeBattleResources(void); void AdjustFriendshipOnBattleFaint(u8 bank); #endif // GUARD_BATTLE_UTIL_H ================================================ FILE: include/berry.h ================================================ #ifndef GUARD_BERRY_H #define GUARD_BERRY_H #include "global.h" enum { BERRY_FIRMNESS_UNKNOWN, BERRY_FIRMNESS_VERY_SOFT, BERRY_FIRMNESS_SOFT, BERRY_FIRMNESS_HARD, BERRY_FIRMNESS_VERY_HARD, BERRY_FIRMNESS_SUPER_HARD, }; enum { FLAVOR_SPICY, FLAVOR_DRY, FLAVOR_SWEET, FLAVOR_BITTER, FLAVOR_SOUR, FLAVOR_COUNT }; #define NUM_BERRIES 44 void ClearEnigmaBerries(void); void SetEnigmaBerry(u8 *src); bool32 IsEnigmaBerryValid(void); const struct Berry *GetBerryInfo(u8 berry); u8 ItemIdToBerryType(u16 item); void GetBerryNameByBerryType(u8 berry, u8 *string); extern const struct Berry gBerries[]; struct BerryCrushStats { u8 difficulty; u16 powder; }; extern const struct BerryCrushStats gBerryCrush_BerryData[]; #endif // GUARD_BERRY_H ================================================ FILE: include/berry_crush.h ================================================ #ifndef GUARD_BERRY_CRUSH_H #define GUARD_BERRY_CRUSH_H #include "main.h" void StartBerryCrush(MainCallback callback); void ShowBerryCrushRankings(void); #endif // GUARD_BERRY_CRUSH_H ================================================ FILE: include/berry_fix_program.h ================================================ #ifndef GUARD_BERRY_FIX_PROGRAM_H #define GUARD_BERRY_FIX_PROGRAM_H void CB2_InitBerryFixProgram(void); #endif //GUARD_BERRY_FIX_PROGRAM_H ================================================ FILE: include/berry_pouch.h ================================================ #ifndef GUARD_BERRY_POUCH_H #define GUARD_BERRY_POUCH_H #include "task.h" enum BerryPouchType { BERRYPOUCH_FROMFIELD, BERRYPOUCH_FROMPARTYGIVE, BERRYPOUCH_FROMMARTSELL, BERRYPOUCH_FROMPOKEMONSTORAGEPC, BERRYPOUCH_FROMBATTLE, BERRYPOUCH_FROMBERRYCRUSH, BERRYPOUCH_NA }; void BerryPouch_StartFadeToExitCallback(u8 taskId); void BerryPouch_SetExitCallback(void (*exitCallback)(void)); void InitBerryPouch(u8 type, void (*savedCallback)(void), u8 allowSelect); void DisplayItemMessageInBerryPouch(u8 taskId, u8 fontId, const u8 * str, TaskFunc followUpFunc); void Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(u8 taskId); void BerryPouch_CursorResetToTop(void); #endif //GUARD_BERRY_POUCH_H ================================================ FILE: include/berry_powder.h ================================================ #ifndef GUARD_BERRY_POWDER_H #define GUARD_BERRY_POWDER_H u32 GetBerryPowder(void); void SetBerryPowder(u32 *powder, u32 amount); void ApplyNewEncryptionKeyToBerryPowder(u32 newKey); bool8 GiveBerryPowder(u32 amountToAdd); #endif //GUARD_BERRY_POWDER_H ================================================ FILE: include/bg.h ================================================ #ifndef GUARD_BG_H #define GUARD_BG_H #include "global.h" struct BGCntrlBitfield // for the I/O registers { volatile u16 priority:2; volatile u16 charBaseBlock:2; volatile u16 field_0_2:4; volatile u16 field_1_0:5; volatile u16 areaOverflowMode:1; volatile u16 screenSize:2; }; enum { BG_CTRL_ATTR_VISIBLE = 1, BG_CTRL_ATTR_CHARBASEINDEX = 2, BG_CTRL_ATTR_MAPBASEINDEX = 3, BG_CTRL_ATTR_SCREENSIZE = 4, BG_CTRL_ATTR_PALETTEMODE = 5, BG_CTRL_ATTR_PRIORITY = 6, BG_CTRL_ATTR_MOSAIC = 7, BG_CTRL_ATTR_WRAPAROUND = 8, }; enum { BG_ATTR_CHARBASEINDEX = 1, BG_ATTR_MAPBASEINDEX = 2, BG_ATTR_SCREENSIZE = 3, BG_ATTR_PALETTEMODE = 4, BG_ATTR_MOSAIC = 5, BG_ATTR_WRAPAROUND = 6, BG_ATTR_PRIORITY = 7, BG_ATTR_MAPSIZE = 8, BG_ATTR_BGTYPE = 9, BG_ATTR_BASETILE = 10 }; // Modes for ChangeBgX / ChangeBgY enum { BG_COORD_SET, BG_COORD_ADD, BG_COORD_SUB, }; enum AdjustBgMosaicMode { BG_MOSAIC_SET, BG_MOSAIC_SET_H, BG_MOSAIC_INC_H, BG_MOSAIC_DEC_H, BG_MOSAIC_SET_V, BG_MOSAIC_INC_V, BG_MOSAIC_DEC_V, }; enum BgTileAllocMode { BG_TILE_FIND_FREE_SPACE, BG_TILE_ALLOC, BG_TILE_FREE, }; struct BgTemplate { u16 bg:2; // 0x1, 0x2 -> 0x3 u16 charBaseIndex:2; // 0x4, 0x8 -> 0xC u16 mapBaseIndex:5; // 0x10, 0x20, 0x40, 0x80, 0x100 -> 0x1F0 u16 screenSize:2; // 0x200, 0x400 -> 0x600 u16 paletteMode:1; // 0x800 u16 priority:2; // 0x1000, 0x2000 > 0x3000 u16 baseTile:10; }; void ResetBgs(void); u8 GetBgMode(void); void ResetBgControlStructs(void); void Unused_ResetBgControlStruct(u8 bg); void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound); u16 GetBgControlAttribute(u8 bg, u8 attributeId); u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode); void SetTextModeAndHideBgs(void); bool8 IsInvalidBg(u8 bg); int BgTileAllocOp(int bg, int offset, int count, int mode); void ResetBgsAndClearDma3BusyFlags(bool32 enableWindowTileAutoAlloc); void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates); void InitBgFromTemplate(const struct BgTemplate *template); void SetBgMode(u8 bgMode); u16 LoadBgTiles(u8 bg, const void *src, u16 size, u16 destOffset); u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset); u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset); bool8 IsDma3ManagerBusyWithBgCopy(void); void ShowBg(u8 bg); void HideBg(u8 bg); void SetBgAttribute(u8 bg, u8 attributeId, u8 value); u16 GetBgAttribute(u8 bg, u8 attributeId); u32 ChangeBgX(u8 bg, u32 value, u8 op); u32 GetBgX(u8 bg); u32 ChangeBgY(u8 bg, u32 value, u8 op); u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op); u32 GetBgY(u8 bg); void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle); u8 AdjustBgMosaic(u8 value, u8 mode); void SetBgTilemapBuffer(u8 bg, void *tilemap); void UnsetBgTilemapBuffer(u8 bg); void *GetBgTilemapBuffer(u8 bg); void CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset); void CopyBgTilemapBufferToVram(u8 bg); void CopyToBgTilemapBufferRect(u8 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height); void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette); void CopyRectToBgTilemapBufferRect(u8 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, s16 tileOffset, s16 palette2); void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height); void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette); void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta); u16 GetBgMetricTextMode(u8 bg, u8 whichMetric); u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric); u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight); void CopyTileMapEntry(const u16 *src, u16 *dest, s32 palette1, s32 tileOffset, s32 palette2); u32 GetBgType(u8 bg); bool32 IsInvalidBg32(u8 bg); bool32 IsTileMapOutsideWram(u8 bg); extern bool32 gWindowTileAutoAllocEnabled; #endif // GUARD_BG_H ================================================ FILE: include/bg_regs.h ================================================ #ifndef GUARD_BG_REGS_H #define GUARD_BG_REGS_H extern const u8 gBGControlRegOffsets[]; extern const u16 gOverworldBackgroundLayerFlags[]; #endif //GUARD_BG_REGS_H ================================================ FILE: include/bike.h ================================================ #ifndef GUARD_BIKE_H #define GUARD_BIKE_H // TODO: Do the constants make sense in FRLG? // Player speeds enum { PLAYER_SPEED_STANDING, PLAYER_SPEED_NORMAL, PLAYER_SPEED_FAST, PLAYER_SPEED_FASTER, PLAYER_SPEED_FASTEST, }; enum { BIKE_TRANS_FACE_DIRECTION, BIKE_TRANS_TURNING, BIKE_TRANS_MOVE, BIKE_TRANS_DOWNHILL, BIKE_TRANS_UPHILL }; enum { BIKE_STATE_NORMAL, BIKE_STATE_TURNING, BIKE_STATE_SLOPE }; // Acro bike states enum { ACRO_STATE_NORMAL, ACRO_STATE_TURNING, ACRO_STATE_WHEELIE_STANDING, ACRO_STATE_BUNNY_HOP, ACRO_STATE_WHEELIE_MOVING, ACRO_STATE_SIDE_JUMP, ACRO_STATE_TURN_JUMP, }; void BikeClearState(u32 directionHistory, u32 abStartSelectHistory); bool8 IsBikingDisallowedByPlayer(void); void GetOnOffBike(u8 flags); s16 GetPlayerSpeed(void); bool8 RS_IsRunningDisallowed(u8 r0); void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys); bool32 IsRunningDisallowed(u8 metatileBehavior); void Bike_HandleBumpySlopeJump(void); void Bike_UpdateBikeCounterSpeed(u8 counter); bool8 IsPlayerNotUsingAcroBikeOnBumpySlope(void); #endif //GUARD_BIKE_H ================================================ FILE: include/blend_palette.h ================================================ #ifndef GUARD_BLEND_PALETTE_H #define GUARD_BLEND_PALETTE_H #include "global.h" // Exported type declarations // Exported RAM declarations // Exported ROM declarations void BlendPalette(u16, u16, u8, u16); void BlendPalettesAt(u16 * palbuff, u16 blend_pal, u32 coefficient, s32 size); #endif //GUARD_BLEND_PALETTE_H ================================================ FILE: include/blit.h ================================================ #ifndef GUARD_BLIT_H #define GUARD_BLIT_H struct Bitmap { u8 *pixels; u32 width:16; u32 height:16; }; void BlitBitmapRect4BitWithoutColorKey(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height); void BlitBitmapRect4Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey); void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue); void BlitBitmapRect4BitTo8Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset); void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue); #endif // GUARD_BLIT_H ================================================ FILE: include/cable_club.h ================================================ #ifndef GUARD_CABLE_CLUB_H #define GUARD_CABLE_CLUB_H void Task_WaitForLinkPlayerConnection(u8 taskId); u8 CreateTask_ReestablishCableClubLink(void); void CB2_ReturnFromCableClubBattle(void); bool32 GetSeeingLinkPlayerCardMsg(u8 who); #endif //GUARD_CABLE_CLUB_H ================================================ FILE: include/calculate_base_damage.h ================================================ #ifndef GUARD_CALCULATE_BASE_DAMAGE_H #define GUARD_CALCULATE_BASE_DAMAGE_H #include "global.h" s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef); #endif // GUARD_CALCULATE_BASE_DAMAGE_H ================================================ FILE: include/cereader_tool.h ================================================ #ifndef GUARD_CEREADER_TOOL_H #define GUARD_CEREADER_TOOL_H #include "global.h" #include "constants/trainer_tower.h" struct TrainerTowerTrainer { /* 0x000 */ u8 name[11]; /* 0x00B */ u8 facilityClass; /* 0x00C */ u8 textColor; /* 0x00E */ u16 speechBefore[6]; /* 0x01A */ u16 speechWin[6]; /* 0x026 */ u16 speechLose[6]; /* 0x032 */ u16 speechAfter[6]; /* 0x040 */ struct BattleTowerPokemon mons[PARTY_SIZE]; }; // size: 328 struct TrainerTowerFloor { /* 0x000 */ u8 id; /* 0x001 */ u8 floorIdx; /* 0x002 */ u8 challengeType; /* 0x003 */ u8 prize; /* 0x004 */ struct TrainerTowerTrainer trainers[MAX_TRAINERS_PER_FLOOR]; /* 0x3DC */ u32 checksum; }; struct EReaderTrainerTowerSetSubstruct { u8 numFloors; u8 id; u16 dummy; u32 checksum; }; struct EReaderTrainerTowerSet { u8 numFloors; u8 id; u16 dummy; u32 checksum; struct TrainerTowerFloor floors[MAX_TRAINER_TOWER_FLOORS]; }; bool32 ValidateTrainerTowerData(struct EReaderTrainerTowerSet * ttdata); bool32 CEReaderTool_SaveTrainerTower(struct EReaderTrainerTowerSet * ttdata); bool32 CEReaderTool_LoadTrainerTower(struct EReaderTrainerTowerSet * ttdata); bool32 ReadTrainerTowerAndValidate(void); #endif //GUARD_CEREADER_TOOL_H ================================================ FILE: include/characters.h ================================================ #ifndef GUARD_CHARACTERS_H #define GUARD_CHARACTERS_H #define CHAR_SPACE 0x00 #define CHAR_A_GRAVE 0x01 #define CHAR_A_ACUTE 0x02 #define CHAR_A_CIRCUMFLEX 0x03 #define CHAR_C_CEDILLA 0x04 #define CHAR_E_GRAVE 0x05 #define CHAR_E_ACUTE 0x06 #define CHAR_E_CIRCUMFLEX 0x07 #define CHAR_E_DIAERESIS 0x08 #define CHAR_I_GRAVE 0x09 //#define CHAR_I_ACUTE 0x0A // Is 0x5A instead #define CHAR_I_CIRCUMFLEX 0x0B #define CHAR_I_DIAERESIS 0x0C #define CHAR_O_GRAVE 0x0D #define CHAR_O_ACUTE 0x0E #define CHAR_O_CIRCUMFLEX 0x0F #define CHAR_OE 0x10 #define CHAR_U_GRAVE 0x11 #define CHAR_U_ACUTE 0x12 #define CHAR_U_CIRCUMFLEX 0x13 #define CHAR_N_TILDE 0x14 #define CHAR_ESZETT 0x15 #define CHAR_a_GRAVE 0x16 #define CHAR_a_ACUTE 0x17 //#define CHAR_a_CIRCUMFLEX 0x18 // Is 0x68 instead #define CHAR_c_CEDILLA 0x19 #define CHAR_e_GRAVE 0x1A #define CHAR_e_ACUTE 0x1B #define CHAR_e_CIRCUMFLEX 0x1C #define CHAR_e_DIAERESIS 0x1D #define CHAR_i_GRAVE 0x1E //#define CHAR_i_ACUTE 0x1F // Is 0x6F instead #define CHAR_i_CIRCUMFLEX 0x20 #define CHAR_i_DIAERESIS 0x21 #define CHAR_o_GRAVE 0x22 #define CHAR_o_ACUTE 0x23 #define CHAR_o_CIRCUMFLEX 0x24 #define CHAR_oe 0x25 #define CHAR_u_GRAVE 0x26 #define CHAR_u_ACUTE 0x27 #define CHAR_u_CIRCUMFLEX 0x28 #define CHAR_n_TILDE 0x29 #define CHAR_MASCULINE_ORDINAL 0x2A #define CHAR_FEMININE_ORDINAL 0x2B #define CHAR_SUPER_ER 0x2C #define CHAR_AMPERSAND 0x2D #define CHAR_PLUS 0x2E // #define CHAR_LV 0x34 #define CHAR_EQUALS 0x35 #define CHAR_SEMICOLON 0x36 #define CHAR_BARD_WORD_DELIMIT 0x37 // Empty space to separate words in Bard's song // #define CHAR_EMPTY_RECT 0x50 #define CHAR_INV_QUESTION_MARK 0x51 #define CHAR_INV_EXCL_MARK 0x52 #define CHAR_PK 0x53 #define CHAR_MN 0x54 #define CHAR_PO 0x55 #define CHAR_KE 0x56 #define CHAR_BLOCK_1 0x57 // Each of these 3 #define CHAR_BLOCK_2 0x58 // chars contains 1/3 #define CHAR_BLOCK_3 0x59 // of the word BLOCK #define CHAR_I_ACUTE 0x5A #define CHAR_PERCENT 0x5B #define CHAR_LEFT_PAREN 0x5C #define CHAR_RIGHT_PAREN 0x5D // #define CHAR_a_CIRCUMFLEX 0x68 // #define CHAR_i_ACUTE 0x6F // #define CHAR_SPACER 0x77 // Empty space // #define CHAR_UP_ARROW 0x79 #define CHAR_DOWN_ARROW 0x7A #define CHAR_LEFT_ARROW 0x7B #define CHAR_RIGHT_ARROW 0x7C #define CHAR_FONT_A_BUTTON 0x7D // #define CHAR_SUPER_E 0x84 #define CHAR_LESS_THAN 0x85 #define CHAR_GREATER_THAN 0x86 // #define CHAR_SUPER_RE 0xA0 #define CHAR_0 0xA1 #define CHAR_1 0xA2 #define CHAR_2 0xA3 #define CHAR_3 0xA4 #define CHAR_4 0xA5 #define CHAR_5 0xA6 #define CHAR_6 0xA7 #define CHAR_7 0xA8 #define CHAR_8 0xA9 #define CHAR_9 0xAA #define CHAR_EXCL_MARK 0xAB #define CHAR_QUESTION_MARK 0xAC #define CHAR_PERIOD 0xAD #define CHAR_HYPHEN 0xAE #define CHAR_BULLET 0xAF #define CHAR_ELLIPSIS 0xB0 #define CHAR_DBL_QUOTE_LEFT 0xB1 #define CHAR_DBL_QUOTE_RIGHT 0xB2 #define CHAR_SGL_QUOTE_LEFT 0xB3 #define CHAR_SGL_QUOTE_RIGHT 0xB4 #define CHAR_MALE 0xB5 #define CHAR_FEMALE 0xB6 #define CHAR_CURRENCY 0xB7 #define CHAR_COMMA 0xB8 #define CHAR_MULT_SIGN 0xB9 #define CHAR_SLASH 0xBA #define CHAR_A 0xBB #define CHAR_B 0xBC #define CHAR_C 0xBD #define CHAR_D 0xBE #define CHAR_E 0xBF #define CHAR_F 0xC0 #define CHAR_G 0xC1 #define CHAR_H 0xC2 #define CHAR_I 0xC3 #define CHAR_J 0xC4 #define CHAR_K 0xC5 #define CHAR_L 0xC6 #define CHAR_M 0xC7 #define CHAR_N 0xC8 #define CHAR_O 0xC9 #define CHAR_P 0xCA #define CHAR_Q 0xCB #define CHAR_R 0xCC #define CHAR_S 0xCD #define CHAR_T 0xCE #define CHAR_U 0xCF #define CHAR_V 0xD0 #define CHAR_W 0xD1 #define CHAR_X 0xD2 #define CHAR_Y 0xD3 #define CHAR_Z 0xD4 #define CHAR_a 0xD5 #define CHAR_b 0xD6 #define CHAR_c 0xD7 #define CHAR_d 0xD8 #define CHAR_e 0xD9 #define CHAR_f 0xDA #define CHAR_g 0xDB #define CHAR_h 0xDC #define CHAR_i 0xDD #define CHAR_j 0xDE #define CHAR_k 0xDF #define CHAR_l 0xE0 #define CHAR_m 0xE1 #define CHAR_n 0xE2 #define CHAR_o 0xE3 #define CHAR_p 0xE4 #define CHAR_q 0xE5 #define CHAR_r 0xE6 #define CHAR_s 0xE7 #define CHAR_t 0xE8 #define CHAR_u 0xE9 #define CHAR_v 0xEA #define CHAR_w 0xEB #define CHAR_x 0xEC #define CHAR_y 0xED #define CHAR_z 0xEE #define CHAR_BLACK_TRIANGLE 0xEF #define CHAR_COLON 0xF0 #define CHAR_A_DIAERESIS 0xF1 #define CHAR_O_DIAERESIS 0xF2 #define CHAR_U_DIAERESIS 0xF3 #define CHAR_a_DIAERESIS 0xF4 #define CHAR_o_DIAERESIS 0xF5 #define CHAR_u_DIAERESIS 0xF6 #define CHAR_DYNAMIC 0xF7 #define CHAR_KEYPAD_ICON 0xF8 #define CHAR_EXTRA_SYMBOL 0xF9 #define CHAR_PROMPT_SCROLL 0xFA // waits for button press and scrolls dialog #define CHAR_PROMPT_CLEAR 0xFB // waits for button press and clears dialog #define EXT_CTRL_CODE_BEGIN 0xFC // extended control code #define PLACEHOLDER_BEGIN 0xFD // string placeholder #define CHAR_NEWLINE 0xFE #define EOS 0xFF // end of string // CHAR_KEYPAD_ICON chars #define CHAR_A_BUTTON 0x00 #define CHAR_B_BUTTON 0x01 #define CHAR_L_BUTTON 0x02 #define CHAR_R_BUTTON 0x03 #define CHAR_START_BUTTON 0x04 #define CHAR_SELECT_BUTTON 0x05 #define CHAR_DPAD_UP 0x06 #define CHAR_DPAD_DOWN 0x07 #define CHAR_DPAD_LEFT 0x08 #define CHAR_DPAD_RIGHT 0x09 #define CHAR_DPAD_UPDOWN 0x0A #define CHAR_DPAD_LEFTRIGHT 0x0B #define CHAR_DPAD_NONE 0x0C // CHAR_EXTRA_SYMBOL chars #define CHAR_UP_ARROW_2 0x00 #define CHAR_DOWN_ARROW_2 0x01 #define CHAR_LEFT_ARROW_2 0x02 #define CHAR_RIGHT_ARROW_2 0x03 #define CHAR_PLUS_2 0x04 #define CHAR_LV_2 0x05 #define CHAR_PP 0x06 #define CHAR_ID 0x07 #define CHAR_NO 0x08 #define CHAR_UNDERSCORE 0x09 #define CHAR_CIRCLED_1 0x0A #define CHAR_CIRCLED_2 0x0B #define CHAR_CIRCLED_3 0x0C #define CHAR_CIRCLED_4 0x0D #define CHAR_CIRCLED_5 0x0E #define CHAR_CIRCLED_6 0x0F #define CHAR_CIRCLED_7 0x10 #define CHAR_CIRCLED_8 0x11 #define CHAR_CIRCLED_9 0x12 #define CHAR_LEFT_PAREN_SMALL 0x13 #define CHAR_RIGHT_PAREN_SMALL 0x14 #define CHAR_BULLSEYE 0x15 #define CHAR_TRIANGLE 0x16 #define CHAR_CROSS_X 0x17 #define EXT_CTRL_CODE_COLOR 0x01 #define EXT_CTRL_CODE_HIGHLIGHT 0x02 #define EXT_CTRL_CODE_SHADOW 0x03 #define EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW 0x04 #define EXT_CTRL_CODE_PALETTE 0x05 #define EXT_CTRL_CODE_FONT 0x06 #define EXT_CTRL_CODE_RESET_FONT 0x07 #define EXT_CTRL_CODE_PAUSE 0x08 #define EXT_CTRL_CODE_PAUSE_UNTIL_PRESS 0x09 #define EXT_CTRL_CODE_WAIT_SE 0x0A #define EXT_CTRL_CODE_PLAY_BGM 0x0B #define EXT_CTRL_CODE_ESCAPE 0x0C #define EXT_CTRL_CODE_SHIFT_RIGHT 0x0D #define EXT_CTRL_CODE_SHIFT_DOWN 0x0E #define EXT_CTRL_CODE_FILL_WINDOW 0x0F #define EXT_CTRL_CODE_PLAY_SE 0x10 #define EXT_CTRL_CODE_CLEAR 0x11 #define EXT_CTRL_CODE_SKIP 0x12 #define EXT_CTRL_CODE_CLEAR_TO 0x13 #define EXT_CTRL_CODE_MIN_LETTER_SPACING 0x14 #define EXT_CTRL_CODE_JPN 0x15 #define EXT_CTRL_CODE_ENG 0x16 #define EXT_CTRL_CODE_PAUSE_MUSIC 0x17 #define EXT_CTRL_CODE_RESUME_MUSIC 0x18 #define TEXT_COLOR_TRANSPARENT 0x0 #define TEXT_COLOR_WHITE 0x1 #define TEXT_COLOR_DARK_GRAY 0x2 #define TEXT_COLOR_LIGHT_GRAY 0x3 #define TEXT_COLOR_RED 0x4 #define TEXT_COLOR_LIGHT_RED 0x5 #define TEXT_COLOR_GREEN 0x6 #define TEXT_COLOR_LIGHT_GREEN 0x7 #define TEXT_COLOR_BLUE 0x8 #define TEXT_COLOR_LIGHT_BLUE 0x9 #define TEXT_DYNAMIC_COLOR_1 0xA // Usually white #define TEXT_DYNAMIC_COLOR_2 0xB // Usually white w/ tinge of green #define TEXT_DYNAMIC_COLOR_3 0xC // Usually white #define TEXT_DYNAMIC_COLOR_4 0xD // Usually aquamarine #define TEXT_DYNAMIC_COLOR_5 0xE // Usually blue-green #define TEXT_DYNAMIC_COLOR_6 0xF // Usually cerulean #define PLACEHOLDER_ID_UNKNOWN 0x0 #define PLACEHOLDER_ID_PLAYER 0x1 #define PLACEHOLDER_ID_STRING_VAR_1 0x2 #define PLACEHOLDER_ID_STRING_VAR_2 0x3 #define PLACEHOLDER_ID_STRING_VAR_3 0x4 #define PLACEHOLDER_ID_KUN 0x5 #define PLACEHOLDER_ID_RIVAL 0x6 #define PLACEHOLDER_ID_VERSION 0x7 #define PLACEHOLDER_ID_MAGMA 0x8 #define PLACEHOLDER_ID_AQUA 0x9 #define PLACEHOLDER_ID_MAXIE 0xA #define PLACEHOLDER_ID_ARCHIE 0xB #define PLACEHOLDER_ID_GROUDON 0xC #define PLACEHOLDER_ID_KYOGRE 0xD #endif // GUARD_CHARACTERS_H ================================================ FILE: include/clear_save_data_screen.h ================================================ #ifndef GUARD_CLEAR_SAVE_DATA_SCREEN_H #define GUARD_CLEAR_SAVE_DATA_SCREEN_H void CB2_SaveClearScreen_Init(void); #endif //GUARD_CLEAR_SAVE_DATA_SCREEN_H ================================================ FILE: include/coins.h ================================================ #ifndef GUARD_COINS_H #define GUARD_COINS_H #include "global.h" void PrintCoinsString(u32 coinAmount); void ShowCoinsWindow(u32 coinAmount, u8 x, u8 y); void HideCoinsWindow(void); u16 GetCoins(void); void SetCoins(u16 coinAmount); bool8 AddCoins(u16 toAdd); bool8 RemoveCoins(u16 toSub); #endif // GUARD_COINS_H ================================================ FILE: include/config.h ================================================ #ifndef GUARD_CONFIG_H #define GUARD_CONFIG_H #include "global.h" // In the Generation 3 games, Asserts were used in various debug builds. // Ruby/Sapphire and Emerald do not have these asserts while Fire Red // still has them in the ROM. This is because the developers forgot // to define NDEBUG before release, however this has been changed as // Ruby's actual debug build does not use the AGBPrint features. // #define NDEBUG // Fire Red likely forgot to define NDEBUG/NOAGBPRN before release, leading // to the inclusion of asserts in the retail ROM. #ifndef NDEBUG #define PRETTY_PRINT_OFF (0) #define PRETTY_PRINT_MINI_PRINTF (1) #define PRETTY_PRINT_LIBC (2) #define LOG_HANDLER_AGB_PRINT (0) #define LOG_HANDLER_NOCASH_PRINT (1) #define LOG_HANDLER_MGBA_PRINT (2) // Use this switch to choose a handler for pretty printing. // NOTE: mini_printf supports a custom pretty printing formatter to display preproc encoded strings. (%S) // some libc distributions (especially dkp arm-libc) will fail to link pretty printing. #define PRETTY_PRINT_HANDLER (PRETTY_PRINT_OFF) // Use this switch to choose a handler for printf output. // NOTE: These will only work on the respective emulators and should not be used in a productive environment. // Some emulators or real hardware might (and is allowed to) crash if they are used. // AGB_PRINT is supported on respective debug units. #define LOG_HANDLER (LOG_HANDLER_AGB_PRINT) #endif // NDEBUG // Define the game version for use elsewhere #define GAME_VERSION VERSION_FIRE_RED // rev1 renamed the source folder for reasons #define CODE_ROOT "C:/WORK/POKeFRLG/Src/pm_lgfr_ose/source/" #define ABSPATH(x) (CODE_ROOT x) #ifdef ENGLISH #define UNITS_IMPERIAL #else #define UNITS_METRIC #endif // ENGLISH // Crashes may occur due to section reordering in the modern build, // so we force BUGFIX here. #if MODERN #ifndef BUGFIX #define BUGFIX #endif // BUGFIX #ifndef UBFIX #define UBFIX #endif // UBFIX #endif // MODERN #endif // GUARD_CONFIG_H ================================================ FILE: include/constants/abilities.h ================================================ #ifndef GUARD_CONSTANTS_ABILITIES_H #define GUARD_CONSTANTS_ABILITIES_H #define ABILITY_NONE 0 #define ABILITY_STENCH 1 #define ABILITY_DRIZZLE 2 #define ABILITY_SPEED_BOOST 3 #define ABILITY_BATTLE_ARMOR 4 #define ABILITY_STURDY 5 #define ABILITY_DAMP 6 #define ABILITY_LIMBER 7 #define ABILITY_SAND_VEIL 8 #define ABILITY_STATIC 9 #define ABILITY_VOLT_ABSORB 10 #define ABILITY_WATER_ABSORB 11 #define ABILITY_OBLIVIOUS 12 #define ABILITY_CLOUD_NINE 13 #define ABILITY_COMPOUND_EYES 14 #define ABILITY_INSOMNIA 15 #define ABILITY_COLOR_CHANGE 16 #define ABILITY_IMMUNITY 17 #define ABILITY_FLASH_FIRE 18 #define ABILITY_SHIELD_DUST 19 #define ABILITY_OWN_TEMPO 20 #define ABILITY_SUCTION_CUPS 21 #define ABILITY_INTIMIDATE 22 #define ABILITY_SHADOW_TAG 23 #define ABILITY_ROUGH_SKIN 24 #define ABILITY_WONDER_GUARD 25 #define ABILITY_LEVITATE 26 #define ABILITY_EFFECT_SPORE 27 #define ABILITY_SYNCHRONIZE 28 #define ABILITY_CLEAR_BODY 29 #define ABILITY_NATURAL_CURE 30 #define ABILITY_LIGHTNING_ROD 31 #define ABILITY_SERENE_GRACE 32 #define ABILITY_SWIFT_SWIM 33 #define ABILITY_CHLOROPHYLL 34 #define ABILITY_ILLUMINATE 35 #define ABILITY_TRACE 36 #define ABILITY_HUGE_POWER 37 #define ABILITY_POISON_POINT 38 #define ABILITY_INNER_FOCUS 39 #define ABILITY_MAGMA_ARMOR 40 #define ABILITY_WATER_VEIL 41 #define ABILITY_MAGNET_PULL 42 #define ABILITY_SOUNDPROOF 43 #define ABILITY_RAIN_DISH 44 #define ABILITY_SAND_STREAM 45 #define ABILITY_PRESSURE 46 #define ABILITY_THICK_FAT 47 #define ABILITY_EARLY_BIRD 48 #define ABILITY_FLAME_BODY 49 #define ABILITY_RUN_AWAY 50 #define ABILITY_KEEN_EYE 51 #define ABILITY_HYPER_CUTTER 52 #define ABILITY_PICKUP 53 #define ABILITY_TRUANT 54 #define ABILITY_HUSTLE 55 #define ABILITY_CUTE_CHARM 56 #define ABILITY_PLUS 57 #define ABILITY_MINUS 58 #define ABILITY_FORECAST 59 #define ABILITY_STICKY_HOLD 60 #define ABILITY_SHED_SKIN 61 #define ABILITY_GUTS 62 #define ABILITY_MARVEL_SCALE 63 #define ABILITY_LIQUID_OOZE 64 #define ABILITY_OVERGROW 65 #define ABILITY_BLAZE 66 #define ABILITY_TORRENT 67 #define ABILITY_SWARM 68 #define ABILITY_ROCK_HEAD 69 #define ABILITY_DROUGHT 70 #define ABILITY_ARENA_TRAP 71 #define ABILITY_VITAL_SPIRIT 72 #define ABILITY_WHITE_SMOKE 73 #define ABILITY_PURE_POWER 74 #define ABILITY_SHELL_ARMOR 75 #define ABILITY_CACOPHONY 76 #define ABILITY_AIR_LOCK 77 #define ABILITIES_COUNT 78 #endif // GUARD_CONSTANTS_ABILITIES_H ================================================ FILE: include/constants/battle.h ================================================ #ifndef GUARD_CONSTANTS_BATTLE_H #define GUARD_CONSTANTS_BATTLE_H /* * A battler may be in one of four positions on the field. The first bit determines * what side the battler is on, either the player's side or the opponent's side. * The second bit determines what flank the battler is on, either the left or right. * Note that the opponent's flanks are drawn corresponding to their perspective, so * their right mon appears on the left, and their left mon appears on the right. * The battler ID is usually the same as the position, except in the case of link battles. * * + ------------------------- + * | Opponent's side | * | Right Left | * | 3 1 | * | | * | Player's side | * | Left Right | * | 0 2 | * ----------------------------+ * | | * | | * +---------------------------+ */ #define MAX_BATTLERS_COUNT 4 #define B_POSITION_PLAYER_LEFT 0 #define B_POSITION_OPPONENT_LEFT 1 #define B_POSITION_PLAYER_RIGHT 2 #define B_POSITION_OPPONENT_RIGHT 3 // These macros can be used with either battler ID or positions to get the partner or the opposite mon #define BATTLE_OPPOSITE(id) ((id) ^ 1) #define BATTLE_PARTNER(id) ((id) ^ 2) #define B_SIDE_PLAYER 0 #define B_SIDE_OPPONENT 1 #define B_FLANK_LEFT 0 #define B_FLANK_RIGHT 1 #define BIT_SIDE 1 #define BIT_FLANK 2 // Battle Type Flags #define BATTLE_TYPE_DOUBLE (1 << 0) #define BATTLE_TYPE_LINK (1 << 1) #define BATTLE_TYPE_IS_MASTER (1 << 2) // In not-link battles, it's always set. #define BATTLE_TYPE_TRAINER (1 << 3) #define BATTLE_TYPE_FIRST_BATTLE (1 << 4) #define BATTLE_TYPE_LINK_IN_BATTLE (1 << 5) // Set on battle entry, cleared on exit. Checked rarely #define BATTLE_TYPE_MULTI (1 << 6) #define BATTLE_TYPE_SAFARI (1 << 7) #define BATTLE_TYPE_BATTLE_TOWER (1 << 8) #define BATTLE_TYPE_OLD_MAN_TUTORIAL (1 << 9) // Used in pokeemerald as BATTLE_TYPE_WALLY_TUTORIAL. #define BATTLE_TYPE_ROAMER (1 << 10) #define BATTLE_TYPE_EREADER_TRAINER (1 << 11) #define BATTLE_TYPE_KYOGRE_GROUDON (1 << 12) #define BATTLE_TYPE_LEGENDARY (1 << 13) #define BATTLE_TYPE_GHOST_UNVEILED (1 << 13) // Re-use of BATTLE_TYPE_LEGENDARY, when combined with BATTLE_TYPE_GHOST #define BATTLE_TYPE_REGI (1 << 14) #define BATTLE_TYPE_GHOST (1 << 15) // Used in pokeemerald as BATTLE_TYPE_TWO_OPPONENTS. #define BATTLE_TYPE_POKEDUDE (1 << 16) // Used in pokeemerald as BATTLE_TYPE_DOME. #define BATTLE_TYPE_WILD_SCRIPTED (1 << 17) // Used in pokeemerald as BATTLE_TYPE_PALACE. #define BATTLE_TYPE_LEGENDARY_FRLG (1 << 18) // Used in pokeemerald as BATTLE_TYPE_ARENA. #define BATTLE_TYPE_TRAINER_TOWER (1 << 19) // Used in pokeemerald as BATTLE_TYPE_FACTORY. #define IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(flags) ((flags) & BATTLE_TYPE_GHOST && !((flags) & BATTLE_TYPE_GHOST_UNVEILED)) #define IS_BATTLE_TYPE_GHOST_WITH_SCOPE(flags) ((flags) & BATTLE_TYPE_GHOST && (flags) & BATTLE_TYPE_GHOST_UNVEILED) #define RIVAL_BATTLE_HEAL_AFTER 1 #define RIVAL_BATTLE_TUTORIAL 3 // Battle Outcome defines #define B_OUTCOME_WON 1 #define B_OUTCOME_LOST 2 #define B_OUTCOME_DREW 3 #define B_OUTCOME_RAN 4 #define B_OUTCOME_PLAYER_TELEPORTED 5 #define B_OUTCOME_MON_FLED 6 #define B_OUTCOME_CAUGHT 7 #define B_OUTCOME_NO_SAFARI_BALLS 8 #define B_OUTCOME_FORFEITED 9 #define B_OUTCOME_MON_TELEPORTED 10 #define B_OUTCOME_LINK_BATTLE_RAN (1 << 7) // 128 // Non-volatile status conditions // These persist remain outside of battle and after switching out #define STATUS1_NONE 0 #define STATUS1_SLEEP (1 << 0 | 1 << 1 | 1 << 2) // First 3 bits (Number of turns to sleep) #define STATUS1_SLEEP_TURN(num) ((num) << 0) // Just for readability (or if rearranging statuses) #define STATUS1_POISON (1 << 3) #define STATUS1_BURN (1 << 4) #define STATUS1_FREEZE (1 << 5) #define STATUS1_PARALYSIS (1 << 6) #define STATUS1_TOXIC_POISON (1 << 7) #define STATUS1_TOXIC_COUNTER (1 << 8 | 1 << 9 | 1 << 10 | 1 << 11) #define STATUS1_TOXIC_TURN(num) ((num) << 8) #define STATUS1_PSN_ANY (STATUS1_POISON | STATUS1_TOXIC_POISON) #define STATUS1_ANY (STATUS1_SLEEP | STATUS1_POISON | STATUS1_BURN | STATUS1_FREEZE | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON) // Volatile status ailments // These are removed after exiting the battle or switching out #define STATUS2_CONFUSION (1 << 0 | 1 << 1 | 1 << 2) #define STATUS2_CONFUSION_TURN(num) ((num) << 0) #define STATUS2_FLINCHED (1 << 3) #define STATUS2_UPROAR (1 << 4 | 1 << 5 | 1 << 6) #define STATUS2_UPROAR_TURN(num) ((num) << 4) #define STATUS2_UNUSED (1 << 7) #define STATUS2_BIDE (1 << 8 | 1 << 9) #define STATUS2_BIDE_TURN(num) (((num) << 8) & STATUS2_BIDE) #define STATUS2_LOCK_CONFUSE (1 << 10 | 1 << 11) // e.g. Thrash #define STATUS2_LOCK_CONFUSE_TURN(num)((num) << 10) #define STATUS2_MULTIPLETURNS (1 << 12) #define STATUS2_WRAPPED (1 << 13 | 1 << 14 | 1 << 15) #define STATUS2_WRAPPED_TURN(num) ((num) << 13) #define STATUS2_INFATUATION (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19) // 4 bits, one for every battler #define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16) #define STATUS2_FOCUS_ENERGY (1 << 20) #define STATUS2_TRANSFORMED (1 << 21) #define STATUS2_RECHARGE (1 << 22) #define STATUS2_RAGE (1 << 23) #define STATUS2_SUBSTITUTE (1 << 24) #define STATUS2_DESTINY_BOND (1 << 25) #define STATUS2_ESCAPE_PREVENTION (1 << 26) #define STATUS2_NIGHTMARE (1 << 27) #define STATUS2_CURSED (1 << 28) #define STATUS2_FORESIGHT (1 << 29) #define STATUS2_DEFENSE_CURL (1 << 30) #define STATUS2_TORMENT (1 << 31) // Seems like per-battler statuses. Not quite sure how to categorize these #define STATUS3_LEECHSEED_BATTLER (1 << 0 | 1 << 1) // The battler to receive HP from Leech Seed #define STATUS3_LEECHSEED (1 << 2) #define STATUS3_ALWAYS_HITS (1 << 3 | 1 << 4) #define STATUS3_ALWAYS_HITS_TURN(num) (((num) << 3) & STATUS3_ALWAYS_HITS) // "Always Hits" is set as a 2 turn timer, i.e. next turn is the last turn when it's active #define STATUS3_PERISH_SONG (1 << 5) #define STATUS3_ON_AIR (1 << 6) #define STATUS3_UNDERGROUND (1 << 7) #define STATUS3_MINIMIZED (1 << 8) #define STATUS3_CHARGED_UP (1 << 9) #define STATUS3_ROOTED (1 << 10) #define STATUS3_YAWN (1 << 11 | 1 << 12) // Number of turns to sleep #define STATUS3_YAWN_TURN(num) (((num) << 11) & STATUS3_YAWN) #define STATUS3_IMPRISONED_OTHERS (1 << 13) #define STATUS3_GRUDGE (1 << 14) #define STATUS3_CANT_SCORE_A_CRIT (1 << 15) #define STATUS3_MUDSPORT (1 << 16) #define STATUS3_WATERSPORT (1 << 17) #define STATUS3_UNDERWATER (1 << 18) #define STATUS3_INTIMIDATE_POKES (1 << 19) #define STATUS3_TRACE (1 << 20) #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) // Not really sure what a "hitmarker" is. #define HITMARKER_WAKE_UP_CLEAR (1 << 4) // Cleared when waking up. Never set or checked. #define HITMARKER_SKIP_DMG_TRACK (1 << 5) #define HITMARKER_DESTINYBOND (1 << 6) #define HITMARKER_NO_ANIMATIONS (1 << 7) #define HITMARKER_IGNORE_SUBSTITUTE (1 << 8) #define HITMARKER_NO_ATTACKSTRING (1 << 9) #define HITMARKER_ATTACKSTRING_PRINTED (1 << 10) #define HITMARKER_NO_PPDEDUCT (1 << 11) #define HITMARKER_SWAP_ATTACKER_TARGET (1 << 12) #define HITMARKER_STATUS_ABILITY_EFFECT (1 << 13) #define HITMARKER_SYNCHRONISE_EFFECT (1 << 14) #define HITMARKER_RUN (1 << 15) #define HITMARKER_IGNORE_ON_AIR (1 << 16) #define HITMARKER_IGNORE_UNDERGROUND (1 << 17) #define HITMARKER_IGNORE_UNDERWATER (1 << 18) #define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) #define HITMARKER_PASSIVE_DAMAGE (1 << 20) #define HITMARKER_DISOBEDIENT_MOVE (1 << 21) #define HITMARKER_PLAYER_FAINTED (1 << 22) #define HITMARKER_ALLOW_NO_PP (1 << 23) #define HITMARKER_GRUDGE (1 << 24) #define HITMARKER_OBEYS (1 << 25) #define HITMARKER_NEVER_SET (1 << 26) // Cleared as part of a large group. Never set or checked #define HITMARKER_CHARGING (1 << 27) #define HITMARKER_FAINTED(battler) (gBitTable[battler] << 28) #define HITMARKER_FAINTED2(battler) ((1 << 28) << battler) // Per-side statuses that affect an entire party #define SIDE_STATUS_REFLECT (1 << 0) #define SIDE_STATUS_LIGHTSCREEN (1 << 1) #define SIDE_STATUS_X4 (1 << 2) #define SIDE_STATUS_SPIKES (1 << 4) #define SIDE_STATUS_SAFEGUARD (1 << 5) #define SIDE_STATUS_FUTUREATTACK (1 << 6) #define SIDE_STATUS_MIST (1 << 8) #define SIDE_STATUS_SPIKES_DAMAGED (1 << 9) // Flags describing move's result #define MOVE_RESULT_MISSED (1 << 0) #define MOVE_RESULT_SUPER_EFFECTIVE (1 << 1) #define MOVE_RESULT_NOT_VERY_EFFECTIVE (1 << 2) #define MOVE_RESULT_DOESNT_AFFECT_FOE (1 << 3) #define MOVE_RESULT_ONE_HIT_KO (1 << 4) #define MOVE_RESULT_FAILED (1 << 5) #define MOVE_RESULT_FOE_ENDURED (1 << 6) #define MOVE_RESULT_FOE_HUNG_ON (1 << 7) #define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED) // Battle Weather flags #define B_WEATHER_RAIN_TEMPORARY (1 << 0) #define B_WEATHER_RAIN_DOWNPOUR (1 << 1) // unused #define B_WEATHER_RAIN_PERMANENT (1 << 2) #define B_WEATHER_RAIN (B_WEATHER_RAIN_TEMPORARY | B_WEATHER_RAIN_DOWNPOUR | B_WEATHER_RAIN_PERMANENT) #define B_WEATHER_SANDSTORM_TEMPORARY (1 << 3) #define B_WEATHER_SANDSTORM_PERMANENT (1 << 4) #define B_WEATHER_SANDSTORM (B_WEATHER_SANDSTORM_TEMPORARY | B_WEATHER_SANDSTORM_PERMANENT) #define B_WEATHER_SUN_TEMPORARY (1 << 5) #define B_WEATHER_SUN_PERMANENT (1 << 6) #define B_WEATHER_SUN (B_WEATHER_SUN_TEMPORARY | B_WEATHER_SUN_PERMANENT) #define B_WEATHER_HAIL_TEMPORARY (1 << 7) #define B_WEATHER_HAIL (B_WEATHER_HAIL_TEMPORARY) #define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL) // Move Effects #define MOVE_EFFECT_SLEEP 1 #define MOVE_EFFECT_POISON 2 #define MOVE_EFFECT_BURN 3 #define MOVE_EFFECT_FREEZE 4 #define MOVE_EFFECT_PARALYSIS 5 #define MOVE_EFFECT_TOXIC 6 #define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_TOXIC // All above move effects apply primary status #define MOVE_EFFECT_CONFUSION 7 #define MOVE_EFFECT_FLINCH 8 #define MOVE_EFFECT_TRI_ATTACK 9 #define MOVE_EFFECT_UPROAR 10 #define MOVE_EFFECT_PAYDAY 11 #define MOVE_EFFECT_CHARGING 12 #define MOVE_EFFECT_WRAP 13 #define MOVE_EFFECT_RECOIL_25 14 #define MOVE_EFFECT_ATK_PLUS_1 15 #define MOVE_EFFECT_DEF_PLUS_1 16 #define MOVE_EFFECT_SPD_PLUS_1 17 #define MOVE_EFFECT_SP_ATK_PLUS_1 18 #define MOVE_EFFECT_SP_DEF_PLUS_1 19 #define MOVE_EFFECT_ACC_PLUS_1 20 #define MOVE_EFFECT_EVS_PLUS_1 21 #define MOVE_EFFECT_ATK_MINUS_1 22 #define MOVE_EFFECT_DEF_MINUS_1 23 #define MOVE_EFFECT_SPD_MINUS_1 24 #define MOVE_EFFECT_SP_ATK_MINUS_1 25 #define MOVE_EFFECT_SP_DEF_MINUS_1 26 #define MOVE_EFFECT_ACC_MINUS_1 27 #define MOVE_EFFECT_EVS_MINUS_1 28 #define MOVE_EFFECT_RECHARGE 29 #define MOVE_EFFECT_RAGE 30 #define MOVE_EFFECT_STEAL_ITEM 31 #define MOVE_EFFECT_PREVENT_ESCAPE 32 #define MOVE_EFFECT_NIGHTMARE 33 #define MOVE_EFFECT_ALL_STATS_UP 34 #define MOVE_EFFECT_RAPIDSPIN 35 #define MOVE_EFFECT_REMOVE_PARALYSIS 36 #define MOVE_EFFECT_ATK_DEF_DOWN 37 #define MOVE_EFFECT_RECOIL_33 38 #define MOVE_EFFECT_ATK_PLUS_2 39 #define MOVE_EFFECT_DEF_PLUS_2 40 #define MOVE_EFFECT_SPD_PLUS_2 41 #define MOVE_EFFECT_SP_ATK_PLUS_2 42 #define MOVE_EFFECT_SP_DEF_PLUS_2 43 #define MOVE_EFFECT_ACC_PLUS_2 44 #define MOVE_EFFECT_EVS_PLUS_2 45 #define MOVE_EFFECT_ATK_MINUS_2 46 #define MOVE_EFFECT_DEF_MINUS_2 47 #define MOVE_EFFECT_SPD_MINUS_2 48 #define MOVE_EFFECT_SP_ATK_MINUS_2 49 #define MOVE_EFFECT_SP_DEF_MINUS_2 50 #define MOVE_EFFECT_ACC_MINUS_2 51 #define MOVE_EFFECT_EVS_MINUS_2 52 #define MOVE_EFFECT_THRASH 53 #define MOVE_EFFECT_KNOCK_OFF 54 #define MOVE_EFFECT_NOTHING_37 55 #define MOVE_EFFECT_NOTHING_38 56 #define MOVE_EFFECT_NOTHING_39 57 #define MOVE_EFFECT_NOTHING_3A 58 #define MOVE_EFFECT_SP_ATK_TWO_DOWN 59 #define NUM_MOVE_EFFECTS 60 #define MOVE_EFFECT_AFFECTS_USER (1 << 6) // 64 #define MOVE_EFFECT_CERTAIN (1 << 7) // 128 // Battle terrain defines for gBattleTerrain. #define BATTLE_TERRAIN_GRASS 0 #define BATTLE_TERRAIN_LONG_GRASS 1 #define BATTLE_TERRAIN_SAND 2 #define BATTLE_TERRAIN_UNDERWATER 3 #define BATTLE_TERRAIN_WATER 4 #define BATTLE_TERRAIN_POND 5 #define BATTLE_TERRAIN_MOUNTAIN 6 #define BATTLE_TERRAIN_CAVE 7 #define BATTLE_TERRAIN_BUILDING 8 #define BATTLE_TERRAIN_PLAIN 9 #define BATTLE_TERRAIN_LINK 10 #define BATTLE_TERRAIN_GYM 11 #define BATTLE_TERRAIN_LEADER 12 #define BATTLE_TERRAIN_INDOOR_2 13 #define BATTLE_TERRAIN_INDOOR_1 14 #define BATTLE_TERRAIN_LORELEI 15 #define BATTLE_TERRAIN_BRUNO 16 #define BATTLE_TERRAIN_AGATHA 17 #define BATTLE_TERRAIN_LANCE 18 #define BATTLE_TERRAIN_CHAMPION 19 #define B_WAIT_TIME_LONG 64 #define B_WAIT_TIME_MED 48 #define B_WAIT_TIME_SHORT 32 #define B_WAIT_TIME_SHORT_UNSKIPPABLE 33 #define CASTFORM_NORMAL 0 #define CASTFORM_FIRE 1 #define CASTFORM_WATER 2 #define CASTFORM_ICE 3 #define NUM_CASTFORM_FORMS 4 #define CASTFORM_SUBSTITUTE (1 << 7) #define FLEE_ITEM 1 #define FLEE_ABILITY 2 // Return value for IsRunningFromBattleImpossible. #define BATTLE_RUN_SUCCESS 0 #define BATTLE_RUN_FORBIDDEN 1 #define BATTLE_RUN_FAILURE 2 // Window Ids for sTextOnWindowsInfo_Normal #define B_WIN_MSG 0 #define B_WIN_ACTION_PROMPT 1 // "What will {x} do?" #define B_WIN_ACTION_MENU 2 // "Fight/Pokémon/Bag/Run" menu #define B_WIN_MOVE_NAME_1 3 // Top left #define B_WIN_MOVE_NAME_2 4 // Top right #define B_WIN_MOVE_NAME_3 5 // Bottom left #define B_WIN_MOVE_NAME_4 6 // Bottom right #define B_WIN_PP 7 #define B_WIN_MOVE_TYPE 8 #define B_WIN_PP_REMAINING 9 #define B_WIN_DUMMY 10 #define B_WIN_SWITCH_PROMPT 11 // "Switch which?" #define B_WIN_LEVEL_UP_BOX 12 #define B_WIN_LEVEL_UP_BANNER 13 #define B_WIN_YESNO 14 #define B_WIN_VS_PLAYER 15 #define B_WIN_VS_OPPONENT 16 #define B_WIN_VS_MULTI_PLAYER_1 17 #define B_WIN_VS_MULTI_PLAYER_2 18 #define B_WIN_VS_MULTI_PLAYER_3 19 #define B_WIN_VS_MULTI_PLAYER_4 20 #define B_WIN_VS_OUTCOME_DRAW 21 #define B_WIN_VS_OUTCOME_LEFT 22 #define B_WIN_VS_OUTCOME_RIGHT 23 #define B_WIN_OAK_OLD_MAN 24 #define B_TEXT_FLAG_NPC_CONTEXT_FONT (1 << 6) #define B_TEXT_FLAG_WINDOW_CLEAR (1 << 7) // Indicator for the party summary bar to display an empty slot. #define HP_EMPTY_SLOT 0xFFFF #endif // GUARD_CONSTANTS_BATTLE_H ================================================ FILE: include/constants/battle_ai.h ================================================ #ifndef GUARD_CONSTANTS_BATTLE_AI_H #define GUARD_CONSTANTS_BATTLE_AI_H // battlers #define AI_TARGET 0 #define AI_USER 1 #define AI_TARGET_PARTNER 2 #define AI_USER_PARTNER 3 // get_type command #define AI_TYPE1_TARGET 0 #define AI_TYPE1_USER 1 #define AI_TYPE2_TARGET 2 #define AI_TYPE2_USER 3 #define AI_TYPE_MOVE 4 // type effectiveness #define AI_EFFECTIVENESS_x4 160 #define AI_EFFECTIVENESS_x2 80 #define AI_EFFECTIVENESS_x1 40 #define AI_EFFECTIVENESS_x0_5 20 #define AI_EFFECTIVENESS_x0_25 10 #define AI_EFFECTIVENESS_x0 0 // ai weather #define AI_WEATHER_SUN 0 #define AI_WEATHER_RAIN 1 #define AI_WEATHER_SANDSTORM 2 #define AI_WEATHER_HAIL 3 // get_how_powerful_move_is #define MOVE_POWER_DISCOURAGED 0 #define MOVE_NOT_MOST_POWERFUL 1 #define MOVE_MOST_POWERFUL 2 // script's table id to bit #define AI_SCRIPT_CHECK_BAD_MOVE (1 << 0) #define AI_SCRIPT_CHECK_VIABILITY (1 << 1) #define AI_SCRIPT_TRY_TO_FAINT (1 << 2) #define AI_SCRIPT_SETUP_FIRST_TURN (1 << 3) #define AI_SCRIPT_RISKY (1 << 4) #define AI_SCRIPT_PREFER_STRONGEST_MOVE (1 << 5) #define AI_SCRIPT_PREFER_BATON_PASS (1 << 6) #define AI_SCRIPT_DOUBLE_BATTLE (1 << 7) #define AI_SCRIPT_HP_AWARE (1 << 8) #define AI_SCRIPT_UNKNOWN (1 << 9) // 10 - 28 are not used #define AI_SCRIPT_ROAMING (1 << 29) #define AI_SCRIPT_SAFARI (1 << 30) #define AI_SCRIPT_FIRST_BATTLE (1 << 31) #endif // GUARD_CONSTANTS_BATTLE_AI_H ================================================ FILE: include/constants/battle_anim.h ================================================ #ifndef GUARD_CONSTANTS_BATTLE_ANIM_H #define GUARD_CONSTANTS_BATTLE_ANIM_H // Sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. #define GET_TRUE_SPRITE_INDEX(i) ((i - ANIM_SPRITES_START)) // Particle ids. #define ANIM_SPRITES_START 10000 #define ANIM_TAG_BONE (ANIM_SPRITES_START + 0) #define ANIM_TAG_SPARK (ANIM_SPRITES_START + 1) #define ANIM_TAG_PENCIL (ANIM_SPRITES_START + 2) #define ANIM_TAG_AIR_WAVE (ANIM_SPRITES_START + 3) #define ANIM_TAG_ORB (ANIM_SPRITES_START + 4) #define ANIM_TAG_SWORD (ANIM_SPRITES_START + 5) #define ANIM_TAG_SEED (ANIM_SPRITES_START + 6) #define ANIM_TAG_EXPLOSION_6 (ANIM_SPRITES_START + 7) #define ANIM_TAG_PINK_ORB (ANIM_SPRITES_START + 8) // unused #define ANIM_TAG_GUST (ANIM_SPRITES_START + 9) #define ANIM_TAG_ICE_CUBE (ANIM_SPRITES_START + 10) #define ANIM_TAG_SPARK_2 (ANIM_SPRITES_START + 11) #define ANIM_TAG_ORANGE (ANIM_SPRITES_START + 12) // unused #define ANIM_TAG_YELLOW_BALL (ANIM_SPRITES_START + 13) #define ANIM_TAG_LOCK_ON (ANIM_SPRITES_START + 14) #define ANIM_TAG_TIED_BAG (ANIM_SPRITES_START + 15) #define ANIM_TAG_BLACK_SMOKE (ANIM_SPRITES_START + 16) #define ANIM_TAG_BLACK_BALL (ANIM_SPRITES_START + 17) #define ANIM_TAG_CONVERSION (ANIM_SPRITES_START + 18) #define ANIM_TAG_GLASS (ANIM_SPRITES_START + 19) // unused #define ANIM_TAG_HORN_HIT (ANIM_SPRITES_START + 20) #define ANIM_TAG_HIT (ANIM_SPRITES_START + 21) #define ANIM_TAG_HIT_2 (ANIM_SPRITES_START + 22) #define ANIM_TAG_BLUE_SHARDS (ANIM_SPRITES_START + 23) // unused #define ANIM_TAG_CLOSING_EYE (ANIM_SPRITES_START + 24) // unused #define ANIM_TAG_WAVING_HAND (ANIM_SPRITES_START + 25) // unused #define ANIM_TAG_HIT_DUPLICATE (ANIM_SPRITES_START + 26) // unused #define ANIM_TAG_LEER (ANIM_SPRITES_START + 27) #define ANIM_TAG_BLUE_BURST (ANIM_SPRITES_START + 28) // unused #define ANIM_TAG_SMALL_EMBER (ANIM_SPRITES_START + 29) #define ANIM_TAG_GRAY_SMOKE (ANIM_SPRITES_START + 30) #define ANIM_TAG_BLUE_STAR (ANIM_SPRITES_START + 31) #define ANIM_TAG_BUBBLE_BURST (ANIM_SPRITES_START + 32) #define ANIM_TAG_FIRE (ANIM_SPRITES_START + 33) #define ANIM_TAG_SPINNING_FIRE (ANIM_SPRITES_START + 34) // unused #define ANIM_TAG_FIRE_PLUME (ANIM_SPRITES_START + 35) #define ANIM_TAG_LIGHTNING_2 (ANIM_SPRITES_START + 36) // unused #define ANIM_TAG_LIGHTNING (ANIM_SPRITES_START + 37) #define ANIM_TAG_CLAW_SLASH_2 (ANIM_SPRITES_START + 38) // unused #define ANIM_TAG_CLAW_SLASH (ANIM_SPRITES_START + 39) #define ANIM_TAG_SCRATCH_3 (ANIM_SPRITES_START + 40) // unused #define ANIM_TAG_SCRATCH_2 (ANIM_SPRITES_START + 41) // unused #define ANIM_TAG_BUBBLE_BURST_2 (ANIM_SPRITES_START + 42) // unused #define ANIM_TAG_ICE_CHUNK (ANIM_SPRITES_START + 43) #define ANIM_TAG_GLASS_2 (ANIM_SPRITES_START + 44) // unused #define ANIM_TAG_PINK_HEART_2 (ANIM_SPRITES_START + 45) // unused #define ANIM_TAG_SAP_DRIP (ANIM_SPRITES_START + 46) // unused #define ANIM_TAG_SAP_DRIP_2 (ANIM_SPRITES_START + 47) // unused #define ANIM_TAG_SPARKLE_1 (ANIM_SPRITES_START + 48) #define ANIM_TAG_SPARKLE_2 (ANIM_SPRITES_START + 49) #define ANIM_TAG_HUMANOID_FOOT (ANIM_SPRITES_START + 50) #define ANIM_TAG_MONSTER_FOOT (ANIM_SPRITES_START + 51) #define ANIM_TAG_HUMANOID_HAND (ANIM_SPRITES_START + 52) // unused #define ANIM_TAG_NOISE_LINE (ANIM_SPRITES_START + 53) #define ANIM_TAG_YELLOW_UNK (ANIM_SPRITES_START + 54) // unused #define ANIM_TAG_RED_FIST (ANIM_SPRITES_START + 55) // unused #define ANIM_TAG_SLAM_HIT (ANIM_SPRITES_START + 56) #define ANIM_TAG_RING (ANIM_SPRITES_START + 57) // unused #define ANIM_TAG_ROCKS (ANIM_SPRITES_START + 58) #define ANIM_TAG_Z (ANIM_SPRITES_START + 59) // unused #define ANIM_TAG_YELLOW_UNK_2 (ANIM_SPRITES_START + 60) // unused #define ANIM_TAG_AIR_SLASH (ANIM_SPRITES_START + 61) // unused #define ANIM_TAG_SPINNING_GREEN_ORBS (ANIM_SPRITES_START + 62) // unused #define ANIM_TAG_LEAF (ANIM_SPRITES_START + 63) #define ANIM_TAG_FINGER (ANIM_SPRITES_START + 64) #define ANIM_TAG_POISON_POWDER (ANIM_SPRITES_START + 65) #define ANIM_TAG_BROWN_TRIANGLE (ANIM_SPRITES_START + 66) // unused #define ANIM_TAG_SLEEP_POWDER (ANIM_SPRITES_START + 67) #define ANIM_TAG_STUN_SPORE (ANIM_SPRITES_START + 68) #define ANIM_TAG_POWDER (ANIM_SPRITES_START + 69) // unused #define ANIM_TAG_SPARKLE_3 (ANIM_SPRITES_START + 70) #define ANIM_TAG_SPARKLE_4 (ANIM_SPRITES_START + 71) #define ANIM_TAG_MUSIC_NOTES (ANIM_SPRITES_START + 72) #define ANIM_TAG_DUCK (ANIM_SPRITES_START + 73) #define ANIM_TAG_MUD_SAND (ANIM_SPRITES_START + 74) #define ANIM_TAG_ALERT (ANIM_SPRITES_START + 75) #define ANIM_TAG_BLUE_FLAMES (ANIM_SPRITES_START + 76) // unused #define ANIM_TAG_BLUE_FLAMES_2 (ANIM_SPRITES_START + 77) // unused #define ANIM_TAG_SHOCK_4 (ANIM_SPRITES_START + 78) // unused #define ANIM_TAG_SHOCK (ANIM_SPRITES_START + 79) #define ANIM_TAG_BELL_2 (ANIM_SPRITES_START + 80) // unused #define ANIM_TAG_PINK_GLOVE (ANIM_SPRITES_START + 81) // unused #define ANIM_TAG_BLUE_LINES (ANIM_SPRITES_START + 82) // unused #define ANIM_TAG_IMPACT_3 (ANIM_SPRITES_START + 83) // unused #define ANIM_TAG_IMPACT_2 (ANIM_SPRITES_START + 84) // unused #define ANIM_TAG_RETICLE (ANIM_SPRITES_START + 85) // unused #define ANIM_TAG_BREATH (ANIM_SPRITES_START + 86) #define ANIM_TAG_ANGER (ANIM_SPRITES_START + 87) #define ANIM_TAG_SNOWBALL (ANIM_SPRITES_START + 88) // unused #define ANIM_TAG_VINE (ANIM_SPRITES_START + 89) // unused #define ANIM_TAG_SWORD_2 (ANIM_SPRITES_START + 90) // unused #define ANIM_TAG_CLAPPING (ANIM_SPRITES_START + 91) // unused #define ANIM_TAG_RED_TUBE (ANIM_SPRITES_START + 92) // unused #define ANIM_TAG_AMNESIA (ANIM_SPRITES_START + 93) #define ANIM_TAG_STRING_2 (ANIM_SPRITES_START + 94) // unused #define ANIM_TAG_PENCIL_2 (ANIM_SPRITES_START + 95) // unused #define ANIM_TAG_PETAL (ANIM_SPRITES_START + 96) // unused #define ANIM_TAG_BENT_SPOON (ANIM_SPRITES_START + 97) #define ANIM_TAG_WEB (ANIM_SPRITES_START + 98) // unused #define ANIM_TAG_MILK_BOTTLE (ANIM_SPRITES_START + 99) #define ANIM_TAG_COIN (ANIM_SPRITES_START + 100) #define ANIM_TAG_CRACKED_EGG (ANIM_SPRITES_START + 101) // unused #define ANIM_TAG_HATCHED_EGG (ANIM_SPRITES_START + 102) // unused #define ANIM_TAG_FRESH_EGG (ANIM_SPRITES_START + 103) // unused #define ANIM_TAG_FANGS (ANIM_SPRITES_START + 104) // unused #define ANIM_TAG_EXPLOSION_2 (ANIM_SPRITES_START + 105) // unused #define ANIM_TAG_EXPLOSION_3 (ANIM_SPRITES_START + 106) // unused #define ANIM_TAG_WATER_DROPLET (ANIM_SPRITES_START + 107) // unused #define ANIM_TAG_WATER_DROPLET_2 (ANIM_SPRITES_START + 108) // unused #define ANIM_TAG_SEED_2 (ANIM_SPRITES_START + 109) // unused #define ANIM_TAG_SPROUT (ANIM_SPRITES_START + 110) // unused #define ANIM_TAG_RED_WAND (ANIM_SPRITES_START + 111) // unused #define ANIM_TAG_PURPLE_GREEN_UNK (ANIM_SPRITES_START + 112) // unused #define ANIM_TAG_WATER_COLUMN (ANIM_SPRITES_START + 113) // unused #define ANIM_TAG_MUD_UNK (ANIM_SPRITES_START + 114) // unused #define ANIM_TAG_RAIN_DROPS (ANIM_SPRITES_START + 115) #define ANIM_TAG_FURY_SWIPES (ANIM_SPRITES_START + 116) // unused #define ANIM_TAG_VINE_2 (ANIM_SPRITES_START + 117) // unused #define ANIM_TAG_TEETH (ANIM_SPRITES_START + 118) // unused #define ANIM_TAG_BONE_2 (ANIM_SPRITES_START + 119) // unused #define ANIM_TAG_WHITE_BAG (ANIM_SPRITES_START + 120) // unused #define ANIM_TAG_UNKNOWN (ANIM_SPRITES_START + 121) // unused #define ANIM_TAG_PURPLE_CORAL (ANIM_SPRITES_START + 122) // unused #define ANIM_TAG_PURPLE_DROPLET (ANIM_SPRITES_START + 123) // unused #define ANIM_TAG_SHOCK_2 (ANIM_SPRITES_START + 124) // unused #define ANIM_TAG_CLOSING_EYE_2 (ANIM_SPRITES_START + 125) // unused #define ANIM_TAG_METAL_BALL (ANIM_SPRITES_START + 126) // unused #define ANIM_TAG_MONSTER_DOLL (ANIM_SPRITES_START + 127) // unused #define ANIM_TAG_WHIRLWIND (ANIM_SPRITES_START + 128) // unused #define ANIM_TAG_WHIRLWIND_2 (ANIM_SPRITES_START + 129) // unused #define ANIM_TAG_EXPLOSION_4 (ANIM_SPRITES_START + 130) // unused #define ANIM_TAG_EXPLOSION_5 (ANIM_SPRITES_START + 131) // unused #define ANIM_TAG_TONGUE (ANIM_SPRITES_START + 132) // unused #define ANIM_TAG_SMOKE (ANIM_SPRITES_START + 133) // unused #define ANIM_TAG_SMOKE_2 (ANIM_SPRITES_START + 134) // unused #define ANIM_TAG_IMPACT (ANIM_SPRITES_START + 135) #define ANIM_TAG_CIRCLE_IMPACT (ANIM_SPRITES_START + 136) #define ANIM_TAG_SCRATCH (ANIM_SPRITES_START + 137) #define ANIM_TAG_CUT (ANIM_SPRITES_START + 138) #define ANIM_TAG_SHARP_TEETH (ANIM_SPRITES_START + 139) #define ANIM_TAG_RAINBOW_RINGS (ANIM_SPRITES_START + 140) #define ANIM_TAG_ICE_CRYSTALS (ANIM_SPRITES_START + 141) #define ANIM_TAG_ICE_SPIKES (ANIM_SPRITES_START + 142) #define ANIM_TAG_HANDS_AND_FEET (ANIM_SPRITES_START + 143) #define ANIM_TAG_MIST_CLOUD (ANIM_SPRITES_START + 144) #define ANIM_TAG_CLAMP (ANIM_SPRITES_START + 145) #define ANIM_TAG_BUBBLE (ANIM_SPRITES_START + 146) #define ANIM_TAG_ORBS (ANIM_SPRITES_START + 147) #define ANIM_TAG_WATER_IMPACT (ANIM_SPRITES_START + 148) #define ANIM_TAG_WATER_ORB (ANIM_SPRITES_START + 149) #define ANIM_TAG_POISON_BUBBLE (ANIM_SPRITES_START + 150) #define ANIM_TAG_TOXIC_BUBBLE (ANIM_SPRITES_START + 151) #define ANIM_TAG_SPIKES (ANIM_SPRITES_START + 152) #define ANIM_TAG_HORN_HIT_2 (ANIM_SPRITES_START + 153) #define ANIM_TAG_AIR_WAVE_2 (ANIM_SPRITES_START + 154) #define ANIM_TAG_SMALL_BUBBLES (ANIM_SPRITES_START + 155) #define ANIM_TAG_ROUND_SHADOW (ANIM_SPRITES_START + 156) #define ANIM_TAG_SUNLIGHT (ANIM_SPRITES_START + 157) #define ANIM_TAG_SPORE (ANIM_SPRITES_START + 158) #define ANIM_TAG_FLOWER (ANIM_SPRITES_START + 159) #define ANIM_TAG_RAZOR_LEAF (ANIM_SPRITES_START + 160) #define ANIM_TAG_NEEDLE (ANIM_SPRITES_START + 161) #define ANIM_TAG_WHIRLWIND_LINES (ANIM_SPRITES_START + 162) #define ANIM_TAG_GOLD_RING (ANIM_SPRITES_START + 163) #define ANIM_TAG_PURPLE_RING (ANIM_SPRITES_START + 164) #define ANIM_TAG_BLUE_RING (ANIM_SPRITES_START + 165) #define ANIM_TAG_GREEN_LIGHT_WALL (ANIM_SPRITES_START + 166) #define ANIM_TAG_BLUE_LIGHT_WALL (ANIM_SPRITES_START + 167) #define ANIM_TAG_RED_LIGHT_WALL (ANIM_SPRITES_START + 168) #define ANIM_TAG_GRAY_LIGHT_WALL (ANIM_SPRITES_START + 169) #define ANIM_TAG_ORANGE_LIGHT_WALL (ANIM_SPRITES_START + 170) #define ANIM_TAG_BLACK_BALL_2 (ANIM_SPRITES_START + 171) #define ANIM_TAG_PURPLE_GAS_CLOUD (ANIM_SPRITES_START + 172) #define ANIM_TAG_SPARK_H (ANIM_SPRITES_START + 173) #define ANIM_TAG_YELLOW_STAR (ANIM_SPRITES_START + 174) #define ANIM_TAG_LARGE_FRESH_EGG (ANIM_SPRITES_START + 175) #define ANIM_TAG_SHADOW_BALL (ANIM_SPRITES_START + 176) #define ANIM_TAG_LICK (ANIM_SPRITES_START + 177) #define ANIM_TAG_VOID_LINES (ANIM_SPRITES_START + 178) #define ANIM_TAG_STRING (ANIM_SPRITES_START + 179) #define ANIM_TAG_WEB_THREAD (ANIM_SPRITES_START + 180) #define ANIM_TAG_SPIDER_WEB (ANIM_SPRITES_START + 181) #define ANIM_TAG_LIGHTBULB (ANIM_SPRITES_START + 182) // unused #define ANIM_TAG_SLASH (ANIM_SPRITES_START + 183) #define ANIM_TAG_FOCUS_ENERGY (ANIM_SPRITES_START + 184) #define ANIM_TAG_SPHERE_TO_CUBE (ANIM_SPRITES_START + 185) #define ANIM_TAG_TENDRILS (ANIM_SPRITES_START + 186) #define ANIM_TAG_EYE (ANIM_SPRITES_START + 187) #define ANIM_TAG_WHITE_SHADOW (ANIM_SPRITES_START + 188) #define ANIM_TAG_TEAL_ALERT (ANIM_SPRITES_START + 189) #define ANIM_TAG_OPENING_EYE (ANIM_SPRITES_START + 190) #define ANIM_TAG_ROUND_WHITE_HALO (ANIM_SPRITES_START + 191) #define ANIM_TAG_FANG_ATTACK (ANIM_SPRITES_START + 192) #define ANIM_TAG_PURPLE_HAND_OUTLINE (ANIM_SPRITES_START + 193) #define ANIM_TAG_MOON (ANIM_SPRITES_START + 194) #define ANIM_TAG_GREEN_SPARKLE (ANIM_SPRITES_START + 195) #define ANIM_TAG_SPIRAL (ANIM_SPRITES_START + 196) #define ANIM_TAG_SNORE_Z (ANIM_SPRITES_START + 197) #define ANIM_TAG_EXPLOSION (ANIM_SPRITES_START + 198) #define ANIM_TAG_NAIL (ANIM_SPRITES_START + 199) #define ANIM_TAG_GHOSTLY_SPIRIT (ANIM_SPRITES_START + 200) #define ANIM_TAG_WARM_ROCK (ANIM_SPRITES_START + 201) #define ANIM_TAG_BREAKING_EGG (ANIM_SPRITES_START + 202) #define ANIM_TAG_THIN_RING (ANIM_SPRITES_START + 203) #define ANIM_TAG_PUNCH_IMPACT (ANIM_SPRITES_START + 204) // unused #define ANIM_TAG_BELL (ANIM_SPRITES_START + 205) #define ANIM_TAG_MUSIC_NOTES_2 (ANIM_SPRITES_START + 206) #define ANIM_TAG_SPEED_DUST (ANIM_SPRITES_START + 207) #define ANIM_TAG_TORN_METAL (ANIM_SPRITES_START + 208) #define ANIM_TAG_THOUGHT_BUBBLE (ANIM_SPRITES_START + 209) #define ANIM_TAG_MAGENTA_HEART (ANIM_SPRITES_START + 210) #define ANIM_TAG_ELECTRIC_ORBS (ANIM_SPRITES_START + 211) #define ANIM_TAG_CIRCLE_OF_LIGHT (ANIM_SPRITES_START + 212) #define ANIM_TAG_ELECTRICITY (ANIM_SPRITES_START + 213) #define ANIM_TAG_FINGER_2 (ANIM_SPRITES_START + 214) #define ANIM_TAG_MOVEMENT_WAVES (ANIM_SPRITES_START + 215) #define ANIM_TAG_RED_HEART (ANIM_SPRITES_START + 216) #define ANIM_TAG_RED_ORB (ANIM_SPRITES_START + 217) #define ANIM_TAG_EYE_SPARKLE (ANIM_SPRITES_START + 218) #define ANIM_TAG_PINK_HEART (ANIM_SPRITES_START + 219) #define ANIM_TAG_ANGEL (ANIM_SPRITES_START + 220) #define ANIM_TAG_DEVIL (ANIM_SPRITES_START + 221) #define ANIM_TAG_SWIPE (ANIM_SPRITES_START + 222) #define ANIM_TAG_ROOTS (ANIM_SPRITES_START + 223) #define ANIM_TAG_ITEM_BAG (ANIM_SPRITES_START + 224) #define ANIM_TAG_JAGGED_MUSIC_NOTE (ANIM_SPRITES_START + 225) #define ANIM_TAG_POKEBALL (ANIM_SPRITES_START + 226) #define ANIM_TAG_SPOTLIGHT (ANIM_SPRITES_START + 227) #define ANIM_TAG_LETTER_Z (ANIM_SPRITES_START + 228) #define ANIM_TAG_RAPID_SPIN (ANIM_SPRITES_START + 229) #define ANIM_TAG_TRI_ATTACK_TRIANGLE (ANIM_SPRITES_START + 230) #define ANIM_TAG_WISP_ORB (ANIM_SPRITES_START + 231) #define ANIM_TAG_WISP_FIRE (ANIM_SPRITES_START + 232) #define ANIM_TAG_GOLD_STARS (ANIM_SPRITES_START + 233) #define ANIM_TAG_ECLIPSING_ORB (ANIM_SPRITES_START + 234) #define ANIM_TAG_GRAY_ORB (ANIM_SPRITES_START + 235) #define ANIM_TAG_BLUE_ORB (ANIM_SPRITES_START + 236) #define ANIM_TAG_RED_ORB_2 (ANIM_SPRITES_START + 237) #define ANIM_TAG_PINK_PETAL (ANIM_SPRITES_START + 238) #define ANIM_TAG_PAIN_SPLIT (ANIM_SPRITES_START + 239) #define ANIM_TAG_CONFETTI (ANIM_SPRITES_START + 240) #define ANIM_TAG_GREEN_STAR (ANIM_SPRITES_START + 241) #define ANIM_TAG_PINK_CLOUD (ANIM_SPRITES_START + 242) #define ANIM_TAG_SWEAT_DROP (ANIM_SPRITES_START + 243) #define ANIM_TAG_GUARD_RING (ANIM_SPRITES_START + 244) #define ANIM_TAG_PURPLE_SCRATCH (ANIM_SPRITES_START + 245) #define ANIM_TAG_PURPLE_SWIPE (ANIM_SPRITES_START + 246) #define ANIM_TAG_TAG_HAND (ANIM_SPRITES_START + 247) #define ANIM_TAG_SMALL_RED_EYE (ANIM_SPRITES_START + 248) #define ANIM_TAG_HOLLOW_ORB (ANIM_SPRITES_START + 249) #define ANIM_TAG_X_SIGN (ANIM_SPRITES_START + 250) #define ANIM_TAG_BLUEGREEN_ORB (ANIM_SPRITES_START + 251) #define ANIM_TAG_PAW_PRINT (ANIM_SPRITES_START + 252) #define ANIM_TAG_PURPLE_FLAME (ANIM_SPRITES_START + 253) #define ANIM_TAG_RED_BALL (ANIM_SPRITES_START + 254) #define ANIM_TAG_SMELLINGSALT_EFFECT (ANIM_SPRITES_START + 255) #define ANIM_TAG_METEOR (ANIM_SPRITES_START + 256) #define ANIM_TAG_FLAT_ROCK (ANIM_SPRITES_START + 257) #define ANIM_TAG_MAGNIFYING_GLASS (ANIM_SPRITES_START + 258) #define ANIM_TAG_BROWN_ORB (ANIM_SPRITES_START + 259) #define ANIM_TAG_METAL_SOUND_WAVES (ANIM_SPRITES_START + 260) #define ANIM_TAG_FLYING_DIRT (ANIM_SPRITES_START + 261) #define ANIM_TAG_ICICLE_SPEAR (ANIM_SPRITES_START + 262) #define ANIM_TAG_HAIL (ANIM_SPRITES_START + 263) #define ANIM_TAG_GLOWY_RED_ORB (ANIM_SPRITES_START + 264) #define ANIM_TAG_GLOWY_GREEN_ORB (ANIM_SPRITES_START + 265) #define ANIM_TAG_GREEN_SPIKE (ANIM_SPRITES_START + 266) #define ANIM_TAG_WHITE_CIRCLE_OF_LIGHT (ANIM_SPRITES_START + 267) #define ANIM_TAG_GLOWY_BLUE_ORB (ANIM_SPRITES_START + 268) #define ANIM_TAG_SAFARI_BAIT (ANIM_SPRITES_START + 269) #define ANIM_TAG_WHITE_FEATHER (ANIM_SPRITES_START + 270) #define ANIM_TAG_SPARKLE_6 (ANIM_SPRITES_START + 271) #define ANIM_TAG_SPLASH (ANIM_SPRITES_START + 272) #define ANIM_TAG_SWEAT_BEAD (ANIM_SPRITES_START + 273) #define ANIM_TAG_GEM_1 (ANIM_SPRITES_START + 274) // unused #define ANIM_TAG_GEM_2 (ANIM_SPRITES_START + 275) // unused #define ANIM_TAG_GEM_3 (ANIM_SPRITES_START + 276) // unused #define ANIM_TAG_SLAM_HIT_2 (ANIM_SPRITES_START + 277) #define ANIM_TAG_RECYCLE (ANIM_SPRITES_START + 278) #define ANIM_TAG_RED_PARTICLES (ANIM_SPRITES_START + 279) // unused #define ANIM_TAG_PROTECT (ANIM_SPRITES_START + 280) #define ANIM_TAG_DIRT_MOUND (ANIM_SPRITES_START + 281) #define ANIM_TAG_SHOCK_3 (ANIM_SPRITES_START + 282) #define ANIM_TAG_WEATHER_BALL (ANIM_SPRITES_START + 283) #define ANIM_TAG_BIRD (ANIM_SPRITES_START + 284) #define ANIM_TAG_CROSS_IMPACT (ANIM_SPRITES_START + 285) #define ANIM_TAG_SLASH_2 (ANIM_SPRITES_START + 286) #define ANIM_TAG_WHIP_HIT (ANIM_SPRITES_START + 287) #define ANIM_TAG_BLUE_RING_2 (ANIM_SPRITES_START + 288) // battlers #define ANIM_ATTACKER 0 #define ANIM_TARGET 1 #define ANIM_ATK_PARTNER 2 #define ANIM_DEF_PARTNER 3 // stereo panning constants [0-255] // // 0 // . . // . . // 192 . . 63 // . . // . . // . . // 127 // #define SOUND_PAN_ATTACKER -64 #define SOUND_PAN_TARGET 63 // move background ids #define BG_NONE 0 // the same as BG_DARK #define BG_DARK 1 #define BG_GHOST 2 #define BG_PSYCHIC 3 #define BG_IMPACT_OPPONENT 4 #define BG_IMPACT_PLAYER 5 #define BG_IMPACT_CONTESTS 6 #define BG_DRILL 7 #define BG_DRILL_CONTESTS 8 #define BG_HIGHSPEED_OPPONENT 9 #define BG_HIGHSPEED_PLAYER 10 #define BG_THUNDER 11 #define BG_GUILLOTINE_OPPONENT 12 #define BG_GUILLOTINE_PLAYER 13 #define BG_GUILLOTINE_CONTESTS 14 #define BG_ICE 15 #define BG_COSMIC 16 #define BG_IN_AIR 17 #define BG_SKY 18 #define BG_SKY_CONTESTS 19 #define BG_AURORA 20 #define BG_FISSURE 21 #define BG_BUG_OPPONENT 22 #define BG_BUG_PLAYER 23 #define BG_SOLAR_BEAM_OPPONENT 24 #define BG_SOLAR_BEAM_PLAYER 25 #define BG_SOLAR_BEAM_CONTESTS 26 // table ids for general animations (gBattleAnims_General) #define B_ANIM_CASTFORM_CHANGE 0 #define B_ANIM_STATS_CHANGE 1 #define B_ANIM_SUBSTITUTE_FADE 2 #define B_ANIM_SUBSTITUTE_APPEAR 3 #define B_ANIM_BAIT_THROW 4 #define B_ANIM_ITEM_KNOCKOFF 5 #define B_ANIM_TURN_TRAP 6 #define B_ANIM_HELD_ITEM_EFFECT 7 #define B_ANIM_SMOKEBALL_ESCAPE 8 #define B_ANIM_FOCUS_BAND 9 #define B_ANIM_RAIN_CONTINUES 10 #define B_ANIM_SUN_CONTINUES 11 #define B_ANIM_SANDSTORM_CONTINUES 12 #define B_ANIM_HAIL_CONTINUES 13 #define B_ANIM_LEECH_SEED_DRAIN 14 #define B_ANIM_MON_HIT 15 #define B_ANIM_ITEM_STEAL 16 #define B_ANIM_SNATCH_MOVE 17 #define B_ANIM_FUTURE_SIGHT_HIT 18 #define B_ANIM_DOOM_DESIRE_HIT 19 #define B_ANIM_FOCUS_PUNCH_SETUP 20 #define B_ANIM_INGRAIN_HEAL 21 #define B_ANIM_WISH_HEAL 22 #define B_ANIM_MON_SCARED 23 #define B_ANIM_GHOST_GET_OUT 24 #define B_ANIM_SILPH_SCOPED 25 #define B_ANIM_ROCK_THROW 26 #define B_ANIM_SAFARI_REACTION 27 // special animations table (gBattleAnims_Special) #define B_ANIM_LVL_UP 0 #define B_ANIM_SWITCH_OUT_PLAYER_MON 1 #define B_ANIM_SWITCH_OUT_OPPONENT_MON 2 #define B_ANIM_BALL_THROW 3 #define B_ANIM_BALL_THROW_WITH_TRAINER 4 #define B_ANIM_SUBSTITUTE_TO_MON 5 #define B_ANIM_MON_TO_SUBSTITUTE 6 // status animation table (gBattleAnims_StatusConditions) #define B_ANIM_STATUS_PSN 0 #define B_ANIM_STATUS_CONFUSION 1 #define B_ANIM_STATUS_BRN 2 #define B_ANIM_STATUS_INFATUATION 3 #define B_ANIM_STATUS_SLP 4 #define B_ANIM_STATUS_PRZ 5 #define B_ANIM_STATUS_FRZ 6 #define B_ANIM_STATUS_CURSED 7 #define B_ANIM_STATUS_NIGHTMARE 8 #define B_ANIM_STATUS_WRAPPED 9 // does not actually exist // Most tasks return a value to gBattleAnimArgs[7]. #define ARG_RET_ID 7 // For createsprite macro to use internally #define ANIMSPRITE_IS_TARGET (1 << 7) // Trapping Wrap-like moves end turn animation. #define TRAP_ANIM_BIND 0 #define TRAP_ANIM_WRAP 0 #define TRAP_ANIM_FIRE_SPIN 1 #define TRAP_ANIM_WHIRLPOOL 2 #define TRAP_ANIM_CLAMP 3 #define TRAP_ANIM_SAND_TOMB 4 // Weather defines for battle animation scripts. #define ANIM_WEATHER_NONE 0 #define ANIM_WEATHER_SUN 1 #define ANIM_WEATHER_RAIN 2 #define ANIM_WEATHER_SANDSTORM 3 #define ANIM_WEATHER_HAIL 4 // Flags given to various functions to indicate which palettes to consider. // Handled by UnpackSelectedBattlePalettes #define F_PAL_BG (1 << 0) #define F_PAL_ATTACKER (1 << 1) #define F_PAL_TARGET (1 << 2) #define F_PAL_ATK_PARTNER (1 << 3) #define F_PAL_DEF_PARTNER (1 << 4) #define F_PAL_ANIM_1 (1 << 5) // Palette set for GetBattleAnimBg1Data/GetBattleAnimBgDataByPriorityRank. Only used (ineffectually?) by Aromatherapy. #define F_PAL_ANIM_2 (1 << 6) // Palette set for GetBattleAnimBgData/GetBattleAnimBgDataByPriorityRank. Unused. #define F_PAL_ATK_SIDE (F_PAL_ATTACKER | F_PAL_ATK_PARTNER) #define F_PAL_DEF_SIDE (F_PAL_TARGET | F_PAL_DEF_PARTNER) #define F_PAL_BATTLERS (F_PAL_ATK_SIDE | F_PAL_DEF_SIDE) // The below are only used by AnimTask_BlendBattleAnimPal to get battler sprite palettes by position rather than by role. // It's redundant with F_PAL_BATTLERS, because they're only ever used together to refer to all the battlers at once. #define F_PAL_BATTLERS_2 (1 << 7 | 1 << 8 | 1 << 9 | 1 << 10) // Battle mon back animations. #define BACK_ANIM_NONE 0x00 #define BACK_ANIM_H_SLIDE_QUICK 0x01 #define BACK_ANIM_H_SLIDE 0x02 #define BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_1 0x03 #define BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_2 0x04 #define BACK_ANIM_SHRINK_GROW_1 0x05 #define BACK_ANIM_GROW_1 0x06 #define BACK_ANIM_CIRCLE_MOVE_COUNTERCLOCKWISE 0x07 #define BACK_ANIM_HORIZONTAL_SHAKE 0x08 #define BACK_ANIM_VERTICAL_SHAKE 0x09 #define BACK_ANIM_V_SHAKE_WITH_H_SLIDE 0x0a #define BACK_ANIM_VERTICAL_STRETCH 0x0b #define BACK_ANIM_HORIZONTAL_STRETCH 0x0c #define BACK_ANIM_GROW_2 0x0d #define BACK_ANIM_V_SHAKE_WITH_PAUSE 0x0e #define BACK_ANIM_CIRCLE_MOVE_CLOCKWISE 0x0f #define BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL 0x10 #define BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE 0x11 #define BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE 0x12 #define BACK_ANIM_DIP_RIGHT_SIDE 0x13 #define BACK_ANIM_SHRINK_GROW_2 0x14 #define BACK_ANIM_JOLT_RIGHT 0x15 #define BACK_ANIM_FLASH_YELLOW_WITH_SHAKE 0x16 #define BACK_ANIM_FADE_RED_WITH_SHAKE 0x17 #define BACK_ANIM_FADE_GREEN_WITH_SHAKE 0x18 #define BACK_ANIM_FADE_BLUE_WITH_SHAKE 0x19 #endif // GUARD_CONSTANTS_BATTLE_ANIM_H ================================================ FILE: include/constants/battle_move_effects.h ================================================ #ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H #define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H #define EFFECT_HIT 0 #define EFFECT_SLEEP 1 #define EFFECT_POISON_HIT 2 #define EFFECT_ABSORB 3 #define EFFECT_BURN_HIT 4 #define EFFECT_FREEZE_HIT 5 #define EFFECT_PARALYZE_HIT 6 #define EFFECT_EXPLOSION 7 #define EFFECT_DREAM_EATER 8 #define EFFECT_MIRROR_MOVE 9 #define EFFECT_ATTACK_UP 10 #define EFFECT_DEFENSE_UP 11 #define EFFECT_SPEED_UP 12 #define EFFECT_SPECIAL_ATTACK_UP 13 #define EFFECT_SPECIAL_DEFENSE_UP 14 #define EFFECT_ACCURACY_UP 15 #define EFFECT_EVASION_UP 16 #define EFFECT_ALWAYS_HIT 17 #define EFFECT_ATTACK_DOWN 18 #define EFFECT_DEFENSE_DOWN 19 #define EFFECT_SPEED_DOWN 20 #define EFFECT_SPECIAL_ATTACK_DOWN 21 // unused #define EFFECT_SPECIAL_DEFENSE_DOWN 22 // unused #define EFFECT_ACCURACY_DOWN 23 #define EFFECT_EVASION_DOWN 24 #define EFFECT_HAZE 25 #define EFFECT_BIDE 26 #define EFFECT_RAMPAGE 27 #define EFFECT_ROAR 28 #define EFFECT_MULTI_HIT 29 #define EFFECT_CONVERSION 30 #define EFFECT_FLINCH_HIT 31 #define EFFECT_RESTORE_HP 32 #define EFFECT_TOXIC 33 #define EFFECT_PAY_DAY 34 #define EFFECT_LIGHT_SCREEN 35 #define EFFECT_TRI_ATTACK 36 #define EFFECT_REST 37 #define EFFECT_OHKO 38 #define EFFECT_RAZOR_WIND 39 #define EFFECT_SUPER_FANG 40 #define EFFECT_DRAGON_RAGE 41 #define EFFECT_TRAP 42 #define EFFECT_HIGH_CRITICAL 43 #define EFFECT_DOUBLE_HIT 44 #define EFFECT_RECOIL_IF_MISS 45 #define EFFECT_MIST 46 #define EFFECT_FOCUS_ENERGY 47 #define EFFECT_RECOIL 48 #define EFFECT_CONFUSE 49 #define EFFECT_ATTACK_UP_2 50 #define EFFECT_DEFENSE_UP_2 51 #define EFFECT_SPEED_UP_2 52 #define EFFECT_SPECIAL_ATTACK_UP_2 53 #define EFFECT_SPECIAL_DEFENSE_UP_2 54 #define EFFECT_ACCURACY_UP_2 55 #define EFFECT_EVASION_UP_2 56 #define EFFECT_TRANSFORM 57 #define EFFECT_ATTACK_DOWN_2 58 #define EFFECT_DEFENSE_DOWN_2 59 #define EFFECT_SPEED_DOWN_2 60 #define EFFECT_SPECIAL_ATTACK_DOWN_2 61 #define EFFECT_SPECIAL_DEFENSE_DOWN_2 62 #define EFFECT_ACCURACY_DOWN_2 63 #define EFFECT_EVASION_DOWN_2 64 #define EFFECT_REFLECT 65 #define EFFECT_POISON 66 #define EFFECT_PARALYZE 67 #define EFFECT_ATTACK_DOWN_HIT 68 #define EFFECT_DEFENSE_DOWN_HIT 69 #define EFFECT_SPEED_DOWN_HIT 70 #define EFFECT_SPECIAL_ATTACK_DOWN_HIT 71 #define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 72 #define EFFECT_ACCURACY_DOWN_HIT 73 #define EFFECT_EVASION_DOWN_HIT 74 #define EFFECT_SKY_ATTACK 75 #define EFFECT_CONFUSE_HIT 76 #define EFFECT_TWINEEDLE 77 #define EFFECT_VITAL_THROW 78 #define EFFECT_SUBSTITUTE 79 #define EFFECT_RECHARGE 80 #define EFFECT_RAGE 81 #define EFFECT_MIMIC 82 #define EFFECT_METRONOME 83 #define EFFECT_LEECH_SEED 84 #define EFFECT_SPLASH 85 #define EFFECT_DISABLE 86 #define EFFECT_LEVEL_DAMAGE 87 #define EFFECT_PSYWAVE 88 #define EFFECT_COUNTER 89 #define EFFECT_ENCORE 90 #define EFFECT_PAIN_SPLIT 91 #define EFFECT_SNORE 92 #define EFFECT_CONVERSION_2 93 #define EFFECT_LOCK_ON 94 #define EFFECT_SKETCH 95 #define EFFECT_UNUSED_60 96 // thaw #define EFFECT_SLEEP_TALK 97 #define EFFECT_DESTINY_BOND 98 #define EFFECT_FLAIL 99 #define EFFECT_SPITE 100 #define EFFECT_FALSE_SWIPE 101 #define EFFECT_HEAL_BELL 102 #define EFFECT_QUICK_ATTACK 103 #define EFFECT_TRIPLE_KICK 104 #define EFFECT_THIEF 105 #define EFFECT_MEAN_LOOK 106 #define EFFECT_NIGHTMARE 107 #define EFFECT_MINIMIZE 108 #define EFFECT_CURSE 109 #define EFFECT_UNUSED_6E 110 #define EFFECT_PROTECT 111 #define EFFECT_SPIKES 112 #define EFFECT_FORESIGHT 113 #define EFFECT_PERISH_SONG 114 #define EFFECT_SANDSTORM 115 #define EFFECT_ENDURE 116 #define EFFECT_ROLLOUT 117 #define EFFECT_SWAGGER 118 #define EFFECT_FURY_CUTTER 119 #define EFFECT_ATTRACT 120 #define EFFECT_RETURN 121 #define EFFECT_PRESENT 122 #define EFFECT_FRUSTRATION 123 #define EFFECT_SAFEGUARD 124 #define EFFECT_THAW_HIT 125 #define EFFECT_MAGNITUDE 126 #define EFFECT_BATON_PASS 127 #define EFFECT_PURSUIT 128 #define EFFECT_RAPID_SPIN 129 #define EFFECT_SONICBOOM 130 #define EFFECT_UNUSED_83 131 #define EFFECT_MORNING_SUN 132 #define EFFECT_SYNTHESIS 133 #define EFFECT_MOONLIGHT 134 #define EFFECT_HIDDEN_POWER 135 #define EFFECT_RAIN_DANCE 136 #define EFFECT_SUNNY_DAY 137 #define EFFECT_DEFENSE_UP_HIT 138 #define EFFECT_ATTACK_UP_HIT 139 #define EFFECT_ALL_STATS_UP_HIT 140 #define EFFECT_UNUSED_8D 141 // incomplete fake out in gen 2 #define EFFECT_BELLY_DRUM 142 #define EFFECT_PSYCH_UP 143 #define EFFECT_MIRROR_COAT 144 #define EFFECT_SKULL_BASH 145 #define EFFECT_TWISTER 146 #define EFFECT_EARTHQUAKE 147 #define EFFECT_FUTURE_SIGHT 148 #define EFFECT_GUST 149 #define EFFECT_FLINCH_MINIMIZE_HIT 150 // STOMP ASTONISH EXTRASENSORY NEEDLE_ARM #define EFFECT_SOLAR_BEAM 151 #define EFFECT_THUNDER 152 #define EFFECT_TELEPORT 153 #define EFFECT_BEAT_UP 154 #define EFFECT_SEMI_INVULNERABLE 155 #define EFFECT_DEFENSE_CURL 156 #define EFFECT_SOFTBOILED 157 #define EFFECT_FAKE_OUT 158 #define EFFECT_UPROAR 159 #define EFFECT_STOCKPILE 160 #define EFFECT_SPIT_UP 161 #define EFFECT_SWALLOW 162 #define EFFECT_UNUSED_A3 163 #define EFFECT_HAIL 164 #define EFFECT_TORMENT 165 #define EFFECT_FLATTER 166 #define EFFECT_WILL_O_WISP 167 #define EFFECT_MEMENTO 168 #define EFFECT_FACADE 169 #define EFFECT_FOCUS_PUNCH 170 #define EFFECT_SMELLINGSALT 171 #define EFFECT_FOLLOW_ME 172 #define EFFECT_NATURE_POWER 173 #define EFFECT_CHARGE 174 #define EFFECT_TAUNT 175 #define EFFECT_HELPING_HAND 176 #define EFFECT_TRICK 177 #define EFFECT_ROLE_PLAY 178 #define EFFECT_WISH 179 #define EFFECT_ASSIST 180 #define EFFECT_INGRAIN 181 #define EFFECT_SUPERPOWER 182 #define EFFECT_MAGIC_COAT 183 #define EFFECT_RECYCLE 184 #define EFFECT_REVENGE 185 #define EFFECT_BRICK_BREAK 186 #define EFFECT_YAWN 187 #define EFFECT_KNOCK_OFF 188 #define EFFECT_ENDEAVOR 189 #define EFFECT_ERUPTION 190 #define EFFECT_SKILL_SWAP 191 #define EFFECT_IMPRISON 192 #define EFFECT_REFRESH 193 #define EFFECT_GRUDGE 194 #define EFFECT_SNATCH 195 #define EFFECT_LOW_KICK 196 #define EFFECT_SECRET_POWER 197 #define EFFECT_DOUBLE_EDGE 198 #define EFFECT_TEETER_DANCE 199 #define EFFECT_BLAZE_KICK 200 #define EFFECT_MUD_SPORT 201 #define EFFECT_POISON_FANG 202 #define EFFECT_WEATHER_BALL 203 #define EFFECT_OVERHEAT 204 #define EFFECT_TICKLE 205 #define EFFECT_COSMIC_POWER 206 #define EFFECT_SKY_UPPERCUT 207 #define EFFECT_BULK_UP 208 #define EFFECT_POISON_TAIL 209 #define EFFECT_WATER_SPORT 210 #define EFFECT_CALM_MIND 211 #define EFFECT_DRAGON_DANCE 212 #define EFFECT_CAMOUFLAGE 213 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H ================================================ FILE: include/constants/battle_script_commands.h ================================================ #ifndef GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H #define GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H // The following correspond to the struct members of BattleScripting by adding their offset #define sPAINSPLIT_HP gBattleScripting + 0x00 // painSplitHp #define sBIDE_DMG gBattleScripting + 0x04 // bideDmg #define sMULTIHIT_STRING gBattleScripting + 0x08 // multihitString #define sDMG_MULTIPLIER gBattleScripting + 0x0E // dmgMultiplier #define sTWOTURN_STRINGID gBattleScripting + 0x0F // twoTurnsMoveStringId #define sB_ANIM_ARG1 gBattleScripting + 0x10 // animArg1 #define sB_ANIM_ARG2 gBattleScripting + 0x11 // animArg2 #define sTRIPLE_KICK_POWER gBattleScripting + 0x12 // tripleKickPower #define sMOVEEND_STATE gBattleScripting + 0x14 // moveendState #define sBATTLER_WITH_ABILITY gBattleScripting + 0x15 // battlerWithAbility #define sMULTIHIT_EFFECT gBattleScripting + 0x16 // multihitMoveEffect #define sBATTLER gBattleScripting + 0x17 // battler #define sB_ANIM_TURN gBattleScripting + 0x18 // animTurn #define sB_ANIM_TARGETS_HIT gBattleScripting + 0x19 // animTargetsHit #define sSTATCHANGER gBattleScripting + 0x1A // statChanger #define sSTAT_ANIM_PLAYED gBattleScripting + 0x1B // statAnimPlayed #define sGIVEEXP_STATE gBattleScripting + 0x1C // getexpState #define sBATTLE_STYLE gBattleScripting + 0x1D // battleStyle #define sLVLBOX_STATE gBattleScripting + 0x1E // drawlvlupboxState #define sLEARNMOVE_STATE gBattleScripting + 0x1F // learnMoveState #define sPURSUIT_DOUBLES_ATTACKER gBattleScripting + 0x20 // pursuitDoublesAttacker #define sRESHOW_MAIN_STATE gBattleScripting + 0x21 // reshowMainState #define sRESHOW_HELPER_STATE gBattleScripting + 0x22 // reshowHelperState #define sLVLUP_HP gBattleScripting + 0x23 // levelUpHP // Array entries for battle communication #define MULTIUSE_STATE 0 #define CURSOR_POSITION 1 #define TASK_ID 1 // task Id and cursor position share the same field #define SPRITES_INIT_STATE1 1 // shares the Id as well #define SPRITES_INIT_STATE2 2 #define MOVE_EFFECT_BYTE 3 #define ACTIONS_CONFIRMED_COUNT 4 #define MULTISTRING_CHOOSER 5 #define MISS_TYPE 6 #define MSG_DISPLAY 7 #define BATTLE_COMMUNICATION_ENTRIES_COUNT 8 #define cEFFECT_CHOOSER (gBattleCommunication + MOVE_EFFECT_BYTE) #define cMULTISTRING_CHOOSER (gBattleCommunication + MULTISTRING_CHOOSER) #define cMISS_TYPE (gBattleCommunication + MISS_TYPE) // Battle Script defines for getting the wanted battler #define BS_TARGET 0 #define BS_ATTACKER 1 #define BS_EFFECT_BATTLER 2 #define BS_FAINTED 3 #define BS_ATTACKER_WITH_PARTNER 4 // for Cmd_updatestatusicon #define BS_FAINTED_LINK_MULTIPLE_1 5 // for openpartyscreen #define BS_FAINTED_LINK_MULTIPLE_2 6 // for openpartyscreen #define BS_BATTLER_0 7 #define BS_ATTACKER_SIDE 8 // for Cmd_jumpifability #define BS_NOT_ATTACKER_SIDE 9 // for Cmd_jumpifability #define BS_SCRIPTING 10 #define BS_PLAYER1 11 #define BS_OPPONENT1 12 #define BS_PLAYER2 13 // for Cmd_updatestatusicon #define BS_OPPONENT2 14 // atk 01, accuracy calc #define NO_ACC_CALC 0xFFFE #define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF #define ACC_CURR_MOVE 0 // compare operands #define CMP_EQUAL 0x0 #define CMP_NOT_EQUAL 0x1 #define CMP_GREATER_THAN 0x2 #define CMP_LESS_THAN 0x3 #define CMP_COMMON_BITS 0x4 #define CMP_NO_COMMON_BITS 0x5 // TODO: documentation // atk76, various #define VARIOUS_CANCEL_MULTI_TURN_MOVES 0 #define VARIOUS_SET_MAGIC_COAT_TARGET 1 #define VARIOUS_IS_RUNNING_IMPOSSIBLE 2 #define VARIOUS_GET_MOVE_TARGET 3 #define VARIOUS_GET_BATTLER_FAINTED 4 #define VARIOUS_RESET_INTIMIDATE_TRACE_BITS 5 #define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP 6 #define VARIOUS_RESET_PLAYER_FAINTED 7 #define VARIOUS_GET_BATTLERS_FOR_RECALL 8 #define VARIOUS_RETURN_OPPONENT_MON1 9 #define VARIOUS_RETURN_OPPONENT_MON2 10 #define VARIOUS_CHECK_POKEFLUTE 11 #define VARIOUS_WAIT_FANFARE 12 // Cmd_manipulatedmg #define DMG_CHANGE_SIGN 0 #define DMG_RECOIL_FROM_MISS 1 #define DMG_DOUBLED 2 // Cmd_jumpifcantswitch #define SWITCH_IGNORE_ESCAPE_PREVENTION (1 << 7) // Cmd_statbuffchange #define STAT_CHANGE_ALLOW_PTR (1 << 0) // If set, allow use of jumpptr. Set in every use of statbuffchange #define STAT_CHANGE_NOT_PROTECT_AFFECTED (1 << 5) // stat change flags for Cmd_playstatchangeanimation #define STAT_CHANGE_NEGATIVE (1 << 0) #define STAT_CHANGE_BY_TWO (1 << 1) #define STAT_CHANGE_MULTIPLE_STATS (1 << 2) #define STAT_CHANGE_CANT_PREVENT (1 << 3) // stat flags for Cmd_playstatchangeanimation #define BIT_HP (1 << 0) #define BIT_ATK (1 << 1) #define BIT_DEF (1 << 2) #define BIT_SPEED (1 << 3) #define BIT_SPATK (1 << 4) #define BIT_SPDEF (1 << 5) #define BIT_ACC (1 << 6) #define BIT_EVASION (1 << 7) #define PARTY_SCREEN_OPTIONAL (1 << 7) // Flag for first argument to openpartyscreen // cases for Cmd_moveend #define MOVEEND_RAGE 0 #define MOVEEND_DEFROST 1 #define MOVEEND_SYNCHRONIZE_TARGET 2 #define MOVEEND_ON_DAMAGE_ABILITIES 3 #define MOVEEND_IMMUNITY_ABILITIES 4 #define MOVEEND_SYNCHRONIZE_ATTACKER 5 #define MOVEEND_CHOICE_MOVE 6 #define MOVEEND_CHANGED_ITEMS 7 #define MOVEEND_ATTACKER_INVISIBLE 8 #define MOVEEND_ATTACKER_VISIBLE 9 #define MOVEEND_TARGET_VISIBLE 10 #define MOVEEND_ITEM_EFFECTS_ALL 11 #define MOVEEND_KINGSROCK_SHELLBELL 12 #define MOVEEND_SUBSTITUTE 13 #define MOVEEND_UPDATE_LAST_MOVES 14 #define MOVEEND_MIRROR_MOVE 15 #define MOVEEND_NEXT_TARGET 16 #define MOVEEND_COUNT 17 #endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H ================================================ FILE: include/constants/battle_setup.h ================================================ #ifndef GUARD_CONSTANTS_BATTLE_SETUP_H #define GUARD_CONSTANTS_BATTLE_SETUP_H #define TRAINER_BATTLE_SINGLE 0 #define TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC 1 #define TRAINER_BATTLE_CONTINUE_SCRIPT 2 #define TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT 3 #define TRAINER_BATTLE_DOUBLE 4 #define TRAINER_BATTLE_REMATCH 5 #define TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE 6 #define TRAINER_BATTLE_REMATCH_DOUBLE 7 #define TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC 8 #define TRAINER_BATTLE_EARLY_RIVAL 9 #endif // GUARD_CONSTANTS_BATTLE_SETUP_H ================================================ FILE: include/constants/battle_string_ids.h ================================================ #ifndef GUARD_BATTLE_STRING_IDS_H #define GUARD_BATTLE_STRING_IDS_H #define STRINGID_INTROMSG 0 #define STRINGID_INTROSENDOUT 1 #define STRINGID_RETURNMON 2 #define STRINGID_SWITCHINMON 3 #define STRINGID_USEDMOVE 4 #define STRINGID_BATTLEEND 5 // todo: make some of those names less vague: attacker/target vs pkmn, etc. #define STRINGID_TRAINER1LOSETEXT 12 #define STRINGID_PKMNGAINEDEXP 13 #define STRINGID_PKMNGREWTOLV 14 #define STRINGID_PKMNLEARNEDMOVE 15 #define STRINGID_TRYTOLEARNMOVE1 16 #define STRINGID_TRYTOLEARNMOVE2 17 #define STRINGID_TRYTOLEARNMOVE3 18 #define STRINGID_PKMNFORGOTMOVE 19 #define STRINGID_STOPLEARNINGMOVE 20 #define STRINGID_DIDNOTLEARNMOVE 21 #define STRINGID_PKMNLEARNEDMOVE2 22 #define STRINGID_ATTACKMISSED 23 #define STRINGID_PKMNPROTECTEDITSELF 24 #define STRINGID_STATSWONTINCREASE2 25 #define STRINGID_AVOIDEDDAMAGE 26 #define STRINGID_ITDOESNTAFFECT 27 #define STRINGID_ATTACKERFAINTED 28 #define STRINGID_TARGETFAINTED 29 #define STRINGID_PLAYERGOTMONEY 30 #define STRINGID_PLAYERWHITEOUT 31 #define STRINGID_PLAYERWHITEOUT2 32 #define STRINGID_PREVENTSESCAPE 33 #define STRINGID_HITXTIMES 34 #define STRINGID_PKMNFELLASLEEP 35 #define STRINGID_PKMNMADESLEEP 36 #define STRINGID_PKMNALREADYASLEEP 37 #define STRINGID_PKMNALREADYASLEEP2 38 #define STRINGID_PKMNWASNTAFFECTED 39 #define STRINGID_PKMNWASPOISONED 40 #define STRINGID_PKMNPOISONEDBY 41 #define STRINGID_PKMNHURTBYPOISON 42 #define STRINGID_PKMNALREADYPOISONED 43 #define STRINGID_PKMNBADLYPOISONED 44 #define STRINGID_PKMNENERGYDRAINED 45 #define STRINGID_PKMNWASBURNED 46 #define STRINGID_PKMNBURNEDBY 47 #define STRINGID_PKMNHURTBYBURN 48 #define STRINGID_PKMNWASFROZEN 49 #define STRINGID_PKMNFROZENBY 50 #define STRINGID_PKMNISFROZEN 51 #define STRINGID_PKMNWASDEFROSTED 52 #define STRINGID_PKMNWASDEFROSTED2 53 #define STRINGID_PKMNWASDEFROSTEDBY 54 #define STRINGID_PKMNWASPARALYZED 55 #define STRINGID_PKMNWASPARALYZEDBY 56 #define STRINGID_PKMNISPARALYZED 57 #define STRINGID_PKMNISALREADYPARALYZED 58 #define STRINGID_PKMNHEALEDPARALYSIS 59 #define STRINGID_PKMNDREAMEATEN 60 #define STRINGID_STATSWONTINCREASE 61 #define STRINGID_STATSWONTDECREASE 62 #define STRINGID_TEAMSTOPPEDWORKING 63 #define STRINGID_FOESTOPPEDWORKING 64 #define STRINGID_PKMNISCONFUSED 65 #define STRINGID_PKMNHEALEDCONFUSION 66 #define STRINGID_PKMNWASCONFUSED 67 #define STRINGID_PKMNALREADYCONFUSED 68 #define STRINGID_PKMNFELLINLOVE 69 #define STRINGID_PKMNINLOVE 70 #define STRINGID_PKMNIMMOBILIZEDBYLOVE 71 #define STRINGID_PKMNBLOWNAWAY 72 #define STRINGID_PKMNCHANGEDTYPE 73 #define STRINGID_PKMNFLINCHED 74 #define STRINGID_PKMNREGAINEDHEALTH 75 #define STRINGID_PKMNHPFULL 76 #define STRINGID_PKMNRAISEDSPDEF 77 #define STRINGID_PKMNRAISEDDEF 78 #define STRINGID_PKMNCOVEREDBYVEIL 79 #define STRINGID_PKMNUSEDSAFEGUARD 80 #define STRINGID_PKMNSAFEGUARDEXPIRED 81 #define STRINGID_PKMNWENTTOSLEEP 82 #define STRINGID_PKMNSLEPTHEALTHY 83 #define STRINGID_PKMNWHIPPEDWHIRLWIND 84 #define STRINGID_PKMNTOOKSUNLIGHT 85 #define STRINGID_PKMNLOWEREDHEAD 86 #define STRINGID_PKMNISGLOWING 87 #define STRINGID_PKMNFLEWHIGH 88 #define STRINGID_PKMNDUGHOLE 89 #define STRINGID_PKMNSQUEEZEDBYBIND 90 #define STRINGID_PKMNTRAPPEDINVORTEX 91 #define STRINGID_PKMNWRAPPEDBY 92 #define STRINGID_PKMNCLAMPED 93 #define STRINGID_PKMNHURTBY 94 #define STRINGID_PKMNFREEDFROM 95 #define STRINGID_PKMNCRASHED 96 #define STRINGID_PKMNSHROUDEDINMIST 97 #define STRINGID_PKMNPROTECTEDBYMIST 98 #define STRINGID_PKMNGETTINGPUMPED 99 #define STRINGID_PKMNHITWITHRECOIL 100 #define STRINGID_PKMNPROTECTEDITSELF2 101 #define STRINGID_PKMNBUFFETEDBYSANDSTORM 102 #define STRINGID_PKMNPELTEDBYHAIL 103 #define STRINGID_PKMNSEEDED 104 #define STRINGID_PKMNEVADEDATTACK 105 #define STRINGID_PKMNSAPPEDBYLEECHSEED 106 #define STRINGID_PKMNFASTASLEEP 107 #define STRINGID_PKMNWOKEUP 108 #define STRINGID_PKMNUPROARKEPTAWAKE 109 #define STRINGID_PKMNWOKEUPINUPROAR 110 #define STRINGID_PKMNCAUSEDUPROAR 111 #define STRINGID_PKMNMAKINGUPROAR 112 #define STRINGID_PKMNCALMEDDOWN 113 #define STRINGID_PKMNCANTSLEEPINUPROAR 114 #define STRINGID_PKMNSTOCKPILED 115 #define STRINGID_PKMNCANTSTOCKPILE 116 #define STRINGID_PKMNCANTSLEEPINUPROAR2 117 #define STRINGID_UPROARKEPTPKMNAWAKE 118 #define STRINGID_PKMNSTAYEDAWAKEUSING 119 #define STRINGID_PKMNSTORINGENERGY 120 #define STRINGID_PKMNUNLEASHEDENERGY 121 #define STRINGID_PKMNFATIGUECONFUSION 122 #define STRINGID_PLAYERPICKEDUPMONEY 123 #define STRINGID_PKMNUNAFFECTED 124 #define STRINGID_PKMNTRANSFORMEDINTO 125 #define STRINGID_PKMNMADESUBSTITUTE 126 #define STRINGID_PKMNHASSUBSTITUTE 127 #define STRINGID_SUBSTITUTEDAMAGED 128 #define STRINGID_PKMNSUBSTITUTEFADED 129 #define STRINGID_PKMNMUSTRECHARGE 130 #define STRINGID_PKMNRAGEBUILDING 131 #define STRINGID_PKMNMOVEWASDISABLED 132 #define STRINGID_PKMNMOVEISDISABLED 133 #define STRINGID_PKMNMOVEDISABLEDNOMORE 134 #define STRINGID_PKMNGOTENCORE 135 #define STRINGID_PKMNENCOREENDED 136 #define STRINGID_PKMNTOOKAIM 137 #define STRINGID_PKMNSKETCHEDMOVE 138 #define STRINGID_PKMNTRYINGTOTAKEFOE 139 #define STRINGID_PKMNTOOKFOE 140 #define STRINGID_PKMNREDUCEDPP 141 #define STRINGID_PKMNSTOLEITEM 142 #define STRINGID_TARGETCANTESCAPENOW 143 #define STRINGID_PKMNFELLINTONIGHTMARE 144 #define STRINGID_PKMNLOCKEDINNIGHTMARE 145 #define STRINGID_PKMNLAIDCURSE 146 #define STRINGID_PKMNAFFLICTEDBYCURSE 147 #define STRINGID_SPIKESSCATTERED 148 #define STRINGID_PKMNHURTBYSPIKES 149 #define STRINGID_PKMNIDENTIFIED 150 #define STRINGID_PKMNPERISHCOUNTFELL 151 #define STRINGID_PKMNBRACEDITSELF 152 #define STRINGID_PKMNENDUREDHIT 153 #define STRINGID_MAGNITUDESTRENGTH 154 #define STRINGID_PKMNCUTHPMAXEDATTACK 155 #define STRINGID_PKMNCOPIEDSTATCHANGES 156 #define STRINGID_PKMNGOTFREE 157 #define STRINGID_PKMNSHEDLEECHSEED 158 #define STRINGID_PKMNBLEWAWAYSPIKES 159 #define STRINGID_PKMNFLEDFROMBATTLE 160 #define STRINGID_PKMNFORESAWATTACK 161 #define STRINGID_PKMNTOOKATTACK 162 #define STRINGID_PKMNATTACK 163 #define STRINGID_PKMNCENTERATTENTION 164 #define STRINGID_PKMNCHARGINGPOWER 165 #define STRINGID_NATUREPOWERTURNEDINTO 166 #define STRINGID_PKMNSTATUSNORMAL 167 #define STRINGID_PKMNHASNOMOVESLEFT 168 #define STRINGID_PKMNSUBJECTEDTOTORMENT 169 #define STRINGID_PKMNCANTUSEMOVETORMENT 170 #define STRINGID_PKMNTIGHTENINGFOCUS 171 #define STRINGID_PKMNFELLFORTAUNT 172 #define STRINGID_PKMNCANTUSEMOVETAUNT 173 #define STRINGID_PKMNREADYTOHELP 174 #define STRINGID_PKMNSWITCHEDITEMS 175 #define STRINGID_PKMNCOPIEDFOE 176 #define STRINGID_PKMNMADEWISH 177 #define STRINGID_PKMNWISHCAMETRUE 178 #define STRINGID_PKMNPLANTEDROOTS 179 #define STRINGID_PKMNABSORBEDNUTRIENTS 180 #define STRINGID_PKMNANCHOREDITSELF 181 #define STRINGID_PKMNWASMADEDROWSY 182 #define STRINGID_PKMNKNOCKEDOFF 183 #define STRINGID_PKMNSWAPPEDABILITIES 184 #define STRINGID_PKMNSEALEDOPPONENTMOVE 185 #define STRINGID_PKMNCANTUSEMOVESEALED 186 #define STRINGID_PKMNWANTSGRUDGE 187 #define STRINGID_PKMNLOSTPPGRUDGE 188 #define STRINGID_PKMNSHROUDEDITSELF 189 #define STRINGID_PKMNMOVEBOUNCED 190 #define STRINGID_PKMNWAITSFORTARGET 191 #define STRINGID_PKMNSNATCHEDMOVE 192 #define STRINGID_PKMNMADEITRAIN 193 #define STRINGID_PKMNRAISEDSPEED 194 #define STRINGID_PKMNPROTECTEDBY 195 #define STRINGID_PKMNPREVENTSUSAGE 196 #define STRINGID_PKMNRESTOREDHPUSING 197 #define STRINGID_PKMNCHANGEDTYPEWITH 198 #define STRINGID_PKMNPREVENTSPARALYSISWITH 199 #define STRINGID_PKMNPREVENTSROMANCEWITH 200 #define STRINGID_PKMNPREVENTSPOISONINGWITH 201 #define STRINGID_PKMNPREVENTSCONFUSIONWITH 202 #define STRINGID_PKMNRAISEDFIREPOWERWITH 203 #define STRINGID_PKMNANCHORSITSELFWITH 204 #define STRINGID_PKMNCUTSATTACKWITH 205 #define STRINGID_PKMNPREVENTSSTATLOSSWITH 206 #define STRINGID_PKMNHURTSWITH 207 #define STRINGID_PKMNTRACED 208 #define STRINGID_STATSHARPLY 209 #define STRINGID_STATROSE 210 #define STRINGID_STATHARSHLY 211 #define STRINGID_STATFELL 212 #define STRINGID_ATTACKERSSTATROSE 213 #define STRINGID_DEFENDERSSTATROSE 214 #define STRINGID_ATTACKERSSTATFELL 215 #define STRINGID_DEFENDERSSTATFELL 216 #define STRINGID_CRITICALHIT 217 #define STRINGID_ONEHITKO 218 #define STRINGID_123POOF 219 #define STRINGID_ANDELLIPSIS 220 #define STRINGID_NOTVERYEFFECTIVE 221 #define STRINGID_SUPEREFFECTIVE 222 #define STRINGID_GOTAWAYSAFELY 223 #define STRINGID_WILDPKMNFLED 224 #define STRINGID_NORUNNINGFROMTRAINERS 225 #define STRINGID_CANTESCAPE 226 #define STRINGID_DONTLEAVEBIRCH 227 #define STRINGID_BUTNOTHINGHAPPENED 228 #define STRINGID_BUTITFAILED 229 #define STRINGID_ITHURTCONFUSION 230 #define STRINGID_MIRRORMOVEFAILED 231 #define STRINGID_STARTEDTORAIN 232 #define STRINGID_DOWNPOURSTARTED 233 #define STRINGID_RAINCONTINUES 234 #define STRINGID_DOWNPOURCONTINUES 235 #define STRINGID_RAINSTOPPED 236 #define STRINGID_SANDSTORMBREWED 237 #define STRINGID_SANDSTORMRAGES 238 #define STRINGID_SANDSTORMSUBSIDED 239 #define STRINGID_SUNLIGHTGOTBRIGHT 240 #define STRINGID_SUNLIGHTSTRONG 241 #define STRINGID_SUNLIGHTFADED 242 #define STRINGID_STARTEDHAIL 243 #define STRINGID_HAILCONTINUES 244 #define STRINGID_HAILSTOPPED 245 #define STRINGID_FAILEDTOSPITUP 246 #define STRINGID_FAILEDTOSWALLOW 247 #define STRINGID_WINDBECAMEHEATWAVE 248 #define STRINGID_STATCHANGESGONE 249 #define STRINGID_COINSSCATTERED 250 #define STRINGID_TOOWEAKFORSUBSTITUTE 251 #define STRINGID_SHAREDPAIN 252 #define STRINGID_BELLCHIMED 253 #define STRINGID_FAINTINTHREE 254 #define STRINGID_NOPPLEFT 255 #define STRINGID_BUTNOPPLEFT 256 #define STRINGID_PLAYERUSEDITEM 257 #define STRINGID_OLDMANUSEDITEM 258 #define STRINGID_TRAINERBLOCKEDBALL 259 #define STRINGID_DONTBEATHIEF 260 #define STRINGID_ITDODGEDBALL 261 #define STRINGID_YOUMISSEDPKMN 262 #define STRINGID_PKMNBROKEFREE 263 #define STRINGID_ITAPPEAREDCAUGHT 264 #define STRINGID_AARGHALMOSTHADIT 265 #define STRINGID_SHOOTSOCLOSE 266 #define STRINGID_GOTCHAPKMNCAUGHT 267 #define STRINGID_GOTCHAPKMNCAUGHT2 268 #define STRINGID_GIVENICKNAMECAPTURED 269 #define STRINGID_PKMNSENTTOPC 270 #define STRINGID_PKMNDATAADDEDTODEX 271 #define STRINGID_ITISRAINING 272 #define STRINGID_SANDSTORMISRAGING 273 #define STRINGID_CANTESCAPE2 274 #define STRINGID_PKMNIGNORESASLEEP 275 #define STRINGID_PKMNIGNOREDORDERS 276 #define STRINGID_PKMNBEGANTONAP 277 #define STRINGID_PKMNLOAFING 278 #define STRINGID_PKMNWONTOBEY 279 #define STRINGID_PKMNTURNEDAWAY 280 #define STRINGID_PKMNPRETENDNOTNOTICE 281 #define STRINGID_ENEMYABOUTTOSWITCHPKMN 282 #define STRINGID_THREWROCK 283 #define STRINGID_THREWBAIT 284 #define STRINGID_PKMNWATCHINGCAREFULLY 285 #define STRINGID_PKMNANGRY 286 #define STRINGID_PKMNEATING 287 #define STRINGID_DUMMY288 288 #define STRINGID_DUMMY289 289 #define STRINGID_OUTOFSAFARIBALLS 290 #define STRINGID_PKMNSITEMCUREDPARALYSIS 291 #define STRINGID_PKMNSITEMCUREDPOISON 292 #define STRINGID_PKMNSITEMHEALEDBURN 293 #define STRINGID_PKMNSITEMDEFROSTEDIT 294 #define STRINGID_PKMNSITEMWOKEIT 295 #define STRINGID_PKMNSITEMSNAPPEDOUT 296 #define STRINGID_PKMNSITEMCUREDPROBLEM 297 #define STRINGID_PKMNSITEMRESTOREDHEALTH 298 #define STRINGID_PKMNSITEMRESTOREDPP 299 #define STRINGID_PKMNSITEMRESTOREDSTATUS 300 #define STRINGID_PKMNSITEMRESTOREDHPALITTLE 301 #define STRINGID_ITEMALLOWSONLYYMOVE 302 #define STRINGID_PKMNHUNGONWITHX 303 #define STRINGID_EMPTYSTRING3 304 #define STRINGID_PKMNSXPREVENTSBURNS 305 #define STRINGID_PKMNSXBLOCKSY 306 #define STRINGID_PKMNSXRESTOREDHPALITTLE2 307 #define STRINGID_PKMNSXWHIPPEDUPSANDSTORM 308 #define STRINGID_PKMNSXPREVENTSYLOSS 309 #define STRINGID_PKMNSXINFATUATEDY 310 #define STRINGID_PKMNSXMADEYINEFFECTIVE 311 #define STRINGID_PKMNSXCUREDYPROBLEM 312 #define STRINGID_ITSUCKEDLIQUIDOOZE 313 #define STRINGID_PKMNTRANSFORMED 314 #define STRINGID_ELECTRICITYWEAKENED 315 #define STRINGID_FIREWEAKENED 316 #define STRINGID_PKMNHIDUNDERWATER 317 #define STRINGID_PKMNSPRANGUP 318 #define STRINGID_HMMOVESCANTBEFORGOTTEN 319 #define STRINGID_XFOUNDONEY 320 #define STRINGID_PLAYERDEFEATEDTRAINER1 321 #define STRINGID_SOOTHINGAROMA 322 #define STRINGID_ITEMSCANTBEUSEDNOW 323 #define STRINGID_FORXCOMMAYZ 324 #define STRINGID_USINGITEMSTATOFPKMNROSE 325 #define STRINGID_PKMNUSEDXTOGETPUMPED 326 #define STRINGID_PKMNSXMADEYUSELESS 327 #define STRINGID_PKMNTRAPPEDBYSANDTOMB 328 #define STRINGID_EMPTYSTRING4 329 #define STRINGID_ABOOSTED 330 #define STRINGID_PKMNSXINTENSIFIEDSUN 331 #define STRINGID_PKMNMAKESGROUNDMISS 332 #define STRINGID_YOUTHROWABALLNOWRIGHT 333 #define STRINGID_PKMNSXTOOKATTACK 334 #define STRINGID_PKMNCHOSEXASDESTINY 335 #define STRINGID_PKMNLOSTFOCUS 336 #define STRINGID_USENEXTPKMN 337 #define STRINGID_PKMNFLEDUSINGITS 338 #define STRINGID_PKMNFLEDUSING 339 #define STRINGID_PKMNWASDRAGGEDOUT 340 #define STRINGID_PREVENTEDFROMWORKING 341 #define STRINGID_PKMNSITEMNORMALIZEDSTATUS 342 #define STRINGID_TRAINER1USEDITEM 343 #define STRINGID_BOXISFULL 344 #define STRINGID_PKMNAVOIDEDATTACK 345 #define STRINGID_PKMNSXMADEITINEFFECTIVE 346 #define STRINGID_PKMNSXPREVENTSFLINCHING 347 #define STRINGID_PKMNALREADYHASBURN 348 #define STRINGID_STATSWONTDECREASE2 349 #define STRINGID_PKMNSXBLOCKSY2 350 #define STRINGID_PKMNSXWOREOFF 351 #define STRINGID_PKMNRAISEDDEFALITTLE 352 #define STRINGID_PKMNRAISEDSPDEFALITTLE 353 #define STRINGID_THEWALLSHATTERED 354 #define STRINGID_PKMNSXPREVENTSYSZ 355 #define STRINGID_PKMNSXCUREDITSYPROBLEM 356 #define STRINGID_ATTACKERCANTESCAPE 357 #define STRINGID_PKMNOBTAINEDX 358 #define STRINGID_PKMNOBTAINEDX2 359 #define STRINGID_PKMNOBTAINEDXYOBTAINEDZ 360 #define STRINGID_BUTNOEFFECT 361 #define STRINGID_PKMNSXHADNOEFFECTONY 362 #define STRINGID_OAKPLAYERWON 363 #define STRINGID_OAKPLAYERLOST 364 #define STRINGID_PLAYERLOSTAGAINSTENEMYTRAINER 365 #define STRINGID_PLAYERPAIDPRIZEMONEY 366 #define STRINGID_PKMNTRANSFERREDSOMEONESPC 367 #define STRINGID_PKMNTRANSFERREDBILLSPC 368 #define STRINGID_PKMNBOXSOMEONESPCFULL 369 #define STRINGID_PKMNBOXBILLSPCFULL 370 #define STRINGID_POKEDUDEUSED 371 #define STRINGID_POKEFLUTECATCHY 372 #define STRINGID_POKEFLUTE 373 #define STRINGID_MONHEARINGFLUTEAWOKE 374 #define STRINGID_TRAINER2LOSETEXT 375 #define STRINGID_TRAINER2WINTEXT 376 #define STRINGID_PLAYERWHITEDOUT 377 #define STRINGID_MONTOOSCAREDTOMOVE 378 #define STRINGID_GHOSTGETOUTGETOUT 379 #define STRINGID_SILPHSCOPEUNVEILED 380 #define STRINGID_GHOSTWASMAROWAK 381 #define STRINGID_TRAINER1MON1COMEBACK 382 #define STRINGID_TRAINER1WINTEXT 383 #define STRINGID_TRAINER1MON2COMEBACK 384 #define STRINGID_TRAINER1MON1AND2COMEBACK 385 #define STRINGID_ENEMYABOUTTOSWITCHPKMNNOPREDICT 386 #define STRINGID_PICKUP 387 #define STRINGID_PICKUPSOLO 388 #define BATTLESTRINGS_COUNT 389 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, // and are instead handled explicitly by BufferStringBattle. #define BATTLESTRINGS_TABLE_START STRINGID_TRAINER1LOSETEXT // The below IDs are all indexes into battle message tables, // used to determine which of a set of messages to print. // They are assigned to the MULTISTRING_CHOOSER byte of gBattleCommunication // and read when e.g. the command printfromtable is used. // gStatUpStringIds #define B_MSG_ATTACKER_STAT_ROSE 0 #define B_MSG_DEFENDER_STAT_ROSE 1 #define B_MSG_STAT_WONT_INCREASE 2 #define B_MSG_STAT_ROSE_EMPTY 3 #define B_MSG_STAT_ROSE_ITEM 4 #define B_MSG_USED_DIRE_HIT 5 // gStatDownStringIds #define B_MSG_ATTACKER_STAT_FELL 0 #define B_MSG_DEFENDER_STAT_FELL 1 #define B_MSG_STAT_WONT_DECREASE 2 #define B_MSG_STAT_FELL_EMPTY 3 // gMissStringIds #define B_MSG_MISSED 0 #define B_MSG_PROTECTED 1 #define B_MSG_AVOIDED_ATK 2 #define B_MSG_AVOIDED_DMG 3 #define B_MSG_GROUND_MISS 4 // gAbsorbDrainStringIds #define B_MSG_ABSORB 0 #define B_MSG_ABSORB_OOZE 1 // gLeechSeedStringIds #define B_MSG_LEECH_SEED_SET 0 #define B_MSG_LEECH_SEED_MISS 1 #define B_MSG_LEECH_SEED_FAIL 2 #define B_MSG_LEECH_SEED_DRAIN 3 #define B_MSG_LEECH_SEED_OOZE 4 // gFirstTurnOfTwoStringIds #define B_MSG_TURN1_RAZOR_WIND 0 #define B_MSG_TURN1_SOLAR_BEAM 1 #define B_MSG_TURN1_SKULL_BASH 2 #define B_MSG_TURN1_SKY_ATTACK 3 #define B_MSG_TURN1_FLY 4 #define B_MSG_TURN1_DIG 5 #define B_MSG_TURN1_DIVE 6 #define B_MSG_TURN1_BOUNCE 7 // gMoveWeatherChangeStringIds #define B_MSG_STARTED_RAIN 0 #define B_MSG_STARTED_DOWNPOUR 1 #define B_MSG_WEATHER_FAILED 2 #define B_MSG_STARTED_SANDSTORM 3 #define B_MSG_STARTED_SUNLIGHT 4 #define B_MSG_STARTED_HAIL 5 // gRainContinuesStringIds #define B_MSG_RAIN_CONTINUES 0 #define B_MSG_DOWNPOUR_CONTINUES 1 #define B_MSG_RAIN_STOPPED 2 // gSandStormHailContinuesStringIds / gSandStormHailDmgStringIds/ gSandStormHailEndStringIds #define B_MSG_SANDSTORM 0 #define B_MSG_HAIL 1 // gReflectLightScreenSafeguardStringIds #define B_MSG_SIDE_STATUS_FAILED 0 #define B_MSG_SET_REFLECT_SINGLE 1 #define B_MSG_SET_REFLECT_DOUBLE 2 #define B_MSG_SET_LIGHTSCREEN_SINGLE 3 #define B_MSG_SET_LIGHTSCREEN_DOUBLE 4 #define B_MSG_SET_SAFEGUARD 5 // gProtectLikeUsedStringIds #define B_MSG_PROTECTED_ITSELF 0 #define B_MSG_BRACED_ITSELF 1 #define B_MSG_PROTECT_FAILED 2 // gRestUsedStringIds #define B_MSG_REST 0 #define B_MSG_REST_STATUSED 1 // gWokeUpStringIds #define B_MSG_WOKE_UP 0 #define B_MSG_WOKE_UP_UPROAR 1 // gUproarAwakeStringIds #define B_MSG_CANT_SLEEP_UPROAR 0 #define B_MSG_UPROAR_KEPT_AWAKE 1 #define B_MSG_STAYED_AWAKE_USING 2 // gUproarOverTurnStringIds #define B_MSG_UPROAR_CONTINUES 0 #define B_MSG_UPROAR_ENDS 1 // gStockpileUsedStringIds #define B_MSG_STOCKPILED 0 #define B_MSG_CANT_STOCKPILE 1 // gSwallowFailStringIds #define B_MSG_SWALLOW_FAILED 0 #define B_MSG_SWALLOW_FULL_HP 1 // gKOFailedStringIds #define B_MSG_KO_MISS 0 #define B_MSG_KO_UNAFFECTED 1 // gMistUsedStringIds #define B_MSG_SET_MIST 0 #define B_MSG_MIST_FAILED 1 // gFocusEnergyUsedStringIds #define B_MSG_GETTING_PUMPED 0 #define B_MSG_FOCUS_ENERGY_FAILED 1 // gTransformUsedStringIds #define B_MSG_TRANSFORMED 0 #define B_MSG_TRANSFORM_FAILED 1 // gSubstituteUsedStringIds #define B_MSG_SET_SUBSTITUTE 0 #define B_MSG_SUBSTITUTE_FAILED 1 // gPartyStatusHealStringIds #define B_MSG_BELL 0 #define B_MSG_BELL_SOUNDPROOF_ATTACKER 1 #define B_MSG_BELL_SOUNDPROOF_PARTNER 2 #define B_MSG_BELL_BOTH_SOUNDPROOF 3 #define B_MSG_SOOTHING_AROMA 4 // gFutureMoveUsedStringIds #define B_MSG_FUTURE_SIGHT 0 #define B_MSG_DOOM_DESIRE 1 // gItemSwapStringIds #define B_MSG_ITEM_SWAP_TAKEN 0 #define B_MSG_ITEM_SWAP_GIVEN 1 #define B_MSG_ITEM_SWAP_BOTH 2 // gSportsUsedStringIds #define B_MSG_WEAKEN_ELECTRIC 0 #define B_MSG_WEAKEN_FIRE 1 // gCaughtMonStringIds #define B_MSG_SENT_SOMEONES_PC 0 #define B_MSG_SENT_BILLS_PC 1 #define B_MSG_SOMEONES_BOX_FULL 2 #define B_MSG_BILLS_BOX_FULL 3 // gInobedientStringIds #define B_MSG_LOAFING 0 #define B_MSG_WONT_OBEY 1 #define B_MSG_TURNED_AWAY 2 #define B_MSG_PRETEND_NOT_NOTICE 3 #define NUM_LOAF_STRINGS 4 // For randomly selecting a disobey string // gSafariGetNearStringIds #define B_MSG_CREPT_CLOSER 0 #define B_MSG_CANT_GET_CLOSER 1 // gSafariReactionStringIds #define B_MSG_MON_WATCHING 0 #define B_MSG_MON_ANGRY 1 #define B_MSG_MON_EATING 2 #define NUM_SAFARI_REACTIONS 3 // gFlashFireStringIds #define B_MSG_FLASH_FIRE_BOOST 0 #define B_MSG_FLASH_FIRE_NO_BOOST 1 // gBerryEffectStringIds #define B_MSG_CURED_PROBLEM 0 #define B_MSG_NORMALIZED_STATUS 1 // gNoEscapeStringIds #define B_MSG_CANT_ESCAPE 0 #define B_MSG_DONT_LEAVE_BIRCH 1 #define B_MSG_PREVENTS_ESCAPE 2 #define B_MSG_CANT_ESCAPE_2 3 #define B_MSG_ATTACKER_CANT_ESCAPE 4 // gGotPoisonedStringIds / gGotParalyzedStringIds / gFellAsleepStringIds // gGotBurnedStringIds / gGotFrozenStringIds / gAttractUsedStringIds #define B_MSG_STATUSED 0 #define B_MSG_STATUSED_BY_ABILITY 1 // gBRNPreventionStringIds / gPRLZPreventionStringIds / gPSNPreventionStringIds #define B_MSG_ABILITY_PREVENTS_MOVE_STATUS 0 #define B_MSG_ABILITY_PREVENTS_ABILITY_STATUS 1 #define B_MSG_STATUS_HAD_NO_EFFECT 2 // gGotDefrostedStringIds #define B_MSG_DEFROSTED 0 #define B_MSG_DEFROSTED_BY_MOVE 1 #define NUM_TRAPPING_MOVES 6 #endif // GUARD_BATTLE_STRING_IDS_H ================================================ FILE: include/constants/battle_tower.h ================================================ #ifndef GUARD_CONSTANTS_BATTLE_TOWER_H #define GUARD_CONSTANTS_BATTLE_TOWER_H #define F_EV_SPREAD_HP 1 << 0 #define F_EV_SPREAD_ATTACK 1 << 1 #define F_EV_SPREAD_DEFENSE 1 << 2 #define F_EV_SPREAD_SPEED 1 << 3 #define F_EV_SPREAD_SP_ATTACK 1 << 4 #define F_EV_SPREAD_SP_DEFENSE 1 << 5 #define BATTLE_TOWER_ITEM_NONE 0 #define BATTLE_TOWER_ITEM_KINGS_ROCK 1 #define BATTLE_TOWER_ITEM_SITRUS_BERRY 2 #define BATTLE_TOWER_ITEM_ORAN_BERRY 3 #define BATTLE_TOWER_ITEM_CHESTO_BERRY 4 #define BATTLE_TOWER_ITEM_HARD_STONE 5 #define BATTLE_TOWER_ITEM_FOCUS_BAND 6 #define BATTLE_TOWER_ITEM_PERSIM_BERRY 7 #define BATTLE_TOWER_ITEM_MIRACLE_SEED 8 #define BATTLE_TOWER_ITEM_BERRY_JUICE 9 #define BATTLE_TOWER_ITEM_MACHO_BRACE 10 #define BATTLE_TOWER_ITEM_SILVER_POWDER 11 #define BATTLE_TOWER_ITEM_CHERI_BERRY 12 #define BATTLE_TOWER_ITEM_BLACK_GLASSES 13 #define BATTLE_TOWER_ITEM_BLACK_BELT 14 #define BATTLE_TOWER_ITEM_SOUL_DEW 15 #define BATTLE_TOWER_ITEM_CHOICE_BAND 16 #define BATTLE_TOWER_ITEM_MAGNET 17 #define BATTLE_TOWER_ITEM_SILK_SCARF 18 #define BATTLE_TOWER_ITEM_WHITE_HERB 19 #define BATTLE_TOWER_ITEM_DEEP_SEA_SCALE 20 #define BATTLE_TOWER_ITEM_DEEP_SEA_TOOTH 21 #define BATTLE_TOWER_ITEM_MYSTIC_WATER 22 #define BATTLE_TOWER_ITEM_SHARP_BEAK 23 #define BATTLE_TOWER_ITEM_QUICK_CLAW 24 #define BATTLE_TOWER_ITEM_LEFTOVERS 25 #define BATTLE_TOWER_ITEM_RAWST_BERRY 26 #define BATTLE_TOWER_ITEM_LIGHT_BALL 27 #define BATTLE_TOWER_ITEM_POISON_BARB 28 #define BATTLE_TOWER_ITEM_NEVER_MELT_ICE 29 #define BATTLE_TOWER_ITEM_ASPEAR_BERRY 30 #define BATTLE_TOWER_ITEM_SPELL_TAG 31 #define BATTLE_TOWER_ITEM_BRIGHT_POWDER 32 #define BATTLE_TOWER_ITEM_LEPPA_BERRY 33 #define BATTLE_TOWER_ITEM_SCOPE_LENS 34 #define BATTLE_TOWER_ITEM_TWISTED_SPOON 35 #define BATTLE_TOWER_ITEM_METAL_COAT 36 #define BATTLE_TOWER_ITEM_MENTAL_HERB 37 #define BATTLE_TOWER_ITEM_CHARCOAL 38 #define BATTLE_TOWER_ITEM_PECHA_BERRY 39 #define BATTLE_TOWER_ITEM_SOFT_SAND 40 #define BATTLE_TOWER_ITEM_LUM_BERRY 41 #define BATTLE_TOWER_ITEM_DRAGON_SCALE 42 #define BATTLE_TOWER_ITEM_DRAGON_FANG 43 #define BATTLE_TOWER_ITEM_IAPAPA_BERRY 44 #define BATTLE_TOWER_ITEM_WIKI_BERRY 45 #define BATTLE_TOWER_ITEM_SEA_INCENSE 46 #define BATTLE_TOWER_ITEM_SHELL_BELL 47 #define BATTLE_TOWER_ITEM_SALAC_BERRY 48 #define BATTLE_TOWER_ITEM_LANSAT_BERRY 49 #define BATTLE_TOWER_ITEM_APICOT_BERRY 50 #define BATTLE_TOWER_ITEM_STARF_BERRY 51 #define BATTLE_TOWER_ITEM_LIECHI_BERRY 52 #define BATTLE_TOWER_ITEM_STICK 53 #define BATTLE_TOWER_ITEM_LAX_INCENSE 54 #define BATTLE_TOWER_ITEM_AGUAV_BERRY 55 #define BATTLE_TOWER_ITEM_FIGY_BERRY 56 #define BATTLE_TOWER_ITEM_THICK_CLUB 57 #define BATTLE_TOWER_ITEM_MAGO_BERRY 58 #define BATTLE_TOWER_ITEM_METAL_POWDER 59 #define BATTLE_TOWER_ITEM_PETAYA_BERRY 60 #define BATTLE_TOWER_ITEM_LUCKY_PUNCH 61 #define BATTLE_TOWER_ITEM_GANLON_BERRY 62 #define BTSPECIAL_TEST 0 #define BTSPECIAL_RESULT_SAVE_SCUM 1 #define BTSPECIAL_RESULT_WON7 2 #define BTSPECIAL_RESULT_LOST 3 #define BTSPECIAL_RESULT_QUICKSAVE 4 #define BTSPECIAL_RESULT_INACTIVE 5 #endif //GUARD_CONSTANTS_BATTLE_TOWER_H ================================================ FILE: include/constants/cable_club.h ================================================ #ifndef GUARD_CONSTANTS_CABLE_CLUB_H #define GUARD_CONSTANTS_CABLE_CLUB_H // States for VAR_CABLE_CLUB_STATE #define USING_SINGLE_BATTLE 1 #define USING_DOUBLE_BATTLE 2 #define USING_TRADE_CENTER 3 #define USING_RECORD_CORNER 4 #define USING_MULTI_BATTLE 5 #define USING_UNION_ROOM 6 #define USING_BERRY_CRUSH 7 #define USING_MINIGAME 8 #define USING_BATTLE_TOWER 9 // Return states for the group of specials that use CreateLinkupTask // A few also used by TryBecomeLinkLeader and TryJoinLinkGroup #define LINKUP_ONGOING 0 #define LINKUP_SUCCESS 1 #define LINKUP_SOMEONE_NOT_READY 2 #define LINKUP_DIFF_SELECTIONS 3 #define LINKUP_WRONG_NUM_PLAYERS 4 #define LINKUP_FAILED 5 #define LINKUP_CONNECTION_ERROR 6 #define LINKUP_PLAYER_NOT_READY 7 #define LINKUP_RETRY_ROLE_ASSIGN 8 #define LINKUP_PARTNER_NOT_READY 9 #define CABLE_SEAT_WAITING 0 #define CABLE_SEAT_SUCCESS 1 #define CABLE_SEAT_FAILED 2 #endif //GUARD_CONSTANTS_CABLE_CLUB_H ================================================ FILE: include/constants/coins.h ================================================ #ifndef GUARD_CONSTANTS_COINS_H #define GUARD_CONSTANTS_COINS_H #define MAX_COINS 9999 #endif // GUARD_CONSTANTS_COINS_H ================================================ FILE: include/constants/daycare.h ================================================ #ifndef GUARD_DAYCARE_CONSTANTS_H #define GUARD_DAYCARE_CONSTANTS_H // Parent compatibility scores #define PARENTS_INCOMPATIBLE 0 #define PARENTS_LOW_COMPATIBILITY 20 #define PARENTS_MED_COMPATIBILITY 50 #define PARENTS_MAX_COMPATIBILITY 70 // Daycare state #define DAYCARE_NO_MONS 0 #define DAYCARE_EGG_WAITING 1 #define DAYCARE_ONE_MON 2 #define DAYCARE_TWO_MONS 3 #define INHERITED_IV_COUNT 3 #define EGG_HATCH_LEVEL 5 #define EGG_GENDER_MALE 0x8000 // used to create a male egg from a female-only parent species (e.g. Nidoran) #define DAYCARE_LEVEL_MENU_EXIT 5 #define DAYCARE_EXITED_LEVEL_MENU 2 // would be redundant with above if GF had used the same value // Array buffers #define EGG_MOVES_ARRAY_COUNT 10 #define EGG_LVL_UP_MOVES_ARRAY_COUNT 50 #endif //GUARD_DAYCARE_CONSTANTS_H ================================================ FILE: include/constants/decorations.h ================================================ #ifndef GUARD_CONSTANTS_DECORATIONS_H #define GUARD_CONSTANTS_DECORATIONS_H #define DECOR_NONE 0 #define DECOR_SMALL_DESK 1 #define DECOR_POKEMON_DESK 2 #define DECOR_HEAVY_DESK 3 #define DECOR_RAGGED_DESK 4 #define DECOR_COMFORT_DESK 5 #define DECOR_PRETTY_DESK 6 #define DECOR_BRICK_DESK 7 #define DECOR_CAMP_DESK 8 #define DECOR_HARD_DESK 9 #define DECOR_SMALL_CHAIR 10 #define DECOR_POKEMON_CHAIR 11 #define DECOR_HEAVY_CHAIR 12 #define DECOR_PRETTY_CHAIR 13 #define DECOR_COMFORT_CHAIR 14 #define DECOR_RAGGED_CHAIR 15 #define DECOR_BRICK_CHAIR 16 #define DECOR_CAMP_CHAIR 17 #define DECOR_HARD_CHAIR 18 #define DECOR_RED_PLANT 19 #define DECOR_TROPICAL_PLANT 20 #define DECOR_PRETTY_FLOWERS 21 #define DECOR_COLORFUL_PLANT 22 #define DECOR_BIG_PLANT 23 #define DECOR_GORGEOUS_PLANT 24 #define DECOR_RED_BRICK 25 #define DECOR_YELLOW_BRICK 26 #define DECOR_BLUE_BRICK 27 #define DECOR_RED_BALLOON 28 #define DECOR_BLUE_BALLOON 29 #define DECOR_YELLOW_BALLOON 30 #define DECOR_RED_TENT 31 #define DECOR_BLUE_TENT 32 #define DECOR_SOLID_BOARD 33 #define DECOR_SLIDE 34 #define DECOR_FENCE_LENGTH 35 #define DECOR_FENCE_WIDTH 36 #define DECOR_TIRE 37 #define DECOR_STAND 38 #define DECOR_MUD_BALL 39 #define DECOR_BREAKABLE_DOOR 40 #define DECOR_SAND_ORNAMENT 41 #define DECOR_SILVER_SHIELD 42 #define DECOR_GOLD_SHIELD 43 #define DECOR_GLASS_ORNAMENT 44 #define DECOR_TV 45 #define DECOR_ROUND_TV 46 #define DECOR_CUTE_TV 47 #define DECOR_GLITTER_MAT 48 #define DECOR_JUMP_MAT 49 #define DECOR_SPIN_MAT 50 #define DECOR_C_LOW_NOTE_MAT 51 #define DECOR_D_NOTE_MAT 52 #define DECOR_E_NOTE_MAT 53 #define DECOR_F_NOTE_MAT 54 #define DECOR_G_NOTE_MAT 55 #define DECOR_A_NOTE_MAT 56 #define DECOR_B_NOTE_MAT 57 #define DECOR_C_HIGH_NOTE_MAT 58 #define DECOR_SURF_MAT 59 #define DECOR_THUNDER_MAT 60 #define DECOR_FIRE_BLAST_MAT 61 #define DECOR_POWDER_SNOW_MAT 62 #define DECOR_ATTRACT_MAT 63 #define DECOR_FISSURE_MAT 64 #define DECOR_SPIKES_MAT 65 #define DECOR_BALL_POSTER 66 #define DECOR_GREEN_POSTER 67 #define DECOR_RED_POSTER 68 #define DECOR_BLUE_POSTER 69 #define DECOR_CUTE_POSTER 70 #define DECOR_PIKA_POSTER 71 #define DECOR_LONG_POSTER 72 #define DECOR_SEA_POSTER 73 #define DECOR_SKY_POSTER 74 #define DECOR_KISS_POSTER 75 #define DECOR_PICHU_DOLL 76 #define DECOR_PIKACHU_DOLL 77 #define DECOR_MARILL_DOLL 78 #define DECOR_TOGEPI_DOLL 79 #define DECOR_CYNDAQUIL_DOLL 80 #define DECOR_CHIKORITA_DOLL 81 #define DECOR_TOTODILE_DOLL 82 #define DECOR_JIGGLYPUFF_DOLL 83 #define DECOR_MEOWTH_DOLL 84 #define DECOR_CLEFAIRY_DOLL 85 #define DECOR_DITTO_DOLL 86 #define DECOR_SMOOCHUM_DOLL 87 #define DECOR_TREECKO_DOLL 88 #define DECOR_TORCHIC_DOLL 89 #define DECOR_MUDKIP_DOLL 90 #define DECOR_DUSKULL_DOLL 91 #define DECOR_WYNAUT_DOLL 92 #define DECOR_BALTOY_DOLL 93 #define DECOR_KECLEON_DOLL 94 #define DECOR_AZURILL_DOLL 95 #define DECOR_SKITTY_DOLL 96 #define DECOR_SWABLU_DOLL 97 #define DECOR_GULPIN_DOLL 98 #define DECOR_LOTAD_DOLL 99 #define DECOR_SEEDOT_DOLL 100 #define DECOR_PIKA_CUSHION 101 #define DECOR_ROUND_CUSHION 102 #define DECOR_KISS_CUSHION 103 #define DECOR_ZIGZAG_CUSHION 104 #define DECOR_SPIN_CUSHION 105 #define DECOR_DIAMOND_CUSHION 106 #define DECOR_BALL_CUSHION 107 #define DECOR_GRASS_CUSHION 108 #define DECOR_FIRE_CUSHION 109 #define DECOR_WATER_CUSHION 110 #define DECOR_SNORLAX_DOLL 111 #define DECOR_RHYDON_DOLL 112 #define DECOR_LAPRAS_DOLL 113 #define DECOR_VENUSAUR_DOLL 114 #define DECOR_CHARIZARD_DOLL 115 #define DECOR_BLASTOISE_DOLL 116 #define DECOR_WAILMER_DOLL 117 #define DECOR_REGIROCK_DOLL 118 #define DECOR_REGICE_DOLL 119 #define DECOR_REGISTEEL_DOLL 120 #endif // GUARD_CONSTANTS_DECORATIONS_H ================================================ FILE: include/constants/easy_chat.h ================================================ #ifndef GUARD_CONSTANTS_EASY_CHAT_H #define GUARD_CONSTANTS_EASY_CHAT_H #define EASY_CHAT_TYPE_PROFILE 0 #define EASY_CHAT_TYPE_BATTLE_START 1 #define EASY_CHAT_TYPE_BATTLE_WON 2 #define EASY_CHAT_TYPE_BATTLE_LOST 3 #define EASY_CHAT_TYPE_MAIL 4 #define EASY_CHAT_TYPE_MAIL_NO_CONFIRM 5 #define EASY_CHAT_TYPE_BARD_SONG 6 #define EASY_CHAT_TYPE_INTERVIEW 7 #define EASY_CHAT_TYPE_TRENDY_PHRASE 9 #define EASY_CHAT_TYPE_QUESTIONNAIRE 14 #define EC_GROUP_POKEMON_2 0x0 #define EC_GROUP_TRAINER 0x1 #define EC_GROUP_STATUS 0x2 #define EC_GROUP_BATTLE 0x3 #define EC_GROUP_GREETINGS 0x4 #define EC_GROUP_PEOPLE 0x5 #define EC_GROUP_VOICES 0x6 #define EC_GROUP_SPEECH 0x7 #define EC_GROUP_ENDINGS 0x8 #define EC_GROUP_FEELINGS 0x9 #define EC_GROUP_CONDITIONS 0xa #define EC_GROUP_ACTIONS 0xb #define EC_GROUP_LIFESTYLE 0xc #define EC_GROUP_HOBBIES 0xd #define EC_GROUP_TIME 0xe #define EC_GROUP_MISC 0xf #define EC_GROUP_ADJECTIVES 0x10 #define EC_GROUP_EVENTS 0x11 #define EC_GROUP_MOVE_1 0x12 #define EC_GROUP_MOVE_2 0x13 #define EC_GROUP_TRENDY_SAYING 0x14 #define EC_GROUP_POKEMON 0x15 #define EC_NUM_GROUPS 0x16 // TRAINER #define EC_WORD_I_CHOOSE_YOU (EC_GROUP_TRAINER << 9) | 0x0 #define EC_WORD_GOTCHA (EC_GROUP_TRAINER << 9) | 0x1 #define EC_WORD_TRADE (EC_GROUP_TRAINER << 9) | 0x2 #define EC_WORD_SAPPHIRE (EC_GROUP_TRAINER << 9) | 0x3 #define EC_WORD_EVOLVE (EC_GROUP_TRAINER << 9) | 0x4 #define EC_WORD_ENCYCLOPEDIA (EC_GROUP_TRAINER << 9) | 0x5 #define EC_WORD_NATURE (EC_GROUP_TRAINER << 9) | 0x6 #define EC_WORD_CENTER (EC_GROUP_TRAINER << 9) | 0x7 #define EC_WORD_EGG (EC_GROUP_TRAINER << 9) | 0x8 #define EC_WORD_LINK (EC_GROUP_TRAINER << 9) | 0x9 #define EC_WORD_SP_ABILITY (EC_GROUP_TRAINER << 9) | 0xa #define EC_WORD_TRAINER (EC_GROUP_TRAINER << 9) | 0xb #define EC_WORD_VERSION (EC_GROUP_TRAINER << 9) | 0xc #define EC_WORD_POKENAV (EC_GROUP_TRAINER << 9) | 0xd #define EC_WORD_POKEMON (EC_GROUP_TRAINER << 9) | 0xe #define EC_WORD_GET (EC_GROUP_TRAINER << 9) | 0xf #define EC_WORD_POKEDEX (EC_GROUP_TRAINER << 9) | 0x10 #define EC_WORD_RUBY (EC_GROUP_TRAINER << 9) | 0x11 #define EC_WORD_LEVEL (EC_GROUP_TRAINER << 9) | 0x12 #define EC_WORD_RED (EC_GROUP_TRAINER << 9) | 0x13 #define EC_WORD_GREEN (EC_GROUP_TRAINER << 9) | 0x14 #define EC_WORD_BAG (EC_GROUP_TRAINER << 9) | 0x15 #define EC_WORD_FLAME (EC_GROUP_TRAINER << 9) | 0x16 #define EC_WORD_GOLD (EC_GROUP_TRAINER << 9) | 0x17 #define EC_WORD_LEAF (EC_GROUP_TRAINER << 9) | 0x18 #define EC_WORD_SILVER (EC_GROUP_TRAINER << 9) | 0x19 // STATUS #define EC_WORD_DARK (EC_GROUP_STATUS << 9) | 0x0 #define EC_WORD_STENCH (EC_GROUP_STATUS << 9) | 0x1 #define EC_WORD_THICK_FAT (EC_GROUP_STATUS << 9) | 0x2 #define EC_WORD_RAIN_DISH (EC_GROUP_STATUS << 9) | 0x3 #define EC_WORD_DRIZZLE (EC_GROUP_STATUS << 9) | 0x4 #define EC_WORD_ARENA_TRAP (EC_GROUP_STATUS << 9) | 0x5 #define EC_WORD_INTIMIDATE (EC_GROUP_STATUS << 9) | 0x6 #define EC_WORD_ROCK_HEAD (EC_GROUP_STATUS << 9) | 0x7 #define EC_WORD_COLOR (EC_GROUP_STATUS << 9) | 0x8 #define EC_WORD_ALT_COLOR (EC_GROUP_STATUS << 9) | 0x9 #define EC_WORD_ROCK (EC_GROUP_STATUS << 9) | 0xa #define EC_WORD_BEAUTIFUL (EC_GROUP_STATUS << 9) | 0xb #define EC_WORD_BEAUTY (EC_GROUP_STATUS << 9) | 0xc #define EC_WORD_AIR_LOCK (EC_GROUP_STATUS << 9) | 0xd #define EC_WORD_PSYCHIC (EC_GROUP_STATUS << 9) | 0xe #define EC_WORD_HYPER_CUTTER (EC_GROUP_STATUS << 9) | 0xf #define EC_WORD_FIGHTING (EC_GROUP_STATUS << 9) | 0x10 #define EC_WORD_SHADOW_TAG (EC_GROUP_STATUS << 9) | 0x11 #define EC_WORD_SMART (EC_GROUP_STATUS << 9) | 0x12 #define EC_WORD_SMARTNESS (EC_GROUP_STATUS << 9) | 0x13 #define EC_WORD_SPEED_BOOST (EC_GROUP_STATUS << 9) | 0x14 #define EC_WORD_COOL (EC_GROUP_STATUS << 9) | 0x15 #define EC_WORD_COOLNESS (EC_GROUP_STATUS << 9) | 0x16 #define EC_WORD_BATTLE_ARMOR (EC_GROUP_STATUS << 9) | 0x17 #define EC_WORD_CUTE (EC_GROUP_STATUS << 9) | 0x18 #define EC_WORD_CUTENESS (EC_GROUP_STATUS << 9) | 0x19 #define EC_WORD_STURDY (EC_GROUP_STATUS << 9) | 0x1a #define EC_WORD_SUCTION_CUPS (EC_GROUP_STATUS << 9) | 0x1b #define EC_WORD_GRASS (EC_GROUP_STATUS << 9) | 0x1c #define EC_WORD_CLEAR_BODY (EC_GROUP_STATUS << 9) | 0x1d #define EC_WORD_TORRENT (EC_GROUP_STATUS << 9) | 0x1e #define EC_WORD_GHOST (EC_GROUP_STATUS << 9) | 0x1f #define EC_WORD_ICE (EC_GROUP_STATUS << 9) | 0x20 #define EC_WORD_GUTS (EC_GROUP_STATUS << 9) | 0x21 #define EC_WORD_ROUGH_SKIN (EC_GROUP_STATUS << 9) | 0x22 #define EC_WORD_SHELL_ARMOR (EC_GROUP_STATUS << 9) | 0x23 #define EC_WORD_NATURAL_CURE (EC_GROUP_STATUS << 9) | 0x24 #define EC_WORD_DAMP (EC_GROUP_STATUS << 9) | 0x25 #define EC_WORD_GROUND (EC_GROUP_STATUS << 9) | 0x26 #define EC_WORD_LIMBER (EC_GROUP_STATUS << 9) | 0x27 #define EC_WORD_MAGNET_PULL (EC_GROUP_STATUS << 9) | 0x28 #define EC_WORD_WHITE_SMOKE (EC_GROUP_STATUS << 9) | 0x29 #define EC_WORD_SYNCHRONIZE (EC_GROUP_STATUS << 9) | 0x2a #define EC_WORD_OVERGROW (EC_GROUP_STATUS << 9) | 0x2b #define EC_WORD_SWIFT_SWIM (EC_GROUP_STATUS << 9) | 0x2c #define EC_WORD_SAND_STREAM (EC_GROUP_STATUS << 9) | 0x2d #define EC_WORD_SAND_VEIL (EC_GROUP_STATUS << 9) | 0x2e #define EC_WORD_KEEN_EYE (EC_GROUP_STATUS << 9) | 0x2f #define EC_WORD_INNER_FOCUS (EC_GROUP_STATUS << 9) | 0x30 #define EC_WORD_STATIC (EC_GROUP_STATUS << 9) | 0x31 #define EC_WORD_TYPE (EC_GROUP_STATUS << 9) | 0x32 #define EC_WORD_TOUGH (EC_GROUP_STATUS << 9) | 0x33 #define EC_WORD_TOUGHNESS (EC_GROUP_STATUS << 9) | 0x34 #define EC_WORD_SHED_SKIN (EC_GROUP_STATUS << 9) | 0x35 #define EC_WORD_HUGE_POWER (EC_GROUP_STATUS << 9) | 0x36 #define EC_WORD_VOLT_ABSORB (EC_GROUP_STATUS << 9) | 0x37 #define EC_WORD_WATER_ABSORB (EC_GROUP_STATUS << 9) | 0x38 #define EC_WORD_ELECTRIC (EC_GROUP_STATUS << 9) | 0x39 #define EC_WORD_FORECAST (EC_GROUP_STATUS << 9) | 0x3a #define EC_WORD_SERENE_GRACE (EC_GROUP_STATUS << 9) | 0x3b #define EC_WORD_POISON (EC_GROUP_STATUS << 9) | 0x3c #define EC_WORD_POISON_POINT (EC_GROUP_STATUS << 9) | 0x3d #define EC_WORD_DRAGON (EC_GROUP_STATUS << 9) | 0x3e #define EC_WORD_TRACE (EC_GROUP_STATUS << 9) | 0x3f #define EC_WORD_OBLIVIOUS (EC_GROUP_STATUS << 9) | 0x40 #define EC_WORD_TRUANT (EC_GROUP_STATUS << 9) | 0x41 #define EC_WORD_RUN_AWAY (EC_GROUP_STATUS << 9) | 0x42 #define EC_WORD_STICKY_HOLD (EC_GROUP_STATUS << 9) | 0x43 #define EC_WORD_CLOUD_NINE (EC_GROUP_STATUS << 9) | 0x44 #define EC_WORD_NORMAL (EC_GROUP_STATUS << 9) | 0x45 #define EC_WORD_STEEL (EC_GROUP_STATUS << 9) | 0x46 #define EC_WORD_ILLUMINATE (EC_GROUP_STATUS << 9) | 0x47 #define EC_WORD_EARLY_BIRD (EC_GROUP_STATUS << 9) | 0x48 #define EC_WORD_HUSTLE (EC_GROUP_STATUS << 9) | 0x49 #define EC_WORD_SHINE (EC_GROUP_STATUS << 9) | 0x4a #define EC_WORD_FLYING (EC_GROUP_STATUS << 9) | 0x4b #define EC_WORD_DROUGHT (EC_GROUP_STATUS << 9) | 0x4c #define EC_WORD_LIGHTNINGROD (EC_GROUP_STATUS << 9) | 0x4d #define EC_WORD_COMPOUNDEYES (EC_GROUP_STATUS << 9) | 0x4e #define EC_WORD_MARVEL_SCALE (EC_GROUP_STATUS << 9) | 0x4f #define EC_WORD_WONDER_GUARD (EC_GROUP_STATUS << 9) | 0x50 #define EC_WORD_INSOMNIA (EC_GROUP_STATUS << 9) | 0x51 #define EC_WORD_LEVITATE (EC_GROUP_STATUS << 9) | 0x52 #define EC_WORD_PLUS (EC_GROUP_STATUS << 9) | 0x53 #define EC_WORD_PRESSURE (EC_GROUP_STATUS << 9) | 0x54 #define EC_WORD_LIQUID_OOZE (EC_GROUP_STATUS << 9) | 0x55 #define EC_WORD_COLOR_CHANGE (EC_GROUP_STATUS << 9) | 0x56 #define EC_WORD_SOUNDPROOF (EC_GROUP_STATUS << 9) | 0x57 #define EC_WORD_EFFECT_SPORE (EC_GROUP_STATUS << 9) | 0x58 #define EC_WORD_PKRS (EC_GROUP_STATUS << 9) | 0x59 #define EC_WORD_FIRE (EC_GROUP_STATUS << 9) | 0x5a #define EC_WORD_FLAME_BODY (EC_GROUP_STATUS << 9) | 0x5b #define EC_WORD_MINUS (EC_GROUP_STATUS << 9) | 0x5c #define EC_WORD_OWN_TEMPO (EC_GROUP_STATUS << 9) | 0x5d #define EC_WORD_MAGMA_ARMOR (EC_GROUP_STATUS << 9) | 0x5e #define EC_WORD_WATER (EC_GROUP_STATUS << 9) | 0x5f #define EC_WORD_WATER_VEIL (EC_GROUP_STATUS << 9) | 0x60 #define EC_WORD_BUG (EC_GROUP_STATUS << 9) | 0x61 #define EC_WORD_SWARM (EC_GROUP_STATUS << 9) | 0x62 #define EC_WORD_CUTE_CHARM (EC_GROUP_STATUS << 9) | 0x63 #define EC_WORD_IMMUNITY (EC_GROUP_STATUS << 9) | 0x64 #define EC_WORD_BLAZE (EC_GROUP_STATUS << 9) | 0x65 #define EC_WORD_PICKUP (EC_GROUP_STATUS << 9) | 0x66 #define EC_WORD_PATTERN (EC_GROUP_STATUS << 9) | 0x67 #define EC_WORD_FLASH_FIRE (EC_GROUP_STATUS << 9) | 0x68 #define EC_WORD_VITAL_SPIRIT (EC_GROUP_STATUS << 9) | 0x69 #define EC_WORD_CHLOROPHYLL (EC_GROUP_STATUS << 9) | 0x6a #define EC_WORD_PURE_POWER (EC_GROUP_STATUS << 9) | 0x6b #define EC_WORD_SHIELD_DUST (EC_GROUP_STATUS << 9) | 0x6c // BATTLE #define EC_WORD_MATCH_UP (EC_GROUP_BATTLE << 9) | 0x0 #define EC_WORD_GO (EC_GROUP_BATTLE << 9) | 0x1 #define EC_WORD_NO_1 (EC_GROUP_BATTLE << 9) | 0x2 #define EC_WORD_DECIDE (EC_GROUP_BATTLE << 9) | 0x3 #define EC_WORD_LET_ME_WIN (EC_GROUP_BATTLE << 9) | 0x4 #define EC_WORD_WINS (EC_GROUP_BATTLE << 9) | 0x5 #define EC_WORD_WIN (EC_GROUP_BATTLE << 9) | 0x6 #define EC_WORD_WON (EC_GROUP_BATTLE << 9) | 0x7 #define EC_WORD_IF_I_WIN (EC_GROUP_BATTLE << 9) | 0x8 #define EC_WORD_WHEN_I_WIN (EC_GROUP_BATTLE << 9) | 0x9 #define EC_WORD_CAN_T_WIN (EC_GROUP_BATTLE << 9) | 0xa #define EC_WORD_CAN_WIN (EC_GROUP_BATTLE << 9) | 0xb #define EC_WORD_NO_MATCH (EC_GROUP_BATTLE << 9) | 0xc #define EC_WORD_SPIRIT (EC_GROUP_BATTLE << 9) | 0xd #define EC_WORD_DECIDED (EC_GROUP_BATTLE << 9) | 0xe #define EC_WORD_TRUMP_CARD (EC_GROUP_BATTLE << 9) | 0xf #define EC_WORD_TAKE_THAT (EC_GROUP_BATTLE << 9) | 0x10 #define EC_WORD_COME_ON (EC_GROUP_BATTLE << 9) | 0x11 #define EC_WORD_ATTACK (EC_GROUP_BATTLE << 9) | 0x12 #define EC_WORD_SURRENDER (EC_GROUP_BATTLE << 9) | 0x13 #define EC_WORD_GUTSY (EC_GROUP_BATTLE << 9) | 0x14 #define EC_WORD_TALENT (EC_GROUP_BATTLE << 9) | 0x15 #define EC_WORD_STRATEGY (EC_GROUP_BATTLE << 9) | 0x16 #define EC_WORD_SMITE (EC_GROUP_BATTLE << 9) | 0x17 #define EC_WORD_MATCH (EC_GROUP_BATTLE << 9) | 0x18 #define EC_WORD_VICTORY (EC_GROUP_BATTLE << 9) | 0x19 #define EC_WORD_OFFENSIVE (EC_GROUP_BATTLE << 9) | 0x1a #define EC_WORD_SENSE (EC_GROUP_BATTLE << 9) | 0x1b #define EC_WORD_VERSUS (EC_GROUP_BATTLE << 9) | 0x1c #define EC_WORD_FIGHTS (EC_GROUP_BATTLE << 9) | 0x1d #define EC_WORD_POWER (EC_GROUP_BATTLE << 9) | 0x1e #define EC_WORD_CHALLENGE (EC_GROUP_BATTLE << 9) | 0x1f #define EC_WORD_STRONG (EC_GROUP_BATTLE << 9) | 0x20 #define EC_WORD_TOO_STRONG (EC_GROUP_BATTLE << 9) | 0x21 #define EC_WORD_GO_EASY (EC_GROUP_BATTLE << 9) | 0x22 #define EC_WORD_FOE (EC_GROUP_BATTLE << 9) | 0x23 #define EC_WORD_GENIUS (EC_GROUP_BATTLE << 9) | 0x24 #define EC_WORD_LEGEND (EC_GROUP_BATTLE << 9) | 0x25 #define EC_WORD_ESCAPE (EC_GROUP_BATTLE << 9) | 0x26 #define EC_WORD_AIM (EC_GROUP_BATTLE << 9) | 0x27 #define EC_WORD_BATTLE (EC_GROUP_BATTLE << 9) | 0x28 #define EC_WORD_FIGHT (EC_GROUP_BATTLE << 9) | 0x29 #define EC_WORD_RESUSCITATE (EC_GROUP_BATTLE << 9) | 0x2a #define EC_WORD_POINTS (EC_GROUP_BATTLE << 9) | 0x2b #define EC_WORD_SERIOUS (EC_GROUP_BATTLE << 9) | 0x2c #define EC_WORD_GIVE_UP (EC_GROUP_BATTLE << 9) | 0x2d #define EC_WORD_LOSS (EC_GROUP_BATTLE << 9) | 0x2e #define EC_WORD_IF_I_LOSE (EC_GROUP_BATTLE << 9) | 0x2f #define EC_WORD_LOST (EC_GROUP_BATTLE << 9) | 0x30 #define EC_WORD_LOSE (EC_GROUP_BATTLE << 9) | 0x31 #define EC_WORD_GUARD (EC_GROUP_BATTLE << 9) | 0x32 #define EC_WORD_PARTNER (EC_GROUP_BATTLE << 9) | 0x33 #define EC_WORD_REJECT (EC_GROUP_BATTLE << 9) | 0x34 #define EC_WORD_ACCEPT (EC_GROUP_BATTLE << 9) | 0x35 #define EC_WORD_INVINCIBLE (EC_GROUP_BATTLE << 9) | 0x36 #define EC_WORD_RECEIVED (EC_GROUP_BATTLE << 9) | 0x37 #define EC_WORD_EASY (EC_GROUP_BATTLE << 9) | 0x38 #define EC_WORD_WEAK (EC_GROUP_BATTLE << 9) | 0x39 #define EC_WORD_TOO_WEAK (EC_GROUP_BATTLE << 9) | 0x3a #define EC_WORD_PUSHOVER (EC_GROUP_BATTLE << 9) | 0x3b #define EC_WORD_LEADER (EC_GROUP_BATTLE << 9) | 0x3c #define EC_WORD_RULE (EC_GROUP_BATTLE << 9) | 0x3d #define EC_WORD_MOVE (EC_GROUP_BATTLE << 9) | 0x3e // GREETINGS #define EC_WORD_THANKS (EC_GROUP_GREETINGS << 9) | 0x0 #define EC_WORD_YES (EC_GROUP_GREETINGS << 9) | 0x1 #define EC_WORD_HERE_GOES (EC_GROUP_GREETINGS << 9) | 0x2 #define EC_WORD_HERE_I_COME (EC_GROUP_GREETINGS << 9) | 0x3 #define EC_WORD_HERE_IT_IS (EC_GROUP_GREETINGS << 9) | 0x4 #define EC_WORD_YEAH (EC_GROUP_GREETINGS << 9) | 0x5 #define EC_WORD_WELCOME (EC_GROUP_GREETINGS << 9) | 0x6 #define EC_WORD_OI (EC_GROUP_GREETINGS << 9) | 0x7 #define EC_WORD_HOW_DO (EC_GROUP_GREETINGS << 9) | 0x8 #define EC_WORD_CONGRATS (EC_GROUP_GREETINGS << 9) | 0x9 #define EC_WORD_GIVE_ME (EC_GROUP_GREETINGS << 9) | 0xa #define EC_WORD_SORRY (EC_GROUP_GREETINGS << 9) | 0xb #define EC_WORD_APOLOGIZE (EC_GROUP_GREETINGS << 9) | 0xc #define EC_WORD_FORGIVE (EC_GROUP_GREETINGS << 9) | 0xd #define EC_WORD_HEY_THERE (EC_GROUP_GREETINGS << 9) | 0xe #define EC_WORD_HELLO (EC_GROUP_GREETINGS << 9) | 0xf #define EC_WORD_GOOD_BYE (EC_GROUP_GREETINGS << 9) | 0x10 #define EC_WORD_THANK_YOU (EC_GROUP_GREETINGS << 9) | 0x11 #define EC_WORD_I_VE_ARRIVED (EC_GROUP_GREETINGS << 9) | 0x12 #define EC_WORD_PARDON (EC_GROUP_GREETINGS << 9) | 0x13 #define EC_WORD_EXCUSE (EC_GROUP_GREETINGS << 9) | 0x14 #define EC_WORD_SEE_YA (EC_GROUP_GREETINGS << 9) | 0x15 #define EC_WORD_EXCUSE_ME (EC_GROUP_GREETINGS << 9) | 0x16 #define EC_WORD_WELL_THEN (EC_GROUP_GREETINGS << 9) | 0x17 #define EC_WORD_GO_AHEAD (EC_GROUP_GREETINGS << 9) | 0x18 #define EC_WORD_APPRECIATE (EC_GROUP_GREETINGS << 9) | 0x19 #define EC_WORD_HEY_QUES (EC_GROUP_GREETINGS << 9) | 0x1a #define EC_WORD_WHAT_S_UP_QUES (EC_GROUP_GREETINGS << 9) | 0x1b #define EC_WORD_HUH_QUES (EC_GROUP_GREETINGS << 9) | 0x1c #define EC_WORD_NO (EC_GROUP_GREETINGS << 9) | 0x1d #define EC_WORD_HI (EC_GROUP_GREETINGS << 9) | 0x1e #define EC_WORD_YEAH_YEAH (EC_GROUP_GREETINGS << 9) | 0x1f #define EC_WORD_BYE_BYE (EC_GROUP_GREETINGS << 9) | 0x20 #define EC_WORD_MEET_YOU (EC_GROUP_GREETINGS << 9) | 0x21 #define EC_WORD_HEY (EC_GROUP_GREETINGS << 9) | 0x22 #define EC_WORD_SMELL (EC_GROUP_GREETINGS << 9) | 0x23 #define EC_WORD_LISTENING (EC_GROUP_GREETINGS << 9) | 0x24 #define EC_WORD_HOO_HAH (EC_GROUP_GREETINGS << 9) | 0x25 #define EC_WORD_YAHOO (EC_GROUP_GREETINGS << 9) | 0x26 #define EC_WORD_YO (EC_GROUP_GREETINGS << 9) | 0x27 #define EC_WORD_COME_OVER (EC_GROUP_GREETINGS << 9) | 0x28 #define EC_WORD_COUNT_ON (EC_GROUP_GREETINGS << 9) | 0x29 // PEOPLE #define EC_WORD_OPPONENT (EC_GROUP_PEOPLE << 9) | 0x0 #define EC_WORD_I (EC_GROUP_PEOPLE << 9) | 0x1 #define EC_WORD_YOU (EC_GROUP_PEOPLE << 9) | 0x2 #define EC_WORD_YOURS (EC_GROUP_PEOPLE << 9) | 0x3 #define EC_WORD_SON (EC_GROUP_PEOPLE << 9) | 0x4 #define EC_WORD_YOUR (EC_GROUP_PEOPLE << 9) | 0x5 #define EC_WORD_YOU_RE (EC_GROUP_PEOPLE << 9) | 0x6 #define EC_WORD_YOU_VE (EC_GROUP_PEOPLE << 9) | 0x7 #define EC_WORD_MOTHER (EC_GROUP_PEOPLE << 9) | 0x8 #define EC_WORD_GRANDFATHER (EC_GROUP_PEOPLE << 9) | 0x9 #define EC_WORD_UNCLE (EC_GROUP_PEOPLE << 9) | 0xa #define EC_WORD_FATHER (EC_GROUP_PEOPLE << 9) | 0xb #define EC_WORD_BOY (EC_GROUP_PEOPLE << 9) | 0xc #define EC_WORD_ADULT (EC_GROUP_PEOPLE << 9) | 0xd #define EC_WORD_BROTHER (EC_GROUP_PEOPLE << 9) | 0xe #define EC_WORD_SISTER (EC_GROUP_PEOPLE << 9) | 0xf #define EC_WORD_GRANDMOTHER (EC_GROUP_PEOPLE << 9) | 0x10 #define EC_WORD_AUNT (EC_GROUP_PEOPLE << 9) | 0x11 #define EC_WORD_PARENT (EC_GROUP_PEOPLE << 9) | 0x12 #define EC_WORD_MAN (EC_GROUP_PEOPLE << 9) | 0x13 #define EC_WORD_ME (EC_GROUP_PEOPLE << 9) | 0x14 #define EC_WORD_GIRL (EC_GROUP_PEOPLE << 9) | 0x15 #define EC_WORD_BABE (EC_GROUP_PEOPLE << 9) | 0x16 #define EC_WORD_FAMILY (EC_GROUP_PEOPLE << 9) | 0x17 #define EC_WORD_HER (EC_GROUP_PEOPLE << 9) | 0x18 #define EC_WORD_HIM (EC_GROUP_PEOPLE << 9) | 0x19 #define EC_WORD_HE (EC_GROUP_PEOPLE << 9) | 0x1a #define EC_WORD_PLACE (EC_GROUP_PEOPLE << 9) | 0x1b #define EC_WORD_DAUGHTER (EC_GROUP_PEOPLE << 9) | 0x1c #define EC_WORD_HIS (EC_GROUP_PEOPLE << 9) | 0x1d #define EC_WORD_HE_S (EC_GROUP_PEOPLE << 9) | 0x1e #define EC_WORD_AREN_T (EC_GROUP_PEOPLE << 9) | 0x1f #define EC_WORD_SIBLINGS (EC_GROUP_PEOPLE << 9) | 0x20 #define EC_WORD_KID (EC_GROUP_PEOPLE << 9) | 0x21 #define EC_WORD_CHILDREN (EC_GROUP_PEOPLE << 9) | 0x22 #define EC_WORD_MR (EC_GROUP_PEOPLE << 9) | 0x23 #define EC_WORD_MRS (EC_GROUP_PEOPLE << 9) | 0x24 #define EC_WORD_MYSELF (EC_GROUP_PEOPLE << 9) | 0x25 #define EC_WORD_I_WAS (EC_GROUP_PEOPLE << 9) | 0x26 #define EC_WORD_TO_ME (EC_GROUP_PEOPLE << 9) | 0x27 #define EC_WORD_MY (EC_GROUP_PEOPLE << 9) | 0x28 #define EC_WORD_I_AM (EC_GROUP_PEOPLE << 9) | 0x29 #define EC_WORD_I_VE (EC_GROUP_PEOPLE << 9) | 0x2a #define EC_WORD_WHO (EC_GROUP_PEOPLE << 9) | 0x2b #define EC_WORD_SOMEONE (EC_GROUP_PEOPLE << 9) | 0x2c #define EC_WORD_WHO_WAS (EC_GROUP_PEOPLE << 9) | 0x2d #define EC_WORD_TO_WHOM (EC_GROUP_PEOPLE << 9) | 0x2e #define EC_WORD_WHOSE (EC_GROUP_PEOPLE << 9) | 0x2f #define EC_WORD_WHO_IS (EC_GROUP_PEOPLE << 9) | 0x30 #define EC_WORD_IT_S (EC_GROUP_PEOPLE << 9) | 0x31 #define EC_WORD_LADY (EC_GROUP_PEOPLE << 9) | 0x32 #define EC_WORD_FRIEND (EC_GROUP_PEOPLE << 9) | 0x33 #define EC_WORD_ALLY (EC_GROUP_PEOPLE << 9) | 0x34 #define EC_WORD_PERSON (EC_GROUP_PEOPLE << 9) | 0x35 #define EC_WORD_DUDE (EC_GROUP_PEOPLE << 9) | 0x36 #define EC_WORD_THEY (EC_GROUP_PEOPLE << 9) | 0x37 #define EC_WORD_THEY_WERE (EC_GROUP_PEOPLE << 9) | 0x38 #define EC_WORD_TO_THEM (EC_GROUP_PEOPLE << 9) | 0x39 #define EC_WORD_THEIR (EC_GROUP_PEOPLE << 9) | 0x3a #define EC_WORD_THEY_RE (EC_GROUP_PEOPLE << 9) | 0x3b #define EC_WORD_THEY_VE (EC_GROUP_PEOPLE << 9) | 0x3c #define EC_WORD_WE (EC_GROUP_PEOPLE << 9) | 0x3d #define EC_WORD_BEEN (EC_GROUP_PEOPLE << 9) | 0x3e #define EC_WORD_TO_US (EC_GROUP_PEOPLE << 9) | 0x3f #define EC_WORD_OUR (EC_GROUP_PEOPLE << 9) | 0x40 #define EC_WORD_WE_RE (EC_GROUP_PEOPLE << 9) | 0x41 #define EC_WORD_RIVAL (EC_GROUP_PEOPLE << 9) | 0x42 #define EC_WORD_WE_VE (EC_GROUP_PEOPLE << 9) | 0x43 #define EC_WORD_WOMAN (EC_GROUP_PEOPLE << 9) | 0x44 #define EC_WORD_SHE (EC_GROUP_PEOPLE << 9) | 0x45 #define EC_WORD_SHE_WAS (EC_GROUP_PEOPLE << 9) | 0x46 #define EC_WORD_TO_HER (EC_GROUP_PEOPLE << 9) | 0x47 #define EC_WORD_HERS (EC_GROUP_PEOPLE << 9) | 0x48 #define EC_WORD_SHE_IS (EC_GROUP_PEOPLE << 9) | 0x49 #define EC_WORD_SOME (EC_GROUP_PEOPLE << 9) | 0x4a // VOICES #define EC_WORD_EXCL (EC_GROUP_VOICES << 9) | 0x0 #define EC_WORD_EXCL_EXCL (EC_GROUP_VOICES << 9) | 0x1 #define EC_WORD_QUES_EXCL (EC_GROUP_VOICES << 9) | 0x2 #define EC_WORD_QUES (EC_GROUP_VOICES << 9) | 0x3 #define EC_WORD_ELLIPSIS (EC_GROUP_VOICES << 9) | 0x4 #define EC_WORD_ELLIPSIS_EXCL (EC_GROUP_VOICES << 9) | 0x5 #define EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS (EC_GROUP_VOICES << 9) | 0x6 #define EC_WORD_DASH (EC_GROUP_VOICES << 9) | 0x7 #define EC_WORD_DASH_DASH_DASH (EC_GROUP_VOICES << 9) | 0x8 #define EC_WORD_UH_OH (EC_GROUP_VOICES << 9) | 0x9 #define EC_WORD_WAAAH (EC_GROUP_VOICES << 9) | 0xa #define EC_WORD_AHAHA (EC_GROUP_VOICES << 9) | 0xb #define EC_WORD_OH_QUES (EC_GROUP_VOICES << 9) | 0xc #define EC_WORD_NOPE (EC_GROUP_VOICES << 9) | 0xd #define EC_WORD_URGH (EC_GROUP_VOICES << 9) | 0xe #define EC_WORD_HMM (EC_GROUP_VOICES << 9) | 0xf #define EC_WORD_WHOAH (EC_GROUP_VOICES << 9) | 0x10 #define EC_WORD_WROOOAAR_EXCL (EC_GROUP_VOICES << 9) | 0x11 #define EC_WORD_WOW (EC_GROUP_VOICES << 9) | 0x12 #define EC_WORD_GIGGLE (EC_GROUP_VOICES << 9) | 0x13 #define EC_WORD_SIGH (EC_GROUP_VOICES << 9) | 0x14 #define EC_WORD_UNBELIEVABLE (EC_GROUP_VOICES << 9) | 0x15 #define EC_WORD_CRIES (EC_GROUP_VOICES << 9) | 0x16 #define EC_WORD_AGREE (EC_GROUP_VOICES << 9) | 0x17 #define EC_WORD_EH_QUES (EC_GROUP_VOICES << 9) | 0x18 #define EC_WORD_CRY (EC_GROUP_VOICES << 9) | 0x19 #define EC_WORD_EHEHE (EC_GROUP_VOICES << 9) | 0x1a #define EC_WORD_OI_OI_OI (EC_GROUP_VOICES << 9) | 0x1b #define EC_WORD_OH_YEAH (EC_GROUP_VOICES << 9) | 0x1c #define EC_WORD_OH (EC_GROUP_VOICES << 9) | 0x1d #define EC_WORD_OOPS (EC_GROUP_VOICES << 9) | 0x1e #define EC_WORD_SHOCKED (EC_GROUP_VOICES << 9) | 0x1f #define EC_WORD_EEK (EC_GROUP_VOICES << 9) | 0x20 #define EC_WORD_GRAAAH (EC_GROUP_VOICES << 9) | 0x21 #define EC_WORD_GWAHAHAHA (EC_GROUP_VOICES << 9) | 0x22 #define EC_WORD_WAY (EC_GROUP_VOICES << 9) | 0x23 #define EC_WORD_TCH (EC_GROUP_VOICES << 9) | 0x24 #define EC_WORD_HEHE (EC_GROUP_VOICES << 9) | 0x25 #define EC_WORD_HAH (EC_GROUP_VOICES << 9) | 0x26 #define EC_WORD_YUP (EC_GROUP_VOICES << 9) | 0x27 #define EC_WORD_HAHAHA (EC_GROUP_VOICES << 9) | 0x28 #define EC_WORD_AIYEEH (EC_GROUP_VOICES << 9) | 0x29 #define EC_WORD_HIYAH (EC_GROUP_VOICES << 9) | 0x2a #define EC_WORD_FUFUFU (EC_GROUP_VOICES << 9) | 0x2b #define EC_WORD_LOL (EC_GROUP_VOICES << 9) | 0x2c #define EC_WORD_SNORT (EC_GROUP_VOICES << 9) | 0x2d #define EC_WORD_HUMPH (EC_GROUP_VOICES << 9) | 0x2e #define EC_WORD_HEHEHE (EC_GROUP_VOICES << 9) | 0x2f #define EC_WORD_HEH (EC_GROUP_VOICES << 9) | 0x30 #define EC_WORD_HOHOHO (EC_GROUP_VOICES << 9) | 0x31 #define EC_WORD_UH_HUH (EC_GROUP_VOICES << 9) | 0x32 #define EC_WORD_OH_DEAR (EC_GROUP_VOICES << 9) | 0x33 #define EC_WORD_ARRGH (EC_GROUP_VOICES << 9) | 0x34 #define EC_WORD_MUFUFU (EC_GROUP_VOICES << 9) | 0x35 #define EC_WORD_MMM (EC_GROUP_VOICES << 9) | 0x36 #define EC_WORD_OH_KAY (EC_GROUP_VOICES << 9) | 0x37 #define EC_WORD_OKAY (EC_GROUP_VOICES << 9) | 0x38 #define EC_WORD_LALALA (EC_GROUP_VOICES << 9) | 0x39 #define EC_WORD_YAY (EC_GROUP_VOICES << 9) | 0x3a #define EC_WORD_AWW (EC_GROUP_VOICES << 9) | 0x3b #define EC_WORD_WOWEE (EC_GROUP_VOICES << 9) | 0x3c #define EC_WORD_GWAH (EC_GROUP_VOICES << 9) | 0x3d #define EC_WORD_WAHAHAHA (EC_GROUP_VOICES << 9) | 0x3e // SPEECH #define EC_WORD_LISTEN (EC_GROUP_SPEECH << 9) | 0x0 #define EC_WORD_NOT_VERY (EC_GROUP_SPEECH << 9) | 0x1 #define EC_WORD_MEAN (EC_GROUP_SPEECH << 9) | 0x2 #define EC_WORD_LIE (EC_GROUP_SPEECH << 9) | 0x3 #define EC_WORD_LAY (EC_GROUP_SPEECH << 9) | 0x4 #define EC_WORD_RECOMMEND (EC_GROUP_SPEECH << 9) | 0x5 #define EC_WORD_NITWIT (EC_GROUP_SPEECH << 9) | 0x6 #define EC_WORD_QUITE (EC_GROUP_SPEECH << 9) | 0x7 #define EC_WORD_FROM (EC_GROUP_SPEECH << 9) | 0x8 #define EC_WORD_FEELING (EC_GROUP_SPEECH << 9) | 0x9 #define EC_WORD_BUT (EC_GROUP_SPEECH << 9) | 0xa #define EC_WORD_HOWEVER (EC_GROUP_SPEECH << 9) | 0xb #define EC_WORD_CASE (EC_GROUP_SPEECH << 9) | 0xc #define EC_WORD_THE (EC_GROUP_SPEECH << 9) | 0xd #define EC_WORD_MISS (EC_GROUP_SPEECH << 9) | 0xe #define EC_WORD_HOW (EC_GROUP_SPEECH << 9) | 0xf #define EC_WORD_HIT (EC_GROUP_SPEECH << 9) | 0x10 #define EC_WORD_ENOUGH (EC_GROUP_SPEECH << 9) | 0x11 #define EC_WORD_A_LOT (EC_GROUP_SPEECH << 9) | 0x12 #define EC_WORD_A_LITTLE (EC_GROUP_SPEECH << 9) | 0x13 #define EC_WORD_ABSOLUTELY (EC_GROUP_SPEECH << 9) | 0x14 #define EC_WORD_AND (EC_GROUP_SPEECH << 9) | 0x15 #define EC_WORD_ONLY (EC_GROUP_SPEECH << 9) | 0x16 #define EC_WORD_AROUND (EC_GROUP_SPEECH << 9) | 0x17 #define EC_WORD_PROBABLY (EC_GROUP_SPEECH << 9) | 0x18 #define EC_WORD_IF (EC_GROUP_SPEECH << 9) | 0x19 #define EC_WORD_VERY (EC_GROUP_SPEECH << 9) | 0x1a #define EC_WORD_A_TINY_BIT (EC_GROUP_SPEECH << 9) | 0x1b #define EC_WORD_WILD (EC_GROUP_SPEECH << 9) | 0x1c #define EC_WORD_THAT_S (EC_GROUP_SPEECH << 9) | 0x1d #define EC_WORD_JUST (EC_GROUP_SPEECH << 9) | 0x1e #define EC_WORD_EVEN_SO (EC_GROUP_SPEECH << 9) | 0x1f #define EC_WORD_MUST_BE (EC_GROUP_SPEECH << 9) | 0x20 #define EC_WORD_NATURALLY (EC_GROUP_SPEECH << 9) | 0x21 #define EC_WORD_FOR_NOW (EC_GROUP_SPEECH << 9) | 0x22 #define EC_WORD_UNDERSTOOD (EC_GROUP_SPEECH << 9) | 0x23 #define EC_WORD_JOKING (EC_GROUP_SPEECH << 9) | 0x24 #define EC_WORD_READY (EC_GROUP_SPEECH << 9) | 0x25 #define EC_WORD_SOMETHING (EC_GROUP_SPEECH << 9) | 0x26 #define EC_WORD_SOMEHOW (EC_GROUP_SPEECH << 9) | 0x27 #define EC_WORD_ALTHOUGH (EC_GROUP_SPEECH << 9) | 0x28 #define EC_WORD_ALSO (EC_GROUP_SPEECH << 9) | 0x29 #define EC_WORD_PERFECT (EC_GROUP_SPEECH << 9) | 0x2a #define EC_WORD_AS_MUCH_AS (EC_GROUP_SPEECH << 9) | 0x2b #define EC_WORD_REALLY (EC_GROUP_SPEECH << 9) | 0x2c #define EC_WORD_TRULY (EC_GROUP_SPEECH << 9) | 0x2d #define EC_WORD_SERIOUSLY (EC_GROUP_SPEECH << 9) | 0x2e #define EC_WORD_TOTALLY (EC_GROUP_SPEECH << 9) | 0x2f #define EC_WORD_UNTIL (EC_GROUP_SPEECH << 9) | 0x30 #define EC_WORD_AS_IF (EC_GROUP_SPEECH << 9) | 0x31 #define EC_WORD_MOOD (EC_GROUP_SPEECH << 9) | 0x32 #define EC_WORD_RATHER (EC_GROUP_SPEECH << 9) | 0x33 #define EC_WORD_AWFULLY (EC_GROUP_SPEECH << 9) | 0x34 #define EC_WORD_MODE (EC_GROUP_SPEECH << 9) | 0x35 #define EC_WORD_MORE (EC_GROUP_SPEECH << 9) | 0x36 #define EC_WORD_TOO_LATE (EC_GROUP_SPEECH << 9) | 0x37 #define EC_WORD_FINALLY (EC_GROUP_SPEECH << 9) | 0x38 #define EC_WORD_ANY (EC_GROUP_SPEECH << 9) | 0x39 #define EC_WORD_INSTEAD (EC_GROUP_SPEECH << 9) | 0x3a #define EC_WORD_FANTASTIC (EC_GROUP_SPEECH << 9) | 0x3b // ENDINGS #define EC_WORD_WILL (EC_GROUP_ENDINGS << 9) | 0x0 #define EC_WORD_WILL_BE_HERE (EC_GROUP_ENDINGS << 9) | 0x1 #define EC_WORD_OR (EC_GROUP_ENDINGS << 9) | 0x2 #define EC_WORD_TIMES (EC_GROUP_ENDINGS << 9) | 0x3 #define EC_WORD_WONDER (EC_GROUP_ENDINGS << 9) | 0x4 #define EC_WORD_IS_IT_QUES (EC_GROUP_ENDINGS << 9) | 0x5 #define EC_WORD_BE (EC_GROUP_ENDINGS << 9) | 0x6 #define EC_WORD_GIMME (EC_GROUP_ENDINGS << 9) | 0x7 #define EC_WORD_COULD (EC_GROUP_ENDINGS << 9) | 0x8 #define EC_WORD_LIKELY_TO (EC_GROUP_ENDINGS << 9) | 0x9 #define EC_WORD_WOULD (EC_GROUP_ENDINGS << 9) | 0xa #define EC_WORD_IS (EC_GROUP_ENDINGS << 9) | 0xb #define EC_WORD_ISN_T_IT_QUES (EC_GROUP_ENDINGS << 9) | 0xc #define EC_WORD_LET_S (EC_GROUP_ENDINGS << 9) | 0xd #define EC_WORD_OTHER (EC_GROUP_ENDINGS << 9) | 0xe #define EC_WORD_ARE (EC_GROUP_ENDINGS << 9) | 0xf #define EC_WORD_WAS (EC_GROUP_ENDINGS << 9) | 0x10 #define EC_WORD_WERE (EC_GROUP_ENDINGS << 9) | 0x11 #define EC_WORD_THOSE (EC_GROUP_ENDINGS << 9) | 0x12 #define EC_WORD_ISN_T (EC_GROUP_ENDINGS << 9) | 0x13 #define EC_WORD_WON_T (EC_GROUP_ENDINGS << 9) | 0x14 #define EC_WORD_CAN_T (EC_GROUP_ENDINGS << 9) | 0x15 #define EC_WORD_CAN (EC_GROUP_ENDINGS << 9) | 0x16 #define EC_WORD_DON_T (EC_GROUP_ENDINGS << 9) | 0x17 #define EC_WORD_DO (EC_GROUP_ENDINGS << 9) | 0x18 #define EC_WORD_DOES (EC_GROUP_ENDINGS << 9) | 0x19 #define EC_WORD_WHOM (EC_GROUP_ENDINGS << 9) | 0x1a #define EC_WORD_WHICH (EC_GROUP_ENDINGS << 9) | 0x1b #define EC_WORD_WASN_T (EC_GROUP_ENDINGS << 9) | 0x1c #define EC_WORD_WEREN_T (EC_GROUP_ENDINGS << 9) | 0x1d #define EC_WORD_HAVE (EC_GROUP_ENDINGS << 9) | 0x1e #define EC_WORD_HAVEN_T (EC_GROUP_ENDINGS << 9) | 0x1f #define EC_WORD_A (EC_GROUP_ENDINGS << 9) | 0x20 #define EC_WORD_AN (EC_GROUP_ENDINGS << 9) | 0x21 #define EC_WORD_NOT (EC_GROUP_ENDINGS << 9) | 0x22 #define EC_WORD_THERE (EC_GROUP_ENDINGS << 9) | 0x23 #define EC_WORD_OK_QUES (EC_GROUP_ENDINGS << 9) | 0x24 #define EC_WORD_SO (EC_GROUP_ENDINGS << 9) | 0x25 #define EC_WORD_MAYBE (EC_GROUP_ENDINGS << 9) | 0x26 #define EC_WORD_ABOUT (EC_GROUP_ENDINGS << 9) | 0x27 #define EC_WORD_OVER (EC_GROUP_ENDINGS << 9) | 0x28 #define EC_WORD_IT (EC_GROUP_ENDINGS << 9) | 0x29 #define EC_WORD_ALL (EC_GROUP_ENDINGS << 9) | 0x2a #define EC_WORD_FOR (EC_GROUP_ENDINGS << 9) | 0x2b #define EC_WORD_ON (EC_GROUP_ENDINGS << 9) | 0x2c #define EC_WORD_OFF (EC_GROUP_ENDINGS << 9) | 0x2d #define EC_WORD_AS (EC_GROUP_ENDINGS << 9) | 0x2e #define EC_WORD_TO (EC_GROUP_ENDINGS << 9) | 0x2f #define EC_WORD_WITH (EC_GROUP_ENDINGS << 9) | 0x30 #define EC_WORD_BETTER (EC_GROUP_ENDINGS << 9) | 0x31 #define EC_WORD_EVER (EC_GROUP_ENDINGS << 9) | 0x32 #define EC_WORD_SINCE (EC_GROUP_ENDINGS << 9) | 0x33 #define EC_WORD_OF (EC_GROUP_ENDINGS << 9) | 0x34 #define EC_WORD_BELONGS_TO (EC_GROUP_ENDINGS << 9) | 0x35 #define EC_WORD_AT (EC_GROUP_ENDINGS << 9) | 0x36 #define EC_WORD_IN (EC_GROUP_ENDINGS << 9) | 0x37 #define EC_WORD_OUT (EC_GROUP_ENDINGS << 9) | 0x38 #define EC_WORD_TOO (EC_GROUP_ENDINGS << 9) | 0x39 #define EC_WORD_LIKE (EC_GROUP_ENDINGS << 9) | 0x3a #define EC_WORD_DID (EC_GROUP_ENDINGS << 9) | 0x3b #define EC_WORD_DIDN_T (EC_GROUP_ENDINGS << 9) | 0x3c #define EC_WORD_DOESN_T (EC_GROUP_ENDINGS << 9) | 0x3d #define EC_WORD_WITHOUT (EC_GROUP_ENDINGS << 9) | 0x3e #define EC_WORD_AFTER (EC_GROUP_ENDINGS << 9) | 0x3f #define EC_WORD_BEFORE (EC_GROUP_ENDINGS << 9) | 0x40 #define EC_WORD_WHILE (EC_GROUP_ENDINGS << 9) | 0x41 #define EC_WORD_THAN (EC_GROUP_ENDINGS << 9) | 0x42 #define EC_WORD_ONCE (EC_GROUP_ENDINGS << 9) | 0x43 #define EC_WORD_ANYWHERE (EC_GROUP_ENDINGS << 9) | 0x44 // FEELINGS #define EC_WORD_MEET (EC_GROUP_FEELINGS << 9) | 0x0 #define EC_WORD_PLAY (EC_GROUP_FEELINGS << 9) | 0x1 #define EC_WORD_HURRIED (EC_GROUP_FEELINGS << 9) | 0x2 #define EC_WORD_GOES (EC_GROUP_FEELINGS << 9) | 0x3 #define EC_WORD_GIDDY (EC_GROUP_FEELINGS << 9) | 0x4 #define EC_WORD_HAPPY (EC_GROUP_FEELINGS << 9) | 0x5 #define EC_WORD_HAPPINESS (EC_GROUP_FEELINGS << 9) | 0x6 #define EC_WORD_EXCITE (EC_GROUP_FEELINGS << 9) | 0x7 #define EC_WORD_IMPORTANT (EC_GROUP_FEELINGS << 9) | 0x8 #define EC_WORD_FUNNY (EC_GROUP_FEELINGS << 9) | 0x9 #define EC_WORD_GOT (EC_GROUP_FEELINGS << 9) | 0xa #define EC_WORD_GO_HOME (EC_GROUP_FEELINGS << 9) | 0xb #define EC_WORD_DISAPPOINTED (EC_GROUP_FEELINGS << 9) | 0xc #define EC_WORD_DISAPPOINTS (EC_GROUP_FEELINGS << 9) | 0xd #define EC_WORD_SAD (EC_GROUP_FEELINGS << 9) | 0xe #define EC_WORD_TRY (EC_GROUP_FEELINGS << 9) | 0xf #define EC_WORD_TRIES (EC_GROUP_FEELINGS << 9) | 0x10 #define EC_WORD_HEARS (EC_GROUP_FEELINGS << 9) | 0x11 #define EC_WORD_THINK (EC_GROUP_FEELINGS << 9) | 0x12 #define EC_WORD_HEAR (EC_GROUP_FEELINGS << 9) | 0x13 #define EC_WORD_WANTS (EC_GROUP_FEELINGS << 9) | 0x14 #define EC_WORD_MISHEARD (EC_GROUP_FEELINGS << 9) | 0x15 #define EC_WORD_DISLIKE (EC_GROUP_FEELINGS << 9) | 0x16 #define EC_WORD_ANGRY (EC_GROUP_FEELINGS << 9) | 0x17 #define EC_WORD_ANGER (EC_GROUP_FEELINGS << 9) | 0x18 #define EC_WORD_SCARY (EC_GROUP_FEELINGS << 9) | 0x19 #define EC_WORD_LONESOME (EC_GROUP_FEELINGS << 9) | 0x1a #define EC_WORD_DISAPPOINT (EC_GROUP_FEELINGS << 9) | 0x1b #define EC_WORD_JOY (EC_GROUP_FEELINGS << 9) | 0x1c #define EC_WORD_GETS (EC_GROUP_FEELINGS << 9) | 0x1d #define EC_WORD_NEVER (EC_GROUP_FEELINGS << 9) | 0x1e #define EC_WORD_DARN (EC_GROUP_FEELINGS << 9) | 0x1f #define EC_WORD_DOWNCAST (EC_GROUP_FEELINGS << 9) | 0x20 #define EC_WORD_INCREDIBLE (EC_GROUP_FEELINGS << 9) | 0x21 #define EC_WORD_LIKES (EC_GROUP_FEELINGS << 9) | 0x22 #define EC_WORD_DISLIKES (EC_GROUP_FEELINGS << 9) | 0x23 #define EC_WORD_BORING (EC_GROUP_FEELINGS << 9) | 0x24 #define EC_WORD_CARE (EC_GROUP_FEELINGS << 9) | 0x25 #define EC_WORD_CARES (EC_GROUP_FEELINGS << 9) | 0x26 #define EC_WORD_ALL_RIGHT (EC_GROUP_FEELINGS << 9) | 0x27 #define EC_WORD_ADORE (EC_GROUP_FEELINGS << 9) | 0x28 #define EC_WORD_DISASTER (EC_GROUP_FEELINGS << 9) | 0x29 #define EC_WORD_ENJOY (EC_GROUP_FEELINGS << 9) | 0x2a #define EC_WORD_ENJOYS (EC_GROUP_FEELINGS << 9) | 0x2b #define EC_WORD_EAT (EC_GROUP_FEELINGS << 9) | 0x2c #define EC_WORD_LACKING (EC_GROUP_FEELINGS << 9) | 0x2d #define EC_WORD_BAD (EC_GROUP_FEELINGS << 9) | 0x2e #define EC_WORD_HARD (EC_GROUP_FEELINGS << 9) | 0x2f #define EC_WORD_TERRIBLE (EC_GROUP_FEELINGS << 9) | 0x30 #define EC_WORD_SHOULD (EC_GROUP_FEELINGS << 9) | 0x31 #define EC_WORD_NICE (EC_GROUP_FEELINGS << 9) | 0x32 #define EC_WORD_DRINK (EC_GROUP_FEELINGS << 9) | 0x33 #define EC_WORD_SURPRISE (EC_GROUP_FEELINGS << 9) | 0x34 #define EC_WORD_FEAR (EC_GROUP_FEELINGS << 9) | 0x35 #define EC_WORD_WANT (EC_GROUP_FEELINGS << 9) | 0x36 #define EC_WORD_WAIT (EC_GROUP_FEELINGS << 9) | 0x37 #define EC_WORD_SATISFIED (EC_GROUP_FEELINGS << 9) | 0x38 #define EC_WORD_SEE (EC_GROUP_FEELINGS << 9) | 0x39 #define EC_WORD_RARE (EC_GROUP_FEELINGS << 9) | 0x3a #define EC_WORD_NEGATIVE (EC_GROUP_FEELINGS << 9) | 0x3b #define EC_WORD_DONE (EC_GROUP_FEELINGS << 9) | 0x3c #define EC_WORD_DANGER (EC_GROUP_FEELINGS << 9) | 0x3d #define EC_WORD_DEFEATED (EC_GROUP_FEELINGS << 9) | 0x3e #define EC_WORD_BEAT (EC_GROUP_FEELINGS << 9) | 0x3f #define EC_WORD_GREAT (EC_GROUP_FEELINGS << 9) | 0x40 #define EC_WORD_ROMANTIC (EC_GROUP_FEELINGS << 9) | 0x41 #define EC_WORD_QUESTION (EC_GROUP_FEELINGS << 9) | 0x42 #define EC_WORD_UNDERSTAND (EC_GROUP_FEELINGS << 9) | 0x43 #define EC_WORD_UNDERSTANDS (EC_GROUP_FEELINGS << 9) | 0x44 // CONDITIONS #define EC_WORD_HOT (EC_GROUP_CONDITIONS << 9) | 0x0 #define EC_WORD_EXISTS (EC_GROUP_CONDITIONS << 9) | 0x1 #define EC_WORD_EXCESS (EC_GROUP_CONDITIONS << 9) | 0x2 #define EC_WORD_APPROVED (EC_GROUP_CONDITIONS << 9) | 0x3 #define EC_WORD_HAS (EC_GROUP_CONDITIONS << 9) | 0x4 #define EC_WORD_GOOD (EC_GROUP_CONDITIONS << 9) | 0x5 #define EC_WORD_LESS (EC_GROUP_CONDITIONS << 9) | 0x6 #define EC_WORD_MOMENTUM (EC_GROUP_CONDITIONS << 9) | 0x7 #define EC_WORD_GOING (EC_GROUP_CONDITIONS << 9) | 0x8 #define EC_WORD_WEIRD (EC_GROUP_CONDITIONS << 9) | 0x9 #define EC_WORD_BUSY (EC_GROUP_CONDITIONS << 9) | 0xa #define EC_WORD_TOGETHER (EC_GROUP_CONDITIONS << 9) | 0xb #define EC_WORD_FULL (EC_GROUP_CONDITIONS << 9) | 0xc #define EC_WORD_ABSENT (EC_GROUP_CONDITIONS << 9) | 0xd #define EC_WORD_BEING (EC_GROUP_CONDITIONS << 9) | 0xe #define EC_WORD_NEED (EC_GROUP_CONDITIONS << 9) | 0xf #define EC_WORD_TASTY (EC_GROUP_CONDITIONS << 9) | 0x10 #define EC_WORD_SKILLED (EC_GROUP_CONDITIONS << 9) | 0x11 #define EC_WORD_NOISY (EC_GROUP_CONDITIONS << 9) | 0x12 #define EC_WORD_BIG (EC_GROUP_CONDITIONS << 9) | 0x13 #define EC_WORD_LATE (EC_GROUP_CONDITIONS << 9) | 0x14 #define EC_WORD_CLOSE (EC_GROUP_CONDITIONS << 9) | 0x15 #define EC_WORD_DOCILE (EC_GROUP_CONDITIONS << 9) | 0x16 #define EC_WORD_AMUSING (EC_GROUP_CONDITIONS << 9) | 0x17 #define EC_WORD_ENTERTAINING (EC_GROUP_CONDITIONS << 9) | 0x18 #define EC_WORD_PERFECTION (EC_GROUP_CONDITIONS << 9) | 0x19 #define EC_WORD_PRETTY (EC_GROUP_CONDITIONS << 9) | 0x1a #define EC_WORD_HEALTHY (EC_GROUP_CONDITIONS << 9) | 0x1b #define EC_WORD_EXCELLENT (EC_GROUP_CONDITIONS << 9) | 0x1c #define EC_WORD_UPSIDE_DOWN (EC_GROUP_CONDITIONS << 9) | 0x1d #define EC_WORD_COLD (EC_GROUP_CONDITIONS << 9) | 0x1e #define EC_WORD_REFRESHING (EC_GROUP_CONDITIONS << 9) | 0x1f #define EC_WORD_UNAVOIDABLE (EC_GROUP_CONDITIONS << 9) | 0x20 #define EC_WORD_MUCH (EC_GROUP_CONDITIONS << 9) | 0x21 #define EC_WORD_OVERWHELMING (EC_GROUP_CONDITIONS << 9) | 0x22 #define EC_WORD_FABULOUS (EC_GROUP_CONDITIONS << 9) | 0x23 #define EC_WORD_ELSE (EC_GROUP_CONDITIONS << 9) | 0x24 #define EC_WORD_EXPENSIVE (EC_GROUP_CONDITIONS << 9) | 0x25 #define EC_WORD_CORRECT (EC_GROUP_CONDITIONS << 9) | 0x26 #define EC_WORD_IMPOSSIBLE (EC_GROUP_CONDITIONS << 9) | 0x27 #define EC_WORD_SMALL (EC_GROUP_CONDITIONS << 9) | 0x28 #define EC_WORD_DIFFERENT (EC_GROUP_CONDITIONS << 9) | 0x29 #define EC_WORD_TIRED (EC_GROUP_CONDITIONS << 9) | 0x2a #define EC_WORD_SKILL (EC_GROUP_CONDITIONS << 9) | 0x2b #define EC_WORD_TOP (EC_GROUP_CONDITIONS << 9) | 0x2c #define EC_WORD_NON_STOP (EC_GROUP_CONDITIONS << 9) | 0x2d #define EC_WORD_PREPOSTEROUS (EC_GROUP_CONDITIONS << 9) | 0x2e #define EC_WORD_NONE (EC_GROUP_CONDITIONS << 9) | 0x2f #define EC_WORD_NOTHING (EC_GROUP_CONDITIONS << 9) | 0x30 #define EC_WORD_NATURAL (EC_GROUP_CONDITIONS << 9) | 0x31 #define EC_WORD_BECOMES (EC_GROUP_CONDITIONS << 9) | 0x32 #define EC_WORD_LUKEWARM (EC_GROUP_CONDITIONS << 9) | 0x33 #define EC_WORD_FAST (EC_GROUP_CONDITIONS << 9) | 0x34 #define EC_WORD_LOW (EC_GROUP_CONDITIONS << 9) | 0x35 #define EC_WORD_AWFUL (EC_GROUP_CONDITIONS << 9) | 0x36 #define EC_WORD_ALONE (EC_GROUP_CONDITIONS << 9) | 0x37 #define EC_WORD_BORED (EC_GROUP_CONDITIONS << 9) | 0x38 #define EC_WORD_SECRET (EC_GROUP_CONDITIONS << 9) | 0x39 #define EC_WORD_MYSTERY (EC_GROUP_CONDITIONS << 9) | 0x3a #define EC_WORD_LACKS (EC_GROUP_CONDITIONS << 9) | 0x3b #define EC_WORD_BEST (EC_GROUP_CONDITIONS << 9) | 0x3c #define EC_WORD_LOUSY (EC_GROUP_CONDITIONS << 9) | 0x3d #define EC_WORD_MISTAKE (EC_GROUP_CONDITIONS << 9) | 0x3e #define EC_WORD_KIND (EC_GROUP_CONDITIONS << 9) | 0x3f #define EC_WORD_WELL (EC_GROUP_CONDITIONS << 9) | 0x40 #define EC_WORD_WEAKENED (EC_GROUP_CONDITIONS << 9) | 0x41 #define EC_WORD_SIMPLE (EC_GROUP_CONDITIONS << 9) | 0x42 #define EC_WORD_SEEMS (EC_GROUP_CONDITIONS << 9) | 0x43 #define EC_WORD_BADLY (EC_GROUP_CONDITIONS << 9) | 0x44 // ACTIONS #define EC_WORD_MEETS (EC_GROUP_ACTIONS << 9) | 0x0 #define EC_WORD_CONCEDE (EC_GROUP_ACTIONS << 9) | 0x1 #define EC_WORD_GIVE (EC_GROUP_ACTIONS << 9) | 0x2 #define EC_WORD_GIVES (EC_GROUP_ACTIONS << 9) | 0x3 #define EC_WORD_PLAYED (EC_GROUP_ACTIONS << 9) | 0x4 #define EC_WORD_PLAYS (EC_GROUP_ACTIONS << 9) | 0x5 #define EC_WORD_COLLECT (EC_GROUP_ACTIONS << 9) | 0x6 #define EC_WORD_WALKING (EC_GROUP_ACTIONS << 9) | 0x7 #define EC_WORD_WALKS (EC_GROUP_ACTIONS << 9) | 0x8 #define EC_WORD_SAYS (EC_GROUP_ACTIONS << 9) | 0x9 #define EC_WORD_WENT (EC_GROUP_ACTIONS << 9) | 0xa #define EC_WORD_SAID (EC_GROUP_ACTIONS << 9) | 0xb #define EC_WORD_WAKE_UP (EC_GROUP_ACTIONS << 9) | 0xc #define EC_WORD_WAKES_UP (EC_GROUP_ACTIONS << 9) | 0xd #define EC_WORD_ANGERS (EC_GROUP_ACTIONS << 9) | 0xe #define EC_WORD_TEACH (EC_GROUP_ACTIONS << 9) | 0xf #define EC_WORD_TEACHES (EC_GROUP_ACTIONS << 9) | 0x10 #define EC_WORD_PLEASE (EC_GROUP_ACTIONS << 9) | 0x11 #define EC_WORD_LEARN (EC_GROUP_ACTIONS << 9) | 0x12 #define EC_WORD_CHANGE (EC_GROUP_ACTIONS << 9) | 0x13 #define EC_WORD_STORY (EC_GROUP_ACTIONS << 9) | 0x14 #define EC_WORD_TRUST (EC_GROUP_ACTIONS << 9) | 0x15 #define EC_WORD_LAVISH (EC_GROUP_ACTIONS << 9) | 0x16 #define EC_WORD_LISTENS (EC_GROUP_ACTIONS << 9) | 0x17 #define EC_WORD_HEARING (EC_GROUP_ACTIONS << 9) | 0x18 #define EC_WORD_TRAINS (EC_GROUP_ACTIONS << 9) | 0x19 #define EC_WORD_CHOOSE (EC_GROUP_ACTIONS << 9) | 0x1a #define EC_WORD_COME (EC_GROUP_ACTIONS << 9) | 0x1b #define EC_WORD_CAME (EC_GROUP_ACTIONS << 9) | 0x1c #define EC_WORD_SEARCH (EC_GROUP_ACTIONS << 9) | 0x1d #define EC_WORD_MAKE (EC_GROUP_ACTIONS << 9) | 0x1e #define EC_WORD_CAUSE (EC_GROUP_ACTIONS << 9) | 0x1f #define EC_WORD_KNOW (EC_GROUP_ACTIONS << 9) | 0x20 #define EC_WORD_KNOWS (EC_GROUP_ACTIONS << 9) | 0x21 #define EC_WORD_REFUSE (EC_GROUP_ACTIONS << 9) | 0x22 #define EC_WORD_STORES (EC_GROUP_ACTIONS << 9) | 0x23 #define EC_WORD_BRAG (EC_GROUP_ACTIONS << 9) | 0x24 #define EC_WORD_IGNORANT (EC_GROUP_ACTIONS << 9) | 0x25 #define EC_WORD_THINKS (EC_GROUP_ACTIONS << 9) | 0x26 #define EC_WORD_BELIEVE (EC_GROUP_ACTIONS << 9) | 0x27 #define EC_WORD_SLIDE (EC_GROUP_ACTIONS << 9) | 0x28 #define EC_WORD_EATS (EC_GROUP_ACTIONS << 9) | 0x29 #define EC_WORD_USE (EC_GROUP_ACTIONS << 9) | 0x2a #define EC_WORD_USES (EC_GROUP_ACTIONS << 9) | 0x2b #define EC_WORD_USING (EC_GROUP_ACTIONS << 9) | 0x2c #define EC_WORD_COULDN_T (EC_GROUP_ACTIONS << 9) | 0x2d #define EC_WORD_CAPABLE (EC_GROUP_ACTIONS << 9) | 0x2e #define EC_WORD_DISAPPEAR (EC_GROUP_ACTIONS << 9) | 0x2f #define EC_WORD_APPEAR (EC_GROUP_ACTIONS << 9) | 0x30 #define EC_WORD_THROW (EC_GROUP_ACTIONS << 9) | 0x31 #define EC_WORD_WORRY (EC_GROUP_ACTIONS << 9) | 0x32 #define EC_WORD_SLEPT (EC_GROUP_ACTIONS << 9) | 0x33 #define EC_WORD_SLEEP (EC_GROUP_ACTIONS << 9) | 0x34 #define EC_WORD_RELEASE (EC_GROUP_ACTIONS << 9) | 0x35 #define EC_WORD_DRINKS (EC_GROUP_ACTIONS << 9) | 0x36 #define EC_WORD_RUNS (EC_GROUP_ACTIONS << 9) | 0x37 #define EC_WORD_RUN (EC_GROUP_ACTIONS << 9) | 0x38 #define EC_WORD_WORKS (EC_GROUP_ACTIONS << 9) | 0x39 #define EC_WORD_WORKING (EC_GROUP_ACTIONS << 9) | 0x3a #define EC_WORD_TALKING (EC_GROUP_ACTIONS << 9) | 0x3b #define EC_WORD_TALK (EC_GROUP_ACTIONS << 9) | 0x3c #define EC_WORD_SINK (EC_GROUP_ACTIONS << 9) | 0x3d #define EC_WORD_SMACK (EC_GROUP_ACTIONS << 9) | 0x3e #define EC_WORD_PRETEND (EC_GROUP_ACTIONS << 9) | 0x3f #define EC_WORD_PRAISE (EC_GROUP_ACTIONS << 9) | 0x40 #define EC_WORD_OVERDO (EC_GROUP_ACTIONS << 9) | 0x41 #define EC_WORD_SHOW (EC_GROUP_ACTIONS << 9) | 0x42 #define EC_WORD_LOOKS (EC_GROUP_ACTIONS << 9) | 0x43 #define EC_WORD_SEES (EC_GROUP_ACTIONS << 9) | 0x44 #define EC_WORD_SEEK (EC_GROUP_ACTIONS << 9) | 0x45 #define EC_WORD_OWN (EC_GROUP_ACTIONS << 9) | 0x46 #define EC_WORD_TAKE (EC_GROUP_ACTIONS << 9) | 0x47 #define EC_WORD_ALLOW (EC_GROUP_ACTIONS << 9) | 0x48 #define EC_WORD_FORGET (EC_GROUP_ACTIONS << 9) | 0x49 #define EC_WORD_FORGETS (EC_GROUP_ACTIONS << 9) | 0x4a #define EC_WORD_APPEARS (EC_GROUP_ACTIONS << 9) | 0x4b #define EC_WORD_FAINT (EC_GROUP_ACTIONS << 9) | 0x4c #define EC_WORD_FAINTED (EC_GROUP_ACTIONS << 9) | 0x4d // LIFESTYLE #define EC_WORD_CHORES (EC_GROUP_LIFESTYLE << 9) | 0x0 #define EC_WORD_HOME (EC_GROUP_LIFESTYLE << 9) | 0x1 #define EC_WORD_MONEY (EC_GROUP_LIFESTYLE << 9) | 0x2 #define EC_WORD_ALLOWANCE (EC_GROUP_LIFESTYLE << 9) | 0x3 #define EC_WORD_BATH (EC_GROUP_LIFESTYLE << 9) | 0x4 #define EC_WORD_CONVERSATION (EC_GROUP_LIFESTYLE << 9) | 0x5 #define EC_WORD_SCHOOL (EC_GROUP_LIFESTYLE << 9) | 0x6 #define EC_WORD_COMMEMORATE (EC_GROUP_LIFESTYLE << 9) | 0x7 #define EC_WORD_HABIT (EC_GROUP_LIFESTYLE << 9) | 0x8 #define EC_WORD_GROUP (EC_GROUP_LIFESTYLE << 9) | 0x9 #define EC_WORD_WORD (EC_GROUP_LIFESTYLE << 9) | 0xa #define EC_WORD_STORE (EC_GROUP_LIFESTYLE << 9) | 0xb #define EC_WORD_SERVICE (EC_GROUP_LIFESTYLE << 9) | 0xc #define EC_WORD_WORK (EC_GROUP_LIFESTYLE << 9) | 0xd #define EC_WORD_SYSTEM (EC_GROUP_LIFESTYLE << 9) | 0xe #define EC_WORD_TRAIN (EC_GROUP_LIFESTYLE << 9) | 0xf #define EC_WORD_CLASS (EC_GROUP_LIFESTYLE << 9) | 0x10 #define EC_WORD_LESSONS (EC_GROUP_LIFESTYLE << 9) | 0x11 #define EC_WORD_INFORMATION (EC_GROUP_LIFESTYLE << 9) | 0x12 #define EC_WORD_LIVING (EC_GROUP_LIFESTYLE << 9) | 0x13 #define EC_WORD_TEACHER (EC_GROUP_LIFESTYLE << 9) | 0x14 #define EC_WORD_TOURNAMENT (EC_GROUP_LIFESTYLE << 9) | 0x15 #define EC_WORD_LETTER (EC_GROUP_LIFESTYLE << 9) | 0x16 #define EC_WORD_EVENT (EC_GROUP_LIFESTYLE << 9) | 0x17 #define EC_WORD_DIGITAL (EC_GROUP_LIFESTYLE << 9) | 0x18 #define EC_WORD_TEST (EC_GROUP_LIFESTYLE << 9) | 0x19 #define EC_WORD_DEPT_STORE (EC_GROUP_LIFESTYLE << 9) | 0x1a #define EC_WORD_TELEVISION (EC_GROUP_LIFESTYLE << 9) | 0x1b #define EC_WORD_PHONE (EC_GROUP_LIFESTYLE << 9) | 0x1c #define EC_WORD_ITEM (EC_GROUP_LIFESTYLE << 9) | 0x1d #define EC_WORD_NAME (EC_GROUP_LIFESTYLE << 9) | 0x1e #define EC_WORD_NEWS (EC_GROUP_LIFESTYLE << 9) | 0x1f #define EC_WORD_POPULAR (EC_GROUP_LIFESTYLE << 9) | 0x20 #define EC_WORD_PARTY (EC_GROUP_LIFESTYLE << 9) | 0x21 #define EC_WORD_STUDY (EC_GROUP_LIFESTYLE << 9) | 0x22 #define EC_WORD_MACHINE (EC_GROUP_LIFESTYLE << 9) | 0x23 #define EC_WORD_MAIL (EC_GROUP_LIFESTYLE << 9) | 0x24 #define EC_WORD_MESSAGE (EC_GROUP_LIFESTYLE << 9) | 0x25 #define EC_WORD_PROMISE (EC_GROUP_LIFESTYLE << 9) | 0x26 #define EC_WORD_DREAM (EC_GROUP_LIFESTYLE << 9) | 0x27 #define EC_WORD_KINDERGARTEN (EC_GROUP_LIFESTYLE << 9) | 0x28 #define EC_WORD_LIFE (EC_GROUP_LIFESTYLE << 9) | 0x29 #define EC_WORD_RADIO (EC_GROUP_LIFESTYLE << 9) | 0x2a #define EC_WORD_RENTAL (EC_GROUP_LIFESTYLE << 9) | 0x2b #define EC_WORD_WORLD (EC_GROUP_LIFESTYLE << 9) | 0x2c // HOBBIES #define EC_WORD_IDOL (EC_GROUP_HOBBIES << 9) | 0x0 #define EC_WORD_ANIME (EC_GROUP_HOBBIES << 9) | 0x1 #define EC_WORD_SONG (EC_GROUP_HOBBIES << 9) | 0x2 #define EC_WORD_MOVIE (EC_GROUP_HOBBIES << 9) | 0x3 #define EC_WORD_SWEETS (EC_GROUP_HOBBIES << 9) | 0x4 #define EC_WORD_CHAT (EC_GROUP_HOBBIES << 9) | 0x5 #define EC_WORD_CHILD_S_PLAY (EC_GROUP_HOBBIES << 9) | 0x6 #define EC_WORD_TOYS (EC_GROUP_HOBBIES << 9) | 0x7 #define EC_WORD_MUSIC (EC_GROUP_HOBBIES << 9) | 0x8 #define EC_WORD_CARDS (EC_GROUP_HOBBIES << 9) | 0x9 #define EC_WORD_SHOPPING (EC_GROUP_HOBBIES << 9) | 0xa #define EC_WORD_CAMERA (EC_GROUP_HOBBIES << 9) | 0xb #define EC_WORD_VIEWING (EC_GROUP_HOBBIES << 9) | 0xc #define EC_WORD_SPECTATOR (EC_GROUP_HOBBIES << 9) | 0xd #define EC_WORD_GOURMET (EC_GROUP_HOBBIES << 9) | 0xe #define EC_WORD_GAME (EC_GROUP_HOBBIES << 9) | 0xf #define EC_WORD_RPG (EC_GROUP_HOBBIES << 9) | 0x10 #define EC_WORD_COLLECTION (EC_GROUP_HOBBIES << 9) | 0x11 #define EC_WORD_COMPLETE (EC_GROUP_HOBBIES << 9) | 0x12 #define EC_WORD_MAGAZINE (EC_GROUP_HOBBIES << 9) | 0x13 #define EC_WORD_WALK (EC_GROUP_HOBBIES << 9) | 0x14 #define EC_WORD_BIKE (EC_GROUP_HOBBIES << 9) | 0x15 #define EC_WORD_HOBBY (EC_GROUP_HOBBIES << 9) | 0x16 #define EC_WORD_SPORTS (EC_GROUP_HOBBIES << 9) | 0x17 #define EC_WORD_SOFTWARE (EC_GROUP_HOBBIES << 9) | 0x18 #define EC_WORD_SONGS (EC_GROUP_HOBBIES << 9) | 0x19 #define EC_WORD_DIET (EC_GROUP_HOBBIES << 9) | 0x1a #define EC_WORD_TREASURE (EC_GROUP_HOBBIES << 9) | 0x1b #define EC_WORD_TRAVEL (EC_GROUP_HOBBIES << 9) | 0x1c #define EC_WORD_DANCE (EC_GROUP_HOBBIES << 9) | 0x1d #define EC_WORD_CHANNEL (EC_GROUP_HOBBIES << 9) | 0x1e #define EC_WORD_MAKING (EC_GROUP_HOBBIES << 9) | 0x1f #define EC_WORD_FISHING (EC_GROUP_HOBBIES << 9) | 0x20 #define EC_WORD_DATE (EC_GROUP_HOBBIES << 9) | 0x21 #define EC_WORD_DESIGN (EC_GROUP_HOBBIES << 9) | 0x22 #define EC_WORD_LOCOMOTIVE (EC_GROUP_HOBBIES << 9) | 0x23 #define EC_WORD_PLUSH_DOLL (EC_GROUP_HOBBIES << 9) | 0x24 #define EC_WORD_PC (EC_GROUP_HOBBIES << 9) | 0x25 #define EC_WORD_FLOWERS (EC_GROUP_HOBBIES << 9) | 0x26 #define EC_WORD_HERO (EC_GROUP_HOBBIES << 9) | 0x27 #define EC_WORD_NAP (EC_GROUP_HOBBIES << 9) | 0x28 #define EC_WORD_HEROINE (EC_GROUP_HOBBIES << 9) | 0x29 #define EC_WORD_FASHION (EC_GROUP_HOBBIES << 9) | 0x2a #define EC_WORD_ADVENTURE (EC_GROUP_HOBBIES << 9) | 0x2b #define EC_WORD_BOARD (EC_GROUP_HOBBIES << 9) | 0x2c #define EC_WORD_BALL (EC_GROUP_HOBBIES << 9) | 0x2d #define EC_WORD_BOOK (EC_GROUP_HOBBIES << 9) | 0x2e #define EC_WORD_FESTIVAL (EC_GROUP_HOBBIES << 9) | 0x2f #define EC_WORD_COMICS (EC_GROUP_HOBBIES << 9) | 0x30 #define EC_WORD_HOLIDAY (EC_GROUP_HOBBIES << 9) | 0x31 #define EC_WORD_PLANS (EC_GROUP_HOBBIES << 9) | 0x32 #define EC_WORD_TRENDY (EC_GROUP_HOBBIES << 9) | 0x33 #define EC_WORD_VACATION (EC_GROUP_HOBBIES << 9) | 0x34 #define EC_WORD_LOOK (EC_GROUP_HOBBIES << 9) | 0x35 // TIME #define EC_WORD_FALL (EC_GROUP_TIME << 9) | 0x0 #define EC_WORD_MORNING (EC_GROUP_TIME << 9) | 0x1 #define EC_WORD_TOMORROW (EC_GROUP_TIME << 9) | 0x2 #define EC_WORD_LAST (EC_GROUP_TIME << 9) | 0x3 #define EC_WORD_DAY (EC_GROUP_TIME << 9) | 0x4 #define EC_WORD_SOMETIME (EC_GROUP_TIME << 9) | 0x5 #define EC_WORD_ALWAYS (EC_GROUP_TIME << 9) | 0x6 #define EC_WORD_CURRENT (EC_GROUP_TIME << 9) | 0x7 #define EC_WORD_FOREVER (EC_GROUP_TIME << 9) | 0x8 #define EC_WORD_DAYS (EC_GROUP_TIME << 9) | 0x9 #define EC_WORD_END (EC_GROUP_TIME << 9) | 0xa #define EC_WORD_TUESDAY (EC_GROUP_TIME << 9) | 0xb #define EC_WORD_YESTERDAY (EC_GROUP_TIME << 9) | 0xc #define EC_WORD_TODAY (EC_GROUP_TIME << 9) | 0xd #define EC_WORD_FRIDAY (EC_GROUP_TIME << 9) | 0xe #define EC_WORD_MONDAY (EC_GROUP_TIME << 9) | 0xf #define EC_WORD_LATER (EC_GROUP_TIME << 9) | 0x10 #define EC_WORD_EARLIER (EC_GROUP_TIME << 9) | 0x11 #define EC_WORD_ANOTHER (EC_GROUP_TIME << 9) | 0x12 #define EC_WORD_TIME (EC_GROUP_TIME << 9) | 0x13 #define EC_WORD_FINISH (EC_GROUP_TIME << 9) | 0x14 #define EC_WORD_WEDNESDAY (EC_GROUP_TIME << 9) | 0x15 #define EC_WORD_SOON (EC_GROUP_TIME << 9) | 0x16 #define EC_WORD_START (EC_GROUP_TIME << 9) | 0x17 #define EC_WORD_MONTH (EC_GROUP_TIME << 9) | 0x18 #define EC_WORD_STOP (EC_GROUP_TIME << 9) | 0x19 #define EC_WORD_NOW (EC_GROUP_TIME << 9) | 0x1a #define EC_WORD_FINAL (EC_GROUP_TIME << 9) | 0x1b #define EC_WORD_NEXT (EC_GROUP_TIME << 9) | 0x1c #define EC_WORD_AGE (EC_GROUP_TIME << 9) | 0x1d #define EC_WORD_SATURDAY (EC_GROUP_TIME << 9) | 0x1e #define EC_WORD_SUMMER (EC_GROUP_TIME << 9) | 0x1f #define EC_WORD_SUNDAY (EC_GROUP_TIME << 9) | 0x20 #define EC_WORD_BEGINNING (EC_GROUP_TIME << 9) | 0x21 #define EC_WORD_SPRING (EC_GROUP_TIME << 9) | 0x22 #define EC_WORD_DAYTIME (EC_GROUP_TIME << 9) | 0x23 #define EC_WORD_WINTER (EC_GROUP_TIME << 9) | 0x24 #define EC_WORD_DAILY (EC_GROUP_TIME << 9) | 0x25 #define EC_WORD_OLDEN (EC_GROUP_TIME << 9) | 0x26 #define EC_WORD_ALMOST (EC_GROUP_TIME << 9) | 0x27 #define EC_WORD_NEARLY (EC_GROUP_TIME << 9) | 0x28 #define EC_WORD_THURSDAY (EC_GROUP_TIME << 9) | 0x29 #define EC_WORD_NIGHTTIME (EC_GROUP_TIME << 9) | 0x2a #define EC_WORD_NIGHT (EC_GROUP_TIME << 9) | 0x2b #define EC_WORD_WEEK (EC_GROUP_TIME << 9) | 0x2c // MISC #define EC_WORD_HIGHS (EC_GROUP_MISC << 9) | 0x0 #define EC_WORD_LOWS (EC_GROUP_MISC << 9) | 0x1 #define EC_WORD_UM (EC_GROUP_MISC << 9) | 0x2 #define EC_WORD_REAR (EC_GROUP_MISC << 9) | 0x3 #define EC_WORD_THINGS (EC_GROUP_MISC << 9) | 0x4 #define EC_WORD_THING (EC_GROUP_MISC << 9) | 0x5 #define EC_WORD_BELOW (EC_GROUP_MISC << 9) | 0x6 #define EC_WORD_ABOVE (EC_GROUP_MISC << 9) | 0x7 #define EC_WORD_BACK (EC_GROUP_MISC << 9) | 0x8 #define EC_WORD_HIGH (EC_GROUP_MISC << 9) | 0x9 #define EC_WORD_HERE (EC_GROUP_MISC << 9) | 0xa #define EC_WORD_INSIDE (EC_GROUP_MISC << 9) | 0xb #define EC_WORD_OUTSIDE (EC_GROUP_MISC << 9) | 0xc #define EC_WORD_BESIDE (EC_GROUP_MISC << 9) | 0xd #define EC_WORD_THIS_IS_IT_EXCL (EC_GROUP_MISC << 9) | 0xe #define EC_WORD_THIS (EC_GROUP_MISC << 9) | 0xf #define EC_WORD_EVERY (EC_GROUP_MISC << 9) | 0x10 #define EC_WORD_THESE (EC_GROUP_MISC << 9) | 0x11 #define EC_WORD_THESE_WERE (EC_GROUP_MISC << 9) | 0x12 #define EC_WORD_DOWN (EC_GROUP_MISC << 9) | 0x13 #define EC_WORD_THAT (EC_GROUP_MISC << 9) | 0x14 #define EC_WORD_THOSE_ARE (EC_GROUP_MISC << 9) | 0x15 #define EC_WORD_THOSE_WERE (EC_GROUP_MISC << 9) | 0x16 #define EC_WORD_THAT_S_IT_EXCL (EC_GROUP_MISC << 9) | 0x17 #define EC_WORD_AM (EC_GROUP_MISC << 9) | 0x18 #define EC_WORD_THAT_WAS (EC_GROUP_MISC << 9) | 0x19 #define EC_WORD_FRONT (EC_GROUP_MISC << 9) | 0x1a #define EC_WORD_UP (EC_GROUP_MISC << 9) | 0x1b #define EC_WORD_CHOICE (EC_GROUP_MISC << 9) | 0x1c #define EC_WORD_FAR (EC_GROUP_MISC << 9) | 0x1d #define EC_WORD_AWAY (EC_GROUP_MISC << 9) | 0x1e #define EC_WORD_NEAR (EC_GROUP_MISC << 9) | 0x1f #define EC_WORD_WHERE (EC_GROUP_MISC << 9) | 0x20 #define EC_WORD_WHEN (EC_GROUP_MISC << 9) | 0x21 #define EC_WORD_WHAT (EC_GROUP_MISC << 9) | 0x22 #define EC_WORD_DEEP (EC_GROUP_MISC << 9) | 0x23 #define EC_WORD_SHALLOW (EC_GROUP_MISC << 9) | 0x24 #define EC_WORD_WHY (EC_GROUP_MISC << 9) | 0x25 #define EC_WORD_CONFUSED (EC_GROUP_MISC << 9) | 0x26 #define EC_WORD_OPPOSITE (EC_GROUP_MISC << 9) | 0x27 #define EC_WORD_LEFT (EC_GROUP_MISC << 9) | 0x28 #define EC_WORD_RIGHT (EC_GROUP_MISC << 9) | 0x29 // ADJECTIVES #define EC_WORD_WANDERING (EC_GROUP_ADJECTIVES << 9) | 0x0 #define EC_WORD_RICKETY (EC_GROUP_ADJECTIVES << 9) | 0x1 #define EC_WORD_ROCK_SOLID (EC_GROUP_ADJECTIVES << 9) | 0x2 #define EC_WORD_HUNGRY (EC_GROUP_ADJECTIVES << 9) | 0x3 #define EC_WORD_TIGHT (EC_GROUP_ADJECTIVES << 9) | 0x4 #define EC_WORD_TICKLISH (EC_GROUP_ADJECTIVES << 9) | 0x5 #define EC_WORD_TWIRLING (EC_GROUP_ADJECTIVES << 9) | 0x6 #define EC_WORD_SPIRALING (EC_GROUP_ADJECTIVES << 9) | 0x7 #define EC_WORD_THIRSTY (EC_GROUP_ADJECTIVES << 9) | 0x8 #define EC_WORD_LOLLING (EC_GROUP_ADJECTIVES << 9) | 0x9 #define EC_WORD_SILKY (EC_GROUP_ADJECTIVES << 9) | 0xa #define EC_WORD_SADLY (EC_GROUP_ADJECTIVES << 9) | 0xb #define EC_WORD_HOPELESS (EC_GROUP_ADJECTIVES << 9) | 0xc #define EC_WORD_USELESS (EC_GROUP_ADJECTIVES << 9) | 0xd #define EC_WORD_DROOLING (EC_GROUP_ADJECTIVES << 9) | 0xe #define EC_WORD_EXCITING (EC_GROUP_ADJECTIVES << 9) | 0xf #define EC_WORD_THICK (EC_GROUP_ADJECTIVES << 9) | 0x10 #define EC_WORD_SMOOTH (EC_GROUP_ADJECTIVES << 9) | 0x11 #define EC_WORD_SLIMY (EC_GROUP_ADJECTIVES << 9) | 0x12 #define EC_WORD_THIN (EC_GROUP_ADJECTIVES << 9) | 0x13 #define EC_WORD_BREAK (EC_GROUP_ADJECTIVES << 9) | 0x14 #define EC_WORD_VORACIOUS (EC_GROUP_ADJECTIVES << 9) | 0x15 #define EC_WORD_SCATTER (EC_GROUP_ADJECTIVES << 9) | 0x16 #define EC_WORD_AWESOME (EC_GROUP_ADJECTIVES << 9) | 0x17 #define EC_WORD_WIMPY (EC_GROUP_ADJECTIVES << 9) | 0x18 #define EC_WORD_WOBBLY (EC_GROUP_ADJECTIVES << 9) | 0x19 #define EC_WORD_SHAKY (EC_GROUP_ADJECTIVES << 9) | 0x1a #define EC_WORD_RIPPED (EC_GROUP_ADJECTIVES << 9) | 0x1b #define EC_WORD_SHREDDED (EC_GROUP_ADJECTIVES << 9) | 0x1c #define EC_WORD_INCREASING (EC_GROUP_ADJECTIVES << 9) | 0x1d #define EC_WORD_YET (EC_GROUP_ADJECTIVES << 9) | 0x1e #define EC_WORD_DESTROYED (EC_GROUP_ADJECTIVES << 9) | 0x1f #define EC_WORD_FIERY (EC_GROUP_ADJECTIVES << 9) | 0x20 #define EC_WORD_LOVEY_DOVEY (EC_GROUP_ADJECTIVES << 9) | 0x21 #define EC_WORD_HAPPILY (EC_GROUP_ADJECTIVES << 9) | 0x22 #define EC_WORD_ANTICIPATION (EC_GROUP_ADJECTIVES << 9) | 0x23 // EVENTS #define EC_WORD_APPEAL (EC_GROUP_EVENTS << 9) | 0x0 #define EC_WORD_EVENTS (EC_GROUP_EVENTS << 9) | 0x1 #define EC_WORD_STAY_AT_HOME (EC_GROUP_EVENTS << 9) | 0x2 #define EC_WORD_BERRY (EC_GROUP_EVENTS << 9) | 0x3 #define EC_WORD_CONTEST (EC_GROUP_EVENTS << 9) | 0x4 #define EC_WORD_MC (EC_GROUP_EVENTS << 9) | 0x5 #define EC_WORD_JUDGE (EC_GROUP_EVENTS << 9) | 0x6 #define EC_WORD_SUPER (EC_GROUP_EVENTS << 9) | 0x7 #define EC_WORD_STAGE (EC_GROUP_EVENTS << 9) | 0x8 #define EC_WORD_HALL_OF_FAME (EC_GROUP_EVENTS << 9) | 0x9 #define EC_WORD_EVOLUTION (EC_GROUP_EVENTS << 9) | 0xa #define EC_WORD_HYPER (EC_GROUP_EVENTS << 9) | 0xb #define EC_WORD_BATTLE_TOWER (EC_GROUP_EVENTS << 9) | 0xc #define EC_WORD_LEADERS (EC_GROUP_EVENTS << 9) | 0xd #define EC_WORD_BATTLE_ROOM (EC_GROUP_EVENTS << 9) | 0xe #define EC_WORD_HIDDEN (EC_GROUP_EVENTS << 9) | 0xf #define EC_WORD_SECRET_BASE (EC_GROUP_EVENTS << 9) | 0x10 #define EC_WORD_BLEND (EC_GROUP_EVENTS << 9) | 0x11 #define EC_WORD_POKEBLOCK (EC_GROUP_EVENTS << 9) | 0x12 #define EC_WORD_MASTER (EC_GROUP_EVENTS << 9) | 0x13 #define EC_WORD_RANK (EC_GROUP_EVENTS << 9) | 0x14 #define EC_WORD_RIBBON (EC_GROUP_EVENTS << 9) | 0x15 #define EC_WORD_CRUSH (EC_GROUP_EVENTS << 9) | 0x16 #define EC_WORD_DIRECT (EC_GROUP_EVENTS << 9) | 0x17 #define EC_WORD_TOWER (EC_GROUP_EVENTS << 9) | 0x18 #define EC_WORD_UNION (EC_GROUP_EVENTS << 9) | 0x19 #define EC_WORD_ROOM (EC_GROUP_EVENTS << 9) | 0x1a #define EC_WORD_WIRELESS (EC_GROUP_EVENTS << 9) | 0x1b // TRENDY_SAYING #define EC_WORD_KTHX_BYE (EC_GROUP_TRENDY_SAYING << 9) | 0x0 #define EC_WORD_YES_SIR_EXCL (EC_GROUP_TRENDY_SAYING << 9) | 0x1 #define EC_WORD_AVANT_GARDE (EC_GROUP_TRENDY_SAYING << 9) | 0x2 #define EC_WORD_COUPLE (EC_GROUP_TRENDY_SAYING << 9) | 0x3 #define EC_WORD_MUCH_OBLIGED (EC_GROUP_TRENDY_SAYING << 9) | 0x4 #define EC_WORD_YEEHAW_EXCL (EC_GROUP_TRENDY_SAYING << 9) | 0x5 #define EC_WORD_MEGA (EC_GROUP_TRENDY_SAYING << 9) | 0x6 #define EC_WORD_1_HIT_KO_EXCL (EC_GROUP_TRENDY_SAYING << 9) | 0x7 #define EC_WORD_DESTINY (EC_GROUP_TRENDY_SAYING << 9) | 0x8 #define EC_WORD_CANCEL (EC_GROUP_TRENDY_SAYING << 9) | 0x9 #define EC_WORD_NEW (EC_GROUP_TRENDY_SAYING << 9) | 0xa #define EC_WORD_FLATTEN (EC_GROUP_TRENDY_SAYING << 9) | 0xb #define EC_WORD_KIDDING (EC_GROUP_TRENDY_SAYING << 9) | 0xc #define EC_WORD_LOSER (EC_GROUP_TRENDY_SAYING << 9) | 0xd #define EC_WORD_LOSING (EC_GROUP_TRENDY_SAYING << 9) | 0xe #define EC_WORD_HAPPENING (EC_GROUP_TRENDY_SAYING << 9) | 0xf #define EC_WORD_HIP_AND (EC_GROUP_TRENDY_SAYING << 9) | 0x10 #define EC_WORD_SHAKE (EC_GROUP_TRENDY_SAYING << 9) | 0x11 #define EC_WORD_SHADY (EC_GROUP_TRENDY_SAYING << 9) | 0x12 #define EC_WORD_UPBEAT (EC_GROUP_TRENDY_SAYING << 9) | 0x13 #define EC_WORD_MODERN (EC_GROUP_TRENDY_SAYING << 9) | 0x14 #define EC_WORD_SMELL_YA (EC_GROUP_TRENDY_SAYING << 9) | 0x15 #define EC_WORD_BANG (EC_GROUP_TRENDY_SAYING << 9) | 0x16 #define EC_WORD_KNOCKOUT (EC_GROUP_TRENDY_SAYING << 9) | 0x17 #define EC_WORD_HASSLE (EC_GROUP_TRENDY_SAYING << 9) | 0x18 #define EC_WORD_WINNER (EC_GROUP_TRENDY_SAYING << 9) | 0x19 #define EC_WORD_FEVER (EC_GROUP_TRENDY_SAYING << 9) | 0x1a #define EC_WORD_WANNABE (EC_GROUP_TRENDY_SAYING << 9) | 0x1b #define EC_WORD_BABY (EC_GROUP_TRENDY_SAYING << 9) | 0x1c #define EC_WORD_HEART (EC_GROUP_TRENDY_SAYING << 9) | 0x1d #define EC_WORD_OLD (EC_GROUP_TRENDY_SAYING << 9) | 0x1e #define EC_WORD_YOUNG (EC_GROUP_TRENDY_SAYING << 9) | 0x1f #define EC_WORD_UGLY (EC_GROUP_TRENDY_SAYING << 9) | 0x20 #define NUM_ADDITIONAL_PHRASES 33 #define EC_POKEMON(mon) ((EC_GROUP_POKEMON << 9) | SPECIES_##mon) #define EC_POKEMON2(mon) ((EC_GROUP_POKEMON_2 << 9) | SPECIES_##mon) #define EC_MOVE(move) ((EC_GROUP_MOVE_1 << 9) | MOVE_##move) #define EC_MOVE2(move) ((EC_GROUP_MOVE_2 << 9) | MOVE_##move) #define EC_GROUP(word) ((word) >> 9) #define EC_INDEX(word) ((word) & 0x1FF) #define EC_WORD(groupId, index) ((((groupId) & 0x7F) << 9) | ((index) & 0x1FF)) #define EC_WORD_UNDEFINED (0xFFFF) #endif // GUARD_CONSTANTS_EASY_CHAT_H ================================================ FILE: include/constants/event_bg.h ================================================ #ifndef GUARD_CONSTANTS_EVENT_BG_H #define GUARD_CONSTANTS_EVENT_BG_H #define BG_EVENT_PLAYER_FACING_ANY 0 #define BG_EVENT_PLAYER_FACING_NORTH 1 #define BG_EVENT_PLAYER_FACING_SOUTH 2 #define BG_EVENT_PLAYER_FACING_EAST 3 #define BG_EVENT_PLAYER_FACING_WEST 4 #define BG_EVENT_HIDDEN_ITEM 7 #define BG_EVENT_SECRET_BASE 8 #endif // GUARD_CONSTANTS_EVENT_BG_H ================================================ FILE: include/constants/event_object_movement.h ================================================ #ifndef GUARD_CONSTANTS_EVENT_OBJECT_MOVEMENT_H #define GUARD_CONSTANTS_EVENT_OBJECT_MOVEMENT_H // FIXME: Different in FRLG #define MOVEMENT_TYPE_NONE 0x0 #define MOVEMENT_TYPE_LOOK_AROUND 0x1 #define MOVEMENT_TYPE_WANDER_AROUND 0x2 #define MOVEMENT_TYPE_WANDER_UP_AND_DOWN 0x3 #define MOVEMENT_TYPE_WANDER_DOWN_AND_UP 0x4 #define MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT 0x5 #define MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT 0x6 #define MOVEMENT_TYPE_FACE_UP 0x7 #define MOVEMENT_TYPE_FACE_DOWN 0x8 #define MOVEMENT_TYPE_FACE_LEFT 0x9 #define MOVEMENT_TYPE_FACE_RIGHT 0xA #define MOVEMENT_TYPE_PLAYER 0xB #define MOVEMENT_TYPE_BERRY_TREE_GROWTH 0xC #define MOVEMENT_TYPE_FACE_DOWN_AND_UP 0xD #define MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT 0xE #define MOVEMENT_TYPE_FACE_UP_AND_LEFT 0xF #define MOVEMENT_TYPE_FACE_UP_AND_RIGHT 0x10 #define MOVEMENT_TYPE_FACE_DOWN_AND_LEFT 0x11 #define MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT 0x12 #define MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT 0x13 #define MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT 0x14 #define MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT 0x15 #define MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT 0x16 #define MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE 0x17 #define MOVEMENT_TYPE_ROTATE_CLOCKWISE 0x18 #define MOVEMENT_TYPE_WALK_UP_AND_DOWN 0x19 #define MOVEMENT_TYPE_WALK_DOWN_AND_UP 0x1A #define MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT 0x1B #define MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT 0x1C #define MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN 0x1D #define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP 0x1E #define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT 0x1F #define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT 0x20 #define MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN 0x21 #define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP 0x22 #define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT 0x23 #define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT 0x24 #define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT 0x25 #define MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT 0x26 #define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN 0x27 #define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP 0x28 #define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT 0x29 #define MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT 0x2A #define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN 0x2B #define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP 0x2C #define MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT 0x2D #define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT 0x2E #define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP 0x2F #define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN 0x30 #define MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT 0x31 #define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT 0x32 #define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN 0x33 #define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP 0x34 #define MOVEMENT_TYPE_COPY_PLAYER 0x35 #define MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE 0x36 #define MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE 0x37 #define MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE 0x38 #define MOVEMENT_TYPE_TREE_DISGUISE 0x39 #define MOVEMENT_TYPE_MOUNTAIN_DISGUISE 0x3A #define MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS 0x3B #define MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS 0x3C #define MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS 0x3D #define MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS 0x3E #define MOVEMENT_TYPE_BURIED 0x3F #define MOVEMENT_TYPE_WALK_IN_PLACE_DOWN 0x40 #define MOVEMENT_TYPE_WALK_IN_PLACE_UP 0x41 #define MOVEMENT_TYPE_WALK_IN_PLACE_LEFT 0x42 #define MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT 0x43 #define MOVEMENT_TYPE_WALK_IN_PLACE_FAST_DOWN 0x44 #define MOVEMENT_TYPE_WALK_IN_PLACE_FAST_UP 0x45 #define MOVEMENT_TYPE_WALK_IN_PLACE_FAST_LEFT 0x46 #define MOVEMENT_TYPE_WALK_IN_PLACE_FAST_RIGHT 0x47 #define MOVEMENT_TYPE_JOG_IN_PLACE_DOWN 0x48 #define MOVEMENT_TYPE_JOG_IN_PLACE_UP 0x49 #define MOVEMENT_TYPE_JOG_IN_PLACE_LEFT 0x4A #define MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT 0x4B #define MOVEMENT_TYPE_INVISIBLE 0x4C #define MOVEMENT_TYPE_RAISE_HAND_AND_STOP 0x4D #define MOVEMENT_TYPE_RAISE_HAND_AND_JUMP 0x4E #define MOVEMENT_TYPE_RAISE_HAND_AND_SWIM 0x4F #define MOVEMENT_TYPE_WANDER_AROUND_SLOWER 0x50 #define MOVEMENT_TYPES_COUNT 0x51 #define MOVEMENT_ACTION_FACE_DOWN 0x0 #define MOVEMENT_ACTION_FACE_UP 0x1 #define MOVEMENT_ACTION_FACE_LEFT 0x2 #define MOVEMENT_ACTION_FACE_RIGHT 0x3 #define MOVEMENT_ACTION_FACE_DOWN_FAST 0x4 #define MOVEMENT_ACTION_FACE_UP_FAST 0x5 #define MOVEMENT_ACTION_FACE_LEFT_FAST 0x6 #define MOVEMENT_ACTION_FACE_RIGHT_FAST 0x7 #define MOVEMENT_ACTION_WALK_SLOWER_DOWN 0x8 #define MOVEMENT_ACTION_WALK_SLOWER_UP 0x9 #define MOVEMENT_ACTION_WALK_SLOWER_LEFT 0xA #define MOVEMENT_ACTION_WALK_SLOWER_RIGHT 0xB #define MOVEMENT_ACTION_WALK_SLOW_DOWN 0xC #define MOVEMENT_ACTION_WALK_SLOW_UP 0xD #define MOVEMENT_ACTION_WALK_SLOW_LEFT 0xE #define MOVEMENT_ACTION_WALK_SLOW_RIGHT 0xF #define MOVEMENT_ACTION_WALK_NORMAL_DOWN 0x10 #define MOVEMENT_ACTION_WALK_NORMAL_UP 0x11 #define MOVEMENT_ACTION_WALK_NORMAL_LEFT 0x12 #define MOVEMENT_ACTION_WALK_NORMAL_RIGHT 0x13 #define MOVEMENT_ACTION_JUMP_2_DOWN 0x14 #define MOVEMENT_ACTION_JUMP_2_UP 0x15 #define MOVEMENT_ACTION_JUMP_2_LEFT 0x16 #define MOVEMENT_ACTION_JUMP_2_RIGHT 0x17 #define MOVEMENT_ACTION_DELAY_1 0x18 #define MOVEMENT_ACTION_DELAY_2 0x19 #define MOVEMENT_ACTION_DELAY_4 0x1A #define MOVEMENT_ACTION_DELAY_8 0x1B #define MOVEMENT_ACTION_DELAY_16 0x1C #define MOVEMENT_ACTION_WALK_FAST_DOWN 0x1D #define MOVEMENT_ACTION_WALK_FAST_UP 0x1E #define MOVEMENT_ACTION_WALK_FAST_LEFT 0x1F #define MOVEMENT_ACTION_WALK_FAST_RIGHT 0x20 #define MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN 0x21 #define MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP 0x22 #define MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT 0x23 #define MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT 0x24 #define MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN 0x25 #define MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP 0x26 #define MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT 0x27 #define MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT 0x28 #define MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN 0x29 #define MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP 0x2A #define MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT 0x2B #define MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT 0x2C #define MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN 0x2D #define MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP 0x2E #define MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT 0x2F #define MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT 0x30 #define MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN 0x31 #define MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP 0x32 #define MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT 0x33 #define MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT 0x34 #define MOVEMENT_ACTION_WALK_FASTER_DOWN 0x35 #define MOVEMENT_ACTION_WALK_FASTER_UP 0x36 #define MOVEMENT_ACTION_WALK_FASTER_LEFT 0x37 #define MOVEMENT_ACTION_WALK_FASTER_RIGHT 0x38 #define MOVEMENT_ACTION_SLIDE_DOWN 0x39 #define MOVEMENT_ACTION_SLIDE_UP 0x3A #define MOVEMENT_ACTION_SLIDE_LEFT 0x3B #define MOVEMENT_ACTION_SLIDE_RIGHT 0x3C #define MOVEMENT_ACTION_PLAYER_RUN_DOWN 0x3D #define MOVEMENT_ACTION_PLAYER_RUN_UP 0x3E #define MOVEMENT_ACTION_PLAYER_RUN_LEFT 0x3F #define MOVEMENT_ACTION_PLAYER_RUN_RIGHT 0x40 #define MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW 0x41 #define MOVEMENT_ACTION_PLAYER_RUN_UP_SLOW 0x42 #define MOVEMENT_ACTION_PLAYER_RUN_LEFT_SLOW 0x43 #define MOVEMENT_ACTION_PLAYER_RUN_RIGHT_SLOW 0x44 #define MOVEMENT_ACTION_START_ANIM_IN_DIRECTION 0x45 #define MOVEMENT_ACTION_JUMP_SPECIAL_DOWN 0x46 #define MOVEMENT_ACTION_JUMP_SPECIAL_UP 0x47 #define MOVEMENT_ACTION_JUMP_SPECIAL_LEFT 0x48 #define MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT 0x49 #define MOVEMENT_ACTION_FACE_PLAYER 0x4A #define MOVEMENT_ACTION_FACE_AWAY_PLAYER 0x4B #define MOVEMENT_ACTION_LOCK_FACING_DIRECTION 0x4C #define MOVEMENT_ACTION_UNLOCK_FACING_DIRECTION 0x4D #define MOVEMENT_ACTION_JUMP_DOWN 0x4E #define MOVEMENT_ACTION_JUMP_UP 0x4F #define MOVEMENT_ACTION_JUMP_LEFT 0x50 #define MOVEMENT_ACTION_JUMP_RIGHT 0x51 #define MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN 0x52 #define MOVEMENT_ACTION_JUMP_IN_PLACE_UP 0x53 #define MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT 0x54 #define MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT 0x55 #define MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP 0x56 #define MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN 0x57 #define MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT 0x58 #define MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT 0x59 #define MOVEMENT_ACTION_FACE_ORIGINAL_DIRECTION 0x5A #define MOVEMENT_ACTION_NURSE_JOY_BOW_DOWN 0x5B #define MOVEMENT_ACTION_ENABLE_JUMP_LANDING_GROUND_EFFECT 0x5C #define MOVEMENT_ACTION_DISABLE_JUMP_LANDING_GROUND_EFFECT 0x5D #define MOVEMENT_ACTION_DISABLE_ANIMATION 0x5E #define MOVEMENT_ACTION_RESTORE_ANIMATION 0x5F #define MOVEMENT_ACTION_SET_INVISIBLE 0x60 #define MOVEMENT_ACTION_SET_VISIBLE 0x61 #define MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK 0x62 #define MOVEMENT_ACTION_EMOTE_QUESTION_MARK 0x63 #define MOVEMENT_ACTION_EMOTE_X 0x64 #define MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK 0x65 #define MOVEMENT_ACTION_EMOTE_SMILE 0x66 #define MOVEMENT_ACTION_REVEAL_TRAINER 0x67 #define MOVEMENT_ACTION_ROCK_SMASH_BREAK 0x68 #define MOVEMENT_ACTION_CUT_TREE 0x69 #define MOVEMENT_ACTION_SET_FIXED_PRIORITY 0x6A #define MOVEMENT_ACTION_CLEAR_FIXED_PRIORITY 0x6B #define MOVEMENT_ACTION_INIT_AFFINE_ANIM 0x6C #define MOVEMENT_ACTION_CLEAR_AFFINE_ANIM 0x6D // These still exist in FRLG for some reason. They're not used by anything obvious. #define MOVEMENT_ACTION_WALK_DOWN_START_AFFINE 0x6E #define MOVEMENT_ACTION_WALK_DOWN_AFFINE 0x6F #define MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN 0x70 #define MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP 0x71 #define MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT 0x72 #define MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT 0x73 #define MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN 0x74 #define MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP 0x75 #define MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT 0x76 #define MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT 0x77 #define MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN 0x78 #define MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP 0x79 #define MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT 0x7A #define MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT 0x7B #define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN 0x7C #define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP 0x7D #define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT 0x7E #define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT 0x7F #define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN 0x80 #define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP 0x81 #define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT 0x82 #define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT 0x83 #define MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN 0x84 #define MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP 0x85 #define MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT 0x86 #define MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT 0x87 #define MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN 0x88 #define MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP 0x89 #define MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT 0x8A #define MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT 0x8B #define MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN 0x8C #define MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP 0x8D #define MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT 0x8E #define MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT 0x8F #define MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN 0x90 #define MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP 0x91 #define MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT 0x92 #define MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT 0x93 #define MOVEMENT_ACTION_SPIN_DOWN 0x94 #define MOVEMENT_ACTION_SPIN_UP 0x95 #define MOVEMENT_ACTION_SPIN_LEFT 0x96 #define MOVEMENT_ACTION_SPIN_RIGHT 0x97 #define MOVEMENT_ACTION_RAISE_HAND_AND_STOP 0x98 #define MOVEMENT_ACTION_RAISE_HAND_AND_JUMP 0x99 #define MOVEMENT_ACTION_RAISE_HAND_AND_SWIM 0x9A #define MOVEMENT_ACTION_WALK_SLOWEST_DOWN 0x9B #define MOVEMENT_ACTION_WALK_SLOWEST_UP 0x9C #define MOVEMENT_ACTION_WALK_SLOWEST_LEFT 0x9D #define MOVEMENT_ACTION_WALK_SLOWEST_RIGHT 0x9E #define MOVEMENT_ACTION_SHAKE_HEAD_OR_WALK_IN_PLACE 0x9F #define MOVEMENT_ACTION_GLIDE_DOWN 0xA0 #define MOVEMENT_ACTION_GLIDE_UP 0xA1 #define MOVEMENT_ACTION_GLIDE_LEFT 0xA2 #define MOVEMENT_ACTION_GLIDE_RIGHT 0xA3 #define MOVEMENT_ACTION_FLY_UP 0xA4 #define MOVEMENT_ACTION_FLY_DOWN 0xA5 #define MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN 0xA6 #define MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_UP 0xA7 #define MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_LEFT 0xA8 #define MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_RIGHT 0xA9 #define MOVEMENT_ACTION_STEP_END 0xFE #define MOVEMENT_ACTION_NONE 0xFF #define ANIM_STD_FACE_SOUTH 0 #define ANIM_STD_FACE_NORTH 1 #define ANIM_STD_FACE_WEST 2 #define ANIM_STD_FACE_EAST 3 #define ANIM_STD_GO_SOUTH 4 #define ANIM_STD_GO_NORTH 5 #define ANIM_STD_GO_WEST 6 #define ANIM_STD_GO_EAST 7 #define ANIM_STD_GO_FAST_SOUTH 8 #define ANIM_STD_GO_FAST_NORTH 9 #define ANIM_STD_GO_FAST_WEST 10 #define ANIM_STD_GO_FAST_EAST 11 #define ANIM_STD_GO_FASTER_SOUTH 12 #define ANIM_STD_GO_FASTER_NORTH 13 #define ANIM_STD_GO_FASTER_WEST 14 #define ANIM_STD_GO_FASTER_EAST 15 #define ANIM_STD_GO_FASTEST_SOUTH 16 #define ANIM_STD_GO_FASTEST_NORTH 17 #define ANIM_STD_GO_FASTEST_WEST 18 #define ANIM_STD_GO_FASTEST_EAST 19 #define ANIM_STD_COUNT 20 #define ANIM_RUN_SOUTH (ANIM_STD_COUNT + 0) #define ANIM_RUN_NORTH (ANIM_STD_COUNT + 1) #define ANIM_RUN_WEST (ANIM_STD_COUNT + 2) #define ANIM_RUN_EAST (ANIM_STD_COUNT + 3) #define ANIM_SPIN_SOUTH (ANIM_STD_COUNT + 4) #define ANIM_SPIN_NORTH (ANIM_STD_COUNT + 5) #define ANIM_SPIN_WEST (ANIM_STD_COUNT + 6) #define ANIM_SPIN_EAST (ANIM_STD_COUNT + 7) #define ANIM_SHAKE_HEAD_OR_WALK_IN_PLACE (ANIM_STD_COUNT + 8) #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) #define ANIM_BUNNY_HOP_BACK_WHEEL_EAST (ANIM_STD_COUNT + 3) #define ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH (ANIM_STD_COUNT + 4) #define ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH (ANIM_STD_COUNT + 5) #define ANIM_BUNNY_HOP_FRONT_WHEEL_WEST (ANIM_STD_COUNT + 6) #define ANIM_BUNNY_HOP_FRONT_WHEEL_EAST (ANIM_STD_COUNT + 7) #define ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH (ANIM_STD_COUNT + 8) #define ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH (ANIM_STD_COUNT + 9) #define ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST (ANIM_STD_COUNT + 10) #define ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST (ANIM_STD_COUNT + 11) #define ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH (ANIM_STD_COUNT + 12) #define ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH (ANIM_STD_COUNT + 13) #define ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST (ANIM_STD_COUNT + 14) #define ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST (ANIM_STD_COUNT + 15) #define ANIM_MOVING_WHEELIE_SOUTH (ANIM_STD_COUNT + 16) #define ANIM_MOVING_WHEELIE_NORTH (ANIM_STD_COUNT + 17) #define ANIM_MOVING_WHEELIE_WEST (ANIM_STD_COUNT + 18) #define ANIM_MOVING_WHEELIE_EAST (ANIM_STD_COUNT + 19) #define ANIM_GET_ON_OFF_POKEMON_SOUTH (ANIM_STD_COUNT + 0) #define ANIM_GET_ON_OFF_POKEMON_NORTH (ANIM_STD_COUNT + 1) #define ANIM_GET_ON_OFF_POKEMON_WEST (ANIM_STD_COUNT + 2) #define ANIM_GET_ON_OFF_POKEMON_EAST (ANIM_STD_COUNT + 3) #define ANIM_NURSE_BOW (ANIM_STD_COUNT + 0) #define ANIM_RAISE_HAND (ANIM_STD_COUNT + 0) #define ANIM_FIELD_MOVE 0 #define ANIM_VS_SEEKER 0 #define ANIM_STAY_STILL 0 #define ANIM_REMOVE_OBSTACLE 1 #define ANIM_TAKE_OUT_ROD_SOUTH 0 #define ANIM_TAKE_OUT_ROD_NORTH 1 #define ANIM_TAKE_OUT_ROD_WEST 2 #define ANIM_TAKE_OUT_ROD_EAST 3 #define ANIM_PUT_AWAY_ROD_SOUTH 4 #define ANIM_PUT_AWAY_ROD_NORTH 5 #define ANIM_PUT_AWAY_ROD_WEST 6 #define ANIM_PUT_AWAY_ROD_EAST 7 #define ANIM_HOOKED_POKEMON_SOUTH 8 #define ANIM_HOOKED_POKEMON_NORTH 9 #define ANIM_HOOKED_POKEMON_WEST 10 #define ANIM_HOOKED_POKEMON_EAST 11 #endif // GUARD_CONSTANTS_EVENT_OBJECT_MOVEMENT_H ================================================ FILE: include/constants/event_objects.h ================================================ #ifndef GUARD_CONSTANTS_EVENT_OBJECTS_H #define GUARD_CONSTANTS_EVENT_OBJECTS_H #define OBJ_EVENT_GFX_RED_NORMAL 0 #define OBJ_EVENT_GFX_RED_BIKE 1 #define OBJ_EVENT_GFX_RED_SURF 2 #define OBJ_EVENT_GFX_RED_FIELD_MOVE 3 #define OBJ_EVENT_GFX_RED_FISH 4 #define OBJ_EVENT_GFX_RED_VS_SEEKER 5 #define OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE 6 #define OBJ_EVENT_GFX_GREEN_NORMAL 7 #define OBJ_EVENT_GFX_GREEN_BIKE 8 #define OBJ_EVENT_GFX_GREEN_SURF 9 #define OBJ_EVENT_GFX_GREEN_FIELD_MOVE 10 #define OBJ_EVENT_GFX_GREEN_FISH 11 #define OBJ_EVENT_GFX_GREEN_VS_SEEKER 12 #define OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE 13 #define OBJ_EVENT_GFX_RS_BRENDAN 14 #define OBJ_EVENT_GFX_RS_MAY 15 #define OBJ_EVENT_GFX_LITTLE_BOY 16 #define OBJ_EVENT_GFX_LITTLE_GIRL 17 #define OBJ_EVENT_GFX_YOUNGSTER 18 #define OBJ_EVENT_GFX_BOY 19 #define OBJ_EVENT_GFX_BUG_CATCHER 20 #define OBJ_EVENT_GFX_SITTING_BOY 21 #define OBJ_EVENT_GFX_LASS 22 #define OBJ_EVENT_GFX_WOMAN_1 23 #define OBJ_EVENT_GFX_BATTLE_GIRL 24 #define OBJ_EVENT_GFX_MAN 25 #define OBJ_EVENT_GFX_ROCKER 26 #define OBJ_EVENT_GFX_FAT_MAN 27 #define OBJ_EVENT_GFX_WOMAN_2 28 #define OBJ_EVENT_GFX_BEAUTY 29 #define OBJ_EVENT_GFX_BALDING_MAN 30 #define OBJ_EVENT_GFX_WOMAN_3 31 #define OBJ_EVENT_GFX_OLD_MAN_1 32 #define OBJ_EVENT_GFX_OLD_MAN_2 33 #define OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN 34 #define OBJ_EVENT_GFX_OLD_WOMAN 35 #define OBJ_EVENT_GFX_TUBER_M_WATER 36 #define OBJ_EVENT_GFX_TUBER_F 37 #define OBJ_EVENT_GFX_TUBER_M_LAND 38 #define OBJ_EVENT_GFX_CAMPER 39 #define OBJ_EVENT_GFX_PICNICKER 40 #define OBJ_EVENT_GFX_COOLTRAINER_M 41 #define OBJ_EVENT_GFX_COOLTRAINER_F 42 #define OBJ_EVENT_GFX_SWIMMER_M_WATER 43 #define OBJ_EVENT_GFX_SWIMMER_F_WATER 44 #define OBJ_EVENT_GFX_SWIMMER_M_LAND 45 #define OBJ_EVENT_GFX_SWIMMER_F_LAND 46 #define OBJ_EVENT_GFX_WORKER_M 47 #define OBJ_EVENT_GFX_WORKER_F 48 #define OBJ_EVENT_GFX_ROCKET_M 49 #define OBJ_EVENT_GFX_ROCKET_F 50 #define OBJ_EVENT_GFX_GBA_KID 51 #define OBJ_EVENT_GFX_SUPER_NERD 52 #define OBJ_EVENT_GFX_BIKER 53 #define OBJ_EVENT_GFX_BLACKBELT 54 #define OBJ_EVENT_GFX_SCIENTIST 55 #define OBJ_EVENT_GFX_HIKER 56 #define OBJ_EVENT_GFX_FISHER 57 #define OBJ_EVENT_GFX_CHANNELER 58 #define OBJ_EVENT_GFX_CHEF 59 #define OBJ_EVENT_GFX_POLICEMAN 60 #define OBJ_EVENT_GFX_GENTLEMAN 61 #define OBJ_EVENT_GFX_SAILOR 62 #define OBJ_EVENT_GFX_CAPTAIN 63 #define OBJ_EVENT_GFX_NURSE 64 #define OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST 65 #define OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST 66 #define OBJ_EVENT_GFX_UNUSED_MALE_RECEPTIONIST 67 #define OBJ_EVENT_GFX_CLERK 68 #define OBJ_EVENT_GFX_MG_DELIVERYMAN 69 #define OBJ_EVENT_GFX_TRAINER_TOWER_DUDE 70 #define OBJ_EVENT_GFX_PROF_OAK 71 #define OBJ_EVENT_GFX_BLUE 72 #define OBJ_EVENT_GFX_BILL 73 #define OBJ_EVENT_GFX_LANCE 74 #define OBJ_EVENT_GFX_AGATHA 75 #define OBJ_EVENT_GFX_DAISY 76 #define OBJ_EVENT_GFX_LORELEI 77 #define OBJ_EVENT_GFX_MR_FUJI 78 #define OBJ_EVENT_GFX_BRUNO 79 #define OBJ_EVENT_GFX_BROCK 80 #define OBJ_EVENT_GFX_MISTY 81 #define OBJ_EVENT_GFX_LT_SURGE 82 #define OBJ_EVENT_GFX_ERIKA 83 #define OBJ_EVENT_GFX_KOGA 84 #define OBJ_EVENT_GFX_SABRINA 85 #define OBJ_EVENT_GFX_BLAINE 86 #define OBJ_EVENT_GFX_GIOVANNI 87 #define OBJ_EVENT_GFX_MOM 88 #define OBJ_EVENT_GFX_CELIO 89 #define OBJ_EVENT_GFX_TEACHY_TV_HOST 90 #define OBJ_EVENT_GFX_GYM_GUY 91 #define OBJ_EVENT_GFX_ITEM_BALL 92 #define OBJ_EVENT_GFX_TOWN_MAP 93 #define OBJ_EVENT_GFX_POKEDEX 94 #define OBJ_EVENT_GFX_CUT_TREE 95 #define OBJ_EVENT_GFX_ROCK_SMASH_ROCK 96 #define OBJ_EVENT_GFX_PUSHABLE_BOULDER 97 #define OBJ_EVENT_GFX_FOSSIL 98 #define OBJ_EVENT_GFX_RUBY 99 #define OBJ_EVENT_GFX_SAPPHIRE 100 #define OBJ_EVENT_GFX_OLD_AMBER 101 #define OBJ_EVENT_GFX_GYM_SIGN 102 #define OBJ_EVENT_GFX_SIGN 103 #define OBJ_EVENT_GFX_TRAINER_TIPS 104 #define OBJ_EVENT_GFX_CLIPBOARD 105 #define OBJ_EVENT_GFX_METEORITE 106 #define OBJ_EVENT_GFX_LAPRAS_DOLL 107 #define OBJ_EVENT_GFX_SEAGALLOP 108 #define OBJ_EVENT_GFX_SNORLAX 109 #define OBJ_EVENT_GFX_SPEAROW 110 #define OBJ_EVENT_GFX_CUBONE 111 #define OBJ_EVENT_GFX_POLIWRATH 112 #define OBJ_EVENT_GFX_CLEFAIRY 113 #define OBJ_EVENT_GFX_PIDGEOT 114 #define OBJ_EVENT_GFX_JIGGLYPUFF 115 #define OBJ_EVENT_GFX_PIDGEY 116 #define OBJ_EVENT_GFX_CHANSEY 117 #define OBJ_EVENT_GFX_OMANYTE 118 #define OBJ_EVENT_GFX_KANGASKHAN 119 #define OBJ_EVENT_GFX_PIKACHU 120 #define OBJ_EVENT_GFX_PSYDUCK 121 #define OBJ_EVENT_GFX_NIDORAN_F 122 #define OBJ_EVENT_GFX_NIDORAN_M 123 #define OBJ_EVENT_GFX_NIDORINO 124 #define OBJ_EVENT_GFX_MEOWTH 125 #define OBJ_EVENT_GFX_SEEL 126 #define OBJ_EVENT_GFX_VOLTORB 127 #define OBJ_EVENT_GFX_SLOWPOKE 128 #define OBJ_EVENT_GFX_SLOWBRO 129 #define OBJ_EVENT_GFX_MACHOP 130 #define OBJ_EVENT_GFX_WIGGLYTUFF 131 #define OBJ_EVENT_GFX_DODUO 132 #define OBJ_EVENT_GFX_FEAROW 133 #define OBJ_EVENT_GFX_MACHOKE 134 #define OBJ_EVENT_GFX_LAPRAS 135 #define OBJ_EVENT_GFX_ZAPDOS 136 #define OBJ_EVENT_GFX_MOLTRES 137 #define OBJ_EVENT_GFX_ARTICUNO 138 #define OBJ_EVENT_GFX_MEWTWO 139 #define OBJ_EVENT_GFX_MEW 140 #define OBJ_EVENT_GFX_ENTEI 141 #define OBJ_EVENT_GFX_SUICUNE 142 #define OBJ_EVENT_GFX_RAIKOU 143 #define OBJ_EVENT_GFX_LUGIA 144 #define OBJ_EVENT_GFX_HO_OH 145 #define OBJ_EVENT_GFX_CELEBI 146 #define OBJ_EVENT_GFX_KABUTO 147 #define OBJ_EVENT_GFX_DEOXYS_D 148 #define OBJ_EVENT_GFX_DEOXYS_A 149 #define OBJ_EVENT_GFX_DEOXYS_N 150 #define OBJ_EVENT_GFX_SS_ANNE 151 #define OBJ_EVENT_GFX_CUE_BALL 152 #define OBJ_EVENT_GFX_PAINTER 153 #define OBJ_EVENT_GFX_BIRD_KEEPER 154 #define OBJ_EVENT_GFX_BURGLAR 155 #define OBJ_EVENT_GFX_POKEMON_RANGER_F 156 #define OBJ_EVENT_GFX_POKEMON_RANGER_M 157 #define OBJ_EVENT_GFX_RUIN_MANIAC 158 #define OBJ_EVENT_GFX_POKE_MANIAC 159 #define OBJ_EVENT_GFX_PSYCHIC_M 160 #define OBJ_EVENT_GFX_PSYCHIC_F 161 #define OBJ_EVENT_GFX_AROMA_LADY 162 #define OBJ_EVENT_GFX_TWIN 163 #define OBJ_EVENT_GFX_YOUNG_COUPLE_M 164 #define OBJ_EVENT_GFX_YOUNG_COUPLE_F 165 #define OBJ_EVENT_GFX_ENGINEER 166 #define OBJ_EVENT_GFX_JUGGLER 167 #define OBJ_EVENT_GFX_TAMER 168 #define OBJ_EVENT_GFX_POKEMON_BREEDER 169 #define OBJ_EVENT_GFX_RED_UNDERWATER 170 #define OBJ_EVENT_GFX_GREEN_UNDERWATER 171 #define OBJ_EVENT_GFX_SCOTT 172 #define OBJ_EVENT_GFX_BULBASAUR 173 #define OBJ_EVENT_GFX_CHARMANDER 174 #define OBJ_EVENT_GFX_SQUIRTLE 175 #define OBJ_EVENT_GFX_LATIAS 176 #define OBJ_EVENT_GFX_LATIOS 177 #define OBJ_EVENT_GFX_EM_BRENDAN 178 #define OBJ_EVENT_GFX_EM_MAY 179 #define OBJ_EVENT_GFX_CABLE_CAR 180 #define OBJ_EVENT_GFX_SUDOWOODO 181 #define OBJ_EVENT_GFX_ABRA 182 #define OBJ_EVENT_GFX_SWIMMER_F_WATER_2 183 #define OBJ_EVENT_GFX_MASTER_BEAUTY 184 #define OBJ_EVENT_GFX_MASTER_BIRD_KEEPER 185 #define OBJ_EVENT_GFX_MASTER_BLACK_BELT 186 #define OBJ_EVENT_GFX_MASTER_BUG_CATCHER 187 #define OBJ_EVENT_GFX_MASTER_COOLTRAINER_M 188 #define OBJ_EVENT_GFX_MASTER_HIKER 189 #define OBJ_EVENT_GFX_MASTER_LASS 190 #define OBJ_EVENT_GFX_MASTER_PSYCHIC_M 191 #define OBJ_EVENT_GFX_MASTER_SCIENTIST 192 #define OBJ_EVENT_GFX_MASTER_YOUNGSTER 193 #define OBJ_EVENT_GFX_LADY 194 #define OBJ_EVENT_GFX_ROCKER_2 195 #define OBJ_EVENT_GFX_ANABEL 196 #define OBJ_EVENT_GFX_TUCKER 197 #define OBJ_EVENT_GFX_GRETA 198 #define OBJ_EVENT_GFX_SPENSER 199 #define OBJ_EVENT_GFX_NOLAND 200 #define OBJ_EVENT_GFX_LUCY 201 #define OBJ_EVENT_GFX_BRANDON 202 #define NUM_OBJ_EVENT_GFX 203 // These are dynamic object gfx ids. // They correspond with the values of the VAR_OBJ_GFX_ID_X vars. // More info about them in include/constants/vars.h #define OBJ_EVENT_GFX_VARS 240 #define OBJ_EVENT_GFX_VAR_0 (OBJ_EVENT_GFX_VARS + 0x0) // 240 #define OBJ_EVENT_GFX_VAR_1 (OBJ_EVENT_GFX_VARS + 0x1) #define OBJ_EVENT_GFX_VAR_2 (OBJ_EVENT_GFX_VARS + 0x2) #define OBJ_EVENT_GFX_VAR_3 (OBJ_EVENT_GFX_VARS + 0x3) #define OBJ_EVENT_GFX_VAR_4 (OBJ_EVENT_GFX_VARS + 0x4) #define OBJ_EVENT_GFX_VAR_5 (OBJ_EVENT_GFX_VARS + 0x5) #define OBJ_EVENT_GFX_VAR_6 (OBJ_EVENT_GFX_VARS + 0x6) #define OBJ_EVENT_GFX_VAR_7 (OBJ_EVENT_GFX_VARS + 0x7) #define OBJ_EVENT_GFX_VAR_8 (OBJ_EVENT_GFX_VARS + 0x8) #define OBJ_EVENT_GFX_VAR_9 (OBJ_EVENT_GFX_VARS + 0x9) #define OBJ_EVENT_GFX_VAR_A (OBJ_EVENT_GFX_VARS + 0xA) #define OBJ_EVENT_GFX_VAR_B (OBJ_EVENT_GFX_VARS + 0xB) #define OBJ_EVENT_GFX_VAR_C (OBJ_EVENT_GFX_VARS + 0xC) #define OBJ_EVENT_GFX_VAR_D (OBJ_EVENT_GFX_VARS + 0xD) #define OBJ_EVENT_GFX_VAR_E (OBJ_EVENT_GFX_VARS + 0xE) #define OBJ_EVENT_GFX_VAR_F (OBJ_EVENT_GFX_VARS + 0xF) // 255 #define SHADOW_SIZE_S 0 #define SHADOW_SIZE_M 1 #define SHADOW_SIZE_L 2 #define SHADOW_SIZE_XL 3 #define F_INANIMATE (1 << 6) #define F_DISABLE_REFLECTION_PALETTE_LOAD (1 << 7) #define TRACKS_NONE 0 #define TRACKS_FOOT 1 #define TRACKS_BIKE_TIRE 2 #define OBJ_KIND_NORMAL 0 #define OBJ_KIND_CLONE 255 // Special object event local ids #define OBJ_EVENT_ID_PLAYER 0xFF #define OBJ_EVENT_ID_CAMERA 0x7F // Object event local ids referenced in C files #define LOCALID_UNION_ROOM_PLAYER_4 2 #define LOCALID_UNION_ROOM_PLAYER_8 3 #define LOCALID_UNION_ROOM_PLAYER_7 4 #define LOCALID_UNION_ROOM_PLAYER_6 5 #define LOCALID_UNION_ROOM_PLAYER_5 6 #define LOCALID_UNION_ROOM_PLAYER_3 7 #define LOCALID_UNION_ROOM_PLAYER_2 8 #define LOCALID_UNION_ROOM_PLAYER_1 9 #endif // GUARD_CONSTANTS_EVENT_OBJECTS_H ================================================ FILE: include/constants/fame_checker.h ================================================ #ifndef GUARD_CONSTANTS_FAME_CHECKER_H #define GUARD_CONSTANTS_FAME_CHECKER_H #define FAMECHECKER_OAK 0 #define FAMECHECKER_DAISY 1 #define FAMECHECKER_BROCK 2 #define FAMECHECKER_MISTY 3 #define FAMECHECKER_LTSURGE 4 #define FAMECHECKER_ERIKA 5 #define FAMECHECKER_KOGA 6 #define FAMECHECKER_SABRINA 7 #define FAMECHECKER_BLAINE 8 #define FAMECHECKER_LORELEI 9 #define FAMECHECKER_BRUNO 10 #define FAMECHECKER_AGATHA 11 #define FAMECHECKER_LANCE 12 #define FAMECHECKER_BILL 13 #define FAMECHECKER_MRFUJI 14 #define FAMECHECKER_GIOVANNI 15 #define NUM_FAMECHECKER_PERSONS 16 #define FCPICKSTATE_NO_DRAW 0 #define FCPICKSTATE_SILHOUETTE 1 #define FCPICKSTATE_COLORED 2 #endif //GUARD_CONSTANTS_FAME_CHECKER_H ================================================ FILE: include/constants/field_effects.h ================================================ #ifndef GUARD_CONSTANTS_FIELD_EFFECTS_H #define GUARD_CONSTANTS_FIELD_EFFECTS_H #define FLDEFF_EXCLAMATION_MARK_ICON 0 #define FLDEFF_USE_CUT_ON_GRASS 1 #define FLDEFF_USE_CUT_ON_TREE 2 #define FLDEFF_SHADOW 3 #define FLDEFF_TALL_GRASS 4 #define FLDEFF_RIPPLE 5 #define FLDEFF_FIELD_MOVE_SHOW_MON 6 #define FLDEFF_ASH 7 #define FLDEFF_SURF_BLOB 8 #define FLDEFF_USE_SURF 9 #define FLDEFF_DUST 10 #define FLDEFF_USE_SECRET_POWER_CAVE 11 #define FLDEFF_JUMP_TALL_GRASS 12 #define FLDEFF_SAND_FOOTPRINTS 13 #define FLDEFF_JUMP_BIG_SPLASH 14 #define FLDEFF_SPLASH 15 #define FLDEFF_JUMP_SMALL_SPLASH 16 #define FLDEFF_LONG_GRASS 17 #define FLDEFF_JUMP_LONG_GRASS 18 #define FLDEFF_UNUSED_GRASS 19 #define FLDEFF_UNUSED_GRASS_2 20 #define FLDEFF_UNUSED_SAND 21 #define FLDEFF_UNUSED_WATER_SURFACING 22 #define FLDEFF_BERRY_TREE_GROWTH_SPARKLE 23 #define FLDEFF_DEEP_SAND_FOOTPRINTS 24 #define FLDEFF_POKECENTER_HEAL 25 #define FLDEFF_USE_SECRET_POWER_TREE 26 #define FLDEFF_USE_SECRET_POWER_SHRUB 27 #define FLDEFF_TREE_DISGUISE 28 #define FLDEFF_MOUNTAIN_DISGUISE 29 #define FLDEFF_NPCFLY_OUT 30 #define FLDEFF_FLY_OUT 31 #define FLDEFF_FLY_IN 32 #define FLDEFF_QUESTION_MARK_ICON 33 #define FLDEFF_FEET_IN_FLOWING_WATER 34 #define FLDEFF_BIKE_TIRE_TRACKS 35 #define FLDEFF_SAND_DISGUISE 36 #define FLDEFF_USE_ROCK_SMASH 37 #define FLDEFF_USE_DIG 38 #define FLDEFF_SAND_PILE 39 #define FLDEFF_USE_STRENGTH 40 #define FLDEFF_SHORT_GRASS 41 #define FLDEFF_HOT_SPRINGS_WATER 42 #define FLDEFF_USE_WATERFALL 43 #define FLDEFF_USE_DIVE 44 #define FLDEFF_POKEBALL 45 #define FLDEFF_X_ICON 46 #define FLDEFF_NOP_47 47 #define FLDEFF_NOP_48 48 #define FLDEFF_POP_OUT_OF_ASH 49 #define FLDEFF_LAVARIDGE_GYM_WARP 50 #define FLDEFF_SWEET_SCENT 51 #define FLDEFF_SAND_PILLAR 52 #define FLDEFF_BUBBLES 53 #define FLDEFF_SPARKLE 54 #define FLDEFF_SECRET_POWER_CAVE 55 #define FLDEFF_SECRET_POWER_TREE 56 #define FLDEFF_SECRET_POWER_SHRUB 57 #define FLDEFF_CUT_GRASS 58 #define FLDEFF_FIELD_MOVE_SHOW_MON_INIT 59 #define FLDEFF_USE_FLY_ANCIENT_TOMB 60 #define FLDEFF_PCTURN_ON 61 #define FLDEFF_HALL_OF_FAME_RECORD 62 #define FLDEFF_USE_TELEPORT 63 #define FLDEFF_SMILEY_FACE_ICON 64 #define FLDEFF_USE_VS_SEEKER 65 #define FLDEFF_DOUBLE_EXCL_MARK_ICON 66 #define FLDEFF_MOVE_DEOXYS_ROCK 67 #define FLDEFF_DESTROY_DEOXYS_ROCK 68 #define FLDEFF_PHOTO_FLASH 69 #define FLDEFF_PAL_TAG_GENERAL_0 0x1004 #define FLDEFF_PAL_TAG_GENERAL_1 0x1005 #define FLDEFF_PAL_TAG_POKEBALL_TRAIL 0x1009 #define FLDEFF_PAL_TAG_ASH 0x100D #define FLDEFF_PAL_TAG_SMALL_SPARKLE 0x100F #define FLDEFFOBJ_SHADOW_S 0 #define FLDEFFOBJ_SHADOW_M 1 #define FLDEFFOBJ_SHADOW_L 2 #define FLDEFFOBJ_SHADOW_XL 3 #define FLDEFFOBJ_TALL_GRASS 4 #define FLDEFFOBJ_RIPPLE 5 #define FLDEFFOBJ_ASH 6 #define FLDEFFOBJ_SURF_BLOB 7 #define FLDEFFOBJ_ARROW 8 #define FLDEFFOBJ_GROUND_IMPACT_DUST 9 #define FLDEFFOBJ_JUMP_TALL_GRASS 10 #define FLDEFFOBJ_SAND_FOOTPRINTS 11 #define FLDEFFOBJ_JUMP_BIG_SPLASH 12 #define FLDEFFOBJ_SPLASH 13 #define FLDEFFOBJ_JUMP_SMALL_SPLASH 14 #define FLDEFFOBJ_LONG_GRASS 15 #define FLDEFFOBJ_JUMP_LONG_GRASS 16 #define FLDEFFOBJ_UNUSED_GRASS 17 #define FLDEFFOBJ_UNUSED_GRASS_2 18 #define FLDEFFOBJ_UNUSED_SAND 19 #define FLDEFFOBJ_WATER_SURFACING 20 #define FLDEFFOBJ_REFLECTION_DISTORTION 21 #define FLDEFFOBJ_SPARKLE 22 #define FLDEFFOBJ_DEEP_SAND_FOOTPRINTS 23 #define FLDEFFOBJ_TREE_DISGUISE 24 #define FLDEFFOBJ_MOUNTAIN_DISGUISE 25 #define FLDEFFOBJ_BIRD 26 #define FLDEFFOBJ_BIKE_TIRE_TRACKS 27 #define FLDEFFOBJ_SAND_DISGUISE 28 #define FLDEFFOBJ_SAND_PILE 29 #define FLDEFFOBJ_SHORT_GRASS 30 #define FLDEFFOBJ_HOT_SPRINGS_WATER 31 #define FLDEFFOBJ_ASH_PUFF 32 #define FLDEFFOBJ_ASH_LAUNCH 33 #define FLDEFFOBJ_BUBBLES 34 #define FLDEFFOBJ_SMALL_SPARKLE 35 #endif // GUARD_CONSTANTS_FIELD_EFFECTS_H ================================================ FILE: include/constants/field_tasks.h ================================================ #ifndef GUARD_CONSTANTS_FIELD_TASKS_H #define GUARD_CONSTANTS_FIELD_TASKS_H #define STEP_CB_DUMMY 0 #define STEP_CB_ASH 1 // Unused #define STEP_CB_FORTREE_BRIDGE 2 // Unused, dummied #define STEP_CB_PACIFIDLOG_BRIDGE 3 // Unused, dummied #define STEP_CB_ICE 4 #define STEP_CB_TRUCK 5 // Unused, dummied #define STEP_CB_SECRET_BASE 6 // Unused, dummied #define STEP_CB_CRACKED_FLOOR 7 // Unused #endif // GUARD_CONSTANTS_FIELD_TASKS_H ================================================ FILE: include/constants/field_weather.h ================================================ #ifndef GUARD_CONSTANTS_FIELD_WEATHER_H #define GUARD_CONSTANTS_FIELD_WEATHER_H #define MAX_RAIN_SPRITES 24 #define NUM_CLOUD_SPRITES 3 #define NUM_FOG_HORIZONTAL_SPRITES 20 #define NUM_ASH_SPRITES 20 #define NUM_FOG_DIAGONAL_SPRITES 20 #define NUM_SANDSTORM_SPRITES 20 #define NUM_SWIRL_SANDSTORM_SPRITES 5 // Controls how the weather should be changing the screen palettes. #define WEATHER_PAL_STATE_CHANGING_WEATHER 0 #define WEATHER_PAL_STATE_SCREEN_FADING_IN 1 #define WEATHER_PAL_STATE_SCREEN_FADING_OUT 2 #define WEATHER_PAL_STATE_IDLE 3 // Modes for FadeScreen #define FADE_FROM_BLACK 0 #define FADE_TO_BLACK 1 #define FADE_FROM_WHITE 2 #define FADE_TO_WHITE 3 #endif // GUARD_CONSTANTS_FIELD_WEATHER_H ================================================ FILE: include/constants/flags.h ================================================ #ifndef GUARD_CONSTANTS_FLAGS_H #define GUARD_CONSTANTS_FLAGS_H #include "constants/trainers.h" // Temporary Flags // These temporary flags are are cleared every time a map is loaded. They are used // for things like shortening an NPCs introduction text if the player already spoke // to them once. #define TEMP_FLAGS_START 0x0 #define FLAG_TEMP_1 (TEMP_FLAGS_START + 0x01) #define FLAG_TEMP_2 (TEMP_FLAGS_START + 0x02) #define FLAG_TEMP_3 (TEMP_FLAGS_START + 0x03) #define FLAG_TEMP_4 (TEMP_FLAGS_START + 0x04) #define FLAG_TEMP_5 (TEMP_FLAGS_START + 0x05) #define FLAG_TEMP_6 (TEMP_FLAGS_START + 0x06) #define FLAG_TEMP_7 (TEMP_FLAGS_START + 0x07) #define FLAG_TEMP_8 (TEMP_FLAGS_START + 0x08) #define FLAG_TEMP_9 (TEMP_FLAGS_START + 0x09) #define FLAG_TEMP_A (TEMP_FLAGS_START + 0x0A) #define FLAG_TEMP_B (TEMP_FLAGS_START + 0x0B) #define FLAG_TEMP_C (TEMP_FLAGS_START + 0x0C) #define FLAG_TEMP_D (TEMP_FLAGS_START + 0x0D) #define FLAG_TEMP_E (TEMP_FLAGS_START + 0x0E) #define FLAG_TEMP_F (TEMP_FLAGS_START + 0x0F) #define FLAG_TEMP_10 (TEMP_FLAGS_START + 0x10) // Used for obstacles (e.g. cut trees and rock smash rocks) #define FLAG_TEMP_11 (TEMP_FLAGS_START + 0x11) #define FLAG_TEMP_12 (TEMP_FLAGS_START + 0x12) #define FLAG_TEMP_13 (TEMP_FLAGS_START + 0x13) #define FLAG_TEMP_14 (TEMP_FLAGS_START + 0x14) #define FLAG_TEMP_15 (TEMP_FLAGS_START + 0x15) #define FLAG_TEMP_16 (TEMP_FLAGS_START + 0x16) #define FLAG_TEMP_17 (TEMP_FLAGS_START + 0x17) #define FLAG_TEMP_18 (TEMP_FLAGS_START + 0x18) #define FLAG_TEMP_19 (TEMP_FLAGS_START + 0x19) #define FLAG_TEMP_1A (TEMP_FLAGS_START + 0x1A) #define FLAG_TEMP_1B (TEMP_FLAGS_START + 0x1B) #define FLAG_TEMP_1C (TEMP_FLAGS_START + 0x1C) #define FLAG_TEMP_1D (TEMP_FLAGS_START + 0x1D) #define FLAG_TEMP_1E (TEMP_FLAGS_START + 0x1E) #define FLAG_TEMP_1F (TEMP_FLAGS_START + 0x1F) #define TEMP_FLAGS_END FLAG_TEMP_1F #define FLAG_0x020 0x020 #define FLAG_0x021 0x021 #define FLAG_0x022 0x022 #define FLAG_0x023 0x023 #define FLAG_0x024 0x024 #define FLAG_0x025 0x025 #define FLAG_0x026 0x026 // Hide/show flags #define FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER 0x027 #define FLAG_HIDE_BULBASAUR_BALL 0x028 #define FLAG_HIDE_SQUIRTLE_BALL 0x029 #define FLAG_HIDE_CHARMANDER_BALL 0x02A #define FLAG_HIDE_OAK_IN_HIS_LAB 0x02B #define FLAG_HIDE_OAK_IN_PALLET_TOWN 0x02C #define FLAG_HIDE_RIVAL_IN_LAB 0x02D #define FLAG_HIDE_PEWTER_CITY_GYM_GUIDE 0x02E #define FLAG_HIDE_DOME_FOSSIL 0x02F #define FLAG_HIDE_HELIX_FOSSIL 0x030 #define FLAG_HIDE_NUGGET_BRIDGE_ROCKET 0x031 #define FLAG_HIDE_BILL_CLEFAIRY 0x032 #define FLAG_HIDE_BILL_HUMAN_SEA_COTTAGE 0x033 #define FLAG_HIDE_TOWER_FUJI 0x034 #define FLAG_HIDE_POKEHOUSE_FUJI 0x035 #define FLAG_HIDE_LIFT_KEY 0x036 #define FLAG_HIDE_SILPH_SCOPE 0x037 #define FLAG_HIDE_HIDEOUT_GIOVANNI 0x038 #define FLAG_HIDE_TOWN_MAP 0x039 #define FLAG_HIDE_POKEDEX 0x03A #define FLAG_HIDE_CERULEAN_ROCKET 0x03B #define FLAG_HIDE_CERULEAN_RIVAL 0x03C #define FLAG_HIDE_SS_ANNE_RIVAL 0x03D #define FLAG_HIDE_SAFFRON_ROCKETS 0x03E #define FLAG_HIDE_SAFFRON_CIVILIANS 0x03F #define FLAG_HIDE_SEAFOAM_1F_BOULDER_1 0x040 #define FLAG_HIDE_SEAFOAM_1F_BOULDER_2 0x041 #define FLAG_HIDE_SEAFOAM_B1F_BOULDER_1 0x042 #define FLAG_HIDE_SEAFOAM_B1F_BOULDER_2 0x043 #define FLAG_HIDE_SEAFOAM_B2F_BOULDER_1 0x044 #define FLAG_HIDE_SEAFOAM_B2F_BOULDER_2 0x045 #define FLAG_HIDE_SEAFOAM_B3F_BOULDER_1 0x046 #define FLAG_HIDE_SEAFOAM_B3F_BOULDER_2 0x047 #define FLAG_HIDE_SEAFOAM_B3F_BOULDER_3 0x048 #define FLAG_HIDE_SEAFOAM_B3F_BOULDER_4 0x049 #define FLAG_HIDE_SEAFOAM_B3F_BOULDER_5 0x04A #define FLAG_HIDE_SEAFOAM_B3F_BOULDER_6 0x04B #define FLAG_HIDE_SEAFOAM_B4F_BOULDER_1 0x04C #define FLAG_HIDE_SEAFOAM_B4F_BOULDER_2 0x04D #define FLAG_HIDE_SILPH_RIVAL 0x04E #define FLAG_HIDE_ROUTE_22_RIVAL 0x04F #define FLAG_HIDE_PEWTER_MUSEUM_GUIDE 0x050 #define FLAG_HIDE_TOWER_RIVAL 0x051 #define FLAG_HIDE_MOLTRES 0x052 #define FLAG_HIDE_SILPH_ROCKETS 0x053 #define FLAG_HIDE_ROUTE_12_SNORLAX 0x054 #define FLAG_HIDE_VIRIDIAN_GIOVANNI 0x055 #define FLAG_HIDE_OLD_AMBER 0x056 #define FLAG_HIDE_EEVEE_BALL 0x057 #define FLAG_HIDE_VICTORY_ROAD_2F_BOULDER 0x058 #define FLAG_HIDE_VICTORY_ROAD_3F_BOULDER 0x059 #define FLAG_HIDE_OAK_IN_CHAMP_ROOM 0x05A #define FLAG_HIDE_GAME_CORNER_ROCKET 0x05B #define FLAG_HIDE_CERULEAN_CAVE_GUARD 0x05C #define FLAG_HIDE_ZAPDOS 0x05D #define FLAG_HIDE_TOWER_ROCKET_1 0x05E #define FLAG_HIDE_CELADON_ROCKETS 0x05F #define FLAG_HIDE_DOJO_HITMONLEE_BALL 0x060 #define FLAG_HIDE_DOJO_HITMONCHAN_BALL 0x061 #define FLAG_HIDE_CINNABAR_BILL 0x062 #define FLAG_HIDE_UNION_ROOM_PLAYER_1 0x063 #define FLAG_HIDE_UNION_ROOM_PLAYER_2 0x064 #define FLAG_HIDE_UNION_ROOM_PLAYER_3 0x065 #define FLAG_HIDE_UNION_ROOM_PLAYER_4 0x066 #define FLAG_HIDE_UNION_ROOM_PLAYER_5 0x067 #define FLAG_HIDE_UNION_ROOM_PLAYER_6 0x068 #define FLAG_HIDE_UNION_ROOM_PLAYER_7 0x069 #define FLAG_HIDE_UNION_ROOM_PLAYER_8 0x06A #define FLAG_HIDE_CINNABAR_SEAGALLOP 0x06B #define FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT 0x06C #define FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER 0x06D #define FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN 0x06E #define FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY 0x06F #define FLAG_HIDE_MG_DELIVERYMEN 0x070 #define FLAG_HIDE_ONE_ISLAND_BILL 0x071 #define FLAG_HIDE_ONE_ISLAND_POKECENTER_BILL 0x072 #define FLAG_HIDE_ONE_ISLAND_POKECENTER_CELIO 0x073 #define FLAG_HIDE_TWO_ISLAND_GAME_CORNER_BIKER 0x074 #define FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE 0x075 #define FLAG_HIDE_LOSTELLE_IN_HER_HOME 0x076 #define FLAG_HIDE_LAVENDER_OUTSIDE_FUJI 0x077 #define FLAG_HIDE_BATTLE_TOWER_OPPONENT 0x078 #define FLAG_HIDE_THREE_ISLAND_BIKERS 0x079 #define FLAG_HIDE_LOSTELLE_IN_BERRY_FOREST 0x07A #define FLAG_HIDE_TWO_ISLAND_WOMAN 0x07B #define FLAG_HIDE_TWO_ISLAND_BEAUTY 0x07C #define FLAG_HIDE_TWO_ISLAND_SUPER_NERD 0x07D #define FLAG_HIDE_THREE_ISLAND_ANTIBIKERS 0x07E #define FLAG_HIDE_SCOTT 0x07F #define FLAG_HIDE_ROUTE_16_SNORLAX 0x080 #define FLAG_HIDE_MEWTWO 0x081 #define FLAG_HIDE_ARTICUNO 0x082 #define FLAG_HIDE_TOWER_ROCKET_2 0x083 #define FLAG_HIDE_TOWER_ROCKET_3 0x084 #define FLAG_HIDE_POWER_PLANT_ELECTRODE_1 0x085 #define FLAG_HIDE_POWER_PLANT_ELECTRODE_2 0x086 #define FLAG_HIDE_SS_ANNE 0x087 #define FLAG_HIDE_FIVE_ISLAND_ROCKETS 0x088 #define FLAG_HIDE_MT_EMBER_EXTERIOR_ROCKETS 0x089 #define FLAG_HIDE_RUBY 0x08A #define FLAG_HIDE_ICEFALL_CAVE_LORELEI 0x08B #define FLAG_HIDE_LORELEI_IN_HER_HOUSE 0x08C #define FLAG_HIDE_ICEFALL_CAVE_ROCKETS 0x08D #define FLAG_HIDE_RUIN_VALLEY_SCIENTIST 0x08E #define FLAG_HIDE_SAPPHIRE 0x08F #define FLAG_HIDE_DOTTED_HOLE_SCIENTIST 0x090 #define FLAG_HIDE_THREE_ISLAND_LONE_BIKER 0x091 #define FLAG_HIDE_PEWTER_CITY_RUNNING_SHOES_GUY 0x092 #define FLAG_HIDE_LOST_CAVE_SELPHY 0x093 #define FLAG_HIDE_RESORT_GORGEOUS_SELPHY 0x094 #define FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY 0x095 #define FLAG_HIDE_SELPHYS_BUTLER 0x096 #define FLAG_HIDE_FOUR_ISLAND_RIVAL 0x097 #define FLAG_HIDE_SIX_ISLAND_POKECENTER_RIVAL 0x098 #define FLAG_HIDE_DEOXYS 0x099 #define FLAG_HIDE_BIRTH_ISLAND_METEORITE 0x09A #define FLAG_HIDE_LUGIA 0x09B #define FLAG_HIDE_HO_OH 0x09C #define FLAG_HIDE_POSTGAME_GOSSIPERS 0x09D #define FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS 0x09E #define FLAG_HIDE_FAME_CHECKER_KOGA_JOURNAL 0x09F #define FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL 0x0A0 #define FLAG_HIDE_VERMILION_CITY_OAKS_AIDE 0x0A1 #define FLAG_HIDE_CINNABAR_POKECENTER_BILL 0x0A2 #define FLAG_HIDE_CREDITS_RIVAL 0x0A3 #define FLAG_HIDE_CREDITS_OAK 0x0A4 #define FLAG_HIDE_LORELEI_HOUSE_MEOWTH_DOLL 0x0A5 #define FLAG_HIDE_LORELEI_HOUSE_CHANSEY_DOLL 0x0A6 #define FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_F_DOLL 0x0A7 #define FLAG_HIDE_LORELEI_HOUSE_JIGGLYPUFF_DOLL 0x0A8 #define FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_M_DOLL 0x0A9 #define FLAG_HIDE_LORELEIS_HOUSE_FEAROW_DOLL 0x0AA #define FLAG_HIDE_LORELEIS_HOUSE_PIDGEOT_DOLL 0x0AB #define FLAG_HIDE_LORELEIS_HOUSE_LAPRAS_DOLL 0x0AC #define FLAG_HIDE_MISC_KANTO_ROCKETS 0x0AD #define FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS 0x0AE // Cut Trees #define FLAG_VIRIDIAN_CITY_NORTH_CUT_TREE 0x0AF #define FLAG_VIRIDIAN_CITY_SOUTH_CUT_TREE 0x0B0 #define FLAG_ROUTE_2_CUT_TREE_1 0x0B1 #define FLAG_ROUTE_2_CUT_TREE_2 0x0B2 #define FLAG_ROUTE_2_CUT_TREE_3 0x0B3 #define FLAG_ROUTE_2_CUT_TREE_4 0x0B4 #define FLAG_PEWTER_CITY_CUT_TREE 0x0B5 #define FLAG_CERULEAN_CITY_CUT_TREE 0x0B6 #define FLAG_ROUTE_25_CUT_TREE 0x0B7 #define FLAG_VERMILION_CITY_CUT_TREE 0x0B8 #define FLAG_ROUTE_10_CUT_TREE_1 0x0B9 #define FLAG_ROUTE_10_CUT_TREE_2 0x0BA #define FLAG_ROUTE_10_CUT_TREE_3 0x0BB #define FLAG_ROUTE_10_CUT_TREE_4 0x0BC #define FLAG_ROUTE_8_CUT_TREE_1 0x0BD #define FLAG_ROUTE_8_CUT_TREE_2 0x0BE #define FLAG_CELADON_CITY_NORTH_CUT_TREE 0x0BF #define FLAG_CELADON_CITY_SOUTH_CUT_TREE 0x0C0 #define FLAG_ROUTE_16_CUT_TREE 0x0C1 #define FLAG_ROUTE_12_CUT_TREE_1 0x0C2 #define FLAG_ROUTE_12_CUT_TREE_2 0x0C3 #define FLAG_ROUTE_13_CUT_TREE 0x0C4 #define FLAG_ROUTE_14_CUT_TREE_1 0x0C5 #define FLAG_ROUTE_14_CUT_TREE_2 0x0C6 #define FLAG_ROUTE_14_CUT_TREE_3 0x0C7 #define FLAG_FUCHSIA_CITY_CUT_TREE_1 0x0C8 #define FLAG_FUCHSIA_CITY_CUT_TREE_2 0x0C9 #define FLAG_FUCHSIA_CITY_CUT_TREE_3 0x0CA #define FLAG_FUCHSIA_CITY_CUT_TREE_4 0x0CB #define FLAG_TWO_ISLAND_CUT_TREE 0x0CC #define FLAG_THREE_ISLAND_CUT_TREE 0x0CD #define FLAG_BOND_BRIDGE_CUT_TREE_1 0x0CE #define FLAG_BOND_BRIDGE_CUT_TREE_2 0x0CF #define FLAG_FIVE_ISLE_MEADOW_CUT_TREE_1 0x0D0 #define FLAG_FIVE_ISLE_MEADOW_CUT_TREE_2 0x0D1 #define FLAG_BERRY_FOREST_CUT_TREE_1 0x0D2 #define FLAG_BERRY_FOREST_CUT_TREE_2 0x0D3 #define FLAG_BERRY_FOREST_CUT_TREE_3 0x0D4 #define FLAG_BERRY_FOREST_CUT_TREE_4 0x0D5 #define FLAG_BERRY_FOREST_CUT_TREE_5 0x0D6 #define FLAG_BERRY_FOREST_CUT_TREE_6 0x0D7 #define FLAG_BERRY_FOREST_CUT_TREE_7 0x0D8 #define FLAG_BERRY_FOREST_CUT_TREE_8 0x0D9 #define FLAG_BERRY_FOREST_CUT_TREE_9 0x0DA #define FLAG_BERRY_FOREST_CUT_TREE_10 0x0DB #define FLAG_ROUTE_9_CUT_TREE 0x0DC //forgot this one #define FLAG_AUTO_RUN_TOGGLED 0x0DD #define FLAG_AUTO_RUN_EXPLAINED 0x0DE #define FLAG_DONT_ADD_TMS 0x0DF //Needed so the Teachy TV doesn't add TMs #define FLAG_CELADON_GYM_LEFT_CUT_TREE 0x0E0 //forgot these... #define FLAG_CELADON_GYM_BOTTOM_CUT_TREE 0x0E1 // ^ #define FLAG_CELADON_GYM_RIGHT_CUT_TREE 0x0E2 // ^ #define FLAG_BIKE_GEAR 0x0E3 // Swaps between FRLG bike speed and Mach Bike speed // Unused? #define FLAG_HIDE_NATIONAL_DEX_AIDE 0x0E4 #define FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO 0x0E5 #define FLAG_DEFEATED_SUDOWOODO 0x0E6 #define FLAG_CAUGHT_SUDOWOODO 0x0E7 #define FLAG_GIVEN_CORSOLA_EGG 0x0E8 #define FLAG_MASTER_TRAINER_BATTLE 0x0E9 #define FLAG_HIDE_MASTER_TRAINERS 0x0EA #define FLAG_0x0EB 0x0EB #define FLAG_0x0EC 0x0EC #define FLAG_0x0ED 0x0ED #define FLAG_0x0EE 0x0EE #define FLAG_0x0EF 0x0EF #define FLAG_0x0F0 0x0F0 #define FLAG_0x0F1 0x0F1 #define FLAG_0x0F2 0x0F2 #define FLAG_0x0F3 0x0F3 #define FLAG_0x0F4 0x0F4 #define FLAG_0x0F5 0x0F5 #define FLAG_0x0F6 0x0F6 #define FLAG_0x0F7 0x0F7 #define FLAG_0x0F8 0x0F8 #define FLAG_0x0F9 0x0F9 #define FLAG_0x0FA 0x0FA #define FLAG_0x0FB 0x0FB #define FLAG_0x0FC 0x0FC #define FLAG_0x0FD 0x0FD #define FLAG_0x0FE 0x0FE #define FLAG_0x0FF 0x0FF #define FLAG_0x100 0x100 #define FLAG_0x101 0x101 #define FLAG_0x102 0x102 #define FLAG_0x103 0x103 #define FLAG_0x104 0x104 #define FLAG_0x105 0x105 #define FLAG_0x106 0x106 #define FLAG_0x107 0x107 #define FLAG_0x108 0x108 #define FLAG_0x109 0x109 #define FLAG_0x10A 0x10A #define FLAG_0x10B 0x10B #define FLAG_0x10C 0x10C #define FLAG_0x10D 0x10D #define FLAG_0x10E 0x10E #define FLAG_0x10F 0x10F #define FLAG_0x110 0x110 #define FLAG_0x111 0x111 #define FLAG_0x112 0x112 #define FLAG_0x113 0x113 #define FLAG_0x114 0x114 #define FLAG_0x115 0x115 #define FLAG_0x116 0x116 #define FLAG_0x117 0x117 #define FLAG_0x118 0x118 #define FLAG_0x119 0x119 #define FLAG_0x11A 0x11A #define FLAG_0x11B 0x11B #define FLAG_0x11C 0x11C #define FLAG_0x11D 0x11D #define FLAG_0x11E 0x11E #define FLAG_0x11F 0x11F #define FLAG_0x120 0x120 #define FLAG_0x121 0x121 #define FLAG_0x122 0x122 #define FLAG_0x123 0x123 #define FLAG_0x124 0x124 #define FLAG_0x125 0x125 #define FLAG_0x126 0x126 #define FLAG_0x127 0x127 #define FLAG_0x128 0x128 #define FLAG_0x129 0x129 #define FLAG_0x12A 0x12A #define FLAG_0x12B 0x12B #define FLAG_0x12C 0x12C #define FLAG_0x12D 0x12D #define FLAG_0x12E 0x12E #define FLAG_0x12F 0x12F #define FLAG_0x130 0x130 #define FLAG_0x131 0x131 #define FLAG_0x132 0x132 #define FLAG_0x133 0x133 #define FLAG_0x134 0x134 #define FLAG_0x135 0x135 #define FLAG_0x136 0x136 #define FLAG_0x137 0x137 #define FLAG_0x138 0x138 #define FLAG_0x139 0x139 #define FLAG_0x13A 0x13A #define FLAG_0x13B 0x13B #define FLAG_0x13C 0x13C #define FLAG_0x13D 0x13D #define FLAG_0x13E 0x13E #define FLAG_0x13F 0x13F #define FLAG_0x140 0x140 #define FLAG_0x141 0x141 #define FLAG_0x142 0x142 #define FLAG_0x143 0x143 #define FLAG_0x144 0x144 #define FLAG_0x145 0x145 #define FLAG_0x146 0x146 #define FLAG_0x147 0x147 #define FLAG_0x148 0x148 #define FLAG_0x149 0x149 #define FLAG_0x14A 0x14A #define FLAG_0x14B 0x14B #define FLAG_0x14C 0x14C #define FLAG_0x14D 0x14D #define FLAG_0x14E 0x14E #define FLAG_0x14F 0x14F #define FLAG_0x150 0x150 #define FLAG_0x151 0x151 #define FLAG_0x152 0x152 #define FLAG_0x153 0x153 // Item ball hide/show #define FLAG_HIDE_ROUTE2_ETHER 0x154 #define FLAG_HIDE_ROUTE2_PARALYZE_HEAL 0x155 #define FLAG_HIDE_VIRIDIAN_FOREST_POKE_BALL 0x156 #define FLAG_HIDE_VIRIDIAN_FOREST_ANTIDOTE 0x157 #define FLAG_HIDE_VIRIDIAN_FOREST_POTION 0x158 #define FLAG_HIDE_MT_MOON_1F_PARALYZE_HEAL 0x159 #define FLAG_HIDE_MT_MOON_1F_TM09 0x15A #define FLAG_HIDE_MT_MOON_1F_POTION 0x15B #define FLAG_HIDE_MT_MOON_1F_RARE_CANDY 0x15C #define FLAG_HIDE_MT_MOON_1F_ESCAPE_ROPE 0x15D #define FLAG_HIDE_MT_MOON_1F_MOON_STONE 0x15E #define FLAG_HIDE_MT_MOON_B2F_STAR_PIECE 0x15F #define FLAG_HIDE_MT_MOON_B2F_TM46 0x160 #define FLAG_HIDE_ROUTE4_TM05 0x161 #define FLAG_HIDE_ROUTE24_TM45 0x162 #define FLAG_HIDE_ROUTE25_TM43 0x163 #define FLAG_HIDE_SSANNE_1F_ROOM2_TM31 0x164 #define FLAG_HIDE_SSANNE_2F_ROOM2_STARDUST 0x165 #define FLAG_HIDE_SSANNE_2F_ROOM4_X_ATTACK 0x166 #define FLAG_HIDE_SSANNE_B1F_ROOM2_TM44 0x167 #define FLAG_HIDE_SSANNE_B1F_ROOM3_ETHER 0x168 #define FLAG_HIDE_SSANNE_B1F_ROOM5_SUPER_POTION 0x169 #define FLAG_HIDE_SSANNE_KITCHEN_GREAT_BALL 0x16A #define FLAG_HIDE_ROUTE9_TM40 0x16B #define FLAG_HIDE_ROCKET_HIDEOUT_B1F_ESCAPE_ROPE 0x16C #define FLAG_HIDE_ROCKET_HIDEOUT_B1F_HYPER_POTION 0x16D #define FLAG_HIDE_ROCKET_HIDEOUT_B2F_X_SPEED 0x16E #define FLAG_HIDE_ROCKET_HIDEOUT_B2F_MOON_STONE 0x16F #define FLAG_HIDE_ROCKET_HIDEOUT_B2F_TM12 0x170 #define FLAG_HIDE_ROCKET_HIDEOUT_B2F_SUPER_POTION 0x171 #define FLAG_HIDE_ROCKET_HIDEOUT_B3F_RARE_CANDY 0x172 #define FLAG_HIDE_ROCKET_HIDEOUT_B3F_TM21 0x173 #define FLAG_HIDE_ROCKET_HIDEOUT_B4F_TM49 0x174 #define FLAG_HIDE_ROCKET_HIDEOUT_B4F_MAX_ETHER 0x175 #define FLAG_HIDE_ROCKET_HIDEOUT_B4F_CALCIUM 0x176 #define FLAG_HIDE_POKEMON_TOWER_3F_ESCAPE_ROPE 0x177 #define FLAG_HIDE_POKEMON_TOWER_4F_ELIXIR 0x178 #define FLAG_HIDE_POKEMON_TOWER_4F_AWAKENING 0x179 #define FLAG_HIDE_POKEMON_TOWER_4F_GREAT_BALL 0x17A #define FLAG_HIDE_POKEMON_TOWER_5F_NUGGET 0x17B #define FLAG_HIDE_POKEMON_TOWER_6F_RARE_CANDY 0x17C #define FLAG_HIDE_POKEMON_TOWER_6F_X_ACCURACY 0x17D #define FLAG_HIDE_ROUTE12_TM48 0x17E #define FLAG_HIDE_ROUTE12_IRON 0x17F #define FLAG_HIDE_ROUTE15_TM18 0x180 #define FLAG_HIDE_SAFARI_ZONE_CENTER_NUGGET 0x181 #define FLAG_HIDE_SAFARI_ZONE_EAST_MAX_POTION 0x182 #define FLAG_HIDE_SAFARI_ZONE_EAST_FULL_RESTORE 0x183 #define FLAG_HIDE_SAFARI_ZONE_EAST_TM11 0x184 #define FLAG_HIDE_SAFARI_ZONE_EAST_LEAF_STONE 0x185 #define FLAG_HIDE_SAFARI_ZONE_NORTH_PROTEIN 0x186 #define FLAG_HIDE_SAFARI_ZONE_NORTH_TM47 0x187 #define FLAG_HIDE_SAFARI_ZONE_WEST_TM32 0x188 #define FLAG_HIDE_SAFARI_ZONE_WEST_GOLD_TEETH 0x189 #define FLAG_HIDE_SAFARI_ZONE_WEST_MAX_POTION 0x18A #define FLAG_HIDE_SAFARI_ZONE_WEST_MAX_REVIVE 0x18B #define FLAG_HIDE_SILPH_CO_3F_HYPER_POTION 0x18C #define FLAG_HIDE_SILPH_CO_4F_MAX_REVIVE 0x18D #define FLAG_HIDE_SILPH_CO_4F_ESCAPE_ROPE 0x18E #define FLAG_HIDE_SILPH_CO_4F_FULL_HEAL 0x18F #define FLAG_HIDE_SILPH_CO_5F_PROTEIN 0x190 #define FLAG_HIDE_SILPH_CO_5F_TM01 0x191 #define FLAG_HIDE_SILPH_CO_5F_CARD_KEY 0x192 #define FLAG_HIDE_SILPH_CO_6F_HP_UP 0x193 #define FLAG_HIDE_SILPH_CO_6F_X_SPECIAL 0x194 #define FLAG_HIDE_SILPH_CO_7F_CALCIUM 0x195 #define FLAG_HIDE_SILPH_CO_7F_TM08 0x196 #define FLAG_HIDE_SILPH_CO_10F_CARBOS 0x197 #define FLAG_HIDE_SILPH_CO_10F_ULTRA_BALL 0x198 #define FLAG_HIDE_SILPH_CO_10F_RARE_CANDY 0x199 #define FLAG_HIDE_POWER_PLANT_MAX_POTION 0x19A #define FLAG_HIDE_POWER_PLANT_TM17 0x19B #define FLAG_HIDE_POWER_PLANT_TM25 0x19C #define FLAG_HIDE_POWER_PLANT_THUNDER_STONE 0x19D #define FLAG_HIDE_POWER_PLANT_ELIXIR 0x19E #define FLAG_HIDE_POKEMON_MANSION_1F_CARBOS 0x19F #define FLAG_HIDE_POKEMON_MANSION_1F_ESCAPE_ROPE 0x1A0 #define FLAG_HIDE_POKEMON_MANSION_2F_CALCIUM 0x1A1 #define FLAG_HIDE_POKEMON_MANSION_3F_MAX_POTION 0x1A2 #define FLAG_HIDE_POKEMON_MANSION_3F_IRON 0x1A3 #define FLAG_HIDE_POKEMON_MANSION_B1F_TM14 0x1A4 #define FLAG_HIDE_POKEMON_MANSION_B1F_FULL_RESTORE 0x1A5 #define FLAG_HIDE_SAFARI_ZONE_NORTHWEST_SUN_STONE 0x1A6 //New #define FLAG_HIDE_POKEMON_MANSION_B1F_TM22 0x1A7 #define FLAG_HIDE_POKEMON_MANSION_B1F_SECRET_KEY 0x1A8 #define FLAG_HIDE_VICTORY_ROAD_1F_RARE_CANDY 0x1A9 #define FLAG_HIDE_VICTORY_ROAD_1F_TM02 0x1AA #define FLAG_HIDE_VICTORY_ROAD_2F_GUARD_SPEC 0x1AB #define FLAG_HIDE_VICTORY_ROAD_2F_TM07 0x1AC #define FLAG_HIDE_VICTORY_ROAD_2F_FULL_HEAL 0x1AD #define FLAG_HIDE_VICTORY_ROAD_2F_TM37 0x1AE #define FLAG_HIDE_VICTORY_ROAD_3F_MAX_REVIVE 0x1AF #define FLAG_HIDE_VICTORY_ROAD_3F_TM50 0x1B0 #define FLAG_HIDE_CERULEAN_CAVE_1F_MAX_ELIXIR 0x1B1 #define FLAG_HIDE_CERULEAN_CAVE_1F_NUGGET 0x1B2 #define FLAG_HIDE_CERULEAN_CAVE_1F_FULL_RESTORE 0x1B3 #define FLAG_HIDE_CERULEAN_CAVE_2F_FULL_RESTORE 0x1B4 #define FLAG_HIDE_CERULEAN_CAVE_2F_PP_UP 0x1B5 #define FLAG_HIDE_CERULEAN_CAVE_2F_ULTRA_BALL 0x1B6 #define FLAG_HIDE_CERULEAN_CAVE_B1F_MAX_REVIVE 0x1B7 #define FLAG_HIDE_CERULEAN_CAVE_B1F_ULTRA_BALL 0x1B8 #define FLAG_HIDE_FUCHSIA_CITY_WARDENS_HOUSE_RARE_CANDY 0x1B9 #define FLAG_HIDE_TWO_ISLAND_REVIVE 0x1BA #define FLAG_HIDE_THREE_ISLAND_ZINC 0x1BB #define FLAG_HIDE_SAFARI_ZONE_NORTHWEST_RARE_CANDY 0x1BC //New #define FLAG_HIDE_SAFARI_ZONE_NORTHWEST_KINGS_ROCK 0x1BD //New #define FLAG_HIDE_VIRIDIAN_FOREST_POTION_2 0x1BE #define FLAG_HIDE_MT_MOON_B2F_REVIVE 0x1BF #define FLAG_HIDE_MT_MOON_B2F_ANTIDOTE 0x1C0 #define FLAG_HIDE_ROUTE11_X_DEFEND 0x1C1 #define FLAG_HIDE_ROUTE9_BURN_HEAL 0x1C2 #define FLAG_HIDE_ROCK_TUNNEL_1F_REPEL 0x1C3 #define FLAG_HIDE_ROCK_TUNNEL_1F_PEARL 0x1C4 #define FLAG_HIDE_ROCK_TUNNEL_1F_ESCAPE_ROPE 0x1C5 #define FLAG_HIDE_ROCK_TUNNEL_B1F_REVIVE 0x1C6 #define FLAG_HIDE_ROCK_TUNNEL_B1F_MAX_ETHER 0x1C7 #define FLAG_HIDE_SILPH_CO_8F_IRON 0x1C8 #define FLAG_HIDE_SILPH_CO_11F_ZINC 0x1C9 #define FLAG_HIDE_POKEMON_MANSION_1F_PROTEIN 0x1CA #define FLAG_HIDE_POKEMON_MANSION_2F_ZINC 0x1CB #define FLAG_HIDE_POKEMON_MANSION_2F_HP_UP 0x1CC #define FLAG_HIDE_VIRIDIAN_CITY_POTION 0x1CD #define FLAG_HIDE_ROUTE11_GREAT_BALL 0x1CE #define FLAG_HIDE_ROUTE11_AWAKENING 0x1CF #define FLAG_HIDE_POKEMON_TOWER_5F_CLEANSE_TAG 0x1D0 #define FLAG_HIDE_CELADON_CITY_ETHER 0x1D1 #define FLAG_HIDE_ROCKET_HIDEOUT_B3F_BLACK_GLASSES 0x1D2 #define FLAG_HIDE_SAFARI_ZONE_NORTH_QUICK_CLAW 0x1D3 #define FLAG_HIDE_SEAFOAM_ISLANDS_1F_ICE_HEAL 0x1D4 #define FLAG_HIDE_SEAFOAM_ISLANDS_B1F_WATER_STONE 0x1D5 #define FLAG_HIDE_SEAFOAM_ISLANDS_B1F_REVIVE 0x1D6 #define FLAG_HIDE_SEAFOAM_ISLANDS_B2F_BIG_PEARL 0x1D7 #define FLAG_HIDE_SEAFOAM_ISLANDS_B4F_ULTRA_BALL 0x1D8 #define FLAG_HIDE_FOUR_ISLAND_STAR_PIECE 0x1D9 #define FLAG_HIDE_FOUR_ISLAND_STARDUST 0x1DA #define FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_ETHER 0x1DB #define FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_MAX_REPEL 0x1DC #define FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_CARBOS 0x1DD #define FLAG_HIDE_FIVE_ISLAND_MEADOW_MAX_POTION 0x1DE #define FLAG_HIDE_FIVE_ISLAND_MEADOW_PP_UP 0x1DF #define FLAG_HIDE_FIVE_ISLAND_MEMORIAL_PILLAR_METAL_COAT 0x1E0 #define FLAG_HIDE_SIX_ISLAND_OUTCAST_ISLAND_PP_UP 0x1E1 #define FLAG_HIDE_SIX_ISLAND_WATER_PATH_ELIXIR 0x1E2 #define FLAG_HIDE_SIX_ISLAND_WATER_PATH_DRAGON_SCALE 0x1E3 #define FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_FULL_RESTORE 0x1E4 #define FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_HP_UP 0x1E5 #define FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_SUN_STONE 0x1E6 #define FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_KINGS_ROCK 0x1E7 #define FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_MAX_ELIXIR 0x1E8 #define FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_NUGGET 0x1E9 #define FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_MAX_ETHER 0x1EA #define FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_FULL_HEAL 0x1EB #define FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_MAX_ELIXIR 0x1EC #define FLAG_HIDE_MT_EMBER_EXTERIOR_ULTRA_BALL 0x1ED #define FLAG_HIDE_MT_EMBER_EXTERIOR_FIRE_STONE 0x1EE #define FLAG_HIDE_MT_EMBER_EXTERIOR_DIRE_HIT 0x1EF #define FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_ULTRA_BALL 0x1F0 #define FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_HM07 0x1F1 #define FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_B1F_FULL_RESTORE 0x1F2 #define FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_B1F_NEVER_MELT_ICE 0x1F3 #define FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_BIG_PEARL 0x1F4 #define FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_TM36 0x1F5 #define FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_PEARL 0x1F6 #define FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_UP_GRADE 0x1F7 #define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM10_SILK_SCARF 0x1F8 #define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM11_LAX_INCENSE 0x1F9 #define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM12_SEA_INCENSE 0x1FA #define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM13_MAX_REVIVE 0x1FB #define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM14_RARE_CANDY 0x1FC #define FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE_LUCKY_PUNCH 0x1FD #define FLAG_HIDE_SILPH_CO_4F_TM41 0x1FE #define FLAG_HIDE_SAFARI_ZONE_NORTHWEST_PP_MAX 0x1FF //New #define FLAG_HIDE_SAFARI_ZONE_NORTHEAST_MAX_REVIVE 0x200 //New #define FLAG_HIDE_SAFARI_ZONE_NORTHEAST_WHITE_HERB 0x201 //New #define FLAG_HIDE_SAFARI_ZONE_NORTHEAST_GLITTER_MAIL 0x202 //New #define FLAG_HIDE_ARTISAN_CAVE_B1F_HP_UP 0x203 //New #define FLAG_HIDE_ARTISAN_CAVE_B1F_CARBOS 0x204 //New #define FLAG_HIDE_CELADON_CITY_SUN_STONE 0x205 //New // Unused? #define FLAG_0x206 0x206 #define FLAG_0x207 0x207 #define FLAG_0x208 0x208 #define FLAG_0x209 0x209 #define FLAG_0x20A 0x20A #define FLAG_0x20B 0x20B #define FLAG_0x20C 0x20C #define FLAG_0x20D 0x20D #define FLAG_0x20E 0x20E #define FLAG_0x20F 0x20F #define FLAG_0x210 0x210 #define FLAG_0x211 0x211 #define FLAG_0x212 0x212 #define FLAG_0x213 0x213 #define FLAG_0x214 0x214 #define FLAG_0x215 0x215 #define FLAG_0x216 0x216 #define FLAG_0x217 0x217 #define FLAG_0x218 0x218 #define FLAG_0x219 0x219 #define FLAG_0x21A 0x21A #define FLAG_0x21B 0x21B #define FLAG_0x21C 0x21C #define FLAG_0x21D 0x21D #define FLAG_0x21E 0x21E #define FLAG_0x21F 0x21F #define FLAG_0x220 0x220 #define FLAG_0x221 0x221 #define FLAG_0x222 0x222 #define FLAG_0x223 0x223 #define FLAG_0x224 0x224 #define FLAG_0x225 0x225 #define FLAG_0x226 0x226 #define FLAG_0x227 0x227 #define FLAG_0x228 0x228 #define FLAG_0x229 0x229 #define FLAG_HIDE_LATI 0x22A #define FLAG_SHOWN_EON_TICKET 0x22B #define FLAG_DEFEATED_LATIAS 0x22C #define FLAG_DEFEATED_LATIOS 0x22D #define FLAG_CAUGHT_LATIAS 0x22E #define FLAG_CAUGHT_LATIOS 0x22F // Story flags #define STORY_FLAGS_START 0x230 #define FLAG_GOT_POTION_ON_ROUTE_1 0x230 #define FLAG_GOT_TM34_FROM_SURGE 0x231 #define FLAG_GOT_FOSSIL_FROM_MT_MOON 0x232 #define FLAG_HELPED_BILL_IN_SEA_COTTAGE 0x233 #define FLAG_GOT_SS_TICKET 0x234 #define FLAG_GOT_SS_TICKET_DUP 0x235 #define FLAG_GOT_TM42_AT_MEMORIAL_PILLAR 0x236 #define FLAG_GOT_HM01 0x237 #define FLAG_GOT_HM02 0x238 #define FLAG_GOT_HM03 0x239 #define FLAG_GOT_HM04 0x23A #define FLAG_GOT_HM05 0x23B #define FLAG_RESCUED_MR_FUJI 0x23C #define FLAG_GOT_POKE_FLUTE 0x23D #define FLAG_MET_DEVON_SPY 0x23E #define FLAG_GOT_TM28_FROM_ROCKET 0x23F #define FLAG_GOT_OLD_ROD 0x240 #define FLAG_GOT_BIKE_VOUCHER 0x241 #define FLAG_DID_NINO_TRADE 0x242 #define FLAG_GOT_COIN_CASE 0x243 #define FLAG_GOT_GOOD_ROD 0x244 #define FLAG_GOT_TM29_FROM_MR_PSYCHIC 0x245 #define FLAG_GOT_LAPRAS_FROM_SILPH 0x246 #define FLAG_GOT_POKEBALLS_FROM_OAK_AFTER_22_RIVAL 0x247 #define FLAG_DID_MIMIEN_TRADE 0x248 #define FLAG_BOUGHT_MAGIKARP 0x249 #define FLAG_DID_ZYNX_TRADE 0x24A #define FLAG_DID_MS_NIDO_TRADE 0x24B #define FLAG_DID_MR_NIDO_TRADE 0x24C #define FLAG_DID_CH_DING_TRADE 0x24D #define FLAG_GOT_TM38_FROM_BLAINE 0x24E #define FLAG_OAK_SKIP_22_RIVAL_CHECK 0x24F #define FLAG_GOT_MASTER_BALL_FROM_SILPH 0x250 #define FLAG_DID_NINA_TRADE 0x251 #define FLAG_GOT_ITEMFINDER 0x252 #define FLAG_WOKE_UP_ROUTE_12_SNORLAX 0x253 #define FLAG_GOT_TM39_FROM_BROCK 0x254 #define FLAG_GOT_SUPER_ROD 0x255 #define FLAG_GOT_EXP_SHARE_FROM_OAKS_AIDE 0x256 #define FLAG_DID_MARC_TRADE 0x257 #define FLAG_BEAT_RIVAL_IN_OAKS_LAB 0x258 #define FLAG_GOT_TM06_FROM_KOGA 0x259 #define FLAG_WOKE_UP_ROUTE_16_SNORLAX 0x25A //New #define FLAG_GOT_TM27 0x25B #define FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS 0x25C //New #define FLAG_ROUTE_16_SNORLAX_RETURNED_TO_MOUNTAINS 0x25D //New #define FLAG_GOT_OLD_AMBER 0x25E #define FLAG_MEWTWO_FLEW_AWAY 0x25F //New #define FLAG_ARTICUNO_FLEW_AWAY 0x260 //New #define FLAG_ZAPDOS_FLEW_AWAY 0x261 //New #define FLAG_MOLTRES_FLEW_AWAY 0x262 //New #define FLAG_GOT_EEVEE 0x263 #define FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES 0x264 #define FLAG_CINNABAR_GYM_QUIZ_1 0x265 #define FLAG_PENDING_DAYCARE_EGG 0x266 #define FLAG_CINNABAR_GYM_QUIZ_2 0x267 #define FLAG_CINNABAR_GYM_QUIZ_3 0x268 #define FLAG_CINNABAR_GYM_QUIZ_4 0x269 #define FLAG_CINNABAR_GYM_QUIZ_5 0x26A #define FLAG_CINNABAR_GYM_QUIZ_6 0x26B #define FLAG_POKEMON_MANSION_SWITCH_STATE 0x26C #define FLAG_OPENED_ROCKET_HIDEOUT 0x26D #define FLAG_GOT_10_COINS_FROM_GAMBLER 0x26E #define FLAG_GOT_20_COINS_FROM_GAMBLER 0x26F #define FLAG_GOT_20_COINS_FROM_GAMBLER_2 0x270 #define FLAG_GOT_BICYCLE 0x271 #define FLAG_GOT_DOME_FOSSIL 0x272 #define FLAG_GOT_HELIX_FOSSIL 0x273 #define FLAG_DID_ESPHERE_TRADE 0x274 #define FLAG_DID_TANGENY_TRADE 0x275 #define FLAG_DID_SEELOR_TRADE 0x276 #define FLAG_MT_EMBER_BOULDER_SHORTCUTS 0x277 #define FLAG_GOT_HITMON_FROM_DOJO 0x278 #define FLAG_SHOWN_COPPER_CARD_TO_NURSE 0x279 #define FLAG_SILPH_2F_DOOR_1 0x27A #define FLAG_SILPH_2F_DOOR_2 0x27B #define FLAG_SILPH_3F_DOOR_1 0x27C #define FLAG_SILPH_3F_DOOR_2 0x27D #define FLAG_SILPH_4F_DOOR_1 0x27E #define FLAG_SILPH_4F_DOOR_2 0x27F #define FLAG_SILPH_5F_DOOR_1 0x280 #define FLAG_SILPH_5F_DOOR_2 0x281 #define FLAG_SILPH_5F_DOOR_3 0x282 #define FLAG_SILPH_6F_DOOR 0x283 #define FLAG_SILPH_7F_DOOR_1 0x284 #define FLAG_SILPH_7F_DOOR_2 0x285 #define FLAG_SILPH_7F_DOOR_3 0x286 #define FLAG_SILPH_8F_DOOR 0x287 #define FLAG_SILPH_9F_DOOR_1 0x288 #define FLAG_SILPH_9F_DOOR_2 0x289 #define FLAG_SILPH_9F_DOOR_3 0x28A #define FLAG_SILPH_9F_DOOR_4 0x28B #define FLAG_SILPH_10F_DOOR 0x28C #define FLAG_SILPH_11F_DOOR 0x28D #define FLAG_GOT_DAISY_STARTER 0x28E #define FLAG_SHOWN_OLD_SEA_MAP 0x28F #define FLAG_MET_STICKER_MAN 0x290 #define FLAG_PALLET_LADY_NOT_BLOCKING_SIGN 0x291 #define FLAG_GOT_VS_SEEKER 0x292 #define FLAG_GOT_TM19_FROM_ERIKA 0x293 #define FLAG_GOT_TM33_FROM_THIRSTY_GIRL 0x294 #define FLAG_GOT_TM20_FROM_THIRSTY_GIRL 0x295 #define FLAG_GOT_TM16_FROM_THIRSTY_GIRL 0x296 #define FLAG_GOT_TM03_FROM_MISTY 0x297 #define FLAG_GOT_TM26_FROM_GIOVANNI 0x298 #define FLAG_GOT_RIVAL_STARTER_EGG 0x299 #define FLAG_GOT_TM04_FROM_SABRINA 0x29A #define FLAG_GOT_FAME_CHECKER 0x29B #define FLAG_GOT_RECORD_SETTING_MAGIKARP 0x29C #define FLAG_TWO_ISLAND_SHOP_INTRODUCED 0x29D #define FLAG_TWO_ISLAND_SHOP_EXPANDED_1 0x29E #define FLAG_TWO_ISLAND_SHOP_EXPANDED_2 0x29F #define FLAG_TWO_ISLAND_SHOP_EXPANDED_3 0x2A0 #define FLAG_SEVII_DETOUR_FINISHED 0x2A1 #define FLAG_VISITED_TWO_ISLAND 0x2A2 #define FLAG_RESCUED_LOSTELLE 0x2A3 #define FLAG_FOUGHT_MEW 0x2A4 #define FLAG_CAN_USE_ROCKET_HIDEOUT_LIFT 0x2A5 #define FLAG_GOT_TEA 0x2A6 #define FLAG_RECEIVED_AURORA_TICKET 0x2A7 #define FLAG_RECEIVED_MYSTIC_TICKET 0x2A8 #define FLAG_RECEIVED_OLD_SEA_MAP 0x2A9 #define FLAG_WONDER_CARD_UNUSED_1 0x2AA #define FLAG_WONDER_CARD_UNUSED_2 0x2AB #define FLAG_WONDER_CARD_UNUSED_3 0x2AC #define FLAG_WONDER_CARD_UNUSED_4 0x2AD #define FLAG_WONDER_CARD_UNUSED_5 0x2AE #define FLAG_WONDER_CARD_UNUSED_6 0x2AF #define FLAG_WONDER_CARD_UNUSED_7 0x2B0 #define FLAG_WONDER_CARD_UNUSED_8 0x2B1 #define FLAG_WONDER_CARD_UNUSED_9 0x2B2 #define FLAG_WONDER_CARD_UNUSED_10 0x2B3 #define FLAG_WONDER_CARD_UNUSED_11 0x2B4 #define FLAG_WONDER_CARD_UNUSED_12 0x2B5 #define FLAG_WONDER_CARD_UNUSED_13 0x2B6 #define FLAG_WONDER_CARD_UNUSED_14 0x2B7 #define FLAG_WONDER_CARD_UNUSED_15 0x2B8 #define FLAG_WONDER_CARD_UNUSED_16 0x2B9 #define FLAG_WONDER_CARD_UNUSED_17 0x2BA #define NUM_WONDER_CARD_FLAGS (1 + FLAG_WONDER_CARD_UNUSED_17 - FLAG_RECEIVED_AURORA_TICKET) #define FLAG_GOT_POWDER_JAR 0x2BB #define FLAG_FOUGHT_MEWTWO 0x2BC #define FLAG_FOUGHT_MOLTRES 0x2BD #define FLAG_FOUGHT_ARTICUNO 0x2BE #define FLAG_FOUGHT_ZAPDOS 0x2BF #define FLAG_TUTOR_DOUBLE_EDGE 0x2C0 #define FLAG_TUTOR_THUNDER_WAVE 0x2C1 #define FLAG_TUTOR_ROCK_SLIDE 0x2C2 #define FLAG_TUTOR_EXPLOSION 0x2C3 #define FLAG_TUTOR_MEGA_PUNCH 0x2C4 #define FLAG_TUTOR_MEGA_KICK 0x2C5 #define FLAG_TUTOR_DREAM_EATER 0x2C6 #define FLAG_TUTOR_SOFT_BOILED 0x2C7 #define FLAG_TUTOR_SUBSTITUTE 0x2C8 #define FLAG_TUTOR_SWORDS_DANCE 0x2C9 #define FLAG_TUTOR_SEISMIC_TOSS 0x2CA #define FLAG_TUTOR_COUNTER 0x2CB #define FLAG_TUTOR_METRONOME 0x2CC #define FLAG_TUTOR_MIMIC 0x2CD #define FLAG_TUTOR_BODY_SLAM 0x2CE #define FLAG_VISITED_OAKS_LAB 0x2CF #define FLAG_FOUGHT_POWER_PLANT_ELECTRODE_1 0x2D0 #define FLAG_FOUGHT_POWER_PLANT_ELECTRODE_2 0x2D1 #define FLAG_STOPPED_SEAFOAM_B3F_CURRENT 0x2D2 #define FLAG_STOPPED_SEAFOAM_B4F_CURRENT 0x2D3 #define FLAG_TALKED_TO_LORELEI_AFTER_WAREHOUSE 0x2D4 #define FLAG_DEFEATED_ROCKETS_IN_WAREHOUSE 0x2D5 #define FLAG_UNLOCKED_ROCKET_WAREHOUSE 0x2D6 #define FLAG_NO_ROOM_FOR_TM42_AT_MEMORIAL_PILLAR 0x2D7 #define FLAG_LEARNED_YES_NAH_CHANSEY 0x2D8 #define FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1 0x2D9 #define FLAG_GOT_TOGEPI_EGG 0x2DA #define FLAG_NO_ROOM_FOR_TOGEPI_EGG 0x2DB #define FLAG_RECOVERED_SAPPHIRE 0x2DC #define FLAG_GOT_RUBY 0x2DD #define FLAG_TUTOR_FRENZY_PLANT 0x2DE #define FLAG_TUTOR_BLAST_BURN 0x2DF #define FLAG_TUTOR_HYDRO_CANNON 0x2E0 #define FLAG_LEARNED_ALL_MOVES_AT_CAPE_BRINK 0x2E1 #define FLAG_GOT_NUGGET_FROM_DUNSPARCE_TUNNEL 0x2E2 #define FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE 0x2E3 #define FLAG_FOUGHT_DEOXYS 0x2E4 #define FLAG_DEFEATED_MEW 0x2E5 #define FLAG_MEW_FLEW_AWAY 0x2E6 #define FLAG_HIDE_MEW 0x2E7 #define FLAG_CAUGHT_MEW 0x2E8 #define FLAG_CAUGHT_RAIKOU 0x2E9 #define FLAG_CAUGHT_ENTEI 0x2EA #define FLAG_CAUGHT_SUICUNE 0x2EB #define FLAG_REVIVED_DOME 0x2EC #define FLAG_REVIVED_HELIX 0x2ED #define FLAG_REVIVED_AMBER 0x2EE #define FLAG_GOT_HM06 0x2EF #define FLAG_SHOWN_MYSTIC_TICKET 0x2F0 #define FLAG_SHOWN_AURORA_TICKET 0x2F1 #define FLAG_FOUGHT_LUGIA 0x2F2 #define FLAG_FOUGHT_HO_OH 0x2F3 #define FLAG_OAK_SAW_DEX_COMPLETION 0x2F4 #define FLAG_LUGIA_FLEW_AWAY 0x2F5 #define FLAG_HO_OH_FLEW_AWAY 0x2F6 #define FLAG_DEOXYS_FLEW_AWAY 0x2F7 #define FLAG_TALKED_TO_TEA_LADY_AFTER_HOF 0x2F8 #define FLAG_TALKED_TO_OAKS_AIDE_IN_VERMILION 0x2F9 #define FLAG_GOT_EVERSTONE_FROM_OAKS_AIDE 0x2FA #define FLAG_GOT_MOON_STONE_FROM_JOYFUL_GAME_CORNER 0x2FB #define FLAG_GOT_FULL_RESTORE_FROM_THREE_ISLAND_DEFENDER 0x2FC #define FLAG_GOT_AMULET_COIN_FROM_OAKS_AIDE 0x2FD #define FLAG_NO_ROOM_FOR_JOYFUL_GAME_CORNER_MOON_STONE 0x2FE #define FLAG_OAKS_RATING_IS_VIA_PC 0x2FF // Nuzlocke Flags #define NUZLOCKE_FLAGS_START 0x300 #define FLAG_NUZLOCKE_PALLET 0x300 #define FLAG_NUZLOCKE_VIRIDIAN 0x301 #define FLAG_NUZLOCKE_CERULEAN 0x302 #define FLAG_NUZLOCKE_VERMILION 0x303 #define FLAG_NUZLOCKE_CELADON 0x304 #define FLAG_NUZLOCKE_FUCHSIA 0x305 #define FLAG_NUZLOCKE_CINNABAR 0x306 #define FLAG_NUZLOCKE_R1 0x307 #define FLAG_NUZLOCKE_R2 0x308 #define FLAG_NUZLOCKE_R3 0x309 #define FLAG_NUZLOCKE_R4 0x30A #define FLAG_NUZLOCKE_R5 0x30B #define FLAG_NUZLOCKE_R6 0x30C #define FLAG_NUZLOCKE_R7 0x30D #define FLAG_NUZLOCKE_R8 0x30E #define FLAG_NUZLOCKE_R9 0x30F #define FLAG_NUZLOCKE_R10 0x310 #define FLAG_NUZLOCKE_R11 0x311 #define FLAG_NUZLOCKE_R12 0x312 #define FLAG_NUZLOCKE_R13 0x313 #define FLAG_NUZLOCKE_R14 0x314 #define FLAG_NUZLOCKE_R15 0x315 #define FLAG_NUZLOCKE_R16 0x316 #define FLAG_NUZLOCKE_R17 0x317 #define FLAG_NUZLOCKE_R18 0x318 #define FLAG_NUZLOCKE_R19 0x319 #define FLAG_NUZLOCKE_R20 0x31A #define FLAG_NUZLOCKE_R21 0x31B #define FLAG_NUZLOCKE_R22 0x31C #define FLAG_NUZLOCKE_R23 0x31D #define FLAG_NUZLOCKE_R24 0x31E #define FLAG_NUZLOCKE_R25 0x31F #define FLAG_NUZLOCKE_VIRIDIAN_FOREST 0x320 #define FLAG_NUZLOCKE_MT_MOON 0x321 #define FLAG_NUZLOCKE_SS_ANNE 0x322 #define FLAG_NUZLOCKE_DIGLETTS_CAVE 0x323 #define FLAG_NUZLOCKE_VICTORY_ROAD 0x324 #define FLAG_NUZLOCKE_POKEMON_MANSION 0x325 #define FLAG_NUZLOCKE_SAFARI_CENTER 0x326 #define FLAG_NUZLOCKE_ROCK_TUNNEL 0x327 #define FLAG_NUZLOCKE_SEAFOAM_ISLANDS 0x328 #define FLAG_NUZLOCKE_POKEMON_TOWER 0x329 #define FLAG_NUZLOCKE_CERULEAN_CAVE 0x32A #define FLAG_NUZLOCKE_POWER_PLANT 0x32B #define FLAG_NUZLOCKE_ONE_ISLAND 0x32C #define FLAG_NUZLOCKE_FOUR_ISLAND 0x32D #define FLAG_NUZLOCKE_FIVE_ISLAND 0x32E #define FLAG_NUZLOCKE_KINDLE_ROAD 0x32F #define FLAG_NUZLOCKE_TREASURE_BEACH 0x330 #define FLAG_NUZLOCKE_CAPE_BRINK 0x331 #define FLAG_NUZLOCKE_BOND_BRIDGE 0x332 #define FLAG_NUZLOCKE_THREE_ISLE_PORT 0x333 #define FLAG_NUZLOCKE_RESORT_GORGEOUS 0x334 #define FLAG_NUZLOCKE_WATER_LABYRINTH 0x335 #define FLAG_NUZLOCKE_FIVE_ISLE_MEADOW 0x336 #define FLAG_NUZLOCKE_MEMORIAL_PILLAR 0x337 #define FLAG_NUZLOCKE_OUTCAST_ISLAND 0x338 #define FLAG_NUZLOCKE_GREEN_PATH 0x339 #define FLAG_NUZLOCKE_WATER_PATH 0x33A #define FLAG_NUZLOCKE_RUIN_VALLEY 0x33B #define FLAG_NUZLOCKE_TRAINER_TOWER 0x33C #define FLAG_NUZLOCKE_CANYON_ENTRANCE 0x33D #define FLAG_NUZLOCKE_SEVAULT_CANYON 0x33E #define FLAG_NUZLOCKE_TANOBY_RUINS 0x33F #define FLAG_NUZLOCKE_NAVEL_ROCK 0x340 #define FLAG_NUZLOCKE_MT_EMBER 0x341 #define FLAG_NUZLOCKE_BERRY_FOREST 0x342 #define FLAG_NUZLOCKE_ICEFALL_CAVE 0x343 #define FLAG_NUZLOCKE_LOST_CAVE 0x344 #define FLAG_NUZLOCKE_PATTERN_BUSH 0x345 #define FLAG_NUZLOCKE_ALTERING_CAVE 0x346 #define FLAG_NUZLOCKE_MONEAN_CHAMBER 0x347 #define FLAG_NUZLOCKE_LIPTOO_CHAMBER 0x348 #define FLAG_NUZLOCKE_WEEPTH_CHAMBER 0x349 #define FLAG_NUZLOCKE_DILFORD_CHAMBER 0x34A #define FLAG_NUZLOCKE_SCUFIB_CHAMBER 0x34B #define FLAG_NUZLOCKE_RIXY_CHAMBER 0x34C #define FLAG_NUZLOCKE_VIAPOIS_CHAMBER 0x34D #define FLAG_NUZLOCKE_SAFARI_EAST 0x34E #define FLAG_NUZLOCKE_SAFARI_NORTH 0x34F #define FLAG_NUZLOCKE_SAFARI_WEST 0x350 #define FLAG_NUZLOCKE_SAFARI_NORTH_WEST 0x351 #define FLAG_NUZLOCKE_SAFARI_NORTH_EAST 0x352 #define FLAG_NUZLOCKE_ARTISAN_CAVE 0x353 #define FLAG_NUZLOCKE_SOUTHERN_ISLAND 0x354 #define FLAG_NUZLOCKE_BATTLE_FRONTIER 0x355 // Unused? #define FLAG_0x356 0x356 #define FLAG_0x357 0x357 #define FLAG_0x358 0x358 #define FLAG_0x359 0x359 #define FLAG_TOLD_SAFARI_EXPANSION 0x35A #define FLAG_FOUR_ISLAND_SNOW 0x35B // Unused? #define FLAG_0x35C 0x35C #define FLAG_0x35D 0x35D #define FLAG_0x35E 0x35E #define FLAG_0x35F 0x35F #define FLAG_0x360 0x360 #define FLAG_0x361 0x361 #define FLAG_0x362 0x362 #define FLAG_0x363 0x363 #define FLAG_0x364 0x364 #define FLAG_0x365 0x365 #define FLAG_0x366 0x366 #define FLAG_0x367 0x367 #define FLAG_0x368 0x368 #define FLAG_0x369 0x369 #define FLAG_0x36A 0x36A #define FLAG_0x36B 0x36B #define FLAG_0x36C 0x36C #define FLAG_0x36D 0x36D #define FLAG_0x36E 0x36E #define FLAG_0x36F 0x36F #define FLAG_0x370 0x370 #define FLAG_0x371 0x371 #define FLAG_0x372 0x372 #define FLAG_0x373 0x373 #define FLAG_0x374 0x374 #define FLAG_0x375 0x375 #define FLAG_0x376 0x376 #define FLAG_0x377 0x377 #define FLAG_0x378 0x378 #define FLAG_0x379 0x379 #define FLAG_0x37A 0x37A #define FLAG_0x37B 0x37B #define FLAG_0x37C 0x37C #define FLAG_0x37D 0x37D #define FLAG_0x37E 0x37E #define FLAG_0x37F 0x37F #define FLAG_0x380 0x380 #define FLAG_0x381 0x381 #define FLAG_0x382 0x382 #define FLAG_0x383 0x383 #define FLAG_0x384 0x384 #define FLAG_0x385 0x385 #define FLAG_0x386 0x386 #define FLAG_0x387 0x387 #define FLAG_0x388 0x388 #define FLAG_0x389 0x389 #define FLAG_0x38A 0x38A #define FLAG_0x38B 0x38B #define FLAG_0x38C 0x38C #define FLAG_0x38D 0x38D #define FLAG_0x38E 0x38E #define FLAG_0x38F 0x38F #define FLAG_0x390 0x390 #define FLAG_0x391 0x391 #define FLAG_0x392 0x392 #define FLAG_0x393 0x393 #define FLAG_0x394 0x394 #define FLAG_0x395 0x395 #define FLAG_0x396 0x396 #define FLAG_0x397 0x397 #define FLAG_0x398 0x398 #define FLAG_0x399 0x399 #define FLAG_0x39A 0x39A #define FLAG_0x39B 0x39B #define FLAG_0x39C 0x39C #define FLAG_0x39D 0x39D #define FLAG_0x39E 0x39E #define FLAG_0x39F 0x39F #define FLAG_0x3A0 0x3A0 #define FLAG_0x3A1 0x3A1 #define FLAG_0x3A2 0x3A2 #define FLAG_0x3A3 0x3A3 #define FLAG_0x3A4 0x3A4 #define FLAG_0x3A5 0x3A5 #define FLAG_0x3A6 0x3A6 #define FLAG_0x3A7 0x3A7 #define FLAG_0x3A8 0x3A8 #define FLAG_0x3A9 0x3A9 #define FLAG_0x3AA 0x3AA #define FLAG_0x3AB 0x3AB #define FLAG_0x3AC 0x3AC #define FLAG_0x3AD 0x3AD #define FLAG_0x3AE 0x3AE #define FLAG_0x3AF 0x3AF #define FLAG_0x3B0 0x3B0 #define FLAG_0x3B1 0x3B1 #define FLAG_0x3B2 0x3B2 #define FLAG_0x3B3 0x3B3 #define FLAG_0x3B4 0x3B4 #define FLAG_0x3B5 0x3B5 #define FLAG_0x3B6 0x3B6 #define FLAG_0x3B7 0x3B7 #define FLAG_0x3B8 0x3B8 #define FLAG_0x3B9 0x3B9 #define FLAG_0x3BA 0x3BA #define FLAG_0x3BB 0x3BB #define FLAG_0x3BC 0x3BC #define FLAG_0x3BD 0x3BD #define FLAG_0x3BE 0x3BE #define FLAG_0x3BF 0x3BF #define FLAG_0x3C0 0x3C0 #define FLAG_0x3C1 0x3C1 #define FLAG_0x3C2 0x3C2 #define FLAG_0x3C3 0x3C3 #define FLAG_0x3C4 0x3C4 #define FLAG_0x3C5 0x3C5 #define FLAG_0x3C6 0x3C6 #define FLAG_0x3C7 0x3C7 #define FLAG_0x3C8 0x3C8 #define FLAG_0x3C9 0x3C9 #define FLAG_0x3CA 0x3CA #define FLAG_0x3CB 0x3CB #define FLAG_0x3CC 0x3CC #define FLAG_0x3CD 0x3CD #define FLAG_0x3CE 0x3CE #define FLAG_0x3CF 0x3CF //New move tutors #define FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER 0x3D0 #define FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT 0x3D1 #define FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH 0x3D2 #define FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK 0x3D3 #define FLAG_MOVE_TUTOR_TAUGHT_NIGHTMARE 0x3D4 #define FLAG_MOVE_TUTOR_TAUGHT_SELFDESTRUCT 0x3D5 #define FLAG_MOVE_TUTOR_TAUGHT_SKY_ATTACK 0x3D6 #define FLAG_MOVE_TUTOR_TAUGHT_SWAGGER 0x3D7 #define FLAG_MYSTERY_GIFT_DONE 0x3D8 #define FLAG_MYSTERY_GIFT_1 0x3D9 #define FLAG_MYSTERY_GIFT_2 0x3DA #define FLAG_MYSTERY_GIFT_3 0x3DB #define FLAG_MYSTERY_GIFT_4 0x3DC #define FLAG_MYSTERY_GIFT_5 0x3DD #define FLAG_MYSTERY_GIFT_6 0x3DE #define FLAG_MYSTERY_GIFT_7 0x3DF #define FLAG_MYSTERY_GIFT_8 0x3E0 #define FLAG_MYSTERY_GIFT_9 0x3E1 #define FLAG_MYSTERY_GIFT_10 0x3E2 #define FLAG_MYSTERY_GIFT_11 0x3E3 #define FLAG_MYSTERY_GIFT_12 0x3E4 #define FLAG_MYSTERY_GIFT_13 0x3E5 #define FLAG_MYSTERY_GIFT_14 0x3E6 #define FLAG_MYSTERY_GIFT_15 0x3E7 #define FLAG_HIDDEN_ITEMS_START 1000 // 0x3E8 #define FLAG_HIDDEN_ITEM_VIRIDIAN_FOREST_POTION (FLAG_HIDDEN_ITEMS_START + 0) #define FLAG_HIDDEN_ITEM_VIRIDIAN_FOREST_ANTIDOTE (FLAG_HIDDEN_ITEMS_START + 1) #define FLAG_HIDDEN_ITEM_MT_MOON_B2F_MOON_STONE (FLAG_HIDDEN_ITEMS_START + 2) #define FLAG_HIDDEN_ITEM_MT_MOON_B2F_ETHER (FLAG_HIDDEN_ITEMS_START + 3) #define FLAG_HIDDEN_ITEM_ROUTE25_ELIXIR (FLAG_HIDDEN_ITEMS_START + 4) #define FLAG_HIDDEN_ITEM_ROUTE25_ETHER (FLAG_HIDDEN_ITEMS_START + 5) #define FLAG_HIDDEN_ITEM_ROUTE9_ETHER (FLAG_HIDDEN_ITEMS_START + 6) #define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_SHELL_BELL (FLAG_HIDDEN_ITEMS_START + 7) // New #define FLAG_HIDDEN_ITEM_SSANNE_B1F_CORRIDOR_HYPER_POTION (FLAG_HIDDEN_ITEMS_START + 8) #define FLAG_HIDDEN_ITEM_ROUTE10_SUPER_POTION (FLAG_HIDDEN_ITEMS_START + 9) #define FLAG_HIDDEN_ITEM_ROUTE10_MAX_ETHER (FLAG_HIDDEN_ITEMS_START + 10) #define FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B1F_PP_UP (FLAG_HIDDEN_ITEMS_START + 11) #define FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B3F_NUGGET (FLAG_HIDDEN_ITEMS_START + 12) #define FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B4F_NEST_BALL (FLAG_HIDDEN_ITEMS_START + 13) #define FLAG_HIDDEN_ITEM_POKEMON_TOWER_5F_BIG_MUSHROOM (FLAG_HIDDEN_ITEMS_START + 14) #define FLAG_HIDDEN_ITEM_ROUTE13_PP_UP (FLAG_HIDDEN_ITEMS_START + 15) #define FLAG_HIDDEN_ITEM_ROUTE20_UNDERWATER_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 16) // New #define FLAG_HIDDEN_ITEM_ROUTE17_RARE_CANDY (FLAG_HIDDEN_ITEMS_START + 17) #define FLAG_HIDDEN_ITEM_ROUTE17_FULL_RESTORE (FLAG_HIDDEN_ITEMS_START + 18) #define FLAG_HIDDEN_ITEM_ROUTE17_PP_UP (FLAG_HIDDEN_ITEMS_START + 19) #define FLAG_HIDDEN_ITEM_ROUTE17_MAX_REVIVE (FLAG_HIDDEN_ITEMS_START + 20) #define FLAG_HIDDEN_ITEM_ROUTE17_MAX_ELIXIR (FLAG_HIDDEN_ITEMS_START + 21) #define FLAG_HIDDEN_ITEM_SAFARI_ZONE_CENTER_LEAF_STONE (FLAG_HIDDEN_ITEMS_START + 22) #define FLAG_HIDDEN_ITEM_SAFARI_ZONE_WEST_REVIVE (FLAG_HIDDEN_ITEMS_START + 23) #define FLAG_HIDDEN_ITEM_SILPH_CO_5F_ELIXIR (FLAG_HIDDEN_ITEMS_START + 24) #define FLAG_HIDDEN_ITEM_SILPH_CO_9F_MAX_POTION (FLAG_HIDDEN_ITEMS_START + 25) #define FLAG_HIDDEN_ITEM_SAFFRON_CITY_COPYCATS_HOUSE_2F_NUGGET (FLAG_HIDDEN_ITEMS_START + 26) #define FLAG_HIDDEN_ITEM_POWER_PLANT_MAX_ELIXIR (FLAG_HIDDEN_ITEMS_START + 27) #define FLAG_HIDDEN_ITEM_POWER_PLANT_THUNDER_STONE (FLAG_HIDDEN_ITEMS_START + 28) #define FLAG_HIDDEN_ITEM_SEAFOAM_ISLANDS_B3F_NUGGET (FLAG_HIDDEN_ITEMS_START + 29) #define FLAG_HIDDEN_ITEM_SEAFOAM_ISLANDS_B4F_WATER_STONE (FLAG_HIDDEN_ITEMS_START + 30) #define FLAG_HIDDEN_ITEM_POKEMON_MANSION_1F_MOON_STONE (FLAG_HIDDEN_ITEMS_START + 31) #define FLAG_HIDDEN_ITEM_POKEMON_MANSION_3F_RARE_CANDY (FLAG_HIDDEN_ITEMS_START + 32) #define FLAG_HIDDEN_ITEM_POKEMON_MANSION_B1F_ELIXIR (FLAG_HIDDEN_ITEMS_START + 33) #define FLAG_HIDDEN_ITEM_ROUTE23_FULL_RESTORE (FLAG_HIDDEN_ITEMS_START + 34) #define FLAG_HIDDEN_ITEM_ROUTE23_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 35) #define FLAG_HIDDEN_ITEM_ROUTE23_MAX_ETHER (FLAG_HIDDEN_ITEMS_START + 36) #define FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 37) #define FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_FULL_RESTORE (FLAG_HIDDEN_ITEMS_START + 38) #define FLAG_HIDDEN_ITEM_CERULEAN_CAVE_1F_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 39) #define FLAG_HIDDEN_ITEM_ROUTE11_TAMATO_BERRY (FLAG_HIDDEN_ITEMS_START + 40) // New #define FLAG_HIDDEN_ITEM_ROUTE11_ESCAPE_ROPE (FLAG_HIDDEN_ITEMS_START + 41) #define FLAG_HIDDEN_ITEM_ROUTE12_HYPER_POTION (FLAG_HIDDEN_ITEMS_START + 42) #define FLAG_HIDDEN_ITEM_CAPE_BRINK_GREPA_BERRY (FLAG_HIDDEN_ITEMS_START + 43) // New #define FLAG_HIDDEN_ITEM_THREE_ISLAND_PORT_TAMATO_BERRY (FLAG_HIDDEN_ITEMS_START + 44) // New #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_SITRUS_BERRY (FLAG_HIDDEN_ITEMS_START + 45) // New #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY (FLAG_HIDDEN_ITEMS_START + 46) // New #define FLAG_HIDDEN_ITEM_CELADON_CITY_PP_UP (FLAG_HIDDEN_ITEMS_START + 47) #define FLAG_HIDDEN_ITEM_VERMILION_CITY_MAX_ETHER (FLAG_HIDDEN_ITEMS_START + 48) #define FLAG_HIDDEN_ITEM_CERULEAN_CITY_RARE_CANDY (FLAG_HIDDEN_ITEMS_START + 49) #define FLAG_HIDDEN_ITEM_ROUTE4_GREAT_BALL (FLAG_HIDDEN_ITEMS_START + 50) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS (FLAG_HIDDEN_ITEMS_START + 51) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_2 (FLAG_HIDDEN_ITEMS_START + 52) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_3 (FLAG_HIDDEN_ITEMS_START + 53) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_4 (FLAG_HIDDEN_ITEMS_START + 54) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_5 (FLAG_HIDDEN_ITEMS_START + 55) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_6 (FLAG_HIDDEN_ITEMS_START + 56) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_7 (FLAG_HIDDEN_ITEMS_START + 57) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_8 (FLAG_HIDDEN_ITEMS_START + 58) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_9 (FLAG_HIDDEN_ITEMS_START + 59) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_10 (FLAG_HIDDEN_ITEMS_START + 60) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_11 (FLAG_HIDDEN_ITEMS_START + 61) #define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_12 (FLAG_HIDDEN_ITEMS_START + 62) #define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_SEVAULT_CANYON_CHERI_BERRY (FLAG_HIDDEN_ITEMS_START + 63) #define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_4 (FLAG_HIDDEN_ITEMS_START + 64) #define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 65) #define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_2 (FLAG_HIDDEN_ITEMS_START + 66) #define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_3 (FLAG_HIDDEN_ITEMS_START + 67) #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_ROCKET_WAREHOUSE_NEST_BALL (FLAG_HIDDEN_ITEMS_START + 68) #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_ROCKET_WAREHOUSE_NET_BALL (FLAG_HIDDEN_ITEMS_START + 69) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_POTION (FLAG_HIDDEN_ITEMS_START + 70) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ANTIDOTE (FLAG_HIDDEN_ITEMS_START + 71) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_PARALYZE_HEAL (FLAG_HIDDEN_ITEMS_START + 72) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_AWAKENING (FLAG_HIDDEN_ITEMS_START + 73) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_BURN_HEAL (FLAG_HIDDEN_ITEMS_START + 74) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ICE_HEAL (FLAG_HIDDEN_ITEMS_START + 75) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ETHER (FLAG_HIDDEN_ITEMS_START + 76) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_POTION (FLAG_HIDDEN_ITEMS_START + 77) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ANTIDOTE (FLAG_HIDDEN_ITEMS_START + 78) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_PARALYZE_HEAL (FLAG_HIDDEN_ITEMS_START + 79) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_AWAKENING (FLAG_HIDDEN_ITEMS_START + 80) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_BURN_HEAL (FLAG_HIDDEN_ITEMS_START + 81) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ICE_HEAL (FLAG_HIDDEN_ITEMS_START + 82) #define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ETHER (FLAG_HIDDEN_ITEMS_START + 83) #define FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM (FLAG_HIDDEN_ITEMS_START + 84) #define FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_2 (FLAG_HIDDEN_ITEMS_START + 85) #define FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_3 (FLAG_HIDDEN_ITEMS_START + 86) #define FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM (FLAG_HIDDEN_ITEMS_START + 87) #define FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_2 (FLAG_HIDDEN_ITEMS_START + 88) #define FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_3 (FLAG_HIDDEN_ITEMS_START + 89) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_POMEG_BERRY (FLAG_HIDDEN_ITEMS_START + 90) // Changed from Razz #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY (FLAG_HIDDEN_ITEMS_START + 91) // Changed from Bluk #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_QUALOT_BERRY (FLAG_HIDDEN_ITEMS_START + 92) // Changed from Nanab #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY (FLAG_HIDDEN_ITEMS_START + 93) // Changed from Wepear #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ORAN_BERRY (FLAG_HIDDEN_ITEMS_START + 94) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHERI_BERRY (FLAG_HIDDEN_ITEMS_START + 95) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHESTO_BERRY (FLAG_HIDDEN_ITEMS_START + 96) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PECHA_BERRY (FLAG_HIDDEN_ITEMS_START + 97) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_RAWST_BERRY (FLAG_HIDDEN_ITEMS_START + 98) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ASPEAR_BERRY (FLAG_HIDDEN_ITEMS_START + 99) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY (FLAG_HIDDEN_ITEMS_START + 100) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY (FLAG_HIDDEN_ITEMS_START + 101) // Changed from Pinap #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_LUM_BERRY (FLAG_HIDDEN_ITEMS_START + 102) #define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST (FLAG_HIDDEN_ITEMS_START + 103) #define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST_2 (FLAG_HIDDEN_ITEMS_START + 104) #define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL (FLAG_HIDDEN_ITEMS_START + 105) #define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL_2 (FLAG_HIDDEN_ITEMS_START + 106) #define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 107) #define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2 (FLAG_HIDDEN_ITEMS_START + 108) #define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STAR_PIECE (FLAG_HIDDEN_ITEMS_START + 109) #define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 110) #define FLAG_HIDDEN_ITEM_TWO_ISLAND_CAPE_BRINK_RARE_CANDY (FLAG_HIDDEN_ITEMS_START + 111) #define FLAG_HIDDEN_ITEM_PEWTER_CITY_POKE_BALL (FLAG_HIDDEN_ITEMS_START + 112) #define FLAG_HIDDEN_ITEM_ROUTE3_ORAN_BERRY (FLAG_HIDDEN_ITEMS_START + 113) #define FLAG_HIDDEN_ITEM_ROUTE4_PERSIM_BERRY (FLAG_HIDDEN_ITEMS_START + 114) #define FLAG_HIDDEN_ITEM_ROUTE24_PECHA_BERRY (FLAG_HIDDEN_ITEMS_START + 115) #define FLAG_HIDDEN_ITEM_ROUTE25_ORAN_BERRY (FLAG_HIDDEN_ITEMS_START + 116) #define FLAG_HIDDEN_ITEM_ROUTE25_POMEG_BERRY (FLAG_HIDDEN_ITEMS_START + 117) // Changed from Bluk #define FLAG_HIDDEN_ITEM_ROUTE6_SITRUS_BERRY (FLAG_HIDDEN_ITEMS_START + 118) #define FLAG_HIDDEN_ITEM_ROUTE6_RARE_CANDY (FLAG_HIDDEN_ITEMS_START + 119) #define FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_PECHA_BERRY (FLAG_HIDDEN_ITEMS_START + 120) #define FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_CHERI_BERRY (FLAG_HIDDEN_ITEMS_START + 121) #define FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_CHESTO_BERRY (FLAG_HIDDEN_ITEMS_START + 122) #define FLAG_HIDDEN_ITEM_ROUTE9_RARE_CANDY (FLAG_HIDDEN_ITEMS_START + 123) #define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_LIECHI_BERRY (FLAG_HIDDEN_ITEMS_START + 124) // New #define FLAG_HIDDEN_ITEM_ROUTE10_PERSIM_BERRY (FLAG_HIDDEN_ITEMS_START + 125) #define FLAG_HIDDEN_ITEM_ROUTE10_CHERI_BERRY (FLAG_HIDDEN_ITEMS_START + 126) #define FLAG_HIDDEN_ITEM_ROUTE8_RAWST_BERRY (FLAG_HIDDEN_ITEMS_START + 127) #define FLAG_HIDDEN_ITEM_ROUTE8_LUM_BERRY (FLAG_HIDDEN_ITEMS_START + 128) #define FLAG_HIDDEN_ITEM_ROUTE8_LEPPA_BERRY (FLAG_HIDDEN_ITEMS_START + 129) #define FLAG_HIDDEN_ITEM_ROUTE12_RARE_CANDY (FLAG_HIDDEN_ITEMS_START + 130) #define FLAG_HIDDEN_ITEM_ROUTE12_LEFTOVERS (FLAG_HIDDEN_ITEMS_START + 131) #define FLAG_HIDDEN_ITEM_ROUTE16_LEFTOVERS (FLAG_HIDDEN_ITEMS_START + 132) #define FLAG_HIDDEN_ITEM_FUCHSIA_CITY_MAX_REVIVE (FLAG_HIDDEN_ITEMS_START + 133) #define FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B4F_NET_BALL (FLAG_HIDDEN_ITEMS_START + 134) #define FLAG_HIDDEN_ITEM_SILPH_CO_2F_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 135) #define FLAG_HIDDEN_ITEM_SILPH_CO_3F_PROTEIN (FLAG_HIDDEN_ITEMS_START + 136) #define FLAG_HIDDEN_ITEM_SILPH_CO_4F_IRON (FLAG_HIDDEN_ITEMS_START + 137) #define FLAG_HIDDEN_ITEM_SILPH_CO_5F_PP_UP (FLAG_HIDDEN_ITEMS_START + 138) #define FLAG_HIDDEN_ITEM_SILPH_CO_6F_CARBOS (FLAG_HIDDEN_ITEMS_START + 139) #define FLAG_HIDDEN_ITEM_SILPH_CO_7F_ZINC (FLAG_HIDDEN_ITEMS_START + 140) #define FLAG_HIDDEN_ITEM_SILPH_CO_8F_NUGGET (FLAG_HIDDEN_ITEMS_START + 141) #define FLAG_HIDDEN_ITEM_SILPH_CO_9F_CALCIUM (FLAG_HIDDEN_ITEMS_START + 142) #define FLAG_HIDDEN_ITEM_SILPH_CO_10F_HP_UP (FLAG_HIDDEN_ITEMS_START + 143) #define FLAG_HIDDEN_ITEM_SILPH_CO_11F_REVIVE (FLAG_HIDDEN_ITEMS_START + 144) #define FLAG_HIDDEN_ITEM_ROUTE23_LUM_BERRY (FLAG_HIDDEN_ITEMS_START + 145) #define FLAG_HIDDEN_ITEM_ROUTE23_SITRUS_BERRY (FLAG_HIDDEN_ITEMS_START + 146) #define FLAG_HIDDEN_ITEM_ROUTE23_ASPEAR_BERRY (FLAG_HIDDEN_ITEMS_START + 147) #define FLAG_HIDDEN_ITEM_ROUTE23_LEPPA_BERRY (FLAG_HIDDEN_ITEMS_START + 148) #define FLAG_HIDDEN_ITEM_ROUTE14_ZINC (FLAG_HIDDEN_ITEMS_START + 149) #define FLAG_HIDDEN_ITEM_ROUTE9_CHESTO_BERRY (FLAG_HIDDEN_ITEMS_START + 150) #define FLAG_HIDDEN_ITEM_ROUTE10_KELPSY_BERRY (FLAG_HIDDEN_ITEMS_START + 151) // Changed from Nanab #define FLAG_HIDDEN_ITEM_ROUTE7_QUALOT_BERRY (FLAG_HIDDEN_ITEMS_START + 152) // Changed from Wepear #define FLAG_HIDDEN_ITEM_ROUTE20_STARDUST (FLAG_HIDDEN_ITEMS_START + 153) #define FLAG_HIDDEN_ITEM_ROUTE21_NORTH_PEARL (FLAG_HIDDEN_ITEMS_START + 154) #define FLAG_HIDDEN_ITEM_ROUTE23_MAX_ELIXIR (FLAG_HIDDEN_ITEMS_START + 155) #define FLAG_HIDDEN_ITEM_ROUTE4_HONDEW_BERRY (FLAG_HIDDEN_ITEMS_START + 156) // Changed from Razz #define FLAG_HIDDEN_ITEM_ROUTE14_GREPA_BERRY (FLAG_HIDDEN_ITEMS_START + 157) // Changed from Pinap #define FLAG_HIDDEN_ITEM_MT_EMBER_EXTERIOR_FIRE_STONE (FLAG_HIDDEN_ITEMS_START + 158) #define FLAG_HIDDEN_ITEM_POKEMON_TOWER_7F_SOOTHE_BELL (FLAG_HIDDEN_ITEMS_START + 159) #define FLAG_HIDDEN_ITEM_NAVEL_ROCK_SUMMIT_SACRED_ASH (FLAG_HIDDEN_ITEMS_START + 160) #define FLAG_HIDDEN_ITEM_TWO_ISLAND_CAPE_BRINK_PP_MAX (FLAG_HIDDEN_ITEMS_START + 161) #define FLAG_HIDDEN_ITEM_MT_EMBER_EXTERIOR_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 162) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_DUNSPARCE_TUNNEL_NUGGET (FLAG_HIDDEN_ITEMS_START + 163) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_PP_UP (FLAG_HIDDEN_ITEMS_START + 164) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_MAX_REPEL (FLAG_HIDDEN_ITEMS_START + 165) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_PEARL (FLAG_HIDDEN_ITEMS_START + 166) #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_STARDUST (FLAG_HIDDEN_ITEMS_START + 167) #define FLAG_HIDDEN_ITEM_FOUR_ISLAND_PEARL (FLAG_HIDDEN_ITEMS_START + 168) #define FLAG_HIDDEN_ITEM_FOUR_ISLAND_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 169) #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 170) #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_POMEG_BERRY (FLAG_HIDDEN_ITEMS_START + 171) // Changed from Razz #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_SITRUS_BERRY (FLAG_HIDDEN_ITEMS_START + 172) #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_KELPSY_BERRY (FLAG_HIDDEN_ITEMS_START + 173) // Changed from Bluk #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_NEST_BALL (FLAG_HIDDEN_ITEMS_START + 174) #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST (FLAG_HIDDEN_ITEMS_START + 175) #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STAR_PIECE (FLAG_HIDDEN_ITEMS_START + 176) #define FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST_2 (FLAG_HIDDEN_ITEMS_START + 177) #define FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_STAR_PIECE (FLAG_HIDDEN_ITEMS_START + 178) #define FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_NET_BALL (FLAG_HIDDEN_ITEMS_START + 179) #define FLAG_HIDDEN_ITEM_SIX_ISLAND_GREEN_PATH_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 180) #define FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_ASPEAR_BERRY (FLAG_HIDDEN_ITEMS_START + 181) #define FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_ORAN_BERRY (FLAG_HIDDEN_ITEMS_START + 182) #define FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_QUALOT_BERRY (FLAG_HIDDEN_ITEMS_START + 183) // Changed from Pinap #define FLAG_HIDDEN_ITEM_SIX_ISLAND_LEPPA_BERRY (FLAG_HIDDEN_ITEMS_START + 184) #define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 185) #define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_PEARL (FLAG_HIDDEN_ITEMS_START + 186) #define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_HONDEW_BERRY (FLAG_HIDDEN_ITEMS_START + 187) // Changed from Nanab #define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE_RAWST_BERRY (FLAG_HIDDEN_ITEMS_START + 188) #define FLAG_HIDDEN_ITEM_VIRIDIAN_CITY_GYM_MACHO_BRACE (FLAG_HIDDEN_ITEMS_START + 189) #define FLAG_HIDDEN_ITEM_SSANNE_EXTERIOR_LAVA_COOKIE (FLAG_HIDDEN_ITEMS_START + 190) #define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_SITRUS_BERRY (FLAG_HIDDEN_ITEMS_START + 191) // New #define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHEAST_SALAC_BERRY (FLAG_HIDDEN_ITEMS_START + 192) // New #define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHEAST_BRIGHTPOWDER (FLAG_HIDDEN_ITEMS_START + 193) // New #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_UNDERWATER_DIVE_BALL (FLAG_HIDDEN_ITEMS_START + 194) // New #define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_UNDERWATER_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 195) // New #define FLAG_HIDDEN_ITEM_ARTISAN_CAVE_ZINC (FLAG_HIDDEN_ITEMS_START + 196) #define FLAG_HIDDEN_ITEM_ARTISAN_CAVE_CALCIUM (FLAG_HIDDEN_ITEMS_START + 197) #define FLAG_HIDDEN_ITEM_ARTISAN_CAVE_PROTEIN (FLAG_HIDDEN_ITEMS_START + 198) #define FLAG_HIDDEN_ITEM_ARTISAN_CAVE_IRON (FLAG_HIDDEN_ITEMS_START + 199) // Boss clear flags, 1200 #define FLAG_DEFEATED_BROCK 0x4B0 #define FLAG_DEFEATED_MISTY 0x4B1 #define FLAG_DEFEATED_LT_SURGE 0x4B2 #define FLAG_DEFEATED_ERIKA 0x4B3 #define FLAG_DEFEATED_KOGA 0x4B4 #define FLAG_DEFEATED_SABRINA 0x4B5 #define FLAG_DEFEATED_BLAINE 0x4B6 #define FLAG_DEFEATED_LEADER_GIOVANNI 0x4B7 #define FLAG_DEFEATED_LORELEI 0x4B8 #define FLAG_DEFEATED_BRUNO 0x4B9 #define FLAG_DEFEATED_AGATHA 0x4BA #define FLAG_DEFEATED_LANCE 0x4BB #define FLAG_DEFEATED_CHAMP 0x4BC // Unused? #define FLAG_HIDDEN_ITEM_CAPE_BRINK_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 213) // continued from above numbering because of how these are set by GetHiddenItemAttr #define FLAG_0x4BE 0x4BE #define FLAG_0x4BF 0x4BF #define FLAG_0x4C0 0x4C0 #define FLAG_0x4C1 0x4C1 #define FLAG_0x4C2 0x4C2 #define FLAG_0x4C3 0x4C3 #define FLAG_0x4C4 0x4C4 #define FLAG_0x4C5 0x4C5 #define FLAG_0x4C6 0x4C6 #define FLAG_0x4C7 0x4C7 #define FLAG_0x4C8 0x4C8 #define FLAG_0x4C9 0x4C9 #define FLAG_0x4CA 0x4CA #define FLAG_0x4CB 0x4CB #define FLAG_0x4CC 0x4CC #define FLAG_0x4CD 0x4CD #define FLAG_0x4CE 0x4CE #define FLAG_0x4CF 0x4CF #define FLAG_0x4D0 0x4D0 #define FLAG_0x4D1 0x4D1 #define FLAG_0x4D2 0x4D2 #define FLAG_0x4D3 0x4D3 #define FLAG_0x4D4 0x4D4 #define FLAG_0x4D5 0x4D5 #define FLAG_0x4D6 0x4D6 #define FLAG_0x4D7 0x4D7 #define FLAG_0x4D8 0x4D8 #define FLAG_0x4D9 0x4D9 #define FLAG_0x4DA 0x4DA #define FLAG_0x4DB 0x4DB #define FLAG_0x4DC 0x4DC #define FLAG_0x4DD 0x4DD #define FLAG_0x4DE 0x4DE #define FLAG_0x4DF 0x4DF #define FLAG_0x4E0 0x4E0 #define FLAG_0x4E1 0x4E1 #define FLAG_0x4E2 0x4E2 #define FLAG_0x4E3 0x4E3 #define FLAG_0x4E4 0x4E4 #define FLAG_0x4E5 0x4E5 #define FLAG_0x4E6 0x4E6 #define FLAG_0x4E7 0x4E7 #define FLAG_0x4E8 0x4E8 #define FLAG_0x4E9 0x4E9 #define FLAG_0x4EA 0x4EA #define FLAG_0x4EB 0x4EB #define FLAG_0x4EC 0x4EC #define FLAG_0x4ED 0x4ED #define FLAG_0x4EE 0x4EE #define FLAG_0x4EF 0x4EF #define FLAG_0x4F0 0x4F0 #define FLAG_0x4F1 0x4F1 #define FLAG_0x4F2 0x4F2 #define FLAG_0x4F3 0x4F3 #define FLAG_0x4F4 0x4F4 #define FLAG_0x4F5 0x4F5 #define FLAG_0x4F6 0x4F6 #define FLAG_0x4F7 0x4F7 #define FLAG_0x4F8 0x4F8 #define FLAG_0x4F9 0x4F9 #define FLAG_0x4FA 0x4FA #define FLAG_0x4FB 0x4FB #define FLAG_0x4FC 0x4FC #define FLAG_0x4FD 0x4FD #define FLAG_0x4FE 0x4FE #define FLAG_0x4FF 0x4FF #define TRAINER_FLAGS_START (FLAG_0x4FF + 1) #define TRAINER_FLAGS_END (TRAINER_FLAGS_START + MAX_TRAINERS_COUNT - 1) // 0x7FF // SYSTEM FLAGS #define SYS_FLAGS (TRAINER_FLAGS_END + 1) // 0x800 // Temporary system flags #define FLAG_SYS_SAFARI_MODE (SYS_FLAGS + 0x0) #define FLAG_SYS_VS_SEEKER_CHARGING (SYS_FLAGS + 0x1) #define FLAG_SYS_CRUISE_MODE (SYS_FLAGS + 0x2) #define FLAG_SYS_WHITE_FLUTE_ACTIVE (SYS_FLAGS + 0x3) #define FLAG_SYS_BLACK_FLUTE_ACTIVE (SYS_FLAGS + 0x4) #define FLAG_SYS_USE_STRENGTH (SYS_FLAGS + 0x5) #define FLAG_SYS_FLASH_ACTIVE (SYS_FLAGS + 0x6) #define FLAG_SYS_SPECIAL_WILD_BATTLE (SYS_FLAGS + 0x7) #define FLAG_SYS_QL_DEPARTED (SYS_FLAGS + 0x8) #define FLAG_SYS_IN_OPTIONS_MENU (SYS_FLAGS + 0x9) #define FLAG_0x80A (SYS_FLAGS + 0xA) #define FLAG_0x80B (SYS_FLAGS + 0xB) #define FLAG_0x80C (SYS_FLAGS + 0xC) #define FLAG_0x80D (SYS_FLAGS + 0xD) #define FLAG_0x80E (SYS_FLAGS + 0xE) #define FLAG_0x80F (SYS_FLAGS + 0xF) #define FLAG_0x810 (SYS_FLAGS + 0x10) #define FLAG_0x811 (SYS_FLAGS + 0x11) #define FLAG_0x812 (SYS_FLAGS + 0x12) #define FLAG_0x813 (SYS_FLAGS + 0x13) #define FLAG_0x814 (SYS_FLAGS + 0x14) #define FLAG_0x815 (SYS_FLAGS + 0x15) #define FLAG_0x816 (SYS_FLAGS + 0x16) #define FLAG_0x817 (SYS_FLAGS + 0x17) #define FLAG_0x818 (SYS_FLAGS + 0x18) #define FLAG_0x819 (SYS_FLAGS + 0x19) #define FLAG_0x81A (SYS_FLAGS + 0x1A) #define FLAG_0x81B (SYS_FLAGS + 0x1B) #define FLAG_0x81C (SYS_FLAGS + 0x1C) #define FLAG_0x81D (SYS_FLAGS + 0x1D) #define FLAG_0x81E (SYS_FLAGS + 0x1E) #define FLAG_0x81F (SYS_FLAGS + 0x1F) // Permanent system flags #define PERMA_SYS_FLAGS_START (FLAG_0x81F + 1) #define FLAG_BADGE01_GET (SYS_FLAGS + 0x20) #define FLAG_BADGE02_GET (SYS_FLAGS + 0x21) #define FLAG_BADGE03_GET (SYS_FLAGS + 0x22) #define FLAG_BADGE04_GET (SYS_FLAGS + 0x23) #define FLAG_BADGE05_GET (SYS_FLAGS + 0x24) #define FLAG_BADGE06_GET (SYS_FLAGS + 0x25) #define FLAG_BADGE07_GET (SYS_FLAGS + 0x26) #define FLAG_BADGE08_GET (SYS_FLAGS + 0x27) #define NUM_BADGES (1 + FLAG_BADGE08_GET - FLAG_BADGE01_GET) #define FLAG_SYS_POKEMON_GET (SYS_FLAGS + 0x28) #define FLAG_SYS_POKEDEX_GET (SYS_FLAGS + 0x29) #define FLAG_SYS_CTRL_OBJ_DELETE (SYS_FLAGS + 0x2A) #define FLAG_SYS_IS_LINKING (SYS_FLAGS + 0x2B) #define FLAG_SYS_GAME_CLEAR_OLD (SYS_FLAGS + 0x2C) // Needs to be set to link with XD. New FLAG_SYS_GAME_CLEAR (now used in scripts) is at the bottom. #define FLAG_SYS_SET_TRAINER_CARD_PROFILE (SYS_FLAGS + 0x2D) #define FLAG_0x82E (SYS_FLAGS + 0x2E) #define FLAG_SYS_B_DASH (SYS_FLAGS + 0x2F) #define FLAG_SYS_ON_CYCLING_ROAD (SYS_FLAGS + 0x30) #define FLAG_SYS_RECEIVED_EXTENDED_DEX (SYS_FLAGS + 0x31) #define FLAG_SYS_EXTENDED_DEX_TOGGLE (SYS_FLAGS + 0x32) #define FLAG_SYS_ON_RESUME (SYS_FLAGS + 0x33) // Cleared when an OnResume map script could fire #define FLAG_SYS_NOT_SOMEONES_PC (SYS_FLAGS + 0x34) #define FLAG_0x835 (SYS_FLAGS + 0x35) #define FLAG_0x836 (SYS_FLAGS + 0x36) #define FLAG_SYS_RESET_RTC_ENABLE (SYS_FLAGS + 0x37) #define FLAG_0x838 (SYS_FLAGS + 0x38) // Set, never read #define FLAG_SYS_MYSTERY_GIFT_ENABLED (SYS_FLAGS + 0x39) #define FLAG_0x83A (SYS_FLAGS + 0x3A) #define FLAG_SYS_RIBBON_GET (SYS_FLAGS + 0x3B) #define FLAG_SYS_SAW_HELP_SYSTEM_INTRO (SYS_FLAGS + 0x3C) #define FLAG_0x83D (SYS_FLAGS + 0x3D) #define FLAG_OPENED_START_MENU (SYS_FLAGS + 0x3E) #define FLAG_0x83F (SYS_FLAGS + 0x3F) #define FLAG_SYS_NATIONAL_DEX (SYS_FLAGS + 0x40) #define FLAG_SYS_PC_STORAGE_DISABLED (SYS_FLAGS + 0x41) #define FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER (SYS_FLAGS + 0x42) #define FLAG_SHOWN_BOX_WAS_FULL_MESSAGE (SYS_FLAGS + 0x43) #define FLAG_SYS_CAN_LINK_WITH_RS (SYS_FLAGS + 0x44) #define FLAG_SYS_SEVII_MAP_123 (SYS_FLAGS + 0x45) #define FLAG_SYS_SEVII_MAP_4567 (SYS_FLAGS + 0x46) #define FLAG_SYS_GOT_BERRY_POUCH (SYS_FLAGS + 0x47) #define FLAG_SYS_DEOXYS_AWAKENED (SYS_FLAGS + 0x48) #define FLAG_SYS_UNLOCKED_TANOBY_RUINS (SYS_FLAGS + 0x49) #define FLAG_ENABLE_SHIP_NAVEL_ROCK (SYS_FLAGS + 0x4A) #define FLAG_ENABLE_SHIP_BIRTH_ISLAND (SYS_FLAGS + 0x4B) // World Map Flags #define FLAG_WORLD_MAP_PALLET_TOWN (SYS_FLAGS + 0x90) #define FLAG_WORLD_MAP_VIRIDIAN_CITY (SYS_FLAGS + 0x91) #define FLAG_WORLD_MAP_PEWTER_CITY (SYS_FLAGS + 0x92) #define FLAG_WORLD_MAP_CERULEAN_CITY (SYS_FLAGS + 0x93) #define FLAG_WORLD_MAP_LAVENDER_TOWN (SYS_FLAGS + 0x94) #define FLAG_WORLD_MAP_VERMILION_CITY (SYS_FLAGS + 0x95) #define FLAG_WORLD_MAP_CELADON_CITY (SYS_FLAGS + 0x96) #define FLAG_WORLD_MAP_FUCHSIA_CITY (SYS_FLAGS + 0x97) #define FLAG_WORLD_MAP_CINNABAR_ISLAND (SYS_FLAGS + 0x98) #define FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR (SYS_FLAGS + 0x99) #define FLAG_WORLD_MAP_SAFFRON_CITY (SYS_FLAGS + 0x9A) #define FLAG_WORLD_MAP_ONE_ISLAND (SYS_FLAGS + 0x9B) #define FLAG_WORLD_MAP_TWO_ISLAND (SYS_FLAGS + 0x9C) #define FLAG_WORLD_MAP_THREE_ISLAND (SYS_FLAGS + 0x9D) #define FLAG_WORLD_MAP_FOUR_ISLAND (SYS_FLAGS + 0x9E) #define FLAG_WORLD_MAP_FIVE_ISLAND (SYS_FLAGS + 0x9F) #define FLAG_WORLD_MAP_SEVEN_ISLAND (SYS_FLAGS + 0xA0) #define FLAG_WORLD_MAP_SIX_ISLAND (SYS_FLAGS + 0xA1) #define FLAG_WORLD_MAP_ROUTE4_POKEMON_CENTER_1F (SYS_FLAGS + 0xA2) #define FLAG_WORLD_MAP_ROUTE10_POKEMON_CENTER_1F (SYS_FLAGS + 0xA3) #define FLAG_WORLD_MAP_VIRIDIAN_FOREST (SYS_FLAGS + 0xA4) #define FLAG_WORLD_MAP_MT_MOON_1F (SYS_FLAGS + 0xA5) #define FLAG_WORLD_MAP_SSANNE_EXTERIOR (SYS_FLAGS + 0xA6) #define FLAG_WORLD_MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL (SYS_FLAGS + 0xA7) #define FLAG_WORLD_MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL (SYS_FLAGS + 0xA8) #define FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F (SYS_FLAGS + 0xA9) #define FLAG_WORLD_MAP_VICTORY_ROAD_1F (SYS_FLAGS + 0xAA) #define FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F (SYS_FLAGS + 0xAB) #define FLAG_WORLD_MAP_SILPH_CO_1F (SYS_FLAGS + 0xAC) #define FLAG_WORLD_MAP_POKEMON_MANSION_1F (SYS_FLAGS + 0xAD) #define FLAG_WORLD_MAP_SAFARI_ZONE_CENTER (SYS_FLAGS + 0xAE) #define FLAG_WORLD_MAP_POKEMON_LEAGUE_LORELEIS_ROOM (SYS_FLAGS + 0xAF) #define FLAG_WORLD_MAP_ROCK_TUNNEL_1F (SYS_FLAGS + 0xB0) #define FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F (SYS_FLAGS + 0xB1) #define FLAG_WORLD_MAP_POKEMON_TOWER_1F (SYS_FLAGS + 0xB2) #define FLAG_WORLD_MAP_CERULEAN_CAVE_1F (SYS_FLAGS + 0xB3) #define FLAG_WORLD_MAP_POWER_PLANT (SYS_FLAGS + 0xB4) #define FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR (SYS_FLAGS + 0xB5) #define FLAG_WORLD_MAP_MT_EMBER_EXTERIOR (SYS_FLAGS + 0xB6) #define FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST (SYS_FLAGS + 0xB7) #define FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE (SYS_FLAGS + 0xB8) #define FLAG_WORLD_MAP_FIVE_ISLAND_ROCKET_WAREHOUSE (SYS_FLAGS + 0xB9) #define FLAG_WORLD_MAP_TRAINER_TOWER_LOBBY (SYS_FLAGS + 0xBA) #define FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F (SYS_FLAGS + 0xBB) #define FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE (SYS_FLAGS + 0xBC) #define FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH (SYS_FLAGS + 0xBD) #define FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE (SYS_FLAGS + 0xBE) #define FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER (SYS_FLAGS + 0xBF) #define FLAG_WORLD_MAP_THREE_ISLAND_DUNSPARCE_TUNNEL (SYS_FLAGS + 0xC0) #define FLAG_WORLD_MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY (SYS_FLAGS + 0xC1) #define FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR (SYS_FLAGS + 0xC2) #define FLAG_0x8C3 (SYS_FLAGS + 0xC3) #define FLAG_0x8C4 (SYS_FLAGS + 0xC4) #define FLAG_0x8C5 (SYS_FLAGS + 0xC5) #define FLAG_0x8C6 (SYS_FLAGS + 0xC6) #define FLAG_0x8C7 (SYS_FLAGS + 0xC7) #define FLAG_0x8C8 (SYS_FLAGS + 0xC8) #define FLAG_0x8C9 (SYS_FLAGS + 0xC9) #define FLAG_0x8CA (SYS_FLAGS + 0xCA) #define FLAG_0x8CB (SYS_FLAGS + 0xCB) #define FLAG_0x8CC (SYS_FLAGS + 0xCC) #define FLAG_0x8CD (SYS_FLAGS + 0xCD) #define FLAG_0x8CE (SYS_FLAGS + 0xCE) #define FLAG_0x8CF (SYS_FLAGS + 0xCF) #define FLAG_0x8D0 (SYS_FLAGS + 0xD0) #define FLAG_0x8D1 (SYS_FLAGS + 0xD1) #define FLAG_0x8D2 (SYS_FLAGS + 0xD2) #define FLAG_0x8D3 (SYS_FLAGS + 0xD3) #define FLAG_0x8D4 (SYS_FLAGS + 0xD4) #define FLAG_SYS_GAME_CLEAR (SYS_FLAGS + 0xD5) #define FLAG_0x8D6 (SYS_FLAGS + 0xD6) #define FLAG_0x8D7 (SYS_FLAGS + 0xD7) #define FLAG_0x8D8 (SYS_FLAGS + 0xD8) #define FLAG_0x8D9 (SYS_FLAGS + 0xD9) #define FLAG_0x8DA (SYS_FLAGS + 0xDA) #define FLAG_0x8DB (SYS_FLAGS + 0xDB) #define FLAG_0x8DC (SYS_FLAGS + 0xDC) #define FLAG_0x8DD (SYS_FLAGS + 0xDD) #define FLAG_0x8DE (SYS_FLAGS + 0xDE) #define FLAG_0x8DF (SYS_FLAGS + 0xDF) #define FLAG_0x8E0 (SYS_FLAGS + 0xE0) #define FLAG_0x8E1 (SYS_FLAGS + 0xE1) #define FLAG_0x8E2 (SYS_FLAGS + 0xE2) #define FLAG_0x8E3 (SYS_FLAGS + 0xE3) #define FLAG_0x8E4 (SYS_FLAGS + 0xE4) #define FLAG_0x8E5 (SYS_FLAGS + 0xE5) #define FLAG_0x8E6 (SYS_FLAGS + 0xE6) #define FLAG_0x8E7 (SYS_FLAGS + 0xE7) #define FLAG_0x8E8 (SYS_FLAGS + 0xE8) #define FLAG_0x8E9 (SYS_FLAGS + 0xE9) #define FLAG_0x8EA (SYS_FLAGS + 0xEA) #define FLAG_0x8EB (SYS_FLAGS + 0xEB) #define FLAG_0x8EC (SYS_FLAGS + 0xEC) #define FLAG_0x8ED (SYS_FLAGS + 0xED) #define FLAG_0x8EE (SYS_FLAGS + 0xEE) #define FLAG_0x8EF (SYS_FLAGS + 0xEF) #define FLAG_0x8F0 (SYS_FLAGS + 0xF0) #define FLAG_0x8F1 (SYS_FLAGS + 0xF1) #define FLAG_0x8F2 (SYS_FLAGS + 0xF2) #define FLAG_0x8F3 (SYS_FLAGS + 0xF3) #define FLAG_0x8F4 (SYS_FLAGS + 0xF4) #define FLAG_0x8F5 (SYS_FLAGS + 0xF5) #define FLAG_0x8F6 (SYS_FLAGS + 0xF6) #define FLAG_0x8F7 (SYS_FLAGS + 0xF7) #define FLAG_0x8F8 (SYS_FLAGS + 0xF8) #define FLAG_0x8F9 (SYS_FLAGS + 0xF9) #define FLAG_0x8FA (SYS_FLAGS + 0xFA) #define FLAG_0x8FB (SYS_FLAGS + 0xFB) #define FLAG_0x8FC (SYS_FLAGS + 0xFC) #define FLAG_0x8FD (SYS_FLAGS + 0xFD) #define FLAG_0x8FE (SYS_FLAGS + 0xFE) #define FLAG_0x8FF (SYS_FLAGS + 0xFF) #define FLAGS_COUNT (FLAG_0x8FF + 1) // Special Flags (Stored in EWRAM (sSpecialFlags, not in the SaveBlock) #define SPECIAL_FLAGS_START 0x4000 #define FLAG_DONT_SHOW_MAP_NAME_POPUP (SPECIAL_FLAGS_START + 0x0) #define FLAG_DONT_TRANSITION_MUSIC (SPECIAL_FLAGS_START + 0x1) // FLAG_SPECIAL_FLAG_0x4002 - 0x407F also exist and are unused #define SPECIAL_FLAGS_END (SPECIAL_FLAGS_START + 0x7F) #endif // GUARD_CONSTANTS_FLAGS_H ================================================ FILE: include/constants/game_stat.h ================================================ #ifndef GUARD_CONSTANTS_GAME_STAT_H #define GUARD_CONSTANTS_GAME_STAT_H #define GAME_STAT_SAVED_GAME 0 #define GAME_STAT_FIRST_HOF_PLAY_TIME 1 #define GAME_STAT_STARTED_TRENDS 2 #define GAME_STAT_PLANTED_BERRIES 3 #define GAME_STAT_TRADED_BIKES 4 #define GAME_STAT_STEPS 5 #define GAME_STAT_GOT_INTERVIEWED 6 #define GAME_STAT_TOTAL_BATTLES 7 #define GAME_STAT_WILD_BATTLES 8 #define GAME_STAT_TRAINER_BATTLES 9 #define GAME_STAT_ENTERED_HOF 10 #define GAME_STAT_POKEMON_CAPTURES 11 #define GAME_STAT_FISHING_CAPTURES 12 #define GAME_STAT_HATCHED_EGGS 13 #define GAME_STAT_EVOLVED_POKEMON 14 #define GAME_STAT_USED_POKECENTER 15 #define GAME_STAT_RESTED_AT_HOME 16 #define GAME_STAT_ENTERED_SAFARI_ZONE 17 #define GAME_STAT_USED_CUT 18 #define GAME_STAT_USED_ROCK_SMASH 19 #define GAME_STAT_MOVED_SECRET_BASE 20 #define GAME_STAT_POKEMON_TRADES 21 #define GAME_STAT_UNKNOWN_22 22 #define GAME_STAT_LINK_BATTLE_WINS 23 #define GAME_STAT_LINK_BATTLE_LOSSES 24 #define GAME_STAT_LINK_BATTLE_DRAWS 25 #define GAME_STAT_USED_SPLASH 26 #define GAME_STAT_USED_STRUGGLE 27 #define GAME_STAT_SLOT_JACKPOTS 28 #define GAME_STAT_CONSECUTIVE_ROULETTE_WINS 29 #define GAME_STAT_ENTERED_BATTLE_TOWER 30 #define GAME_STAT_UNKNOWN_31 31 #define GAME_STAT_BATTLE_TOWER_BEST_STREAK 32 #define GAME_STAT_POKEBLOCKS 33 #define GAME_STAT_POKEBLOCKS_WITH_FRIENDS 34 #define GAME_STAT_WON_LINK_CONTEST 35 #define GAME_STAT_ENTERED_CONTEST 36 #define GAME_STAT_WON_CONTEST 37 #define GAME_STAT_SHOPPED 38 #define GAME_STAT_USED_ITEMFINDER 39 #define GAME_STAT_GOT_RAINED_ON 40 #define GAME_STAT_CHECKED_POKEDEX 41 #define GAME_STAT_RECEIVED_RIBBONS 42 #define GAME_STAT_JUMPED_DOWN_LEDGES 43 #define GAME_STAT_WATCHED_TV 44 #define GAME_STAT_CHECKED_CLOCK 45 #define GAME_STAT_WON_POKEMON_LOTTERY 46 #define GAME_STAT_USED_DAYCARE 47 #define GAME_STAT_RODE_CABLE_CAR 48 #define GAME_STAT_ENTERED_HOT_SPRINGS 49 #define GAME_STAT_NUM_UNION_ROOM_BATTLES 50 #define GAME_STAT_BERRY_CRUSH_POINTS 51 #define NUM_USED_GAME_STATS 52 #define NUM_GAME_STATS 64 #endif // GUARD_CONSTANTS_GAME_STAT_H ================================================ FILE: include/constants/global.h ================================================ #ifndef GUARD_CONSTANTS_GLOBAL_H #define GUARD_CONSTANTS_GLOBAL_H // Invalid Versions show as "----------" in Gen 4 and Gen 5's summary screen. // In Gens 6 and 7, invalid versions instead show "a distant land" in the summary screen. // In Gen 4 only, migrated Pokemon with Diamond, Pearl, or Platinum's ID show as "----------". // Gen 5 and up read Diamond, Pearl, or Platinum's ID as "Sinnoh". // In Gen 4 and up, migrated Pokemon with HeartGold or SoulSilver's ID show the otherwise unused "Johto" string. #define VERSION_SAPPHIRE 1 #define VERSION_RUBY 2 #define VERSION_EMERALD 3 #define VERSION_FIRE_RED 4 #define VERSION_LEAF_GREEN 5 #define VERSION_HEART_GOLD 7 #define VERSION_SOUL_SILVER 8 #define VERSION_DIAMOND 10 #define VERSION_PEARL 11 #define VERSION_PLATINUM 12 #define VERSION_GAMECUBE 15 #define LANGUAGE_JAPANESE 1 #define LANGUAGE_ENGLISH 2 #define LANGUAGE_FRENCH 3 #define LANGUAGE_ITALIAN 4 #define LANGUAGE_GERMAN 5 #define LANGUAGE_KOREAN 6 // 6 goes unused but the theory is it was meant to be Korean #define LANGUAGE_SPANISH 7 #define NUM_LANGUAGES 7 #define GAME_LANGUAGE (LANGUAGE_ENGLISH) // capacities of various saveblock objects #define DAYCARE_MON_COUNT 2 #define PC_ITEMS_COUNT 30 #define BAG_ITEMS_COUNT 47 #define BAG_KEYITEMS_COUNT 36 #define BAG_POKEBALLS_COUNT 13 #define BAG_TMHM_COUNT 58 #define BAG_BERRIES_COUNT 43 #define BAG_MEDICINE_COUNT 40 #define BAG_HELD_ITEMS_COUNT 52 #define OBJECT_EVENTS_COUNT 16 #define OBJECT_EVENT_TEMPLATES_COUNT 64 #define MAIL_COUNT (PARTY_SIZE + 10) #define PC_MAIL_NUM(i) (PARTY_SIZE + (i)) #define DECOR_MAX_SECRET_BASE 16 #define MAX_REMATCH_ENTRIES 100 #define UNION_ROOM_KB_ROW_COUNT 10 #define GIFT_RIBBONS_COUNT 11 #define POCKET_ITEMS 1 #define POCKET_MEDICINE 2 #define POCKET_KEY_ITEMS 3 #define POCKET_HELD_ITEMS 4 #define POCKET_POKE_BALLS 5 #define POCKET_TM_CASE 6 #define POCKET_BERRY_POUCH 7 #define NUM_BAG_POCKETS 7 // Contests #define CONTEST_CATEGORIES_COUNT 5 // string lengths #define ITEM_NAME_LENGTH 14 #define POKEMON_NAME_LENGTH 10 #define PLAYER_NAME_LENGTH 7 #define MAIL_WORDS_COUNT 9 #define EASY_CHAT_BATTLE_WORDS_COUNT 6 #define MOVE_NAME_LENGTH 12 #define NUM_QUESTIONNAIRE_WORDS 4 #define WONDER_CARD_TEXT_LENGTH 40 #define WONDER_NEWS_TEXT_LENGTH 40 #define WONDER_CARD_BODY_TEXT_LINES 4 #define WONDER_NEWS_BODY_TEXT_LINES 10 #define MAX_STAMP_CARD_STAMPS 7 #define TRAINER_ID_LENGTH 4 #define MAX_MON_MOVES 4 #define PARTY_SIZE 6 #define MULTI_PARTY_SIZE (PARTY_SIZE / 2) #define QUEST_LOG_SCENE_COUNT 4 #define NUM_TOWER_CHALLENGE_TYPES 4 #define MALE 0 #define FEMALE 1 #define GENDER_COUNT 2 #define BARD_SONG_LENGTH 6 #define NUM_STORYTELLER_TALES 4 #define NUM_TRADER_ITEMS 4 #define GIDDY_MAX_TALES 10 #define GIDDY_MAX_QUESTIONS 8 #define OPTIONS_BUTTON_MODE_HELP 0 #define OPTIONS_BUTTON_MODE_LR 1 #define OPTIONS_BUTTON_MODE_L_EQUALS_A 2 #define OPTIONS_TEXT_SPEED_SLOW 0 #define OPTIONS_TEXT_SPEED_MID 1 #define OPTIONS_TEXT_SPEED_FAST 2 #define OPTIONS_TEXT_SPEED_INSTANT 3 #define OPTIONS_SOUND_MONO 0 #define OPTIONS_SOUND_STEREO 1 #define OPTIONS_BATTLE_STYLE_PREDICT 0 #define OPTIONS_BATTLE_STYLE_SHIFT 1 #define OPTIONS_BATTLE_STYLE_SET 2 #define DIR_NONE 0 #define DIR_SOUTH 1 #define DIR_NORTH 2 #define DIR_WEST 3 #define DIR_EAST 4 #define DIR_SOUTHWEST 5 #define DIR_SOUTHEAST 6 #define DIR_NORTHWEST 7 #define DIR_NORTHEAST 8 #define DIFFICULTY_NORMAL 0 #define DIFFICULTY_CHALLENGE 1 #define DIFFICULTY_EASY 2 #define IV_CALC_NORMAL 0 #define IV_CALC_PERFECT 1 #define IV_CALC_ZERO 2 #define EV_CALC_NORMAL 0 #define EV_CALC_ZERO 1 #define CONNECTION_INVALID -1 #define CONNECTION_NONE 0 #define CONNECTION_SOUTH 1 #define CONNECTION_NORTH 2 #define CONNECTION_WEST 3 #define CONNECTION_EAST 4 #define CONNECTION_DIVE 5 #define CONNECTION_EMERGE 6 #endif //GUARD_CONSTANTS_GLOBAL_H ================================================ FILE: include/constants/heal_locations.h ================================================ #ifndef GUARD_CONSTANTS_HEAL_LOCATIONS_H #define GUARD_CONSTANTS_HEAL_LOCATIONS_H #define SPAWN_PALLET_TOWN 1 #define SPAWN_VIRIDIAN_CITY 2 #define SPAWN_PEWTER_CITY 3 #define SPAWN_CERULEAN_CITY 4 #define SPAWN_LAVENDER_TOWN 5 #define SPAWN_VERMILION_CITY 6 #define SPAWN_CELADON_CITY 7 #define SPAWN_FUCHSIA_CITY 8 #define SPAWN_CINNABAR_ISLAND 9 #define SPAWN_INDIGO_PLATEAU 10 #define SPAWN_SAFFRON_CITY 11 #define SPAWN_ROUTE4 12 #define SPAWN_ROUTE10 13 #define SPAWN_ONE_ISLAND 14 #define SPAWN_TWO_ISLAND 15 #define SPAWN_THREE_ISLAND 16 #define SPAWN_FOUR_ISLAND 17 #define SPAWN_FIVE_ISLAND 18 #define SPAWN_SEVEN_ISLAND 19 #define SPAWN_SIX_ISLAND 20 #define SPAWN_BATTLE_FRONTIER 21 #endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H ================================================ FILE: include/constants/help_system.h ================================================ #ifndef GUARD_CONSTANTS_HELP_SYSTEM_H #define GUARD_CONSTANTS_HELP_SYSTEM_H #define HELPCONTEXT_NONE 0 #define HELPCONTEXT_TITLE_SCREEN 1 #define HELPCONTEXT_NEW_GAME 2 #define HELPCONTEXT_NAMING_SCREEN 3 #define HELPCONTEXT_POKEDEX 4 #define HELPCONTEXT_PARTY_MENU 5 #define HELPCONTEXT_POKEMON_INFO 6 #define HELPCONTEXT_POKEMON_SKILLS 7 #define HELPCONTEXT_POKEMON_MOVES 8 #define HELPCONTEXT_BAG 9 #define HELPCONTEXT_TRAINER_CARD_FRONT 10 #define HELPCONTEXT_TRAINER_CARD_BACK 11 #define HELPCONTEXT_SAVE 12 #define HELPCONTEXT_OPTIONS 13 #define HELPCONTEXT_PLAYERS_HOUSE 14 #define HELPCONTEXT_OAKS_LAB 15 #define HELPCONTEXT_POKECENTER 16 #define HELPCONTEXT_MART 17 #define HELPCONTEXT_GYM 18 #define HELPCONTEXT_INDOORS 19 #define HELPCONTEXT_OVERWORLD 20 #define HELPCONTEXT_DUNGEON 21 // Caves and Forests #define HELPCONTEXT_SURFING 22 #define HELPCONTEXT_WILD_BATTLE 23 #define HELPCONTEXT_TRAINER_BATTLE_SINGLE 24 #define HELPCONTEXT_TRAINER_BATTLE_DOUBLE 25 #define HELPCONTEXT_SAFARI_BATTLE 26 #define HELPCONTEXT_PC 27 #define HELPCONTEXT_BILLS_PC 28 #define HELPCONTEXT_PLAYERS_PC_ITEMS 29 #define HELPCONTEXT_PLAYERS_PC_MAILBOX 30 #define HELPCONTEXT_PC_MISC 31 // Prof Oaks PC and the HoF PC #define HELPCONTEXT_BEDROOM_PC 32 #define HELPCONTEXT_BEDROOM_PC_ITEMS 33 #define HELPCONTEXT_BEDROOM_PC_MAILBOX 34 #define HELPCONTEXT_KEY_SYSTEM 35 #define HELPCONTEXT_OPTIONS_SUBMENU 36 #define HELPCONTEXT_KEY_SYSTEM_SUBMENU 37 #define HELPCONTEXT_COUNT 38 #endif //GUARD_CONSTANTS_HELP_SYSTEM_H ================================================ FILE: include/constants/hoenn_cries.h ================================================ #ifndef GUARD_CONSTANTS_HOENN_CRIES_H #define GUARD_CONSTANTS_HOENN_CRIES_H enum { CRY_KECLEON = 251, CRY_ROSELIA = 252, CRY_TORKOAL = 253, CRY_ELECTRIKE = 254, CRY_MANECTRIC = 255, CRY_DUSKULL = 256, CRY_LATIAS = 257, CRY_WYNAUT = 258, CRY_SEVIPER = 259, CRY_SHARPEDO = 260, CRY_ZANGOOSE = 261, CRY_AZURILL = 262, CRY_SWABLU = 263, CRY_ALTARIA = 264, CRY_TAILLOW = 266, CRY_SWELLOW = 267, CRY_SPINDA = 269, CRY_TORCHIC = 270, CRY_COMBUSKEN = 271, CRY_BLAZIKEN = 272, CRY_TREECKO = 273, CRY_GROVYLE = 274, CRY_SCEPTILE = 275, CRY_MUDKIP = 276, CRY_MARSHTOMP = 277, CRY_SWAMPERT = 278, CRY_PELIPPER = 279, CRY_WINGULL = 280, CRY_BANETTE = 281, CRY_SHUPPET = 282, CRY_LOTAD = 283, CRY_LOMBRE = 284, CRY_LUDICOLO = 285, CRY_SEEDOT = 286, CRY_NUZLEAF = 287, CRY_SHIFTRY = 288, CRY_CARVANHA = 289, CRY_WURMPLE = 290, CRY_SILCOON = 291, CRY_BEAUTIFLY = 292, CRY_CASCOON = 293, CRY_DUSTOX = 294, CRY_RALTS = 295, CRY_KIRLIA = 296, CRY_GARDEVOIR = 297, CRY_SLAKOTH = 298, CRY_VIGOROTH = 299, CRY_SLAKING = 300, CRY_NINCADA = 301, CRY_NINJASK = 302, CRY_SHEDINJA = 303, CRY_MAKUHITA = 304, CRY_HARIYAMA = 305, CRY_NOSEPASS = 306, CRY_GLALIE = 307, CRY_PLUSLE = 308, CRY_MINUN = 309, CRY_SURSKIT = 310, CRY_MASQUERAIN = 311, CRY_SKITTY = 312, CRY_DELCATTY = 313, CRY_GULPIN = 314, CRY_SWALOT = 315, CRY_NUMEL = 316, CRY_CAMERUPT = 317, CRY_BARBOACH = 318, CRY_WHISCASH = 319, CRY_CORPHISH = 320, CRY_CRAWDAUNT = 321, CRY_SPOINK = 322, CRY_GRUMPIG = 323, CRY_TRAPINCH = 324, CRY_VIBRAVA = 325, CRY_FLYGON = 326, CRY_CACNEA = 327, CRY_CACTURNE = 328, CRY_BALTOY = 329, CRY_CLAYDOL = 330, CRY_LUNATONE = 331, CRY_SOLROCK = 332, CRY_FEEBAS = 333, CRY_MILOTIC = 334, CRY_ABSOL = 335, CRY_MEDITITE = 336, CRY_MEDICHAM = 337, CRY_SPHEAL = 338, CRY_SEALEO = 339, CRY_WALREIN = 340, CRY_CLAMPERL = 341, CRY_HUNTAIL = 342, CRY_GOREBYSS = 343, CRY_LILEEP = 344, CRY_CRADILY = 345, CRY_ANORITH = 346, CRY_ARMALDO = 347, CRY_BELDUM = 348, CRY_METANG = 349, CRY_METAGROSS = 350, CRY_BAGON = 351, CRY_SHELGON = 352, CRY_REGIROCK = 353, CRY_REGICE = 354, CRY_REGISTEEL = 355, CRY_CASTFORM = 356, CRY_VOLBEAT = 357, CRY_ILLUMISE = 358, CRY_POOCHYENA = 359, CRY_MIGHTYENA = 360, CRY_DUSCLOPS = 361, CRY_SABLEYE = 362, CRY_MAWILE = 363, CRY_ARON = 364, CRY_LAIRON = 365, CRY_AGGRON = 366, CRY_RELICANTH = 367, CRY_LUVDISC = 368, CRY_GROUDON = 369, CRY_KYOGRE = 370, CRY_RAYQUAZA = 371, CRY_SALAMENCE = 372, CRY_BRELOOM = 373, CRY_SHROOMISH = 374, CRY_LINOONE = 375, CRY_TROPIUS = 376, CRY_WAILMER = 377, CRY_ZIGZAGOON = 378, CRY_EXPLOUD = 379, CRY_LOUDRED = 380, CRY_WAILORD = 381, CRY_WHISMUR = 382, CRY_SNORUNT = 383, CRY_LATIOS = 384, CRY_JIRACHI = 385, CRY_DEOXYS = 386, CRY_CHIMECHO = 387, }; #endif ================================================ FILE: include/constants/hold_effects.h ================================================ #ifndef GUARD_HOLD_EFFECTS_H #define GUARD_HOLD_EFFECTS_H #define HOLD_EFFECT_NONE 0 #define HOLD_EFFECT_RESTORE_HP 1 #define HOLD_EFFECT_CURE_PAR 2 #define HOLD_EFFECT_CURE_SLP 3 #define HOLD_EFFECT_CURE_PSN 4 #define HOLD_EFFECT_CURE_BRN 5 #define HOLD_EFFECT_CURE_FRZ 6 #define HOLD_EFFECT_RESTORE_PP 7 #define HOLD_EFFECT_CURE_CONFUSION 8 #define HOLD_EFFECT_CURE_STATUS 9 #define HOLD_EFFECT_CONFUSE_SPICY 10 #define HOLD_EFFECT_CONFUSE_DRY 11 #define HOLD_EFFECT_CONFUSE_SWEET 12 #define HOLD_EFFECT_CONFUSE_BITTER 13 #define HOLD_EFFECT_CONFUSE_SOUR 14 #define HOLD_EFFECT_ATTACK_UP 15 #define HOLD_EFFECT_DEFENSE_UP 16 #define HOLD_EFFECT_SPEED_UP 17 #define HOLD_EFFECT_SP_ATTACK_UP 18 #define HOLD_EFFECT_SP_DEFENSE_UP 19 #define HOLD_EFFECT_CRITICAL_UP 20 #define HOLD_EFFECT_RANDOM_STAT_UP 21 #define HOLD_EFFECT_EVASION_UP 22 #define HOLD_EFFECT_RESTORE_STATS 23 #define HOLD_EFFECT_MACHO_BRACE 24 #define HOLD_EFFECT_EXP_SHARE 25 #define HOLD_EFFECT_QUICK_CLAW 26 #define HOLD_EFFECT_FRIENDSHIP_UP 27 #define HOLD_EFFECT_CURE_ATTRACT 28 #define HOLD_EFFECT_CHOICE_BAND 29 #define HOLD_EFFECT_FLINCH 30 #define HOLD_EFFECT_BUG_POWER 31 #define HOLD_EFFECT_DOUBLE_PRIZE 32 #define HOLD_EFFECT_REPEL 33 #define HOLD_EFFECT_SOUL_DEW 34 #define HOLD_EFFECT_DEEP_SEA_TOOTH 35 #define HOLD_EFFECT_DEEP_SEA_SCALE 36 #define HOLD_EFFECT_CAN_ALWAYS_RUN 37 #define HOLD_EFFECT_PREVENT_EVOLVE 38 #define HOLD_EFFECT_FOCUS_BAND 39 #define HOLD_EFFECT_LUCKY_EGG 40 #define HOLD_EFFECT_SCOPE_LENS 41 #define HOLD_EFFECT_STEEL_POWER 42 #define HOLD_EFFECT_LEFTOVERS 43 #define HOLD_EFFECT_DRAGON_SCALE 44 #define HOLD_EFFECT_LIGHT_BALL 45 #define HOLD_EFFECT_GROUND_POWER 46 #define HOLD_EFFECT_ROCK_POWER 47 #define HOLD_EFFECT_GRASS_POWER 48 #define HOLD_EFFECT_DARK_POWER 49 #define HOLD_EFFECT_FIGHTING_POWER 50 #define HOLD_EFFECT_ELECTRIC_POWER 51 #define HOLD_EFFECT_WATER_POWER 52 #define HOLD_EFFECT_FLYING_POWER 53 #define HOLD_EFFECT_POISON_POWER 54 #define HOLD_EFFECT_ICE_POWER 55 #define HOLD_EFFECT_GHOST_POWER 56 #define HOLD_EFFECT_PSYCHIC_POWER 57 #define HOLD_EFFECT_FIRE_POWER 58 #define HOLD_EFFECT_DRAGON_POWER 59 #define HOLD_EFFECT_NORMAL_POWER 60 #define HOLD_EFFECT_UP_GRADE 61 #define HOLD_EFFECT_SHELL_BELL 62 #define HOLD_EFFECT_LUCKY_PUNCH 63 #define HOLD_EFFECT_METAL_POWDER 64 #define HOLD_EFFECT_THICK_CLUB 65 #define HOLD_EFFECT_STICK 66 #endif // GUARD_HOLD_EFFECTS_H ================================================ FILE: include/constants/item_effects.h ================================================ #ifndef GUARD_CONSTANTS_ITEM_EFFECTS_H #define GUARD_CONSTANTS_ITEM_EFFECTS_H // field 0 masks #define ITEM0_X_ATTACK 0x0F #define ITEM0_DIRE_HIT 0x30 // Works the same way as move Focus Energy. #define ITEM0_SACRED_ASH 0x40 #define ITEM0_INFATUATION 0x80 // field 1 masks #define ITEM1_X_SPEED 0x0F #define ITEM1_X_DEFEND 0xF0 // field 2 masks #define ITEM2_X_SPATK 0x0F #define ITEM2_X_ACCURACY 0xF0 // field 3 masks #define ITEM3_CONFUSION 0x1 #define ITEM3_PARALYSIS 0x2 #define ITEM3_FREEZE 0x4 #define ITEM3_BURN 0x8 #define ITEM3_POISON 0x10 #define ITEM3_SLEEP 0x20 #define ITEM3_LEVEL_UP 0x40 #define ITEM3_GUARD_SPEC 0x80 // Works the same way as the move Mist. #define ITEM3_STATUS_ALL (ITEM3_CONFUSION | ITEM3_PARALYSIS | ITEM3_FREEZE | ITEM3_BURN | ITEM3_POISON | ITEM3_SLEEP) // field 4 masks #define ITEM4_EV_HP 0x1 #define ITEM4_EV_ATK 0x2 #define ITEM4_HEAL_HP 0x4 #define ITEM4_HEAL_PP_ALL 0x8 #define ITEM4_HEAL_PP_ONE 0x10 #define ITEM4_PP_UP 0x20 #define ITEM4_REVIVE 0x40 #define ITEM4_EVO_STONE 0x80 // field 5 masks #define ITEM5_EV_DEF 0x1 #define ITEM5_EV_SPEED 0x2 #define ITEM5_EV_SPDEF 0x4 #define ITEM5_EV_SPATK 0x8 #define ITEM5_PP_MAX 0x10 #define ITEM5_FRIENDSHIP_LOW 0x20 #define ITEM5_FRIENDSHIP_MID 0x40 #define ITEM5_FRIENDSHIP_HIGH 0x80 #define ITEM5_FRIENDSHIP_ALL (ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID | ITEM5_FRIENDSHIP_HIGH) // fields 6 and onwards are item-specific arguments #define ITEM_EFFECT_ARG_START 6 // Special HP recovery amounts for ITEM4_HEAL_HP #define ITEM6_HEAL_HP_FULL ((u8) -1) #define ITEM6_HEAL_HP_HALF ((u8) -2) #define ITEM6_HEAL_HP_LVL_UP ((u8) -3) // Special PP recovery amounts for ITEM4_HEAL_PP #define ITEM6_HEAL_PP_FULL 0x7F // Amount of EV modified by ITEM4_EV_HP, ITEM4_EV_ATK, ITEM5_EV_DEF, ITEM5_EV_SPEED, ITEM5_EV_SPDEF and ITEM5_EV_SPATK #define ITEM6_ADD_EV 10 #define ITEM6_SUBTRACT_EV -10 // Used for GetItemEffectType. #define ITEM_EFFECT_X_ITEM 0 #define ITEM_EFFECT_RAISE_LEVEL 1 #define ITEM_EFFECT_HEAL_HP 2 #define ITEM_EFFECT_CURE_POISON 3 #define ITEM_EFFECT_CURE_SLEEP 4 #define ITEM_EFFECT_CURE_BURN 5 #define ITEM_EFFECT_CURE_FREEZE 6 #define ITEM_EFFECT_CURE_PARALYSIS 7 #define ITEM_EFFECT_CURE_CONFUSION 8 #define ITEM_EFFECT_CURE_INFATUATION 9 #define ITEM_EFFECT_SACRED_ASH 10 #define ITEM_EFFECT_CURE_ALL_STATUS 11 #define ITEM_EFFECT_ATK_EV 12 #define ITEM_EFFECT_HP_EV 13 #define ITEM_EFFECT_SPATK_EV 14 #define ITEM_EFFECT_SPDEF_EV 15 #define ITEM_EFFECT_SPEED_EV 16 #define ITEM_EFFECT_DEF_EV 17 #define ITEM_EFFECT_EVO_STONE 18 #define ITEM_EFFECT_PP_UP 19 #define ITEM_EFFECT_PP_MAX 20 #define ITEM_EFFECT_HEAL_PP 21 #define ITEM_EFFECT_NONE 22 #endif // GUARD_CONSTANTS_ITEM_EFFECTS_H ================================================ FILE: include/constants/item_menu.h ================================================ #ifndef GUARD_CONSTANTS_ITEM_MENU_H #define GUARD_CONSTANTS_ITEM_MENU_H #define OPEN_BAG_ITEMS 0 #define OPEN_BAG_KEYITEMS 1 #define OPEN_BAG_POKEBALLS 2 #define OPEN_BAG_LAST 3 #define ITEMMENULOCATION_FIELD 0 #define ITEMMENULOCATION_PARTY 1 #define ITEMMENULOCATION_SHOP 2 #define ITEMMENULOCATION_ITEMPC 3 #define ITEMMENULOCATION_PCBOX 4 #define ITEMMENULOCATION_BATTLE 5 #define ITEMMENULOCATION_OLD_MAN 6 #define ITEMMENULOCATION_TTVSCR_STATUS 7 #define ITEMMENULOCATION_TTVSCR_CATCHING 8 #define ITEMMENULOCATION_TTVSCR_REGISTER 9 #define ITEMMENULOCATION_TTVSCR_TMS 10 #define ITEMMENULOCATION_LAST 11 #define ITEMMENUACTION_USE 0 #define ITEMMENUACTION_TOSS 1 #define ITEMMENUACTION_REGISTER 2 #define ITEMMENUACTION_GIVE 3 #define ITEMMENUACTION_CANCEL 4 #define ITEMMENUACTION_BATTLE_USE 5 #define ITEMMENUACTION_CHECK 6 #define ITEMMENUACTION_OPEN 7 #define ITEMMENUACTION_OPEN_BERRIES 8 #define ITEMMENUACTION_WALK 9 #define ITEMMENUACTION_DESELECT 10 #define ITEMMENUACTION_BY_NAME 11 #define ITEMMENUACTION_BY_TYPE 12 #define ITEMMENUACTION_BY_AMOUNT 13 #define ITEMMENUACTION_BY_NUMBER 14 #define ITEMMENUACTION_DUMMY 15 #endif //GUARD_CONSTANTS_ITEM_MENU_H ================================================ FILE: include/constants/items.h ================================================ #ifndef GUARD_CONSTANTS_ITEMS_H #define GUARD_CONSTANTS_ITEMS_H #define ITEM_NONE 0 #define ITEM_MASTER_BALL 1 #define ITEM_ULTRA_BALL 2 #define ITEM_GREAT_BALL 3 #define ITEM_POKE_BALL 4 #define ITEM_SAFARI_BALL 5 #define ITEM_NET_BALL 6 #define ITEM_DIVE_BALL 7 #define ITEM_NEST_BALL 8 #define ITEM_REPEAT_BALL 9 #define ITEM_TIMER_BALL 10 #define ITEM_LUXURY_BALL 11 #define ITEM_PREMIER_BALL 12 #define ITEM_POTION 13 #define ITEM_ANTIDOTE 14 #define ITEM_BURN_HEAL 15 #define ITEM_ICE_HEAL 16 #define ITEM_AWAKENING 17 #define ITEM_PARALYZE_HEAL 18 #define ITEM_FULL_RESTORE 19 #define ITEM_MAX_POTION 20 #define ITEM_HYPER_POTION 21 #define ITEM_SUPER_POTION 22 #define ITEM_FULL_HEAL 23 #define ITEM_REVIVE 24 #define ITEM_MAX_REVIVE 25 #define ITEM_FRESH_WATER 26 #define ITEM_SODA_POP 27 #define ITEM_LEMONADE 28 #define ITEM_MOOMOO_MILK 29 #define ITEM_ENERGY_POWDER 30 #define ITEM_ENERGY_ROOT 31 #define ITEM_HEAL_POWDER 32 #define ITEM_REVIVAL_HERB 33 #define ITEM_ETHER 34 #define ITEM_MAX_ETHER 35 #define ITEM_ELIXIR 36 #define ITEM_MAX_ELIXIR 37 #define ITEM_LAVA_COOKIE 38 #define ITEM_BLUE_FLUTE 39 #define ITEM_YELLOW_FLUTE 40 #define ITEM_RED_FLUTE 41 #define ITEM_BLACK_FLUTE 42 #define ITEM_WHITE_FLUTE 43 #define ITEM_BERRY_JUICE 44 #define ITEM_SACRED_ASH 45 #define ITEM_SHOAL_SALT 46 #define ITEM_SHOAL_SHELL 47 #define ITEM_RED_SHARD 48 #define ITEM_BLUE_SHARD 49 #define ITEM_YELLOW_SHARD 50 #define ITEM_GREEN_SHARD 51 #define ITEM_034 52 #define ITEM_035 53 #define ITEM_036 54 #define ITEM_037 55 #define ITEM_038 56 #define ITEM_039 57 #define ITEM_03A 58 #define ITEM_03B 59 #define ITEM_03C 60 #define ITEM_03D 61 #define ITEM_03E 62 #define ITEM_HP_UP 63 #define ITEM_PROTEIN 64 #define ITEM_IRON 65 #define ITEM_CARBOS 66 #define ITEM_CALCIUM 67 #define ITEM_RARE_CANDY 68 #define ITEM_PP_UP 69 #define ITEM_ZINC 70 #define ITEM_PP_MAX 71 #define ITEM_048 72 #define ITEM_GUARD_SPEC 73 #define ITEM_DIRE_HIT 74 #define ITEM_X_ATTACK 75 #define ITEM_X_DEFEND 76 #define ITEM_X_SPEED 77 #define ITEM_X_ACCURACY 78 #define ITEM_X_SPECIAL 79 #define ITEM_POKE_DOLL 80 #define ITEM_FLUFFY_TAIL 81 #define ITEM_052 82 #define ITEM_SUPER_REPEL 83 #define ITEM_MAX_REPEL 84 #define ITEM_ESCAPE_ROPE 85 #define ITEM_REPEL 86 #define ITEM_057 87 #define ITEM_058 88 #define ITEM_059 89 #define ITEM_05A 90 #define ITEM_05B 91 #define ITEM_05C 92 #define ITEM_SUN_STONE 93 #define ITEM_MOON_STONE 94 #define ITEM_FIRE_STONE 95 #define ITEM_THUNDER_STONE 96 #define ITEM_WATER_STONE 97 #define ITEM_LEAF_STONE 98 #define ITEM_063 99 #define ITEM_064 100 #define ITEM_065 101 #define ITEM_066 102 #define ITEM_TINY_MUSHROOM 103 #define ITEM_BIG_MUSHROOM 104 #define ITEM_069 105 #define ITEM_PEARL 106 #define ITEM_BIG_PEARL 107 #define ITEM_STARDUST 108 #define ITEM_STAR_PIECE 109 #define ITEM_NUGGET 110 #define ITEM_HEART_SCALE 111 #define ITEM_LINK_BRACELET 112 #define ITEM_071 113 #define ITEM_072 114 #define ITEM_073 115 #define ITEM_074 116 #define ITEM_075 117 #define ITEM_076 118 #define ITEM_077 119 #define ITEM_078 120 #define ITEM_ORANGE_MAIL 121 #define ITEM_HARBOR_MAIL 122 #define ITEM_GLITTER_MAIL 123 #define ITEM_MECH_MAIL 124 #define ITEM_WOOD_MAIL 125 #define ITEM_WAVE_MAIL 126 #define ITEM_BEAD_MAIL 127 #define ITEM_SHADOW_MAIL 128 #define ITEM_TROPIC_MAIL 129 #define ITEM_DREAM_MAIL 130 #define ITEM_FAB_MAIL 131 #define ITEM_RETRO_MAIL 132 #define ITEM_CHERI_BERRY 133 #define ITEM_CHESTO_BERRY 134 #define ITEM_PECHA_BERRY 135 #define ITEM_RAWST_BERRY 136 #define ITEM_ASPEAR_BERRY 137 #define ITEM_LEPPA_BERRY 138 #define ITEM_ORAN_BERRY 139 #define ITEM_PERSIM_BERRY 140 #define ITEM_LUM_BERRY 141 #define ITEM_SITRUS_BERRY 142 #define ITEM_FIGY_BERRY 143 #define ITEM_WIKI_BERRY 144 #define ITEM_MAGO_BERRY 145 #define ITEM_AGUAV_BERRY 146 #define ITEM_IAPAPA_BERRY 147 #define ITEM_RAZZ_BERRY 148 #define ITEM_BLUK_BERRY 149 #define ITEM_NANAB_BERRY 150 #define ITEM_WEPEAR_BERRY 151 #define ITEM_PINAP_BERRY 152 #define ITEM_POMEG_BERRY 153 #define ITEM_KELPSY_BERRY 154 #define ITEM_QUALOT_BERRY 155 #define ITEM_HONDEW_BERRY 156 #define ITEM_GREPA_BERRY 157 #define ITEM_TAMATO_BERRY 158 #define ITEM_CORNN_BERRY 159 #define ITEM_MAGOST_BERRY 160 #define ITEM_RABUTA_BERRY 161 #define ITEM_NOMEL_BERRY 162 #define ITEM_SPELON_BERRY 163 #define ITEM_PAMTRE_BERRY 164 #define ITEM_WATMEL_BERRY 165 #define ITEM_DURIN_BERRY 166 #define ITEM_BELUE_BERRY 167 #define ITEM_LIECHI_BERRY 168 #define ITEM_GANLON_BERRY 169 #define ITEM_SALAC_BERRY 170 #define ITEM_PETAYA_BERRY 171 #define ITEM_APICOT_BERRY 172 #define ITEM_LANSAT_BERRY 173 #define ITEM_STARF_BERRY 174 #define ITEM_ENIGMA_BERRY 175 #define FIRST_BERRY_INDEX ITEM_CHERI_BERRY #define LAST_BERRY_INDEX ITEM_ENIGMA_BERRY #define ITEM_UNUSED_BERRY_1 176 #define ITEM_UNUSED_BERRY_2 177 #define ITEM_UNUSED_BERRY_3 178 #define MAX_BERRY_INDEX ITEM_UNUSED_BERRY_3 #define ITEM_BRIGHT_POWDER 179 #define ITEM_WHITE_HERB 180 #define ITEM_MACHO_BRACE 181 #define ITEM_EXP_SHARE 182 #define ITEM_QUICK_CLAW 183 #define ITEM_SOOTHE_BELL 184 #define ITEM_MENTAL_HERB 185 #define ITEM_CHOICE_BAND 186 #define ITEM_KINGS_ROCK 187 #define ITEM_SILVER_POWDER 188 #define ITEM_AMULET_COIN 189 #define ITEM_CLEANSE_TAG 190 #define ITEM_SOUL_DEW 191 #define ITEM_DEEP_SEA_TOOTH 192 #define ITEM_DEEP_SEA_SCALE 193 #define ITEM_SMOKE_BALL 194 #define ITEM_EVERSTONE 195 #define ITEM_FOCUS_BAND 196 #define ITEM_LUCKY_EGG 197 #define ITEM_SCOPE_LENS 198 #define ITEM_METAL_COAT 199 #define ITEM_LEFTOVERS 200 #define ITEM_DRAGON_SCALE 201 #define ITEM_LIGHT_BALL 202 #define ITEM_SOFT_SAND 203 #define ITEM_HARD_STONE 204 #define ITEM_MIRACLE_SEED 205 #define ITEM_BLACK_GLASSES 206 #define ITEM_BLACK_BELT 207 #define ITEM_MAGNET 208 #define ITEM_MYSTIC_WATER 209 #define ITEM_SHARP_BEAK 210 #define ITEM_POISON_BARB 211 #define ITEM_NEVER_MELT_ICE 212 #define ITEM_SPELL_TAG 213 #define ITEM_TWISTED_SPOON 214 #define ITEM_CHARCOAL 215 #define ITEM_DRAGON_FANG 216 #define ITEM_SILK_SCARF 217 #define ITEM_UP_GRADE 218 #define ITEM_SHELL_BELL 219 #define ITEM_SEA_INCENSE 220 #define ITEM_LAX_INCENSE 221 #define ITEM_LUCKY_PUNCH 222 #define ITEM_METAL_POWDER 223 #define ITEM_THICK_CLUB 224 #define ITEM_STICK 225 #define ITEM_0E2 226 #define ITEM_0E3 227 #define ITEM_0E4 228 #define ITEM_0E5 229 #define ITEM_0E6 230 #define ITEM_0E7 231 #define ITEM_0E8 232 #define ITEM_0E9 233 #define ITEM_0EA 234 #define ITEM_0EB 235 #define ITEM_0EC 236 #define ITEM_0ED 237 #define ITEM_0EE 238 #define ITEM_0EF 239 #define ITEM_0F0 240 #define ITEM_0F1 241 #define ITEM_0F2 242 #define ITEM_0F3 243 #define ITEM_0F4 244 #define ITEM_0F5 245 #define ITEM_0F6 246 #define ITEM_0F7 247 #define ITEM_0F8 248 #define ITEM_0F9 249 #define ITEM_0FA 250 #define ITEM_0FB 251 #define ITEM_0FC 252 #define ITEM_0FD 253 #define ITEM_RED_SCARF 254 #define ITEM_BLUE_SCARF 255 #define ITEM_PINK_SCARF 256 #define ITEM_GREEN_SCARF 257 #define ITEM_YELLOW_SCARF 258 #define ITEM_MACH_BIKE 259 #define ITEM_COIN_CASE 260 #define ITEM_ITEMFINDER 261 #define ITEM_OLD_ROD 262 #define ITEM_GOOD_ROD 263 #define ITEM_SUPER_ROD 264 #define ITEM_SS_TICKET 265 #define ITEM_CONTEST_PASS 266 #define ITEM_10B 267 #define ITEM_WAILMER_PAIL 268 #define ITEM_DEVON_GOODS 269 #define ITEM_SOOT_SACK 270 #define ITEM_BASEMENT_KEY 271 #define ITEM_ACRO_BIKE 272 #define ITEM_POKEBLOCK_CASE 273 #define ITEM_LETTER 274 #define ITEM_EON_TICKET 275 #define ITEM_RED_ORB 276 #define ITEM_BLUE_ORB 277 #define ITEM_SCANNER 278 #define ITEM_GO_GOGGLES 279 #define ITEM_METEORITE 280 #define ITEM_ROOM_1_KEY 281 #define ITEM_ROOM_2_KEY 282 #define ITEM_ROOM_4_KEY 283 #define ITEM_ROOM_6_KEY 284 #define ITEM_STORAGE_KEY 285 #define ITEM_ROOT_FOSSIL 286 #define ITEM_CLAW_FOSSIL 287 #define ITEM_DEVON_SCOPE 288 #define ITEM_TM01 289 #define ITEM_TM02 290 #define ITEM_TM03 291 #define ITEM_TM04 292 #define ITEM_TM05 293 #define ITEM_TM06 294 #define ITEM_TM07 295 #define ITEM_TM08 296 #define ITEM_TM09 297 #define ITEM_TM10 298 #define ITEM_TM11 299 #define ITEM_TM12 300 #define ITEM_TM13 301 #define ITEM_TM14 302 #define ITEM_TM15 303 #define ITEM_TM16 304 #define ITEM_TM17 305 #define ITEM_TM18 306 #define ITEM_TM19 307 #define ITEM_TM20 308 #define ITEM_TM21 309 #define ITEM_TM22 310 #define ITEM_TM23 311 #define ITEM_TM24 312 #define ITEM_TM25 313 #define ITEM_TM26 314 #define ITEM_TM27 315 #define ITEM_TM28 316 #define ITEM_TM29 317 #define ITEM_TM30 318 #define ITEM_TM31 319 #define ITEM_TM32 320 #define ITEM_TM33 321 #define ITEM_TM34 322 #define ITEM_TM35 323 #define ITEM_TM36 324 #define ITEM_TM37 325 #define ITEM_TM38 326 #define ITEM_TM39 327 #define ITEM_TM40 328 #define ITEM_TM41 329 #define ITEM_TM42 330 #define ITEM_TM43 331 #define ITEM_TM44 332 #define ITEM_TM45 333 #define ITEM_TM46 334 #define ITEM_TM47 335 #define ITEM_TM48 336 #define ITEM_TM49 337 #define ITEM_TM50 338 #define ITEM_HM01 339 #define ITEM_HM02 340 #define ITEM_HM03 341 #define ITEM_HM04 342 #define ITEM_HM05 343 #define ITEM_HM06 344 #define ITEM_HM07 345 #define ITEM_HM08 346 #define ITEM_15B 347 #define ITEM_15C 348 #define ITEM_TM01_FOCUS_PUNCH ITEM_TM01 #define ITEM_TM02_DRAGON_CLAW ITEM_TM02 #define ITEM_TM03_WATER_PULSE ITEM_TM03 #define ITEM_TM04_CALM_MIND ITEM_TM04 #define ITEM_TM05_ROAR ITEM_TM05 #define ITEM_TM06_TOXIC ITEM_TM06 #define ITEM_TM07_HAIL ITEM_TM07 #define ITEM_TM08_BULK_UP ITEM_TM08 #define ITEM_TM09_BULLET_SEED ITEM_TM09 #define ITEM_TM10_HIDDEN_POWER ITEM_TM10 #define ITEM_TM11_SUNNY_DAY ITEM_TM11 #define ITEM_TM12_TAUNT ITEM_TM12 #define ITEM_TM13_ICE_BEAM ITEM_TM13 #define ITEM_TM14_BLIZZARD ITEM_TM14 #define ITEM_TM15_HYPER_BEAM ITEM_TM15 #define ITEM_TM16_LIGHT_SCREEN ITEM_TM16 #define ITEM_TM17_PROTECT ITEM_TM17 #define ITEM_TM18_RAIN_DANCE ITEM_TM18 #define ITEM_TM19_GIGA_DRAIN ITEM_TM19 #define ITEM_TM20_SAFEGUARD ITEM_TM20 #define ITEM_TM21_FRUSTRATION ITEM_TM21 #define ITEM_TM22_SOLAR_BEAM ITEM_TM22 #define ITEM_TM23_IRON_TAIL ITEM_TM23 #define ITEM_TM24_THUNDERBOLT ITEM_TM24 #define ITEM_TM25_THUNDER ITEM_TM25 #define ITEM_TM26_EARTHQUAKE ITEM_TM26 #define ITEM_TM27_RETURN ITEM_TM27 #define ITEM_TM28_DIG ITEM_TM28 #define ITEM_TM29_PSYCHIC ITEM_TM29 #define ITEM_TM30_SHADOW_BALL ITEM_TM30 #define ITEM_TM31_BRICK_BREAK ITEM_TM31 #define ITEM_TM32_DOUBLE_TEAM ITEM_TM32 #define ITEM_TM33_REFLECT ITEM_TM33 #define ITEM_TM34_SHOCK_WAVE ITEM_TM34 #define ITEM_TM35_FLAMETHROWER ITEM_TM35 #define ITEM_TM36_SLUDGE_BOMB ITEM_TM36 #define ITEM_TM37_SANDSTORM ITEM_TM37 #define ITEM_TM38_FIRE_BLAST ITEM_TM38 #define ITEM_TM39_ROCK_TOMB ITEM_TM39 #define ITEM_TM40_AERIAL_ACE ITEM_TM40 #define ITEM_TM41_TORMENT ITEM_TM41 #define ITEM_TM42_FACADE ITEM_TM42 #define ITEM_TM43_SECRET_POWER ITEM_TM43 #define ITEM_TM44_REST ITEM_TM44 #define ITEM_TM45_ATTRACT ITEM_TM45 #define ITEM_TM46_THIEF ITEM_TM46 #define ITEM_TM47_STEEL_WING ITEM_TM47 #define ITEM_TM48_SKILL_SWAP ITEM_TM48 #define ITEM_TM49_SNATCH ITEM_TM49 #define ITEM_TM50_OVERHEAT ITEM_TM50 #define ITEM_HM01_CUT ITEM_HM01 #define ITEM_HM02_FLY ITEM_HM02 #define ITEM_HM03_SURF ITEM_HM03 #define ITEM_HM04_STRENGTH ITEM_HM04 #define ITEM_HM05_FLASH ITEM_HM05 #define ITEM_HM06_ROCK_SMASH ITEM_HM06 #define ITEM_HM07_WATERFALL ITEM_HM07 #define ITEM_HM08_DIVE ITEM_HM08 // FireRed/LeafGreen #define ITEM_OAKS_PARCEL 349 #define ITEM_POKE_FLUTE 350 #define ITEM_SECRET_KEY 351 #define ITEM_BIKE_VOUCHER 352 #define ITEM_GOLD_TEETH 353 #define ITEM_OLD_AMBER 354 #define ITEM_CARD_KEY 355 #define ITEM_LIFT_KEY 356 #define ITEM_HELIX_FOSSIL 357 #define ITEM_DOME_FOSSIL 358 #define ITEM_SILPH_SCOPE 359 #define ITEM_BICYCLE 360 #define ITEM_TOWN_MAP 361 #define ITEM_VS_SEEKER 362 #define ITEM_FAME_CHECKER 363 #define ITEM_TM_CASE 364 #define ITEM_BERRY_POUCH 365 #define ITEM_TEACHY_TV 366 #define ITEM_TRI_PASS 367 #define ITEM_RAINBOW_PASS 368 #define ITEM_TEA 369 #define ITEM_MYSTIC_TICKET 370 #define ITEM_AURORA_TICKET 371 #define ITEM_POWDER_JAR 372 #define ITEM_RUBY 373 #define ITEM_SAPPHIRE 374 // Emerald #define ITEM_MAGMA_EMBLEM 375 #define ITEM_OLD_SEA_MAP 376 #define ITEMS_COUNT 377 #define ITEM_TO_BERRY(itemId)(((itemId - FIRST_BERRY_INDEX) + 1)) #define MAIL_NONE 0xFF #define NUM_TECHNICAL_MACHINES 50 #define NUM_HIDDEN_MACHINES 8 // Secondary IDs for rods #define OLD_ROD 0 #define GOOD_ROD 1 #define SUPER_ROD 2 // Check if the item is one that can be used on a Pokemon. #define IS_POKEMON_ITEM(item) ((item) >= ITEM_POTION && (item) <= MAX_BERRY_INDEX) #endif // GUARD_CONSTANTS_ITEMS_H ================================================ FILE: include/constants/layouts.h ================================================ #ifndef GUARD_CONSTANTS_LAYOUTS_H #define GUARD_CONSTANTS_LAYOUTS_H // // DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json // #define LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_1F 1 #define LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_2F 2 #define LAYOUT_PALLET_TOWN_RIVALS_HOUSE 3 #define LAYOUT_LITTLEROOT_TOWN_MAYS_HOUSE_2F 4 #define LAYOUT_PALLET_TOWN_PROFESSOR_OAKS_LAB 5 #define LAYOUT_HOUSE1 6 #define LAYOUT_HOUSE2 7 #define LAYOUT_POKEMON_CENTER_1F 8 #define LAYOUT_POKEMON_CENTER_2F 9 #define LAYOUT_MART 10 #define LAYOUT_HOUSE3 11 #define LAYOUT_CERULEAN_CITY_GYM 12 #define LAYOUT_HOUSE4 13 #define LAYOUT_LAVARIDGE_TOWN_HERB_SHOP 14 #define LAYOUT_CELADON_CITY_GYM 15 #define LAYOUT_RS_POKEMON_CENTER_1F 16 #define LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE 17 #define LAYOUT_PACIFIDLOG_TOWN_HOUSE1 18 #define LAYOUT_PACIFIDLOG_TOWN_HOUSE2 19 #define LAYOUT_FUCHSIA_CITY_GYM 20 #define LAYOUT_HOUSE5 21 #define LAYOUT_UNUSED1 22 #define LAYOUT_VERMILION_CITY_GYM 23 #define LAYOUT_CERULEAN_CITY_BIKE_SHOP 24 #define LAYOUT_CELADON_CITY_GAME_CORNER 25 #define LAYOUT_PEWTER_CITY_GYM 26 #define LAYOUT_FOUR_ISLAND_LORELEIS_HOUSE 27 #define LAYOUT_THREE_ISLAND_HOUSE1 28 #define LAYOUT_RUSTBORO_CITY_CUTTERS_HOUSE 29 #define LAYOUT_FORTREE_CITY_HOUSE1 30 #define LAYOUT_SAFFRON_CITY_GYM 31 #define LAYOUT_FORTREE_CITY_HOUSE2 32 #define LAYOUT_CINNABAR_ISLAND_GYM 33 #define LAYOUT_VIRIDIAN_CITY_GYM 34 #define LAYOUT_RS_SAFARI_ZONE_ENTRANCE 35 #define LAYOUT_BATTLE_COLOSSEUM_2P 36 #define LAYOUT_TRADE_CENTER 37 #define LAYOUT_RECORD_CORNER 38 #define LAYOUT_BATTLE_COLOSSEUM_4P 39 #define LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE 40 #define LAYOUT_RS_SAFARI_ZONE_NORTHEAST 41 #define LAYOUT_RS_SAFARI_ZONE_SOUTHWEST 42 #define LAYOUT_RS_SAFARI_ZONE_SOUTHEAST 43 #define LAYOUT_FORTREE_CITY_DECORATION_SHOP 44 #define LAYOUT_RS_BATTLE_TOWER 45 #define LAYOUT_SS_TIDAL_CORRIDOR 46 #define LAYOUT_SS_TIDAL_LOWER_DECK 47 #define LAYOUT_SS_TIDAL_ROOMS 48 #define LAYOUT_RUSTBORO_CITY_FLAT2_1F 49 #define LAYOUT_RUSTBORO_CITY_FLAT2_2F 50 #define LAYOUT_RUSTBORO_CITY_FLAT2_3F 51 #define LAYOUT_EVER_GRANDE_CITY_HALL_OF_FAME 52 #define LAYOUT_MOSSDEEP_CITY_EREADER_TRAINER_HOUSE_1F 53 #define LAYOUT_MOSSDEEP_CITY_EREADER_TRAINER_HOUSE_2F 54 #define LAYOUT_SOOTOPOLIS_CITY_HOUSE1 55 #define LAYOUT_SOOTOPOLIS_CITY_HOUSE2 56 #define LAYOUT_SOOTOPOLIS_CITY_HOUSE3 57 #define LAYOUT_RUSTBORO_CITY_FLAT1_1F 58 #define LAYOUT_RUSTBORO_CITY_FLAT1_2F 59 #define LAYOUT_RS_SAFARI_ZONE_REST_HOUSE 60 #define LAYOUT_PALLET_TOWN 61 #define LAYOUT_VIRIDIAN_CITY 62 #define LAYOUT_PEWTER_CITY 63 #define LAYOUT_CERULEAN_CITY 64 #define LAYOUT_LAVENDER_TOWN 65 #define LAYOUT_VERMILION_CITY 66 #define LAYOUT_CELADON_CITY 67 #define LAYOUT_FUCHSIA_CITY 68 #define LAYOUT_CINNABAR_ISLAND 69 #define LAYOUT_INDIGO_PLATEAU_EXTERIOR 70 #define LAYOUT_SAFFRON_CITY_CONNECTION 71 #define LAYOUT_ROUTE1 72 #define LAYOUT_ROUTE2 73 #define LAYOUT_ROUTE3 74 #define LAYOUT_ROUTE4 75 #define LAYOUT_ROUTE5 76 #define LAYOUT_ROUTE6 77 #define LAYOUT_ROUTE7 78 #define LAYOUT_ROUTE8 79 #define LAYOUT_ROUTE9 80 #define LAYOUT_ROUTE10 81 #define LAYOUT_ROUTE11 82 #define LAYOUT_ROUTE12 83 #define LAYOUT_ROUTE13 84 #define LAYOUT_ROUTE14 85 #define LAYOUT_ROUTE15 86 #define LAYOUT_ROUTE16 87 #define LAYOUT_ROUTE17 88 #define LAYOUT_ROUTE18 89 #define LAYOUT_ROUTE19 90 #define LAYOUT_ROUTE20 91 #define LAYOUT_ROUTE21_NORTH 92 #define LAYOUT_ROUTE22 93 #define LAYOUT_ROUTE23 94 #define LAYOUT_ROUTE24 95 #define LAYOUT_ROUTE25 96 #define LAYOUT_MT_MOON_1F 97 #define LAYOUT_MT_MOON_B1F 98 #define LAYOUT_MT_MOON_B2F 99 #define LAYOUT_VIRIDIAN_FOREST 100 #define LAYOUT_SSANNE_EXTERIOR 101 #define LAYOUT_SSANNE_1F_CORRIDOR 102 #define LAYOUT_SSANNE_2F_CORRIDOR 103 #define LAYOUT_SSANNE_3F_CORRIDOR 104 #define LAYOUT_SSANNE_B1F_CORRIDOR 105 #define LAYOUT_SSANNE_DECK 106 #define LAYOUT_DIGLETTS_CAVE_B1F 107 #define LAYOUT_VICTORY_ROAD_1F 108 #define LAYOUT_VICTORY_ROAD_2F 109 #define LAYOUT_VICTORY_ROAD_3F 110 #define LAYOUT_ROCKET_HIDEOUT_B1F 111 #define LAYOUT_ROCKET_HIDEOUT_B2F 112 #define LAYOUT_ROCKET_HIDEOUT_B3F 113 #define LAYOUT_ROCKET_HIDEOUT_B4F 114 #define LAYOUT_SILPH_CO_1F 115 #define LAYOUT_SILPH_CO_2F 116 #define LAYOUT_SILPH_CO_3F 117 #define LAYOUT_SILPH_CO_4F 118 #define LAYOUT_SILPH_CO_5F 119 #define LAYOUT_SILPH_CO_6F 120 #define LAYOUT_SILPH_CO_7F 121 #define LAYOUT_SILPH_CO_8F 122 #define LAYOUT_SILPH_CO_9F 123 #define LAYOUT_SILPH_CO_10F 124 #define LAYOUT_SILPH_CO_11F 125 #define LAYOUT_POKEMON_MANSION_1F 126 #define LAYOUT_POKEMON_MANSION_2F 127 #define LAYOUT_POKEMON_MANSION_3F 128 #define LAYOUT_POKEMON_MANSION_B1F 129 #define LAYOUT_SAFARI_ZONE_CENTER 130 #define LAYOUT_SAFARI_ZONE_EAST 131 #define LAYOUT_SAFARI_ZONE_NORTH 132 #define LAYOUT_SAFARI_ZONE_WEST 133 #define LAYOUT_CERULEAN_CAVE_1F 134 #define LAYOUT_CERULEAN_CAVE_2F 135 #define LAYOUT_CERULEAN_CAVE_B1F 136 #define LAYOUT_ROCK_TUNNEL_1F 137 #define LAYOUT_ROCK_TUNNEL_B1F 138 #define LAYOUT_SEAFOAM_ISLANDS_1F 139 #define LAYOUT_SEAFOAM_ISLANDS_B1F 140 #define LAYOUT_SEAFOAM_ISLANDS_B2F 141 #define LAYOUT_SEAFOAM_ISLANDS_B3F 142 #define LAYOUT_SEAFOAM_ISLANDS_B4F 143 #define LAYOUT_POKEMON_TOWER_1F 144 #define LAYOUT_POKEMON_TOWER_2F 145 #define LAYOUT_POKEMON_TOWER_3F 146 #define LAYOUT_POKEMON_TOWER_4F 147 #define LAYOUT_POKEMON_TOWER_5F 148 #define LAYOUT_POKEMON_TOWER_6F 149 #define LAYOUT_POKEMON_TOWER_7F 150 #define LAYOUT_POWER_PLANT 151 #define LAYOUT_ROUTE25_SEA_COTTAGE 152 #define LAYOUT_SSANNE_KITCHEN 153 #define LAYOUT_SSANNE_CAPTAINS_OFFICE 154 #define LAYOUT_UNDERGROUND_PATH_ENTRANCE 155 #define LAYOUT_UNDERGROUND_PATH_EAST_WEST_TUNNEL 156 #define LAYOUT_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL 157 #define LAYOUT_ROUTE12_NORTH_ENTRANCE_1F 158 #define LAYOUT_SSANNE_ROOM1 159 #define LAYOUT_SSANNE_ROOM2 160 #define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR 161 #define LAYOUT_PEWTER_CITY_MUSEUM_1F 162 #define LAYOUT_PEWTER_CITY_MUSEUM_2F 163 #define LAYOUT_CERULEAN_CITY_HOUSE2 164 #define LAYOUT_CERULEAN_CITY_HOUSE1 165 #define LAYOUT_CELADON_CITY_CONDOMINIUMS_1F 166 #define LAYOUT_CELADON_CITY_CONDOMINIUMS_2F 167 #define LAYOUT_CELADON_CITY_CONDOMINIUMS_3F 168 #define LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF 169 #define LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM 170 #define LAYOUT_CELADON_CITY_GAME_CORNER_PRIZE_ROOM 171 #define LAYOUT_CELADON_CITY_RESTAURANT 172 #define LAYOUT_CELADON_CITY_HOTEL 173 #define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_1F 174 #define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_2F 175 #define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_3F 176 #define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_4F 177 #define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_5F 178 #define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ROOF 179 #define LAYOUT_SAFARI_ZONE_REST_HOUSE 180 #define LAYOUT_SAFARI_ZONE_SECRET_HOUSE 181 #define LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_OFFICE 182 #define LAYOUT_FUCHSIA_CITY_WARDENS_HOUSE 183 #define LAYOUT_FUCHSIA_CITY_HOUSE2 184 #define LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE 185 #define LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE 186 #define LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM 187 #define LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM 188 #define LAYOUT_SAFFRON_CITY 189 #define LAYOUT_SAFFRON_CITY_NORTH_SOUTH_ENTRANCE 190 #define LAYOUT_SAFFRON_CITY_EAST_WEST_ENTRANCE 191 #define LAYOUT_DIGLETTS_CAVE_NORTH_ENTRANCE 192 #define LAYOUT_DIGLETTS_CAVE_SOUTH_ENTRANCE 193 #define LAYOUT_INDIGO_PLATEAU_POKEMON_CENTER_1F 194 #define LAYOUT_POKEMON_LEAGUE_LORELEIS_ROOM 195 #define LAYOUT_POKEMON_LEAGUE_BRUNOS_ROOM 196 #define LAYOUT_POKEMON_LEAGUE_AGATHAS_ROOM 197 #define LAYOUT_POKEMON_LEAGUE_LANCES_ROOM 198 #define LAYOUT_POKEMON_LEAGUE_CHAMPIONS_ROOM 199 #define LAYOUT_POKEMON_LEAGUE_HALL_OF_FAME 200 #define LAYOUT_ROUTE21_SOUTH 201 #define LAYOUT_ENTRANCE_2F 202 #define LAYOUT_ROUTE2_ENTRANCE 203 #define LAYOUT_ROUTE22_NORTH_ENTRANCE 204 #define LAYOUT_ROUTE16_NORTH_ENTRANCE_1F 205 #define LAYOUT_ENTRANCE_1F 206 #define LAYOUT_ROCKET_HIDEOUT_ELEVATOR 207 #define LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_1F 208 #define LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_2F 209 #define LAYOUT_SAFFRON_CITY_DOJO 210 #define LAYOUT_SILPH_CO_ELEVATOR 211 #define LAYOUT_ONE_ISLAND 212 #define LAYOUT_TWO_ISLAND 213 #define LAYOUT_THREE_ISLAND 214 #define LAYOUT_FOUR_ISLAND 215 #define LAYOUT_FIVE_ISLAND 216 #define LAYOUT_SEVEN_ISLAND 217 #define LAYOUT_SIX_ISLAND 218 #define LAYOUT_ONE_ISLAND_KINDLE_ROAD 219 #define LAYOUT_ONE_ISLAND_TREASURE_BEACH 220 #define LAYOUT_TWO_ISLAND_CAPE_BRINK 221 #define LAYOUT_THREE_ISLAND_BOND_BRIDGE 222 #define LAYOUT_THREE_ISLAND_PORT 223 #define LAYOUT_PROTOTYPE_SEVII_ISLE_6 224 #define LAYOUT_PROTOTYPE_SEVII_ISLE_7 225 #define LAYOUT_PROTOTYPE_SEVII_ISLE_8 226 #define LAYOUT_PROTOTYPE_SEVII_ISLE_9 227 #define LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS 228 #define LAYOUT_FIVE_ISLAND_WATER_LABYRINTH 229 #define LAYOUT_FIVE_ISLAND_MEADOW 230 #define LAYOUT_FIVE_ISLAND_MEMORIAL_PILLAR 231 #define LAYOUT_SIX_ISLAND_OUTCAST_ISLAND 232 #define LAYOUT_SIX_ISLAND_GREEN_PATH 233 #define LAYOUT_SIX_ISLAND_WATER_PATH 234 #define LAYOUT_SIX_ISLAND_RUIN_VALLEY 235 #define LAYOUT_SEVEN_ISLAND_TRAINER_TOWER 236 #define LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE 237 #define LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON 238 #define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS 239 #define LAYOUT_PROTOTYPE_SEVII_ISLE_22 240 #define LAYOUT_PROTOTYPE_SEVII_ISLE_23_EAST 241 #define LAYOUT_PROTOTYPE_SEVII_ISLE_23_WEST 242 #define LAYOUT_PROTOTYPE_SEVII_ISLE_24 243 #define LAYOUT_UNION_ROOM 244 #define LAYOUT_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB 245 #define LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1_DOOR_OPEN 246 #define LAYOUT_SEVEN_ISLAND_HOUSE_ROOM2 247 #define LAYOUT_VIRIDIAN_CITY_SCHOOL 248 #define LAYOUT_CELADON_CITY_RESTAURANT_DUPLICATE 249 #define LAYOUT_CELADON_CITY_HOTEL_DUPLICATE 250 #define LAYOUT_MT_EMBER_RUBY_PATH_B4F 251 #define LAYOUT_THREE_ISLAND_BERRY_FOREST 252 #define LAYOUT_ONE_ISLAND_POKEMON_CENTER_1F 253 #define LAYOUT_TWO_ISLAND_JOYFUL_GAME_CORNER 254 #define LAYOUT_VERMILION_CITY_POKEMON_FAN_CLUB 255 #define LAYOUT_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE 256 #define LAYOUT_ROUTE5_POKEMON_DAY_CARE 257 #define LAYOUT_VIRIDIAN_CITY_HOUSE 258 #define LAYOUT_FOUR_ISLAND_POKEMON_DAY_CARE 259 #define LAYOUT_SEAFOAM_ISLANDS_B3F_CURRENT_STOPPED 260 #define LAYOUT_SEAFOAM_ISLANDS_B4F_CURRENT_STOPPED 261 #define LAYOUT_MT_EMBER_EXTERIOR 262 #define LAYOUT_MT_EMBER_SUMMIT 263 #define LAYOUT_MT_EMBER_SUMMIT_PATH_1F 264 #define LAYOUT_MT_EMBER_SUMMIT_PATH_2F 265 #define LAYOUT_MT_EMBER_SUMMIT_PATH_3F 266 #define LAYOUT_MT_EMBER_RUBY_PATH_1F 267 #define LAYOUT_MT_EMBER_RUBY_PATH_B1F 268 #define LAYOUT_MT_EMBER_RUBY_PATH_B2F 269 #define LAYOUT_MT_EMBER_RUBY_PATH_B3F 270 #define LAYOUT_MT_EMBER_RUBY_PATH_B1F_STAIRS 271 #define LAYOUT_MT_EMBER_RUBY_PATH_B2F_STAIRS 272 #define LAYOUT_MT_EMBER_RUBY_PATH_B5F 273 #define LAYOUT_FIVE_ISLAND_ROCKET_WAREHOUSE 274 #define LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE 275 #define LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_1F 276 #define LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_B1F 277 #define LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_BACK 278 #define LAYOUT_TRAINER_TOWER_LOBBY 279 #define LAYOUT_TRAINER_TOWER_1F 280 #define LAYOUT_TRAINER_TOWER_2F 281 #define LAYOUT_TRAINER_TOWER_3F 282 #define LAYOUT_TRAINER_TOWER_4F 283 #define LAYOUT_TRAINER_TOWER_5F 284 #define LAYOUT_TRAINER_TOWER_6F 285 #define LAYOUT_TRAINER_TOWER_7F 286 #define LAYOUT_TRAINER_TOWER_8F 287 #define LAYOUT_TRAINER_TOWER_ROOF 288 #define LAYOUT_TRAINER_TOWER_ELEVATOR 289 #define LAYOUT_CERULEAN_CITY_HOUSE5 290 #define LAYOUT_SIX_ISLAND_DOTTED_HOLE_1F 291 #define LAYOUT_SIX_ISLAND_DOTTED_HOLE_B1F 292 #define LAYOUT_SIX_ISLAND_DOTTED_HOLE_B2F 293 #define LAYOUT_SIX_ISLAND_DOTTED_HOLE_B3F 294 #define LAYOUT_SIX_ISLAND_DOTTED_HOLE_B4F 295 #define LAYOUT_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM 296 #define LAYOUT_ISLAND_HARBOR 297 #define LAYOUT_ONE_ISLAND_POKEMON_CENTER_2F 298 #define LAYOUT_SIX_ISLAND_PATTERN_BUSH 299 #define LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL 300 #define LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL_DUG_OUT 301 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ENTRANCE 302 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM1 303 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM2 304 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM3 305 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM4 306 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM5 307 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM6 308 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM7 309 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM8 310 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM9 311 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM10 312 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM11 313 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM12 314 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM13 315 #define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM14 316 #define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER 317 #define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER 318 #define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER 319 #define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER 320 #define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER 321 #define LAYOUT_SIX_ISLAND_ALTERING_CAVE 322 #define LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY 323 #define LAYOUT_BIRTH_ISLAND_EXTERIOR 324 #define LAYOUT_NAVEL_ROCK_EXTERIOR 325 #define LAYOUT_NAVEL_ROCK_1F 326 #define LAYOUT_NAVEL_ROCK_SUMMIT 327 #define LAYOUT_NAVEL_ROCK_BASE 328 #define LAYOUT_NAVEL_ROCK_SUMMIT_PATH_2F 329 #define LAYOUT_NAVEL_ROCK_SUMMIT_PATH_3F 330 #define LAYOUT_NAVEL_ROCK_SUMMIT_PATH_4F 331 #define LAYOUT_NAVEL_ROCK_SUMMIT_PATH_5F 332 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B1F 333 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B2F 334 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B3F 335 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B4F 336 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B5F 337 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B6F 338 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B7F 339 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B8F 340 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B9F 341 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B10F 342 #define LAYOUT_NAVEL_ROCK_BASE_PATH_B11F 343 #define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER 344 #define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER 345 #define LAYOUT_NAVEL_ROCK_B1F 346 #define LAYOUT_NAVEL_ROCK_FORK 347 #define LAYOUT_TRAINER_TOWER_1F_DOUBLES 348 #define LAYOUT_TRAINER_TOWER_2F_DOUBLES 349 #define LAYOUT_TRAINER_TOWER_3F_DOUBLES 350 #define LAYOUT_TRAINER_TOWER_4F_DOUBLES 351 #define LAYOUT_TRAINER_TOWER_5F_DOUBLES 352 #define LAYOUT_TRAINER_TOWER_6F_DOUBLES 353 #define LAYOUT_TRAINER_TOWER_7F_DOUBLES 354 #define LAYOUT_TRAINER_TOWER_8F_DOUBLES 355 #define LAYOUT_TRAINER_TOWER_1F_KNOCKOUT 356 #define LAYOUT_TRAINER_TOWER_2F_KNOCKOUT 357 #define LAYOUT_TRAINER_TOWER_3F_KNOCKOUT 358 #define LAYOUT_TRAINER_TOWER_4F_KNOCKOUT 359 #define LAYOUT_TRAINER_TOWER_5F_KNOCKOUT 360 #define LAYOUT_TRAINER_TOWER_6F_KNOCKOUT 361 #define LAYOUT_TRAINER_TOWER_7F_KNOCKOUT 362 #define LAYOUT_TRAINER_TOWER_8F_KNOCKOUT 363 #define LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1 364 #define LAYOUT_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA 365 #define LAYOUT_FARAWAY_ISLAND_EXTERIOR 366 #define LAYOUT_FARAWAY_ISLAND_INTERIOR 367 #define LAYOUT_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP 368 #define LAYOUT_ROUTE20_UNDERWATER 369 #define LAYOUT_BATTLE_FRONTIER_OUTSIDE_WEST 370 #define LAYOUT_BATTLE_FRONTIER_OUTSIDE_EAST 371 #define LAYOUT_RS_BATTLE_TOWER_LOBBY 372 #define LAYOUT_RS_BATTLE_TOWER_ELEVATOR 373 #define LAYOUT_RS_BATTLE_TOWER_CORRIDOR 374 #define LAYOUT_RS_BATTLE_TOWER_BATTLE_ROOM 375 #define LAYOUT_SAFARI_ZONE_NORTH_WEST 376 #define LAYOUT_SAFARI_ZONE_NORTH_EAST 377 #define LAYOUT_THREE_ISLAND_BOND_BRIDGE_UNDERWATER 378 #define LAYOUT_ARTISAN_CAVE_B1F 379 #define LAYOUT_ARTISAN_CAVE_1F 380 #define LAYOUT_SOUTHERN_ISLAND_EXTERIOR 381 #define LAYOUT_SOUTHERN_ISLAND_INTERIOR 382 #define LAYOUT_CERULEAN_CAVE_1F_BLUE 383 #define LAYOUT_CERULEAN_CAVE_2F_BLUE 384 #define LAYOUT_CERULEAN_CAVE_B1F_BLUE 385 #define LAYOUT_CERULEAN_CAVE_1F_YELLOW 386 #define LAYOUT_CERULEAN_CAVE_2F_YELLOW 387 #define LAYOUT_CERULEAN_CAVE_B1F_YELLOW 388 #define LAYOUT_FOUR_ISLAND_BASE 389 #define LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION 390 #define LAYOUT_FOUR_ISLAND_CABLE_CAR_STATION 391 #define LAYOUT_BATTLE_FRONTIER_LOUNGE2 392 #define LAYOUT_BATTLE_FRONTIER_LOUNGE1 393 #define LAYOUT_BATTLE_FRONTIER_RECEPTION_GATE 394 #define LAYOUT_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER 395 #define LAYOUT_BATTLE_FRONTIER_SCOTTS_HOUSE 396 #define LAYOUT_BATTLE_FRONTIER_RANKING_HALL 397 #endif // GUARD_CONSTANTS_LAYOUTS_H ================================================ FILE: include/constants/map_groups.h ================================================ #ifndef GUARD_CONSTANTS_MAP_GROUPS_H #define GUARD_CONSTANTS_MAP_GROUPS_H // // DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json // // gMapGroup_Link #define MAP_BATTLE_COLOSSEUM_2P (0 | (0 << 8)) #define MAP_TRADE_CENTER (1 | (0 << 8)) #define MAP_RECORD_CORNER (2 | (0 << 8)) #define MAP_BATTLE_COLOSSEUM_4P (3 | (0 << 8)) #define MAP_UNION_ROOM (4 | (0 << 8)) // gMapGroup_Dungeons #define MAP_VIRIDIAN_FOREST (0 | (1 << 8)) #define MAP_MT_MOON_1F (1 | (1 << 8)) #define MAP_MT_MOON_B1F (2 | (1 << 8)) #define MAP_MT_MOON_B2F (3 | (1 << 8)) #define MAP_SSANNE_EXTERIOR (4 | (1 << 8)) #define MAP_SSANNE_1F_CORRIDOR (5 | (1 << 8)) #define MAP_SSANNE_2F_CORRIDOR (6 | (1 << 8)) #define MAP_SSANNE_3F_CORRIDOR (7 | (1 << 8)) #define MAP_SSANNE_B1F_CORRIDOR (8 | (1 << 8)) #define MAP_SSANNE_DECK (9 | (1 << 8)) #define MAP_SSANNE_KITCHEN (10 | (1 << 8)) #define MAP_SSANNE_CAPTAINS_OFFICE (11 | (1 << 8)) #define MAP_SSANNE_1F_ROOM1 (12 | (1 << 8)) #define MAP_SSANNE_1F_ROOM2 (13 | (1 << 8)) #define MAP_SSANNE_1F_ROOM3 (14 | (1 << 8)) #define MAP_SSANNE_1F_ROOM4 (15 | (1 << 8)) #define MAP_SSANNE_1F_ROOM5 (16 | (1 << 8)) #define MAP_SSANNE_1F_ROOM7 (17 | (1 << 8)) #define MAP_SSANNE_2F_ROOM1 (18 | (1 << 8)) #define MAP_SSANNE_2F_ROOM2 (19 | (1 << 8)) #define MAP_SSANNE_2F_ROOM3 (20 | (1 << 8)) #define MAP_SSANNE_2F_ROOM4 (21 | (1 << 8)) #define MAP_SSANNE_2F_ROOM5 (22 | (1 << 8)) #define MAP_SSANNE_2F_ROOM6 (23 | (1 << 8)) #define MAP_SSANNE_B1F_ROOM1 (24 | (1 << 8)) #define MAP_SSANNE_B1F_ROOM2 (25 | (1 << 8)) #define MAP_SSANNE_B1F_ROOM3 (26 | (1 << 8)) #define MAP_SSANNE_B1F_ROOM4 (27 | (1 << 8)) #define MAP_SSANNE_B1F_ROOM5 (28 | (1 << 8)) #define MAP_SSANNE_1F_ROOM6 (29 | (1 << 8)) #define MAP_UNDERGROUND_PATH_NORTH_ENTRANCE (30 | (1 << 8)) #define MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL (31 | (1 << 8)) #define MAP_UNDERGROUND_PATH_SOUTH_ENTRANCE (32 | (1 << 8)) #define MAP_UNDERGROUND_PATH_WEST_ENTRANCE (33 | (1 << 8)) #define MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL (34 | (1 << 8)) #define MAP_UNDERGROUND_PATH_EAST_ENTRANCE (35 | (1 << 8)) #define MAP_DIGLETTS_CAVE_NORTH_ENTRANCE (36 | (1 << 8)) #define MAP_DIGLETTS_CAVE_B1F (37 | (1 << 8)) #define MAP_DIGLETTS_CAVE_SOUTH_ENTRANCE (38 | (1 << 8)) #define MAP_VICTORY_ROAD_1F (39 | (1 << 8)) #define MAP_VICTORY_ROAD_2F (40 | (1 << 8)) #define MAP_VICTORY_ROAD_3F (41 | (1 << 8)) #define MAP_ROCKET_HIDEOUT_B1F (42 | (1 << 8)) #define MAP_ROCKET_HIDEOUT_B2F (43 | (1 << 8)) #define MAP_ROCKET_HIDEOUT_B3F (44 | (1 << 8)) #define MAP_ROCKET_HIDEOUT_B4F (45 | (1 << 8)) #define MAP_ROCKET_HIDEOUT_ELEVATOR (46 | (1 << 8)) #define MAP_SILPH_CO_1F (47 | (1 << 8)) #define MAP_SILPH_CO_2F (48 | (1 << 8)) #define MAP_SILPH_CO_3F (49 | (1 << 8)) #define MAP_SILPH_CO_4F (50 | (1 << 8)) #define MAP_SILPH_CO_5F (51 | (1 << 8)) #define MAP_SILPH_CO_6F (52 | (1 << 8)) #define MAP_SILPH_CO_7F (53 | (1 << 8)) #define MAP_SILPH_CO_8F (54 | (1 << 8)) #define MAP_SILPH_CO_9F (55 | (1 << 8)) #define MAP_SILPH_CO_10F (56 | (1 << 8)) #define MAP_SILPH_CO_11F (57 | (1 << 8)) #define MAP_SILPH_CO_ELEVATOR (58 | (1 << 8)) #define MAP_POKEMON_MANSION_1F (59 | (1 << 8)) #define MAP_POKEMON_MANSION_2F (60 | (1 << 8)) #define MAP_POKEMON_MANSION_3F (61 | (1 << 8)) #define MAP_POKEMON_MANSION_B1F (62 | (1 << 8)) #define MAP_SAFARI_ZONE_CENTER (63 | (1 << 8)) #define MAP_SAFARI_ZONE_EAST (64 | (1 << 8)) #define MAP_SAFARI_ZONE_NORTH (65 | (1 << 8)) #define MAP_SAFARI_ZONE_WEST (66 | (1 << 8)) #define MAP_SAFARI_ZONE_CENTER_REST_HOUSE (67 | (1 << 8)) #define MAP_SAFARI_ZONE_EAST_REST_HOUSE (68 | (1 << 8)) #define MAP_SAFARI_ZONE_NORTH_REST_HOUSE (69 | (1 << 8)) #define MAP_SAFARI_ZONE_WEST_REST_HOUSE (70 | (1 << 8)) #define MAP_SAFARI_ZONE_SECRET_HOUSE (71 | (1 << 8)) #define MAP_SAFARI_ZONE_NORTH_WEST (72 | (1 << 8)) #define MAP_SAFARI_ZONE_NORTH_EAST (73 | (1 << 8)) #define MAP_SAFARI_ZONE_NORTH_WEST_REST_HOUSE (74 | (1 << 8)) #define MAP_CERULEAN_CAVE_1F (75 | (1 << 8)) #define MAP_CERULEAN_CAVE_2F (76 | (1 << 8)) #define MAP_CERULEAN_CAVE_B1F (77 | (1 << 8)) #define MAP_POKEMON_LEAGUE_LORELEIS_ROOM (78 | (1 << 8)) #define MAP_POKEMON_LEAGUE_BRUNOS_ROOM (79 | (1 << 8)) #define MAP_POKEMON_LEAGUE_AGATHAS_ROOM (80 | (1 << 8)) #define MAP_POKEMON_LEAGUE_LANCES_ROOM (81 | (1 << 8)) #define MAP_POKEMON_LEAGUE_CHAMPIONS_ROOM (82 | (1 << 8)) #define MAP_POKEMON_LEAGUE_HALL_OF_FAME (83 | (1 << 8)) #define MAP_ROCK_TUNNEL_1F (84 | (1 << 8)) #define MAP_ROCK_TUNNEL_B1F (85 | (1 << 8)) #define MAP_SEAFOAM_ISLANDS_1F (86 | (1 << 8)) #define MAP_SEAFOAM_ISLANDS_B1F (87 | (1 << 8)) #define MAP_SEAFOAM_ISLANDS_B2F (88 | (1 << 8)) #define MAP_SEAFOAM_ISLANDS_B3F (89 | (1 << 8)) #define MAP_SEAFOAM_ISLANDS_B4F (90 | (1 << 8)) #define MAP_POKEMON_TOWER_1F (91 | (1 << 8)) #define MAP_POKEMON_TOWER_2F (92 | (1 << 8)) #define MAP_POKEMON_TOWER_3F (93 | (1 << 8)) #define MAP_POKEMON_TOWER_4F (94 | (1 << 8)) #define MAP_POKEMON_TOWER_5F (95 | (1 << 8)) #define MAP_POKEMON_TOWER_6F (96 | (1 << 8)) #define MAP_POKEMON_TOWER_7F (97 | (1 << 8)) #define MAP_POWER_PLANT (98 | (1 << 8)) #define MAP_MT_EMBER_RUBY_PATH_B4F (99 | (1 << 8)) #define MAP_MT_EMBER_EXTERIOR (100 | (1 << 8)) #define MAP_MT_EMBER_SUMMIT_PATH_1F (101 | (1 << 8)) #define MAP_MT_EMBER_SUMMIT_PATH_2F (102 | (1 << 8)) #define MAP_MT_EMBER_SUMMIT_PATH_3F (103 | (1 << 8)) #define MAP_MT_EMBER_SUMMIT (104 | (1 << 8)) #define MAP_MT_EMBER_RUBY_PATH_B5F (105 | (1 << 8)) #define MAP_MT_EMBER_RUBY_PATH_1F (106 | (1 << 8)) #define MAP_MT_EMBER_RUBY_PATH_B1F (107 | (1 << 8)) #define MAP_MT_EMBER_RUBY_PATH_B2F (108 | (1 << 8)) #define MAP_MT_EMBER_RUBY_PATH_B3F (109 | (1 << 8)) #define MAP_MT_EMBER_RUBY_PATH_B1F_STAIRS (110 | (1 << 8)) #define MAP_MT_EMBER_RUBY_PATH_B2F_STAIRS (111 | (1 << 8)) #define MAP_THREE_ISLAND_BERRY_FOREST (112 | (1 << 8)) #define MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE (113 | (1 << 8)) #define MAP_FOUR_ISLAND_ICEFALL_CAVE_1F (114 | (1 << 8)) #define MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F (115 | (1 << 8)) #define MAP_FOUR_ISLAND_ICEFALL_CAVE_BACK (116 | (1 << 8)) #define MAP_FIVE_ISLAND_ROCKET_WAREHOUSE (117 | (1 << 8)) #define MAP_SIX_ISLAND_DOTTED_HOLE_1F (118 | (1 << 8)) #define MAP_SIX_ISLAND_DOTTED_HOLE_B1F (119 | (1 << 8)) #define MAP_SIX_ISLAND_DOTTED_HOLE_B2F (120 | (1 << 8)) #define MAP_SIX_ISLAND_DOTTED_HOLE_B3F (121 | (1 << 8)) #define MAP_SIX_ISLAND_DOTTED_HOLE_B4F (122 | (1 << 8)) #define MAP_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM (123 | (1 << 8)) #define MAP_SIX_ISLAND_PATTERN_BUSH (124 | (1 << 8)) #define MAP_SIX_ISLAND_ALTERING_CAVE (125 | (1 << 8)) // gMapGroup_SpecialArea #define MAP_NAVEL_ROCK_EXTERIOR (0 | (2 << 8)) #define MAP_TRAINER_TOWER_1F (1 | (2 << 8)) #define MAP_TRAINER_TOWER_2F (2 | (2 << 8)) #define MAP_TRAINER_TOWER_3F (3 | (2 << 8)) #define MAP_TRAINER_TOWER_4F (4 | (2 << 8)) #define MAP_TRAINER_TOWER_5F (5 | (2 << 8)) #define MAP_TRAINER_TOWER_6F (6 | (2 << 8)) #define MAP_TRAINER_TOWER_7F (7 | (2 << 8)) #define MAP_TRAINER_TOWER_8F (8 | (2 << 8)) #define MAP_TRAINER_TOWER_ROOF (9 | (2 << 8)) #define MAP_TRAINER_TOWER_LOBBY (10 | (2 << 8)) #define MAP_TRAINER_TOWER_ELEVATOR (11 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE (12 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM1 (13 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM2 (14 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM3 (15 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM4 (16 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM5 (17 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM6 (18 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM7 (19 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM8 (20 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM9 (21 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM10 (22 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM11 (23 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM12 (24 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM13 (25 | (2 << 8)) #define MAP_FIVE_ISLAND_LOST_CAVE_ROOM14 (26 | (2 << 8)) #define MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER (27 | (2 << 8)) #define MAP_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER (28 | (2 << 8)) #define MAP_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER (29 | (2 << 8)) #define MAP_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER (30 | (2 << 8)) #define MAP_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER (31 | (2 << 8)) #define MAP_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER (32 | (2 << 8)) #define MAP_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER (33 | (2 << 8)) #define MAP_THREE_ISLAND_DUNSPARCE_TUNNEL (34 | (2 << 8)) #define MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY (35 | (2 << 8)) #define MAP_NAVEL_ROCK_1F (36 | (2 << 8)) #define MAP_NAVEL_ROCK_SUMMIT (37 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE (38 | (2 << 8)) #define MAP_NAVEL_ROCK_SUMMIT_PATH_2F (39 | (2 << 8)) #define MAP_NAVEL_ROCK_SUMMIT_PATH_3F (40 | (2 << 8)) #define MAP_NAVEL_ROCK_SUMMIT_PATH_4F (41 | (2 << 8)) #define MAP_NAVEL_ROCK_SUMMIT_PATH_5F (42 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B1F (43 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B2F (44 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B3F (45 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B4F (46 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B5F (47 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B6F (48 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B7F (49 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B8F (50 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B9F (51 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B10F (52 | (2 << 8)) #define MAP_NAVEL_ROCK_BASE_PATH_B11F (53 | (2 << 8)) #define MAP_NAVEL_ROCK_B1F (54 | (2 << 8)) #define MAP_NAVEL_ROCK_FORK (55 | (2 << 8)) #define MAP_BIRTH_ISLAND_EXTERIOR (56 | (2 << 8)) #define MAP_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA (57 | (2 << 8)) #define MAP_BIRTH_ISLAND_HARBOR (58 | (2 << 8)) #define MAP_NAVEL_ROCK_HARBOR (59 | (2 << 8)) #define MAP_FARAWAY_ISLAND_EXTERIOR (60 | (2 << 8)) #define MAP_FARAWAY_ISLAND_INTERIOR (61 | (2 << 8)) #define MAP_ARTISAN_CAVE_B1F (62 | (2 << 8)) #define MAP_ARTISAN_CAVE_1F (63 | (2 << 8)) #define MAP_SOUTHERN_ISLAND_EXTERIOR (64 | (2 << 8)) #define MAP_SOUTHERN_ISLAND_INTERIOR (65 | (2 << 8)) #define MAP_CERULEAN_CAVE_1F_BLUE (66 | (2 << 8)) #define MAP_CERULEAN_CAVE_2F_BLUE (67 | (2 << 8)) #define MAP_CERULEAN_CAVE_B1F_BLUE (68 | (2 << 8)) #define MAP_CERULEAN_CAVE_1F_YELLOW (69 | (2 << 8)) #define MAP_CERULEAN_CAVE_2F_YELLOW (70 | (2 << 8)) #define MAP_CERULEAN_CAVE_B1F_YELLOW (71 | (2 << 8)) // gMapGroup_TownsAndRoutes #define MAP_PALLET_TOWN (0 | (3 << 8)) #define MAP_VIRIDIAN_CITY (1 | (3 << 8)) #define MAP_PEWTER_CITY (2 | (3 << 8)) #define MAP_CERULEAN_CITY (3 | (3 << 8)) #define MAP_LAVENDER_TOWN (4 | (3 << 8)) #define MAP_VERMILION_CITY (5 | (3 << 8)) #define MAP_CELADON_CITY (6 | (3 << 8)) #define MAP_FUCHSIA_CITY (7 | (3 << 8)) #define MAP_CINNABAR_ISLAND (8 | (3 << 8)) #define MAP_INDIGO_PLATEAU_EXTERIOR (9 | (3 << 8)) #define MAP_SAFFRON_CITY (10 | (3 << 8)) #define MAP_SAFFRON_CITY_CONNECTION (11 | (3 << 8)) #define MAP_ONE_ISLAND (12 | (3 << 8)) #define MAP_TWO_ISLAND (13 | (3 << 8)) #define MAP_THREE_ISLAND (14 | (3 << 8)) #define MAP_FOUR_ISLAND (15 | (3 << 8)) #define MAP_FIVE_ISLAND (16 | (3 << 8)) #define MAP_SEVEN_ISLAND (17 | (3 << 8)) #define MAP_SIX_ISLAND (18 | (3 << 8)) #define MAP_ROUTE1 (19 | (3 << 8)) #define MAP_ROUTE2 (20 | (3 << 8)) #define MAP_ROUTE3 (21 | (3 << 8)) #define MAP_ROUTE4 (22 | (3 << 8)) #define MAP_ROUTE5 (23 | (3 << 8)) #define MAP_ROUTE6 (24 | (3 << 8)) #define MAP_ROUTE7 (25 | (3 << 8)) #define MAP_ROUTE8 (26 | (3 << 8)) #define MAP_ROUTE9 (27 | (3 << 8)) #define MAP_ROUTE10 (28 | (3 << 8)) #define MAP_ROUTE11 (29 | (3 << 8)) #define MAP_ROUTE12 (30 | (3 << 8)) #define MAP_ROUTE13 (31 | (3 << 8)) #define MAP_ROUTE14 (32 | (3 << 8)) #define MAP_ROUTE15 (33 | (3 << 8)) #define MAP_ROUTE16 (34 | (3 << 8)) #define MAP_ROUTE17 (35 | (3 << 8)) #define MAP_ROUTE18 (36 | (3 << 8)) #define MAP_ROUTE19 (37 | (3 << 8)) #define MAP_ROUTE20 (38 | (3 << 8)) #define MAP_ROUTE21_NORTH (39 | (3 << 8)) #define MAP_ROUTE21_SOUTH (40 | (3 << 8)) #define MAP_ROUTE22 (41 | (3 << 8)) #define MAP_ROUTE23 (42 | (3 << 8)) #define MAP_ROUTE24 (43 | (3 << 8)) #define MAP_ROUTE25 (44 | (3 << 8)) #define MAP_ONE_ISLAND_KINDLE_ROAD (45 | (3 << 8)) #define MAP_ONE_ISLAND_TREASURE_BEACH (46 | (3 << 8)) #define MAP_TWO_ISLAND_CAPE_BRINK (47 | (3 << 8)) #define MAP_THREE_ISLAND_BOND_BRIDGE (48 | (3 << 8)) #define MAP_THREE_ISLAND_PORT (49 | (3 << 8)) #define MAP_PROTOTYPE_SEVII_ISLE_6 (50 | (3 << 8)) #define MAP_PROTOTYPE_SEVII_ISLE_7 (51 | (3 << 8)) #define MAP_PROTOTYPE_SEVII_ISLE_8 (52 | (3 << 8)) #define MAP_PROTOTYPE_SEVII_ISLE_9 (53 | (3 << 8)) #define MAP_FIVE_ISLAND_RESORT_GORGEOUS (54 | (3 << 8)) #define MAP_FIVE_ISLAND_WATER_LABYRINTH (55 | (3 << 8)) #define MAP_FIVE_ISLAND_MEADOW (56 | (3 << 8)) #define MAP_FIVE_ISLAND_MEMORIAL_PILLAR (57 | (3 << 8)) #define MAP_SIX_ISLAND_OUTCAST_ISLAND (58 | (3 << 8)) #define MAP_SIX_ISLAND_GREEN_PATH (59 | (3 << 8)) #define MAP_SIX_ISLAND_WATER_PATH (60 | (3 << 8)) #define MAP_SIX_ISLAND_RUIN_VALLEY (61 | (3 << 8)) #define MAP_SEVEN_ISLAND_TRAINER_TOWER (62 | (3 << 8)) #define MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE (63 | (3 << 8)) #define MAP_SEVEN_ISLAND_SEVAULT_CANYON (64 | (3 << 8)) #define MAP_SEVEN_ISLAND_TANOBY_RUINS (65 | (3 << 8)) #define MAP_ROUTE20_UNDERWATER (66 | (3 << 8)) #define MAP_THREE_ISLAND_BOND_BRIDGE_UNDERWATER (67 | (3 << 8)) #define MAP_FOUR_ISLAND_BASE (68 | (3 << 8)) // gMapGroup_IndoorPallet #define MAP_PALLET_TOWN_PLAYERS_HOUSE_1F (0 | (4 << 8)) #define MAP_PALLET_TOWN_PLAYERS_HOUSE_2F (1 | (4 << 8)) #define MAP_PALLET_TOWN_RIVALS_HOUSE (2 | (4 << 8)) #define MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB (3 | (4 << 8)) // gMapGroup_IndoorViridian #define MAP_VIRIDIAN_CITY_HOUSE (0 | (5 << 8)) #define MAP_VIRIDIAN_CITY_GYM (1 | (5 << 8)) #define MAP_VIRIDIAN_CITY_SCHOOL (2 | (5 << 8)) #define MAP_VIRIDIAN_CITY_MART (3 | (5 << 8)) #define MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F (4 | (5 << 8)) #define MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F (5 | (5 << 8)) // gMapGroup_IndoorPewter #define MAP_PEWTER_CITY_MUSEUM_1F (0 | (6 << 8)) #define MAP_PEWTER_CITY_MUSEUM_2F (1 | (6 << 8)) #define MAP_PEWTER_CITY_GYM (2 | (6 << 8)) #define MAP_PEWTER_CITY_MART (3 | (6 << 8)) #define MAP_PEWTER_CITY_HOUSE1 (4 | (6 << 8)) #define MAP_PEWTER_CITY_POKEMON_CENTER_1F (5 | (6 << 8)) #define MAP_PEWTER_CITY_POKEMON_CENTER_2F (6 | (6 << 8)) #define MAP_PEWTER_CITY_HOUSE2 (7 | (6 << 8)) // gMapGroup_IndoorCerulean #define MAP_CERULEAN_CITY_HOUSE1 (0 | (7 << 8)) #define MAP_CERULEAN_CITY_HOUSE2 (1 | (7 << 8)) #define MAP_CERULEAN_CITY_HOUSE3 (2 | (7 << 8)) #define MAP_CERULEAN_CITY_POKEMON_CENTER_1F (3 | (7 << 8)) #define MAP_CERULEAN_CITY_POKEMON_CENTER_2F (4 | (7 << 8)) #define MAP_CERULEAN_CITY_GYM (5 | (7 << 8)) #define MAP_CERULEAN_CITY_BIKE_SHOP (6 | (7 << 8)) #define MAP_CERULEAN_CITY_MART (7 | (7 << 8)) #define MAP_CERULEAN_CITY_HOUSE4 (8 | (7 << 8)) #define MAP_CERULEAN_CITY_HOUSE5 (9 | (7 << 8)) // gMapGroup_IndoorLavender #define MAP_LAVENDER_TOWN_POKEMON_CENTER_1F (0 | (8 << 8)) #define MAP_LAVENDER_TOWN_POKEMON_CENTER_2F (1 | (8 << 8)) #define MAP_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE (2 | (8 << 8)) #define MAP_LAVENDER_TOWN_HOUSE1 (3 | (8 << 8)) #define MAP_LAVENDER_TOWN_HOUSE2 (4 | (8 << 8)) #define MAP_LAVENDER_TOWN_MART (5 | (8 << 8)) // gMapGroup_IndoorVermilion #define MAP_VERMILION_CITY_HOUSE1 (0 | (9 << 8)) #define MAP_VERMILION_CITY_POKEMON_CENTER_1F (1 | (9 << 8)) #define MAP_VERMILION_CITY_POKEMON_CENTER_2F (2 | (9 << 8)) #define MAP_VERMILION_CITY_POKEMON_FAN_CLUB (3 | (9 << 8)) #define MAP_VERMILION_CITY_HOUSE2 (4 | (9 << 8)) #define MAP_VERMILION_CITY_MART (5 | (9 << 8)) #define MAP_VERMILION_CITY_GYM (6 | (9 << 8)) #define MAP_VERMILION_CITY_HOUSE3 (7 | (9 << 8)) // gMapGroup_IndoorCeladon #define MAP_CELADON_CITY_DEPARTMENT_STORE_1F (0 | (10 << 8)) #define MAP_CELADON_CITY_DEPARTMENT_STORE_2F (1 | (10 << 8)) #define MAP_CELADON_CITY_DEPARTMENT_STORE_3F (2 | (10 << 8)) #define MAP_CELADON_CITY_DEPARTMENT_STORE_4F (3 | (10 << 8)) #define MAP_CELADON_CITY_DEPARTMENT_STORE_5F (4 | (10 << 8)) #define MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF (5 | (10 << 8)) #define MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR (6 | (10 << 8)) #define MAP_CELADON_CITY_CONDOMINIUMS_1F (7 | (10 << 8)) #define MAP_CELADON_CITY_CONDOMINIUMS_2F (8 | (10 << 8)) #define MAP_CELADON_CITY_CONDOMINIUMS_3F (9 | (10 << 8)) #define MAP_CELADON_CITY_CONDOMINIUMS_ROOF (10 | (10 << 8)) #define MAP_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM (11 | (10 << 8)) #define MAP_CELADON_CITY_POKEMON_CENTER_1F (12 | (10 << 8)) #define MAP_CELADON_CITY_POKEMON_CENTER_2F (13 | (10 << 8)) #define MAP_CELADON_CITY_GAME_CORNER (14 | (10 << 8)) #define MAP_CELADON_CITY_GAME_CORNER_PRIZE_ROOM (15 | (10 << 8)) #define MAP_CELADON_CITY_GYM (16 | (10 << 8)) #define MAP_CELADON_CITY_RESTAURANT (17 | (10 << 8)) #define MAP_CELADON_CITY_HOUSE1 (18 | (10 << 8)) #define MAP_CELADON_CITY_HOTEL (19 | (10 << 8)) // gMapGroup_IndoorFuchsia #define MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE (0 | (11 << 8)) #define MAP_FUCHSIA_CITY_MART (1 | (11 << 8)) #define MAP_FUCHSIA_CITY_SAFARI_ZONE_OFFICE (2 | (11 << 8)) #define MAP_FUCHSIA_CITY_GYM (3 | (11 << 8)) #define MAP_FUCHSIA_CITY_HOUSE1 (4 | (11 << 8)) #define MAP_FUCHSIA_CITY_POKEMON_CENTER_1F (5 | (11 << 8)) #define MAP_FUCHSIA_CITY_POKEMON_CENTER_2F (6 | (11 << 8)) #define MAP_FUCHSIA_CITY_WARDENS_HOUSE (7 | (11 << 8)) #define MAP_FUCHSIA_CITY_HOUSE2 (8 | (11 << 8)) #define MAP_FUCHSIA_CITY_HOUSE3 (9 | (11 << 8)) // gMapGroup_IndoorCinnabar #define MAP_CINNABAR_ISLAND_GYM (0 | (12 << 8)) #define MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE (1 | (12 << 8)) #define MAP_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE (2 | (12 << 8)) #define MAP_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM (3 | (12 << 8)) #define MAP_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM (4 | (12 << 8)) #define MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F (5 | (12 << 8)) #define MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F (6 | (12 << 8)) #define MAP_CINNABAR_ISLAND_MART (7 | (12 << 8)) // gMapGroup_IndoorIndigoPlateau #define MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F (0 | (13 << 8)) #define MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F (1 | (13 << 8)) // gMapGroup_IndoorSaffron #define MAP_SAFFRON_CITY_COPYCATS_HOUSE_1F (0 | (14 << 8)) #define MAP_SAFFRON_CITY_COPYCATS_HOUSE_2F (1 | (14 << 8)) #define MAP_SAFFRON_CITY_DOJO (2 | (14 << 8)) #define MAP_SAFFRON_CITY_GYM (3 | (14 << 8)) #define MAP_SAFFRON_CITY_HOUSE (4 | (14 << 8)) #define MAP_SAFFRON_CITY_MART (5 | (14 << 8)) #define MAP_SAFFRON_CITY_POKEMON_CENTER_1F (6 | (14 << 8)) #define MAP_SAFFRON_CITY_POKEMON_CENTER_2F (7 | (14 << 8)) #define MAP_SAFFRON_CITY_MR_PSYCHICS_HOUSE (8 | (14 << 8)) #define MAP_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB (9 | (14 << 8)) // gMapGroup_IndoorRoute2 #define MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE (0 | (15 << 8)) #define MAP_ROUTE2_HOUSE (1 | (15 << 8)) #define MAP_ROUTE2_EAST_BUILDING (2 | (15 << 8)) #define MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE (3 | (15 << 8)) // gMapGroup_IndoorRoute4 #define MAP_ROUTE4_POKEMON_CENTER_1F (0 | (16 << 8)) #define MAP_ROUTE4_POKEMON_CENTER_2F (1 | (16 << 8)) // gMapGroup_IndoorRoute5 #define MAP_ROUTE5_POKEMON_DAY_CARE (0 | (17 << 8)) #define MAP_ROUTE5_SOUTH_ENTRANCE (1 | (17 << 8)) // gMapGroup_IndoorRoute6 #define MAP_ROUTE6_NORTH_ENTRANCE (0 | (18 << 8)) #define MAP_ROUTE6_UNUSED_HOUSE (1 | (18 << 8)) // gMapGroup_IndoorRoute7 #define MAP_ROUTE7_EAST_ENTRANCE (0 | (19 << 8)) // gMapGroup_IndoorRoute8 #define MAP_ROUTE8_WEST_ENTRANCE (0 | (20 << 8)) // gMapGroup_IndoorRoute10 #define MAP_ROUTE10_POKEMON_CENTER_1F (0 | (21 << 8)) #define MAP_ROUTE10_POKEMON_CENTER_2F (1 | (21 << 8)) // gMapGroup_IndoorRoute11 #define MAP_ROUTE11_EAST_ENTRANCE_1F (0 | (22 << 8)) #define MAP_ROUTE11_EAST_ENTRANCE_2F (1 | (22 << 8)) // gMapGroup_IndoorRoute12 #define MAP_ROUTE12_NORTH_ENTRANCE_1F (0 | (23 << 8)) #define MAP_ROUTE12_NORTH_ENTRANCE_2F (1 | (23 << 8)) #define MAP_ROUTE12_FISHING_HOUSE (2 | (23 << 8)) // gMapGroup_IndoorRoute15 #define MAP_ROUTE15_WEST_ENTRANCE_1F (0 | (24 << 8)) #define MAP_ROUTE15_WEST_ENTRANCE_2F (1 | (24 << 8)) // gMapGroup_IndoorRoute16 #define MAP_ROUTE16_HOUSE (0 | (25 << 8)) #define MAP_ROUTE16_NORTH_ENTRANCE_1F (1 | (25 << 8)) #define MAP_ROUTE16_NORTH_ENTRANCE_2F (2 | (25 << 8)) // gMapGroup_IndoorRoute18 #define MAP_ROUTE18_EAST_ENTRANCE_1F (0 | (26 << 8)) #define MAP_ROUTE18_EAST_ENTRANCE_2F (1 | (26 << 8)) // gMapGroup_IndoorRoute19 #define MAP_ROUTE19_UNUSED_HOUSE (0 | (27 << 8)) // gMapGroup_IndoorRoute22 #define MAP_ROUTE22_NORTH_ENTRANCE (0 | (28 << 8)) // gMapGroup_IndoorRoute23 #define MAP_ROUTE23_UNUSED_HOUSE (0 | (29 << 8)) // gMapGroup_IndoorRoute25 #define MAP_ROUTE25_SEA_COTTAGE (0 | (30 << 8)) // gMapGroup_IndoorSevenIsland #define MAP_SEVEN_ISLAND_HOUSE_ROOM1 (0 | (31 << 8)) #define MAP_SEVEN_ISLAND_HOUSE_ROOM2 (1 | (31 << 8)) #define MAP_SEVEN_ISLAND_MART (2 | (31 << 8)) #define MAP_SEVEN_ISLAND_POKEMON_CENTER_1F (3 | (31 << 8)) #define MAP_SEVEN_ISLAND_POKEMON_CENTER_2F (4 | (31 << 8)) #define MAP_SEVEN_ISLAND_UNUSED_HOUSE (5 | (31 << 8)) #define MAP_SEVEN_ISLAND_HARBOR (6 | (31 << 8)) // gMapGroup_IndoorOneIsland #define MAP_ONE_ISLAND_POKEMON_CENTER_1F (0 | (32 << 8)) #define MAP_ONE_ISLAND_POKEMON_CENTER_2F (1 | (32 << 8)) #define MAP_ONE_ISLAND_HOUSE1 (2 | (32 << 8)) #define MAP_ONE_ISLAND_HOUSE2 (3 | (32 << 8)) #define MAP_ONE_ISLAND_HARBOR (4 | (32 << 8)) #define MAP_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP (5 | (32 << 8)) // gMapGroup_IndoorTwoIsland #define MAP_TWO_ISLAND_JOYFUL_GAME_CORNER (0 | (33 << 8)) #define MAP_TWO_ISLAND_HOUSE (1 | (33 << 8)) #define MAP_TWO_ISLAND_POKEMON_CENTER_1F (2 | (33 << 8)) #define MAP_TWO_ISLAND_POKEMON_CENTER_2F (3 | (33 << 8)) #define MAP_TWO_ISLAND_HARBOR (4 | (33 << 8)) // gMapGroup_IndoorThreeIsland #define MAP_THREE_ISLAND_HOUSE1 (0 | (34 << 8)) #define MAP_THREE_ISLAND_POKEMON_CENTER_1F (1 | (34 << 8)) #define MAP_THREE_ISLAND_POKEMON_CENTER_2F (2 | (34 << 8)) #define MAP_THREE_ISLAND_MART (3 | (34 << 8)) #define MAP_THREE_ISLAND_HOUSE2 (4 | (34 << 8)) #define MAP_THREE_ISLAND_HOUSE3 (5 | (34 << 8)) #define MAP_THREE_ISLAND_HOUSE4 (6 | (34 << 8)) #define MAP_THREE_ISLAND_HOUSE5 (7 | (34 << 8)) // gMapGroup_IndoorFourIsland #define MAP_FOUR_ISLAND_POKEMON_DAY_CARE (0 | (35 << 8)) #define MAP_FOUR_ISLAND_POKEMON_CENTER_1F (1 | (35 << 8)) #define MAP_FOUR_ISLAND_POKEMON_CENTER_2F (2 | (35 << 8)) #define MAP_FOUR_ISLAND_HOUSE1 (3 | (35 << 8)) #define MAP_FOUR_ISLAND_LORELEIS_HOUSE (4 | (35 << 8)) #define MAP_FOUR_ISLAND_HARBOR (5 | (35 << 8)) #define MAP_FOUR_ISLAND_HOUSE2 (6 | (35 << 8)) #define MAP_FOUR_ISLAND_MART (7 | (35 << 8)) #define MAP_FOUR_ISLAND_BASE_CABLE_CAR_STATION (8 | (35 << 8)) #define MAP_FOUR_ISLAND_CABLE_CAR_STATION (9 | (35 << 8)) // gMapGroup_IndoorFiveIsland #define MAP_FIVE_ISLAND_POKEMON_CENTER_1F (0 | (36 << 8)) #define MAP_FIVE_ISLAND_POKEMON_CENTER_2F (1 | (36 << 8)) #define MAP_FIVE_ISLAND_HARBOR (2 | (36 << 8)) #define MAP_FIVE_ISLAND_HOUSE1 (3 | (36 << 8)) #define MAP_FIVE_ISLAND_HOUSE2 (4 | (36 << 8)) // gMapGroup_IndoorSixIsland #define MAP_SIX_ISLAND_POKEMON_CENTER_1F (0 | (37 << 8)) #define MAP_SIX_ISLAND_POKEMON_CENTER_2F (1 | (37 << 8)) #define MAP_SIX_ISLAND_HARBOR (2 | (37 << 8)) #define MAP_SIX_ISLAND_HOUSE (3 | (37 << 8)) #define MAP_SIX_ISLAND_MART (4 | (37 << 8)) // gMapGroup_IndoorThreeIslandRoute #define MAP_THREE_ISLAND_HARBOR (0 | (38 << 8)) // gMapGroup_IndoorFiveIslandRoute #define MAP_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE (0 | (39 << 8)) // gMapGroup_IndoorTwoIslandRoute #define MAP_TWO_ISLAND_CAPE_BRINK_HOUSE (0 | (40 << 8)) // gMapGroup_IndoorSixIslandRoute #define MAP_SIX_ISLAND_WATER_PATH_HOUSE1 (0 | (41 << 8)) #define MAP_SIX_ISLAND_WATER_PATH_HOUSE2 (1 | (41 << 8)) // gMapGroup_IndoorSevenIslandRoute #define MAP_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE (0 | (42 << 8)) // gMapGroup_RSE #define MAP_RS_BATTLE_TOWER (0 | (43 << 8)) #define MAP_RS_BATTLE_TOWER_LOBBY (1 | (43 << 8)) #define MAP_RS_BATTLE_TOWER_ELEVATOR (2 | (43 << 8)) #define MAP_RS_BATTLE_TOWER_CORRIDOR (3 | (43 << 8)) #define MAP_RS_BATTLE_TOWER_BATTLE_ROOM (4 | (43 << 8)) #define MAP_BATTLE_FRONTIER_OUTSIDE_WEST (5 | (43 << 8)) #define MAP_BATTLE_FRONTIER_OUTSIDE_EAST (6 | (43 << 8)) #define MAP_BATTLE_FRONTIER_RECEPTION_GATE (7 | (43 << 8)) #define MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F (8 | (43 << 8)) #define MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F (9 | (43 << 8)) #define MAP_BATTLE_FRONTIER_MART (10 | (43 << 8)) #define MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER (11 | (43 << 8)) #define MAP_BATTLE_FRONTIER_RANKING_HALL (12 | (43 << 8)) #define MAP_BATTLE_FRONTIER_SCOTTS_HOUSE (13 | (43 << 8)) #define MAP_BATTLE_FRONTIER_LOUNGE1 (14 | (43 << 8)) #define MAP_BATTLE_FRONTIER_LOUNGE2 (15 | (43 << 8)) #define MAP_BATTLE_FRONTIER_LOUNGE3 (16 | (43 << 8)) #define MAP_BATTLE_FRONTIER_LOUNGE4 (17 | (43 << 8)) #define MAP_BATTLE_FRONTIER_LOUNGE5 (18 | (43 << 8)) #define MAP_BATTLE_FRONTIER_LOUNGE6 (19 | (43 << 8)) #define MAP_BATTLE_FRONTIER_LOUNGE7 (20 | (43 << 8)) #define MAP_BATTLE_FRONTIER_LOUNGE8 (21 | (43 << 8)) #define MAP_GROUPS_COUNT 44 #endif // GUARD_CONSTANTS_MAP_GROUPS_H ================================================ FILE: include/constants/map_scripts.h ================================================ #ifndef GUARD_CONSTANTS_MAP_SCRIPTS_H #define GUARD_CONSTANTS_MAP_SCRIPTS_H #define MAP_SCRIPT_ON_LOAD 1 #define MAP_SCRIPT_ON_FRAME_TABLE 2 #define MAP_SCRIPT_ON_TRANSITION 3 #define MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE 4 #define MAP_SCRIPT_ON_RESUME 5 #define MAP_SCRIPT_ON_DIVE_WARP 6 #define MAP_SCRIPT_ON_RETURN_TO_FIELD 7 #endif // GUARD_CONSTANTS_MAP_SCRIPTS_H ================================================ FILE: include/constants/map_types.h ================================================ #ifndef GUARD_CONSTANTS_MAP_TYPES_H #define GUARD_CONSTANTS_MAP_TYPES_H #define MAP_TYPE_NONE 0 #define MAP_TYPE_TOWN 1 #define MAP_TYPE_CITY 2 // Not used by any map. RSE use this map type to distinguish Town and City. FRLG make no distinction #define MAP_TYPE_ROUTE 3 #define MAP_TYPE_UNDERGROUND 4 #define MAP_TYPE_UNDERWATER 5 // Not used by any map. #define MAP_TYPE_OCEAN_ROUTE 6 // Not used by any map. #define MAP_TYPE_UNKNOWN 7 // Not used by any map. #define MAP_TYPE_INDOOR 8 #define MAP_TYPE_SECRET_BASE 9 // Not used by any map. #define MAP_BATTLE_SCENE_NORMAL 0 #define MAP_BATTLE_SCENE_GYM 1 #define MAP_BATTLE_SCENE_INDOOR_1 2 // Pokemon Tower, Tanoby ruins #define MAP_BATTLE_SCENE_INDOOR_2 3 // Pokemon Mansion, Power Plant, Rocket Hideout/Warehouse #define MAP_BATTLE_SCENE_LORELEI 4 #define MAP_BATTLE_SCENE_BRUNO 5 #define MAP_BATTLE_SCENE_AGATHA 6 #define MAP_BATTLE_SCENE_LANCE 7 #define MAP_BATTLE_SCENE_LINK 8 #endif // GUARD_CONSTANTS_MAP_TYPES_H ================================================ FILE: include/constants/maps.h ================================================ #ifndef GUARD_CONSTANTS_MAPS_H #define GUARD_CONSTANTS_MAPS_H #include "constants/map_groups.h" #include "constants/map_types.h" // Warps using this map will instead use the warp data stored in gSaveBlock1Ptr->dynamicWarp. // Used for warps that need to change destinations, e.g. when stepping off an elevator. #define MAP_DYNAMIC (0x7F | (0x7F << 8)) #define MAP_UNDEFINED (0xFF | (0xFF << 8)) #define MAP_GROUP(map) (MAP_##map >> 8) #define MAP_NUM(map) (MAP_##map & 0xFF) #define MAP(map) MAP_GROUP(map), MAP_NUM(map) // ID for dynamic warps. Used in the dest_warp_id field for warp events, but it's never // read in practice. A dest_map of MAP_DYNAMIC is used to indicate that a dynamic warp // should be used, at which point the warp id is ignored. It can be passed to SetDynamicWarp // or SetDynamicWarpWithCoords as the first argument, but this argument is unused. #define WARP_ID_DYNAMIC 0x7F // Used to indicate an invalid warp id, for dummy warps or when a warp should // use the given coordinates rather than the coordinates of a target warp. #define WARP_ID_NONE (-1) #endif // GUARD_CONSTANTS_MAPS_H ================================================ FILE: include/constants/master_opponents.h ================================================ #ifndef GUARD_CONSTANTS_MASTER_OPPONENTS_H #define GUARD_CONSTANTS_MASTER_OPPONENTS_H #define MASTER_NONE 0 #define MASTER_BULBASAUR 1 #define MASTER_IVYSAUR 2 #define MASTER_VENUSAUR 3 #define MASTER_CHARMANDER 4 #define MASTER_CHARMELEON 5 #define MASTER_CHARIZARD 6 #define MASTER_SQUIRTLE 7 #define MASTER_WARTORTLE 8 #define MASTER_BLASTOISE 9 #define MASTER_CATERPIE 10 #define MASTER_METAPOD 11 #define MASTER_BUTTERFREE 12 #define MASTER_WEEDLE 13 #define MASTER_KAKUNA 14 #define MASTER_BEEDRILL 15 #define MASTER_PIDGEY 16 #define MASTER_PIDGEOTTO 17 #define MASTER_PIDGEOT 18 #define MASTER_RATTATA 19 #define MASTER_RATICATE 20 #define MASTER_SPEAROW 21 #define MASTER_FEAROW 22 #define MASTER_EKANS 23 #define MASTER_ARBOK 24 #define MASTER_PIKACHU 25 #define MASTER_RAICHU 26 #define MASTER_SANDSHREW 27 #define MASTER_SANDSLASH 28 #define MASTER_NIDORAN_F 29 #define MASTER_NIDORINA 30 #define MASTER_NIDOQUEEN 31 #define MASTER_NIDORAN_M 32 #define MASTER_NIDORINO 33 #define MASTER_NIDOKING 34 #define MASTER_CLEFAIRY 35 #define MASTER_CLEFABLE 36 #define MASTER_VULPIX 37 #define MASTER_NINETALES 38 #define MASTER_JIGGLYPUFF 39 #define MASTER_WIGGLYTUFF 40 #define MASTER_ZUBAT 41 #define MASTER_GOLBAT 42 #define MASTER_ODDISH 43 #define MASTER_GLOOM 44 #define MASTER_VILEPLUME 45 #define MASTER_PARAS 46 #define MASTER_PARASECT 47 #define MASTER_VENONAT 48 #define MASTER_VENOMOTH 49 #define MASTER_DIGLETT 50 #define MASTER_DUGTRIO 51 #define MASTER_MEOWTH 52 #define MASTER_PERSIAN 53 #define MASTER_PSYDUCK 54 #define MASTER_GOLDUCK 55 #define MASTER_MANKEY 56 #define MASTER_PRIMEAPE 57 #define MASTER_GROWLITHE 58 #define MASTER_ARCANINE 59 #define MASTER_POLIWAG 60 #define MASTER_POLIWHIRL 61 #define MASTER_POLIWRATH 62 #define MASTER_ABRA 63 #define MASTER_KADABRA 64 #define MASTER_ALAKAZAM 65 #define MASTER_MACHOP 66 #define MASTER_MACHOKE 67 #define MASTER_MACHAMP 68 #define MASTER_BELLSPROUT 69 #define MASTER_WEEPINBELL 70 #define MASTER_VICTREEBEL 71 #define MASTER_TENTACOOL 72 #define MASTER_TENTACRUEL 73 #define MASTER_GEODUDE 74 #define MASTER_GRAVELER 75 #define MASTER_GOLEM 76 #define MASTER_PONYTA 77 #define MASTER_RAPIDASH 78 #define MASTER_SLOWPOKE 79 #define MASTER_SLOWBRO 80 #define MASTER_MAGNEMITE 81 #define MASTER_MAGNETON 82 #define MASTER_FARFETCHD 83 #define MASTER_DODUO 84 #define MASTER_DODRIO 85 #define MASTER_SEEL 86 #define MASTER_DEWGONG 87 #define MASTER_GRIMER 88 #define MASTER_MUK 89 #define MASTER_SHELLDER 90 #define MASTER_CLOYSTER 91 #define MASTER_GASTLY 92 #define MASTER_HAUNTER 93 #define MASTER_GENGAR 94 #define MASTER_ONIX 95 #define MASTER_DROWZEE 96 #define MASTER_HYPNO 97 #define MASTER_KRABBY 98 #define MASTER_KINGLER 99 #define MASTER_VOLTORB 100 #define MASTER_ELECTRODE 101 #define MASTER_EXEGGCUTE 102 #define MASTER_EXEGGUTOR 103 #define MASTER_CUBONE 104 #define MASTER_MAROWAK 105 #define MASTER_HITMONLEE 106 #define MASTER_HITMONCHAN 107 #define MASTER_LICKITUNG 108 #define MASTER_KOFFING 109 #define MASTER_WEEZING 110 #define MASTER_RHYHORN 111 #define MASTER_RHYDON 112 #define MASTER_CHANSEY 113 #define MASTER_TANGELA 114 #define MASTER_KANGASKHAN 115 #define MASTER_HORSEA 116 #define MASTER_SEADRA 117 #define MASTER_GOLDEEN 118 #define MASTER_SEAKING 119 #define MASTER_STARYU 120 #define MASTER_STARMIE 121 #define MASTER_MR_MIME 122 #define MASTER_SCYTHER 123 #define MASTER_JYNX 124 #define MASTER_ELECTABUZZ 125 #define MASTER_MAGMAR 126 #define MASTER_PINSIR 127 #define MASTER_TAUROS 128 #define MASTER_MAGIKARP 129 #define MASTER_GYARADOS 130 #define MASTER_LAPRAS 131 #define MASTER_DITTO 132 #define MASTER_EEVEE 133 #define MASTER_VAPOREON 134 #define MASTER_JOLTEON 135 #define MASTER_FLAREON 136 #define MASTER_PORYGON 137 #define MASTER_OMANYTE 138 #define MASTER_OMASTAR 139 #define MASTER_KABUTO 140 #define MASTER_KABUTOPS 141 #define MASTER_AERODACTYL 142 #define MASTER_SNORLAX 143 #define MASTER_ARTICUNO 144 #define MASTER_ZAPDOS 145 #define MASTER_MOLTRES 146 #define MASTER_DRATINI 147 #define MASTER_DRAGONAIR 148 #define MASTER_DRAGONITE 149 #define MASTER_MEWTWO 150 #define MASTER_MEW 151 #endif // GUARD_CONSTANTS_MASTER_OPPONENTS_H ================================================ FILE: include/constants/menu.h ================================================ #ifndef GUARD_CONSTANTS_MENU_H #define GUARD_CONSTANTS_MENU_H #define SCR_MENU_CANCEL 127 #define SCR_MENU_UNSET 255 #define MULTICHOICE_YES_NO 0 #define MULTICHOICE_EEVEELUTIONS 1 #define MULTICHOICE_TRAINER_CARD_ICON_TINT 2 #define MULTICHOICE_HOF_QUIT 3 #define MULTICHOICE_EGGS_QUIT 4 #define MULTICHOICE_VICTORIES_QUIT 5 #define MULTICHOICE_HOF_EGGS_QUIT 6 #define MULTICHOICE_HOF_VICTORIES_QUIT 7 #define MULTICHOICE_EGGS_VICTORIES_QUIT 8 #define MULTICHOICE_HOF_EGGS_VICTORIES_QUIT 9 #define MULTICHOICE_EXIT 10 #define MULTICHOICE_EXIT_2 11 #define MULTICHOICE_EXIT_3 12 #define MULTICHOICE_BIKE_SHOP 13 #define MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_FR 14 #define MULTICHOICE_TRAINER_SCHOOL_WHITEBOARD 15 #define MULTICHOICE_YES_NO_INFO 16 #define MULTICHOICE_SINGLE_DOUBLE_MULTI_INFO_EXIT 17 #define MULTICHOICE_YES_NO_INFO_2 18 #define MULTICHOICE_CHALLENGE_INFO_EXIT 19 #define MULTICHOICE_ROOFTOP_B1F 20 #define MULTICHOICE_HELIX 21 #define MULTICHOICE_DOME 22 #define MULTICHOICE_AMBER 23 #define MULTICHOICE_HELIX_AMBER 24 #define MULTICHOICE_DOME_AMBER 25 #define MULTICHOICE_CELADON_VENDING_MACHINE 26 #define MULTICHOICE_GAME_CORNER_COIN_PURCHASE_COUNTER 27 #define MULTICHOICE_EXCELLENT_NOT_SO_BAD 28 #define MULTICHOICE_RIGHT_LEFT 29 #define MULTICHOICE_GAME_CORNER_TMPRIZES 30 #define MULTICHOICE_DEPT_STORE_ELEVATOR 31 #define MULTICHOICE_THIRSTY_GIRL_FRESH_WATER 32 #define MULTICHOICE_THIRSTY_GIRL_SODA_POP 33 #define MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP 34 #define MULTICHOICE_THIRSTY_GIRL_LEMONADE 35 #define MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_LEMONADE 36 #define MULTICHOICE_THIRSTY_GIRL_SODA_POP_LEMONADE 37 #define MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP_LEMONADE 38 #define MULTICHOICE_TRADE_CENTER_COLOSSEUM 39 #define MULTICHOICE_LINK_WIRELESS 40 #define MULTICHOICE_GAME_CORNER_BATTLE_ITEM_PRIZES 41 #define MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR 42 #define MULTICHOICE_LINKED_DIRECT_UNION 43 #define MULTICHOICE_ISLAND_23 44 #define MULTICHOICE_ISLAND_13 45 #define MULTICHOICE_ISLAND_12 46 #define MULTICHOICE_TRADE_COLOSSEUM_CRUSH 47 #define MULTICHOICE_GLASS_WORKSHOP_VENDOR 48 #define MULTICHOICE_POKEJUMP_DODRIO 49 #define MULTICHOICE_TRADE_COLOSSEUM_2 50 #define MULTICHOICE_MUSHROOMS 51 #define MULTICHOICE_TRADE_COLOSSEUM_BLANK_CRUSH 52 #define MULTICHOICE_TRADE_COLOSSEUM_BLANK 53 #define MULTICHOICE_FARAWAY 54 #define MULTICHOICE_NAVEL 55 #define MULTICHOICE_NAVEL_FARAWAY 56 #define MULTICHOICE_SEAGALLOP_123 57 #define MULTICHOICE_SEAGALLOP_V23 58 #define MULTICHOICE_SEAGALLOP_V13 59 #define MULTICHOICE_SEAGALLOP_V12 60 #define MULTICHOICE_SEAGALLOP_VERMILION 61 #define MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_LG 62 #define MULTICHOICE_JOIN_OR_LEAD 63 #define MULTICHOICE_TRAINER_TOWER_MODE 64 #define MULTICHOICE_BATTLE_TOWER_LEVELS 65 #define MULTICHOICE_HELIX_DOME 66 #define MULTICHOICE_HELIX_DOME_AMBER 67 #define MULTICHOICE_SEVII_OTHER 68 #define MULTICHOICE_SEVII_BATTLE_TOWER 69 #define MULTICHOICE_SEVII_BATTLE_TOWER_OTHER 70 #define MULTICHOICE_BIRTH 71 #define MULTICHOICE_BIRTH_FARAWAY 72 #define MULTICHOICE_BIRTH_NAVEL 73 #define MULTICHOICE_BIRTH_NAVEL_FARAWAY 74 #define MULTICHOICE_SOUTHERN 75 #define MULTICHOICE_SOUTHERN_FARAWAY 76 #define MULTICHOICE_SOUTHERN_NAVEL 77 #define MULTICHOICE_SOUTHERN_NAVEL_FARAWAY 78 #define MULTICHOICE_SOUTHERN_BIRTH 79 #define MULTICHOICE_SOUTHERN_BIRTH_FARAWAY 80 #define MULTICHOICE_SOUTHERN_BIRTH_NAVEL 81 #define MULTICHOICE_SOUTHERN_BIRTH_NAVEL_FARAWAY 82 #define MULTICHOICE_MASTER_YOUNGSTER 83 #define MULTICHOICE_NONE 255 #define LISTMENU_BADGES 0 #define LISTMENU_SILPHCO_FLOORS 1 #define LISTMENU_ROCKET_HIDEOUT_FLOORS 2 #define LISTMENU_DEPT_STORE_FLOORS 3 #define LISTMENU_WIRELESS_LECTURE_HEADERS 4 #define LISTMENU_BERRY_POWDER 5 #define LISTMENU_TRAINER_TOWER_FLOORS 6 #define LISTMENU_GYM_LEADERS 7 #define LISTMENU_MASTER_TRAINER_TITLES 8 // Std String Ids #define STDSTRING_COOL 0 #define STDSTRING_BEAUTY 1 #define STDSTRING_CUTE 2 #define STDSTRING_SMART 3 #define STDSTRING_TOUGH 4 #define STDSTRING_COOL2 5 #define STDSTRING_BEAUTY2 6 #define STDSTRING_CUTE2 7 #define STDSTRING_SMART2 8 #define STDSTRING_TOUGH2 9 #define STDSTRING_ITEMS 10 #define STDSTRING_KEY_ITEMS 11 #define STDSTRING_POKEBALLS 12 #define STDSTRING_TMHMS 13 #define STDSTRING_BERRIES 14 #define STDSTRING_BOULDER_BADGE 15 #define STDSTRING_CASCADE_BADGE 16 #define STDSTRING_THUNDER_BADGE 17 #define STDSTRING_RAINBOW_BADGE 18 #define STDSTRING_SOUL_BADGE 19 #define STDSTRING_MARSH_BADGE 20 #define STDSTRING_VOLCANO_BADGE 21 #define STDSTRING_EARTH_BADGE 22 #define STDSTRING_COINS 23 #define STDSTRING_ITEMS_POCKET 24 #define STDSTRING_KEY_ITEMS_POCKET 25 #define STDSTRING_POKEBALLS_POCKET 26 #define STDSTRING_TM_CASE 27 #define STDSTRING_BERRY_POUCH 28 #define STDSTRING_MEDICINE_POCKET 29 #define STDSTRING_HELD_ITEMS_POCKET 30 #endif //GUARD_CONSTANTS_MENU_H ================================================ FILE: include/constants/metatile_behaviors.h ================================================ #ifndef GUARD_METATILE_BEHAVIORS #define GUARD_METATILE_BEHAVIORS #define MB_NORMAL 0x00 #define MB_UNUSED_01 0x01 #define MB_TALL_GRASS 0x02 // #define MB_CAVE 0x08 // #define MB_RUNNING_DISALLOWED 0x0A #define MB_INDOOR_ENCOUNTER 0x0B #define MB_MOUNTAIN_TOP 0x0C // #define MB_POND_WATER 0x10 #define MB_FAST_WATER 0x11 #define MB_DEEP_WATER 0x12 #define MB_WATERFALL 0x13 // #define MB_OCEAN_WATER 0x15 #define MB_PUDDLE 0x16 #define MB_SHALLOW_WATER 0x17 // #define MB_UNDERWATER_BLOCKED_ABOVE 0x19 #define MB_UNUSED_WATER 0x1A #define MB_CYCLING_ROAD_WATER 0x1B // #define MB_STRENGTH_BUTTON 0x20 #define MB_SAND 0x21 #define MB_SEAWEED 0x22 #define MB_ICE 0x23 #define MB_ASHGRASS 0x24 // #define MB_THIN_ICE 0x26 #define MB_CRACKED_ICE 0x27 #define MB_HOT_SPRINGS 0x28 // #define MB_ROCK_STAIRS 0x2A #define MB_SAND_CAVE 0x2B // #define MB_IMPASSABLE_EAST 0x30 #define MB_IMPASSABLE_WEST 0x31 #define MB_IMPASSABLE_NORTH 0x32 #define MB_IMPASSABLE_SOUTH 0x33 #define MB_IMPASSABLE_NORTHEAST 0x34 #define MB_IMPASSABLE_NORTHWEST 0x35 #define MB_IMPASSABLE_SOUTHEAST 0x36 #define MB_IMPASSABLE_SOUTHWEST 0x37 #define MB_JUMP_EAST 0x38 #define MB_JUMP_WEST 0x39 #define MB_JUMP_NORTH 0x3A #define MB_JUMP_SOUTH 0x3B // #define MB_WALK_EAST 0x40 #define MB_WALK_WEST 0x41 #define MB_WALK_NORTH 0x42 #define MB_WALK_SOUTH 0x43 #define MB_SLIDE_EAST 0x44 #define MB_SLIDE_WEST 0x45 #define MB_SLIDE_NORTH 0x46 #define MB_SLIDE_SOUTH 0x47 #define MB_TRICK_HOUSE_PUZZLE_8_FLOOR 0x48 // #define MB_EASTWARD_CURRENT 0x50 #define MB_WESTWARD_CURRENT 0x51 #define MB_NORTHWARD_CURRENT 0x52 #define MB_SOUTHWARD_CURRENT 0x53 #define MB_SPIN_RIGHT 0x54 #define MB_SPIN_LEFT 0x55 #define MB_SPIN_UP 0x56 #define MB_SPIN_DOWN 0x57 #define MB_STOP_SPINNING 0x58 // #define MB_CAVE_DOOR 0x60 #define MB_LADDER 0x61 #define MB_EAST_ARROW_WARP 0x62 #define MB_WEST_ARROW_WARP 0x63 #define MB_NORTH_ARROW_WARP 0x64 #define MB_SOUTH_ARROW_WARP 0x65 #define MB_FALL_WARP 0x66 #define MB_REGULAR_WARP 0x67 #define MB_LAVARIDGE_1F_WARP 0x68 #define MB_WARP_DOOR 0x69 #define MB_UP_ESCALATOR 0x6A #define MB_DOWN_ESCALATOR 0x6B #define MB_UP_RIGHT_STAIR_WARP 0x6C #define MB_UP_LEFT_STAIR_WARP 0x6D #define MB_DOWN_RIGHT_STAIR_WARP 0x6E #define MB_DOWN_LEFT_STAIR_WARP 0x6F // #define MB_UNION_ROOM_WARP 0x71 // #define MB_COUNTER 0x80 #define MB_BOOKSHELF 0x81 #define MB_POKEMART_SHELF 0x82 #define MB_PC 0x83 #define MB_SIGNPOST 0x84 #define MB_REGION_MAP 0x85 #define MB_TELEVISION 0x86 #define MB_POKEMON_CENTER_SIGN 0x87 #define MB_POKEMART_SIGN 0x88 #define MB_CABINET 0x89 #define MB_KITCHEN 0x8A #define MB_DRESSER 0x8B #define MB_SNACKS 0x8C #define MB_CABLE_CLUB_WIRELESS_MONITOR 0x8D #define MB_BATTLE_RECORDS 0x8E #define MB_QUESTIONNAIRE 0x8F #define MB_FOOD 0x90 #define MB_INDIGO_PLATEAU_SIGN_1 0x91 #define MB_INDIGO_PLATEAU_SIGN_2 0x92 #define MB_BLUEPRINTS 0x93 #define MB_PAINTING 0x94 #define MB_POWER_PLANT_MACHINE 0x95 #define MB_TELEPHONE 0x96 #define MB_COMPUTER 0x97 #define MB_ADVERTISING_POSTER 0x98 #define MB_FOOD_SMELLS_TASTY 0x99 #define MB_TRASH_BIN 0x9A #define MB_CUP 0x9B #define MB_PORTHOLE 0x9C #define MB_WINDOW 0x9D #define MB_BLINKING_LIGHTS 0x9E #define MB_NEATLY_LINED_UP_TOOLS 0x9F #define MB_IMPRESSIVE_MACHINE 0xA0 #define MB_VIDEO_GAME 0xA1 #define MB_BURGLARY 0xA2 #define MB_TRAINER_TOWER_MONITOR 0xA3 // #define MB_CYCLING_ROAD_PULL_DOWN 0xD0 #define MB_CYCLING_ROAD_PULL_DOWN_GRASS 0xD1 #define MB_LONG_GRASS 0xD2 #define MB_SEAWEED_NO_SURFACING 0xD3 #define MB_SAFARI_ZONE_EXTENSION_SIGN 0xD4 #define MB_SHORT_GRASS 0xD5 // #define NUM_METATILE_BEHAVIORS 0xF0 #endif // GUARD_METATILE_BEHAVIORS ================================================ FILE: include/constants/metatile_labels.h ================================================ #ifndef GUARD_METATILE_LABELS_H #define GUARD_METATILE_LABELS_H // gTileset_BattleFrontierOutsideEast #define METATILE_BattleFrontierOutsideEast_BattleTower 0x330 // gTileset_BattleFrontier #define METATILE_BattleFrontier_BattleTowerElevator 0x28E // gTileset_BerryForest #define METATILE_BerryForest_Door 0x2BB #define METATILE_BerryForest_ThreeIsland_Grass 0x2BF // gTileset_Building #define METATILE_Building_PCOff 0x062 #define METATILE_Building_PCOn 0x063 // gTileset_Cave #define METATILE_Cave_Floor_Ledge_Bottom 0x2E1 #define METATILE_Cave_Floor_Ledge_Top 0x2D1 #define METATILE_Cave_RockBarrier_Bottom 0x317 #define METATILE_Cave_RockBarrier_Top 0x307 // gTileset_CeladonCity #define METATILE_CeladonCity_CyclingRoad_Grass 0x352 #define METATILE_CeladonCity_CyclingRoad_Mowed 0x33E #define METATILE_CeladonCity_DeptStoreDoor 0x294 // gTileset_CeruleanCity #define METATILE_CeruleanCity_Door 0x298 // gTileset_CinnabarGym #define METATILE_CinnabarGym_Floor 0x281 #define METATILE_CinnabarGym_Floor_ShadeDiagonal 0x282 #define METATILE_CinnabarGym_Floor_ShadeFull 0x289 #define METATILE_CinnabarGym_Floor_WallLeftCorner 0x2C7 #define METATILE_CinnabarGym_Floor_WallLeftEdge 0x2CF #define METATILE_CinnabarGym_Floor_WallRightCorner 0x2C6 #define METATILE_CinnabarGym_Floor_WallRightEdge 0x2CE #define METATILE_CinnabarGym_Wall_RetractedBarrier 0x2D1 // gTileset_CinnabarIsland #define METATILE_CinnabarIsland_LabDoor 0x2AD // gTileset_DepartmentStore #define METATILE_DepartmentStore_ElevatorDoor 0x28D // gTileset_FuchsiaCity #define METATILE_FuchsiaCity_Door 0x2BF #define METATILE_FuchsiaCity_LongGrassBottom_LeftTree 0x35F #define METATILE_FuchsiaCity_LongGrassBottom_MiddleTree 0x367 #define METATILE_FuchsiaCity_LongGrassBottom_MountainLeft 0x345 #define METATILE_FuchsiaCity_LongGrassBottom_MountainRight 0x346 #define METATILE_FuchsiaCity_LongGrassBottom_RightTree 0x36F #define METATILE_FuchsiaCity_LongGrassTop_LeftTree 0x360 #define METATILE_FuchsiaCity_LongGrassTop_MiddleTree 0x361 #define METATILE_FuchsiaCity_LongGrassTop_MountainLeft 0x363 #define METATILE_FuchsiaCity_LongGrassTop_MountainRight 0x366 #define METATILE_FuchsiaCity_LongGrassTop_RightTree 0x362 #define METATILE_FuchsiaCity_SafariMountainTopLeft_Mowed 0x378 #define METATILE_FuchsiaCity_SafariMountainTopRight_Mowed 0x379 #define METATILE_FuchsiaCity_SafariZoneDoor 0x2D2 #define METATILE_FuchsiaCity_SafariZoneTreeTopLeft_Grass 0x300 #define METATILE_FuchsiaCity_SafariZoneTreeTopLeft_Mowed 0x310 #define METATILE_FuchsiaCity_SafariZoneTreeTopMiddle_Grass 0x301 #define METATILE_FuchsiaCity_SafariZoneTreeTopMiddle_Mowed 0x311 #define METATILE_FuchsiaCity_SafariZoneTreeTopRight_Grass 0x302 #define METATILE_FuchsiaCity_SafariZoneTreeTopRight_Mowed 0x312 // gTileset_GameCorner #define METATILE_GameCorner_CheckeredFloor_ShadeLeft 0x2E1 #define METATILE_GameCorner_CounterBarrier 0x2F7 #define METATILE_GameCorner_Floor_ShadeFull 0x292 #define METATILE_GameCorner_Floor_StairsTop 0x29D #define METATILE_GameCorner_PurpleWall_Floor 0x2CF #define METATILE_GameCorner_PurpleWall_StairsTop 0x2A6 #define METATILE_GameCorner_PurpleWall_stairsBottom 0x2A7 #define METATILE_GameCorner_StairsBottom 0x29F #define METATILE_GameCorner_StairsTop 0x29E // gTileset_General #define METATILE_General_CalmWater 0x12B #define METATILE_General_Door 0x03D #define METATILE_General_EmeraldMowed 0x229 #define METATILE_General_LongGrass_Bottom 0x23B #define METATILE_General_LongGrass_Top 0x233 #define METATILE_General_MountainCornerTopLeft 0x068 #define METATILE_General_MountainCornerTopRight 0x06A #define METATILE_General_Plain_Grass 0x00D #define METATILE_General_Plain_Mowed 0x001 #define METATILE_General_SlidingDoubleDoor 0x15B #define METATILE_General_SlidingSingleDoor 0x062 #define METATILE_General_ThinTreeTop_Grass 0x00A #define METATILE_General_ThinTreeTop_Mowed 0x013 #define METATILE_General_WideTreeTopLeft_Grass 0x00B #define METATILE_General_WideTreeTopLeft_Mowed 0x00E #define METATILE_General_WideTreeTopRight_Grass 0x00C #define METATILE_General_WideTreeTopRight_Mowed 0x00F // gTileset_GenericBuilding1 #define METATILE_GenericBuilding1_PlayersPCOff 0x28F #define METATILE_GenericBuilding1_PlayersPCOn 0x28A // gTileset_LavenderTown #define METATILE_LavenderTown_Door 0x2A2 // gTileset_Mart #define METATILE_Mart_CounterMid_Bottom 0x2C0 #define METATILE_Mart_CounterMid_Top 0x2BF // gTileset_MtEmber #define METATILE_MtEmber_CaveEntrance 0x346 // gTileset_PalletTown #define METATILE_PalletTown_Door 0x2A3 #define METATILE_PalletTown_OaksLabDoor 0x2AC // gTileset_PewterCity #define METATILE_PewterCity_Door 0x2CE // gTileset_PokemonCenter #define METATILE_PokemonCenter_CableClubDoor 0x2DE #define METATILE_PokemonCenter_CounterBarrier 0x2F9 #define METATILE_PokemonCenter_Escalator_BottomNextRail_Normal 0x2D0 #define METATILE_PokemonCenter_Escalator_BottomNextRail_Transition1 0x30A #define METATILE_PokemonCenter_Escalator_BottomNextRail_Transition2 0x308 #define METATILE_PokemonCenter_Escalator_BottomNext_Normal 0x2D8 #define METATILE_PokemonCenter_Escalator_BottomNext_Transition1 0x312 #define METATILE_PokemonCenter_Escalator_BottomNext_Transition2 0x310 #define METATILE_PokemonCenter_Escalator_BottomRail_Normal 0x2D1 #define METATILE_PokemonCenter_Escalator_BottomRail_Transition1 0x30B #define METATILE_PokemonCenter_Escalator_BottomRail_Transition2 0x309 #define METATILE_PokemonCenter_Escalator_Bottom_Normal 0x2D9 #define METATILE_PokemonCenter_Escalator_Bottom_Transition1 0x313 #define METATILE_PokemonCenter_Escalator_Bottom_Transition2 0x311 #define METATILE_PokemonCenter_Escalator_TopNextRail_Normal 0x2EB #define METATILE_PokemonCenter_Escalator_TopNextRail_Transition1 0x31E #define METATILE_PokemonCenter_Escalator_TopNextRail_Transition2 0x31C #define METATILE_PokemonCenter_Escalator_TopNext_Normal 0x2E3 #define METATILE_PokemonCenter_Escalator_TopNext_Transition1 0x316 #define METATILE_PokemonCenter_Escalator_TopNext_Transition2 0x314 #define METATILE_PokemonCenter_Escalator_Top_Normal 0x2E4 #define METATILE_PokemonCenter_Escalator_Top_Transition1 0x317 #define METATILE_PokemonCenter_Escalator_Top_Transition2 0x315 #define METATILE_PokemonCenter_Floor_ShadeLeft 0x2C5 #define METATILE_PokemonCenter_NetworkMachine_Ruby 0x35D #define METATILE_PokemonCenter_NetworkMachine_Sapphire 0x35F #define METATILE_PokemonCenter_NetworkMachine_ScreenLeft_On 0x35A #define METATILE_PokemonCenter_NetworkMachine_ScreenRight_On 0x35B // gTileset_PokemonLeague #define METATILE_PokemonLeague_Door_Mid_Open 0x296 #define METATILE_PokemonLeague_Door_Top_Open 0x28E #define METATILE_PokemonLeague_Entry_BottomLeft_Closed 0x2A5 #define METATILE_PokemonLeague_Entry_BottomMid_Closed 0x2A6 #define METATILE_PokemonLeague_Entry_BottomRight_Closed 0x2A7 #define METATILE_PokemonLeague_Entry_TopLeft_Closed 0x29D #define METATILE_PokemonLeague_Entry_TopMid_Closed 0x29E #define METATILE_PokemonLeague_Entry_TopRight_Closed 0x29F #define METATILE_PokemonLeague_Floor_ShadeFull_Lance 0x311 // gTileset_PokemonMansion #define METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft 0x300 #define METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft_Basement 0x354 #define METATILE_PokemonMansion_Barrier_Horizontal_BottomMid 0x301 #define METATILE_PokemonMansion_Barrier_Horizontal_BottomMid_Basement 0x355 #define METATILE_PokemonMansion_Barrier_Horizontal_BottomRight 0x302 #define METATILE_PokemonMansion_Barrier_Horizontal_BottomRight_Basement 0x356 #define METATILE_PokemonMansion_Barrier_Horizontal_TopLeft 0x2F8 #define METATILE_PokemonMansion_Barrier_Horizontal_TopMid 0x2F9 #define METATILE_PokemonMansion_Barrier_Horizontal_TopRight 0x2FA #define METATILE_PokemonMansion_Barrier_Vertical_Bottom 0x370 #define METATILE_PokemonMansion_Barrier_Vertical_Bottom_Basement 0x372 #define METATILE_PokemonMansion_Barrier_Vertical_Mid 0x368 #define METATILE_PokemonMansion_Barrier_Vertical_MidShadow 0x360 #define METATILE_PokemonMansion_Barrier_Vertical_MidShadow_Basement 0x362 #define METATILE_PokemonMansion_Barrier_Vertical_Mid_Basement 0x36A #define METATILE_PokemonMansion_Barrier_Vertical_TopBase 0x358 #define METATILE_PokemonMansion_Barrier_Vertical_TopWall 0x350 #define METATILE_PokemonMansion_BasementFloor 0x286 #define METATILE_PokemonMansion_BasementFloor_ShadeFull 0x287 #define METATILE_PokemonMansion_Floor 0x284 #define METATILE_PokemonMansion_Floor_ShadeFull 0x285 #define METATILE_PokemonMansion_Statue_BlackEyes 0x314 #define METATILE_PokemonMansion_Statue_BlackEyes_Basement 0x316 #define METATILE_PokemonMansion_Statue_BlackEyes_Shade 0x315 #define METATILE_PokemonMansion_Statue_RedEyes 0x34D #define METATILE_PokemonMansion_Statue_RedEyes_Basement 0x34F #define METATILE_PokemonMansion_Statue_RedEyes_Shade 0x34E #define METATILE_PokemonMansion_Wall_EndCap 0x2B5 #define METATILE_PokemonMansion_Wall_EndCap_Basement 0x2B0 #define METATILE_PokemonMansion_Wall_EndPost_Bottom 0x2AD #define METATILE_PokemonMansion_Wall_EndPost_Mid 0x2A5 // gTileset_SSAnne #define METATILE_SSAnne_Door 0x281 // gTileset_SaffronCity #define METATILE_SaffronCity_Door 0x284 #define METATILE_SaffronCity_SilphCoDoor 0x2BC // gTileset_SeaCottage #define METATILE_SeaCottage_Teleporter_CableBall_Bottom 0x2BA #define METATILE_SeaCottage_Teleporter_CableBall_Top 0x2B9 #define METATILE_SeaCottage_Teleporter_Cable_Bottom 0x2B4 #define METATILE_SeaCottage_Teleporter_Cable_Top 0x285 #define METATILE_SeaCottage_Teleporter_Door 0x296 #define METATILE_SeaCottage_Teleporter_Door_FullGlowing 0x2B8 #define METATILE_SeaCottage_Teleporter_Door_HalfGlowing 0x2B7 #define METATILE_SeaCottage_Teleporter_Light_Green 0x28A #define METATILE_SeaCottage_Teleporter_Light_Red 0x2B6 #define METATILE_SeaCottage_Teleporter_Light_Yellow 0x2B5 // gTileset_SeafoamIslands #define METATILE_SeafoamIslands_CrackedIce 0x35A #define METATILE_SeafoamIslands_IceHole 0x35B #define METATILE_SeafoamIslands_SlidingIce 0x34B #define METATILE_SeafoamIslands_UncrackedIce 0x359 // gTileset_SeviiIslands123 #define METATILE_SeviiIslands123_Door 0x297 #define METATILE_SeviiIslands123_GameCornerDoor 0x29B #define METATILE_SeviiIslands123_OneIsland_AshGrass 0x3DA #define METATILE_SeviiIslands123_OneIsland_Grass 0x3EC #define METATILE_SeviiIslands123_OneIsland_Mowed 0x3ED #define METATILE_SeviiIslands123_PokeCenterDoor 0x2EB // gTileset_SeviiIslands45 #define METATILE_SeviiIslands45_DayCareDoor 0x2B9 #define METATILE_SeviiIslands45_Door 0x29A #define METATILE_SeviiIslands45_RocketWarehouseDoor_Locked 0x30B #define METATILE_SeviiIslands45_RocketWarehouseDoor_Unlocked 0x2AF // gTileset_SeviiIslands5 #define METATILE_SeviiIslands5_MicroWideTreeTopLeft_Grass 0x2B2 #define METATILE_SeviiIslands5_MicroWideTreeTopLeft_Mowed 0x286 #define METATILE_SeviiIslands5_MicroWideTreeTopRight_Grass 0x2B3 #define METATILE_SeviiIslands5_MicroWideTreeTopRight_Mowed 0x287 #define METATILE_SeviiIslands5_Micro_Grass 0x28C #define METATILE_SeviiIslands5_Micro_Mowed 0x28B // gTileset_SeviiIslands67 #define METATILE_SeviiIslands67_BottomLeftCorner 0x30E #define METATILE_SeviiIslands67_BottomRightCorner 0x30F #define METATILE_SeviiIslands67_Door 0x30C #define METATILE_SeviiIslands67_DottedHoleDoor_Closed 0x357 #define METATILE_SeviiIslands67_DottedHoleDoor_Open 0x358 #define METATILE_SeviiIslands67_Down 0x308 #define METATILE_SeviiIslands67_EmeraldMowed 0x229 #define METATILE_SeviiIslands67_Grass_BottomLeftCorner 0x2F6 #define METATILE_SeviiIslands67_Grass_BottomRightCorner 0x2F7 #define METATILE_SeviiIslands67_Grass_Down 0x2D7 #define METATILE_SeviiIslands67_Grass_InnerCornerBottomLeft 0x2DB #define METATILE_SeviiIslands67_Grass_InnerCornerBottomRight 0x2DD #define METATILE_SeviiIslands67_Grass_InnerCornerTopLeft 0x2DC #define METATILE_SeviiIslands67_Grass_InnerCornerTopRight 0x2CF #define METATILE_SeviiIslands67_Grass_InnerCornersTopRightBottomLeft 0x2F5 #define METATILE_SeviiIslands67_Grass_Left 0x2DE #define METATILE_SeviiIslands67_Grass_Plain 0x2CE #define METATILE_SeviiIslands67_Grass_Right 0x2DF #define METATILE_SeviiIslands67_Grass_RightInnerCornerTopLeft 0x33D #define METATILE_SeviiIslands67_Grass_TopLeftCorner 0x2E6 #define METATILE_SeviiIslands67_Grass_TopRightCorner 0x2E7 #define METATILE_SeviiIslands67_Grass_Up 0x2D6 #define METATILE_SeviiIslands67_InnerCornerBottomLeft 0x303 #define METATILE_SeviiIslands67_InnerCornerBottomRight 0x302 #define METATILE_SeviiIslands67_InnerCornerTopLeft 0x30B #define METATILE_SeviiIslands67_InnerCornerTopRight 0x313 #define METATILE_SeviiIslands67_InnerCornersTopRightBottomLeft 0x359 #define METATILE_SeviiIslands67_Left 0x306 #define METATILE_SeviiIslands67_LongGrass_Bottom 0x23B #define METATILE_SeviiIslands67_LongGrass_Top 0x233 #define METATILE_SeviiIslands67_Plain 0x33A #define METATILE_SeviiIslands67_Right 0x307 #define METATILE_SeviiIslands67_RightInnerCornerTopLeft 0x390 #define METATILE_SeviiIslands67_TopLeftCorner 0x300 #define METATILE_SeviiIslands67_TopRightCorner 0x301 #define METATILE_SeviiIslands67_Up 0x332 // gTileset_SeviiIslands6 #define METATILE_SeviiIslands6_DO_NOT_DELETE 0x287 #define METATILE_SeviiIslands6_ForestTreeCorner_Left 0x2B3 #define METATILE_SeviiIslands6_ForestTreeCorner_Left_Mowed 0x2A0 #define METATILE_SeviiIslands6_ForestTreeCorner_Right 0x2B4 #define METATILE_SeviiIslands6_ForestTreeCorner_Right_Mowed 0x2A2 #define METATILE_SeviiIslands6_ForestTreeTop 0x2B5 #define METATILE_SeviiIslands6_ForestTreeTop_Mowed 0x28F // gTileset_ViridianCity #define METATILE_ViridianCity_Door 0x299 // gTileset_ViridianForest #define METATILE_ViridianForest_HugeTreeTopMiddle_Grass 0x284 #define METATILE_ViridianForest_HugeTreeTopMiddle_Mowed 0x281 // gTileset_SilphCo #define METATILE_SilphCo_Arrow_Down 0x2A8 #define METATILE_SilphCo_Arrow_Left 0x2A1 #define METATILE_SilphCo_Arrow_Right 0x2A9 #define METATILE_SilphCo_Arrow_Up 0x2A0 #define METATILE_SilphCo_ElevatorDoor 0x2E2 #define METATILE_SilphCo_ElevatorWindow_Bottom0 0x2F8 #define METATILE_SilphCo_ElevatorWindow_Bottom1 0x2F9 #define METATILE_SilphCo_ElevatorWindow_Bottom2 0x2FA #define METATILE_SilphCo_ElevatorWindow_Mid0 0x2F0 #define METATILE_SilphCo_ElevatorWindow_Mid1 0x2F1 #define METATILE_SilphCo_ElevatorWindow_Mid2 0x2F2 #define METATILE_SilphCo_ElevatorWindow_Top0 0x2E8 #define METATILE_SilphCo_ElevatorWindow_Top1 0x2E9 #define METATILE_SilphCo_ElevatorWindow_Top2 0x2EA #define METATILE_SilphCo_Floor 0x334 #define METATILE_SilphCo_Floor_ShadeFull 0x335 #define METATILE_SilphCo_Floor_WallLeftCorner 0x339 #define METATILE_SilphCo_Floor_WallRightCorner 0x33A #define METATILE_SilphCo_HideoutBarrier_BottomLeft 0x2D6 #define METATILE_SilphCo_HideoutBarrier_BottomRight 0x2D7 #define METATILE_SilphCo_HideoutBarrier_TopLeft_Floor 0x2CE #define METATILE_SilphCo_HideoutBarrier_TopLeft_Wall 0x2C6 #define METATILE_SilphCo_HideoutBarrier_TopRight_Floor 0x2CF #define METATILE_SilphCo_HideoutBarrier_TopRight_Wall 0x2C7 #define METATILE_SilphCo_HideoutElevatorDoor 0x2AB #define METATILE_SilphCo_HideoutFloor 0x281 #define METATILE_SilphCo_HideoutFloor_ShadeFull 0x282 #define METATILE_SilphCo_HorizontalBarrier_BottomLeft 0x3B8 #define METATILE_SilphCo_HorizontalBarrier_BottomRight 0x3B9 #define METATILE_SilphCo_HorizontalBarrier_TopLeft 0x3B0 #define METATILE_SilphCo_HorizontalBarrier_TopRight 0x3B1 #define METATILE_SilphCo_VerticalBarrier_BottomLeft 0x3C4 #define METATILE_SilphCo_VerticalBarrier_BottomRight 0x3C5 #define METATILE_SilphCo_VerticalBarrier_MidLeft 0x3C2 #define METATILE_SilphCo_VerticalBarrier_MidRight 0x3C3 #define METATILE_SilphCo_VerticalBarrier_TopLeft 0x3C0 #define METATILE_SilphCo_VerticalBarrier_TopRight 0x3C1 #define METATILE_SilphCo_Wall_LeftEdge 0x347 #define METATILE_SilphCo_Wall_RightEdge 0x346 // gTileset_TrainerTower #define METATILE_TrainerTower_CounterBarrier 0x2B4 #define METATILE_TrainerTower_Floor_ShadeBottomLeft 0x287 #define METATILE_TrainerTower_LobbyElevatorDoor 0x2C3 #define METATILE_TrainerTower_RoofElevatorDoor 0x356 // gTileset_VermilionCity #define METATILE_VermilionCity_Door 0x29E #define METATILE_VermilionCity_SSAnneWarp 0x2E1 // gTileset_VermilionGym #define METATILE_VermilionGym_Beam_MidBottom 0x28D #define METATILE_VermilionGym_Beam_MidBottom_HalfOn 0x2C5 #define METATILE_VermilionGym_Beam_MidTop 0x285 #define METATILE_VermilionGym_Beam_MidTop_HalfOn 0x2BD #define METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_HalfOn 0x2C4 #define METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_Off 0x29C #define METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_On 0x2B2 #define METATILE_VermilionGym_Beam_Node_BottomLeft_HalfOn 0x2C3 #define METATILE_VermilionGym_Beam_Node_BottomLeft_Off 0x29B #define METATILE_VermilionGym_Beam_Node_BottomLeft_On 0x2B1 #define METATILE_VermilionGym_Beam_Node_BottomRight_Edge_HalfOn 0x2C6 #define METATILE_VermilionGym_Beam_Node_BottomRight_Edge_Off 0x29D #define METATILE_VermilionGym_Beam_Node_BottomRight_Edge_On 0x2B3 #define METATILE_VermilionGym_Beam_Node_BottomRight_HalfOn 0x2C7 #define METATILE_VermilionGym_Beam_Node_BottomRight_Off 0x29E #define METATILE_VermilionGym_Beam_Node_BottomRight_On 0x2B4 #define METATILE_VermilionGym_Beam_Node_TopLeft_Edge_HalfOn 0x2BC #define METATILE_VermilionGym_Beam_Node_TopLeft_Edge_Off 0x294 #define METATILE_VermilionGym_Beam_Node_TopLeft_Edge_On 0x2AA #define METATILE_VermilionGym_Beam_Node_TopLeft_HalfOn 0x2BB #define METATILE_VermilionGym_Beam_Node_TopLeft_Off 0x293 #define METATILE_VermilionGym_Beam_Node_TopLeft_On 0x2A9 #define METATILE_VermilionGym_Beam_Node_TopRight_Edge_HalfOn 0x2BE #define METATILE_VermilionGym_Beam_Node_TopRight_Edge_Off 0x295 #define METATILE_VermilionGym_Beam_Node_TopRight_Edge_On 0x2AB #define METATILE_VermilionGym_Beam_Node_TopRight_HalfOn 0x2BF #define METATILE_VermilionGym_Beam_Node_TopRight_Off 0x296 #define METATILE_VermilionGym_Beam_Node_TopRight_On 0x2AC #define METATILE_VermilionGym_Floor 0x281 // gTileset_ViridianCity #define METATILE_ViridianCity_Door 0x299 // gTileset_ViridianForest #define METATILE_ViridianForest_HugeTreeTopMiddle_Grass 0x284 #define METATILE_ViridianForest_HugeTreeTopMiddle_Mowed 0x281 // Other #define METATILE_Fallarbor_AshGrass 0x20A #define METATILE_Fallarbor_NormalGrass 0x212 #define METATILE_Lavaridge_NormalGrass 0x206 #define METATILE_Pacifidlog_SkyPillar_CrackedFloor_Hole 0x237 #define METATILE_RSCave_CrackedFloor 0x22F #define METATILE_RSCave_CrackedFloor_Hole 0x206 #endif // GUARD_METATILE_LABELS_H ================================================ FILE: include/constants/moves.h ================================================ #ifndef GUARD_CONSTANTS_MOVES_H #define GUARD_CONSTANTS_MOVES_H #define MOVE_NONE 0 #define MOVE_POUND 1 #define MOVE_KARATE_CHOP 2 #define MOVE_DOUBLE_SLAP 3 #define MOVE_COMET_PUNCH 4 #define MOVE_MEGA_PUNCH 5 #define MOVE_PAY_DAY 6 #define MOVE_FIRE_PUNCH 7 #define MOVE_ICE_PUNCH 8 #define MOVE_THUNDER_PUNCH 9 #define MOVE_SCRATCH 10 #define MOVE_VICE_GRIP 11 #define MOVE_GUILLOTINE 12 #define MOVE_RAZOR_WIND 13 #define MOVE_SWORDS_DANCE 14 #define MOVE_CUT 15 #define MOVE_GUST 16 #define MOVE_WING_ATTACK 17 #define MOVE_WHIRLWIND 18 #define MOVE_FLY 19 #define MOVE_BIND 20 #define MOVE_SLAM 21 #define MOVE_VINE_WHIP 22 #define MOVE_STOMP 23 #define MOVE_DOUBLE_KICK 24 #define MOVE_MEGA_KICK 25 #define MOVE_JUMP_KICK 26 #define MOVE_ROLLING_KICK 27 #define MOVE_SAND_ATTACK 28 #define MOVE_HEADBUTT 29 #define MOVE_HORN_ATTACK 30 #define MOVE_FURY_ATTACK 31 #define MOVE_HORN_DRILL 32 #define MOVE_TACKLE 33 #define MOVE_BODY_SLAM 34 #define MOVE_WRAP 35 #define MOVE_TAKE_DOWN 36 #define MOVE_THRASH 37 #define MOVE_DOUBLE_EDGE 38 #define MOVE_TAIL_WHIP 39 #define MOVE_POISON_STING 40 #define MOVE_TWINEEDLE 41 #define MOVE_PIN_MISSILE 42 #define MOVE_LEER 43 #define MOVE_BITE 44 #define MOVE_GROWL 45 #define MOVE_ROAR 46 #define MOVE_SING 47 #define MOVE_SUPERSONIC 48 #define MOVE_SONIC_BOOM 49 #define MOVE_DISABLE 50 #define MOVE_ACID 51 #define MOVE_EMBER 52 #define MOVE_FLAMETHROWER 53 #define MOVE_MIST 54 #define MOVE_WATER_GUN 55 #define MOVE_HYDRO_PUMP 56 #define MOVE_SURF 57 #define MOVE_ICE_BEAM 58 #define MOVE_BLIZZARD 59 #define MOVE_PSYBEAM 60 #define MOVE_BUBBLE_BEAM 61 #define MOVE_AURORA_BEAM 62 #define MOVE_HYPER_BEAM 63 #define MOVE_PECK 64 #define MOVE_DRILL_PECK 65 #define MOVE_SUBMISSION 66 #define MOVE_LOW_KICK 67 #define MOVE_COUNTER 68 #define MOVE_SEISMIC_TOSS 69 #define MOVE_STRENGTH 70 #define MOVE_ABSORB 71 #define MOVE_MEGA_DRAIN 72 #define MOVE_LEECH_SEED 73 #define MOVE_GROWTH 74 #define MOVE_RAZOR_LEAF 75 #define MOVE_SOLAR_BEAM 76 #define MOVE_POISON_POWDER 77 #define MOVE_STUN_SPORE 78 #define MOVE_SLEEP_POWDER 79 #define MOVE_PETAL_DANCE 80 #define MOVE_STRING_SHOT 81 #define MOVE_DRAGON_RAGE 82 #define MOVE_FIRE_SPIN 83 #define MOVE_THUNDER_SHOCK 84 #define MOVE_THUNDERBOLT 85 #define MOVE_THUNDER_WAVE 86 #define MOVE_THUNDER 87 #define MOVE_ROCK_THROW 88 #define MOVE_EARTHQUAKE 89 #define MOVE_FISSURE 90 #define MOVE_DIG 91 #define MOVE_TOXIC 92 #define MOVE_CONFUSION 93 #define MOVE_PSYCHIC 94 #define MOVE_HYPNOSIS 95 #define MOVE_MEDITATE 96 #define MOVE_AGILITY 97 #define MOVE_QUICK_ATTACK 98 #define MOVE_RAGE 99 #define MOVE_TELEPORT 100 #define MOVE_NIGHT_SHADE 101 #define MOVE_MIMIC 102 #define MOVE_SCREECH 103 #define MOVE_DOUBLE_TEAM 104 #define MOVE_RECOVER 105 #define MOVE_HARDEN 106 #define MOVE_MINIMIZE 107 #define MOVE_SMOKESCREEN 108 #define MOVE_CONFUSE_RAY 109 #define MOVE_WITHDRAW 110 #define MOVE_DEFENSE_CURL 111 #define MOVE_BARRIER 112 #define MOVE_LIGHT_SCREEN 113 #define MOVE_HAZE 114 #define MOVE_REFLECT 115 #define MOVE_FOCUS_ENERGY 116 #define MOVE_BIDE 117 #define MOVE_METRONOME 118 #define MOVE_MIRROR_MOVE 119 #define MOVE_SELF_DESTRUCT 120 #define MOVE_EGG_BOMB 121 #define MOVE_LICK 122 #define MOVE_SMOG 123 #define MOVE_SLUDGE 124 #define MOVE_BONE_CLUB 125 #define MOVE_FIRE_BLAST 126 #define MOVE_WATERFALL 127 #define MOVE_CLAMP 128 #define MOVE_SWIFT 129 #define MOVE_SKULL_BASH 130 #define MOVE_SPIKE_CANNON 131 #define MOVE_CONSTRICT 132 #define MOVE_AMNESIA 133 #define MOVE_KINESIS 134 #define MOVE_SOFT_BOILED 135 #define MOVE_HI_JUMP_KICK 136 #define MOVE_GLARE 137 #define MOVE_DREAM_EATER 138 #define MOVE_POISON_GAS 139 #define MOVE_BARRAGE 140 #define MOVE_LEECH_LIFE 141 #define MOVE_LOVELY_KISS 142 #define MOVE_SKY_ATTACK 143 #define MOVE_TRANSFORM 144 #define MOVE_BUBBLE 145 #define MOVE_DIZZY_PUNCH 146 #define MOVE_SPORE 147 #define MOVE_FLASH 148 #define MOVE_PSYWAVE 149 #define MOVE_SPLASH 150 #define MOVE_ACID_ARMOR 151 #define MOVE_CRABHAMMER 152 #define MOVE_EXPLOSION 153 #define MOVE_FURY_SWIPES 154 #define MOVE_BONEMERANG 155 #define MOVE_REST 156 #define MOVE_ROCK_SLIDE 157 #define MOVE_HYPER_FANG 158 #define MOVE_SHARPEN 159 #define MOVE_CONVERSION 160 #define MOVE_TRI_ATTACK 161 #define MOVE_SUPER_FANG 162 #define MOVE_SLASH 163 #define MOVE_SUBSTITUTE 164 #define MOVE_STRUGGLE 165 #define MOVE_SKETCH 166 #define MOVE_TRIPLE_KICK 167 #define MOVE_THIEF 168 #define MOVE_SPIDER_WEB 169 #define MOVE_MIND_READER 170 #define MOVE_NIGHTMARE 171 #define MOVE_FLAME_WHEEL 172 #define MOVE_SNORE 173 #define MOVE_CURSE 174 #define MOVE_FLAIL 175 #define MOVE_CONVERSION_2 176 #define MOVE_AEROBLAST 177 #define MOVE_COTTON_SPORE 178 #define MOVE_REVERSAL 179 #define MOVE_SPITE 180 #define MOVE_POWDER_SNOW 181 #define MOVE_PROTECT 182 #define MOVE_MACH_PUNCH 183 #define MOVE_SCARY_FACE 184 #define MOVE_FAINT_ATTACK 185 #define MOVE_SWEET_KISS 186 #define MOVE_BELLY_DRUM 187 #define MOVE_SLUDGE_BOMB 188 #define MOVE_MUD_SLAP 189 #define MOVE_OCTAZOOKA 190 #define MOVE_SPIKES 191 #define MOVE_ZAP_CANNON 192 #define MOVE_FORESIGHT 193 #define MOVE_DESTINY_BOND 194 #define MOVE_PERISH_SONG 195 #define MOVE_ICY_WIND 196 #define MOVE_DETECT 197 #define MOVE_BONE_RUSH 198 #define MOVE_LOCK_ON 199 #define MOVE_OUTRAGE 200 #define MOVE_SANDSTORM 201 #define MOVE_GIGA_DRAIN 202 #define MOVE_ENDURE 203 #define MOVE_CHARM 204 #define MOVE_ROLLOUT 205 #define MOVE_FALSE_SWIPE 206 #define MOVE_SWAGGER 207 #define MOVE_MILK_DRINK 208 #define MOVE_SPARK 209 #define MOVE_FURY_CUTTER 210 #define MOVE_STEEL_WING 211 #define MOVE_MEAN_LOOK 212 #define MOVE_ATTRACT 213 #define MOVE_SLEEP_TALK 214 #define MOVE_HEAL_BELL 215 #define MOVE_RETURN 216 #define MOVE_PRESENT 217 #define MOVE_FRUSTRATION 218 #define MOVE_SAFEGUARD 219 #define MOVE_PAIN_SPLIT 220 #define MOVE_SACRED_FIRE 221 #define MOVE_MAGNITUDE 222 #define MOVE_DYNAMIC_PUNCH 223 #define MOVE_MEGAHORN 224 #define MOVE_DRAGON_BREATH 225 #define MOVE_BATON_PASS 226 #define MOVE_ENCORE 227 #define MOVE_PURSUIT 228 #define MOVE_RAPID_SPIN 229 #define MOVE_SWEET_SCENT 230 #define MOVE_IRON_TAIL 231 #define MOVE_METAL_CLAW 232 #define MOVE_VITAL_THROW 233 #define MOVE_MORNING_SUN 234 #define MOVE_SYNTHESIS 235 #define MOVE_MOONLIGHT 236 #define MOVE_HIDDEN_POWER 237 #define MOVE_CROSS_CHOP 238 #define MOVE_TWISTER 239 #define MOVE_RAIN_DANCE 240 #define MOVE_SUNNY_DAY 241 #define MOVE_CRUNCH 242 #define MOVE_MIRROR_COAT 243 #define MOVE_PSYCH_UP 244 #define MOVE_EXTREME_SPEED 245 #define MOVE_ANCIENT_POWER 246 #define MOVE_SHADOW_BALL 247 #define MOVE_FUTURE_SIGHT 248 #define MOVE_ROCK_SMASH 249 #define MOVE_WHIRLPOOL 250 #define MOVE_BEAT_UP 251 #define MOVE_FAKE_OUT 252 #define MOVE_UPROAR 253 #define MOVE_STOCKPILE 254 #define MOVE_SPIT_UP 255 #define MOVE_SWALLOW 256 #define MOVE_HEAT_WAVE 257 #define MOVE_HAIL 258 #define MOVE_TORMENT 259 #define MOVE_FLATTER 260 #define MOVE_WILL_O_WISP 261 #define MOVE_MEMENTO 262 #define MOVE_FACADE 263 #define MOVE_FOCUS_PUNCH 264 #define MOVE_SMELLING_SALT 265 #define MOVE_FOLLOW_ME 266 #define MOVE_NATURE_POWER 267 #define MOVE_CHARGE 268 #define MOVE_TAUNT 269 #define MOVE_HELPING_HAND 270 #define MOVE_TRICK 271 #define MOVE_ROLE_PLAY 272 #define MOVE_WISH 273 #define MOVE_ASSIST 274 #define MOVE_INGRAIN 275 #define MOVE_SUPERPOWER 276 #define MOVE_MAGIC_COAT 277 #define MOVE_RECYCLE 278 #define MOVE_REVENGE 279 #define MOVE_BRICK_BREAK 280 #define MOVE_YAWN 281 #define MOVE_KNOCK_OFF 282 #define MOVE_ENDEAVOR 283 #define MOVE_ERUPTION 284 #define MOVE_SKILL_SWAP 285 #define MOVE_IMPRISON 286 #define MOVE_REFRESH 287 #define MOVE_GRUDGE 288 #define MOVE_SNATCH 289 #define MOVE_SECRET_POWER 290 #define MOVE_DIVE 291 #define MOVE_ARM_THRUST 292 #define MOVE_CAMOUFLAGE 293 #define MOVE_TAIL_GLOW 294 #define MOVE_LUSTER_PURGE 295 #define MOVE_MIST_BALL 296 #define MOVE_FEATHER_DANCE 297 #define MOVE_TEETER_DANCE 298 #define MOVE_BLAZE_KICK 299 #define MOVE_MUD_SPORT 300 #define MOVE_ICE_BALL 301 #define MOVE_NEEDLE_ARM 302 #define MOVE_SLACK_OFF 303 #define MOVE_HYPER_VOICE 304 #define MOVE_POISON_FANG 305 #define MOVE_CRUSH_CLAW 306 #define MOVE_BLAST_BURN 307 #define MOVE_HYDRO_CANNON 308 #define MOVE_METEOR_MASH 309 #define MOVE_ASTONISH 310 #define MOVE_WEATHER_BALL 311 #define MOVE_AROMATHERAPY 312 #define MOVE_FAKE_TEARS 313 #define MOVE_AIR_CUTTER 314 #define MOVE_OVERHEAT 315 #define MOVE_ODOR_SLEUTH 316 #define MOVE_ROCK_TOMB 317 #define MOVE_SILVER_WIND 318 #define MOVE_METAL_SOUND 319 #define MOVE_GRASS_WHISTLE 320 #define MOVE_TICKLE 321 #define MOVE_COSMIC_POWER 322 #define MOVE_WATER_SPOUT 323 #define MOVE_SIGNAL_BEAM 324 #define MOVE_SHADOW_PUNCH 325 #define MOVE_EXTRASENSORY 326 #define MOVE_SKY_UPPERCUT 327 #define MOVE_SAND_TOMB 328 #define MOVE_SHEER_COLD 329 #define MOVE_MUDDY_WATER 330 #define MOVE_BULLET_SEED 331 #define MOVE_AERIAL_ACE 332 #define MOVE_ICICLE_SPEAR 333 #define MOVE_IRON_DEFENSE 334 #define MOVE_BLOCK 335 #define MOVE_HOWL 336 #define MOVE_DRAGON_CLAW 337 #define MOVE_FRENZY_PLANT 338 #define MOVE_BULK_UP 339 #define MOVE_BOUNCE 340 #define MOVE_MUD_SHOT 341 #define MOVE_POISON_TAIL 342 #define MOVE_COVET 343 #define MOVE_VOLT_TACKLE 344 #define MOVE_MAGICAL_LEAF 345 #define MOVE_WATER_SPORT 346 #define MOVE_CALM_MIND 347 #define MOVE_LEAF_BLADE 348 #define MOVE_DRAGON_DANCE 349 #define MOVE_ROCK_BLAST 350 #define MOVE_SHOCK_WAVE 351 #define MOVE_WATER_PULSE 352 #define MOVE_DOOM_DESIRE 353 #define MOVE_PSYCHO_BOOST 354 #define MOVES_COUNT 355 // Used for checks for moves affected by Disable, Mimic, etc. #define MOVE_UNAVAILABLE 0xFFFF #define MOVETUTOR_MEGA_PUNCH 0 #define MOVETUTOR_SWORDS_DANCE 1 #define MOVETUTOR_MEGA_KICK 2 #define MOVETUTOR_BODY_SLAM 3 #define MOVETUTOR_DOUBLE_EDGE 4 #define MOVETUTOR_COUNTER 5 #define MOVETUTOR_SEISMIC_TOSS 6 #define MOVETUTOR_MIMIC 7 #define MOVETUTOR_METRONOME 8 #define MOVETUTOR_SOFT_BOILED 9 #define MOVETUTOR_DREAM_EATER 10 #define MOVETUTOR_THUNDER_WAVE 11 #define MOVETUTOR_EXPLOSION 12 #define MOVETUTOR_ROCK_SLIDE 13 #define MOVETUTOR_SUBSTITUTE 14 #define MOVETUTOR_DYNAMIC_PUNCH 15 #define MOVETUTOR_ROLLOUT 16 #define MOVETUTOR_PSYCH_UP 17 #define MOVETUTOR_SNORE 18 #define MOVETUTOR_ICY_WIND 19 #define MOVETUTOR_ENDURE 20 #define MOVETUTOR_MUD_SLAP 21 #define MOVETUTOR_ICE_PUNCH 22 #define MOVETUTOR_SWAGGER 23 #define MOVETUTOR_SLEEP_TALK 24 #define MOVETUTOR_SWIFT 25 #define MOVETUTOR_DEFENSE_CURL 26 #define MOVETUTOR_THUNDER_PUNCH 27 #define MOVETUTOR_FIRE_PUNCH 28 #define MOVETUTOR_FURY_CUTTER 29 #define MOVETUTOR_NIGHTMARE 30 #define MOVETUTOR_SELF_DESTRUCT 31 #define MOVETUTOR_SKY_ATTACK 32 #define MOVETUTOR_FRENZY_PLANT 33 #define MOVETUTOR_BLAST_BURN 34 #define MOVETUTOR_HYDRO_CANNON 35 #endif // GUARD_CONSTANTS_MOVES_H ================================================ FILE: include/constants/mystery_gift.h ================================================ #ifndef GUARD_CONSTANTS_MYSTERY_GIFT_H #define GUARD_CONSTANTS_MYSTERY_GIFT_H #define GET_NUM_STAMPS 0 #define GET_MAX_STAMPS 1 #define GET_CARD_BATTLES_WON 2 #define GET_CARD_BATTLES_LOST 3 #define GET_CARD_NUM_TRADES 4 #define CARD_STAT_BATTLES_WON 0 #define CARD_STAT_BATTLES_LOST 1 #define CARD_STAT_NUM_TRADES 2 #define CARD_STAT_NUM_STAMPS 3 #define CARD_STAT_MAX_STAMPS 4 // Values for the type field of Wonder Card #define CARD_TYPE_GIFT 0 // Normal "Wonder Card" #define CARD_TYPE_STAMP 1 // "Stamp Card" #define CARD_TYPE_LINK_STAT 2 // Referred to as the "Battle Card", shows battle and trade stats #define CARD_TYPE_COUNT 3 // Values for the sendType field of Wonder Card/News #define SEND_TYPE_DISALLOWED 0 #define SEND_TYPE_ALLOWED 1 #define SEND_TYPE_ALLOWED_ALWAYS 2 // Return values for MysteryGift_CompareCardFlags, handled by gMysteryGiftServerScript_SendWonderCard #define HAS_NO_CARD 0 #define HAS_SAME_CARD 1 #define HAS_DIFF_CARD 2 // The number of battles needed to be recorded on a Battle Card to win a prize #define REQUIRED_CARD_BATTLES 3 // Stamps are 32 bits. The first 16 bits are the species // and the second 16 bits are a number (presumably an ID of some kind) #define STAMP_SPECIES 0 #define STAMP_ID 1 // Number of different types/colors of Wonder Card and News backgrounds #define NUM_WONDER_BGS 8 #define MAX_WONDER_CARD_STAT 999 #define WONDER_CARD_FLAG_OFFSET 1000 #define NEWS_REWARD_NONE 0 #define NEWS_REWARD_RECV_SMALL 1 #define NEWS_REWARD_RECV_BIG 2 #define NEWS_REWARD_WAITING 3 #define NEWS_REWARD_SENT_SMALL 4 #define NEWS_REWARD_SENT_BIG 5 #define NEWS_REWARD_AT_MAX 6 #endif //GUARD_CONSTANTS_MYSTERY_GIFT_H ================================================ FILE: include/constants/opponents.h ================================================ #ifndef GUARD_CONSTANTS_OPPONENTS_H #define GUARD_CONSTANTS_OPPONENTS_H #define TRAINER_NONE 0 #define TRAINER_LT_SURGE_REMATCH 1 #define TRAINER_LT_SURGE_REMATCH_CHALLENGE 2 #define TRAINER_ERIKA_REMATCH 3 #define TRAINER_ERIKA_REMATCH_CHALLENGE 4 #define TRAINER_KOGA_REMATCH 5 #define TRAINER_KOGA_REMATCH_CHALLENGE 6 #define TRAINER_SABRINA_REMATCH 7 #define TRAINER_SABRINA_REMATCH_CHALLENGE 8 #define TRAINER_BLAINE_REMATCH 9 #define TRAINER_BLAINE_REMATCH_CHALLENGE 10 #define TRAINER_PKMN_RANGER_HELENA 11 #define TRAINER_PKMN_RANGER_HELENA_2 12 #define TRAINER_COOLTRAINER_ATTICUS 13 #define TRAINER_COOLTRAINER_ATTICUS_2 14 #define TRAINER_FISHERMAN_DEFOREST 15 #define TRAINER_FISHERMAN_DEFOREST_2 16 #define TRAINER_BIRD_KEEPER_SPEDO 17 #define TRAINER_BIRD_KEEPER_SPEDO_2 18 #define TRAINER_COOLTRAINER_CASPARA 19 #define TRAINER_COOLTRAINER_CASPARA_2 20 #define TRAINER_SWIMMER_FEMALE_SEDEF 21 #define TRAINER_SWIMMER_FEMALE_SEDEF_2 22 #define TRAINER_MASTER_OAK 23 #define TRAINER_MISTY_REMATCH_CHALLENGE 24 #define TRAINER_ELITE_FOUR_SIDNEY 25 #define TRAINER_ELITE_FOUR_PHOEBE 26 #define TRAINER_LEADER_ROXANNE 27 #define TRAINER_LEADER_BRAWLY 28 #define TRAINER_LEADER_TATE_LIZA 29 #define TRAINER_SCHOOL_KID_M 30 #define TRAINER_SCHOOL_KID_F 31 #define TRAINER_SR_AND_JR 32 #define TRAINER_POKEFAN_M 33 #define TRAINER_POKEFAN_F 34 #define TRAINER_EXPERT_M 35 #define TRAINER_EXPERT_F 36 #define TRAINER_RS_YOUNGSTER 37 #define TRAINER_RS_CHAMPION 38 #define TRAINER_RS_FISHERMAN 39 #define TRAINER_CYCLING_TRIATHLETE_M 40 #define TRAINER_CYCLING_TRIATHLETE_F 41 #define TRAINER_RUNNING_TRIATHLETE_M 42 #define TRAINER_RUNNING_TRIATHLETE_F 43 #define TRAINER_SWIMMING_TRIATHLETE_M 44 #define TRAINER_SWIMMING_TRIATHLETE_F 45 #define TRAINER_DRAGON_TAMER 46 #define TRAINER_RS_BIRD_KEEPER 47 #define TRAINER_NINJA_BOY 48 #define TRAINER_BATTLE_GIRL 49 #define TRAINER_PARASOL_LADY 50 #define TRAINER_RS_SWIMMER_F 51 #define TRAINER_RS_PICNICKER 52 #define TRAINER_RS_TWINS 53 #define TRAINER_RS_SAILOR 54 #define TRAINER_BOARDER_M 55 #define TRAINER_BOARDER_F 56 #define TRAINER_COLLECTOR 57 #define TRAINER_WALLY 58 #define TRAINER_BRENDAN 59 #define TRAINER_BRENDAN_2 60 #define TRAINER_BRENDAN_3 61 #define TRAINER_MAY 62 #define TRAINER_MAY_2 63 #define TRAINER_MAY_3 64 #define TRAINER_RS_PKMN_BREEDER_M 65 #define TRAINER_RS_PKMN_BREEDER_F 66 #define TRAINER_RS_PKMN_RANGER_M 67 #define TRAINER_RS_PKMN_RANGER_F 68 #define TRAINER_MAGMA_LEADER 69 #define TRAINER_MAGMA_GRUNT_M 70 #define TRAINER_MAMGA_GRUNT_F 71 #define TRAINER_RS_LASS 72 #define TRAINER_RS_BUG_CATCHER 73 #define TRAINER_RS_HIKER 74 #define TRAINER_RS_YOUNG_COUPLE 75 #define TRAINER_OLD_COUPLE 76 #define TRAINER_RS_SIS_AND_BRO 77 #define TRAINER_AQUA_ADMIN_MATT 78 #define TRAINER_AQUA_ADMIN_SHELLY 79 #define TRAINER_MAGMA_ADMIN_TABITHA 80 #define TRAINER_MAGMA_ADMIN_COURTNEY 81 #define TRAINER_LEADER_WATTSON 82 #define TRAINER_LEADER_FLANNERY 83 #define TRAINER_LEADER_NORMAN 84 #define TRAINER_LEADER_WINONA 85 #define TRAINER_LEADER_WALLACE 86 #define TRAINER_ELITE_FOUR_GLACIA 87 #define TRAINER_ELITE_FOUR_DRAKE 88 // Actual FRLG trainers start here #define TRAINER_YOUNGSTER_BEN 89 #define TRAINER_YOUNGSTER_CALVIN 90 #define TRAINER_YOUNGSTER_JOSH 91 #define TRAINER_YOUNGSTER_TIMMY 92 #define TRAINER_YOUNGSTER_JOEY 93 #define TRAINER_YOUNGSTER_DAN 94 #define TRAINER_YOUNGSTER_CHAD 95 #define TRAINER_YOUNGSTER_TYLER 96 #define TRAINER_YOUNGSTER_EDDIE 97 #define TRAINER_YOUNGSTER_DILLON 98 #define TRAINER_YOUNGSTER_YASU 99 #define TRAINER_YOUNGSTER_DAVE 100 #define TRAINER_YOUNGSTER_BEN_2 101 #define TRAINER_BUG_CATCHER_RICK 102 #define TRAINER_BUG_CATCHER_DOUG 103 #define TRAINER_BUG_CATCHER_SAMMY 104 #define TRAINER_BUG_CATCHER_COLTON 105 #define TRAINER_BUG_CATCHER_GREG 106 #define TRAINER_BUG_CATCHER_JAMES 107 #define TRAINER_BUG_CATCHER_KENT 108 #define TRAINER_BUG_CATCHER_ROBBY 109 #define TRAINER_BUG_CATCHER_CALE 110 #define TRAINER_BUG_CATCHER_KEIGO 111 #define TRAINER_BUG_CATCHER_ELIJAH 112 #define TRAINER_BUG_CATCHER_2 113 #define TRAINER_BUG_CATCHER_BRENT 114 #define TRAINER_BUG_CATCHER_CONNER 115 #define TRAINER_LASS_JANICE 116 #define TRAINER_LASS_SALLY 117 #define TRAINER_LASS_ROBIN 118 #define TRAINER_LASS_CRISSY 119 #define TRAINER_LASS_MIRIAM 120 #define TRAINER_LASS_IRIS 121 #define TRAINER_LASS_RELI 122 #define TRAINER_LASS_ALI 123 #define TRAINER_LASS_2 124 #define TRAINER_LASS_HALEY 125 #define TRAINER_LASS_ANN 126 #define TRAINER_LASS_DAWN 127 #define TRAINER_LASS_PAIGE 128 #define TRAINER_LASS_ANDREA 129 #define TRAINER_LASS_MEGAN 130 #define TRAINER_LASS_JULIA 131 #define TRAINER_LASS_KAY 132 #define TRAINER_LASS_LISA 133 #define TRAINER_SAILOR_EDMOND 134 #define TRAINER_SAILOR_TREVOR 135 #define TRAINER_SAILOR_LEONARD 136 #define TRAINER_SAILOR_DUNCAN 137 #define TRAINER_SAILOR_HUEY 138 #define TRAINER_SAILOR_DYLAN 139 #define TRAINER_SAILOR_PHILLIP 140 #define TRAINER_SAILOR_DWAYNE 141 #define TRAINER_CAMPER_LIAM 142 #define TRAINER_CAMPER_SHANE 143 #define TRAINER_CAMPER_ETHAN 144 #define TRAINER_CAMPER_RICKY 145 #define TRAINER_CAMPER_JEFF 146 #define TRAINER_CAMPER_2 147 #define TRAINER_CAMPER_CHRIS 148 #define TRAINER_CAMPER_DREW 149 #define TRAINER_PICNICKER_DIANA 150 #define TRAINER_PICNICKER_NANCY 151 #define TRAINER_PICNICKER_ISABELLE 152 #define TRAINER_PICNICKER_KELSEY 153 #define TRAINER_PICNICKER_ALICIA 154 #define TRAINER_PICNICKER_CAITLIN 155 #define TRAINER_PICNICKER_HEIDI 156 #define TRAINER_PICNICKER_CAROL 157 #define TRAINER_PICNICKER_SOFIA 158 #define TRAINER_PICNICKER_MARTHA 159 #define TRAINER_PICNICKER_TINA 160 #define TRAINER_PICNICKER_HANNAH 161 #define TRAINER_POKEMANIAC_MARK 162 #define TRAINER_POKEMANIAC_HERMAN 163 #define TRAINER_POKEMANIAC_COOPER 164 #define TRAINER_POKEMANIAC_STEVE 165 #define TRAINER_POKEMANIAC_WINSTON 166 #define TRAINER_POKEMANIAC_DAWSON 167 #define TRAINER_POKEMANIAC_ASHTON 168 #define TRAINER_SUPER_NERD_JOVAN 169 #define TRAINER_SUPER_NERD_MIGUEL 170 #define TRAINER_SUPER_NERD_AIDAN 171 #define TRAINER_SUPER_NERD_GLENN 172 #define TRAINER_SUPER_NERD_LESLIE 173 #define TRAINER_SUPER_NERD_1 174 #define TRAINER_SUPER_NERD_2 175 #define TRAINER_SUPER_NERD_3 176 #define TRAINER_SUPER_NERD_ERIK 177 #define TRAINER_SUPER_NERD_AVERY 178 #define TRAINER_SUPER_NERD_DEREK 179 #define TRAINER_SUPER_NERD_ZAC 180 #define TRAINER_HIKER_MARCOS 181 #define TRAINER_HIKER_FRANKLIN 182 #define TRAINER_HIKER_NOB 183 #define TRAINER_HIKER_WAYNE 184 #define TRAINER_HIKER_ALAN 185 #define TRAINER_HIKER_BRICE 186 #define TRAINER_HIKER_CLARK 187 #define TRAINER_HIKER_TRENT 188 #define TRAINER_HIKER_DUDLEY 189 #define TRAINER_HIKER_ALLEN 190 #define TRAINER_HIKER_ERIC 191 #define TRAINER_HIKER_LENNY 192 #define TRAINER_HIKER_OLIVER 193 #define TRAINER_HIKER_LUCAS 194 #define TRAINER_BIKER_JARED 195 #define TRAINER_BIKER_MALIK 196 #define TRAINER_BIKER_ERNEST 197 #define TRAINER_BIKER_ALEX 198 #define TRAINER_BIKER_LAO 199 #define TRAINER_BIKER_1 200 #define TRAINER_BIKER_HIDEO 201 #define TRAINER_BIKER_RUBEN 202 #define TRAINER_BIKER_BILLY 203 #define TRAINER_BIKER_NIKOLAS 204 #define TRAINER_BIKER_JAXON 205 #define TRAINER_BIKER_WILLIAM 206 #define TRAINER_BIKER_LUKAS 207 #define TRAINER_BIKER_ISAAC 208 #define TRAINER_BIKER_GERALD 209 #define TRAINER_BURGLAR_1 210 #define TRAINER_BURGLAR_2 211 #define TRAINER_BURGLAR_3 212 #define TRAINER_BURGLAR_QUINN 213 #define TRAINER_BURGLAR_RAMON 214 #define TRAINER_BURGLAR_DUSTY 215 #define TRAINER_BURGLAR_ARNIE 216 #define TRAINER_BURGLAR_4 217 #define TRAINER_BURGLAR_SIMON 218 #define TRAINER_BURGLAR_LEWIS 219 #define TRAINER_ENGINEER_BAILY 220 #define TRAINER_ENGINEER_BRAXTON 221 #define TRAINER_ENGINEER_BERNIE 222 #define TRAINER_FISHERMAN_DALE 223 #define TRAINER_FISHERMAN_BARNY 224 #define TRAINER_FISHERMAN_NED 225 #define TRAINER_FISHERMAN_CHIP 226 #define TRAINER_FISHERMAN_HANK 227 #define TRAINER_FISHERMAN_ELLIOT 228 #define TRAINER_FISHERMAN_RONALD 229 #define TRAINER_FISHERMAN_CLAUDE 230 #define TRAINER_FISHERMAN_WADE 231 #define TRAINER_FISHERMAN_NOLAN 232 #define TRAINER_FISHERMAN_ANDREW 233 #define TRAINER_SWIMMER_MALE_LUIS 234 #define TRAINER_SWIMMER_MALE_RICHARD 235 #define TRAINER_SWIMMER_MALE_REECE 236 #define TRAINER_SWIMMER_MALE_MATTHEW 237 #define TRAINER_SWIMMER_MALE_DOUGLAS 238 #define TRAINER_SWIMMER_MALE_DAVID 239 #define TRAINER_SWIMMER_MALE_TONY 240 #define TRAINER_SWIMMER_MALE_AXLE 241 #define TRAINER_SWIMMER_MALE_BARRY 242 #define TRAINER_SWIMMER_MALE_DEAN 243 #define TRAINER_SWIMMER_MALE_DARRIN 244 #define TRAINER_SWIMMER_MALE_SPENCER 245 #define TRAINER_SWIMMER_MALE_JACK 246 #define TRAINER_SWIMMER_MALE_JEROME 247 #define TRAINER_SWIMMER_MALE_ROLAND 248 #define TRAINER_CUE_BALL_KOJI 249 #define TRAINER_CUE_BALL_LUKE 250 #define TRAINER_CUE_BALL_CAMRON 251 #define TRAINER_CUE_BALL_RAUL 252 #define TRAINER_CUE_BALL_ISAIAH 253 #define TRAINER_CUE_BALL_ZEEK 254 #define TRAINER_CUE_BALL_JAMAL 255 #define TRAINER_CUE_BALL_COREY 256 #define TRAINER_CUE_BALL_CHASE 257 #define TRAINER_GAMER_HUGO 258 #define TRAINER_GAMER_JASPER 259 #define TRAINER_GAMER_DIRK 260 #define TRAINER_GAMER_DARIAN 261 #define TRAINER_GAMER_STAN 262 #define TRAINER_GAMER_1 263 #define TRAINER_GAMER_RICH 264 #define TRAINER_BEAUTY_BRIDGET 265 #define TRAINER_BEAUTY_TAMIA 266 #define TRAINER_BEAUTY_LORI 267 #define TRAINER_BEAUTY_LOLA 268 #define TRAINER_BEAUTY_SHEILA 269 #define TRAINER_SWIMMER_FEMALE_TIFFANY 270 #define TRAINER_SWIMMER_FEMALE_NORA 271 #define TRAINER_SWIMMER_FEMALE_MELISSA 272 #define TRAINER_BEAUTY_GRACE 273 #define TRAINER_BEAUTY_OLIVIA 274 #define TRAINER_BEAUTY_LAUREN 275 #define TRAINER_SWIMMER_FEMALE_ANYA 276 #define TRAINER_SWIMMER_FEMALE_ALICE 277 #define TRAINER_SWIMMER_FEMALE_CONNIE 278 #define TRAINER_SWIMMER_FEMALE_SHIRLEY 279 #define TRAINER_PSYCHIC_JOHAN 280 #define TRAINER_PSYCHIC_TYRON 281 #define TRAINER_PSYCHIC_CAMERON 282 #define TRAINER_PSYCHIC_PRESTON 283 #define TRAINER_ROCKER_RANDALL 284 #define TRAINER_ROCKER_LUCA 285 #define TRAINER_JUGGLER_DALTON 286 #define TRAINER_JUGGLER_NELSON 287 #define TRAINER_JUGGLER_KIRK 288 #define TRAINER_JUGGLER_SHAWN 289 #define TRAINER_JUGGLER_GREGORY 290 #define TRAINER_JUGGLER_EDWARD 291 #define TRAINER_JUGGLER_KAYDEN 292 #define TRAINER_JUGGLER_NATE 293 #define TRAINER_TAMER_PHIL 294 #define TRAINER_TAMER_EDGAR 295 #define TRAINER_TAMER_JASON 296 #define TRAINER_TAMER_COLE 297 #define TRAINER_TAMER_VINCENT 298 #define TRAINER_TAMER_JOHN 299 #define TRAINER_BIRD_KEEPER_SEBASTIAN 300 #define TRAINER_BIRD_KEEPER_PERRY 301 #define TRAINER_BIRD_KEEPER_ROBERT 302 #define TRAINER_BIRD_KEEPER_DONALD 303 #define TRAINER_BIRD_KEEPER_BENNY 304 #define TRAINER_BIRD_KEEPER_EDWIN 305 #define TRAINER_BIRD_KEEPER_CHESTER 306 #define TRAINER_BIRD_KEEPER_WILTON 307 #define TRAINER_BIRD_KEEPER_RAMIRO 308 #define TRAINER_BIRD_KEEPER_JACOB 309 #define TRAINER_BIRD_KEEPER_ROGER 310 #define TRAINER_BIRD_KEEPER_REED 311 #define TRAINER_BIRD_KEEPER_KEITH 312 #define TRAINER_BIRD_KEEPER_CARTER 313 #define TRAINER_BIRD_KEEPER_MITCH 314 #define TRAINER_BIRD_KEEPER_BECK 315 #define TRAINER_BIRD_KEEPER_MARLON 316 #define TRAINER_BLACK_BELT_KOICHI 317 #define TRAINER_BLACK_BELT_MIKE 318 #define TRAINER_BLACK_BELT_HIDEKI 319 #define TRAINER_BLACK_BELT_AARON 320 #define TRAINER_BLACK_BELT_HITOSHI 321 #define TRAINER_BLACK_BELT_ATSUSHI 322 #define TRAINER_BLACK_BELT_KIYO 323 #define TRAINER_BLACK_BELT_TAKASHI 324 #define TRAINER_BLACK_BELT_DAISUKE 325 #define TRAINER_RIVAL_OAKS_LAB_SQUIRTLE 326 #define TRAINER_RIVAL_OAKS_LAB_BULBASAUR 327 #define TRAINER_RIVAL_OAKS_LAB_CHARMANDER 328 #define TRAINER_RIVAL_ROUTE22_EARLY_SQUIRTLE 329 #define TRAINER_RIVAL_ROUTE22_EARLY_BULBASAUR 330 #define TRAINER_RIVAL_ROUTE22_EARLY_CHARMANDER 331 #define TRAINER_RIVAL_CERULEAN_SQUIRTLE 332 #define TRAINER_RIVAL_CERULEAN_BULBASAUR 333 #define TRAINER_RIVAL_CERULEAN_CHARMANDER 334 #define TRAINER_SCIENTIST_TED 335 #define TRAINER_SCIENTIST_CONNOR 336 #define TRAINER_SCIENTIST_JERRY 337 #define TRAINER_SCIENTIST_JOSE 338 #define TRAINER_SCIENTIST_RODNEY 339 #define TRAINER_SCIENTIST_BEAU 340 #define TRAINER_SCIENTIST_TAYLOR 341 #define TRAINER_SCIENTIST_JOSHUA 342 #define TRAINER_SCIENTIST_PARKER 343 #define TRAINER_SCIENTIST_ED 344 #define TRAINER_SCIENTIST_TRAVIS 345 #define TRAINER_SCIENTIST_BRAYDON 346 #define TRAINER_SCIENTIST_IVAN 347 #define TRAINER_BOSS_GIOVANNI 348 #define TRAINER_BOSS_GIOVANNI_2 349 #define TRAINER_LEADER_GIOVANNI 350 #define TRAINER_TEAM_ROCKET_GRUNT 351 #define TRAINER_TEAM_ROCKET_GRUNT_2 352 #define TRAINER_TEAM_ROCKET_GRUNT_3 353 #define TRAINER_TEAM_ROCKET_GRUNT_4 354 #define TRAINER_TEAM_ROCKET_GRUNT_5 355 #define TRAINER_TEAM_ROCKET_GRUNT_6 356 #define TRAINER_TEAM_ROCKET_GRUNT_7 357 #define TRAINER_TEAM_ROCKET_GRUNT_8 358 #define TRAINER_TEAM_ROCKET_GRUNT_9 359 #define TRAINER_TEAM_ROCKET_GRUNT_10 360 #define TRAINER_TEAM_ROCKET_GRUNT_11 361 #define TRAINER_TEAM_ROCKET_GRUNT_12 362 #define TRAINER_TEAM_ROCKET_GRUNT_13 363 #define TRAINER_TEAM_ROCKET_GRUNT_14 364 #define TRAINER_TEAM_ROCKET_GRUNT_15 365 #define TRAINER_TEAM_ROCKET_GRUNT_16 366 #define TRAINER_TEAM_ROCKET_GRUNT_17 367 #define TRAINER_TEAM_ROCKET_GRUNT_18 368 #define TRAINER_TEAM_ROCKET_GRUNT_19 369 #define TRAINER_TEAM_ROCKET_GRUNT_20 370 #define TRAINER_TEAM_ROCKET_GRUNT_21 371 #define TRAINER_TEAM_ROCKET_GRUNT_22 372 #define TRAINER_TEAM_ROCKET_GRUNT_23 373 #define TRAINER_TEAM_ROCKET_GRUNT_24 374 #define TRAINER_TEAM_ROCKET_GRUNT_25 375 #define TRAINER_TEAM_ROCKET_GRUNT_26 376 #define TRAINER_TEAM_ROCKET_GRUNT_27 377 #define TRAINER_TEAM_ROCKET_GRUNT_28 378 #define TRAINER_TEAM_ROCKET_GRUNT_29 379 #define TRAINER_TEAM_ROCKET_GRUNT_30 380 #define TRAINER_TEAM_ROCKET_GRUNT_31 381 #define TRAINER_TEAM_ROCKET_GRUNT_32 382 #define TRAINER_TEAM_ROCKET_GRUNT_33 383 #define TRAINER_TEAM_ROCKET_GRUNT_34 384 #define TRAINER_TEAM_ROCKET_GRUNT_35 385 #define TRAINER_TEAM_ROCKET_GRUNT_36 386 #define TRAINER_TEAM_ROCKET_GRUNT_37 387 #define TRAINER_TEAM_ROCKET_GRUNT_38 388 #define TRAINER_TEAM_ROCKET_GRUNT_39 389 #define TRAINER_TEAM_ROCKET_GRUNT_40 390 #define TRAINER_TEAM_ROCKET_GRUNT_41 391 #define TRAINER_COOLTRAINER_SAMUEL 392 #define TRAINER_COOLTRAINER_GEORGE 393 #define TRAINER_COOLTRAINER_COLBY 394 #define TRAINER_COOLTRAINER_PAUL 395 #define TRAINER_COOLTRAINER_ROLANDO 396 #define TRAINER_COOLTRAINER_GILBERT 397 #define TRAINER_COOLTRAINER_OWEN 398 #define TRAINER_COOLTRAINER_BERKE 399 #define TRAINER_COOLTRAINER_YUJI 400 #define TRAINER_COOLTRAINER_WARREN 401 #define TRAINER_COOLTRAINER_MARY 402 #define TRAINER_COOLTRAINER_CAROLINE 403 #define TRAINER_COOLTRAINER_ALEXA 404 #define TRAINER_COOLTRAINER_SHANNON 405 #define TRAINER_COOLTRAINER_NAOMI 406 #define TRAINER_COOLTRAINER_BROOKE 407 #define TRAINER_COOLTRAINER_AUSTINA 408 #define TRAINER_COOLTRAINER_JULIE 409 #define TRAINER_ELITE_FOUR_LORELEI 410 #define TRAINER_ELITE_FOUR_BRUNO 411 #define TRAINER_ELITE_FOUR_AGATHA 412 #define TRAINER_ELITE_FOUR_LANCE 413 #define TRAINER_LEADER_BROCK 414 #define TRAINER_LEADER_MISTY 415 #define TRAINER_LEADER_LT_SURGE 416 #define TRAINER_LEADER_ERIKA 417 #define TRAINER_LEADER_KOGA 418 #define TRAINER_LEADER_BLAINE 419 #define TRAINER_LEADER_SABRINA 420 #define TRAINER_GENTLEMAN_THOMAS 421 #define TRAINER_GENTLEMAN_ARTHUR 422 #define TRAINER_GENTLEMAN_TUCKER 423 #define TRAINER_GENTLEMAN_NORTON 424 #define TRAINER_GENTLEMAN_WALTER 425 #define TRAINER_RIVAL_SS_ANNE_SQUIRTLE 426 #define TRAINER_RIVAL_SS_ANNE_BULBASAUR 427 #define TRAINER_RIVAL_SS_ANNE_CHARMANDER 428 #define TRAINER_RIVAL_POKEMON_TOWER_SQUIRTLE 429 #define TRAINER_RIVAL_POKEMON_TOWER_BULBASAUR 430 #define TRAINER_RIVAL_POKEMON_TOWER_CHARMANDER 431 #define TRAINER_RIVAL_SILPH_SQUIRTLE 432 #define TRAINER_RIVAL_SILPH_BULBASAUR 433 #define TRAINER_RIVAL_SILPH_CHARMANDER 434 #define TRAINER_RIVAL_ROUTE22_LATE_SQUIRTLE 435 #define TRAINER_RIVAL_ROUTE22_LATE_BULBASAUR 436 #define TRAINER_RIVAL_ROUTE22_LATE_CHARMANDER 437 #define TRAINER_CHAMPION_FIRST_SQUIRTLE 438 #define TRAINER_CHAMPION_FIRST_BULBASAUR 439 #define TRAINER_CHAMPION_FIRST_CHARMANDER 440 #define TRAINER_CHANNELER_PATRICIA 441 #define TRAINER_CHANNELER_CARLY 442 #define TRAINER_CHANNELER_HOPE 443 #define TRAINER_CHANNELER_PAULA 444 #define TRAINER_CHANNELER_LAUREL 445 #define TRAINER_CHANNELER_JODY 446 #define TRAINER_CHANNELER_TAMMY 447 #define TRAINER_CHANNELER_RUTH 448 #define TRAINER_CHANNELER_KARINA 449 #define TRAINER_CHANNELER_JANAE 450 #define TRAINER_CHANNELER_ANGELICA 451 #define TRAINER_CHANNELER_EMILIA 452 #define TRAINER_CHANNELER_JENNIFER 453 #define TRAINER_CHANNELER_1 454 #define TRAINER_CHANNELER_2 455 #define TRAINER_CHANNELER_3 456 #define TRAINER_CHANNELER_4 457 #define TRAINER_CHANNELER_5 458 #define TRAINER_CHANNELER_6 459 #define TRAINER_CHANNELER_7 460 #define TRAINER_CHANNELER_8 461 #define TRAINER_CHANNELER_AMANDA 462 #define TRAINER_CHANNELER_STACY 463 #define TRAINER_CHANNELER_TASHA 464 #define TRAINER_HIKER_JEREMY 465 #define TRAINER_PICNICKER_ALMA 466 #define TRAINER_PICNICKER_SUSIE 467 #define TRAINER_PICNICKER_VALERIE 468 #define TRAINER_PICNICKER_GWEN 469 #define TRAINER_BIKER_VIRGIL 470 #define TRAINER_CAMPER_FLINT 471 #define TRAINER_PICNICKER_MISSY 472 #define TRAINER_PICNICKER_IRENE 473 #define TRAINER_PICNICKER_DANA 474 #define TRAINER_PICNICKER_ARIANA 475 #define TRAINER_PICNICKER_LEAH 476 #define TRAINER_CAMPER_JUSTIN 477 #define TRAINER_PICNICKER_YAZMIN 478 #define TRAINER_PICNICKER_KINDRA 479 #define TRAINER_PICNICKER_BECKY 480 #define TRAINER_PICNICKER_CELIA 481 #define TRAINER_GENTLEMAN_BROOKS 482 #define TRAINER_GENTLEMAN_LAMAR 483 #define TRAINER_TWINS_ELI_ANNE 484 #define TRAINER_COOL_COUPLE_RAY_TYRA 485 #define TRAINER_YOUNG_COUPLE_GIA_JES 486 #define TRAINER_TWINS_KIRI_JAN 487 #define TRAINER_CRUSH_KIN_RON_MYA 488 #define TRAINER_YOUNG_COUPLE_LEA_JED 489 #define TRAINER_SIS_AND_BRO_LIA_LUC 490 #define TRAINER_SIS_AND_BRO_LIL_IAN 491 #define TRAINER_BUG_CATCHER_3 492 #define TRAINER_BUG_CATCHER_4 493 #define TRAINER_BUG_CATCHER_5 494 #define TRAINER_BUG_CATCHER_6 495 #define TRAINER_BUG_CATCHER_7 496 #define TRAINER_BUG_CATCHER_8 497 #define TRAINER_YOUNGSTER_BEN_3 498 #define TRAINER_YOUNGSTER_BEN_4 499 #define TRAINER_YOUNGSTER_CHAD_2 500 #define TRAINER_LASS_RELI_2 501 #define TRAINER_LASS_RELI_3 502 #define TRAINER_YOUNGSTER_TIMMY_2 503 #define TRAINER_YOUNGSTER_TIMMY_3 504 #define TRAINER_YOUNGSTER_TIMMY_4 505 #define TRAINER_YOUNGSTER_CHAD_3 506 #define TRAINER_LASS_JANICE_2 507 #define TRAINER_LASS_JANICE_3 508 #define TRAINER_YOUNGSTER_CHAD_4 509 #define TRAINER_HIKER_FRANKLIN_2 510 #define TRAINER_PKMN_PROF_PROF_OAK 511 #define TRAINER_PLAYER_BRENDAN 512 #define TRAINER_PLAYER_MAY 513 #define TRAINER_PLAYER_RED 514 #define TRAINER_PLAYER_LEAF 515 #define TRAINER_TEAM_ROCKET_GRUNT_42 516 #define TRAINER_PSYCHIC_JACLYN 517 #define TRAINER_CRUSH_GIRL_SHARON 518 #define TRAINER_TUBER_AMIRA 519 #define TRAINER_PKMN_BREEDER_ALIZE 520 #define TRAINER_PKMN_RANGER_NICOLAS 521 #define TRAINER_PKMN_RANGER_MADELINE 522 #define TRAINER_AROMA_LADY_NIKKI 523 #define TRAINER_RUIN_MANIAC_STANLY 524 #define TRAINER_LADY_JACKI 525 #define TRAINER_PAINTER_DAISY 526 #define TRAINER_BIKER_GOON 527 #define TRAINER_BIKER_GOON_2 528 #define TRAINER_BIKER_GOON_3 529 #define TRAINER_BIKER_2 530 #define TRAINER_BUG_CATCHER_ANTHONY 531 #define TRAINER_BUG_CATCHER_CHARLIE 532 #define TRAINER_TWINS_ELI_ANNE_2 533 #define TRAINER_YOUNGSTER_JOHNSON 534 #define TRAINER_BIKER_RICARDO 535 #define TRAINER_BIKER_JAREN 536 #define TRAINER_TEAM_ROCKET_GRUNT_43 537 #define TRAINER_TEAM_ROCKET_GRUNT_44 538 #define TRAINER_TEAM_ROCKET_GRUNT_45 539 #define TRAINER_TEAM_ROCKET_GRUNT_46 540 #define TRAINER_TEAM_ROCKET_GRUNT_47 541 #define TRAINER_TEAM_ROCKET_GRUNT_48 542 #define TRAINER_TEAM_ROCKET_ADMIN 543 #define TRAINER_TEAM_ROCKET_ADMIN_2 544 #define TRAINER_SCIENTIST_GIDEON 545 #define TRAINER_SWIMMER_FEMALE_AMARA 546 #define TRAINER_SWIMMER_FEMALE_MARIA 547 #define TRAINER_SWIMMER_FEMALE_ABIGAIL 548 #define TRAINER_SWIMMER_MALE_FINN 549 #define TRAINER_SWIMMER_MALE_GARRETT 550 #define TRAINER_FISHERMAN_TOMMY 551 #define TRAINER_CRUSH_GIRL_TANYA 552 #define TRAINER_BLACK_BELT_SHEA 553 #define TRAINER_BLACK_BELT_HUGH 554 #define TRAINER_CAMPER_BRYCE 555 #define TRAINER_PICNICKER_CLAIRE 556 #define TRAINER_CRUSH_KIN_MIK_KIA 557 #define TRAINER_AROMA_LADY_VIOLET 558 #define TRAINER_TUBER_ALEXIS 559 #define TRAINER_TWINS_JOY_MEG 560 #define TRAINER_SWIMMER_FEMALE_TISHA 561 #define TRAINER_PAINTER_CELINA 562 #define TRAINER_PAINTER_RAYNA 563 #define TRAINER_LADY_GILLIAN 564 #define TRAINER_YOUNGSTER_DESTIN 565 #define TRAINER_SWIMMER_MALE_TOBY 566 #define TRAINER_TEAM_ROCKET_GRUNT_49 567 #define TRAINER_TEAM_ROCKET_GRUNT_50 568 #define TRAINER_TEAM_ROCKET_GRUNT_51 569 #define TRAINER_BIRD_KEEPER_MILO 570 #define TRAINER_BIRD_KEEPER_CHAZ 571 #define TRAINER_BIRD_KEEPER_HAROLD 572 #define TRAINER_FISHERMAN_TYLOR 573 #define TRAINER_SWIMMER_MALE_MYMO 574 #define TRAINER_SWIMMER_FEMALE_NICOLE 575 #define TRAINER_SIS_AND_BRO_AVA_GEB 576 #define TRAINER_AROMA_LADY_ROSE 577 #define TRAINER_SWIMMER_MALE_SAMIR 578 #define TRAINER_SWIMMER_FEMALE_DENISE 579 #define TRAINER_TWINS_MIU_MIA 580 #define TRAINER_HIKER_EARL 581 #define TRAINER_RUIN_MANIAC_FOSTER 582 #define TRAINER_RUIN_MANIAC_LARRY 583 #define TRAINER_HIKER_DARYL 584 #define TRAINER_POKEMANIAC_HECTOR 585 #define TRAINER_PSYCHIC_DARIO 586 #define TRAINER_PSYCHIC_RODETTE 587 #define TRAINER_AROMA_LADY_MIAH 588 #define TRAINER_YOUNG_COUPLE_EVE_JON 589 #define TRAINER_JUGGLER_MASON 590 #define TRAINER_CRUSH_GIRL_CYNDY 591 #define TRAINER_CRUSH_GIRL_JOCELYN 592 #define TRAINER_TAMER_EVAN 593 #define TRAINER_POKEMANIAC_MARK_2 594 #define TRAINER_PKMN_RANGER_LOGAN 595 #define TRAINER_PKMN_RANGER_JACKSON 596 #define TRAINER_PKMN_RANGER_BETH 597 #define TRAINER_PKMN_RANGER_KATELYN 598 #define TRAINER_COOLTRAINER_LEROY 599 #define TRAINER_COOLTRAINER_MICHELLE 600 #define TRAINER_COOL_COUPLE_LEX_NYA 601 #define TRAINER_RUIN_MANIAC_BRANDON 602 #define TRAINER_RUIN_MANIAC_BENJAMIN 603 #define TRAINER_PAINTER_EDNA 604 #define TRAINER_GENTLEMAN_CLIFFORD 605 #define TRAINER_LADY_SELPHY 606 #define TRAINER_RUIN_MANIAC_LAWSON 607 #define TRAINER_PSYCHIC_LAURA 608 #define TRAINER_PKMN_BREEDER_BETHANY 609 #define TRAINER_PKMN_BREEDER_ALLISON 610 #define TRAINER_BUG_CATCHER_GARRET 611 #define TRAINER_BUG_CATCHER_JONAH 612 #define TRAINER_BUG_CATCHER_VANCE 613 #define TRAINER_YOUNGSTER_NASH 614 #define TRAINER_YOUNGSTER_CORDELL 615 #define TRAINER_LASS_DALIA 616 #define TRAINER_LASS_JOANA 617 #define TRAINER_CAMPER_RILEY 618 #define TRAINER_PICNICKER_MARCY 619 #define TRAINER_RUIN_MANIAC_LAYTON 620 #define TRAINER_PICNICKER_KELSEY_2 621 #define TRAINER_PICNICKER_KELSEY_3 622 #define TRAINER_PICNICKER_KELSEY_4 623 #define TRAINER_CAMPER_RICKY_2 624 #define TRAINER_CAMPER_RICKY_3 625 #define TRAINER_CAMPER_RICKY_4 626 #define TRAINER_CAMPER_JEFF_2 627 #define TRAINER_CAMPER_JEFF_3 628 #define TRAINER_CAMPER_JEFF_4 629 #define TRAINER_PICNICKER_ISABELLE_2 630 #define TRAINER_PICNICKER_ISABELLE_3 631 #define TRAINER_PICNICKER_ISABELLE_4 632 #define TRAINER_YOUNGSTER_YASU_2 633 #define TRAINER_YOUNGSTER_YASU_3 634 #define TRAINER_ENGINEER_BERNIE_2 635 #define TRAINER_GAMER_DARIAN_2 636 #define TRAINER_CAMPER_CHRIS_2 637 #define TRAINER_CAMPER_CHRIS_3 638 #define TRAINER_CAMPER_CHRIS_4 639 #define TRAINER_PICNICKER_ALICIA_2 640 #define TRAINER_PICNICKER_ALICIA_3 641 #define TRAINER_PICNICKER_ALICIA_4 642 #define TRAINER_HIKER_JEREMY_2 643 #define TRAINER_POKEMANIAC_MARK_3 644 #define TRAINER_POKEMANIAC_HERMAN_2 645 #define TRAINER_POKEMANIAC_HERMAN_3 646 #define TRAINER_HIKER_TRENT_2 647 #define TRAINER_LASS_MEGAN_2 648 #define TRAINER_LASS_MEGAN_3 649 #define TRAINER_SUPER_NERD_GLENN_2 650 #define TRAINER_GAMER_RICH_2 651 #define TRAINER_BIKER_JAREN_2 652 #define TRAINER_FISHERMAN_ELLIOT_2 653 #define TRAINER_ROCKER_LUCA_2 654 #define TRAINER_BEAUTY_SHEILA_2 655 #define TRAINER_BIRD_KEEPER_ROBERT_2 656 #define TRAINER_BIRD_KEEPER_ROBERT_3 657 #define TRAINER_PICNICKER_SUSIE_2 658 #define TRAINER_PICNICKER_SUSIE_3 659 #define TRAINER_PICNICKER_SUSIE_4 660 #define TRAINER_BIKER_LUKAS_2 661 #define TRAINER_BIRD_KEEPER_BENNY_2 662 #define TRAINER_BIRD_KEEPER_BENNY_3 663 #define TRAINER_BIRD_KEEPER_MARLON_2 664 #define TRAINER_BIRD_KEEPER_MARLON_3 665 #define TRAINER_BEAUTY_GRACE_2 666 #define TRAINER_BIRD_KEEPER_CHESTER_2 667 #define TRAINER_BIRD_KEEPER_CHESTER_3 668 #define TRAINER_PICNICKER_BECKY_2 669 #define TRAINER_PICNICKER_BECKY_3 670 #define TRAINER_PICNICKER_BECKY_4 671 #define TRAINER_CRUSH_KIN_RON_MYA_2 672 #define TRAINER_CRUSH_KIN_RON_MYA_3 673 #define TRAINER_CRUSH_KIN_RON_MYA_4 674 #define TRAINER_BIKER_RUBEN_2 675 #define TRAINER_CUE_BALL_CAMRON_2 676 #define TRAINER_BIKER_JAXON_2 677 #define TRAINER_CUE_BALL_ISAIAH_2 678 #define TRAINER_CUE_BALL_COREY_2 679 #define TRAINER_BIRD_KEEPER_JACOB_2 680 #define TRAINER_BIRD_KEEPER_JACOB_3 681 #define TRAINER_SWIMMER_FEMALE_ALICE_2 682 #define TRAINER_SWIMMER_MALE_DARRIN_2 683 #define TRAINER_PICNICKER_MISSY_2 684 #define TRAINER_PICNICKER_MISSY_3 685 #define TRAINER_FISHERMAN_WADE_2 686 #define TRAINER_SWIMMER_MALE_JACK_2 687 #define TRAINER_SIS_AND_BRO_LIL_IAN_2 688 #define TRAINER_SIS_AND_BRO_LIL_IAN_3 689 #define TRAINER_SWIMMER_MALE_FINN_2 690 #define TRAINER_CRUSH_GIRL_SHARON_2 691 #define TRAINER_CRUSH_GIRL_SHARON_3 692 #define TRAINER_CRUSH_GIRL_TANYA_2 693 #define TRAINER_CRUSH_GIRL_TANYA_3 694 #define TRAINER_BLACK_BELT_SHEA_2 695 #define TRAINER_BLACK_BELT_SHEA_3 696 #define TRAINER_BLACK_BELT_HUGH_2 697 #define TRAINER_BLACK_BELT_HUGH_3 698 #define TRAINER_CRUSH_KIN_MIK_KIA_2 699 #define TRAINER_CRUSH_KIN_MIK_KIA_3 700 #define TRAINER_TUBER_AMIRA_2 701 #define TRAINER_TWINS_JOY_MEG_2 702 #define TRAINER_PAINTER_RAYNA_2 703 #define TRAINER_YOUNGSTER_DESTIN_2 704 #define TRAINER_PKMN_BREEDER_ALIZE_2 705 #define TRAINER_YOUNG_COUPLE_GIA_JES_2 706 #define TRAINER_YOUNG_COUPLE_GIA_JES_3 707 #define TRAINER_BIRD_KEEPER_MILO_2 708 #define TRAINER_BIRD_KEEPER_CHAZ_2 709 #define TRAINER_BIRD_KEEPER_HAROLD_2 710 #define TRAINER_SWIMMER_FEMALE_NICOLE_2 711 #define TRAINER_PSYCHIC_JACLYN_2 712 #define TRAINER_SWIMMER_MALE_SAMIR_2 713 #define TRAINER_HIKER_EARL_2 714 #define TRAINER_RUIN_MANIAC_LARRY_2 715 #define TRAINER_POKEMANIAC_HECTOR_2 716 #define TRAINER_PSYCHIC_DARIO_2 717 #define TRAINER_PSYCHIC_RODETTE_2 718 #define TRAINER_JUGGLER_MASON_2 719 #define TRAINER_PKMN_RANGER_NICOLAS_2 720 #define TRAINER_PKMN_RANGER_MADELINE_2 721 #define TRAINER_CRUSH_GIRL_CYNDY_2 722 #define TRAINER_TAMER_EVAN_2 723 #define TRAINER_PKMN_RANGER_JACKSON_2 724 #define TRAINER_PKMN_RANGER_KATELYN_2 725 #define TRAINER_COOLTRAINER_LEROY_2 726 #define TRAINER_COOLTRAINER_MICHELLE_2 727 #define TRAINER_COOL_COUPLE_LEX_NYA_2 728 #define TRAINER_BUG_CATCHER_COLTON_2 729 #define TRAINER_BUG_CATCHER_COLTON_3 730 #define TRAINER_BUG_CATCHER_COLTON_4 731 #define TRAINER_SWIMMER_MALE_MATTHEW_2 732 #define TRAINER_SWIMMER_MALE_TONY_2 733 #define TRAINER_SWIMMER_FEMALE_MELISSA_2 734 #define TRAINER_ELITE_FOUR_LORELEI_2 735 #define TRAINER_ELITE_FOUR_BRUNO_2 736 #define TRAINER_ELITE_FOUR_AGATHA_2 737 #define TRAINER_ELITE_FOUR_LANCE_2 738 #define TRAINER_CHAMPION_REMATCH_SQUIRTLE 739 #define TRAINER_CHAMPION_REMATCH_BULBASAUR 740 #define TRAINER_CHAMPION_REMATCH_CHARMANDER 741 #define TRAINER_CUE_BALL_PAXTON 742 #define TRAINER_LEADER_BROCK_CHALLENGE 743 #define TRAINER_LEADER_MISTY_CHALLENGE 744 #define TRAINER_LEADER_LT_SURGE_CHALLENGE 745 #define TRAINER_LEADER_ERIKA_CHALLENGE 746 #define TRAINER_LEADER_KOGA_CHALLENGE 747 #define TRAINER_LEADER_SABRINA_CHALLENGE 748 #define TRAINER_LEADER_BLAINE_CHALLENGE 749 #define TRAINER_LEADER_GIOVANNI_CHALLENGE 750 #define TRAINER_ELITE_FOUR_LORELEI_CHALLENGE 751 #define TRAINER_ELITE_FOUR_BRUNO_CHALLENGE 752 #define TRAINER_ELITE_FOUR_AGATHA_CHALLENGE 753 #define TRAINER_ELITE_FOUR_LANCE_CHALLENGE 754 #define TRAINER_CHAMPION_FIRST_SQUIRTLE_CHALLENGE 755 #define TRAINER_CHAMPION_FIRST_BULBASAUR_CHALLENGE 756 #define TRAINER_CHAMPION_FIRST_CHARMANDER_CHALLENGE 757 #define TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2 758 #define TRAINER_ELITE_FOUR_BRUNO_CHALLENGE_2 759 #define TRAINER_ELITE_FOUR_AGATHA_CHALLENGE_2 760 #define TRAINER_ELITE_FOUR_LANCE_CHALLENGE_2 761 #define TRAINER_CHAMPION_REMATCH_SQUIRTLE_CHALLENGE 762 #define TRAINER_CHAMPION_REMATCH_BULBASAUR_CHALLENGE 763 #define TRAINER_CHAMPION_REMATCH_CHARMANDER_CHALLENGE 764 #define TRAINER_BROCK_REMATCH 765 #define TRAINER_BROCK_REMATCH_CHALLENGE 766 #define TRAINER_MISTY_REMATCH 767 // NOTE: Because each Trainer uses a flag to determine when they are defeated, there is // only space for 25 additional trainers before trainer flag space overflows. // MAX_TRAINERS_COUNT can be increased but will take up additional saveblock space #define NUM_TRAINERS 768 #define MAX_TRAINERS_COUNT 768 #endif // GUARD_CONSTANTS_OPPONENTS_H ================================================ FILE: include/constants/party_menu.h ================================================ #ifndef GUARD_CONSTANTS_PARTY_MENU_H #define GUARD_CONSTANTS_PARTY_MENU_H #define AILMENT_NONE 0 #define AILMENT_PSN 1 #define AILMENT_PRZ 2 #define AILMENT_SLP 3 #define AILMENT_FRZ 4 #define AILMENT_BRN 5 #define AILMENT_PKRS 6 #define AILMENT_FNT 7 #define TUTOR_MOVE_MEGA_PUNCH 0 #define TUTOR_MOVE_SWORDS_DANCE 1 #define TUTOR_MOVE_MEGA_KICK 2 #define TUTOR_MOVE_BODY_SLAM 3 #define TUTOR_MOVE_DOUBLE_EDGE 4 #define TUTOR_MOVE_COUNTER 5 #define TUTOR_MOVE_SEISMIC_TOSS 6 #define TUTOR_MOVE_MIMIC 7 #define TUTOR_MOVE_METRONOME 8 #define TUTOR_MOVE_SOFT_BOILED 9 #define TUTOR_MOVE_DREAM_EATER 10 #define TUTOR_MOVE_THUNDER_WAVE 11 #define TUTOR_MOVE_EXPLOSION 12 #define TUTOR_MOVE_ROCK_SLIDE 13 #define TUTOR_MOVE_SUBSTITUTE 14 #define TUTOR_MOVE_DYNAMIC_PUNCH 15 #define TUTOR_MOVE_ROLLOUT 16 #define TUTOR_MOVE_PSYCH_UP 17 #define TUTOR_MOVE_SNORE 18 #define TUTOR_MOVE_ICY_WIND 19 #define TUTOR_MOVE_ENDURE 20 #define TUTOR_MOVE_MUD_SLAP 21 #define TUTOR_MOVE_ICE_PUNCH 22 #define TUTOR_MOVE_SWAGGER 23 #define TUTOR_MOVE_SLEEP_TALK 24 #define TUTOR_MOVE_SWIFT 25 #define TUTOR_MOVE_DEFENSE_CURL 26 #define TUTOR_MOVE_THUNDER_PUNCH 27 #define TUTOR_MOVE_FIRE_PUNCH 28 #define TUTOR_MOVE_FURY_CUTTER 29 #define TUTOR_MOVE_NIGHTMARE 30 #define TUTOR_MOVE_SELF_DESTRUCT 31 #define TUTOR_MOVE_SKY_ATTACK 32 #define TUTOR_MOVE_COUNT 33 // regular tutor move count #define TUTOR_MOVE_FRENZY_PLANT 33 #define TUTOR_MOVE_BLAST_BURN 34 #define TUTOR_MOVE_HYDRO_CANNON 35 #define FIELD_MOVE_FLASH 0 #define FIELD_MOVE_CUT 1 #define FIELD_MOVE_FLY 2 #define FIELD_MOVE_STRENGTH 3 #define FIELD_MOVE_SURF 4 #define FIELD_MOVE_ROCK_SMASH 5 #define FIELD_MOVE_WATERFALL 6 #define FIELD_MOVE_TELEPORT 7 #define FIELD_MOVE_DIG 8 #define FIELD_MOVE_MILK_DRINK 9 #define FIELD_MOVE_SOFT_BOILED 10 #define FIELD_MOVE_SWEET_SCENT 11 #define FIELD_MOVE_DIVE 12 #define FIELD_MOVE_END 13 #define PARTY_LAYOUT_SINGLE 0 #define PARTY_LAYOUT_DOUBLE 1 #define PARTY_LAYOUT_MULTI 2 #define PARTY_LAYOUT_MULTI_SHOWCASE 3 // The layout during the screen that appears just before a multi battle #define PARTY_LAYOUT_COUNT 4 #define KEEP_PARTY_LAYOUT 0xFF #define PARTY_MENU_TYPE_FIELD 0 #define PARTY_MENU_TYPE_IN_BATTLE 1 #define PARTY_MENU_TYPE_CONTEST 2 #define PARTY_MENU_TYPE_CHOOSE_SINGLE_MON 3 #define PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS 4 // multi battles, eReader battles, and some battle facilities #define PARTY_MENU_TYPE_MULTI_SHOWCASE 5 #define PARTY_MENU_TYPE_DAYCARE 6 #define PARTY_MENU_TYPE_MOVE_RELEARNER 7 #define PARTY_MENU_TYPE_UNION_ROOM_REGISTER 8 // trading board #define PARTY_MENU_TYPE_UNION_ROOM_TRADE 9 // trading board #define PARTY_MENU_TYPE_SPIN_TRADE 10 // Unused beta for Gen IV's Spin Trade #define PARTY_MENU_TYPE_MINIGAME 11 #define PARTY_ACTION_CHOOSE_MON 0 #define PARTY_ACTION_SEND_OUT 1 #define PARTY_ACTION_CANT_SWITCH 2 #define PARTY_ACTION_USE_ITEM 3 #define PARTY_ACTION_ABILITY_PREVENTS 4 #define PARTY_ACTION_GIVE_ITEM 5 #define PARTY_ACTION_GIVE_PC_ITEM 6 #define PARTY_ACTION_GIVE_MAILBOX_MAIL 7 #define PARTY_ACTION_SWITCH 8 #define PARTY_ACTION_SWITCHING 9 #define PARTY_ACTION_SOFTBOILED 10 #define PARTY_ACTION_CHOOSE_AND_CLOSE 11 #define PARTY_ACTION_MOVE_TUTOR 12 #define PARTY_ACTION_MINIGAME 13 #define PARTY_ACTION_REUSABLE_ITEM 14 // IDs for DisplayPartyMenuStdMessage, to display the message at the bottom of the party menu #define PARTY_MSG_CHOOSE_MON 0 #define PARTY_MSG_CHOOSE_MON_OR_CANCEL 1 #define PARTY_MSG_CHOOSE_MON_AND_CONFIRM 2 #define PARTY_MSG_MOVE_TO_WHERE 3 #define PARTY_MSG_TEACH_WHICH_MON 4 #define PARTY_MSG_USE_ON_WHICH_MON 5 #define PARTY_MSG_GIVE_TO_WHICH_MON 6 #define PARTY_MSG_NOTHING_TO_CUT 7 #define PARTY_MSG_CANT_SURF_HERE 8 #define PARTY_MSG_ALREADY_SURFING 9 #define PARTY_MSG_CURRENT_TOO_FAST 10 #define PARTY_MSG_ENJOY_CYCLING 11 #define PARTY_MSG_ALREADY_IN_USE 12 #define PARTY_MSG_CANT_USE_HERE 13 #define PARTY_MSG_NO_MON_FOR_BATTLE 14 #define PARTY_MSG_CHOOSE_MON_2 15 #define PARTY_MSG_NOT_ENOUGH_HP 16 #define PARTY_MSG_THREE_MONS_ARE_NEEDED 17 #define PARTY_MSG_TWO_MONS_ARE_NEEDED 18 #define PARTY_MSG_MONS_CANT_BE_SAME 19 #define PARTY_MSG_NO_SAME_HOLD_ITEMS 20 #define PARTY_MSG_UNUSED 21 #define PARTY_MSG_DO_WHAT_WITH_MON 22 #define PARTY_MSG_RESTORE_WHICH_MOVE 23 #define PARTY_MSG_BOOST_PP_WHICH_MOVE 24 #define PARTY_MSG_DO_WHAT_WITH_ITEM 25 #define PARTY_MSG_DO_WHAT_WITH_MAIL 26 #define PARTY_MSG_NONE 127 // IDs for DisplayPartyPokemonDescriptionText, to display a message in the party pokemon's box #define PARTYBOX_DESC_NO_USE 0 #define PARTYBOX_DESC_ABLE_3 1 #define PARTYBOX_DESC_FIRST 2 #define PARTYBOX_DESC_SECOND 3 #define PARTYBOX_DESC_THIRD 4 #define PARTYBOX_DESC_ABLE 5 #define PARTYBOX_DESC_NOT_ABLE 6 #define PARTYBOX_DESC_ABLE_2 7 #define PARTYBOX_DESC_NOT_ABLE_2 8 #define PARTYBOX_DESC_LEARNED 9 #define SELECTWINDOW_ACTIONS 0 #define SELECTWINDOW_ITEM 1 #define SELECTWINDOW_MAIL 2 #define SELECTWINDOW_MOVES 3 enum { CHOOSE_MONS_FOR_CABLE_CLUB_BATTLE, CHOOSE_MONS_FOR_BATTLE_TOWER, CHOOSE_MONS_FOR_UNION_ROOM_BATTLE, }; #endif // GUARD_CONSTANTS_PARTY_MENU_H ================================================ FILE: include/constants/pokedex.h ================================================ #ifndef GUARD_CONSTANTS_POKEDEX_H #define GUARD_CONSTANTS_POKEDEX_H // National Pokedex order enum { NATIONAL_DEX_NONE, // Kanto NATIONAL_DEX_BULBASAUR, NATIONAL_DEX_IVYSAUR, NATIONAL_DEX_VENUSAUR, NATIONAL_DEX_CHARMANDER, NATIONAL_DEX_CHARMELEON, NATIONAL_DEX_CHARIZARD, NATIONAL_DEX_SQUIRTLE, NATIONAL_DEX_WARTORTLE, NATIONAL_DEX_BLASTOISE, NATIONAL_DEX_CATERPIE, NATIONAL_DEX_METAPOD, NATIONAL_DEX_BUTTERFREE, NATIONAL_DEX_WEEDLE, NATIONAL_DEX_KAKUNA, NATIONAL_DEX_BEEDRILL, NATIONAL_DEX_PIDGEY, NATIONAL_DEX_PIDGEOTTO, NATIONAL_DEX_PIDGEOT, NATIONAL_DEX_RATTATA, NATIONAL_DEX_RATICATE, NATIONAL_DEX_SPEAROW, NATIONAL_DEX_FEAROW, NATIONAL_DEX_EKANS, NATIONAL_DEX_ARBOK, NATIONAL_DEX_PIKACHU, NATIONAL_DEX_RAICHU, NATIONAL_DEX_SANDSHREW, NATIONAL_DEX_SANDSLASH, NATIONAL_DEX_NIDORAN_F, NATIONAL_DEX_NIDORINA, NATIONAL_DEX_NIDOQUEEN, NATIONAL_DEX_NIDORAN_M, NATIONAL_DEX_NIDORINO, NATIONAL_DEX_NIDOKING, NATIONAL_DEX_CLEFAIRY, NATIONAL_DEX_CLEFABLE, NATIONAL_DEX_VULPIX, NATIONAL_DEX_NINETALES, NATIONAL_DEX_JIGGLYPUFF, NATIONAL_DEX_WIGGLYTUFF, NATIONAL_DEX_ZUBAT, NATIONAL_DEX_GOLBAT, NATIONAL_DEX_ODDISH, NATIONAL_DEX_GLOOM, NATIONAL_DEX_VILEPLUME, NATIONAL_DEX_PARAS, NATIONAL_DEX_PARASECT, NATIONAL_DEX_VENONAT, NATIONAL_DEX_VENOMOTH, NATIONAL_DEX_DIGLETT, NATIONAL_DEX_DUGTRIO, NATIONAL_DEX_MEOWTH, NATIONAL_DEX_PERSIAN, NATIONAL_DEX_PSYDUCK, NATIONAL_DEX_GOLDUCK, NATIONAL_DEX_MANKEY, NATIONAL_DEX_PRIMEAPE, NATIONAL_DEX_GROWLITHE, NATIONAL_DEX_ARCANINE, NATIONAL_DEX_POLIWAG, NATIONAL_DEX_POLIWHIRL, NATIONAL_DEX_POLIWRATH, NATIONAL_DEX_ABRA, NATIONAL_DEX_KADABRA, NATIONAL_DEX_ALAKAZAM, NATIONAL_DEX_MACHOP, NATIONAL_DEX_MACHOKE, NATIONAL_DEX_MACHAMP, NATIONAL_DEX_BELLSPROUT, NATIONAL_DEX_WEEPINBELL, NATIONAL_DEX_VICTREEBEL, NATIONAL_DEX_TENTACOOL, NATIONAL_DEX_TENTACRUEL, NATIONAL_DEX_GEODUDE, NATIONAL_DEX_GRAVELER, NATIONAL_DEX_GOLEM, NATIONAL_DEX_PONYTA, NATIONAL_DEX_RAPIDASH, NATIONAL_DEX_SLOWPOKE, NATIONAL_DEX_SLOWBRO, NATIONAL_DEX_MAGNEMITE, NATIONAL_DEX_MAGNETON, NATIONAL_DEX_FARFETCHD, NATIONAL_DEX_DODUO, NATIONAL_DEX_DODRIO, NATIONAL_DEX_SEEL, NATIONAL_DEX_DEWGONG, NATIONAL_DEX_GRIMER, NATIONAL_DEX_MUK, NATIONAL_DEX_SHELLDER, NATIONAL_DEX_CLOYSTER, NATIONAL_DEX_GASTLY, NATIONAL_DEX_HAUNTER, NATIONAL_DEX_GENGAR, NATIONAL_DEX_ONIX, NATIONAL_DEX_DROWZEE, NATIONAL_DEX_HYPNO, NATIONAL_DEX_KRABBY, NATIONAL_DEX_KINGLER, NATIONAL_DEX_VOLTORB, NATIONAL_DEX_ELECTRODE, NATIONAL_DEX_EXEGGCUTE, NATIONAL_DEX_EXEGGUTOR, NATIONAL_DEX_CUBONE, NATIONAL_DEX_MAROWAK, NATIONAL_DEX_HITMONLEE, NATIONAL_DEX_HITMONCHAN, NATIONAL_DEX_LICKITUNG, NATIONAL_DEX_KOFFING, NATIONAL_DEX_WEEZING, NATIONAL_DEX_RHYHORN, NATIONAL_DEX_RHYDON, NATIONAL_DEX_CHANSEY, NATIONAL_DEX_TANGELA, NATIONAL_DEX_KANGASKHAN, NATIONAL_DEX_HORSEA, NATIONAL_DEX_SEADRA, NATIONAL_DEX_GOLDEEN, NATIONAL_DEX_SEAKING, NATIONAL_DEX_STARYU, NATIONAL_DEX_STARMIE, NATIONAL_DEX_MR_MIME, NATIONAL_DEX_SCYTHER, NATIONAL_DEX_JYNX, NATIONAL_DEX_ELECTABUZZ, NATIONAL_DEX_MAGMAR, NATIONAL_DEX_PINSIR, NATIONAL_DEX_TAUROS, NATIONAL_DEX_MAGIKARP, NATIONAL_DEX_GYARADOS, NATIONAL_DEX_LAPRAS, NATIONAL_DEX_DITTO, NATIONAL_DEX_EEVEE, NATIONAL_DEX_VAPOREON, NATIONAL_DEX_JOLTEON, NATIONAL_DEX_FLAREON, NATIONAL_DEX_PORYGON, NATIONAL_DEX_OMANYTE, NATIONAL_DEX_OMASTAR, NATIONAL_DEX_KABUTO, NATIONAL_DEX_KABUTOPS, NATIONAL_DEX_AERODACTYL, NATIONAL_DEX_SNORLAX, NATIONAL_DEX_ARTICUNO, NATIONAL_DEX_ZAPDOS, NATIONAL_DEX_MOLTRES, NATIONAL_DEX_DRATINI, NATIONAL_DEX_DRAGONAIR, NATIONAL_DEX_DRAGONITE, NATIONAL_DEX_MEWTWO, NATIONAL_DEX_MEW, // Johto NATIONAL_DEX_CHIKORITA, NATIONAL_DEX_BAYLEEF, NATIONAL_DEX_MEGANIUM, NATIONAL_DEX_CYNDAQUIL, NATIONAL_DEX_QUILAVA, NATIONAL_DEX_TYPHLOSION, NATIONAL_DEX_TOTODILE, NATIONAL_DEX_CROCONAW, NATIONAL_DEX_FERALIGATR, NATIONAL_DEX_SENTRET, NATIONAL_DEX_FURRET, NATIONAL_DEX_HOOTHOOT, NATIONAL_DEX_NOCTOWL, NATIONAL_DEX_LEDYBA, NATIONAL_DEX_LEDIAN, NATIONAL_DEX_SPINARAK, NATIONAL_DEX_ARIADOS, NATIONAL_DEX_CROBAT, NATIONAL_DEX_CHINCHOU, NATIONAL_DEX_LANTURN, NATIONAL_DEX_PICHU, NATIONAL_DEX_CLEFFA, NATIONAL_DEX_IGGLYBUFF, NATIONAL_DEX_TOGEPI, NATIONAL_DEX_TOGETIC, NATIONAL_DEX_NATU, NATIONAL_DEX_XATU, NATIONAL_DEX_MAREEP, NATIONAL_DEX_FLAAFFY, NATIONAL_DEX_AMPHAROS, NATIONAL_DEX_BELLOSSOM, NATIONAL_DEX_MARILL, NATIONAL_DEX_AZUMARILL, NATIONAL_DEX_SUDOWOODO, NATIONAL_DEX_POLITOED, NATIONAL_DEX_HOPPIP, NATIONAL_DEX_SKIPLOOM, NATIONAL_DEX_JUMPLUFF, NATIONAL_DEX_AIPOM, NATIONAL_DEX_SUNKERN, NATIONAL_DEX_SUNFLORA, NATIONAL_DEX_YANMA, NATIONAL_DEX_WOOPER, NATIONAL_DEX_QUAGSIRE, NATIONAL_DEX_ESPEON, NATIONAL_DEX_UMBREON, NATIONAL_DEX_MURKROW, NATIONAL_DEX_SLOWKING, NATIONAL_DEX_MISDREAVUS, NATIONAL_DEX_UNOWN, NATIONAL_DEX_WOBBUFFET, NATIONAL_DEX_GIRAFARIG, NATIONAL_DEX_PINECO, NATIONAL_DEX_FORRETRESS, NATIONAL_DEX_DUNSPARCE, NATIONAL_DEX_GLIGAR, NATIONAL_DEX_STEELIX, NATIONAL_DEX_SNUBBULL, NATIONAL_DEX_GRANBULL, NATIONAL_DEX_QWILFISH, NATIONAL_DEX_SCIZOR, NATIONAL_DEX_SHUCKLE, NATIONAL_DEX_HERACROSS, NATIONAL_DEX_SNEASEL, NATIONAL_DEX_TEDDIURSA, NATIONAL_DEX_URSARING, NATIONAL_DEX_SLUGMA, NATIONAL_DEX_MAGCARGO, NATIONAL_DEX_SWINUB, NATIONAL_DEX_PILOSWINE, NATIONAL_DEX_CORSOLA, NATIONAL_DEX_REMORAID, NATIONAL_DEX_OCTILLERY, NATIONAL_DEX_DELIBIRD, NATIONAL_DEX_MANTINE, NATIONAL_DEX_SKARMORY, NATIONAL_DEX_HOUNDOUR, NATIONAL_DEX_HOUNDOOM, NATIONAL_DEX_KINGDRA, NATIONAL_DEX_PHANPY, NATIONAL_DEX_DONPHAN, NATIONAL_DEX_PORYGON2, NATIONAL_DEX_STANTLER, NATIONAL_DEX_SMEARGLE, NATIONAL_DEX_TYROGUE, NATIONAL_DEX_HITMONTOP, NATIONAL_DEX_SMOOCHUM, NATIONAL_DEX_ELEKID, NATIONAL_DEX_MAGBY, NATIONAL_DEX_MILTANK, NATIONAL_DEX_BLISSEY, NATIONAL_DEX_RAIKOU, NATIONAL_DEX_ENTEI, NATIONAL_DEX_SUICUNE, NATIONAL_DEX_LARVITAR, NATIONAL_DEX_PUPITAR, NATIONAL_DEX_TYRANITAR, NATIONAL_DEX_LUGIA, NATIONAL_DEX_HO_OH, NATIONAL_DEX_CELEBI, // Hoenn NATIONAL_DEX_TREECKO, NATIONAL_DEX_GROVYLE, NATIONAL_DEX_SCEPTILE, NATIONAL_DEX_TORCHIC, NATIONAL_DEX_COMBUSKEN, NATIONAL_DEX_BLAZIKEN, NATIONAL_DEX_MUDKIP, NATIONAL_DEX_MARSHTOMP, NATIONAL_DEX_SWAMPERT, NATIONAL_DEX_POOCHYENA, NATIONAL_DEX_MIGHTYENA, NATIONAL_DEX_ZIGZAGOON, NATIONAL_DEX_LINOONE, NATIONAL_DEX_WURMPLE, NATIONAL_DEX_SILCOON, NATIONAL_DEX_BEAUTIFLY, NATIONAL_DEX_CASCOON, NATIONAL_DEX_DUSTOX, NATIONAL_DEX_LOTAD, NATIONAL_DEX_LOMBRE, NATIONAL_DEX_LUDICOLO, NATIONAL_DEX_SEEDOT, NATIONAL_DEX_NUZLEAF, NATIONAL_DEX_SHIFTRY, NATIONAL_DEX_TAILLOW, NATIONAL_DEX_SWELLOW, NATIONAL_DEX_WINGULL, NATIONAL_DEX_PELIPPER, NATIONAL_DEX_RALTS, NATIONAL_DEX_KIRLIA, NATIONAL_DEX_GARDEVOIR, NATIONAL_DEX_SURSKIT, NATIONAL_DEX_MASQUERAIN, NATIONAL_DEX_SHROOMISH, NATIONAL_DEX_BRELOOM, NATIONAL_DEX_SLAKOTH, NATIONAL_DEX_VIGOROTH, NATIONAL_DEX_SLAKING, NATIONAL_DEX_NINCADA, NATIONAL_DEX_NINJASK, NATIONAL_DEX_SHEDINJA, NATIONAL_DEX_WHISMUR, NATIONAL_DEX_LOUDRED, NATIONAL_DEX_EXPLOUD, NATIONAL_DEX_MAKUHITA, NATIONAL_DEX_HARIYAMA, NATIONAL_DEX_AZURILL, NATIONAL_DEX_NOSEPASS, NATIONAL_DEX_SKITTY, NATIONAL_DEX_DELCATTY, NATIONAL_DEX_SABLEYE, NATIONAL_DEX_MAWILE, NATIONAL_DEX_ARON, NATIONAL_DEX_LAIRON, NATIONAL_DEX_AGGRON, NATIONAL_DEX_MEDITITE, NATIONAL_DEX_MEDICHAM, NATIONAL_DEX_ELECTRIKE, NATIONAL_DEX_MANECTRIC, NATIONAL_DEX_PLUSLE, NATIONAL_DEX_MINUN, NATIONAL_DEX_VOLBEAT, NATIONAL_DEX_ILLUMISE, NATIONAL_DEX_ROSELIA, NATIONAL_DEX_GULPIN, NATIONAL_DEX_SWALOT, NATIONAL_DEX_CARVANHA, NATIONAL_DEX_SHARPEDO, NATIONAL_DEX_WAILMER, NATIONAL_DEX_WAILORD, NATIONAL_DEX_NUMEL, NATIONAL_DEX_CAMERUPT, NATIONAL_DEX_TORKOAL, NATIONAL_DEX_SPOINK, NATIONAL_DEX_GRUMPIG, NATIONAL_DEX_SPINDA, NATIONAL_DEX_TRAPINCH, NATIONAL_DEX_VIBRAVA, NATIONAL_DEX_FLYGON, NATIONAL_DEX_CACNEA, NATIONAL_DEX_CACTURNE, NATIONAL_DEX_SWABLU, NATIONAL_DEX_ALTARIA, NATIONAL_DEX_ZANGOOSE, NATIONAL_DEX_SEVIPER, NATIONAL_DEX_LUNATONE, NATIONAL_DEX_SOLROCK, NATIONAL_DEX_BARBOACH, NATIONAL_DEX_WHISCASH, NATIONAL_DEX_CORPHISH, NATIONAL_DEX_CRAWDAUNT, NATIONAL_DEX_BALTOY, NATIONAL_DEX_CLAYDOL, NATIONAL_DEX_LILEEP, NATIONAL_DEX_CRADILY, NATIONAL_DEX_ANORITH, NATIONAL_DEX_ARMALDO, NATIONAL_DEX_FEEBAS, NATIONAL_DEX_MILOTIC, NATIONAL_DEX_CASTFORM, NATIONAL_DEX_KECLEON, NATIONAL_DEX_SHUPPET, NATIONAL_DEX_BANETTE, NATIONAL_DEX_DUSKULL, NATIONAL_DEX_DUSCLOPS, NATIONAL_DEX_TROPIUS, NATIONAL_DEX_CHIMECHO, NATIONAL_DEX_ABSOL, NATIONAL_DEX_WYNAUT, NATIONAL_DEX_SNORUNT, NATIONAL_DEX_GLALIE, NATIONAL_DEX_SPHEAL, NATIONAL_DEX_SEALEO, NATIONAL_DEX_WALREIN, NATIONAL_DEX_CLAMPERL, NATIONAL_DEX_HUNTAIL, NATIONAL_DEX_GOREBYSS, NATIONAL_DEX_RELICANTH, NATIONAL_DEX_LUVDISC, NATIONAL_DEX_BAGON, NATIONAL_DEX_SHELGON, NATIONAL_DEX_SALAMENCE, NATIONAL_DEX_BELDUM, NATIONAL_DEX_METANG, NATIONAL_DEX_METAGROSS, NATIONAL_DEX_REGIROCK, NATIONAL_DEX_REGICE, NATIONAL_DEX_REGISTEEL, NATIONAL_DEX_LATIAS, NATIONAL_DEX_LATIOS, NATIONAL_DEX_KYOGRE, NATIONAL_DEX_GROUDON, NATIONAL_DEX_RAYQUAZA, NATIONAL_DEX_JIRACHI, NATIONAL_DEX_DEOXYS, // Old Unown NATIONAL_DEX_OLD_UNOWN_B, NATIONAL_DEX_OLD_UNOWN_C, NATIONAL_DEX_OLD_UNOWN_D, NATIONAL_DEX_OLD_UNOWN_E, NATIONAL_DEX_OLD_UNOWN_F, NATIONAL_DEX_OLD_UNOWN_G, NATIONAL_DEX_OLD_UNOWN_H, NATIONAL_DEX_OLD_UNOWN_I, NATIONAL_DEX_OLD_UNOWN_J, NATIONAL_DEX_OLD_UNOWN_K, NATIONAL_DEX_OLD_UNOWN_L, NATIONAL_DEX_OLD_UNOWN_M, NATIONAL_DEX_OLD_UNOWN_N, NATIONAL_DEX_OLD_UNOWN_O, NATIONAL_DEX_OLD_UNOWN_P, NATIONAL_DEX_OLD_UNOWN_Q, NATIONAL_DEX_OLD_UNOWN_R, NATIONAL_DEX_OLD_UNOWN_S, NATIONAL_DEX_OLD_UNOWN_T, NATIONAL_DEX_OLD_UNOWN_U, NATIONAL_DEX_OLD_UNOWN_V, NATIONAL_DEX_OLD_UNOWN_W, NATIONAL_DEX_OLD_UNOWN_X, NATIONAL_DEX_OLD_UNOWN_Y, NATIONAL_DEX_OLD_UNOWN_Z, }; #define KANTO_DEX_COUNT NATIONAL_DEX_MEW #define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI #define NATIONAL_DEX_COUNT NATIONAL_DEX_DEOXYS // Hoenn Pokedex order enum { HOENN_DEX_NONE, HOENN_DEX_TREECKO, HOENN_DEX_GROVYLE, HOENN_DEX_SCEPTILE, HOENN_DEX_TORCHIC, HOENN_DEX_COMBUSKEN, HOENN_DEX_BLAZIKEN, HOENN_DEX_MUDKIP, HOENN_DEX_MARSHTOMP, HOENN_DEX_SWAMPERT, HOENN_DEX_POOCHYENA, HOENN_DEX_MIGHTYENA, HOENN_DEX_ZIGZAGOON, HOENN_DEX_LINOONE, HOENN_DEX_WURMPLE, HOENN_DEX_SILCOON, HOENN_DEX_BEAUTIFLY, HOENN_DEX_CASCOON, HOENN_DEX_DUSTOX, HOENN_DEX_LOTAD, HOENN_DEX_LOMBRE, HOENN_DEX_LUDICOLO, HOENN_DEX_SEEDOT, HOENN_DEX_NUZLEAF, HOENN_DEX_SHIFTRY, HOENN_DEX_TAILLOW, HOENN_DEX_SWELLOW, HOENN_DEX_WINGULL, HOENN_DEX_PELIPPER, HOENN_DEX_RALTS, HOENN_DEX_KIRLIA, HOENN_DEX_GARDEVOIR, HOENN_DEX_SURSKIT, HOENN_DEX_MASQUERAIN, HOENN_DEX_SHROOMISH, HOENN_DEX_BRELOOM, HOENN_DEX_SLAKOTH, HOENN_DEX_VIGOROTH, HOENN_DEX_SLAKING, HOENN_DEX_ABRA, HOENN_DEX_KADABRA, HOENN_DEX_ALAKAZAM, HOENN_DEX_NINCADA, HOENN_DEX_NINJASK, HOENN_DEX_SHEDINJA, HOENN_DEX_WHISMUR, HOENN_DEX_LOUDRED, HOENN_DEX_EXPLOUD, HOENN_DEX_MAKUHITA, HOENN_DEX_HARIYAMA, HOENN_DEX_GOLDEEN, HOENN_DEX_SEAKING, HOENN_DEX_MAGIKARP, HOENN_DEX_GYARADOS, HOENN_DEX_AZURILL, HOENN_DEX_MARILL, HOENN_DEX_AZUMARILL, HOENN_DEX_GEODUDE, HOENN_DEX_GRAVELER, HOENN_DEX_GOLEM, HOENN_DEX_NOSEPASS, HOENN_DEX_SKITTY, HOENN_DEX_DELCATTY, HOENN_DEX_ZUBAT, HOENN_DEX_GOLBAT, HOENN_DEX_CROBAT, HOENN_DEX_TENTACOOL, HOENN_DEX_TENTACRUEL, HOENN_DEX_SABLEYE, HOENN_DEX_MAWILE, HOENN_DEX_ARON, HOENN_DEX_LAIRON, HOENN_DEX_AGGRON, HOENN_DEX_MACHOP, HOENN_DEX_MACHOKE, HOENN_DEX_MACHAMP, HOENN_DEX_MEDITITE, HOENN_DEX_MEDICHAM, HOENN_DEX_ELECTRIKE, HOENN_DEX_MANECTRIC, HOENN_DEX_PLUSLE, HOENN_DEX_MINUN, HOENN_DEX_MAGNEMITE, HOENN_DEX_MAGNETON, HOENN_DEX_VOLTORB, HOENN_DEX_ELECTRODE, HOENN_DEX_VOLBEAT, HOENN_DEX_ILLUMISE, HOENN_DEX_ODDISH, HOENN_DEX_GLOOM, HOENN_DEX_VILEPLUME, HOENN_DEX_BELLOSSOM, HOENN_DEX_DODUO, HOENN_DEX_DODRIO, HOENN_DEX_ROSELIA, HOENN_DEX_GULPIN, HOENN_DEX_SWALOT, HOENN_DEX_CARVANHA, HOENN_DEX_SHARPEDO, HOENN_DEX_WAILMER, HOENN_DEX_WAILORD, HOENN_DEX_NUMEL, HOENN_DEX_CAMERUPT, HOENN_DEX_SLUGMA, HOENN_DEX_MAGCARGO, HOENN_DEX_TORKOAL, HOENN_DEX_GRIMER, HOENN_DEX_MUK, HOENN_DEX_KOFFING, HOENN_DEX_WEEZING, HOENN_DEX_SPOINK, HOENN_DEX_GRUMPIG, HOENN_DEX_SANDSHREW, HOENN_DEX_SANDSLASH, HOENN_DEX_SPINDA, HOENN_DEX_SKARMORY, HOENN_DEX_TRAPINCH, HOENN_DEX_VIBRAVA, HOENN_DEX_FLYGON, HOENN_DEX_CACNEA, HOENN_DEX_CACTURNE, HOENN_DEX_SWABLU, HOENN_DEX_ALTARIA, HOENN_DEX_ZANGOOSE, HOENN_DEX_SEVIPER, HOENN_DEX_LUNATONE, HOENN_DEX_SOLROCK, HOENN_DEX_BARBOACH, HOENN_DEX_WHISCASH, HOENN_DEX_CORPHISH, HOENN_DEX_CRAWDAUNT, HOENN_DEX_BALTOY, HOENN_DEX_CLAYDOL, HOENN_DEX_LILEEP, HOENN_DEX_CRADILY, HOENN_DEX_ANORITH, HOENN_DEX_ARMALDO, HOENN_DEX_IGGLYBUFF, HOENN_DEX_JIGGLYPUFF, HOENN_DEX_WIGGLYTUFF, HOENN_DEX_FEEBAS, HOENN_DEX_MILOTIC, HOENN_DEX_CASTFORM, HOENN_DEX_STARYU, HOENN_DEX_STARMIE, HOENN_DEX_KECLEON, HOENN_DEX_SHUPPET, HOENN_DEX_BANETTE, HOENN_DEX_DUSKULL, HOENN_DEX_DUSCLOPS, HOENN_DEX_TROPIUS, HOENN_DEX_CHIMECHO, HOENN_DEX_ABSOL, HOENN_DEX_VULPIX, HOENN_DEX_NINETALES, HOENN_DEX_PICHU, HOENN_DEX_PIKACHU, HOENN_DEX_RAICHU, HOENN_DEX_PSYDUCK, HOENN_DEX_GOLDUCK, HOENN_DEX_WYNAUT, HOENN_DEX_WOBBUFFET, HOENN_DEX_NATU, HOENN_DEX_XATU, HOENN_DEX_GIRAFARIG, HOENN_DEX_PHANPY, HOENN_DEX_DONPHAN, HOENN_DEX_PINSIR, HOENN_DEX_HERACROSS, HOENN_DEX_RHYHORN, HOENN_DEX_RHYDON, HOENN_DEX_SNORUNT, HOENN_DEX_GLALIE, HOENN_DEX_SPHEAL, HOENN_DEX_SEALEO, HOENN_DEX_WALREIN, HOENN_DEX_CLAMPERL, HOENN_DEX_HUNTAIL, HOENN_DEX_GOREBYSS, HOENN_DEX_RELICANTH, HOENN_DEX_CORSOLA, HOENN_DEX_CHINCHOU, HOENN_DEX_LANTURN, HOENN_DEX_LUVDISC, HOENN_DEX_HORSEA, HOENN_DEX_SEADRA, HOENN_DEX_KINGDRA, HOENN_DEX_BAGON, HOENN_DEX_SHELGON, HOENN_DEX_SALAMENCE, HOENN_DEX_BELDUM, HOENN_DEX_METANG, HOENN_DEX_METAGROSS, HOENN_DEX_REGIROCK, HOENN_DEX_REGICE, HOENN_DEX_REGISTEEL, HOENN_DEX_LATIAS, HOENN_DEX_LATIOS, HOENN_DEX_KYOGRE, HOENN_DEX_GROUDON, HOENN_DEX_RAYQUAZA, HOENN_DEX_JIRACHI, HOENN_DEX_DEOXYS, // End of Hoenn Dex (see HOENN_DEX_COUNT) // Here below have values but are excluded from the Pokedex HOENN_DEX_BULBASAUR, HOENN_DEX_IVYSAUR, HOENN_DEX_VENUSAUR, HOENN_DEX_CHARMANDER, HOENN_DEX_CHARMELEON, HOENN_DEX_CHARIZARD, HOENN_DEX_SQUIRTLE, HOENN_DEX_WARTORTLE, HOENN_DEX_BLASTOISE, HOENN_DEX_CATERPIE, HOENN_DEX_METAPOD, HOENN_DEX_BUTTERFREE, HOENN_DEX_WEEDLE, HOENN_DEX_KAKUNA, HOENN_DEX_BEEDRILL, HOENN_DEX_PIDGEY, HOENN_DEX_PIDGEOTTO, HOENN_DEX_PIDGEOT, HOENN_DEX_RATTATA, HOENN_DEX_RATICATE, HOENN_DEX_SPEAROW, HOENN_DEX_FEAROW, HOENN_DEX_EKANS, HOENN_DEX_ARBOK, HOENN_DEX_NIDORAN_F, HOENN_DEX_NIDORINA, HOENN_DEX_NIDOQUEEN, HOENN_DEX_NIDORAN_M, HOENN_DEX_NIDORINO, HOENN_DEX_NIDOKING, HOENN_DEX_CLEFAIRY, HOENN_DEX_CLEFABLE, HOENN_DEX_PARAS, HOENN_DEX_PARASECT, HOENN_DEX_VENONAT, HOENN_DEX_VENOMOTH, HOENN_DEX_DIGLETT, HOENN_DEX_DUGTRIO, HOENN_DEX_MEOWTH, HOENN_DEX_PERSIAN, HOENN_DEX_MANKEY, HOENN_DEX_PRIMEAPE, HOENN_DEX_GROWLITHE, HOENN_DEX_ARCANINE, HOENN_DEX_POLIWAG, HOENN_DEX_POLIWHIRL, HOENN_DEX_POLIWRATH, HOENN_DEX_BELLSPROUT, HOENN_DEX_WEEPINBELL, HOENN_DEX_VICTREEBEL, HOENN_DEX_PONYTA, HOENN_DEX_RAPIDASH, HOENN_DEX_SLOWPOKE, HOENN_DEX_SLOWBRO, HOENN_DEX_FARFETCHD, HOENN_DEX_SEEL, HOENN_DEX_DEWGONG, HOENN_DEX_SHELLDER, HOENN_DEX_CLOYSTER, HOENN_DEX_GASTLY, HOENN_DEX_HAUNTER, HOENN_DEX_GENGAR, HOENN_DEX_ONIX, HOENN_DEX_DROWZEE, HOENN_DEX_HYPNO, HOENN_DEX_KRABBY, HOENN_DEX_KINGLER, HOENN_DEX_EXEGGCUTE, HOENN_DEX_EXEGGUTOR, HOENN_DEX_CUBONE, HOENN_DEX_MAROWAK, HOENN_DEX_HITMONLEE, HOENN_DEX_HITMONCHAN, HOENN_DEX_LICKITUNG, HOENN_DEX_CHANSEY, HOENN_DEX_TANGELA, HOENN_DEX_KANGASKHAN, HOENN_DEX_MR_MIME, HOENN_DEX_SCYTHER, HOENN_DEX_JYNX, HOENN_DEX_ELECTABUZZ, HOENN_DEX_MAGMAR, HOENN_DEX_TAUROS, HOENN_DEX_LAPRAS, HOENN_DEX_DITTO, HOENN_DEX_EEVEE, HOENN_DEX_VAPOREON, HOENN_DEX_JOLTEON, HOENN_DEX_FLAREON, HOENN_DEX_PORYGON, HOENN_DEX_OMANYTE, HOENN_DEX_OMASTAR, HOENN_DEX_KABUTO, HOENN_DEX_KABUTOPS, HOENN_DEX_AERODACTYL, HOENN_DEX_SNORLAX, HOENN_DEX_ARTICUNO, HOENN_DEX_ZAPDOS, HOENN_DEX_MOLTRES, HOENN_DEX_DRATINI, HOENN_DEX_DRAGONAIR, HOENN_DEX_DRAGONITE, HOENN_DEX_MEWTWO, HOENN_DEX_MEW, HOENN_DEX_CHIKORITA, HOENN_DEX_BAYLEEF, HOENN_DEX_MEGANIUM, HOENN_DEX_CYNDAQUIL, HOENN_DEX_QUILAVA, HOENN_DEX_TYPHLOSION, HOENN_DEX_TOTODILE, HOENN_DEX_CROCONAW, HOENN_DEX_FERALIGATR, HOENN_DEX_SENTRET, HOENN_DEX_FURRET, HOENN_DEX_HOOTHOOT, HOENN_DEX_NOCTOWL, HOENN_DEX_LEDYBA, HOENN_DEX_LEDIAN, HOENN_DEX_SPINARAK, HOENN_DEX_ARIADOS, HOENN_DEX_CLEFFA, HOENN_DEX_TOGEPI, HOENN_DEX_TOGETIC, HOENN_DEX_MAREEP, HOENN_DEX_FLAAFFY, HOENN_DEX_AMPHAROS, HOENN_DEX_SUDOWOODO, HOENN_DEX_POLITOED, HOENN_DEX_HOPPIP, HOENN_DEX_SKIPLOOM, HOENN_DEX_JUMPLUFF, HOENN_DEX_AIPOM, HOENN_DEX_SUNKERN, HOENN_DEX_SUNFLORA, HOENN_DEX_YANMA, HOENN_DEX_WOOPER, HOENN_DEX_QUAGSIRE, HOENN_DEX_ESPEON, HOENN_DEX_UMBREON, HOENN_DEX_MURKROW, HOENN_DEX_SLOWKING, HOENN_DEX_MISDREAVUS, HOENN_DEX_UNOWN, HOENN_DEX_PINECO, HOENN_DEX_FORRETRESS, HOENN_DEX_DUNSPARCE, HOENN_DEX_GLIGAR, HOENN_DEX_STEELIX, HOENN_DEX_SNUBBULL, HOENN_DEX_GRANBULL, HOENN_DEX_QWILFISH, HOENN_DEX_SCIZOR, HOENN_DEX_SHUCKLE, HOENN_DEX_SNEASEL, HOENN_DEX_TEDDIURSA, HOENN_DEX_URSARING, HOENN_DEX_SWINUB, HOENN_DEX_PILOSWINE, HOENN_DEX_REMORAID, HOENN_DEX_OCTILLERY, HOENN_DEX_DELIBIRD, HOENN_DEX_MANTINE, HOENN_DEX_HOUNDOUR, HOENN_DEX_HOUNDOOM, HOENN_DEX_PORYGON2, HOENN_DEX_STANTLER, HOENN_DEX_SMEARGLE, HOENN_DEX_TYROGUE, HOENN_DEX_HITMONTOP, HOENN_DEX_SMOOCHUM, HOENN_DEX_ELEKID, HOENN_DEX_MAGBY, HOENN_DEX_MILTANK, HOENN_DEX_BLISSEY, HOENN_DEX_RAIKOU, HOENN_DEX_ENTEI, HOENN_DEX_SUICUNE, HOENN_DEX_LARVITAR, HOENN_DEX_PUPITAR, HOENN_DEX_TYRANITAR, HOENN_DEX_LUGIA, HOENN_DEX_HO_OH, HOENN_DEX_CELEBI, HOENN_DEX_OLD_UNOWN_B, HOENN_DEX_OLD_UNOWN_C, HOENN_DEX_OLD_UNOWN_D, HOENN_DEX_OLD_UNOWN_E, HOENN_DEX_OLD_UNOWN_F, HOENN_DEX_OLD_UNOWN_G, HOENN_DEX_OLD_UNOWN_H, HOENN_DEX_OLD_UNOWN_I, HOENN_DEX_OLD_UNOWN_J, HOENN_DEX_OLD_UNOWN_K, HOENN_DEX_OLD_UNOWN_L, HOENN_DEX_OLD_UNOWN_M, HOENN_DEX_OLD_UNOWN_N, HOENN_DEX_OLD_UNOWN_O, HOENN_DEX_OLD_UNOWN_P, HOENN_DEX_OLD_UNOWN_Q, HOENN_DEX_OLD_UNOWN_R, HOENN_DEX_OLD_UNOWN_S, HOENN_DEX_OLD_UNOWN_T, HOENN_DEX_OLD_UNOWN_U, HOENN_DEX_OLD_UNOWN_V, HOENN_DEX_OLD_UNOWN_W, HOENN_DEX_OLD_UNOWN_X, HOENN_DEX_OLD_UNOWN_Y, HOENN_DEX_OLD_UNOWN_Z, }; #define HOENN_DEX_COUNT HOENN_DEX_DEOXYS // Extended Pokedex order enum { EXTENDED_DEX_NONE, EXTENDED_DEX_BULBASAUR, EXTENDED_DEX_IVYSAUR, EXTENDED_DEX_VENUSAUR, EXTENDED_DEX_CHARMANDER, EXTENDED_DEX_CHARMELEON, EXTENDED_DEX_CHARIZARD, EXTENDED_DEX_SQUIRTLE, EXTENDED_DEX_WARTORTLE, EXTENDED_DEX_BLASTOISE, EXTENDED_DEX_CATERPIE, EXTENDED_DEX_METAPOD, EXTENDED_DEX_BUTTERFREE, EXTENDED_DEX_WEEDLE, EXTENDED_DEX_KAKUNA, EXTENDED_DEX_BEEDRILL, EXTENDED_DEX_PIDGEY, EXTENDED_DEX_PIDGEOTTO, EXTENDED_DEX_PIDGEOT, EXTENDED_DEX_RATTATA, EXTENDED_DEX_RATICATE, EXTENDED_DEX_SPEAROW, EXTENDED_DEX_FEAROW, EXTENDED_DEX_EKANS, EXTENDED_DEX_ARBOK, EXTENDED_DEX_PICHU, EXTENDED_DEX_PIKACHU, EXTENDED_DEX_RAICHU, EXTENDED_DEX_SANDSHREW, EXTENDED_DEX_SANDSLASH, EXTENDED_DEX_NIDORAN_F, EXTENDED_DEX_NIDORINA, EXTENDED_DEX_NIDOQUEEN, EXTENDED_DEX_NIDORAN_M, EXTENDED_DEX_NIDORINO, EXTENDED_DEX_NIDOKING, EXTENDED_DEX_CLEFFA, EXTENDED_DEX_CLEFAIRY, EXTENDED_DEX_CLEFABLE, EXTENDED_DEX_VULPIX, EXTENDED_DEX_NINETALES, EXTENDED_DEX_IGGLYBUFF, EXTENDED_DEX_JIGGLYPUFF, EXTENDED_DEX_WIGGLYTUFF, EXTENDED_DEX_ZUBAT, EXTENDED_DEX_GOLBAT, EXTENDED_DEX_CROBAT, EXTENDED_DEX_ODDISH, EXTENDED_DEX_GLOOM, EXTENDED_DEX_VILEPLUME, EXTENDED_DEX_BELLOSSOM, EXTENDED_DEX_PARAS, EXTENDED_DEX_PARASECT, EXTENDED_DEX_VENONAT, EXTENDED_DEX_VENOMOTH, EXTENDED_DEX_DIGLETT, EXTENDED_DEX_DUGTRIO, EXTENDED_DEX_MEOWTH, EXTENDED_DEX_PERSIAN, EXTENDED_DEX_PSYDUCK, EXTENDED_DEX_GOLDUCK, EXTENDED_DEX_MANKEY, EXTENDED_DEX_PRIMEAPE, EXTENDED_DEX_GROWLITHE, EXTENDED_DEX_ARCANINE, EXTENDED_DEX_POLIWAG, EXTENDED_DEX_POLIWHIRL, EXTENDED_DEX_POLIWRATH, EXTENDED_DEX_POLITOED, EXTENDED_DEX_ABRA, EXTENDED_DEX_KADABRA, EXTENDED_DEX_ALAKAZAM, EXTENDED_DEX_MACHOP, EXTENDED_DEX_MACHOKE, EXTENDED_DEX_MACHAMP, EXTENDED_DEX_BELLSPROUT, EXTENDED_DEX_WEEPINBELL, EXTENDED_DEX_VICTREEBEL, EXTENDED_DEX_TENTACOOL, EXTENDED_DEX_TENTACRUEL, EXTENDED_DEX_GEODUDE, EXTENDED_DEX_GRAVELER, EXTENDED_DEX_GOLEM, EXTENDED_DEX_PONYTA, EXTENDED_DEX_RAPIDASH, EXTENDED_DEX_SLOWPOKE, EXTENDED_DEX_SLOWBRO, EXTENDED_DEX_SLOWKING, EXTENDED_DEX_MAGNEMITE, EXTENDED_DEX_MAGNETON, EXTENDED_DEX_FARFETCHD, EXTENDED_DEX_DODUO, EXTENDED_DEX_DODRIO, EXTENDED_DEX_SEEL, EXTENDED_DEX_DEWGONG, EXTENDED_DEX_GRIMER, EXTENDED_DEX_MUK, EXTENDED_DEX_SHELLDER, EXTENDED_DEX_CLOYSTER, EXTENDED_DEX_GASTLY, EXTENDED_DEX_HAUNTER, EXTENDED_DEX_GENGAR, EXTENDED_DEX_ONIX, EXTENDED_DEX_STEELIX, EXTENDED_DEX_DROWZEE, EXTENDED_DEX_HYPNO, EXTENDED_DEX_KRABBY, EXTENDED_DEX_KINGLER, EXTENDED_DEX_VOLTORB, EXTENDED_DEX_ELECTRODE, EXTENDED_DEX_EXEGGCUTE, EXTENDED_DEX_EXEGGUTOR, EXTENDED_DEX_CUBONE, EXTENDED_DEX_MAROWAK, EXTENDED_DEX_TYROGUE, EXTENDED_DEX_HITMONLEE, EXTENDED_DEX_HITMONCHAN, EXTENDED_DEX_HITMONTOP, EXTENDED_DEX_LICKITUNG, EXTENDED_DEX_KOFFING, EXTENDED_DEX_WEEZING, EXTENDED_DEX_RHYHORN, EXTENDED_DEX_RHYDON, EXTENDED_DEX_CHANSEY, EXTENDED_DEX_BLISSEY, EXTENDED_DEX_TANGELA, EXTENDED_DEX_KANGASKHAN, EXTENDED_DEX_HORSEA, EXTENDED_DEX_SEADRA, EXTENDED_DEX_KINGDRA, EXTENDED_DEX_GOLDEEN, EXTENDED_DEX_SEAKING, EXTENDED_DEX_STARYU, EXTENDED_DEX_STARMIE, EXTENDED_DEX_MR_MIME, EXTENDED_DEX_SCYTHER, EXTENDED_DEX_SCIZOR, EXTENDED_DEX_SMOOCHUM, EXTENDED_DEX_JYNX, EXTENDED_DEX_ELEKID, EXTENDED_DEX_ELECTABUZZ, EXTENDED_DEX_MAGBY, EXTENDED_DEX_MAGMAR, EXTENDED_DEX_PINSIR, EXTENDED_DEX_TAUROS, EXTENDED_DEX_MAGIKARP, EXTENDED_DEX_GYARADOS, EXTENDED_DEX_LAPRAS, EXTENDED_DEX_DITTO, EXTENDED_DEX_EEVEE, EXTENDED_DEX_VAPOREON, EXTENDED_DEX_JOLTEON, EXTENDED_DEX_FLAREON, EXTENDED_DEX_ESPEON, EXTENDED_DEX_UMBREON, EXTENDED_DEX_PORYGON, EXTENDED_DEX_PORYGON2, EXTENDED_DEX_OMANYTE, EXTENDED_DEX_OMASTAR, EXTENDED_DEX_KABUTO, EXTENDED_DEX_KABUTOPS, EXTENDED_DEX_AERODACTYL, EXTENDED_DEX_SNORLAX, EXTENDED_DEX_ARTICUNO, EXTENDED_DEX_ZAPDOS, EXTENDED_DEX_MOLTRES, EXTENDED_DEX_DRATINI, EXTENDED_DEX_DRAGONAIR, EXTENDED_DEX_DRAGONITE, EXTENDED_DEX_MEWTWO, EXTENDED_DEX_MEW, EXTENDED_DEX_SENTRET, EXTENDED_DEX_FURRET, EXTENDED_DEX_HOOTHOOT, EXTENDED_DEX_NOCTOWL, EXTENDED_DEX_LEDYBA, EXTENDED_DEX_LEDIAN, EXTENDED_DEX_SPINARAK, EXTENDED_DEX_ARIADOS, EXTENDED_DEX_CHINCHOU, EXTENDED_DEX_LANTURN, EXTENDED_DEX_TOGEPI, EXTENDED_DEX_TOGETIC, EXTENDED_DEX_NATU, EXTENDED_DEX_XATU, EXTENDED_DEX_MAREEP, EXTENDED_DEX_FLAAFFY, EXTENDED_DEX_AMPHAROS, EXTENDED_DEX_AZURILL, EXTENDED_DEX_MARILL, EXTENDED_DEX_AZUMARILL, EXTENDED_DEX_SUDOWOODO, EXTENDED_DEX_HOPPIP, EXTENDED_DEX_SKIPLOOM, EXTENDED_DEX_JUMPLUFF, EXTENDED_DEX_AIPOM, EXTENDED_DEX_SUNKERN, EXTENDED_DEX_SUNFLORA, EXTENDED_DEX_YANMA, EXTENDED_DEX_WOOPER, EXTENDED_DEX_QUAGSIRE, EXTENDED_DEX_MURKROW, EXTENDED_DEX_MISDREAVUS, EXTENDED_DEX_UNOWN, EXTENDED_DEX_WYNAUT, EXTENDED_DEX_WOBBUFFET, EXTENDED_DEX_GIRAFARIG, EXTENDED_DEX_PINECO, EXTENDED_DEX_FORRETRESS, EXTENDED_DEX_DUNSPARCE, EXTENDED_DEX_GLIGAR, EXTENDED_DEX_SNUBBULL, EXTENDED_DEX_GRANBULL, EXTENDED_DEX_QWILFISH, EXTENDED_DEX_SHUCKLE, EXTENDED_DEX_HERACROSS, EXTENDED_DEX_SNEASEL, EXTENDED_DEX_TEDDIURSA, EXTENDED_DEX_URSARING, EXTENDED_DEX_SLUGMA, EXTENDED_DEX_MAGCARGO, EXTENDED_DEX_SWINUB, EXTENDED_DEX_PILOSWINE, EXTENDED_DEX_CORSOLA, EXTENDED_DEX_REMORAID, EXTENDED_DEX_OCTILLERY, EXTENDED_DEX_DELIBIRD, EXTENDED_DEX_MANTINE, EXTENDED_DEX_SKARMORY, EXTENDED_DEX_HOUNDOUR, EXTENDED_DEX_HOUNDOOM, EXTENDED_DEX_PHANPY, EXTENDED_DEX_DONPHAN, EXTENDED_DEX_STANTLER, EXTENDED_DEX_SMEARGLE, EXTENDED_DEX_MILTANK, EXTENDED_DEX_RAIKOU, EXTENDED_DEX_ENTEI, EXTENDED_DEX_SUICUNE, EXTENDED_DEX_LARVITAR, EXTENDED_DEX_PUPITAR, EXTENDED_DEX_TYRANITAR, EXTENDED_DEX_LUGIA, EXTENDED_DEX_HO_OH, EXTENDED_DEX_LATIAS, EXTENDED_DEX_LATIOS, EXTENDED_DEX_DEOXYS, // End of Extended Dex (see EXTENDED_DEX_COUNT) // Here below have values but are excluded from the Pokedex EXTENDED_DEX_CHIKORITA, EXTENDED_DEX_BAYLEEF, EXTENDED_DEX_MEGANIUM, EXTENDED_DEX_CYNDAQUIL, EXTENDED_DEX_QUILAVA, EXTENDED_DEX_TYPHLOSION, EXTENDED_DEX_TOTODILE, EXTENDED_DEX_CROCONAW, EXTENDED_DEX_FERALIGATR, EXTENDED_DEX_CELEBI, EXTENDED_DEX_TREECKO, EXTENDED_DEX_GROVYLE, EXTENDED_DEX_SCEPTILE, EXTENDED_DEX_TORCHIC, EXTENDED_DEX_COMBUSKEN, EXTENDED_DEX_BLAZIKEN, EXTENDED_DEX_MUDKIP, EXTENDED_DEX_MARSHTOMP, EXTENDED_DEX_SWAMPERT, EXTENDED_DEX_POOCHYENA, EXTENDED_DEX_MIGHTYENA, EXTENDED_DEX_ZIGZAGOON, EXTENDED_DEX_LINOONE, EXTENDED_DEX_WURMPLE, EXTENDED_DEX_SILCOON, EXTENDED_DEX_BEAUTIFLY, EXTENDED_DEX_CASCOON, EXTENDED_DEX_DUSTOX, EXTENDED_DEX_LOTAD, EXTENDED_DEX_LOMBRE, EXTENDED_DEX_LUDICOLO, EXTENDED_DEX_SEEDOT, EXTENDED_DEX_NUZLEAF, EXTENDED_DEX_SHIFTRY, EXTENDED_DEX_TAILLOW, EXTENDED_DEX_SWELLOW, EXTENDED_DEX_WINGULL, EXTENDED_DEX_PELIPPER, EXTENDED_DEX_RALTS, EXTENDED_DEX_KIRLIA, EXTENDED_DEX_GARDEVOIR, EXTENDED_DEX_SURSKIT, EXTENDED_DEX_MASQUERAIN, EXTENDED_DEX_SHROOMISH, EXTENDED_DEX_BRELOOM, EXTENDED_DEX_SLAKOTH, EXTENDED_DEX_VIGOROTH, EXTENDED_DEX_SLAKING, EXTENDED_DEX_NINCADA, EXTENDED_DEX_NINJASK, EXTENDED_DEX_SHEDINJA, EXTENDED_DEX_WHISMUR, EXTENDED_DEX_LOUDRED, EXTENDED_DEX_EXPLOUD, EXTENDED_DEX_MAKUHITA, EXTENDED_DEX_HARIYAMA, EXTENDED_DEX_NOSEPASS, EXTENDED_DEX_SKITTY, EXTENDED_DEX_DELCATTY, EXTENDED_DEX_SABLEYE, EXTENDED_DEX_MAWILE, EXTENDED_DEX_ARON, EXTENDED_DEX_LAIRON, EXTENDED_DEX_AGGRON, EXTENDED_DEX_MEDITITE, EXTENDED_DEX_MEDICHAM, EXTENDED_DEX_ELECTRIKE, EXTENDED_DEX_MANECTRIC, EXTENDED_DEX_PLUSLE, EXTENDED_DEX_MINUN, EXTENDED_DEX_VOLBEAT, EXTENDED_DEX_ILLUMISE, EXTENDED_DEX_ROSELIA, EXTENDED_DEX_GULPIN, EXTENDED_DEX_SWALOT, EXTENDED_DEX_CARVANHA, EXTENDED_DEX_SHARPEDO, EXTENDED_DEX_WAILMER, EXTENDED_DEX_WAILORD, EXTENDED_DEX_NUMEL, EXTENDED_DEX_CAMERUPT, EXTENDED_DEX_TORKOAL, EXTENDED_DEX_SPOINK, EXTENDED_DEX_GRUMPIG, EXTENDED_DEX_SPINDA, EXTENDED_DEX_TRAPINCH, EXTENDED_DEX_VIBRAVA, EXTENDED_DEX_FLYGON, EXTENDED_DEX_CACNEA, EXTENDED_DEX_CACTURNE, EXTENDED_DEX_SWABLU, EXTENDED_DEX_ALTARIA, EXTENDED_DEX_ZANGOOSE, EXTENDED_DEX_SEVIPER, EXTENDED_DEX_LUNATONE, EXTENDED_DEX_SOLROCK, EXTENDED_DEX_BARBOACH, EXTENDED_DEX_WHISCASH, EXTENDED_DEX_CORPHISH, EXTENDED_DEX_CRAWDAUNT, EXTENDED_DEX_BALTOY, EXTENDED_DEX_CLAYDOL, EXTENDED_DEX_LILEEP, EXTENDED_DEX_CRADILY, EXTENDED_DEX_ANORITH, EXTENDED_DEX_ARMALDO, EXTENDED_DEX_FEEBAS, EXTENDED_DEX_MILOTIC, EXTENDED_DEX_CASTFORM, EXTENDED_DEX_KECLEON, EXTENDED_DEX_SHUPPET, EXTENDED_DEX_BANETTE, EXTENDED_DEX_DUSKULL, EXTENDED_DEX_DUSCLOPS, EXTENDED_DEX_TROPIUS, EXTENDED_DEX_CHIMECHO, EXTENDED_DEX_ABSOL, EXTENDED_DEX_SNORUNT, EXTENDED_DEX_GLALIE, EXTENDED_DEX_SPHEAL, EXTENDED_DEX_SEALEO, EXTENDED_DEX_WALREIN, EXTENDED_DEX_CLAMPERL, EXTENDED_DEX_HUNTAIL, EXTENDED_DEX_GOREBYSS, EXTENDED_DEX_RELICANTH, EXTENDED_DEX_LUVDISC, EXTENDED_DEX_BAGON, EXTENDED_DEX_SHELGON, EXTENDED_DEX_SALAMENCE, EXTENDED_DEX_BELDUM, EXTENDED_DEX_METANG, EXTENDED_DEX_METAGROSS, EXTENDED_DEX_REGIROCK, EXTENDED_DEX_REGICE, EXTENDED_DEX_REGISTEEL, EXTENDED_DEX_KYOGRE, EXTENDED_DEX_GROUDON, EXTENDED_DEX_RAYQUAZA, EXTENDED_DEX_JIRACHI, EXTENDED_DEX_OLD_UNOWN_B, EXTENDED_DEX_OLD_UNOWN_C, EXTENDED_DEX_OLD_UNOWN_D, EXTENDED_DEX_OLD_UNOWN_E, EXTENDED_DEX_OLD_UNOWN_F, EXTENDED_DEX_OLD_UNOWN_G, EXTENDED_DEX_OLD_UNOWN_H, EXTENDED_DEX_OLD_UNOWN_I, EXTENDED_DEX_OLD_UNOWN_J, EXTENDED_DEX_OLD_UNOWN_K, EXTENDED_DEX_OLD_UNOWN_L, EXTENDED_DEX_OLD_UNOWN_M, EXTENDED_DEX_OLD_UNOWN_N, EXTENDED_DEX_OLD_UNOWN_O, EXTENDED_DEX_OLD_UNOWN_P, EXTENDED_DEX_OLD_UNOWN_Q, EXTENDED_DEX_OLD_UNOWN_R, EXTENDED_DEX_OLD_UNOWN_S, EXTENDED_DEX_OLD_UNOWN_T, EXTENDED_DEX_OLD_UNOWN_U, EXTENDED_DEX_OLD_UNOWN_V, EXTENDED_DEX_OLD_UNOWN_W, EXTENDED_DEX_OLD_UNOWN_X, EXTENDED_DEX_OLD_UNOWN_Y, EXTENDED_DEX_OLD_UNOWN_Z, }; #define EXTENDED_DEX_COUNT EXTENDED_DEX_DEOXYS #endif // GUARD_CONSTANTS_POKEDEX_H ================================================ FILE: include/constants/pokemon.h ================================================ #ifndef GUARD_CONSTANTS_POKEMON_H #define GUARD_CONSTANTS_POKEMON_H // For (Set|Get)(Box)?MonData #define MON_DATA_PERSONALITY 0 #define MON_DATA_OT_ID 1 #define MON_DATA_NICKNAME 2 #define MON_DATA_LANGUAGE 3 #define MON_DATA_SANITY_IS_BAD_EGG 4 #define MON_DATA_SANITY_HAS_SPECIES 5 #define MON_DATA_SANITY_IS_EGG 6 #define MON_DATA_OT_NAME 7 #define MON_DATA_MARKINGS 8 #define MON_DATA_CHECKSUM 9 #define MON_DATA_ENCRYPT_SEPARATOR 10 #define MON_DATA_SPECIES 11 #define MON_DATA_HELD_ITEM 12 #define MON_DATA_MOVE1 13 #define MON_DATA_MOVE2 14 #define MON_DATA_MOVE3 15 #define MON_DATA_MOVE4 16 #define MON_DATA_PP1 17 #define MON_DATA_PP2 18 #define MON_DATA_PP3 19 #define MON_DATA_PP4 20 #define MON_DATA_PP_BONUSES 21 #define MON_DATA_COOL 22 #define MON_DATA_BEAUTY 23 #define MON_DATA_CUTE 24 #define MON_DATA_EXP 25 #define MON_DATA_HP_EV 26 #define MON_DATA_ATK_EV 27 #define MON_DATA_DEF_EV 28 #define MON_DATA_SPEED_EV 29 #define MON_DATA_SPATK_EV 30 #define MON_DATA_SPDEF_EV 31 #define MON_DATA_FRIENDSHIP 32 #define MON_DATA_SMART 33 #define MON_DATA_POKERUS 34 #define MON_DATA_MET_LOCATION 35 #define MON_DATA_MET_LEVEL 36 #define MON_DATA_MET_GAME 37 #define MON_DATA_POKEBALL 38 #define MON_DATA_HP_IV 39 #define MON_DATA_ATK_IV 40 #define MON_DATA_DEF_IV 41 #define MON_DATA_SPEED_IV 42 #define MON_DATA_SPATK_IV 43 #define MON_DATA_SPDEF_IV 44 #define MON_DATA_IS_EGG 45 #define MON_DATA_ABILITY_NUM 46 #define MON_DATA_TOUGH 47 #define MON_DATA_SHEEN 48 #define MON_DATA_OT_GENDER 49 #define MON_DATA_COOL_RIBBON 50 #define MON_DATA_BEAUTY_RIBBON 51 #define MON_DATA_CUTE_RIBBON 52 #define MON_DATA_SMART_RIBBON 53 #define MON_DATA_TOUGH_RIBBON 54 #define MON_DATA_STATUS 55 #define MON_DATA_LEVEL 56 #define MON_DATA_HP 57 #define MON_DATA_MAX_HP 58 #define MON_DATA_ATK 59 #define MON_DATA_DEF 60 #define MON_DATA_SPEED 61 #define MON_DATA_SPATK 62 #define MON_DATA_SPDEF 63 #define MON_DATA_MAIL 64 #define MON_DATA_SPECIES_OR_EGG 65 #define MON_DATA_IVS 66 #define MON_DATA_CHAMPION_RIBBON 67 #define MON_DATA_WINNING_RIBBON 68 #define MON_DATA_VICTORY_RIBBON 69 #define MON_DATA_ARTIST_RIBBON 70 #define MON_DATA_EFFORT_RIBBON 71 #define MON_DATA_MARINE_RIBBON 72 #define MON_DATA_LAND_RIBBON 73 #define MON_DATA_SKY_RIBBON 74 #define MON_DATA_COUNTRY_RIBBON 75 #define MON_DATA_NATIONAL_RIBBON 76 #define MON_DATA_EARTH_RIBBON 77 #define MON_DATA_WORLD_RIBBON 78 #define MON_DATA_UNUSED_RIBBONS 79 #define MON_DATA_MODERN_FATEFUL_ENCOUNTER 80 #define MON_DATA_KNOWN_MOVES 81 #define MON_DATA_RIBBON_COUNT 82 #define MON_DATA_RIBBONS 83 #define MON_DATA_ATK2 84 #define MON_DATA_DEF2 85 #define MON_DATA_SPEED2 86 #define MON_DATA_SPATK2 87 #define MON_DATA_SPDEF2 88 #define MON_DATA_FORME 89 #define MON_DATA_BOX_HP 90 #define MON_DATA_BOX_STATUS 91 // Pokemon types #define TYPE_NONE 255 #define TYPE_NORMAL 0 #define TYPE_FIGHTING 1 #define TYPE_FLYING 2 #define TYPE_POISON 3 #define TYPE_GROUND 4 #define TYPE_ROCK 5 #define TYPE_BUG 6 #define TYPE_GHOST 7 #define TYPE_STEEL 8 #define TYPE_MYSTERY 9 #define TYPE_FIRE 10 #define TYPE_WATER 11 #define TYPE_GRASS 12 #define TYPE_ELECTRIC 13 #define TYPE_PSYCHIC 14 #define TYPE_ICE 15 #define TYPE_DRAGON 16 #define TYPE_DARK 17 #define NUMBER_OF_MON_TYPES 18 // Pokemon egg groups #define EGG_GROUP_NONE 0 #define EGG_GROUP_MONSTER 1 #define EGG_GROUP_WATER_1 2 #define EGG_GROUP_BUG 3 #define EGG_GROUP_FLYING 4 #define EGG_GROUP_FIELD 5 #define EGG_GROUP_FAIRY 6 #define EGG_GROUP_GRASS 7 #define EGG_GROUP_HUMAN_LIKE 8 #define EGG_GROUP_WATER_3 9 #define EGG_GROUP_MINERAL 10 #define EGG_GROUP_AMORPHOUS 11 #define EGG_GROUP_WATER_2 12 #define EGG_GROUP_DITTO 13 #define EGG_GROUP_DRAGON 14 #define EGG_GROUP_UNDISCOVERED 15 #define EGG_GROUPS_PER_MON 2 // Pokemon natures #define NATURE_HARDY 0 #define NATURE_LONELY 1 #define NATURE_BRAVE 2 #define NATURE_ADAMANT 3 #define NATURE_NAUGHTY 4 #define NATURE_BOLD 5 #define NATURE_DOCILE 6 #define NATURE_RELAXED 7 #define NATURE_IMPISH 8 #define NATURE_LAX 9 #define NATURE_TIMID 10 #define NATURE_HASTY 11 #define NATURE_SERIOUS 12 #define NATURE_JOLLY 13 #define NATURE_NAIVE 14 #define NATURE_MODEST 15 #define NATURE_MILD 16 #define NATURE_QUIET 17 #define NATURE_BASHFUL 18 #define NATURE_RASH 19 #define NATURE_CALM 20 #define NATURE_GENTLE 21 #define NATURE_SASSY 22 #define NATURE_CAREFUL 23 #define NATURE_QUIRKY 24 #define NUM_NATURES 25 // Pokemon Stats #define STAT_HP 0 #define STAT_ATK 1 #define STAT_DEF 2 #define STAT_SPEED 3 #define STAT_SPATK 4 #define STAT_SPDEF 5 #define NUM_STATS 6 #define STAT_ACC 6 // Only in battles. #define STAT_EVASION 7 // Only in battles. #define NUM_NATURE_STATS (NUM_STATS - 1) // excludes HP #define NUM_BATTLE_STATS (NUM_STATS + 2) // includes Accuracy and Evasion #define MIN_STAT_STAGE 0 #define DEFAULT_STAT_STAGE 6 #define MAX_STAT_STAGE 12 // Shiny odds #define SHINY_ODDS 8 // Actual probability is SHINY_ODDS/65536 #define MAX_LEVEL 100 #define OT_ID_PLAYER_ID 0 #define OT_ID_PRESET 1 #define OT_ID_RANDOM_NO_SHINY 2 #define MON_GIVEN_TO_PARTY 0 #define MON_GIVEN_TO_PC 1 #define MON_CANT_GIVE 2 #define PLAYER_HAS_TWO_USABLE_MONS 0 #define PLAYER_HAS_ONE_MON 1 #define PLAYER_HAS_ONE_USABLE_MON 2 // Learning moves #define MON_ALREADY_KNOWS_MOVE 0xFFFE #define MON_HAS_MAX_MOVES 0xFFFF #define LEVEL_UP_MOVE_ID 0x01FF #define LEVEL_UP_MOVE_LV 0xFE00 #define LEVEL_UP_END 0xFFFF #define MAX_LEVEL_UP_MOVES 20 #define LEVEL_UP_MOVE_ID 0x01FF #define LEVEL_UP_MOVE_LV 0xFE00 #define LEVEL_UP_END 0xFFFF #define MON_MALE 0x00 #define MON_FEMALE 0xFE #define MON_GENDERLESS 0xFF #define FRIENDSHIP_EVENT_GROW_LEVEL 0 #define FRIENDSHIP_EVENT_VITAMIN 1 #define FRIENDSHIP_EVENT_BATTLE_ITEM 2 #define FRIENDSHIP_EVENT_LEAGUE_BATTLE 3 #define FRIENDSHIP_EVENT_LEARN_TMHM 4 #define FRIENDSHIP_EVENT_WALKING 5 #define FRIENDSHIP_EVENT_MASSAGE 6 #define FRIENDSHIP_EVENT_FAINT_SMALL 7 #define FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE 8 #define FRIENDSHIP_EVENT_FAINT_LARGE 9 #define MAX_FRIENDSHIP 255 #define MAX_SHEEN 255 #define MAX_CONDITION 255 #define MAX_PER_STAT_IVS 31 #define MAX_IV_MASK 31 #define USE_RANDOM_IVS (MAX_PER_STAT_IVS + 1) #define MAX_PER_STAT_EVS 255 #define MAX_TOTAL_EVS 510 #define EV_ITEM_RAISE_LIMIT 100 // Battle move flags #define FLAG_MAKES_CONTACT (1 << 0) #define FLAG_PROTECT_AFFECTED (1 << 1) #define FLAG_MAGIC_COAT_AFFECTED (1 << 2) #define FLAG_SNATCH_AFFECTED (1 << 3) #define FLAG_MIRROR_MOVE_AFFECTED (1 << 4) #define FLAG_KINGS_ROCK_AFFECTED (1 << 5) // Growth rates #define GROWTH_MEDIUM_FAST 0 #define GROWTH_ERRATIC 1 #define GROWTH_FLUCTUATING 2 #define GROWTH_MEDIUM_SLOW 3 #define GROWTH_FAST 4 #define GROWTH_SLOW 5 // Body colors for pokedex search #define BODY_COLOR_RED 0 #define BODY_COLOR_BLUE 1 #define BODY_COLOR_YELLOW 2 #define BODY_COLOR_GREEN 3 #define BODY_COLOR_BLACK 4 #define BODY_COLOR_BROWN 5 #define BODY_COLOR_PURPLE 6 #define BODY_COLOR_GRAY 7 #define BODY_COLOR_WHITE 8 #define BODY_COLOR_PINK 9 // Evolution types #define EVO_FRIENDSHIP 1 // Pokémon levels up with friendship ≥ 220 #define EVO_FRIENDSHIP_DAY 2 // Pokémon levels up during the day with friendship ≥ 220 #define EVO_FRIENDSHIP_NIGHT 3 // Pokémon levels up at night with friendship ≥ 220 #define EVO_LEVEL 4 // Pokémon reaches the specified level #define EVO_TRADE 5 // Pokémon is traded #define EVO_TRADE_ITEM 6 // Pokémon is traded while it's holding the specified item #define EVO_ITEM 7 // specified item is used on Pokémon #define EVO_LEVEL_ATK_GT_DEF 8 // Pokémon reaches the specified level with attack > defense #define EVO_LEVEL_ATK_EQ_DEF 9 // Pokémon reaches the specified level with attack = defense #define EVO_LEVEL_ATK_LT_DEF 10 // Pokémon reaches the specified level with attack < defense #define EVO_LEVEL_SILCOON 11 // Pokémon reaches the specified level with a Silcoon personality value #define EVO_LEVEL_CASCOON 12 // Pokémon reaches the specified level with a Cascoon personality value #define EVO_LEVEL_NINJASK 13 // Pokémon reaches the specified level (special value for Ninjask) #define EVO_LEVEL_SHEDINJA 14 // Pokémon reaches the specified level (special value for Shedinja) #define EVO_BEAUTY 15 // Pokémon levels up with beauty ≥ specified value #define EVO_STONE_HELD 16 // specified item is used on Pokémon and it's holding the specified item #define EVOS_PER_MON 5 #define EVOS_PER_LINE 6 #define EVO_MODE_NORMAL 0 #define EVO_MODE_TRADE 1 #define EVO_MODE_ITEM_USE 2 #define EVO_MODE_ITEM_CHECK 3 // If an Everstone is being held, still want to show that the stone *could* be used on that Pokémon to evolve #define MON_PIC_WIDTH 64 #define MON_PIC_HEIGHT 64 #define MON_PIC_SIZE (MON_PIC_WIDTH * MON_PIC_HEIGHT / 2) // Most pokemon have 1 frame. There are 2 exceptions: // - Castform has 4 frames, 1 for each form // - Deoxys has 2 frames, 1 for each form #define MAX_MON_PIC_FRAMES 4 // used by ShouldIgnoreDeoxysForm #define DEOXYS_CHECK_BATTLE_SPRITE 1 #define DEOXYS_CHECK_TRADE_MAIN 3 #define DEOXYS_CHECK_BATTLE_ANIM 5 #endif // GUARD_CONSTANTS_POKEMON_H ================================================ FILE: include/constants/quest_log.h ================================================ #ifndef GUARD_CONSTANTS_QUEST_LOG_H #define GUARD_CONSTANTS_QUEST_LOG_H #define QL_STATE_RECORDING 1 #define QL_STATE_PLAYBACK 2 #define QL_STATE_PLAYBACK_LAST 3 #define QL_PLAYBACK_STATE_STOPPED 0 #define QL_PLAYBACK_STATE_RUNNING 1 #define QL_PLAYBACK_STATE_RECORDING 2 #define QL_PLAYBACK_STATE_ACTION_END 3 #define QL_PLAYBACK_STATE_RECORDING_NO_DELAY 4 #define QL_START_NORMAL 1 #define QL_START_WARP 2 // gGlobalFieldTintMode #define QL_TINT_NONE 0 #define QL_TINT_GRAYSCALE 1 #define QL_TINT_SEPIA 2 #define QL_TINT_BACKUP_GRAYSCALE 3 #define QL_IS_PLAYBACK_STATE (gQuestLogState == QL_STATE_PLAYBACK || gQuestLogState == QL_STATE_PLAYBACK_LAST) #define QL_EVENT_INPUT 0 // Null #define QL_EVENT_GFX_CHANGE 1 // Null #define QL_EVENT_MOVEMENT 2 // Null #define QL_EVENT_SWITCHED_PARTY_ORDER 3 #define QL_EVENT_USED_ITEM 4 #define QL_EVENT_GAVE_HELD_ITEM 5 #define QL_EVENT_GAVE_HELD_ITEM_BAG 6 #define QL_EVENT_GAVE_HELD_ITEM_PC 7 #define QL_EVENT_TOOK_HELD_ITEM 8 #define QL_EVENT_SWAPPED_HELD_ITEM 9 #define QL_EVENT_SWAPPED_HELD_ITEM_PC 10 #define QL_EVENT_USED_PKMN_CENTER 11 #define QL_EVENT_LINK_TRADED 12 #define QL_EVENT_LINK_BATTLED_SINGLE 13 #define QL_EVENT_LINK_BATTLED_DOUBLE 14 #define QL_EVENT_LINK_BATTLED_MULTI 15 #define QL_EVENT_USED_UNION_ROOM 16 #define QL_EVENT_USED_UNION_ROOM_CHAT 17 #define QL_EVENT_LINK_TRADED_UNION 18 #define QL_EVENT_LINK_BATTLED_UNION 19 #define QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES 20 #define QL_EVENT_SWITCHED_MONS_WITHIN_BOX 21 #define QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON 22 #define QL_EVENT_MOVED_MON_BETWEEN_BOXES 23 #define QL_EVENT_MOVED_MON_WITHIN_BOX 24 #define QL_EVENT_WITHDREW_MON_PC 25 #define QL_EVENT_DEPOSITED_MON_PC 26 #define QL_EVENT_SWITCHED_MULTIPLE_MONS 27 #define QL_EVENT_DEPOSITED_ITEM_PC 28 #define QL_EVENT_WITHDREW_ITEM_PC 29 #define QL_EVENT_DEFEATED_GYM_LEADER 30 #define QL_EVENT_DEFEATED_WILD_MON 31 #define QL_EVENT_DEFEATED_E4_MEMBER 32 #define QL_EVENT_DEFEATED_CHAMPION 33 #define QL_EVENT_DEFEATED_TRAINER 34 #define QL_EVENT_DEPARTED 35 #define QL_EVENT_USED_FIELD_MOVE 36 #define QL_EVENT_BOUGHT_ITEM 37 #define QL_EVENT_SOLD_ITEM 38 #define QL_EVENT_SCENE_END 39 // Null #define QL_EVENT_OBTAINED_STORY_ITEM 40 #define QL_EVENT_WAIT 41 // Null #define QL_EVENT_ARRIVED 42 #define QL_EVENT_USED_POKEMART (QL_EVENT_BOUGHT_ITEM - 1) // Used as a start pos for QL_EVENT_BOUGHT_ITEM / QL_EVENT_SOLD_ITEM #define IS_LINK_QL_EVENT(event)((event) >= QL_EVENT_LINK_TRADED && (event) <= QL_EVENT_LINK_BATTLED_UNION) #define IS_VALID_QL_EVENT(event)((event) >= QL_EVENT_SWITCHED_PARTY_ORDER && (event) <= QL_EVENT_ARRIVED) #define QL_LOCATION_HOME 0 #define QL_LOCATION_OAKS_LAB 1 #define QL_LOCATION_VIRIDIAN_GYM 2 #define QL_LOCATION_LEAGUE_GATE_1 3 #define QL_LOCATION_LEAGUE_GATE_2 4 #define QL_LOCATION_VIRIDIAN_FOREST_1 5 #define QL_LOCATION_VIRIDIAN_FOREST_2 6 #define QL_LOCATION_PEWTER_MUSEUM 7 #define QL_LOCATION_PEWTER_GYM 8 #define QL_LOCATION_MT_MOON_1 9 #define QL_LOCATION_MT_MOON_2 10 #define QL_LOCATION_CERULEAN_GYM 11 #define QL_LOCATION_BIKE_SHOP 12 #define QL_LOCATION_BILLS_HOUSE 13 #define QL_LOCATION_DAY_CARE 14 #define QL_LOCATION_UNDERGROUND_PATH_1 15 #define QL_LOCATION_UNDERGROUND_PATH_2 16 #define QL_LOCATION_PKMN_FAN_CLUB 17 #define QL_LOCATION_VERMILION_GYM 18 #define QL_LOCATION_SS_ANNE 19 #define QL_LOCATION_DIGLETTS_CAVE_1 20 #define QL_LOCATION_DIGLETTS_CAVE_2 21 #define QL_LOCATION_ROCK_TUNNEL_1 22 #define QL_LOCATION_ROCK_TUNNEL_2 23 #define QL_LOCATION_POWER_PLANT 24 #define QL_LOCATION_PKMN_TOWER 25 #define QL_LOCATION_VOLUNTEER_HOUSE 26 #define QL_LOCATION_NAME_RATERS_HOUSE 27 #define QL_LOCATION_UNDERGROUND_PATH_3 28 #define QL_LOCATION_UNDERGROUND_PATH_4 29 #define QL_LOCATION_CELADON_DEPT_STORE 30 #define QL_LOCATION_CELADON_MANSION 31 #define QL_LOCATION_GAME_CORNER 32 #define QL_LOCATION_CELADON_GYM 33 #define QL_LOCATION_CELADON_RESTAURANT 34 #define QL_LOCATION_ROCKET_HIDEOUT 35 #define QL_LOCATION_SAFARI_ZONE 36 #define QL_LOCATION_FUCHSIA_GYM 37 #define QL_LOCATION_WARDENS_HOME 38 #define QL_LOCATION_FIGHTING_DOJO 39 #define QL_LOCATION_SAFFRON_GYM 40 #define QL_LOCATION_SILPH_CO 41 #define QL_LOCATION_SEAFOAM_ISLANDS_1 42 #define QL_LOCATION_SEAFOAM_ISLANDS_2 43 #define QL_LOCATION_PKMN_MANSION 44 #define QL_LOCATION_CINNABAR_GYM 45 #define QL_LOCATION_CINNABAR_LAB 46 #define QL_LOCATION_VICTORY_ROAD_1 47 #define QL_LOCATION_VICTORY_ROAD_2 48 #define QL_LOCATION_PKMN_LEAGUE 49 #define QL_LOCATION_CERULEAN_CAVE 50 #define QL_DEPARTED_TOWN_BUILDING 0 #define QL_DEPARTED_MUSEUM 1 #define QL_DEPARTED_GAME_CORNER 2 #define QL_DEPARTED_HOME 3 #define QL_DEPARTED_OAKS_LAB 4 #define QL_DEPARTED_GYM 5 #define QL_DEPARTED_SAFARI_ZONE 6 #define QL_DEPARTED_CAVE 7 #define QL_DEPARTED_MISC_BUILDING_1 8 #define QL_DEPARTED_MISC_BUILDING_2 9 #define QL_INPUT_OFF 0 #define QL_INPUT_UP 1 #define QL_INPUT_DOWN 2 #define QL_INPUT_LEFT 3 #define QL_INPUT_RIGHT 4 #define QL_INPUT_L 5 #define QL_INPUT_R 6 #define QL_INPUT_START 7 #define QL_INPUT_SELECT 8 #define QL_INPUT_A 9 #define QL_INPUT_B 10 #define QL_ACTION_MOVEMENT 0 #define QL_ACTION_GFX_CHANGE 1 #define QL_ACTION_INPUT 2 #define QL_ACTION_EMPTY 3 #define QL_ACTION_WAIT 254 #define QL_ACTION_SCENE_END 255 #endif //GUARD_CONSTANTS_QUEST_LOG_H ================================================ FILE: include/constants/region_map_sections.h ================================================ #ifndef GUARD_CONSTANTS_REGION_MAP_SECTIONS_H #define GUARD_CONSTANTS_REGION_MAP_SECTIONS_H #define MAPSEC_LITTLEROOT_TOWN 0x00 #define MAPSEC_OLDALE_TOWN 0x01 #define MAPSEC_DEWFORD_TOWN 0x02 #define MAPSEC_LAVARIDGE_TOWN 0x03 #define MAPSEC_FALLARBOR_TOWN 0x04 #define MAPSEC_VERDANTURF_TOWN 0x05 #define MAPSEC_PACIFIDLOG_TOWN 0x06 #define MAPSEC_PETALBURG_CITY 0x07 #define MAPSEC_SLATEPORT_CITY 0x08 #define MAPSEC_MAUVILLE_CITY 0x09 #define MAPSEC_RUSTBORO_CITY 0x0A #define MAPSEC_FORTREE_CITY 0x0B #define MAPSEC_LILYCOVE_CITY 0x0C #define MAPSEC_MOSSDEEP_CITY 0x0D #define MAPSEC_SOOTOPOLIS_CITY 0x0E #define MAPSEC_EVER_GRANDE_CITY 0x0F #define MAPSEC_ROUTE_101 0x10 #define MAPSEC_ROUTE_102 0x11 #define MAPSEC_ROUTE_103 0x12 #define MAPSEC_ROUTE_104 0x13 #define MAPSEC_ROUTE_105 0x14 #define MAPSEC_ROUTE_106 0x15 #define MAPSEC_ROUTE_107 0x16 #define MAPSEC_ROUTE_108 0x17 #define MAPSEC_ROUTE_109 0x18 #define MAPSEC_ROUTE_110 0x19 #define MAPSEC_ROUTE_111 0x1A #define MAPSEC_ROUTE_112 0x1B #define MAPSEC_ROUTE_113 0x1C #define MAPSEC_ROUTE_114 0x1D #define MAPSEC_ROUTE_115 0x1E #define MAPSEC_ROUTE_116 0x1F #define MAPSEC_ROUTE_117 0x20 #define MAPSEC_ROUTE_118 0x21 #define MAPSEC_ROUTE_119 0x22 #define MAPSEC_ROUTE_120 0x23 #define MAPSEC_ROUTE_121 0x24 #define MAPSEC_ROUTE_122 0x25 #define MAPSEC_ROUTE_123 0x26 #define MAPSEC_ROUTE_124 0x27 #define MAPSEC_ROUTE_125 0x28 #define MAPSEC_ROUTE_126 0x29 #define MAPSEC_ROUTE_127 0x2A #define MAPSEC_ROUTE_128 0x2B #define MAPSEC_ROUTE_129 0x2C #define MAPSEC_ROUTE_130 0x2D #define MAPSEC_ROUTE_131 0x2E #define MAPSEC_ROUTE_132 0x2F #define MAPSEC_ROUTE_133 0x30 #define MAPSEC_ROUTE_134 0x31 #define MAPSEC_UNDERWATER_124 0x32 #define MAPSEC_UNDERWATER_126 0x33 #define MAPSEC_UNDERWATER_127 0x34 #define MAPSEC_UNDERWATER_128 0x35 #define MAPSEC_UNDERWATER_SOOTOPOLIS 0x36 #define MAPSEC_GRANITE_CAVE 0x37 #define MAPSEC_MT_CHIMNEY 0x38 #define MAPSEC_SAFARI_ZONE 0x39 #define MAPSEC_BATTLE_FRONTIER 0x3A #define MAPSEC_PETALBURG_WOODS 0x3B #define MAPSEC_RUSTURF_TUNNEL 0x3C #define MAPSEC_ABANDONED_SHIP 0x3D #define MAPSEC_NEW_MAUVILLE 0x3E #define MAPSEC_METEOR_FALLS 0x3F #define MAPSEC_METEOR_FALLS2 0x40 #define MAPSEC_MT_PYRE 0x41 #define MAPSEC_AQUA_HIDEOUT_OLD 0x42 #define MAPSEC_SHOAL_CAVE 0x43 #define MAPSEC_SEAFLOOR_CAVERN 0x44 #define MAPSEC_UNDERWATER_SEAFLOOR_CAVERN 0x45 #define MAPSEC_VICTORY_ROAD 0x46 #define MAPSEC_MIRAGE_ISLAND 0x47 #define MAPSEC_CAVE_OF_ORIGIN 0x48 #define MAPSEC_SOUTHERN_ISLAND 0x49 #define MAPSEC_FIERY_PATH 0x4A #define MAPSEC_FIERY_PATH2 0x4B #define MAPSEC_JAGGED_PASS 0x4C #define MAPSEC_JAGGED_PASS2 0x4D #define MAPSEC_SEALED_CHAMBER 0x4E #define MAPSEC_UNDERWATER_SEALED_CHAMBER 0x4F #define MAPSEC_SCORCHED_SLAB 0x50 #define MAPSEC_ISLAND_CAVE 0x51 #define MAPSEC_DESERT_RUINS 0x52 #define MAPSEC_ANCIENT_TOMB 0x53 #define MAPSEC_INSIDE_OF_TRUCK 0x54 #define MAPSEC_SKY_PILLAR 0x55 #define MAPSEC_SECRET_BASE 0x56 #define MAPSEC_DYNAMIC 0x57 #define MAPSECS_KANTO 0x58 #define MAPSEC_PALLET_TOWN 0x58 #define MAPSEC_VIRIDIAN_CITY 0x59 #define MAPSEC_PEWTER_CITY 0x5A #define MAPSEC_CERULEAN_CITY 0x5B #define MAPSEC_LAVENDER_TOWN 0x5C #define MAPSEC_VERMILION_CITY 0x5D #define MAPSEC_CELADON_CITY 0x5E #define MAPSEC_FUCHSIA_CITY 0x5F #define MAPSEC_CINNABAR_ISLAND 0x60 #define MAPSEC_INDIGO_PLATEAU 0x61 #define MAPSEC_SAFFRON_CITY 0x62 #define MAPSEC_ROUTE_4_POKECENTER 0x63 #define MAPSEC_ROUTE_10_POKECENTER 0x64 #define MAPSEC_ROUTE_1 0x65 #define MAPSEC_ROUTE_2 0x66 #define MAPSEC_ROUTE_3 0x67 #define MAPSEC_ROUTE_4 0x68 #define MAPSEC_ROUTE_5 0x69 #define MAPSEC_ROUTE_6 0x6A #define MAPSEC_ROUTE_7 0x6B #define MAPSEC_ROUTE_8 0x6C #define MAPSEC_ROUTE_9 0x6D #define MAPSEC_ROUTE_10 0x6E #define MAPSEC_ROUTE_11 0x6F #define MAPSEC_ROUTE_12 0x70 #define MAPSEC_ROUTE_13 0x71 #define MAPSEC_ROUTE_14 0x72 #define MAPSEC_ROUTE_15 0x73 #define MAPSEC_ROUTE_16 0x74 #define MAPSEC_ROUTE_17 0x75 #define MAPSEC_ROUTE_18 0x76 #define MAPSEC_ROUTE_19 0x77 #define MAPSEC_ROUTE_20 0x78 #define MAPSEC_ROUTE_21 0x79 #define MAPSEC_ROUTE_22 0x7A #define MAPSEC_ROUTE_23 0x7B #define MAPSEC_ROUTE_24 0x7C #define MAPSEC_ROUTE_25 0x7D #define MAPSEC_VIRIDIAN_FOREST 0x7E #define MAPSEC_MT_MOON 0x7F #define MAPSEC_S_S_ANNE 0x80 #define MAPSEC_UNDERGROUND_PATH 0x81 #define MAPSEC_UNDERGROUND_PATH_2 0x82 #define MAPSEC_DIGLETTS_CAVE 0x83 #define MAPSEC_KANTO_VICTORY_ROAD 0x84 #define MAPSEC_ROCKET_HIDEOUT 0x85 #define MAPSEC_SILPH_CO 0x86 #define MAPSEC_POKEMON_MANSION 0x87 #define MAPSEC_KANTO_SAFARI_ZONE 0x88 #define MAPSEC_POKEMON_LEAGUE 0x89 #define MAPSEC_ROCK_TUNNEL 0x8A #define MAPSEC_SEAFOAM_ISLANDS 0x8B #define MAPSEC_POKEMON_TOWER 0x8C #define MAPSEC_CERULEAN_CAVE 0x8D #define MAPSEC_POWER_PLANT 0x8E #define MAPSECS_SEVII_123 0x8F #define MAPSEC_ONE_ISLAND 0x8F #define MAPSEC_TWO_ISLAND 0x90 #define MAPSEC_THREE_ISLAND 0x91 #define MAPSEC_FOUR_ISLAND 0x92 #define MAPSEC_FIVE_ISLAND 0x93 #define MAPSEC_SEVEN_ISLAND 0x94 #define MAPSEC_SIX_ISLAND 0x95 #define MAPSEC_KINDLE_ROAD 0x96 #define MAPSEC_TREASURE_BEACH 0x97 #define MAPSEC_CAPE_BRINK 0x98 #define MAPSEC_BOND_BRIDGE 0x99 #define MAPSEC_THREE_ISLE_PORT 0x9A #define MAPSEC_SEVII_ISLE_6 0x9B #define MAPSEC_SEVII_ISLE_7 0x9C #define MAPSEC_SEVII_ISLE_8 0x9D #define MAPSEC_SEVII_ISLE_9 0x9E #define MAPSEC_RESORT_GORGEOUS 0x9F #define MAPSEC_WATER_LABYRINTH 0xA0 #define MAPSEC_FIVE_ISLE_MEADOW 0xA1 #define MAPSEC_MEMORIAL_PILLAR 0xA2 #define MAPSEC_OUTCAST_ISLAND 0xA3 #define MAPSEC_GREEN_PATH 0xA4 #define MAPSEC_WATER_PATH 0xA5 #define MAPSEC_RUIN_VALLEY 0xA6 #define MAPSEC_TRAINER_TOWER 0xA7 #define MAPSEC_CANYON_ENTRANCE 0xA8 #define MAPSEC_SEVAULT_CANYON 0xA9 #define MAPSEC_TANOBY_RUINS 0xAA #define MAPSEC_SEVII_ISLE_22 0xAB #define MAPSEC_SEVII_ISLE_23 0xAC #define MAPSEC_SEVII_ISLE_24 0xAD #define MAPSEC_NAVEL_ROCK 0xAE #define MAPSEC_MT_EMBER 0xAF #define MAPSEC_BERRY_FOREST 0xB0 #define MAPSEC_ICEFALL_CAVE 0xB1 #define MAPSEC_ROCKET_WAREHOUSE 0xB2 #define MAPSEC_TRAINER_TOWER_2 0xB3 #define MAPSEC_DOTTED_HOLE 0xB4 #define MAPSEC_LOST_CAVE 0xB5 #define MAPSEC_PATTERN_BUSH 0xB6 #define MAPSEC_ALTERING_CAVE 0xB7 #define MAPSEC_TANOBY_CHAMBERS 0xB8 #define MAPSEC_THREE_ISLE_PATH 0xB9 #define MAPSEC_TANOBY_KEY 0xBA #define MAPSEC_BIRTH_ISLAND 0xBB #define MAPSEC_MONEAN_CHAMBER 0xBC #define MAPSEC_LIPTOO_CHAMBER 0xBD #define MAPSEC_WEEPTH_CHAMBER 0xBE #define MAPSEC_DILFORD_CHAMBER 0xBF #define MAPSEC_SCUFIB_CHAMBER 0xC0 #define MAPSEC_RIXY_CHAMBER 0xC1 #define MAPSEC_VIAPOIS_CHAMBER 0xC2 #define MAPSEC_EMBER_SPA 0xC3 #define MAPSEC_SPECIAL_AREA 0xC4 #define MAPSEC_AQUA_HIDEOUT 0xC5 #define MAPSEC_MAGMA_HIDEOUT 0xC6 #define MAPSEC_MIRAGE_TOWER 0xC7 #define MAPSEC_BIRTH_ISLAND_E 0xC8 #define MAPSEC_FARAWAY_ISLAND 0xC9 #define MAPSEC_ARTISAN_CAVE 0xCA #define MAPSEC_MARINE_CAVE 0xCB #define MAPSEC_UNDERWATER_MARINE_CAVE 0xCC #define MAPSEC_TERRA_CAVE 0xCD #define MAPSEC_UNDERWATER_105 0xCE #define MAPSEC_UNDERWATER_125 0xCF #define MAPSEC_UNDERWATER_129 0xD0 #define MAPSEC_DESERT_UNDERPASS 0xD1 #define MAPSEC_ALTERING_CAVE_E 0xD2 #define MAPSEC_NAVEL_ROCK_E 0xD3 #define MAPSEC_TRAINER_HILL 0xD4 #define MAPSEC_NONE 0xD5 #define MAPSEC_COUNT 0xD6 #define METLOC_SPECIAL_EGG 0xFD #define METLOC_IN_GAME_TRADE 0xFE #define METLOC_FATEFUL_ENCOUNTER 0xFF #endif //GUARD_CONSTANTS_REGION_MAP_SECTIONS_H ================================================ FILE: include/constants/rgb.h ================================================ #ifndef GUARD_RGB_H #define GUARD_RGB_H #define GET_R(color) ((color) & 0x1F) #define GET_G(color) (((color) >> 5) & 0x1F) #define GET_B(color) (((color) >> 10) & 0x1F) #define RGB(r, g, b) ((r) | ((g) << 5) | ((b) << 10)) #define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r)) #define _RGB(r, g, b) ((((b) & 0x1F) << 10) + (((g) & 0x1F) << 5) + ((r) & 0x1F)) #define RGB_ALPHA (1 << 15) #define IS_ALPHA(color) ((color) & RGB_ALPHA) #define RGB_BLACK RGB(0, 0, 0) #define RGB_WHITE RGB(31, 31, 31) #define RGB_RED RGB(31, 0, 0) #define RGB_GREEN RGB(0, 31, 0) #define RGB_BLUE RGB(0, 0, 31) #define RGB_YELLOW RGB(31, 31, 0) #define RGB_MAGENTA RGB(31, 0, 31) #define RGB_CYAN RGB(0, 31, 31) #define RGB_WHITEALPHA (RGB_WHITE | RGB_ALPHA) #endif // GUARD_RGB_H ================================================ FILE: include/constants/seagallop.h ================================================ #ifndef GUARD_CONSTANTS_SEAGALLOP_H #define GUARD_CONSTANTS_SEAGALLOP_H #define SEAGALLOP_VERMILION_CITY 0 #define SEAGALLOP_ONE_ISLAND 1 #define SEAGALLOP_TWO_ISLAND 2 #define SEAGALLOP_THREE_ISLAND 3 #define SEAGALLOP_FOUR_ISLAND 4 #define SEAGALLOP_FIVE_ISLAND 5 #define SEAGALLOP_SIX_ISLAND 6 #define SEAGALLOP_SEVEN_ISLAND 7 #define SEAGALLOP_CINNABAR_ISLAND 8 #define SEAGALLOP_NAVEL_ROCK 9 #define SEAGALLOP_BIRTH_ISLAND 10 #define SEAGALLOP_FARAWAY_ISLAND 11 #define SEAGALLOP_BATTLE_TOWER 12 #define SEAGALLOP_SOUTHERN_ISLAND 13 #define SEAGALLOP_MORE 254 #endif //GUARD_CONSTANTS_SEAGALLOP_H ================================================ FILE: include/constants/songs.h ================================================ #ifndef GUARD_CONSTANTS_SONGS_H #define GUARD_CONSTANTS_SONGS_H // Original JP names listed on right, along with any additional notes #define MUS_DUMMY 0 // MUS_DUMMY #define SE_USE_ITEM 1 // SE_KAIFUKU #define SE_PC_LOGIN 2 // SE_PC_LOGIN #define SE_PC_OFF 3 // SE_PC_OFF #define SE_PC_ON 4 // SE_PC_ON #define SE_SELECT 5 // SE_SELECT #define SE_WIN_OPEN 6 // SE_WIN_OPEN #define SE_WALL_HIT 7 // SE_WALL_HIT #define SE_RS_DOOR 8 // SE_DOOR #define SE_EXIT 9 // SE_KAIDAN #define SE_LEDGE 10 // SE_DANSA #define SE_BIKE_BELL 11 // SE_JITENSYA #define SE_NOT_EFFECTIVE 12 // SE_KOUKA_L #define SE_EFFECTIVE 13 // SE_KOUKA_M #define SE_SUPER_EFFECTIVE 14 // SE_KOUKA_H #define SE_BALL_OPEN 15 // SE_BOWA2 #define SE_FAINT 16 // SE_POKE_DEAD #define SE_FLEE 17 // SE_NIGERU #define SE_SLIDING_DOOR 18 // SE_JIDO_DOA #define SE_SHIP 19 // SE_NAMINORI #define SE_BANG 20 // SE_BAN #define SE_PIN 21 // SE_PIN (General "good", commonly for "!") #define SE_BOO 22 // SE_BOO (General "bad") #define SE_BALL 23 // SE_BOWA (Giving Poké Ball to nurse, Poké Ball shake, etc) #define SE_CONTEST_PLACE 24 // SE_JYUNI #define SE_A 25 // SE_A (Bard sounds) #define SE_I 26 // SE_I #define SE_U 27 // SE_U #define SE_E 28 // SE_E #define SE_O 29 // SE_O #define SE_N 30 // SE_N #define SE_SUCCESS 31 // SE_SEIKAI #define SE_FAILURE 32 // SE_HAZURE #define SE_EXP 33 // SE_EXP #define SE_BIKE_HOP 34 // SE_JITE_PYOKO #define SE_SWITCH 35 // SE_MU_PACHI #define SE_CLICK 36 // SE_TK_KASYA #define SE_FU_ZAKU 37 // SE_FU_ZAKU (Unknown purpose, unused) #define SE_CONTEST_CONDITION_LOSE 38 // SE_FU_ZAKU2 #define SE_LAVARIDGE_FALL_WARP 39 // SE_FU_ZUZUZU #define SE_ICE_STAIRS 40 // SE_RU_GASHIN #define SE_ICE_BREAK 41 // SE_RU_GASYAN #define SE_ICE_CRACK 42 // SE_RU_BARI #define SE_FALL 43 // SE_RU_HYUU #define SE_UNLOCK 44 // SE_KI_GASYAN #define SE_WARP_IN 45 // SE_TK_WARPIN #define SE_WARP_OUT 46 // SE_TK_WARPOUT #define SE_REPEL 47 // SE_TU_SAA #define SE_ROTATING_GATE 48 // SE_HI_TURUN #define SE_TRUCK_MOVE 49 // SE_TRACK_MOVE #define SE_TRUCK_STOP 50 // SE_TRACK_STOP #define SE_TRUCK_UNLOAD 51 // SE_TRACK_HAIKI #define SE_TRUCK_DOOR 52 // SE_TRACK_DOOR #define SE_BERRY_BLENDER 53 // SE_MOTER #define SE_CARD 54 // SE_CARD (Unused, different from the RS card SE) #define SE_SAVE 55 // SE_SAVE #define SE_BALL_BOUNCE_1 56 // SE_KON #define SE_BALL_BOUNCE_2 57 // SE_KON2 #define SE_BALL_BOUNCE_3 58 // SE_KON3 #define SE_BALL_BOUNCE_4 59 // SE_KON4 #define SE_BALL_TRADE 60 // SE_SUIKOMU #define SE_BALL_THROW 61 // SE_NAGERU #define SE_NOTE_C 62 // SE_TOY_C #define SE_NOTE_D 63 // SE_TOY_D #define SE_NOTE_E 64 // SE_TOY_E #define SE_NOTE_F 65 // SE_TOY_F #define SE_NOTE_G 66 // SE_TOY_G #define SE_NOTE_A 67 // SE_TOY_A #define SE_NOTE_B 68 // SE_TOY_B #define SE_NOTE_C_HIGH 69 // SE_TOY_C1 #define SE_PUDDLE 70 // SE_MIZU #define SE_BRIDGE_WALK 71 // SE_HASHI #define SE_ITEMFINDER 72 // SE_DAUGI #define SE_DING_DONG 73 // SE_PINPON #define SE_BALLOON_RED 74 // SE_FUUSEN1 #define SE_BALLOON_BLUE 75 // SE_FUUSEN2 #define SE_BALLOON_YELLOW 76 // SE_FUUSEN3 #define SE_BREAKABLE_DOOR 77 // SE_TOY_KABE #define SE_MUD_BALL 78 // SE_TOY_DANGO #define SE_FIELD_POISON 79 // SE_DOKU #define SE_ESCALATOR 80 // SE_ESUKA #define SE_THUNDERSTORM 81 // SE_T_AME #define SE_THUNDERSTORM_STOP 82 // SE_T_AME_E #define SE_DOWNPOUR 83 // SE_T_OOAME #define SE_DOWNPOUR_STOP 84 // SE_T_OOAME_E #define SE_RAIN 85 // SE_T_KOAME #define SE_RAIN_STOP 86 // SE_T_KOAME_E #define SE_THUNDER 87 // SE_T_KAMI #define SE_THUNDER2 88 // SE_T_KAMI2 #define SE_ELEVATOR 89 // SE_ELEBETA #define SE_LOW_HEALTH 90 // SE_HINSI #define SE_EXP_MAX 91 // SE_EXPMAX #define SE_ROULETTE_BALL 92 // SE_TAMAKORO #define SE_ROULETTE_BALL2 93 // SE_TAMAKORO_E #define SE_TAILLOW_WING_FLAP 94 // SE_BASABASA #define SE_RS_SHOP 95 // SE_REGI #define SE_CONTEST_HEART 96 // SE_C_GAJI #define SE_CONTEST_CURTAIN_RISE 97 // SE_C_MAKU_U #define SE_CONTEST_CURTAIN_FALL 98 // SE_C_MAKU_D #define SE_CONTEST_ICON_CHANGE 99 // SE_C_PASI #define SE_CONTEST_ICON_CLEAR 100 // SE_C_SYU #define SE_CONTEST_MONS_TURN 101 // SE_C_PIKON #define SE_SHINY 102 // SE_REAPOKE #define SE_INTRO_BLAST 103 // SE_OP_BASYU #define SE_MUGSHOT 104 // SE_BT_START #define SE_APPLAUSE 105 // SE_DENDOU #define SE_VEND 106 // SE_JIHANKI #define SE_ORB 107 // SE_TAMA #define SE_DEX_SCROLL 108 // SE_Z_SCROLL #define SE_DEX_PAGE 109 // SE_Z_PAGE #define SE_POKENAV_ON 110 // SE_PN_ON #define SE_POKENAV_OFF 111 // SE_PN_OFF #define SE_DEX_SEARCH 112 // SE_Z_SEARCH #define SE_EGG_HATCH 113 // SE_TAMAGO #define SE_BALL_TRAY_ENTER 114 // SE_TB_START #define SE_BALL_TRAY_BALL 115 // SE_TB_KON #define SE_BALL_TRAY_EXIT 116 // SE_TB_KARA #define SE_GLASS_FLUTE 117 // SE_BIDORO // Move SFX #define SE_M_THUNDERBOLT 118 // SE_W085 #define SE_M_THUNDERBOLT2 119 // SE_W085B #define SE_M_HARDEN 120 // SE_W231 #define SE_M_NIGHTMARE 121 // SE_W171 #define SE_M_VITAL_THROW 122 // SE_W233 #define SE_M_VITAL_THROW2 123 // SE_W233B #define SE_M_BUBBLE 124 // SE_W145 #define SE_M_BUBBLE2 125 // SE_W145B #define SE_M_BUBBLE3 126 // SE_W145C #define SE_M_RAIN_DANCE 127 // SE_W240 #define SE_M_CUT 128 // SE_W015 #define SE_M_STRING_SHOT 129 // SE_W081 #define SE_M_STRING_SHOT2 130 // SE_W081B #define SE_M_ROCK_THROW 131 // SE_W088 #define SE_M_GUST 132 // SE_W016 #define SE_M_GUST2 133 // SE_W016B #define SE_M_DOUBLE_SLAP 134 // SE_W003 #define SE_M_DOUBLE_TEAM 135 // SE_W104 #define SE_M_RAZOR_WIND 136 // SE_W013 #define SE_M_ICY_WIND 137 // SE_W196 #define SE_M_THUNDER_WAVE 138 // SE_W086 #define SE_M_COMET_PUNCH 139 // SE_W004 #define SE_M_MEGA_KICK 140 // SE_W025 #define SE_M_MEGA_KICK2 141 // SE_W025B #define SE_M_CRABHAMMER 142 // SE_W152 #define SE_M_JUMP_KICK 143 // SE_W026 #define SE_M_FLAME_WHEEL 144 // SE_W172 #define SE_M_FLAME_WHEEL2 145 // SE_W172B #define SE_M_FLAMETHROWER 146 // SE_W053 #define SE_M_FIRE_PUNCH 147 // SE_W007 #define SE_M_TOXIC 148 // SE_W092 #define SE_M_SACRED_FIRE 149 // SE_W221 #define SE_M_SACRED_FIRE2 150 // SE_W221B #define SE_M_EMBER 151 // SE_W052 #define SE_M_TAKE_DOWN 152 // SE_W036 #define SE_M_BLIZZARD 153 // SE_W059 #define SE_M_BLIZZARD2 154 // SE_W059B #define SE_M_SCRATCH 155 // SE_W010 #define SE_M_VICEGRIP 156 // SE_W011 #define SE_M_WING_ATTACK 157 // SE_W017 #define SE_M_FLY 158 // SE_W019 #define SE_M_SAND_ATTACK 159 // SE_W028 #define SE_M_RAZOR_WIND2 160 // SE_W013B #define SE_M_BITE 161 // SE_W044 #define SE_M_HEADBUTT 162 // SE_W029 #define SE_M_SURF 163 // SE_W057 #define SE_M_HYDRO_PUMP 164 // SE_W056 #define SE_M_WHIRLPOOL 165 // SE_W250 #define SE_M_HORN_ATTACK 166 // SE_W030 #define SE_M_TAIL_WHIP 167 // SE_W039 #define SE_M_MIST 168 // SE_W054 #define SE_M_POISON_POWDER 169 // SE_W077 #define SE_M_BIND 170 // SE_W020 #define SE_M_DRAGON_RAGE 171 // SE_W082 #define SE_M_SING 172 // SE_W047 #define SE_M_PERISH_SONG 173 // SE_W195 #define SE_M_PAY_DAY 174 // SE_W006 #define SE_M_DIG 175 // SE_W091 #define SE_M_DIZZY_PUNCH 176 // SE_W146 #define SE_M_SELF_DESTRUCT 177 // SE_W120 #define SE_M_EXPLOSION 178 // SE_W153 #define SE_M_ABSORB_2 179 // SE_W071B #define SE_M_ABSORB 180 // SE_W071 #define SE_M_SCREECH 181 // SE_W103 #define SE_M_BUBBLE_BEAM 182 // SE_W062 #define SE_M_BUBBLE_BEAM2 183 // SE_W062B #define SE_M_SUPERSONIC 184 // SE_W048 #define SE_M_BELLY_DRUM 185 // SE_W187 #define SE_M_METRONOME 186 // SE_W118 #define SE_M_BONEMERANG 187 // SE_W155 #define SE_M_LICK 188 // SE_W122 #define SE_M_PSYBEAM 189 // SE_W060 #define SE_M_FAINT_ATTACK 190 // SE_W185 #define SE_M_SWORDS_DANCE 191 // SE_W014 #define SE_M_LEER 192 // SE_W043 #define SE_M_SWAGGER 193 // SE_W207 #define SE_M_SWAGGER2 194 // SE_W207B #define SE_M_HEAL_BELL 195 // SE_W215 #define SE_M_CONFUSE_RAY 196 // SE_W109 #define SE_M_SNORE 197 // SE_W173 #define SE_M_BRICK_BREAK 198 // SE_W280 #define SE_M_GIGA_DRAIN 199 // SE_W202 #define SE_M_PSYBEAM2 200 // SE_W060B #define SE_M_SOLAR_BEAM 201 // SE_W076 #define SE_M_PETAL_DANCE 202 // SE_W080 #define SE_M_TELEPORT 203 // SE_W100 #define SE_M_MINIMIZE 204 // SE_W107 #define SE_M_SKETCH 205 // SE_W166 #define SE_M_SWIFT 206 // SE_W129 #define SE_M_REFLECT 207 // SE_W115 #define SE_M_BARRIER 208 // SE_W112 #define SE_M_DETECT 209 // SE_W197 #define SE_M_LOCK_ON 210 // SE_W199 #define SE_M_MOONLIGHT 211 // SE_W236 #define SE_M_CHARM 212 // SE_W204 #define SE_M_CHARGE 213 // SE_W268 #define SE_M_STRENGTH 214 // SE_W070 #define SE_M_HYPER_BEAM 215 // SE_W063 #define SE_M_WATERFALL 216 // SE_W127 #define SE_M_REVERSAL 217 // SE_W179 #define SE_M_ACID_ARMOR 218 // SE_W151 #define SE_M_SANDSTORM 219 // SE_W201 #define SE_M_TRI_ATTACK 220 // SE_W161 #define SE_M_TRI_ATTACK2 221 // SE_W161B #define SE_M_ENCORE 222 // SE_W227 #define SE_M_ENCORE2 223 // SE_W227B #define SE_M_BATON_PASS 224 // SE_W226 #define SE_M_MILK_DRINK 225 // SE_W208 #define SE_M_ATTRACT 226 // SE_W213 #define SE_M_ATTRACT2 227 // SE_W213B #define SE_M_MORNING_SUN 228 // SE_W234 #define SE_M_FLATTER 229 // SE_W260 #define SE_M_SAND_TOMB 230 // SE_W328 #define SE_M_GRASSWHISTLE 231 // SE_W320 #define SE_M_SPIT_UP 232 // SE_W255 #define SE_M_DIVE 233 // SE_W291 #define SE_M_EARTHQUAKE 234 // SE_W089 #define SE_M_TWISTER 235 // SE_W239 #define SE_M_SWEET_SCENT 236 // SE_W230 #define SE_M_YAWN 237 // SE_W281 #define SE_M_SKY_UPPERCUT 238 // SE_W327 #define SE_M_STAT_INCREASE 239 // SE_W287 #define SE_M_HEAT_WAVE 240 // SE_W257 #define SE_M_UPROAR 241 // SE_W253 #define SE_M_HAIL 242 // SE_W258 #define SE_M_COSMIC_POWER 243 // SE_W322 #define SE_M_TEETER_DANCE 244 // SE_W298 #define SE_M_STAT_DECREASE 245 // SE_W287B #define SE_M_HAZE 246 // SE_W114 #define SE_M_HYPER_BEAM2 247 // SE_W063B // FRLG SFX #define SE_DOOR 248 // SE_W_DOOR #define SE_CARD_FLIP 249 // SE_CARD1 #define SE_CARD_FLIPPING 250 // SE_CARD2 #define SE_CARD_OPEN 251 // SE_CARD3 #define SE_BAG_CURSOR 252 // SE_BAG1 #define SE_BAG_POCKET 253 // SE_BAG2 #define SE_BALL_CLICK 254 // SE_GETTING #define SE_SHOP 255 // SE_SHOP #define SE_SS_ANNE_HORN 256 // SE_KITEKI #define SE_HELP_OPEN 257 // SE_HELP_OP #define SE_HELP_CLOSE 258 // SE_HELP_CL #define SE_HELP_ERROR 259 // SE_HELP_NG #define SE_DEOXYS_MOVE 260 // SE_DEOMOV #define SE_POKE_JUMP_SUCCESS 261 // SE_EXCELLENT #define SE_POKE_JUMP_FAILURE 262 // SE_NAWAMISS // New Emerald SFX #define SE_POKENAV_CALL 263 // SE_TOREEYE #define SE_POKENAV_HANG_UP 264 // SE_TOREOFF #define SE_ARENA_TIMEUP1 265 // SE_HANTEI1 #define SE_ARENA_TIMEUP2 266 // SE_HANTEI2 #define SE_PIKE_CURTAIN_CLOSE 267 // SE_CURTAIN #define SE_PIKE_CURTAIN_OPEN 268 // SE_CURTAIN1 #define SE_SUDOWOODO_SHAKE 269 // SE_USSOKI // Music #define MUS_LITTLEROOT_TEST 350 // MUS_TETSUJI #define MUS_GSC_ROUTE38 351 // MUS_FIELD13 #define MUS_RS_CAUGHT 352 // MUS_KACHI22 #define MUS_RS_VICTORY_WILD 353 // MUS_KACHI2 #define MUS_RS_VICTORY_GYM_LEADER 354 // MUS_KACHI3 #define MUS_VICTORY_LEAGUE 355 // MUS_KACHI5 #define MUS_C_COMM_CENTER 356 // MUS_PCC #define MUS_GSC_PEWTER 357 // MUS_NIBI #define MUS_C_VS_LEGEND_BEAST 358 // MUS_SUIKUN #define MUS_ROUTE101 359 // MUS_DOORO1 #define MUS_ROUTE110 360 // MUS_DOORO_X1 #define MUS_ROUTE120 361 // MUS_DOORO_X3 #define MUS_PETALBURG 362 // MUS_MACHI_S2 #define MUS_OLDALE 363 // MUS_MACHI_S4 #define MUS_RS_GYM 364 // MUS_GIM #define MUS_RS_SURF 365 // MUS_NAMINORI #define MUS_PETALBURG_WOODS 366 // MUS_DAN01 #define MUS_LEVEL_UP 367 // MUS_FANFA1 #define MUS_RS_HEAL 368 // MUS_ME_ASA #define MUS_OBTAIN_BADGE 369 // MUS_ME_BACHI #define MUS_OBTAIN_ITEM 370 // MUS_FANFA4 #define MUS_EVOLVED 371 // MUS_FANFA5 #define MUS_OBTAIN_TMHM 372 // MUS_ME_WAZA #define MUS_LILYCOVE_MUSEUM 373 // MUS_BIJYUTU #define MUS_ROUTE122 374 // MUS_DOORO_X4 #define MUS_OCEANIC_MUSEUM 375 // MUS_FUNE_KAN #define MUS_EVOLUTION_INTRO 376 // MUS_ME_SHINKA #define MUS_EVOLUTION 377 // MUS_SHINKA #define MUS_MOVE_DELETED 378 // MUS_ME_WASURE #define MUS_RS_ENCOUNTER_GIRL 379 // MUS_SYOUJOEYE #define MUS_ENCOUNTER_MALE 380 // MUS_BOYEYE #define MUS_ABANDONED_SHIP 381 // MUS_DAN02 #define MUS_FORTREE 382 // MUS_MACHI_S3 #define MUS_BIRCH_LAB 383 // MUS_ODAMAKI #define MUS_B_TOWER_RS 384 // MUS_B_TOWER #define MUS_ENCOUNTER_SWIMMER 385 // MUS_SWIMEYE #define MUS_CAVE_OF_ORIGIN 386 // MUS_DAN03 #define MUS_OBTAIN_BERRY 387 // MUS_ME_KINOMI #define MUS_AWAKEN_LEGEND 388 // MUS_ME_TAMA #define MUS_SLOTS_JACKPOT 389 // MUS_ME_B_BIG #define MUS_SLOTS_WIN 390 // MUS_ME_B_SMALL #define MUS_TOO_BAD 391 // MUS_ME_ZANNEN #define MUS_ROULETTE 392 // MUS_BD_TIME #define MUS_LINK_CONTEST_P1 393 // MUS_TEST1 #define MUS_LINK_CONTEST_P2 394 // MUS_TEST2 #define MUS_LINK_CONTEST_P3 395 // MUS_TEST3 #define MUS_LINK_CONTEST_P4 396 // MUS_TEST4 #define MUS_ENCOUNTER_RICH 397 // MUS_TEST #define MUS_VERDANTURF 398 // MUS_GOMACHI0 #define MUS_RUSTBORO 399 // MUS_GOTOWN #define MUS_RS_POKE_CENTER 400 // MUS_POKECEN #define MUS_ROUTE104 401 // MUS_NEXTROAD #define MUS_ROUTE119 402 // MUS_GRANROAD #define MUS_RS_CYCLING 403 // MUS_CYCLING #define MUS_POKE_MART 404 // MUS_FRIENDLY #define MUS_LITTLEROOT 405 // MUS_MISHIRO #define MUS_MT_CHIMNEY 406 // MUS_TOZAN #define MUS_ENCOUNTER_FEMALE 407 // MUS_GIRLEYE #define MUS_LILYCOVE 408 // MUS_MINAMO #define MUS_ROUTE111 409 // MUS_ASHROAD #define MUS_HELP 410 // MUS_EVENT0 #define MUS_UNDERWATER 411 // MUS_DEEPDEEP #define MUS_RS_VICTORY_TRAINER 412 // MUS_KACHI1 #define MUS_RS_TITLE 413 // MUS_TITLE3 #define MUS_INTRO 414 // MUS_DEMO1 #define MUS_ENCOUNTER_MAY 415 // MUS_GIRL_SUP #define MUS_ENCOUNTER_INTENSE 416 // MUS_HAGESHII #define MUS_ENCOUNTER_COOL 417 // MUS_KAKKOII #define MUS_ROUTE113 418 // MUS_KAZANBAI #define MUS_ENCOUNTER_AQUA 419 // MUS_AQA_0 #define MUS_RS_FOLLOW_ME 420 // MUS_TSURETEK #define MUS_ENCOUNTER_BRENDAN 421 // MUS_BOY_SUP #define MUS_EVER_GRANDE 422 // MUS_RAINBOW #define MUS_ENCOUNTER_SUSPICIOUS 423 // MUS_AYASII #define MUS_VICTORY_AQUA_MAGMA 424 // MUS_KACHI4 #define MUS_CABLE_CAR 425 // MUS_ROPEWAY #define MUS_RS_GAME_CORNER 426 // MUS_CASINO #define MUS_DEWFORD 427 // MUS_HIGHTOWN #define MUS_SAFARI_ZONE 428 // MUS_SAFARI #define MUS_RS_VICTORY_ROAD 429 // MUS_C_ROAD #define MUS_AQUA_MAGMA_HIDEOUT 430 // MUS_AJITO #define MUS_SAILING 431 // MUS_M_BOAT #define MUS_MT_PYRE 432 // MUS_M_DUNGON #define MUS_SLATEPORT 433 // MUS_FINECITY #define MUS_MT_PYRE_EXTERIOR 434 // MUS_MACHUPI #define MUS_SCHOOL 435 // MUS_P_SCHOOL #define MUS_RS_HALL_OF_FAME 436 // MUS_DENDOU #define MUS_FALLARBOR 437 // MUS_TONEKUSA #define MUS_SEALED_CHAMBER 438 // MUS_MABOROSI #define MUS_CONTEST_WINNER 439 // MUS_CON_FAN #define MUS_CONTEST 440 // MUS_CONTEST0 #define MUS_ENCOUNTER_MAGMA 441 // MUS_MGM0 #define MUS_INTRO_BATTLE 442 // MUS_T_BATTLE #define MUS_ABNORMAL_WEATHER 443 // MUS_OOAME (Replaces MUS_WEATHER_KYOGRE from R/S) #define MUS_WEATHER_GROUDON 444 // MUS_HIDERI (Unused, from R/S) #define MUS_SOOTOPOLIS 445 // MUS_RUNECITY #define MUS_CONTEST_RESULTS 446 // MUS_CON_K #define MUS_HALL_OF_FAME_ROOM 447 // MUS_EIKOU_R #define MUS_TRICK_HOUSE 448 // MUS_KARAKURI #define MUS_ENCOUNTER_TWINS 449 // MUS_HUTAGO #define MUS_ENCOUNTER_ELITE_FOUR 450 // MUS_SITENNOU #define MUS_ENCOUNTER_HIKER 451 // MUS_YAMA_EYE #define MUS_CONTEST_LOBBY 452 // MUS_CONLOBBY #define MUS_ENCOUNTER_INTERVIEWER 453 // MUS_INTER_V #define MUS_ENCOUNTER_CHAMPION 454 // MUS_DAIGO #define MUS_RS_CREDITS 455 // MUS_THANKFOR #define MUS_END 456 // MUS_END #define MUS_B_FRONTIER 457 // MUS_B_FRONTIER #define MUS_B_ARENA 458 // MUS_B_ARENA #define MUS_OBTAIN_B_POINTS 459 // MUS_ME_POINTGET #define MUS_REGISTER_MATCH_CALL 460 // MUS_ME_TORE_EYE #define MUS_B_PYRAMID 461 // MUS_PYRAMID #define MUS_B_PYRAMID_TOP 462 // MUS_PYRAMID_TOP #define MUS_B_PALACE 463 // MUS_B_PALACE #define MUS_RAYQUAZA_APPEARS 464 // MUS_REKKUU_KOURIN #define MUS_B_TOWER 465 // MUS_SATTOWER #define MUS_OBTAIN_SYMBOL 466 // MUS_ME_SYMBOLGET #define MUS_B_DOME 467 // MUS_B_DOME #define MUS_B_PIKE 468 // MUS_B_TUBE #define MUS_B_FACTORY 469 // MUS_B_FACTORY #define MUS_VS_RAYQUAZA 470 // MUS_VS_REKKU (Identical to MUS_VS_KYOGRE_GROUDON) #define MUS_VS_FRONTIER_BRAIN 471 // MUS_VS_FRONT #define MUS_VS_MEW 472 // MUS_VS_MEW #define MUS_B_DOME_LOBBY 473 // MUS_B_DOME1 #define MUS_RS_VS_WILD 474 // MUS_BATTLE27 #define MUS_VS_AQUA_MAGMA 475 // MUS_BATTLE31 #define MUS_RS_VS_TRAINER 476 // MUS_BATTLE20 #define MUS_RS_VS_GYM_LEADER 477 // MUS_BATTLE32 #define MUS_RS_VS_CHAMPION 478 // MUS_BATTLE33 #define MUS_VS_REGI 479 // MUS_BATTLE36 #define MUS_VS_KYOGRE_GROUDON 480 // MUS_BATTLE34 #define MUS_VS_RIVAL 481 // MUS_BATTLE35 #define MUS_VS_ELITE_FOUR 482 // MUS_BATTLE38 #define MUS_VS_AQUA_MAGMA_LEADER 483 // MUS_BATTLE30 // FRLG Music #define MUS_FOLLOW_ME 484 // MUS_ANNAI #define MUS_GAME_CORNER 485 // MUS_SLOT #define MUS_ROCKET_HIDEOUT 486 // MUS_AJITO #define MUS_GYM 487 // MUS_GYM #define MUS_JIGGLYPUFF 488 // MUS_PURIN #define MUS_INTRO_FIGHT 489 // MUS_DEMO #define MUS_TITLE 490 // MUS_TITLE #define MUS_CINNABAR 491 // MUS_GUREN #define MUS_LAVENDER 492 // MUS_SHION #define MUS_HEAL 493 // MUS_KAIHUKU #define MUS_CYCLING 494 // MUS_CYCLING #define MUS_ENCOUNTER_ROCKET 495 // MUS_ROCKET #define MUS_ENCOUNTER_GIRL 496 // MUS_SHOUJO #define MUS_ENCOUNTER_BOY 497 // MUS_SHOUNEN #define MUS_HALL_OF_FAME 498 // MUS_DENDOU #define MUS_VIRIDIAN_FOREST 499 // MUS_T_MORI #define MUS_MT_MOON 500 // MUS_OTSUKIMI #define MUS_POKE_MANSION 501 // MUS_POKEYASHI #define MUS_CREDITS 502 // MUS_ENDING #define MUS_ROUTE1 503 // MUS_LOAD01 #define MUS_ROUTE24 504 // MUS_OPENING #define MUS_ROUTE3 505 // MUS_LOAD02 #define MUS_ROUTE11 506 // MUS_LOAD03 #define MUS_VICTORY_ROAD 507 // MUS_CHAMP_R #define MUS_VS_GYM_LEADER 508 // MUS_VS_GYM #define MUS_VS_TRAINER 509 // MUS_VS_TORE #define MUS_VS_WILD 510 // MUS_VS_YASEI #define MUS_VS_CHAMPION 511 // MUS_VS_LAST #define MUS_PALLET 512 // MUS_MASARA #define MUS_OAK_LAB 513 // MUS_KENKYU #define MUS_OAK 514 // MUS_OHKIDO #define MUS_POKE_CENTER 515 // MUS_POKECEN #define MUS_SS_ANNE 516 // MUS_SANTOAN #define MUS_SURF 517 // MUS_NAMINORI #define MUS_POKE_TOWER 518 // MUS_P_TOWER #define MUS_SILPH 519 // MUS_SHIRUHU #define MUS_FUCHSIA 520 // MUS_HANADA #define MUS_CELADON 521 // MUS_TAMAMUSI #define MUS_VICTORY_TRAINER 522 // MUS_WIN_TRE (Identical to MUS_VICTORY_TRAINER) #define MUS_VICTORY_WILD 523 // MUS_WIN_YASEI (Identical to MUS_VICTORY_WILD) #define MUS_VICTORY_GYM_LEADER 524 // MUS_WIN_GYM (Identical to MUS_VICTORY_GYM_LEADER) #define MUS_VERMILLION 525 // MUS_KUCHIBA #define MUS_PEWTER 526 // MUS_NIBI #define MUS_ENCOUNTER_RIVAL 527 // MUS_RIVAL1 #define MUS_RIVAL_EXIT 528 // MUS_RIVAL2 #define MUS_DEX_RATING 529 // MUS_FAN2 #define MUS_OBTAIN_KEY_ITEM 530 // MUS_FAN5 #define MUS_CAUGHT_INTRO 531 // MUS_FAN6 #define MUS_PHOTO 532 // MUS_ME_PHOTO #define MUS_GAME_FREAK 533 // MUS_TITLEROG #define MUS_CAUGHT 534 // MUS_GET_YASEI #define MUS_NEW_GAME_INSTRUCT 535 // MUS_SOUSA #define MUS_NEW_GAME_INTRO 536 // MUS_SEKAIKAN #define MUS_NEW_GAME_EXIT 537 // MUS_SEIBETU #define MUS_POKE_JUMP 538 // MUS_JUMP #define MUS_UNION_ROOM 539 // MUS_UNION #define MUS_NET_CENTER 540 // MUS_NETWORK #define MUS_MYSTERY_GIFT 541 // MUS_OKURIMONO #define MUS_BERRY_PICK 542 // MUS_KINOMIKUI #define MUS_SEVII_CAVE 543 // MUS_NANADUNGEON (Identical to MUS_MT_MOON) #define MUS_TEACHY_TV_SHOW 544 // MUS_OSHIE_TV (Identical to MUS_FOLLOW_ME) #define MUS_SEVII_ROUTE 545 // MUS_NANASHIMA #define MUS_SEVII_DUNGEON 546 // MUS_NANAISEKI (Identical to MUS_VIRIDIAN_FOREST) #define MUS_SEVII_123 547 // MUS_NANA123 (Identical to MUS_PEWTER) #define MUS_SEVII_45 548 // MUS_NANA45 #define MUS_SEVII_67 549 // MUS_NANA67 #define MUS_POKE_FLUTE 550 // MUS_POKEFUE #define MUS_VS_DEOXYS 551 // MUS_VS_DEO #define MUS_VS_MEWTWO 552 // MUS_VS_MYU2 #define MUS_VS_LEGEND 553 // MUS_VS_DEN #define MUS_ENCOUNTER_GYM_LEADER 554 // MUS_EXEYE #define MUS_ENCOUNTER_DEOXYS 555 // MUS_DEOEYE #define MUS_TRAINER_TOWER 556 // MUS_T_TOWER #define MUS_SLOW_PALLET 557 // MUS_SLOWMASARA #define MUS_TEACHY_TV_MENU 558 // MUS_TVNOIZE #define PH_TRAP_BLEND 559 #define PH_TRAP_HELD 560 #define PH_TRAP_SOLO 561 #define PH_FACE_BLEND 562 #define PH_FACE_HELD 563 #define PH_FACE_SOLO 564 #define PH_CLOTH_BLEND 565 #define PH_CLOTH_HELD 566 #define PH_CLOTH_SOLO 567 #define PH_DRESS_BLEND 568 #define PH_DRESS_HELD 569 #define PH_DRESS_SOLO 570 #define PH_FLEECE_BLEND 571 #define PH_FLEECE_HELD 572 #define PH_FLEECE_SOLO 573 #define PH_KIT_BLEND 574 #define PH_KIT_HELD 575 #define PH_KIT_SOLO 576 #define PH_PRICE_BLEND 577 #define PH_PRICE_HELD 578 #define PH_PRICE_SOLO 579 #define PH_LOT_BLEND 580 #define PH_LOT_HELD 581 #define PH_LOT_SOLO 582 #define PH_GOAT_BLEND 583 #define PH_GOAT_HELD 584 #define PH_GOAT_SOLO 585 #define PH_THOUGHT_BLEND 586 #define PH_THOUGHT_HELD 587 #define PH_THOUGHT_SOLO 588 #define PH_CHOICE_BLEND 589 #define PH_CHOICE_HELD 590 #define PH_CHOICE_SOLO 591 #define PH_MOUTH_BLEND 592 #define PH_MOUTH_HELD 593 #define PH_MOUTH_SOLO 594 #define PH_FOOT_BLEND 595 #define PH_FOOT_HELD 596 #define PH_FOOT_SOLO 597 #define PH_GOOSE_BLEND 598 #define PH_GOOSE_HELD 599 #define PH_GOOSE_SOLO 600 #define PH_STRUT_BLEND 601 #define PH_STRUT_HELD 602 #define PH_STRUT_SOLO 603 #define PH_CURE_BLEND 604 #define PH_CURE_HELD 605 #define PH_CURE_SOLO 606 #define PH_NURSE_BLEND 607 #define PH_NURSE_HELD 608 #define PH_NURSE_SOLO 609 #define MUS_ROUTE118 0x7FFF // Map is split into 2 music sections. controlled by GetCurrLocationDefaultMusic(). #define MUS_NONE 0xFFFF #define MUS_NONE 0xFFFF #endif // GUARD_CONSTANTS_SONGS_H ================================================ FILE: include/constants/sound.h ================================================ #ifndef GUARD_CONSTANTS_SOUND_H #define GUARD_CONSTANTS_SOUND_H #define FANFARE_LEVEL_UP 0 #define FANFARE_OBTAIN_ITEM 1 #define FANFARE_EVOLVED 2 #define FANFARE_OBTAIN_TMHM 3 #define FANFARE_HEAL 4 #define FANFARE_OBTAIN_BADGE 5 #define FANFARE_MOVE_DELETED 6 #define FANFARE_OBTAIN_BERRY 7 #define FANFARE_SLOTS_JACKPOT 8 #define FANFARE_SLOTS_WIN 9 #define FANFARE_TOO_BAD 10 #define FANFARE_POKE_FLUTE 11 #define FANFARE_KEY_ITEM 12 #define FANFARE_DEX_EVAL 13 #define CRY_MODE_NORMAL 0 // Default #define CRY_MODE_DOUBLES 1 // Shortened cry for double battles #define CRY_MODE_ENCOUNTER 2 // Used when starting a static encounter, or when a Pokémon is "aggressive" #define CRY_MODE_HIGH_PITCH 3 // Highest pitch mode, used exclusively by the move Howl #define CRY_MODE_ECHO_START 4 // For 1st half of cry used by the move Hyper Voice. Played in reverse #define CRY_MODE_FAINT 5 // Used when a Pokémon faints #define CRY_MODE_ECHO_END 6 // For 2nd half of cry used by the move Hyper Voice #define CRY_MODE_ROAR_1 7 // For 1st cry used by the move Roar #define CRY_MODE_ROAR_2 8 // For 2nd cry used by the move Roar #define CRY_MODE_GROWL_1 9 // For 1st cry used by the move Growl. Played in reverse #define CRY_MODE_GROWL_2 10 // For 2nd cry used by the move Growl #define CRY_MODE_WEAK 11 // Used when a Pokémon is unhealthy #define CRY_MODE_WEAK_DOUBLES 12 // Equivalent to CRY_MODE_DOUBLES for CRY_MODE_WEAK // Given to SoundTask_PlayDoubleCry to determine which cry mode to use. Values are arbitrary #define DOUBLE_CRY_ROAR 2 #define DOUBLE_CRY_GROWL 255 #define CRY_PRIORITY_NORMAL 10 #define CRY_PRIORITY_AMBIENT 1 // Cry volume was changed from 125 in R/S to 120 for FRLG/Em, but was (accidentally?) not updated outside of sound.c #define CRY_VOLUME 120 #define CRY_VOLUME_RS 125 #endif //GUARD_CONSTANTS_SOUND_H ================================================ FILE: include/constants/species.h ================================================ #ifndef GUARD_CONSTANTS_SPECIES_H #define GUARD_CONSTANTS_SPECIES_H #define SPECIES_NONE 0 #define SPECIES_BULBASAUR 1 #define SPECIES_IVYSAUR 2 #define SPECIES_VENUSAUR 3 #define SPECIES_CHARMANDER 4 #define SPECIES_CHARMELEON 5 #define SPECIES_CHARIZARD 6 #define SPECIES_SQUIRTLE 7 #define SPECIES_WARTORTLE 8 #define SPECIES_BLASTOISE 9 #define SPECIES_CATERPIE 10 #define SPECIES_METAPOD 11 #define SPECIES_BUTTERFREE 12 #define SPECIES_WEEDLE 13 #define SPECIES_KAKUNA 14 #define SPECIES_BEEDRILL 15 #define SPECIES_PIDGEY 16 #define SPECIES_PIDGEOTTO 17 #define SPECIES_PIDGEOT 18 #define SPECIES_RATTATA 19 #define SPECIES_RATICATE 20 #define SPECIES_SPEAROW 21 #define SPECIES_FEAROW 22 #define SPECIES_EKANS 23 #define SPECIES_ARBOK 24 #define SPECIES_PIKACHU 25 #define SPECIES_RAICHU 26 #define SPECIES_SANDSHREW 27 #define SPECIES_SANDSLASH 28 #define SPECIES_NIDORAN_F 29 #define SPECIES_NIDORINA 30 #define SPECIES_NIDOQUEEN 31 #define SPECIES_NIDORAN_M 32 #define SPECIES_NIDORINO 33 #define SPECIES_NIDOKING 34 #define SPECIES_CLEFAIRY 35 #define SPECIES_CLEFABLE 36 #define SPECIES_VULPIX 37 #define SPECIES_NINETALES 38 #define SPECIES_JIGGLYPUFF 39 #define SPECIES_WIGGLYTUFF 40 #define SPECIES_ZUBAT 41 #define SPECIES_GOLBAT 42 #define SPECIES_ODDISH 43 #define SPECIES_GLOOM 44 #define SPECIES_VILEPLUME 45 #define SPECIES_PARAS 46 #define SPECIES_PARASECT 47 #define SPECIES_VENONAT 48 #define SPECIES_VENOMOTH 49 #define SPECIES_DIGLETT 50 #define SPECIES_DUGTRIO 51 #define SPECIES_MEOWTH 52 #define SPECIES_PERSIAN 53 #define SPECIES_PSYDUCK 54 #define SPECIES_GOLDUCK 55 #define SPECIES_MANKEY 56 #define SPECIES_PRIMEAPE 57 #define SPECIES_GROWLITHE 58 #define SPECIES_ARCANINE 59 #define SPECIES_POLIWAG 60 #define SPECIES_POLIWHIRL 61 #define SPECIES_POLIWRATH 62 #define SPECIES_ABRA 63 #define SPECIES_KADABRA 64 #define SPECIES_ALAKAZAM 65 #define SPECIES_MACHOP 66 #define SPECIES_MACHOKE 67 #define SPECIES_MACHAMP 68 #define SPECIES_BELLSPROUT 69 #define SPECIES_WEEPINBELL 70 #define SPECIES_VICTREEBEL 71 #define SPECIES_TENTACOOL 72 #define SPECIES_TENTACRUEL 73 #define SPECIES_GEODUDE 74 #define SPECIES_GRAVELER 75 #define SPECIES_GOLEM 76 #define SPECIES_PONYTA 77 #define SPECIES_RAPIDASH 78 #define SPECIES_SLOWPOKE 79 #define SPECIES_SLOWBRO 80 #define SPECIES_MAGNEMITE 81 #define SPECIES_MAGNETON 82 #define SPECIES_FARFETCHD 83 #define SPECIES_DODUO 84 #define SPECIES_DODRIO 85 #define SPECIES_SEEL 86 #define SPECIES_DEWGONG 87 #define SPECIES_GRIMER 88 #define SPECIES_MUK 89 #define SPECIES_SHELLDER 90 #define SPECIES_CLOYSTER 91 #define SPECIES_GASTLY 92 #define SPECIES_HAUNTER 93 #define SPECIES_GENGAR 94 #define SPECIES_ONIX 95 #define SPECIES_DROWZEE 96 #define SPECIES_HYPNO 97 #define SPECIES_KRABBY 98 #define SPECIES_KINGLER 99 #define SPECIES_VOLTORB 100 #define SPECIES_ELECTRODE 101 #define SPECIES_EXEGGCUTE 102 #define SPECIES_EXEGGUTOR 103 #define SPECIES_CUBONE 104 #define SPECIES_MAROWAK 105 #define SPECIES_HITMONLEE 106 #define SPECIES_HITMONCHAN 107 #define SPECIES_LICKITUNG 108 #define SPECIES_KOFFING 109 #define SPECIES_WEEZING 110 #define SPECIES_RHYHORN 111 #define SPECIES_RHYDON 112 #define SPECIES_CHANSEY 113 #define SPECIES_TANGELA 114 #define SPECIES_KANGASKHAN 115 #define SPECIES_HORSEA 116 #define SPECIES_SEADRA 117 #define SPECIES_GOLDEEN 118 #define SPECIES_SEAKING 119 #define SPECIES_STARYU 120 #define SPECIES_STARMIE 121 #define SPECIES_MR_MIME 122 #define SPECIES_SCYTHER 123 #define SPECIES_JYNX 124 #define SPECIES_ELECTABUZZ 125 #define SPECIES_MAGMAR 126 #define SPECIES_PINSIR 127 #define SPECIES_TAUROS 128 #define SPECIES_MAGIKARP 129 #define SPECIES_GYARADOS 130 #define SPECIES_LAPRAS 131 #define SPECIES_DITTO 132 #define SPECIES_EEVEE 133 #define SPECIES_VAPOREON 134 #define SPECIES_JOLTEON 135 #define SPECIES_FLAREON 136 #define SPECIES_PORYGON 137 #define SPECIES_OMANYTE 138 #define SPECIES_OMASTAR 139 #define SPECIES_KABUTO 140 #define SPECIES_KABUTOPS 141 #define SPECIES_AERODACTYL 142 #define SPECIES_SNORLAX 143 #define SPECIES_ARTICUNO 144 #define SPECIES_ZAPDOS 145 #define SPECIES_MOLTRES 146 #define SPECIES_DRATINI 147 #define SPECIES_DRAGONAIR 148 #define SPECIES_DRAGONITE 149 #define SPECIES_MEWTWO 150 #define SPECIES_MEW 151 #define KANTO_SPECIES_END SPECIES_MEW #define SPECIES_CHIKORITA 152 #define SPECIES_BAYLEEF 153 #define SPECIES_MEGANIUM 154 #define SPECIES_CYNDAQUIL 155 #define SPECIES_QUILAVA 156 #define SPECIES_TYPHLOSION 157 #define SPECIES_TOTODILE 158 #define SPECIES_CROCONAW 159 #define SPECIES_FERALIGATR 160 #define SPECIES_SENTRET 161 #define SPECIES_FURRET 162 #define SPECIES_HOOTHOOT 163 #define SPECIES_NOCTOWL 164 #define SPECIES_LEDYBA 165 #define SPECIES_LEDIAN 166 #define SPECIES_SPINARAK 167 #define SPECIES_ARIADOS 168 #define SPECIES_CROBAT 169 #define SPECIES_CHINCHOU 170 #define SPECIES_LANTURN 171 #define SPECIES_PICHU 172 #define SPECIES_CLEFFA 173 #define SPECIES_IGGLYBUFF 174 #define SPECIES_TOGEPI 175 #define SPECIES_TOGETIC 176 #define SPECIES_NATU 177 #define SPECIES_XATU 178 #define SPECIES_MAREEP 179 #define SPECIES_FLAAFFY 180 #define SPECIES_AMPHAROS 181 #define SPECIES_BELLOSSOM 182 #define SPECIES_MARILL 183 #define SPECIES_AZUMARILL 184 #define SPECIES_SUDOWOODO 185 #define SPECIES_POLITOED 186 #define SPECIES_HOPPIP 187 #define SPECIES_SKIPLOOM 188 #define SPECIES_JUMPLUFF 189 #define SPECIES_AIPOM 190 #define SPECIES_SUNKERN 191 #define SPECIES_SUNFLORA 192 #define SPECIES_YANMA 193 #define SPECIES_WOOPER 194 #define SPECIES_QUAGSIRE 195 #define SPECIES_ESPEON 196 #define SPECIES_UMBREON 197 #define SPECIES_MURKROW 198 #define SPECIES_SLOWKING 199 #define SPECIES_MISDREAVUS 200 #define SPECIES_UNOWN 201 #define SPECIES_WOBBUFFET 202 #define SPECIES_GIRAFARIG 203 #define SPECIES_PINECO 204 #define SPECIES_FORRETRESS 205 #define SPECIES_DUNSPARCE 206 #define SPECIES_GLIGAR 207 #define SPECIES_STEELIX 208 #define SPECIES_SNUBBULL 209 #define SPECIES_GRANBULL 210 #define SPECIES_QWILFISH 211 #define SPECIES_SCIZOR 212 #define SPECIES_SHUCKLE 213 #define SPECIES_HERACROSS 214 #define SPECIES_SNEASEL 215 #define SPECIES_TEDDIURSA 216 #define SPECIES_URSARING 217 #define SPECIES_SLUGMA 218 #define SPECIES_MAGCARGO 219 #define SPECIES_SWINUB 220 #define SPECIES_PILOSWINE 221 #define SPECIES_CORSOLA 222 #define SPECIES_REMORAID 223 #define SPECIES_OCTILLERY 224 #define SPECIES_DELIBIRD 225 #define SPECIES_MANTINE 226 #define SPECIES_SKARMORY 227 #define SPECIES_HOUNDOUR 228 #define SPECIES_HOUNDOOM 229 #define SPECIES_KINGDRA 230 #define SPECIES_PHANPY 231 #define SPECIES_DONPHAN 232 #define SPECIES_PORYGON2 233 #define SPECIES_STANTLER 234 #define SPECIES_SMEARGLE 235 #define SPECIES_TYROGUE 236 #define SPECIES_HITMONTOP 237 #define SPECIES_SMOOCHUM 238 #define SPECIES_ELEKID 239 #define SPECIES_MAGBY 240 #define SPECIES_MILTANK 241 #define SPECIES_BLISSEY 242 #define SPECIES_RAIKOU 243 #define SPECIES_ENTEI 244 #define SPECIES_SUICUNE 245 #define SPECIES_LARVITAR 246 #define SPECIES_PUPITAR 247 #define SPECIES_TYRANITAR 248 #define SPECIES_LUGIA 249 #define SPECIES_HO_OH 250 #define SPECIES_CELEBI 251 #define SPECIES_OLD_UNOWN_B 252 #define SPECIES_OLD_UNOWN_C 253 #define SPECIES_OLD_UNOWN_D 254 #define SPECIES_OLD_UNOWN_E 255 #define SPECIES_OLD_UNOWN_F 256 #define SPECIES_OLD_UNOWN_G 257 #define SPECIES_OLD_UNOWN_H 258 #define SPECIES_OLD_UNOWN_I 259 #define SPECIES_OLD_UNOWN_J 260 #define SPECIES_OLD_UNOWN_K 261 #define SPECIES_OLD_UNOWN_L 262 #define SPECIES_OLD_UNOWN_M 263 #define SPECIES_OLD_UNOWN_N 264 #define SPECIES_OLD_UNOWN_O 265 #define SPECIES_OLD_UNOWN_P 266 #define SPECIES_OLD_UNOWN_Q 267 #define SPECIES_OLD_UNOWN_R 268 #define SPECIES_OLD_UNOWN_S 269 #define SPECIES_OLD_UNOWN_T 270 #define SPECIES_OLD_UNOWN_U 271 #define SPECIES_OLD_UNOWN_V 272 #define SPECIES_OLD_UNOWN_W 273 #define SPECIES_OLD_UNOWN_X 274 #define SPECIES_OLD_UNOWN_Y 275 #define SPECIES_OLD_UNOWN_Z 276 #define SPECIES_TREECKO 277 #define SPECIES_GROVYLE 278 #define SPECIES_SCEPTILE 279 #define SPECIES_TORCHIC 280 #define SPECIES_COMBUSKEN 281 #define SPECIES_BLAZIKEN 282 #define SPECIES_MUDKIP 283 #define SPECIES_MARSHTOMP 284 #define SPECIES_SWAMPERT 285 #define SPECIES_POOCHYENA 286 #define SPECIES_MIGHTYENA 287 #define SPECIES_ZIGZAGOON 288 #define SPECIES_LINOONE 289 #define SPECIES_WURMPLE 290 #define SPECIES_SILCOON 291 #define SPECIES_BEAUTIFLY 292 #define SPECIES_CASCOON 293 #define SPECIES_DUSTOX 294 #define SPECIES_LOTAD 295 #define SPECIES_LOMBRE 296 #define SPECIES_LUDICOLO 297 #define SPECIES_SEEDOT 298 #define SPECIES_NUZLEAF 299 #define SPECIES_SHIFTRY 300 #define SPECIES_NINCADA 301 #define SPECIES_NINJASK 302 #define SPECIES_SHEDINJA 303 #define SPECIES_TAILLOW 304 #define SPECIES_SWELLOW 305 #define SPECIES_SHROOMISH 306 #define SPECIES_BRELOOM 307 #define SPECIES_SPINDA 308 #define SPECIES_WINGULL 309 #define SPECIES_PELIPPER 310 #define SPECIES_SURSKIT 311 #define SPECIES_MASQUERAIN 312 #define SPECIES_WAILMER 313 #define SPECIES_WAILORD 314 #define SPECIES_SKITTY 315 #define SPECIES_DELCATTY 316 #define SPECIES_KECLEON 317 #define SPECIES_BALTOY 318 #define SPECIES_CLAYDOL 319 #define SPECIES_NOSEPASS 320 #define SPECIES_TORKOAL 321 #define SPECIES_SABLEYE 322 #define SPECIES_BARBOACH 323 #define SPECIES_WHISCASH 324 #define SPECIES_LUVDISC 325 #define SPECIES_CORPHISH 326 #define SPECIES_CRAWDAUNT 327 #define SPECIES_FEEBAS 328 #define SPECIES_MILOTIC 329 #define SPECIES_CARVANHA 330 #define SPECIES_SHARPEDO 331 #define SPECIES_TRAPINCH 332 #define SPECIES_VIBRAVA 333 #define SPECIES_FLYGON 334 #define SPECIES_MAKUHITA 335 #define SPECIES_HARIYAMA 336 #define SPECIES_ELECTRIKE 337 #define SPECIES_MANECTRIC 338 #define SPECIES_NUMEL 339 #define SPECIES_CAMERUPT 340 #define SPECIES_SPHEAL 341 #define SPECIES_SEALEO 342 #define SPECIES_WALREIN 343 #define SPECIES_CACNEA 344 #define SPECIES_CACTURNE 345 #define SPECIES_SNORUNT 346 #define SPECIES_GLALIE 347 #define SPECIES_LUNATONE 348 #define SPECIES_SOLROCK 349 #define SPECIES_AZURILL 350 #define SPECIES_SPOINK 351 #define SPECIES_GRUMPIG 352 #define SPECIES_PLUSLE 353 #define SPECIES_MINUN 354 #define SPECIES_MAWILE 355 #define SPECIES_MEDITITE 356 #define SPECIES_MEDICHAM 357 #define SPECIES_SWABLU 358 #define SPECIES_ALTARIA 359 #define SPECIES_WYNAUT 360 #define SPECIES_DUSKULL 361 #define SPECIES_DUSCLOPS 362 #define SPECIES_ROSELIA 363 #define SPECIES_SLAKOTH 364 #define SPECIES_VIGOROTH 365 #define SPECIES_SLAKING 366 #define SPECIES_GULPIN 367 #define SPECIES_SWALOT 368 #define SPECIES_TROPIUS 369 #define SPECIES_WHISMUR 370 #define SPECIES_LOUDRED 371 #define SPECIES_EXPLOUD 372 #define SPECIES_CLAMPERL 373 #define SPECIES_HUNTAIL 374 #define SPECIES_GOREBYSS 375 #define SPECIES_ABSOL 376 #define SPECIES_SHUPPET 377 #define SPECIES_BANETTE 378 #define SPECIES_SEVIPER 379 #define SPECIES_ZANGOOSE 380 #define SPECIES_RELICANTH 381 #define SPECIES_ARON 382 #define SPECIES_LAIRON 383 #define SPECIES_AGGRON 384 #define SPECIES_CASTFORM 385 #define SPECIES_VOLBEAT 386 #define SPECIES_ILLUMISE 387 #define SPECIES_LILEEP 388 #define SPECIES_CRADILY 389 #define SPECIES_ANORITH 390 #define SPECIES_ARMALDO 391 #define SPECIES_RALTS 392 #define SPECIES_KIRLIA 393 #define SPECIES_GARDEVOIR 394 #define SPECIES_BAGON 395 #define SPECIES_SHELGON 396 #define SPECIES_SALAMENCE 397 #define SPECIES_BELDUM 398 #define SPECIES_METANG 399 #define SPECIES_METAGROSS 400 #define SPECIES_REGIROCK 401 #define SPECIES_REGICE 402 #define SPECIES_REGISTEEL 403 #define SPECIES_KYOGRE 404 #define SPECIES_GROUDON 405 #define SPECIES_RAYQUAZA 406 #define SPECIES_LATIAS 407 #define SPECIES_LATIOS 408 #define SPECIES_JIRACHI 409 #define SPECIES_DEOXYS 410 #define SPECIES_CHIMECHO 411 #define SPECIES_EGG 412 #define NUM_SPECIES SPECIES_EGG #define SPECIES_UNOWN_B (NUM_SPECIES + 1) #define SPECIES_UNOWN_C (NUM_SPECIES + 2) #define SPECIES_UNOWN_D (NUM_SPECIES + 3) #define SPECIES_UNOWN_E (NUM_SPECIES + 4) #define SPECIES_UNOWN_F (NUM_SPECIES + 5) #define SPECIES_UNOWN_G (NUM_SPECIES + 6) #define SPECIES_UNOWN_H (NUM_SPECIES + 7) #define SPECIES_UNOWN_I (NUM_SPECIES + 8) #define SPECIES_UNOWN_J (NUM_SPECIES + 9) #define SPECIES_UNOWN_K (NUM_SPECIES + 10) #define SPECIES_UNOWN_L (NUM_SPECIES + 11) #define SPECIES_UNOWN_M (NUM_SPECIES + 12) #define SPECIES_UNOWN_N (NUM_SPECIES + 13) #define SPECIES_UNOWN_O (NUM_SPECIES + 14) #define SPECIES_UNOWN_P (NUM_SPECIES + 15) #define SPECIES_UNOWN_Q (NUM_SPECIES + 16) #define SPECIES_UNOWN_R (NUM_SPECIES + 17) #define SPECIES_UNOWN_S (NUM_SPECIES + 18) #define SPECIES_UNOWN_T (NUM_SPECIES + 19) #define SPECIES_UNOWN_U (NUM_SPECIES + 20) #define SPECIES_UNOWN_V (NUM_SPECIES + 21) #define SPECIES_UNOWN_W (NUM_SPECIES + 22) #define SPECIES_UNOWN_X (NUM_SPECIES + 23) #define SPECIES_UNOWN_Y (NUM_SPECIES + 24) #define SPECIES_UNOWN_Z (NUM_SPECIES + 25) #define SPECIES_UNOWN_EMARK (NUM_SPECIES + 26) #define SPECIES_UNOWN_QMARK (NUM_SPECIES + 27) #endif // GUARD_CONSTANTS_SPECIES_H ================================================ FILE: include/constants/trade.h ================================================ #ifndef GUARD_CONSTANTS_TRADE_H #define GUARD_CONSTANTS_TRADE_H // TODO: document trade.c and trade_scene.c with corresponding macros // and examine if these are correct #define TRADE_PLAYER 0 #define TRADE_PARTNER 1 #define LINK_TRADE_TIMEOUT 300 // In-game Trade IDs #define INGAME_TRADE_MR_MIME 0 #define INGAME_TRADE_JYNX 1 #define INGAME_TRADE_NIDORAN_F_FR 2 // M or F depending on version #define INGAME_TRADE_FARFETCHD 3 #define INGAME_TRADE_NIDORINA_FR 4 // Nidorino or Nidorina depending on version #define INGAME_TRADE_LICKITUNG 5 #define INGAME_TRADE_ELECTRODE 6 #define INGAME_TRADE_TANGELA 7 #define INGAME_TRADE_SEEL 8 #define INGAME_TRADE_NIDORAN_M_LG 9 #define INGAME_TRADE_NIDORINO_LG 10 // Return values for CanTradeSelectedMon and CanSpinTradeMon #define CAN_TRADE_MON 0 #define CANT_TRADE_LAST_MON 1 #define CANT_TRADE_NATIONAL 2 #define CANT_TRADE_EGG_YET 3 #define CANT_TRADE_INVALID_MON 4 #define CANT_TRADE_PARTNER_EGG_YET 5 // Return values for CheckValidityOfTradeMons #define PLAYER_MON_INVALID 0 #define BOTH_MONS_VALID 1 #define PARTNER_MON_INVALID 2 // Return values for GetGameProgressForLinkTrade #define TRADE_BOTH_PLAYERS_READY 0 #define TRADE_PLAYER_NOT_READY 1 #define TRADE_PARTNER_NOT_READY 2 // Message indexes for sUnionRoomTradeMessages #define UR_TRADE_MSG_NONE 0 #define UR_TRADE_MSG_NOT_MON_PARTNER_WANTS 1 #define UR_TRADE_MSG_NOT_EGG 2 #define UR_TRADE_MSG_MON_CANT_BE_TRADED_1 3 #define UR_TRADE_MSG_MON_CANT_BE_TRADED_2 4 #define UR_TRADE_MSG_PARTNERS_MON_CANT_BE_TRADED 5 #define UR_TRADE_MSG_EGG_CANT_BE_TRADED 6 #define UR_TRADE_MSG_PARTNER_CANT_ACCEPT_MON 7 #define UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_1 8 #define UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2 9 // Return values for CanRegisterMonForTradingBoard #define CAN_REGISTER_MON 0 #define CANT_REGISTER_MON 1 #define CANT_REGISTER_EGG 2 #endif // GUARD_CONSTANTS_TRADE_H ================================================ FILE: include/constants/trainer_card.h ================================================ #ifndef GUARD_CONSTANTS_TRAINER_CARD_H #define GUARD_CONSTANTS_TRAINER_CARD_H #define TRAINER_CARD_PROFILE_LENGTH 4 #define TRAINER_CARD_STICKER_TYPES 3 #define CARD_TYPE_FRLG 0 #define CARD_TYPE_RSE 1 #define CARD_TYPE_EMERALD 2 #define MON_ICON_TINT_NORMAL 0 #define MON_ICON_TINT_BLACK 1 #define MON_ICON_TINT_PINK 2 #define MON_ICON_TINT_SEPIA 3 #define NUM_LINK_TRAINER_CARD_CLASSES 8 #endif // GUARD_CONSTANTS_TRAINER_CARD_H ================================================ FILE: include/constants/trainer_fan_club.h ================================================ #ifndef GUARD_CONSTANTS_TRAINER_FAN_CLUB_H #define GUARD_CONSTANTS_TRAINER_FAN_CLUB_H #define FANCLUB_MEMBER1 0 #define FANCLUB_MEMBER2 1 #define FANCLUB_MEMBER3 2 #define FANCLUB_MEMBER4 3 #define FANCLUB_MEMBER5 4 #define FANCLUB_MEMBER6 5 #define FANCLUB_MEMBER7 6 #define FANCLUB_MEMBER8 7 #define NUM_TRAINER_FAN_CLUB_MEMBERS 8 #endif //GUARD_CONSTANTS_TRAINER_FAN_CLUB_H ================================================ FILE: include/constants/trainer_tower.h ================================================ #ifndef GUARD_CONSTANTS_TRAINER_TOWER_H #define GUARD_CONSTANTS_TRAINER_TOWER_H #define CHALLENGE_TYPE_SINGLE 0 #define CHALLENGE_TYPE_DOUBLE 1 #define CHALLENGE_TYPE_KNOCKOUT 2 #define CHALLENGE_TYPE_MIXED 3 // Mixed challenges use one of the above 3 for each floor #define CHALLENGE_STATUS_LOST 0 #define CHALLENGE_STATUS_UNK 1 // Never set, possibly e-Card related #define CHALLENGE_STATUS_NORMAL 2 // Not started or ongoing #define TTPRIZE_HP_UP 0 #define TTPRIZE_PROTEIN 1 #define TTPRIZE_IRON 2 #define TTPRIZE_CARBOS 3 #define TTPRIZE_CALCIUM 4 #define TTPRIZE_ZINC 5 #define TTPRIZE_BRIGHT_POWDER 6 #define TTPRIZE_WHITE_HERB 7 #define TTPRIZE_MENTAL_HERB 8 #define TTPRIZE_CHOICE_BAND 9 #define TTPRIZE_KINGS_ROCK 10 #define TTPRIZE_SCOPE_LENS 11 #define TTPRIZE_METAL_COAT 12 #define TTPRIZE_DRAGON_SCALE 13 #define TTPRIZE_UP_GRADE 14 #define MAX_TRAINER_TOWER_FLOORS 8 #define MAX_TRAINERS_PER_FLOOR 3 #define TRAINER_TOWER_FUNC_INIT_FLOOR 0 #define TRAINER_TOWER_FUNC_GET_SPEECH 1 #define TRAINER_TOWER_FUNC_DO_BATTLE 2 #define TRAINER_TOWER_FUNC_GET_CHALLENGE_TYPE 3 #define TRAINER_TOWER_FUNC_CLEARED_FLOOR 4 #define TRAINER_TOWER_FUNC_GET_FLOOR_CLEARED 5 #define TRAINER_TOWER_FUNC_START_CHALLENGE 6 #define TRAINER_TOWER_FUNC_GET_OWNER_STATE 7 #define TRAINER_TOWER_FUNC_GIVE_PRIZE 8 #define TRAINER_TOWER_FUNC_CHECK_FINAL_TIME 9 #define TRAINER_TOWER_FUNC_RESUME_TIMER 10 #define TRAINER_TOWER_FUNC_SET_LOST 11 #define TRAINER_TOWER_FUNC_GET_CHALLENGE_STATUS 12 #define TRAINER_TOWER_FUNC_GET_TIME 13 #define TRAINER_TOWER_FUNC_SHOW_RESULTS 14 #define TRAINER_TOWER_FUNC_CLOSE_RESULTS 15 #define TRAINER_TOWER_FUNC_CHECK_DOUBLES 16 #define TRAINER_TOWER_FUNC_GET_NUM_FLOORS 17 #define TRAINER_TOWER_FUNC_SHOULD_WARP_TO_COUNTER 18 #define TRAINER_TOWER_FUNC_ENCOUNTER_MUSIC 19 #define TRAINER_TOWER_FUNC_GET_BEAT_CHALLENGE 20 #define TRAINER_TOWER_TEXT_INTRO 2 #define TRAINER_TOWER_TEXT_PLAYER_LOST 3 #define TRAINER_TOWER_TEXT_PLAYER_WON 4 #define TRAINER_TOWER_TEXT_AFTER 5 #define TRAINER_TOWER_MAX_TIME 215999 // 60 * 60 * 60 - 1 #endif //GUARD_CONSTANTS_TRAINER_TOWER_H ================================================ FILE: include/constants/trainer_types.h ================================================ #ifndef GUARD_CONSTANTS_TRAINER_TYPES_H #define GUARD_CONSTANTS_TRAINER_TYPES_H #define TRAINER_TYPE_NONE 0 #define TRAINER_TYPE_NORMAL 1 #define TRAINER_TYPE_SEE_ALL_DIRECTIONS 2 #define TRAINER_TYPE_BURIED 3 #endif // GUARD_CONSTANTS_TRAINER_TYPES_H ================================================ FILE: include/constants/trainers.h ================================================ #ifndef GUARD_CONSTANTS_TRAINERS_H #define GUARD_CONSTANTS_TRAINERS_H #include "constants/opponents.h" #include "constants/master_opponents.h" #define TRAINER_ENCOUNTER_MUSIC_MALE 0 // standard male encounter music #define TRAINER_ENCOUNTER_MUSIC_FEMALE 1 // standard female encounter music #define TRAINER_ENCOUNTER_MUSIC_GIRL 2 // used for male Tubers and Young Couples too #define TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS 3 #define TRAINER_ENCOUNTER_MUSIC_INTENSE 4 #define TRAINER_ENCOUNTER_MUSIC_COOL 5 #define TRAINER_ENCOUNTER_MUSIC_AQUA 6 #define TRAINER_ENCOUNTER_MUSIC_MAGMA 7 #define TRAINER_ENCOUNTER_MUSIC_SWIMMER 8 #define TRAINER_ENCOUNTER_MUSIC_TWINS 9 // used for other trainer classes too #define TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR 10 #define TRAINER_ENCOUNTER_MUSIC_HIKER 11 // used for other trainer classes too #define TRAINER_ENCOUNTER_MUSIC_INTERVIEWER 12 #define TRAINER_ENCOUNTER_MUSIC_RICH 13 // Rich Boys and Gentlemen #define TRAINER_PIC_AQUA_LEADER_ARCHIE 0 #define TRAINER_PIC_AQUA_GRUNT_M 1 #define TRAINER_PIC_AQUA_GRUNT_F 2 #define TRAINER_PIC_RS_AROMA_LADY 3 #define TRAINER_PIC_RS_RUIN_MANIAC 4 #define TRAINER_PIC_INTERVIEWER 5 #define TRAINER_PIC_RS_TUBER_F 6 #define TRAINER_PIC_RS_TUBER_M 7 #define TRAINER_PIC_RS_COOLTRAINER_M 8 #define TRAINER_PIC_RS_COOLTRAINER_F 9 #define TRAINER_PIC_HEX_MANIAC 10 #define TRAINER_PIC_RS_LADY 11 #define TRAINER_PIC_RS_BEAUTY 12 #define TRAINER_PIC_RICH_BOY 13 #define TRAINER_PIC_RS_POKEMANIAC 14 #define TRAINER_PIC_RS_SWIMMER_M 15 #define TRAINER_PIC_RS_BLACK_BELT 16 #define TRAINER_PIC_GUITARIST 17 #define TRAINER_PIC_KINDLER 18 #define TRAINER_PIC_RS_CAMPER 19 #define TRAINER_PIC_BUG_MANIAC 20 #define TRAINER_PIC_RS_PSYCHIC_M 21 #define TRAINER_PIC_RS_PSYCHIC_F 22 #define TRAINER_PIC_RS_GENTLEMAN 23 #define TRAINER_PIC_ELITE_FOUR_SIDNEY 24 #define TRAINER_PIC_ELITE_FOUR_PHOEBE 25 #define TRAINER_PIC_LEADER_ROXANNE 26 #define TRAINER_PIC_LEADER_BRAWLY 27 #define TRAINER_PIC_LEADER_TATE_AND_LIZA 28 #define TRAINER_PIC_SCHOOL_KID_M 29 #define TRAINER_PIC_SCHOOL_KID_F 30 #define TRAINER_PIC_SR_AND_JR 31 #define TRAINER_PIC_POKEFAN_M 32 #define TRAINER_PIC_POKEFAN_F 33 #define TRAINER_PIC_EXPERT_M 34 #define TRAINER_PIC_EXPERT_F 35 #define TRAINER_PIC_RS_YOUNGSTER 36 #define TRAINER_PIC_CHAMPION_STEVEN 37 #define TRAINER_PIC_RS_FISHERMAN 38 #define TRAINER_PIC_CYCLING_TRIATHLETE_M 39 #define TRAINER_PIC_CYCLING_TRIATHLETE_F 40 #define TRAINER_PIC_RUNNING_TRIATHLETE_M 41 #define TRAINER_PIC_RUNNING_TRIATHLETE_F 42 #define TRAINER_PIC_SWIMMING_TRIATHLETE_M 43 #define TRAINER_PIC_SWIMMING_TRIATHLETE_F 44 #define TRAINER_PIC_DRAGON_TAMER 45 #define TRAINER_PIC_RS_BIRD_KEEPER 46 #define TRAINER_PIC_NINJA_BOY 47 #define TRAINER_PIC_BATTLE_GIRL 48 #define TRAINER_PIC_PARASOL_LADY 49 #define TRAINER_PIC_RS_SWIMMER_F 50 #define TRAINER_PIC_RS_PICNICKER 51 #define TRAINER_PIC_RS_TWINS 52 #define TRAINER_PIC_RS_SAILOR 53 #define TRAINER_PIC_COLLECTOR 54 #define TRAINER_PIC_WALLY 55 #define TRAINER_PIC_RS_BRENDAN_1 56 #define TRAINER_PIC_RS_MAY_1 57 #define TRAINER_PIC_RS_POKEMON_BREEDER_M 58 #define TRAINER_PIC_RS_POKEMON_BREEDER_F 59 #define TRAINER_PIC_RS_POKEMON_RANGER_M 60 #define TRAINER_PIC_RS_POKEMON_RANGER_F 61 #define TRAINER_PIC_MAGMA_LEADER_MAXIE 62 #define TRAINER_PIC_MAGMA_GRUNT_M 63 #define TRAINER_PIC_MAGMA_GRUNT_F 64 #define TRAINER_PIC_RS_LASS 65 #define TRAINER_PIC_RS_BUG_CATCHER 66 #define TRAINER_PIC_RS_HIKER 67 #define TRAINER_PIC_RS_YOUNG_COUPLE 68 #define TRAINER_PIC_OLD_COUPLE 69 #define TRAINER_PIC_RS_SIS_AND_BRO 70 #define TRAINER_PIC_AQUA_ADMIN_M 71 #define TRAINER_PIC_AQUA_ADMIN_F 72 #define TRAINER_PIC_MAGMA_ADMIN_M 73 #define TRAINER_PIC_MAGMA_ADMIN_F 74 #define TRAINER_PIC_LEADER_WATTSON 75 #define TRAINER_PIC_LEADER_FLANNERY 76 #define TRAINER_PIC_LEADER_NORMAN 77 #define TRAINER_PIC_LEADER_WINONA 78 #define TRAINER_PIC_LEADER_WALLACE 79 #define TRAINER_PIC_ELITE_FOUR_GLACIA 80 #define TRAINER_PIC_ELITE_FOUR_DRAKE 81 #define TRAINER_PIC_YOUNGSTER 82 #define TRAINER_PIC_BUG_CATCHER 83 #define TRAINER_PIC_LASS 84 #define TRAINER_PIC_SAILOR 85 #define TRAINER_PIC_CAMPER 86 #define TRAINER_PIC_PICNICKER 87 #define TRAINER_PIC_POKEMANIAC 88 #define TRAINER_PIC_SUPER_NERD 89 #define TRAINER_PIC_HIKER 90 #define TRAINER_PIC_BIKER 91 #define TRAINER_PIC_BURGLAR 92 #define TRAINER_PIC_ENGINEER 93 #define TRAINER_PIC_FISHERMAN 94 #define TRAINER_PIC_SWIMMER_M 95 #define TRAINER_PIC_CUE_BALL 96 #define TRAINER_PIC_GAMER 97 #define TRAINER_PIC_BEAUTY 98 #define TRAINER_PIC_SWIMMER_F 99 #define TRAINER_PIC_PSYCHIC_M 100 #define TRAINER_PIC_ROCKER 101 #define TRAINER_PIC_JUGGLER 102 #define TRAINER_PIC_TAMER 103 #define TRAINER_PIC_BIRD_KEEPER 104 #define TRAINER_PIC_BLACK_BELT 105 #define TRAINER_PIC_RIVAL_EARLY 106 #define TRAINER_PIC_SCIENTIST 107 #define TRAINER_PIC_LEADER_GIOVANNI 108 #define TRAINER_PIC_ROCKET_GRUNT_M 109 #define TRAINER_PIC_COOLTRAINER_M 110 #define TRAINER_PIC_COOLTRAINER_F 111 #define TRAINER_PIC_ELITE_FOUR_LORELEI 112 #define TRAINER_PIC_ELITE_FOUR_BRUNO 113 #define TRAINER_PIC_ELITE_FOUR_AGATHA 114 #define TRAINER_PIC_ELITE_FOUR_LANCE 115 #define TRAINER_PIC_LEADER_BROCK 116 #define TRAINER_PIC_LEADER_MISTY 117 #define TRAINER_PIC_LEADER_LT_SURGE 118 #define TRAINER_PIC_LEADER_ERIKA 119 #define TRAINER_PIC_LEADER_KOGA 120 #define TRAINER_PIC_LEADER_BLAINE 121 #define TRAINER_PIC_LEADER_SABRINA 122 #define TRAINER_PIC_GENTLEMAN 123 #define TRAINER_PIC_RIVAL_LATE 124 #define TRAINER_PIC_CHAMPION_RIVAL 125 #define TRAINER_PIC_CHANNELER 126 #define TRAINER_PIC_TWINS 127 #define TRAINER_PIC_COOL_COUPLE 128 #define TRAINER_PIC_YOUNG_COUPLE 129 #define TRAINER_PIC_CRUSH_KIN 130 #define TRAINER_PIC_SIS_AND_BRO 131 #define TRAINER_PIC_PROFESSOR_OAK 132 #define TRAINER_PIC_RS_BRENDAN_2 133 #define TRAINER_PIC_RS_MAY_2 134 #define TRAINER_PIC_RED 135 #define TRAINER_PIC_LEAF 136 #define TRAINER_PIC_ROCKET_GRUNT_F 137 #define TRAINER_PIC_PSYCHIC_F 138 #define TRAINER_PIC_CRUSH_GIRL 139 #define TRAINER_PIC_TUBER_F 140 #define TRAINER_PIC_POKEMON_BREEDER 141 #define TRAINER_PIC_POKEMON_RANGER_M 142 #define TRAINER_PIC_POKEMON_RANGER_F 143 #define TRAINER_PIC_AROMA_LADY 144 #define TRAINER_PIC_RUIN_MANIAC 145 #define TRAINER_PIC_LADY 146 #define TRAINER_PIC_PAINTER 147 #define TRAINER_PIC_EM_BRENDAN 148 #define TRAINER_PIC_EM_MAY 149 #define TRAINER_PIC_MASTER_BEAUTY 150 #define TRAINER_PIC_MASTER_BIRD_KEEPER 151 #define TRAINER_PIC_MASTER_BLACK_BELT 152 #define TRAINER_PIC_MASTER_BUG_CATCHER 153 #define TRAINER_PIC_MASTER_COOLTRAINER_M 154 #define TRAINER_PIC_MASTER_HIKER 155 #define TRAINER_PIC_MASTER_LASS 156 #define TRAINER_PIC_MASTER_PSYCHIC_M 157 #define TRAINER_PIC_MASTER_SCIENTIST 158 #define TRAINER_PIC_MASTER_YOUNGSTER 159 #define TRAINER_PIC_MASTER_SWIMMER 160 // The player back pics are assumed to alternate according to the gender values (MALE/FEMALE) #define TRAINER_BACK_PIC_RED 0 #define TRAINER_BACK_PIC_LEAF 1 #define TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN 2 #define TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY 3 #define TRAINER_BACK_PIC_POKEDUDE 4 #define TRAINER_BACK_PIC_OLD_MAN 5 #define TRAINER_BACK_PIC_EMERALD_BRENDAN 6 #define TRAINER_BACK_PIC_EMERALD_MAY 7 // Special Trainer Ids. #define TRAINER_UNION_ROOM 0xC00 #define TRAINER_LINK_OPPONENT 0x800 #define TRAINER_SECRET_BASE 0x400 #define TRAINER_CLASS_NONE 0 #define TRAINER_CLASS_PKMN_TRAINER_UNUSED 1 #define TRAINER_CLASS_AQUA_LEADER 2 #define TRAINER_CLASS_TEAM_AQUA 3 #define TRAINER_CLASS_RS_AROMA_LADY 4 #define TRAINER_CLASS_RS_RUIN_MANIAC 5 #define TRAINER_CLASS_INTERVIEWER 6 #define TRAINER_CLASS_RS_TUBER_F 7 #define TRAINER_CLASS_RS_TUBER_M 8 #define TRAINER_CLASS_RS_COOLTRAINER 9 #define TRAINER_CLASS_HEX_MANIAC 10 #define TRAINER_CLASS_RS_LADY 11 #define TRAINER_CLASS_RS_BEAUTY 12 #define TRAINER_CLASS_RICH_BOY 13 #define TRAINER_CLASS_RS_POKEMANIAC 14 #define TRAINER_CLASS_RS_SWIMMER_M 15 #define TRAINER_CLASS_RS_BLACK_BELT 16 #define TRAINER_CLASS_GUITARIST 17 #define TRAINER_CLASS_KINDLER 18 #define TRAINER_CLASS_RS_CAMPER 19 #define TRAINER_CLASS_BUG_MANIAC 20 #define TRAINER_CLASS_RS_PSYCHIC 21 #define TRAINER_CLASS_RS_GENTLEMAN 22 #define TRAINER_CLASS_RS_ELITE_FOUR 23 #define TRAINER_CLASS_RS_LEADER 24 #define TRAINER_CLASS_SCHOOL_KID 25 #define TRAINER_CLASS_SR_AND_JR 26 #define TRAINER_CLASS_POKEFAN 27 #define TRAINER_CLASS_EXPERT 28 #define TRAINER_CLASS_RS_YOUNGSTER 29 #define TRAINER_CLASS_RS_CHAMPION 30 #define TRAINER_CLASS_RS_FISHERMAN 31 #define TRAINER_CLASS_TRIATHLETE 32 #define TRAINER_CLASS_DRAGON_TAMER 33 #define TRAINER_CLASS_RS_BIRD_KEEPER 34 #define TRAINER_CLASS_NINJA_BOY 35 #define TRAINER_CLASS_BATTLE_GIRL 36 #define TRAINER_CLASS_PARASOL_LADY 37 #define TRAINER_CLASS_RS_SWIMMER_F 38 #define TRAINER_CLASS_RS_PICNICKER 39 #define TRAINER_CLASS_RS_TWINS 40 #define TRAINER_CLASS_RS_SAILOR 41 #define TRAINER_CLASS_BOARDER 42 #define TRAINER_CLASS_COLLECTOR 43 #define TRAINER_CLASS_PKMN_TRAINER 44 #define TRAINER_CLASS_RS_PKMN_BREEDER 45 #define TRAINER_CLASS_RS_PKMN_RANGER 46 #define TRAINER_CLASS_MAGMA_LEADER 47 #define TRAINER_CLASS_TEAM_MAGMA 48 #define TRAINER_CLASS_RS_LASS 49 #define TRAINER_CLASS_RS_BUG_CATCHER 50 #define TRAINER_CLASS_RS_HIKER 51 #define TRAINER_CLASS_RS_YOUNG_COUPLE 52 #define TRAINER_CLASS_OLD_COUPLE 53 #define TRAINER_CLASS_RS_SIS_AND_BRO 54 #define TRAINER_CLASS_AQUA_ADMIN 55 #define TRAINER_CLASS_MAGMA_ADMIN 56 #define TRAINER_CLASS_YOUNGSTER 57 #define TRAINER_CLASS_BUG_CATCHER 58 #define TRAINER_CLASS_LASS 59 #define TRAINER_CLASS_SAILOR 60 #define TRAINER_CLASS_CAMPER 61 #define TRAINER_CLASS_PICNICKER 62 #define TRAINER_CLASS_POKEMANIAC 63 #define TRAINER_CLASS_SUPER_NERD 64 #define TRAINER_CLASS_HIKER 65 #define TRAINER_CLASS_BIKER 66 #define TRAINER_CLASS_BURGLAR 67 #define TRAINER_CLASS_ENGINEER 68 #define TRAINER_CLASS_FISHERMAN 69 #define TRAINER_CLASS_SWIMMER_M 70 #define TRAINER_CLASS_CUE_BALL 71 #define TRAINER_CLASS_GAMER 72 #define TRAINER_CLASS_BEAUTY 73 #define TRAINER_CLASS_SWIMMER_F 74 #define TRAINER_CLASS_PSYCHIC 75 #define TRAINER_CLASS_ROCKER 76 #define TRAINER_CLASS_JUGGLER 77 #define TRAINER_CLASS_TAMER 78 #define TRAINER_CLASS_BIRD_KEEPER 79 #define TRAINER_CLASS_BLACK_BELT 80 #define TRAINER_CLASS_RIVAL_EARLY 81 #define TRAINER_CLASS_SCIENTIST 82 #define TRAINER_CLASS_BOSS 83 #define TRAINER_CLASS_LEADER 84 #define TRAINER_CLASS_TEAM_ROCKET 85 #define TRAINER_CLASS_COOLTRAINER 86 #define TRAINER_CLASS_ELITE_FOUR 87 #define TRAINER_CLASS_GENTLEMAN 88 #define TRAINER_CLASS_RIVAL_LATE 89 #define TRAINER_CLASS_CHAMPION 90 #define TRAINER_CLASS_CHANNELER 91 #define TRAINER_CLASS_TWINS 92 #define TRAINER_CLASS_COOL_COUPLE 93 #define TRAINER_CLASS_YOUNG_COUPLE 94 #define TRAINER_CLASS_CRUSH_KIN 95 #define TRAINER_CLASS_SIS_AND_BRO 96 #define TRAINER_CLASS_PKMN_PROF 97 #define TRAINER_CLASS_PLAYER 98 #define TRAINER_CLASS_CRUSH_GIRL 99 #define TRAINER_CLASS_TUBER 100 #define TRAINER_CLASS_PKMN_BREEDER 101 #define TRAINER_CLASS_PKMN_RANGER 102 #define TRAINER_CLASS_AROMA_LADY 103 #define TRAINER_CLASS_RUIN_MANIAC 104 #define TRAINER_CLASS_LADY 105 #define TRAINER_CLASS_PAINTER 106 #define FACILITY_CLASS_AQUA_LEADER_ARCHIE 0 #define FACILITY_CLASS_AQUA_GRUNT_M 1 #define FACILITY_CLASS_AQUA_GRUNT_F 2 #define FACILITY_CLASS_RS_AROMA_LADY 3 #define FACILITY_CLASS_RS_RUIN_MANIAC 4 #define FACILITY_CLASS_INTERVIEWER 5 #define FACILITY_CLASS_RS_TUBER_F 6 #define FACILITY_CLASS_RS_TUBER_M 7 #define FACILITY_CLASS_RS_COOLTRAINER_M 8 #define FACILITY_CLASS_RS_COOLTRAINER_F 9 #define FACILITY_CLASS_HEX_MANIAC 10 #define FACILITY_CLASS_RS_LADY 11 #define FACILITY_CLASS_RS_BEAUTY 12 #define FACILITY_CLASS_RICH_BOY 13 #define FACILITY_CLASS_RS_POKEMANIAC 14 #define FACILITY_CLASS_RS_SWIMMER_M 15 #define FACILITY_CLASS_RS_BLACK_BELT 16 #define FACILITY_CLASS_GUITARIST 17 #define FACILITY_CLASS_KINDLER 18 #define FACILITY_CLASS_RS_CAMPER 19 #define FACILITY_CLASS_BUG_MANIAC 20 #define FACILITY_CLASS_RS_PSYCHIC_M 21 #define FACILITY_CLASS_RS_PSYCHIC_F 22 #define FACILITY_CLASS_RS_GENTLEMAN 23 #define FACILITY_CLASS_ELITE_FOUR_SIDNEY 24 #define FACILITY_CLASS_ELITE_FOUR_PHOEBE 25 #define FACILITY_CLASS_LEADER_ROXANNE 26 #define FACILITY_CLASS_LEADER_BRAWLY 27 #define FACILITY_CLASS_LEADER_TATE_AND_LIZA 28 #define FACILITY_CLASS_SCHOOL_KID_M 29 #define FACILITY_CLASS_SCHOOL_KID_F 30 #define FACILITY_CLASS_SR_AND_JR 31 #define FACILITY_CLASS_POKEFAN_M 32 #define FACILITY_CLASS_POKEFAN_F 33 #define FACILITY_CLASS_EXPERT_M 34 #define FACILITY_CLASS_EXPERT_F 35 #define FACILITY_CLASS_RS_YOUNGSTER 36 #define FACILITY_CLASS_CHAMPION_STEVEN 37 #define FACILITY_CLASS_RS_FISHERMAN 38 #define FACILITY_CLASS_CYCLING_TRIATHLETE_M 39 #define FACILITY_CLASS_CYCLING_TRIATHLETE_F 40 #define FACILITY_CLASS_RUNNING_TRIATHLETE_M 41 #define FACILITY_CLASS_RUNNING_TRIATHLETE_F 42 #define FACILITY_CLASS_SWIMMING_TRIATHLETE_M 43 #define FACILITY_CLASS_SWIMMING_TRIATHLETE_F 44 #define FACILITY_CLASS_DRAGON_TAMER 45 #define FACILITY_CLASS_RS_BIRD_KEEPER 46 #define FACILITY_CLASS_NINJA_BOY 47 #define FACILITY_CLASS_BATTLE_GIRL 48 #define FACILITY_CLASS_PARASOL_LADY 49 #define FACILITY_CLASS_RS_SWIMMER_F 50 #define FACILITY_CLASS_RS_PICNICKER 51 #define FACILITY_CLASS_RS_TWINS 52 #define FACILITY_CLASS_RS_SAILOR 53 #define FACILITY_CLASS_BOARDER_M 54 #define FACILITY_CLASS_BOARDER_F 55 #define FACILITY_CLASS_COLLECTOR 56 #define FACILITY_CLASS_PKMN_TRAINER_WALLY 57 #define FACILITY_CLASS_PKMN_TRAINER_BRENDAN 58 #define FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2 59 #define FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3 60 #define FACILITY_CLASS_PKMN_TRAINER_MAY 61 #define FACILITY_CLASS_PKMN_TRAINER_MAY_2 62 #define FACILITY_CLASS_PKMN_TRAINER_MAY_3 63 #define FACILITY_CLASS_RS_PKMN_BREEDER_M 64 #define FACILITY_CLASS_RS_PKMN_BREEDER_F 65 #define FACILITY_CLASS_RS_PKMN_RANGER_M 66 #define FACILITY_CLASS_RS_PKMN_RANGER_F 67 #define FACILITY_CLASS_MAGMA_LEADER_MAXIE 68 #define FACILITY_CLASS_MAGMA_GRUNT_M 69 #define FACILITY_CLASS_MAGMA_GRUNT_F 70 #define FACILITY_CLASS_RS_LASS 71 #define FACILITY_CLASS_RS_BUG_CATCHER 72 #define FACILITY_CLASS_RS_HIKER 73 #define FACILITY_CLASS_RS_YOUNG_COUPLE 74 #define FACILITY_CLASS_OLD_COUPLE 75 #define FACILITY_CLASS_RS_SIS_AND_BRO 76 #define FACILITY_CLASS_AQUA_ADMIN_M 77 #define FACILITY_CLASS_AQUA_ADMIN_F 78 #define FACILITY_CLASS_MAGMA_ADMIN_M 79 #define FACILITY_CLASS_MAGMA_ADMIN_F 80 #define FACILITY_CLASS_LEADER_WATTSON 81 #define FACILITY_CLASS_LEADER_FLANNERY 82 #define FACILITY_CLASS_LEADER_NORMAN 83 #define FACILITY_CLASS_LEADER_WINONA 84 #define FACILITY_CLASS_LEADER_WALLACE 85 #define FACILITY_CLASS_ELITE_FOUR_GLACIA 86 #define FACILITY_CLASS_ELITE_FOUR_DRAKE 87 #define FACILITY_CLASS_YOUNGSTER 88 #define FACILITY_CLASS_BUG_CATCHER 89 #define FACILITY_CLASS_LASS 90 #define FACILITY_CLASS_SAILOR 91 #define FACILITY_CLASS_CAMPER 92 #define FACILITY_CLASS_PICNICKER 93 #define FACILITY_CLASS_POKEMANIAC 94 #define FACILITY_CLASS_SUPER_NERD 95 #define FACILITY_CLASS_HIKER 96 #define FACILITY_CLASS_BIKER 97 #define FACILITY_CLASS_BURGLAR 98 #define FACILITY_CLASS_ENGINEER 99 #define FACILITY_CLASS_FISHERMAN 100 #define FACILITY_CLASS_SWIMMER_M 101 #define FACILITY_CLASS_CUE_BALL 102 #define FACILITY_CLASS_GAMER 103 #define FACILITY_CLASS_BEAUTY 104 #define FACILITY_CLASS_SWIMMER_F 105 #define FACILITY_CLASS_PSYCHIC_M 106 #define FACILITY_CLASS_ROCKER 107 #define FACILITY_CLASS_JUGGLER 108 #define FACILITY_CLASS_TAMER 109 #define FACILITY_CLASS_BIRD_KEEPER 110 #define FACILITY_CLASS_BLACK_BELT 111 #define FACILITY_CLASS_RIVAL_EARLY 112 #define FACILITY_CLASS_SCIENTIST 113 #define FACILITY_CLASS_BOSS 114 #define FACILITY_CLASS_ROCKET_GRUNT_M 115 #define FACILITY_CLASS_COOLTRAINER_M 116 #define FACILITY_CLASS_COOLTRAINER_F 117 #define FACILITY_CLASS_ELITE_FOUR_LORELEI 118 #define FACILITY_CLASS_ELITE_FOUR_BRUNO 119 #define FACILITY_CLASS_LEADER_M 120 #define FACILITY_CLASS_LEADER_F 121 #define FACILITY_CLASS_GENTLEMAN 122 #define FACILITY_CLASS_RIVAL_LATE 123 #define FACILITY_CLASS_CHAMPION_RIVAL 124 #define FACILITY_CLASS_CHANNELER 125 #define FACILITY_CLASS_TWINS 126 #define FACILITY_CLASS_COOL_COUPLE 127 #define FACILITY_CLASS_YOUNG_COUPLE 128 #define FACILITY_CLASS_CRUSH_KIN 129 #define FACILITY_CLASS_SIS_AND_BRO 130 #define FACILITY_CLASS_PKMN_PROF 131 #define FACILITY_CLASS_BRENDAN 132 #define FACILITY_CLASS_MAY 133 #define FACILITY_CLASS_RED 134 #define FACILITY_CLASS_LEAF 135 #define FACILITY_CLASS_ROCKET_GRUNT_F 136 #define FACILITY_CLASS_PSYCHIC_F 137 #define FACILITY_CLASS_CRUSH_GIRL 138 #define FACILITY_CLASS_TUBER 139 #define FACILITY_CLASS_PKMN_BREEDER 140 #define FACILITY_CLASS_PKMN_RANGER_M 141 #define FACILITY_CLASS_PKMN_RANGER_F 142 #define FACILITY_CLASS_AROMA_LADY 143 #define FACILITY_CLASS_RUIN_MANIAC 144 #define FACILITY_CLASS_LADY 145 #define FACILITY_CLASS_PAINTER 146 #define FACILITY_CLASS_ELITE_FOUR_AGATHA 147 #define FACILITY_CLASS_ELITE_FOUR_LANCE 148 #define FACILITY_CLASS_CHAMPION_RIVAL_2 149 #define FACILITY_CLASS_EM_BRENDAN 150 #define FACILITY_CLASS_EM_MAY 151 #define F_TRAINER_FEMALE (1 << 7) // All trainer parties specify the IV, level, and species for each Pokémon in the // party. Some trainer parties also specify held items and custom moves for each // Pokémon. #define F_TRAINER_PARTY_CUSTOM_MOVESET (1 << 0) #define F_TRAINER_PARTY_HELD_ITEM (1 << 1) #define F_TRAINER_PARTY_EVS (1 << 2) #endif // GUARD_CONSTANTS_TRAINERS_H ================================================ FILE: include/constants/union_room.h ================================================ #ifndef GUARD_CONSTANTS_UNION_ROOM_H #define GUARD_CONSTANTS_UNION_ROOM_H // The number of possible group leaders visible in the Union Room. // Note that this is different than the number of people actively // connected as children via the Wireless Adapter, which cannot // exceed RFU_CHILD_MAX (4), for a total of 5 including the player. #define MAX_UNION_ROOM_LEADERS 8 #define UNION_ROOM_SPAWN_NONE 0 #define UNION_ROOM_SPAWN_IN 1 #define UNION_ROOM_SPAWN_OUT 2 #define UNION_ROOM_MAX_LEVEL 30 // The number of possible trainer classes for a trainer of a given gender in the Union Room. // This value is necessarily a power of 2 because of the way it's treated in GetUnionRoomTrainerPic / GetUnionRoomTrainerClass #define NUM_UNION_ROOM_CLASSES (1 << 3) // 8 #define ACTIVITY_NONE 0 #define ACTIVITY_BATTLE_SINGLE 1 #define ACTIVITY_BATTLE_DOUBLE 2 #define ACTIVITY_BATTLE_MULTI 3 #define ACTIVITY_TRADE 4 #define ACTIVITY_CHAT 5 #define ACTIVITY_WONDER_CARD_DUP 6 // Duplicates of later WONDER constants #define ACTIVITY_WONDER_NEWS_DUP 7 // #define ACTIVITY_CARD 8 #define ACTIVITY_POKEMON_JUMP 9 #define ACTIVITY_BERRY_CRUSH 10 #define ACTIVITY_BERRY_PICK 11 #define ACTIVITY_SEARCH 12 #define ACTIVITY_SPIN_TRADE 13 #define ACTIVITY_ITEM_TRADE 14 // Replaced with ACTIVITY_BATTLE_TOWER_OPEN in Emerald #define ACTIVITY_RECORD_CORNER 15 #define ACTIVITY_BERRY_BLENDER 16 // Player response #define ACTIVITY_ACCEPT 17 #define ACTIVITY_DECLINE 18 #define ACTIVITY_NPCTALK 19 #define ACTIVITY_PLYRTALK 20 #define ACTIVITY_WONDER_CARD 21 #define ACTIVITY_WONDER_NEWS 22 #define IN_UNION_ROOM (1 << 6) #define LINK_GROUP_SINGLE_BATTLE 0 #define LINK_GROUP_DOUBLE_BATTLE 1 #define LINK_GROUP_MULTI_BATTLE 2 #define LINK_GROUP_TRADE 3 #define LINK_GROUP_POKEMON_JUMP 4 #define LINK_GROUP_BERRY_CRUSH 5 #define LINK_GROUP_BERRY_PICKING 6 #define LINK_GROUP_WONDER_CARD 7 #define LINK_GROUP_WONDER_NEWS 8 #define LINK_GROUP_UNION_ROOM_RESUME 9 #define LINK_GROUP_UNION_ROOM_INIT 10 #define LINK_GROUP_UNK_11 11 #define LINK_GROUP_UNK_12 12 #define NUM_LINK_GROUP_TYPES 13 #define UR_TRADE_MATCH 0 #define UR_TRADE_NOTYPE 1 #define UR_TRADE_NOEGG 2 #define UR_TRADE_READY 0 #define UR_TRADE_PLAYER_NOT_READY 1 #define UR_TRADE_PARTNER_NOT_READY 2 #define UR_INTERACT_PLAYER_1 1 #define UR_INTERACT_PLAYER_2 2 #define UR_INTERACT_PLAYER_3 3 #define UR_INTERACT_PLAYER_4 4 #define UR_INTERACT_PLAYER_5 5 #define UR_INTERACT_PLAYER_6 6 #define UR_INTERACT_PLAYER_7 7 #define UR_INTERACT_PLAYER_8 8 #define UR_INTERACT_ATTENDANT 9 #define UR_INTERACT_UNUSED 10 #define UR_INTERACT_START_MENU 11 #endif //GUARD_CONSTANTS_UNION_ROOM_H ================================================ FILE: include/constants/vars.h ================================================ #ifndef GUARD_CONSTANTS_VARS_H #define GUARD_CONSTANTS_VARS_H #define VARS_START 0x4000 // Temporary variables. Temp vars are cleared every time a map is loaded. #define TEMP_VARS_START 0x4000 #define VAR_TEMP_0 (TEMP_VARS_START + 0x0) #define VAR_TEMP_1 (TEMP_VARS_START + 0x1) #define VAR_TEMP_2 (TEMP_VARS_START + 0x2) #define VAR_TEMP_3 (TEMP_VARS_START + 0x3) #define VAR_TEMP_4 (TEMP_VARS_START + 0x4) #define VAR_TEMP_5 (TEMP_VARS_START + 0x5) #define VAR_TEMP_6 (TEMP_VARS_START + 0x6) #define VAR_TEMP_7 (TEMP_VARS_START + 0x7) #define VAR_TEMP_8 (TEMP_VARS_START + 0x8) #define VAR_TEMP_9 (TEMP_VARS_START + 0x9) #define VAR_TEMP_A (TEMP_VARS_START + 0xA) #define VAR_TEMP_B (TEMP_VARS_START + 0xB) #define VAR_TEMP_C (TEMP_VARS_START + 0xC) #define VAR_TEMP_D (TEMP_VARS_START + 0xD) #define VAR_TEMP_E (TEMP_VARS_START + 0xE) #define VAR_TEMP_F (TEMP_VARS_START + 0xF) #define TEMP_VARS_END VAR_TEMP_F // Object event graphics IDs which can be changed by // script commands. #define VAR_OBJ_GFX_ID_0 0x4010 #define VAR_OBJ_GFX_ID_1 0x4011 #define VAR_OBJ_GFX_ID_2 0x4012 #define VAR_OBJ_GFX_ID_3 0x4013 #define VAR_OBJ_GFX_ID_4 0x4014 #define VAR_OBJ_GFX_ID_5 0x4015 #define VAR_OBJ_GFX_ID_6 0x4016 #define VAR_OBJ_GFX_ID_7 0x4017 #define VAR_OBJ_GFX_ID_8 0x4018 #define VAR_OBJ_GFX_ID_9 0x4019 #define VAR_OBJ_GFX_ID_A 0x401A #define VAR_OBJ_GFX_ID_B 0x401B #define VAR_OBJ_GFX_ID_C 0x401C #define VAR_OBJ_GFX_ID_D 0x401D #define VAR_OBJ_GFX_ID_E 0x401E #define VAR_OBJ_GFX_ID_F 0x401F // If nonzero, counts down by one every step. // When it hits zero, repel's effect wears off. #define VAR_REPEL_STEP_COUNT 0x4020 // Counts up every step. Wraps around at 128. // When wraparound occurs, the friendship of // every party poke gets a slight boost. #define VAR_HAPPINESS_STEP_COUNTER 0x4021 // Counts up every step while a party Pokemon is // poisoned. Wraps around at 5. When wraparound // occurs, every party Pokemon with the PSN status // takes 1 point of damage. // This is a deviation from the typical rate in // the series, which is 1 damage every 4 steps. #define VAR_POISON_STEP_COUNTER 0x4022 // Step counter. Caps at 1500. If you enter a map with // renewable hidden items and this counter is capped, // the counter resets to 0 and all renewable hidden // item flags are resampled. #define VAR_RENEWABLE_ITEM_STEP_COUNTER 0x4023 // Determines which wild encounter set to use in the // Altering Cave. Incremented by Mystery Event. // Wraps around at 10. #define VAR_ALTERING_CAVE_WILD_SET 0x4024 // Step counter set to 500 at game start. When you get // a massage from Daisy, it resets to 0. Caps at 500. #define VAR_MASSAGE_COOLDOWN_STEP_COUNTER 0x4025 // Step counter. Wraps around at 100. Used to // determine whether the player has reached the // triangle in time. #define VAR_DEOXYS_INTERACTION_STEP_COUNTER 0x4026 // Bits 0-11 are the number of mons in all boxes // with the species sanity bit set. // Bits 12-15 are the same for the player's party. // Used by Quest Log. #define VAR_QUEST_LOG_MON_COUNTS 0x4027 #define VAR_WONDER_NEWS_STEP_COUNTER 0x4028 #define VAR_LAST_REPEL_USED 0x4029 #define VAR_BATTLE_HOUSE 0x402A //usage overflows into next var #define VAR_BATTLE_HOUSE2 0x402B #define VAR_0x402C 0x402C #define VAR_DAYCARE_MAN_TRIGGERS 0x402D #define VAR_GLASS_WORKSHOP_STATE 0x402E #define VAR_ASH_GATHER_COUNT 0x402F #define VAR_ICE_STEP_COUNT 0x4030 #define VAR_STARTER_MON 0x4031 // 0: Bulbasaur, 1: Squirtle, 2: Charmander #define VAR_RESET_RTC_ENABLE 0x4032 #define VAR_ENIGMA_BERRY_AVAILABLE 0x4033 #define VAR_CABLE_CAR_STATION_STATE 0x4034 #define VAR_RESORT_GOREGEOUS_STEP_COUNTER 0x4035 #define VAR_RESORT_GORGEOUS_REQUESTED_MON 0x4036 #define VAR_PC_BOX_TO_SEND_MON 0x4037 #define VAR_FANCLUB_FAN_COUNTER 0x4038 #define VAR_FANCLUB_LOSE_FAN_TIMER 0x4039 #define VAR_ELEVATOR_FLOOR 0x403A #define VAR_RESORT_GORGEOUS_REWARD 0x403B #define VAR_0x403C 0x403C // Set to 0x0302, never read #define VAR_HERACROSS_SIZE_RECORD 0x403D #define VAR_DEOXYS_INTERACTION_NUM 0x403E #define VAR_0x403F 0x403F #define VAR_MAGIKARP_SIZE_RECORD 0x4040 #define VAR_0x4041 0x4041 #define VAR_TRAINER_CARD_MON_ICON_TINT_IDX 0x4042 #define VAR_TRAINER_CARD_MON_ICON_1 0x4043 #define VAR_TRAINER_CARD_MON_ICON_2 0x4044 #define VAR_TRAINER_CARD_MON_ICON_3 0x4045 #define VAR_TRAINER_CARD_MON_ICON_4 0x4046 #define VAR_TRAINER_CARD_MON_ICON_5 0x4047 #define VAR_TRAINER_CARD_MON_ICON_6 0x4048 #define VAR_HOF_BRAG_STATE 0x4049 #define VAR_EGG_BRAG_STATE 0x404A #define VAR_LINK_WIN_BRAG_STATE 0x404B #define VAR_POKELOT_RND2 0x404C #define VAR_QL_ENTRANCE 0x404D #define VAR_NATIONAL_DEX 0x404E #define VAR_LOTAD_SIZE_RECORD 0x404F // Map Scene #define VAR_MAP_SCENE_PALLET_TOWN_OAK 0x4050 #define VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN 0x4051 #define VAR_MAP_SCENE_CERULEAN_CITY_RIVAL 0x4052 #define VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER 0x4053 #define VAR_MAP_SCENE_ROUTE22 0x4054 #define VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB 0x4055 #define VAR_MAP_SCENE_PALLET_TOWN_PLAYERS_HOUSE_2F 0x4056 #define VAR_MAP_SCENE_VIRIDIAN_CITY_MART 0x4057 #define VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE 0x4058 #define VAR_MAP_SCENE_POKEMON_TOWER_6F 0x4059 #define VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR 0x405A #define VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR 0x405B #define VAR_MAP_SCENE_SILPH_CO_7F 0x405C #define VAR_MAP_SCENE_POKEMON_TOWER_2F 0x405D #define VAR_MAP_SCENE_ROUTE16 0x405E #define VAR_MAP_SCENE_ROUTE23 0x405F #define VAR_MAP_SCENE_SILPH_CO_11F 0x4060 #define VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F 0x4061 #define VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES 0x4062 #define VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F 0x4063 #define VAR_MAP_SCENE_VICTORY_ROAD_1F 0x4064 #define VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1 0x4065 #define VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2 0x4066 #define VAR_MAP_SCENE_VICTORY_ROAD_3F 0x4067 #define VAR_MAP_SCENE_POKEMON_LEAGUE 0x4068 #define VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL 0x4069 #define VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE 0x406A #define VAR_MAP_SCENE_ROUTE24 0x406B #define VAR_MAP_SCENE_PEWTER_CITY 0x406C #define VAR_0x406D 0x406D #define VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE 0x406E #define VAR_CABLE_CLUB_STATE 0x406F #define VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY 0x4070 #define VAR_MAP_SCENE_CINNABAR_ISLAND 0x4071 #define VAR_0x4072 0x4072 #define VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB 0x4073 #define VAR_MAP_SCENE_SEVEN_ISLAND_HOUSE_ROOM1 0x4074 #define VAR_MAP_SCENE_ONE_ISLAND_HARBOR 0x4075 #define VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F 0x4076 #define VAR_0x4077 0x4077 #define VAR_MAP_SCENE_TWO_ISLAND 0x4078 #define VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER 0x4079 #define VAR_0x407A 0x407A #define VAR_MAP_SCENE_THREE_ISLAND 0x407B #define VAR_MAP_SCENE_POKEMON_CENTER_TEALA 0x407C #define VAR_MAP_SCENE_CERULEAN_CITY_ROCKET 0x407D #define VAR_MAP_SCENE_VERMILION_CITY 0x407E #define VAR_MAP_SCENE_MT_EMBER_EXTERIOR 0x407F #define VAR_MAP_SCENE_ICEFALL_CAVE_BACK 0x4080 #define VAR_MAP_SCENE_SAFFRON_CITY_DOJO 0x4081 #define VAR_MAP_SCENE_TRAINER_TOWER 0x4082 #define VAR_MAP_SCENE_FIVE_ISLAND_LOST_CAVE_ROOM10 0x4083 #define VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS 0x4084 #define VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR 0x4085 #define VAR_MAP_SCENE_FOUR_ISLAND 0x4086 #define VAR_0x4087 0x4087 #define VAR_MAP_SCENE_ROCKET_WAREHOUSE 0x4088 #define VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F 0x4089 #define VAR_MAP_SCENE_CINNABAR_ISLAND_2 0x408A #define VAR_MAP_SCENE_MT_MOON_B2F 0x408B #define VAR_FARAWAY_ISLAND_STEP_COUNTER 0x408C #define VAR_0x408D 0x408D #define VAR_0x408E 0x408E #define VAR_0x408F 0x408F #define VAR_0x4090 0x4090 #define VAR_0x4091 0x4091 #define VAR_0x4092 0x4092 #define VAR_0x4093 0x4093 #define VAR_0x4094 0x4094 #define VAR_0x4095 0x4095 #define VAR_0x4096 0x4096 #define VAR_0x4097 0x4097 #define VAR_0x4098 0x4098 #define VAR_0x4099 0x4099 #define VAR_0x409A 0x409A #define VAR_0x409B 0x409B #define VAR_0x409C 0x409C #define VAR_0x409D 0x409D #define VAR_0x409E 0x409E #define VAR_0x409F 0x409F #define VAR_0x40A0 0x40A0 #define VAR_0x40A1 0x40A1 #define VAR_0x40A2 0x40A2 #define VAR_0x40A3 0x40A3 #define VAR_0x40A4 0x40A4 #define VAR_0x40A5 0x40A5 #define VAR_0x40A6 0x40A6 #define VAR_0x40A7 0x40A7 #define VAR_0x40A8 0x40A8 #define VAR_0x40A9 0x40A9 #define VAR_QLBAK_TRAINER_REMATCHES 0x40AA // array of 4 #define VAR_QLBAK_MAP_LAYOUT 0x40AE #define VAR_0x40AF 0x40AF #define VAR_0x40B0 0x40B0 #define VAR_0x40B1 0x40B1 #define VAR_0x40B2 0x40B2 #define VAR_0x40B3 0x40B3 #define VAR_PORTHOLE 0x40B4 #define VAR_EVENT_PICHU_SLOT 0x40B5 #define VAR_MYSTERY_GIFT_1 0x40B6 #define VAR_MYSTERY_GIFT_2 0x40B7 #define VAR_MYSTERY_GIFT_3 0x40B8 #define VAR_MYSTERY_GIFT_4 0x40B9 #define VAR_MYSTERY_GIFT_5 0x40BA #define VAR_MYSTERY_GIFT_6 0x40BB #define VAR_MYSTERY_GIFT_7 0x40BC #define VAR_0x40BD 0x40BD #define VAR_0x40BE 0x40BE #define VAR_0x40BF 0x40BF #define VAR_0x40C0 0x40C0 #define VAR_0x40C1 0x40C1 #define VAR_0x40C2 0x40C2 #define VAR_0x40C3 0x40C3 #define VAR_0x40C4 0x40C4 #define VAR_0x40C5 0x40C5 #define VAR_0x40C6 0x40C6 #define VAR_0x40C7 0x40C7 #define VAR_0x40C8 0x40C8 #define VAR_0x40C9 0x40C9 #define VAR_0x40CA 0x40CA #define VAR_0x40CB 0x40CB #define VAR_0x40CC 0x40CC #define VAR_0x40CD 0x40CD #define VAR_0x40CE 0x40CE #define VAR_FRONTIER_FACILITY 0x40CF #define VAR_0x40D0 0x40D0 #define VAR_0x40D1 0x40D1 #define VAR_0x40D2 0x40D2 #define VAR_0x40D3 0x40D3 #define VAR_0x40D4 0x40D4 #define VAR_0x40D5 0x40D5 #define VAR_0x40D6 0x40D6 #define VAR_0x40D7 0x40D7 #define VAR_0x40D8 0x40D8 #define VAR_0x40D9 0x40D9 #define VAR_0x40DA 0x40DA #define VAR_0x40DB 0x40DB #define VAR_0x40DC 0x40DC #define VAR_0x40DD 0x40DD #define VAR_0x40DE 0x40DE #define VAR_0x40DF 0x40DF #define VAR_0x40E0 0x40E0 #define VAR_0x40E1 0x40E1 #define VAR_0x40E2 0x40E2 #define VAR_0x40E3 0x40E3 #define VAR_0x40E4 0x40E4 #define VAR_0x40E5 0x40E5 #define VAR_DAILY_SLOTS 0x40E6 #define VAR_DAILY_WILDS 0x40E7 #define VAR_DAILY_BLENDER 0x40E8 #define VAR_DAILY_PLANTED_BERRIES 0x40E9 #define VAR_DAILY_PICKED_BERRIES 0x40EA #define VAR_DAILY_ROULETTE 0x40EB #define VAR_0x40EC 0x40EC #define VAR_0x40ED 0x40ED #define VAR_0x40EE 0x40EE #define VAR_0x40EF 0x40EF #define VAR_0x40F0 0x40F0 #define VAR_DAILY_BP 0x40F1 #define VAR_0x40F2 0x40F2 #define VAR_0x40F3 0x40F3 #define VAR_0x40F4 0x40F4 #define VAR_0x40F5 0x40F5 #define VAR_0x40F6 0x40F6 #define VAR_0x40F7 0x40F7 #define VAR_0x40F8 0x40F8 #define VAR_0x40F9 0x40F9 #define VAR_0x40FA 0x40FA #define VAR_0x40FB 0x40FB #define VAR_0x40FC 0x40FC #define VAR_0x40FD 0x40FD #define VAR_0x40FE 0x40FE #define VAR_0x40FF 0x40FF #define VARS_END 0x40FF #define VARS_COUNT (VARS_END - VARS_START + 1) #define SPECIAL_VARS_START 0x8000 #define VAR_0x8000 0x8000 #define VAR_0x8001 0x8001 #define VAR_0x8002 0x8002 #define VAR_0x8003 0x8003 #define VAR_0x8004 0x8004 #define VAR_0x8005 0x8005 #define VAR_0x8006 0x8006 #define VAR_0x8007 0x8007 #define VAR_0x8008 0x8008 #define VAR_0x8009 0x8009 #define VAR_0x800A 0x800A #define VAR_0x800B 0x800B #define VAR_FACING 0x800C #define VAR_RESULT 0x800D #define VAR_ITEM_ID 0x800E #define VAR_LAST_TALKED 0x800F #define VAR_MON_BOX_ID 0x8010 #define VAR_MON_BOX_POS 0x8011 #define VAR_TEXT_COLOR 0x8012 #define VAR_PREV_TEXT_COLOR 0x8013 #define VAR_0x8014 0x8014 // Unknown/unused #define SPECIAL_VARS_END 0x8014 // Text color ids for VAR_TEXT_COLOR / VAR_PREV_TEXT_COLOR #define NPC_TEXT_COLOR_MALE 0 // Blue, for male NPCs #define NPC_TEXT_COLOR_FEMALE 1 // Red, for female NPCs #define NPC_TEXT_COLOR_MON 2 // Black, for Pokémon #define NPC_TEXT_COLOR_NEUTRAL 3 // Black, for inanimate objects and messages from the game #define NPC_TEXT_COLOR_DEFAULT 255 // If an NPC is selected, use the color specified by GetColorFromTextColorTable, otherwise use Neutral. #endif // GUARD_CONSTANTS_VARS_H ================================================ FILE: include/constants/weather.h ================================================ #ifndef GUARD_CONSTANTS_WEATHER_H #define GUARD_CONSTANTS_WEATHER_H #define WEATHER_NONE 0 #define WEATHER_SUNNY_CLOUDS 1 // unused #define WEATHER_SUNNY 2 #define WEATHER_RAIN 3 // unused #define WEATHER_SNOW 4 // unused #define WEATHER_RAIN_THUNDERSTORM 5 // unused #define WEATHER_FOG_HORIZONTAL 6 #define WEATHER_VOLCANIC_ASH 7 // unused #define WEATHER_SANDSTORM 8 // unused #define WEATHER_FOG_DIAGONAL 9 // unused #define WEATHER_UNDERWATER 10 // unused #define WEATHER_SHADE 11 #define WEATHER_DROUGHT 12 // unused and broken in overworld #define WEATHER_DOWNPOUR 13 // unused #define WEATHER_UNDERWATER_BUBBLES 14 // unused #define WEATHER_ABNORMAL 15 // unused #define WEATHER_ROUTE119_CYCLE 20 // unused #define WEATHER_ROUTE123_CYCLE 21 // unused // These are used in maps' coord_weather_event entries. // They are not a one-to-one mapping with the engine's // internal weather constants above. #define COORD_EVENT_WEATHER_SUNNY_CLOUDS 1 #define COORD_EVENT_WEATHER_SUNNY 2 #define COORD_EVENT_WEATHER_RAIN 3 #define COORD_EVENT_WEATHER_SNOW 4 #define COORD_EVENT_WEATHER_RAIN_THUNDERSTORM 5 #define COORD_EVENT_WEATHER_FOG_HORIZONTAL 6 #define COORD_EVENT_WEATHER_FOG_DIAGONAL 7 #define COORD_EVENT_WEATHER_VOLCANIC_ASH 8 #define COORD_EVENT_WEATHER_SANDSTORM 9 #define COORD_EVENT_WEATHER_SHADE 10 #define COORD_EVENT_WEATHER_DROUGHT 11 #define COORD_EVENT_WEATHER_ROUTE119_CYCLE 20 #define COORD_EVENT_WEATHER_ROUTE123_CYCLE 21 #endif // GUARD_CONSTANTS_WEATHER_H ================================================ FILE: include/coord_event_weather.h ================================================ #ifndef GUARD_COORD_EVENT_WEATHER_H #define GUARD_COORD_EVENT_WEATHER_H void DoCoordEventWeather(u8 weatherId); #endif //GUARD_COORD_EVENT_WEATHER_H ================================================ FILE: include/credits.h ================================================ #ifndef GUARD_CREDITS_H #define GUARD_CREDITS_H extern bool8 gHasHallOfFameRecords; #define CREDITSOVWLDCMD_FB 0xFB #define CREDITSOVWLDCMD_FC 0xFC #define CREDITSOVWLDCMD_END 0xFD #define CREDITSOVWLDCMD_LOADMAP 0xFE #define CREDITSOVWLDCMD_FF 0xFF #define CREDITSOVWLDLOADMAP(_map, _x, _y, _delay) \ { CREDITSOVWLDCMD_LOADMAP, MAP_GROUP(_map), MAP_NUM(_map) }, \ { _x, _y, _delay } #define CREDITSOVWLDSCROLL(_xspeed, _yspeed, _length) \ { _xspeed, _yspeed, _length } #define CREDITSOVWLDEND \ { CREDITSOVWLDCMD_END, CREDITSOVWLDCMD_END, CREDITSOVWLDCMD_END } #endif //GUARD_CREDITS_H ================================================ FILE: include/data.h ================================================ #ifndef GUARD_DATA_H #define GUARD_DATA_H #include "global.h" #define SPECIES_SHINY_TAG 500 #define TRAINER_ENCOUNTER_MUSIC(trainer)((gTrainers[trainer].encounterMusic_gender & 0x7F)) struct MonCoords { // This would use a bitfield, but some function // uses it as a u8 and casting won't match. u8 size; // u8 width:4, height:4; u8 y_offset; }; #define MON_COORDS_SIZE(width, height)(DIV_ROUND_UP(width, 8) << 4 | DIV_ROUND_UP(height, 8)) #define GET_MON_COORDS_WIDTH(size)((size >> 4) * 8) #define GET_MON_COORDS_HEIGHT(size)((size & 0xF) * 8) extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; extern const u8 gMoveNames[][MOVE_NAME_LENGTH + 1]; extern const u8 gTrainerClassNames[][13]; extern const struct MonCoords gMonFrontPicCoords[]; extern const struct CompressedSpriteSheet gMonFrontPicTable[]; extern const struct MonCoords gMonBackPicCoords[]; extern const struct CompressedSpriteSheet gMonBackPicTable[]; extern const struct CompressedSpritePalette gMonPaletteTable[]; extern const struct CompressedSpritePalette gMonShinyPaletteTable[]; extern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[]; extern const struct MonCoords gTrainerFrontPicCoords[]; extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; extern const struct CompressedSpriteSheet gTrainerBackPicTable[]; extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern const union AnimCmd *const *const gTrainerBackAnimsPtrTable[]; extern const struct MonCoords gTrainerBackPicCoords[]; extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; extern const u8 gEnemyMonElevation[NUM_SPECIES]; extern const u8 *const gBattleAnims_General[]; extern const u8 *const gBattleAnims_Special[]; extern const union AnimCmd *const gAnims_MonPic[]; extern const union AffineAnimCmd *const gAffineAnims_BattleSpritePlayerSide[]; extern const union AffineAnimCmd *const gAffineAnims_BattleSpriteOpponentSide[]; extern const struct SpriteFrameImage gBattlerPicTable_PlayerLeft[]; extern const struct SpriteFrameImage gBattlerPicTable_OpponentLeft[]; extern const struct SpriteFrameImage gBattlerPicTable_PlayerRight[]; extern const struct SpriteFrameImage gBattlerPicTable_OpponentRight[]; extern const struct SpriteFrameImage gTrainerBackPicTable_Red[]; extern const struct SpriteFrameImage gTrainerBackPicTable_Leaf[]; extern const struct SpriteFrameImage gTrainerBackPicTable_Pokedude[]; extern const struct SpriteFrameImage gTrainerBackPicTable_OldMan[]; extern const struct SpriteFrameImage gTrainerBackPicTable_RSBrendan[]; extern const struct SpriteFrameImage gTrainerBackPicTable_RSMay[]; extern const struct SpriteFrameImage gTrainerBackPicTable_EmBrendan[]; extern const struct SpriteFrameImage gTrainerBackPicTable_EmMay[]; #endif // GUARD_DATA_H ================================================ FILE: include/daycare.h ================================================ #ifndef GUARD_DAYCARE_H #define GUARD_DAYCARE_H #include "global.h" u8 *GetMonNick(struct Pokemon *mon, u8 *dest); u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest); u8 CountPokemonInDaycare(struct DayCare *daycare); void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDayCareMail *daycareMail); void StoreSelectedPokemonInDaycare(void); u16 TakePokemonFromDaycare(void); void GetDaycareCost(void); u8 GetNumLevelsGainedFromDaycare(void); void TriggerPendingDaycareEgg(void); void RejectEggFromDayCare(void); void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation); void GiveEggFromDaycare(void); bool8 DoEggActions_CheckHatch(void); u16 GetSelectedMonNickAndSpecies(void); void GetDaycareMonNicknames(void); u8 GetDaycareState(void); void SetDaycareCompatibilityString(void); bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio); void ShowDaycareLevelMenu(void); void ChooseSendDaycareMon(void); void GiveRivalStarterEgg(void); void CheckDaycareMonsHaveMail(void); void IsPartyAndBoxesFull(void); void ScriptHatchMon(void); void EggHatch(void); u8 GetEggStepsToSubtract(void); bool8 ShouldEggHatch(void); #endif // GUARD_DAYCARE_H ================================================ FILE: include/decompress.h ================================================ #ifndef GUARD_DECOMPRESS_H #define GUARD_DECOMPRESS_H #include "global.h" #include "sprite.h" extern u8 gDecompressionBuffer[0x4000]; void LZDecompressWram(const void *src, void *dest); void LZDecompressVram(const void *src, void *dest); u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src); void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer); bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src); void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src); void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer); bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src); void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void *buffer, s32 species); void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, void *buffer, s32 species); void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *buffer, s32 species); void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality); void HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality); void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic); void LoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic); void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic); u32 GetDecompressedDataSize(const u8 *ptr); #endif // GUARD_DECOMPRESS_H ================================================ FILE: include/decoration.h ================================================ #ifndef GUARD_DECORATION_H #define GUARD_DECORATION_H enum DecorationPermission { /* * The nomenclature here describes collision and placement permissions, in that order. */ DECORPERM_SOLID_FLOOR, DECORPERM_PASS_FLOOR, DECORPERM_BEHIND_FLOOR, DECORPERM_NA_WALL, DECORPERM_SPRITE, }; enum DecorationShape { DECORSHAPE_1x1, DECORSHAPE_2x1, DECORSHAPE_3x1, // unused DECORSHAPE_4x2, DECORSHAPE_2x2, DECORSHAPE_1x2, DECORSHAPE_1x3, // unused DECORSHAPE_2x4, DECORSHAPE_3x3, DECORSHAPE_3x2, }; enum DecorationCategory { DECORCAT_DESK, DECORCAT_CHAIR, DECORCAT_PLANT, DECORCAT_ORNAMENT, DECORCAT_MAT, DECORCAT_POSTER, DECORCAT_DOLL, DECORCAT_CUSHION, DECORCAT_COUNT, }; struct Decoration { u8 id; u8 name[16]; u8 permission; u8 shape; u8 category; u16 price; const u8 *description; const u16 *tiles; }; extern const struct Decoration gDecorations[]; #endif //GUARD_DECORATION_H ================================================ FILE: include/digit_obj_util.h ================================================ #ifndef GUARD_DIGIT_OBJ_UTIL_H #define GUARD_DIGIT_OBJ_UTIL_H struct DigitObjUtilTemplate { u8 strConvMode:2; u8 shape:2; u8 size:2; u8 priority:2; u8 oamCount; u8 xDelta; s16 x; s16 y; union { const struct SpriteSheet * uncompressed; const struct CompressedSpriteSheet * compressed; } spriteSheet; const struct SpritePalette * spritePal; }; extern const u16 gMinigameDigits_Pal[]; extern const u32 gMinigameDigits_Gfx[]; bool32 DigitObjUtil_Init(u32 count); void DigitObjUtil_Free(void); bool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemplate *template); void DigitObjUtil_PrintNumOn(u32 id, s32 num); void DigitObjUtil_DeletePrinter(u32 id); void DigitObjUtil_HideOrShow(u32 id, bool32 hide); #endif //GUARD_DIGIT_OBJ_UTIL_H ================================================ FILE: include/diploma.h ================================================ #ifndef GUARD_DIPLOMA_H #define GUARD_DIPLOMA_H #include "global.h" void CB2_ShowDiploma(void); #endif // GUARD_DIPLOMA_H ================================================ FILE: include/dma3.h ================================================ #ifndef GUARD_DMA3_H #define GUARD_DMA3_H #include "global.h" // Maximum amount of data we will transfer in one operation #define MAX_DMA_BLOCK_SIZE 0x1000 #define DMA_REQUEST_COPY32 1 #define DMA_REQUEST_FILL32 2 #define DMA_REQUEST_COPY16 3 #define DMA_REQUEST_FILL16 4 #define DMA3_16BIT 0 #define DMA3_32BIT 1 #define Dma3CopyLarge_(src, dest, size, bit) \ { \ const void *_src = src; \ void *_dest = dest; \ u32 _size = size; \ while (1) \ { \ if (_size <= MAX_DMA_BLOCK_SIZE) \ { \ DmaCopy##bit(3, _src, _dest, _size); \ break; \ } \ DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \ _src += MAX_DMA_BLOCK_SIZE; \ _dest += MAX_DMA_BLOCK_SIZE; \ _size -= MAX_DMA_BLOCK_SIZE; \ } \ } #define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16) #define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32) #define Dma3FillLarge_(value, dest, size, bit) \ { \ void *_dest = dest; \ u32 _size = size; \ while (1) \ { \ if (_size <= MAX_DMA_BLOCK_SIZE) \ { \ DmaFill##bit(3, value, _dest, _size); \ break; \ } \ DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ _dest += MAX_DMA_BLOCK_SIZE; \ _size -= MAX_DMA_BLOCK_SIZE; \ } \ } #define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) #define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) // Cancel pending DMA3 requests void ClearDma3Requests(void); // Handle pending DMA3 requests void ProcessDma3Requests(void); // Copy size bytes from src to dest. // mode takes a DMA3_*BIT macro // Returns the request index s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode); // Fill size bytes at dest with value. // mode takes a DMA3_*BIT macro // Returns the request index s16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode); // index is the return value from RequestDma3* // if index = -1, will check if any request is pending // otherwise, checks if the specified request is pending // Returns -1 if pending, 0 otherwise s16 WaitDma3Request(s16 index); #endif // GUARD_DMA3_H ================================================ FILE: include/dodrio_berry_picking.h ================================================ #ifndef GUARD_DODRIO_BERRY_PICKING_H #define GUARD_DODRIO_BERRY_PICKING_H // Berries fall in predefined columns. // A total of 10 are available, though fewer will be used with < 5 players // The 11th column is a repeat of the 1st column wrapped around, so only // the values 0-9 are unique 'valid' columns #define NUM_BERRY_COLUMNS 11 struct DodrioGame_Berries { u8 ids[NUM_BERRY_COLUMNS]; u8 fallDist[NUM_BERRY_COLUMNS]; }; struct DodrioGame_PlayerCommData { u8 pickState; bool8 ALIGNED(4) ateBerry; bool8 ALIGNED(4) missedBerry; }; struct DodrioGame_Player { u8 name[16]; bool32 receivedGameStatePacket; // Never read struct DodrioGame_Berries berries; struct DodrioGame_PlayerCommData comm; u32 unused; }; // size = 0x3C // dodrio_berry_picking.c void StartDodrioBerryPicking(u16 partyId, MainCallback exitCallback); void ShowDodrioBerryPickingRecords(void); void IsDodrioInParty(void); // dodrio_berry_picking_comm.c void SendPacket_ReadyToStart(bool32 ready); bool8 RecvPacket_ReadyToStart(s32 playerId); void SendPacket_GameState(struct DodrioGame_Player *player, struct DodrioGame_PlayerCommData *player1, struct DodrioGame_PlayerCommData *player2, struct DodrioGame_PlayerCommData *player3, struct DodrioGame_PlayerCommData *player4, struct DodrioGame_PlayerCommData *player5, u8 numGraySquares, bool32 berriesFalling, bool32 allReadyToEnd); bool32 RecvPacket_GameState(u32 playerId, struct DodrioGame_Player *player, struct DodrioGame_PlayerCommData *player1, struct DodrioGame_PlayerCommData *player2, struct DodrioGame_PlayerCommData *player3, struct DodrioGame_PlayerCommData *player4, struct DodrioGame_PlayerCommData *player5, u8 *numGraySquares, bool32 *berriesFalling, bool32 *allReadyToEnd); void SendPacket_PickState(u8 pickState); bool32 RecvPacket_PickState(u32 playerId, u8 *pickState); void SendPacket_ReadyToEnd(bool32 readyToEnd); bool32 RecvPacket_ReadyToEnd(u32 playerId); #endif //GUARD_DODRIO_BERRY_PICKING_H ================================================ FILE: include/dynamic_placeholder_text_util.h ================================================ #ifndef GUARD_DYNAMIC_PLACEHOLDER_TEXT_UTIL_H #define GUARD_DYNAMIC_PLACEHOLDER_TEXT_UTIL_H #include "global.h" void DynamicPlaceholderTextUtil_Reset(void); void DynamicPlaceholderTextUtil_SetPlaceholderPtr(u8 idx, const u8 *ptr); u8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src); const u8 *DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 idx); u8 GetColorFromTextColorTable(u16 graphicId); #endif //GUARD_DYNAMIC_PLACEHOLDER_TEXT_UTIL_H ================================================ FILE: include/easy_chat.h ================================================ #ifndef GUARD_EASY_CHAT_H #define GUARD_EASY_CHAT_H #include "global.h" #include "constants/easy_chat.h" #define NUM_ALPHABET_ROWS 4 #define NUM_ALPHABET_COLUMNS 7 struct EasyChatWordInfo { const u8 *text; int alphabeticalOrder; int enabled; }; typedef union { const u16 *valueList; const struct EasyChatWordInfo *words; } EasyChatGroupWordData; struct EasyChatGroup { EasyChatGroupWordData wordData; u16 numWords; u16 numEnabledWords; }; struct EasyChatWordsByLetter { const u16 *words; int numWords; }; u8 *CopyEasyChatWord(u8 *dest, u16 word); u8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows); bool8 EC_DoesEasyChatStringFitOnLine(const u16 *easyChatWords, u8 columns, u8 rows, u16 maxLength); void InitQuestionnaireWords(void); void InitEasyChatPhrases(void); void EnableRareWord(u8); bool8 InitEasyChatSelection(void); void DestroyEasyChatSelectionData(void); u8 GetSelectedGroupByIndex(u8); void GetUnlockedECWords(bool32 isAlphabetical, u16 groupId); u16 GetDisplayedWordByIndex(u16 index); u16 GetNumDisplayedWords(void); const u8 *GetEasyChatWordGroupName(u8); u8 *CopyEasyChatWordPadded(u8 *, u16, u16); void DoEasyChatScreen(u8 type, u16 *words, MainCallback callback); u8 GetNumDisplayableGroups(void); bool8 InitEasyChatGraphicsWork(void); bool8 LoadEasyChatGraphics(void); void DestroyEasyChatGraphicsResources(void); void EasyChatInterfaceCommand_Setup(u16 id); bool8 EasyChatInterfaceCommand_Run(void); u8 GetEasyChatScreenFrameId(void); const u8 *GetTitleText(void); u16 *GetEasyChatWordBuffer(void); u8 GetNumRows(void); u8 GetNumColumns(void); u8 GetMainCursorColumn(void); u8 GetMainCursorRow(void); void GetEasyChatInstructionsText(const u8 **str1, const u8 **str2); void GetEasyChatConfirmText(const u8 **str1, const u8 **str2); void GetEasyChatConfirmCancelText(const u8 **str1, const u8 **str2); void GetEasyChatConfirmDeletionText(const u8 **str1, const u8 **str2); void GetECSelectGroupCursorCoords(u8 *Xp, u8 *Yp); bool8 IsEasyChatAlphaMode(void); u8 GetECSelectGroupRowsAbove(void); void GetECSelectWordCursorCoords(s8 *arg0, s8 *arg1); u8 GetECSelectWordRowsAbove(void); u8 GetECSelectWordNumRows(void); bool32 ShouldDrawECUpArrow(void); bool32 ShouldDrawECDownArrow(void); #endif // GUARD_EASY_CHAT_H ================================================ FILE: include/egg_hatch.h ================================================ #ifndef GUARD_EGG_HATCH_H #define GUARD_EGG_HATCH_H #include "global.h" void ScriptHatchMon(void); void EggHatch(void); u8 GetEggStepsToSubtract(void); #endif // GUARD_EGG_HATCH_H ================================================ FILE: include/ereader_helpers.h ================================================ #ifndef GUARD_EREADER_HELPERS_H #define GUARD_EREADER_HELPERS_H enum { EREADER_XFR_STATE_INIT = 0, EREADER_XFR_STATE_HANDSHAKE, EREADER_XFR_STATE_START, EREADER_XFR_STATE_TRANSFER, EREADER_XFR_STATE_TRANSFER_DONE, EREADER_XFR_STATE_CHECKSUM, EREADER_XFR_STATE_DONE }; #define EREADER_XFER_EXE 1 #define EREADER_XFER_CHK 2 #define EREADER_XFER_SHIFT 0 #define EREADER_XFER_MASK ((EREADER_XFER_EXE | EREADER_XFER_CHK) << EREADER_XFER_SHIFT) #define EREADER_CANCEL_TIMEOUT 1 #define EREADER_CANCEL_KEY 2 #define EREADER_CANCEL_SHIFT 2 #define EREADER_CANCEL_TIMEOUT_MASK (EREADER_CANCEL_TIMEOUT << EREADER_CANCEL_SHIFT) #define EREADER_CANCEL_KEY_MASK (EREADER_CANCEL_KEY << EREADER_CANCEL_SHIFT) #define EREADER_CANCEL_MASK ((EREADER_CANCEL_TIMEOUT | EREADER_CANCEL_KEY) << EREADER_CANCEL_SHIFT) #define EREADER_CHECKSUM_OK 1 #define EREADER_CHECKSUM_ERR 2 #define EREADER_CHECKSUM_SHIFT 4 #define EREADER_CHECKSUM_OK_MASK (EREADER_CHECKSUM_OK << EREADER_CHECKSUM_SHIFT) #define EREADER_CHECKSUM_MASK ((EREADER_CHECKSUM_OK | EREADER_CHECKSUM_ERR) << EREADER_CHECKSUM_SHIFT) void EReaderHelper_SerialCallback(void); void EReaderHelper_Timer3Callback(void); void EReaderHelper_SaveRegsState(void); void EReaderHelper_ClearsSendRecvMgr(void); void EReaderHelper_RestoreRegsState(void); u16 EReaderHandleTransfer(u8 mode, size_t size, const void *src, void *dest); #endif //GUARD_EREADER_HELPERS_H ================================================ FILE: include/event_data.h ================================================ #ifndef GUARD_EVENT_DATA_H #define GUARD_EVENT_DATA_H #include "global.h" extern u16 gSpecialVar_0x8000; extern u16 gSpecialVar_0x8001; extern u16 gSpecialVar_0x8002; extern u16 gSpecialVar_0x8003; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; extern u16 gSpecialVar_0x8006; extern u16 gSpecialVar_0x8007; extern u16 gSpecialVar_0x8008; extern u16 gSpecialVar_0x8009; extern u16 gSpecialVar_0x800A; extern u16 gSpecialVar_0x800B; extern u16 gSpecialVar_Facing; extern u16 gSpecialVar_Result; extern u16 gSpecialVar_LastTalked; extern u16 gSpecialVar_MonBoxId; extern u16 gSpecialVar_MonBoxPos; extern u16 gSpecialVar_TextColor; extern u16 gSpecialVar_PrevTextColor; void InitEventData(void); void ClearTempFieldEventData(void); void ClearUpperFlags(void); void DisableNationalPokedex(void); void EnableNationalPokedex(void); bool32 IsNationalPokedexEnabled(void); void DisableMysteryEvent(void); void EnableMysteryEvent(void); bool32 IsMysteryEventEnabled(void); void DisableMysteryGift(void); void EnableMysteryGift(void); bool32 IsMysteryGiftEnabled(void); void DisableResetRTC(void); void EnableResetRTC(void); bool32 CanResetRTC(void); u16 *GetVarPointer(u16 id); u16 VarGet(u16 id); bool8 VarSet(u16 id, u16 value); u8 VarGetObjectEventGraphicsId(u8 id); u8 *GetFlagPointer(u16 id); u8 FlagSet(u16 id); u8 FlagClear(u16 id); bool8 FlagGet(u16 id); u16 * GetVarPointer(u16 id); bool32 IsMysteryGiftEnabled(void); void ResetSpecialVars(void); void ClearMysteryGiftFlags(void); void ClearMysteryGiftVars(void); bool32 IsNationalPokedexEnabled(void); void EnableNationalPokedex_RSE(void); void ClearTempFieldEventData(void); u8 NuzlockeFlagSet(u8 mapsec); u8 NuzlockeFlagClear(u8 mapsec); u8 NuzlockeFlagGet(u8 mapsec); bool8 CheckMasterTrainerFlag(u16 flag); bool8 SetMasterTrainerFlag(u16 flag); bool8 ClearMasterTrainerFlag(u16 flag); #endif // GUARD_EVENT_DATA_H ================================================ FILE: include/event_object_lock.h ================================================ #ifndef GUARD_EVENT_OBJECT_LOCK_H #define GUARD_EVENT_OBJECT_LOCK_H #include "global.h" bool8 IsFreezePlayerFinished(void); void FreezeObjects_WaitForPlayer(void); bool8 IsFreezeSelectedObjectAndPlayerFinished(void); void FreezeObjects_WaitForPlayerAndSelected(void); void ClearPlayerHeldMovementAndUnfreezeObjectEvents(void); bool8 walkrun_is_standing_still(void); void UnionRoom_UnlockPlayerAndChatPartner(void); #endif // GUARD_EVENT_OBJECT_LOCK_H ================================================ FILE: include/event_object_movement.h ================================================ #ifndef GUARD_EVENT_OBJECT_MOVEMENT_H #define GUARD_EVENT_OBJECT_MOVEMENT_H // Palette slots for overworld NPCs. // The same standard set of palettes for overworld objects are normally always loaded at the same // time while walking around the overworld. The only exceptions are the palettes for the player and // the "special" NPC, which can be swapped out. This also means that e.g. two "special" NPCs // with competing palettes cannot be properly loaded at the same time. enum { PALSLOT_PLAYER, PALSLOT_PLAYER_REFLECTION, PALSLOT_NPC_1, PALSLOT_NPC_2, PALSLOT_NPC_3, PALSLOT_NPC_4, PALSLOT_NPC_1_REFLECTION, PALSLOT_NPC_2_REFLECTION, PALSLOT_NPC_3_REFLECTION, PALSLOT_NPC_4_REFLECTION, PALSLOT_NPC_SPECIAL, PALSLOT_NPC_SPECIAL_REFLECTION, OBJ_PALSLOT_COUNT // the remaining sprite palette slots (12-15) are used by field effects, the interface, etc. }; enum SpinnerRunnerFollowPatterns { RUNFOLLOW_ANY, RUNFOLLOW_NORTH_SOUTH, RUNFOLLOW_EAST_WEST, RUNFOLLOW_NORTH_WEST, RUNFOLLOW_NORTH_EAST, RUNFOLLOW_SOUTH_WEST, RUNFOLLOW_SOUTH_EAST, RUNFOLLOW_NORTH_SOUTH_WEST, RUNFOLLOW_NORTH_SOUTH_EAST, RUNFOLLOW_NORTH_EAST_WEST, RUNFOLLOW_SOUTH_EAST_WEST }; struct StepAnimTable { const union AnimCmd *const *anims; u8 animPos[4]; }; typedef void (*MovementAction)(u8 direction); #define GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN (1 << 0) #define GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE (1 << 1) #define GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN (1 << 2) #define GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE (1 << 3) #define GROUND_EFFECT_FLAG_ICE_REFLECTION (1 << 4) #define GROUND_EFFECT_FLAG_REFLECTION (1 << 5) #define GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER (1 << 6) #define GROUND_EFFECT_FLAG_SAND (1 << 7) #define GROUND_EFFECT_FLAG_DEEP_SAND (1 << 8) #define GROUND_EFFECT_FLAG_RIPPLES (1 << 9) #define GROUND_EFFECT_FLAG_PUDDLE (1 << 10) #define GROUND_EFFECT_FLAG_SAND_PILE (1 << 11) #define GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS (1 << 12) #define GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS (1 << 13) #define GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER (1 << 14) #define GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER (1 << 15) #define GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND (1 << 16) #define GROUND_EFFECT_FLAG_SHORT_GRASS (1 << 17) #define GROUND_EFFECT_FLAG_HOT_SPRINGS (1 << 18) #define GROUND_EFFECT_FLAG_SEAWEED (1 << 19) struct PairedPalettes { u16 tag; const u16 *data; }; // Exported RAM declarations // Exported ROM declarations u8 GetObjectEventIdByLocalIdAndMap(u8, u8, u8); bool8 TryGetObjectEventIdByLocalIdAndMap(u8, u8, u8, u8 *); u8 GetObjectEventIdByXY(s16, s16); void SetObjectEventDirection(struct ObjectEvent *, u8); void RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup); u16 GetBoulderRevealFlagByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup); void LoadPlayerObjectReflectionPalette(u16, u8); void LoadSpecialObjectReflectionPalette(u16, u8); void TryMoveObjectEventToMapCoords(u8, u8, u8, s16, s16); void PatchObjectPalette(u16, u8); void SpawnObjectEventsOnReturnToField(s16 x, s16 y); void GetMapCoordsFromSpritePos(s16, s16, s16 *, s16 *); u8 GetFaceDirectionAnimNum(u8); void SetSpritePosToOffsetMapCoords(s16 *, s16 *, s16, s16); void ObjectEventClearHeldMovement(struct ObjectEvent *); void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *); u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction); u8 CreateObjectGraphicsSprite(u16 graphicsId, SpriteCallback callback, s16 x, s16 y, u8 subpriority); u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup); int SpawnSpecialObjectEventParameterized(u8, u8, u8, s16, s16, u8); u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *); void CameraObjectReset1(void); void CameraObjectReset2(void); void ObjectEventSetGraphicsId(struct ObjectEvent *, u8); void ObjectEventTurn(struct ObjectEvent *, u8); void ObjectEventTurnByLocalIdAndMap(u8, u8, u8, u8); void ObjectEventForceSetHeldMovement(struct ObjectEvent *, u8); const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8); void SetObjectInvisibility(u8 localId, u8 mapNum, u8 mapGroup, u8 state); void FreeAndReserveObjectSpritePalettes(void); void SetObjectPositionByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); void ResetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup); void SetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority); void ObjectEventGetLocalIdAndMap(struct ObjectEvent *objectEvent, void *localId, void *mapNum, void *mapGroup); void ShiftObjectEventCoords(struct ObjectEvent *, s16, s16); void TryOverrideObjectEventTemplateCoords(u8, u8, u8); void UpdateObjectEventCurrentMovement(struct ObjectEvent *, struct Sprite *, bool8(struct ObjectEvent *, struct Sprite *)); u8 ObjectEventFaceOppositeDirection(struct ObjectEvent *, u8); u8 GetOppositeDirection(u8); u8 GetWalkInPlaceFasterMovementAction(u32); u8 GetStepInPlaceDelay8AnimId(u32); u8 GetWalkInPlaceNormalMovementAction(u32); u8 GetWalkInPlaceSlowMovementAction(u32); u8 GetWalkInPlaceFastMovementAction(u32); u8 GetCollisionAtCoords(struct ObjectEvent *, s16, s16, u32); void MoveCoords(u8, s16 *, s16 *); bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *); u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *); u8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation); void QL_UpdateObjectEventCurrentMovement(struct ObjectEvent *, struct Sprite *); bool8 ObjectEventSetHeldMovement(struct ObjectEvent *, u8); void ShiftStillObjectEventCoords(struct ObjectEvent *); void OverrideMovementTypeForObjectEvent(const struct ObjectEvent *, u8); void SetTrainerMovementType(struct ObjectEvent *, u8); u8 GetFishingDirectionAnimNum(u8 direction); u8 GetFishingNoCatchDirectionAnimNum(u8 a0); void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 a1); u8 CreateFameCheckerObject(u8 graphicsId, u8 localId, s16 x, s16 y); void InitObjectEventPalettes(u8 mode); bool8 ObjectEventIsMovementOverridden(struct ObjectEvent *objectEvent); u8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent); u8 GetWalkNormalMovementAction(u32); u8 GetWalkFastMovementAction(u32); u8 GetWalkFasterMovementAction(u32); u8 GetWalkSlowerMovementAction(u32 direction); u8 GetTrainerFacingDirectionMovementType(u8 direction); u8 GetFaceDirectionMovementAction(u32); u8 GetFaceDirectionFastMovementAction(u32); void CameraObjectSetFollowedObjectId(u8 objectId); void UnfreezeObjectEvents(void); u8 GetSlideMovementAction(u32); u8 GetJumpInPlaceMovementAction(u32); u8 GetJumpMovementAction(u32); u8 GetJump2MovementAction(u32); bool8 UpdateWalkSlowerAnim(struct Sprite *sprite); void SetJumpSpriteData(struct Sprite *, u8, u8, u8); u8 DoJumpSpriteMovement(struct Sprite *); u8 DoJumpSpecialSpriteMovement(struct Sprite *); void TurnVirtualObject(u8 virtualObjId, u8 direction); const u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId); u8 GetFirstInactiveObjectEventId(void); u8 GetCollisionFlagsAtCoords(struct ObjectEvent * objectEvent, s16 x, s16 y, u8 direction); void OverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent); void CancelPlayerForcedMovement(void); void FreezeObjectEvents(void); bool8 FreezeObjectEvent(struct ObjectEvent *); void UnfreezeObjectEvent(struct ObjectEvent *); void FreezeObjectEventsExceptOne(u8 objEventId); void SetVirtualObjectGraphics(u8 virtualObjId, u8 direction); void SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible); bool32 IsVirtualObjectInvisible(u8 virtualObjId); void SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNo); bool32 IsVirtualObjectAnimating(u8 virtualObjId); u8 GetJumpSpecialMovementAction(u32 direction); void EnableObjectGroundEffectsByXY(s16 x, s16 y); void MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y); u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); u16 GetObjectPaletteTag(u8 paletteIndex); void SetSpritePosToMapCoords(s16 x, s16 y, s16 *x2, s16 *y2); void UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible); u8 ElevationToPriority(u8 elevation); void ObjectEventUpdateElevation(struct ObjectEvent *pObject); void SetObjectSubpriorityByElevation(u8 elevation, struct Sprite *sprite, u8 offset); void CopyObjectGraphicsInfoToSpriteTemplate(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables); u8 AddCameraObject(u8 trackedSpriteId); void UpdateObjectEventsForCameraUpdate(s16 x, s16 y); void SpriteCB_VirtualObject(struct Sprite *); void SetMovementDelay(struct Sprite *, s16); bool8 WaitForMovementDelay(struct Sprite *); void SetSpriteDataForNormalStep(struct Sprite *, u8, u8); bool8 NpcTakeStep(struct Sprite *sprite); void SetWalkSlowerSpriteData(struct Sprite *, u8); void SetWalkSlowestSpriteData(struct Sprite *, u8); bool8 UpdateWalkSlowestAnim(struct Sprite *sprite); void SetWalkSlowSpriteData(struct Sprite *, u8); bool8 UpdateWalkSlowAnim(struct Sprite *sprite); void DoShadowFieldEffect(struct ObjectEvent *); void SetRunSlowSpriteData(struct Sprite *, u8); bool8 UpdateRunSlowAnim(struct Sprite *sprite); void SetAndStartSpriteAnim(struct Sprite *, u8, u8); bool8 SpriteAnimEnded(struct Sprite *); u8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent); u8 GetMoveDirectionAnimNum(u8 direction); void RemoveObjectEvent(struct ObjectEvent *objectEvent); u8 Unref_TryInitLocalObjectEvent(u8 localId); void SetObjectMovementType(u16 localId, u8 movementType); // Exported data declarations extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[]; extern const struct SpritePalette gSpritePalette_GeneralFieldEffect1; extern const struct SpriteTemplate * const gFieldEffectObjectTemplatePointers[]; extern const struct OamData gObjectEventBaseOam_32x32; extern const u16 gFieldEffectObjectPic_CutGrass[]; extern const u16 gFieldEffectPal_CutGrass[]; extern const u8 gReflectionEffectPaletteMap[]; u8 GetLedgeJumpDirection(s16 x, s16 y, u8 direction); u8 GetGlideMovementAction(u32 direction); u8 GetRideWaterCurrentMovementAction(u32 direction); u8 GetPlayerRunMovementAction(u32 direction); u8 GetPlayerRunSlowMovementAction(u32 direction); u8 GetWalkSlowMovementAction(u32 direction); u8 GetSpinMovementAction(u32 direction); u8 GetAcroWheelieFaceDirectionMovementAction(u32 direction); u8 GetAcroPopWheelieFaceDirectionMovementAction(u32 direction); u8 GetAcroEndWheelieFaceDirectionMovementAction(u32 direction); u8 GetAcroWheelieHopFaceDirectionMovementAction(u32 direction); u8 GetAcroWheelieHopMovementAction(u32 direction); u8 GetAcroPopWheelieMoveMovementAction(u32 direction); u8 GetAcroWheelieJumpMovementAction(u32 direction); u8 GetJumpInPlaceTurnAroundMovementAction(u32 direction); u8 GetAcroWheelieInPlaceMovementAction(u32 direction); u8 GetAcroPopWheelieMoveMovementAction(u32 direction); u8 GetAcroWheelieMoveMovementAction(u32 direction); u8 GetJumpSpecialWithEffectMovementAction(u32 direction); u8 GetFishingBiteDirectionAnimNum(u8 direction); void TrySpawnObjectEvents(s16 cameraX, s16 cameraY); void ResetObjectEvents(void); #endif // GUARD_EVENT_OBJECT_MOVEMENT_H ================================================ FILE: include/event_scripts.h ================================================ // // Created by scott on 9/12/2017. // #ifndef GUARD_EVENT_SCRIPTS_H #define GUARD_EVENT_SCRIPTS_H #include "global.h" extern const u8 gTVBravoTrainerText00[]; extern const u8 gTVBravoTrainerText01[]; extern const u8 gTVBravoTrainerText02[]; extern const u8 gTVBravoTrainerText03[]; extern const u8 gTVBravoTrainerText04[]; extern const u8 gTVBravoTrainerText05[]; extern const u8 gTVBravoTrainerText06[]; extern const u8 gTVBravoTrainerText07[]; extern const u8 gTVBravoTrainerText08[]; extern const u8 gTVBravoTrainerBattleTowerText00[]; extern const u8 gTVBravoTrainerBattleTowerText01[]; extern const u8 gTVBravoTrainerBattleTowerText02[]; extern const u8 gTVBravoTrainerBattleTowerText03[]; extern const u8 gTVBravoTrainerBattleTowerText04[]; extern const u8 gTVBravoTrainerBattleTowerText05[]; extern const u8 gTVBravoTrainerBattleTowerText06[]; extern const u8 gTVBravoTrainerBattleTowerText07[]; extern const u8 gTVBravoTrainerBattleTowerText08[]; extern const u8 gTVBravoTrainerBattleTowerText09[]; extern const u8 gTVBravoTrainerBattleTowerText10[]; extern const u8 gTVBravoTrainerBattleTowerText11[]; extern const u8 gTVBravoTrainerBattleTowerText12[]; extern const u8 gTVBravoTrainerBattleTowerText13[]; extern const u8 gTVBravoTrainerBattleTowerText14[]; extern const u8 gTVFanClubOpinionsText00[]; extern const u8 gTVFanClubOpinionsText01[]; extern const u8 gTVFanClubOpinionsText02[]; extern const u8 gTVFanClubOpinionsText03[]; extern const u8 gTVFanClubOpinionsText04[]; extern const u8 gTVFanClubText00[]; extern const u8 gTVFanClubText01[]; extern const u8 gTVFanClubText02[]; extern const u8 gTVFanClubText03[]; extern const u8 gTVFanClubText04[]; extern const u8 gTVFanClubText05[]; extern const u8 gTVFanClubText06[]; extern const u8 gTVFanClubText07[]; extern const u8 gTVRecentHappeningsText00[]; extern const u8 gTVRecentHappeningsText01[]; extern const u8 gTVRecentHappeningsText02[]; extern const u8 gTVRecentHappeningsText03[]; extern const u8 gTVRecentHappeningsText04[]; extern const u8 gTVRecentHappeningsText05[]; extern const u8 gTVMassOutbreakText00[]; extern const u8 gTV3CheersForPokeblocksText00[]; extern const u8 gTV3CheersForPokeblocksText01[]; extern const u8 gTV3CheersForPokeblocksText02[]; extern const u8 gTV3CheersForPokeblocksText03[]; extern const u8 gTV3CheersForPokeblocksText04[]; extern const u8 gTV3CheersForPokeblocksText05[]; extern const u8 gTVTrainerFanClubSpecialText00[]; extern const u8 gTVTrainerFanClubSpecialText01[]; extern const u8 gTVTrainerFanClubSpecialText02[]; extern const u8 gTVTrainerFanClubSpecialText03[]; extern const u8 gTVTrainerFanClubSpecialText04[]; extern const u8 gTVTrainerFanClubSpecialText05[]; extern const u8 gTVNameRaterText00[]; extern const u8 gTVNameRaterText01[]; extern const u8 gTVNameRaterText02[]; extern const u8 gTVNameRaterText03[]; extern const u8 gTVNameRaterText04[]; extern const u8 gTVNameRaterText05[]; extern const u8 gTVNameRaterText06[]; extern const u8 gTVNameRaterText07[]; extern const u8 gTVNameRaterText08[]; extern const u8 gTVNameRaterText09[]; extern const u8 gTVNameRaterText10[]; extern const u8 gTVNameRaterText11[]; extern const u8 gTVNameRaterText12[]; extern const u8 gTVNameRaterText13[]; extern const u8 gTVNameRaterText14[]; extern const u8 gTVNameRaterText15[]; extern const u8 gTVNameRaterText16[]; extern const u8 gTVNameRaterText17[]; extern const u8 gTVNameRaterText18[]; extern const u8 gTVPokemonAnglerText00[]; extern const u8 gTVPokemonAnglerText01[]; extern const u8 gTVPokemonTodayFailedText00[]; extern const u8 gTVPokemonTodayFailedText01[]; extern const u8 gTVPokemonTodayFailedText02[]; extern const u8 gTVPokemonTodayFailedText03[]; extern const u8 gTVPokemonTodayFailedText04[]; extern const u8 gTVPokemonTodayFailedText05[]; extern const u8 gTVPokemonTodayFailedText06[]; extern const u8 gTVPokemonTodaySuccessfulText00[]; extern const u8 gTVPokemonTodaySuccessfulText01[]; extern const u8 gTVPokemonTodaySuccessfulText02[]; extern const u8 gTVPokemonTodaySuccessfulText03[]; extern const u8 gTVPokemonTodaySuccessfulText04[]; extern const u8 gTVPokemonTodaySuccessfulText05[]; extern const u8 gTVPokemonTodaySuccessfulText06[]; extern const u8 gTVPokemonTodaySuccessfulText07[]; extern const u8 gTVPokemonTodaySuccessfulText08[]; extern const u8 gTVPokemonTodaySuccessfulText09[]; extern const u8 gTVPokemonTodaySuccessfulText10[]; extern const u8 gTVPokemonTodaySuccessfulText11[]; extern const u8 gTVTodaysSmartShopperText00[]; extern const u8 gTVTodaysSmartShopperText01[]; extern const u8 gTVTodaysSmartShopperText02[]; extern const u8 gTVTodaysSmartShopperText03[]; extern const u8 gTVTodaysSmartShopperText04[]; extern const u8 gTVTodaysSmartShopperText05[]; extern const u8 gTVTodaysSmartShopperText06[]; extern const u8 gTVTodaysSmartShopperText07[]; extern const u8 gTVTodaysSmartShopperText08[]; extern const u8 gTVTodaysSmartShopperText09[]; extern const u8 gTVTodaysSmartShopperText10[]; extern const u8 gTVTodaysSmartShopperText11[]; extern const u8 gTVTodaysSmartShopperText12[]; extern const u8 gTVWorldOfMastersText00[]; extern const u8 gTVWorldOfMastersText01[]; extern const u8 gTVWorldOfMastersText02[]; extern const u8 gTVTodaysRivalTrainerText00[]; extern const u8 gTVTodaysRivalTrainerText07[]; extern const u8 gTVTodaysRivalTrainerText08[]; extern const u8 gTVTodaysRivalTrainerText09[]; extern const u8 gTVTodaysRivalTrainerText10[]; extern const u8 gTVTodaysRivalTrainerText01[]; extern const u8 gTVTodaysRivalTrainerText02[]; extern const u8 gTVTodaysRivalTrainerText03[]; extern const u8 gTVTodaysRivalTrainerText04[]; extern const u8 gTVTodaysRivalTrainerText05[]; extern const u8 gTVTodaysRivalTrainerText06[]; extern const u8 gTVDewfordTrendWatcherNetworkText00[]; extern const u8 gTVDewfordTrendWatcherNetworkText01[]; extern const u8 gTVDewfordTrendWatcherNetworkText02[]; extern const u8 gTVDewfordTrendWatcherNetworkText03[]; extern const u8 gTVDewfordTrendWatcherNetworkText04[]; extern const u8 gTVDewfordTrendWatcherNetworkText05[]; extern const u8 gTVDewfordTrendWatcherNetworkText06[]; extern const u8 gTVHoennTreasureInvestigatorsText00[]; extern const u8 gTVHoennTreasureInvestigatorsText01[]; extern const u8 gTVHoennTreasureInvestigatorsText02[]; extern const u8 gTVFindThatGamerText00[]; extern const u8 gTVFindThatGamerText01[]; extern const u8 gTVFindThatGamerText02[]; extern const u8 gTVFindThatGamerText03[]; extern const u8 gTVBreakingNewsText00[]; extern const u8 gTVBreakingNewsText01[]; extern const u8 gTVBreakingNewsText02[]; extern const u8 gTVBreakingNewsText03[]; extern const u8 gTVBreakingNewsText04[]; extern const u8 gTVBreakingNewsText05[]; extern const u8 gTVBreakingNewsText06[]; extern const u8 gTVBreakingNewsText07[]; extern const u8 gTVBreakingNewsText12[]; extern const u8 gTVBreakingNewsText08[]; extern const u8 gTVBreakingNewsText09[]; extern const u8 gTVBreakingNewsText10[]; extern const u8 gTVBreakingNewsText11[]; extern const u8 gTVSecretBaseVisitText00[]; extern const u8 gTVSecretBaseVisitText01[]; extern const u8 gTVSecretBaseVisitText02[]; extern const u8 gTVSecretBaseVisitText03[]; extern const u8 gTVSecretBaseVisitText04[]; extern const u8 gTVSecretBaseVisitText05[]; extern const u8 gTVSecretBaseVisitText06[]; extern const u8 gTVSecretBaseVisitText07[]; extern const u8 gTVSecretBaseVisitText08[]; extern const u8 gTVSecretBaseVisitText09[]; extern const u8 gTVSecretBaseVisitText10[]; extern const u8 gTVSecretBaseVisitText11[]; extern const u8 gTVSecretBaseVisitText12[]; extern const u8 gTVSecretBaseVisitText13[]; extern const u8 gTVPokemonLotteryWinnerFlashReportText00[]; extern const u8 gTVThePokemonBattleSeminarText00[]; extern const u8 gTVThePokemonBattleSeminarText01[]; extern const u8 gTVThePokemonBattleSeminarText02[]; extern const u8 gTVThePokemonBattleSeminarText03[]; extern const u8 gTVThePokemonBattleSeminarText04[]; extern const u8 gTVThePokemonBattleSeminarText05[]; extern const u8 gTVThePokemonBattleSeminarText06[]; extern const u8 gTVTrainerFanClubText00[]; extern const u8 gTVTrainerFanClubText01[]; extern const u8 gTVTrainerFanClubText02[]; extern const u8 gTVTrainerFanClubText03[]; extern const u8 gTVTrainerFanClubText04[]; extern const u8 gTVTrainerFanClubText05[]; extern const u8 gTVTrainerFanClubText06[]; extern const u8 gTVTrainerFanClubText07[]; extern const u8 gTVTrainerFanClubText08[]; extern const u8 gTVTrainerFanClubText09[]; extern const u8 gTVTrainerFanClubText10[]; extern const u8 gTVTrainerFanClubText11[]; extern const u8 gTVCutiesText00[]; extern const u8 gTVCutiesText01[]; extern const u8 gTVCutiesText02[]; extern const u8 gTVCutiesText03[]; extern const u8 gTVCutiesText04[]; extern const u8 gTVCutiesText05[]; extern const u8 gTVCutiesText06[]; extern const u8 gTVCutiesText07[]; extern const u8 gTVCutiesText08[]; extern const u8 gTVCutiesText09[]; extern const u8 gTVCutiesText10[]; extern const u8 gTVCutiesText11[]; extern const u8 gTVCutiesText12[]; extern const u8 gTVCutiesText13[]; extern const u8 gTVCutiesText14[]; extern const u8 gTVCutiesText15[]; extern const u8 gTVPokemonNewsBattleFrontierText00[]; extern const u8 gTVPokemonNewsBattleFrontierText01[]; extern const u8 gTVPokemonNewsBattleFrontierText02[]; extern const u8 gTVPokemonNewsBattleFrontierText03[]; extern const u8 gTVPokemonNewsBattleFrontierText04[]; extern const u8 gTVPokemonNewsBattleFrontierText05[]; extern const u8 gTVPokemonNewsBattleFrontierText06[]; extern const u8 gTVPokemonNewsBattleFrontierText07[]; extern const u8 gTVPokemonNewsBattleFrontierText08[]; extern const u8 gTVPokemonNewsBattleFrontierText09[]; extern const u8 gTVPokemonNewsBattleFrontierText10[]; extern const u8 gTVPokemonNewsBattleFrontierText11[]; extern const u8 gTVPokemonNewsBattleFrontierText12[]; extern const u8 gTVPokemonNewsBattleFrontierText13[]; extern const u8 gTVPokemonNewsBattleFrontierText14[]; extern const u8 gTVPokemonNewsBattleFrontierText15[]; extern const u8 gTVPokemonNewsBattleFrontierText16[]; extern const u8 gTVPokemonNewsBattleFrontierText17[]; extern const u8 gTVPokemonNewsBattleFrontierText18[]; extern const u8 gTVWhatsNo1InHoennTodayText00[]; extern const u8 gTVWhatsNo1InHoennTodayText01[]; extern const u8 gTVWhatsNo1InHoennTodayText02[]; extern const u8 gTVWhatsNo1InHoennTodayText03[]; extern const u8 gTVWhatsNo1InHoennTodayText04[]; extern const u8 gTVWhatsNo1InHoennTodayText05[]; extern const u8 gTVWhatsNo1InHoennTodayText06[]; extern const u8 gTVWhatsNo1InHoennTodayText07[]; extern const u8 gTVWhatsNo1InHoennTodayText08[]; extern const u8 gTVSecretBaseSecretsText00[]; extern const u8 gTVSecretBaseSecretsText01[]; extern const u8 gTVSecretBaseSecretsText02[]; extern const u8 gTVSecretBaseSecretsText03[]; extern const u8 gTVSecretBaseSecretsText04[]; extern const u8 gTVSecretBaseSecretsText05[]; extern const u8 gTVSecretBaseSecretsText06[]; extern const u8 gTVSecretBaseSecretsText07[]; extern const u8 gTVSecretBaseSecretsText08[]; extern const u8 gTVSecretBaseSecretsText09[]; extern const u8 gTVSecretBaseSecretsText10[]; extern const u8 gTVSecretBaseSecretsText11[]; extern const u8 gTVSecretBaseSecretsText12[]; extern const u8 gTVSecretBaseSecretsText13[]; extern const u8 gTVSecretBaseSecretsText14[]; extern const u8 gTVSecretBaseSecretsText15[]; extern const u8 gTVSecretBaseSecretsText16[]; extern const u8 gTVSecretBaseSecretsText17[]; extern const u8 gTVSecretBaseSecretsText18[]; extern const u8 gTVSecretBaseSecretsText19[]; extern const u8 gTVSecretBaseSecretsText20[]; extern const u8 gTVSecretBaseSecretsText21[]; extern const u8 gTVSecretBaseSecretsText22[]; extern const u8 gTVSecretBaseSecretsText23[]; extern const u8 gTVSecretBaseSecretsText24[]; extern const u8 gTVSecretBaseSecretsText25[]; extern const u8 gTVSecretBaseSecretsText26[]; extern const u8 gTVSecretBaseSecretsText27[]; extern const u8 gTVSecretBaseSecretsText28[]; extern const u8 gTVSecretBaseSecretsText29[]; extern const u8 gTVSecretBaseSecretsText30[]; extern const u8 gTVSecretBaseSecretsText31[]; extern const u8 gTVSecretBaseSecretsText32[]; extern const u8 gTVSecretBaseSecretsText33[]; extern const u8 gTVSecretBaseSecretsText34[]; extern const u8 gTVSecretBaseSecretsText35[]; extern const u8 gTVSecretBaseSecretsText36[]; extern const u8 gTVSecretBaseSecretsText37[]; extern const u8 gTVSecretBaseSecretsText38[]; extern const u8 gTVSecretBaseSecretsText39[]; extern const u8 gTVSecretBaseSecretsText40[]; extern const u8 gTVSecretBaseSecretsText41[]; extern const u8 gTVSecretBaseSecretsText42[]; extern const u8 gTVSafariFanClubText00[]; extern const u8 gTVSafariFanClubText01[]; extern const u8 gTVSafariFanClubText02[]; extern const u8 gTVSafariFanClubText03[]; extern const u8 gTVSafariFanClubText04[]; extern const u8 gTVSafariFanClubText05[]; extern const u8 gTVSafariFanClubText06[]; extern const u8 gTVSafariFanClubText07[]; extern const u8 gTVSafariFanClubText08[]; extern const u8 gTVSafariFanClubText09[]; extern const u8 gTVSafariFanClubText10[]; extern const u8 gTVContestLiveUpdatesText00[]; extern const u8 gTVContestLiveUpdatesText01[]; extern const u8 gTVContestLiveUpdatesText02[]; extern const u8 gTVContestLiveUpdatesText03[]; extern const u8 gTVContestLiveUpdatesText04[]; extern const u8 gTVContestLiveUpdatesText05[]; extern const u8 gTVContestLiveUpdatesText06[]; extern const u8 gTVContestLiveUpdatesText07[]; extern const u8 gTVContestLiveUpdatesText08[]; extern const u8 gTVContestLiveUpdatesText09[]; extern const u8 gTVContestLiveUpdatesText10[]; extern const u8 gTVContestLiveUpdatesText11[]; extern const u8 gTVContestLiveUpdatesText12[]; extern const u8 gTVContestLiveUpdatesText13[]; extern const u8 gTVContestLiveUpdatesText14[]; extern const u8 gTVContestLiveUpdatesText15[]; extern const u8 gTVContestLiveUpdatesText16[]; extern const u8 gTVContestLiveUpdatesText17[]; extern const u8 gTVContestLiveUpdatesText18[]; extern const u8 gTVContestLiveUpdatesText19[]; extern const u8 gTVContestLiveUpdatesText20[]; extern const u8 gTVContestLiveUpdatesText21[]; extern const u8 gTVContestLiveUpdatesText22[]; extern const u8 gTVContestLiveUpdatesText23[]; extern const u8 gTVContestLiveUpdatesText24[]; extern const u8 gTVContestLiveUpdatesText25[]; extern const u8 gTVContestLiveUpdatesText26[]; extern const u8 gTVContestLiveUpdatesText27[]; extern const u8 gTVContestLiveUpdatesText28[]; extern const u8 gTVContestLiveUpdatesText29[]; extern const u8 gTVContestLiveUpdatesText30[]; extern const u8 gTVContestLiveUpdatesText31[]; extern const u8 gTVContestLiveUpdatesText32[]; extern const u8 gTVPokemonBattleUpdateText00[]; extern const u8 gTVPokemonBattleUpdateText01[]; extern const u8 gTVPokemonBattleUpdateText02[]; extern const u8 gTVPokemonBattleUpdateText03[]; extern const u8 gTVPokemonBattleUpdateText04[]; extern const u8 gTVPokemonBattleUpdateText05[]; extern const u8 gTVPokemonBattleUpdateText06[]; extern const u8 gTVPokemonBattleUpdateText07[]; extern const u8 gTVInSearchOfTrainersText00[]; extern const u8 gTVInSearchOfTrainersText01[]; extern const u8 gTVInSearchOfTrainersText02[]; extern const u8 gTVInSearchOfTrainersText03[]; extern const u8 gTVInSearchOfTrainersText04[]; extern const u8 gTVInSearchOfTrainersText05[]; extern const u8 gTVInSearchOfTrainersText06[]; extern const u8 gTVInSearchOfTrainersText07[]; extern const u8 gTVInSearchOfTrainersText08[]; extern const u8 gTVPokemonContestLiveUpdates2Text00[]; extern const u8 gTVPokemonContestLiveUpdates2Text01[]; extern const u8 gTVPokemonContestLiveUpdates2Text02[]; extern const u8 gTVPokemonContestLiveUpdates2Text03[]; extern const u8 gPokeNewsTextSlateport_Upcoming[]; extern const u8 gPokeNewsTextSlateport_Ongoing[]; extern const u8 gPokeNewsTextSlateport_Ending[]; extern const u8 gPokeNewsTextGameCorner_Upcoming[]; extern const u8 gPokeNewsTextGameCorner_Ongoing[]; extern const u8 gPokeNewsTextGameCorner_Ending[]; extern const u8 gPokeNewsTextLilycove_Upcoming[]; extern const u8 gPokeNewsTextLilycove_Ongoing[]; extern const u8 gPokeNewsTextLilycove_Ending[]; extern const u8 gPokeNewsTextBlendMaster_Upcoming[]; extern const u8 gPokeNewsTextBlendMaster_Ongoing[]; extern const u8 gPokeNewsTextBlendMaster_Ending[]; extern const u8 gText_LtSurge[]; extern const u8 gText_Koga[]; extern const u8 gText_PokemonCenter[]; // vs_seeker extern const u8 VSSeeker_Text_BatteryNotChargedNeedXSteps[]; extern const u8 VSSeeker_Text_NoTrainersWithinRange[]; extern const u8 VSSeeker_Text_TrainersNotReady[]; // fame_checker extern const u8 gFameCheckerFlavorText_ProfOak0[]; extern const u8 gFameCheckerFlavorText_ProfOak1[]; extern const u8 gFameCheckerFlavorText_ProfOak2[]; extern const u8 gFameCheckerFlavorText_ProfOak3[]; extern const u8 gFameCheckerFlavorText_ProfOak4[]; extern const u8 gFameCheckerFlavorText_ProfOak5[]; extern const u8 gFameCheckerFlavorText_Daisy0[]; extern const u8 gFameCheckerFlavorText_Daisy1[]; extern const u8 gFameCheckerFlavorText_Daisy2[]; extern const u8 gFameCheckerFlavorText_Daisy3[]; extern const u8 gFameCheckerFlavorText_Daisy4[]; extern const u8 gFameCheckerFlavorText_Daisy5[]; extern const u8 gFameCheckerFlavorText_Brock0[]; extern const u8 gFameCheckerFlavorText_Brock1[]; extern const u8 gFameCheckerFlavorText_Brock2[]; extern const u8 gFameCheckerFlavorText_Brock3[]; extern const u8 gFameCheckerFlavorText_Brock4[]; extern const u8 gFameCheckerFlavorText_Brock5[]; extern const u8 gFameCheckerFlavorText_Misty0[]; extern const u8 gFameCheckerFlavorText_Misty1[]; extern const u8 gFameCheckerFlavorText_Misty2[]; extern const u8 gFameCheckerFlavorText_Misty3[]; extern const u8 gFameCheckerFlavorText_Misty4[]; extern const u8 gFameCheckerFlavorText_Misty5[]; extern const u8 gFameCheckerFlavorText_LtSurge0[]; extern const u8 gFameCheckerFlavorText_LtSurge1[]; extern const u8 gFameCheckerFlavorText_LtSurge2[]; extern const u8 gFameCheckerFlavorText_LtSurge3[]; extern const u8 gFameCheckerFlavorText_LtSurge4[]; extern const u8 gFameCheckerFlavorText_LtSurge5[]; extern const u8 gFameCheckerFlavorText_Erika0[]; extern const u8 gFameCheckerFlavorText_Erika1[]; extern const u8 gFameCheckerFlavorText_Erika2[]; extern const u8 gFameCheckerFlavorText_Erika3[]; extern const u8 gFameCheckerFlavorText_Erika4[]; extern const u8 gFameCheckerFlavorText_Erika5[]; extern const u8 gFameCheckerFlavorText_Koga0[]; extern const u8 gFameCheckerFlavorText_Koga1[]; extern const u8 gFameCheckerFlavorText_Koga2[]; extern const u8 gFameCheckerFlavorText_Koga3[]; extern const u8 gFameCheckerFlavorText_Koga4[]; extern const u8 gFameCheckerFlavorText_Koga5[]; extern const u8 gFameCheckerFlavorText_Sabrina0[]; extern const u8 gFameCheckerFlavorText_Sabrina1[]; extern const u8 gFameCheckerFlavorText_Sabrina2[]; extern const u8 gFameCheckerFlavorText_Sabrina3[]; extern const u8 gFameCheckerFlavorText_Sabrina4[]; extern const u8 gFameCheckerFlavorText_Sabrina5[]; extern const u8 gFameCheckerFlavorText_Blaine0[]; extern const u8 gFameCheckerFlavorText_Blaine1[]; extern const u8 gFameCheckerFlavorText_Blaine2[]; extern const u8 gFameCheckerFlavorText_Blaine3[]; extern const u8 gFameCheckerFlavorText_Blaine4[]; extern const u8 gFameCheckerFlavorText_Blaine5[]; extern const u8 gFameCheckerFlavorText_Lorelei0[]; extern const u8 gFameCheckerFlavorText_Lorelei1[]; extern const u8 gFameCheckerFlavorText_Lorelei2[]; extern const u8 gFameCheckerFlavorText_Lorelei3[]; extern const u8 gFameCheckerFlavorText_Lorelei4[]; extern const u8 gFameCheckerFlavorText_Lorelei5[]; extern const u8 gFameCheckerFlavorText_Bruno0[]; extern const u8 gFameCheckerFlavorText_Bruno1[]; extern const u8 gFameCheckerFlavorText_Bruno2[]; extern const u8 gFameCheckerFlavorText_Bruno3[]; extern const u8 gFameCheckerFlavorText_Bruno4[]; extern const u8 gFameCheckerFlavorText_Bruno5[]; extern const u8 gFameCheckerFlavorText_Agatha0[]; extern const u8 gFameCheckerFlavorText_Agatha1[]; extern const u8 gFameCheckerFlavorText_Agatha2[]; extern const u8 gFameCheckerFlavorText_Agatha3[]; extern const u8 gFameCheckerFlavorText_Agatha4[]; extern const u8 gFameCheckerFlavorText_Agatha5[]; extern const u8 gFameCheckerFlavorText_Lance0[]; extern const u8 gFameCheckerFlavorText_Lance1[]; extern const u8 gFameCheckerFlavorText_Lance2[]; extern const u8 gFameCheckerFlavorText_Lance3[]; extern const u8 gFameCheckerFlavorText_Lance4[]; extern const u8 gFameCheckerFlavorText_Lance5[]; extern const u8 gFameCheckerFlavorText_Bill0[]; extern const u8 gFameCheckerFlavorText_Bill1[]; extern const u8 gFameCheckerFlavorText_Bill2[]; extern const u8 gFameCheckerFlavorText_Bill3[]; extern const u8 gFameCheckerFlavorText_Bill4[]; extern const u8 gFameCheckerFlavorText_Bill5[]; extern const u8 gFameCheckerFlavorText_MrFuji0[]; extern const u8 gFameCheckerFlavorText_MrFuji1[]; extern const u8 gFameCheckerFlavorText_MrFuji2[]; extern const u8 gFameCheckerFlavorText_MrFuji3[]; extern const u8 gFameCheckerFlavorText_MrFuji4[]; extern const u8 gFameCheckerFlavorText_MrFuji5[]; extern const u8 gFameCheckerFlavorText_Giovanni0[]; extern const u8 gFameCheckerFlavorText_Giovanni1[]; extern const u8 gFameCheckerFlavorText_Giovanni2[]; extern const u8 gFameCheckerFlavorText_Giovanni3[]; extern const u8 gFameCheckerFlavorText_Giovanni4[]; extern const u8 gFameCheckerFlavorText_Giovanni5[]; extern const u8 gFameCheckerPersonName_ProfOak[]; extern const u8 gFameCheckerPersonQuote_ProfOak[]; extern const u8 gFameCheckerPersonName_Daisy[]; extern const u8 gFameCheckerPersonQuote_Daisy[]; extern const u8 gFameCheckerPersonName_Brock[]; extern const u8 gFameCheckerPersonQuote_Brock[]; extern const u8 gFameCheckerPersonName_Misty[]; extern const u8 gFameCheckerPersonQuote_Misty[]; extern const u8 gFameCheckerPersonName_LtSurge[]; extern const u8 gFameCheckerPersonQuote_LtSurge[]; extern const u8 gFameCheckerPersonName_Erika[]; extern const u8 gFameCheckerPersonQuote_Erika[]; extern const u8 gFameCheckerPersonName_Koga[]; extern const u8 gFameCheckerPersonQuote_Koga[]; extern const u8 gFameCheckerPersonName_Sabrina[]; extern const u8 gFameCheckerPersonQuote_Sabrina[]; extern const u8 gFameCheckerPersonName_Blaine[]; extern const u8 gFameCheckerPersonQuote_Blaine[]; extern const u8 gFameCheckerPersonName_Lorelei[]; extern const u8 gFameCheckerPersonQuote_Lorelei[]; extern const u8 gFameCheckerPersonName_Bruno[]; extern const u8 gFameCheckerPersonQuote_Bruno[]; extern const u8 gFameCheckerPersonName_Agatha[]; extern const u8 gFameCheckerPersonQuote_Agatha[]; extern const u8 gFameCheckerPersonName_Lance[]; extern const u8 gFameCheckerPersonQuote_Lance[]; extern const u8 gFameCheckerPersonName_Bill[]; extern const u8 gFameCheckerPersonQuote_Bill[]; extern const u8 gFameCheckerPersonName_MrFuji[]; extern const u8 gFameCheckerPersonQuote_MrFuji[]; extern const u8 gFameCheckerPersonName_Giovanni[]; extern const u8 gFameCheckerPersonQuote_Giovanni[]; extern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Daisy0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Daisy1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Daisy2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Daisy3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Daisy4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Daisy5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Brock0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Brock1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Brock2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Brock3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Brock4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Brock5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Misty0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Misty1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Misty2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Misty3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Misty4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Misty5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Erika0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Erika1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Erika2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Erika3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Erika4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Erika5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Koga0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Koga1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Koga2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Koga3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Koga4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Koga5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Blaine0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Blaine1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Blaine2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Blaine3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Blaine4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Blaine5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bruno0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bruno1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bruno2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bruno3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bruno4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bruno5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Agatha0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Agatha1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Agatha2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Agatha3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Agatha4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Agatha5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lance0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lance1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lance2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lance3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lance4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Lance5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bill0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bill1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bill2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bill3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bill4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Bill5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji5[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni0[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni1[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni2[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni3[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni4[]; extern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Brock0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Brock1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Brock2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Brock3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Brock4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Brock5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Misty0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Misty1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Misty2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Misty3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Misty4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Misty5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Erika0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Erika1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Erika2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Erika3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Erika4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Erika5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Koga0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Koga1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Koga2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Koga3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Koga4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Koga5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lance0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lance1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lance2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lance3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lance4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Lance5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bill0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bill1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bill2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bill3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bill4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Bill5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji5[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni0[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni1[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni2[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni3[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni4[]; extern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni5[]; extern const u8 gOtherText_NewName[]; extern const u8 gNameChoice_Green[]; extern const u8 gNameChoice_Red[]; extern const u8 gNameChoice_Fire[]; extern const u8 gNameChoice_Leaf[]; extern const u8 gNameChoice_Gary[]; extern const u8 gNameChoice_Kaz[]; extern const u8 gNameChoice_Toru[]; extern const u8 gNameChoice_Ash[]; extern const u8 gNameChoice_Kene[]; extern const u8 gNameChoice_Geki[]; extern const u8 gNameChoice_Jak[]; extern const u8 gNameChoice_Janne[]; extern const u8 gNameChoice_Jonn[]; extern const u8 gNameChoice_Kamon[]; extern const u8 gNameChoice_Karl[]; extern const u8 gNameChoice_Taylor[]; extern const u8 gNameChoice_Oscar[]; extern const u8 gNameChoice_Hiro[]; extern const u8 gNameChoice_Max[]; extern const u8 gNameChoice_Jon[]; extern const u8 gNameChoice_Ralph[]; extern const u8 gNameChoice_Kay[]; extern const u8 gNameChoice_Tosh[]; extern const u8 gNameChoice_Roak[]; extern const u8 gNameChoice_Omi[]; extern const u8 gNameChoice_Jodi[]; extern const u8 gNameChoice_Amanda[]; extern const u8 gNameChoice_Hillary[]; extern const u8 gNameChoice_Makey[]; extern const u8 gNameChoice_Michi[]; extern const u8 gNameChoice_Paula[]; extern const u8 gNameChoice_June[]; extern const u8 gNameChoice_Cassie[]; extern const u8 gNameChoice_Rey[]; extern const u8 gNameChoice_Seda[]; extern const u8 gNameChoice_Kiko[]; extern const u8 gNameChoice_Mina[]; extern const u8 gNameChoice_Norie[]; extern const u8 gNameChoice_Sai[]; extern const u8 gNameChoice_Momo[]; extern const u8 gNameChoice_Suzi[]; extern const u8 gControlsGuide_Text_Intro[]; extern const u8 gControlsGuide_Text_DPad[]; extern const u8 gControlsGuide_Text_AButton[]; extern const u8 gControlsGuide_Text_BButton[]; extern const u8 gControlsGuide_Text_StartButton[]; extern const u8 gControlsGuide_Text_SelectButton[]; extern const u8 gControlsGuide_Text_LRButtons[]; extern const u8 gOakSpeech_Text_AskPlayerGender[]; extern const u8 gPikachuIntro_Text_Page1[]; extern const u8 gPikachuIntro_Text_Page2[]; extern const u8 gPikachuIntro_Text_Page3[]; extern const u8 gOakSpeech_Text_WelcomeToTheWorld[]; extern const u8 gOakSpeech_Text_ThisWorld[]; extern const u8 gOakSpeech_Text_IsInhabitedFarAndWide[]; extern const u8 gOakSpeech_Text_IStudyPokemon[]; extern const u8 gOakSpeech_Text_TellMeALittleAboutYourself[]; extern const u8 gOakSpeech_Text_YourNameWhatIsIt[]; extern const u8 gOakSpeech_Text_SoYourNameIsPlayer[]; extern const u8 gOakSpeech_Text_WhatWasHisName[]; extern const u8 gOakSpeech_Text_YourRivalsNameWhatWasIt[]; extern const u8 gOakSpeech_Text_ConfirmRivalName[]; extern const u8 gOakSpeech_Text_RememberRivalsName[]; extern const u8 gOakSpeech_Text_LetsGo[]; // Help System extern const u8 Help_Text_WhatShouldIDo[]; extern const u8 Help_Text_HowDoIDoThis[]; extern const u8 Help_Text_WhatDoesThisTermMean[]; extern const u8 Help_Text_AboutThisGame[]; extern const u8 Help_Text_TypeMatchupList[]; extern const u8 Help_Text_Exit[]; extern const u8 Help_Text_Cancel[]; extern const u8 Help_Text_DescWhatShouldIDo[]; extern const u8 Help_Text_DescHowDoIDoThis[]; extern const u8 Help_Text_DescWhatDoesThisTermMean[]; extern const u8 Help_Text_DescAboutThisGame[]; extern const u8 Help_Text_DescTypeMatchupList[]; extern const u8 Help_Text_DescExit[]; extern const u8 Help_Text_Greetings[]; extern const u8 Help_Text_PlayingForFirstTime[]; extern const u8 Help_Text_WhatShouldIBeDoing[]; extern const u8 Help_Text_CantGetOutOfRoom[]; extern const u8 Help_Text_CantFindPersonIWant[]; extern const u8 Help_Text_TalkedToEveryoneNowWhat[]; extern const u8 Help_Text_SomeoneBlockingMyWay[]; extern const u8 Help_Text_ICantGoOn[]; extern const u8 Help_Text_OutOfThingsToDo[]; extern const u8 Help_Text_WhatHappenedToItemIGot[]; extern const u8 Help_Text_WhatAreMyAdventureBasics[]; extern const u8 Help_Text_HowAreRoadsForestsDifferent[]; extern const u8 Help_Text_HowAreCavesDifferent[]; extern const u8 Help_Text_HowDoIProgress[]; extern const u8 Help_Text_WhenCanIUseItem[]; extern const u8 Help_Text_WhatsABattle[]; extern const u8 Help_Text_HowDoIPrepareForBattle[]; extern const u8 Help_Text_WhatIsAMonsVitality[]; extern const u8 Help_Text_MyMonsAreHurt[]; extern const u8 Help_Text_WhatIsStatusProblem[]; extern const u8 Help_Text_WhatHappensIfAllMyMonsFaint[]; extern const u8 Help_Text_CantCatchMons[]; extern const u8 Help_Text_RanOutOfPotions[]; extern const u8 Help_Text_CanIBuyPokeBalls[]; extern const u8 Help_Text_WhatsATrainer[]; extern const u8 Help_Text_HowDoIWinAgainstTrainer[]; extern const u8 Help_Text_WhereDoMonsAppear[]; extern const u8 Help_Text_WhatAreMoves[]; extern const u8 Help_Text_WhatAreHiddenMoves[]; extern const u8 Help_Text_WhatMovesShouldIUse[]; extern const u8 Help_Text_WantToAddMoreMoves[]; extern const u8 Help_Text_WantToMakeMonStronger[]; extern const u8 Help_Text_FoeMonsTooStrong[]; extern const u8 Help_Text_WhatDoIDoInCave[]; extern const u8 Help_Text_NothingIWantToKnow[]; extern const u8 Help_Text_WhatsPokemonCenter[]; extern const u8 Help_Text_WhatsPokemonMart[]; extern const u8 Help_Text_WantToEndGame[]; extern const u8 Help_Text_WhatsAMon[]; extern const u8 Help_Text_WhatIsThatPersonLike[]; extern const u8 Help_Text_WhatDoesHiddenMoveDo[]; extern const u8 Help_Text_WhatDoIDoInSafari[]; extern const u8 Help_Text_WhatAreSafariRules[]; extern const u8 Help_Text_WantToEndSafari[]; extern const u8 Help_Text_WhatIsAGym[]; extern const u8 Help_Text_AnswerPlayingForFirstTime[]; extern const u8 Help_Text_AnswerWhatShouldIBeDoing[]; extern const u8 Help_Text_AnswerCantGetOutOfRoom[]; extern const u8 Help_Text_AnswerCantFindPersonIWant[]; extern const u8 Help_Text_AnswerTalkedToEveryoneNowWhat[]; extern const u8 Help_Text_AnswerSomeoneBlockingMyWay[]; extern const u8 Help_Text_AnswerICantGoOn[]; extern const u8 Help_Text_AnswerOutOfThingsToDo[]; extern const u8 Help_Text_AnswerWhatHappenedToItemIGot[]; extern const u8 Help_Text_AnswerWhatAreMyAdventureBasics[]; extern const u8 Help_Text_AnswerHowAreRoadsForestsDifferent[]; extern const u8 Help_Text_AnswerHowAreCavesDifferent[]; extern const u8 Help_Text_AnswerHowDoIProgress[]; extern const u8 Help_Text_AnswerWhenCanIUseItem[]; extern const u8 Help_Text_AnswerWhatsABattle[]; extern const u8 Help_Text_AnswerHowDoIPrepareForBattle[]; extern const u8 Help_Text_AnswerWhatIsAMonsVitality[]; extern const u8 Help_Text_AnswerMyMonsAreHurt[]; extern const u8 Help_Text_AnswerWhatIsStatusProblem[]; extern const u8 Help_Text_AnswerWhatHappensIfAllMyMonsFaint[]; extern const u8 Help_Text_AnswerCantCatchMons[]; extern const u8 Help_Text_AnswerRanOutOfPotions[]; extern const u8 Help_Text_AnswerCanIBuyPokeBalls[]; extern const u8 Help_Text_AnswerWhatsATrainer[]; extern const u8 Help_Text_AnswerHowDoIWinAgainstTrainer[]; extern const u8 Help_Text_AnswerWhereDoMonsAppear[]; extern const u8 Help_Text_AnswerWhatAreMoves[]; extern const u8 Help_Text_AnswerWhatAreHiddenMoves[]; extern const u8 Help_Text_AnswerWhatMovesShouldIUse[]; extern const u8 Help_Text_AnswerWantToAddMoreMoves[]; extern const u8 Help_Text_AnswerWantToMakeMonStronger[]; extern const u8 Help_Text_AnswerFoeMonsTooStrong[]; extern const u8 Help_Text_AnswerWhatDoIDoInCave[]; extern const u8 Help_Text_AnswerNothingIWantToKnow[]; extern const u8 Help_Text_AnswerWhatsPokemonCenter[]; extern const u8 Help_Text_AnswerWhatsPokemonMart[]; extern const u8 Help_Text_AnswerWantToEndGame[]; extern const u8 Help_Text_AnswerWhatsAMon[]; extern const u8 Help_Text_AnswerWhatIsThatPersonLike[]; extern const u8 Help_Text_AnswerWhatDoesHiddenMoveDo[]; extern const u8 Help_Text_AnswerWhatDoIDoInSafari[]; extern const u8 Help_Text_AnswerWhatAreSafariRules[]; extern const u8 Help_Text_AnswerWantToEndSafari[]; extern const u8 Help_Text_AnswerWhatIsAGym[]; extern const u8 Help_Text_UsingPokedex[]; extern const u8 Help_Text_UsingPokemon[]; extern const u8 Help_Text_UsingSummary[]; extern const u8 Help_Text_UsingSwitch[]; extern const u8 Help_Text_UsingItem[]; extern const u8 Help_Text_UsingBag[]; extern const u8 Help_Text_UsingAnItem[]; extern const u8 Help_Text_UsingKeyItem[]; extern const u8 Help_Text_UsingPokeBall[]; extern const u8 Help_Text_UsingPlayer[]; extern const u8 Help_Text_UsingSave[]; extern const u8 Help_Text_UsingOption[]; extern const u8 Help_Text_UsingPotion[]; extern const u8 Help_Text_UsingTownMap[]; extern const u8 Help_Text_UsingTM[]; extern const u8 Help_Text_UsingHM[]; extern const u8 Help_Text_UsingMoveOutsideOfBattle[]; extern const u8 Help_Text_RidingBicycle[]; extern const u8 Help_Text_EnteringName[]; extern const u8 Help_Text_UsingPC[]; extern const u8 Help_Text_UsingBillsPC[]; extern const u8 Help_Text_UsingWithdraw[]; extern const u8 Help_Text_UsingDeposit[]; extern const u8 Help_Text_UsingMove[]; extern const u8 Help_Text_MovingItems[]; extern const u8 Help_Text_UsingPlayersPC[]; extern const u8 Help_Text_UsingWithdrawItem[]; extern const u8 Help_Text_UsingDepositItem[]; extern const u8 Help_Text_UsingMailbox[]; extern const u8 Help_Text_UsingProfOaksPC[]; extern const u8 Help_Text_OpeningMenu[]; extern const u8 Help_Text_UsingFight[]; extern const u8 Help_Text_UsingPokemon2[]; extern const u8 Help_Text_UsingShift[]; extern const u8 Help_Text_UsingSummary2[]; extern const u8 Help_Text_UsingBag2[]; extern const u8 Help_Text_ReadingPokedex[]; extern const u8 Help_Text_UsingHomePC[]; extern const u8 Help_Text_UsingItemStorage[]; extern const u8 Help_Text_UsingWithdrawItem2[]; extern const u8 Help_Text_UsingDepositItem2[]; extern const u8 Help_Text_UsingMailbox2[]; extern const u8 Help_Text_UsingRun[]; extern const u8 Help_Text_RegisterKeyItem[]; extern const u8 Help_Text_UsingBall[]; extern const u8 Help_Text_UsingBait[]; extern const u8 Help_Text_UsingRock[]; extern const u8 Help_Text_UsingHallOfFame[]; extern const u8 Help_Text_UsingKeySystem[]; extern const u8 Help_Text_SortingBag[]; extern const u8 Help_Text_HowToUsePokedex[]; extern const u8 Help_Text_HowToUsePokemon[]; extern const u8 Help_Text_HowToUseSummary[]; extern const u8 Help_Text_HowToUseSwitch[]; extern const u8 Help_Text_HowToUseItem[]; extern const u8 Help_Text_HowToUseBag[]; extern const u8 Help_Text_HowToUseAnItem[]; extern const u8 Help_Text_HowToUseKeyItem[]; extern const u8 Help_Text_HowToUsePokeBall[]; extern const u8 Help_Text_HowToUsePlayer[]; extern const u8 Help_Text_HowToUseSave[]; extern const u8 Help_Text_HowToUseOption[]; extern const u8 Help_Text_HowToUsePotion[]; extern const u8 Help_Text_HowToUseTownMap[]; extern const u8 Help_Text_HowToUseTM[]; extern const u8 Help_Text_HowToUseHM[]; extern const u8 Help_Text_HowToUseMoveOutsideOfBattle[]; extern const u8 Help_Text_HowToRideBicycle[]; extern const u8 Help_Text_HowToEnterName[]; extern const u8 Help_Text_HowToUsePC[]; extern const u8 Help_Text_HowToUseBillsPC[]; extern const u8 Help_Text_HowToUseWithdraw[]; extern const u8 Help_Text_HowToUseDeposit[]; extern const u8 Help_Text_HowToUseMove[]; extern const u8 Help_Text_HowToMoveItems[]; extern const u8 Help_Text_HowToUsePlayersPC[]; extern const u8 Help_Text_HowToUseWithdrawItem[]; extern const u8 Help_Text_HowToUseDepositItem[]; extern const u8 Help_Text_HowToUseMailbox[]; extern const u8 Help_Text_HowToUseProfOaksPC[]; extern const u8 Help_Text_HowToOpenMenu[]; extern const u8 Help_Text_HowToUseFight[]; extern const u8 Help_Text_HowToUsePokemon2[]; extern const u8 Help_Text_HowToUseShift[]; extern const u8 Help_Text_HowToUseSummary2[]; extern const u8 Help_Text_HowToUseBag2[]; extern const u8 Help_Text_HowToReadPokedex[]; extern const u8 Help_Text_HowToUseHomePC[]; extern const u8 Help_Text_HowToUseItemStorage[]; extern const u8 Help_Text_HowToUseWithdrawItem2[]; extern const u8 Help_Text_HowToUseDepositItem2[]; extern const u8 Help_Text_HowToUseMailbox2[]; extern const u8 Help_Text_HowToUseRun[]; extern const u8 Help_Text_HowToRegisterKeyItem[]; extern const u8 Help_Text_HowToUseBall[]; extern const u8 Help_Text_HowToUseBait[]; extern const u8 Help_Text_HowToUseRock[]; extern const u8 Help_Text_HowToUseHallOfFame[]; extern const u8 Help_Text_HowToUseKeySystemSettings[]; extern const u8 Help_Text_HowToSortBag[]; extern const u8 Help_Text_HP[]; extern const u8 Help_Text_EXP[]; extern const u8 Help_Text_Moves[]; extern const u8 Help_Text_Attack[]; extern const u8 Help_Text_Defense[]; extern const u8 Help_Text_SpAtk[]; extern const u8 Help_Text_SpDef[]; extern const u8 Help_Text_Speed[]; extern const u8 Help_Text_Level[]; extern const u8 Help_Text_Type[]; extern const u8 Help_Text_OT[]; extern const u8 Help_Text_Item[]; extern const u8 Help_Text_Ability[]; extern const u8 Help_Text_Money[]; extern const u8 Help_Text_MoveType[]; extern const u8 Help_Text_Nature[]; extern const u8 Help_Text_IDNo[]; extern const u8 Help_Text_PP[]; extern const u8 Help_Text_Power[]; extern const u8 Help_Text_Accuracy[]; extern const u8 Help_Text_FNT[]; extern const u8 Help_Text_Items[]; extern const u8 Help_Text_KeyItems[]; extern const u8 Help_Text_PokeBalls[]; extern const u8 Help_Text_Pokedex[]; extern const u8 Help_Text_PlayTime[]; extern const u8 Help_Text_Badges[]; extern const u8 Help_Text_TextSpeed[]; extern const u8 Help_Text_BattleScene[]; extern const u8 Help_Text_BattleStyle[]; extern const u8 Help_Text_Sound[]; extern const u8 Help_Text_ButtonMode[]; extern const u8 Help_Text_Frame[]; extern const u8 Help_Text_Cancel2[]; extern const u8 Help_Text_TM[]; extern const u8 Help_Text_HM[]; extern const u8 Help_Text_HMMove[]; extern const u8 Help_Text_Evolution[]; extern const u8 Help_Text_StatusProblem[]; extern const u8 Help_Text_Pokemon[]; extern const u8 Help_Text_IDNo2[]; extern const u8 Help_Text_Money2[]; extern const u8 Help_Text_Badges2[]; extern const u8 Help_Text_DefineHP[]; extern const u8 Help_Text_DefineEXP[]; extern const u8 Help_Text_DefineMoves[]; extern const u8 Help_Text_DefineAttack[]; extern const u8 Help_Text_DefineDefense[]; extern const u8 Help_Text_DefineSpAtk[]; extern const u8 Help_Text_DefineSpDef[]; extern const u8 Help_Text_DefineSpeed[]; extern const u8 Help_Text_DefineLevel[]; extern const u8 Help_Text_DefineType[]; extern const u8 Help_Text_DefineOT[]; extern const u8 Help_Text_DefineItem[]; extern const u8 Help_Text_DefineAbility[]; extern const u8 Help_Text_DefineMoney[]; extern const u8 Help_Text_DefineMoveType[]; extern const u8 Help_Text_DefineNature[]; extern const u8 Help_Text_DefineIDNo[]; extern const u8 Help_Text_DefinePP[]; extern const u8 Help_Text_DefinePower[]; extern const u8 Help_Text_DefineAccuracy[]; extern const u8 Help_Text_DefineFNT[]; extern const u8 Help_Text_DefineItems[]; extern const u8 Help_Text_DefineKeyItems[]; extern const u8 Help_Text_DefinePokeBalls[]; extern const u8 Help_Text_DefinePokedex[]; extern const u8 Help_Text_DefinePlayTime[]; extern const u8 Help_Text_DefineBadges[]; extern const u8 Help_Text_DefineTextSpeed[]; extern const u8 Help_Text_DefineBattleScene[]; extern const u8 Help_Text_DefineBattleStyle[]; extern const u8 Help_Text_DefineSound[]; extern const u8 Help_Text_DefineButtonMode[]; extern const u8 Help_Text_DefineFrame[]; extern const u8 Help_Text_DefineCancel2[]; extern const u8 Help_Text_DefineTM[]; extern const u8 Help_Text_DefineHM[]; extern const u8 Help_Text_DefineHMMove[]; extern const u8 Help_Text_DefineEvolution[]; extern const u8 Help_Text_DefineStatusProblem[]; extern const u8 Help_Text_DefinePokemon[]; extern const u8 Help_Text_DefineIDNo2[]; extern const u8 Help_Text_DefineMoney2[]; extern const u8 Help_Text_DefineBadges2[]; extern const u8 Help_Text_TheHelpSystem[]; extern const u8 Help_Text_TheGame[]; extern const u8 Help_Text_WirelessAdapter[]; extern const u8 Help_Text_GameFundamentals1[]; extern const u8 Help_Text_GameFundamentals2[]; extern const u8 Help_Text_GameFundamentals3[]; extern const u8 Help_Text_WhatArePokemon[]; extern const u8 Help_Text_DescTheHelpSystem[]; extern const u8 Help_Text_DescTheGame[]; extern const u8 Help_Text_DescWirelessAdapter[]; extern const u8 Help_Text_DescGameFundamentals1[]; extern const u8 Help_Text_DescGameFundamentals2[]; extern const u8 Help_Text_DescGameFundamentals3[]; extern const u8 Help_Text_DescWhatArePokemon[]; extern const u8 Help_Text_UsingTypeMatchupList[]; extern const u8 Help_Text_OwnMoveDark[]; extern const u8 Help_Text_OwnPokemonDark[]; extern const u8 Help_Text_OwnMoveRock[]; extern const u8 Help_Text_OwnPokemonRock[]; extern const u8 Help_Text_OwnMovePsychic[]; extern const u8 Help_Text_OwnPokemonPsychic[]; extern const u8 Help_Text_OwnMoveFighting[]; extern const u8 Help_Text_OwnPokemonFighting[]; extern const u8 Help_Text_OwnMoveGrass[]; extern const u8 Help_Text_OwnPokemonGrass[]; extern const u8 Help_Text_OwnMoveGhost[]; extern const u8 Help_Text_OwnPokemonGhost[]; extern const u8 Help_Text_OwnMoveIce[]; extern const u8 Help_Text_OwnPokemonIce[]; extern const u8 Help_Text_OwnMoveGround[]; extern const u8 Help_Text_OwnPokemonGround[]; extern const u8 Help_Text_OwnMoveElectric[]; extern const u8 Help_Text_OwnPokemonElectric[]; extern const u8 Help_Text_OwnMovePoison[]; extern const u8 Help_Text_OwnPokemonPoison[]; extern const u8 Help_Text_OwnMoveDragon[]; extern const u8 Help_Text_OwnPokemonDragon[]; extern const u8 Help_Text_OwnMoveNormal[]; extern const u8 Help_Text_OwnPokemonNormal[]; extern const u8 Help_Text_OwnMoveSteel[]; extern const u8 Help_Text_OwnPokemonSteel[]; extern const u8 Help_Text_OwnMoveFlying[]; extern const u8 Help_Text_OwnPokemonFlying[]; extern const u8 Help_Text_OwnMoveFire[]; extern const u8 Help_Text_OwnPokemonFire[]; extern const u8 Help_Text_OwnMoveWater[]; extern const u8 Help_Text_OwnPokemonWater[]; extern const u8 Help_Text_OwnMoveBug[]; extern const u8 Help_Text_OwnPokemonBug[]; extern const u8 Help_Text_HowToUseTypeMatchupList[]; extern const u8 Help_Text_TypeMatchupOwnMoveDark[]; extern const u8 Help_Text_TypeMatchupOwnPokemonDark[]; extern const u8 Help_Text_TypeMatchupOwnMoveRock[]; extern const u8 Help_Text_TypeMatchupOwnPokemonRock[]; extern const u8 Help_Text_TypeMatchupOwnMovePsychic[]; extern const u8 Help_Text_TypeMatchupOwnPokemonPsychic[]; extern const u8 Help_Text_TypeMatchupOwnMoveFighting[]; extern const u8 Help_Text_TypeMatchupOwnPokemonFighting[]; extern const u8 Help_Text_TypeMatchupOwnMoveGrass[]; extern const u8 Help_Text_TypeMatchupOwnPokemonGrass[]; extern const u8 Help_Text_TypeMatchupOwnMoveGhost[]; extern const u8 Help_Text_TypeMatchupOwnPokemonGhost[]; extern const u8 Help_Text_TypeMatchupOwnMoveIce[]; extern const u8 Help_Text_TypeMatchupOwnPokemonIce[]; extern const u8 Help_Text_TypeMatchupOwnMoveGround[]; extern const u8 Help_Text_TypeMatchupOwnPokemonGround[]; extern const u8 Help_Text_TypeMatchupOwnMoveElectric[]; extern const u8 Help_Text_TypeMatchupOwnPokemonElectric[]; extern const u8 Help_Text_TypeMatchupOwnMovePoison[]; extern const u8 Help_Text_TypeMatchupOwnPokemonPoison[]; extern const u8 Help_Text_TypeMatchupOwnMoveDragon[]; extern const u8 Help_Text_TypeMatchupOwnPokemonDragon[]; extern const u8 Help_Text_TypeMatchupOwnMoveNormal[]; extern const u8 Help_Text_TypeMatchupOwnPokemonNormal[]; extern const u8 Help_Text_TypeMatchupOwnMoveSteel[]; extern const u8 Help_Text_TypeMatchupOwnPokemonSteel[]; extern const u8 Help_Text_TypeMatchupOwnMoveFlying[]; extern const u8 Help_Text_TypeMatchupOwnPokemonFlying[]; extern const u8 Help_Text_TypeMatchupOwnMoveFire[]; extern const u8 Help_Text_TypeMatchupOwnPokemonFire[]; extern const u8 Help_Text_TypeMatchupOwnMoveWater[]; extern const u8 Help_Text_TypeMatchupOwnPokemonWater[]; extern const u8 Help_Text_TypeMatchupOwnMoveBug[]; extern const u8 Help_Text_TypeMatchupOwnPokemonBug[]; extern const u8 Help_Text_Version[]; extern const u8 Help_Text_Difficulty[]; extern const u8 Help_Text_Nuzlocke[]; extern const u8 Help_Text_Nuzlocke_Catching[]; extern const u8 Help_Text_IvCalc[]; extern const u8 Help_Text_EvCalc[]; extern const u8 Help_Text_NoFreeHeals[]; extern const u8 Help_Text_DefineVersion[]; extern const u8 Help_Text_DefineDifficulty[]; extern const u8 Help_Text_DefineNuzlocke[]; extern const u8 Help_Text_DefineIvCalc[]; extern const u8 Help_Text_DefineEvCalc[]; extern const u8 Help_Text_DefineNuzlocke_Catching[]; extern const u8 Help_Text_NuzlockeLosing[]; extern const u8 Help_Text_DefineNuzlockeLosing[]; extern const u8 Help_Text_DefineNoFreeHeals[]; extern const u8 EventScript_FldEffStrength[]; extern const u8 EventScript_FailSweetScent[]; extern const u8 EventScript_FldEffRockSmash[]; extern const u8 SafariZone_EventScript_TimesUp[]; extern const u8 SafariZone_EventScript_RetirePrompt[]; extern const u8 SafariZone_EventScript_OutOfBallsMidBattle[]; extern const u8 SafariZone_EventScript_OutOfBalls[]; extern const u8 EventScript_ItemfinderDigUpUnderfootItem[]; // battle_setup extern const u8 EventScript_DoNoIntroTrainerBattle[]; extern const u8 EventScript_TryDoDoubleTrainerBattle[]; extern const u8 EventScript_TryDoNormalTrainerBattle[]; extern const u8 EventScript_TryDoDoubleRematchBattle[]; extern const u8 EventScript_TryDoRematchBattle[]; extern const u8 EventScript_DoTrainerBattleFromApproach[]; // new_game extern const u8 EventScript_ResetAllMapFlags[]; // player_pc extern const u8 EventScript_PalletTown_PlayersHouse_2F_ShutDownPC[]; // field_screen_effect extern const u8 EventScript_AfterWhiteOutMomHeal[]; extern const u8 EventScript_AfterWhiteOutHeal[]; extern const u8 EventScript_NuzlockeGameOver[]; extern const u8 EventScript_NuzlockeHaveMons_Nurse[]; extern const u8 EventScript_NoPMCHaveMons_Nurse[]; extern const u8 EventScript_NuzlockeGameOver_Mom[]; extern const u8 EventScript_NuzlockeHaveMons_Mom[]; extern const u8 EventScript_NoPMCHaveMons_Mom[]; extern const u8 EventScript_BothGameOver[]; extern const u8 EventScript_NoPMCGameOver[]; extern const u8 EventScript_BothGameOver_Mom[]; extern const u8 EventScript_NoPMCGameOver_Mom[]; // start_menu extern const u8 gText_WouldYouLikeToSaveTheGame[]; extern const u8 gText_AlreadySaveFile_WouldLikeToOverwrite[]; extern const u8 gText_SavingDontTurnOffThePower[]; extern const u8 gText_PlayerSavedTheGame[]; extern const u8 gText_DifferentGameFile[]; // script_menu extern const u8 EventScript_ReleaseEnd[]; extern const u8 CableClub_Text_TradeMonsUsingLinkCable[]; extern const u8 CableClub_Text_BattleUsingLinkCable[]; extern const u8 CableClub_Text_CancelSelectedItem[]; extern const u8 CableClub_Text_YouMayTradeHere[]; extern const u8 CableClub_Text_YouMayBattleHere[]; extern const u8 CableClub_Text_CanMakeBerryPowder[]; extern const u8 EventScript_PC[]; extern const u8 EventScript_RepelWoreOff[]; // battle_message extern const u8 Text_MonSentToBoxInSomeonesPC[]; extern const u8 Text_MonSentToBoxInBillsPC[]; extern const u8 Text_MonSentToBoxSomeonesBoxFull[]; extern const u8 Text_MonSentToBoxBillsBoxFull[]; extern const u8 EventScript_BagItemCanBeRegistered[]; // fldeff_cut extern const u8 EventScript_FldEffCut[]; // cable_club extern const u8 CableClub_Text_WhenAllPlayersReadyAConfirmBCancel[]; extern const u8 CableClub_Text_AwaitingLinkupBCancel[]; extern const u8 CableClub_Text_StartLinkWithXPlayersAConfirmBCancel[]; extern const u8 CableClub_Text_PleaseWaitBCancel[]; // fldeff_flash extern const u8 EventScript_FldEffFlash[]; // field_control_avatar extern const u8 EventScript_CancelMessageBox[]; extern const u8 PalletTown_PlayersHouse_2F_EventScript_PC[]; extern const u8 EventScript_HiddenItemScript[]; extern const u8 EventScript_PC[]; extern const u8 EventScript_WallTownMap[]; extern const u8 EventScript_Bookshelf[]; extern const u8 EventScript_PokeMartShelf[]; extern const u8 EventScript_Food[]; extern const u8 EventScript_ImpressiveMachine[]; extern const u8 EventScript_Blueprints[]; extern const u8 EventScript_VideoGame[]; extern const u8 EventScript_Burglary[]; extern const u8 EventScript_Computer[]; extern const u8 TrainerTower_EventScript_ShowTime[]; extern const u8 EventScript_PlayerFacingTVScreen[]; extern const u8 EventScript_Cabinet[]; extern const u8 EventScript_Kitchen[]; extern const u8 EventScript_Dresser[]; extern const u8 EventScript_Snacks[]; extern const u8 EventScript_Painting[]; extern const u8 EventScript_PowerPlantMachine[]; extern const u8 EventScript_Telephone[]; extern const u8 EventScript_AdvertisingPoster[]; extern const u8 EventScript_TastyFood[]; extern const u8 EventScript_TrashBin[]; extern const u8 EventScript_Cup[]; extern const u8 EventScript_PolishedWindow[]; extern const u8 EventScript_BeautifulSkyWindow[]; extern const u8 EventScript_BlinkingLights[]; extern const u8 EventScript_NeatlyLinedUpTools[]; extern const u8 CableClub_EventScript_ShowWirelessCommunicationScreen[]; extern const u8 EventScript_Questionnaire[]; extern const u8 CableClub_EventScript_ShowBattleRecords[]; extern const u8 EventScript_Indigo_UltimateGoal[]; extern const u8 EventScript_Indigo_HighestAuthority[]; extern const u8 EventScript_PokemartSign[]; extern const u8 EventScript_PokecenterSign[]; extern const u8 EventScript_CurrentTooFast[]; extern const u8 EventScript_UseSurf[]; extern const u8 EventScript_Waterfall[]; extern const u8 EventScript_CantUseWaterfall[]; extern const u8 EventScript_DeepWater[]; extern const u8 EventScript_TrySurface[]; extern const u8 EventScript_VsSeekerChargingDone[]; extern const u8 EventScript_FieldPoison[]; extern const u8 EventScript_EggHatch[]; extern const u8 EventScript_DoFallWarp[]; extern const u8 EventScript_SafariZone_ExtensionSign[]; // overworld extern const u8 EventScript_ResetEliteFourEnd[]; extern const u8 CableClub_EventScript_DoLinkRoomExit[]; extern const u8 CableClub_EventScript_TooBusyToNotice[]; extern const u8 CableClub_EventScript_ReadTrainerCard[]; extern const u8 CableClub_EventScript_ReadTrainerCardColored[]; extern const u8 BattleColosseum_4P_EventScript_PlayerSpot0[]; extern const u8 BattleColosseum_4P_EventScript_PlayerSpot1[]; extern const u8 BattleColosseum_4P_EventScript_PlayerSpot2[]; extern const u8 BattleColosseum_4P_EventScript_PlayerSpot3[]; extern const u8 RecordCorner_EventScript_Spot0[]; extern const u8 RecordCorner_EventScript_Spot1[]; extern const u8 RecordCorner_EventScript_Spot2[]; extern const u8 RecordCorner_EventScript_Spot3[]; extern const u8 BattleColosseum_2P_EventScript_PlayerSpot0[]; extern const u8 BattleColosseum_2P_EventScript_PlayerSpot1[]; extern const u8 TradeCenter_EventScript_Chair0[]; extern const u8 TradeCenter_EventScript_Chair1[]; extern const u8 TradeCenter_ConfirmLeaveRoom[]; extern const u8 TradeCenter_TerminateLink[]; extern const u8 Help_Text_UsingOptionsSubmenu[]; extern const u8 Help_Text_HowToUseOptionSubmenu[]; extern const u8 Help_Text_DefineBattleTransitions[]; extern const u8 Help_Text_DefineBattleIntroAnims[]; extern const u8 Help_Text_DefineMoveAnimations[]; extern const u8 Help_Text_DefineHpBarAnimSpeed[]; extern const u8 Help_Text_DefineExpBarAnimSpeed[]; extern const u8 Help_Text_DefineBack[]; extern const u8 Help_Text_BattleTransitions[]; extern const u8 Help_Text_BattleIntroAnim[]; extern const u8 Help_Text_MoveAnimations[]; extern const u8 Help_Text_HpBarAnimSpeed[]; extern const u8 Help_Text_ExpBarAnimSpeed[]; extern const u8 Help_Text_Back[]; extern const u8 Help_Text_AdvancedKeys[]; extern const u8 Help_Text_DefineAdvancedKeys[]; extern const u8 Help_Text_DefineAdvancedKeysBack[]; extern const u8 Help_Text_UsingKeySystemSubmenu[]; extern const u8 Help_Text_HowToUseKeySystemSubmenu[]; extern const u8 Help_Text_ExpMod[]; extern const u8 Help_Text_DefineExpMod[]; extern const u8 Help_Text_FRExclusives[]; extern const u8 Help_Text_LGExclusives[]; extern const u8 Help_Text_DefineFRExclusives[]; extern const u8 Help_Text_DefineLGExclusives[]; #endif //GUARD_EVENT_SCRIPTS_H ================================================ FILE: include/evolution_graphics.h ================================================ #ifndef GUARD_EVOLUTION_GRAPHICS_H #define GUARD_EVOLUTION_GRAPHICS_H #include "global.h" void LoadEvoSparkleSpriteAndPal(void); u8 EvolutionSparkles_SpiralUpward(u16 arg0); u8 EvolutionSparkles_ArcDown(void); u8 EvolutionSparkles_CircleInward(void); u8 EvolutionSparkles_SprayAndFlash(u16 species); u8 EvolutionSparkles_SprayAndFlash_Trade(u16 species); u8 CycleEvolutionMonSprite(u8 preEvoSpriteId, u8 postEvoSpriteId); #define EvoGraphicsTaskEvoStop data[8] #endif // GUARD_EVOLUTION_GRAPHICS_H ================================================ FILE: include/evolution_scene.h ================================================ #ifndef GUARD_EVOLUTION_SCENE_H #define GUARD_EVOLUTION_SCENE_H #include "global.h" extern void (*gCB2_AfterEvolution)(void); void BeginEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8, u8 partyId); void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8, u8 partyId); void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpriteId, u8 partyId); void IsMovingBackgroundTaskRunning(void); #endif // GUARD_EVOLUTION_SCENE_H ================================================ FILE: include/fame_checker.h ================================================ #ifndef GUARD_FAME_CHECKER_H #define GUARD_FAME_CHECKER_H #include "main.h" #include "constants/fame_checker.h" enum { FCWINDOWID_LIST, FCWINDOWID_UIHELP, FCWINDOWID_MSGBOX, FCWINDOWID_ICONDESC }; extern struct ListMenuTemplate gFameChecker_ListMenuTemplate; extern u8 gIconDescriptionBoxIsOpen; void ResetFameChecker(void); void FullyUnlockFameChecker(void); void UseFameChecker(MainCallback savedCallback); void SetFlavorTextFlagFromSpecialVars(void); void UpdatePickStateFromSpecialVar8005(void); void CheckFilledFameCheckerFor0x8004(void); #endif //GUARD_FAME_CHECKER_H ================================================ FILE: include/faraway_island.h ================================================ #ifndef GUARD_FARAWAY_ISLAND_H #define GUARD_FARAWAY_ISLAND_H u32 GetMewMoveDirection(void); bool8 ShouldMewShakeGrass(struct ObjectEvent*); void UpdateFarawayIslandStepCounter(void); bool8 ObjectEventIsFarawayIslandMew(struct ObjectEvent *); bool8 IsMewPlayingHideAndSeek(void); #endif // GUARD_FARAWAY_ISLAND_H ================================================ FILE: include/field_camera.h ================================================ #ifndef GUARD_FIELD_CAMERA_H #define GUARD_FIELD_CAMERA_H #include "global.h" // Exported type declarations struct CameraObject { void (*callback)(struct CameraObject *); u32 spriteId; s32 movementSpeedX; s32 movementSpeedY; s32 x; s32 y; }; // Exported RAM declarations extern struct CameraObject gFieldCamera; extern u16 gTotalCameraPixelOffsetX; extern u16 gTotalCameraPixelOffsetY; extern bool8 gBikeCameraAheadPanback; // Exported ROM declarations void DrawWholeMapView(void); void CurrentMapDrawMetatileAt(int x, int y); void FieldCameraGetPixelOffsetAtGround(s16 *x, s16 *y); void SetCameraPanningCallback(void (*cb)(void)); void SetCameraPanning(s16 x, s16 y); void UpdateCameraPanning(void); void InstallCameraPanAheadCallback(void); void DrawDoorMetatileAt(int x, int y, const u16 *data); void move_tilemap_camera_to_upper_left_corner(void); void CameraUpdate(void); void FieldUpdateBgTilemapScroll(void); void ResetCameraUpdateInfo(void); u32 InitCameraUpdateCallback(u8 trackedSpriteId); void CameraUpdateNoObjectRefresh(void); #endif //GUARD_FIELD_CAMERA_H ================================================ FILE: include/field_control_avatar.h ================================================ #ifndef GUARD_FIELD_CONTROL_AVATAR_H #define GUARD_FIELD_CONTROL_AVATAR_H #include "global.h" struct FieldInput { bool8 pressedAButton:1; bool8 checkStandardWildEncounter:1; bool8 pressedStartButton:1; bool8 pressedSelectButton:1; bool8 heldDirection:1; bool8 heldDirection2:1; bool8 tookStep:1; bool8 pressedBButton:1; bool8 pressedRButton:1; bool8 input_field_1_0:1; bool8 input_field_1_1:1; bool8 input_field_1_2:1; bool8 input_field_1_3:1; u8 dpadDirection; }; extern struct FieldInput gFieldInputRecord; void RestartWildEncounterImmunitySteps(void); void ClearPoisonStepCounter(void); int SetCableClubWarp(void); void HandleBoulderFallThroughHole(struct ObjectEvent *); bool8 dive_warp(struct MapPosition * pos, u16 behavior); bool8 IsDirectionalStairWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection); const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatileBehavior, u8 direction); const u8 *GetCoordEventScriptAtMapPosition(struct MapPosition *position); void FieldClearPlayerInput(struct FieldInput *input); int ProcessPlayerFieldInput(struct FieldInput *input); void FieldInput_HandleCancelSignpost(struct FieldInput * input); void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys); void HandleBoulderActivateVictoryRoadSwitch(u16 x, u16 y); u8 TrySetDiveWarp(void); #endif //GUARD_FIELD_CONTROL_AVATAR_H ================================================ FILE: include/field_door.h ================================================ #ifndef GUARD_FIELDDOOR_H #define GUARD_FIELDDOOR_H #include "global.h" void FieldSetDoorOpened(int x, int y); void FieldSetDoorClosed(int x, int y); s8 FieldAnimateDoorClose(int x, int y); s8 FieldAnimateDoorOpen(int x, int y); bool8 FieldIsDoorAnimationRunning(void); u16 GetDoorSoundEffect(int x, int y); #endif ================================================ FILE: include/field_effect.h ================================================ #ifndef GUARD_FIELD_EFFECTS_H #define GUARD_FIELD_EFFECTS_H #include "global.h" #include "constants/field_effects.h" extern u32 gFieldEffectArguments[8]; extern void (*gPostMenuFieldCallback)(void); extern bool8 (*gFieldCallback2)(void); u32 FieldEffectStart(u8); bool8 FieldEffectActiveListContains(u8 id); void CreateTeleportFieldEffectTask(void); void FieldEffectActiveListRemove(u8 id); void StartEscapeRopeFieldEffect(void); void FieldEffectStop(struct Sprite *sprite, u8 id); u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer); void FieldCB_FallWarpExit(void); void StartEscalatorWarp(u8 metatileBehavior, u8 priority); void StartLavaridgeGymB1FWarp(u8 a0); void StartLavaridgeGym1FWarp(u8 a0); void ApplyGlobalFieldPaletteTint(u8 paletteIdx); void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId); u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, bool8 unused); void ReturnToFieldFromFlyMapSelect(void); void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b); void SpriteCB_PopOutOfAsh(struct Sprite *sprite); void SpriteCB_AshLaunch(struct Sprite *sprite); void FieldEffectActiveListClear(void); #endif //GUARD_FIELD_EFFECTS_H ================================================ FILE: include/field_effect_helpers.h ================================================ // // Created by scott on 9/7/2017. // #ifndef GUARD_FIELD_EFFECT_HELPERS_H #define GUARD_FIELD_EFFECT_HELPERS_H #include "global.h" enum { BOB_NONE, BOB_PLAYER_AND_MON, BOB_MON_ONLY, // when player has jumped / flown off }; u8 CreateWarpArrowSprite(void); void SetSurfBlob_BobState(u8 spriteId, u8 bobState); void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 value); void StartAshFieldEffect(s16, s16, u16, s16); void StartRevealDisguise(struct ObjectEvent *); bool8 UpdateRevealDisguise(struct ObjectEvent *); void SetUpReflection(struct ObjectEvent *, struct Sprite *, u8); u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent *); u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); void ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y); void SetSpriteInvisible(u8 spriteId); void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset); void UpdateJumpImpactEffect(struct Sprite *sprite); void UpdateShadowFieldEffect(struct Sprite *sprite); void UpdateBubblesFieldEffect(struct Sprite *sprite); void UpdateSparkleFieldEffect(struct Sprite *sprite); void UpdateTallGrassFieldEffect(struct Sprite *sprite); void WaitFieldEffectSpriteAnim(struct Sprite *sprite); void UpdateAshFieldEffect(struct Sprite *sprite); void UpdateSurfBlobFieldEffect(struct Sprite *sprite); void UpdateFootprintsTireTracksFieldEffect(struct Sprite *sprite); void UpdateSplashFieldEffect(struct Sprite *sprite); void UpdateShortGrassFieldEffect(struct Sprite *sprite); void UpdateLongGrassFieldEffect(struct Sprite *sprite); void UpdateSandPileFieldEffect(struct Sprite *sprite); void UpdateDisguiseFieldEffect(struct Sprite *sprite); void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite); u8 StartUnderwaterSurfBlobBobbing(u8 oldSpriteId); #endif //GUARD_FIELD_EFFECT_HELPERS_H ================================================ FILE: include/field_effect_scripts.h ================================================ #ifndef GUARD_FIELD_EFFECT_SCRIPTS_H #define GUARD_FIELD_EFFECT_SCRIPTS_H extern const u8 *const gFieldEffectScriptPointers[]; #endif //GUARD_FIELD_EFFECT_SCRIPTS_H ================================================ FILE: include/field_fadetransition.h ================================================ #ifndef GUARD_FIELD_FADETRANSITION_H #define GUARD_FIELD_FADETRANSITION_H #include "global.h" void FieldCB_RushInjuredPokemonToCenter(void); void DoWarp(void); void DoDiveWarp(void); void DoDoorWarp(void); void DoFallWarp(void); void DoTeleportWarp(void); void DoTeleport2Warp(void); void FieldCB_DefaultWarpExit(void); void WarpFadeOutScreen(void); void FieldCB_ContinueScriptHandleMusic(void); void FadeInFromBlack(void); void FadeTransition_FadeInOnReturnToStartMenu(void); void WarpFadeInScreen(void); void FieldCB_ContinueScriptUnionRoom(void); bool32 FieldFadeTransitionBackgroundEffectIsFinished(void); void palette_bg_faded_fill_black(void); void DoStairWarp(u16 metatileBehavior, u16 delay); void DoEscalatorWarp(u8 a0); void DoLavaridgeGymB1FWarp(void); void DoLavaridgeGym1FWarp(void); void DoTeleportWarp(void); void DoUnionRoomWarp(void); void FieldCB_ReturnToFieldWirelessLink(void); void FieldCB_ReturnToFieldCableLink(void); bool8 FieldCB_ReturnToFieldOpenStartMenu(void); void FieldCB_ContinueScript(void); void FieldCB_ContinueScriptHandleMusic(void); void FieldCB_WarpExitFadeFromBlack(void); #endif // GUARD_FIELD_FADETRANSITION_H ================================================ FILE: include/field_message_box.h ================================================ #ifndef GUARD_FIELD_MESSAGE_BOX_H #define GUARD_FIELD_MESSAGE_BOX_H #include "global.h" enum { FIELD_MESSAGE_BOX_HIDDEN, FIELD_MESSAGE_BOX_UNUSED, FIELD_MESSAGE_BOX_NORMAL, FIELD_MESSAGE_BOX_AUTO_SCROLL, }; bool8 ShowFieldMessage(const u8 *message); bool8 ShowFieldAutoScrollMessage(const u8 *message); void HideFieldMessageBox(void); bool8 IsFieldMessageBoxHidden(void); u8 GetFieldMessageBoxType(void); void InitFieldMessageBox(void); #endif // GUARD_FIELD_MESSAGE_BOX_H ================================================ FILE: include/field_player_avatar.h ================================================ #ifndef GUARD_FIELD_PLAYER_AVATAR_H #define GUARD_FIELD_PLAYER_AVATAR_H #include "global.h" void ClearPlayerAvatarInfo(void); void SetPlayerAvatarExtraStateTransition(u8, u8); u8 GetPlayerAvatarGenderByGraphicsId(u8); bool8 TestPlayerAvatarFlags(u8); void PlayerGetDestCoords(s16 *, s16 *); u8 GetPlayerFacingDirection(void); u8 GetPlayerMovementDirection(void); u8 PlayerGetCopyableMovement(void); void MovePlayerNotOnBike(u8 direction, u16 heldKeys); void MovementType_Player(struct Sprite *sprite); void HandleEnforcedLookDirectionOnPlayerStopMoving(void); void StopPlayerAvatar(void); void GetXYCoordsOneStepInFrontOfPlayer(s16 *xPtr, s16 *yPtr); u8 GetPlayerAvatarGraphicsIdByStateId(u8); void SetPlayerAvatarStateMask(u8 mask); void AlignFishingAnimationFrames(struct Sprite *sprite); void CreateStopSurfingTask_NoMusicChange(u8 direction); void SavePlayerFacingDirectionForTeleport(u8 direction); void SetPlayerAvatarTransitionFlags(u16 flags); bool8 IsPlayerFacingSurfableFishableWater(void); void StartFishing(u8 secondaryId); u8 GetPlayerAvatarObjectId(void); u8 PlayerGetElevation(void); u8 GetPlayerAvatarGraphicsIdByCurrentState(void); void StartPlayerAvatarSummonMonForFieldMoveAnim(void); void SetPlayerInvisibility(bool8); void StartTeleportInPlayerAnim(void); void StartTeleportWarpOutPlayerAnim(void); bool32 WaitTeleportWarpOutPlayerAnim(void); bool32 WaitTeleportInPlayerAnim(void); bool8 PartyHasMonWithSurf(void); bool8 IsPlayerSurfingNorth(void); u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y); void StartPlayerAvatarVsSeekerAnim(void); u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender); u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender); u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction, u8 metatileBehavior); void PlayerWalkSlower(u8 direction); void PlayerWalkSlow(u8 direction); void PlayerWalkNormal(u8 direction); void PlayerWalkFast(u8 direction); void PlayerGlide(u8 direction); void PlayerRideWaterCurrent(u8 direction); void PlayerWalkFaster(u8 direction); void PlayerRun(u8 direction); void PlayerRunSlow(u8 direction); void PlayerOnBikeCollide(u8 direction); void PlayerNotOnBikeCollide(u8 direction); void PlayerFaceDirection(u8 direction); void PlayerFaceDirectionFast(u8 direction); void PlayerTurnInPlace(u8 direction); void PlayerJumpLedge(u8 direction); void PlayerShakeHeadOrWalkInPlace(void); void player_step(u8 direction, u16 newKeys, u16 heldKeys); bool32 PlayerIsMovingOnRockStairs(u8 direction); void UpdatePlayerAvatarTransitionState(void); void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender); void InitDivingPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender); void PlayerUseAcroBikeOnBumpySlope(u8 direction); u8 GetRSAvatarGraphicsIdByGender(u8 gender); u8 GetEMAvatarGraphicsIdByGender(u8 gender); #endif //GUARD_FIELD_PLAYER_AVATAR_H ================================================ FILE: include/field_poison.h ================================================ #ifndef GUARD_FIELD_POISON_H #define GUARD_FIELD_POISON_H #include "global.h" enum { FLDPSN_NONE, FLDPSN_PSN, FLDPSN_FNT }; s32 DoPoisonFieldEffect(void); #endif //GUARD_FIELD_POISON_H ================================================ FILE: include/field_screen.h ================================================ #ifndef GUARD_FIELD_SCREEN_H #define GUARD_FIELD_SCREEN_H #include "global.h" // Exported type declarations // Exported RAM declarations // Exported ROM declarations void pal_fill_black(void); void UpdateWeatherPerDay(u16 days); #endif //GUARD_FIELD_SCREEN_H ================================================ FILE: include/field_screen_effect.h ================================================ #ifndef GUARD_FIELD_SCREEN_EFFECT_H #define GUARD_FIELD_SCREEN_EFFECT_H #include "global.h" void AnimateFlash(u8); void FieldCB_SafariZoneRanOutOfBalls(void); void DoOutwardBarnDoorWipe(void); void Task_BarnDoorWipe(u8 taskId); void FieldCB_RushInjuredPokemonToCenter(void); void WriteFlashScanlineEffectBuffer(u8 flashLevel); extern const s32 gMaxFlashLevel; #endif // GUARD_FIELD_SCREEN_EFFECT_H ================================================ FILE: include/field_specials.h ================================================ #ifndef GUARD_FIELD_SPECIALS_H #define GUARD_FIELD_SPECIALS_H #include "global.h" u8 GetLeadMonIndex(void); s32 CountDigits(s32 number); void TV_PrintIntToStringVar(u8 varidx, s32 number); u16 GetStarterSpecies(void); void StopPokemonLeagueLightingEffectTask(void); void FieldCB_ShowPortholeView(void); u8 ContextNpcGetTextColor(void); void SetPCBoxToSendMon(u8); u16 GetPCBoxToSendMon(void); bool8 IsDestinationBoxFull(void); bool8 ShouldShowBoxWasFullMessage(void); u16 GetHiddenItemAttr(u32 hiddenItem, u8 attr); u8 GetUnlockedSeviiAreas(void); u32 GetPlayerTrainerId(void); bool8 CutMoveRuinValleyCheck(void); void CutMoveOpenDottedHoleDoor(void); void RunMassageCooldownStepCounter(void); void IncrementResortGorgeousStepCounter(void); void IncrementBirthIslandRockStepCount(void); void ResetCyclingRoadChallengeData(void); void ResetFieldTasksArgs(void); bool8 UsedPokemonCenterWarp(void); void QuestLog_CheckDepartingIndoorsMap(void); void QuestLog_TryRecordDepartedLocation(void); #endif // GUARD_FIELD_SPECIALS_H ================================================ FILE: include/field_tasks.h ================================================ #ifndef GUARD_FIELD_TASKS_H #define GUARD_FIELD_TASKS_H #include "global.h" void ActivatePerStepCallback(u8); void SetUpFieldTasks(void); #endif // GUARD_FIELD_TASKS_H ================================================ FILE: include/field_weather.h ================================================ #ifndef GUARD_WEATHER_H #define GUARD_WEATHER_H #include "global.h" #include "constants/field_weather.h" #define TAG_WEATHER_START 0x1200 enum { GFXTAG_CLOUD = TAG_WEATHER_START, GFXTAG_FOG_H, GFXTAG_ASH, GFXTAG_FOG_D, GFXTAG_SANDSTORM, GFXTAG_BUBBLE, GFXTAG_RAIN, }; enum { PALTAG_WEATHER = TAG_WEATHER_START, }; struct Weather { union { struct { struct Sprite *rainSprites[MAX_RAIN_SPRITES]; struct Sprite *snowflakeSprites[101]; struct Sprite *cloudSprites[NUM_CLOUD_SPRITES]; } s1; struct { u8 filler0[0xA0]; struct Sprite *fogHSprites[NUM_FOG_HORIZONTAL_SPRITES]; struct Sprite *ashSprites[NUM_ASH_SPRITES]; struct Sprite *fogDSprites[NUM_FOG_DIAGONAL_SPRITES]; struct Sprite *sandstormSprites1[NUM_SANDSTORM_SPRITES]; struct Sprite *sandstormSprites2[NUM_SWIRL_SANDSTORM_SPRITES]; } s2; } sprites; s8 gammaIndex; s8 gammaTargetIndex; u8 gammaStepDelay; u8 gammaStepFrameCounter; u16 fadeDestColor; u8 palProcessingState; u8 fadeScreenCounter; bool8 readyForInit; u8 taskId; u8 fadeInActive; u8 fadeInCounter; u16 initStep; u16 finishStep; u8 currWeather; u8 nextWeather; u8 weatherGfxLoaded; bool8 weatherChangeComplete; u8 weatherPicSpritePalIndex; u8 altGammaSpritePalIndex; u16 rainSpriteVisibleCounter; u8 curRainSpriteIndex; u8 targetRainSpriteCount; u8 rainSpriteCount; u8 rainSpriteVisibleDelay; u8 isDownpour; u8 rainStrength; bool8 cloudSpritesCreated; u16 snowflakeVisibleCounter; u16 snowflakeTimer; u8 snowflakeSpriteCount; u8 targetSnowflakeSpriteCount; u16 thunderDelay; u16 thunderCounter; bool8 thunderAllowEnd; bool8 thunderSkipShort; u8 thunderShortRetries; bool8 thunderTriggered; u16 fogHScrollPosX; u16 fogHScrollCounter; u16 fogHScrollOffset; u8 lightenedFogSpritePals[6]; u8 lightenedFogSpritePalsCount; bool8 fogHSpritesCreated; u16 ashBaseSpritesX; u16 ashUnused; bool8 ashSpritesCreated; u32 sandstormXOffset; u32 sandstormYOffset; u8 filler_70C[2]; u16 sandstormBaseSpritesX; u16 sandstormPosY; u16 sandstormWaveIndex; u16 sandstormWaveCounter; bool8 sandstormSpritesCreated; bool8 sandstormSwirlSpritesCreated; u16 fogDBaseSpritesX; u16 fogDPosY; u16 fogDScrollXCounter; u16 fogDScrollYCounter; u16 fogDXOffset; u16 fogDYOffset; bool8 fogDSpritesCreated; u16 bubblesDelayCounter; u16 bubblesDelayIndex; u16 bubblesCoordsIndex; u16 bubblesSpriteCount; bool8 bubblesSpritesCreated; u16 currBlendEVA; u16 currBlendEVB; u16 targetBlendEVA; u16 targetBlendEVB; u8 blendUpdateCounter; u8 blendFrameCounter; u8 blendDelay; s16 droughtBrightnessStage; s16 droughtLastBrightnessStage; s16 droughtTimer; s16 droughtState; u8 filler_744[0xD-4]; s8 loadDroughtPalsIndex; u8 loadDroughtPalsOffset; }; extern struct Weather *const gWeatherPtr; void FadeScreen(u8 mode, s8 delay); void SetSavedWeather(u32); u8 GetSav1Weather(void); void DoCurrentWeather(void); void SetSavedWeatherFromCurrMapHeader(void); void SlightlyDarkenPalsInWeather(u16 *, u16 *, u32); void PlayRainStoppingSoundEffect(void); bool8 IsWeatherNotFadingIn(void); void SetWeatherScreenFadeOut(void); void WeatherProcessingIdle(void); u8 GetCurrentWeather(void); void delay(u8, u8, u32); void UpdateSpritePaletteWithWeather(u8 palIdx); void ResetPreservedPalettesInWeather(void); void PreservePaletteInWeather(u8 palIdx); void SetNextWeather(u8 weather); void SetCurrentAndNextWeather(u8 weather); void SetCurrentAndNextWeatherNoDelay(u8 weather); void Weather_SetBlendCoeffs(u8 eva, u8 evb); void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay); bool8 Weather_UpdateBlend(void); void LoadCustomWeatherSpritePalette(const u16 *palette); void ResetDroughtWeatherPaletteLoading(void); bool8 LoadDroughtWeatherPalettes(void); void DroughtStateInit(void); void DroughtStateRun(void); void SetRainStrengthFromSoundEffect(u16 soundEffect); void WeatherShiftGammaIfPalStateIdle(s8 gammaIndex); void WeatherBeginGammaFade(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay); void ApplyWeatherGammaShiftToPal(u8 paletteIndex); void StartWeather(void); void ResumePausedWeather(void); void FadeSelectedPals(u8 mode, s8 delay, u32 selectedPalettes); extern const u16 gCloudsWeatherPalette[]; extern const u16 gSandstormWeatherPalette[]; extern const u8 gWeatherFogDiagonalTiles[]; extern const u8 gWeatherFogHorizontalTiles[]; extern const u8 gWeatherCloudTiles[]; extern const u8 gWeatherSnow1Tiles[]; extern const u8 gWeatherSnow2Tiles[]; extern const u8 gWeatherBubbleTiles[]; extern const u8 gWeatherAshTiles[]; extern const u8 gWeatherRainTiles[]; extern const u8 gWeatherSandstormTiles[]; #endif // GUARD_WEATHER_H ================================================ FILE: include/field_weather_effects.h ================================================ #ifndef GUARD_FIELD_WEATHER_EFFECTS_H #define GUARD_FIELD_WEATHER_EFFECTS_H bool8 Ash_Finish(void); bool8 Bubbles_Finish(void); bool8 Clouds_Finish(void); bool8 FogHorizontal_Finish(void); bool8 FogDiagonal_Finish(void); bool8 Rain_Finish(void); bool8 Thunderstorm_Finish(void); bool8 Sandstorm_Finish(void); bool8 Snow_Finish(void); bool8 Sunny_Finish(void); bool8 Drought_Finish(void); bool8 Shade_Finish(void); void Ash_InitAll(void); void Ash_InitVars(void); void Ash_Main(void); void Bubbles_InitAll(void); void Bubbles_InitVars(void); void Bubbles_Main(void); void Clouds_InitAll(void); void Clouds_InitVars(void); void Clouds_Main(void); void Drought_InitAll(void); void Drought_InitVars(void); void Drought_Main(void); void FogHorizontal_InitAll(void); void FogHorizontal_InitVars(void); void FogHorizontal_Main(void); void FogDiagonal_InitAll(void); void FogDiagonal_InitVars(void); void FogDiagonal_Main(void); void Rain_InitAll(void); void Rain_InitVars(void); void Rain_Main(void); void Thunderstorm_Main(void); void Sandstorm_InitAll(void); void Sandstorm_InitVars(void); void Sandstorm_Main(void); void Snow_InitAll(void); void Snow_InitVars(void); void Shade_InitAll(void); void Shade_InitVars(void); void Sunny_InitAll(void); void Sunny_InitVars(void); void Sunny_Main(void); void Shade_Main(void); void Snow_Main(void); void Thunderstorm_InitVars(void); void Thunderstorm_InitAll(void); void Downpour_InitVars(void); void Downpour_InitAll(void); #endif //GUARD_FIELD_WEATHER_EFFECTS_H ================================================ FILE: include/field_weather_util.h ================================================ #ifndef GUARD_FIELD_WEATHER_UTIL_H #define GUARD_FIELD_WEATHER_UTIL_H void SetWeather(u8 weather); #endif //GUARD_FIELD_WEATHER_UTIL_H ================================================ FILE: include/fieldmap.h ================================================ #ifndef GUARD_FIELDMAP_H #define GUARD_FIELDMAP_H #include "global.h" #define NUM_TILES_IN_PRIMARY 640 #define NUM_TILES_TOTAL 1024 #define NUM_METATILES_IN_PRIMARY 640 #define NUM_METATILES_TOTAL 1024 #define NUM_PALS_IN_PRIMARY 7 #define NUM_PALS_TOTAL 13 #define MAX_MAP_DATA_SIZE 0x2800 #define VIRTUAL_MAP_SIZE (MAX_MAP_DATA_SIZE) // Map coordinates are offset by 7 when using the map // buffer because it needs to load sufficient border // metatiles to fill the player's view (the player has // 7 metatiles of view horizontally in either direction). #define MAP_OFFSET 7 #define MAP_OFFSET_W (MAP_OFFSET * 2 + 1) #define MAP_OFFSET_H (MAP_OFFSET * 2) extern struct BackupMapLayout VMap; extern const struct MapLayout Route1_Layout; u32 MapGridGetMetatileIdAt(s32, s32); u32 MapGridGetMetatileBehaviorAt(s16, s16); u8 MapGridGetMetatileLayerTypeAt(s16 x, s16 y); void MapGridSetMetatileIdAt(s32, s32, u16); void MapGridSetMetatileEntryAt(s32, s32, u16); u8 MapGridGetElevationAt(s32 x, s32 y); void GetCameraCoords(u16 *, u16 *); bool8 MapGridGetCollisionAt(s32, s32); s32 GetMapBorderIdAt(s32, s32); bool32 CanCameraMoveInDirection(s32); const struct MapHeader * GetMapHeaderFromConnection(const struct MapConnection * connection); const struct MapConnection * GetMapConnectionAtPos(s16 x, s16 y); void ApplyGlobalTintToPaletteSlot(u8 slot, u8 count); void SaveMapView(void); u32 ExtractMetatileAttribute(u32 attributes, u8 attributeType); u32 MapGridGetMetatileAttributeAt(s16 x, s16 y, u8 attributeType); void MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 arg2); bool8 CameraMove(s32 x, s32 y); void CopyMapTilesetsToVram(struct MapLayout const * mapLayout); void LoadMapTilesetPalettes(struct MapLayout const * mapLayout); void InitMap(void); void CopySecondaryTilesetToVramUsingHeap(const struct MapLayout * mapLayout); void LoadSecondaryTilesetPalette(const struct MapLayout * mapLayout); void InitMapFromSavedGame(void); void CopyPrimaryTilesetToVram(const struct MapLayout *mapLayout); void CopySecondaryTilesetToVram(const struct MapLayout *mapLayout); void GetCameraFocusCoords(u16 *x, u16 *y); void SetCameraFocusCoords(u16 x, u16 y); #endif //GUARD_FIELDMAP_H ================================================ FILE: include/fldeff.h ================================================ #ifndef GUARD_FLDEFF_H #define GUARD_FLDEFF_H #define FLDEFF_CALL_FUNC_IN_DATA() ((void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]))(); #define FLDEFF_SET_FUNC_TO_DATA(func) \ gTasks[taskId].data[8] = (u32)func >> 16; \ gTasks[taskId].data[9] = (u32)func; extern struct MapPosition gPlayerFacingPosition; bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId); u8 CreateFieldEffectShowMon(void); // flash u8 MapTransitionIsExit(u8 lightLevel, u8 mapType); u8 MapTransitionIsEnter(u8 mapType1, u8 mapType2); bool8 SetUpFieldMove_Flash(void); void CB2_DoChangeMap(void); // cut bool8 SetUpFieldMove_Cut(void); // dig bool8 SetUpFieldMove_Dig(void); bool8 FldEff_UseDig(void); // rocksmash bool8 SetUpFieldMove_RockSmash(void); bool8 FldEff_UseRockSmash(void); // berrytree void nullsub_56(void); // poison void FldEffPoison_Start(void); bool32 FldEffPoison_IsActive(void); // strength bool8 SetUpFieldMove_Strength(void); bool8 FldEff_UseStrength(void); // teleport bool8 SetUpFieldMove_Teleport(void); bool8 FldEff_UseTeleport(void); // softboiled bool8 SetUpFieldMove_SoftBoiled(void); void ChooseMonForSoftboiled(u8 taskId); void Task_TryUseSoftboiledOnPartyMon(u8 taskId); // sweetscent bool8 SetUpFieldMove_SweetScent(void); bool8 FldEff_SweetScent(void); #endif // GUARD_FLDEFF_H ================================================ FILE: include/gba/defines.h ================================================ #ifndef GUARD_GBA_DEFINES #define GUARD_GBA_DEFINES #include #define TRUE 1 #define FALSE 0 #if defined(__APPLE__) #define IWRAM_DATA __attribute__((section("__DATA,iwram_data"))) #define EWRAM_DATA __attribute__((section("__DATA,ewram_data"))) #else #define IWRAM_DATA __attribute__((section("iwram_data"))) #define EWRAM_DATA __attribute__((section("ewram_data"))) #endif #if MODERN #define NOINLINE __attribute__((noinline)) #else #define NOINLINE #endif #define ALIGNED(n) __attribute__((aligned(n))) #define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0) #define INTR_CHECK (*(u16 *)0x3007FF8) #define INTR_VECTOR (*(void **)0x3007FFC) #define EWRAM_START 0x02000000 #define EWRAM_END (EWRAM_START + 0x40000) #define IWRAM_START 0x03000000 #define IWRAM_END (IWRAM_START + 0x8000) #define PLTT 0x5000000 #define BG_PLTT PLTT #define BG_PLTT_SIZE 0x200 #define OBJ_PLTT (PLTT + BG_PLTT_SIZE) #define OBJ_PLTT_SIZE 0x200 #define PLTT_SIZE (BG_PLTT_SIZE + OBJ_PLTT_SIZE) #define VRAM 0x6000000 #define VRAM_SIZE 0x18000 #define BG_VRAM VRAM #define BG_VRAM_SIZE 0x10000 #define BG_CHAR_SIZE 0x4000 #define BG_SCREEN_SIZE 0x800 #define BG_CHAR_ADDR(n) (void *)(BG_VRAM + (BG_CHAR_SIZE * (n))) #define BG_SCREEN_ADDR(n) (void *)(BG_VRAM + (BG_SCREEN_SIZE * (n))) #define BG_TILE_ADDR(n) (void *)(BG_VRAM + (0x80 * (n))) #define BG_TILE_H_FLIP(n) (0x400 + (n)) #define BG_TILE_V_FLIP(n) (0x800 + (n)) #define BG_TILE_H_V_FLIP(n) (0xC00 + (n)) // text-mode BG #define OBJ_VRAM0 (void *)(VRAM + 0x10000) #define OBJ_VRAM0_SIZE 0x8000 // bitmap-mode BG #define OBJ_VRAM1 (void *)(VRAM + 0x14000) #define OBJ_VRAM1_SIZE 0x4000 #define OAM 0x7000000 #define OAM_SIZE 0x400 #define ROM_HEADER_SIZE 0xC0 #define DISPLAY_WIDTH 240 #define DISPLAY_HEIGHT 160 #define TILE_SIZE_4BPP 32 #define TILE_SIZE_8BPP 64 #define TILE_OFFSET_4BPP(n) ((n) * TILE_SIZE_4BPP) #define TILE_OFFSET_8BPP(n) ((n) * TILE_SIZE_8BPP) #define TOTAL_OBJ_TILE_COUNT 1024 #define PLTT_SIZEOF(n) ((n) * sizeof(u16)) #define PLTT_SIZE_4BPP PLTT_SIZEOF(16) #define PLTT_SIZE_8BPP PLTT_SIZEOF(256) #define PLTT_OFFSET_4BPP(n) ((n) * PLTT_SIZE_4BPP) // Some functions are strictly inline asm #define NAKED __attribute__((naked)) #define UNUSED __attribute__((unused)) #endif // GUARD_GBA_DEFINES ================================================ FILE: include/gba/flash_internal.h ================================================ #ifndef GUARD_GBA_FLASH_INTERNAL_H #define GUARD_GBA_FLASH_INTERNAL_H #define FLASH_BASE ((u8 *)0xE000000) #define FLASH_WRITE(addr, data) ((*(vu8 *)(FLASH_BASE + (addr))) = (data)) #define FLASH_ROM_SIZE_1M 131072 // 1 megabit ROM #define SECTORS_PER_BANK 16 struct FlashSector { u32 size; u8 shift; u16 count; u16 top; }; struct FlashType { u32 romSize; struct FlashSector sector; u16 wait[2]; // game pak bus read/write wait // TODO: add support for anonymous unions/structs if possible union { struct { u8 makerId; u8 deviceId; } separate; u16 joined; } ids; }; struct FlashSetupInfo { u16 (*programFlashByte)(u16, u32, u8); u16 (*programFlashSector)(u16, void *); u16 (*eraseFlashChip)(void); u16 (*eraseFlashSector)(u16); u16 (*WaitForFlashWrite)(u8, u8 *, u8); const u16 *maxTime; struct FlashType type; }; extern u16 gFlashNumRemainingBytes; extern u16 (*ProgramFlashByte)(u16, u32, u8); extern u16 (*ProgramFlashSector)(u16, void *); extern u16 (*EraseFlashChip)(void); extern u16 (*EraseFlashSector)(u16); extern u16 (*WaitForFlashWrite)(u8, u8 *, u8); extern const u16 *gFlashMaxTime; extern const struct FlashType *gFlash; extern u8 (*PollFlashStatus)(u8 *); extern u8 gFlashTimeoutFlag; extern const struct FlashSetupInfo MX29L010; extern const struct FlashSetupInfo LE26FV10N1TS; extern const struct FlashSetupInfo DefaultFlash; void SwitchFlashBank(u8 bankNum); u16 ReadFlashId(void); void StartFlashTimer(u8 phase); void SetReadFlash1(u16 *dest); void StopFlashTimer(void); u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)); u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src); void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size); u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n); u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData); u16 EraseFlashChip_MX(void); u16 EraseFlashSector_MX(u16 sectorNum); u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data); u16 ProgramFlashSector_MX(u16 sectorNum, void *src); // agb_flash_1m u16 IdentifyFlash(void); #endif // GUARD_GBA_FLASH_INTERNAL_H ================================================ FILE: include/gba/gba.h ================================================ #ifndef GUARD_GBA_GBA_H #define GUARD_GBA_GBA_H #include #include "defines.h" #include "io_reg.h" #include "types.h" #include "multiboot.h" #include "syscall.h" #include "macro.h" #include "isagbprint.h" #endif // GUARD_GBA_GBA_H ================================================ FILE: include/gba/io_reg.h ================================================ #ifndef GUARD_GBA_IO_REG_H #define GUARD_GBA_IO_REG_H #define REG_BASE 0x4000000 // I/O register base address // I/O register offsets #define REG_OFFSET_DISPCNT 0x0 #define REG_OFFSET_DISPSTAT 0x4 #define REG_OFFSET_VCOUNT 0x6 #define REG_OFFSET_BG0CNT 0x8 #define REG_OFFSET_BG1CNT 0xa #define REG_OFFSET_BG2CNT 0xc #define REG_OFFSET_BG3CNT 0xe #define REG_OFFSET_BG0HOFS 0x10 #define REG_OFFSET_BG0VOFS 0x12 #define REG_OFFSET_BG1HOFS 0x14 #define REG_OFFSET_BG1VOFS 0x16 #define REG_OFFSET_BG2HOFS 0x18 #define REG_OFFSET_BG2VOFS 0x1a #define REG_OFFSET_BG3HOFS 0x1c #define REG_OFFSET_BG3VOFS 0x1e #define REG_OFFSET_BG2PA 0x20 #define REG_OFFSET_BG2PB 0x22 #define REG_OFFSET_BG2PC 0x24 #define REG_OFFSET_BG2PD 0x26 #define REG_OFFSET_BG2X 0x28 #define REG_OFFSET_BG2X_L 0x28 #define REG_OFFSET_BG2X_H 0x2a #define REG_OFFSET_BG2Y 0x2c #define REG_OFFSET_BG2Y_L 0x2c #define REG_OFFSET_BG2Y_H 0x2e #define REG_OFFSET_BG3PA 0x30 #define REG_OFFSET_BG3PB 0x32 #define REG_OFFSET_BG3PC 0x34 #define REG_OFFSET_BG3PD 0x36 #define REG_OFFSET_BG3X 0x38 #define REG_OFFSET_BG3X_L 0x38 #define REG_OFFSET_BG3X_H 0x3a #define REG_OFFSET_BG3Y 0x3c #define REG_OFFSET_BG3Y_L 0x3c #define REG_OFFSET_BG3Y_H 0x3e #define REG_OFFSET_WIN0H 0x40 #define REG_OFFSET_WIN1H 0x42 #define REG_OFFSET_WIN0V 0x44 #define REG_OFFSET_WIN1V 0x46 #define REG_OFFSET_WININ 0x48 #define REG_OFFSET_WINOUT 0x4a #define REG_OFFSET_MOSAIC 0x4c #define REG_OFFSET_BLDCNT 0x50 #define REG_OFFSET_BLDALPHA 0x52 #define REG_OFFSET_BLDY 0x54 #define REG_OFFSET_SOUND1CNT_L 0x60 #define REG_OFFSET_NR10 0x60 #define REG_OFFSET_SOUND1CNT_H 0x62 #define REG_OFFSET_NR11 0x62 #define REG_OFFSET_NR12 0x63 #define REG_OFFSET_SOUND1CNT_X 0x64 #define REG_OFFSET_NR13 0x64 #define REG_OFFSET_NR14 0x65 #define REG_OFFSET_SOUND2CNT_L 0x68 #define REG_OFFSET_NR21 0x68 #define REG_OFFSET_NR22 0x69 #define REG_OFFSET_SOUND2CNT_H 0x6c #define REG_OFFSET_NR23 0x6c #define REG_OFFSET_NR24 0x6d #define REG_OFFSET_SOUND3CNT_L 0x70 #define REG_OFFSET_NR30 0x70 #define REG_OFFSET_SOUND3CNT_H 0x72 #define REG_OFFSET_NR31 0x72 #define REG_OFFSET_NR32 0x73 #define REG_OFFSET_SOUND3CNT_X 0x74 #define REG_OFFSET_NR33 0x74 #define REG_OFFSET_NR34 0x75 #define REG_OFFSET_SOUND4CNT_L 0x78 #define REG_OFFSET_NR41 0x78 #define REG_OFFSET_NR42 0x79 #define REG_OFFSET_SOUND4CNT_H 0x7c #define REG_OFFSET_NR43 0x7c #define REG_OFFSET_NR44 0x7d #define REG_OFFSET_SOUNDCNT_L 0x80 #define REG_OFFSET_NR50 0x80 #define REG_OFFSET_NR51 0x81 #define REG_OFFSET_SOUNDCNT_H 0x82 #define REG_OFFSET_SOUNDCNT_X 0x84 #define REG_OFFSET_NR52 0x84 #define REG_OFFSET_SOUNDBIAS 0x88 #define REG_OFFSET_SOUNDBIAS_L 0x88 #define REG_OFFSET_SOUNDBIAS_H 0x89 #define REG_OFFSET_WAVE_RAM0 0x90 #define REG_OFFSET_WAVE_RAM1 0x94 #define REG_OFFSET_WAVE_RAM2 0x98 #define REG_OFFSET_WAVE_RAM3 0x9c #define REG_OFFSET_FIFO_A 0xa0 #define REG_OFFSET_FIFO_B 0xa4 #define REG_OFFSET_DMA0 0xb0 #define REG_OFFSET_DMA0SAD 0xb0 #define REG_OFFSET_DMA0SAD_L 0xb0 #define REG_OFFSET_DMA0SAD_H 0xb2 #define REG_OFFSET_DMA0DAD 0xb4 #define REG_OFFSET_DMA0DAD_L 0xb4 #define REG_OFFSET_DMA0DAD_H 0xb6 #define REG_OFFSET_DMA0CNT 0xb8 #define REG_OFFSET_DMA0CNT_L 0xb8 #define REG_OFFSET_DMA0CNT_H 0xba #define REG_OFFSET_DMA1 0xbc #define REG_OFFSET_DMA1SAD 0xbc #define REG_OFFSET_DMA1SAD_L 0xbc #define REG_OFFSET_DMA1SAD_H 0xbe #define REG_OFFSET_DMA1DAD 0xc0 #define REG_OFFSET_DMA1DAD_L 0xc0 #define REG_OFFSET_DMA1DAD_H 0xc2 #define REG_OFFSET_DMA1CNT 0xc4 #define REG_OFFSET_DMA1CNT_L 0xc4 #define REG_OFFSET_DMA1CNT_H 0xc6 #define REG_OFFSET_DMA2 0xc8 #define REG_OFFSET_DMA2SAD 0xc8 #define REG_OFFSET_DMA2SAD_L 0xc8 #define REG_OFFSET_DMA2SAD_H 0xca #define REG_OFFSET_DMA2DAD 0xcc #define REG_OFFSET_DMA2DAD_L 0xcc #define REG_OFFSET_DMA2DAD_H 0xce #define REG_OFFSET_DMA2CNT 0xd0 #define REG_OFFSET_DMA2CNT_L 0xd0 #define REG_OFFSET_DMA2CNT_H 0xd2 #define REG_OFFSET_DMA3 0xd4 #define REG_OFFSET_DMA3SAD 0xd4 #define REG_OFFSET_DMA3SAD_L 0xd4 #define REG_OFFSET_DMA3SAD_H 0xd6 #define REG_OFFSET_DMA3DAD 0xd8 #define REG_OFFSET_DMA3DAD_L 0xd8 #define REG_OFFSET_DMA3DAD_H 0xda #define REG_OFFSET_DMA3CNT 0xdc #define REG_OFFSET_DMA3CNT_L 0xdc #define REG_OFFSET_DMA3CNT_H 0xde #define REG_OFFSET_TMCNT 0x100 #define REG_OFFSET_TMCNT_L 0x100 #define REG_OFFSET_TMCNT_H 0x102 #define REG_OFFSET_TM0CNT 0x100 #define REG_OFFSET_TM0CNT_L 0x100 #define REG_OFFSET_TM0CNT_H 0x102 #define REG_OFFSET_TM1CNT 0x104 #define REG_OFFSET_TM1CNT_L 0x104 #define REG_OFFSET_TM1CNT_H 0x106 #define REG_OFFSET_TM2CNT 0x108 #define REG_OFFSET_TM2CNT_L 0x108 #define REG_OFFSET_TM2CNT_H 0x10a #define REG_OFFSET_TM3CNT 0x10c #define REG_OFFSET_TM3CNT_L 0x10c #define REG_OFFSET_TM3CNT_H 0x10e #define REG_OFFSET_SIOCNT 0x128 #define REG_OFFSET_SIODATA8 0x12a #define REG_OFFSET_SIODATA32 0x120 #define REG_OFFSET_SIOMLT_SEND 0x12a #define REG_OFFSET_SIOMLT_RECV 0x120 #define REG_OFFSET_SIOMULTI0 0x120 #define REG_OFFSET_SIOMULTI1 0x122 #define REG_OFFSET_SIOMULTI2 0x124 #define REG_OFFSET_SIOMULTI3 0x126 #define REG_OFFSET_KEYINPUT 0x130 #define REG_OFFSET_KEYCNT 0x132 #define REG_OFFSET_RCNT 0x134 #define REG_OFFSET_JOYCNT 0x140 #define REG_OFFSET_JOYSTAT 0x158 #define REG_OFFSET_JOY_RECV 0x150 #define REG_OFFSET_JOY_RECV_L 0x150 #define REG_OFFSET_JOY_RECV_H 0x152 #define REG_OFFSET_JOY_TRANS 0x154 #define REG_OFFSET_JOY_TRANS_L 0x154 #define REG_OFFSET_JOY_TRANS_H 0x156 #define REG_OFFSET_IME 0x208 #define REG_OFFSET_IE 0x200 #define REG_OFFSET_IF 0x202 #define REG_OFFSET_WAITCNT 0x204 // I/O register addresses #define REG_ADDR_DISPCNT (REG_BASE + REG_OFFSET_DISPCNT) #define REG_ADDR_DISPSTAT (REG_BASE + REG_OFFSET_DISPSTAT) #define REG_ADDR_VCOUNT (REG_BASE + REG_OFFSET_VCOUNT) #define REG_ADDR_BG0CNT (REG_BASE + REG_OFFSET_BG0CNT) #define REG_ADDR_BG1CNT (REG_BASE + REG_OFFSET_BG1CNT) #define REG_ADDR_BG2CNT (REG_BASE + REG_OFFSET_BG2CNT) #define REG_ADDR_BG3CNT (REG_BASE + REG_OFFSET_BG3CNT) #define REG_ADDR_BG0HOFS (REG_BASE + REG_OFFSET_BG0HOFS) #define REG_ADDR_BG0VOFS (REG_BASE + REG_OFFSET_BG0VOFS) #define REG_ADDR_BG1HOFS (REG_BASE + REG_OFFSET_BG1HOFS) #define REG_ADDR_BG1VOFS (REG_BASE + REG_OFFSET_BG1VOFS) #define REG_ADDR_BG2HOFS (REG_BASE + REG_OFFSET_BG2HOFS) #define REG_ADDR_BG2VOFS (REG_BASE + REG_OFFSET_BG2VOFS) #define REG_ADDR_BG3HOFS (REG_BASE + REG_OFFSET_BG3HOFS) #define REG_ADDR_BG3VOFS (REG_BASE + REG_OFFSET_BG3VOFS) #define REG_ADDR_BG2PA (REG_BASE + REG_OFFSET_BG2PA) #define REG_ADDR_BG2PB (REG_BASE + REG_OFFSET_BG2PB) #define REG_ADDR_BG2PC (REG_BASE + REG_OFFSET_BG2PC) #define REG_ADDR_BG2PD (REG_BASE + REG_OFFSET_BG2PD) #define REG_ADDR_BG2X (REG_BASE + REG_OFFSET_BG2X) #define REG_ADDR_BG2X_L (REG_BASE + REG_OFFSET_BG2X_L) #define REG_ADDR_BG2X_H (REG_BASE + REG_OFFSET_BG2X_H) #define REG_ADDR_BG2Y (REG_BASE + REG_OFFSET_BG2Y) #define REG_ADDR_BG2Y_L (REG_BASE + REG_OFFSET_BG2Y_L) #define REG_ADDR_BG2Y_H (REG_BASE + REG_OFFSET_BG2Y_H) #define REG_ADDR_BG3PA (REG_BASE + REG_OFFSET_BG3PA) #define REG_ADDR_BG3PB (REG_BASE + REG_OFFSET_BG3PB) #define REG_ADDR_BG3PC (REG_BASE + REG_OFFSET_BG3PC) #define REG_ADDR_BG3PD (REG_BASE + REG_OFFSET_BG3PD) #define REG_ADDR_BG3X (REG_BASE + REG_OFFSET_BG3X) #define REG_ADDR_BG3X_L (REG_BASE + REG_OFFSET_BG3X_L) #define REG_ADDR_BG3X_H (REG_BASE + REG_OFFSET_BG3X_H) #define REG_ADDR_BG3Y (REG_BASE + REG_OFFSET_BG3Y) #define REG_ADDR_BG3Y_L (REG_BASE + REG_OFFSET_BG3Y_L) #define REG_ADDR_BG3Y_H (REG_BASE + REG_OFFSET_BG3Y_H) #define REG_ADDR_WIN0H (REG_BASE + REG_OFFSET_WIN0H) #define REG_ADDR_WIN1H (REG_BASE + REG_OFFSET_WIN1H) #define REG_ADDR_WIN0V (REG_BASE + REG_OFFSET_WIN0V) #define REG_ADDR_WIN1V (REG_BASE + REG_OFFSET_WIN1V) #define REG_ADDR_WININ (REG_BASE + REG_OFFSET_WININ) #define REG_ADDR_WINOUT (REG_BASE + REG_OFFSET_WINOUT) #define REG_ADDR_MOSAIC (REG_BASE + REG_OFFSET_MOSAIC) #define REG_ADDR_BLDCNT (REG_BASE + REG_OFFSET_BLDCNT) #define REG_ADDR_BLDALPHA (REG_BASE + REG_OFFSET_BLDALPHA) #define REG_ADDR_BLDY (REG_BASE + REG_OFFSET_BLDY) #define REG_ADDR_SOUND1CNT_L (REG_BASE + REG_OFFSET_SOUND1CNT_L) #define REG_ADDR_NR10 (REG_BASE + REG_OFFSET_NR10) #define REG_ADDR_SOUND1CNT_H (REG_BASE + REG_OFFSET_SOUND1CNT_H) #define REG_ADDR_NR11 (REG_BASE + REG_OFFSET_NR11) #define REG_ADDR_NR12 (REG_BASE + REG_OFFSET_NR12) #define REG_ADDR_SOUND1CNT_X (REG_BASE + REG_OFFSET_SOUND1CNT_X) #define REG_ADDR_NR13 (REG_BASE + REG_OFFSET_NR13) #define REG_ADDR_NR14 (REG_BASE + REG_OFFSET_NR14) #define REG_ADDR_SOUND2CNT_L (REG_BASE + REG_OFFSET_SOUND2CNT_L) #define REG_ADDR_NR21 (REG_BASE + REG_OFFSET_NR21) #define REG_ADDR_NR22 (REG_BASE + REG_OFFSET_NR22) #define REG_ADDR_SOUND2CNT_H (REG_BASE + REG_OFFSET_SOUND2CNT_H) #define REG_ADDR_NR23 (REG_BASE + REG_OFFSET_NR23) #define REG_ADDR_NR24 (REG_BASE + REG_OFFSET_NR24) #define REG_ADDR_SOUND3CNT_L (REG_BASE + REG_OFFSET_SOUND3CNT_L) #define REG_ADDR_NR30 (REG_BASE + REG_OFFSET_NR30) #define REG_ADDR_SOUND3CNT_H (REG_BASE + REG_OFFSET_SOUND3CNT_H) #define REG_ADDR_NR31 (REG_BASE + REG_OFFSET_NR31) #define REG_ADDR_NR32 (REG_BASE + REG_OFFSET_NR32) #define REG_ADDR_SOUND3CNT_X (REG_BASE + REG_OFFSET_SOUND3CNT_X) #define REG_ADDR_NR33 (REG_BASE + REG_OFFSET_NR33) #define REG_ADDR_NR34 (REG_BASE + REG_OFFSET_NR34) #define REG_ADDR_SOUND4CNT_L (REG_BASE + REG_OFFSET_SOUND4CNT_L) #define REG_ADDR_NR41 (REG_BASE + REG_OFFSET_NR41) #define REG_ADDR_NR42 (REG_BASE + REG_OFFSET_NR42) #define REG_ADDR_SOUND4CNT_H (REG_BASE + REG_OFFSET_SOUND4CNT_H) #define REG_ADDR_NR43 (REG_BASE + REG_OFFSET_NR43) #define REG_ADDR_NR44 (REG_BASE + REG_OFFSET_NR44) #define REG_ADDR_SOUNDCNT_L (REG_BASE + REG_OFFSET_SOUNDCNT_L) #define REG_ADDR_NR50 (REG_BASE + REG_OFFSET_NR50) #define REG_ADDR_NR51 (REG_BASE + REG_OFFSET_NR51) #define REG_ADDR_SOUNDCNT_H (REG_BASE + REG_OFFSET_SOUNDCNT_H) #define REG_ADDR_SOUNDCNT_X (REG_BASE + REG_OFFSET_SOUNDCNT_X) #define REG_ADDR_NR52 (REG_BASE + REG_OFFSET_NR52) #define REG_ADDR_SOUNDBIAS (REG_BASE + REG_OFFSET_SOUNDBIAS) #define REG_ADDR_SOUNDBIAS_L (REG_BASE + REG_OFFSET_SOUNDBIAS_L) #define REG_ADDR_SOUNDBIAS_H (REG_BASE + REG_OFFSET_SOUNDBIAS_H) #define REG_ADDR_WAVE_RAM0 (REG_BASE + REG_OFFSET_WAVE_RAM0) #define REG_ADDR_WAVE_RAM1 (REG_BASE + REG_OFFSET_WAVE_RAM1) #define REG_ADDR_WAVE_RAM2 (REG_BASE + REG_OFFSET_WAVE_RAM2) #define REG_ADDR_WAVE_RAM3 (REG_BASE + REG_OFFSET_WAVE_RAM3) #define REG_ADDR_FIFO_A (REG_BASE + REG_OFFSET_FIFO_A) #define REG_ADDR_FIFO_B (REG_BASE + REG_OFFSET_FIFO_B) #define REG_ADDR_DMA0 (REG_BASE + REG_OFFSET_DMA0) #define REG_ADDR_DMA0SAD (REG_BASE + REG_OFFSET_DMA0SAD) #define REG_ADDR_DMA0DAD (REG_BASE + REG_OFFSET_DMA0DAD) #define REG_ADDR_DMA0CNT (REG_BASE + REG_OFFSET_DMA0CNT) #define REG_ADDR_DMA0CNT_L (REG_BASE + REG_OFFSET_DMA0CNT_L) #define REG_ADDR_DMA0CNT_H (REG_BASE + REG_OFFSET_DMA0CNT_H) #define REG_ADDR_DMA1 (REG_BASE + REG_OFFSET_DMA1) #define REG_ADDR_DMA1SAD (REG_BASE + REG_OFFSET_DMA1SAD) #define REG_ADDR_DMA1DAD (REG_BASE + REG_OFFSET_DMA1DAD) #define REG_ADDR_DMA1CNT (REG_BASE + REG_OFFSET_DMA1CNT) #define REG_ADDR_DMA1CNT_L (REG_BASE + REG_OFFSET_DMA1CNT_L) #define REG_ADDR_DMA1CNT_H (REG_BASE + REG_OFFSET_DMA1CNT_H) #define REG_ADDR_DMA2 (REG_BASE + REG_OFFSET_DMA2) #define REG_ADDR_DMA2SAD (REG_BASE + REG_OFFSET_DMA2SAD) #define REG_ADDR_DMA2DAD (REG_BASE + REG_OFFSET_DMA2DAD) #define REG_ADDR_DMA2CNT (REG_BASE + REG_OFFSET_DMA2CNT) #define REG_ADDR_DMA2CNT_L (REG_BASE + REG_OFFSET_DMA2CNT_L) #define REG_ADDR_DMA2CNT_H (REG_BASE + REG_OFFSET_DMA2CNT_H) #define REG_ADDR_DMA3 (REG_BASE + REG_OFFSET_DMA3) #define REG_ADDR_DMA3SAD (REG_BASE + REG_OFFSET_DMA3SAD) #define REG_ADDR_DMA3DAD (REG_BASE + REG_OFFSET_DMA3DAD) #define REG_ADDR_DMA3CNT (REG_BASE + REG_OFFSET_DMA3CNT) #define REG_ADDR_DMA3CNT_L (REG_BASE + REG_OFFSET_DMA3CNT_L) #define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H) #define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT) #define REG_ADDR_TMCNT_L (REG_BASE + REG_OFFSET_TMCNT_L) #define REG_ADDR_TMCNT_H (REG_BASE + REG_OFFSET_TMCNT_H) #define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT) #define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L) #define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H) #define REG_ADDR_TM1CNT (REG_BASE + REG_OFFSET_TM1CNT) #define REG_ADDR_TM1CNT_L (REG_BASE + REG_OFFSET_TM1CNT_L) #define REG_ADDR_TM1CNT_H (REG_BASE + REG_OFFSET_TM1CNT_H) #define REG_ADDR_TM2CNT (REG_BASE + REG_OFFSET_TM2CNT) #define REG_ADDR_TM2CNT_L (REG_BASE + REG_OFFSET_TM2CNT_L) #define REG_ADDR_TM2CNT_H (REG_BASE + REG_OFFSET_TM2CNT_H) #define REG_ADDR_TM3CNT (REG_BASE + REG_OFFSET_TM3CNT) #define REG_ADDR_TM3CNT_L (REG_BASE + REG_OFFSET_TM3CNT_L) #define REG_ADDR_TM3CNT_H (REG_BASE + REG_OFFSET_TM3CNT_H) #define REG_ADDR_SIOCNT (REG_BASE + REG_OFFSET_SIOCNT) #define REG_ADDR_SIODATA8 (REG_BASE + REG_OFFSET_SIODATA8) #define REG_ADDR_SIODATA32 (REG_BASE + REG_OFFSET_SIODATA32) #define REG_ADDR_SIOMLT_SEND (REG_BASE + REG_OFFSET_SIOMLT_SEND) #define REG_ADDR_SIOMLT_RECV (REG_BASE + REG_OFFSET_SIOMLT_RECV) #define REG_ADDR_SIOMULTI0 (REG_BASE + REG_OFFSET_SIOMULTI0) #define REG_ADDR_SIOMULTI1 (REG_BASE + REG_OFFSET_SIOMULTI1) #define REG_ADDR_SIOMULTI2 (REG_BASE + REG_OFFSET_SIOMULTI2) #define REG_ADDR_SIOMULTI3 (REG_BASE + REG_OFFSET_SIOMULTI3) #define REG_ADDR_KEYINPUT (REG_BASE + REG_OFFSET_KEYINPUT) #define REG_ADDR_KEYCNT (REG_BASE + REG_OFFSET_KEYCNT) #define REG_ADDR_RCNT (REG_BASE + REG_OFFSET_RCNT) #define REG_ADDR_JOYCNT (REG_BASE + REG_OFFSET_JOYCNT) #define REG_ADDR_JOYSTAT (REG_BASE + REG_OFFSET_JOYSTAT) #define REG_ADDR_JOY_RECV (REG_BASE + REG_OFFSET_JOY_RECV) #define REG_ADDR_JOY_RECV_L (REG_BASE + REG_OFFSET_JOY_RECV_L) #define REG_ADDR_JOY_RECV_H (REG_BASE + REG_OFFSET_JOY_RECV_H) #define REG_ADDR_JOY_TRANS (REG_BASE + REG_OFFSET_JOY_TRANS) #define REG_ADDR_JOY_TRANS_L (REG_BASE + REG_OFFSET_JOY_TRANS_L) #define REG_ADDR_JOY_TRANS_H (REG_BASE + REG_OFFSET_JOY_TRANS_H) #define REG_ADDR_IME (REG_BASE + REG_OFFSET_IME) #define REG_ADDR_IE (REG_BASE + REG_OFFSET_IE) #define REG_ADDR_IF (REG_BASE + REG_OFFSET_IF) #define REG_ADDR_WAITCNT (REG_BASE + REG_OFFSET_WAITCNT) // I/O registers #define REG_DISPCNT (*(vu16 *)REG_ADDR_DISPCNT) #define REG_DISPSTAT (*(vu16 *)REG_ADDR_DISPSTAT) #define REG_VCOUNT (*(vu16 *)REG_ADDR_VCOUNT) #define REG_BG0CNT (*(vu16 *)REG_ADDR_BG0CNT) #define REG_BG1CNT (*(vu16 *)REG_ADDR_BG1CNT) #define REG_BG2CNT (*(vu16 *)REG_ADDR_BG2CNT) #define REG_BG3CNT (*(vu16 *)REG_ADDR_BG3CNT) #define REG_BG0HOFS (*(vu16 *)REG_ADDR_BG0HOFS) #define REG_BG0VOFS (*(vu16 *)REG_ADDR_BG0VOFS) #define REG_BG1HOFS (*(vu16 *)REG_ADDR_BG1HOFS) #define REG_BG1VOFS (*(vu16 *)REG_ADDR_BG1VOFS) #define REG_BG2HOFS (*(vu16 *)REG_ADDR_BG2HOFS) #define REG_BG2VOFS (*(vu16 *)REG_ADDR_BG2VOFS) #define REG_BG3HOFS (*(vu16 *)REG_ADDR_BG3HOFS) #define REG_BG3VOFS (*(vu16 *)REG_ADDR_BG3VOFS) #define REG_BG2PA (*(vu16 *)REG_ADDR_BG2PA) #define REG_BG2PB (*(vu16 *)REG_ADDR_BG2PB) #define REG_BG2PC (*(vu16 *)REG_ADDR_BG2PC) #define REG_BG2PD (*(vu16 *)REG_ADDR_BG2PD) #define REG_BG2X (*(vu32 *)REG_ADDR_BG2X) #define REG_BG2X_L (*(vu16 *)REG_ADDR_BG2X_L) #define REG_BG2X_H (*(vu16 *)REG_ADDR_BG2X_H) #define REG_BG2Y (*(vu32 *)REG_ADDR_BG2Y) #define REG_BG2Y_L (*(vu16 *)REG_ADDR_BG2Y_L) #define REG_BG2Y_H (*(vu16 *)REG_ADDR_BG2Y_H) #define REG_BG3PA (*(vu16 *)REG_ADDR_BG3PA) #define REG_BG3PB (*(vu16 *)REG_ADDR_BG3PB) #define REG_BG3PC (*(vu16 *)REG_ADDR_BG3PC) #define REG_BG3PD (*(vu16 *)REG_ADDR_BG3PD) #define REG_BG3X (*(vu32 *)REG_ADDR_BG3X) #define REG_BG3X_L (*(vu16 *)REG_ADDR_BG3X_L) #define REG_BG3X_H (*(vu16 *)REG_ADDR_BG3X_H) #define REG_BG3Y (*(vu32 *)REG_ADDR_BG3Y) #define REG_BG3Y_L (*(vu16 *)REG_ADDR_BG3Y_L) #define REG_BG3Y_H (*(vu16 *)REG_ADDR_BG3Y_H) #define REG_WIN0H (*(vu16 *)REG_ADDR_WIN0H) #define REG_WIN1H (*(vu16 *)REG_ADDR_WIN1H) #define REG_WIN0V (*(vu16 *)REG_ADDR_WIN0V) #define REG_WIN1V (*(vu16 *)REG_ADDR_WIN1V) #define REG_WININ (*(vu16 *)REG_ADDR_WININ) #define REG_WINOUT (*(vu16 *)REG_ADDR_WINOUT) #define REG_MOSAIC (*(vu16 *)REG_ADDR_MOSAIC) #define REG_BLDCNT (*(vu16 *)REG_ADDR_BLDCNT) #define REG_BLDALPHA (*(vu16 *)REG_ADDR_BLDALPHA) #define REG_BLDY (*(vu16 *)REG_ADDR_BLDY) #define REG_SOUND1CNT_L (*(vu16 *)REG_ADDR_SOUND1CNT_L) #define REG_NR10 (*(vu8 *)REG_ADDR_NR10) #define REG_SOUND1CNT_H (*(vu16 *)REG_ADDR_SOUND1CNT_H) #define REG_NR11 (*(vu8 *)REG_ADDR_NR11) #define REG_NR12 (*(vu8 *)REG_ADDR_NR12) #define REG_SOUND1CNT_X (*(vu16 *)REG_ADDR_SOUND1CNT_X) #define REG_NR13 (*(vu8 *)REG_ADDR_NR13) #define REG_NR14 (*(vu8 *)REG_ADDR_NR14) #define REG_SOUND2CNT_L (*(vu16 *)REG_ADDR_SOUND2CNT_L) #define REG_NR21 (*(vu8 *)REG_ADDR_NR21) #define REG_NR22 (*(vu8 *)REG_ADDR_NR22) #define REG_SOUND2CNT_H (*(vu16 *)REG_ADDR_SOUND2CNT_H) #define REG_NR23 (*(vu8 *)REG_ADDR_NR23) #define REG_NR24 (*(vu8 *)REG_ADDR_NR24) #define REG_SOUND3CNT_L (*(vu16 *)REG_ADDR_SOUND3CNT_L) #define REG_NR30 (*(vu8 *)REG_ADDR_NR30) #define REG_SOUND3CNT_H (*(vu16 *)REG_ADDR_SOUND3CNT_H) #define REG_NR31 (*(vu8 *)REG_ADDR_NR31) #define REG_NR32 (*(vu8 *)REG_ADDR_NR32) #define REG_SOUND3CNT_X (*(vu16 *)REG_ADDR_SOUND3CNT_X) #define REG_NR33 (*(vu8 *)REG_ADDR_NR33) #define REG_NR34 (*(vu8 *)REG_ADDR_NR34) #define REG_SOUND4CNT_L (*(vu16 *)REG_ADDR_SOUND4CNT_L) #define REG_NR41 (*(vu8 *)REG_ADDR_NR41) #define REG_NR42 (*(vu8 *)REG_ADDR_NR42) #define REG_SOUND4CNT_H (*(vu16 *)REG_ADDR_SOUND4CNT_H) #define REG_NR43 (*(vu8 *)REG_ADDR_NR43) #define REG_NR44 (*(vu8 *)REG_ADDR_NR44) #define REG_SOUNDCNT_L (*(vu16 *)REG_ADDR_SOUNDCNT_L) #define REG_NR50 (*(vu8 *)REG_ADDR_NR50) #define REG_NR51 (*(vu8 *)REG_ADDR_NR51) #define REG_SOUNDCNT_H (*(vu16 *)REG_ADDR_SOUNDCNT_H) #define REG_SOUNDCNT_X (*(vu16 *)REG_ADDR_SOUNDCNT_X) #define REG_NR52 (*(vu8 *)REG_ADDR_NR52) #define REG_SOUNDBIAS (*(vu16 *)REG_ADDR_SOUNDBIAS) #define REG_SOUNDBIAS_L (*(vu8 *)REG_ADDR_SOUNDBIAS_L) #define REG_SOUNDBIAS_H (*(vu8 *)REG_ADDR_SOUNDBIAS_H) #define REG_WAVE_RAM0 (*(vu32 *)REG_ADDR_WAVE_RAM0) #define REG_WAVE_RAM1 (*(vu32 *)REG_ADDR_WAVE_RAM1) #define REG_WAVE_RAM2 (*(vu32 *)REG_ADDR_WAVE_RAM2) #define REG_WAVE_RAM3 (*(vu32 *)REG_ADDR_WAVE_RAM3) #define REG_FIFO_A (*(vu32 *)REG_ADDR_FIFO_A) #define REG_FIFO_B (*(vu32 *)REG_ADDR_FIFO_B) #define REG_DMA0SAD (*(vu32 *)REG_ADDR_DMA0SAD) #define REG_DMA0DAD (*(vu32 *)REG_ADDR_DMA0DAD) #define REG_DMA0CNT (*(vu32 *)REG_ADDR_DMA0CNT) #define REG_DMA0CNT_L (*(vu16 *)REG_ADDR_DMA0CNT_L) #define REG_DMA0CNT_H (*(vu16 *)REG_ADDR_DMA0CNT_H) #define REG_DMA1SAD (*(vu32 *)REG_ADDR_DMA1SAD) #define REG_DMA1DAD (*(vu32 *)REG_ADDR_DMA1DAD) #define REG_DMA1CNT (*(vu32 *)REG_ADDR_DMA1CNT) #define REG_DMA1CNT_L (*(vu16 *)REG_ADDR_DMA1CNT_L) #define REG_DMA1CNT_H (*(vu16 *)REG_ADDR_DMA1CNT_H) #define REG_DMA2SAD (*(vu32 *)REG_ADDR_DMA2SAD) #define REG_DMA2DAD (*(vu32 *)REG_ADDR_DMA2DAD) #define REG_DMA2CNT (*(vu32 *)REG_ADDR_DMA2CNT) #define REG_DMA2CNT_L (*(vu16 *)REG_ADDR_DMA2CNT_L) #define REG_DMA2CNT_H (*(vu16 *)REG_ADDR_DMA2CNT_H) #define REG_DMA3SAD (*(vu32 *)REG_ADDR_DMA3SAD) #define REG_DMA3DAD (*(vu32 *)REG_ADDR_DMA3DAD) #define REG_DMA3CNT (*(vu32 *)REG_ADDR_DMA3CNT) #define REG_DMA3CNT_L (*(vu16 *)REG_ADDR_DMA3CNT_L) #define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H) #define REG_TMCNT(n) (*(vu32 *)(REG_ADDR_TMCNT + ((n) * 4))) #define REG_TMCNT_L(n) (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4))) #define REG_TMCNT_H(n) (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4))) #define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT) #define REG_TM0CNT_L (*(vu16 *)REG_ADDR_TM0CNT_L) #define REG_TM0CNT_H (*(vu16 *)REG_ADDR_TM0CNT_H) #define REG_TM1CNT (*(vu32 *)REG_ADDR_TM1CNT) #define REG_TM1CNT_L (*(vu16 *)REG_ADDR_TM1CNT_L) #define REG_TM1CNT_H (*(vu16 *)REG_ADDR_TM1CNT_H) #define REG_TM2CNT (*(vu32 *)REG_ADDR_TM2CNT) #define REG_TM2CNT_L (*(vu16 *)REG_ADDR_TM2CNT_L) #define REG_TM2CNT_H (*(vu16 *)REG_ADDR_TM2CNT_H) #define REG_TM3CNT (*(vu32 *)REG_ADDR_TM3CNT) #define REG_TM3CNT_L (*(vu16 *)REG_ADDR_TM3CNT_L) #define REG_TM3CNT_H (*(vu16 *)REG_ADDR_TM3CNT_H) #define REG_SIOCNT (*(vu16 *)REG_ADDR_SIOCNT) #define REG_SIODATA8 (*(vu16 *)REG_ADDR_SIODATA8) #define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32) #define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND) #define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV) #define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0) #define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1) #define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2) #define REG_SIOMULTI3 (*(vu16 *)REG_ADDR_SIOMULTI3) #define REG_KEYINPUT (*(vu16 *)REG_ADDR_KEYINPUT) #define REG_KEYCNT (*(vu16 *)REG_ADDR_KEYCNT) #define REG_RCNT (*(vu16 *)REG_ADDR_RCNT) #define REG_IME (*(vu16 *)REG_ADDR_IME) #define REG_IE (*(vu16 *)REG_ADDR_IE) #define REG_IF (*(vu16 *)REG_ADDR_IF) #define REG_WAITCNT (*(vu16 *)REG_ADDR_WAITCNT) // I/O register fields // DISPCNT #define DISPCNT_MODE_0 0x0000 // BG0: text, BG1: text, BG2: text, BG3: text #define DISPCNT_MODE_1 0x0001 // BG0: text, BG1: text, BG2: affine, BG3: off #define DISPCNT_MODE_2 0x0002 // BG0: off, BG1: off, BG2: affine, BG3: affine #define DISPCNT_MODE_3 0x0003 // Bitmap mode, 240x160, BGR555 color #define DISPCNT_MODE_4 0x0004 // Bitmap mode, 240x160, 256 color palette #define DISPCNT_MODE_5 0x0005 // Bitmap mode, 160x128, BGR555 color #define DISPCNT_OBJ_1D_MAP 0x0040 #define DISPCNT_FORCED_BLANK 0x0080 #define DISPCNT_BG0_ON 0x0100 #define DISPCNT_BG1_ON 0x0200 #define DISPCNT_BG2_ON 0x0400 #define DISPCNT_BG3_ON 0x0800 #define DISPCNT_BG_ALL_ON 0x0F00 #define DISPCNT_OBJ_ON 0x1000 #define DISPCNT_WIN0_ON 0x2000 #define DISPCNT_WIN1_ON 0x4000 #define DISPCNT_OBJWIN_ON 0x8000 // DISPSTAT #define DISPSTAT_VBLANK 0x0001 // in V-Blank #define DISPSTAT_HBLANK 0x0002 // in H-Blank #define DISPSTAT_VCOUNT 0x0004 // V-Count match #define DISPSTAT_VBLANK_INTR 0x0008 // V-Blank interrupt enabled #define DISPSTAT_HBLANK_INTR 0x0010 // H-Blank interrupt enabled #define DISPSTAT_VCOUNT_INTR 0x0020 // V-Count interrupt enabled // BGCNT #define BGCNT_PRIORITY(n) (n) // Values 0 - 3. Lower priority BGs will be drawn on top of higher priority BGs. #define BGCNT_CHARBASE(n) ((n) << 2) // Values 0 - 3. Base block for tile pixel data. #define BGCNT_MOSAIC 0x0040 #define BGCNT_16COLOR 0x0000 // 4 bits per pixel #define BGCNT_256COLOR 0x0080 // 8 bits per pixel #define BGCNT_SCREENBASE(n) ((n) << 8) // Values 0 - 31. Base block for tile map. #define BGCNT_WRAP 0x2000 // Only affects affine BGs. Text BGs wrap by default. #define BGCNT_TXT256x256 0x0000 // Internal screen size size of text mode BG in pixels. #define BGCNT_TXT512x256 0x4000 #define BGCNT_TXT256x512 0x8000 #define BGCNT_TXT512x512 0xC000 #define BGCNT_AFF128x128 0x0000 // Internal screen size size of affine mode BG in pixels. #define BGCNT_AFF256x256 0x4000 #define BGCNT_AFF512x512 0x8000 #define BGCNT_AFF1024x1024 0xC000 // WININ/OUT #define WININ_WIN0_BG0 (1 << 0) #define WININ_WIN0_BG1 (1 << 1) #define WININ_WIN0_BG2 (1 << 2) #define WININ_WIN0_BG3 (1 << 3) #define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) #define WININ_WIN0_OBJ (1 << 4) #define WININ_WIN0_CLR (1 << 5) #define WININ_WIN0_ALL (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR) #define WININ_WIN1_BG0 (1 << 8) #define WININ_WIN1_BG1 (1 << 9) #define WININ_WIN1_BG2 (1 << 10) #define WININ_WIN1_BG3 (1 << 11) #define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3) #define WININ_WIN1_OBJ (1 << 12) #define WININ_WIN1_CLR (1 << 13) #define WININ_WIN1_ALL (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR) #define WINOUT_WIN01_BG0 (1 << 0) #define WINOUT_WIN01_BG1 (1 << 1) #define WINOUT_WIN01_BG2 (1 << 2) #define WINOUT_WIN01_BG3 (1 << 3) #define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3) #define WINOUT_WIN01_OBJ (1 << 4) #define WINOUT_WIN01_CLR (1 << 5) #define WINOUT_WIN01_ALL (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR) #define WINOUT_WINOBJ_BG0 (1 << 8) #define WINOUT_WINOBJ_BG1 (1 << 9) #define WINOUT_WINOBJ_BG2 (1 << 10) #define WINOUT_WINOBJ_BG3 (1 << 11) #define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3) #define WINOUT_WINOBJ_OBJ (1 << 12) #define WINOUT_WINOBJ_CLR (1 << 13) #define WINOUT_WINOBJ_ALL (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR) #define WIN_RANGE(a, b) (((a) << 8) | (b)) #define WIN_RANGE2(a, b) ((b) | ((a) << 8)) // BLDCNT // Bits 0-5 select layers for the 1st target #define BLDCNT_TGT1_BG0 (1 << 0) #define BLDCNT_TGT1_BG1 (1 << 1) #define BLDCNT_TGT1_BG2 (1 << 2) #define BLDCNT_TGT1_BG3 (1 << 3) #define BLDCNT_TGT1_BG_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3) #define BLDCNT_TGT1_OBJ (1 << 4) #define BLDCNT_TGT1_BD (1 << 5) #define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG_ALL | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD) // Bits 6-7 select the special effect #define BLDCNT_EFFECT_NONE (0 << 6) // no special effect #define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) #define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY) #define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY) // Bits 8-13 select layers for the 2nd target #define BLDCNT_TGT2_BG0 (1 << 8) #define BLDCNT_TGT2_BG1 (1 << 9) #define BLDCNT_TGT2_BG2 (1 << 10) #define BLDCNT_TGT2_BG3 (1 << 11) #define BLDCNT_TGT2_BG_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3) #define BLDCNT_TGT2_OBJ (1 << 12) #define BLDCNT_TGT2_BD (1 << 13) #define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG_ALL | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) // BLDALPHA #define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1)) #define BLDALPHA_BLEND2(target1, target2) ((target1) | ((target2) << 8)) // SOUNDCNT_H #define SOUND_CGB_MIX_QUARTER 0x0000 #define SOUND_CGB_MIX_HALF 0x0001 #define SOUND_CGB_MIX_FULL 0x0002 #define SOUND_A_MIX_HALF 0x0000 #define SOUND_A_MIX_FULL 0x0004 #define SOUND_B_MIX_HALF 0x0000 #define SOUND_B_MIX_FULL 0x0008 #define SOUND_ALL_MIX_FULL 0x000E #define SOUND_A_RIGHT_OUTPUT 0x0100 #define SOUND_A_LEFT_OUTPUT 0x0200 #define SOUND_A_TIMER_0 0x0000 #define SOUND_A_TIMER_1 0x0400 #define SOUND_A_FIFO_RESET 0x0800 #define SOUND_B_RIGHT_OUTPUT 0x1000 #define SOUND_B_LEFT_OUTPUT 0x2000 #define SOUND_B_TIMER_0 0x0000 #define SOUND_B_TIMER_1 0x4000 #define SOUND_B_FIFO_RESET 0x8000 // SOUNDCNT_X #define SOUND_1_ON 0x0001 #define SOUND_2_ON 0x0002 #define SOUND_3_ON 0x0004 #define SOUND_4_ON 0x0008 #define SOUND_MASTER_ENABLE 0x0080 // DMA #define DMA_DEST_INC 0x0000 #define DMA_DEST_DEC 0x0020 #define DMA_DEST_FIXED 0x0040 #define DMA_DEST_RELOAD 0x0060 #define DMA_SRC_INC 0x0000 #define DMA_SRC_DEC 0x0080 #define DMA_SRC_FIXED 0x0100 #define DMA_REPEAT 0x0200 #define DMA_16BIT 0x0000 #define DMA_32BIT 0x0400 #define DMA_DREQ_ON 0x0800 #define DMA_START_NOW 0x0000 #define DMA_START_VBLANK 0x1000 #define DMA_START_HBLANK 0x2000 #define DMA_START_SPECIAL 0x3000 #define DMA_START_MASK 0x3000 #define DMA_INTR_ENABLE 0x4000 #define DMA_ENABLE 0x8000 // timer #define TIMER_1CLK 0x00 #define TIMER_64CLK 0x01 #define TIMER_256CLK 0x02 #define TIMER_1024CLK 0x03 #define TIMER_INTR_ENABLE 0x40 #define TIMER_ENABLE 0x80 // serial #define SIO_ID 0x0030 // Communication ID #define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode #define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode #define SIO_MULTI_MODE 0x2000 // Multi-player communication mode #define SIO_UART_MODE 0x3000 // UART communication mode #define SIO_9600_BPS 0x0000 // baud rate 9600 bps #define SIO_38400_BPS 0x0001 // 38400 bps #define SIO_57600_BPS 0x0002 // 57600 bps #define SIO_115200_BPS 0x0003 // 115200 bps #define SIO_MULTI_SI 0x0004 // Multi-player communication SI terminal #define SIO_MULTI_SD 0x0008 // SD terminal #define SIO_MULTI_BUSY 0x0080 #define SIO_ERROR 0x0040 // Detect error #define SIO_START 0x0080 // Start transfer #define SIO_ENABLE 0x0080 // Enable SIO #define SIO_INTR_ENABLE 0x4000 #define SIO_MULTI_SI_SHIFT 2 #define SIO_MULTI_SI_MASK 0x1 #define SIO_MULTI_DI_SHIFT 3 #define SIO_MULTI_DI_MASK 0x1 // keys #define A_BUTTON 0x0001 #define B_BUTTON 0x0002 #define SELECT_BUTTON 0x0004 #define START_BUTTON 0x0008 #define DPAD_RIGHT 0x0010 #define DPAD_LEFT 0x0020 #define DPAD_UP 0x0040 #define DPAD_DOWN 0x0080 #define R_BUTTON 0x0100 #define L_BUTTON 0x0200 #define KEYS_MASK 0x03FF #define KEY_INTR_ENABLE 0x4000 #define KEY_OR_INTR 0x0000 #define KEY_AND_INTR 0x8000 #define DPAD_ANY 0x00F0 #define JOY_EXCL_DPAD 0x030F // interrupt flags #define INTR_FLAG_VBLANK (1 << 0) #define INTR_FLAG_HBLANK (1 << 1) #define INTR_FLAG_VCOUNT (1 << 2) #define INTR_FLAG_TIMER0 (1 << 3) #define INTR_FLAG_TIMER1 (1 << 4) #define INTR_FLAG_TIMER2 (1 << 5) #define INTR_FLAG_TIMER3 (1 << 6) #define INTR_FLAG_SERIAL (1 << 7) #define INTR_FLAG_DMA0 (1 << 8) #define INTR_FLAG_DMA1 (1 << 9) #define INTR_FLAG_DMA2 (1 << 10) #define INTR_FLAG_DMA3 (1 << 11) #define INTR_FLAG_KEYPAD (1 << 12) #define INTR_FLAG_GAMEPAK (1 << 13) // WAITCNT #define WAITCNT_SRAM_4 (0 << 0) #define WAITCNT_SRAM_3 (1 << 0) #define WAITCNT_SRAM_2 (2 << 0) #define WAITCNT_SRAM_8 (3 << 0) #define WAITCNT_SRAM_MASK (3 << 0) #define WAITCNT_WS0_N_4 (0 << 2) #define WAITCNT_WS0_N_3 (1 << 2) #define WAITCNT_WS0_N_2 (2 << 2) #define WAITCNT_WS0_N_8 (3 << 2) #define WAITCNT_WS0_N_MASK (3 << 2) #define WAITCNT_WS0_S_2 (0 << 4) #define WAITCNT_WS0_S_1 (1 << 4) #define WAITCNT_WS1_N_4 (0 << 5) #define WAITCNT_WS1_N_3 (1 << 5) #define WAITCNT_WS1_N_2 (2 << 5) #define WAITCNT_WS1_N_8 (3 << 5) #define WAITCNT_WS1_N_MASK (3 << 5) #define WAITCNT_WS1_S_4 (0 << 7) #define WAITCNT_WS1_S_1 (1 << 7) #define WAITCNT_WS2_N_4 (0 << 8) #define WAITCNT_WS2_N_3 (1 << 8) #define WAITCNT_WS2_N_2 (2 << 8) #define WAITCNT_WS2_N_8 (3 << 8) #define WAITCNT_WS2_N_MASK (3 << 8) #define WAITCNT_WS2_S_8 (0 << 10) #define WAITCNT_WS2_S_1 (1 << 10) #define WAITCNT_PHI_OUT_NONE (0 << 11) #define WAITCNT_PHI_OUT_4MHZ (1 << 11) #define WAITCNT_PHI_OUT_8MHZ (2 << 11) #define WAITCNT_PHI_OUT_16MHZ (3 << 11) #define WAITCNT_PHI_OUT_MASK (3 << 11) #define WAITCNT_PREFETCH_ENABLE (1 << 14) #define WAITCNT_AGB (0 << 15) #define WAITCNT_CGB (1 << 15) #endif // GUARD_GBA_IO_REG_H ================================================ FILE: include/gba/isagbprint.h ================================================ #ifndef GUARD_GBA_ISAGBPRINT_H #define GUARD_GBA_ISAGBPRINT_H #include "gba/types.h" #define MGBA_LOG_FATAL (0) #define MGBA_LOG_ERROR (1) #define MGBA_LOG_WARN (2) #define MGBA_LOG_INFO (3) #define MGBA_LOG_DEBUG (4) #ifdef NDEBUG #define DebugPrintf(pBuf, ...) #define DebugPrintfLevel(level, pBuf, ...) #define MgbaOpen() #define MgbaClose() #define AGBPrintInit() #define DebugAssert(pFile, nLine, pExpression, nStopProgram) #else bool32 MgbaOpen(void); void MgbaClose(void); void MgbaPrintf(s32 level, const char *pBuf, ...); void MgbaAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram); void NoCashGBAPrintf(const char *pBuf, ...); void NoCashGBAAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram); void AGBPrintf(const char *pBuf, ...); void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram); void AGBPrintInit(void); #if (LOG_HANDLER == LOG_HANDLER_MGBA_PRINT) #define DebugPrintf(pBuf, ...) MgbaPrintf(MGBA_LOG_INFO, pBuf, ## __VA_ARGS__) #define DebugAssert(pFile, nLine, pExpression, nStopProgram) MgbaAssert(pFile, nLine, pExpression, nStopProgram) #define DebugPrintfLevel(level, pBuf, ...) MgbaPrintf(level, pBuf, ## __VA_ARGS__) #elif (LOG_HANDLER == LOG_HANDLER_NOCASH_PRINT) #define DebugPrintf(pBuf, ...) NoCashGBAPrintf(pBuf, ## __VA_ARGS__) #define DebugAssert(pFile, nLine, pExpression, nStopProgram) NoCashGBAAssert(pFile, nLine, pExpression, nStopProgram) #define DebugPrintfLevel(level, pBuf, ...) NoCashGBAPrintf(pBuf, ## __VA_ARGS__) #else // Default to AGBPrint #define DebugPrintf(pBuf, ...) AGBPrintf(pBuf, ## __VA_ARGS__) #define DebugAssert(pFile, nLine, pExpression, nStopProgram) AGBAssert(pFile, nLine, pExpression, nStopProgram) #define DebugPrintfLevel(level, pBuf, ...) AGBPrintf(pBuf, ## __VA_ARGS__) #endif #endif #ifdef NDEBUG #define AGB_ASSERT(exp) #define AGB_WARNING(exp) #define AGB_ASSERT_EX(exp, file, line) #define AGB_WARNING_EX(exp, file, line) #else #define AGB_ASSERT(exp) (exp) ? ((void*)0) : DebugAssert(__FILE__, __LINE__, #exp, TRUE) #define AGB_WARNING(exp) (exp) ? ((void*)0) : DebugAssert(__FILE__, __LINE__, #exp, FALSE) #define AGB_WARNING_EX(exp, file, line) (exp) ? ((void *)0) : DebugAssert(file, line, #exp, FALSE); #define AGB_ASSERT_EX(exp, file, line) (exp) ? ((void *)0) : DebugAssert(file, line, #exp, TRUE); #endif #endif // GUARD_GBA_ISAGBPRINT_H ================================================ FILE: include/gba/m4a_internal.h ================================================ #ifndef GUARD_GBA_M4A_INTERNAL_H #define GUARD_GBA_M4A_INTERNAL_H #include "gba/gba.h" // ASCII encoding of 'Smsh' in reverse // This is presumably short for SMASH, the developer of MKS4AGB. #define ID_NUMBER 0x68736D53 #define C_V 0x40 // center value for PAN, BEND, and TUNE #define SOUND_MODE_REVERB_VAL 0x0000007F #define SOUND_MODE_REVERB_SET 0x00000080 #define SOUND_MODE_MAXCHN 0x00000F00 #define SOUND_MODE_MAXCHN_SHIFT 8 #define SOUND_MODE_MASVOL 0x0000F000 #define SOUND_MODE_MASVOL_SHIFT 12 #define SOUND_MODE_FREQ_05734 0x00010000 #define SOUND_MODE_FREQ_07884 0x00020000 #define SOUND_MODE_FREQ_10512 0x00030000 #define SOUND_MODE_FREQ_13379 0x00040000 #define SOUND_MODE_FREQ_15768 0x00050000 #define SOUND_MODE_FREQ_18157 0x00060000 #define SOUND_MODE_FREQ_21024 0x00070000 #define SOUND_MODE_FREQ_26758 0x00080000 #define SOUND_MODE_FREQ_31536 0x00090000 #define SOUND_MODE_FREQ_36314 0x000A0000 #define SOUND_MODE_FREQ_40137 0x000B0000 #define SOUND_MODE_FREQ_42048 0x000C0000 #define SOUND_MODE_FREQ 0x000F0000 #define SOUND_MODE_FREQ_SHIFT 16 #define SOUND_MODE_DA_BIT_9 0x00800000 #define SOUND_MODE_DA_BIT_8 0x00900000 #define SOUND_MODE_DA_BIT_7 0x00A00000 #define SOUND_MODE_DA_BIT_6 0x00B00000 #define SOUND_MODE_DA_BIT 0x00B00000 #define SOUND_MODE_DA_BIT_SHIFT 20 struct WaveData { u16 type; u16 status; u32 freq; u32 loopStart; u32 size; // number of samples s8 data[1]; // samples }; #define TONEDATA_TYPE_CGB 0x07 #define TONEDATA_TYPE_FIX 0x08 #define TONEDATA_TYPE_SPL 0x40 // key split #define TONEDATA_TYPE_RHY 0x80 // rhythm #define TONEDATA_P_S_PAN 0xc0 #define TONEDATA_P_S_PAM TONEDATA_P_S_PAN struct ToneData { u8 type; u8 key; u8 length; // sound length (compatible sound) u8 pan_sweep; // pan or sweep (compatible sound ch. 1) struct WaveData *wav; u8 attack; u8 decay; u8 sustain; u8 release; }; #define SOUND_CHANNEL_SF_START 0x80 #define SOUND_CHANNEL_SF_STOP 0x40 #define SOUND_CHANNEL_SF_LOOP 0x10 #define SOUND_CHANNEL_SF_IEC 0x04 #define SOUND_CHANNEL_SF_ENV 0x03 #define SOUND_CHANNEL_SF_ENV_ATTACK 0x03 #define SOUND_CHANNEL_SF_ENV_DECAY 0x02 #define SOUND_CHANNEL_SF_ENV_SUSTAIN 0x01 #define SOUND_CHANNEL_SF_ENV_RELEASE 0x00 #define SOUND_CHANNEL_SF_ON (SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_STOP | SOUND_CHANNEL_SF_IEC | SOUND_CHANNEL_SF_ENV) #define CGB_CHANNEL_MO_PIT 0x02 #define CGB_CHANNEL_MO_VOL 0x01 #define CGB_NRx2_ENV_DIR_DEC 0x00 #define CGB_NRx2_ENV_DIR_INC 0x08 struct CgbChannel { u8 statusFlags; u8 type; u8 rightVolume; u8 leftVolume; u8 attack; u8 decay; u8 sustain; u8 release; u8 key; u8 envelopeVolume; u8 envelopeGoal; u8 envelopeCounter; u8 pseudoEchoVolume; u8 pseudoEchoLength; u8 dummy1; u8 dummy2; u8 gateTime; u8 midiKey; u8 velocity; u8 priority; u8 rhythmPan; u8 dummy3[3]; u8 dummy5; u8 sustainGoal; u8 n4; // NR[1-4]4 register (initial, length bit) u8 pan; u8 panMask; u8 modify; u8 length; u8 sweep; u32 frequency; u32 *wavePointer; // instructs CgbMain to load targeted wave u32 *currentPointer; // stores the currently loaded wave struct MusicPlayerTrack *track; void *prevChannelPointer; void *nextChannelPointer; u8 dummy4[8]; }; struct MusicPlayerTrack; struct SoundChannel { u8 statusFlags; u8 type; u8 rightVolume; u8 leftVolume; u8 attack; u8 decay; u8 sustain; u8 release; u8 key; // midi key as it was translated into final pitch u8 envelopeVolume; u8 envelopeVolumeRight; u8 envelopeVolumeLeft; u8 pseudoEchoVolume; u8 pseudoEchoLength; u8 dummy1; u8 dummy2; u8 gateTime; u8 midiKey; // midi key as it was used in the track data u8 velocity; u8 priority; u8 rhythmPan; u8 dummy3[3]; u32 count; u32 fw; u32 frequency; struct WaveData *wav; s8 *currentPointer; struct MusicPlayerTrack *track; void *prevChannelPointer; void *nextChannelPointer; u32 dummy4; u16 xpi; u16 xpc; }; #define MAX_DIRECTSOUND_CHANNELS 12 #define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer struct MusicPlayerInfo; typedef void (*MPlayFunc)(); typedef void (*PlyNoteFunc)(u32, struct MusicPlayerInfo *, struct MusicPlayerTrack *); typedef void (*CgbSoundFunc)(void); typedef void (*CgbOscOffFunc)(u8); typedef u32 (*MidiKeyToCgbFreqFunc)(u8, u8, u8); typedef void (*ExtVolPitFunc)(void); typedef void (*MPlayMainFunc)(struct MusicPlayerInfo *); struct SoundInfo { // This field is normally equal to ID_NUMBER but it is set to other // values during sensitive operations for locking purposes. // This field should be volatile but isn't. This could potentially cause // race conditions. u32 ident; vu8 pcmDmaCounter; // Direct Sound u8 reverb; u8 maxChans; u8 masterVolume; u8 freq; u8 mode; u8 c15; // periodically counts from 14 down to 0 (15 states) u8 pcmDmaPeriod; // number of V-blanks per PCM DMA u8 maxLines; u8 gap[3]; s32 pcmSamplesPerVBlank; s32 pcmFreq; s32 divFreq; struct CgbChannel *cgbChans; MPlayMainFunc MPlayMainHead; struct MusicPlayerInfo *musicPlayerHead; CgbSoundFunc CgbSound; CgbOscOffFunc CgbOscOff; MidiKeyToCgbFreqFunc MidiKeyToCgbFreq; MPlayFunc *MPlayJumpTable; PlyNoteFunc plynote; ExtVolPitFunc ExtVolPit; u8 gap2[16]; struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; }; struct SongHeader { u8 trackCount; u8 blockCount; u8 priority; u8 reverb; struct ToneData *tone; u8 *part[1]; }; struct PokemonCrySong { u8 trackCount; u8 blockCount; u8 priority; u8 reverb; struct ToneData *tone; u8 *part[2]; u8 gap; u8 part0; // 0x11 u8 tuneValue; // 0x12 u8 gotoCmd; // 0x13 u32 gotoTarget; // 0x14 u8 part1; // 0x18 u8 tuneValue2; // 0x19 u8 cont[2]; // 0x1A u8 volCmd; // 0x1C u8 volumeValue; // 0x1D u8 unkCmd0D[2]; // 0x1E u32 unkCmd0DParam; // 0x20 u8 xreleCmd[2]; // 0x24 u8 releaseValue; // 0x26 u8 panCmd; u8 panValue; // 0x28 u8 tieCmd; // 0x29 u8 tieKeyValue; // 0x2A u8 tieVelocityValue; // 0x2B u8 unkCmd0C[2]; // 0x2C u16 unkCmd0CParam; // 0x2E u8 end[2]; // 0x30 }; #define MPT_FLG_VOLSET 0x01 #define MPT_FLG_VOLCHG 0x03 #define MPT_FLG_PITSET 0x04 #define MPT_FLG_PITCHG 0x0C #define MPT_FLG_START 0x40 #define MPT_FLG_EXIST 0x80 struct MusicPlayerTrack { u8 flags; u8 wait; u8 patternLevel; u8 repN; u8 gateTime; u8 key; u8 velocity; u8 runningStatus; u8 keyM; u8 pitM; s8 keyShift; s8 keyShiftX; s8 tune; u8 pitX; s8 bend; u8 bendRange; u8 volMR; u8 volML; u8 vol; u8 volX; s8 pan; s8 panX; s8 modM; u8 mod; u8 modT; u8 lfoSpeed; u8 lfoSpeedC; u8 lfoDelay; u8 lfoDelayC; u8 priority; u8 pseudoEchoVolume; u8 pseudoEchoLength; struct SoundChannel *chan; struct ToneData tone; u8 gap[10]; u16 unk_3A; u32 unk_3C; u8 *cmdPtr; u8 *patternStack[3]; }; #define MUSICPLAYER_STATUS_TRACK 0x0000ffff #define MUSICPLAYER_STATUS_PAUSE 0x80000000 #define MAX_MUSICPLAYER_TRACKS 16 #define TRACKS_ALL 0xFFFF #define TEMPORARY_FADE 0x0001 #define FADE_IN 0x0002 #define FADE_VOL_MAX 64 #define FADE_VOL_SHIFT 2 struct MusicPlayerInfo { struct SongHeader *songHeader; u32 status; u8 trackCount; u8 priority; u8 cmd; u8 unk_B; u32 clock; u8 gap[8]; u8 *memAccArea; u16 tempoD; u16 tempoU; u16 tempoI; u16 tempoC; u16 fadeOI; u16 fadeOC; u16 fadeOV; struct MusicPlayerTrack *tracks; struct ToneData *tone; u32 ident; MPlayMainFunc MPlayMainNext; struct MusicPlayerInfo *musicPlayerNext; }; struct MusicPlayer { struct MusicPlayerInfo *info; struct MusicPlayerTrack *track; u8 unk_8; u16 unk_A; }; struct Song { struct SongHeader *header; u16 ms; u16 me; }; extern const struct MusicPlayer gMPlayTable[]; extern const struct Song gSongTable[]; extern u8 gMPlayMemAccArea[]; //u8 gPokemonCrySong[52]; //u8 gPokemonCrySongs[52 * MAX_POKEMON_CRIES]; #define MAX_POKEMON_CRIES 2 extern struct PokemonCrySong gPokemonCrySong; extern struct PokemonCrySong gPokemonCrySongs[]; extern struct MusicPlayerInfo gPokemonCryMusicPlayers[]; extern struct MusicPlayerTrack gPokemonCryTracks[]; extern char SoundMainRAM[]; extern MPlayFunc gMPlayJumpTable[]; typedef void (*XcmdFunc)(struct MusicPlayerInfo *, struct MusicPlayerTrack *); extern const XcmdFunc gXcmdTable[]; extern struct CgbChannel gCgbChans[]; extern const u8 gScaleTable[]; extern const u32 gFreqTable[]; extern const u16 gPcmSamplesPerVBlankTable[]; extern const u8 gCgbScaleTable[]; extern const s16 gCgbFreqTable[]; extern const u8 gNoiseTable[]; extern const struct PokemonCrySong gPokemonCrySongTemplate; extern const struct ToneData voicegroup000; extern char gNumMusicPlayers[]; extern char gMaxLines[]; #define NUM_MUSIC_PLAYERS ((u16)gNumMusicPlayers) #define MAX_LINES ((u32)gMaxLines) u32 umul3232H32(u32 multiplier, u32 multiplicand); void SoundMain(void); void SoundMainBTM(void); void TrackStop(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track); void MPlayMain(struct MusicPlayerInfo *); void RealClearChain(void *x); void MPlayContinue(struct MusicPlayerInfo *mplayInfo); void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader); void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); void FadeOutBody(struct MusicPlayerInfo *mplayInfo); void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track); void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed); void ClearChain(void *x); void Clear64byte(void *addr); void SoundInit(struct SoundInfo *soundInfo); void MPlayExtender(struct CgbChannel *cgbChans); void m4aSoundMode(u32 mode); void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track, u8 a3); void CgbSound(void); void CgbOscOff(u8); void CgbModVol(struct CgbChannel *chan); u32 MidiKeyToCgbFreq(u8, u8, u8); void DummyFunc(void); void MPlayJumpTableCopy(MPlayFunc *mplayJumpTable); void SampleFreqSet(u32 freq); void m4aSoundVSyncOn(void); void m4aSoundVSyncOff(void); void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo); void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume); void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch); void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan); void ClearModM(struct MusicPlayerTrack *track); void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth); void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed); struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone); void SetPokemonCryVolume(u8 val); void SetPokemonCryPanpot(s8 val); void SetPokemonCryPitch(s16 val); void SetPokemonCryLength(u16 val); void SetPokemonCryRelease(u8 val); void SetPokemonCryProgress(u32 val); bool32 IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo); void SetPokemonCryChorus(s8 val); void SetPokemonCryStereo(u32 val); void SetPokemonCryPriority(u8 val); // sound command handler functions void ply_fine(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_goto(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_patt(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_pend(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_rept(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_memacc(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_prio(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_tempo(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_keysh(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_voice(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_vol(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_pan(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_bend(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_bendr(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_lfos(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_lfodl(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_mod(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_modt(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_note(u32 note_cmd, struct MusicPlayerInfo *, struct MusicPlayerTrack *); // extended sound command handler functions void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xwave(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xtype(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xatta(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xdeca(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xsust(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xrele(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xiecv(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xiecl(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xleng(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xswee(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xcmd_0C(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xcmd_0D(struct MusicPlayerInfo *, struct MusicPlayerTrack *); #endif // GUARD_GBA_M4A_INTERNAL_H ================================================ FILE: include/gba/macro.h ================================================ #ifndef GUARD_GBA_MACRO_H #define GUARD_GBA_MACRO_H #define CPU_FILL(value, dest, size, bit) \ { \ vu##bit tmp = (vu##bit)(value); \ CpuSet((void *)&tmp, \ dest, \ CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size)/(bit/8) & 0x1FFFFF)); \ } #define CpuFill16(value, dest, size) CPU_FILL(value, dest, size, 16) #define CpuFill32(value, dest, size) CPU_FILL(value, dest, size, 32) #define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF)) #define CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16) #define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32) #define CpuFastFill(value, dest, size) \ { \ vu32 tmp = (vu32)(value); \ CpuFastSet((void *)&tmp, \ dest, \ CPU_FAST_SET_SRC_FIXED | ((size)/(32/8) & 0x1FFFFF)); \ } #define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size)) #define CpuFastFill8(value, dest, size) CpuFastFill(((value) << 24) | ((value) << 16) | ((value) << 8) | (value), (dest), (size)) #define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF)) #define DmaSet(dmaNum, src, dest, control) \ { \ vu32 *dmaRegs = (vu32 *)REG_ADDR_DMA##dmaNum; \ dmaRegs[0] = (vu32)(src); \ dmaRegs[1] = (vu32)(dest); \ dmaRegs[2] = (vu32)(control); \ dmaRegs[2]; \ } #define DMA_FILL(dmaNum, value, dest, size, bit) \ { \ vu##bit tmp = (vu##bit)(value); \ DmaSet(dmaNum, \ &tmp, \ dest, \ (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_FIXED | DMA_DEST_INC) << 16 \ | ((size)/(bit/8))); \ } #define DmaFill16(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 16) #define DmaFill32(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 32) // Note that the DMA clear macros cause the DMA control value to be calculated // at runtime rather than compile time. The size is divided by the DMA transfer // unit size (2 or 4 bytes) and then combined with the DMA control flags using a // bitwise OR operation. #define DMA_CLEAR(dmaNum, dest, size, bit) \ { \ vu##bit *_dest = (vu##bit *)(dest); \ u32 _size = size; \ DmaFill##bit(dmaNum, 0, _dest, _size); \ } #define DmaClear16(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 16) #define DmaClear32(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 32) #define DMA_COPY(dmaNum, src, dest, size, bit) \ DmaSet(dmaNum, \ src, \ dest, \ (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 \ | ((size)/(bit/8))) #define DmaCopy16(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 16) #define DmaCopy32(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 32) #define DmaStop(dmaNum) \ { \ vu16 *dmaRegs = (vu16 *)REG_ADDR_DMA##dmaNum; \ dmaRegs[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); \ dmaRegs[5] &= ~DMA_ENABLE; \ dmaRegs[5]; \ } #define DmaCopyLarge(dmaNum, src, dest, size, block, bit) \ { \ const void *_src = src; \ void *_dest = dest; \ u32 _size = size; \ while (1) \ { \ DmaCopy##bit(dmaNum, _src, _dest, (block)); \ _src += (block); \ _dest += (block); \ _size -= (block); \ if (_size <= (block)) \ { \ DmaCopy##bit(dmaNum, _src, _dest, _size); \ break; \ } \ } \ } #define DmaClearLarge(dmaNum, dest, size, block, bit) \ { \ void *_dest = dest; \ u32 _size = size; \ while (1) \ { \ DmaFill##bit(dmaNum, 0, _dest, (block)); \ _dest += (block); \ _size -= (block); \ if (_size <= (block)) \ { \ DmaFill##bit(dmaNum, 0, _dest, _size); \ break; \ } \ } \ } #define DmaFillLarge(dmaNum, value, dest, size, block, bit) \ { \ void *_dest = (void *)dest; \ u32 _size = size; \ while (1) \ { \ DmaFill##bit(dmaNum, value, _dest, (block)); \ _dest += (block); \ _size -= (block); \ if (_size <= (block)) \ { \ DmaFill##bit(dmaNum, value, _dest, _size); \ break; \ } \ } \ } #define DmaCopyLarge16(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 16) #define DmaCopyLarge32(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 32) #define DmaFillLarge16(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 16) #define DmaFillLarge32(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 32) #define DmaClearLarge16(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 16) #define DmaClearLarge32(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 32) #define DmaCopyDefvars(dmaNum, src, dest, size, bit) \ { \ const void *_src = src; \ void *_dest = dest; \ u32 _size = size; \ DmaCopy##bit(dmaNum, _src, _dest, _size); \ } #define DmaCopy16Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 16) #define DmaCopy32Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 32) #define DmaFillDefvars(dmaNum, value, dest, size, bit) \ { \ void *_dest = (void *)dest; \ u32 _size = size; \ DmaFill##bit(dmaNum, value, _dest, _size); \ } #define DmaFill16Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 16) #define DmaFill32Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 32) #define DmaClearDefvars(dmaNum, dest, size, bit) \ { \ void *_dest = dest; \ u32 _size = size; \ DmaClear##bit(dmaNum, _dest, _size); \ } #define DmaClear16Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 16) #define DmaClear32Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 32) #define IntrEnable(flags) \ { \ u16 imeTemp; \ \ imeTemp = REG_IME; \ REG_IME = 0; \ REG_IE |= flags; \ REG_IME = imeTemp; \ } #endif // GUARD_GBA_MACRO_H ================================================ FILE: include/gba/multiboot.h ================================================ #ifndef GUARD_GBA_MULTIBOOT_H #define GUARD_GBA_MULTIBOOT_H #define MULTIBOOT_NCHILD 3 // Maximum number of slaves #define MULTIBOOT_HEADER_SIZE 0xc0 // Header size #define MULTIBOOT_SEND_SIZE_MIN 0x100 // Minimum transmission size #define MULTIBOOT_SEND_SIZE_MAX 0x40000 // Maximum transmission size struct MultiBootParam { u32 system_work[5]; u8 handshake_data; u8 padding; u16 handshake_timeout; u8 probe_count; u8 client_data[MULTIBOOT_NCHILD]; u8 palette_data; u8 response_bit; u8 client_bit; u8 reserved1; const u8 *boot_srcp; const u8 *boot_endp; const u8 *masterp; u8 *reserved2[MULTIBOOT_NCHILD]; u32 system_work2[4]; u8 sendflag; u8 probe_target_bit; u8 check_wait; u8 server_type; }; #define MULTIBOOT_ERROR_04 0x04 #define MULTIBOOT_ERROR_08 0x08 #define MULTIBOOT_ERROR_0c 0x0c #define MULTIBOOT_ERROR_40 0x40 #define MULTIBOOT_ERROR_44 0x44 #define MULTIBOOT_ERROR_48 0x48 #define MULTIBOOT_ERROR_4c 0x4c #define MULTIBOOT_ERROR_80 0x80 #define MULTIBOOT_ERROR_84 0x84 #define MULTIBOOT_ERROR_88 0x88 #define MULTIBOOT_ERROR_8c 0x8c #define MULTIBOOT_ERROR_NO_PROBE_TARGET 0x50 #define MULTIBOOT_ERROR_NO_DLREADY 0x60 #define MULTIBOOT_ERROR_BOOT_FAILURE 0x70 #define MULTIBOOT_ERROR_HANDSHAKE_FAILURE 0x71 #define MULTIBOOT_CONNECTION_CHECK_WAIT 15 #define MULTIBOOT_SERVER_TYPE_NORMAL 0 #define MULTIBOOT_SERVER_TYPE_QUICK 1 #define MULTIBOOT_HANDSHAKE_TIMEOUT 400 #endif // GUARD_GBA_MULTIBOOT_H ================================================ FILE: include/gba/syscall.h ================================================ #ifndef GUARD_GBA_SYSCALL_H #define GUARD_GBA_SYSCALL_H #define RESET_EWRAM 0x01 #define RESET_IWRAM 0x02 #define RESET_PALETTE 0x04 #define RESET_VRAM 0x08 #define RESET_OAM 0x10 #define RESET_SIO_REGS 0x20 #define RESET_SOUND_REGS 0x40 #define RESET_REGS 0x80 #define RESET_ALL 0xFF void SoftReset(u32 resetFlags); void RegisterRamReset(u32 resetFlags); void VBlankIntrWait(void); u16 Sqrt(u32 num); u16 ArcTan2(s16 x, s16 y); #define CPU_SET_SRC_FIXED 0x01000000 #define CPU_SET_16BIT 0x00000000 #define CPU_SET_32BIT 0x04000000 void CpuSet(const void *src, void *dest, u32 control); #define CPU_FAST_SET_SRC_FIXED 0x01000000 void CpuFastSet(const void *src, void *dest, u32 control); void BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count); void ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset); void LZ77UnCompWram(const void *src, void *dest); void LZ77UnCompVram(const void *src, void *dest); void RLUnCompWram(const void *src, void *dest); void RLUnCompVram(const void *src, void *dest); int MultiBoot(struct MultiBootParam *mp); s32 Div(s32 num, s32 denom); #endif // GUARD_GBA_SYSCALL_H ================================================ FILE: include/gba/types.h ================================================ #ifndef GUARD_GBA_TYPES_H #define GUARD_GBA_TYPES_H #include typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef uint64_t u64; typedef int8_t s8; typedef int16_t s16; typedef int32_t s32; typedef int64_t s64; typedef volatile u8 vu8; typedef volatile u16 vu16; typedef volatile u32 vu32; typedef volatile u64 vu64; typedef volatile s8 vs8; typedef volatile s16 vs16; typedef volatile s32 vs32; typedef volatile s64 vs64; typedef float f32; typedef double f64; typedef u8 bool8; typedef u16 bool16; typedef u32 bool32; typedef vu8 vbool8; typedef vu16 vbool16; typedef vu32 vbool32; struct BgCnt { u16 priority:2; u16 charBaseBlock:2; u16 dummy:2; u16 mosaic:1; u16 palettes:1; u16 screenBaseBlock:5; u16 areaOverflowMode:1; u16 screenSize:2; }; typedef volatile struct BgCnt vBgCnt; struct PlttData { u16 r:5; // red u16 g:5; // green u16 b:5; // blue u16 unused_15:1; }; struct OamData { /*0x00*/ u32 y:8; /*0x01*/ u32 affineMode:2; // 0x1, 0x2 -> 0x4 u32 objMode:2; // 0x4, 0x8 -> 0xC u32 mosaic:1; // 0x10 u32 bpp:1; // 0x20 u32 shape:2; // 0x40, 0x80 -> 0xC0 /*0x02*/ u32 x:9; u32 matrixNum:5; // bits 3/4 are h-flip/v-flip if not in affine mode u32 size:2; // 0x4000, 0x8000 -> 0xC000 /*0x04*/ u16 tileNum:10; // 0x3FF u16 priority:2; // 0x400, 0x800 -> 0xC00 u16 paletteNum:4; /*0x06*/ u16 affineParam; }; #define ST_OAM_HFLIP 0x08 #define ST_OAM_VFLIP 0x10 #define ST_OAM_MNUM_FLIP_MASK 0x18 #define ST_OAM_OBJ_NORMAL 0 #define ST_OAM_OBJ_BLEND 1 #define ST_OAM_OBJ_WINDOW 2 #define ST_OAM_AFFINE_OFF 0 #define ST_OAM_AFFINE_NORMAL 1 #define ST_OAM_AFFINE_ERASE 2 #define ST_OAM_AFFINE_DOUBLE 3 #define ST_OAM_AFFINE_ON_MASK 1 #define ST_OAM_AFFINE_DOUBLE_MASK 2 #define ST_OAM_4BPP 0 #define ST_OAM_8BPP 1 #define ST_OAM_SQUARE 0 #define ST_OAM_H_RECTANGLE 1 #define ST_OAM_V_RECTANGLE 2 #define ST_OAM_SIZE_0 0 #define ST_OAM_SIZE_1 1 #define ST_OAM_SIZE_2 2 #define ST_OAM_SIZE_3 3 #define SPRITE_SIZE_8x8 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_SQUARE)) #define SPRITE_SIZE_16x16 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_SQUARE)) #define SPRITE_SIZE_32x32 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_SQUARE)) #define SPRITE_SIZE_64x64 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_SQUARE)) #define SPRITE_SIZE_16x8 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_H_RECTANGLE)) #define SPRITE_SIZE_32x8 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_H_RECTANGLE)) #define SPRITE_SIZE_32x16 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_H_RECTANGLE)) #define SPRITE_SIZE_64x32 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_H_RECTANGLE)) #define SPRITE_SIZE_8x16 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_V_RECTANGLE)) #define SPRITE_SIZE_8x32 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_V_RECTANGLE)) #define SPRITE_SIZE_16x32 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_V_RECTANGLE)) #define SPRITE_SIZE_32x64 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_V_RECTANGLE)) #define SPRITE_SIZE(dim) ((SPRITE_SIZE_##dim >> 2) & 0x03) #define SPRITE_SHAPE(dim) (SPRITE_SIZE_##dim & 0x03) struct BgAffineSrcData { s32 texX; s32 texY; s16 scrX; s16 scrY; s16 sx; s16 sy; u16 alpha; }; struct BgAffineDstData { s16 pa; s16 pb; s16 pc; s16 pd; s32 dx; s32 dy; }; struct ObjAffineSrcData { s16 xScale; s16 yScale; u16 rotation; }; // Multi-player SIO Control Structure struct SioMultiCnt { u16 baudRate:2; // baud rate u16 si:1; // SI terminal u16 sd:1; // SD terminal u16 id:2; // ID u16 error:1; // error flag u16 enable:1; // SIO enable u16 unused_11_8:4; u16 mode:2; // communication mode (should equal 2) u16 intrEnable:1; // IRQ enable u16 unused_15:1; u16 data; // data }; #define ST_SIO_MULTI_MODE 2 // Multi-player communication mode // baud rate #define ST_SIO_9600_BPS 0 // 9600 bps #define ST_SIO_38400_BPS 1 // 38400 bps #define ST_SIO_57600_BPS 2 // 57600 bps #define ST_SIO_115200_BPS 3 // 115200 bps #endif // GUARD_GBA_TYPES_H ================================================ FILE: include/gflib.h ================================================ #ifndef GUARD_GFLIB_H #define GUARD_GFLIB_H #include "global.h" #include "bg.h" #include "palette.h" #include "gpu_regs.h" #include "dma3.h" #include "malloc.h" #include "sound.h" #include "text.h" #include "sprite.h" #include "window.h" #include "blit.h" #include "string_util.h" #endif //GUARD_GFLIB_H ================================================ FILE: include/global.berry.h ================================================ #ifndef GUARD_GLOBAL_BERRY_H #define GUARD_GLOBAL_BERRY_H #define BERRY_NAME_LENGTH 6 #define BERRY_NAME_COUNT 7 #define BERRY_ITEM_EFFECT_COUNT 18 struct Berry { const u8 name[BERRY_NAME_COUNT]; u8 firmness; u16 size; u8 maxYield; u8 minYield; const u8 *description1; const u8 *description2; u8 stageDuration; u8 spicy; u8 dry; u8 sweet; u8 bitter; u8 sour; u8 smoothness; }; // with no const fields struct Berry2 { u8 name[BERRY_NAME_COUNT]; u8 firmness; u16 size; u8 maxYield; u8 minYield; u8 *description1; u8 *description2; u8 stageDuration; u8 spicy; u8 dry; u8 sweet; u8 bitter; u8 sour; u8 smoothness; }; struct EnigmaBerry { struct Berry2 berry; u8 itemEffect[BERRY_ITEM_EFFECT_COUNT]; u8 holdEffect; u8 holdEffectParam; u32 checksum; }; struct BattleEnigmaBerry { /*0x00*/ u8 name[BERRY_NAME_COUNT]; /*0x07*/ u8 holdEffect; /*0x08*/ u8 itemEffect[BERRY_ITEM_EFFECT_COUNT]; /*0x1A*/ u8 holdEffectParam; }; struct BerryTree { u8 berry; u8 stage:7; u8 growthSparkle:1; u16 minutesUntilNextStage; u8 berryYield; u8 regrowthCount:4; u8 watered1:1; u8 watered2:1; u8 watered3:1; u8 watered4:1; }; #endif // GUARD_GLOBAL_BERRY_H ================================================ FILE: include/global.fieldmap.h ================================================ #ifndef GUARD_GLOBAL_FIELDMAP_H #define GUARD_GLOBAL_FIELDMAP_H // Masks/shifts for blocks in the map grid // Map grid blocks consist of a 10 bit metatile id, a 2 bit collision value, and a 4 bit elevation value // This is the data stored in each data/layouts/*/map.bin file #define MAPGRID_METATILE_ID_MASK 0x03FF // Bits 0-9 #define MAPGRID_COLLISION_MASK 0x0C00 // Bits 10-11 #define MAPGRID_ELEVATION_MASK 0xF000 // Bits 12-15 #define MAPGRID_COLLISION_SHIFT 10 #define MAPGRID_ELEVATION_SHIFT 12 // An undefined map grid block has all metatile id bits set and nothing else #define MAPGRID_UNDEFINED MAPGRID_METATILE_ID_MASK enum { METATILE_LAYER_TYPE_NORMAL, // Metatile uses middle and top bg layers METATILE_LAYER_TYPE_COVERED, // Metatile uses bottom and middle bg layers METATILE_LAYER_TYPE_SPLIT, // Metatile uses bottom and top bg layers }; #define METATILE_ID(tileset, name) (METATILE_##tileset##_##name) enum { METATILE_ATTRIBUTE_BEHAVIOR, METATILE_ATTRIBUTE_TERRAIN, METATILE_ATTRIBUTE_2, METATILE_ATTRIBUTE_3, METATILE_ATTRIBUTE_ENCOUNTER_TYPE, METATILE_ATTRIBUTE_5, METATILE_ATTRIBUTE_LAYER_TYPE, METATILE_ATTRIBUTE_7, METATILE_ATTRIBUTE_COUNT, METATILE_ATTRIBUTES_ALL = 255 // Special id to get the full attributes value }; enum { TILE_ENCOUNTER_NONE, TILE_ENCOUNTER_LAND, TILE_ENCOUNTER_WATER, }; enum { TILE_TERRAIN_NORMAL, TILE_TERRAIN_GRASS, TILE_TERRAIN_WATER, TILE_TERRAIN_WATERFALL, }; // Identifiers for the hidden item data stored in BgEvent's u32 hiddenItem enum { HIDDEN_ITEM_ITEM, HIDDEN_ITEM_FLAG, HIDDEN_ITEM_QUANTITY, HIDDEN_ITEM_UNDERFOOT }; // Masks/shifts to read the data above from the u32 hiddenItem, calculated from size. #define HIDDEN_ITEM_ITEM_BITS 16 #define HIDDEN_ITEM_FLAG_BITS 8 #define HIDDEN_ITEM_QUANTITY_BITS 7 #define HIDDEN_ITEM_UNDERFOOT_BITS 1 #define HIDDEN_ITEM_ITEM_SHIFT 0 #define HIDDEN_ITEM_FLAG_SHIFT (HIDDEN_ITEM_ITEM_SHIFT + HIDDEN_ITEM_ITEM_BITS) #define HIDDEN_ITEM_QUANTITY_SHIFT (HIDDEN_ITEM_FLAG_SHIFT + HIDDEN_ITEM_FLAG_BITS) #define HIDDEN_ITEM_UNDERFOOT_SHIFT (HIDDEN_ITEM_QUANTITY_SHIFT + HIDDEN_ITEM_QUANTITY_BITS) #define GET_HIDDEN_ITEM_ITEM(raw) (((raw) >> HIDDEN_ITEM_ITEM_SHIFT) & ((1 << HIDDEN_ITEM_ITEM_BITS) - 1)) #define GET_HIDDEN_ITEM_FLAG(raw) (((raw) >> HIDDEN_ITEM_FLAG_SHIFT) & ((1 << HIDDEN_ITEM_FLAG_BITS) - 1)) #define GET_HIDDEN_ITEM_QUANTITY(raw) (((raw) >> HIDDEN_ITEM_QUANTITY_SHIFT) & ((1 << HIDDEN_ITEM_QUANTITY_BITS) - 1)) #define GET_HIDDEN_ITEM_UNDERFOOT(raw)(((raw) >> HIDDEN_ITEM_UNDERFOOT_SHIFT) & ((1 << HIDDEN_ITEM_UNDERFOOT_BITS) - 1)) typedef void (*TilesetCB)(void); struct Tileset { /*0x00*/ bool8 isCompressed; /*0x01*/ bool8 isSecondary; /*0x04*/ const u32 *tiles; /*0x08*/ const u16 (*palettes)[16]; /*0x0c*/ const u16 *metatiles; /*0x10*/ TilesetCB callback; /*0x14*/ const u32 *metatileAttributes; }; struct MapLayout { /*0x00*/ s32 width; /*0x04*/ s32 height; /*0x08*/ const u16 *border; /*0x0c*/ const u16 *map; /*0x10*/ const struct Tileset *primaryTileset; /*0x14*/ const struct Tileset *secondaryTileset; /*0x18*/ u8 borderWidth; /*0x19*/ u8 borderHeight; }; struct BackupMapLayout { s32 Xsize; s32 Ysize; u16 *map; }; struct ObjectEventTemplate { u8 localId; u8 graphicsId; u8 kind; // The "kind" field determines how to access objUnion union below. s16 x, y; union { struct { u8 elevation; u8 movementType; u16 movementRangeX:4; u16 movementRangeY:4; u16 trainerType; u16 trainerRange_berryTreeId; } normal; struct { u8 targetLocalId; u8 padding[3]; u16 targetMapNum; u16 targetMapGroup; } clone; } objUnion; const u8 *script; u16 flagId; }; /*size = 0x18*/ struct WarpEvent { s16 x, y; u8 elevation; u8 warpId; u8 mapNum; u8 mapGroup; }; struct CoordEvent { u16 x, y; u8 elevation; u16 trigger; u16 index; const u8 *script; }; struct BgEvent { u16 x, y; u8 elevation; u8 kind; // The "kind" field determines how to access bgUnion union below. union { const u8 *script; u32 hiddenItem; // Contains all the hidden item data. See GET_HIDDEN_ITEM_* defines further up } bgUnion; }; struct MapEvents { u8 objectEventCount; u8 warpCount; u8 coordEventCount; u8 bgEventCount; const struct ObjectEventTemplate *objectEvents; const struct WarpEvent *warps; const struct CoordEvent *coordEvents; const struct BgEvent *bgEvents; }; struct MapConnection { /*0x00*/ u8 direction; /*0x04*/ u32 offset; /*0x08*/ u8 mapGroup; /*0x09*/ u8 mapNum; }; struct MapConnections { s32 count; const struct MapConnection *connections; }; struct MapHeader { /* 0x00 */ const struct MapLayout *mapLayout; /* 0x04 */ const struct MapEvents *events; /* 0x08 */ const u8 *mapScripts; /* 0x0C */ const struct MapConnections *connections; /* 0x10 */ u16 music; /* 0x12 */ u16 mapLayoutId; /* 0x14 */ u8 regionMapSectionId; /* 0x15 */ u8 cave; /* 0x16 */ u8 weather; /* 0x17 */ u8 mapType; // fields correspond to the arguments in the map_header_flags macro /* 0x18 */ bool8 bikingAllowed; /* 0x19 */ bool8 allowEscaping:1; // Escape Rope and Dig bool8 allowRunning:1; bool8 showMapName:6; // the last 5 bits are unused /* 0x1A */ s8 floorNum; /* 0x1B */ u8 battleType; /* 0x1C */ u8 levelScaling; }; struct ObjectEvent { /*0x00*/ /* 0*/ u32 active:1; /* 1*/ u32 singleMovementActive:1; /* 2*/ u32 triggerGroundEffectsOnMove:1; /* 3*/ u32 triggerGroundEffectsOnStop:1; /* 4*/ u32 disableCoveringGroundEffects:1; /* 5*/ u32 landingJump:1; /* 6*/ u32 heldMovementActive:1; /* 7*/ u32 heldMovementFinished:1; /*0x01*/ /* 8*/ u32 frozen:1; /* 9*/ u32 facingDirectionLocked:1; /*10*/ u32 disableAnim:1; /*11*/ u32 enableAnim:1; /*12*/ u32 inanimate:1; /*13*/ u32 invisible:1; /*14*/ u32 offScreen:1; /*15*/ u32 trackedByCamera:1; /*0x02*/ /*16*/ u32 isPlayer:1; /*17*/ u32 hasReflection:1; /*18*/ u32 inShortGrass:1; /*19*/ u32 inShallowFlowingWater:1; /*20*/ u32 inSandPile:1; /*21*/ u32 inHotSprings:1; /*22*/ u32 hasShadow:1; /*23*/ u32 spriteAnimPausedBackup:1; /*0x03*/ /*24*/ u32 spriteAffineAnimPausedBackup:1; /*25*/ u32 disableJumpLandingGroundEffect:1; /*26*/ u32 fixedPriority:1; /*27*/ u32 hideReflection:1; /*0x04*/ u8 spriteId; /*0x05*/ u8 graphicsId; /*0x06*/ u8 movementType; /*0x07*/ u8 trainerType; /*0x08*/ u8 localId; /*0x09*/ u8 mapNum; /*0x0A*/ u8 mapGroup; /*0x0B*/ u8 currentElevation:4; u8 previousElevation:4; /*0x0C*/ struct Coords16 initialCoords; /*0x10*/ struct Coords16 currentCoords; /*0x14*/ struct Coords16 previousCoords; /*0x18*/ u8 facingDirection:4; u8 movementDirection:4; u16 rangeX:4; u16 rangeY:4; /*0x1A*/ u8 fieldEffectSpriteId; /*0x1B*/ u8 warpArrowSpriteId; /*0x1C*/ u8 movementActionId; /*0x1D*/ u8 trainerRange_berryTreeId; /*0x1E*/ u8 currentMetatileBehavior; /*0x1F*/ u8 previousMetatileBehavior; /*0x20*/ u8 previousMovementDirection; /*0x21*/ u8 directionSequenceIndex; /*0x22*/ u8 playerCopyableMovement; /*size = 0x24*/ }; struct ObjectEventGraphicsInfo { /*0x00*/ u16 tileTag; /*0x02*/ u16 paletteTag; /*0x04*/ u16 reflectionPaletteTag; /*0x06*/ u16 size; /*0x08*/ s16 width; /*0x0A*/ s16 height; /*0x0C*/ u8 paletteSlot:4; u8 shadowSize:2; u8 inanimate:1; u8 disableReflectionPaletteLoad:1; /*0x0D*/ u8 tracks; /*0x10*/ const struct OamData *oam; /*0x14*/ const struct SubspriteTable *subspriteTables; /*0x18*/ const union AnimCmd *const *anims; /*0x1C*/ const struct SpriteFrameImage *images; /*0x20*/ const union AffineAnimCmd *const *affineAnims; }; enum { PLAYER_AVATAR_STATE_NORMAL, PLAYER_AVATAR_STATE_MACH_BIKE, PLAYER_AVATAR_STATE_ACRO_BIKE, PLAYER_AVATAR_STATE_SURFING, PLAYER_AVATAR_STATE_UNDERWATER, PLAYER_AVATAR_STATE_CONTROLLABLE, PLAYER_AVATAR_STATE_FORCED, PLAYER_AVATAR_STATE_DASH, }; #define PLAYER_AVATAR_STATE_VS_SEEKER PLAYER_AVATAR_STATE_WATERING //not a real state. This is defined to make sPlayerAvatarGfxIds consistent #define PLAYER_AVATAR_FLAG_ON_FOOT (1 << PLAYER_AVATAR_STATE_NORMAL) #define PLAYER_AVATAR_FLAG_MACH_BIKE (1 << PLAYER_AVATAR_STATE_MACH_BIKE) #define PLAYER_AVATAR_FLAG_ACRO_BIKE (1 << PLAYER_AVATAR_STATE_ACRO_BIKE) #define PLAYER_AVATAR_FLAG_SURFING (1 << PLAYER_AVATAR_STATE_SURFING) #define PLAYER_AVATAR_FLAG_UNDERWATER (1 << PLAYER_AVATAR_STATE_UNDERWATER) #define PLAYER_AVATAR_FLAG_CONTROLLABLE (1 << PLAYER_AVATAR_STATE_CONTROLLABLE) #define PLAYER_AVATAR_FLAG_FORCED (1 << PLAYER_AVATAR_STATE_FORCED) #define PLAYER_AVATAR_FLAG_DASH (1 << PLAYER_AVATAR_STATE_DASH) enum { PLAYER_AVATAR_GFX_NORMAL, PLAYER_AVATAR_GFX_BIKE, PLAYER_AVATAR_GFX_RIDE, PLAYER_AVATAR_GFX_FIELD_MOVE, PLAYER_AVATAR_GFX_FISH, PLAYER_AVATAR_GFX_VSSEEKER, PLAYER_AVATAR_GFX_UNDERWATER, }; enum { ACRO_BIKE_NORMAL, ACRO_BIKE_TURNING, ACRO_BIKE_WHEELIE_STANDING, ACRO_BIKE_BUNNY_HOP, ACRO_BIKE_WHEELIE_MOVING, ACRO_BIKE_STATE5, ACRO_BIKE_STATE6, }; enum { COLLISION_NONE, COLLISION_OUTSIDE_RANGE, COLLISION_IMPASSABLE, COLLISION_ELEVATION_MISMATCH, COLLISION_OBJECT_EVENT, COLLISION_STOP_SURFING, COLLISION_LEDGE_JUMP, COLLISION_PUSHED_BOULDER, COLLISION_DIRECTIONAL_STAIR_WARP, COLLISION_WHEELIE_HOP, COLLISION_ISOLATED_VERTICAL_RAIL, COLLISION_ISOLATED_HORIZONTAL_RAIL, COLLISION_VERTICAL_RAIL, COLLISION_HORIZONTAL_RAIL, COLLISION_COUNT }; // player running states enum { NOT_MOVING, TURN_DIRECTION, // not the same as turning! turns your avatar without moving. also known as a turn frame in some circles MOVING, }; // player tile transition states enum { T_NOT_MOVING, T_TILE_TRANSITION, T_TILE_CENTER, // player is on a frame in which they are centered on a tile during which the player either stops or keeps their momentum and keeps going, changing direction if necessary. }; struct PlayerAvatar { /*0x00*/ u8 flags; /*0x01*/ u8 transitionFlags; // used to be bike, but it's not that in Emerald and probably isn't here either. maybe transition flags? /*0x02*/ u8 runningState; // this is a static running state. 00 is not moving, 01 is turn direction, 02 is moving. /*0x03*/ u8 tileTransitionState; // this is a transition running state: 00 is not moving, 01 is transition between tiles, 02 means you are on the frame in which you have centered on a tile but are about to keep moving, even if changing directions. 2 is also used for a ledge hop, since you are transitioning. /*0x04*/ u8 spriteId; /*0x05*/ u8 objectEventId; /*0x06*/ bool8 preventStep; /*0x07*/ u8 gender; // These are not used in FRLG u8 acroBikeState; u8 newDirBackup; u8 bikeFrameCounter; u8 bikeSpeed; u32 directionHistory; u32 abStartSelectHistory; u8 dirTimerHistory[8]; // For the Rocket mazes u16 lastSpinTile; }; struct Camera { bool8 active:1; s32 x; s32 y; }; extern struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT]; extern u8 gSelectedObjectEvent; extern struct MapHeader gMapHeader; extern struct PlayerAvatar gPlayerAvatar; extern struct Camera gCamera; #endif // GUARD_GLOBAL_FIELDMAP_H ================================================ FILE: include/global.h ================================================ #ifndef GUARD_GLOBAL_H #define GUARD_GLOBAL_H #include "config.h" #include "gba/gba.h" #include #include "constants/global.h" #include "constants/flags.h" #include "constants/vars.h" #include "constants/species.h" #include "constants/pokedex.h" #include "constants/easy_chat.h" #include "constants/rgb.h" // Prevent cross-jump optimization. #define BLOCK_CROSS_JUMP asm(""); // to help in decompiling #define asm_comment(x) asm volatile("@ -- " x " -- ") #define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided") // IDE support #if defined(__APPLE__) || defined(__CYGWIN__) || defined(__INTELLISENSE__) // We define these when using certain IDEs to fool preproc #define _(x) (x) #define __(x) (x) #define INCBIN(...) {0} #define INCBIN_U8 INCBIN #define INCBIN_U16 INCBIN #define INCBIN_U32 INCBIN #define INCBIN_S8 INCBIN #define INCBIN_S16 INCBIN #define INCBIN_S32 INCBIN #endif // IDE support #define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0])) // Alias of ARRAY_COUNT using GameFreak's name from AgbAssert calls. #define NELEMS(array) ARRAY_COUNT(array) #define SWAP(a, b, temp) \ { \ temp = a; \ a = b; \ b = temp; \ } // useful math macros // Converts a number to Q8.8 fixed-point format #define Q_8_8(n) ((s16)((n) * 256)) // Converts a number from Q8.8 fixed-point format #define Q_8_8_TO_INT(n) ((s16)((n) >> 8)) // Converts a number to Q4.12 fixed-point format #define Q_4_12(n) ((s16)((n) * 4096)) // Converts a number from Q4.12 fixed-point format #define Q_4_12_TO_INT(n) ((s16)((n) >> 12)) // Converts a number to QN.S fixed-point format (16-bits) #define Q_N_S(s, n) ((s16)((n) * (1 << (s)))) // converts a number from QN.S fixed-point format (16-bits) #define Q_N_S_TO_INT(s, n) ((s16)((n) >> (s))) // Converts a number to Q24.8 fixed-point format #define Q_24_8(n) ((s32)((n) << 8)) // Converts a number from Q24.8 fixed-point format #define Q_24_8_TO_INT(n) ((s32)((n) >> 8)) #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) >= (b) ? (a) : (b)) #if MODERN #define abs(x) (((x) < 0) ? -(x) : (x)) #endif // Used in cases where division by 0 can occur in the retail version. // Avoids invalid opcodes on some emulators, and the otherwise UB. #ifdef UBFIX #define SAFE_DIV(a, b) ((b) ? (a) / (b) : 0) #else #define SAFE_DIV(a, b) ((a) / (b)) #endif // Extracts the upper 16 bits of a 32-bit number #define HIHALF(n) (((n) & 0xFFFF0000) >> 16) // Extracts the lower 16 bits of a 32-bit number #define LOHALF(n) ((n) & 0xFFFF) // There are many quirks in the source code which have overarching behavioral differences from // a number of other files. For example, diploma.c seems to declare rodata before each use while // other files declare out of order and must be at the beginning. There are also a number of // macros which differ from one file to the next due to the method of obtaining the result, such // as these below. Because of this, there is a theory (Two Team Theory) that states that these // programming projects had more than 1 "programming team" which utilized different macros for // each of the files that were worked on. #define T1_READ_8(ptr) ((ptr)[0]) #define T1_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) #define T1_READ_32(ptr) ((ptr)[0] | ((ptr)[1] << 8) | ((ptr)[2] << 16) | ((ptr)[3] << 24)) #define T1_READ_PTR(ptr) (u8 *) T1_READ_32(ptr) // T2_READ_8 is a duplicate to remain consistent with each group. #define T2_READ_8(ptr) ((ptr)[0]) #define T2_READ_16(ptr) ((ptr)[0] + ((ptr)[1] << 8)) #define T2_READ_32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) #define T2_READ_PTR(ptr) (void *) T2_READ_32(ptr) // This macro is required to prevent the compiler from optimizing // a dpad up/down check in sub_812CAD8 (fame_checker.c). #define TEST_BUTTON(field, button) ({(field) & (button);}) #define JOY_NEW(button) TEST_BUTTON(gMain.newKeys, button) #define JOY_HELD(button) TEST_BUTTON(gMain.heldKeys, button) #define JOY_HELD_RAW(button) TEST_BUTTON(gMain.heldKeysRaw, button) #define JOY_REPT(button) TEST_BUTTON(gMain.newAndRepeatedKeys, button) #define S16TOPOSFLOAT(val) \ ({ \ s16 v = (val); \ float f = (float)v; \ if(v < 0) f += 65536.0f; \ f; \ }) extern u8 gStringVar1[]; extern u8 gStringVar2[]; extern u8 gStringVar3[]; extern u8 gStringVar4[]; #define DIV_ROUND_UP(val, roundBy)(((val) / (roundBy)) + (((val) % (roundBy)) ? 1 : 0)) #define ROUND_BITS_TO_BYTES(numBits) DIV_ROUND_UP(numBits, 8) #define DEX_FLAGS_NO ROUND_BITS_TO_BYTES(NUM_SPECIES) #define NUM_FLAG_BYTES ROUND_BITS_TO_BYTES(FLAGS_COUNT) #define NUM_ADDITIONAL_PHRASE_BYTES ROUND_BITS_TO_BYTES(NUM_ADDITIONAL_PHRASES) // This produces an error at compile-time if expr is zero. // It looks like file.c:line: size of array `id' is negative #define STATIC_ASSERT(expr, id) typedef char id[(expr) ? 1 : -1]; struct Coords8 { s8 x; s8 y; }; struct UCoords8 { u8 x; u8 y; }; struct Coords16 { s16 x; s16 y; }; struct UCoords16 { u16 x; u16 y; }; struct Coords32 { s32 x; s32 y; }; struct UCoords32 { u32 x; u32 y; }; struct Time { /*0x00*/ s16 days; /*0x02*/ s8 hours; /*0x03*/ s8 minutes; /*0x04*/ s8 seconds; }; struct Pokedex { /*0x00*/ u8 order; /*0x01*/ u8 mode; /*0x02*/ u8 unused; // set to 0xDA, never read /*0x03*/ u8 nationalMagic; // set to 0xB9 when national dex is first enabled /*0x04*/ u32 unownPersonality; // set when you first see Unown /*0x08*/ u32 spindaPersonality; // set when you first see Spinda /*0x0C*/ u32 unknown3; /*0x10*/ u8 owned[DEX_FLAGS_NO]; /*0x44*/ u8 seen[DEX_FLAGS_NO]; }; struct PokemonJumpRecords { u16 jumpsInRow; u16 unused1; // Set to 0, never read u16 excellentsInRow; u16 gamesWithMaxPlayers; u32 unused2; // Set to 0, never read u32 bestJumpScore; }; struct BerryPickingResults // possibly used in the game itself? Size may be wrong as well { u32 bestScore; u16 berriesPicked; u16 berriesPickedInRow; u8 field_8; u8 field_9; u8 field_A; u8 field_B; u8 field_C; u8 field_D; u8 field_E; u8 field_F; }; struct BerryCrush { u16 pressingSpeeds[4]; // For the record with each possible group size, 2-5 players u32 berryPowderAmount; u32 unk; }; #define LINK_B_RECORDS_COUNT 5 struct LinkBattleRecord { u8 name[PLAYER_NAME_LENGTH + 1]; u16 trainerId; u16 wins; u16 losses; u16 draws; }; struct LinkBattleRecords { struct LinkBattleRecord entries[LINK_B_RECORDS_COUNT]; u8 languages[LINK_B_RECORDS_COUNT]; }; struct RecordMixingGiftData { u8 unk0; u8 quantity; u16 itemId; u8 filler4[8]; }; struct RecordMixingGift { int checksum; struct RecordMixingGiftData data; }; #include "constants/game_stat.h" #include "global.fieldmap.h" #include "global.berry.h" #include "pokemon.h" struct BattleTowerRecord // record mixing { /*0x00*/ u8 battleTowerLevelType; // 0 = level 50, 1 = level 100 /*0x01*/ u8 trainerClass; /*0x02*/ u16 winStreak; /*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1]; /*0x0C*/ u8 trainerId[TRAINER_ID_LENGTH]; /*0x10*/ u16 greeting[EASY_CHAT_BATTLE_WORDS_COUNT]; /*0x1C*/ struct BattleTowerPokemon party[3]; /*0xA0*/ u32 checksum; }; struct BattleTowerEReaderTrainer { /*0x4A0 0x3F0 0x00*/ u8 unk0; /*0x4A1 0x3F1 0x01*/ u8 trainerClass; /*0x4A2 0x3F2 0x02*/ u16 winStreak; /*0x4A4 0x3F4 0x04*/ u8 name[8]; /*0x4AC 0x3FC 0x0C*/ u8 trainerId[4]; /*0x4B0 0x400 0x10*/ u16 greeting[6]; /*0x4BC 0x40C 0x1C*/ u16 farewellPlayerLost[6]; /*0x4C8 0x418 0x28*/ u16 farewellPlayerWon[6]; /*0x4D4 0x424 0x34*/ struct BattleTowerPokemon party[3]; /*0x558 0x4A8 0xB8*/ u32 checksum; }; struct BattleTowerData // Leftover from R/S { /*0x0000, 0x00B0*/ struct BattleTowerRecord playerRecord; /*0x00A4, 0x0154*/ struct BattleTowerRecord records[5]; // from record mixing /*0x03D8, 0x0488*/ u16 firstMonSpecies; // species of the first pokemon in the player's battle tower party /*0x03DA, 0x048A*/ u16 defeatedBySpecies; // species of the pokemon that defated the player /*0x03DC, 0x048C*/ u8 defeatedByTrainerName[8]; /*0x03E4, 0x0494*/ u8 firstMonNickname[POKEMON_NAME_LENGTH]; // nickname of the first pokemon in the player's battle tower party /*0x03F0, 0x04A0*/ struct BattleTowerEReaderTrainer ereaderTrainer; /*0x04AC, 0x055C*/ u8 battleTowerLevelType:1; // 0 = level 50; 1 = level 100 /*0x04AC, 0x055C*/ u8 unk_554:1; /*0x04AD, 0x055D*/ u8 battleOutcome; /*0x04AE, 0x055E*/ u8 var_4AE[2]; /*0x04B0, 0x0560*/ u16 curChallengeBattleNum[2]; // 1-based index of battle in the current challenge. (challenges consist of 7 battles) /*0x04B4, 0x0564*/ u16 curStreakChallengesNum[2]; // 1-based index of the current challenge in the current streak. /*0x04B8, 0x0568*/ u16 recordWinStreaks[2]; /*0x04BC, 0x056C*/ u8 battleTowerTrainerId; // index for gBattleTowerTrainers table /*0x04BD, 0x056D*/ u8 selectedPartyMons[0x3]; // indices of the 3 selected player party mons. /*0x04C0, 0x0570*/ u16 prizeItem; /*0x04C2, 0x0572*/ u8 battledTrainerIds[6]; /*0x04C8, 0x0578*/ u16 totalBattleTowerWins; /*0x04CA, 0x057A*/ u16 bestBattleTowerWinStreak; /*0x04CC, 0x057C*/ u16 currentWinStreaks[2]; /*0x04D0, 0x0580*/ u8 lastStreakLevelType; // 0 = level 50, 1 = level 100. level type of the last streak. Used by tv to report the level mode. /*0x04D1, 0x0581*/ u8 filler_4D1[0x317]; }; /* size = 0x7E8 */ struct SaveBlock2 { /*0x000*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x008*/ u8 playerGender; // MALE, FEMALE /*0x009*/ u8 specialSaveWarpFlags; /*0x00A*/ u8 playerTrainerId[TRAINER_ID_LENGTH]; /*0x00E*/ u16 playTimeHours; /*0x010*/ u8 playTimeMinutes; /*0x011*/ u8 playTimeSeconds; /*0x012*/ u8 playTimeVBlanks; /*0x013*/ u8 optionsButtonMode:2; // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A] u8 optionsHpBarAnimSpeed:2; //speed at which health bar animates u8 optionsPadding:4; /*0x014*/ u16 optionsTextSpeed:3; // OPTIONS_TEXT_SPEED_[SLOW/MID/FAST/INSTANT] u16 optionsWindowFrameType:5; // Specifies one of the 20 decorative borders for text boxes /*0x15*/ u16 optionsSound:1; // OPTIONS_SOUND_[MONO/STEREO] u16 optionsBattleStyle:2; // OPTIONS_BATTLE_STYLE_[PREDICT/SHIFT/SET] u16 optionsBattleSceneOff:1; // whether battle animations are disabled u16 optionsBattleTransitions:1; // whether battle transitions are disabled u16 optionsBattleIntroAnim:1; // whether battle intro slide is disabled u16 optionsExpBarAnimSpeed:1; // whether exp bar animates instantly /*0x018*/ struct Pokedex pokedex; /*0x090*/ u8 filler_90[0x8]; /*0x098*/ struct Time localTimeOffset; /*0x0A0*/ struct Time lastBerryTreeUpdate; /*0x0A8*/ u32 gcnLinkFlags; // Read by Pokemon Colosseum/XD /*0x0AC*/ bool8 unkFlag1; // Set TRUE, never read /*0x0AD*/ bool8 unkFlag2; // Set FALSE, never read /*0x0B0*/ struct BattleTowerData battleTower; /*0x898*/ u16 mapView[0x100]; /*0xA98*/ struct LinkBattleRecords linkBattleRecords; /*0xAF0*/ struct BerryCrush berryCrush; /*0xB00*/ struct PokemonJumpRecords pokeJump; /*0xB10*/ struct BerryPickingResults berryPick; /*0xB20*/ u8 filler_B20[0x400]; /*0xF20*/ u32 encryptionKey; }; // size: 0xF24 extern struct SaveBlock2 *gSaveBlock2Ptr; struct SecretBaseParty { u32 personality[PARTY_SIZE]; u16 moves[PARTY_SIZE * MAX_MON_MOVES]; u16 species[PARTY_SIZE]; u16 heldItems[PARTY_SIZE]; u8 levels[PARTY_SIZE]; u8 EVs[PARTY_SIZE]; }; // Leftover from R/S, still referenced in the unused function CreateSecretBaseEnemyParty struct SecretBaseRecord { /*0x1A9C*/ u8 secretBaseId; /*0x1A9D*/ u8 toRegister:4; /*0x1A9D*/ u8 gender:1; /*0x1A9D*/ u8 battledOwnerToday:1; /*0x1A9D*/ u8 registryStatus:2; /*0x1A9E*/ u8 trainerName[PLAYER_NAME_LENGTH]; /*0x1AA5*/ u8 trainerId[TRAINER_ID_LENGTH]; // byte 0 is used for determining trainer class /*0x1AA9*/ u8 language; /*0x1AAA*/ u16 numSecretBasesReceived; /*0x1AAC*/ u8 numTimesEntered; /*0x1AAD*/ u8 unused; /*0x1AAE*/ u8 decorations[DECOR_MAX_SECRET_BASE]; /*0x1ABE*/ u8 decorationPos[DECOR_MAX_SECRET_BASE]; /*0x1AD0*/ struct SecretBaseParty party; }; struct WarpData { s8 mapGroup; s8 mapNum; s8 warpId; s16 x, y; }; struct ItemSlot { u16 itemId; u16 quantity; }; struct Pokeblock { u8 color; u8 spicy; u8 dry; u8 sweet; u8 bitter; u8 sour; u8 feel; }; struct Roamer { /*0x00*/ u32 ivs; /*0x04*/ u32 personality; /*0x08*/ u16 species; /*0x0A*/ u16 hp; /*0x0C*/ u8 level; /*0x0D*/ u8 status; /*0x0E*/ u8 cool; /*0x0F*/ u8 beauty; /*0x10*/ u8 cute; /*0x11*/ u8 smart; /*0x12*/ u8 tough; /*0x13*/ bool8 active; /*0x14*/ u8 filler[0x8]; }; struct RamScriptData { u8 magic; u8 mapGroup; u8 mapNum; u8 objectId; u8 script[995]; }; struct RamScript { u32 checksum; struct RamScriptData data; }; // Leftover from R/S struct DewfordTrend { u16 trendiness:7; u16 maxTrendiness:7; u16 gainingTrendiness:1; u16 rand; u16 words[2]; }; /*size = 0x8*/ struct MauvilleManCommon { u8 id; }; struct MauvilleManBard { /*0x00*/ u8 id; /*0x02*/ u16 songLyrics[BARD_SONG_LENGTH]; /*0x0E*/ u16 temporaryLyrics[BARD_SONG_LENGTH]; /*0x1A*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x22*/ u8 filler_2DB6[0x3]; /*0x25*/ u8 playerTrainerId[TRAINER_ID_LENGTH]; /*0x29*/ bool8 hasChangedSong; /*0x2A*/ u8 language; }; /*size = 0x2C*/ struct MauvilleManStoryteller { u8 id; bool8 alreadyRecorded; u8 filler2[2]; u8 gameStatIDs[NUM_STORYTELLER_TALES]; u8 trainerNames[NUM_STORYTELLER_TALES][PLAYER_NAME_LENGTH]; u8 statValues[NUM_STORYTELLER_TALES][4]; u8 language[NUM_STORYTELLER_TALES]; }; struct MauvilleManGiddy { /*0x00*/ u8 id; /*0x01*/ u8 taleCounter; /*0x02*/ u8 questionNum; /*0x04*/ u16 randomWords[GIDDY_MAX_TALES]; /*0x18*/ u8 questionList[GIDDY_MAX_QUESTIONS]; /*0x20*/ u8 language; }; /*size = 0x2C*/ struct MauvilleManHipster { u8 id; bool8 alreadySpoken; u8 language; }; struct MauvilleOldManTrader { u8 id; u8 decorIds[NUM_TRADER_ITEMS]; u8 playerNames[NUM_TRADER_ITEMS][11]; u8 alreadyTraded; u8 language[NUM_TRADER_ITEMS]; }; typedef union OldMan { struct MauvilleManCommon common; struct MauvilleManBard bard; struct MauvilleManGiddy giddy; struct MauvilleManHipster hipster; struct MauvilleOldManTrader trader; struct MauvilleManStoryteller storyteller; u8 filler[0x40]; } OldMan; struct Mail { /*0x00*/ u16 words[MAIL_WORDS_COUNT]; /*0x12*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x1A*/ u8 trainerId[TRAINER_ID_LENGTH]; /*0x1E*/ u16 species; /*0x20*/ u16 itemId; }; struct DayCareMail { struct Mail message; u8 OT_name[PLAYER_NAME_LENGTH + 1]; u8 monName[POKEMON_NAME_LENGTH + 1]; u8 gameLanguage:4; u8 monLanguage:4; }; struct DaycareMon { struct BoxPokemon mon; struct DayCareMail mail; u32 steps; }; struct DayCare { struct DaycareMon mons[DAYCARE_MON_COUNT]; u32 offspringPersonality; u8 stepCounter; }; // Leftover from R/S, referenced in unused function InitDaycareMailRecordMixing struct RecordMixingDayCareMail { struct DayCareMail mail[DAYCARE_MON_COUNT]; u32 numDaycareMons; bool16 holdsItem[DAYCARE_MON_COUNT]; }; struct QuestLogObjectEventTemplate { u32 x:8; u32 negx:1; u32 y:8; u32 negy:1; u32 elevation:6; u32 movementType:8; }; struct QuestLogObjectEvent { /*0x00*/ u8 active:1; /*0x00*/ u8 triggerGroundEffectsOnStop:1; /*0x00*/ u8 disableCoveringGroundEffects:1; /*0x00*/ u8 landingJump:1; /*0x00*/ u8 frozen:1; /*0x00*/ u8 facingDirectionLocked:1; /*0x00*/ u8 disableAnim:1; /*0x00*/ u8 enableAnim:1; /*0x01*/ u8 inanimate:1; /*0x01*/ u8 invisible:1; /*0x01*/ u8 offScreen:1; /*0x01*/ u8 trackedByCamera:1; /*0x01*/ u8 isPlayer:1; /*0x01*/ u8 spriteAnimPausedBackup:1; /*0x01*/ u8 spriteAffineAnimPausedBackup:1; /*0x01*/ u8 disableJumpLandingGroundEffect:1; /*0x02*/ u8 fixedPriority:1; /*0x02*/ u8 facingDirection:4; /*0x02*/ u8 unused:3; /*0x03*/ u8 currentElevation:4; /*0x03*/ u8 previousElevation:4; /*0x04*/ u8 graphicsId; /*0x05*/ u8 movementType; /*0x06*/ u8 trainerType; /*0x07*/ u8 localId; /*0x08*/ u8 mapNum; /*0x09*/ u8 mapGroup; /*0x0a*/ s16 x; /*0x0c*/ s16 y; /*0x0e*/ u8 trainerRange_berryTreeId; /*0x0f*/ u8 previousMetatileBehavior; /*0x10*/ u8 directionSequenceIndex; /*0x11*/ u8 animId; }; // This represents all the data needed to display a single scene for the "Quest Log" when the player resumes playing. // struct QuestLogScene { /*0x0000*/ u8 startType; // QL_START_NORMAL / QL_START_WARP /*0x0001*/ u8 mapGroup; /*0x0002*/ u8 mapNum; /*0x0003*/ u8 warpId; /*0x0004*/ s16 x; /*0x0006*/ s16 y; /*0x0008*/ struct QuestLogObjectEvent objectEvents[OBJECT_EVENTS_COUNT]; /*0x0148*/ u8 flags[NUM_FLAG_BYTES]; /*0x02c8*/ u16 vars[VARS_COUNT]; /*0x0468*/ struct QuestLogObjectEventTemplate objectEventTemplates[OBJECT_EVENT_TEMPLATES_COUNT]; /*0x0568*/ u16 script[128]; /*0x0668*/ u16 end[0]; }; #include "fame_checker.h" struct FameCheckerSaveData { /*3a54*/ u16 pickState:2; u16 flavorTextFlags:12; u16 unk_0_E:2; }; struct WonderNewsMetadata { u8 newsType:2; u8 sentRewardCounter:3; u8 rewardCounter:3; u8 berry; }; struct WonderNews { u16 id; u8 sendType; // SEND_TYPE_* u8 bgType; u8 titleText[WONDER_NEWS_TEXT_LENGTH]; u8 bodyText[WONDER_NEWS_BODY_TEXT_LINES][WONDER_NEWS_TEXT_LENGTH]; }; struct WonderCard { u16 flagId; // Event flag (sReceivedGiftFlags) + WONDER_CARD_FLAG_OFFSET u16 iconSpecies; u32 idNumber; u8 type:2; // CARD_TYPE_* u8 bgType:4; u8 sendType:2; // SEND_TYPE_* u8 maxStamps; u8 titleText[WONDER_CARD_TEXT_LENGTH]; u8 subtitleText[WONDER_CARD_TEXT_LENGTH]; u8 bodyText[WONDER_CARD_BODY_TEXT_LINES][WONDER_CARD_TEXT_LENGTH]; u8 footerLine1Text[WONDER_CARD_TEXT_LENGTH]; u8 footerLine2Text[WONDER_CARD_TEXT_LENGTH]; }; struct WonderCardMetadata { u16 battlesWon; u16 battlesLost; u16 numTrades; u16 iconSpecies; u16 stampData[2][MAX_STAMP_CARD_STAMPS]; // First element is STAMP_SPECIES, second is STAMP_ID }; struct MysteryGiftSave { u32 newsCrc; struct WonderNews news; u32 cardCrc; struct WonderCard card; u32 cardMetadataCrc; struct WonderCardMetadata cardMetadata; u16 questionnaireWords[NUM_QUESTIONNAIRE_WORDS]; struct WonderNewsMetadata newsMetadata; u32 trainerIds[2][5]; // Saved ids for 10 trainers, 5 each for battles and trades }; // 0x36C 0x348C struct TrainerTower { u32 timer; u32 bestTime; u8 floorsCleared; u8 unk9; bool8 receivedPrize:1; bool8 checkedFinalTime:1; bool8 spokeToOwner:1; bool8 hasLost:1; bool8 unkA_4:1; bool8 validated:1; }; struct TrainerNameRecord { u32 trainerId; u8 trainerName[PLAYER_NAME_LENGTH + 1]; }; struct KeySystemFlags { u16 difficulty:2; //0 for normal, 1 for challenge, 2 for easy, 3 for maybe another mode? u16 version:1; //0 for FR, 1 for LG u16 nuzlocke:1; //0 for normal, 1 for Nuzlocke mode u16 ivCalcMode:2; //0 for normal, 1 for all 31, 2 for all zero u16 evCalcMode:1; //0 for normal, 1 for all zero u16 noPMC:1; //0 for normal, 1 for no Pokemon Center healing. u16 expMod:2; //0 for 0x, 1 for 1/2x, 2 for 1x, 3 for 2x u16 padding:4; u16 changedCalcMode:1; //set if calc mode is changed to recalc party on save load u16 inKeySystemMenu:1; //Needed for Help Menu regardless of Button Mode u16 padding2; }; // For external event data storage. The majority of these may have never been used. // In FRLG, the only known used fields are the PokeCoupon and BoxRS ones, but hacking the distribution discs allows FRLG to receive events and set the others struct ExternalEventData { u8 unknownExternalDataFields1[7]; // if actually used, may be broken up into different fields. u32 unknownExternalDataFields2:8; u32 currentPokeCoupons:24; // PokéCoupons stored by Pokémon Colosseum and XD from Mt. Battle runs. Earned PokéCoupons are also added to totalEarnedPokeCoupons. Colosseum/XD caps this at 9,999,999, but will read up to 16,777,215. u32 gotGoldPokeCouponTitleReward:1; // Master Ball from JP Colosseum Bonus Disc; for reaching 30,000 totalEarnedPokeCoupons u32 gotSilverPokeCouponTitleReward:1; // Light Ball Pikachu from JP Colosseum Bonus Disc; for reaching 5000 totalEarnedPokeCoupons u32 gotBronzePokeCouponTitleReward:1; // PP Max from JP Colosseum Bonus Disc; for reaching 2500 totalEarnedPokeCoupons u32 receivedAgetoCelebi:1; // from JP Colosseum Bonus Disc u32 unknownExternalDataFields3:4; u32 totalEarnedPokeCoupons:24; // Used by the JP Colosseum bonus disc. Determines PokéCoupon rank to distribute rewards. Unread in International games. Colosseum/XD caps this at 9,999,999. u8 unknownExternalDataFields4[5]; // if actually used, may be broken up into different fields. } __attribute__((packed)); /*size = 0x14*/ // For external event flags. The majority of these may have never been used. // In FRLG, Jirachi cannot normally be received, but hacking the distribution discs allows FRLG to receive Jirachi and set the flag struct ExternalEventFlags { u8 usedBoxRS:1; // Set by Pokémon Box: Ruby & Sapphire; denotes whether this save has connected to it and triggered the free False Swipe Swablu Egg giveaway. u8 boxRSEggsUnlocked:2; // Set by Pokémon Box: Ruby & Sapphire; denotes the number of Eggs unlocked from deposits; 1 for ExtremeSpeed Zigzagoon (at 100 deposited), 2 for Pay Day Skitty (at 500 deposited), 3 for Surf Pichu (at 1499 deposited) u8 padding:5; u8 unknownFlag1; u8 receivedGCNJirachi; // Both the US Colosseum Bonus Disc and PAL/AUS Pokémon Channel use this field. One cannot receive a WISHMKR Jirachi and CHANNEL Jirachi with the same savefile. u8 unknownFlag3; u8 unknownFlag4; u8 unknownFlag5; u8 unknownFlag6; u8 unknownFlag7; u8 unknownFlag8; u8 unknownFlag9; u8 unknownFlag10; u8 unknownFlag11; u8 unknownFlag12; u8 unknownFlag13; u8 unknownFlag14; u8 unknownFlag15; u8 unknownFlag16; u8 unknownFlag17; u8 unknownFlag18; u8 unknownFlag19; u8 unknownFlag20; } __attribute__((packed));/*size = 0x15*/ struct SaveBlock1 { /*0x0000*/ struct Coords16 pos; /*0x0004*/ struct WarpData location; /*0x000C*/ struct WarpData continueGameWarp; /*0x0014*/ struct WarpData dynamicWarp; /*0x001C*/ struct WarpData lastHealLocation; /*0x0024*/ struct WarpData escapeWarp; /*0x002C*/ u16 savedMusic; /*0x002E*/ u8 weather; /*0x002F*/ u8 weatherCycleStage; /*0x0030*/ u8 flashLevel; /*0x0032*/ u16 mapLayoutId; /*0x0034*/ u8 playerPartyCount; /*0x0038*/ struct Pokemon playerParty[PARTY_SIZE]; /*0x0290*/ u32 money; /*0x0294*/ u16 coins; /*0x0296*/ u16 registeredItem; // registered for use with SELECT button, could probably be stripped to less than a byte as an index into a table of only registerable items /*0x0298*/ struct ItemSlot pcItems[PC_ITEMS_COUNT]; /*0x0310*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT]; //now holds 47 items /*0x053C*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT]; u8 bagPocket_TMHM[8]; // 8 bytes fills all TMs/HMs u8 bagPocket_KeyItems[BAG_KEYITEMS_COUNT]; // stripped to one byte indices, 36 slots now for all legal FRLG Key Items at once + 2 more for cheaters/alignment. struct ItemSlot bagPocket_Medicine[BAG_MEDICINE_COUNT]; struct ItemSlot bagPocket_HoldItems[BAG_HELD_ITEMS_COUNT]; u8 leftoverItemSlots[92]; //padding to prevent shifting the saveblock, Berry Pocket was moved elsewhere /*0x05F8*/ u8 seen1[52]; //made unreferenced & can be gotten rid of, though PKHeX presumably will still set this /*0x062C*/ u8 filler_062C[5]; // unused; was berryBlenderRecords which was obviously unused u8 masterTrainerTitle; // 0 is none, 152 is Grandmaster, 1-151 is {Kanto species} Master /*0x0632*/ u16 lastViewedPokedexEntry; // For easier viewing of roamers struct KeySystemFlags keyFlags; //Key System flags /*0x0638*/ u16 trainerRematchStepCounter; /*0x063A*/ u8 ALIGNED(2) trainerRematches[MAX_REMATCH_ENTRIES]; /*0x06A0*/ struct ObjectEvent objectEvents[OBJECT_EVENTS_COUNT]; /*0x08E0*/ struct ObjectEventTemplate objectEventTemplates[OBJECT_EVENT_TEMPLATES_COUNT]; /*0x0EE0*/ u8 flags[NUM_FLAG_BYTES]; /*0x1000*/ u16 vars[VARS_COUNT]; /*0x1200*/ u32 gameStats[NUM_GAME_STATS]; /*0x1300*/ struct QuestLogScene questLog[QUEST_LOG_SCENE_COUNT]; /*0x2CA0*/ u16 easyChatProfile[EASY_CHAT_BATTLE_WORDS_COUNT]; /*0x2CAC*/ u16 easyChatBattleStart[EASY_CHAT_BATTLE_WORDS_COUNT]; //referred to, but functionally unused /*0x2CB8*/ u16 easyChatBattleWon[EASY_CHAT_BATTLE_WORDS_COUNT]; //referred to, but functionally unused /*0x2CC4*/ u16 easyChatBattleLost[EASY_CHAT_BATTLE_WORDS_COUNT]; //referred to, but functionally unused /*0x2CD0*/ struct Mail mail[MAIL_COUNT]; /*0x2F10*/ u8 additionalPhrases[NUM_ADDITIONAL_PHRASE_BYTES]; /*0x2F18*/ u8 filler_oldMan[64]; // unused, was struct OldMan oldMan /*0x2F54*/ u8 filler_EasyChatPairs[36]; // unused, was struct DewfordTrend dewfordTrends[5], which was 40 bytes, but I had to add 2 bytes to the Daycare struct (which got padded to 4). /*0x2F80*/ struct DayCare daycare; /*0x309C*/ u8 giftRibbons[GIFT_RIBBONS_COUNT]; /*0x30A7*/ struct ExternalEventData externalEventData; /*0x30BB*/ struct ExternalEventFlags externalEventFlags; /*0x30D0*/ struct Roamer roamer; /*0x30EC*/ struct EnigmaBerry enigmaBerry; /*0x3120*/ struct MysteryGiftSave mysteryGift; //0x36C in length /*0x348C*/ u8 unused_348C[176]; //^^^this & the mysteryEventBuffers field are labeled "FreeWork" & combined in the source, though 0x36C of FreeWork is set aside for MEventBuffers in mevent.c, //^^^which is likely where the above field was documented from. The rest of FreeWork is unreferenced in the source, so this field is likely unused. u8 nuzlockeDupeFlags[52]; //taken from filler_348c field, which was originally 400 bytes. Used to prevent hijacking the dupe clause in Nuzlocke by catching fainted Pokemon. struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT]; //taken from filler_348C field, which was originally 400 bytes /*0x361C*/ struct RamScript ramScript; /*0x3A08*/ u8 filler3A08[16]; //RecordMixingGift recordMixingGift. Unused. /*0x3A18*/ u8 seen2[52]; //made unreferenced & can be gotten rid of, though PKHeX presumably will still set this /*0x3A4C*/ u8 rivalName[PLAYER_NAME_LENGTH + 1]; /*0x3A54*/ struct FameCheckerSaveData fameChecker[NUM_FAMECHECKER_PERSONS]; /*0x3A94*/ u8 unused_3A94[44]; //max fame checker people is actually 32, so this is the unused 16 entries u8 masterTrainerFlags[20]; //taken from above unused_3A94 field, which was originally 64 bytes long. 1 byte longer than necessary for alignment. /*0x3AD4*/ u8 registeredTexts[UNION_ROOM_KB_ROW_COUNT][21]; /*0x3BA8*/ struct TrainerNameRecord trainerNameRecords[20]; /*0x3C98*/ struct DaycareMon route5DayCareMon; /*0x3D24*/ u8 unused_3D24[16]; //some sort of win/loss/draw records that are never referred to. An RFU thing. Mystery Event? /*0x3D34*/ u32 towerChallengeId; /*0x3D38*/ struct TrainerTower trainerTower[NUM_TOWER_CHALLENGE_TYPES]; }; // size: 0x3D68 struct MapPosition { s16 x; s16 y; s8 elevation; }; extern struct SaveBlock1* gSaveBlock1Ptr; extern u8 gReservedSpritePaletteCount; #endif // GUARD_GLOBAL_H ================================================ FILE: include/gpu_regs.h ================================================ #ifndef GUARD_GPU_REGS_H #define GUARD_GPU_REGS_H #include "global.h" // Exported type declarations // Exported RAM declarations // Exported ROM declarations void InitGpuRegManager(void); void CopyBufferedValuesToGpuRegs(void); void SetGpuReg(u8 regOffset, u16 value); void SetGpuReg_ForcedBlank(u8 regOffset, u16 value); u16 GetGpuReg(u8 regOffset); void SetGpuRegBits(u8 regOffset, u16 mask); void ClearGpuRegBits(u8 regOffset, u16 mask); void EnableInterrupts(u16 mask); void DisableInterrupts(u16 mask); #endif //GUARD_GPU_REGS_H ================================================ FILE: include/graphics.h ================================================ #ifndef GUARD_GRAPHICS_H #define GUARD_GRAPHICS_H #include "global.h" extern const u32 gBallGfx_Poke[]; extern const u32 gBallPal_Poke[]; extern const u32 gBallGfx_Great[]; extern const u32 gBallPal_Great[]; extern const u32 gBallGfx_Safari[]; extern const u32 gBallPal_Safari[]; extern const u32 gBallGfx_Ultra[]; extern const u32 gBallPal_Ultra[]; extern const u32 gBallGfx_Master[]; extern const u32 gBallPal_Master[]; extern const u32 gBallGfx_Net[]; extern const u32 gBallPal_Net[]; extern const u32 gBallGfx_Dive[]; extern const u32 gBallPal_Dive[]; extern const u32 gBallGfx_Nest[]; extern const u32 gBallPal_Nest[]; extern const u32 gBallGfx_Repeat[]; extern const u32 gBallPal_Repeat[]; extern const u32 gBallGfx_Timer[]; extern const u32 gBallPal_Timer[]; extern const u32 gBallGfx_Luxury[]; extern const u32 gBallPal_Luxury[]; extern const u32 gBallGfx_Premier[]; extern const u32 gBallPal_Premier[]; extern const u32 gOpenPokeballGfx[]; // pokemon gfx extern const u32 gMonFrontPic_Bulbasaur[]; extern const u32 gMonPalette_Bulbasaur[]; extern const u32 gMonBackPic_Bulbasaur[]; extern const u32 gMonShinyPalette_Bulbasaur[]; extern const u8 gMonIcon_Bulbasaur[]; extern const u8 gMonFootprint_Bulbasaur[]; extern const u32 gMonFrontPic_Ivysaur[]; extern const u32 gMonPalette_Ivysaur[]; extern const u32 gMonBackPic_Ivysaur[]; extern const u32 gMonShinyPalette_Ivysaur[]; extern const u8 gMonIcon_Ivysaur[]; extern const u8 gMonFootprint_Ivysaur[]; extern const u32 gMonFrontPic_Venusaur[]; extern const u32 gMonPalette_Venusaur[]; extern const u32 gMonBackPic_Venusaur[]; extern const u32 gMonShinyPalette_Venusaur[]; extern const u8 gMonIcon_Venusaur[]; extern const u8 gMonFootprint_Venusaur[]; extern const u32 gMonFrontPic_Charmander[]; extern const u32 gMonPalette_Charmander[]; extern const u32 gMonBackPic_Charmander[]; extern const u32 gMonShinyPalette_Charmander[]; extern const u8 gMonIcon_Charmander[]; extern const u8 gMonFootprint_Charmander[]; extern const u32 gMonFrontPic_Charmeleon[]; extern const u32 gMonPalette_Charmeleon[]; extern const u32 gMonBackPic_Charmeleon[]; extern const u32 gMonShinyPalette_Charmeleon[]; extern const u8 gMonIcon_Charmeleon[]; extern const u8 gMonFootprint_Charmeleon[]; extern const u32 gMonFrontPic_Charizard[]; extern const u32 gMonPalette_Charizard[]; extern const u32 gMonBackPic_Charizard[]; extern const u32 gMonShinyPalette_Charizard[]; extern const u8 gMonIcon_Charizard[]; extern const u8 gMonFootprint_Charizard[]; extern const u32 gMonFrontPic_Squirtle[]; extern const u32 gMonPalette_Squirtle[]; extern const u32 gMonBackPic_Squirtle[]; extern const u32 gMonShinyPalette_Squirtle[]; extern const u8 gMonIcon_Squirtle[]; extern const u8 gMonFootprint_Squirtle[]; extern const u32 gMonFrontPic_Wartortle[]; extern const u32 gMonPalette_Wartortle[]; extern const u32 gMonBackPic_Wartortle[]; extern const u32 gMonShinyPalette_Wartortle[]; extern const u8 gMonIcon_Wartortle[]; extern const u8 gMonFootprint_Wartortle[]; extern const u32 gMonFrontPic_Blastoise[]; extern const u32 gMonPalette_Blastoise[]; extern const u32 gMonBackPic_Blastoise[]; extern const u32 gMonShinyPalette_Blastoise[]; extern const u8 gMonIcon_Blastoise[]; extern const u8 gMonFootprint_Blastoise[]; extern const u32 gMonFrontPic_Caterpie[]; extern const u32 gMonPalette_Caterpie[]; extern const u32 gMonBackPic_Caterpie[]; extern const u32 gMonShinyPalette_Caterpie[]; extern const u8 gMonIcon_Caterpie[]; extern const u8 gMonFootprint_Caterpie[]; extern const u32 gMonFrontPic_Metapod[]; extern const u32 gMonPalette_Metapod[]; extern const u32 gMonBackPic_Metapod[]; extern const u32 gMonShinyPalette_Metapod[]; extern const u8 gMonIcon_Metapod[]; extern const u8 gMonFootprint_Metapod[]; extern const u32 gMonFrontPic_Butterfree[]; extern const u32 gMonPalette_Butterfree[]; extern const u32 gMonBackPic_Butterfree[]; extern const u32 gMonShinyPalette_Butterfree[]; extern const u8 gMonIcon_Butterfree[]; extern const u8 gMonFootprint_Butterfree[]; extern const u32 gMonFrontPic_Weedle[]; extern const u32 gMonPalette_Weedle[]; extern const u32 gMonBackPic_Weedle[]; extern const u32 gMonShinyPalette_Weedle[]; extern const u8 gMonIcon_Weedle[]; extern const u8 gMonFootprint_Weedle[]; extern const u32 gMonFrontPic_Kakuna[]; extern const u32 gMonPalette_Kakuna[]; extern const u32 gMonBackPic_Kakuna[]; extern const u32 gMonShinyPalette_Kakuna[]; extern const u8 gMonIcon_Kakuna[]; extern const u8 gMonFootprint_Kakuna[]; extern const u32 gMonFrontPic_Beedrill[]; extern const u32 gMonPalette_Beedrill[]; extern const u32 gMonBackPic_Beedrill[]; extern const u32 gMonShinyPalette_Beedrill[]; extern const u8 gMonIcon_Beedrill[]; extern const u8 gMonFootprint_Beedrill[]; extern const u32 gMonFrontPic_Pidgey[]; extern const u32 gMonPalette_Pidgey[]; extern const u32 gMonBackPic_Pidgey[]; extern const u32 gMonShinyPalette_Pidgey[]; extern const u8 gMonIcon_Pidgey[]; extern const u8 gMonFootprint_Pidgey[]; extern const u32 gMonFrontPic_Pidgeotto[]; extern const u32 gMonPalette_Pidgeotto[]; extern const u32 gMonBackPic_Pidgeotto[]; extern const u32 gMonShinyPalette_Pidgeotto[]; extern const u8 gMonIcon_Pidgeotto[]; extern const u8 gMonFootprint_Pidgeotto[]; extern const u32 gMonFrontPic_Pidgeot[]; extern const u32 gMonPalette_Pidgeot[]; extern const u32 gMonBackPic_Pidgeot[]; extern const u32 gMonShinyPalette_Pidgeot[]; extern const u8 gMonIcon_Pidgeot[]; extern const u8 gMonFootprint_Pidgeot[]; extern const u32 gMonFrontPic_Rattata[]; extern const u32 gMonPalette_Rattata[]; extern const u32 gMonBackPic_Rattata[]; extern const u32 gMonShinyPalette_Rattata[]; extern const u8 gMonIcon_Rattata[]; extern const u8 gMonFootprint_Rattata[]; extern const u32 gMonFrontPic_Raticate[]; extern const u32 gMonPalette_Raticate[]; extern const u32 gMonBackPic_Raticate[]; extern const u32 gMonShinyPalette_Raticate[]; extern const u8 gMonIcon_Raticate[]; extern const u8 gMonFootprint_Raticate[]; extern const u32 gMonFrontPic_Spearow[]; extern const u32 gMonPalette_Spearow[]; extern const u32 gMonBackPic_Spearow[]; extern const u32 gMonShinyPalette_Spearow[]; extern const u8 gMonIcon_Spearow[]; extern const u8 gMonFootprint_Spearow[]; extern const u32 gMonFrontPic_Fearow[]; extern const u32 gMonPalette_Fearow[]; extern const u32 gMonBackPic_Fearow[]; extern const u32 gMonShinyPalette_Fearow[]; extern const u8 gMonIcon_Fearow[]; extern const u8 gMonFootprint_Fearow[]; extern const u32 gMonFrontPic_Ekans[]; extern const u32 gMonPalette_Ekans[]; extern const u32 gMonBackPic_Ekans[]; extern const u32 gMonShinyPalette_Ekans[]; extern const u8 gMonIcon_Ekans[]; extern const u8 gMonFootprint_Ekans[]; extern const u32 gMonFrontPic_Arbok[]; extern const u32 gMonPalette_Arbok[]; extern const u32 gMonBackPic_Arbok[]; extern const u32 gMonShinyPalette_Arbok[]; extern const u8 gMonIcon_Arbok[]; extern const u8 gMonFootprint_Arbok[]; extern const u32 gMonFrontPic_Pikachu[]; extern const u32 gMonPalette_Pikachu[]; extern const u32 gMonBackPic_Pikachu[]; extern const u32 gMonShinyPalette_Pikachu[]; extern const u8 gMonIcon_Pikachu[]; extern const u8 gMonFootprint_Pikachu[]; extern const u32 gMonFrontPic_Raichu[]; extern const u32 gMonPalette_Raichu[]; extern const u32 gMonBackPic_Raichu[]; extern const u32 gMonShinyPalette_Raichu[]; extern const u8 gMonIcon_Raichu[]; extern const u8 gMonFootprint_Raichu[]; extern const u32 gMonFrontPic_Sandshrew[]; extern const u32 gMonPalette_Sandshrew[]; extern const u32 gMonBackPic_Sandshrew[]; extern const u32 gMonShinyPalette_Sandshrew[]; extern const u8 gMonIcon_Sandshrew[]; extern const u8 gMonFootprint_Sandshrew[]; extern const u32 gMonFrontPic_Sandslash[]; extern const u32 gMonPalette_Sandslash[]; extern const u32 gMonBackPic_Sandslash[]; extern const u32 gMonShinyPalette_Sandslash[]; extern const u8 gMonIcon_Sandslash[]; extern const u8 gMonFootprint_Sandslash[]; extern const u32 gMonFrontPic_NidoranF[]; extern const u32 gMonPalette_NidoranF[]; extern const u32 gMonBackPic_NidoranF[]; extern const u32 gMonShinyPalette_NidoranF[]; extern const u8 gMonIcon_NidoranF[]; extern const u8 gMonFootprint_NidoranF[]; extern const u32 gMonFrontPic_Nidorina[]; extern const u32 gMonPalette_Nidorina[]; extern const u32 gMonBackPic_Nidorina[]; extern const u32 gMonShinyPalette_Nidorina[]; extern const u8 gMonIcon_Nidorina[]; extern const u8 gMonFootprint_Nidorina[]; extern const u32 gMonFrontPic_Nidoqueen[]; extern const u32 gMonPalette_Nidoqueen[]; extern const u32 gMonBackPic_Nidoqueen[]; extern const u32 gMonShinyPalette_Nidoqueen[]; extern const u8 gMonIcon_Nidoqueen[]; extern const u8 gMonFootprint_Nidoqueen[]; extern const u32 gMonFrontPic_NidoranM[]; extern const u32 gMonPalette_NidoranM[]; extern const u32 gMonBackPic_NidoranM[]; extern const u32 gMonShinyPalette_NidoranM[]; extern const u8 gMonIcon_NidoranM[]; extern const u8 gMonFootprint_NidoranM[]; extern const u32 gMonFrontPic_Nidorino[]; extern const u32 gMonPalette_Nidorino[]; extern const u32 gMonBackPic_Nidorino[]; extern const u32 gMonShinyPalette_Nidorino[]; extern const u8 gMonIcon_Nidorino[]; extern const u8 gMonFootprint_Nidorino[]; extern const u32 gMonFrontPic_Nidoking[]; extern const u32 gMonPalette_Nidoking[]; extern const u32 gMonBackPic_Nidoking[]; extern const u32 gMonShinyPalette_Nidoking[]; extern const u8 gMonIcon_Nidoking[]; extern const u8 gMonFootprint_Nidoking[]; extern const u32 gMonFrontPic_Clefairy[]; extern const u32 gMonPalette_Clefairy[]; extern const u32 gMonBackPic_Clefairy[]; extern const u32 gMonShinyPalette_Clefairy[]; extern const u8 gMonIcon_Clefairy[]; extern const u8 gMonFootprint_Clefairy[]; extern const u32 gMonFrontPic_Clefable[]; extern const u32 gMonPalette_Clefable[]; extern const u32 gMonBackPic_Clefable[]; extern const u32 gMonShinyPalette_Clefable[]; extern const u8 gMonIcon_Clefable[]; extern const u8 gMonFootprint_Clefable[]; extern const u32 gMonFrontPic_Vulpix[]; extern const u32 gMonPalette_Vulpix[]; extern const u32 gMonBackPic_Vulpix[]; extern const u32 gMonShinyPalette_Vulpix[]; extern const u8 gMonIcon_Vulpix[]; extern const u8 gMonFootprint_Vulpix[]; extern const u32 gMonFrontPic_Ninetales[]; extern const u32 gMonPalette_Ninetales[]; extern const u32 gMonBackPic_Ninetales[]; extern const u32 gMonShinyPalette_Ninetales[]; extern const u8 gMonIcon_Ninetales[]; extern const u8 gMonFootprint_Ninetales[]; extern const u32 gMonFrontPic_Jigglypuff[]; extern const u32 gMonPalette_Jigglypuff[]; extern const u32 gMonBackPic_Jigglypuff[]; extern const u32 gMonShinyPalette_Jigglypuff[]; extern const u8 gMonIcon_Jigglypuff[]; extern const u8 gMonFootprint_Jigglypuff[]; extern const u32 gMonFrontPic_Wigglytuff[]; extern const u32 gMonPalette_Wigglytuff[]; extern const u32 gMonBackPic_Wigglytuff[]; extern const u32 gMonShinyPalette_Wigglytuff[]; extern const u8 gMonIcon_Wigglytuff[]; extern const u8 gMonFootprint_Wigglytuff[]; extern const u32 gMonFrontPic_Zubat[]; extern const u32 gMonPalette_Zubat[]; extern const u32 gMonBackPic_Zubat[]; extern const u32 gMonShinyPalette_Zubat[]; extern const u8 gMonIcon_Zubat[]; extern const u8 gMonFootprint_Zubat[]; extern const u32 gMonFrontPic_Golbat[]; extern const u32 gMonPalette_Golbat[]; extern const u32 gMonBackPic_Golbat[]; extern const u32 gMonShinyPalette_Golbat[]; extern const u8 gMonIcon_Golbat[]; extern const u8 gMonFootprint_Golbat[]; extern const u32 gMonFrontPic_Oddish[]; extern const u32 gMonPalette_Oddish[]; extern const u32 gMonBackPic_Oddish[]; extern const u32 gMonShinyPalette_Oddish[]; extern const u8 gMonIcon_Oddish[]; extern const u8 gMonFootprint_Oddish[]; extern const u32 gMonFrontPic_Gloom[]; extern const u32 gMonPalette_Gloom[]; extern const u32 gMonBackPic_Gloom[]; extern const u32 gMonShinyPalette_Gloom[]; extern const u8 gMonIcon_Gloom[]; extern const u8 gMonFootprint_Gloom[]; extern const u32 gMonFrontPic_Vileplume[]; extern const u32 gMonPalette_Vileplume[]; extern const u32 gMonBackPic_Vileplume[]; extern const u32 gMonShinyPalette_Vileplume[]; extern const u8 gMonIcon_Vileplume[]; extern const u8 gMonFootprint_Vileplume[]; extern const u32 gMonFrontPic_Paras[]; extern const u32 gMonPalette_Paras[]; extern const u32 gMonBackPic_Paras[]; extern const u32 gMonShinyPalette_Paras[]; extern const u8 gMonIcon_Paras[]; extern const u8 gMonFootprint_Paras[]; extern const u32 gMonFrontPic_Parasect[]; extern const u32 gMonPalette_Parasect[]; extern const u32 gMonBackPic_Parasect[]; extern const u32 gMonShinyPalette_Parasect[]; extern const u8 gMonIcon_Parasect[]; extern const u8 gMonFootprint_Parasect[]; extern const u32 gMonFrontPic_Venonat[]; extern const u32 gMonPalette_Venonat[]; extern const u32 gMonBackPic_Venonat[]; extern const u32 gMonShinyPalette_Venonat[]; extern const u8 gMonIcon_Venonat[]; extern const u8 gMonFootprint_Venonat[]; extern const u32 gMonFrontPic_Venomoth[]; extern const u32 gMonPalette_Venomoth[]; extern const u32 gMonBackPic_Venomoth[]; extern const u32 gMonShinyPalette_Venomoth[]; extern const u8 gMonIcon_Venomoth[]; extern const u8 gMonFootprint_Venomoth[]; extern const u32 gMonFrontPic_Diglett[]; extern const u32 gMonPalette_Diglett[]; extern const u32 gMonBackPic_Diglett[]; extern const u32 gMonShinyPalette_Diglett[]; extern const u8 gMonIcon_Diglett[]; extern const u8 gMonFootprint_Diglett[]; extern const u32 gMonFrontPic_Dugtrio[]; extern const u32 gMonPalette_Dugtrio[]; extern const u32 gMonBackPic_Dugtrio[]; extern const u32 gMonShinyPalette_Dugtrio[]; extern const u8 gMonIcon_Dugtrio[]; extern const u8 gMonFootprint_Dugtrio[]; extern const u32 gMonFrontPic_Meowth[]; extern const u32 gMonPalette_Meowth[]; extern const u32 gMonBackPic_Meowth[]; extern const u32 gMonShinyPalette_Meowth[]; extern const u8 gMonIcon_Meowth[]; extern const u8 gMonFootprint_Meowth[]; extern const u32 gMonFrontPic_Persian[]; extern const u32 gMonPalette_Persian[]; extern const u32 gMonBackPic_Persian[]; extern const u32 gMonShinyPalette_Persian[]; extern const u8 gMonIcon_Persian[]; extern const u8 gMonFootprint_Persian[]; extern const u32 gMonFrontPic_Psyduck[]; extern const u32 gMonPalette_Psyduck[]; extern const u32 gMonBackPic_Psyduck[]; extern const u32 gMonShinyPalette_Psyduck[]; extern const u8 gMonIcon_Psyduck[]; extern const u8 gMonFootprint_Psyduck[]; extern const u32 gMonFrontPic_Golduck[]; extern const u32 gMonPalette_Golduck[]; extern const u32 gMonBackPic_Golduck[]; extern const u32 gMonShinyPalette_Golduck[]; extern const u8 gMonIcon_Golduck[]; extern const u8 gMonFootprint_Golduck[]; extern const u32 gMonFrontPic_Mankey[]; extern const u32 gMonPalette_Mankey[]; extern const u32 gMonBackPic_Mankey[]; extern const u32 gMonShinyPalette_Mankey[]; extern const u8 gMonIcon_Mankey[]; extern const u8 gMonFootprint_Mankey[]; extern const u32 gMonFrontPic_Primeape[]; extern const u32 gMonPalette_Primeape[]; extern const u32 gMonBackPic_Primeape[]; extern const u32 gMonShinyPalette_Primeape[]; extern const u8 gMonIcon_Primeape[]; extern const u8 gMonFootprint_Primeape[]; extern const u32 gMonFrontPic_Growlithe[]; extern const u32 gMonPalette_Growlithe[]; extern const u32 gMonBackPic_Growlithe[]; extern const u32 gMonShinyPalette_Growlithe[]; extern const u8 gMonIcon_Growlithe[]; extern const u8 gMonFootprint_Growlithe[]; extern const u32 gMonFrontPic_Arcanine[]; extern const u32 gMonPalette_Arcanine[]; extern const u32 gMonBackPic_Arcanine[]; extern const u32 gMonShinyPalette_Arcanine[]; extern const u8 gMonIcon_Arcanine[]; extern const u8 gMonFootprint_Arcanine[]; extern const u32 gMonFrontPic_Poliwag[]; extern const u32 gMonPalette_Poliwag[]; extern const u32 gMonBackPic_Poliwag[]; extern const u32 gMonShinyPalette_Poliwag[]; extern const u8 gMonIcon_Poliwag[]; extern const u8 gMonFootprint_Poliwag[]; extern const u32 gMonFrontPic_Poliwhirl[]; extern const u32 gMonPalette_Poliwhirl[]; extern const u32 gMonBackPic_Poliwhirl[]; extern const u32 gMonShinyPalette_Poliwhirl[]; extern const u8 gMonIcon_Poliwhirl[]; extern const u8 gMonFootprint_Poliwhirl[]; extern const u32 gMonFrontPic_Poliwrath[]; extern const u32 gMonPalette_Poliwrath[]; extern const u32 gMonBackPic_Poliwrath[]; extern const u32 gMonShinyPalette_Poliwrath[]; extern const u8 gMonIcon_Poliwrath[]; extern const u8 gMonFootprint_Poliwrath[]; extern const u32 gMonFrontPic_Abra[]; extern const u32 gMonPalette_Abra[]; extern const u32 gMonBackPic_Abra[]; extern const u32 gMonShinyPalette_Abra[]; extern const u8 gMonIcon_Abra[]; extern const u8 gMonFootprint_Abra[]; extern const u32 gMonFrontPic_Kadabra[]; extern const u32 gMonPalette_Kadabra[]; extern const u32 gMonBackPic_Kadabra[]; extern const u32 gMonShinyPalette_Kadabra[]; extern const u8 gMonIcon_Kadabra[]; extern const u8 gMonFootprint_Kadabra[]; extern const u32 gMonFrontPic_Alakazam[]; extern const u32 gMonPalette_Alakazam[]; extern const u32 gMonBackPic_Alakazam[]; extern const u32 gMonShinyPalette_Alakazam[]; extern const u8 gMonIcon_Alakazam[]; extern const u8 gMonFootprint_Alakazam[]; extern const u32 gMonFrontPic_Machop[]; extern const u32 gMonPalette_Machop[]; extern const u32 gMonBackPic_Machop[]; extern const u32 gMonShinyPalette_Machop[]; extern const u8 gMonIcon_Machop[]; extern const u8 gMonFootprint_Machop[]; extern const u32 gMonFrontPic_Machoke[]; extern const u32 gMonPalette_Machoke[]; extern const u32 gMonBackPic_Machoke[]; extern const u32 gMonShinyPalette_Machoke[]; extern const u8 gMonIcon_Machoke[]; extern const u8 gMonFootprint_Machoke[]; extern const u32 gMonFrontPic_Machamp[]; extern const u32 gMonPalette_Machamp[]; extern const u32 gMonBackPic_Machamp[]; extern const u32 gMonShinyPalette_Machamp[]; extern const u8 gMonIcon_Machamp[]; extern const u8 gMonFootprint_Machamp[]; extern const u32 gMonFrontPic_Bellsprout[]; extern const u32 gMonPalette_Bellsprout[]; extern const u32 gMonBackPic_Bellsprout[]; extern const u32 gMonShinyPalette_Bellsprout[]; extern const u8 gMonIcon_Bellsprout[]; extern const u8 gMonFootprint_Bellsprout[]; extern const u32 gMonFrontPic_Weepinbell[]; extern const u32 gMonPalette_Weepinbell[]; extern const u32 gMonBackPic_Weepinbell[]; extern const u32 gMonShinyPalette_Weepinbell[]; extern const u8 gMonIcon_Weepinbell[]; extern const u8 gMonFootprint_Weepinbell[]; extern const u32 gMonFrontPic_Victreebel[]; extern const u32 gMonPalette_Victreebel[]; extern const u32 gMonBackPic_Victreebel[]; extern const u32 gMonShinyPalette_Victreebel[]; extern const u8 gMonIcon_Victreebel[]; extern const u8 gMonFootprint_Victreebel[]; extern const u32 gMonFrontPic_Tentacool[]; extern const u32 gMonPalette_Tentacool[]; extern const u32 gMonBackPic_Tentacool[]; extern const u32 gMonShinyPalette_Tentacool[]; extern const u8 gMonIcon_Tentacool[]; extern const u8 gMonFootprint_Tentacool[]; extern const u32 gMonFrontPic_Tentacruel[]; extern const u32 gMonPalette_Tentacruel[]; extern const u32 gMonBackPic_Tentacruel[]; extern const u32 gMonShinyPalette_Tentacruel[]; extern const u8 gMonIcon_Tentacruel[]; extern const u8 gMonFootprint_Tentacruel[]; extern const u32 gMonFrontPic_Geodude[]; extern const u32 gMonPalette_Geodude[]; extern const u32 gMonBackPic_Geodude[]; extern const u32 gMonShinyPalette_Geodude[]; extern const u8 gMonIcon_Geodude[]; extern const u8 gMonFootprint_Geodude[]; extern const u32 gMonFrontPic_Graveler[]; extern const u32 gMonPalette_Graveler[]; extern const u32 gMonBackPic_Graveler[]; extern const u32 gMonShinyPalette_Graveler[]; extern const u8 gMonIcon_Graveler[]; extern const u8 gMonFootprint_Graveler[]; extern const u32 gMonFrontPic_Golem[]; extern const u32 gMonPalette_Golem[]; extern const u32 gMonBackPic_Golem[]; extern const u32 gMonShinyPalette_Golem[]; extern const u8 gMonIcon_Golem[]; extern const u8 gMonFootprint_Golem[]; extern const u32 gMonFrontPic_Ponyta[]; extern const u32 gMonPalette_Ponyta[]; extern const u32 gMonBackPic_Ponyta[]; extern const u32 gMonShinyPalette_Ponyta[]; extern const u8 gMonIcon_Ponyta[]; extern const u8 gMonFootprint_Ponyta[]; extern const u32 gMonFrontPic_Rapidash[]; extern const u32 gMonPalette_Rapidash[]; extern const u32 gMonBackPic_Rapidash[]; extern const u32 gMonShinyPalette_Rapidash[]; extern const u8 gMonIcon_Rapidash[]; extern const u8 gMonFootprint_Rapidash[]; extern const u32 gMonFrontPic_Slowpoke[]; extern const u32 gMonPalette_Slowpoke[]; extern const u32 gMonBackPic_Slowpoke[]; extern const u32 gMonShinyPalette_Slowpoke[]; extern const u8 gMonIcon_Slowpoke[]; extern const u8 gMonFootprint_Slowpoke[]; extern const u32 gMonFrontPic_Slowbro[]; extern const u32 gMonPalette_Slowbro[]; extern const u32 gMonBackPic_Slowbro[]; extern const u32 gMonShinyPalette_Slowbro[]; extern const u8 gMonIcon_Slowbro[]; extern const u8 gMonFootprint_Slowbro[]; extern const u32 gMonFrontPic_Magnemite[]; extern const u32 gMonPalette_Magnemite[]; extern const u32 gMonBackPic_Magnemite[]; extern const u32 gMonShinyPalette_Magnemite[]; extern const u8 gMonIcon_Magnemite[]; extern const u8 gMonFootprint_Magnemite[]; extern const u32 gMonFrontPic_Magneton[]; extern const u32 gMonPalette_Magneton[]; extern const u32 gMonBackPic_Magneton[]; extern const u32 gMonShinyPalette_Magneton[]; extern const u8 gMonIcon_Magneton[]; extern const u8 gMonFootprint_Magneton[]; extern const u32 gMonFrontPic_Farfetchd[]; extern const u32 gMonPalette_Farfetchd[]; extern const u32 gMonBackPic_Farfetchd[]; extern const u32 gMonShinyPalette_Farfetchd[]; extern const u8 gMonIcon_Farfetchd[]; extern const u8 gMonFootprint_Farfetchd[]; extern const u32 gMonFrontPic_Doduo[]; extern const u32 gMonPalette_Doduo[]; extern const u32 gMonBackPic_Doduo[]; extern const u32 gMonShinyPalette_Doduo[]; extern const u8 gMonIcon_Doduo[]; extern const u8 gMonFootprint_Doduo[]; extern const u32 gMonFrontPic_Dodrio[]; extern const u32 gMonPalette_Dodrio[]; extern const u32 gMonBackPic_Dodrio[]; extern const u32 gMonShinyPalette_Dodrio[]; extern const u8 gMonIcon_Dodrio[]; extern const u8 gMonFootprint_Dodrio[]; extern const u32 gMonFrontPic_Seel[]; extern const u32 gMonPalette_Seel[]; extern const u32 gMonBackPic_Seel[]; extern const u32 gMonShinyPalette_Seel[]; extern const u8 gMonIcon_Seel[]; extern const u8 gMonFootprint_Seel[]; extern const u32 gMonFrontPic_Dewgong[]; extern const u32 gMonPalette_Dewgong[]; extern const u32 gMonBackPic_Dewgong[]; extern const u32 gMonShinyPalette_Dewgong[]; extern const u8 gMonIcon_Dewgong[]; extern const u8 gMonFootprint_Dewgong[]; extern const u32 gMonFrontPic_Grimer[]; extern const u32 gMonPalette_Grimer[]; extern const u32 gMonBackPic_Grimer[]; extern const u32 gMonShinyPalette_Grimer[]; extern const u8 gMonIcon_Grimer[]; extern const u8 gMonFootprint_Grimer[]; extern const u32 gMonFrontPic_Muk[]; extern const u32 gMonPalette_Muk[]; extern const u32 gMonBackPic_Muk[]; extern const u32 gMonShinyPalette_Muk[]; extern const u8 gMonIcon_Muk[]; extern const u8 gMonFootprint_Muk[]; extern const u32 gMonFrontPic_Shellder[]; extern const u32 gMonPalette_Shellder[]; extern const u32 gMonBackPic_Shellder[]; extern const u32 gMonShinyPalette_Shellder[]; extern const u8 gMonIcon_Shellder[]; extern const u8 gMonFootprint_Shellder[]; extern const u32 gMonFrontPic_Cloyster[]; extern const u32 gMonPalette_Cloyster[]; extern const u32 gMonBackPic_Cloyster[]; extern const u32 gMonShinyPalette_Cloyster[]; extern const u8 gMonIcon_Cloyster[]; extern const u8 gMonFootprint_Cloyster[]; extern const u32 gMonFrontPic_Gastly[]; extern const u32 gMonPalette_Gastly[]; extern const u32 gMonBackPic_Gastly[]; extern const u32 gMonShinyPalette_Gastly[]; extern const u8 gMonIcon_Gastly[]; extern const u8 gMonFootprint_Gastly[]; extern const u32 gMonFrontPic_Haunter[]; extern const u32 gMonPalette_Haunter[]; extern const u32 gMonBackPic_Haunter[]; extern const u32 gMonShinyPalette_Haunter[]; extern const u8 gMonIcon_Haunter[]; extern const u8 gMonFootprint_Haunter[]; extern const u32 gMonFrontPic_Gengar[]; extern const u32 gMonPalette_Gengar[]; extern const u32 gMonBackPic_Gengar[]; extern const u32 gMonShinyPalette_Gengar[]; extern const u8 gMonIcon_Gengar[]; extern const u8 gMonFootprint_Gengar[]; extern const u32 gMonFrontPic_Onix[]; extern const u32 gMonPalette_Onix[]; extern const u32 gMonBackPic_Onix[]; extern const u32 gMonShinyPalette_Onix[]; extern const u8 gMonIcon_Onix[]; extern const u8 gMonFootprint_Onix[]; extern const u32 gMonFrontPic_Drowzee[]; extern const u32 gMonPalette_Drowzee[]; extern const u32 gMonBackPic_Drowzee[]; extern const u32 gMonShinyPalette_Drowzee[]; extern const u8 gMonIcon_Drowzee[]; extern const u8 gMonFootprint_Drowzee[]; extern const u32 gMonFrontPic_Hypno[]; extern const u32 gMonPalette_Hypno[]; extern const u32 gMonBackPic_Hypno[]; extern const u32 gMonShinyPalette_Hypno[]; extern const u8 gMonIcon_Hypno[]; extern const u8 gMonFootprint_Hypno[]; extern const u32 gMonFrontPic_Krabby[]; extern const u32 gMonPalette_Krabby[]; extern const u32 gMonBackPic_Krabby[]; extern const u32 gMonShinyPalette_Krabby[]; extern const u8 gMonIcon_Krabby[]; extern const u8 gMonFootprint_Krabby[]; extern const u32 gMonFrontPic_Kingler[]; extern const u32 gMonPalette_Kingler[]; extern const u32 gMonBackPic_Kingler[]; extern const u32 gMonShinyPalette_Kingler[]; extern const u8 gMonIcon_Kingler[]; extern const u8 gMonFootprint_Kingler[]; extern const u32 gMonFrontPic_Voltorb[]; extern const u32 gMonPalette_Voltorb[]; extern const u32 gMonBackPic_Voltorb[]; extern const u32 gMonShinyPalette_Voltorb[]; extern const u8 gMonIcon_Voltorb[]; extern const u8 gMonFootprint_Voltorb[]; extern const u32 gMonFrontPic_Electrode[]; extern const u32 gMonPalette_Electrode[]; extern const u32 gMonBackPic_Electrode[]; extern const u32 gMonShinyPalette_Electrode[]; extern const u8 gMonIcon_Electrode[]; extern const u8 gMonFootprint_Electrode[]; extern const u32 gMonFrontPic_Exeggcute[]; extern const u32 gMonPalette_Exeggcute[]; extern const u32 gMonBackPic_Exeggcute[]; extern const u32 gMonShinyPalette_Exeggcute[]; extern const u8 gMonIcon_Exeggcute[]; extern const u8 gMonFootprint_Exeggcute[]; extern const u32 gMonFrontPic_Exeggutor[]; extern const u32 gMonPalette_Exeggutor[]; extern const u32 gMonBackPic_Exeggutor[]; extern const u32 gMonShinyPalette_Exeggutor[]; extern const u8 gMonIcon_Exeggutor[]; extern const u8 gMonFootprint_Exeggutor[]; extern const u32 gMonFrontPic_Cubone[]; extern const u32 gMonPalette_Cubone[]; extern const u32 gMonBackPic_Cubone[]; extern const u32 gMonShinyPalette_Cubone[]; extern const u8 gMonIcon_Cubone[]; extern const u8 gMonFootprint_Cubone[]; extern const u32 gMonFrontPic_Marowak[]; extern const u32 gMonPalette_Marowak[]; extern const u32 gMonBackPic_Marowak[]; extern const u32 gMonShinyPalette_Marowak[]; extern const u8 gMonIcon_Marowak[]; extern const u8 gMonFootprint_Marowak[]; extern const u32 gMonFrontPic_Hitmonlee[]; extern const u32 gMonPalette_Hitmonlee[]; extern const u32 gMonBackPic_Hitmonlee[]; extern const u32 gMonShinyPalette_Hitmonlee[]; extern const u8 gMonIcon_Hitmonlee[]; extern const u8 gMonFootprint_Hitmonlee[]; extern const u32 gMonFrontPic_Hitmonchan[]; extern const u32 gMonPalette_Hitmonchan[]; extern const u32 gMonBackPic_Hitmonchan[]; extern const u32 gMonShinyPalette_Hitmonchan[]; extern const u8 gMonIcon_Hitmonchan[]; extern const u8 gMonFootprint_Hitmonchan[]; extern const u32 gMonFrontPic_Lickitung[]; extern const u32 gMonPalette_Lickitung[]; extern const u32 gMonBackPic_Lickitung[]; extern const u32 gMonShinyPalette_Lickitung[]; extern const u8 gMonIcon_Lickitung[]; extern const u8 gMonFootprint_Lickitung[]; extern const u32 gMonFrontPic_Koffing[]; extern const u32 gMonPalette_Koffing[]; extern const u32 gMonBackPic_Koffing[]; extern const u32 gMonShinyPalette_Koffing[]; extern const u8 gMonIcon_Koffing[]; extern const u8 gMonFootprint_Koffing[]; extern const u32 gMonFrontPic_Weezing[]; extern const u32 gMonPalette_Weezing[]; extern const u32 gMonBackPic_Weezing[]; extern const u32 gMonShinyPalette_Weezing[]; extern const u8 gMonIcon_Weezing[]; extern const u8 gMonFootprint_Weezing[]; extern const u32 gMonFrontPic_Rhyhorn[]; extern const u32 gMonPalette_Rhyhorn[]; extern const u32 gMonBackPic_Rhyhorn[]; extern const u32 gMonShinyPalette_Rhyhorn[]; extern const u8 gMonIcon_Rhyhorn[]; extern const u8 gMonFootprint_Rhyhorn[]; extern const u32 gMonFrontPic_Rhydon[]; extern const u32 gMonPalette_Rhydon[]; extern const u32 gMonBackPic_Rhydon[]; extern const u32 gMonShinyPalette_Rhydon[]; extern const u8 gMonIcon_Rhydon[]; extern const u8 gMonFootprint_Rhydon[]; extern const u32 gMonFrontPic_Chansey[]; extern const u32 gMonPalette_Chansey[]; extern const u32 gMonBackPic_Chansey[]; extern const u32 gMonShinyPalette_Chansey[]; extern const u8 gMonIcon_Chansey[]; extern const u8 gMonFootprint_Chansey[]; extern const u32 gMonFrontPic_Tangela[]; extern const u32 gMonPalette_Tangela[]; extern const u32 gMonBackPic_Tangela[]; extern const u32 gMonShinyPalette_Tangela[]; extern const u8 gMonIcon_Tangela[]; extern const u8 gMonFootprint_Tangela[]; extern const u32 gMonFrontPic_Kangaskhan[]; extern const u32 gMonPalette_Kangaskhan[]; extern const u32 gMonBackPic_Kangaskhan[]; extern const u32 gMonShinyPalette_Kangaskhan[]; extern const u8 gMonIcon_Kangaskhan[]; extern const u8 gMonFootprint_Kangaskhan[]; extern const u32 gMonFrontPic_Horsea[]; extern const u32 gMonPalette_Horsea[]; extern const u32 gMonBackPic_Horsea[]; extern const u32 gMonShinyPalette_Horsea[]; extern const u8 gMonIcon_Horsea[]; extern const u8 gMonFootprint_Horsea[]; extern const u32 gMonFrontPic_Seadra[]; extern const u32 gMonPalette_Seadra[]; extern const u32 gMonBackPic_Seadra[]; extern const u32 gMonShinyPalette_Seadra[]; extern const u8 gMonIcon_Seadra[]; extern const u8 gMonFootprint_Seadra[]; extern const u32 gMonFrontPic_Goldeen[]; extern const u32 gMonPalette_Goldeen[]; extern const u32 gMonBackPic_Goldeen[]; extern const u32 gMonShinyPalette_Goldeen[]; extern const u8 gMonIcon_Goldeen[]; extern const u8 gMonFootprint_Goldeen[]; extern const u32 gMonFrontPic_Seaking[]; extern const u32 gMonPalette_Seaking[]; extern const u32 gMonBackPic_Seaking[]; extern const u32 gMonShinyPalette_Seaking[]; extern const u8 gMonIcon_Seaking[]; extern const u8 gMonFootprint_Seaking[]; extern const u32 gMonFrontPic_Staryu[]; extern const u32 gMonPalette_Staryu[]; extern const u32 gMonBackPic_Staryu[]; extern const u32 gMonShinyPalette_Staryu[]; extern const u8 gMonIcon_Staryu[]; extern const u8 gMonFootprint_Staryu[]; extern const u32 gMonFrontPic_Starmie[]; extern const u32 gMonPalette_Starmie[]; extern const u32 gMonBackPic_Starmie[]; extern const u32 gMonShinyPalette_Starmie[]; extern const u8 gMonIcon_Starmie[]; extern const u8 gMonFootprint_Starmie[]; extern const u32 gMonFrontPic_Mrmime[]; extern const u32 gMonPalette_Mrmime[]; extern const u32 gMonBackPic_Mrmime[]; extern const u32 gMonShinyPalette_Mrmime[]; extern const u8 gMonIcon_Mrmime[]; extern const u8 gMonFootprint_Mrmime[]; extern const u32 gMonFrontPic_Scyther[]; extern const u32 gMonPalette_Scyther[]; extern const u32 gMonBackPic_Scyther[]; extern const u32 gMonShinyPalette_Scyther[]; extern const u8 gMonIcon_Scyther[]; extern const u8 gMonFootprint_Scyther[]; extern const u32 gMonFrontPic_Jynx[]; extern const u32 gMonPalette_Jynx[]; extern const u32 gMonBackPic_Jynx[]; extern const u32 gMonShinyPalette_Jynx[]; extern const u8 gMonIcon_Jynx[]; extern const u8 gMonFootprint_Jynx[]; extern const u32 gMonFrontPic_Electabuzz[]; extern const u32 gMonPalette_Electabuzz[]; extern const u32 gMonBackPic_Electabuzz[]; extern const u32 gMonShinyPalette_Electabuzz[]; extern const u8 gMonIcon_Electabuzz[]; extern const u8 gMonFootprint_Electabuzz[]; extern const u32 gMonFrontPic_Magmar[]; extern const u32 gMonPalette_Magmar[]; extern const u32 gMonBackPic_Magmar[]; extern const u32 gMonShinyPalette_Magmar[]; extern const u8 gMonIcon_Magmar[]; extern const u8 gMonFootprint_Magmar[]; extern const u32 gMonFrontPic_Pinsir[]; extern const u32 gMonPalette_Pinsir[]; extern const u32 gMonBackPic_Pinsir[]; extern const u32 gMonShinyPalette_Pinsir[]; extern const u8 gMonIcon_Pinsir[]; extern const u8 gMonFootprint_Pinsir[]; extern const u32 gMonFrontPic_Tauros[]; extern const u32 gMonPalette_Tauros[]; extern const u32 gMonBackPic_Tauros[]; extern const u32 gMonShinyPalette_Tauros[]; extern const u8 gMonIcon_Tauros[]; extern const u8 gMonFootprint_Tauros[]; extern const u32 gMonFrontPic_Magikarp[]; extern const u32 gMonPalette_Magikarp[]; extern const u32 gMonBackPic_Magikarp[]; extern const u32 gMonShinyPalette_Magikarp[]; extern const u8 gMonIcon_Magikarp[]; extern const u8 gMonFootprint_Magikarp[]; extern const u32 gMonFrontPic_Gyarados[]; extern const u32 gMonPalette_Gyarados[]; extern const u32 gMonBackPic_Gyarados[]; extern const u32 gMonShinyPalette_Gyarados[]; extern const u8 gMonIcon_Gyarados[]; extern const u8 gMonFootprint_Gyarados[]; extern const u32 gMonFrontPic_Lapras[]; extern const u32 gMonPalette_Lapras[]; extern const u32 gMonBackPic_Lapras[]; extern const u32 gMonShinyPalette_Lapras[]; extern const u8 gMonIcon_Lapras[]; extern const u8 gMonFootprint_Lapras[]; extern const u32 gMonFrontPic_Ditto[]; extern const u32 gMonPalette_Ditto[]; extern const u32 gMonBackPic_Ditto[]; extern const u32 gMonShinyPalette_Ditto[]; extern const u8 gMonIcon_Ditto[]; extern const u8 gMonFootprint_Ditto[]; extern const u32 gMonFrontPic_Eevee[]; extern const u32 gMonPalette_Eevee[]; extern const u32 gMonBackPic_Eevee[]; extern const u32 gMonShinyPalette_Eevee[]; extern const u8 gMonIcon_Eevee[]; extern const u8 gMonFootprint_Eevee[]; extern const u32 gMonFrontPic_Vaporeon[]; extern const u32 gMonPalette_Vaporeon[]; extern const u32 gMonBackPic_Vaporeon[]; extern const u32 gMonShinyPalette_Vaporeon[]; extern const u8 gMonIcon_Vaporeon[]; extern const u8 gMonFootprint_Vaporeon[]; extern const u32 gMonFrontPic_Jolteon[]; extern const u32 gMonPalette_Jolteon[]; extern const u32 gMonBackPic_Jolteon[]; extern const u32 gMonShinyPalette_Jolteon[]; extern const u8 gMonIcon_Jolteon[]; extern const u8 gMonFootprint_Jolteon[]; extern const u32 gMonFrontPic_Flareon[]; extern const u32 gMonPalette_Flareon[]; extern const u32 gMonBackPic_Flareon[]; extern const u32 gMonShinyPalette_Flareon[]; extern const u8 gMonIcon_Flareon[]; extern const u8 gMonFootprint_Flareon[]; extern const u32 gMonFrontPic_Porygon[]; extern const u32 gMonPalette_Porygon[]; extern const u32 gMonBackPic_Porygon[]; extern const u32 gMonShinyPalette_Porygon[]; extern const u8 gMonIcon_Porygon[]; extern const u8 gMonFootprint_Porygon[]; extern const u32 gMonFrontPic_Omanyte[]; extern const u32 gMonPalette_Omanyte[]; extern const u32 gMonBackPic_Omanyte[]; extern const u32 gMonShinyPalette_Omanyte[]; extern const u8 gMonIcon_Omanyte[]; extern const u8 gMonFootprint_Omanyte[]; extern const u32 gMonFrontPic_Omastar[]; extern const u32 gMonPalette_Omastar[]; extern const u32 gMonBackPic_Omastar[]; extern const u32 gMonShinyPalette_Omastar[]; extern const u8 gMonIcon_Omastar[]; extern const u8 gMonFootprint_Omastar[]; extern const u32 gMonFrontPic_Kabuto[]; extern const u32 gMonPalette_Kabuto[]; extern const u32 gMonBackPic_Kabuto[]; extern const u32 gMonShinyPalette_Kabuto[]; extern const u8 gMonIcon_Kabuto[]; extern const u8 gMonFootprint_Kabuto[]; extern const u32 gMonFrontPic_Kabutops[]; extern const u32 gMonPalette_Kabutops[]; extern const u32 gMonBackPic_Kabutops[]; extern const u32 gMonShinyPalette_Kabutops[]; extern const u8 gMonIcon_Kabutops[]; extern const u8 gMonFootprint_Kabutops[]; extern const u32 gMonFrontPic_Aerodactyl[]; extern const u32 gMonPalette_Aerodactyl[]; extern const u32 gMonBackPic_Aerodactyl[]; extern const u32 gMonShinyPalette_Aerodactyl[]; extern const u8 gMonIcon_Aerodactyl[]; extern const u8 gMonFootprint_Aerodactyl[]; extern const u32 gMonFrontPic_Snorlax[]; extern const u32 gMonPalette_Snorlax[]; extern const u32 gMonBackPic_Snorlax[]; extern const u32 gMonShinyPalette_Snorlax[]; extern const u8 gMonIcon_Snorlax[]; extern const u8 gMonFootprint_Snorlax[]; extern const u32 gMonFrontPic_Articuno[]; extern const u32 gMonPalette_Articuno[]; extern const u32 gMonBackPic_Articuno[]; extern const u32 gMonShinyPalette_Articuno[]; extern const u8 gMonIcon_Articuno[]; extern const u8 gMonFootprint_Articuno[]; extern const u32 gMonFrontPic_Zapdos[]; extern const u32 gMonPalette_Zapdos[]; extern const u32 gMonBackPic_Zapdos[]; extern const u32 gMonShinyPalette_Zapdos[]; extern const u8 gMonIcon_Zapdos[]; extern const u8 gMonFootprint_Zapdos[]; extern const u32 gMonFrontPic_Moltres[]; extern const u32 gMonPalette_Moltres[]; extern const u32 gMonBackPic_Moltres[]; extern const u32 gMonShinyPalette_Moltres[]; extern const u8 gMonIcon_Moltres[]; extern const u8 gMonFootprint_Moltres[]; extern const u32 gMonFrontPic_Dratini[]; extern const u32 gMonPalette_Dratini[]; extern const u32 gMonBackPic_Dratini[]; extern const u32 gMonShinyPalette_Dratini[]; extern const u8 gMonIcon_Dratini[]; extern const u8 gMonFootprint_Dratini[]; extern const u32 gMonFrontPic_Dragonair[]; extern const u32 gMonPalette_Dragonair[]; extern const u32 gMonBackPic_Dragonair[]; extern const u32 gMonShinyPalette_Dragonair[]; extern const u8 gMonIcon_Dragonair[]; extern const u8 gMonFootprint_Dragonair[]; extern const u32 gMonFrontPic_Dragonite[]; extern const u32 gMonPalette_Dragonite[]; extern const u32 gMonBackPic_Dragonite[]; extern const u32 gMonShinyPalette_Dragonite[]; extern const u8 gMonIcon_Dragonite[]; extern const u8 gMonFootprint_Dragonite[]; extern const u32 gMonFrontPic_Mewtwo[]; extern const u32 gMonPalette_Mewtwo[]; extern const u32 gMonBackPic_Mewtwo[]; extern const u32 gMonShinyPalette_Mewtwo[]; extern const u8 gMonIcon_Mewtwo[]; extern const u8 gMonFootprint_Mewtwo[]; extern const u32 gMonFrontPic_Mew[]; extern const u32 gMonPalette_Mew[]; extern const u32 gMonBackPic_Mew[]; extern const u32 gMonShinyPalette_Mew[]; extern const u8 gMonIcon_Mew[]; extern const u8 gMonFootprint_Mew[]; extern const u32 gMonFrontPic_Chikorita[]; extern const u32 gMonPalette_Chikorita[]; extern const u32 gMonBackPic_Chikorita[]; extern const u32 gMonShinyPalette_Chikorita[]; extern const u8 gMonIcon_Chikorita[]; extern const u8 gMonFootprint_Chikorita[]; extern const u32 gMonFrontPic_Bayleef[]; extern const u32 gMonPalette_Bayleef[]; extern const u32 gMonBackPic_Bayleef[]; extern const u32 gMonShinyPalette_Bayleef[]; extern const u8 gMonIcon_Bayleef[]; extern const u8 gMonFootprint_Bayleef[]; extern const u32 gMonFrontPic_Meganium[]; extern const u32 gMonPalette_Meganium[]; extern const u32 gMonBackPic_Meganium[]; extern const u32 gMonShinyPalette_Meganium[]; extern const u8 gMonIcon_Meganium[]; extern const u8 gMonFootprint_Meganium[]; extern const u32 gMonFrontPic_Cyndaquil[]; extern const u32 gMonPalette_Cyndaquil[]; extern const u32 gMonBackPic_Cyndaquil[]; extern const u32 gMonShinyPalette_Cyndaquil[]; extern const u8 gMonIcon_Cyndaquil[]; extern const u8 gMonFootprint_Cyndaquil[]; extern const u32 gMonFrontPic_Quilava[]; extern const u32 gMonPalette_Quilava[]; extern const u32 gMonBackPic_Quilava[]; extern const u32 gMonShinyPalette_Quilava[]; extern const u8 gMonIcon_Quilava[]; extern const u8 gMonFootprint_Quilava[]; extern const u32 gMonFrontPic_Typhlosion[]; extern const u32 gMonPalette_Typhlosion[]; extern const u32 gMonBackPic_Typhlosion[]; extern const u32 gMonShinyPalette_Typhlosion[]; extern const u8 gMonIcon_Typhlosion[]; extern const u8 gMonFootprint_Typhlosion[]; extern const u32 gMonFrontPic_Totodile[]; extern const u32 gMonPalette_Totodile[]; extern const u32 gMonBackPic_Totodile[]; extern const u32 gMonShinyPalette_Totodile[]; extern const u8 gMonIcon_Totodile[]; extern const u8 gMonFootprint_Totodile[]; extern const u32 gMonFrontPic_Croconaw[]; extern const u32 gMonPalette_Croconaw[]; extern const u32 gMonBackPic_Croconaw[]; extern const u32 gMonShinyPalette_Croconaw[]; extern const u8 gMonIcon_Croconaw[]; extern const u8 gMonFootprint_Croconaw[]; extern const u32 gMonFrontPic_Feraligatr[]; extern const u32 gMonPalette_Feraligatr[]; extern const u32 gMonBackPic_Feraligatr[]; extern const u32 gMonShinyPalette_Feraligatr[]; extern const u8 gMonIcon_Feraligatr[]; extern const u8 gMonFootprint_Feraligatr[]; extern const u32 gMonFrontPic_Sentret[]; extern const u32 gMonPalette_Sentret[]; extern const u32 gMonBackPic_Sentret[]; extern const u32 gMonShinyPalette_Sentret[]; extern const u8 gMonIcon_Sentret[]; extern const u8 gMonFootprint_Sentret[]; extern const u32 gMonFrontPic_Furret[]; extern const u32 gMonPalette_Furret[]; extern const u32 gMonBackPic_Furret[]; extern const u32 gMonShinyPalette_Furret[]; extern const u8 gMonIcon_Furret[]; extern const u8 gMonFootprint_Furret[]; extern const u32 gMonFrontPic_Hoothoot[]; extern const u32 gMonPalette_Hoothoot[]; extern const u32 gMonBackPic_Hoothoot[]; extern const u32 gMonShinyPalette_Hoothoot[]; extern const u8 gMonIcon_Hoothoot[]; extern const u8 gMonFootprint_Hoothoot[]; extern const u32 gMonFrontPic_Noctowl[]; extern const u32 gMonPalette_Noctowl[]; extern const u32 gMonBackPic_Noctowl[]; extern const u32 gMonShinyPalette_Noctowl[]; extern const u8 gMonIcon_Noctowl[]; extern const u8 gMonFootprint_Noctowl[]; extern const u32 gMonFrontPic_Ledyba[]; extern const u32 gMonPalette_Ledyba[]; extern const u32 gMonBackPic_Ledyba[]; extern const u32 gMonShinyPalette_Ledyba[]; extern const u8 gMonIcon_Ledyba[]; extern const u8 gMonFootprint_Ledyba[]; extern const u32 gMonFrontPic_Ledian[]; extern const u32 gMonPalette_Ledian[]; extern const u32 gMonBackPic_Ledian[]; extern const u32 gMonShinyPalette_Ledian[]; extern const u8 gMonIcon_Ledian[]; extern const u8 gMonFootprint_Ledian[]; extern const u32 gMonFrontPic_Spinarak[]; extern const u32 gMonPalette_Spinarak[]; extern const u32 gMonBackPic_Spinarak[]; extern const u32 gMonShinyPalette_Spinarak[]; extern const u8 gMonIcon_Spinarak[]; extern const u8 gMonFootprint_Spinarak[]; extern const u32 gMonFrontPic_Ariados[]; extern const u32 gMonPalette_Ariados[]; extern const u32 gMonBackPic_Ariados[]; extern const u32 gMonShinyPalette_Ariados[]; extern const u8 gMonIcon_Ariados[]; extern const u8 gMonFootprint_Ariados[]; extern const u32 gMonFrontPic_Crobat[]; extern const u32 gMonPalette_Crobat[]; extern const u32 gMonBackPic_Crobat[]; extern const u32 gMonShinyPalette_Crobat[]; extern const u8 gMonIcon_Crobat[]; extern const u8 gMonFootprint_Crobat[]; extern const u32 gMonFrontPic_Chinchou[]; extern const u32 gMonPalette_Chinchou[]; extern const u32 gMonBackPic_Chinchou[]; extern const u32 gMonShinyPalette_Chinchou[]; extern const u8 gMonIcon_Chinchou[]; extern const u8 gMonFootprint_Chinchou[]; extern const u32 gMonFrontPic_Lanturn[]; extern const u32 gMonPalette_Lanturn[]; extern const u32 gMonBackPic_Lanturn[]; extern const u32 gMonShinyPalette_Lanturn[]; extern const u8 gMonIcon_Lanturn[]; extern const u8 gMonFootprint_Lanturn[]; extern const u32 gMonFrontPic_Pichu[]; extern const u32 gMonPalette_Pichu[]; extern const u32 gMonBackPic_Pichu[]; extern const u32 gMonShinyPalette_Pichu[]; extern const u8 gMonIcon_Pichu[]; extern const u8 gMonFootprint_Pichu[]; extern const u32 gMonFrontPic_Cleffa[]; extern const u32 gMonPalette_Cleffa[]; extern const u32 gMonBackPic_Cleffa[]; extern const u32 gMonShinyPalette_Cleffa[]; extern const u8 gMonIcon_Cleffa[]; extern const u8 gMonFootprint_Cleffa[]; extern const u32 gMonFrontPic_Igglybuff[]; extern const u32 gMonPalette_Igglybuff[]; extern const u32 gMonBackPic_Igglybuff[]; extern const u32 gMonShinyPalette_Igglybuff[]; extern const u8 gMonIcon_Igglybuff[]; extern const u8 gMonFootprint_Igglybuff[]; extern const u32 gMonFrontPic_Togepi[]; extern const u32 gMonPalette_Togepi[]; extern const u32 gMonBackPic_Togepi[]; extern const u32 gMonShinyPalette_Togepi[]; extern const u8 gMonIcon_Togepi[]; extern const u8 gMonFootprint_Togepi[]; extern const u32 gMonFrontPic_Togetic[]; extern const u32 gMonPalette_Togetic[]; extern const u32 gMonBackPic_Togetic[]; extern const u32 gMonShinyPalette_Togetic[]; extern const u8 gMonIcon_Togetic[]; extern const u8 gMonFootprint_Togetic[]; extern const u32 gMonFrontPic_Natu[]; extern const u32 gMonPalette_Natu[]; extern const u32 gMonBackPic_Natu[]; extern const u32 gMonShinyPalette_Natu[]; extern const u8 gMonIcon_Natu[]; extern const u8 gMonFootprint_Natu[]; extern const u32 gMonFrontPic_Xatu[]; extern const u32 gMonPalette_Xatu[]; extern const u32 gMonBackPic_Xatu[]; extern const u32 gMonShinyPalette_Xatu[]; extern const u8 gMonIcon_Xatu[]; extern const u8 gMonFootprint_Xatu[]; extern const u32 gMonFrontPic_Mareep[]; extern const u32 gMonPalette_Mareep[]; extern const u32 gMonBackPic_Mareep[]; extern const u32 gMonShinyPalette_Mareep[]; extern const u8 gMonIcon_Mareep[]; extern const u8 gMonFootprint_Mareep[]; extern const u32 gMonFrontPic_Flaaffy[]; extern const u32 gMonPalette_Flaaffy[]; extern const u32 gMonBackPic_Flaaffy[]; extern const u32 gMonShinyPalette_Flaaffy[]; extern const u8 gMonIcon_Flaaffy[]; extern const u8 gMonFootprint_Flaaffy[]; extern const u32 gMonFrontPic_Ampharos[]; extern const u32 gMonPalette_Ampharos[]; extern const u32 gMonBackPic_Ampharos[]; extern const u32 gMonShinyPalette_Ampharos[]; extern const u8 gMonIcon_Ampharos[]; extern const u8 gMonFootprint_Ampharos[]; extern const u32 gMonFrontPic_Bellossom[]; extern const u32 gMonPalette_Bellossom[]; extern const u32 gMonBackPic_Bellossom[]; extern const u32 gMonShinyPalette_Bellossom[]; extern const u8 gMonIcon_Bellossom[]; extern const u8 gMonFootprint_Bellossom[]; extern const u32 gMonFrontPic_Marill[]; extern const u32 gMonPalette_Marill[]; extern const u32 gMonBackPic_Marill[]; extern const u32 gMonShinyPalette_Marill[]; extern const u8 gMonIcon_Marill[]; extern const u8 gMonFootprint_Marill[]; extern const u32 gMonFrontPic_Azumarill[]; extern const u32 gMonPalette_Azumarill[]; extern const u32 gMonBackPic_Azumarill[]; extern const u32 gMonShinyPalette_Azumarill[]; extern const u8 gMonIcon_Azumarill[]; extern const u8 gMonFootprint_Azumarill[]; extern const u32 gMonFrontPic_Sudowoodo[]; extern const u32 gMonPalette_Sudowoodo[]; extern const u32 gMonBackPic_Sudowoodo[]; extern const u32 gMonShinyPalette_Sudowoodo[]; extern const u8 gMonIcon_Sudowoodo[]; extern const u8 gMonFootprint_Sudowoodo[]; extern const u32 gMonFrontPic_Politoed[]; extern const u32 gMonPalette_Politoed[]; extern const u32 gMonBackPic_Politoed[]; extern const u32 gMonShinyPalette_Politoed[]; extern const u8 gMonIcon_Politoed[]; extern const u8 gMonFootprint_Politoed[]; extern const u32 gMonFrontPic_Hoppip[]; extern const u32 gMonPalette_Hoppip[]; extern const u32 gMonBackPic_Hoppip[]; extern const u32 gMonShinyPalette_Hoppip[]; extern const u8 gMonIcon_Hoppip[]; extern const u8 gMonFootprint_Hoppip[]; extern const u32 gMonFrontPic_Skiploom[]; extern const u32 gMonPalette_Skiploom[]; extern const u32 gMonBackPic_Skiploom[]; extern const u32 gMonShinyPalette_Skiploom[]; extern const u8 gMonIcon_Skiploom[]; extern const u8 gMonFootprint_Skiploom[]; extern const u32 gMonFrontPic_Jumpluff[]; extern const u32 gMonPalette_Jumpluff[]; extern const u32 gMonBackPic_Jumpluff[]; extern const u32 gMonShinyPalette_Jumpluff[]; extern const u8 gMonIcon_Jumpluff[]; extern const u8 gMonFootprint_Jumpluff[]; extern const u32 gMonFrontPic_Aipom[]; extern const u32 gMonPalette_Aipom[]; extern const u32 gMonBackPic_Aipom[]; extern const u32 gMonShinyPalette_Aipom[]; extern const u8 gMonIcon_Aipom[]; extern const u8 gMonFootprint_Aipom[]; extern const u32 gMonFrontPic_Sunkern[]; extern const u32 gMonPalette_Sunkern[]; extern const u32 gMonBackPic_Sunkern[]; extern const u32 gMonShinyPalette_Sunkern[]; extern const u8 gMonIcon_Sunkern[]; extern const u8 gMonFootprint_Sunkern[]; extern const u32 gMonFrontPic_Sunflora[]; extern const u32 gMonPalette_Sunflora[]; extern const u32 gMonBackPic_Sunflora[]; extern const u32 gMonShinyPalette_Sunflora[]; extern const u8 gMonIcon_Sunflora[]; extern const u8 gMonFootprint_Sunflora[]; extern const u32 gMonFrontPic_Yanma[]; extern const u32 gMonPalette_Yanma[]; extern const u32 gMonBackPic_Yanma[]; extern const u32 gMonShinyPalette_Yanma[]; extern const u8 gMonIcon_Yanma[]; extern const u8 gMonFootprint_Yanma[]; extern const u32 gMonFrontPic_Wooper[]; extern const u32 gMonPalette_Wooper[]; extern const u32 gMonBackPic_Wooper[]; extern const u32 gMonShinyPalette_Wooper[]; extern const u8 gMonIcon_Wooper[]; extern const u8 gMonFootprint_Wooper[]; extern const u32 gMonFrontPic_Quagsire[]; extern const u32 gMonPalette_Quagsire[]; extern const u32 gMonBackPic_Quagsire[]; extern const u32 gMonShinyPalette_Quagsire[]; extern const u8 gMonIcon_Quagsire[]; extern const u8 gMonFootprint_Quagsire[]; extern const u32 gMonFrontPic_Espeon[]; extern const u32 gMonPalette_Espeon[]; extern const u32 gMonBackPic_Espeon[]; extern const u32 gMonShinyPalette_Espeon[]; extern const u8 gMonIcon_Espeon[]; extern const u8 gMonFootprint_Espeon[]; extern const u32 gMonFrontPic_Umbreon[]; extern const u32 gMonPalette_Umbreon[]; extern const u32 gMonBackPic_Umbreon[]; extern const u32 gMonShinyPalette_Umbreon[]; extern const u8 gMonIcon_Umbreon[]; extern const u8 gMonFootprint_Umbreon[]; extern const u32 gMonFrontPic_Murkrow[]; extern const u32 gMonPalette_Murkrow[]; extern const u32 gMonBackPic_Murkrow[]; extern const u32 gMonShinyPalette_Murkrow[]; extern const u8 gMonIcon_Murkrow[]; extern const u8 gMonFootprint_Murkrow[]; extern const u32 gMonFrontPic_Slowking[]; extern const u32 gMonPalette_Slowking[]; extern const u32 gMonBackPic_Slowking[]; extern const u32 gMonShinyPalette_Slowking[]; extern const u8 gMonIcon_Slowking[]; extern const u8 gMonFootprint_Slowking[]; extern const u32 gMonFrontPic_Misdreavus[]; extern const u32 gMonPalette_Misdreavus[]; extern const u32 gMonBackPic_Misdreavus[]; extern const u32 gMonShinyPalette_Misdreavus[]; extern const u8 gMonIcon_Misdreavus[]; extern const u8 gMonFootprint_Misdreavus[]; extern const u32 gMonFrontPic_UnownA[]; extern const u32 gMonPalette_Unown[]; extern const u32 gMonBackPic_UnownA[]; extern const u32 gMonShinyPalette_Unown[]; extern const u8 gMonIcon_UnownA[]; extern const u8 gMonFootprint_Unown[]; extern const u32 gMonFrontPic_Wobbuffet[]; extern const u32 gMonPalette_Wobbuffet[]; extern const u32 gMonBackPic_Wobbuffet[]; extern const u32 gMonShinyPalette_Wobbuffet[]; extern const u8 gMonIcon_Wobbuffet[]; extern const u8 gMonFootprint_Wobbuffet[]; extern const u32 gMonFrontPic_Girafarig[]; extern const u32 gMonPalette_Girafarig[]; extern const u32 gMonBackPic_Girafarig[]; extern const u32 gMonShinyPalette_Girafarig[]; extern const u8 gMonIcon_Girafarig[]; extern const u8 gMonFootprint_Girafarig[]; extern const u32 gMonFrontPic_Pineco[]; extern const u32 gMonPalette_Pineco[]; extern const u32 gMonBackPic_Pineco[]; extern const u32 gMonShinyPalette_Pineco[]; extern const u8 gMonIcon_Pineco[]; extern const u8 gMonFootprint_Pineco[]; extern const u32 gMonFrontPic_Forretress[]; extern const u32 gMonPalette_Forretress[]; extern const u32 gMonBackPic_Forretress[]; extern const u32 gMonShinyPalette_Forretress[]; extern const u8 gMonIcon_Forretress[]; extern const u8 gMonFootprint_Forretress[]; extern const u32 gMonFrontPic_Dunsparce[]; extern const u32 gMonPalette_Dunsparce[]; extern const u32 gMonBackPic_Dunsparce[]; extern const u32 gMonShinyPalette_Dunsparce[]; extern const u8 gMonIcon_Dunsparce[]; extern const u8 gMonFootprint_Dunsparce[]; extern const u32 gMonFrontPic_Gligar[]; extern const u32 gMonPalette_Gligar[]; extern const u32 gMonBackPic_Gligar[]; extern const u32 gMonShinyPalette_Gligar[]; extern const u8 gMonIcon_Gligar[]; extern const u8 gMonFootprint_Gligar[]; extern const u32 gMonFrontPic_Steelix[]; extern const u32 gMonPalette_Steelix[]; extern const u32 gMonBackPic_Steelix[]; extern const u32 gMonShinyPalette_Steelix[]; extern const u8 gMonIcon_Steelix[]; extern const u8 gMonFootprint_Steelix[]; extern const u32 gMonFrontPic_Snubbull[]; extern const u32 gMonPalette_Snubbull[]; extern const u32 gMonBackPic_Snubbull[]; extern const u32 gMonShinyPalette_Snubbull[]; extern const u8 gMonIcon_Snubbull[]; extern const u8 gMonFootprint_Snubbull[]; extern const u32 gMonFrontPic_Granbull[]; extern const u32 gMonPalette_Granbull[]; extern const u32 gMonBackPic_Granbull[]; extern const u32 gMonShinyPalette_Granbull[]; extern const u8 gMonIcon_Granbull[]; extern const u8 gMonFootprint_Granbull[]; extern const u32 gMonFrontPic_Qwilfish[]; extern const u32 gMonPalette_Qwilfish[]; extern const u32 gMonBackPic_Qwilfish[]; extern const u32 gMonShinyPalette_Qwilfish[]; extern const u8 gMonIcon_Qwilfish[]; extern const u8 gMonFootprint_Qwilfish[]; extern const u32 gMonFrontPic_Scizor[]; extern const u32 gMonPalette_Scizor[]; extern const u32 gMonBackPic_Scizor[]; extern const u32 gMonShinyPalette_Scizor[]; extern const u8 gMonIcon_Scizor[]; extern const u8 gMonFootprint_Scizor[]; extern const u32 gMonFrontPic_Shuckle[]; extern const u32 gMonPalette_Shuckle[]; extern const u32 gMonBackPic_Shuckle[]; extern const u32 gMonShinyPalette_Shuckle[]; extern const u8 gMonIcon_Shuckle[]; extern const u8 gMonFootprint_Shuckle[]; extern const u32 gMonFrontPic_Heracross[]; extern const u32 gMonPalette_Heracross[]; extern const u32 gMonBackPic_Heracross[]; extern const u32 gMonShinyPalette_Heracross[]; extern const u8 gMonIcon_Heracross[]; extern const u8 gMonFootprint_Heracross[]; extern const u32 gMonFrontPic_Sneasel[]; extern const u32 gMonPalette_Sneasel[]; extern const u32 gMonBackPic_Sneasel[]; extern const u32 gMonShinyPalette_Sneasel[]; extern const u8 gMonIcon_Sneasel[]; extern const u8 gMonFootprint_Sneasel[]; extern const u32 gMonFrontPic_Teddiursa[]; extern const u32 gMonPalette_Teddiursa[]; extern const u32 gMonBackPic_Teddiursa[]; extern const u32 gMonShinyPalette_Teddiursa[]; extern const u8 gMonIcon_Teddiursa[]; extern const u8 gMonFootprint_Teddiursa[]; extern const u32 gMonFrontPic_Ursaring[]; extern const u32 gMonPalette_Ursaring[]; extern const u32 gMonBackPic_Ursaring[]; extern const u32 gMonShinyPalette_Ursaring[]; extern const u8 gMonIcon_Ursaring[]; extern const u8 gMonFootprint_Ursaring[]; extern const u32 gMonFrontPic_Slugma[]; extern const u32 gMonPalette_Slugma[]; extern const u32 gMonBackPic_Slugma[]; extern const u32 gMonShinyPalette_Slugma[]; extern const u8 gMonIcon_Slugma[]; extern const u8 gMonFootprint_Slugma[]; extern const u32 gMonFrontPic_Magcargo[]; extern const u32 gMonPalette_Magcargo[]; extern const u32 gMonBackPic_Magcargo[]; extern const u32 gMonShinyPalette_Magcargo[]; extern const u8 gMonIcon_Magcargo[]; extern const u8 gMonFootprint_Magcargo[]; extern const u32 gMonFrontPic_Swinub[]; extern const u32 gMonPalette_Swinub[]; extern const u32 gMonBackPic_Swinub[]; extern const u32 gMonShinyPalette_Swinub[]; extern const u8 gMonIcon_Swinub[]; extern const u8 gMonFootprint_Swinub[]; extern const u32 gMonFrontPic_Piloswine[]; extern const u32 gMonPalette_Piloswine[]; extern const u32 gMonBackPic_Piloswine[]; extern const u32 gMonShinyPalette_Piloswine[]; extern const u8 gMonIcon_Piloswine[]; extern const u8 gMonFootprint_Piloswine[]; extern const u32 gMonFrontPic_Corsola[]; extern const u32 gMonPalette_Corsola[]; extern const u32 gMonBackPic_Corsola[]; extern const u32 gMonShinyPalette_Corsola[]; extern const u8 gMonIcon_Corsola[]; extern const u8 gMonFootprint_Corsola[]; extern const u32 gMonFrontPic_Remoraid[]; extern const u32 gMonPalette_Remoraid[]; extern const u32 gMonBackPic_Remoraid[]; extern const u32 gMonShinyPalette_Remoraid[]; extern const u8 gMonIcon_Remoraid[]; extern const u8 gMonFootprint_Remoraid[]; extern const u32 gMonFrontPic_Octillery[]; extern const u32 gMonPalette_Octillery[]; extern const u32 gMonBackPic_Octillery[]; extern const u32 gMonShinyPalette_Octillery[]; extern const u8 gMonIcon_Octillery[]; extern const u8 gMonFootprint_Octillery[]; extern const u32 gMonFrontPic_Delibird[]; extern const u32 gMonPalette_Delibird[]; extern const u32 gMonBackPic_Delibird[]; extern const u32 gMonShinyPalette_Delibird[]; extern const u8 gMonIcon_Delibird[]; extern const u8 gMonFootprint_Delibird[]; extern const u32 gMonFrontPic_Mantine[]; extern const u32 gMonPalette_Mantine[]; extern const u32 gMonBackPic_Mantine[]; extern const u32 gMonShinyPalette_Mantine[]; extern const u8 gMonIcon_Mantine[]; extern const u8 gMonFootprint_Mantine[]; extern const u32 gMonFrontPic_Skarmory[]; extern const u32 gMonPalette_Skarmory[]; extern const u32 gMonBackPic_Skarmory[]; extern const u32 gMonShinyPalette_Skarmory[]; extern const u8 gMonIcon_Skarmory[]; extern const u8 gMonFootprint_Skarmory[]; extern const u32 gMonFrontPic_Houndour[]; extern const u32 gMonPalette_Houndour[]; extern const u32 gMonBackPic_Houndour[]; extern const u32 gMonShinyPalette_Houndour[]; extern const u8 gMonIcon_Houndour[]; extern const u8 gMonFootprint_Houndour[]; extern const u32 gMonFrontPic_Houndoom[]; extern const u32 gMonPalette_Houndoom[]; extern const u32 gMonBackPic_Houndoom[]; extern const u32 gMonShinyPalette_Houndoom[]; extern const u8 gMonIcon_Houndoom[]; extern const u8 gMonFootprint_Houndoom[]; extern const u32 gMonFrontPic_Kingdra[]; extern const u32 gMonPalette_Kingdra[]; extern const u32 gMonBackPic_Kingdra[]; extern const u32 gMonShinyPalette_Kingdra[]; extern const u8 gMonIcon_Kingdra[]; extern const u8 gMonFootprint_Kingdra[]; extern const u32 gMonFrontPic_Phanpy[]; extern const u32 gMonPalette_Phanpy[]; extern const u32 gMonBackPic_Phanpy[]; extern const u32 gMonShinyPalette_Phanpy[]; extern const u8 gMonIcon_Phanpy[]; extern const u8 gMonFootprint_Phanpy[]; extern const u32 gMonFrontPic_Donphan[]; extern const u32 gMonPalette_Donphan[]; extern const u32 gMonBackPic_Donphan[]; extern const u32 gMonShinyPalette_Donphan[]; extern const u8 gMonIcon_Donphan[]; extern const u8 gMonFootprint_Donphan[]; extern const u32 gMonFrontPic_Porygon2[]; extern const u32 gMonPalette_Porygon2[]; extern const u32 gMonBackPic_Porygon2[]; extern const u32 gMonShinyPalette_Porygon2[]; extern const u8 gMonIcon_Porygon2[]; extern const u8 gMonFootprint_Porygon2[]; extern const u32 gMonFrontPic_Stantler[]; extern const u32 gMonPalette_Stantler[]; extern const u32 gMonBackPic_Stantler[]; extern const u32 gMonShinyPalette_Stantler[]; extern const u8 gMonIcon_Stantler[]; extern const u8 gMonFootprint_Stantler[]; extern const u32 gMonFrontPic_Smeargle[]; extern const u32 gMonPalette_Smeargle[]; extern const u32 gMonBackPic_Smeargle[]; extern const u32 gMonShinyPalette_Smeargle[]; extern const u8 gMonIcon_Smeargle[]; extern const u8 gMonFootprint_Smeargle[]; extern const u32 gMonFrontPic_Tyrogue[]; extern const u32 gMonPalette_Tyrogue[]; extern const u32 gMonBackPic_Tyrogue[]; extern const u32 gMonShinyPalette_Tyrogue[]; extern const u8 gMonIcon_Tyrogue[]; extern const u8 gMonFootprint_Tyrogue[]; extern const u32 gMonFrontPic_Hitmontop[]; extern const u32 gMonPalette_Hitmontop[]; extern const u32 gMonBackPic_Hitmontop[]; extern const u32 gMonShinyPalette_Hitmontop[]; extern const u8 gMonIcon_Hitmontop[]; extern const u8 gMonFootprint_Hitmontop[]; extern const u32 gMonFrontPic_Smoochum[]; extern const u32 gMonPalette_Smoochum[]; extern const u32 gMonBackPic_Smoochum[]; extern const u32 gMonShinyPalette_Smoochum[]; extern const u8 gMonIcon_Smoochum[]; extern const u8 gMonFootprint_Smoochum[]; extern const u32 gMonFrontPic_Elekid[]; extern const u32 gMonPalette_Elekid[]; extern const u32 gMonBackPic_Elekid[]; extern const u32 gMonShinyPalette_Elekid[]; extern const u8 gMonIcon_Elekid[]; extern const u8 gMonFootprint_Elekid[]; extern const u32 gMonFrontPic_Magby[]; extern const u32 gMonPalette_Magby[]; extern const u32 gMonBackPic_Magby[]; extern const u32 gMonShinyPalette_Magby[]; extern const u8 gMonIcon_Magby[]; extern const u8 gMonFootprint_Magby[]; extern const u32 gMonFrontPic_Miltank[]; extern const u32 gMonPalette_Miltank[]; extern const u32 gMonBackPic_Miltank[]; extern const u32 gMonShinyPalette_Miltank[]; extern const u8 gMonIcon_Miltank[]; extern const u8 gMonFootprint_Miltank[]; extern const u32 gMonFrontPic_Blissey[]; extern const u32 gMonPalette_Blissey[]; extern const u32 gMonBackPic_Blissey[]; extern const u32 gMonShinyPalette_Blissey[]; extern const u8 gMonIcon_Blissey[]; extern const u8 gMonFootprint_Blissey[]; extern const u32 gMonFrontPic_Raikou[]; extern const u32 gMonPalette_Raikou[]; extern const u32 gMonBackPic_Raikou[]; extern const u32 gMonShinyPalette_Raikou[]; extern const u8 gMonIcon_Raikou[]; extern const u8 gMonFootprint_Raikou[]; extern const u32 gMonFrontPic_Entei[]; extern const u32 gMonPalette_Entei[]; extern const u32 gMonBackPic_Entei[]; extern const u32 gMonShinyPalette_Entei[]; extern const u8 gMonIcon_Entei[]; extern const u8 gMonFootprint_Entei[]; extern const u32 gMonFrontPic_Suicune[]; extern const u32 gMonPalette_Suicune[]; extern const u32 gMonBackPic_Suicune[]; extern const u32 gMonShinyPalette_Suicune[]; extern const u8 gMonIcon_Suicune[]; extern const u8 gMonFootprint_Suicune[]; extern const u32 gMonFrontPic_Larvitar[]; extern const u32 gMonPalette_Larvitar[]; extern const u32 gMonBackPic_Larvitar[]; extern const u32 gMonShinyPalette_Larvitar[]; extern const u8 gMonIcon_Larvitar[]; extern const u8 gMonFootprint_Larvitar[]; extern const u32 gMonFrontPic_Pupitar[]; extern const u32 gMonPalette_Pupitar[]; extern const u32 gMonBackPic_Pupitar[]; extern const u32 gMonShinyPalette_Pupitar[]; extern const u8 gMonIcon_Pupitar[]; extern const u8 gMonFootprint_Pupitar[]; extern const u32 gMonFrontPic_Tyranitar[]; extern const u32 gMonPalette_Tyranitar[]; extern const u32 gMonBackPic_Tyranitar[]; extern const u32 gMonShinyPalette_Tyranitar[]; extern const u8 gMonIcon_Tyranitar[]; extern const u8 gMonFootprint_Tyranitar[]; extern const u32 gMonFrontPic_Lugia[]; extern const u32 gMonPalette_Lugia[]; extern const u32 gMonBackPic_Lugia[]; extern const u32 gMonShinyPalette_Lugia[]; extern const u8 gMonIcon_Lugia[]; extern const u8 gMonFootprint_Lugia[]; extern const u32 gMonFrontPic_HoOh[]; extern const u32 gMonPalette_HoOh[]; extern const u32 gMonBackPic_HoOh[]; extern const u32 gMonShinyPalette_HoOh[]; extern const u8 gMonIcon_HoOh[]; extern const u8 gMonFootprint_HoOh[]; extern const u32 gMonFrontPic_Celebi[]; extern const u32 gMonPalette_Celebi[]; extern const u32 gMonBackPic_Celebi[]; extern const u32 gMonShinyPalette_Celebi[]; extern const u8 gMonIcon_Celebi[]; extern const u8 gMonFootprint_Celebi[]; extern const u32 gMonFrontPic_Treecko[]; extern const u32 gMonPalette_Treecko[]; extern const u32 gMonBackPic_Treecko[]; extern const u32 gMonShinyPalette_Treecko[]; extern const u8 gMonIcon_Treecko[]; extern const u8 gMonFootprint_Treecko[]; extern const u32 gMonFrontPic_Grovyle[]; extern const u32 gMonPalette_Grovyle[]; extern const u32 gMonBackPic_Grovyle[]; extern const u32 gMonShinyPalette_Grovyle[]; extern const u8 gMonIcon_Grovyle[]; extern const u8 gMonFootprint_Grovyle[]; extern const u32 gMonFrontPic_Sceptile[]; extern const u32 gMonPalette_Sceptile[]; extern const u32 gMonBackPic_Sceptile[]; extern const u32 gMonShinyPalette_Sceptile[]; extern const u8 gMonIcon_Sceptile[]; extern const u8 gMonFootprint_Sceptile[]; extern const u32 gMonFrontPic_Torchic[]; extern const u32 gMonPalette_Torchic[]; extern const u32 gMonBackPic_Torchic[]; extern const u32 gMonShinyPalette_Torchic[]; extern const u8 gMonIcon_Torchic[]; extern const u8 gMonFootprint_Torchic[]; extern const u32 gMonFrontPic_Combusken[]; extern const u32 gMonPalette_Combusken[]; extern const u32 gMonBackPic_Combusken[]; extern const u32 gMonShinyPalette_Combusken[]; extern const u8 gMonIcon_Combusken[]; extern const u8 gMonFootprint_Combusken[]; extern const u32 gMonFrontPic_Blaziken[]; extern const u32 gMonPalette_Blaziken[]; extern const u32 gMonBackPic_Blaziken[]; extern const u32 gMonShinyPalette_Blaziken[]; extern const u8 gMonIcon_Blaziken[]; extern const u8 gMonFootprint_Blaziken[]; extern const u32 gMonFrontPic_Mudkip[]; extern const u32 gMonPalette_Mudkip[]; extern const u32 gMonBackPic_Mudkip[]; extern const u32 gMonShinyPalette_Mudkip[]; extern const u8 gMonIcon_Mudkip[]; extern const u8 gMonFootprint_Mudkip[]; extern const u32 gMonFrontPic_Marshtomp[]; extern const u32 gMonPalette_Marshtomp[]; extern const u32 gMonBackPic_Marshtomp[]; extern const u32 gMonShinyPalette_Marshtomp[]; extern const u8 gMonIcon_Marshtomp[]; extern const u8 gMonFootprint_Marshtomp[]; extern const u32 gMonFrontPic_Swampert[]; extern const u32 gMonPalette_Swampert[]; extern const u32 gMonBackPic_Swampert[]; extern const u32 gMonShinyPalette_Swampert[]; extern const u8 gMonIcon_Swampert[]; extern const u8 gMonFootprint_Swampert[]; extern const u32 gMonFrontPic_Poochyena[]; extern const u32 gMonPalette_Poochyena[]; extern const u32 gMonBackPic_Poochyena[]; extern const u32 gMonShinyPalette_Poochyena[]; extern const u8 gMonIcon_Poochyena[]; extern const u8 gMonFootprint_Poochyena[]; extern const u32 gMonFrontPic_Mightyena[]; extern const u32 gMonPalette_Mightyena[]; extern const u32 gMonBackPic_Mightyena[]; extern const u32 gMonShinyPalette_Mightyena[]; extern const u8 gMonIcon_Mightyena[]; extern const u8 gMonFootprint_Mightyena[]; extern const u32 gMonFrontPic_Zigzagoon[]; extern const u32 gMonPalette_Zigzagoon[]; extern const u32 gMonBackPic_Zigzagoon[]; extern const u32 gMonShinyPalette_Zigzagoon[]; extern const u8 gMonIcon_Zigzagoon[]; extern const u8 gMonFootprint_Zigzagoon[]; extern const u32 gMonFrontPic_Linoone[]; extern const u32 gMonPalette_Linoone[]; extern const u32 gMonBackPic_Linoone[]; extern const u32 gMonShinyPalette_Linoone[]; extern const u8 gMonIcon_Linoone[]; extern const u8 gMonFootprint_Linoone[]; extern const u32 gMonFrontPic_Wurmple[]; extern const u32 gMonPalette_Wurmple[]; extern const u32 gMonBackPic_Wurmple[]; extern const u32 gMonShinyPalette_Wurmple[]; extern const u8 gMonIcon_Wurmple[]; extern const u8 gMonFootprint_Wurmple[]; extern const u32 gMonFrontPic_Silcoon[]; extern const u32 gMonPalette_Silcoon[]; extern const u32 gMonBackPic_Silcoon[]; extern const u32 gMonShinyPalette_Silcoon[]; extern const u8 gMonIcon_Silcoon[]; extern const u8 gMonFootprint_Silcoon[]; extern const u32 gMonFrontPic_Beautifly[]; extern const u32 gMonPalette_Beautifly[]; extern const u32 gMonBackPic_Beautifly[]; extern const u32 gMonShinyPalette_Beautifly[]; extern const u8 gMonIcon_Beautifly[]; extern const u8 gMonFootprint_Beautifly[]; extern const u32 gMonFrontPic_Cascoon[]; extern const u32 gMonPalette_Cascoon[]; extern const u32 gMonBackPic_Cascoon[]; extern const u32 gMonShinyPalette_Cascoon[]; extern const u8 gMonIcon_Cascoon[]; extern const u8 gMonFootprint_Cascoon[]; extern const u32 gMonFrontPic_Dustox[]; extern const u32 gMonPalette_Dustox[]; extern const u32 gMonBackPic_Dustox[]; extern const u32 gMonShinyPalette_Dustox[]; extern const u8 gMonIcon_Dustox[]; extern const u8 gMonFootprint_Dustox[]; extern const u32 gMonFrontPic_Lotad[]; extern const u32 gMonPalette_Lotad[]; extern const u32 gMonBackPic_Lotad[]; extern const u32 gMonShinyPalette_Lotad[]; extern const u8 gMonIcon_Lotad[]; extern const u8 gMonFootprint_Lotad[]; extern const u32 gMonFrontPic_Lombre[]; extern const u32 gMonPalette_Lombre[]; extern const u32 gMonBackPic_Lombre[]; extern const u32 gMonShinyPalette_Lombre[]; extern const u8 gMonIcon_Lombre[]; extern const u8 gMonFootprint_Lombre[]; extern const u32 gMonFrontPic_Ludicolo[]; extern const u32 gMonPalette_Ludicolo[]; extern const u32 gMonBackPic_Ludicolo[]; extern const u32 gMonShinyPalette_Ludicolo[]; extern const u8 gMonIcon_Ludicolo[]; extern const u8 gMonFootprint_Ludicolo[]; extern const u32 gMonFrontPic_Seedot[]; extern const u32 gMonPalette_Seedot[]; extern const u32 gMonBackPic_Seedot[]; extern const u32 gMonShinyPalette_Seedot[]; extern const u8 gMonIcon_Seedot[]; extern const u8 gMonFootprint_Seedot[]; extern const u32 gMonFrontPic_Nuzleaf[]; extern const u32 gMonPalette_Nuzleaf[]; extern const u32 gMonBackPic_Nuzleaf[]; extern const u32 gMonShinyPalette_Nuzleaf[]; extern const u8 gMonIcon_Nuzleaf[]; extern const u8 gMonFootprint_Nuzleaf[]; extern const u32 gMonFrontPic_Shiftry[]; extern const u32 gMonPalette_Shiftry[]; extern const u32 gMonBackPic_Shiftry[]; extern const u32 gMonShinyPalette_Shiftry[]; extern const u8 gMonIcon_Shiftry[]; extern const u8 gMonFootprint_Shiftry[]; extern const u32 gMonFrontPic_Nincada[]; extern const u32 gMonPalette_Nincada[]; extern const u32 gMonBackPic_Nincada[]; extern const u32 gMonShinyPalette_Nincada[]; extern const u8 gMonIcon_Nincada[]; extern const u8 gMonFootprint_Nincada[]; extern const u32 gMonFrontPic_Ninjask[]; extern const u32 gMonPalette_Ninjask[]; extern const u32 gMonBackPic_Ninjask[]; extern const u32 gMonShinyPalette_Ninjask[]; extern const u8 gMonIcon_Ninjask[]; extern const u8 gMonFootprint_Ninjask[]; extern const u32 gMonFrontPic_Shedinja[]; extern const u32 gMonPalette_Shedinja[]; extern const u32 gMonBackPic_Shedinja[]; extern const u32 gMonShinyPalette_Shedinja[]; extern const u8 gMonIcon_Shedinja[]; extern const u8 gMonFootprint_Shedinja[]; extern const u32 gMonFrontPic_Taillow[]; extern const u32 gMonPalette_Taillow[]; extern const u32 gMonBackPic_Taillow[]; extern const u32 gMonShinyPalette_Taillow[]; extern const u8 gMonIcon_Taillow[]; extern const u8 gMonFootprint_Taillow[]; extern const u32 gMonFrontPic_Swellow[]; extern const u32 gMonPalette_Swellow[]; extern const u32 gMonBackPic_Swellow[]; extern const u32 gMonShinyPalette_Swellow[]; extern const u8 gMonIcon_Swellow[]; extern const u8 gMonFootprint_Swellow[]; extern const u32 gMonFrontPic_Shroomish[]; extern const u32 gMonPalette_Shroomish[]; extern const u32 gMonBackPic_Shroomish[]; extern const u32 gMonShinyPalette_Shroomish[]; extern const u8 gMonIcon_Shroomish[]; extern const u8 gMonFootprint_Shroomish[]; extern const u32 gMonFrontPic_Breloom[]; extern const u32 gMonPalette_Breloom[]; extern const u32 gMonBackPic_Breloom[]; extern const u32 gMonShinyPalette_Breloom[]; extern const u8 gMonIcon_Breloom[]; extern const u8 gMonFootprint_Breloom[]; extern const u32 gMonFrontPic_Spinda[]; extern const u32 gMonPalette_Spinda[]; extern const u32 gMonBackPic_Spinda[]; extern const u32 gMonShinyPalette_Spinda[]; extern const u8 gMonIcon_Spinda[]; extern const u8 gMonFootprint_Spinda[]; extern const u32 gMonFrontPic_Wingull[]; extern const u32 gMonPalette_Wingull[]; extern const u32 gMonBackPic_Wingull[]; extern const u32 gMonShinyPalette_Wingull[]; extern const u8 gMonIcon_Wingull[]; extern const u8 gMonFootprint_Wingull[]; extern const u32 gMonFrontPic_Pelipper[]; extern const u32 gMonPalette_Pelipper[]; extern const u32 gMonBackPic_Pelipper[]; extern const u32 gMonShinyPalette_Pelipper[]; extern const u8 gMonIcon_Pelipper[]; extern const u8 gMonFootprint_Pelipper[]; extern const u32 gMonFrontPic_Surskit[]; extern const u32 gMonPalette_Surskit[]; extern const u32 gMonBackPic_Surskit[]; extern const u32 gMonShinyPalette_Surskit[]; extern const u8 gMonIcon_Surskit[]; extern const u8 gMonFootprint_Surskit[]; extern const u32 gMonFrontPic_Masquerain[]; extern const u32 gMonPalette_Masquerain[]; extern const u32 gMonBackPic_Masquerain[]; extern const u32 gMonShinyPalette_Masquerain[]; extern const u8 gMonIcon_Masquerain[]; extern const u8 gMonFootprint_Masquerain[]; extern const u32 gMonFrontPic_Wailmer[]; extern const u32 gMonPalette_Wailmer[]; extern const u32 gMonBackPic_Wailmer[]; extern const u32 gMonShinyPalette_Wailmer[]; extern const u8 gMonIcon_Wailmer[]; extern const u8 gMonFootprint_Wailmer[]; extern const u32 gMonFrontPic_Wailord[]; extern const u32 gMonPalette_Wailord[]; extern const u32 gMonBackPic_Wailord[]; extern const u32 gMonShinyPalette_Wailord[]; extern const u8 gMonIcon_Wailord[]; extern const u8 gMonFootprint_Wailord[]; extern const u32 gMonFrontPic_Skitty[]; extern const u32 gMonPalette_Skitty[]; extern const u32 gMonBackPic_Skitty[]; extern const u32 gMonShinyPalette_Skitty[]; extern const u8 gMonIcon_Skitty[]; extern const u8 gMonFootprint_Skitty[]; extern const u32 gMonFrontPic_Delcatty[]; extern const u32 gMonPalette_Delcatty[]; extern const u32 gMonBackPic_Delcatty[]; extern const u32 gMonShinyPalette_Delcatty[]; extern const u8 gMonIcon_Delcatty[]; extern const u8 gMonFootprint_Delcatty[]; extern const u32 gMonFrontPic_Kecleon[]; extern const u32 gMonPalette_Kecleon[]; extern const u32 gMonBackPic_Kecleon[]; extern const u32 gMonShinyPalette_Kecleon[]; extern const u8 gMonIcon_Kecleon[]; extern const u8 gMonFootprint_Kecleon[]; extern const u32 gMonFrontPic_Baltoy[]; extern const u32 gMonPalette_Baltoy[]; extern const u32 gMonBackPic_Baltoy[]; extern const u32 gMonShinyPalette_Baltoy[]; extern const u8 gMonIcon_Baltoy[]; extern const u8 gMonFootprint_Baltoy[]; extern const u32 gMonFrontPic_Claydol[]; extern const u32 gMonPalette_Claydol[]; extern const u32 gMonBackPic_Claydol[]; extern const u32 gMonShinyPalette_Claydol[]; extern const u8 gMonIcon_Claydol[]; extern const u8 gMonFootprint_Claydol[]; extern const u32 gMonFrontPic_Nosepass[]; extern const u32 gMonPalette_Nosepass[]; extern const u32 gMonBackPic_Nosepass[]; extern const u32 gMonShinyPalette_Nosepass[]; extern const u8 gMonIcon_Nosepass[]; extern const u8 gMonFootprint_Nosepass[]; extern const u32 gMonFrontPic_Torkoal[]; extern const u32 gMonPalette_Torkoal[]; extern const u32 gMonBackPic_Torkoal[]; extern const u32 gMonShinyPalette_Torkoal[]; extern const u8 gMonIcon_Torkoal[]; extern const u8 gMonFootprint_Torkoal[]; extern const u32 gMonFrontPic_Sableye[]; extern const u32 gMonPalette_Sableye[]; extern const u32 gMonBackPic_Sableye[]; extern const u32 gMonShinyPalette_Sableye[]; extern const u8 gMonIcon_Sableye[]; extern const u8 gMonFootprint_Sableye[]; extern const u32 gMonFrontPic_Barboach[]; extern const u32 gMonPalette_Barboach[]; extern const u32 gMonBackPic_Barboach[]; extern const u32 gMonShinyPalette_Barboach[]; extern const u8 gMonIcon_Barboach[]; extern const u8 gMonFootprint_Barboach[]; extern const u32 gMonFrontPic_Whiscash[]; extern const u32 gMonPalette_Whiscash[]; extern const u32 gMonBackPic_Whiscash[]; extern const u32 gMonShinyPalette_Whiscash[]; extern const u8 gMonIcon_Whiscash[]; extern const u8 gMonFootprint_Whiscash[]; extern const u32 gMonFrontPic_Luvdisc[]; extern const u32 gMonPalette_Luvdisc[]; extern const u32 gMonBackPic_Luvdisc[]; extern const u32 gMonShinyPalette_Luvdisc[]; extern const u8 gMonIcon_Luvdisc[]; extern const u8 gMonFootprint_Luvdisc[]; extern const u32 gMonFrontPic_Corphish[]; extern const u32 gMonPalette_Corphish[]; extern const u32 gMonBackPic_Corphish[]; extern const u32 gMonShinyPalette_Corphish[]; extern const u8 gMonIcon_Corphish[]; extern const u8 gMonFootprint_Corphish[]; extern const u32 gMonFrontPic_Crawdaunt[]; extern const u32 gMonPalette_Crawdaunt[]; extern const u32 gMonBackPic_Crawdaunt[]; extern const u32 gMonShinyPalette_Crawdaunt[]; extern const u8 gMonIcon_Crawdaunt[]; extern const u8 gMonFootprint_Crawdaunt[]; extern const u32 gMonFrontPic_Feebas[]; extern const u32 gMonPalette_Feebas[]; extern const u32 gMonBackPic_Feebas[]; extern const u32 gMonShinyPalette_Feebas[]; extern const u8 gMonIcon_Feebas[]; extern const u8 gMonFootprint_Feebas[]; extern const u32 gMonFrontPic_Milotic[]; extern const u32 gMonPalette_Milotic[]; extern const u32 gMonBackPic_Milotic[]; extern const u32 gMonShinyPalette_Milotic[]; extern const u8 gMonIcon_Milotic[]; extern const u8 gMonFootprint_Milotic[]; extern const u32 gMonFrontPic_Carvanha[]; extern const u32 gMonPalette_Carvanha[]; extern const u32 gMonBackPic_Carvanha[]; extern const u32 gMonShinyPalette_Carvanha[]; extern const u8 gMonIcon_Carvanha[]; extern const u8 gMonFootprint_Carvanha[]; extern const u32 gMonFrontPic_Sharpedo[]; extern const u32 gMonPalette_Sharpedo[]; extern const u32 gMonBackPic_Sharpedo[]; extern const u32 gMonShinyPalette_Sharpedo[]; extern const u8 gMonIcon_Sharpedo[]; extern const u8 gMonFootprint_Sharpedo[]; extern const u32 gMonFrontPic_Trapinch[]; extern const u32 gMonPalette_Trapinch[]; extern const u32 gMonBackPic_Trapinch[]; extern const u32 gMonShinyPalette_Trapinch[]; extern const u8 gMonIcon_Trapinch[]; extern const u8 gMonFootprint_Trapinch[]; extern const u32 gMonFrontPic_Vibrava[]; extern const u32 gMonPalette_Vibrava[]; extern const u32 gMonBackPic_Vibrava[]; extern const u32 gMonShinyPalette_Vibrava[]; extern const u8 gMonIcon_Vibrava[]; extern const u8 gMonFootprint_Vibrava[]; extern const u32 gMonFrontPic_Flygon[]; extern const u32 gMonPalette_Flygon[]; extern const u32 gMonBackPic_Flygon[]; extern const u32 gMonShinyPalette_Flygon[]; extern const u8 gMonIcon_Flygon[]; extern const u8 gMonFootprint_Flygon[]; extern const u32 gMonFrontPic_Makuhita[]; extern const u32 gMonPalette_Makuhita[]; extern const u32 gMonBackPic_Makuhita[]; extern const u32 gMonShinyPalette_Makuhita[]; extern const u8 gMonIcon_Makuhita[]; extern const u8 gMonFootprint_Makuhita[]; extern const u32 gMonFrontPic_Hariyama[]; extern const u32 gMonPalette_Hariyama[]; extern const u32 gMonBackPic_Hariyama[]; extern const u32 gMonShinyPalette_Hariyama[]; extern const u8 gMonIcon_Hariyama[]; extern const u8 gMonFootprint_Hariyama[]; extern const u32 gMonFrontPic_Electrike[]; extern const u32 gMonPalette_Electrike[]; extern const u32 gMonBackPic_Electrike[]; extern const u32 gMonShinyPalette_Electrike[]; extern const u8 gMonIcon_Electrike[]; extern const u8 gMonFootprint_Electrike[]; extern const u32 gMonFrontPic_Manectric[]; extern const u32 gMonPalette_Manectric[]; extern const u32 gMonBackPic_Manectric[]; extern const u32 gMonShinyPalette_Manectric[]; extern const u8 gMonIcon_Manectric[]; extern const u8 gMonFootprint_Manectric[]; extern const u32 gMonFrontPic_Numel[]; extern const u32 gMonPalette_Numel[]; extern const u32 gMonBackPic_Numel[]; extern const u32 gMonShinyPalette_Numel[]; extern const u8 gMonIcon_Numel[]; extern const u8 gMonFootprint_Numel[]; extern const u32 gMonFrontPic_Camerupt[]; extern const u32 gMonPalette_Camerupt[]; extern const u32 gMonBackPic_Camerupt[]; extern const u32 gMonShinyPalette_Camerupt[]; extern const u8 gMonIcon_Camerupt[]; extern const u8 gMonFootprint_Camerupt[]; extern const u32 gMonFrontPic_Spheal[]; extern const u32 gMonPalette_Spheal[]; extern const u32 gMonBackPic_Spheal[]; extern const u32 gMonShinyPalette_Spheal[]; extern const u8 gMonIcon_Spheal[]; extern const u8 gMonFootprint_Spheal[]; extern const u32 gMonFrontPic_Sealeo[]; extern const u32 gMonPalette_Sealeo[]; extern const u32 gMonBackPic_Sealeo[]; extern const u32 gMonShinyPalette_Sealeo[]; extern const u8 gMonIcon_Sealeo[]; extern const u8 gMonFootprint_Sealeo[]; extern const u32 gMonFrontPic_Walrein[]; extern const u32 gMonPalette_Walrein[]; extern const u32 gMonBackPic_Walrein[]; extern const u32 gMonShinyPalette_Walrein[]; extern const u8 gMonIcon_Walrein[]; extern const u8 gMonFootprint_Walrein[]; extern const u32 gMonFrontPic_Cacnea[]; extern const u32 gMonPalette_Cacnea[]; extern const u32 gMonBackPic_Cacnea[]; extern const u32 gMonShinyPalette_Cacnea[]; extern const u8 gMonIcon_Cacnea[]; extern const u8 gMonFootprint_Cacnea[]; extern const u32 gMonFrontPic_Cacturne[]; extern const u32 gMonPalette_Cacturne[]; extern const u32 gMonBackPic_Cacturne[]; extern const u32 gMonShinyPalette_Cacturne[]; extern const u8 gMonIcon_Cacturne[]; extern const u8 gMonFootprint_Cacturne[]; extern const u32 gMonFrontPic_Snorunt[]; extern const u32 gMonPalette_Snorunt[]; extern const u32 gMonBackPic_Snorunt[]; extern const u32 gMonShinyPalette_Snorunt[]; extern const u8 gMonIcon_Snorunt[]; extern const u8 gMonFootprint_Snorunt[]; extern const u32 gMonFrontPic_Glalie[]; extern const u32 gMonPalette_Glalie[]; extern const u32 gMonBackPic_Glalie[]; extern const u32 gMonShinyPalette_Glalie[]; extern const u8 gMonIcon_Glalie[]; extern const u8 gMonFootprint_Glalie[]; extern const u32 gMonFrontPic_Lunatone[]; extern const u32 gMonPalette_Lunatone[]; extern const u32 gMonBackPic_Lunatone[]; extern const u32 gMonShinyPalette_Lunatone[]; extern const u8 gMonIcon_Lunatone[]; extern const u8 gMonFootprint_Lunatone[]; extern const u32 gMonFrontPic_Solrock[]; extern const u32 gMonPalette_Solrock[]; extern const u32 gMonBackPic_Solrock[]; extern const u32 gMonShinyPalette_Solrock[]; extern const u8 gMonIcon_Solrock[]; extern const u8 gMonFootprint_Solrock[]; extern const u32 gMonFrontPic_Azurill[]; extern const u32 gMonPalette_Azurill[]; extern const u32 gMonBackPic_Azurill[]; extern const u32 gMonShinyPalette_Azurill[]; extern const u8 gMonIcon_Azurill[]; extern const u8 gMonFootprint_Azurill[]; extern const u32 gMonFrontPic_Spoink[]; extern const u32 gMonPalette_Spoink[]; extern const u32 gMonBackPic_Spoink[]; extern const u32 gMonShinyPalette_Spoink[]; extern const u8 gMonIcon_Spoink[]; extern const u8 gMonFootprint_Spoink[]; extern const u32 gMonFrontPic_Grumpig[]; extern const u32 gMonPalette_Grumpig[]; extern const u32 gMonBackPic_Grumpig[]; extern const u32 gMonShinyPalette_Grumpig[]; extern const u8 gMonIcon_Grumpig[]; extern const u8 gMonFootprint_Grumpig[]; extern const u32 gMonFrontPic_Plusle[]; extern const u32 gMonPalette_Plusle[]; extern const u32 gMonBackPic_Plusle[]; extern const u32 gMonShinyPalette_Plusle[]; extern const u8 gMonIcon_Plusle[]; extern const u8 gMonFootprint_Plusle[]; extern const u32 gMonFrontPic_Minun[]; extern const u32 gMonPalette_Minun[]; extern const u32 gMonBackPic_Minun[]; extern const u32 gMonShinyPalette_Minun[]; extern const u8 gMonIcon_Minun[]; extern const u8 gMonFootprint_Minun[]; extern const u32 gMonFrontPic_Mawile[]; extern const u32 gMonPalette_Mawile[]; extern const u32 gMonBackPic_Mawile[]; extern const u32 gMonShinyPalette_Mawile[]; extern const u8 gMonIcon_Mawile[]; extern const u8 gMonFootprint_Mawile[]; extern const u32 gMonFrontPic_Meditite[]; extern const u32 gMonPalette_Meditite[]; extern const u32 gMonBackPic_Meditite[]; extern const u32 gMonShinyPalette_Meditite[]; extern const u8 gMonIcon_Meditite[]; extern const u8 gMonFootprint_Meditite[]; extern const u32 gMonFrontPic_Medicham[]; extern const u32 gMonPalette_Medicham[]; extern const u32 gMonBackPic_Medicham[]; extern const u32 gMonShinyPalette_Medicham[]; extern const u8 gMonIcon_Medicham[]; extern const u8 gMonFootprint_Medicham[]; extern const u32 gMonFrontPic_Swablu[]; extern const u32 gMonPalette_Swablu[]; extern const u32 gMonBackPic_Swablu[]; extern const u32 gMonShinyPalette_Swablu[]; extern const u8 gMonIcon_Swablu[]; extern const u8 gMonFootprint_Swablu[]; extern const u32 gMonFrontPic_Altaria[]; extern const u32 gMonPalette_Altaria[]; extern const u32 gMonBackPic_Altaria[]; extern const u32 gMonShinyPalette_Altaria[]; extern const u8 gMonIcon_Altaria[]; extern const u8 gMonFootprint_Altaria[]; extern const u32 gMonFrontPic_Wynaut[]; extern const u32 gMonPalette_Wynaut[]; extern const u32 gMonBackPic_Wynaut[]; extern const u32 gMonShinyPalette_Wynaut[]; extern const u8 gMonIcon_Wynaut[]; extern const u8 gMonFootprint_Wynaut[]; extern const u32 gMonFrontPic_Duskull[]; extern const u32 gMonPalette_Duskull[]; extern const u32 gMonBackPic_Duskull[]; extern const u32 gMonShinyPalette_Duskull[]; extern const u8 gMonIcon_Duskull[]; extern const u8 gMonFootprint_Duskull[]; extern const u32 gMonFrontPic_Dusclops[]; extern const u32 gMonPalette_Dusclops[]; extern const u32 gMonBackPic_Dusclops[]; extern const u32 gMonShinyPalette_Dusclops[]; extern const u8 gMonIcon_Dusclops[]; extern const u8 gMonFootprint_Dusclops[]; extern const u32 gMonFrontPic_Roselia[]; extern const u32 gMonPalette_Roselia[]; extern const u32 gMonBackPic_Roselia[]; extern const u32 gMonShinyPalette_Roselia[]; extern const u8 gMonIcon_Roselia[]; extern const u8 gMonFootprint_Roselia[]; extern const u32 gMonFrontPic_Slakoth[]; extern const u32 gMonPalette_Slakoth[]; extern const u32 gMonBackPic_Slakoth[]; extern const u32 gMonShinyPalette_Slakoth[]; extern const u8 gMonIcon_Slakoth[]; extern const u8 gMonFootprint_Slakoth[]; extern const u32 gMonFrontPic_Vigoroth[]; extern const u32 gMonPalette_Vigoroth[]; extern const u32 gMonBackPic_Vigoroth[]; extern const u32 gMonShinyPalette_Vigoroth[]; extern const u8 gMonIcon_Vigoroth[]; extern const u8 gMonFootprint_Vigoroth[]; extern const u32 gMonFrontPic_Slaking[]; extern const u32 gMonPalette_Slaking[]; extern const u32 gMonBackPic_Slaking[]; extern const u32 gMonShinyPalette_Slaking[]; extern const u8 gMonIcon_Slaking[]; extern const u8 gMonFootprint_Slaking[]; extern const u32 gMonFrontPic_Gulpin[]; extern const u32 gMonPalette_Gulpin[]; extern const u32 gMonBackPic_Gulpin[]; extern const u32 gMonShinyPalette_Gulpin[]; extern const u8 gMonIcon_Gulpin[]; extern const u8 gMonFootprint_Gulpin[]; extern const u32 gMonFrontPic_Swalot[]; extern const u32 gMonPalette_Swalot[]; extern const u32 gMonBackPic_Swalot[]; extern const u32 gMonShinyPalette_Swalot[]; extern const u8 gMonIcon_Swalot[]; extern const u8 gMonFootprint_Swalot[]; extern const u32 gMonFrontPic_Tropius[]; extern const u32 gMonPalette_Tropius[]; extern const u32 gMonBackPic_Tropius[]; extern const u32 gMonShinyPalette_Tropius[]; extern const u8 gMonIcon_Tropius[]; extern const u8 gMonFootprint_Tropius[]; extern const u32 gMonFrontPic_Whismur[]; extern const u32 gMonPalette_Whismur[]; extern const u32 gMonBackPic_Whismur[]; extern const u32 gMonShinyPalette_Whismur[]; extern const u8 gMonIcon_Whismur[]; extern const u8 gMonFootprint_Whismur[]; extern const u32 gMonFrontPic_Loudred[]; extern const u32 gMonPalette_Loudred[]; extern const u32 gMonBackPic_Loudred[]; extern const u32 gMonShinyPalette_Loudred[]; extern const u8 gMonIcon_Loudred[]; extern const u8 gMonFootprint_Loudred[]; extern const u32 gMonFrontPic_Exploud[]; extern const u32 gMonPalette_Exploud[]; extern const u32 gMonBackPic_Exploud[]; extern const u32 gMonShinyPalette_Exploud[]; extern const u8 gMonIcon_Exploud[]; extern const u8 gMonFootprint_Exploud[]; extern const u32 gMonFrontPic_Clamperl[]; extern const u32 gMonPalette_Clamperl[]; extern const u32 gMonBackPic_Clamperl[]; extern const u32 gMonShinyPalette_Clamperl[]; extern const u8 gMonIcon_Clamperl[]; extern const u8 gMonFootprint_Clamperl[]; extern const u32 gMonFrontPic_Huntail[]; extern const u32 gMonPalette_Huntail[]; extern const u32 gMonBackPic_Huntail[]; extern const u32 gMonShinyPalette_Huntail[]; extern const u8 gMonIcon_Huntail[]; extern const u8 gMonFootprint_Huntail[]; extern const u32 gMonFrontPic_Gorebyss[]; extern const u32 gMonPalette_Gorebyss[]; extern const u32 gMonBackPic_Gorebyss[]; extern const u32 gMonShinyPalette_Gorebyss[]; extern const u8 gMonIcon_Gorebyss[]; extern const u8 gMonFootprint_Gorebyss[]; extern const u32 gMonFrontPic_Absol[]; extern const u32 gMonPalette_Absol[]; extern const u32 gMonBackPic_Absol[]; extern const u32 gMonShinyPalette_Absol[]; extern const u8 gMonIcon_Absol[]; extern const u8 gMonFootprint_Absol[]; extern const u32 gMonFrontPic_Shuppet[]; extern const u32 gMonPalette_Shuppet[]; extern const u32 gMonBackPic_Shuppet[]; extern const u32 gMonShinyPalette_Shuppet[]; extern const u8 gMonIcon_Shuppet[]; extern const u8 gMonFootprint_Shuppet[]; extern const u32 gMonFrontPic_Banette[]; extern const u32 gMonPalette_Banette[]; extern const u32 gMonBackPic_Banette[]; extern const u32 gMonShinyPalette_Banette[]; extern const u8 gMonIcon_Banette[]; extern const u8 gMonFootprint_Banette[]; extern const u32 gMonFrontPic_Seviper[]; extern const u32 gMonPalette_Seviper[]; extern const u32 gMonBackPic_Seviper[]; extern const u32 gMonShinyPalette_Seviper[]; extern const u8 gMonIcon_Seviper[]; extern const u8 gMonFootprint_Seviper[]; extern const u32 gMonFrontPic_Zangoose[]; extern const u32 gMonPalette_Zangoose[]; extern const u32 gMonBackPic_Zangoose[]; extern const u32 gMonShinyPalette_Zangoose[]; extern const u8 gMonIcon_Zangoose[]; extern const u8 gMonFootprint_Zangoose[]; extern const u32 gMonFrontPic_Relicanth[]; extern const u32 gMonPalette_Relicanth[]; extern const u32 gMonBackPic_Relicanth[]; extern const u32 gMonShinyPalette_Relicanth[]; extern const u8 gMonIcon_Relicanth[]; extern const u8 gMonFootprint_Relicanth[]; extern const u32 gMonFrontPic_Aron[]; extern const u32 gMonPalette_Aron[]; extern const u32 gMonBackPic_Aron[]; extern const u32 gMonShinyPalette_Aron[]; extern const u8 gMonIcon_Aron[]; extern const u8 gMonFootprint_Aron[]; extern const u32 gMonFrontPic_Lairon[]; extern const u32 gMonPalette_Lairon[]; extern const u32 gMonBackPic_Lairon[]; extern const u32 gMonShinyPalette_Lairon[]; extern const u8 gMonIcon_Lairon[]; extern const u8 gMonFootprint_Lairon[]; extern const u32 gMonFrontPic_Aggron[]; extern const u32 gMonPalette_Aggron[]; extern const u32 gMonBackPic_Aggron[]; extern const u32 gMonShinyPalette_Aggron[]; extern const u8 gMonIcon_Aggron[]; extern const u8 gMonFootprint_Aggron[]; extern const u32 gMonFrontPic_Castform[]; extern const u32 gMonPalette_Castform[]; extern const u32 gMonBackPic_Castform[]; extern const u32 gMonShinyPalette_Castform[]; extern const u8 gMonIcon_Castform[]; extern const u8 gMonFootprint_Castform[]; extern const u32 gMonFrontPic_Volbeat[]; extern const u32 gMonPalette_Volbeat[]; extern const u32 gMonBackPic_Volbeat[]; extern const u32 gMonShinyPalette_Volbeat[]; extern const u8 gMonIcon_Volbeat[]; extern const u8 gMonFootprint_Volbeat[]; extern const u32 gMonFrontPic_Illumise[]; extern const u32 gMonPalette_Illumise[]; extern const u32 gMonBackPic_Illumise[]; extern const u32 gMonShinyPalette_Illumise[]; extern const u8 gMonIcon_Illumise[]; extern const u8 gMonFootprint_Illumise[]; extern const u32 gMonFrontPic_Lileep[]; extern const u32 gMonPalette_Lileep[]; extern const u32 gMonBackPic_Lileep[]; extern const u32 gMonShinyPalette_Lileep[]; extern const u8 gMonIcon_Lileep[]; extern const u8 gMonFootprint_Lileep[]; extern const u32 gMonFrontPic_Cradily[]; extern const u32 gMonPalette_Cradily[]; extern const u32 gMonBackPic_Cradily[]; extern const u32 gMonShinyPalette_Cradily[]; extern const u8 gMonIcon_Cradily[]; extern const u8 gMonFootprint_Cradily[]; extern const u32 gMonFrontPic_Anorith[]; extern const u32 gMonPalette_Anorith[]; extern const u32 gMonBackPic_Anorith[]; extern const u32 gMonShinyPalette_Anorith[]; extern const u8 gMonIcon_Anorith[]; extern const u8 gMonFootprint_Anorith[]; extern const u32 gMonFrontPic_Armaldo[]; extern const u32 gMonPalette_Armaldo[]; extern const u32 gMonBackPic_Armaldo[]; extern const u32 gMonShinyPalette_Armaldo[]; extern const u8 gMonIcon_Armaldo[]; extern const u8 gMonFootprint_Armaldo[]; extern const u32 gMonFrontPic_Ralts[]; extern const u32 gMonPalette_Ralts[]; extern const u32 gMonBackPic_Ralts[]; extern const u32 gMonShinyPalette_Ralts[]; extern const u8 gMonIcon_Ralts[]; extern const u8 gMonFootprint_Ralts[]; extern const u32 gMonFrontPic_Kirlia[]; extern const u32 gMonPalette_Kirlia[]; extern const u32 gMonBackPic_Kirlia[]; extern const u32 gMonShinyPalette_Kirlia[]; extern const u8 gMonIcon_Kirlia[]; extern const u8 gMonFootprint_Kirlia[]; extern const u32 gMonFrontPic_Gardevoir[]; extern const u32 gMonPalette_Gardevoir[]; extern const u32 gMonBackPic_Gardevoir[]; extern const u32 gMonShinyPalette_Gardevoir[]; extern const u8 gMonIcon_Gardevoir[]; extern const u8 gMonFootprint_Gardevoir[]; extern const u32 gMonFrontPic_Bagon[]; extern const u32 gMonPalette_Bagon[]; extern const u32 gMonBackPic_Bagon[]; extern const u32 gMonShinyPalette_Bagon[]; extern const u8 gMonIcon_Bagon[]; extern const u8 gMonFootprint_Bagon[]; extern const u32 gMonFrontPic_Shelgon[]; extern const u32 gMonPalette_Shelgon[]; extern const u32 gMonBackPic_Shelgon[]; extern const u32 gMonShinyPalette_Shelgon[]; extern const u8 gMonIcon_Shelgon[]; extern const u8 gMonFootprint_Shelgon[]; extern const u32 gMonFrontPic_Salamence[]; extern const u32 gMonPalette_Salamence[]; extern const u32 gMonBackPic_Salamence[]; extern const u32 gMonShinyPalette_Salamence[]; extern const u8 gMonIcon_Salamence[]; extern const u8 gMonFootprint_Salamence[]; extern const u32 gMonFrontPic_Beldum[]; extern const u32 gMonPalette_Beldum[]; extern const u32 gMonBackPic_Beldum[]; extern const u32 gMonShinyPalette_Beldum[]; extern const u8 gMonIcon_Beldum[]; extern const u8 gMonFootprint_Beldum[]; extern const u32 gMonFrontPic_Metang[]; extern const u32 gMonPalette_Metang[]; extern const u32 gMonBackPic_Metang[]; extern const u32 gMonShinyPalette_Metang[]; extern const u8 gMonIcon_Metang[]; extern const u8 gMonFootprint_Metang[]; extern const u32 gMonFrontPic_Metagross[]; extern const u32 gMonPalette_Metagross[]; extern const u32 gMonBackPic_Metagross[]; extern const u32 gMonShinyPalette_Metagross[]; extern const u8 gMonIcon_Metagross[]; extern const u8 gMonFootprint_Metagross[]; extern const u32 gMonFrontPic_Regirock[]; extern const u32 gMonPalette_Regirock[]; extern const u32 gMonBackPic_Regirock[]; extern const u32 gMonShinyPalette_Regirock[]; extern const u8 gMonIcon_Regirock[]; extern const u8 gMonFootprint_Regirock[]; extern const u32 gMonFrontPic_Regice[]; extern const u32 gMonPalette_Regice[]; extern const u32 gMonBackPic_Regice[]; extern const u32 gMonShinyPalette_Regice[]; extern const u8 gMonIcon_Regice[]; extern const u8 gMonFootprint_Regice[]; extern const u32 gMonFrontPic_Registeel[]; extern const u32 gMonPalette_Registeel[]; extern const u32 gMonBackPic_Registeel[]; extern const u32 gMonShinyPalette_Registeel[]; extern const u8 gMonIcon_Registeel[]; extern const u8 gMonFootprint_Registeel[]; extern const u32 gMonFrontPic_Kyogre[]; extern const u32 gMonPalette_Kyogre[]; extern const u32 gMonBackPic_Kyogre[]; extern const u32 gMonShinyPalette_Kyogre[]; extern const u8 gMonIcon_Kyogre[]; extern const u8 gMonFootprint_Kyogre[]; extern const u32 gMonFrontPic_Groudon[]; extern const u32 gMonPalette_Groudon[]; extern const u32 gMonBackPic_Groudon[]; extern const u32 gMonShinyPalette_Groudon[]; extern const u8 gMonIcon_Groudon[]; extern const u8 gMonFootprint_Groudon[]; extern const u32 gMonFrontPic_Rayquaza[]; extern const u32 gMonPalette_Rayquaza[]; extern const u32 gMonBackPic_Rayquaza[]; extern const u32 gMonShinyPalette_Rayquaza[]; extern const u8 gMonIcon_Rayquaza[]; extern const u8 gMonFootprint_Rayquaza[]; extern const u32 gMonFrontPic_Latias[]; extern const u32 gMonPalette_Latias[]; extern const u32 gMonBackPic_Latias[]; extern const u32 gMonShinyPalette_Latias[]; extern const u8 gMonIcon_Latias[]; extern const u8 gMonFootprint_Latias[]; extern const u32 gMonFrontPic_Latios[]; extern const u32 gMonPalette_Latios[]; extern const u32 gMonBackPic_Latios[]; extern const u32 gMonShinyPalette_Latios[]; extern const u8 gMonIcon_Latios[]; extern const u8 gMonFootprint_Latios[]; extern const u32 gMonFrontPic_Jirachi[]; extern const u32 gMonPalette_Jirachi[]; extern const u32 gMonBackPic_Jirachi[]; extern const u32 gMonShinyPalette_Jirachi[]; extern const u8 gMonIcon_Jirachi[]; extern const u8 gMonFootprint_Jirachi[]; extern const u32 gMonFrontPic_Deoxys[]; extern const u32 gMonPalette_Deoxys[]; extern const u32 gMonBackPic_Deoxys[]; extern const u32 gMonShinyPalette_Deoxys[]; extern const u8 gMonIcon_Deoxys[]; extern const u8 gMonFootprint_Deoxys[]; extern const u32 gMonFrontPic_Chimecho[]; extern const u32 gMonPalette_Chimecho[]; extern const u32 gMonBackPic_Chimecho[]; extern const u32 gMonShinyPalette_Chimecho[]; extern const u8 gMonIcon_Chimecho[]; extern const u8 gMonFootprint_Chimecho[]; extern const u32 gMonFrontPic_Egg[]; extern const u32 gMonPalette_Egg[]; extern const u8 gMonIcon_Egg[]; extern const u32 gMonFrontPic_UnownB[]; extern const u32 gMonBackPic_UnownB[]; extern const u8 gMonIcon_UnownB[]; extern const u32 gMonFrontPic_UnownC[]; extern const u32 gMonBackPic_UnownC[]; extern const u8 gMonIcon_UnownC[]; extern const u32 gMonFrontPic_UnownD[]; extern const u32 gMonBackPic_UnownD[]; extern const u8 gMonIcon_UnownD[]; extern const u32 gMonFrontPic_UnownE[]; extern const u32 gMonBackPic_UnownE[]; extern const u8 gMonIcon_UnownE[]; extern const u32 gMonFrontPic_UnownF[]; extern const u32 gMonBackPic_UnownF[]; extern const u8 gMonIcon_UnownF[]; extern const u32 gMonFrontPic_UnownG[]; extern const u32 gMonBackPic_UnownG[]; extern const u8 gMonIcon_UnownG[]; extern const u32 gMonFrontPic_UnownH[]; extern const u32 gMonBackPic_UnownH[]; extern const u8 gMonIcon_UnownH[]; extern const u32 gMonFrontPic_UnownI[]; extern const u32 gMonBackPic_UnownI[]; extern const u8 gMonIcon_UnownI[]; extern const u32 gMonFrontPic_UnownJ[]; extern const u32 gMonBackPic_UnownJ[]; extern const u8 gMonIcon_UnownJ[]; extern const u32 gMonFrontPic_UnownK[]; extern const u32 gMonBackPic_UnownK[]; extern const u8 gMonIcon_UnownK[]; extern const u32 gMonFrontPic_UnownL[]; extern const u32 gMonBackPic_UnownL[]; extern const u8 gMonIcon_UnownL[]; extern const u32 gMonFrontPic_UnownM[]; extern const u32 gMonBackPic_UnownM[]; extern const u8 gMonIcon_UnownM[]; extern const u32 gMonFrontPic_UnownN[]; extern const u32 gMonBackPic_UnownN[]; extern const u8 gMonIcon_UnownN[]; extern const u32 gMonFrontPic_UnownO[]; extern const u32 gMonBackPic_UnownO[]; extern const u8 gMonIcon_UnownO[]; extern const u32 gMonFrontPic_UnownP[]; extern const u32 gMonBackPic_UnownP[]; extern const u8 gMonIcon_UnownP[]; extern const u32 gMonFrontPic_UnownQ[]; extern const u32 gMonBackPic_UnownQ[]; extern const u8 gMonIcon_UnownQ[]; extern const u32 gMonFrontPic_UnownR[]; extern const u32 gMonBackPic_UnownR[]; extern const u8 gMonIcon_UnownR[]; extern const u32 gMonFrontPic_UnownS[]; extern const u32 gMonBackPic_UnownS[]; extern const u8 gMonIcon_UnownS[]; extern const u32 gMonFrontPic_UnownT[]; extern const u32 gMonBackPic_UnownT[]; extern const u8 gMonIcon_UnownT[]; extern const u32 gMonFrontPic_UnownU[]; extern const u32 gMonBackPic_UnownU[]; extern const u8 gMonIcon_UnownU[]; extern const u32 gMonFrontPic_UnownV[]; extern const u32 gMonBackPic_UnownV[]; extern const u8 gMonIcon_UnownV[]; extern const u32 gMonFrontPic_UnownW[]; extern const u32 gMonBackPic_UnownW[]; extern const u8 gMonIcon_UnownW[]; extern const u32 gMonFrontPic_UnownX[]; extern const u32 gMonBackPic_UnownX[]; extern const u8 gMonIcon_UnownX[]; extern const u32 gMonFrontPic_UnownY[]; extern const u32 gMonBackPic_UnownY[]; extern const u8 gMonIcon_UnownY[]; extern const u32 gMonFrontPic_UnownZ[]; extern const u32 gMonBackPic_UnownZ[]; extern const u8 gMonIcon_UnownZ[]; extern const u32 gMonFrontPic_UnownExclamationMark[]; extern const u32 gMonBackPic_UnownExclamationMark[]; extern const u8 gMonIcon_UnownExclamationMark[]; extern const u32 gMonFrontPic_UnownQuestionMark[]; extern const u32 gMonBackPic_UnownQuestionMark[]; extern const u8 gMonIcon_UnownQuestionMark[]; extern const u32 gMonFrontPic_CircledQuestionMark[]; extern const u32 gMonBackPic_CircledQuestionMark[]; extern const u32 gMonPalette_CircledQuestionMark[]; extern const u32 gMonShinyPalette_CircledQuestionMark[]; extern const u8 gMonIcon_QuestionMark[]; extern const u8 gMonFootprint_QuestionMark[]; extern const u32 gMonFrontPic_DoubleQuestionMark[]; extern const u32 gMonBackPic_DoubleQuestionMark[]; extern const u32 gMonPalette_DoubleQuestionMark[]; extern const u32 gMonShinyPalette_DoubleQuestionMark[]; // trainer sprites extern const u32 gTrainerFrontPic_AquaLeaderArchie[]; extern const u32 gTrainerFrontPic_AquaGruntM[]; extern const u32 gTrainerFrontPic_AquaGruntF[]; extern const u32 gTrainerFrontPic_RSAromaLady[]; extern const u32 gTrainerFrontPic_RSRuinManiac[]; extern const u32 gTrainerFrontPic_Interviewer[]; extern const u32 gTrainerFrontPic_RSTuberF[]; extern const u32 gTrainerFrontPic_TuberM[]; extern const u32 gTrainerFrontPic_RSCooltrainerM[]; extern const u32 gTrainerFrontPic_RSCooltrainerF[]; extern const u32 gTrainerFrontPic_HexManiac[]; extern const u32 gTrainerFrontPic_RSLady[]; extern const u32 gTrainerFrontPic_RSBeauty[]; extern const u32 gTrainerFrontPic_RichBoy[]; extern const u32 gTrainerFrontPic_RSPokeManiac[]; extern const u32 gTrainerFrontPic_RSSwimmerM[]; extern const u32 gTrainerFrontPic_RSBlackBelt[]; extern const u32 gTrainerFrontPic_Guitarist[]; extern const u32 gTrainerFrontPic_Kindler[]; extern const u32 gTrainerFrontPic_RSCamper[]; extern const u32 gTrainerFrontPic_BugManiac[]; extern const u32 gTrainerFrontPic_RSPsychicM[]; extern const u32 gTrainerFrontPic_RSPsychicF[]; extern const u32 gTrainerFrontPic_RSGentleman[]; extern const u32 gTrainerFrontPic_EliteFourSidney[]; extern const u32 gTrainerFrontPic_EliteFourPhoebe[]; extern const u32 gTrainerFrontPic_LeaderRoxanne[]; extern const u32 gTrainerFrontPic_LeaderBrawly[]; extern const u32 gTrainerFrontPic_LeaderTateAndLiza[]; extern const u32 gTrainerFrontPic_SchoolKidM[]; extern const u32 gTrainerFrontPic_SchoolKidF[]; extern const u32 gTrainerFrontPic_SrAndJr[]; extern const u32 gTrainerFrontPic_PokefanM[]; extern const u32 gTrainerFrontPic_PokefanF[]; extern const u32 gTrainerFrontPic_ExpertM[]; extern const u32 gTrainerFrontPic_ExpertF[]; extern const u32 gTrainerFrontPic_RSYoungster[]; extern const u32 gTrainerFrontPic_ChampionSteven[]; extern const u32 gTrainerFrontPic_RSFisherman[]; extern const u32 gTrainerFrontPic_CyclingTriathleteM[]; extern const u32 gTrainerFrontPic_CyclingTriathleteF[]; extern const u32 gTrainerFrontPic_RunningTriathleteM[]; extern const u32 gTrainerFrontPic_RunningTriathleteF[]; extern const u32 gTrainerFrontPic_SwimmingTriathleteM[]; extern const u32 gTrainerFrontPic_SwimmingTriathleteF[]; extern const u32 gTrainerFrontPic_DragonTamer[]; extern const u32 gTrainerFrontPic_RSBirdKeeper[]; extern const u32 gTrainerFrontPic_NinjaBoy[]; extern const u32 gTrainerFrontPic_BattleGirl[]; extern const u32 gTrainerFrontPic_ParasolLady[]; extern const u32 gTrainerFrontPic_RSSwimmerF[]; extern const u32 gTrainerFrontPic_RSPicnicker[]; extern const u32 gTrainerFrontPic_RSTwins[]; extern const u32 gTrainerFrontPic_RSSailor[]; extern const u32 gTrainerFrontPic_Collector[]; extern const u32 gTrainerFrontPic_Wally[]; extern const u32 gTrainerFrontPic_RSBrendan1[]; extern const u32 gTrainerFrontPic_RSMay1[]; extern const u32 gTrainerFrontPic_RSPokemonBreederM[]; extern const u32 gTrainerFrontPic_RSPokemonBreederF[]; extern const u32 gTrainerFrontPic_RSPokemonRangerM[]; extern const u32 gTrainerFrontPic_RSPokemonRangerF[]; extern const u32 gTrainerFrontPic_MagmaLeaderMaxie[]; extern const u32 gTrainerFrontPic_MagmaGruntM[]; extern const u32 gTrainerFrontPic_MagmaGruntF[]; extern const u32 gTrainerFrontPic_RSLass[]; extern const u32 gTrainerFrontPic_RSBugCatcher[]; extern const u32 gTrainerFrontPic_RSHiker[]; extern const u32 gTrainerFrontPic_RSYoungCouple[]; extern const u32 gTrainerFrontPic_OldCouple[]; extern const u32 gTrainerFrontPic_RSSisAndBro[]; extern const u32 gTrainerFrontPic_AquaAdminM[]; extern const u32 gTrainerFrontPic_AquaAdminF[]; extern const u32 gTrainerFrontPic_MagmaAdminM[]; extern const u32 gTrainerFrontPic_MagmaAdminF[]; extern const u32 gTrainerFrontPic_LeaderWattson[]; extern const u32 gTrainerFrontPic_LeaderFlannery[]; extern const u32 gTrainerFrontPic_LeaderNorman[]; extern const u32 gTrainerFrontPic_LeaderWinona[]; extern const u32 gTrainerFrontPic_LeaderWallace[]; extern const u32 gTrainerFrontPic_EliteFourGlacia[]; extern const u32 gTrainerFrontPic_EliteFourDrake[]; extern const u32 gTrainerFrontPic_Youngster[]; extern const u32 gTrainerFrontPic_BugCatcher[]; extern const u32 gTrainerFrontPic_Lass[]; extern const u32 gTrainerFrontPic_Sailor[]; extern const u32 gTrainerFrontPic_Camper[]; extern const u32 gTrainerFrontPic_Picnicker[]; extern const u32 gTrainerFrontPic_PokeManiac[]; extern const u32 gTrainerFrontPic_SuperNerd[]; extern const u32 gTrainerFrontPic_Hiker[]; extern const u32 gTrainerFrontPic_Biker[]; extern const u32 gTrainerFrontPic_Burglar[]; extern const u32 gTrainerFrontPic_Engineer[]; extern const u32 gTrainerFrontPic_Fisherman[]; extern const u32 gTrainerFrontPic_SwimmerM[]; extern const u32 gTrainerFrontPic_CueBall[]; extern const u32 gTrainerFrontPic_Gamer[]; extern const u32 gTrainerFrontPic_Beauty[]; extern const u32 gTrainerFrontPic_SwimmerF[]; extern const u32 gTrainerFrontPic_PsychicM[]; extern const u32 gTrainerFrontPic_Rocker[]; extern const u32 gTrainerFrontPic_Juggler[]; extern const u32 gTrainerFrontPic_Tamer[]; extern const u32 gTrainerFrontPic_BirdKeeper[]; extern const u32 gTrainerFrontPic_BlackBelt[]; extern const u32 gTrainerFrontPic_RivalEarly[]; extern const u32 gTrainerFrontPic_Scientist[]; extern const u32 gTrainerFrontPic_LeaderGiovanni[]; extern const u32 gTrainerFrontPic_RocketGruntM[]; extern const u32 gTrainerFrontPic_CooltrainerM[]; extern const u32 gTrainerFrontPic_CooltrainerF[]; extern const u32 gTrainerFrontPic_EliteFourLorelei[]; extern const u32 gTrainerFrontPic_EliteFourBruno[]; extern const u32 gTrainerFrontPic_EliteFourAgatha[]; extern const u32 gTrainerFrontPic_EliteFourLance[]; extern const u32 gTrainerFrontPic_LeaderBrock[]; extern const u32 gTrainerFrontPic_LeaderMisty[]; extern const u32 gTrainerFrontPic_LeaderLtSurge[]; extern const u32 gTrainerFrontPic_LeaderErika[]; extern const u32 gTrainerFrontPic_LeaderKoga[]; extern const u32 gTrainerFrontPic_LeaderBlaine[]; extern const u32 gTrainerFrontPic_LeaderSabrina[]; extern const u32 gTrainerFrontPic_Gentleman[]; extern const u32 gTrainerFrontPic_RivalLate[]; extern const u32 gTrainerFrontPic_ChampionRival[]; extern const u32 gTrainerFrontPic_Channeler[]; extern const u32 gTrainerFrontPic_Twins[]; extern const u32 gTrainerFrontPic_CoolCouple[]; extern const u32 gTrainerFrontPic_YoungCouple[]; extern const u32 gTrainerFrontPic_CrushKin[]; extern const u32 gTrainerFrontPic_SisAndBro[]; extern const u32 gTrainerFrontPic_ProfessorOak[]; extern const u32 gTrainerFrontPic_RSBrendan2[]; extern const u32 gTrainerFrontPic_RSMay2[]; extern const u32 gTrainerFrontPic_Red[]; extern const u32 gTrainerFrontPic_Leaf[]; extern const u32 gTrainerFrontPic_RocketGruntF[]; extern const u32 gTrainerFrontPic_PsychicF[]; extern const u32 gTrainerFrontPic_CrushGirl[]; extern const u32 gTrainerFrontPic_TuberF[]; extern const u32 gTrainerFrontPic_PokemonBreeder[]; extern const u32 gTrainerFrontPic_PokemonRangerM[]; extern const u32 gTrainerFrontPic_PokemonRangerF[]; extern const u32 gTrainerFrontPic_AromaLady[]; extern const u32 gTrainerFrontPic_RuinManiac[]; extern const u32 gTrainerFrontPic_Lady[]; extern const u32 gTrainerFrontPic_Painter[]; extern const u32 gTrainerFrontPic_EmBrendan[]; extern const u32 gTrainerFrontPic_EmMay[]; extern const u32 gTrainerFrontPic_MasterBeauty[]; extern const u32 gTrainerFrontPic_MasterBirdKeeper[]; extern const u32 gTrainerFrontPic_MasterBlackBelt[]; extern const u32 gTrainerFrontPic_MasterBugCatcher[]; extern const u32 gTrainerFrontPic_MasterCooltrainerM[]; extern const u32 gTrainerFrontPic_MasterHiker[]; extern const u32 gTrainerFrontPic_MasterLass[]; extern const u32 gTrainerFrontPic_MasterPsychicM[]; extern const u32 gTrainerFrontPic_MasterScientist[]; extern const u32 gTrainerFrontPic_MasterYoungster[]; extern const u32 gTrainerFrontPic_MasterSwimmer[]; extern const u32 gTrainerPalette_AquaLeaderArchie[]; extern const u32 gTrainerPalette_AquaGruntM[]; extern const u32 gTrainerPalette_AquaGruntF[]; extern const u32 gTrainerPalette_RSAromaLady[]; extern const u32 gTrainerPalette_RSRuinManiac[]; extern const u32 gTrainerPalette_Interviewer[]; extern const u32 gTrainerPalette_RSTuberF[]; extern const u32 gTrainerPalette_TuberM[]; extern const u32 gTrainerPalette_RSCooltrainerM[]; extern const u32 gTrainerPalette_RSCooltrainerF[]; extern const u32 gTrainerPalette_HexManiac[]; extern const u32 gTrainerPalette_RSLady[]; extern const u32 gTrainerPalette_RSBeauty[]; extern const u32 gTrainerPalette_RichBoy[]; extern const u32 gTrainerPalette_RSPokeManiac[]; extern const u32 gTrainerPalette_RSSwimmerM[]; extern const u32 gTrainerPalette_RSBlackBelt[]; extern const u32 gTrainerPalette_Guitarist[]; extern const u32 gTrainerPalette_Kindler[]; extern const u32 gTrainerPalette_RSCamper[]; extern const u32 gTrainerPalette_BugManiac[]; extern const u32 gTrainerPalette_RSPsychicM[]; extern const u32 gTrainerPalette_RSPsychicF[]; extern const u32 gTrainerPalette_RSGentleman[]; extern const u32 gTrainerPalette_EliteFourSidney[]; extern const u32 gTrainerPalette_EliteFourPhoebe[]; extern const u32 gTrainerPalette_LeaderRoxanne[]; extern const u32 gTrainerPalette_LeaderBrawly[]; extern const u32 gTrainerPalette_LeaderTateAndLiza[]; extern const u32 gTrainerPalette_SchoolKidM[]; extern const u32 gTrainerPalette_SchoolKidF[]; extern const u32 gTrainerPalette_SrAndJr[]; extern const u32 gTrainerPalette_PokefanM[]; extern const u32 gTrainerPalette_PokefanF[]; extern const u32 gTrainerPalette_ExpertM[]; extern const u32 gTrainerPalette_ExpertF[]; extern const u32 gTrainerPalette_RSYoungster[]; extern const u32 gTrainerPalette_ChampionSteven[]; extern const u32 gTrainerPalette_RSFisherman[]; extern const u32 gTrainerPalette_CyclingTriathleteM[]; extern const u32 gTrainerPalette_CyclingTriathleteF[]; extern const u32 gTrainerPalette_RunningTriathleteM[]; extern const u32 gTrainerPalette_RunningTriathleteF[]; extern const u32 gTrainerPalette_SwimmingTriathleteM[]; extern const u32 gTrainerPalette_SwimmingTriathleteF[]; extern const u32 gTrainerPalette_DragonTamer[]; extern const u32 gTrainerPalette_RSBirdKeeper[]; extern const u32 gTrainerPalette_NinjaBoy[]; extern const u32 gTrainerPalette_BattleGirl[]; extern const u32 gTrainerPalette_ParasolLady[]; extern const u32 gTrainerPalette_RSSwimmerF[]; extern const u32 gTrainerPalette_RSPicnicker[]; extern const u32 gTrainerPalette_RSTwins[]; extern const u32 gTrainerPalette_RSSailor[]; extern const u32 gTrainerPalette_Collector[]; extern const u32 gTrainerPalette_Wally[]; extern const u32 gTrainerPalette_RSBrendan1[]; extern const u32 gTrainerPalette_RSMay1[]; extern const u32 gTrainerPalette_LeafBackPic[]; extern const u32 gTrainerPalette_RedBackPic[]; extern const u32 gTrainerPalette_PokedudeBackPic[]; extern const u32 gTrainerPalette_OldManBackPic[]; extern const u32 gTrainerPalette_RSPokemonBreederM[]; extern const u32 gTrainerPalette_RSPokemonBreederF[]; extern const u32 gTrainerPalette_RSPokemonRangerM[]; extern const u32 gTrainerPalette_RSPokemonRangerF[]; extern const u32 gTrainerPalette_MagmaLeaderMaxie[]; extern const u32 gTrainerPalette_MagmaGruntM[]; extern const u32 gTrainerPalette_MagmaGruntF[]; extern const u32 gTrainerPalette_RSLass[]; extern const u32 gTrainerPalette_RSBugCatcher[]; extern const u32 gTrainerPalette_RSHiker[]; extern const u32 gTrainerPalette_RSYoungCouple[]; extern const u32 gTrainerPalette_OldCouple[]; extern const u32 gTrainerPalette_RSSisAndBro[]; extern const u32 gTrainerPalette_AquaAdminM[]; extern const u32 gTrainerPalette_AquaAdminF[]; extern const u32 gTrainerPalette_MagmaAdminM[]; extern const u32 gTrainerPalette_MagmaAdminF[]; extern const u32 gTrainerPalette_LeaderWattson[]; extern const u32 gTrainerPalette_LeaderFlannery[]; extern const u32 gTrainerPalette_LeaderNorman[]; extern const u32 gTrainerPalette_LeaderWinona[]; extern const u32 gTrainerPalette_LeaderWallace[]; extern const u32 gTrainerPalette_EliteFourGlacia[]; extern const u32 gTrainerPalette_EliteFourDrake[]; extern const u32 gTrainerPalette_Youngster[]; extern const u32 gTrainerPalette_BugCatcher[]; extern const u32 gTrainerPalette_Lass[]; extern const u32 gTrainerPalette_Sailor[]; extern const u32 gTrainerPalette_Camper[]; extern const u32 gTrainerPalette_Picnicker[]; extern const u32 gTrainerPalette_PokeManiac[]; extern const u32 gTrainerPalette_SuperNerd[]; extern const u32 gTrainerPalette_Hiker[]; extern const u32 gTrainerPalette_Biker[]; extern const u32 gTrainerPalette_Burglar[]; extern const u32 gTrainerPalette_Engineer[]; extern const u32 gTrainerPalette_Fisherman[]; extern const u32 gTrainerPalette_SwimmerM[]; extern const u32 gTrainerPalette_CueBall[]; extern const u32 gTrainerPalette_Gamer[]; extern const u32 gTrainerPalette_Beauty[]; extern const u32 gTrainerPalette_SwimmerF[]; extern const u32 gTrainerPalette_PsychicM[]; extern const u32 gTrainerPalette_Rocker[]; extern const u32 gTrainerPalette_Juggler[]; extern const u32 gTrainerPalette_Tamer[]; extern const u32 gTrainerPalette_BirdKeeper[]; extern const u32 gTrainerPalette_BlackBelt[]; extern const u32 gTrainerPalette_RivalEarly[]; extern const u32 gTrainerPalette_Scientist[]; extern const u32 gTrainerPalette_LeaderGiovanni[]; extern const u32 gTrainerPalette_RocketGruntM[]; extern const u32 gTrainerPalette_CooltrainerM[]; extern const u32 gTrainerPalette_CooltrainerF[]; extern const u32 gTrainerPalette_EliteFourLorelei[]; extern const u32 gTrainerPalette_EliteFourBruno[]; extern const u32 gTrainerPalette_EliteFourAgatha[]; extern const u32 gTrainerPalette_EliteFourLance[]; extern const u32 gTrainerPalette_LeaderBrock[]; extern const u32 gTrainerPalette_LeaderMisty[]; extern const u32 gTrainerPalette_LeaderLtSurge[]; extern const u32 gTrainerPalette_LeaderErika[]; extern const u32 gTrainerPalette_LeaderKoga[]; extern const u32 gTrainerPalette_LeaderBlaine[]; extern const u32 gTrainerPalette_LeaderSabrina[]; extern const u32 gTrainerPalette_Gentleman[]; extern const u32 gTrainerPalette_RivalLate[]; extern const u32 gTrainerPalette_ChampionRival[]; extern const u32 gTrainerPalette_Channeler[]; extern const u32 gTrainerPalette_Twins[]; extern const u32 gTrainerPalette_CoolCouple[]; extern const u32 gTrainerPalette_YoungCouple[]; extern const u32 gTrainerPalette_CrushKin[]; extern const u32 gTrainerPalette_SisAndBro[]; extern const u32 gTrainerPalette_ProfessorOak[]; extern const u32 gTrainerPalette_RSBrendan2[]; extern const u32 gTrainerPalette_RSMay2[]; extern const u32 gTrainerPalette_Red[]; extern const u32 gTrainerPalette_Leaf[]; extern const u32 gTrainerPalette_RocketGruntF[]; extern const u32 gTrainerPalette_PsychicF[]; extern const u32 gTrainerPalette_CrushGirl[]; extern const u32 gTrainerPalette_TuberF[]; extern const u32 gTrainerPalette_PokemonBreeder[]; extern const u32 gTrainerPalette_PokemonRangerM[]; extern const u32 gTrainerPalette_PokemonRangerF[]; extern const u32 gTrainerPalette_AromaLady[]; extern const u32 gTrainerPalette_RuinManiac[]; extern const u32 gTrainerPalette_Lady[]; extern const u32 gTrainerPalette_Painter[]; extern const u32 gTrainerPalette_EmMay[]; extern const u32 gTrainerPalette_EmBrendan[]; extern const u32 gTrainerPalette_MasterBeauty[]; extern const u32 gTrainerPalette_MasterBirdKeeper[]; extern const u32 gTrainerPalette_MasterBlackBelt[]; extern const u32 gTrainerPalette_MasterBugCatcher[]; extern const u32 gTrainerPalette_MasterCooltrainerM[]; extern const u32 gTrainerPalette_MasterHiker[]; extern const u32 gTrainerPalette_MasterLass[]; extern const u32 gTrainerPalette_MasterPsychicM[]; extern const u32 gTrainerPalette_MasterScientist[]; extern const u32 gTrainerPalette_MasterYoungster[]; extern const u32 gTrainerPalette_MasterSwimmer[]; extern const u8 gMenuInfoElements_Gfx[]; extern const u16 gMenuInfoElements1_Pal[]; extern const u16 gMenuInfoElements2_Pal[]; extern const u32 gItemIcon_QuestionMark[]; extern const u32 gItemIconPalette_QuestionMark[]; // fame_checker extern const u16 gFameCheckerBgPals[][16]; extern const u16 gFameCheckerBgTiles[0xa50]; extern const u16 gFameCheckerBg3Tilemap[0x400]; extern const u16 gFameCheckerBg2Tilemap[0x400]; // tm_case extern const u32 gTMCase_Gfx[]; extern const u32 gTMCaseMenu_Tilemap[]; extern const u32 gTMCase_Tilemap[]; extern const u32 gTMCaseMenu_Male_Pal[]; extern const u32 gTMCaseMenu_Female_Pal[]; extern const u32 gTMCaseDisc_Gfx[]; extern const u32 gTMCaseDiscTypes1_Pal[]; extern const u32 gTMCaseDiscTypes2_Pal[]; extern const u8 gTMCaseHM_Gfx[]; extern const u16 gStandardMenuPalette[]; // egg_hatch extern const u32 gTradeGba2_Pal[]; extern const u32 gTradeGba_Gfx[]; // teachy_tv extern const u8 gTeachyTv_Gfx[]; extern const u8 gTeachyTvScreen_Tilemap[]; extern const u8 gTeachyTvTitle_Tilemap[]; extern const u32 gTeachyTv_Pal[]; // berry_fix_program extern const u8 gBerryFixGameboy_Gfx[]; extern const u8 gBerryFixGameboy_Tilemap[]; extern const u8 gBerryFixGameboy_Pal[]; extern const u8 gBerryFixGameboyLogo_Gfx[]; extern const u8 gBerryFixGameboyLogo_Tilemap[]; extern const u8 gBerryFixGameboyLogo_Pal[]; extern const u8 gBerryFixGbaTransfer_Gfx[]; extern const u8 gBerryFixGbaTransfer_Tilemap[]; extern const u8 gBerryFixGbaTransfer_Pal[]; extern const u8 gBerryFixGbaTransferHighlight_Gfx[]; extern const u8 gBerryFixGbaTransferHighlight_Tilemap[]; extern const u8 gBerryFixGbaTransferHighlight_Pal[]; extern const u8 gBerryFixGbaTransferError_Gfx[]; extern const u8 gBerryFixGbaTransferError_Tilemap[]; extern const u8 gBerryFixGbaTransferError_Pal[]; extern const u8 gBerryFixWindow_Gfx[]; extern const u8 gBerryFixWindow_Tilemap[]; extern const u8 gBerryFixWindow_Pal[]; // item_pc extern const u8 gItemPcTiles[]; extern const u32 gItemPcBgPals[]; extern const u8 gItemPcTilemap[]; // item_menu_icons extern const u32 gBagMale_Gfx[]; extern const u32 gBagFemale_Gfx[]; extern const u32 gBag_Pal[]; extern const u32 gSwapLine_Gfx[]; extern const u32 gSwapLine_Pal[]; extern const u32 gItemIcon_MasterBall[]; extern const u32 gItemIconPalette_MasterBall[]; extern const u32 gItemIcon_UltraBall[]; extern const u32 gItemIconPalette_UltraBall[]; extern const u32 gItemIcon_GreatBall[]; extern const u32 gItemIconPalette_GreatBall[]; extern const u32 gItemIcon_PokeBall[]; extern const u32 gItemIconPalette_PokeBall[]; extern const u32 gItemIcon_SafariBall[]; extern const u32 gItemIconPalette_SafariBall[]; extern const u32 gItemIcon_NetBall[]; extern const u32 gItemIconPalette_NetBall[]; extern const u32 gItemIcon_DiveBall[]; extern const u32 gItemIconPalette_DiveBall[]; extern const u32 gItemIcon_NestBall[]; extern const u32 gItemIconPalette_NestBall[]; extern const u32 gItemIcon_RepeatBall[]; extern const u32 gItemIconPalette_RepeatBall[]; extern const u32 gItemIcon_TimerBall[]; extern const u32 gItemIcon_LuxuryBall[]; extern const u32 gItemIconPalette_LuxuryBall[]; extern const u32 gItemIcon_PremierBall[]; extern const u32 gItemIcon_Potion[]; extern const u32 gItemIconPalette_Potion[]; extern const u32 gItemIcon_Antidote[]; extern const u32 gItemIconPalette_Antidote[]; extern const u32 gItemIcon_StatusHeal[]; extern const u32 gItemIconPalette_BurnHeal[]; extern const u32 gItemIconPalette_IceHeal[]; extern const u32 gItemIconPalette_Awakening[]; extern const u32 gItemIconPalette_ParalyzeHeal[]; extern const u32 gItemIcon_LargePotion[]; extern const u32 gItemIconPalette_FullRestore[]; extern const u32 gItemIconPalette_MaxPotion[]; extern const u32 gItemIconPalette_HyperPotion[]; extern const u32 gItemIconPalette_SuperPotion[]; extern const u32 gItemIcon_FullHeal[]; extern const u32 gItemIconPalette_FullHeal[]; extern const u32 gItemIcon_Revive[]; extern const u32 gItemIconPalette_Revive[]; extern const u32 gItemIcon_MaxRevive[]; extern const u32 gItemIcon_FreshWater[]; extern const u32 gItemIconPalette_FreshWater[]; extern const u32 gItemIcon_SodaPop[]; extern const u32 gItemIconPalette_SodaPop[]; extern const u32 gItemIcon_Lemonade[]; extern const u32 gItemIconPalette_Lemonade[]; extern const u32 gItemIcon_MoomooMilk[]; extern const u32 gItemIconPalette_MoomooMilk[]; extern const u32 gItemIcon_Powder[]; extern const u32 gItemIconPalette_EnergyPowder[]; extern const u32 gItemIcon_EnergyRoot[]; extern const u32 gItemIconPalette_EnergyRoot[]; extern const u32 gItemIconPalette_HealPowder[]; extern const u32 gItemIcon_RevivalHerb[]; extern const u32 gItemIconPalette_RevivalHerb[]; extern const u32 gItemIcon_Ether[]; extern const u32 gItemIconPalette_Ether[]; extern const u32 gItemIconPalette_MaxEther[]; extern const u32 gItemIconPalette_Elixir[]; extern const u32 gItemIconPalette_MaxElixir[]; extern const u32 gItemIcon_LavaCookie[]; extern const u32 gItemIconPalette_LavaCookieAndLetter[]; extern const u32 gItemIcon_Flute[]; extern const u32 gItemIconPalette_BlueFlute[]; extern const u32 gItemIconPalette_YellowFlute[]; extern const u32 gItemIconPalette_RedFlute[]; extern const u32 gItemIconPalette_BlackFlute[]; extern const u32 gItemIconPalette_WhiteFlute[]; extern const u32 gItemIcon_BerryJuice[]; extern const u32 gItemIconPalette_BerryJuice[]; extern const u32 gItemIcon_SacredAsh[]; extern const u32 gItemIconPalette_SacredAsh[]; extern const u32 gItemIconPalette_ShoalSalt[]; extern const u32 gItemIcon_ShoalShell[]; extern const u32 gItemIconPalette_Shell[]; extern const u32 gItemIcon_Shard[]; extern const u32 gItemIconPalette_RedShard[]; extern const u32 gItemIconPalette_BlueShard[]; extern const u32 gItemIconPalette_YellowShard[]; extern const u32 gItemIconPalette_GreenShard[]; extern const u32 gItemIcon_HPUp[]; extern const u32 gItemIconPalette_HPUp[]; extern const u32 gItemIcon_Vitamin[]; extern const u32 gItemIconPalette_Protein[]; extern const u32 gItemIconPalette_Iron[]; extern const u32 gItemIconPalette_Carbos[]; extern const u32 gItemIconPalette_Calcium[]; extern const u32 gItemIcon_RareCandy[]; extern const u32 gItemIconPalette_RareCandy[]; extern const u32 gItemIcon_PPUp[]; extern const u32 gItemIconPalette_PPUp[]; extern const u32 gItemIconPalette_Zinc[]; extern const u32 gItemIcon_PPMax[]; extern const u32 gItemIconPalette_PPMax[]; extern const u32 gItemIcon_BattleStatItem[]; extern const u32 gItemIconPalette_GuardSpec[]; extern const u32 gItemIconPalette_DireHit[]; extern const u32 gItemIconPalette_XAttack[]; extern const u32 gItemIconPalette_XDefend[]; extern const u32 gItemIconPalette_XSpeed[]; extern const u32 gItemIconPalette_XAccuracy[]; extern const u32 gItemIconPalette_XSpecial[]; extern const u32 gItemIcon_PokeDoll[]; extern const u32 gItemIconPalette_PokeDoll[]; extern const u32 gItemIcon_FluffyTail[]; extern const u32 gItemIconPalette_FluffyTail[]; extern const u32 gItemIcon_Repel[]; extern const u32 gItemIconPalette_SuperRepel[]; extern const u32 gItemIconPalette_MaxRepel[]; extern const u32 gItemIcon_EscapeRope[]; extern const u32 gItemIconPalette_EscapeRope[]; extern const u32 gItemIcon_Repel[]; extern const u32 gItemIconPalette_Repel[]; extern const u32 gItemIcon_SunStone[]; extern const u32 gItemIconPalette_SunStone[]; extern const u32 gItemIcon_MoonStone[]; extern const u32 gItemIconPalette_MoonStone[]; extern const u32 gItemIcon_FireStone[]; extern const u32 gItemIconPalette_FireStone[]; extern const u32 gItemIcon_ThunderStone[]; extern const u32 gItemIconPalette_ThunderStone[]; extern const u32 gItemIcon_WaterStone[]; extern const u32 gItemIconPalette_WaterStone[]; extern const u32 gItemIcon_LeafStone[]; extern const u32 gItemIconPalette_LeafStone[]; extern const u32 gItemIcon_TinyMushroom[]; extern const u32 gItemIconPalette_Mushroom[]; extern const u32 gItemIcon_BigMushroom[]; extern const u32 gItemIcon_Pearl[]; extern const u32 gItemIconPalette_Pearl[]; extern const u32 gItemIcon_BigPearl[]; extern const u32 gItemIcon_Stardust[]; extern const u32 gItemIconPalette_Star[]; extern const u32 gItemIcon_StarPiece[]; extern const u32 gItemIcon_Nugget[]; extern const u32 gItemIconPalette_Nugget[]; extern const u32 gItemIcon_HeartScale[]; extern const u32 gItemIconPalette_HeartScale[]; extern const u32 gItemIcon_OrangeMail[]; extern const u32 gItemIconPalette_OrangeMail[]; extern const u32 gItemIcon_HarborMail[]; extern const u32 gItemIconPalette_HarborMail[]; extern const u32 gItemIcon_GlitterMail[]; extern const u32 gItemIconPalette_GlitterMail[]; extern const u32 gItemIcon_MechMail[]; extern const u32 gItemIconPalette_MechMail[]; extern const u32 gItemIcon_WoodMail[]; extern const u32 gItemIconPalette_WoodMail[]; extern const u32 gItemIcon_WaveMail[]; extern const u32 gItemIconPalette_WaveMail[]; extern const u32 gItemIcon_BeadMail[]; extern const u32 gItemIconPalette_BeadMail[]; extern const u32 gItemIcon_ShadowMail[]; extern const u32 gItemIconPalette_ShadowMail[]; extern const u32 gItemIcon_TropicMail[]; extern const u32 gItemIconPalette_TropicMail[]; extern const u32 gItemIcon_DreamMail[]; extern const u32 gItemIconPalette_DreamMail[]; extern const u32 gItemIcon_FabMail[]; extern const u32 gItemIconPalette_FabMail[]; extern const u32 gItemIcon_RetroMail[]; extern const u32 gItemIconPalette_RetroMail[]; extern const u32 gItemIcon_CheriBerry[]; extern const u32 gItemIconPalette_CheriBerry[]; extern const u32 gItemIcon_ChestoBerry[]; extern const u32 gItemIconPalette_ChestoBerry[]; extern const u32 gItemIcon_PechaBerry[]; extern const u32 gItemIconPalette_PechaBerry[]; extern const u32 gItemIcon_RawstBerry[]; extern const u32 gItemIconPalette_RawstBerry[]; extern const u32 gItemIcon_AspearBerry[]; extern const u32 gItemIconPalette_AspearBerry[]; extern const u32 gItemIcon_LeppaBerry[]; extern const u32 gItemIconPalette_LeppaBerry[]; extern const u32 gItemIcon_OranBerry[]; extern const u32 gItemIconPalette_OranBerry[]; extern const u32 gItemIcon_PersimBerry[]; extern const u32 gItemIconPalette_PersimBerry[]; extern const u32 gItemIcon_LumBerry[]; extern const u32 gItemIconPalette_LumBerry[]; extern const u32 gItemIcon_SitrusBerry[]; extern const u32 gItemIconPalette_SitrusBerry[]; extern const u32 gItemIcon_FigyBerry[]; extern const u32 gItemIconPalette_FigyBerry[]; extern const u32 gItemIcon_WikiBerry[]; extern const u32 gItemIconPalette_WikiBerry[]; extern const u32 gItemIcon_MagoBerry[]; extern const u32 gItemIconPalette_MagoBerry[]; extern const u32 gItemIcon_AguavBerry[]; extern const u32 gItemIconPalette_AguavBerry[]; extern const u32 gItemIcon_IapapaBerry[]; extern const u32 gItemIconPalette_IapapaBerry[]; extern const u32 gItemIcon_RazzBerry[]; extern const u32 gItemIconPalette_RazzBerry[]; extern const u32 gItemIcon_BlukBerry[]; extern const u32 gItemIconPalette_BlukBerry[]; extern const u32 gItemIcon_NanabBerry[]; extern const u32 gItemIconPalette_NanabBerry[]; extern const u32 gItemIcon_WepearBerry[]; extern const u32 gItemIconPalette_WepearBerry[]; extern const u32 gItemIcon_PinapBerry[]; extern const u32 gItemIconPalette_PinapBerry[]; extern const u32 gItemIcon_PomegBerry[]; extern const u32 gItemIconPalette_PomegBerry[]; extern const u32 gItemIcon_KelpsyBerry[]; extern const u32 gItemIconPalette_KelpsyBerry[]; extern const u32 gItemIcon_QualotBerry[]; extern const u32 gItemIconPalette_QualotBerry[]; extern const u32 gItemIcon_HondewBerry[]; extern const u32 gItemIconPalette_HondewBerry[]; extern const u32 gItemIcon_GrepaBerry[]; extern const u32 gItemIconPalette_GrepaBerry[]; extern const u32 gItemIcon_TamatoBerry[]; extern const u32 gItemIconPalette_TamatoBerry[]; extern const u32 gItemIcon_CornnBerry[]; extern const u32 gItemIconPalette_CornnBerry[]; extern const u32 gItemIcon_MagostBerry[]; extern const u32 gItemIconPalette_MagostBerry[]; extern const u32 gItemIcon_RabutaBerry[]; extern const u32 gItemIconPalette_RabutaBerry[]; extern const u32 gItemIcon_NomelBerry[]; extern const u32 gItemIconPalette_NomelBerry[]; extern const u32 gItemIcon_SpelonBerry[]; extern const u32 gItemIconPalette_SpelonBerry[]; extern const u32 gItemIcon_PamtreBerry[]; extern const u32 gItemIconPalette_PamtreBerry[]; extern const u32 gItemIcon_WatmelBerry[]; extern const u32 gItemIconPalette_WatmelBerry[]; extern const u32 gItemIcon_DurinBerry[]; extern const u32 gItemIconPalette_DurinBerry[]; extern const u32 gItemIcon_BelueBerry[]; extern const u32 gItemIconPalette_BelueBerry[]; extern const u32 gItemIcon_LiechiBerry[]; extern const u32 gItemIconPalette_LiechiBerry[]; extern const u32 gItemIcon_GanlonBerry[]; extern const u32 gItemIconPalette_GanlonBerry[]; extern const u32 gItemIcon_SalacBerry[]; extern const u32 gItemIconPalette_SalacBerry[]; extern const u32 gItemIcon_PetayaBerry[]; extern const u32 gItemIconPalette_PetayaBerry[]; extern const u32 gItemIcon_ApicotBerry[]; extern const u32 gItemIconPalette_ApicotBerry[]; extern const u32 gItemIcon_LansatBerry[]; extern const u32 gItemIconPalette_LansatBerry[]; extern const u32 gItemIcon_StarfBerry[]; extern const u32 gItemIconPalette_StarfBerry[]; extern const u32 gItemIcon_EnigmaBerry[]; extern const u32 gItemIconPalette_EnigmaBerry[]; extern const u32 gItemIcon_BrightPowder[]; extern const u32 gItemIconPalette_BrightPowder[]; extern const u32 gItemIcon_InBattleHerb[]; extern const u32 gItemIconPalette_WhiteHerb[]; extern const u32 gItemIcon_MachoBrace[]; extern const u32 gItemIconPalette_MachoBrace[]; extern const u32 gItemIcon_ExpShare[]; extern const u32 gItemIconPalette_ExpShare[]; extern const u32 gItemIcon_QuickClaw[]; extern const u32 gItemIconPalette_QuickClaw[]; extern const u32 gItemIcon_SootheBell[]; extern const u32 gItemIconPalette_SootheBell[]; extern const u32 gItemIcon_InBattleHerb[]; extern const u32 gItemIconPalette_MentalHerb[]; extern const u32 gItemIcon_ChoiceBand[]; extern const u32 gItemIconPalette_ChoiceBand[]; extern const u32 gItemIcon_KingsRock[]; extern const u32 gItemIconPalette_KingsRock[]; extern const u32 gItemIcon_SilverPowder[]; extern const u32 gItemIconPalette_SilverPowder[]; extern const u32 gItemIcon_AmuletCoin[]; extern const u32 gItemIconPalette_AmuletCoin[]; extern const u32 gItemIcon_CleanseTag[]; extern const u32 gItemIconPalette_CleanseTag[]; extern const u32 gItemIcon_SoulDew[]; extern const u32 gItemIconPalette_SoulDew[]; extern const u32 gItemIcon_DeepSeaTooth[]; extern const u32 gItemIconPalette_DeepSeaTooth[]; extern const u32 gItemIcon_DeepSeaScale[]; extern const u32 gItemIconPalette_DeepSeaScale[]; extern const u32 gItemIcon_SmokeBall[]; extern const u32 gItemIconPalette_SmokeBall[]; extern const u32 gItemIcon_Everstone[]; extern const u32 gItemIconPalette_Everstone[]; extern const u32 gItemIcon_FocusBand[]; extern const u32 gItemIconPalette_FocusBand[]; extern const u32 gItemIcon_LuckyEgg[]; extern const u32 gItemIconPalette_LuckyEgg[]; extern const u32 gItemIcon_ScopeLens[]; extern const u32 gItemIconPalette_ScopeLens[]; extern const u32 gItemIcon_MetalCoat[]; extern const u32 gItemIconPalette_MetalCoat[]; extern const u32 gItemIcon_Leftovers[]; extern const u32 gItemIconPalette_Leftovers[]; extern const u32 gItemIcon_DragonScale[]; extern const u32 gItemIconPalette_DragonScale[]; extern const u32 gItemIcon_LightBall[]; extern const u32 gItemIconPalette_LightBall[]; extern const u32 gItemIcon_SoftSand[]; extern const u32 gItemIconPalette_SoftSand[]; extern const u32 gItemIcon_HardStone[]; extern const u32 gItemIconPalette_HardStone[]; extern const u32 gItemIcon_MiracleSeed[]; extern const u32 gItemIconPalette_MiracleSeed[]; extern const u32 gItemIcon_BlackGlasses[]; extern const u32 gItemIconPalette_BlackTypeEnhancingItem[]; extern const u32 gItemIcon_BlackBelt[]; extern const u32 gItemIconPalette_BlackTypeEnhancingItem[]; extern const u32 gItemIcon_Magnet[]; extern const u32 gItemIconPalette_Magnet[]; extern const u32 gItemIcon_MysticWater[]; extern const u32 gItemIconPalette_MysticWater[]; extern const u32 gItemIcon_SharpBeak[]; extern const u32 gItemIconPalette_SharpBeak[]; extern const u32 gItemIcon_PoisonBarb[]; extern const u32 gItemIconPalette_PoisonBarb[]; extern const u32 gItemIcon_NeverMeltIce[]; extern const u32 gItemIconPalette_NeverMeltIce[]; extern const u32 gItemIcon_SpellTag[]; extern const u32 gItemIconPalette_SpellTag[]; extern const u32 gItemIcon_TwistedSpoon[]; extern const u32 gItemIconPalette_TwistedSpoon[]; extern const u32 gItemIcon_Charcoal[]; extern const u32 gItemIconPalette_Charcoal[]; extern const u32 gItemIcon_DragonFang[]; extern const u32 gItemIconPalette_DragonFang[]; extern const u32 gItemIcon_SilkScarf[]; extern const u32 gItemIconPalette_SilkScarf[]; extern const u32 gItemIcon_UpGrade[]; extern const u32 gItemIconPalette_UpGrade[]; extern const u32 gItemIcon_ShellBell[]; extern const u32 gItemIconPalette_Shell[]; extern const u32 gItemIcon_SeaIncense[]; extern const u32 gItemIconPalette_SeaIncense[]; extern const u32 gItemIcon_LaxIncense[]; extern const u32 gItemIconPalette_LaxIncense[]; extern const u32 gItemIcon_LuckyPunch[]; extern const u32 gItemIconPalette_LuckyPunch[]; extern const u32 gItemIcon_MetalPowder[]; extern const u32 gItemIconPalette_MetalPowder[]; extern const u32 gItemIcon_ThickClub[]; extern const u32 gItemIconPalette_ThickClub[]; extern const u32 gItemIcon_Stick[]; extern const u32 gItemIconPalette_Stick[]; extern const u32 gItemIcon_Scarf[]; extern const u32 gItemIconPalette_RedScarf[]; extern const u32 gItemIconPalette_BlueScarf[]; extern const u32 gItemIconPalette_PinkScarf[]; extern const u32 gItemIconPalette_GreenScarf[]; extern const u32 gItemIconPalette_YellowScarf[]; extern const u32 gItemIcon_MachBike[]; extern const u32 gItemIconPalette_MachBike[]; extern const u32 gItemIcon_CoinCase[]; extern const u32 gItemIconPalette_CoinCase[]; extern const u32 gItemIcon_Itemfinder[]; extern const u32 gItemIconPalette_Itemfinder[]; extern const u32 gItemIcon_OldRod[]; extern const u32 gItemIconPalette_OldRod[]; extern const u32 gItemIcon_GoodRod[]; extern const u32 gItemIconPalette_GoodRod[]; extern const u32 gItemIcon_SuperRod[]; extern const u32 gItemIconPalette_SuperRod[]; extern const u32 gItemIcon_SSTicket[]; extern const u32 gItemIconPalette_SSTicket[]; extern const u32 gItemIcon_ContestPass[]; extern const u32 gItemIconPalette_ContestPass[]; extern const u32 gItemIcon_WailmerPail[]; extern const u32 gItemIconPalette_WailmerPail[]; extern const u32 gItemIcon_DevonGoods[]; extern const u32 gItemIconPalette_DevonGoods[]; extern const u32 gItemIcon_SootSack[]; extern const u32 gItemIconPalette_SootSack[]; extern const u32 gItemIcon_BasementKey[]; extern const u32 gItemIconPalette_OldKey[]; extern const u32 gItemIcon_AcroBike[]; extern const u32 gItemIconPalette_AcroBike[]; extern const u32 gItemIcon_PokeblockCase[]; extern const u32 gItemIconPalette_PokeblockCase[]; extern const u32 gItemIcon_Letter[]; extern const u32 gItemIcon_EonTicket[]; extern const u32 gItemIconPalette_EonTicket[]; extern const u32 gItemIcon_Orb[]; extern const u32 gItemIconPalette_RedOrb[]; extern const u32 gItemIconPalette_BlueOrb[]; extern const u32 gItemIcon_Scanner[]; extern const u32 gItemIconPalette_Scanner[]; extern const u32 gItemIcon_GoGoggles[]; extern const u32 gItemIconPalette_GoGoggles[]; extern const u32 gItemIcon_Meteorite[]; extern const u32 gItemIconPalette_Meteorite[]; extern const u32 gItemIcon_Room1Key[]; extern const u32 gItemIconPalette_Key[]; extern const u32 gItemIcon_Room2Key[]; extern const u32 gItemIcon_Room4Key[]; extern const u32 gItemIcon_Room6Key[]; extern const u32 gItemIcon_StorageKey[]; extern const u32 gItemIcon_RootFossil[]; extern const u32 gItemIconPalette_HoennFossil[]; extern const u32 gItemIcon_ClawFossil[]; extern const u32 gItemIcon_DevonScope[]; extern const u32 gItemIconPalette_DevonScope[]; extern const u32 gItemIcon_TMHM[]; extern const u32 gItemIconPalette_FightingTMHM[]; extern const u32 gItemIconPalette_DragonTMHM[]; extern const u32 gItemIconPalette_WaterTMHM[]; extern const u32 gItemIconPalette_PsychicTMHM[]; extern const u32 gItemIconPalette_NormalTMHM[]; extern const u32 gItemIconPalette_PoisonTMHM[]; extern const u32 gItemIconPalette_IceTMHM[]; extern const u32 gItemIconPalette_GrassTMHM[]; extern const u32 gItemIconPalette_FireTMHM[]; extern const u32 gItemIconPalette_DarkTMHM[]; extern const u32 gItemIconPalette_SteelTMHM[]; extern const u32 gItemIconPalette_ElectricTMHM[]; extern const u32 gItemIconPalette_GroundTMHM[]; extern const u32 gItemIconPalette_GhostTMHM[]; extern const u32 gItemIconPalette_RockTMHM[]; extern const u32 gItemIconPalette_FlyingTMHM[]; // FireRed/LeafGreen key items extern const u32 gItemIcon_OaksParcel[]; extern const u32 gItemIconPalette_OaksParcel[]; extern const u32 gItemIcon_PokeFlute[]; extern const u32 gItemIconPalette_PokeFlute[]; extern const u32 gItemIcon_SecretKey[]; extern const u32 gItemIconPalette_SecretKey[]; extern const u32 gItemIcon_BikeVoucher[]; extern const u32 gItemIconPalette_BikeVoucher[]; extern const u32 gItemIcon_GoldTeeth[]; extern const u32 gItemIconPalette_GoldTeeth[]; extern const u32 gItemIcon_OldAmber[]; extern const u32 gItemIconPalette_OldAmber[]; extern const u32 gItemIcon_CardKey[]; extern const u32 gItemIconPalette_CardKey[]; extern const u32 gItemIcon_LiftKey[]; extern const u32 gItemIconPalette_Key[]; extern const u32 gItemIcon_HelixFossil[]; extern const u32 gItemIconPalette_KantoFossil[]; extern const u32 gItemIcon_DomeFossil[]; extern const u32 gItemIcon_SilphScope[]; extern const u32 gItemIconPalette_SilphScope[]; extern const u32 gItemIcon_Bicycle[]; extern const u32 gItemIconPalette_Bicycle[]; extern const u32 gItemIcon_TownMap[]; extern const u32 gItemIconPalette_TownMap[]; extern const u32 gItemIcon_VSSeeker[]; extern const u32 gItemIconPalette_VSSeeker[]; extern const u32 gItemIcon_FameChecker[]; extern const u32 gItemIconPalette_FameChecker[]; extern const u32 gItemIcon_TMCase[]; extern const u32 gItemIconPalette_TMCase[]; extern const u32 gItemIcon_BerryPouch[]; extern const u32 gItemIconPalette_BerryPouch[]; extern const u32 gItemIcon_TeachyTV[]; extern const u32 gItemIconPalette_TeachyTV[]; extern const u32 gItemIcon_TriPass[]; extern const u32 gItemIconPalette_TriPass[]; extern const u32 gItemIcon_RainbowPass[]; extern const u32 gItemIconPalette_RainbowPass[]; extern const u32 gItemIcon_Tea[]; extern const u32 gItemIconPalette_Tea[]; extern const u32 gItemIcon_MysticTicket[]; extern const u32 gItemIconPalette_MysticTicket[]; extern const u32 gItemIcon_AuroraTicket[]; extern const u32 gItemIconPalette_AuroraTicket[]; extern const u32 gItemIcon_PowderJar[]; extern const u32 gItemIconPalette_PowderJar[]; extern const u32 gItemIcon_Gem[]; extern const u32 gItemIconPalette_Ruby[]; extern const u32 gItemIconPalette_Sapphire[]; extern const u32 gItemIcon_MagmaEmblem[]; extern const u32 gItemIconPalette_MagmaEmblem[]; extern const u32 gItemIcon_OldSeaMap[]; extern const u32 gItemIconPalette_OldSeaMap[]; extern const u32 gItemIcon_LinkBracelet[]; extern const u32 gItemIconPalette_LinkBracelet[]; extern const u32 gItemIcon_ReturnToFieldArrow[]; extern const u32 gItemIconPalette_ReturnToFieldArrow[]; // battle_anim_utility_funcs extern const u32 gFile_graphics_battle_anims_masks_curse_sheet[]; extern const u32 gFile_graphics_battle_anims_masks_curse_tilemap[]; extern const u32 gBattleStatMask_Gfx[]; extern const u32 gBattleStatMask1_Pal[]; extern const u32 gBattleStatMask2_Pal[]; extern const u32 gBattleStatMask3_Pal[]; extern const u32 gBattleStatMask4_Pal[]; extern const u32 gBattleStatMask5_Pal[]; extern const u32 gBattleStatMask6_Pal[]; extern const u32 gBattleStatMask7_Pal[]; extern const u32 gBattleStatMask8_Pal[]; extern const u32 gBattleStatMask1_Tilemap[]; extern const u32 gBattleStatMask2_Tilemap[]; extern const u32 gSmokescreenImpactTiles[]; extern const u32 gSmokescreenImpactPalette[]; extern const u32 gEnemyMonShadow_Gfx[]; // battle anim particle gfx extern const u32 gBattleAnimSpriteGfx_Bone[]; extern const u32 gBattleAnimSpriteGfx_Spark[]; extern const u32 gBattleAnimSpriteGfx_Pencil[]; extern const u32 gBattleAnimSpriteGfx_AirWave[]; extern const u32 gBattleAnimSpriteGfx_Orb[]; extern const u32 gBattleAnimSpriteGfx_Sword[]; extern const u32 gBattleAnimSpriteGfx_Seed[]; extern const u32 gBattleAnimSpriteGfx_Explosion6[]; extern const u32 gBattleAnimSpriteGfx_PinkOrb[]; extern const u32 gBattleAnimSpriteGfx_Gust[]; extern const u32 gBattleAnimSpriteGfx_IceCube[]; extern const u32 gBattleAnimSpriteGfx_Spark2[]; extern const u32 gBattleAnimSpriteGfx_Orange[]; extern const u32 gBattleAnimSpriteGfx_YellowBall[]; extern const u32 gBattleAnimSpriteGfx_LockOn[]; extern const u32 gBattleAnimSpriteGfx_TiedBag[]; extern const u32 gBattleAnimSpriteGfx_BlackSmoke[]; extern const u32 gBattleAnimSpriteGfx_BlackBall[]; extern const u32 gBattleAnimSpriteGfx_Conversion[]; extern const u32 gBattleAnimSpriteGfx_Glass[]; extern const u32 gBattleAnimSpriteGfx_HornHit[]; extern const u32 gBattleAnimSpriteGfx_Hit[]; extern const u32 gBattleAnimSpriteGfx_BlueShards[]; extern const u32 gBattleAnimSpriteGfx_ClosingEye[]; extern const u32 gBattleAnimSpriteGfx_WavingHand[]; extern const u32 gBattleAnimSpriteGfx_HitDuplicate[]; extern const u32 gBattleAnimSpriteGfx_Leer[]; extern const u32 gBattleAnimSpriteGfx_BlueBurst[]; extern const u32 gBattleAnimSpriteGfx_SmallEmber[]; extern const u32 gBattleAnimSpriteGfx_GraySmoke[]; extern const u32 gBattleAnimSpriteGfx_BlueStar[]; extern const u32 gBattleAnimSpriteGfx_BubbleBurst[]; extern const u32 gBattleAnimSpriteGfx_Fire[]; extern const u32 gBattleAnimSpriteGfx_SpinningFire[]; extern const u32 gBattleAnimSpriteGfx_FirePlume[]; extern const u32 gBattleAnimSpriteGfx_Lightning2[]; extern const u32 gBattleAnimSpriteGfx_Lightning[]; extern const u32 gBattleAnimSpriteGfx_ClawSlash2[]; extern const u32 gBattleAnimSpriteGfx_ClawSlash[]; extern const u32 gBattleAnimSpriteGfx_Scratch3[]; extern const u32 gBattleAnimSpriteGfx_Scratch2[]; extern const u32 gBattleAnimSpriteGfx_BubbleBurst2[]; extern const u32 gBattleAnimSpriteGfx_IceChunk[]; extern const u32 gBattleAnimSpriteGfx_Glass2[]; extern const u32 gBattleAnimSpriteGfx_PinkHeart2[]; extern const u32 gBattleAnimSpriteGfx_SapDrip[]; extern const u32 gBattleAnimSpriteGfx_SapDrip[]; extern const u32 gBattleAnimSpriteGfx_Sparkle1[]; extern const u32 gBattleAnimSpriteGfx_Sparkle1[]; extern const u32 gBattleAnimSpriteGfx_HumanoidFoot[]; extern const u32 gBattleAnimSpriteGfx_MonsterFoot[]; extern const u32 gBattleAnimSpriteGfx_HumanoidHand[]; extern const u32 gBattleAnimSpriteGfx_NoiseLine[]; extern const u32 gBattleAnimSpriteGfx_YellowUnk[]; extern const u32 gBattleAnimSpriteGfx_RedFist[]; extern const u32 gBattleAnimSpriteGfx_SlamHit[]; extern const u32 gBattleAnimSpriteGfx_Ring[]; extern const u32 gBattleAnimSpriteGfx_Rocks[]; extern const u32 gBattleAnimSpriteGfx_Z[]; extern const u32 gBattleAnimSpriteGfx_YellowUnk2[]; extern const u32 gBattleAnimSpriteGfx_AirSlash[]; extern const u32 gBattleAnimSpriteGfx_SpinningGreenOrbs[]; extern const u32 gBattleAnimSpriteGfx_Leaf[]; extern const u32 gBattleAnimSpriteGfx_Finger[]; extern const u32 gBattleAnimSpriteGfx_PoisonPowder[]; extern const u32 gBattleAnimSpriteGfx_BrownTriangle[]; extern const u32 gBattleAnimSpriteGfx_Sparkle3[]; extern const u32 gBattleAnimSpriteGfx_Sparkle4[]; extern const u32 gBattleAnimSpriteGfx_MusicNotes[]; extern const u32 gBattleAnimSpriteGfx_Duck[]; extern const u32 gBattleAnimSpriteGfx_MudSand[]; extern const u32 gBattleAnimSpriteGfx_Alert[]; extern const u32 gBattleAnimSpriteGfx_BlueFlames[]; extern const u32 gBattleAnimSpriteGfx_BlueFlames2[]; extern const u32 gBattleAnimSpriteGfx_Shock4[]; extern const u32 gBattleAnimSpriteGfx_Shock[]; extern const u32 gBattleAnimSpriteGfx_Bell2[]; extern const u32 gBattleAnimSpriteGfx_PinkGlove[]; extern const u32 gBattleAnimSpriteGfx_BlueLines[]; extern const u32 gBattleAnimSpriteGfx_Impact3[]; extern const u32 gBattleAnimSpriteGfx_Impact2[]; extern const u32 gBattleAnimSpriteGfx_Reticle[]; extern const u32 gBattleAnimSpriteGfx_Breath[]; extern const u32 gBattleAnimSpriteGfx_Anger[]; extern const u32 gBattleAnimSpriteGfx_Snowball[]; extern const u32 gBattleAnimSpriteGfx_Vine[]; extern const u32 gBattleAnimSpriteGfx_Sword2[]; extern const u32 gBattleAnimSpriteGfx_Clapping[]; extern const u32 gBattleAnimSpriteGfx_RedTube[]; extern const u32 gBattleAnimSpriteGfx_Amnesia[]; extern const u32 gBattleAnimSpriteGfx_String2[]; extern const u32 gBattleAnimSpriteGfx_Pencil2[]; extern const u32 gBattleAnimSpriteGfx_Petal[]; extern const u32 gBattleAnimSpriteGfx_BentSpoon[]; extern const u32 gBattleAnimSpriteGfx_Web[]; extern const u32 gBattleAnimSpriteGfx_MilkBottle[]; extern const u32 gBattleAnimSpriteGfx_Coin[]; extern const u32 gBattleAnimSpriteGfx_CrackedEgg[]; extern const u32 gBattleAnimSpriteGfx_HatchedEgg[]; extern const u32 gBattleAnimSpriteGfx_FreshEgg[]; extern const u32 gBattleAnimSpriteGfx_Fangs[]; extern const u32 gBattleAnimSpriteGfx_Explosion2[]; extern const u32 gBattleAnimSpriteGfx_Explosion3[]; extern const u32 gBattleAnimSpriteGfx_WaterDroplet[]; extern const u32 gBattleAnimSpriteGfx_WaterDroplet2[]; extern const u32 gBattleAnimSpriteGfx_Seed2[]; extern const u32 gBattleAnimSpriteGfx_Sprout[]; extern const u32 gBattleAnimSpriteGfx_RedWand[]; extern const u32 gBattleAnimSpriteGfx_PurpleGreenUnk[]; extern const u32 gBattleAnimSpriteGfx_WaterColumn[]; extern const u32 gBattleAnimSpriteGfx_MudUnk[]; extern const u32 gBattleAnimSpriteGfx_RainDrops[]; extern const u32 gBattleAnimSpriteGfx_FurySwipes[]; extern const u32 gBattleAnimSpriteGfx_Vine2[]; extern const u32 gBattleAnimSpriteGfx_Teeth[]; extern const u32 gBattleAnimSpriteGfx_Bone2[]; extern const u32 gBattleAnimSpriteGfx_WhiteBag[]; extern const u32 gBattleAnimSpriteGfx_Unknown[]; extern const u32 gBattleAnimSpriteGfx_PurpleCoral[]; extern const u32 gBattleAnimSpriteGfx_PurpleDroplet[]; extern const u32 gBattleAnimSpriteGfx_Shock2[]; extern const u32 gBattleAnimSpriteGfx_ClosingEye2[]; extern const u32 gBattleAnimSpriteGfx_MetalBall[]; extern const u32 gBattleAnimSpriteGfx_MonsterDoll[]; extern const u32 gBattleAnimSpriteGfx_Whirlwind[]; extern const u32 gBattleAnimSpriteGfx_Whirlwind2[]; extern const u32 gBattleAnimSpriteGfx_Explosion4[]; extern const u32 gBattleAnimSpriteGfx_Explosion5[]; extern const u32 gBattleAnimSpriteGfx_Tongue[]; extern const u32 gBattleAnimSpriteGfx_Smoke[]; extern const u32 gBattleAnimSpriteGfx_Smoke2[]; extern const u32 gBattleAnimSpriteGfx_Impact[]; extern const u32 gBattleAnimSpriteGfx_Particles[]; extern const u32 gBattleAnimSpriteGfx_CircleImpact[]; extern const u32 gBattleAnimSpriteGfx_Scratch[]; extern const u32 gBattleAnimSpriteGfx_Cut[]; extern const u32 gBattleAnimSpriteGfx_SharpTeeth[]; extern const u32 gBattleAnimSpriteGfx_RainbowRings[]; extern const u32 gBattleAnimSpriteGfx_IceCrystals[]; extern const u32 gBattleAnimSpriteGfx_IceSpikes[]; extern const u32 gBattleAnimSpriteGfx_HandsAndFeet[]; extern const u32 gBattleAnimSpriteGfx_MistCloud[]; extern const u32 gBattleAnimSpriteGfx_Clamp[]; extern const u32 gBattleAnimSpriteGfx_Bubble[]; extern const u32 gBattleAnimSpriteGfx_Orbs[]; extern const u32 gBattleAnimSpriteGfx_WaterImpact[]; extern const u32 gBattleAnimSpriteGfx_WaterOrb[]; extern const u32 gBattleAnimSpriteGfx_PoisonBubble[]; extern const u32 gBattleAnimSpriteGfx_ToxicBubble[]; extern const u32 gBattleAnimSpriteGfx_Spikes[]; extern const u32 gBattleAnimSpriteGfx_HornHit2[]; extern const u32 gBattleAnimSpriteGfx_AirWave2[]; extern const u32 gBattleAnimSpriteGfx_SmallBubbles[]; extern const u32 gBattleAnimSpriteGfx_RoundShadow[]; extern const u32 gBattleAnimSpriteGfx_Sunlight[]; extern const u32 gBattleAnimSpriteGfx_Spore[]; extern const u32 gBattleAnimSpriteGfx_Flower[]; extern const u32 gBattleAnimSpriteGfx_RazorLeaf[]; extern const u32 gBattleAnimSpriteGfx_Needle[]; extern const u32 gBattleAnimSpriteGfx_WhirlwindLines[]; extern const u32 gBattleAnimSpriteGfx_GoldRing[]; extern const u32 gBattleAnimSpriteGfx_GreenLightWall[]; extern const u32 gBattleAnimSpriteGfx_BlackBall2[]; extern const u32 gBattleAnimSpriteGfx_SparkH[]; extern const u32 gBattleAnimSpriteGfx_YellowStar[]; extern const u32 gBattleAnimSpriteGfx_LargeFreshEgg[]; extern const u32 gBattleAnimSpriteGfx_ShadowBall[]; extern const u32 gBattleAnimSpriteGfx_Lick[]; extern const u32 gBattleAnimSpriteGfx_VoidLines[]; extern const u32 gBattleAnimSpriteGfx_String[]; extern const u32 gBattleAnimSpriteGfx_WebThread[]; extern const u32 gBattleAnimSpriteGfx_SpiderWeb[]; extern const u32 gBattleAnimSpriteGfx_Lightbulb[]; extern const u32 gBattleAnimSpriteGfx_Slash[]; extern const u32 gBattleAnimSpriteGfx_FocusEnergy[]; extern const u32 gBattleAnimSpriteGfx_SphereToCube[]; extern const u32 gBattleAnimSpriteGfx_Tendrils[]; extern const u32 gBattleAnimSpriteGfx_Eye[]; extern const u32 gBattleAnimSpriteGfx_WhiteShadow[]; extern const u32 gBattleAnimSpriteGfx_TealAlert[]; extern const u32 gBattleAnimSpriteGfx_OpeningEye[]; extern const u32 gBattleAnimSpriteGfx_RoundWhiteHalo[]; extern const u32 gBattleAnimSpriteGfx_FangAttack[]; extern const u32 gBattleAnimSpriteGfx_PurpleHandOutline[]; extern const u32 gBattleAnimSpriteGfx_Moon[]; extern const u32 gBattleAnimSpriteGfx_GreenSparkle[]; extern const u32 gBattleAnimSpriteGfx_Spiral[]; extern const u32 gBattleAnimSpriteGfx_SnoreZ[]; extern const u32 gBattleAnimSpriteGfx_Explosion[]; extern const u32 gBattleAnimSpriteGfx_Nail[]; extern const u32 gBattleAnimSpriteGfx_GhostlySpirit[]; extern const u32 gBattleAnimSpriteGfx_WarmRock[]; extern const u32 gBattleAnimSpriteGfx_BreakingEgg[]; extern const u32 gBattleAnimSpriteGfx_ThinRing[]; extern const u32 gBattleAnimSpriteGfx_PunchImpact[]; extern const u32 gBattleAnimSpriteGfx_Bell[]; extern const u32 gBattleAnimSpriteGfx_MusicNotes2[]; extern const u32 gBattleAnimSpriteGfx_SpeedDust[]; extern const u32 gBattleAnimSpriteGfx_TornMetal[]; extern const u32 gBattleAnimSpriteGfx_ThoughtBubble[]; extern const u32 gBattleAnimSpriteGfx_MagentaHeart[]; extern const u32 gBattleAnimSpriteGfx_ElectricOrbs[]; extern const u32 gBattleAnimSpriteGfx_CircleOfLight[]; extern const u32 gBattleAnimSpriteGfx_Electricity[]; extern const u32 gBattleAnimSpriteGfx_Finger2[]; extern const u32 gBattleAnimSpriteGfx_MovementWaves[]; extern const u32 gBattleAnimSpriteGfx_MagentaHeart[]; extern const u32 gBattleAnimSpriteGfx_RedOrb[]; extern const u32 gBattleAnimSpriteGfx_EyeSparkle[]; extern const u32 gBattleAnimSpriteGfx_MagentaHeart[]; extern const u32 gBattleAnimSpriteGfx_Angel[]; extern const u32 gBattleAnimSpriteGfx_Devil[]; extern const u32 gBattleAnimSpriteGfx_Swipe[]; extern const u32 gBattleAnimSpriteGfx_Roots[]; extern const u32 gBattleAnimSpriteGfx_ItemBag[]; extern const u32 gBattleAnimSpriteGfx_JaggedMusicNote[]; extern const u32 gBattleAnimSpriteGfx_Pokeball[]; extern const u32 gBattleAnimSpriteGfx_Spotlight[]; extern const u32 gBattleAnimSpriteGfx_LetterZ[]; extern const u32 gBattleAnimSpriteGfx_RapidSpin[]; extern const u32 gBattleAnimSpriteGfx_TriAttackTriangle[]; extern const u32 gBattleAnimSpriteGfx_WispOrb[]; extern const u32 gBattleAnimSpriteGfx_WispFire[]; extern const u32 gBattleAnimSpriteGfx_GoldStars[]; extern const u32 gBattleAnimSpriteGfx_EclipsingOrb[]; extern const u32 gBattleAnimSpriteGfx_GrayOrb[]; extern const u32 gBattleAnimSpriteGfx_GrayOrb[]; extern const u32 gBattleAnimSpriteGfx_GrayOrb[]; extern const u32 gBattleAnimSpriteGfx_PinkPetal[]; extern const u32 gBattleAnimSpriteGfx_PainSplit[]; extern const u32 gBattleAnimSpriteGfx_Confetti[]; extern const u32 gBattleAnimSpriteGfx_GreenStar[]; extern const u32 gBattleAnimSpriteGfx_PinkCloud[]; extern const u32 gBattleAnimSpriteGfx_SweatDrop[]; extern const u32 gBattleAnimSpriteGfx_GuardRing[]; extern const u32 gBattleAnimSpriteGfx_PurpleScratch[]; extern const u32 gBattleAnimSpriteGfx_PurpleSwipe[]; extern const u32 gBattleAnimSpriteGfx_TagHand[]; extern const u32 gBattleAnimSpriteGfx_SmallRedEye[]; extern const u32 gBattleAnimSpriteGfx_HollowOrb[]; extern const u32 gBattleAnimSpriteGfx_XSign[]; extern const u32 gBattleAnimSpriteGfx_BluegreenOrb[]; extern const u32 gBattleAnimSpriteGfx_PawPrint[]; extern const u32 gBattleAnimSpriteGfx_PurpleFlame[]; extern const u32 gBattleAnimSpriteGfx_RedBall[]; extern const u32 gBattleAnimSpriteGfx_SmellingsaltEffect[]; extern const u32 gBattleAnimSpriteGfx_Meteor[]; extern const u32 gBattleAnimSpriteGfx_FlatRock[]; extern const u32 gBattleAnimSpriteGfx_MagnifyingGlass[]; extern const u32 gBattleAnimSpriteGfx_MetalSoundWaves[]; extern const u32 gBattleAnimSpriteGfx_FlyingDirt[]; extern const u32 gBattleAnimSpriteGfx_IcicleSpear[]; extern const u32 gBattleAnimSpriteGfx_Hail[]; extern const u32 gBattleAnimSpriteGfx_GlowyRedOrb[]; extern const u32 gBattleAnimSpriteGfx_GreenSpike[]; extern const u32 gBattleAnimSpriteGfx_SafariBait[]; extern const u32 gBattleAnimSpriteGfx_WhiteFeather[]; extern const u32 gBattleAnimSpriteGfx_Sparkle6[]; extern const u32 gBattleAnimSpriteGfx_Splash[]; extern const u32 gBattleAnimSpriteGfx_SweatBead[]; extern const u32 gBattleAnimSpriteGfx_Gem1[]; extern const u32 gBattleAnimSpriteGfx_Gem2[]; extern const u32 gBattleAnimSpriteGfx_Gem3[]; extern const u32 gBattleAnimSpriteGfx_SlamHit2[]; extern const u32 gBattleAnimSpriteGfx_Recycle[]; extern const u32 gBattleAnimSpriteGfx_RedParticles[]; extern const u32 gBattleAnimSpriteGfx_Protect[]; extern const u32 gBattleAnimSpriteGfx_DirtMound[]; extern const u32 gBattleAnimSpriteGfx_Shock3[]; extern const u32 gBattleAnimSpriteGfx_WeatherBall[]; extern const u32 gBattleAnim_ScaryFaceGfx[]; extern const u32 gBattleAnim_ScaryFacePal[]; extern const u32 gBattleAnimBgTilemap_ScaryFacePlayer[]; extern const u32 gBattleAnimBgTilemap_ScaryFaceOpponent[]; extern const u32 gBattleAnimBgTilemap_ScaryFaceContest[]; extern const u32 gBattleAnimSpriteGfx_Bird[]; extern const u32 gBattleAnimSpriteGfx_CrossImpact[]; // battle anim particle pals extern const u32 gBattleAnimSpritePal_Bone[]; extern const u32 gBattleAnimSpritePal_Spark[]; extern const u32 gBattleAnimSpritePal_Pencil[]; extern const u32 gBattleAnimSpritePal_AirWave[]; extern const u32 gBattleAnimSpritePal_Orb[]; extern const u32 gBattleAnimSpritePal_Sword[]; extern const u32 gBattleAnimSpritePal_Seed[]; extern const u32 gBattleAnimSpritePal_Explosion6[]; extern const u32 gBattleAnimSpritePal_PinkOrb[]; extern const u32 gBattleAnimSpritePal_Gust[]; extern const u32 gBattleAnimSpritePal_IceCube[]; extern const u32 gBattleAnimSpritePal_Spark2[]; extern const u32 gBattleAnimSpritePal_Orange[]; extern const u32 gBattleAnimSpritePal_YellowBall[]; extern const u32 gBattleAnimSpritePal_LockOn[]; extern const u32 gBattleAnimSpritePal_TiedBag[]; extern const u32 gBattleAnimSpritePal_BlackSmoke[]; extern const u32 gBattleAnimSpritePal_Conversion[]; extern const u32 gBattleAnimSpritePal_Glass[]; extern const u32 gBattleAnimSpritePal_HornHit[]; extern const u32 gBattleAnimSpritePal_Hit[]; extern const u32 gBattleAnimSpritePal_Hit2[]; extern const u32 gBattleAnimSpritePal_BlueShards[]; extern const u32 gBattleAnimSpritePal_ClosingEye[]; extern const u32 gBattleAnimSpritePal_WavingHand[]; extern const u32 gBattleAnimSpritePal_HitDuplicate[]; extern const u32 gBattleAnimSpritePal_Leer[]; extern const u32 gBattleAnimSpritePal_BlueBurst[]; extern const u32 gBattleAnimSpritePal_SmallEmber[]; extern const u32 gBattleAnimSpritePal_GraySmoke[]; extern const u32 gBattleAnimSpritePal_BlueStar[]; extern const u32 gBattleAnimSpritePal_BubbleBurst[]; extern const u32 gBattleAnimSpritePal_Fire[]; extern const u32 gBattleAnimSpritePal_Lightning2[]; extern const u32 gBattleAnimSpritePal_ClawSlash2[]; extern const u32 gBattleAnimSpritePal_ClawSlash[]; extern const u32 gBattleAnimSpritePal_BubbleBurst2[]; extern const u32 gBattleAnimSpritePal_IceChunk[]; extern const u32 gBattleAnimSpritePal_Glass2[]; extern const u32 gBattleAnimSpritePal_PinkHeart2[]; extern const u32 gBattleAnimSpritePal_SapDrip[]; extern const u32 gBattleAnimSpritePal_SapDrip2[]; extern const u32 gBattleAnimSpritePal_Sparkle1[]; extern const u32 gBattleAnimSpritePal_Sparkle2[]; extern const u32 gBattleAnimSpritePal_HumanoidFoot[]; extern const u32 gBattleAnimSpritePal_HitDuplicate[]; extern const u32 gBattleAnimSpritePal_YellowUnk[]; extern const u32 gBattleAnimSpritePal_SlamHit[]; extern const u32 gBattleAnimSpritePal_Ring[]; extern const u32 gBattleAnimSpritePal_Rocks[]; extern const u32 gBattleAnimSpritePal_Z[]; extern const u32 gBattleAnimSpritePal_YellowUnk2[]; extern const u32 gBattleAnimSpritePal_AirSlash[]; extern const u32 gBattleAnimSpritePal_SpinningGreenOrbs[]; extern const u32 gBattleAnimSpritePal_Leaf[]; extern const u32 gBattleAnimSpritePal_Finger[]; extern const u32 gBattleAnimSpritePal_PoisonPowder[]; extern const u32 gBattleAnimSpritePal_BrownTriangle[]; extern const u32 gBattleAnimSpritePal_SleepPowder[]; extern const u32 gBattleAnimSpritePal_StunSpore[]; extern const u32 gBattleAnimSpritePal_PoisonPowder[]; extern const u32 gBattleAnimSpritePal_Sparkle3[]; extern const u32 gBattleAnimSpritePal_MusicNotes[]; extern const u32 gBattleAnimSpritePal_Duck[]; extern const u32 gBattleAnimSpritePal_MudSand[]; extern const u32 gBattleAnimSpritePal_Alert[]; extern const u32 gBattleAnimSpritePal_BlueFlames[]; extern const u32 gBattleAnimSpritePal_Shock4[]; extern const u32 gBattleAnimSpritePal_Bell2[]; extern const u32 gBattleAnimSpritePal_PinkGlove[]; extern const u32 gBattleAnimSpritePal_BlueLines[]; extern const u32 gBattleAnimSpritePal_Impact3[]; extern const u32 gBattleAnimSpritePal_Impact2[]; extern const u32 gBattleAnimSpritePal_Reticle[]; extern const u32 gBattleAnimSpritePal_Breath[]; extern const u32 gBattleAnimSpritePal_Anger[]; extern const u32 gBattleAnimSpritePal_Snowball[]; extern const u32 gBattleAnimSpritePal_Vine[]; extern const u32 gBattleAnimSpritePal_Sword2[]; extern const u32 gBattleAnimSpritePal_Clapping[]; extern const u32 gBattleAnimSpritePal_RedTube[]; extern const u32 gBattleAnimSpritePal_Amnesia[]; extern const u32 gBattleAnimSpritePal_String2[]; extern const u32 gBattleAnimSpritePal_Pencil2[]; extern const u32 gBattleAnimSpritePal_Petal[]; extern const u32 gBattleAnimSpritePal_BentSpoon[]; extern const u32 gBattleAnimSpritePal_MilkBottle[]; extern const u32 gBattleAnimSpritePal_Coin[]; extern const u32 gBattleAnimSpritePal_CrackedEgg[]; extern const u32 gBattleAnimSpritePal_FreshEgg[]; extern const u32 gBattleAnimSpritePal_Fangs[]; extern const u32 gBattleAnimSpritePal_Explosion2[]; extern const u32 gBattleAnimSpritePal_WaterDroplet[]; extern const u32 gBattleAnimSpritePal_Seed2[]; extern const u32 gBattleAnimSpritePal_RedWand[]; extern const u32 gBattleAnimSpritePal_PurpleGreenUnk[]; extern const u32 gBattleAnimSpritePal_WaterColumn[]; extern const u32 gBattleAnimSpritePal_MudUnk[]; extern const u32 gBattleAnimSpritePal_RainDrops[]; extern const u32 gBattleAnimSpritePal_FurySwipes[]; extern const u32 gBattleAnimSpritePal_Vine2[]; extern const u32 gBattleAnimSpritePal_Teeth[]; extern const u32 gBattleAnimSpritePal_Bone2[]; extern const u32 gBattleAnimSpritePal_WhiteBag[]; extern const u32 gBattleAnimSpritePal_Unknown[]; extern const u32 gBattleAnimSpritePal_PurpleCoral[]; extern const u32 gBattleAnimSpritePal_Shock2[]; extern const u32 gBattleAnimSpritePal_ClosingEye2[]; extern const u32 gBattleAnimSpritePal_MetalBall[]; extern const u32 gBattleAnimSpritePal_MonsterDoll[]; extern const u32 gBattleAnimSpritePal_Whirlwind[]; extern const u32 gBattleAnimSpritePal_Explosion4[]; extern const u32 gBattleAnimSpritePal_Tongue[]; extern const u32 gBattleAnimSpritePal_Smoke[]; extern const u32 gBattleAnimSpritePal_Impact[]; extern const u32 gBattleAnimSpritePal_CircleImpact[]; extern const u32 gBattleAnimSpritePal_SharpTeeth[]; extern const u32 gBattleAnimSpritePal_RainbowRings[]; extern const u32 gBattleAnimSpritePal_IceCrystals[]; extern const u32 gBattleAnimSpritePal_HandsAndFeet[]; extern const u32 gBattleAnimSpritePal_MistCloud[]; extern const u32 gBattleAnimSpritePal_Orbs[]; extern const u32 gBattleAnimSpritePal_WaterImpact[]; extern const u32 gBattleAnimSpritePal_PoisonBubble[]; extern const u32 gBattleAnimSpritePal_Spikes[]; extern const u32 gBattleAnimSpritePal_HornHit2[]; extern const u32 gBattleAnimSpritePal_AirWave2[]; extern const u32 gBattleAnimSpritePal_SmallBubbles[]; extern const u32 gBattleAnimSpritePal_RoundShadow[]; extern const u32 gBattleAnimSpritePal_Sunlight[]; extern const u32 gBattleAnimSpritePal_Spore[]; extern const u32 gBattleAnimSpritePal_Flower[]; extern const u32 gBattleAnimSpritePal_RazorLeaf[]; extern const u32 gBattleAnimSpritePal_Needle[]; extern const u32 gBattleAnimSpritePal_WhirlwindLines[]; extern const u32 gBattleAnimSpritePal_GoldRing[]; extern const u32 gBattleAnimSpritePal_PurpleRing[]; extern const u32 gBattleAnimSpritePal_BlueRing[]; extern const u32 gBattleAnimSpritePal_GreenLightWall[]; extern const u32 gBattleAnimSpritePal_BlueLightWall[]; extern const u32 gBattleAnimSpritePal_RedLightWall[]; extern const u32 gBattleAnimSpritePal_GrayLightWall[]; extern const u32 gBattleAnimSpritePal_OrangeLightWall[]; extern const u32 gBattleAnimSpritePal_BlackBall2[]; extern const u32 gBattleAnimSpritePal_PurpleGasCloud[]; extern const u32 gBattleAnimSpritePal_YellowStar[]; extern const u32 gBattleAnimSpritePal_LargeFreshEgg[]; extern const u32 gBattleAnimSpritePal_ShadowBall[]; extern const u32 gBattleAnimSpritePal_Lick[]; extern const u32 gBattleAnimSpritePal_VoidLines[]; extern const u32 gBattleAnimSpritePal_String[]; extern const u32 gBattleAnimSpritePal_Lightbulb[]; extern const u32 gBattleAnimSpritePal_Slash[]; extern const u32 gBattleAnimSpritePal_FocusEnergy[]; extern const u32 gBattleAnimSpritePal_SphereToCube[]; extern const u32 gBattleAnimSpritePal_Tendrils[]; extern const u32 gBattleAnimSpritePal_Eye[]; extern const u32 gBattleAnimSpritePal_WhiteShadow[]; extern const u32 gBattleAnimSpritePal_TealAlert[]; extern const u32 gBattleAnimSpritePal_OpeningEye[]; extern const u32 gBattleAnimSpritePal_RoundWhiteHalo[]; extern const u32 gBattleAnimSpritePal_FangAttack[]; extern const u32 gBattleAnimSpritePal_PurpleHandOutline[]; extern const u32 gBattleAnimSpritePal_Moon[]; extern const u32 gBattleAnimSpritePal_GreenSparkle[]; extern const u32 gBattleAnimSpritePal_Spiral[]; extern const u32 gBattleAnimSpritePal_SnoreZ[]; extern const u32 gBattleAnimSpritePal_Explosion[]; extern const u32 gBattleAnimSpritePal_Nail[]; extern const u32 gBattleAnimSpritePal_GhostlySpirit[]; extern const u32 gBattleAnimSpritePal_WarmRock[]; extern const u32 gBattleAnimSpritePal_BreakingEgg[]; extern const u32 gBattleAnimSpritePal_ThinRing[]; extern const u32 gBattleAnimSpritePal_PunchImpact[]; extern const u32 gBattleAnimSpritePal_Bell[]; extern const u32 gBattleAnimSpritePal_MusicNotes2[]; extern const u32 gBattleAnimSpritePal_SpeedDust[]; extern const u32 gBattleAnimSpritePal_ThoughtBubble[]; extern const u32 gBattleAnimSpritePal_MagentaHeart[]; extern const u32 gBattleAnimSpritePal_ElectricOrbs[]; extern const u32 gBattleAnimSpritePal_MovementWaves[]; extern const u32 gBattleAnimSpritePal_RedHeart[]; extern const u32 gBattleAnimSpritePal_RedOrb[]; extern const u32 gBattleAnimSpritePal_EyeSparkle[]; extern const u32 gBattleAnimSpritePal_PinkHeart[]; extern const u32 gBattleAnimSpritePal_Angel[]; extern const u32 gBattleAnimSpritePal_Devil[]; extern const u32 gBattleAnimSpritePal_Swipe[]; extern const u32 gBattleAnimSpritePal_Roots[]; extern const u32 gBattleAnimSpritePal_ItemBag[]; extern const u32 gBattleAnimSpritePal_JaggedMusicNote[]; extern const u32 gBattleAnimSpritePal_Pokeball[]; extern const u32 gBattleAnimSpritePal_LetterZ[]; extern const u32 gBattleAnimSpritePal_RapidSpin[]; extern const u32 gBattleAnimSpritePal_TriAttackTriangle[]; extern const u32 gBattleAnimSpritePal_WispOrb[]; extern const u32 gBattleAnimSpritePal_GoldStars[]; extern const u32 gBattleAnimSpritePal_EclipsingOrb[]; extern const u32 gBattleAnimSpritePal_GrayOrb[]; extern const u32 gBattleAnimSpritePal_BlueOrb[]; extern const u32 gBattleAnimSpritePal_RedOrb2[]; extern const u32 gBattleAnimSpritePal_PinkPetal[]; extern const u32 gBattleAnimSpritePal_PainSplit[]; extern const u32 gBattleAnimSpritePal_Confetti[]; extern const u32 gBattleAnimSpritePal_GreenStar[]; extern const u32 gBattleAnimSpritePal_PinkCloud[]; extern const u32 gBattleAnimSpritePal_SweatDrop[]; extern const u32 gBattleAnimSpritePal_GuardRing[]; extern const u32 gBattleAnimSpritePal_PurpleScratch[]; extern const u32 gBattleAnimSpritePal_SmallRedEye[]; extern const u32 gBattleAnimSpritePal_HollowOrb[]; extern const u32 gBattleAnimSpritePal_BluegreenOrb[]; extern const u32 gBattleAnimSpritePal_PawPrint[]; extern const u32 gBattleAnimSpritePal_PurpleFlame[]; extern const u32 gBattleAnimSpritePal_RedBall[]; extern const u32 gBattleAnimSpritePal_SmellingsaltEffect[]; extern const u32 gBattleAnimSpritePal_Meteor[]; extern const u32 gBattleAnimSpritePal_FlatRock[]; extern const u32 gBattleAnimSpritePal_MagnifyingGlass[]; extern const u32 gBattleAnimSpritePal_BrownOrb[]; extern const u32 gBattleAnimSpritePal_MetalSoundWaves[]; extern const u32 gBattleAnimSpritePal_FlyingDirt[]; extern const u32 gBattleAnimSpritePal_IcicleSpear[]; extern const u32 gBattleAnimSpritePal_Hail[]; extern const u32 gBattleAnimSpritePal_GlowyRedOrb[]; extern const u32 gBattleAnimSpritePal_GlowyGreenOrb[]; extern const u32 gBattleAnimSpritePal_GreenSpike[]; extern const u32 gBattleAnimSpritePal_WhiteCircleOfLight[]; extern const u32 gBattleAnimSpritePal_GlowyBlueOrb[]; extern const u32 gBattleAnimSpritePal_SafariBait[]; extern const u32 gBattleAnimSpritePal_WhiteFeather[]; extern const u32 gBattleAnimSpritePal_Sparkle6[]; extern const u32 gBattleAnimSpritePal_Splash[]; extern const u32 gBattleAnimSpritePal_Gem1[]; extern const u32 gBattleAnimSpritePal_SlamHit2[]; extern const u32 gBattleAnimSpritePal_Recycle[]; extern const u32 gBattleAnimSpritePal_RedParticles[]; extern const u32 gBattleAnimSpritePal_Protect[]; extern const u32 gBattleAnimSpritePal_DirtMound[]; extern const u32 gBattleAnimSpritePal_Shock3[]; extern const u32 gBattleAnimSpritePal_WeatherBall[]; extern const u32 gBattleAnimSpritePal_Bird[]; extern const u32 gBattleAnimSpritePal_CrossImpact[]; extern const u32 gBattleAnimSpritePal_Slash2[]; extern const u32 gBattleAnimSpritePal_WhipHit[]; extern const u32 gBattleAnimSpritePal_BlueRing2[]; // battle anim task extern const u32 gUnusedLevelupAnimationGfx[]; extern const u32 gUnusedLevelupAnimationTilemap[]; extern const u32 gCureBubblesGfx[]; extern const u32 gCureBubblesPal[]; extern const u32 gCureBubblesTilemap[]; extern const u32 gBattleAnimBg_AttractGfx[]; extern const u32 gBattleAnimBg_AttractTilemap[]; extern const u32 gBattleAnimBg_AttractPal[]; extern const u32 gBattleAnim_MorningSunGfx[]; extern const u32 gBattleAnim_MorningSunTilemap[]; extern const u32 gBattleAnim_MorningSunPal[]; // battle bg extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; extern const u32 gBattleAnimBgImage_Psychic[]; extern const u32 gBattleAnimBgImage_Impact[]; extern const u32 gBattleAnimBgImage_Drill[]; extern const u32 gBattleAnimBgImage_Highspeed[]; extern const u32 gBattleAnimBgImage_Thunder[]; extern const u32 gBattleAnimBgImage_Guillotine[]; extern const u32 gBattleAnimBgImage_Ice[]; extern const u32 gBattleAnimBgImage_Cosmic[]; extern const u32 gBattleAnimBgImage_InAir[]; extern const u32 gBattleAnimBgImage_Aurora[]; extern const u32 gBattleAnimBgImage_Fissure[]; extern const u32 gBattleAnimBgImage_Surf[]; extern const u32 gBattleAnimBgPalette_Dark[]; extern const u32 gBattleAnimBgPalette_Ghost[]; extern const u32 gBattleAnimBgPalette_Psychic[]; extern const u32 gBattleAnimBgPalette_Impact[]; extern const u32 gBattleAnimBgPalette_Drill[]; extern const u32 gBattleAnimBgPalette_Highspeed[]; extern const u32 gBattleAnimBgPalette_Thunder[]; extern const u32 gBattleAnimBgPalette_Guillotine[]; extern const u32 gBattleAnimBgPalette_Ice[]; extern const u32 gBattleAnimBgPalette_Cosmic[]; extern const u32 gBattleAnimBgPalette_InAir[]; extern const u32 gBattleAnimBgPalette_MuddyWater[]; extern const u32 gBattleAnimBgPalette_Sky[]; extern const u32 gBattleAnimBgPalette_Aurora[]; extern const u32 gBattleAnimBgPalette_Fissure[]; extern const u32 gBattleAnimBgPalette_Bug[]; extern const u32 gBattleAnimBgPalette_SolarBeam[]; extern const u32 gBattleAnimBgPalette_Surf[]; extern const u32 gBattleAnimBgTilemap_Dark[]; extern const u32 gBattleAnimBgTilemap_Ghost[]; extern const u32 gBattleAnimBgTilemap_Psychic[]; extern const u32 gBattleAnimBgTilemap_ImpactOpponent[]; extern const u32 gBattleAnimBgTilemap_ImpactPlayer[]; extern const u32 gBattleAnimBgTilemap_ImpactContests[]; extern const u32 gBattleAnimBgTilemap_Drill[]; extern const u32 gBattleAnimBgTilemap_DrillContests[]; extern const u32 gBattleAnimBgTilemap_HighspeedOpponent[]; extern const u32 gBattleAnimBgTilemap_HighspeedPlayer[]; extern const u32 gBattleAnimBgTilemap_Thunder[]; extern const u32 gBattleAnimBgTilemap_GuillotineOpponent[]; extern const u32 gBattleAnimBgTilemap_GuillotinePlayer[]; extern const u32 gBattleAnimBgTilemap_GuillotineContests[]; extern const u32 gBattleAnimBgTilemap_Ice[]; extern const u32 gBattleAnimBgTilemap_Cosmic[]; extern const u32 gBattleAnimBgTilemap_InAir[]; extern const u32 gBattleAnimBgTilemap_Aurora[]; extern const u32 gBattleAnimBgTilemap_Fissure[]; extern const u32 gBattleAnimBgTilemap_SurfOpponent[]; extern const u32 gBattleAnimBgTilemap_SurfPlayer[]; extern const u32 gBattleAnimBgTilemap_SurfContest[]; // dark extern const u32 gMetalShineGfx[]; extern const u32 gMetalShinePalette[]; extern const u32 gMetalShineTilemap[]; // ghost extern const u32 gFile_graphics_battle_anims_backgrounds_scary_face_sheet[]; extern const u32 gFile_graphics_battle_anims_backgrounds_scary_face_palette[]; extern const u32 gFile_graphics_battle_anims_backgrounds_scary_face_player_tilemap[]; // rock extern const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap[]; extern const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet[]; extern const u32 gBattleAnimSpritePal_FlyingDirt[]; // title_screen extern const u16 gGraphics_TitleScreen_GameTitleLogoPals_FR[]; extern const u16 gGraphics_TitleScreen_GameTitleLogoPals_LG[]; extern const u8 gGraphics_TitleScreen_GameTitleLogoTiles_FR[]; extern const u8 gGraphics_TitleScreen_GameTitleLogoTiles_LG[]; extern const u8 gGraphics_TitleScreen_GameTitleLogoMap_FR[]; extern const u8 gGraphics_TitleScreen_GameTitleLogoMap_LG[]; extern const u16 gGraphics_TitleScreen_BoxArtMonPals_FR[]; extern const u16 gGraphics_TitleScreen_BoxArtMonPals_LG[]; extern const u8 gGraphics_TitleScreen_BoxArtMonTiles_FR[]; extern const u8 gGraphics_TitleScreen_BoxArtMonTiles_LG[]; extern const u8 gGraphics_TitleScreen_BoxArtMonMap_FR[]; extern const u8 gGraphics_TitleScreen_BoxArtMonMap_LG[]; extern u16 gGraphics_TitleScreen_BackgroundPals_FR[]; // If this is const, title_screen.c does not match extern u16 gGraphics_TitleScreen_BackgroundPals_LG[]; // If this is const, title_screen.c does not match extern const u8 gGraphics_TitleScreen_CopyrightPressStartTiles[]; extern const u8 gGraphics_TitleScreen_CopyrightPressStartMap[]; extern const u16 gTitleScreen_Slash_Pal_FR[]; extern const u16 gTitleScreen_Slash_Pal_LG[]; extern const u32 gTitleScreen_BlankSprite_Tiles[]; // battle_gfx_sfx_util extern const u32 gHealthboxSinglesPlayerGfx[]; extern const u32 gHealthboxSinglesOpponentGfx[]; extern const u32 gHealthboxDoublesPlayerGfx[]; extern const u32 gHealthboxDoublesOpponentGfx[]; extern const u32 gHealthboxSafariGfx[]; extern const u32 gBlankGfxCompressed[]; extern const u32 gInterfaceGfx_HPNumbers[]; extern const u32 gGhostFrontPic[]; extern const u32 gGhostPalette[]; extern const u32 gSubstituteDollGfx[]; extern const u32 gSubstituteDollTilemap[]; extern const u32 gSubstituteDollPal[]; // ice extern const u8 gWeatherFogHorizontalTiles[]; extern const u32 gBattleAnimFogTilemap[]; extern const u16 gDefaultWeatherSpritePalette[]; // party_menu extern const u32 gPartyMenuPokeball_Gfx[]; extern const u32 gPartyMenuPokeball_Pal[]; extern const u32 gPartyMenuPokeballSmall_Gfx[]; extern const u32 gStatusGfx_Icons[]; extern const u32 gStatusPal_Icons[]; extern const u32 gPartyMenuBg_Gfx[]; extern const u32 gPartyMenuBg_Tilemap[]; extern const u32 gPartyMenuBg_Pal[]; // credits extern const u32 gCreditsMonPokeball_Tiles[]; extern const u32 gCreditsMonPokeball_Tilemap[]; extern const u16 gCreditsMonPokeball_Pals[][16]; extern const u16 gCreditsCopyright_Pal[]; extern const u8 gCreditsCopyright_Tiles[]; extern const u8 gCreditsCopyright_Tilemap[]; // berry_pouch extern const u32 gBerryPouchSpriteTiles[]; extern const u8 gBerryPouchBgGfx[]; extern const u32 gBerryPouchBgPals[]; extern const u32 gBerryPouchBgPal0FemaleOverride[]; extern const u32 gBerryPouchSpritePalette[]; extern const u8 gBerryPouchBg1Tilemap[]; extern const u8 gTrainerBackPic_Red[]; extern const u8 gTrainerBackPic_Leaf[]; extern const u8 gTrainerBackPic_Pokedude[]; extern const u8 gTrainerBackPic_OldMan[]; extern const u8 gTrainerBackPic_RSBrendan[]; extern const u8 gTrainerBackPic_RSMay[]; extern const u8 gTrainerBackPic_EmBrendan[]; extern const u8 gTrainerBackPic_EmMay[]; // mail extern const u16 gFile_graphics_mail_orange_palette_pal[]; extern const u16 gFile_graphics_mail_harbor_palette_pal[]; extern const u16 gFile_graphics_mail_glitter_palette_pal[]; extern const u16 gFile_graphics_mail_mech_palette_pal[]; extern const u16 gFile_graphics_mail_wood_palette_pal[]; extern const u16 gFile_graphics_mail_wave_palette_pal[]; extern const u16 gFile_graphics_mail_bead_palette_pal[]; extern const u16 gFile_graphics_mail_shadow_palette_pal[]; extern const u16 gFile_graphics_mail_tropic_palette_pal[]; extern const u16 gFile_graphics_mail_dream_palette_pal[]; extern const u16 gFile_graphics_mail_fab_palette_pal[]; extern const u16 gFile_graphics_mail_retro_palette_pal[]; extern const u32 gFile_graphics_mail_orange_tiles_sheet[]; extern const u32 gFile_graphics_mail_harbor_tiles_sheet[]; extern const u32 gFile_graphics_mail_glitter_tiles_sheet[]; extern const u32 gFile_graphics_mail_mech_tiles_sheet[]; extern const u32 gFile_graphics_mail_wood_tiles_sheet[]; extern const u32 gFile_graphics_mail_wave_tiles_sheet[]; extern const u32 gFile_graphics_mail_bead_tiles_sheet[]; extern const u32 gFile_graphics_mail_shadow_tiles_sheet[]; extern const u32 gFile_graphics_mail_tropic_tiles_sheet[]; extern const u32 gFile_graphics_mail_dream_tiles_sheet[]; extern const u32 gFile_graphics_mail_fab_tiles_sheet[]; extern const u32 gFile_graphics_mail_retro_tiles_sheet[]; extern const u32 gFile_graphics_mail_orange_map_tilemap[]; extern const u32 gFile_graphics_mail_harbor_map_tilemap[]; extern const u32 gFile_graphics_mail_glitter_map_tilemap[]; extern const u32 gFile_graphics_mail_mech_map_tilemap[]; extern const u32 gFile_graphics_mail_wood_map_tilemap[]; extern const u32 gFile_graphics_mail_wave_map_tilemap[]; extern const u32 gFile_graphics_mail_bead_map_tilemap[]; extern const u32 gFile_graphics_mail_shadow_map_tilemap[]; extern const u32 gFile_graphics_mail_tropic_map_tilemap[]; extern const u32 gFile_graphics_mail_dream_map_tilemap[]; extern const u32 gFile_graphics_mail_fab_map_tilemap[]; extern const u32 gFile_graphics_mail_retro_map_tilemap[]; // pokemon_icons extern const u8 gMonIcon_Bulbasaur[]; extern const u8 gMonIcon_Ivysaur[]; extern const u8 gMonIcon_Venusaur[]; extern const u8 gMonIcon_Charmander[]; extern const u8 gMonIcon_Charmeleon[]; extern const u8 gMonIcon_Charizard[]; extern const u8 gMonIcon_Squirtle[]; extern const u8 gMonIcon_Wartortle[]; extern const u8 gMonIcon_Blastoise[]; extern const u8 gMonIcon_Caterpie[]; extern const u8 gMonIcon_Metapod[]; extern const u8 gMonIcon_Butterfree[]; extern const u8 gMonIcon_Weedle[]; extern const u8 gMonIcon_Kakuna[]; extern const u8 gMonIcon_Beedrill[]; extern const u8 gMonIcon_Pidgey[]; extern const u8 gMonIcon_Pidgeotto[]; extern const u8 gMonIcon_Pidgeot[]; extern const u8 gMonIcon_Rattata[]; extern const u8 gMonIcon_Raticate[]; extern const u8 gMonIcon_Spearow[]; extern const u8 gMonIcon_Fearow[]; extern const u8 gMonIcon_Ekans[]; extern const u8 gMonIcon_Arbok[]; extern const u8 gMonIcon_Pikachu[]; extern const u8 gMonIcon_Raichu[]; extern const u8 gMonIcon_Sandshrew[]; extern const u8 gMonIcon_Sandslash[]; extern const u8 gMonIcon_Nidoran_f[]; extern const u8 gMonIcon_Nidorina[]; extern const u8 gMonIcon_Nidoqueen[]; extern const u8 gMonIcon_Nidoran_m[]; extern const u8 gMonIcon_Nidorino[]; extern const u8 gMonIcon_Nidoking[]; extern const u8 gMonIcon_Clefairy[]; extern const u8 gMonIcon_Clefable[]; extern const u8 gMonIcon_Vulpix[]; extern const u8 gMonIcon_Ninetales[]; extern const u8 gMonIcon_Jigglypuff[]; extern const u8 gMonIcon_Wigglytuff[]; extern const u8 gMonIcon_Zubat[]; extern const u8 gMonIcon_Golbat[]; extern const u8 gMonIcon_Oddish[]; extern const u8 gMonIcon_Gloom[]; extern const u8 gMonIcon_Vileplume[]; extern const u8 gMonIcon_Paras[]; extern const u8 gMonIcon_Parasect[]; extern const u8 gMonIcon_Venonat[]; extern const u8 gMonIcon_Venomoth[]; extern const u8 gMonIcon_Diglett[]; extern const u8 gMonIcon_Dugtrio[]; extern const u8 gMonIcon_Meowth[]; extern const u8 gMonIcon_Persian[]; extern const u8 gMonIcon_Psyduck[]; extern const u8 gMonIcon_Golduck[]; extern const u8 gMonIcon_Mankey[]; extern const u8 gMonIcon_Primeape[]; extern const u8 gMonIcon_Growlithe[]; extern const u8 gMonIcon_Arcanine[]; extern const u8 gMonIcon_Poliwag[]; extern const u8 gMonIcon_Poliwhirl[]; extern const u8 gMonIcon_Poliwrath[]; extern const u8 gMonIcon_Abra[]; extern const u8 gMonIcon_Kadabra[]; extern const u8 gMonIcon_Alakazam[]; extern const u8 gMonIcon_Machop[]; extern const u8 gMonIcon_Machoke[]; extern const u8 gMonIcon_Machamp[]; extern const u8 gMonIcon_Bellsprout[]; extern const u8 gMonIcon_Weepinbell[]; extern const u8 gMonIcon_Victreebel[]; extern const u8 gMonIcon_Tentacool[]; extern const u8 gMonIcon_Tentacruel[]; extern const u8 gMonIcon_Geodude[]; extern const u8 gMonIcon_Graveler[]; extern const u8 gMonIcon_Golem[]; extern const u8 gMonIcon_Ponyta[]; extern const u8 gMonIcon_Rapidash[]; extern const u8 gMonIcon_Slowpoke[]; extern const u8 gMonIcon_Slowbro[]; extern const u8 gMonIcon_Magnemite[]; extern const u8 gMonIcon_Magneton[]; extern const u8 gMonIcon_Farfetchd[]; extern const u8 gMonIcon_Doduo[]; extern const u8 gMonIcon_Dodrio[]; extern const u8 gMonIcon_Seel[]; extern const u8 gMonIcon_Dewgong[]; extern const u8 gMonIcon_Grimer[]; extern const u8 gMonIcon_Muk[]; extern const u8 gMonIcon_Shellder[]; extern const u8 gMonIcon_Cloyster[]; extern const u8 gMonIcon_Gastly[]; extern const u8 gMonIcon_Haunter[]; extern const u8 gMonIcon_Gengar[]; extern const u8 gMonIcon_Onix[]; extern const u8 gMonIcon_Drowzee[]; extern const u8 gMonIcon_Hypno[]; extern const u8 gMonIcon_Krabby[]; extern const u8 gMonIcon_Kingler[]; extern const u8 gMonIcon_Voltorb[]; extern const u8 gMonIcon_Electrode[]; extern const u8 gMonIcon_Exeggcute[]; extern const u8 gMonIcon_Exeggutor[]; extern const u8 gMonIcon_Cubone[]; extern const u8 gMonIcon_Marowak[]; extern const u8 gMonIcon_Hitmonlee[]; extern const u8 gMonIcon_Hitmonchan[]; extern const u8 gMonIcon_Lickitung[]; extern const u8 gMonIcon_Koffing[]; extern const u8 gMonIcon_Weezing[]; extern const u8 gMonIcon_Rhyhorn[]; extern const u8 gMonIcon_Rhydon[]; extern const u8 gMonIcon_Chansey[]; extern const u8 gMonIcon_Tangela[]; extern const u8 gMonIcon_Kangaskhan[]; extern const u8 gMonIcon_Horsea[]; extern const u8 gMonIcon_Seadra[]; extern const u8 gMonIcon_Goldeen[]; extern const u8 gMonIcon_Seaking[]; extern const u8 gMonIcon_Staryu[]; extern const u8 gMonIcon_Starmie[]; extern const u8 gMonIcon_Mr_Mime[]; extern const u8 gMonIcon_Scyther[]; extern const u8 gMonIcon_Jynx[]; extern const u8 gMonIcon_Electabuzz[]; extern const u8 gMonIcon_Magmar[]; extern const u8 gMonIcon_Pinsir[]; extern const u8 gMonIcon_Tauros[]; extern const u8 gMonIcon_Magikarp[]; extern const u8 gMonIcon_Gyarados[]; extern const u8 gMonIcon_Lapras[]; extern const u8 gMonIcon_Ditto[]; extern const u8 gMonIcon_Eevee[]; extern const u8 gMonIcon_Vaporeon[]; extern const u8 gMonIcon_Jolteon[]; extern const u8 gMonIcon_Flareon[]; extern const u8 gMonIcon_Porygon[]; extern const u8 gMonIcon_Omanyte[]; extern const u8 gMonIcon_Omastar[]; extern const u8 gMonIcon_Kabuto[]; extern const u8 gMonIcon_Kabutops[]; extern const u8 gMonIcon_Aerodactyl[]; extern const u8 gMonIcon_Snorlax[]; extern const u8 gMonIcon_Articuno[]; extern const u8 gMonIcon_Zapdos[]; extern const u8 gMonIcon_Moltres[]; extern const u8 gMonIcon_Dratini[]; extern const u8 gMonIcon_Dragonair[]; extern const u8 gMonIcon_Dragonite[]; extern const u8 gMonIcon_Mewtwo[]; extern const u8 gMonIcon_Mew[]; extern const u8 gMonIcon_Chikorita[]; extern const u8 gMonIcon_Bayleef[]; extern const u8 gMonIcon_Meganium[]; extern const u8 gMonIcon_Cyndaquil[]; extern const u8 gMonIcon_Quilava[]; extern const u8 gMonIcon_Typhlosion[]; extern const u8 gMonIcon_Totodile[]; extern const u8 gMonIcon_Croconaw[]; extern const u8 gMonIcon_Feraligatr[]; extern const u8 gMonIcon_Sentret[]; extern const u8 gMonIcon_Furret[]; extern const u8 gMonIcon_Hoothoot[]; extern const u8 gMonIcon_Noctowl[]; extern const u8 gMonIcon_Ledyba[]; extern const u8 gMonIcon_Ledian[]; extern const u8 gMonIcon_Spinarak[]; extern const u8 gMonIcon_Ariados[]; extern const u8 gMonIcon_Crobat[]; extern const u8 gMonIcon_Chinchou[]; extern const u8 gMonIcon_Lanturn[]; extern const u8 gMonIcon_Pichu[]; extern const u8 gMonIcon_Cleffa[]; extern const u8 gMonIcon_Igglybuff[]; extern const u8 gMonIcon_Togepi[]; extern const u8 gMonIcon_Togetic[]; extern const u8 gMonIcon_Natu[]; extern const u8 gMonIcon_Xatu[]; extern const u8 gMonIcon_Mareep[]; extern const u8 gMonIcon_Flaaffy[]; extern const u8 gMonIcon_Ampharos[]; extern const u8 gMonIcon_Bellossom[]; extern const u8 gMonIcon_Marill[]; extern const u8 gMonIcon_Azumarill[]; extern const u8 gMonIcon_Sudowoodo[]; extern const u8 gMonIcon_Politoed[]; extern const u8 gMonIcon_Hoppip[]; extern const u8 gMonIcon_Skiploom[]; extern const u8 gMonIcon_Jumpluff[]; extern const u8 gMonIcon_Aipom[]; extern const u8 gMonIcon_Sunkern[]; extern const u8 gMonIcon_Sunflora[]; extern const u8 gMonIcon_Yanma[]; extern const u8 gMonIcon_Wooper[]; extern const u8 gMonIcon_Quagsire[]; extern const u8 gMonIcon_Espeon[]; extern const u8 gMonIcon_Umbreon[]; extern const u8 gMonIcon_Murkrow[]; extern const u8 gMonIcon_Slowking[]; extern const u8 gMonIcon_Misdreavus[]; extern const u8 gMonIcon_Unown_A[]; extern const u8 gMonIcon_Wobbuffet[]; extern const u8 gMonIcon_Girafarig[]; extern const u8 gMonIcon_Pineco[]; extern const u8 gMonIcon_Forretress[]; extern const u8 gMonIcon_Dunsparce[]; extern const u8 gMonIcon_Gligar[]; extern const u8 gMonIcon_Steelix[]; extern const u8 gMonIcon_Snubbull[]; extern const u8 gMonIcon_Granbull[]; extern const u8 gMonIcon_Qwilfish[]; extern const u8 gMonIcon_Scizor[]; extern const u8 gMonIcon_Shuckle[]; extern const u8 gMonIcon_Heracross[]; extern const u8 gMonIcon_Sneasel[]; extern const u8 gMonIcon_Teddiursa[]; extern const u8 gMonIcon_Ursaring[]; extern const u8 gMonIcon_Slugma[]; extern const u8 gMonIcon_Magcargo[]; extern const u8 gMonIcon_Swinub[]; extern const u8 gMonIcon_Piloswine[]; extern const u8 gMonIcon_Corsola[]; extern const u8 gMonIcon_Remoraid[]; extern const u8 gMonIcon_Octillery[]; extern const u8 gMonIcon_Delibird[]; extern const u8 gMonIcon_Mantine[]; extern const u8 gMonIcon_Skarmory[]; extern const u8 gMonIcon_Houndour[]; extern const u8 gMonIcon_Houndoom[]; extern const u8 gMonIcon_Kingdra[]; extern const u8 gMonIcon_Phanpy[]; extern const u8 gMonIcon_Donphan[]; extern const u8 gMonIcon_Porygon2[]; extern const u8 gMonIcon_Stantler[]; extern const u8 gMonIcon_Smeargle[]; extern const u8 gMonIcon_Tyrogue[]; extern const u8 gMonIcon_Hitmontop[]; extern const u8 gMonIcon_Smoochum[]; extern const u8 gMonIcon_Elekid[]; extern const u8 gMonIcon_Magby[]; extern const u8 gMonIcon_Miltank[]; extern const u8 gMonIcon_Blissey[]; extern const u8 gMonIcon_Raikou[]; extern const u8 gMonIcon_Entei[]; extern const u8 gMonIcon_Suicune[]; extern const u8 gMonIcon_Larvitar[]; extern const u8 gMonIcon_Pupitar[]; extern const u8 gMonIcon_Tyranitar[]; extern const u8 gMonIcon_Lugia[]; extern const u8 gMonIcon_Ho_Oh[]; extern const u8 gMonIcon_Celebi[]; extern const u8 gMonIcon_Treecko[]; extern const u8 gMonIcon_Grovyle[]; extern const u8 gMonIcon_Sceptile[]; extern const u8 gMonIcon_Torchic[]; extern const u8 gMonIcon_Combusken[]; extern const u8 gMonIcon_Blaziken[]; extern const u8 gMonIcon_Mudkip[]; extern const u8 gMonIcon_Marshtomp[]; extern const u8 gMonIcon_Swampert[]; extern const u8 gMonIcon_Poochyena[]; extern const u8 gMonIcon_Mightyena[]; extern const u8 gMonIcon_Zigzagoon[]; extern const u8 gMonIcon_Linoone[]; extern const u8 gMonIcon_Wurmple[]; extern const u8 gMonIcon_Silcoon[]; extern const u8 gMonIcon_Beautifly[]; extern const u8 gMonIcon_Cascoon[]; extern const u8 gMonIcon_Dustox[]; extern const u8 gMonIcon_Lotad[]; extern const u8 gMonIcon_Lombre[]; extern const u8 gMonIcon_Ludicolo[]; extern const u8 gMonIcon_Seedot[]; extern const u8 gMonIcon_Nuzleaf[]; extern const u8 gMonIcon_Shiftry[]; extern const u8 gMonIcon_Nincada[]; extern const u8 gMonIcon_Ninjask[]; extern const u8 gMonIcon_Shedinja[]; extern const u8 gMonIcon_Taillow[]; extern const u8 gMonIcon_Swellow[]; extern const u8 gMonIcon_Shroomish[]; extern const u8 gMonIcon_Breloom[]; extern const u8 gMonIcon_Spinda[]; extern const u8 gMonIcon_Wingull[]; extern const u8 gMonIcon_Pelipper[]; extern const u8 gMonIcon_Surskit[]; extern const u8 gMonIcon_Masquerain[]; extern const u8 gMonIcon_Wailmer[]; extern const u8 gMonIcon_Wailord[]; extern const u8 gMonIcon_Skitty[]; extern const u8 gMonIcon_Delcatty[]; extern const u8 gMonIcon_Kecleon[]; extern const u8 gMonIcon_Baltoy[]; extern const u8 gMonIcon_Claydol[]; extern const u8 gMonIcon_Nosepass[]; extern const u8 gMonIcon_Torkoal[]; extern const u8 gMonIcon_Sableye[]; extern const u8 gMonIcon_Barboach[]; extern const u8 gMonIcon_Whiscash[]; extern const u8 gMonIcon_Luvdisc[]; extern const u8 gMonIcon_Corphish[]; extern const u8 gMonIcon_Crawdaunt[]; extern const u8 gMonIcon_Feebas[]; extern const u8 gMonIcon_Milotic[]; extern const u8 gMonIcon_Carvanha[]; extern const u8 gMonIcon_Sharpedo[]; extern const u8 gMonIcon_Trapinch[]; extern const u8 gMonIcon_Vibrava[]; extern const u8 gMonIcon_Flygon[]; extern const u8 gMonIcon_Makuhita[]; extern const u8 gMonIcon_Hariyama[]; extern const u8 gMonIcon_Electrike[]; extern const u8 gMonIcon_Manectric[]; extern const u8 gMonIcon_Numel[]; extern const u8 gMonIcon_Camerupt[]; extern const u8 gMonIcon_Spheal[]; extern const u8 gMonIcon_Sealeo[]; extern const u8 gMonIcon_Walrein[]; extern const u8 gMonIcon_Cacnea[]; extern const u8 gMonIcon_Cacturne[]; extern const u8 gMonIcon_Snorunt[]; extern const u8 gMonIcon_Glalie[]; extern const u8 gMonIcon_Lunatone[]; extern const u8 gMonIcon_Solrock[]; extern const u8 gMonIcon_Azurill[]; extern const u8 gMonIcon_Spoink[]; extern const u8 gMonIcon_Grumpig[]; extern const u8 gMonIcon_Plusle[]; extern const u8 gMonIcon_Minun[]; extern const u8 gMonIcon_Mawile[]; extern const u8 gMonIcon_Meditite[]; extern const u8 gMonIcon_Medicham[]; extern const u8 gMonIcon_Swablu[]; extern const u8 gMonIcon_Altaria[]; extern const u8 gMonIcon_Wynaut[]; extern const u8 gMonIcon_Duskull[]; extern const u8 gMonIcon_Dusclops[]; extern const u8 gMonIcon_Roselia[]; extern const u8 gMonIcon_Slakoth[]; extern const u8 gMonIcon_Vigoroth[]; extern const u8 gMonIcon_Slaking[]; extern const u8 gMonIcon_Gulpin[]; extern const u8 gMonIcon_Swalot[]; extern const u8 gMonIcon_Tropius[]; extern const u8 gMonIcon_Whismur[]; extern const u8 gMonIcon_Loudred[]; extern const u8 gMonIcon_Exploud[]; extern const u8 gMonIcon_Clamperl[]; extern const u8 gMonIcon_Huntail[]; extern const u8 gMonIcon_Gorebyss[]; extern const u8 gMonIcon_Absol[]; extern const u8 gMonIcon_Shuppet[]; extern const u8 gMonIcon_Banette[]; extern const u8 gMonIcon_Seviper[]; extern const u8 gMonIcon_Zangoose[]; extern const u8 gMonIcon_Relicanth[]; extern const u8 gMonIcon_Aron[]; extern const u8 gMonIcon_Lairon[]; extern const u8 gMonIcon_Aggron[]; extern const u8 gMonIcon_Castform[]; extern const u8 gMonIcon_Volbeat[]; extern const u8 gMonIcon_Illumise[]; extern const u8 gMonIcon_Lileep[]; extern const u8 gMonIcon_Cradily[]; extern const u8 gMonIcon_Anorith[]; extern const u8 gMonIcon_Armaldo[]; extern const u8 gMonIcon_Ralts[]; extern const u8 gMonIcon_Kirlia[]; extern const u8 gMonIcon_Gardevoir[]; extern const u8 gMonIcon_Bagon[]; extern const u8 gMonIcon_Shelgon[]; extern const u8 gMonIcon_Salamence[]; extern const u8 gMonIcon_Beldum[]; extern const u8 gMonIcon_Metang[]; extern const u8 gMonIcon_Metagross[]; extern const u8 gMonIcon_Regirock[]; extern const u8 gMonIcon_Regice[]; extern const u8 gMonIcon_Registeel[]; extern const u8 gMonIcon_Kyogre[]; extern const u8 gMonIcon_Groudon[]; extern const u8 gMonIcon_Rayquaza[]; extern const u8 gMonIcon_Latias[]; extern const u8 gMonIcon_Latios[]; extern const u8 gMonIcon_Jirachi[]; extern const u8 gMonIcon_Deoxys[]; extern const u8 gMonIcon_Chimecho[]; extern const u8 gMonIcon_Egg[]; extern const u8 gMonIcon_Unown_B[]; extern const u8 gMonIcon_Unown_C[]; extern const u8 gMonIcon_Unown_D[]; extern const u8 gMonIcon_Unown_E[]; extern const u8 gMonIcon_Unown_F[]; extern const u8 gMonIcon_Unown_G[]; extern const u8 gMonIcon_Unown_H[]; extern const u8 gMonIcon_Unown_I[]; extern const u8 gMonIcon_Unown_J[]; extern const u8 gMonIcon_Unown_K[]; extern const u8 gMonIcon_Unown_L[]; extern const u8 gMonIcon_Unown_M[]; extern const u8 gMonIcon_Unown_N[]; extern const u8 gMonIcon_Unown_O[]; extern const u8 gMonIcon_Unown_P[]; extern const u8 gMonIcon_Unown_Q[]; extern const u8 gMonIcon_Unown_R[]; extern const u8 gMonIcon_Unown_S[]; extern const u8 gMonIcon_Unown_T[]; extern const u8 gMonIcon_Unown_U[]; extern const u8 gMonIcon_Unown_V[]; extern const u8 gMonIcon_Unown_W[]; extern const u8 gMonIcon_Unown_X[]; extern const u8 gMonIcon_Unown_Y[]; extern const u8 gMonIcon_Unown_Z[]; extern const u8 gMonIcon_Unown_ExclamationMark[]; extern const u8 gMonIcon_Unown_QuestionMark[]; extern const u8 gMonIcon_QuestionMark[]; // trade extern const u16 gTradeMenu_Pal[]; extern const u16 gTradeCursor_Pal[]; extern const u16 gTradeMenu_Gfx[]; extern const u16 gTradeMenu_Tilemap[]; extern const u16 gTradeCursor_Gfx[]; extern const u16 gTradeMenuMonBox_Tilemap[]; // mon_markings extern const u16 gMonMarkingsMenu_Gfx[]; extern const u16 gMonMarkingsMenu_Pal[]; // hall_of_fame extern const u32 gFile_graphics_misc_confetti_sheet[]; extern const u32 gFile_graphics_misc_confetti_palette[]; // learn_move extern const u16 gMoveRelearner_Pal[]; extern const u32 gMoveRelearner_Gfx[]; extern const u32 gMoveRelearner_Tilemap[]; // shop menu extern const u32 gBuyMenuFrame_Gfx[]; extern const u32 gBuyMenuFrame_Tilemap[]; extern const u32 gBuyMenuFrame_TmHmTilemap[]; extern const u32 gBuyMenuFrame_Pal[]; // battle_message extern const u16 gPPTextPalette[]; // trainer card extern const u16 gKantoTrainerCardBlue_Pal[]; extern const u32 gKantoTrainerCard_Gfx[]; extern const u16 gHoennTrainerCardGreen_Pal[]; extern const u32 gHoennTrainerCard_Gfx[]; // battle_interface extern const u32 gBattleInterface_Textbox_Gfx[]; extern const u32 gBattleInterface_Textbox_Pal[]; extern const u32 gBattleInterface_Textbox_Tilemap[]; extern const u32 gBattleInterface_PartySummaryBar_Gfx[]; extern const u8 gBattleInterface_Gfx[][32]; extern const u16 gBattleInterface_Healthbox_Pal[]; extern const u16 gBattleInterface_Healthbar_Pal[]; extern const u8 gNuzlockeFirstEncounterIndicator[]; // item_menu extern const u32 gBagBg_Gfx[]; extern const u32 gBagBg_Tilemap[]; extern const u32 gBagBg_ItemPC_Tilemap[]; extern const u32 gBagBgPalette[]; extern const u32 gBagBgPalette_FemaleOverride[]; // union_room_chat_display extern const u16 gUnionRoomChat_Panel_Pal[]; extern const u32 gUnionRoomChat_Panel_Gfx[]; extern const u32 gUnionRoomChat_Panel_Tilemap[]; extern const u16 gUnionRoomChat_Bg_Pal[]; extern const u32 gUnionRoomChat_Bg_Gfx[]; extern const u32 gUnionRoomChat_Bg_Tilemap[]; // union_room_chat_objects extern const u32 gUnionRoomChat_Icons_Gfx[]; // battle_bg extern const u32 gFile_graphics_battle_transitions_vs_frame_sheet[]; extern const u32 gVsLettersGfx[]; extern const u32 gFile_graphics_battle_transitions_vs_frame_palette[]; extern const u32 gFile_graphics_battle_transitions_vs_frame_tilemap[]; // berry_crush extern const u16 gBerryCrush_Crusher_Pal[]; extern const u32 gBerryCrush_Crusher_Gfx[]; extern const u32 gBerryCrush_TextWindows_Tilemap[]; // easy_chat_3 extern const u32 gEasyChatWindow_Gfx[]; extern const u32 gEasyChatWindow_Tilemap[]; extern const u32 gEasyChatWindow_Pal[]; extern const u16 gEasyChatButtonWindow_Pal[]; extern const u32 gEasyChatRectangleCursor_Gfx[]; extern const u32 gEasyChatButtonWindow_Gfx[]; extern const u32 gEasyChatMode_Gfx[]; // naming_screen extern const u32 gNamingScreenBackground_Tilemap[]; extern const u32 gNamingScreenKeyboardLower_Tilemap[]; extern const u32 gNamingScreenKeyboardUpper_Tilemap[]; extern const u32 gNamingScreenKeyboardSymbols_Tilemap[]; extern const u32 gNamingScreenMenu_Gfx[]; extern const u16 gNamingScreenRival_Pal[]; extern const u16 gNamingScreenKeyboard_Pal[]; extern const u16 gNamingScreenMenu_Pal[6][16]; extern const u16 gNamingScreenBackButton_Gfx[]; extern const u16 gNamingScreenOKButton_Gfx[]; extern const u16 gNamingScreenPageSwapFrame_Gfx[]; extern const u16 gNamingScreenPageSwapButton_Gfx[]; extern const u16 gNamingScreenPageSwapUpper_Gfx[]; extern const u16 gNamingScreenPageSwapLower_Gfx[]; extern const u16 gNamingScreenPageSwapOthers_Gfx[]; extern const u16 gNamingScreenCursor_Gfx[]; extern const u16 gNamingScreenCursorSquished_Gfx[]; extern const u16 gNamingScreenCursorFilled_Gfx[]; extern const u16 gNamingScreenInputArrow_Gfx[]; extern const u16 gNamingScreenUnderscore_Gfx[]; // pokemon_storage_system extern const u32 gPokeStorageMenu_Gfx[]; extern const u32 gPokeStoragePartyMenu_Tilemap[]; extern const u16 gPokeStoragePartyMenu_Pal[]; extern const u16 gPokeStorageInterface_Pal[]; extern const u16 gPokeStorageInterface_NoDisplayMon_Pal[]; // pokedex_screen extern const u16 gDexScreen_TopMenuIconPals_AtoZ[]; extern const u32 gDexScreen_TopMenuIconTiles_AtoZ[]; // Cable Car extern const u32 gCableCarBg_Gfx[]; extern const u16 gCableCarBg_Pal[]; extern const u32 gCableCar_Gfx[]; extern const u32 gCableCarDoor_Gfx[]; extern const u32 gCableCarCable_Gfx[]; extern const u16 gCableCar_Pal[]; #endif //GUARD_GRAPHICS_H ================================================ FILE: include/hall_of_fame.h ================================================ #ifndef GUARD_HALL_OF_FAME_H #define GUARD_HALL_OF_FAME_H #include "global.h" void CB2_DoHallOfFameScreen(void); void CB2_DoHallOfFameScreenDontSaveData(void); void CB2_DoHallOfFamePC(void); void CB2_InitHofPC(void); void HallOfFamePCBeginFade(void); void ReturnFromHallOfFamePC(void); #endif // GUARD_HALL_OF_FAME_H ================================================ FILE: include/heal_location.h ================================================ #ifndef GUARD_HEAL_LOCATION_H #define GUARD_HEAL_LOCATION_H #include "global.h" struct HealLocation { s8 group; s8 map; s16 x; s16 y; }; const struct HealLocation *GetHealLocation(u32 loc); void SetWhiteoutRespawnWarpAndHealerNpc(struct WarpData * warp); #endif // GUARD_HEAL_LOCATION_H ================================================ FILE: include/help_message.h ================================================ #ifndef GUARD_HELP_MESSAGE_H #define GUARD_HELP_MESSAGE_H extern const u8 gHelpMessageWindow_Gfx[]; void DestroyHelpMessageWindow(u8 a0); u8 CreateHelpMessageWindow(void); void PrintTextOnHelpMessageWindow(const u8 * text, u8 mode); void MapNamePopupWindowIdSetDummy(void); void DrawHelpMessageWindowTilesById(u8 windowId); #endif //GUARD_HELP_MESSAGE_H ================================================ FILE: include/help_system.h ================================================ #ifndef GUARD_HELP_SYSTEM_H #define GUARD_HELP_SYSTEM_H #include "global.h" #include "list_menu.h" #include "blit.h" #include "constants/help_system.h" struct HelpSystemListMenu_sub { struct ListMenuItem * items; u16 totalItems; u16 maxShowed; u8 left; u8 top; }; struct HelpSystemListMenu { struct HelpSystemListMenu_sub sub; u8 itemsAbove; u8 cursorPos; u8 state; u8 filler_10[0xC]; }; extern struct HelpSystemListMenu gHelpSystemListMenu; extern struct ListMenuItem gHelpSystemListMenuItems[]; extern bool8 gHelpSystemEnabled; extern bool8 gHelpSystemToggleWithRButtonDisabled; // help_system_812B1E0 void SetHelpContextDontCheckBattle(u8); void SetHelpContextForMap(void); void SetHelpContext(u8); bool8 HelpSystem_UpdateHasntSeenIntro(void); bool8 HelpSystem_IsSinglePlayer(void); void HelpSystem_Disable(void); void HelpSystem_Enable(void); void HelpSystem_EnableToggleWithRButton(void); bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); void HelpSystem_PrintTopicLabel(void); bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 GetHelpSystemMenuLevel(void); // help_system bool8 RunHelpSystemCallback(void); void SaveCallbacks(void); void SaveMapGPURegs(void); void SaveMapTiles(void); void SaveMapTextColors(void); void RestoreCallbacks(void); void RestoreGPURegs(void); void RestoreMapTiles(void); void RestoreMapTextColors(void); void CommitTilemap(void); void HS_BufferFillMapWithTile1FF(void); void HS_ShowOrHideWordHELPinTopLeft(u8 mode); void HS_ShowOrHideControlsGuideInTopRight(u8 mode); void HS_ShowOrHideMainWindowText(u8 mode); void HS_SetMainWindowBgBrightness(u8 mode); void HS_ShowOrHideToplevelTooltipWindow(u8 mode); void HS_ShowOrHideHeaderAndFooterLines_Lighter(u8 mode); void HS_ShowOrHideHeaderAndFooterLines_Darker(u8 mode); void HS_ShowOrHideVerticalBlackBarsAlongSides(u8 mode); void HS_ShowOrHideHeaderLine_Darker_FooterStyle(u8 mode); void HS_ShowOrHideScrollArrows(u8 which, u8 mode); void HelpSystem_PrintTextRightAlign_Row52(const u8 *str); void HelpSystem_PrintTextAt(const u8 *, u8, u8); void HelpSystem_PrintQuestionAndAnswerPair(const u8 *a0, const u8 *a1); void HelpSystem_PrintTopicMouseoverDescription(const u8 *str); void HelpSystem_FillPanel2(void); void HelpSystem_FillPanel1(void); void HelpSystem_InitListMenuController(struct HelpSystemListMenu *, u8, u8); void HelpSystem_SetInputDelay(u8); s32 HelpSystem_GetMenuInput(void); void HS_UpdateMenuScrollArrows(void); void DecompressAndRenderGlyph(u8 fontId, u16 glyph, struct Bitmap *srcBlit, struct Bitmap *destBlit, u8 *destBuffer, u8 x, u8 y, u8 width, u8 height); void HelpSystem_PrintTextInTopLeftCorner(const u8 * str); void HelpSystem_FillPanel3(void); void PrintListMenuItems(void); void PlaceListMenuCursor(void); bool8 MoveCursor(u8 by, u8 dirn); void BackupHelpContext(void); void RestoreHelpContext(void); void HelpSystemRenderText(u8 fontId, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height); void HelpSystem_DisableToggleWithRButton(void); #endif //GUARD_HELP_SYSTEM_H ================================================ FILE: include/image_processing_effects.h ================================================ #ifndef GUARD_IMAGE_PROCESSING_EFFECTS_H #define GUARD_IMAGE_PROCESSING_EFFECTS_H enum { IMAGE_EFFECT_POINTILLISM = 2, IMAGE_EFFECT_GRAYSCALE_LIGHT = 6, IMAGE_EFFECT_BLUR = 8, IMAGE_EFFECT_OUTLINE_COLORED = 9, IMAGE_EFFECT_INVERT_BLACK_WHITE = 10, IMAGE_EFFECT_THICK_BLACK_WHITE = 11, IMAGE_EFFECT_SHIMMER = 13, IMAGE_EFFECT_OUTLINE = 30, IMAGE_EFFECT_INVERT = 31, IMAGE_EFFECT_BLUR_RIGHT = 32, IMAGE_EFFECT_BLUR_DOWN = 33, IMAGE_EFFECT_CHARCOAL = 36, }; enum { QUANTIZE_EFFECT_STANDARD, QUANTIZE_EFFECT_STANDARD_LIMITED_COLORS, QUANTIZE_EFFECT_PRIMARY_COLORS, QUANTIZE_EFFECT_GRAYSCALE, QUANTIZE_EFFECT_GRAYSCALE_SMALL, QUANTIZE_EFFECT_BLACK_WHITE, }; struct ImageProcessingContext { u8 effect; void *canvasPixels; u16 *canvasPalette; u8 fillerC[0x4]; void *dest; u16 quantizeEffect; u16 var_16; u8 paletteStart; u8 columnStart; u8 rowStart; u8 columnEnd; u8 rowEnd; u8 canvasWidth; u8 canvasHeight; u8 personality; }; void ApplyImageProcessingEffects(struct ImageProcessingContext *); void ApplyImageProcessingQuantization(struct ImageProcessingContext *); void ConvertImageProcessingToGBA(struct ImageProcessingContext *); #endif ================================================ FILE: include/intro.h ================================================ #ifndef GUARD_INTRO_H #define GUARD_INTRO_H void CB2_InitCopyrightScreenAfterTitleScreen(void); void CB2_InitCopyrightScreenAfterBootup(void); #endif //GUARD_INTRO_H ================================================ FILE: include/item.h ================================================ #ifndef GUARD_ITEM_H #define GUARD_ITEM_H #include "global.h" typedef void (*ItemUseFunc)(u8); struct Item { u8 name[ITEM_NAME_LENGTH]; u16 itemId; u16 price; u8 holdEffect; u8 holdEffectParam; const u8 *description; u8 importance; u8 registrability; u8 pocket; u8 type; // unused for balls ItemUseFunc fieldUseFunc; u8 battleUsage; ItemUseFunc battleUseFunc; u8 secondaryId; // only used for fishing rods }; struct BagPocket { struct ItemSlot *itemSlots; u8 capacity; }; // Item type IDs (used to determine the exit callback) enum { ITEM_TYPE_MAIL, ITEM_TYPE_PARTY_MENU, ITEM_TYPE_FIELD, ITEM_TYPE_UNUSED, // Used for Pokeblock case in RSE ITEM_TYPE_BAG_MENU, // No exit callback, stays in bag menu }; extern const struct Item gItems[]; extern struct BagPocket gBagPockets[]; extern struct ItemSlot gTmHmItemSlots[BAG_TMHM_COUNT]; extern struct ItemSlot gKeyItemSlots[BAG_KEYITEMS_COUNT]; void GetBerryCountString(u8 *dst, const u8 *berryName, u32 quantity); u16 GetBagItemQuantity(u16 *quantity); void CopyItemName(u16 itemId, u8 *string); void CopyItemNameHandlePlural(u16 itemId, u8 *string, u32 quantity); bool8 IsBagPocketNonEmpty(u8 pocket); bool8 CheckBagHasItem(u16 itemId, u16 count); bool8 CheckBagHasSpace(u16 itemId, u16 count); bool8 RemoveBagItem(u16 itemId, u16 count); u8 GetPocketByItemId(u16 itemId); void ClearItemSlots(struct ItemSlot *itemSlots, u8 b); u8 CountUsedPCItemSlots(void); bool8 CheckPCHasItem(u16 itemId, u16 count); bool8 AddPCItem(u16 itemId, u16 count); void SwapRegisteredBike(void); const u8 *ItemId_GetName(u16 itemId); u16 ItemId_GetId(u16 itemId); u16 ItemId_GetPrice(u16 itemId); u8 ItemId_GetHoldEffect(u16 itemId); u8 ItemId_GetHoldEffectParam(u16 itemId); const u8 *ItemId_GetDescription(u16 itemId); bool32 ItemId_CopyDescription(u8 *a, u32 itemId, u32 c); u8 ItemId_GetImportance(u16 itemId); u8 ItemId_GetUnknownValue(u16 itemId); u8 ItemId_GetPocket(u16 itemId); u8 ItemId_GetType(u16 itemId); ItemUseFunc ItemId_GetFieldFunc(u16 itemId); u8 ItemId_GetBattleUsage(u16 itemId); ItemUseFunc ItemId_GetBattleFunc(u16 itemId); u8 ItemId_GetSecondaryId(u16 itemId); u16 ItemId_GetPrice(u16 itemId); void ClearBag(void); void ClearPCItemSlots(void); void TrySetObtainedItemQuestLogEvent(u16 itemId); bool8 AddBagItem(u16 itemId, u16 amount); void SortPocketAndPlaceHMsFirst(struct BagPocket * pocket); u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 itemId); u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 itemId); u16 BagGetQuantityByItemId(u16 item); u8 ItemId_GetImportance(u16 itemId); void BagPocketCompaction(struct ItemSlot * slots, u8 capacity); u16 GetPcItemQuantity(u16 *); void SetBagPocketsPointers(void); void ItemPcCompaction(void); void RemovePCItem(u16 itemId, u16 quantity); void SortAndCompactBagPocket(struct BagPocket * pocket); u8 CountItemsInPC(void); void ApplyNewEncryptionKeyToBagItems_(u32 newKey); bool8 HasAtLeastOneBerry(void); void DeserializeTmHmItemSlots(void); void DeserializeKeyItemSlots(void); u16 GetBagItemQuantity(u16 * ptr); bool8 CheckAssetsForSoftlock(void); #endif // GUARD_ITEM_H ================================================ FILE: include/item_menu.h ================================================ #ifndef GUARD_ITEM_MENU_H #define GUARD_ITEM_MENU_H #include "global.h" #include "task.h" #include "constants/item_menu.h" // Exported type declarations // Exported RAM declarations struct BagStruct { MainCallback bagCallback; u8 location; bool8 bagOpen; u16 pocket; u16 itemsAbove[5]; u16 cursorPos[5]; }; extern struct BagStruct gBagMenuState; extern u16 gSpecialVar_ItemId; // Exported ROM declarations void CB2_SetUpReshowBattleScreenAfterMenu(void); void ResetBagCursorPositions(void); void InitPokedudeBag(u8); void CB2_BagMenuFromStartMenu(void); void MoveItemSlotInList(struct ItemSlot * itemSlots_, u32 from, u32 to_); void ItemMenu_StartFadeToExitCallback(u8 taskId); void Bag_BeginCloseWin0Animation(void); void ItemMenu_SetExitCallback(void (*)(void)); void DisplayItemMessageInBag(u8 taskId, u8 fontId, const u8 * string, TaskFunc followUpFunc); void Task_ReturnToBagFromContextMenu(u8 taskId); void CB2_BagMenuFromBattle(void); void InitOldManBag(void); void Pocket_CalculateNItemsAndMaxShowed(u8 pocketId); void PocketCalculateInitialCursorPosAndItemsAbove(u8 pocketId); void GoToBagMenu(u8 menuType, u8 pocket, MainCallback callback); bool8 UseRegisteredKeyItemOnField(void); #endif //GUARD_ITEM_MENU_H ================================================ FILE: include/item_menu_icons.h ================================================ #ifndef GUARD_ITEM_MENU_ICONS #define GUARD_ITEM_MENU_ICONS #include "global.h" // Values for 2nd argument to GetItemIconGfxPtr enum { ITEMICON_TILES, ITEMICON_PAL, }; extern const struct CompressedSpriteSheet gSpriteSheet_BagMale; extern const struct CompressedSpriteSheet gSpriteSheet_BagFemale; extern const struct CompressedSpritePalette gSpritePalette_Bag; extern const struct CompressedSpriteSheet gBagSwapSpriteSheet; extern const struct CompressedSpritePalette gBagSwapSpritePalette; void ResetItemMenuIconState(void); void CreateSwapLine(void); void DestroyItemMenuIcon(bool8 a0); void CreateItemMenuIcon(u16 itemId, bool8 a0); void CopyItemIconPicTo4x4Buffer(const void *src, void *dest); u8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId); u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origTemplate, u16 tilesTag, u16 paletteTag, u16 itemId); void CreateBerryPouchItemIcon(u16 itemId, u8 idx); void UpdateSwapLinePos(s16 x, u16 y); void SetSwapLineInvisibility(bool8 invisible); void SetBagVisualPocketId(u8); void ShakeBagSprite(void); const u32 *GetItemIconGfxPtr(u16 itemId, u8 ptrId); void CreateBagSprite(u8 animNum); #endif // GUARD_ITEM_MENU_ICONS ================================================ FILE: include/item_pc.h ================================================ #ifndef GUARD_ITEM_PC_H #define GUARD_ITEM_PC_H void ItemPc_Init(u8 kind, MainCallback callback); void ItemPc_SetInitializedFlag(bool8 flag); #endif //GUARD_ITEM_PC_H ================================================ FILE: include/item_use.h ================================================ #ifndef GUARD_ITEM_USE_H #define GUARD_ITEM_USE_H #include "global.h" void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8); void ItemUse_SetQuestLogEvent(u8, struct Pokemon *, u16, u16); void FieldUseFunc_Mail(u8 taskId); void FieldUseFunc_Bike(u8 taskId); void FieldUseFunc_Rod(u8 taskId); void FieldUseFunc_CoinCase(u8 taskId); void FieldUseFunc_PowderJar(u8 taskId); void FieldUseFunc_SootSack(u8 taskId); u16 GetAshCount(void); void FieldUseFunc_PokeFlute(u8 taskId); void FieldUseFunc_Medicine(u8 taskId); void FieldUseFunc_Ether(u8 taskId); void FieldUseFunc_PpUp(u8 taskId); void FieldUseFunc_RareCandy(u8 taskId); void FieldUseFunc_EvoItem(u8 taskId); void FieldUseFunc_SacredAsh(u8 taskId); void FieldUseFunc_TmCase(u8 taskId); void FieldUseFunc_BerryPouch(u8 taskId); void BattleUseFunc_BerryPouch(u8 taskId); void FieldUseFunc_TeachyTv(u8 taskId); void FieldUseFunc_Repel(u8 taskId); void FieldUseFunc_BlackWhiteFlute(u8 taskId); void FieldUseFunc_TownMap(u8 taskId); void FieldUseFunc_FameChecker(u8 taskId); void FieldUseFunc_VsSeeker(u8 taskId); void BattleUseFunc_PokeBallEtc(u8 taskId); void BattleUseFunc_PokeFlute(u8 taskId); void BattleUseFunc_StatBooster(u8 taskId); void BattleUseFunc_Medicine(u8 taskId); void BattleUseFunc_Ether(u8 taskId); void BattleUseFunc_PokeDoll(u8 taskId); void FieldUseFunc_OakStopsYou(u8 taskId); void ItemUseOutOfBattle_EscapeRope(u8 taskId); void ItemUseOutOfBattle_EnigmaBerry(u8 taskId); void ItemUseInBattle_EnigmaBerry(u8 taskId); void ItemUseOutOfBattle_Itemfinder(u8 taskId); void Task_UseDigEscapeRopeOnField(u8 taskId); u8 CanUseEscapeRopeOnCurrMap(void); u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); void ItemUseOutOfBattle_ReduceEV(u8 taskId); #endif //GUARD_ITEM_USE_H ================================================ FILE: include/itemfinder.h ================================================ #ifndef GUARD_ITEMFINDER_H #define GUARD_ITEMFINDER_H void ItemUseOnFieldCB_Itemfinder(u8 taskId); #endif //GUARD_ITEMFINDER_H ================================================ FILE: include/keyboard_text.h ================================================ #ifndef GUARD_KEYBOARD_TEXT_H #define GUARD_KEYBOARD_TEXT_H extern const u8 gText_UnionRoomChatKeyboard_ABCDE[]; extern const u8 gText_UnionRoomChatKeyboard_FGHIJ[]; extern const u8 gText_UnionRoomChatKeyboard_KLMNO[]; extern const u8 gText_UnionRoomChatKeyboard_PQRST[]; extern const u8 gText_UnionRoomChatKeyboard_UVWXY[]; extern const u8 gText_UnionRoomChatKeyboard_Z[]; extern const u8 gText_UnionRoomChatKeyboard_01234Upper[]; extern const u8 gText_UnionRoomChatKeyboard_56789Upper[]; extern const u8 gText_UnionRoomChatKeyboard_PunctuationUpper[]; extern const u8 gText_UnionRoomChatKeyboard_SymbolsUpper[]; extern const u8 gText_UnionRoomChatKeyboard_abcde[]; extern const u8 gText_UnionRoomChatKeyboard_fghij[]; extern const u8 gText_UnionRoomChatKeyboard_klmno[]; extern const u8 gText_UnionRoomChatKeyboard_pqrst[]; extern const u8 gText_UnionRoomChatKeyboard_uvwxy[]; extern const u8 gText_UnionRoomChatKeyboard_z[]; extern const u8 gText_UnionRoomChatKeyboard_01234Lower[]; extern const u8 gText_UnionRoomChatKeyboard_56789Lower[]; extern const u8 gText_UnionRoomChatKeyboard_PunctuationLower[]; extern const u8 gText_UnionRoomChatKeyboard_SymbolsLower[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji1[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji2[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji3[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji4[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji5[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji6[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji7[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji8[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji9[]; extern const u8 gText_UnionRoomChatKeyboard_Emoji10[]; extern const u8 gText_EasyChatKeyboard_ABCDEFothers[]; extern const u8 gText_EasyChatKeyboard_GHIJKL[]; extern const u8 gText_EasyChatKeyboard_MNOPQRS[]; extern const u8 gText_EasyChatKeyboard_TUVWXYZ[]; extern const u8 gText_NamingScreenKeyboard_abcdef[]; extern const u8 gText_NamingScreenKeyboard_ghijkl[]; extern const u8 gText_NamingScreenKeyboard_mnopqrs[]; extern const u8 gText_NamingScreenKeyboard_tuvwxyz[]; extern const u8 gText_NamingScreenKeyboard_ABCDEF[]; extern const u8 gText_NamingScreenKeyboard_GHIJKL[]; extern const u8 gText_NamingScreenKeyboard_MNOPQRS[]; extern const u8 gText_NamingScreenKeyboard_TUVWXYZ[]; extern const u8 gText_NamingScreenKeyboard_01234[]; extern const u8 gText_NamingScreenKeyboard_56789[]; extern const u8 gText_NamingScreenKeyboard_Symbols1[]; extern const u8 gText_NamingScreenKeyboard_Symbols2[]; #endif //GUARD_KEYBOARD_TEXT_H ================================================ FILE: include/libgcnmultiboot.h ================================================ #ifndef GUARD_LIBGCNMULTIBOOT_H #define GUARD_LIBGCNMULTIBOOT_H struct GcmbStruct { u16 gcmb_field_0; vu8 gcmb_field_2; u8 filler3[0x2C - 0x3]; }; void GameCubeMultiBoot_Main(struct GcmbStruct *pStruct); void GameCubeMultiBoot_ExecuteProgram(struct GcmbStruct *pStruct); void GameCubeMultiBoot_Init(struct GcmbStruct *pStruct); void GameCubeMultiBoot_HandleSerialInterrupt(struct GcmbStruct *pStruct); void GameCubeMultiBoot_Quit(void); #endif // GUARD_LIBGCNMULTIBOOT_H ================================================ FILE: include/librfu.h ================================================ #ifndef GUARD_LIBRFU_H #define GUARD_LIBRFU_H #include "global.h" #include "main.h" #define LIBRFU_VERSION 1024 /* TODOs: * - documentation * - check if any field needs to be volatile * - check if field names make sense */ // -------------------------------------------------------------------------- // // Restrictions When Using RFU // // -------------------------------------------------------------------------- /* The following restrictions apply when using RFU. (a) The timer for Sound DMA uses only 0 (b) The prescaler for the timer count for the Sound DMA uses 59.5 ns. (c) The sound sampling rate is Max36.314KHz. These types of DMA can be operated on a maximum CPU cycle of 42 cycles. Calculate the number of the transferable DMA count based on this 42 cycles and the access cycles of the destination and source. For example, if both the CPU internal RAM --> VRAM have a one cycle access, then a 21 count DMA can occur. If RFU is used outside of these restrictions, problems, such as the loss of data caused by the failure of the AGB, as a clock slave, to notify that data has been received from the RFU, will occur. When this problem occurs, the REQ callback will send a REQ_commandID=ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ notification. (When using Link Manager, the LMAN call back will send a LMAN_msg=LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA notification.) */ // REQ-COMMAND (STWI) ID CODE LIST // REQ Command ID returned by the REQ callback #define ID_RESET_REQ 0x0010 #define ID_LINK_STATUS_REQ 0x0011 #define ID_VERSION_STATUS_REQ 0x0012 // not defined in SDK header #define ID_SYSTEM_STATUS_REQ 0x0013 #define ID_SLOT_STATUS_REQ 0x0014 // not defined in SDK header #define ID_CONFIG_STATUS_REQ 0x0015 // not defined in SDK header #define ID_GAME_CONFIG_REQ 0x0016 #define ID_SYSTEM_CONFIG_REQ 0x0017 #define ID_SC_START_REQ 0x0019 #define ID_SC_POLL_REQ 0x001a #define ID_SC_END_REQ 0x001b #define ID_SP_START_REQ 0x001c #define ID_SP_POLL_REQ 0x001d #define ID_SP_END_REQ 0x001e #define ID_CP_START_REQ 0x001f #define ID_CP_POLL_REQ 0x0020 #define ID_CP_END_REQ 0x0021 #define ID_DATA_TX_REQ 0x0024 #define ID_DATA_TX_AND_CHANGE_REQ 0x0025 #define ID_DATA_RX_REQ 0x0026 #define ID_MS_CHANGE_REQ 0x0027 // When returned by the REQ callback, this ID indicates that execution of rfu_REQ_changeMasterSlave has finished. // This ID is returned by both the REQ callback and the MSC callback. // When returned by the MSC callback, this is notification that after the AGB has been made into the clock slave, the MC_Timer expired and the RFU returned the AGB to be the clock master. #define ID_DISCONNECT_REQ 0x0030 #define ID_TEST_MODE_REQ 0x0031 // not defined in SDK header #define ID_CPR_START_REQ 0x0032 #define ID_CPR_POLL_REQ 0x0033 #define ID_CPR_END_REQ 0x0034 #define ID_UNK35_REQ 0x0035 // not defined in SDK header #define ID_UNK36_REQ 0x0036 // not defined in SDK header #define ID_RESUME_RETRANSMIT_AND_CHANGE_REQ 0x0037 #define ID_STOP_MODE_REQ 0x003d #define ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ 0x00ff // When the AGB is the clock slave, the RFU generates an informational notice, and an automatically started DMA, such as HDMA, is generated at the instant the AGB is being returned as the clock master. This ID is notified by a REQ callback when the exchange of this information (REQ command) fails. // REQ Command ID returned by the MSC callback #define ID_DISCONNECTED_AND_CHANGE_REQ 0x0029 #define ID_DATA_READY_AND_CHANGE_REQ 0x0028 #define ID_DRAC_REQ_WITH_ACK_FLAG 0x0128 // -------------------------------------------------------------------------- // // Data Definitions // // -------------------------------------------------------------------------- #define RFU_ID 0x00008001 // ID number of AGB-RFU device: ID returned by execution of rfu_REQBN_softReset_and_checkID. #define RFU_MBOOT_DOWNLOADER_SERIAL_NO 0x0000 // The game serial number of the multi-boot downloader (programs that boot without a Game Pak) #define RFU_API_BUFF_SIZE_RAM 0x0e64 // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in RAM) #define RFU_API_BUFF_SIZE_ROM 0x0504 // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in ROM) #define RFU_CHILD_MAX 4 // Maximum number of slaves that can be connected to one parent device #define RFU_GAME_NAME_LENGTH 13 // Possible length of game name set by rfu_REQB_configGameData #define RFU_USER_NAME_LENGTH 8 // Possible length of user name set by rfu_REQB_configGameData #define RFU_H_DMA_MAX_CPU_CYCLE 42 // Maximum number of CPU cycles for H-DMA or DMA that starts with V-Blank that can operate when using RFU // Value to determine the level of the icon that displays the link strength of the wireless status (value of rfuLinkStatus->strength[0-3]) #define RFU_LINK_ICON_LEVEL4_MAX 255 // 90% -100% (If the value is betwen 229 and 255, the icon level is 4) #define RFU_LINK_ICON_LEVEL4_MIN 229 #define RFU_LINK_ICON_LEVEL3_MAX 228 // 50% - 89% (If the value is betwen 127 and 228, the icon level is 3) #define RFU_LINK_ICON_LEVEL3_MIN 127 #define RFU_LINK_ICON_LEVEL2_MAX 126 // 10% - 49% (If the value is betwen 25 and 126, the icon level is 2) #define RFU_LINK_ICON_LEVEL2_MIN 25 #define RFU_LINK_ICON_LEVEL1_MAX 24 // 0% - 9% (If the value is betwen 0 and 24, the icon level is 1) #define RFU_LINK_ICON_LEVEL1_MIN 0 // ******************************************************* // Definition Data for Arguments Used in Library Functions // ******************************************************* // Specified by u16 mbootFlag in rfu_REQ_configGameData #define RFU_MBOOT_FLAG 0x01 // Enabling this flag, allows connection to a multi-boot program. // AvailSlot (number of slots available for connection) used in u16 availSlotFlag in rfu_REQ_configSystem #define AVAIL_SLOT4 0x0000 #define AVAIL_SLOT3 0x0001 #define AVAIL_SLOT2 0x0002 #define AVAIL_SLOT1 0x0003 // u8 connTypeFlag specified by rfu_setRecvBuffer #define TYPE_UNI 0x10 // UNI-type #define TYPE_NI 0x20 // NI-type // u8 connTypeFlag specified by rfu_clearSlot #define TYPE_UNI_SEND 0x01 // UNI-type send #define TYPE_UNI_RECV 0x02 // UNI-type receive #define TYPE_NI_SEND 0x04 // NI-type send #define TYPE_NI_RECV 0x08 // NI-type receive // ******************************************************* // Definition Data Returned by Return Values for Library Functions // ******************************************************* // The function doesn't have return value. // Value of u8 *status for rfu_REQ_pollConnectParent (Connection Trial Status) // #define CP_STATUS_DONE 0x00 // Connection successful // #define CP_STATUS_IN_PROCESS 0x01 // Connecting // #define CP_STATUS_SLOT_CLOSED 0x02 // Parent device is not in connection mode with child device // #define CP_STATUS_DISCONNECTED 0x03 // Disconnected by parent device while connecting // #define CP_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error // The function doesn't exist. // Value of u8 *status argument for rfu_REQ_pollRecoveryConnect (Link Restore Status) // #define RC_STATUS_DONE 0x00 // Connection restore successful // #define RC_STATUS_FAILED 0x01 // Connection restore failure (meaningless to try anymore) // #define RC_STATUS_SEARCHING_PARENT 0x02 // Searching for parent device // #define RC_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error // Value of u8 *linkLossReason argument for rfu_REQBN_watchLink (Reason for Link Loss) #define REASON_DISCONNECTED 0x00 // State of complete disconnection with rfuLL_disconnect and no possibility of restoring the link (can detect only child device) #define REASON_LINK_LOSS 0x01 // State of link loss that allows for the possibility for the link to be restored // ******************************************************* // Definition Data Returned with Return Values for Library Functions // ******************************************************* // Value returned by rfu_getMasterSlave #define AGB_CLK_SLAVE 0 // AGB clock slave #define AGB_CLK_MASTER 1 // AGB clock master // ******************************************************* // Error Code Group for Library Functions // ******************************************************* // Error codes returned by u16 REQ_result with a REQ callback when a REQ-API function is executed #define ERR_REQ_CMD 0x0000 #define ERR_REQ_CMD_CLOCK_DRIFT (ERR_REQ_CMD | 0x0001) // Clock drift occurs when a REQ command is sent #define ERR_REQ_CMD_SENDING (ERR_REQ_CMD | 0x0002) // The next command cannot be issued because a REQ command is being sent #define ERR_REQ_CMD_ACK_REJECTION (ERR_REQ_CMD | 0x0003) // The REQ command was refused when issued #define ERR_REQ_CMD_CLOCK_SLAVE (ERR_REQ_CMD | 0x0004) // Issuing the REQ command was attempted but failed because the AGB is the clock slave #define ERR_REQ_CMD_IME_DISABLE (ERR_REQ_CMD | 0x0006) // Issuing the REQ command was attempted but failed because the IME register is 0 #define ERR_PID_NOT_FOUND 0x0100 // The specified PID does not exist in the gRfuLinkStatus->partner[0-3].id list // Error code returned by the return value of rfu_initializeAPI #define ERR_RFU_API_BUFF_SIZE 0x0001 #define ERR_RFU_API_BUFF_ADR 0x0002 // Error codes returned by return values for rfu_REQBN_softReset_and_checkID #define ERR_ID_CHECK_IME_DISABLE 0xffffffff // ID check could not be executed because REG_IME=0 when executing rfu_REQBN_softReset_and_checkID // Error codes returned by rfu_getConnectParentStatus and rfu_CHILD_getConnectRecoveryStatus #define ERR_REQ_CMD_ID (ERR_REQ_CMD | 0x0010) // A required REQ command was not executed within this function execution // Error codes returned by rfu_NI_setSendData, rfu_UNI_setSendData, and rfu_NI_CHILD_setSendGameName #define ERR_MODE 0x0300 #define ERR_MODE_NOT_PARENT (ERR_MODE | 0x0000) // not in SDK #define ERR_MODE_NOT_CONNECTED (ERR_MODE | 0x0001) // RFU is not in connection mode (parent or child) #define ERR_SLOT 0x0400 #define ERR_SLOT_NO (ERR_SLOT | 0x0000) // The specified slot number is not right #define ERR_SLOT_NOT_CONNECTED (ERR_SLOT | 0x0001) // The specified slot is not connected #define ERR_SLOT_BUSY (ERR_SLOT | 0x0002) // The specified slot is already communicating #define ERR_SLOT_NOT_SENDING (ERR_SLOT | 0x0003) // The specified slot is not currently sending (Note: This is returned by rfu_UNI_re_setSendData) #define ERR_SLOT_TARGET (ERR_SLOT | 0x0004) // The specified target slot is not right #define ERR_SUBFRAME_SIZE 0x0500 // The specified subframe size is either larger than the remaining communication frame size or smaller than the link layer subframe header size // Error code returned by rfu_clearSlot, rfu_setRecvBuffer, and rfu_changeSendTarget #define ERR_COMM_TYPE 0x0600 // The specified communication format is not right // Error code returned by rfu_REQ_recvData (when receiving NI-type or UNI-type data) #define ERR_DATA_RECV 0x0700 // Error notification is issued in the following format. // "ERR_DATA_RECV | (slot number issuing error with 0x0010<recv.errorCode. // Error code during NI-type communication (code entered into gRfuSlotStatusNI[x]->recv.errorCode) #define ERR_RECV_BUFF_OVER (ERR_DATA_RECV | 0x0001) // The receive data size is larger than the receive buffer (Note: This error is used for both NI and UNI) #define ERR_RECV_REPLY_SUBFRAME_SIZE (ERR_DATA_RECV | 0x0002) // All frames are already in use by other communications, and a subframe for reception response could not be secured // Error code during UNI-type communication (code entered into gRfuSlotStatusUNI[x]->recv.errorCode) #define ERR_RECV_DATA_OVERWRITED (ERR_DATA_RECV | 0x0008) // Received new data when gRfuSlotStatusUNI[x]->recv.newDataFlag=1 // not in SDK header #define ERR_RECV_UNK (ERR_DATA_RECV | 0x0001 | 0x0008) // ******************************************************* // Definition Data Used by Global Variables in the Library // ******************************************************* // gRfuLinkStatus------------------------------------------- // Connection status (refer to gRfuLinkStatus->parentChild) #define MODE_NEUTRAL 0xff // Initialization #define MODE_CHILD 0x00 // Child #define MODE_PARENT 0x01 // Parent // gRfuSlotStatusNI,UNI----------------------------------- // Definition data for NI-(Numbered Information) and UNI-(Un-Numbered Information) type communication // Definition data common to NI- and UNI-type communication #define LLF_P_SIZE 87 // Maximum link layer communication frame size for the Parent (Maximum number of bytes per transmission) #define LLF_C_SIZE 16 // " " for the Child #define LLSF_P_HEADER_SIZE 3 // Header size used by one link layer subframe (NI or UNI frame) for the Parent #define LLSF_C_HEADER_SIZE 2 // " " for the Child // Link Layer Communication Code #define LCOM_NULL 0x0000 #define LCOM_NI_START 0x0001 #define LCOM_NI 0x0002 #define LCOM_NI_END 0x0003 #define LCOM_UNI 0x0004 // Flag for Slot Status Data #define SLOT_BUSY_FLAG 0x8000 // Slot in use #define SLOT_SEND_FLAG 0x0020 // Send #define SLOT_RECV_FLAG 0x0040 // Receive // NI- and UNI-type shared slot stand-by data (same state as gRfuSlotStatusNI[x]->send or ->recv.state or gRfuSlotStatusUNI) #define SLOT_STATE_READY 0x0000 // Slot initialization // Status data for NI-type communication (gRfuSlotStatusNI[x]->send or ->recv.state) #define SLOT_STATE_SEND_START (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI_START) // Start transmission #define SLOT_STATE_SENDING (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI) // Transmitting #define SLOT_STATE_SEND_LAST (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI_END) // Verify transmission end #define SLOT_STATE_SEND_NULL (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NULL) // Send NULL subframe to notify end of transmission #define SLOT_STATE_SEND_SUCCESS ( SLOT_SEND_FLAG | 0x006) // Transmission successful #define SLOT_STATE_SEND_FAILED ( SLOT_SEND_FLAG | 0x007) // Transmission failed // Distinction of slot where transmission succeeded/failed compares gRfuSlotStatusNI[x]->send.bmSlot and same bmSlot_org #define SLOT_STATE_RECV_START (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI_START) // Start reception #define SLOT_STATE_RECEIVING (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI) // Receiving #define SLOT_STATE_RECV_LAST (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI_END) // Verify reception end #define SLOT_STATE_RECV_SUCCESS ( SLOT_RECV_FLAG | 0x006) // Reception successful #define SLOT_STATE_RECV_FAILED ( SLOT_RECV_FLAG | 0x007) // Reception failed #define SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN (SLOT_RECV_FLAG | 0x008) // The data was received successful, but because the end of the communication was incomplete, whether the transmission side status is successful or failed is unknown #define SLOT_STATE_RECV_IGNORE ( SLOT_RECV_FLAG | 0x009) // Ignore reception (refer to gRfuSlotStatusNI[x]->recv.errorCode for reason for ignoring) // Status data for UNI-type communication (refer to gRfuSlotStatusUNI[x]->send.state) #define SLOT_STATE_SEND_UNI (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_UNI) // Transmitting // the following structs are not documented in SDK struct RfuPacket8 { u8 data[0x74]; }; struct RfuPacket32 { u32 command; u32 data[0x1C]; }; union RfuPacket { struct RfuPacket32 rfuPacket32; struct RfuPacket8 rfuPacket8; }; struct STWIStatus { vs32 state; u8 reqLength; u8 reqNext; u8 reqActiveCommand; u8 ackLength; u8 ackNext; u8 ackActiveCommand; u8 timerSelect; u8 unk_b; #if LIBRFU_VERSION >= 1026 s32 timerState; #else u32 timerState; #endif vu8 timerActive; u8 unk_11; vu16 error; vu8 msMode; u8 recoveryCount; u8 unk_16; u8 unk_17; void (*callbackM)(); void (*callbackS)(u16); void (*callbackID)(void); union RfuPacket *txPacket; union RfuPacket *rxPacket; vu8 sending; }; // This struct is used as u8 array in SDK. struct RfuIntrStruct { union RfuPacket rxPacketAlloc; union RfuPacket txPacketAlloc; u8 block1[0x960]; // size of librfu_intr.s binary struct STWIStatus block2; }; // Data Structure for Transmitting UNI-Type Data struct UNISend { u16 state; // Slot communication state (SLOT_STATE_READY, SLOT_STATE_SEND_UNI) u8 dataReadyFlag; // Flag indicating transmission data is prepared (0: data sent; 1: transmission data ready) // Set with rfu_UNI_re_setSendData or rfu_UNI_readySendData, cleared when data is sent with rfu_REQ_sendData. u8 bmSlot; // Expresses transmission destination slot as bits u16 payloadSize; // Payload size of 1 transmission. "size" specified by rfu_UNI_setSendData or rfu_UNI_re_setSendData is used. const void *src; // Beginning address of transmission data }; // Data Structure for Receiving UNI Data struct UNIRecv { u16 state; // Slot communication state (SLOT_STATE_READY, SLOT_STATE_RECEIVING, SLOT_STATE_RECV_IGNORE) u16 errorCode; // Error code during reception u16 dataSize; // Size of receive data u8 newDataFlag; // Flag indicating whether receive data has newly arrived (0: no newly arrived data; 1: newly arrived data) // The flag is cleared with rfu_UNI_clearRecvNewDataFlag; it is set when data is received with rfu_REQ_recvData. u8 dataBlockFlag; // Flag for unreferenced receive data overwrite block (default is 0 Note: not used) }; // Slot Status Data Structure for UNI-Type Communication struct RfuSlotStatusUNI { struct UNISend send; // Transmission Status struct UNIRecv recv; // Reception Status void *recvBuffer; // Reception Buffer Address u32 recvBufferSize; // Reception Buffer Size }; #define WINDOW_COUNT 4 struct NIComm { u16 state; // Communication state of slot u16 failCounter; // Count of failed transmissions/receptions (Count is increased when transmission/reception of data does not succeed within 1PF=16.7 ms) const u8 *now_p[WINDOW_COUNT]; // Address of current send/receive (The data is divided into WINDOW_COUNT blocks and sent in payloadSize units.) u32 remainSize; // Size of remaining communication data u16 errorCode; // Error code u8 bmSlot; // Expresses the current communication slot in bits // (When sending from the Master, because multiple slaves can be specified with bmSlot, communications are terminated based on the failCounter for each child device) // Parameters used inside the Library u8 recvAckFlag[WINDOW_COUNT]; u8 ack; u8 phase; u8 n[WINDOW_COUNT]; // Parameters indicating the current communication content const void *src; // Start address transmission data (valid only for transmitting device) u8 bmSlotOrg; // Expresses the communication source slot at the beginning of the transmission in bits (valid only for transmitting device) u8 dataType; // Transmission/reception data type (0: User data; 1: Game identification information) u16 payloadSize; // Payload size for one transmission u32 dataSize; // Size of transmission/reception data // Calculated by subtracting link layer header size from subFrameSize specified by the rfu_NI_setSendData function }; struct RfuSlotStatusNI { struct NIComm send; // Transmission Status struct NIComm recv; // Reception Status void *recvBuffer; // Reception Buffer Address u32 recvBufferSize; // Reception Buffer Size }; // Game Identification Information Data Structure struct RfuTgtData { u16 id; // ID of parent candidate ID of connection partner u8 slot; // Slot number where parent candidate can enter Connection slot number u8 mbootFlag; // Flag to indicate whether or not the parent candidate Flag to indicate whether or not the connection partner // is multiboot program for download is multiboot program for download u16 serialNo; // Game serial number of parent candidate Game serial number of connection partner u8 gname[RFU_GAME_NAME_LENGTH + 2]; // Game name of parent candidate Game name of connection partner u8 uname[RFU_USER_NAME_LENGTH + 1]; // User name for parent candidate User name for connection partner }; struct RfuLinkStatus { u8 parentChild; // Connection status (0x01:MODE_PARENT 0x00:MODE_CHILD 0xff:MODE_NEUTRAL) u8 connCount; // Number of connections u8 connSlotFlag; // Flag to indicate in bits the connection slot (0x01<> LINK_STAT_PLAYER_COUNT_SHIFT) #define EXTRACT_MASTER(status) \ (((status) >> LINK_STAT_MASTER_SHIFT) & 1) #define EXTRACT_CONN_ESTABLISHED(status) \ (((status) >> LINK_STAT_CONN_ESTABLISHED_SHIFT) & 1) #define EXTRACT_RECEIVED_NOTHING(status) \ (((status) >> LINK_STAT_RECEIVED_NOTHING_SHIFT) & 1) #define EXTRACT_LINK_ERRORS(status) \ (((status) & LINK_STAT_ERRORS) >> LINK_STAT_ERRORS_SHIFT) #define LINKCMD_BLENDER_STOP 0x1111 #define LINKCMD_SEND_LINK_TYPE 0x2222 #define LINKCMD_BLENDER_SCORE_MISS 0x2345 #define LINKCMD_READY_EXIT_STANDBY 0x2FFE #define LINKCMD_SEND_PACKET 0x2FFF #define LINKCMD_BLENDER_SEND_KEYS 0x4444 #define LINKCMD_BLENDER_SCORE_BEST 0x4523 #define LINKCMD_BLENDER_SCORE_GOOD 0x5432 #define LINKCMD_DUMMY_1 0x5555 #define LINKCMD_DUMMY_2 0x5566 #define LINKCMD_READY_CLOSE_LINK 0x5FFF #define LINKCMD_SEND_EMPTY 0x6666 #define LINKCMD_SEND_0xEE 0x7777 #define LINKCMD_BLENDER_PLAY_AGAIN 0x7779 #define LINKCMD_COUNTDOWN 0x7FFF #define LINKCMD_CONT_BLOCK 0x8888 #define LINKCMD_BLENDER_NO_BERRIES 0x9999 #define LINKCMD_BLENDER_NO_PBLOCK_SPACE 0xAAAA #define LINKCMD_SEND_ITEM 0xAAAB #define LINKCMD_READY_TO_TRADE 0xAABB #define LINKCMD_READY_FINISH_TRADE 0xABCD #define LINKCMD_INIT_BLOCK 0xBBBB #define LINKCMD_READY_CANCEL_TRADE 0xBBCC #define LINKCMD_SEND_HELD_KEYS 0xCAFE #define LINKCMD_SEND_BLOCK_REQ 0xCCCC #define LINKCMD_START_TRADE 0xCCDD #define LINKCMD_CONFIRM_FINISH_TRADE 0xDCBA #define LINKCMD_SET_MONS_TO_TRADE 0xDDDD #define LINKCMD_PLAYER_CANCEL_TRADE 0xDDEE #define LINKCMD_REQUEST_CANCEL 0xEEAA #define LINKCMD_BOTH_CANCEL_TRADE 0xEEBB #define LINKCMD_PARTNER_CANCEL_TRADE 0xEECC #define LINKCMD_NONE 0xEFFF #define LINKTYPE_TRADE 0x1111 #define LINKTYPE_TRADE_CONNECTING 0x1122 #define LINKTYPE_TRADE_SETUP 0x1133 #define LINKTYPE_TRADE_DISCONNECTED 0x1144 #define LINKTYPE_BATTLE 0x2211 #define LINKTYPE_UNUSED_BATTLE 0x2222 // Unused, inferred from gap #define LINKTYPE_SINGLE_BATTLE 0x2233 #define LINKTYPE_DOUBLE_BATTLE 0x2244 #define LINKTYPE_MULTI_BATTLE 0x2255 #define LINKTYPE_BATTLE_TOWER_50 0x2266 #define LINKTYPE_BATTLE_TOWER_OPEN 0x2277 #define LINKTYPE_BATTLE_TOWER 0x2288 #define LINKTYPE_RECORD_MIX_BEFORE 0x3311 #define LINKTYPE_RECORD_MIX_AFTER 0x3322 #define LINKTYPE_BERRY_BLENDER_SETUP 0x4411 #define LINKTYPE_BERRY_BLENDER 0x4422 #define LINKTYPE_MYSTERY_EVENT 0x5501 #define LINKTYPE_EREADER_FRLG 0x5502 #define LINKTYPE_EREADER_EM 0x5503 #define LINKTYPE_CONTEST_GMODE 0x6601 #define LINKTYPE_CONTEST_EMODE 0x6602 enum { BLOCK_REQ_SIZE_NONE, // Identical to 200 BLOCK_REQ_SIZE_200, BLOCK_REQ_SIZE_100, BLOCK_REQ_SIZE_220, BLOCK_REQ_SIZE_40, }; #define MASTER_HANDSHAKE 0x8FFF #define SLAVE_HANDSHAKE 0xB9A0 #define EREADER_HANDSHAKE 0xCCD0 #define IsSendCmdComplete() (gSendCmd[0] == 0) enum { LINK_STATE_START0, LINK_STATE_START1, LINK_STATE_HANDSHAKE, LINK_STATE_INIT_TIMER, LINK_STATE_CONN_ESTABLISHED, }; enum { EXCHANGE_NOT_STARTED, EXCHANGE_COMPLETE, EXCHANGE_TIMED_OUT, EXCHANGE_DIFF_SELECTIONS, EXCHANGE_PLAYER_NOT_READY, EXCHANGE_PARTNER_NOT_READY, EXCHANGE_WRONG_NUM_PLAYERS, }; enum { QUEUE_FULL_NONE, QUEUE_FULL_SEND, QUEUE_FULL_RECV, }; enum { LAG_NONE, LAG_MASTER, LAG_SLAVE, }; struct LinkPlayer { /* 0x00 */ u16 version; /* 0x02 */ u16 lp_field_2; /* 0x04 */ u32 trainerId; /* 0x08 */ u8 name[PLAYER_NAME_LENGTH + 1]; /* 0x10 */ u8 progressFlags; // (& 0x0F) is hasNationalDex, (& 0xF0) is hasClearedGame /* 0x11 */ u8 neverRead; /* 0x12 */ u8 progressFlagsCopy; /* 0x13 */ u8 gender; /* 0x14 */ u32 linkType; /* 0x18 */ u16 id; // battle bank in battles /* 0x1A */ u16 language; }; struct LinkPlayerBlock { u8 magic1[16]; struct LinkPlayer linkPlayer; u8 magic2[16]; }; // circular queues struct SendQueue { u16 data[CMD_LENGTH][QUEUE_CAPACITY]; u8 pos; u8 count; }; struct RecvQueue { u16 data[MAX_LINK_PLAYERS][CMD_LENGTH][QUEUE_CAPACITY]; u8 pos; u8 count; }; struct Link { u8 isMaster; // 0: slave, 8: master u8 state; u8 localId; // local multi-player ID u8 playerCount; u16 tempRecvBuffer[4]; bool8 receivedNothing; s8 serialIntrCounter; bool8 handshakeAsMaster; u8 link_field_F; // error conditions bool8 hardwareError; // hardware reported an error bool8 badChecksum; // checksum didn't match between devices u8 queueFull; // send or recv queue out of space u8 lag; // connection is lagging u16 checksum; u8 sendCmdIndex; u8 recvCmdIndex; struct SendQueue sendQueue; struct RecvQueue recvQueue; }; struct BlockRequest { void *address; u32 size; }; extern const struct BlockRequest sBlockRequestLookupTable[5]; extern struct Link gLink; extern u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; extern u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE]; extern u16 gLinkType; extern u32 gLinkStatus; extern u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2]; extern u16 gSendCmd[CMD_LENGTH]; extern u8 gShouldAdvanceLinkState; extern struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS]; extern u16 word_3002910[]; extern bool8 gReceivedRemoteLinkPlayers; extern bool8 gLinkVSyncDisabled; extern u8 gWirelessCommType; extern struct LinkPlayer gLocalLinkPlayer; extern u8 gShouldAdvanceLinkState; extern u16 gLinkPartnersHeldKeys[6]; void Task_DestroySelf(u8); void OpenLink(void); void CloseLink(void); u16 LinkMain2(const u16 *); void ClearLinkCallback(void); void ClearLinkCallback_2(void); u8 GetLinkPlayerCount(void); void OpenLinkTimed(void); u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int higher); bool8 IsLinkPlayerDataExchangeComplete(void); u32 GetLinkPlayerTrainerId(u8); void ResetLinkPlayers(void); u8 GetMultiplayerId(void); u8 BitmaskAllOtherLinkPlayers(void); bool8 SendBlock(u8, const void *, u16); u8 GetBlockReceivedStatus(void); void ResetBlockReceivedFlags(void); void ResetBlockReceivedFlag(u8); void SetLinkDebugValues(u32, u32); u8 GetSavedPlayerCount(void); u8 GetLinkPlayerCount_2(void); bool8 IsLinkMaster(void); void CB2_LinkError(void); u8 GetSioMultiSI(void); bool8 IsLinkConnectionEstablished(void); void SetSuppressLinkErrorMessage(bool8); bool8 HasLinkErrorOccurred(void); void ResetSerial(void); u32 LinkMain1(u8 *, u16 *, u16[MAX_RFU_PLAYERS][CMD_LENGTH]); void RfuVSync(void); void Timer3Intr(void); void SerialCB(void); u8 GetLinkPlayerCount(void); bool32 InUnionRoom(void); void SetLinkStandbyCallback(void); void SetWirelessCommType1(void); void SetCloseLinkCallback(void); void OpenLink(void); bool8 IsLinkMaster(void); void CheckShouldAdvanceLinkState(void); void SetCloseLinkCallbackAndType(u16 type); void CloseLink(void); bool8 IsLinkTaskFinished(void); bool32 IsLinkRecvQueueAtOverworldMax(void); void ResetSerial(void); void SetWirelessCommType1(void); void LoadWirelessStatusIndicatorSpriteGfx(void); void CreateWirelessStatusIndicatorSprite(u8, u8); void StartSendingKeysToLink(void); void ClearLinkCallback_2(void); void Rfu_SetLinkStandbyCallback(void); void ConvertLinkPlayerName(struct LinkPlayer * linkPlayer); bool32 IsWirelessAdapterConnected(void); bool8 SendBlockRequest(u8 blockRequestType); void LinkVSync(void); bool8 HandleLinkConnection(void); void LocalLinkPlayerToBlock(void); void LinkPlayerFromBlock(u32 who); void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 isConnectionError); u8 GetLinkPlayerCountAsBitFlags(void); void ResetLinkPlayerCount(void); void SaveLinkPlayers(u8 numPlayers); u8 GetSavedLinkPlayerCountAsBitFlags(void); void CheckLinkPlayersMatchSaved(void); void SetLocalLinkPlayerId(u8 playerId); bool32 IsSendingKeysToLink(void); u32 GetLinkRecvQueueLength(void); #endif // GUARD_LINK_H ================================================ FILE: include/link_rfu.h ================================================ #ifndef GUARD_LINK_RFU_H #define GUARD_LINK_RFU_H #include "global.h" #include "librfu.h" #include "link.h" #include "AgbRfu_LinkManager.h" #define RFUCMD_MASK 0xFF00 #define RFUCMD_SEND_PACKET 0x2F00 #define RFUCMD_BLENDER_SEND_KEYS 0x4400 #define RFUCMD_READY_CLOSE_LINK 0x5F00 #define RFUCMD_READY_EXIT_STANDBY 0x6600 #define RFUCMD_SEND_PLAYER_IDS 0x7700 #define RFUCMD_SEND_PLAYER_IDS_NEW 0x7800 #define RFUCMD_SEND_BLOCK_INIT 0x8800 #define RFUCMD_SEND_BLOCK 0x8900 #define RFUCMD_SEND_BLOCK_REQ 0xA100 #define RFUCMD_SEND_HELD_KEYS 0xBE00 #define RFUCMD_DISCONNECT 0xED00 #define RFUCMD_DISCONNECT_PARENT 0xEE00 #define RFU_SERIAL_GAME 0x0002 // Serial number for Pokémon game (FRLG or Emerald) #define RFU_SERIAL_WONDER_DISTRIBUTOR 0x7F7D // Serial number for distributing Wonder Cards / News #define RFU_SERIAL_END 0xFFFF #define COMM_SLOT_LENGTH 14 #define RECV_QUEUE_NUM_SLOTS 20 #define SEND_QUEUE_NUM_SLOTS 40 #define BACKUP_QUEUE_NUM_SLOTS 2 #define RFU_PACKET_SIZE 6 #define RFU_STATUS_OK 0 #define RFU_STATUS_FATAL_ERROR 1 #define RFU_STATUS_CONNECTION_ERROR 2 #define RFU_STATUS_CHILD_SEND_COMPLETE 3 #define RFU_STATUS_NEW_CHILD_DETECTED 4 #define RFU_STATUS_JOIN_GROUP_OK 5 #define RFU_STATUS_JOIN_GROUP_NO 6 #define RFU_STATUS_WAIT_ACK_JOIN_GROUP 7 #define RFU_STATUS_LEAVE_GROUP_NOTICE 8 #define RFU_STATUS_LEAVE_GROUP 9 #define RFU_STATUS_CHILD_LEAVE_READY 10 #define RFU_STATUS_CHILD_LEAVE 11 #define RFU_STATUS_ACK_JOIN_GROUP 12 // Values for disconnectMode enum { RFU_DISCONNECT_NONE, RFU_DISCONNECT_ERROR, RFU_DISCONNECT_NORMAL, }; // Values for errorState enum { RFU_ERROR_STATE_NONE, RFU_ERROR_STATE_OCCURRED, RFU_ERROR_STATE_PROCESSED, RFU_ERROR_STATE_DISCONNECTING, RFU_ERROR_STATE_IGNORE, }; // These error flags are set in errorInfo, and given as // the uppermost 16 bits of 'status' for sLinkErrorBuffer. // The first 8 bits are reserved for the link manager msg // when the error occurred, and the last 8 bits are this // sequence of presumably meaningful error flags, but // ultimately sLinkErrorBuffer's status is never read. #define F_RFU_ERROR_1 (1 << 8) #define F_RFU_ERROR_2 (1 << 9) // Never set #define F_RFU_ERROR_3 (1 << 10) // Never set #define F_RFU_ERROR_4 (1 << 11) // Never set #define F_RFU_ERROR_5 (1 << 12) #define F_RFU_ERROR_6 (1 << 13) #define F_RFU_ERROR_7 (1 << 14) #define F_RFU_ERROR_8 (1 << 15) // RfuTgtData.gname is read as these structs. struct RfuGameCompatibilityData { u16 language:4; u16 hasNews:1; u16 hasCard:1; u16 unknown:1; // Never read u16 canLinkNationally:1; u16 hasNationalDex:1; u16 gameClear:1; u16 version:4; u16 unused:2; u8 playerTrainerId[2]; }; // This struct is sent via the Wireless Adapter as the game name or "gname" data. // Gname is only applicable during Wireless Single Game Pak Multiplay, when the // adapter needs this data for connection. Per the RFU manual, during "normal" // wireless play (the kind the Pokémon games use) the gname data can be used for // anything the developers want. This struct is what GF decided to use it for. // It can be up to 13 bytes in size (RFU_GAME_NAME_LENGTH). // The player's name is sent separately as the username ("uname"), and does not // use a struct (gHostRfuUsername). struct __attribute__((packed, aligned(2))) RfuGameData { struct RfuGameCompatibilityData compatibility; u8 partnerInfo[RFU_CHILD_MAX]; u16 tradeSpecies:10; u16 tradeType:6; u8 activity:7; u8 startedActivity:1; u8 playerGender:1; u8 tradeLevel:7; u8 padding; }; // Constants for getting/setting information in 'partnerInfo' of RfuGameData. // This data is used to determine what the link partners look like from // the host's perspective. // Bits 0-2 are a shortened trainerId // Bit 3 is the player's gender // Bits 4-6 are unknown/unused // Bit 7 is an 'active' flag #define PINFO_TID_MASK 0x7 #define PINFO_GENDER_SHIFT 3 #define PINFO_ACTIVE_FLAG (1 << 7) struct RfuBlockSend { /* 0x00 */ u16 next; /* 0x02 */ u16 count; // max 21 /* 0x04 */ const u8 *payload; /* 0x08 */ u32 receivedFlags; /* 0x0c */ u32 failedFlags; /* 0x10 */ u8 sending; /* 0x11 */ u8 owner; /* 0x12 */ u8 receiving; }; struct RfuRecvQueue { /* 0x000 */ u8 slots[RECV_QUEUE_NUM_SLOTS][COMM_SLOT_LENGTH * MAX_RFU_PLAYERS]; /* 0x578 */ vu8 recvSlot; /* 0x579 */ vu8 sendSlot; /* 0x57a */ vu8 count; /* 0x57b */ vu8 full; }; struct RfuSendQueue { /* 0x000 */ u8 slots[SEND_QUEUE_NUM_SLOTS][COMM_SLOT_LENGTH]; /* 0x230 */ vu8 recvSlot; /* 0x231 */ vu8 sendSlot; /* 0x232 */ vu8 count; /* 0x233 */ vu8 full; }; struct RfuBackupQueue { /* 0x00 */ u8 slots[BACKUP_QUEUE_NUM_SLOTS][COMM_SLOT_LENGTH]; /* 0x1c */ vu8 recvSlot; /* 0x1d */ vu8 sendSlot; /* 0x1e */ vu8 count; }; struct RfuManager { /* 0x000 */ void (*callback)(void); /* 0x004 */ u16 state; /* 0x006 */ u8 unused1[4]; /* 0x00a */ u16 errorInfo; /* 0x00c */ u8 parentChild; /* 0x00d */ u8 playerCount; /* 0x00e */ bool8 runParentMain2; /* 0x00f */ u8 unused2; /* 0x010 */ u16 errorParams[2]; /* 0x014 */ u8 childRecvBuffer[RFU_CHILD_MAX][COMM_SLOT_LENGTH]; /* 0x04c */ u8 childSendBuffer[COMM_SLOT_LENGTH]; /* 0x05a */ u8 blockRequestType; /* 0x05b */ u8 sendBlockInitDelay; /* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS]; /* 0x061 */ u8 numBlocksReceived[MAX_RFU_PLAYERS]; /* 0x066 */ u8 idleTaskId; /* 0x067 */ u8 searchTaskId; /* 0x068 */ u8 unused3[4]; /* 0x06c */ struct RfuBlockSend sendBlock; /* 0x080 */ struct RfuBlockSend recvBlock[MAX_RFU_PLAYERS]; /* 0x0e4 */ bool8 readyCloseLink[MAX_RFU_PLAYERS]; /* 0x0e9 */ bool8 readyExitStandby[MAX_RFU_PLAYERS]; /* 0x0ee */ vu8 errorState; /* 0x0ef */ bool8 isShuttingDown; /* 0x0f0 */ u8 linkLossRecoveryState; /* 0x0f1 */ u8 status; /* 0x0f2 */ u16 packet[RFU_PACKET_SIZE]; /* 0x0fe */ u16 resendExitStandbyTimer; /* 0x100 */ u16 resendExitStandbyCount; /* 0x102 */ u8 childSendCmdId; /* 0x104 */ struct RfuTgtData parent; /* 0x124 */ struct RfuRecvQueue recvQueue; /* 0x6a0 */ struct RfuSendQueue sendQueue; /* 0x8d4 */ struct RfuBackupQueue backupQueue; /* 0x8f4 */ vu8 linkRecovered; /* 0x8f5 */ u8 reconnectParentId; /* 0x8f6 */ vu8 childSlot; /* 0x8f7 */ u8 childRecvQueue[COMM_SLOT_LENGTH * MAX_RFU_PLAYERS]; /* 0x93d */ u8 sendStatus; /* 0x93e */ u8 recvStatus; /* 0x93f */ u8 recvCmds[MAX_RFU_PLAYERS][CMD_LENGTH - 1][2]; /* 0x985 */ u8 parentId; /* 0x986 */ u8 multiplayerId; // childId /* 0x987 */ u8 connectParentFailures; /* 0x988 */ vu8 childSendCount; /* 0x989 */ u8 partnerSendStatuses[RFU_CHILD_MAX]; /* 0x98d */ u8 partnerRecvStatuses[RFU_CHILD_MAX]; /* 0x991 */ bool8 stopNewConnections; /* 0x992 */ u8 parentSendSlot; /* 0x993 */ vbool8 parentFinished; /* 0x994 */ vbool8 parentMain2Failed; /* 0x995 */ u8 unused5; /* 0x996 */ u8 linkPlayerIdx[RFU_CHILD_MAX]; /* 0x99a */ u8 parentSlots; /* 0x99b */ u8 disconnectSlots; /* 0x99c */ u8 disconnectMode; /* 0x99d */ u8 nextChildBits; /* 0x99e */ u8 newChildQueue; /* 0x99f */ u8 acceptSlot_flag; /* 0x9a0 */ bool8 playerExchangeActive; /* 0x9a1 */ u8 incomingChild; /* 0x9a2 */ u8 numChildRecvErrors[RFU_CHILD_MAX]; /* 0x9a6 */ u8 childRecvIds[RFU_CHILD_MAX]; }; // size: 0x9AC extern struct RfuGameData gHostRfuGameData; extern u8 gHostRfuUsername[]; extern struct RfuManager gRfu; void LinkRfu_FatalError(void); void MG_DrawCheckerboardPattern(void); void Rfu_SetCloseLinkCallback(void); bool8 IsLinkRfuTaskFinished(void); void DestroyWirelessStatusIndicatorSprite(void); void CreateTask_LinkMysteryGiftWithFriend(u32 activity); void CreateTask_LinkMysteryGiftOverWireless(u32 activity); void CreateTask_SendMysteryGift(u32 activity); void Rfu_SendPacket(void *data); u8 CreateTask_ListenToWireless(void); void DestroyTask_RfuIdle(void); void InitRFUAPI(void); void RfuSetIgnoreError(bool32 enable); bool32 IsSendingKeysToRfu(void); void ClearLinkRfuCallback(void); u8 Rfu_GetLinkPlayerCount(void); void StartSendingKeysToRfu(void); u8 Rfu_GetMultiplayerId(void); bool32 Rfu_InitBlockSend(const u8 * src, size_t size); bool8 Rfu_SendBlockRequest(u8 blockRequestType); u8 Rfu_GetBlockReceivedStatus(void); void Rfu_SetBlockReceivedFlag(u8 linkPlayerId); void Rfu_ResetBlockReceivedFlag(u8 linkPlayerId); bool8 Rfu_IsMaster(void); void ResetLinkRfuGFLayer(void); bool32 RfuMain1(void); bool32 RfuMain2(void); bool32 IsRfuRecvQueueEmpty(void); u32 GetRfuRecvQueueLength(void); void LinkRfu_Shutdown(void); void CreateTask_RfuIdle(void); bool8 Rfu_SetLinkRecovery(bool32 enable); void SetUsingUnionRoomStartMenu(void); struct RfuGameData *GetHostRfuGameData(void); void UpdateWirelessStatusIndicatorSprite(void); void InitRFU(void); bool32 RfuHasErrored(void); void RfuRecvQueue_Reset(struct RfuRecvQueue *queue); void RfuSendQueue_Reset(struct RfuSendQueue *queue); void RfuSetStatus(u8 status, u16 msg); u8 RfuGetStatus(void); void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *src); bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *dest); bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *dest); void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *dest); bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue * queue, u8 *dest); void RfuSendQueue_Enqueue(struct RfuSendQueue * queue, u8 *src); void InitHostRfuGameData(struct RfuGameData *data, u8 activity, bool32 started, s32 partnerInfo); void UpdateGameData_GroupLockedIn(bool8 started); bool32 IsRfuSerialNumberValid(u32 serialNo); bool8 IsRfuRecoveringFromLinkLoss(void); bool8 LmanAcceptSlotFlagIsNotZero(void); void LinkRfu_StopManagerAndFinalizeSlots(void); bool32 RfuTryDisconnectLeavingChildren(void); bool32 IsRfuCommunicatingWithAllChildren(void); bool32 WaitRfuState(bool32 force); bool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *trainerName); void SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name); u32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name); void SetHostRfuGameData(u8 activity, u32 partnerInfo, bool32 startedActivity); void InitializeRfuLinkManager_LinkLeader(u32 availSlots); void RequestDisconnectSlotByTrainerNameAndId(const u8 *trainerName, u16 trainerId); void CopyHostRfuGameDataAndUsername(struct RfuGameData *gameData, u8 *username); void InitializeRfuLinkManager_JoinGroup(void); void SendLeaveGroupNotice(void); void CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId); void UpdateGameData_SetActivity(u8 activity, u32 partnerInfo, u32 startedActivity); void SaveLinkTrainerNames(void); void LinkRfu_CreateConnectionAsParent(); void LinkRfu_StopManagerBeforeEnteringChat(); void SetHostRfuWonderFlags(bool32 hasNews, bool32 hasCard); void ResetHostRfuGameData(void); void StopUnionRoomLinkManager(void); void SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level); bool32 IsUnionRoomListenTaskActive(void); void InitializeRfuLinkManager_EnterUnionRoom(void); void Rfu_DisconnectPlayerById(u32 playerIdx); void TryConnectToUnionRoomParent(const u8 *name, struct RfuGameData *parent, u8 activity); bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name); bool8 Rfu_GetCompatiblePlayerData(struct RfuGameData *gameData, u8 *username, u8 idx); bool8 Rfu_GetWonderDistributorPlayerData(struct RfuGameData *gameData, u8 *username, u8 idx); bool32 Rfu_IsPlayerExchangeActive(void); void Rfu_StopPartnerSearch(void); void RfuSetNormalDisconnectMode(void); void SetUnionRoomChatPlayerData(u32 numPlayers); void ClearRecvCommands(void); #include "mystery_gift_server.h" extern const struct MysteryGiftServerCmd gServerScript_ClientCanceledCard[]; #endif //GUARD_LINK_RFU_H ================================================ FILE: include/list_menu.h ================================================ #ifndef GUARD_LIST_MENU_H #define GUARD_LIST_MENU_H #include "global.h" #include "window.h" #define LIST_NOTHING_CHOSEN -1 #define LIST_CANCEL -2 #define LIST_HEADER -3 #define LIST_NO_MULTIPLE_SCROLL 0 #define LIST_MULTIPLE_SCROLL_DPAD 1 #define LIST_MULTIPLE_SCROLL_L_R 2 enum { SCROLL_ARROW_LEFT, SCROLL_ARROW_RIGHT, SCROLL_ARROW_UP, SCROLL_ARROW_DOWN, }; struct ListMenuItem { const u8 *label; u32 index; }; struct ListMenu; // For ListMenuGet/SetTemplateField enum ListMenuFields { LISTFIELD_MOVECURSORFUNC = 0, LISTFIELD_MOVECURSORFUNC2, LISTFIELD_TOTALITEMS, LISTFIELD_MAXSHOWED, LISTFIELD_WINDOWID, LISTFIELD_HEADERX, LISTFIELD_ITEMX, LISTFIELD_CURSORX, LISTFIELD_UPTEXTY, LISTFIELD_CURSORPAL, LISTFIELD_FILLVALUE, LISTFIELD_CURSORSHADOWPAL, LISTFIELD_LETTERSPACING, LISTFIELD_ITEMVERTICALPADDING, LISTFIELD_SCROLLMULTIPLE, LISTFIELD_FONTID, LISTFIELD_CURSORKIND, }; struct ListMenuTemplate { /*0x00*/ const struct ListMenuItem *items; /*0x04*/ void (* moveCursorFunc)(s32 itemIndex, bool8 onInit, struct ListMenu *list); /*0x08*/ void (* itemPrintFunc)(u8 windowId, u32 itemId, u8 y); /*0x0C*/ u16 totalItems; /*0x0E*/ u16 maxShowed; /*0x10*/ u8 windowId; /*0x11*/ u8 header_X; /*0x12*/ u8 item_X; /*0x13*/ u8 cursor_X; /*0x14*/ u8 upText_Y:4; // x1, x2, x4, x8 = xF u8 cursorPal:4; // x10, x20, x40, x80 = xF0 /*0x15*/ u8 fillValue:4; // x1, x2, x4, x8 = xF u8 cursorShadowPal:4; // x10, x20, x40, x80 = xF0 /*0x16*/ u8 lettersSpacing:3; u8 itemVerticalPadding:3; u8 scrollMultiple:2; // x40, x80 = xC0 /*0x17*/ u8 fontId:6; // x1, x2, x4, x8, x10, x20 = x3F u8 cursorKind:2; // x40, x80 }; /* size = 0x18 */ struct ListMenu { struct ListMenuTemplate template; u16 cursorPos; u16 itemsAbove; u8 unk_1C; u8 unk_1D; u8 taskId; u8 unk_1F; }; struct ListMenuWindowRect { u8 x; u8 y; u8 width; u8 height; u8 palNum; }; extern struct ListMenuTemplate gMultiuseListMenuTemplate; u32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum); u8 ListMenuInit(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove); u8 ListMenuInitInRect(const struct ListMenuTemplate *listMenuTemplate, const struct ListMenuWindowRect *rect, u16 cursorPos, u16 itemsAbove); s32 ListMenu_ProcessInput(u8 listTaskId); void DestroyListMenuTask(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove); void RedrawListMenu(u8 listTaskId); void ListMenuGetScrollAndRow(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove); u16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId); void ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal); void ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); void ListMenuSetTemplateField(u8 taskId, u8 field, s32 value); #endif //GUARD_LIST_MENU_H ================================================ FILE: include/load_save.h ================================================ #ifndef GUARD_LOAD_SAVE_H #define GUARD_LOAD_SAVE_H #include "global.h" extern bool32 gFlashMemoryPresent; extern struct SaveBlock1 gSaveBlock1; extern struct SaveBlock2 gSaveBlock2; extern struct PokemonStorage gPokemonStorage; void ClearSav2(void); void ClearSav1(void); void CheckForFlashMemory(void); void MoveSaveBlocks_ResetHeap(void); bool32 GetSecretBase2Field_9(void); void ClearSecretBase2Field_9(void); void SetSecretBase2Field_9(void); void SetSecretBase2Field_9_AndHideBG(void); void ClearSecretBase2Field_9_2(void); void SavePlayerParty(void); void LoadPlayerParty(void); void SaveSerializedGame(void); void LoadSerializedGame(void); void LoadPlayerBag(void); void SavePlayerBag(void); void SetSaveBlocksPointers(void); void MoveSaveBlocks_ResetHeap(void); void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey); void ApplyNewEncryptionKeyToBagItems(u32 encryptionKey); void ApplyNewEncryptionKeyToWord(u32 * word, u32 encryptionKey); void ApplyNewEncryptionKeyToHword(u16 * hword, u32 encryptionKey); void ClearContinueGameWarpStatus2(void); void SetContinueGameWarpStatusToDynamicWarp(void); void SetContinueGameWarpStatus(void); bool32 UseContinueGameWarp(void); void ClearContinueGameWarpStatus(); void SerializeKeyItemSlots(void); #endif // GUARD_LOAD_SAVE_H ================================================ FILE: include/m4a.h ================================================ #ifndef GUARD_M4A_H #define GUARD_M4A_H #include "gba/m4a_internal.h" void m4aSoundVSync(void); void m4aSoundVSyncOn(void); void m4aSoundInit(void); void m4aSoundMain(void); void m4aSongNumStart(u16 n); void m4aSongNumStartOrChange(u16 n); void m4aSongNumStop(u16 n); void m4aMPlayAllStop(void); void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo); void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed); void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed); void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed); void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo); extern struct MusicPlayerInfo gMPlayInfo_BGM; extern struct MusicPlayerInfo gMPlayInfo_SE1; extern struct MusicPlayerInfo gMPlayInfo_SE2; extern struct MusicPlayerInfo gMPlayInfo_SE3; extern struct SoundInfo gSoundInfo; extern const struct SongHeader mus_victory_gym_leader; #endif //GUARD_M4A_H ================================================ FILE: include/mail.h ================================================ #ifndef GUARD_MAIL_H #define GUARD_MAIL_H #include "global.h" #define MAIL_WORDS_COUNT 9 #define IS_ITEM_MAIL(itemId)((itemId == ITEM_ORANGE_MAIL \ || itemId == ITEM_HARBOR_MAIL \ || itemId == ITEM_GLITTER_MAIL \ || itemId == ITEM_MECH_MAIL \ || itemId == ITEM_WOOD_MAIL \ || itemId == ITEM_WAVE_MAIL \ || itemId == ITEM_BEAD_MAIL \ || itemId == ITEM_SHADOW_MAIL \ || itemId == ITEM_TROPIC_MAIL \ || itemId == ITEM_DREAM_MAIL \ || itemId == ITEM_FAB_MAIL \ || itemId == ITEM_RETRO_MAIL)) #define FIRST_MAIL_IDX ITEM_ORANGE_MAIL #define ITEM_TO_MAIL(itemId) (itemId - FIRST_MAIL_IDX) void ReadMail(struct Mail * mail, void (*savedCallback)(void), bool8 messageExists); #endif // GUARD_MAIL_H ================================================ FILE: include/mail_data.h ================================================ #ifndef GUARD_MAIL_DATA_H #define GUARD_MAIL_DATA_H #include "global.h" void ClearMailData(void); void ClearMailStruct(struct Mail *mail); bool8 MonHasMail(struct Pokemon *mon); u8 GiveMailToMon(struct Pokemon *mon, u16 itemId); u16 SpeciesToMailSpecies(u16 species, u32 personality); u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer); u8 GiveMailToMon2(struct Pokemon *mon, struct Mail *mail); void TakeMailFromMon(struct Pokemon *mon); void ClearMailItemId(u8 mailId); u8 TakeMailFromMon2(struct Pokemon *mon); bool8 ItemIsMail(u16 itemId); #endif //GUARD_MAIL_DATA_H ================================================ FILE: include/mailbox_pc.h ================================================ #ifndef GUARD_MAILBOX_PC_H #define GUARD_MAILBOX_PC_H #include "player_pc.h" bool8 MailboxPC_InitBuffers(u8 num); u8 MailboxPC_GetAddWindow(u8 winIdx); void MailboxPC_RemoveWindow(u8 winIdx); u8 MailboxPC_GetWindowId(u8 winIdx); u8 MailboxPC_InitListMenu(struct PlayerPCItemPageStruct * playerPcStruct); void MailboxPC_AddScrollIndicatorArrows(struct PlayerPCItemPageStruct * playerPcStruct); void MailboxPC_DestroyListMenuBuffer(void); #endif //GUARD_MAILBOX_PC_H ================================================ FILE: include/main.h ================================================ #ifndef GUARD_MAIN_H #define GUARD_MAIN_H typedef void (*MainCallback)(void); typedef void (*IntrCallback)(void); typedef void (*IntrFunc)(void); #include "global.h" extern IntrFunc gIntrTable[]; struct Main { /*0x000*/ MainCallback callback1; /*0x004*/ MainCallback callback2; /*0x008*/ MainCallback savedCallback; /*0x00C*/ IntrCallback vblankCallback; /*0x010*/ IntrCallback hblankCallback; /*0x014*/ IntrCallback vcountCallback; /*0x018*/ IntrCallback serialCallback; /*0x01C*/ vu16 intrCheck; /*0x020*/ u32 *vblankCounter1; /*0x024*/ u32 vblankCounter2; /*0x028*/ u16 heldKeysRaw; // held keys without L=A remapping /*0x02A*/ u16 newKeysRaw; // newly pressed keys without L=A remapping /*0x02C*/ u16 heldKeys; // held keys with L=A remapping /*0x02E*/ u16 newKeys; // newly pressed keys with L=A remapping /*0x030*/ u16 newAndRepeatedKeys; // newly pressed keys plus key repeat /*0x032*/ u16 keyRepeatCounter; // counts down to 0, triggering key repeat /*0x034*/ bool16 watchedKeysPressed; // whether one of the watched keys was pressed /*0x036*/ u16 watchedKeysMask; // bit mask for watched keys /*0x038*/ struct OamData oamBuffer[128]; /*0x438*/ u8 state; /*0x439*/ u8 oamLoadDisabled:1; /*0x439*/ u8 inBattle:1; /*0x439*/ u8 field_439_x4:1; }; extern struct Main gMain; extern bool8 gSoftResetDisabled; extern bool8 gLinkVSyncDisabled; extern const u8 gGameVersion; extern const u8 gGameLanguage; void AgbMain(void); void SetMainCallback2(MainCallback callback); void InitKeys(void); void SetVBlankCallback(IntrCallback callback); void SetHBlankCallback(IntrCallback callback); void SetVCountCallback(IntrCallback callback); void SetSerialCallback(IntrCallback callback); void InitFlashTimer(void); void DoSoftReset(void); void ClearPokemonCrySongs(void); void RestoreSerialTimer3IntrHandlers(void); void SetVBlankCounter1Ptr(u32 *ptr); void DisableVBlankCounter1(void); void StartTimer1(void); void SeedRngAndSetTrainerId(void); u16 GetGeneratedTrainerIdLower(void); #define GAME_CODE_LENGTH 4 extern const char RomHeaderGameCode[GAME_CODE_LENGTH]; extern const char RomHeaderSoftwareVersion; extern u8 gLinkTransferringData; extern u16 gKeyRepeatStartDelay; #endif // GUARD_MAIN_H ================================================ FILE: include/main_menu.h ================================================ #ifndef GUARD_MAIN_MENU_H #define GUARD_MAIN_MENU_H void CB2_InitMainMenu(void); #endif //GUARD_MAIN_MENU_H ================================================ FILE: include/malloc.h ================================================ #ifndef GUARD_MALLOC_H #define GUARD_MALLOC_H #include "global.h" #define HEAP_SIZE 0x1C000 #define malloc Alloc #define calloc(ct, sz) AllocZeroed((ct) * (sz)) #define free Free #define FREE_AND_SET_NULL(ptr) \ { \ free(ptr); \ ptr = NULL; \ } #define TRY_FREE_AND_SET_NULL(ptr) if (ptr != NULL) FREE_AND_SET_NULL(ptr) extern u8 gHeap[]; void *Alloc(u32 size); void *AllocZeroed(u32 size); void Free(void *pointer); void InitHeap(void *pointer, u32 size); #endif // GUARD_MALLOC_H ================================================ FILE: include/map_name_popup.h ================================================ #ifndef GUARD_MAP_NAME_POPUP_H #define GUARD_MAP_NAME_POPUP_H #include "global.h" void ShowMapNamePopup(bool32 palIntoFadedBuffer); void DismissMapNamePopup(void); #endif //GUARD_MAP_NAME_POPUP_H ================================================ FILE: include/map_preview_screen.h ================================================ #ifndef GUARD_MAP_PREVIEW_SCREEN_H #define GUARD_MAP_PREVIEW_SCREEN_H enum MapPreviewScreenId { MPS_VIRIDIAN_FOREST = 0u, MPS_MT_MOON, MPS_DIGLETTS_CAVE, MPS_ROCK_TUNNEL, MPS_POKEMON_TOWER, MPS_SAFARI_ZONE, MPS_SEAFOAM_ISLANDS, MPS_POKEMON_MANSION, MPS_ROCKET_HIDEOUT, MPS_SILPH_CO, MPS_VICTORY_ROAD, MPS_CERULEAN_CAVE, MPS_POWER_PLANT, MPS_MT_EMBER, MPS_ROCKET_WAREHOUSE, MPS_MONEAN_CHAMBER, MPS_DOTTED_HOLE, MPS_BERRY_FOREST, MPS_ICEFALL_CAVE, MPS_LOST_CAVE, MPS_ALTERING_CAVE, MPS_PATTERN_BUSH, MPS_LIPTOO_CHAMBER, MPS_WEEPTH_CHAMBER, MPS_TDILFORD_CHAMBER, MPS_SCUFIB_CHAMBER, MPS_RIXY_CHAMBER, MPS_VIAPOIS_CHAMBER, MPS_COUNT }; #define MPS_TYPE_CAVE 0 #define MPS_TYPE_FOREST 1 #define MPS_TYPE_ANY 2 struct MapPreviewScreen { u8 mapsec; u8 type; u16 flagId; const void *tilesptr; const void *tilemapptr; const void *palptr; }; u16 MapPreview_CreateMapNameWindow(u8 id); void MapPreview_SetFlag(u16 a0); u16 MapPreview_GetDuration(u8 id); bool8 MapHasPreviewScreen(u8 mapsec, u8 type); bool32 ForestMapPreviewScreenIsRunning(void); const struct MapPreviewScreen * GetDungeonMapPreviewScreenInfo(u8 mapsec); bool32 MapHasPreviewScreen_HandleQLState2(u8 mapsec, u8 type); void MapPreview_InitBgs(void); void MapPreview_LoadGfx(u8 mapsec); bool32 MapPreview_IsGfxLoadFinished(void); void MapPreview_Unload(s32 windowId); void MapPreview_StartForestTransition(u8 mapsec); #endif //GUARD_MAP_PREVIEW_SCREEN_H ================================================ FILE: include/math_util.h ================================================ #ifndef GUARD_MATH_UTIL_H #define GUARD_MATH_UTIL_H // Fixed-point arithmetic library. // x * y s16 Q_8_8_mul(s16 x, s16 y); s16 Q_N_S_mul(u8 s, s16 x, s16 y); s32 Q_24_8_mul(s32 x, s32 y); // x / y s16 Q_8_8_div(s16 x, s16 y); s16 Q_N_S_div(u8 s, s16 x, s16 y); s32 Q_24_8_div(s32 x, s32 y); // 1.0 / y s16 Q_8_8_inv(s16 y); s16 Q_N_S_inv(u8 s, s16 y); s32 Q_24_8_inv(s32 y); #endif //GUARD_MATH_UTIL_H ================================================ FILE: include/menu.h ================================================ #ifndef GUARD_MENU_H #define GUARD_MENU_H #include "global.h" #include "text.h" #include "window.h" #define MENU_NOTHING_CHOSEN -2 #define MENU_B_PRESSED -1 #define MENU_INFO_ICON_CAUGHT 0 #define MENU_INFO_ICON_TYPE (NUMBER_OF_MON_TYPES + 1) #define MENU_INFO_ICON_POWER (NUMBER_OF_MON_TYPES + 2) #define MENU_INFO_ICON_ACCURACY (NUMBER_OF_MON_TYPES + 3) #define MENU_INFO_ICON_PP (NUMBER_OF_MON_TYPES + 4) #define MENU_INFO_ICON_EFFECT (NUMBER_OF_MON_TYPES + 5) struct MenuAction { const u8 *text; union { void (*void_u8)(u8); u8 (*u8_void)(void); } func; }; // menu2 void AddTextPrinterParameterized3(u8 windowId, u8 fontId, u8 x, u8 y, const u8 * color, s8 speed, const u8 * str); void AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const u8 *color, s8 speed, const u8 *str); void AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing); void Menu_PrintFormatIntlPlayerName(u8 windowId, const u8 * src, u16 x, u16 y); void StartBlendTask(u8 eva_start, u8 evb_start, u8 eva_end, u8 evb_end, u8 ev_step, u8 priority); bool8 IsBlendTaskActive(void); u8 Menu2_GetMonSpriteAnchorCoord(u16 species, u32 personality, u8 a2); s8 Menu2_GetMonSpriteAnchorCoordMinusx20(u16 species, u32 personality, u8 a2); // list_menu void ListMenu_LoadMonIconPalette(u8 palOffset, u16 speciesId); void ListMenu_DrawMonIconGraphics(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y); void ListMenuLoadStdPalAt(u8 palOffset, u8 palId); void BlitMenuInfoIcon(u8 windowId, u8 iconId, u16 x, u16 y); // menu s8 Menu_ProcessInputGridLayout(void); u8 MultichoiceGrid_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cols, u8 rows, u8 cursorPos); void MultichoiceGrid_PrintItems(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs); void DestroyYesNoMenu(void); s8 Menu_ProcessInputNoWrapClearOnChoose(void); void CreateYesNoMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos); void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray); void PrintMenuTable(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs); void MultichoiceList_PrintItems(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, u8 letterSpacing, u8 lineSpacing); void PrintTextArray(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs); s8 Menu_ProcessInputNoWrapAround_other(void); s8 Menu_ProcessInput_other(void); s8 Menu_ProcessInputNoWrapAround(void); s8 Menu_ProcessInput(void); u8 Menu_GetCursorPos(void); u8 Menu_MoveCursorNoWrapAround(s8 cursorDelta); u8 Menu_MoveCursor(s8 cursorDelta); u8 Menu_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos); u8 Menu_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos, bool8 APressMuted); void TopBarWindowPrintTwoStrings(const u8 *string, const u8 *string2, bool8 fgColorChooser, u8 notUsed, bool8 copyToVram); void TopBarWindowPrintString(const u8 *string, u8 unUsed, bool8 copyToVram); void ClearTopBarWindow(void); void DestroyTopBarWindow(void); u8 CreateTopBarWindowLoadPalette(u8 bg, u8 width, u8 yPos, u8 palette, u16 baseTile); void ClearStdWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram); void DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum); void ClearDialogWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram); void DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 tileNum, u8 paletteNum); struct WindowTemplate SetWindowTemplateFields(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock); s16 Menu_ProcessInputNoWrapAround2(void); #endif // GUARD_MENU_H ================================================ FILE: include/menu_helpers.h ================================================ #ifndef GUARD_MENU_HELPERS_H #define GUARD_MENU_HELPERS_H #include "global.h" #include "task.h" #include "window.h" #define MENU_L_PRESSED 1 #define MENU_R_PRESSED 2 struct YesNoFuncTable { TaskFunc yesFunc; TaskFunc noFunc; }; bool16 RunTextPrinters_CheckActive(u8 textPrinterId); bool8 IsActiveOverworldLinkBusy(void); bool8 MenuHelpers_ShouldWaitForLinkRecv(void); bool8 MenuHelpers_IsLinkActive(void); void SetVBlankHBlankCallbacksToNull(void); void ResetAllBgsCoordinatesAndBgCntRegs(void); u8 GetDialogBoxFontId(void); bool8 AdjustQuantityAccordingToDPadInput(s16 *quantity_p, u16 qmax); void DisplayMessageAndContinueTask(u8 taskId, u8 windowId, u16 tileNum, u8 paletteNum, u8 fontId, u8 textSpeed, const u8 *string, void *taskFunc); void CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *template, u8 fontId, u8 left, u8 top, u16 tileStart, u8 palette, const struct YesNoFuncTable *yesNo); u8 GetLRKeysPressed(void); u8 GetLRKeysPressedAndHeld(void); bool8 IsHoldingItemAllowed(u16 itemId); bool8 IsWritingMailAllowed(u16 itemId); void ResetVramOamAndBgCntRegs(void); #endif //GUARD_MENU_HELPERS_H ================================================ FILE: include/menu_indicators.h ================================================ #ifndef GUARD_MENU_INDICATORS_H #define GUARD_MENU_INDICATORS_H #include "global.h" struct ScrollArrowsTemplate { u8 firstArrowType; u8 firstX; u8 firstY; u8 secondArrowType; u8 secondX; u8 secondY; u16 fullyUpThreshold; u16 fullyDownThreshold; u16 tileTag; u16 palTag; u8 palNum; }; struct CursorStruct { u8 left; u8 top; u16 rowWidth; u16 rowHeight; u16 tileTag; u16 palTag; u8 palNum; }; u8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset); u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate * template, u16 * a1); void RemoveScrollIndicatorArrowPair(u8); u8 ListMenuAddCursorObjectInternal(const struct CursorStruct *cursor, u32 cursorKind); u8 ListMenuAddRedOutlineCursorObject(const struct CursorStruct *cursor); void ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y); void ListMenuRemoveRedOutlineCursorObject(u8 taskId); void ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind); void ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind); #endif //GUARD_MENU_INDICATORS_H ================================================ FILE: include/metatile_behavior.h ================================================ #ifndef GUARD_METATILE_BEHAVIOR #define GUARD_METATILE_BEHAVIOR #include "global.h" bool8 MetatileBehavior_IsATile(u8 metatileBehavior); bool8 MetatileBehavior_IsJumpEast(u8 metatileBehavior); bool8 MetatileBehavior_IsJumpWest(u8 metatileBehavior); bool8 MetatileBehavior_IsJumpNorth(u8 metatileBehavior); bool8 MetatileBehavior_IsJumpSouth(u8 metatileBehavior); bool8 MetatileBehavior_IsPokeGrass(u8 metatileBehavior); bool8 MetatileBehavior_IsSand(u8 metatileBehavior); bool8 MetatileBehavior_IsSandOrShallowFlowingWater(u8 metatileBehavior); bool8 MetatileBehavior_IsDeepSand(u8 metatileBehavior); bool8 MetatileBehavior_IsReflective(u8 metatileBehavior); bool8 MetatileBehavior_IsIce(u8 metatileBehavior); bool8 MetatileBehavior_IsWarpDoor(u8 metatileBehavior); bool8 MetatileBehavior_IsWarpDoor_2(u8 metatileBehavior); bool8 MetatileBehavior_IsEscalator(u8 metatileBehavior); bool8 MetatileBehavior_IsDirectionalUpRightStairWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsDirectionalUpLeftStairWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsDirectionalDownRightStairWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsDirectionalDownLeftStairWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsDirectionalStairWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsLadder(u8 metatileBehavior); bool8 MetatileBehavior_IsNonAnimDoor(u8 metatileBehavior); bool8 MetatileBehavior_IsDeepSouthWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsSurfable(u8 metatileBehavior); bool8 MetatileBehavior_IsFastWater(u8 metatileBehavior); bool8 MetatileBehavior_IsEastArrowWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsWestArrowWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsNorthArrowWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsSouthArrowWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsForcedMovementTile(u8 metatileBehavior); bool8 MetatileBehavior_IsIce_2(u8 metatileBehavior); bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 metatileBehavior); bool8 MetatileBehavior_IsWalkNorth(u8 metatileBehavior); bool8 MetatileBehavior_IsWalkSouth(u8 metatileBehavior); bool8 MetatileBehavior_IsWalkWest(u8 metatileBehavior); bool8 MetatileBehavior_IsWalkEast(u8 metatileBehavior); bool8 MetatileBehavior_IsNorthwardCurrent(u8 metatileBehavior); bool8 MetatileBehavior_IsSouthwardCurrent(u8 metatileBehavior); bool8 MetatileBehavior_IsWestwardCurrent(u8 metatileBehavior); bool8 MetatileBehavior_IsEastwardCurrent(u8 metatileBehavior); bool8 MetatileBehavior_IsSlideNorth(u8 metatileBehavior); bool8 MetatileBehavior_IsSlideSouth(u8 metatileBehavior); bool8 MetatileBehavior_IsSlideWest(u8 metatileBehavior); bool8 MetatileBehavior_IsSlideEast(u8 metatileBehavior); bool8 MetatileBehavior_IsCounter(u8 metatileBehavior); bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 metatileBehavior, u8 playerDirection); bool8 MetatileBehavior_IsPC(u8 metatileBehavior); bool8 MetatileBehavior_HasRipples(u8 metatileBehavior); bool8 MetatileBehavior_IsPuddle(u8 metatileBehavior); bool8 MetatileBehavior_IsTallGrass(u8 metatileBehavior); bool8 MetatileBehavior_IsLongGrass(u8 metatileBehavior); bool8 MetatileBehavior_IsAshGrass(u8 metatileBehavior); bool8 MetatileBehavior_IsFootprints(u8 metatileBehavior); bool8 MetatileBehavior_IsBridge(u8 metatileBehavior); bool8 MetatileBehavior_GetBridgeType(u8 metatileBehavior); bool8 MetatileBehavior_IsIndoorEncounter(u8 metatileBehavior); bool8 MetatileBehavior_IsMountain(u8 metatileBehavior); bool8 MetatileBehavior_IsDiveable(u8 metatileBehavior); bool8 MetatileBehavior_IsUnableToEmerge(u8 metatileBehavior); bool8 MetatileBehavior_IsShallowFlowingWater(u8 metatileBehavior); bool8 MetatileBehavior_IsThinIce(u8 metatileBehavior); bool8 MetatileBehavior_IsCrackedIce(u8 metatileBehavior); bool8 MetatileBehavior_IsDeepWaterTerrain(u8 metatileBehavior); bool8 MetatileBehavior_IsSurfableAndNotWaterfall(u8 metatileBehavior); bool8 MetatileBehavior_IsEastBlocked(u8 metatileBehavior); bool8 MetatileBehavior_IsWestBlocked(u8 metatileBehavior); bool8 MetatileBehavior_IsNorthBlocked(u8 metatileBehavior); bool8 MetatileBehavior_IsSouthBlocked(u8 metatileBehavior); bool8 MetatileBehavior_IsShortGrass(u8 metatileBehavior); bool8 MetatileBehavior_IsHotSprings(u8 metatileBehavior); bool8 MetatileBehavior_IsWaterfall(u8 metatileBehavior); bool8 MetatileBehavior_IsFortreeBridge(u8 metatileBehavior); bool8 MetatileBehavior_IsPacifidlogLog(u8 metatileBehavior); bool8 MetatileBehavior_IsRegionMap(u8 metatileBehavior); bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsLavaridge1FWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsWarpPad(u8 metatileBehavior); bool8 MetatileBehavior_IsUnionRoomWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsWater(u8 metatileBehavior); bool8 MetatileBehavior_IsFallWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsCrackedFloor(u8 metatileBehavior); bool32 MetatileBehavior_IsCyclingRoadPullDownTile(u8 metatileBehavior); bool8 MetatileBehavior_IsCyclingRoadPullDownTileGrass(u8 metatileBehavior); bool8 MetatileBehavior_IsBumpySlope(u8 metatileBehavior); bool8 MetatileBehavior_IsIsolatedVerticalRail(u8 metatileBehavior); bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 metatileBehavior); bool8 MetatileBehavior_IsVerticalRail(u8 metatileBehavior); bool8 MetatileBehavior_IsHorizontalRail(u8 metatileBehavior); bool8 MetatileBehavior_IsSeaweed(u8 metatileBehavior); bool8 MetatileBehavior_IsRunningDisallowed(u8 metatileBehavior); bool8 MetatileBehavior_IsSafariExtensionSign(u8 metatileBehavior, u8 playerDirection); bool8 MetatileBehavior_IsBookshelf(u8 metatileBehavior); bool8 MetatileBehavior_IsPokeMartShelf(u8 metatileBehavior); bool8 MetatileBehavior_IsPlayerFacingPokemonCenterSign(u8 metatileBehavior, u8 playerDirection); bool8 MetatileBehavior_IsPlayerFacingPokeMartSign(u8 metatileBehavior, u8 playerDirection); bool8 TestMetatileAttributeBit(u8 attr, u8 bitmask); bool8 MetatileBehavior_IsSpinRight(u8 metatileBehavior); bool8 MetatileBehavior_IsSpinLeft(u8 metatileBehavior); bool8 MetatileBehavior_IsSpinUp(u8 metatileBehavior); bool8 MetatileBehavior_IsSpinDown(u8 metatileBehavior); bool8 MetatileBehavior_IsStopSpinning(u8 metatileBehavior); bool8 MetatileBehavior_IsSpinTile(u8 metatileBehavior); bool8 MetatileBehavior_IsSignpost(u8 metatileBehavior); bool8 MetatileBehavior_IsCabinet(u8 metatileBehavior); bool8 MetatileBehavior_IsKitchen(u8 metatileBehavior); bool8 MetatileBehavior_IsDresser(u8 metatileBehavior); bool8 MetatileBehavior_IsSnacks(u8 metatileBehavior); bool8 MetatileBehavior_IsStrengthButton(u8 metatileBehavior); bool8 MetatileBehavior_IsPlayerFacingCableClubWirelessMonitor(u8 metatileBehavior, u8 playerDirection); bool8 MetatileBehavior_IsPlayerFacingBattleRecords(u8 metatileBehavior, u8 playerDirection); bool8 MetatileBehavior_IsQuestionnaire(u8 metatileBehavior); bool8 MetatileBehavior_IsIndigoPlateauSign1(u8 metatileBehavior); bool8 MetatileBehavior_IsIndigoPlateauSign2(u8 metatileBehavior); bool8 MetatileBehavior_IsFood(u8 metatileBehavior); bool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior); bool8 MetatileBehavior_IsBlueprints(u8 metatileBehavior); bool8 MetatileBehavior_IsPainting(u8 metatileBehavior); bool8 MetatileBehavior_IsPowerPlantMachine(u8 metatileBehavior); bool8 MetatileBehavior_IsTelephone(u8 metatileBehavior); bool8 MetatileBehavior_IsComputer(u8 metatileBehavior); bool8 MetatileBehavior_IsAdvertisingPoster(u8 metatileBehavior); bool8 MetatileBehavior_IsTastyFood(u8 metatileBehavior); bool8 MetatileBehavior_IsTrashBin(u8 metatileBehavior); bool8 MetatileBehavior_IsCup(u8 metatileBehavior); bool8 MetatileBehavior_IsPolishedWindow(u8 metatileBehavior); bool8 MetatileBehavior_IsBeautifulSkyWindow(u8 metatileBehavior); bool8 MetatileBehavior_IsBlinkingLights(u8 metatileBehavior); bool8 MetatileBehavior_IsNeatlyLinedUpTools(u8 metatileBehavior); bool8 MetatileBehavior_IsImpressiveMachine(u8 metatileBehavior); bool8 MetatileBehavior_IsVideoGame(u8 metatileBehavior); bool8 MetatileBehavior_IsBurglary(u8 metatileBehavior); bool8 MetatileBehavior_IsTrainerTowerMonitor(u8 metatileBehavior); bool8 MetatileBehavior_IsAshGrass(u8 metatileBehavior); bool8 MetatileBehavior_IsSecretBaseJumpMat(u8 metatileBehavior); bool8 MetatileBehavior_IsSecretBaseSpinMat(u8 metatileBehavior); #endif // GUARD_METATILE_BEHAVIOR ================================================ FILE: include/mini_printf.h ================================================ /* * The Minimal snprintf() implementation * * Copyright (c) 2013 Michal Ludvig * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the auhor nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Courtey of https://github.com/mludvig/mini-printf * stripped to reduce file size for agb needs */ #ifndef __MINI_PRINTF__ #define __MINI_PRINTF__ #include #include "gba/types.h" #ifdef NDEBUG #define mini_vsnprintf(buffer, buffer_len, fmt, va) #define mini_vpprintf(buf, fmt, va) #else s32 mini_vsnprintf(char* buffer, u32 buffer_len, const char *fmt, va_list va); s32 mini_vpprintf(void* buf, const char *fmt, va_list va); #endif #endif ================================================ FILE: include/minigame_countdown.h ================================================ #ifndef GUARD_MINIGAME_COUNTDOWN_H #define GUARD_MINIGAME_COUNTDOWN_H void StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority); bool32 IsMinigameCountdownRunning(void); #endif //GUARD_MINIGAME_COUNTDOWN_H ================================================ FILE: include/mon_markings.h ================================================ #ifndef GUARD_MON_MARKINGS_H #define GUARD_MON_MARKINGS_H #define NUM_MON_MARKINGS 4 struct MonMarkingsMenu { /*0x0000*/ u16 baseTileTag; /*0x0002*/ u16 basePaletteTag; /*0x0004*/ u8 markings; // bit flags /*0x0005*/ s8 cursorPos; /*0x0006*/ bool8 markingsArray[NUM_MON_MARKINGS]; /*0x000A*/ u8 cursorBaseY; /*0x000B*/ bool8 spriteSheetLoadRequired; /*0x000C*/ struct Sprite *windowSprites[2]; // upper and lower halves of menu window /*0x0014*/ struct Sprite *markingSprites[NUM_MON_MARKINGS]; /*0x0024*/ struct Sprite *cursorSprite; /*0x0028*/ struct Sprite *textSprite; /*0x002C*/ const u8 *frameTiles; /*0x0030*/ const u16 *framePalette; /*0x0034*/ u8 windowSpriteTiles[0x1000]; /*0x1034*/ u8 unused[0x80]; /*0x10B4*/ u8 tileLoadState; }; // 10b8 void InitMonMarkingsMenu(struct MonMarkingsMenu *ptr); void BufferMonMarkingsMenuTiles(void); void OpenMonMarkingsMenu(u8 markings, s16 x, s16 y); void FreeMonMarkingsMenu(void); bool8 HandleMonMarkingsMenuInput(void); struct Sprite *CreateMonMarkingAllCombosSprite(u16 tileTag, u16 paletteTag, const u16 *palette); struct Sprite *CreateMonMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette); void UpdateMonMarkingTiles(u8 markings, void *dest); #endif //GUARD_MON_MARKINGS_H ================================================ FILE: include/money.h ================================================ #ifndef GUARD_MONEY_H #define GUARD_MONEY_H #include "global.h" u32 GetMoney(u32 *moneyPtr); void SetMoney(u32 *moneyPtr, u32 newValue); bool8 IsEnoughMoney(u32 *moneyPtr, u32 cost); void AddMoney(u32 *moneyPtr, u32 toAdd); void RemoveMoney(u32 *moneyPtr, u32 toSub); bool8 IsEnoughForCostInVar0x8005(void); void SubtractMoneyFromVar0x8005(void); void PrintMoneyAmountInMoneyBox(u8 windowId, int amount, u8 speed); void PrintMoneyAmountInMoneyBox(u8 windowId, int amount, u8 speed); void PrintMoneyAmountInMoneyBoxWithBorder(u8 windowId, u16 tileStart, u8 pallete, int amount); void ChangeAmountInMoneyBox(int amount); void DrawMoneyBox(int amount, u8 x, u8 y); void HideMoneyBox(void); void AddMoneyLabelObject(u16 x, u16 y); void RemoveMoneyLabelObject(void); void PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed); #endif // GUARD_MONEY_H ================================================ FILE: include/multiboot.h ================================================ #ifndef GUARD_MULTIBOOT_H #define GUARD_MULTIBOOT_H #include "global.h" #define MULTIBOOT_MASTER_INFO 0x62 #define MULTIBOOT_CLIENT_INFO 0x72 #define MULTIBOOT_MASTER_START_PROBE 0x61 #define MULTIBOOT_MASTER_REQUEST_DLREADY 0x63 #define MULTIBOOT_CLIENT_DLREADY 0x73 #define MULTIBOOT_MASTER_START_DL 0x64 #define MULTIBOOT_MASTER_REQUEST_CRC 0x65 #define MULTIBOOT_CLIENT_CALC_CRC 0x74 #define MULTIBOOT_CLIENT_CRCREADY 0x75 #define MULTIBOOT_MASTER_VERIFY_CRC 0x66 void MultiBootInit(struct MultiBootParam *mp); int MultiBootMain(struct MultiBootParam *mp); void MultiBootStartProbe(struct MultiBootParam *mp); void MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed); bool32 MultiBootCheckComplete(struct MultiBootParam *mp); #endif // GUARD_MULTIBOOT_H ================================================ FILE: include/mystery_event_msg.h ================================================ #ifndef GUARD_MYSTERY_EVENT_MSG_H #define GUARD_MYSTERY_EVENT_MSG_H #include "gba/gba.h" extern const u8 gText_MysteryGiftBerry[]; extern const u8 gText_MysteryGiftBerryTransform[]; extern const u8 gText_MysteryGiftBerryObtained[]; extern const u8 gText_MysteryGiftSpecialRibbon[]; extern const u8 gText_MysteryGiftNationalDex[]; extern const u8 gText_MysteryGiftRareWord[]; extern const u8 gText_MysteryGiftSentOver[]; extern const u8 gText_MysteryGiftFullParty[]; extern const u8 gText_MysteryGiftNewTrainer[]; extern const u8 gText_MysteryGiftNewAdversaryInBattleTower[]; extern const u8 gText_MysteryGiftCantBeUsed[]; #endif // GUARD_MYSTERY_EVENT_MSG_H ================================================ FILE: include/mystery_event_script.h ================================================ #ifndef GUARD_MYSTERY_EVENT_SCRIPT_H #define GUARD_MYSTERY_EVENT_SCRIPT_H #include "global.h" u32 RunMysteryEventScript(u8 *); void SetMysteryEventScriptStatus(u32 val); void MEventScript_InitContext(u8 *); bool32 MEventScript_Run(u32 *); #endif // GUARD_MYSTERY_EVENT_SCRIPT_H ================================================ FILE: include/mystery_gift.h ================================================ #ifndef GUARD_MYSTERY_GIFT_H #define GUARD_MYSTERY_GIFT_H #include "global.h" #include "main.h" #include "constants/mystery_gift.h" #define CARD_STAT_BATTLES_WON 0 #define CARD_STAT_BATTLES_LOST 1 #define CARD_STAT_NUM_TRADES 2 #define CARD_STAT_NUM_STAMPS 3 #define CARD_STAT_MAX_STAMPS 4 enum { NEWS_INPUT_A, NEWS_INPUT_B, NEWS_INPUT_SCROLL_UP, NEWS_INPUT_SCROLL_DOWN, NEWS_INPUT_NONE = 0xFF }; struct MysteryGiftLinkGameData { u32 unk_00; u16 unk_04; u32 unk_08; u16 unk_0C; u32 unk_10; u16 flagId; u16 questionnaireWords[NUM_QUESTIONNAIRE_WORDS]; struct WonderCardMetadata cardMetadata; u8 maxStamps; u8 playerName[PLAYER_NAME_LENGTH]; u8 playerTrainerId[TRAINER_ID_LENGTH]; u16 easyChatProfile[EASY_CHAT_BATTLE_WORDS_COUNT]; u8 gameCode[GAME_CODE_LENGTH]; u8 version; }; struct WonderGraphics { u8 titleTextPal:4; u8 bodyTextPal:4; u8 footerTextPal:4; u8 stampShadowPal:4; const u8 * tiles; const u8 * map; const u16 * pal; }; extern const u16 gCard1Pal[]; extern const u16 gCard2Pal[]; extern const u16 gCard3Pal[]; extern const u16 gCard4Pal[]; extern const u16 gCard5Pal[]; struct WonderNews * GetSavedWonderNews(void); struct WonderCard * GetSavedWonderCard(void); struct WonderCardMetadata * GetSavedWonderCardMetadata(void); struct WonderNewsMetadata * GetSavedWonderNewsMetadata(void); bool32 SaveWonderNews(const struct WonderNews * news); bool32 ValidateSavedWonderNews(void); bool32 ValidateSavedWonderCard(void); bool32 IsWonderNewsSameAsSaved(const u8 * news); bool32 SaveWonderCard(const struct WonderCard * card); void DisableWonderCardSending(struct WonderCard * card); bool32 MysteryGift_TrySaveStamp(const u16 * stamp); void MysteryGift_LoadLinkGameData(struct MysteryGiftLinkGameData * data); bool32 MysteryGift_ValidateLinkGameData(const struct MysteryGiftLinkGameData * data); u32 MysteryGift_CompareCardFlags(const u16 * flagId, const struct MysteryGiftLinkGameData * data, const void *unused); u32 MysteryGift_CheckStamps(const u16 * stamp, const struct MysteryGiftLinkGameData * data, const void *unused); bool32 MysteryGift_DoesQuestionnaireMatch(const struct MysteryGiftLinkGameData * data, const u16 * words); u16 MysteryGift_GetCardStatFromLinkData(const struct MysteryGiftLinkGameData * data, u32 stat); bool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata); bool32 WonderNews_Init(const struct WonderNews * news); s32 WonderCard_Enter(void); s32 WonderNews_Enter(void); void ClearSavedWonderCardAndRelated(void); void ClearSavedWonderNewsAndRelated(void); void WonderCard_Destroy(void); void WonderNews_Destroy(void); s32 WonderCard_Exit(bool32 flag); s32 WonderNews_Exit(bool32 flag); bool32 IsSavedWonderCardGiftNotReceived(void); void WonderNews_AddScrollIndicatorArrowPair(void); void WonderNews_RemoveScrollIndicatorArrowPair(void); bool32 IsSendingSavedWonderNewsAllowed(void); bool32 IsSendingSavedWonderCardAllowed(void); u32 WonderNews_GetInput(u16 input); void ClearMysteryGift(void); u16 MysteryGift_GetCardStat(u32 stat); void MysteryGift_TryIncrementStat(u32 stat, u32 trainerId); u16 *GetQuestionnaireWordsPtr(void); void MysteryGift_DisableStats(void); bool32 MysteryGift_TryEnableStatsByFlagId(u16 flagId); u16 GetWonderCardFlagId(void); #endif // GUARD_MYSTERY_GIFT_H ================================================ FILE: include/mystery_gift_client.h ================================================ #ifndef GUARD_MYSTERY_GIFT_CLIENT_H #define GUARD_MYSTERY_GIFT_CLIENT_H #include "mystery_gift_link.h" // Return values for client functions called by MysteryGiftClient_Run enum { CLI_RET_INIT, CLI_RET_ACTIVE, CLI_RET_YES_NO, CLI_RET_PRINT_MSG, CLI_RET_ASK_TOSS, CLI_RET_COPY_MSG, CLI_RET_END, }; // IDs for client script instructions enum { CLI_NONE, CLI_RETURN, CLI_RECV, CLI_SEND_LOADED, CLI_COPY_RECV, CLI_YES_NO, CLI_COPY_RECV_IF_N, CLI_COPY_RECV_IF, CLI_LOAD_GAME_DATA, CLI_SAVE_NEWS, CLI_SAVE_CARD, CLI_PRINT_MSG, CLI_COPY_MSG, CLI_ASK_TOSS, CLI_LOAD_TOSS_RESPONSE, CLI_RUN_MEVENT_SCRIPT, CLI_SAVE_STAMP, CLI_SAVE_RAM_SCRIPT, CLI_RECV_EREADER_TRAINER, CLI_SEND_STAT, CLI_SEND_READY_END, CLI_RUN_BUFFER_SCRIPT, }; // IDs for client messages when ending a script. // Given as the parameter to CLI_RETURN, and resolved to text in GetClientResultMessage enum { CLI_MSG_NOTHING_SENT, CLI_MSG_RECORD_UPLOADED, CLI_MSG_CARD_RECEIVED, CLI_MSG_NEWS_RECEIVED, CLI_MSG_STAMP_RECEIVED, CLI_MSG_HAD_CARD, CLI_MSG_HAD_STAMP, CLI_MSG_HAD_NEWS, CLI_MSG_NO_ROOM_STAMPS, CLI_MSG_COMM_CANCELED, CLI_MSG_CANT_ACCEPT, CLI_MSG_COMM_ERROR, CLI_MSG_TRAINER_RECEIVED, CLI_MSG_BUFFER_SUCCESS, CLI_MSG_BUFFER_FAILURE, }; #define CLIENT_MAX_MSG_SIZE 64 struct MysteryGiftClientCmd { u32 instr; u32 parameter; }; struct MysteryGiftClient { u32 unused; u32 param; u32 funcId; u32 funcState; u32 cmdidx; void *sendBuffer; void *recvBuffer; struct MysteryGiftClientCmd * script; void *msg; struct MysteryGiftLink link; }; void MysteryGiftClient_Create(void); u32 MysteryGiftClient_Run(u16 * endVal); void MysteryGiftClient_AdvanceState(void); void * MysteryGiftClient_GetMsg(void); void MysteryGiftClient_SetParam(u32 value); #endif //GUARD_MYSTERY_GIFT_CLIENT_H ================================================ FILE: include/mystery_gift_link.h ================================================ #ifndef GUARD_MYSTERY_GIFT_LINK_H #define GUARD_MYSTERY_GIFT_LINK_H #define MG_LINK_BUFFER_SIZE 0x400 // Send/receive ids for the Client/Server to make sure // they're sending/receiving the same thing enum { MG_LINKID_CLIENT_SCRIPT = 16, MG_LINKID_GAME_DATA, MG_LINKID_GAME_STAT, MG_LINKID_RESPONSE, MG_LINKID_READY_END, MG_LINKID_DYNAMIC_MSG, MG_LINKID_CARD, MG_LINKID_NEWS, MG_LINKID_STAMP, MG_LINKID_RAM_SCRIPT, MG_LINKID_EREADER_TRAINER, MG_LINKID_UNK_1, MG_LINKID_UNK_2, }; struct MysteryGiftLink { s32 state; u8 sendPlayerId; u8 recvPlayerId; u16 recvIdent; u16 recvCounter; u16 recvCRC; u16 recvSize; u16 sendIdent; u16 sendCounter; u16 sendCRC; u16 sendSize; void * recvBuffer; const void * sendBuffer; u32 (*recvFunc)(struct MysteryGiftLink *); u32 (*sendFunc)(struct MysteryGiftLink *); }; void MysteryGiftLink_Init(struct MysteryGiftLink * link, u32 sendPlayerId, u32 recvPlayerId); void MysteryGiftLink_InitSend(struct MysteryGiftLink * link, u32 ident, const void * src, u32 size); bool32 MysteryGiftLink_Recv(struct MysteryGiftLink * link); bool32 MysteryGiftLink_Send(struct MysteryGiftLink * link); void MysteryGiftLink_InitRecv(struct MysteryGiftLink * link, u32 ident, void * dest); #endif //GUARD_MYSTERY_GIFT_LINK_H ================================================ FILE: include/mystery_gift_menu.h ================================================ #ifndef GUARD_MYSTERY_GIFT_MENU_H #define GUARD_MYSTERY_GIFT_MENU_H extern bool8 gGiftIsFromEReader; bool32 PrintMysteryGiftMenuMessage(u8 * cmdPtr, const u8 * src); void AddTextPrinterToWindow1(const u8 *str); void MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void); void PrintMysteryGiftOrEReaderTopMenu(bool8, bool32); void CB2_InitMysteryGift(void); void CB2_MysteryGiftEReader(void); s8 DoMysteryGiftYesNo(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str); void MG_DrawTextBorder(u8 windowId); u16 GetMysteryGiftBaseBlock(void); #endif //GUARD_MYSTERY_GIFT_MENU_H ================================================ FILE: include/mystery_gift_server.h ================================================ #ifndef GUARD_MYSTERY_GIFT_SERVER_H #define GUARD_MYSTERY_GIFT_SERVER_H #include "global.h" #include "mystery_gift_link.h" // Return values for Server_* functions. // Other than SVR_RET_END, effectively useless (not checked for). enum { SVR_RET_INIT, SVR_RET_ACTIVE, SVR_RET_UNUSED, SVR_RET_END }; // IDs for server script instructions enum { SVR_RETURN, SVR_SEND, SVR_RECV, SVR_GOTO, SVR_GOTO_IF_EQ, SVR_COPY_GAME_DATA, SVR_CHECK_GAME_DATA, // In Emerald, this was separated into SVR_CHECK_GAME_DATA_CARD and SVR_CHECK_GAME_DATA_NEWS SVR_CHECK_EXISTING_CARD, SVR_READ_RESPONSE, SVR_CHECK_EXISTING_STAMPS, SVR_GET_CARD_STAT, SVR_CHECK_QUESTIONNAIRE, SVR_COMPARE, SVR_LOAD_CARD, SVR_LOAD_NEWS, SVR_LOAD_RAM_SCRIPT, SVR_LOAD_STAMP, SVR_LOAD_UNK_2, SVR_LOAD_CLIENT_SCRIPT, SVR_LOAD_EREADER_TRAINER, SVR_LOAD_MSG, SVR_COPY_STAMP, SVR_COPY_CARD, SVR_COPY_NEWS, SVR_SET_RAM_SCRIPT, SVR_SET_CLIENT_SCRIPT, SVR_COPY_SAVED_CARD, SVR_COPY_SAVED_NEWS, SVR_COPY_SAVED_RAM_SCRIPT, SVR_LOAD_UNK_1, }; // Create arguments for SVR_LOAD_CLIENT_SCRIPT or SVR_LOAD_MSG // (a script/text size and pointer to send to the client) #define PTR_ARG(pointer) .param = sizeof(pointer), .ptr = pointer // IDs for server messages when ending a script. // Given as the parameter to SVR_RETURN, and resolved to text in GetServerResultMessage enum { SVR_MSG_NOTHING_SENT, SVR_MSG_RECORD_UPLOADED, SVR_MSG_CARD_SENT, SVR_MSG_NEWS_SENT, SVR_MSG_STAMP_SENT, SVR_MSG_HAS_CARD, SVR_MSG_HAS_STAMP, SVR_MSG_HAS_NEWS, SVR_MSG_NO_ROOM_STAMPS, SVR_MSG_CLIENT_CANCELED, SVR_MSG_CANT_SEND_GIFT_1, SVR_MSG_COMM_ERROR, SVR_MSG_GIFT_SENT_1, SVR_MSG_GIFT_SENT_2, SVR_MSG_CANT_SEND_GIFT_2, }; struct MysteryGiftServerCmd { u32 instr; bool32 param; const void *ptr; }; struct MysteryGiftServer { u32 unused; u32 param; u32 funcId; u32 cmdidx; const struct MysteryGiftServerCmd * script; void *recvBuffer; struct WonderCard * card; struct WonderNews * news; struct MysteryGiftLinkGameData * linkGameData; const void *ramScript; u32 ramScriptSize; const void *clientScript; u32 clientScriptSize; u32 stamp; struct MysteryGiftLink manager; }; void MysterGiftServer_CreateForNews(void); void MysterGiftServer_CreateForCard(void); u32 MysterGiftServer_Run(u16 * endVal); #endif //GUARD_MYSTERY_GIFT_SERVER_H ================================================ FILE: include/naming_screen.h ================================================ #ifndef GUARD_NAMING_SCREEN_H #define GUARD_NAMING_SCREEN_H #include "global.h" #define NAMING_SCREEN_PLAYER 0 #define NAMING_SCREEN_BOX 1 #define NAMING_SCREEN_CAUGHT_MON 2 #define NAMING_SCREEN_NICKNAME 3 #define NAMING_SCREEN_RIVAL 4 void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback); #endif // GUARD_NAMING_SCREEN_H ================================================ FILE: include/new_game.h ================================================ #ifndef GUARD_NEW_GAME_H #define GUARD_NEW_GAME_H #include "global.h" extern bool8 gDifferentSaveFile; void SetTrainerId(u32 trainerId, u8 *dst); void CopyTrainerId(u8 *dst, u8 *src); void NewGameInitData(void); void ResetMenuAndMonGlobals(void); void Sav2_ClearSetDefault(void); #endif // GUARD_NEW_GAME_H ================================================ FILE: include/new_menu_helpers.h ================================================ #ifndef GUARD_NEW_MENU_HELPERS_H #define GUARD_NEW_MENU_HELPERS_H #include "global.h" #include "text.h" #include "task.h" extern const u16 gMenuMessageWindow_Gfx[]; void ClearScheduledBgCopiesToVram(void); void ScheduleBgCopyTilemapToVram(u8 bgId); void DoScheduledBgTilemapCopiesToVram(void); void ResetTempTileDataBuffers(void); bool8 FreeTempTileDataBuffersIfPossible(void); void *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode); void *DecompressAndCopyTileDataToVram2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode); void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode); void DecompressAndLoadBgGfxUsingHeap2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode); void *MallocAndDecompress(const void *src, u32 * size); void SetBgTilemapPalette(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette); void CopyToBufferFromBgTilemap(u8 bgId, u16 *dest, u8 left, u8 top, u8 width, u8 height); void ResetBgPositions(void); void InitStandardTextBoxWindows(void); void FreeAllOverworldWindowBuffers(void); void InitTextBoxGfxAndPrinters(void); u16 RunTextPrinters_CheckPrinter0Active(void); u16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 fgColor, u8 bgColor, u8 shadowColor); void AddTextPrinterDiffStyle(bool8 allowSkippingDelayWithButtonPress); void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress); void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed); void LoadStdWindowFrameGfx(void); void DrawDialogueFrame(u8 windowId, bool8 transfer); void DrawStdWindowFrame(u8 windowId, bool8 copyNow); void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram); void ClearStdWindowAndFrame(u8 windowId, bool8 copyNow); void EraseFieldMessageBox(bool8 copyToVram); void SetStdWindowBorderStyle(u8 windowId, bool8 copyToVram); void LoadMessageBoxAndFrameGfx(u8 windowId, bool8 copyToVram); void Menu_LoadStdPal(void); void Menu_LoadStdPalAt(u16 offset); void DisplayItemMessageOnField(u8 taskId, u8 fontId, const u8 *src, TaskFunc callback); void DisplayYesNoMenuDefaultYes(void); void DisplayYesNoMenuDefaultNo(void); u8 GetTextSpeedSetting(void); u8 CreateStartMenuWindow(u8 height); u8 GetStartMenuWindowId(void); void RemoveStartMenuWindow(void); u16 GetStdWindowBaseTileNum(void); void DrawHelpMessageWindowWithText(const u8 * text); void DestroyHelpMessageWindow_(void); void LoadSignpostWindowFrameGfx(void); void SetDefaultFontsPointer(void); #endif // GUARD_NEW_MENU_HELPERS_H ================================================ FILE: include/oak_speech.h ================================================ #ifndef GUARD_OAK_SPEECH_H #define GUARD_OAK_SPEECH_H void StartNewGameScene(void); #endif //GUARD_OAK_SPEECH_H ================================================ FILE: include/option_menu.h ================================================ #ifndef GUARD_OPTION_MENU_H #define GUARD_OPTION_MENU_H void CB2_OptionsMenuFromStartMenu(void); #endif //GUARD_OPTION_MENU_H ================================================ FILE: include/orre_met_location_strings.h ================================================ #ifndef GUARD_ORRE_MET_LOCATION_STRINGS_H #define GUARD_ORRE_MET_LOCATION_STRINGS_H extern const u8 gAgate_Village[]; extern const u8 gDeep_Colosseum[]; extern const u8 gLaboratory[]; extern const u8 gMayors_House[]; extern const u8 gMirors_Hideout[]; extern const u8 gOutskirt_Stand[]; extern const u8 gPhenac_City[]; extern const u8 gPyrite_Bldg[]; extern const u8 gPyrite_Cave[]; extern const u8 gPyrite_Town[]; extern const u8 gRealgam_Tower[]; extern const u8 gRealgamTwr_Dome[]; extern const u8 gSnagem_Hideout[]; extern const u8 gThe_Under[]; extern const u8 gThe_Under_Subway[]; extern const u8 gTower_Colosseum[]; extern const u8 gCave[]; extern const u8 gCipher_Key_Lair[]; extern const u8 gCipher_Lab[]; extern const u8 gCitadark_Isle[]; extern const u8 gGateon_Port[]; extern const u8 gMt_Battle[]; extern const u8 gOasis[]; extern const u8 gPokemon_HQ_Lab[]; extern const u8 gRock[]; extern const u8 gXD_Eevee_Met_Location[]; extern const u8 gColosseum_Starter_Met_Location[]; extern const u8 gDukings_Plusle[]; extern const u8 gXD_Eevee_Met_Location_JP[]; extern const u8 gColosseum_Starter_Met_Location_JP[]; extern const u8 gDukings_Plusle_JP[]; extern const u8 gOtherText_MetDistantLand[]; // Pokemon Box Egg string extern const u8 gText_PeculiarEggPokemonBox[]; extern const u8 gText_Azusa[]; #endif // GUARD_ORRE_MET_LOCATION_STRINGS_H ================================================ FILE: include/overworld.h ================================================ #ifndef GUARD_OVERWORLD_H #define GUARD_OVERWORLD_H #include "global.h" #include "main.h" #define LINK_KEY_CODE_NULL 0x00 #define LINK_KEY_CODE_EMPTY 0x11 #define LINK_KEY_CODE_DPAD_DOWN 0x12 #define LINK_KEY_CODE_DPAD_UP 0x13 #define LINK_KEY_CODE_DPAD_LEFT 0x14 #define LINK_KEY_CODE_DPAD_RIGHT 0x15 #define LINK_KEY_CODE_READY 0x16 #define LINK_KEY_CODE_EXIT_ROOM 0x17 #define LINK_KEY_CODE_START_BUTTON 0x18 #define LINK_KEY_CODE_A_BUTTON 0x19 #define LINK_KEY_CODE_IDLE 0x1A // These two are a hack to stop user input until link stuff can be // resolved. #define LINK_KEY_CODE_HANDLE_RECV_QUEUE 0x1B #define LINK_KEY_CODE_HANDLE_SEND_QUEUE 0x1C #define LINK_KEY_CODE_EXIT_SEAT 0x1D #define MOVEMENT_MODE_FREE 0 #define MOVEMENT_MODE_FROZEN 1 #define MOVEMENT_MODE_SCRIPTED 2 struct LinkPlayerObjectEvent { u8 active; u8 linkPlayerId; u8 objEventId; u8 movementMode; }; struct CreditsOverworldCmd { s16 unk_0; s16 unk_2; s16 unk_4; }; /* gDisableMapMusicChangeOnMapLoad */ #define MUSIC_DISABLE_OFF 0 #define MUSIC_DISABLE_STOP 1 #define MUSIC_DISABLE_KEEP 2 extern const struct Coords32 gDirectionToVectors[]; extern struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4]; extern MainCallback gFieldCallback; extern struct WarpData gLastUsedWarp; extern u8 gExitStairsMovementDisabled; extern u8 gFieldLinkPlayerCount; extern u8 gLocalLinkPlayerId; void IncrementGameStat(u8 index); void SetObjEventTemplateCoords(u8, s16, s16); void SetObjEventTemplateMovementType(u8, u8); void ResetObjEventTemplateMovementType(u8 localId); void SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y); void SetDynamicWarp(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId); void SetDynamicWarpWithCoords(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y); void SetFixedDiveWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y); void SetFixedHoleWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y); void SetEscapeWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y); void Overworld_SetHealLocationWarp(u8); void SetWarpDestinationToEscapeWarp(void); void SetWarpDestinationToLastHealLocation(void); u8 IsMapTypeOutdoors(u8 mapType); void Overworld_ClearSavedMusic(void); bool32 Overworld_MusicCanOverrideMapMusic(u16 song); void SetFlashLevel(s32 a1); u8 Overworld_GetFlashLevel(void); void Overworld_SetSavedMusic(u16); void Overworld_ChangeMusicToDefault(void); void Overworld_ChangeMusicTo(u16); bool32 IsUpdateLinkStateCBActive(void); void ClearLinkPlayerObjectEvents(void); const struct MapHeader *const Overworld_GetMapHeaderByGroupAndId(u16, u16); void ObjectEventMoveDestCoords(struct ObjectEvent *, u32, s16 *, s16 *); void CB2_ReturnToField(void); void CB2_ReturnToFieldContinueScriptPlayMapMusic(void); void WarpIntoMap(void); u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum); void SetWarpDestinationToMapWarp(s8 mapGroup, s8 mapNum, s8 warpNum); void SetWarpDestinationToDynamicWarp(u8 unused); u32 GetGameStat(u8 statId); void SetGameStat(u8 statId, u32 value); void CB2_ContinueSavedGame(void); void Overworld_SetWarpDestinationFromWarp(struct WarpData *); void CB2_SetUpOverworldForQLPlayback(void); void CB2_SetUpOverworldForQLPlaybackWithWarpExit(void); void CB2_EnterFieldFromQuestLog(void); void Overworld_PlaySpecialMapMusic(void); u8 GetCurrentRegionMapSectionId(void); void SetCurrentMapLayout(u16 mapLayoutId); void SetWarpDestinationToFixedHoleWarp(s16 x, s16 y); void ResetInitialPlayerAvatarState(void); void CleanupOverworldWindowsAndTilemaps(void); u32 ComputeWhiteOutMoneyLoss(void); extern u8 gDisableMapMusicChangeOnMapLoad; extern u8 gGlobalFieldTintMode; extern bool8 (* gFieldCallback2)(void); void SetLastHealLocationWarp(u32 healLocaionId); void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum); void CB2_ReturnToFieldFromDiploma(void); void CB2_OverworldBasic(void); void CB2_NewGame(void); bool8 IsMapTypeOutdoors(u8 mapType); bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType); void Overworld_ResetStateAfterTeleport(void); void Overworld_FadeOutMapMusic(void); void CB2_LoadMap(void); bool8 BGMusicStopped(void); bool8 IsMapTypeIndoors(u8 mapType); bool32 Overworld_IsBikingAllowed(void); void Overworld_ResetStateAfterDigEscRope(void); bool32 Overworld_LinkRecvQueueLengthMoreThan2(void); u8 GetCurrentMapType(void); u8 GetLastUsedWarpMapType(void); const struct MapHeader *const GetDestinationWarpMapHeader(void); void TryFadeOutOldMapMusic(void); void CB2_ReturnToFieldCableClub(void); void ResetGameStats(void); void Overworld_CreditsMainCB(void); bool32 Overworld_DoScrollSceneForCredits(u8 *, const struct CreditsOverworldCmd *, u8); bool32 IsSendingKeysOverCable(void); void CB2_ReturnToFieldWithOpenMenu(void); void CB2_WhiteOut(void); void CB2_ReturnToFieldFromMultiplayer(void); void ApplyNewEncryptionKeyToGameStats(u32 newKey); void SetContinueGameWarpToDynamicWarp(int); void SetContinueGameWarpToHealLocation(u8 loc); void UpdateAmbientCry(s16 *state, u16 *delayCounter); void SetWarpDestinationToHealLocation(u8 a0); bool32 Overworld_SendKeysToLinkIsRunning(void); bool32 Overworld_RecvKeysFromLinkIsRunning(void); void OverworldWhiteOutGetMoneyLoss(void); u8 GetCurrentMapBattleScene(void); void Overworld_ResetStateAfterFly(void); bool8 MetatileBehavior_IsSurfableInSeafoamIslands(u16 metatileBehavior); void Overworld_ResetMapMusic(void); u16 QueueExitLinkRoomKey(void); u16 SetInCableClubSeat(void); u32 GetCableClubPartnersReady(void); u16 SetStartedCableClubActivity(void); u16 SetLinkWaitingForScript(void); void SetMainCallback1(MainCallback cb); void CB1_Overworld(void); void CB2_ReturnToFieldContinueScript(void); u8 GetLastUsedWarpMapSectionId(void); void StoreInitialPlayerAvatarState(void); void UpdateEscapeWarp(s16 x, s16 y); bool8 SetDiveWarpEmerge(u16 x, u16 y); bool8 SetDiveWarpDive(u16 x, u16 y); void DoMapLoadLoop(u8 *state); void SetInitialPlayerAvatarStateWithDirection(u8 dirn); bool8 CheckNationalDexEligibilityOnSaveLoad(void); bool8 DoCoordsMatchPMCExitMat(void); extern u16 *gBGTilemapBuffers1; extern u16 *gBGTilemapBuffers2; extern u16 *gBGTilemapBuffers3; extern u16 gHeldKeyCodeToSend; #endif //GUARD_OVERWORLD_H ================================================ FILE: include/palette.h ================================================ #ifndef GUARD_PALETTE_H #define GUARD_PALETTE_H #include "global.h" #define gPaletteFade_selectedPalettes (gPaletteFade.multipurpose1) // normal and fast fade #define gPaletteFade_blendCnt (gPaletteFade.multipurpose1) // hardware fade #define gPaletteFade_delay (gPaletteFade.multipurpose2) // normal and hardware fade #define gPaletteFade_submode (gPaletteFade.multipurpose2) // fast fade #define PLTT_BUFFER_SIZE (PLTT_SIZE / sizeof(u16)) #define PALETTE_FADE_STATUS_DELAY 2 #define PALETTE_FADE_STATUS_ACTIVE 1 #define PALETTE_FADE_STATUS_DONE 0 #define PALETTE_FADE_STATUS_LOADING 0xFF #define PALETTES_BG 0x0000FFFF #define PALETTES_OBJECTS 0xFFFF0000 #define PALETTES_ALL (PALETTES_BG | PALETTES_OBJECTS) #define PLTT_ID(n) ((n) * 16) #define BG_PLTT_OFFSET 0x000 #define OBJ_PLTT_OFFSET 0x100 #define BG_PLTT_ID(n) (BG_PLTT_OFFSET + PLTT_ID(n)) #define OBJ_PLTT_ID(n) (OBJ_PLTT_OFFSET + PLTT_ID(n)) #define OBJ_PLTT_ID2(n) (PLTT_ID((n) + 16)) enum { FAST_FADE_IN_FROM_WHITE, FAST_FADE_OUT_TO_WHITE, FAST_FADE_IN_FROM_BLACK, FAST_FADE_OUT_TO_BLACK, }; struct PaletteFadeControl { u32 multipurpose1; u8 delayCounter:6; u16 y:5; // blend coefficient u16 targetY:5; // target blend coefficient u16 blendColor:15; u16 active:1; u16 multipurpose2:6; u16 yDec:1; // whether blend coefficient is decreasing u16 bufferTransferDisabled:1; u16 mode:2; u16 shouldResetBlendRegisters:1; u16 hardwareFadeFinishing:1; u16 softwareFadeFinishingCounter:5; u16 softwareFadeFinishing:1; u16 objPaletteToggle:1; u8 deltaY:4; // rate of change of blend coefficient u32 unused; }; extern struct PaletteFadeControl gPaletteFade; extern u32 gPlttBufferTransferPending; extern u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE]; extern u16 gPlttBufferFaded[PLTT_BUFFER_SIZE]; extern u8 gPaletteDecompressionBuffer[]; void LoadCompressedPalette(const u32 *src, u16 offset, u16 size); void LoadPalette(const void *src, u16 offset, u16 size); void FillPalette(u16 value, u16 offset, u16 size); void TransferPlttBuffer(void); u8 UpdatePaletteFade(void); void ResetPaletteFade(void); void ReadPlttIntoBuffers(void); bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor); void ResetPaletteFadeControl(void); void InvertPlttBuffer(u32 selectedPalettes); void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b); void UnfadePlttBuffer(u32 selectedPalettes); void BeginFastPaletteFade(u8 submode); void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone); void PaletteStruct_ResetById(u16 id); void CopyPaletteInvertedTint(const u16 *src, u16 *dst, u16 count, u8 tone); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); bool32 IsBlendPalettesGraduallyTaskActive(u8 var); void DestroyBlendPalettesGraduallyTask(void); static inline void SetBackdropFromColor(u16 color) { FillPalette(color, 0, PLTT_SIZEOF(1)); } static inline void SetBackdropFromPalette(const u16 *palette) { LoadPalette(palette, 0, PLTT_SIZEOF(1)); } #endif // GUARD_PALETTE_H ================================================ FILE: include/palette_util.h ================================================ #ifndef GUARD_PALETTE_UTIL_H #define GUARD_PALETTE_UTIL_H struct PulseBlendSettings { u16 blendColor; u16 paletteOffset; u8 numColors; u8 delay; u8 numFadeCycles; s8 maxBlendCoeff:4; s8 fadeType:2; s8 restorePaletteOnUnload:1; s8 unk7_7:1; }; struct PulseBlendPalette { u8 paletteSelector; u8 blendCoeff:4; u8 fadeDirection:1; s8 unk1_5:1; s8 available:1; u32 inUse:1; u8 delayCounter; u8 fadeCycleCounter; struct PulseBlendSettings pulseBlendSettings; }; struct PulseBlend { u16 usedPulseBlendPalettes; struct PulseBlendPalette pulseBlendPalettes[16]; }; #define FLASHUTIL_USE_EXISTING_COLOR (1 << 15) struct RouletteFlashSettings { u16 color; u16 paletteOffset; u8 numColors; u8 delay; u8 unk6; // Set but never used s8 numFadeCycles:5; s8 unk7_5:2; // Set but never used s8 colorDeltaDir:1; }; struct RouletteFlashPalette { u8 state:7; u8 available:1; u8 delayCounter; s8 fadeCycleCounter; s8 colorDelta; struct RouletteFlashSettings settings; }; struct RouletteFlashUtil { u8 enabled; u8 unused; u16 flags; struct RouletteFlashPalette palettes[16]; }; void RouletteFlash_Reset(struct RouletteFlashUtil *); u8 RouletteFlash_Add(struct RouletteFlashUtil *, u8, const struct RouletteFlashSettings *); void RouletteFlash_Run(struct RouletteFlashUtil *); void RouletteFlash_Enable(struct RouletteFlashUtil *, u16); void RouletteFlash_Stop(struct RouletteFlashUtil *, u16); void InitPulseBlend(struct PulseBlend *); int InitPulseBlendPaletteSettings(struct PulseBlend *, const struct PulseBlendSettings *); static void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *); void UnloadUsedPulseBlendPalettes(struct PulseBlend *, u16, u8); void MarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8); void UnmarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8); void UpdatePulseBlend(struct PulseBlend *); void FillTilemapRect(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height); void SetTilemapRect(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height); #endif // GUARD_PALETTE_UTIL_H ================================================ FILE: include/party_menu.h ================================================ #ifndef GUARD_PARTY_MENU_H #define GUARD_PARTY_MENU_H #include "main.h" #include "task.h" #include "constants/party_menu.h" struct PartyMenu { MainCallback exitCallback; TaskFunc task; u8 menuType:4; u8 layout:2; u8 chooseMonsBattleType:2; s8 slotId; s8 slotId2; u8 action; u16 bagItem; s16 data[2]; }; #define TMHM_COUNT 58 extern const u16 gTMHMMoves[TMHM_COUNT]; extern struct PartyMenu gPartyMenu; extern bool8 gPartyMenuUseExitCallback; extern u8 gSelectedMonPartyId; extern MainCallback gPostMenuFieldCallback; extern u8 gSelectedOrderFromParty[3]; extern u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2]; extern void (*gItemUseCB)(u8, TaskFunc); void InitPartyMenu(u8 menuType, u8 layout, u8 partyAction, bool8 keepCursorPos, u8 messageId, TaskFunc task, MainCallback callback); void AnimatePartySlot(u8 slot, u8 animNum); bool8 IsMultiBattle(void); u8 GetCursorSelectionMonId(void); u8 GetPartyMenuType(void); void Task_HandleChooseMonInput(u8 taskId); u8 *GetMonNickname(struct Pokemon *mon, u8 *dest); u8 DisplayPartyMenuMessage(const u8 *str, bool8 keepOpen); bool8 IsPartyMenuTextPrinterActive(void); void PartyMenuModifyHP(u8 taskId, u8 slot, s8 hpIncrement, s16 hpDifference, TaskFunc task); u8 GetAilmentFromStatus(u32 status); u8 GetMonAilment(struct Pokemon *mon); void DisplayPartyMenuStdMessage(u32 stringId); void LoadHeldItemIcons(void); void DrawHeldItemIconsForTrade(u8 *partyCounts, u8 *partySpriteIds, u8 whichParty); void SpriteCB_BounceConfirmCancelButton(u8 spriteId, u8 spriteId2, u8 animNum); void CB2_SelectBagItemToGive(void); void CB2_GiveHoldItem(void); bool8 FieldCallback_PrepareFadeInFromMenu(void); void CB2_ReturnToPartyMenuFromFlyMap(void); void SetUsedFlyQuestLogEvent(const u8 *healLocCtrlData); void CB2_ShowPartyMenuForItemUse(void); void ItemUseCB_Medicine(u8 taskId, TaskFunc func); void ItemUseCB_MedicineStep(u8 taskId, TaskFunc func); void ItemUseCB_TryRestorePP(u8 taskId, TaskFunc func); void ItemUseCB_PPUp(u8 taskId, TaskFunc func); u16 ItemIdToBattleMoveId(u16 item); bool8 IsMoveHm(u16 move); bool8 MonKnowsMove(struct Pokemon *mon, u16 move); void ItemUseCB_TMHM(u8 taskId, TaskFunc func); void ItemUseCB_RareCandy(u8 taskId, TaskFunc func); void ItemUseCB_SacredAsh(u8 taskId, TaskFunc func); void ItemUseCB_EvolutionStone(u8 taskId, TaskFunc func); u8 GetItemEffectType(u16 item); void CB2_PartyMenuFromStartMenu(void); void CB2_ChooseMonToGiveItem(void); void ChooseMonToGiveMailFromMailbox(void); void InitChooseMonsForBattle(u8 chooseMonsBattleType); void ClearSelectedPartyOrder(void); void ChooseMonForTradingBoard(u8 menuType, MainCallback callback); void ChooseMonForMoveTutor(void); void ChooseMonForWirelessMinigame(void); void OpenPartyMenuInTutorialBattle(u8 partyAction); void Pokedude_OpenPartyMenuInBattle(void); void Pokedude_ChooseMonForInBattleItem(void); void EnterPartyFromItemMenuInBattle(void); void BufferBattlePartyCurrentOrder(void); void BufferBattlePartyCurrentOrderBySide(u8 battlerId, u8 flankId); void SwitchPartyOrderLinkMulti(u8 battlerId, u8 slot, u8 slot2); void SwitchPartyMonSlots(u8 slot, u8 slot2); u8 GetPartyIdFromBattlePartyId(u8 battlePartyId); void ShowPartyMenuToShowcaseMultiBattleParty(void); void ChooseMonForDaycare(void); void ChoosePartyMonByMenuType(u8 menuType); void ItemUseCB_ReduceEV(u8 taskId, TaskFunc task); void ItemUseCB_ReduceEV2(u8 taskId, TaskFunc task); #endif // GUARD_PARTY_MENU_H ================================================ FILE: include/pc_screen_effect.h ================================================ #ifndef GUARD_PC_SCREEN_EFFECT_H #define GUARD_PC_SCREEN_EFFECT_H void BeginPCScreenEffect_TurnOn(u16 xspeed, u16 yspeed, u8 priority); void BeginPCScreenEffect_TurnOff(u16 xspeed, u16 yspeed, u8 priority); bool8 IsPCScreenEffectRunning_TurnOff(void); bool8 IsPCScreenEffectRunning_TurnOn(void); #endif //GUARD_PC_SCREEN_EFFECT_H ================================================ FILE: include/play_time.h ================================================ #ifndef GUARD_PLAY_TIME_H #define GUARD_PLAY_TIME_H #include "global.h" void PlayTimeCounter_Reset(void); void PlayTimeCounter_Start(void); void PlayTimeCounter_Stop(void); void PlayTimeCounter_Update(void); void PlayTimeCounter_SetToMax(void); #endif // GUARD_PLAY_TIME_H ================================================ FILE: include/player_pc.h ================================================ #ifndef GUARD_PLAYER_PC_H #define GUARD_PLAYER_PC_H #include "global.h" #include "list_menu.h" // Exported type declarations struct PlayerPCItemPageStruct { u16 itemsAbove; u16 cursorPos; u8 pageItems; u8 count; u8 filler_6[3]; bool8 notInRoom; u8 scrollIndicatorId; u8 filler_B[5]; }; // Exported RAM declarations extern struct PlayerPCItemPageStruct gPlayerPcMenuManager; // Exported ROM declarations void NewGameInitPCItems(void); void Mailbox_ReturnToMailListAfterDeposit(void); #endif //GUARD_PLAYER_PC_H ================================================ FILE: include/pokeball.h ================================================ #ifndef GUARD_POKEBALL_H #define GUARD_POKEBALL_H #include "global.h" enum { BALL_POKE, BALL_GREAT, BALL_SAFARI, BALL_ULTRA, BALL_MASTER, BALL_NET, BALL_DIVE, BALL_NEST, BALL_REPEAT, BALL_TIMER, BALL_LUXURY, BALL_PREMIER, POKEBALL_COUNT }; enum { BALL_AFFINE_ANIM_0, BALL_ROTATE_RIGHT, BALL_ROTATE_LEFT, BALL_AFFINE_ANIM_3, BALL_AFFINE_ANIM_4 }; extern const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT]; extern const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT]; extern const struct SpriteTemplate gBallSpriteTemplates[]; #define POKEBALL_PLAYER_SENDOUT 0xFF #define POKEBALL_OPPONENT_SENDOUT 0xFE u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow); void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes); u8 CreateTradePokeballSprite(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 delay, u32 fadePalettes); void DoHitAnimHealthboxEffect(u8 bank); void LoadBallGfx(u8 ballId); void FreeBallGfx(u8 ballId); void StartHealthboxSlideIn(u8 battler); void DestroySpriteAndFreeResources_Ball(struct Sprite *sprite); #endif // GUARD_POKEBALL_H ================================================ FILE: include/pokedex.h ================================================ #ifndef GUARD_POKEDEX_H #define GUARD_POKEDEX_H enum { DEX_MODE_KANTO, DEX_MODE_NATIONAL }; enum { FLAG_GET_SEEN, FLAG_GET_CAUGHT, FLAG_SET_SEEN, FLAG_SET_CAUGHT }; // IDs for the pokedex area markers enum { DEX_AREA_NONE, DEX_AREA_PALLET_TOWN, DEX_AREA_VIRIDIAN_CITY, DEX_AREA_PEWTER_CITY, DEX_AREA_CERULEAN_CITY, DEX_AREA_LAVENDER_TOWN, DEX_AREA_VERMILION_CITY, DEX_AREA_CELADON_CITY, DEX_AREA_FUCHSIA_CITY, DEX_AREA_CINNABAR_ISLAND, DEX_AREA_INDIGO_PLATEAU, DEX_AREA_SAFFRON_CITY, DEX_AREA_ROUTE_1, DEX_AREA_ROUTE_2, DEX_AREA_ROUTE_3, DEX_AREA_ROUTE_4, DEX_AREA_ROUTE_5, DEX_AREA_ROUTE_6, DEX_AREA_ROUTE_7, DEX_AREA_ROUTE_8, DEX_AREA_ROUTE_9, DEX_AREA_ROUTE_10, DEX_AREA_ROUTE_11, DEX_AREA_ROUTE_12, DEX_AREA_ROUTE_13, DEX_AREA_ROUTE_14, DEX_AREA_ROUTE_15, DEX_AREA_ROUTE_16, DEX_AREA_ROUTE_17, DEX_AREA_ROUTE_18, DEX_AREA_ROUTE_19, DEX_AREA_ROUTE_20, DEX_AREA_ROUTE_21, DEX_AREA_ROUTE_22, DEX_AREA_ROUTE_23, DEX_AREA_ROUTE_24, DEX_AREA_ROUTE_25, DEX_AREA_VIRIDIAN_FOREST, DEX_AREA_DIGLETTS_CAVE, DEX_AREA_MT_MOON, DEX_AREA_CERULEAN_CAVE, DEX_AREA_ROCK_TUNNEL, DEX_AREA_POWER_PLANT, DEX_AREA_POKEMON_TOWER, DEX_AREA_SAFARI_ZONE, DEX_AREA_SEAFOAM_ISLANDS, DEX_AREA_POKEMON_MANSION, DEX_AREA_VICTORY_ROAD, DEX_AREA_ONE_ISLAND, DEX_AREA_TWO_ISLAND, DEX_AREA_THREE_ISLAND, DEX_AREA_FOUR_ISLAND, DEX_AREA_FIVE_ISLAND, DEX_AREA_SIX_ISLAND, // Not associated with any MAPSEC DEX_AREA_SEVEN_ISLAND, // Not associated with any MAPSEC DEX_AREA_KINDLE_ROAD, DEX_AREA_TREASURE_BEACH, DEX_AREA_CAPE_BRINK, DEX_AREA_BOND_BRIDGE, DEX_AREA_THREE_ISLE_PATH, DEX_AREA_RESORT_GORGEOUS, DEX_AREA_WATER_LABYRINTH, DEX_AREA_FIVE_ISLE_MEADOW, DEX_AREA_MEMORIAL_PILLAR, DEX_AREA_OUTCAST_ISLAND, DEX_AREA_GREEN_PATH, DEX_AREA_WATER_PATH, DEX_AREA_RUIN_VALLEY, DEX_AREA_TRAINER_TOWER, DEX_AREA_CANYON_ENTRANCE, DEX_AREA_SEVAULT_CANYON, DEX_AREA_TANOBY_RUINS, DEX_AREA_MT_EMBER, DEX_AREA_BERRY_FOREST, DEX_AREA_ICEFALL_CAVE, DEX_AREA_LOST_CAVE, DEX_AREA_ALTERING_CAVE, DEX_AREA_PATTERN_BUSH, DEX_AREA_DOTTED_HOLE, DEX_AREA_TANOBY_CHAMBER, }; struct PokedexEntry { /*0x00*/ u8 categoryName[12]; /*0x0C*/ u16 height; //in decimeters /*0x0E*/ u16 weight; //in hectograms /*0x10*/ const u8 *description_FR; /*0x14*/ const u8 *description_LG; /*0x18*/ u16 unused; /*0x1A*/ u16 pokemonScale; /*0x1C*/ u16 pokemonOffset; /*0x1E*/ u16 trainerScale; /*0x20*/ u16 trainerOffset; }; /*size = 0x24*/ void ResetPokedex(void); void CopyMonCategoryText(u16 species, u8 *dst); u16 GetPokedexHeightWeight(u16 dexNum, u8 data); u16 GetNationalPokedexCount(u8); u16 GetKantoPokedexCount(u8); bool16 HasAllMons(void); u8 CreateDexDisplayMonDataTask(u16 dexNum, u32 trainerId, u32 personality); s8 GetSetPokedexFlag(u16 nationalNum, u8 caseId); u16 GetNationalPokedexCount(u8); u16 GetKantoPokedexCount(u8); bool16 HasAllHoennMons(void); bool16 HasAllKantoMons(void); bool16 HasAllMons(void); bool16 HasAllExtendedMons(void); u16 GetExtendedPokedexCount(u8 caseID); bool16 HasNationalMon(void); u8 DexScreen_RegisterMonToPokedex(u16 species); bool16 HasAllKantoMonsNew(void); bool16 HasAllMonsNew(void); #endif // GUARD_POKEDEX_H ================================================ FILE: include/pokedex_area_markers.h ================================================ #ifndef GUARD_POKEDEX_AREA_MARKERS_H #define GUARD_POKEDEX_AREA_MARKERS_H void GetAreaMarkerSubsprite(s32 i, s32 dexArea, struct Subsprite * subsprites); void DestroyPokedexAreaMarkers(u8 taskId); u8 CreatePokedexAreaMarkers(u16 species, u16 tilesTag, u8 palIdx, u8 y); u8 GetNumPokedexAreaMarkers(u8 taskId); #endif //GUARD_POKEDEX_AREA_MARKERS_H ================================================ FILE: include/pokedex_screen.h ================================================ #ifndef GUARD_POKEDEX_SCREEN_H #define GUARD_POKEDEX_SCREEN_H #define DEX_CATEGORY_GRASSLAND 0 #define DEX_CATEGORY_FOREST 1 #define DEX_CATEGORY_WATERS_EDGE 2 #define DEX_CATEGORY_SEA 3 #define DEX_CATEGORY_CAVE 4 #define DEX_CATEGORY_MOUNTAIN 5 #define DEX_CATEGORY_ROUGH_TERRAIN 6 #define DEX_CATEGORY_URBAN 7 #define DEX_CATEGORY_RARE 8 #define DEX_CATEGORY_COUNT 9 #define DEX_ORDER_NUMERICAL_KANTO 0 #define DEX_ORDER_ATOZ 1 #define DEX_ORDER_TYPE 2 #define DEX_ORDER_LIGHTEST 3 #define DEX_ORDER_SMALLEST 4 #define DEX_ORDER_NUMERICAL_NATIONAL 5 #define DEX_MODE(name) (DEX_CATEGORY_COUNT + DEX_ORDER_##name) #include "pokedex.h" extern const struct PokedexEntry gPokedexEntries[]; void CB2_OpenPokedexFromStartMenu(void); s8 DexScreen_GetSetPokedexFlag(u16 nationalDexNo, u8 caseId, bool8 indexIsSpecies); #endif //GUARD_POKEDEX_SCREEN_H ================================================ FILE: include/pokemon.h ================================================ #ifndef GUARD_POKEMON_H #define GUARD_POKEMON_H #include "global.h" #include "sprite.h" #include "constants/pokemon.h" #include "constants/species.h" struct PokemonSubstruct0 { u16 species; u16 heldItem; u32 experience; u8 ppBonuses; u8 friendship; u16 boxHP:10; u16 boxStatus:4; u16 forme:2; }; struct PokemonSubstruct1 { u16 moves[MAX_MON_MOVES]; u8 pp[MAX_MON_MOVES]; }; struct PokemonSubstruct2 { u8 hpEV; u8 attackEV; u8 defenseEV; u8 speedEV; u8 spAttackEV; u8 spDefenseEV; u8 cool; u8 beauty; u8 cute; u8 smart; u8 tough; u8 sheen; }; struct PokemonSubstruct3 { /* 0x00 */ u8 pokerus; /* 0x01 */ u8 metLocation; /* 0x02 */ u16 metLevel:7; /* 0x02 */ u16 metGame:4; /* 0x03 */ u16 pokeball:4; /* 0x03 */ u16 otGender:1; /* 0x04 */ u32 hpIV:5; /* 0x04 */ u32 attackIV:5; /* 0x05 */ u32 defenseIV:5; /* 0x05 */ u32 speedIV:5; /* 0x05 */ u32 spAttackIV:5; /* 0x06 */ u32 spDefenseIV:5; /* 0x07 */ u32 isEgg:1; /* 0x07 */ u32 abilityNum:1; /* 0x08 */ u32 coolRibbon:3; // Stores the highest contest rank achieved in the Cool category. /* 0x08 */ u32 beautyRibbon:3; // Stores the highest contest rank achieved in the Beauty category. /* 0x08 */ u32 cuteRibbon:3; // Stores the highest contest rank achieved in the Cute category. /* 0x09 */ u32 smartRibbon:3; // Stores the highest contest rank achieved in the Smart category. /* 0x09 */ u32 toughRibbon:3; // Stores the highest contest rank achieved in the Tough category. /* 0x09 */ u32 championRibbon:1; // Given when defeating the Champion. Because both RSE and FRLG use it, later generations don't specify from which region it comes from. /* 0x0A */ u32 winningRibbon:1; // Given at the Battle Tower's Level 50 challenge by winning a set of seven battles that extends the current streak to 56 or more. /* 0x0A */ u32 victoryRibbon:1; // Given at the Battle Tower's Level 100 challenge by winning a set of seven battles that extends the current streak to 56 or more. /* 0x0A */ u32 artistRibbon:1; // Given at the Contest Hall by winning a Master Rank contest with at least 800 points, and agreeing to have the Pokémon's portrait placed in the museum after being offered. /* 0x0A */ u32 effortRibbon:1; // Given at Slateport's market to Pokémon with maximum EVs. /* 0x0A */ u32 marineRibbon:1; // Never distributed. /* 0x0A */ u32 landRibbon:1; // Never distributed. /* 0x0A */ u32 skyRibbon:1; // Never distributed. /* 0x0A */ u32 countryRibbon:1; // Distributed during Pokémon Festa '04 and '05 to tournament winners. /* 0x0B */ u32 nationalRibbon:1; // Given to purified Shadow Pokémon in Colosseum/XD. /* 0x0B */ u32 earthRibbon:1; // Given to teams that have beaten Mt. Battle's 100-battle challenge in Colosseum/XD. /* 0x0B */ u32 worldRibbon:1; // Distributed during Pokémon Festa '04 and '05 to tournament winners. /* 0x0B */ u32 unusedRibbons:4; // Discarded in Gen 4. // The functionality of this bit changed in FRLG: // In RS, this bit does nothing, is never set, & is accidentally unset when hatching Eggs. // In FRLG & Emerald, this controls Mew & Deoxys obedience and whether they can be traded. // If set, a Pokémon is a fateful encounter in FRLG's summary screen if hatched & for all Pokémon in Gen 4+ summary screens. // Set for in-game event island legendaries, events distributed after a certain date, & Pokémon from XD: Gale of Darkness. // Not to be confused with METLOC_FATEFUL_ENCOUNTER. /* 0x0B */ u32 modernFatefulEncounter:1; }; // Number of bytes in the largest Pokémon substruct. // They are assumed to be the same size, and will be padded to // the largest size by the union. // By default they are all 12 bytes. #define NUM_SUBSTRUCT_BYTES (max(sizeof(struct PokemonSubstruct0), \ max(sizeof(struct PokemonSubstruct1), \ max(sizeof(struct PokemonSubstruct2), \ sizeof(struct PokemonSubstruct3))))) union PokemonSubstruct { struct PokemonSubstruct0 type0; struct PokemonSubstruct1 type1; struct PokemonSubstruct2 type2; struct PokemonSubstruct3 type3; u16 raw[NUM_SUBSTRUCT_BYTES / 2]; // /2 because it's u16, not u8 }; struct BoxPokemon { u32 personality; u32 otId; u8 nickname[POKEMON_NAME_LENGTH]; u8 language; u8 isBadEgg:1; u8 hasSpecies:1; u8 isEgg:1; u8 blockBoxRS:1; // Unused, but Pokémon Box Ruby & Sapphire will refuse to deposit a Pokémon with this flag set u8 unused:4; u8 otName[PLAYER_NAME_LENGTH]; u8 markings; u16 checksum; u16 unknown; union { u32 raw[(NUM_SUBSTRUCT_BYTES * 4) / 4]; // *4 because there are 4 substructs, /4 because it's u32, not u8 union PokemonSubstruct substructs[4]; } secure; }; struct Pokemon { struct BoxPokemon box; u32 status; u8 level; u8 mail; u16 hp; u16 maxHP; u16 attack; u16 defense; u16 speed; u16 spAttack; u16 spDefense; }; struct BattleTowerPokemon { /*0x00*/ u16 species; /*0x02*/ u16 heldItem; /*0x04*/ u16 moves[MAX_MON_MOVES]; /*0x0C*/ u8 level; /*0x0D*/ u8 ppBonuses; /*0x0E*/ u8 hpEV; /*0x0F*/ u8 attackEV; /*0x10*/ u8 defenseEV; /*0x11*/ u8 speedEV; /*0x12*/ u8 spAttackEV; /*0x13*/ u8 spDefenseEV; /*0x14*/ u32 otId; /*0x18*/ u32 hpIV:5; u32 attackIV:5; u32 defenseIV:5; u32 speedIV:5; u32 spAttackIV:5; u32 spDefenseIV:5; u32 gap:1; u32 abilityNum:1; /*0x1C*/ u32 personality; /*0x20*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; /*0x2B*/ u8 friendship; }; struct BattlePokemon { /*0x00*/ u16 species; /*0x02*/ u16 attack; /*0x04*/ u16 defense; /*0x06*/ u16 speed; /*0x08*/ u16 spAttack; /*0x0A*/ u16 spDefense; /*0x0C*/ u16 moves[MAX_MON_MOVES]; /*0x14*/ u32 hpIV:5; /*0x14*/ u32 attackIV:5; /*0x15*/ u32 defenseIV:5; /*0x15*/ u32 speedIV:5; /*0x16*/ u32 spAttackIV:5; /*0x17*/ u32 spDefenseIV:5; /*0x17*/ u32 isEgg:1; /*0x17*/ u32 abilityNum:1; /*0x18*/ s8 statStages[NUM_BATTLE_STATS]; /*0x20*/ u8 ability; /*0x21*/ u8 type1; /*0x22*/ u8 type2; /*0x23*/ u8 unknown; /*0x24*/ u8 pp[MAX_MON_MOVES]; /*0x28*/ u16 hp; /*0x2A*/ u8 level; /*0x2B*/ u8 friendship; /*0x2C*/ u16 maxHP; /*0x2E*/ u16 item; /*0x30*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; /*0x3B*/ u8 ppBonuses; /*0x3C*/ u8 otName[PLAYER_NAME_LENGTH + 1]; /*0x44*/ u32 experience; /*0x48*/ u32 personality; /*0x4C*/ u32 status1; /*0x50*/ u32 status2; /*0x54*/ u32 otId; }; struct SpeciesInfo { /* 0x00 */ u8 baseHP; /* 0x01 */ u8 baseAttack; /* 0x02 */ u8 baseDefense; /* 0x03 */ u8 baseSpeed; /* 0x04 */ u8 baseSpAttack; /* 0x05 */ u8 baseSpDefense; /* 0x06 */ u8 types[2]; /* 0x08 */ u8 catchRate; /* 0x09 */ u8 expYield; /* 0x0A */ u16 evYield_HP:2; /* 0x0A */ u16 evYield_Attack:2; /* 0x0A */ u16 evYield_Defense:2; /* 0x0A */ u16 evYield_Speed:2; /* 0x0B */ u16 evYield_SpAttack:2; /* 0x0B */ u16 evYield_SpDefense:2; /* 0x0C */ u16 itemCommon; /* 0x0E */ u16 itemRare; /* 0x10 */ u8 genderRatio; /* 0x11 */ u8 eggCycles; /* 0x12 */ u8 friendship; /* 0x13 */ u8 growthRate; /* 0x14 */ u8 eggGroups[2]; /* 0x16 */ u8 abilities[2]; /* 0x18 */ u8 safariZoneFleeRate; /* 0x19 */ u8 bodyColor : 7; u8 noFlip : 1; }; struct BattleMove { u8 effect; u8 power; u8 type; u8 accuracy; u8 pp; u8 secondaryEffectChance; u8 target; s8 priority; u8 flags; }; #define SPINDA_SPOT_WIDTH 16 #define SPINDA_SPOT_HEIGHT 16 struct SpindaSpot { u8 x, y; u16 image[SPINDA_SPOT_HEIGHT]; }; struct __attribute__((packed)) LevelUpMove { u16 move:9; u16 level:7; }; struct Evolution { u16 method; u16 param; u16 targetSpecies; u16 param2; }; #define NUM_UNOWN_FORMS 28 #define GET_UNOWN_LETTER(personality) (( \ (((personality) & 0x03000000) >> 18) \ | (((personality) & 0x00030000) >> 12) \ | (((personality) & 0x00000300) >> 6) \ | (((personality) & 0x00000003) >> 0) \ ) % NUM_UNOWN_FORMS) #define GET_SHINY_VALUE(otId, personality) (HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality)) extern const struct BattleMove gBattleMoves[]; extern u8 gPlayerPartyCount; extern struct Pokemon gPlayerParty[PARTY_SIZE]; extern u8 gEnemyPartyCount; extern struct Pokemon gEnemyParty[PARTY_SIZE]; extern const struct SpeciesInfo gSpeciesInfo[]; extern const u8 *const gItemEffectTable[]; extern const u8 gStatStageRatios[][2]; extern struct SpriteTemplate gMultiuseSpriteTemplate; extern struct PokemonStorage* gPokemonStoragePtr; extern const u32 gExperienceTables[][MAX_LEVEL + 1]; extern const u16 *const gLevelUpLearnsets[]; extern const u8 gFacilityClassToPicIndex[]; extern const u8 gFacilityClassToTrainerClass[]; extern const struct SpriteTemplate gSpriteTemplates_Battlers[]; extern const u8 gPPUpGetMask[]; extern const u16 gEvolutionLines[NUM_SPECIES][EVOS_PER_LINE]; void ZeroBoxMonData(struct BoxPokemon *boxMon); void ZeroMonData(struct Pokemon *mon); void ZeroPlayerPartyMons(void); void ZeroEnemyPartyMons(void); void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId); void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId); void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature); void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter); void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level); void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality); void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread); void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src); void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest); void CalculateMonStats(struct Pokemon *mon, bool8 calcOverride); void BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest); u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon); u16 GiveMoveToMon(struct Pokemon *mon, u16 move); u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move); void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot); void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot); u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove); void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move); s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef); #define BATTLE_ALIVE_EXCEPT_ACTIVE 0 #define BATTLE_ALIVE_ATK_SIDE 1 #define BATTLE_ALIVE_DEF_SIDE 2 u8 CountAliveMonsInBattle(u8 caseId); u8 GetDefaultMoveTarget(u8 battlerId); u8 GetMonGender(struct Pokemon *mon); u8 GetBoxMonGender(struct BoxPokemon *boxMon); u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality); void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition); void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition); // These are full type signatures for GetMonData() and GetBoxMonData(), // but they are not used since some code erroneously omits the third arg. // u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data); // u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data); #ifdef IS_POKEMON_C u32 GetMonData(struct Pokemon *, s32, u8 *); u32 GetBoxMonData(struct BoxPokemon *, s32, u8 *); #else u32 GetMonData(); u32 GetBoxMonData(); #endif // IS_POKEMON_C void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg); void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg); void CopyMon(void *dest, void *src, size_t size); u8 GiveMonToPlayer(struct Pokemon *mon); u8 SendMonToPC(struct Pokemon* mon); u8 CalculatePlayerPartyCount(void); u8 CalculateEnemyPartyCount(void); u8 GetMonsStateToDoubles(void); u8 GetAbilityBySpecies(u16 species, bool8 abilityNum); u8 GetMonAbility(struct Pokemon *mon); u8 GetSecretBaseTrainerPicIndex(void); u8 GetSecretBaseTrainerNameIndex(void); bool8 IsPlayerPartyAndPokemonStorageFull(void); void bufferspeciesname(u8 *name, u16 species); u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex); void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex); void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex); bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex); bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI); bool8 PokemonItemUseNoEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex); u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit); const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId); u8 GetNature(struct Pokemon *mon); u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem); u16 NationalPokedexNumToSpecies(u16 nationalNum); u16 SpeciesToNationalPokedexNum(u16 species); u16 HoennToNationalOrder(u16 hoennNum); u16 SpeciesToCryId(u16 species); void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, bool8 isFrontPic); void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); bool8 GetPlayerFlankId(void); bool16 GetLinkTrainerFlankId(u8 linkPlayerId); s32 GetBattlerMultiplayerId(u16 a1); u8 GetTrainerEncounterMusicId(u16 trainer); void AdjustFriendship(struct Pokemon *mon, u8 event); void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies); u16 GetMonEVCount(struct Pokemon *mon); void RandomlyGivePartyPokerus(struct Pokemon *party); u8 CheckPartyPokerus(struct Pokemon *party, u8 party_bm); u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection); void PartySpreadPokerus(struct Pokemon *party); bool8 TryIncrementMonLevel(struct Pokemon *mon); u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm); u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves); u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves); u8 GetNumberOfRelearnableMoves(struct Pokemon *mon); u16 SpeciesToPokedexNum(u16 species); void ClearBattleMonForms(void); void PlayBattleBGM(void); void PlayMapChosenOrBattleBGM(u16 songId); const u32 *GetMonFrontSpritePal(struct Pokemon *mon); const u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality); const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon); const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality); bool32 IsHMMove2(u16 move); bool8 IsMonSpriteNotFlipped(u16 species); s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor); bool8 IsTradedMon(struct Pokemon *mon); bool8 IsOtherTrainer(u32 otId, u8 *otName); void MonRestorePP(struct Pokemon *mon); void BoxMonRestorePP(struct BoxPokemon *boxMon); void SetMonPreventsSwitchingString(void); void SetWildMonHeldItem(void); bool8 IsMonShiny(struct Pokemon *mon); u8 *GetTrainerPartnerName(void); u8 GetPlayerPartyHighestLevel(void); u16 FacilityClassToPicIndex(u16 facilityClass); bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId); void SetDeoxysStats(void); u16 GetUnionRoomTrainerPic(void); u16 GetUnionRoomTrainerClass(void); void CreateEnemyEventMon(void); void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality); bool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 bank); struct MonSpritesGfxManager *CreateMonSpritesGfxManager(u8 battlePosition, u8 mode); void DestroyMonSpritesGfxManager(void); u8 *MonSpritesGfxManager_GetSpritePtr(u8 bufferId); u8 GetNatureFromPersonality(u32 personality); void CreateMonWithGenderNatureAbility(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 abilityNum); void CreateEnemyMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 personality); u16 ExtendedToNationalOrder(u16 expandedNum); u16 ExtendedPokedexNumToSpecies(u16 nationalNum); u16 NationalToExtendedOrder(u16 nationalNum); u16 SpeciesToExtendedPokedexNum(u16 species); #endif // GUARD_POKEMON_H ================================================ FILE: include/pokemon_icon.h ================================================ #ifndef GUARD_POKEMON_ICON_H #define GUARD_POKEMON_ICON_H #include "global.h" extern const u8 *const gMonIconTable[]; extern const struct SpritePalette gMonIconPaletteTable[]; extern const u16 gMonIconPalettes[][16]; extern const u8 gMonIconPaletteIndices[]; const u8 *GetMonIconPtr(u16 speciesId, u32 personality, u32 frameNo); const u8 *GetMonIconTiles(u16 iconSpecies, bool32 extra); const u16 *GetValidMonIconPalettePtr(u16 speciesId); void LoadMonIconPalettes(void); void FreeMonIconPalettes(void); u16 MailSpeciesToIconSpecies(u16); u8 CreateMonIcon_HandleDeoxys(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, bool32 extra); void DestroyMonIcon(struct Sprite *); u16 GetUnownLetterByPersonality(u32 personality); void SpriteCB_MonIcon(struct Sprite *); u8 CreateMonIcon(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, u32 personality, bool32 extra); u8 UpdateMonIconFrame(struct Sprite *sprite); void LoadMonIconPalette(u16 iconId); void FreeMonIconPalette(u16 iconId); void SetPartyHPBarSprite(struct Sprite *sprite, u8 animNum); u8 GetMonIconPaletteIndexFromSpecies(u16 species); u16 GetIconSpecies(u16 species, u32 personality); void LoadMonIconPalettesAt(u16 offset); u8 GetValidMonIconPalIndex(u16 species); void SafeLoadMonIconPalette(u16 species); void SafeFreeMonIconPalette(u16 species); #endif // GUARD_POKEMON_ICON_H ================================================ FILE: include/pokemon_item_effects.h ================================================ #ifndef GUARD_POKEMON_ITEM_EFFECTS #define GUARD_POKEMON_ITEM_EFFECTS #include "pokemon.h" // TODO once pokemon item effects is decompiled /* struct PokemonItemEffect { //field 0 u8 xAtk : 4; // x1, x2, x4, x8 = xF u8 field_0_x10 : 1; // x10 u8 critRatioUp : 1; // x20 u8 field_0_x40 : 1; // x40 u8 cureInfatuation : 1; // x80 /*field 1 u8 xSpeed : 4; // x1, x2, x4, x8 = xF u8 xDefense : 4; // x10, x20, x40, xF0 /*field 2 u8 xSpAtk : 4; // x1, x2, x4, x8 = xF u8 xAccuracy : 4; // x10, x20, x40, xF0 /*field 3 u8 cureConfusion : 1; // x1 u8 cureParalysis : 1; // x2 u8 cureFreeze : 1; // x4 u8 cureBurn : 1; // x8 u8 curePoison : 1; // x10 u8 cureSleep : 1; // x20 u8 field_3_x40 : 1; // x40 u8 cantLowerStats : 1; // x80 /*field 4 u8 hpEv : 1; // x1 u8 attackEv : 1; // x2 u8 healHp : 1; // x4 u8 field_4_x8 : 1; // x8 u8 field_4_x10 : 1; // x10 u8 ppUp : 1; // x20 u8 levelUp : 1; // x40 u8 evolutionStone : 1; // x80 /*field 5 u8 defEv: 1; // x1 u8 speedEv : 1; // x2 u8 spDefEv : 1; // x4 u8 spAtkEv : 1; // x8 u8 ppMax : 1; // x10 u8 field_5_x20 : 1; // x20 u8 field_5_x40 : 1; // x40 u8 field_5_x80 : 1; // x80 /*field 6 u8 value; }; bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 itemId, u8 partyId, u8 monMoveIndex, u8 a5); */ #endif // GUARD_POKEMON_ITEM_EFFECTS ================================================ FILE: include/pokemon_jump.h ================================================ #ifndef GUARD_POKEMON_JUMP_H #define GUARD_POKEMON_JUMP_H #include "main.h" void ResetPokemonJumpRecords(void); bool32 IsSpeciesAllowedInPokemonJump(u16 species); void StartPokemonJump(u16 species, MainCallback callback); #endif // GUARD_POKEMON_JUMP_H ================================================ FILE: include/pokemon_size_record.h ================================================ #ifndef GUARD_POKEMON_SIZE_RECORD_H #define GUARD_POKEMON_SIZE_RECORD_H #include "global.h" void InitSeedotSizeRecord(void); void GetSeedotSizeRecordInfo(void); void CompareSeedotSize(void); void InitLotadSizeRecord(void); void GetLotadSizeRecordInfo(void); void CompareLotadSize(void); void InitHeracrossSizeRecord(void); void InitMagikarpSizeRecord(void); void GiveGiftRibbonToParty(u8 index, u8 ribbonId); #endif // GUARD_POKEMON_SIZE_RECORD_H ================================================ FILE: include/pokemon_special_anim.h ================================================ #ifndef GUARD_POKEMON_SPECIAL_ANIM_H #define GUARD_POKEMON_SPECIAL_ANIM_H #include "global.h" void CreateLevelUpVerticalSpritesTask(u16 x, u16 y, u16 tileTag, u16 paletteTag, u16 priority, u16 subpriority); bool8 LevelUpVerticalSpritesTaskIsRunning(void); void GetMonLevelUpWindowStats(struct Pokemon *mon, u16 *currStats); void DrawLevelUpWindowPg1(u16 windowId, u16 *statsBefore, u16 *statsAfter, u8 bgClr, u8 fgClr, u8 shadowClr); void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgClr, u8 fgClr, u8 shadowClr); void StartUseItemAnim_Normal(u8 slotId, u16 itemId, MainCallback callback); void StartUseItemAnim_CantEvolve(u8 slotId, u16 itemId, MainCallback callback); bool32 PSA_IsCancelDisabled(void); void StartUseItemAnim_ForgetMoveAndLearnTMorHM(u8 slotId, u16 itemId, u16 moveId, MainCallback callback); #endif // GUARD_POKEMON_SPECIAL_ANIM_H ================================================ FILE: include/pokemon_special_anim_internal.h ================================================ #ifndef GUARD_POKEMON_SPECIAL_ANIM_INTERNAL_H #define GUARD_POKEMON_SPECIAL_ANIM_INTERNAL_H #include "pokemon_special_anim.h" enum { PSA_TEXT_ITEM_USED, PSA_TEXT_LEVEL_ELEVATED, PSA_TEXT_FORGET_1, PSA_TEXT_FORGET_2_AND, PSA_TEXT_FORGET_POOF, PSA_TEXT_FORGET_FORGOT, PSA_TEXT_FORGET_AND, PSA_TEXT_MACHINE_SET, PSA_TEXT_HUH, PSA_TEXT_LEARNED_MOVE }; struct PokemonSpecialAnimScene { u16 state; u16 field_0002; u16 field_0004; u16 monSpriteY1; u16 monSpriteY2; u8 lastCloseness; struct Sprite *monSprite; struct Sprite *itemIconSprite; u8 textBuf[0x900]; u8 field_0914[BG_SCREEN_SIZE]; u8 field_1114[BG_SCREEN_SIZE]; u8 field_1914[BG_SCREEN_SIZE]; u8 field_2114[0x720]; }; // size=0x2834 struct PokemonSpecialAnim { /*0x0000*/ u8 filler_0000[0x4]; /*0x0004*/ MainCallback savedCallback; /*0x0008*/ struct Pokemon pokemon; /*0x006c*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; /*0x0077*/ u8 nameOfMoveForgotten[13]; /*0x0084*/ u8 nameOfMoveToTeach[13]; /*0x0091*/ bool8 cancelDisabled; /*0x0092*/ u16 state; /*0x0094*/ u16 species; /*0x0096*/ u16 itemId; /*0x0098*/ u16 animType; /*0x009a*/ u16 slotId; /*0x009c*/ u16 closeness; /*0x009e*/ u16 delayTimer; /*0x00a0*/ u32 personality; /*0x00a4*/ u32 field_00a4; /*0x00a8*/ struct PokemonSpecialAnimScene sceneResources; }; // size=0x28dc struct PokemonSpecialAnim * GetPSAStruct(void); struct Pokemon * PSA_GetPokemon(void); struct PokemonSpecialAnimScene * PSA_GetSceneWork(void); u16 PSA_GetItemId(void); u8 *PSA_GetNameOfMoveForgotten(void); u8 *PSA_GetNameOfMoveToTeach(void); u8 *PSA_CopyMonNickname(u8 *dest); u8 *PSA_GetMonNickname(void); u8 PSA_GetAnimType(void); u16 PSA_GetMonSpecies(void); u32 PSA_GetMonPersonality(void); void InitPokemonSpecialAnimScene(struct PokemonSpecialAnimScene * buffer, u16 animType); bool8 PokemonSpecialAnimSceneInitIsNotFinished(void); void PSA_FreeWindowBuffers(void); void PSA_ShowMessageWindow(void); void PSA_HideMessageWindow(void); void PSA_PrintMessage(u8 messageId); void PSA_AfterPoof_ClearMessageWindow(void); bool8 PSA_IsMessagePrintTaskActive(void); void PSA_DarkenMonSprite(void); bool8 PSA_RunPoofAnim(void); void PSA_UseTM_SetUpZoomOutAnim(void); void PSA_UseTM_CleanUpForCancel(void); bool8 PSA_UseTM_RunZoomOutAnim(void); void PSA_UseTM_SetUpMachineSetWobble(void); bool8 PSA_UseTM_RunMachineSetWobble(void); bool8 PSA_LevelUpVerticalSpritesTaskIsRunning(void); void PSA_CreateMonSpriteAtCloseness(u8 closeness); void PSA_SetUpZoomAnim(u8 closeness); bool8 PSA_IsZoomTaskActive(void); void PSA_SetUpItemUseOnMonAnim(u16 itemId, u8 closeness, bool32 a2); void CreateItemIconSpriteAtMaxCloseness(u16 itemId); bool8 PSA_IsItemUseOnMonAnimActive(void); void PSA_UseItem_CleanUpForCancel(void); #endif //GUARD_POKEMON_SPECIAL_ANIM_INTERNAL_H ================================================ FILE: include/pokemon_storage_system.h ================================================ #ifndef GUARD_POKEMON_STORAGE_SYSTEM_H #define GUARD_POKEMON_STORAGE_SYSTEM_H #include "global.h" #include "pokemon.h" #define TOTAL_BOXES_COUNT 14 #define IN_BOX_ROWS 5 // Number of rows, 6 Pokémon per row #define IN_BOX_COLUMNS 6 // Number of columns, 5 Pokémon per column #define IN_BOX_COUNT (IN_BOX_ROWS * IN_BOX_COLUMNS) #define BOX_NAME_LENGTH 8 /* COLUMNS ROWS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 */ enum { WALLPAPER_FOREST, WALLPAPER_CITY, WALLPAPER_DESERT, WALLPAPER_SAVANNA, WALLPAPER_CRAG, WALLPAPER_VOLCANO, WALLPAPER_SNOW, WALLPAPER_CAVE, WALLPAPER_BEACH, WALLPAPER_SEAFLOOR, WALLPAPER_RIVER, WALLPAPER_SKY, WALLPAPER_STARS, WALLPAPER_POKECENTER, WALLPAPER_TILES, WALLPAPER_SIMPLE, WALLPAPER_COUNT }; #define MAX_DEFAULT_WALLPAPER WALLPAPER_SAVANNA struct PokemonStorage { /*0x0000*/ u8 currentBox; /*0x0001*/ struct BoxPokemon boxes[TOTAL_BOXES_COUNT][IN_BOX_COUNT]; /*0x8344*/ u8 boxNames[TOTAL_BOXES_COUNT][BOX_NAME_LENGTH + 1]; /*0x83C2*/ u8 boxWallpapers[TOTAL_BOXES_COUNT]; }; u8 *GetBoxNamePtr(u8 boxNumber); struct BoxPokemon *GetBoxedMonPtr(u8 boxId, u8 monPosition); void SetBoxMonNickAt(u8 boxId, u8 monPosition, const u8 *newNick); s16 CompactPartySlots(void); u32 GetBoxMonDataAt(u8 boxId, u8 monPosition, s32 request); void ZeroBoxMonAt(u8 boxId, u8 monPosition); void CB2_ReturnToPokeStorage(void); void ResetPokemonStorageSystem(void); u8 StorageGetCurrentBox(void); void DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero2, u8 *buffer, s32 bytesToBuffer); void StoreHPAndStatusInBoxMon(struct Pokemon *mon); void PopulateBoxHpAndStatusToPartyMon(struct Pokemon *mon); u16 GetFirstAliveBoxMon(void); void SwapFirstAliveBoxPokemon(void); void SetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, const void *value); u8 CountPartyNonEggMons(void); u16 GetDeoxysSpeciesFromForme(u32 forme); #endif // GUARD_POKEMON_STORAGE_SYSTEM_H ================================================ FILE: include/pokemon_storage_system_internal.h ================================================ #ifndef GUARD_POKEMON_STORAGE_SYSTEM_INTERNAL_H #define GUARD_POKEMON_STORAGE_SYSTEM_INTERNAL_H #include "pokemon_storage_system.h" #include "mon_markings.h" #include "quest_log.h" // The maximum number of Pokémon icons that can appear on-screen. // By default the limit is 40 (though in practice only 37 can be). #define MAX_MON_ICONS (IN_BOX_COUNT + PARTY_SIZE + 1 >= 40 ? IN_BOX_COUNT + PARTY_SIZE + 1 : 40) // The maximum number of item icons that can appear on-screen while // moving held items. 1 in the cursor, and 2 more while switching // between 2 Pokémon with held items #define MAX_ITEM_ICONS 3 enum { OPTION_WITHDRAW, OPTION_DEPOSIT, OPTION_MOVE_MONS, OPTION_MOVE_ITEMS, OPTION_EXIT, OPTIONS_COUNT }; enum { MENU_TEXT_CANCEL, MENU_TEXT_STORE, MENU_TEXT_WITHDRAW, MENU_TEXT_MOVE, MENU_TEXT_SHIFT, MENU_TEXT_PLACE, MENU_TEXT_SUMMARY, MENU_TEXT_RELEASE, MENU_TEXT_MARK, MENU_TEXT_JUMP, MENU_TEXT_WALLPAPER, MENU_TEXT_NAME, MENU_TEXT_TAKE, MENU_TEXT_GIVE, MENU_TEXT_GIVE2, MENU_TEXT_SWITCH, MENU_TEXT_BAG, MENU_TEXT_INFO, MENU_TEXT_SCENERY_1, MENU_TEXT_SCENERY_2, MENU_TEXT_SCENERY_3, MENU_TEXT_ETCETERA, MENU_TEXT_FOREST, MENU_TEXT_CITY, MENU_TEXT_DESERT, MENU_TEXT_SAVANNA, MENU_TEXT_CRAG, MENU_TEXT_VOLCANO, MENU_TEXT_SNOW, MENU_TEXT_CAVE, MENU_TEXT_BEACH, MENU_TEXT_SEAFLOOR, MENU_TEXT_RIVER, MENU_TEXT_SKY, MENU_TEXT_POLKADOT, MENU_TEXT_POKECENTER, MENU_TEXT_MACHINE, MENU_TEXT_SIMPLE, }; // Return IDs for input handlers enum { INPUT_NONE, INPUT_MOVE_CURSOR, INPUT_2, // Unused INPUT_3, // Unused INPUT_CLOSE_BOX, INPUT_SHOW_PARTY, INPUT_HIDE_PARTY, INPUT_BOX_OPTIONS, INPUT_IN_MENU, INPUT_SCROLL_RIGHT, INPUT_SCROLL_LEFT, INPUT_DEPOSIT, INPUT_WITHDRAW, INPUT_MOVE_MON, INPUT_SHIFT_MON, INPUT_PLACE_MON, INPUT_TAKE_ITEM, INPUT_GIVE_ITEM, INPUT_SWITCH_ITEMS, INPUT_PRESSED_B, INPUT_MULTIMOVE_START, INPUT_MULTIMOVE_CHANGE_SELECTION, INPUT_MULTIMOVE_SINGLE, INPUT_MULTIMOVE_GRAB_SELECTION, INPUT_MULTIMOVE_UNABLE, INPUT_MULTIMOVE_MOVE_MONS, INPUT_MULTIMOVE_PLACE_MONS, }; enum { RELEASE_MON_NOT_ALLOWED, RELEASE_MON_ALLOWED, RELEASE_MON_UNDETERMINED = -1, }; enum { MODE_PARTY, MODE_BOX, MODE_MOVE, }; enum { CURSOR_AREA_IN_BOX, CURSOR_AREA_IN_PARTY, CURSOR_AREA_BOX_TITLE, CURSOR_AREA_BUTTONS, // Party Pokemon and Close Box }; #define CURSOR_AREA_IN_HAND CURSOR_AREA_BOX_TITLE // Alt name for cursor area used by Move Items // IDs for InitMonPlaceChange enum { CHANGE_GRAB, CHANGE_PLACE, CHANGE_SHIFT, }; // IDs for the main functions for moving multiple Pokémon. // Given as arguments to MultiMove_SetFunction enum { MULTIMOVE_START, MULTIMOVE_SINGLE, MULTIMOVE_CHANGE_SELECTION, MULTIMOVE_GRAB_SELECTION, MULTIMOVE_MOVE_MONS, MULTIMOVE_PLACE_MONS, }; enum { PALTAG_MON_ICON_0 = 56000, PALTAG_MON_ICON_1, // Used implicitly in CreateMonIconSprite PALTAG_MON_ICON_2, // Used implicitly in CreateMonIconSprite PALTAG_3, // Unused PALTAG_4, // Unused PALTAG_5, // Unused PALTAG_DISPLAY_MON, PALTAG_MISC_1, // Used by cursor in multimove mode, choose box menu popup PALTAG_MARKING_COMBO, PALTAG_BOX_TITLE, PALTAG_MISC_2, // Used by waveforms, cursor in normal mode, cursor shadow, box scroll arrows PALTAG_ITEM_ICON_0, PALTAG_ITEM_ICON_1, // Used implicitly in CreateItemIconSprites PALTAG_ITEM_ICON_2, // Used implicitly in CreateItemIconSprites PALTAG_MARKING_MENU, }; enum { GFXTAG_CURSOR, GFXTAG_CURSOR_SHADOW, GFXTAG_DISPLAY_MON, GFXTAG_BOX_TITLE, GFXTAG_BOX_TITLE_ALT, GFXTAG_WAVEFORM, GFXTAG_BOX_SCROLL_ARROW, GFXTAG_ITEM_ICON_0, GFXTAG_ITEM_ICON_1, // Used implicitly in CreateItemIconSprites GFXTAG_ITEM_ICON_2, // Used implicitly in CreateItemIconSprites GFXTAG_CHOOSE_BOX_MENU_CENTER, GFXTAG_CHOOSE_BOX_MENU_CORNERS, // Used implicitly in LoadChooseBoxMenuGfx GFXTAG_12, // Unused GFXTAG_MARKING_MENU, GFXTAG_14, // Unused GFXTAG_15, // Unused GFXTAG_MARKING_COMBO, GFXTAG_17, // Unused GFXTAG_MON_ICON, }; // Special box ids for the choose box menu #define BOXID_NONE_CHOSEN 200 #define BOXID_CANCELED 201 enum { CURSOR_ANIM_BOUNCE, CURSOR_ANIM_STILL, CURSOR_ANIM_OPEN, CURSOR_ANIM_FIST, }; enum { RELEASE_ANIM_RELEASE, RELEASE_ANIM_COME_BACK, }; // IDs for the item icons affine anims enum { ITEM_ANIM_NONE, ITEM_ANIM_APPEAR, ITEM_ANIM_DISAPPEAR, ITEM_ANIM_PICK_UP, ITEM_ANIM_PUT_DOWN, ITEM_ANIM_PUT_AWAY, ITEM_ANIM_LARGE, }; struct Wallpaper { const u32 *tiles; const u32 *tileMap; const u16 *palettes; }; struct StorageMessage { const u8 *text; u8 format; }; struct ChooseBoxMenu { struct Sprite *menuSprite; struct Sprite *menuCornerSprites[4]; u32 unused1[3]; struct Sprite *arrowSprites[2]; u8 buffer[0x200]; // passed but not used u8 strbuf[20]; bool32 loadedPalette; u16 tileTag; u16 paletteTag; u8 curBox; u8 unused3; u8 subpriority; }; struct StorageMenu { const u8 *text; int textId; }; struct UnkUtilData { const u8 *src; u8 *dest; u16 size; u16 unk; u16 height; void (*func)(struct UnkUtilData *data); }; struct UnkUtil { struct UnkUtilData *data; u8 numActive; u8 max; }; struct PokeStorageItemIcon { struct Sprite *sprite; u8 *tiles; u16 palIndex; u8 cursorArea; u8 cursorPos; u8 active; }; struct PokemonStorageSystemData { u8 state; u8 boxOption; u8 screenChangeType; bool8 isReopening; u8 taskId; struct UnkUtil unkUtil; struct UnkUtilData unkUtilData[8]; u16 partyMenuTilemapBuffer[0x108]; u16 partyMenuUnused1; // Never read u16 partyMenuY; u8 partyMenuUnused2; // Unused u8 partyMenuMoveTimer; u8 showPartyMenuState; bool8 closeBoxFlashing; u8 closeBoxFlashTimer; bool8 closeBoxFlashState; s16 newCurrBoxId; u16 bg2_X; s16 scrollSpeed; u16 scrollTimer; u8 wallpaperOffset; u8 scrollUnused1; // Never read u8 scrollToBoxIdUnused; // Never read u16 scrollUnused2; // Never read s16 scrollDirectionUnused; // Never read. u16 scrollUnused3; // Never read u16 scrollUnused4; // Never read u16 scrollUnused5; // Never read u16 scrollUnused6; // Never read u8 filler1[22]; u8 boxTitleTiles[512]; u8 boxTitleUnused[512]; u8 boxTitleCycleId; u8 wallpaperLoadState; // Written to, but never read. u8 wallpaperLoadBoxId; s8 wallpaperLoadDir; u16 boxTitlePal[16]; u16 boxTitlePalOffset; u16 boxTitleAltPalOffset; struct Sprite *curBoxTitleSprites[2]; struct Sprite *nextBoxTitleSprites[2]; struct Sprite *arrowSprites[2]; u32 wallpaperPalBits; u8 filler2[80]; // Unused u16 unusedField1; // Never read. s16 wallpaperSetId; s16 wallpaperId; u16 wallpaperTilemap[360]; u8 wallpaperChangeState; u8 scrollState; u8 scrollToBoxId; s8 scrollDirection; // u8 *wallpaperTiles; // used only in Emerald for Walda struct Sprite *movingMonSprite; struct Sprite *partySprites[PARTY_SIZE]; struct Sprite *boxMonsSprites[IN_BOX_COUNT]; struct Sprite **shiftMonSpritePtr; struct Sprite **releaseMonSpritePtr; u16 numIconsPerSpecies[MAX_MON_ICONS]; u16 iconSpeciesList[MAX_MON_ICONS]; u16 boxSpecies[IN_BOX_COUNT]; u32 boxPersonalities[IN_BOX_COUNT]; u8 incomingBoxId; u8 shiftTimer; u8 numPartySpritesToCompact; u16 iconScrollDistance; s16 iconScrollPos; s16 iconScrollSpeed; u16 iconScrollNumIncoming; u8 iconScrollCurColumn; s8 iconScrollDirection; // Unnecessary duplicate of scrollDirection u8 iconScrollState; u8 iconScrollToBoxId; // Unused duplicate of scrollToBoxId struct WindowTemplate menuWindow; struct StorageMenu menuItems[7]; u8 menuItemsCount; u8 menuWidth; u8 menuUnusedField; // Never read. u16 menuWindowId; struct Sprite *cursorSprite; struct Sprite *cursorShadowSprite; s32 cursorNewX; s32 cursorNewY; u32 cursorSpeedX; u32 cursorSpeedY; s16 cursorTargetX; s16 cursorTargetY; u16 cursorMoveSteps; s8 cursorVerticalWrap; s8 cursorHorizontalWrap; u8 newCursorArea; u8 newCursorPosition; u8 cursorPrevPartyPos; u8 cursorFlipTimer; u8 cursorPalNums[2]; const u32 *displayMonPalette; u32 displayMonPersonality; u16 displayMonSpecies; u16 displayMonItemId; u16 displayUnusedVar; bool8 setMosaic; u8 displayMonMarkings; u8 displayMonLevel; bool8 displayMonIsEgg; u8 displayMonNickname[POKEMON_NAME_LENGTH + 1]; u8 displayMonTexts[4][36]; // nickname, species name, gender and level, item name bool8 (*monPlaceChangeFunc)(void); u8 monPlaceChangeState; u8 shiftBoxId; struct Sprite *markingComboSprite; struct Sprite *waveformSprites[2]; u16 *markingComboTilesPtr; struct MonMarkingsMenu markMenu; struct ChooseBoxMenu chooseBoxMenu; struct Pokemon movingMon; struct Pokemon tempMon; s8 releaseMonStatus; bool8 releaseMonStatusResolved; bool8 isSurfMon; bool8 isDiveMon; s8 releaseCheckBoxId; s8 releaseCheckBoxPos; s8 releaseBoxId; s8 releaseBoxPos; u16 releaseCheckState; u16 restrictedMoveList[3]; u8 summaryLastIndex; u8 summaryCursorPos; u8 summaryScreenMode; union { struct Pokemon *mon; struct BoxPokemon *box; } summaryMonPtr; u8 actionText[40]; u8 boxTitleText[40]; u8 releaseMonName[POKEMON_NAME_LENGTH + 1]; u8 itemName[20]; u8 inBoxMovingMode; u16 multiMoveWindowId; struct PokeStorageItemIcon itemIcons[MAX_ITEM_ICONS]; u16 movingItemId; u16 itemInfoWindowOffset; struct QuestLogEvent_MovedBoxMon questLogData; u16 unusedField2; u16 displayMonPalOffset; u16 *displayMonTilePtr; struct Sprite *displayMonSprite; u16 displayMonPalBuffer[0x20]; u8 unusedBuffer1[0x40]; u8 tileBuffer[0x800]; u8 unusedBuffer2[0x1800]; u8 itemIconBuffer[0x200]; u8 unusedBuffer3[0x600]; u8 wallpaperBgTilemapBuffer[0x1000]; u8 menuTilemapBuffer[0x800]; }; extern struct PokemonStorageSystemData *gStorage; void EnterPokeStorage(u8 boxOption); u8 GetCurrentBoxOption(void); struct Sprite *CreateChooseBoxArrows(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority); void SetBoxWallpaper(u8 boxId, u8 wallpaperId); void SetCurrentBox(u8 boxId); void BoxMonAtToMon(u8 boxId, u8 boxPosition, struct Pokemon * dst); void SetBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon * src); void CB2_ExitPokeStorage(void); void FreeBoxSelectionPopupSpriteGfx(void); void CreateChooseBoxMenuSprites(u8 curBox); void DestroyChooseBoxMenuSprites(void); u8 HandleBoxChooseSelectionInput(void); void LoadChooseBoxMenuGfx(struct ChooseBoxMenu *menu, u16 tileTag, u16 palTag, u8 subpriority, bool32 loadPal); void SetCurrentBoxMonData(u8 boxPosition, s32 request, const void *value); u32 GetCurrentBoxMonData(u8 boxPosition, s32 request); u32 GetAndCopyBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, void *dst); void InitCursor(void); void InitCursorOnReopen(void); bool8 UpdateCursorPos(void); void SetCursorInParty(void); void SetCursorBoxPosition(u8 cursorBoxPosition); void ClearSavedCursorPos(void); void SaveCursorPos(void); u8 GetSavedCursorPos(void); void DoTrySetDisplayMonData(void); void ResetSelectionAfterDeposit(void); void InitReleaseMon(void); bool8 TryHideReleaseMon(void); void TrySetCursorFistAnim(void); void SaveMovingMon(void); void LoadSavedMovingMon(void); void InitSummaryScreenData(void); void SetSelectionAfterSummaryScreen(void); void StartCursorAnim(u8 animNum); u8 GetMovingMonOriginalBoxId(void); void TryHideItemAtCursor(void); void TryShowItemAtCursor(void); bool8 IsMenuLoading(void); s16 HandleMenuInput(void); void RemoveMenu(void); bool8 MultiMove_Init(void); void MultiMove_Free(void); void MultiMove_SetFunction(u8 funcId); bool8 MultiMove_RunFunction(void); void CreateItemIconSprites(void); void MoveItemFromCursorToBag(void); void MoveHeldItemWithPartyMenu(void); bool8 IsItemIconAnimActive(void); const u8 *GetMovingItemName(void); void InitItemInfoWindow(void); bool8 UpdateItemInfoWindowSlideIn(void); bool8 UpdateItemInfoWindowSlideOut(void); void UnkUtil_Init(struct UnkUtil *arg0, struct UnkUtilData *arg1, u32 arg2); void UnkUtil_Run(void); void AddMenu(void); bool8 CanMovePartyMon(void); bool8 CanShiftMon(void); bool8 DoMonPlaceChange(void); bool8 DoWallpaperGfxChange(void); u8 GetBoxCursorPosition(void); u16 GetMovingItem(void); u8 HandleInput(void); void InitCanReleaseMonVars(void); void InitMonPlaceChange(u8 type); bool8 IsActiveItemMoving(void); bool8 IsCursorOnCloseBox(void); bool8 IsMonBeingMoved(void); void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos); void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos); void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos); void Item_TakeMons(u8 cursorArea, u8 cursorPos); void PrintItemDescription(void); void ReleaseMon(void); s8 RunCanReleaseMon(void); bool8 ScrollToBox(void); void SetMonMarkings(u8 markings); void SetMovingMonPriority(u8 priority); void SetUpScrollToBox(u8 targetBox); void SetWallpaperForCurrentBox(u8 wallpaper); bool8 TryStorePartyMonInBox(u8 boxId); void InitMenu(void); void SetMenuText(u8 textId); void TryLoadItemIconAtPos(u8 cursorArea, u8 cursorPos); void InitItemIconInCursor(u16 itemId); u8 GetBoxWallpaper(u8 boxId); bool8 IsCursorOnBoxTitle(void); bool8 IsCursorInBox(void); void InitMonIconFields(void); struct Sprite *CreateMonIconSprite(u16 species, u32 pid, s16 x, s16 y, u8 priority, u8 subpriority); void CreatePartyMonsSprites(bool8 species); void CompactPartySprites(void); u8 GetNumPartySpritesCompacting(void); void MovePartySprites(s16 yDelta); void DestroyAllPartyMonIcons(void); void DoReleaseMonComeBackAnim(void); bool8 ResetReleaseMonSpritePtr(void); void CreateInitBoxTask(u8 boxId); bool8 IsInitBoxActive(void); void AnimateBoxScrollArrows(bool8 species); void CreateMovingMonIcon(void); void SetShiftMonSpritePtr(u8 boxId, u8 position); bool8 ShiftMons(void); void SetMovingMonSprite(u8 cursorArea, u8 cursorPos); void SetPlacedMonSprite(u8 cursorArea, u8 cursorPos); void DestroyPartyMonIcon(u8 partyId); void DestroyMovingMonIcon(void); s16 GetFirstFreeBoxSpot(u8 boxId); void CreateBoxMonIconAtPos(u8 boxPosition); void DoReleaseMonAnim(u8 mode, u8 position); bool8 TryHideReleaseMonSprite(void); void DestroyReleaseMonIcon(void); u8 CountPartyMons(void); u8 CountPartyAliveNonEggMonsExcept(u8 slotToIgnore); s8 GetMenuItemTextId(u8 menuIndex); bool8 MultiMove_TryMoveGroup(u8 dir); u8 MultiMove_GetOriginPosition(void); bool8 MultiMove_CanPlaceSelection(void); void TryHideItemIconAtPos(u8 cursorArea, u8 cursorPos); void GetCursorBoxColumnAndRow(u8 *column, u8 *row); void SetCursorPriorityTo1(void); void InitMultiMonPlaceChange(bool8 moveCursorUp); void DestroyBoxMonIconAtPosition(u8 boxPosition); void SetBoxMonIconObjMode(u8 cursorPos, u8 objMode); void SetPartyMonIconObjMode(u8 cursorPos, u8 objMode); #endif //GUARD_POKEMON_STORAGE_SYSTEM_INTERNAL_H ================================================ FILE: include/pokemon_summary_screen.h ================================================ #ifndef GUARD_POKEMON_SUMMARY_SCREEN_H #define GUARD_POKEMON_SUMMARY_SCREEN_H #include "main.h" extern const u8 *const gMoveDescriptionPointers[]; extern const u8 *const gNatureNamePointers[]; void ShowSelectMovePokemonSummaryScreen(struct Pokemon *, u8, u8, MainCallback, u16); u8 GetMoveSlotToReplace(void); void SummaryScreen_SetUnknownTaskId(u8 a0); void SummaryScreen_DestroyUnknownTask(void); u8 GetLastViewedMonIndex(void); void ShowPokemonSummaryScreen(struct Pokemon * party, u8 cursorPos, u8 lastIdx, void (*callback)(void), u8 a4); void SetPokemonSummaryScreenMode(u8); u8 GetHiddenPowerType(struct Pokemon * mon); u8 GetWeatherBallType(void); // The Pokemon Summary Screen can operate in different modes. Certain features, // such as move re-ordering, are available in the different modes. enum PokemonSummaryScreenMode { PSS_MODE_NORMAL, PSS_MODE_UNK1, PSS_MODE_SELECT_MOVE, PSS_MODE_FORGET_MOVE, PSS_MODE_TRADE, PSS_MODE_BOX, }; enum PokemonSummaryScreenPage { PSS_PAGE_INFO, PSS_PAGE_SKILLS, PSS_PAGE_MOVES, PSS_PAGE_MOVES_INFO, PSS_PAGE_UNK4, PSS_PAGE_MOVE_DELETER, }; enum PokemonSummaryScreenState3270 { PSS_STATE3270_FADEIN, PSS_STATE3270_PLAYCRY, PSS_STATE3270_HANDLEINPUT, PSS_STATE3270_FLIPPAGES, PSS_STATE3270_ATEXIT_FADEOUT, PSS_STATE3270_ATEXIT_WAITLINKDELAY, PSS_STATE3270_ATEXIT_WAITFADE }; enum PokemonSummaryScreenStat { PSS_STAT_ATK, PSS_STAT_DEF, PSS_STAT_SPA, PSS_STAT_SPD, PSS_STAT_SPE }; #define TAG_PSS_UNK_64 0x64 #define TAG_PSS_UNK_65 0x65 #define TAG_PSS_UNK_66 0x66 #define TAG_PSS_UNK_67 0x67 #define TAG_PSS_UNK_6E 0x6E #define TAG_PSS_UNK_78 0x78 #define TAG_PSS_UNK_82 0x82 #define TAG_PSS_UNK_8C 0x8C #define TAG_PSS_UNK_96 0x96 #define TAG_PSS_UNK_A0 0xA0 #endif // GUARD_POKEMON_SUMMARY_SCREEN_H ================================================ FILE: include/quest_log.h ================================================ #ifndef GUARD_QUEST_LOG_H #define GUARD_QUEST_LOG_H #include "global.h" #include "quest_log_battle.h" #include "field_control_avatar.h" #include "constants/quest_log.h" #include "constants/battle.h" // Layout of Quest Log script commands #define QL_CMD_EVENT_MASK 0x0FFF #define QL_CMD_COUNT_SHIFT 12 #define QL_CMD_COUNT_MASK (0xF << QL_CMD_COUNT_SHIFT) // Parameter to QuestLog_OnEscalatorWarp #define QL_ESCALATOR_OUT 1 #define QL_ESCALATOR_IN 2 struct QuestLogAction { union { struct { u8 localId; u8 mapNum; u8 mapGroup; u8 movementActionId; } a; // Data when type == 0 struct { u8 localId; u8 mapNum; u8 mapGroup; u8 gfxState; } b; // Data when type == 1 u8 fieldInput[4]; // Data when type == 2 u8 raw[4]; } data; u16 duration; u8 type; }; struct QuestLogRepeatEventTracker { u8 id; u8 numRepeats; u16 counter; }; // Event data structs // QL_EVENT_SWITCHED_PARTY_ORDER struct QuestLogEvent_SwitchedPartyOrder { u16 species1; u16 species2; }; // QL_EVENT_USED_ITEM // QL_EVENT_GAVE_HELD_ITEM // QL_EVENT_GAVE_HELD_ITEM_BAG // QL_EVENT_GAVE_HELD_ITEM_PC // QL_EVENT_TOOK_HELD_ITEM // QL_EVENT_DEPOSITED_ITEM_PC // QL_EVENT_WITHDREW_ITEM_PC struct QuestLogEvent_Item { u16 itemId; u16 unused; u16 species; u16 itemParam; }; // QL_EVENT_SWAPPED_HELD_ITEM // QL_EVENT_SWAPPED_HELD_ITEM_PC struct QuestLogEvent_SwappedHeldItem { u16 takenItemId; u16 givenItemId; u16 species; }; // QL_EVENT_LINK_TRADED // QL_EVENT_LINK_TRADED_UNION struct QuestLogEvent_Traded { u16 speciesSent; u16 speciesReceived; u8 partnerName[PLAYER_NAME_LENGTH]; }; // QL_EVENT_LINK_BATTLED_SINGLE // QL_EVENT_LINK_BATTLED_DOUBLE // QL_EVENT_LINK_BATTLED_MULTI // QL_EVENT_LINK_BATTLED_UNION struct QuestLogEvent_LinkBattle { u8 outcome; u8 playerNames[MAX_BATTLERS_COUNT - 1][PLAYER_NAME_LENGTH]; }; // QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES // QL_EVENT_SWITCHED_MONS_WITHIN_BOX // QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON // QL_EVENT_MOVED_MON_BETWEEN_BOXES // QL_EVENT_MOVED_MON_WITHIN_BOX // QL_EVENT_WITHDREW_MON_PC // QL_EVENT_DEPOSITED_MON_PC // QL_EVENT_SWITCHED_MULTIPLE_MONS struct QuestLogEvent_MovedBoxMon { u16 species1; u16 species2; u8 box1; u8 box2; }; // QL_EVENT_DEFEATED_TRAINER // QL_EVENT_DEFEATED_GYM_LEADER // QL_EVENT_DEFEATED_E4_MEMBER // QL_EVENT_DEFEATED_CHAMPION struct QuestLogEvent_TrainerBattle { u16 trainerId; u16 speciesOpponent; u16 speciesPlayer; u8 hpFractionId; u8 mapSec; }; // QL_EVENT_DEFEATED_WILD_MON struct QuestLogEvent_WildBattle { u16 defeatedSpecies; u16 caughtSpecies; u8 mapSec; }; // QL_EVENT_DEPARTED struct QuestLogEvent_Departed { u8 mapSec; u8 locationId; }; // QL_EVENT_USED_FIELD_MOVE struct QuestLogEvent_FieldMove { u16 species; u8 fieldMove; u8 mapSec; }; // QL_EVENT_BOUGHT_ITEM // QL_EVENT_SOLD_ITEM struct QuestLogEvent_Shop { u32 totalMoney; // Total amount of money spent buying or earned selling u16 lastItemId; u16 itemQuantity; // Total number of items bought or sold u8 mapSec; bool8 hasMultipleTransactions; u8 logEventId; // Either 0 (empty), 1 (bought) or 2 (sold) }; // QL_EVENT_OBTAINED_STORY_ITEM struct QuestLogEvent_StoryItem { u16 itemId; u8 mapSec; }; extern u8 gQuestLogState; extern u8 gQuestLogPlaybackState; extern struct FieldInput gQuestLogFieldInput; extern struct QuestLogRepeatEventTracker gQuestLogRepeatEventTracker; extern u16 *gQuestLogDefeatedWildMonRecord; extern u16 *gQuestLogRecordingPointer; extern u16 gQuestLogCurActionIdx; void QuestLogRecordPlayerAvatarGfxTransition(u8); void SetQuestLogEvent(u16, const u16 *); void SetQLPlayedTheSlots(void); void QuestLog_RecordEnteredMap(u16); u8 QL_GetPlaybackState(void); bool8 QL_AvoidDisplay(void (*func)(void)); void QuestLog_BackUpPalette(u16 offset, u16 size); void CommitQuestLogWindow1(void); void QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(void); void ResetQuestLog(void); void ResetTrainerFanClub(void); void TryStartQuestLogPlayback(u8 taskId); void SaveQuestLogData(void); void QuestLog_CutRecording(void); void ResetDeferredLinkEvent(void); void QL_FinishRecordingScene(void); void QuestLogEvents_HandleEndTrainerBattle(void); void *QuestLogGetFlagOrVarPtr(bool8 isFlag, u16 idx); void QuestLogSetFlagOrVar(bool8 isFlag, u16 idx, u16 value); void QL_AddASLROffset(void *oldSaveBlockPtr); void QL_UpdateObject(struct Sprite *sprite); void QuestLogRecordNPCStep(u8 a0, u8 a1, u8 a2, u8 a3); bool8 QL_IsTrainerSightDisabled(void); void QuestLog_OnEscalatorWarp(u8 direction); void QuestLogRecordPlayerAvatarGfxTransitionWithDuration(u8 movementActionId, u8 duration); void Special_UpdateTrainerFansAfterLinkBattle(void); void QuestLogRecordPlayerStep(u8 movementActionId); void QuestLogRecordPlayerStepWithDuration(u8 movementActionId, u8 duration); void QuestLogRecordNPCStepWithDuration(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId, u8 duration); void QL_AfterRecordFishActionSuccessful(void); void QL_ResetDefeatedWildMonRecord(void); void QL_RestoreMapLayoutId(void); void QL_RecordFieldInput(struct FieldInput * fieldInput); void QL_TryRunActions(void); void RunQuestLogCB(void); void QL_HandleInput(void); bool8 QuestLogScenePlaybackIsEnding(void); void SetQuestLogEvent_Arrived(void); bool8 QuestLog_ShouldEndSceneOnMapChange(void); void QuestLog_AdvancePlayhead_(void); void QuestLog_InitPalettesBackup(void); void QL_InitSceneObjectsAndActions(void); u8 GetQuestLogStartType(void); void QL_CopySaveState(void); void QL_ResetPartyAndPC(void); void QL_StartRecordingAction(u16 eventId); bool8 QL_IsRoomToSaveAction(const void *cursor, size_t size); bool8 QL_IsRoomToSaveEvent(const void *cursor, size_t size); void QL_ResetEventStates(void); void QL_ResetRepeatEventTracker(void); u16 *QL_RecordAction_SceneEnd(u16 *); u16 *QL_LoadAction_Wait(u16 *, struct QuestLogAction *); u16 *QL_RecordAction_Input(u16 *, struct QuestLogAction *); u16 *QL_LoadAction_Input(u16 *, struct QuestLogAction *); u16 *QL_RecordAction_MovementOrGfxChange(u16 *, struct QuestLogAction *); u16 *QL_LoadAction_MovementOrGfxChange(u16 *, struct QuestLogAction *); void QL_EnableRecordingSteps(void); u16 *QL_SkipCommand(u16 *, u16 **); void QL_UpdateLastDepartedLocation(const u16 *); u16 *QL_LoadAction_SceneEnd(u16 *, struct QuestLogAction *); bool8 QL_LoadEvent(const u16 *); bool8 QL_TryRepeatEvent(const u16 *); void QL_RecordWait(u16); #endif //GUARD_QUEST_LOG_H ================================================ FILE: include/quest_log_battle.h ================================================ #ifndef GUARD_QUEST_LOG_BATTLE_H #define GUARD_QUEST_LOG_BATTLE_H #include "global.h" void TrySetQuestLogBattleEvent(void); void TrySetQuestLogLinkBattleEvent(void); #endif // GUARD_QUEST_LOG_BATTLE_H ================================================ FILE: include/quest_log_objects.h ================================================ #ifndef GUARD_QUEST_LOG_OBJECTS_H #define GUARD_QUEST_LOG_OBJECTS_H #include "global.h" void QL_RecordObjects(struct QuestLogScene *); void QL_LoadObjects(struct QuestLogScene *, struct ObjectEventTemplate *); void QL_TryStopSurfing(void); #endif //GUARD_QUEST_LOG_OBJECTS_H ================================================ FILE: include/quest_log_player.h ================================================ #ifndef GUARD_QUEST_LOG_PLAYER_H #define GUARD_QUEST_LOG_PLAYER_H #include "global.h" enum { QL_PLAYER_GFX_NORMAL, QL_PLAYER_GFX_BIKE, QL_PLAYER_GFX_FISH, QL_PLAYER_GFX_SURF, QL_PLAYER_GFX_STOP_SURF_S, QL_PLAYER_GFX_STOP_SURF_N, QL_PLAYER_GFX_STOP_SURF_W, QL_PLAYER_GFX_STOP_SURF_E, QL_PLAYER_GFX_VSSEEKER, QL_PLAYER_GFX_NONE = 0xFF }; void QuestLogUpdatePlayerSprite(u8 state); bool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state); void QuestLogCallUpdatePlayerSprite(u8 state); #endif //GUARD_QUEST_LOG_PLAYER_H ================================================ FILE: include/random.h ================================================ #ifndef GUARD_RANDOM_H #define GUARD_RANDOM_H #include "global.h" extern u32 gRngValue; extern u32 gRng2Value; //Returns a 16-bit pseudorandom number u16 Random(void); u16 Random2(void); //Returns a 32-bit pseudorandom number #define Random32() (Random() | (Random() << 16)) // The number 1103515245 comes from the example implementation of rand and srand // in the ISO C standard. #define RAND_MULT 1103515245 #define ISO_RANDOMIZE1(val)(RAND_MULT * (val) + 24691) #define ISO_RANDOMIZE2(val)(RAND_MULT * (val) + 12345) //Sets the initial seed value of the pseudorandom number generator void SeedRng(u16 seed); void SeedRng2(u16 seed); #endif // GUARD_RANDOM_H ================================================ FILE: include/region_map.h ================================================ #ifndef GUARD_REGION_MAP_H #define GUARD_REGION_MAP_H #include "global.h" #include "bg.h" enum { REGIONMAP_TYPE_NORMAL, REGIONMAP_TYPE_WALL, REGIONMAP_TYPE_FLY, REGIONMAP_TYPE_HOENN, REGIONMAP_TYPE_COUNT }; u8 *GetMapName(u8 *dest, u16 mapsec, u16 fill); u8 *GetMapNameGeneric(u8 *dest, u16 mapsec); u8 *GetMapNameGeneric_(u8 *dest, u16 mapsec); void InitRegionMapWithExitCB(u8 type, void (*callback)(void)); void CB2_OpenFlyMap(void); #endif // GUARD_REGION_MAP_H ================================================ FILE: include/renewable_hidden_items.h ================================================ #ifndef GUARD_RENEWABLE_HIDDEN_ITEMS_H #define GUARD_RENEWABLE_HIDDEN_ITEMS_H void IncrementRenewableHiddenItemStepCounter(void); void TryRegenerateRenewableHiddenItems(void); void SetAllRenewableItemFlags(void); #endif //GUARD_RENEWABLE_HIDDEN_ITEMS_H ================================================ FILE: include/reset_save_heap.h ================================================ #ifndef GUARD_RESET_SAVE_HEAP_H #define GUARD_RESET_SAVE_HEAP_H void ReloadSave(void); #endif //GUARD_RESET_SAVE_HEAP_H ================================================ FILE: include/reshow_battle_screen.h ================================================ #ifndef GUARD_RESHOW_BATTLE_SCREEN_H #define GUARD_RESHOW_BATTLE_SCREEN_H #include "global.h" void ReshowBattleScreenDummy(void); void ReshowBattleScreenAfterMenu(void); #endif // GUARD_RESHOW_BATTLE_SCREEN_H ================================================ FILE: include/roamer.h ================================================ #ifndef GUARD_ROAMER_H #define GUARD_ROAMER_H #include "global.h" void ClearRoamerData(void); u16 GetRoamerSpecies(void); void ClearRoamerLocationData(void); void InitRoamer(void); void UpdateLocationHistoryForRoamer(void); void RoamerMoveToOtherLocationSet(void); void RoamerMove(void); bool8 IsRoamerAt(u8 mapGroup, u8 mapNum); void CreateRoamerMonInstance(void); u8 TryStartRoamerEncounter(void); void UpdateRoamerHPStatus(struct Pokemon *mon); void SetRoamerInactive(void); void GetRoamerLocation(u8 *mapGroup, u8 *mapNum); u16 GetRoamerLocationMapSectionId(void); #endif // GUARD_ROAMER_H ================================================ FILE: include/safari_zone.h ================================================ #ifndef GUARD_SAFARI_ZONE_H #define GUARD_SAFARI_ZONE_H #include "global.h" extern u8 gNumSafariBalls; extern u16 gSafariZoneStepCounter; bool32 GetSafariZoneFlag(void); void SetSafariZoneFlag(void); void ResetSafariZoneFlag(void); void EnterSafariMode(void); void ExitSafariMode(void); bool8 SafariZoneTakeStep(void); void SafariZoneRetirePrompt(void); void CB2_EndSafariBattle(void); #endif // GUARD_SAFARI_ZONE_H ================================================ FILE: include/save.h ================================================ #ifndef GUARD_SAVE_H #define GUARD_SAVE_H #include "global.h" // Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer. // Only 12 bytes of the footer are used. #define SECTOR_DATA_SIZE 3968 #define SECTOR_FOOTER_SIZE 128 #define SECTOR_SIZE (SECTOR_DATA_SIZE + SECTOR_FOOTER_SIZE) #define NUM_SAVE_SLOTS 2 // If the sector's signature field is not this value then the sector is either invalid or empty. #define SECTOR_SIGNATURE 0x08012025 #define SPECIAL_SECTOR_SENTINEL 0xB39D #define SECTOR_ID_SAVEBLOCK2 0 #define SECTOR_ID_SAVEBLOCK1_START 1 #define SECTOR_ID_SAVEBLOCK1_END 4 #define SECTOR_ID_PKMN_STORAGE_START 5 #define SECTOR_ID_PKMN_STORAGE_END 13 #define NUM_SECTORS_PER_SLOT 14 // Save Slot 1: 0-13; Save Slot 2: 14-27 #define SECTOR_ID_HOF_1 28 #define SECTOR_ID_HOF_2 29 #define SECTOR_ID_TRAINER_TOWER_1 30 #define SECTOR_ID_TRAINER_TOWER_2 31 #define SECTORS_COUNT 32 #define NUM_HOF_SECTORS 2 #define SAVE_STATUS_EMPTY 0 #define SAVE_STATUS_OK 1 #define SAVE_STATUS_INVALID 2 #define SAVE_STATUS_NO_FLASH 4 #define SAVE_STATUS_ERROR 0xFF // Special sector id value for certain save functions // to indicate that all sectors should be used // instead of a specific sector. #define FULL_SAVE_SLOT 0xFFFF enum { SAVE_NORMAL, SAVE_LINK, SAVE_EREADER, SAVE_HALL_OF_FAME, SAVE_OVERWRITE_DIFFERENT_FILE, SAVE_HALL_OF_FAME_ERASE_BEFORE, // unused }; // A save sector location holds a pointer to the data for a particular sector // and the size of that data. Size cannot be greater than SECTOR_DATA_SIZE. struct SaveSectorLocation { u8 *data; u16 size; }; struct SaveSector { u8 data[SECTOR_DATA_SIZE]; u8 unused[SECTOR_FOOTER_SIZE - 12]; // Unused portion of the footer u16 id; u16 checksum; u32 signature; u32 counter; }; // size is SECTOR_SIZE (0x1000) #define SECTOR_SIGNATURE_OFFSET offsetof(struct SaveSector, signature) #define SECTOR_COUNTER_OFFSET offsetof(struct SaveSector, counter) // operations for SetDamagedSectorBits enum { ENABLE, DISABLE, CHECK // unused }; extern u32 gDamagedSaveSectors; extern struct SaveSector *gSaveDataBufferPtr; // the pointer is in fast IWRAM but points to the slower EWRAM. extern u16 gSaveFileStatus; extern void (*gGameContinueCallback)(void); extern u16 gSaveAttemptStatus; extern struct SaveSector gSaveDataBuffer; void ClearSaveData(void); void Save_ResetSaveCounters(void); u8 HandleSavingData(u8 saveType); u8 TrySavingData(u8 saveType); bool8 LinkFullSave_Init(void); bool8 LinkFullSave_WriteSector(void); bool8 LinkFullSave_ReplaceLastSector(void); bool8 LinkFullSave_SetLastSectorSignature(void); bool8 WriteSaveBlock2(void); bool8 WriteSaveBlock1Sector(void); u8 LoadGameSave(u8 saveType); u32 TryReadSpecialSaveSector(u8 sector, u8 *dst); u32 TryWriteSpecialSaveSector(u8 sector, u8 *src); void Task_LinkFullSave(u8 taskId); #endif // GUARD_SAVE_H ================================================ FILE: include/save_failed_screen.h ================================================ #ifndef GUARD_SAVE_FAILED_SCREEN_H #define GUARD_SAVE_FAILED_SCREEN_H extern void DoSaveFailedScreen(u8 saveType); // save_failed_screen void SetNotInSaveFailedScreen(void); bool32 RunSaveFailedScreen(void); #endif //GUARD_SAVE_FAILED_SCREEN_H ================================================ FILE: include/save_location.h ================================================ #ifndef GUARD_SAVE_LOCATION_H #define GUARD_SAVE_LOCATION_H // specialSaveWarp flags #define CONTINUE_GAME_WARP (1 << 0) #define POKECENTER_SAVEWARP (1 << 1) #define LOBBY_SAVEWARP (1 << 2) #define UNK_SPECIAL_SAVE_WARP_FLAG_3 (1 << 3) #define CHAMPION_SAVEWARP (1 << 7) void TrySetMapSaveWarpStatus(void); bool32 IsCurMapPokeCenter(void); void SetUnlockedPokedexFlags(void); void SetPostgameFlags(void); #endif // GUARD_SAVE_LOCATION_H ================================================ FILE: include/save_menu_util.h ================================================ #ifndef GUARD_SAVE_MENU_UTIL_H #define GUARD_SAVE_MENU_UTIL_H enum SaveStat { SAVE_STAT_NAME = 0, SAVE_STAT_POKEDEX, SAVE_STAT_TIME, SAVE_STAT_LOCATION, SAVE_STAT_BADGES, SAVE_STAT_TIME_HR_RT_ALIGN }; void SaveStatToString(u8 a0, u8 *a1, u8 a2); #endif //GUARD_SAVE_MENU_UTIL_H ================================================ FILE: include/scanline_effect.h ================================================ #ifndef GUARD_SCANLINE_EFFECT_H #define GUARD_SCANLINE_EFFECT_H // DMA control value to transfer a single 16-bit value at HBlank #define SCANLINE_EFFECT_DMACNT_16BIT (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_INC | DMA_16BIT | DMA_DEST_RELOAD) << 16) | 1) #define SCANLINE_EFFECT_DMACNT_32BIT (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_INC | DMA_32BIT | DMA_DEST_RELOAD) << 16) | 1) #define SCANLINE_EFFECT_REG_BG0HOFS (REG_ADDR_BG0HOFS - REG_ADDR_BG0HOFS) #define SCANLINE_EFFECT_REG_BG0VOFS (REG_ADDR_BG0VOFS - REG_ADDR_BG0HOFS) #define SCANLINE_EFFECT_REG_BG1HOFS (REG_ADDR_BG1HOFS - REG_ADDR_BG0HOFS) #define SCANLINE_EFFECT_REG_BG1VOFS (REG_ADDR_BG1VOFS - REG_ADDR_BG0HOFS) #define SCANLINE_EFFECT_REG_BG2HOFS (REG_ADDR_BG2HOFS - REG_ADDR_BG0HOFS) #define SCANLINE_EFFECT_REG_BG2VOFS (REG_ADDR_BG2VOFS - REG_ADDR_BG0HOFS) #define SCANLINE_EFFECT_REG_BG3HOFS (REG_ADDR_BG3HOFS - REG_ADDR_BG0HOFS) #define SCANLINE_EFFECT_REG_BG3VOFS (REG_ADDR_BG3VOFS - REG_ADDR_BG0HOFS) struct ScanlineEffectParams { volatile void *dmaDest; u32 dmaControl; u8 initState; u8 unused9; }; struct ScanlineEffect { void *dmaSrcBuffers[2]; volatile void *dmaDest; u32 dmaControl; void (*setFirstScanlineReg)(void); u8 srcBuffer; u8 state; u8 unused16; u8 unused17; u8 waveTaskId; }; extern struct ScanlineEffect gScanlineEffect; extern u16 gScanlineEffectRegBuffers[2][0x3C0]; void ScanlineEffect_Stop(void); void ScanlineEffect_Clear(void); void ScanlineEffect_SetParams(struct ScanlineEffectParams); void ScanlineEffect_InitHBlankDmaTransfer(void); u8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 a7); #endif // GUARD_SCANLINE_EFFECT_H ================================================ FILE: include/script.h ================================================ #ifndef GUARD_SCRIPT_H #define GUARD_SCRIPT_H #include "global.h" struct ScriptContext; typedef bool8 (*ScrCmdFunc)(struct ScriptContext *); typedef u8 Script[]; struct ScriptContext { u8 stackDepth; u8 mode; u8 comparisonResult; u8 (*nativePtr)(void); const u8 *scriptPtr; const u8 *stack[20]; ScrCmdFunc *cmdTable; ScrCmdFunc *cmdTableEnd; u32 data[4]; }; #define ScriptReadByte(ctx) (*(ctx->scriptPtr++)) void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd); u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr); void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void)); void StopScript(struct ScriptContext *ctx); bool8 RunScriptCommand(struct ScriptContext *ctx); void ScriptJump(struct ScriptContext *ctx, const u8 *ptr); void ScriptCall(struct ScriptContext *ctx, const u8 *ptr); void ScriptReturn(struct ScriptContext *ctx); u16 ScriptReadHalfword(struct ScriptContext *ctx); u32 ScriptReadWord(struct ScriptContext *ctx); void LockPlayerFieldControls(void); void UnlockPlayerFieldControls(void); bool8 ArePlayerFieldControlsLocked(void); void ScriptContext_Init(void); bool8 ScriptContext_IsEnabled(void); bool8 ScriptContext_RunScript(void); void ScriptContext_SetupScript(const u8 *ptr); void ScriptContext_Stop(void); void ScriptContext_Enable(void); void RunScriptImmediately(const u8 *ptr); void RunOnLoadMapScript(void); void RunOnTransitionMapScript(void); void RunOnResumeMapScript(void); void RunOnReturnToFieldMapScript(void); void RunOnDiveWarpMapScript(void); bool8 TryRunOnFrameMapScript(void); void TryRunOnWarpIntoMapScript(void); u32 CalculateRamScriptChecksum(void); void ClearRamScript(void); bool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId); const u8 *GetRamScript(u8 objectId, const u8 *script); bool32 ValidateRamScript(void); void InitRamScript_NoObjectEvent(u8 * script, u16 scriptSize); u8 * GetSavedRamScriptIfValid(void); void RegisterQuestLogInput(u8 var); void ClearMsgBoxCancelableState(void); void SetQuestLogInputIsDpadFlag(void); void ClearQuestLogInput(void); void ClearQuestLogInputIsDpadFlag(void); void MsgSetSignpost(void); void MsgSetNotSignpost(void); bool8 IsMsgSignpost(void); bool8 IsQuestLogInputDpad(void); u8 GetRegisteredQuestLogInput(void); void ResetFacingNpcOrSignpostVars(void); bool8 CanWalkAwayToCancelMsgBox(void); void SetWalkingIntoSignVars(void); bool8 IsMsgBoxWalkawayDisabled(void); void UpdateBattleHouseStepCounter(void); u8 ReturnBattleHouseLevel(void); extern const u8 *gRamScriptRetAddr; extern u8 gWalkAwayFromSignInhibitTimer; #endif // GUARD_SCRIPT_H ================================================ FILE: include/script_menu.h ================================================ #ifndef GUARD_SCRIPT_MENU_H #define GUARD_SCRIPT_MENU_H #include "global.h" extern const u8 *const gStdStringPtrs[]; bool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 var3, u8 var4); bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 var3, u8 var4, u8 var5); bool8 ScriptMenu_YesNo(u8 var1, u8 var2); bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount); bool8 ScriptMenu_ShowPokemonPic(u16 var1, u8 var2, u8 var3); bool8 CreatePCMenu(void); void ScriptMenu_DisplayPCStartupPrompt(void); bool8 (*ScriptMenu_HidePokemonPic(void))(void); void QL_DestroyAbortedDisplay(void); void PicboxCancel(void); #endif //GUARD_SCRIPT_MENU_H ================================================ FILE: include/script_movement.h ================================================ #ifndef GUARD_SCRIPT_MOVEMENT_H #define GUARD_SCRIPT_MOVEMENT_H #include "global.h" bool8 ScriptMovement_StartObjectMovementScript(u8, u8, u8, const u8 *); bool8 ScriptMovement_IsObjectMovementFinished(u8, u8, u8); void ScriptMovement_UnfreezeObjectEvents(void); #endif // GUARD_SCRIPT_MOVEMENT_H ================================================ FILE: include/script_pokemon_util.h ================================================ #ifndef GUARD_SCRIPT_POKEMON_UTIL_H #define GUARD_SCRIPT_POKEMON_UTIL_H bool8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unk1, u32 unk2, u8 unk3); bool8 ScriptGiveEgg(u16 species); void ScriptSetMonMoveSlot(u8 partyIdx, u16 move, u8 slot); void HealPlayerParty(void); void ReducePlayerPartyToThree(void); void CreateScriptedWildMon(u16 species, u8 level, u16 item); void HealPlayerPartyOak(void); #endif //GUARD_SCRIPT_POKEMON_UTIL_H ================================================ FILE: include/shop.h ================================================ #ifndef GUARD_SHOP_H #define GUARD_SHOP_H #include "global.h" #include "menu_helpers.h" #define INDEX_CANCEL -2 void CreatePokemartMenu(const u16 *itemsForSale); void CreateDecorationShop1Menu(const u16 *); void CreateDecorationShop2Menu(const u16 *); u8 GetMartFontId(void); void RecordItemTransaction(u16 itemId, u16 quantity, u8 logEventId); // buy_menu_helper void BuyMenuInitWindows(bool32 isSellingTM); void BuyMenuDrawMoneyBox(void); void BuyMenuPrint(u8 windowId, u8 font, const u8 *text, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 color); void BuyMenuDisplayMessage(u8 taskId, const u8 *text, TaskFunc callback); void BuyMenuQuantityBoxNormalBorder(u8 windowId, bool8 copyToVram); void BuyMenuQuantityBoxThinBorder(u8 windowId, bool8 copyToVram); void BuyMenuConfirmPurchase(u8 taskId, const struct YesNoFuncTable *yesNo); #endif // GUARD_SHOP_H ================================================ FILE: include/slot_machine.h ================================================ #ifndef GUARD_SLOT_MACHINE_H #define GUARD_SLOT_MACHINE_H #include "global.h" void PlaySlotMachine(u16, void (*)(void)); #endif // GUARD_SLOT_MACHINE_H ================================================ FILE: include/sound.h ================================================ #ifndef GUARD_SOUND_H #define GUARD_SOUND_H #include "global.h" void InitMapMusic(void); void MapMusicMain(void); void ResetMapMusic(void); u16 GetCurrentMapMusic(void); void PlayNewMapMusic(u16 songNum); void StopMapMusic(void); void FadeOutMapMusic(u8 speed); void FadeOutAndPlayNewMapMusic(u16 songNum, u8 speed); void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed); bool8 IsNotWaitingForBGMStop(void); void PlayFanfareByFanfareNum(u8 fanfareNum); bool8 WaitFanfare(bool8 stop); void StopFanfareByFanfareNum(u8 fanfareNum); void PlayFanfare(u16 songNum); bool8 IsFanfareTaskInactive(void); void FadeInNewBGM(u16 songNum, u8 speed); void FadeOutBGMTemporarily(u8 speed); bool8 IsBGMPausedOrStopped(void); void FadeInBGM(u8 speed); void FadeOutBGM(u8 speed); bool8 IsBGMStopped(void); void PlayCry_Normal(u16 species, s8 pan); void PlayCry_NormalNoDucking(u16 species, s8 pan, s8 volume, u8 priority); void PlayCry_ByMode(u16 species, s8 pan, u8 mode); void PlayCry_ReleaseDouble(u16 species, s8 pan, u8 mode); void PlayCry_Script(u16 species, u8 mode); void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode); bool8 IsCryFinished(void); void StopCryAndClearCrySongs(void); void StopCry(void); bool8 IsCryPlayingOrClearCrySongs(void); bool8 IsCryPlaying(void); void PlayBGM(u16 songNum); void PlaySE(u16 songNum); void PlaySE12WithPanning(u16 songNum, s8 pan); void PlaySE1WithPanning(u16 songNum, s8 pan); void PlaySE2WithPanning(u16 songNum, s8 pan); void SE12PanpotControl(s8 pan); bool8 IsSEPlaying(void); bool8 IsBGMPlaying(void); bool8 IsSpecialSEPlaying(void); void SetBGMVolume_SuppressHelpSystemReduction(u16 volume); void BGMVolumeMax_EnableHelpSystemReduction(void); #endif // GUARD_SOUND_H ================================================ FILE: include/special_field_anim.h ================================================ #ifndef GUARD_SPECIAL_FIELD_ANIM_H #define GUARD_SPECIAL_FIELD_ANIM_H #include "global.h" void StartEscalator(bool8 goingUp); void StopEscalator(void); bool8 IsEscalatorMoving(void); #endif // GUARD_SPECIAL_FIELD_ANIM_H ================================================ FILE: include/sprite.h ================================================ #ifndef GUARD_SPRITE_H #define GUARD_SPRITE_H #include "global.h" #define MAX_SPRITES 64 #define SPRITE_NONE 0xFF #define TAG_NONE 0xFFFF // Given to SetSpriteMatrixAnchor to skip anchoring one of the coords. #define NO_ANCHOR 0x800 struct SpriteSheet { const void *data; // Raw uncompressed pixel data u16 size; u16 tag; }; struct CompressedSpriteSheet { const u32 *data; // LZ77 compressed pixel data u16 size; // Uncompressed size of pixel data u16 tag; }; struct SpriteFrameImage { const void *data; u16 size; }; #define obj_frame_tiles(ptr) {.data = (u8 *)ptr, .size = sizeof ptr} #define overworld_frame(ptr, width, height, frame) {.data = (u8 *)ptr + (width * height * frame * 64)/2, .size = (width * height * 64)/2} struct SpritePalette { const u16 *data; // Raw uncompressed palette data u16 tag; }; struct CompressedSpritePalette { const u32 *data; // LZ77 compressed palette data u16 tag; }; struct AnimFrameCmd { // If the sprite has an array of images, this is the array index. // If the sprite has a sheet, this is the tile offset. u32 imageValue:16; u32 duration:6; u32 hFlip:1; u32 vFlip:1; }; struct AnimLoopCmd { u32 type:16; u32 count:6; }; struct AnimJumpCmd { u32 type:16; u32 target:6; }; // The first halfword of this union specifies the type of command. // If it -2, then it is a jump command. If it is -1, then it is the end of the script. // Otherwise, it is the imageValue for a frame command. union AnimCmd { s16 type; struct AnimFrameCmd frame; struct AnimLoopCmd loop; struct AnimJumpCmd jump; }; #define ANIMCMD_FRAME(...) \ {.frame = {__VA_ARGS__}} #define ANIMCMD_LOOP(_count) \ {.loop = {.type = -3, .count = _count}} #define ANIMCMD_JUMP(_target) \ {.jump = {.type = -2, .target = _target}} #define ANIMCMD_END \ {.type = -1} struct AffineAnimFrameCmd { s16 xScale; s16 yScale; u8 rotation; u8 duration; }; struct AffineAnimLoopCmd { s16 type; s16 count; }; struct AffineAnimJumpCmd { s16 type; u16 target; }; struct AffineAnimEndCmdAlt { s16 type; u16 val; }; union AffineAnimCmd { s16 type; struct AffineAnimFrameCmd frame; struct AffineAnimLoopCmd loop; struct AffineAnimJumpCmd jump; struct AffineAnimEndCmdAlt end; }; #define AFFINEANIMCMDTYPE_LOOP 0x7FFD #define AFFINEANIMCMDTYPE_JUMP 0x7FFE #define AFFINEANIMCMDTYPE_END 0x7FFF #define AFFINEANIMCMD_FRAME(_xScale, _yScale, _rotation, _duration) \ {.frame = {.xScale = _xScale, .yScale = _yScale, .rotation = _rotation, .duration = _duration}} #define AFFINEANIMCMD_LOOP(_count) \ {.loop = {.type = AFFINEANIMCMDTYPE_LOOP, .count = _count}} #define AFFINEANIMCMD_JUMP(_target) \ {.jump = {.type = AFFINEANIMCMDTYPE_JUMP, .target = _target}} #define AFFINEANIMCMD_END \ {.type = AFFINEANIMCMDTYPE_END} #define AFFINEANIMCMD_LOOP(_count) \ {.loop = {.type = AFFINEANIMCMDTYPE_LOOP, .count = _count}} #define AFFINEANIMCMD_JUMP(_target) \ {.jump = {.type = AFFINEANIMCMDTYPE_JUMP, .target = _target}} #define AFFINEANIMCMD_END_ALT(_val) \ {.end = {.type = AFFINEANIMCMDTYPE_END, .val = _val}} struct AffineAnimState { u8 animNum; u8 animCmdIndex; u8 delayCounter; u8 loopCounter; s16 xScale; s16 yScale; u16 rotation; }; enum { SUBSPRITES_OFF, SUBSPRITES_ON, SUBSPRITES_IGNORE_PRIORITY, // on but priority is ignored }; struct Subsprite { s8 x; // was u16 in R/S s8 y; // was u16 in R/S u16 shape:2; u16 size:2; u16 tileOffset:10; u16 priority:2; }; struct SubspriteTable { u8 subspriteCount; const struct Subsprite *subsprites; }; struct Sprite; typedef void (*SpriteCallback)(struct Sprite *); struct SpriteTemplate { u16 tileTag; u16 paletteTag; const struct OamData *oam; const union AnimCmd *const *anims; const struct SpriteFrameImage *images; const union AffineAnimCmd *const *affineAnims; SpriteCallback callback; }; struct Sprite { /*0x00*/ struct OamData oam; /*0x08*/ const union AnimCmd *const *anims; /*0x0C*/ const struct SpriteFrameImage *images; /*0x10*/ const union AffineAnimCmd *const *affineAnims; /*0x14*/ const struct SpriteTemplate *template; /*0x18*/ const struct SubspriteTable *subspriteTables; /*0x1C*/ SpriteCallback callback; /*0x20*/ s16 x, y; /*0x24*/ s16 x2, y2; /*0x28*/ s8 centerToCornerVecX; /*0x29*/ s8 centerToCornerVecY; /*0x2A*/ u8 animNum; /*0x2B*/ u8 animCmdIndex; /*0x2C*/ u8 animDelayCounter:6; u8 animPaused:1; u8 affineAnimPaused:1; /*0x2D*/ u8 animLoopCounter; // general purpose data fields /*0x2E*/ s16 data[8]; /*0x3E*/ u16 inUse:1; //1 u16 coordOffsetEnabled:1; //2 u16 invisible:1; //4 u16 flags_3:1; //8 u16 flags_4:1; //0x10 u16 flags_5:1; //0x20 u16 flags_6:1; //0x40 u16 flags_7:1; //0x80 /*0x3F*/ u16 hFlip:1; //1 u16 vFlip:1; //2 u16 animBeginning:1; //4 u16 affineAnimBeginning:1; //8 u16 animEnded:1; //0x10 u16 affineAnimEnded:1; //0x20 u16 usingSheet:1; //0x40 u16 anchored:1; //0x80 /*0x40*/ u16 sheetTileStart; /*0x42*/ u8 subspriteTableNum:6; u8 subspriteMode:2; /*0x43*/ u8 subpriority; }; struct OamMatrix { s16 a; s16 b; s16 c; s16 d; }; extern const struct OamData gDummyOamData; extern const union AnimCmd *const gDummySpriteAnimTable[]; extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[]; extern s16 gSpriteCoordOffsetX; extern s16 gSpriteCoordOffsetY; extern const struct SpriteTemplate gDummySpriteTemplate; extern struct Sprite gSprites[]; extern struct OamMatrix gOamMatrices[]; extern bool8 gAffineAnimsDisabled; extern u16 gReservedSpriteTileCount; void ResetSpriteData(void); void AnimateSprites(void); void BuildOamBuffer(void); u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); u8 CreateInvisibleSprite(void (*callback)(struct Sprite *)); u8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); void DestroySprite(struct Sprite *sprite); void ResetOamRange(u8 a, u8 b); void LoadOam(void); void SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d); void CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode); void SpriteCallbackDummy(struct Sprite *sprite); void ProcessSpriteCopyRequests(void); void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size); void FreeSpriteTiles(struct Sprite *sprite); void FreeSpritePalette(struct Sprite *sprite); void FreeSpriteOamMatrix(struct Sprite *sprite); void DestroySpriteAndFreeResources(struct Sprite *sprite); void AnimateSprite(struct Sprite *sprite); void StartSpriteAnim(struct Sprite *sprite, u8 animNum); void StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum); void SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex); void StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum); void StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum); void ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum); void ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum); void SetSpriteSheetFrameTileNum(struct Sprite *sprite); u8 AllocOamMatrix(void); void FreeOamMatrix(u8 matrixNum); void InitSpriteAffineAnim(struct Sprite *sprite); void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation); u16 LoadSpriteSheet(const struct SpriteSheet *sheet); void LoadSpriteSheets(const struct SpriteSheet *sheets); u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet); void AllocTilesForSpriteSheets(struct SpriteSheet *sheets); void FreeSpriteTilesByTag(u16 tag); void FreeSpriteTileRanges(void); u16 GetSpriteTileStartByTag(u16 tag); u16 GetSpriteTileTagByTileStart(u16 start); void RequestSpriteSheetCopy(const struct SpriteSheet *sheet); u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet); void FreeAllSpritePalettes(void); u8 LoadSpritePalette(const struct SpritePalette *palette); void LoadSpritePalettes(const struct SpritePalette *palettes); u8 AllocSpritePalette(u16 tag); u8 IndexOfSpritePaletteTag(u16 tag); u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum); void FreeSpritePaletteByTag(u16 tag); void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables); bool8 AddSpriteToOamBuffer(struct Sprite *object, u32 *oamIndex); bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u32 *oamIndex); void CopyToSprites(u8 *src); void CopyFromSprites(u8 *dest); u8 SpriteTileAllocBitmapOp(u16 bit, u8 op); void ClearSpriteCopyRequests(void); void ResetAffineAnimData(void); void FreeSpriteTilesIfNotUsingSheet(struct Sprite *sprite); s16 AllocSpriteTiles(u16 tileCount); void SetSpriteMatrixAnchor(struct Sprite* sprite, s16 xmod, s16 ymod); #endif //GUARD_SPRITE_H ================================================ FILE: include/start_menu.h ================================================ #ifndef GUARD_START_MENU_H #define GUARD_START_MENU_H #include "global.h" void AppendToList(u8 *list, u8 *pos, u8 newEntry); void Task_StartMenuHandleInput(u8 taskId); void SetUpReturnToStartMenu(void); void ShowStartMenu(void); void Field_AskSaveTheGame(void); void CB2_SetUpSaveAfterLinkBattle(void); #endif // GUARD_START_MENU_H ================================================ FILE: include/string_util.h ================================================ #ifndef GUARD_STRING_UTIL_H #define GUARD_STRING_UTIL_H #include "global.h" enum StringConvertMode { STR_CONV_MODE_LEFT_ALIGN, STR_CONV_MODE_RIGHT_ALIGN, STR_CONV_MODE_LEADING_ZEROS }; u8 *StringCopy_Nickname(u8 *dest, const u8 *src); u8 *StringGet_Nickname(u8 *str); u8 *StringCopy_PlayerName(u8 *dest, const u8 *src); u8 *StringCopy(u8 *dest, const u8 *src); u8 *StringAppend(u8 *dest, const u8 *src); u8 *StringCopyN(u8 *dest, const u8 *src, u8 n); u8 *StringAppendN(u8 *dest, const u8 *src, u8 n); u16 StringLength(const u8 *str); s32 StringCompare(const u8 *str1, const u8 *str2); s32 StringCompareN(const u8 *str1, const u8 *str2, u32 n); bool8 IsStringLengthAtLeast(const u8 *str, s32 n); u8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n); u8 *ConvertUIntToDecimalStringN(u8 *dest, u32 value, enum StringConvertMode mode, u8 n); u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n); u8 *StringExpandPlaceholders(u8 *dest, const u8 *src); u8 *StringBraille(u8 *dest, const u8 *src); u8 *GetExpandedPlaceholder(u32 id); u8 *StringFill(u8 *dest, u8 c, u16 n); u8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n); u8 *StringFillWithTerminator(u8 *dest, u16 n); u8 *StringCopyN_Multibyte(u8 *dest, const u8 *src, u32 n); u32 StringLength_Multibyte(const u8 *str); u8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color); bool32 IsStringJapanese(u8 *str); u8 GetExtCtrlCodeLength(u8 code); s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2); void ConvertInternationalString(u8 *s, u8 language); void StripExtCtrlCodes(u8 *str); #endif // GUARD_STRING_UTIL_H ================================================ FILE: include/strings.h ================================================ #ifndef GUARD_STRINGS_H #define GUARD_STRINGS_H #include "global.h" // Exported type declarations // Exported RAM declarations // Exported ROM declarations extern const u8 gText_FromSpace[]; extern const u8 gText_Lv50[]; extern const u8 gText_OpenLevel[]; extern const u8 gText_Mom[]; extern const u8 gText_Dad[]; extern const u8 gText_Cool[]; extern const u8 gText_Beauty[]; extern const u8 gText_Cute[]; extern const u8 gText_Smart[]; extern const u8 gText_Tough[]; extern const u8 gText_Single[]; extern const u8 gText_Double[]; extern const u8 gText_Spicy2[]; extern const u8 gText_Dry2[]; extern const u8 gText_Sweet2[]; extern const u8 gText_Bitter2[]; extern const u8 gText_Sour2[]; extern const u8 gText_Excellent[]; extern const u8 gText_VeryGood[]; extern const u8 gText_Good[]; extern const u8 gText_SoSo[]; extern const u8 gText_Bad[]; extern const u8 gText_TheWorst[]; extern const u8 gText_Slots[]; extern const u8 gText_Roulette[]; extern const u8 gText_Jackpot[]; extern const u8 gText_First[]; extern const u8 gText_Second[]; extern const u8 gText_Third[]; extern const u8 gText_NoDecorations[]; extern const u8 gText_NoDecorationsInUse[]; extern const u8 gText_Cancel[]; extern const u8 gText_Color161Shadow161[]; extern const u8 gText_GoBackPrevMenu[]; extern const u8 gText_CantPlaceInRoom[]; extern const u8 gText_NoMoreDecorations[]; extern const u8 gText_NoMoreDecorations2[]; extern const u8 gText_InUseAlready[]; extern const u8 gText_CancelDecorating[]; extern const u8 gText_PlaceItHere[]; extern const u8 gText_CantBePlacedHere[]; extern const u8 gText_DecorationReturnedToPC[]; extern const u8 gText_StopPuttingAwayDecorations[]; extern const u8 gText_ReturnDecorationToPC[]; extern const u8 gText_NoDecorationHere[]; extern const u8 gText_DecorationWillBeDiscarded[]; extern const u8 gText_CantThrowAwayInUse[]; extern const u8 gText_DecorationThrownAway[]; extern const u8 gText_Desk[]; extern const u8 gText_Chair[]; extern const u8 gText_Plant[]; extern const u8 gText_Ornament[]; extern const u8 gText_Mat[]; extern const u8 gText_Poster[]; extern const u8 gText_PutOutSelectedDecorItem[]; extern const u8 gText_StoreChosenDecorInPC[]; extern const u8 gText_ThrowAwayUnwantedDecors[]; extern const u8 gText_Doll[]; extern const u8 gText_Cushion[]; extern const u8 gText_Decorate[]; extern const u8 gText_PutAway[]; extern const u8 gText_Toss2[]; extern const u8 gText_Hoenn[]; extern const u8 gText_ApostropheSBase[]; extern const u8 gText_NoRegistry[]; extern const u8 gText_OkayToDeleteFromRegistry[]; extern const u8 gText_RegisteredDataDeleted[]; extern const u8 gText_Confirm3[]; extern const u8 gText_Cancel4[]; extern const u8 gText_IsThisTheCorrectTime[]; extern const u8 gText_PkmnFainted3[]; extern const u8 gText_Coins[]; extern const u8 gText_EggNickname[]; extern const u8 gText_MenuPokemon[]; extern const u8 gOtherText_Use[]; extern const u8 gOtherText_Toss[]; extern const u8 gOtherText_Give[]; extern const u8 gOtherText_Exit[]; extern const u8 gText_ThreeHyphens[]; extern const u8 gText_SevenHyphens[]; extern const u8 gText_NumberClear01[]; extern const u8 gText_TimesStrVar1[]; extern const u8 gText_IsSelected[]; extern const u8 gText_ThereIsNoPokemon[]; extern const u8 gText_ItemCantBeHeld[]; extern const u8 gText_TMCase[]; extern const u8 gText_Close[]; extern const u8 gText_TMCaseWillBePutAway[]; extern const u8 gText_FontSmall[]; extern const u8 gText_FontNormal[]; extern const u8 gText_OhNoICantBuyThat[]; extern const u8 gText_HowManyWouldYouLikeToSell[]; extern const u8 gText_ICanPayThisMuch_WouldThatBeOkay[]; extern const u8 gText_TurnedOverItemsWorthYen[]; extern const u8 gPokedudeText_TMTypes[]; extern const u8 gPokedudeText_ReadTMDescription[]; extern const u8 gFameCheckerText_Cancel[]; extern const u8 gText_SelectorArrow2[]; extern const u8 gFameCheckerText_FameCheckerWillBeClosed[]; extern const u8 gFameCheckerText_ClearTextbox[]; extern const u8 gFameCheckerText_MainScreenUI[]; // "{DPAD_ANY}PICK {DPAD_UPDOWN}SELECT {A_BUTTON}OK$" extern const u8 gFameCheckerText_PickScreenUI[]; // "{DPAD_ANY}PICK {DPAD_UPDOWN}SELECT {B_BUTTON}CANCEL$" extern const u8 gFameCheckerText_FlavorTextUI[]; // "{START_BUTTON}PICK {A_BUTTON}READ {B_BUTTON}CANCEL$" extern const u8 gFameCheckerOakName[]; // "OAK$" extern const u8 gFameCheckerDaisyName[]; // "DAISY$" extern const u8 gFameCheckerBillName[]; // "BILL$" extern const u8 gFameCheckerMrFujiName[]; // "FUJI$" // teachy_tv extern const u8 gTeachyTvString_TeachBattle[]; extern const u8 gTeachyTvString_StatusProblems[]; extern const u8 gTeachyTvString_TypeMatchups[]; extern const u8 gTeachyTvString_CatchPkmn[]; extern const u8 gTeachyTvString_AboutTMs[]; extern const u8 gTeachyTvString_RegisterItem[]; extern const u8 gTeachyTvString_Cancel[]; extern const u8 gTeachyTvText_PokedudeSaysHello[]; extern const u8 gTeachyTvText_BattleScript1[]; extern const u8 gTeachyTvText_StatusScript1[]; extern const u8 gTeachyTvText_MatchupsScript1[]; extern const u8 gTeachyTvText_CatchingScript1[]; extern const u8 gTeachyTvText_TMsScript1[]; extern const u8 gTeachyTvText_RegisterScript1[]; extern const u8 gTeachyTvText_BattleScript2[]; extern const u8 gTeachyTvText_StatusScript2[]; extern const u8 gTeachyTvText_MatchupsScript2[]; extern const u8 gTeachyTvText_CatchingScript2[]; extern const u8 gTeachyTvText_TMsScript2[]; extern const u8 gTeachyTvText_RegisterScript2[]; // help_system_812B1E0 extern const u8 gText_HelpSystemControls_A_Next[]; extern const u8 gText_HelpSystemControls_PickOkEnd[]; extern const u8 gText_HelpSystemControls_AorBtoCancel[]; extern const u8 gText_HelpSystemControls_PickOkCancel[]; // help_system extern const u8 gString_Bill[]; extern const u8 gString_Someone[]; extern const u8 gString_Help[]; extern const u8 gString_HelpSystem_ClearTo8[]; extern const u8 gText_Var1IsSelected[]; extern const u8 gOtherText_WhereShouldTheStrVar1BePlaced[]; extern const u8 gOtherText_Powder[]; extern const u8 gText_NoMoreRoomInBag[]; extern const u8 gText_WithdrawHowMany[]; extern const u8 gText_WithdrewQuantItem[]; extern const u8 gText_WithdrawItem[]; extern const u8 gText_Withdraw[]; extern const u8 gText_ReturnToPC[]; extern const u8 gText_OakForbidsUseOfItemHere[]; extern const u8 gText_CantDismountBike[]; extern const u8 gText_CoinCase[]; extern const u8 gText_PlayerUsedVar2[]; extern const u8 gText_RepelEffectsLingered[]; extern const u8 gText_UsedVar2WildLured[]; extern const u8 gText_UsedVar2WildRepelled[]; extern const u8 gText_BoxFull[]; extern const u8 gText_PowderQty[]; extern const u8 gText_PlayedPokeFluteCatchy[]; extern const u8 gText_PlayedPokeFlute[]; extern const u8 gText_PokeFluteAwakenedMon[]; extern const u8 gText_WontHaveEffect[]; extern const u8 gText_YesNo[]; extern const u8 gText_Berry[]; extern const u8 gText_Ghost[]; // pokemon extern const u8 gBattleText_Rose[]; extern const u8 gText_DefendersStatRose[]; extern const u8 gBattleText_GetPumped[]; extern const u8 gBattleText_MistShroud[]; extern const u8 gText_BadEgg[]; extern const u8 gText_PkmnsXPreventsSwitching[]; extern const u8 *const gStatNamesTable[]; // diploma extern const u8 gText_Diploma_Player[]; extern const u8 gText_Diploma_ThisDocument[]; extern const u8 gText_Diploma_GameFreak[]; extern const u8 gText_Diploma_National[]; extern const u8 gText_Diploma_Kanto[]; // battle_records extern const u8 gString_BattleRecords_PlayersBattleResults[]; extern const u8 gString_BattleRecords_TotalRecord[]; extern const u8 gString_BattleRecords_ColumnHeaders[]; extern const u8 gString_BattleRecords_7Dashes[]; extern const u8 gString_BattleRecords_4Dashes[]; // slot_machine extern const u8 gString_OutOfCoins[]; extern const u8 gString_QuitPlaying[]; extern const u8 gString_SlotMachineControls[]; // battle_controller_safari extern const u8 gText_EmptyString3[]; extern const u8 gText_SafariZoneMenu[]; extern const u8 gText_WhatWillPlayerThrow[]; // battle_controller_player extern const u8 gText_BattleSwitchWhich[]; extern const u8 gText_MoveInterfaceDynamicColors[]; extern const u8 gText_MoveInterfacePP[]; extern const u8 gText_MoveInterfaceType[]; extern const u8 gText_LinkStandby[]; extern const u8 gText_BattleMenu[]; extern const u8 gText_WhatWillPkmnDo[]; // battle_script_commands extern const u8 gText_BattleYesNoChoice[]; // battle_controller_oak_old_man extern const u8 gText_ForPetesSake[]; extern const u8 gText_TheTrainerThat[]; extern const u8 gText_TryBattling[]; extern const u8 gText_InflictingDamageIsKey[]; extern const u8 gText_LoweringStats[]; extern const u8 gText_KeepAnEyeOnHP[]; extern const u8 gText_OakNoRunningFromATrainer[]; extern const u8 gText_WinEarnsPrizeMoney[]; extern const u8 gText_HowDissapointing[]; extern const u8 gText_WhatWillOldManDo[]; // battle_controller_pokedude extern const u8 Pokedude_Text_SpeedierBattlerGoesFirst[]; extern const u8 Pokedude_Text_MyRattataFasterThanPidgey[]; extern const u8 Pokedude_Text_BattlersTakeTurnsAttacking[]; extern const u8 Pokedude_Text_MyRattataWonGetsEXP[]; extern const u8 Pokedude_Text_UhOhRattataPoisoned[]; extern const u8 Pokedude_Text_HealStatusRightAway[]; extern const u8 Pokedude_Text_UsingItemTakesTurn[]; extern const u8 Pokedude_Text_YayWeManagedToWin[]; extern const u8 Pokedude_Text_WaterNotVeryEffectiveAgainstGrass[]; extern const u8 Pokedude_Text_GrassEffectiveAgainstWater[]; extern const u8 Pokedude_Text_LetsTryShiftingMons[]; extern const u8 Pokedude_Text_ShiftingUsesTurn[]; extern const u8 Pokedude_Text_ButterfreeDoubleResistsGrass[]; extern const u8 Pokedude_Text_ButterfreeGoodAgainstOddish[]; extern const u8 Pokedude_Text_YeahWeWon[]; extern const u8 Pokedude_Text_WeakenMonBeforeCatching[]; extern const u8 Pokedude_Text_BestIfTargetStatused[]; extern const u8 Pokedude_Text_CantDoubleUpOnStatus[]; extern const u8 Pokedude_Text_LetMeThrowBall[]; extern const u8 Pokedude_Text_PickBestKindOfBall[]; // party_menu extern const u8 gText_ChoosePokemon[]; extern const u8 gText_ChoosePokemonCancel[]; extern const u8 gText_ChoosePokemonConfirm[]; extern const u8 gText_MoveToWhere[]; extern const u8 gText_TeachWhichPokemon[]; extern const u8 gText_UseOnWhichPokemon[]; extern const u8 gText_GiveToWhichPokemon[]; extern const u8 gText_NothingToCut[]; extern const u8 gText_CantSurfHere[]; extern const u8 gText_AlreadySurfing[]; extern const u8 gText_CurrentIsTooFast[]; extern const u8 gText_EnjoyCycling[]; extern const u8 gText_InUseAlready_PM[]; extern const u8 gText_CantUseHere[]; extern const u8 gText_NoPokemonForBattle[]; extern const u8 gText_ChoosePokemon2[]; extern const u8 gText_NotEnoughHp[]; extern const u8 gText_ThreePkmnAreNeeded[]; extern const u8 gText_TwoPokemonAreNeeded[]; extern const u8 gText_PokemonCantBeSame[]; extern const u8 gText_NoIdenticalHoldItems[]; extern const u8 gText_DoWhatWithPokemon[]; extern const u8 gText_RestoreWhichMove[]; extern const u8 gText_BoostPp[]; extern const u8 gText_DoWhatWithItem[]; extern const u8 gText_DoWhatWithMail[]; extern const u8 gText_NoUse[]; extern const u8 gText_Able[]; extern const u8 gText_First_PM[]; extern const u8 gText_Second_PM[]; extern const u8 gText_Third_PM[]; extern const u8 gText_NotAble[]; extern const u8 gText_Able3[]; extern const u8 gText_NotAble2[]; extern const u8 gText_Learned[]; extern const u8 gText_Able2[]; extern const u8 gText_CutATreeOrGrass[]; extern const u8 gText_FlyToAKnownTown[]; extern const u8 gText_TravelOnWater[]; extern const u8 gText_MoveHeavyBoulders[]; extern const u8 gText_LightUpDarkness[]; extern const u8 gText_ShatterACrackedRock[]; extern const u8 gText_ClimbAWaterfall[]; extern const u8 gText_EscapeFromHere[]; extern const u8 gText_LureWildPokemon[]; extern const u8 gText_ShareHp[]; extern const u8 gText_ReturnToAHealingSpot[]; extern const u8 gText_DiveUnderwater[]; extern const u8 gText_Summary5[]; extern const u8 gText_Switch2[]; extern const u8 gText_Item[]; extern const u8 gText_Take[]; extern const u8 gText_Mail[]; extern const u8 gText_Take2[]; extern const u8 gText_Read2[]; extern const u8 gText_Shift[]; extern const u8 gText_SendOut[]; extern const u8 gText_Enter[]; extern const u8 gText_NoEntry[]; extern const u8 gText_Store[]; extern const u8 gText_Trade4[]; extern const u8 gText_NotPkmnOtherTrainerWants[]; extern const u8 gText_ThatIsntAnEgg[]; extern const u8 gText_OtherTrainerCantAcceptPkmn[]; extern const u8 gText_CantTradeWithTrainer[]; extern const u8 gText_CancelBattle[]; extern const u8 gText_PkmnWasGivenItem[]; extern const u8 gText_ReceivedItemFromPkmn[]; extern const u8 gText_PkmnAlreadyHoldingItemSwitch[]; extern const u8 gText_SwitchedPkmnItem[]; extern const u8 gText_BagFullCouldNotRemoveItem[]; extern const u8 gText_PkmnCantParticipate[]; extern const u8 gText_CancelParticipation[]; extern const u8 gText_OakThisIsListOfPokemon[]; extern const u8 gText_PartyMenu_OK[]; extern const u8 gText_MaleSymbol[]; extern const u8 gText_FemaleSymbol[]; extern const u8 gText_Slash[]; extern const u8 gText_OakImportantToGetToKnowPokemonThroughly[]; extern const u8 gText_PkmnNotHolding[]; extern const u8 gText_PCMailboxFull[]; extern const u8 gText_MailSentToPC[]; extern const u8 gText_MailMessageWillBeLost[]; extern const u8 gText_SendMailToPC[]; extern const u8 gText_MailTakenFromPkmn[]; extern const u8 gText_NoMoreThanTwoMayEnter[]; extern const u8 gText_NoMoreThanThreeMayEnter[]; extern const u8 gText_PauseUntilPress[]; extern const u8 gText_CantUseUntilNewBadge[]; extern const u8 gText_CantUseUntilNewHM[]; extern const u8 gText_ReturnToHealingSpot[]; extern const u8 gText_EscapeFromHereAndReturnTo[]; extern const u8 gText_PkmnCuredOfPoison[]; extern const u8 gText_PkmnWokeUp2[]; extern const u8 gText_PkmnBurnHealed[]; extern const u8 gText_PkmnThawedOut[]; extern const u8 gText_PkmnCuredOfParalysis[]; extern const u8 gText_PkmnSnappedOutOfConfusion[]; extern const u8 gText_PkmnGotOverInfatuation[]; extern const u8 gText_PkmnBecameHealthy[]; extern const u8 gText_ItemEffect_HP[]; extern const u8 gText_ItemEffect_Attack[]; extern const u8 gText_ItemEffect_Defense[]; extern const u8 gText_ItemEffect_Speed[]; extern const u8 gText_ItemEffect_SpAtk[]; extern const u8 gText_ItemEffect_SpDef[]; extern const u8 gText_PkmnBaseVar2StatIncreased[]; extern const u8 gText_MovesPPIncreased[]; extern const u8 gText_PPWasRestored[]; extern const u8 gText_PkmnHPRestoredByVar2[]; extern const u8 gText_PkmnNeedsToReplaceMove[]; extern const u8 gText_PkmnCantLearnMove[]; extern const u8 gText_PkmnAlreadyKnows[]; extern const u8 gText_PkmnLearnedMove3[]; extern const u8 gText_WhichMoveToForget[]; extern const u8 gText_12PoofForgotMove[]; extern const u8 gText_StopLearningMove2[]; extern const u8 gText_MoveNotLearned[]; extern const u8 gText_PkmnElevatedToLvVar2[]; extern const u8 gText_PkmnHoldingItemCantHoldMail[]; extern const u8 gText_MailTransferredFromMailbox[]; extern const u8 gText_RemoveMailBeforeItem[]; extern const u8 gText_CantSwitchWithAlly[]; extern const u8 gText_PkmnHasNoEnergy[]; extern const u8 gText_PkmnAlreadyInBattle[]; extern const u8 gText_EggCantBattle[]; extern const u8 gText_PkmnAlreadySelected[]; extern const u8 gText_PkmnCantSwitchOut[]; // credits extern const u8 gString_Dummy[]; extern const u8 gString_PokemonFireRed_Staff[]; // FR extern const u8 gString_PokemonLeafGreen_Staff[]; // LG extern const u8 gCreditsString_Director[]; extern const u8 gCreditsString_Junichi_Masuda[]; extern const u8 gCreditsString_Art_Director_Battle_Director[]; extern const u8 gCreditsString_Ken_Sugimori_Shigeki_Morimoto[]; extern const u8 gCreditsString_Program_Leader_Planning_Leader_Graphic_Design_Leader[]; extern const u8 gCreditsString_Tetsuya_Watanabe_Koji_Nishino_Takao_Unno[]; extern const u8 gCreditsString_Programmers[]; extern const u8 gCreditsString_Hiroyuki_Nakamura_Masao_Taya_Satoshi_Nohara_Miyuki_Iwasawa_Daisuke_Goto[]; extern const u8 gCreditsString_System_Programmers[]; extern const u8 gCreditsString_Tetsuya_Watanabe_Akito_Mori_Hisashi_Sogabe_Sousuke_Tamada[]; extern const u8 gCreditsString_Graphic_Designers[]; extern const u8 gCreditsString_Takao_Unno_Asuka_Iwashita_Kanako_Eo_Hiroki_Fuchino[]; extern const u8 gCreditsString_Graphic_Designers_2[]; extern const u8 gCreditsString_Ken_Sugimori_Hironobu_Yoshida[]; extern const u8 gCreditsString_Music_Composition[]; extern const u8 gCreditsString_Go_Ichinose_Junichi_Masuda[]; extern const u8 gCreditsString_Sound_Effects[]; extern const u8 gCreditsString_Go_Ichinose[]; extern const u8 gCreditsString_Game_Designers[]; extern const u8 gCreditsString_Junichi_Masuda_Koji_Nishino_Tetsuji_Ohta[]; extern const u8 gCreditsString_Game_Designers_2[]; extern const u8 gCreditsString_Hitomi_Sato_Shigeru_Ohmori_Tadashi_Takahashi[]; extern const u8 gCreditsString_Game_Scenario[]; extern const u8 gCreditsString_Hitomi_Sato_Satoshi_Tajiri[]; extern const u8 gCreditsString_Script_Designer_Map_Designer[]; extern const u8 gCreditsString_Satoshi_Nohara_Shigeru_Ohmori[]; extern const u8 gCreditsString_Parametric_Designers[]; extern const u8 gCreditsString_Koji_Nishino_Tetsuji_Ohta_Shigeki_Morimoto[]; extern const u8 gCreditsString_POKeDEX_Text[]; extern const u8 gCreditsString_Kenji_Matsushima[]; extern const u8 gCreditsString_POKeMON_Designers[]; extern const u8 gCreditsString_Ken_Sugimori_Motofumi_Fujiwara_Shigeki_Morimoto_Hironobu_Yoshida[]; extern const u8 gCreditsString_POKeMON_Designers_2[]; extern const u8 gCreditsString_Satoshi_Ohta_Asuka_Iwashita_Takao_Unno_Kanako_Eo_Aimi_Tomita[]; extern const u8 gCreditsString_POKeMON_Designers_3[]; extern const u8 gCreditsString_Atsuko_Nishida_Muneo_Saito_Rena_Yoshikawa_Jun_Okutani[]; extern const u8 gCreditsString_Supporting_Programmers[]; extern const u8 gCreditsString_Teruyuki_Yoshioka_Takao_Nakano_Satoshi_Mitsuhara_Daisuke_Hoshino[]; extern const u8 gCreditsString_NCL_Product_Testing[]; extern const u8 gCreditsString_NCL_Super_Mario_Club[]; extern const u8 gCreditsString_Special_Thanks[]; extern const u8 gCreditsString_Hiro_Nakamura_Hiroyuki_Uesugi_Teruki_Murakawa_Kazuya_Suyama[]; extern const u8 gCreditsString_Special_Thanks_2[]; extern const u8 gCreditsString_Kenji_Tominaga_Kenjiro_Ito_Tomotaka_Komura_Michiko_Takizawa[]; extern const u8 gCreditsString_Special_Thanks_3[]; extern const u8 gCreditsString_Makiko_Takada_Mikiko_Ohashi_Shusaku_Egami_Takanao_Kondo_Rui_Kawaguchi[]; extern const u8 gCreditsString_Braille_Code_Check[]; extern const u8 gCreditsString_Japan_Braille_Library[]; extern const u8 gCreditsString_Information_Supervisors[]; extern const u8 gCreditsString_Hiroki_Enomoto_Kazuyuki_Terada_Yuri_Sakurai_Yumi_Funasaka_Naoko_Yanase[]; extern const u8 gCreditsString_Coordinators[]; extern const u8 gCreditsString_Azusa_Tajima_Akira_Kinashi_Kazuki_Yoshihara_Retsuji_Nomoto[]; extern const u8 gCreditsString_Task_Managers[]; extern const u8 gCreditsString_Hitoshi_Yamagami_Gakuji_Nomoto[]; extern const u8 gCreditsString_Producers[]; extern const u8 gCreditsString_Hiroyuki_Jinnai_Takehiro_Izushi_Hiroaki_Tsuru[]; extern const u8 gCreditsString_Executive_Director[]; extern const u8 gCreditsString_Satoshi_Tajiri[]; extern const u8 gCreditsString_Executive_Producer[]; extern const u8 gCreditsString_Satoru_Iwata[]; extern const u8 gCreditsString_Executive_Producer_2[]; extern const u8 gCreditsString_Tsunekaz_Ishihara[]; extern const u8 gCreditsString_English_Version_Coordinators[]; extern const u8 gCreditsString_Hiro_Nakamura_Seth_McMahill[]; extern const u8 gCreditsString_Translator_Text_Editor[]; extern const u8 gCreditsString_Nob_Ogasawara_Teresa_Lillygren[]; extern const u8 gCreditsString_Programmers_2[]; extern const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Yuichiro_Ito_Akira_Kinashi[]; extern const u8 gCreditsString_Environment_Tool_Programmers[]; extern const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Kimiko_Nakamichi[]; extern const u8 gCreditsString_NOA_Product_Testing[]; extern const u8 gCreditsString_Thomas_Hertzog_Kathy_Huguenard_Mika_Kurosawa[]; extern const u8 gCreditsString_Braille_Code_Check_2[]; extern const u8 gCreditsString_National_Federation_of_the_Blind_Patricia_A_Maurer_Japan_Braille_Library_European_Blind_Union[]; extern const u8 gCreditsString_Braille_Code_Check_3[]; extern const u8 gCreditsString_National_Information_Library_Service_Margaret_Campion[]; extern const u8 gCreditsString_Special_Thanks_4[]; extern const u8 gCreditsString_Takehiro_Izushi_Motoyasu_Tojima_Hitoshi_Yamagami_Hiroyuki_Uesugi[]; extern const u8 gCreditsString_Special_Thanks_5[]; extern const u8 gCreditsString_Nicola_Pratt_Barlow_Shellie_Dow_Anthony_Howitt_Naoko_Saeki_Kyoko_Onishi[]; extern const u8 gCreditsString_Braille_Code_Check_4[]; extern const u8 gCreditsString_The_Royal_New_Zealand_Foundation_of_the_Blind_Greg_Moran[]; extern const u8 gCreditsString_Graphic_Designer[]; extern const u8 gCreditsString_Akira_Kinashi[]; // berry_pouch extern const u8 gText_TheStrVar1CantBeHeldHere[]; extern const u8 gText_TossOutHowManyStrVar1s[]; extern const u8 gText_ThrewAwayStrVar2StrVar1s[]; extern const u8 gText_ThrowAwayStrVar2OfThisItemQM[]; extern const u8 gText_BerryPouch[]; extern const u8 gText_TheBerryPouchWillBePutAway[]; // itemfinder extern const u8 gText_ItemfinderResponding[]; extern const u8 gText_ItemfinderShakingWildly[]; extern const u8 gText_NopeTheresNoResponse[]; // link extern const u8 gText_CommErrorEllipsis[]; extern const u8 gText_MoveCloserToLinkPartner[]; extern const u8 gText_CommErrorCheckConnections[]; extern const u8 gText_ABtnTitleScreen[]; extern const u8 gText_ABtnRegistrationCounter[]; // main_menu extern const u8 gText_SaveFileCorrupted[]; extern const u8 gText_SaveFileHasBeenDeleted[]; extern const u8 gText_1MSubCircuitBoardNotInstalled[]; extern const u8 gText_NewGame[]; extern const u8 gText_Continue[]; extern const u8 gText_MysteryGift[]; extern const u8 gText_WirelessNotConnected[]; extern const u8 gText_MysteryGiftCantUse[]; extern const u8 gText_Player[]; extern const u8 gText_Time[]; extern const u8 gText_Colon[]; extern const u8 gText_Pokedex[]; extern const u8 gTextJPDummy_Hiki[]; extern const u8 gText_Badges[]; extern const u8 gTextJPDummy_Ko[]; extern const u8 gText_Register[]; // mystery_gift_menu extern const u8 gText_PickOKExit[]; extern const u8 gText_PickOKCancel[]; extern const u8 gText_MysteryGift2[]; extern const u8 gJPText_MysteryGift[]; extern const u8 gJPText_DecideStop[]; extern const u8 gText_WhatToDoWithCards[]; extern const u8 gText_WhatToDoWithNews[]; extern const u8 gText_OkayToDiscardNews[]; extern const u8 gText_IfThrowAwayCardEventWontHappen[]; extern const u8 gText_WonderCardThrownAway[]; extern const u8 gText_WonderNewsThrownAway[]; extern const u8 gText_DataWillBeSaved[]; extern const u8 gText_SaveCompletedPressA[]; extern const u8 gText_WonderCards[]; extern const u8 gText_WonderNews[]; extern const u8 gText_Exit3[]; extern const u8 gText_WirelessCommunication[]; extern const u8 gText_Friend2[]; extern const u8 gText_Receive[]; extern const u8 gText_Send[]; extern const u8 gText_Toss[]; extern const u8 gText_VarietyOfEventsImportedWireless[]; extern const u8 gText_WonderCardsInPossession[]; extern const u8 gText_ReadNewsThatArrived[]; extern const u8 gText_ReturnToTitle[]; extern const u8 gText_NothingSentOver[]; extern const u8 gText_RecordUploadedViaWireless[]; extern const u8 gText_WonderCardReceived[]; extern const u8 gText_WonderCardReceivedFrom[]; extern const u8 gText_WonderNewsReceived[]; extern const u8 gText_WonderNewsReceivedFrom[]; extern const u8 gText_NewStampReceived[]; extern const u8 gText_AlreadyHadCard[]; extern const u8 gText_AlreadyHadStamp[]; extern const u8 gText_AlreadyHadNews[]; extern const u8 gText_NoMoreRoomForStamps[]; extern const u8 gText_CommunicationCanceled[]; extern const u8 gText_CantAcceptCardFromTrainer[]; extern const u8 gText_CantAcceptNewsFromTrainer[]; extern const u8 gText_CommunicationError[]; extern const u8 gText_NewTrainerReceived[]; extern const u8 gText_WonderCardSentTo[]; extern const u8 gText_WonderNewsSentTo[]; extern const u8 gText_StampSentTo[]; extern const u8 gText_OtherTrainerHasCard[]; extern const u8 gText_OtherTrainerHasStamp[]; extern const u8 gText_OtherTrainerHasNews[]; extern const u8 gText_OtherTrainerCanceled[]; extern const u8 gText_GiftSentTo[]; extern const u8 gText_CantSendGiftToTrainer[]; extern const u8 gText_DontHaveCardNewOneInput[]; extern const u8 gText_DontHaveNewsNewOneInput[]; extern const u8 gText_WhereShouldCardBeAccessed[]; extern const u8 gText_WhereShouldNewsBeAccessed[]; extern const u8 gText_Communicating[]; extern const u8 gText_ThrowAwayWonderCard[]; extern const u8 gText_HaventReceivedCardsGift[]; extern const u8 gText_CommunicationCompleted[]; extern const u8 gText_HaventReceivedGiftOkayToDiscard[]; extern const u8 gText_SendingWonderCard[]; extern const u8 gText_SendingWonderNews[]; // Dodrio Berry Picking extern const u8 gText_BerryPickingRecords[]; extern const u8 gText_BerriesPicked[]; extern const u8 gText_BerriesInRowFivePlayers[]; extern const u8 gText_BestScore[]; extern const u8 gText_1Colon[]; extern const u8 gText_2Colon[]; extern const u8 gText_3Colon[]; extern const u8 gText_4Colon[]; extern const u8 gText_5Colon[]; extern const u8 gText_SpacePoints[]; extern const u8 gText_10P30P50P50P[]; extern const u8 gText_AnnouncingPrizes[]; extern const u8 gText_AnnouncingRankings[]; extern const u8 gText_FirstPlacePrize[]; extern const u8 gText_CantHoldAnyMore[]; extern const u8 gText_FilledStorageSpace[]; extern const u8 gText_BerryPickingResults[]; extern const u8 gText_WantToPlayAgain[]; extern const u8 gText_CommunicationStandby3[]; extern const u8 gText_SomeoneDroppedOut[]; // player_pc extern const u8 gText_WhatWouldYouLikeToDo[]; extern const u8 gText_TakeOutItemsFromThePC[]; extern const u8 gText_StoreItemsInThePC[]; extern const u8 gText_GoBackToThePreviousMenu[]; extern const u8 gText_ItemStorage[]; extern const u8 gText_Mailbox[]; extern const u8 gText_TurnOff[]; extern const u8 gText_WithdrawItem2[]; extern const u8 gText_DepositItem2[]; extern const u8 gOtherText_Read[]; extern const u8 gOtherText_MoveToBag[]; extern const u8 gOtherText_Give2[]; extern const u8 gText_TheresNoMailHere[]; extern const u8 gText_ThereAreNoItems[]; extern const u8 gText_WhatWouldYouLikeToDoWithPlayersMail[]; extern const u8 gText_MessageWillBeLost[]; extern const u8 gText_BagIsFull[]; extern const u8 gText_MailReturnedToBagMessageErased[]; // start_menu extern const u8 gText_MenuPokedex[]; extern const u8 gText_MenuBag[]; extern const u8 gText_MenuPlayer[]; extern const u8 gText_MenuSave[]; extern const u8 gText_MenuOption[]; extern const u8 gText_MenuExit[]; extern const u8 gText_MenuRetire[]; extern const u8 gText_MenuSafariStats[]; extern const u8 gStartMenuDesc_Pokedex[]; extern const u8 gStartMenuDesc_Pokemon[]; extern const u8 gStartMenuDesc_Bag[]; extern const u8 gStartMenuDesc_Save[]; extern const u8 gStartMenuDesc_Option[]; extern const u8 gStartMenuDesc_Exit[]; extern const u8 gStartMenuDesc_Retire[]; extern const u8 gStartMenuDesc_Player[]; extern const u8 gText_SaveError_PleaseExchangeBackupMemory[]; extern const u8 gText_SavingDontTurnOffThePower2[]; extern const u8 gSaveStatName_Player[]; extern const u8 gSaveStatName_Badges[]; extern const u8 gSaveStatName_Pokedex[]; extern const u8 gSaveStatName_Time[]; // mail extern const u8 gText_From[]; // field_specials extern const u8 gText_BigGuy[]; extern const u8 gText_BigGirl[]; extern const u8 gText_Son[]; extern const u8 gText_Daughter[]; extern const u8 gText_NowOn[]; extern const u8 gText_B4F[]; extern const u8 gText_B3F[]; extern const u8 gText_B2F[]; extern const u8 gText_B1F[]; extern const u8 gText_1F[]; extern const u8 gText_2F[]; extern const u8 gText_3F[]; extern const u8 gText_4F[]; extern const u8 gText_5F[]; extern const u8 gText_6F[]; extern const u8 gText_7F[]; extern const u8 gText_8F[]; extern const u8 gText_9F[]; extern const u8 gText_10F[]; extern const u8 gText_11F[]; extern const u8 gText_Rooftop[]; extern const u8 gText_BoulderBadge[]; extern const u8 gText_CascadeBadge[]; extern const u8 gText_ThunderBadge[]; extern const u8 gText_RainbowBadge[]; extern const u8 gText_SoulBadge[]; extern const u8 gText_MarshBadge[]; extern const u8 gText_VolcanoBadge[]; extern const u8 gText_EarthBadge[]; extern const u8 gText_LinkedGamePlay[]; extern const u8 gText_DirectCorner[]; extern const u8 gText_UnionRoom[]; extern const u8 gOtherText_Quit[]; extern const u8 gText_Energypowder_50[]; extern const u8 gText_EnergyRoot_80[]; extern const u8 gText_HealPowder_50[]; extern const u8 gText_RevivalHerb_300[]; extern const u8 gText_Protein_1000[]; extern const u8 gText_Iron_1000[]; extern const u8 gText_Carbos_1000[]; extern const u8 gText_Calcium_1000[]; extern const u8 gText_Zinc_1000[]; extern const u8 gText_HpUp_1000[]; extern const u8 gText_PpUp_3000[]; // script_menu extern const u8 Text_AccessWhichPC[]; extern const u8 gText_SomeoneSPc[]; extern const u8 gText_BillSPc[]; extern const u8 gText_SPc[]; extern const u8 gText_HallOfFame_2[]; extern const u8 gText_LogOff[]; extern const u8 gText_ProfOakSPc[]; extern const u8 gText_Other[]; extern const u8 gOtherText_Double[]; extern const u8 gOtherText_Knockout[]; extern const u8 gOtherText_Mixed[]; extern const u8 gOtherText_Single[]; extern const u8 gText_Info[]; extern const u8 gText_Eggs[]; extern const u8 gText_HallOfFame[]; extern const u8 gText_Victories[]; extern const u8 gText_Quit[]; extern const u8 gText_Psn[]; extern const u8 gText_Par[]; extern const u8 gText_Slp[]; extern const u8 gText_Brn[]; extern const u8 gText_Frz[]; extern const u8 gText_Yes[]; extern const u8 gText_No[]; extern const u8 gText_SingleBattle[]; extern const u8 gText_DoubleBattle[]; extern const u8 gText_MultiBattle[]; extern const u8 gText_MakeAChallenge[]; extern const u8 gText_Lv50[]; extern const u8 gText_Lv100[]; extern const u8 gText_OpenLv[]; extern const u8 gText_Info_2[]; extern const u8 gOtherText_BattleTowerResults[]; extern const u8 gOtherText_Current[]; extern const u8 gOtherText_Prev[]; extern const u8 gOtherText_Record[]; extern const u8 gOtherText_WinStreak[]; extern const u8 gText_FreshWater_200[]; extern const u8 gText_SodaPop_300[]; extern const u8 gText_Lemonade_350[]; extern const u8 gText_50Coins_1000[]; extern const u8 gText_500Coins_10000[]; extern const u8 gText_1000Coins_20000[]; extern const u8 gText_Excellent[]; extern const u8 gText_NotSoBad[]; extern const u8 gText_RedShard[]; extern const u8 gText_YellowShard[]; extern const u8 gText_BlueShard[]; extern const u8 gText_GreenShard[]; extern const u8 gText_Right[]; extern const u8 gText_Left[]; extern const u8 gText_Tm13_4000Coins[]; extern const u8 gText_Tm23_3500Coins[]; extern const u8 gText_Tm24_4000Coins[]; extern const u8 gText_Tm30_4500Coins[]; extern const u8 gText_Tm35_4000Coins[]; extern const u8 gText_1F_2[]; extern const u8 gText_2F_2[]; extern const u8 gText_3F_2[]; extern const u8 gText_4F_2[]; extern const u8 gText_5F_2[]; extern const u8 gText_Normal[]; extern const u8 gText_Black[]; extern const u8 gText_Pink[]; extern const u8 gText_Sepia[]; extern const u8 gText_Eevee[]; extern const u8 gText_Flareon[]; extern const u8 gText_Jolteon[]; extern const u8 gText_Vaporeon[]; extern const u8 gText_QuitLooking[]; extern const u8 gText_FreshWater[]; extern const u8 gText_SodaPop[]; extern const u8 gText_Lemonade[]; extern const u8 gText_Bicycle_Price[]; extern const u8 gText_NoThanks[]; extern const u8 gText_Abra_180Coins[]; extern const u8 gText_Clefairy_500Coins[]; extern const u8 gText_Dratini_2800Coins[]; extern const u8 gText_Scyther_5500Coins[]; extern const u8 gText_Porygon_9999Coins[]; extern const u8 gText_Abra_120Coins[]; extern const u8 gText_Clefairy_750Coins[]; extern const u8 gText_Pinsir_2500Coins[]; extern const u8 gText_Dratini_4600Coins[]; extern const u8 gText_Porygon_6500Coins[]; extern const u8 gText_NoThanks_2[]; extern const u8 gText_HelixFossil[]; extern const u8 gText_DomeFossil[]; extern const u8 gText_OldAmber[]; extern const u8 gText_TradeCenter[]; extern const u8 gText_Colosseum[]; extern const u8 gText_GameLinkCable[]; extern const u8 gText_Wireless[]; extern const u8 gText_OneIsland[]; extern const u8 gText_TwoIsland[]; extern const u8 gText_ThreeIsland[]; extern const u8 gText_Vermilion[]; extern const u8 gText_Colosseum_2[]; extern const u8 gText_BerryCrush[]; extern const u8 gText_EmptyLinkService1[]; extern const u8 gText_EmptyLinkService2[]; extern const u8 gText_RecordCorner[]; extern const u8 gText_PokemonJump[]; extern const u8 gText_DodrioBerryPicking[]; extern const u8 gText_2Tinymushrooms[]; extern const u8 gText_1BigMushroom[]; extern const u8 gText_SeviiIslands[]; extern const u8 gText_NavelRock[]; extern const u8 gText_FarawayIsland[]; extern const u8 gText_BirthIsland[]; extern const u8 gText_SouthernIsland[]; extern const u8 gText_MiracleSeed_1000Coins[]; extern const u8 gText_Charcoal_1000Coins[]; extern const u8 gText_MysticWater_1000Coins[]; extern const u8 gText_YellowFlute_1600Coins[]; extern const u8 gText_SmokeBall_800Coins[]; extern const u8 gText_BecomeLeader[]; extern const u8 gText_JoinGroup[]; extern const u8 gText_Cool_2[]; extern const u8 gText_Beauty_2[]; extern const u8 gText_Cute_2[]; extern const u8 gText_Smart_2[]; extern const u8 gText_Tough_2[]; extern const u8 gText_Items[]; extern const u8 gText_KeyItems[]; extern const u8 gText_PokeBalls[]; extern const u8 gText_TMsAndHMs[]; extern const u8 gText_Berries[]; extern const u8 gText_Boulderbadge[]; extern const u8 gText_Cascadebadge[]; extern const u8 gText_Thunderbadge[]; extern const u8 gText_Rainbowbadge[]; extern const u8 gText_Soulbadge[]; extern const u8 gText_Marshbadge[]; extern const u8 gText_Volcanobadge[]; extern const u8 gText_Earthbadge[]; extern const u8 gText_Coins_2[]; extern const u8 gText_ItemsPocket[]; extern const u8 gText_KeyItemsPocket[]; extern const u8 gText_PokeBallsPocket[]; extern const u8 gText_TmCase[]; extern const u8 gText_BerryPouch_2[]; extern const u8 gText_FourIsland[]; extern const u8 gText_FiveIsland[]; extern const u8 gText_SixIsland[]; extern const u8 gText_SevenIsland[]; // trade extern const u8 gText_IsThisTradeOkay[]; extern const u8 gText_XWillBeSentToY[]; extern const u8 gText_ByeByeVar1[]; extern const u8 gText_XSentOverY[]; extern const u8 gText_TakeGoodCareOfX[]; extern const u8 gText_CommunicationStandby5[]; extern const u8 gTradeText_Cancel[]; extern const u8 gTradeText_ChooseAPokemon[]; extern const u8 gTradeText_Summary[]; extern const u8 gTradeText_Trade[]; extern const u8 gText_CancelTrade[]; extern const u8 gTradeText_PressBButtonToExit[]; extern const u8 gText_TradeAction_Summary[]; extern const u8 gText_TradeAction_Trade[]; extern const u8 gText_Trade_CommunicationStandby[]; extern const u8 gText_TradeHasBeenCanceled[]; extern const u8 gText_Trade_OnlyPkmnForBattle[]; extern const u8 gText_OnlyPkmnForBattle[]; extern const u8 gText_WaitingForFriendToFinish[]; extern const u8 gText_FriendWantsToTrade[]; extern const u8 gText_PkmnCantBeTradedNow[]; extern const u8 gText_EggCantBeTradedNow[]; extern const u8 gText_OtherTrainersPkmnCantBeTraded[]; extern const u8 gText_4Qmark[]; extern const u8 gEasyChatGroupName_Pokemon[]; extern const u8 gEasyChatGroupName_Trainer[]; extern const u8 gEasyChatGroupName_Status[]; extern const u8 gEasyChatGroupName_Battle[]; extern const u8 gEasyChatGroupName_Greetings[]; extern const u8 gEasyChatGroupName_People[]; extern const u8 gEasyChatGroupName_Voices[]; extern const u8 gEasyChatGroupName_Speech[]; extern const u8 gEasyChatGroupName_Endings[]; extern const u8 gEasyChatGroupName_Feelings[]; extern const u8 gEasyChatGroupName_Conditions[]; extern const u8 gEasyChatGroupName_Actions[]; extern const u8 gEasyChatGroupName_Lifestyle[]; extern const u8 gEasyChatGroupName_Hobbies[]; extern const u8 gEasyChatGroupName_Time[]; extern const u8 gEasyChatGroupName_Misc[]; extern const u8 gEasyChatGroupName_Adjectives[]; extern const u8 gEasyChatGroupName_Events[]; extern const u8 gEasyChatGroupName_Move1[]; extern const u8 gEasyChatGroupName_Move2[]; extern const u8 gEasyChatGroupName_TrendySaying[]; extern const u8 gEasyChatGroupName_Pokemon2[]; extern const u8 gText_ThreeQuestionMarks[]; // hall_of_fame extern const u8 gText_LeagueChamp[]; extern const u8 gText_HOFNumber[]; extern const u8 gText_UPDOWNPick_ABUTTONBBUTTONCancel[]; extern const u8 gText_UPDOWNPick_ABUTTONNext_BBUTTONBack[]; extern const u8 gText_ABUTTONExit[]; extern const u8 gText_HOFCorrupted[]; extern const u8 gText_WelcomeToHOF[]; extern const u8 gText_Number[]; extern const u8 gText_Level[]; extern const u8 gText_IDNumber[]; extern const u8 gText_Name[]; extern const u8 gText_MainMenuTime[]; // learn_move extern const u8 gText_TeachWhichMoveToMon[]; extern const u8 gText_MonLearnedMove[]; extern const u8 gText_MonIsTryingToLearnMove[]; extern const u8 gText_StopLearningMove[]; extern const u8 gText_1_2_and_Poof[]; extern const u8 gText_MonForgotOldMoveAndMonLearnedNewMove[]; extern const u8 gText_WhichMoveShouldBeForgotten[]; extern const u8 gText_TeachMoveQues[]; extern const u8 gText_GiveUpTryingToTeachNewMove[]; // pokemon_size_record extern const u8 gText_DecimalPoint[]; // map_name_popup extern const u8 gText_Rooftop2[]; // option menu extern const u8 gText_TextSpeed[]; extern const u8 gText_BattleScene[]; extern const u8 gText_BattleStyle[]; extern const u8 gText_Sound[]; extern const u8 gText_ButtonMode[]; extern const u8 gText_Frame[]; extern const u8 gText_OptionMenuCancel[]; extern const u8 gText_OptionMenuSaveAndExit[]; extern const u8 gText_OptionMenuBattleAnimSpeed[]; extern const u8 gText_BattleTransitions[]; extern const u8 gText_BattleIntroAnimation[]; extern const u8 gText_MoveAnims[]; extern const u8 gText_HpBarAnimSpeed[]; extern const u8 gText_ExpBarAnimSpeed[]; extern const u8 gText_Back[]; extern const u8 gText_Advanced[]; extern const u8 gText_TextSpeedSlow[]; extern const u8 gText_TextSpeedMid[]; extern const u8 gText_TextSpeedFast[]; extern const u8 gText_TextSpeedFaster[]; extern const u8 gText_BattleScenePressA[]; extern const u8 gText_BattleSceneOn[]; extern const u8 gText_BattleSceneOff[]; extern const u8 gText_BattleStylePredict[]; extern const u8 gText_BattleStyleShift[]; extern const u8 gText_BattleStyleSet[]; extern const u8 gText_SoundMono[]; extern const u8 gText_SoundStereo[]; extern const u8 gText_ButtonTypeHelp[]; extern const u8 gText_ButtonTypeLR[]; extern const u8 gText_ButtonTypeLEqualsA[]; extern const u8 gText_Option[]; extern const u8 gText_FrameType[]; extern const u8 gTextJP_Type[]; extern const u8 gText_PickSwitchCancelA[]; extern const u8 gText_PickSwitchCancel[]; extern const u8 gText_PickSwitchExit[]; extern const u8 gText_PickSwitchBack[]; extern const u8 gText_TextSpeedInstant[]; // evolution_scene extern const u8 gText_PkmnIsEvolving[]; extern const u8 gText_CongratsPkmnEvolved[]; extern const u8 gText_EllipsisQuestionMark[]; extern const u8 gText_PkmnStoppedEvolving[]; // shop extern const u8 gText_ShopBuy[]; extern const u8 gText_ShopSell[]; extern const u8 gText_ShopQuit[]; extern const u8 gText_AnythingElseICanHelp[]; extern const u8 gText_QuitShopping[]; extern const u8 gText_PokedollarVar1[]; extern const u8 gText_YouDontHaveMoney[]; extern const u8 gText_Var1CertainlyHowMany[]; extern const u8 gText_InBagVar1[]; extern const u8 gText_Var1AndYouWantedVar2[]; extern const u8 gText_HereYouGoThankYou[]; extern const u8 gText_NoMoreRoomForThis[]; // pokedex_screen extern const u8 gText_PokedexTableOfContents[]; extern const u8 gText_PickOK[]; extern const u8 gText_Seen[]; extern const u8 gText_Owned[]; extern const u8 gText_Kanto[]; extern const u8 gText_National[]; extern const u8 gText_PokemonListNoColor[]; extern const u8 gText_SearchNoColor[]; extern const u8 gText_5Dashes[]; extern const u8 gText_PickFlipPageCheckCancel[]; extern const u8 gText_PokedexNo[]; extern const u8 gText_Page[]; extern const u8 gText_DexCategory_GrasslandPkmn[]; extern const u8 gText_DexCategory_ForestPkmn[]; extern const u8 gText_DexCategory_WatersEdgePkmn[]; extern const u8 gText_DexCategory_SeaPkmn[]; extern const u8 gText_DexCategory_CavePkmn[]; extern const u8 gText_DexCategory_MountainPkmn[]; extern const u8 gText_DexCategory_RoughTerrainPkmn[]; extern const u8 gText_DexCategory_UrbanPkmn[]; extern const u8 gText_DexCategory_RarePkmn[]; extern const u8 gText_PokemonList[]; extern const u8 gText_NumericalMode[]; extern const u8 gText_PokemonHabitats[]; extern const u8 gText_Search[]; extern const u8 gText_AToZMode[]; extern const u8 gText_TypeMode[]; extern const u8 gText_LightestMode[]; extern const u8 gText_SmallestMode[]; extern const u8 gText_PokedexOther[]; extern const u8 gText_ClosePokedex[]; extern const u8 gText_NumericalModeKanto[]; extern const u8 gText_NumericalModeNational[]; extern const u8 gText_PokedexPokemon[]; extern const u8 gText_HT[]; extern const u8 gText_WT[]; extern const u8 gText_Lbs[]; extern const u8 gText_Cry[]; extern const u8 gText_NextDataCancel[]; extern const u8 gText_Next[]; extern const u8 gText_CancelPreviousData[]; extern const u8 gText_Area[]; extern const u8 gText_Size[]; extern const u8 gText_AreaUnknown[]; // daycare extern const u8 gText_Lv[]; extern const u8 gDaycareText_GetAlongVeryWell[]; extern const u8 gDaycareText_GetAlong[]; extern const u8 gDaycareText_DontLikeOther[]; extern const u8 gDaycareText_PlayOther[]; extern const u8 gExpandedPlaceholder_Empty[]; extern const u8 gText_HatchedFromEgg[]; extern const u8 gText_NickHatchPrompt[]; // trainer card extern const u8 gText_WaitingTrainerFinishReading[]; extern const u8 gText_TrainerCardName[]; extern const u8 gText_TrainerCardIDNo[]; extern const u8 gText_TrainerCardMoney[]; extern const u8 gText_TrainerCardYen[]; extern const u8 gText_TrainerCardPokedex[]; extern const u8 gText_TrainerCardNull[]; extern const u8 gText_Colon2[]; extern const u8 gText_TrainerCardTime[]; extern const u8 gText_Var1sTrainerCard[]; extern const u8 gText_HallOfFameDebut[]; extern const u8 gText_WinLossRatio[]; extern const u8 gText_PokemonTrades[]; extern const u8 gText_BerryCrushes[]; extern const u8 gText_UnionRoomTradesBattles[]; extern const u8 gText_LinkBattles[]; extern const u8 gText_LinkCableBattles[]; // region_map extern const u8 gText_RegionMap_DPadMove[]; extern const u8 gText_RegionMap_Space[]; extern const u8 gText_RegionMap_AButtonGuide[]; extern const u8 gText_RegionMap_AButtonCancel[]; extern const u8 gText_RegionMap_AButtonCancel2[]; extern const u8 gText_RegionMap_AButtonSwitch[]; extern const u8 gText_RegionMap_AButtonOK[]; extern const u8 gText_RegionMap_UpDownPick[]; extern const u8 gText_RegionMap_NoData[]; extern const u8 gText_RegionMap_AreaDesc_ViridianForest[]; extern const u8 gText_RegionMap_AreaDesc_MtMoon[]; extern const u8 gText_RegionMap_AreaDesc_DiglettsCave[]; extern const u8 gText_RegionMap_AreaDesc_VictoryRoad[]; extern const u8 gText_RegionMap_AreaDesc_PokemonMansion[]; extern const u8 gText_RegionMap_AreaDesc_SafariZone[]; extern const u8 gText_RegionMap_AreaDesc_RockTunnel[]; extern const u8 gText_RegionMap_AreaDesc_SeafoamIslands[]; extern const u8 gText_RegionMap_AreaDesc_PokemonTower[]; extern const u8 gText_RegionMap_AreaDesc_CeruleanCave[]; extern const u8 gText_RegionMap_AreaDesc_PowerPlant[]; extern const u8 gText_RegionMap_AreaDesc_MtEmber[]; extern const u8 gText_RegionMap_AreaDesc_BerryForest[]; extern const u8 gText_RegionMap_AreaDesc_IcefallCave[]; extern const u8 gText_RegionMap_AreaDesc_LostCave[]; extern const u8 gText_RegionMap_AreaDesc_TanobyRuins[]; extern const u8 gText_RegionMap_AreaDesc_AlteringCave[]; extern const u8 gText_RegionMap_AreaDesc_PatternBush[]; extern const u8 gText_RegionMap_AreaDesc_DottedHole[]; // field_screen_effect extern const u8 gText_PlayerScurriedToCenter[]; extern const u8 gText_PlayerScurriedBackHome[]; // save_failed_screen extern const u8 gText_SaveFailedCheckingBackup[]; extern const u8 gText_BackupMemoryDamaged[]; extern const u8 gText_SaveCompletePressA[]; // bag extern const u8 gText_DepositItem[]; // item_menu extern const u8 gOtherText_Register[]; extern const u8 gOtherText_Walk[]; extern const u8 gOtherText_Check[]; extern const u8 gOtherText_Open[]; extern const u8 gOtherText_Deselect[]; extern const u8 gText_Items2[]; extern const u8 gText_PokeBalls2[]; extern const u8 gText_KeyItems2[]; extern const u8 gText_CloseBag[]; extern const u8 gText_CantWriteMailHere[]; extern const u8 gText_DepositHowManyStrVars1[]; extern const u8 gText_DepositedStrVar2StrVar1s[]; extern const u8 gText_NoRoomToStoreItems[]; extern const u8 gText_HeldItems[]; extern const u8 gText_Medicine[]; // union_room_battle extern const u8 gText_CommStandbyAwaitingOtherPlayer[]; extern const u8 gText_RefusedBattle[]; extern const u8 gText_BattleWasRefused[]; // union_room_chat extern const u8 gText_F700JoinedChat[]; extern const u8 gText_F700LeftChat[]; extern const u8 gText_Hello[]; extern const u8 gText_Pokemon2[]; extern const u8 gText_Trade[]; extern const u8 gText_Battle[]; extern const u8 gText_Lets[]; extern const u8 gText_Ok[]; extern const u8 gText_Sorry[]; extern const u8 gText_YaySmileEmoji[]; extern const u8 gText_ThankYou[]; extern const u8 gText_ByeBye[]; // union_room_chat_display extern const u8 gText_QuitChatting[]; extern const u8 gText_RegisterTextWhere[]; extern const u8 gText_RegisterTextHere[]; extern const u8 gText_InputText[]; extern const u8 gText_ExitingTheChat[]; extern const u8 gText_LeaderHasLeftEndingChat[]; extern const u8 gText_RegisteredTextChanged_OKtoSave[]; extern const u8 gText_RegisteredTextChanged_AlreadySavedFile[]; extern const u8 gText_RegisteredTextChanged_SavingDontTurnOff[]; extern const u8 gText_RegisteredTextChanged_SavedTheGame[]; extern const u8 gText_IfLeaderLeavesChatWillEnd[]; extern const u8 gText_Upper[]; extern const u8 gText_Lower[]; extern const u8 gText_Symbols[]; extern const u8 gText_Register2[]; extern const u8 gText_Exit[]; // wireless_communication_status_screen extern const u8 gText_Dynamic0Players[]; extern const u8 gText_Dynamic1Players[]; extern const u8 gText_Dynamic2Players[]; extern const u8 gText_Dynamic3Players[]; extern const u8 gText_WirelessCommunicationStatus[]; extern const u8 gText_PeopleTrading[]; extern const u8 gText_PeopleBattling[]; extern const u8 gText_PeopleInUnionRoom[]; extern const u8 gText_PeopleCommunicating[]; // mystery_gift extern const u8 gJPText_ReceiveMysteryGiftWithEReader[]; extern const u8 gJPText_SelectConnectFromEReaderMenu[]; extern const u8 gJPText_SelectConnectWithGBA[]; extern const u8 gJPText_LinkIsIncorrect[]; extern const u8 gJPText_CardReadingHasBeenHalted[]; extern const u8 gJPText_Connecting[]; extern const u8 gJPText_ConnectionErrorCheckLink[]; extern const u8 gJPText_ConnectionErrorTryAgain[]; extern const u8 gJPText_AllowEReaderToLoadCard[]; extern const u8 gJPText_ConnectionComplete[]; extern const u8 gJPText_NewTrainerHasComeToSevii[]; extern const u8 gJPText_PleaseWaitAMoment[]; extern const u8 gJPText_WriteErrorUnableToSaveData[]; // pokemon_jump extern const u8 gText_WantToPlayAgain2[]; extern const u8 gText_SavingDontTurnOffPower[]; extern const u8 gText_SomeoneDroppedOut2[]; extern const u8 gText_CommunicationStandby4[]; extern const u8 gText_AwesomeWonF701F700[]; extern const u8 gText_FilledStorageSpace2[]; extern const u8 gText_CantHoldMore[]; extern const u8 gText_SpacePoints2[]; extern const u8 gText_SpaceTimes3[]; extern const u8 gText_JumpsInARow[]; extern const u8 gText_BestScore2[]; extern const u8 gText_ExcellentsInARow[]; extern const u8 gText_PkmnJumpRecords[]; // cable_club extern const u8 gText_NumPlayerLink[]; extern const u8 gText_BronzeCard[]; extern const u8 gText_CopperCard[]; extern const u8 gText_SilverCard[]; extern const u8 gText_GoldCard[]; // berry_crush extern const u8 gText_BerryCrush_AreYouReady[]; extern const u8 gText_BerryCrush_WaitForOthersToChooseBerry[]; extern const u8 gText_BerryCrush_GainedXUnitsOfPowder[]; extern const u8 gText_BerryCrush_RecordingGameResults[]; extern const u8 gText_BerryCrush_WantToPlayAgain[]; extern const u8 gText_BerryCrush_NoBerries[]; extern const u8 gText_BerryCrush_MemberDroppedOut[]; extern const u8 gText_BerryCrush_TimeUp[]; extern const u8 gText_BerryCrush_CommunicationStandby[]; extern const u8 gText_1_ClrBluShdwLtBlu_Dynamic0[]; extern const u8 gText_1_Dynamic0[]; extern const u8 gText_SpaceTimes2[]; extern const u8 gText_XDotY[]; extern const u8 gText_StrVar1Berry[]; extern const u8 gText_TimeColon[]; extern const u8 gText_PressingSpeed[]; extern const u8 gText_Silkiness[]; extern const u8 gText_StrVar1[]; extern const u8 gText_SpaceMin[]; extern const u8 gText_XDotY2[]; extern const u8 gText_SpaceSec[]; extern const u8 gText_XDotY3[]; extern const u8 gText_TimesPerSec[]; extern const u8 gText_Var1Percent[]; extern const u8 gText_PressesRankings[]; extern const u8 gText_CrushingResults[]; extern const u8 gText_BerryCrush2[]; extern const u8 gText_PressingSpeedRankings[]; extern const u8 gText_Var1Players[]; extern const u8 gText_NeatnessRankings[]; extern const u8 gText_CooperativeRankings[]; extern const u8 gText_PressingPowerRankings[]; // quest log extern const u8 gText_QuestLog_PreviouslyOnYourQuest[]; extern const u8 gText_QuestLog_SwitchMon1WithMon2[]; extern const u8 gText_QuestLog_SwappedHeldItemsOnMon[]; extern const u8 gText_QuestLog_TookHeldItemFromMon[]; extern const u8 gText_QuestLog_UsedItemOnMonAtThisLocation[]; extern const u8 gText_QuestLog_UsedTheItem[]; extern const u8 gText_QuestLog_UsedTheKeyItem[]; extern const u8 gText_QuestLog_MonLearnedMoveFromTM[]; extern const u8 gText_QuestLog_MonReplacedMoveWithTM[]; extern const u8 gText_QuestLog_MonsWereFullyRestoredAtCenter[]; extern const u8 gText_QuestLog_PlayerBattledChampionRival[]; extern const u8 gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2[]; extern const u8 gText_QuestLog_WonTheMatchAsAResult[]; extern const u8 gText_QuestLog_StoredItemInPC[]; extern const u8 gText_QuestLog_WithdrewItemFromPC[]; extern const u8 gText_QuestLog_TradedMon1ForPersonsMon2[]; extern const u8 gText_QuestLog_SingleBattleWithPersonResultedInOutcome[]; extern const u8 gText_QuestLog_DoubleBattleWithPersonResultedInOutcome[]; extern const u8 gText_QuestLog_MultiBattleWithPeopleResultedInOutcome[]; extern const u8 gText_QuestLog_Win[]; extern const u8 gText_QuestLog_Loss[]; extern const u8 gText_QuestLog_MingledInUnionRoom[]; extern const u8 gText_QuestLog_DepartedPlaceInTownForNextDestination[]; extern const u8 gText_QuestLog_SwitchedMonsBetweenBoxes[]; extern const u8 gText_QuestLog_MovedMonToNewBox[]; extern const u8 gText_QuestLog_SwitchedMonsWithinBox[]; extern const u8 gText_QuestLog_MovedMonWithinBox[]; extern const u8 gText_QuestLog_SwitchedPartyMonForPCMon[]; extern const u8 gText_QuestLog_WithdrewMonFromPC[]; extern const u8 gText_QuestLog_DepositedMonInPC[]; extern const u8 gText_QuestLog_SwitchedMultipleMons[]; extern const u8 gText_QuestLog_ADifferentSpot[]; extern const u8 gText_QuestLog_GaveMonHeldItemFromPC[]; extern const u8 gText_QuestLog_SwappedHeldItemFromPC[]; extern const u8 gText_QuestLog_ChattedWithManyTrainers[]; extern const u8 gText_QuestLog_Handily[]; extern const u8 gText_QuestLog_Tenaciously[]; extern const u8 gText_QuestLog_Somehow[]; extern const u8 gText_QuestLog_TradedMon1ForTrainersMon2[]; extern const u8 gText_QuestLog_BattledTrainerEndedInOutcome[]; extern const u8 gText_QuestLog_BoughtItem[]; extern const u8 gText_QuestLog_BoughtItemsIncludingItem[]; extern const u8 gText_QuestLog_SoldNumOfItem[]; extern const u8 gText_QuestLog_SoldItemsIncludingItem[]; extern const u8 gText_QuestLog_JustOne[]; extern const u8 gText_QuestLog_Num[]; extern const u8 gText_QuestLog_UsedSoftboiled[]; extern const u8 gText_QuestLog_UsedMilkDrink[]; extern const u8 gText_QuestLog_MonLearnedMoveFromHM[]; extern const u8 gText_QuestLog_MonReplacedMoveWithHM[]; extern const u8 gText_QuestLog_DefeatedWildMon[]; extern const u8 gText_QuestLog_DefeatedWildMons[]; extern const u8 gText_QuestLog_CaughtWildMon[]; extern const u8 gText_QuestLog_CaughtWildMons[]; extern const u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMon[]; extern const u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMons[]; extern const u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMon[]; extern const u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMons[]; extern const u8 gText_QuestLog_GaveMonHeldItem[]; extern const u8 gText_QuestLog_GaveMonHeldItem2[]; extern const u8 gText_QuestLog_UsedCut[]; extern const u8 gText_QuestLog_UsedFly[]; extern const u8 gText_QuestLog_UsedSurf[]; extern const u8 gText_QuestLog_UsedStrength[]; extern const u8 gText_QuestLog_UsedFlash[]; extern const u8 gText_QuestLog_UsedRockSmash[]; extern const u8 gText_QuestLog_UsedWaterfall[]; extern const u8 gText_QuestLog_UsedDive[]; extern const u8 gText_QuestLog_UsedDigInLocation[]; extern const u8 gText_QuestLog_UsedSweetScent[]; extern const u8 gText_QuestLog_UsedTeleportToLocation[]; extern const u8 gText_QuestLog_LeftTownsLocationForNextDestination[]; extern const u8 gText_QuestLog_PlayedGamesAtGameCorner[]; extern const u8 gText_QuestLog_RestedAtHome[]; extern const u8 gText_QuestLog_LeftOaksLab[]; extern const u8 gText_QuestLog_GymWasFullOfToughTrainers[]; extern const u8 gText_QuestLog_DepartedGym[]; extern const u8 gText_QuestLog_HadGreatTimeInSafariZone[]; extern const u8 gText_QuestLog_ManagedToGetOutOfLocation[]; extern const u8 gText_QuestLog_TookOnGymLeadersMonWithMonAndWon[]; extern const u8 gText_QuestLog_TookOnEliteFoursMonWithMonAndWon[]; extern const u8 gText_QuestLog_TookOnTrainersMonWithMonAndWon[]; extern const u8 gText_QuestLog_Coolly[]; extern const u8 gText_QuestLog_Barely[]; extern const u8 gText_QuestLog_UsedEscapeRope[]; extern const u8 gText_QuestLog_Draw[]; extern const u8 gText_QuestLog_DepartedTheLocationForNextDestination[]; extern const u8 gText_QuestLog_DepartedFromLocationToNextDestination[]; extern const u8 gText_QuestLog_ObtainedItemInLocation[]; extern const u8 gText_QuestLog_ArrivedInLocation[]; extern const u8 gText_QuestLog_SavedGameAtLocation[]; extern const u8 gText_QuestLog_Home[]; extern const u8 gText_QuestLog_OakResearchLab[]; extern const u8 gText_QuestLog_Gym[]; extern const u8 gText_QuestLog_PokemonLeagueGate[]; extern const u8 gText_QuestLog_ViridianForest[]; extern const u8 gText_QuestLog_PewterMuseumOfScience[]; extern const u8 gText_QuestLog_MtMoon[]; extern const u8 gText_QuestLog_BikeShop[]; extern const u8 gText_QuestLog_BillsHouse[]; extern const u8 gText_QuestLog_DayCare[]; extern const u8 gText_QuestLog_UndergroundPath[]; extern const u8 gText_QuestLog_PokemonFanClub[]; extern const u8 gText_QuestLog_SSAnne[]; extern const u8 gText_QuestLog_DiglettsCave[]; extern const u8 gText_QuestLog_RockTunnel[]; extern const u8 gText_QuestLog_PowerPlant[]; extern const u8 gText_QuestLog_PokemonTower[]; extern const u8 gText_QuestLog_VolunteerHouse[]; extern const u8 gText_QuestLog_NameRatersHouse[]; extern const u8 gText_QuestLog_CeladonDeptStore[]; extern const u8 gText_QuestLog_CeladonMansion[]; extern const u8 gText_QuestLog_RocketGameCorner[]; extern const u8 gText_QuestLog_Restaurant[]; extern const u8 gText_QuestLog_RocketHideout[]; extern const u8 gText_QuestLog_SafariZone[]; extern const u8 gText_QuestLog_WardensHome[]; extern const u8 gText_QuestLog_FightingDojo[]; extern const u8 gText_QuestLog_SilphCo[]; extern const u8 gText_QuestLog_SeafoamIslands[]; extern const u8 gText_QuestLog_PokemonMansion[]; extern const u8 gText_QuestLog_PokemonResearchLab[]; extern const u8 gText_QuestLog_VictoryRoad[]; extern const u8 gText_QuestLog_PokemonLeague[]; extern const u8 gText_QuestLog_CeruleanCave[]; // clear_save_data_screen extern const u8 gText_ClearAllSaveData[]; extern const u8 gText_ClearingData[]; // easy_chat_2 extern const u8 gText_CombineFourWordsOrPhrases[]; extern const u8 gText_AndMakeYourProfile[]; extern const u8 gText_MakeMessageSixPhrases[]; extern const u8 gText_MaxTwoTwelveLetterPhrases[]; extern const u8 gText_FindWordsThatDescribeYour[]; extern const u8 gText_FeelingsRightNow[]; extern const u8 gText_CombineNineWordsOrPhrases[]; extern const u8 gText_AndMakeAMessage[]; extern const u8 gText_ChangeJustOneWordOrPhrase[]; extern const u8 gText_AndImproveTheBardsSong[]; extern const u8 gText_AndFillOutTheQuestionnaire[]; extern const u8 gText_YourProfile[]; extern const u8 gText_YourFeelingAtTheBattlesStart[]; extern const u8 gText_WhatYouSayIfYouWin[]; extern const u8 gText_WhatYouSayIfYouLose[]; extern const u8 gText_TheAnswer[]; extern const u8 gText_TheMailMessage[]; extern const u8 gText_TheNewSong[]; extern const u8 gText_CombineTwoWordsOrPhrases[]; extern const u8 gText_AndMakeATrendySaying[]; extern const u8 gText_TheTrendySaying[]; extern const u8 gText_IsAsShownOkay[]; extern const u8 gText_AllTextBeingEditedWill[]; extern const u8 gText_BeDeletedThatOkay[]; extern const u8 gText_QuitEditing[]; extern const u8 gText_StopGivingPkmnMail[]; extern const u8 gText_Profile[]; extern const u8 gText_AtTheBattlesStart[]; extern const u8 gText_UponWinningABattle[]; extern const u8 gText_UponLosingABattle[]; extern const u8 gText_TheBardsSong[]; extern const u8 gText_WhatsHipAndHappening[]; extern const u8 gText_Interview[]; extern const u8 gText_Questionnaire[]; extern const u8 gText_DelAllCancelOk[]; // naming_screen extern const u8 gText_MoveOkBack[]; extern const u8 gText_AlphabetUpperLower[]; extern const u8 gText_YourName[]; extern const u8 gText_BoxName[]; extern const u8 gText_PkmnsNickname[]; extern const u8 gText_RivalsName[]; // pokemon_storage_system extern const u8 gText_WithdrawPokemon[]; extern const u8 gText_WithdrawMonDescription[]; extern const u8 gText_DepositPokemon[]; extern const u8 gText_DepositMonDescription[]; extern const u8 gText_MovePokemon[]; extern const u8 gText_MoveMonDescription[]; extern const u8 gText_MoveItems[]; extern const u8 gText_MoveItemsDescription[]; extern const u8 gText_SeeYa[]; extern const u8 gText_SeeYaDescription[]; extern const u8 gText_PartyFull[]; extern const u8 gText_JustOnePkmn[]; extern const u8 gText_Box[]; extern const u8 gText_ExitFromBox[]; extern const u8 gText_WhatDoYouWantToDo[]; extern const u8 gText_PleasePickATheme[]; extern const u8 gText_PickTheWallpaper[]; extern const u8 gText_PkmnIsSelected[]; extern const u8 gText_JumpToWhichBox[]; extern const u8 gText_DepositInWhichBox[]; extern const u8 gText_PkmnWasDeposited[]; extern const u8 gText_BoxIsFull2[]; extern const u8 gText_ReleaseThisPokemon[]; extern const u8 gText_PkmnWasReleased[]; extern const u8 gText_ByeByePkmn[]; extern const u8 gText_MarkYourPkmn[]; extern const u8 gText_ThatsYourLastPkmn[]; extern const u8 gText_YourPartysFull[]; extern const u8 gText_YoureHoldingAPkmn[]; extern const u8 gText_WhichOneWillYouTake[]; extern const u8 gText_YouCantReleaseAnEgg[]; extern const u8 gText_ContinueBoxOperations[]; extern const u8 gText_PkmnCameBack[]; extern const u8 gText_WasItWorriedAboutYou[]; extern const u8 gText_FourEllipsesExclamation[]; extern const u8 gText_PleaseRemoveTheMail[]; extern const u8 gText_PkmnIsSelected[]; extern const u8 gText_GiveToAPkmn[]; extern const u8 gText_PlacedItemInBag[]; extern const u8 gText_BagIsFull2[]; extern const u8 gText_PutItemInBag[]; extern const u8 gText_ItemIsNowHeld[]; extern const u8 gText_ChangedToNewItem[]; extern const u8 gText_MailCantBeStored[]; extern const u8 gPCText_Cancel[]; extern const u8 gPCText_Store[]; extern const u8 gPCText_Withdraw[]; extern const u8 gPCText_Move[]; extern const u8 gPCText_Shift[]; extern const u8 gPCText_Place[]; extern const u8 gPCText_Summary[]; extern const u8 gPCText_Release[]; extern const u8 gPCText_Mark[]; extern const u8 gPCText_Jump[]; extern const u8 gPCText_Wallpaper[]; extern const u8 gPCText_Name[]; extern const u8 gPCText_Take[]; extern const u8 gPCText_Give[]; extern const u8 gPCText_Switch[]; extern const u8 gPCText_Bag[]; extern const u8 gPCText_Info[]; extern const u8 gPCText_Scenery1[]; extern const u8 gPCText_Scenery2[]; extern const u8 gPCText_Scenery3[]; extern const u8 gPCText_Etcetera[]; extern const u8 gPCText_Forest[]; extern const u8 gPCText_City[]; extern const u8 gPCText_Desert[]; extern const u8 gPCText_Savanna[]; extern const u8 gPCText_Crag[]; extern const u8 gPCText_Volcano[]; extern const u8 gPCText_Snow[]; extern const u8 gPCText_Cave[]; extern const u8 gPCText_Beach[]; extern const u8 gPCText_Seafloor[]; extern const u8 gPCText_River[]; extern const u8 gPCText_Sky[]; extern const u8 gPCText_PolkaDot[]; extern const u8 gPCText_Pokecenter[]; extern const u8 gPCText_Machine[]; extern const u8 gPCText_Simple[]; // pokemon_special_anim extern const u8 gText_Counting_1[]; extern const u8 gText_Counting_2And[]; extern const u8 gText_Poof[]; extern const u8 gText_WasUsedOn[]; extern const u8 gText_Period[]; extern const u8 gText_LevelRoseTo[]; extern const u8 gText_Period2[]; extern const u8 gText_MonLearnedTMHM[]; extern const u8 gText_MonForgotMove[]; extern const u8 gText_And[]; extern const u8 gText_MachineSet[]; extern const u8 gText_Huh[]; extern const u8 gText_LevelUp_MaxHP[]; extern const u8 gText_LevelUp_Attack[]; extern const u8 gText_LevelUp_Defense[]; extern const u8 gText_LevelUp_SpAtk[]; extern const u8 gText_LevelUp_SpDef[]; extern const u8 gText_LevelUp_Speed[]; extern const u8 gText_LevelUp_Minus[]; extern const u8 gText_LevelUp_Plus[]; // field_player_avatar extern const u8 gText_PokemonOnHook[]; extern const u8 gText_NotEvenANibble[]; extern const u8 gText_ItGotAway[]; // pokemon_summary_screen extern const u8 gText_PokeSum_PageName_KnownMoves[]; extern const u8 gText_PokeSum_Controls_PickSwitch[]; extern const u8 gText_PokeSum_Controls_Pick[]; extern const u8 gText_PokeSum_NoData[]; extern const u8 gText_PokeSum_Controls_PageDetail[]; extern const u8 gText_PokeSum_DexNoUnknown[]; extern const u8 gText_PokeSum_Item_None[]; extern const u8 gText_PokeSum_OneHyphen[]; extern const u8 gText_PokeSum_TwoHyphens[]; extern const u8 gText_PokeSum_PP[]; extern const u8 gText_Somewhere[]; extern const u8 gText_PokeSum_ATrade[]; extern const u8 gText_PokeSum_FatefulEncounterHatched_BoldGentleGrammar[]; extern const u8 gText_PokeSum_FatefulEncounterHatched[]; extern const u8 gText_PokeSum_Hatched_BoldGentleGrammar[]; extern const u8 gText_PokeSum_Hatched[]; extern const u8 gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar[]; extern const u8 gText_PokeSum_FatefulEncounterMet[]; extern const u8 gText_PokeSum_Met_BoldGentleGrammar[]; extern const u8 gText_PokeSum_Met[]; extern const u8 gText_PokeSum_MetInATrade_BoldGentleGrammar[]; extern const u8 gText_PokeSum_MetInATrade[]; extern const u8 gText_PokeSum_ApparentlyFatefulEncounterHatched_BoldGentleGrammar[]; extern const u8 gText_PokeSum_ApparentlyFatefulEncounterHatched[]; extern const u8 gText_PokeSum_ApparentlyMet[]; extern const u8 gText_PokeSum_ApparentlyMet_BoldGentleGrammar[]; extern const u8 gText_PokeSum_ExpPoints[]; extern const u8 gText_PokeSum_NextLv[]; extern const u8 gText_PokeSum_PageName_PokemonInfo[]; extern const u8 gText_PokeSum_Controls_PageCancel[]; extern const u8 gText_PokeSum_Controls_Cancel[]; extern const u8 gText_PokeSum_PageName_PokemonSkills[]; extern const u8 gText_PokeSum_Controls_Page[]; extern const u8 gText_PokeSum_Controls_PickDelete[]; extern const u8 gText_PokeSum_HmMovesCantBeForgotten[]; extern const u8 gText_PokeSum_EggHatch_LongTime[]; extern const u8 gText_PokeSum_EggHatch_SomeTime[]; extern const u8 gText_PokeSum_EggHatch_Soon[]; extern const u8 gText_PokeSum_EggHatch_AlmostReady[]; extern const u8 gText_PokeSum_EggOrigin_DayCare[]; extern const u8 gText_PokeSum_EggOrigin_Trade[]; extern const u8 gText_PokeSum_EggOrigin_TravelingMan[]; extern const u8 gText_PokeSum_EggOrigin_Trade[]; extern const u8 gText_PokeSum_EggOrigin_NicePlace[]; extern const u8 gText_PokeSum_EggOrigin_Spa[]; extern const u8 gText_PokeSum_EggOrigin_Trade[]; extern const u8 gSummaryMetLocationTextOrreEeveelutionsDuking[]; extern const u8 gText_YouAlreadyHaveThisTM[]; extern const u8 gText_ThrowInPremierBall[]; extern const u8 gText_ThrowInPremierBalls[]; extern const u8 gText_PkmnFriendlyBaseVar2Fell[]; extern const u8 gText_PkmnFriendlyBaseVar2CantFall[]; extern const u8 gText_PkmnAdoresBaseVar2Fell[]; extern const u8 gText_HeldItemsPocket[]; extern const u8 gText_MedicinePocket[]; extern const u8 gText_Version[]; extern const u8 gText_FireredVersion[]; extern const u8 gText_LeafgreenVersion[]; extern const u8 gText_Difficulty[]; extern const u8 gText_EasyDifficulty[]; extern const u8 gText_NormalDifficulty[]; extern const u8 gText_ChallengeDifficulty[]; extern const u8 gText_Nuzlocke[]; extern const u8 gText_Nuzlocke_On[]; extern const u8 gText_Nuzlocke_Off[]; extern const u8 gText_IVCalc[]; extern const u8 gText_IVCalcZero[]; extern const u8 gText_IVCalcStandard[]; extern const u8 gText_IVCalcPerfect[]; extern const u8 gText_EVCalc[]; extern const u8 gText_EVCalcZero[]; extern const u8 gText_EVCalcStandard[]; extern const u8 gText_ExpModZero[]; extern const u8 gText_ExpModHalf[]; extern const u8 gText_ExpModNormal[]; extern const u8 gText_ExpModTwice[]; extern const u8 gText_KeySystemSettings[]; extern const u8 gText_HelpPickSwitchCancel[]; extern const u8 gChooseVersionNewGame[]; extern const u8 gFRLG_Multichoice[]; extern const u8 gText_NoPMC[]; extern const u8 gText_ExpMod[]; extern const u8 gText_BlueFlute_Ash[]; extern const u8 gText_YellowFlute_Ash[]; extern const u8 gText_RedFlute_Ash[]; extern const u8 gText_WhiteFlute_Ash[]; extern const u8 gText_BlackFlute_Ash[]; extern const u8 gText_AshQuantity[]; extern const u8 gText_SmallExit[]; extern const u8 gText_BattleTower[]; extern const u8 gText_BattleFactory[]; extern const u8 gText_BattleArena[]; extern const u8 gText_BattleDome[]; extern const u8 gText_BattlePike[]; extern const u8 gText_BattlePalace[]; extern const u8 gText_BattlePyramid[]; extern const u8 gText_DevonSpyShop[]; extern const u8 gText_AnythingElseICanHelpF[]; extern const u8 gText_Brock[]; extern const u8 gText_Misty[]; extern const u8 gText_LtSurge[]; extern const u8 gText_Erika[]; extern const u8 gText_Koga[]; extern const u8 gText_Sabrina[]; extern const u8 gText_Blaine[]; extern const u8 gText_CommaSpace[]; extern const u8 gText_NewLine[]; extern const u8 gText_AndSpace[]; extern const u8 gText_SwapToKanto[]; extern const u8 gText_SwapToExtended[]; extern const u8 gText_Extended[]; extern const u8 gText_NumericalModeExtended[]; extern const u8 gText_An[]; extern const u8 gText_A[]; extern const u8 gText_WhoAreThey[]; extern const u8 gText_HowDoIBattleThem[]; extern const u8 gText_AboutTitles[]; extern const u8 gText_Nothing[]; #endif //GUARD_STRINGS_H ================================================ FILE: include/task.h ================================================ #ifndef GUARD_TASK_H #define GUARD_TASK_H #include "global.h" #define HEAD_SENTINEL 0xFE #define TAIL_SENTINEL 0xFF #define TASK_NONE TAIL_SENTINEL #define NUM_TASKS 16 #define NUM_TASK_DATA 16 typedef void (*TaskFunc)(u8 taskId); struct Task { TaskFunc func; bool8 isActive; u8 prev; u8 next; u8 priority; s16 data[NUM_TASK_DATA]; }; extern struct Task gTasks[]; void ResetTasks(void); u8 CreateTask(TaskFunc func, u8 priority); void DestroyTask(u8 taskId); void RunTasks(void); void TaskDummy(u8 taskId); void SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc); void SwitchTaskToFollowupFunc(u8 taskId); bool8 FuncIsActiveTask(TaskFunc func); u8 FindTaskIdByFunc(TaskFunc func); u8 GetTaskCount(void); void SetWordTaskArg(u8 taskId, u8 dataElem, unsigned long value); u32 GetWordTaskArg(u8 taskId, u8 dataElem); #endif // GUARD_TASK_H ================================================ FILE: include/teachy_tv.h ================================================ #ifndef GUARD_TEACHY_TV_H #define GUARD_TEACHY_TV_H enum TeachyTvScript { TTVSCR_BATTLE, TTVSCR_STATUS, TTVSCR_MATCHUPS, TTVSCR_CATCHING, TTVSCR_TMS, TTVSCR_REGISTER }; void InitTeachyTvController(u8 mode, void (*cb)()); void CB2_ReturnToTeachyTV(void); void SetTeachyTvControllerModeToResume(void); #endif //GUARD_TEACHY_TV_H ================================================ FILE: include/text.h ================================================ #ifndef GUARD_TEXT_H #define GUARD_TEXT_H #include "global.h" #include "characters.h" #define NUM_TEXT_PRINTERS 32 #define TEXT_SPEED_INSTANT 0 // Given as a text speed when all the text should be // loaded at once but not copied to vram yet. #define TEXT_SKIP_DRAW 0xFF enum { FONT_SMALL, FONT_NORMAL_COPY_1, FONT_NORMAL, FONT_NORMAL_COPY_2, FONT_MALE, FONT_FEMALE, FONT_BRAILLE, FONT_BOLD, }; // Return values for font functions enum { RENDER_PRINT, RENDER_FINISH, RENDER_REPEAT, // Run render function again, if e.g. a control code is encountered. RENDER_UPDATE, }; // Text printer states read by RenderText / FontFunc_Braille enum { RENDER_STATE_HANDLE_CHAR, RENDER_STATE_WAIT, RENDER_STATE_CLEAR, RENDER_STATE_SCROLL_START, RENDER_STATE_SCROLL, RENDER_STATE_WAIT_SE, RENDER_STATE_PAUSE, }; enum { FONTATTR_MAX_LETTER_WIDTH, FONTATTR_MAX_LETTER_HEIGHT, FONTATTR_LETTER_SPACING, FONTATTR_LINE_SPACING, FONTATTR_UNKNOWN, // dunno what this is yet FONTATTR_COLOR_FOREGROUND, FONTATTR_COLOR_BACKGROUND, FONTATTR_COLOR_SHADOW }; struct GlyphInfo { u8 pixels[0x80]; u8 width; u8 height; }; extern struct GlyphInfo gGlyphInfo; struct TextPrinterSubStruct { u8 glyphId:4; // 0x14 bool8 hasPrintBeenSpedUp:1; u8 font_type_5:3; u8 downArrowDelay:5; u8 downArrowYPosIdx:2; u8 hasGlyphIdBeenSet:1; u8 autoScrollDelay; }; struct TextPrinterTemplate // TODO: Better name { const u8 *currentChar; u8 windowId; u8 fontId; u8 x; u8 y; u8 currentX; // 0x8 u8 currentY; u8 letterSpacing; u8 lineSpacing; u8 unk:4; // 0xC u8 fgColor:4; u8 bgColor:4; u8 shadowColor:4; }; struct TextPrinter { struct TextPrinterTemplate printerTemplate; void (*callback)(struct TextPrinterTemplate *, u16); // 0x10 union __attribute__((packed)) { struct TextPrinterSubStruct sub; u8 fields[7]; } subUnion; u8 active; u8 state; // 0x1C u8 textSpeed; u8 delayCounter; u8 scrollDistance; u8 minLetterSpacing; // 0x20 u8 japanese; }; struct FontInfo { u16 (*fontFunction)(struct TextPrinter *x); u8 maxLetterWidth; u8 maxLetterHeight; u8 letterSpacing; u8 lineSpacing; u8 unk:4; u8 fgColor:4; u8 bgColor:4; u8 shadowColor:4; }; extern const struct FontInfo *gFonts; struct GlyphWidthFunc { u32 fontId; s32 (*func)(u16 glyphId, bool32 isJapanese); }; typedef struct { u8 canABSpeedUpPrint:1; u8 useAlternateDownArrow:1; u8 autoScroll:1; u8 forceMidTextSpeed:1; } TextFlags; extern TextFlags gTextFlags; extern u8 gStringVar1[]; extern u8 gStringVar2[]; extern u8 gStringVar3[]; extern u8 gStringVar4[]; extern const u8 gKeypadIconTiles[]; void SetFontsPointer(const struct FontInfo *fonts); void DeactivateAllTextPrinters(void); u16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)); bool16 AddTextPrinter(struct TextPrinterTemplate *textSubPrinter, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)); void RunTextPrinters(void); bool16 IsTextPrinterActive(u8 id); u32 RenderFont(struct TextPrinter *textPrinter); void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor); void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor); void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor); void DecompressGlyphTile(const u16 *src, u16 *dest); u8 GetLastTextColor(u8 colorType); void CopyGlyphToWindow(struct TextPrinter *x); void ClearTextSpan(struct TextPrinter *textPrinter, u32 width); u16 FontFunc_Small(struct TextPrinter *textPrinter); u16 FontFunc_NormalCopy1(struct TextPrinter *textPrinter); u16 FontFunc_Normal(struct TextPrinter *textPrinter); u16 FontFunc_NormalCopy2(struct TextPrinter *textPrinter); u16 FontFunc_Male(struct TextPrinter *textPrinter); u16 FontFunc_Female(struct TextPrinter *textPrinter); u16 FontFunc_Braille(struct TextPrinter *textPrinter); void TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter); void TextPrinterDrawDownArrow(struct TextPrinter *textPrinter); void TextPrinterClearDownArrow(struct TextPrinter *textPrinter); bool8 TextPrinterWaitAutoMode(struct TextPrinter *textPrinter); bool16 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter); bool16 TextPrinterWait(struct TextPrinter *textPrinter); void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *counter, u8 *yCoordIndex); u16 RenderText(struct TextPrinter *textPrinter); s32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32); s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing); u8 RenderTextHandleBold(u8 *pixels, u8 fontId, u8 *str, int a3, int a4, int a5, int a6, int a7); u8 DrawKeypadIcon(u8 windowId, u8 keypadIconId, u16 x, u16 y); u8 GetKeypadIconTileOffset(u8 keypadIconId); u8 GetKeypadIconWidth(u8 keypadIconId); u8 GetKeypadIconHeight(u8 keypadIconId); u8 GetFontAttribute(u8 fontId, u8 attributeId); u8 GetMenuCursorDimensionByFont(u8 fontId, u8 whichDimension); void DecompressGlyph_Small(u16 glyphId, bool32 isJapanese); void DecompressGlyph_Normal(u16 glyphId, bool32 isJapanese); void DecompressGlyph_Female(u16 glyphId, bool32 isJapanese); s32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese); u8 CreateTextCursorSprite(u8 sheetId, u16 x, u16 y, u8 priority, u8 subpriority); void DestroyTextCursorSprite(u8 spriteId); s32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese); int GetStringCenterAlignXOffset(int fontId, const u8 *str, int totalWidth); int GetStringCenterAlignXOffsetWithLetterSpacing(int fontId, const u8 *str, int totalWidth, int letterSpacing); int GetStringWidthDifference(int fontId, const u8 *str, int totalWidth, int letterSpacing); #endif // GUARD_TEXT_H ================================================ FILE: include/text_window.h ================================================ #ifndef GUARD_TEXT_WINDOW_H #define GUARD_TEXT_WINDOW_H #include "global.h" struct TilesPal { u32 *tiles; u16 *pal; }; void rbox_fill_rectangle(u8 windowId); const u16 *GetTextWindowPalette(u8 id); const u16 *GetOverworldTextboxPalettePtr(void); void LoadMenuMessageWindowGfx(u8 windowId, u16 tileStart, u8 palette); void LoadStdWindowGfx(u8 windowId, u16 tileStart, u8 palette); void LoadUserWindowGfx(u8 windowId, u16 tileStart, u8 palette); void LoadUserWindowGfx2(u8 windowId, u16 tileStart, u8 palette); void LoadStdWindowGfxOnBg(u8 bgId, u16 tileStart, u8 palette); void DrawTextBorderOuter(u8 windowId, u16 tileStart, u8 palette); void DrawTextBorderInner(u8 windowId, u16 tileNum, u8 palNum); void LoadHelpMessageWindowGfx(u8 windowId, u16 destOffset, u8 palIdx); void LoadSignpostWindowGfx(u8 windowId, u16 destOffset, u8 palIdx); void LoadStdWindowTiles(u8 windowId, u16 destOffset); void LoadQuestLogWindowTiles(u8 windowId, u16 destOffset); #endif // GUARD_TEXT_WINDOW_H ================================================ FILE: include/text_window_graphics.h ================================================ #ifndef GUARD_TEXT_WINDOW_GRAPHICS_H #define GUARD_TEXT_WINDOW_GRAPHICS_H struct TextWindowGraphics { const void *tiles; const void *palette; }; extern const u16 gSignpostWindow_Gfx[]; extern const u16 gStdTextWindow_Gfx[]; extern const u16 gQuestLogWindow_Gfx[]; extern const u16 gTextWindowPalettes[][16]; extern const struct TextWindowGraphics gUserFrames[]; const struct TextWindowGraphics *GetUserWindowGraphics(u8 idx); #endif //GUARD_TEXT_WINDOW_GRAPHICS_H ================================================ FILE: include/tilemap_util.h ================================================ #ifndef GUARD_TILEMAP_UTIL_H #define GUARD_TILEMAP_UTIL_H void TilemapUtil_Init(u8 numTilemapIds); void TilemapUtil_Free(void); void TilemapUtil_SetTilemap(u8 tilemapId, u8 bg, const void *tilemap, u16 width, u16 height); void TilemapUtil_SetPos(u8 tilemapId, u16 destX, u16 destY); void TilemapUtil_SetRect(u8 tilemapId, u16 x, u16 y, u16 width, u16 height); void TilemapUtil_Move(u8 tilemapId, u8 mode, s8 param); void TilemapUtil_Update(u8 tilemapId); #endif //GUARD_TILEMAP_UTIL_H ================================================ FILE: include/tileset_anims.h ================================================ #ifndef GUARD_TILESET_ANIMS_H #define GUARD_TILESET_ANIMS_H void InitTilesetAnimations(void); void InitSecondaryTilesetAnimation(void); void UpdateTilesetAnimations(void); void TransferTilesetAnimsBuffer(void); void InitTilesetAnim_General(void); void InitTilesetAnim_CeladonCity(void); void InitTilesetAnim_VermilionGym(void); void InitTilesetAnim_CeladonGym(void); void InitTilesetAnim_SilphCo(void); void InitTilesetAnim_MtEmber(void); void InitTilesetAnim_Underwater(void); void InitTilesetAnim_BattleFrontierOutsideWest(void); void InitTilesetAnim_BattleFrontierOutsideEast(void); void InitTilesetAnim_SeviiIslands67(void); void InitTilesetAnim_SeviiIslands5(void); #endif // GUARD_TILESET_ANIMS_H ================================================ FILE: include/tilesets.h ================================================ #ifndef GUARD_TILESETS_H #define GUARD_TILESETS_H extern const u32 gTilesetTiles_General[]; extern const u16 gTilesetPalettes_General[][16]; extern const u32 gTilesetTiles_GenericBuilding1[]; extern const u16 gTilesetPalettes_GenericBuilding1[][16]; extern const u32 gTilesetTiles_DepartmentStore[]; extern const u16 gTilesetPalettes_DepartmentStore[][16]; #endif // GUARD_TILESETS_H ================================================ FILE: include/title_screen.h ================================================ #ifndef GUARD_TITLE_SCREEN_H #define GUARD_TITLE_SCREEN_H void CB2_InitTitleScreen(void); #endif //GUARD_TITLE_SCREEN_H ================================================ FILE: include/tm_case.h ================================================ #ifndef GUARD_TM_CASE_H #define GUARD_TM_CASE_H // Values for 'type' argument to InitTMCase enum { TMCASE_FIELD, TMCASE_GIVE_PARTY, TMCASE_SELL, TMCASE_GIVE_PC, TMCASE_POKEDUDE, TMCASE_REOPENING, }; // Alternative value for 'allowSelectClose' argument to InitTMCase. // Indicates that the previous value should be preserved #define TMCASE_KEEP_PREV 0xFF void InitTMCase(u8 type, void (* exitCallback)(void), bool8 allowSelectClose); void ResetTMCaseCursorPos(void); void Pokedude_InitTMCase(void); #endif //GUARD_TM_CASE_H ================================================ FILE: include/trade.h ================================================ #ifndef GUARD_TRADE_H #define GUARD_TRADE_H #include "global.h" #include "link_rfu.h" #include "constants/trade.h" extern struct Mail gLinkPartnerMail[6]; extern u8 gSelectedTradeMonPositions[2]; extern const u8 gText_MaleSymbol4[]; extern const u8 gText_FemaleSymbol4[]; extern const u8 gText_GenderlessSymbol[]; extern const u16 gTradeOrHatchMonShadowTilemap[]; void CB2_StartCreateTradeMenu(void); s32 GetGameProgressForLinkTrade(void); s32 CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData rfuPlayer, u16 species2, u16 species, u8 isEventLegal); s32 GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData rfuPlayer, struct RfuGameCompatibilityData rfuPartner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, u8 isEventLegal); void CB2_ReturnToTradeMenuFromSummary(void); #endif //GUARD_TRADE_H ================================================ FILE: include/trade_scene.h ================================================ #ifndef GUARD_TRADE_SCENE_H #define GUARD_TRADE_SCENE_H void CB2_LinkTrade(void); void CreateInGameTradePokemon(void); void DoInGameTradeScene(void); void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed); u16 GetInGameTradeSpeciesInfo(void); u16 GetTradeSpecies(void); void InitTradeSequenceBgGpuRegs(void); void LinkTradeDrawWindow(void); void LoadTradeAnimGfx(void); extern const u16 gTradeOrHatchMonShadowTilemap[]; extern const struct WindowTemplate gTradeEvolutionSceneYesNoWindowTemplate; #endif //GUARD_TRADE_SCENE_H ================================================ FILE: include/trainer_card.h ================================================ #ifndef GUARD_TRAINER_CARD_H #define GUARD_TRAINER_CARD_H #include "constants/trainer_card.h" struct TrainerCardRSE { /*0x00*/ u8 gender; /*0x01*/ u8 stars; /*0x02*/ bool8 hasPokedex; /*0x03*/ bool8 caughtAllHoenn; /*0x04*/ bool8 hasAllPaintings; /*0x06*/ u16 hofDebutHours; /*0x08*/ u16 hofDebutMinutes; /*0x0A*/ u16 hofDebutSeconds; /*0x0C*/ u16 caughtMonsCount; /*0x0E*/ u16 trainerId; /*0x10*/ u16 playTimeHours; /*0x12*/ u16 playTimeMinutes; /*0x14*/ u16 linkBattleWins; /*0x16*/ u16 linkBattleLosses; /*0x18*/ u16 battleTowerWins; /*0x1A*/ u16 battleTowerStraightWins; /*0x1C*/ u16 contestsWithFriends; /*0x1E*/ u16 pokeblocksWithFriends; /*0x20*/ u16 pokemonTrades; /*0x24*/ u32 money; /*0x28*/ u16 easyChatProfile[TRAINER_CARD_PROFILE_LENGTH]; /*0x30*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; }; struct TrainerCard { /*0x00*/ struct TrainerCardRSE rse; /*0x38*/ u8 version; /*0x3A*/ bool16 hasAllFrontierSymbols; /*0x3C*/ u32 berryCrushPoints; /*0x40*/ u32 unionRoomNum; /*0x44*/ u32 berriesPicked; /*0x48*/ u32 jumpsInRow; /*0x4C*/ bool8 shouldDrawStickers; /*0x4D*/ bool8 hasAllMons; /*0x4E*/ u8 monIconTint; /*0x4F*/ u8 facilityClass; /*0x50*/ u8 stickers[TRAINER_CARD_STICKER_TYPES]; /*0x54*/ u16 monSpecies[PARTY_SIZE]; }; extern struct TrainerCard gTrainerCards[4]; void ShowPlayerTrainerCard(void (*callback)(void)); void ShowTrainerCardInLink(u8 whoseCard, MainCallback callback); u8 GetTrainerCardStars(u8 cardId); void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard); #endif //GUARD_TRAINER_CARD_H ================================================ FILE: include/trainer_front_sprites.h ================================================ #ifndef GUARD_TRAINER_FRONT_SPRITES_H #define GUARD_TRAINER_FRONT_SPRITES_H #include "global.h" enum { TRAINER_FRONT_PIC_HIKER, TRAINER_FRONT_PIC_AQUA_GRUNT_M, TRAINER_FRONT_PIC_PKMN_BREEDER_F, TRAINER_FRONT_PIC_COOLTRAINER_M, TRAINER_FRONT_PIC_BIRD_KEEPER, TRAINER_FRONT_PIC_COLLECTOR, TRAINER_FRONT_PIC_AQUA_GRUNT_F, TRAINER_FRONT_PIC_SWIMMER_M, TRAINER_FRONT_PIC_MAGMA_GRUNT_M, TRAINER_FRONT_PIC_EXPERT_M, TRAINER_FRONT_PIC_AQUA_ADMIN_M, TRAINER_FRONT_PIC_BLACK_BELT, TRAINER_FRONT_PIC_AQUA_ADMIN_F, TRAINER_FRONT_PIC_AQUA_LEADER, TRAINER_FRONT_PIC_HEX_MANIAC, TRAINER_FRONT_PIC_AROMA_LADY, TRAINER_FRONT_PIC_RUIN_MANIAC, TRAINER_FRONT_PIC_INTERVIEWER, TRAINER_FRONT_PIC_TUBER_F, TRAINER_FRONT_PIC_TUBER_M, TRAINER_FRONT_PIC_COOLTRAINER_F, TRAINER_FRONT_PIC_LADY, TRAINER_FRONT_PIC_BEAUTY, TRAINER_FRONT_PIC_RICH_BOY, TRAINER_FRONT_PIC_EXPERT_F, TRAINER_FRONT_PIC_POKE_MANIAC, TRAINER_FRONT_PIC_MAGMA_GRUNT_F, TRAINER_FRONT_PIC_GUITARIST, TRAINER_FRONT_PIC_KINDLER, TRAINER_FRONT_PIC_CAMPER, TRAINER_FRONT_PIC_PICNICKER, TRAINER_FRONT_PIC_BUG_MANIAC, TRAINER_FRONT_PIC_PKMN_BREEDER_M, TRAINER_FRONT_PIC_PSYCHIC_M, TRAINER_FRONT_PIC_PSYCHIC_F, TRAINER_FRONT_PIC_GENTLEMAN, TRAINER_FRONT_PIC_SIDNEY, TRAINER_FRONT_PIC_PHOEBE, TRAINER_FRONT_PIC_GLACIA, TRAINER_FRONT_PIC_DRAKE, TRAINER_FRONT_PIC_ROXANNE, TRAINER_FRONT_PIC_BRAWLY, TRAINER_FRONT_PIC_WATTSON, TRAINER_FRONT_PIC_FLANNERY, TRAINER_FRONT_PIC_NORMAN, TRAINER_FRONT_PIC_WINONA, TRAINER_FRONT_PIC_TATE_LIZA, TRAINER_FRONT_PIC_JUAN, TRAINER_FRONT_PIC_SCHOOL_KID_M, TRAINER_FRONT_PIC_SCHOOL_KID_F, TRAINER_FRONT_PIC_SR_JR, TRAINER_FRONT_PIC_POKéFAN_M, TRAINER_FRONT_PIC_POKéFAN_F, TRAINER_FRONT_PIC_YOUNGSTER, TRAINER_FRONT_PIC_WALLACE, TRAINER_FRONT_PIC_FISHERMAN, TRAINER_FRONT_PIC_TRIATHLETE_BIKER_M, TRAINER_FRONT_PIC_TRIATHLETE_BIKER_F, TRAINER_FRONT_PIC_TRIATHLETE_JOGGER_M, TRAINER_FRONT_PIC_TRIATHLETE_JOGGER_F, TRAINER_FRONT_PIC_TRIATHLETE_SWIMMER_M, TRAINER_FRONT_PIC_TRIATHLETE_SWIMMER_F, TRAINER_FRONT_PIC_DRAGON_TAMER, TRAINER_FRONT_PIC_NINJA_BOY, TRAINER_FRONT_PIC_BATTLE_GIRL, TRAINER_FRONT_PIC_PARASOL_LADY, TRAINER_FRONT_PIC_SWIMMER_F, TRAINER_FRONT_PIC_TWINS, TRAINER_FRONT_PIC_SAILOR, TRAINER_FRONT_PIC_MAGMA_ADMIN_M, TRAINER_FRONT_PIC_WALLY, TRAINER_FRONT_PIC_BRENDAN_E, TRAINER_FRONT_PIC_MAY_E, TRAINER_FRONT_PIC_BUG_CATCHER, TRAINER_FRONT_PIC_PKMN_RANGER_M, TRAINER_FRONT_PIC_PKMN_RANGER_F, TRAINER_FRONT_PIC_MAGMA_LEADER, TRAINER_FRONT_PIC_LASS, TRAINER_FRONT_PIC_YOUNG_COUPLE, TRAINER_FRONT_PIC_OLD_COUPLE, TRAINER_FRONT_PIC_SIS_AND_BRO, TRAINER_FRONT_PIC_STEVEN, TRAINER_FRONT_PIC_ANABEL, TRAINER_FRONT_PIC_TUCKER, TRAINER_FRONT_PIC_SPENSER, TRAINER_FRONT_PIC_GRETA, TRAINER_FRONT_PIC_NOLAND, TRAINER_FRONT_PIC_LUCY, TRAINER_FRONT_PIC_BRANDON, TRAINER_FRONT_PIC_RED, TRAINER_FRONT_PIC_LEAF, TRAINER_FRONT_PIC_BRENDAN_RS, TRAINER_FRONT_PIC_MAY_RS }; #endif // GUARD_TRAINER_FRONT_SPRITES_H ================================================ FILE: include/trainer_ids.h ================================================ #ifndef GUARD_TRAINER_IDS_H #define GUARD_TRAINER_IDS_H #include "global.h" #define NO_OF_TRAINERS 854 #define TRAINER_ID_STEVEN 804 #endif // GUARD_TRAINER_IDS_H ================================================ FILE: include/trainer_pokemon_sprites.h ================================================ #ifndef GUARD_TRAINER_POKEMON_SPRITES_H #define GUARD_TRAINER_POKEMON_SPRITES_H #include "global.h" u16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId); bool16 ResetAllPicSprites(void); u16 CreateTrainerPicSprite(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag); u16 FreeAndDestroyMonPicSprite(u16); u16 FreeAndDestroyTrainerPicSprite(u16); u16 PlayerGenderToFrontTrainerPicId(u8 gender, bool8 getClass); u16 CreateMonPicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag); u16 LoadMonPicInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId); u16 CreateMonPicSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 ignoreDeoxys); u16 CreateMonPicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag); #endif // GUARD_TRAINER_POKEMON_SPRITES_H ================================================ FILE: include/trainer_see.h ================================================ #ifndef GUARD_TRAINER_SEE_H #define GUARD_TRAINER_SEE_H #include "global.h" bool8 CheckForTrainersWantingBattle(void); void MovementAction_RevealTrainer_RunTrainerSeeFuncList(struct ObjectEvent *var); u8 FldEff_ExclamationMarkIcon1(void); u8 FldEff_DoubleExclMarkIcon(void); u8 FldEff_XIcon(void); u8 FldEff_SmileyFaceIcon(void); u8 FldEff_QuestionMarkIcon(void); #endif //GUARD_TRAINER_SEE_H ================================================ FILE: include/trainer_tower.h ================================================ #ifndef GUARD_TRAINER_TOWER_H #define GUARD_TRAINER_TOWER_H void PrintTrainerTowerRecords(void); void InitTrainerTowerBattleStruct(void); void FreeTrainerTowerBattleStruct(void); u8 GetTrainerTowerTrainerFrontSpriteId(void); void ResetTrainerTowerResults(void); void GetTrainerTowerOpponentWinText(u8 *dest, u8 opponentIdx); void GetTrainerTowerOpponentLoseText(u8 *dest, u8 opponentIdx); void GetTrainerTowerOpponentName(u8 *text); u8 GetTrainerTowerOpponentClass(void); #endif //GUARD_TRAINER_TOWER_H ================================================ FILE: include/trig.h ================================================ #ifndef GUARD_TRIG_H #define GUARD_TRIG_H #include "global.h" extern const s16 gSineTable[]; s16 Sin(s16 index, s16 amplitude); s16 Cos(s16 index, s16 amplitude); s16 Sin2(u16 angle); s16 Cos2(u16 angle); #endif // GUARD_TRIG_H ================================================ FILE: include/union_room.h ================================================ #ifndef GUARD_UNION_ROOM_H #define GUARD_UNION_ROOM_H #include "global.h" #include "link_rfu.h" #include "constants/union_room.h" // In the Union Room the player is only ever connected to ≤ 4 other players. // However, there can be up to MAX_UNION_ROOM_LEADERS (8) object events to // represent leaders of recently discovered link groups, and each of those groups // may have up to MAX_RFU_PLAYERS (5) players in it including the leader. // These players are represented on-screen by NPC sprites drawn around the leader. // Thus there can be 40 sprites of other players on-screen, in 8 groups of 5. #define NUM_UNION_ROOM_SPRITES (MAX_UNION_ROOM_LEADERS * MAX_RFU_PLAYERS) // The maximum number of recently connected players that can be tracked. // Note that this is significantly less than NUM_UNION_ROOM_SPRITES, i.e. not // every player that can be shown in the Union Room can be tracked at once. // Information such as a group member's gender can instead be read from partnerInfo // of the leader's RfuGameData by tracking at least all of the group leaders. #define MAX_RFU_PLAYER_LIST_SIZE 16 struct RfuPlayerData { struct RfuGameData data; u8 ALIGNED(4) name[RFU_USER_NAME_LENGTH]; }; struct RfuPlayer { struct RfuPlayerData rfu; u16 timeoutCounter; u8 groupScheduledAnim:2; bool8 useRedText:1; // Never set u8 newPlayerCountdown; u8 unused; }; struct RfuPlayerList { struct RfuPlayer players[MAX_RFU_PLAYER_LIST_SIZE]; }; struct RfuIncomingPlayer { struct RfuPlayerData rfu; u8 active:1; }; struct RfuIncomingPlayerList { struct RfuIncomingPlayer players[MAX_RFU_PLAYERS]; }; struct WirelessLink_Leader { struct RfuPlayerList * playerList; struct RfuIncomingPlayerList * incomingPlayerList; struct RfuPlayerList * playerListBackup; u8 state; u8 textState; u8 delayTimerAfterOk; u8 listWindowId; u8 bButtonCancelWindowId; u8 nPlayerModeWindowId; u8 listTaskId; u8 playerCount; u16 yesNoWindowId; u8 unused; u8 listenTaskId; u8 activity; u8 joinRequestAnswer; u16 memberConfirmTimeout; }; struct WirelessLink_Group { struct RfuPlayerList * playerList; struct RfuIncomingPlayerList * incomingPlayerList; u8 state; u8 textState; u8 delayTimerAfterOk; // unused u8 listWindowId; u8 bButtonCancelWindowId; u8 playerNameAndIdWindowId; u8 listTaskId; u8 leaderId; u8 unused; u8 listenTaskId; bool8 isWonderNews; bool8 showListMenu; // referenced but never set u8 refreshTimer; u8 delayBeforePrint; }; struct UnionRoomObject { u8 state; u8 gfxId; s8 animState; u8 schedAnim; }; struct WirelessLink_URoom { struct RfuPlayerList * playerList; struct RfuIncomingPlayerList * incomingChildList; struct RfuPlayerList * spawnPlayer; struct RfuIncomingPlayerList * incomingParentList; u16 unknown; // Never read u16 unreadPlayerId; u8 state; u8 stateAfterPrint; u8 textState; u8 filler[4]; u8 topListMenuWindowId; u8 topListMenuId; u8 tradeBoardMainWindowId; u8 tradeBoardHeaderWindowId; u8 unused1; u8 searchTaskId; u8 spriteIds[NUM_UNION_ROOM_SPRITES]; u8 unused2; u8 tradeBoardListMenuId; // For communication with potential link partners u16 playerSendBuffer[6]; u8 activityRequestStrbufs[4][11]; u16 partnerYesNoResponse; u16 recvActivityRequest[3]; // activity[, species, level] struct UnionRoomObject objects[MAX_UNION_ROOM_LEADERS]; u8 trainerCardStrBuffer[12][15]; u8 trainerCardColorStrBuffer[48]; u8 trainerCardMsgStrBuffer[200]; }; struct UnionRoomTrade { u16 state; u16 type; u32 playerPersonality; u8 offerPlayerId; u16 playerSpecies; u16 playerLevel; u16 species; u16 level; u32 personality; }; extern struct RfuGameCompatibilityData gRfuPartnerCompatibilityData; extern u16 gUnionRoomOfferedSpecies; extern u8 gUnionRoomRequestedMonType; void StartUnionRoomBattle(u16 battleFlags); u8 CreateTask_CreateTradeMenu(void); #endif //GUARD_UNION_ROOM_H ================================================ FILE: include/union_room_battle.h ================================================ #ifndef GUARD_UNION_ROOM_BATTLE_H #define GUARD_UNION_ROOM_BATTLE_H void CB2_UnionRoomBattle(void); #endif //GUARD_UNION_ROOM_BATTLE_H ================================================ FILE: include/union_room_chat.h ================================================ #ifndef GUARD_UNION_ROOM_CHAT_H #define GUARD_UNION_ROOM_CHAT_H enum { UNION_ROOM_KB_PAGE_UPPER, UNION_ROOM_KB_PAGE_LOWER, UNION_ROOM_KB_PAGE_EMOJI, UNION_ROOM_KB_PAGE_COUNT }; extern const u8 *const gUnionRoomKeyboardText[UNION_ROOM_KB_PAGE_COUNT][UNION_ROOM_KB_ROW_COUNT]; void EnterUnionRoomChat(void); u8 *UnionRoomChat_GetWorkRegisteredText(int arg0); void UnionRoomChat_GetCursorColAndRow(u8 *colp, u8 *rowp); u8 *UnionRoomChat_GetMessageEntryBuffer(void); int UnionRoomChat_LenMessageEntryBuffer(void); void UnionRoomChat_GetBufferSelectionRegion(u32 *startp, u32 *diffp); u8 *UnionRoomChat_GetEndOfMessageEntryBuffer(void); u16 UnionRoomChat_GetNumCharsInMessageEntryBuffer(void); u8 *UnionRoomChat_GetLastReceivedMessage(void); u16 UnionRoomChat_GetReceivedPlayerIndex(void); int UnionRoomChat_GetMessageEntryCursorPosition(void); int UnionRoomChat_GetWhetherShouldShowCaseToggleIcon(void); u8 *UnionRoomChat_GetNameOfPlayerWhoDisbandedChat(void); void UnionRoomChat_InitializeRegisteredTexts(void); u8 GetCurrentKeyboardPage(void); #endif // GUARD_UNION_ROOM_CHAT_H ================================================ FILE: include/union_room_chat_display.h ================================================ #ifndef GUARD_UNION_ROOM_CHAT_DISPLAY_H #define GUARD_UNION_ROOM_CHAT_DISPLAY_H #define CHATDISPLAYROUTINE_LOADGFX 0 #define CHATDISPLAYROUTINE_MOVEKBCURSOR 1 #define CHATDISPLAYROUTINE_CURSORBLINK 2 #define CHATDISPLAYROUTINE_SHOWKBSWAPMENU 3 #define CHATDISPLAYROUTINE_HIDEKBSWAPMENU 4 #define CHATDISPLAYROUTINE_SWITCHPAGES 5 #define CHATDISPLAYROUTINE_SHOWQUITCHATTINGDIALOG 6 #define CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO 7 #define CHATDISPLAYROUTINE_PRINTMSG 8 #define CHATDISPLAYROUTINE_PRINTREGISTERWHERE 9 #define CHATDISPLAYROUTINE_CANCELREGISTER 10 #define CHATDISPLAYROUTINE_RETURNTOKB 11 #define CHATDISPLAYROUTINE_SCROLLCHAT 12 #define CHATDISPLAYROUTINE_PRINTINPUTTEXT 13 #define CHATDISPLAYROUTINE_ASKSAVE 14 #define CHATDISPLAYROUTINE_ASKOVERWRITESAVE 15 #define CHATDISPLAYROUTINE_PRINTSAVING 16 #define CHATDISPLAYROUTINE_PRINTSAVEDTHEGAME 17 #define CHATDISPLAYROUTINE_PRINTEXITINGCHAT 18 #define CHATDISPLAYROUTINE_PRINTLEADERLEFT 19 #define CHATDISPLAYROUTINE_SHOWCONFIRMLEADERLEAVEDIALOG 20 bool8 UnionRoomChat_TryAllocGraphicsWork(void); bool32 UnionRoomChat_RunDisplaySubtask0(void); void UnionRoomChat_FreeGraphicsWork(void); void UnionRoomChat_RunDisplaySubtasks(void); void UnionRoomChat_StartDisplaySubtask(u16 a0, u8 a1); u8 RunDisplaySubtask(u8 a0); s8 UnionRoomChat_ProcessInput(void); #endif //GUARD_UNION_ROOM_CHAT_DISPLAY_H ================================================ FILE: include/union_room_chat_objects.h ================================================ #ifndef GUARD_UNION_ROOM_CHAT_OBJECTS_H #define GUARD_UNION_ROOM_CHAT_OBJECTS_H bool32 UnionRoomChat_TryAllocSpriteWork(void); void UnionRoomChat_FreeSpriteWork(void); void UnionRoomChat_CreateSelectorCursorObj(void); void UnionRoomChat_ToggleSelectorCursorObjVisibility(bool32 invisible); void UnionRoomChat_MoveSelectorCursorObj(void); void UnionRoomChat_UpdateObjPalCycle(u32 idx); void UnionRoomChat_SetSelectorCursorClosedImage(void); bool32 UnionRoomChat_AnimateSelectorCursorReopen(void); void UnionRoomChat_SpawnTextEntryPointerSprites(void); void CreatePageSwitchUISprites(void); void UpdateVisibleUnionRoomChatIcon(void); #endif //GUARD_UNION_ROOM_CHAT_OBJECTS_H ================================================ FILE: include/union_room_message.h ================================================ #ifndef GUARD_UNION_ROOM_MESSAGE_H #define GUARD_UNION_ROOM_MESSAGE_H #include "global.h" extern const u8 gText_UR_EmptyString[]; extern const u8 gText_UR_Colon[]; extern const u8 gText_UR_ID[]; extern const u8 gText_UR_PleaseStartOver[]; extern const u8 gText_UR_WirelessSearchCanceled[]; extern const u8 gText_UR_AwaitingCommunication[]; extern const u8 gText_UR_AwaitingLinkPressStart[]; extern const u8 *const gTexts_UR_PlayersNeededOrMode[][5]; extern const u8 gText_UR_BButtonCancel[]; extern const u8 gText_UR_PlayerContactedYouForXAccept[]; extern const u8 gText_UR_PlayerContactedYouShareX[]; extern const u8 gText_UR_PlayerContactedYouAddToMembers[]; extern const u8 gText_UR_AreTheseMembersOK[]; extern const u8 gText_UR_CancelModeWithTheseMembers[]; extern const u8 gText_UR_AnOKWasSentToPlayer[]; extern const u8 *const gTexts_UR_CantTransmitToTrainer[]; extern const u8 gText_UR_ModeWithTheseMembersWillBeCanceled[]; extern const u8 *const gTexts_UR_PlayerUnavailable[]; extern const u8 gText_UR_PlayerSentBackOK[]; extern const u8 gText_UR_PlayerOKdRegistration[]; extern const u8 gText_UR_AwaitingOtherMembers[]; extern const u8 gText_UR_QuitBeingMember[]; extern const u8 *const gTexts_UR_PlayerDisconnected[]; extern const u8 gText_UR_WirelessLinkEstablished[]; extern const u8 gText_UR_WirelessLinkDropped[]; extern const u8 gText_UR_LinkWithFriendDropped[]; extern const u8 *const gTexts_UR_LinkDropped[]; extern const u8 gText_UR_AwaitingPlayersResponseAboutTrade[]; extern const u8 *const gTexts_UR_CommunicatingWait[]; extern const u8 *const gTexts_UR_HiDoSomething[][GENDER_COUNT]; extern const u8 *const gTexts_UR_PlayerContactedYou[]; extern const u8 *const gTexts_UR_AwaitingResponse[]; extern const u8 gText_UR_ShowTrainerCard[]; extern const u8 gText_UR_BattleChallenge[]; extern const u8 gText_UR_ChatInvitation[]; extern const u8 gText_UR_OfferToTradeMon[]; extern const u8 gText_UR_OfferToTradeEgg[]; extern const u8 gText_UR_ChatDropped[]; extern const u8 gText_UR_OfferDeclined1[]; extern const u8 gText_UR_OfferDeclined2[]; extern const u8 gText_UR_ChatEnded[]; extern const u8 *const gTexts_UR_JoinChat[][GENDER_COUNT]; extern const u8 gText_UR_TrainerAppearsBusy[]; extern const u8 *const gTexts_UR_WaitOrShowCard[GENDER_COUNT][4]; extern const u8 *const gTexts_UR_StartActivity[][GENDER_COUNT][3]; extern const u8 *const gTexts_UR_BattleDeclined[GENDER_COUNT]; extern const u8 *const gTexts_UR_ShowTrainerCardDeclined[GENDER_COUNT]; extern const u8 *const gTexts_UR_IfYouWantToDoSomething[GENDER_COUNT]; extern const u8 gText_UR_TrainerBattleBusy[]; extern const u8 gText_UR_NeedTwoMonsOfLevel30OrLower1[]; extern const u8 gText_UR_NeedTwoMonsOfLevel30OrLower2[]; extern const u8 *const gTexts_UR_DeclineChat[GENDER_COUNT]; extern const u8 *const gTexts_UR_ChatDeclined[GENDER_COUNT]; extern const u8 *const gTexts_UR_BattleReaction[GENDER_COUNT][4]; extern const u8 *const gTexts_UR_ChatReaction[GENDER_COUNT][4]; extern const u8 *const gTexts_UR_TrainerCardReaction[GENDER_COUNT][2]; extern const u8 *const gTexts_UR_TradeReaction[GENDER_COUNT][4]; extern const u8 gText_UR_XCheckedTradingBoard[]; extern const u8 gText_UR_RegisterMonAtTradingBoard[]; extern const u8 gText_UR_TradingBoardInfo[]; extern const u8 gText_UR_ChooseRequestedMonType[]; extern const u8 gText_UR_WhichMonWillYouOffer[]; extern const u8 gText_UR_RegistrationCanceled[]; extern const u8 gText_UR_RegistraionCompleted[]; extern const u8 gText_UR_TradeCanceled[]; extern const u8 gText_UR_CancelRegistrationOfMon[]; extern const u8 gText_UR_CancelRegistrationOfEgg[]; extern const u8 gText_UR_RegistrationCanceled2[]; extern const u8 gText_UR_AskTrainerToMakeTrade[]; extern const u8 gText_UR_DontHaveTypeTrainerWants[]; extern const u8 gText_UR_DontHaveEggTrainerWants[]; extern const u8 gText_UR_TradeOfferRejected[]; extern const u8 gText_UR_EggTrade[]; extern const u8 gText_UR_ChooseJoinCancel[]; extern const u8 gText_UR_ChooseTrainer[]; extern const u8 gText_UR_SearchingForWirelessSystemWait[]; extern const u8 *const gTexts_UR_ChooseTrainer[]; extern const u8 gText_UR_AwaitingPlayersResponse[]; extern const u8 gText_UR_PlayerHasBeenAskedToRegisterYouPleaseWait[]; extern const u8 gText_UR_AwaitingResponseFromWirelessSystem[]; extern const u8 *const gTexts_UR_NoWonderShared[]; extern const u8 gText_UR_Battle[]; extern const u8 gText_UR_Chat2[]; extern const u8 gText_UR_Greetings[]; extern const u8 gText_UR_Exit[]; extern const u8 gText_UR_Exit2[]; extern const u8 gText_UR_Info[]; extern const u8 gText_UR_NameWantedOfferLv[]; extern const u8 gText_UR_SingleBattle[]; extern const u8 gText_UR_DoubleBattle[]; extern const u8 gText_UR_MultiBattle[]; extern const u8 gText_UR_PokemonTrades[]; extern const u8 gText_UR_Chat[]; extern const u8 gText_UR_WonderCards[]; extern const u8 gText_UR_WonderNews[]; extern const u8 gText_UR_Cards[]; extern const u8 gText_UR_PokemonJump[]; extern const u8 gText_UR_BerryCrush[]; extern const u8 gText_UR_BerryPicking[]; extern const u8 gText_UR_Search[]; extern const u8 gText_UR_SpinTrade[]; extern const u8 gText_UR_ItemTrade[]; extern const u8 *const gTexts_UR_CardColor[]; extern const u8 gText_UR_TrainerCardInfoPage1[]; extern const u8 gText_UR_TrainerCardInfoPage2[]; extern const u8 *const gTexts_UR_GladToMeetYou[GENDER_COUNT]; extern const u8 gText_UR_FinishedCheckingPlayersTrainerCard[]; #endif //GUARD_UNION_ROOM_MESSAGE_H ================================================ FILE: include/union_room_player_avatar.h ================================================ #ifndef GUARD_UNION_ROOM_PLAYER_AVATAR_H #define GUARD_UNION_ROOM_PLAYER_AVATAR_H #include "union_room.h" u8 InitUnionRoomPlayerObjects(struct UnionRoomObject * players); void DestroyUnionRoomPlayerObjects(void); void CreateUnionRoomPlayerSprites(u8 *spriteIds, s32 leaderId); void DestroyUnionRoomPlayerSprites(u8 *spriteIds); void MakeGroupAssemblyAreasPassable(void); void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom); void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom); bool32 TryInteractWithUnionRoomMember(struct RfuPlayerList *list, s16 *memberIdPtr, s16 *leaderIdPtr, u8 *spriteIds); void UpdateUnionRoomMemberFacing(u32 memberId, u32 leaderId, struct RfuPlayerList *list); #endif //GUARD_UNION_ROOM_PLAYER_AVATAR_H ================================================ FILE: include/util.h ================================================ #ifndef GUARD_UTIL_H #define GUARD_UTIL_H #include "global.h" #include "sprite.h" extern const u8 gMiscBlank_Gfx[]; // unused in Emerald extern const u32 gBitTable[]; u8 CreateInvisibleSpriteWithCallback(void (*)(struct Sprite *)); void StoreWordInTwoHalfwords(u16 *, unsigned); void LoadWordFromTwoHalfwords(u16 *, unsigned *); int CountTrailingZeroBits(u32 value); u16 CalcCRC16(const u8 *data, u32 length); u16 CalcCRC16WithTable(const u8 *data, u32 length); u32 CalcByteArraySum(const u8 *data, u32 length); void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); void DoBgAffineSet(struct BgAffineDstData * dest, u32 texX, u32 texY, s16 srcX, s16 srcY, s16 sx, s16 sy, u16 alpha); #endif // GUARD_UTIL_H ================================================ FILE: include/vs_seeker.h ================================================ #ifndef GUARD_VS_SEEKER_H #define GUARD_VS_SEEKER_H #include "global.h" void Task_VsSeeker_0(u8 taskId); void ClearRematchStateByTrainerId(void); void ClearRematchStateOfLastTalked(void); int GetRematchTrainerId(u16 trainerId); bool8 UpdateVsSeekerStepCounter(void); void MapResetTrainerRematches(u16 mapGroup, u16 mapNum); #endif //GUARD_VS_SEEKER_H ================================================ FILE: include/wild_encounter.h ================================================ #ifndef GUARD_WILD_ENCOUNTER_H #define GUARD_WILD_ENCOUNTER_H #include "global.h" #define LAND_WILD_COUNT 12 #define WATER_WILD_COUNT 5 #define ROCK_WILD_COUNT 5 #define FISH_WILD_COUNT 10 #define NUM_ALTERING_CAVE_TABLES 9 struct WildPokemon { u8 minLevel; u8 maxLevel; u16 species; }; struct WildPokemonInfo { u8 encounterRate; const struct WildPokemon *wildPokemon; }; struct WildPokemonHeader { u8 mapGroup; u8 mapNum; const struct WildPokemonInfo *landMonsInfo_FR; const struct WildPokemonInfo *landMonsInfo_LG; const struct WildPokemonInfo *waterMonsInfo_FR; const struct WildPokemonInfo *waterMonsInfo_LG; const struct WildPokemonInfo *rockSmashMonsInfo_FR; const struct WildPokemonInfo *rockSmashMonsInfo_LG; const struct WildPokemonInfo *fishingMonsInfo_FR; const struct WildPokemonInfo *fishingMonsInfo_LG; }; extern const struct WildPokemonHeader gWildMonHeaders[]; void DisableWildEncounters(bool8 disabled); bool8 StandardWildEncounter(u32 currMetatileAttrs, u16 previousMetaTileBehavior); bool8 SweetScentWildEncounter(void); bool8 DoesCurrentMapHaveFishingMons(void); void FishingWildEncounter(u8 rod); u16 GetLocalWildMon(bool8 *isWaterMon); u16 GetLocalWaterMon(void); bool8 UpdateRepelCounter(void); void DisableWildEncounters(bool8 state); u8 GetUnownLetterByPersonalityLoByte(u32 personality); bool8 SweetScentWildEncounter(void); void SeedWildEncounterRng(u16 randVal); void ResetEncounterRateModifiers(void); bool8 TryStandardWildEncounter(u32 currMetatileAttrs); #endif // GUARD_WILD_ENCOUNTER_H ================================================ FILE: include/wild_pokemon_area.h ================================================ #ifndef GUARD_WILD_POKEMON_AREA_H #define GUARD_WILD_POKEMON_AREA_H s32 GetSpeciesPokedexAreaMarkers(u16 species, struct Subsprite * subsprites); #endif //GUARD_WILD_POKEMON_AREA_H ================================================ FILE: include/window.h ================================================ #ifndef GUARD_WINDOW_H #define GUARD_WINDOW_H #include "global.h" #define PIXEL_FILL(num) ((num) | ((num) << 4)) enum { WINDOW_BG, WINDOW_TILEMAP_LEFT, WINDOW_TILEMAP_TOP, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_PALETTE_NUM, WINDOW_BASE_BLOCK, WINDOW_TILE_DATA }; // Mode for CopyWindowToVram, CopyWindowRectToVram and CopyWindowToVram8Bit enum { COPYWIN_NONE, COPYWIN_MAP, COPYWIN_GFX, COPYWIN_FULL, }; struct WindowTemplate { u8 bg; u8 tilemapLeft; u8 tilemapTop; u8 width; u8 height; u8 paletteNum; u16 baseBlock; }; #define WINDOWS_MAX 32 #define DUMMY_WIN_TEMPLATE \ { \ 0xFF, \ 0, \ 0, \ 0, \ 0, \ 0, \ 0, \ } #define WINDOW_NONE 0xFF struct Window { struct WindowTemplate window; u8 *tileData; }; typedef void (*WindowFunc)(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); bool16 InitWindows(const struct WindowTemplate *templates); u16 AddWindow(const struct WindowTemplate *template); int AddWindowWithoutTileMap(const struct WindowTemplate *template); void RemoveWindow(u8 windowId); void FreeAllWindowBuffers(void); void CopyWindowToVram(u8 windowId, u8 mode); void CopyWindowToVram8Bit(u8 windowId, u8 mode); void PutWindowTilemap(u8 windowId); void PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 palette); void ClearWindowTilemap(u8 windowId); void PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height); void BlitBitmapToWindow(u8 windowId, const u8 *pixels, u16 x, u16 y, u16 width, u16 height); void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight); void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height); void CopyToWindowPixelBuffer(u8 windowId, const void *src, u16 size, u16 tileOffset); void FillWindowPixelBuffer(u8 windowId, u8 fillValue); void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue); void CallWindowFunction(u8 windowId, WindowFunc func); bool8 SetWindowAttribute(u8 windowId, u8 attributeId, u32 value); u32 GetWindowAttribute(u8 windowId, u8 attributeId); u16 AddWindow8Bit(const struct WindowTemplate *template); void FillWindowPixelBuffer8Bit(u8 windowId, u8 fillValue); void FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height); void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum); extern void *gWindowBgTilemapBuffers[]; extern struct Window gWindows[]; #endif // GUARD_WINDOW_H ================================================ FILE: include/wonder_news.h ================================================ #ifndef GUARD_WONDER_NEWS_H #define GUARD_WONDER_NEWS_H #include "global.h" enum { WONDER_NEWS_NONE, WONDER_NEWS_RECV_FRIEND, WONDER_NEWS_RECV_WIRELESS, WONDER_NEWS_SENT, }; void WonderNews_SetReward(u32 newsType); void WonderNews_Reset(void); void WonderNews_IncrementStepCounter(void); #endif //GUARD_WONDER_NEWS_H ================================================ FILE: json_data_rules.mk ================================================ # JSON files are run through jsonproc, which is a tool that converts JSON data to an output file # based on an Inja template. https://github.com/pantor/inja AUTO_GEN_TARGETS += $(DATA_C_SUBDIR)/items.h $(DATA_C_SUBDIR)/items.h: $(DATA_C_SUBDIR)/items.json $(DATA_C_SUBDIR)/items.json.txt $(JSONPROC) $^ $@ $(C_BUILDDIR)/item.o: c_dep += $(DATA_C_SUBDIR)/items.h AUTO_GEN_TARGETS += $(DATA_C_SUBDIR)/region_map/region_map_entry_strings.h $(DATA_C_SUBDIR)/region_map/region_map_entry_strings.h: $(DATA_C_SUBDIR)/region_map/region_map_sections.json $(DATA_C_SUBDIR)/region_map/region_map_sections.strings.json.txt $(JSONPROC) $^ $@ $(C_BUILDDIR)/region_map.o: c_dep += $(DATA_C_SUBDIR)/region_map/region_map_entry_strings.h AUTO_GEN_TARGETS += $(DATA_C_SUBDIR)/region_map/region_map_entries.h $(DATA_C_SUBDIR)/region_map/region_map_entries.h: $(DATA_C_SUBDIR)/region_map/region_map_sections.json $(DATA_C_SUBDIR)/region_map/region_map_sections.entries.json.txt $(JSONPROC) $^ $@ $(C_BUILDDIR)/region_map.o: c_dep += $(DATA_C_SUBDIR)/region_map/region_map_entries.h ================================================ FILE: ld_script.ld ================================================ gNumMusicPlayers = 4; gMaxLines = 0; SECTIONS { . = 0x2000000; ewram (NOLOAD) : ALIGN(4) { gHeap = .; . = 0x1C000; INCLUDE "sym_ewram.ld" src/*.o(ewram_data); *libc.a:impure.o(.data); *libc.a:locale.o(.data); *libc.a:mallocr.o(.data); . = 0x40000; } . = 0x3000000; iwram (NOLOAD) : ALIGN(4) { /* .bss starts at 0x3000000 */ INCLUDE "sym_bss.ld" src/*.o(.bss); data/*.o(.bss); /* .bss.code starts at 0x30028E0 */ src/m4a.o(.bss.code); /* COMMON starts at 0x30030E0 */ INCLUDE "sym_common.ld" *libc.a:sbrkr.o(COMMON); end = .; . = 0x8000; } . = 0x8000000; .text : ALIGN(4) { src/rom_header.o(.text); src/rom_header_gf.o(.text*); src/crt0.o(.text); src/main.o(.text); src/gpu_regs.o(.text); src/dma3_manager.o(.text); src/bg.o(.text); src/malloc.o(.text); src/text_printer.o(.text); src/window.o(.text); src/blit.o(.text); src/window_8bpp.o(.text); src/text.o(.text); src/sprite.o(.text); src/string_util.o(.text); src/link.o(.text); src/multiboot.o(.text); src/main_menu.o(.text); src/battle_controllers.o(.text); src/decompress.o(.text); src/battle_bg.o(.text); src/battle_main.o(.text); src/battle_util.o(.text); src/battle_script_commands.o(.text); src/battle_util2.o(.text); src/battle_controller_player.o(.text); src/battle_gfx_sfx_util.o(.text); src/battle_controller_opponent.o(.text); src/battle_ai_switch_items.o(.text); src/battle_controller_link_opponent.o(.text); src/pokemon.o(.text); src/trig.o(.text); src/random.o(.text); src/util.o(.text); src/blend_palette.o(.text); src/daycare.o(.text); src/battle_interface.o(.text); src/battle_anim_smokescreen.o(.text); src/pokeball.o(.text); src/load_save.o(.text); src/trade.o(.text); src/trade_scene.o(.text); src/play_time.o(.text); src/new_game.o(.text); src/overworld.o(.text); src/fieldmap.o(.text); src/metatile_behavior.o(.text); src/field_camera.o(.text); src/field_door.o(.text); src/field_player_avatar.o(.text); src/event_object_movement.o(.text); src/field_message_box.o(.text); src/event_object_lock.o(.text); src/text_window_graphics.o(.text); src/script.o(.text); src/scrcmd.o(.text); src/field_control_avatar.o(.text); src/event_data.o(.text); src/coord_event_weather.o(.text); src/field_tasks.o(.text); src/start_menu.o(.text); src/tileset_anims.o(.text); src/palette.o(.text); src/sound.o(.text); src/battle_anim.o(.text); src/battle_anim_mons.o(.text); src/task.o(.text); src/reshow_battle_screen.o(.text); src/battle_anim_status_effects.o(.text); src/title_screen.o(.text); src/reset_save_heap.o(.text); src/field_weather.o(.text); src/field_weather_util.o(.text); src/field_weather_effects.o(.text); src/field_fadetransition.o(.text); src/field_screen_effect.o(.text); src/battle_setup.o(.text); src/cable_club.o(.text); src/trainer_see.o(.text); src/wild_encounter.o(.text); src/field_effect.o(.text); src/scanline_effect.o(.text); src/option_menu.o(.text); src/pokedex.o(.text); src/trainer_card.o(.text); src/pokemon_storage_system.o(.text); src/pokemon_storage_system_menu.o(.text); src/pokemon_storage_system_tasks.o(.text); src/pokemon_storage_system_graphics.o(.text); src/pokemon_storage_system_data.o(.text); src/pokemon_storage_system_misc.o(.text); src/pokemon_icon.o(.text); src/script_movement.o(.text); src/fldeff_cut.o(.text); src/mail_data.o(.text); src/map_name_popup.o(.text); src/item_menu_icons.o(.text); src/battle_anim_mon_movement.o(.text); src/item.o(.text); src/shop.o(.text); src/special_field_anim.o(.text); src/berry.o(.text); src/script_menu.o(.text); src/naming_screen.o(.text); src/money.o(.text); src/script_pokemon_util.o(.text); src/field_poison.o(.text); src/pokemon_size_record.o(.text); src/pc_screen_effect.o(.text); src/fldeff_poison.o(.text); src/fldeff_berrytree.o(.text); src/field_special_scene.o(.text); src/safari_zone.o(.text); src/item_use.o(.text); src/battle_anim_effects_1.o(.text); src/battle_anim_effects_2.o(.text); src/battle_anim_water.o(.text); src/battle_anim_fire.o(.text); src/battle_anim_electric.o(.text); src/battle_anim_ice.o(.text); src/battle_anim_fight.o(.text); src/battle_anim_poison.o(.text); src/battle_anim_flying.o(.text); src/battle_anim_psychic.o(.text); src/battle_anim_bug.o(.text); src/battle_anim_rock.o(.text); src/battle_anim_ghost.o(.text); src/battle_anim_dragon.o(.text); src/battle_anim_dark.o(.text); src/battle_anim_ground.o(.text); src/battle_anim_normal.o(.text); src/battle_anim_utility_funcs.o(.text); src/battle_intro.o(.text); src/bike.o(.text); src/easy_chat.o(.text); src/mon_markings.o(.text); src/mail.o(.text); src/menu_helpers.o(.text); src/party_menu_specials.o(.text); src/heal_location.o(.text); src/region_map.o(.text); src/image_processing_effects.o(.text); src/battle_ai_script_commands.o(.text); src/fldeff_rocksmash.o(.text); src/fldeff_dig.o(.text); src/fldeff_flash.o(.text); src/post_battle_event_funcs.o(.text); src/prof_pc.o(.text); src/hof_pc.o(.text); src/field_specials.o(.text); src/battle_records.o(.text); src/evolution_scene.o(.text); src/coins.o(.text); src/fldeff_strength.o(.text); src/battle_transition.o(.text); src/battle_controller_link_partner.o(.text); src/battle_message.o(.text); src/math_util.o(.text); src/palette_util.o(.text); src/cable_car_util.o(.text); src/save.o(.text); src/mystery_event_script.o(.text); src/field_effect_helpers.o(.text); src/battle_anim_sound_tasks.o(.text); src/battle_controller_safari.o(.text); src/fldeff_sweetscent.o(.text); src/battle_anim_effects_3.o(.text); src/learn_move.o(.text); src/fldeff_softboiled.o(.text); src/battle_tower.o(.text); src/battle_controller_oak_old_man.o(.text); src/player_pc.o(.text); src/intro.o(.text); src/battle_anim_special.o(.text); src/hall_of_fame.o(.text); src/credits.o(.text); src/diploma.o(.text); src/save_failed_screen.o(.text); src/clear_save_data_screen.o(.text); src/evolution_graphics.o(.text); src/fldeff_teleport.o(.text); src/new_menu_helpers.o(.text); src/tilemap_util.o(.text); src/save_menu_util.o(.text); src/map_preview_screen.o(.text); src/link_rfu_2.o(.text); src/link_rfu_3.o(.text); src/AgbRfu_LinkManager.o(.text); src/easy_chat_2.o(.text); src/easy_chat_3.o(.text); src/pokedex_screen.o(.text); src/list_menu.o(.text); src/item_menu.o(.text); src/save_location.o(.text); src/bag.o(.text); src/trainer_pokemon_sprites.o(.text); src/vs_seeker.o(.text); src/item_pc.o(.text); src/mailbox_pc.o(.text); src/menu.o(.text); src/quest_log.o(.text); src/help_message.o(.text); src/trainer_fan_club.o(.text); src/quest_log_events.o(.text); src/union_room.o(.text); src/union_room_player_avatar.o(.text); src/union_room_battle.o(.text); src/pokemon_special_anim.o(.text); src/pokemon_special_anim_scene.o(.text); src/party_menu.o(.text); src/union_room_chat.o(.text); src/union_room_chat_display.o(.text); src/union_room_chat_objects.o(.text); src/help_system.o(.text); src/quest_log_battle.o(.text); src/fame_checker.o(.text); src/menu2.o(.text); src/oak_speech.o(.text); src/tm_case.o(.text); src/menu_indicators.o(.text); src/pokedex_area_markers.o(.text); src/pokemon_summary_screen.o(.text); src/help_system_util.o(.text); src/wild_pokemon_area.o(.text); src/dynamic_placeholder_text_util.o(.text); src/berry_pouch.o(.text); src/itemfinder.o(.text); src/buy_menu_helpers.o(.text); src/slot_machine.o(.text); src/roamer.o(.text); src/mystery_gift_menu.o(.text); src/ereader_screen.o(.text); src/mystery_gift.o(.text); src/mystery_gift_link.o(.text); src/mystery_gift_client.o(.text); src/mystery_gift_server.o(.text); src/mystery_gift_show_card.o(.text); src/mystery_gift_show_news.o(.text); src/wonder_news.o(.text); src/seagallop.o(.text); src/pokemon_jump.o(.text); src/berry_crush.o(.text); src/wireless_communication_status_screen.o(.text); src/braille_text.o(.text); src/text_window.o(.text); src/quest_log_player.o(.text); src/dodrio_berry_picking.o(.text); src/battle_controller_pokedude.o(.text); src/quest_log_objects.o(.text); src/dodrio_berry_picking_comm.o(.text); src/teachy_tv.o(.text); src/ereader_helpers.o(.text); src/digit_obj_util.o(.text); src/ss_anne.o(.text); src/cereader_tool.o(.text); src/renewable_hidden_items.o(.text); src/trainer_tower.o(.text); src/berry_powder.o(.text); src/minigame_countdown.o(.text); src/berry_fix_program.o(.text); src/cable_car.o(.text); } =0 script_data : ALIGN(4) { data/event_scripts.o(script_data); data/battle_anim_scripts.o(script_data); data/battle_scripts_1.o(script_data); data/field_effect_scripts.o(script_data); data/battle_scripts_2.o(script_data); data/battle_ai_scripts.o(script_data); data/mystery_event_script_cmd_table.o(script_data); } =0 lib_text : ALIGN(4) { src/libgcnmultiboot.o(.text); src/m4a_1.o(.text); src/m4a.o(.text); src/agb_flash.o(.text); src/agb_flash_1m.o(.text); src/agb_flash_mx.o(.text); src/agb_flash_le.o(.text); src/librfu_stwi.o(.text); src/librfu_intr.o(.text); src/librfu_rfu.o(.text); src/librfu_sio32id.o(.text); src/isagbprn.o(.text); src/libagbsyscall.o(.text); *libgcc.a:_call_via_rX.o(.text); *libgcc.a:_divdi3.o(.text); *libgcc.a:_divsi3.o(.text); *libgcc.a:_dvmd_tls.o(.text); *libgcc.a:_fixunsdfsi.o(.text); *libgcc.a:_modsi3.o(.text); *libgcc.a:_muldi3.o(.text); *libgcc.a:_udivdi3.o(.text); *libgcc.a:_udivsi3.o(.text); *libgcc.a:_umodsi3.o(.text); *libgcc.a:dp-bit.o(.text); *libgcc.a:fp-bit.o(.text); *libgcc.a:_lshrdi3.o(.text); *libgcc.a:_negdi2.o(.text); *libc.a:memcpy.o(.text); *libc.a:memset.o(.text); *libc.a:strcmp.o(.text); *libc.a:strcpy.o(.text); *libc.a:impure.o(.text); *libc.a:vsprintf.o(.text); *libc.a:vfprintf.o(.text); *libc.a:wsetup.o(.text); *libc.a:dtoa.o(.text); *libc.a:fflush.o(.text); *libc.a:findfp.o(.text); *libc.a:freer.o(.text); *libc.a:mtrim.o(.text); *libc.a:fvwrite.o(.text); *libc.a:fwalk.o(.text); *libc.a:locale.o(.text); *libc.a:makebuf.o(.text); *libc.a:mallocr.o(.text); *libc.a:mbtowc_r.o(.text); *libc.a:memchr.o(.text); *libc.a:memmove.o(.text); *libc.a:mlock.o(.text); *libc.a:mprec.o(.text); *libc.a:s_isinf.o(.text); *libc.a:s_isnan.o(.text); *libc.a:sbrkr.o(.text); *libc.a:stdio.o(.text); *libc.a:strlen.o(.text); *libc.a:syscalls.o(.text); *libc.a:writer.o(.text); *libc.a:callocr.o(.text); *libc.a:closer.o(.text); *libc.a:errno.o(.text); *libc.a:fstatr.o(.text); *libc.a:libcfunc.o(.text); *libc.a:lseekr.o(.text); *libc.a:readr.o(.text); } =0 .rodata : SUBALIGN(4) { src/main.o(.rodata); src/bg.o(.rodata); src/malloc.o(.rodata); src/malloc.o(.rodata.str1.4); src/text_printer.o(.rodata); src/window.o(.rodata); src/text.o(.rodata); src/sprite.o(.rodata); src/bg_regs.o(.rodata); src/string_util.o(.rodata); src/link.o(.rodata); src/main_menu.o(.rodata); src/data.o(.rodata); src/battle_bg.o(.rodata); src/battle_main.o(.rodata); src/battle_util.o(.rodata); src/battle_script_commands.o(.rodata); src/battle_controller_player.o(.rodata); src/battle_anim_smokescreen.o(.rodata); src/battle_controller_opponent.o(.rodata); src/battle_controller_link_opponent.o(.rodata); src/pokemon.o(.rodata); src/trig.o(.rodata); src/util.o(.rodata); src/daycare.o(.rodata); src/battle_gfx_sfx_util.o(.rodata); src/battle_interface.o(.rodata); src/pokeball.o(.rodata); src/trade.o(.rodata); src/trade_scene.o(.rodata); src/overworld.o(.rodata); src/tilesets.o(.rodata); data/maps.o(.rodata); src/fieldmap.o(.rodata); src/metatile_behavior.o(.rodata); src/field_door.o(.rodata); src/field_player_avatar.o(.rodata); src/event_object_movement.o(.rodata); src/scrcmd.o(.rodata); src/coord_event_weather.o(.rodata); src/field_tasks.o(.rodata); src/start_menu.o(.rodata); src/tileset_anims.o(.rodata); src/palette.o(.rodata); src/sound.o(.rodata); src/battle_anim.o(.rodata); src/battle_anim_mons.o(.rodata); data/map_events.o(.rodata); src/battle_anim_status_effects.o(.rodata); src/title_screen.o(.rodata); src/field_weather.o(.rodata); src/field_weather_util.o(.rodata); src/field_weather_effects.o(.rodata); src/field_screen_effect.o(.rodata); src/battle_setup.o(.rodata); src/cable_club.o(.rodata); src/trainer_see.o(.rodata); src/wild_encounter.o(.rodata); src/field_effect.o(.rodata); src/option_menu.o(.rodata); src/trainer_card.o(.rodata); src/pokemon_storage_system_menu.o(.rodata); src/pokemon_storage_system_tasks.o(.rodata); src/pokemon_storage_system_graphics.o(.rodata); src/pokemon_storage_system_data.o(.rodata); src/pokemon_storage_system_misc.o(.rodata); src/pokemon_icon.o(.rodata); src/fldeff_cut.o(.rodata); src/map_name_popup.o(.rodata); src/item_menu_icons.o(.rodata); src/battle_anim_mon_movement.o(.rodata); src/item.o(.rodata); src/shop.o(.rodata); src/special_field_anim.o(.rodata); src/berry.o(.rodata); src/script_menu.o(.rodata); src/naming_screen.o(.rodata); src/pokemon_size_record.o(.rodata); src/item_use.o(.rodata); src/battle_anim_effects_1.o(.rodata); src/battle_anim_effects_2.o(.rodata); src/battle_anim_water.o(.rodata); src/battle_anim_fire.o(.rodata); src/battle_anim_electric.o(.rodata); src/battle_anim_ice.o(.rodata); src/battle_anim_fight.o(.rodata); src/battle_anim_poison.o(.rodata); src/battle_anim_flying.o(.rodata); src/battle_anim_psychic.o(.rodata); src/battle_anim_bug.o(.rodata); src/battle_anim_rock.o(.rodata); src/battle_anim_ghost.o(.rodata); src/battle_anim_dragon.o(.rodata); src/battle_anim_dark.o(.rodata); src/battle_anim_ground.o(.rodata); src/battle_anim_normal.o(.rodata); src/battle_anim_utility_funcs.o(.rodata); src/battle_intro.o(.rodata); src/bike.o(.rodata); src/easy_chat.o(.rodata); src/mon_markings.o(.rodata); src/mail.o(.rodata); src/heal_location.o(.rodata); src/region_map.o(.rodata); src/image_processing_effects.o(.rodata); src/battle_ai_script_commands.o(.rodata); src/fldeff_flash.o(.rodata); src/field_specials.o(.rodata); src/battle_records.o(.rodata); src/evolution_scene.o(.rodata); src/battle_transition.o(.rodata); src/battle_controller_link_partner.o(.rodata); src/battle_message.o(.rodata); src/save.o(.rodata); src/field_effect_helpers.o(.rodata); src/battle_controller_safari.o(.rodata); src/battle_anim_effects_3.o(.rodata); src/learn_move.o(.rodata); src/battle_tower.o(.rodata); src/battle_controller_oak_old_man.o(.rodata); src/player_pc.o(.rodata); src/intro.o(.rodata); src/battle_anim_special.o(.rodata); src/hall_of_fame.o(.rodata); src/credits.o(.rodata); src/diploma.o(.rodata); src/strings.o(.rodata); src/save_failed_screen.o(.rodata); src/clear_save_data_screen.o(.rodata); src/evolution_graphics.o(.rodata); src/new_menu_helpers.o(.rodata); src/tilemap_util.o(.rodata); src/map_preview_screen.o(.rodata); src/link_rfu_2.o(.rodata); src/link_rfu_3.o(.rodata); src/easy_chat_2.o(.rodata); src/easy_chat_3.o(.rodata); src/pokedex_screen.o(.rodata); src/list_menu.o(.rodata); src/item_menu.o(.rodata); src/save_location.o(.rodata); src/bag.o(.rodata); src/trainer_pokemon_sprites.o(.rodata); src/vs_seeker.o(.rodata); src/item_pc.o(.rodata); src/mailbox_pc.o(.rodata); src/decoration.o(.rodata); src/menu.o(.rodata); src/quest_log.o(.rodata); src/help_message.o(.rodata); src/trainer_fan_club.o(.rodata); src/quest_log_events.o(.rodata); src/union_room.o(.rodata); src/union_room_player_avatar.o(.rodata); src/union_room_battle.o(.rodata); src/union_room_message.o(.rodata); src/pokemon_special_anim.o(.rodata); src/pokemon_special_anim_scene.o(.rodata); src/party_menu.o(.rodata); src/union_room_chat.o(.rodata); src/union_room_chat_display.o(.rodata); src/union_room_chat_objects.o(.rodata); src/help_system.o(.rodata); src/fame_checker.o(.rodata); src/menu2.o(.rodata); src/oak_speech.o(.rodata); src/tm_case.o(.rodata); src/menu_indicators.o(.rodata); src/pokedex_area_markers.o(.rodata); src/pokemon_summary_screen.o(.rodata); src/help_system_util.o(.rodata); src/wild_pokemon_area.o(.rodata); src/dynamic_placeholder_text_util.o(.rodata); src/berry_pouch.o(.rodata); src/itemfinder.o(.rodata); src/buy_menu_helpers.o(.rodata); src/slot_machine.o(.rodata); src/roamer.o(.rodata); src/mystery_gift_menu.o(.rodata); src/ereader_screen.o(.rodata); src/mystery_gift.o(.rodata); src/mystery_gift_link.o(.rodata); src/mystery_gift_client.o(.rodata); src/mystery_gift_server.o(.rodata); src/mystery_gift_show_card.o(.rodata); src/mystery_gift_show_news.o(.rodata); src/mystery_gift_scripts.o(.rodata); src/wonder_news.o(.rodata); src/wonder_news.o(.rodata.str1.4); src/seagallop.o(.rodata); src/pokemon_jump.o(.rodata); src/berry_crush.o(.rodata); src/wireless_communication_status_screen.o(.rodata); src/braille_text.o(.rodata); src/text_window_graphics.o(.rodata); src/quest_log_player.o(.rodata); src/dodrio_berry_picking.o(.rodata); src/battle_controller_pokedude.o(.rodata); src/teachy_tv.o(.rodata); src/digit_obj_util.o(.rodata); src/ss_anne.o(.rodata); src/cereader_tool.o(.rodata); src/renewable_hidden_items.o(.rodata); src/trainer_tower.o(.rodata); src/minigame_countdown.o(.rodata); src/berry_fix_program.o(.rodata); src/keyboard_text.o(.rodata); src/trainer_tower_sets.o(.rodata); src/move_descriptions.o(.rodata); src/cable_car.o(.rodata); /* These should not be moved to C files */ src/mystery_event_msg.o(.rodata); data/mystery_event_msg.o(.rodata); src/m4a_tables.o(.rodata); data/sound_data.o(.rodata); } =0 song_data : ALIGN(4) { sound/songs/midi/mus_dummy.o(.rodata); sound/songs/midi/se_use_item.o(.rodata); sound/songs/midi/se_pc_login.o(.rodata); sound/songs/midi/se_pc_off.o(.rodata); sound/songs/midi/se_pc_on.o(.rodata); sound/songs/midi/se_select.o(.rodata); sound/songs/se_win_open.o(.rodata); sound/songs/se_wall_hit.o(.rodata); sound/songs/midi/se_door.o(.rodata); sound/songs/midi/se_exit.o(.rodata); sound/songs/midi/se_ledge.o(.rodata); sound/songs/midi/se_bike_bell.o(.rodata); sound/songs/midi/se_not_effective.o(.rodata); sound/songs/midi/se_effective.o(.rodata); sound/songs/midi/se_super_effective.o(.rodata); sound/songs/midi/se_ball_open.o(.rodata); sound/songs/midi/se_faint.o(.rodata); sound/songs/midi/se_flee.o(.rodata); sound/songs/midi/se_sliding_door.o(.rodata); sound/songs/midi/se_ship.o(.rodata); sound/songs/midi/se_bang.o(.rodata); sound/songs/midi/se_pin.o(.rodata); sound/songs/midi/se_boo.o(.rodata); sound/songs/midi/se_ball.o(.rodata); sound/songs/midi/se_contest_place.o(.rodata); sound/songs/midi/se_a.o(.rodata); sound/songs/midi/se_i.o(.rodata); sound/songs/midi/se_u.o(.rodata); sound/songs/midi/se_e.o(.rodata); sound/songs/midi/se_o.o(.rodata); sound/songs/midi/se_n.o(.rodata); sound/songs/midi/se_success.o(.rodata); sound/songs/midi/se_failure.o(.rodata); sound/songs/midi/se_exp.o(.rodata); sound/songs/midi/se_bike_hop.o(.rodata); sound/songs/midi/se_switch.o(.rodata); sound/songs/midi/se_click.o(.rodata); sound/songs/midi/se_fu_zaku.o(.rodata); sound/songs/midi/se_contest_condition_lose.o(.rodata); sound/songs/midi/se_lavaridge_fall_warp.o(.rodata); sound/songs/midi/se_ice_stairs.o(.rodata); sound/songs/midi/se_ice_break.o(.rodata); sound/songs/midi/se_ice_crack.o(.rodata); sound/songs/midi/se_fall.o(.rodata); sound/songs/midi/se_unlock.o(.rodata); sound/songs/midi/se_warp_in.o(.rodata); sound/songs/midi/se_warp_out.o(.rodata); sound/songs/midi/se_repel.o(.rodata); sound/songs/midi/se_rotating_gate.o(.rodata); sound/songs/midi/se_truck_move.o(.rodata); sound/songs/midi/se_truck_stop.o(.rodata); sound/songs/midi/se_truck_unload.o(.rodata); sound/songs/midi/se_truck_door.o(.rodata); sound/songs/midi/se_berry_blender.o(.rodata); sound/songs/midi/se_card.o(.rodata); sound/songs/midi/se_save.o(.rodata); sound/songs/midi/se_ball_bounce_1.o(.rodata); sound/songs/midi/se_ball_bounce_2.o(.rodata); sound/songs/midi/se_ball_bounce_3.o(.rodata); sound/songs/midi/se_ball_bounce_4.o(.rodata); sound/songs/midi/se_ball_trade.o(.rodata); sound/songs/midi/se_ball_throw.o(.rodata); sound/songs/midi/se_note_c.o(.rodata); sound/songs/midi/se_note_d.o(.rodata); sound/songs/midi/se_note_e.o(.rodata); sound/songs/midi/se_note_f.o(.rodata); sound/songs/midi/se_note_g.o(.rodata); sound/songs/midi/se_note_a.o(.rodata); sound/songs/midi/se_note_b.o(.rodata); sound/songs/midi/se_note_c_high.o(.rodata); sound/songs/midi/se_puddle.o(.rodata); sound/songs/midi/se_bridge_walk.o(.rodata); sound/songs/midi/se_itemfinder.o(.rodata); sound/songs/midi/se_ding_dong.o(.rodata); sound/songs/midi/se_balloon_red.o(.rodata); sound/songs/midi/se_balloon_blue.o(.rodata); sound/songs/midi/se_balloon_yellow.o(.rodata); sound/songs/midi/se_breakable_door.o(.rodata); sound/songs/midi/se_mud_ball.o(.rodata); sound/songs/midi/se_field_poison.o(.rodata); sound/songs/midi/se_escalator.o(.rodata); sound/songs/midi/se_thunderstorm.o(.rodata); sound/songs/midi/se_thunderstorm_stop.o(.rodata); sound/songs/midi/se_downpour.o(.rodata); sound/songs/midi/se_downpour_stop.o(.rodata); sound/songs/midi/se_rain.o(.rodata); sound/songs/midi/se_rain_stop.o(.rodata); sound/songs/midi/se_thunder.o(.rodata); sound/songs/midi/se_thunder2.o(.rodata); sound/songs/midi/se_elevator.o(.rodata); sound/songs/midi/se_low_health.o(.rodata); sound/songs/midi/se_exp_max.o(.rodata); sound/songs/midi/se_roulette_ball.o(.rodata); sound/songs/midi/se_roulette_ball2.o(.rodata); sound/songs/midi/se_taillow_wing_flap.o(.rodata); sound/songs/midi/se_shop.o(.rodata); sound/songs/midi/se_contest_heart.o(.rodata); sound/songs/midi/se_contest_curtain_rise.o(.rodata); sound/songs/midi/se_contest_curtain_fall.o(.rodata); sound/songs/midi/se_contest_icon_change.o(.rodata); sound/songs/midi/se_contest_icon_clear.o(.rodata); sound/songs/midi/se_contest_mons_turn.o(.rodata); sound/songs/midi/se_shiny.o(.rodata); sound/songs/midi/se_intro_blast.o(.rodata); sound/songs/midi/se_mugshot.o(.rodata); sound/songs/midi/se_applause.o(.rodata); sound/songs/midi/se_vend.o(.rodata); sound/songs/midi/se_orb.o(.rodata); sound/songs/se_dex_scroll.o(.rodata); sound/songs/se_dex_page.o(.rodata); sound/songs/midi/se_pokenav_on.o(.rodata); sound/songs/midi/se_pokenav_off.o(.rodata); sound/songs/midi/se_dex_search.o(.rodata); sound/songs/midi/se_egg_hatch.o(.rodata); sound/songs/midi/se_ball_tray_enter.o(.rodata); sound/songs/midi/se_ball_tray_ball.o(.rodata); sound/songs/midi/se_ball_tray_exit.o(.rodata); sound/songs/midi/se_glass_flute.o(.rodata); sound/songs/se_m_thunderbolt.o(.rodata); sound/songs/se_m_thunderbolt2.o(.rodata); sound/songs/se_m_harden.o(.rodata); sound/songs/se_m_nightmare.o(.rodata); sound/songs/se_m_vital_throw.o(.rodata); sound/songs/se_m_vital_throw2.o(.rodata); sound/songs/se_m_bubble.o(.rodata); sound/songs/se_m_bubble2.o(.rodata); sound/songs/se_m_bubble3.o(.rodata); sound/songs/se_m_rain_dance.o(.rodata); sound/songs/midi/se_m_cut.o(.rodata); sound/songs/se_m_string_shot.o(.rodata); sound/songs/se_m_string_shot2.o(.rodata); sound/songs/se_m_rock_throw.o(.rodata); sound/songs/midi/se_m_gust.o(.rodata); sound/songs/midi/se_m_gust2.o(.rodata); sound/songs/midi/se_m_double_slap.o(.rodata); sound/songs/se_m_double_team.o(.rodata); sound/songs/midi/se_m_razor_wind.o(.rodata); sound/songs/se_m_icy_wind.o(.rodata); sound/songs/se_m_thunder_wave.o(.rodata); sound/songs/midi/se_m_comet_punch.o(.rodata); sound/songs/midi/se_m_mega_kick.o(.rodata); sound/songs/midi/se_m_mega_kick2.o(.rodata); sound/songs/se_m_crabhammer.o(.rodata); sound/songs/midi/se_m_jump_kick.o(.rodata); sound/songs/se_m_flame_wheel.o(.rodata); sound/songs/se_m_flame_wheel2.o(.rodata); sound/songs/se_m_flamethrower.o(.rodata); sound/songs/midi/se_m_fire_punch.o(.rodata); sound/songs/se_m_toxic.o(.rodata); sound/songs/se_m_sacred_fire.o(.rodata); sound/songs/se_m_sacred_fire2.o(.rodata); sound/songs/se_m_ember.o(.rodata); sound/songs/midi/se_m_take_down.o(.rodata); sound/songs/se_m_blizzard.o(.rodata); sound/songs/se_m_blizzard2.o(.rodata); sound/songs/midi/se_m_scratch.o(.rodata); sound/songs/midi/se_m_vicegrip.o(.rodata); sound/songs/midi/se_m_wing_attack.o(.rodata); sound/songs/midi/se_m_fly.o(.rodata); sound/songs/midi/se_m_sand_attack.o(.rodata); sound/songs/midi/se_m_razor_wind2.o(.rodata); sound/songs/se_m_bite.o(.rodata); sound/songs/midi/se_m_headbutt.o(.rodata); sound/songs/se_m_surf.o(.rodata); sound/songs/se_m_hydro_pump.o(.rodata); sound/songs/se_m_whirlpool.o(.rodata); sound/songs/midi/se_m_horn_attack.o(.rodata); sound/songs/midi/se_m_tail_whip.o(.rodata); sound/songs/se_m_mist.o(.rodata); sound/songs/se_m_poison_powder.o(.rodata); sound/songs/midi/se_m_bind.o(.rodata); sound/songs/se_m_dragon_rage.o(.rodata); sound/songs/se_m_sing.o(.rodata); sound/songs/se_m_perish_song.o(.rodata); sound/songs/midi/se_m_pay_day.o(.rodata); sound/songs/se_m_dig.o(.rodata); sound/songs/se_m_dizzy_punch.o(.rodata); sound/songs/se_m_self_destruct.o(.rodata); sound/songs/se_m_explosion.o(.rodata); sound/songs/se_m_absorb_2.o(.rodata); sound/songs/se_m_absorb.o(.rodata); sound/songs/se_m_screech.o(.rodata); sound/songs/se_m_bubble_beam.o(.rodata); sound/songs/se_m_bubble_beam2.o(.rodata); sound/songs/se_m_supersonic.o(.rodata); sound/songs/se_m_belly_drum.o(.rodata); sound/songs/se_m_metronome.o(.rodata); sound/songs/se_m_bonemerang.o(.rodata); sound/songs/se_m_lick.o(.rodata); sound/songs/se_m_psybeam.o(.rodata); sound/songs/se_m_faint_attack.o(.rodata); sound/songs/midi/se_m_swords_dance.o(.rodata); sound/songs/midi/se_m_leer.o(.rodata); sound/songs/se_m_swagger.o(.rodata); sound/songs/se_m_swagger2.o(.rodata); sound/songs/se_m_heal_bell.o(.rodata); sound/songs/se_m_confuse_ray.o(.rodata); sound/songs/se_m_snore.o(.rodata); sound/songs/se_m_brick_break.o(.rodata); sound/songs/se_m_giga_drain.o(.rodata); sound/songs/se_m_psybeam2.o(.rodata); sound/songs/se_m_solar_beam.o(.rodata); sound/songs/se_m_petal_dance.o(.rodata); sound/songs/se_m_teleport.o(.rodata); sound/songs/se_m_minimize.o(.rodata); sound/songs/se_m_sketch.o(.rodata); sound/songs/se_m_swift.o(.rodata); sound/songs/se_m_reflect.o(.rodata); sound/songs/se_m_barrier.o(.rodata); sound/songs/se_m_detect.o(.rodata); sound/songs/se_m_lock_on.o(.rodata); sound/songs/se_m_moonlight.o(.rodata); sound/songs/se_m_charm.o(.rodata); sound/songs/se_m_charge.o(.rodata); sound/songs/se_m_strength.o(.rodata); sound/songs/se_m_hyper_beam.o(.rodata); sound/songs/se_m_waterfall.o(.rodata); sound/songs/se_m_reversal.o(.rodata); sound/songs/se_m_acid_armor.o(.rodata); sound/songs/se_m_sandstorm.o(.rodata); sound/songs/se_m_tri_attack.o(.rodata); sound/songs/se_m_tri_attack2.o(.rodata); sound/songs/se_m_encore.o(.rodata); sound/songs/se_m_encore2.o(.rodata); sound/songs/se_m_baton_pass.o(.rodata); sound/songs/se_m_milk_drink.o(.rodata); sound/songs/se_m_attract.o(.rodata); sound/songs/se_m_attract2.o(.rodata); sound/songs/se_m_morning_sun.o(.rodata); sound/songs/se_m_flatter.o(.rodata); sound/songs/se_m_sand_tomb.o(.rodata); sound/songs/se_m_grasswhistle.o(.rodata); sound/songs/se_m_spit_up.o(.rodata); sound/songs/se_m_dive.o(.rodata); sound/songs/se_m_earthquake.o(.rodata); sound/songs/se_m_twister.o(.rodata); sound/songs/se_m_sweet_scent.o(.rodata); sound/songs/se_m_yawn.o(.rodata); sound/songs/se_m_sky_uppercut.o(.rodata); sound/songs/se_m_stat_increase.o(.rodata); sound/songs/se_m_heat_wave.o(.rodata); sound/songs/se_m_uproar.o(.rodata); sound/songs/se_m_hail.o(.rodata); sound/songs/se_m_cosmic_power.o(.rodata); sound/songs/se_m_teeter_dance.o(.rodata); sound/songs/se_m_stat_decrease.o(.rodata); sound/songs/se_m_haze.o(.rodata); sound/songs/se_m_hyper_beam2.o(.rodata); sound/songs/midi/se_rg_door.o(.rodata); sound/songs/midi/se_rg_card_flip.o(.rodata); sound/songs/midi/se_rg_card_flipping.o(.rodata); sound/songs/midi/se_rg_card_open.o(.rodata); sound/songs/midi/se_rg_bag_cursor.o(.rodata); sound/songs/se_rg_bag_pocket.o(.rodata); sound/songs/midi/se_rg_ball_click.o(.rodata); sound/songs/midi/se_rg_shop.o(.rodata); sound/songs/midi/se_rg_ss_anne_horn.o(.rodata); sound/songs/midi/se_rg_help_open.o(.rodata); sound/songs/midi/se_rg_help_close.o(.rodata); sound/songs/midi/se_rg_help_error.o(.rodata); sound/songs/midi/se_rg_deoxys_move.o(.rodata); sound/songs/midi/se_rg_poke_jump_success.o(.rodata); sound/songs/midi/se_rg_poke_jump_failure.o(.rodata); sound/songs/midi/se_pokenav_call.o(.rodata); sound/songs/midi/se_pokenav_hang_up.o(.rodata); sound/songs/midi/se_arena_timeup1.o(.rodata); sound/songs/midi/se_arena_timeup2.o(.rodata); sound/songs/midi/se_pike_curtain_close.o(.rodata); sound/songs/midi/se_pike_curtain_open.o(.rodata); sound/songs/midi/se_sudowoodo_shake.o(.rodata); sound/songs/midi/mus_littleroot_test.o(.rodata); sound/songs/midi/mus_gsc_route38.o(.rodata); sound/songs/midi/mus_caught.o(.rodata); sound/songs/midi/mus_victory_wild.o(.rodata); sound/songs/midi/mus_victory_gym_leader.o(.rodata); sound/songs/midi/mus_victory_league.o(.rodata); sound/songs/midi/mus_c_comm_center.o(.rodata); sound/songs/midi/mus_gsc_pewter.o(.rodata); sound/songs/midi/mus_c_vs_legend_beast.o(.rodata); sound/songs/midi/mus_route101.o(.rodata); sound/songs/midi/mus_route110.o(.rodata); sound/songs/midi/mus_route120.o(.rodata); sound/songs/midi/mus_petalburg.o(.rodata); sound/songs/midi/mus_oldale.o(.rodata); sound/songs/midi/mus_gym.o(.rodata); sound/songs/midi/mus_surf.o(.rodata); sound/songs/midi/mus_petalburg_woods.o(.rodata); sound/songs/midi/mus_level_up.o(.rodata); sound/songs/midi/mus_heal.o(.rodata); sound/songs/midi/mus_obtain_badge.o(.rodata); sound/songs/midi/mus_obtain_item.o(.rodata); sound/songs/midi/mus_evolved.o(.rodata); sound/songs/midi/mus_obtain_tmhm.o(.rodata); sound/songs/midi/mus_lilycove_museum.o(.rodata); sound/songs/midi/mus_route122.o(.rodata); sound/songs/midi/mus_oceanic_museum.o(.rodata); sound/songs/midi/mus_evolution_intro.o(.rodata); sound/songs/midi/mus_evolution.o(.rodata); sound/songs/midi/mus_move_deleted.o(.rodata); sound/songs/midi/mus_encounter_girl.o(.rodata); sound/songs/midi/mus_encounter_male.o(.rodata); sound/songs/midi/mus_abandoned_ship.o(.rodata); sound/songs/midi/mus_fortree.o(.rodata); sound/songs/midi/mus_birch_lab.o(.rodata); sound/songs/midi/mus_b_tower_rs.o(.rodata); sound/songs/midi/mus_encounter_swimmer.o(.rodata); sound/songs/midi/mus_cave_of_origin.o(.rodata); sound/songs/midi/mus_obtain_berry.o(.rodata); sound/songs/midi/mus_awaken_legend.o(.rodata); sound/songs/midi/mus_slots_jackpot.o(.rodata); sound/songs/midi/mus_slots_win.o(.rodata); sound/songs/midi/mus_too_bad.o(.rodata); sound/songs/midi/mus_roulette.o(.rodata); sound/songs/midi/mus_link_contest_p1.o(.rodata); sound/songs/midi/mus_link_contest_p2.o(.rodata); sound/songs/midi/mus_link_contest_p3.o(.rodata); sound/songs/midi/mus_link_contest_p4.o(.rodata); sound/songs/midi/mus_encounter_rich.o(.rodata); sound/songs/midi/mus_verdanturf.o(.rodata); sound/songs/midi/mus_rustboro.o(.rodata); sound/songs/midi/mus_poke_center.o(.rodata); sound/songs/midi/mus_route104.o(.rodata); sound/songs/midi/mus_route119.o(.rodata); sound/songs/midi/mus_cycling.o(.rodata); sound/songs/midi/mus_poke_mart.o(.rodata); sound/songs/midi/mus_littleroot.o(.rodata); sound/songs/midi/mus_mt_chimney.o(.rodata); sound/songs/midi/mus_encounter_female.o(.rodata); sound/songs/midi/mus_lilycove.o(.rodata); sound/songs/midi/mus_route111.o(.rodata); sound/songs/midi/mus_help.o(.rodata); sound/songs/midi/mus_underwater.o(.rodata); sound/songs/midi/mus_victory_trainer.o(.rodata); sound/songs/midi/mus_title.o(.rodata); sound/songs/midi/mus_intro.o(.rodata); sound/songs/midi/mus_encounter_may.o(.rodata); sound/songs/midi/mus_encounter_intense.o(.rodata); sound/songs/midi/mus_encounter_cool.o(.rodata); sound/songs/midi/mus_route113.o(.rodata); sound/songs/midi/mus_encounter_aqua.o(.rodata); sound/songs/midi/mus_follow_me.o(.rodata); sound/songs/midi/mus_encounter_brendan.o(.rodata); sound/songs/midi/mus_ever_grande.o(.rodata); sound/songs/midi/mus_encounter_suspicious.o(.rodata); sound/songs/midi/mus_victory_aqua_magma.o(.rodata); sound/songs/midi/mus_cable_car.o(.rodata); sound/songs/midi/mus_game_corner.o(.rodata); sound/songs/midi/mus_dewford.o(.rodata); sound/songs/midi/mus_safari_zone.o(.rodata); sound/songs/midi/mus_victory_road.o(.rodata); sound/songs/midi/mus_aqua_magma_hideout.o(.rodata); sound/songs/midi/mus_sailing.o(.rodata); sound/songs/midi/mus_mt_pyre.o(.rodata); sound/songs/midi/mus_slateport.o(.rodata); sound/songs/midi/mus_mt_pyre_exterior.o(.rodata); sound/songs/midi/mus_school.o(.rodata); sound/songs/midi/mus_hall_of_fame.o(.rodata); sound/songs/midi/mus_fallarbor.o(.rodata); sound/songs/midi/mus_sealed_chamber.o(.rodata); sound/songs/midi/mus_contest_winner.o(.rodata); sound/songs/midi/mus_contest.o(.rodata); sound/songs/midi/mus_encounter_magma.o(.rodata); sound/songs/midi/mus_intro_battle.o(.rodata); sound/songs/midi/mus_abnormal_weather.o(.rodata); sound/songs/midi/mus_weather_groudon.o(.rodata); sound/songs/midi/mus_sootopolis.o(.rodata); sound/songs/midi/mus_contest_results.o(.rodata); sound/songs/midi/mus_hall_of_fame_room.o(.rodata); sound/songs/midi/mus_trick_house.o(.rodata); sound/songs/midi/mus_encounter_twins.o(.rodata); sound/songs/midi/mus_encounter_elite_four.o(.rodata); sound/songs/midi/mus_encounter_hiker.o(.rodata); sound/songs/midi/mus_contest_lobby.o(.rodata); sound/songs/midi/mus_encounter_interviewer.o(.rodata); sound/songs/midi/mus_encounter_champion.o(.rodata); sound/songs/midi/mus_credits.o(.rodata); sound/songs/midi/mus_end.o(.rodata); sound/songs/midi/mus_b_frontier.o(.rodata); sound/songs/midi/mus_b_arena.o(.rodata); sound/songs/midi/mus_obtain_b_points.o(.rodata); sound/songs/midi/mus_register_match_call.o(.rodata); sound/songs/midi/mus_b_pyramid.o(.rodata); sound/songs/midi/mus_b_pyramid_top.o(.rodata); sound/songs/midi/mus_b_palace.o(.rodata); sound/songs/midi/mus_rayquaza_appears.o(.rodata); sound/songs/midi/mus_b_tower.o(.rodata); sound/songs/midi/mus_obtain_symbol.o(.rodata); sound/songs/midi/mus_b_dome.o(.rodata); sound/songs/midi/mus_b_pike.o(.rodata); sound/songs/midi/mus_b_factory.o(.rodata); sound/songs/midi/mus_vs_rayquaza.o(.rodata); sound/songs/midi/mus_vs_frontier_brain.o(.rodata); sound/songs/midi/mus_vs_mew.o(.rodata); sound/songs/midi/mus_b_dome_lobby.o(.rodata); sound/songs/midi/mus_vs_wild.o(.rodata); sound/songs/midi/mus_vs_aqua_magma.o(.rodata); sound/songs/midi/mus_vs_trainer.o(.rodata); sound/songs/midi/mus_vs_gym_leader.o(.rodata); sound/songs/midi/mus_vs_champion.o(.rodata); sound/songs/midi/mus_vs_regi.o(.rodata); sound/songs/midi/mus_vs_kyogre_groudon.o(.rodata); sound/songs/midi/mus_vs_rival.o(.rodata); sound/songs/midi/mus_vs_elite_four.o(.rodata); sound/songs/midi/mus_vs_aqua_magma_leader.o(.rodata); sound/songs/midi/mus_rg_follow_me.o(.rodata); sound/songs/midi/mus_rg_game_corner.o(.rodata); sound/songs/midi/mus_rg_rocket_hideout.o(.rodata); sound/songs/midi/mus_rg_gym.o(.rodata); sound/songs/midi/mus_rg_jigglypuff.o(.rodata); sound/songs/midi/mus_rg_intro_fight.o(.rodata); sound/songs/midi/mus_rg_title.o(.rodata); sound/songs/midi/mus_rg_cinnabar.o(.rodata); sound/songs/midi/mus_rg_lavender.o(.rodata); sound/songs/midi/mus_rg_heal.o(.rodata); sound/songs/midi/mus_rg_cycling.o(.rodata); sound/songs/midi/mus_rg_encounter_rocket.o(.rodata); sound/songs/midi/mus_rg_encounter_girl.o(.rodata); sound/songs/midi/mus_rg_encounter_boy.o(.rodata); sound/songs/midi/mus_rg_hall_of_fame.o(.rodata); sound/songs/midi/mus_rg_viridian_forest.o(.rodata); sound/songs/midi/mus_rg_mt_moon.o(.rodata); sound/songs/midi/mus_rg_poke_mansion.o(.rodata); sound/songs/midi/mus_rg_credits.o(.rodata); sound/songs/midi/mus_rg_route1.o(.rodata); sound/songs/midi/mus_rg_route24.o(.rodata); sound/songs/midi/mus_rg_route3.o(.rodata); sound/songs/midi/mus_rg_route11.o(.rodata); sound/songs/midi/mus_rg_victory_road.o(.rodata); sound/songs/midi/mus_rg_vs_gym_leader.o(.rodata); sound/songs/midi/mus_rg_vs_trainer.o(.rodata); sound/songs/midi/mus_rg_vs_wild.o(.rodata); sound/songs/midi/mus_rg_vs_champion.o(.rodata); sound/songs/midi/mus_rg_pallet.o(.rodata); sound/songs/midi/mus_rg_oak_lab.o(.rodata); sound/songs/midi/mus_rg_oak.o(.rodata); sound/songs/midi/mus_rg_poke_center.o(.rodata); sound/songs/midi/mus_rg_ss_anne.o(.rodata); sound/songs/midi/mus_rg_surf.o(.rodata); sound/songs/midi/mus_rg_poke_tower.o(.rodata); sound/songs/midi/mus_rg_silph.o(.rodata); sound/songs/midi/mus_rg_fuchsia.o(.rodata); sound/songs/midi/mus_rg_celadon.o(.rodata); sound/songs/midi/mus_rg_victory_trainer.o(.rodata); sound/songs/midi/mus_rg_victory_wild.o(.rodata); sound/songs/midi/mus_rg_victory_gym_leader.o(.rodata); sound/songs/midi/mus_rg_vermillion.o(.rodata); sound/songs/midi/mus_rg_pewter.o(.rodata); sound/songs/midi/mus_rg_encounter_rival.o(.rodata); sound/songs/midi/mus_rg_rival_exit.o(.rodata); sound/songs/midi/mus_rg_dex_rating.o(.rodata); sound/songs/midi/mus_rg_obtain_key_item.o(.rodata); sound/songs/midi/mus_rg_caught_intro.o(.rodata); sound/songs/midi/mus_rg_photo.o(.rodata); sound/songs/midi/mus_rg_game_freak.o(.rodata); sound/songs/midi/mus_rg_caught.o(.rodata); sound/songs/midi/mus_rg_new_game_instruct.o(.rodata); sound/songs/midi/mus_rg_new_game_intro.o(.rodata); sound/songs/midi/mus_rg_new_game_exit.o(.rodata); sound/songs/midi/mus_rg_poke_jump.o(.rodata); sound/songs/midi/mus_rg_union_room.o(.rodata); sound/songs/midi/mus_rg_net_center.o(.rodata); sound/songs/midi/mus_rg_mystery_gift.o(.rodata); sound/songs/midi/mus_rg_berry_pick.o(.rodata); sound/songs/midi/mus_rg_sevii_cave.o(.rodata); sound/songs/midi/mus_rg_teachy_tv_show.o(.rodata); sound/songs/midi/mus_rg_sevii_route.o(.rodata); sound/songs/midi/mus_rg_sevii_dungeon.o(.rodata); sound/songs/midi/mus_rg_sevii_123.o(.rodata); sound/songs/midi/mus_rg_sevii_45.o(.rodata); sound/songs/midi/mus_rg_sevii_67.o(.rodata); sound/songs/midi/mus_rg_poke_flute.o(.rodata); sound/songs/midi/mus_rg_vs_deoxys.o(.rodata); sound/songs/midi/mus_rg_vs_mewtwo.o(.rodata); sound/songs/midi/mus_rg_vs_legend.o(.rodata); sound/songs/midi/mus_rg_encounter_gym_leader.o(.rodata); sound/songs/midi/mus_rg_encounter_deoxys.o(.rodata); sound/songs/midi/mus_rg_trainer_tower.o(.rodata); sound/songs/midi/mus_rg_slow_pallet.o(.rodata); sound/songs/midi/mus_rg_teachy_tv_menu.o(.rodata); sound/songs/midi/ph_trap_blend.o(.rodata); sound/songs/midi/ph_trap_held.o(.rodata); sound/songs/midi/ph_trap_solo.o(.rodata); sound/songs/midi/ph_face_blend.o(.rodata); sound/songs/midi/ph_face_held.o(.rodata); sound/songs/midi/ph_face_solo.o(.rodata); sound/songs/midi/ph_cloth_blend.o(.rodata); sound/songs/midi/ph_cloth_held.o(.rodata); sound/songs/midi/ph_cloth_solo.o(.rodata); sound/songs/midi/ph_dress_blend.o(.rodata); sound/songs/midi/ph_dress_held.o(.rodata); sound/songs/midi/ph_dress_solo.o(.rodata); sound/songs/midi/ph_fleece_blend.o(.rodata); sound/songs/midi/ph_fleece_held.o(.rodata); sound/songs/midi/ph_fleece_solo.o(.rodata); sound/songs/midi/ph_kit_blend.o(.rodata); sound/songs/midi/ph_kit_held.o(.rodata); sound/songs/midi/ph_kit_solo.o(.rodata); sound/songs/midi/ph_price_blend.o(.rodata); sound/songs/midi/ph_price_held.o(.rodata); sound/songs/midi/ph_price_solo.o(.rodata); sound/songs/midi/ph_lot_blend.o(.rodata); sound/songs/midi/ph_lot_held.o(.rodata); sound/songs/midi/ph_lot_solo.o(.rodata); sound/songs/midi/ph_goat_blend.o(.rodata); sound/songs/midi/ph_goat_held.o(.rodata); sound/songs/midi/ph_goat_solo.o(.rodata); sound/songs/midi/ph_thought_blend.o(.rodata); sound/songs/midi/ph_thought_held.o(.rodata); sound/songs/midi/ph_thought_solo.o(.rodata); sound/songs/midi/ph_choice_blend.o(.rodata); sound/songs/midi/ph_choice_held.o(.rodata); sound/songs/midi/ph_choice_solo.o(.rodata); sound/songs/midi/ph_mouth_blend.o(.rodata); sound/songs/midi/ph_mouth_held.o(.rodata); sound/songs/midi/ph_mouth_solo.o(.rodata); sound/songs/midi/ph_foot_blend.o(.rodata); sound/songs/midi/ph_foot_held.o(.rodata); sound/songs/midi/ph_foot_solo.o(.rodata); sound/songs/midi/ph_goose_blend.o(.rodata); sound/songs/midi/ph_goose_held.o(.rodata); sound/songs/midi/ph_goose_solo.o(.rodata); sound/songs/midi/ph_strut_blend.o(.rodata); sound/songs/midi/ph_strut_held.o(.rodata); sound/songs/midi/ph_strut_solo.o(.rodata); sound/songs/midi/ph_cure_blend.o(.rodata); sound/songs/midi/ph_cure_held.o(.rodata); sound/songs/midi/ph_cure_solo.o(.rodata); sound/songs/midi/ph_nurse_blend.o(.rodata); sound/songs/midi/ph_nurse_held.o(.rodata); sound/songs/midi/ph_nurse_solo.o(.rodata); } =0 lib_rodata : SUBALIGN(4) { src/agb_flash.o(.rodata); src/agb_flash_1m.o(.rodata); src/agb_flash_mx.o(.rodata); src/agb_flash_le.o(.rodata); src/librfu_rfu.o(.rodata); src/librfu_sio32id.o(.rodata); src/isagbprn.o(.rodata); *libgcc.a:_divdi3.o(.rodata); *libgcc.a:_udivdi3.o(.rodata); *libc.a:memcpy.o(.rodata); *libc.a:memset.o(.rodata); *libc.a:strcmp.o(.rodata); *libc.a:strcpy.o(.rodata); *libc.a:impure.o(.rodata); *libc.a:vsprintf.o(.rodata); *libc.a:vfprintf.o(.rodata); *libc.a:wsetup.o(.rodata); *libc.a:dtoa.o(.rodata); *libc.a:fflush.o(.rodata); *libc.a:findfp.o(.rodata); *libc.a:freer.o(.rodata); *libc.a:mtrim.o(.rodata); *libc.a:fvwrite.o(.rodata); *libc.a:fwalk.o(.rodata); *libc.a:locale.o(.rodata); *libc.a:makebuf.o(.rodata); *libc.a:mallocr.o(.rodata); *libc.a:mbtowc_r.o(.rodata); *libc.a:memchr.o(.rodata); *libc.a:memmove.o(.rodata); *libc.a:mlock.o(.rodata); *libc.a:mprec.o(.rodata); *libc.a:s_isinf.o(.rodata); *libc.a:s_isnan.o(.rodata); *libc.a:sbrkr.o(.rodata); *libc.a:stdio.o(.rodata); *libc.a:strlen.o(.rodata); *libc.a:syscalls.o(.rodata); *libc.a:writer.o(.rodata); *libc.a:callocr.o(.rodata); *libc.a:closer.o(.rodata); *libc.a:errno.o(.rodata); *libc.a:fstatr.o(.rodata); *libc.a:libcfunc.o(.rodata); *libc.a:lseekr.o(.rodata); *libc.a:readr.o(.rodata); . = ALIGN(4); } =0 multiboot_data : ALIGN(4) { data/multiboot_ereader.o(.rodata); data/multiboot_berry_glitch_fix.o(.rodata); data/multiboot_pokemon_colosseum.o(.rodata); } =0 . = 0x08D00000; gfx_data : ALIGN(4) { src/graphics.o(.rodata); } =0 extra : ALIGN(4) { src/*.o(.text); src/*.o(.rodata); data/*.o(.rodata); } = 0 /* DWARF 2 sections */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } .debug_info 0 : { *(.debug_info) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* Discard everything not specifically mentioned above. /DISCARD/ : { *(*); }*/ } ================================================ FILE: ld_script_modern.ld ================================================ gNumMusicPlayers = 4; gMaxLines = 0; SECTIONS { . = 0x2000000; ewram (NOLOAD) : ALIGN(4) { gHeap = .; . = 0x1C000; *(ewram_data); . = 0x40000; } . = 0x3000000; iwram (NOLOAD) : ALIGN(4) { /* .bss starts at 0x3000000 */ *(.bss*); /* .bss.code starts at 0x3001AA8 */ src/m4a.o(.bss.code); /* COMMON starts at 0x30022A8 */ *(COMMON); end = .; __end__ = .; . = 0x8000; } . = 0x8000000; .text : ALIGN(4) { src/rom_header.o(.text*); src/rom_header_gf.o(.text.*); src/crt0.o(.text); src/main.o(.text); *(.text*); } =0 script_data : ALIGN(4) { *(script_data); } =0 .data : ALIGN(4) { *(.data*); } =0 .rodata : ALIGN(4) { *(.rodata*); } =0 /* DWARF 2 sections */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } .debug_info 0 : { *(.debug_info) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* Discard everything not specifically mentioned above. */ /DISCARD/ : { *(*); } } ================================================ FILE: leafgreen.sha1 ================================================ 574fa542ffebb14be69902d1d36f1ec0a4afd71e pokeleafgreen.gba ================================================ FILE: leafgreen_rev1.sha1 ================================================ 7862c67bdecbe21d1d69ce082ce34327e1c6ed5e pokeleafgreen_rev1.gba ================================================ FILE: map_data_rules.mk ================================================ # Map JSON data MAPS_DIR = $(DATA_ASM_SUBDIR)/maps LAYOUTS_DIR = $(DATA_ASM_SUBDIR)/layouts MAP_DIRS := $(dir $(wildcard $(MAPS_DIR)/*/map.json)) MAP_CONNECTIONS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/connections.inc,$(MAP_DIRS)) MAP_EVENTS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/events.inc,$(MAP_DIRS)) MAP_HEADERS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/header.inc,$(MAP_DIRS)) $(MAPS_DIR)/%/header.inc: $(MAPS_DIR)/%/map.json $(MAPJSON) map firered $< $(LAYOUTS_DIR)/layouts.json $(MAPS_DIR)/%/events.inc: $(MAPS_DIR)/%/header.inc ; $(MAPS_DIR)/%/connections.inc: $(MAPS_DIR)/%/events.inc ; $(MAPS_DIR)/groups.inc: $(MAPS_DIR)/map_groups.json $(MAPJSON) groups firered $< $(MAPS_DIR)/connections.inc: $(MAPS_DIR)/groups.inc ; $(MAPS_DIR)/events.inc: $(MAPS_DIR)/connections.inc ; $(MAPS_DIR)/headers.inc: $(MAPS_DIR)/events.inc ; include/constants/map_groups.h: $(MAPS_DIR)/headers.inc ; $(LAYOUTS_DIR)/layouts.inc: $(LAYOUTS_DIR)/layouts.json $(MAPJSON) layouts firered $< $(LAYOUTS_DIR)/layouts_table.inc: $(LAYOUTS_DIR)/layouts.inc ; include/constants/layouts.h: $(LAYOUTS_DIR)/layouts_table.inc ; $(DATA_ASM_BUILDDIR)/maps.o: $(DATA_ASM_SUBDIR)/maps.s $(LAYOUTS_DIR)/layouts.inc $(LAYOUTS_DIR)/layouts_table.inc $(MAPS_DIR)/headers.inc $(MAPS_DIR)/groups.inc $(MAPS_DIR)/connections.inc $(MAP_CONNECTIONS) $(MAP_HEADERS) $(PREPROC) $< charmap.txt | $(CPP) -I include -nostdinc -undef -Wno-unicode - | $(AS) $(ASFLAGS) -o $@ $(DATA_ASM_BUILDDIR)/map_events.o: $(DATA_ASM_SUBDIR)/map_events.s $(MAPS_DIR)/events.inc $(MAP_EVENTS) $(PREPROC) $< charmap.txt | $(CPP) -I include -nostdinc -undef -Wno-unicode - | $(AS) $(ASFLAGS) -o $@ ================================================ FILE: replace.sh ================================================ #!/bin/bash # $1: phrase to find # $2: phrase to replace $1 if [ "$1" = "" -o "$2" = "" ]; then echo "Usage: replace.sh [PHRASE TO FIND] [PHRASE TO REPLACE PHRASE TO FIND]" exit 0 fi sed -i 's/\<'"$1"'\>/'"$2"'/' $(grep -lwr --include="*.s" --include="*.h" --include="*.c" --include="*.inc" --include="*.json" --include="*.txt" --exclude-dir="tools" --exclude-dir=".git" --exclude-dir="build" --exclude-dir="berry_fix/build" --exclude-dir="berry_fix/payload/build" --exclude-dir=".travis" "$1") ================================================ FILE: songs.mk ================================================ STD_REVERB = 50 $(MID_BUILDDIR)/%.o: $(MID_SUBDIR)/%.s $(AS) $(ASFLAGS) -I sound -o $@ $< $(MID_SUBDIR)/mus_aqua_magma_hideout.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G076 -V084 $(MID_SUBDIR)/mus_encounter_aqua.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G065 -V086 $(MID_SUBDIR)/mus_route111.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G055 -V076 $(MID_SUBDIR)/mus_encounter_suspicious.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G069 -V078 $(MID_SUBDIR)/mus_b_arena.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G104 -V090 $(MID_SUBDIR)/mus_b_dome.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G111 -V090 $(MID_SUBDIR)/mus_b_dome_lobby.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G111 -V056 $(MID_SUBDIR)/mus_b_factory.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G113 -V100 $(MID_SUBDIR)/mus_b_frontier.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G103 -V094 $(MID_SUBDIR)/mus_b_palace.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G108 -V105 $(MID_SUBDIR)/mus_b_tower_rs.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G035 -V080 $(MID_SUBDIR)/mus_b_pike.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G112 -V092 $(MID_SUBDIR)/mus_vs_trainer.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G119 -V080 -P1 $(MID_SUBDIR)/mus_vs_wild.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G117 -V080 -P1 $(MID_SUBDIR)/mus_vs_aqua_magma_leader.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G126 -V080 -P1 $(MID_SUBDIR)/mus_vs_aqua_magma.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G118 -V080 -P1 $(MID_SUBDIR)/mus_vs_gym_leader.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G120 -V080 -P1 $(MID_SUBDIR)/mus_vs_champion.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G121 -V080 -P1 $(MID_SUBDIR)/mus_vs_kyogre_groudon.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G123 -V080 -P1 $(MID_SUBDIR)/mus_vs_rival.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G124 -V080 -P1 $(MID_SUBDIR)/mus_vs_regi.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G122 -V080 -P1 $(MID_SUBDIR)/mus_vs_elite_four.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G125 -V080 -P1 $(MID_SUBDIR)/mus_roulette.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G038 -V080 $(MID_SUBDIR)/mus_lilycove_museum.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G020 -V080 $(MID_SUBDIR)/mus_encounter_brendan.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G067 -V078 $(MID_SUBDIR)/mus_encounter_male.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G028 -V080 $(MID_SUBDIR)/mus_victory_road.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G075 -V076 $(MID_SUBDIR)/mus_game_corner.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G072 -V072 $(MID_SUBDIR)/mus_contest_winner.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G085 -V100 $(MID_SUBDIR)/mus_contest_results.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G092 -V080 $(MID_SUBDIR)/mus_contest_lobby.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G098 -V060 $(MID_SUBDIR)/mus_contest.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G086 -V088 $(MID_SUBDIR)/mus_cycling.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G049 -V083 $(MID_SUBDIR)/mus_encounter_champion.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G100 -V076 $(MID_SUBDIR)/mus_petalburg_woods.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G018 -V080 $(MID_SUBDIR)/mus_abandoned_ship.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G030 -V080 $(MID_SUBDIR)/mus_cave_of_origin.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G037 -V080 $(MID_SUBDIR)/mus_underwater.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G057 -V094 $(MID_SUBDIR)/mus_intro.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G060 -V090 $(MID_SUBDIR)/mus_hall_of_fame.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G082 -V078 $(MID_SUBDIR)/mus_route110.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G010 -V080 $(MID_SUBDIR)/mus_route120.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G014 -V080 $(MID_SUBDIR)/mus_route122.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G021 -V080 $(MID_SUBDIR)/mus_route101.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G011 -V080 $(MID_SUBDIR)/mus_dummy.s: %.s: %.mid $(MID) $< $@ -E -R40 $(MID_SUBDIR)/mus_hall_of_fame_room.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G093 -V080 $(MID_SUBDIR)/mus_end.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G102 -V036 $(MID_SUBDIR)/mus_help.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G056 -V078 $(MID_SUBDIR)/mus_level_up.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_obtain_item.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_evolved.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_gsc_route38.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -V080 $(MID_SUBDIR)/mus_slateport.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G079 -V070 $(MID_SUBDIR)/mus_poke_mart.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G050 -V085 $(MID_SUBDIR)/mus_oceanic_museum.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G023 -V080 $(MID_SUBDIR)/mus_gym.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G013 -V080 $(MID_SUBDIR)/mus_encounter_may.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G061 -V078 $(MID_SUBDIR)/mus_encounter_female.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G053 -V072 $(MID_SUBDIR)/mus_verdanturf.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G044 -V090 $(MID_SUBDIR)/mus_rustboro.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G045 -V085 $(MID_SUBDIR)/mus_route119.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G048 -V096 $(MID_SUBDIR)/mus_encounter_intense.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G062 -V078 $(MID_SUBDIR)/mus_weather_groudon.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G090 -V050 $(MID_SUBDIR)/mus_dewford.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G073 -V078 $(MID_SUBDIR)/mus_encounter_twins.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G095 -V075 $(MID_SUBDIR)/mus_encounter_interviewer.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G099 -V062 $(MID_SUBDIR)/mus_victory_trainer.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G058 -V091 $(MID_SUBDIR)/mus_victory_wild.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G025 -V080 $(MID_SUBDIR)/mus_victory_gym_leader.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G024 -V080 $(MID_SUBDIR)/mus_victory_aqua_magma.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G070 -V088 $(MID_SUBDIR)/mus_victory_league.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G029 -V080 $(MID_SUBDIR)/mus_caught.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G025 -V080 $(MID_SUBDIR)/mus_encounter_cool.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G063 -V086 $(MID_SUBDIR)/mus_trick_house.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G094 -V070 $(MID_SUBDIR)/mus_route113.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G064 -V084 $(MID_SUBDIR)/mus_sailing.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G077 -V086 $(MID_SUBDIR)/mus_mt_pyre.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G078 -V088 $(MID_SUBDIR)/mus_sealed_chamber.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G084 -V100 $(MID_SUBDIR)/mus_petalburg.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G015 -V080 $(MID_SUBDIR)/mus_fortree.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G032 -V080 $(MID_SUBDIR)/mus_oldale.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G019 -V080 $(MID_SUBDIR)/mus_mt_pyre_exterior.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G080 -V080 $(MID_SUBDIR)/mus_heal.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_slots_jackpot.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_slots_win.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_obtain_badge.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_obtain_berry.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_obtain_b_points.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G103 -V090 -P5 $(MID_SUBDIR)/mus_rg_photo.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G180 -V100 -P5 $(MID_SUBDIR)/mus_evolution_intro.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G026 -V080 $(MID_SUBDIR)/mus_obtain_symbol.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G103 -V100 -P5 $(MID_SUBDIR)/mus_awaken_legend.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_register_match_call.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G105 -V090 -P5 $(MID_SUBDIR)/mus_move_deleted.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_obtain_tmhm.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_too_bad.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5 $(MID_SUBDIR)/mus_encounter_magma.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G087 -V072 $(MID_SUBDIR)/mus_lilycove.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G054 -V085 $(MID_SUBDIR)/mus_littleroot.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G051 -V100 $(MID_SUBDIR)/mus_surf.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G017 -V080 $(MID_SUBDIR)/mus_route104.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G047 -V097 $(MID_SUBDIR)/mus_gsc_pewter.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -V080 $(MID_SUBDIR)/mus_birch_lab.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G033 -V080 $(MID_SUBDIR)/mus_abnormal_weather.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G089 -V080 $(MID_SUBDIR)/mus_school.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G081 -V100 $(MID_SUBDIR)/mus_c_comm_center.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -V080 $(MID_SUBDIR)/mus_poke_center.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G046 -V092 $(MID_SUBDIR)/mus_b_pyramid.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G106 -V079 $(MID_SUBDIR)/mus_b_pyramid_top.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G107 -V077 $(MID_SUBDIR)/mus_ever_grande.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G068 -V086 $(MID_SUBDIR)/mus_rayquaza_appears.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G109 -V090 $(MID_SUBDIR)/mus_rg_rocket_hideout.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G133 -V090 $(MID_SUBDIR)/mus_rg_follow_me.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G131 -V068 $(MID_SUBDIR)/mus_rg_victory_road.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G154 -V090 $(MID_SUBDIR)/mus_rg_cycling.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G141 -V090 $(MID_SUBDIR)/mus_rg_intro_fight.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G136 -V090 $(MID_SUBDIR)/mus_rg_hall_of_fame.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G145 -V079 $(MID_SUBDIR)/mus_rg_encounter_deoxys.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G184 -V079 $(MID_SUBDIR)/mus_rg_credits.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G149 -V090 $(MID_SUBDIR)/mus_rg_encounter_gym_leader.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G144 -V090 $(MID_SUBDIR)/mus_rg_dex_rating.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G175 -V070 -P5 $(MID_SUBDIR)/mus_rg_obtain_key_item.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G178 -V077 -P5 $(MID_SUBDIR)/mus_rg_caught_intro.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G179 -V094 -P5 $(MID_SUBDIR)/mus_rg_caught.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G170 -V100 $(MID_SUBDIR)/mus_rg_cinnabar.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G138 -V090 $(MID_SUBDIR)/mus_rg_gym.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G134 -V090 $(MID_SUBDIR)/mus_rg_fuchsia.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G167 -V090 $(MID_SUBDIR)/mus_rg_poke_jump.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G132 -V090 $(MID_SUBDIR)/mus_rg_heal.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G140 -V090 $(MID_SUBDIR)/mus_rg_oak_lab.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G160 -V075 $(MID_SUBDIR)/mus_rg_berry_pick.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G132 -V090 $(MID_SUBDIR)/mus_rg_vermillion.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G172 -V090 $(MID_SUBDIR)/mus_rg_route1.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G150 -V079 $(MID_SUBDIR)/mus_rg_route3.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G152 -V083 $(MID_SUBDIR)/mus_rg_route11.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G153 -V090 $(MID_SUBDIR)/mus_rg_pallet.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G159 -V100 $(MID_SUBDIR)/mus_rg_surf.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G164 -V071 $(MID_SUBDIR)/mus_rg_sevii_45.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G188 -V084 $(MID_SUBDIR)/mus_rg_sevii_67.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G189 -V084 $(MID_SUBDIR)/mus_rg_sevii_123.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G173 -V084 $(MID_SUBDIR)/mus_rg_sevii_cave.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G147 -V090 $(MID_SUBDIR)/mus_rg_sevii_dungeon.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G146 -V090 $(MID_SUBDIR)/mus_rg_sevii_route.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G187 -V080 $(MID_SUBDIR)/mus_rg_net_center.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G162 -V096 $(MID_SUBDIR)/mus_rg_pewter.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G173 -V084 $(MID_SUBDIR)/mus_rg_oak.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G161 -V086 $(MID_SUBDIR)/mus_rg_mystery_gift.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G183 -V100 $(MID_SUBDIR)/mus_rg_route24.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G151 -V086 $(MID_SUBDIR)/mus_rg_teachy_tv_show.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G131 -V068 $(MID_SUBDIR)/mus_rg_mt_moon.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G147 -V090 $(MID_SUBDIR)/mus_rg_poke_tower.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G165 -V090 $(MID_SUBDIR)/mus_rg_poke_center.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G162 -V096 $(MID_SUBDIR)/mus_rg_poke_flute.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G165 -V048 -P5 $(MID_SUBDIR)/mus_rg_poke_mansion.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G148 -V090 $(MID_SUBDIR)/mus_rg_jigglypuff.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G135 -V068 -P5 $(MID_SUBDIR)/mus_rg_encounter_rival.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G174 -V079 $(MID_SUBDIR)/mus_rg_rival_exit.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G174 -V079 $(MID_SUBDIR)/mus_rg_encounter_rocket.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G142 -V096 $(MID_SUBDIR)/mus_rg_ss_anne.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G163 -V090 $(MID_SUBDIR)/mus_rg_new_game_exit.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G182 -V088 $(MID_SUBDIR)/mus_rg_new_game_intro.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G182 -V088 $(MID_SUBDIR)/mus_rg_lavender.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G139 -V090 $(MID_SUBDIR)/mus_rg_silph.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G166 -V076 $(MID_SUBDIR)/mus_rg_encounter_girl.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G143 -V051 $(MID_SUBDIR)/mus_rg_encounter_boy.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G144 -V090 $(MID_SUBDIR)/mus_rg_game_corner.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G132 -V090 $(MID_SUBDIR)/mus_rg_slow_pallet.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G159 -V092 $(MID_SUBDIR)/mus_rg_new_game_instruct.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G182 -V085 $(MID_SUBDIR)/mus_rg_viridian_forest.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G146 -V090 $(MID_SUBDIR)/mus_rg_trainer_tower.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G134 -V090 $(MID_SUBDIR)/mus_rg_celadon.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G168 -V070 $(MID_SUBDIR)/mus_rg_title.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G137 -V090 $(MID_SUBDIR)/mus_rg_game_freak.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G181 -V075 $(MID_SUBDIR)/mus_rg_teachy_tv_menu.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G186 -V059 $(MID_SUBDIR)/mus_rg_union_room.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G132 -V090 $(MID_SUBDIR)/mus_rg_vs_legend.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G157 -V090 $(MID_SUBDIR)/mus_rg_vs_deoxys.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G185 -V080 $(MID_SUBDIR)/mus_rg_vs_gym_leader.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G155 -V090 $(MID_SUBDIR)/mus_rg_vs_champion.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G158 -V090 $(MID_SUBDIR)/mus_rg_vs_mewtwo.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G157 -V090 $(MID_SUBDIR)/mus_rg_vs_trainer.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G156 -V090 $(MID_SUBDIR)/mus_rg_vs_wild.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G157 -V090 $(MID_SUBDIR)/mus_rg_victory_gym_leader.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G171 -V090 $(MID_SUBDIR)/mus_rg_victory_trainer.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G169 -V089 $(MID_SUBDIR)/mus_rg_victory_wild.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G170 -V090 $(MID_SUBDIR)/mus_cable_car.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G071 -V078 $(MID_SUBDIR)/mus_sootopolis.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G091 -V062 $(MID_SUBDIR)/mus_safari_zone.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G074 -V082 $(MID_SUBDIR)/mus_b_tower.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G110 -V100 $(MID_SUBDIR)/mus_evolution.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G026 -V080 $(MID_SUBDIR)/mus_encounter_elite_four.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G096 -V078 $(MID_SUBDIR)/mus_c_vs_legend_beast.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -V080 $(MID_SUBDIR)/mus_encounter_swimmer.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G036 -V080 $(MID_SUBDIR)/mus_encounter_girl.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G027 -V080 $(MID_SUBDIR)/mus_intro_battle.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G088 -V088 $(MID_SUBDIR)/mus_encounter_rich.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G043 -V094 $(MID_SUBDIR)/mus_link_contest_p1.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G039 -V079 $(MID_SUBDIR)/mus_link_contest_p2.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G040 -V090 $(MID_SUBDIR)/mus_link_contest_p3.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G041 -V075 $(MID_SUBDIR)/mus_link_contest_p4.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G042 -V090 $(MID_SUBDIR)/mus_littleroot_test.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G034 -V099 $(MID_SUBDIR)/mus_credits.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G101 -V100 $(MID_SUBDIR)/mus_title.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G059 -V090 $(MID_SUBDIR)/mus_fallarbor.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G083 -V100 $(MID_SUBDIR)/mus_mt_chimney.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G052 -V078 $(MID_SUBDIR)/mus_follow_me.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G066 -V074 $(MID_SUBDIR)/mus_vs_frontier_brain.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G115 -V090 -P1 $(MID_SUBDIR)/mus_vs_mew.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G116 -V090 $(MID_SUBDIR)/mus_vs_rayquaza.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G114 -V080 -P1 $(MID_SUBDIR)/mus_encounter_hiker.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G097 -V076 $(MID_SUBDIR)/ph_choice_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_choice_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_choice_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_cloth_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_cloth_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_cloth_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_cure_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_cure_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_cure_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_dress_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_dress_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_dress_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_face_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_face_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_face_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_fleece_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_fleece_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_fleece_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_foot_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_foot_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_foot_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_goat_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_goat_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_goat_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_goose_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_goose_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_goose_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_kit_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_kit_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_kit_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_lot_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_lot_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_lot_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_mouth_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_mouth_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_mouth_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_nurse_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_nurse_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_nurse_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_price_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_price_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_price_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_strut_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_strut_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_strut_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_thought_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_thought_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_thought_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_trap_blend.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_trap_held.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/ph_trap_solo.s: %.s: %.mid $(MID) $< $@ -E -G130 -P4 $(MID_SUBDIR)/se_a.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P4 $(MID_SUBDIR)/se_bang.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_taillow_wing_flap.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P5 $(MID_SUBDIR)/se_glass_flute.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P5 $(MID_SUBDIR)/se_boo.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P4 $(MID_SUBDIR)/se_ball.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V070 -P4 $(MID_SUBDIR)/se_ball_open.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_mugshot.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P5 $(MID_SUBDIR)/se_contest_heart.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P5 $(MID_SUBDIR)/se_contest_curtain_fall.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V070 -P5 $(MID_SUBDIR)/se_contest_curtain_rise.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V070 -P5 $(MID_SUBDIR)/se_contest_icon_change.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P5 $(MID_SUBDIR)/se_contest_mons_turn.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P5 $(MID_SUBDIR)/se_contest_icon_clear.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P5 $(MID_SUBDIR)/se_card.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P4 $(MID_SUBDIR)/se_pike_curtain_close.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5 $(MID_SUBDIR)/se_pike_curtain_open.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5 $(MID_SUBDIR)/se_ledge.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P4 $(MID_SUBDIR)/se_itemfinder.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P5 $(MID_SUBDIR)/se_applause.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P5 $(MID_SUBDIR)/se_field_poison.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5 $(MID_SUBDIR)/se_door.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V080 -P5 $(MID_SUBDIR)/se_e.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4 $(MID_SUBDIR)/se_elevator.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_escalator.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_exp.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V080 -P5 $(MID_SUBDIR)/se_exp_max.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V094 -P5 $(MID_SUBDIR)/se_fu_zaku.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V120 -P4 $(MID_SUBDIR)/se_contest_condition_lose.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P4 $(MID_SUBDIR)/se_lavaridge_fall_warp.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -P4 $(MID_SUBDIR)/se_balloon_red.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4 $(MID_SUBDIR)/se_balloon_blue.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4 $(MID_SUBDIR)/se_balloon_yellow.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4 $(MID_SUBDIR)/se_arena_timeup1.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5 $(MID_SUBDIR)/se_arena_timeup2.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5 $(MID_SUBDIR)/se_bridge_walk.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P4 $(MID_SUBDIR)/se_failure.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V120 -P4 $(MID_SUBDIR)/se_rotating_gate.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4 $(MID_SUBDIR)/se_low_health.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P3 $(MID_SUBDIR)/se_i.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4 $(MID_SUBDIR)/se_sliding_door.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P4 $(MID_SUBDIR)/se_vend.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_bike_hop.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P4 $(MID_SUBDIR)/se_bike_bell.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4 $(MID_SUBDIR)/se_contest_place.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P4 $(MID_SUBDIR)/se_exit.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V120 -P5 $(MID_SUBDIR)/se_use_item.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_unlock.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_ball_bounce_1.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_ball_bounce_2.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_ball_bounce_3.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_ball_bounce_4.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_super_effective.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5 $(MID_SUBDIR)/se_not_effective.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5 $(MID_SUBDIR)/se_effective.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5 $(MID_SUBDIR)/se_puddle.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V020 -P4 $(MID_SUBDIR)/se_berry_blender.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4 $(MID_SUBDIR)/se_switch.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P4 $(MID_SUBDIR)/se_n.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -P4 $(MID_SUBDIR)/se_ball_throw.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P5 $(MID_SUBDIR)/se_ship.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V075 -P4 $(MID_SUBDIR)/se_flee.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P5 $(MID_SUBDIR)/se_o.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4 $(MID_SUBDIR)/se_intro_blast.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_pc_login.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_pc_off.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_pc_on.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_pin.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V060 -P4 $(MID_SUBDIR)/se_ding_dong.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P5 $(MID_SUBDIR)/se_pokenav_off.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_pokenav_on.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_faint.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5 $(MID_SUBDIR)/se_shiny.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P5 $(MID_SUBDIR)/se_shop.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P5 $(MID_SUBDIR)/se_rg_bag_cursor.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5 $(MID_SUBDIR)/se_rg_card_flip.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5 $(MID_SUBDIR)/se_rg_card_flipping.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5 $(MID_SUBDIR)/se_rg_card_open.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V112 -P5 $(MID_SUBDIR)/se_rg_deoxys_move.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V080 -P5 $(MID_SUBDIR)/se_rg_poke_jump_success.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P5 $(MID_SUBDIR)/se_rg_ball_click.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V100 -P5 $(MID_SUBDIR)/se_rg_help_close.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V095 -P5 $(MID_SUBDIR)/se_rg_help_error.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V125 -P5 $(MID_SUBDIR)/se_rg_help_open.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V096 -P5 $(MID_SUBDIR)/se_rg_ss_anne_horn.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V096 -P5 $(MID_SUBDIR)/se_rg_poke_jump_failure.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -P5 $(MID_SUBDIR)/se_rg_shop.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V080 -P5 $(MID_SUBDIR)/se_rg_door.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V100 -P5 $(MID_SUBDIR)/se_ice_crack.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P4 $(MID_SUBDIR)/se_ice_stairs.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4 $(MID_SUBDIR)/se_ice_break.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_fall.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_save.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P5 $(MID_SUBDIR)/se_success.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V080 -P4 $(MID_SUBDIR)/se_select.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V080 -P5 $(MID_SUBDIR)/se_ball_trade.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_thunderstorm.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P2 $(MID_SUBDIR)/se_thunderstorm_stop.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P2 $(MID_SUBDIR)/se_thunder.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P3 $(MID_SUBDIR)/se_thunder2.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P3 $(MID_SUBDIR)/se_rain.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P2 $(MID_SUBDIR)/se_rain_stop.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P2 $(MID_SUBDIR)/se_downpour.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P2 $(MID_SUBDIR)/se_downpour_stop.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P2 $(MID_SUBDIR)/se_orb.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P5 $(MID_SUBDIR)/se_egg_hatch.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P5 $(MID_SUBDIR)/se_roulette_ball.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P2 $(MID_SUBDIR)/se_roulette_ball2.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P2 $(MID_SUBDIR)/se_ball_tray_exit.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5 $(MID_SUBDIR)/se_ball_tray_ball.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P5 $(MID_SUBDIR)/se_ball_tray_enter.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P5 $(MID_SUBDIR)/se_click.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P4 $(MID_SUBDIR)/se_warp_in.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P4 $(MID_SUBDIR)/se_warp_out.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P4 $(MID_SUBDIR)/se_pokenav_call.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V120 -P5 $(MID_SUBDIR)/se_pokenav_hang_up.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V110 -P5 $(MID_SUBDIR)/se_note_a.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_note_b.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_note_c.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_note_c_high.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_note_d.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_mud_ball.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_note_e.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_note_f.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_note_g.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_breakable_door.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_truck_door.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_truck_unload.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -P4 $(MID_SUBDIR)/se_truck_move.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -P4 $(MID_SUBDIR)/se_truck_stop.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -P4 $(MID_SUBDIR)/se_repel.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P4 $(MID_SUBDIR)/se_u.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -P4 $(MID_SUBDIR)/se_sudowoodo_shake.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G129 -V077 -P5 $(MID_SUBDIR)/se_m_double_slap.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_comet_punch.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4 $(MID_SUBDIR)/se_m_pay_day.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P4 $(MID_SUBDIR)/se_m_fire_punch.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_scratch.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_vicegrip.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_razor_wind.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_razor_wind2.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4 $(MID_SUBDIR)/se_m_swords_dance.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_m_cut.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4 $(MID_SUBDIR)/se_m_gust.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_gust2.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_wing_attack.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4 $(MID_SUBDIR)/se_m_fly.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_bind.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4 $(MID_SUBDIR)/se_m_mega_kick.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4 $(MID_SUBDIR)/se_m_mega_kick2.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_jump_kick.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_sand_attack.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_headbutt.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_horn_attack.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_take_down.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4 $(MID_SUBDIR)/se_m_tail_whip.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_m_leer.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4 $(MID_SUBDIR)/se_dex_search.s: %.s: %.mid $(MID) $< $@ -E -R$(STD_REVERB) -G127 -v100 -P5 ================================================ FILE: sound/MPlayDef.s ================================================ .equ W00, 0x80 @ WAIT .equ W01, W00+1 @ .equ W02, W00+2 @ .equ W03, W00+3 @ .equ W04, W00+4 @ .equ W05, W00+5 @ .equ W06, W00+6 @ .equ W07, W00+7 @ .equ W08, W00+8 @ .equ W09, W00+9 @ .equ W10, W00+10 @ .equ W11, W00+11 @ .equ W12, W00+12 @ .equ W13, W00+13 @ .equ W14, W00+14 @ .equ W15, W00+15 @ .equ W16, W00+16 @ .equ W17, W00+17 @ .equ W18, W00+18 @ .equ W19, W00+19 @ .equ W20, W00+20 @ .equ W21, W00+21 @ .equ W22, W00+22 @ .equ W23, W00+23 @ .equ W24, W00+24 @ .equ W28, W00+25 @ .equ W30, W00+26 @ .equ W32, W00+27 @ .equ W36, W00+28 @ .equ W40, W00+29 @ .equ W42, W00+30 @ .equ W44, W00+31 @ .equ W48, W00+32 @ .equ W52, W00+33 @ .equ W54, W00+34 @ .equ W56, W00+35 @ .equ W60, W00+36 @ .equ W64, W00+37 @ .equ W66, W00+38 @ .equ W68, W00+39 @ .equ W72, W00+40 @ .equ W76, W00+41 @ .equ W78, W00+42 @ .equ W80, W00+43 @ .equ W84, W00+44 @ .equ W88, W00+45 @ .equ W90, W00+46 @ .equ W92, W00+47 @ .equ W96, W00+48 @ .equ FINE, 0xb1 @ fine .equ GOTO, 0xb2 @ goto .equ PATT, 0xb3 @ pattern play .equ PEND, 0xb4 @ pattern end .equ REPT, 0xb5 @ repeat .equ MEMACC, 0xb9 @ memacc op adr dat ***lib .equ PRIO, 0xba @ priority .equ TEMPO, 0xbb @ tempo (BPM/2) .equ KEYSH, 0xbc @ key shift .equ VOICE, 0xbd @ voice # .equ VOL, 0xbe @ volume .equ PAN, 0xbf @ panpot (c_v+??) .equ BEND, 0xc0 @ pitch bend (c_v+??) .equ BENDR, 0xc1 @ bend range .equ LFOS, 0xc2 @ LFO speed .equ LFODL, 0xc3 @ LFO delay .equ MOD, 0xc4 @ modulation depth .equ MODT, 0xc5 @ modulation type .equ TUNE, 0xc8 @ micro tuning (c_v+??) .equ XCMD, 0xcd @ extend command ***lib .equ xIECV, 0x08 @ imi.echo vol ***lib .equ xIECL, 0x09 @ imi.echo len ***lib .equ EOT, 0xce @ End of Tie .equ TIE, 0xcf @ .equ N01, TIE+1 @ NOTE .equ N02, N01+1 @ .equ N03, N01+2 @ .equ N04, N01+3 @ .equ N05, N01+4 @ .equ N06, N01+5 @ .equ N07, N01+6 @ .equ N08, N01+7 @ .equ N09, N01+8 @ .equ N10, N01+9 @ .equ N11, N01+10 @ .equ N12, N01+11 @ .equ N13, N01+12 @ .equ N14, N01+13 @ .equ N15, N01+14 @ .equ N16, N01+15 @ .equ N17, N01+16 @ .equ N18, N01+17 @ .equ N19, N01+18 @ .equ N20, N01+19 @ .equ N21, N01+20 @ .equ N22, N01+21 @ .equ N23, N01+22 @ .equ N24, N01+23 @ .equ N28, N01+24 @ .equ N30, N01+25 @ .equ N32, N01+26 @ .equ N36, N01+27 @ .equ N40, N01+28 @ .equ N42, N01+29 @ .equ N44, N01+30 @ .equ N48, N01+31 @ .equ N52, N01+32 @ .equ N54, N01+33 @ .equ N56, N01+34 @ .equ N60, N01+35 @ .equ N64, N01+36 @ .equ N66, N01+37 @ .equ N68, N01+38 @ .equ N72, N01+39 @ .equ N76, N01+40 @ .equ N78, N01+41 @ .equ N80, N01+42 @ .equ N84, N01+43 @ .equ N88, N01+44 @ .equ N90, N01+45 @ .equ N92, N01+46 @ .equ N96, N01+47 @ @ maximum value for volume .equ mxv, 0x7F @ @ center value of PAN, BEND, TUNE .equ c_v, 0x40 @ -64 ~ +63 @ note for N??, TIE, EOT .equ CnM2, 0 @ .equ CsM2, 1 @ .equ DnM2, 2 @ .equ DsM2, 3 @ .equ EnM2, 4 @ .equ FnM2, 5 @ .equ FsM2, 6 @ .equ GnM2, 7 @ .equ GsM2, 8 @ .equ AnM2, 9 @ .equ AsM2, 10 @ .equ BnM2, 11 @ .equ CnM1, 12 @ .equ CsM1, 13 @ .equ DnM1, 14 @ .equ DsM1, 15 @ .equ EnM1, 16 @ .equ FnM1, 17 @ .equ FsM1, 18 @ .equ GnM1, 19 @ .equ GsM1, 20 @ .equ AnM1, 21 @ .equ AsM1, 22 @ .equ BnM1, 23 @ .equ Cn0, 24 @ .equ Cs0, 25 @ .equ Dn0, 26 @ .equ Ds0, 27 @ .equ En0, 28 @ .equ Fn0, 29 @ .equ Fs0, 30 @ .equ Gn0, 31 @ .equ Gs0, 32 @ .equ An0, 33 @ .equ As0, 34 @ .equ Bn0, 35 @ .equ Cn1, 36 @ .equ Cs1, 37 @ .equ Dn1, 38 @ .equ Ds1, 39 @ .equ En1, 40 @ .equ Fn1, 41 @ .equ Fs1, 42 @ .equ Gn1, 43 @ .equ Gs1, 44 @ .equ An1, 45 @ .equ As1, 46 @ .equ Bn1, 47 @ .equ Cn2, 48 @ .equ Cs2, 49 @ .equ Dn2, 50 @ .equ Ds2, 51 @ .equ En2, 52 @ .equ Fn2, 53 @ .equ Fs2, 54 @ .equ Gn2, 55 @ .equ Gs2, 56 @ .equ An2, 57 @ .equ As2, 58 @ .equ Bn2, 59 @ .equ Cn3, 60 @ .equ Cs3, 61 @ .equ Dn3, 62 @ .equ Ds3, 63 @ .equ En3, 64 @ .equ Fn3, 65 @ .equ Fs3, 66 @ .equ Gn3, 67 @ .equ Gs3, 68 @ .equ An3, 69 @ 440Hz .equ As3, 70 @ .equ Bn3, 71 @ .equ Cn4, 72 @ .equ Cs4, 73 @ .equ Dn4, 74 @ .equ Ds4, 75 @ .equ En4, 76 @ .equ Fn4, 77 @ .equ Fs4, 78 @ .equ Gn4, 79 @ .equ Gs4, 80 @ .equ An4, 81 @ .equ As4, 82 @ .equ Bn4, 83 @ .equ Cn5, 84 @ .equ Cs5, 85 @ .equ Dn5, 86 @ .equ Ds5, 87 @ .equ En5, 88 @ .equ Fn5, 89 @ .equ Fs5, 90 @ .equ Gn5, 91 @ .equ Gs5, 92 @ .equ An5, 93 @ .equ As5, 94 @ .equ Bn5, 95 @ .equ Cn6, 96 @ .equ Cs6, 97 @ .equ Dn6, 98 @ .equ Ds6, 99 @ .equ En6, 100 @ .equ Fn6, 101 @ .equ Fs6, 102 @ .equ Gn6, 103 @ .equ Gs6, 104 @ .equ An6, 105 @ .equ As6, 106 @ .equ Bn6, 107 @ .equ Cn7, 108 @ .equ Cs7, 109 @ .equ Dn7, 110 @ .equ Ds7, 111 @ .equ En7, 112 @ .equ Fn7, 113 @ .equ Fs7, 114 @ .equ Gn7, 115 @ .equ Gs7, 116 @ .equ An7, 117 @ .equ As7, 118 @ .equ Bn7, 119 @ .equ Cn8, 120 @ .equ Cs8, 121 @ .equ Dn8, 122 @ .equ Ds8, 123 @ .equ En8, 124 @ .equ Fn8, 125 @ .equ Fs8, 126 @ .equ Gn8, 127 @ @ velocity .equ v000, 0 @ .equ v001, 1 @ .equ v002, 2 @ .equ v003, 3 @ .equ v004, 4 @ .equ v005, 5 @ .equ v006, 6 @ .equ v007, 7 @ .equ v008, 8 @ .equ v009, 9 @ .equ v010, 10 @ .equ v011, 11 @ .equ v012, 12 @ .equ v013, 13 @ .equ v014, 14 @ .equ v015, 15 @ .equ v016, 16 @ .equ v017, 17 @ .equ v018, 18 @ .equ v019, 19 @ .equ v020, 20 @ .equ v021, 21 @ .equ v022, 22 @ .equ v023, 23 @ .equ v024, 24 @ .equ v025, 25 @ .equ v026, 26 @ .equ v027, 27 @ .equ v028, 28 @ .equ v029, 29 @ .equ v030, 30 @ .equ v031, 31 @ .equ v032, 32 @ .equ v033, 33 @ .equ v034, 34 @ .equ v035, 35 @ .equ v036, 36 @ .equ v037, 37 @ .equ v038, 38 @ .equ v039, 39 @ .equ v040, 40 @ .equ v041, 41 @ .equ v042, 42 @ .equ v043, 43 @ .equ v044, 44 @ .equ v045, 45 @ .equ v046, 46 @ .equ v047, 47 @ .equ v048, 48 @ .equ v049, 49 @ .equ v050, 50 @ .equ v051, 51 @ .equ v052, 52 @ .equ v053, 53 @ .equ v054, 54 @ .equ v055, 55 @ .equ v056, 56 @ .equ v057, 57 @ .equ v058, 58 @ .equ v059, 59 @ .equ v060, 60 @ .equ v061, 61 @ .equ v062, 62 @ .equ v063, 63 @ .equ v064, 64 @ .equ v065, 65 @ .equ v066, 66 @ .equ v067, 67 @ .equ v068, 68 @ .equ v069, 69 @ .equ v070, 70 @ .equ v071, 71 @ .equ v072, 72 @ .equ v073, 73 @ .equ v074, 74 @ .equ v075, 75 @ .equ v076, 76 @ .equ v077, 77 @ .equ v078, 78 @ .equ v079, 79 @ .equ v080, 80 @ .equ v081, 81 @ .equ v082, 82 @ .equ v083, 83 @ .equ v084, 84 @ .equ v085, 85 @ .equ v086, 86 @ .equ v087, 87 @ .equ v088, 88 @ .equ v089, 89 @ .equ v090, 90 @ .equ v091, 91 @ .equ v092, 92 @ .equ v093, 93 @ .equ v094, 94 @ .equ v095, 95 @ .equ v096, 96 @ .equ v097, 97 @ .equ v098, 98 @ .equ v099, 99 @ .equ v100, 100 @ .equ v101, 101 @ .equ v102, 102 @ .equ v103, 103 @ .equ v104, 104 @ .equ v105, 105 @ .equ v106, 106 @ .equ v107, 107 @ .equ v108, 108 @ .equ v109, 109 @ .equ v110, 110 @ .equ v111, 111 @ .equ v112, 112 @ .equ v113, 113 @ .equ v114, 114 @ .equ v115, 115 @ .equ v116, 116 @ .equ v117, 117 @ .equ v118, 118 @ .equ v119, 119 @ .equ v120, 120 @ .equ v121, 121 @ .equ v122, 122 @ .equ v123, 123 @ .equ v124, 124 @ .equ v125, 125 @ .equ v126, 126 @ .equ v127, 127 @ @ exact gate time parameter for N?? .equ gtp1, 1 @ .equ gtp2, 2 @ .equ gtp3, 3 @ @ parameter of MODT .equ mod_vib,0 @ vibrate .equ mod_tre,1 @ tremolo .equ mod_pan,2 @ auto-panpot @ parameter of MEMACC .equ mem_set,0 @ .equ mem_add,1 @ .equ mem_sub,2 @ .equ mem_mem_set,3 @ .equ mem_mem_add,4 @ .equ mem_mem_sub,5 @ .equ mem_beq,6 @ .equ mem_bne,7 @ .equ mem_bhi,8 @ .equ mem_bhs,9 @ .equ mem_bls,10 @ .equ mem_blo,11 @ .equ mem_mem_beq,12 @ .equ mem_mem_bne,13 @ .equ mem_mem_bhi,14 @ .equ mem_mem_bhs,15 @ .equ mem_mem_bls,16 @ .equ mem_mem_blo,17 @ .equ reverb_set,0x80 @ SOUND_MODE_REVERB_SET .equ PAM, PAN @ ================================================ FILE: sound/cry_tables.inc ================================================ .align 2 gCryTable:: cry Cry_Bulbasaur cry Cry_Ivysaur cry Cry_Venusaur cry Cry_Charmander cry Cry_Charmeleon cry Cry_Charizard cry Cry_Squirtle cry Cry_Wartortle cry Cry_Blastoise cry Cry_Caterpie cry Cry_Metapod cry Cry_Butterfree cry Cry_Weedle cry Cry_Kakuna cry Cry_Beedrill cry Cry_Pidgey cry Cry_Pidgeotto cry Cry_Pidgeot cry Cry_Rattata cry Cry_Raticate cry Cry_Spearow cry Cry_Fearow cry Cry_Ekans cry Cry_Arbok cry Cry_Pikachu cry Cry_Raichu cry Cry_Sandshrew cry Cry_Sandslash cry Cry_NidoranF cry Cry_Nidorina cry Cry_Nidoqueen cry Cry_NidoranM cry Cry_Nidorino cry Cry_Nidoking cry Cry_Clefairy cry Cry_Clefable cry Cry_Vulpix cry Cry_Ninetales cry Cry_Jigglypuff cry Cry_Wigglytuff cry Cry_Zubat cry Cry_Golbat cry Cry_Oddish cry Cry_Gloom cry Cry_Vileplume cry Cry_Paras cry Cry_Parasect cry Cry_Venonat cry Cry_Venomoth cry Cry_Diglett cry Cry_Dugtrio cry Cry_Meowth cry Cry_Persian cry Cry_Psyduck cry Cry_Golduck cry Cry_Mankey cry Cry_Primeape cry Cry_Growlithe cry Cry_Arcanine cry Cry_Poliwag cry Cry_Poliwhirl cry Cry_Poliwrath cry Cry_Abra cry Cry_Kadabra cry Cry_Alakazam cry Cry_Machop cry Cry_Machoke cry Cry_Machamp cry Cry_Bellsprout cry Cry_Weepinbell cry Cry_Victreebel cry Cry_Tentacool cry Cry_Tentacruel cry Cry_Geodude cry Cry_Graveler cry Cry_Golem cry Cry_Ponyta cry Cry_Rapidash cry Cry_Slowpoke cry Cry_Slowbro cry Cry_Magnemite cry Cry_Magneton cry Cry_Farfetchd cry Cry_Doduo cry Cry_Dodrio cry Cry_Seel cry Cry_Dewgong cry Cry_Grimer cry Cry_Muk cry Cry_Shellder cry Cry_Cloyster cry Cry_Gastly cry Cry_Haunter cry Cry_Gengar cry Cry_Onix cry Cry_Drowzee cry Cry_Hypno cry Cry_Krabby cry Cry_Kingler cry Cry_Voltorb cry Cry_Electrode cry Cry_Exeggcute cry Cry_Exeggutor cry Cry_Cubone cry Cry_Marowak cry Cry_Hitmonlee cry Cry_Hitmonchan cry Cry_Lickitung cry Cry_Koffing cry Cry_Weezing cry Cry_Rhyhorn cry Cry_Rhydon cry Cry_Chansey cry Cry_Tangela cry Cry_Kangaskhan cry Cry_Horsea cry Cry_Seadra cry Cry_Goldeen cry Cry_Seaking cry Cry_Staryu cry Cry_Starmie cry Cry_MrMime cry Cry_Scyther cry Cry_Jynx cry Cry_Electabuzz cry Cry_Magmar cry Cry_Pinsir cry Cry_Tauros cry Cry_Magikarp cry Cry_Gyarados cry Cry_Lapras cry Cry_Ditto cry Cry_Eevee cry Cry_Vaporeon cry Cry_Jolteon cry Cry_Flareon cry Cry_Porygon cry Cry_Omanyte cry Cry_Omastar cry Cry_Kabuto cry Cry_Kabutops cry Cry_Aerodactyl cry Cry_Snorlax cry Cry_Articuno cry Cry_Zapdos cry Cry_Moltres cry Cry_Dratini cry Cry_Dragonair cry Cry_Dragonite cry Cry_Mewtwo cry Cry_Mew cry Cry_Chikorita cry Cry_Bayleef cry Cry_Meganium cry Cry_Cyndaquil cry Cry_Quilava cry Cry_Typhlosion cry Cry_Totodile cry Cry_Croconaw cry Cry_Feraligatr cry Cry_Sentret cry Cry_Furret cry Cry_Hoothoot cry Cry_Noctowl cry Cry_Ledyba cry Cry_Ledian cry Cry_Spinarak cry Cry_Ariados cry Cry_Crobat cry Cry_Chinchou cry Cry_Lanturn cry Cry_Pichu cry Cry_Cleffa cry Cry_Igglybuff cry Cry_Togepi cry Cry_Togetic cry Cry_Natu cry Cry_Xatu cry Cry_Mareep cry Cry_Flaaffy cry Cry_Ampharos cry Cry_Bellossom cry Cry_Marill cry Cry_Azumarill cry Cry_Sudowoodo cry Cry_Politoed cry Cry_Hoppip cry Cry_Skiploom cry Cry_Jumpluff cry Cry_Aipom cry Cry_Sunkern cry Cry_Sunflora cry Cry_Yanma cry Cry_Wooper cry Cry_Quagsire cry Cry_Espeon cry Cry_Umbreon cry Cry_Murkrow cry Cry_Slowking cry Cry_Misdreavus cry Cry_Unown cry Cry_Wobbuffet cry Cry_Girafarig cry Cry_Pineco cry Cry_Forretress cry Cry_Dunsparce cry Cry_Gligar cry Cry_Steelix cry Cry_Snubbull cry Cry_Granbull cry Cry_Qwilfish cry Cry_Scizor cry Cry_Shuckle cry Cry_Heracross cry Cry_Sneasel cry Cry_Teddiursa cry Cry_Ursaring cry Cry_Slugma cry Cry_Magcargo cry Cry_Swinub cry Cry_Piloswine cry Cry_Corsola cry Cry_Remoraid cry Cry_Octillery cry Cry_Delibird cry Cry_Mantine cry Cry_Skarmory cry Cry_Houndour cry Cry_Houndoom cry Cry_Kingdra cry Cry_Phanpy cry Cry_Donphan cry Cry_Porygon2 cry Cry_Stantler cry Cry_Smeargle cry Cry_Tyrogue cry Cry_Hitmontop cry Cry_Smoochum cry Cry_Elekid cry Cry_Magby cry Cry_Miltank cry Cry_Blissey cry Cry_Raikou cry Cry_Entei cry Cry_Suicune cry Cry_Larvitar cry Cry_Pupitar cry Cry_Tyranitar cry Cry_Lugia cry Cry_HoOh cry Cry_Celebi cry Cry_Kecleon cry Cry_Roselia cry Cry_Torkoal cry Cry_Electrike cry Cry_Manectric cry Cry_Duskull cry Cry_Latias cry Cry_Wynaut cry Cry_Seviper cry Cry_Sharpedo cry Cry_Zangoose cry Cry_Azurill cry Cry_Swablu cry Cry_Altaria cry Cry_Unused265 cry Cry_Taillow cry Cry_Swellow cry Cry_Unused268 cry Cry_Spinda cry Cry_Torchic cry Cry_Combusken cry Cry_Blaziken cry Cry_Treecko cry Cry_Grovyle cry Cry_Sceptile cry Cry_Mudkip cry Cry_Marshtomp cry Cry_Swampert cry Cry_Pelipper cry Cry_Wingull cry Cry_Banette cry Cry_Shuppet cry Cry_Lotad cry Cry_Lombre cry Cry_Ludicolo cry Cry_Seedot cry Cry_Nuzleaf cry Cry_Shiftry cry Cry_Carvanha cry Cry_Wurmple cry Cry_Silcoon cry Cry_Beautifly cry Cry_Cascoon cry Cry_Dustox cry Cry_Ralts cry Cry_Kirlia cry Cry_Gardevoir cry Cry_Slakoth cry Cry_Vigoroth cry Cry_Slaking cry Cry_Nincada cry Cry_Ninjask cry Cry_Shedinja cry Cry_Makuhita cry Cry_Hariyama cry Cry_Nosepass cry Cry_Glalie cry Cry_Plusle cry Cry_Minun cry Cry_Surskit cry Cry_Masquerain cry Cry_Skitty cry Cry_Delcatty cry Cry_Gulpin cry Cry_Swalot cry Cry_Numel cry Cry_Camerupt cry Cry_Barboach cry Cry_Whiscash cry Cry_Corphish cry Cry_Crawdaunt cry Cry_Spoink cry Cry_Grumpig cry Cry_Trapinch cry Cry_Vibrava cry Cry_Flygon cry Cry_Cacnea cry Cry_Cacturne cry Cry_Baltoy cry Cry_Claydol cry Cry_Lunatone cry Cry_Solrock cry Cry_Feebas cry Cry_Milotic cry Cry_Absol cry Cry_Meditite cry Cry_Medicham cry Cry_Spheal cry Cry_Sealeo cry Cry_Walrein cry Cry_Clamperl cry Cry_Huntail cry Cry_Gorebyss cry Cry_Lileep cry Cry_Cradily cry Cry_Anorith cry Cry_Armaldo cry Cry_Beldum cry Cry_Metang cry Cry_Metagross cry Cry_Bagon cry Cry_Shelgon cry Cry_Regirock cry Cry_Regice cry Cry_Registeel cry Cry_Castform cry Cry_Volbeat cry Cry_Illumise cry Cry_Poochyena cry Cry_Mightyena cry Cry_Dusclops cry Cry_Sableye cry Cry_Mawile cry Cry_Aron cry Cry_Lairon cry Cry_Aggron cry Cry_Relicanth cry Cry_Luvdisc cry Cry_Groudon cry Cry_Kyogre cry Cry_Rayquaza cry Cry_Salamence cry Cry_Breloom cry Cry_Shroomish cry Cry_Linoone cry Cry_Tropius cry Cry_Wailmer cry Cry_Zigzagoon cry Cry_Exploud cry Cry_Loudred cry Cry_Wailord cry Cry_Whismur cry Cry_Snorunt cry Cry_Latios cry Cry_Jirachi cry Cry_Deoxys cry Cry_Chimecho .align 2 gCryTable_Reverse:: cry_reverse Cry_Bulbasaur cry_reverse Cry_Ivysaur cry_reverse Cry_Venusaur cry_reverse Cry_Charmander cry_reverse Cry_Charmeleon cry_reverse Cry_Charizard cry_reverse Cry_Squirtle cry_reverse Cry_Wartortle cry_reverse Cry_Blastoise cry_reverse Cry_Caterpie cry_reverse Cry_Metapod cry_reverse Cry_Butterfree cry_reverse Cry_Weedle cry_reverse Cry_Kakuna cry_reverse Cry_Beedrill cry_reverse Cry_Pidgey cry_reverse Cry_Pidgeotto cry_reverse Cry_Pidgeot cry_reverse Cry_Rattata cry_reverse Cry_Raticate cry_reverse Cry_Spearow cry_reverse Cry_Fearow cry_reverse Cry_Ekans cry_reverse Cry_Arbok cry_reverse Cry_Pikachu cry_reverse Cry_Raichu cry_reverse Cry_Sandshrew cry_reverse Cry_Sandslash cry_reverse Cry_NidoranF cry_reverse Cry_Nidorina cry_reverse Cry_Nidoqueen cry_reverse Cry_NidoranM cry_reverse Cry_Nidorino cry_reverse Cry_Nidoking cry_reverse Cry_Clefairy cry_reverse Cry_Clefable cry_reverse Cry_Vulpix cry_reverse Cry_Ninetales cry_reverse Cry_Jigglypuff cry_reverse Cry_Wigglytuff cry_reverse Cry_Zubat cry_reverse Cry_Golbat cry_reverse Cry_Oddish cry_reverse Cry_Gloom cry_reverse Cry_Vileplume cry_reverse Cry_Paras cry_reverse Cry_Parasect cry_reverse Cry_Venonat cry_reverse Cry_Venomoth cry_reverse Cry_Diglett cry_reverse Cry_Dugtrio cry_reverse Cry_Meowth cry_reverse Cry_Persian cry_reverse Cry_Psyduck cry_reverse Cry_Golduck cry_reverse Cry_Mankey cry_reverse Cry_Primeape cry_reverse Cry_Growlithe cry_reverse Cry_Arcanine cry_reverse Cry_Poliwag cry_reverse Cry_Poliwhirl cry_reverse Cry_Poliwrath cry_reverse Cry_Abra cry_reverse Cry_Kadabra cry_reverse Cry_Alakazam cry_reverse Cry_Machop cry_reverse Cry_Machoke cry_reverse Cry_Machamp cry_reverse Cry_Bellsprout cry_reverse Cry_Weepinbell cry_reverse Cry_Victreebel cry_reverse Cry_Tentacool cry_reverse Cry_Tentacruel cry_reverse Cry_Geodude cry_reverse Cry_Graveler cry_reverse Cry_Golem cry_reverse Cry_Ponyta cry_reverse Cry_Rapidash cry_reverse Cry_Slowpoke cry_reverse Cry_Slowbro cry_reverse Cry_Magnemite cry_reverse Cry_Magneton cry_reverse Cry_Farfetchd cry_reverse Cry_Doduo cry_reverse Cry_Dodrio cry_reverse Cry_Seel cry_reverse Cry_Dewgong cry_reverse Cry_Grimer cry_reverse Cry_Muk cry_reverse Cry_Shellder cry_reverse Cry_Cloyster cry_reverse Cry_Gastly cry_reverse Cry_Haunter cry_reverse Cry_Gengar cry_reverse Cry_Onix cry_reverse Cry_Drowzee cry_reverse Cry_Hypno cry_reverse Cry_Krabby cry_reverse Cry_Kingler cry_reverse Cry_Voltorb cry_reverse Cry_Electrode cry_reverse Cry_Exeggcute cry_reverse Cry_Exeggutor cry_reverse Cry_Cubone cry_reverse Cry_Marowak cry_reverse Cry_Hitmonlee cry_reverse Cry_Hitmonchan cry_reverse Cry_Lickitung cry_reverse Cry_Koffing cry_reverse Cry_Weezing cry_reverse Cry_Rhyhorn cry_reverse Cry_Rhydon cry_reverse Cry_Chansey cry_reverse Cry_Tangela cry_reverse Cry_Kangaskhan cry_reverse Cry_Horsea cry_reverse Cry_Seadra cry_reverse Cry_Goldeen cry_reverse Cry_Seaking cry_reverse Cry_Staryu cry_reverse Cry_Starmie cry_reverse Cry_MrMime cry_reverse Cry_Scyther cry_reverse Cry_Jynx cry_reverse Cry_Electabuzz cry_reverse Cry_Magmar cry_reverse Cry_Pinsir cry_reverse Cry_Tauros cry_reverse Cry_Magikarp cry_reverse Cry_Gyarados cry_reverse Cry_Lapras cry_reverse Cry_Ditto cry_reverse Cry_Eevee cry_reverse Cry_Vaporeon cry_reverse Cry_Jolteon cry_reverse Cry_Flareon cry_reverse Cry_Porygon cry_reverse Cry_Omanyte cry_reverse Cry_Omastar cry_reverse Cry_Kabuto cry_reverse Cry_Kabutops cry_reverse Cry_Aerodactyl cry_reverse Cry_Snorlax cry_reverse Cry_Articuno cry_reverse Cry_Zapdos cry_reverse Cry_Moltres cry_reverse Cry_Dratini cry_reverse Cry_Dragonair cry_reverse Cry_Dragonite cry_reverse Cry_Mewtwo cry_reverse Cry_Mew cry_reverse Cry_Chikorita cry_reverse Cry_Bayleef cry_reverse Cry_Meganium cry_reverse Cry_Cyndaquil cry_reverse Cry_Quilava cry_reverse Cry_Typhlosion cry_reverse Cry_Totodile cry_reverse Cry_Croconaw cry_reverse Cry_Feraligatr cry_reverse Cry_Sentret cry_reverse Cry_Furret cry_reverse Cry_Hoothoot cry_reverse Cry_Noctowl cry_reverse Cry_Ledyba cry_reverse Cry_Ledian cry_reverse Cry_Spinarak cry_reverse Cry_Ariados cry_reverse Cry_Crobat cry_reverse Cry_Chinchou cry_reverse Cry_Lanturn cry_reverse Cry_Pichu cry_reverse Cry_Cleffa cry_reverse Cry_Igglybuff cry_reverse Cry_Togepi cry_reverse Cry_Togetic cry_reverse Cry_Natu cry_reverse Cry_Xatu cry_reverse Cry_Mareep cry_reverse Cry_Flaaffy cry_reverse Cry_Ampharos cry_reverse Cry_Bellossom cry_reverse Cry_Marill cry_reverse Cry_Azumarill cry_reverse Cry_Sudowoodo cry_reverse Cry_Politoed cry_reverse Cry_Hoppip cry_reverse Cry_Skiploom cry_reverse Cry_Jumpluff cry_reverse Cry_Aipom cry_reverse Cry_Sunkern cry_reverse Cry_Sunflora cry_reverse Cry_Yanma cry_reverse Cry_Wooper cry_reverse Cry_Quagsire cry_reverse Cry_Espeon cry_reverse Cry_Umbreon cry_reverse Cry_Murkrow cry_reverse Cry_Slowking cry_reverse Cry_Misdreavus cry_reverse Cry_Unown cry_reverse Cry_Wobbuffet cry_reverse Cry_Girafarig cry_reverse Cry_Pineco cry_reverse Cry_Forretress cry_reverse Cry_Dunsparce cry_reverse Cry_Gligar cry_reverse Cry_Steelix cry_reverse Cry_Snubbull cry_reverse Cry_Granbull cry_reverse Cry_Qwilfish cry_reverse Cry_Scizor cry_reverse Cry_Shuckle cry_reverse Cry_Heracross cry_reverse Cry_Sneasel cry_reverse Cry_Teddiursa cry_reverse Cry_Ursaring cry_reverse Cry_Slugma cry_reverse Cry_Magcargo cry_reverse Cry_Swinub cry_reverse Cry_Piloswine cry_reverse Cry_Corsola cry_reverse Cry_Remoraid cry_reverse Cry_Octillery cry_reverse Cry_Delibird cry_reverse Cry_Mantine cry_reverse Cry_Skarmory cry_reverse Cry_Houndour cry_reverse Cry_Houndoom cry_reverse Cry_Kingdra cry_reverse Cry_Phanpy cry_reverse Cry_Donphan cry_reverse Cry_Porygon2 cry_reverse Cry_Stantler cry_reverse Cry_Smeargle cry_reverse Cry_Tyrogue cry_reverse Cry_Hitmontop cry_reverse Cry_Smoochum cry_reverse Cry_Elekid cry_reverse Cry_Magby cry_reverse Cry_Miltank cry_reverse Cry_Blissey cry_reverse Cry_Raikou cry_reverse Cry_Entei cry_reverse Cry_Suicune cry_reverse Cry_Larvitar cry_reverse Cry_Pupitar cry_reverse Cry_Tyranitar cry_reverse Cry_Lugia cry_reverse Cry_HoOh cry_reverse Cry_Celebi cry_reverse Cry_Kecleon cry_reverse Cry_Roselia cry_reverse Cry_Torkoal cry_reverse Cry_Electrike cry_reverse Cry_Manectric cry_reverse Cry_Duskull cry_reverse Cry_Latias cry_reverse Cry_Wynaut cry_reverse Cry_Seviper cry_reverse Cry_Sharpedo cry_reverse Cry_Zangoose cry_reverse Cry_Azurill cry_reverse Cry_Swablu cry_reverse Cry_Altaria cry_reverse Cry_Unused265 cry_reverse Cry_Taillow cry_reverse Cry_Swellow cry_reverse Cry_Unused268 cry_reverse Cry_Spinda cry_reverse Cry_Torchic cry_reverse Cry_Combusken cry_reverse Cry_Blaziken cry_reverse Cry_Treecko cry_reverse Cry_Grovyle cry_reverse Cry_Sceptile cry_reverse Cry_Mudkip cry_reverse Cry_Marshtomp cry_reverse Cry_Swampert cry_reverse Cry_Pelipper cry_reverse Cry_Wingull cry_reverse Cry_Banette cry_reverse Cry_Shuppet cry_reverse Cry_Lotad cry_reverse Cry_Lombre cry_reverse Cry_Ludicolo cry_reverse Cry_Seedot cry_reverse Cry_Nuzleaf cry_reverse Cry_Shiftry cry_reverse Cry_Carvanha cry_reverse Cry_Wurmple cry_reverse Cry_Silcoon cry_reverse Cry_Beautifly cry_reverse Cry_Cascoon cry_reverse Cry_Dustox cry_reverse Cry_Ralts cry_reverse Cry_Kirlia cry_reverse Cry_Gardevoir cry_reverse Cry_Slakoth cry_reverse Cry_Vigoroth cry_reverse Cry_Slaking cry_reverse Cry_Nincada cry_reverse Cry_Ninjask cry_reverse Cry_Shedinja cry_reverse Cry_Makuhita cry_reverse Cry_Hariyama cry_reverse Cry_Nosepass cry_reverse Cry_Glalie cry_reverse Cry_Plusle cry_reverse Cry_Minun cry_reverse Cry_Surskit cry_reverse Cry_Masquerain cry_reverse Cry_Skitty cry_reverse Cry_Delcatty cry_reverse Cry_Gulpin cry_reverse Cry_Swalot cry_reverse Cry_Numel cry_reverse Cry_Camerupt cry_reverse Cry_Barboach cry_reverse Cry_Whiscash cry_reverse Cry_Corphish cry_reverse Cry_Crawdaunt cry_reverse Cry_Spoink cry_reverse Cry_Grumpig cry_reverse Cry_Trapinch cry_reverse Cry_Vibrava cry_reverse Cry_Flygon cry_reverse Cry_Cacnea cry_reverse Cry_Cacturne cry_reverse Cry_Baltoy cry_reverse Cry_Claydol cry_reverse Cry_Lunatone cry_reverse Cry_Solrock cry_reverse Cry_Feebas cry_reverse Cry_Milotic cry_reverse Cry_Absol cry_reverse Cry_Meditite cry_reverse Cry_Medicham cry_reverse Cry_Spheal cry_reverse Cry_Sealeo cry_reverse Cry_Walrein cry_reverse Cry_Clamperl cry_reverse Cry_Huntail cry_reverse Cry_Gorebyss cry_reverse Cry_Lileep cry_reverse Cry_Cradily cry_reverse Cry_Anorith cry_reverse Cry_Armaldo cry_reverse Cry_Beldum cry_reverse Cry_Metang cry_reverse Cry_Metagross cry_reverse Cry_Bagon cry_reverse Cry_Shelgon cry_reverse Cry_Regirock cry_reverse Cry_Regice cry_reverse Cry_Registeel cry_reverse Cry_Castform cry_reverse Cry_Volbeat cry_reverse Cry_Illumise cry_reverse Cry_Poochyena cry_reverse Cry_Mightyena cry_reverse Cry_Dusclops cry_reverse Cry_Sableye cry_reverse Cry_Mawile cry_reverse Cry_Aron cry_reverse Cry_Lairon cry_reverse Cry_Aggron cry_reverse Cry_Relicanth cry_reverse Cry_Luvdisc cry_reverse Cry_Groudon cry_reverse Cry_Kyogre cry_reverse Cry_Rayquaza cry_reverse Cry_Salamence cry_reverse Cry_Breloom cry_reverse Cry_Shroomish cry_reverse Cry_Linoone cry_reverse Cry_Tropius cry_reverse Cry_Wailmer cry_reverse Cry_Zigzagoon cry_reverse Cry_Exploud cry_reverse Cry_Loudred cry_reverse Cry_Wailord cry_reverse Cry_Whismur cry_reverse Cry_Snorunt cry_reverse Cry_Latios cry_reverse Cry_Jirachi cry_reverse Cry_Deoxys cry_reverse Cry_Chimecho ================================================ FILE: sound/direct_sound_data.inc ================================================ .align 2 DirectSoundWaveData_sc88pro_glockenspiel:: .incbin "sound/direct_sound_samples/sc88pro_glockenspiel.bin" .align 2 DirectSoundWaveData_sc88pro_organ2:: .incbin "sound/direct_sound_samples/sc88pro_organ2.bin" .align 2 DirectSoundWaveData_sc88pro_fretless_bass:: .incbin "sound/direct_sound_samples/sc88pro_fretless_bass.bin" .align 2 DirectSoundWaveData_sc88pro_slap_bass:: .incbin "sound/direct_sound_samples/sc88pro_slap_bass.bin" .align 2 DirectSoundWaveData_sc88pro_synth_bass:: .incbin "sound/direct_sound_samples/sc88pro_synth_bass.bin" .align 2 DirectSoundWaveData_sc88pro_timpani:: .incbin "sound/direct_sound_samples/sc88pro_timpani.bin" .align 2 DirectSoundWaveData_classical_choir_voice_ahhs:: .incbin "sound/direct_sound_samples/classical_choir_voice_ahhs.bin" .align 2 DirectSoundWaveData_sd90_classical_oboe:: .incbin "sound/direct_sound_samples/sd90_classical_oboe.bin" .align 2 DirectSoundWaveData_unused_sd90_oboe:: .incbin "sound/direct_sound_samples/unused_sd90_oboe.bin" .align 2 DirectSoundWaveData_unused_guitar_separates_power_chord:: .incbin "sound/direct_sound_samples/unused_guitar_separates_power_chord.bin" .align 2 DirectSoundWaveData_unused_sc88pro_unison_slap:: .incbin "sound/direct_sound_samples/unused_sc88pro_unison_slap.bin" .align 2 DirectSoundWaveData_unknown_snare:: .incbin "sound/direct_sound_samples/unknown_snare.bin" .align 2 DirectSoundWaveData_ethnic_flavours_ohtsuzumi:: .incbin "sound/direct_sound_samples/ethnic_flavours_ohtsuzumi.bin" .align 2 DirectSoundWaveData_ethnic_flavours_hyoushigi:: .incbin "sound/direct_sound_samples/ethnic_flavours_hyoushigi.bin" .align 2 DirectSoundWaveData_sc88pro_rnd_kick:: .incbin "sound/direct_sound_samples/sc88pro_rnd_kick.bin" .align 2 DirectSoundWaveData_sc88pro_rnd_snare:: .incbin "sound/direct_sound_samples/sc88pro_rnd_snare.bin" .align 2 DirectSoundWaveData_sc88pro_tr909_hand_clap:: .incbin "sound/direct_sound_samples/sc88pro_tr909_hand_clap.bin" .align 2 DirectSoundWaveData_sc88pro_orchestra_snare:: .incbin "sound/direct_sound_samples/sc88pro_orchestra_snare.bin" .align 2 DirectSoundWaveData_unused_sc55_tom:: .incbin "sound/direct_sound_samples/unused_sc55_tom.bin" .align 2 DirectSoundWaveData_unknown_close_hihat:: .incbin "sound/direct_sound_samples/unknown_close_hihat.bin" .align 2 DirectSoundWaveData_unknown_open_hihat:: .incbin "sound/direct_sound_samples/unknown_open_hihat.bin" .align 2 DirectSoundWaveData_unknown_bell:: .incbin "sound/direct_sound_samples/unknown_bell.bin" .align 2 DirectSoundWaveData_sc88pro_tambourine:: .incbin "sound/direct_sound_samples/sc88pro_tambourine.bin" .align 2 DirectSoundWaveData_trinity_cymbal_crash:: .incbin "sound/direct_sound_samples/trinity_cymbal_crash.bin" .align 2 DirectSoundWaveData_sc88pro_orchestra_cymbal_crash:: .incbin "sound/direct_sound_samples/sc88pro_orchestra_cymbal_crash.bin" .align 2 DirectSoundWaveData_sc88pro_mute_high_conga:: .incbin "sound/direct_sound_samples/sc88pro_mute_high_conga.bin" .align 2 DirectSoundWaveData_sc88pro_open_low_conga:: .incbin "sound/direct_sound_samples/sc88pro_open_low_conga.bin" .align 2 DirectSoundWaveData_drum_and_percussion_kick:: .incbin "sound/direct_sound_samples/drum_and_percussion_kick.bin" .align 2 DirectSoundWaveData_sd90_solo_snare:: .incbin "sound/direct_sound_samples/sd90_solo_snare.bin" .align 2 DirectSoundWaveData_sd90_ambient_tom:: .incbin "sound/direct_sound_samples/sd90_ambient_tom.bin" .align 2 DirectSoundWaveData_dance_drums_ride_bell:: .incbin "sound/direct_sound_samples/dance_drums_ride_bell.bin" .align 2 DirectSoundWaveData_sd90_cowbell:: .incbin "sound/direct_sound_samples/sd90_cowbell.bin" .align 2 DirectSoundWaveData_unused_heart_of_asia_indian_drum:: .incbin "sound/direct_sound_samples/unused_heart_of_asia_indian_drum.bin" .align 2 DirectSoundWaveData_sd90_open_triangle:: .incbin "sound/direct_sound_samples/sd90_open_triangle.bin" .align 2 DirectSoundWaveData_sc88pro_jingle_bell:: .incbin "sound/direct_sound_samples/sc88pro_jingle_bell.bin" .align 2 DirectSoundWaveData_ethnic_flavours_atarigane:: .incbin "sound/direct_sound_samples/ethnic_flavours_atarigane.bin" .align 2 DirectSoundWaveData_sc88pro_taiko:: .incbin "sound/direct_sound_samples/sc88pro_taiko.bin" .align 2 DirectSoundWaveData_ethnic_flavours_kotsuzumi:: .incbin "sound/direct_sound_samples/ethnic_flavours_kotsuzumi.bin" .align 2 DirectSoundWaveData_sc88pro_piano1_48:: .incbin "sound/direct_sound_samples/sc88pro_piano1_48.bin" .align 2 DirectSoundWaveData_sc88pro_piano1_60:: .incbin "sound/direct_sound_samples/sc88pro_piano1_60.bin" .align 2 DirectSoundWaveData_sc88pro_piano1_72:: .incbin "sound/direct_sound_samples/sc88pro_piano1_72.bin" .align 2 DirectSoundWaveData_sc88pro_piano1_84:: .incbin "sound/direct_sound_samples/sc88pro_piano1_84.bin" .align 2 DirectSoundWaveData_sc88pro_string_ensemble_60:: .incbin "sound/direct_sound_samples/sc88pro_string_ensemble_60.bin" .align 2 DirectSoundWaveData_sc88pro_string_ensemble_72:: .incbin "sound/direct_sound_samples/sc88pro_string_ensemble_72.bin" .align 2 DirectSoundWaveData_sc88pro_string_ensemble_84:: .incbin "sound/direct_sound_samples/sc88pro_string_ensemble_84.bin" .align 2 DirectSoundWaveData_sc88pro_trumpet_60:: .incbin "sound/direct_sound_samples/sc88pro_trumpet_60.bin" .align 2 DirectSoundWaveData_sc88pro_trumpet_72:: .incbin "sound/direct_sound_samples/sc88pro_trumpet_72.bin" .align 2 DirectSoundWaveData_sc88pro_trumpet_84:: .incbin "sound/direct_sound_samples/sc88pro_trumpet_84.bin" .align 2 DirectSoundWaveData_sc88pro_tuba_39:: @N.B.: These tuba samples are actually sampled at 36 and 48, then pitched up .incbin "sound/direct_sound_samples/sc88pro_tuba_39.bin" .align 2 DirectSoundWaveData_sc88pro_tuba_51:: .incbin "sound/direct_sound_samples/sc88pro_tuba_51.bin" .align 2 DirectSoundWaveData_sc88pro_french_horn_60:: .incbin "sound/direct_sound_samples/sc88pro_french_horn_60.bin" .align 2 DirectSoundWaveData_sc88pro_french_horn_72:: .incbin "sound/direct_sound_samples/sc88pro_french_horn_72.bin" .align 2 DirectSoundWaveData_sc88pro_flute:: .incbin "sound/direct_sound_samples/sc88pro_flute.bin" .align 2 DirectSoundWaveData_sc88pro_fingered_bass:: .incbin "sound/direct_sound_samples/sc88pro_fingered_bass.bin" .align 2 DirectSoundWaveData_unknown_koto_high:: .incbin "sound/direct_sound_samples/unknown_koto_high.bin" .align 2 DirectSoundWaveData_sd90_classical_shakuhachi:: .incbin "sound/direct_sound_samples/sd90_classical_shakuhachi.bin" .align 2 DirectSoundWaveData_unknown_koto_low:: .incbin "sound/direct_sound_samples/unknown_koto_low.bin" .align 2 DirectSoundWaveData_sd90_classical_overdrive_guitar:: .incbin "sound/direct_sound_samples/sd90_classical_overdrive_guitar.bin" .align 2 DirectSoundWaveData_sd90_classical_distortion_guitar_high:: .incbin "sound/direct_sound_samples/sd90_classical_distortion_guitar_high.bin" .align 2 DirectSoundWaveData_sd90_classical_distortion_guitar_low:: .incbin "sound/direct_sound_samples/sd90_classical_distortion_guitar_low.bin" .align 2 DirectSoundWaveData_heart_of_asia_gamelan:: .incbin "sound/direct_sound_samples/heart_of_asia_gamelan.bin" .align 2 DirectSoundWaveData_sc88pro_church_organ3_low:: .incbin "sound/direct_sound_samples/sc88pro_church_organ3_low.bin" .align 2 DirectSoundWaveData_sc88pro_church_organ3_high:: .incbin "sound/direct_sound_samples/sc88pro_church_organ3_high.bin" .align 2 DirectSoundWaveData_unknown_female_voice:: .incbin "sound/direct_sound_samples/unknown_female_voice.bin" .align 2 DirectSoundWaveData_unused_unknown_male_voice:: .incbin "sound/direct_sound_samples/unused_unknown_male_voice.bin" .align 2 DirectSoundWaveData_sd90_classical_detuned_ep1_low:: .incbin "sound/direct_sound_samples/sd90_classical_detuned_ep1_low.bin" .align 2 DirectSoundWaveData_sd90_classical_detuned_ep1_high:: .incbin "sound/direct_sound_samples/sd90_classical_detuned_ep1_high.bin" .align 2 DirectSoundWaveData_sc88pro_timpani_with_snare:: .incbin "sound/direct_sound_samples/sc88pro_timpani_with_snare.bin" .align 2 DirectSoundWaveData_unknown_synth_snare:: .incbin "sound/direct_sound_samples/unknown_synth_snare.bin" .align 2 DirectSoundWaveData_sc88pro_square_wave:: .incbin "sound/direct_sound_samples/sc88pro_square_wave.bin" .align 2 DirectSoundWaveData_bicycle_bell:: .incbin "sound/direct_sound_samples/bicycle_bell.bin" .align 2 DirectSoundWaveData_unknown_1:: .incbin "sound/direct_sound_samples/unknown_01.bin" .align 2 DirectSoundWaveData_sc88pro_pizzicato_strings:: .incbin "sound/direct_sound_samples/sc88pro_pizzicato_strings.bin" .align 2 DirectSoundWaveData_unknown_2:: .incbin "sound/direct_sound_samples/unknown_02.bin" .align 2 DirectSoundWaveData_unknown_3:: .incbin "sound/direct_sound_samples/unknown_03.bin" .align 2 DirectSoundWaveData_unknown_4:: .incbin "sound/direct_sound_samples/unknown_04.bin" .align 2 DirectSoundWaveData_sc88pro_wind:: .incbin "sound/direct_sound_samples/sc88pro_wind.bin" .align 2 DirectSoundWaveData_sc88pro_bubbles:: .incbin "sound/direct_sound_samples/sc88pro_bubbles.bin" .align 2 DirectSoundWaveData_unknown_5:: .incbin "sound/direct_sound_samples/unknown_05.bin" .align 2 DirectSoundWaveData_unknown_6:: .incbin "sound/direct_sound_samples/unknown_06.bin" .align 2 DirectSoundWaveData_trinity_30303_mega_bass:: .incbin "sound/direct_sound_samples/trinity_30303_mega_bass.bin" .align 2 DirectSoundWaveData_unknown_7:: .incbin "sound/direct_sound_samples/unknown_07.bin" .align 2 DirectSoundWaveData_unknown_8:: .incbin "sound/direct_sound_samples/unknown_08.bin" .align 2 DirectSoundWaveData_sc88pro_tubular_bell:: .incbin "sound/direct_sound_samples/sc88pro_tubular_bell.bin" .align 2 DirectSoundWaveData_unknown_9:: .incbin "sound/direct_sound_samples/unknown_09.bin" .align 2 DirectSoundWaveData_trinity_big_boned:: .incbin "sound/direct_sound_samples/trinity_big_boned.bin" .align 2 DirectSoundWaveData_sc88pro_harp:: .incbin "sound/direct_sound_samples/sc88pro_harp.bin" .align 2 DirectSoundWaveData_sc88pro_xylophone:: .incbin "sound/direct_sound_samples/sc88pro_xylophone.bin" .align 2 DirectSoundWaveData_unknown_10:: .incbin "sound/direct_sound_samples/unknown_10.bin" .align 2 DirectSoundWaveData_unknown_11:: .incbin "sound/direct_sound_samples/unknown_11.bin" .align 2 DirectSoundWaveData_sc88pro_accordion:: .incbin "sound/direct_sound_samples/sc88pro_accordion.bin" .align 2 DirectSoundWaveData_unknown_12:: .incbin "sound/direct_sound_samples/unknown_12.bin" .align 2 DirectSoundWaveData_unknown_13:: .incbin "sound/direct_sound_samples/unknown_13.bin" .align 2 DirectSoundWaveData_unknown_14:: .incbin "sound/direct_sound_samples/unknown_14.bin" .align 2 DirectSoundWaveData_unknown_15:: .incbin "sound/direct_sound_samples/unknown_15.bin" .align 2 DirectSoundWaveData_unknown_16:: .incbin "sound/direct_sound_samples/unknown_16.bin" .align 2 DirectSoundWaveData_unknown_17:: .incbin "sound/direct_sound_samples/unknown_17.bin" .align 2 Cry_Bulbasaur:: .incbin "sound/direct_sound_samples/cries/bulbasaur.bin" .align 2 Cry_Ivysaur:: .incbin "sound/direct_sound_samples/cries/ivysaur.bin" .align 2 Cry_Venusaur:: .incbin "sound/direct_sound_samples/cries/venusaur.bin" .align 2 Cry_Charmander:: .incbin "sound/direct_sound_samples/cries/charmander.bin" .align 2 Cry_Charmeleon:: .incbin "sound/direct_sound_samples/cries/charmeleon.bin" .align 2 Cry_Charizard:: .incbin "sound/direct_sound_samples/cries/charizard.bin" .align 2 Cry_Squirtle:: .incbin "sound/direct_sound_samples/cries/squirtle.bin" .align 2 Cry_Wartortle:: .incbin "sound/direct_sound_samples/cries/wartortle.bin" .align 2 Cry_Blastoise:: .incbin "sound/direct_sound_samples/cries/blastoise.bin" .align 2 Cry_Caterpie:: .incbin "sound/direct_sound_samples/cries/caterpie.bin" .align 2 Cry_Metapod:: .incbin "sound/direct_sound_samples/cries/metapod.bin" .align 2 Cry_Butterfree:: .incbin "sound/direct_sound_samples/cries/butterfree.bin" .align 2 Cry_Weedle:: .incbin "sound/direct_sound_samples/cries/weedle.bin" .align 2 Cry_Kakuna:: .incbin "sound/direct_sound_samples/cries/kakuna.bin" .align 2 Cry_Beedrill:: .incbin "sound/direct_sound_samples/cries/beedrill.bin" .align 2 Cry_Pidgey:: .incbin "sound/direct_sound_samples/cries/pidgey.bin" .align 2 Cry_Pidgeotto:: .incbin "sound/direct_sound_samples/cries/pidgeotto.bin" .align 2 Cry_Pidgeot:: .incbin "sound/direct_sound_samples/cries/pidgeot.bin" .align 2 Cry_Rattata:: .incbin "sound/direct_sound_samples/cries/rattata.bin" .align 2 Cry_Raticate:: .incbin "sound/direct_sound_samples/cries/raticate.bin" .align 2 Cry_Spearow:: .incbin "sound/direct_sound_samples/cries/spearow.bin" .align 2 Cry_Fearow:: .incbin "sound/direct_sound_samples/cries/fearow.bin" .align 2 Cry_Ekans:: .incbin "sound/direct_sound_samples/cries/ekans.bin" .align 2 Cry_Arbok:: .incbin "sound/direct_sound_samples/cries/arbok.bin" .align 2 Cry_Pikachu:: .incbin "sound/direct_sound_samples/cries/pikachu.bin" .align 2 Cry_Raichu:: .incbin "sound/direct_sound_samples/cries/raichu.bin" .align 2 Cry_Sandshrew:: .incbin "sound/direct_sound_samples/cries/sandshrew.bin" .align 2 Cry_Sandslash:: .incbin "sound/direct_sound_samples/cries/sandslash.bin" .align 2 Cry_NidoranF:: .incbin "sound/direct_sound_samples/cries/nidoran_f.bin" .align 2 Cry_Nidorina:: .incbin "sound/direct_sound_samples/cries/nidorina.bin" .align 2 Cry_Nidoqueen:: .incbin "sound/direct_sound_samples/cries/nidoqueen.bin" .align 2 Cry_NidoranM:: .incbin "sound/direct_sound_samples/cries/nidoran_m.bin" .align 2 Cry_Nidorino:: .incbin "sound/direct_sound_samples/cries/nidorino.bin" .align 2 Cry_Nidoking:: .incbin "sound/direct_sound_samples/cries/nidoking.bin" .align 2 Cry_Clefairy:: .incbin "sound/direct_sound_samples/cries/clefairy.bin" .align 2 Cry_Clefable:: .incbin "sound/direct_sound_samples/cries/clefable.bin" .align 2 Cry_Vulpix:: .incbin "sound/direct_sound_samples/cries/vulpix.bin" .align 2 Cry_Ninetales:: .incbin "sound/direct_sound_samples/cries/ninetales.bin" .align 2 Cry_Jigglypuff:: .incbin "sound/direct_sound_samples/cries/jigglypuff.bin" .align 2 Cry_Wigglytuff:: .incbin "sound/direct_sound_samples/cries/wigglytuff.bin" .align 2 Cry_Zubat:: .incbin "sound/direct_sound_samples/cries/zubat.bin" .align 2 Cry_Golbat:: .incbin "sound/direct_sound_samples/cries/golbat.bin" .align 2 Cry_Oddish:: .incbin "sound/direct_sound_samples/cries/oddish.bin" .align 2 Cry_Gloom:: .incbin "sound/direct_sound_samples/cries/gloom.bin" .align 2 Cry_Vileplume:: .incbin "sound/direct_sound_samples/cries/vileplume.bin" .align 2 Cry_Paras:: .incbin "sound/direct_sound_samples/cries/paras.bin" .align 2 Cry_Parasect:: .incbin "sound/direct_sound_samples/cries/parasect.bin" .align 2 Cry_Venonat:: .incbin "sound/direct_sound_samples/cries/venonat.bin" .align 2 Cry_Venomoth:: .incbin "sound/direct_sound_samples/cries/venomoth.bin" .align 2 Cry_Diglett:: .incbin "sound/direct_sound_samples/cries/diglett.bin" .align 2 Cry_Dugtrio:: .incbin "sound/direct_sound_samples/cries/dugtrio.bin" .align 2 Cry_Meowth:: .incbin "sound/direct_sound_samples/cries/meowth.bin" .align 2 Cry_Persian:: .incbin "sound/direct_sound_samples/cries/persian.bin" .align 2 Cry_Psyduck:: .incbin "sound/direct_sound_samples/cries/psyduck.bin" .align 2 Cry_Golduck:: .incbin "sound/direct_sound_samples/cries/golduck.bin" .align 2 Cry_Mankey:: .incbin "sound/direct_sound_samples/cries/mankey.bin" .align 2 Cry_Primeape:: .incbin "sound/direct_sound_samples/cries/primeape.bin" .align 2 Cry_Growlithe:: .incbin "sound/direct_sound_samples/cries/growlithe.bin" .align 2 Cry_Arcanine:: .incbin "sound/direct_sound_samples/cries/arcanine.bin" .align 2 Cry_Poliwag:: .incbin "sound/direct_sound_samples/cries/poliwag.bin" .align 2 Cry_Poliwhirl:: .incbin "sound/direct_sound_samples/cries/poliwhirl.bin" .align 2 Cry_Poliwrath:: .incbin "sound/direct_sound_samples/cries/poliwrath.bin" .align 2 Cry_Abra:: .incbin "sound/direct_sound_samples/cries/abra.bin" .align 2 Cry_Kadabra:: .incbin "sound/direct_sound_samples/cries/kadabra.bin" .align 2 Cry_Alakazam:: .incbin "sound/direct_sound_samples/cries/alakazam.bin" .align 2 Cry_Machop:: .incbin "sound/direct_sound_samples/cries/machop.bin" .align 2 Cry_Machoke:: .incbin "sound/direct_sound_samples/cries/machoke.bin" .align 2 Cry_Machamp:: .incbin "sound/direct_sound_samples/cries/machamp.bin" .align 2 Cry_Bellsprout:: .incbin "sound/direct_sound_samples/cries/bellsprout.bin" .align 2 Cry_Weepinbell:: .incbin "sound/direct_sound_samples/cries/weepinbell.bin" .align 2 Cry_Victreebel:: .incbin "sound/direct_sound_samples/cries/victreebel.bin" .align 2 Cry_Tentacool:: .incbin "sound/direct_sound_samples/cries/tentacool.bin" .align 2 Cry_Tentacruel:: .incbin "sound/direct_sound_samples/cries/tentacruel.bin" .align 2 Cry_Geodude:: .incbin "sound/direct_sound_samples/cries/geodude.bin" .align 2 Cry_Graveler:: .incbin "sound/direct_sound_samples/cries/graveler.bin" .align 2 Cry_Golem:: .incbin "sound/direct_sound_samples/cries/golem.bin" .align 2 Cry_Ponyta:: .incbin "sound/direct_sound_samples/cries/ponyta.bin" .align 2 Cry_Rapidash:: .incbin "sound/direct_sound_samples/cries/rapidash.bin" .align 2 Cry_Slowpoke:: .incbin "sound/direct_sound_samples/cries/slowpoke.bin" .align 2 Cry_Slowbro:: .incbin "sound/direct_sound_samples/cries/slowbro.bin" .align 2 Cry_Magnemite:: .incbin "sound/direct_sound_samples/cries/magnemite.bin" .align 2 Cry_Magneton:: .incbin "sound/direct_sound_samples/cries/magneton.bin" .align 2 Cry_Farfetchd:: .incbin "sound/direct_sound_samples/cries/farfetchd.bin" .align 2 Cry_Doduo:: .incbin "sound/direct_sound_samples/cries/doduo.bin" .align 2 Cry_Dodrio:: .incbin "sound/direct_sound_samples/cries/dodrio.bin" .align 2 Cry_Seel:: .incbin "sound/direct_sound_samples/cries/seel.bin" .align 2 Cry_Dewgong:: .incbin "sound/direct_sound_samples/cries/dewgong.bin" .align 2 Cry_Grimer:: .incbin "sound/direct_sound_samples/cries/grimer.bin" .align 2 Cry_Muk:: .incbin "sound/direct_sound_samples/cries/muk.bin" .align 2 Cry_Shellder:: .incbin "sound/direct_sound_samples/cries/shellder.bin" .align 2 Cry_Cloyster:: .incbin "sound/direct_sound_samples/cries/cloyster.bin" .align 2 Cry_Gastly:: .incbin "sound/direct_sound_samples/cries/gastly.bin" .align 2 Cry_Haunter:: .incbin "sound/direct_sound_samples/cries/haunter.bin" .align 2 Cry_Gengar:: .incbin "sound/direct_sound_samples/cries/gengar.bin" .align 2 Cry_Onix:: .incbin "sound/direct_sound_samples/cries/onix.bin" .align 2 Cry_Drowzee:: .incbin "sound/direct_sound_samples/cries/drowzee.bin" .align 2 Cry_Hypno:: .incbin "sound/direct_sound_samples/cries/hypno.bin" .align 2 Cry_Krabby:: .incbin "sound/direct_sound_samples/cries/krabby.bin" .align 2 Cry_Kingler:: .incbin "sound/direct_sound_samples/cries/kingler.bin" .align 2 Cry_Voltorb:: .incbin "sound/direct_sound_samples/cries/voltorb.bin" .align 2 Cry_Electrode:: .incbin "sound/direct_sound_samples/cries/electrode.bin" .align 2 Cry_Exeggcute:: .incbin "sound/direct_sound_samples/cries/exeggcute.bin" .align 2 Cry_Exeggutor:: .incbin "sound/direct_sound_samples/cries/exeggutor.bin" .align 2 Cry_Cubone:: .incbin "sound/direct_sound_samples/cries/cubone.bin" .align 2 Cry_Marowak:: .incbin "sound/direct_sound_samples/cries/marowak.bin" .align 2 Cry_Hitmonlee:: .incbin "sound/direct_sound_samples/cries/hitmonlee.bin" .align 2 Cry_Hitmonchan:: .incbin "sound/direct_sound_samples/cries/hitmonchan.bin" .align 2 Cry_Lickitung:: .incbin "sound/direct_sound_samples/cries/lickitung.bin" .align 2 Cry_Koffing:: .incbin "sound/direct_sound_samples/cries/koffing.bin" .align 2 Cry_Weezing:: .incbin "sound/direct_sound_samples/cries/weezing.bin" .align 2 Cry_Rhyhorn:: .incbin "sound/direct_sound_samples/cries/rhyhorn.bin" .align 2 Cry_Rhydon:: .incbin "sound/direct_sound_samples/cries/rhydon.bin" .align 2 Cry_Chansey:: .incbin "sound/direct_sound_samples/cries/chansey.bin" .align 2 Cry_Tangela:: .incbin "sound/direct_sound_samples/cries/tangela.bin" .align 2 Cry_Kangaskhan:: .incbin "sound/direct_sound_samples/cries/kangaskhan.bin" .align 2 Cry_Horsea:: .incbin "sound/direct_sound_samples/cries/horsea.bin" .align 2 Cry_Seadra:: .incbin "sound/direct_sound_samples/cries/seadra.bin" .align 2 Cry_Goldeen:: .incbin "sound/direct_sound_samples/cries/goldeen.bin" .align 2 Cry_Seaking:: .incbin "sound/direct_sound_samples/cries/seaking.bin" .align 2 Cry_Staryu:: .incbin "sound/direct_sound_samples/cries/staryu.bin" .align 2 Cry_Starmie:: .incbin "sound/direct_sound_samples/cries/starmie.bin" .align 2 Cry_MrMime:: .incbin "sound/direct_sound_samples/cries/mr_mime.bin" .align 2 Cry_Scyther:: .incbin "sound/direct_sound_samples/cries/scyther.bin" .align 2 Cry_Jynx:: .incbin "sound/direct_sound_samples/cries/jynx.bin" .align 2 Cry_Electabuzz:: .incbin "sound/direct_sound_samples/cries/electabuzz.bin" .align 2 Cry_Magmar:: .incbin "sound/direct_sound_samples/cries/magmar.bin" .align 2 Cry_Pinsir:: .incbin "sound/direct_sound_samples/cries/pinsir.bin" .align 2 Cry_Tauros:: .incbin "sound/direct_sound_samples/cries/tauros.bin" .align 2 Cry_Magikarp:: .incbin "sound/direct_sound_samples/cries/magikarp.bin" .align 2 Cry_Gyarados:: .incbin "sound/direct_sound_samples/cries/gyarados.bin" .align 2 Cry_Lapras:: .incbin "sound/direct_sound_samples/cries/lapras.bin" .align 2 Cry_Ditto:: .incbin "sound/direct_sound_samples/cries/ditto.bin" .align 2 Cry_Eevee:: .incbin "sound/direct_sound_samples/cries/eevee.bin" .align 2 Cry_Vaporeon:: .incbin "sound/direct_sound_samples/cries/vaporeon.bin" .align 2 Cry_Jolteon:: .incbin "sound/direct_sound_samples/cries/jolteon.bin" .align 2 Cry_Flareon:: .incbin "sound/direct_sound_samples/cries/flareon.bin" .align 2 Cry_Porygon:: .incbin "sound/direct_sound_samples/cries/porygon.bin" .align 2 Cry_Omanyte:: .incbin "sound/direct_sound_samples/cries/omanyte.bin" .align 2 Cry_Omastar:: .incbin "sound/direct_sound_samples/cries/omastar.bin" .align 2 Cry_Kabuto:: .incbin "sound/direct_sound_samples/cries/kabuto.bin" .align 2 Cry_Kabutops:: .incbin "sound/direct_sound_samples/cries/kabutops.bin" .align 2 Cry_Aerodactyl:: .incbin "sound/direct_sound_samples/cries/aerodactyl.bin" .align 2 Cry_Snorlax:: .incbin "sound/direct_sound_samples/cries/snorlax.bin" .align 2 Cry_Articuno:: .incbin "sound/direct_sound_samples/cries/articuno.bin" .align 2 Cry_Zapdos:: .incbin "sound/direct_sound_samples/cries/zapdos.bin" .align 2 Cry_Moltres:: .incbin "sound/direct_sound_samples/cries/moltres.bin" .align 2 Cry_Dratini:: .incbin "sound/direct_sound_samples/cries/dratini.bin" .align 2 Cry_Dragonair:: .incbin "sound/direct_sound_samples/cries/dragonair.bin" .align 2 Cry_Dragonite:: .incbin "sound/direct_sound_samples/cries/dragonite.bin" .align 2 Cry_Mewtwo:: .incbin "sound/direct_sound_samples/cries/mewtwo.bin" .align 2 Cry_Mew:: .incbin "sound/direct_sound_samples/cries/mew.bin" .align 2 Cry_Chikorita:: .incbin "sound/direct_sound_samples/cries/chikorita.bin" .align 2 Cry_Bayleef:: .incbin "sound/direct_sound_samples/cries/bayleef.bin" .align 2 Cry_Meganium:: .incbin "sound/direct_sound_samples/cries/meganium.bin" .align 2 Cry_Cyndaquil:: .incbin "sound/direct_sound_samples/cries/cyndaquil.bin" .align 2 Cry_Quilava:: .incbin "sound/direct_sound_samples/cries/quilava.bin" .align 2 Cry_Typhlosion:: .incbin "sound/direct_sound_samples/cries/typhlosion.bin" .align 2 Cry_Totodile:: .incbin "sound/direct_sound_samples/cries/totodile.bin" .align 2 Cry_Croconaw:: .incbin "sound/direct_sound_samples/cries/croconaw.bin" .align 2 Cry_Feraligatr:: .incbin "sound/direct_sound_samples/cries/feraligatr.bin" .align 2 Cry_Sentret:: .incbin "sound/direct_sound_samples/cries/sentret.bin" .align 2 Cry_Furret:: .incbin "sound/direct_sound_samples/cries/furret.bin" .align 2 Cry_Hoothoot:: .incbin "sound/direct_sound_samples/cries/hoothoot.bin" .align 2 Cry_Noctowl:: .incbin "sound/direct_sound_samples/cries/noctowl.bin" .align 2 Cry_Ledyba:: .incbin "sound/direct_sound_samples/cries/ledyba.bin" .align 2 Cry_Ledian:: .incbin "sound/direct_sound_samples/cries/ledian.bin" .align 2 Cry_Spinarak:: .incbin "sound/direct_sound_samples/cries/spinarak.bin" .align 2 Cry_Ariados:: .incbin "sound/direct_sound_samples/cries/ariados.bin" .align 2 Cry_Crobat:: .incbin "sound/direct_sound_samples/cries/crobat.bin" .align 2 Cry_Chinchou:: .incbin "sound/direct_sound_samples/cries/chinchou.bin" .align 2 Cry_Lanturn:: .incbin "sound/direct_sound_samples/cries/lanturn.bin" .align 2 Cry_Pichu:: .incbin "sound/direct_sound_samples/cries/pichu.bin" .align 2 Cry_Cleffa:: .incbin "sound/direct_sound_samples/cries/cleffa.bin" .align 2 Cry_Igglybuff:: .incbin "sound/direct_sound_samples/cries/igglybuff.bin" .align 2 Cry_Togepi:: .incbin "sound/direct_sound_samples/cries/togepi.bin" .align 2 Cry_Togetic:: .incbin "sound/direct_sound_samples/cries/togetic.bin" .align 2 Cry_Natu:: .incbin "sound/direct_sound_samples/cries/natu.bin" .align 2 Cry_Xatu:: .incbin "sound/direct_sound_samples/cries/xatu.bin" .align 2 Cry_Mareep:: .incbin "sound/direct_sound_samples/cries/mareep.bin" .align 2 Cry_Flaaffy:: .incbin "sound/direct_sound_samples/cries/flaaffy.bin" .align 2 Cry_Ampharos:: .incbin "sound/direct_sound_samples/cries/ampharos.bin" .align 2 Cry_Bellossom:: .incbin "sound/direct_sound_samples/cries/bellossom.bin" .align 2 Cry_Marill:: .incbin "sound/direct_sound_samples/cries/marill.bin" .align 2 Cry_Azumarill:: .incbin "sound/direct_sound_samples/cries/azumarill.bin" .align 2 Cry_Sudowoodo:: .incbin "sound/direct_sound_samples/cries/sudowoodo.bin" .align 2 Cry_Politoed:: .incbin "sound/direct_sound_samples/cries/politoed.bin" .align 2 Cry_Hoppip:: .incbin "sound/direct_sound_samples/cries/hoppip.bin" .align 2 Cry_Skiploom:: .incbin "sound/direct_sound_samples/cries/skiploom.bin" .align 2 Cry_Jumpluff:: .incbin "sound/direct_sound_samples/cries/jumpluff.bin" .align 2 Cry_Aipom:: .incbin "sound/direct_sound_samples/cries/aipom.bin" .align 2 Cry_Sunkern:: .incbin "sound/direct_sound_samples/cries/sunkern.bin" .align 2 Cry_Sunflora:: .incbin "sound/direct_sound_samples/cries/sunflora.bin" .align 2 Cry_Yanma:: .incbin "sound/direct_sound_samples/cries/yanma.bin" .align 2 Cry_Wooper:: .incbin "sound/direct_sound_samples/cries/wooper.bin" .align 2 Cry_Quagsire:: .incbin "sound/direct_sound_samples/cries/quagsire.bin" .align 2 Cry_Espeon:: .incbin "sound/direct_sound_samples/cries/espeon.bin" .align 2 Cry_Umbreon:: .incbin "sound/direct_sound_samples/cries/umbreon.bin" .align 2 Cry_Murkrow:: .incbin "sound/direct_sound_samples/cries/murkrow.bin" .align 2 Cry_Slowking:: .incbin "sound/direct_sound_samples/cries/slowking.bin" .align 2 Cry_Misdreavus:: .incbin "sound/direct_sound_samples/cries/misdreavus.bin" .align 2 Cry_Unown:: .incbin "sound/direct_sound_samples/cries/unown.bin" .align 2 Cry_Wobbuffet:: .incbin "sound/direct_sound_samples/cries/wobbuffet.bin" .align 2 Cry_Girafarig:: .incbin "sound/direct_sound_samples/cries/girafarig.bin" .align 2 Cry_Pineco:: .incbin "sound/direct_sound_samples/cries/pineco.bin" .align 2 Cry_Forretress:: .incbin "sound/direct_sound_samples/cries/forretress.bin" .align 2 Cry_Dunsparce:: .incbin "sound/direct_sound_samples/cries/dunsparce.bin" .align 2 Cry_Gligar:: .incbin "sound/direct_sound_samples/cries/gligar.bin" .align 2 Cry_Steelix:: .incbin "sound/direct_sound_samples/cries/steelix.bin" .align 2 Cry_Snubbull:: .incbin "sound/direct_sound_samples/cries/snubbull.bin" .align 2 Cry_Granbull:: .incbin "sound/direct_sound_samples/cries/granbull.bin" .align 2 Cry_Qwilfish:: .incbin "sound/direct_sound_samples/cries/qwilfish.bin" .align 2 Cry_Scizor:: .incbin "sound/direct_sound_samples/cries/scizor.bin" .align 2 Cry_Shuckle:: .incbin "sound/direct_sound_samples/cries/shuckle.bin" .align 2 Cry_Heracross:: .incbin "sound/direct_sound_samples/cries/heracross.bin" .align 2 Cry_Sneasel:: .incbin "sound/direct_sound_samples/cries/sneasel.bin" .align 2 Cry_Teddiursa:: .incbin "sound/direct_sound_samples/cries/teddiursa.bin" .align 2 Cry_Ursaring:: .incbin "sound/direct_sound_samples/cries/ursaring.bin" .align 2 Cry_Slugma:: .incbin "sound/direct_sound_samples/cries/slugma.bin" .align 2 Cry_Magcargo:: .incbin "sound/direct_sound_samples/cries/magcargo.bin" .align 2 Cry_Swinub:: .incbin "sound/direct_sound_samples/cries/swinub.bin" .align 2 Cry_Piloswine:: .incbin "sound/direct_sound_samples/cries/piloswine.bin" .align 2 Cry_Corsola:: .incbin "sound/direct_sound_samples/cries/corsola.bin" .align 2 Cry_Remoraid:: .incbin "sound/direct_sound_samples/cries/remoraid.bin" .align 2 Cry_Octillery:: .incbin "sound/direct_sound_samples/cries/octillery.bin" .align 2 Cry_Delibird:: .incbin "sound/direct_sound_samples/cries/delibird.bin" .align 2 Cry_Mantine:: .incbin "sound/direct_sound_samples/cries/mantine.bin" .align 2 Cry_Skarmory:: .incbin "sound/direct_sound_samples/cries/skarmory.bin" .align 2 Cry_Houndour:: .incbin "sound/direct_sound_samples/cries/houndour.bin" .align 2 Cry_Houndoom:: .incbin "sound/direct_sound_samples/cries/houndoom.bin" .align 2 Cry_Kingdra:: .incbin "sound/direct_sound_samples/cries/kingdra.bin" .align 2 Cry_Phanpy:: .incbin "sound/direct_sound_samples/cries/phanpy.bin" .align 2 Cry_Donphan:: .incbin "sound/direct_sound_samples/cries/donphan.bin" .align 2 Cry_Porygon2:: .incbin "sound/direct_sound_samples/cries/porygon2.bin" .align 2 Cry_Stantler:: .incbin "sound/direct_sound_samples/cries/stantler.bin" .align 2 Cry_Smeargle:: .incbin "sound/direct_sound_samples/cries/smeargle.bin" .align 2 Cry_Tyrogue:: .incbin "sound/direct_sound_samples/cries/tyrogue.bin" .align 2 Cry_Hitmontop:: .incbin "sound/direct_sound_samples/cries/hitmontop.bin" .align 2 Cry_Smoochum:: .incbin "sound/direct_sound_samples/cries/smoochum.bin" .align 2 Cry_Elekid:: .incbin "sound/direct_sound_samples/cries/elekid.bin" .align 2 Cry_Magby:: .incbin "sound/direct_sound_samples/cries/magby.bin" .align 2 Cry_Miltank:: .incbin "sound/direct_sound_samples/cries/miltank.bin" .align 2 Cry_Blissey:: .incbin "sound/direct_sound_samples/cries/blissey.bin" .align 2 Cry_Raikou:: .incbin "sound/direct_sound_samples/cries/raikou.bin" .align 2 Cry_Entei:: .incbin "sound/direct_sound_samples/cries/entei.bin" .align 2 Cry_Suicune:: .incbin "sound/direct_sound_samples/cries/suicune.bin" .align 2 Cry_Larvitar:: .incbin "sound/direct_sound_samples/cries/larvitar.bin" .align 2 Cry_Pupitar:: .incbin "sound/direct_sound_samples/cries/pupitar.bin" .align 2 Cry_Tyranitar:: .incbin "sound/direct_sound_samples/cries/tyranitar.bin" .align 2 Cry_Lugia:: .incbin "sound/direct_sound_samples/cries/lugia.bin" .align 2 Cry_HoOh:: .incbin "sound/direct_sound_samples/cries/ho_oh.bin" .align 2 Cry_Celebi:: .incbin "sound/direct_sound_samples/cries/celebi.bin" .align 2 Cry_Kecleon:: .incbin "sound/direct_sound_samples/cries/kecleon.bin" .align 2 Cry_Roselia:: .incbin "sound/direct_sound_samples/cries/roselia.bin" .align 2 Cry_Torkoal:: .incbin "sound/direct_sound_samples/cries/torkoal.bin" .align 2 Cry_Electrike:: .incbin "sound/direct_sound_samples/cries/electrike.bin" .align 2 Cry_Manectric:: .incbin "sound/direct_sound_samples/cries/manectric.bin" .align 2 Cry_Duskull:: .incbin "sound/direct_sound_samples/cries/duskull.bin" .align 2 Cry_Latias:: .incbin "sound/direct_sound_samples/cries/latias.bin" .align 2 Cry_Wynaut:: .incbin "sound/direct_sound_samples/cries/wynaut.bin" .align 2 Cry_Seviper:: .incbin "sound/direct_sound_samples/cries/seviper.bin" .align 2 Cry_Sharpedo:: .incbin "sound/direct_sound_samples/cries/sharpedo.bin" .align 2 Cry_Zangoose:: .incbin "sound/direct_sound_samples/cries/zangoose.bin" .align 2 Cry_Azurill:: .incbin "sound/direct_sound_samples/cries/azurill.bin" .align 2 Cry_Swablu:: .incbin "sound/direct_sound_samples/cries/swablu.bin" .align 2 Cry_Altaria:: .incbin "sound/direct_sound_samples/cries/altaria.bin" .align 2 Cry_Unused265:: .incbin "sound/direct_sound_samples/cries/unused_265.bin" .align 2 Cry_Taillow:: .incbin "sound/direct_sound_samples/cries/taillow.bin" .align 2 Cry_Swellow:: .incbin "sound/direct_sound_samples/cries/swellow.bin" .align 2 Cry_Unused268:: .incbin "sound/direct_sound_samples/cries/unused_268.bin" .align 2 Cry_Spinda:: .incbin "sound/direct_sound_samples/cries/spinda.bin" .align 2 Cry_Torchic:: .incbin "sound/direct_sound_samples/cries/torchic.bin" .align 2 Cry_Combusken:: .incbin "sound/direct_sound_samples/cries/combusken.bin" .align 2 Cry_Blaziken:: .incbin "sound/direct_sound_samples/cries/blaziken.bin" .align 2 Cry_Treecko:: .incbin "sound/direct_sound_samples/cries/treecko.bin" .align 2 Cry_Grovyle:: .incbin "sound/direct_sound_samples/cries/grovyle.bin" .align 2 Cry_Sceptile:: .incbin "sound/direct_sound_samples/cries/sceptile.bin" .align 2 Cry_Mudkip:: .incbin "sound/direct_sound_samples/cries/mudkip.bin" .align 2 Cry_Marshtomp:: .incbin "sound/direct_sound_samples/cries/marshtomp.bin" .align 2 Cry_Swampert:: .incbin "sound/direct_sound_samples/cries/swampert.bin" .align 2 Cry_Pelipper:: .incbin "sound/direct_sound_samples/cries/pelipper.bin" .align 2 Cry_Wingull:: .incbin "sound/direct_sound_samples/cries/wingull.bin" .align 2 Cry_Banette:: .incbin "sound/direct_sound_samples/cries/banette.bin" .align 2 Cry_Shuppet:: .incbin "sound/direct_sound_samples/cries/shuppet.bin" .align 2 Cry_Lotad:: .incbin "sound/direct_sound_samples/cries/lotad.bin" .align 2 Cry_Lombre:: .incbin "sound/direct_sound_samples/cries/lombre.bin" .align 2 Cry_Ludicolo:: .incbin "sound/direct_sound_samples/cries/ludicolo.bin" .align 2 Cry_Seedot:: .incbin "sound/direct_sound_samples/cries/seedot.bin" .align 2 Cry_Nuzleaf:: .incbin "sound/direct_sound_samples/cries/nuzleaf.bin" .align 2 Cry_Shiftry:: .incbin "sound/direct_sound_samples/cries/shiftry.bin" .align 2 Cry_Carvanha:: .incbin "sound/direct_sound_samples/cries/carvanha.bin" .align 2 Cry_Wurmple:: .incbin "sound/direct_sound_samples/cries/wurmple.bin" .align 2 Cry_Silcoon:: .incbin "sound/direct_sound_samples/cries/silcoon.bin" .align 2 Cry_Beautifly:: .incbin "sound/direct_sound_samples/cries/beautifly.bin" .align 2 Cry_Cascoon:: .incbin "sound/direct_sound_samples/cries/cascoon.bin" .align 2 Cry_Dustox:: .incbin "sound/direct_sound_samples/cries/dustox.bin" .align 2 Cry_Ralts:: .incbin "sound/direct_sound_samples/cries/ralts.bin" .align 2 Cry_Kirlia:: .incbin "sound/direct_sound_samples/cries/kirlia.bin" .align 2 Cry_Gardevoir:: .incbin "sound/direct_sound_samples/cries/gardevoir.bin" .align 2 Cry_Slakoth:: .incbin "sound/direct_sound_samples/cries/slakoth.bin" .align 2 Cry_Vigoroth:: .incbin "sound/direct_sound_samples/cries/vigoroth.bin" .align 2 Cry_Slaking:: .incbin "sound/direct_sound_samples/cries/slaking.bin" .align 2 Cry_Nincada:: .incbin "sound/direct_sound_samples/cries/nincada.bin" .align 2 Cry_Ninjask:: .incbin "sound/direct_sound_samples/cries/ninjask.bin" .align 2 Cry_Shedinja:: .incbin "sound/direct_sound_samples/cries/shedinja.bin" .align 2 Cry_Makuhita:: .incbin "sound/direct_sound_samples/cries/makuhita.bin" .align 2 Cry_Hariyama:: .incbin "sound/direct_sound_samples/cries/hariyama.bin" .align 2 Cry_Nosepass:: .incbin "sound/direct_sound_samples/cries/nosepass.bin" .align 2 Cry_Glalie:: .incbin "sound/direct_sound_samples/cries/glalie.bin" .align 2 Cry_Plusle:: .incbin "sound/direct_sound_samples/cries/plusle.bin" .align 2 Cry_Minun:: .incbin "sound/direct_sound_samples/cries/minun.bin" .align 2 Cry_Surskit:: .incbin "sound/direct_sound_samples/cries/surskit.bin" .align 2 Cry_Masquerain:: .incbin "sound/direct_sound_samples/cries/masquerain.bin" .align 2 Cry_Skitty:: .incbin "sound/direct_sound_samples/cries/skitty.bin" .align 2 Cry_Delcatty:: .incbin "sound/direct_sound_samples/cries/delcatty.bin" .align 2 Cry_Gulpin:: .incbin "sound/direct_sound_samples/cries/gulpin.bin" .align 2 Cry_Swalot:: .incbin "sound/direct_sound_samples/cries/swalot.bin" .align 2 Cry_Numel:: .incbin "sound/direct_sound_samples/cries/numel.bin" .align 2 Cry_Camerupt:: .incbin "sound/direct_sound_samples/cries/camerupt.bin" .align 2 Cry_Barboach:: .incbin "sound/direct_sound_samples/cries/barboach.bin" .align 2 Cry_Whiscash:: .incbin "sound/direct_sound_samples/cries/whiscash.bin" .align 2 Cry_Corphish:: .incbin "sound/direct_sound_samples/cries/corphish.bin" .align 2 Cry_Crawdaunt:: .incbin "sound/direct_sound_samples/cries/crawdaunt.bin" .align 2 Cry_Spoink:: .incbin "sound/direct_sound_samples/cries/spoink.bin" .align 2 Cry_Grumpig:: .incbin "sound/direct_sound_samples/cries/grumpig.bin" .align 2 Cry_Trapinch:: .incbin "sound/direct_sound_samples/cries/trapinch.bin" .align 2 Cry_Vibrava:: .incbin "sound/direct_sound_samples/cries/vibrava.bin" .align 2 Cry_Flygon:: .incbin "sound/direct_sound_samples/cries/flygon.bin" .align 2 Cry_Cacnea:: .incbin "sound/direct_sound_samples/cries/cacnea.bin" .align 2 Cry_Cacturne:: .incbin "sound/direct_sound_samples/cries/cacturne.bin" .align 2 Cry_Baltoy:: .incbin "sound/direct_sound_samples/cries/baltoy.bin" .align 2 Cry_Claydol:: .incbin "sound/direct_sound_samples/cries/claydol.bin" .align 2 Cry_Lunatone:: .incbin "sound/direct_sound_samples/cries/lunatone.bin" .align 2 Cry_Solrock:: .incbin "sound/direct_sound_samples/cries/solrock.bin" .align 2 Cry_Feebas:: .incbin "sound/direct_sound_samples/cries/feebas.bin" .align 2 Cry_Milotic:: .incbin "sound/direct_sound_samples/cries/milotic.bin" .align 2 Cry_Absol:: .incbin "sound/direct_sound_samples/cries/absol.bin" .align 2 Cry_Meditite:: .incbin "sound/direct_sound_samples/cries/meditite.bin" .align 2 Cry_Medicham:: .incbin "sound/direct_sound_samples/cries/medicham.bin" .align 2 Cry_Spheal:: .incbin "sound/direct_sound_samples/cries/spheal.bin" .align 2 Cry_Sealeo:: .incbin "sound/direct_sound_samples/cries/sealeo.bin" .align 2 Cry_Walrein:: .incbin "sound/direct_sound_samples/cries/walrein.bin" .align 2 Cry_Clamperl:: .incbin "sound/direct_sound_samples/cries/clamperl.bin" .align 2 Cry_Huntail:: .incbin "sound/direct_sound_samples/cries/huntail.bin" .align 2 Cry_Gorebyss:: .incbin "sound/direct_sound_samples/cries/gorebyss.bin" .align 2 Cry_Lileep:: .incbin "sound/direct_sound_samples/cries/lileep.bin" .align 2 Cry_Cradily:: .incbin "sound/direct_sound_samples/cries/cradily.bin" .align 2 Cry_Anorith:: .incbin "sound/direct_sound_samples/cries/anorith.bin" .align 2 Cry_Armaldo:: .incbin "sound/direct_sound_samples/cries/armaldo.bin" .align 2 Cry_Beldum:: .incbin "sound/direct_sound_samples/cries/beldum.bin" .align 2 Cry_Metang:: .incbin "sound/direct_sound_samples/cries/metang.bin" .align 2 Cry_Metagross:: .incbin "sound/direct_sound_samples/cries/metagross.bin" .align 2 Cry_Bagon:: .incbin "sound/direct_sound_samples/cries/bagon.bin" .align 2 Cry_Shelgon:: .incbin "sound/direct_sound_samples/cries/shelgon.bin" .align 2 Cry_Regirock:: .incbin "sound/direct_sound_samples/cries/regirock.bin" .align 2 Cry_Regice:: .incbin "sound/direct_sound_samples/cries/regice.bin" .align 2 Cry_Registeel:: .incbin "sound/direct_sound_samples/cries/registeel.bin" .align 2 Cry_Castform:: .incbin "sound/direct_sound_samples/cries/castform.bin" .align 2 Cry_Volbeat:: .incbin "sound/direct_sound_samples/cries/volbeat.bin" .align 2 Cry_Illumise:: .incbin "sound/direct_sound_samples/cries/illumise.bin" .align 2 Cry_Poochyena:: .incbin "sound/direct_sound_samples/cries/poochyena.bin" .align 2 Cry_Mightyena:: .incbin "sound/direct_sound_samples/cries/mightyena.bin" .align 2 Cry_Dusclops:: .incbin "sound/direct_sound_samples/cries/dusclops.bin" .align 2 Cry_Sableye:: .incbin "sound/direct_sound_samples/cries/sableye.bin" .align 2 Cry_Mawile:: .incbin "sound/direct_sound_samples/cries/mawile.bin" .align 2 Cry_Aron:: .incbin "sound/direct_sound_samples/cries/aron.bin" .align 2 Cry_Lairon:: .incbin "sound/direct_sound_samples/cries/lairon.bin" .align 2 Cry_Aggron:: .incbin "sound/direct_sound_samples/cries/aggron.bin" .align 2 Cry_Relicanth:: .incbin "sound/direct_sound_samples/cries/relicanth.bin" .align 2 Cry_Luvdisc:: .incbin "sound/direct_sound_samples/cries/luvdisc.bin" .align 2 Cry_Groudon:: .incbin "sound/direct_sound_samples/cries/groudon.bin" .align 2 Cry_Kyogre:: .incbin "sound/direct_sound_samples/cries/kyogre.bin" .align 2 Cry_Rayquaza:: .incbin "sound/direct_sound_samples/cries/rayquaza.bin" .align 2 Cry_Salamence:: .incbin "sound/direct_sound_samples/cries/salamence.bin" .align 2 Cry_Breloom:: .incbin "sound/direct_sound_samples/cries/breloom.bin" .align 2 Cry_Shroomish:: .incbin "sound/direct_sound_samples/cries/shroomish.bin" .align 2 Cry_Linoone:: .incbin "sound/direct_sound_samples/cries/linoone.bin" .align 2 Cry_Tropius:: .incbin "sound/direct_sound_samples/cries/tropius.bin" .align 2 Cry_Wailmer:: .incbin "sound/direct_sound_samples/cries/wailmer.bin" .align 2 Cry_Zigzagoon:: .incbin "sound/direct_sound_samples/cries/zigzagoon.bin" .align 2 Cry_Exploud:: .incbin "sound/direct_sound_samples/cries/exploud.bin" .align 2 Cry_Loudred:: .incbin "sound/direct_sound_samples/cries/loudred.bin" .align 2 Cry_Wailord:: .incbin "sound/direct_sound_samples/cries/wailord.bin" .align 2 Cry_Whismur:: .incbin "sound/direct_sound_samples/cries/whismur.bin" .align 2 Cry_Snorunt:: .incbin "sound/direct_sound_samples/cries/snorunt.bin" .align 2 Cry_Latios:: .incbin "sound/direct_sound_samples/cries/latios.bin" .align 2 Cry_Jirachi:: .incbin "sound/direct_sound_samples/cries/jirachi.bin" .align 2 Cry_Deoxys:: .incbin "sound/direct_sound_samples/cries/deoxys.bin" .align 2 Cry_Chimecho:: .incbin "sound/direct_sound_samples/cries/chimecho.bin" .align 2 DirectSoundWaveData_register_noise:: .incbin "sound/direct_sound_samples/register_noise.bin" .align 2 DirectSoundWaveData_unknown_18:: .incbin "sound/direct_sound_samples/unknown_18.bin" .align 2 DirectSoundWaveData_sc88pro_nylon_str_guitar:: .incbin "sound/direct_sound_samples/sc88pro_nylon_str_guitar.bin" .align 2 DirectSoundWaveData_sd90_special_scream_drive:: .incbin "sound/direct_sound_samples/sd90_special_scream_drive.bin" .align 2 DirectSoundWaveData_Phoneme_1:: .incbin "sound/direct_sound_samples/phonemes/01.bin" .align 2 DirectSoundWaveData_Phoneme_2:: .incbin "sound/direct_sound_samples/phonemes/02.bin" .align 2 DirectSoundWaveData_Phoneme_3:: .incbin "sound/direct_sound_samples/phonemes/03.bin" .align 2 DirectSoundWaveData_Phoneme_4:: .incbin "sound/direct_sound_samples/phonemes/04.bin" .align 2 DirectSoundWaveData_Phoneme_5:: .incbin "sound/direct_sound_samples/phonemes/05.bin" .align 2 DirectSoundWaveData_Phoneme_6:: .incbin "sound/direct_sound_samples/phonemes/06.bin" .align 2 DirectSoundWaveData_Phoneme_7:: .incbin "sound/direct_sound_samples/phonemes/07.bin" .align 2 DirectSoundWaveData_Phoneme_8:: .incbin "sound/direct_sound_samples/phonemes/08.bin" .align 2 DirectSoundWaveData_Phoneme_9:: .incbin "sound/direct_sound_samples/phonemes/09.bin" .align 2 DirectSoundWaveData_Phoneme_10:: .incbin "sound/direct_sound_samples/phonemes/10.bin" .align 2 DirectSoundWaveData_Phoneme_11:: .incbin "sound/direct_sound_samples/phonemes/11.bin" .align 2 DirectSoundWaveData_Phoneme_12:: .incbin "sound/direct_sound_samples/phonemes/12.bin" .align 2 DirectSoundWaveData_Phoneme_13:: .incbin "sound/direct_sound_samples/phonemes/13.bin" .align 2 DirectSoundWaveData_Phoneme_14:: .incbin "sound/direct_sound_samples/phonemes/14.bin" .align 2 DirectSoundWaveData_Phoneme_15:: .incbin "sound/direct_sound_samples/phonemes/15.bin" .align 2 DirectSoundWaveData_Phoneme_16:: .incbin "sound/direct_sound_samples/phonemes/16.bin" .align 2 DirectSoundWaveData_Phoneme_17:: .incbin "sound/direct_sound_samples/phonemes/17.bin" .align 2 DirectSoundWaveData_Phoneme_18:: .incbin "sound/direct_sound_samples/phonemes/18.bin" .align 2 DirectSoundWaveData_Phoneme_19:: .incbin "sound/direct_sound_samples/phonemes/19.bin" .align 2 DirectSoundWaveData_Phoneme_20:: .incbin "sound/direct_sound_samples/phonemes/20.bin" .align 2 DirectSoundWaveData_Phoneme_21:: .incbin "sound/direct_sound_samples/phonemes/21.bin" .align 2 DirectSoundWaveData_Phoneme_22:: .incbin "sound/direct_sound_samples/phonemes/22.bin" .align 2 DirectSoundWaveData_Phoneme_23:: .incbin "sound/direct_sound_samples/phonemes/23.bin" .align 2 DirectSoundWaveData_Phoneme_24:: .incbin "sound/direct_sound_samples/phonemes/24.bin" .align 2 DirectSoundWaveData_Phoneme_25:: .incbin "sound/direct_sound_samples/phonemes/25.bin" .align 2 DirectSoundWaveData_Phoneme_26:: .incbin "sound/direct_sound_samples/phonemes/26.bin" .align 2 DirectSoundWaveData_Phoneme_27:: .incbin "sound/direct_sound_samples/phonemes/27.bin" .align 2 DirectSoundWaveData_Phoneme_28:: .incbin "sound/direct_sound_samples/phonemes/28.bin" .align 2 DirectSoundWaveData_Phoneme_29:: .incbin "sound/direct_sound_samples/phonemes/29.bin" .align 2 DirectSoundWaveData_Phoneme_30:: .incbin "sound/direct_sound_samples/phonemes/30.bin" .align 2 DirectSoundWaveData_Phoneme_31:: .incbin "sound/direct_sound_samples/phonemes/31.bin" .align 2 DirectSoundWaveData_Phoneme_32:: .incbin "sound/direct_sound_samples/phonemes/32.bin" .align 2 DirectSoundWaveData_Phoneme_33:: .incbin "sound/direct_sound_samples/phonemes/33.bin" .align 2 DirectSoundWaveData_Phoneme_34:: .incbin "sound/direct_sound_samples/phonemes/34.bin" .align 2 DirectSoundWaveData_Phoneme_35:: .incbin "sound/direct_sound_samples/phonemes/35.bin" .align 2 DirectSoundWaveData_Phoneme_36:: .incbin "sound/direct_sound_samples/phonemes/36.bin" .align 2 DirectSoundWaveData_Phoneme_37:: .incbin "sound/direct_sound_samples/phonemes/37.bin" .align 2 DirectSoundWaveData_Phoneme_38:: .incbin "sound/direct_sound_samples/phonemes/38.bin" .align 2 DirectSoundWaveData_Phoneme_39:: .incbin "sound/direct_sound_samples/phonemes/39.bin" .align 2 DirectSoundWaveData_Phoneme_40:: .incbin "sound/direct_sound_samples/phonemes/40.bin" .align 2 DirectSoundWaveData_Phoneme_41:: .incbin "sound/direct_sound_samples/phonemes/41.bin" .align 2 DirectSoundWaveData_Phoneme_42:: .incbin "sound/direct_sound_samples/phonemes/42.bin" .align 2 DirectSoundWaveData_Phoneme_43:: .incbin "sound/direct_sound_samples/phonemes/43.bin" .align 2 DirectSoundWaveData_Phoneme_44:: .incbin "sound/direct_sound_samples/phonemes/44.bin" .align 2 DirectSoundWaveData_Phoneme_45:: .incbin "sound/direct_sound_samples/phonemes/45.bin" .align 2 DirectSoundWaveData_Phoneme_46:: .incbin "sound/direct_sound_samples/phonemes/46.bin" .align 2 DirectSoundWaveData_Phoneme_47:: .incbin "sound/direct_sound_samples/phonemes/47.bin" .align 2 DirectSoundWaveData_Phoneme_48:: .incbin "sound/direct_sound_samples/phonemes/48.bin" .align 2 DirectSoundWaveData_Phoneme_49:: .incbin "sound/direct_sound_samples/phonemes/49.bin" .align 2 DirectSoundWaveData_Phoneme_50:: .incbin "sound/direct_sound_samples/phonemes/50.bin" .align 2 DirectSoundWaveData_Phoneme_51:: .incbin "sound/direct_sound_samples/phonemes/51.bin" .align 2 DirectSoundWaveData_sc88pro_accordion_duplicate:: .incbin "sound/direct_sound_samples/sc88pro_accordion_duplicate.bin" .align 2 DirectSoundWaveData_steinway_b_piano:: .incbin "sound/direct_sound_samples/steinway_b_piano.bin" .align 2 DirectSoundWaveData_sd90_classical_whistle:: .incbin "sound/direct_sound_samples/sd90_classical_whistle.bin" .align 2 DirectSoundWaveData_sd90_enhanced_delay_shaku:: .incbin "sound/direct_sound_samples/sd90_enhanced_delay_shaku.bin" .align 2 DirectSoundWaveData_wave_54:: .incbin "sound/direct_sound_samples/wave_54.bin" .align 2 DirectSoundWaveData_wave_77:: .incbin "sound/direct_sound_samples/wave_77.bin" ================================================ FILE: sound/keysplit_tables.inc ================================================ @ Due to the way mks4agb (Nintendo's tool) works, key split table labels can @ appear before the actual start of the key split table data. If you look at @ the first keysplit table (KeySplitTable1), you'll notice it's offset backwards @ by 36 bytes. This is because the key split tables don't map instruments @ for the entire note range (0-127)--they only map subsets, and the upper @ and lower ranges aren't necessarily 0 or 127. @ @ For example if a key split table maps an note range of 10-20, then the key @ split table label will be offset 10 bytes before the actual key split data @ begins. Therefore, the notes naturally map to the key split table without @ any extra offset calculation. .set KeySplitTable1, . - 36 .byte 0 @ 36 .byte 0 @ 37 .byte 0 @ 38 .byte 0 @ 39 .byte 0 @ 40 .byte 0 @ 41 .byte 0 @ 42 .byte 0 @ 43 .byte 0 @ 44 .byte 0 @ 45 .byte 0 @ 46 .byte 0 @ 47 .byte 0 @ 48 .byte 0 @ 49 .byte 0 @ 50 .byte 0 @ 51 .byte 0 @ 52 .byte 0 @ 53 .byte 0 @ 54 .byte 1 @ 55 .byte 1 @ 56 .byte 1 @ 57 .byte 1 @ 58 .byte 1 @ 59 .byte 1 @ 60 .byte 1 @ 61 .byte 1 @ 62 .byte 1 @ 63 .byte 1 @ 64 .byte 1 @ 65 .byte 1 @ 66 .byte 1 @ 67 .byte 1 @ 68 .byte 1 @ 69 .byte 2 @ 70 .byte 2 @ 71 .byte 2 @ 72 .byte 2 @ 73 .byte 2 @ 74 .byte 2 @ 75 .byte 2 @ 76 .byte 2 @ 77 .byte 2 @ 78 .byte 2 @ 79 .byte 2 @ 80 .byte 2 @ 81 .byte 2 @ 82 .byte 2 @ 83 .byte 2 @ 84 .byte 2 @ 85 .byte 2 @ 86 .byte 2 @ 87 .byte 2 @ 88 .byte 2 @ 89 .byte 2 @ 90 .byte 3 @ 91 .byte 3 @ 92 .byte 3 @ 93 .byte 3 @ 94 .byte 3 @ 95 .byte 3 @ 96 .byte 3 @ 97 .byte 3 @ 98 .byte 3 @ 99 .byte 3 @ 100 .byte 3 @ 101 .byte 3 @ 102 .byte 3 @ 103 .byte 3 @ 104 .byte 3 @ 105 .byte 3 @ 106 .byte 3 @ 107 .set KeySplitTable2, . - 36 .byte 0 @ 36 .byte 0 @ 37 .byte 0 @ 38 .byte 0 @ 39 .byte 0 @ 40 .byte 0 @ 41 .byte 0 @ 42 .byte 0 @ 43 .byte 0 @ 44 .byte 0 @ 45 .byte 0 @ 46 .byte 0 @ 47 .byte 0 @ 48 .byte 0 @ 49 .byte 0 @ 50 .byte 0 @ 51 .byte 0 @ 52 .byte 0 @ 53 .byte 0 @ 54 .byte 0 @ 55 .byte 0 @ 56 .byte 0 @ 57 .byte 0 @ 58 .byte 0 @ 59 .byte 0 @ 60 .byte 0 @ 61 .byte 0 @ 62 .byte 0 @ 63 .byte 0 @ 64 .byte 0 @ 65 .byte 0 @ 66 .byte 0 @ 67 .byte 0 @ 68 .byte 1 @ 69 .byte 1 @ 70 .byte 1 @ 71 .byte 1 @ 72 .byte 1 @ 73 .byte 1 @ 74 .byte 1 @ 75 .byte 1 @ 76 .byte 1 @ 77 .byte 1 @ 78 .byte 1 @ 79 .byte 1 @ 80 .byte 2 @ 81 .byte 2 @ 82 .byte 2 @ 83 .byte 2 @ 84 .byte 2 @ 85 .byte 2 @ 86 .byte 2 @ 87 .byte 2 @ 88 .byte 2 @ 89 .byte 2 @ 90 .byte 2 @ 91 .byte 2 @ 92 .byte 2 @ 93 .byte 2 @ 94 .byte 2 @ 95 .byte 2 @ 96 .byte 2 @ 97 .byte 2 @ 98 .byte 2 @ 99 .byte 2 @ 100 .byte 2 @ 101 .byte 2 @ 102 .byte 2 @ 103 .byte 2 @ 104 .byte 2 @ 105 .byte 2 @ 106 .byte 2 @ 107 .set KeySplitTable3, . - 36 .byte 0 @ 36 .byte 0 @ 37 .byte 0 @ 38 .byte 0 @ 39 .byte 0 @ 40 .byte 0 @ 41 .byte 0 @ 42 .byte 0 @ 43 .byte 0 @ 44 .byte 0 @ 45 .byte 0 @ 46 .byte 0 @ 47 .byte 0 @ 48 .byte 0 @ 49 .byte 0 @ 50 .byte 0 @ 51 .byte 0 @ 52 .byte 0 @ 53 .byte 0 @ 54 .byte 0 @ 55 .byte 0 @ 56 .byte 0 @ 57 .byte 0 @ 58 .byte 0 @ 59 .byte 0 @ 60 .byte 0 @ 61 .byte 0 @ 62 .byte 0 @ 63 .byte 0 @ 64 .byte 0 @ 65 .byte 1 @ 66 .byte 1 @ 67 .byte 1 @ 68 .byte 1 @ 69 .byte 1 @ 70 .byte 1 @ 71 .byte 1 @ 72 .byte 1 @ 73 .byte 1 @ 74 .byte 1 @ 75 .byte 1 @ 76 .byte 1 @ 77 .byte 1 @ 78 .byte 1 @ 79 .byte 1 @ 80 .byte 1 @ 81 .byte 1 @ 82 .byte 1 @ 83 .byte 2 @ 84 .byte 2 @ 85 .byte 2 @ 86 .byte 2 @ 87 .byte 2 @ 88 .byte 2 @ 89 .byte 2 @ 90 .byte 2 @ 91 .byte 2 @ 92 .byte 2 @ 93 .byte 2 @ 94 .byte 2 @ 95 .byte 2 @ 96 .byte 2 @ 97 .byte 2 @ 98 .byte 2 @ 99 .byte 2 @ 100 .byte 2 @ 101 .byte 2 @ 102 .byte 2 @ 103 .byte 2 @ 104 .byte 2 @ 105 .byte 2 @ 106 .byte 2 @ 107 .set KeySplitTable4, . - 24 .byte 0 @ 24 .byte 0 @ 25 .byte 0 @ 26 .byte 0 @ 27 .byte 0 @ 28 .byte 0 @ 29 .byte 0 @ 30 .byte 0 @ 31 .byte 0 @ 32 .byte 0 @ 33 .byte 0 @ 34 .byte 0 @ 35 .byte 0 @ 36 .byte 0 @ 37 .byte 0 @ 38 .byte 0 @ 39 .byte 0 @ 40 .byte 0 @ 41 .byte 1 @ 42 .byte 1 @ 43 .byte 1 @ 44 .byte 1 @ 45 .byte 1 @ 46 .byte 1 @ 47 .byte 1 @ 48 .byte 1 @ 49 .byte 1 @ 50 .byte 1 @ 51 .byte 1 @ 52 .byte 1 @ 53 .byte 1 @ 54 .byte 1 @ 55 .byte 1 @ 56 .byte 1 @ 57 .byte 1 @ 58 .byte 1 @ 59 .byte 1 @ 60 .byte 1 @ 61 .byte 1 @ 62 .byte 1 @ 63 .byte 1 @ 64 .byte 1 @ 65 .byte 1 @ 66 .byte 1 @ 67 .byte 1 @ 68 .byte 1 @ 69 .byte 1 @ 70 .byte 1 @ 71 .byte 1 @ 72 .byte 1 @ 73 .byte 1 @ 74 .byte 1 @ 75 .byte 1 @ 76 .byte 1 @ 77 .byte 1 @ 78 .byte 1 @ 79 .byte 1 @ 80 .byte 1 @ 81 .byte 1 @ 82 .byte 1 @ 83 .byte 1 @ 84 .byte 1 @ 85 .byte 1 @ 86 .byte 1 @ 87 .byte 1 @ 88 .byte 1 @ 89 .byte 1 @ 90 .byte 1 @ 91 .byte 1 @ 92 .byte 1 @ 93 .byte 1 @ 94 .byte 1 @ 95 .byte 1 @ 96 .byte 1 @ 97 .byte 1 @ 98 .byte 1 @ 99 .byte 1 @ 100 .byte 1 @ 101 .byte 1 @ 102 .byte 1 @ 103 .byte 1 @ 104 .byte 1 @ 105 .byte 1 @ 106 .byte 1 @ 107 .set KeySplitTable5, . - 36 .byte 0 @ 36 .byte 0 @ 37 .byte 0 @ 38 .byte 0 @ 39 .byte 0 @ 40 .byte 0 @ 41 .byte 0 @ 42 .byte 0 @ 43 .byte 0 @ 44 .byte 0 @ 45 .byte 0 @ 46 .byte 0 @ 47 .byte 0 @ 48 .byte 0 @ 49 .byte 0 @ 50 .byte 0 @ 51 .byte 0 @ 52 .byte 0 @ 53 .byte 0 @ 54 .byte 0 @ 55 .byte 0 @ 56 .byte 0 @ 57 .byte 0 @ 58 .byte 0 @ 59 .byte 0 @ 60 .byte 0 @ 61 .byte 0 @ 62 .byte 0 @ 63 .byte 0 @ 64 .byte 0 @ 65 .byte 1 @ 66 .byte 1 @ 67 .byte 1 @ 68 .byte 1 @ 69 .byte 1 @ 70 .byte 1 @ 71 .byte 1 @ 72 .byte 1 @ 73 .byte 1 @ 74 .byte 1 @ 75 .byte 1 @ 76 .byte 1 @ 77 .byte 1 @ 78 .byte 1 @ 79 .byte 1 @ 80 .byte 1 @ 81 .byte 1 @ 82 .byte 1 @ 83 .byte 1 @ 84 .byte 1 @ 85 .byte 1 @ 86 .byte 1 @ 87 .byte 1 @ 88 .byte 1 @ 89 .byte 1 @ 90 .byte 1 @ 91 .byte 1 @ 92 .byte 1 @ 93 .byte 1 @ 94 .byte 1 @ 95 .byte 1 @ 96 .byte 1 @ 97 .byte 1 @ 98 .byte 1 @ 99 .byte 1 @ 100 .byte 1 @ 101 .byte 1 @ 102 .byte 1 @ 103 .byte 1 @ 104 .byte 1 @ 105 .byte 1 @ 106 .byte 1 @ 107 ================================================ FILE: sound/music_player_table.inc ================================================ .equiv TRACK_SIZE, 0x50 .equiv NUM_TRACKS_BGM, 10 .equiv NUM_TRACKS_SE1, 3 .equiv NUM_TRACKS_SE2, 9 .equiv NUM_TRACKS_SE3, 1 .bss gMPlayTrack_BGM:: .space TRACK_SIZE * NUM_TRACKS_BGM .size gMPlayTrack_BGM, .-gMPlayTrack_BGM gMPlayTrack_SE1:: .space TRACK_SIZE * NUM_TRACKS_SE1 .size gMPlayTrack_SE1, .-gMPlayTrack_SE1 gMPlayTrack_SE2:: .space TRACK_SIZE * NUM_TRACKS_SE2 .size gMPlayTrack_SE2, .-gMPlayTrack_SE2 gMPlayTrack_SE3:: .space TRACK_SIZE * NUM_TRACKS_SE3 .size gMPlayTrack_SE3, .-gMPlayTrack_SE3 .section .rodata .align 2 gMPlayTable:: music_player gMPlayInfo_BGM, gMPlayTrack_BGM, NUM_TRACKS_BGM, 0 music_player gMPlayInfo_SE1, gMPlayTrack_SE1, NUM_TRACKS_SE1, 1 music_player gMPlayInfo_SE2, gMPlayTrack_SE2, NUM_TRACKS_SE2, 1 music_player gMPlayInfo_SE3, gMPlayTrack_SE3, NUM_TRACKS_SE3, 0 ================================================ FILE: sound/programmable_wave_data.inc ================================================ ProgrammableWaveData_1:: .incbin "sound/programmable_wave_samples/01.pcm" ProgrammableWaveData_2:: .incbin "sound/programmable_wave_samples/02.pcm" ProgrammableWaveData_3:: .incbin "sound/programmable_wave_samples/03.pcm" ProgrammableWaveData_4:: .incbin "sound/programmable_wave_samples/04.pcm" ProgrammableWaveData_5:: .incbin "sound/programmable_wave_samples/05.pcm" ProgrammableWaveData_6:: .incbin "sound/programmable_wave_samples/06.pcm" ProgrammableWaveData_7:: .incbin "sound/programmable_wave_samples/07.pcm" ProgrammableWaveData_8:: .incbin "sound/programmable_wave_samples/08.pcm" ProgrammableWaveData_9:: .incbin "sound/programmable_wave_samples/09.pcm" ProgrammableWaveData_10:: .incbin "sound/programmable_wave_samples/10.pcm" ProgrammableWaveData_11:: .incbin "sound/programmable_wave_samples/11.pcm" ProgrammableWaveData_12:: .incbin "sound/programmable_wave_samples/12.pcm" ProgrammableWaveData_13:: .incbin "sound/programmable_wave_samples/13.pcm" ProgrammableWaveData_14:: .incbin "sound/programmable_wave_samples/14.pcm" ProgrammableWaveData_15:: .incbin "sound/programmable_wave_samples/15.pcm" ProgrammableWaveData_16:: .incbin "sound/programmable_wave_samples/16.pcm" @ Unused ProgrammableWaveData_17:: .incbin "sound/programmable_wave_samples/17.pcm" @ Unused ProgrammableWaveData_18:: .incbin "sound/programmable_wave_samples/18.pcm" @ Unused ProgrammableWaveData_19:: .incbin "sound/programmable_wave_samples/19.pcm" @ Unused ProgrammableWaveData_20:: .incbin "sound/programmable_wave_samples/20.pcm" ProgrammableWaveData_21:: .incbin "sound/programmable_wave_samples/21.pcm" ProgrammableWaveData_22:: .incbin "sound/programmable_wave_samples/22.pcm" ProgrammableWaveData_23:: .incbin "sound/programmable_wave_samples/23.pcm" ProgrammableWaveData_24:: .incbin "sound/programmable_wave_samples/24.pcm" ProgrammableWaveData_25:: .incbin "sound/programmable_wave_samples/25.pcm" ================================================ FILE: sound/programmable_wave_samples/01.pcm ================================================ %c%c ================================================ FILE: sound/programmable_wave_samples/02.pcm ================================================ Fu1Fu1 ================================================ FILE: sound/programmable_wave_samples/03.pcm ================================================ ܺvT2ܺvT2 ================================================ FILE: sound/programmable_wave_samples/04.pcm ================================================ wwe1wwe1 ================================================ FILE: sound/programmable_wave_samples/05.pcm ================================================ ʆC!ʆC! ================================================ FILE: sound/programmable_wave_samples/06.pcm ================================================ CFCF ================================================ FILE: sound/programmable_wave_samples/10.pcm ================================================ fUD3"" fUD3"" ================================================ FILE: sound/programmable_wave_samples/11.pcm ================================================ fUDDDD@fUDDDD@ ================================================ FILE: sound/programmable_wave_samples/12.pcm ================================================ ffffff`ffffff` ================================================ FILE: sound/programmable_wave_samples/13.pcm ================================================ ================================================ FILE: sound/programmable_wave_samples/14.pcm ================================================ gȘVTgȘVT ================================================ FILE: sound/programmable_wave_samples/16.pcm ================================================ &8J\ZH6&8J\ZH6 ================================================ FILE: sound/programmable_wave_samples/17.pcm ================================================ feUDC3"feUDC3" ================================================ FILE: sound/programmable_wave_samples/18.pcm ================================================ wfUD2wfUD2 ================================================ FILE: sound/programmable_wave_samples/19.pcm ================================================ ̪fUD2̪fUD2 ================================================ FILE: sound/programmable_wave_samples/20.pcm ================================================ ̪vT2̪vT2 ================================================ FILE: sound/programmable_wave_samples/21.pcm ================================================ wfeUD2wfeUD2 ================================================ FILE: sound/programmable_wave_samples/22.pcm ================================================ eT3""eT3"" ================================================ FILE: sound/song_table.inc ================================================ .align 2 gSongTable:: song mus_dummy, 0, 0 song se_use_item, 1, 1 song se_pc_login, 1, 1 song se_pc_off, 1, 1 song se_pc_on, 1, 1 song se_select, 2, 2 song se_win_open, 1, 1 song se_wall_hit, 2, 2 song se_door, 1, 1 song se_exit, 1, 1 song se_ledge, 1, 1 song se_bike_bell, 1, 1 song se_not_effective, 1, 1 song se_effective, 1, 1 song se_super_effective, 1, 1 song se_ball_open, 1, 1 song se_faint, 1, 1 song se_flee, 1, 1 song se_sliding_door, 1, 1 song se_ship, 1, 1 song se_bang, 1, 1 song se_pin, 1, 1 song se_boo, 1, 1 song se_ball, 1, 1 song se_contest_place, 2, 2 song se_a, 1, 1 song se_i, 1, 1 song se_u, 1, 1 song se_e, 1, 1 song se_o, 1, 1 song se_n, 1, 1 song se_success, 1, 1 song se_failure, 1, 1 song se_exp, 1, 1 song se_bike_hop, 1, 1 song se_switch, 1, 1 song se_click, 1, 1 song se_fu_zaku, 1, 1 song se_contest_condition_lose, 1, 1 song se_lavaridge_fall_warp, 1, 1 song se_ice_stairs, 1, 1 song se_ice_break, 1, 1 song se_ice_crack, 1, 1 song se_fall, 1, 1 song se_unlock, 2, 2 song se_warp_in, 1, 1 song se_warp_out, 1, 1 song se_repel, 1, 1 song se_rotating_gate, 1, 1 song se_truck_move, 1, 1 song se_truck_stop, 1, 1 song se_truck_unload, 2, 2 song se_truck_door, 1, 1 song se_berry_blender, 2, 2 song se_card, 1, 1 song se_save, 1, 1 song se_ball_bounce_1, 1, 1 song se_ball_bounce_2, 1, 1 song se_ball_bounce_3, 1, 1 song se_ball_bounce_4, 1, 1 song se_ball_trade, 2, 2 song se_ball_throw, 1, 1 song se_note_c, 2, 2 song se_note_d, 2, 2 song se_note_e, 2, 2 song se_note_f, 2, 2 song se_note_g, 2, 2 song se_note_a, 2, 2 song se_note_b, 2, 2 song se_note_c_high, 2, 2 song se_puddle, 2, 2 song se_bridge_walk, 2, 2 song se_itemfinder, 1, 1 song se_ding_dong, 1, 1 song se_balloon_red, 2, 2 song se_balloon_blue, 2, 2 song se_balloon_yellow, 2, 2 song se_breakable_door, 2, 2 song se_mud_ball, 2, 2 song se_field_poison, 1, 1 song se_escalator, 1, 1 song se_thunderstorm, 3, 3 song se_thunderstorm_stop, 3, 3 song se_downpour, 3, 3 song se_downpour_stop, 3, 3 song se_rain, 3, 3 song se_rain_stop, 3, 3 song se_thunder, 1, 1 song se_thunder2, 1, 1 song se_elevator, 1, 1 song se_low_health, 3, 3 song se_exp_max, 1, 1 song se_roulette_ball, 2, 2 song se_roulette_ball2, 2, 2 song se_taillow_wing_flap, 1, 1 song se_shop, 1, 1 song se_contest_heart, 1, 1 song se_contest_curtain_rise, 1, 1 song se_contest_curtain_fall, 1, 1 song se_contest_icon_change, 1, 1 song se_contest_icon_clear, 1, 1 song se_contest_mons_turn, 1, 1 song se_shiny, 1, 1 song se_intro_blast, 1, 1 song se_mugshot, 1, 1 song se_applause, 1, 1 song se_vend, 1, 1 song se_orb, 1, 1 song se_dex_scroll, 1, 1 song se_dex_page, 1, 1 song se_pokenav_on, 1, 1 song se_pokenav_off, 1, 1 song se_dex_search, 1, 1 song se_egg_hatch, 1, 1 song se_ball_tray_enter, 1, 1 song se_ball_tray_ball, 1, 1 song se_ball_tray_exit, 2, 2 song se_glass_flute, 1, 1 song se_m_thunderbolt, 2, 2 song se_m_thunderbolt2, 1, 1 song se_m_harden, 1, 1 song se_m_nightmare, 1, 1 song se_m_vital_throw, 1, 1 song se_m_vital_throw2, 1, 1 song se_m_bubble, 1, 1 song se_m_bubble2, 1, 1 song se_m_bubble3, 1, 1 song se_m_rain_dance, 1, 1 song se_m_cut, 1, 1 song se_m_string_shot, 1, 1 song se_m_string_shot2, 1, 1 song se_m_rock_throw, 1, 1 song se_m_gust, 2, 2 song se_m_gust2, 2, 2 song se_m_double_slap, 1, 1 song se_m_double_team, 1, 1 song se_m_razor_wind, 1, 1 song se_m_icy_wind, 1, 1 song se_m_thunder_wave, 1, 1 song se_m_comet_punch, 1, 1 song se_m_mega_kick, 1, 1 song se_m_mega_kick2, 1, 1 song se_m_crabhammer, 1, 1 song se_m_jump_kick, 1, 1 song se_m_flame_wheel, 1, 1 song se_m_flame_wheel2, 1, 1 song se_m_flamethrower, 1, 1 song se_m_fire_punch, 1, 1 song se_m_toxic, 1, 1 song se_m_sacred_fire, 1, 1 song se_m_sacred_fire2, 2, 2 song se_m_ember, 1, 1 song se_m_take_down, 2, 2 song se_m_blizzard, 1, 1 song se_m_blizzard2, 1, 1 song se_m_scratch, 1, 1 song se_m_vicegrip, 1, 1 song se_m_wing_attack, 1, 1 song se_m_fly, 1, 1 song se_m_sand_attack, 1, 1 song se_m_razor_wind2, 1, 1 song se_m_bite, 1, 1 song se_m_headbutt, 1, 1 song se_m_surf, 1, 1 song se_m_hydro_pump, 1, 1 song se_m_whirlpool, 1, 1 song se_m_horn_attack, 1, 1 song se_m_tail_whip, 2, 2 song se_m_mist, 1, 1 song se_m_poison_powder, 1, 1 song se_m_bind, 2, 2 song se_m_dragon_rage, 1, 1 song se_m_sing, 1, 1 song se_m_perish_song, 1, 1 song se_m_pay_day, 1, 1 song se_m_dig, 1, 1 song se_m_dizzy_punch, 1, 1 song se_m_self_destruct, 1, 1 song se_m_explosion, 1, 1 song se_m_absorb_2, 1, 1 song se_m_absorb, 1, 1 song se_m_screech, 1, 1 song se_m_bubble_beam, 1, 1 song se_m_bubble_beam2, 1, 1 song se_m_supersonic, 1, 1 song se_m_belly_drum, 1, 1 song se_m_metronome, 1, 1 song se_m_bonemerang, 1, 1 song se_m_lick, 1, 1 song se_m_psybeam, 1, 1 song se_m_faint_attack, 1, 1 song se_m_swords_dance, 1, 1 song se_m_leer, 1, 1 song se_m_swagger, 1, 1 song se_m_swagger2, 1, 1 song se_m_heal_bell, 1, 1 song se_m_confuse_ray, 1, 1 song se_m_snore, 1, 1 song se_m_brick_break, 1, 1 song se_m_giga_drain, 1, 1 song se_m_psybeam2, 1, 1 song se_m_solar_beam, 2, 2 song se_m_petal_dance, 1, 1 song se_m_teleport, 1, 1 song se_m_minimize, 1, 1 song se_m_sketch, 1, 1 song se_m_swift, 1, 1 song se_m_reflect, 1, 1 song se_m_barrier, 1, 1 song se_m_detect, 2, 2 song se_m_lock_on, 1, 1 song se_m_moonlight, 1, 1 song se_m_charm, 1, 1 song se_m_charge, 1, 1 song se_m_strength, 1, 1 song se_m_hyper_beam, 1, 1 song se_m_waterfall, 1, 1 song se_m_reversal, 1, 1 song se_m_acid_armor, 1, 1 song se_m_sandstorm, 1, 1 song se_m_tri_attack, 1, 1 song se_m_tri_attack2, 1, 1 song se_m_encore, 1, 1 song se_m_encore2, 2, 2 song se_m_baton_pass, 1, 1 song se_m_milk_drink, 1, 1 song se_m_attract, 1, 1 song se_m_attract2, 1, 1 song se_m_morning_sun, 1, 1 song se_m_flatter, 1, 1 song se_m_sand_tomb, 1, 1 song se_m_grasswhistle, 1, 1 song se_m_spit_up, 1, 1 song se_m_dive, 1, 1 song se_m_earthquake, 2, 2 song se_m_twister, 2, 2 song se_m_sweet_scent, 1, 1 song se_m_yawn, 1, 1 song se_m_sky_uppercut, 2, 2 song se_m_stat_increase, 1, 1 song se_m_heat_wave, 1, 1 song se_m_uproar, 1, 1 song se_m_hail, 1, 1 song se_m_cosmic_power, 2, 2 song se_m_teeter_dance, 1, 1 song se_m_stat_decrease, 1, 1 song se_m_haze, 1, 1 song se_m_hyper_beam2, 1, 1 song se_rg_door, 1, 1 song se_rg_card_flip, 1, 1 song se_rg_card_flipping, 1, 1 song se_rg_card_open, 1, 1 song se_rg_bag_cursor, 1, 1 song se_rg_bag_pocket, 1, 1 song se_rg_ball_click, 1, 1 song se_rg_shop, 1, 1 song se_rg_ss_anne_horn, 1, 1 song se_rg_help_open, 1, 1 song se_rg_help_close, 1, 1 song se_rg_help_error, 1, 1 song se_rg_deoxys_move, 1, 1 song se_rg_poke_jump_success, 1, 1 song se_rg_poke_jump_failure, 1, 1 song se_pokenav_call, 1, 1 song se_pokenav_hang_up, 1, 1 song se_arena_timeup1, 1, 1 song se_arena_timeup2, 1, 1 song se_pike_curtain_close, 1, 1 song se_pike_curtain_open, 1, 1 song se_sudowoodo_shake, 1, 1 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song dummy_song_header, 0, 0 song mus_littleroot_test, 0, 0 song mus_gsc_route38, 0, 0 song mus_caught, 0, 0 song mus_victory_wild, 0, 0 song mus_victory_gym_leader, 0, 0 song mus_victory_league, 0, 0 song mus_c_comm_center, 0, 0 song mus_gsc_pewter, 0, 0 song mus_c_vs_legend_beast, 0, 0 song mus_route101, 0, 0 song mus_route110, 0, 0 song mus_route120, 0, 0 song mus_petalburg, 0, 0 song mus_oldale, 0, 0 song mus_gym, 0, 0 song mus_surf, 0, 0 song mus_petalburg_woods, 0, 0 song mus_level_up, 2, 2 song mus_heal, 2, 2 song mus_obtain_badge, 2, 2 song mus_obtain_item, 2, 2 song mus_evolved, 2, 2 song mus_obtain_tmhm, 2, 2 song mus_lilycove_museum, 0, 0 song mus_route122, 0, 0 song mus_oceanic_museum, 0, 0 song mus_evolution_intro, 2, 2 song mus_evolution, 0, 0 song mus_move_deleted, 2, 2 song mus_encounter_girl, 0, 0 song mus_encounter_male, 0, 0 song mus_abandoned_ship, 0, 0 song mus_fortree, 0, 0 song mus_birch_lab, 0, 0 song mus_b_tower_rs, 0, 0 song mus_encounter_swimmer, 0, 0 song mus_cave_of_origin, 0, 0 song mus_obtain_berry, 2, 2 song mus_awaken_legend, 2, 2 song mus_slots_jackpot, 2, 2 song mus_slots_win, 2, 2 song mus_too_bad, 2, 2 song mus_roulette, 0, 0 song mus_link_contest_p1, 0, 0 song mus_link_contest_p2, 0, 0 song mus_link_contest_p3, 0, 0 song mus_link_contest_p4, 0, 0 song mus_encounter_rich, 0, 0 song mus_verdanturf, 0, 0 song mus_rustboro, 0, 0 song mus_poke_center, 0, 0 song mus_route104, 0, 0 song mus_route119, 0, 0 song mus_cycling, 0, 0 song mus_poke_mart, 0, 0 song mus_littleroot, 0, 0 song mus_mt_chimney, 0, 0 song mus_encounter_female, 0, 0 song mus_lilycove, 0, 0 song mus_route111, 0, 0 song mus_help, 0, 0 song mus_underwater, 0, 0 song mus_victory_trainer, 0, 0 song mus_title, 0, 0 song mus_intro, 0, 0 song mus_encounter_may, 0, 0 song mus_encounter_intense, 0, 0 song mus_encounter_cool, 0, 0 song mus_route113, 0, 0 song mus_encounter_aqua, 0, 0 song mus_follow_me, 0, 0 song mus_encounter_brendan, 0, 0 song mus_ever_grande, 0, 0 song mus_encounter_suspicious, 0, 0 song mus_victory_aqua_magma, 0, 0 song mus_cable_car, 0, 0 song mus_game_corner, 0, 0 song mus_dewford, 0, 0 song mus_safari_zone, 0, 0 song mus_victory_road, 0, 0 song mus_aqua_magma_hideout, 0, 0 song mus_sailing, 0, 0 song mus_mt_pyre, 0, 0 song mus_slateport, 0, 0 song mus_mt_pyre_exterior, 0, 0 song mus_school, 0, 0 song mus_hall_of_fame, 0, 0 song mus_fallarbor, 0, 0 song mus_sealed_chamber, 0, 0 song mus_contest_winner, 0, 0 song mus_contest, 0, 0 song mus_encounter_magma, 0, 0 song mus_intro_battle, 0, 0 song mus_abnormal_weather, 0, 0 song mus_weather_groudon, 0, 0 song mus_sootopolis, 0, 0 song mus_contest_results, 0, 0 song mus_hall_of_fame_room, 0, 0 song mus_trick_house, 0, 0 song mus_encounter_twins, 0, 0 song mus_encounter_elite_four, 0, 0 song mus_encounter_hiker, 0, 0 song mus_contest_lobby, 0, 0 song mus_encounter_interviewer, 0, 0 song mus_encounter_champion, 0, 0 song mus_credits, 0, 0 song mus_end, 0, 0 song mus_b_frontier, 0, 0 song mus_b_arena, 0, 0 song mus_obtain_b_points, 2, 2 song mus_register_match_call, 2, 2 song mus_b_pyramid, 0, 0 song mus_b_pyramid_top, 0, 0 song mus_b_palace, 0, 0 song mus_rayquaza_appears, 0, 0 song mus_b_tower, 0, 0 song mus_obtain_symbol, 2, 2 song mus_b_dome, 0, 0 song mus_b_pike, 0, 0 song mus_b_factory, 0, 0 song mus_vs_rayquaza, 0, 0 song mus_vs_frontier_brain, 0, 0 song mus_vs_mew, 0, 0 song mus_b_dome_lobby, 0, 0 song mus_vs_wild, 0, 0 song mus_vs_aqua_magma, 0, 0 song mus_vs_trainer, 0, 0 song mus_vs_gym_leader, 0, 0 song mus_vs_champion, 0, 0 song mus_vs_regi, 0, 0 song mus_vs_kyogre_groudon, 0, 0 song mus_vs_rival, 0, 0 song mus_vs_elite_four, 0, 0 song mus_vs_aqua_magma_leader, 0, 0 song mus_rg_follow_me, 0, 0 song mus_rg_game_corner, 0, 0 song mus_rg_rocket_hideout, 0, 0 song mus_rg_gym, 0, 0 song mus_rg_jigglypuff, 2, 2 song mus_rg_intro_fight, 0, 0 song mus_rg_title, 0, 0 song mus_rg_cinnabar, 0, 0 song mus_rg_lavender, 0, 0 song mus_rg_heal, 0, 0 song mus_rg_cycling, 0, 0 song mus_rg_encounter_rocket, 0, 0 song mus_rg_encounter_girl, 0, 0 song mus_rg_encounter_boy, 0, 0 song mus_rg_hall_of_fame, 0, 0 song mus_rg_viridian_forest, 0, 0 song mus_rg_mt_moon, 0, 0 song mus_rg_poke_mansion, 0, 0 song mus_rg_credits, 0, 0 song mus_rg_route1, 0, 0 song mus_rg_route24, 0, 0 song mus_rg_route3, 0, 0 song mus_rg_route11, 0, 0 song mus_rg_victory_road, 0, 0 song mus_rg_vs_gym_leader, 0, 0 song mus_rg_vs_trainer, 0, 0 song mus_rg_vs_wild, 0, 0 song mus_rg_vs_champion, 0, 0 song mus_rg_pallet, 0, 0 song mus_rg_oak_lab, 0, 0 song mus_rg_oak, 0, 0 song mus_rg_poke_center, 0, 0 song mus_rg_ss_anne, 0, 0 song mus_rg_surf, 0, 0 song mus_rg_poke_tower, 0, 0 song mus_rg_silph, 0, 0 song mus_rg_fuchsia, 0, 0 song mus_rg_celadon, 0, 0 song mus_rg_victory_trainer, 0, 0 song mus_rg_victory_wild, 0, 0 song mus_rg_victory_gym_leader, 0, 0 song mus_rg_vermillion, 0, 0 song mus_rg_pewter, 0, 0 song mus_rg_encounter_rival, 0, 0 song mus_rg_rival_exit, 0, 0 song mus_rg_dex_rating, 2, 2 song mus_rg_obtain_key_item, 2, 2 song mus_rg_caught_intro, 2, 2 song mus_rg_photo, 2, 2 song mus_rg_game_freak, 0, 0 song mus_rg_caught, 0, 0 song mus_rg_new_game_instruct, 0, 0 song mus_rg_new_game_intro, 0, 0 song mus_rg_new_game_exit, 0, 0 song mus_rg_poke_jump, 0, 0 song mus_rg_union_room, 0, 0 song mus_rg_net_center, 0, 0 song mus_rg_mystery_gift, 0, 0 song mus_rg_berry_pick, 0, 0 song mus_rg_sevii_cave, 0, 0 song mus_rg_teachy_tv_show, 0, 0 song mus_rg_sevii_route, 0, 0 song mus_rg_sevii_dungeon, 0, 0 song mus_rg_sevii_123, 0, 0 song mus_rg_sevii_45, 0, 0 song mus_rg_sevii_67, 0, 0 song mus_rg_poke_flute, 2, 2 song mus_rg_vs_deoxys, 0, 0 song mus_rg_vs_mewtwo, 0, 0 song mus_rg_vs_legend, 0, 0 song mus_rg_encounter_gym_leader, 0, 0 song mus_rg_encounter_deoxys, 0, 0 song mus_rg_trainer_tower, 0, 0 song mus_rg_slow_pallet, 0, 0 song mus_rg_teachy_tv_menu, 0, 0 song ph_trap_blend, 2, 2 song ph_trap_held, 2, 2 song ph_trap_solo, 2, 2 song ph_face_blend, 2, 2 song ph_face_held, 2, 2 song ph_face_solo, 2, 2 song ph_cloth_blend, 2, 2 song ph_cloth_held, 2, 2 song ph_cloth_solo, 2, 2 song ph_dress_blend, 2, 2 song ph_dress_held, 2, 2 song ph_dress_solo, 2, 2 song ph_fleece_blend, 2, 2 song ph_fleece_held, 2, 2 song ph_fleece_solo, 2, 2 song ph_kit_blend, 2, 2 song ph_kit_held, 2, 2 song ph_kit_solo, 2, 2 song ph_price_blend, 2, 2 song ph_price_held, 2, 2 song ph_price_solo, 2, 2 song ph_lot_blend, 2, 2 song ph_lot_held, 2, 2 song ph_lot_solo, 2, 2 song ph_goat_blend, 2, 2 song ph_goat_held, 2, 2 song ph_goat_solo, 2, 2 song ph_thought_blend, 2, 2 song ph_thought_held, 2, 2 song ph_thought_solo, 2, 2 song ph_choice_blend, 2, 2 song ph_choice_held, 2, 2 song ph_choice_solo, 2, 2 song ph_mouth_blend, 2, 2 song ph_mouth_held, 2, 2 song ph_mouth_solo, 2, 2 song ph_foot_blend, 2, 2 song ph_foot_held, 2, 2 song ph_foot_solo, 2, 2 song ph_goose_blend, 2, 2 song ph_goose_held, 2, 2 song ph_goose_solo, 2, 2 song ph_strut_blend, 2, 2 song ph_strut_held, 2, 2 song ph_strut_solo, 2, 2 song ph_cure_blend, 2, 2 song ph_cure_held, 2, 2 song ph_cure_solo, 2, 2 song ph_nurse_blend, 2, 2 song ph_nurse_held, 2, 2 song ph_nurse_solo, 2, 2 .align 2 dummy_song_header: .byte 0, 0, 0, 0 ================================================ FILE: sound/songs/se_dex_page.s ================================================ .include "MPlayDef.s" .equ se_dex_page_grp, voicegroup127 .equ se_dex_page_pri, 5 .equ se_dex_page_rev, reverb_set+50 .equ se_dex_page_mvl, 127 .equ se_dex_page_key, 0 .equ se_dex_page_tbs, 1 .equ se_dex_page_exg, 0 .equ se_dex_page_cmp, 1 .section .rodata .global se_dex_page .align 2 @********************** Track 1 **********************@ se_dex_page_1: .byte KEYSH , se_dex_page_key+0 .byte TEMPO , 100*se_dex_page_tbs/2 .byte VOICE , 4 .byte BENDR , 12 .byte XCMD , xIECV , 10 .byte xIECL , 8 .byte VOL , 90*se_dex_page_mvl/mxv .byte BEND , c_v+4 .byte N01 , Cn5 , v064 .byte W01 .byte Cn5 , v020 .byte W01 .byte Cn5 , v064 .byte W01 .byte Cn5 , v020 .byte W01 .byte Cn6 , v064 .byte W02 .byte Cn6 , v020 .byte W03 .byte FINE @******************************************************@ .align 2 se_dex_page: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_dex_page_pri @ Priority .byte se_dex_page_rev @ Reverb. .word se_dex_page_grp .word se_dex_page_1 .end ================================================ FILE: sound/songs/se_dex_scroll.s ================================================ .include "MPlayDef.s" .equ se_dex_scroll_grp, voicegroup127 .equ se_dex_scroll_pri, 5 .equ se_dex_scroll_rev, reverb_set+50 .equ se_dex_scroll_mvl, 127 .equ se_dex_scroll_key, 0 .equ se_dex_scroll_tbs, 1 .equ se_dex_scroll_exg, 0 .equ se_dex_scroll_cmp, 1 .section .rodata .global se_dex_scroll .align 2 @********************** Track 1 **********************@ se_dex_scroll_1: .byte KEYSH , se_dex_scroll_key+0 .byte TEMPO , 100*se_dex_scroll_tbs/2 .byte VOICE , 4 .byte BENDR , 12 .byte XCMD , xIECV , 10 .byte xIECL , 8 .byte VOL , 40*se_dex_scroll_mvl/mxv .byte BEND , c_v+4 .byte N01 , Gn4 , v127 .byte W01 .byte Gn4 , v020 .byte W02 .byte FINE @******************************************************@ .align 2 se_dex_scroll: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_dex_scroll_pri @ Priority .byte se_dex_scroll_rev @ Reverb. .word se_dex_scroll_grp .word se_dex_scroll_1 .end ================================================ FILE: sound/songs/se_m_absorb.s ================================================ .include "MPlayDef.s" .equ se_m_absorb_grp, voicegroup128 .equ se_m_absorb_pri, 4 .equ se_m_absorb_rev, reverb_set+50 .equ se_m_absorb_mvl, 127 .equ se_m_absorb_key, 0 .equ se_m_absorb_tbs, 1 .equ se_m_absorb_exg, 0 .equ se_m_absorb_cmp, 1 .section .rodata .global se_m_absorb .align 2 @********************** Track 1 **********************@ se_m_absorb_1: .byte KEYSH , se_m_absorb_key+0 .byte TEMPO , 150*se_m_absorb_tbs/2 .byte VOICE , 24 .byte VOL , 110*se_m_absorb_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N01 , Cn6 , v127 .byte W01 .byte Gn6 , v112 .byte W01 .byte VOICE , 38 .byte VOL , 58*se_m_absorb_mvl/mxv .byte N08 , Gn4 .byte W01 .byte VOL , 68*se_m_absorb_mvl/mxv .byte PAN , c_v+8 .byte BEND , c_v-20 .byte W01 .byte VOL , 75*se_m_absorb_mvl/mxv .byte PAN , c_v-8 .byte BEND , c_v-48 .byte W02 .byte VOL , 83*se_m_absorb_mvl/mxv .byte PAN , c_v+8 .byte BEND , c_v-18 .byte W01 .byte VOL , 90*se_m_absorb_mvl/mxv .byte PAN , c_v-8 .byte BEND , c_v+10 .byte W01 .byte VOL , 101*se_m_absorb_mvl/mxv .byte PAN , c_v+9 .byte BEND , c_v+39 .byte W01 .byte VOL , 110*se_m_absorb_mvl/mxv .byte PAN , c_v-8 .byte BEND , c_v+63 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_absorb: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_absorb_pri @ Priority .byte se_m_absorb_rev @ Reverb. .word se_m_absorb_grp .word se_m_absorb_1 .end ================================================ FILE: sound/songs/se_m_absorb_2.s ================================================ .include "MPlayDef.s" .equ se_m_absorb_2_grp, voicegroup128 .equ se_m_absorb_2_pri, 4 .equ se_m_absorb_2_rev, reverb_set+50 .equ se_m_absorb_2_mvl, 127 .equ se_m_absorb_2_key, 0 .equ se_m_absorb_2_tbs, 1 .equ se_m_absorb_2_exg, 0 .equ se_m_absorb_2_cmp, 1 .section .rodata .global se_m_absorb_2 .align 2 @********************** Track 1 **********************@ se_m_absorb_2_1: .byte KEYSH , se_m_absorb_2_key+0 .byte TEMPO , 150*se_m_absorb_2_tbs/2 .byte VOICE , 46 .byte VOL , 110*se_m_absorb_2_mvl/mxv .byte BENDR , 2 .byte PAN , c_v+0 .byte BEND , c_v+15 .byte W01 .byte N02 , Dn6 , v112 .byte W02 .byte Cs6 .byte W03 .byte PAN , c_v+8 .byte N02 , An5 .byte W02 .byte Fs5 .byte W01 .byte W01 .byte Dn5 .byte W02 .byte PAN , c_v-7 .byte W01 .byte N02 , Dn5 , v104 .byte W02 .byte Cs5 , v100 .byte W03 .byte PAN , c_v+0 .byte N02 , An4 , v096 .byte W02 .byte Fs4 , v092 .byte W01 .byte W01 .byte Dn4 , v088 .byte W02 .byte PAN , c_v+15 .byte W01 .byte N02 , Dn6 .byte W02 .byte Cs6 , v084 .byte W03 .byte An5 , v080 .byte W02 .byte Fs5 , v076 .byte W01 .byte W01 .byte Dn5 , v072 .byte W02 .byte PAN , c_v-16 .byte W01 .byte N02 , Dn6 , v068 .byte W02 .byte Cs6 , v064 .byte W03 .byte An5 , v060 .byte W02 .byte Fs5 , v056 .byte W01 .byte W01 .byte Dn5 , v052 .byte W02 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_absorb_2_2: .byte KEYSH , se_m_absorb_2_key+0 .byte VOICE , 53 .byte BENDR , 2 .byte VOL , 43*se_m_absorb_2_mvl/mxv .byte BEND , c_v+15 .byte N02 , An6 , v112 .byte W02 .byte Fs6 .byte W01 .byte W01 .byte Dn6 .byte W02 .byte W01 .byte Cs6 .byte W02 .byte An5 .byte W03 .byte N02 .byte W02 .byte Fs5 , v104 .byte W01 .byte W01 .byte Dn5 , v100 .byte W02 .byte W01 .byte Cs5 , v096 .byte W02 .byte An4 , v092 .byte W03 .byte An6 , v088 .byte W02 .byte Fs6 , v084 .byte W01 .byte W01 .byte Dn6 , v080 .byte W02 .byte W01 .byte Cs6 , v076 .byte W02 .byte An5 , v072 .byte W03 .byte An6 , v068 .byte W02 .byte Fs6 , v064 .byte W01 .byte W01 .byte Dn6 , v060 .byte W02 .byte W01 .byte Cs6 , v056 .byte W02 .byte An5 , v052 .byte W03 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_absorb_2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_absorb_2_pri @ Priority .byte se_m_absorb_2_rev @ Reverb. .word se_m_absorb_2_grp .word se_m_absorb_2_1 .word se_m_absorb_2_2 .end ================================================ FILE: sound/songs/se_m_acid_armor.s ================================================ .include "MPlayDef.s" .equ se_m_acid_armor_grp, voicegroup128 .equ se_m_acid_armor_pri, 4 .equ se_m_acid_armor_rev, reverb_set+50 .equ se_m_acid_armor_mvl, 127 .equ se_m_acid_armor_key, 0 .equ se_m_acid_armor_tbs, 1 .equ se_m_acid_armor_exg, 0 .equ se_m_acid_armor_cmp, 1 .section .rodata .global se_m_acid_armor .align 2 @********************** Track 1 **********************@ se_m_acid_armor_1: .byte KEYSH , se_m_acid_armor_key+0 .byte TEMPO , 150*se_m_acid_armor_tbs/2 .byte VOICE , 31 .byte VOL , 110*se_m_acid_armor_mvl/mxv .byte BENDR , 24 .byte PAN , c_v+0 .byte BEND , c_v-37 .byte N06 , Gn0 , v127 .byte W01 .byte BEND , c_v-16 .byte W01 .byte c_v+0 .byte W01 .byte c_v+27 .byte W01 .byte c_v+46 .byte W02 .byte VOICE , 23 .byte PAN , c_v+11 .byte N01 , Cn1 .byte W01 .byte PAN , c_v-10 .byte N01 , Cn2 .byte W01 .byte VOICE , 31 .byte PAN , c_v+6 .byte BEND , c_v-37 .byte N06 , Dn1 .byte W01 .byte BEND , c_v-16 .byte W01 .byte c_v+0 .byte W02 .byte c_v+27 .byte W01 .byte c_v+46 .byte W01 .byte VOICE , 23 .byte PAN , c_v-1 .byte N01 , Fn1 .byte W01 .byte PAN , c_v-10 .byte N01 , Fn2 .byte W01 .byte VOICE , 31 .byte PAN , c_v+0 .byte BEND , c_v-37 .byte N02 , Gn0 .byte W02 .byte BEND , c_v-16 .byte W01 .byte c_v+0 .byte W01 .byte PAN , c_v+5 .byte BEND , c_v+27 .byte N02 .byte W01 .byte BEND , c_v+46 .byte W01 .byte VOICE , 23 .byte PAN , c_v+10 .byte N01 , Cn1 .byte W02 .byte PAN , c_v-9 .byte N01 , Cn2 .byte W01 .byte VOICE , 31 .byte PAN , c_v+0 .byte BEND , c_v-37 .byte N06 , Dn1 .byte W01 .byte BEND , c_v-16 .byte W01 .byte c_v+0 .byte W01 .byte c_v+27 .byte W02 .byte c_v+46 .byte W01 .byte VOICE , 23 .byte PAN , c_v+5 .byte N01 , Cn1 .byte W01 .byte PAN , c_v-8 .byte N01 , Cn2 .byte W01 .byte VOICE , 31 .byte PAN , c_v+0 .byte BEND , c_v-37 .byte N06 , Gn0 , v112 .byte W01 .byte BEND , c_v-16 .byte W02 .byte c_v+0 .byte W01 .byte c_v+27 .byte W01 .byte c_v+46 .byte W01 .byte VOICE , 23 .byte PAN , c_v+11 .byte N01 , Cn1 , v100 .byte W01 .byte PAN , c_v-10 .byte N01 , Cn2 , v096 .byte W02 .byte VOICE , 31 .byte PAN , c_v+6 .byte BEND , c_v-37 .byte N06 , Dn1 .byte W01 .byte BEND , c_v-16 .byte W01 .byte c_v+0 .byte W01 .byte c_v+27 .byte W01 .byte c_v+46 .byte W02 .byte VOICE , 23 .byte PAN , c_v-1 .byte N01 , Fn1 , v084 .byte W01 .byte PAN , c_v-10 .byte N01 , Fn2 .byte W01 .byte VOICE , 31 .byte PAN , c_v+0 .byte BEND , c_v-37 .byte N02 , Gn0 , v080 .byte W01 .byte BEND , c_v-16 .byte W01 .byte c_v+0 .byte W02 .byte PAN , c_v+5 .byte BEND , c_v+27 .byte N02 , Gn0 , v072 .byte W01 .byte BEND , c_v+46 .byte W01 .byte VOICE , 23 .byte PAN , c_v+10 .byte N01 , Cn1 , v068 .byte W01 .byte PAN , c_v-9 .byte N01 , Cn2 .byte W01 .byte VOICE , 31 .byte PAN , c_v+0 .byte BEND , c_v-37 .byte N06 , Dn1 , v064 .byte W02 .byte BEND , c_v-16 .byte W01 .byte c_v+0 .byte W01 .byte c_v+27 .byte W01 .byte c_v+46 .byte W01 .byte VOICE , 23 .byte PAN , c_v+5 .byte N01 , Cn1 , v056 .byte W02 .byte PAN , c_v-8 .byte N01 , Cn2 , v052 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_acid_armor: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_acid_armor_pri @ Priority .byte se_m_acid_armor_rev @ Reverb. .word se_m_acid_armor_grp .word se_m_acid_armor_1 .end ================================================ FILE: sound/songs/se_m_attract.s ================================================ .include "MPlayDef.s" .equ se_m_attract_grp, voicegroup128 .equ se_m_attract_pri, 4 .equ se_m_attract_rev, reverb_set+50 .equ se_m_attract_mvl, 127 .equ se_m_attract_key, 0 .equ se_m_attract_tbs, 1 .equ se_m_attract_exg, 0 .equ se_m_attract_cmp, 1 .section .rodata .global se_m_attract .align 2 @********************** Track 1 **********************@ se_m_attract_1: .byte KEYSH , se_m_attract_key+0 .byte TEMPO , 210*se_m_attract_tbs/2 .byte VOICE , 46 .byte VOL , 95*se_m_attract_mvl/mxv .byte BENDR , 2 .byte PAN , c_v+0 .byte BEND , c_v+15 .byte W03 .byte N06 , Cn6 , v116 .byte W03 .byte W03 .byte En6 , v108 .byte W03 .byte W03 .byte Cs5 , v100 .byte W03 .byte W03 .byte Gs5 , v088 .byte W03 .byte W03 .byte PAN , c_v-4 .byte N06 , Cs6 , v080 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , Dn6 , v072 .byte W03 .byte W03 .byte PAN , c_v+4 .byte N06 , Fs6 , v060 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , Ds5 , v052 .byte W03 .byte W03 .byte PAN , c_v-4 .byte N06 , As5 , v040 .byte W03 .byte W03 .byte PAN , c_v+0 .byte W03 .byte W03 .byte c_v+4 .byte W03 .byte W03 .byte c_v+0 .byte FINE @********************** Track 2 **********************@ se_m_attract_2: .byte KEYSH , se_m_attract_key+0 .byte VOICE , 53 .byte BENDR , 2 .byte VOL , 43*se_m_attract_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+15 .byte N06 , Cn5 , v120 .byte W03 .byte W03 .byte Gn5 , v112 .byte W03 .byte W03 .byte Cn6 , v104 .byte W03 .byte W03 .byte Cs6 , v092 .byte W03 .byte W03 .byte Fn6 , v084 .byte W03 .byte W03 .byte Dn5 , v076 .byte W03 .byte W03 .byte An5 , v064 .byte W03 .byte W03 .byte Dn6 , v056 .byte W03 .byte W03 .byte Ds6 , v048 .byte W03 .byte W03 .byte Gn6 , v036 .byte W03 .byte W03 .byte W03 .byte W03 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_attract: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_attract_pri @ Priority .byte se_m_attract_rev @ Reverb. .word se_m_attract_grp .word se_m_attract_1 .word se_m_attract_2 .end ================================================ FILE: sound/songs/se_m_attract2.s ================================================ .include "MPlayDef.s" .equ se_m_attract2_grp, voicegroup128 .equ se_m_attract2_pri, 4 .equ se_m_attract2_rev, reverb_set+50 .equ se_m_attract2_mvl, 127 .equ se_m_attract2_key, 0 .equ se_m_attract2_tbs, 1 .equ se_m_attract2_exg, 0 .equ se_m_attract2_cmp, 1 .section .rodata .global se_m_attract2 .align 2 @********************** Track 1 **********************@ se_m_attract2_1: .byte KEYSH , se_m_attract2_key+0 .byte TEMPO , 150*se_m_attract2_tbs/2 .byte VOICE , 61 .byte BENDR , 44 .byte PAN , c_v+0 .byte VOL , 110*se_m_attract2_mvl/mxv .byte MOD , 30 .byte BEND , c_v+2 .byte N54 , Dn4 , v080 .byte W12 .byte PAN , c_v-4 .byte W12 .byte c_v-10 .byte W12 .byte c_v-4 .byte W12 .byte c_v+0 .byte W06 .byte N54 , Cn4 .byte W06 .byte PAN , c_v+6 .byte W12 .byte c_v+9 .byte W12 .byte c_v+5 .byte W12 .byte c_v+0 .byte W12 .byte c_v-4 .byte N54 , Dn4 .byte W12 .byte PAN , c_v-10 .byte W12 .byte c_v-4 .byte W12 .byte c_v+0 .byte W12 .byte c_v+6 .byte W06 .byte N54 , Cn4 .byte W06 .byte PAN , c_v+9 .byte W12 .byte c_v+5 .byte W12 .byte c_v+0 .byte W12 .byte c_v-4 .byte W12 .byte FINE @********************** Track 2 **********************@ se_m_attract2_2: .byte KEYSH , se_m_attract2_key+0 .byte VOICE , 62 .byte BENDR , 44 .byte VOL , 110*se_m_attract2_mvl/mxv .byte MOD , 30 .byte PAN , c_v+1 .byte BEND , c_v+1 .byte N24 , Dn4 , v040 .byte W24 .byte W02 .byte PAN , c_v+47 .byte N24 , Dn4 , v032 .byte W22 .byte W06 .byte PAN , c_v+0 .byte N24 , Cn4 , v040 .byte W18 .byte W08 .byte PAN , c_v-49 .byte N24 , Cn4 , v032 .byte W16 .byte W12 .byte PAN , c_v+1 .byte N24 , Dn4 , v040 .byte W12 .byte W14 .byte PAN , c_v+47 .byte N24 , Dn4 , v032 .byte W10 .byte W18 .byte PAN , c_v+0 .byte N24 , Cn4 , v040 .byte W06 .byte W20 .byte PAN , c_v-48 .byte N24 , Cn4 , v032 .byte W04 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_attract2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_attract2_pri @ Priority .byte se_m_attract2_rev @ Reverb. .word se_m_attract2_grp .word se_m_attract2_1 .word se_m_attract2_2 .end ================================================ FILE: sound/songs/se_m_barrier.s ================================================ .include "MPlayDef.s" .equ se_m_barrier_grp, voicegroup128 .equ se_m_barrier_pri, 4 .equ se_m_barrier_rev, reverb_set+50 .equ se_m_barrier_mvl, 127 .equ se_m_barrier_key, 0 .equ se_m_barrier_tbs, 1 .equ se_m_barrier_exg, 0 .equ se_m_barrier_cmp, 1 .section .rodata .global se_m_barrier .align 2 @********************** Track 1 **********************@ se_m_barrier_1: .byte KEYSH , se_m_barrier_key+0 .byte TEMPO , 150*se_m_barrier_tbs/2 .byte VOICE , 19 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 95*se_m_barrier_mvl/mxv .byte BEND , c_v+3 .byte N06 , Cn6 , v088 .byte W01 .byte VOL , 88*se_m_barrier_mvl/mxv .byte BEND , c_v-8 .byte W01 .byte PAN , c_v+5 .byte VOL , 56*se_m_barrier_mvl/mxv .byte BEND , c_v-17 .byte W01 .byte PAN , c_v-6 .byte VOL , 24*se_m_barrier_mvl/mxv .byte BEND , c_v-34 .byte W01 .byte PAN , c_v+0 .byte VOL , 11*se_m_barrier_mvl/mxv .byte BEND , c_v-45 .byte W02 .byte VOL , 95*se_m_barrier_mvl/mxv .byte BEND , c_v+0 .byte N06 , Cn6 , v084 .byte W01 .byte VOL , 88*se_m_barrier_mvl/mxv .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+5 .byte VOL , 56*se_m_barrier_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte PAN , c_v-6 .byte VOL , 24*se_m_barrier_mvl/mxv .byte BEND , c_v-37 .byte W01 .byte PAN , c_v+0 .byte VOL , 11*se_m_barrier_mvl/mxv .byte BEND , c_v-47 .byte W02 .byte VOL , 95*se_m_barrier_mvl/mxv .byte BEND , c_v-1 .byte N06 , Cn6 , v076 .byte W01 .byte VOL , 88*se_m_barrier_mvl/mxv .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+5 .byte VOL , 56*se_m_barrier_mvl/mxv .byte BEND , c_v-21 .byte W01 .byte PAN , c_v-6 .byte VOL , 24*se_m_barrier_mvl/mxv .byte BEND , c_v-38 .byte W01 .byte PAN , c_v+0 .byte VOL , 11*se_m_barrier_mvl/mxv .byte BEND , c_v-48 .byte W02 .byte VOL , 95*se_m_barrier_mvl/mxv .byte BEND , c_v-1 .byte N06 , Cn6 , v064 .byte W01 .byte VOL , 88*se_m_barrier_mvl/mxv .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+5 .byte VOL , 56*se_m_barrier_mvl/mxv .byte BEND , c_v-21 .byte W01 .byte PAN , c_v-6 .byte VOL , 24*se_m_barrier_mvl/mxv .byte BEND , c_v-38 .byte W01 .byte PAN , c_v+0 .byte VOL , 11*se_m_barrier_mvl/mxv .byte BEND , c_v-48 .byte W02 .byte VOL , 95*se_m_barrier_mvl/mxv .byte BEND , c_v-2 .byte N06 , Cn6 , v056 .byte W01 .byte PAN , c_v+5 .byte VOL , 88*se_m_barrier_mvl/mxv .byte BEND , c_v-12 .byte W01 .byte PAN , c_v-6 .byte VOL , 56*se_m_barrier_mvl/mxv .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+8 .byte VOL , 24*se_m_barrier_mvl/mxv .byte BEND , c_v-39 .byte W01 .byte PAN , c_v-10 .byte VOL , 11*se_m_barrier_mvl/mxv .byte BEND , c_v-49 .byte W02 .byte PAN , c_v+0 .byte VOL , 95*se_m_barrier_mvl/mxv .byte BEND , c_v-2 .byte N06 , Cn6 , v044 .byte W01 .byte PAN , c_v+5 .byte VOL , 88*se_m_barrier_mvl/mxv .byte BEND , c_v-12 .byte W01 .byte PAN , c_v-6 .byte VOL , 56*se_m_barrier_mvl/mxv .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+8 .byte VOL , 24*se_m_barrier_mvl/mxv .byte BEND , c_v-39 .byte W01 .byte PAN , c_v-10 .byte VOL , 11*se_m_barrier_mvl/mxv .byte BEND , c_v-49 .byte W02 .byte VOL , 95*se_m_barrier_mvl/mxv .byte BEND , c_v-2 .byte N06 , Cn6 , v036 .byte W01 .byte PAN , c_v+5 .byte VOL , 88*se_m_barrier_mvl/mxv .byte BEND , c_v-13 .byte W01 .byte PAN , c_v-6 .byte VOL , 56*se_m_barrier_mvl/mxv .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+8 .byte VOL , 24*se_m_barrier_mvl/mxv .byte BEND , c_v-39 .byte W01 .byte PAN , c_v-10 .byte VOL , 11*se_m_barrier_mvl/mxv .byte BEND , c_v-49 .byte W02 .byte PAN , c_v+0 .byte VOL , 95*se_m_barrier_mvl/mxv .byte BEND , c_v-2 .byte N06 , Cn6 , v028 .byte W01 .byte PAN , c_v+5 .byte VOL , 88*se_m_barrier_mvl/mxv .byte BEND , c_v-13 .byte W01 .byte PAN , c_v-6 .byte VOL , 56*se_m_barrier_mvl/mxv .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+8 .byte VOL , 24*se_m_barrier_mvl/mxv .byte BEND , c_v-39 .byte W01 .byte PAN , c_v-10 .byte VOL , 11*se_m_barrier_mvl/mxv .byte BEND , c_v-49 .byte W02 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_barrier_2: .byte KEYSH , se_m_barrier_key+0 .byte VOICE , 53 .byte PAN , c_v+0 .byte VOL , 95*se_m_barrier_mvl/mxv .byte BEND , c_v-5 .byte W02 .byte N06 , An5 , v064 .byte W02 .byte VOL , 88*se_m_barrier_mvl/mxv .byte W02 .byte 56*se_m_barrier_mvl/mxv .byte W01 .byte 24*se_m_barrier_mvl/mxv .byte W01 .byte 95*se_m_barrier_mvl/mxv .byte N06 , An5 , v056 .byte W02 .byte VOL , 88*se_m_barrier_mvl/mxv .byte W02 se_m_barrier_2_000: .byte VOL , 56*se_m_barrier_mvl/mxv .byte W01 .byte 24*se_m_barrier_mvl/mxv .byte W01 .byte 95*se_m_barrier_mvl/mxv .byte N06 , An5 , v052 .byte W02 .byte VOL , 88*se_m_barrier_mvl/mxv .byte W02 .byte PEND .byte PATT .word se_m_barrier_2_000 .byte VOL , 56*se_m_barrier_mvl/mxv .byte W01 .byte 24*se_m_barrier_mvl/mxv .byte W01 .byte 95*se_m_barrier_mvl/mxv .byte N06 , An5 , v048 .byte W02 .byte VOL , 88*se_m_barrier_mvl/mxv .byte W02 .byte 56*se_m_barrier_mvl/mxv .byte W01 .byte 24*se_m_barrier_mvl/mxv .byte W01 .byte 95*se_m_barrier_mvl/mxv .byte N06 , An5 , v044 .byte W02 .byte VOL , 88*se_m_barrier_mvl/mxv .byte W02 .byte 56*se_m_barrier_mvl/mxv .byte W01 .byte 24*se_m_barrier_mvl/mxv .byte W01 .byte 95*se_m_barrier_mvl/mxv .byte N06 , An5 , v040 .byte W02 .byte VOL , 88*se_m_barrier_mvl/mxv .byte W02 .byte 56*se_m_barrier_mvl/mxv .byte W01 .byte 24*se_m_barrier_mvl/mxv .byte W01 .byte 95*se_m_barrier_mvl/mxv .byte N06 , An5 , v036 .byte W02 .byte VOL , 88*se_m_barrier_mvl/mxv .byte W02 .byte 56*se_m_barrier_mvl/mxv .byte W01 .byte 24*se_m_barrier_mvl/mxv .byte W05 .byte FINE @******************************************************@ .align 2 se_m_barrier: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_barrier_pri @ Priority .byte se_m_barrier_rev @ Reverb. .word se_m_barrier_grp .word se_m_barrier_1 .word se_m_barrier_2 .end ================================================ FILE: sound/songs/se_m_baton_pass.s ================================================ .include "MPlayDef.s" .equ se_m_baton_pass_grp, voicegroup128 .equ se_m_baton_pass_pri, 4 .equ se_m_baton_pass_rev, reverb_set+50 .equ se_m_baton_pass_mvl, 127 .equ se_m_baton_pass_key, 0 .equ se_m_baton_pass_tbs, 1 .equ se_m_baton_pass_exg, 0 .equ se_m_baton_pass_cmp, 1 .section .rodata .global se_m_baton_pass .align 2 @********************** Track 1 **********************@ se_m_baton_pass_1: .byte KEYSH , se_m_baton_pass_key+0 .byte VOICE , 19 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 12*se_m_baton_pass_mvl/mxv .byte BEND , c_v+49 .byte N06 , Gn4 , v080 .byte W01 .byte VOL , 44*se_m_baton_pass_mvl/mxv .byte BEND , c_v+22 .byte W01 .byte VOL , 62*se_m_baton_pass_mvl/mxv .byte PAN , c_v+8 .byte VOL , 75*se_m_baton_pass_mvl/mxv .byte BEND , c_v+20 .byte W01 .byte VOL , 87*se_m_baton_pass_mvl/mxv .byte BEND , c_v+33 .byte W01 .byte VOL , 96*se_m_baton_pass_mvl/mxv .byte PAN , c_v-7 .byte VOL , 100*se_m_baton_pass_mvl/mxv .byte BEND , c_v+54 .byte W01 .byte c_v+63 .byte W01 .byte W02 .byte PAN , c_v+0 .byte N04 , Gn4 , v040 .byte W01 .byte W03 .byte W03 .byte VOICE , 45 .byte MOD , 30 .byte BENDR , 24 .byte VOL , 54*se_m_baton_pass_mvl/mxv .byte BEND , c_v+0 .byte N06 , Gn3 , v108 .byte W01 .byte VOL , 70*se_m_baton_pass_mvl/mxv .byte BEND , c_v+4 .byte W01 .byte PAN , c_v+5 .byte VOL , 80*se_m_baton_pass_mvl/mxv .byte BEND , c_v+9 .byte W01 .byte VOL , 100*se_m_baton_pass_mvl/mxv .byte BEND , c_v+16 .byte W01 .byte c_v+24 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+2 .byte N06 , An3 , v100 .byte W01 .byte BEND , c_v+7 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v+12 .byte W01 .byte c_v+18 .byte W01 .byte c_v+27 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+4 .byte N06 , Bn3 , v060 .byte W01 .byte BEND , c_v+9 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+14 .byte W01 .byte c_v+20 .byte W01 .byte c_v+29 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+6 .byte N06 , Cn4 , v040 .byte W01 .byte BEND , c_v+11 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+15 .byte W01 .byte c_v+22 .byte W01 .byte c_v+31 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+9 .byte N06 , Dn4 , v020 .byte W01 .byte BEND , c_v+14 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v+18 .byte W01 .byte c_v+25 .byte W01 .byte c_v+34 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_baton_pass_2: .byte KEYSH , se_m_baton_pass_key+0 .byte VOICE , 57 .byte VOL , 59*se_m_baton_pass_mvl/mxv .byte N06 , Gs4 , v052 .byte W01 .byte VOL , 72*se_m_baton_pass_mvl/mxv .byte W01 .byte 90*se_m_baton_pass_mvl/mxv .byte W01 .byte 100*se_m_baton_pass_mvl/mxv .byte W03 .byte W02 .byte N04 , Gs4 , v024 .byte W01 .byte W03 .byte W03 .byte W03 .byte W03 .byte W03 .byte W03 .byte W03 .byte W03 .byte W03 .byte W03 .byte W03 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_baton_pass: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_baton_pass_pri @ Priority .byte se_m_baton_pass_rev @ Reverb. .word se_m_baton_pass_grp .word se_m_baton_pass_1 .word se_m_baton_pass_2 .end ================================================ FILE: sound/songs/se_m_belly_drum.s ================================================ .include "MPlayDef.s" .equ se_m_belly_drum_grp, voicegroup128 .equ se_m_belly_drum_pri, 4 .equ se_m_belly_drum_rev, reverb_set+50 .equ se_m_belly_drum_mvl, 127 .equ se_m_belly_drum_key, 0 .equ se_m_belly_drum_tbs, 1 .equ se_m_belly_drum_exg, 0 .equ se_m_belly_drum_cmp, 1 .section .rodata .global se_m_belly_drum .align 2 @********************** Track 1 **********************@ se_m_belly_drum_1: .byte KEYSH , se_m_belly_drum_key+0 .byte TEMPO , 150*se_m_belly_drum_tbs/2 .byte VOICE , 6 .byte BENDR , 12 .byte VOL , 115*se_m_belly_drum_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N19 , An2 , v127 .byte W01 .byte BEND , c_v-6 .byte W01 .byte c_v-10 .byte W01 .byte c_v-14 .byte W01 .byte c_v-12 .byte W02 .byte c_v-14 .byte W01 .byte c_v-18 .byte W01 .byte VOL , 108*se_m_belly_drum_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte c_v-22 .byte W01 .byte VOL , 94*se_m_belly_drum_mvl/mxv .byte W03 .byte 78*se_m_belly_drum_mvl/mxv .byte W01 .byte 62*se_m_belly_drum_mvl/mxv .byte W01 .byte 40*se_m_belly_drum_mvl/mxv .byte W01 .byte 27*se_m_belly_drum_mvl/mxv .byte W02 .byte 12*se_m_belly_drum_mvl/mxv .byte W06 .byte FINE @******************************************************@ .align 2 se_m_belly_drum: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_belly_drum_pri @ Priority .byte se_m_belly_drum_rev @ Reverb. .word se_m_belly_drum_grp .word se_m_belly_drum_1 .end ================================================ FILE: sound/songs/se_m_bite.s ================================================ .include "MPlayDef.s" .equ se_m_bite_grp, voicegroup128 .equ se_m_bite_pri, 4 .equ se_m_bite_rev, reverb_set+50 .equ se_m_bite_mvl, 127 .equ se_m_bite_key, 0 .equ se_m_bite_tbs, 1 .equ se_m_bite_exg, 0 .equ se_m_bite_cmp, 1 .section .rodata .global se_m_bite .align 2 @********************** Track 1 **********************@ se_m_bite_1: .byte KEYSH , se_m_bite_key+0 .byte TEMPO , 220*se_m_bite_tbs/2 .byte VOICE , 26 .byte BENDR , 12 .byte PAN , c_v+6 .byte VOL , 110*se_m_bite_mvl/mxv .byte BEND , c_v+0 .byte N02 , Gn3 , v112 .byte W02 .byte Gs3 .byte W01 .byte PAN , c_v-7 .byte W01 .byte N02 , An3 .byte W02 .byte PAN , c_v+7 .byte W02 .byte c_v-8 .byte W02 .byte VOICE , 21 .byte PAN , c_v+0 .byte N01 , Cn5 , v116 .byte W02 .byte PAN , c_v+10 .byte N01 , Cn4 , v108 .byte W01 .byte PAN , c_v-8 .byte N01 , Gn4 , v104 .byte W01 .byte PAN , c_v+0 .byte N01 , Gn3 , v096 .byte W01 .byte PAN , c_v+10 .byte N01 , Cn4 , v088 .byte W01 .byte PAN , c_v-8 .byte N01 , Cn3 , v080 .byte W02 .byte PAN , c_v+0 .byte N01 , Gn3 , v072 .byte W01 .byte PAN , c_v+10 .byte N01 , Gn2 , v064 .byte W01 .byte PAN , c_v-8 .byte N01 , Cn3 , v056 .byte W01 .byte PAN , c_v+0 .byte N01 , Gn2 , v048 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_bite_2: .byte KEYSH , se_m_bite_key+0 .byte VOICE , 27 .byte VOL , 110*se_m_bite_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte W10 .byte N01 , Gn2 , v040 .byte W08 .byte N01 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_bite: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_bite_pri @ Priority .byte se_m_bite_rev @ Reverb. .word se_m_bite_grp .word se_m_bite_1 .word se_m_bite_2 .end ================================================ FILE: sound/songs/se_m_blizzard.s ================================================ .include "MPlayDef.s" .equ se_m_blizzard_grp, voicegroup128 .equ se_m_blizzard_pri, 4 .equ se_m_blizzard_rev, reverb_set+50 .equ se_m_blizzard_mvl, 127 .equ se_m_blizzard_key, 0 .equ se_m_blizzard_tbs, 1 .equ se_m_blizzard_exg, 0 .equ se_m_blizzard_cmp, 1 .section .rodata .global se_m_blizzard .align 2 @********************** Track 1 **********************@ se_m_blizzard_1: .byte KEYSH , se_m_blizzard_key+0 .byte TEMPO , 150*se_m_blizzard_tbs/2 .byte VOICE , 22 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 64*se_m_blizzard_mvl/mxv .byte BEND , c_v+0 .byte N24 , Gn3 , v108 .byte W03 .byte VOL , 79*se_m_blizzard_mvl/mxv .byte BEND , c_v+22 .byte W02 .byte c_v+8 .byte W01 .byte VOL , 84*se_m_blizzard_mvl/mxv .byte PAN , c_v-4 .byte W03 .byte VOL , 91*se_m_blizzard_mvl/mxv .byte BEND , c_v+0 .byte W03 .byte VOL , 100*se_m_blizzard_mvl/mxv .byte PAN , c_v-8 .byte W03 .byte VOL , 110*se_m_blizzard_mvl/mxv .byte W03 .byte PAN , c_v-12 .byte W06 se_m_blizzard_1_B1: .byte PAN , c_v-17 .byte BEND , c_v+0 .byte N48 , Gn3 , v108 .byte W03 .byte BEND , c_v-7 .byte W03 .byte PAN , c_v-9 .byte BEND , c_v-12 .byte W03 .byte c_v-20 .byte W03 .byte PAN , c_v-3 .byte W03 .byte c_v+6 .byte BEND , c_v-13 .byte W03 .byte PAN , c_v+10 .byte W03 .byte BEND , c_v-6 .byte W03 .byte PAN , c_v+16 .byte W03 .byte BEND , c_v+6 .byte W03 .byte PAN , c_v+13 .byte BEND , c_v+11 .byte W03 .byte c_v+20 .byte W03 .byte PAN , c_v+8 .byte W03 .byte c_v+0 .byte BEND , c_v+12 .byte W03 .byte PAN , c_v-8 .byte BEND , c_v+7 .byte W03 .byte PAN , c_v-11 .byte W03 .byte GOTO .word se_m_blizzard_1_B1 .byte FINE @******************************************************@ .align 2 se_m_blizzard: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_blizzard_pri @ Priority .byte se_m_blizzard_rev @ Reverb. .word se_m_blizzard_grp .word se_m_blizzard_1 .end ================================================ FILE: sound/songs/se_m_blizzard2.s ================================================ .include "MPlayDef.s" .equ se_m_blizzard2_grp, voicegroup128 .equ se_m_blizzard2_pri, 4 .equ se_m_blizzard2_rev, reverb_set+50 .equ se_m_blizzard2_mvl, 127 .equ se_m_blizzard2_key, 0 .equ se_m_blizzard2_tbs, 1 .equ se_m_blizzard2_exg, 0 .equ se_m_blizzard2_cmp, 1 .section .rodata .global se_m_blizzard2 .align 2 @********************** Track 1 **********************@ se_m_blizzard2_1: .byte KEYSH , se_m_blizzard2_key+0 .byte TEMPO , 150*se_m_blizzard2_tbs/2 .byte VOICE , 22 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_blizzard2_mvl/mxv .byte BEND , c_v+0 .byte N24 , Gn3 , v108 .byte W02 .byte PAN , c_v-19 .byte W04 .byte c_v+0 .byte W01 .byte VOL , 97*se_m_blizzard2_mvl/mxv .byte W01 .byte PAN , c_v+16 .byte W01 .byte VOL , 84*se_m_blizzard2_mvl/mxv .byte W03 .byte 76*se_m_blizzard2_mvl/mxv .byte PAN , c_v+2 .byte W02 .byte VOL , 55*se_m_blizzard2_mvl/mxv .byte PAN , c_v-8 .byte W02 .byte VOL , 39*se_m_blizzard2_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte W01 .byte VOL , 25*se_m_blizzard2_mvl/mxv .byte W01 .byte PAN , c_v+8 .byte W01 .byte VOL , 13*se_m_blizzard2_mvl/mxv .byte W03 .byte 7*se_m_blizzard2_mvl/mxv .byte PAN , c_v+0 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_blizzard2: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_blizzard2_pri @ Priority .byte se_m_blizzard2_rev @ Reverb. .word se_m_blizzard2_grp .word se_m_blizzard2_1 .end ================================================ FILE: sound/songs/se_m_bonemerang.s ================================================ .include "MPlayDef.s" .equ se_m_bonemerang_grp, voicegroup128 .equ se_m_bonemerang_pri, 4 .equ se_m_bonemerang_rev, reverb_set+50 .equ se_m_bonemerang_mvl, 127 .equ se_m_bonemerang_key, 0 .equ se_m_bonemerang_tbs, 1 .equ se_m_bonemerang_exg, 0 .equ se_m_bonemerang_cmp, 1 .section .rodata .global se_m_bonemerang .align 2 @********************** Track 1 **********************@ se_m_bonemerang_1: .byte KEYSH , se_m_bonemerang_key+0 .byte TEMPO , 150*se_m_bonemerang_tbs/2 .byte VOICE , 24 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_bonemerang_mvl/mxv .byte BEND , c_v+0 .byte N01 , Cn5 , v127 .byte W01 .byte PAN , c_v+10 .byte N01 , Cn6 .byte W01 .byte PAN , c_v+0 .byte N01 , Cn5 .byte W04 .byte N01 .byte W01 .byte PAN , c_v-11 .byte N01 , Cn6 .byte W01 .byte PAN , c_v+0 .byte N01 , Cn5 .byte W04 .byte FINE @******************************************************@ .align 2 se_m_bonemerang: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_bonemerang_pri @ Priority .byte se_m_bonemerang_rev @ Reverb. .word se_m_bonemerang_grp .word se_m_bonemerang_1 .end ================================================ FILE: sound/songs/se_m_brick_break.s ================================================ .include "MPlayDef.s" .equ se_m_brick_break_grp, voicegroup128 .equ se_m_brick_break_pri, 4 .equ se_m_brick_break_rev, reverb_set+50 .equ se_m_brick_break_mvl, 127 .equ se_m_brick_break_key, 0 .equ se_m_brick_break_tbs, 1 .equ se_m_brick_break_exg, 0 .equ se_m_brick_break_cmp, 1 .section .rodata .global se_m_brick_break .align 2 @********************** Track 1 **********************@ se_m_brick_break_1: .byte KEYSH , se_m_brick_break_key+0 .byte TEMPO , 150*se_m_brick_break_tbs/2 .byte VOICE , 41 .byte VOL , 110*se_m_brick_break_mvl/mxv .byte PAN , c_v+0 .byte N01 , Cn4 , v127 .byte W01 .byte N03 , Cn5 .byte W01 .byte PAN , c_v+5 .byte W01 .byte c_v-6 .byte W01 .byte VOICE , 3 .byte PAN , c_v+0 .byte N01 , Gs4 , v112 .byte W02 .byte W03 .byte PAN , c_v+7 .byte N01 , Dn5 , v096 .byte W03 .byte W02 .byte PAN , c_v+0 .byte N01 , Gs4 , v084 .byte W04 .byte W01 .byte PAN , c_v-8 .byte N01 , Dn5 , v068 .byte W05 .byte PAN , c_v+7 .byte N01 , Gs4 , v052 .byte W04 .byte PAN , c_v-8 .byte N01 , Dn5 , v032 .byte W02 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_brick_break_2: .byte KEYSH , se_m_brick_break_key+0 .byte VOICE , 4 .byte VOL , 110*se_m_brick_break_mvl/mxv .byte PAN , c_v+0 .byte N01 , Cn3 , v064 .byte W01 .byte N03 , Gn3 .byte W05 .byte W01 .byte N02 , En4 , v040 .byte W05 .byte Gn3 .byte W04 .byte En4 , v032 .byte W02 .byte W03 .byte Gn3 .byte W03 .byte W02 .byte En4 , v020 .byte W04 .byte W01 .byte Gn3 .byte W05 .byte FINE @******************************************************@ .align 2 se_m_brick_break: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_brick_break_pri @ Priority .byte se_m_brick_break_rev @ Reverb. .word se_m_brick_break_grp .word se_m_brick_break_1 .word se_m_brick_break_2 .end ================================================ FILE: sound/songs/se_m_bubble.s ================================================ .include "MPlayDef.s" .equ se_m_bubble_grp, voicegroup128 .equ se_m_bubble_pri, 4 .equ se_m_bubble_rev, reverb_set+50 .equ se_m_bubble_mvl, 127 .equ se_m_bubble_key, 0 .equ se_m_bubble_tbs, 1 .equ se_m_bubble_exg, 0 .equ se_m_bubble_cmp, 1 .section .rodata .global se_m_bubble .align 2 @********************** Track 1 **********************@ se_m_bubble_1: .byte KEYSH , se_m_bubble_key+0 .byte TEMPO , 220*se_m_bubble_tbs/2 .byte VOICE , 23 .byte VOL , 95*se_m_bubble_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N09 , Cn3 , v127 .byte W03 .byte PAN , c_v-16 .byte BEND , c_v+6 .byte W01 .byte c_v+16 .byte W02 .byte PAN , c_v+16 .byte BEND , c_v+37 .byte W01 .byte c_v+48 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v-1 .byte N03 , En3 .byte W15 .byte FINE @******************************************************@ .align 2 se_m_bubble: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_bubble_pri @ Priority .byte se_m_bubble_rev @ Reverb. .word se_m_bubble_grp .word se_m_bubble_1 .end ================================================ FILE: sound/songs/se_m_bubble2.s ================================================ .include "MPlayDef.s" .equ se_m_bubble2_grp, voicegroup128 .equ se_m_bubble2_pri, 4 .equ se_m_bubble2_rev, reverb_set+50 .equ se_m_bubble2_mvl, 127 .equ se_m_bubble2_key, 0 .equ se_m_bubble2_tbs, 1 .equ se_m_bubble2_exg, 0 .equ se_m_bubble2_cmp, 1 .section .rodata .global se_m_bubble2 .align 2 @********************** Track 1 **********************@ se_m_bubble2_1: .byte KEYSH , se_m_bubble2_key+0 .byte TEMPO , 220*se_m_bubble2_tbs/2 .byte VOICE , 24 .byte VOL , 110*se_m_bubble2_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte W03 .byte N09 , Gn4 , v127 .byte W02 .byte BEND , c_v+31 .byte W02 .byte c_v-34 .byte W17 .byte FINE @********************** Track 2 **********************@ se_m_bubble2_2: .byte KEYSH , se_m_bubble2_key+0 .byte VOICE , 4 .byte VOL , 110*se_m_bubble2_mvl/mxv .byte PAN , c_v+0 .byte N01 , Cn4 , v044 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_bubble2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_bubble2_pri @ Priority .byte se_m_bubble2_rev @ Reverb. .word se_m_bubble2_grp .word se_m_bubble2_1 .word se_m_bubble2_2 .end ================================================ FILE: sound/songs/se_m_bubble3.s ================================================ .include "MPlayDef.s" .equ se_m_bubble3_grp, voicegroup128 .equ se_m_bubble3_pri, 4 .equ se_m_bubble3_rev, reverb_set+50 .equ se_m_bubble3_mvl, 127 .equ se_m_bubble3_key, 0 .equ se_m_bubble3_tbs, 1 .equ se_m_bubble3_exg, 0 .equ se_m_bubble3_cmp, 1 .section .rodata .global se_m_bubble3 .align 2 @********************** Track 1 **********************@ se_m_bubble3_1: .byte KEYSH , se_m_bubble3_key+0 .byte TEMPO , 220*se_m_bubble3_tbs/2 .byte VOICE , 23 .byte VOL , 95*se_m_bubble3_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N12 , Gn2 , v127 .byte W06 .byte PAN , c_v-17 .byte BEND , c_v+6 .byte W01 .byte c_v+16 .byte W02 .byte PAN , c_v+16 .byte BEND , c_v+25 .byte W01 .byte c_v+31 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v-1 .byte W03 .byte N06 .byte W03 .byte BEND , c_v+6 .byte W01 .byte c_v+13 .byte W05 .byte FINE @******************************************************@ .align 2 se_m_bubble3: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_bubble3_pri @ Priority .byte se_m_bubble3_rev @ Reverb. .word se_m_bubble3_grp .word se_m_bubble3_1 .end ================================================ FILE: sound/songs/se_m_bubble_beam.s ================================================ .include "MPlayDef.s" .equ se_m_bubble_beam_grp, voicegroup128 .equ se_m_bubble_beam_pri, 4 .equ se_m_bubble_beam_rev, reverb_set+50 .equ se_m_bubble_beam_mvl, 127 .equ se_m_bubble_beam_key, 0 .equ se_m_bubble_beam_tbs, 1 .equ se_m_bubble_beam_exg, 0 .equ se_m_bubble_beam_cmp, 1 .section .rodata .global se_m_bubble_beam .align 2 @********************** Track 1 **********************@ se_m_bubble_beam_1: .byte KEYSH , se_m_bubble_beam_key+0 .byte TEMPO , 150*se_m_bubble_beam_tbs/2 .byte VOICE , 9 .byte BENDR , 2 .byte PAN , c_v+0 .byte VOL , 24*se_m_bubble_beam_mvl/mxv .byte BEND , c_v-17 .byte N78 , Bn4 , v080 .byte W01 .byte VOL , 32*se_m_bubble_beam_mvl/mxv .byte PAN , c_v+6 .byte W01 .byte VOL , 38*se_m_bubble_beam_mvl/mxv .byte PAN , c_v-7 .byte W01 .byte VOL , 48*se_m_bubble_beam_mvl/mxv .byte PAN , c_v+9 .byte W01 .byte VOL , 66*se_m_bubble_beam_mvl/mxv .byte PAN , c_v-13 .byte W02 .byte VOL , 78*se_m_bubble_beam_mvl/mxv .byte PAN , c_v+6 .byte W01 .byte VOL , 94*se_m_bubble_beam_mvl/mxv .byte PAN , c_v-6 .byte W01 .byte VOL , 110*se_m_bubble_beam_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte c_v+6 .byte W01 .byte c_v-7 .byte W02 se_m_bubble_beam_1_000: .byte PAN , c_v+9 .byte W01 .byte c_v-13 .byte W01 .byte c_v+6 .byte W01 .byte c_v-6 .byte W01 .byte c_v+0 .byte W02 .byte PEND se_m_bubble_beam_1_001: .byte PAN , c_v+6 .byte W01 .byte c_v-7 .byte W01 .byte c_v+9 .byte W01 .byte c_v-13 .byte W01 .byte c_v+6 .byte W02 .byte PEND .byte c_v-6 .byte W01 .byte c_v+0 .byte W01 .byte c_v+6 .byte W01 .byte c_v-7 .byte W01 .byte c_v+9 .byte W02 .byte c_v-13 .byte W01 .byte c_v+6 .byte W01 .byte c_v-6 .byte W01 .byte c_v+0 .byte W01 .byte c_v+6 .byte W02 .byte c_v-7 .byte W01 .byte c_v+9 .byte W01 .byte c_v-13 .byte W01 .byte c_v+6 .byte W01 .byte c_v-6 .byte W02 .byte c_v+0 .byte W01 .byte c_v+6 .byte W01 .byte c_v-7 .byte W01 .byte c_v+9 .byte W01 .byte c_v-13 .byte W02 .byte c_v+6 .byte W01 .byte c_v-6 .byte W01 .byte c_v+0 .byte W01 .byte c_v+6 .byte W01 .byte c_v-7 .byte W02 .byte PATT .word se_m_bubble_beam_1_000 .byte PATT .word se_m_bubble_beam_1_001 .byte PAN , c_v-6 .byte W01 .byte c_v+0 .byte W01 .byte c_v+6 .byte W01 .byte VOL , 103*se_m_bubble_beam_mvl/mxv .byte PAN , c_v-7 .byte W01 .byte VOL , 91*se_m_bubble_beam_mvl/mxv .byte PAN , c_v+9 .byte W02 .byte VOL , 72*se_m_bubble_beam_mvl/mxv .byte PAN , c_v-13 .byte W01 .byte VOL , 58*se_m_bubble_beam_mvl/mxv .byte PAN , c_v+6 .byte W01 .byte VOL , 38*se_m_bubble_beam_mvl/mxv .byte PAN , c_v-6 .byte W01 .byte VOL , 15*se_m_bubble_beam_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte VOL , 7*se_m_bubble_beam_mvl/mxv .byte PAN , c_v+6 .byte W02 .byte FINE @******************************************************@ .align 2 se_m_bubble_beam: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_bubble_beam_pri @ Priority .byte se_m_bubble_beam_rev @ Reverb. .word se_m_bubble_beam_grp .word se_m_bubble_beam_1 .end ================================================ FILE: sound/songs/se_m_bubble_beam2.s ================================================ .include "MPlayDef.s" .equ se_m_bubble_beam2_grp, voicegroup128 .equ se_m_bubble_beam2_pri, 4 .equ se_m_bubble_beam2_rev, reverb_set+50 .equ se_m_bubble_beam2_mvl, 127 .equ se_m_bubble_beam2_key, 0 .equ se_m_bubble_beam2_tbs, 1 .equ se_m_bubble_beam2_exg, 0 .equ se_m_bubble_beam2_cmp, 1 .section .rodata .global se_m_bubble_beam2 .align 2 @********************** Track 1 **********************@ se_m_bubble_beam2_1: .byte KEYSH , se_m_bubble_beam2_key+0 .byte TEMPO , 150*se_m_bubble_beam2_tbs/2 .byte VOICE , 9 .byte BENDR , 2 .byte PAN , c_v+0 .byte VOL , 26*se_m_bubble_beam2_mvl/mxv .byte BEND , c_v-23 .byte N09 , Dn5 , v127 .byte W01 .byte VOL , 34*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v-20 .byte W01 .byte VOL , 42*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v-7 .byte BEND , c_v-16 .byte W01 .byte VOL , 52*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+9 .byte W01 .byte VOL , 72*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v-13 .byte BEND , c_v-18 .byte W02 .byte VOL , 85*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v-21 .byte W01 .byte VOL , 102*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v-23 .byte W01 .byte VOL , 120*se_m_bubble_beam2_mvl/mxv .byte BEND , c_v-24 .byte W02 .byte VOL , 26*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-23 .byte N09 , Dn5 , v100 .byte W02 .byte VOL , 34*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v-20 .byte W01 .byte VOL , 42*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v-7 .byte BEND , c_v-16 .byte W01 .byte VOL , 52*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+9 .byte W01 .byte VOL , 72*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v-13 .byte BEND , c_v-18 .byte W01 .byte VOL , 85*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v-21 .byte W02 .byte VOL , 102*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v-23 .byte W01 .byte VOL , 120*se_m_bubble_beam2_mvl/mxv .byte BEND , c_v-24 .byte W02 .byte VOL , 26*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-23 .byte N09 , Dn5 , v080 .byte W01 .byte VOL , 34*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v-20 .byte W02 .byte VOL , 42*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v-7 .byte BEND , c_v-16 .byte W01 .byte VOL , 52*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+9 .byte W01 .byte VOL , 72*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v-13 .byte BEND , c_v-18 .byte W01 .byte VOL , 85*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v-21 .byte W01 .byte VOL , 102*se_m_bubble_beam2_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v-23 .byte W02 .byte VOL , 120*se_m_bubble_beam2_mvl/mxv .byte BEND , c_v-24 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_bubble_beam2: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_bubble_beam2_pri @ Priority .byte se_m_bubble_beam2_rev @ Reverb. .word se_m_bubble_beam2_grp .word se_m_bubble_beam2_1 .end ================================================ FILE: sound/songs/se_m_charge.s ================================================ .include "MPlayDef.s" .equ se_m_charge_grp, voicegroup128 .equ se_m_charge_pri, 4 .equ se_m_charge_rev, reverb_set+50 .equ se_m_charge_mvl, 127 .equ se_m_charge_key, 0 .equ se_m_charge_tbs, 1 .equ se_m_charge_exg, 0 .equ se_m_charge_cmp, 1 .section .rodata .global se_m_charge .align 2 @********************** Track 1 **********************@ se_m_charge_1: .byte KEYSH , se_m_charge_key+0 .byte TEMPO , 150*se_m_charge_tbs/2 .byte VOICE , 18 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 34*se_m_charge_mvl/mxv .byte BEND , c_v+0 .byte N66 , Cn5 , v127 .byte W01 .byte PAN , c_v-2 .byte W01 .byte VOL , 43*se_m_charge_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte c_v+2 .byte BEND , c_v-2 .byte W01 .byte VOL , 58*se_m_charge_mvl/mxv .byte PAN , c_v+0 .byte W02 .byte c_v-2 .byte W01 .byte VOL , 70*se_m_charge_mvl/mxv .byte PAN , c_v-4 .byte BEND , c_v-4 .byte W01 .byte PAN , c_v-2 .byte W01 .byte VOL , 76*se_m_charge_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte c_v+2 .byte BEND , c_v-6 .byte W02 .byte VOL , 90*se_m_charge_mvl/mxv .byte PAN , c_v+4 .byte W01 .byte c_v+2 .byte W01 .byte c_v+0 .byte BEND , c_v-8 .byte W01 .byte PAN , c_v+0 .byte W01 .byte c_v-2 .byte W02 .byte c_v+0 .byte BEND , c_v-13 .byte W01 .byte PAN , c_v+2 .byte W01 .byte c_v+0 .byte W01 .byte c_v-2 .byte BEND , c_v-15 .byte W01 .byte PAN , c_v-4 .byte W02 .byte c_v-2 .byte W01 .byte c_v+0 .byte BEND , c_v-19 .byte W01 .byte PAN , c_v+2 .byte W01 .byte c_v+4 .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+2 .byte W02 .byte c_v+0 .byte BEND , c_v-19 .byte W01 .byte PAN , c_v+0 .byte W01 .byte c_v-2 .byte BEND , c_v-17 .byte W01 .byte PAN , c_v+0 .byte W01 .byte c_v+2 .byte W02 .byte c_v+0 .byte BEND , c_v-19 .byte W01 .byte PAN , c_v-2 .byte W01 .byte c_v-4 .byte W01 .byte c_v-2 .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+0 .byte W02 .byte c_v+2 .byte BEND , c_v-28 .byte W01 .byte PAN , c_v+4 .byte BEND , c_v-24 .byte W01 .byte PAN , c_v+2 .byte W01 .byte VOL , 84*se_m_charge_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte c_v+0 .byte W02 .byte c_v-2 .byte W01 .byte VOL , 78*se_m_charge_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte c_v+2 .byte BEND , c_v-27 .byte W01 .byte PAN , c_v+0 .byte W01 .byte VOL , 70*se_m_charge_mvl/mxv .byte PAN , c_v-2 .byte W02 .byte c_v-4 .byte W01 .byte VOL , 55*se_m_charge_mvl/mxv .byte PAN , c_v-2 .byte BEND , c_v-29 .byte W01 .byte PAN , c_v+0 .byte W01 .byte VOL , 46*se_m_charge_mvl/mxv .byte PAN , c_v+2 .byte W01 .byte c_v+4 .byte BEND , c_v-31 .byte W02 .byte VOL , 36*se_m_charge_mvl/mxv .byte PAN , c_v+2 .byte W01 .byte c_v+0 .byte W01 .byte VOL , 24*se_m_charge_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-36 .byte W01 .byte PAN , c_v-2 .byte W01 .byte VOL , 13*se_m_charge_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-42 .byte W02 .byte VOL , 5*se_m_charge_mvl/mxv .byte PAN , c_v+2 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_charge: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_charge_pri @ Priority .byte se_m_charge_rev @ Reverb. .word se_m_charge_grp .word se_m_charge_1 .end ================================================ FILE: sound/songs/se_m_charm.s ================================================ .include "MPlayDef.s" .equ se_m_charm_grp, voicegroup128 .equ se_m_charm_pri, 4 .equ se_m_charm_rev, reverb_set+50 .equ se_m_charm_mvl, 127 .equ se_m_charm_key, 0 .equ se_m_charm_tbs, 1 .equ se_m_charm_exg, 0 .equ se_m_charm_cmp, 1 .section .rodata .global se_m_charm .align 2 @********************** Track 1 **********************@ se_m_charm_1: .byte KEYSH , se_m_charm_key+0 .byte TEMPO , 150*se_m_charm_tbs/2 .byte VOICE , 37 .byte BENDR , 24 .byte PAN , c_v+0 .byte VOL , 25*se_m_charm_mvl/mxv .byte BEND , c_v+11 .byte N02 , Fn4 , v127 .byte W01 .byte VOL , 42*se_m_charm_mvl/mxv .byte PAN , c_v+4 .byte BEND , c_v+5 .byte W01 .byte VOL , 62*se_m_charm_mvl/mxv .byte PAN , c_v-4 .byte BEND , c_v+0 .byte N15 .byte W01 .byte VOL , 77*se_m_charm_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+5 .byte W01 .byte VOL , 84*se_m_charm_mvl/mxv .byte PAN , c_v+4 .byte BEND , c_v+12 .byte W02 .byte VOL , 96*se_m_charm_mvl/mxv .byte PAN , c_v-4 .byte BEND , c_v+20 .byte W01 .byte VOL , 100*se_m_charm_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+25 .byte W01 .byte PAN , c_v+4 .byte BEND , c_v+30 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v+34 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+40 .byte W02 .byte VOL , 94*se_m_charm_mvl/mxv .byte PAN , c_v+4 .byte W01 .byte VOL , 85*se_m_charm_mvl/mxv .byte PAN , c_v-4 .byte BEND , c_v+37 .byte W01 .byte VOL , 66*se_m_charm_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+36 .byte W01 .byte VOL , 49*se_m_charm_mvl/mxv .byte PAN , c_v+4 .byte BEND , c_v+34 .byte W01 .byte VOL , 32*se_m_charm_mvl/mxv .byte PAN , c_v-4 .byte BEND , c_v+32 .byte W02 .byte FINE @******************************************************@ .align 2 se_m_charm: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_charm_pri @ Priority .byte se_m_charm_rev @ Reverb. .word se_m_charm_grp .word se_m_charm_1 .end ================================================ FILE: sound/songs/se_m_confuse_ray.s ================================================ .include "MPlayDef.s" .equ se_m_confuse_ray_grp, voicegroup128 .equ se_m_confuse_ray_pri, 4 .equ se_m_confuse_ray_rev, reverb_set+50 .equ se_m_confuse_ray_mvl, 127 .equ se_m_confuse_ray_key, 0 .equ se_m_confuse_ray_tbs, 1 .equ se_m_confuse_ray_exg, 0 .equ se_m_confuse_ray_cmp, 1 .section .rodata .global se_m_confuse_ray .align 2 @********************** Track 1 **********************@ se_m_confuse_ray_1: .byte KEYSH , se_m_confuse_ray_key+0 .byte TEMPO , 220*se_m_confuse_ray_tbs/2 .byte VOICE , 52 .byte VOL , 127*se_m_confuse_ray_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N03 , As3 , v120 .byte W01 .byte BEND , c_v-8 .byte W01 .byte c_v-16 .byte W01 .byte c_v-1 .byte N12 , As2 , v127 .byte W03 .byte PAN , c_v+4 .byte BEND , c_v+8 .byte W02 .byte PAN , c_v-4 .byte BEND , c_v+11 .byte W01 .byte c_v+18 .byte W01 .byte PAN , c_v+10 .byte BEND , c_v+28 .byte W02 .byte c_v+35 .byte W01 .byte PAN , c_v-10 .byte W02 .byte c_v+0 .byte BEND , c_v+0 .byte N03 , As3 , v108 .byte W01 .byte BEND , c_v-8 .byte W02 .byte c_v-17 .byte W01 .byte c_v-1 .byte N12 , As2 .byte W02 .byte PAN , c_v+4 .byte BEND , c_v+8 .byte W03 .byte PAN , c_v-4 .byte BEND , c_v+11 .byte W01 .byte c_v+18 .byte W01 .byte PAN , c_v+10 .byte BEND , c_v+28 .byte W01 .byte c_v+35 .byte W01 .byte PAN , c_v-10 .byte W03 .byte c_v+0 .byte BEND , c_v+0 .byte N03 , As3 , v072 .byte W01 .byte BEND , c_v-8 .byte W01 .byte c_v-16 .byte W01 .byte c_v-1 .byte N12 , As2 .byte W03 .byte PAN , c_v+4 .byte BEND , c_v+8 .byte W02 .byte PAN , c_v-4 .byte BEND , c_v+11 .byte W01 .byte c_v+18 .byte W02 .byte PAN , c_v+10 .byte BEND , c_v+28 .byte W01 .byte c_v+35 .byte W01 .byte PAN , c_v-10 .byte W04 .byte FINE @******************************************************@ .align 2 se_m_confuse_ray: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_confuse_ray_pri @ Priority .byte se_m_confuse_ray_rev @ Reverb. .word se_m_confuse_ray_grp .word se_m_confuse_ray_1 .end ================================================ FILE: sound/songs/se_m_cosmic_power.s ================================================ .include "MPlayDef.s" .equ se_m_cosmic_power_grp, voicegroup128 .equ se_m_cosmic_power_pri, 4 .equ se_m_cosmic_power_rev, reverb_set+50 .equ se_m_cosmic_power_mvl, 127 .equ se_m_cosmic_power_key, 0 .equ se_m_cosmic_power_tbs, 1 .equ se_m_cosmic_power_exg, 0 .equ se_m_cosmic_power_cmp, 1 .section .rodata .global se_m_cosmic_power .align 2 @********************** Track 1 **********************@ se_m_cosmic_power_1: .byte KEYSH , se_m_cosmic_power_key+0 .byte TEMPO , 150*se_m_cosmic_power_tbs/2 .byte VOICE , 46 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_cosmic_power_mvl/mxv .byte BEND , c_v-4 .byte N09 , As5 , v112 .byte W06 .byte W03 .byte PAN , c_v-5 .byte N08 , Cn5 .byte W03 .byte W06 .byte PAN , c_v-9 .byte N10 , Gn5 .byte W06 .byte W04 .byte PAN , c_v-5 .byte N09 , Fn6 .byte W02 .byte W06 .byte W02 .byte PAN , c_v+0 .byte N09 , An5 .byte W04 .byte W06 .byte PAN , c_v+4 .byte N09 , As5 .byte W06 .byte W03 .byte PAN , c_v+9 .byte N08 , Cn5 , v108 .byte W03 .byte W06 .byte PAN , c_v+4 .byte N10 , Gn5 , v104 .byte W06 .byte W04 .byte PAN , c_v+0 .byte N09 , Fn6 , v096 .byte W02 .byte W06 .byte W02 .byte PAN , c_v-5 .byte N09 , An5 , v092 .byte W04 .byte W04 .byte PAN , c_v-9 .byte W02 .byte N09 , As5 , v084 .byte W06 .byte W03 .byte PAN , c_v-5 .byte N08 , Cn5 , v080 .byte W03 .byte W06 .byte N10 , Gn5 , v072 .byte W01 .byte PAN , c_v+0 .byte W05 .byte W04 .byte c_v+4 .byte N09 , Fn6 , v068 .byte W02 .byte W06 .byte W02 .byte PAN , c_v+9 .byte N09 , An5 , v060 .byte W04 .byte W04 .byte PAN , c_v+4 .byte W02 .byte N09 , As5 , v056 .byte W06 .byte W03 .byte PAN , c_v+0 .byte N08 , Cn5 , v052 .byte W03 .byte W06 .byte N10 , Gn5 , v044 .byte W01 .byte PAN , c_v-5 .byte W05 .byte W03 .byte c_v-9 .byte W01 .byte N09 , Fn6 , v040 .byte W02 .byte W06 .byte W02 .byte PAN , c_v-5 .byte N09 , An5 , v032 .byte W04 .byte W06 .byte PAN , c_v+0 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_cosmic_power_2: .byte KEYSH , se_m_cosmic_power_key+0 .byte VOICE , 53 .byte XCMD , xIECV , 9 .byte xIECL , 8 .byte VOL , 43*se_m_cosmic_power_mvl/mxv .byte BEND , c_v-2 .byte W04 .byte N08 , Fn5 , v112 .byte W02 .byte W06 .byte W01 .byte N10 , Ds5 .byte W05 .byte W06 .byte N09 , As6 .byte W06 .byte W03 .byte Cn6 .byte W03 .byte W06 .byte N10 , Fn5 .byte W06 .byte W04 .byte N08 .byte W02 .byte W06 .byte W01 .byte N10 , Ds5 , v104 .byte W05 .byte W06 .byte N09 , As6 , v100 .byte W06 .byte W03 .byte Cn6 , v092 .byte W03 .byte W06 .byte N10 , Fn5 , v088 .byte W06 .byte W04 .byte N08 , Fn5 , v080 .byte W02 .byte W06 .byte W01 .byte N10 , Ds5 , v076 .byte W05 .byte W06 .byte N09 , As6 , v072 .byte W06 .byte W03 .byte Cn6 , v064 .byte W03 .byte W06 .byte N10 , Fn5 , v060 .byte W06 .byte W04 .byte N08 , Fn5 , v052 .byte W02 .byte W06 .byte W01 .byte N10 , Ds5 , v048 .byte W05 .byte W06 .byte N09 , As6 , v040 .byte W06 .byte W03 .byte Cn6 , v036 .byte W03 .byte W06 .byte N12 , Fn5 , v032 .byte W06 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_cosmic_power: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_cosmic_power_pri @ Priority .byte se_m_cosmic_power_rev @ Reverb. .word se_m_cosmic_power_grp .word se_m_cosmic_power_1 .word se_m_cosmic_power_2 .end ================================================ FILE: sound/songs/se_m_crabhammer.s ================================================ .include "MPlayDef.s" .equ se_m_crabhammer_grp, voicegroup128 .equ se_m_crabhammer_pri, 4 .equ se_m_crabhammer_rev, reverb_set+50 .equ se_m_crabhammer_mvl, 127 .equ se_m_crabhammer_key, 0 .equ se_m_crabhammer_tbs, 1 .equ se_m_crabhammer_exg, 0 .equ se_m_crabhammer_cmp, 1 .section .rodata .global se_m_crabhammer .align 2 @********************** Track 1 **********************@ se_m_crabhammer_1: .byte KEYSH , se_m_crabhammer_key+0 .byte TEMPO , 150*se_m_crabhammer_tbs/2 .byte VOICE , 23 .byte VOL , 100*se_m_crabhammer_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+2 .byte N02 , Dn3 , v127 .byte W01 .byte PAN , c_v-10 .byte BEND , c_v+4 .byte W02 .byte PAN , c_v+8 .byte BEND , c_v+6 .byte N02 , Dn3 , v084 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+9 .byte W02 .byte c_v-1 .byte W02 .byte c_v+32 .byte N02 , Dn3 , v056 .byte W16 .byte FINE @******************************************************@ .align 2 se_m_crabhammer: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_crabhammer_pri @ Priority .byte se_m_crabhammer_rev @ Reverb. .word se_m_crabhammer_grp .word se_m_crabhammer_1 .end ================================================ FILE: sound/songs/se_m_detect.s ================================================ .include "MPlayDef.s" .equ se_m_detect_grp, voicegroup128 .equ se_m_detect_pri, 4 .equ se_m_detect_rev, reverb_set+50 .equ se_m_detect_mvl, 127 .equ se_m_detect_key, 0 .equ se_m_detect_tbs, 1 .equ se_m_detect_exg, 0 .equ se_m_detect_cmp, 1 .section .rodata .global se_m_detect .align 2 @********************** Track 1 **********************@ se_m_detect_1: .byte KEYSH , se_m_detect_key+0 .byte TEMPO , 220*se_m_detect_tbs/2 .byte VOICE , 54 .byte VOL , 100*se_m_detect_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+1 .byte N03 , As5 , v127 .byte W01 .byte PAN , c_v+2 .byte BEND , c_v+2 .byte W01 .byte c_v+4 .byte W01 .byte c_v+1 .byte N06 , Bn5 .byte W01 .byte PAN , c_v+0 .byte W02 .byte W03 .byte BEND , c_v+1 .byte N03 , As5 , v104 .byte W01 .byte PAN , c_v-2 .byte BEND , c_v+2 .byte W02 .byte c_v+4 .byte W01 .byte c_v+1 .byte N06 , Bn5 .byte W01 .byte PAN , c_v+0 .byte W04 .byte W01 .byte BEND , c_v+1 .byte N03 , As5 , v080 .byte W01 .byte PAN , c_v+4 .byte BEND , c_v+2 .byte W01 .byte c_v+4 .byte W01 .byte c_v+1 .byte N06 , Bn5 .byte W02 .byte PAN , c_v+0 .byte W04 .byte BEND , c_v+1 .byte N03 , As5 , v048 .byte W02 .byte PAN , c_v-5 .byte BEND , c_v+2 .byte W01 .byte c_v+4 .byte W01 .byte c_v+1 .byte N06 , Bn5 .byte W01 .byte PAN , c_v+0 .byte W03 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_detect: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_detect_pri @ Priority .byte se_m_detect_rev @ Reverb. .word se_m_detect_grp .word se_m_detect_1 .end ================================================ FILE: sound/songs/se_m_dig.s ================================================ .include "MPlayDef.s" .equ se_m_dig_grp, voicegroup128 .equ se_m_dig_pri, 4 .equ se_m_dig_rev, reverb_set+50 .equ se_m_dig_mvl, 127 .equ se_m_dig_key, 0 .equ se_m_dig_tbs, 1 .equ se_m_dig_exg, 0 .equ se_m_dig_cmp, 1 .section .rodata .global se_m_dig .align 2 @********************** Track 1 **********************@ se_m_dig_1: .byte KEYSH , se_m_dig_key+0 .byte TEMPO , 150*se_m_dig_tbs/2 .byte VOICE , 36 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 115*se_m_dig_mvl/mxv .byte BEND , c_v+0 .byte N01 , Cn2 , v112 .byte W01 .byte VOICE , 26 .byte N02 , Cn3 , v127 .byte W01 .byte PAN , c_v+5 .byte BEND , c_v+4 .byte W01 .byte c_v+16 .byte N03 .byte W01 .byte PAN , c_v-8 .byte BEND , c_v+28 .byte W02 .byte c_v+45 .byte W01 .byte VOICE , 36 .byte PAN , c_v+12 .byte BEND , c_v+0 .byte N02 , Cn3 , v056 .byte W02 .byte W03 .byte PAN , c_v-12 .byte N02 , Cn3 , v036 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_dig: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_dig_pri @ Priority .byte se_m_dig_rev @ Reverb. .word se_m_dig_grp .word se_m_dig_1 .end ================================================ FILE: sound/songs/se_m_dive.s ================================================ .include "MPlayDef.s" .equ se_m_dive_grp, voicegroup128 .equ se_m_dive_pri, 4 .equ se_m_dive_rev, reverb_set+50 .equ se_m_dive_mvl, 127 .equ se_m_dive_key, 0 .equ se_m_dive_tbs, 1 .equ se_m_dive_exg, 0 .equ se_m_dive_cmp, 1 .section .rodata .global se_m_dive .align 2 @********************** Track 1 **********************@ se_m_dive_1: .byte KEYSH , se_m_dive_key+0 .byte TEMPO , 150*se_m_dive_tbs/2 .byte VOICE , 36 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 105*se_m_dive_mvl/mxv .byte BEND , c_v-18 .byte N06 , Fn2 , v127 .byte W03 .byte PAN , c_v+3 .byte BEND , c_v-16 .byte W04 .byte PAN , c_v+6 .byte BEND , c_v-14 .byte N04 .byte W03 .byte PAN , c_v+3 .byte BEND , c_v-11 .byte W02 .byte N36 , Gn3 , v092 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v-8 .byte W04 .byte PAN , c_v-3 .byte BEND , c_v-5 .byte W02 .byte VOL , 100*se_m_dive_mvl/mxv .byte W01 .byte PAN , c_v-6 .byte BEND , c_v-2 .byte W03 .byte VOL , 94*se_m_dive_mvl/mxv .byte W01 .byte PAN , c_v-3 .byte BEND , c_v+1 .byte W02 .byte VOL , 84*se_m_dive_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+4 .byte W04 .byte PAN , c_v+3 .byte VOL , 72*se_m_dive_mvl/mxv .byte BEND , c_v+2 .byte W04 .byte PAN , c_v+6 .byte VOL , 57*se_m_dive_mvl/mxv .byte BEND , c_v-3 .byte W03 .byte PAN , c_v+3 .byte VOL , 37*se_m_dive_mvl/mxv .byte BEND , c_v-7 .byte W03 .byte VOL , 20*se_m_dive_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-11 .byte W01 .byte VOL , 7*se_m_dive_mvl/mxv .byte W02 .byte PAN , c_v-3 .byte BEND , c_v-16 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_dive_2: .byte KEYSH , se_m_dive_key+0 .byte VOICE , 25 .byte VOL , 105*se_m_dive_mvl/mxv .byte N06 , An2 , v040 .byte W06 .byte Gn2 .byte W06 .byte Gs3 , v044 .byte W07 .byte Gs3 , v036 .byte W05 .byte W02 .byte Gs3 , v028 .byte W07 .byte Gs3 , v020 .byte W03 .byte W04 .byte Gs3 , v012 .byte W08 .byte FINE @******************************************************@ .align 2 se_m_dive: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_dive_pri @ Priority .byte se_m_dive_rev @ Reverb. .word se_m_dive_grp .word se_m_dive_1 .word se_m_dive_2 .end ================================================ FILE: sound/songs/se_m_dizzy_punch.s ================================================ .include "MPlayDef.s" .equ se_m_dizzy_punch_grp, voicegroup128 .equ se_m_dizzy_punch_pri, 4 .equ se_m_dizzy_punch_rev, reverb_set+50 .equ se_m_dizzy_punch_mvl, 127 .equ se_m_dizzy_punch_key, 0 .equ se_m_dizzy_punch_tbs, 1 .equ se_m_dizzy_punch_exg, 0 .equ se_m_dizzy_punch_cmp, 1 .section .rodata .global se_m_dizzy_punch .align 2 @********************** Track 1 **********************@ se_m_dizzy_punch_1: .byte KEYSH , se_m_dizzy_punch_key+0 .byte TEMPO , 150*se_m_dizzy_punch_tbs/2 .byte VOICE , 19 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 5*se_m_dizzy_punch_mvl/mxv .byte BEND , c_v+0 .byte N07 , Bn5 , v080 .byte W01 .byte VOL , 55*se_m_dizzy_punch_mvl/mxv .byte PAN , c_v+11 .byte BEND , c_v+3 .byte W01 .byte VOL , 67*se_m_dizzy_punch_mvl/mxv .byte PAN , c_v+22 .byte BEND , c_v+0 .byte W01 .byte VOL , 90*se_m_dizzy_punch_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-6 .byte W01 .byte PAN , c_v-12 .byte BEND , c_v-14 .byte W02 .byte VOL , 4*se_m_dizzy_punch_mvl/mxv .byte PAN , c_v-22 .byte BEND , c_v-23 .byte W01 .byte PAN , c_v-13 .byte BEND , c_v+0 .byte N04 , Cn6 .byte W01 .byte VOL , 66*se_m_dizzy_punch_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+1 .byte W01 .byte VOL , 90*se_m_dizzy_punch_mvl/mxv .byte PAN , c_v+11 .byte BEND , c_v+3 .byte W01 .byte VOL , 4*se_m_dizzy_punch_mvl/mxv .byte PAN , c_v+21 .byte BEND , c_v+5 .byte W14 .byte VOL , 90*se_m_dizzy_punch_mvl/mxv .byte FINE @******************************************************@ .align 2 se_m_dizzy_punch: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_dizzy_punch_pri @ Priority .byte se_m_dizzy_punch_rev @ Reverb. .word se_m_dizzy_punch_grp .word se_m_dizzy_punch_1 .end ================================================ FILE: sound/songs/se_m_double_team.s ================================================ .include "MPlayDef.s" .equ se_m_double_team_grp, voicegroup128 .equ se_m_double_team_pri, 4 .equ se_m_double_team_rev, reverb_set+50 .equ se_m_double_team_mvl, 127 .equ se_m_double_team_key, 0 .equ se_m_double_team_tbs, 1 .equ se_m_double_team_exg, 0 .equ se_m_double_team_cmp, 1 .section .rodata .global se_m_double_team .align 2 @********************** Track 1 **********************@ se_m_double_team_1: .byte KEYSH , se_m_double_team_key+0 .byte TEMPO , 150*se_m_double_team_tbs/2 .byte VOICE , 22 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_double_team_mvl/mxv .byte BEND , c_v-18 .byte N19 , Dn3 , v108 .byte W02 .byte BEND , c_v-7 .byte W01 .byte VOL , 101*se_m_double_team_mvl/mxv .byte W01 .byte PAN , c_v-9 .byte BEND , c_v+8 .byte W02 .byte VOL , 84*se_m_double_team_mvl/mxv .byte BEND , c_v+4 .byte W02 .byte PAN , c_v+0 .byte W01 .byte VOL , 64*se_m_double_team_mvl/mxv .byte BEND , c_v-13 .byte W01 .byte PAN , c_v+8 .byte W02 .byte VOL , 45*se_m_double_team_mvl/mxv .byte BEND , c_v-31 .byte W02 .byte VOL , 32*se_m_double_team_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte VOICE , 2 .byte W01 .byte VOL , 13*se_m_double_team_mvl/mxv .byte BEND , c_v-52 .byte W08 .byte FINE @******************************************************@ .align 2 se_m_double_team: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_double_team_pri @ Priority .byte se_m_double_team_rev @ Reverb. .word se_m_double_team_grp .word se_m_double_team_1 .end ================================================ FILE: sound/songs/se_m_dragon_rage.s ================================================ .include "MPlayDef.s" .equ se_m_dragon_rage_grp, voicegroup128 .equ se_m_dragon_rage_pri, 4 .equ se_m_dragon_rage_rev, reverb_set+50 .equ se_m_dragon_rage_mvl, 127 .equ se_m_dragon_rage_key, 0 .equ se_m_dragon_rage_tbs, 1 .equ se_m_dragon_rage_exg, 0 .equ se_m_dragon_rage_cmp, 1 .section .rodata .global se_m_dragon_rage .align 2 @********************** Track 1 **********************@ se_m_dragon_rage_1: .byte KEYSH , se_m_dragon_rage_key+0 .byte TEMPO , 150*se_m_dragon_rage_tbs/2 .byte VOICE , 29 .byte BENDR , 12 .byte PAN , c_v+5 .byte VOL , 21*se_m_dragon_rage_mvl/mxv .byte BEND , c_v+0 .byte N10 , An2 , v127 .byte W02 .byte VOL , 47*se_m_dragon_rage_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W01 .byte VOL , 88*se_m_dragon_rage_mvl/mxv .byte W02 .byte PAN , c_v-5 .byte W01 .byte VOL , 120*se_m_dragon_rage_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte W01 .byte VOL , 21*se_m_dragon_rage_mvl/mxv .byte BEND , c_v+10 .byte N10 , Bn2 .byte W02 .byte PAN , c_v+5 .byte W01 .byte VOL , 47*se_m_dragon_rage_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte VOL , 88*se_m_dragon_rage_mvl/mxv .byte W03 .byte PAN , c_v-5 .byte VOL , 120*se_m_dragon_rage_mvl/mxv .byte W03 .byte PAN , c_v-2 .byte VOL , 21*se_m_dragon_rage_mvl/mxv .byte BEND , c_v+18 .byte N10 , Cs3 .byte W03 .byte PAN , c_v+5 .byte VOL , 47*se_m_dragon_rage_mvl/mxv .byte W02 .byte 88*se_m_dragon_rage_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W01 .byte VOL , 120*se_m_dragon_rage_mvl/mxv .byte W02 .byte PAN , c_v-5 .byte W02 .byte VOL , 20*se_m_dragon_rage_mvl/mxv .byte BEND , c_v+29 .byte N10 , Dn3 .byte W01 .byte PAN , c_v+0 .byte W01 .byte VOL , 47*se_m_dragon_rage_mvl/mxv .byte W02 .byte PAN , c_v+5 .byte W01 .byte VOL , 88*se_m_dragon_rage_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte VOL , 120*se_m_dragon_rage_mvl/mxv .byte W03 .byte PAN , c_v-5 .byte W01 .byte VOL , 21*se_m_dragon_rage_mvl/mxv .byte BEND , c_v+37 .byte N10 , En3 .byte W02 .byte PAN , c_v-2 .byte VOL , 46*se_m_dragon_rage_mvl/mxv .byte W03 .byte PAN , c_v+5 .byte VOL , 102*se_m_dragon_rage_mvl/mxv .byte W02 .byte 120*se_m_dragon_rage_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W03 .byte c_v-5 .byte VOL , 20*se_m_dragon_rage_mvl/mxv .byte BEND , c_v+42 .byte N20 , Fs3 .byte W02 .byte VOL , 47*se_m_dragon_rage_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W01 .byte VOL , 88*se_m_dragon_rage_mvl/mxv .byte W02 .byte PAN , c_v+5 .byte W01 .byte VOL , 120*se_m_dragon_rage_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte W01 .byte VOL , 99*se_m_dragon_rage_mvl/mxv .byte BEND , c_v+50 .byte W02 .byte PAN , c_v-5 .byte W01 .byte VOL , 74*se_m_dragon_rage_mvl/mxv .byte W01 .byte BEND , c_v+56 .byte W01 .byte PAN , c_v-2 .byte VOL , 53*se_m_dragon_rage_mvl/mxv .byte W03 .byte 34*se_m_dragon_rage_mvl/mxv .byte BEND , c_v+63 .byte W01 .byte VOL , 15*se_m_dragon_rage_mvl/mxv .byte W23 .byte FINE @******************************************************@ .align 2 se_m_dragon_rage: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_dragon_rage_pri @ Priority .byte se_m_dragon_rage_rev @ Reverb. .word se_m_dragon_rage_grp .word se_m_dragon_rage_1 .end ================================================ FILE: sound/songs/se_m_earthquake.s ================================================ .include "MPlayDef.s" .equ se_m_earthquake_grp, voicegroup128 .equ se_m_earthquake_pri, 4 .equ se_m_earthquake_rev, reverb_set+50 .equ se_m_earthquake_mvl, 127 .equ se_m_earthquake_key, 0 .equ se_m_earthquake_tbs, 1 .equ se_m_earthquake_exg, 0 .equ se_m_earthquake_cmp, 1 .section .rodata .global se_m_earthquake .align 2 @********************** Track 1 **********************@ se_m_earthquake_1: .byte KEYSH , se_m_earthquake_key+0 .byte TEMPO , 150*se_m_earthquake_tbs/2 .byte VOICE , 26 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_earthquake_mvl/mxv .byte BEND , c_v+0 .byte N03 , Cs2 , v127 .byte W03 .byte PAN , c_v+6 .byte N03 , Cn2 , v120 .byte W03 .byte W01 .byte PAN , c_v-6 .byte N03 , Bn1 , v116 .byte W03 .byte PAN , c_v+11 .byte N03 , Cn2 , v112 .byte W02 se_m_earthquake_1_000: .byte W02 .byte PAN , c_v-11 .byte N03 , Cs2 , v108 .byte W04 .byte PEND se_m_earthquake_1_001: .byte PAN , c_v+0 .byte N03 , Cn2 , v100 .byte W03 .byte PAN , c_v+6 .byte N03 , Cs2 , v116 .byte W03 .byte PEND se_m_earthquake_1_002: .byte W01 .byte PAN , c_v-6 .byte N03 , Cn2 , v112 .byte W03 .byte PAN , c_v+11 .byte N03 , Cs2 , v108 .byte W02 .byte PEND se_m_earthquake_1_003: .byte W02 .byte PAN , c_v-11 .byte N03 , Cn2 , v100 .byte W04 .byte PEND se_m_earthquake_1_004: .byte PAN , c_v+0 .byte N03 , Cs2 , v116 .byte W03 .byte PAN , c_v+6 .byte N03 , Cn2 , v112 .byte W03 .byte PEND se_m_earthquake_1_005: .byte W01 .byte PAN , c_v-6 .byte N03 , Cs2 , v108 .byte W03 .byte PAN , c_v+11 .byte N03 , Cn2 , v100 .byte W02 .byte PEND se_m_earthquake_1_006: .byte W02 .byte PAN , c_v-11 .byte N03 , Cs2 , v116 .byte W04 .byte PEND .byte PAN , c_v+0 .byte N03 , Cn2 , v112 .byte W03 .byte PAN , c_v+6 .byte N03 , Cs2 , v108 .byte W03 .byte W01 .byte PAN , c_v-6 .byte N03 , Cn2 , v100 .byte W03 .byte PAN , c_v+11 .byte N03 , Cs2 , v116 .byte W02 .byte W02 .byte PAN , c_v-11 .byte N03 , Cn2 , v112 .byte W04 se_m_earthquake_1_007: .byte PAN , c_v+0 .byte N03 , Cs2 , v108 .byte W03 .byte PAN , c_v+6 .byte N03 , Cn2 , v100 .byte W03 .byte PEND se_m_earthquake_1_008: .byte W01 .byte PAN , c_v-6 .byte N03 , Cs2 , v116 .byte W03 .byte PAN , c_v+11 .byte N03 , Cn2 , v112 .byte W02 .byte PEND .byte PATT .word se_m_earthquake_1_000 .byte PATT .word se_m_earthquake_1_001 .byte PATT .word se_m_earthquake_1_002 .byte PATT .word se_m_earthquake_1_003 .byte PATT .word se_m_earthquake_1_007 .byte PATT .word se_m_earthquake_1_008 .byte PATT .word se_m_earthquake_1_000 .byte PATT .word se_m_earthquake_1_001 .byte PATT .word se_m_earthquake_1_002 .byte PATT .word se_m_earthquake_1_003 .byte PATT .word se_m_earthquake_1_004 .byte PATT .word se_m_earthquake_1_005 .byte PATT .word se_m_earthquake_1_006 .byte VOL , 106*se_m_earthquake_mvl/mxv .byte PAN , c_v+0 .byte N03 , Cn2 , v112 .byte W03 .byte VOL , 103*se_m_earthquake_mvl/mxv .byte PAN , c_v+6 .byte N03 , Cs2 , v108 .byte W03 .byte W01 .byte VOL , 97*se_m_earthquake_mvl/mxv .byte PAN , c_v-6 .byte N03 , Cn2 , v100 .byte W03 .byte VOL , 89*se_m_earthquake_mvl/mxv .byte PAN , c_v+11 .byte N03 , Cs2 , v116 .byte W02 .byte W02 .byte VOL , 85*se_m_earthquake_mvl/mxv .byte PAN , c_v-11 .byte N03 , Cn2 , v112 .byte W04 .byte VOL , 78*se_m_earthquake_mvl/mxv .byte PAN , c_v+0 .byte N03 , Cs2 , v108 .byte W03 .byte VOL , 72*se_m_earthquake_mvl/mxv .byte PAN , c_v+6 .byte N03 , Cn2 , v100 .byte W03 .byte W01 .byte VOL , 66*se_m_earthquake_mvl/mxv .byte PAN , c_v-6 .byte N03 , Cs2 , v116 .byte W03 .byte VOL , 58*se_m_earthquake_mvl/mxv .byte PAN , c_v+11 .byte N03 , Cn2 , v112 .byte W02 .byte W02 .byte VOL , 46*se_m_earthquake_mvl/mxv .byte PAN , c_v-11 .byte N03 , Cs2 , v108 .byte W04 .byte VOL , 30*se_m_earthquake_mvl/mxv .byte PAN , c_v+0 .byte N03 , Cn2 , v100 .byte W03 .byte VOL , 12*se_m_earthquake_mvl/mxv .byte PAN , c_v+6 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_earthquake_2: .byte KEYSH , se_m_earthquake_key+0 .byte VOICE , 5 .byte PAN , c_v+0 .byte VOL , 110*se_m_earthquake_mvl/mxv .byte N02 , Fn2 , v072 .byte W02 .byte N01 .byte W01 .byte N02 , Gn2 .byte W03 .byte N01 , Gs2 , v060 .byte W06 .byte VOICE , 27 .byte N06 , Bn1 , v080 .byte W06 se_m_earthquake_2_000: .byte PAN , c_v+0 .byte N06 , Bn1 , v080 .byte W06 .byte PEND .byte N06 .byte W06 .byte N06 .byte W06 .byte PATT .word se_m_earthquake_2_000 .byte N06 , Bn1 , v080 .byte W06 .byte N06 .byte W06 .byte PATT .word se_m_earthquake_2_000 .byte N06 , Bn1 , v080 .byte W06 .byte N06 .byte W06 .byte PATT .word se_m_earthquake_2_000 .byte N06 , Bn1 , v080 .byte W06 .byte N06 .byte W06 .byte PATT .word se_m_earthquake_2_000 .byte N06 , Bn1 , v080 .byte W06 .byte N06 .byte W06 .byte PATT .word se_m_earthquake_2_000 .byte N06 , Bn1 , v080 .byte W06 .byte N06 .byte W06 .byte PATT .word se_m_earthquake_2_000 .byte N06 , Bn1 , v080 .byte W06 .byte N06 .byte W06 .byte PATT .word se_m_earthquake_2_000 .byte N06 , Bn1 , v080 .byte W06 .byte N06 .byte W06 .byte VOL , 106*se_m_earthquake_mvl/mxv .byte PAN , c_v+0 .byte N06 .byte W03 .byte VOL , 103*se_m_earthquake_mvl/mxv .byte W03 .byte N06 .byte W01 .byte VOL , 97*se_m_earthquake_mvl/mxv .byte W03 .byte 89*se_m_earthquake_mvl/mxv .byte W02 .byte N06 .byte W02 .byte VOL , 85*se_m_earthquake_mvl/mxv .byte W04 .byte 78*se_m_earthquake_mvl/mxv .byte PAN , c_v+0 .byte N06 .byte W03 .byte VOL , 72*se_m_earthquake_mvl/mxv .byte W03 .byte N06 .byte W01 .byte VOL , 66*se_m_earthquake_mvl/mxv .byte W03 .byte 58*se_m_earthquake_mvl/mxv .byte W02 .byte N06 .byte W02 .byte VOL , 46*se_m_earthquake_mvl/mxv .byte W04 .byte 30*se_m_earthquake_mvl/mxv .byte PAN , c_v+0 .byte N06 .byte W03 .byte VOL , 12*se_m_earthquake_mvl/mxv .byte W03 .byte FINE @******************************************************@ .align 2 se_m_earthquake: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_earthquake_pri @ Priority .byte se_m_earthquake_rev @ Reverb. .word se_m_earthquake_grp .word se_m_earthquake_1 .word se_m_earthquake_2 .end ================================================ FILE: sound/songs/se_m_ember.s ================================================ .include "MPlayDef.s" .equ se_m_ember_grp, voicegroup128 .equ se_m_ember_pri, 4 .equ se_m_ember_rev, reverb_set+50 .equ se_m_ember_mvl, 127 .equ se_m_ember_key, 0 .equ se_m_ember_tbs, 1 .equ se_m_ember_exg, 0 .equ se_m_ember_cmp, 1 .section .rodata .global se_m_ember .align 2 @********************** Track 1 **********************@ se_m_ember_1: .byte KEYSH , se_m_ember_key+0 .byte TEMPO , 150*se_m_ember_tbs/2 .byte VOICE , 29 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 61*se_m_ember_mvl/mxv .byte BEND , c_v+8 .byte N10 , Gn3 , v127 .byte W01 .byte VOL , 84*se_m_ember_mvl/mxv .byte W01 .byte 97*se_m_ember_mvl/mxv .byte BEND , c_v+16 .byte W01 .byte VOL , 110*se_m_ember_mvl/mxv .byte W01 .byte BEND , c_v+7 .byte W02 .byte c_v-12 .byte W01 .byte VOL , 89*se_m_ember_mvl/mxv .byte W01 .byte 64*se_m_ember_mvl/mxv .byte BEND , c_v-42 .byte W01 .byte VOL , 34*se_m_ember_mvl/mxv .byte W15 .byte FINE @******************************************************@ .align 2 se_m_ember: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_ember_pri @ Priority .byte se_m_ember_rev @ Reverb. .word se_m_ember_grp .word se_m_ember_1 .end ================================================ FILE: sound/songs/se_m_encore.s ================================================ .include "MPlayDef.s" .equ se_m_encore_grp, voicegroup128 .equ se_m_encore_pri, 4 .equ se_m_encore_rev, reverb_set+50 .equ se_m_encore_mvl, 127 .equ se_m_encore_key, 0 .equ se_m_encore_tbs, 1 .equ se_m_encore_exg, 0 .equ se_m_encore_cmp, 1 .section .rodata .global se_m_encore .align 2 @********************** Track 1 **********************@ se_m_encore_1: .byte KEYSH , se_m_encore_key+0 .byte TEMPO , 150*se_m_encore_tbs/2 .byte VOICE , 59 .byte BENDR , 12 .byte VOL , 110*se_m_encore_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N06 , En3 , v127 .byte W01 .byte PAN , c_v+8 .byte W01 .byte c_v-9 .byte W01 .byte c_v+14 .byte W01 .byte c_v-10 .byte W02 .byte c_v+0 .byte N03 , An3 , v048 .byte W01 .byte PAN , c_v+16 .byte W01 .byte c_v-16 .byte W04 .byte FINE @******************************************************@ .align 2 se_m_encore: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_encore_pri @ Priority .byte se_m_encore_rev @ Reverb. .word se_m_encore_grp .word se_m_encore_1 .end ================================================ FILE: sound/songs/se_m_encore2.s ================================================ .include "MPlayDef.s" .equ se_m_encore2_grp, voicegroup128 .equ se_m_encore2_pri, 4 .equ se_m_encore2_rev, reverb_set+50 .equ se_m_encore2_mvl, 127 .equ se_m_encore2_key, 0 .equ se_m_encore2_tbs, 1 .equ se_m_encore2_exg, 0 .equ se_m_encore2_cmp, 1 .section .rodata .global se_m_encore2 .align 2 @********************** Track 1 **********************@ se_m_encore2_1: .byte KEYSH , se_m_encore2_key+0 .byte TEMPO , 150*se_m_encore2_tbs/2 .byte VOICE , 60 .byte BENDR , 12 .byte VOL , 25*se_m_encore2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte TIE , Cn3 , v127 .byte W01 .byte PAN , c_v+2 .byte W01 .byte c_v+5 .byte W01 .byte VOL , 34*se_m_encore2_mvl/mxv .byte W01 .byte PAN , c_v+2 .byte W02 .byte c_v+0 .byte W01 .byte VOL , 46*se_m_encore2_mvl/mxv .byte PAN , c_v-2 .byte W01 .byte c_v-4 .byte W02 .byte VOL , 56*se_m_encore2_mvl/mxv .byte PAN , c_v-2 .byte W02 .byte c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte c_v+5 .byte W01 .byte VOL , 70*se_m_encore2_mvl/mxv .byte W01 .byte PAN , c_v+2 .byte W02 .byte c_v+0 .byte W01 .byte VOL , 80*se_m_encore2_mvl/mxv .byte PAN , c_v-2 .byte W01 .byte c_v-4 .byte W02 .byte VOL , 88*se_m_encore2_mvl/mxv .byte PAN , c_v-2 .byte W02 .byte c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte VOL , 96*se_m_encore2_mvl/mxv .byte PAN , c_v+5 .byte W02 .byte c_v+2 .byte W02 .byte VOL , 100*se_m_encore2_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte c_v-2 .byte W01 .byte c_v-4 .byte W02 .byte c_v-2 .byte W02 se_m_encore2_1_000: .byte PAN , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte c_v+5 .byte W02 .byte c_v+2 .byte W02 .byte c_v+0 .byte W01 .byte c_v-2 .byte W01 .byte c_v-4 .byte W02 .byte c_v-2 .byte W02 .byte PEND .byte PATT .word se_m_encore2_1_000 .byte PATT .word se_m_encore2_1_000 .byte PATT .word se_m_encore2_1_000 .byte PATT .word se_m_encore2_1_000 .byte PATT .word se_m_encore2_1_000 .byte PATT .word se_m_encore2_1_000 .byte VOL , 96*se_m_encore2_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte c_v+5 .byte W01 .byte VOL , 92*se_m_encore2_mvl/mxv .byte W01 .byte PAN , c_v+2 .byte W02 .byte c_v+0 .byte W01 .byte VOL , 84*se_m_encore2_mvl/mxv .byte PAN , c_v-2 .byte W01 .byte c_v-4 .byte W02 .byte VOL , 72*se_m_encore2_mvl/mxv .byte PAN , c_v-2 .byte W02 .byte c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte VOL , 63*se_m_encore2_mvl/mxv .byte PAN , c_v+5 .byte W02 .byte VOL , 52*se_m_encore2_mvl/mxv .byte PAN , c_v+2 .byte W02 .byte c_v+0 .byte W01 .byte VOL , 37*se_m_encore2_mvl/mxv .byte PAN , c_v-2 .byte W01 .byte c_v-4 .byte W01 .byte VOL , 22*se_m_encore2_mvl/mxv .byte W01 .byte 12*se_m_encore2_mvl/mxv .byte PAN , c_v-2 .byte W02 .byte EOT , Cn3 .byte FINE @******************************************************@ .align 2 se_m_encore2: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_encore2_pri @ Priority .byte se_m_encore2_rev @ Reverb. .word se_m_encore2_grp .word se_m_encore2_1 .end ================================================ FILE: sound/songs/se_m_explosion.s ================================================ .include "MPlayDef.s" .equ se_m_explosion_grp, voicegroup128 .equ se_m_explosion_pri, 4 .equ se_m_explosion_rev, reverb_set+50 .equ se_m_explosion_mvl, 127 .equ se_m_explosion_key, 0 .equ se_m_explosion_tbs, 1 .equ se_m_explosion_exg, 0 .equ se_m_explosion_cmp, 1 .section .rodata .global se_m_explosion .align 2 @********************** Track 1 **********************@ se_m_explosion_1: .byte KEYSH , se_m_explosion_key+0 .byte TEMPO , 150*se_m_explosion_tbs/2 .byte VOICE , 41 .byte VOL , 125*se_m_explosion_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N01 , Ds3 , v127 .byte W01 .byte As2 .byte W02 .byte PAN , c_v-8 .byte N02 , Gn3 .byte W01 .byte PAN , c_v+7 .byte W03 .byte c_v+0 .byte N01 , Ds3 .byte W01 .byte As2 .byte W02 .byte N54 , Fn3 .byte W11 .byte BEND , c_v+3 .byte W03 .byte W02 .byte PAN , c_v+6 .byte BEND , c_v+7 .byte W04 .byte PAN , c_v+0 .byte W01 .byte BEND , c_v+10 .byte W02 .byte PAN , c_v-8 .byte W01 .byte BEND , c_v+16 .byte W03 .byte PAN , c_v+0 .byte W01 .byte BEND , c_v+20 .byte W02 .byte PAN , c_v+7 .byte W02 .byte BEND , c_v+25 .byte W02 .byte PAN , c_v+0 .byte W04 .byte c_v-8 .byte BEND , c_v+20 .byte W03 .byte PAN , c_v+6 .byte W01 .byte BEND , c_v+10 .byte W03 .byte PAN , c_v-8 .byte W02 .byte BEND , c_v+3 .byte W01 .byte PAN , c_v+7 .byte W04 .byte c_v-8 .byte W10 .byte FINE @********************** Track 2 **********************@ se_m_explosion_2: .byte KEYSH , se_m_explosion_key+0 .byte VOICE , 4 .byte VOL , 125*se_m_explosion_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+1 .byte N02 , Cn3 , v052 .byte W01 .byte VOL , 74*se_m_explosion_mvl/mxv .byte W06 .byte 125*se_m_explosion_mvl/mxv .byte N02 .byte W01 .byte VOL , 74*se_m_explosion_mvl/mxv .byte W16 .byte W24 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_explosion: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_explosion_pri @ Priority .byte se_m_explosion_rev @ Reverb. .word se_m_explosion_grp .word se_m_explosion_1 .word se_m_explosion_2 .end ================================================ FILE: sound/songs/se_m_faint_attack.s ================================================ .include "MPlayDef.s" .equ se_m_faint_attack_grp, voicegroup128 .equ se_m_faint_attack_pri, 4 .equ se_m_faint_attack_rev, reverb_set+50 .equ se_m_faint_attack_mvl, 127 .equ se_m_faint_attack_key, 0 .equ se_m_faint_attack_tbs, 1 .equ se_m_faint_attack_exg, 0 .equ se_m_faint_attack_cmp, 1 .section .rodata .global se_m_faint_attack .align 2 @********************** Track 1 **********************@ se_m_faint_attack_1: .byte KEYSH , se_m_faint_attack_key+0 .byte TEMPO , 150*se_m_faint_attack_tbs/2 .byte VOICE , 45 .byte VOL , 100*se_m_faint_attack_mvl/mxv .byte BENDR , 2 .byte PAN , c_v+0 .byte BEND , c_v-5 .byte N06 , Cn3 , v112 .byte W01 .byte BEND , c_v+10 .byte W01 .byte c_v+37 .byte W01 .byte c_v+55 .byte W03 .byte PAN , c_v-9 .byte BEND , c_v-5 .byte N06 , Cs3 , v096 .byte W01 .byte BEND , c_v+10 .byte W01 .byte c_v+37 .byte W01 .byte c_v+55 .byte W03 .byte PAN , c_v+7 .byte BEND , c_v-5 .byte N06 , Dn3 , v080 .byte W01 .byte BEND , c_v+10 .byte W01 .byte c_v+37 .byte W01 .byte c_v+55 .byte W03 .byte PAN , c_v-14 .byte BEND , c_v-5 .byte N06 , Ds3 , v060 .byte W01 .byte BEND , c_v+10 .byte W01 .byte c_v+37 .byte W01 .byte c_v+55 .byte W03 .byte PAN , c_v+14 .byte BEND , c_v-5 .byte N06 , En3 , v040 .byte W01 .byte BEND , c_v+10 .byte W01 .byte c_v+37 .byte W01 .byte c_v+55 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_faint_attack: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_faint_attack_pri @ Priority .byte se_m_faint_attack_rev @ Reverb. .word se_m_faint_attack_grp .word se_m_faint_attack_1 .end ================================================ FILE: sound/songs/se_m_flame_wheel.s ================================================ .include "MPlayDef.s" .equ se_m_flame_wheel_grp, voicegroup128 .equ se_m_flame_wheel_pri, 4 .equ se_m_flame_wheel_rev, reverb_set+50 .equ se_m_flame_wheel_mvl, 127 .equ se_m_flame_wheel_key, 0 .equ se_m_flame_wheel_tbs, 1 .equ se_m_flame_wheel_exg, 0 .equ se_m_flame_wheel_cmp, 1 .section .rodata .global se_m_flame_wheel .align 2 @********************** Track 1 **********************@ se_m_flame_wheel_1: .byte KEYSH , se_m_flame_wheel_key+0 .byte TEMPO , 150*se_m_flame_wheel_tbs/2 .byte VOICE , 29 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 22*se_m_flame_wheel_mvl/mxv .byte BEND , c_v+0 .byte N30 , Dn4 , v127 .byte W01 .byte VOL , 49*se_m_flame_wheel_mvl/mxv .byte W01 .byte 71*se_m_flame_wheel_mvl/mxv .byte W01 .byte 95*se_m_flame_wheel_mvl/mxv .byte BEND , c_v+8 .byte W01 .byte VOL , 110*se_m_flame_wheel_mvl/mxv .byte W02 .byte PAN , c_v+5 .byte BEND , c_v+16 .byte W01 .byte VOL , 95*se_m_flame_wheel_mvl/mxv .byte W02 .byte 88*se_m_flame_wheel_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+7 .byte W01 .byte VOL , 93*se_m_flame_wheel_mvl/mxv .byte W02 .byte 110*se_m_flame_wheel_mvl/mxv .byte PAN , c_v-5 .byte BEND , c_v+0 .byte W02 .byte VOL , 86*se_m_flame_wheel_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-9 .byte W01 .byte VOL , 63*se_m_flame_wheel_mvl/mxv .byte W02 .byte 37*se_m_flame_wheel_mvl/mxv .byte BEND , c_v-24 .byte W03 .byte VOL , 13*se_m_flame_wheel_mvl/mxv .byte BEND , c_v-46 .byte W03 .byte W03 .byte W03 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_flame_wheel_2: .byte KEYSH , se_m_flame_wheel_key+0 .byte VOICE , 27 .byte PAN , c_v+0 .byte VOL , 22*se_m_flame_wheel_mvl/mxv .byte N30 , Gn2 , v032 .byte W01 .byte VOL , 49*se_m_flame_wheel_mvl/mxv .byte W01 .byte 71*se_m_flame_wheel_mvl/mxv .byte W01 .byte 95*se_m_flame_wheel_mvl/mxv .byte W01 .byte 110*se_m_flame_wheel_mvl/mxv .byte W02 .byte W01 .byte 95*se_m_flame_wheel_mvl/mxv .byte W02 .byte 88*se_m_flame_wheel_mvl/mxv .byte W01 .byte 93*se_m_flame_wheel_mvl/mxv .byte W02 .byte 110*se_m_flame_wheel_mvl/mxv .byte W02 .byte 86*se_m_flame_wheel_mvl/mxv .byte W01 .byte W01 .byte 63*se_m_flame_wheel_mvl/mxv .byte W02 .byte 37*se_m_flame_wheel_mvl/mxv .byte W03 .byte 13*se_m_flame_wheel_mvl/mxv .byte W03 .byte W03 .byte W03 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_flame_wheel: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_flame_wheel_pri @ Priority .byte se_m_flame_wheel_rev @ Reverb. .word se_m_flame_wheel_grp .word se_m_flame_wheel_1 .word se_m_flame_wheel_2 .end ================================================ FILE: sound/songs/se_m_flame_wheel2.s ================================================ .include "MPlayDef.s" .equ se_m_flame_wheel2_grp, voicegroup128 .equ se_m_flame_wheel2_pri, 4 .equ se_m_flame_wheel2_rev, reverb_set+50 .equ se_m_flame_wheel2_mvl, 127 .equ se_m_flame_wheel2_key, 0 .equ se_m_flame_wheel2_tbs, 1 .equ se_m_flame_wheel2_exg, 0 .equ se_m_flame_wheel2_cmp, 1 .section .rodata .global se_m_flame_wheel2 .align 2 @********************** Track 1 **********************@ se_m_flame_wheel2_1: .byte KEYSH , se_m_flame_wheel2_key+0 .byte TEMPO , 150*se_m_flame_wheel2_tbs/2 .byte VOICE , 29 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_flame_wheel2_mvl/mxv .byte BEND , c_v+0 .byte N48 , Cn4 , v127 .byte W06 .byte PAN , c_v+4 .byte W03 .byte BEND , c_v+2 .byte W03 .byte PAN , c_v+10 .byte W03 .byte BEND , c_v+5 .byte W03 .byte VOL , 98*se_m_flame_wheel2_mvl/mxv .byte PAN , c_v+4 .byte W03 .byte BEND , c_v+3 .byte W03 .byte VOL , 88*se_m_flame_wheel2_mvl/mxv .byte PAN , c_v+0 .byte W03 .byte BEND , c_v-5 .byte W03 .byte VOL , 68*se_m_flame_wheel2_mvl/mxv .byte PAN , c_v-5 .byte W03 .byte c_v+7 .byte BEND , c_v-9 .byte W03 .byte VOL , 44*se_m_flame_wheel2_mvl/mxv .byte PAN , c_v+0 .byte W03 .byte BEND , c_v-15 .byte W03 .byte VOL , 13*se_m_flame_wheel2_mvl/mxv .byte BEND , c_v-24 .byte W03 .byte c_v-40 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_flame_wheel2_2: .byte KEYSH , se_m_flame_wheel2_key+0 .byte VOICE , 27 .byte PAN , c_v+0 .byte VOL , 110*se_m_flame_wheel2_mvl/mxv .byte N48 , Gn2 , v032 .byte W18 .byte VOL , 98*se_m_flame_wheel2_mvl/mxv .byte W06 .byte 88*se_m_flame_wheel2_mvl/mxv .byte W06 .byte 68*se_m_flame_wheel2_mvl/mxv .byte W06 .byte 44*se_m_flame_wheel2_mvl/mxv .byte W06 .byte 13*se_m_flame_wheel2_mvl/mxv .byte W06 .byte FINE @******************************************************@ .align 2 se_m_flame_wheel2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_flame_wheel2_pri @ Priority .byte se_m_flame_wheel2_rev @ Reverb. .word se_m_flame_wheel2_grp .word se_m_flame_wheel2_1 .word se_m_flame_wheel2_2 .end ================================================ FILE: sound/songs/se_m_flamethrower.s ================================================ .include "MPlayDef.s" .equ se_m_flamethrower_grp, voicegroup128 .equ se_m_flamethrower_pri, 4 .equ se_m_flamethrower_rev, reverb_set+50 .equ se_m_flamethrower_mvl, 127 .equ se_m_flamethrower_key, 0 .equ se_m_flamethrower_tbs, 1 .equ se_m_flamethrower_exg, 0 .equ se_m_flamethrower_cmp, 1 .section .rodata .global se_m_flamethrower .align 2 @********************** Track 1 **********************@ se_m_flamethrower_1: .byte KEYSH , se_m_flamethrower_key+0 .byte TEMPO , 150*se_m_flamethrower_tbs/2 .byte VOICE , 29 .byte BENDR , 12 .byte VOL , 110*se_m_flamethrower_mvl/mxv .byte PAN , c_v+4 .byte BEND , c_v+50 .byte TIE , Cn3 , v127 .byte W01 .byte BEND , c_v+32 .byte W02 .byte PAN , c_v-5 .byte BEND , c_v+16 .byte W02 .byte c_v-8 .byte W02 .byte PAN , c_v+8 .byte BEND , c_v-15 .byte W02 .byte c_v-10 .byte W01 .byte PAN , c_v-9 .byte W02 .byte BEND , c_v+0 .byte W02 .byte PAN , c_v+4 .byte BEND , c_v+2 .byte W04 .byte PAN , c_v-5 .byte BEND , c_v+10 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+16 .byte W03 .byte PAN , c_v+4 .byte W01 .byte BEND , c_v+21 .byte W02 .byte PAN , c_v-5 .byte W04 .byte c_v+8 .byte W03 .byte c_v-9 .byte W04 .byte c_v+4 .byte W04 .byte c_v-5 .byte W03 .byte c_v+0 .byte W03 se_m_flamethrower_1_000: .byte PAN , c_v+4 .byte W03 .byte c_v-5 .byte W04 .byte c_v+8 .byte W03 .byte c_v-9 .byte W04 .byte c_v+4 .byte W04 .byte c_v-5 .byte W03 .byte c_v+0 .byte W03 .byte PEND .byte PATT .word se_m_flamethrower_1_000 .byte PATT .word se_m_flamethrower_1_000 .byte PATT .word se_m_flamethrower_1_000 .byte PAN , c_v+4 .byte W03 .byte c_v-5 .byte W03 .byte VOL , 103*se_m_flamethrower_mvl/mxv .byte W01 .byte PAN , c_v+8 .byte W03 .byte VOL , 96*se_m_flamethrower_mvl/mxv .byte PAN , c_v-9 .byte W04 .byte c_v+4 .byte W02 .byte VOL , 88*se_m_flamethrower_mvl/mxv .byte W02 .byte PAN , c_v-5 .byte W03 .byte c_v+0 .byte W01 .byte VOL , 73*se_m_flamethrower_mvl/mxv .byte W02 .byte PAN , c_v+4 .byte W03 .byte VOL , 62*se_m_flamethrower_mvl/mxv .byte PAN , c_v-5 .byte W04 .byte c_v+8 .byte W01 .byte VOL , 47*se_m_flamethrower_mvl/mxv .byte W02 .byte PAN , c_v-9 .byte W03 .byte VOL , 27*se_m_flamethrower_mvl/mxv .byte W01 .byte PAN , c_v+4 .byte W04 .byte VOL , 10*se_m_flamethrower_mvl/mxv .byte PAN , c_v-5 .byte W03 .byte c_v+0 .byte W03 .byte EOT , Cn3 .byte FINE @********************** Track 2 **********************@ se_m_flamethrower_2: .byte KEYSH , se_m_flamethrower_key+0 .byte VOICE , 27 .byte PAN , c_v+0 .byte VOL , 110*se_m_flamethrower_mvl/mxv .byte N24 , Fn2 , v060 .byte W10 .byte VOL , 99*se_m_flamethrower_mvl/mxv .byte W05 .byte 82*se_m_flamethrower_mvl/mxv .byte W04 .byte 54*se_m_flamethrower_mvl/mxv .byte W02 .byte 25*se_m_flamethrower_mvl/mxv .byte W03 .byte W24 .byte W24 .byte W24 .byte W24 .byte W24 .byte W24 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_flamethrower: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_flamethrower_pri @ Priority .byte se_m_flamethrower_rev @ Reverb. .word se_m_flamethrower_grp .word se_m_flamethrower_1 .word se_m_flamethrower_2 .end ================================================ FILE: sound/songs/se_m_flatter.s ================================================ .include "MPlayDef.s" .equ se_m_flatter_grp, voicegroup128 .equ se_m_flatter_pri, 4 .equ se_m_flatter_rev, reverb_set+50 .equ se_m_flatter_mvl, 127 .equ se_m_flatter_key, 0 .equ se_m_flatter_tbs, 1 .equ se_m_flatter_exg, 0 .equ se_m_flatter_cmp, 1 .section .rodata .global se_m_flatter .align 2 @********************** Track 1 **********************@ se_m_flatter_1: .byte KEYSH , se_m_flatter_key+0 .byte TEMPO , 150*se_m_flatter_tbs/2 .byte VOICE , 41 .byte VOL , 100*se_m_flatter_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N01 , Dn5 , v127 .byte W01 .byte Gn4 .byte W01 .byte N09 , En5 .byte W02 .byte PAN , c_v+6 .byte W02 .byte VOL , 92*se_m_flatter_mvl/mxv .byte PAN , c_v-8 .byte W01 .byte VOL , 83*se_m_flatter_mvl/mxv .byte PAN , c_v+6 .byte W01 .byte VOL , 71*se_m_flatter_mvl/mxv .byte PAN , c_v-8 .byte BEND , c_v-4 .byte W01 .byte VOL , 46*se_m_flatter_mvl/mxv .byte PAN , c_v+11 .byte BEND , c_v-8 .byte W01 .byte VOL , 22*se_m_flatter_mvl/mxv .byte PAN , c_v-12 .byte BEND , c_v-15 .byte W02 .byte FINE @******************************************************@ .align 2 se_m_flatter: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_flatter_pri @ Priority .byte se_m_flatter_rev @ Reverb. .word se_m_flatter_grp .word se_m_flatter_1 .end ================================================ FILE: sound/songs/se_m_giga_drain.s ================================================ .include "MPlayDef.s" .equ se_m_giga_drain_grp, voicegroup128 .equ se_m_giga_drain_pri, 4 .equ se_m_giga_drain_rev, reverb_set+50 .equ se_m_giga_drain_mvl, 127 .equ se_m_giga_drain_key, 0 .equ se_m_giga_drain_tbs, 1 .equ se_m_giga_drain_exg, 0 .equ se_m_giga_drain_cmp, 1 .section .rodata .global se_m_giga_drain .align 2 @********************** Track 1 **********************@ se_m_giga_drain_1: .byte KEYSH , se_m_giga_drain_key+0 .byte TEMPO , 150*se_m_giga_drain_tbs/2 .byte VOICE , 36 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_giga_drain_mvl/mxv .byte BEND , c_v+0 .byte N03 , Gn2 , v127 .byte W02 .byte PAN , c_v+3 .byte BEND , c_v+2 .byte W01 .byte VOICE , 23 .byte N02 , Cn3 , v104 .byte W01 .byte PAN , c_v-3 .byte BEND , c_v+5 .byte W02 .byte VOICE , 36 .byte N02 , Cn2 , v127 .byte W01 .byte PAN , c_v+7 .byte W01 .byte VOICE , 23 .byte BEND , c_v+4 .byte N06 , Cn3 , v104 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+0 .byte W01 .byte c_v-5 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v-12 .byte W01 .byte c_v-23 .byte W01 .byte VOICE , 36 .byte BEND , c_v+0 .byte N03 , An2 , v100 .byte W04 .byte PAN , c_v+5 .byte N03 , Bn2 , v076 .byte W03 .byte PAN , c_v-6 .byte N02 , Cs3 , v040 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_giga_drain: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_giga_drain_pri @ Priority .byte se_m_giga_drain_rev @ Reverb. .word se_m_giga_drain_grp .word se_m_giga_drain_1 .end ================================================ FILE: sound/songs/se_m_grasswhistle.s ================================================ .include "MPlayDef.s" .equ se_m_grasswhistle_grp, voicegroup128 .equ se_m_grasswhistle_pri, 4 .equ se_m_grasswhistle_rev, reverb_set+50 .equ se_m_grasswhistle_mvl, 127 .equ se_m_grasswhistle_key, 0 .equ se_m_grasswhistle_tbs, 1 .equ se_m_grasswhistle_exg, 0 .equ se_m_grasswhistle_cmp, 1 .section .rodata .global se_m_grasswhistle .align 2 @********************** Track 1 **********************@ se_m_grasswhistle_1: .byte KEYSH , se_m_grasswhistle_key+0 .byte TEMPO , 100*se_m_grasswhistle_tbs/2 .byte VOICE , 64 .byte BENDR , 2 .byte LFOS , 40 .byte PAN , c_v+0 .byte VOL , 70*se_m_grasswhistle_mvl/mxv .byte BEND , c_v-16 .byte N21 , Gn5 , v112 .byte W03 .byte BEND , c_v-8 .byte W03 .byte c_v+0 .byte W03 .byte MOD , 10 .byte W03 .byte W09 .byte 0 .byte W03 .byte N09 , An5 .byte W12 .byte En5 .byte W12 .byte BEND , c_v-14 .byte N66 , Gn5 .byte W06 .byte BEND , c_v-8 .byte W06 .byte c_v-4 .byte W06 .byte c_v+0 .byte W06 .byte MOD , 10 .byte W12 .byte W12 .byte W06 .byte VOL , 61*se_m_grasswhistle_mvl/mxv .byte W06 .byte 51*se_m_grasswhistle_mvl/mxv .byte W06 .byte 36*se_m_grasswhistle_mvl/mxv .byte W06 .byte 18*se_m_grasswhistle_mvl/mxv .byte W12 .byte FINE @********************** Track 2 **********************@ se_m_grasswhistle_2: .byte KEYSH , se_m_grasswhistle_key+0 .byte VOICE , 64 .byte BENDR , 2 .byte LFOS , 40 .byte VOL , 70*se_m_grasswhistle_mvl/mxv .byte W12 .byte PAN , c_v+12 .byte BEND , c_v-16 .byte N21 , Gn5 , v072 .byte W03 .byte BEND , c_v-8 .byte W03 .byte c_v+0 .byte W03 .byte MOD , 10 .byte W03 .byte W09 .byte 0 .byte W03 .byte PAN , c_v-12 .byte N09 , An5 .byte W12 .byte PAN , c_v+14 .byte N09 , En5 .byte W12 .byte PAN , c_v-15 .byte BEND , c_v-14 .byte N66 , Gn5 .byte W06 .byte BEND , c_v-8 .byte W06 .byte c_v-4 .byte W06 .byte c_v+0 .byte W06 .byte MOD , 10 .byte W12 .byte W06 .byte VOL , 61*se_m_grasswhistle_mvl/mxv .byte W06 .byte 51*se_m_grasswhistle_mvl/mxv .byte W06 .byte 36*se_m_grasswhistle_mvl/mxv .byte W06 .byte 18*se_m_grasswhistle_mvl/mxv .byte W12 .byte FINE @******************************************************@ .align 2 se_m_grasswhistle: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_grasswhistle_pri @ Priority .byte se_m_grasswhistle_rev @ Reverb. .word se_m_grasswhistle_grp .word se_m_grasswhistle_1 .word se_m_grasswhistle_2 .end ================================================ FILE: sound/songs/se_m_hail.s ================================================ .include "MPlayDef.s" .equ se_m_hail_grp, voicegroup128 .equ se_m_hail_pri, 4 .equ se_m_hail_rev, reverb_set+50 .equ se_m_hail_mvl, 127 .equ se_m_hail_key, 0 .equ se_m_hail_tbs, 1 .equ se_m_hail_exg, 0 .equ se_m_hail_cmp, 1 .section .rodata .global se_m_hail .align 2 @********************** Track 1 **********************@ se_m_hail_1: .byte KEYSH , se_m_hail_key+0 .byte TEMPO , 150*se_m_hail_tbs/2 .byte VOICE , 3 .byte VOL , 100*se_m_hail_mvl/mxv .byte PAN , c_v+0 .byte N01 , Fn4 , v112 .byte W04 .byte PAN , c_v+6 .byte N02 , Ds5 , v040 .byte W02 .byte W02 .byte PAN , c_v-5 .byte N01 , Gn4 , v112 .byte W01 .byte PAN , c_v+0 .byte N01 , Ds5 .byte W03 .byte W01 .byte PAN , c_v+6 .byte N02 , Ds5 , v020 .byte W03 .byte PAN , c_v-5 .byte N01 , Gn4 , v064 .byte W02 .byte PAN , c_v+0 .byte N01 , Ds5 .byte W03 .byte PAN , c_v+11 .byte N02 , Ds5 , v020 .byte W03 .byte W01 .byte PAN , c_v-13 .byte N01 , Gn4 , v064 .byte W01 .byte PAN , c_v+0 .byte N01 , Ds5 .byte W04 .byte FINE @********************** Track 2 **********************@ se_m_hail_2: .byte KEYSH , se_m_hail_key+0 .byte VOICE , 4 .byte VOL , 100*se_m_hail_mvl/mxv .byte PAN , c_v+0 .byte N01 , Dn4 , v040 .byte W04 .byte Bn3 .byte W02 .byte W03 .byte Dn4 .byte W03 .byte W01 .byte Bn3 , v032 .byte W05 .byte Dn4 .byte W03 .byte Bn3 , v012 .byte W03 .byte W02 .byte Dn4 .byte W04 .byte FINE @******************************************************@ .align 2 se_m_hail: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_hail_pri @ Priority .byte se_m_hail_rev @ Reverb. .word se_m_hail_grp .word se_m_hail_1 .word se_m_hail_2 .end ================================================ FILE: sound/songs/se_m_harden.s ================================================ .include "MPlayDef.s" .equ se_m_harden_grp, voicegroup128 .equ se_m_harden_pri, 4 .equ se_m_harden_rev, reverb_set+50 .equ se_m_harden_mvl, 127 .equ se_m_harden_key, 0 .equ se_m_harden_tbs, 1 .equ se_m_harden_exg, 0 .equ se_m_harden_cmp, 1 .section .rodata .global se_m_harden .align 2 @********************** Track 1 **********************@ se_m_harden_1: .byte KEYSH , se_m_harden_key+0 .byte TEMPO , 150*se_m_harden_tbs/2 .byte VOICE , 28 .byte VOL , 100*se_m_harden_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+16 .byte N03 , Gs3 , v080 .byte W01 .byte BEND , c_v+38 .byte W01 .byte c_v+62 .byte W02 .byte N17 , Gs4 , v096 .byte W03 .byte PAN , c_v+6 .byte W02 .byte c_v+0 .byte W03 .byte c_v-8 .byte W02 .byte c_v+0 .byte W02 .byte c_v+6 .byte W03 .byte c_v+0 .byte W05 .byte FINE @********************** Track 2 **********************@ se_m_harden_2: .byte KEYSH , se_m_harden_key+0 .byte VOICE , 4 .byte VOL , 100*se_m_harden_mvl/mxv .byte PAN , c_v+0 .byte N01 , En4 , v060 .byte W04 .byte N17 , Gs4 , v096 .byte W20 .byte FINE @******************************************************@ .align 2 se_m_harden: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_harden_pri @ Priority .byte se_m_harden_rev @ Reverb. .word se_m_harden_grp .word se_m_harden_1 .word se_m_harden_2 .end ================================================ FILE: sound/songs/se_m_haze.s ================================================ .include "MPlayDef.s" .equ se_m_haze_grp, voicegroup128 .equ se_m_haze_pri, 4 .equ se_m_haze_rev, reverb_set+50 .equ se_m_haze_mvl, 127 .equ se_m_haze_key, 0 .equ se_m_haze_tbs, 1 .equ se_m_haze_exg, 0 .equ se_m_haze_cmp, 1 .section .rodata .global se_m_haze .align 2 @********************** Track 1 **********************@ se_m_haze_1: .byte KEYSH , se_m_haze_key+0 .byte TEMPO , 190*se_m_haze_tbs/2 .byte VOICE , 45 .byte BENDR , 8 .byte PAN , c_v-47 .byte VOL , 10*se_m_haze_mvl/mxv .byte MOD , 30 .byte BEND , c_v+1 .byte TIE , As2 , v100 .byte W03 .byte VOL , 14*se_m_haze_mvl/mxv .byte W03 .byte 22*se_m_haze_mvl/mxv .byte PAN , c_v-45 .byte W02 .byte VOL , 31*se_m_haze_mvl/mxv .byte W02 .byte 39*se_m_haze_mvl/mxv .byte W02 .byte PAN , c_v-43 .byte W02 .byte VOL , 45*se_m_haze_mvl/mxv .byte W02 .byte 50*se_m_haze_mvl/mxv .byte W02 .byte PAN , c_v-41 .byte W01 .byte VOL , 61*se_m_haze_mvl/mxv .byte W02 .byte 66*se_m_haze_mvl/mxv .byte W03 .byte PAN , c_v-39 .byte VOL , 73*se_m_haze_mvl/mxv .byte W02 .byte 78*se_m_haze_mvl/mxv .byte W04 .byte 84*se_m_haze_mvl/mxv .byte PAN , c_v-37 .byte W03 .byte VOL , 91*se_m_haze_mvl/mxv .byte W03 .byte 98*se_m_haze_mvl/mxv .byte PAN , c_v-35 .byte W02 .byte VOL , 104*se_m_haze_mvl/mxv .byte W04 .byte 110*se_m_haze_mvl/mxv .byte PAN , c_v-32 .byte W06 .byte c_v-28 .byte W06 .byte c_v-25 .byte VOL , 106*se_m_haze_mvl/mxv .byte W04 .byte 104*se_m_haze_mvl/mxv .byte W02 .byte PAN , c_v-23 .byte W03 .byte VOL , 101*se_m_haze_mvl/mxv .byte W03 .byte PAN , c_v-20 .byte W03 .byte VOL , 97*se_m_haze_mvl/mxv .byte W03 .byte PAN , c_v-17 .byte W02 .byte VOL , 91*se_m_haze_mvl/mxv .byte W04 .byte PAN , c_v-13 .byte W03 .byte VOL , 88*se_m_haze_mvl/mxv .byte W03 .byte PAN , c_v-10 .byte W03 .byte VOL , 81*se_m_haze_mvl/mxv .byte W03 .byte PAN , c_v-7 .byte W04 .byte VOL , 75*se_m_haze_mvl/mxv .byte W02 .byte PAN , c_v-3 .byte W02 .byte VOL , 74*se_m_haze_mvl/mxv .byte W02 .byte 76*se_m_haze_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte W01 .byte VOL , 79*se_m_haze_mvl/mxv .byte W02 .byte 83*se_m_haze_mvl/mxv .byte W03 .byte W01 .byte 86*se_m_haze_mvl/mxv .byte W02 .byte PAN , c_v+2 .byte VOL , 90*se_m_haze_mvl/mxv .byte W03 .byte 95*se_m_haze_mvl/mxv .byte W03 .byte 98*se_m_haze_mvl/mxv .byte W03 .byte PAN , c_v+7 .byte VOL , 102*se_m_haze_mvl/mxv .byte W02 .byte 104*se_m_haze_mvl/mxv .byte W04 .byte PAN , c_v+10 .byte VOL , 110*se_m_haze_mvl/mxv .byte W06 .byte PAN , c_v+14 .byte W06 .byte c_v+16 .byte W02 .byte VOL , 106*se_m_haze_mvl/mxv .byte W04 .byte PAN , c_v+19 .byte W01 .byte VOL , 100*se_m_haze_mvl/mxv .byte W05 .byte PAN , c_v+22 .byte VOL , 94*se_m_haze_mvl/mxv .byte W06 .byte PAN , c_v+25 .byte VOL , 88*se_m_haze_mvl/mxv .byte W04 .byte 83*se_m_haze_mvl/mxv .byte W02 .byte PAN , c_v+27 .byte W06 .byte c_v+29 .byte VOL , 75*se_m_haze_mvl/mxv .byte W06 .byte PAN , c_v+32 .byte VOL , 64*se_m_haze_mvl/mxv .byte W06 .byte PAN , c_v+34 .byte W01 .byte VOL , 55*se_m_haze_mvl/mxv .byte W05 .byte PAN , c_v+38 .byte W01 .byte VOL , 47*se_m_haze_mvl/mxv .byte W05 .byte PAN , c_v+41 .byte W01 .byte VOL , 41*se_m_haze_mvl/mxv .byte W05 .byte PAN , c_v+44 .byte VOL , 32*se_m_haze_mvl/mxv .byte W03 .byte 25*se_m_haze_mvl/mxv .byte W03 .byte PAN , c_v+47 .byte W01 .byte VOL , 12*se_m_haze_mvl/mxv .byte W03 .byte 6*se_m_haze_mvl/mxv .byte W02 .byte EOT .byte FINE @********************** Track 2 **********************@ se_m_haze_2: .byte KEYSH , se_m_haze_key+0 .byte VOICE , 70 .byte BENDR , 8 .byte PAN , c_v+0 .byte VOL , 110*se_m_haze_mvl/mxv .byte BEND , c_v+0 .byte N24 , Fn4 , v020 .byte W06 .byte W06 .byte W06 .byte W06 .byte Fs4 .byte W06 .byte W06 .byte W06 .byte W06 .byte Gn4 .byte W06 .byte W06 .byte W06 .byte W06 .byte Gs4 .byte W06 .byte W06 .byte W06 .byte W06 .byte Gn4 .byte W06 .byte W06 .byte W06 .byte W06 .byte Fs4 .byte W06 .byte W06 .byte W06 .byte W06 .byte Fn4 .byte W06 .byte W06 .byte W06 .byte W06 .byte En4 .byte W06 .byte W06 .byte W06 .byte W06 .byte N18 , Ds4 .byte W06 .byte W06 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_haze: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_haze_pri @ Priority .byte se_m_haze_rev @ Reverb. .word se_m_haze_grp .word se_m_haze_1 .word se_m_haze_2 .end ================================================ FILE: sound/songs/se_m_heal_bell.s ================================================ .include "MPlayDef.s" .equ se_m_heal_bell_grp, voicegroup128 .equ se_m_heal_bell_pri, 4 .equ se_m_heal_bell_rev, reverb_set+50 .equ se_m_heal_bell_mvl, 127 .equ se_m_heal_bell_key, 0 .equ se_m_heal_bell_tbs, 1 .equ se_m_heal_bell_exg, 0 .equ se_m_heal_bell_cmp, 1 .section .rodata .global se_m_heal_bell .align 2 @********************** Track 1 **********************@ se_m_heal_bell_1: .byte KEYSH , se_m_heal_bell_key+0 .byte TEMPO , 150*se_m_heal_bell_tbs/2 .byte VOICE , 51 .byte BENDR , 2 .byte PAN , c_v+0 .byte VOL , 90*se_m_heal_bell_mvl/mxv .byte BEND , c_v+4 .byte N03 , As5 , v100 .byte W01 .byte PAN , c_v-13 .byte W01 .byte c_v+11 .byte W01 .byte c_v+1 .byte N01 , An5 .byte W01 .byte MOD , 7 .byte N18 , Bn5 .byte W02 .byte PAN , c_v+11 .byte W01 .byte MOD , 0 .byte PAN , c_v-14 .byte W01 .byte c_v+11 .byte W01 .byte c_v-13 .byte W01 .byte c_v+11 .byte W02 .byte c_v-14 .byte W01 .byte c_v+11 .byte W01 .byte c_v-13 .byte W01 .byte c_v+11 .byte W01 .byte MOD , 7 .byte PAN , c_v-14 .byte W02 .byte c_v+11 .byte W01 .byte c_v-14 .byte W01 .byte c_v+11 .byte W01 .byte c_v-13 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_heal_bell: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_heal_bell_pri @ Priority .byte se_m_heal_bell_rev @ Reverb. .word se_m_heal_bell_grp .word se_m_heal_bell_1 .end ================================================ FILE: sound/songs/se_m_heat_wave.s ================================================ .include "MPlayDef.s" .equ se_m_heat_wave_grp, voicegroup128 .equ se_m_heat_wave_pri, 4 .equ se_m_heat_wave_rev, reverb_set+50 .equ se_m_heat_wave_mvl, 127 .equ se_m_heat_wave_key, 0 .equ se_m_heat_wave_tbs, 1 .equ se_m_heat_wave_exg, 0 .equ se_m_heat_wave_cmp, 1 .section .rodata .global se_m_heat_wave .align 2 @********************** Track 1 **********************@ se_m_heat_wave_1: .byte KEYSH , se_m_heat_wave_key+0 .byte TEMPO , 150*se_m_heat_wave_tbs/2 .byte VOICE , 29 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 23*se_m_heat_wave_mvl/mxv .byte BEND , c_v+0 .byte TIE , Fn4 , v127 .byte W01 .byte VOL , 51*se_m_heat_wave_mvl/mxv .byte W01 .byte 75*se_m_heat_wave_mvl/mxv .byte W01 .byte 99*se_m_heat_wave_mvl/mxv .byte BEND , c_v+8 .byte W01 .byte VOL , 115*se_m_heat_wave_mvl/mxv .byte W02 .byte PAN , c_v+6 .byte BEND , c_v+16 .byte W01 .byte VOL , 99*se_m_heat_wave_mvl/mxv .byte W02 .byte 92*se_m_heat_wave_mvl/mxv .byte BEND , c_v+7 .byte W01 .byte VOL , 97*se_m_heat_wave_mvl/mxv .byte W02 .byte 105*se_m_heat_wave_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte W03 .byte VOL , 110*se_m_heat_wave_mvl/mxv .byte BEND , c_v-9 .byte W03 .byte PAN , c_v-8 .byte BEND , c_v-24 .byte W03 .byte VOL , 115*se_m_heat_wave_mvl/mxv .byte BEND , c_v-38 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v-41 .byte W04 .byte c_v-45 .byte W02 .byte PAN , c_v+6 .byte W02 .byte BEND , c_v-39 .byte W04 .byte PAN , c_v+0 .byte W03 .byte BEND , c_v-35 .byte W03 .byte PAN , c_v-8 .byte W03 .byte BEND , c_v-30 .byte W03 .byte PAN , c_v+0 .byte W03 .byte BEND , c_v-26 .byte W03 .byte PAN , c_v+6 .byte W01 .byte BEND , c_v-22 .byte W05 .byte PAN , c_v+0 .byte BEND , c_v-18 .byte W04 .byte c_v-13 .byte W02 .byte PAN , c_v-8 .byte W06 .byte c_v+0 .byte W06 .byte c_v+6 .byte W03 .byte BEND , c_v-7 .byte W03 .byte PAN , c_v+0 .byte W04 .byte BEND , c_v-3 .byte W02 .byte PAN , c_v-8 .byte VOL , 113*se_m_heat_wave_mvl/mxv .byte W04 .byte 110*se_m_heat_wave_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte W02 .byte BEND , c_v-7 .byte W02 .byte VOL , 105*se_m_heat_wave_mvl/mxv .byte W02 .byte PAN , c_v+6 .byte W03 .byte VOL , 98*se_m_heat_wave_mvl/mxv .byte BEND , c_v-11 .byte W03 .byte PAN , c_v+0 .byte W01 .byte VOL , 91*se_m_heat_wave_mvl/mxv .byte W03 .byte 81*se_m_heat_wave_mvl/mxv .byte BEND , c_v-15 .byte W02 .byte PAN , c_v-8 .byte W02 .byte VOL , 74*se_m_heat_wave_mvl/mxv .byte W01 .byte BEND , c_v-22 .byte W03 .byte PAN , c_v+0 .byte VOL , 63*se_m_heat_wave_mvl/mxv .byte W01 .byte BEND , c_v-30 .byte W01 .byte VOL , 50*se_m_heat_wave_mvl/mxv .byte W02 .byte 40*se_m_heat_wave_mvl/mxv .byte BEND , c_v-39 .byte W02 .byte PAN , c_v+6 .byte W01 .byte VOL , 28*se_m_heat_wave_mvl/mxv .byte BEND , c_v-52 .byte W02 .byte VOL , 17*se_m_heat_wave_mvl/mxv .byte W03 .byte EOT .byte FINE @********************** Track 2 **********************@ se_m_heat_wave_2: .byte KEYSH , se_m_heat_wave_key+0 .byte VOICE , 27 .byte PAN , c_v+0 .byte VOL , 23*se_m_heat_wave_mvl/mxv .byte N30 , Gn2 , v032 .byte W01 .byte VOL , 51*se_m_heat_wave_mvl/mxv .byte W01 .byte 75*se_m_heat_wave_mvl/mxv .byte W01 .byte 99*se_m_heat_wave_mvl/mxv .byte W01 .byte 115*se_m_heat_wave_mvl/mxv .byte W03 .byte 99*se_m_heat_wave_mvl/mxv .byte W02 .byte 92*se_m_heat_wave_mvl/mxv .byte W01 .byte 97*se_m_heat_wave_mvl/mxv .byte W02 .byte 115*se_m_heat_wave_mvl/mxv .byte W12 .byte PAN , c_v+0 .byte W12 .byte W12 .byte c_v+0 .byte W12 .byte W12 .byte c_v+0 .byte W12 .byte W12 .byte c_v+0 .byte W12 .byte W12 .byte c_v+0 .byte W12 .byte FINE @******************************************************@ .align 2 se_m_heat_wave: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_heat_wave_pri @ Priority .byte se_m_heat_wave_rev @ Reverb. .word se_m_heat_wave_grp .word se_m_heat_wave_1 .word se_m_heat_wave_2 .end ================================================ FILE: sound/songs/se_m_hydro_pump.s ================================================ .include "MPlayDef.s" .equ se_m_hydro_pump_grp, voicegroup128 .equ se_m_hydro_pump_pri, 4 .equ se_m_hydro_pump_rev, reverb_set+50 .equ se_m_hydro_pump_mvl, 127 .equ se_m_hydro_pump_key, 0 .equ se_m_hydro_pump_tbs, 1 .equ se_m_hydro_pump_exg, 0 .equ se_m_hydro_pump_cmp, 1 .section .rodata .global se_m_hydro_pump .align 2 @********************** Track 1 **********************@ se_m_hydro_pump_1: .byte KEYSH , se_m_hydro_pump_key+0 .byte TEMPO , 150*se_m_hydro_pump_tbs/2 .byte VOICE , 36 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 115*se_m_hydro_pump_mvl/mxv .byte BEND , c_v+0 .byte TIE , Gn2 , v127 .byte W06 .byte PAN , c_v-4 .byte W06 .byte c_v-10 .byte W06 .byte c_v-5 .byte W06 .byte c_v+0 .byte W06 .byte c_v+4 .byte W06 .byte c_v+11 .byte W06 .byte c_v+4 .byte W06 .byte c_v+0 .byte W06 .byte c_v-4 .byte W06 .byte c_v-10 .byte W06 .byte c_v-5 .byte W06 .byte c_v+0 .byte W06 .byte c_v+4 .byte W06 .byte c_v+11 .byte W02 .byte VOL , 103*se_m_hydro_pump_mvl/mxv .byte W04 .byte PAN , c_v+4 .byte W01 .byte VOL , 85*se_m_hydro_pump_mvl/mxv .byte W05 .byte PAN , c_v+0 .byte W01 .byte VOL , 71*se_m_hydro_pump_mvl/mxv .byte W05 .byte 52*se_m_hydro_pump_mvl/mxv .byte PAN , c_v-4 .byte W04 .byte VOL , 32*se_m_hydro_pump_mvl/mxv .byte W02 .byte PAN , c_v-10 .byte W03 .byte VOL , 11*se_m_hydro_pump_mvl/mxv .byte W03 .byte PAN , c_v-5 .byte W01 .byte VOL , 6*se_m_hydro_pump_mvl/mxv .byte W05 .byte EOT .byte FINE @********************** Track 2 **********************@ se_m_hydro_pump_2: .byte KEYSH , se_m_hydro_pump_key+0 .byte VOL , 58*se_m_hydro_pump_mvl/mxv .byte N14 , Gn3 , v080 .byte W01 .byte VOICE , 25 .byte VOL , 76*se_m_hydro_pump_mvl/mxv .byte W01 .byte 89*se_m_hydro_pump_mvl/mxv .byte W01 .byte 100*se_m_hydro_pump_mvl/mxv .byte W01 .byte 115*se_m_hydro_pump_mvl/mxv .byte W06 .byte 90*se_m_hydro_pump_mvl/mxv .byte W02 .byte 76*se_m_hydro_pump_mvl/mxv .byte W01 .byte 58*se_m_hydro_pump_mvl/mxv .byte W11 .byte W24 .byte W24 .byte W24 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_hydro_pump: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_hydro_pump_pri @ Priority .byte se_m_hydro_pump_rev @ Reverb. .word se_m_hydro_pump_grp .word se_m_hydro_pump_1 .word se_m_hydro_pump_2 .end ================================================ FILE: sound/songs/se_m_hyper_beam.s ================================================ .include "MPlayDef.s" .equ se_m_hyper_beam_grp, voicegroup128 .equ se_m_hyper_beam_pri, 4 .equ se_m_hyper_beam_rev, reverb_set+50 .equ se_m_hyper_beam_mvl, 127 .equ se_m_hyper_beam_key, 0 .equ se_m_hyper_beam_tbs, 1 .equ se_m_hyper_beam_exg, 0 .equ se_m_hyper_beam_cmp, 1 .section .rodata .global se_m_hyper_beam .align 2 @********************** Track 1 **********************@ se_m_hyper_beam_1: .byte KEYSH , se_m_hyper_beam_key+0 .byte TEMPO , 150*se_m_hyper_beam_tbs/2 .byte VOICE , 18 .byte VOL , 110*se_m_hyper_beam_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , En3 , v127 .byte W03 .byte N01 , As3 .byte W03 .byte N02 , Gn3 .byte W03 .byte N01 , Cs4 .byte W03 .byte PAN , c_v+7 .byte N02 , En3 , v072 .byte W03 .byte N01 , As3 .byte W03 .byte PAN , c_v-7 .byte N02 , Gn3 , v040 .byte W03 .byte N01 , Cs4 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_hyper_beam_2: .byte KEYSH , se_m_hyper_beam_key+0 .byte VOICE , 5 .byte VOL , 110*se_m_hyper_beam_mvl/mxv .byte N01 , Cn3 , v040 .byte W02 .byte N01 .byte W04 .byte N01 .byte W02 .byte N01 .byte W04 se_m_hyper_beam_2_000: .byte N01 , Cn3 , v020 .byte W02 .byte N01 .byte W04 .byte PEND .byte PATT .word se_m_hyper_beam_2_000 .byte FINE @******************************************************@ .align 2 se_m_hyper_beam: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_hyper_beam_pri @ Priority .byte se_m_hyper_beam_rev @ Reverb. .word se_m_hyper_beam_grp .word se_m_hyper_beam_1 .word se_m_hyper_beam_2 .end ================================================ FILE: sound/songs/se_m_hyper_beam2.s ================================================ .include "MPlayDef.s" .equ se_m_hyper_beam2_grp, voicegroup128 .equ se_m_hyper_beam2_pri, 4 .equ se_m_hyper_beam2_rev, reverb_set+50 .equ se_m_hyper_beam2_mvl, 127 .equ se_m_hyper_beam2_key, 0 .equ se_m_hyper_beam2_tbs, 1 .equ se_m_hyper_beam2_exg, 0 .equ se_m_hyper_beam2_cmp, 1 .section .rodata .global se_m_hyper_beam2 .align 2 @********************** Track 1 **********************@ se_m_hyper_beam2_1: .byte KEYSH , se_m_hyper_beam2_key+0 .byte TEMPO , 150*se_m_hyper_beam2_tbs/2 .byte VOICE , 45 .byte VOL , 110*se_m_hyper_beam2_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N03 , Gn3 , v092 .byte W01 .byte BEND , c_v+11 .byte W01 .byte c_v+28 .byte W01 .byte c_v+0 .byte N02 , Cs4 .byte W01 .byte BEND , c_v+30 .byte W02 .byte c_v+0 .byte N03 , As3 .byte W01 .byte BEND , c_v+11 .byte W01 .byte c_v+28 .byte W01 .byte c_v+0 .byte N02 , En4 .byte W01 .byte BEND , c_v+30 .byte W02 .byte PAN , c_v+7 .byte BEND , c_v+0 .byte N03 , Gn3 , v040 .byte W01 .byte BEND , c_v+11 .byte W01 .byte c_v+28 .byte W01 .byte c_v+0 .byte N02 , Cs4 .byte W01 .byte BEND , c_v+30 .byte W02 .byte PAN , c_v-7 .byte BEND , c_v+0 .byte N03 , As3 , v016 .byte W01 .byte BEND , c_v+11 .byte W01 .byte c_v+28 .byte W01 .byte c_v+0 .byte N02 , En4 .byte W01 .byte BEND , c_v+30 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_hyper_beam2_2: .byte KEYSH , se_m_hyper_beam2_key+0 .byte VOICE , 5 .byte VOL , 110*se_m_hyper_beam2_mvl/mxv .byte N01 , Cn3 , v032 .byte W02 .byte N01 .byte W04 .byte N01 .byte W02 .byte N01 .byte W04 se_m_hyper_beam2_2_000: .byte N01 , Cn3 , v020 .byte W02 .byte N01 .byte W04 .byte PEND .byte PATT .word se_m_hyper_beam2_2_000 .byte FINE @******************************************************@ .align 2 se_m_hyper_beam2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_hyper_beam2_pri @ Priority .byte se_m_hyper_beam2_rev @ Reverb. .word se_m_hyper_beam2_grp .word se_m_hyper_beam2_1 .word se_m_hyper_beam2_2 .end ================================================ FILE: sound/songs/se_m_icy_wind.s ================================================ .include "MPlayDef.s" .equ se_m_icy_wind_grp, voicegroup128 .equ se_m_icy_wind_pri, 4 .equ se_m_icy_wind_rev, reverb_set+50 .equ se_m_icy_wind_mvl, 127 .equ se_m_icy_wind_key, 0 .equ se_m_icy_wind_tbs, 1 .equ se_m_icy_wind_exg, 0 .equ se_m_icy_wind_cmp, 1 .section .rodata .global se_m_icy_wind .align 2 @********************** Track 1 **********************@ se_m_icy_wind_1: .byte KEYSH , se_m_icy_wind_key+0 .byte TEMPO , 150*se_m_icy_wind_tbs/2 .byte VOICE , 3 .byte VOL , 100*se_m_icy_wind_mvl/mxv .byte PAN , c_v+0 .byte N01 , Ds4 , v112 .byte W04 .byte PAN , c_v+6 .byte N01 , Bn4 , v040 .byte W04 .byte PAN , c_v-5 .byte N01 , Ds4 , v112 .byte W01 .byte PAN , c_v+0 .byte N01 , Bn4 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_icy_wind_2: .byte KEYSH , se_m_icy_wind_key+0 .byte VOICE , 5 .byte VOL , 100*se_m_icy_wind_mvl/mxv .byte PAN , c_v+0 .byte N01 , Dn4 , v040 .byte W04 .byte Bn3 .byte W02 .byte PAN , c_v-7 .byte W02 .byte c_v+9 .byte W01 .byte N01 , Dn4 .byte W01 .byte PAN , c_v-7 .byte W02 .byte FINE @******************************************************@ .align 2 se_m_icy_wind: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_icy_wind_pri @ Priority .byte se_m_icy_wind_rev @ Reverb. .word se_m_icy_wind_grp .word se_m_icy_wind_1 .word se_m_icy_wind_2 .end ================================================ FILE: sound/songs/se_m_lick.s ================================================ .include "MPlayDef.s" .equ se_m_lick_grp, voicegroup128 .equ se_m_lick_pri, 4 .equ se_m_lick_rev, reverb_set+50 .equ se_m_lick_mvl, 127 .equ se_m_lick_key, 0 .equ se_m_lick_tbs, 1 .equ se_m_lick_exg, 0 .equ se_m_lick_cmp, 1 .section .rodata .global se_m_lick .align 2 @********************** Track 1 **********************@ se_m_lick_1: .byte KEYSH , se_m_lick_key+0 .byte TEMPO , 150*se_m_lick_tbs/2 .byte VOICE , 31 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_lick_mvl/mxv .byte BEND , c_v-5 .byte N32 , Cn3 , v127 .byte W01 .byte PAN , c_v+4 .byte BEND , c_v-9 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-13 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v-20 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-25 .byte W02 .byte PAN , c_v+4 .byte BEND , c_v-39 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-6 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v-3 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+6 .byte W01 .byte PAN , c_v+4 .byte BEND , c_v+3 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+9 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v+6 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte W01 .byte PAN , c_v+4 .byte BEND , c_v+8 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+16 .byte W02 .byte PAN , c_v-4 .byte VOL , 102*se_m_lick_mvl/mxv .byte BEND , c_v+12 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+16 .byte W01 .byte PAN , c_v+4 .byte VOL , 97*se_m_lick_mvl/mxv .byte BEND , c_v+18 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+14 .byte W01 .byte PAN , c_v-4 .byte VOL , 92*se_m_lick_mvl/mxv .byte BEND , c_v+18 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+20 .byte W01 .byte PAN , c_v+4 .byte VOL , 88*se_m_lick_mvl/mxv .byte BEND , c_v+17 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte W01 .byte PAN , c_v-4 .byte VOL , 81*se_m_lick_mvl/mxv .byte BEND , c_v+16 .byte W01 .byte PAN , c_v+0 .byte VOL , 64*se_m_lick_mvl/mxv .byte BEND , c_v+12 .byte W02 .byte PAN , c_v+4 .byte VOL , 49*se_m_lick_mvl/mxv .byte BEND , c_v+14 .byte W01 .byte PAN , c_v+0 .byte VOL , 25*se_m_lick_mvl/mxv .byte BEND , c_v+11 .byte W05 .byte FINE @******************************************************@ .align 2 se_m_lick: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_lick_pri @ Priority .byte se_m_lick_rev @ Reverb. .word se_m_lick_grp .word se_m_lick_1 .end ================================================ FILE: sound/songs/se_m_lock_on.s ================================================ .include "MPlayDef.s" .equ se_m_lock_on_grp, voicegroup128 .equ se_m_lock_on_pri, 4 .equ se_m_lock_on_rev, reverb_set+50 .equ se_m_lock_on_mvl, 127 .equ se_m_lock_on_key, 0 .equ se_m_lock_on_tbs, 1 .equ se_m_lock_on_exg, 0 .equ se_m_lock_on_cmp, 1 .section .rodata .global se_m_lock_on .align 2 @********************** Track 1 **********************@ se_m_lock_on_1: .byte KEYSH , se_m_lock_on_key+0 .byte TEMPO , 150*se_m_lock_on_tbs/2 .byte VOICE , 40 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_lock_on_mvl/mxv .byte BEND , c_v+0 .byte N01 , Cn4 , v100 .byte W01 .byte Gn3 , v064 .byte W01 .byte N03 , Bn3 , v100 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+6 .byte W01 .byte PAN , c_v-5 .byte BEND , c_v-6 .byte W02 .byte PAN , c_v+6 .byte BEND , c_v+6 .byte N01 , Cn4 .byte W01 .byte Gn3 , v064 .byte W02 .byte PAN , c_v-5 .byte BEND , c_v-6 .byte N01 , Bn3 , v100 .byte W01 .byte Gn3 , v064 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N06 , Bn3 , v100 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_lock_on: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_lock_on_pri @ Priority .byte se_m_lock_on_rev @ Reverb. .word se_m_lock_on_grp .word se_m_lock_on_1 .end ================================================ FILE: sound/songs/se_m_metronome.s ================================================ .include "MPlayDef.s" .equ se_m_metronome_grp, voicegroup128 .equ se_m_metronome_pri, 4 .equ se_m_metronome_rev, reverb_set+50 .equ se_m_metronome_mvl, 127 .equ se_m_metronome_key, 0 .equ se_m_metronome_tbs, 1 .equ se_m_metronome_exg, 0 .equ se_m_metronome_cmp, 1 .section .rodata .global se_m_metronome .align 2 @********************** Track 1 **********************@ se_m_metronome_1: .byte KEYSH , se_m_metronome_key+0 .byte TEMPO , 150*se_m_metronome_tbs/2 .byte VOICE , 37 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 115*se_m_metronome_mvl/mxv .byte BEND , c_v+0 .byte N15 , En3 , v127 .byte W01 .byte PAN , c_v+4 .byte BEND , c_v-4 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-7 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-5 .byte W02 .byte PAN , c_v+4 .byte BEND , c_v+0 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+3 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v+6 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+9 .byte W01 .byte PAN , c_v+4 .byte BEND , c_v+14 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+20 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v+25 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+46 .byte W10 .byte FINE @******************************************************@ .align 2 se_m_metronome: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_metronome_pri @ Priority .byte se_m_metronome_rev @ Reverb. .word se_m_metronome_grp .word se_m_metronome_1 .end ================================================ FILE: sound/songs/se_m_milk_drink.s ================================================ .include "MPlayDef.s" .equ se_m_milk_drink_grp, voicegroup128 .equ se_m_milk_drink_pri, 4 .equ se_m_milk_drink_rev, reverb_set+50 .equ se_m_milk_drink_mvl, 127 .equ se_m_milk_drink_key, 0 .equ se_m_milk_drink_tbs, 1 .equ se_m_milk_drink_exg, 0 .equ se_m_milk_drink_cmp, 1 .section .rodata .global se_m_milk_drink .align 2 @********************** Track 1 **********************@ se_m_milk_drink_1: .byte KEYSH , se_m_milk_drink_key+0 .byte TEMPO , 180*se_m_milk_drink_tbs/2 .byte VOICE , 16 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 100*se_m_milk_drink_mvl/mxv .byte BEND , c_v+0 .byte N06 , An6 , v100 .byte W01 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+5 .byte VOL , 90*se_m_milk_drink_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte PAN , c_v-6 .byte VOL , 77*se_m_milk_drink_mvl/mxv .byte BEND , c_v-37 .byte W01 .byte PAN , c_v+0 .byte VOL , 37*se_m_milk_drink_mvl/mxv .byte BEND , c_v-47 .byte W02 .byte N02 , An6 , v056 .byte W01 .byte PAN , c_v+5 .byte W01 .byte c_v-6 .byte VOL , 100*se_m_milk_drink_mvl/mxv .byte BEND , c_v+0 .byte N06 , An6 , v100 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v-10 .byte VOL , 90*se_m_milk_drink_mvl/mxv .byte BEND , c_v-20 .byte W02 .byte PAN , c_v+1 .byte VOL , 77*se_m_milk_drink_mvl/mxv .byte BEND , c_v-37 .byte W01 .byte PAN , c_v+5 .byte VOL , 37*se_m_milk_drink_mvl/mxv .byte BEND , c_v-47 .byte W01 .byte PAN , c_v-6 .byte N02 , An6 , v056 .byte W01 .byte PAN , c_v+8 .byte W01 .byte c_v-10 .byte VOL , 100*se_m_milk_drink_mvl/mxv .byte BEND , c_v+0 .byte N06 , An6 , v072 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+5 .byte VOL , 90*se_m_milk_drink_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte PAN , c_v-6 .byte VOL , 77*se_m_milk_drink_mvl/mxv .byte BEND , c_v-37 .byte W01 .byte PAN , c_v+8 .byte VOL , 37*se_m_milk_drink_mvl/mxv .byte BEND , c_v-47 .byte W01 .byte PAN , c_v-10 .byte W02 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_milk_drink_2: .byte KEYSH , se_m_milk_drink_key+0 .byte VOICE , 53 .byte VOL , 100*se_m_milk_drink_mvl/mxv .byte W02 .byte N06 , Fs6 , v040 .byte W04 .byte W04 .byte N06 .byte W02 .byte W06 .byte W01 .byte Fs6 , v032 .byte W05 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_milk_drink: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_milk_drink_pri @ Priority .byte se_m_milk_drink_rev @ Reverb. .word se_m_milk_drink_grp .word se_m_milk_drink_1 .word se_m_milk_drink_2 .end ================================================ FILE: sound/songs/se_m_minimize.s ================================================ .include "MPlayDef.s" .equ se_m_minimize_grp, voicegroup128 .equ se_m_minimize_pri, 4 .equ se_m_minimize_rev, reverb_set+50 .equ se_m_minimize_mvl, 127 .equ se_m_minimize_key, 0 .equ se_m_minimize_tbs, 1 .equ se_m_minimize_exg, 0 .equ se_m_minimize_cmp, 1 .section .rodata .global se_m_minimize .align 2 @********************** Track 1 **********************@ se_m_minimize_1: .byte KEYSH , se_m_minimize_key+0 .byte TEMPO , 150*se_m_minimize_tbs/2 .byte VOICE , 45 .byte BENDR , 24 .byte PAN , c_v+0 .byte VOL , 32*se_m_minimize_mvl/mxv .byte MOD , 30 .byte BEND , c_v+39 .byte N06 , Dn4 , v127 .byte W01 .byte BEND , c_v+31 .byte W01 .byte VOL , 49*se_m_minimize_mvl/mxv .byte PAN , c_v+5 .byte BEND , c_v+23 .byte W01 .byte c_v+15 .byte W01 .byte VOL , 61*se_m_minimize_mvl/mxv .byte BEND , c_v+8 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+35 .byte N06 , Cn4 , v116 .byte W01 .byte VOL , 71*se_m_minimize_mvl/mxv .byte BEND , c_v+27 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v+19 .byte W01 .byte VOL , 81*se_m_minimize_mvl/mxv .byte BEND , c_v+12 .byte W01 .byte c_v+5 .byte W02 .byte VOL , 95*se_m_minimize_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+32 .byte N06 , Bn3 , v112 .byte W01 .byte BEND , c_v+24 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+16 .byte W01 .byte c_v+8 .byte W01 .byte c_v+1 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+28 .byte N06 , An3 .byte W01 .byte BEND , c_v+20 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+12 .byte W01 .byte c_v+5 .byte W01 .byte c_v-2 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+24 .byte N06 , Gn3 , v108 .byte W01 .byte BEND , c_v+16 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v+9 .byte W01 .byte c_v+1 .byte W01 .byte c_v-6 .byte W02 .byte VOL , 82*se_m_minimize_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+21 .byte N06 , Fn3 , v100 .byte W01 .byte BEND , c_v+13 .byte W01 .byte VOL , 71*se_m_minimize_mvl/mxv .byte PAN , c_v-8 .byte BEND , c_v+5 .byte W01 .byte c_v-2 .byte W01 .byte VOL , 61*se_m_minimize_mvl/mxv .byte BEND , c_v-10 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+17 .byte N06 , En3 , v060 .byte W01 .byte BEND , c_v+9 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v+2 .byte W01 .byte c_v-6 .byte W01 .byte c_v-13 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+14 .byte N06 , Dn3 , v040 .byte W01 .byte BEND , c_v+6 .byte W01 .byte PAN , c_v-8 .byte BEND , c_v-2 .byte W01 .byte c_v-10 .byte W01 .byte c_v-17 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte N06 , Cn3 , v020 .byte W01 .byte BEND , c_v+4 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v-4 .byte W01 .byte c_v-11 .byte W01 .byte c_v-18 .byte W02 .byte FINE @******************************************************@ .align 2 se_m_minimize: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_minimize_pri @ Priority .byte se_m_minimize_rev @ Reverb. .word se_m_minimize_grp .word se_m_minimize_1 .end ================================================ FILE: sound/songs/se_m_mist.s ================================================ .include "MPlayDef.s" .equ se_m_mist_grp, voicegroup128 .equ se_m_mist_pri, 4 .equ se_m_mist_rev, reverb_set+50 .equ se_m_mist_mvl, 127 .equ se_m_mist_key, 0 .equ se_m_mist_tbs, 1 .equ se_m_mist_exg, 0 .equ se_m_mist_cmp, 1 .section .rodata .global se_m_mist .align 2 @********************** Track 1 **********************@ se_m_mist_1: .byte KEYSH , se_m_mist_key+0 .byte TEMPO , 150*se_m_mist_tbs/2 .byte VOICE , 36 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 7*se_m_mist_mvl/mxv .byte BEND , c_v+1 .byte N18 , Cn5 , v052 .byte W01 .byte VOL , 20*se_m_mist_mvl/mxv .byte PAN , c_v+16 .byte BEND , c_v-8 .byte W01 .byte VOL , 41*se_m_mist_mvl/mxv .byte PAN , c_v-14 .byte BEND , c_v-16 .byte W01 .byte VOL , 70*se_m_mist_mvl/mxv .byte PAN , c_v+16 .byte BEND , c_v-8 .byte W01 .byte VOL , 93*se_m_mist_mvl/mxv .byte PAN , c_v-14 .byte BEND , c_v+0 .byte W02 .byte PAN , c_v+0 .byte VOL , 110*se_m_mist_mvl/mxv .byte BEND , c_v+8 .byte W01 .byte PAN , c_v+16 .byte BEND , c_v+16 .byte W01 .byte PAN , c_v-14 .byte W01 .byte VOL , 98*se_m_mist_mvl/mxv .byte PAN , c_v+16 .byte BEND , c_v+10 .byte W01 .byte VOL , 85*se_m_mist_mvl/mxv .byte PAN , c_v-14 .byte BEND , c_v+4 .byte W02 .byte VOL , 69*se_m_mist_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-7 .byte W01 .byte VOL , 51*se_m_mist_mvl/mxv .byte PAN , c_v+16 .byte BEND , c_v-22 .byte W01 .byte PAN , c_v-14 .byte VOL , 38*se_m_mist_mvl/mxv .byte BEND , c_v-28 .byte W01 .byte VOL , 17*se_m_mist_mvl/mxv .byte BEND , c_v-32 .byte W01 .byte VOL , 4*se_m_mist_mvl/mxv .byte BEND , c_v-38 .byte W08 .byte FINE @******************************************************@ .align 2 se_m_mist: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_mist_pri @ Priority .byte se_m_mist_rev @ Reverb. .word se_m_mist_grp .word se_m_mist_1 .end ================================================ FILE: sound/songs/se_m_moonlight.s ================================================ .include "MPlayDef.s" .equ se_m_moonlight_grp, voicegroup128 .equ se_m_moonlight_pri, 4 .equ se_m_moonlight_rev, reverb_set+50 .equ se_m_moonlight_mvl, 127 .equ se_m_moonlight_key, 0 .equ se_m_moonlight_tbs, 1 .equ se_m_moonlight_exg, 0 .equ se_m_moonlight_cmp, 1 .section .rodata .global se_m_moonlight .align 2 @********************** Track 1 **********************@ se_m_moonlight_1: .byte KEYSH , se_m_moonlight_key+0 .byte TEMPO , 150*se_m_moonlight_tbs/2 .byte VOICE , 46 .byte VOL , 100*se_m_moonlight_mvl/mxv .byte BENDR , 4 .byte PAN , c_v+0 .byte MOD , 6 .byte BEND , c_v+3 .byte N01 , Ds6 , v092 .byte W01 .byte Dn6 .byte W01 .byte Gn5 .byte W01 .byte N20 , Gn6 , v100 .byte W21 se_m_moonlight_1_000: .byte N01 , Ds6 , v056 .byte W01 .byte Dn6 .byte W01 .byte Gn5 .byte W01 .byte N20 , Gn6 , v064 .byte W03 .byte PAN , c_v+6 .byte W04 .byte c_v-4 .byte W05 .byte c_v+6 .byte W05 .byte c_v-4 .byte W04 .byte PEND se_m_moonlight_1_001: .byte PAN , c_v+0 .byte N01 , Gs5 , v092 .byte W01 .byte Gn5 .byte W01 .byte Cn5 .byte W01 .byte N20 , Cn6 , v100 .byte W21 .byte PEND se_m_moonlight_1_002: .byte PAN , c_v+16 .byte N01 , Gs5 , v056 .byte W01 .byte Gn5 .byte W01 .byte Cn5 .byte W01 .byte N20 , Cn6 , v064 .byte W21 .byte PEND se_m_moonlight_1_003: .byte PAN , c_v-16 .byte N01 , Gs5 , v040 .byte W01 .byte Gn5 .byte W01 .byte Cn5 .byte W01 .byte N20 , Cn6 .byte W21 .byte PEND se_m_moonlight_1_004: .byte PAN , c_v+32 .byte N01 , Gs5 , v020 .byte W01 .byte Gn5 .byte W01 .byte Cn5 .byte W01 .byte PAN , c_v-32 .byte N20 , Cn6 .byte W21 .byte PEND .byte PAN , c_v+0 .byte N01 , Ds6 , v092 .byte W01 .byte Dn6 .byte W01 .byte Gn5 .byte W01 .byte N20 , Gn6 , v100 .byte W21 .byte PATT .word se_m_moonlight_1_000 .byte PATT .word se_m_moonlight_1_001 .byte PATT .word se_m_moonlight_1_002 .byte PATT .word se_m_moonlight_1_003 .byte PATT .word se_m_moonlight_1_004 .byte FINE @********************** Track 2 **********************@ se_m_moonlight_2: .byte KEYSH , se_m_moonlight_key+0 .byte VOICE , 55 .byte PAN , c_v+0 .byte VOL , 39*se_m_moonlight_mvl/mxv .byte BEND , c_v-4 .byte W10 .byte N01 , Ds6 , v112 .byte W02 .byte Dn6 .byte W01 .byte Gn5 .byte W01 .byte N04 , Gn6 .byte W05 .byte Gn6 , v096 .byte W05 se_m_moonlight_2_000: .byte PAN , c_v+50 .byte N04 , Gn6 , v080 .byte W04 .byte PAN , c_v-48 .byte N04 , Gn6 , v064 .byte W05 .byte PAN , c_v+50 .byte N04 , Gn6 , v048 .byte W05 .byte PAN , c_v-49 .byte N04 , Gn6 , v032 .byte W10 .byte PEND se_m_moonlight_2_001: .byte PAN , c_v+0 .byte W10 .byte N01 , Gs5 , v112 .byte W02 .byte Gn5 .byte W01 .byte Cn5 .byte W01 .byte N04 , Cn6 .byte W05 .byte Cn6 , v096 .byte W05 .byte PEND se_m_moonlight_2_002: .byte PAN , c_v+50 .byte N04 , Cn6 , v080 .byte W04 .byte PAN , c_v-48 .byte N04 , Cn6 , v064 .byte W05 .byte PAN , c_v+50 .byte N04 , Cn6 , v048 .byte W05 .byte PAN , c_v-49 .byte N04 , Cn6 , v032 .byte W10 .byte PEND .byte W24 .byte W24 .byte PAN , c_v+0 .byte W10 .byte N01 , Ds6 , v112 .byte W02 .byte Dn6 .byte W01 .byte Gn5 .byte W01 .byte N04 , Gn6 .byte W05 .byte Gn6 , v096 .byte W05 .byte PATT .word se_m_moonlight_2_000 .byte PATT .word se_m_moonlight_2_001 .byte PATT .word se_m_moonlight_2_002 .byte W24 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_moonlight: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_moonlight_pri @ Priority .byte se_m_moonlight_rev @ Reverb. .word se_m_moonlight_grp .word se_m_moonlight_1 .word se_m_moonlight_2 .end ================================================ FILE: sound/songs/se_m_morning_sun.s ================================================ .include "MPlayDef.s" .equ se_m_morning_sun_grp, voicegroup128 .equ se_m_morning_sun_pri, 5 .equ se_m_morning_sun_rev, reverb_set+50 .equ se_m_morning_sun_mvl, 127 .equ se_m_morning_sun_key, 0 .equ se_m_morning_sun_tbs, 1 .equ se_m_morning_sun_exg, 0 .equ se_m_morning_sun_cmp, 1 .section .rodata .global se_m_morning_sun .align 2 @********************** Track 1 **********************@ se_m_morning_sun_1: .byte KEYSH , se_m_morning_sun_key+0 .byte TEMPO , 150*se_m_morning_sun_tbs/2 .byte VOICE , 46 .byte VOL , 95*se_m_morning_sun_mvl/mxv .byte BENDR , 2 .byte PAN , c_v+0 .byte BEND , c_v+15 .byte W03 .byte N06 , Ds6 , v112 .byte W03 .byte W03 .byte En5 , v104 .byte W03 .byte W03 .byte Ds6 , v096 .byte W03 .byte W03 .byte En5 , v088 .byte W03 .byte W03 .byte PAN , c_v-4 .byte N06 , Ds6 , v080 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , En5 , v072 .byte W03 .byte W03 .byte PAN , c_v+4 .byte N06 , Ds6 , v064 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , En5 , v056 .byte W03 .byte W03 .byte PAN , c_v-4 .byte N06 , Ds6 , v044 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , En5 , v036 .byte W03 .byte W03 .byte PAN , c_v+4 .byte N06 , Ds6 , v028 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , En5 , v020 .byte W03 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_morning_sun_2: .byte KEYSH , se_m_morning_sun_key+0 .byte VOICE , 53 .byte BENDR , 2 .byte VOL , 43*se_m_morning_sun_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+15 .byte N06 , Gs6 , v108 .byte W03 .byte W03 .byte Bn5 .byte W03 .byte W03 .byte Gs6 , v100 .byte W03 .byte W03 .byte Bn5 , v092 .byte W03 .byte W03 .byte Gs6 , v084 .byte W03 .byte W03 .byte Bn5 , v076 .byte W03 .byte W03 .byte Gs6 , v068 .byte W03 .byte W03 .byte Bn5 , v060 .byte W03 .byte W03 .byte Gs6 , v052 .byte W03 .byte W03 .byte Bn5 , v040 .byte W03 .byte W03 .byte Gs6 , v032 .byte W03 .byte W03 .byte Bn5 , v024 .byte W03 .byte W03 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_morning_sun: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_morning_sun_pri @ Priority .byte se_m_morning_sun_rev @ Reverb. .word se_m_morning_sun_grp .word se_m_morning_sun_1 .word se_m_morning_sun_2 .end ================================================ FILE: sound/songs/se_m_nightmare.s ================================================ .include "MPlayDef.s" .equ se_m_nightmare_grp, voicegroup128 .equ se_m_nightmare_pri, 4 .equ se_m_nightmare_rev, reverb_set+50 .equ se_m_nightmare_mvl, 127 .equ se_m_nightmare_key, 0 .equ se_m_nightmare_tbs, 1 .equ se_m_nightmare_exg, 0 .equ se_m_nightmare_cmp, 1 .section .rodata .global se_m_nightmare .align 2 @********************** Track 1 **********************@ se_m_nightmare_1: .byte KEYSH , se_m_nightmare_key+0 .byte TEMPO , 220*se_m_nightmare_tbs/2 .byte VOICE , 3 .byte VOL , 110*se_m_nightmare_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte W06 .byte N03 , Gn2 , v092 .byte W06 .byte PAN , c_v-16 .byte N03 , Gn2 , v088 .byte W09 .byte PAN , c_v-1 .byte N03 , Fs3 , v104 .byte W03 .byte W03 .byte PAN , c_v+16 .byte N03 , Fs3 , v088 .byte W06 .byte PAN , c_v+0 .byte N03 , Ds3 .byte W06 .byte PAN , c_v-16 .byte N03 .byte W09 .byte PAN , c_v-1 .byte N03 , An2 , v096 .byte W06 .byte PAN , c_v+17 .byte N03 , An2 , v088 .byte W09 .byte PAN , c_v-1 .byte N03 , Gs3 , v104 .byte W06 .byte PAN , c_v-16 .byte N03 , Gs3 , v088 .byte W03 .byte W03 .byte PAN , c_v-1 .byte N03 , Fn3 .byte W06 .byte PAN , c_v+16 .byte N03 .byte W15 .byte FINE @********************** Track 2 **********************@ se_m_nightmare_2: .byte KEYSH , se_m_nightmare_key+0 .byte VOICE , 20 .byte XCMD , xIECV , 10 .byte xIECL , 8 .byte VOL , 110*se_m_nightmare_mvl/mxv .byte PAN , c_v-7 .byte BEND , c_v+55 .byte N03 , Cn2 , v100 .byte W06 .byte PAN , c_v+6 .byte BEND , c_v+36 .byte N03 .byte W06 .byte PAN , c_v-7 .byte BEND , c_v+17 .byte N03 .byte W06 .byte PAN , c_v+6 .byte BEND , c_v+2 .byte N03 .byte W06 .byte PAN , c_v-7 .byte BEND , c_v-8 .byte N03 .byte W06 .byte PAN , c_v+6 .byte BEND , c_v+12 .byte N03 .byte W06 .byte PAN , c_v-7 .byte BEND , c_v+6 .byte N03 .byte W06 .byte PAN , c_v+6 .byte BEND , c_v+0 .byte N03 .byte W06 .byte PAN , c_v-7 .byte BEND , c_v-6 .byte N03 .byte W06 .byte PAN , c_v+6 .byte BEND , c_v-19 .byte N03 .byte W06 .byte PAN , c_v-7 .byte BEND , c_v-31 .byte N03 .byte W06 .byte PAN , c_v+6 .byte BEND , c_v-44 .byte N03 .byte W06 .byte PAN , c_v-7 .byte BEND , c_v-55 .byte N03 .byte W06 .byte PAN , c_v+6 .byte BEND , c_v-64 .byte N03 .byte W18 .byte FINE @******************************************************@ .align 2 se_m_nightmare: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_nightmare_pri @ Priority .byte se_m_nightmare_rev @ Reverb. .word se_m_nightmare_grp .word se_m_nightmare_1 .word se_m_nightmare_2 .end ================================================ FILE: sound/songs/se_m_perish_song.s ================================================ .include "MPlayDef.s" .equ se_m_perish_song_grp, voicegroup128 .equ se_m_perish_song_pri, 4 .equ se_m_perish_song_rev, reverb_set+50 .equ se_m_perish_song_mvl, 127 .equ se_m_perish_song_key, 0 .equ se_m_perish_song_tbs, 1 .equ se_m_perish_song_exg, 0 .equ se_m_perish_song_cmp, 1 .section .rodata .global se_m_perish_song .align 2 @********************** Track 1 **********************@ se_m_perish_song_1: .byte KEYSH , se_m_perish_song_key+0 .byte TEMPO , 100*se_m_perish_song_tbs/2 .byte VOICE , 73 .byte BENDR , 12 .byte LFOS , 40 .byte PAN , c_v+7 .byte VOL , 25*se_m_perish_song_mvl/mxv .byte BEND , c_v+0 .byte W03 .byte VOL , 29*se_m_perish_song_mvl/mxv .byte W03 .byte 33*se_m_perish_song_mvl/mxv .byte N48 , An3 , v112 .byte W03 .byte VOL , 40*se_m_perish_song_mvl/mxv .byte W01 .byte PAN , c_v+4 .byte W02 se_m_perish_song_1_000: .byte VOL , 45*se_m_perish_song_mvl/mxv .byte MOD , 8 .byte W03 .byte VOL , 51*se_m_perish_song_mvl/mxv .byte W03 .byte PEND se_m_perish_song_1_001: .byte VOL , 56*se_m_perish_song_mvl/mxv .byte PAN , c_v+0 .byte W03 .byte VOL , 62*se_m_perish_song_mvl/mxv .byte W03 .byte PEND se_m_perish_song_1_002: .byte VOL , 72*se_m_perish_song_mvl/mxv .byte PAN , c_v-4 .byte W03 .byte VOL , 81*se_m_perish_song_mvl/mxv .byte W03 .byte PEND se_m_perish_song_1_003: .byte VOL , 92*se_m_perish_song_mvl/mxv .byte PAN , c_v-8 .byte W03 .byte VOL , 100*se_m_perish_song_mvl/mxv .byte W03 .byte PEND .byte PAN , c_v-4 .byte W06 .byte VOL , 82*se_m_perish_song_mvl/mxv .byte PAN , c_v+0 .byte W03 .byte VOL , 52*se_m_perish_song_mvl/mxv .byte W03 .byte 25*se_m_perish_song_mvl/mxv .byte MOD , 0 .byte PAN , c_v+4 .byte W03 .byte VOL , 29*se_m_perish_song_mvl/mxv .byte W01 .byte PAN , c_v+7 .byte W02 .byte VOL , 33*se_m_perish_song_mvl/mxv .byte N72 , Gs3 , v112 .byte W03 .byte VOL , 40*se_m_perish_song_mvl/mxv .byte W01 .byte PAN , c_v+4 .byte W02 .byte PATT .word se_m_perish_song_1_000 .byte PATT .word se_m_perish_song_1_001 .byte PATT .word se_m_perish_song_1_002 .byte PATT .word se_m_perish_song_1_003 .byte PAN , c_v-4 .byte W06 .byte c_v+0 .byte W06 .byte c_v+4 .byte W03 .byte VOL , 87*se_m_perish_song_mvl/mxv .byte W03 .byte 75*se_m_perish_song_mvl/mxv .byte PAN , c_v+7 .byte W03 .byte VOL , 62*se_m_perish_song_mvl/mxv .byte W03 .byte 48*se_m_perish_song_mvl/mxv .byte PAN , c_v+4 .byte W03 .byte VOL , 33*se_m_perish_song_mvl/mxv .byte W03 .byte 25*se_m_perish_song_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W02 .byte VOL , 10*se_m_perish_song_mvl/mxv .byte W03 .byte W01 .byte PAN , c_v-4 .byte W05 .byte FINE @********************** Track 2 **********************@ se_m_perish_song_2: .byte KEYSH , se_m_perish_song_key+0 .byte VOICE , 73 .byte VOL , 25*se_m_perish_song_mvl/mxv .byte PAN , c_v-17 .byte N48 , Cn4 , v100 .byte W03 .byte VOL , 29*se_m_perish_song_mvl/mxv .byte W03 .byte 33*se_m_perish_song_mvl/mxv .byte W03 .byte 40*se_m_perish_song_mvl/mxv .byte W03 se_m_perish_song_2_000: .byte VOL , 45*se_m_perish_song_mvl/mxv .byte MOD , 8 .byte W03 .byte VOL , 51*se_m_perish_song_mvl/mxv .byte W03 .byte PEND .byte 56*se_m_perish_song_mvl/mxv .byte W03 .byte 62*se_m_perish_song_mvl/mxv .byte W03 .byte 72*se_m_perish_song_mvl/mxv .byte W03 .byte 81*se_m_perish_song_mvl/mxv .byte W03 .byte 92*se_m_perish_song_mvl/mxv .byte W03 .byte 100*se_m_perish_song_mvl/mxv .byte W03 .byte W06 .byte 82*se_m_perish_song_mvl/mxv .byte W03 .byte 52*se_m_perish_song_mvl/mxv .byte W03 .byte 25*se_m_perish_song_mvl/mxv .byte MOD , 0 .byte N72 , Bn3 , v100 .byte W03 .byte VOL , 29*se_m_perish_song_mvl/mxv .byte W03 .byte 33*se_m_perish_song_mvl/mxv .byte W03 .byte 40*se_m_perish_song_mvl/mxv .byte W03 .byte PATT .word se_m_perish_song_2_000 .byte VOL , 56*se_m_perish_song_mvl/mxv .byte W03 .byte 62*se_m_perish_song_mvl/mxv .byte W03 .byte 72*se_m_perish_song_mvl/mxv .byte W03 .byte 81*se_m_perish_song_mvl/mxv .byte W03 .byte 92*se_m_perish_song_mvl/mxv .byte W03 .byte 100*se_m_perish_song_mvl/mxv .byte W03 .byte W06 .byte W06 .byte W03 .byte 87*se_m_perish_song_mvl/mxv .byte W03 .byte 75*se_m_perish_song_mvl/mxv .byte W03 .byte 62*se_m_perish_song_mvl/mxv .byte W03 .byte 48*se_m_perish_song_mvl/mxv .byte W03 .byte 33*se_m_perish_song_mvl/mxv .byte W03 .byte 25*se_m_perish_song_mvl/mxv .byte W03 .byte 10*se_m_perish_song_mvl/mxv .byte W03 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_perish_song: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_perish_song_pri @ Priority .byte se_m_perish_song_rev @ Reverb. .word se_m_perish_song_grp .word se_m_perish_song_1 .word se_m_perish_song_2 .end ================================================ FILE: sound/songs/se_m_petal_dance.s ================================================ .include "MPlayDef.s" .equ se_m_petal_dance_grp, voicegroup128 .equ se_m_petal_dance_pri, 4 .equ se_m_petal_dance_rev, reverb_set+50 .equ se_m_petal_dance_mvl, 127 .equ se_m_petal_dance_key, 0 .equ se_m_petal_dance_tbs, 1 .equ se_m_petal_dance_exg, 0 .equ se_m_petal_dance_cmp, 1 .section .rodata .global se_m_petal_dance .align 2 @********************** Track 1 **********************@ se_m_petal_dance_1: .byte KEYSH , se_m_petal_dance_key+0 .byte TEMPO , 150*se_m_petal_dance_tbs/2 .byte VOICE , 46 .byte VOL , 95*se_m_petal_dance_mvl/mxv .byte BENDR , 2 .byte PAN , c_v+0 .byte BEND , c_v+15 .byte W03 .byte N06 , Dn6 , v112 .byte W03 .byte W03 .byte An5 , v104 .byte W03 .byte W03 .byte Dn6 , v100 .byte W03 .byte W03 .byte An5 .byte W03 .byte W03 .byte PAN , c_v-4 .byte N06 , Dn6 , v096 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , An5 , v092 .byte W03 .byte W03 .byte PAN , c_v+4 .byte N06 , Dn6 , v088 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , An5 , v084 .byte W03 .byte W03 .byte PAN , c_v-4 .byte N06 , Dn6 , v080 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , An5 , v076 .byte W03 .byte W03 .byte PAN , c_v+4 .byte N06 , Dn6 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , An5 , v072 .byte W03 .byte W03 .byte PAN , c_v-4 .byte N06 , Dn6 , v068 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , An5 , v064 .byte W03 .byte W03 .byte PAN , c_v+4 .byte N06 , Dn6 , v060 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , An5 , v056 .byte W03 .byte W03 .byte PAN , c_v-8 .byte N06 , Dn6 , v052 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , An5 , v048 .byte W03 .byte W03 .byte PAN , c_v+8 .byte N06 , Dn6 , v044 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , An5 , v040 .byte W03 .byte W03 .byte PAN , c_v-8 .byte N06 , Dn6 , v036 .byte W03 .byte W03 .byte PAN , c_v+0 .byte N06 , An5 , v032 .byte W03 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_petal_dance_2: .byte KEYSH , se_m_petal_dance_key+0 .byte VOICE , 53 .byte BENDR , 2 .byte VOL , 43*se_m_petal_dance_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+15 .byte N06 , En6 , v108 .byte W03 .byte W03 .byte Bn5 , v104 .byte W03 .byte W03 .byte En6 , v100 .byte W03 .byte W03 .byte Bn5 , v096 .byte W03 .byte W03 .byte En6 , v092 .byte W03 .byte W03 .byte Bn5 , v088 .byte W03 .byte W03 .byte En6 .byte W03 .byte W03 .byte Bn5 , v084 .byte W03 .byte W03 .byte En6 , v080 .byte W03 .byte W03 .byte Bn5 , v076 .byte W03 .byte W03 .byte En6 , v072 .byte W03 .byte W03 .byte Bn5 , v068 .byte W03 .byte W03 .byte En6 , v064 .byte W03 .byte W03 .byte Bn5 .byte W03 .byte W03 .byte En6 , v060 .byte W03 .byte W03 .byte Bn5 , v056 .byte W03 .byte W03 .byte En6 , v052 .byte W03 .byte W03 .byte Bn5 , v048 .byte W03 .byte W03 .byte En6 , v044 .byte W03 .byte W03 .byte Bn5 , v040 .byte W03 .byte W03 .byte En6 , v036 .byte W03 .byte W03 .byte Bn5 , v032 .byte W03 .byte W03 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_petal_dance: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_petal_dance_pri @ Priority .byte se_m_petal_dance_rev @ Reverb. .word se_m_petal_dance_grp .word se_m_petal_dance_1 .word se_m_petal_dance_2 .end ================================================ FILE: sound/songs/se_m_poison_powder.s ================================================ .include "MPlayDef.s" .equ se_m_poison_powder_grp, voicegroup128 .equ se_m_poison_powder_pri, 4 .equ se_m_poison_powder_rev, reverb_set+50 .equ se_m_poison_powder_mvl, 127 .equ se_m_poison_powder_key, 0 .equ se_m_poison_powder_tbs, 1 .equ se_m_poison_powder_exg, 0 .equ se_m_poison_powder_cmp, 1 .section .rodata .global se_m_poison_powder .align 2 @********************** Track 1 **********************@ se_m_poison_powder_1: .byte KEYSH , se_m_poison_powder_key+0 .byte TEMPO , 150*se_m_poison_powder_tbs/2 .byte VOICE , 18 .byte BENDR , 12 .byte VOL , 55*se_m_poison_powder_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+1 .byte N01 , Cn6 , v100 .byte W01 .byte VOL , 110*se_m_poison_powder_mvl/mxv .byte W01 .byte VOICE , 36 .byte VOL , 55*se_m_poison_powder_mvl/mxv .byte N02 , Gn6 , v080 .byte W01 .byte VOL , 110*se_m_poison_powder_mvl/mxv .byte W04 .byte PAN , c_v+20 .byte N01 , Gn6 , v024 .byte W03 .byte Gn6 , v016 .byte W02 .byte PAN , c_v-21 .byte W12 .byte FINE @******************************************************@ .align 2 se_m_poison_powder: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_poison_powder_pri @ Priority .byte se_m_poison_powder_rev @ Reverb. .word se_m_poison_powder_grp .word se_m_poison_powder_1 .end ================================================ FILE: sound/songs/se_m_psybeam.s ================================================ .include "MPlayDef.s" .equ se_m_psybeam_grp, voicegroup128 .equ se_m_psybeam_pri, 4 .equ se_m_psybeam_rev, reverb_set+50 .equ se_m_psybeam_mvl, 127 .equ se_m_psybeam_key, 0 .equ se_m_psybeam_tbs, 1 .equ se_m_psybeam_exg, 0 .equ se_m_psybeam_cmp, 1 .section .rodata .global se_m_psybeam .align 2 @********************** Track 1 **********************@ se_m_psybeam_1: .byte KEYSH , se_m_psybeam_key+0 .byte TEMPO , 190*se_m_psybeam_tbs/2 .byte VOICE , 45 .byte BENDR , 8 .byte PAN , c_v+0 .byte VOL , 38*se_m_psybeam_mvl/mxv .byte MOD , 30 .byte BEND , c_v+1 .byte N42 , As2 , v120 .byte W01 .byte PAN , c_v+3 .byte W01 .byte c_v+5 .byte VOL , 57*se_m_psybeam_mvl/mxv .byte W01 .byte PAN , c_v+9 .byte W01 .byte VOL , 71*se_m_psybeam_mvl/mxv .byte W02 .byte PAN , c_v+5 .byte W01 .byte c_v+1 .byte VOL , 82*se_m_psybeam_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W01 .byte c_v-3 .byte VOL , 94*se_m_psybeam_mvl/mxv .byte W01 .byte PAN , c_v-6 .byte W02 .byte c_v-10 .byte VOL , 110*se_m_psybeam_mvl/mxv .byte W02 .byte PAN , c_v-6 .byte W01 .byte c_v-3 .byte W01 .byte c_v+0 .byte W02 .byte W06 .byte c_v+3 .byte W01 .byte c_v+5 .byte W01 .byte c_v+9 .byte W02 .byte c_v+5 .byte W02 .byte c_v+1 .byte VOL , 95*se_m_psybeam_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W01 .byte c_v-3 .byte VOL , 83*se_m_psybeam_mvl/mxv .byte W01 .byte PAN , c_v-6 .byte W01 .byte c_v-10 .byte VOL , 71*se_m_psybeam_mvl/mxv .byte W02 .byte W01 .byte PAN , c_v-6 .byte VOL , 56*se_m_psybeam_mvl/mxv .byte W01 .byte PAN , c_v-3 .byte W01 .byte VOL , 38*se_m_psybeam_mvl/mxv .byte W03 .byte PAN , c_v+0 .byte FINE @********************** Track 2 **********************@ se_m_psybeam_2: .byte KEYSH , se_m_psybeam_key+0 .byte VOICE , 47 .byte BENDR , 8 .byte PAN , c_v+0 .byte VOL , 38*se_m_psybeam_mvl/mxv .byte MOD , 30 .byte BEND , c_v+1 .byte N42 , As1 , v040 .byte W02 .byte VOL , 57*se_m_psybeam_mvl/mxv .byte W02 .byte 71*se_m_psybeam_mvl/mxv .byte W02 .byte W01 .byte 82*se_m_psybeam_mvl/mxv .byte W02 .byte 94*se_m_psybeam_mvl/mxv .byte W03 .byte 110*se_m_psybeam_mvl/mxv .byte W06 .byte W06 .byte W06 .byte 95*se_m_psybeam_mvl/mxv .byte W02 .byte 83*se_m_psybeam_mvl/mxv .byte W02 .byte 71*se_m_psybeam_mvl/mxv .byte W02 .byte W01 .byte 56*se_m_psybeam_mvl/mxv .byte W02 .byte 38*se_m_psybeam_mvl/mxv .byte W03 .byte FINE @******************************************************@ .align 2 se_m_psybeam: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_psybeam_pri @ Priority .byte se_m_psybeam_rev @ Reverb. .word se_m_psybeam_grp .word se_m_psybeam_1 .word se_m_psybeam_2 .end ================================================ FILE: sound/songs/se_m_psybeam2.s ================================================ .include "MPlayDef.s" .equ se_m_psybeam2_grp, voicegroup128 .equ se_m_psybeam2_pri, 4 .equ se_m_psybeam2_rev, reverb_set+50 .equ se_m_psybeam2_mvl, 127 .equ se_m_psybeam2_key, 0 .equ se_m_psybeam2_tbs, 1 .equ se_m_psybeam2_exg, 0 .equ se_m_psybeam2_cmp, 1 .section .rodata .global se_m_psybeam2 .align 2 @********************** Track 1 **********************@ se_m_psybeam2_1: .byte KEYSH , se_m_psybeam2_key+0 .byte TEMPO , 190*se_m_psybeam2_tbs/2 .byte VOICE , 45 .byte BENDR , 8 .byte VOL , 36*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-44 .byte N12 , Gs2 , v127 .byte W01 .byte VOL , 52*se_m_psybeam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v-20 .byte W01 .byte VOL , 67*se_m_psybeam2_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v+17 .byte W01 .byte VOL , 78*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+27 .byte W01 .byte VOL , 105*se_m_psybeam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v+44 .byte W02 .byte PAN , c_v-6 .byte BEND , c_v+63 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+44 .byte W01 .byte VOL , 86*se_m_psybeam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v+28 .byte W01 .byte VOL , 55*se_m_psybeam2_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v+17 .byte W01 .byte VOL , 33*se_m_psybeam2_mvl/mxv .byte BEND , c_v+5 .byte W02 .byte VOICE , 37 .byte VOL , 105*se_m_psybeam2_mvl/mxv .byte N02 , Gs3 , v080 .byte W01 .byte BEND , c_v+16 .byte W01 .byte VOICE , 45 .byte VOL , 36*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-44 .byte N12 , As2 , v127 .byte W01 .byte VOL , 52*se_m_psybeam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v-20 .byte W01 .byte VOL , 67*se_m_psybeam2_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v+17 .byte W02 .byte VOL , 78*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+27 .byte W01 .byte VOL , 105*se_m_psybeam2_mvl/mxv .byte PAN , c_v+11 .byte BEND , c_v+44 .byte W01 .byte PAN , c_v-11 .byte BEND , c_v+63 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+44 .byte W01 .byte VOL , 86*se_m_psybeam2_mvl/mxv .byte PAN , c_v+11 .byte BEND , c_v+28 .byte W02 .byte VOL , 55*se_m_psybeam2_mvl/mxv .byte PAN , c_v-11 .byte BEND , c_v+17 .byte W01 .byte VOL , 33*se_m_psybeam2_mvl/mxv .byte BEND , c_v+5 .byte W01 .byte VOICE , 37 .byte VOL , 105*se_m_psybeam2_mvl/mxv .byte N02 , As3 , v056 .byte W01 .byte BEND , c_v+16 .byte W01 .byte VOICE , 45 .byte VOL , 36*se_m_psybeam2_mvl/mxv .byte BEND , c_v-44 .byte N12 , Gs2 , v080 .byte W02 .byte VOL , 52*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-20 .byte W01 .byte VOL , 67*se_m_psybeam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v+17 .byte W01 .byte VOL , 78*se_m_psybeam2_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v+27 .byte W01 .byte VOL , 105*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+44 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+63 .byte W02 .byte PAN , c_v-6 .byte BEND , c_v+44 .byte W01 .byte VOL , 86*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+28 .byte W01 .byte VOL , 55*se_m_psybeam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v+17 .byte W01 .byte VOL , 33*se_m_psybeam2_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v+5 .byte W01 .byte VOICE , 37 .byte VOL , 105*se_m_psybeam2_mvl/mxv .byte N02 , Gs3 , v024 .byte W02 .byte BEND , c_v+16 .byte W01 .byte VOICE , 45 .byte VOL , 36*se_m_psybeam2_mvl/mxv .byte BEND , c_v-44 .byte N12 , As2 , v040 .byte W01 .byte VOL , 52*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-20 .byte W01 .byte VOL , 67*se_m_psybeam2_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v+17 .byte W01 .byte VOL , 78*se_m_psybeam2_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v+27 .byte W02 .byte VOL , 105*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+44 .byte W01 .byte PAN , c_v+11 .byte BEND , c_v+63 .byte W01 .byte PAN , c_v-11 .byte BEND , c_v+44 .byte W01 .byte VOL , 86*se_m_psybeam2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+28 .byte W01 .byte VOL , 55*se_m_psybeam2_mvl/mxv .byte PAN , c_v+11 .byte BEND , c_v+17 .byte W02 .byte VOL , 33*se_m_psybeam2_mvl/mxv .byte BEND , c_v+5 .byte W01 .byte VOICE , 37 .byte VOL , 105*se_m_psybeam2_mvl/mxv .byte N02 , As3 , v016 .byte W01 .byte BEND , c_v+16 .byte W04 .byte FINE @******************************************************@ .align 2 se_m_psybeam2: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_psybeam2_pri @ Priority .byte se_m_psybeam2_rev @ Reverb. .word se_m_psybeam2_grp .word se_m_psybeam2_1 .end ================================================ FILE: sound/songs/se_m_rain_dance.s ================================================ .include "MPlayDef.s" .equ se_m_rain_dance_grp, voicegroup128 .equ se_m_rain_dance_pri, 4 .equ se_m_rain_dance_rev, reverb_set+50 .equ se_m_rain_dance_mvl, 127 .equ se_m_rain_dance_key, 0 .equ se_m_rain_dance_tbs, 1 .equ se_m_rain_dance_exg, 0 .equ se_m_rain_dance_cmp, 1 .section .rodata .global se_m_rain_dance .align 2 @********************** Track 1 **********************@ se_m_rain_dance_1: .byte KEYSH , se_m_rain_dance_key+0 .byte TEMPO , 220*se_m_rain_dance_tbs/2 .byte VOICE , 36 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 20*se_m_rain_dance_mvl/mxv .byte BEND , c_v+0 .byte TIE , Gn3 , v064 .byte W03 .byte VOL , 37*se_m_rain_dance_mvl/mxv .byte W03 .byte 53*se_m_rain_dance_mvl/mxv .byte W03 .byte 60*se_m_rain_dance_mvl/mxv .byte W03 .byte 71*se_m_rain_dance_mvl/mxv .byte W03 .byte 81*se_m_rain_dance_mvl/mxv .byte W03 .byte 93*se_m_rain_dance_mvl/mxv .byte W03 .byte 110*se_m_rain_dance_mvl/mxv .byte W03 .byte PAN , c_v+3 .byte W06 .byte c_v+11 .byte W12 .byte c_v+20 .byte W06 .byte c_v+25 .byte W12 .byte c_v+14 .byte W06 .byte c_v+8 .byte W06 .byte W06 .byte c_v-3 .byte W12 .byte c_v-16 .byte W06 .byte W06 .byte c_v-26 .byte W12 .byte c_v-16 .byte W06 .byte VOL , 104*se_m_rain_dance_mvl/mxv .byte PAN , c_v-5 .byte W03 .byte VOL , 101*se_m_rain_dance_mvl/mxv .byte W03 .byte 98*se_m_rain_dance_mvl/mxv .byte PAN , c_v+6 .byte W03 .byte VOL , 93*se_m_rain_dance_mvl/mxv .byte W03 .byte 90*se_m_rain_dance_mvl/mxv .byte PAN , c_v+14 .byte W03 .byte VOL , 86*se_m_rain_dance_mvl/mxv .byte W03 .byte 83*se_m_rain_dance_mvl/mxv .byte W03 .byte 77*se_m_rain_dance_mvl/mxv .byte W03 .byte 73*se_m_rain_dance_mvl/mxv .byte PAN , c_v+24 .byte W03 .byte VOL , 66*se_m_rain_dance_mvl/mxv .byte W03 .byte 58*se_m_rain_dance_mvl/mxv .byte W03 .byte 44*se_m_rain_dance_mvl/mxv .byte W03 .byte 32*se_m_rain_dance_mvl/mxv .byte PAN , c_v+15 .byte W03 .byte VOL , 16*se_m_rain_dance_mvl/mxv .byte W03 .byte 1*se_m_rain_dance_mvl/mxv .byte PAN , c_v+4 .byte W06 .byte EOT .byte FINE @******************************************************@ .align 2 se_m_rain_dance: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_rain_dance_pri @ Priority .byte se_m_rain_dance_rev @ Reverb. .word se_m_rain_dance_grp .word se_m_rain_dance_1 .end ================================================ FILE: sound/songs/se_m_reflect.s ================================================ .include "MPlayDef.s" .equ se_m_reflect_grp, voicegroup128 .equ se_m_reflect_pri, 4 .equ se_m_reflect_rev, reverb_set+50 .equ se_m_reflect_mvl, 127 .equ se_m_reflect_key, 0 .equ se_m_reflect_tbs, 1 .equ se_m_reflect_exg, 0 .equ se_m_reflect_cmp, 1 .section .rodata .global se_m_reflect .align 2 @********************** Track 1 **********************@ se_m_reflect_1: .byte KEYSH , se_m_reflect_key+0 .byte TEMPO , 150*se_m_reflect_tbs/2 .byte VOICE , 19 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 90*se_m_reflect_mvl/mxv .byte BEND , c_v+6 .byte N06 , Gn6 , v080 .byte W01 .byte BEND , c_v-4 .byte W01 .byte PAN , c_v+5 .byte VOL , 74*se_m_reflect_mvl/mxv .byte BEND , c_v-14 .byte W01 .byte PAN , c_v-6 .byte VOL , 60*se_m_reflect_mvl/mxv .byte BEND , c_v-31 .byte W01 .byte PAN , c_v+0 .byte VOL , 20*se_m_reflect_mvl/mxv .byte BEND , c_v-41 .byte W02 .byte VOL , 90*se_m_reflect_mvl/mxv .byte BEND , c_v+0 .byte N06 , Gn6 , v072 .byte W01 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+5 .byte VOL , 74*se_m_reflect_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte PAN , c_v-6 .byte VOL , 60*se_m_reflect_mvl/mxv .byte BEND , c_v-37 .byte W01 .byte PAN , c_v+0 .byte VOL , 20*se_m_reflect_mvl/mxv .byte BEND , c_v-47 .byte W02 .byte VOL , 90*se_m_reflect_mvl/mxv .byte BEND , c_v-1 .byte N06 , Gn6 , v068 .byte W01 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+5 .byte VOL , 74*se_m_reflect_mvl/mxv .byte BEND , c_v-21 .byte W01 .byte PAN , c_v-6 .byte VOL , 60*se_m_reflect_mvl/mxv .byte BEND , c_v-38 .byte W01 .byte PAN , c_v+0 .byte VOL , 20*se_m_reflect_mvl/mxv .byte BEND , c_v-48 .byte W02 .byte VOL , 90*se_m_reflect_mvl/mxv .byte BEND , c_v-1 .byte N06 , Gn6 , v060 .byte W01 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+5 .byte VOL , 74*se_m_reflect_mvl/mxv .byte BEND , c_v-21 .byte W01 .byte PAN , c_v-6 .byte VOL , 60*se_m_reflect_mvl/mxv .byte BEND , c_v-38 .byte W01 .byte PAN , c_v+0 .byte VOL , 20*se_m_reflect_mvl/mxv .byte BEND , c_v-48 .byte W02 .byte VOL , 90*se_m_reflect_mvl/mxv .byte BEND , c_v-2 .byte N06 , Gn6 , v052 .byte W01 .byte PAN , c_v+5 .byte BEND , c_v-12 .byte W01 .byte PAN , c_v-6 .byte VOL , 74*se_m_reflect_mvl/mxv .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+8 .byte VOL , 60*se_m_reflect_mvl/mxv .byte BEND , c_v-39 .byte W01 .byte PAN , c_v-10 .byte VOL , 20*se_m_reflect_mvl/mxv .byte BEND , c_v-49 .byte W02 .byte PAN , c_v+0 .byte VOL , 90*se_m_reflect_mvl/mxv .byte BEND , c_v-2 .byte N06 , Gn6 , v048 .byte W01 .byte PAN , c_v+5 .byte BEND , c_v-12 .byte W01 .byte PAN , c_v-6 .byte VOL , 74*se_m_reflect_mvl/mxv .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+8 .byte VOL , 60*se_m_reflect_mvl/mxv .byte BEND , c_v-39 .byte W01 .byte PAN , c_v-10 .byte VOL , 20*se_m_reflect_mvl/mxv .byte BEND , c_v-49 .byte W02 .byte VOL , 90*se_m_reflect_mvl/mxv .byte BEND , c_v-2 .byte N06 , Gn6 , v040 .byte W01 .byte PAN , c_v+5 .byte BEND , c_v-13 .byte W01 .byte PAN , c_v-6 .byte VOL , 74*se_m_reflect_mvl/mxv .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+8 .byte VOL , 60*se_m_reflect_mvl/mxv .byte BEND , c_v-39 .byte W01 .byte PAN , c_v-10 .byte VOL , 20*se_m_reflect_mvl/mxv .byte BEND , c_v-49 .byte W02 .byte PAN , c_v+0 .byte VOL , 90*se_m_reflect_mvl/mxv .byte BEND , c_v-2 .byte N06 , Gn6 , v032 .byte W01 .byte PAN , c_v+5 .byte BEND , c_v-13 .byte W01 .byte PAN , c_v-6 .byte VOL , 74*se_m_reflect_mvl/mxv .byte BEND , c_v-22 .byte W01 .byte PAN , c_v+8 .byte VOL , 60*se_m_reflect_mvl/mxv .byte BEND , c_v-39 .byte W01 .byte PAN , c_v-10 .byte VOL , 20*se_m_reflect_mvl/mxv .byte BEND , c_v-49 .byte W02 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_reflect_2: .byte KEYSH , se_m_reflect_key+0 .byte VOICE , 53 .byte PAN , c_v+0 .byte VOL , 90*se_m_reflect_mvl/mxv .byte W02 .byte N06 , En6 , v064 .byte W02 .byte VOL , 74*se_m_reflect_mvl/mxv .byte W02 .byte 60*se_m_reflect_mvl/mxv .byte W01 .byte 20*se_m_reflect_mvl/mxv .byte W01 .byte 90*se_m_reflect_mvl/mxv .byte N06 , En6 , v056 .byte W02 .byte VOL , 74*se_m_reflect_mvl/mxv .byte W02 se_m_reflect_2_000: .byte VOL , 60*se_m_reflect_mvl/mxv .byte W01 .byte 20*se_m_reflect_mvl/mxv .byte W01 .byte 90*se_m_reflect_mvl/mxv .byte N06 , En6 , v052 .byte W02 .byte VOL , 74*se_m_reflect_mvl/mxv .byte W02 .byte PEND .byte PATT .word se_m_reflect_2_000 .byte VOL , 60*se_m_reflect_mvl/mxv .byte W01 .byte 20*se_m_reflect_mvl/mxv .byte W01 .byte 90*se_m_reflect_mvl/mxv .byte N06 , En6 , v048 .byte W02 .byte VOL , 74*se_m_reflect_mvl/mxv .byte W02 .byte 60*se_m_reflect_mvl/mxv .byte W01 .byte 20*se_m_reflect_mvl/mxv .byte W01 .byte 90*se_m_reflect_mvl/mxv .byte N06 , En6 , v044 .byte W02 .byte VOL , 74*se_m_reflect_mvl/mxv .byte W02 .byte 60*se_m_reflect_mvl/mxv .byte W01 .byte 20*se_m_reflect_mvl/mxv .byte W01 .byte 90*se_m_reflect_mvl/mxv .byte N06 , En6 , v040 .byte W02 .byte VOL , 74*se_m_reflect_mvl/mxv .byte W02 .byte 60*se_m_reflect_mvl/mxv .byte W01 .byte 20*se_m_reflect_mvl/mxv .byte W01 .byte 90*se_m_reflect_mvl/mxv .byte N06 , En6 , v036 .byte W02 .byte VOL , 74*se_m_reflect_mvl/mxv .byte W02 .byte 60*se_m_reflect_mvl/mxv .byte W01 .byte 20*se_m_reflect_mvl/mxv .byte W05 .byte FINE @******************************************************@ .align 2 se_m_reflect: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_reflect_pri @ Priority .byte se_m_reflect_rev @ Reverb. .word se_m_reflect_grp .word se_m_reflect_1 .word se_m_reflect_2 .end ================================================ FILE: sound/songs/se_m_reversal.s ================================================ .include "MPlayDef.s" .equ se_m_reversal_grp, voicegroup128 .equ se_m_reversal_pri, 4 .equ se_m_reversal_rev, reverb_set+50 .equ se_m_reversal_mvl, 127 .equ se_m_reversal_key, 0 .equ se_m_reversal_tbs, 1 .equ se_m_reversal_exg, 0 .equ se_m_reversal_cmp, 1 .section .rodata .global se_m_reversal .align 2 @********************** Track 1 **********************@ se_m_reversal_1: .byte KEYSH , se_m_reversal_key+0 .byte TEMPO , 150*se_m_reversal_tbs/2 .byte VOICE , 19 .byte BENDR , 24 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v+0 .byte VOL , 100*se_m_reversal_mvl/mxv .byte N03 , Cn5 , v092 .byte W01 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v-10 .byte BEND , c_v+0 .byte N01 , Gn4 , v127 .byte W01 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v-1 .byte BEND , c_v-33 .byte N03 , Cs5 , v092 .byte W02 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v+10 .byte BEND , c_v+0 .byte N01 , Gs4 , v127 .byte W01 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-33 .byte N03 , Dn5 , v092 .byte W01 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W02 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v-14 .byte BEND , c_v+0 .byte N01 , An4 , v127 .byte W01 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v-1 .byte BEND , c_v-33 .byte N03 , Ds5 , v092 .byte W01 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W02 .byte VOICE , 22 .byte PAN , c_v+14 .byte BEND , c_v+0 .byte N01 , As4 , v127 .byte W01 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-33 .byte N03 , En5 , v092 .byte W01 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v-18 .byte BEND , c_v+0 .byte N01 , Bn4 , v127 .byte W02 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v-1 .byte BEND , c_v-33 .byte N03 , Fn5 , v092 .byte W01 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v+18 .byte BEND , c_v+0 .byte N01 , Cn5 , v127 .byte W01 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-33 .byte N03 , Fs5 , v092 .byte W02 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v-14 .byte BEND , c_v+0 .byte N01 , Cs5 , v127 .byte W01 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v-1 .byte BEND , c_v-33 .byte N03 , Gn5 , v092 .byte W01 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W02 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v+14 .byte BEND , c_v+0 .byte N01 , Dn5 , v127 .byte W01 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-33 .byte N03 , Gs5 , v092 .byte W01 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W02 .byte VOICE , 22 .byte PAN , c_v-10 .byte BEND , c_v+0 .byte N01 , Ds5 , v127 .byte W01 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v-1 .byte BEND , c_v-33 .byte N03 , An5 , v092 .byte W01 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v+10 .byte BEND , c_v+0 .byte N01 , En5 , v127 .byte W02 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-33 .byte N03 , As5 , v092 .byte W01 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v-10 .byte BEND , c_v+0 .byte N01 , Fn5 , v127 .byte W01 .byte VOICE , 19 .byte VOL , 100*se_m_reversal_mvl/mxv .byte PAN , c_v-1 .byte BEND , c_v-33 .byte N03 , Bn5 , v092 .byte W02 .byte VOL , 72*se_m_reversal_mvl/mxv .byte W01 .byte 40*se_m_reversal_mvl/mxv .byte BEND , c_v+31 .byte W01 .byte VOICE , 22 .byte PAN , c_v+10 .byte BEND , c_v+0 .byte N01 , Fs5 , v127 .byte W01 .byte BEND , c_v-33 .byte W03 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_reversal_2: .byte KEYSH , se_m_reversal_key+0 .byte VOICE , 17 .byte VOL , 100*se_m_reversal_mvl/mxv .byte W02 .byte BEND , c_v+31 .byte N03 , Cn5 , v040 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W02 .byte W01 .byte c_v+31 .byte N03 , Cs5 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W03 .byte c_v+31 .byte N03 , Dn5 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W02 .byte c_v+31 .byte N03 , Ds5 .byte W02 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W02 .byte c_v+31 .byte N03 , En5 .byte W01 .byte BEND , c_v+0 .byte W02 .byte c_v-33 .byte W02 .byte c_v+31 .byte N03 , Fn5 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W02 .byte W01 .byte c_v+31 .byte N03 , Fs5 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W03 .byte c_v+31 .byte N03 , Gn5 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W02 .byte c_v+31 .byte N03 , Gs5 .byte W02 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W02 .byte c_v+31 .byte N03 , An5 .byte W01 .byte BEND , c_v+0 .byte W02 .byte c_v-33 .byte W02 .byte c_v+31 .byte N03 , As5 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W02 .byte W01 .byte c_v+31 .byte N03 , Bn5 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W03 .byte c_v+31 .byte N03 , Bn5 , v020 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v-33 .byte W04 .byte FINE @******************************************************@ .align 2 se_m_reversal: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_reversal_pri @ Priority .byte se_m_reversal_rev @ Reverb. .word se_m_reversal_grp .word se_m_reversal_1 .word se_m_reversal_2 .end ================================================ FILE: sound/songs/se_m_rock_throw.s ================================================ .include "MPlayDef.s" .equ se_m_rock_throw_grp, voicegroup128 .equ se_m_rock_throw_pri, 4 .equ se_m_rock_throw_rev, reverb_set+50 .equ se_m_rock_throw_mvl, 127 .equ se_m_rock_throw_key, 0 .equ se_m_rock_throw_tbs, 1 .equ se_m_rock_throw_exg, 0 .equ se_m_rock_throw_cmp, 1 .section .rodata .global se_m_rock_throw .align 2 @********************** Track 1 **********************@ se_m_rock_throw_1: .byte KEYSH , se_m_rock_throw_key+0 .byte TEMPO , 150*se_m_rock_throw_tbs/2 .byte VOICE , 26 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 105*se_m_rock_throw_mvl/mxv .byte BEND , c_v+0 .byte N06 , En3 , v127 .byte W03 .byte PAN , c_v-8 .byte BEND , c_v-34 .byte W03 .byte PAN , c_v+7 .byte N03 , Gn3 , v100 .byte W03 .byte PAN , c_v-15 .byte BEND , c_v+4 .byte N06 , En3 , v127 .byte W03 .byte PAN , c_v+16 .byte BEND , c_v-13 .byte W03 .byte PAN , c_v-1 .byte BEND , c_v+0 .byte N06 , Cn3 , v084 .byte W06 .byte BEND , c_v-20 .byte N06 , En3 , v068 .byte W03 .byte BEND , c_v-41 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_rock_throw: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_rock_throw_pri @ Priority .byte se_m_rock_throw_rev @ Reverb. .word se_m_rock_throw_grp .word se_m_rock_throw_1 .end ================================================ FILE: sound/songs/se_m_sacred_fire.s ================================================ .include "MPlayDef.s" .equ se_m_sacred_fire_grp, voicegroup128 .equ se_m_sacred_fire_pri, 4 .equ se_m_sacred_fire_rev, reverb_set+50 .equ se_m_sacred_fire_mvl, 127 .equ se_m_sacred_fire_key, 0 .equ se_m_sacred_fire_tbs, 1 .equ se_m_sacred_fire_exg, 0 .equ se_m_sacred_fire_cmp, 1 .section .rodata .global se_m_sacred_fire .align 2 @********************** Track 1 **********************@ se_m_sacred_fire_1: .byte KEYSH , se_m_sacred_fire_key+0 .byte TEMPO , 150*se_m_sacred_fire_tbs/2 .byte VOICE , 29 .byte BENDR , 12 .byte VOL , 110*se_m_sacred_fire_mvl/mxv .byte PAN , c_v+5 .byte BEND , c_v+0 .byte N04 , Cn3 , v127 .byte W03 .byte PAN , c_v+0 .byte W01 .byte N18 , Gn4 .byte W02 .byte PAN , c_v-5 .byte W01 .byte VOL , 98*se_m_sacred_fire_mvl/mxv .byte BEND , c_v+2 .byte W02 .byte PAN , c_v+0 .byte W01 .byte VOL , 83*se_m_sacred_fire_mvl/mxv .byte BEND , c_v+6 .byte W02 .byte PAN , c_v+5 .byte W01 .byte BEND , c_v+9 .byte W01 .byte VOL , 63*se_m_sacred_fire_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W01 .byte BEND , c_v+13 .byte W02 .byte VOL , 44*se_m_sacred_fire_mvl/mxv .byte PAN , c_v-5 .byte W02 .byte VOL , 28*se_m_sacred_fire_mvl/mxv .byte BEND , c_v+20 .byte W01 .byte PAN , c_v-2 .byte W01 .byte VOL , 12*se_m_sacred_fire_mvl/mxv .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_sacred_fire_2: .byte KEYSH , se_m_sacred_fire_key+0 .byte VOICE , 27 .byte PAN , c_v+0 .byte VOL , 110*se_m_sacred_fire_mvl/mxv .byte N01 , Gn2 , v032 .byte W02 .byte N01 .byte W02 .byte N18 .byte W03 .byte VOL , 98*se_m_sacred_fire_mvl/mxv .byte W03 .byte 83*se_m_sacred_fire_mvl/mxv .byte W04 .byte 63*se_m_sacred_fire_mvl/mxv .byte W04 .byte 44*se_m_sacred_fire_mvl/mxv .byte W02 .byte 28*se_m_sacred_fire_mvl/mxv .byte W02 .byte 12*se_m_sacred_fire_mvl/mxv .byte W02 .byte FINE @******************************************************@ .align 2 se_m_sacred_fire: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_sacred_fire_pri @ Priority .byte se_m_sacred_fire_rev @ Reverb. .word se_m_sacred_fire_grp .word se_m_sacred_fire_1 .word se_m_sacred_fire_2 .end ================================================ FILE: sound/songs/se_m_sacred_fire2.s ================================================ .include "MPlayDef.s" .equ se_m_sacred_fire2_grp, voicegroup128 .equ se_m_sacred_fire2_pri, 4 .equ se_m_sacred_fire2_rev, reverb_set+50 .equ se_m_sacred_fire2_mvl, 127 .equ se_m_sacred_fire2_key, 0 .equ se_m_sacred_fire2_tbs, 1 .equ se_m_sacred_fire2_exg, 0 .equ se_m_sacred_fire2_cmp, 1 .section .rodata .global se_m_sacred_fire2 .align 2 @********************** Track 1 **********************@ se_m_sacred_fire2_1: .byte KEYSH , se_m_sacred_fire2_key+0 .byte TEMPO , 150*se_m_sacred_fire2_tbs/2 .byte VOICE , 29 .byte BENDR , 12 .byte VOL , 22*se_m_sacred_fire2_mvl/mxv .byte PAN , c_v+5 .byte BEND , c_v+0 .byte N96 , Gn3 , v127 .byte W01 .byte VOL , 49*se_m_sacred_fire2_mvl/mxv .byte W01 .byte 71*se_m_sacred_fire2_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte VOL , 95*se_m_sacred_fire2_mvl/mxv .byte BEND , c_v+8 .byte W01 .byte VOL , 110*se_m_sacred_fire2_mvl/mxv .byte W02 .byte PAN , c_v-5 .byte BEND , c_v+16 .byte W03 .byte VOL , 97*se_m_sacred_fire2_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+7 .byte W03 .byte PAN , c_v+5 .byte BEND , c_v+0 .byte W01 .byte VOL , 84*se_m_sacred_fire2_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte BEND , c_v-9 .byte W03 .byte VOL , 76*se_m_sacred_fire2_mvl/mxv .byte PAN , c_v-5 .byte BEND , c_v-24 .byte W03 .byte PAN , c_v-2 .byte BEND , c_v-46 .byte W03 .byte VOL , 84*se_m_sacred_fire2_mvl/mxv .byte PAN , c_v+5 .byte W03 .byte c_v+0 .byte W01 .byte VOL , 92*se_m_sacred_fire2_mvl/mxv .byte W02 .byte PAN , c_v-5 .byte W01 .byte BEND , c_v-32 .byte W02 .byte PAN , c_v+0 .byte W01 .byte VOL , 86*se_m_sacred_fire2_mvl/mxv .byte W02 .byte PAN , c_v+5 .byte W02 .byte BEND , c_v-18 .byte W01 .byte VOL , 78*se_m_sacred_fire2_mvl/mxv .byte PAN , c_v+0 .byte W03 .byte c_v-5 .byte W02 .byte VOL , 71*se_m_sacred_fire2_mvl/mxv .byte W01 .byte PAN , c_v-2 .byte W03 .byte c_v+5 .byte W03 .byte c_v+0 .byte VOL , 78*se_m_sacred_fire2_mvl/mxv .byte W03 .byte PAN , c_v-5 .byte W02 .byte VOL , 86*se_m_sacred_fire2_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W03 .byte c_v+5 .byte W02 .byte VOL , 90*se_m_sacred_fire2_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W03 .byte c_v-5 .byte W03 .byte c_v-2 .byte W01 .byte VOL , 80*se_m_sacred_fire2_mvl/mxv .byte W02 .byte PAN , c_v+5 .byte W03 .byte c_v+0 .byte W01 .byte VOL , 86*se_m_sacred_fire2_mvl/mxv .byte W02 .byte PAN , c_v-5 .byte W03 .byte c_v+0 .byte VOL , 83*se_m_sacred_fire2_mvl/mxv .byte W03 .byte PAN , c_v+5 .byte VOL , 63*se_m_sacred_fire2_mvl/mxv .byte W03 .byte 37*se_m_sacred_fire2_mvl/mxv .byte PAN , c_v+0 .byte W03 .byte c_v-5 .byte VOL , 13*se_m_sacred_fire2_mvl/mxv .byte W03 .byte PAN , c_v-2 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_sacred_fire2_2: .byte KEYSH , se_m_sacred_fire2_key+0 .byte VOICE , 27 .byte VOL , 22*se_m_sacred_fire2_mvl/mxv .byte N96 , Gn2 , v032 .byte W01 .byte VOL , 49*se_m_sacred_fire2_mvl/mxv .byte W01 .byte 71*se_m_sacred_fire2_mvl/mxv .byte W01 .byte 95*se_m_sacred_fire2_mvl/mxv .byte W01 .byte 110*se_m_sacred_fire2_mvl/mxv .byte W05 .byte 97*se_m_sacred_fire2_mvl/mxv .byte W15 .byte W24 .byte W24 .byte W09 .byte 83*se_m_sacred_fire2_mvl/mxv .byte W03 .byte 63*se_m_sacred_fire2_mvl/mxv .byte W03 .byte 37*se_m_sacred_fire2_mvl/mxv .byte W03 .byte 13*se_m_sacred_fire2_mvl/mxv .byte W06 .byte FINE @******************************************************@ .align 2 se_m_sacred_fire2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_sacred_fire2_pri @ Priority .byte se_m_sacred_fire2_rev @ Reverb. .word se_m_sacred_fire2_grp .word se_m_sacred_fire2_1 .word se_m_sacred_fire2_2 .end ================================================ FILE: sound/songs/se_m_sand_tomb.s ================================================ .include "MPlayDef.s" .equ se_m_sand_tomb_grp, voicegroup128 .equ se_m_sand_tomb_pri, 4 .equ se_m_sand_tomb_rev, reverb_set+50 .equ se_m_sand_tomb_mvl, 127 .equ se_m_sand_tomb_key, 0 .equ se_m_sand_tomb_tbs, 1 .equ se_m_sand_tomb_exg, 0 .equ se_m_sand_tomb_cmp, 1 .section .rodata .global se_m_sand_tomb .align 2 @********************** Track 1 **********************@ se_m_sand_tomb_1: .byte KEYSH , se_m_sand_tomb_key+0 .byte TEMPO , 150*se_m_sand_tomb_tbs/2 .byte VOICE , 22 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 64*se_m_sand_tomb_mvl/mxv .byte BEND , c_v+0 .byte N96 , En2 , v127 .byte W03 .byte VOL , 79*se_m_sand_tomb_mvl/mxv .byte BEND , c_v+22 .byte W02 .byte c_v+8 .byte W01 .byte VOL , 84*se_m_sand_tomb_mvl/mxv .byte PAN , c_v-4 .byte W03 .byte VOL , 91*se_m_sand_tomb_mvl/mxv .byte BEND , c_v+0 .byte W03 .byte VOL , 100*se_m_sand_tomb_mvl/mxv .byte PAN , c_v-8 .byte W03 .byte VOL , 110*se_m_sand_tomb_mvl/mxv .byte W03 .byte PAN , c_v-12 .byte W06 .byte c_v-17 .byte BEND , c_v+0 .byte W03 .byte c_v-7 .byte W03 .byte PAN , c_v-9 .byte BEND , c_v-12 .byte W03 .byte c_v-20 .byte W03 .byte PAN , c_v-3 .byte W03 .byte c_v+6 .byte BEND , c_v-13 .byte W03 .byte PAN , c_v+10 .byte W03 .byte BEND , c_v-6 .byte W03 .byte PAN , c_v+16 .byte W03 .byte BEND , c_v+6 .byte W03 .byte PAN , c_v+13 .byte BEND , c_v+11 .byte W03 .byte c_v+20 .byte W03 .byte PAN , c_v+8 .byte W03 .byte c_v+0 .byte BEND , c_v+12 .byte W03 .byte PAN , c_v-8 .byte BEND , c_v+7 .byte W03 .byte PAN , c_v-11 .byte W03 .byte c_v-17 .byte VOL , 98*se_m_sand_tomb_mvl/mxv .byte BEND , c_v+0 .byte W03 .byte VOL , 90*se_m_sand_tomb_mvl/mxv .byte BEND , c_v-7 .byte W03 .byte PAN , c_v-9 .byte BEND , c_v-12 .byte W01 .byte VOL , 80*se_m_sand_tomb_mvl/mxv .byte W02 .byte BEND , c_v-20 .byte W01 .byte VOL , 71*se_m_sand_tomb_mvl/mxv .byte W02 .byte PAN , c_v-3 .byte W02 .byte VOL , 58*se_m_sand_tomb_mvl/mxv .byte W01 .byte PAN , c_v+6 .byte BEND , c_v-13 .byte W03 .byte PAN , c_v+10 .byte VOL , 45*se_m_sand_tomb_mvl/mxv .byte W02 .byte 27*se_m_sand_tomb_mvl/mxv .byte W01 .byte BEND , c_v-6 .byte W01 .byte VOL , 11*se_m_sand_tomb_mvl/mxv .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_sand_tomb_2: .byte KEYSH , se_m_sand_tomb_key+0 .byte VOICE , 57 .byte PAN , c_v+0 .byte VOL , 110*se_m_sand_tomb_mvl/mxv .byte N03 , Cn3 , v100 .byte W03 .byte En3 , v080 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v100 .byte W04 .byte En3 , v080 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v100 .byte W03 .byte W01 .byte En3 , v080 .byte W03 .byte Dn3 .byte W04 .byte Cn3 , v100 .byte W04 .byte En3 , v080 .byte W03 .byte Dn3 .byte W04 .byte Cn3 , v100 .byte W03 .byte En3 , v080 .byte W02 .byte W02 .byte Dn3 .byte W04 .byte Cn3 , v100 .byte W03 .byte En3 , v080 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v100 .byte W04 .byte En3 , v080 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v092 .byte W04 .byte En3 , v060 .byte W03 .byte Dn3 , v052 .byte W04 .byte Cn3 , v060 .byte W04 .byte En3 , v032 .byte W03 .byte N02 , Dn3 , v020 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_sand_tomb: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_sand_tomb_pri @ Priority .byte se_m_sand_tomb_rev @ Reverb. .word se_m_sand_tomb_grp .word se_m_sand_tomb_1 .word se_m_sand_tomb_2 .end ================================================ FILE: sound/songs/se_m_sandstorm.s ================================================ .include "MPlayDef.s" .equ se_m_sandstorm_grp, voicegroup128 .equ se_m_sandstorm_pri, 4 .equ se_m_sandstorm_rev, reverb_set+50 .equ se_m_sandstorm_mvl, 127 .equ se_m_sandstorm_key, 0 .equ se_m_sandstorm_tbs, 1 .equ se_m_sandstorm_exg, 0 .equ se_m_sandstorm_cmp, 1 .section .rodata .global se_m_sandstorm .align 2 @********************** Track 1 **********************@ se_m_sandstorm_1: .byte KEYSH , se_m_sandstorm_key+0 .byte TEMPO , 200*se_m_sandstorm_tbs/2 .byte VOICE , 2 .byte BENDR , 12 .byte PAN , c_v-48 .byte VOL , 11*se_m_sandstorm_mvl/mxv .byte BEND , c_v+0 .byte TIE , En3 , v127 .byte W03 .byte VOL , 17*se_m_sandstorm_mvl/mxv .byte BEND , c_v+22 .byte W02 .byte c_v+8 .byte W01 .byte VOL , 24*se_m_sandstorm_mvl/mxv .byte W03 .byte 32*se_m_sandstorm_mvl/mxv .byte BEND , c_v+0 .byte W03 .byte VOL , 52*se_m_sandstorm_mvl/mxv .byte W03 .byte 65*se_m_sandstorm_mvl/mxv .byte W03 .byte 76*se_m_sandstorm_mvl/mxv .byte W02 .byte 88*se_m_sandstorm_mvl/mxv .byte PAN , c_v-43 .byte W02 .byte VOL , 98*se_m_sandstorm_mvl/mxv .byte W02 .byte BEND , c_v+0 .byte W02 .byte VOL , 111*se_m_sandstorm_mvl/mxv .byte W01 .byte BEND , c_v-7 .byte W01 .byte VOL , 127*se_m_sandstorm_mvl/mxv .byte W02 .byte BEND , c_v-12 .byte W02 .byte PAN , c_v-38 .byte W01 .byte BEND , c_v-20 .byte W06 .byte c_v-13 .byte W05 .byte PAN , c_v-31 .byte W01 .byte BEND , c_v-6 .byte W03 .byte W03 .byte c_v+6 .byte W03 .byte c_v+11 .byte W03 .byte c_v+20 .byte W01 .byte PAN , c_v-21 .byte W05 .byte BEND , c_v+12 .byte W03 .byte c_v+7 .byte W06 .byte PAN , c_v-16 .byte BEND , c_v+0 .byte W03 .byte c_v-7 .byte W03 .byte c_v-12 .byte W03 .byte c_v-20 .byte W06 .byte PAN , c_v-7 .byte BEND , c_v-13 .byte W06 .byte c_v-6 .byte W03 .byte c_v+0 .byte W03 .byte PAN , c_v+2 .byte BEND , c_v+22 .byte W02 .byte c_v+8 .byte W04 .byte c_v+0 .byte W05 .byte PAN , c_v+10 .byte W10 .byte BEND , c_v+0 .byte W01 .byte PAN , c_v+16 .byte W02 .byte BEND , c_v-7 .byte W03 .byte c_v-12 .byte W03 .byte PAN , c_v+24 .byte BEND , c_v-20 .byte W06 .byte c_v-13 .byte W05 .byte PAN , c_v+32 .byte W01 .byte BEND , c_v-6 .byte W03 .byte W03 .byte c_v+6 .byte W03 .byte c_v+11 .byte W03 .byte c_v+20 .byte W01 .byte PAN , c_v+40 .byte W05 .byte BEND , c_v+12 .byte W03 .byte c_v+7 .byte W04 .byte VOL , 114*se_m_sandstorm_mvl/mxv .byte W02 .byte BEND , c_v+0 .byte W01 .byte PAN , c_v+48 .byte W01 .byte VOL , 104*se_m_sandstorm_mvl/mxv .byte W01 .byte BEND , c_v-7 .byte W03 .byte VOL , 93*se_m_sandstorm_mvl/mxv .byte BEND , c_v-12 .byte W03 .byte VOL , 82*se_m_sandstorm_mvl/mxv .byte BEND , c_v-20 .byte W04 .byte VOL , 67*se_m_sandstorm_mvl/mxv .byte W02 .byte BEND , c_v-13 .byte W01 .byte VOL , 52*se_m_sandstorm_mvl/mxv .byte W03 .byte 32*se_m_sandstorm_mvl/mxv .byte W02 .byte 13*se_m_sandstorm_mvl/mxv .byte BEND , c_v-6 .byte W03 .byte EOT .byte FINE @********************** Track 2 **********************@ se_m_sandstorm_2: .byte KEYSH , se_m_sandstorm_key+0 .byte VOICE , 57 .byte PAN , c_v+0 .byte VOL , 60*se_m_sandstorm_mvl/mxv .byte N03 , Cn3 , v100 .byte W03 .byte En3 , v080 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v100 .byte W04 .byte En3 , v080 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v100 .byte W03 se_m_sandstorm_2_000: .byte W01 .byte N03 , En3 , v080 .byte W03 .byte Dn3 .byte W04 .byte Cn3 , v100 .byte W04 .byte En3 , v080 .byte W03 .byte Dn3 .byte W04 .byte Cn3 , v100 .byte W03 .byte En3 , v080 .byte W02 .byte PEND .byte W02 .byte Dn3 .byte W04 .byte Cn3 , v100 .byte W03 .byte En3 , v080 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v100 .byte W04 .byte En3 , v080 .byte W04 .byte Cn3 , v100 .byte W03 .byte En3 , v080 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v100 .byte W04 .byte En3 , v080 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v100 .byte W03 .byte PATT .word se_m_sandstorm_2_000 .byte W02 .byte N03 , Cn3 , v076 .byte W04 .byte En3 , v064 .byte W03 .byte Dn3 , v060 .byte W04 .byte Cn3 , v076 .byte W03 .byte En3 , v052 .byte W04 .byte Dn3 , v048 .byte W04 .byte Cn3 , v068 .byte W03 .byte En3 , v044 .byte W04 .byte Dn3 , v040 .byte W03 .byte Cn3 , v056 .byte W04 .byte En3 , v032 .byte W04 .byte Dn3 .byte W03 .byte Cn3 , v048 .byte W03 .byte W01 .byte En3 , v024 .byte W03 .byte Dn3 , v020 .byte W04 .byte Cn3 , v036 .byte W04 .byte En3 , v016 .byte W03 .byte Dn3 , v012 .byte W04 .byte Cn3 , v028 .byte W05 .byte FINE @******************************************************@ .align 2 se_m_sandstorm: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_sandstorm_pri @ Priority .byte se_m_sandstorm_rev @ Reverb. .word se_m_sandstorm_grp .word se_m_sandstorm_1 .word se_m_sandstorm_2 .end ================================================ FILE: sound/songs/se_m_screech.s ================================================ .include "MPlayDef.s" .equ se_m_screech_grp, voicegroup128 .equ se_m_screech_pri, 4 .equ se_m_screech_rev, reverb_set+50 .equ se_m_screech_mvl, 127 .equ se_m_screech_key, 0 .equ se_m_screech_tbs, 1 .equ se_m_screech_exg, 0 .equ se_m_screech_cmp, 1 .section .rodata .global se_m_screech .align 2 @********************** Track 1 **********************@ se_m_screech_1: .byte VOL , 110*se_m_screech_mvl/mxv .byte KEYSH , se_m_screech_key+0 .byte TEMPO , 150*se_m_screech_tbs/2 .byte VOICE , 44 .byte BENDR , 2 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N21 , Fs5 , v112 .byte W01 .byte PAN , c_v-5 .byte W01 .byte c_v-10 .byte VOL , 15*se_m_screech_mvl/mxv .byte W01 .byte PAN , c_v-4 .byte VOL , 41*se_m_screech_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte VOL , 69*se_m_screech_mvl/mxv .byte W02 .byte PAN , c_v+4 .byte W01 .byte c_v+10 .byte VOL , 84*se_m_screech_mvl/mxv .byte W01 .byte PAN , c_v+4 .byte W01 .byte VOL , 97*se_m_screech_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte c_v-5 .byte W02 .byte VOL , 110*se_m_screech_mvl/mxv .byte PAN , c_v-10 .byte W01 .byte c_v-4 .byte W01 .byte c_v+0 .byte W01 .byte c_v+4 .byte W01 .byte c_v+10 .byte W02 .byte VOL , 100*se_m_screech_mvl/mxv .byte PAN , c_v+4 .byte W01 .byte VOL , 84*se_m_screech_mvl/mxv .byte PAN , c_v+0 .byte W01 .byte VOL , 55*se_m_screech_mvl/mxv .byte W02 .byte BEND , c_v+0 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_screech_2: .byte VOL , 110*se_m_screech_mvl/mxv .byte KEYSH , se_m_screech_key+0 .byte VOICE , 42 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N21 , Fn6 , v064 .byte W06 .byte PAN , c_v+0 .byte W03 .byte c_v+0 .byte W03 .byte W03 .byte c_v+0 .byte W03 .byte W01 .byte c_v+0 .byte W03 .byte BEND , c_v+0 .byte W02 .byte FINE @******************************************************@ .align 2 se_m_screech: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_screech_pri @ Priority .byte se_m_screech_rev @ Reverb. .word se_m_screech_grp .word se_m_screech_1 .word se_m_screech_2 .end ================================================ FILE: sound/songs/se_m_self_destruct.s ================================================ .include "MPlayDef.s" .equ se_m_self_destruct_grp, voicegroup128 .equ se_m_self_destruct_pri, 4 .equ se_m_self_destruct_rev, reverb_set+50 .equ se_m_self_destruct_mvl, 127 .equ se_m_self_destruct_key, 0 .equ se_m_self_destruct_tbs, 1 .equ se_m_self_destruct_exg, 0 .equ se_m_self_destruct_cmp, 1 .section .rodata .global se_m_self_destruct .align 2 @********************** Track 1 **********************@ se_m_self_destruct_1: .byte KEYSH , se_m_self_destruct_key+0 .byte TEMPO , 150*se_m_self_destruct_tbs/2 .byte VOICE , 41 .byte VOL , 115*se_m_self_destruct_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N01 , Gn3 , v127 .byte W01 .byte Cn3 .byte W01 .byte N24 , An3 .byte W06 .byte PAN , c_v+6 .byte W04 .byte c_v+0 .byte W01 .byte VOL , 102*se_m_self_destruct_mvl/mxv .byte W02 .byte PAN , c_v-8 .byte VOL , 88*se_m_self_destruct_mvl/mxv .byte W03 .byte 78*se_m_self_destruct_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W01 .byte VOL , 67*se_m_self_destruct_mvl/mxv .byte W01 .byte BEND , c_v-2 .byte W01 .byte PAN , c_v+7 .byte VOL , 45*se_m_self_destruct_mvl/mxv .byte W02 .byte BEND , c_v-8 .byte W01 .byte VOL , 13*se_m_self_destruct_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-15 .byte W22 .byte FINE @******************************************************@ .align 2 se_m_self_destruct: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_self_destruct_pri @ Priority .byte se_m_self_destruct_rev @ Reverb. .word se_m_self_destruct_grp .word se_m_self_destruct_1 .end ================================================ FILE: sound/songs/se_m_sing.s ================================================ .include "MPlayDef.s" .equ se_m_sing_grp, voicegroup128 .equ se_m_sing_pri, 4 .equ se_m_sing_rev, reverb_set+50 .equ se_m_sing_mvl, 127 .equ se_m_sing_key, 0 .equ se_m_sing_tbs, 1 .equ se_m_sing_exg, 0 .equ se_m_sing_cmp, 1 .section .rodata .global se_m_sing .align 2 @********************** Track 1 **********************@ se_m_sing_1: .byte KEYSH , se_m_sing_key+0 .byte TEMPO , 100*se_m_sing_tbs/2 .byte VOICE , 73 .byte BENDR , 12 .byte LFOS , 40 .byte PAN , c_v+0 .byte VOL , 95*se_m_sing_mvl/mxv .byte BEND , c_v+0 .byte N44 , Gn4 , v112 .byte W06 .byte W06 .byte W03 .byte MOD , 7 .byte W03 .byte W03 .byte VOL , 83*se_m_sing_mvl/mxv .byte W03 .byte W03 .byte 69*se_m_sing_mvl/mxv .byte W03 .byte W03 .byte 50*se_m_sing_mvl/mxv .byte W03 .byte W03 .byte 24*se_m_sing_mvl/mxv .byte W03 .byte W03 .byte MOD , 0 .byte W03 .byte VOL , 95*se_m_sing_mvl/mxv .byte N21 , Fn5 .byte W06 .byte W06 se_m_sing_1_000: .byte VOL , 86*se_m_sing_mvl/mxv .byte MOD , 7 .byte W03 .byte VOL , 75*se_m_sing_mvl/mxv .byte W03 .byte PEND se_m_sing_1_001: .byte VOL , 55*se_m_sing_mvl/mxv .byte W03 .byte 26*se_m_sing_mvl/mxv .byte MOD , 0 .byte W03 .byte PEND .byte VOL , 95*se_m_sing_mvl/mxv .byte N21 , Ds5 , v112 .byte W06 .byte W06 .byte PATT .word se_m_sing_1_000 .byte PATT .word se_m_sing_1_001 .byte VOL , 95*se_m_sing_mvl/mxv .byte N66 , Gn4 , v112 .byte W06 .byte W06 .byte W06 .byte W06 .byte MOD , 7 .byte W06 .byte W06 .byte W06 .byte VOL , 83*se_m_sing_mvl/mxv .byte W06 .byte 69*se_m_sing_mvl/mxv .byte W06 .byte 50*se_m_sing_mvl/mxv .byte W06 .byte 24*se_m_sing_mvl/mxv .byte W06 .byte MOD , 0 .byte W06 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_sing_2: .byte KEYSH , se_m_sing_key+0 .byte VOICE , 73 .byte LFOS , 40 .byte VOL , 95*se_m_sing_mvl/mxv .byte BEND , c_v+9 .byte W06 .byte W06 .byte PAN , c_v+12 .byte N44 , Gn4 , v060 .byte W06 .byte W06 .byte W03 .byte MOD , 7 .byte W03 .byte W03 .byte VOL , 83*se_m_sing_mvl/mxv .byte W03 .byte W03 .byte 69*se_m_sing_mvl/mxv .byte W03 .byte W03 .byte 50*se_m_sing_mvl/mxv .byte W03 .byte W03 .byte 24*se_m_sing_mvl/mxv .byte W03 .byte W03 .byte MOD , 0 .byte W03 .byte VOL , 95*se_m_sing_mvl/mxv .byte PAN , c_v-12 .byte N21 , Fn5 .byte W06 .byte W06 se_m_sing_2_000: .byte VOL , 86*se_m_sing_mvl/mxv .byte MOD , 7 .byte W03 .byte VOL , 75*se_m_sing_mvl/mxv .byte W03 .byte PEND se_m_sing_2_001: .byte VOL , 55*se_m_sing_mvl/mxv .byte W03 .byte 26*se_m_sing_mvl/mxv .byte MOD , 0 .byte W03 .byte PEND .byte VOL , 95*se_m_sing_mvl/mxv .byte PAN , c_v+12 .byte N21 , Ds5 , v060 .byte W06 .byte W06 .byte PATT .word se_m_sing_2_000 .byte PATT .word se_m_sing_2_001 .byte VOL , 95*se_m_sing_mvl/mxv .byte PAN , c_v-12 .byte N66 , Gn4 , v060 .byte W06 .byte W06 .byte PAN , c_v-8 .byte W06 .byte W06 .byte MOD , 7 .byte PAN , c_v+0 .byte W06 .byte W06 .byte c_v+7 .byte W06 .byte VOL , 83*se_m_sing_mvl/mxv .byte W06 .byte 69*se_m_sing_mvl/mxv .byte PAN , c_v+15 .byte W06 .byte VOL , 50*se_m_sing_mvl/mxv .byte W06 .byte 24*se_m_sing_mvl/mxv .byte PAN , c_v+8 .byte W06 .byte MOD , 0 .byte FINE @******************************************************@ .align 2 se_m_sing: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_sing_pri @ Priority .byte se_m_sing_rev @ Reverb. .word se_m_sing_grp .word se_m_sing_1 .word se_m_sing_2 .end ================================================ FILE: sound/songs/se_m_sketch.s ================================================ .include "MPlayDef.s" .equ se_m_sketch_grp, voicegroup128 .equ se_m_sketch_pri, 4 .equ se_m_sketch_rev, reverb_set+50 .equ se_m_sketch_mvl, 127 .equ se_m_sketch_key, 0 .equ se_m_sketch_tbs, 1 .equ se_m_sketch_exg, 0 .equ se_m_sketch_cmp, 1 .section .rodata .global se_m_sketch .align 2 @********************** Track 1 **********************@ se_m_sketch_1: .byte KEYSH , se_m_sketch_key+0 .byte TEMPO , 180*se_m_sketch_tbs/2 .byte VOICE , 38 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_sketch_mvl/mxv .byte BEND , c_v+0 .byte N02 , Gn4 , v127 .byte W01 .byte VOL , 74*se_m_sketch_mvl/mxv .byte BEND , c_v-11 .byte W01 .byte VOICE , 31 .byte VOL , 40*se_m_sketch_mvl/mxv .byte BEND , c_v-1 .byte N03 , Cs5 .byte W01 .byte VOL , 64*se_m_sketch_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v-12 .byte W01 .byte VOL , 86*se_m_sketch_mvl/mxv .byte PAN , c_v+4 .byte BEND , c_v-16 .byte W02 .byte VOL , 110*se_m_sketch_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , As5 .byte W01 .byte BEND , c_v+12 .byte W01 .byte VOL , 0*se_m_sketch_mvl/mxv .byte W04 .byte FINE @******************************************************@ .align 2 se_m_sketch: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_sketch_pri @ Priority .byte se_m_sketch_rev @ Reverb. .word se_m_sketch_grp .word se_m_sketch_1 .end ================================================ FILE: sound/songs/se_m_sky_uppercut.s ================================================ .include "MPlayDef.s" .equ se_m_sky_uppercut_grp, voicegroup128 .equ se_m_sky_uppercut_pri, 4 .equ se_m_sky_uppercut_rev, reverb_set+50 .equ se_m_sky_uppercut_mvl, 127 .equ se_m_sky_uppercut_key, 0 .equ se_m_sky_uppercut_tbs, 1 .equ se_m_sky_uppercut_exg, 0 .equ se_m_sky_uppercut_cmp, 1 .section .rodata .global se_m_sky_uppercut .align 2 @********************** Track 1 **********************@ se_m_sky_uppercut_1: .byte KEYSH , se_m_sky_uppercut_key+0 .byte TEMPO , 220*se_m_sky_uppercut_tbs/2 .byte VOICE , 41 .byte VOL , 110*se_m_sky_uppercut_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+6 .byte BEND , c_v+0 .byte N02 , Cn4 , v127 .byte W03 .byte VOL , 104*se_m_sky_uppercut_mvl/mxv .byte W03 .byte 93*se_m_sky_uppercut_mvl/mxv .byte PAN , c_v-6 .byte N02 , Cn5 .byte W03 .byte VOL , 110*se_m_sky_uppercut_mvl/mxv .byte W01 .byte VOICE , 22 .byte PAN , c_v+0 .byte N24 , Cn4 , v060 .byte W02 .byte W02 .byte BEND , c_v+0 .byte W04 .byte c_v+1 .byte W03 .byte c_v+1 .byte W01 .byte VOL , 105*se_m_sky_uppercut_mvl/mxv .byte W02 .byte BEND , c_v+0 .byte W01 .byte VOL , 103*se_m_sky_uppercut_mvl/mxv .byte W02 .byte 91*se_m_sky_uppercut_mvl/mxv .byte BEND , c_v+0 .byte W03 .byte VOL , 77*se_m_sky_uppercut_mvl/mxv .byte BEND , c_v-1 .byte W02 .byte VOL , 61*se_m_sky_uppercut_mvl/mxv .byte BEND , c_v-2 .byte W01 .byte VOL , 38*se_m_sky_uppercut_mvl/mxv .byte W01 .byte 15*se_m_sky_uppercut_mvl/mxv .byte BEND , c_v-3 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_sky_uppercut_2: .byte KEYSH , se_m_sky_uppercut_key+0 .byte VOICE , 4 .byte VOL , 110*se_m_sky_uppercut_mvl/mxv .byte N02 , Cn3 , v060 .byte W03 .byte Gn2 .byte W03 .byte Gs4 .byte W04 .byte Gs4 , v020 .byte W02 .byte W06 .byte W06 .byte W06 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_sky_uppercut: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_sky_uppercut_pri @ Priority .byte se_m_sky_uppercut_rev @ Reverb. .word se_m_sky_uppercut_grp .word se_m_sky_uppercut_1 .word se_m_sky_uppercut_2 .end ================================================ FILE: sound/songs/se_m_snore.s ================================================ .include "MPlayDef.s" .equ se_m_snore_grp, voicegroup128 .equ se_m_snore_pri, 4 .equ se_m_snore_rev, reverb_set+50 .equ se_m_snore_mvl, 127 .equ se_m_snore_key, 0 .equ se_m_snore_tbs, 1 .equ se_m_snore_exg, 0 .equ se_m_snore_cmp, 1 .section .rodata .global se_m_snore .align 2 @********************** Track 1 **********************@ se_m_snore_1: .byte KEYSH , se_m_snore_key+0 .byte TEMPO , 220*se_m_snore_tbs/2 .byte VOICE , 38 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 27*se_m_snore_mvl/mxv .byte BEND , c_v+0 .byte N10 , An1 , v127 .byte W01 .byte VOL , 75*se_m_snore_mvl/mxv .byte W01 .byte 120*se_m_snore_mvl/mxv .byte W04 .byte W02 .byte 75*se_m_snore_mvl/mxv .byte W01 .byte 28*se_m_snore_mvl/mxv .byte W03 .byte VOICE , 36 .byte VOL , 83*se_m_snore_mvl/mxv .byte N18 , En2 , v112 .byte W02 .byte VOL , 87*se_m_snore_mvl/mxv .byte W02 .byte 91*se_m_snore_mvl/mxv .byte W02 .byte W01 .byte 97*se_m_snore_mvl/mxv .byte W02 .byte 102*se_m_snore_mvl/mxv .byte W01 .byte 109*se_m_snore_mvl/mxv .byte W02 .byte 113*se_m_snore_mvl/mxv .byte W01 .byte 120*se_m_snore_mvl/mxv .byte W05 .byte FINE @********************** Track 2 **********************@ se_m_snore_2: .byte VOL , 120*se_m_snore_mvl/mxv .byte KEYSH , se_m_snore_key+0 .byte VOICE , 27 .byte N01 , En2 , v052 .byte W02 .byte Dn2 .byte W02 .byte En2 .byte W02 .byte W01 .byte Dn2 .byte W02 .byte En2 .byte W03 .byte W01 .byte En2 , v064 .byte W02 .byte Gs2 .byte W03 .byte Dn3 .byte W02 .byte En2 .byte W02 .byte Gs2 .byte W02 .byte W01 .byte Dn3 .byte W05 .byte FINE @******************************************************@ .align 2 se_m_snore: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_snore_pri @ Priority .byte se_m_snore_rev @ Reverb. .word se_m_snore_grp .word se_m_snore_1 .word se_m_snore_2 .end ================================================ FILE: sound/songs/se_m_solar_beam.s ================================================ .include "MPlayDef.s" .equ se_m_solar_beam_grp, voicegroup128 .equ se_m_solar_beam_pri, 4 .equ se_m_solar_beam_rev, reverb_set+50 .equ se_m_solar_beam_mvl, 127 .equ se_m_solar_beam_key, 0 .equ se_m_solar_beam_tbs, 1 .equ se_m_solar_beam_exg, 0 .equ se_m_solar_beam_cmp, 1 .section .rodata .global se_m_solar_beam .align 2 @********************** Track 1 **********************@ se_m_solar_beam_1: .byte KEYSH , se_m_solar_beam_key+0 .byte TEMPO , 150*se_m_solar_beam_tbs/2 .byte VOICE , 36 .byte BENDR , 24 .byte VOL , 25*se_m_solar_beam_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+63 .byte TIE , Cn4 , v112 .byte W04 .byte VOL , 40*se_m_solar_beam_mvl/mxv .byte W02 .byte PAN , c_v-4 .byte BEND , c_v+52 .byte W03 .byte VOL , 55*se_m_solar_beam_mvl/mxv .byte W03 .byte PAN , c_v-10 .byte BEND , c_v+41 .byte W03 .byte VOL , 80*se_m_solar_beam_mvl/mxv .byte W03 .byte PAN , c_v-5 .byte BEND , c_v+30 .byte W06 .byte PAN , c_v+0 .byte BEND , c_v+22 .byte W01 .byte VOL , 100*se_m_solar_beam_mvl/mxv .byte W05 .byte PAN , c_v+4 .byte BEND , c_v+63 .byte W06 .byte PAN , c_v+11 .byte BEND , c_v+52 .byte W06 .byte PAN , c_v+4 .byte BEND , c_v+41 .byte W04 .byte c_v+33 .byte W02 .byte PAN , c_v+0 .byte W03 .byte BEND , c_v+25 .byte W03 .byte PAN , c_v-4 .byte W03 .byte BEND , c_v+22 .byte W03 .byte PAN , c_v-10 .byte W06 .byte c_v-5 .byte BEND , c_v+17 .byte W06 .byte PAN , c_v+0 .byte BEND , c_v+9 .byte W06 .byte PAN , c_v+4 .byte W02 .byte BEND , c_v+4 .byte W04 .byte PAN , c_v+11 .byte W06 .byte c_v+4 .byte BEND , c_v+0 .byte W06 .byte PAN , c_v+0 .byte W06 .byte c_v-4 .byte W02 .byte BEND , c_v-3 .byte W04 .byte PAN , c_v-10 .byte W06 .byte c_v-5 .byte W04 .byte BEND , c_v-5 .byte W02 .byte PAN , c_v+0 .byte W06 .byte c_v+4 .byte W02 .byte BEND , c_v-7 .byte W04 .byte PAN , c_v+11 .byte W06 .byte c_v+4 .byte W01 .byte BEND , c_v-10 .byte W05 .byte PAN , c_v+0 .byte W03 .byte BEND , c_v-13 .byte W03 .byte PAN , c_v-4 .byte W06 .byte c_v-10 .byte BEND , c_v-18 .byte W03 .byte VOL , 89*se_m_solar_beam_mvl/mxv .byte W03 .byte PAN , c_v-5 .byte W02 .byte VOL , 74*se_m_solar_beam_mvl/mxv .byte BEND , c_v-25 .byte W04 .byte PAN , c_v+0 .byte W02 .byte VOL , 62*se_m_solar_beam_mvl/mxv .byte W01 .byte BEND , c_v-32 .byte W03 .byte PAN , c_v+4 .byte W01 .byte VOL , 45*se_m_solar_beam_mvl/mxv .byte W01 .byte BEND , c_v-40 .byte W04 .byte VOL , 28*se_m_solar_beam_mvl/mxv .byte PAN , c_v+11 .byte BEND , c_v-49 .byte W03 .byte c_v-64 .byte W01 .byte VOL , 10*se_m_solar_beam_mvl/mxv .byte W02 .byte PAN , c_v+4 .byte W02 .byte VOL , 5*se_m_solar_beam_mvl/mxv .byte W04 .byte EOT .byte FINE @******************************************************@ .align 2 se_m_solar_beam: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_solar_beam_pri @ Priority .byte se_m_solar_beam_rev @ Reverb. .word se_m_solar_beam_grp .word se_m_solar_beam_1 .end ================================================ FILE: sound/songs/se_m_spit_up.s ================================================ .include "MPlayDef.s" .equ se_m_spit_up_grp, voicegroup128 .equ se_m_spit_up_pri, 4 .equ se_m_spit_up_rev, reverb_set+50 .equ se_m_spit_up_mvl, 127 .equ se_m_spit_up_key, 0 .equ se_m_spit_up_tbs, 1 .equ se_m_spit_up_exg, 0 .equ se_m_spit_up_cmp, 1 .section .rodata .global se_m_spit_up .align 2 @********************** Track 1 **********************@ se_m_spit_up_1: .byte KEYSH , se_m_spit_up_key+0 .byte TEMPO , 150*se_m_spit_up_tbs/2 .byte VOICE , 65 .byte BENDR , 12 .byte VOL , 110*se_m_spit_up_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N03 , Gn3 , v112 .byte W01 .byte PAN , c_v-7 .byte BEND , c_v-17 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v-36 .byte W01 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N03 , Gn4 .byte W02 .byte PAN , c_v-7 .byte BEND , c_v+15 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v+28 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N03 , Gn4 , v064 .byte W01 .byte PAN , c_v-7 .byte BEND , c_v+15 .byte W02 .byte PAN , c_v+8 .byte BEND , c_v+28 .byte W03 .byte FINE @********************** Track 2 **********************@ se_m_spit_up_2: .byte KEYSH , se_m_spit_up_key+0 .byte VOICE , 57 .byte VOL , 110*se_m_spit_up_mvl/mxv .byte N03 , En3 , v052 .byte W03 .byte W01 .byte N03 .byte W02 .byte W03 .byte En3 , v032 .byte W03 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_spit_up: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_spit_up_pri @ Priority .byte se_m_spit_up_rev @ Reverb. .word se_m_spit_up_grp .word se_m_spit_up_1 .word se_m_spit_up_2 .end ================================================ FILE: sound/songs/se_m_stat_decrease.s ================================================ .include "MPlayDef.s" .equ se_m_stat_decrease_grp, voicegroup128 .equ se_m_stat_decrease_pri, 4 .equ se_m_stat_decrease_rev, reverb_set+50 .equ se_m_stat_decrease_mvl, 127 .equ se_m_stat_decrease_key, 0 .equ se_m_stat_decrease_tbs, 1 .equ se_m_stat_decrease_exg, 0 .equ se_m_stat_decrease_cmp, 1 .section .rodata .global se_m_stat_decrease .align 2 @********************** Track 1 **********************@ se_m_stat_decrease_1: .byte KEYSH , se_m_stat_decrease_key+0 .byte TEMPO , 170*se_m_stat_decrease_tbs/2 .byte VOICE , 67 .byte VOL , 70*se_m_stat_decrease_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+42 .byte N02 , Cs6 , v076 .byte W01 .byte BEND , c_v+31 .byte W01 .byte c_v+24 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+16 .byte N02 , Cs5 .byte W01 .byte BEND , c_v+12 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+8 .byte N02 , Fs5 .byte W01 .byte BEND , c_v+5 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+0 .byte N02 , Fs4 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+42 .byte N02 , Cn6 .byte W01 .byte BEND , c_v+31 .byte W01 .byte c_v+24 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+16 .byte N02 , Cn5 .byte W01 .byte BEND , c_v+12 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+8 .byte N02 , Fn5 .byte W01 .byte BEND , c_v+5 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+0 .byte N02 , Fn4 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+42 .byte N02 , Bn5 .byte W01 .byte BEND , c_v+31 .byte W01 .byte c_v+24 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+16 .byte N02 , Bn4 .byte W01 .byte BEND , c_v+12 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+8 .byte N02 , En5 .byte W01 .byte BEND , c_v+5 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+0 .byte N02 , En4 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+42 .byte N02 , As5 .byte W01 .byte BEND , c_v+31 .byte W01 .byte c_v+24 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+16 .byte N02 , As4 .byte W01 .byte BEND , c_v+12 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+8 .byte N02 , Ds5 .byte W01 .byte BEND , c_v+5 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+0 .byte N02 , Ds4 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+42 .byte N02 , An5 .byte W01 .byte BEND , c_v+31 .byte W01 .byte c_v+24 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+16 .byte N02 , An4 .byte W01 .byte BEND , c_v+12 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+8 .byte N02 , Cs5 , v056 .byte W01 .byte BEND , c_v+5 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v-12 .byte BEND , c_v+0 .byte N02 , Cs4 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+42 .byte N02 , An5 .byte W01 .byte BEND , c_v+31 .byte W01 .byte c_v+24 .byte W01 .byte PAN , c_v+12 .byte BEND , c_v+16 .byte N02 , An4 .byte W01 .byte BEND , c_v+12 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+8 .byte N02 , Cs5 , v032 .byte W01 .byte BEND , c_v+5 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v-16 .byte BEND , c_v+0 .byte N02 , Cs4 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+42 .byte N02 , An5 .byte W01 .byte BEND , c_v+31 .byte W01 .byte c_v+24 .byte W01 .byte PAN , c_v+16 .byte BEND , c_v+16 .byte N02 , An4 .byte W01 .byte BEND , c_v+12 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_stat_decrease_2: .byte KEYSH , se_m_stat_decrease_key+0 .byte VOICE , 55 .byte XCMD , xIECV , 10 .byte xIECL , 8 .byte VOL , 70*se_m_stat_decrease_mvl/mxv .byte N02 , As3 , v052 .byte W03 .byte N02 .byte W03 .byte W01 .byte An3 .byte W03 .byte N02 .byte W02 .byte W02 .byte Gs3 .byte W04 .byte N02 .byte W03 .byte Gn3 .byte W03 .byte W01 .byte N02 .byte W03 .byte Fs3 .byte W02 .byte W02 .byte N02 .byte W04 .byte Fn3 .byte W03 .byte N02 .byte W03 .byte W01 .byte En3 .byte W03 .byte N02 .byte W02 .byte W02 .byte Ds3 .byte W04 .byte Ds3 , v032 .byte W03 .byte Dn3 .byte W03 .byte W01 .byte N02 .byte W03 .byte Cs3 , v020 .byte W02 .byte W02 .byte N02 .byte W04 .byte Cn3 , v012 .byte W03 .byte N02 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_stat_decrease: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_stat_decrease_pri @ Priority .byte se_m_stat_decrease_rev @ Reverb. .word se_m_stat_decrease_grp .word se_m_stat_decrease_1 .word se_m_stat_decrease_2 .end ================================================ FILE: sound/songs/se_m_stat_increase.s ================================================ .include "MPlayDef.s" .equ se_m_stat_increase_grp, voicegroup128 .equ se_m_stat_increase_pri, 4 .equ se_m_stat_increase_rev, reverb_set+50 .equ se_m_stat_increase_mvl, 127 .equ se_m_stat_increase_key, 0 .equ se_m_stat_increase_tbs, 1 .equ se_m_stat_increase_exg, 0 .equ se_m_stat_increase_cmp, 1 .section .rodata .global se_m_stat_increase .align 2 @********************** Track 1 **********************@ se_m_stat_increase_1: .byte KEYSH , se_m_stat_increase_key+0 .byte TEMPO , 170*se_m_stat_increase_tbs/2 .byte VOICE , 67 .byte VOL , 70*se_m_stat_increase_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , An5 , v076 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+5 .byte N02 , An4 .byte W01 .byte BEND , c_v+8 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte N02 , Dn5 .byte W01 .byte BEND , c_v+16 .byte W01 .byte c_v+23 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+32 .byte N02 , Dn4 .byte W01 .byte BEND , c_v+42 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , As5 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+5 .byte N02 , As4 .byte W01 .byte BEND , c_v+8 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte N02 , Ds5 .byte W01 .byte BEND , c_v+16 .byte W01 .byte c_v+23 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+32 .byte N02 , Ds4 .byte W01 .byte BEND , c_v+42 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , Bn5 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+5 .byte N02 , Bn4 .byte W01 .byte BEND , c_v+8 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte N02 , En5 .byte W01 .byte BEND , c_v+16 .byte W01 .byte c_v+23 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+32 .byte N02 , En4 .byte W01 .byte BEND , c_v+42 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , Cn6 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+5 .byte N02 , Cn5 .byte W01 .byte BEND , c_v+8 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte N02 , Fn5 .byte W01 .byte BEND , c_v+16 .byte W01 .byte c_v+23 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+32 .byte N02 , Fn4 .byte W01 .byte BEND , c_v+42 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , Cs6 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+5 .byte N02 , Cs5 .byte W01 .byte BEND , c_v+8 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte N02 , Fn5 , v056 .byte W01 .byte BEND , c_v+16 .byte W01 .byte c_v+23 .byte W01 .byte PAN , c_v-12 .byte BEND , c_v+32 .byte N02 , Fn4 .byte W01 .byte BEND , c_v+42 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , Cs6 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v+12 .byte BEND , c_v+5 .byte N02 , Cs5 .byte W01 .byte BEND , c_v+8 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte N02 , Fn5 , v032 .byte W01 .byte BEND , c_v+16 .byte W01 .byte c_v+23 .byte W01 .byte PAN , c_v-16 .byte BEND , c_v+32 .byte N02 , Fn4 .byte W01 .byte BEND , c_v+42 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , Cs6 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte PAN , c_v+16 .byte BEND , c_v+5 .byte N02 , Cs5 .byte W01 .byte BEND , c_v+8 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_stat_increase_2: .byte KEYSH , se_m_stat_increase_key+0 .byte VOICE , 55 .byte XCMD , xIECV , 10 .byte xIECL , 8 .byte VOL , 70*se_m_stat_increase_mvl/mxv .byte N02 , Cn3 , v052 .byte W03 .byte N02 .byte W03 .byte W01 .byte Cs3 .byte W03 .byte N02 .byte W02 .byte W02 .byte Dn3 .byte W04 .byte N02 .byte W03 .byte Ds3 .byte W03 .byte W01 .byte N02 .byte W03 .byte En3 .byte W02 .byte W02 .byte N02 .byte W04 .byte Fn3 .byte W03 .byte N02 .byte W03 .byte W01 .byte Fs3 .byte W03 .byte N02 .byte W02 .byte W02 .byte Gn3 .byte W04 .byte Gn3 , v032 .byte W03 .byte Gs3 .byte W03 .byte W01 .byte N02 .byte W03 .byte An3 , v020 .byte W02 .byte W02 .byte N02 .byte W04 .byte As3 , v012 .byte W03 .byte N02 .byte W03 .byte FINE @******************************************************@ .align 2 se_m_stat_increase: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_stat_increase_pri @ Priority .byte se_m_stat_increase_rev @ Reverb. .word se_m_stat_increase_grp .word se_m_stat_increase_1 .word se_m_stat_increase_2 .end ================================================ FILE: sound/songs/se_m_strength.s ================================================ .include "MPlayDef.s" .equ se_m_strength_grp, voicegroup128 .equ se_m_strength_pri, 4 .equ se_m_strength_rev, reverb_set+50 .equ se_m_strength_mvl, 127 .equ se_m_strength_key, 0 .equ se_m_strength_tbs, 1 .equ se_m_strength_exg, 0 .equ se_m_strength_cmp, 1 .section .rodata .global se_m_strength .align 2 @********************** Track 1 **********************@ se_m_strength_1: .byte KEYSH , se_m_strength_key+0 .byte TEMPO , 150*se_m_strength_tbs/2 .byte VOICE , 26 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_strength_mvl/mxv .byte BEND , c_v+0 .byte N03 , Gn2 , v127 .byte W03 .byte PAN , c_v+6 .byte N03 , Fs2 , v120 .byte W04 .byte PAN , c_v-6 .byte N03 , Fn2 , v116 .byte W03 .byte PAN , c_v+11 .byte N03 , En2 , v112 .byte W04 .byte PAN , c_v-11 .byte N03 , Ds2 , v108 .byte W04 .byte PAN , c_v+0 .byte N03 , Dn2 , v100 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_strength_2: .byte KEYSH , se_m_strength_key+0 .byte VOICE , 5 .byte PAN , c_v+0 .byte VOL , 110*se_m_strength_mvl/mxv .byte N02 , Fn2 , v072 .byte W02 .byte N01 .byte W01 .byte N02 , Gn2 .byte W03 .byte N01 , Gs2 , v060 .byte W01 .byte N02 , Cn3 , v040 .byte W03 .byte Cn3 , v032 .byte W04 .byte N01 , Cn3 , v028 .byte W04 .byte Cn3 , v020 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_strength: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_strength_pri @ Priority .byte se_m_strength_rev @ Reverb. .word se_m_strength_grp .word se_m_strength_1 .word se_m_strength_2 .end ================================================ FILE: sound/songs/se_m_string_shot.s ================================================ .include "MPlayDef.s" .equ se_m_string_shot_grp, voicegroup128 .equ se_m_string_shot_pri, 4 .equ se_m_string_shot_rev, reverb_set+50 .equ se_m_string_shot_mvl, 127 .equ se_m_string_shot_key, 0 .equ se_m_string_shot_tbs, 1 .equ se_m_string_shot_exg, 0 .equ se_m_string_shot_cmp, 1 .section .rodata .global se_m_string_shot .align 2 @********************** Track 1 **********************@ se_m_string_shot_1: .byte KEYSH , se_m_string_shot_key+0 .byte TEMPO , 250*se_m_string_shot_tbs/2 .byte VOICE , 22 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_string_shot_mvl/mxv .byte BEND , c_v+0 .byte N48 , Fn4 , v108 .byte W03 .byte PAN , c_v+5 .byte BEND , c_v+6 .byte W03 .byte PAN , c_v+15 .byte BEND , c_v+12 .byte W03 .byte PAN , c_v+6 .byte BEND , c_v+21 .byte W02 .byte c_v+8 .byte W01 .byte PAN , c_v-1 .byte W03 .byte c_v-9 .byte BEND , c_v-8 .byte W03 .byte PAN , c_v-15 .byte BEND , c_v-14 .byte W03 .byte PAN , c_v-9 .byte BEND , c_v-8 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte W06 .byte VOL , 90*se_m_string_shot_mvl/mxv .byte W03 .byte 71*se_m_string_shot_mvl/mxv .byte W03 .byte 58*se_m_string_shot_mvl/mxv .byte W03 .byte 41*se_m_string_shot_mvl/mxv .byte W03 .byte 27*se_m_string_shot_mvl/mxv .byte W03 .byte 7*se_m_string_shot_mvl/mxv .byte W03 .byte FINE @******************************************************@ .align 2 se_m_string_shot: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_string_shot_pri @ Priority .byte se_m_string_shot_rev @ Reverb. .word se_m_string_shot_grp .word se_m_string_shot_1 .end ================================================ FILE: sound/songs/se_m_string_shot2.s ================================================ .include "MPlayDef.s" .equ se_m_string_shot2_grp, voicegroup128 .equ se_m_string_shot2_pri, 4 .equ se_m_string_shot2_rev, reverb_set+50 .equ se_m_string_shot2_mvl, 127 .equ se_m_string_shot2_key, 0 .equ se_m_string_shot2_tbs, 1 .equ se_m_string_shot2_exg, 0 .equ se_m_string_shot2_cmp, 1 .section .rodata .global se_m_string_shot2 .align 2 @********************** Track 1 **********************@ se_m_string_shot2_1: .byte KEYSH , se_m_string_shot2_key+0 .byte TEMPO , 250*se_m_string_shot2_tbs/2 .byte VOICE , 10 .byte BENDR , 12 .byte VOL , 105*se_m_string_shot2_mvl/mxv .byte PAN , c_v-1 .byte BEND , c_v+0 .byte N09 , En4 , v112 .byte W03 .byte BEND , c_v+6 .byte W03 .byte c_v+12 .byte W05 .byte c_v+8 .byte W01 .byte PAN , c_v+16 .byte N09 , Gn4 .byte W03 .byte BEND , c_v-8 .byte W03 .byte c_v-14 .byte W06 .byte PAN , c_v+0 .byte BEND , c_v-11 .byte N09 , En4 .byte W03 .byte BEND , c_v-5 .byte W03 .byte c_v+1 .byte W05 .byte c_v-3 .byte W01 .byte PAN , c_v-16 .byte N09 , Gn4 .byte W03 .byte BEND , c_v-19 .byte W03 .byte c_v-25 .byte W06 .byte PAN , c_v+0 .byte BEND , c_v-19 .byte N09 , En4 .byte W03 .byte BEND , c_v-13 .byte W03 .byte c_v-6 .byte W05 .byte c_v-10 .byte W01 .byte PAN , c_v+16 .byte N09 , Gn4 , v096 .byte W03 .byte BEND , c_v-27 .byte W03 .byte c_v-32 .byte W06 .byte PAN , c_v+0 .byte BEND , c_v-32 .byte N09 , En4 , v084 .byte W03 .byte BEND , c_v-26 .byte W03 .byte c_v-19 .byte W05 .byte c_v-23 .byte W01 .byte PAN , c_v-16 .byte N09 , Gn4 , v060 .byte W03 .byte BEND , c_v-40 .byte W03 .byte c_v-45 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_string_shot2_2: .byte KEYSH , se_m_string_shot2_key+0 .byte VOICE , 5 .byte VOL , 105*se_m_string_shot2_mvl/mxv .byte PAN , c_v+9 .byte N09 , Cn3 , v052 .byte W12 .byte PAN , c_v-7 .byte N09 , Gn2 .byte W12 se_m_string_shot2_2_000: .byte PAN , c_v+9 .byte N09 , Cn3 , v052 .byte W12 .byte PAN , c_v-6 .byte N09 , Gn2 .byte W12 .byte PEND .byte PATT .word se_m_string_shot2_2_000 .byte PATT .word se_m_string_shot2_2_000 .byte FINE @******************************************************@ .align 2 se_m_string_shot2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_string_shot2_pri @ Priority .byte se_m_string_shot2_rev @ Reverb. .word se_m_string_shot2_grp .word se_m_string_shot2_1 .word se_m_string_shot2_2 .end ================================================ FILE: sound/songs/se_m_supersonic.s ================================================ .include "MPlayDef.s" .equ se_m_supersonic_grp, voicegroup128 .equ se_m_supersonic_pri, 4 .equ se_m_supersonic_rev, reverb_set+50 .equ se_m_supersonic_mvl, 127 .equ se_m_supersonic_key, 0 .equ se_m_supersonic_tbs, 1 .equ se_m_supersonic_exg, 0 .equ se_m_supersonic_cmp, 1 .section .rodata .global se_m_supersonic .align 2 @********************** Track 1 **********************@ se_m_supersonic_1: .byte KEYSH , se_m_supersonic_key+0 .byte TEMPO , 150*se_m_supersonic_tbs/2 .byte VOICE , 43 .byte BENDR , 2 .byte PAN , c_v+0 .byte VOL , 61*se_m_supersonic_mvl/mxv .byte BEND , c_v-4 .byte N07 , Gs4 , v127 .byte W01 .byte PAN , c_v+6 .byte VOL , 75*se_m_supersonic_mvl/mxv .byte BEND , c_v-1 .byte W01 .byte PAN , c_v-7 .byte VOL , 93*se_m_supersonic_mvl/mxv .byte BEND , c_v+2 .byte W01 .byte PAN , c_v+9 .byte VOL , 110*se_m_supersonic_mvl/mxv .byte BEND , c_v+4 .byte W01 .byte PAN , c_v-12 .byte BEND , c_v+7 .byte W02 .byte W02 .byte VOL , 0*se_m_supersonic_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-4 .byte N32 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v-1 .byte W01 .byte PAN , c_v-7 .byte VOL , 36*se_m_supersonic_mvl/mxv .byte BEND , c_v+2 .byte W02 .byte PAN , c_v+9 .byte VOL , 67*se_m_supersonic_mvl/mxv .byte BEND , c_v-1 .byte W01 .byte PAN , c_v-13 .byte VOL , 84*se_m_supersonic_mvl/mxv .byte BEND , c_v-4 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v-6 .byte W01 .byte PAN , c_v-6 .byte VOL , 92*se_m_supersonic_mvl/mxv .byte BEND , c_v-8 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-7 .byte W02 .byte PAN , c_v+6 .byte VOL , 99*se_m_supersonic_mvl/mxv .byte BEND , c_v-4 .byte W01 .byte PAN , c_v-7 .byte BEND , c_v-1 .byte W01 .byte VOL , 105*se_m_supersonic_mvl/mxv .byte PAN , c_v+9 .byte BEND , c_v+2 .byte W01 .byte VOL , 110*se_m_supersonic_mvl/mxv .byte PAN , c_v-13 .byte BEND , c_v-1 .byte W01 .byte PAN , c_v-1 .byte BEND , c_v-4 .byte W02 .byte VOL , 46*se_m_supersonic_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-1 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+2 .byte W01 .byte VOL , 67*se_m_supersonic_mvl/mxv .byte PAN , c_v-7 .byte BEND , c_v-1 .byte W01 .byte PAN , c_v+9 .byte BEND , c_v-4 .byte W01 .byte VOL , 84*se_m_supersonic_mvl/mxv .byte PAN , c_v-13 .byte BEND , c_v-6 .byte W02 .byte VOL , 100*se_m_supersonic_mvl/mxv .byte PAN , c_v+6 .byte BEND , c_v-8 .byte W01 .byte VOL , 110*se_m_supersonic_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v-7 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v-4 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v-1 .byte W01 .byte VOL , 101*se_m_supersonic_mvl/mxv .byte PAN , c_v-7 .byte BEND , c_v+2 .byte W02 .byte VOL , 85*se_m_supersonic_mvl/mxv .byte PAN , c_v+9 .byte BEND , c_v-1 .byte W01 .byte VOL , 75*se_m_supersonic_mvl/mxv .byte PAN , c_v-13 .byte BEND , c_v-4 .byte W01 .byte VOL , 48*se_m_supersonic_mvl/mxv .byte PAN , c_v-1 .byte BEND , c_v-6 .byte W01 .byte VOL , 24*se_m_supersonic_mvl/mxv .byte BEND , c_v-8 .byte W01 .byte VOL , 6*se_m_supersonic_mvl/mxv .byte BEND , c_v-7 .byte W02 .byte FINE @******************************************************@ .align 2 se_m_supersonic: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_supersonic_pri @ Priority .byte se_m_supersonic_rev @ Reverb. .word se_m_supersonic_grp .word se_m_supersonic_1 .end ================================================ FILE: sound/songs/se_m_surf.s ================================================ .include "MPlayDef.s" .equ se_m_surf_grp, voicegroup128 .equ se_m_surf_pri, 4 .equ se_m_surf_rev, reverb_set+50 .equ se_m_surf_mvl, 127 .equ se_m_surf_key, 0 .equ se_m_surf_tbs, 1 .equ se_m_surf_exg, 0 .equ se_m_surf_cmp, 1 .section .rodata .global se_m_surf .align 2 @********************** Track 1 **********************@ se_m_surf_1: .byte KEYSH , se_m_surf_key+0 .byte TEMPO , 150*se_m_surf_tbs/2 .byte VOICE , 36 .byte BENDR , 12 .byte VOL , 27*se_m_surf_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N96 , Cn3 , v112 .byte W04 .byte VOL , 45*se_m_surf_mvl/mxv .byte W02 .byte PAN , c_v-4 .byte W02 .byte BEND , c_v+4 .byte W01 .byte VOL , 60*se_m_surf_mvl/mxv .byte W03 .byte PAN , c_v-10 .byte W02 .byte BEND , c_v+9 .byte W01 .byte VOL , 88*se_m_surf_mvl/mxv .byte W03 .byte PAN , c_v-5 .byte W02 .byte BEND , c_v+14 .byte W04 .byte PAN , c_v+0 .byte W01 .byte VOL , 110*se_m_surf_mvl/mxv .byte W02 .byte BEND , c_v+19 .byte W03 .byte PAN , c_v+4 .byte W02 .byte BEND , c_v+24 .byte W04 .byte PAN , c_v+11 .byte W06 .byte c_v+4 .byte W06 .byte c_v+0 .byte W06 .byte c_v-4 .byte W02 .byte BEND , c_v+19 .byte W04 .byte PAN , c_v-10 .byte W01 .byte VOL , 98*se_m_surf_mvl/mxv .byte W05 .byte 81*se_m_surf_mvl/mxv .byte PAN , c_v-5 .byte BEND , c_v+12 .byte W06 .byte VOL , 68*se_m_surf_mvl/mxv .byte PAN , c_v+0 .byte W03 .byte BEND , c_v+17 .byte W01 .byte VOL , 50*se_m_surf_mvl/mxv .byte W02 .byte PAN , c_v+4 .byte W03 .byte VOL , 31*se_m_surf_mvl/mxv .byte W03 .byte PAN , c_v+11 .byte BEND , c_v+22 .byte W02 .byte VOL , 11*se_m_surf_mvl/mxv .byte W04 .byte 6*se_m_surf_mvl/mxv .byte PAN , c_v+4 .byte BEND , c_v+30 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_surf: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_surf_pri @ Priority .byte se_m_surf_rev @ Reverb. .word se_m_surf_grp .word se_m_surf_1 .end ================================================ FILE: sound/songs/se_m_swagger.s ================================================ .include "MPlayDef.s" .equ se_m_swagger_grp, voicegroup128 .equ se_m_swagger_pri, 4 .equ se_m_swagger_rev, reverb_set+50 .equ se_m_swagger_mvl, 127 .equ se_m_swagger_key, 0 .equ se_m_swagger_tbs, 1 .equ se_m_swagger_exg, 0 .equ se_m_swagger_cmp, 1 .section .rodata .global se_m_swagger .align 2 @********************** Track 1 **********************@ se_m_swagger_1: .byte KEYSH , se_m_swagger_key+0 .byte TEMPO , 190*se_m_swagger_tbs/2 .byte VOICE , 2 .byte BENDR , 8 .byte PAN , c_v+0 .byte VOL , 28*se_m_swagger_mvl/mxv .byte BEND , c_v+0 .byte N15 , An1 , v127 .byte W01 .byte VOL , 60*se_m_swagger_mvl/mxv .byte W01 .byte 111*se_m_swagger_mvl/mxv .byte W01 .byte 120*se_m_swagger_mvl/mxv .byte W01 .byte BEND , c_v-3 .byte W02 .byte PAN , c_v+5 .byte BEND , c_v-6 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v-8 .byte W01 .byte VOL , 109*se_m_swagger_mvl/mxv .byte PAN , c_v+9 .byte BEND , c_v-10 .byte W01 .byte PAN , c_v-9 .byte BEND , c_v-14 .byte W01 .byte VOL , 95*se_m_swagger_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-19 .byte W02 .byte VOL , 71*se_m_swagger_mvl/mxv .byte BEND , c_v-29 .byte W01 .byte VOL , 41*se_m_swagger_mvl/mxv .byte BEND , c_v-38 .byte W01 .byte VOL , 15*se_m_swagger_mvl/mxv .byte BEND , c_v-52 .byte W04 .byte FINE @******************************************************@ .align 2 se_m_swagger: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_swagger_pri @ Priority .byte se_m_swagger_rev @ Reverb. .word se_m_swagger_grp .word se_m_swagger_1 .end ================================================ FILE: sound/songs/se_m_swagger2.s ================================================ .include "MPlayDef.s" .equ se_m_swagger2_grp, voicegroup128 .equ se_m_swagger2_pri, 4 .equ se_m_swagger2_rev, reverb_set+50 .equ se_m_swagger2_mvl, 127 .equ se_m_swagger2_key, 0 .equ se_m_swagger2_tbs, 1 .equ se_m_swagger2_exg, 0 .equ se_m_swagger2_cmp, 1 .section .rodata .global se_m_swagger2 .align 2 @********************** Track 1 **********************@ se_m_swagger2_1: .byte KEYSH , se_m_swagger2_key+0 .byte TEMPO , 150*se_m_swagger2_tbs/2 .byte VOICE , 56 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 65*se_m_swagger2_mvl/mxv .byte BEND , c_v+8 .byte N01 , Cs6 , v112 .byte W01 .byte BEND , c_v+0 .byte N01 , Dn6 , v100 .byte W01 .byte Dn6 , v060 .byte W04 .byte BEND , c_v-8 .byte N01 , Ds6 , v112 .byte W01 .byte BEND , c_v+0 .byte N01 , En6 , v100 .byte W01 .byte En6 , v060 .byte W04 .byte FINE @******************************************************@ .align 2 se_m_swagger2: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_swagger2_pri @ Priority .byte se_m_swagger2_rev @ Reverb. .word se_m_swagger2_grp .word se_m_swagger2_1 .end ================================================ FILE: sound/songs/se_m_sweet_scent.s ================================================ .include "MPlayDef.s" .equ se_m_sweet_scent_grp, voicegroup128 .equ se_m_sweet_scent_pri, 4 .equ se_m_sweet_scent_rev, reverb_set+50 .equ se_m_sweet_scent_mvl, 127 .equ se_m_sweet_scent_key, 0 .equ se_m_sweet_scent_tbs, 1 .equ se_m_sweet_scent_exg, 0 .equ se_m_sweet_scent_cmp, 1 .section .rodata .global se_m_sweet_scent .align 2 @********************** Track 1 **********************@ se_m_sweet_scent_1: .byte KEYSH , se_m_sweet_scent_key+0 .byte TEMPO , 150*se_m_sweet_scent_tbs/2 .byte VOICE , 61 .byte BENDR , 44 .byte PAN , c_v+0 .byte VOL , 110*se_m_sweet_scent_mvl/mxv .byte BEND , c_v+2 .byte N36 , En3 , v096 .byte W12 .byte PAN , c_v-4 .byte BEND , c_v+2 .byte W12 .byte PAN , c_v-10 .byte BEND , c_v+4 .byte W12 .byte PAN , c_v-4 .byte BEND , c_v+5 .byte N36 , Fn3 .byte W12 .byte PAN , c_v+0 .byte BEND , c_v+6 .byte W12 .byte PAN , c_v+6 .byte BEND , c_v+7 .byte W12 .byte PAN , c_v+9 .byte BEND , c_v+8 .byte N36 , En3 , v088 .byte W12 .byte PAN , c_v+5 .byte BEND , c_v+8 .byte W12 .byte PAN , c_v+0 .byte BEND , c_v+9 .byte W12 .byte PAN , c_v-4 .byte BEND , c_v+10 .byte N60 , Fs3 , v056 .byte W12 .byte PAN , c_v-10 .byte BEND , c_v+11 .byte W12 .byte PAN , c_v-4 .byte BEND , c_v+12 .byte W04 .byte VOL , 103*se_m_sweet_scent_mvl/mxv .byte W04 .byte 97*se_m_sweet_scent_mvl/mxv .byte W04 .byte PAN , c_v+0 .byte BEND , c_v+12 .byte W01 .byte VOL , 91*se_m_sweet_scent_mvl/mxv .byte W05 .byte 81*se_m_sweet_scent_mvl/mxv .byte W03 .byte 72*se_m_sweet_scent_mvl/mxv .byte W03 .byte PAN , c_v+6 .byte BEND , c_v+13 .byte W01 .byte VOL , 62*se_m_sweet_scent_mvl/mxv .byte W02 .byte 51*se_m_sweet_scent_mvl/mxv .byte W03 .byte 39*se_m_sweet_scent_mvl/mxv .byte W02 .byte 24*se_m_sweet_scent_mvl/mxv .byte W02 .byte 12*se_m_sweet_scent_mvl/mxv .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_sweet_scent_2: .byte KEYSH , se_m_sweet_scent_key+0 .byte VOICE , 22 .byte BENDR , 44 .byte PAN , c_v+1 .byte VOL , 38*se_m_sweet_scent_mvl/mxv .byte BEND , c_v+1 .byte TIE , Gn3 , v100 .byte W03 .byte VOL , 50*se_m_sweet_scent_mvl/mxv .byte W04 .byte 62*se_m_sweet_scent_mvl/mxv .byte W02 .byte BEND , c_v-1 .byte W01 .byte VOL , 65*se_m_sweet_scent_mvl/mxv .byte W04 .byte 74*se_m_sweet_scent_mvl/mxv .byte W04 .byte 78*se_m_sweet_scent_mvl/mxv .byte BEND , c_v-2 .byte W03 .byte VOL , 86*se_m_sweet_scent_mvl/mxv .byte W03 .byte 95*se_m_sweet_scent_mvl/mxv .byte W03 .byte 105*se_m_sweet_scent_mvl/mxv .byte W01 .byte BEND , c_v-4 .byte W03 .byte VOL , 110*se_m_sweet_scent_mvl/mxv .byte W13 .byte BEND , c_v-2 .byte W04 .byte W10 .byte c_v-1 .byte W10 .byte c_v+0 .byte W04 .byte W03 .byte c_v+1 .byte W10 .byte c_v+1 .byte W11 .byte W02 .byte c_v+2 .byte W14 .byte c_v+3 .byte W08 .byte VOL , 105*se_m_sweet_scent_mvl/mxv .byte W03 .byte 101*se_m_sweet_scent_mvl/mxv .byte W05 .byte 96*se_m_sweet_scent_mvl/mxv .byte W04 .byte BEND , c_v+2 .byte W01 .byte VOL , 91*se_m_sweet_scent_mvl/mxv .byte W03 .byte 86*se_m_sweet_scent_mvl/mxv .byte W05 .byte 78*se_m_sweet_scent_mvl/mxv .byte W03 .byte W02 .byte 68*se_m_sweet_scent_mvl/mxv .byte W01 .byte BEND , c_v+1 .byte W04 .byte VOL , 58*se_m_sweet_scent_mvl/mxv .byte W03 .byte 48*se_m_sweet_scent_mvl/mxv .byte W04 .byte 37*se_m_sweet_scent_mvl/mxv .byte BEND , c_v+0 .byte W04 .byte VOL , 23*se_m_sweet_scent_mvl/mxv .byte W01 .byte BEND , c_v-1 .byte W02 .byte VOL , 12*se_m_sweet_scent_mvl/mxv .byte W03 .byte EOT .byte FINE @******************************************************@ .align 2 se_m_sweet_scent: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_sweet_scent_pri @ Priority .byte se_m_sweet_scent_rev @ Reverb. .word se_m_sweet_scent_grp .word se_m_sweet_scent_1 .word se_m_sweet_scent_2 .end ================================================ FILE: sound/songs/se_m_swift.s ================================================ .include "MPlayDef.s" .equ se_m_swift_grp, voicegroup128 .equ se_m_swift_pri, 4 .equ se_m_swift_rev, reverb_set+50 .equ se_m_swift_mvl, 127 .equ se_m_swift_key, 0 .equ se_m_swift_tbs, 1 .equ se_m_swift_exg, 0 .equ se_m_swift_cmp, 1 .section .rodata .global se_m_swift .align 2 @********************** Track 1 **********************@ se_m_swift_1: .byte KEYSH , se_m_swift_key+0 .byte TEMPO , 180*se_m_swift_tbs/2 .byte VOICE , 16 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 100*se_m_swift_mvl/mxv .byte BEND , c_v+0 .byte N06 , Ds6 , v100 .byte W01 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v+5 .byte VOL , 90*se_m_swift_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte PAN , c_v-6 .byte VOL , 77*se_m_swift_mvl/mxv .byte BEND , c_v-37 .byte W01 .byte PAN , c_v+0 .byte VOL , 37*se_m_swift_mvl/mxv .byte BEND , c_v-47 .byte W02 .byte VOL , 100*se_m_swift_mvl/mxv .byte BEND , c_v+0 .byte N06 .byte W01 .byte PAN , c_v+5 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v-6 .byte VOL , 90*se_m_swift_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte PAN , c_v+8 .byte VOL , 77*se_m_swift_mvl/mxv .byte BEND , c_v-37 .byte W01 .byte PAN , c_v-10 .byte VOL , 37*se_m_swift_mvl/mxv .byte BEND , c_v-47 .byte W02 .byte VOL , 100*se_m_swift_mvl/mxv .byte BEND , c_v+0 .byte N06 , Ds6 , v056 .byte W01 .byte PAN , c_v+5 .byte BEND , c_v-11 .byte W01 .byte PAN , c_v-6 .byte VOL , 90*se_m_swift_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte PAN , c_v+8 .byte VOL , 77*se_m_swift_mvl/mxv .byte BEND , c_v-37 .byte W01 .byte PAN , c_v-10 .byte VOL , 37*se_m_swift_mvl/mxv .byte BEND , c_v-47 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_swift_2: .byte KEYSH , se_m_swift_key+0 .byte VOICE , 53 .byte VOL , 100*se_m_swift_mvl/mxv .byte W02 .byte N06 , Cn6 , v040 .byte W04 .byte W02 .byte N04 , Cn6 , v032 .byte W04 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_swift: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_swift_pri @ Priority .byte se_m_swift_rev @ Reverb. .word se_m_swift_grp .word se_m_swift_1 .word se_m_swift_2 .end ================================================ FILE: sound/songs/se_m_teeter_dance.s ================================================ .include "MPlayDef.s" .equ se_m_teeter_dance_grp, voicegroup128 .equ se_m_teeter_dance_pri, 4 .equ se_m_teeter_dance_rev, reverb_set+50 .equ se_m_teeter_dance_mvl, 127 .equ se_m_teeter_dance_key, 0 .equ se_m_teeter_dance_tbs, 1 .equ se_m_teeter_dance_exg, 0 .equ se_m_teeter_dance_cmp, 1 .section .rodata .global se_m_teeter_dance .align 2 @********************** Track 1 **********************@ se_m_teeter_dance_1: .byte KEYSH , se_m_teeter_dance_key+0 .byte TEMPO , 170*se_m_teeter_dance_tbs/2 .byte VOICE , 37 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_teeter_dance_mvl/mxv .byte BEND , c_v-4 .byte N03 , Gn4 , v100 .byte W06 .byte PAN , c_v+16 .byte N03 , Gn4 , v056 .byte W03 .byte PAN , c_v+0 .byte N03 , An5 , v100 .byte W03 .byte W03 .byte PAN , c_v-15 .byte N03 , An5 , v056 .byte W03 .byte PAN , c_v+0 .byte N03 , Cn6 , v100 .byte W06 .byte PAN , c_v+16 .byte N03 , Cn6 , v056 .byte W03 .byte PAN , c_v+0 .byte N03 , Gn4 , v072 .byte W03 .byte W03 .byte PAN , c_v-16 .byte N03 , Gn4 , v028 .byte W03 .byte PAN , c_v+0 .byte N03 , An5 , v072 .byte W06 .byte PAN , c_v+16 .byte N03 , An5 , v028 .byte W03 .byte PAN , c_v+0 .byte N03 , Cn6 , v072 .byte W03 .byte W03 .byte PAN , c_v-16 .byte N03 , Cn6 , v028 .byte W03 .byte W06 .byte FINE @********************** Track 2 **********************@ se_m_teeter_dance_2: .byte KEYSH , se_m_teeter_dance_key+0 .byte VOICE , 47 .byte XCMD , xIECV , 10 .byte xIECL , 8 .byte MOD , 20 .byte VOL , 44*se_m_teeter_dance_mvl/mxv .byte BEND , c_v-2 .byte W03 .byte N03 , Gn3 , v112 .byte W03 .byte W03 .byte Gn3 , v068 .byte W03 .byte An4 , v112 .byte W06 .byte An4 , v068 .byte W03 .byte Cn5 , v112 .byte W03 .byte W03 .byte Cn5 , v068 .byte W03 .byte Gn3 , v080 .byte W06 .byte Gn3 , v036 .byte W03 .byte An4 , v080 .byte W03 .byte W03 .byte An4 , v036 .byte W03 .byte Cn5 , v080 .byte W06 .byte Cn5 , v036 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_teeter_dance: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_teeter_dance_pri @ Priority .byte se_m_teeter_dance_rev @ Reverb. .word se_m_teeter_dance_grp .word se_m_teeter_dance_1 .word se_m_teeter_dance_2 .end ================================================ FILE: sound/songs/se_m_teleport.s ================================================ .include "MPlayDef.s" .equ se_m_teleport_grp, voicegroup128 .equ se_m_teleport_pri, 4 .equ se_m_teleport_rev, reverb_set+50 .equ se_m_teleport_mvl, 127 .equ se_m_teleport_key, 0 .equ se_m_teleport_tbs, 1 .equ se_m_teleport_exg, 0 .equ se_m_teleport_cmp, 1 .section .rodata .global se_m_teleport .align 2 @********************** Track 1 **********************@ se_m_teleport_1: .byte KEYSH , se_m_teleport_key+0 .byte TEMPO , 150*se_m_teleport_tbs/2 .byte VOICE , 45 .byte BENDR , 24 .byte PAN , c_v+0 .byte VOL , 32*se_m_teleport_mvl/mxv .byte MOD , 30 .byte BEND , c_v+0 .byte N06 , Cn3 , v127 .byte W01 .byte BEND , c_v+4 .byte W01 .byte VOL , 49*se_m_teleport_mvl/mxv .byte PAN , c_v+5 .byte BEND , c_v+9 .byte W01 .byte c_v+16 .byte W01 .byte VOL , 61*se_m_teleport_mvl/mxv .byte BEND , c_v+24 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+2 .byte N06 , Dn3 , v116 .byte W01 .byte VOL , 71*se_m_teleport_mvl/mxv .byte BEND , c_v+7 .byte W01 .byte PAN , c_v-4 .byte BEND , c_v+12 .byte W01 .byte VOL , 81*se_m_teleport_mvl/mxv .byte BEND , c_v+18 .byte W01 .byte c_v+27 .byte W02 .byte VOL , 95*se_m_teleport_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+4 .byte N06 , En3 , v112 .byte W01 .byte BEND , c_v+9 .byte W01 .byte PAN , c_v+6 .byte BEND , c_v+14 .byte W01 .byte c_v+20 .byte W01 .byte c_v+29 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+6 .byte N06 , Fn3 .byte W01 .byte BEND , c_v+11 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v+15 .byte W01 .byte c_v+22 .byte W01 .byte c_v+31 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+9 .byte N06 , Gn3 , v108 .byte W01 .byte BEND , c_v+14 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v+18 .byte W01 .byte c_v+25 .byte W01 .byte c_v+34 .byte W02 .byte VOL , 82*se_m_teleport_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+14 .byte N06 , An3 , v100 .byte W01 .byte BEND , c_v+18 .byte W01 .byte VOL , 71*se_m_teleport_mvl/mxv .byte PAN , c_v-8 .byte BEND , c_v+23 .byte W01 .byte c_v+30 .byte W01 .byte VOL , 61*se_m_teleport_mvl/mxv .byte BEND , c_v+38 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+14 .byte N06 , Bn3 , v060 .byte W01 .byte BEND , c_v+18 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v+23 .byte W01 .byte c_v+30 .byte W01 .byte c_v+38 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+14 .byte N06 , Cn4 , v040 .byte W01 .byte BEND , c_v+18 .byte W01 .byte PAN , c_v-8 .byte BEND , c_v+23 .byte W01 .byte c_v+30 .byte W01 .byte c_v+38 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+14 .byte N06 , Dn4 , v020 .byte W01 .byte BEND , c_v+18 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v+23 .byte W01 .byte c_v+30 .byte W01 .byte c_v+38 .byte W02 .byte FINE @******************************************************@ .align 2 se_m_teleport: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_teleport_pri @ Priority .byte se_m_teleport_rev @ Reverb. .word se_m_teleport_grp .word se_m_teleport_1 .end ================================================ FILE: sound/songs/se_m_thunder_wave.s ================================================ .include "MPlayDef.s" .equ se_m_thunder_wave_grp, voicegroup128 .equ se_m_thunder_wave_pri, 4 .equ se_m_thunder_wave_rev, reverb_set+50 .equ se_m_thunder_wave_mvl, 127 .equ se_m_thunder_wave_key, 0 .equ se_m_thunder_wave_tbs, 1 .equ se_m_thunder_wave_exg, 0 .equ se_m_thunder_wave_cmp, 1 .section .rodata .global se_m_thunder_wave .align 2 @********************** Track 1 **********************@ se_m_thunder_wave_1: .byte KEYSH , se_m_thunder_wave_key+0 .byte TEMPO , 150*se_m_thunder_wave_tbs/2 .byte VOICE , 18 .byte VOL , 110*se_m_thunder_wave_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+32 .byte N06 , Gn3 , v127 .byte W02 .byte PAN , c_v-8 .byte W01 .byte BEND , c_v+0 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+32 .byte N04 , Cn3 .byte W02 .byte PAN , c_v+9 .byte W01 .byte BEND , c_v-12 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N01 , Gn3 .byte W02 .byte Bn2 .byte W02 .byte N13 , Gn3 .byte W02 .byte VOL , 96*se_m_thunder_wave_mvl/mxv .byte W01 .byte 85*se_m_thunder_wave_mvl/mxv .byte W01 .byte BEND , c_v-23 .byte W01 .byte VOL , 66*se_m_thunder_wave_mvl/mxv .byte W01 .byte BEND , c_v-40 .byte W01 .byte VOL , 36*se_m_thunder_wave_mvl/mxv .byte W01 .byte BEND , c_v-54 .byte W02 .byte VOL , 12*se_m_thunder_wave_mvl/mxv .byte W01 .byte BEND , c_v-64 .byte W21 .byte FINE @********************** Track 2 **********************@ se_m_thunder_wave_2: .byte KEYSH , se_m_thunder_wave_key+0 .byte VOICE , 5 .byte VOL , 110*se_m_thunder_wave_mvl/mxv .byte PAN , c_v-7 .byte N02 , En3 , v052 .byte W04 .byte PAN , c_v+10 .byte N02 , En3 , v044 .byte W04 .byte PAN , c_v-7 .byte N02 , En3 , v036 .byte W04 .byte PAN , c_v+10 .byte N02 , En3 , v028 .byte W04 .byte PAN , c_v-7 .byte N02 , En3 , v020 .byte W08 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_thunder_wave: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_thunder_wave_pri @ Priority .byte se_m_thunder_wave_rev @ Reverb. .word se_m_thunder_wave_grp .word se_m_thunder_wave_1 .word se_m_thunder_wave_2 .end ================================================ FILE: sound/songs/se_m_thunderbolt.s ================================================ .include "MPlayDef.s" .equ se_m_thunderbolt_grp, voicegroup128 .equ se_m_thunderbolt_pri, 4 .equ se_m_thunderbolt_rev, reverb_set+50 .equ se_m_thunderbolt_mvl, 127 .equ se_m_thunderbolt_key, 0 .equ se_m_thunderbolt_tbs, 1 .equ se_m_thunderbolt_exg, 0 .equ se_m_thunderbolt_cmp, 1 .section .rodata .global se_m_thunderbolt .align 2 @********************** Track 1 **********************@ se_m_thunderbolt_1: .byte KEYSH , se_m_thunderbolt_key+0 .byte TEMPO , 220*se_m_thunderbolt_tbs/2 .byte VOICE , 18 .byte VOL , 120*se_m_thunderbolt_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+32 .byte N06 , Dn3 , v127 .byte W02 .byte PAN , c_v-8 .byte W01 .byte BEND , c_v+0 .byte W01 .byte PAN , c_v-16 .byte W02 .byte c_v+0 .byte BEND , c_v+32 .byte N06 , Dn2 , v104 .byte W02 .byte PAN , c_v+9 .byte W01 .byte BEND , c_v-12 .byte W01 .byte PAN , c_v+16 .byte W02 .byte c_v+0 .byte BEND , c_v+0 .byte N21 , Dn3 , v127 .byte W03 .byte PAN , c_v-8 .byte W03 .byte c_v-15 .byte W01 .byte BEND , c_v-13 .byte W02 .byte PAN , c_v-7 .byte W01 .byte BEND , c_v-23 .byte W02 .byte VOL , 100*se_m_thunderbolt_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v-40 .byte W01 .byte VOL , 86*se_m_thunderbolt_mvl/mxv .byte W01 .byte BEND , c_v-54 .byte W01 .byte PAN , c_v+10 .byte VOL , 68*se_m_thunderbolt_mvl/mxv .byte W02 .byte 37*se_m_thunderbolt_mvl/mxv .byte BEND , c_v-64 .byte W01 .byte PAN , c_v+16 .byte W02 .byte VOL , 17*se_m_thunderbolt_mvl/mxv .byte W01 .byte PAN , c_v+10 .byte W15 .byte FINE @********************** Track 2 **********************@ se_m_thunderbolt_2: .byte KEYSH , se_m_thunderbolt_key+0 .byte VOICE , 5 .byte VOL , 120*se_m_thunderbolt_mvl/mxv .byte PAN , c_v-7 .byte N02 , En3 , v048 .byte W05 .byte PAN , c_v+10 .byte N02 , En3 , v040 .byte W06 .byte PAN , c_v-7 .byte N02 , En3 , v032 .byte W07 .byte PAN , c_v+10 .byte N02 , En3 , v024 .byte W06 .byte PAN , c_v-7 .byte N02 , En3 , v016 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_thunderbolt: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_thunderbolt_pri @ Priority .byte se_m_thunderbolt_rev @ Reverb. .word se_m_thunderbolt_grp .word se_m_thunderbolt_1 .word se_m_thunderbolt_2 .end ================================================ FILE: sound/songs/se_m_thunderbolt2.s ================================================ .include "MPlayDef.s" .equ se_m_thunderbolt2_grp, voicegroup128 .equ se_m_thunderbolt2_pri, 4 .equ se_m_thunderbolt2_rev, reverb_set+50 .equ se_m_thunderbolt2_mvl, 127 .equ se_m_thunderbolt2_key, 0 .equ se_m_thunderbolt2_tbs, 1 .equ se_m_thunderbolt2_exg, 0 .equ se_m_thunderbolt2_cmp, 1 .section .rodata .global se_m_thunderbolt2 .align 2 @********************** Track 1 **********************@ se_m_thunderbolt2_1: .byte KEYSH , se_m_thunderbolt2_key+0 .byte TEMPO , 220*se_m_thunderbolt2_tbs/2 .byte VOICE , 18 .byte VOL , 100*se_m_thunderbolt2_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N03 , Cn4 , v088 .byte W06 .byte PAN , c_v-9 .byte N03 , Cn4 , v080 .byte W06 .byte PAN , c_v+9 .byte N03 , Cn4 , v072 .byte W06 .byte PAN , c_v-16 .byte N03 , Cn4 , v064 .byte W06 .byte PAN , c_v+16 .byte N03 , Cn4 , v060 .byte W06 .byte PAN , c_v-16 .byte N03 , Cn4 , v052 .byte W18 .byte FINE @********************** Track 2 **********************@ se_m_thunderbolt2_2: .byte KEYSH , se_m_thunderbolt2_key+0 .byte VOICE , 5 .byte VOL , 100*se_m_thunderbolt2_mvl/mxv .byte PAN , c_v+9 .byte N02 , Gn3 , v072 .byte W06 .byte PAN , c_v-7 .byte N02 , Gn3 , v068 .byte W06 .byte PAN , c_v+9 .byte N02 , Gn3 , v064 .byte W06 .byte PAN , c_v-7 .byte N02 , Gn3 , v060 .byte W06 .byte PAN , c_v+9 .byte N02 , Gn3 , v056 .byte W06 .byte PAN , c_v-7 .byte N02 , Gn3 , v048 .byte W18 .byte FINE @******************************************************@ .align 2 se_m_thunderbolt2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_thunderbolt2_pri @ Priority .byte se_m_thunderbolt2_rev @ Reverb. .word se_m_thunderbolt2_grp .word se_m_thunderbolt2_1 .word se_m_thunderbolt2_2 .end ================================================ FILE: sound/songs/se_m_toxic.s ================================================ .include "MPlayDef.s" .equ se_m_toxic_grp, voicegroup128 .equ se_m_toxic_pri, 4 .equ se_m_toxic_rev, reverb_set+50 .equ se_m_toxic_mvl, 127 .equ se_m_toxic_key, 0 .equ se_m_toxic_tbs, 1 .equ se_m_toxic_exg, 0 .equ se_m_toxic_cmp, 1 .section .rodata .global se_m_toxic .align 2 @********************** Track 1 **********************@ se_m_toxic_1: .byte KEYSH , se_m_toxic_key+0 .byte TEMPO , 150*se_m_toxic_tbs/2 .byte VOICE , 31 .byte VOL , 110*se_m_toxic_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , Dn2 , v127 .byte W01 .byte BEND , c_v+32 .byte W01 .byte VOICE , 23 .byte BEND , c_v+0 .byte N02 , Gn1 , v112 .byte W01 .byte PAN , c_v+8 .byte BEND , c_v+63 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N02 , Cn2 .byte W02 .byte PAN , c_v-7 .byte BEND , c_v+16 .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte W01 .byte N01 .byte W01 .byte PAN , c_v+8 .byte N01 , Cn3 .byte W01 .byte VOICE , 31 .byte PAN , c_v-16 .byte N01 , Dn2 .byte W02 .byte VOICE , 23 .byte PAN , c_v+0 .byte N01 , Cn2 .byte W01 .byte VOICE , 31 .byte PAN , c_v+16 .byte N01 , Dn2 , v096 .byte W01 .byte VOICE , 23 .byte PAN , c_v-8 .byte BEND , c_v+16 .byte N01 , Cn3 .byte W02 .byte PAN , c_v+8 .byte N01 , Cn2 .byte W08 .byte FINE @******************************************************@ .align 2 se_m_toxic: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_toxic_pri @ Priority .byte se_m_toxic_rev @ Reverb. .word se_m_toxic_grp .word se_m_toxic_1 .end ================================================ FILE: sound/songs/se_m_tri_attack.s ================================================ .include "MPlayDef.s" .equ se_m_tri_attack_grp, voicegroup128 .equ se_m_tri_attack_pri, 4 .equ se_m_tri_attack_rev, reverb_set+50 .equ se_m_tri_attack_mvl, 127 .equ se_m_tri_attack_key, 0 .equ se_m_tri_attack_tbs, 1 .equ se_m_tri_attack_exg, 0 .equ se_m_tri_attack_cmp, 1 .section .rodata .global se_m_tri_attack .align 2 @********************** Track 1 **********************@ se_m_tri_attack_1: .byte KEYSH , se_m_tri_attack_key+0 .byte TEMPO , 220*se_m_tri_attack_tbs/2 .byte VOICE , 58 .byte BENDR , 24 .byte PAN , c_v+0 .byte VOL , 19*se_m_tri_attack_mvl/mxv .byte BEND , c_v-32 .byte N16 , Gn1 , v127 .byte W01 .byte VOL , 43*se_m_tri_attack_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte VOL , 72*se_m_tri_attack_mvl/mxv .byte BEND , c_v-8 .byte W01 .byte VOL , 92*se_m_tri_attack_mvl/mxv .byte BEND , c_v+7 .byte W01 .byte VOL , 109*se_m_tri_attack_mvl/mxv .byte BEND , c_v+19 .byte W02 .byte c_v+28 .byte W01 .byte c_v+40 .byte W01 .byte c_v+28 .byte W01 .byte VOL , 102*se_m_tri_attack_mvl/mxv .byte BEND , c_v+19 .byte W01 .byte VOL , 88*se_m_tri_attack_mvl/mxv .byte BEND , c_v+5 .byte W02 .byte VOL , 69*se_m_tri_attack_mvl/mxv .byte BEND , c_v-9 .byte W01 .byte VOL , 37*se_m_tri_attack_mvl/mxv .byte BEND , c_v-20 .byte W01 .byte VOL , 17*se_m_tri_attack_mvl/mxv .byte BEND , c_v-34 .byte W10 .byte FINE @********************** Track 2 **********************@ se_m_tri_attack_2: .byte KEYSH , se_m_tri_attack_key+0 .byte VOICE , 4 .byte VOL , 110*se_m_tri_attack_mvl/mxv .byte N02 , Gs3 , v032 .byte W02 .byte Gn3 .byte W02 .byte Fn3 .byte W03 .byte En3 .byte W02 .byte Dn3 .byte W03 .byte Cn3 .byte W02 .byte Gs2 .byte W10 .byte FINE @******************************************************@ .align 2 se_m_tri_attack: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_tri_attack_pri @ Priority .byte se_m_tri_attack_rev @ Reverb. .word se_m_tri_attack_grp .word se_m_tri_attack_1 .word se_m_tri_attack_2 .end ================================================ FILE: sound/songs/se_m_tri_attack2.s ================================================ .include "MPlayDef.s" .equ se_m_tri_attack2_grp, voicegroup128 .equ se_m_tri_attack2_pri, 4 .equ se_m_tri_attack2_rev, reverb_set+50 .equ se_m_tri_attack2_mvl, 127 .equ se_m_tri_attack2_key, 0 .equ se_m_tri_attack2_tbs, 1 .equ se_m_tri_attack2_exg, 0 .equ se_m_tri_attack2_cmp, 1 .section .rodata .global se_m_tri_attack2 .align 2 @********************** Track 1 **********************@ se_m_tri_attack2_1: .byte KEYSH , se_m_tri_attack2_key+0 .byte TEMPO , 220*se_m_tri_attack2_tbs/2 .byte VOICE , 18 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 110*se_m_tri_attack2_mvl/mxv .byte BEND , c_v+0 .byte N09 , An3 , v127 .byte W03 .byte BEND , c_v+21 .byte W03 .byte c_v+0 .byte W03 .byte c_v+6 .byte N15 , An3 , v120 .byte W03 .byte BEND , c_v+2 .byte W01 .byte PAN , c_v+10 .byte W02 .byte BEND , c_v-9 .byte W03 .byte PAN , c_v-9 .byte BEND , c_v-29 .byte W06 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N09 , Cn3 , v127 .byte W06 .byte BEND , c_v-8 .byte W03 .byte c_v-15 .byte N60 , Cs3 , v124 .byte W03 .byte BEND , c_v-4 .byte W03 .byte PAN , c_v+10 .byte W06 .byte c_v+0 .byte BEND , c_v-8 .byte W03 .byte W03 .byte PAN , c_v-9 .byte W03 .byte BEND , c_v-13 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v-22 .byte W06 .byte VOL , 103*se_m_tri_attack2_mvl/mxv .byte PAN , c_v+10 .byte W03 .byte BEND , c_v-32 .byte W03 .byte PAN , c_v+0 .byte W03 .byte VOL , 95*se_m_tri_attack2_mvl/mxv .byte BEND , c_v-38 .byte W03 .byte PAN , c_v-9 .byte W05 .byte BEND , c_v-45 .byte W01 .byte VOL , 66*se_m_tri_attack2_mvl/mxv .byte PAN , c_v+0 .byte W05 .byte c_v+10 .byte W01 .byte BEND , c_v-52 .byte W03 .byte VOL , 21*se_m_tri_attack2_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte W04 .byte FINE @********************** Track 2 **********************@ se_m_tri_attack2_2: .byte KEYSH , se_m_tri_attack2_key+0 .byte VOICE , 4 .byte VOL , 110*se_m_tri_attack2_mvl/mxv .byte N06 , Cn3 , v060 .byte W09 .byte N15 .byte W15 .byte W24 .byte W24 .byte W24 .byte FINE @******************************************************@ .align 2 se_m_tri_attack2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_tri_attack2_pri @ Priority .byte se_m_tri_attack2_rev @ Reverb. .word se_m_tri_attack2_grp .word se_m_tri_attack2_1 .word se_m_tri_attack2_2 .end ================================================ FILE: sound/songs/se_m_twister.s ================================================ .include "MPlayDef.s" .equ se_m_twister_grp, voicegroup128 .equ se_m_twister_pri, 4 .equ se_m_twister_rev, reverb_set+50 .equ se_m_twister_mvl, 127 .equ se_m_twister_key, 0 .equ se_m_twister_tbs, 1 .equ se_m_twister_exg, 0 .equ se_m_twister_cmp, 1 .section .rodata .global se_m_twister .align 2 @********************** Track 1 **********************@ se_m_twister_1: .byte KEYSH , se_m_twister_key+0 .byte TEMPO , 150*se_m_twister_tbs/2 .byte VOICE , 22 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 67*se_m_twister_mvl/mxv .byte BEND , c_v+0 .byte TIE , Dn2 , v127 .byte W03 .byte VOL , 83*se_m_twister_mvl/mxv .byte BEND , c_v+22 .byte W03 .byte VOL , 88*se_m_twister_mvl/mxv .byte PAN , c_v-4 .byte W03 .byte VOL , 95*se_m_twister_mvl/mxv .byte W02 .byte BEND , c_v+8 .byte W01 .byte VOL , 105*se_m_twister_mvl/mxv .byte PAN , c_v-8 .byte W03 .byte VOL , 115*se_m_twister_mvl/mxv .byte W02 .byte BEND , c_v+0 .byte W01 .byte PAN , c_v-12 .byte W06 .byte c_v-17 .byte BEND , c_v+0 .byte W03 .byte c_v-7 .byte W03 .byte PAN , c_v-9 .byte W06 .byte c_v-3 .byte W01 .byte BEND , c_v-12 .byte W02 .byte PAN , c_v+6 .byte W03 .byte c_v+10 .byte W06 .byte c_v+16 .byte W01 .byte BEND , c_v-20 .byte W05 .byte PAN , c_v+13 .byte W06 .byte c_v+8 .byte W03 .byte c_v+0 .byte W01 .byte BEND , c_v-13 .byte W02 .byte PAN , c_v-8 .byte W03 .byte c_v-11 .byte W03 .byte c_v-17 .byte W01 .byte BEND , c_v-6 .byte W05 .byte PAN , c_v-9 .byte W06 .byte c_v-3 .byte W03 .byte c_v+6 .byte W03 .byte c_v+10 .byte W01 .byte BEND , c_v+6 .byte W05 .byte PAN , c_v+16 .byte W06 .byte c_v+13 .byte W06 .byte c_v+8 .byte W03 .byte c_v+0 .byte BEND , c_v+11 .byte W03 .byte PAN , c_v-8 .byte W03 .byte c_v-11 .byte VOL , 103*se_m_twister_mvl/mxv .byte W03 .byte PAN , c_v-17 .byte W01 .byte BEND , c_v+20 .byte W05 .byte PAN , c_v-9 .byte W01 .byte VOL , 97*se_m_twister_mvl/mxv .byte W05 .byte PAN , c_v-3 .byte W01 .byte BEND , c_v+12 .byte W02 .byte PAN , c_v+6 .byte VOL , 88*se_m_twister_mvl/mxv .byte W03 .byte PAN , c_v+10 .byte W02 .byte BEND , c_v+7 .byte W02 .byte VOL , 79*se_m_twister_mvl/mxv .byte W02 .byte PAN , c_v+16 .byte W04 .byte VOL , 62*se_m_twister_mvl/mxv .byte BEND , c_v+0 .byte W02 .byte PAN , c_v+13 .byte W04 .byte VOL , 45*se_m_twister_mvl/mxv .byte W02 .byte PAN , c_v+8 .byte W01 .byte BEND , c_v-7 .byte W01 .byte VOL , 33*se_m_twister_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte W03 .byte c_v-8 .byte W01 .byte VOL , 18*se_m_twister_mvl/mxv .byte W02 .byte PAN , c_v-11 .byte W03 .byte EOT .byte FINE @********************** Track 2 **********************@ se_m_twister_2: .byte KEYSH , se_m_twister_key+0 .byte VOICE , 25 .byte VOL , 67*se_m_twister_mvl/mxv .byte TIE , Gs4 , v012 .byte W03 .byte VOL , 83*se_m_twister_mvl/mxv .byte W03 .byte 88*se_m_twister_mvl/mxv .byte W03 .byte 95*se_m_twister_mvl/mxv .byte W03 .byte 105*se_m_twister_mvl/mxv .byte W03 .byte 115*se_m_twister_mvl/mxv .byte W09 .byte W24 .byte W24 .byte W24 .byte W21 .byte 103*se_m_twister_mvl/mxv .byte W03 .byte W07 .byte 97*se_m_twister_mvl/mxv .byte W08 .byte 88*se_m_twister_mvl/mxv .byte W07 .byte 79*se_m_twister_mvl/mxv .byte W02 .byte W04 .byte 62*se_m_twister_mvl/mxv .byte W06 .byte 45*se_m_twister_mvl/mxv .byte W04 .byte 33*se_m_twister_mvl/mxv .byte W05 .byte 18*se_m_twister_mvl/mxv .byte W05 .byte EOT .byte FINE @******************************************************@ .align 2 se_m_twister: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_twister_pri @ Priority .byte se_m_twister_rev @ Reverb. .word se_m_twister_grp .word se_m_twister_1 .word se_m_twister_2 .end ================================================ FILE: sound/songs/se_m_uproar.s ================================================ .include "MPlayDef.s" .equ se_m_uproar_grp, voicegroup128 .equ se_m_uproar_pri, 4 .equ se_m_uproar_rev, reverb_set+50 .equ se_m_uproar_mvl, 127 .equ se_m_uproar_key, 0 .equ se_m_uproar_tbs, 1 .equ se_m_uproar_exg, 0 .equ se_m_uproar_cmp, 1 .section .rodata .global se_m_uproar .align 2 @********************** Track 1 **********************@ se_m_uproar_1: .byte KEYSH , se_m_uproar_key+0 .byte TEMPO , 150*se_m_uproar_tbs/2 .byte VOICE , 60 .byte BENDR , 12 .byte VOL , 25*se_m_uproar_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N24 , Gs2 , v127 .byte W01 .byte PAN , c_v+2 .byte VOL , 51*se_m_uproar_mvl/mxv .byte W01 .byte PAN , c_v+5 .byte VOL , 74*se_m_uproar_mvl/mxv .byte W01 .byte 89*se_m_uproar_mvl/mxv .byte BEND , c_v+1 .byte W01 .byte PAN , c_v+2 .byte VOL , 100*se_m_uproar_mvl/mxv .byte W02 .byte PAN , c_v+0 .byte W01 .byte c_v-2 .byte BEND , c_v+4 .byte W01 .byte PAN , c_v-4 .byte W02 .byte c_v-2 .byte BEND , c_v+5 .byte W02 .byte PAN , c_v+0 .byte W01 .byte c_v+2 .byte W01 .byte c_v+5 .byte W02 .byte c_v+2 .byte W02 .byte c_v+0 .byte W01 .byte VOL , 85*se_m_uproar_mvl/mxv .byte PAN , c_v-2 .byte W01 .byte c_v-4 .byte VOL , 62*se_m_uproar_mvl/mxv .byte W01 .byte 33*se_m_uproar_mvl/mxv .byte W01 .byte PAN , c_v-2 .byte VOL , 11*se_m_uproar_mvl/mxv .byte W02 .byte FINE @******************************************************@ .align 2 se_m_uproar: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_uproar_pri @ Priority .byte se_m_uproar_rev @ Reverb. .word se_m_uproar_grp .word se_m_uproar_1 .end ================================================ FILE: sound/songs/se_m_vital_throw.s ================================================ .include "MPlayDef.s" .equ se_m_vital_throw_grp, voicegroup128 .equ se_m_vital_throw_pri, 4 .equ se_m_vital_throw_rev, reverb_set+50 .equ se_m_vital_throw_mvl, 127 .equ se_m_vital_throw_key, 0 .equ se_m_vital_throw_tbs, 1 .equ se_m_vital_throw_exg, 0 .equ se_m_vital_throw_cmp, 1 .section .rodata .global se_m_vital_throw .align 2 @********************** Track 1 **********************@ se_m_vital_throw_1: .byte KEYSH , se_m_vital_throw_key+0 .byte TEMPO , 220*se_m_vital_throw_tbs/2 .byte VOICE , 22 .byte VOL , 110*se_m_vital_throw_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+16 .byte BEND , c_v+46 .byte N09 , Cn3 , v127 .byte W03 .byte VOL , 104*se_m_vital_throw_mvl/mxv .byte PAN , c_v+0 .byte BEND , c_v+23 .byte W03 .byte VOL , 93*se_m_vital_throw_mvl/mxv .byte PAN , c_v-16 .byte BEND , c_v-15 .byte W03 .byte VOICE , 21 .byte VOL , 110*se_m_vital_throw_mvl/mxv .byte BEND , c_v+0 .byte N03 , Gn4 .byte W06 .byte PAN , c_v+16 .byte N03 , Cn5 .byte W09 .byte FINE @********************** Track 2 **********************@ se_m_vital_throw_2: .byte KEYSH , se_m_vital_throw_key+0 .byte VOICE , 4 .byte VOL , 110*se_m_vital_throw_mvl/mxv .byte W09 .byte PAN , c_v+8 .byte N03 , Cn3 , v052 .byte W06 .byte PAN , c_v-7 .byte N03 .byte W09 .byte FINE @******************************************************@ .align 2 se_m_vital_throw: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_vital_throw_pri @ Priority .byte se_m_vital_throw_rev @ Reverb. .word se_m_vital_throw_grp .word se_m_vital_throw_1 .word se_m_vital_throw_2 .end ================================================ FILE: sound/songs/se_m_vital_throw2.s ================================================ .include "MPlayDef.s" .equ se_m_vital_throw2_grp, voicegroup128 .equ se_m_vital_throw2_pri, 4 .equ se_m_vital_throw2_rev, reverb_set+50 .equ se_m_vital_throw2_mvl, 127 .equ se_m_vital_throw2_key, 0 .equ se_m_vital_throw2_tbs, 1 .equ se_m_vital_throw2_exg, 0 .equ se_m_vital_throw2_cmp, 1 .section .rodata .global se_m_vital_throw2 .align 2 @********************** Track 1 **********************@ se_m_vital_throw2_1: .byte KEYSH , se_m_vital_throw2_key+0 .byte TEMPO , 220*se_m_vital_throw2_tbs/2 .byte VOICE , 6 .byte VOL , 110*se_m_vital_throw2_mvl/mxv .byte BENDR , 12 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N06 , Cn3 , v127 .byte W01 .byte BEND , c_v-9 .byte W01 .byte c_v-21 .byte W01 .byte PAN , c_v-6 .byte BEND , c_v-40 .byte W01 .byte c_v-64 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N06 , En3 .byte W01 .byte BEND , c_v-9 .byte W01 .byte c_v-21 .byte W01 .byte PAN , c_v+7 .byte BEND , c_v-40 .byte W01 .byte c_v-64 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N09 , An2 .byte W01 .byte BEND , c_v-9 .byte W01 .byte c_v-19 .byte W01 .byte c_v-29 .byte W01 .byte VOL , 86*se_m_vital_throw2_mvl/mxv .byte BEND , c_v-39 .byte W02 .byte VOL , 69*se_m_vital_throw2_mvl/mxv .byte BEND , c_v-45 .byte W01 .byte VOL , 53*se_m_vital_throw2_mvl/mxv .byte BEND , c_v-56 .byte W01 .byte VOL , 20*se_m_vital_throw2_mvl/mxv .byte BEND , c_v-64 .byte W04 .byte c_v-64 .byte FINE @********************** Track 2 **********************@ se_m_vital_throw2_2: .byte KEYSH , se_m_vital_throw2_key+0 .byte VOICE , 5 .byte XCMD , xIECV , 10 .byte xIECL , 8 .byte VOL , 110*se_m_vital_throw2_mvl/mxv .byte PAN , c_v+9 .byte N03 , Gs2 , v052 .byte W06 .byte PAN , c_v-7 .byte N03 .byte W06 .byte PAN , c_v+0 .byte N03 .byte W12 .byte FINE @******************************************************@ .align 2 se_m_vital_throw2: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_vital_throw2_pri @ Priority .byte se_m_vital_throw2_rev @ Reverb. .word se_m_vital_throw2_grp .word se_m_vital_throw2_1 .word se_m_vital_throw2_2 .end ================================================ FILE: sound/songs/se_m_waterfall.s ================================================ .include "MPlayDef.s" .equ se_m_waterfall_grp, voicegroup128 .equ se_m_waterfall_pri, 4 .equ se_m_waterfall_rev, reverb_set+50 .equ se_m_waterfall_mvl, 127 .equ se_m_waterfall_key, 0 .equ se_m_waterfall_tbs, 1 .equ se_m_waterfall_exg, 0 .equ se_m_waterfall_cmp, 1 .section .rodata .global se_m_waterfall .align 2 @********************** Track 1 **********************@ se_m_waterfall_1: .byte KEYSH , se_m_waterfall_key+0 .byte TEMPO , 150*se_m_waterfall_tbs/2 .byte VOICE , 36 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 115*se_m_waterfall_mvl/mxv .byte BEND , c_v-18 .byte N60 , Gn2 , v127 .byte W03 .byte PAN , c_v+3 .byte BEND , c_v-16 .byte W04 .byte PAN , c_v+6 .byte BEND , c_v-14 .byte W03 .byte PAN , c_v+3 .byte BEND , c_v-11 .byte W02 .byte W02 .byte PAN , c_v+0 .byte BEND , c_v-8 .byte W04 .byte PAN , c_v-3 .byte BEND , c_v-5 .byte W03 .byte PAN , c_v-6 .byte BEND , c_v-2 .byte W03 .byte W01 .byte PAN , c_v-3 .byte BEND , c_v+1 .byte W03 .byte PAN , c_v+0 .byte BEND , c_v+4 .byte W04 .byte PAN , c_v+3 .byte BEND , c_v+7 .byte W02 .byte VOL , 109*se_m_waterfall_mvl/mxv .byte W02 .byte PAN , c_v+6 .byte BEND , c_v+10 .byte W02 .byte VOL , 103*se_m_waterfall_mvl/mxv .byte W01 .byte PAN , c_v+3 .byte BEND , c_v+13 .byte W03 .byte VOL , 92*se_m_waterfall_mvl/mxv .byte W01 .byte PAN , c_v+0 .byte BEND , c_v+16 .byte W03 .byte VOL , 79*se_m_waterfall_mvl/mxv .byte PAN , c_v-3 .byte BEND , c_v+18 .byte W02 .byte W02 .byte VOL , 62*se_m_waterfall_mvl/mxv .byte PAN , c_v-6 .byte BEND , c_v+21 .byte W04 .byte VOL , 40*se_m_waterfall_mvl/mxv .byte PAN , c_v-3 .byte BEND , c_v+26 .byte W02 .byte VOL , 22*se_m_waterfall_mvl/mxv .byte BEND , c_v+33 .byte W01 .byte PAN , c_v+0 .byte W01 .byte VOL , 8*se_m_waterfall_mvl/mxv .byte BEND , c_v+43 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_waterfall_2: .byte KEYSH , se_m_waterfall_key+0 .byte VOICE , 25 .byte VOL , 115*se_m_waterfall_mvl/mxv .byte N06 , Cn3 , v040 .byte W06 .byte Gn2 .byte W06 se_m_waterfall_2_000: .byte N06 , Cn3 , v040 .byte W06 .byte Gn2 .byte W06 .byte PEND .byte PATT .word se_m_waterfall_2_000 .byte N06 , Cn3 , v032 .byte W06 .byte Gn2 .byte W06 .byte Cn3 , v012 .byte W06 .byte Gn2 .byte W06 .byte FINE @******************************************************@ .align 2 se_m_waterfall: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_waterfall_pri @ Priority .byte se_m_waterfall_rev @ Reverb. .word se_m_waterfall_grp .word se_m_waterfall_1 .word se_m_waterfall_2 .end ================================================ FILE: sound/songs/se_m_whirlpool.s ================================================ .include "MPlayDef.s" .equ se_m_whirlpool_grp, voicegroup128 .equ se_m_whirlpool_pri, 4 .equ se_m_whirlpool_rev, reverb_set+50 .equ se_m_whirlpool_mvl, 127 .equ se_m_whirlpool_key, 0 .equ se_m_whirlpool_tbs, 1 .equ se_m_whirlpool_exg, 0 .equ se_m_whirlpool_cmp, 1 .section .rodata .global se_m_whirlpool .align 2 @********************** Track 1 **********************@ se_m_whirlpool_1: .byte KEYSH , se_m_whirlpool_key+0 .byte TEMPO , 150*se_m_whirlpool_tbs/2 .byte VOICE , 36 .byte BENDR , 12 .byte PAN , c_v+0 .byte VOL , 115*se_m_whirlpool_mvl/mxv .byte BEND , c_v-18 .byte TIE , Dn2 , v127 .byte W03 .byte BEND , c_v-12 .byte W03 .byte PAN , c_v-5 .byte W02 .byte BEND , c_v-8 .byte W04 .byte PAN , c_v-10 .byte W01 .byte BEND , c_v-3 .byte W03 .byte c_v+2 .byte W02 .byte PAN , c_v-13 .byte W04 .byte BEND , c_v+5 .byte W02 .byte PAN , c_v-16 .byte W04 .byte BEND , c_v+14 .byte W02 .byte PAN , c_v-14 .byte W06 .byte c_v-9 .byte BEND , c_v+18 .byte W06 .byte PAN , c_v-6 .byte W01 .byte BEND , c_v+24 .byte W05 .byte PAN , c_v+0 .byte W06 .byte c_v+3 .byte W06 .byte c_v+7 .byte W06 .byte c_v+11 .byte BEND , c_v+17 .byte W06 .byte PAN , c_v+16 .byte BEND , c_v+10 .byte W06 .byte PAN , c_v+11 .byte W01 .byte BEND , c_v+5 .byte W05 .byte PAN , c_v+6 .byte W02 .byte VOL , 103*se_m_whirlpool_mvl/mxv .byte W01 .byte BEND , c_v+0 .byte W03 .byte PAN , c_v+4 .byte W01 .byte VOL , 85*se_m_whirlpool_mvl/mxv .byte W01 .byte BEND , c_v-5 .byte W04 .byte PAN , c_v+0 .byte W01 .byte VOL , 71*se_m_whirlpool_mvl/mxv .byte W02 .byte BEND , c_v-8 .byte W03 .byte VOL , 52*se_m_whirlpool_mvl/mxv .byte PAN , c_v-4 .byte W03 .byte BEND , c_v-12 .byte W01 .byte VOL , 32*se_m_whirlpool_mvl/mxv .byte W02 .byte PAN , c_v-10 .byte W03 .byte VOL , 11*se_m_whirlpool_mvl/mxv .byte BEND , c_v-19 .byte W03 .byte PAN , c_v-15 .byte W01 .byte VOL , 6*se_m_whirlpool_mvl/mxv .byte W01 .byte BEND , c_v-28 .byte W04 .byte EOT .byte FINE @******************************************************@ .align 2 se_m_whirlpool: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_m_whirlpool_pri @ Priority .byte se_m_whirlpool_rev @ Reverb. .word se_m_whirlpool_grp .word se_m_whirlpool_1 .end ================================================ FILE: sound/songs/se_m_yawn.s ================================================ .include "MPlayDef.s" .equ se_m_yawn_grp, voicegroup128 .equ se_m_yawn_pri, 4 .equ se_m_yawn_rev, reverb_set+50 .equ se_m_yawn_mvl, 127 .equ se_m_yawn_key, 0 .equ se_m_yawn_tbs, 1 .equ se_m_yawn_exg, 0 .equ se_m_yawn_cmp, 1 .section .rodata .global se_m_yawn .align 2 @********************** Track 1 **********************@ se_m_yawn_1: .byte VOL , 110*se_m_yawn_mvl/mxv .byte KEYSH , se_m_yawn_key+0 .byte TEMPO , 150*se_m_yawn_tbs/2 .byte VOICE , 61 .byte BENDR , 44 .byte PAN , c_v+0 .byte BEND , c_v+0 .byte N48 , Cn4 , v108 .byte W02 .byte BEND , c_v-1 .byte W01 .byte c_v+0 .byte W03 .byte c_v+0 .byte W01 .byte c_v+0 .byte W02 .byte c_v+0 .byte W01 .byte c_v+0 .byte W02 .byte PAN , c_v-4 .byte W01 .byte BEND , c_v+0 .byte W01 .byte c_v+1 .byte W02 .byte c_v+1 .byte W02 .byte c_v+1 .byte W02 .byte c_v+1 .byte W01 .byte c_v+1 .byte W03 .byte PAN , c_v-10 .byte BEND , c_v+1 .byte W01 .byte c_v+2 .byte W02 .byte c_v+2 .byte W03 .byte c_v+1 .byte W02 .byte c_v+2 .byte W01 .byte c_v+1 .byte W03 .byte PAN , c_v-4 .byte BEND , c_v+1 .byte W01 .byte c_v+1 .byte W02 .byte c_v+1 .byte W01 .byte c_v+0 .byte W02 .byte c_v+0 .byte W01 .byte c_v-1 .byte W01 .byte c_v-1 .byte W01 .byte c_v-3 .byte W01 .byte c_v-3 .byte W02 .byte FINE @********************** Track 2 **********************@ se_m_yawn_2: .byte KEYSH , se_m_yawn_key+0 .byte VOICE , 66 .byte BENDR , 44 .byte PAN , c_v+1 .byte VOL , 110*se_m_yawn_mvl/mxv .byte N48 , Dn3 , v020 .byte W24 .byte W03 .byte VOL , 103*se_m_yawn_mvl/mxv .byte W04 .byte 96*se_m_yawn_mvl/mxv .byte W03 .byte 83*se_m_yawn_mvl/mxv .byte W04 .byte 67*se_m_yawn_mvl/mxv .byte W04 .byte 49*se_m_yawn_mvl/mxv .byte W03 .byte 23*se_m_yawn_mvl/mxv .byte W03 .byte FINE @******************************************************@ .align 2 se_m_yawn: .byte 2 @ NumTrks .byte 0 @ NumBlks .byte se_m_yawn_pri @ Priority .byte se_m_yawn_rev @ Reverb. .word se_m_yawn_grp .word se_m_yawn_1 .word se_m_yawn_2 .end ================================================ FILE: sound/songs/se_rg_bag_pocket.s ================================================ .include "MPlayDef.s" .section .rodata .global se_rg_bag_pocket .align 2 .equ se_rg_bag_pocket_grp, voicegroup191 .equ se_rg_bag_pocket_pri, 5 .equ se_rg_bag_pocket_rev, reverb_set+50 se_rg_bag_pocket_1: @ 86BC7AC .byte KEYSH, 0x00 .byte TEMPO, 0xD3 .byte VOICE, 0x50 .byte VOL, 0x40 .byte BEND, 0x40 .byte N02 .byte Dn4 .byte v084 .byte W02 .byte BEND, 0x51 .byte N03 .byte Fs4 .byte v080 .byte W01 .byte BEND, 0x18 .byte W03 .byte FINE se_rg_bag_pocket_2: @ 86BC7C4 .byte KEYSH, 0x00 .byte VOICE, 0x02 .byte XCMD, 0x08 .byte GsM2 .byte v009 .byte GsM2 .byte VOL, 0x7F .byte PAN, 0x40 .byte BEND, 0x40 .byte N04 .byte En3 .byte v127 .byte W03 .byte W01 .byte VOICE, 0x02 .byte N02 .byte Bn3 .byte W02 .byte FINE @ *************************************** .align 2 se_rg_bag_pocket: @ 86BC7E0 .byte 2 .byte 0 .byte se_rg_bag_pocket_pri .byte se_rg_bag_pocket_rev .word se_rg_bag_pocket_grp .word se_rg_bag_pocket_1 .word se_rg_bag_pocket_2 ================================================ FILE: sound/songs/se_wall_hit.s ================================================ .include "MPlayDef.s" .equ se_wall_hit_grp, voicegroup127 .equ se_wall_hit_pri, 2 .equ se_wall_hit_rev, reverb_set+50 .equ se_wall_hit_mvl, 127 .equ se_wall_hit_key, 0 .equ se_wall_hit_tbs, 1 .equ se_wall_hit_exg, 0 .equ se_wall_hit_cmp, 1 .section .rodata .global se_wall_hit .align 2 @********************** Track 1 **********************@ se_wall_hit_1: .byte KEYSH , se_wall_hit_key+0 .byte TEMPO , 220*se_wall_hit_tbs/2 .byte VOICE , 89 .byte VOL , 80*se_wall_hit_mvl/mxv .byte BEND , c_v+0 .byte N18 , Gn1 , v127 .byte W24 .byte FINE @******************************************************@ .align 2 se_wall_hit: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_wall_hit_pri @ Priority .byte se_wall_hit_rev @ Reverb. .word se_wall_hit_grp .word se_wall_hit_1 .end ================================================ FILE: sound/songs/se_win_open.s ================================================ .include "MPlayDef.s" .equ se_win_open_grp, voicegroup127 .equ se_win_open_pri, 5 .equ se_win_open_rev, reverb_set+50 .equ se_win_open_mvl, 127 .equ se_win_open_key, 0 .equ se_win_open_tbs, 1 .equ se_win_open_exg, 0 .equ se_win_open_cmp, 1 .section .rodata .global se_win_open .align 2 @********************** Track 1 **********************@ se_win_open_1: .byte KEYSH , se_win_open_key+0 .byte TEMPO , 220*se_win_open_tbs/2 .byte VOICE , 127 .byte VOL , 110*se_win_open_mvl/mxv .byte N03 , Ds3 , v127 .byte W03 .byte N15 , Gn4 .byte W21 .byte FINE @******************************************************@ .align 2 se_win_open: .byte 1 @ NumTrks .byte 0 @ NumBlks .byte se_win_open_pri @ Priority .byte se_win_open_rev @ Reverb. .word se_win_open_grp .word se_win_open_1 .end ================================================ FILE: sound/voice_groups.inc ================================================ .include "sound/voicegroups/voicegroup000.inc" .include "sound/voicegroups/voicegroup001.inc" .include "sound/voicegroups/voicegroup002.inc" .include "sound/voicegroups/voicegroup003.inc" .include "sound/voicegroups/voicegroup004.inc" .include "sound/voicegroups/voicegroup005.inc" .include "sound/voicegroups/voicegroup006.inc" .include "sound/voicegroups/voicegroup007.inc" .include "sound/voicegroups/voicegroup008.inc" .include "sound/voicegroups/voicegroup009.inc" .include "sound/voicegroups/voicegroup010.inc" .include "sound/voicegroups/voicegroup011.inc" .include "sound/voicegroups/voicegroup012.inc" .include "sound/voicegroups/voicegroup013.inc" .include "sound/voicegroups/voicegroup014.inc" .include "sound/voicegroups/voicegroup015.inc" .include "sound/voicegroups/voicegroup016.inc" .include "sound/voicegroups/voicegroup017.inc" .include "sound/voicegroups/voicegroup018.inc" .include "sound/voicegroups/voicegroup019.inc" .include "sound/voicegroups/voicegroup020.inc" .include "sound/voicegroups/voicegroup021.inc" .include "sound/voicegroups/voicegroup022.inc" .include "sound/voicegroups/voicegroup023.inc" .include "sound/voicegroups/voicegroup024.inc" .include "sound/voicegroups/voicegroup025.inc" .include "sound/voicegroups/voicegroup026.inc" .include "sound/voicegroups/voicegroup027.inc" .include "sound/voicegroups/voicegroup028.inc" .include "sound/voicegroups/voicegroup029.inc" .include "sound/voicegroups/voicegroup030.inc" .include "sound/voicegroups/voicegroup031.inc" .include "sound/voicegroups/voicegroup032.inc" .include "sound/voicegroups/voicegroup033.inc" .include "sound/voicegroups/voicegroup034.inc" .include "sound/voicegroups/voicegroup035.inc" .include "sound/voicegroups/voicegroup036.inc" .include "sound/voicegroups/voicegroup037.inc" .include "sound/voicegroups/voicegroup038.inc" .include "sound/voicegroups/voicegroup039.inc" .include "sound/voicegroups/voicegroup040.inc" .include "sound/voicegroups/voicegroup041.inc" .include "sound/voicegroups/voicegroup042.inc" .include "sound/voicegroups/voicegroup043.inc" .include "sound/voicegroups/voicegroup044.inc" .include "sound/voicegroups/voicegroup045.inc" .include "sound/voicegroups/voicegroup046.inc" .include "sound/voicegroups/voicegroup047.inc" .include "sound/voicegroups/voicegroup048.inc" .include "sound/voicegroups/voicegroup049.inc" .include "sound/voicegroups/voicegroup050.inc" .include "sound/voicegroups/voicegroup051.inc" .include "sound/voicegroups/voicegroup052.inc" .include "sound/voicegroups/voicegroup053.inc" .include "sound/voicegroups/voicegroup054.inc" .include "sound/voicegroups/voicegroup055.inc" .include "sound/voicegroups/voicegroup056.inc" .include "sound/voicegroups/voicegroup057.inc" .include "sound/voicegroups/voicegroup058.inc" .include "sound/voicegroups/voicegroup059.inc" .include "sound/voicegroups/voicegroup060.inc" .include "sound/voicegroups/voicegroup061.inc" .include "sound/voicegroups/voicegroup062.inc" .include "sound/voicegroups/voicegroup063.inc" .include "sound/voicegroups/voicegroup064.inc" .include "sound/voicegroups/voicegroup065.inc" .include "sound/voicegroups/voicegroup066.inc" .include "sound/voicegroups/voicegroup067.inc" .include "sound/voicegroups/voicegroup068.inc" .include "sound/voicegroups/voicegroup069.inc" .include "sound/voicegroups/voicegroup070.inc" .include "sound/voicegroups/voicegroup071.inc" .include "sound/voicegroups/voicegroup072.inc" .include "sound/voicegroups/voicegroup073.inc" .include "sound/voicegroups/voicegroup074.inc" .include "sound/voicegroups/voicegroup075.inc" .include "sound/voicegroups/voicegroup076.inc" .include "sound/voicegroups/voicegroup077.inc" .include "sound/voicegroups/voicegroup078.inc" .include "sound/voicegroups/voicegroup079.inc" .include "sound/voicegroups/voicegroup080.inc" .include "sound/voicegroups/voicegroup081.inc" .include "sound/voicegroups/voicegroup082.inc" .include "sound/voicegroups/voicegroup083.inc" .include "sound/voicegroups/voicegroup084.inc" .include "sound/voicegroups/voicegroup085.inc" .include "sound/voicegroups/voicegroup086.inc" .include "sound/voicegroups/voicegroup087.inc" .include "sound/voicegroups/voicegroup088.inc" .include "sound/voicegroups/voicegroup089.inc" .include "sound/voicegroups/voicegroup090.inc" .include "sound/voicegroups/voicegroup091.inc" .include "sound/voicegroups/voicegroup092.inc" .include "sound/voicegroups/voicegroup093.inc" .include "sound/voicegroups/voicegroup094.inc" .include "sound/voicegroups/voicegroup095.inc" .include "sound/voicegroups/voicegroup096.inc" .include "sound/voicegroups/voicegroup097.inc" .include "sound/voicegroups/voicegroup098.inc" .include "sound/voicegroups/voicegroup099.inc" .include "sound/voicegroups/voicegroup100.inc" .include "sound/voicegroups/voicegroup101.inc" .include "sound/voicegroups/voicegroup102.inc" .include "sound/voicegroups/voicegroup103.inc" .include "sound/voicegroups/voicegroup104.inc" .include "sound/voicegroups/voicegroup105.inc" .include "sound/voicegroups/voicegroup106.inc" .include "sound/voicegroups/voicegroup107.inc" .include "sound/voicegroups/voicegroup108.inc" .include "sound/voicegroups/voicegroup109.inc" .include "sound/voicegroups/voicegroup110.inc" .include "sound/voicegroups/voicegroup111.inc" .include "sound/voicegroups/voicegroup112.inc" .include "sound/voicegroups/voicegroup113.inc" .include "sound/voicegroups/voicegroup114.inc" .include "sound/voicegroups/voicegroup115.inc" .include "sound/voicegroups/voicegroup116.inc" .include "sound/voicegroups/voicegroup117.inc" .include "sound/voicegroups/voicegroup118.inc" .include "sound/voicegroups/voicegroup119.inc" .include "sound/voicegroups/voicegroup120.inc" .include "sound/voicegroups/voicegroup121.inc" .include "sound/voicegroups/voicegroup122.inc" .include "sound/voicegroups/voicegroup123.inc" .include "sound/voicegroups/voicegroup124.inc" .include "sound/voicegroups/voicegroup125.inc" .include "sound/voicegroups/voicegroup126.inc" .include "sound/voicegroups/voicegroup127.inc" .include "sound/voicegroups/voicegroup128.inc" .include "sound/cry_tables.inc" .include "sound/voicegroups/voicegroup129.inc" .include "sound/voicegroups/voicegroup130.inc" .include "sound/voicegroups/voicegroup131.inc" .include "sound/voicegroups/voicegroup132.inc" .include "sound/voicegroups/voicegroup133.inc" .include "sound/voicegroups/voicegroup134.inc" .include "sound/voicegroups/voicegroup135.inc" .include "sound/voicegroups/voicegroup136.inc" .include "sound/voicegroups/voicegroup137.inc" .include "sound/voicegroups/voicegroup138.inc" .include "sound/voicegroups/voicegroup139.inc" .include "sound/voicegroups/voicegroup140.inc" .include "sound/voicegroups/voicegroup141.inc" .include "sound/voicegroups/voicegroup142.inc" .include "sound/voicegroups/voicegroup143.inc" .include "sound/voicegroups/voicegroup144.inc" .include "sound/voicegroups/voicegroup145.inc" .include "sound/voicegroups/voicegroup146.inc" .include "sound/voicegroups/voicegroup147.inc" .include "sound/voicegroups/voicegroup148.inc" .include "sound/voicegroups/voicegroup149.inc" .include "sound/voicegroups/voicegroup150.inc" .include "sound/voicegroups/voicegroup151.inc" .include "sound/voicegroups/voicegroup152.inc" .include "sound/voicegroups/voicegroup153.inc" .include "sound/voicegroups/voicegroup154.inc" .include "sound/voicegroups/voicegroup155.inc" .include "sound/voicegroups/voicegroup156.inc" .include "sound/voicegroups/voicegroup157.inc" .include "sound/voicegroups/voicegroup158.inc" .include "sound/voicegroups/voicegroup159.inc" .include "sound/voicegroups/voicegroup160.inc" .include "sound/voicegroups/voicegroup161.inc" .include "sound/voicegroups/voicegroup162.inc" .include "sound/voicegroups/voicegroup163.inc" .include "sound/voicegroups/voicegroup164.inc" .include "sound/voicegroups/voicegroup165.inc" .include "sound/voicegroups/voicegroup166.inc" .include "sound/voicegroups/voicegroup167.inc" .include "sound/voicegroups/voicegroup168.inc" .include "sound/voicegroups/voicegroup169.inc" .include "sound/voicegroups/voicegroup170.inc" .include "sound/voicegroups/voicegroup171.inc" .include "sound/voicegroups/voicegroup172.inc" .include "sound/voicegroups/voicegroup173.inc" .include "sound/voicegroups/voicegroup174.inc" .include "sound/voicegroups/voicegroup175.inc" .include "sound/voicegroups/voicegroup176.inc" .include "sound/voicegroups/voicegroup177.inc" .include "sound/voicegroups/voicegroup178.inc" .include "sound/voicegroups/voicegroup179.inc" .include "sound/voicegroups/voicegroup180.inc" .include "sound/voicegroups/voicegroup181.inc" .include "sound/voicegroups/voicegroup182.inc" .include "sound/voicegroups/voicegroup183.inc" .include "sound/voicegroups/voicegroup184.inc" .include "sound/voicegroups/voicegroup185.inc" .include "sound/voicegroups/voicegroup186.inc" .include "sound/voicegroups/voicegroup187.inc" .include "sound/voicegroups/voicegroup188.inc" .include "sound/voicegroups/voicegroup189.inc" .include "sound/voicegroups/voicegroup190.inc" .include "sound/voicegroups/voicegroup191.inc" ================================================ FILE: sound/voicegroups/voicegroup000.inc ================================================ .align 2 voicegroup000:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 0, 9, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup001.inc ================================================ .align 2 voicegroup001:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 1, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 6, 0 voice_programmable_wave 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 1, 6, 0 voice_square_2 60, 0, 3, 0, 1, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 0, 0, 1, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 ================================================ FILE: sound/voicegroups/voicegroup002.inc ================================================ .align 2 voicegroup002:: voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_oboe, 255, 165, 154, 127 voice_directsound 60, 0, DirectSoundWaveData_unused_sd90_oboe, 255, 165, 154, 127 voice_directsound 60, 0, DirectSoundWaveData_unused_guitar_separates_power_chord, 255, 165, 206, 127 voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 206, 127 voice_directsound 60, 0, DirectSoundWaveData_unknown_snare, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_directsound 48, 44, DirectSoundWaveData_unused_sc55_tom, 255, 210, 77, 204 voice_directsound_no_resample 60, 79, DirectSoundWaveData_unknown_close_hihat, 255, 127, 0, 188 voice_directsound 51, 54, DirectSoundWaveData_unused_sc55_tom, 255, 216, 77, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 54, 64, DirectSoundWaveData_unused_sc55_tom, 255, 216, 77, 204 voice_directsound_no_resample 60, 79, DirectSoundWaveData_unknown_open_hihat, 255, 242, 141, 0 voice_directsound 57, 69, DirectSoundWaveData_unused_sc55_tom, 255, 210, 77, 204 voice_directsound 60, 79, DirectSoundWaveData_unused_sc55_tom, 255, 204, 77, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 62, 84, DirectSoundWaveData_unused_sc55_tom, 255, 204, 77, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 70, 49, DirectSoundWaveData_unknown_bell, 255, 165, 103, 231 voice_directsound_no_resample 32, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 voice_directsound_no_resample 60, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 235, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 voice_directsound_no_resample 30, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 72, 104, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 72, 94, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 voice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 voice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 33, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound 84, 104, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 ================================================ FILE: sound/voicegroups/voicegroup003.inc ================================================ .align 2 voicegroup003:: voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 voice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 voice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 voice_directsound_no_resample 64, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 voice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 voice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 voice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 voice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 voice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 33, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound 64, 104, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 ================================================ FILE: sound/voicegroups/voicegroup004.inc ================================================ .align 2 voicegroup004:: voice_directsound_no_resample 66, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 voice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 voice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 voice_directsound_no_resample 64, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 voice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 61, 84, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 voice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 voice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 voice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 voice_directsound 62, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 voice_directsound 65, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 voice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound 56, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound 64, 104, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 voice_directsound_no_resample 66, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 voice_directsound 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 voice_directsound 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 voice_directsound 60, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 58, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound 62, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 voice_directsound 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 voice_directsound 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_directsound 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_directsound 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 61, 84, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0 voice_directsound 64, 64, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 voice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 voice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 ================================================ FILE: sound/voicegroups/voicegroup005.inc ================================================ .align 2 voicegroup005:: voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_48, 255, 252, 0, 239 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_60, 255, 250, 0, 221 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_72, 255, 250, 0, 221 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_84, 255, 247, 0, 221 ================================================ FILE: sound/voicegroups/voicegroup006.inc ================================================ .align 2 voicegroup006:: voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_60, 255, 0, 255, 196 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_72, 255, 0, 255, 196 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_84, 255, 0, 255, 196 ================================================ FILE: sound/voicegroups/voicegroup007.inc ================================================ .align 2 voicegroup007:: voice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_60, 255, 0, 193, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_72, 255, 0, 193, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_84, 255, 0, 193, 127 voice_square_1_alt 60, 0, 38, 2, 1, 0, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 36, 2, 0, 1, 4, 2 voice_square_1_alt 60, 0, 21, 2, 0, 0, 15, 2 ================================================ FILE: sound/voicegroups/voicegroup008.inc ================================================ .align 2 voicegroup008:: voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tuba_39, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tuba_51, 255, 0, 255, 165 ================================================ FILE: sound/voicegroups/voicegroup009.inc ================================================ .align 2 voicegroup009:: voice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_60, 255, 0, 224, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_72, 255, 0, 218, 165 ================================================ FILE: sound/voicegroups/voicegroup010.inc ================================================ .align 2 voicegroup010:: voice_keysplit_all voicegroup031 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 3, 0, 4, 0, 1 voice_square_1 60, 0, 0, 3, 0, 4, 0, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 3, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 ================================================ FILE: sound/voicegroups/voicegroup011.inc ================================================ .align 2 voicegroup011:: voice_keysplit_all voicegroup022 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 0 voice_square_2_alt 60, 0, 3, 0, 2, 4, 0 voice_square_2_alt 60, 0, 2, 0, 3, 0, 0 voice_square_2_alt 60, 0, 2, 0, 3, 0, 0 voice_square_1_alt 60, 0, 0, 2, 0, 3, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 1, 1, 7, 1 voice_square_1_alt 60, 0, 0, 2, 1, 1, 7, 1 voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup012.inc ================================================ .align 2 voicegroup012:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 178, 180, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 29, 2, 0, 2, 0, 0 voice_square_1_alt 60, 0, 22, 2, 0, 2, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup013.inc ================================================ .align 2 voicegroup013:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 1 voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 1 ================================================ FILE: sound/voicegroups/voicegroup014.inc ================================================ .align 2 voicegroup014:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 6, 1 voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 1 voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 ================================================ FILE: sound/voicegroups/voicegroup015.inc ================================================ .align 2 voicegroup015:: voice_keysplit_all voicegroup016 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 3, 0, 2, 0, 0 voice_square_1 60, 0, 0, 3, 0, 2, 0, 0 voice_square_2 60, 0, 3, 0, 6, 0, 0 voice_square_1 60, 0, 0, 3, 0, 6, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup016.inc ================================================ .align 2 voicegroup016:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 0, 2 voice_noise_alt 60, 0, 0, 0, 1, 0, 1 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 32, 74, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 72, 66, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 72, 62, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 ================================================ FILE: sound/voicegroups/voicegroup017.inc ================================================ .align 2 voicegroup017:: voice_keysplit_all voicegroup001 voice_square_2_alt 60, 0, 2, 0, 3, 3, 1 voice_square_1_alt 60, 0, 0, 2, 0, 3, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 7, 2 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 2 voice_square_2_alt 60, 0, 2, 1, 1, 0, 0 voice_square_1_alt 60, 0, 0, 2, 1, 1, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 1, 1, 7, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 voice_square_1_alt 60, 0, 0, 2, 1, 1, 7, 2 voice_square_2_alt 60, 0, 3, 1, 1, 7, 2 voice_square_1_alt 60, 0, 0, 3, 1, 1, 7, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3 voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 2 voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 2 voice_square_2_alt 60, 0, 1, 1, 2, 6, 2 voice_square_1_alt 60, 0, 0, 1, 1, 2, 6, 2 voice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 2 ================================================ FILE: sound/voicegroups/voicegroup018.inc ================================================ .align 2 voicegroup018:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 1, 0, 1, 0, 3 ================================================ FILE: sound/voicegroups/voicegroup019.inc ================================================ .align 2 voicegroup019:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 voice_square_2_alt 60, 0, 2, 0, 2, 6, 1 voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 2 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1 voice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 1 ================================================ FILE: sound/voicegroups/voicegroup020.inc ================================================ .align 2 voicegroup020:: voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 voice_square_2_alt 60, 0, 1, 0, 1, 6, 2 voice_square_1_alt 60, 0, 0, 1, 0, 1, 6, 2 voice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 7, 1 ================================================ FILE: sound/voicegroups/voicegroup021.inc ================================================ .align 2 voicegroup021:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 2, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 6, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 0 voice_square_1_alt 60, 0, 0, 3, 0, 0, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup022.inc ================================================ .align 2 voicegroup022:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 7, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 32, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 72, 67, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 72, 61, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 ================================================ FILE: sound/voicegroups/voicegroup023.inc ================================================ .align 2 voicegroup023:: voice_keysplit voicegroup005, KeySplitTable1 voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 7, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0 voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 0 voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 ================================================ FILE: sound/voicegroups/voicegroup024.inc ================================================ .align 2 voicegroup024:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 7, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0 voice_square_2_alt 60, 0, 2, 0, 2, 0, 0 voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0 voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 ================================================ FILE: sound/voicegroups/voicegroup025.inc ================================================ .align 2 voicegroup025:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 voice_square_2_alt 60, 0, 2, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup026.inc ================================================ .align 2 voicegroup026:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 9, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 9, 0 voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 ================================================ FILE: sound/voicegroups/voicegroup027.inc ================================================ .align 2 voicegroup027:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 1, 0, 2, 0, 0 voice_square_1 60, 0, 0, 1, 0, 2, 0, 0 voice_square_2 60, 0, 1, 0, 6, 0, 0 voice_square_1 60, 0, 0, 1, 0, 6, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 4, 1, 4 voice_noise_alt 60, 0, 0, 0, 1, 0, 2 ================================================ FILE: sound/voicegroups/voicegroup028.inc ================================================ .align 2 voicegroup028:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 3, 0, 1, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 0, 0, 2, 0, 0 voice_square_1 60, 0, 0, 0, 0, 2, 0, 0 voice_square_2 60, 0, 0, 0, 6, 0, 0 voice_square_1 60, 0, 0, 0, 0, 6, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 2, 0, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_2 60, 0, 3, 0, 4, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup029.inc ================================================ .align 2 voicegroup029:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 voice_square_2_alt 60, 0, 3, 0, 1, 0, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 0 ================================================ FILE: sound/voicegroups/voicegroup030.inc ================================================ .align 2 voicegroup030:: voice_keysplit_all voicegroup031 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 2, 4, 0 voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 37, 165, 180, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup031.inc ================================================ .align 2 voicegroup031:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 165, 154, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 32, 49, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 72, 79, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 72, 74, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 ================================================ FILE: sound/voicegroups/voicegroup032.inc ================================================ .align 2 voicegroup032:: voice_keysplit_all voicegroup016 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 3, 4, 0 voice_square_1_alt 60, 0, 0, 3, 0, 3, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 250, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 voice_noise_alt 60, 0, 0, 0, 4, 1, 4 voice_noise_alt 60, 0, 0, 0, 1, 0, 2 ================================================ FILE: sound/voicegroups/voicegroup033.inc ================================================ .align 2 voicegroup033:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 ================================================ FILE: sound/voicegroups/voicegroup034.inc ================================================ .align 2 voicegroup034:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 4, 2 voice_square_1 60, 0, 0, 2, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave 60, 0, ProgrammableWaveData_16, 0, 7, 15, 2 ================================================ FILE: sound/voicegroups/voicegroup035.inc ================================================ .align 2 voicegroup035:: voice_keysplit_all voicegroup031 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 6, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 0, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup036.inc ================================================ .align 2 voicegroup036:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 4, 1, 4 voice_noise_alt 60, 0, 0, 0, 1, 0, 2 ================================================ FILE: sound/voicegroups/voicegroup037.inc ================================================ .align 2 voicegroup037:: voice_keysplit_all voicegroup031 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 ================================================ FILE: sound/voicegroups/voicegroup038.inc ================================================ .align 2 voicegroup038:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup039.inc ================================================ .align 2 voicegroup039:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup040.inc ================================================ .align 2 voicegroup040:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup041.inc ================================================ .align 2 voicegroup041:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup042.inc ================================================ .align 2 voicegroup042:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup043.inc ================================================ .align 2 voicegroup043:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 ================================================ FILE: sound/voicegroups/voicegroup044.inc ================================================ .align 2 voicegroup044:: voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 5, 1, 7 voice_square_2_alt 60, 0, 3, 0, 4, 3, 6 voice_square_2_alt 60, 0, 2, 1, 1, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 224 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 ================================================ FILE: sound/voicegroups/voicegroup045.inc ================================================ .align 2 voicegroup045:: voice_keysplit_all voicegroup001 voice_square_1_alt 60, 0, 0, 1, 0, 2, 0, 1 voice_square_1_alt 60, 0, 0, 3, 1, 2, 6, 0 voice_square_2_alt 60, 0, 3, 1, 2, 6, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 2, 0, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 1, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup046.inc ================================================ .align 2 voicegroup046:: voice_keysplit voicegroup005, KeySplitTable1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 1, 12, 0 voice_square_1_alt 60, 0, 0, 0, 1, 1, 9, 0 voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216 voice_square_2_alt 60, 0, 1, 0, 2, 6, 3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup047.inc ================================================ .align 2 voicegroup047:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 6, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 1, 7, 15, 2 voice_square_2_alt 60, 0, 1, 1, 1, 4, 1 voice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup048.inc ================================================ .align 2 voicegroup048:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 7, 3, 3 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 204, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 239 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 4, 4, 0 voice_square_1_alt 60, 0, 0, 3, 0, 3, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 3, 3, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 12, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 0, 2, 4, 0 ================================================ FILE: sound/voicegroups/voicegroup049.inc ================================================ .align 2 voicegroup049:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 voice_square_2_alt 60, 0, 1, 1, 3, 4, 2 voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 1, 7, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 4, 2 voice_square_2_alt 60, 0, 1, 1, 3, 4, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 1, 4, 4, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup050.inc ================================================ .align 2 voicegroup050:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup051.inc ================================================ .align 2 voicegroup051:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 1, 4, 4, 2 voice_square_1_alt 60, 0, 0, 2, 0, 3, 4, 1 voice_square_2_alt 60, 0, 2, 1, 3, 4, 2 voice_square_1_alt 60, 0, 0, 2, 0, 3, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 ================================================ FILE: sound/voicegroups/voicegroup052.inc ================================================ .align 2 voicegroup052:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 3, 1, 2, 6, 0 voice_square_2 60, 0, 3, 1, 2, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 1, 6, 1 voice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 7, 6, 1 voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 9, 4 voice_noise_alt 60, 0, 0, 3, 1, 10, 0 voice_noise_alt 60, 0, 0, 0, 2, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup053.inc ================================================ .align 2 voicegroup053:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 4, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup054.inc ================================================ .align 2 voicegroup054:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 5, 2 voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup055.inc ================================================ .align 2 voicegroup055:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 2 voice_square_2_alt 60, 0, 1, 1, 1, 4, 1 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup056.inc ================================================ .align 2 voicegroup056:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup057.inc ================================================ .align 2 voicegroup057:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 188, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 128, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_bubbles, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 1, 4, 10, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 1, 5, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup058.inc ================================================ .align 2 voicegroup058:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup059.inc ================================================ .align 2 voicegroup059:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 1, 1, 6, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 2 voice_square_2_alt 60, 0, 2, 0, 1, 6, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 ================================================ FILE: sound/voicegroups/voicegroup060.inc ================================================ .align 2 voicegroup060:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 128, 226, 0, 38 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 1, 1, 6, 1 voice_square_1_alt 60, 0, 0, 1, 0, 4, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 7, 3, 3 voice_square_1_alt 60, 0, 0, 2, 0, 7, 3, 3 voice_square_1_alt 60, 0, 0, 3, 2, 2, 7, 0 voice_square_2_alt 60, 0, 1, 1, 2, 3, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup061.inc ================================================ .align 2 voicegroup061:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup062.inc ================================================ .align 2 voicegroup062:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup063.inc ================================================ .align 2 voicegroup063:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup064.inc ================================================ .align 2 voicegroup064:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup065.inc ================================================ .align 2 voicegroup065:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup066.inc ================================================ .align 2 voicegroup066:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3 voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup067.inc ================================================ .align 2 voicegroup067:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup068.inc ================================================ .align 2 voicegroup068:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 2, 3, 1 voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup069.inc ================================================ .align 2 voicegroup069:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup070.inc ================================================ .align 2 voicegroup070:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup071.inc ================================================ .align 2 voicegroup071:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup072.inc ================================================ .align 2 voicegroup072:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup073.inc ================================================ .align 2 voicegroup073:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup074.inc ================================================ .align 2 voicegroup074:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 0 voice_square_2_alt 60, 0, 2, 0, 1, 4, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup075.inc ================================================ .align 2 voicegroup075:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 3, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup076.inc ================================================ .align 2 voicegroup076:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup077.inc ================================================ .align 2 voicegroup077:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 196 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup078.inc ================================================ .align 2 voicegroup078:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 196 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 2, 0, 2 ================================================ FILE: sound/voicegroups/voicegroup079.inc ================================================ .align 2 voicegroup079:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 2, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 1 voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 5 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 4, 4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup080.inc ================================================ .align 2 voicegroup080:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup081.inc ================================================ .align 2 voicegroup081:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup005, KeySplitTable1 ================================================ FILE: sound/voicegroups/voicegroup082.inc ================================================ .align 2 voicegroup082:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 1 voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 4, 4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup083.inc ================================================ .align 2 voicegroup083:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 6, 4 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup084.inc ================================================ .align 2 voicegroup084:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 0 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup085.inc ================================================ .align 2 voicegroup085:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 1, 2, 4, 0 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 13, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup086.inc ================================================ .align 2 voicegroup086:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup087.inc ================================================ .align 2 voicegroup087:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup088.inc ================================================ .align 2 voicegroup088:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 1, 1, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 6, 2 voice_square_2_alt 60, 0, 1, 0, 2, 4, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup089.inc ================================================ .align 2 voicegroup089:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 3 voice_square_2_alt 60, 0, 2, 0, 2, 4, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup090.inc ================================================ .align 2 voicegroup090:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 4, 1 voice_square_2_alt 60, 0, 0, 0, 2, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup091.inc ================================================ .align 2 voicegroup091:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 5, 2 voice_square_2_alt 60, 0, 2, 0, 1, 5, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 7, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup092.inc ================================================ .align 2 voicegroup092:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup093.inc ================================================ .align 2 voicegroup093:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup094.inc ================================================ .align 2 voicegroup094:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup095.inc ================================================ .align 2 voicegroup095:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3 voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup096.inc ================================================ .align 2 voicegroup096:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup097.inc ================================================ .align 2 voicegroup097:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 249 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup098.inc ================================================ .align 2 voicegroup098:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_unknown_10, 255, 255, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup099.inc ================================================ .align 2 voicegroup099:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0 voice_square_2_alt 60, 0, 0, 0, 1, 4, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0 voice_square_1_alt 60, 0, 0, 1, 2, 1, 5, 0 voice_square_2_alt 60, 0, 1, 2, 1, 5, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup100.inc ================================================ .align 2 voicegroup100:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 2, 1, 1, 4, 1 voice_square_2_alt 60, 0, 2, 1, 1, 4, 1 voice_square_2_alt 60, 0, 1, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup101.inc ================================================ .align 2 voicegroup101:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 1, 5, 2, 4 voice_square_2_alt 60, 0, 1, 1, 5, 2, 4 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 1, 1, 6, 0 voice_square_1_alt 60, 0, 0, 0, 0, 4, 6, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 1, 4, 6, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 1, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 1, 1, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup102.inc ================================================ .align 2 voicegroup102:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 248 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 6, 0, 6 voice_square_2_alt 60, 0, 2, 0, 6, 0, 6 ================================================ FILE: sound/voicegroups/voicegroup103.inc ================================================ .align 2 voicegroup103:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 0, 10, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup104.inc ================================================ .align 2 voicegroup104:: voice_keysplit_all voicegroup003 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_unknown_koto_high, 255, 0, 206, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_shakuhachi, 255, 0, 255, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 2, 0, 12, 5 voice_square_2_alt 60, 0, 0, 0, 0, 10, 4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 2, 0, 12, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_unknown_koto_low, 255, 0, 206, 242 ================================================ FILE: sound/voicegroups/voicegroup105.inc ================================================ .align 2 voicegroup105:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 9, 4 voice_square_2_alt 60, 0, 2, 0, 2, 9, 4 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 ================================================ FILE: sound/voicegroups/voicegroup106.inc ================================================ .align 2 voicegroup106:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 38, 128, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup107.inc ================================================ .align 2 voicegroup107:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1 voice_square_2_alt 60, 0, 3, 0, 1, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup108.inc ================================================ .align 2 voicegroup108:: voice_keysplit_all voicegroup004 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_heart_of_asia_gamelan, 255, 188, 139, 239 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 13, 4 voice_square_2_alt 60, 0, 0, 0, 0, 9, 2 voice_square_2_alt 60, 0, 1, 0, 0, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup109.inc ================================================ .align 2 voicegroup109:: voice_keysplit_all voicegroup004 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_church_organ3_low, 255, 76, 154, 188 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_church_organ3_high, 255, 76, 154, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 0, 13, 1 voice_square_2_alt 60, 0, 0, 0, 0, 12, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup110.inc ================================================ .align 2 voicegroup110:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 0, 10, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup111.inc ================================================ .align 2 voicegroup111:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 226 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 195 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 195 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 195 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 2, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup112.inc ================================================ .align 2 voicegroup112:: voice_keysplit_all voicegroup003 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 128, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 128, 165, 128, 188 voice_directsound 60, 0, DirectSoundWaveData_unknown_female_voice, 128, 165, 128, 204 voice_directsound 60, 0, DirectSoundWaveData_unused_unknown_male_voice, 128, 165, 128, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 0 voice_square_2_alt 60, 0, 1, 0, 0, 6, 0 voice_square_2_alt 60, 0, 3, 0, 0, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 7, 10, 1 voice_noise_alt 60, 0, 0, 0, 2, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup113.inc ================================================ .align 2 voicegroup113:: voice_keysplit_all voicegroup002 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_23, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_25, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_24, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_22, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_9, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_10, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_11, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_12, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_13, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 195 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 7, 7, 0 voice_square_2_alt 60, 0, 2, 0, 7, 7, 0 voice_square_2_alt 60, 0, 1, 0, 7, 7, 0 voice_square_2_alt 60, 0, 0, 0, 7, 7, 0 voice_square_2_alt 60, 0, 3, 0, 7, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 7, 7, 0 voice_square_1_alt 60, 0, 0, 0, 0, 7, 7, 0 voice_square_1_alt 60, 0, 0, 3, 0, 7, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 voice_noise_alt 60, 0, 0, 0, 2, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup114.inc ================================================ .align 2 voicegroup114:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 ================================================ FILE: sound/voicegroups/voicegroup115.inc ================================================ .align 2 voicegroup115:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 128, 249, 0, 188 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 188, 103, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 165, 154, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 198 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 146 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 165, 180, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 0, 1, 6, 0 voice_square_2_alt 60, 0, 3, 0, 3, 6, 2 voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 voice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 1, 9, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 2 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup116.inc ================================================ .align 2 voicegroup116:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 190, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 voice_square_2_alt 60, 0, 3, 0, 3, 3, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 3, 6, 5 voice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup117.inc ================================================ .align 2 voicegroup117:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 1, 1 voice_square_1 60, 0, 0, 2, 0, 1, 1, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 3, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 ================================================ FILE: sound/voicegroups/voicegroup118.inc ================================================ .align 2 voicegroup118:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 0, 0, 1, 7, 1 voice_square_1 60, 0, 0, 0, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 250, 0, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 0, 255, 127 ================================================ FILE: sound/voicegroups/voicegroup119.inc ================================================ .align 2 voicegroup119:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 0, 0, 2, 4, 1 voice_square_1 60, 0, 0, 0, 0, 2, 4, 1 voice_square_2 60, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 60, 0, DirectSoundWaveData_sc88pro_timpani_with_snare, 255, 246, 0, 226 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 voice_square_2 60, 0, 1, 0, 1, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 ================================================ FILE: sound/voicegroups/voicegroup120.inc ================================================ .align 2 voicegroup120:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 2, 6, 1 voice_square_1 60, 0, 0, 2, 0, 2, 6, 1 voice_square_2 60, 0, 3, 0, 2, 4, 1 voice_square_1 60, 0, 0, 3, 0, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 7, 1 voice_square_2 60, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 ================================================ FILE: sound/voicegroups/voicegroup121.inc ================================================ .align 2 voicegroup121:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 voice_square_2 60, 0, 0, 0, 1, 7, 1 voice_square_1 60, 0, 0, 0, 0, 1, 7, 1 voice_square_1 60, 0, 0, 0, 0, 0, 7, 1 ================================================ FILE: sound/voicegroups/voicegroup122.inc ================================================ .align 2 voicegroup122:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 1, 0, 1, 6, 1 voice_square_1 60, 0, 0, 1, 0, 1, 6, 1 voice_square_2 60, 0, 2, 0, 1, 6, 1 voice_square_1 60, 0, 0, 2, 0, 1, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 165, 154, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 voice_square_1 60, 0, 0, 3, 0, 1, 9, 1 voice_square_1 60, 0, 0, 3, 0, 0, 9, 1 ================================================ FILE: sound/voicegroups/voicegroup123.inc ================================================ .align 2 voicegroup123:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 ================================================ FILE: sound/voicegroups/voicegroup124.inc ================================================ .align 2 voicegroup124:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 3, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 1, 7, 1 voice_square_2 60, 0, 3, 0, 2, 7, 1 ================================================ FILE: sound/voicegroups/voicegroup125.inc ================================================ .align 2 voicegroup125:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 2, 0, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 3, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 voice_square_1 60, 0, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 3, 0, 0, 7, 1 ================================================ FILE: sound/voicegroups/voicegroup126.inc ================================================ .align 2 voicegroup126:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 0, 1, 1, 7, 1 voice_square_1 60, 0, 0, 0, 1, 1, 7, 1 voice_square_1 60, 0, 0, 0, 0, 0, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2 60, 0, 3, 1, 1, 6, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2 voice_square_1 60, 0, 0, 3, 1, 1, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 216 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216 ================================================ FILE: sound/voicegroups/voicegroup127.inc ================================================ .align 2 voicegroup127:: voice_directsound 60, 0, DirectSoundWaveData_unknown_synth_snare, 255, 249, 103, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 0, 1 voice_square_1_alt 60, 0, 0, 2, 0, 4, 0, 1 voice_square_1_alt 60, 0, 44, 2, 0, 4, 0, 0 voice_square_1_alt 60, 0, 38, 0, 0, 4, 0, 0 voice_square_1_alt 60, 0, 0, 0, 0, 7, 0, 0 voice_square_1_alt 60, 0, 0, 2, 2, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 2, 0, 15, 0 voice_square_1_alt 60, 0, 23, 1, 0, 1, 9, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 165 voice_square_1_alt 60, 0, 0, 2, 0, 6, 0, 1 voice_square_1_alt 60, 0, 36, 0, 0, 2, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 0, 1 voice_square_1_alt 60, 0, 0, 3, 0, 1, 0, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 46, 2, 0, 4, 0, 0 voice_square_1_alt 60, 0, 38, 2, 0, 4, 0, 0 voice_square_1_alt 60, 0, 119, 2, 0, 0, 15, 1 voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 1 voice_square_1_alt 60, 0, 106, 2, 0, 2, 0, 0 voice_square_1_alt 60, 0, 23, 2, 0, 1, 9, 0 voice_square_1_alt 60, 0, 21, 2, 0, 1, 9, 0 voice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1 voice_square_1_alt 60, 0, 47, 2, 0, 2, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise 60, 0, 0, 0, 7, 15, 0 voice_noise 60, 0, 0, 2, 7, 15, 0 voice_noise_alt 60, 0, 0, 2, 0, 15, 0 voice_noise_alt 60, 0, 1, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 3, 0, 0 voice_noise_alt 60, 0, 0, 0, 2, 0, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 1 ================================================ FILE: sound/voicegroups/voicegroup128.inc ================================================ .align 2 voicegroup128:: voice_directsound_no_resample 60, 0, DirectSoundWaveData_bicycle_bell, 255, 249, 0, 165 voice_directsound_alt 60, 0, DirectSoundWaveData_bicycle_bell, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_unknown_synth_snare, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 242, 0, 127 voice_noise_alt 60, 0, 0, 0, 1, 0, 1 voice_noise_alt 60, 0, 1, 0, 1, 0, 1 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 255, 165 voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 1 voice_directsound 60, 0, DirectSoundWaveData_unknown_1, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_unknown_2, 255, 0, 255, 127 voice_noise_alt 60, 0, 1, 0, 2, 0, 0 voice_square_1 60, 0, 103, 3, 2, 7, 0, 0 voice_square_2 60, 0, 3, 2, 7, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 127 voice_directsound 60, 0, DirectSoundWaveData_unknown_3, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127 voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 1 voice_directsound 60, 0, DirectSoundWaveData_unknown_4, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 voice_square_1 60, 0, 103, 0, 0, 7, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_wind, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_bubbles, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 127 voice_noise_alt 60, 0, 0, 0, 7, 15, 1 voice_directsound 60, 0, DirectSoundWaveData_unknown_5, 255, 0, 255, 127 voice_noise_alt 60, 0, 1, 0, 7, 15, 1 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 246, 0, 127 voice_directsound 60, 0, DirectSoundWaveData_unknown_6, 255, 0, 255, 127 voice_square_1_alt 60, 0, 19, 2, 0, 2, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 0, 255, 127 voice_square_1 60, 0, 103, 0, 0, 0, 15, 0 voice_directsound_alt 60, 0, DirectSoundWaveData_unknown_6, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 255, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_unknown_7, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 242, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_unknown_8, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_directsound 60, 0, DirectSoundWaveData_unknown_close_hihat, 255, 127, 0, 188 voice_directsound 60, 0, DirectSoundWaveData_unknown_9, 255, 249, 0, 165 voice_square_1 60, 0, 0, 0, 4, 6, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 13, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 13, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 0, 4, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 188, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 226, 0, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 26, 0, 255, 127 voice_square_1_alt 60, 0, 0, 2, 0, 1, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 252, 0, 127 voice_square_1_alt 60, 0, 0, 1, 0, 2, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 127, 0, 127 voice_noise_alt 60, 0, 0, 1, 6, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 255, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_unknown_10, 255, 255, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_72, 11, 242, 0, 127 voice_square_1_alt 60, 0, 0, 2, 4, 6, 0, 0 voice_directsound 60, 0, DirectSoundWaveData_unknown_11, 255, 255, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_unused_sc55_tom, 255, 0, 255, 165 voice_noise_alt 60, 0, 0, 5, 7, 15, 1 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 128, 242, 0, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_72, 255, 0, 255, 165 voice_square_1 60, 0, 0, 0, 1, 5, 0, 0 voice_noise_alt 60, 0, 0, 6, 6, 0, 1 voice_noise_alt 60, 0, 0, 3, 6, 0, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 15, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_unknown_12, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_unknown_13, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_unknown_14, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_unknown_15, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_unknown_16, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_unknown_17, 255, 0, 255, 165 ================================================ FILE: sound/voicegroups/voicegroup129.inc ================================================ .align 2 voicegroup129:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 226, 25, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_unknown_1, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 voice_directsound 60, 0, DirectSoundWaveData_sd90_open_triangle, 255, 204, 128, 249 voice_directsound 60, 0, DirectSoundWaveData_register_noise, 255, 0, 255, 76 voice_directsound 60, 0, DirectSoundWaveData_unknown_18, 255, 0, 206, 204 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 206, 38 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 206, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 4 voice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 3 voice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1 voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 6 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 29, 2, 0, 2, 0, 0 voice_square_1_alt 60, 0, 22, 2, 0, 2, 0, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 9, 2 voice_noise_alt 60, 0, 0, 0, 4, 3, 1 voice_noise_alt 60, 0, 0, 0, 1, 12, 0 voice_noise_alt 60, 0, 1, 0, 1, 9, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup130.inc ================================================ .align 2 voicegroup130:: voice_directsound 60, 0, DirectSoundWaveData_Phoneme_1, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_2, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_3, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_4, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_5, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_6, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_7, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_8, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_9, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_10, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_11, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_12, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_13, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_14, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_15, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_16, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_17, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_18, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_19, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_20, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_21, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_22, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_23, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_24, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_25, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_26, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_27, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_28, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_29, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_30, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_31, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_32, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_33, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_34, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_35, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_36, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_37, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_38, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_39, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_40, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_41, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_42, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_43, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_44, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_45, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_46, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_47, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_48, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_49, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_50, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_Phoneme_51, 255, 0, 255, 0 voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion_duplicate, 255, 249, 25, 248 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 7, 1 ================================================ FILE: sound/voicegroups/voicegroup131.inc ================================================ .align 2 voicegroup131:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 128, 204, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 5 voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 1 ================================================ FILE: sound/voicegroups/voicegroup132.inc ================================================ .align 2 voicegroup132:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 118, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 165, 154, 235 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 4, 2, 2 voice_square_2_alt 60, 0, 3, 0, 1, 7, 5 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 4, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 4, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 4, 2, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 2, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 8, 1 ================================================ FILE: sound/voicegroups/voicegroup133.inc ================================================ .align 2 voicegroup133:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 9, 0 voice_square_2_alt 60, 0, 3, 0, 2, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 1, 0, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 8, 1 ================================================ FILE: sound/voicegroups/voicegroup134.inc ================================================ .align 2 voicegroup134:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 7, 1 voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1 voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 1 ================================================ FILE: sound/voicegroups/voicegroup135.inc ================================================ .align 2 voicegroup135:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 85, 137, 180, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 9, 0 voice_square_2_alt 60, 0, 2, 0, 0, 9, 0 voice_square_1_alt 60, 0, 0, 0, 1, 2, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup136.inc ================================================ .align 2 voicegroup136:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 0, 0, 5, 0, 0 voice_square_1_alt 60, 0, 0, 0, 0, 5, 0, 0 voice_square_1_alt 60, 0, 0, 2, 2, 4, 10, 0 voice_square_2_alt 60, 0, 0, 0, 5, 0, 0 voice_square_1_alt 60, 0, 0, 1, 0, 5, 0, 0 voice_square_2_alt 60, 0, 3, 2, 4, 10, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 1, 5, 0, 3 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 1, 5, 0, 3 voice_square_2_alt 60, 0, 1, 0, 1, 10, 2 voice_square_1_alt 60, 0, 0, 1, 0, 1, 10, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup137.inc ================================================ .align 2 voicegroup137:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 165, 180, 165 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 137, 154, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 204, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 voice_square_2_alt 60, 0, 1, 1, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 2, 4, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 1 ================================================ FILE: sound/voicegroups/voicegroup138.inc ================================================ .align 2 voicegroup138:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 voice_square_2_alt 60, 0, 3, 0, 1, 6, 3 voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup139.inc ================================================ .align 2 voicegroup139:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 127, 103, 201 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 37, 127, 77, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 voice_square_2_alt 60, 0, 3, 0, 2, 7, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 1 voice_noise_alt 60, 0, 0, 0, 1, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup140.inc ================================================ .align 2 voicegroup140:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 2, 3, 1 voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup141.inc ================================================ .align 2 voicegroup141:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 voice_square_2_alt 60, 0, 3, 0, 2, 7, 3 voice_square_2_alt 60, 0, 2, 0, 2, 6, 5 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 1, 7, 0, 6 voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 2, 9, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup142.inc ================================================ .align 2 voicegroup142:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 188, 128, 201 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 195, 103, 220 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 195, 72, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 85, 188, 103, 160 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 128, 188, 77, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 175, 154, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 4 voice_square_2_alt 60, 0, 2, 0, 2, 5, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup143.inc ================================================ .align 2 voicegroup143:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 160, 123, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 2, 3, 2 voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 9, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup144.inc ================================================ .align 2 voicegroup144:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 85, 188, 92, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 85, 127, 180, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 2, 4, 2 voice_square_2_alt 60, 0, 1, 0, 2, 4, 3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 9, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup145.inc ================================================ .align 2 voicegroup145:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 voice_square_2_alt 60, 0, 3, 0, 0, 9, 0 voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup146.inc ================================================ .align 2 voicegroup146:: voice_keysplit_all voicegroup002 voice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 255, 165, 103, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 43, 76, 103, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 4, 4 voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 9, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 2 ================================================ FILE: sound/voicegroups/voicegroup147.inc ================================================ .align 2 voicegroup147:: voice_keysplit_all voicegroup001 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 249, 25, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 6, 1 voice_square_2_alt 60, 0, 2, 0, 0, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 4, 2 ================================================ FILE: sound/voicegroups/voicegroup148.inc ================================================ .align 2 voicegroup148:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 12, 0 voice_square_2_alt 60, 0, 2, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 3, 5, 2 voice_noise_alt 60, 0, 0, 0, 1, 6, 5 ================================================ FILE: sound/voicegroups/voicegroup149.inc ================================================ .align 2 voicegroup149:: voice_keysplit_all voicegroup190 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1_alt 60, 0, 0, 2, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 165, 154, 153 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_oboe, 43, 188, 103, 165 voice_directsound 60, 0, DirectSoundWaveData_unused_sd90_oboe, 43, 165, 103, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 voice_square_2_alt 60, 0, 1, 0, 2, 4, 2 voice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup150.inc ================================================ .align 2 voicegroup150:: voice_keysplit_all voicegroup002 voice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 255, 165, 103, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 85, 204, 77, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 1, 4, 6 voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup151.inc ================================================ .align 2 voicegroup151:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 127 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 voice_square_2_alt 60, 0, 1, 0, 2, 4, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup152.inc ================================================ .align 2 voicegroup152:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 160, 175, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 4, 2, 1 voice_square_2_alt 60, 0, 3, 0, 1, 5, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 4, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 4, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 2, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup153.inc ================================================ .align 2 voicegroup153:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 3, 5, 2 voice_square_2_alt 60, 0, 3, 0, 3, 4, 2 voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 voice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_8, 0, 1, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 2 ================================================ FILE: sound/voicegroups/voicegroup154.inc ================================================ .align 2 voicegroup154:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 0, 10, 0 voice_square_2_alt 60, 0, 1, 0, 0, 10, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 0, 12, 0 ================================================ FILE: sound/voicegroups/voicegroup155.inc ================================================ .align 2 voicegroup155:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 188, 103, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 165, 154, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 165, 180, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 voice_square_2_alt 60, 0, 3, 0, 3, 6, 2 voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 3, 6, 5 voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 1, 9, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 2 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup156.inc ================================================ .align 2 voicegroup156:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 4, 4, 4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 1, 7, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 voice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 5 voice_square_1_alt 60, 0, 0, 3, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup157.inc ================================================ .align 2 voicegroup157:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 190, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2 voice_square_2_alt 60, 0, 3, 0, 3, 3, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 3, 6, 5 voice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 2 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 6, 3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup158.inc ================================================ .align 2 voicegroup158:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 236, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 9, 0 voice_square_2_alt 60, 0, 3, 0, 1, 10, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 1, 0, 9, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 8, 1 ================================================ FILE: sound/voicegroups/voicegroup159.inc ================================================ .align 2 voicegroup159:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 64, 249, 0, 188 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 51, 249, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 7, 0, 6 voice_square_2_alt 60, 0, 1, 1, 5, 1, 6 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 1, 7, 0, 6 voice_square_1_alt 60, 0, 0, 0, 1, 4, 3, 6 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup160.inc ================================================ .align 2 voicegroup160:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 1 voice_square_2_alt 60, 0, 1, 0, 2, 4, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup161.inc ================================================ .align 2 voicegroup161:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 4 voice_square_2_alt 60, 0, 2, 0, 2, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 2, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup162.inc ================================================ .align 2 voicegroup162:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 64, 188, 108, 244 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 195, 92, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 64, 204, 113, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 0 voice_square_2_alt 60, 0, 1, 0, 0, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup163.inc ================================================ .align 2 voicegroup163:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_unknown_18, 255, 0, 206, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 5, 2 voice_square_2_alt 60, 0, 3, 0, 3, 4, 2 voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup164.inc ================================================ .align 2 voicegroup164:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 128, 180, 108, 209 voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 85, 204, 77, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 6 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 2, 6, 2 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 4 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup165.inc ================================================ .align 2 voicegroup165:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 37, 165, 103, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 204, 92, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 10, 1 voice_square_2_alt 60, 0, 2, 0, 2, 6, 6 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_enhanced_delay_shaku, 255, 191, 97, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 9, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup166.inc ================================================ .align 2 voicegroup166:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 236, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 9, 0 voice_square_2_alt 60, 0, 3, 0, 2, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 1, 0, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 8, 1 ================================================ FILE: sound/voicegroups/voicegroup167.inc ================================================ .align 2 voicegroup167:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 1, 10, 4 voice_square_2_alt 60, 0, 3, 0, 2, 8, 3 voice_square_2_alt 60, 0, 2, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 0, 6, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup168.inc ================================================ .align 2 voicegroup168:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 2 voice_square_2_alt 60, 0, 3, 0, 2, 6, 4 voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup169.inc ================================================ .align 2 voicegroup169:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 2, 0, 1, 4, 1 voice_square_2_alt 60, 0, 0, 0, 1, 4, 1 voice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 4, 0 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup170.inc ================================================ .align 2 voicegroup170:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1 voice_square_2_alt 60, 0, 2, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup171.inc ================================================ .align 2 voicegroup171:: voice_keysplit_all voicegroup001 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 1, 7, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1 voice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0 voice_square_2_alt 60, 0, 2, 0, 2, 0, 0 voice_square_2_alt 60, 0, 3, 0, 1, 7, 0 voice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0 voice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1 ================================================ FILE: sound/voicegroups/voicegroup172.inc ================================================ .align 2 voicegroup172:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 5, 2 voice_square_2_alt 60, 0, 3, 0, 2, 6, 3 voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup173.inc ================================================ .align 2 voicegroup173:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 4 voice_square_2_alt 60, 0, 3, 0, 3, 3, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 3, 2 ================================================ FILE: sound/voicegroups/voicegroup174.inc ================================================ .align 2 voicegroup174:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 0, 255, 214 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 128, 0, 255, 206 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 209 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 2, 3, 4 voice_square_2_alt 60, 0, 3, 0, 2, 3, 4 voice_square_1_alt 60, 0, 0, 3, 0, 2, 3, 4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 3, 1 voice_keysplit_all voicegroup177 voice_square_1_alt 60, 0, 0, 2, 0, 2, 9, 1 voice_square_2_alt 60, 0, 2, 0, 2, 9, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 154, 127 voice_keysplit_all voicegroup002 voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup175.inc ================================================ .align 2 voicegroup175:: voice_keysplit_all voicegroup177 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 165, 154, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup176.inc ================================================ .align 2 voicegroup176:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 7, 1 voice_square_2_alt 60, 0, 2, 0, 2, 9, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup177.inc ================================================ .align 2 voicegroup177:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 voice_directsound_no_resample 67, 71, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242 voice_directsound_no_resample 65, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 68, 29, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 voice_directsound 72, 64, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 76, 39, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound 80, 89, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226 voice_directsound_no_resample 33, 10, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound 84, 104, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound_no_resample 64, 64, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 voice_directsound_no_resample 64, 64, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 voice_directsound_no_resample 64, 118, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 voice_directsound_no_resample 64, 64, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 64, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 voice_directsound 50, 64, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 voice_directsound 64, 64, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0 ================================================ FILE: sound/voicegroups/voicegroup178.inc ================================================ .align 2 voicegroup178:: voice_keysplit_all voicegroup177 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 204, 103, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 154, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 7, 1 voice_square_2_alt 60, 0, 2, 0, 2, 7, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 0, 15, 1 ================================================ FILE: sound/voicegroups/voicegroup179.inc ================================================ .align 2 voicegroup179:: voice_keysplit_all voicegroup177 voice_keysplit_all voicegroup176 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 165, 154, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 0 voice_square_2_alt 60, 0, 0, 0, 1, 9, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 1, 9, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup180.inc ================================================ .align 2 voicegroup180:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 64, 249, 0, 188 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1 voice_square_2_alt 60, 0, 2, 0, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127 voice_noise_alt 60, 0, 0, 0, 1, 0, 0 ================================================ FILE: sound/voicegroups/voicegroup181.inc ================================================ .align 2 voicegroup181:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242 ================================================ FILE: sound/voicegroups/voicegroup182.inc ================================================ .align 2 voicegroup182:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 76 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup008, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1 voice_square_2_alt 60, 0, 1, 0, 2, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup183.inc ================================================ .align 2 voicegroup183:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1 voice_square_2_alt 60, 0, 2, 0, 2, 4, 1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 3, 1 ================================================ FILE: sound/voicegroups/voicegroup184.inc ================================================ .align 2 voicegroup184:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0 ================================================ FILE: sound/voicegroups/voicegroup185.inc ================================================ .align 2 voicegroup185:: voice_keysplit_all voicegroup002 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 0, 255, 214 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 128, 0, 255, 206 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 85, 0, 154, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 209 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup186.inc ================================================ .align 2 voicegroup186:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_2_alt 60, 0, 3, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 ================================================ FILE: sound/voicegroups/voicegroup187.inc ================================================ .align 2 voicegroup187:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup007, KeySplitTable3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup009, KeySplitTable5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2 voice_square_2_alt 60, 0, 1, 0, 1, 7, 1 voice_square_2_alt 60, 0, 0, 0, 2, 6, 5 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 voice_noise_alt 60, 0, 0, 0, 1, 6, 1 ================================================ FILE: sound/voicegroups/voicegroup188.inc ================================================ .align 2 voicegroup188:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 1 voice_square_2_alt 60, 0, 3, 0, 3, 3, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 7, 0 voice_noise_alt 60, 0, 0, 0, 1, 9, 1 ================================================ FILE: sound/voicegroups/voicegroup189.inc ================================================ .align 2 voicegroup189:: voice_keysplit_all voicegroup002 voice_keysplit voicegroup005, KeySplitTable1 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226 voice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 3 voice_square_2_alt 60, 0, 3, 0, 2, 7, 2 voice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 ================================================ FILE: sound/voicegroups/voicegroup190.inc ================================================ .align 2 voicegroup190:: voice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 2 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 2, 7, 0 voice_noise_alt 60, 0, 0, 0, 1, 9, 1 voice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 52, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 33, 104, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204 voice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188 voice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242 voice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231 voice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216 voice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0 voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188 voice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188 voice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0 voice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0 ================================================ FILE: sound/voicegroups/voicegroup191.inc ================================================ .align 2 voicegroup191:: voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 226, 25, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_wave_54, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231 voice_directsound 60, 0, DirectSoundWaveData_sd90_open_triangle, 255, 204, 128, 249 voice_directsound 60, 0, DirectSoundWaveData_register_noise, 255, 0, 255, 76 voice_directsound 60, 0, DirectSoundWaveData_wave_77, 255, 0, 206, 204 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 206, 38 voice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 206, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165 voice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_keysplit voicegroup006, KeySplitTable4 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 3 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1 voice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 6 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_square_1 60, 0, 0, 2, 0, 0, 15, 0 voice_noise_alt 60, 0, 0, 0, 1, 9, 2 voice_noise_alt 60, 0, 0, 0, 4, 3, 1 voice_noise_alt 60, 0, 0, 0, 1, 12, 0 voice_noise_alt 60, 0, 1, 0, 1, 9, 0 voice_noise_alt 60, 0, 0, 0, 2, 6, 0 ================================================ FILE: spritesheet_rules.mk ================================================ OBJEVENTGFXDIR := graphics/object_events/pics FLDEFFGFXDIR := graphics/field_effects/pics $(OBJEVENTGFXDIR)/misc/cut_tree.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/misc/rock_smash_rock.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/misc/surf_blob.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/misc/ss_anne.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 8 -mheight 4 $(OBJEVENTGFXDIR)/misc/town_map.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/people/agatha.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/anabel.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/aroma_lady.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/balding_man.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/battle_girl.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/beauty.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/biker.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/bill.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/bird_keeper.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/blackbelt.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/blaine.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/blue.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/boy.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/brandon.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/brock.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/bruno.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/bug_catcher.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/burglar.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/cable_club_receptionist.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/cameraman.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/camper.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/captain.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/celio.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/channeler.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/chef.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/clerk.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/cooltrainer_f.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/cooltrainer_m.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/cue_ball.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/daisy.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/em_brendan.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/em_may.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/engineer.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/erika.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/fat_man.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/fisher.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/gba_kid.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/gentleman.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/giovanni.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/green_bike.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/green_fish.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/green_item.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/green_normal.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/green_surf_run.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/green_surf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/green_vs_seeker_bike.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/green_underwater.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/greta.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/gym_guy.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/hiker.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/juggler.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/koga.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/lady.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/lance.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/lass.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/little_boy.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/people/little_girl.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/people/lorelei.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/lt_surge.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/lucy.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/man.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_beauty.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_bird_keeper.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_blackbelt.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_bug_catcher.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_cooltrainer_m.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_hiker.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_lass.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_psychic_m.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_scientist.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/master_youngster.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/mg_deliveryman.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/misty.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/mom.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/mr_fuji.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/noland.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/nurse.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/old_man_1.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/old_man_2.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/old_woman.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/painter.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/picnicker.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/pokemaniac.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/pokemon_breeder.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/pokemon_ranger_f.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/pokemon_ranger_m.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/policeman.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/prof_oak.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/psychic_f.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/psychic_m.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/red_bike.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/red_fish.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/red_item.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/red_normal.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/red_surf_run.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/red_surf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/red_vs_seeker_bike.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/red_underwater.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/rich_boy.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/rocker.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/rocker_2.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/rocket_f.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/rocket_m.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/rs_brendan.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/rs_may.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/ruin_maniac.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/sabrina.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/sailor.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/scientist.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/scott.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/sitting_boy.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/spenser.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/super_nerd.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/swimmer_f_land.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/swimmer_f_water.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/swimmer_f_water_2.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/swimmer_m_land.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/swimmer_m_water.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/tamer.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/teachy_tv_host.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/trainer_tower_dude.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/tuber_f.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/people/tuber_m_land.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/people/tuber_m_water.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/people/tucker.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/people/twin.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/people/union_room_receptionist.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/unused_male_receptionist.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/unused_man.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/unused_woman.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/woman_1.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/woman_2.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/woman_3.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/worker_f.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/worker_m.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/young_couple_f.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/young_couple_m.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/people/youngster.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/pokemon/abra.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/bulbasaur.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/chansey.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/charmander.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/clefairy.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/cubone.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/deoxys_a.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/pokemon/deoxys_d.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/pokemon/deoxys_n.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/pokemon/doduo.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/fearow.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/ho_oh.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/pokemon/jigglypuff.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/kabuto.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/kangaskhan.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/lapras.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/latias.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/pokemon/latios.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/pokemon/lugia.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(OBJEVENTGFXDIR)/pokemon/machoke.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/machop.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/meowth.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/nidoran_f.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/nidoran_m.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/nidorino.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/omanyte.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/pidgeot.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/pidgey.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/pikachu.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/poliwrath.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/psyduck.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/seel.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/slowbro.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/slowpoke.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/spearow.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/squirtle.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/sudowoodo.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 $(OBJEVENTGFXDIR)/pokemon/voltorb.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/wigglytuff.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/pokemon/mew.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 ================================================ FILE: src/AgbRfu_LinkManager.c ================================================ #include "global.h" #include "librfu.h" #include "AgbRfu_LinkManager.h" #define RN_ACCEPT 0x01 #define RN_NAME_TIMER_CLEAR 0x02 #define RN_DISCONNECT 0x04 #define LINK_RECOVERY_OFF 0x00 #define LINK_RECOVERY_START 0x01 #define LINK_RECOVERY_EXE 0x02 #define LINK_RECOVERY_IMPOSSIBLE 0x04 #define FSP_ON 0x01 #define FSP_START 0x02 LINK_MANAGER lman; static void rfu_LMAN_clearVariables(void); static void rfu_LMAN_settingPCSWITCH(u32 rand); static void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult); static void rfu_LMAN_MSC_callback(u16 reqCommandId); static void rfu_LMAN_PARENT_checkRecvChildName(void); static void rfu_LMAN_CHILD_checkSendChildName(void); static void rfu_LMAN_CHILD_checkSendChildName2(void); static void rfu_LMAN_CHILD_linkRecoveryProcess(void); static u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void); static void rfu_LMAN_occureCallback(u8 msg, u8 param_count); static void rfu_LMAN_disconnect(u8 bmDisconnectSlot); static void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot); static void rfu_LMAN_checkNICommunicateStatus(void); static void rfu_LMAN_managerChangeAgbClockMaster(void); u32 rfu_LMAN_REQBN_softReset_and_checkID(void) { u32 id = rfu_REQBN_softReset_and_checkID(); if (id == RFU_ID) lman.RFU_powerOn_flag = 1; if (lman.state != LMAN_FORCED_STOP_AND_RFU_RESET && lman.state != LMAN_STATE_SOFT_RESET_AND_CHECK_ID) { lman.state = lman.next_state = LMAN_STATE_READY; } lman.pcswitch_flag = 0; lman.reserveDisconnectSlot_flag = 0; lman.acceptCount = 0; lman.acceptSlot_flag = 0; lman.parent_child = MODE_NEUTRAL; rfu_LMAN_managerChangeAgbClockMaster(); return id; } void rfu_LMAN_REQ_sendData(u8 clockChangeFlag) { if (gRfuLinkStatus->parentChild == MODE_CHILD) { if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON) clockChangeFlag = TRUE; else clockChangeFlag = FALSE; } else lman.parentAck_flag = 0; rfu_REQ_sendData(clockChangeFlag); } u8 rfu_LMAN_initializeManager(void (*LMAN_callback_p)(u8, u8), void (*MSC_callback_p)(u16)) { if (LMAN_callback_p == NULL) { return LMAN_ERROR_ILLEGAL_PARAMETER; } CpuFill16(0, &lman, sizeof(struct linkManagerTag)); lman.parent_child = MODE_NEUTRAL; lman.LMAN_callback = LMAN_callback_p; lman.MSC_callback = MSC_callback_p; rfu_setMSCCallback(rfu_LMAN_MSC_callback); rfu_setREQCallback(rfu_LMAN_REQ_callback); return 0; } static void rfu_LMAN_endManager(void) { CpuFill16(0, &lman, sizeof(struct linkManagerTag) - 8); lman.parent_child = MODE_NEUTRAL; } void rfu_LMAN_initializeRFU(INIT_PARAM *init_parameters) { rfu_LMAN_clearVariables(); lman.state = LMAN_STATE_SOFT_RESET_AND_CHECK_ID; lman.next_state = LMAN_STATE_RESET; lman.init_param = init_parameters; lman.linkRecovery_enable = init_parameters->linkRecovery_enable; lman.linkRecoveryTimer.count_max = init_parameters->linkRecovery_period; lman.NI_failCounter_limit = init_parameters->NI_failCounter_limit; if (init_parameters->fastSearchParent_flag) { lman.fastSearchParent_flag = FSP_ON; } } static void rfu_LMAN_clearVariables(void) { u8 i; lman.state = lman.next_state = LMAN_STATE_READY; lman.parent_child = MODE_NEUTRAL; lman.pcswitch_flag = 0; lman.child_slot = 0; lman.connectSlot_flag_old = 0; lman.nameAcceptTimer.active = 0; lman.linkRecoveryTimer.active = 0; for (i = 0; i < RFU_CHILD_MAX; i++) { lman.nameAcceptTimer.count[i] = 0; lman.linkRecoveryTimer.count[i] = 0; } } void rfu_LMAN_powerDownRFU(void) { lman.state = LMAN_STATE_STOP_MODE; } u8 rfu_LMAN_establishConnection(u8 parent_child, u16 connect_period, u16 name_accept_period, u16 *acceptable_serialNo_list) { u8 i; u16 *serial_list; if (lman.state != LMAN_STATE_READY && (lman.state != LMAN_STATE_WAIT_RECV_CHILD_NAME || parent_child != MODE_PARENT)) { lman.param[0] = 1; rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); return LMAN_ERROR_MANAGER_BUSY; } if (rfu_getMasterSlave() == AGB_CLK_SLAVE) { lman.param[0] = 2; rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); return LMAN_ERROR_AGB_CLK_SLAVE; } for (i = 0, serial_list = acceptable_serialNo_list; i < 16; i++) { if (*serial_list++ == 0xFFFF) { break; } } if (i == 16) { lman.param[0] = 4; rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); return LMAN_ERROR_ILLEGAL_PARAMETER; } if (parent_child > MODE_PARENT) { lman.pcswitch_flag = PCSWITCH_1ST_SC_START; parent_child = MODE_PARENT; connect_period = 0; } else { lman.pcswitch_flag = 0; } if (parent_child != MODE_CHILD) { lman.state = LMAN_STATE_START_SEARCH_CHILD; } else { lman.state = LMAN_STATE_START_SEARCH_PARENT; if (lman.fastSearchParent_flag) { lman.fastSearchParent_flag = FSP_START; } } lman.parent_child = parent_child; lman.connect_period = connect_period; lman.nameAcceptTimer.count_max = name_accept_period; lman.acceptable_serialNo_list = acceptable_serialNo_list; return 0; } u8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period) { u8 i; if (lman.state != LMAN_STATE_READY && (lman.state < 9 || lman.state > 11)) { lman.param[0] = 1; rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); return LMAN_ERROR_MANAGER_BUSY; } if (rfu_getMasterSlave() == AGB_CLK_SLAVE) { lman.param[0] = 2; rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); return LMAN_ERROR_AGB_CLK_SLAVE; } for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { if (gRfuLinkStatus->partner[i].id == parentId) { break; } } if (gRfuLinkStatus->findParentCount == 0 || i == gRfuLinkStatus->findParentCount) { lman.param[0] = 3; rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); return LMAN_ERROR_PID_NOT_FOUND; } if (lman.state == LMAN_STATE_READY || lman.state == LMAN_STATE_START_SEARCH_PARENT) { lman.state = LMAN_STATE_START_CONNECT_PARENT; lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT; } else { lman.state = LMAN_STATE_END_SEARCH_PARENT; lman.next_state = LMAN_STATE_START_CONNECT_PARENT; } lman.work = parentId; lman.connect_period = connect_period; if (lman.pcswitch_flag != 0) { lman.pcswitch_flag = PCSWITCH_CP; } return 0; } static void rfu_LMAN_PARENT_stopWaitLinkRecoveryAndDisconnect(u8 bm_targetSlot) { u8 i; if ((bm_targetSlot & lman.linkRecoveryTimer.active) == 0) return; lman.linkRecoveryTimer.active &= ~bm_targetSlot; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((bm_targetSlot >> i) & 1) { lman.linkRecoveryTimer.count[i] = 0; } } i = gRfuLinkStatus->linkLossSlotFlag & bm_targetSlot; if (i) { rfu_LMAN_disconnect(i); } lman.param[0] = i; rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, i); } void rfu_LMAN_stopManager(u8 forced_stop_and_RFU_reset_flag) { u8 msg = 0; lman.pcswitch_flag = 0; if (forced_stop_and_RFU_reset_flag) { rfu_LMAN_clearVariables(); lman.state = LMAN_FORCED_STOP_AND_RFU_RESET; return; } switch (lman.state) { case LMAN_STATE_START_SEARCH_CHILD: lman.state = LMAN_STATE_WAIT_RECV_CHILD_NAME; lman.next_state = LMAN_STATE_READY; msg = LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED; break; case LMAN_STATE_POLL_SEARCH_CHILD: lman.state = LMAN_STATE_END_SEARCH_CHILD; lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME; break; case LMAN_STATE_END_SEARCH_CHILD: lman.state = LMAN_STATE_END_SEARCH_CHILD; lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME; break; case LMAN_STATE_WAIT_RECV_CHILD_NAME: break; case LMAN_STATE_START_SEARCH_PARENT: lman.state = lman.next_state = LMAN_STATE_READY; msg = LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED; break; case LMAN_STATE_POLL_SEARCH_PARENT: lman.state = LMAN_STATE_END_SEARCH_PARENT; lman.next_state = LMAN_STATE_READY; break; case LMAN_STATE_END_SEARCH_PARENT: lman.state = LMAN_STATE_END_SEARCH_PARENT; lman.next_state = LMAN_STATE_READY; break; case LMAN_STATE_START_CONNECT_PARENT: lman.state = lman.next_state = LMAN_STATE_READY; msg = LMAN_MSG_CONNECT_PARENT_FAILED; break; case LMAN_STATE_POLL_CONNECT_PARENT: lman.state = LMAN_STATE_END_CONNECT_PARENT; break; case LMAN_STATE_END_CONNECT_PARENT: lman.state = LMAN_STATE_END_CONNECT_PARENT; break; case LMAN_STATE_SEND_CHILD_NAME: break; case LMAN_STATE_START_LINK_RECOVERY: lman.state = lman.state_bak[0]; lman.next_state = lman.state_bak[1]; rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag); lman.param[0] = gRfuLinkStatus->linkLossSlotFlag; rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1); return; case LMAN_STATE_POLL_LINK_RECOVERY: lman.state = LMAN_STATE_END_LINK_RECOVERY; break; case LMAN_STATE_END_LINK_RECOVERY: lman.state = LMAN_STATE_END_LINK_RECOVERY; break; default: lman.state = lman.next_state = LMAN_STATE_READY; msg = LMAN_MSG_MANAGER_STOPPED; break; } if (lman.state == LMAN_STATE_READY) { rfu_LMAN_occureCallback(msg, 0); } } static bool8 rfu_LMAN_linkWatcher(u16 REQ_commandID) { u8 i; u8 bm_linkLossSlot; u8 reason; u8 bm_linkRecoverySlot; u8 bm_disconnectSlot; bool8 disconnect_occure_flag = FALSE; rfu_REQBN_watchLink(REQ_commandID, &bm_linkLossSlot, &reason, &bm_linkRecoverySlot); if (bm_linkLossSlot) { lman.param[0] = bm_linkLossSlot; lman.param[1] = reason; if (lman.linkRecovery_enable) { lman.linkRecovery_start_flag = LINK_RECOVERY_START; if (lman.parent_child == MODE_CHILD && reason == REASON_DISCONNECTED) { lman.linkRecovery_start_flag = LINK_RECOVERY_IMPOSSIBLE; } if (lman.linkRecovery_start_flag == LINK_RECOVERY_START) { for (i = 0; i < RFU_CHILD_MAX; i++) { if ((bm_linkLossSlot >> i) & 1) { lman.linkRecoveryTimer.active |= (1 << i); lman.linkRecoveryTimer.count[i] = lman.linkRecoveryTimer.count_max; } } rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY, 1); } else { lman.linkRecovery_start_flag = 0; rfu_LMAN_disconnect(bm_linkLossSlot); disconnect_occure_flag = TRUE; rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1); } } else { rfu_LMAN_disconnect(bm_linkLossSlot); disconnect_occure_flag = TRUE; rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED, 2); } rfu_LMAN_managerChangeAgbClockMaster(); } if (gRfuLinkStatus->parentChild == MODE_PARENT) { if (bm_linkRecoverySlot) { for (i = 0; i < RFU_CHILD_MAX; i++) { if ((lman.linkRecoveryTimer.active >> i) & 1 && (bm_linkRecoverySlot >> i) & 1) { lman.linkRecoveryTimer.count[i] = 0; } } lman.linkRecoveryTimer.active &= ~bm_linkRecoverySlot; lman.param[0] = bm_linkRecoverySlot; rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_SUCCESSED, 1); } if (lman.linkRecoveryTimer.active) { bm_disconnectSlot = 0; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((lman.linkRecoveryTimer.active >> i) & 1 && lman.linkRecoveryTimer.count[i] && --lman.linkRecoveryTimer.count[i] == 0) { lman.linkRecoveryTimer.active &= ~(1 << i); bm_disconnectSlot |= (1 << i); } } if (bm_disconnectSlot) { rfu_LMAN_disconnect(bm_disconnectSlot); disconnect_occure_flag = TRUE; lman.param[0] = bm_disconnectSlot; rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1); } } if (!lman.linkRecoveryTimer.active) { lman.linkRecovery_start_flag = 0; } } return disconnect_occure_flag; } void rfu_LMAN_syncVBlank(void) { if (rfu_syncVBlank()) { rfu_LMAN_occureCallback(LMAN_MSG_WATCH_DOG_TIMER_ERROR, 0); rfu_LMAN_managerChangeAgbClockMaster(); } } void rfu_LMAN_manager_entity(u32 rand) { u8 msg; if (lman.LMAN_callback == NULL && lman.state != LMAN_STATE_READY) { lman.state = LMAN_STATE_READY; return; } if (lman.pcswitch_flag) { rfu_LMAN_settingPCSWITCH(rand); } while (1) { if (lman.state != LMAN_STATE_READY) { rfu_waitREQComplete(); lman.active = 1; switch (lman.state) { case LMAN_FORCED_STOP_AND_RFU_RESET: if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) { msg=LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET; } else { msg=LMAN_MSG_RFU_FATAL_ERROR; } lman.state = lman.next_state = LMAN_STATE_READY; rfu_LMAN_occureCallback(msg, 0); break; case LMAN_STATE_SOFT_RESET_AND_CHECK_ID: if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) { lman.state = lman.next_state; lman.next_state = LMAN_STATE_CONFIG_SYSTEM; } else { lman.state = lman.next_state = LMAN_STATE_READY; rfu_LMAN_occureCallback(LMAN_MSG_RFU_FATAL_ERROR, 0); } break; case LMAN_STATE_RESET: rfu_REQ_reset(); break; case LMAN_STATE_CONFIG_SYSTEM: rfu_REQ_configSystem(lman.init_param->availSlot_flag, lman.init_param->maxMFrame, lman.init_param->MC_TimerCount); break; case LMAN_STATE_CONFIG_GAME_DATA: rfu_REQ_configGameData(lman.init_param->mboot_flag, lman.init_param->serialNo, (const u8 *)lman.init_param->gameName, lman.init_param->userName); break; case LMAN_STATE_START_SEARCH_CHILD: rfu_REQ_startSearchChild(); break; case LMAN_STATE_POLL_SEARCH_CHILD: rfu_REQ_pollSearchChild(); break; case LMAN_STATE_END_SEARCH_CHILD: rfu_REQ_endSearchChild(); break; case LMAN_STATE_WAIT_RECV_CHILD_NAME: break; case LMAN_STATE_START_SEARCH_PARENT: rfu_REQ_startSearchParent(); break; case LMAN_STATE_POLL_SEARCH_PARENT: rfu_REQ_pollSearchParent(); break; case LMAN_STATE_END_SEARCH_PARENT: rfu_REQ_endSearchParent(); break; case LMAN_STATE_START_CONNECT_PARENT: rfu_REQ_startConnectParent(lman.work); break; case LMAN_STATE_POLL_CONNECT_PARENT: rfu_REQ_pollConnectParent(); break; case LMAN_STATE_END_CONNECT_PARENT: rfu_REQ_endConnectParent(); break; case LMAN_STATE_SEND_CHILD_NAME: break; case LMAN_STATE_START_LINK_RECOVERY: rfu_REQ_CHILD_startConnectRecovery(gRfuLinkStatus->linkLossSlotFlag); break; case LMAN_STATE_POLL_LINK_RECOVERY: rfu_REQ_CHILD_pollConnectRecovery(); break; case LMAN_STATE_END_LINK_RECOVERY: rfu_REQ_CHILD_endConnectRecovery(); break; case LMAN_STATE_MS_CHANGE: rfu_REQ_changeMasterSlave(); break; case LMAN_STATE_WAIT_CLOCK_MASTER: break; case LMAN_STATE_STOP_MODE: rfu_REQ_stopMode(); break; case LMAN_STATE_BACK_STATE: break; default: break; } rfu_waitREQComplete(); lman.active = 0; } if (lman.state == LMAN_STATE_END_LINK_RECOVERY || lman.state == LMAN_STATE_MS_CHANGE) ; else break; } if (gRfuLinkStatus->parentChild == MODE_PARENT) { if (rfu_LMAN_linkWatcher(0)) return; } rfu_LMAN_PARENT_checkRecvChildName(); rfu_LMAN_CHILD_checkSendChildName(); rfu_LMAN_CHILD_linkRecoveryProcess(); rfu_LMAN_checkNICommunicateStatus(); } static void rfu_LMAN_settingPCSWITCH(u32 rand) { if (lman.pcswitch_flag == PCSWITCH_3RD_SC_START) { lman.parent_child = MODE_PARENT; lman.state = LMAN_STATE_START_SEARCH_CHILD; lman.connect_period = lman.pcswitch_period_bak; if (lman.connect_period) { lman.pcswitch_flag = PCSWITCH_3RD_SC; } else { lman.pcswitch_flag = PCSWITCH_1ST_SC_START; } } if (lman.pcswitch_flag == PCSWITCH_1ST_SC_START) { lman.parent_child = MODE_PARENT; lman.state = LMAN_STATE_START_SEARCH_CHILD; lman.connect_period = rand % 140; lman.pcswitch_period_bak = 140 - lman.connect_period; if (lman.connect_period) { lman.pcswitch_flag = PCSWITCH_1ST_SC; } else { lman.pcswitch_flag = PCSWITCH_2ND_SP_START; } } if (lman.pcswitch_flag == PCSWITCH_2ND_SP_START) { lman.parent_child = MODE_CHILD; lman.connect_period = PCSWITCH_SP_PERIOD; lman.pcswitch_flag = PCSWITCH_2ND_SP; lman.state = LMAN_STATE_START_SEARCH_PARENT; } } static void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult) { u8 status; u8 *stwiRecvBuffer; u8 i; if (lman.active != 0) { lman.active = 0; switch (reqCommandId) { case ID_RESET_REQ: if (reqResult == 0) { lman.state = lman.next_state; lman.next_state = LMAN_STATE_CONFIG_GAME_DATA; } break; case ID_SYSTEM_CONFIG_REQ: if (reqResult == 0) { lman.state = lman.next_state; lman.next_state = LMAN_STATE_READY; } break; case ID_GAME_CONFIG_REQ: if (reqResult == 0) { lman.state = lman.next_state = LMAN_STATE_READY; rfu_LMAN_occureCallback(LMAN_MSG_INITIALIZE_COMPLETED, 0); } break; case ID_SC_START_REQ: if (reqResult == 0) { lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_CHILD; } break; case ID_SC_POLL_REQ: if (lman.connect_period && --lman.connect_period == 0) { lman.state = LMAN_STATE_END_SEARCH_CHILD; lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME; } break; case ID_SC_END_REQ: if (reqResult == 0) { lman.state = lman.next_state; lman.next_state = LMAN_STATE_READY; if (lman.pcswitch_flag == 0) { rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED, 0); } } break; case ID_SP_START_REQ: if (reqResult == 0) { if (lman.fastSearchParent_flag == FSP_ON) { if (lman.connect_period > 1) { lman.connect_period--; } } lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_PARENT; } break; case ID_SP_POLL_REQ: if (reqResult == 0) { status = rfu_LMAN_CHILD_checkEnableParentCandidate(); lman.param[0] = status; if (status) { rfu_LMAN_occureCallback(LMAN_MSG_PARENT_FOUND, 1); } if (lman.fastSearchParent_flag && lman.connect_period != 1 && gRfuLinkStatus->findParentCount == RFU_CHILD_MAX) { rfu_REQ_endSearchParent(); rfu_waitREQComplete(); lman.state = LMAN_STATE_START_SEARCH_PARENT; lman.fastSearchParent_flag = FSP_ON; } } if (lman.connect_period && --lman.connect_period == 0) { lman.state = LMAN_STATE_END_SEARCH_PARENT; lman.next_state = LMAN_STATE_READY; } break; case ID_SP_END_REQ: if (reqResult == 0) { lman.state = lman.next_state; if (lman.pcswitch_flag == 0) { if (lman.state == LMAN_STATE_READY) { rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED, 0); } } else if (lman.pcswitch_flag != PCSWITCH_CP) { lman.state = LMAN_STATE_START_SEARCH_CHILD; lman.pcswitch_flag = PCSWITCH_3RD_SC_START; } } break; case ID_CP_START_REQ: if (reqResult == 0) { lman.state = lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT; } break; case ID_CP_POLL_REQ: if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot) && !status) { lman.state = LMAN_STATE_END_CONNECT_PARENT; } if (lman.connect_period && --lman.connect_period == 0) { lman.state = LMAN_STATE_END_CONNECT_PARENT; } break; case ID_CP_END_REQ: if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot)) { if (!status) { lman.state = LMAN_STATE_MS_CHANGE; lman.next_state = LMAN_STATE_SEND_CHILD_NAME; lman.work = 0x22; lman.param[0] = lman.child_slot; } else { lman.state = lman.next_state = LMAN_STATE_READY; lman.work = 0x23; lman.param[0] = status; if (lman.pcswitch_flag) { lman.pcswitch_flag = PCSWITCH_2ND_SP_START; lman.state = LMAN_STATE_START_SEARCH_PARENT; } } rfu_LMAN_occureCallback(lman.work, 0x01); lman.work = 0; } break; case ID_CPR_START_REQ: if (reqResult == 0) { lman.param[0] = gRfuLinkStatus->linkLossSlotFlag; lman.state = lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY; for (lman.child_slot = 0; lman.child_slot < RFU_CHILD_MAX; lman.child_slot++) { if ((gRfuLinkStatus->linkLossSlotFlag >> lman.child_slot) & 1) { break; } } } break; case ID_CPR_POLL_REQ: if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status) && status < 2) { lman.state = LMAN_STATE_END_LINK_RECOVERY; } if (lman.linkRecoveryTimer.count[lman.child_slot] && --lman.linkRecoveryTimer.count[lman.child_slot] == 0) { lman.state = LMAN_STATE_END_LINK_RECOVERY; } break; case ID_CPR_END_REQ: if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status)) { if (!status) { lman.state = LMAN_STATE_MS_CHANGE; lman.next_state = LMAN_STATE_BACK_STATE; lman.work = 0x32; } else { lman.state = lman.next_state = LMAN_STATE_READY; rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag); lman.work = 0x33; } lman.linkRecoveryTimer.count[lman.child_slot] = 0; lman.linkRecoveryTimer.active = 0; lman.linkRecovery_start_flag = 0; rfu_LMAN_occureCallback(lman.work, 0x01); lman.work = 0; } break; case ID_MS_CHANGE_REQ: if (reqResult == 0) { if (lman.next_state == LMAN_STATE_BACK_STATE) { lman.state = lman.state_bak[0]; lman.next_state = lman.state_bak[1]; lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON; rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0); } else if (lman.next_state == LMAN_STATE_SEND_CHILD_NAME) { lman.state = lman.next_state; lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON; rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0); lman.nameAcceptTimer.active |= 1 << lman.child_slot; lman.nameAcceptTimer.count[lman.child_slot] = lman.nameAcceptTimer.count_max; rfu_clearSlot(TYPE_NI_SEND, lman.child_slot); status = rfu_NI_CHILD_setSendGameName(lman.child_slot, 0x0e); if (status) { lman.state = lman.next_state = LMAN_STATE_READY; rfu_LMAN_managerChangeAgbClockMaster(); rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); lman.param[0] = status; rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1); } } } break; case ID_STOP_MODE_REQ: if (reqResult == 0) { lman.state = lman.next_state = LMAN_STATE_READY; rfu_LMAN_occureCallback(LMAN_MSG_RFU_POWER_DOWN, 0); } break; } lman.active = 1; } else if (reqResult == 3 && lman.msc_exe_flag && (reqCommandId == ID_DATA_TX_REQ || reqCommandId == ID_DATA_RX_REQ || reqCommandId == ID_MS_CHANGE_REQ)) { rfu_REQ_RFUStatus(); rfu_waitREQComplete(); rfu_getRFUStatus(&status); if (status == 0 && gRfuLinkStatus->parentChild == MODE_CHILD) { stwiRecvBuffer = rfu_getSTWIRecvBuffer() + 4; *stwiRecvBuffer++ = gRfuLinkStatus->connSlotFlag; *stwiRecvBuffer = REASON_LINK_LOSS; rfu_LMAN_linkWatcher(ID_DISCONNECTED_AND_CHANGE_REQ); reqResult = 0; } } switch (reqCommandId) { case ID_DISCONNECT_REQ: if (reqResult == 0) { lman.param[0] = *(rfu_getSTWIRecvBuffer() + 8); rfu_LMAN_reflectCommunicationStatus(lman.param[0]); if (lman.linkRecoveryTimer.active) { lman.linkRecoveryTimer.active &= ~lman.param[0]; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((lman.param[0] >> i) & 1) { lman.linkRecoveryTimer.count[i] = 0; } } if (lman.parent_child == MODE_CHILD) { lman.state = lman.next_state = LMAN_STATE_READY; } } status = lman.acceptSlot_flag & lman.param[0]; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((status >> i) & 1 && lman.acceptCount) { lman.acceptCount--; } } lman.acceptSlot_flag &= ~lman.param[0]; if (lman.pcswitch_flag) { if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) { if (lman.pcswitch_flag == PCSWITCH_SC_LOCK) { lman.connect_period = lman.pcswitch_period_bak; lman.pcswitch_flag = PCSWITCH_3RD_SC; lman.state = LMAN_STATE_POLL_SEARCH_CHILD; } else if (lman.state != LMAN_STATE_POLL_SEARCH_CHILD && lman.state != LMAN_STATE_END_SEARCH_CHILD) { lman.pcswitch_flag = PCSWITCH_1ST_SC_START; lman.state = LMAN_STATE_START_SEARCH_CHILD; } } } if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) { if (lman.state == LMAN_STATE_READY) { lman.parent_child = MODE_NEUTRAL; } } if (lman.active == 0) { rfu_LMAN_occureCallback(LMAN_MSG_LINK_DISCONNECTED_BY_USER, 1); } } break; case ID_DATA_RX_REQ: rfu_LMAN_CHILD_checkSendChildName2(); if (gRfuLinkStatus->parentChild != MODE_NEUTRAL) { rfu_LMAN_occureCallback(LMAN_MSG_RECV_DATA_REQ_COMPLETED, 0); } break; case ID_RESET_REQ: case ID_STOP_MODE_REQ: if (reqResult == 0) { lman.reserveDisconnectSlot_flag = 0; lman.acceptCount = 0; lman.acceptSlot_flag = 0; lman.parent_child = MODE_NEUTRAL; rfu_LMAN_managerChangeAgbClockMaster(); if (reqCommandId == ID_STOP_MODE_REQ) { rfu_LMAN_endManager(); } } break; } if (reqResult != 0) { if (reqCommandId == ID_SP_START_REQ && reqResult != 0 && lman.pcswitch_flag == PCSWITCH_2ND_SP) { gRfuLinkStatus->parentChild = MODE_PARENT; gRfuLinkStatus->connSlotFlag = 0xF; rfu_LMAN_disconnect(15); rfu_waitREQComplete(); return; } else { lman.param[0] = reqCommandId; lman.param[1] = reqResult; if (lman.active) { lman.state = lman.next_state = LMAN_STATE_READY; } rfu_LMAN_occureCallback(LMAN_MSG_REQ_API_ERROR, 2); rfu_LMAN_managerChangeAgbClockMaster(); } } if (reqCommandId == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ) { rfu_LMAN_occureCallback(LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA, 0); rfu_LMAN_managerChangeAgbClockMaster(); } } static void rfu_LMAN_MSC_callback(u16 reqCommandId) { u8 active_bak; u8 thisAck_flag; active_bak = lman.active; lman.active = 0; lman.msc_exe_flag = 1; if (gRfuLinkStatus->parentChild == MODE_CHILD) { rfu_LMAN_linkWatcher(reqCommandId); if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_ON) { rfu_LMAN_managerChangeAgbClockMaster(); lman.msc_exe_flag = 0; lman.active = active_bak; return; } } else { if (!rfu_UNI_PARENT_getDRAC_ACK(&thisAck_flag)) { lman.parentAck_flag |= thisAck_flag; } } if (lman.MSC_callback != NULL) { lman.MSC_callback(reqCommandId); rfu_waitREQComplete(); if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF_REQ) { rfu_LMAN_managerChangeAgbClockMaster(); } } lman.msc_exe_flag = 0; lman.active = active_bak; } static void rfu_LMAN_PARENT_checkRecvChildName(void) { u8 newSlot; u8 newAcceptSlot; u8 i; u8 flags; u8 tgtSlot; const u16 *ptr; if (lman.state == LMAN_STATE_START_SEARCH_CHILD || lman.state == LMAN_STATE_POLL_SEARCH_CHILD || lman.state == LMAN_STATE_END_SEARCH_CHILD || lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME) { newSlot = ((gRfuLinkStatus->connSlotFlag ^ lman.connectSlot_flag_old) & gRfuLinkStatus->connSlotFlag) & ~gRfuLinkStatus->getNameFlag; lman.connectSlot_flag_old = gRfuLinkStatus->connSlotFlag; if (newSlot) { lman.param[0] = newSlot; rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_DETECTED, 1); } newAcceptSlot = 0x00; for (i = 0; i < RFU_CHILD_MAX; i++) { tgtSlot = 1 << i; flags = 0x00; if (newSlot & tgtSlot) { lman.nameAcceptTimer.count[i] = lman.nameAcceptTimer.count_max; lman.nameAcceptTimer.active |= tgtSlot; } else if (lman.nameAcceptTimer.active & tgtSlot) { if (gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS) { if (gRfuSlotStatusNI[i]->recv.dataType == 1) { flags = RN_NAME_TIMER_CLEAR; for (ptr = lman.acceptable_serialNo_list; *ptr != 0xFFFF; ptr++) { if (gRfuLinkStatus->partner[i].serialNo == *ptr) { lman.acceptSlot_flag |= tgtSlot; lman.acceptCount++; newAcceptSlot |= tgtSlot; flags |= RN_ACCEPT; break; } } if (!(flags & RN_ACCEPT)) { flags |= RN_DISCONNECT; } } } else if (--lman.nameAcceptTimer.count[i] == 0) { flags = RN_NAME_TIMER_CLEAR | RN_DISCONNECT; } if (flags & RN_NAME_TIMER_CLEAR) { lman.nameAcceptTimer.active &= ~tgtSlot; lman.nameAcceptTimer.count[i] = 0; rfu_clearSlot(TYPE_NI_RECV, i); } if (flags & RN_DISCONNECT) { lman.reserveDisconnectSlot_flag |= tgtSlot; } } } if (newAcceptSlot) { lman.param[0] = newAcceptSlot; rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED, 1); } if (lman.reserveDisconnectSlot_flag) { flags = 1; if (gRfuLinkStatus->sendSlotUNIFlag) { if (((lman.parentAck_flag & lman.acceptSlot_flag) != lman.acceptSlot_flag)) { flags = 0; } } if (flags) { rfu_LMAN_disconnect(lman.reserveDisconnectSlot_flag); lman.param[0] = lman.reserveDisconnectSlot_flag; lman.reserveDisconnectSlot_flag = 0; rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_REJECTED, 1); } } if (lman.nameAcceptTimer.active == 0 && lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME) { if (lman.pcswitch_flag == 0) { lman.state = lman.next_state = LMAN_STATE_READY; rfu_LMAN_occureCallback(LMAN_MSG_END_WAIT_CHILD_NAME, 0); } else { if (lman.pcswitch_flag == PCSWITCH_1ST_SC) { lman.pcswitch_flag = PCSWITCH_2ND_SP_START; lman.state = LMAN_STATE_START_SEARCH_PARENT; } else { lman.pcswitch_flag = PCSWITCH_1ST_SC_START; lman.state = LMAN_STATE_START_SEARCH_CHILD; } if (lman.acceptSlot_flag) { lman.connect_period = 0; lman.pcswitch_flag = PCSWITCH_SC_LOCK; lman.state = LMAN_STATE_START_SEARCH_CHILD; } } } } } static void rfu_LMAN_CHILD_checkSendChildName(void) { u16 imeBak = REG_IME; REG_IME = 0; if (lman.state == LMAN_STATE_SEND_CHILD_NAME) { if (--lman.nameAcceptTimer.count[lman.child_slot] == 0 || gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_FAILED) { rfu_LMAN_requestChangeAgbClockMaster(); lman.state = LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER; rfu_clearSlot(TYPE_NI_SEND, lman.child_slot); lman.nameAcceptTimer.active &= ~(1 << lman.child_slot); lman.nameAcceptTimer.count[lman.child_slot] = 0; } } REG_IME = imeBak; if (lman.state == LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER) { if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON) { rfu_LMAN_requestChangeAgbClockMaster(); } if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF) { lman.state = lman.next_state = LMAN_STATE_READY; rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); lman.param[0] = 0; rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1); } } } static void rfu_LMAN_CHILD_checkSendChildName2(void) { if (lman.state == LMAN_STATE_SEND_CHILD_NAME && gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_SUCCESS) { lman.state = lman.next_state = LMAN_STATE_READY; rfu_clearSlot(TYPE_NI_SEND, lman.child_slot); lman.nameAcceptTimer.active &= ~(1 << lman.child_slot); lman.nameAcceptTimer.count[lman.child_slot] = 0; rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_COMPLETED, 0); } } static void rfu_LMAN_CHILD_linkRecoveryProcess(void) { if (lman.parent_child == MODE_CHILD && lman.linkRecovery_start_flag == LINK_RECOVERY_START) { lman.state_bak[0] = lman.state; lman.state_bak[1] = lman.next_state; lman.state = LMAN_STATE_START_LINK_RECOVERY; lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY; lman.linkRecovery_start_flag = LINK_RECOVERY_EXE; } } static u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void) { u8 i; u16 *serialNo; u8 flags = 0x00; for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { for (serialNo = lman.acceptable_serialNo_list; *serialNo != 0xFFFF; serialNo++) { if (gRfuLinkStatus->partner[i].serialNo == *serialNo) { flags |= (1 << i); } } } return flags; } static void rfu_LMAN_occureCallback(u8 msg, u8 param_count) { if (lman.LMAN_callback != NULL) { lman.LMAN_callback(msg, param_count); } lman.param[0] = lman.param[1] = 0; } static void rfu_LMAN_disconnect(u8 bm_disconnectedSlot) { u8 active_bak = lman.active; lman.active = 1; rfu_REQ_disconnect(bm_disconnectedSlot); rfu_waitREQComplete(); lman.active = active_bak; } static void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot) { u8 i; if (gRfuLinkStatus->sendSlotNIFlag) { for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->send.bmSlot & bm_disconnectedSlot) { rfu_changeSendTarget(TYPE_NI, i, gRfuSlotStatusNI[i]->send.bmSlot & ~bm_disconnectedSlot); } } } if (gRfuLinkStatus->recvSlotNIFlag) { for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.bmSlot & bm_disconnectedSlot) { rfu_NI_stopReceivingData(i); } } } if (gRfuLinkStatus->sendSlotUNIFlag) { gRfuLinkStatus->sendSlotUNIFlag &= ~bm_disconnectedSlot; for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI && bm_disconnectedSlot & gRfuSlotStatusUNI[i]->send.bmSlot) { gRfuSlotStatusUNI[i]->send.bmSlot &= ~bm_disconnectedSlot; } } } } static void rfu_LMAN_checkNICommunicateStatus(void) { u8 i; u8 j; u8 flags; if (lman.NI_failCounter_limit) { if (gRfuLinkStatus->sendSlotNIFlag) { for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG) { flags = 0; for (j = 0; j < RFU_CHILD_MAX; j++) { if ((gRfuSlotStatusNI[i]->send.bmSlot >> j) & 1 && gRfuSlotStatusNI[j]->send.failCounter > lman.NI_failCounter_limit) { flags |= (1 << j); } if (flags) { rfu_changeSendTarget(TYPE_NI, i, flags ^ gRfuSlotStatusNI[i]->send.bmSlot); } } } } } if (gRfuLinkStatus->recvSlotNIFlag) { for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.failCounter > lman.NI_failCounter_limit) { rfu_NI_stopReceivingData(i); } } } } } void rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16)) { lman.MSC_callback = MSC_callback_p; rfu_setMSCCallback(rfu_LMAN_MSC_callback); } static void rfu_LMAN_setLMANCallback(void (*func)(u8, u8)) { lman.LMAN_callback = func; } u8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period) { u16 imeBak; if (lman.linkRecovery_enable && enable_flag == 0 && lman.linkRecoveryTimer.active) { return LMAN_ERROR_NOW_LINK_RECOVERY; } imeBak = REG_IME; REG_IME = 0; lman.linkRecovery_enable = enable_flag; lman.linkRecoveryTimer.count_max = recovery_period; REG_IME = imeBak; return 0; } static u8 rfu_LMAN_setNIFailCounterLimit(u16 NI_failCounter_limit) { if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag) { lman.param[0] = 6; rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); return LMAN_ERROR_NOW_COMMUNICATION; } lman.NI_failCounter_limit = NI_failCounter_limit; return 0; } static u8 rfu_LMAN_setFastSearchParent(u8 enable_flag) { if (lman.state == LMAN_STATE_START_SEARCH_PARENT || lman.state == LMAN_STATE_POLL_SEARCH_PARENT || lman.state == LMAN_STATE_END_SEARCH_PARENT) { lman.param[0] = 7; rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); return LMAN_ERROR_NOW_SEARCH_PARENT; } if (enable_flag) { lman.fastSearchParent_flag = FSP_ON; } else { lman.fastSearchParent_flag = 0; } return 0; } static void rfu_LMAN_managerChangeAgbClockMaster(void) { if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_OFF) { lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF; rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0); } } void rfu_LMAN_requestChangeAgbClockMaster(void) { if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF) { rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0); } else if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON) { lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF_REQ; } } void rfu_LMAN_forceChangeSP(void) { if (lman.pcswitch_flag) { switch (lman.state) { case LMAN_STATE_START_SEARCH_CHILD: lman.pcswitch_flag = PCSWITCH_2ND_SP_START; lman.state = LMAN_STATE_START_SEARCH_PARENT; break; case LMAN_STATE_POLL_SEARCH_CHILD: lman.pcswitch_flag = PCSWITCH_1ST_SC; lman.connect_period = 1; break; case LMAN_STATE_END_SEARCH_CHILD: case LMAN_STATE_WAIT_RECV_CHILD_NAME: lman.pcswitch_flag = PCSWITCH_1ST_SC; break; case LMAN_STATE_START_SEARCH_PARENT: case LMAN_STATE_POLL_SEARCH_PARENT: lman.connect_period = PCSWITCH_SP_PERIOD; break; case LMAN_STATE_END_SEARCH_PARENT: lman.connect_period = PCSWITCH_SP_PERIOD; lman.state = LMAN_STATE_POLL_SEARCH_PARENT; break; } } } ================================================ FILE: src/agb_flash.c ================================================ #include "gba/gba.h" #include "gba/flash_internal.h" static u8 sTimerNum; static u16 sTimerCount; static vu16 *sTimerReg; static u16 sSavedIme; u8 gFlashTimeoutFlag; u8 (*PollFlashStatus)(u8 *); u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData); u16 (*ProgramFlashSector)(u16 sectorNum, void *src); const struct FlashType *gFlash; u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data); u16 gFlashNumRemainingBytes; u16 (*EraseFlashChip)(); u16 (*EraseFlashSector)(u16 sectorNum); const u16 *gFlashMaxTime; void SetReadFlash1(u16 *dest); void SwitchFlashBank(u8 bankNum) { FLASH_WRITE(0x5555, 0xAA); FLASH_WRITE(0x2AAA, 0x55); FLASH_WRITE(0x5555, 0xB0); FLASH_WRITE(0x0000, bankNum); } #define DELAY() \ do { \ vu16 i; \ for (i = 20000; i != 0; i--) \ ; \ } while (0) u16 ReadFlashId(void) { u16 flashId; u16 readFlash1Buffer[0x20]; u8 (*readFlash1)(u8 *); SetReadFlash1(readFlash1Buffer); readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1); // Enter ID mode. FLASH_WRITE(0x5555, 0xAA); FLASH_WRITE(0x2AAA, 0x55); FLASH_WRITE(0x5555, 0x90); DELAY(); flashId = readFlash1(FLASH_BASE + 1) << 8; flashId |= readFlash1(FLASH_BASE); // Leave ID mode. FLASH_WRITE(0x5555, 0xAA); FLASH_WRITE(0x2AAA, 0x55); FLASH_WRITE(0x5555, 0xF0); FLASH_WRITE(0x5555, 0xF0); DELAY(); return flashId; } void FlashTimerIntr(void) { if (sTimerCount != 0 && --sTimerCount == 0) gFlashTimeoutFlag = 1; } u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)) { if (timerNum >= 4) return 1; sTimerNum = timerNum; sTimerReg = ®_TMCNT_L(sTimerNum); *intrFunc = FlashTimerIntr; return 0; } void StartFlashTimer(u8 phase) { const u16 *maxTime = &gFlashMaxTime[phase * 3]; sSavedIme = REG_IME; REG_IME = 0; sTimerReg[1] = 0; REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum); gFlashTimeoutFlag = 0; sTimerCount = *maxTime++; *sTimerReg++ = *maxTime++; *sTimerReg-- = *maxTime++; REG_IF = (INTR_FLAG_TIMER0 << sTimerNum); REG_IME = 1; } void StopFlashTimer(void) { REG_IME = 0; *sTimerReg++ = 0; *sTimerReg-- = 0; REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum); REG_IME = sSavedIme; } u8 ReadFlash1(u8 *addr) { return *addr; } void SetReadFlash1(u16 *dest) { u16 *src; u32 i; PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1); src = (u16 *)ReadFlash1; src = (u16 *)((s32)src ^ 1); i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1; while (i != 0) { *dest++ = *src++; i--; } } // Using volatile here to make sure the flash memory will ONLY be read as bytes, to prevent any compiler optimizations. void ReadFlash_Core(vu8 *src, u8 *dest, u32 size) { while (size-- != 0) { *dest++ = *src++; } } void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size) { u8 *src; u32 i; vu16 readFlash_Core_Buffer[0x40]; vu16 *funcSrc; vu16 *funcDest; void (*readFlash_Core)(vu8 *, u8 *, u32); REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; if (gFlash->romSize == FLASH_ROM_SIZE_1M) { SwitchFlashBank(sectorNum / SECTORS_PER_BANK); sectorNum %= SECTORS_PER_BANK; } funcSrc = (vu16 *)ReadFlash_Core; funcSrc = (vu16 *)((s32)funcSrc ^ 1); funcDest = readFlash_Core_Buffer; i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1; while (i != 0) { *funcDest++ = *funcSrc++; i--; } readFlash_Core = (void (*)(vu8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1); src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; readFlash_Core(src, dest, size); } u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size) { while (size-- != 0) { if (*tgt++ != *src++) return (u32)(tgt - 1); } return 0; } u32 VerifyFlashSector(u16 sectorNum, u8 *src) { u32 i; vu16 verifyFlashSector_Core_Buffer[0x80]; vu16 *funcSrc; vu16 *funcDest; u8 *tgt; u16 size; u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; if (gFlash->romSize == FLASH_ROM_SIZE_1M) { SwitchFlashBank(sectorNum / SECTORS_PER_BANK); sectorNum %= SECTORS_PER_BANK; } funcSrc = (vu16 *)VerifyFlashSector_Core; funcSrc = (vu16 *)((s32)funcSrc ^ 1); funcDest = verifyFlashSector_Core_Buffer; i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; while (i != 0) { *funcDest++ = *funcSrc++; i--; } verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); size = gFlash->sector.size; return verifyFlashSector_Core(src, tgt, size); // return 0 if verified. } u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n) { u32 i; vu16 verifyFlashSector_Core_Buffer[0x80]; vu16 *funcSrc; vu16 *funcDest; u8 *tgt; u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); if (gFlash->romSize == FLASH_ROM_SIZE_1M) { SwitchFlashBank(sectorNum / SECTORS_PER_BANK); sectorNum %= SECTORS_PER_BANK; } REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; funcSrc = (vu16 *)VerifyFlashSector_Core; funcSrc = (vu16 *)((s32)funcSrc ^ 1); funcDest = verifyFlashSector_Core_Buffer; i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; while (i != 0) { *funcDest++ = *funcSrc++; i--; } verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); return verifyFlashSector_Core(src, tgt, n); } u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) { u32 i; u32 result; for (i = 0; i < 3; i++) // 3 attempts { result = ProgramFlashSector(sectorNum, src); if (result != 0) continue; result = VerifyFlashSector(sectorNum, src); if (result == 0) break; } return result; // return 0 if verified and programmed. } u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n) { u32 i; u32 result; for (i = 0; i < 3; i++) { result = ProgramFlashSector(sectorNum, dataSrc); if (result != 0) continue; result = VerifyFlashSectorNBytes(sectorNum, dataSrc, n); if (result == 0) break; } return result; } ================================================ FILE: src/agb_flash_1m.c ================================================ #include "gba/gba.h" #include "gba/flash_internal.h" static const char AgbLibFlashVersion[] = "FLASH1M_V103"; const struct FlashSetupInfo * const sSetupInfos[] = { &MX29L010, &LE26FV10N1TS, &DefaultFlash }; u16 IdentifyFlash(void) { u16 result; u16 flashId; const struct FlashSetupInfo * const *setupInfo; REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; flashId = ReadFlashId(); setupInfo = sSetupInfos; result = 1; for (;;) { if ((*setupInfo)->type.ids.separate.makerId == 0) break; if (flashId == (*setupInfo)->type.ids.joined) { result = 0; break; } setupInfo++; } ProgramFlashByte = (*setupInfo)->programFlashByte; ProgramFlashSector = (*setupInfo)->programFlashSector; EraseFlashChip = (*setupInfo)->eraseFlashChip; EraseFlashSector = (*setupInfo)->eraseFlashSector; WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite; gFlashMaxTime = (*setupInfo)->maxTime; gFlash = &(*setupInfo)->type; return result; } u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData) { u16 result = 0; u8 status; StartFlashTimer(phase); while ((status = PollFlashStatus(addr)) != lastData) { if (status & 0x20) { // The write operation exceeded the flash chip's time limit. if (PollFlashStatus(addr) == lastData) break; FLASH_WRITE(0x5555, 0xF0); result = phase | 0xA000u; break; } if (gFlashTimeoutFlag) { if (PollFlashStatus(addr) == lastData) break; FLASH_WRITE(0x5555, 0xF0); result = phase | 0xC000u; break; } } StopFlashTimer(); return result; } ================================================ FILE: src/agb_flash_le.c ================================================ #include "gba/gba.h" #include "gba/flash_internal.h" const u16 leMaxTime[] = { 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, }; const struct FlashSetupInfo LE26FV10N1TS = { ProgramFlashByte_MX, ProgramFlashSector_MX, EraseFlashChip_MX, EraseFlashSector_MX, WaitForFlashWrite_Common, leMaxTime, { 131072, // ROM size { 4096, // sector size 12, // bit shift to multiply by sector size (4096 == 1 << 12) 32, // number of sectors 0 // appears to be unused }, { 3, 1 }, // wait state setup data { { 0x62, 0x13 } } // ID } }; ================================================ FILE: src/agb_flash_mx.c ================================================ #include "gba/gba.h" #include "gba/flash_internal.h" const u16 mxMaxTime[] = { 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, }; const struct FlashSetupInfo MX29L010 = { ProgramFlashByte_MX, ProgramFlashSector_MX, EraseFlashChip_MX, EraseFlashSector_MX, WaitForFlashWrite_Common, mxMaxTime, { 131072, // ROM size { 4096, // sector size 12, // bit shift to multiply by sector size (4096 == 1 << 12) 32, // number of sectors 0 // appears to be unused }, { 3, 1 }, // wait state setup data #if defined(GERMAN) && defined(SAPPHIRE) { { 0xBF, 0xD4 } } // ID #else { { 0xC2, 0x09 } } // ID #endif } }; const struct FlashSetupInfo DefaultFlash = { ProgramFlashByte_MX, ProgramFlashSector_MX, EraseFlashChip_MX, EraseFlashSector_MX, WaitForFlashWrite_Common, mxMaxTime, { 131072, // ROM size { 4096, // sector size 12, // bit shift to multiply by sector size (4096 == 1 << 12) 32, // number of sectors 0 // appears to be unused }, { 3, 1 }, // wait state setup data { { 0x00, 0x00 } } // ID of 0 } }; u16 EraseFlashChip_MX(void) { u16 result; u16 readFlash1Buffer[0x20]; REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; FLASH_WRITE(0x5555, 0xAA); FLASH_WRITE(0x2AAA, 0x55); FLASH_WRITE(0x5555, 0x80); FLASH_WRITE(0x5555, 0xAA); FLASH_WRITE(0x2AAA, 0x55); FLASH_WRITE(0x5555, 0x10); SetReadFlash1(readFlash1Buffer); result = WaitForFlashWrite(3, FLASH_BASE, 0xFF); REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; return result; } u16 EraseFlashSector_MX(u16 sectorNum) { u16 numTries; u16 result; u8 *addr; u16 readFlash1Buffer[0x20]; if (sectorNum >= gFlash->sector.count) return 0x80FF; SwitchFlashBank(sectorNum / SECTORS_PER_BANK); sectorNum %= SECTORS_PER_BANK; numTries = 0; try_erase: REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; addr = FLASH_BASE + (sectorNum << gFlash->sector.shift); FLASH_WRITE(0x5555, 0xAA); FLASH_WRITE(0x2AAA, 0x55); FLASH_WRITE(0x5555, 0x80); FLASH_WRITE(0x5555, 0xAA); FLASH_WRITE(0x2AAA, 0x55); *addr = 0x30; SetReadFlash1(readFlash1Buffer); result = WaitForFlashWrite(2, addr, 0xFF); if (!(result & 0xA000) || numTries > 3) goto done; numTries++; goto try_erase; done: REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; return result; } u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data) { u8 *addr; u16 readFlash1Buffer[0x20]; if (offset >= gFlash->sector.size) return 0x8000; SwitchFlashBank(sectorNum / SECTORS_PER_BANK); sectorNum %= SECTORS_PER_BANK; addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; SetReadFlash1(readFlash1Buffer); REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; FLASH_WRITE(0x5555, 0xAA); FLASH_WRITE(0x2AAA, 0x55); FLASH_WRITE(0x5555, 0xA0); *addr = data; return WaitForFlashWrite(1, addr, data); } static u16 ProgramByte(u8 *src, u8 *dest) { FLASH_WRITE(0x5555, 0xAA); FLASH_WRITE(0x2AAA, 0x55); FLASH_WRITE(0x5555, 0xA0); *dest = *src; return WaitForFlashWrite(1, dest, *src); } u16 ProgramFlashSector_MX(u16 sectorNum, void *src) { u16 result; u8 *dest; u16 readFlash1Buffer[0x20]; if (sectorNum >= gFlash->sector.count) return 0x80FF; result = EraseFlashSector_MX(sectorNum); if (result != 0) return result; SwitchFlashBank(sectorNum / SECTORS_PER_BANK); sectorNum %= SECTORS_PER_BANK; SetReadFlash1(readFlash1Buffer); REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; gFlashNumRemainingBytes = gFlash->sector.size; dest = FLASH_BASE + (sectorNum << gFlash->sector.shift); while (gFlashNumRemainingBytes > 0) { result = ProgramByte(src, dest); if (result != 0) break; gFlashNumRemainingBytes--; src++; dest++; } return result; } ================================================ FILE: src/bag.c ================================================ #include "global.h" #include "gflib.h" #include "item_menu.h" #include "text_window.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "menu.h" #include "money.h" #include "strings.h" static const u16 sBagWindowPalF[] = INCBIN_U16("graphics/item_menu/bag_window_pal.gbapal"); static const u8 sTextColors[][3] = { {0, 1, 2}, {0, 2, 3}, {0, 3, 2}, {0, 8, 9} }; static const struct WindowTemplate sDefaultBagWindowsStd[] = { { .bg = 0, .tilemapLeft = 11, .tilemapTop = 1, .width = 18, .height = 12, .paletteNum = 15, .baseBlock = 0x008a }, { .bg = 0, .tilemapLeft = 5, .tilemapTop = 14, .width = 25, .height = 6, .paletteNum = 15, .baseBlock = 0x0162 }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 9, .height = 2, .paletteNum = 15, .baseBlock = 0x01f8 }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sDefaultBagWindowsDeposit[] = { { .bg = 0, .tilemapLeft = 11, .tilemapTop = 1, .width = 18, .height = 12, .paletteNum = 15, .baseBlock = 0x008a }, { .bg = 0, .tilemapLeft = 5, .tilemapTop = 14, .width = 25, .height = 6, .paletteNum = 15, .baseBlock = 0x0162 }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 8, .height = 2, .paletteNum = 12, .baseBlock = 0x01f8 }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 24, .tilemapTop = 15, .width = 5, .height = 4, .paletteNum = 15, .baseBlock = 0x242 }, { .bg = 0, .tilemapLeft = 17, .tilemapTop = 9, .width = 12, .height = 4, .paletteNum = 15, .baseBlock = 0x242 }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 8, .height = 3, .paletteNum = 12, .baseBlock = 0x272 }, { .bg = 0, .tilemapLeft = 23, .tilemapTop = 15, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x28a }, { .bg = 0, .tilemapLeft = 21, .tilemapTop = 9, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x28a }, { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 15, .baseBlock = 0x2a2 }, { .bg = 0, .tilemapLeft = 6, .tilemapTop = 15, .width = 14, .height = 4, .paletteNum = 12, .baseBlock = 0x2a2 }, { .bg = 0, .tilemapLeft = 6, .tilemapTop = 15, .width = 15, .height = 4, .paletteNum = 12, .baseBlock = 0x2da }, { .bg = 0, .tilemapLeft = 6, .tilemapTop = 15, .width = 16, .height = 4, .paletteNum = 12, .baseBlock = 0x316 }, { .bg = 0, .tilemapLeft = 6, .tilemapTop = 15, .width = 23, .height = 4, .paletteNum = 12, .baseBlock = 0x356 }, { .bg = 0, .tilemapLeft = 22, .tilemapTop = 17, .width = 7, .height = 2, .paletteNum = 15, .baseBlock = 0x20a }, { .bg = 0, .tilemapLeft = 22, .tilemapTop = 15, .width = 7, .height = 4, .paletteNum = 15, .baseBlock = 0x20a }, { .bg = 0, .tilemapLeft = 22, .tilemapTop = 13, .width = 7, .height = 6, .paletteNum = 15, .baseBlock = 0x20a }, { .bg = 0, .tilemapLeft = 22, .tilemapTop = 11, .width = 7, .height = 8, .paletteNum = 15, .baseBlock = 0x20a } }; static const u8 sUnused[] = {16, 8, 4}; static EWRAM_DATA u8 sOpenWindows[11] = {}; void InitBagWindows(void) { u32 i; if (gBagMenuState.location != 3) InitWindows(sDefaultBagWindowsStd); else InitWindows(sDefaultBagWindowsDeposit); DeactivateAllTextPrinters(); LoadUserWindowGfx(0, 0x64, BG_PLTT_ID(14)); LoadMenuMessageWindowGfx(0, 0x6D, BG_PLTT_ID(13)); LoadStdWindowGfx(0, 0x81, BG_PLTT_ID(12)); LoadPalette(sBagWindowPalF, BG_PLTT_ID(15), sizeof(sBagWindowPalF)); for (i = 0; i < 3; i++) { FillWindowPixelBuffer(i, 0x00); PutWindowTilemap(i); } ScheduleBgCopyTilemapToVram(0); for (i = 0; i < 11; i++) { sOpenWindows[i] = 0xFF; } } void BagPrintTextOnWindow(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx) { AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str); } void BagPrintTextOnWin1CenteredColor0(const u8 * str, u8 unused) { u32 x = 0x48 - GetStringWidth(FONT_NORMAL_COPY_1, str, 0); AddTextPrinterParameterized3(2, FONT_NORMAL_COPY_1, x / 2, 1, sTextColors[0], 0, str); } void BagDrawDepositItemTextBox(void) { u32 x; DrawStdFrameWithCustomTileAndPalette(2, FALSE, 0x081, 12); x = 0x40 - GetStringWidth(FONT_SMALL, gText_DepositItem, 0); AddTextPrinterParameterized(2, FONT_SMALL, gText_DepositItem, x / 2, 1, 0, NULL); } u8 ShowBagWindow(u8 whichWindow, u8 nItems) { if (sOpenWindows[whichWindow] == 0xFF) { sOpenWindows[whichWindow] = AddWindow(&sWindowTemplates[whichWindow + nItems]); if (whichWindow != 6) { DrawStdFrameWithCustomTileAndPalette(sOpenWindows[whichWindow], FALSE, 0x064, 14); } else { DrawStdFrameWithCustomTileAndPalette(sOpenWindows[whichWindow], FALSE, 0x081, 12); } ScheduleBgCopyTilemapToVram(0); } return sOpenWindows[whichWindow]; } void HideBagWindow(u8 whichWindow) { ClearStdWindowAndFrameToTransparent(sOpenWindows[whichWindow], FALSE); ClearWindowTilemap(sOpenWindows[whichWindow]); RemoveWindow(sOpenWindows[whichWindow]); ScheduleBgCopyTilemapToVram(0); sOpenWindows[whichWindow] = 0xFF; } u8 OpenBagWindow(u8 whichWindow) { if (sOpenWindows[whichWindow] == 0xFF) { sOpenWindows[whichWindow] = AddWindow(&sWindowTemplates[whichWindow]); } return sOpenWindows[whichWindow]; } void CloseBagWindow(u8 whichWindow) { if (sOpenWindows[whichWindow] != 0xFF) { ClearDialogWindowAndFrameToTransparent(sOpenWindows[whichWindow], FALSE); ClearWindowTilemap(sOpenWindows[whichWindow]); RemoveWindow(sOpenWindows[whichWindow]); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); sOpenWindows[whichWindow] = 0xFF; } } u8 GetBagWindow(u8 whichWindow) { return sOpenWindows[whichWindow]; } void BagCreateYesNoMenuBottomRight(u8 taskId, const struct YesNoFuncTable * ptrs) { CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates[3], FONT_NORMAL, 0, 2, 0x064, 14, ptrs); } void BagCreateYesNoMenuTopRight(u8 taskId, const struct YesNoFuncTable * ptrs) { CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates[4], FONT_NORMAL, 0, 2, 0x064, 14, ptrs); } void BagPrintMoneyAmount(void) { PrintMoneyAmountInMoneyBoxWithBorder(ShowBagWindow(2, 0), 0x081, 0x0C, GetMoney(&gSaveBlock1Ptr->money)); } void BagDrawTextBoxOnWindow(u8 windowId) { DrawTextBorderOuter(windowId, 0x064, 14); } ================================================ FILE: src/battle_ai_script_commands.c ================================================ #include "global.h" #include "battle.h" #include "battle_anim.h" #include "util.h" #include "event_data.h" #include "item.h" #include "random.h" #include "battle_ai_script_commands.h" #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_move_effects.h" #include "constants/moves.h" #define AI_ACTION_DONE 0x0001 #define AI_ACTION_FLEE 0x0002 #define AI_ACTION_WATCH 0x0004 #define AI_ACTION_DO_NOT_ATTACK 0x0008 #define AI_ACTION_UNK5 0x0010 #define AI_ACTION_UNK6 0x0020 #define AI_ACTION_UNK7 0x0040 #define AI_ACTION_UNK8 0x0080 #define AI_THINKING_STRUCT (gBattleResources->ai) #define BATTLE_HISTORY (gBattleResources->battleHistory) // AI states enum { AIState_SettingUp, AIState_Processing, AIState_FinishedProcessing, AIState_DoNotProcess }; /* sAIScriptPtr is a pointer to the next battle AI cmd command to read. when a command finishes processing, sAIScriptPtr is incremented by the number of bytes that the current command had reserved for arguments in order to read the next command correctly. refer to battle_ai_scripts.s for the AI scripts. */ static EWRAM_DATA const u8 *sAIScriptPtr = NULL; extern u8 *gBattleAI_ScriptsTable[]; static void Cmd_if_random_less_than(void); static void Cmd_if_random_greater_than(void); static void Cmd_if_random_equal(void); static void Cmd_if_random_not_equal(void); static void Cmd_score(void); static void Cmd_if_hp_less_than(void); static void Cmd_if_hp_more_than(void); static void Cmd_if_hp_equal(void); static void Cmd_if_hp_not_equal(void); static void Cmd_if_status(void); static void Cmd_if_not_status(void); static void Cmd_if_status2(void); static void Cmd_if_not_status2(void); static void Cmd_if_status3(void); static void Cmd_if_not_status3(void); static void Cmd_if_side_affecting(void); static void Cmd_if_not_side_affecting(void); static void Cmd_if_less_than(void); static void Cmd_if_more_than(void); static void Cmd_if_equal(void); static void Cmd_if_not_equal(void); static void Cmd_if_less_than_ptr(void); static void Cmd_if_more_than_ptr(void); static void Cmd_if_equal_ptr(void); static void Cmd_if_not_equal_ptr(void); static void Cmd_if_move(void); static void Cmd_if_not_move(void); static void Cmd_if_in_bytes(void); static void Cmd_if_not_in_bytes(void); static void Cmd_if_in_hwords(void); static void Cmd_if_not_in_hwords(void); static void Cmd_if_user_has_attacking_move(void); static void Cmd_if_user_has_no_attacking_moves(void); static void Cmd_get_turn_count(void); static void Cmd_get_type(void); static void Cmd_get_considered_move_power(void); static void Cmd_get_how_powerful_move_is(void); static void Cmd_get_last_used_battler_move(void); static void Cmd_if_equal_(void); static void Cmd_if_not_equal_(void); static void Cmd_if_would_go_first(void); static void Cmd_if_would_not_go_first(void); static void Cmd_nullsub_2A(void); static void Cmd_nullsub_2B(void); static void Cmd_count_alive_pokemon(void); static void Cmd_get_considered_move(void); static void Cmd_get_considered_move_effect(void); static void Cmd_get_ability(void); static void Cmd_get_highest_type_effectiveness(void); static void Cmd_if_type_effectiveness(void); static void Cmd_nullsub_32(void); static void Cmd_nullsub_33(void); static void Cmd_if_status_in_party(void); static void Cmd_if_status_not_in_party(void); static void Cmd_get_weather(void); static void Cmd_if_effect(void); static void Cmd_if_not_effect(void); static void Cmd_if_stat_level_less_than(void); static void Cmd_if_stat_level_more_than(void); static void Cmd_if_stat_level_equal(void); static void Cmd_if_stat_level_not_equal(void); static void Cmd_if_can_faint(void); static void Cmd_if_cant_faint(void); static void Cmd_if_has_move(void); static void Cmd_if_doesnt_have_move(void); static void Cmd_if_has_move_with_effect(void); static void Cmd_if_doesnt_have_move_with_effect(void); static void Cmd_if_any_move_disabled_or_encored(void); static void Cmd_if_curr_move_disabled_or_encored(void); static void Cmd_flee(void); static void Cmd_if_random_safari_flee(void); static void Cmd_watch(void); static void Cmd_get_hold_effect(void); static void Cmd_get_gender(void); static void Cmd_is_first_turn_for(void); static void Cmd_get_stockpile_count(void); static void Cmd_is_double_battle(void); static void Cmd_get_used_held_item(void); static void Cmd_get_move_type_from_result(void); static void Cmd_get_move_power_from_result(void); static void Cmd_get_move_effect_from_result(void); static void Cmd_get_protect_count(void); static void Cmd_nullsub_52(void); static void Cmd_nullsub_53(void); static void Cmd_nullsub_54(void); static void Cmd_nullsub_55(void); static void Cmd_nullsub_56(void); static void Cmd_nullsub_57(void); static void Cmd_call(void); static void Cmd_goto(void); static void Cmd_end(void); static void Cmd_if_level_compare(void); static void Cmd_if_target_taunted(void); static void Cmd_if_target_not_taunted(void); static void RecordLastUsedMoveByTarget(void); static void BattleAI_DoAIProcessing(void); static void AIStackPushVar(const u8 *ptr); static bool8 AIStackPop(void); typedef void (*BattleAICmdFunc)(void); static const BattleAICmdFunc sBattleAICmdTable[] = { Cmd_if_random_less_than, // 0x0 Cmd_if_random_greater_than, // 0x1 Cmd_if_random_equal, // 0x2 Cmd_if_random_not_equal, // 0x3 Cmd_score, // 0x4 Cmd_if_hp_less_than, // 0x5 Cmd_if_hp_more_than, // 0x6 Cmd_if_hp_equal, // 0x7 Cmd_if_hp_not_equal, // 0x8 Cmd_if_status, // 0x9 Cmd_if_not_status, // 0xA Cmd_if_status2, // 0xB Cmd_if_not_status2, // 0xC Cmd_if_status3, // 0xD Cmd_if_not_status3, // 0xE Cmd_if_side_affecting, // 0xF Cmd_if_not_side_affecting, // 0x10 Cmd_if_less_than, // 0x11 Cmd_if_more_than, // 0x12 Cmd_if_equal, // 0x13 Cmd_if_not_equal, // 0x14 Cmd_if_less_than_ptr, // 0x15 Cmd_if_more_than_ptr, // 0x16 Cmd_if_equal_ptr, // 0x17 Cmd_if_not_equal_ptr, // 0x18 Cmd_if_move, // 0x19 Cmd_if_not_move, // 0x1A Cmd_if_in_bytes, // 0x1B Cmd_if_not_in_bytes, // 0x1C Cmd_if_in_hwords, // 0x1D Cmd_if_not_in_hwords, // 0x1E Cmd_if_user_has_attacking_move, // 0x1F Cmd_if_user_has_no_attacking_moves, // 0x20 Cmd_get_turn_count, // 0x21 Cmd_get_type, // 0x22 Cmd_get_considered_move_power, // 0x23 Cmd_get_how_powerful_move_is, // 0x24 Cmd_get_last_used_battler_move, // 0x25 Cmd_if_equal_, // 0x26 Cmd_if_not_equal_, // 0x27 Cmd_if_would_go_first, // 0x28 Cmd_if_would_not_go_first, // 0x29 Cmd_nullsub_2A, // 0x2A Cmd_nullsub_2B, // 0x2B Cmd_count_alive_pokemon, // 0x2C Cmd_get_considered_move, // 0x2D Cmd_get_considered_move_effect, // 0x2E Cmd_get_ability, // 0x2F Cmd_get_highest_type_effectiveness, // 0x30 Cmd_if_type_effectiveness, // 0x31 Cmd_nullsub_32, // 0x32 Cmd_nullsub_33, // 0x33 Cmd_if_status_in_party, // 0x34 Cmd_if_status_not_in_party, // 0x35 Cmd_get_weather, // 0x36 Cmd_if_effect, // 0x37 Cmd_if_not_effect, // 0x38 Cmd_if_stat_level_less_than, // 0x39 Cmd_if_stat_level_more_than, // 0x3A Cmd_if_stat_level_equal, // 0x3B Cmd_if_stat_level_not_equal, // 0x3C Cmd_if_can_faint, // 0x3D Cmd_if_cant_faint, // 0x3E Cmd_if_has_move, // 0x3F Cmd_if_doesnt_have_move, // 0x40 Cmd_if_has_move_with_effect, // 0x41 Cmd_if_doesnt_have_move_with_effect, // 0x42 Cmd_if_any_move_disabled_or_encored, // 0x43 Cmd_if_curr_move_disabled_or_encored, // 0x44 Cmd_flee, // 0x45 Cmd_if_random_safari_flee, // 0x46 Cmd_watch, // 0x47 Cmd_get_hold_effect, // 0x48 Cmd_get_gender, // 0x49 Cmd_is_first_turn_for, // 0x4A Cmd_get_stockpile_count, // 0x4B Cmd_is_double_battle, // 0x4C Cmd_get_used_held_item, // 0x4D Cmd_get_move_type_from_result, // 0x4E Cmd_get_move_power_from_result, // 0x4F Cmd_get_move_effect_from_result, // 0x50 Cmd_get_protect_count, // 0x51 Cmd_nullsub_52, // 0x52 Cmd_nullsub_53, // 0x53 Cmd_nullsub_54, // 0x54 Cmd_nullsub_55, // 0x55 Cmd_nullsub_56, // 0x56 Cmd_nullsub_57, // 0x57 Cmd_call, // 0x58 Cmd_goto, // 0x59 Cmd_end, // 0x5A Cmd_if_level_compare, // 0x5B Cmd_if_target_taunted, // 0x5C Cmd_if_target_not_taunted, // 0x5D }; static const u16 sDiscouragedPowerfulMoveEffects[] = { EFFECT_EXPLOSION, EFFECT_DREAM_EATER, EFFECT_RAZOR_WIND, EFFECT_SKY_ATTACK, EFFECT_RECHARGE, EFFECT_SKULL_BASH, EFFECT_SOLAR_BEAM, EFFECT_SPIT_UP, EFFECT_FOCUS_PUNCH, EFFECT_SUPERPOWER, EFFECT_ERUPTION, EFFECT_OVERHEAT, 0xFFFF }; void BattleAI_HandleItemUseBeforeAISetup(void) { s32 i; u8 *data = (u8 *)BATTLE_HISTORY; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; for (i = 0; i < sizeof(struct BattleHistory); i++) data[i] = 0; // Items are allowed to use in ONLY trainer battles. if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) && (gTrainerBattleOpponent_A != TRAINER_SECRET_BASE) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_SAFARI | BATTLE_TYPE_LINK)) ) { for (i = 0; i < MAX_TRAINER_ITEMS; i++) { if (sTrainers[gTrainerBattleOpponent_A].items[i] != 0) { BATTLE_HISTORY->trainerItems[BATTLE_HISTORY->itemsNo] = sTrainers[gTrainerBattleOpponent_A].items[i]; BATTLE_HISTORY->itemsNo++; } } } BattleAI_SetupAIData(); } void BattleAI_SetupAIData(void) { s32 i; u8 *data = (u8 *)AI_THINKING_STRUCT; u8 moveLimitations; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; // Clear AI data. for (i = 0; i < sizeof(struct AI_ThinkingStruct); i++) data[i] = 0; for (i = 0; i < MAX_MON_MOVES; i++) AI_THINKING_STRUCT->score[i] = 100; moveLimitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF); // Ignore moves that aren't possible to use. for (i = 0; i < MAX_MON_MOVES; i++) { if (gBitTable[i] & moveLimitations) AI_THINKING_STRUCT->score[i] = 0; AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16); } gBattleResources->AI_ScriptsStack->size = 0; gBattlerAttacker = gActiveBattler; // Decide a random target battlerId in doubles. if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { gBattlerTarget = (Random() & BIT_FLANK); if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget ^= BIT_FLANK; } // There's only one choice in single battles. else { gBattlerTarget = gBattlerAttacker ^ BIT_SIDE; } // Choose proper trainer ai scripts. // Fire Red, why all the returns?!? if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_SAFARI; return; } else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) { AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_ROAMING; return; } else if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER)) && (gTrainerBattleOpponent_A != TRAINER_SECRET_BASE)) { if (gBattleTypeFlags & BATTLE_TYPE_WILD_SCRIPTED) { AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_CHECK_BAD_MOVE; return; } else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY_FRLG) { AI_THINKING_STRUCT->aiFlags = (AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY); return; } } else { AI_THINKING_STRUCT->aiFlags = (AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY); return; } AI_THINKING_STRUCT->aiFlags = sTrainers[gTrainerBattleOpponent_A].aiFlags; } u8 BattleAI_ChooseMoveOrAction(void) { u8 currentMoveArray[MAX_MON_MOVES]; u8 consideredMoveArray[MAX_MON_MOVES]; u8 numOfBestMoves; s32 i; RecordLastUsedMoveByTarget(); while (AI_THINKING_STRUCT->aiFlags != 0) { if (AI_THINKING_STRUCT->aiFlags & 1) { AI_THINKING_STRUCT->aiState = AIState_SettingUp; BattleAI_DoAIProcessing(); } AI_THINKING_STRUCT->aiFlags >>= 1; AI_THINKING_STRUCT->aiLogicId++; AI_THINKING_STRUCT->movesetIndex = 0; } // special flee or watch cases for safari. if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE) return AI_CHOICE_FLEE; if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH) return AI_CHOICE_WATCH; numOfBestMoves = 1; currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; consideredMoveArray[0] = 0; for (i = 1; i < MAX_MON_MOVES; i++) { if (currentMoveArray[0] < AI_THINKING_STRUCT->score[i]) { numOfBestMoves = 1; currentMoveArray[0] = AI_THINKING_STRUCT->score[i]; consideredMoveArray[0] = i; } if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i]) { currentMoveArray[numOfBestMoves] = AI_THINKING_STRUCT->score[i]; consideredMoveArray[numOfBestMoves++] = i; } } return consideredMoveArray[Random() % numOfBestMoves]; // break any ties that exist. } static void BattleAI_DoAIProcessing(void) { while (AI_THINKING_STRUCT->aiState != AIState_FinishedProcessing) { switch (AI_THINKING_STRUCT->aiState) { case AIState_DoNotProcess: // Needed to match. break; case AIState_SettingUp: sAIScriptPtr = gBattleAI_ScriptsTable[AI_THINKING_STRUCT->aiLogicId]; if (gBattleMons[gBattlerAttacker].pp[AI_THINKING_STRUCT->movesetIndex] == 0) { AI_THINKING_STRUCT->moveConsidered = 0; // Don't consider moves with no PP } else { AI_THINKING_STRUCT->moveConsidered = gBattleMons[gBattlerAttacker].moves[AI_THINKING_STRUCT->movesetIndex]; } AI_THINKING_STRUCT->aiState++; break; case AIState_Processing: if (AI_THINKING_STRUCT->moveConsidered != 0) { sBattleAICmdTable[*sAIScriptPtr](); // Run AI command. } else { AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; } if (AI_THINKING_STRUCT->aiAction & AI_ACTION_DONE) { AI_THINKING_STRUCT->movesetIndex++; if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && (AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK) == 0) AI_THINKING_STRUCT->aiState = AIState_SettingUp; // as long as their are more moves to process, keep setting this to setup state. else AI_THINKING_STRUCT->aiState++; // done processing. AI_THINKING_STRUCT->aiAction &= (AI_ACTION_FLEE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK | AI_ACTION_UNK5 | AI_ACTION_UNK6 | AI_ACTION_UNK7 | AI_ACTION_UNK8); // disable AI_ACTION_DONE. } break; } } } static void RecordLastUsedMoveByTarget(void) { s32 i; for (i = 0; i < 8; i++) { if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == 0) { BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] = gLastMoves[gBattlerTarget]; return; } } } // not used static void ClearBattlerMoveHistory(u8 battlerId) { s32 i; for (i = 0; i < 8; i++) BATTLE_HISTORY->usedMoves[battlerId / 2][i] = MOVE_NONE; } void RecordAbilityBattle(u8 battlerId, u8 abilityId) { if (GetBattlerSide(battlerId) == 0) BATTLE_HISTORY->abilities[GET_BATTLER_SIDE(battlerId)] = abilityId; } void RecordItemEffectBattle(u8 battlerId, u8 itemEffect) { if (GetBattlerSide(battlerId) == 0) BATTLE_HISTORY->itemEffects[GET_BATTLER_SIDE(battlerId)] = itemEffect; } static void Cmd_if_random_less_than(void) { if (Random() % 256 < sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_random_greater_than(void) { if (Random() % 256 > sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_random_equal(void) { if (Random() % 256 == sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_random_not_equal(void) { if (Random() % 256 != sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_score(void) { AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += sAIScriptPtr[1]; // add the result to the array of the move consider's score. if (AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] < 0) // if the score is negative, flatten it to 0. AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; sAIScriptPtr += 2; // AI return. } static void Cmd_if_hp_less_than(void) { u16 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) < sAIScriptPtr[2]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } static void Cmd_if_hp_more_than(void) { u16 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) > sAIScriptPtr[2]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } static void Cmd_if_hp_equal(void) { u16 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) == sAIScriptPtr[2]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } static void Cmd_if_hp_not_equal(void) { u16 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) != sAIScriptPtr[2]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } static void Cmd_if_status(void) { u16 battlerId; u32 status; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; status = T1_READ_32(sAIScriptPtr + 2); if (gBattleMons[battlerId].status1 & status) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } static void Cmd_if_not_status(void) { u16 battlerId; u32 status; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; status = T1_READ_32(sAIScriptPtr + 2); if (!(gBattleMons[battlerId].status1 & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } static void Cmd_if_status2(void) { u16 battlerId; u32 status; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; status = T1_READ_32(sAIScriptPtr + 2); if ((gBattleMons[battlerId].status2 & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } static void Cmd_if_not_status2(void) { u16 battlerId; u32 status; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; status = T1_READ_32(sAIScriptPtr + 2); if (!(gBattleMons[battlerId].status2 & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } static void Cmd_if_status3(void) { u16 battlerId; u32 status; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; status = T1_READ_32(sAIScriptPtr + 2); if (gStatuses3[battlerId] & status) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } static void Cmd_if_not_status3(void) { u16 battlerId; u32 status; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; status = T1_READ_32(sAIScriptPtr + 2); if (!(gStatuses3[battlerId] & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } static void Cmd_if_side_affecting(void) { u16 battlerId; u32 side, status; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; side = GET_BATTLER_SIDE(battlerId); status = T1_READ_32(sAIScriptPtr + 2); if (gSideStatuses[side] & status) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } static void Cmd_if_not_side_affecting(void) { u16 battlerId; u32 side, status; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; side = GET_BATTLER_SIDE(battlerId); status = T1_READ_32(sAIScriptPtr + 2); if (!(gSideStatuses[side] & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } static void Cmd_if_less_than(void) { if (AI_THINKING_STRUCT->funcResult < sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_more_than(void) { if (AI_THINKING_STRUCT->funcResult > sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_equal(void) { if (AI_THINKING_STRUCT->funcResult == sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_not_equal(void) { if (AI_THINKING_STRUCT->funcResult != sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_less_than_ptr(void) { const u8 *value = T1_READ_PTR(sAIScriptPtr + 1); if (AI_THINKING_STRUCT->funcResult < *value) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); else sAIScriptPtr += 9; } static void Cmd_if_more_than_ptr(void) { const u8 *value = T1_READ_PTR(sAIScriptPtr + 1); if (AI_THINKING_STRUCT->funcResult > *value) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); else sAIScriptPtr += 9; } static void Cmd_if_equal_ptr(void) { const u8 *value = T1_READ_PTR(sAIScriptPtr + 1); if (AI_THINKING_STRUCT->funcResult == *value) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); else sAIScriptPtr += 9; } static void Cmd_if_not_equal_ptr(void) { const u8 *value = T1_READ_PTR(sAIScriptPtr + 1); if (AI_THINKING_STRUCT->funcResult != *value) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); else sAIScriptPtr += 9; } static void Cmd_if_move(void) { u16 move = T1_READ_16(sAIScriptPtr + 1); if (AI_THINKING_STRUCT->moveConsidered == move) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } static void Cmd_if_not_move(void) { u16 move = T1_READ_16(sAIScriptPtr + 1); if (AI_THINKING_STRUCT->moveConsidered != move) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } static void Cmd_if_in_bytes(void) { const u8 *ptr = T1_READ_PTR(sAIScriptPtr + 1); while (*ptr != 0xFF) { if (AI_THINKING_STRUCT->funcResult == *ptr) { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); return; } ptr++; } sAIScriptPtr += 9; } static void Cmd_if_not_in_bytes(void) { const u8 *ptr = T1_READ_PTR(sAIScriptPtr + 1); while (*ptr != 0xFF) { if (AI_THINKING_STRUCT->funcResult == *ptr) { sAIScriptPtr += 9; return; } ptr++; } sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); } static void Cmd_if_in_hwords(void) { const u16 *ptr = (const u16 *)T1_READ_PTR(sAIScriptPtr + 1); while (*ptr != 0xFFFF) { if (AI_THINKING_STRUCT->funcResult == *ptr) { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); return; } ptr++; } sAIScriptPtr += 9; } static void Cmd_if_not_in_hwords(void) { const u16 *ptr = (const u16 *)T1_READ_PTR(sAIScriptPtr + 1); while (*ptr != 0xFFFF) { if (AI_THINKING_STRUCT->funcResult == *ptr) { sAIScriptPtr += 9; return; } ptr++; } sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); } static void Cmd_if_user_has_attacking_move(void) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].power != 0) break; } if (i == MAX_MON_MOVES) sAIScriptPtr += 5; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); } static void Cmd_if_user_has_no_attacking_moves(void) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].power != 0) break; } if (i != MAX_MON_MOVES) sAIScriptPtr += 5; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); } static void Cmd_get_turn_count(void) { AI_THINKING_STRUCT->funcResult = gBattleResults.battleTurnCounter; sAIScriptPtr += 1; } static void Cmd_get_type(void) { switch (sAIScriptPtr[1]) { case AI_TYPE1_USER: AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerAttacker].type1; break; case AI_TYPE1_TARGET: AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type1; break; case AI_TYPE2_USER: AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerAttacker].type2; break; case AI_TYPE2_TARGET: AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type2; break; case AI_TYPE_MOVE: if(gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == EFFECT_HIDDEN_POWER) { s32 typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0) | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1) | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2) | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3) | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4) | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5); u8 type = (15 * typeBits) / 63 + 1; if (type >= TYPE_MYSTERY) type++; type |= 0xC0; AI_THINKING_STRUCT->funcResult = type; } else AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type; break; } sAIScriptPtr += 2; } static void Cmd_get_considered_move_power(void) { if(gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == EFFECT_HIDDEN_POWER) { s32 powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1) | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0) | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1) | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2) | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3) | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4); AI_THINKING_STRUCT->funcResult = (40 * powerBits) / 63 + 30; } else AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power; sAIScriptPtr += 1; } static void Cmd_get_how_powerful_move_is(void) { s32 i, checkedMove; s32 moveDmgs[MAX_MON_MOVES]; for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i]) break; } if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1 && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) { gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) { for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) { if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i]) break; } if (gBattleMons[gBattlerAttacker].moves[checkedMove] != MOVE_NONE && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF && gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].power > 1) { gCurrentMove = gBattleMons[gBattlerAttacker].moves[checkedMove]; AI_CalcDmg(gBattlerAttacker, gBattlerTarget); TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100; if (moveDmgs[checkedMove] == 0) moveDmgs[checkedMove] = 1; } else if(gBattleMons[gBattlerAttacker].moves[checkedMove] != MOVE_NONE && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF && gBattleMons[gBattlerAttacker].moves[checkedMove] == MOVE_HIDDEN_POWER) { gCurrentMove = gBattleMons[gBattlerAttacker].moves[checkedMove]; AI_CalcDmg(gBattlerAttacker, gBattlerTarget); TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100; if (moveDmgs[checkedMove] == 0) moveDmgs[checkedMove] = 1; } else { moveDmgs[checkedMove] = 0; } } for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) { if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex]) break; } if (checkedMove == MAX_MON_MOVES) AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful. else AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful. } else { AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // Highly discouraged in terms of power. } sAIScriptPtr++; } static void Cmd_get_last_used_battler_move(void) { if (sAIScriptPtr[1] == AI_USER) AI_THINKING_STRUCT->funcResult = gLastMoves[gBattlerAttacker]; else AI_THINKING_STRUCT->funcResult = gLastMoves[gBattlerTarget]; sAIScriptPtr += 2; } static void Cmd_if_equal_(void) // Same as if_equal. { if (sAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_not_equal_(void) // Same as if_not_equal. { if (sAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_would_go_first(void) { if (GetWhoStrikesFirst(gBattlerAttacker, gBattlerTarget, TRUE) == sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_would_not_go_first(void) { if (GetWhoStrikesFirst(gBattlerAttacker, gBattlerTarget, TRUE) != sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_nullsub_2A(void) { } static void Cmd_nullsub_2B(void) { } static void Cmd_count_alive_pokemon(void) { u8 battlerId; u8 battlerOnField1, battlerOnField2; struct Pokemon *party; s32 i; AI_THINKING_STRUCT->funcResult = 0; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { u32 position; battlerOnField1 = gBattlerPartyIndexes[battlerId]; position = GetBattlerPosition(battlerId) ^ BIT_FLANK; battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)]; } else // In singles there's only one battlerId by side. { battlerOnField1 = gBattlerPartyIndexes[battlerId]; battlerOnField2 = gBattlerPartyIndexes[battlerId]; } for (i = 0; i < PARTY_SIZE; i++) { if (i != battlerOnField1 && i != battlerOnField2 && GetMonData(&party[i], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG) { AI_THINKING_STRUCT->funcResult++; } } sAIScriptPtr += 2; } static void Cmd_get_considered_move(void) { AI_THINKING_STRUCT->funcResult = AI_THINKING_STRUCT->moveConsidered; sAIScriptPtr += 1; } static void Cmd_get_considered_move_effect(void) { AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect; sAIScriptPtr += 1; } static void Cmd_get_ability(void) { u8 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if (GetBattlerSide(battlerId) == AI_TARGET) { u16 side = GET_BATTLER_SIDE(battlerId); if (BATTLE_HISTORY->abilities[side] != 0) { AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[side]; sAIScriptPtr += 2; return; } // abilities that prevent fleeing. if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP) { AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability; sAIScriptPtr += 2; return; } if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE) { if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE) { // AI has no knowledge of opponent, so it guesses which ability. if (Random() % 2) AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[0]; else AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1]; } else { AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[0]; } } else { // AI can't actually reach this part since no pokemon has ability 2 and no ability 1. AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1]; } } else { // The AI knows its own ability. AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability; } sAIScriptPtr += 2; } static void Cmd_get_highest_type_effectiveness(void) { s32 i; u8 *dynamicMoveType; gDynamicBasePower = 0; dynamicMoveType = &gBattleStruct->dynamicMoveType; *dynamicMoveType = 0; gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; AI_THINKING_STRUCT->funcResult = 0; for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMoveDamage = 40; gCurrentMove = gBattleMons[gBattlerAttacker].moves[i]; if (gCurrentMove != MOVE_NONE) { TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); if (gBattleMoveDamage == 120) // Super effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x2; if (gBattleMoveDamage == 240) gBattleMoveDamage = AI_EFFECTIVENESS_x4; if (gBattleMoveDamage == 30) // Not very effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x0_5; if (gBattleMoveDamage == 15) gBattleMoveDamage = AI_EFFECTIVENESS_x0_25; if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) gBattleMoveDamage = AI_EFFECTIVENESS_x0; if (AI_THINKING_STRUCT->funcResult < gBattleMoveDamage) AI_THINKING_STRUCT->funcResult = gBattleMoveDamage; } } sAIScriptPtr += 1; } static void Cmd_if_type_effectiveness(void) { u8 damageVar; gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; gBattleMoveDamage = AI_EFFECTIVENESS_x1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); if (gBattleMoveDamage == 120) // Super effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x2; if (gBattleMoveDamage == 240) gBattleMoveDamage = AI_EFFECTIVENESS_x4; if (gBattleMoveDamage == 30) // Not very effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x0_5; if (gBattleMoveDamage == 15) gBattleMoveDamage = AI_EFFECTIVENESS_x0_25; if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) gBattleMoveDamage = AI_EFFECTIVENESS_x0; // Store gBattleMoveDamage in a u8 variable because sAIScriptPtr[1] is a u8. damageVar = gBattleMoveDamage; if (damageVar == sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_nullsub_32(void) { } static void Cmd_nullsub_33(void) { } static void Cmd_if_status_in_party(void) { struct Pokemon *party; struct Pokemon *partyPtr; int i; u32 statusToCompareTo; // u8 battlerId // for whatever reason, game freak put the party pointer into 2 variables instead of 1 // it's possible at some point the switch encompassed the whole function and used each respective variable creating largely duplicate code. switch (sAIScriptPtr[1]) { case 1: party = partyPtr = gEnemyParty; break; default: party = partyPtr = gPlayerParty; break; } /* Emerald's fixed version below switch (sAIScriptPtr[1]) { case AI_USER: battlerId = gBattlerAttacker; break; default: battlerId = gBattlerTarget; break; } party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; */ statusToCompareTo = T1_READ_32(sAIScriptPtr + 2); for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES); u16 hp = GetMonData(&party[i], MON_DATA_HP); u32 status = GetMonData(&party[i], MON_DATA_STATUS); if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); return; } } sAIScriptPtr += 10; } // bugged, doesnt return properly. also unused static void Cmd_if_status_not_in_party(void) { struct Pokemon *party; struct Pokemon *partyPtr; int i; u32 statusToCompareTo; //u8 battlerId switch (sAIScriptPtr[1]) { case 1: party = partyPtr = gEnemyParty; break; default: party = partyPtr = gPlayerParty; break; } statusToCompareTo = T1_READ_32(sAIScriptPtr + 2); for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES); u16 hp = GetMonData(&party[i], MON_DATA_HP); u32 status = GetMonData(&party[i], MON_DATA_STATUS); // everytime the status is found, the AI's logic jumps further and further past its intended destination. this results in a broken AI macro and is probably why it is unused. if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) { sAIScriptPtr += 10; // doesnt return? #ifdef UBFIX return; #endif } } sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); } enum { WEATHER_TYPE_SUNNY, WEATHER_TYPE_RAIN, WEATHER_TYPE_SANDSTORM, WEATHER_TYPE_HAIL, }; extern u16 gBattleWeather; static void Cmd_get_weather(void) { if (gBattleWeather & B_WEATHER_RAIN) AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_RAIN; if (gBattleWeather & B_WEATHER_SANDSTORM) AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SANDSTORM; if (gBattleWeather & B_WEATHER_SUN) AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SUNNY; if (gBattleWeather & B_WEATHER_HAIL_TEMPORARY) AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_HAIL; sAIScriptPtr += 1; } static void Cmd_if_effect(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_not_effect(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; } static void Cmd_if_stat_level_less_than(void) { u32 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] < sAIScriptPtr[3]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); else sAIScriptPtr += 8; } static void Cmd_if_stat_level_more_than(void) { u32 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] > sAIScriptPtr[3]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); else sAIScriptPtr += 8; } static void Cmd_if_stat_level_equal(void) { u32 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] == sAIScriptPtr[3]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); else sAIScriptPtr += 8; } static void Cmd_if_stat_level_not_equal(void) { u32 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] != sAIScriptPtr[3]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); else sAIScriptPtr += 8; } static void Cmd_if_can_faint(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) { sAIScriptPtr += 5; return; } gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; AI_CalcDmg(gBattlerAttacker, gBattlerTarget); TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; // Moves always do at least 1 damage. if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if (gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); else sAIScriptPtr += 5; } static void Cmd_if_cant_faint(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) { sAIScriptPtr += 5; return; } gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; AI_CalcDmg(gBattlerAttacker, gBattlerTarget); TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; // This macro is missing the damage 0 = 1 assumption. if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); else sAIScriptPtr += 5; } static void Cmd_if_has_move(void) { int i; const u16 *movePtr = (u16 *)(sAIScriptPtr + 2); switch (sAIScriptPtr[1]) { case AI_USER: case AI_USER_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] == *movePtr) break; } if (i == MAX_MON_MOVES) sAIScriptPtr += 8; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); break; case AI_TARGET: case AI_TARGET_PARTNER: for (i = 0; i < 8; i++) { if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == *movePtr) break; } if (i == 8) sAIScriptPtr += 8; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); break; } } static void Cmd_if_doesnt_have_move(void) { int i; const u16 *movePtr = (u16 *)(sAIScriptPtr + 2); switch (sAIScriptPtr[1]) { case AI_USER: case AI_USER_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] == *movePtr) break; } if (i != MAX_MON_MOVES) sAIScriptPtr += 8; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); break; case AI_TARGET: case AI_TARGET_PARTNER: for (i = 0; i < 8; i++) { if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == *movePtr) break; } if (i != 8) sAIScriptPtr += 8; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); break; } } static void Cmd_if_has_move_with_effect(void) { int i; switch (sAIScriptPtr[1]) { case AI_USER: case AI_USER_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].effect == sAIScriptPtr[2]) break; } if (i != MAX_MON_MOVES) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; break; case AI_TARGET: case AI_TARGET_PARTNER: for (i = 0; i < 8; i++) { if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i]].effect == sAIScriptPtr[2]) break; } sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); } } static void Cmd_if_doesnt_have_move_with_effect(void) { int i; switch (sAIScriptPtr[1]) { case AI_USER: case AI_USER_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].effect == sAIScriptPtr[2]) break; } if (i != MAX_MON_MOVES) sAIScriptPtr += 7; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); break; case AI_TARGET: case AI_TARGET_PARTNER: for (i = 0; i < 8; i++) { if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i]].effect == sAIScriptPtr[2]) break; } sAIScriptPtr += 7; } } static void Cmd_if_any_move_disabled_or_encored(void) { u8 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if (sAIScriptPtr[2] == 0) { if (gDisableStructs[battlerId].disabledMove == MOVE_NONE) sAIScriptPtr += 7; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); } else if (sAIScriptPtr[2] != 1) { sAIScriptPtr += 7; } else { if (gDisableStructs[battlerId].encoredMove != MOVE_NONE) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } } static void Cmd_if_curr_move_disabled_or_encored(void) { switch (sAIScriptPtr[1]) { case 0: if (gDisableStructs[gActiveBattler].disabledMove == AI_THINKING_STRUCT->moveConsidered) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; break; case 1: if (gDisableStructs[gActiveBattler].encoredMove == AI_THINKING_STRUCT->moveConsidered) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); else sAIScriptPtr += 6; break; default: sAIScriptPtr += 6; break; } } static void Cmd_flee(void) { AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_FLEE being enabled. } static void Cmd_if_random_safari_flee(void) { u8 safariFleeRate; if (gBattleStruct->safariRockThrowCounter) { safariFleeRate = gBattleStruct->safariEscapeFactor * 2; if (safariFleeRate > 20) safariFleeRate = 20; } else if (gBattleStruct->safariBaitThrowCounter != 0) { safariFleeRate = gBattleStruct->safariEscapeFactor / 4; if (safariFleeRate == 0) safariFleeRate = 1; } else safariFleeRate = gBattleStruct->safariEscapeFactor; safariFleeRate *= 5; if ((u8)(Random() % 100) < safariFleeRate) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); else sAIScriptPtr += 5; } static void Cmd_watch(void) { AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_WATCH being enabled. } static void Cmd_get_hold_effect(void) { u8 battlerId; u16 side; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { side = GET_BATTLER_SIDE(battlerId); AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->itemEffects[side]; } else AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battlerId].item); sAIScriptPtr += 2; } static void Cmd_get_gender(void) { u8 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[battlerId].species, gBattleMons[battlerId].personality); sAIScriptPtr += 2; } static void Cmd_is_first_turn_for(void) { u8 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].isFirstTurn; sAIScriptPtr += 2; } static void Cmd_get_stockpile_count(void) { u8 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].stockpileCounter; sAIScriptPtr += 2; } static void Cmd_is_double_battle(void) { AI_THINKING_STRUCT->funcResult = gBattleTypeFlags & BATTLE_TYPE_DOUBLE; sAIScriptPtr += 1; } static void Cmd_get_used_held_item(void) { u8 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; AI_THINKING_STRUCT->funcResult = ((u8 *)gBattleStruct->usedHeldItems)[battlerId * 2]; sAIScriptPtr += 2; } static void Cmd_get_move_type_from_result(void) { if(gBattleMoves[AI_THINKING_STRUCT->funcResult].effect == EFFECT_HIDDEN_POWER) { s32 typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0) | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1) | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2) | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3) | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4) | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5); u8 type = (15 * typeBits) / 63 + 1; if (type >= TYPE_MYSTERY) type++; type |= 0xC0; AI_THINKING_STRUCT->funcResult = type; } else AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].type; sAIScriptPtr += 1; } static void Cmd_get_move_power_from_result(void) { if(gBattleMoves[AI_THINKING_STRUCT->funcResult].effect == EFFECT_HIDDEN_POWER) { s32 powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1) | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0) | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1) | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2) | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3) | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4); AI_THINKING_STRUCT->funcResult = (40 * powerBits) / 63 + 30; } else AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].power; sAIScriptPtr += 1; } static void Cmd_get_move_effect_from_result(void) { AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].effect; sAIScriptPtr += 1; } static void Cmd_get_protect_count(void) { u8 battlerId; if (sAIScriptPtr[1] == AI_USER) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].protectUses; sAIScriptPtr += 2; } static void Cmd_nullsub_52(void) { } static void Cmd_nullsub_53(void) { } static void Cmd_nullsub_54(void) { } static void Cmd_nullsub_55(void) { } static void Cmd_nullsub_56(void) { } static void Cmd_nullsub_57(void) { } static void Cmd_call(void) { AIStackPushVar(sAIScriptPtr + 5); sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); } static void Cmd_goto(void) { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); } static void Cmd_end(void) { if (AIStackPop() == FALSE) AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; } static void Cmd_if_level_compare(void) { switch (sAIScriptPtr[1]) { case 0: // greater than if (gBattleMons[gBattlerAttacker].level > gBattleMons[gBattlerTarget].level) { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); return; } sAIScriptPtr += 6; return; case 1: // less than if (gBattleMons[gBattlerAttacker].level < gBattleMons[gBattlerTarget].level) { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); return; } sAIScriptPtr += 6; return; case 2: // equal if (gBattleMons[gBattlerAttacker].level == gBattleMons[gBattlerTarget].level) { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); return; } sAIScriptPtr += 6; return; } } static void Cmd_if_target_taunted(void) { if (gDisableStructs[gBattlerTarget].tauntTimer != 0) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); else sAIScriptPtr += 5; } static void Cmd_if_target_not_taunted(void) { if (gDisableStructs[gBattlerTarget].tauntTimer == 0) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); else sAIScriptPtr += 5; } static void AIStackPushVar(const u8 *var) { gBattleResources->AI_ScriptsStack->ptr[gBattleResources->AI_ScriptsStack->size++] = var; } // unused static void AIStackPushVar_cursor(void) { gBattleResources->AI_ScriptsStack->ptr[gBattleResources->AI_ScriptsStack->size++] = sAIScriptPtr; } static bool8 AIStackPop(void) { if (gBattleResources->AI_ScriptsStack->size != 0) { --gBattleResources->AI_ScriptsStack->size; sAIScriptPtr = gBattleResources->AI_ScriptsStack->ptr[gBattleResources->AI_ScriptsStack->size]; return TRUE; } else return FALSE; } ================================================ FILE: src/battle_ai_switch_items.c ================================================ #include "global.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "random.h" #include "util.h" #include "constants/abilities.h" #include "constants/item_effects.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/pokemon.h" static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng); static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent); static bool8 ShouldUseItem(void); static bool8 ShouldSwitchIfPerishSong(void) { if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG && gDisableStructs[gActiveBattler].perishSongTimer == 0) { *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } else { return FALSE; } } static bool8 ShouldSwitchIfWonderGuard(void) { u8 opposingBattler; u8 moveFlags; s32 i, j; u16 move; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) return FALSE; if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability == ABILITY_WONDER_GUARD) { // Check if Pokemon has a super effective move. for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), i = 0; i < MAX_MON_MOVES; ++i) { move = gBattleMons[gActiveBattler].moves[i]; if (move == MOVE_NONE) continue; moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) return FALSE; } // Find a Pokemon in the party that has a super effective move. for (i = 0; i < PARTY_SIZE; ++i) { if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0 || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG || i == gBattlerPartyIndexes[gActiveBattler]) continue; GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // Unused return value. GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM); // Unused return value. for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), j = 0; j < MAX_MON_MOVES; ++j) { move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); if (move == MOVE_NONE) continue; moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2) { // We found a mon. *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = i; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } } } } return FALSE; // There is not a single Pokemon in the party that has a super effective move against a mon with Wonder Guard. } static bool8 FindMonThatAbsorbsOpponentsMove(void) { u8 battlerIn1, battlerIn2; u8 absorbingTypeAbility; s32 i; if ((HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3) || (gLastLandedMoves[gActiveBattler] == MOVE_NONE)) return FALSE; if (gLastLandedMoves[gActiveBattler] == 0xFFFF || gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { battlerIn1 = gActiveBattler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))]) battlerIn2 = gActiveBattler; else battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); } else { battlerIn1 = gActiveBattler; battlerIn2 = gActiveBattler; } if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_FIRE) absorbingTypeAbility = ABILITY_FLASH_FIRE; else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_WATER) absorbingTypeAbility = ABILITY_WATER_ABSORB; else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_ELECTRIC) absorbingTypeAbility = ABILITY_VOLT_ABSORB; else return FALSE; if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility) return FALSE; for (i = 0; i < PARTY_SIZE; ++i) { u16 species; u8 monAbility; if ((GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) || (i == gBattlerPartyIndexes[battlerIn1]) || (i == gBattlerPartyIndexes[battlerIn2]) || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2))) continue; species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); if (GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM) != ABILITY_NONE) monAbility = gSpeciesInfo[species].abilities[1]; else monAbility = gSpeciesInfo[species].abilities[0]; if (absorbingTypeAbility == monAbility && Random() & 1) { // we found a mon *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = i; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } } return FALSE; } static bool8 ShouldSwitchIfNaturalCure(void) { if (!(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) || (gBattleMons[gActiveBattler].ability != ABILITY_NATURAL_CURE) || (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 2)) return FALSE; if ((gLastLandedMoves[gActiveBattler] == MOVE_NONE || gLastLandedMoves[gActiveBattler] == 0xFFFF) && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 1) || FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 1)) return TRUE; if (Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } return FALSE; } static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) { u8 opposingBattler; s32 i; u8 moveFlags; u16 move; opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) { for (i = 0; i < MAX_MON_MOVES; ++i) { move = gBattleMons[gActiveBattler].moves[i]; if (move == MOVE_NONE) continue; moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) { if (noRng || (Random() % 10)) return TRUE; } } } if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) return FALSE; opposingBattler = GetBattlerAtPosition(BATTLE_PARTNER(B_POSITION_PLAYER_LEFT)); if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) { for (i = 0; i < MAX_MON_MOVES; ++i) { move = gBattleMons[gActiveBattler].moves[i]; if (move == MOVE_NONE) continue; moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) { if (noRng) return TRUE; if (Random() % 10 != 0) return TRUE; } } } return FALSE; } static bool8 AreStatsRaised(void) { u8 buffedStatsValue = 0; s32 i; for (i = 0; i < NUM_BATTLE_STATS; ++i) { if (gBattleMons[gActiveBattler].statStages[i] > 6) buffedStatsValue += gBattleMons[gActiveBattler].statStages[i] - 6; } return (buffedStatsValue > 3); } static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) { u8 battlerIn1, battlerIn2; s32 i, j; u16 move; u8 moveFlags; if (gLastLandedMoves[gActiveBattler] == 0) return FALSE; if ((gLastLandedMoves[gActiveBattler] == 0xFFFF) || (gLastHitBy[gActiveBattler] == 0xFF) || (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0)) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { battlerIn1 = gActiveBattler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))]) battlerIn2 = gActiveBattler; else battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); } else { battlerIn1 = gActiveBattler; battlerIn2 = gActiveBattler; } for (i = 0; i < PARTY_SIZE; ++i) { u16 species; u8 monAbility; if ((GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) || (i == gBattlerPartyIndexes[battlerIn1]) || (i == gBattlerPartyIndexes[battlerIn2]) || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2))) continue; species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); if (GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM) != ABILITY_NONE) monAbility = gSpeciesInfo[species].abilities[1]; else monAbility = gSpeciesInfo[species].abilities[0]; moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility); if (moveFlags & flags) { battlerIn1 = gLastHitBy[gActiveBattler]; for (j = 0; j < MAX_MON_MOVES; ++j) { move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); if (move == MOVE_NONE) continue; moveFlags = AI_TypeCalc(move, gBattleMons[battlerIn1].species, gBattleMons[battlerIn1].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0) { *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = i; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } } } } return FALSE; } static bool8 ShouldSwitch(void) { u8 battlerIn1, battlerIn2; s32 i; s32 availableToSwitch; if ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) || (gStatuses3[gActiveBattler] & STATUS3_ROOTED) || AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_SHADOW_TAG, 0, 0) || AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_ARENA_TRAP, 0, 0)) return FALSE; // misses the flying or levitate check if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0)) if ((gBattleMons[gActiveBattler].type1 == TYPE_STEEL) || (gBattleMons[gActiveBattler].type2 == TYPE_STEEL)) return FALSE; availableToSwitch = 0; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { battlerIn1 = gActiveBattler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) battlerIn2 = gActiveBattler; else battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); } else { battlerIn2 = gActiveBattler; battlerIn1 = gActiveBattler; } for (i = 0; i < PARTY_SIZE; ++i) { if ((GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) || (i == gBattlerPartyIndexes[battlerIn1]) || (i == gBattlerPartyIndexes[battlerIn2]) || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2))) continue; ++availableToSwitch; } if (!availableToSwitch) return FALSE; if (ShouldSwitchIfPerishSong() || ShouldSwitchIfWonderGuard() || FindMonThatAbsorbsOpponentsMove() || ShouldSwitchIfNaturalCure()) return TRUE; if (HasSuperEffectiveMoveAgainstOpponents(FALSE) || AreStatsRaised()) return FALSE; if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 2) || FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 3)) return TRUE; return FALSE; } void AI_TrySwitchOrUseItem(void) { u8 battlerIn1, battlerIn2; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { if (ShouldSwitch()) { if (*(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) == 6) { s32 monToSwitchId = GetMostSuitableMonToSwitchInto(); if (monToSwitchId == 6) { if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battlerIn2 = battlerIn1; } else { battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } for (monToSwitchId = 0; monToSwitchId < PARTY_SIZE; ++monToSwitchId) { if ((!GetMonData(&gEnemyParty[monToSwitchId], MON_DATA_HP) == 0) && (monToSwitchId != gBattlerPartyIndexes[battlerIn1]) && (monToSwitchId != gBattlerPartyIndexes[battlerIn2]) && (monToSwitchId != *(gBattleStruct->monToSwitchIntoId + battlerIn1)) && (monToSwitchId != *(gBattleStruct->monToSwitchIntoId + battlerIn2))) break; } } *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = monToSwitchId; } *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)); return; } else if (ShouldUseItem()) { return; } } BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, (gActiveBattler ^ BIT_SIDE) << 8); } static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var) { s32 i = 0; while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) { if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) { i += 3; continue; } else if (TYPE_EFFECT_ATK_TYPE(i) == atkType) { // Check type1. if (TYPE_EFFECT_DEF_TYPE(i) == defType1) *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; // Check type2. if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2) *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; } i += 3; } } u8 GetMostSuitableMonToSwitchInto(void) { u8 opposingBattler; u8 bestDmg; // Note : should be changed to u32 for obvious reasons. u8 bestMonId; u8 battlerIn1, battlerIn2; s32 i, j; u8 invalidMons; u16 move; if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != PARTY_SIZE) return *(gBattleStruct->monToSwitchIntoId + gActiveBattler); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { battlerIn1 = gActiveBattler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) battlerIn2 = gActiveBattler; else battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); // UB: It considers the opponent only player's side even though it can battle alongside player. opposingBattler = Random() & BIT_FLANK; if (gAbsentBattlerFlags & gBitTable[opposingBattler]) opposingBattler ^= BIT_FLANK; } else { opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); battlerIn1 = gActiveBattler; battlerIn2 = gActiveBattler; } invalidMons = 0; while (invalidMons != 0x3F) // All mons are invalid. { bestDmg = 0; bestMonId = 6; // Find the mon whose type is the most suitable offensively. for (i = 0; i < PARTY_SIZE; ++i) { u16 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); if (species != SPECIES_NONE && GetMonData(&gEnemyParty[i], MON_DATA_HP) != 0 && !(gBitTable[i] & invalidMons) && gBattlerPartyIndexes[battlerIn1] != i && gBattlerPartyIndexes[battlerIn2] != i && i != *(gBattleStruct->monToSwitchIntoId + battlerIn1) && i != *(gBattleStruct->monToSwitchIntoId + battlerIn2)) { u8 type1 = gSpeciesInfo[species].types[0]; u8 type2 = gSpeciesInfo[species].types[1]; u8 typeDmg = 10; ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type1, type1, type2, &typeDmg); ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type2, type1, type2, &typeDmg); if (bestDmg < typeDmg) { bestDmg = typeDmg; bestMonId = i; } } else { invalidMons |= gBitTable[i]; } } // Ok, we know the mon has the right typing but does it have at least one super effective move? if (bestMonId != PARTY_SIZE) { for (i = 0; i < MAX_MON_MOVES; ++i) { move = GetMonData(&gEnemyParty[bestMonId], MON_DATA_MOVE1 + i); if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE) break; } if (i != MAX_MON_MOVES) return bestMonId; // Has both the typing and at least one super effective move. invalidMons |= gBitTable[bestMonId]; // Sorry buddy, we want something better. } else { invalidMons = 0x3F; // No viable mon to switch. } } gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; bestDmg = 0; bestMonId = 6; // If we couldn't find the best mon in terms of typing, find the one that deals most damage. for (i = 0; i < PARTY_SIZE; ++i) { if (((u16)(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES)) == SPECIES_NONE) || (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) || (gBattlerPartyIndexes[battlerIn1] == i) || (gBattlerPartyIndexes[battlerIn2] == i) || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2))) continue; for (j = 0; j < MAX_MON_MOVES; ++j) { move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); gBattleMoveDamage = 0; if (move != MOVE_NONE && gBattleMoves[move].power != 1) { AI_CalcDmg(gActiveBattler, opposingBattler); TypeCalc(move, gActiveBattler, opposingBattler); } if (bestDmg < gBattleMoveDamage) { bestDmg = gBattleMoveDamage; bestMonId = i; } } } return bestMonId; } static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument { if (itemId == ITEM_FULL_RESTORE) return AI_ITEM_FULL_RESTORE; else if (itemEffect[4] & ITEM4_HEAL_HP) return AI_ITEM_HEAL_HP; else if (itemEffect[3] & ITEM3_STATUS_ALL) return AI_ITEM_CURE_CONDITION; else if (itemEffect[0] & (ITEM0_DIRE_HIT | ITEM0_X_ATTACK) || itemEffect[1] != 0 || itemEffect[2] != 0) return AI_ITEM_X_STAT; else if (itemEffect[3] & ITEM3_GUARD_SPEC) return AI_ITEM_GUARD_SPECS; else return AI_ITEM_NOT_RECOGNIZABLE; } static bool8 ShouldUseItem(void) { s32 i; u8 validMons = 0; bool8 shouldUse = FALSE; for (i = 0; i < PARTY_SIZE; ++i) if (GetMonData(&gEnemyParty[i], MON_DATA_HP) != 0 && GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE && GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG) ++validMons; for (i = 0; i < MAX_TRAINER_ITEMS; ++i) { u16 item; const u8 *itemEffects; u8 paramOffset; u8 battlerSide; if (i && validMons > (gBattleResources->battleHistory->itemsNo - i) + 1) continue; item = gBattleResources->battleHistory->trainerItems[i]; if (item == ITEM_NONE || gItemEffectTable[item - ITEM_POTION] == NULL) continue; if (item == ITEM_ENIGMA_BERRY) itemEffects = gSaveBlock1Ptr->enigmaBerry.itemEffect; else itemEffects = gItemEffectTable[item - ITEM_POTION]; *(gBattleStruct->AI_itemType + gActiveBattler / 2) = GetAI_ItemType(item, itemEffects); switch (*(gBattleStruct->AI_itemType + gActiveBattler / 2)) { case AI_ITEM_FULL_RESTORE: if (gBattleMons[gActiveBattler].hp >= gBattleMons[gActiveBattler].maxHP / 4) break; if (gBattleMons[gActiveBattler].hp == 0) break; shouldUse = TRUE; break; case AI_ITEM_HEAL_HP: paramOffset = GetItemEffectParamOffset(item, 4, 4); if (paramOffset == 0 || gBattleMons[gActiveBattler].hp == 0) break; if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 4 || gBattleMons[gActiveBattler].maxHP - gBattleMons[gActiveBattler].hp > itemEffects[paramOffset]) shouldUse = TRUE; break; case AI_ITEM_CURE_CONDITION: *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0; if (itemEffects[3] & ITEM3_SLEEP && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) { *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20; shouldUse = TRUE; } if (itemEffects[3] & ITEM3_POISON && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON)) { *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x10; shouldUse = TRUE; } if (itemEffects[3] & ITEM3_BURN && gBattleMons[gActiveBattler].status1 & STATUS1_BURN) { *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8; shouldUse = TRUE; } if (itemEffects[3] & ITEM3_FREEZE && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE) { *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4; shouldUse = TRUE; } if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS) { *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2; shouldUse = TRUE; } if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) { *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1; shouldUse = TRUE; } break; case AI_ITEM_X_STAT: *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0; if (!gDisableStructs[gActiveBattler].isFirstTurn) break; if (itemEffects[0] & ITEM0_X_ATTACK) *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1; if (itemEffects[1] & ITEM1_X_DEFEND) *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2; if (itemEffects[1] & ITEM1_X_SPEED) *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4; if (itemEffects[2] & ITEM2_X_SPATK) *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8; if (itemEffects[2] & ITEM2_X_ACCURACY) *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20; if (itemEffects[0] & ITEM0_DIRE_HIT) *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x80; shouldUse = TRUE; break; case AI_ITEM_GUARD_SPECS: battlerSide = GetBattlerSide(gActiveBattler); if (gDisableStructs[gActiveBattler].isFirstTurn && gSideTimers[battlerSide].mistTimer == 0) shouldUse = TRUE; break; case AI_ITEM_NOT_RECOGNIZABLE: return FALSE; } if (shouldUse) { BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0); *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item; gBattleResources->battleHistory->trainerItems[i] = 0; return shouldUse; } } return FALSE; } ================================================ FILE: src/battle_anim.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_bg.h" #include "decompress.h" #include "graphics.h" #include "m4a.h" #include "task.h" #include "constants/battle_anim.h" /* This file handles the commands for the macros defined in battle_anim_script.inc and used in battle_anim_scripts.s */ #define ANIM_SPRITE_INDEX_COUNT 8 EWRAM_DATA static const u8 *sBattleAnimScriptPtr = NULL; EWRAM_DATA static const u8 *sBattleAnimScriptRetAddr = NULL; EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; EWRAM_DATA static s8 sAnimFramesToWait = 0; EWRAM_DATA bool8 gAnimScriptActive = FALSE; EWRAM_DATA u8 gAnimVisualTaskCount = 0; EWRAM_DATA u8 gAnimSoundTaskCount = 0; EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL; EWRAM_DATA s32 gAnimMoveDmg = 0; EWRAM_DATA u16 gAnimMovePower = 0; EWRAM_DATA static u16 sAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0}; EWRAM_DATA u8 gAnimFriendship = 0; EWRAM_DATA u16 gWeatherMoveAnim = 0; EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0}; EWRAM_DATA static u16 sSoundAnimFramesToWait = 0; EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0}; EWRAM_DATA u8 gAnimMoveTurn = 0; EWRAM_DATA static u8 sAnimBackgroundFadeState = 0; EWRAM_DATA static u16 sAnimMoveIndex = 0; // Set but unused. EWRAM_DATA u8 gBattleAnimAttacker = 0; EWRAM_DATA u8 gBattleAnimTarget = 0; EWRAM_DATA u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gAnimCustomPanning = 0; static void AddSpriteIndex(u16 index); static void ClearSpriteIndex(u16 index); static void WaitAnimFrameCount(void); static void RunAnimScriptCommand(void); static void Task_ClearMonBgStatic(u8 taskId); static void Task_FadeToBg(u8 taskId); static void Task_PanFromInitialToTarget(u8 taskId); static void Task_InitUpdateMonBg(u8 taskId); static void LoadMoveBg(u16 bgId); static void LoadDefaultBg(void); static void Task_LoopAndPlaySE(u8 taskId); static void Task_WaitAndPlaySE(u8 taskId); static void Task_ClearMonBg(u8 taskId); static void Cmd_loadspritegfx(void); static void Cmd_unloadspritegfx(void); static void Cmd_createsprite(void); static void Cmd_createvisualtask(void); static void Cmd_delay(void); static void Cmd_waitforvisualfinish(void); static void Cmd_nop(void); static void Cmd_nop2(void); static void Cmd_end(void); static void Cmd_playse(void); static void Cmd_monbg(void); static void Cmd_clearmonbg(void); static void Cmd_setalpha(void); static void Cmd_blendoff(void); static void Cmd_call(void); static void Cmd_return(void); static void Cmd_setarg(void); static void Cmd_choosetwoturnanim(void); static void Cmd_jumpifmoveturn(void); static void Cmd_goto(void); static void Cmd_fadetobg(void); static void Cmd_restorebg(void); static void Cmd_waitbgfadeout(void); static void Cmd_waitbgfadein(void); static void Cmd_changebg(void); static void Cmd_playsewithpan(void); static void Cmd_setpan(void); static void Cmd_panse(void); static void Cmd_loopsewithpan(void); static void Cmd_waitplaysewithpan(void); static void Cmd_setbldcnt(void); static void Cmd_createsoundtask(void); static void Cmd_waitsound(void); static void Cmd_jumpargeq(void); static void Cmd_monbg_static(void); static void Cmd_clearmonbg_static(void); static void Cmd_jumpifcontest(void); static void Cmd_fadetobgfromset(void); static void Cmd_panse_adjustnone(void); static void Cmd_panse_adjustall(void); static void Cmd_splitbgprio(void); static void Cmd_splitbgprio_all(void); static void Cmd_splitbgprio_foes(void); static void Cmd_invisible(void); static void Cmd_visible(void); static void Cmd_teamattack_moveback(void); static void Cmd_teamattack_movefwd(void); static void Cmd_stopsound(void); #include "data/battle_anim.h" static void (*const sScriptCmdTable[])(void) = { Cmd_loadspritegfx, // 0x00 Cmd_unloadspritegfx, // 0x01 Cmd_createsprite, // 0x02 Cmd_createvisualtask, // 0x03 Cmd_delay, // 0x04 Cmd_waitforvisualfinish, // 0x05 Cmd_nop, // 0x06 Cmd_nop2, // 0x07 Cmd_end, // 0x08 Cmd_playse, // 0x09 Cmd_monbg, // 0x0A Cmd_clearmonbg, // 0x0B Cmd_setalpha, // 0x0C Cmd_blendoff, // 0x0D Cmd_call, // 0x0E Cmd_return, // 0x0F Cmd_setarg, // 0x10 Cmd_choosetwoturnanim, // 0x11 Cmd_jumpifmoveturn, // 0x12 Cmd_goto, // 0x13 Cmd_fadetobg, // 0x14 Cmd_restorebg, // 0x15 Cmd_waitbgfadeout, // 0x16 Cmd_waitbgfadein, // 0x17 Cmd_changebg, // 0x18 Cmd_playsewithpan, // 0x19 Cmd_setpan, // 0x1A Cmd_panse, // 0x1B Cmd_loopsewithpan, // 0x1C Cmd_waitplaysewithpan, // 0x1D Cmd_setbldcnt, // 0x1E Cmd_createsoundtask, // 0x1F Cmd_waitsound, // 0x20 Cmd_jumpargeq, // 0x21 Cmd_monbg_static, // 0x22 Cmd_clearmonbg_static, // 0x23 Cmd_jumpifcontest, // 0x24 Cmd_fadetobgfromset, // 0x25 Cmd_panse_adjustnone, // 0x26 Cmd_panse_adjustall, // 0x27 Cmd_splitbgprio, // 0x28 Cmd_splitbgprio_all, // 0x29 Cmd_splitbgprio_foes, // 0x2A Cmd_invisible, // 0x2B Cmd_visible, // 0x2C Cmd_teamattack_moveback, // 0x2D Cmd_teamattack_movefwd, // 0x2E Cmd_stopsound, // 0x2F }; void ClearBattleAnimationVars(void) { s32 i; sAnimFramesToWait = 0; gAnimScriptActive = FALSE; gAnimVisualTaskCount = 0; gAnimSoundTaskCount = 0; gAnimDisableStructPtr = NULL; gAnimMoveDmg = 0; gAnimMovePower = 0; gAnimFriendship = 0; // Clear index array. for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) sAnimSpriteIndexArray[i] |= 0xFFFF; // Clear anim args. for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; sMonAnimTaskIdArray[0] = TASK_NONE; sMonAnimTaskIdArray[1] = TASK_NONE; gAnimMoveTurn = 0; sAnimBackgroundFadeState = 0; sAnimMoveIndex = 0; gBattleAnimAttacker = 0; gBattleAnimTarget = 0; gAnimCustomPanning = 0; } void DoMoveAnim(u16 move) { gBattleAnimAttacker = gBattlerAttacker; gBattleAnimTarget = gBattlerTarget; LaunchBattleAnimation(gBattleAnims_Moves, move, TRUE); } void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim) { s32 i; InitPrioritiesForVisibleBattlers(); UpdateOamPriorityInAllHealthboxes(0); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (GetBattlerSide(i) != B_SIDE_PLAYER) gAnimBattlerSpecies[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); else gAnimBattlerSpecies[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); } if (!isMoveAnim) sAnimMoveIndex = 0; else sAnimMoveIndex = tableId; for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; sMonAnimTaskIdArray[0] = TASK_NONE; sMonAnimTaskIdArray[1] = TASK_NONE; sBattleAnimScriptPtr = animsTable[tableId]; gAnimScriptActive = TRUE; sAnimFramesToWait = 0; gAnimScriptCallback = RunAnimScriptCommand; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) sAnimSpriteIndexArray[i] = 0xFFFF; if (isMoveAnim) { for (i = 0; gMovesWithQuietBGM[i] != 0xFFFF; i++) { if (tableId == gMovesWithQuietBGM[i]) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 128); break; } } } gBattle_WIN0H = 0; gBattle_WIN0V = 0; gBattle_WIN1H = 0; gBattle_WIN1V = 0; } void DestroyAnimSprite(struct Sprite *sprite) { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); gAnimVisualTaskCount--; } void DestroyAnimVisualTask(u8 taskId) { DestroyTask(taskId); gAnimVisualTaskCount--; } void DestroyAnimSoundTask(u8 taskId) { DestroyTask(taskId); gAnimSoundTaskCount--; } static void AddSpriteIndex(u16 index) { s32 i; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) { if (sAnimSpriteIndexArray[i] == 0xFFFF) { sAnimSpriteIndexArray[i] = index; return; } } } static void ClearSpriteIndex(u16 index) { s32 i; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) { if (sAnimSpriteIndexArray[i] == index) { sAnimSpriteIndexArray[i] = 0xFFFF; return; } } } static void WaitAnimFrameCount(void) { if (sAnimFramesToWait <= 0) { gAnimScriptCallback = RunAnimScriptCommand; sAnimFramesToWait = 0; } else { sAnimFramesToWait--; } } static void RunAnimScriptCommand(void) { do { sScriptCmdTable[sBattleAnimScriptPtr[0]](); } while (sAnimFramesToWait == 0 && gAnimScriptActive); } static void Cmd_loadspritegfx(void) { u16 index; sBattleAnimScriptPtr++; index = T1_READ_16(sBattleAnimScriptPtr); LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); sBattleAnimScriptPtr += 2; AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); sAnimFramesToWait = 1; gAnimScriptCallback = WaitAnimFrameCount; } static void Cmd_unloadspritegfx(void) { u16 index; sBattleAnimScriptPtr++; index = T1_READ_16(sBattleAnimScriptPtr); FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); sBattleAnimScriptPtr += 2; ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); } // Create sprite from template and init data array with varargs // args: template, flags, va_args // flags: // - bits 0-6: subpriority mod (signed) // - bit 7: target if set else attacker static void Cmd_createsprite(void) { s32 i; const struct SpriteTemplate *template; u8 argVar; u8 argsCount; s16 subpriority; sBattleAnimScriptPtr++; template = (const struct SpriteTemplate *)(T2_READ_32(sBattleAnimScriptPtr)); sBattleAnimScriptPtr += 4; argVar = sBattleAnimScriptPtr[0]; sBattleAnimScriptPtr++; argsCount = sBattleAnimScriptPtr[0]; sBattleAnimScriptPtr++; for (i = 0; i < argsCount; i++) { gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr); sBattleAnimScriptPtr += 2; } if (argVar & ANIMSPRITE_IS_TARGET) { argVar ^= ANIMSPRITE_IS_TARGET; if (argVar >= 64) argVar -= 64; else argVar *= -1; subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + (s8)(argVar); } else { if (argVar >= 64) argVar -= 64; else argVar *= -1; subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + (s8)(argVar); } if (subpriority < 3) subpriority = 3; CreateSpriteAndAnimate( template, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2), GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET), subpriority); gAnimVisualTaskCount++; } static void Cmd_createvisualtask(void) { TaskFunc taskFunc; u8 taskPriority; u8 taskId; u8 numArgs; s32 i; sBattleAnimScriptPtr++; taskFunc = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr); sBattleAnimScriptPtr += 4; taskPriority = sBattleAnimScriptPtr[0]; sBattleAnimScriptPtr++; numArgs = sBattleAnimScriptPtr[0]; sBattleAnimScriptPtr++; for (i = 0; i < numArgs; i++) { gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr); sBattleAnimScriptPtr += 2; } taskId = CreateTask(taskFunc, taskPriority); taskFunc(taskId); gAnimVisualTaskCount++; } static void Cmd_delay(void) { sBattleAnimScriptPtr++; sAnimFramesToWait = sBattleAnimScriptPtr[0]; if (sAnimFramesToWait == 0) sAnimFramesToWait = -1; sBattleAnimScriptPtr++; gAnimScriptCallback = WaitAnimFrameCount; } static void Cmd_waitforvisualfinish(void) { if (gAnimVisualTaskCount == 0) { sBattleAnimScriptPtr++; sAnimFramesToWait = 0; } else { sAnimFramesToWait = 1; } } static void Cmd_nop(void) { } static void Cmd_nop2(void) { } static void Cmd_end(void) { s32 i; bool32 continuousAnim = FALSE; // Keep waiting as long as there are animations to be done. if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 || sMonAnimTaskIdArray[0] != TASK_NONE || sMonAnimTaskIdArray[1] != TASK_NONE) { sSoundAnimFramesToWait = 0; sAnimFramesToWait = 1; return; } // Finish the sound effects. if (IsSEPlaying()) { if (++sSoundAnimFramesToWait <= 90) // Wait 90 frames, then halt the sound effect. { sAnimFramesToWait = 1; return; } else { m4aMPlayStop(&gMPlayInfo_SE1); m4aMPlayStop(&gMPlayInfo_SE2); } } // The SE has halted, so set the SE Frame Counter to 0 and continue. sSoundAnimFramesToWait = 0; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) { if (sAnimSpriteIndexArray[i] != 0xFFFF) { FreeSpriteTilesByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag); FreeSpritePaletteByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag); sAnimSpriteIndexArray[i] = 0xFFFF; // set terminator. } } if (!continuousAnim) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); InitPrioritiesForVisibleBattlers(); UpdateOamPriorityInAllHealthboxes(1); gAnimScriptActive = FALSE; } } static void Cmd_playse(void) { sBattleAnimScriptPtr++; PlaySE(T1_READ_16(sBattleAnimScriptPtr)); sBattleAnimScriptPtr += 2; } #define t1_MONBG_BATTLER 0 #define t1_MON_IN_BG2 1 #define t1_CREATE_ANOTHER_TASK 2 #define t1_IS_SECONDMON_BG 3 #define t2_BATTLER_SPRITE_ID 0 #define t2_MON_IN_BG2 5 #define t2_MONBG_BATTLER 6 static void Cmd_monbg(void) { bool8 toBG_2; u8 taskId; u8 battlerId; u8 animBattler; u8 position; u8 spriteId; sBattleAnimScriptPtr++; animBattler = sBattleAnimScriptPtr[0]; if (animBattler == ANIM_ATTACKER) animBattler = ANIM_ATK_PARTNER; else if (animBattler == ANIM_TARGET) animBattler = ANIM_DEF_PARTNER; if (animBattler == ANIM_ATTACKER || animBattler == ANIM_ATK_PARTNER) battlerId = gBattleAnimAttacker; else battlerId = gBattleAnimTarget; // Move designated battler to background if (IsBattlerSpriteVisible(battlerId)) { position = GetBattlerPosition(battlerId); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT) toBG_2 = FALSE; else toBG_2 = TRUE; MoveBattlerSpriteToBG(battlerId, toBG_2); spriteId = gBattlerSpriteIds[battlerId]; taskId = CreateTask(Task_InitUpdateMonBg, 10); gTasks[taskId].data[t1_MONBG_BATTLER] = spriteId; gTasks[taskId].data[1] = gSprites[spriteId].x + gSprites[spriteId].x2; gTasks[taskId].data[2] = gSprites[spriteId].y + gSprites[spriteId].y2; if (!toBG_2) { gTasks[taskId].data[3] = gBattle_BG1_X; gTasks[taskId].data[4] = gBattle_BG1_Y; } else { gTasks[taskId].data[3] = gBattle_BG2_X; gTasks[taskId].data[4] = gBattle_BG2_Y; } gTasks[taskId].data[5] = toBG_2; gTasks[taskId].data[6] = battlerId; sMonAnimTaskIdArray[0] = taskId; } battlerId ^= BIT_FLANK; if (animBattler > ANIM_TARGET && IsBattlerSpriteVisible(battlerId)) { position = GetBattlerPosition(battlerId); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT) toBG_2 = FALSE; else toBG_2 = TRUE; MoveBattlerSpriteToBG(battlerId, toBG_2); spriteId = gBattlerSpriteIds[battlerId]; taskId = CreateTask(Task_InitUpdateMonBg, 10); gTasks[taskId].data[t1_MONBG_BATTLER] = spriteId; gTasks[taskId].data[1] = gSprites[spriteId].x + gSprites[spriteId].x2; gTasks[taskId].data[2] = gSprites[spriteId].y + gSprites[spriteId].y2; if (!toBG_2) { gTasks[taskId].data[3] = gBattle_BG1_X; gTasks[taskId].data[4] = gBattle_BG1_Y; } else { gTasks[taskId].data[3] = gBattle_BG2_X; gTasks[taskId].data[4] = gBattle_BG2_Y; } gTasks[taskId].data[5] = toBG_2; gTasks[taskId].data[6] = battlerId; sMonAnimTaskIdArray[1] = taskId; } sBattleAnimScriptPtr++; } bool8 IsBattlerSpriteVisible(u8 battlerId) { u8 battler = battlerId; if (!IsBattlerSpritePresent(battler)) return FALSE; if (!gBattleSpritesDataPtr->battlerData[battler].invisible || !gSprites[gBattlerSpriteIds[battler]].invisible) return TRUE; return FALSE; } void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2) { struct BattleAnimBgData animBg; u8 battlerSpriteId; struct Sprite *sprite; if (!toBG_2) { RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(8)), 0x2000, DMA3_32BIT); RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(28)), 0x1000, DMA3_32BIT); GetBattleAnimBg1Data(&animBg); CpuFill16(toBG_2, animBg.bgTiles, 0x1000); CpuFill16(toBG_2, animBg.bgTilemap, 0x800); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1); SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0); battlerSpriteId = gBattlerSpriteIds[battlerId]; gBattle_BG1_X = -(gSprites[battlerSpriteId].x + gSprites[battlerSpriteId].x2) + 0x20; gBattle_BG1_Y = -(gSprites[battlerSpriteId].y + gSprites[battlerSpriteId].y2) + 0x20; gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); LoadPalette(&gPlttBufferUnfaded[OBJ_PLTT_ID(battlerId)], BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); CpuCopy32(&gPlttBufferUnfaded[OBJ_PLTT_ID(battlerId)], (void *)(BG_PLTT + animBg.paletteId * PLTT_SIZE_4BPP), PLTT_SIZE_4BPP); CopyBattlerSpriteToBg(1, 0, 0, GetBattlerPosition(battlerId), animBg.paletteId, animBg.bgTiles, animBg.bgTilemap, animBg.tilesOffset); } else { RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(12)), 0x2000, DMA3_32BIT); RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(30)), 0x1000, DMA3_32BIT); GetBattleAnimBgData(&animBg, 2); CpuFill16(0, animBg.bgTiles + 0x1000, 0x1000); CpuFill16(0, animBg.bgTilemap + 0x400, 0x800); SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 1); SetAnimBgAttribute(2, BG_ANIM_AREA_OVERFLOW_MODE, 0); battlerSpriteId = gBattlerSpriteIds[battlerId]; gBattle_BG2_X = -(gSprites[battlerSpriteId].x + gSprites[battlerSpriteId].x2) + 0x20; gBattle_BG2_Y = -(gSprites[battlerSpriteId].y + gSprites[battlerSpriteId].y2) + 0x20; gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); LoadPalette(&gPlttBufferUnfaded[OBJ_PLTT_ID(battlerId)], BG_PLTT_ID(9), PLTT_SIZE_4BPP); CpuCopy32(&gPlttBufferUnfaded[OBJ_PLTT_ID(battlerId)], (void *)(BG_PLTT + 9 * PLTT_SIZE_4BPP), PLTT_SIZE_4BPP); CopyBattlerSpriteToBg(2, 0, 0, GetBattlerPosition(battlerId), animBg.paletteId, animBg.bgTiles + 0x1000, animBg.bgTilemap + 0x400, animBg.tilesOffset); } } void RelocateBattleBgPal(u16 paletteNum, u16 *dest, s32 offset, u8 largeScreen) { u8 i, j; u32 size; if (!largeScreen) size = 32; else size = 64; paletteNum <<= 12; for (i = 0; i < size; i++) { for (j = 0; j < 32; j++) { dest[j + i * 32] = ((dest[j + i * 32] & 0xFFF) | paletteNum) + offset; } } } void ResetBattleAnimBg(bool8 to_BG2) { struct BattleAnimBgData animBg; GetBattleAnimBg1Data(&animBg); if (!to_BG2) { InitBattleAnimBg(1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; } else { InitBattleAnimBg(2); gBattle_BG2_X = 0; gBattle_BG2_Y = 0; } } static void Task_InitUpdateMonBg(u8 taskId) { u8 spriteId, palIndex; s16 x, y; struct BattleAnimBgData animBg; spriteId = gTasks[taskId].data[0]; palIndex = gTasks[taskId].data[6]; GetBattleAnimBg1Data(&animBg); x = gTasks[taskId].data[1] - (gSprites[spriteId].x + gSprites[spriteId].x2); y = gTasks[taskId].data[2] - (gSprites[spriteId].y + gSprites[spriteId].y2); if (gTasks[taskId].data[5] == 0) { gBattle_BG1_X = x + gTasks[taskId].data[3]; gBattle_BG1_Y = y + gTasks[taskId].data[4]; CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(palIndex)], &gPlttBufferFaded[BG_PLTT_ID(animBg.paletteId)], PLTT_SIZE_4BPP); } else { gBattle_BG2_X = x + gTasks[taskId].data[3]; gBattle_BG2_Y = y + gTasks[taskId].data[4]; CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(palIndex)], &gPlttBufferFaded[BG_PLTT_ID(9)], PLTT_SIZE_4BPP); } } static void Cmd_clearmonbg(void) { u8 animBattlerId; u8 battlerId; u8 taskId; sBattleAnimScriptPtr++; animBattlerId = sBattleAnimScriptPtr[0]; if (animBattlerId == ANIM_ATTACKER) animBattlerId = ANIM_ATK_PARTNER; else if (animBattlerId == ANIM_TARGET) animBattlerId = ANIM_DEF_PARTNER; if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER) battlerId = gBattleAnimAttacker; else battlerId = gBattleAnimTarget; if (sMonAnimTaskIdArray[0] != TASK_NONE) gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; if (animBattlerId > ANIM_TARGET && sMonAnimTaskIdArray[1] != TASK_NONE) gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = FALSE; else animBattlerId = ANIM_ATTACKER; taskId = CreateTask(Task_ClearMonBg, 5); gTasks[taskId].data[0] = animBattlerId; gTasks[taskId].data[2] = battlerId; sBattleAnimScriptPtr++; } static void Task_ClearMonBg(u8 taskId) { u8 toBG_2; u8 position; gTasks[taskId].data[1]++; if (gTasks[taskId].data[1] != 1) { position = GetBattlerPosition((u8)gTasks[taskId].data[2]); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT) toBG_2 = FALSE; else toBG_2 = TRUE; if (sMonAnimTaskIdArray[0] != TASK_NONE) { ResetBattleAnimBg(toBG_2); DestroyTask(sMonAnimTaskIdArray[0]); sMonAnimTaskIdArray[0] = TASK_NONE; } if (gTasks[taskId].data[0] > 1) { ResetBattleAnimBg(toBG_2 ^ 1); DestroyTask(sMonAnimTaskIdArray[1]); sMonAnimTaskIdArray[1] = TASK_NONE; } DestroyTask(taskId); } } // Equivalent to Cmd_monbg but never creates Task_InitUpdateMonBg / Task_UpdateMonBg static void Cmd_monbg_static(void) { bool8 toBG_2; u8 battlerId; u8 animBattlerId; u8 position; sBattleAnimScriptPtr++; animBattlerId = sBattleAnimScriptPtr[0]; if (animBattlerId == ANIM_ATTACKER) animBattlerId = ANIM_ATK_PARTNER; else if (animBattlerId == ANIM_TARGET) animBattlerId = ANIM_DEF_PARTNER; if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER) battlerId = gBattleAnimAttacker; else battlerId = gBattleAnimTarget; if (IsBattlerSpriteVisible(battlerId)) { position = GetBattlerPosition(battlerId); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT) toBG_2 = FALSE; else toBG_2 = TRUE; MoveBattlerSpriteToBG(battlerId, toBG_2); gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; } battlerId ^= BIT_FLANK; if (animBattlerId > ANIM_TARGET && IsBattlerSpriteVisible(battlerId)) { position = GetBattlerPosition(battlerId); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT) toBG_2 = FALSE; else toBG_2 = TRUE; MoveBattlerSpriteToBG(battlerId, toBG_2); gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; } sBattleAnimScriptPtr++; } static void Cmd_clearmonbg_static(void) { u8 animBattlerId; u8 battlerId; u8 taskId; sBattleAnimScriptPtr++; animBattlerId = sBattleAnimScriptPtr[0]; if (animBattlerId == ANIM_ATTACKER) animBattlerId = ANIM_ATK_PARTNER; else if (animBattlerId == ANIM_TARGET) animBattlerId = ANIM_DEF_PARTNER; if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER) battlerId = gBattleAnimAttacker; else battlerId = gBattleAnimTarget; if (IsBattlerSpriteVisible(battlerId)) gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; if (animBattlerId > ANIM_TARGET && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK)) gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = FALSE; else animBattlerId = ANIM_ATTACKER; taskId = CreateTask(Task_ClearMonBgStatic, 5); gTasks[taskId].data[0] = animBattlerId; gTasks[taskId].data[2] = battlerId; sBattleAnimScriptPtr++; } static void Task_ClearMonBgStatic(u8 taskId) { bool8 to_BG2; u8 position; u8 battlerId; gTasks[taskId].data[1]++; if (gTasks[taskId].data[1] != 1) { bool8 toBG_2; battlerId = gTasks[taskId].data[2]; position = GetBattlerPosition(battlerId); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT) toBG_2 = FALSE; else toBG_2 = TRUE; if (IsBattlerSpriteVisible(battlerId)) ResetBattleAnimBg(toBG_2); if (gTasks[taskId].data[0] > 1 && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK)) ResetBattleAnimBg(toBG_2 ^ 1); DestroyTask(taskId); } } #undef t1_MONBG_BATTLER #undef t1_MON_IN_BG2 #undef t1_CREATE_ANOTHER_TASK #undef t1_IS_SECONDMON_BG #undef t2_BATTLER_SPRITE_ID #undef t2_MON_IN_BG2 #undef t2_MONBG_BATTLER static void Cmd_setalpha(void) { u16 half1, half2; sBattleAnimScriptPtr++; half1 = *(sBattleAnimScriptPtr++); half2 = *(sBattleAnimScriptPtr++) << 8; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, half1 | half2); } static void Cmd_setbldcnt(void) { u16 half1, half2; sBattleAnimScriptPtr++; half1 = *(sBattleAnimScriptPtr++); half2 = *(sBattleAnimScriptPtr++) << 8; SetGpuReg(REG_OFFSET_BLDCNT, half1 | half2); } static void Cmd_blendoff(void) { sBattleAnimScriptPtr++; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); } static void Cmd_call(void) { sBattleAnimScriptPtr++; sBattleAnimScriptRetAddr = sBattleAnimScriptPtr + 4; sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); } static void Cmd_return(void) { sBattleAnimScriptPtr = sBattleAnimScriptRetAddr; } static void Cmd_setarg(void) { const u8 *addr = sBattleAnimScriptPtr; u16 value; u8 argId; sBattleAnimScriptPtr++; argId = sBattleAnimScriptPtr[0]; sBattleAnimScriptPtr++; value = T1_READ_16(sBattleAnimScriptPtr); sBattleAnimScriptPtr = addr + 4; gBattleAnimArgs[argId] = value; } static void Cmd_choosetwoturnanim(void) { sBattleAnimScriptPtr++; if (gAnimMoveTurn & 1) sBattleAnimScriptPtr += 4; sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); } static void Cmd_jumpifmoveturn(void) { u8 toCheck; sBattleAnimScriptPtr++; toCheck = sBattleAnimScriptPtr[0]; sBattleAnimScriptPtr++; if (toCheck == gAnimMoveTurn) sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); else sBattleAnimScriptPtr += 4; } static void Cmd_goto(void) { sBattleAnimScriptPtr++; sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); } bool8 IsContest(void) { return FALSE; } // Unused static bool8 IsSpeciesNotUnown(u16 species) { if (species == SPECIES_UNOWN) return FALSE; else return TRUE; } #define tBackgroundId data[0] #define tState data[10] static void Cmd_fadetobg(void) { u8 backgroundId; u8 taskId; sBattleAnimScriptPtr++; backgroundId = sBattleAnimScriptPtr[0]; sBattleAnimScriptPtr++; taskId = CreateTask(Task_FadeToBg, 5); gTasks[taskId].tBackgroundId = backgroundId; sAnimBackgroundFadeState = 1; } static void Cmd_fadetobgfromset(void) { u8 bg1, bg2, bg3; u8 taskId; sBattleAnimScriptPtr++; bg1 = sBattleAnimScriptPtr[0]; bg2 = sBattleAnimScriptPtr[1]; bg3 = sBattleAnimScriptPtr[2]; sBattleAnimScriptPtr += 3; taskId = CreateTask(Task_FadeToBg, 5); if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) gTasks[taskId].tBackgroundId = bg2; else gTasks[taskId].tBackgroundId = bg1; sAnimBackgroundFadeState = 1; } static void Task_FadeToBg(u8 taskId) { if (gTasks[taskId].tState == 0) { BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0); gTasks[taskId].tState++; return; } if (gPaletteFade.active) return; if (gTasks[taskId].tState == 1) { gTasks[taskId].tState++; sAnimBackgroundFadeState = 2; } else if (gTasks[taskId].tState == 2) { s16 bgId = gTasks[taskId].tBackgroundId; if (bgId == -1) LoadDefaultBg(); else LoadMoveBg(bgId); BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1); gTasks[taskId].tState++; return; } if (gPaletteFade.active) return; if (gTasks[taskId].tState == 3) { DestroyTask(taskId); sAnimBackgroundFadeState = 0; } } static void LoadMoveBg(u16 bgId) { LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)(BG_SCREEN_ADDR(26))); LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(BG_CHAR_ADDR(2))); LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP); } static void LoadDefaultBg(void) { DrawMainBattleBackground(); } static void Cmd_restorebg(void) { u8 taskId; sBattleAnimScriptPtr++; taskId = CreateTask(Task_FadeToBg, 5); gTasks[taskId].tBackgroundId = -1; sAnimBackgroundFadeState = 1; } #undef tBackgroundId #undef tState static void Cmd_waitbgfadeout(void) { if (sAnimBackgroundFadeState == 2) { sBattleAnimScriptPtr++; sAnimFramesToWait = 0; } else { sAnimFramesToWait = 1; } } static void Cmd_waitbgfadein(void) { if (sAnimBackgroundFadeState == 0) { sBattleAnimScriptPtr++; sAnimFramesToWait = 0; } else { sAnimFramesToWait = 1; } } static void Cmd_changebg(void) { sBattleAnimScriptPtr++; LoadMoveBg(sBattleAnimScriptPtr[0]); sBattleAnimScriptPtr++; } s8 BattleAnimAdjustPanning(s8 pan) { if (gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) pan = SOUND_PAN_TARGET; else pan = SOUND_PAN_ATTACKER; } else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { if (pan == SOUND_PAN_TARGET) pan = SOUND_PAN_ATTACKER; else if (pan != SOUND_PAN_ATTACKER) pan *= -1; } } else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) { if (pan == SOUND_PAN_ATTACKER) pan = SOUND_PAN_TARGET; } else { pan *= -1; } if (pan > SOUND_PAN_TARGET) pan = SOUND_PAN_TARGET; else if (pan < SOUND_PAN_ATTACKER) pan = SOUND_PAN_ATTACKER; return pan; } s8 BattleAnimAdjustPanning2(s8 pan) { if (gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) pan = SOUND_PAN_TARGET; else pan = SOUND_PAN_ATTACKER; } else { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) pan = -pan; } return pan; } s16 KeepPanInRange(s16 panArg, s32 oldPan) { s16 pan = panArg; if (pan > SOUND_PAN_TARGET) pan = SOUND_PAN_TARGET; else if (pan < SOUND_PAN_ATTACKER) pan = SOUND_PAN_ATTACKER; return pan; } s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan) { s16 ret; if (sourcePan < targetPan) ret = ((incrementPan < 0) ? -incrementPan : incrementPan); else if (sourcePan > targetPan) ret = -((incrementPan < 0) ? -incrementPan : incrementPan); else ret = 0; return ret; } static void Cmd_playsewithpan(void) { u16 songId; s8 pan; sBattleAnimScriptPtr++; songId = T1_READ_16(sBattleAnimScriptPtr); pan = sBattleAnimScriptPtr[2]; PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan)); sBattleAnimScriptPtr += 3; } static void Cmd_setpan(void) { s8 pan; sBattleAnimScriptPtr++; pan = sBattleAnimScriptPtr[0]; SE12PanpotControl(BattleAnimAdjustPanning(pan)); sBattleAnimScriptPtr++; } #define tInitialPan data[0] #define tTargetPan data[1] #define tIncrementPan data[2] #define tFramesToWait data[3] #define tCurrentPan data[4] #define tFrameCounter data[8] static void Cmd_panse(void) { u16 songNum; s8 currentPanArg, incrementPan, incrementPanArg, currentPan, targetPan; u8 framesToWait; u8 taskId; sBattleAnimScriptPtr++; songNum = T1_READ_16(sBattleAnimScriptPtr); currentPanArg = sBattleAnimScriptPtr[2]; incrementPan = sBattleAnimScriptPtr[3]; incrementPanArg = sBattleAnimScriptPtr[4]; framesToWait = sBattleAnimScriptPtr[5]; currentPan = BattleAnimAdjustPanning(currentPanArg); targetPan = BattleAnimAdjustPanning(incrementPan); incrementPan = CalculatePanIncrement(currentPan, targetPan, incrementPanArg); taskId = CreateTask(Task_PanFromInitialToTarget, 1); gTasks[taskId].tInitialPan = currentPan; gTasks[taskId].tTargetPan = targetPan; gTasks[taskId].tIncrementPan = incrementPan; gTasks[taskId].tFramesToWait = framesToWait; gTasks[taskId].tCurrentPan = currentPan; PlaySE12WithPanning(songNum, currentPan); gAnimSoundTaskCount++; sBattleAnimScriptPtr += 6; } static void Task_PanFromInitialToTarget(u8 taskId) { bool32 destroyTask = FALSE; if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait) { s16 pan; s16 initialPanning, targetPanning, currentPan, incrementPan; gTasks[taskId].tFrameCounter = 0; initialPanning = gTasks[taskId].tInitialPan; targetPanning = gTasks[taskId].tTargetPan; currentPan = gTasks[taskId].tCurrentPan; incrementPan = gTasks[taskId].tIncrementPan; pan = currentPan + incrementPan; gTasks[taskId].tCurrentPan = pan; if (incrementPan == 0) { destroyTask = TRUE; } else if (initialPanning < targetPanning) { if (pan >= targetPanning) destroyTask = TRUE; } else // Panning decreasing. { if (pan <= targetPanning) destroyTask = TRUE; } if (destroyTask) { pan = targetPanning; DestroyTask(taskId); gAnimSoundTaskCount--; } SE12PanpotControl(pan); } } static void Cmd_panse_adjustnone(void) { u16 songId; s8 currentPan, targetPan, incrementPan; u8 framesToWait; u8 taskId; sBattleAnimScriptPtr++; songId = T1_READ_16(sBattleAnimScriptPtr); currentPan = sBattleAnimScriptPtr[2]; targetPan = sBattleAnimScriptPtr[3]; incrementPan = sBattleAnimScriptPtr[4]; framesToWait = sBattleAnimScriptPtr[5]; taskId = CreateTask(Task_PanFromInitialToTarget, 1); gTasks[taskId].tInitialPan = currentPan; gTasks[taskId].tTargetPan = targetPan; gTasks[taskId].tIncrementPan = incrementPan; gTasks[taskId].tFramesToWait = framesToWait; gTasks[taskId].tCurrentPan = currentPan; PlaySE12WithPanning(songId, currentPan); gAnimSoundTaskCount++; sBattleAnimScriptPtr += 6; } static void Cmd_panse_adjustall(void) { u16 songId; s8 targetPanArg, incrementPanArg, currentPanArg, currentPan, targetPan, incrementPan; u8 framesToWait; u8 taskId; sBattleAnimScriptPtr++; songId = T1_READ_16(sBattleAnimScriptPtr); currentPanArg = sBattleAnimScriptPtr[2]; targetPanArg = sBattleAnimScriptPtr[3]; incrementPanArg = sBattleAnimScriptPtr[4]; framesToWait = sBattleAnimScriptPtr[5]; currentPan = BattleAnimAdjustPanning2(currentPanArg); targetPan = BattleAnimAdjustPanning2(targetPanArg); incrementPan = BattleAnimAdjustPanning2(incrementPanArg); taskId = CreateTask(Task_PanFromInitialToTarget, 1); gTasks[taskId].tInitialPan = currentPan; gTasks[taskId].tTargetPan = targetPan; gTasks[taskId].tIncrementPan = incrementPan; gTasks[taskId].tFramesToWait = framesToWait; gTasks[taskId].tCurrentPan = currentPan; PlaySE12WithPanning(songId, currentPan); gAnimSoundTaskCount++; sBattleAnimScriptPtr += 6; } #undef tInitialPan #undef tTargetPan #undef tIncrementPan #undef tFramesToWait #undef tCurrentPan #undef tFrameCounter #define tSongId data[0] #define tPanning data[1] #define tFramesToWait data[2] #define tNumberOfPlays data[3] #define tFrameCounter data[8] static void Cmd_loopsewithpan(void) { u16 songId; s8 panningArg, panning; u8 framesToWait, numberOfPlays; u8 taskId; sBattleAnimScriptPtr++; songId = T1_READ_16(sBattleAnimScriptPtr); panningArg = sBattleAnimScriptPtr[2]; framesToWait = sBattleAnimScriptPtr[3]; numberOfPlays = sBattleAnimScriptPtr[4]; panning = BattleAnimAdjustPanning(panningArg); taskId = CreateTask(Task_LoopAndPlaySE, 1); gTasks[taskId].tSongId = songId; gTasks[taskId].tPanning = panning; gTasks[taskId].tFramesToWait = framesToWait; gTasks[taskId].tNumberOfPlays = numberOfPlays; gTasks[taskId].tFrameCounter = framesToWait; gTasks[taskId].func(taskId); gAnimSoundTaskCount++; sBattleAnimScriptPtr += 5; } static void Task_LoopAndPlaySE(u8 taskId) { if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait) { u16 songId; s8 panning; u8 numberOfPlays; gTasks[taskId].tFrameCounter = 0; songId = gTasks[taskId].tSongId; panning = gTasks[taskId].tPanning; numberOfPlays = --gTasks[taskId].tNumberOfPlays; PlaySE12WithPanning(songId, panning); if (numberOfPlays == 0) { DestroyTask(taskId); gAnimSoundTaskCount--; } } } #undef tSongId #undef tPanning #undef tFramesToWait #undef tNumberOfPlays #undef tFrameCounter #define tSongId data[0] #define tPanning data[1] #define tFramesToWait data[2] static void Cmd_waitplaysewithpan(void) { u16 songId; s8 panningArg, panning; u8 framesToWait; u8 taskId; sBattleAnimScriptPtr++; songId = T1_READ_16(sBattleAnimScriptPtr); panningArg = sBattleAnimScriptPtr[2]; framesToWait = sBattleAnimScriptPtr[3]; panning = BattleAnimAdjustPanning(panningArg); taskId = CreateTask(Task_WaitAndPlaySE, 1); gTasks[taskId].tSongId = songId; gTasks[taskId].tPanning = panning; gTasks[taskId].tFramesToWait = framesToWait; gAnimSoundTaskCount++; sBattleAnimScriptPtr += 4; } static void Task_WaitAndPlaySE(u8 taskId) { if (gTasks[taskId].tFramesToWait-- <= 0) { PlaySE12WithPanning(gTasks[taskId].tSongId, gTasks[taskId].tPanning); DestroyTask(taskId); gAnimSoundTaskCount--; } } #undef tSongId #undef tPanning #undef tFramesToWait static void Cmd_createsoundtask(void) { TaskFunc func; u8 numArgs, taskId; s32 i; sBattleAnimScriptPtr++; func = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr); sBattleAnimScriptPtr += 4; numArgs = sBattleAnimScriptPtr[0]; sBattleAnimScriptPtr++; for (i = 0; i < numArgs; i++) { gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr); sBattleAnimScriptPtr += 2; } taskId = CreateTask(func, 1); func(taskId); gAnimSoundTaskCount++; } static void Cmd_waitsound(void) { if (gAnimSoundTaskCount != 0) { sSoundAnimFramesToWait = 0; sAnimFramesToWait = 1; } else if (IsSEPlaying()) { if (++sSoundAnimFramesToWait > 90) { m4aMPlayStop(&gMPlayInfo_SE1); m4aMPlayStop(&gMPlayInfo_SE2); sSoundAnimFramesToWait = 0; } else { sAnimFramesToWait = 1; } } else { sSoundAnimFramesToWait = 0; sBattleAnimScriptPtr++; sAnimFramesToWait = 0; } } static void Cmd_jumpargeq(void) { u8 argId; s16 valueToCheck; sBattleAnimScriptPtr++; argId = sBattleAnimScriptPtr[0]; valueToCheck = T1_READ_16(sBattleAnimScriptPtr + 1); if (valueToCheck == gBattleAnimArgs[argId]) sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr + 3); else sBattleAnimScriptPtr += 7; } static void Cmd_jumpifcontest(void) { sBattleAnimScriptPtr += 5; } static void Cmd_splitbgprio(void) { u8 wantedBattler; u8 battlerId; u8 battlerPosition; wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; if (wantedBattler != ANIM_ATTACKER) battlerId = gBattleAnimTarget; else battlerId = gBattleAnimAttacker; // Apply only if the given battler is the lead (on left from team's perspective) battlerPosition = GetBattlerPosition(battlerId); if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT) { SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); } } static void Cmd_splitbgprio_all(void) { sBattleAnimScriptPtr++; SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); } static void Cmd_splitbgprio_foes(void) { u8 wantedBattler; u8 battlerPosition; u8 battlerId; wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; // Apply only if the attacking the opposing side if (GetBattlerSide(gBattleAnimAttacker) != GetBattlerSide(gBattleAnimTarget)) { if (wantedBattler != ANIM_ATTACKER) battlerId = gBattleAnimTarget; else battlerId = gBattleAnimAttacker; // Apply only if the given battler is the lead (on left from team's perspective) battlerPosition = GetBattlerPosition(battlerId); if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT) { SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); } } } static void Cmd_invisible(void) { u8 spriteId; spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]); if (spriteId != SPRITE_NONE) gSprites[spriteId].invisible = TRUE; sBattleAnimScriptPtr += 2; } static void Cmd_visible(void) { u8 spriteId; spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]); if (spriteId != SPRITE_NONE) gSprites[spriteId].invisible = FALSE; sBattleAnimScriptPtr += 2; } // Below two commands are never used static void Cmd_teamattack_moveback(void) { u8 wantedBattler; u8 priority; u8 spriteId; wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; // Apply to double battles when attacking own side if (IsDoubleBattle() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) { if (wantedBattler == ANIM_ATTACKER) { priority = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); } else { priority = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget); spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); } if (spriteId != SPRITE_NONE) { gSprites[spriteId].invisible = FALSE; if (priority == 2) gSprites[spriteId].oam.priority = 3; if (priority == 1) ResetBattleAnimBg(FALSE); else ResetBattleAnimBg(TRUE); } } } static void Cmd_teamattack_movefwd(void) { u8 wantedBattler; u8 priority; u8 spriteId; wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; // Apply to double battles when attacking own side if (IsDoubleBattle() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) { if (wantedBattler == ANIM_ATTACKER) { priority = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); } else { priority = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget); spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); } if (spriteId != SPRITE_NONE && priority == 2) gSprites[spriteId].oam.priority = 2; } } static void Cmd_stopsound(void) { m4aMPlayStop(&gMPlayInfo_SE1); m4aMPlayStop(&gMPlayInfo_SE2); sBattleAnimScriptPtr++; } ================================================ FILE: src/battle_anim_bug.c ================================================ #include "global.h" #include "battle_anim.h" #include "gpu_regs.h" #include "trig.h" static void AnimMegahornHorn(struct Sprite *sprite); static void AnimLeechLifeNeedle(struct Sprite *sprite); static void AnimTranslateWebThread(struct Sprite *sprite); static void AnimTranslateWebThread_Step(struct Sprite *sprite); static void AnimStringWrap(struct Sprite *sprite); static void AnimStringWrap_Step(struct Sprite *sprite); static void AnimSpiderWeb(struct Sprite *sprite); static void AnimSpiderWeb_Step(struct Sprite *sprite); static void AnimSpiderWeb_End(struct Sprite *sprite); static void AnimTranslateStinger(struct Sprite *sprite); static void AnimMissileArc(struct Sprite *sprite); static void AnimMissileArc_Step(struct Sprite *sprite); static void AnimTailGlowOrb(struct Sprite *sprite); static const union AffineAnimCmd sAffineAnim_MegahornHorn_0[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 30, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_MegahornHorn_1[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, -99, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_MegahornHorn_2[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 94, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_MegahornHorn[] = { sAffineAnim_MegahornHorn_0, sAffineAnim_MegahornHorn_1, sAffineAnim_MegahornHorn_2, }; const struct SpriteTemplate gMegahornHornSpriteTemplate = { .tileTag = ANIM_TAG_HORN_HIT_2, .paletteTag = ANIM_TAG_HORN_HIT_2, .oam = &gOamData_AffineDouble_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_MegahornHorn, .callback = AnimMegahornHorn, }; static const union AffineAnimCmd sAffineAnim_LeechLifeNeedle_0[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -33, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_LeechLifeNeedle_1[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 96, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_LeechLifeNeedle_2[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -96, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_LeechLifeNeedle[] = { sAffineAnim_LeechLifeNeedle_0, sAffineAnim_LeechLifeNeedle_1, sAffineAnim_LeechLifeNeedle_2, }; const struct SpriteTemplate gLeechLifeNeedleSpriteTemplate = { .tileTag = ANIM_TAG_NEEDLE, .paletteTag = ANIM_TAG_NEEDLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_LeechLifeNeedle, .callback = AnimLeechLifeNeedle, }; const struct SpriteTemplate gWebThreadSpriteTemplate = { .tileTag = ANIM_TAG_WEB_THREAD, .paletteTag = ANIM_TAG_WEB_THREAD, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTranslateWebThread, }; const struct SpriteTemplate gStringWrapSpriteTemplate = { .tileTag = ANIM_TAG_STRING, .paletteTag = ANIM_TAG_STRING, .oam = &gOamData_AffineOff_ObjNormal_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimStringWrap, }; static const union AffineAnimCmd sAffineAnim_SpiderWeb[] = { AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), AFFINEANIMCMD_FRAME(0x6, 0x6, 0, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sAffineAnims_SpiderWeb[] = { sAffineAnim_SpiderWeb, }; const struct SpriteTemplate gSpiderWebSpriteTemplate = { .tileTag = ANIM_TAG_SPIDER_WEB, .paletteTag = ANIM_TAG_SPIDER_WEB, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_SpiderWeb, .callback = AnimSpiderWeb, }; const struct SpriteTemplate gLinearStingerSpriteTemplate = { .tileTag = ANIM_TAG_NEEDLE, .paletteTag = ANIM_TAG_NEEDLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTranslateStinger, }; const struct SpriteTemplate gPinMissileSpriteTemplate = { .tileTag = ANIM_TAG_NEEDLE, .paletteTag = ANIM_TAG_NEEDLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMissileArc, }; const struct SpriteTemplate gIcicleSpearSpriteTemplate = { .tileTag = ANIM_TAG_ICICLE_SPEAR, .paletteTag = ANIM_TAG_ICICLE_SPEAR, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMissileArc, }; static const union AffineAnimCmd sAffineAnim_TailGlowOrb[] = { AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 18), AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(-0x5, -0x5, 0, 8), AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 8), AFFINEANIMCMD_LOOP(5), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_TailGlowOrb[] = { sAffineAnim_TailGlowOrb, }; const struct SpriteTemplate gTailGlowOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_TailGlowOrb, .callback = AnimTailGlowOrb, }; static void AnimMegahornHorn(struct Sprite *sprite) { if (IsContest()) { StartSpriteAffineAnim(sprite, 2); gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[0] = -gBattleAnimArgs[0]; } else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { StartSpriteAffineAnim(sprite, 1); gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; gBattleAnimArgs[0] = -gBattleAnimArgs[0]; } sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimLeechLifeNeedle(struct Sprite *sprite) { if (IsContest()) { gBattleAnimArgs[0] = -gBattleAnimArgs[0]; StartSpriteAffineAnim(sprite, 2); } else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[0] = -gBattleAnimArgs[0]; } sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Creates a single web thread that travels from attacker to target. // Used by MOVE_STRING_SHOT and MOVE_SPIDER_WEB in their first move phase. // arg 0: x // arg 1: y // arg 2: controls the left-to-right movement // arg 3: amplitude // arg 4: if targets both opponents static void AnimTranslateWebThread(struct Sprite *sprite) { if (IsContest()) gBattleAnimArgs[2] /= 2; InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; if (!gBattleAnimArgs[4]) { sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } else { SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); } InitAnimLinearTranslationWithSpeed(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = AnimTranslateWebThread_Step; } static void AnimTranslateWebThread_Step(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) { DestroyAnimSprite(sprite); return; } sprite->x2 += Sin(sprite->data[6], sprite->data[5]); sprite->data[6] = (sprite->data[6] + 13) & 0xFF; } static void AnimStringWrap(struct Sprite *sprite) { SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) sprite->y += 8; sprite->callback = AnimStringWrap_Step; } static void AnimStringWrap_Step(struct Sprite *sprite) { if (++sprite->data[0] == 3) { sprite->data[0] = 0; sprite->invisible ^= 1; } if (++sprite->data[1] == 51) { DestroyAnimSprite(sprite); } } static void AnimSpiderWeb(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); sprite->data[0] = 16; sprite->callback = AnimSpiderWeb_Step; } static void AnimSpiderWeb_Step(struct Sprite *sprite) { if (sprite->data[2] < 20) { ++sprite->data[2]; } else if (sprite->data[1]++ & 1) { --sprite->data[0]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0])); if (sprite->data[0] == 0) { sprite->invisible = TRUE; sprite->callback = AnimSpiderWeb_End; } } } static void AnimSpiderWeb_End(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimSprite(sprite); } // Translates a stinger sprite linearly to a destination location. The sprite is // initially rotated so that it appears to be traveling in a straight line. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x pixel offset // arg 3: target y pixel offset // arg 4: duration static void AnimTranslateStinger(struct Sprite *sprite) { s16 lVarX, lVarY; u16 rot; if (IsContest()) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } else if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; } if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) { if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT) { s16 temp1, temp2; temp1 = gBattleAnimArgs[2]; gBattleAnimArgs[2] = -temp1; temp2 = gBattleAnimArgs[0]; gBattleAnimArgs[0] = -temp2; } } InitSpritePosToAnimAttacker(sprite, 1); lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; rot = ArcTan2Neg(lVarX - sprite->x, lVarY - sprite->y); rot += 0xC000; TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = lVarX; sprite->data[4] = lVarY; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Rotates sprite and moves it in an arc, so that it appears like a missle or arrow traveling. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x pixel offset // arg 3: target y pixel offset // arg 4: duration // arg 5: wave amplitude static void AnimMissileArc(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); sprite->callback = AnimMissileArc_Step; sprite->invisible = TRUE; } static void AnimMissileArc_Step(struct Sprite *sprite) { sprite->invisible = FALSE; if (TranslateAnimHorizontalArc(sprite)) { DestroyAnimSprite(sprite); } else { s16 tempData[8]; u16 *data = sprite->data; u16 x1 = sprite->x; s16 x2 = sprite->x2; u16 y1 = sprite->y; s16 y2 = sprite->y2; s32 i; for (i = 0; i < 8; ++i) tempData[i] = data[i]; x2 += x1; y2 += y1; if (!TranslateAnimHorizontalArc(sprite)) { u16 rotation = ArcTan2Neg(sprite->x + sprite->x2 - x2, sprite->y + sprite->y2 - y2); rotation += 0xC000; TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation); for (i = 0; i < 8; ++i) data[i] = tempData[i]; } } } static void AnimTailGlowOrb(struct Sprite *sprite) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 18; } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 18; } StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } ================================================ FILE: src/battle_anim_dark.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "graphics.h" #include "scanline_effect.h" #include "trig.h" #include "util.h" static void AnimUnusedBagSteal(struct Sprite *sprite); static void AnimUnusedBagSteal_Step(struct Sprite *sprite); static void AnimBite(struct Sprite *sprite); static void AnimTearDrop(struct Sprite *sprite); static void AnimClawSlash(struct Sprite *sprite); static void AnimTask_AttackerFadeToInvisible_Step(u8 taskId); static void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId); static void AnimBite_Step1(struct Sprite *sprite); static void AnimBite_Step2(struct Sprite *sprite); static void AnimTearDrop_Step(struct Sprite *sprite); static void SetAllBattlersSpritePriority(u8 priority); static void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId); static void DoMementoShadowEffect(struct Task *task); static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId); static void AnimTask_MetallicShine_Step(u8 taskId); // Unused const struct SpriteTemplate sUnusedBagStealSpriteTemplate = { .tileTag = ANIM_TAG_TIED_BAG, .paletteTag = ANIM_TAG_TIED_BAG, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimUnusedBagSteal, }; static const union AffineAnimCmd sAffineAnim_Bite_0[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Bite_1[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 32, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Bite_2[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 64, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Bite_3[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 96, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Bite_4[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -128, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Bite_5[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -96, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Bite_6[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -64, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Bite_7[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -32, 1), AFFINEANIMCMD_END, }; const union AffineAnimCmd *const gAffineAnims_Bite[] = { sAffineAnim_Bite_0, sAffineAnim_Bite_1, sAffineAnim_Bite_2, sAffineAnim_Bite_3, sAffineAnim_Bite_4, sAffineAnim_Bite_5, sAffineAnim_Bite_6, sAffineAnim_Bite_7, }; const struct SpriteTemplate gSharpTeethSpriteTemplate = { .tileTag = ANIM_TAG_SHARP_TEETH, .paletteTag = ANIM_TAG_SHARP_TEETH, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_Bite, .callback = AnimBite, }; const struct SpriteTemplate gClampJawSpriteTemplate = { .tileTag = ANIM_TAG_CLAMP, .paletteTag = ANIM_TAG_CLAMP, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_Bite, .callback = AnimBite, }; static const union AffineAnimCmd sAffineAnim_TearDrop_0[] = { AFFINEANIMCMD_FRAME(0xC0, 0xC0, 80, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, -2, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_TearDrop_1[] = { AFFINEANIMCMD_FRAME(0xC0, 0xC0, -80, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_TearDrop[] = { sAffineAnim_TearDrop_0, sAffineAnim_TearDrop_1, }; const struct SpriteTemplate gTearDropSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_TearDrop, .callback = AnimTearDrop, }; static const union AnimCmd sAnim_ClawSlash_0[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_FRAME(64, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_ClawSlash_1[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(16, 4, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .hFlip = TRUE), ANIMCMD_FRAME(48, 4, .hFlip = TRUE), ANIMCMD_FRAME(64, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_ClawSlash[] = { sAnim_ClawSlash_0, sAnim_ClawSlash_1, }; const struct SpriteTemplate gClawSlashSpriteTemplate = { .tileTag = ANIM_TAG_CLAW_SLASH, .paletteTag = ANIM_TAG_CLAW_SLASH, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_ClawSlash, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimClawSlash, }; void AnimTask_AttackerFadeToInvisible(u8 taskId) { s32 battler; gTasks[taskId].data[0] = gBattleAnimArgs[0]; battler = gBattleAnimAttacker; gTasks[taskId].data[1] = 16; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); if (GetBattlerSpriteBGPriorityRank(battler) == 1) SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); else SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); gTasks[taskId].func = AnimTask_AttackerFadeToInvisible_Step; } static void AnimTask_AttackerFadeToInvisible_Step(u8 taskId) { u8 blendA = gTasks[taskId].data[1] >> 8; u8 blendB = gTasks[taskId].data[1]; if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0]) { ++blendA; --blendB; gTasks[taskId].data[1] = BLDALPHA_BLEND(blendB, blendA); SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]); gTasks[taskId].data[2] = 0; if (blendA == 16) { gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = TRUE; DestroyAnimVisualTask(taskId); } } else { ++gTasks[taskId].data[2]; } } void AnimTask_AttackerFadeFromInvisible(u8 taskId) { gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[1] = BLDALPHA_BLEND(0, 16); gTasks[taskId].func = AnimTask_AttackerFadeFromInvisible_Step; SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]); } static void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId) { u8 blendA = gTasks[taskId].data[1] >> 8; u8 blendB = gTasks[taskId].data[1]; if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0]) { --blendA; ++blendB; gTasks[taskId].data[1] = (blendA << 8) | blendB; SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]); gTasks[taskId].data[2] = 0; if (blendA == 0) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimVisualTask(taskId); } } else { ++gTasks[taskId].data[2]; } } void AnimTask_InitAttackerFadeFromInvisible(u8 taskId) { SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); else SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); DestroyAnimVisualTask(taskId); } static void AnimUnusedBagSteal(struct Sprite *sprite) { sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[3] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = 0x7E; InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = -sprite->data[1]; sprite->data[4] = -sprite->data[2]; sprite->data[6] = 0xFFD8; sprite->callback = AnimUnusedBagSteal_Step; sprite->callback(sprite); } static void AnimUnusedBagSteal_Step(struct Sprite *sprite) { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->x2 = sprite->data[3] >> 8; sprite->y2 = sprite->data[4] >> 8; if (sprite->data[7] == 0) { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->x2 = sprite->data[3] >> 8; sprite->y2 = sprite->data[4] >> 8; --sprite->data[0]; } sprite->y2 += Sin(sprite->data[5], sprite->data[6]); sprite->data[5] = (sprite->data[5] + 3) & 0xFF; if (sprite->data[5] > 0x7F) { sprite->data[5] = 0; sprite->data[6] += 20; ++sprite->data[7]; } if (--sprite->data[0] == 0) DestroyAnimSprite(sprite); } // Move sprite inward for Bite/Crunch and Clamp static void AnimBite(struct Sprite *sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[4]; sprite->data[2] = gBattleAnimArgs[5]; sprite->callback = AnimBite_Step1; } static void AnimBite_Step1(struct Sprite *sprite) { sprite->data[4] += sprite->data[0]; sprite->data[5] += sprite->data[1]; sprite->x2 = sprite->data[4] >> 8; sprite->y2 = sprite->data[5] >> 8; if (++sprite->data[3] == sprite->data[2]) sprite->callback = AnimBite_Step2; } static void AnimBite_Step2(struct Sprite *sprite) { sprite->data[4] -= sprite->data[0]; sprite->data[5] -= sprite->data[1]; sprite->x2 = sprite->data[4] >> 8; sprite->y2 = sprite->data[5] >> 8; if (--sprite->data[3] == 0) DestroySpriteAndMatrix(sprite); } // Launches a tear drop away from the battler. Used by Fake Tears static void AnimTearDrop(struct Sprite *sprite) { u8 battler; s8 xOffset; if (gBattleAnimArgs[0] == ANIM_ATTACKER) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; xOffset = 20; sprite->oam.tileNum += 4; switch (gBattleAnimArgs[1]) { case 0: sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 8; sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8; break; case 1: sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 14; sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16; break; case 2: sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 8; sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8; StartSpriteAffineAnim(sprite, 1); xOffset = -20; break; case 3: sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 14; sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16; StartSpriteAffineAnim(sprite, 1); xOffset = -20; break; } sprite->data[0] = 32; sprite->data[2] = sprite->x + xOffset; sprite->data[4] = sprite->y + 12; sprite->data[5] = -12; InitAnimArcTranslation(sprite); sprite->callback = AnimTearDrop_Step; } static void AnimTearDrop_Step(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) DestroySpriteAndMatrix(sprite); } void AnimTask_MoveAttackerMementoShadow(u8 taskId) { struct ScanlineEffectParams scanlineParams; struct BattleAnimBgData animBg; u32 i; u8 pos; s32 var0; struct Task *task = &gTasks[taskId]; task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 31; task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) - 7; task->data[5] = task->data[7]; task->data[4] = task->data[6]; task->data[13] = (task->data[7] - task->data[6]) << 8; pos = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); task->data[14] = pos - 32; task->data[15] = pos + 32; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) task->data[8] = -12; else task->data[8] = -64; task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); if (task->data[3] == 1) { GetBattleAnimBg1Data(&animBg); task->data[10] = gBattle_BG1_Y; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); FillPalette(RGB_BLACK, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); scanlineParams.dmaDest = ®_BG1VOFS; var0 = WINOUT_WIN01_BG1; if (!IsContest()) gBattle_BG2_X += DISPLAY_WIDTH; } else { task->data[10] = gBattle_BG2_Y; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); FillPalette(RGB_BLACK, BG_PLTT_ID(9), PLTT_SIZE_4BPP); scanlineParams.dmaDest = ®_BG2VOFS; var0 = WINOUT_WIN01_BG2; if (!IsContest()) gBattle_BG1_X += DISPLAY_WIDTH; } scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; task->data[11] = 0; task->data[12] = 16; task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; SetAllBattlersSpritePriority(3); for (i = 0; i < 112; ++i) { gScanlineEffectRegBuffers[0][i] = task->data[10]; gScanlineEffectRegBuffers[1][i] = task->data[10]; } ScanlineEffect_SetParams(scanlineParams); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR))); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; gBattle_WIN0V = DISPLAY_HEIGHT; task->func = AnimTask_MoveAttackerMementoShadow_Step; } static void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (++task->data[1] > 1) { task->data[1] = 0; if (++task->data[2] & 1) { if (task->data[11] != 12) ++task->data[11]; } else if (task->data[12] != 8) { --task->data[12]; } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12])); if (task->data[11] == 12 && task->data[12] == 8) ++task->data[0]; } break; case 1: task->data[4] -= 8; DoMementoShadowEffect(task); if (task->data[4] < task->data[8]) ++task->data[0]; break; case 2: task->data[4] -= 8; DoMementoShadowEffect(task); task->data[14] += 4; task->data[15] -= 4; if (task->data[14] >= task->data[15]) task->data[14] = task->data[15]; gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; if (task->data[14] == task->data[15]) ++task->data[0]; break; case 3: gScanlineEffect.state = 3; ++task->data[0]; break; case 4: DestroyAnimVisualTask(taskId); break; } } void AnimTask_MoveTargetMementoShadow(u8 taskId) { struct BattleAnimBgData animBg; struct ScanlineEffectParams scanlineParams; u8 x; u32 i; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (IsContest() == TRUE) { gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); DestroyAnimVisualTask(taskId); } else { task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget); if (task->data[3] == 1) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); gBattle_BG2_X += DISPLAY_WIDTH; } else { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); gBattle_BG1_X += DISPLAY_WIDTH; } ++task->data[0]; } break; case 1: if (task->data[3] == 1) { GetBattleAnimBg1Data(&animBg); task->data[10] = gBattle_BG1_Y; FillPalette(RGB_BLACK, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); } else { task->data[10] = gBattle_BG2_Y; FillPalette(RGB_BLACK, BG_PLTT_ID(9), PLTT_SIZE_4BPP); } SetAllBattlersSpritePriority(3); ++task->data[0]; break; case 2: task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 31; task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) - 7; task->data[13] = (task->data[7] - task->data[6]) << 8; x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); task->data[14] = x - 4; task->data[15] = x + 4; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) task->data[8] = -12; else task->data[8] = -64; task->data[4] = task->data[8]; task->data[5] = task->data[8]; task->data[11] = 12; task->data[12] = 8; ++task->data[0]; break; case 3: if (task->data[3] == 1) scanlineParams.dmaDest = ®_BG1VOFS; else scanlineParams.dmaDest = ®_BG2VOFS; for (i = 0; i < 112; ++i) { gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i); gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i); } scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; ScanlineEffect_SetParams(scanlineParams); ++task->data[0]; break; case 4: if (task->data[3] == 1) SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); else SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; gBattle_WIN0V = DISPLAY_HEIGHT; task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8)); task->func = AnimTask_MoveTargetMementoShadow_Step; break; } } static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId) { u8 pos; u32 i; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[5] += 8; if (task->data[5] >= task->data[7]) task->data[5] = task->data[7]; DoMementoShadowEffect(task); if (task->data[5] == task->data[7]) ++task->data[0]; break; case 1: if (task->data[15] - task->data[14] < 0x40) { task->data[14] -= 4; task->data[15] += 4; } else { task->data[1] = 1; } gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; task->data[4] += 8; if (task->data[4] >= task->data[6]) task->data[4] = task->data[6]; DoMementoShadowEffect(task); if (task->data[4] == task->data[6] && task->data[1]) { task->data[1] = 0; ++task->data[0]; } break; case 2: if (++task->data[1] > 1) { task->data[1] = 0; ++task->data[2]; if (task->data[2] & 1) { if (task->data[11]) --task->data[11]; } else if (task->data[12] < 16) { ++task->data[12]; } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12])); if (task->data[11] == 0 && task->data[12] == 16) ++task->data[0]; } break; case 3: gScanlineEffect.state = 3; ++task->data[0]; break; case 4: gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); DestroyAnimVisualTask(taskId); break; } } static void DoMementoShadowEffect(struct Task *task) { s32 var0, var1, var4; s16 var2, i; var2 = task->data[5] - task->data[4]; if (var2 != 0) { var0 = task->data[13] / var2; var1 = task->data[6] << 8; for (i = 0; i < task->data[4]; ++i) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159); for (i = task->data[4]; i <= task->data[5]; ++i) { if (i >= 0) { s16 var3 = (var1 >> 8) - i; gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10]; } var1 += var0; } var4 = task->data[10] - (i - 159); for (; i < task->data[7]; ++i) if (i >= 0) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4--; } else { var4 = task->data[10] + 159; for (i = 0; i < 112; ++i) { gScanlineEffectRegBuffers[0][i] = var4; gScanlineEffectRegBuffers[1][i] = var4; --var4; } } } static void SetAllBattlersSpritePriority(u8 priority) { u32 i; for (i = 0; i < MAX_BATTLERS_COUNT; ++i) { u8 spriteId = GetAnimBattlerSpriteId(i); if (spriteId != SPRITE_NONE) gSprites[spriteId].oam.priority = priority; } } void AnimTask_InitMementoShadow(u8 taskId) { bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE; MoveBattlerSpriteToBG(gBattleAnimAttacker, toBG2); gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = FALSE; if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) { MoveBattlerSpriteToBG(gBattleAnimAttacker ^ 2, toBG2 ^ 1); gSprites[gBattlerSpriteIds[gBattleAnimAttacker ^ 2]].invisible = FALSE; } DestroyAnimVisualTask(taskId); } void AnimTask_MementoHandleBg(u8 taskId) { bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE; ResetBattleAnimBg(toBG2); if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) ResetBattleAnimBg(toBG2 ^ 1); DestroyAnimVisualTask(taskId); } // Animates a deep slash from a claw. Used by Metal Claw, Dragon Claw, and Crush Claw static void AnimClawSlash(struct Sprite *sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; StartSpriteAnim(sprite, gBattleAnimArgs[2]); sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Makes the attacker metallic and shining. // Used by MOVE_HARDEN and MOVE_IRON_DEFENSE. // arg0: if true won't change battler's palette back // arg1: if true, use custom color // arg2: custom color // Custom color argument is used in MOVE_POISON_TAIL to make the mon turn purplish/pinkish as if became cloaked in poison. void AnimTask_MetallicShine(u8 taskId) { u16 species; u8 spriteId, newSpriteId; u16 paletteNum; struct BattleAnimBgData animBg; bool32 priorityChanged = FALSE; gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); if (IsDoubleBattle() && !IsContest()) { if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT) { if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE) { gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority--; SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); priorityChanged = TRUE; } } } if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap); AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset); LoadCompressedPalette(gMetalShinePalette, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); gBattle_BG1_X = -gSprites[spriteId].x + 96; gBattle_BG1_Y = -gSprites[spriteId].y + 32; paletteNum = 16 + gSprites[spriteId].oam.paletteNum; if (gBattleAnimArgs[1] == 0) SetGreyscaleOrOriginalPalette(paletteNum, FALSE); else BlendPalette(PLTT_ID(paletteNum), 16, 11, gBattleAnimArgs[2]); gTasks[taskId].data[0] = newSpriteId; gTasks[taskId].data[1] = gBattleAnimArgs[0]; gTasks[taskId].data[2] = gBattleAnimArgs[1]; gTasks[taskId].data[3] = gBattleAnimArgs[2]; gTasks[taskId].data[6] = priorityChanged; gTasks[taskId].func = AnimTask_MetallicShine_Step; } static void AnimTask_MetallicShine_Step(u8 taskId) { struct BattleAnimBgData animBg; u16 paletteNum; u8 spriteId; gTasks[taskId].data[10] += 4; gBattle_BG1_X -= 4; if (gTasks[taskId].data[10] == 128) { gTasks[taskId].data[10] = 0; gBattle_BG1_X += 128; gTasks[taskId].data[11]++; if (gTasks[taskId].data[11] == 2) { spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); paletteNum = 16 + gSprites[spriteId].oam.paletteNum; if (gTasks[taskId].data[1] == 0) SetGreyscaleOrOriginalPalette(paletteNum, 1); DestroySprite(&gSprites[gTasks[taskId].data[0]]); GetBattleAnimBg1Data(&animBg); InitBattleAnimBg(animBg.bgId); if (gTasks[taskId].data[6] == 1) gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority++; } else if (gTasks[taskId].data[11] == 3) { gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimVisualTask(taskId); } } } // Changes battler's palette to either greyscale or original. // arg0: which battler // arg1: 0 grayscale, 1 original void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId) { u8 spriteId, battler; bool8 calcSpriteId = FALSE; u8 position = B_POSITION_PLAYER_LEFT; switch (gBattleAnimArgs[0]) { case ANIM_ATTACKER: case ANIM_TARGET: case ANIM_ATK_PARTNER: case ANIM_DEF_PARTNER: spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); break; case 4: position = B_POSITION_PLAYER_LEFT; calcSpriteId = TRUE; break; case 5: position = B_POSITION_PLAYER_RIGHT; calcSpriteId = TRUE; break; case 6: position = B_POSITION_OPPONENT_LEFT; calcSpriteId = TRUE; break; case 7: position = B_POSITION_OPPONENT_RIGHT; calcSpriteId = TRUE; break; default: spriteId = SPRITE_NONE; break; } if (calcSpriteId) { battler = GetBattlerAtPosition(position); if (IsBattlerSpriteVisible(battler)) spriteId = gBattlerSpriteIds[battler]; else spriteId = SPRITE_NONE; } if (spriteId != SPRITE_NONE) SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]); DestroyAnimVisualTask(taskId); } void GetIsDoomDesireHitTurn(u8 taskId) { if (gAnimMoveTurn < 2) gBattleAnimArgs[ARG_RET_ID] = FALSE; if (gAnimMoveTurn == 2) gBattleAnimArgs[ARG_RET_ID] = TRUE; DestroyAnimVisualTask(taskId); } ================================================ FILE: src/battle_anim_dragon.c ================================================ #include "global.h" #include "battle_anim.h" #include "scanline_effect.h" #include "task.h" #include "trig.h" static void AnimOutrageFlame(struct Sprite *sprite); static void AnimDragonFireToTarget(struct Sprite *sprite); static void AnimDragonRageFirePlume(struct Sprite *sprite); static void AnimDragonDanceOrb(struct Sprite *sprite); static void AnimOverheatFlame(struct Sprite *sprite); static void AnimDragonDanceOrb_Step(struct Sprite *sprite); static void AnimTask_DragonDanceWaver_Step(u8 taskId); static void UpdateDragonDanceScanlineEffect(struct Task *task); static void AnimOverheatFlame_Step(struct Sprite *sprite); static EWRAM_DATA u16 sUnusedOverheatData[7] = {0}; static const union AnimCmd sAnim_OutrageOverheatFire_0[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_FRAME(64, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_OutrageOverheatFire[] = { sAnim_OutrageOverheatFire_0, }; const struct SpriteTemplate gOutrageFlameSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_OutrageOverheatFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOutrageFlame, }; static const union AnimCmd sAnim_DragonBreathFire_0[] = { ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_DragonBreathFire_1[] = { ANIMCMD_FRAME(16, 3, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(32, 3, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(48, 3, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_DragonBreathFire[] = { sAnim_DragonBreathFire_0, sAnim_DragonBreathFire_1, }; static const union AffineAnimCmd sAffineAnim_DragonBreathFire_0[] = { AFFINEANIMCMD_FRAME(0x50, 0x50, 127, 0), AFFINEANIMCMD_FRAME(0xD, 0xD, 0, 100), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_DragonBreathFire_1[] = { AFFINEANIMCMD_FRAME(0x50, 0x50, 0, 0), AFFINEANIMCMD_FRAME(0xD, 0xD, 0, 100), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_DragonBreathFire[] = { sAffineAnim_DragonBreathFire_0, sAffineAnim_DragonBreathFire_1, }; const struct SpriteTemplate gDragonBreathFireSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = sAnims_DragonBreathFire, .images = NULL, .affineAnims = sAffineAnims_DragonBreathFire, .callback = AnimDragonFireToTarget, }; const union AnimCmd sAnim_DragonRageFirePlume[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(32, 5), ANIMCMD_FRAME(48, 5), ANIMCMD_FRAME(64, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_DragonRageFirePlume[] = { sAnim_DragonRageFirePlume, }; const struct SpriteTemplate gDragonRageFirePlumeSpriteTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_FIRE_PLUME, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_DragonRageFirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDragonRageFirePlume, }; static const union AnimCmd sAnim_DragonRageFire[] = { ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_DragonRageFire[] = { sAnim_DragonRageFire, sAnim_DragonRageFire, }; static const union AffineAnimCmd sAffineAnim_DragonRageFire_0[] = { AFFINEANIMCMD_FRAME(0x64, 0x64, 127, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_DragonRageFire_1[] = { AFFINEANIMCMD_FRAME(0x64, 0x64, 0, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_DragonRageFire[] = { sAffineAnim_DragonRageFire_0, sAffineAnim_DragonRageFire_1, }; const struct SpriteTemplate gDragonRageFireSpitSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = sAnims_DragonRageFire, .images = NULL, .affineAnims = sAffineAnims_DragonRageFire, .callback = AnimDragonFireToTarget, }; const struct SpriteTemplate gDragonDanceOrbSpriteTemplate = { .tileTag = ANIM_TAG_HOLLOW_ORB, .paletteTag = ANIM_TAG_HOLLOW_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDragonDanceOrb, }; const struct SpriteTemplate gOverheatFlameSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_OutrageOverheatFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOverheatFlame, }; static void AnimOutrageFlame(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[0]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; gBattleAnimArgs[4] = -gBattleAnimArgs[4]; } else { sprite->x += gBattleAnimArgs[0]; } sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[4]; sprite->data[5] = gBattleAnimArgs[5]; sprite->invisible = TRUE; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteLinearAndFlicker; } static void StartDragonFireTranslation(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[1]; sprite->data[2] -= gBattleAnimArgs[2]; sprite->data[4] += gBattleAnimArgs[3]; } else { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[2] += gBattleAnimArgs[2]; sprite->data[4] += gBattleAnimArgs[3]; StartSpriteAnim(sprite, 1); } sprite->data[0] = gBattleAnimArgs[4]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } static void AnimDragonRageFirePlume(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); } SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[1]); sprite->y += gBattleAnimArgs[2]; sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } // For Dragon Breath and Dragon Rage static void AnimDragonFireToTarget(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) StartSpriteAffineAnim(sprite, 1); StartDragonFireTranslation(sprite); } static void AnimDragonDanceOrb(struct Sprite *sprite) { u16 r5; u16 r0; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[4] = 0; sprite->data[5] = 1; sprite->data[6] = gBattleAnimArgs[0]; r5 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_HEIGHT); r0 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_WIDTH); if (r5 > r0) sprite->data[7] = r5 / 2; else sprite->data[7] = r0 / 2; sprite->x2 = Cos(sprite->data[6], sprite->data[7]); sprite->y2 = Sin(sprite->data[6], sprite->data[7]); sprite->callback = AnimDragonDanceOrb_Step; } static void AnimDragonDanceOrb_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF; sprite->x2 = Cos(sprite->data[6], sprite->data[7]); sprite->y2 = Sin(sprite->data[6], sprite->data[7]); if (++sprite->data[4] > 5) { sprite->data[4] = 0; if (sprite->data[5] <= 15 && ++sprite->data[5] > 15) sprite->data[5] = 16; } if (++sprite->data[3] > 0x3C) { sprite->data[3] = 0; ++sprite->data[0]; } break; case 1: sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF; if (sprite->data[7] <= 0x95 && (sprite->data[7] += 8) > 0x95) sprite->data[7] = 0x96; sprite->x2 = Cos(sprite->data[6], sprite->data[7]); sprite->y2 = Sin(sprite->data[6], sprite->data[7]); if (++sprite->data[4] > 5) { sprite->data[4] = 0; if (sprite->data[5] <= 15 && ++sprite->data[5] > 15) sprite->data[5] = 16; } if (++sprite->data[3] > 20) DestroyAnimSprite(sprite); break; } } // Wavers the attacker back and forth. Progressing vertical wave of scanline shifts // Used by Dragon Dance void AnimTask_DragonDanceWaver(u8 taskId) { struct ScanlineEffectParams scanlineParams; struct Task *task = &gTasks[taskId]; u32 i; u8 r1; if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) { scanlineParams.dmaDest = ®_BG1HOFS; task->data[2] = gBattle_BG1_X; } else { scanlineParams.dmaDest = ®_BG2HOFS; task->data[2] = gBattle_BG2_X; } scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; r1 = GetBattlerYCoordWithElevation(gBattleAnimAttacker); task->data[3] = r1 - 32; task->data[4] = r1 + 32; if (task->data[3] < 0) task->data[3] = 0; for (i = task->data[3]; i <= task->data[4]; ++i) { gScanlineEffectRegBuffers[0][i] = task->data[2]; gScanlineEffectRegBuffers[1][i] = task->data[2]; } ScanlineEffect_SetParams(scanlineParams); task->func = AnimTask_DragonDanceWaver_Step; } static void AnimTask_DragonDanceWaver_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (++task->data[7] > 1) { task->data[7] = 0; if (++task->data[6] == 3) ++task->data[0]; } UpdateDragonDanceScanlineEffect(task); break; case 1: if (++task->data[1] > 0x3C) ++task->data[0]; UpdateDragonDanceScanlineEffect(task); break; case 2: if (++task->data[7] > 1) { task->data[7] = 0; if (--task->data[6] == 0) ++task->data[0]; } UpdateDragonDanceScanlineEffect(task); break; case 3: gScanlineEffect.state = 3; ++task->data[0]; break; case 4: DestroyAnimVisualTask(taskId); break; } } static void UpdateDragonDanceScanlineEffect(struct Task *task) { u16 i, r3 = task->data[5]; for (i = task->data[3]; i <= task->data[4]; ++i) { gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = ((gSineTable[r3] * task->data[6]) >> 7) + task->data[2]; r3 = (r3 + 8) & 0xFF; } task->data[5] = (task->data[5] + 9) & 0xFF; } static void AnimOverheatFlame(struct Sprite *sprite) { s32 i, yAmplitude = (gBattleAnimArgs[2] * 3) / 5; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[4]; sprite->data[1] = Cos(gBattleAnimArgs[1], gBattleAnimArgs[2]); sprite->data[2] = Sin(gBattleAnimArgs[1], yAmplitude); sprite->x += sprite->data[1] * gBattleAnimArgs[0]; sprite->y += sprite->data[2] * gBattleAnimArgs[0]; sprite->data[3] = gBattleAnimArgs[3]; sprite->callback = AnimOverheatFlame_Step; for (i = 0; i < 7; ++i) sUnusedOverheatData[i] = sprite->data[i]; } static void AnimOverheatFlame_Step(struct Sprite *sprite) { sprite->data[4] += sprite->data[1]; sprite->data[5] += sprite->data[2]; sprite->x2 = sprite->data[4] / 10; sprite->y2 = sprite->data[5] / 10; if (++sprite->data[0] > sprite->data[3]) DestroyAnimSprite(sprite); } ================================================ FILE: src/battle_anim_effects_1.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "battle_interface.h" #include "random.h" #include "trig.h" #include "util.h" #include "constants/songs.h" struct { s16 startX; s16 startY; s16 targetX; s16 targetY; } static EWRAM_DATA sFrenzyPlantRootData = {0}; // Debug? Written to but never read. static void AnimMovePowderParticle(struct Sprite *); static void AnimMovePowderParticle_Step(struct Sprite *); static void AnimSolarBeamSmallOrb(struct Sprite *); static void AnimSolarBeamSmallOrb_Step(struct Sprite *); static void AnimSolarBeamBigOrb(struct Sprite *); static void AnimPowerAbsorptionOrb(struct Sprite *); static void AnimAbsorptionOrb(struct Sprite *); static void AnimAbsorptionOrb_Step(struct Sprite *); static void AnimHyperBeamOrb(struct Sprite *); static void AnimHyperBeamOrb_Step(struct Sprite *); static void AnimMimicOrb(struct Sprite *); static void AnimLeechSeed(struct Sprite *); static void AnimLeechSeed_Step(struct Sprite *); static void AnimLeechSeedSprouts(struct Sprite *); static void AnimSporeParticle(struct Sprite *); static void AnimSporeParticle_Step(struct Sprite *); static void AnimPetalDanceBigFlower(struct Sprite *); static void AnimPetalDanceBigFlower_Step(struct Sprite *); static void AnimPetalDanceSmallFlower(struct Sprite *); static void AnimPetalDanceSmallFlower_Step(struct Sprite *); static void AnimRazorLeafParticle(struct Sprite *); static void AnimRazorLeafParticle_Step1(struct Sprite *); static void AnimRazorLeafParticle_Step2(struct Sprite *); static void AnimIngrainRoot(struct Sprite *); static void AnimFrenzyPlantRoot(struct Sprite *); static void AnimIngrainOrb(struct Sprite *); static void AnimTranslateLinearSingleSineWave(struct Sprite *); static void AnimTranslateLinearSingleSineWave_Step(struct Sprite *); static void AnimMoveTwisterParticle_Step(struct Sprite *); static void AnimConstrictBinding(struct Sprite *); static void AnimConstrictBinding_Step1(struct Sprite *); static void AnimConstrictBinding_Step2(struct Sprite *); static void AnimTask_DuplicateAndShrinkToPos_Step1(u8); static void AnimTask_DuplicateAndShrinkToPos_Step2(u8); static void AnimKnockOffItem(struct Sprite *); static void AnimPresent(struct Sprite *); static void AnimPresentHealParticle(struct Sprite *); static void AnimItemSteal(struct Sprite *); static void AnimItemSteal_Step3(struct Sprite *); static void AnimRootFlickerOut(struct Sprite *); static void AnimTrickBag(struct Sprite *); static void AnimTrickBag_Step1(struct Sprite *); static void AnimTrickBag_Step2(struct Sprite *); static void AnimTrickBag_Step3(struct Sprite *); static void AnimTask_LeafBlade_Step(u8); static s16 LeafBladeGetPosFactor(struct Sprite *); static void AnimTask_LeafBlade_Step2(struct Task *, u8); static void AnimTask_LeafBlade_Step2_Callback(struct Sprite *); static void AnimFlyingParticle(struct Sprite *); static void AnimFlyingParticle_Step(struct Sprite *); static void AnimNeedleArmSpike(struct Sprite *); static void AnimNeedleArmSpike_Step(struct Sprite *); static void AnimSlice_Step(struct Sprite *); static void AnimCirclingMusicNote(struct Sprite *); static void AnimCirclingMusicNote_Step(struct Sprite *); static void AnimProtect(struct Sprite *); static void AnimProtect_Step(struct Sprite *); static void AnimMilkBottle(struct Sprite *); static void AnimMilkBottle_Step1(struct Sprite *); static void AnimMilkBottle_Step2(struct Sprite *, int, int); static void AnimBubbleBurst(struct Sprite *); static void AnimBubbleBurst_Step(struct Sprite *); static void AnimSleepLetterZ(struct Sprite *); static void AnimSleepLetterZ_Step(struct Sprite *); static void AnimLockOnTarget(struct Sprite *); static void AnimLockOnTarget_Step1(struct Sprite *); static void AnimLockOnTarget_Step2(struct Sprite *); static void AnimLockOnTarget_Step3(struct Sprite *); static void AnimLockOnTarget_Step4(struct Sprite *); static void AnimLockOnTarget_Step5(struct Sprite *); static void AnimLockOnTarget_Step6(struct Sprite *); static void AnimLockOnMoveTarget(struct Sprite *); static void AnimBowMon(struct Sprite *); static void AnimBowMon_Step1(struct Sprite *); static void AnimBowMon_Step1_Callback(struct Sprite *); static void AnimBowMon_Step2(struct Sprite *); static void AnimBowMon_Step3(struct Sprite *); static void AnimBowMon_Step4(struct Sprite *); static void AnimBowMon_Step3_Callback(struct Sprite *); static void AnimTipMon(struct Sprite *sprite); static void AnimTipMon_Step(struct Sprite *); static void AnimTask_SkullBashPositionSet(u8); static void AnimTask_SkullBashPositionReset(u8); static void AnimSlashSlice(struct Sprite *); static void AnimFalseSwipeSlice(struct Sprite *); static void AnimFalseSwipeSlice_Step1(struct Sprite *); static void AnimFalseSwipeSlice_Step2(struct Sprite *); static void AnimFalseSwipeSlice_Step3(struct Sprite *); static void AnimFalseSwipePositionedSlice(struct Sprite *); static void AnimEndureEnergy(struct Sprite *); static void AnimEndureEnergy_Step(struct Sprite *); static void AnimSharpenSphere(struct Sprite *); static void AnimSharpenSphere_Step(struct Sprite *); static void AnimConversion(struct Sprite *); static void AnimConversion2(struct Sprite *); static void AnimConversion2_Step(struct Sprite *); static void AnimMoon(struct Sprite *); static void AnimMoon_Step(struct Sprite *); static void AnimMoonlightSparkle(struct Sprite *); static void AnimMoonlightSparkle_Step(struct Sprite *); static void AnimHornHit(struct Sprite *); static void AnimHornHit_Step(struct Sprite *); static void AnimTask_DoubleTeam_Step(u8); static void AnimDoubleTeam(struct Sprite *); static void AnimWavyMusicNotes(struct Sprite *); static void AnimWavyMusicNotes_CalcVelocity(s16, s16, s16 *, s16 *, s8); static void AnimWavyMusicNotes_Step(struct Sprite *); static void AnimFlyingMusicNotes(struct Sprite *); static void AnimFlyingMusicNotes_Step(struct Sprite *); static void AnimSlowFlyingMusicNotes(struct Sprite *); static void AnimSlowFlyingMusicNotes_Step(struct Sprite *); static void AnimThoughtBubble(struct Sprite *); static void AnimThoughtBubble_Step(struct Sprite *); static void AnimMetronomeFinger(struct Sprite *); static void AnimMetronomeFinger_Step(struct Sprite *); static void AnimFollowMeFinger(struct Sprite *); static void AnimFollowMeFinger_Step1(struct Sprite *); static void AnimFollowMeFinger_Step2(struct Sprite *); static void AnimTauntFinger(struct Sprite *); static void AnimTauntFinger_Step1(struct Sprite *); static void AnimTauntFinger_Step2(struct Sprite *); static void AnimBellyDrumHand(struct Sprite *); static void AnimSuperFang(struct Sprite *); static void AnimGrantingStars(struct Sprite *); static void AnimSparklingStars(struct Sprite *); static void AnimCuttingSlice(struct Sprite *); static void AnimAirCutterSlice(struct Sprite *); static void AnimFlickeringPunch(struct Sprite *); static void AnimSlidingHit(struct Sprite *); static void AnimWhipHit(struct Sprite *); static const u8 sUnused[] = {2, 4, 1, 3}; static const union AnimCmd sPowderParticlesAnimCmds[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(6, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_FRAME(10, 5), ANIMCMD_FRAME(12, 5), ANIMCMD_FRAME(14, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sPowderParticlesAnimTable[] = { sPowderParticlesAnimCmds, }; const struct SpriteTemplate gSleepPowderParticleSpriteTemplate = { .tileTag = ANIM_TAG_SLEEP_POWDER, .paletteTag = ANIM_TAG_SLEEP_POWDER, .oam = &gOamData_AffineOff_ObjNormal_8x16, .anims = sPowderParticlesAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMovePowderParticle, }; const struct SpriteTemplate gStunSporeParticleSpriteTemplate = { .tileTag = ANIM_TAG_STUN_SPORE, .paletteTag = ANIM_TAG_STUN_SPORE, .oam = &gOamData_AffineOff_ObjNormal_8x16, .anims = sPowderParticlesAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMovePowderParticle, }; const struct SpriteTemplate gPoisonPowderParticleSpriteTemplate = { .tileTag = ANIM_TAG_POISON_POWDER, .paletteTag = ANIM_TAG_POISON_POWDER, .oam = &gOamData_AffineOff_ObjNormal_8x16, .anims = sPowderParticlesAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMovePowderParticle, }; static const union AnimCmd sSolarBeamBigOrbAnimCmds1[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sSolarBeamBigOrbAnimCmds2[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END, }; static const union AnimCmd sSolarBeamBigOrbAnimCmds3[] = { ANIMCMD_FRAME(2, 1), ANIMCMD_END, }; static const union AnimCmd sSolarBeamBigOrbAnimCmds4[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_END, }; static const union AnimCmd sSolarBeamBigOrbAnimCmds5[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; static const union AnimCmd sSolarBeamBigOrbAnimCmds6[] = { ANIMCMD_FRAME(5, 1), ANIMCMD_END, }; static const union AnimCmd sSolarBeamBigOrbAnimCmds7[] = { ANIMCMD_FRAME(6, 1), ANIMCMD_END, }; static const union AnimCmd sSolarBeamSmallOrbAnimCms[] = { ANIMCMD_FRAME(7, 1), ANIMCMD_END, }; static const union AnimCmd sPowerAbsorptionOrbAnimCmds[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END, }; static const union AnimCmd *const sSolarBeamBigOrbAnimTable[] = { sSolarBeamBigOrbAnimCmds1, sSolarBeamBigOrbAnimCmds2, sSolarBeamBigOrbAnimCmds3, sSolarBeamBigOrbAnimCmds4, sSolarBeamBigOrbAnimCmds5, sSolarBeamBigOrbAnimCmds6, sSolarBeamBigOrbAnimCmds7, }; static const union AnimCmd *const sSolarBeamSmallOrbAnimTable[] = { sSolarBeamSmallOrbAnimCms, }; static const union AnimCmd *const sPowerAbsorptionOrbAnimTable[] = { sPowerAbsorptionOrbAnimCmds, }; static const union AffineAnimCmd sPowerAbsorptionOrbAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(-5, -5, 0, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sPowerAbsorptionOrbAffineAnimTable[] = { sPowerAbsorptionOrbAffineAnimCmds, }; const struct SpriteTemplate gPowerAbsorptionOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = sPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = sPowerAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb, }; const struct SpriteTemplate gSolarBeamBigOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSolarBeamBigOrb, }; const struct SpriteTemplate gSolarBeamSmallOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sSolarBeamSmallOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSolarBeamSmallOrb, }; static const union AffineAnimCmd sStockpileAbsorptionOrbAffineCmds[] = { AFFINEANIMCMD_FRAME(320, 320, 0, 0), AFFINEANIMCMD_FRAME(-14, -14, 0, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sStockpileAbsorptionOrbAffineAnimTable[] = { sStockpileAbsorptionOrbAffineCmds, }; const struct SpriteTemplate gStockpileAbsorptionOrbSpriteTemplate = { .tileTag = ANIM_TAG_GRAY_ORB, .paletteTag = ANIM_TAG_GRAY_ORB, .oam = &gOamData_AffineDouble_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sStockpileAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb, }; static const union AffineAnimCmd sAbsorptionOrbAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(-5, -5, 0, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAbsorptionOrbAffineAnimTable[] = { sAbsorptionOrbAffineAnimCmds, }; const struct SpriteTemplate gAbsorptionOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = sPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = sAbsorptionOrbAffineAnimTable, .callback = AnimAbsorptionOrb, }; const struct SpriteTemplate gHyperBeamOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb, }; static const union AnimCmd sLeechSeedAnimCmds1[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sLeechSeedAnimCmds2[] = { ANIMCMD_FRAME(4, 7), ANIMCMD_FRAME(8, 7), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sLeechSeedAnimTable[] = { sLeechSeedAnimCmds1, sLeechSeedAnimCmds2, }; const struct SpriteTemplate gLeechSeedSpriteTemplate = { .tileTag = ANIM_TAG_SEED, .paletteTag = ANIM_TAG_SEED, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sLeechSeedAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimLeechSeed, }; static const union AnimCmd sSporeParticleAnimCmds1[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sSporeParticleAnimCmds2[] = { ANIMCMD_FRAME(4, 7), ANIMCMD_END, }; static const union AnimCmd *const sSporeParticleAnimTable[] = { sSporeParticleAnimCmds1, sSporeParticleAnimCmds2, }; const struct SpriteTemplate gSporeParticleSpriteTemplate = { .tileTag = ANIM_TAG_SPORE, .paletteTag = ANIM_TAG_SPORE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sSporeParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSporeParticle, }; static const union AnimCmd sPetalDanceBigFlowerAnimCmds[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sPetalDanceSmallFlowerAnimCmds[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; static const union AnimCmd *const sPetalDanceBigFlowerAnimTable[] = { sPetalDanceBigFlowerAnimCmds, }; static const union AnimCmd *const sPetalDanceSmallFlowerAnimTable[] = { sPetalDanceSmallFlowerAnimCmds, }; const struct SpriteTemplate gPetalDanceBigFlowerSpriteTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sPetalDanceBigFlowerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPetalDanceBigFlower, }; const struct SpriteTemplate gPetalDanceSmallFlowerSpriteTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sPetalDanceSmallFlowerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPetalDanceSmallFlower, }; static const union AnimCmd sRazorLeafParticleAnimCmds1[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_FRAME(12, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(20, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(12, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_FRAME(4, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd sRazorLeafParticleAnimCmds2[] = { ANIMCMD_FRAME(24, 5), ANIMCMD_FRAME(28, 5), ANIMCMD_FRAME(32, 5), ANIMCMD_END, }; static const union AnimCmd *const sRazorLeafParticleAnimTable[] = { sRazorLeafParticleAnimCmds1, sRazorLeafParticleAnimCmds2, }; const struct SpriteTemplate gRazorLeafParticleSpriteTemplate = { .tileTag = ANIM_TAG_LEAF, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRazorLeafParticle, }; const struct SpriteTemplate gTwisterLeafSpriteTemplate = { .tileTag = ANIM_TAG_LEAF, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveTwisterParticle, }; static const union AnimCmd sRazorLeafCutterAnimCmds[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(0, 3, .hFlip = TRUE), ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(0, 3, .vFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sRazorLeafCutterAnimTable[] = { sRazorLeafCutterAnimCmds, }; const struct SpriteTemplate gRazorLeafCutterSpriteTemplate = { .tileTag = ANIM_TAG_RAZOR_LEAF, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = sRazorLeafCutterAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTranslateLinearSingleSineWave, }; static const union AffineAnimCmd sSwiftStarAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sSwiftStarAffineAnimTable[] = { sSwiftStarAffineAnimCmds, }; const struct SpriteTemplate gSwiftStarSpriteTemplate = { .tileTag = ANIM_TAG_YELLOW_STAR, .paletteTag = ANIM_TAG_YELLOW_STAR, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSwiftStarAffineAnimTable, .callback = AnimTranslateLinearSingleSineWave, }; static const union AnimCmd sAnim_ConstrictBinding[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(64, 4), ANIMCMD_FRAME(96, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_ConstrictBinding_Flipped[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .hFlip = TRUE), ANIMCMD_FRAME(64, 4, .hFlip = TRUE), ANIMCMD_FRAME(96, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_ConstrictBinding[] = { sAnim_ConstrictBinding, sAnim_ConstrictBinding_Flipped, }; static const union AffineAnimCmd sAffineAnim_ConstrictBinding[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-11, 0, 0, 6), AFFINEANIMCMD_FRAME(11, 0, 0, 6), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_ConstrictBinding_Flipped[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(11, 0, 0, 6), AFFINEANIMCMD_FRAME(-11, 0, 0, 6), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_ConstrictBinding[] = { sAffineAnim_ConstrictBinding, sAffineAnim_ConstrictBinding_Flipped, }; const struct SpriteTemplate gConstrictBindingSpriteTemplate = { .tileTag = ANIM_TAG_TENDRILS, .paletteTag = ANIM_TAG_TENDRILS, .oam = &gOamData_AffineNormal_ObjNormal_64x32, .anims = sAnims_ConstrictBinding, .images = NULL, .affineAnims = sAffineAnims_ConstrictBinding, .callback = AnimConstrictBinding, }; static const union AffineAnimCmd sMimicOrbAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 0), AFFINEANIMCMD_FRAME(48, 48, 0, 14), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sMimicOrbAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(-16, -16, 0, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sMimicOrbAffineAnimTable[] = { sMimicOrbAffineAnimCmds1, sMimicOrbAffineAnimCmds2, }; const struct SpriteTemplate gMimicOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = sPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = sMimicOrbAffineAnimTable, .callback = AnimMimicOrb, }; static const union AnimCmd sIngrainRootAnimCmds1[] = { ANIMCMD_FRAME(0, 7), ANIMCMD_FRAME(16, 7), ANIMCMD_FRAME(32, 7), ANIMCMD_FRAME(48, 7), ANIMCMD_END, }; static const union AnimCmd sIngrainRootAnimCmds2[] = { ANIMCMD_FRAME(0, 7, .hFlip = TRUE), ANIMCMD_FRAME(16, 7, .hFlip = TRUE), ANIMCMD_FRAME(32, 7, .hFlip = TRUE), ANIMCMD_FRAME(48, 7, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sIngrainRootAnimCmds3[] = { ANIMCMD_FRAME(0, 7), ANIMCMD_FRAME(16, 7), ANIMCMD_FRAME(32, 7), ANIMCMD_END, }; static const union AnimCmd sIngrainRootAnimCmds4[] = { ANIMCMD_FRAME(0, 7, .hFlip = TRUE), ANIMCMD_FRAME(16, 7, .hFlip = TRUE), ANIMCMD_FRAME(32, 7, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sIngrainRootAnimTable[] = { sIngrainRootAnimCmds1, sIngrainRootAnimCmds2, sIngrainRootAnimCmds3, sIngrainRootAnimCmds4, }; const struct SpriteTemplate gIngrainRootSpriteTemplate = { .tileTag = ANIM_TAG_ROOTS, .paletteTag = ANIM_TAG_ROOTS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sIngrainRootAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimIngrainRoot, }; const struct SpriteTemplate gFrenzyPlantRootSpriteTemplate = { .tileTag = ANIM_TAG_ROOTS, .paletteTag = ANIM_TAG_ROOTS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sIngrainRootAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFrenzyPlantRoot, }; static const union AnimCmd sIngrainOrbAnimCmds[] = { ANIMCMD_FRAME(3, 3), ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sIngrainOrbAnimTable[] = { sIngrainOrbAnimCmds, }; const struct SpriteTemplate gIngrainOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sIngrainOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimIngrainOrb, }; static const union AnimCmd sFallingBagAnimCmds[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END, }; static const union AnimCmd *const sFallingBagAnimTable[] = { sFallingBagAnimCmds, }; static const union AffineAnimCmd sFallingBagAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0, 0, -4, 10), AFFINEANIMCMD_FRAME(0, 0, 4, 20), AFFINEANIMCMD_FRAME(0, 0, -4, 10), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sFallingBagAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0, 0, -1, 2), AFFINEANIMCMD_FRAME(0, 0, 1, 4), AFFINEANIMCMD_FRAME(0, 0, -1, 4), AFFINEANIMCMD_FRAME(0, 0, 1, 4), AFFINEANIMCMD_FRAME(0, 0, -1, 4), AFFINEANIMCMD_FRAME(0, 0, 1, 2), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sFallingBagAffineAnimTable[] = { sFallingBagAffineAnimCmds1, sFallingBagAffineAnimCmds2, }; const struct SpriteTemplate gPresentSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sFallingBagAnimTable, .images = NULL, .affineAnims = sFallingBagAffineAnimTable, .callback = AnimPresent, }; const struct SpriteTemplate gKnockOffItemSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sFallingBagAnimTable, .images = NULL, .affineAnims = sFallingBagAffineAnimTable, .callback = AnimKnockOffItem, }; static const union AnimCmd sPresentHealParticleAnimCmds[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(12, 4), ANIMCMD_END, }; static const union AnimCmd *const sPresentHealParticleAnimTable[] = { sPresentHealParticleAnimCmds, }; const struct SpriteTemplate gPresentHealParticleSpriteTemplate = { .tileTag = ANIM_TAG_GREEN_SPARKLE, .paletteTag = ANIM_TAG_GREEN_SPARKLE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sPresentHealParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPresentHealParticle, }; const struct SpriteTemplate gItemStealSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sFallingBagAnimTable, .images = NULL, .affineAnims = sFallingBagAffineAnimTable, .callback = AnimItemSteal, }; static const union AffineAnimCmd sTrickBagAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 3), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sTrickBagAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0, -10, 0, 3), AFFINEANIMCMD_FRAME(0, -6, 0, 3), AFFINEANIMCMD_FRAME(0, -2, 0, 3), AFFINEANIMCMD_FRAME(0, 0, 0, 3), AFFINEANIMCMD_FRAME(0, 2, 0, 3), AFFINEANIMCMD_FRAME(0, 6, 0, 3), AFFINEANIMCMD_FRAME(0, 10, 0, 3), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sTrickBagAffineAnimTable[] = { sTrickBagAffineAnimCmds1, sTrickBagAffineAnimCmds2, sFallingBagAffineAnimCmds1, sFallingBagAffineAnimCmds2, }; const struct SpriteTemplate gTrickBagSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sFallingBagAnimTable, .images = NULL, .affineAnims = sTrickBagAffineAnimTable, .callback = AnimTrickBag, }; static const s8 gTrickBagCoordinates[][3] = { {5, 24, 1}, {0, 4, 0}, {8, 16, -1}, {0, 2, 0}, {8, 16, 1}, {0, 2, 0}, {8, 16, 1}, {0, 2, 0}, {8, 16, 1}, {0, 16, 0}, {0, 0, 127}, }; static const union AnimCmd sLeafBladeAnimCmds1[] = { ANIMCMD_FRAME(28, 1), ANIMCMD_END, }; static const union AnimCmd sLeafBladeAnimCmds2[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END, }; static const union AnimCmd sLeafBladeAnimCmds3[] = { ANIMCMD_FRAME(20, 1), ANIMCMD_END, }; static const union AnimCmd sLeafBladeAnimCmds4[] = { ANIMCMD_FRAME(28, 1, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sLeafBladeAnimCmds5[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END, }; static const union AnimCmd sLeafBladeAnimCmds6[] = { ANIMCMD_FRAME(16, 1, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sLeafBladeAnimCmds7[] = { ANIMCMD_FRAME(28, 1), ANIMCMD_END, }; static const union AnimCmd *const sLeafBladeAnimTable[] = { sLeafBladeAnimCmds1, sLeafBladeAnimCmds2, sLeafBladeAnimCmds3, sLeafBladeAnimCmds4, sLeafBladeAnimCmds5, sLeafBladeAnimCmds6, sLeafBladeAnimCmds7, }; const struct SpriteTemplate gLeafBladeSpriteTemplate = { .tileTag = ANIM_TAG_LEAF, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sLeafBladeAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const union AffineAnimCmd sAromatherapyBigFlowerAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 4, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sAromatherapyBigFlowerAffineAnimTable[] = { sAromatherapyBigFlowerAffineAnimCmds, }; const struct SpriteTemplate gAromatherapySmallFlowerSpriteTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sPetalDanceSmallFlowerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFlyingParticle, }; const struct SpriteTemplate gAromatherapyBigFlowerSpriteTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = sPetalDanceBigFlowerAnimTable, .images = NULL, .affineAnims = sAromatherapyBigFlowerAffineAnimTable, .callback = AnimFlyingParticle, }; static const union AffineAnimCmd sSilverWindBigSparkAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -10, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd sSilverWindMediumSparkAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(192, 192, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -12, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd sSilverWindSmallSparkAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(143, 143, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -15, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sSilverWindBigSparkAffineAnimTable[] = { sSilverWindBigSparkAffineAnimCmds, }; static const union AffineAnimCmd *const sSilverWindMediumSparkAffineAnimTable[] = { sSilverWindMediumSparkAffineAnimCmds, }; static const union AffineAnimCmd *const sSilverWindSmallSparkAffineAnimTable[] = { sSilverWindSmallSparkAffineAnimCmds, }; const struct SpriteTemplate gSilverWindBigSparkSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_6, .paletteTag = ANIM_TAG_SPARKLE_6, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSilverWindBigSparkAffineAnimTable, .callback = AnimFlyingParticle, }; const struct SpriteTemplate gSilverWindMediumSparkSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_6, .paletteTag = ANIM_TAG_SPARKLE_6, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSilverWindMediumSparkAffineAnimTable, .callback = AnimFlyingParticle, }; const struct SpriteTemplate gSilverWindSmallSparkSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_6, .paletteTag = ANIM_TAG_SPARKLE_6, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSilverWindSmallSparkAffineAnimTable, .callback = AnimFlyingParticle, }; static const u16 sMagicalLeafBlendColors[] = { RGB(31, 0, 0), RGB(31, 19, 0), RGB(31, 31, 0), RGB(0, 31, 0), RGB(5, 14, 31), RGB(22, 10, 31), RGB(22, 21, 31), }; const struct SpriteTemplate gNeedleArmSpikeSpriteTemplate = { .tileTag = ANIM_TAG_GREEN_SPIKE, .paletteTag = ANIM_TAG_GREEN_SPIKE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike, }; static const union AnimCmd sAnim_Whip[] = { ANIMCMD_FRAME(64, 3), ANIMCMD_FRAME(80, 3), ANIMCMD_FRAME(96, 3), ANIMCMD_FRAME(112, 6), ANIMCMD_END, }; static const union AnimCmd sAnim_Whip_Flipped[] = { ANIMCMD_FRAME(64, 3, .hFlip = TRUE), ANIMCMD_FRAME(80, 3, .hFlip = TRUE), ANIMCMD_FRAME(96, 3, .hFlip = TRUE), ANIMCMD_FRAME(112, 6, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_Whip[] = { sAnim_Whip, sAnim_Whip_Flipped, }; const struct SpriteTemplate gSlamHitSpriteTemplate = { .tileTag = ANIM_TAG_SLAM_HIT, .paletteTag = ANIM_TAG_SLAM_HIT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_Whip, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWhipHit, }; const struct SpriteTemplate gVineWhipSpriteTemplate = { .tileTag = ANIM_TAG_WHIP_HIT, .paletteTag = ANIM_TAG_WHIP_HIT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_Whip, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWhipHit, }; static const union AnimCmd sAnim_SlidingHit[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_FRAME(64, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_SlidingHit[] = { sAnim_SlidingHit, }; // Unused static const struct SpriteTemplate sSlidingHit1SpriteTemplate = { .tileTag = ANIM_TAG_HIT, .paletteTag = ANIM_TAG_HIT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_SlidingHit, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSlidingHit, }; // Unused static const struct SpriteTemplate sSlidingHit2SpriteTemplate = { .tileTag = ANIM_TAG_HIT_2, .paletteTag = ANIM_TAG_HIT_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_SlidingHit, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSlidingHit, }; static const union AffineAnimCmd sAffineAnim_FlickeringPunch_Normal[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedTopLeft[] = { AFFINEANIMCMD_FRAME(256, 256, 32, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedLeft[] = { AFFINEANIMCMD_FRAME(256, 256, 64, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedBottomLeft[] = { AFFINEANIMCMD_FRAME(256, 256, 96, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_FlickeringPunch_UpsideDown[] = { AFFINEANIMCMD_FRAME(256, 256, -128, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedBottomRight[] = { AFFINEANIMCMD_FRAME(256, 256, -96, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedRight[] = { AFFINEANIMCMD_FRAME(256, 256, -64, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedTopRight[] = { AFFINEANIMCMD_FRAME(256, 256, -32, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_FlickeringPunch[] = { sAffineAnim_FlickeringPunch_Normal, sAffineAnim_FlickeringPunch_TurnedTopLeft, sAffineAnim_FlickeringPunch_TurnedLeft, sAffineAnim_FlickeringPunch_TurnedBottomLeft, sAffineAnim_FlickeringPunch_UpsideDown, sAffineAnim_FlickeringPunch_TurnedBottomRight, sAffineAnim_FlickeringPunch_TurnedRight, sAffineAnim_FlickeringPunch_TurnedTopRight, }; // Unused static const struct SpriteTemplate sFlickeringPunchSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_FlickeringPunch, .callback = AnimFlickeringPunch, }; static const union AnimCmd sCuttingSliceAnimCmds[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(32, 5), ANIMCMD_FRAME(48, 5), ANIMCMD_END, }; static const union AnimCmd *const sCuttingSliceAnimTable[] = { sCuttingSliceAnimCmds, }; const struct SpriteTemplate gCuttingSliceSpriteTemplate = { .tileTag = ANIM_TAG_CUT, .paletteTag = ANIM_TAG_CUT, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = sCuttingSliceAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCuttingSlice, }; const struct SpriteTemplate gAirCutterSliceSpriteTemplate = { .tileTag = ANIM_TAG_CUT, .paletteTag = ANIM_TAG_CUT, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = sCuttingSliceAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimAirCutterSlice, }; static const union AnimCmd sAnim_CirclingMusicNote_Eighth[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_CirclingMusicNote_BeamedEighth[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_CirclingMusicNote_SlantedBeamedEighth[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_CirclingMusicNote_Quarter[] = { ANIMCMD_FRAME(12, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_CirclingMusicNote_QuarterRest[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_CirclingMusicNote_EighthRest[] = { ANIMCMD_FRAME(20, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_CirclingMusicNote_Eighth_Flipped[] = { ANIMCMD_FRAME(0, 1, .vFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_CirclingMusicNote_BeamedEighth_Flipped[] = { ANIMCMD_FRAME(4, 1, .vFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_CirclingMusicNote_SlantedBeamedEighth_Flipped[] = { ANIMCMD_FRAME(8, 1, .vFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_CirclingMusicNote_Quarter_Flipped[] = { ANIMCMD_FRAME(12, 1, .vFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_CirclingMusicNote[] = { sAnim_CirclingMusicNote_Eighth, sAnim_CirclingMusicNote_BeamedEighth, sAnim_CirclingMusicNote_SlantedBeamedEighth, sAnim_CirclingMusicNote_Quarter, sAnim_CirclingMusicNote_QuarterRest, sAnim_CirclingMusicNote_EighthRest, sAnim_CirclingMusicNote_Eighth_Flipped, sAnim_CirclingMusicNote_BeamedEighth_Flipped, sAnim_CirclingMusicNote_SlantedBeamedEighth_Flipped, sAnim_CirclingMusicNote_Quarter_Flipped, }; // Unused static const struct SpriteTemplate sCirclingMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnims_CirclingMusicNote, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCirclingMusicNote, }; const struct SpriteTemplate gProtectSpriteTemplate = { .tileTag = ANIM_TAG_PROTECT, .paletteTag = ANIM_TAG_PROTECT, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimProtect, }; static const union AffineAnimCmd sMilkBottleAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sMilkBottleAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 12), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6), AFFINEANIMCMD_FRAME(0x0, 0x0, -2, 24), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6), AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 12), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sMilkBottleAffineAnimTable[] = { sMilkBottleAffineAnimCmds1, sMilkBottleAffineAnimCmds2, }; const struct SpriteTemplate gMilkBottleSpriteTemplate = { .tileTag = ANIM_TAG_MILK_BOTTLE, .paletteTag = ANIM_TAG_MILK_BOTTLE, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sMilkBottleAffineAnimTable, .callback = AnimMilkBottle, }; static const union AnimCmd sGrantingStarsAnimCmds[] = { ANIMCMD_FRAME(0, 7), ANIMCMD_FRAME(16, 7), ANIMCMD_FRAME(32, 7), ANIMCMD_FRAME(48, 7), ANIMCMD_FRAME(64, 7), ANIMCMD_FRAME(80, 7), ANIMCMD_FRAME(96, 7), ANIMCMD_FRAME(112, 7), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sGrantingStarsAnimTable[] = { sGrantingStarsAnimCmds, }; const struct SpriteTemplate gGrantingStarsSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_SPARKLE_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sGrantingStarsAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGrantingStars, }; const struct SpriteTemplate gSparklingStarsSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_SPARKLE_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sGrantingStarsAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSparklingStars, }; static const union AnimCmd sAnim_BubbleBurst[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_FRAME(4, 10), ANIMCMD_FRAME(8, 10), ANIMCMD_FRAME(12, 10), ANIMCMD_FRAME(16, 26), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(20, 5), ANIMCMD_FRAME(24, 15), ANIMCMD_END, }; static const union AnimCmd sAnim_BubbleBurst_Flipped[] = { ANIMCMD_FRAME(0, 10, .hFlip = TRUE), ANIMCMD_FRAME(4, 10, .hFlip = TRUE), ANIMCMD_FRAME(8, 10, .hFlip = TRUE), ANIMCMD_FRAME(12, 10, .hFlip = TRUE), ANIMCMD_FRAME(16, 26, .hFlip = TRUE), ANIMCMD_FRAME(16, 5, .hFlip = TRUE), ANIMCMD_FRAME(20, 5, .hFlip = TRUE), ANIMCMD_FRAME(24, 15, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_BubbleBurst[] = { sAnim_BubbleBurst, sAnim_BubbleBurst_Flipped, }; // Unused static const struct SpriteTemplate sBubbleBurstSpriteTemplate = { .tileTag = ANIM_TAG_BUBBLE_BURST, .paletteTag = ANIM_TAG_BUBBLE_BURST, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnims_BubbleBurst, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBubbleBurst, }; static const union AnimCmd sSleepLetterZAnimCmds[] = { ANIMCMD_FRAME(0, 40), ANIMCMD_END, }; static const union AnimCmd *const sSleepLetterZAnimTable[] = { sSleepLetterZAnimCmds, }; static const union AffineAnimCmd sSleepLetterZAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0x14, 0x14, -30, 0), AFFINEANIMCMD_FRAME(0x8, 0x8, 1, 24), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sSleepLetterZAffineAnimCmds1_2[] = { AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24), AFFINEANIMCMD_LOOP(10), }; static const union AffineAnimCmd sSleepLetterZAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0x14, 0x14, 30, 0), AFFINEANIMCMD_FRAME(0x8, 0x8, -1, 24), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sSleepLetterZAffineAnimCmds2_2[] = { AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 24), AFFINEANIMCMD_LOOP(10), }; static const union AffineAnimCmd *const sSleepLetterZAffineAnimTable[] = { sSleepLetterZAffineAnimCmds1, sSleepLetterZAffineAnimCmds2, }; const struct SpriteTemplate gSleepLetterZSpriteTemplate = { .tileTag = ANIM_TAG_LETTER_Z, .paletteTag = ANIM_TAG_LETTER_Z, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sSleepLetterZAnimTable, .images = NULL, .affineAnims = sSleepLetterZAffineAnimTable, .callback = AnimSleepLetterZ, }; const struct SpriteTemplate gLockOnTargetSpriteTemplate = { .tileTag = ANIM_TAG_LOCK_ON, .paletteTag = ANIM_TAG_LOCK_ON, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimLockOnTarget, }; const struct SpriteTemplate gLockOnMoveTargetSpriteTemplate = { .tileTag = ANIM_TAG_LOCK_ON, .paletteTag = ANIM_TAG_LOCK_ON, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimLockOnMoveTarget, }; static const s8 sInclineMonCoordTable[][2] = { { 64, 64}, { 0, -64}, {-64, 64}, { 32, -32}, }; const struct SpriteTemplate gBowMonSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBowMon, }; // Unused // Same as BowMon above but without backing up static const struct SpriteTemplate sTipMonSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTipMon, }; static const union AnimCmd sSlashSliceAnimCmds1[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_END, }; static const union AnimCmd sSlashSliceAnimCmds2[] = { ANIMCMD_FRAME(48, 4), ANIMCMD_END, }; static const union AnimCmd *const sSlashSliceAnimTable[] = { sSlashSliceAnimCmds1, sSlashSliceAnimCmds2, }; const struct SpriteTemplate gSlashSliceSpriteTemplate = { .tileTag = ANIM_TAG_SLASH, .paletteTag = ANIM_TAG_SLASH, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sSlashSliceAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSlashSlice, }; const struct SpriteTemplate gFalseSwipeSliceSpriteTemplate = { .tileTag = ANIM_TAG_SLASH_2, .paletteTag = ANIM_TAG_SLASH_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sSlashSliceAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFalseSwipeSlice, }; const struct SpriteTemplate gFalseSwipePositionedSliceSpriteTemplate = { .tileTag = ANIM_TAG_SLASH_2, .paletteTag = ANIM_TAG_SLASH_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sSlashSliceAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFalseSwipePositionedSlice, }; static const union AnimCmd sEndureEnergyAnimCmds[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(8, 12), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(24, 4), ANIMCMD_END, }; static const union AnimCmd *const sEndureEnergyAnimTable[] = { sEndureEnergyAnimCmds, }; const struct SpriteTemplate gEndureEnergySpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_FOCUS_ENERGY, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = sEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy, }; static const union AnimCmd sSharpenSphereAnimCmds[] = { ANIMCMD_FRAME(0, 18), ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(16, 18), ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(32, 18), ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(32, 6), ANIMCMD_FRAME(48, 18), ANIMCMD_FRAME(32, 6), ANIMCMD_FRAME(48, 6), ANIMCMD_FRAME(64, 18), ANIMCMD_FRAME(48, 6), ANIMCMD_FRAME(64, 54), ANIMCMD_END, }; static const union AnimCmd *const sSharpenSphereAnimTable[] = { sSharpenSphereAnimCmds, }; const struct SpriteTemplate gSharpenSphereSpriteTemplate = { .tileTag = ANIM_TAG_SPHERE_TO_CUBE, .paletteTag = ANIM_TAG_SPHERE_TO_CUBE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sSharpenSphereAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSharpenSphere, }; const struct SpriteTemplate gOctazookaBallSpriteTemplate = { .tileTag = ANIM_TAG_BLACK_BALL, .paletteTag = ANIM_TAG_BLACK_BALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation, }; static const union AnimCmd sOctazookaAnimCmds[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_FRAME(64, 3), ANIMCMD_END, }; static const union AnimCmd *const sOctazookaAnimTable[] = { sOctazookaAnimCmds, }; const struct SpriteTemplate gOctazookaSmokeSpriteTemplate = { .tileTag = ANIM_TAG_GRAY_SMOKE, .paletteTag = ANIM_TAG_GRAY_SMOKE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sOctazookaAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos, }; static const union AnimCmd sConversionAnimCmds[] = { ANIMCMD_FRAME(3, 5), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(1, 5), ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; static const union AnimCmd *const sConversionAnimTable[] = { sConversionAnimCmds, }; static const union AffineAnimCmd sConversionAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sConversionAffineAnimTable[] = { sConversionAffineAnimCmds, }; const struct SpriteTemplate gConversionSpriteTemplate = { .tileTag = ANIM_TAG_CONVERSION, .paletteTag = ANIM_TAG_CONVERSION, .oam = &gOamData_AffineDouble_ObjBlend_8x8, .anims = sConversionAnimTable, .images = NULL, .affineAnims = sConversionAffineAnimTable, .callback = AnimConversion, }; static const union AnimCmd sConversion2AnimCmds[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(1, 5), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(3, 5), ANIMCMD_END, }; static const union AnimCmd *const sConversion2AnimTable[] = { sConversion2AnimCmds, }; const struct SpriteTemplate gConversion2SpriteTemplate = { .tileTag = ANIM_TAG_CONVERSION, .paletteTag = ANIM_TAG_CONVERSION, .oam = &gOamData_AffineDouble_ObjBlend_8x8, .anims = sConversion2AnimTable, .images = NULL, .affineAnims = sConversionAffineAnimTable, .callback = AnimConversion2, }; const struct SpriteTemplate gMoonSpriteTemplate = { .tileTag = ANIM_TAG_MOON, .paletteTag = ANIM_TAG_MOON, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoon, }; static const union AnimCmd sMoonlightSparkleAnimCmds[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(8, 8), ANIMCMD_FRAME(12, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sMoonlightSparkleAnimTable[] = { sMoonlightSparkleAnimCmds, }; const struct SpriteTemplate gMoonlightSparkleSpriteTemplate = { .tileTag = ANIM_TAG_GREEN_SPARKLE, .paletteTag = ANIM_TAG_GREEN_SPARKLE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sMoonlightSparkleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoonlightSparkle, }; static const union AnimCmd sHealingBlueStarAnimCmds[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(48, 3), ANIMCMD_FRAME(64, 5), ANIMCMD_FRAME(80, 3), ANIMCMD_FRAME(96, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_END, }; static const union AnimCmd *const sHealingBlueStarAnimTable[] = { sHealingBlueStarAnimCmds, }; const struct SpriteTemplate gHealingBlueStarSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_STAR, .paletteTag = ANIM_TAG_BLUE_STAR, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sHealingBlueStarAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos, }; const struct SpriteTemplate gHornHitSpriteTemplate = { .tileTag = ANIM_TAG_HORN_HIT, .paletteTag = ANIM_TAG_HORN_HIT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHornHit, }; static const union AnimCmd sSuperFangAnimCmds[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(48, 2), ANIMCMD_END, }; static const union AnimCmd *const sSuperFangAnimTable[] = { sSuperFangAnimCmds, }; const struct SpriteTemplate gSuperFangSpriteTemplate = { .tileTag = ANIM_TAG_FANG_ATTACK, .paletteTag = ANIM_TAG_FANG_ATTACK, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sSuperFangAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSuperFang, }; static const union AnimCmd sWavyMusicNotesAnimCmds1[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_END, }; static const union AnimCmd sWavyMusicNotesAnimCmds2[] = { ANIMCMD_FRAME(4, 10), ANIMCMD_END, }; static const union AnimCmd sWavyMusicNotesAnimCmds3[] = { ANIMCMD_FRAME(8, 41), ANIMCMD_END, }; static const union AnimCmd sWavyMusicNotesAnimCmds4[] = { ANIMCMD_FRAME(12, 10), ANIMCMD_END, }; static const union AnimCmd sWavyMusicNotesAnimCmds5[] = { ANIMCMD_FRAME(16, 10), ANIMCMD_END, }; static const union AnimCmd sWavyMusicNotesAnimCmds6[] = { ANIMCMD_FRAME(20, 10), ANIMCMD_END, }; static const union AnimCmd sWavyMusicNotesAnimCmds7[] = { ANIMCMD_FRAME(0, 10, .vFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sWavyMusicNotesAnimCmds8[] = { ANIMCMD_FRAME(4, 10, .vFlip = TRUE), ANIMCMD_END, }; const union AnimCmd *const gMusicNotesAnimTable[] = { sWavyMusicNotesAnimCmds1, sWavyMusicNotesAnimCmds2, sWavyMusicNotesAnimCmds3, sWavyMusicNotesAnimCmds4, sWavyMusicNotesAnimCmds5, sWavyMusicNotesAnimCmds6, sWavyMusicNotesAnimCmds7, sWavyMusicNotesAnimCmds8, }; static const union AffineAnimCmd sWavyMusicNotesAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0xC, 0xC, 0, 16), AFFINEANIMCMD_FRAME(0xFFF4, 0xFFF4, 0, 16), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sMusicNotesAffineAnimTable[] = { sWavyMusicNotesAffineAnimCmds, }; const struct SpriteTemplate gWavyMusicNotesSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gMusicNotesAnimTable, .images = NULL, .affineAnims = sMusicNotesAffineAnimTable, .callback = AnimWavyMusicNotes, }; static const u16 sParticlesColorBlendTable[][6] = { {ANIM_TAG_MUSIC_NOTES, RGB_WHITE, RGB(31, 26, 28), RGB(31, 22, 26), RGB(31, 17, 24), RGB(31, 13, 22)}, {ANIM_TAG_BENT_SPOON, RGB_WHITE, RGB(25, 31, 26), RGB(20, 31, 21), RGB(15, 31, 16), RGB(10, 31, 12)}, {ANIM_TAG_SPHERE_TO_CUBE, RGB_WHITE, RGB(31, 31, 24), RGB(31, 31, 17), RGB(31, 31, 10), RGB(31, 31, 3)}, {ANIM_TAG_LARGE_FRESH_EGG, RGB_WHITE, RGB(26, 28, 31), RGB(21, 26, 31), RGB(16, 24, 31), RGB(12, 22, 31)}, }; const struct SpriteTemplate gFastFlyingMusicNotesSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gMusicNotesAnimTable, .images = NULL, .affineAnims = sMusicNotesAffineAnimTable, .callback = AnimFlyingMusicNotes, }; const struct SpriteTemplate gBellyDrumHandSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_HAND_OUTLINE, .paletteTag = ANIM_TAG_PURPLE_HAND_OUTLINE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBellyDrumHand, }; static const union AffineAnimCmd sSlowFlyingMusicNotesAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0), AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sSlowFlyinsMusicNotesAffineAnimTable[] = { sSlowFlyingMusicNotesAffineAnimCmds, }; const struct SpriteTemplate gSlowFlyingMusicNotesSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gMusicNotesAnimTable, .images = NULL, .affineAnims = sSlowFlyinsMusicNotesAffineAnimTable, .callback = AnimSlowFlyingMusicNotes, }; static const union AnimCmd sMetronomeThroughtBubbleAnimCmds1[] = { ANIMCMD_FRAME(0, 2, .hFlip = TRUE), ANIMCMD_FRAME(16, 2, .hFlip = TRUE), ANIMCMD_FRAME(32, 2, .hFlip = TRUE), ANIMCMD_FRAME(48, 2, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sMetronomeThroughtBubbleAnimCmds3[] = { ANIMCMD_FRAME(48, 2, .hFlip = TRUE), ANIMCMD_FRAME(32, 2, .hFlip = TRUE), ANIMCMD_FRAME(16, 2, .hFlip = TRUE), ANIMCMD_FRAME(0, 2, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sMetronomeThroughtBubbleAnimCmds2[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(48, 2), ANIMCMD_END, }; static const union AnimCmd sMetronomeThroughtBubbleAnimCmds4[] = { ANIMCMD_FRAME(48, 2), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_END, }; static const union AnimCmd *const sMetronomeThroughtBubbleAnimTable[] = { sMetronomeThroughtBubbleAnimCmds1, sMetronomeThroughtBubbleAnimCmds2, sMetronomeThroughtBubbleAnimCmds3, sMetronomeThroughtBubbleAnimCmds4, }; const struct SpriteTemplate gThoughtBubbleSpriteTemplate = { .tileTag = ANIM_TAG_THOUGHT_BUBBLE, .paletteTag = ANIM_TAG_THOUGHT_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sMetronomeThroughtBubbleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThoughtBubble, }; static const union AffineAnimCmd sMetronomeFingerAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), AFFINEANIMCMD_FRAME(0x1E, 0x1E, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sMetronomeFingerAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 11), AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 11), AFFINEANIMCMD_LOOP(2), AFFINEANIMCMD_FRAME(-0x1E, -0x1E, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sMetronomeFingerAffineAnimCmds2_2[] = { AFFINEANIMCMD_FRAME(16, 16, 0, 0), AFFINEANIMCMD_FRAME(30, 30, 0, 8), AFFINEANIMCMD_FRAME(0, 0, 0, 16), AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(0, 0, 4, 11), AFFINEANIMCMD_FRAME(0, 0, -4, 11), AFFINEANIMCMD_LOOP(2), AFFINEANIMCMD_FRAME(-30, -30, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sMetronomeFingerAffineAnimTable[] = { sMetronomeFingerAffineAnimCmds1, sMetronomeFingerAffineAnimCmds2, }; const struct SpriteTemplate gMetronomeFingerSpriteTemplate = { .tileTag = ANIM_TAG_FINGER, .paletteTag = ANIM_TAG_FINGER, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sMetronomeFingerAffineAnimTable, .callback = AnimMetronomeFinger, }; const struct SpriteTemplate gFollowMeFingerSpriteTemplate = { .tileTag = ANIM_TAG_FINGER, .paletteTag = ANIM_TAG_FINGER, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sMetronomeFingerAffineAnimTable, .callback = AnimFollowMeFinger, }; static const union AnimCmd sTauntFingerAnimCmds1[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sTauntFingerAnimCmds2[] = { ANIMCMD_FRAME(0, 1, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sTauntFingerAnimCmds3[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_END, }; static const union AnimCmd sTauntFingerAnimCmds4[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(16, 4, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .hFlip = TRUE), ANIMCMD_FRAME(16, 4, .hFlip = TRUE), ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(16, 4, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sTauntFingerAnimTable[] = { sTauntFingerAnimCmds1, sTauntFingerAnimCmds2, sTauntFingerAnimCmds3, sTauntFingerAnimCmds4, }; const struct SpriteTemplate gTauntFingerSpriteTemplate = { .tileTag = ANIM_TAG_FINGER_2, .paletteTag = ANIM_TAG_FINGER_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sTauntFingerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTauntFinger, }; // Animates the falling particles that horizontally wave back and forth. // Used by Sleep Powder, Stun Spore, and Poison Powder. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: total duration in frames // arg 3: vertical movement speed (sub-pixel value) // arg 4: wave amplitude // arg 5: wave speed static void AnimMovePowderParticle(struct Sprite* sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; if (GetBattlerSide(gBattleAnimAttacker)) { sprite->data[3] = -gBattleAnimArgs[4]; } else { sprite->data[3] = gBattleAnimArgs[4]; } sprite->data[4] = gBattleAnimArgs[5]; sprite->callback = AnimMovePowderParticle_Step; } static void AnimMovePowderParticle_Step(struct Sprite* sprite) { if (sprite->data[0] > 0) { sprite->data[0]--; sprite->y2 = sprite->data[2] >> 8; sprite->data[2] += sprite->data[1]; sprite->x2 = Sin(sprite->data[5], sprite->data[3]); sprite->data[5] = (sprite->data[5] + sprite->data[4]) & 0xFF; } else { DestroyAnimSprite(sprite); } } // Moves an energy orb towards the center of the mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration static void AnimPowerAbsorptionOrb(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } // Moves an orb in a straight line towards the target mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration // arg 3: sprite anim number static void AnimSolarBeamBigOrb(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); StartSpriteAnim(sprite, gBattleAnimArgs[3]); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Moves a small orb in a wavy pattern towards the target mon. // The small orb "circles" the big orbs in AnimSolarBeamBigOrb. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration // arg 3: initial wave offset static void AnimSolarBeamSmallOrb(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = AnimSolarBeamSmallOrb_Step; sprite->callback(sprite); } static void AnimSolarBeamSmallOrb_Step(struct Sprite* sprite) { if (AnimTranslateLinear(sprite)) { DestroySprite(sprite); } else { if (sprite->data[5] > 0x7F) sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1; else sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 6; sprite->x2 += Sin(sprite->data[5], 5); sprite->y2 += Cos(sprite->data[5], 14); sprite->data[5] = (sprite->data[5] + 15) & 0xFF; } } // Creates 15 small secondary orbs used in the solarbeam anim effect. // There is a 7-frame delay between each of them. // No args. void AnimTask_CreateSmallSolarBeamOrbs(u8 taskId) { if (--gTasks[taskId].data[0] == -1) { gTasks[taskId].data[1]++; gTasks[taskId].data[0] = 6; gBattleAnimArgs[0] = 15; gBattleAnimArgs[1] = 0; gBattleAnimArgs[2] = 80; gBattleAnimArgs[3] = 0; CreateSpriteAndAnimate(&gSolarBeamSmallOrbSpriteTemplate, 0, 0, GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1); } if (gTasks[taskId].data[1] == 15) DestroyAnimVisualTask(taskId); } // Moves an orb from the target mon to the attacking mon in an arc-like fashion. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: wave amplitude // arg 3: wave period (lower means faster wave) static void AnimAbsorptionOrb(struct Sprite* sprite) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[5] = gBattleAnimArgs[2]; InitAnimArcTranslation(sprite); sprite->callback = AnimAbsorptionOrb_Step; } static void AnimAbsorptionOrb_Step(struct Sprite* sprite) { if (TranslateAnimHorizontalArc(sprite)) DestroyAnimSprite(sprite); } // Moves an orb in a wave-like fashion towards the target mon. The wave's // properties and the sprite anim are randomly determined. static void AnimHyperBeamOrb(struct Sprite* sprite) { u16 speed; u16 animNum = Random(); StartSpriteAnim(sprite, animNum % 8); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= 20; else sprite->x += 20; speed = Random(); sprite->data[0] = (speed & 31) + 64; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimFastLinearTranslationWithSpeed(sprite); sprite->data[5] = Random() & 0xFF; sprite->data[6] = sprite->subpriority; sprite->callback = AnimHyperBeamOrb_Step; sprite->callback(sprite); } static void AnimHyperBeamOrb_Step(struct Sprite* sprite) { if (AnimFastTranslateLinear(sprite)) { DestroyAnimSprite(sprite); } else { sprite->y2 += Cos(sprite->data[5], 12); if (sprite->data[5] < 0x7F) sprite->subpriority = sprite->data[6]; else sprite->subpriority = sprite->data[6] + 1; sprite->data[5] += 24; sprite->data[5] &= 0xFF; } } // seed (sprouts a sapling from a seed.) // Used by Leech Seed. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x pixel offset // arg 3: target y pixel offset // arg 4: duration // arg 5: wave amplitude static void AnimLeechSeed(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); sprite->callback = AnimLeechSeed_Step; } static void AnimLeechSeed_Step(struct Sprite* sprite) { if (TranslateAnimHorizontalArc(sprite)) { sprite->invisible = TRUE; sprite->data[0] = 10; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimLeechSeedSprouts); } } static void AnimLeechSeedSprouts(struct Sprite* sprite) { sprite->invisible = FALSE; StartSpriteAnim(sprite, 1); sprite->data[0] = 60; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Moves a spore particle in a halo around the target mon. // The sprite's priority is updated to give the effect of going // behind the mon's sprite. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: initial wave offset // arg 3: duration // arg 4: blend (0 = off, 1 = on) static void AnimSporeParticle(struct Sprite* sprite) { InitSpritePosToAnimTarget(sprite, TRUE); StartSpriteAnim(sprite, gBattleAnimArgs[4]); if (gBattleAnimArgs[4] == 1) sprite->oam.objMode = ST_OAM_OBJ_BLEND; sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[2]; sprite->callback = AnimSporeParticle_Step; sprite->callback(sprite); } static void AnimSporeParticle_Step(struct Sprite* sprite) { sprite->x2 = Sin(sprite->data[1], 32); sprite->y2 = Cos(sprite->data[1], -3) + ((sprite->data[2] += 24) >> 8); if ((u16)(sprite->data[1] - 0x40) < 0x80) { sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); } else { u8 priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1; if (priority > 3) priority = 3; sprite->oam.priority = priority; } sprite->data[1] += 2; sprite->data[1] &= 0xFF; if (--sprite->data[0] == -1) DestroyAnimSprite(sprite); } // In a double battle, Updates the mon sprite background priorities to allow // the circling effect controlled by AnimSporeParticle. // No args. void AnimTask_SporeDoubleBattle(u8 taskId) { if (IsContest() || !IsDoubleBattle()) { DestroyAnimVisualTask(taskId); } else { if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1) SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 3); else SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); DestroyAnimVisualTask(taskId); } } // Rotates a big flower around the attacking mon, and slowly floats // downward. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target y pixel offset // arg 3: duration static void AnimPetalDanceBigFlower(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = sprite->x; sprite->data[2] = sprite->x; sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; InitAnimLinearTranslation(sprite); sprite->data[5] = 0x40; sprite->callback = AnimPetalDanceBigFlower_Step; sprite->callback(sprite); } static void AnimPetalDanceBigFlower_Step(struct Sprite* sprite) { if (!AnimTranslateLinear(sprite)) { sprite->x2 += Sin(sprite->data[5], 32); sprite->y2 += Cos(sprite->data[5], -5); if ((u16)(sprite->data[5] - 0x40) < 0x80) sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1; else sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + 1; sprite->data[5] = (sprite->data[5] + 5) & 0xFF; } else { DestroyAnimSprite(sprite); } } // Slowly floats a small flower downard, while swaying from right to left. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target y pixel offset // arg 3: duration static void AnimPetalDanceSmallFlower(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = sprite->x; sprite->data[2] = sprite->x; sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; InitAnimLinearTranslation(sprite); sprite->data[5] = 0x40; sprite->callback = AnimPetalDanceSmallFlower_Step; sprite->callback(sprite); } static void AnimPetalDanceSmallFlower_Step(struct Sprite* sprite) { if (!AnimTranslateLinear(sprite)) { sprite->x2 += Sin(sprite->data[5], 8); if ((u16)(sprite->data[5] - 59) < 5 || (u16)(sprite->data[5] - 187) < 5) sprite->oam.matrixNum ^= ST_OAM_HFLIP; sprite->data[5] += 5; sprite->data[5] &= 0xFF; } else { DestroyAnimSprite(sprite); } } // Shoots a leaf upward, then floats it downward while swaying back and forth. // arg 0: upward x delta per frame // arg 1: upward y delta per frame // arg 2: upward duration static void AnimRazorLeafParticle(struct Sprite* sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[2]; sprite->callback = AnimRazorLeafParticle_Step1; } static void AnimRazorLeafParticle_Step1(struct Sprite* sprite) { if (!sprite->data[2]) { if (sprite->data[1] & 1) { sprite->data[0] = 0x80; sprite->data[1] = 0; sprite->data[2] = 0; } else { sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 0; } sprite->callback = AnimRazorLeafParticle_Step2; } else { sprite->data[2]--; sprite->x += sprite->data[0]; sprite->y += sprite->data[1]; } } static void AnimRazorLeafParticle_Step2(struct Sprite* sprite) { if (GetBattlerSide(gBattleAnimAttacker)) sprite->x2 = -Sin(sprite->data[0], 25); else sprite->x2 = Sin(sprite->data[0], 25); sprite->data[0] += 2; sprite->data[0] &= 0xFF; sprite->data[1]++; if (!(sprite->data[1] & 1)) sprite->y2++; if (sprite->data[1] > 80) DestroyAnimSprite(sprite); } // Animates a sprite that moves linearly from one location to another, with a // single-cycle sine wave added to the y position along the way. // Used by Razor Leaf and Magical Leaf. // arg 0: initial x offset // arg 1: initial y offset // arg 2: target x offset // arg 3: target y offset // arg 4: translation duration // arg 5: wave amplitude // arg 6: target between double battle opponents (boolean) static void AnimTranslateLinearSingleSineWave(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; if (!gBattleAnimArgs[6]) { sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; } else { SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->data[2], &sprite->data[4]); sprite->data[2] += gBattleAnimArgs[2]; sprite->data[4] += gBattleAnimArgs[3]; } sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) sprite->data[0] = 1; else sprite->data[0] = 0; sprite->callback = AnimTranslateLinearSingleSineWave_Step; } static void AnimTranslateLinearSingleSineWave_Step(struct Sprite* sprite) { bool8 destroy = FALSE; s16 a = sprite->data[0]; s16 b = sprite->data[7]; s16 r0; sprite->data[0] = 1; TranslateAnimHorizontalArc(sprite); r0 = sprite->data[7]; sprite->data[0] = a; if (b > 200 && r0 < 56 && sprite->oam.affineParam == 0) sprite->oam.affineParam++; if (sprite->oam.affineParam != 0 && sprite->data[0] != 0) { sprite->invisible ^= 1; sprite->oam.affineParam++; if (sprite->oam.affineParam == 30) destroy = TRUE; } if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16 || sprite->x + sprite->x2 < -16 || sprite->y + sprite->y2 > DISPLAY_HEIGHT || sprite->y + sprite->y2 < -16) destroy = TRUE; if (destroy) DestroyAnimSprite(sprite); } // Animates particles in the Twister move animation. // arg 0: duration // arg 1: total y delta (the particles rise upward) // arg 2: wave period (higher means faster wave) // arg 3: wave amplitude // arg 4: speedup frame (particles move faster at the end of the animation) void AnimMoveTwisterParticle(struct Sprite* sprite) { if (!IsContest() && IsDoubleBattle() == TRUE) SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->x, &sprite->y); sprite->y += 32; sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[2]; sprite->data[3] = gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[4]; sprite->callback = AnimMoveTwisterParticle_Step; } static void AnimMoveTwisterParticle_Step(struct Sprite* sprite) { if (sprite->data[1] == 0xFF) { sprite->y -= 2; } else if (sprite->data[1] > 0) { sprite->y -= 2; sprite->data[1] -= 2; } sprite->data[5] += sprite->data[2]; if (sprite->data[0] < sprite->data[4]) sprite->data[5] += sprite->data[2]; sprite->data[5] &= 0xFF; sprite->x2 = Cos(sprite->data[5], sprite->data[3]); sprite->y2 = Sin(sprite->data[5], 5); if (sprite->data[5] < 0x80) sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) - 1; else sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1; if (--sprite->data[0] == 0) DestroyAnimSprite(sprite); } // Squeezes a constricting "rope" several times via affine animations. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: affine anim num // arg 3: num squeezes static void AnimConstrictBinding(struct Sprite* sprite) { InitSpritePosToAnimTarget(sprite, FALSE); sprite->affineAnimPaused = TRUE; StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); sprite->data[6] = gBattleAnimArgs[2]; sprite->data[7] = gBattleAnimArgs[3]; sprite->callback = AnimConstrictBinding_Step1; } static void AnimConstrictBinding_Step1(struct Sprite* sprite) { u8 spriteId; if ((u16)gBattleAnimArgs[7] == 0xFFFF) { sprite->affineAnimPaused = FALSE; spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); sprite->data[0] = 0x100; sprite->callback = AnimConstrictBinding_Step2; } } static void AnimConstrictBinding_Step2(struct Sprite* sprite) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); if (!sprite->data[2]) sprite->data[0] += 11; else sprite->data[0] -= 11; if (++sprite->data[1] == 6) { sprite->data[1] = 0; sprite->data[2] ^= 1; } if (sprite->affineAnimEnded) { if (--sprite->data[7] > 0) StartSpriteAffineAnim(sprite, sprite->data[6]); else DestroyAnimSprite(sprite); } } void AnimTask_ShrinkTargetCopy(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); if (gSprites[spriteId].invisible) { DestroyAnimVisualTask(taskId); } else { PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND); gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[11] = 0x100; gTasks[taskId].func = AnimTask_DuplicateAndShrinkToPos_Step1; } } static void AnimTask_DuplicateAndShrinkToPos_Step1(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); gTasks[taskId].data[10] += gTasks[taskId].data[0]; gSprites[spriteId].x2 = gTasks[taskId].data[10] >> 8; if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) gSprites[spriteId].x2 = -gSprites[spriteId].x2; gTasks[taskId].data[11] += 16; SetSpriteRotScale(spriteId, gTasks[taskId].data[11], gTasks[taskId].data[11], 0); SetBattlerSpriteYOffsetFromYScale(spriteId); if (--gTasks[taskId].data[1] == 0) { gTasks[taskId].data[0] = 0; gTasks[taskId].func = AnimTask_DuplicateAndShrinkToPos_Step2; } } static void AnimTask_DuplicateAndShrinkToPos_Step2(u8 taskId) { if ((u16)gBattleAnimArgs[7] == 0xFFFF) { if (gTasks[taskId].data[0] == 0) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); ResetSpriteRotScale(spriteId); gSprites[spriteId].y2 = gSprites[spriteId].x2 = 0; gTasks[taskId].data[0]++; return; } } else { if (gTasks[taskId].data[0] == 0) return; } gTasks[taskId].data[0]++; if (gTasks[taskId].data[0] == 3) DestroyAnimVisualTask(taskId); } // Moves an orb from the target mon to the attacking mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset static void AnimMimicOrb(struct Sprite* sprite) { switch (sprite->data[0]) { case 0: if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) gBattleAnimArgs[0] *= -1; sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[1]; sprite->invisible = TRUE; sprite->data[0]++; break; case 1: sprite->invisible = FALSE; if (sprite->affineAnimEnded) { ChangeSpriteAffineAnim(sprite, 1); sprite->data[0] = 25; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = InitAndRunAnimFastLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); break; } } } // Animates a root that flickers away after some time. // arg 0: x pixel offset // arg 1: y pixel offset // arg 2: sprite subpriority offset // arg 3: sprite anim num // arg 4: duration static void AnimIngrainRoot(struct Sprite* sprite) { if (!sprite->data[0]) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); sprite->x2 = gBattleAnimArgs[0]; sprite->y2 = gBattleAnimArgs[1]; sprite->subpriority = gBattleAnimArgs[2] + 30; StartSpriteAnim(sprite, gBattleAnimArgs[3]); sprite->data[2] = gBattleAnimArgs[4]; sprite->data[0]++; if (sprite->y + sprite->y2 > 120) sprite->y += sprite->y2 + sprite->y - 120; } sprite->callback = AnimRootFlickerOut; } // Places a root on the path to the target mon that flickers away after some time. // arg 0: percent along the path to the target mon // arg 1: x pixel offset // arg 2: y pixel offset // arg 3: sprite subpriority offset // arg 4: sprite anum num // arg 5: duration static void AnimFrenzyPlantRoot(struct Sprite *sprite) { s16 attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); s16 attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); s16 targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); s16 targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); targetX -= attackerX; targetY -= attackerY; sprite->x = attackerX + targetX * gBattleAnimArgs[0] / 100; sprite->y = attackerY + targetY * gBattleAnimArgs[0] / 100; sprite->x2 = gBattleAnimArgs[1]; sprite->y2 = gBattleAnimArgs[2]; sprite->subpriority = gBattleAnimArgs[3] + 30; StartSpriteAnim(sprite, gBattleAnimArgs[4]); sprite->data[2] = gBattleAnimArgs[5]; sprite->callback = AnimRootFlickerOut; sFrenzyPlantRootData.startX = sprite->x; sFrenzyPlantRootData.startY = sprite->y; sFrenzyPlantRootData.targetX = targetX; sFrenzyPlantRootData.targetY = targetY; } static void AnimRootFlickerOut(struct Sprite* sprite) { if (++sprite->data[0] > (sprite->data[2] - 10)) sprite->invisible = sprite->data[0] % 2; if (sprite->data[0] > sprite->data[2]) DestroyAnimSprite(sprite); } // Moves an orb in a fast wavy path. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: horizontal velocity // arg 3: wave amplitude // arg 4: duration static void AnimIngrainOrb(struct Sprite* sprite) { if (!sprite->data[0]) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; sprite->data[1] = gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[4]; } sprite->data[0]++; sprite->x2 = sprite->data[1] * sprite->data[0]; sprite->y2 = Sin((sprite->data[0] * 20) & 0xFF, sprite->data[2]); if (sprite->data[0] > sprite->data[3]) DestroyAnimSprite(sprite); } static void InitItemBagData(struct Sprite* sprite, s16 c) { int a = (sprite->x << 8) | sprite->y; int b = (sprite->data[6] << 8) | sprite->data[7]; c <<= 8; sprite->data[5] = a; sprite->data[6] = b; sprite->data[7] = c; } bool8 MoveAlongLinearPath(struct Sprite* sprite) { u16 xStartPos = (u8)(sprite->data[5] >> 8); u16 yStartPos = (u8)sprite->data[5]; s32 xEndPos = (u8)(sprite->data[6] >> 8); s32 yEndPos = (u8)sprite->data[6]; s16 totalTime = sprite->data[7] >> 8; s16 currentTime = sprite->data[7] & 0xFF; s16 yEndPos_2; s16 r0; s32 var1; s32 vaxEndPos; if (xEndPos == 0) xEndPos = -32; else if (xEndPos == 255) xEndPos = DISPLAY_WIDTH + 32; yEndPos_2 = yEndPos - yStartPos; r0 = xEndPos - xStartPos; var1 = r0 * currentTime / totalTime; vaxEndPos = yEndPos_2 * currentTime / totalTime; sprite->x = var1 + xStartPos; sprite->y = vaxEndPos + yStartPos; if (++currentTime == totalTime) return TRUE; sprite->data[7] = (totalTime << 8) | currentTime; return FALSE; } static void AnimItemSteal_Step2(struct Sprite* sprite) { if (sprite->data[0] == 10) StartSpriteAffineAnim(sprite, 1); sprite->data[0]++; if (sprite->data[0] > 50) DestroyAnimSprite(sprite); } static void AnimItemSteal_Step1(struct Sprite* sprite) { sprite->data[0] += sprite->data[3] * 128 / sprite->data[4]; if (sprite->data[0] >= 128) { sprite->data[1]++; sprite->data[0] = 0; } sprite->y2 = Sin(sprite->data[0] + 128, 30 - sprite->data[1] * 8); if (MoveAlongLinearPath(sprite)) { sprite->y2 = 0; sprite->data[0] = 0; sprite->callback = AnimItemSteal_Step2; } } static void AnimPresent(struct Sprite* sprite) { s16 targetX; s16 targetY; InitSpritePosToAnimAttacker(sprite, FALSE); targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget) { sprite->data[6] = targetX; sprite->data[7] = targetY + 10; InitItemBagData(sprite, 60); sprite->data[3] = 1; } else { sprite->data[6] = targetX; sprite->data[7] = targetY + 10; InitItemBagData(sprite, 60); sprite->data[3] = 3; } sprite->data[4] = 60; sprite->callback = AnimItemSteal_Step1; } static void AnimKnockOffOpponentsItem(struct Sprite* sprite) { int zero; sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]); zero = 0; if (sprite->data[0] > 0x7F) { sprite->data[1]++; sprite->data[0] = zero; } sprite->y2 = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8); if (MoveAlongLinearPath(sprite)) { sprite->y2 = zero; sprite->data[0] = zero; DestroyAnimSprite(sprite); } } static void AnimKnockOffItem(struct Sprite* sprite) { s16 targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { sprite->data[6] = 0; sprite->data[7] = targetY + 10; InitItemBagData(sprite, 40); sprite->data[3] = 3; sprite->data[4] = 60; sprite->callback = AnimItemSteal_Step1; } else { sprite->data[6] = 255; sprite->data[7] = targetY + 10; if (IsContest()) sprite->data[6] = 0; InitItemBagData(sprite, 40); sprite->data[3] = 3; sprite->data[4] = 60; sprite->callback = AnimKnockOffOpponentsItem; } } // Animates a heal particle upward. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: vertical velocity // arg 3: unused static void AnimPresentHealParticle(struct Sprite* sprite) { if (!sprite->data[0]) { InitSpritePosToAnimTarget(sprite, FALSE); sprite->data[1] = gBattleAnimArgs[2]; } sprite->data[0]++; sprite->y2 = sprite->data[1] * sprite->data[0]; if (sprite->animEnded) DestroyAnimSprite(sprite); } static void AnimItemSteal(struct Sprite* sprite) { s16 attackerX; s16 attackerY; InitSpritePosToAnimTarget(sprite, FALSE); attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); if (BATTLE_PARTNER(gBattleAnimTarget) == gBattleAnimAttacker) { sprite->data[6] = attackerX; sprite->data[7] = attackerY + 10; InitItemBagData(sprite, 60); sprite->data[3] = 1; } else { sprite->data[6] = attackerX; sprite->data[7] = attackerY + 10; InitItemBagData(sprite, 60); sprite->data[3] = 3; } sprite->data[4] = 60; sprite->callback = AnimItemSteal_Step3; } static void AnimItemSteal_Step3(struct Sprite* sprite) { int zero; sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]); zero = 0; if (sprite->data[0] > 127) { sprite->data[1]++; sprite->data[0] = zero; } sprite->y2 = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8); if (sprite->y2 == 0) PlaySE12WithPanning(SE_M_BUBBLE2, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); if (MoveAlongLinearPath(sprite)) { sprite->y2 = 0; sprite->data[0] = 0; sprite->callback = AnimItemSteal_Step2; PlaySE12WithPanning(SE_M_BUBBLE2, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER)); } } // Moves a bag in a circular motion. // arg 0: y position // arg 1: initial wave offset static void AnimTrickBag(struct Sprite* sprite) { int a; int b; if (!sprite->data[0]) { if (!IsContest()) { sprite->data[1] = gBattleAnimArgs[1]; sprite->x = 120; } else { a = gBattleAnimArgs[1] - 32; if (a < 0) b = gBattleAnimArgs[1] + 0xDF; else b = a; sprite->data[1] = a - ((b >> 8) << 8); sprite->x = 70; } sprite->y = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[0]; sprite->data[4] = 20; sprite->x2 = Cos(sprite->data[1], 60); sprite->y2 = Sin(sprite->data[1], 20); sprite->callback = AnimTrickBag_Step1; if (sprite->data[1] > 0 && sprite->data[1] < 192) sprite->subpriority = 31; else sprite->subpriority = 29; } } static void AnimTrickBag_Step1(struct Sprite* sprite) { switch (sprite->data[3]) { case 0: if (sprite->data[2] > 78) { sprite->data[3] = 1; StartSpriteAffineAnim(sprite, 1); break; } else { sprite->data[2] += sprite->data[4] / 10; sprite->data[4] += 3; sprite->y = sprite->data[2]; break; } break; case 1: if (sprite->data[3] && sprite->affineAnimEnded) { sprite->data[0] = 0; sprite->data[2] = 0; sprite->callback = AnimTrickBag_Step2; } break; } } static void AnimTrickBag_Step2(struct Sprite* sprite) { if (sprite->data[2] == gTrickBagCoordinates[sprite->data[0]][1]) { if (gTrickBagCoordinates[sprite->data[0]][2] == 127) { sprite->data[0] = 0; sprite->callback = AnimTrickBag_Step3; } sprite->data[2] = 0; sprite->data[0]++; } else { sprite->data[2]++; sprite->data[1] = (gTrickBagCoordinates[sprite->data[0]][0] * gTrickBagCoordinates[sprite->data[0]][2] + sprite->data[1]) & 0xFF; if (!IsContest()) { if ((u16)(sprite->data[1] - 1) < 191) sprite->subpriority = 31; else sprite->subpriority = 29; } sprite->x2 = Cos(sprite->data[1], 60); sprite->y2 = Sin(sprite->data[1], 20); } } static void AnimTrickBag_Step3(struct Sprite* sprite) { if (sprite->data[0] > 20) DestroyAnimSprite(sprite); sprite->invisible = sprite->data[0] % 2; sprite->data[0]++; } void AnimTask_LeafBlade(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[4] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1; task->data[6] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); task->data[10] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH); task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT); task->data[5] = (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) ? 1 : -1; task->data[9] = 56 - (task->data[5] * 64); task->data[8] = task->data[7] - task->data[9] + task->data[6]; task->data[2] = CreateSprite(&gLeafBladeSpriteTemplate, task->data[8], task->data[9], task->data[4]); if (task->data[2] == MAX_SPRITES) DestroyAnimVisualTask(taskId); gSprites[task->data[2]].data[0] = 10; gSprites[task->data[2]].data[1] = task->data[8]; gSprites[task->data[2]].data[2] = task->data[6] - (task->data[10] / 2 + 10) * task->data[5]; gSprites[task->data[2]].data[3] = task->data[9]; gSprites[task->data[2]].data[4] = task->data[7] + (task->data[11] / 2 + 10) * task->data[5]; gSprites[task->data[2]].data[5] = LeafBladeGetPosFactor(&gSprites[task->data[2]]); InitAnimArcTranslation(&gSprites[task->data[2]]); task->func = AnimTask_LeafBlade_Step; } static void AnimTask_LeafBlade_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; struct Sprite* sprite = &gSprites[task->data[2]]; int a = task->data[0]; switch (a) { case 4: AnimTask_LeafBlade_Step2(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { task->data[15] = 5; task->data[0] = 0xFF; } break; case 8: AnimTask_LeafBlade_Step2(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { task->data[15] = 9; task->data[0] = 0xFF; } break; case 0: AnimTask_LeafBlade_Step2(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { task->data[15] = 1; task->data[0] = 0xFF; } break; case 1: sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; sprite->data[0] = 10; sprite->data[1] = sprite->x; sprite->data[2] = task->data[6]; sprite->data[3] = sprite->y; sprite->data[4] = task->data[7]; sprite->data[5] = LeafBladeGetPosFactor(sprite); task->data[4] += 2; task->data[3] = a; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); InitAnimArcTranslation(sprite); task->data[0]++; break; case 2: AnimTask_LeafBlade_Step2(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { task->data[15] = 3; task->data[0] = 0xFF; } break; case 3: sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; sprite->data[0] = 10; sprite->data[1] = sprite->x; sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5]; sprite->data[3] = sprite->y; sprite->data[4] = task->data[7] - ((task->data[11] / 2) + 10) * task->data[5]; sprite->data[5] = LeafBladeGetPosFactor(sprite); task->data[3] = 2; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); InitAnimArcTranslation(sprite); task->data[0]++; break; case 5: sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; sprite->data[0] = 10; sprite->data[1] = sprite->x; sprite->data[2] = task->data[6] + ((task->data[10] / 2) + 10) * task->data[5]; sprite->data[3] = sprite->y; sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5]; sprite->data[5] = LeafBladeGetPosFactor(sprite); task->data[4] -= 2; task->data[3] = 3; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); InitAnimArcTranslation(sprite); task->data[0]++; break; case 6: AnimTask_LeafBlade_Step2(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { task->data[15] = 7; task->data[0] = 0xFF; } break; case 7: sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; sprite->data[0] = 10; sprite->data[1] = sprite->x; sprite->data[2] = task->data[6]; sprite->data[3] = sprite->y; sprite->data[4] = task->data[7]; sprite->data[5] = LeafBladeGetPosFactor(sprite); task->data[4] += 2; task->data[3] = 4; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); InitAnimArcTranslation(sprite); task->data[0]++; break; case 9: sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; sprite->data[0] = 10; sprite->data[1] = sprite->x; sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5]; sprite->data[3] = sprite->y; sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5]; sprite->data[5] = LeafBladeGetPosFactor(sprite); task->data[3] = 5; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); InitAnimArcTranslation(sprite); task->data[0]++; break; case 10: AnimTask_LeafBlade_Step2(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { task->data[15] = 11; task->data[0] = 0xFF; } break; case 11: { sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; sprite->data[0] = 10; sprite->data[1] = sprite->x; sprite->data[2] = task->data[8]; sprite->data[3] = sprite->y; sprite->data[4] = task->data[9]; sprite->data[5] = LeafBladeGetPosFactor(sprite); task->data[4] -= 2; task->data[3] = 6; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); InitAnimArcTranslation(sprite); task->data[0]++; break; } case 12: AnimTask_LeafBlade_Step2(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { DestroySprite(sprite); task->data[0]++; } break; case 13: if (task->data[12] == 0) DestroyAnimVisualTask(taskId); break; case 0xFF: if (++task->data[1] > 5) { task->data[1] = 0; task->data[0] = task->data[15]; } break; } } static s16 LeafBladeGetPosFactor(struct Sprite* sprite) { s16 var = 8; if (sprite->data[4] < sprite->y) var = -var; return var; } static void AnimTask_LeafBlade_Step2(struct Task* task, u8 taskId) { task->data[14]++; if (task->data[14] > 0) { u8 spriteId; s16 spriteX; s16 spriteY; task->data[14] = 0; spriteX = gSprites[task->data[2]].x + gSprites[task->data[2]].x2; spriteY = gSprites[task->data[2]].y + gSprites[task->data[2]].y2; spriteId = CreateSprite(&gLeafBladeSpriteTemplate, spriteX, spriteY, task->data[4]); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 12; gTasks[taskId].data[12]++; gSprites[spriteId].data[0] = task->data[13] & 1; gTasks[taskId].data[13]++; StartSpriteAnim(&gSprites[spriteId], task->data[3]); gSprites[spriteId].subpriority = task->data[4]; gSprites[spriteId].callback = AnimTask_LeafBlade_Step2_Callback; } } } static void AnimTask_LeafBlade_Step2_Callback(struct Sprite* sprite) { sprite->data[0]++; if (sprite->data[0] > 1) { sprite->data[0] = 0; sprite->invisible ^= 1; sprite->data[1]++; if (sprite->data[1] > 8) { gTasks[sprite->data[6]].data[sprite->data[7]]--; DestroySprite(sprite); } } } static void AnimFlyingParticle(struct Sprite* sprite) { u8 battler; if (!gBattleAnimArgs[6]) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; if (GetBattlerSide(battler) != B_SIDE_PLAYER) { sprite->data[4] = 0; sprite->data[2] = gBattleAnimArgs[3]; sprite->x = 0xFFF0; } else { sprite->data[4] = 1; sprite->data[2] = -gBattleAnimArgs[3]; sprite->x = 0x100; } sprite->data[1] = gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[3] = gBattleAnimArgs[4]; switch (gBattleAnimArgs[5]) { case 0: sprite->y = gBattleAnimArgs[0]; sprite->oam.priority = GetBattlerSpriteBGPriority(battler); break; case 1: sprite->y = gBattleAnimArgs[0]; sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1; break; case 2: sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[0]; sprite->oam.priority = GetBattlerSpriteBGPriority(battler); break; case 3: sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[0]; GetAnimBattlerSpriteId(ANIM_TARGET); sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1; break; } sprite->callback = AnimFlyingParticle_Step; } static void AnimFlyingParticle_Step(struct Sprite* sprite) { int a = sprite->data[7]; sprite->data[7]++; sprite->y2 = (sprite->data[1] * gSineTable[sprite->data[0]]) >> 8; sprite->x2 = sprite->data[2] * a; sprite->data[0] = (sprite->data[3] * a) & 0xFF; if (!sprite->data[4]) { if (sprite->x2 + sprite->x <= 0xF7) return; } else { if (sprite->x2 + sprite->x > -16) return; } DestroySpriteAndMatrix(sprite); } void AnimTask_CycleMagicalLeafPal(u8 taskId) { struct Task* task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[8] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_LEAF)); task->data[12] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_RAZOR_LEAF)); task->data[0]++; break; case 1: if (++task->data[9] >= 0) { task->data[9] = 0; BlendPalette(task->data[8], 16, task->data[10], sMagicalLeafBlendColors[task->data[11]]); BlendPalette(task->data[12], 16, task->data[10], sMagicalLeafBlendColors[task->data[11]]); if (++task->data[10] == 17) { task->data[10] = 0; if (++task->data[11] == 7) task->data[11] = 0; } } break; } if (gBattleAnimArgs[7] == -1) DestroyAnimVisualTask(taskId); } static void AnimNeedleArmSpike(struct Sprite* sprite) { u8 a; u8 b; u16 c; u16 x; u16 y; if (gBattleAnimArgs[4] == 0) { DestroyAnimSprite(sprite); } else { if (gBattleAnimArgs[0] == 0) { a = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); b = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } else { a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } sprite->data[0] = gBattleAnimArgs[4]; if (gBattleAnimArgs[1] == 0) { sprite->x = gBattleAnimArgs[2] + a; sprite->y = gBattleAnimArgs[3] + b; sprite->data[5] = a; sprite->data[6] = b; } else { sprite->x = a; sprite->y = b; sprite->data[5] = gBattleAnimArgs[2] + a; sprite->data[6] = gBattleAnimArgs[3] + b; } x = sprite->x; sprite->data[1] = x * 16; y = sprite->y; sprite->data[2] = y * 16; sprite->data[3] = (sprite->data[5] - sprite->x) * 16 / gBattleAnimArgs[4]; sprite->data[4] = (sprite->data[6] - sprite->y) * 16 / gBattleAnimArgs[4]; c = ArcTan2Neg(sprite->data[5] - x, sprite->data[6] - y); if (IsContest()) c -= 0x8000; TrySetSpriteRotScale(sprite, 0, 0x100, 0x100, c); sprite->callback = AnimNeedleArmSpike_Step; } } static void AnimNeedleArmSpike_Step(struct Sprite* sprite) { if (sprite->data[0]) { sprite->data[1] += sprite->data[3]; sprite->data[2] += sprite->data[4]; sprite->x = sprite->data[1] >> 4 ; sprite->y = sprite->data[2] >> 4 ; sprite->data[0]--; } else { DestroySpriteAndMatrix(sprite); } } static void AnimWhipHit_WaitEnd(struct Sprite* sprite) { if (sprite->animEnded) DestroyAnimSprite(sprite); } static void AnimSlidingHit(struct Sprite* sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } else { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimWhipHit(struct Sprite* sprite) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) StartSpriteAnim(sprite, 1); sprite->callback = AnimWhipHit_WaitEnd; SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; } static void AnimFlickeringPunch(struct Sprite* sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[4]; sprite->data[5] = gBattleAnimArgs[5]; StartSpriteAffineAnim(sprite, gBattleAnimArgs[6]); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteLinearAndFlicker; } // Moves the sprite in a diagonally slashing motion across the target mon. // Used by moves such as MOVE_CUT and MOVE_AERIAL_ACE. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: slice direction; 0 = right-to-left, 1 = left-to-right static void AnimCuttingSlice(struct Sprite* sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) sprite->y += 8; sprite->callback = AnimSlice_Step; if (gBattleAnimArgs[2] == 0) { sprite->x += gBattleAnimArgs[0]; } else { sprite->x -= gBattleAnimArgs[0]; sprite->hFlip = 1; } sprite->y += gBattleAnimArgs[1]; sprite->data[1] -= 0x400; sprite->data[2] += 0x400; sprite->data[5] = gBattleAnimArgs[2]; if (sprite->data[5] == 1) sprite->data[1] = -sprite->data[1]; } static void AnimAirCutterSlice(struct Sprite* sprite) { u8 a; u8 b; switch (gBattleAnimArgs[3]) { case 1: a = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X); b = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y); break; case 2: a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget))) { a = (GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X) + a) / 2; b = (GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y) + b) / 2; } break; case 0: default: a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); break; } sprite->x = a; sprite->y = b; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) sprite->y += 8; sprite->callback = AnimSlice_Step; if (gBattleAnimArgs[2] == 0) { sprite->x += gBattleAnimArgs[0]; } else { sprite->x -= gBattleAnimArgs[0]; sprite->hFlip = 1; } sprite->y += gBattleAnimArgs[1]; sprite->data[1] -= 0x400; sprite->data[2] += 0x400; sprite->data[5] = gBattleAnimArgs[2]; if (sprite->data[5] == 1) sprite->data[1] = -sprite->data[1]; } static void AnimSlice_Step(struct Sprite* sprite) { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; if (sprite->data[5] == 0) sprite->data[1] += 0x18; else sprite->data[1] -= 0x18; sprite->data[2] -= 0x18; sprite->x2 = sprite->data[3] >> 8; sprite->y2 = sprite->data[4] >> 8; sprite->data[0]++; if (sprite->data[0] == 20) { StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->data[0] = 3; sprite->callback = WaitAnimForDuration; } } static void UnusedFlickerAnim(struct Sprite* sprite) { if (sprite->data[2] > 1) { if (sprite->data[3] & 1) { sprite->invisible = FALSE; gSprites[sprite->data[0]].invisible = FALSE; gSprites[sprite->data[1]].invisible = FALSE; } else { sprite->invisible = TRUE; gSprites[sprite->data[0]].invisible = TRUE; gSprites[sprite->data[1]].invisible = TRUE; } sprite->data[2] = 0; sprite->data[3]++; } else { sprite->data[2]++; } if (sprite->data[3] == 10) { DestroySprite(&gSprites[sprite->data[0]]); DestroySprite(&gSprites[sprite->data[1]]); DestroyAnimSprite(sprite); } } static void AnimCirclingMusicNote(struct Sprite* sprite) { sprite->data[0] = gBattleAnimArgs[2]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; StartSpriteAnim(sprite, gBattleAnimArgs[5]); sprite->data[1] = -gBattleAnimArgs[3]; sprite->y += gBattleAnimArgs[1]; sprite->data[3] = gBattleAnimArgs[4]; sprite->callback = AnimCirclingMusicNote_Step; sprite->callback(sprite); } static void AnimCirclingMusicNote_Step(struct Sprite* sprite) { sprite->x2 = Cos(sprite->data[0], 100); sprite->y2 = Sin(sprite->data[0], 20); if (sprite->data[0] < 128) sprite->subpriority = 0; else sprite->subpriority = 14; sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF; sprite->data[5] += 0x82; sprite->y2 += sprite->data[5] >> 8; sprite->data[2]++; if (sprite->data[2] == sprite->data[3]) DestroyAnimSprite(sprite); } static void AnimProtect(struct Sprite* sprite) { if (IsContest()) gBattleAnimArgs[1] += 8; sprite->x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest()) sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker) + 1; else sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_PROTECT)); sprite->data[7] = 16; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7])); sprite->callback = AnimProtect_Step; } static void AnimProtect_Step(struct Sprite *sprite) { int i, id, savedPal; sprite->data[5] += 96; sprite->x2 = -(sprite->data[5] >> 8); if (++sprite->data[1] > 1) { sprite->data[1] = 0; savedPal = gPlttBufferFaded[sprite->data[2] + 1]; i = 0; while (i < 6) { id = sprite->data[2] + ++i; gPlttBufferFaded[id] = gPlttBufferFaded[id + 1]; } gPlttBufferFaded[sprite->data[2] + 7] = savedPal; } if (sprite->data[7] > 6 && sprite->data[0] >0 && ++sprite->data[6] > 1) { sprite->data[6] = 0; sprite->data[7] -= 1; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7])); } if (sprite->data[0] > 0) { sprite->data[0] -= 1; } else if (++sprite->data[6] > 1) { sprite->data[6] = 0; sprite->data[7]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7])); if (sprite->data[7] == 16) { sprite->invisible = TRUE; sprite->callback = DestroyAnimSpriteAndDisableBlend; } } } static void AnimMilkBottle(struct Sprite* sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 0xFFE8; sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 0; sprite->data[3] = 0; sprite->data[4] = 0; sprite->data[6] = 0; sprite->data[7] = 16; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7])); sprite->callback = AnimMilkBottle_Step1; } static void AnimMilkBottle_Step1(struct Sprite* sprite) { switch (sprite->data[0]) { case 0: if (++sprite->data[2] > 0) { sprite->data[2] = 0; if (((++sprite->data[1]) & 1) != 0) { if (sprite->data[6] <= 15) sprite->data[6]++; } else if (sprite->data[7] > 0) sprite->data[7]--; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7])); if (sprite->data[6] == 16 && sprite->data[7] == 0) { sprite->data[1] = 0; sprite->data[0]++; } } break; case 1: if (++sprite->data[1] > 8) { sprite->data[1] = 0; StartSpriteAffineAnim(sprite, 1); sprite->data[0]++; } break; case 2: AnimMilkBottle_Step2(sprite, 16, 4); if (++sprite->data[1] > 2) { sprite->data[1] = 0; sprite->y++; } if (++sprite->data[2] <= 29) break; if (sprite->data[2] & 1) { if (sprite->data[6] > 0) sprite->data[6]--; } else if (sprite->data[7] <= 15) { sprite->data[7]++; } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7])); if (sprite->data[6] == 0 && sprite->data[7] == 16) { sprite->data[1] = 0; sprite->data[2] = 0; sprite->data[0]++; } break; case 3: sprite->invisible = TRUE; sprite->data[0]++; break; case 4: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); DestroyAnimSprite(sprite); break; } } static void AnimMilkBottle_Step2(struct Sprite* sprite, int unk1, int unk2) { if (sprite->data[3] <= 11) sprite->data[4] += 2; if ((u16)(sprite->data[3] - 0x12) <= 0x17) sprite->data[4] -= 2; if ((sprite->data[3]) > 0x2F) sprite->data[4] += 2; sprite->x2 = sprite->data[4] / 9; sprite->y2 = sprite->data[4] / 14; if (sprite->y2 < 0) sprite->y2 *= -1; sprite->data[3]++; if (sprite->data[3] > 0x3B) sprite->data[3] = 0; } static void AnimGrantingStars(struct Sprite* sprite) { if (!gBattleAnimArgs[2]) SetSpriteCoordsToAnimAttackerCoords(sprite); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[5]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[4]; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteLinearFixedPoint; } static void AnimSparklingStars(struct Sprite* sprite) { u8 battler; if (!gBattleAnimArgs[2]) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler))) { SetAverageBattlerPositions(battler, gBattleAnimArgs[6], &sprite->x, &sprite->y); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; } else { if (!gBattleAnimArgs[6]) { sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + gBattleAnimArgs[1]; } else { sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; } SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); } sprite->data[0] = gBattleAnimArgs[5]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[4]; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteLinearFixedPoint; } static void AnimBubbleBurst(struct Sprite* sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } else { sprite->x -= gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; StartSpriteAnim(sprite, 1); } sprite->callback = AnimBubbleBurst_Step; } static void AnimBubbleBurst_Step(struct Sprite* sprite) { if (++sprite->data[0] > 30) { sprite->y2 = (30 - sprite->data[0]) / 3; sprite->x2 = Sin(sprite->data[1] * 4, 3); sprite->data[1]++; } if (sprite->animEnded) DestroyAnimSprite(sprite); } static void AnimSleepLetterZ(struct Sprite* sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[3] = 1; } else { sprite->x -= gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[3] = 0xFFFF; StartSpriteAffineAnim(sprite, 1); } sprite->callback = AnimSleepLetterZ_Step; } static void AnimSleepLetterZ_Step(struct Sprite* sprite) { sprite->y2 = -(sprite->data[0] / 0x28); sprite->x2 = sprite->data[4] / 10; sprite->data[4] += sprite->data[3] * 2; sprite->data[0] += sprite->data[1]; if (++sprite->data[1] > 60) DestroySpriteAndMatrix(sprite); } static void AnimLockOnTarget(struct Sprite* sprite) { sprite->x -= 32; sprite->y -= 32; sprite->data[0] = 20; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step1); } static void AnimLockOnTarget_Step1(struct Sprite* sprite) { switch (sprite->data[5] & 1) { case 0: sprite->data[0] = 1; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step1); break; case 1: sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; sprite->data[0] = 8; sprite->data[2] = sprite->x + sInclineMonCoordTable[sprite->data[5] >> 8][0]; sprite->data[4] = sprite->y + sInclineMonCoordTable[sprite->data[5] >> 8][1]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step2); sprite->data[5] += 0x100; PlaySE12WithPanning(SE_M_LOCK_ON, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); break; } sprite->data[5] ^= 1; } static void AnimLockOnTarget_Step2(struct Sprite* sprite) { if ((sprite->data[5] >> 8) == 4) { sprite->data[0] = 10; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step3); } else { sprite->callback = AnimLockOnTarget_Step1; } } static void AnimLockOnTarget_Step3(struct Sprite* sprite) { s16 a; s16 b; if (sprite->oam.affineParam == 0) { sprite->data[0] = 3; sprite->data[1] = 0; sprite->data[2] = 0; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step4); } else { switch (sprite->oam.affineParam) { case 1: a = -8; b = -8; break; case 2: a = -8; b = 8; break; case 3: a = 8; b = -8; break; default: a = 8; b = 8; break; } sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; sprite->data[0] = 6; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + a; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + b; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step5); } } static void AnimLockOnTarget_Step4(struct Sprite* sprite) { if (sprite->data[2] == 0) { if ((sprite->data[1] += 3) > 16) sprite->data[1] = 16; } else if ((sprite->data[1] -= 3) < 0) { sprite->data[1] = 0; } BlendPalettes(GetBattlePalettesMask(1, 1, 1, 1, 1, 0, 0), sprite->data[1], RGB_WHITE); if (sprite->data[1] == 16) { int pal; sprite->data[2]++; pal = sprite->oam.paletteNum; LoadPalette(&gPlttBufferUnfaded[OBJ_PLTT_ID(pal) + 8], OBJ_PLTT_ID(pal) + 1, PLTT_SIZEOF(2)); PlaySE12WithPanning(SE_M_LEER, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); } else if (sprite->data[1] == 0) { sprite->callback = AnimLockOnTarget_Step5; } } static void AnimLockOnTarget_Step5(struct Sprite* sprite) { if ((u16)gBattleAnimArgs[7] == 0xFFFF) { sprite->data[1] = 0; sprite->data[0] = 0; sprite->callback = AnimLockOnTarget_Step6; } } static void AnimLockOnTarget_Step6(struct Sprite* sprite) { if (sprite->data[0] % 3 == 0) { sprite->data[1]++; sprite->invisible ^= 1; } sprite->data[0]++; if (sprite->data[1] == 8) DestroyAnimSprite(sprite); } static void AnimLockOnMoveTarget(struct Sprite* sprite) { sprite->oam.affineParam = gBattleAnimArgs[0]; if ((s16)sprite->oam.affineParam == 1) { sprite->x -= 0x18; sprite->y -= 0x18; } else if ((s16)sprite->oam.affineParam == 2) { sprite->x -= 0x18; sprite->y += 0x18; sprite->oam.matrixNum = ST_OAM_VFLIP; } else if ((s16)sprite->oam.affineParam == 3) { sprite->x += 0x18; sprite->y -= 0x18; sprite->oam.matrixNum = ST_OAM_HFLIP; } else { sprite->x += 0x18; sprite->y += 0x18; sprite->oam.matrixNum = ST_OAM_HFLIP | ST_OAM_VFLIP; } sprite->oam.tileNum = (sprite->oam.tileNum + 16); sprite->callback = AnimLockOnTarget; sprite->callback(sprite); } static void AnimBowMon(struct Sprite* sprite) { sprite->invisible = TRUE; sprite->data[0] = 0; switch (gBattleAnimArgs[0]) { case 0: sprite->callback = AnimBowMon_Step1; break; case 1: sprite->callback = AnimBowMon_Step2; break; case 2: sprite->callback = AnimBowMon_Step3; break; default: sprite->callback = AnimBowMon_Step4; break; } } static void AnimBowMon_Step1(struct Sprite* sprite) { sprite->data[0] = 6; sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? 2 : -2; sprite->data[2] = 0; sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; StoreSpriteCallbackInData6(sprite, AnimBowMon_Step1_Callback); sprite->callback = TranslateSpriteLinearById; } static void AnimBowMon_Step1_Callback(struct Sprite* sprite) { if (sprite->data[0] == 0) { sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; PrepareBattlerSpriteForRotScale(sprite->data[3], ST_OAM_OBJ_NORMAL); sprite->data[4] = (sprite->data[6] = GetBattlerSide(gBattleAnimAttacker)) ? 0x300 : 0xFFFFFD00; sprite->data[5] = 0; } sprite->data[5] += sprite->data[4]; SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]); SetBattlerSpriteYOffsetFromRotation(sprite->data[3]); if (++sprite->data[0] > 3) { sprite->data[0] = 0; sprite->callback = AnimBowMon_Step4; } } static void AnimBowMon_Step2(struct Sprite* sprite) { sprite->data[0] = 4; sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? -3 : 3; sprite->data[2] = 0; sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; StoreSpriteCallbackInData6(sprite, AnimBowMon_Step4); sprite->callback = TranslateSpriteLinearById; } static void AnimBowMon_Step3(struct Sprite* sprite) { if (++sprite->data[0] > 8) { sprite->data[0] = 0; sprite->callback = AnimBowMon_Step3_Callback; } } static void AnimBowMon_Step3_Callback(struct Sprite* sprite) { if (sprite->data[0] == 0) { sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; sprite->data[6] = GetBattlerSide(gBattleAnimAttacker); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->data[4] = 0xFC00; sprite->data[5] = 0xC00; } else { sprite->data[4] = 0x400; sprite->data[5] = 0xF400; } } sprite->data[5] += sprite->data[4]; SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]); SetBattlerSpriteYOffsetFromRotation(sprite->data[3]); if (++sprite->data[0] > 2) { ResetSpriteRotScale(sprite->data[3]); sprite->callback = AnimBowMon_Step4; } } static void AnimBowMon_Step4(struct Sprite* sprite) { DestroyAnimSprite(sprite); } static void AnimTipMon(struct Sprite *sprite) { sprite->data[0] = 0; sprite->callback = AnimTipMon_Step; } static void AnimTipMon_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->data[1] = 0; sprite->data[2] = gBattlerSpriteIds[gBattleAnimAttacker]; sprite->data[3] = GetBattlerSide(gBattleAnimAttacker); sprite->data[4] = (sprite->data[3] != B_SIDE_PLAYER) ? 0x200 : -0x200; sprite->data[5] = 0; PrepareBattlerSpriteForRotScale(sprite->data[2], ST_OAM_OBJ_NORMAL); sprite->data[0]++; // fall through case 1: sprite->data[5] += sprite->data[4]; SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]); SetBattlerSpriteYOffsetFromRotation(sprite->data[2]); if (++sprite->data[1] > 3) { sprite->data[1] = 0; sprite->data[4] *= -1; sprite->data[0]++; } break; case 2: sprite->data[5] += sprite->data[4]; SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]); SetBattlerSpriteYOffsetFromRotation(sprite->data[2]); if (++sprite->data[1] > 3) { ResetSpriteRotScale(sprite->data[2]); DestroyAnimSprite(sprite); } break; } } void AnimTask_SkullBashPosition(u8 taskId) { u8 side; gTasks[taskId].data[0] = gBattlerSpriteIds[gBattleAnimAttacker]; side = GetBattlerSide(gBattleAnimAttacker); gTasks[taskId].data[1] = side; gTasks[taskId].data[2] = 0; switch (gBattleAnimArgs[0]) { default: DestroyAnimVisualTask(taskId); break; case 0: gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 8; gTasks[taskId].data[4] = 0; gTasks[taskId].data[5] = 3; if (side == B_SIDE_PLAYER) gTasks[taskId].data[5] *= -1; gTasks[taskId].func = AnimTask_SkullBashPositionSet; break; case 1: gTasks[taskId].data[3] = 8; gTasks[taskId].data[4] = 0x600; gTasks[taskId].data[5] = 0xC0; if (side == B_SIDE_PLAYER) { gTasks[taskId].data[4] = -gTasks[taskId].data[4]; gTasks[taskId].data[5] = -gTasks[taskId].data[5]; } gTasks[taskId].func = AnimTask_SkullBashPositionReset; break; } } static void AnimTask_SkullBashPositionSet(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[2]) { case 0: if (task->data[3]) { task->data[4] += task->data[5]; gSprites[task->data[0]].x2 = task->data[4]; task->data[3]--; } else { task->data[3] = 8; task->data[4] = 0; task->data[5] = (task->data[1] == 0) ? -0xC0 : 0xC0; PrepareBattlerSpriteForRotScale(task->data[0], ST_OAM_OBJ_NORMAL); task->data[2]++; } break; case 1: if (task->data[3]) { task->data[4] += task->data[5]; SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]); SetBattlerSpriteYOffsetFromRotation(task->data[0]); task->data[3]--; } else { task->data[3] = 8; task->data[4] = gSprites[task->data[0]].x2; task->data[5] = (task->data[1] == 0) ? 0x2 : -0x2; task->data[6] = 1; task->data[2]++; } break; case 2: if (task->data[3]) { if (task->data[6]) { task->data[6]--; } else { if (task->data[3] & 1) gSprites[task->data[0]].x2 = task->data[4] + task->data[5]; else gSprites[task->data[0]].x2 = task->data[4] - task->data[5]; task->data[6] = 1; task->data[3]--; } } else { gSprites[task->data[0]].x2 = task->data[4]; task->data[3] = 12; task->data[2]++; } break; case 3: if (task->data[3]) { task->data[3]--; } else { task->data[3] = 3; task->data[4] = gSprites[task->data[0]].x2; task->data[5] = (task->data[1] == 0) ? 8 : -8; task->data[2]++; } break; case 4: if (task->data[3]) { task->data[4] += task->data[5]; gSprites[task->data[0]].x2 = task->data[4]; task->data[3]--; } else { DestroyAnimVisualTask(taskId); } break; } } static void AnimTask_SkullBashPositionReset(u8 taskId) { struct Task* task = &gTasks[taskId]; if (task->data[3]) { task->data[4] -= task->data[5]; SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]); SetBattlerSpriteYOffsetFromRotation(task->data[0]); task->data[3]--; } else { ResetSpriteRotScale(task->data[0]); DestroyAnimVisualTask(taskId); } } static void AnimSlashSlice(struct Sprite* sprite) { if (gBattleAnimArgs[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; } sprite->data[0] = 0; sprite->data[1] = 0; StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSlice_Step3); sprite->callback = RunStoredCallbackWhenAnimEnds; } static void AnimFalseSwipeSlice(struct Sprite* sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 0xFFD0; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSlice_Step1); sprite->callback = RunStoredCallbackWhenAnimEnds; } static void AnimFalseSwipePositionedSlice(struct Sprite* sprite) { sprite->x = sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 0xFFD0 + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); StartSpriteAnim(sprite, 1); sprite->data[0] = 0; sprite->data[1] = 0; sprite->callback = AnimFalseSwipeSlice_Step3; } static void AnimFalseSwipeSlice_Step1(struct Sprite* sprite) { if (++sprite->data[0] > 8) { sprite->data[0] = 12; sprite->data[1] = 8; sprite->data[2] = 0; StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSlice_Step2); sprite->callback = TranslateSpriteLinear; } } static void AnimFalseSwipeSlice_Step2(struct Sprite* sprite) { sprite->data[0] = 0; sprite->data[1] = 0; sprite->callback = AnimFalseSwipeSlice_Step3; } static void AnimFalseSwipeSlice_Step3(struct Sprite* sprite) { if (++sprite->data[0] > 1) { sprite->data[0] = 0; sprite->invisible = !sprite->invisible; if (++sprite->data[1] > 8) DestroyAnimSprite(sprite); } } static void AnimEndureEnergy(struct Sprite* sprite) { if (gBattleAnimArgs[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[2]; } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[2]; } sprite->data[0] = 0; sprite->data[1] = gBattleAnimArgs[3]; sprite->callback = AnimEndureEnergy_Step; } static void AnimEndureEnergy_Step(struct Sprite* sprite) { if (++sprite->data[0] > sprite->data[1]) { sprite->data[0] = 0; sprite->y--; } sprite->y -= sprite->data[0]; if (sprite->animEnded) DestroyAnimSprite(sprite); } static void AnimSharpenSphere(struct Sprite* sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) - 12; sprite->data[0] = 0; sprite->data[1] = 2; sprite->data[2] = 0; sprite->data[3] = 0; sprite->data[4] = 0; sprite->data[5] = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER); sprite->callback = AnimSharpenSphere_Step; } static void AnimSharpenSphere_Step(struct Sprite* sprite) { if (++sprite->data[0] >= sprite->data[1]) { sprite->invisible = !sprite->invisible; if (!sprite->invisible) { sprite->data[4]++; if (!(sprite->data[4] & 1)) PlaySE12WithPanning(SE_M_SWAGGER2, sprite->data[5]); } sprite->data[0] = 0; if (++sprite->data[2] > 1) { sprite->data[2] = 0; sprite->data[1]++; } } if (sprite->animEnded && sprite->data[1] > 16 && sprite->invisible) DestroyAnimSprite(sprite); } static void AnimConversion(struct Sprite* sprite) { if (sprite->data[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; if (IsContest()) sprite->y += 10; sprite->data[0]++; } if ((u16)gBattleAnimArgs[7] == 0xFFFF) DestroyAnimSprite(sprite); } void AnimTask_ConversionAlphaBlend(u8 taskId) { if (gTasks[taskId].data[2] == 1) { gBattleAnimArgs[7] = 0xFFFF; gTasks[taskId].data[2]++; } else if (gTasks[taskId].data[2] == 2) { DestroyAnimVisualTask(taskId); } else { if (++gTasks[taskId].data[0] == 4) { gTasks[taskId].data[0] = 0; gTasks[taskId].data[1]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - gTasks[taskId].data[1], gTasks[taskId].data[1])); if (gTasks[taskId].data[1] == 16) gTasks[taskId].data[2]++; } } } static void AnimConversion2(struct Sprite* sprite) { InitSpritePosToAnimTarget(sprite, FALSE); sprite->animPaused = TRUE; sprite->data[0] = gBattleAnimArgs[2]; sprite->callback = AnimConversion2_Step; } static void AnimConversion2_Step(struct Sprite* sprite) { if (sprite->data[0]) { sprite->data[0]--; } else { sprite->animPaused = FALSE; sprite->data[0] = 30; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } } void AnimTask_Conversion2AlphaBlend(u8 taskId) { if (++gTasks[taskId].data[0] == 4) { gTasks[taskId].data[0] = 0; gTasks[taskId].data[1]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1])); if (gTasks[taskId].data[1] == 16) DestroyAnimVisualTask(taskId); } } // Unused static void AnimTask_HideBattlersHealthbox(u8 taskId) { u32 i; for (i = 0; i < gBattlersCount; i++) { if (gBattleAnimArgs[0] == TRUE && GetBattlerSide(i) == B_SIDE_PLAYER) SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]); if (gBattleAnimArgs[1] == TRUE && GetBattlerSide(i) == B_SIDE_OPPONENT) SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]); } DestroyAnimVisualTask(taskId); } // Unused static void AnimTask_ShowBattlersHealthbox(u8 taskId) { u32 i; for (i = 0; i < gBattlersCount; i++) SetHealthboxSpriteVisible(gHealthboxSpriteIds[i]); DestroyAnimVisualTask(taskId); } static void AnimMoon(struct Sprite* sprite) { if (IsContest()) { sprite->x = 48; sprite->y = 40; } else { sprite->x = gBattleAnimArgs[0]; sprite->y = gBattleAnimArgs[1]; } sprite->oam.shape = SPRITE_SHAPE(8x8); sprite->oam.size = SPRITE_SIZE(64x32); sprite->data[0] = 0; sprite->callback = AnimMoon_Step; } static void AnimMoon_Step(struct Sprite* sprite) { if (sprite->data[0]) DestroyAnimSprite(sprite); } static void AnimMoonlightSparkle(struct Sprite* sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; sprite->y = gBattleAnimArgs[1]; sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 0; sprite->data[3] = 0; sprite->data[4] = 1; sprite->callback = AnimMoonlightSparkle_Step; } static void AnimMoonlightSparkle_Step(struct Sprite* sprite) { if (++sprite->data[1] > 1) { sprite->data[1] = 0; if (sprite->data[2] < 120) { sprite->y++; sprite->data[2]++; } } if (sprite->data[0]) DestroyAnimSprite(sprite); } void AnimTask_MoonlightEndFade_Step(u8); void AnimTask_MoonlightEndFade(u8 taskId) { int a = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) & 0xFFFF; int b; int c; int d; gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = a; gTasks[taskId].data[4] = 0; gTasks[taskId].data[5] = 0; gTasks[taskId].data[6] = 0; gTasks[taskId].data[7] = 13; gTasks[taskId].data[8] = 14; gTasks[taskId].data[9] = 15; b = GetBattleMonSpritePalettesMask(1, 1, 1, 1); c = a | b; StorePointerInVars(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void *)c); b = b | (0x10000 << IndexOfSpritePaletteTag(ANIM_TAG_MOON)); d = IndexOfSpritePaletteTag(ANIM_TAG_GREEN_SPARKLE); BeginNormalPaletteFade((0x10000 << d) | b, 0, 0, 16, RGB(27, 29, 31)); gTasks[taskId].func = AnimTask_MoonlightEndFade_Step; gTasks[taskId].func(taskId); } void AnimTask_MoonlightEndFade_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (++task->data[1] > 0) { u16 color; u16 bitmask; u16 r3; u32 i; u32 j; task->data[1] = 0; if (++task->data[2] <= 15) { u16 red; u16 green; u16 blue; task->data[4] += task->data[7]; task->data[5] += task->data[8]; task->data[6] += task->data[9]; red = task->data[4] >> 3; green = task->data[5] >> 3; blue = task->data[6] >> 3; color = RGB(red, green, blue); } else { color = RGB(27, 29, 31); task->data[0]++; } bitmask = 1; r3 = 0; for (i = 0; i <= 15; i++) { if (task->data[3] & bitmask) { for (j = 1; j <= 15; j++) { gPlttBufferFaded[r3 + j] = color; } } bitmask <<= 1; r3 += 16; } } break; case 1: if (!gPaletteFade.active) { u8 spriteId; for (spriteId = 0; spriteId < MAX_SPRITES; spriteId++) { if (gSprites[spriteId].template == &gMoonSpriteTemplate || gSprites[spriteId].template == &gMoonlightSparkleSpriteTemplate) gSprites[spriteId].data[0] = 1; } task->data[1] = 0; task->data[0]++; } break; case 2: if (++task->data[1] > 30) { BeginNormalPaletteFade((u32)LoadPointerFromVars(task->data[14], task->data[15]), 0, 16, 0, RGB(27, 29, 31)); task->data[0]++; } break; case 3: if (!gPaletteFade.active) DestroyAnimVisualTask(taskId); break; } } static void AnimHornHit(struct Sprite* sprite) { if (gBattleAnimArgs[2] < 2) gBattleAnimArgs[2] = 2; if (gBattleAnimArgs[2] > 0x7F) gBattleAnimArgs[2] = 0x7F; sprite->data[0] = 0; sprite->data[1] = gBattleAnimArgs[2]; sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; sprite->data[6] = sprite->x; sprite->data[7] = sprite->y; if (IsContest()) { sprite->oam.matrixNum = ST_OAM_HFLIP; sprite->x += 40; sprite->y += 20; sprite->data[2] = sprite->x << 7; sprite->data[3] = -0x1400 / sprite->data[1]; sprite->data[4] = sprite->y << 7; sprite->data[5] = -0xA00 / sprite->data[1]; } else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { sprite->x -= 40; sprite->y += 20; sprite->data[2] = sprite->x << 7; sprite->data[3] = 0x1400 / sprite->data[1]; sprite->data[4] = sprite->y << 7; sprite->data[5] = -0xA00 / sprite->data[1]; } else { sprite->x += 40; sprite->y -= 20; sprite->data[2] = sprite->x << 7; sprite->data[3] = -0x1400 / sprite->data[1]; sprite->data[4] = sprite->y << 7; sprite->data[5] = 0xA00 / sprite->data[1]; sprite->oam.matrixNum = (ST_OAM_HFLIP | ST_OAM_VFLIP); } sprite->callback = AnimHornHit_Step; } static void AnimHornHit_Step(struct Sprite* sprite) { sprite->data[2] += sprite->data[3]; sprite->data[4] += sprite->data[5]; sprite->x = sprite->data[2] >> 7; sprite->y = sprite->data[4] >> 7; if (--sprite->data[1] == 1) { sprite->x = sprite->data[6]; sprite->y = sprite->data[7]; } if (sprite->data[1] == 0) DestroyAnimSprite(sprite); } void AnimTask_DoubleTeam(u8 taskId) { u32 i; int obj; u16 r3; u16 r4; struct Task* task = &gTasks[taskId]; task->data[0] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[1] = AllocSpritePalette(ANIM_TAG_BENT_SPOON); r3 = OBJ_PLTT_ID(task->data[1]); r4 = OBJ_PLTT_ID2(gSprites[task->data[0]].oam.paletteNum); for (i = 1; i < 16; i++) gPlttBufferUnfaded[r3 + i] = gPlttBufferUnfaded[r4 + i]; BlendPalette(r3, 16, 11, RGB_BLACK); task->data[3] = 0; i = 0; while (i < 2 && (obj = CloneBattlerSpriteWithBlend(0)) >= 0) { gSprites[obj].oam.paletteNum = task->data[1]; gSprites[obj].data[0] = 0; gSprites[obj].data[1] = i << 7; gSprites[obj].data[2] = taskId; gSprites[obj].callback = AnimDoubleTeam; task->data[3]++; i++; } task->func = AnimTask_DoubleTeam_Step; if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); else ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); } static void AnimTask_DoubleTeam_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; if (!task->data[3]) { if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); else SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON); DestroyAnimVisualTask(taskId); } } static void AnimDoubleTeam(struct Sprite* sprite) { if (++sprite->data[3] > 1) { sprite->data[3] = 0; sprite->data[0]++; } if (sprite->data[0] > 64) { gTasks[sprite->data[2]].data[3]--; DestroySpriteWithActiveSheet(sprite); } else { sprite->data[4] = gSineTable[sprite->data[0]] / 6; sprite->data[5] = gSineTable[sprite->data[0]] / 13; sprite->data[1] = (sprite->data[1] + sprite->data[5]) & 0xFF; sprite->x2 = Sin(sprite->data[1], sprite->data[4]); } } static void AnimSuperFang(struct Sprite* sprite) { StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = RunStoredCallbackWhenAnimEnds; } void AnimTask_MusicNotesRainbowBlend(u8 taskId) { u32 i; u32 j; u16 index; index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[0][0]); if (index != 0xFF) { index = OBJ_PLTT_ID(index); for (i = 1; i < NELEMS(sParticlesColorBlendTable[0]); i++) gPlttBufferFaded[index + i] = sParticlesColorBlendTable[0][i]; } for (j = 1; j < NELEMS(sParticlesColorBlendTable); j++) { index = AllocSpritePalette(sParticlesColorBlendTable[j][0]); if (index != 0xFF) { index = OBJ_PLTT_ID(index); for (i = 1; i < NELEMS(sParticlesColorBlendTable[0]); i++) gPlttBufferFaded[index + i] = sParticlesColorBlendTable[j][i]; } } DestroyAnimVisualTask(taskId); } // clears the rainbow effect for musical notes. void AnimTask_MusicNotesClearRainbowBlend(u8 taskId) { u32 i; for (i = 1; i < NELEMS(sParticlesColorBlendTable); i++) FreeSpritePaletteByTag(sParticlesColorBlendTable[i][0]); DestroyAnimVisualTask(taskId); } #define sMoveTimer data[0] #define sBlendTableIdx data[1] #define sBlendTimer data[2] #define sBlendCycleTime data[3] #define sX data[4] #define sY data[5] #define sVelocX data[6] #define sVelocY data[7] static void AnimWavyMusicNotes(struct Sprite* sprite) { u8 index; u8 x, y; SetSpriteCoordsToAnimAttackerCoords(sprite); StartSpriteAnim(sprite, gBattleAnimArgs[0]); if ((index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[gBattleAnimArgs[1]][0])) != 0xFF) sprite->oam.paletteNum = index; sprite->sBlendTableIdx = gBattleAnimArgs[1]; sprite->sBlendTimer = 0; sprite->sBlendCycleTime = gBattleAnimArgs[2]; if (IsContest()) { x = 48; y = 40; } else { x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } sprite->sX = sprite->x << 4; sprite->sY = sprite->y << 4; AnimWavyMusicNotes_CalcVelocity(x - sprite->x, y - sprite->y, &sprite->sVelocX, &sprite->sVelocY, 40); sprite->callback = AnimWavyMusicNotes_Step; } static void AnimWavyMusicNotes_CalcVelocity(s16 x, s16 y, s16 *velocX, s16 *velocY, s8 xSpeedFactor) { int x2; int time; if (x < 0) xSpeedFactor = -xSpeedFactor; x2 = x * 256; time = x2 / xSpeedFactor; if (time == 0) time = 1; *velocX = x2 / time; *velocY = (y * 256) / time; } static void AnimWavyMusicNotes_Step(struct Sprite* sprite) { s16 y, trigIdx; u8 index; sprite->sMoveTimer++; trigIdx = sprite->sMoveTimer * 5 - ((sprite->sMoveTimer * 5 / 256) << 8); sprite->sX += sprite->sVelocX; sprite->sY += sprite->sVelocY; sprite->x = sprite->sX >> 4; sprite->y = sprite->sY >> 4; sprite->y2 = Sin(trigIdx, 15); y = sprite->y; if (sprite->x < -16 || sprite->x > DISPLAY_WIDTH + 16 || y < -16 || y > DISPLAY_HEIGHT - 32) { DestroySpriteAndMatrix(sprite); } else { if (sprite->sBlendCycleTime && ++sprite->sBlendTimer > sprite->sBlendCycleTime) { sprite->sBlendTimer = 0; if (++sprite->sBlendTableIdx > 3) sprite->sBlendTableIdx = 0; index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[sprite->sBlendTableIdx][0]); if (index != 0xFF) sprite->oam.paletteNum = index; } } } static void AnimFlyingMusicNotes(struct Sprite* sprite) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) gBattleAnimArgs[1] *= -1; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; StartSpriteAnim(sprite, gBattleAnimArgs[0]); sprite->data[2] = 0; sprite->data[3] = 0; sprite->data[4] = sprite->x << 4; sprite->data[5] = sprite->y << 4; sprite->data[6] = (gBattleAnimArgs[1] << 4) / 5; sprite->data[7] = (gBattleAnimArgs[2] << 7) / 5; sprite->callback = AnimFlyingMusicNotes_Step; } static void AnimFlyingMusicNotes_Step(struct Sprite* sprite) { sprite->data[4] += sprite->data[6]; sprite->data[5] += sprite->data[7]; sprite->x = sprite->data[4] >> 4; sprite->y = sprite->data[5] >> 4; if (sprite->data[0] > 5 && sprite->data[3] == 0) { sprite->data[2] = (sprite->data[2] + 16) & 0xFF; sprite->x2 = Cos(sprite->data[2], 18); sprite->y2 = Sin(sprite->data[2], 18); if (sprite->data[2] == 0) sprite->data[3] = 1; } if (++sprite->data[0] == 48) DestroySpriteAndMatrix(sprite); } static void AnimBellyDrumHand(struct Sprite* sprite) { s16 a; if (gBattleAnimArgs[0] == 1) { sprite->oam.matrixNum = ST_OAM_HFLIP; a = 16; } else { a = -16; } sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + a; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 8; sprite->data[0] = 8; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimSlowFlyingMusicNotes(struct Sprite* sprite) { s16 xDiff; u8 index; SetSpriteCoordsToAnimAttackerCoords(sprite); sprite->y += 8; StartSpriteAnim(sprite, gBattleAnimArgs[1]); index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[gBattleAnimArgs[2]][0]); if (index != 0xFF) sprite->oam.paletteNum = index; xDiff = (gBattleAnimArgs[0] == 0) ? -32 : 32; sprite->data[0] = 40; sprite->data[1] = sprite->x; sprite->data[2] = xDiff + sprite->data[1]; sprite->data[3] = sprite->y; sprite->data[4] = sprite->data[3] - 40; InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = AnimSlowFlyingMusicNotes_Step; } static void AnimSlowFlyingMusicNotes_Step(struct Sprite* sprite) { if (!AnimTranslateLinear(sprite)) { s16 xDiff; xDiff = Sin(sprite->data[5], 8); if (sprite->x2 < 0) xDiff = -xDiff; sprite->x2 += xDiff; sprite->y2 += Sin(sprite->data[5], 4); sprite->data[5] = (sprite->data[5] + 8) & 0xFF; } else { DestroyAnimSprite(sprite); } } void SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8; else sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8; sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) - (s16)GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4; } static void AnimThoughtBubble(struct Sprite* sprite) { u8 animNum; u8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; SetSpriteNextToMonHead(battler, sprite); animNum = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? 0 : 1; sprite->data[0] = gBattleAnimArgs[1]; sprite->data[1] = animNum + 2; StartSpriteAnim(sprite, animNum); StoreSpriteCallbackInData6(sprite, AnimThoughtBubble_Step); sprite->callback = RunStoredCallbackWhenAnimEnds; } static void AnimThoughtBubble_Step(struct Sprite* sprite) { if (--sprite->data[0] == 0) { StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StartSpriteAnim(sprite, sprite->data[1]); sprite->callback = RunStoredCallbackWhenAnimEnds; } } static void AnimMetronomeFinger(struct Sprite* sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; SetSpriteNextToMonHead(battler, sprite); sprite->data[0] = 0; StoreSpriteCallbackInData6(sprite, AnimMetronomeFinger_Step); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } static void AnimMetronomeFinger_Step(struct Sprite* sprite) { if (++sprite->data[0] > 16) { StartSpriteAffineAnim(sprite, 1); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } } static void AnimFollowMeFinger(struct Sprite* sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP); if (sprite->y <= 9) sprite->y = 10; sprite->data[0] = 1; sprite->data[1] = 0; sprite->data[2] = sprite->subpriority; sprite->data[3] = sprite->subpriority + 4; sprite->data[4] = 0; StoreSpriteCallbackInData6(sprite, AnimFollowMeFinger_Step1); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } static void AnimFollowMeFinger_Step1(struct Sprite* sprite) { if (++sprite->data[4] > 12) sprite->callback = AnimFollowMeFinger_Step2; } static void AnimFollowMeFinger_Step2(struct Sprite* sprite) { s16 x1, x2; sprite->data[1] += 4; if (sprite->data[1] > 254) { if (--sprite->data[0] == 0) { sprite->x2 = 0; sprite->callback = AnimMetronomeFinger_Step; return; } else { sprite->data[1] &= 0xFF; } } if (sprite->data[1] > 0x4F) sprite->subpriority = sprite->data[3]; if (sprite->data[1] > 0x9F) sprite->subpriority = sprite->data[2]; x1 = gSineTable[sprite->data[1]]; x2 = x1 >> 3; sprite->x2 = (x1 >> 3) + (x2 >> 1); } static void AnimTauntFinger(struct Sprite* sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; SetSpriteNextToMonHead(battler, sprite); if (GetBattlerSide(battler) == B_SIDE_PLAYER) { StartSpriteAnim(sprite, 0); sprite->data[0] = 2; } else { StartSpriteAnim(sprite, 1); sprite->data[0] = 3; } sprite->callback = AnimTauntFinger_Step1; } static void AnimTauntFinger_Step1(struct Sprite* sprite) { if (++sprite->data[1] > 10) { sprite->data[1] = 0; StartSpriteAnim(sprite, sprite->data[0]); StoreSpriteCallbackInData6(sprite, AnimTauntFinger_Step2); sprite->callback = RunStoredCallbackWhenAnimEnds; } } static void AnimTauntFinger_Step2(struct Sprite* sprite) { if (++sprite->data[1] > 5) DestroyAnimSprite(sprite); } ================================================ FILE: src/battle_anim_effects_2.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "battle_interface.h" #include "decompress.h" #include "graphics.h" #include "math_util.h" #include "random.h" #include "scanline_effect.h" #include "trig.h" #include "util.h" #include "constants/songs.h" static void AnimBouncingMusicNote(struct Sprite *); static void AnimBouncingMusicNote_Step(struct Sprite *); static void AnimMovingClamp(struct Sprite *); static void AnimMovingClamp_Step(struct Sprite *); static void AnimMovingClamp_End(struct Sprite *); static void AnimTask_Withdraw_Step(u8); static void AnimSwordsDanceBlade(struct Sprite *); static void AnimSwordsDanceBlade_Step(struct Sprite *); static void AnimVoidLines(struct Sprite *); static void AnimVoidLines_Step(struct Sprite *); static void AnimFallingCoin(struct Sprite *); static void AnimFallingCoin_Step(struct Sprite *); static void AnimBulletSeed(struct Sprite *); static void AnimBulletSeed_Step1(struct Sprite *); static void AnimBulletSeed_Step2(struct Sprite *); static void AnimViceGripPincer(struct Sprite *); static void AnimViceGripPincer_Step(struct Sprite *); static void AnimGuillotinePincer(struct Sprite *); static void AnimGuillotinePincer_Step1(struct Sprite *); static void AnimGuillotinePincer_Step2(struct Sprite *); static void AnimGuillotinePincer_Step3(struct Sprite *); static void AnimTask_GrowAndGrayscale_Step(u8); static void AnimTask_Minimize_Step1(u8); static void CreateMinimizeSprite(struct Task *, u8); static void ClonedMinizeSprite_Step(struct Sprite *); static void AnimTask_Splash_Step(u8); static void AnimTask_GrowAndShrink_Step(u8); static void AnimTask_ThrashMoveMonHorizontal_Step(u8); static void AnimTask_ThrashMoveMonVertical_Step(u8); static void AnimTask_SketchDrawMon_Step(u8); static void AnimPencil(struct Sprite *); static void AnimPencil_Step(struct Sprite *); static void AnimSoftBoiledEgg(struct Sprite *); static void AnimSoftBoiledEgg_Step1(struct Sprite *); static void AnimSoftBoiledEgg_Step2(struct Sprite *); static void AnimSoftBoiledEgg_Step3(struct Sprite *); static void AnimSoftBoiledEgg_Step3_Callback1(struct Sprite *); static void AnimSoftBoiledEgg_Step3_Callback2(struct Sprite *); static void AnimSoftBoiledEgg_Step4(struct Sprite *); static void AnimSoftBoiledEgg_Step4_Callback(struct Sprite *); static void AnimTask_AttackerStretchAndDisappear_Step(u8); static void AnimTask_ExtremeSpeedImpact_Step(u8); static void AnimTask_ExtremeSpeedMonReappear_Step(u8); static void AnimTask_SpeedDust_Step(u8); static void AnimTask_FakeOut_Step1(u8); static void AnimTask_FakeOut_Step2(u8); static void AnimRedHeartProjectile(struct Sprite *); static void AnimRedHeartProjectile_Step(struct Sprite *); static void AnimRedHeartRising(struct Sprite *); static void AnimRedHeartRising_Step(struct Sprite *); static void AnimTask_HeartsBackground_Step(u8); static void AnimTask_ScaryFace_Step(u8); static void AnimOrbitFast(struct Sprite *); static void AnimOrbitFast_Step(struct Sprite *); static void AnimOrbitScatter(struct Sprite *); static void AnimOrbitScatter_Step(struct Sprite *); static void AnimMovementWaves(struct Sprite *); static void AnimMovementWaves_Step(struct Sprite *); static void AnimTask_UproarDistortion_Step(u8); static void AnimJaggedMusicNote(struct Sprite *); static void AnimJaggedMusicNote_Step(struct Sprite *); static void AnimPerishSongMusicNote2(struct Sprite *); static void AnimPerishSongMusicNote(struct Sprite *); static void AnimPerishSongMusicNote_Step1(struct Sprite *); static void AnimPerishSongMusicNote_Step2(struct Sprite *); static void AnimCirclingFinger(struct Sprite *); static void AnimVibrateBattlerBack(struct Sprite *); static void AnimKinesisZapEnergy(struct Sprite *); static void AnimSonicBoomProjectile(struct Sprite *); static void AnimAirWaveProjectile(struct Sprite *); static void AnimCoinThrow(struct Sprite *); static void AnimRazorWindTornado(struct Sprite *); static void AnimBreathPuff(struct Sprite *); static void AnimAngerMark(struct Sprite *); static void AnimBlendThinRing(struct Sprite *); static void AnimHyperVoiceRing(struct Sprite *); static void AnimUproarRing(struct Sprite *); static void AnimSpeedDust(struct Sprite *); static void AnimHealBellMusicNote(struct Sprite *); static void AnimMagentaHeart(struct Sprite *); static void AnimSpitUpOrb(struct Sprite *); static void AnimEyeSparkle(struct Sprite *); static void AnimAngel(struct Sprite *); static void AnimPinkHeart(struct Sprite *); static void AnimDevil(struct Sprite *); static void AnimFurySwipes(struct Sprite *); static void AnimGuardRing(struct Sprite *); // Unused static const struct SpriteTemplate sCirclingFingerSpriteTemplate = { .tileTag = ANIM_TAG_FINGER, .paletteTag = ANIM_TAG_FINGER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCirclingFinger, }; static const union AnimCmd sAnim_BouncingMusicNote[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; // Unused (association assumed) static const union AnimCmd *const sAnims_BouncingMusicNote[] = { sAnim_BouncingMusicNote, }; // Unused static const struct SpriteTemplate sBouncingMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBouncingMusicNote, }; // Unused static const struct SpriteTemplate sVibrateBattlerBackSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimVibrateBattlerBack, }; // Unused static const struct SpriteTemplate sMovingClampSpriteTemplate = { .tileTag = ANIM_TAG_CLAMP, .paletteTag = ANIM_TAG_CLAMP, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_Bite, .callback = AnimMovingClamp, }; static const union AnimCmd sAnim_SmallExplosion[] = { ANIMCMD_FRAME(0, 9), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_END, }; static const union AnimCmd *const sAnims_SmallExplosion[] = { sAnim_SmallExplosion, }; static const union AffineAnimCmd sAffineAnim_SmallExplosion[] = { AFFINEANIMCMD_FRAME(80, 80, 0, 0), AFFINEANIMCMD_FRAME(9, 9, 0, 18), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_SmallExplosion[] = { sAffineAnim_SmallExplosion, }; // Unused static const struct SpriteTemplate sSmallExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_6, .paletteTag = ANIM_TAG_EXPLOSION_6, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_SmallExplosion, .images = NULL, .affineAnims = sAffineAnims_SmallExplosion, .callback = AnimSpriteOnMonPos, }; static const union AnimCmd sKinesisZapEnergyAnimCmds[] = { ANIMCMD_FRAME(0, 3, .hFlip = TRUE), ANIMCMD_FRAME(8, 3, .hFlip = TRUE), ANIMCMD_FRAME(16, 3, .hFlip = TRUE), ANIMCMD_FRAME(24, 3, .hFlip = TRUE), ANIMCMD_FRAME(32, 3, .hFlip = TRUE), ANIMCMD_FRAME(40, 3, .hFlip = TRUE), ANIMCMD_FRAME(48, 3, .hFlip = TRUE), ANIMCMD_LOOP(1), ANIMCMD_END, }; static const union AnimCmd *const sKinesisZapEnergyAnimTable[] = { sKinesisZapEnergyAnimCmds, }; const struct SpriteTemplate gKinesisZapEnergySpriteTemplate = { .tileTag = ANIM_TAG_ALERT, .paletteTag = ANIM_TAG_ALERT, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = sKinesisZapEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimKinesisZapEnergy, }; static const union AffineAnimCmd sSwordsDanceBladeAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(16, 256, 0, 0), AFFINEANIMCMD_FRAME(20, 0, 0, 12), AFFINEANIMCMD_FRAME(0, 0, 0, 32), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sSwordsDanceBladeAffineAnimTable[] = { sSwordsDanceBladeAffineAnimCmds, }; const struct SpriteTemplate gSwordsDanceBladeSpriteTemplate = { .tileTag = ANIM_TAG_SWORD, .paletteTag = ANIM_TAG_SWORD, .oam = &gOamData_AffineNormal_ObjBlend_32x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSwordsDanceBladeAffineAnimTable, .callback = AnimSwordsDanceBlade, }; const struct SpriteTemplate gSonicBoomSpriteTemplate = { .tileTag = ANIM_TAG_AIR_WAVE, .paletteTag = ANIM_TAG_AIR_WAVE, .oam = &gOamData_AffineDouble_ObjBlend_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSonicBoomProjectile, }; const struct SpriteTemplate gAirWaveProjectileSpriteTemplate = { .tileTag = ANIM_TAG_AIR_WAVE, .paletteTag = ANIM_TAG_AIR_WAVE, .oam = &gOamData_AffineOff_ObjBlend_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimAirWaveProjectile, }; static const union AffineAnimCmd sGrowingRingAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(32, 32, 0, 0), AFFINEANIMCMD_FRAME(7, 7, 0, -56), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sWaterPulseRingAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(5, 5, 0, 10), AFFINEANIMCMD_FRAME(-10, -10, 0, 10), AFFINEANIMCMD_FRAME(10, 10, 0, 10), AFFINEANIMCMD_FRAME(-10, -10, 0, 10), AFFINEANIMCMD_FRAME(10, 10, 0, 10), AFFINEANIMCMD_FRAME(-10, -10, 0, 10), AFFINEANIMCMD_FRAME(10, 10, 0, 10), AFFINEANIMCMD_END, }; const union AffineAnimCmd *const gGrowingRingAffineAnimTable[] = { sGrowingRingAffineAnimCmds, }; static const union AffineAnimCmd *const sWaterPulseRingAffineAnimTable[] = { sWaterPulseRingAffineAnimCmds, }; const struct SpriteTemplate gSupersonicRingSpriteTemplate = { .tileTag = ANIM_TAG_GOLD_RING, .paletteTag = ANIM_TAG_GOLD_RING, .oam = &gOamData_AffineDouble_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGrowingRingAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation, }; const struct SpriteTemplate gScreechRingSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_RING, .paletteTag = ANIM_TAG_PURPLE_RING, .oam = &gOamData_AffineDouble_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGrowingRingAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation, }; const struct SpriteTemplate gMetalSoundSpriteTemplate = { .tileTag = ANIM_TAG_METAL_SOUND_WAVES, .paletteTag = ANIM_TAG_METAL_SOUND_WAVES, .oam = &gOamData_AffineDouble_ObjNormal_32x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGrowingRingAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation, }; const struct SpriteTemplate gWaterPulseRingSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_RING_2, .paletteTag = ANIM_TAG_BLUE_RING_2, .oam = &gOamData_AffineDouble_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sWaterPulseRingAffineAnimTable, .callback = AnimWaterPulseRing, }; const struct SpriteTemplate gEggThrowSpriteTemplate = { .tileTag = ANIM_TAG_LARGE_FRESH_EGG, .paletteTag = ANIM_TAG_LARGE_FRESH_EGG, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThrowProjectile, }; static const struct SpriteTemplate sVoidLinesSpriteTemplate = { .tileTag = ANIM_TAG_VOID_LINES, .paletteTag = ANIM_TAG_VOID_LINES, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimVoidLines, }; static const union AnimCmd sCoinAnimCmds[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END, }; static const union AnimCmd *const sCoinAnimTable[] = { sCoinAnimCmds, }; static const union AffineAnimCmd sFallingCoinAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 0, 10, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sFallingCoinAffineAnimTable[] = { sFallingCoinAffineAnimCmds, }; const struct SpriteTemplate gCoinThrowSpriteTemplate = { .tileTag = ANIM_TAG_COIN, .paletteTag = ANIM_TAG_COIN, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = sCoinAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCoinThrow, }; const struct SpriteTemplate gFallingCoinSpriteTemplate = { .tileTag = ANIM_TAG_COIN, .paletteTag = ANIM_TAG_COIN, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = sCoinAnimTable, .images = NULL, .affineAnims = sFallingCoinAffineAnimTable, .callback = AnimFallingCoin, }; static const union AffineAnimCmd sBulletSeedAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 0, 20, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sBulletSeedAffineAnimTable[] = { sBulletSeedAffineAnimCmds, }; const struct SpriteTemplate gBulletSeedSpriteTemplate = { .tileTag = ANIM_TAG_SEED, .paletteTag = ANIM_TAG_SEED, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sBulletSeedAffineAnimTable, .callback = AnimBulletSeed, }; static const union AffineAnimCmd sRazorWindTornadoAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(16, 256, 0, 0), AFFINEANIMCMD_FRAME(4, 0, 0, 40), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sRazorWindTornadoAffineAnimTable[] = { sRazorWindTornadoAffineAnimCmds, }; const struct SpriteTemplate gRazorWindTornadoSpriteTemplate = { .tileTag = ANIM_TAG_GUST, .paletteTag = ANIM_TAG_GUST, .oam = &gOamData_AffineNormal_ObjNormal_32x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sRazorWindTornadoAffineAnimTable, .callback = AnimRazorWindTornado, }; static const union AnimCmd sViceGripAnimCmds1[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 20), ANIMCMD_END, }; static const union AnimCmd sViceGripAnimCmds2[] = { ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(16, 3, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(32, 20, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sViceGripAnimTable[] = { sViceGripAnimCmds1, sViceGripAnimCmds2, }; const struct SpriteTemplate gViceGripSpriteTemplate = { .tileTag = ANIM_TAG_CUT, .paletteTag = ANIM_TAG_CUT, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = sViceGripAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimViceGripPincer, }; static const union AnimCmd sGuillotineAnimCmds1[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(32, 1), ANIMCMD_END, }; static const union AnimCmd sGuillotineAnimCmds2[] = { ANIMCMD_FRAME(0, 2, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(16, 2, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(32, 1, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sGuillotineAnimTable[] = { sGuillotineAnimCmds1, sGuillotineAnimCmds2, }; const struct SpriteTemplate gGuillotineSpriteTemplate = { .tileTag = ANIM_TAG_CUT, .paletteTag = ANIM_TAG_CUT, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = sGuillotineAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGuillotinePincer, }; static const union AffineAnimCmd sSplashEffectAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(-6, 4, 0, 8), AFFINEANIMCMD_FRAME(10, -10, 0, 8), AFFINEANIMCMD_FRAME(-4, 6, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sGrowAndShrinkAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(-4, -5, 0, 12), AFFINEANIMCMD_FRAME(0, 0, 0, 24), AFFINEANIMCMD_FRAME(4, 5, 0, 12), AFFINEANIMCMD_END, }; static const union AnimCmd sBreathPuffAnimCmds1[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(4, 40, .hFlip = TRUE), ANIMCMD_FRAME(8, 4, .hFlip = TRUE), ANIMCMD_FRAME(12, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sBreathPuffAnimCmds2[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(4, 40), ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(12, 4), ANIMCMD_END, }; static const union AnimCmd *const sBreathPuffAnimTable[] = { sBreathPuffAnimCmds1, sBreathPuffAnimCmds2, }; const struct SpriteTemplate gBreathPuffSpriteTemplate = { .tileTag = ANIM_TAG_BREATH, .paletteTag = ANIM_TAG_BREATH, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sBreathPuffAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBreathPuff, }; static const union AffineAnimCmd sAngerMarkAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(11, 11, 0, 8), AFFINEANIMCMD_FRAME(-11, -11, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAngerMarkAffineAnimTable[] = { sAngerMarkAffineAnimCmds, }; const struct SpriteTemplate gAngerMarkSpriteTemplate = { .tileTag = ANIM_TAG_ANGER, .paletteTag = ANIM_TAG_ANGER, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAngerMarkAffineAnimTable, .callback = AnimAngerMark, }; static const union AffineAnimCmd sThrashMoveMonAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(-10, 9, 0, 7), AFFINEANIMCMD_FRAME(20, -20, 0, 7), AFFINEANIMCMD_FRAME(-20, 20, 0, 7), AFFINEANIMCMD_FRAME(10, -9, 0, 7), AFFINEANIMCMD_LOOP(2), AFFINEANIMCMD_END, }; const struct SpriteTemplate gPencilSpriteTemplate = { .tileTag = ANIM_TAG_PENCIL, .paletteTag = ANIM_TAG_PENCIL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPencil, }; const struct SpriteTemplate gSnoreZSpriteTemplate = { .tileTag = ANIM_TAG_SNORE_Z, .paletteTag = ANIM_TAG_SNORE_Z, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTravelDiagonally, }; static const union AnimCmd sExplosionAnimCmds[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(32, 5), ANIMCMD_FRAME(48, 5), ANIMCMD_END, }; static const union AnimCmd *const sExplosionAnimTable[] = { sExplosionAnimCmds, }; const struct SpriteTemplate gExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_EXPLOSION, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos, }; static const union AffineAnimCmd sSoftBoiledEggAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0, 0, -8, 2), AFFINEANIMCMD_FRAME(0, 0, 8, 4), AFFINEANIMCMD_FRAME(0, 0, -8, 2), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sSoftBoiledEggAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sSoftBoiledEggAffineAnimCmds3[] = { AFFINEANIMCMD_FRAME(-8, 4, 0, 8), AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(16, -8, 0, 8), AFFINEANIMCMD_FRAME(-16, 8, 0, 8), AFFINEANIMCMD_LOOP(1), AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 0, 15), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sSoftBoiledEggAffineAnimTable[] = { sSoftBoiledEggAffineAnimCmds1, sSoftBoiledEggAffineAnimCmds2, sSoftBoiledEggAffineAnimCmds3, }; const struct SpriteTemplate gSoftBoiledEggSpriteTemplate = { .tileTag = ANIM_TAG_BREAKING_EGG, .paletteTag = ANIM_TAG_BREAKING_EGG, .oam = &gOamData_AffineDouble_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSoftBoiledEggAffineAnimTable, .callback = AnimSoftBoiledEgg, }; static const union AffineAnimCmd sThinRingExpandingAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(16, 16, 0, 0), AFFINEANIMCMD_FRAME(16, 16, 0, 30), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd sThinRingExpandingAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(16, 16, 0, 0), AFFINEANIMCMD_FRAME(32, 32, 0, 15), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd sHyperVoiceRingAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(16, 16, 0, 0), AFFINEANIMCMD_FRAME(11, 11, 0, 45), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd *const sThinRingExpandingAffineAnimTable[] = { sThinRingExpandingAffineAnimCmds1, sThinRingExpandingAffineAnimCmds2, }; static const union AffineAnimCmd *const sHyperVoiceRingAffineAnimTable[] = { sHyperVoiceRingAffineAnimCmds, }; const struct SpriteTemplate gThinRingExpandingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_THIN_RING, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos, }; static const union AffineAnimCmd sThinRingShrinkingAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(512, 512, 0, 0), AFFINEANIMCMD_FRAME(-16, -16, 0, 30), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd *const sThinRingShrinkingAffineAnimTable[] = { sThinRingShrinkingAffineAnimCmds, }; const struct SpriteTemplate gThinRingShrinkingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_THIN_RING, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos, }; const struct SpriteTemplate gBlendThinRingExpandingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_THIN_RING, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sThinRingExpandingAffineAnimTable, .callback = AnimBlendThinRing, }; const struct SpriteTemplate gHyperVoiceRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_THIN_RING, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sHyperVoiceRingAffineAnimTable, .callback = AnimHyperVoiceRing, }; const struct SpriteTemplate gUproarRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_THIN_RING, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sThinRingExpandingAffineAnimTable, .callback = AnimUproarRing, }; static const union AffineAnimCmd sStretchAttackerAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(96, -13, 0, 8), AFFINEANIMCMD_END, }; static const union AnimCmd sSpeedDustAnimCmds[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(4, 3), ANIMCMD_FRAME(8, 3), ANIMCMD_FRAME(4, 3), ANIMCMD_FRAME(0, 3), ANIMCMD_END, }; static const union AnimCmd *const sSpeedDustAnimTable[] = { sSpeedDustAnimCmds, }; const struct SpriteTemplate gSpeedDustSpriteTemplate = { .tileTag = ANIM_TAG_SPEED_DUST, .paletteTag = ANIM_TAG_SPEED_DUST, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sSpeedDustAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpeedDust, }; static const s8 sSpeedDustPosTable[][2] = { {30, 28}, {-20, 24}, {16, 26}, {-10, 28}, }; static const union AnimCmd sBellAnimCmds[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(32, 15), ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(16, 6, .hFlip = TRUE), ANIMCMD_FRAME(32, 15, .hFlip = TRUE), ANIMCMD_FRAME(16, 6, .hFlip = TRUE), ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(32, 15), ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(0, 6), ANIMCMD_END, }; static const union AnimCmd *const sBellAnimTable[] = { sBellAnimCmds, }; const struct SpriteTemplate gBellSpriteTemplate = { .tileTag = ANIM_TAG_BELL, .paletteTag = ANIM_TAG_BELL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sBellAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos, }; #define NUM_MUSIC_NOTE_PAL_TAGS 3 const u16 gMusicNotePaletteTagsTable[NUM_MUSIC_NOTE_PAL_TAGS] = { ANIM_TAG_MUSIC_NOTES_2, ANIM_SPRITES_START - 1, ANIM_SPRITES_START - 2, }; const struct SpriteTemplate gHealBellMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES_2, .paletteTag = ANIM_TAG_MUSIC_NOTES_2, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHealBellMusicNote, }; const struct SpriteTemplate gMagentaHeartSpriteTemplate = { .tileTag = ANIM_TAG_MAGENTA_HEART, .paletteTag = ANIM_TAG_MAGENTA_HEART, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMagentaHeart, }; static const union AffineAnimCmd sAffineAnims_StretchBattlerUp[] = { AFFINEANIMCMD_FRAME(10, -13, 0, 10), AFFINEANIMCMD_FRAME(-10, 13, 0, 10), AFFINEANIMCMD_END, }; const struct SpriteTemplate gRedHeartProjectileSpriteTemplate = { .tileTag = ANIM_TAG_RED_HEART, .paletteTag = ANIM_TAG_RED_HEART, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRedHeartProjectile, }; const struct SpriteTemplate gRedHeartBurstSpriteTemplate = { .tileTag = ANIM_TAG_RED_HEART, .paletteTag = ANIM_TAG_RED_HEART, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleBurst, }; const struct SpriteTemplate gRedHeartRisingSpriteTemplate = { .tileTag = ANIM_TAG_RED_HEART, .paletteTag = ANIM_TAG_RED_HEART, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRedHeartRising, }; static const union AffineAnimCmd sHiddenPowerOrbAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_FRAME(8, 8, 0, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sHiddenPowerOrbAffineAnimTable[] = { sHiddenPowerOrbAffineAnimCmds, }; const struct SpriteTemplate gHiddenPowerOrbSpriteTemplate = { .tileTag = ANIM_TAG_RED_ORB, .paletteTag = ANIM_TAG_RED_ORB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sHiddenPowerOrbAffineAnimTable, .callback = AnimOrbitFast, }; const struct SpriteTemplate gHiddenPowerOrbScatterSpriteTemplate = { .tileTag = ANIM_TAG_RED_ORB, .paletteTag = ANIM_TAG_RED_ORB, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sHiddenPowerOrbAffineAnimTable, .callback = AnimOrbitScatter, }; static const union AffineAnimCmd sSpitUpOrbAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_FRAME(8, 8, 0, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sSpitUpOrbAffineAnimTable[] = { sSpitUpOrbAffineAnimCmds, }; const struct SpriteTemplate gSpitUpOrbSpriteTemplate = { .tileTag = ANIM_TAG_RED_ORB_2, .paletteTag = ANIM_TAG_RED_ORB_2, .oam = &gOamData_AffineDouble_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpitUpOrbAffineAnimTable, .callback = AnimSpitUpOrb, }; static const union AnimCmd sEyeSparkleAnimCmds[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd *const sEyeSparkleAnimTable[] = { sEyeSparkleAnimCmds, }; const struct SpriteTemplate gEyeSparkleSpriteTemplate = { .tileTag = ANIM_TAG_EYE_SPARKLE, .paletteTag = ANIM_TAG_EYE_SPARKLE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sEyeSparkleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEyeSparkle, }; static const union AnimCmd sAngelSpriteAnimCmds[] = { ANIMCMD_FRAME(0, 24), ANIMCMD_END, }; static const union AnimCmd *const sAngelSpriteAnimTable[] = { sAngelSpriteAnimCmds, }; const struct SpriteTemplate gAngelSpriteTemplate = { .tileTag = ANIM_TAG_ANGEL, .paletteTag = ANIM_TAG_ANGEL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAngelSpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimAngel, }; const struct SpriteTemplate gPinkHeartSpriteTemplate = { .tileTag = ANIM_TAG_PINK_HEART, .paletteTag = ANIM_TAG_PINK_HEART, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPinkHeart, }; static const union AnimCmd sDevilAnimCmds1[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd sDevilAnimCmds2[] = { ANIMCMD_FRAME(16, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sDevilAnimTable[] = { sDevilAnimCmds1, sDevilAnimCmds2, }; const struct SpriteTemplate gDevilSpriteTemplate = { .tileTag = ANIM_TAG_DEVIL, .paletteTag = ANIM_TAG_DEVIL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sDevilAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDevil, }; static const union AnimCmd sAnim_FurySwipes[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_FurySwipes_Flipped[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(16, 4, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .hFlip = TRUE), ANIMCMD_FRAME(48, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_FurySwipes[] = { sAnim_FurySwipes, sAnim_FurySwipes_Flipped, }; const struct SpriteTemplate gFurySwipesSpriteTemplate = { .tileTag = ANIM_TAG_SWIPE, .paletteTag = ANIM_TAG_SWIPE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FurySwipes, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFurySwipes, }; static const union AnimCmd sMovementWavesAnimCmds1[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(16, 8), ANIMCMD_FRAME(32, 8), ANIMCMD_FRAME(16, 8), ANIMCMD_END, }; static const union AnimCmd sMovementWavesAnimCmds2[] = { ANIMCMD_FRAME(16, 8, .hFlip = TRUE), ANIMCMD_FRAME(32, 8, .hFlip = TRUE), ANIMCMD_FRAME(16, 8, .hFlip = TRUE), ANIMCMD_FRAME(0, 8, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sMovementWavesAnimTable[] = { sMovementWavesAnimCmds1, sMovementWavesAnimCmds2, }; const struct SpriteTemplate gMovementWavesSpriteTemplate = { .tileTag = ANIM_TAG_MOVEMENT_WAVES, .paletteTag = ANIM_TAG_MOVEMENT_WAVES, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sMovementWavesAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMovementWaves, }; static const union AffineAnimCmd sUproarAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(-12, 8, 0, 4), AFFINEANIMCMD_FRAME(20, -20, 0, 4), AFFINEANIMCMD_FRAME(-8, 12, 0, 4), AFFINEANIMCMD_END, }; const struct SpriteTemplate gJaggedMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimJaggedMusicNote, }; static const union AffineAnimCmd sPerishSongMusicNoteAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 5), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sPerishSongMusicNoteAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0, 0, -8, 16), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd sPerishSongMusicNoteAffineAnimCmds3[] = { AFFINEANIMCMD_FRAME(0, 0, 8, 16), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd *const sPerishSongMusicNoteAffineAnimTable[] = { sPerishSongMusicNoteAffineAnimCmds1, sPerishSongMusicNoteAffineAnimCmds2, sPerishSongMusicNoteAffineAnimCmds3, }; const struct SpriteTemplate gPerishSongMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES_2, .paletteTag = ANIM_TAG_MUSIC_NOTES_2, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gMusicNotesAnimTable, .images = NULL, .affineAnims = sPerishSongMusicNoteAffineAnimTable, .callback = AnimPerishSongMusicNote, }; const struct SpriteTemplate gPerishSongMusicNote2SpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES_2, .paletteTag = ANIM_TAG_MUSIC_NOTES_2, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gMusicNotesAnimTable, .images = NULL, .affineAnims = sPerishSongMusicNoteAffineAnimTable, .callback = AnimPerishSongMusicNote2, }; static const union AffineAnimCmd sGuardRingAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sGuardRingAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(512, 256, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sGuardRingAffineAnimTable[] = { sGuardRingAffineAnimCmds1, sGuardRingAffineAnimCmds2, }; const struct SpriteTemplate gGuardRingSpriteTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_GUARD_RING, .oam = &gOamData_AffineDouble_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sGuardRingAffineAnimTable, .callback = AnimGuardRing, }; #define sAmplitudeX data[1] #define sCircleSpeed data[2] #define sMoveSteps data[3] #define sAmplitudeY data[4] static void AnimCirclingFinger(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; sprite->sAmplitudeX = gBattleAnimArgs[2]; sprite->sCircleSpeed = gBattleAnimArgs[4]; sprite->sMoveSteps = gBattleAnimArgs[5]; sprite->sAmplitudeY = gBattleAnimArgs[3]; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteInEllipse; sprite->callback(sprite); } #undef sAmplitudeX #undef sCircleSpeed #undef sMoveSteps #undef sAmplitudeY static void AnimBouncingMusicNote(struct Sprite *sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; SetSpriteNextToMonHead(battler, sprite); sprite->data[0] = 0; sprite->data[1] = 0; sprite->callback = AnimBouncingMusicNote_Step; } static void AnimBouncingMusicNote_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->y2 -= 3; if (++sprite->data[1] == 6) sprite->data[0]++; break; case 1: sprite->y2 += 3; if (--sprite->data[1] == 0) sprite->data[0]++; break; case 2: if (++sprite->data[1] == 64) DestroyAnimSprite(sprite); break; } } static void AnimVibrateBattlerBack_Step(struct Sprite *sprite) { s16 temp; gSprites[sprite->data[2]].x2 += sprite->data[1]; temp = sprite->data[1]; sprite->data[1] = -temp; if (sprite->data[0] == 0) { gSprites[sprite->data[2]].x2 = 0; DestroySpriteAndMatrix(sprite); } sprite->data[0]--; } static void AnimVibrateBattlerBack(struct Sprite *sprite) { u8 spriteId; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); spriteId = gBattlerSpriteIds[gBattleAnimTarget]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = spriteId; sprite->callback = AnimVibrateBattlerBack_Step; sprite->invisible = TRUE; } static void AnimMovingClamp(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[4]; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimMovingClamp_Step); } static void AnimMovingClamp_Step(struct Sprite *sprite) { sprite->data[0] = sprite->data[1]; sprite->data[2] = sprite->x; sprite->data[4] = sprite->y + 15; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, AnimMovingClamp_End); } static void AnimMovingClamp_End(struct Sprite *sprite) { if (sprite->data[5] == 0) DestroyAnimSprite(sprite); else sprite->data[5]--; } // Rotates the attacking mon sprite downwards and then back upwards to its original position. // No args. void AnimTask_Withdraw(u8 taskId) { PrepareBattlerSpriteForRotScale(gBattlerSpriteIds[gBattleAnimAttacker], ST_OAM_OBJ_NORMAL); gTasks[taskId].func = AnimTask_Withdraw_Step; } static void AnimTask_Withdraw_Step(u8 taskId) { u8 spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; s16 rotation; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) rotation = -gTasks[taskId].data[0]; else rotation = gTasks[taskId].data[0]; SetSpriteRotScale(spriteId, 0x100, 0x100, rotation); if (gTasks[taskId].data[1] == 0) { gTasks[taskId].data[0] += 0xB0; // this y position update gets overwritten by SetBattlerSpriteYOffsetFromRotation() gSprites[spriteId].y2++; } else if (gTasks[taskId].data[1] == 1) { if (++gTasks[taskId].data[3] == 30) gTasks[taskId].data[1] = 2; return; } else { gTasks[taskId].data[0] -= 0xB0; // this y position update gets overwritten by SetBattlerSpriteYOffsetFromRotation() gSprites[spriteId].y2--; } SetBattlerSpriteYOffsetFromRotation(spriteId); if (gTasks[taskId].data[0] == 0xF20 || gTasks[taskId].data[0] == 0) { if (gTasks[taskId].data[1] == 2) { ResetSpriteRotScale(spriteId); DestroyAnimVisualTask(taskId); } else { gTasks[taskId].data[1]++; } } } // Animates a "zap of energy" used in KINESIS. // arg 0: x pixel offset // arg 1: y pixel offset // arg 2: vertical flip static void AnimKinesisZapEnergy(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->hFlip = TRUE; if (gBattleAnimArgs[2]) sprite->vFlip = TRUE; } else { if (gBattleAnimArgs[2]) sprite->vFlip = TRUE; } sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Animates a sword that rises into the air after a brief pause. // arg 0: x pixel offset // arg 1: y pixel offset static void AnimSwordsDanceBlade(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; StoreSpriteCallbackInData6(sprite, AnimSwordsDanceBlade_Step); } static void AnimSwordsDanceBlade_Step(struct Sprite *sprite) { sprite->data[0] = 6; sprite->data[2] = sprite->x; sprite->data[4] = sprite->y - 32; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Moves a projectile towards the target mon. The sprite is rotated to be pointing // in the same direction it's moving. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x pixel offset // arg 3: target y pixel offset // arg 4: duration static void AnimSonicBoomProjectile(struct Sprite *sprite) { s16 targetXPos; s16 targetYPos; u16 rotation; if (IsContest()) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } else if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; } InitSpritePosToAnimAttacker(sprite, TRUE); targetXPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; targetYPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; rotation = ArcTan2Neg(targetXPos - sprite->x, targetYPos - sprite->y); rotation += 0xF000; if (IsContest()) rotation -= 0x6000; TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = targetXPos; sprite->data[4] = targetYPos; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimAirWaveProjectile_Step2(struct Sprite *sprite) { if (sprite->data[0]-- <= 0) { gTasks[sprite->data[7]].data[1]--; DestroySprite(sprite); } } static void AnimAirWaveProjectile_Step1(struct Sprite *sprite) { struct Task* task = &gTasks[sprite->data[7]]; if (sprite->data[0] > task->data[5]) { sprite->data[5] += sprite->data[3]; sprite->data[6] += sprite->data[4]; } else { sprite->data[5] -= sprite->data[3]; sprite->data[6] -= sprite->data[4]; } sprite->data[1] += sprite->data[5]; sprite->data[2] += sprite->data[6]; if (1 & task->data[7]) sprite->x2 = ((u16)sprite->data[1] >> 8) * -1; else sprite->x2 = (u16)sprite->data[1] >> 8; if (1 & task->data[8]) sprite->y2 = ((u16)sprite->data[2] / 256u) * -1; else sprite->y2 = (u16)sprite->data[2] / 256u; if (sprite->data[0]-- <= 0) { sprite->data[0] = 30; sprite->callback = AnimAirWaveProjectile_Step2; } } static void AnimAirWaveProjectile(struct Sprite *sprite) { s16 a; s16 b; s16 c; struct Task* task = &gTasks[sprite->data[7]]; sprite->data[1] += (-2 & task->data[7]); sprite->data[2] += (-2 & task->data[8]); if (1 & task->data[7]) sprite->x2 = ((u16)sprite->data[1] >> 8) * -1; else sprite->x2 = (u16)sprite->data[1] >> 8; if (1 & task->data[8]) sprite->y2 = ((u16)sprite->data[2] / 256u) * -1; else sprite->y2 = (u16)sprite->data[2] / 256u; if (sprite->data[0]-- <= 0) { sprite->data[0] = 8; task->data[5] = 4; a = Q_8_8_inv(0x1000); sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; if (task->data[11] >= sprite->x) b = (task->data[11] - sprite->x) << 8; else b = (sprite->x - task->data[11]) << 8; if (task->data[12] >= sprite->y) c = (task->data[12] - sprite->y) << 8; else c = (sprite->y - task->data[12]) << 8; sprite->data[2] = 0; sprite->data[1] = 0; sprite->data[6] = 0; sprite->data[5] = 0; sprite->data[3] = Q_8_8_mul(Q_8_8_mul(b, a), Q_8_8_inv(0x1C0)); sprite->data[4] = Q_8_8_mul(Q_8_8_mul(c, a), Q_8_8_inv(0x1C0)); sprite->callback = AnimAirWaveProjectile_Step1; } } static void AirCutterProjectile_Step2(u8 taskId) { if (gTasks[taskId].data[1] == 0) DestroyAnimVisualTask(taskId); } static void AirCutterProjectile_Step1(u8 taskId) { if (gTasks[taskId].data[0]-- <= 0) { u8 spriteId; struct Sprite *sprite; spriteId = CreateSprite(&gAirWaveProjectileSpriteTemplate, gTasks[taskId].data[9], gTasks[taskId].data[10], gTasks[taskId].data[2] - gTasks[taskId].data[1]); sprite = &gSprites[spriteId]; switch (gTasks[taskId].data[4]) { case 1: sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP); break; case 2: sprite->oam.matrixNum = ST_OAM_HFLIP; break; } sprite->data[0] = gTasks[taskId].data[5] - gTasks[taskId].data[6]; sprite->data[7] = taskId; gTasks[taskId].data[gTasks[taskId].data[1] + 13] = spriteId; gTasks[taskId].data[0] = gTasks[taskId].data[3]; gTasks[taskId].data[1]++; PlaySE12WithPanning(SE_M_BLIZZARD2, BattleAnimAdjustPanning(-SOUND_PAN_TARGET)); if (gTasks[taskId].data[1] > 2) gTasks[taskId].func = AirCutterProjectile_Step2; } } void AnimTask_AirCutterProjectile(u8 taskId) { s16 attackerY = 0; s16 attackerX = 0; s16 targetX = 0; s16 targetY = 0; s16 xDiff, yDiff; if (IsContest()) { gTasks[taskId].data[4] = 2; gBattleAnimArgs[0] = -gBattleAnimArgs[0]; if (gBattleAnimArgs[2] & 1) gBattleAnimArgs[2] &= ~1; else gBattleAnimArgs[2] |= 1; } else { if ((gBattlerPositions[gBattleAnimTarget] & BIT_SIDE) == B_SIDE_PLAYER) { gTasks[taskId].data[4] = 1; gBattleAnimArgs[0] = -gBattleAnimArgs[0]; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; if (gBattleAnimArgs[2] & 1) gBattleAnimArgs[2] &= ~1; else gBattleAnimArgs[2] |= 1; } } attackerX = gTasks[taskId].data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); attackerY = gTasks[taskId].data[10] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget))) { SetAverageBattlerPositions(gBattleAnimTarget, 0, &targetX, &targetY); } else { targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); } targetX = gTasks[taskId].data[11] = targetX + gBattleAnimArgs[0]; targetY = gTasks[taskId].data[12] = targetY + gBattleAnimArgs[1]; if (targetX >= attackerX) xDiff = targetX - attackerX; else xDiff = attackerX - targetX; gTasks[taskId].data[5] = Q_8_8_mul(xDiff, Q_8_8_inv(gBattleAnimArgs[2] & ~1)); gTasks[taskId].data[6] = Q_8_8_mul(gTasks[taskId].data[5], 0x80); gTasks[taskId].data[7] = gBattleAnimArgs[2]; if (targetY >= attackerY) { yDiff = targetY - attackerY; gTasks[taskId].data[8] = Q_8_8_mul(yDiff, Q_8_8_inv(gTasks[taskId].data[5])) & ~1; } else { yDiff = attackerY - targetY; gTasks[taskId].data[8] = Q_8_8_mul(yDiff, Q_8_8_inv(gTasks[taskId].data[5])) | 1; } gTasks[taskId].data[3] = gBattleAnimArgs[3]; if (gBattleAnimArgs[4] & 0x80) { gBattleAnimArgs[4] ^= 0x80; if (gBattleAnimArgs[4] >= 64) { u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) + (gBattleAnimArgs[4] - 64); gTasks[taskId].data[2] = var; } else { u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) - gBattleAnimArgs[4]; gTasks[taskId].data[2] = var; } } else { if (gBattleAnimArgs[4] >= 64) { u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) + (gBattleAnimArgs[4] - 64); gTasks[taskId].data[2] = var; } else { u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) - gBattleAnimArgs[4]; gTasks[taskId].data[2] = var; } } if (gTasks[taskId].data[2] < 3) gTasks[taskId].data[2] = 3; gTasks[taskId].func = AirCutterProjectile_Step1; } static void AnimVoidLines(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); sprite->data[0] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(sVoidLinesSpriteTemplate.paletteTag)); sprite->callback = AnimVoidLines_Step; } static void AnimVoidLines_Step(struct Sprite *sprite) { u16 id, val; int i; if (++sprite->data[1] == 2) { sprite->data[1] = 0; id = sprite->data[0]; val = gPlttBufferFaded[8 + id]; for (i = 8; i < 16; i++) gPlttBufferFaded[i + id] = gPlttBufferFaded[i + id + 1]; gPlttBufferFaded[id + 15] = val; if (++sprite->data[2] == 24) DestroyAnimSprite(sprite); } } static void AnimCoinThrow(struct Sprite *sprite) { s16 r6; s16 r7; u16 var; InitSpritePosToAnimAttacker(sprite, TRUE); r6 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); r7 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; r6 += gBattleAnimArgs[2]; var = ArcTan2Neg(r6 - sprite->x, r7 - sprite->y); var += 0xC000; TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, var); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = r6; sprite->data[4] = r7; sprite->callback = InitAnimLinearTranslationWithSpeedAndPos; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimFallingCoin(struct Sprite *sprite) { sprite->data[2] = -16; sprite->y += 8; sprite->callback = AnimFallingCoin_Step; } static void AnimFallingCoin_Step(struct Sprite *sprite) { sprite->data[0] += 0x80; sprite->x2 = sprite->data[0] >> 8; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) sprite->x2 = -sprite->x2; sprite->y2 = Sin(sprite->data[1], sprite->data[2]); sprite->data[1] += 5; if (sprite->data[1] > 126) { sprite->data[1] = 0; sprite->data[2] /= 2; if (++sprite->data[3] == 2) DestroyAnimSprite(sprite); } } static void AnimBulletSeed(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = 20; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; sprite->affineAnimPaused = TRUE; StoreSpriteCallbackInData6(sprite, AnimBulletSeed_Step1); } static void AnimBulletSeed_Step1(struct Sprite *sprite) { int i; u16 rand; s16 *ptr; PlaySE12WithPanning(SE_M_HORN_ATTACK, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; ptr = &sprite->data[7]; for (i = 0; i < 8; i++) ptr[i - 7] = 0; rand = Random(); sprite->data[6] = 0xFFF4 - (rand & 7); rand = Random(); sprite->data[7] = (rand % 0xA0) + 0xA0; sprite->callback = AnimBulletSeed_Step2; sprite->affineAnimPaused = FALSE; } static void AnimBulletSeed_Step2(struct Sprite *sprite) { sprite->data[0] += sprite->data[7]; sprite->x2 = sprite->data[0] >> 8; if (sprite->data[7] & 1) sprite->x2 = -sprite->x2; sprite->y2 = Sin(sprite->data[1], sprite->data[6]); sprite->data[1] += 8; if (sprite->data[1] > 126) { sprite->data[1] = 0; sprite->data[2] /= 2; if (++sprite->data[3] == 1) DestroyAnimSprite(sprite); } } // Moves a tornado in a circlular motion. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: wave amplitude // arg 3: unused // arg 4: initial wave offset // arg 5: wave period (higher means faster wave) // arg 6: duration static void AnimRazorWindTornado(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) sprite->y += 16; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[5]; sprite->data[3] = gBattleAnimArgs[6]; sprite->data[4] = gBattleAnimArgs[3]; sprite->callback = TranslateSpriteInCircle; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback(sprite); } // Animates a single pincer line that extends towards the center of the target mon. // arg 0: invert static void AnimViceGripPincer(struct Sprite *sprite) { s16 startXOffset = 32; s16 startYOffset = -32; s16 endXOffset = 16; s16 endYOffset = -16; if (gBattleAnimArgs[0]) { startXOffset = -32; startYOffset = 32; endXOffset = -16; endYOffset = 16; StartSpriteAnim(sprite, 1); } sprite->x += startXOffset; sprite->y += startYOffset; sprite->data[0] = 6; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + endXOffset; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + endYOffset; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, AnimViceGripPincer_Step); } static void AnimViceGripPincer_Step(struct Sprite *sprite) { if (sprite->animEnded) DestroyAnimSprite(sprite); } // Animates a single pincer line that extends towards the center of the target mon, and then back out. // arg 0: animation id static void AnimGuillotinePincer(struct Sprite *sprite) { s16 startXOffset = 32; s16 startYOffset = -32; s16 endXOffset = 16; s16 endYOffset = -16; if (gBattleAnimArgs[0]) { startXOffset = -32; startYOffset = 32; endXOffset = -16; endYOffset = 16; StartSpriteAnim(sprite, gBattleAnimArgs[0]); } sprite->x += startXOffset; sprite->y += startYOffset; sprite->data[0] = 6; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + endXOffset; sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + endYOffset; InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[0]; sprite->data[6] = sprite->data[0]; sprite->callback = AnimGuillotinePincer_Step1; } static void AnimGuillotinePincer_Step1(struct Sprite *sprite) { if (AnimTranslateLinear(sprite) && sprite->animEnded) { SeekSpriteAnim(sprite, 0); sprite->animPaused = TRUE; sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 2; sprite->y2 = -2; sprite->data[0] = sprite->data[6]; sprite->data[1] ^= 1; sprite->data[2] ^= 1; sprite->data[4] = 0; sprite->data[3] = 0; sprite->callback = AnimGuillotinePincer_Step2; } } static void AnimGuillotinePincer_Step2(struct Sprite *sprite) { if (sprite->data[3]) { sprite->x2 = -sprite->x2; sprite->y2 = -sprite->y2; } sprite->data[3] ^= 1; if (++sprite->data[4] == 51) { sprite->y2 = 0; sprite->x2 = 0; sprite->data[4] = 0; sprite->data[3] = 0; sprite->animPaused = FALSE; StartSpriteAnim(sprite, sprite->data[5] ^ 1); sprite->callback = AnimGuillotinePincer_Step3; } } static void AnimGuillotinePincer_Step3(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) DestroyAnimSprite(sprite); } // Scales up the target mon sprite, and sets the palette to greyscale. // Used in MOVE_DISABLE. // No args. void AnimTask_GrowAndGrayscale(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND); SetSpriteRotScale(spriteId, 0xD0, 0xD0, 0); SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, FALSE); gTasks[taskId].data[0] = 80; gTasks[taskId].func = AnimTask_GrowAndGrayscale_Step; } static void AnimTask_GrowAndGrayscale_Step(u8 taskId) { if (--gTasks[taskId].data[0] == -1) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); ResetSpriteRotScale(spriteId); SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, TRUE); DestroyAnimVisualTask(taskId); } } // Shrinks and grows the attacking mon several times. Also creates transparent versions of the // mon's sprite while it is shrinking. // No args. void AnimTask_Minimize(u8 taskId) { struct Task* task = &gTasks[taskId]; u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[0] = spriteId; PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL); task->data[1] = 0; task->data[2] = 0; task->data[3] = 0; task->data[4] = 0x100; task->data[5] = 0; task->data[6] = 0; task->data[7] = GetBattlerSpriteSubpriority(gBattleAnimAttacker); task->func = AnimTask_Minimize_Step1; } static void AnimTask_Minimize_Step1(u8 taskId) { struct Task* task = &gTasks[taskId]; switch (task->data[1]) { case 0: if (task->data[2] == 0 || task->data[2] == 3 || task->data[2] == 6) CreateMinimizeSprite(task, taskId); task->data[2]++; task->data[4] += 0x28; SetSpriteRotScale(task->data[0], task->data[4], task->data[4], 0); SetBattlerSpriteYOffsetFromYScale(task->data[0]); if (task->data[2] == 32) { task->data[5]++; task->data[1]++; } break; case 1: if (task->data[6] == 0) { if (task->data[5] == 3) { task->data[2] = 0; task->data[1] = 3; } else { task->data[2] = 0; task->data[3] = 0; task->data[4] = 0x100; SetSpriteRotScale(task->data[0], task->data[4], task->data[4], 0); SetBattlerSpriteYOffsetFromYScale(task->data[0]); task->data[1] = 2; } } break; case 2: task->data[1] = 0; break; case 3: if (++task->data[2] > 32) { task->data[2] = 0; task->data[1]++; } break; case 4: task->data[2] += 2; task->data[4] -= 0x50; SetSpriteRotScale(task->data[0], task->data[4], task->data[4], 0); SetBattlerSpriteYOffsetFromYScale(task->data[0]); if (task->data[2] == 32) { task->data[2] = 0; task->data[1]++; } break; case 5: ResetSpriteRotScale(task->data[0]); gSprites[task->data[15]].y2 = 0; DestroyAnimVisualTask(taskId); break; } } static void CreateMinimizeSprite(struct Task* task, u8 taskId) { u16 matrixNum; s16 spriteId = CloneBattlerSpriteWithBlend(ANIM_ATTACKER); if (spriteId >= 0) { if ((matrixNum = AllocOamMatrix()) == 0xFF) { DestroySpriteWithActiveSheet(&gSprites[spriteId]); } else { gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; gSprites[spriteId].affineAnimPaused = TRUE; gSprites[spriteId].oam.matrixNum = matrixNum; gSprites[spriteId].subpriority = task->data[7] - task->data[3]; task->data[3]++; task->data[6]++; gSprites[spriteId].data[0] = 16; gSprites[spriteId].data[1] = taskId; gSprites[spriteId].data[2] = 6; gSprites[spriteId].callback = ClonedMinizeSprite_Step; SetSpriteRotScale(spriteId, task->data[4], task->data[4], 0); gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode); } } } static void ClonedMinizeSprite_Step(struct Sprite *sprite) { if (--sprite->data[0] == 0) { gTasks[sprite->data[1]].data[sprite->data[2]]--; FreeOamMatrix(sprite->oam.matrixNum); DestroySpriteWithActiveSheet(sprite); } } // Task to facilitate expanding and hopping effect seen in Splash. // arg 0: anim battler // arg 1: num hops void AnimTask_Splash(u8 taskId) { struct Task* task = &gTasks[taskId]; if (gBattleAnimArgs[1] == 0) { DestroyAnimVisualTask(taskId); } else { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); task->data[0] = spriteId; task->data[1] = 0; task->data[2] = gBattleAnimArgs[1]; task->data[3] = 0; task->data[4] = 0; PrepareAffineAnimInTaskData(task, spriteId, sSplashEffectAffineAnimCmds); task->func = AnimTask_Splash_Step; } } static void AnimTask_Splash_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; switch (task->data[1]) { case 0: RunAffineAnimFromTaskData(task); task->data[4] += 3; gSprites[task->data[0]].y2 += task->data[4]; if (++task->data[3] > 7) { task->data[3] = 0; task->data[1]++; } break; case 1: RunAffineAnimFromTaskData(task); gSprites[task->data[0]].y2 += task->data[4]; if (++task->data[3] > 7) { task->data[3] = 0; task->data[1]++; } break; case 2: if (task->data[4] != 0) { gSprites[task->data[0]].y2 -= 2; task->data[4] -= 2; } else task->data[1]++; break; case 3: if (!RunAffineAnimFromTaskData(task)) { if (--task->data[2] == 0) { gSprites[task->data[0]].y2 = 0; DestroyAnimVisualTask(taskId); } else { PrepareAffineAnimInTaskData(task, task->data[0], sSplashEffectAffineAnimCmds); task->data[1] = 0; } } break; } } // Grows, pauses, then shrinks the attacking mon. // Used by MOVE_SWAGGER and MOVE_BULK_UP // No args. void AnimTask_GrowAndShrink(u8 taskId) { struct Task* task = &gTasks[taskId]; u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); PrepareAffineAnimInTaskData(task, spriteId, sGrowAndShrinkAffineAnimCmds); task->func = AnimTask_GrowAndShrink_Step; } static void AnimTask_GrowAndShrink_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; if (!RunAffineAnimFromTaskData(task)) DestroyAnimVisualTask(taskId); } // Animates a little puff of the mon's breath. // Used by MOVE_SWAGGER and MOVE_BULK_UP // No args. static void AnimBreathPuff(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { StartSpriteAnim(sprite, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + 32; sprite->data[1] = 64; } else { StartSpriteAnim(sprite, 1); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - 32; sprite->data[1] = -64; } sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = 52; sprite->data[2] = 0; sprite->data[3] = 0; sprite->data[4] = 0; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteLinearFixedPoint; } // Animates an "angry" mark above a mon's head. // arg 0: target mon (0 = attacker, 1 = target) // arg 1: x pixel offset // arg 2: y pixel offset static void AnimAngerMark(struct Sprite *sprite) { u8 battler; if (!gBattleAnimArgs[0]) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; if (GetBattlerSide(battler) == B_SIDE_OPPONENT) gBattleAnimArgs[1] *= -1; sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; if (sprite->y < 8) sprite->y = 8; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } // left/right movements void AnimTask_ThrashMoveMonHorizontal(u8 taskId) { struct Task* task = &gTasks[taskId]; u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[0] = spriteId; task->data[1] = 0; PrepareAffineAnimInTaskData(task, spriteId, sThrashMoveMonAffineAnimCmds); task->func = AnimTask_ThrashMoveMonHorizontal_Step; } static void AnimTask_ThrashMoveMonHorizontal_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; if (!RunAffineAnimFromTaskData(task)) DestroyAnimVisualTask(taskId); } // up/down movements void AnimTask_ThrashMoveMonVertical(u8 taskId) { struct Task* task = &gTasks[taskId]; task->data[0] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[1] = 0; task->data[2] = 4; task->data[3] = 7; task->data[4] = 3; task->data[5] = gSprites[task->data[0]].x; task->data[6] = gSprites[task->data[0]].y; task->data[7] = 0; task->data[8] = 0; task->data[9] = 2; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) task->data[2] *= -1; task->func = AnimTask_ThrashMoveMonVertical_Step; } static void AnimTask_ThrashMoveMonVertical_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; if (++task->data[7] > 2) { task->data[7] = 0; task->data[8]++; if (task->data[8] & 1) gSprites[task->data[0]].y += task->data[9]; else gSprites[task->data[0]].y -= task->data[9]; } switch (task->data[1]) { case 0: gSprites[task->data[0]].x += task->data[2]; if (--task->data[3] == 0) { task->data[3] = 14; task->data[1] = 1; } break; case 1: gSprites[task->data[0]].x -= task->data[2]; if (--task->data[3] == 0) { task->data[3] = 7; task->data[1] = 2; } break; case 2: gSprites[task->data[0]].x += task->data[2]; if (--task->data[3] == 0) { if (--task->data[4] != 0) { task->data[3] = 7; task->data[1] = 0; } else { if ((task->data[8] & 1) != 0) gSprites[task->data[0]].y -= task->data[9]; DestroyAnimVisualTask(taskId); } } break; } } void AnimTask_SketchDrawMon(u8 taskId) { struct Task* task = &gTasks[taskId]; struct ScanlineEffectParams params; s32 i; task->data[0] = GetBattlerYCoordWithElevation(gBattleAnimTarget) + 32; task->data[1] = 4; task->data[2] = 0; task->data[3] = 0; task->data[4] = 0; task->data[5] = 0; task->data[15] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT); if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1) { task->data[6] = gBattle_BG1_X; params.dmaDest = (u16 *)REG_ADDR_BG1HOFS; } else { task->data[6] = gBattle_BG2_X; params.dmaDest = (u16 *)REG_ADDR_BG2HOFS; } for (i = task->data[0] - 0x40; i <= task->data[0]; i++) { if (i >= 0) { gScanlineEffectRegBuffers[0][i] = task->data[6] + 0xF0; gScanlineEffectRegBuffers[1][i] = task->data[6] + 0xF0; } } params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; params.initState = 1; params.unused9 = 0; ScanlineEffect_SetParams(params); task->func = AnimTask_SketchDrawMon_Step; } static void AnimTask_SketchDrawMon_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; switch (task->data[4]) { case 0: if (++task->data[5] > 20) task->data[4]++; break; case 1: if (++task->data[1] > 3) { task->data[1] = 0; task->data[2] = task->data[3] & 3; task->data[5] = task->data[0] - task->data[3]; switch (task->data[2]) { case 0: break; case 1: task->data[5] -= 2; break; case 2: task->data[5] += 1; break; case 3: task->data[5] += 1; break; } if (task->data[5] >= 0) { gScanlineEffectRegBuffers[0][task->data[5]] = task->data[6]; gScanlineEffectRegBuffers[1][task->data[5]] = task->data[6]; } if (++task->data[3] >= task->data[15]) { gScanlineEffect.state = 3; DestroyAnimVisualTask(taskId); } } break; } } static void AnimPencil(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) - 16; sprite->y = GetBattlerYCoordWithElevation(gBattleAnimTarget) + 16; sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 0; sprite->data[3] = 16; sprite->data[4] = 0; sprite->data[5] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) + 2; sprite->data[6] = BattleAnimAdjustPanning(SOUND_PAN_TARGET); sprite->callback = AnimPencil_Step; } static void AnimPencil_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: if (++sprite->data[2] > 1) { sprite->data[2] = 0; sprite->invisible = !sprite->invisible; } if (++sprite->data[1] > 16) { sprite->invisible = FALSE; sprite->data[0]++; } break; case 1: if (++sprite->data[1] > 3 && sprite->data[2] < sprite->data[5]) { sprite->data[1] = 0; sprite->y -= 1; sprite->data[2]++; if (sprite->data[2] % 10 == 0) PlaySE12WithPanning(SE_M_SKETCH, sprite->data[6]); } sprite->data[4] += sprite->data[3]; if (sprite->data[4] > 31) { sprite->data[4] = 0x40 - sprite->data[4]; sprite->data[3] *= -1; } else if (sprite->data[4] <= -32) { sprite->data[4] = -0x40 - sprite->data[4]; sprite->data[3] *= -1; } sprite->x2 = sprite->data[4]; if (sprite->data[5] == sprite->data[2]) { sprite->data[1] = 0; sprite->data[2] = 0; sprite->data[0]++; } break; case 2: if (++sprite->data[2] > 1) { sprite->data[2] = 0; sprite->invisible = !sprite->invisible; } if (++sprite->data[1] > 16) { sprite->invisible = FALSE; DestroyAnimSprite(sprite); } break; } } static void AnimBlendThinRing(struct Sprite *sprite) { u8 battler = 0; u16 sp0 = 0; u16 sp1 = 0; u8 r4; if (gBattleAnimArgs[2] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; r4 = gBattleAnimArgs[3] ^ 1; if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler))) { SetAverageBattlerPositions(battler, r4, &sp0, &sp1); if (r4 == 0) r4 = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); else r4 = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2); if (GetBattlerSide(battler) != B_SIDE_PLAYER) gBattleAnimArgs[0] -= (sp0 - r4) - gBattleAnimArgs[0]; else gBattleAnimArgs[0] = sp0 - r4; } sprite->callback = AnimSpriteOnMonPos; sprite->callback(sprite); } static void AnimHyperVoiceRing_WaitEnd(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) { FreeSpriteOamMatrix(sprite); DestroyAnimSprite(sprite); } } static void AnimHyperVoiceRing(struct Sprite *sprite) { u16 startX = 0; u16 startY = 0; s16 x = 0; s16 y = 0; u8 yCoordType; u8 battler1; u8 battler2; u8 xCoordType; if (gBattleAnimArgs[5] == 0) { battler1 = gBattleAnimAttacker; battler2 = gBattleAnimTarget; } else { battler1 = gBattleAnimTarget; battler2 = gBattleAnimAttacker; } if (!gBattleAnimArgs[6]) { xCoordType = BATTLER_COORD_X; yCoordType = BATTLER_COORD_Y; } else { xCoordType = BATTLER_COORD_X_2; yCoordType = BATTLER_COORD_Y_PIC_OFFSET; } if (GetBattlerSide(battler1) != B_SIDE_PLAYER) { startX = GetBattlerSpriteCoord(battler1, xCoordType) + gBattleAnimArgs[0]; if (IsBattlerSpriteVisible(BATTLE_PARTNER(battler2))) sprite->subpriority = gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler2)]].subpriority - 1; else sprite->subpriority = gSprites[gBattlerSpriteIds[battler2]].subpriority - 1; } else { startX = GetBattlerSpriteCoord(battler1, xCoordType) - gBattleAnimArgs[0]; if (!IsContest() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler1))) { if (gSprites[gBattlerSpriteIds[battler1]].x < gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler1)]].x) sprite->subpriority = gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler1)]].subpriority + 1; else sprite->subpriority = gSprites[gBattlerSpriteIds[battler1]].subpriority - 1; } else { sprite->subpriority = gSprites[gBattlerSpriteIds[battler1]].subpriority - 1; } } startY = GetBattlerSpriteCoord(battler1, yCoordType) + gBattleAnimArgs[1]; if (!IsContest() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler2))) { SetAverageBattlerPositions(battler2, gBattleAnimArgs[6], &x, &y); } else { x = GetBattlerSpriteCoord(battler2, xCoordType); y = GetBattlerSpriteCoord(battler2, yCoordType); } if (GetBattlerSide(battler2) != B_SIDE_PLAYER) x += gBattleAnimArgs[3]; else x -= gBattleAnimArgs[3]; y += gBattleAnimArgs[4]; sprite->x = sprite->data[1] = startX; sprite->y = sprite->data[3] = startY; sprite->data[2] = x; sprite->data[4] = y; sprite->data[0] = gBattleAnimArgs[0]; InitAnimLinearTranslation(sprite); sprite->callback = AnimHyperVoiceRing_WaitEnd; sprite->callback(sprite); } static void AnimUproarRing(struct Sprite *sprite) { u8 index = IndexOfSpritePaletteTag(ANIM_TAG_THIN_RING); if (index != 0xFF) BlendPalette(OBJ_PLTT_ID(index) + 1, 15, gBattleAnimArgs[5], gBattleAnimArgs[4]); StartSpriteAffineAnim(sprite, 1); sprite->callback = AnimSpriteOnMonPos; sprite->callback(sprite); } static void AnimSoftBoiledEgg(struct Sprite *sprite) { s16 r1; InitSpritePosToAnimAttacker(sprite, FALSE); r1 = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? -160 : 160; sprite->data[0] = 0x380; sprite->data[1] = r1; sprite->data[7] = gBattleAnimArgs[2]; sprite->callback = AnimSoftBoiledEgg_Step1; } static void AnimSoftBoiledEgg_Step1(struct Sprite *sprite) { s16 add; sprite->y2 -= (sprite->data[0] >> 8); sprite->x2 = sprite->data[1] >> 8; sprite->data[0] -= 32; add = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? -160 : 160; sprite->data[1] += add; if (sprite->y2 > 0) { sprite->y += sprite->y2; sprite->x += sprite->x2; sprite->y2 = 0; sprite->x2 = 0; sprite->data[0] = 0; StartSpriteAffineAnim(sprite, 1); sprite->callback = AnimSoftBoiledEgg_Step2; } } static void AnimSoftBoiledEgg_Step2(struct Sprite *sprite) { if (sprite->data[0]++ > 19) { StartSpriteAffineAnim(sprite, 2); sprite->callback = AnimSoftBoiledEgg_Step3; } } static void AnimSoftBoiledEgg_Step3(struct Sprite *sprite) { if (sprite->affineAnimEnded) { StartSpriteAffineAnim(sprite, 1); sprite->data[0] = 0; if (sprite->data[7] == 0) { sprite->oam.tileNum += 16; sprite->callback = AnimSoftBoiledEgg_Step3_Callback1; } else { sprite->oam.tileNum += 32; sprite->callback = AnimSoftBoiledEgg_Step4; } } } static void AnimSoftBoiledEgg_Step3_Callback1(struct Sprite *sprite) { sprite->y2 -= 2; if (++sprite->data[0] == 9) { sprite->data[0] = 16; sprite->data[1] = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND((u16)sprite->data[0], 0)); sprite->callback = AnimSoftBoiledEgg_Step3_Callback2; } } static void AnimSoftBoiledEgg_Step3_Callback2(struct Sprite *sprite) { if (sprite->data[1]++ % 3 == 0) { sprite->data[0]--; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0])); if (sprite->data[0] == 0) sprite->callback = AnimSoftBoiledEgg_Step4; } } static void AnimSoftBoiledEgg_Step4(struct Sprite *sprite) { if ((u16)gBattleAnimArgs[7] == 0xFFFF) { sprite->invisible = TRUE; if (sprite->data[7] == 0) sprite->callback = AnimSoftBoiledEgg_Step4_Callback; else sprite->callback = DestroyAnimSprite; } } static void AnimSoftBoiledEgg_Step4_Callback(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimSprite(sprite); } // Used by Extremespeed void AnimTask_AttackerStretchAndDisappear(u8 taskId) { struct Task* task = &gTasks[taskId]; u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[0] = spriteId; PrepareAffineAnimInTaskData(task, spriteId, sStretchAttackerAffineAnimCmds); task->func = AnimTask_AttackerStretchAndDisappear_Step; } static void AnimTask_AttackerStretchAndDisappear_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; if (!RunAffineAnimFromTaskData(task)) { gSprites[task->data[0]].y2 = 0; gSprites[task->data[0]].invisible = TRUE; DestroyAnimVisualTask(taskId); } } void AnimTask_ExtremeSpeedImpact(u8 taskId) { struct Task* task = &gTasks[taskId]; task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; task->data[3] = 0; task->data[12] = 3; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { task->data[13] = 0xFFFF; task->data[14] = 8; } else { task->data[13] = 1; task->data[14] = -8; } task->data[15] = GetAnimBattlerSpriteId(ANIM_TARGET); task->func = AnimTask_ExtremeSpeedImpact_Step; } static void AnimTask_ExtremeSpeedImpact_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; switch (task->data[0]) { case 0: gSprites[task->data[15]].x2 += task->data[14]; task->data[1] = 0; task->data[2] = 0; task->data[3] = 0; task->data[0]++; break; case 1: if (++task->data[1] > 1) { task->data[1] = 0; task->data[2]++; if (task->data[2] & 1) gSprites[task->data[15]].x2 += 6; else gSprites[task->data[15]].x2 -= 6; if (++task->data[3] > 4) { if (task->data[2] & 1) gSprites[task->data[15]].x2 -= 6; task->data[0]++; } } break; case 2: if (--task->data[12] != 0) task->data[0] = 0; else task->data[0]++; break; case 3: gSprites[task->data[15]].x2 += task->data[13]; if (gSprites[task->data[15]].x2 == 0) DestroyAnimVisualTask(taskId); break; } } void AnimTask_ExtremeSpeedMonReappear(u8 taskId) { struct Task* task = &gTasks[taskId]; task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; task->data[3] = 0; task->data[4] = 1; task->data[13] = 14; task->data[14] = 2; task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->func = AnimTask_ExtremeSpeedMonReappear_Step; } static void AnimTask_ExtremeSpeedMonReappear_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; if (task->data[0] == 0 && ++task->data[1] > task->data[4]) { task->data[1] = 0; if (++task->data[2] & 1) gSprites[task->data[15]].invisible = FALSE; else gSprites[task->data[15]].invisible = TRUE; if (++task->data[3] >= task->data[13]) { if (++task->data[4] < task->data[14]) { task->data[1] = 0; task->data[2] = 0; task->data[3] = 0; } else { gSprites[task->data[15]].invisible = FALSE; DestroyAnimVisualTask(taskId); } } } } void AnimTask_SpeedDust(u8 taskId) { struct Task* task = &gTasks[taskId]; task->data[0] = 0; task->data[1] = 4; task->data[2] = 0; task->data[3] = 0; task->data[4] = 0; task->data[5] = 0; task->data[6] = 0; task->data[7] = 0; task->data[8] = 0; task->data[13] = 0; task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); task->data[15] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); task->func = AnimTask_SpeedDust_Step; } static void AnimTask_SpeedDust_Step(u8 taskId) { struct Task* task = &gTasks[taskId]; switch (task->data[8]) { case 0: if (++task->data[4] > 1) { task->data[4] = 0; task->data[5] = (task->data[5] + 1) & 1; if (++task->data[6] > 20) { if (task->data[7] == 0) { task->data[6] = 0; task->data[8] = 1; } else task->data[8] = 2; } } break; case 1: task->data[5] = 0; if (++task->data[4] > 20) { task->data[7] = 1; task->data[8] = 0; } break; case 2: task->data[5] = 1; break; } switch (task->data[0]) { case 0: if (++task->data[1] > 4) { u8 spriteId; task->data[1] = 0; spriteId = CreateSprite(&gSpeedDustSpriteTemplate, task->data[14], task->data[15], 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[0] = taskId; gSprites[spriteId].data[1] = 13; gSprites[spriteId].x2 = sSpeedDustPosTable[task->data[2]][0]; gSprites[spriteId].y2 = sSpeedDustPosTable[task->data[2]][1]; task->data[13]++; if (++task->data[2] > 3) { task->data[2] = 0; if (++task->data[3] > 5) task->data[0]++; } } } break; case 1: if (task->data[13] == 0) DestroyAnimVisualTask(taskId); break; } } static void AnimSpeedDust(struct Sprite *sprite) { sprite->invisible = gTasks[sprite->data[0]].data[5]; if (sprite->animEnded) { gTasks[sprite->data[0]].data[sprite->data[1]]--; DestroySprite(sprite); } } void AnimTask_LoadMusicNotesPals(u8 taskId) { int i; u8 paletteNums[NUM_MUSIC_NOTE_PAL_TAGS]; paletteNums[0] = IndexOfSpritePaletteTag(ANIM_TAG_MUSIC_NOTES_2); for (i = 1; i < NUM_MUSIC_NOTE_PAL_TAGS; i++) paletteNums[i] = AllocSpritePalette(ANIM_SPRITES_START - i); gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000); LZDecompressWram(gBattleAnimSpritePal_MusicNotes2, gMonSpritesGfxPtr->multiUseBuffer); for (i = 0; i < NUM_MUSIC_NOTE_PAL_TAGS; i++) LoadPalette(&gMonSpritesGfxPtr->multiUseBuffer[i * 32], OBJ_PLTT_ID(paletteNums[i]), PLTT_SIZE_4BPP); FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer); DestroyAnimVisualTask(taskId); } void AnimTask_FreeMusicNotesPals(u8 taskId) { int i; for (i = 0; i < NUM_MUSIC_NOTE_PAL_TAGS; i++) FreeSpritePaletteByTag(gMusicNotePaletteTagsTable[i]); DestroyAnimVisualTask(taskId); } static void SetMusicNotePalette(struct Sprite *sprite, u8 a, u8 b) { u8 tile = (b & 1) ? 32 : 0; sprite->oam.tileNum += tile + (a << 2); sprite->oam.paletteNum = IndexOfSpritePaletteTag(gMusicNotePaletteTagsTable[b >> 1]); } static void AnimHealBellMusicNote(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[3]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); SetMusicNotePalette(sprite, gBattleAnimArgs[5], gBattleAnimArgs[6]); } static void AnimMagentaHeart(struct Sprite *sprite) { if (++sprite->data[0] == 1) InitSpritePosToAnimAttacker(sprite, FALSE); sprite->x2 = Sin(sprite->data[1], 8); sprite->y2 = sprite->data[2] >> 8; sprite->data[1] = (sprite->data[1] + 7) & 0xFF; sprite->data[2] -= 0x80; if (sprite->data[0] == 60) DestroyAnimSprite(sprite); } void AnimTask_FakeOut(u8 taskId) { u16 win0h = IsContest() ? 152 : DISPLAY_WIDTH; u16 win0v = 0; gBattle_WIN0H = win0h; gBattle_WIN0V = DISPLAY_HEIGHT; SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_CLR | WININ_WIN1_OBJ | WININ_WIN1_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_BG_ALL); SetGpuReg(REG_OFFSET_WINOUT, WININ_WIN1_CLR | WININ_WIN1_OBJ | WININ_WIN1_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN0_BG_ALL); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDY, 16); gTasks[taskId].data[0] = win0v; gTasks[taskId].data[1] = win0h; gTasks[taskId].func = AnimTask_FakeOut_Step1; } static void AnimTask_FakeOut_Step1(u8 taskId) { gTasks[taskId].data[0] += 13; gTasks[taskId].data[1] -= 13; if (gTasks[taskId].data[0] >= gTasks[taskId].data[1]) { gBattle_WIN0H = 0; gTasks[taskId].func = AnimTask_FakeOut_Step2; } else { gBattle_WIN0H = gTasks[taskId].data[1] | (gTasks[taskId].data[0] << 8); } } static void AnimTask_FakeOut_Step2(u8 taskId) { if (++gTasks[taskId].data[10] == 5) { gTasks[taskId].data[11] = 0x88; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_LIGHTEN); BlendPalettes(GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), 16, RGB_WHITE); } else if (gTasks[taskId].data[10] > 4) { gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDY, 0); DestroyAnimVisualTask(taskId); } } void AnimTask_StretchTargetUp(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); if (++gTasks[taskId].data[0] == 1) { PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_TARGET), sAffineAnims_StretchBattlerUp); gSprites[spriteId].x2 = 4; } else { gSprites[spriteId].x2 = -gSprites[spriteId].x2; if (!RunAffineAnimFromTaskData(&gTasks[taskId])) { gSprites[spriteId].x2 = 0; gSprites[spriteId].y2 = 0; DestroyAnimVisualTask(taskId); } } } void AnimTask_StretchAttackerUp(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); if (++gTasks[taskId].data[0] == 1) { PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sAffineAnims_StretchBattlerUp); gSprites[spriteId].x2 = 4; } else { gSprites[spriteId].x2 = -gSprites[spriteId].x2; if (!RunAffineAnimFromTaskData(&gTasks[taskId])) { gSprites[spriteId].x2 = 0; gSprites[spriteId].y2 = 0; DestroyAnimVisualTask(taskId); } } } static void AnimRedHeartProjectile(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = 95; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); sprite->callback = AnimRedHeartProjectile_Step; } static void AnimRedHeartProjectile_Step(struct Sprite *sprite) { if (!AnimTranslateLinear(sprite)) { sprite->y2 += Sin(sprite->data[5], 14); sprite->data[5] = (sprite->data[5] + 4) & 0xFF; } else { DestroyAnimSprite(sprite); } } void AnimParticleBurst(struct Sprite *sprite) { if (sprite->data[0] == 0) { sprite->data[1] = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[1]; sprite->data[0]++; } else { sprite->data[4] += sprite->data[1]; sprite->x2 = sprite->data[4] >> 8; sprite->y2 = Sin(sprite->data[3], sprite->data[2]); sprite->data[3] = (sprite->data[3] + 3) & 0xFF; if (sprite->data[3] > 100) sprite->invisible = sprite->data[3] % 2; if (sprite->data[3] > 120) DestroyAnimSprite(sprite); } } static void AnimRedHeartRising(struct Sprite *sprite) { sprite->x = gBattleAnimArgs[0]; sprite->y = DISPLAY_HEIGHT; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[1]; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimRedHeartRising_Step); } static void AnimRedHeartRising_Step(struct Sprite *sprite) { s16 y; sprite->data[2] += sprite->data[1]; sprite->y2 = -((u16)sprite->data[2] >> 8); sprite->x2 = Sin(sprite->data[3], 4); sprite->data[3] = (sprite->data[3] + 3) & 0xFF; y = sprite->y + sprite->y2; if (y <= 72) { sprite->invisible = sprite->data[3] % 2; if (y <= 64) DestroyAnimSprite(sprite); } } void AnimTask_HeartsBackground(u8 taskId) { struct BattleAnimBgData animBg; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 3); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBg_AttractTilemap); AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBg_AttractGfx, animBg.tilesOffset); LoadCompressedPalette(gBattleAnimBg_AttractPal, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); if (IsContest()) RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0); gTasks[taskId].func = AnimTask_HeartsBackground_Step; } static void AnimTask_HeartsBackground_Step(u8 taskId) { struct BattleAnimBgData animBg; switch (gTasks[taskId].data[12]) { case 0: if (++gTasks[taskId].data[10] == 4) { gTasks[taskId].data[10] = 0; gTasks[taskId].data[11]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 16) { gTasks[taskId].data[12]++; gTasks[taskId].data[11] = 0; } } break; case 1: if (++gTasks[taskId].data[11] == 141) { gTasks[taskId].data[11] = 16; gTasks[taskId].data[12]++; } break; case 2: if (++gTasks[taskId].data[10] == 4) { gTasks[taskId].data[10] = 0; gTasks[taskId].data[11]--; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 0) { gTasks[taskId].data[12]++; gTasks[taskId].data[11] = 0; } } break; case 3: GetBattleAnimBg1Data(&animBg); InitBattleAnimBg(animBg.bgId); gTasks[taskId].data[12]++; break; case 4: if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); DestroyAnimVisualTask(taskId); break; } } void AnimTask_ScaryFace(u8 taskId) { struct BattleAnimBgData animBg; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); GetBattleAnimBg1Data(&animBg); if (IsContest()) LZDecompressVram(gBattleAnimBgTilemap_ScaryFaceContest, animBg.bgTilemap); else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_ScaryFacePlayer); else AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_ScaryFaceOpponent); AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnim_ScaryFaceGfx, animBg.tilesOffset); LoadCompressedPalette(gBattleAnim_ScaryFacePal, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); if (IsContest()) RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0); gTasks[taskId].func = AnimTask_ScaryFace_Step; } static void AnimTask_ScaryFace_Step(u8 taskId) { struct BattleAnimBgData animBg; switch (gTasks[taskId].data[12]) { case 0: if (++gTasks[taskId].data[10] == 2) { gTasks[taskId].data[10] = 0; gTasks[taskId].data[11]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 14) { gTasks[taskId].data[12]++; gTasks[taskId].data[11] = 0; } } break; case 1: if (++gTasks[taskId].data[11] == 21) { gTasks[taskId].data[11] = 14; gTasks[taskId].data[12]++; } break; case 2: if (++gTasks[taskId].data[10] == 2) { gTasks[taskId].data[10] = 0; gTasks[taskId].data[11]--; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 0) { gTasks[taskId].data[12]++; gTasks[taskId].data[11] = 0; } } break; case 3: GetBattleAnimBg1Data(&animBg); InitBattleAnimBg(1); InitBattleAnimBg(2); gTasks[taskId].data[12]++; // fall through case 4: if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); DestroyAnimVisualTask(taskId); break; } } // Orbits a sphere in an ellipse around the mon. // Used by MOVE_HIDDEN_POWER // arg 0: duration // arg 1: initial wave offset static void AnimOrbitFast(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->affineAnimPaused = TRUE; sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = gBattleAnimArgs[1]; sprite->data[7] = GetBattlerSpriteSubpriority(gBattleAnimAttacker); sprite->callback = AnimOrbitFast_Step; sprite->callback(sprite); } static void AnimOrbitFast_Step(struct Sprite *sprite) { if (sprite->data[1] >= 64 && sprite->data[1] <= 191) sprite->subpriority = sprite->data[7] + 1; else sprite->subpriority = sprite->data[7] - 1; sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8); sprite->y2 = Cos(sprite->data[1], sprite->data[3] >> 8); sprite->data[1] = (sprite->data[1] + 9) & 0xFF; switch (sprite->data[5]) { case 1: sprite->data[2] -= 0x400; sprite->data[3] -= 0x100; if (++sprite->data[4] == sprite->data[0]) { sprite->data[5] = 2; return; } break; case 0: sprite->data[2] += 0x400; sprite->data[3] += 0x100; if (++sprite->data[4] == sprite->data[0]) { sprite->data[4] = 0; sprite->data[5] = 1; } break; } if ((u16)gBattleAnimArgs[7] == 0xFFFF) DestroyAnimSprite(sprite); } // Moves orbs away from the mon, based on where they are in their orbit. // Used in MOVE_HIDDEN_POWER. // arg 0: initial wave offset static void AnimOrbitScatter(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = Sin(gBattleAnimArgs[0], 10); sprite->data[1] = Cos(gBattleAnimArgs[0], 7); sprite->callback = AnimOrbitScatter_Step; } static void AnimOrbitScatter_Step(struct Sprite *sprite) { sprite->x2 += sprite->data[0]; sprite->y2 += sprite->data[1]; if (sprite->x + sprite->x2 + 16 > ((u32)DISPLAY_WIDTH + 32) || sprite->y + sprite->y2 > DISPLAY_HEIGHT || sprite->y + sprite->y2 < -16) DestroyAnimSprite(sprite); } static void AnimSpitUpOrb_Step(struct Sprite *sprite) { sprite->x2 += sprite->data[0]; sprite->y2 += sprite->data[1]; if (sprite->data[3]++ >= sprite->data[2]) DestroyAnimSprite(sprite); } static void AnimSpitUpOrb(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = Sin(gBattleAnimArgs[0], 10); sprite->data[1] = Cos(gBattleAnimArgs[0], 7); sprite->data[2] = gBattleAnimArgs[1]; sprite->callback = AnimSpitUpOrb_Step; } static void AnimEyeSparkle_Step(struct Sprite *sprite) { if (sprite->animEnded) DestroyAnimSprite(sprite); } static void AnimEyeSparkle(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->callback = AnimEyeSparkle_Step; } static void AnimAngel(struct Sprite *sprite) { s16 var0; if (!sprite->data[0]) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } sprite->data[0]++; var0 = (sprite->data[0] * 10) & 0xFF; sprite->x2 = Sin(var0, 80) >> 8; if (sprite->data[0] < 80) sprite->y2 = (sprite->data[0] / 2) + (Cos(var0, 80) >> 8); if (sprite->data[0] > 90) { sprite->data[2]++; sprite->x2 -= sprite->data[2] / 2; } if (sprite->data[0] > 100) DestroyAnimSprite(sprite); } static void AnimPinkHeart_Step(struct Sprite *sprite) { sprite->data[5]++; sprite->x2 = Sin(sprite->data[3], 5); sprite->y2 = sprite->data[5] / 2; sprite->data[3] = (sprite->data[3] + 3) & 0xFF; if (sprite->data[5] > 20) sprite->invisible = sprite->data[5] % 2; if (sprite->data[5] > 30) DestroyAnimSprite(sprite); } static void AnimPinkHeart(struct Sprite *sprite) { if (sprite->data[0] == 0) { sprite->data[1] = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[1]; sprite->data[0]++; } else { sprite->data[4] += sprite->data[1]; sprite->x2 = sprite->data[4] >> 8; sprite->y2 = Sin(sprite->data[3], sprite->data[2]); sprite->data[3] = (sprite->data[3] + 3) & 0xFF; if (sprite->data[3] > 70) { sprite->callback = AnimPinkHeart_Step; sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; sprite->data[3] = Random() % 180; } } } static void AnimDevil(struct Sprite *sprite) { if (sprite->data[3] == 0) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; StartSpriteAnim(sprite, 0); sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1; sprite->data[2] = 1; } sprite->data[0] += sprite->data[2]; sprite->data[1] = (sprite->data[0] * 4) % 256; if (sprite->data[1] < 0) sprite->data[1] = 0; sprite->x2 = Cos(sprite->data[1], 30 - sprite->data[0] / 4); sprite->y2 = Sin(sprite->data[1], 10 - sprite->data[0] / 8); if (sprite->data[1] > 128 && sprite->data[2] > 0) sprite->data[2] = -1; if (sprite->data[1] == 0 && sprite->data[2] < 0) sprite->data[2] = 1; sprite->data[3]++; if (sprite->data[3] < 10 || sprite->data[3] > 80) sprite->invisible = sprite->data[0] % 2; else sprite->invisible = FALSE; if (sprite->data[3] > 90) DestroyAnimSprite(sprite); } static void AnimFurySwipes(struct Sprite *sprite) { if (sprite->data[0] == 0) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; StartSpriteAnim(sprite, gBattleAnimArgs[2]); sprite->data[0]++; } else if (sprite->animEnded) { DestroyAnimSprite(sprite); } } static void AnimMovementWaves(struct Sprite *sprite) { if (!gBattleAnimArgs[2]) { DestroyAnimSprite(sprite); } else { if (!gBattleAnimArgs[0]) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } if (!gBattleAnimArgs[1]) sprite->x += 32; else sprite->x -= 32; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[1]; StartSpriteAnim(sprite, sprite->data[1]); sprite->callback = AnimMovementWaves_Step; } } static void AnimMovementWaves_Step(struct Sprite *sprite) { if (sprite->animEnded) { if (--sprite->data[0]) StartSpriteAnim(sprite, sprite->data[1]); else DestroyAnimSprite(sprite); } } void AnimTask_UproarDistortion(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); PrepareAffineAnimInTaskData(&gTasks[taskId], spriteId, sUproarAffineAnimCmds); gTasks[taskId].func = AnimTask_UproarDistortion_Step; } static void AnimTask_UproarDistortion_Step(u8 taskId) { if (!RunAffineAnimFromTaskData(&gTasks[taskId])) DestroyAnimVisualTask(taskId); } static void AnimJaggedMusicNote(struct Sprite *sprite) { int var1; u8 battler = !gBattleAnimArgs[0] ? gBattleAnimAttacker : gBattleAnimTarget; if (GetBattlerSide(battler) == B_SIDE_OPPONENT) gBattleAnimArgs[1] *= -1; sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; sprite->data[0] = 0; sprite->data[1] = (u16)sprite->x << 3; sprite->data[2] = (u16)sprite->y << 3; var1 = gBattleAnimArgs[1] << 3; if (var1 < 0) var1 += 7; sprite->data[3] = var1 >> 3; var1 = gBattleAnimArgs[2] << 3; if (var1 < 0) var1 += 7; sprite->data[4] = var1 >> 3; sprite->oam.tileNum += gBattleAnimArgs[3] * 16; sprite->callback = AnimJaggedMusicNote_Step; } static void AnimJaggedMusicNote_Step(struct Sprite *sprite) { sprite->data[1] += sprite->data[3]; sprite->data[2] += sprite->data[4]; sprite->x = sprite->data[1] >> 3; sprite->y = sprite->data[2] >> 3; if (++sprite->data[0] > 16) DestroyAnimSprite(sprite); } static void AnimPerishSongMusicNote2(struct Sprite *sprite) { if (!sprite->data[0]) { sprite->data[1] = 120 - gBattleAnimArgs[0]; sprite->invisible = TRUE; } if (++sprite->data[0] == sprite->data[1]) SetGreyscaleOrOriginalPalette(sprite->oam.paletteNum + 16, FALSE); if (sprite->data[0] == sprite->data[1] + 80) DestroyAnimSprite(sprite); } static void AnimPerishSongMusicNote(struct Sprite *sprite) { int index; int var2; if (!sprite->data[0]) { sprite->x = 120; sprite->y = gBattleAnimArgs[0] / 2 - 15; StartSpriteAnim(sprite, gBattleAnimArgs[1]); sprite->data[5] = 120; sprite->data[3] = gBattleAnimArgs[2]; } sprite->data[0]++; sprite->data[1] = sprite->data[0] / 2; index = ((sprite->data[0] * 3) + (u16)sprite->data[3]); var2 = 0xFF; sprite->data[6] = (sprite->data[6] + 10) & 0xFF; index &= var2; sprite->x2 = Cos(index, 100); sprite->y2 = sprite->data[1] + Sin(index, 10) + Cos(sprite->data[6], 4); if (sprite->data[0] > sprite->data[5]) { sprite->callback = AnimPerishSongMusicNote_Step1; sprite->data[0] = 0; SetSpritePrimaryCoordsFromSecondaryCoords(sprite); sprite->data[2] = 5; sprite->data[4] = 0; sprite->data[3] = 0; StartSpriteAffineAnim(sprite, 1); } } static void AnimPerishSongMusicNote_Step1(struct Sprite *sprite) { if (++sprite->data[0] > 10) { sprite->data[0] = 0; sprite->callback = AnimPerishSongMusicNote_Step2; } } static void AnimPerishSongMusicNote_Step2(struct Sprite *sprite) { sprite->data[3] += sprite->data[2]; sprite->y2 = sprite->data[3]; sprite->data[2]++; if (sprite->data[3] > 48 && sprite->data[2] > 0) { sprite->data[2] = sprite->data[4] - 5; sprite->data[4]++; } if (sprite->data[4] > 3) { sprite->invisible = sprite->data[2] % 2; DestroyAnimSprite(sprite); } if (sprite->data[4] == 4) { DestroyAnimSprite(sprite); } } static void AnimGuardRing(struct Sprite *sprite) { if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) { SetAverageBattlerPositions(gBattleAnimAttacker, FALSE, &sprite->x, &sprite->y); sprite->y += 40; StartSpriteAffineAnim(sprite, 1); } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 40; } sprite->data[0] = 13; sprite->data[2] = sprite->x; sprite->data[4] = sprite->y - 72; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } void AnimTask_IsFuryCutterHitRight(u8 taskId) { gBattleAnimArgs[ARG_RET_ID] = gAnimDisableStructPtr->furyCutterCounter & 1; DestroyAnimVisualTask(taskId); } void AnimTask_GetFuryCutterHitCount(u8 taskId) { gBattleAnimArgs[ARG_RET_ID] = gAnimDisableStructPtr->furyCutterCounter; DestroyAnimVisualTask(taskId); } ================================================ FILE: src/battle_anim_effects_3.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "data.h" #include "decompress.h" #include "graphics.h" #include "pokemon_icon.h" #include "random.h" #include "scanline_effect.h" #include "task.h" #include "trig.h" #include "util.h" #include "constants/battle_anim.h" #include "constants/songs.h" #include "constants/weather.h" static void AnimBlackSmoke(struct Sprite *); static void AnimBlackSmoke_Step(struct Sprite *); static void AnimWhiteHalo(struct Sprite *); static void AnimWhiteHalo_Step1(struct Sprite *); static void AnimWhiteHalo_Step2(struct Sprite *); static void AnimMeanLookEye(struct Sprite *); static void AnimMeanLookEye_Step1(struct Sprite *); static void AnimMeanLookEye_Step2(struct Sprite *); static void AnimMeanLookEye_Step3(struct Sprite *); static void AnimMeanLookEye_Step4(struct Sprite *); static void SetPsychicBackground_Step(u8); static void FadeScreenToWhite_Step(u8); static void AnimSpikes(struct Sprite *); static void AnimSpikes_Step1(struct Sprite *); static void AnimSpikes_Step2(struct Sprite *); static void AnimSpotlight(struct Sprite *); static void AnimSpotlight_Step1(struct Sprite *); static void AnimSpotlight_Step2(struct Sprite *); static void AnimClappingHand(struct Sprite *); static void AnimClappingHand_Step(struct Sprite *); static void AnimClappingHand2(struct Sprite *); static void AnimRapidSpin(struct Sprite *); static void AnimRapidSpin_Step(struct Sprite *); static void RapinSpinMonElevation_Step(u8); static void TormentAttacker_Step(u8); static void TormentAttacker_Callback(struct Sprite *); static void AnimWishStar(struct Sprite *); static void AnimWishStar_Step(struct Sprite *); static void AnimMiniTwinklingStar(struct Sprite *); static void AnimMiniTwinklingStar_Step(struct Sprite *); static void AnimGreenStar(struct Sprite *); static void AnimGreenStar_Step1(struct Sprite *); static void AnimGreenStar_Step2(struct Sprite *); static void AnimGreenStar_Callback(struct Sprite *); static void AnimTask_RockMonBackAndForth_Step(u8); static void AnimSweetScentPetal(struct Sprite *); static void AnimSweetScentPetal_Step(struct Sprite *); static void AnimTask_FlailMovement_Step(u8); static void AnimFlatterConfetti(struct Sprite *); static void AnimFlatterConfetti_Step(struct Sprite *); static void AnimFlatterSpotlight(struct Sprite *); static void AnimFlatterSpotlight_Step(struct Sprite *); static void AnimReversalOrb(struct Sprite *); static void AnimReversalOrb_Step(struct Sprite *); static void AnimTask_RolePlaySilhouette_Step1(u8); static void AnimTask_RolePlaySilhouette_Step2(u8); static void AnimTask_AcidArmor_Step(u8); static void AnimTask_DeepInhale_Step(u8); static void AnimYawnCloud(struct Sprite *); static void AnimYawnCloud_Step(struct Sprite *); static void AnimTask_SquishAndSweatDroplets_Step(u8); static void CreateSweatDroplets(u8, bool8); static void AnimTask_FacadeColorBlend_Step(u8); static void AnimRoarNoiseLine(struct Sprite *); static void AnimRoarNoiseLine_Step(struct Sprite *); static void AnimTask_GlareEyeDots_Step(u8); static void GetGlareEyeDotCoords(s16, s16, s16, s16, u8, u8, s16 *, s16 *); static void AnimTask_BarrageBall_Step(u8); static void AnimSmellingSaltsHand(struct Sprite *); static void AnimSmellingSaltsHand_Step(struct Sprite *); static void AnimTask_SmellingSaltsSquish_Step(u8); static void AnimSmellingSaltExclamation(struct Sprite *); static void AnimSmellingSaltExclamation_Step(struct Sprite *); static void AnimHelpingHandClap(struct Sprite *); static void AnimHelpingHandClap_Step(struct Sprite *); static void AnimTask_HelpingHandAttackerMovement_Step(u8); static void AnimForesightMagnifyingGlass(struct Sprite *); static void AnimForesightMagnifyingGlass_Step(struct Sprite *); static void AnimTask_MonToSubstituteDoll(u8); static void AnimBlockX(struct Sprite *); static void AnimBlockX_Step(struct Sprite *); static void AnimTask_OdorSleuthMovementWaitFinish(u8); static void MoveOdorSleuthClone(struct Sprite *); static void AnimTask_TeeterDanceMovement_Step(u8); static void AnimRecycle(struct Sprite *); static void AnimRecycle_Step(struct Sprite *); static void AnimTask_SlackOffSquish_Step(u8); static void AnimTealAlert(struct Sprite *); static void AnimLeer(struct Sprite *); static void AnimLetterZ(struct Sprite *); static void AnimFang(struct Sprite *); static void AnimTriAttackTriangle(struct Sprite *); static void AnimBatonPassPokeball(struct Sprite *); static void AnimSwallowBlueOrb(struct Sprite *); static void AnimWeakFrustrationAngerMark(struct Sprite *); static void AnimPainSplitProjectile(struct Sprite *); static void AnimSmokeBallEscapeCloud(struct Sprite *); static void AnimFacadeSweatDrop(struct Sprite *); static void AnimGlareEyeDot(struct Sprite *); static void AnimAssistPawprint(struct Sprite *); static void AnimMeteorMashStar(struct Sprite *); static void AnimUnusedItemBagSteal(struct Sprite *); static void AnimKnockOffStrike(struct Sprite *); static const union AnimCmd sScratchAnimCmds[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_FRAME(64, 4), ANIMCMD_END, }; static const union AnimCmd *const sScratchAnimTable[] = { sScratchAnimCmds, }; const struct SpriteTemplate gScratchSpriteTemplate = { .tileTag = ANIM_TAG_SCRATCH, .paletteTag = ANIM_TAG_SCRATCH, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = sScratchAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos, }; const struct SpriteTemplate gBlackSmokeSpriteTemplate = { .tileTag = ANIM_TAG_BLACK_SMOKE, .paletteTag = ANIM_TAG_BLACK_SMOKE, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlackSmoke, }; const struct SpriteTemplate gBlackBallSpriteTemplate = { .tileTag = ANIM_TAG_BLACK_BALL, .paletteTag = ANIM_TAG_BLACK_BALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThrowProjectile, }; static const union AnimCmd sOpeningEyeAnimCmds[] = { ANIMCMD_FRAME(0, 40), ANIMCMD_FRAME(16, 8), ANIMCMD_FRAME(32, 40), ANIMCMD_END, }; static const union AnimCmd *const sOpeningEyeAnimTable[] = { sOpeningEyeAnimCmds, }; const struct SpriteTemplate gOpeningEyeSpriteTemplate = { .tileTag = ANIM_TAG_OPENING_EYE, .paletteTag = ANIM_TAG_OPENING_EYE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sOpeningEyeAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos, }; const struct SpriteTemplate gWhiteHaloSpriteTemplate = { .tileTag = ANIM_TAG_ROUND_WHITE_HALO, .paletteTag = ANIM_TAG_ROUND_WHITE_HALO, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWhiteHalo, }; const struct SpriteTemplate gTealAlertSpriteTemplate = { .tileTag = ANIM_TAG_TEAL_ALERT, .paletteTag = ANIM_TAG_TEAL_ALERT, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTealAlert, }; static const union AffineAnimCmd sMeanLookEyeAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0x180, 0x180, 0, 0), AFFINEANIMCMD_FRAME(-0x20, 0x18, 0, 5), AFFINEANIMCMD_FRAME(0x18, -0x20, 0, 5), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd sMeanLookEyeAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0x30, 0x30, 0, 0), AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 6), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sMeanLookEyeAffineAnimTable[] = { sMeanLookEyeAffineAnimCmds1, sMeanLookEyeAffineAnimCmds2, }; const struct SpriteTemplate gMeanLookEyeSpriteTemplate = { .tileTag = ANIM_TAG_EYE, .paletteTag = ANIM_TAG_EYE, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sMeanLookEyeAffineAnimTable, .callback = AnimMeanLookEye, }; const struct SpriteTemplate gSpikesSpriteTemplate = { .tileTag = ANIM_TAG_SPIKES, .paletteTag = ANIM_TAG_SPIKES, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpikes, }; static const union AnimCmd sLeerAnimCmds[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_FRAME(64, 3), ANIMCMD_END, }; static const union AnimCmd *const sLeerAnimTable[] = { sLeerAnimCmds, }; const struct SpriteTemplate gLeerSpriteTemplate = { .tileTag = ANIM_TAG_LEER, .paletteTag = ANIM_TAG_LEER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sLeerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimLeer, }; static const union AnimCmd sLetterZAnimCmds[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_END, }; static const union AnimCmd *const sLetterZAnimTable[] = { sLetterZAnimCmds, }; static const union AffineAnimCmd sLetterZAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(-7, -7, -3, 16), AFFINEANIMCMD_FRAME(7, 7, 3, 16), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sLetterZAffineAnimTable[] = { sLetterZAffineAnimCmds, }; const struct SpriteTemplate gLetterZSpriteTemplate = { .tileTag = ANIM_TAG_LETTER_Z, .paletteTag = ANIM_TAG_LETTER_Z, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sLetterZAnimTable, .images = NULL, .affineAnims = sLetterZAffineAnimTable, .callback = AnimLetterZ, }; static const union AnimCmd sFangAnimCmds[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(16, 16), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_END, }; static const union AnimCmd *const sFangAnimTable[] = { sFangAnimCmds, }; static const union AffineAnimCmd sFangAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_FRAME(-0x20, -0x20, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sFangAffineAnimTable[] = { sFangAffineAnimCmds, }; const struct SpriteTemplate gFangSpriteTemplate = { .tileTag = ANIM_TAG_FANG_ATTACK, .paletteTag = ANIM_TAG_FANG_ATTACK, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = sFangAnimTable, .images = NULL, .affineAnims = sFangAffineAnimTable, .callback = AnimFang, }; static const union AffineAnimCmd sSpotlightAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0x0, 0x180, 0, 0), AFFINEANIMCMD_FRAME(0x10, 0x0, 0, 20), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sSpotlightAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0x140, 0x180, 0, 0), AFFINEANIMCMD_FRAME(-0x10, 0x0, 0, 19), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sSpotlightAffineAnimTable[] = { sSpotlightAffineAnimCmds1, sSpotlightAffineAnimCmds2, }; const struct SpriteTemplate gSpotlightSpriteTemplate = { .tileTag = ANIM_TAG_SPOTLIGHT, .paletteTag = ANIM_TAG_SPOTLIGHT, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpotlightAffineAnimTable, .callback = AnimSpotlight, }; const struct SpriteTemplate gClappingHandSpriteTemplate = { .tileTag = ANIM_TAG_TAG_HAND, .paletteTag = ANIM_TAG_TAG_HAND, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimClappingHand, }; const struct SpriteTemplate gClappingHand2SpriteTemplate = { .tileTag = ANIM_TAG_TAG_HAND, .paletteTag = ANIM_TAG_TAG_HAND, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimClappingHand2, }; static const union AnimCmd sRapidSpinAnimCmds[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(8, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sRapidSpinAnimTable[] = { sRapidSpinAnimCmds, }; const struct SpriteTemplate gRapidSpinSpriteTemplate = { .tileTag = ANIM_TAG_RAPID_SPIN, .paletteTag = ANIM_TAG_RAPID_SPIN, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = sRapidSpinAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRapidSpin, }; static const union AffineAnimCmd sAffineAnims_Torment[] = { AFFINEANIMCMD_FRAME(-12, 8, 0, 4), AFFINEANIMCMD_FRAME(20, -20, 0, 4), AFFINEANIMCMD_FRAME(-8, 12, 0, 4), AFFINEANIMCMD_END, }; static const union AnimCmd sTriAttackTriangleAnimCmds[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_END, }; static const union AnimCmd *const sTriAttackTriangleAnimTable[] = { sTriAttackTriangleAnimCmds, }; static const union AffineAnimCmd sTriAttackTriangleAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 0, 5, 40), AFFINEANIMCMD_FRAME(0, 0, 10, 10), AFFINEANIMCMD_FRAME(0, 0, 15, 10), AFFINEANIMCMD_FRAME(0, 0, 20, 40), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sTriAttackTriangleAffineAnimTable[] = { sTriAttackTriangleAffineAnimCmds, }; const struct SpriteTemplate gTriAttackTriangleSpriteTemplate = { .tileTag = ANIM_TAG_TRI_ATTACK_TRIANGLE, .paletteTag = ANIM_TAG_TRI_ATTACK_TRIANGLE, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = sTriAttackTriangleAnimTable, .images = NULL, .affineAnims = sTriAttackTriangleAffineAnimTable, .callback = AnimTriAttackTriangle, }; static const union AnimCmd sEclipsingOrbAnimCmds[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_FRAME(32, 3, .hFlip = TRUE), ANIMCMD_FRAME(16, 3, .hFlip = TRUE), ANIMCMD_FRAME(0, 3, .hFlip = TRUE), ANIMCMD_LOOP(1), ANIMCMD_END, }; static const union AnimCmd *const sEclipsingOrbAnimTable[] = { sEclipsingOrbAnimCmds, }; const struct SpriteTemplate gEclipsingOrbSpriteTemplate = { .tileTag = ANIM_TAG_ECLIPSING_ORB, .paletteTag = ANIM_TAG_ECLIPSING_ORB, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sEclipsingOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos, }; static const union AffineAnimCmd DefenseCurlDeformMonAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(-12, 20, 0, 8), AFFINEANIMCMD_FRAME(12, -20, 0, 8), AFFINEANIMCMD_LOOP(2), AFFINEANIMCMD_END, }; const struct SpriteTemplate gBatonPassPokeballSpriteTemplate = { .tileTag = ANIM_TAG_POKEBALL, .paletteTag = ANIM_TAG_POKEBALL, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBatonPassPokeball, }; const struct SpriteTemplate gWishStarSpriteTemplate = { .tileTag = ANIM_TAG_GOLD_STARS, .paletteTag = ANIM_TAG_GOLD_STARS, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWishStar, }; const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate = { .tileTag = ANIM_TAG_GOLD_STARS, .paletteTag = ANIM_TAG_GOLD_STARS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMiniTwinklingStar, }; static const union AffineAnimCmd sStockpileDeformMonAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(8, -8, 0, 12), AFFINEANIMCMD_FRAME(-16, 16, 0, 12), AFFINEANIMCMD_FRAME(8, -8, 0, 12), AFFINEANIMCMD_LOOP(1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sSpitUpDeformMonAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 6, 0, 20), AFFINEANIMCMD_FRAME(0, 0, 0, 20), AFFINEANIMCMD_FRAME(0, -18, 0, 6), AFFINEANIMCMD_FRAME(-18, -18, 0, 3), AFFINEANIMCMD_FRAME(0, 0, 0, 15), AFFINEANIMCMD_FRAME(4, 4, 0, 13), AFFINEANIMCMD_END, }; const struct SpriteTemplate gSwallowBlueOrbSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_ORB, .paletteTag = ANIM_TAG_BLUE_ORB, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSwallowBlueOrb, }; static const union AffineAnimCmd sSwallowDeformMonAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 6, 0, 20), AFFINEANIMCMD_FRAME(0, 0, 0, 20), AFFINEANIMCMD_FRAME(7, -30, 0, 6), AFFINEANIMCMD_FRAME(0, 0, 0, 20), AFFINEANIMCMD_FRAME(-2, 3, 0, 20), AFFINEANIMCMD_END, }; static const s8 sMorningSunLightBeamCoordsTable[] = { 0xE8, 0x18, 0xFC, 0x00, }; static const union AnimCmd sGreenStarAnimCmds1[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(4, 6), ANIMCMD_JUMP(0), }; static const union AnimCmd sGreenStarAnimCmds2[] = { ANIMCMD_FRAME(8, 6), ANIMCMD_END, }; static const union AnimCmd sGreenStarAnimCmds3[] = { ANIMCMD_FRAME(12, 6), ANIMCMD_END, }; static const union AnimCmd *const sGreenStarAnimTable[] = { sGreenStarAnimCmds1, sGreenStarAnimCmds2, sGreenStarAnimCmds3, }; const struct SpriteTemplate gGreenStarSpriteTemplate = { .tileTag = ANIM_TAG_GREEN_STAR, .paletteTag = ANIM_TAG_GREEN_STAR, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sGreenStarAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGreenStar, }; static const s8 sDoomDesireLightBeamCoordTable[] = { 0x78, 0x50, 0x28, 0x00, }; static const u8 sDoomDesireLightBeamDelayTable[] = { 0, 0, 0, 0, 50, }; static const union AffineAnimCmd sStrongFrustrationAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, -15, 0, 7), AFFINEANIMCMD_FRAME(0, 15, 0, 7), AFFINEANIMCMD_LOOP(2), AFFINEANIMCMD_END, }; const struct SpriteTemplate gWeakFrustrationAngerMarkSpriteTemplate = { .tileTag = ANIM_TAG_ANGER, .paletteTag = ANIM_TAG_ANGER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWeakFrustrationAngerMark, }; static const union AnimCmd sSweetScentPetalAnimCmds1[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(3, 8, .vFlip = TRUE), ANIMCMD_FRAME(2, 8, .vFlip = TRUE), ANIMCMD_FRAME(0, 8, .vFlip = TRUE), ANIMCMD_FRAME(1, 8, .vFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sSweetScentPetalAnimCmds2[] = { ANIMCMD_FRAME(0, 8, .hFlip = TRUE), ANIMCMD_FRAME(1, 8, .hFlip = TRUE), ANIMCMD_FRAME(2, 8, .hFlip = TRUE), ANIMCMD_FRAME(3, 8, .hFlip = TRUE), ANIMCMD_FRAME(3, 8, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(2, 8, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(0, 8, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(1, 8, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sSweetScentPetalAnimCmds3[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_END, }; static const union AnimCmd *const sSweetScentPetalAnimCmdTable[] = { sSweetScentPetalAnimCmds1, sSweetScentPetalAnimCmds2, sSweetScentPetalAnimCmds3, }; const struct SpriteTemplate gSweetScentPetalSpriteTemplate = { .tileTag = ANIM_TAG_PINK_PETAL, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sSweetScentPetalAnimCmdTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSweetScentPetal, }; static const u16 sUnusedPalette[] = INCBIN_U16("graphics/battle_anims/unused/unknown.gbapal"); static const union AnimCmd sPainSplitAnimCmds[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(4, 9), ANIMCMD_FRAME(8, 5), ANIMCMD_END, }; static const union AnimCmd *const sPainSplitAnimCmdTable[] = { sPainSplitAnimCmds, }; const struct SpriteTemplate gPainSplitProjectileSpriteTemplate = { .tileTag = ANIM_TAG_PAIN_SPLIT, .paletteTag = ANIM_TAG_PAIN_SPLIT, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sPainSplitAnimCmdTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPainSplitProjectile, }; const struct SpriteTemplate gFlatterConfettiSpriteTemplate = { .tileTag = ANIM_TAG_CONFETTI, .paletteTag = ANIM_TAG_CONFETTI, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFlatterConfetti, }; const struct SpriteTemplate gFlatterSpotlightSpriteTemplate = { .tileTag = ANIM_TAG_SPOTLIGHT, .paletteTag = ANIM_TAG_SPOTLIGHT, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpotlightAffineAnimTable, .callback = AnimFlatterSpotlight, }; const struct SpriteTemplate gReversalOrbSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_ORB, .paletteTag = ANIM_TAG_BLUE_ORB, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimReversalOrb, }; static const union AffineAnimCmd sDeepInhaleAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(16, 0, 0, 4), AFFINEANIMCMD_FRAME(0, -3, 0, 16), AFFINEANIMCMD_FRAME(4, 0, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 24), AFFINEANIMCMD_FRAME(-5, 3, 0, 16), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sYawnCloudAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), AFFINEANIMCMD_FRAME(-8, -8, 0, 8), AFFINEANIMCMD_FRAME(8, 8, 0, 8), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sYawnCloudAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0), AFFINEANIMCMD_FRAME(8, 8, 0, 8), AFFINEANIMCMD_FRAME(-8, -8, 0, 8), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sYawnCloudAffineAnimCmds3[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(8, 8, 0, 8), AFFINEANIMCMD_FRAME(-8, -8, 0, 8), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sYawnCloudAffineAnimTable[] = { sYawnCloudAffineAnimCmds1, sYawnCloudAffineAnimCmds2, sYawnCloudAffineAnimCmds3, }; const struct SpriteTemplate gYawnCloudSpriteTemplate = { .tileTag = ANIM_TAG_PINK_CLOUD, .paletteTag = ANIM_TAG_PINK_CLOUD, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sYawnCloudAffineAnimTable, .callback = AnimYawnCloud, }; static const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), AFFINEANIMCMD_FRAME(-4, -6, 0, 16), AFFINEANIMCMD_FRAME(4, 6, 0, 16), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0), AFFINEANIMCMD_FRAME(4, 6, 0, 16), AFFINEANIMCMD_FRAME(-4, -6, 0, 16), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds3[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(4, 6, 0, 16), AFFINEANIMCMD_FRAME(-4, -6, 0, 16), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds4[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(8, 10, 0, 30), AFFINEANIMCMD_FRAME(-8, -10, 0, 16), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sSmokeBallEscapeCloudAffineAnimTable[] = { sSmokeBallEscapeCloudAffineAnimCmds1, sSmokeBallEscapeCloudAffineAnimCmds2, sSmokeBallEscapeCloudAffineAnimCmds3, sSmokeBallEscapeCloudAffineAnimCmds4, }; const struct SpriteTemplate gSmokeBallEscapeCloudSpriteTemplate = { .tileTag = ANIM_TAG_PINK_CLOUD, .paletteTag = ANIM_TAG_PINK_CLOUD, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSmokeBallEscapeCloudAffineAnimTable, .callback = AnimSmokeBallEscapeCloud, }; static const union AffineAnimCmd sFacadeSquishAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(-16, 16, 0, 6), AFFINEANIMCMD_FRAME(16, -16, 0, 12), AFFINEANIMCMD_FRAME(-16, 16, 0, 6), AFFINEANIMCMD_END, }; const struct SpriteTemplate gFacadeSweatDropSpriteTemplate = { .tileTag = ANIM_TAG_SWEAT_DROP, .paletteTag = ANIM_TAG_SWEAT_DROP, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFacadeSweatDrop, }; static const u16 sFacadeBlendColors[] = { RGB(28, 25, 1), RGB(28, 21, 5), RGB(27, 18, 8), RGB(27, 14, 11), RGB(26, 10, 15), RGB(26, 7, 18), RGB(25, 3, 21), RGB(25, 0, 25), RGB(25, 0, 23), RGB(25, 0, 20), RGB(25, 0, 16), RGB(25, 0, 13), RGB(26, 0, 10), RGB(26, 0, 6), RGB(26, 0, 3), RGB(27, 0, 0), RGB(27, 1, 0), RGB(27, 5, 0), RGB(27, 9, 0), RGB(27, 12, 0), RGB(28, 16, 0), RGB(28, 19, 0), RGB(28, 23, 0), RGB(29, 27, 0), }; static const union AnimCmd sRoarNoiseLineAnimCmds1[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd sRoarNoiseLineAnimCmds2[] = { ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sRoarNoiseLineAnimTable[] = { sRoarNoiseLineAnimCmds1, sRoarNoiseLineAnimCmds2, }; const struct SpriteTemplate gRoarNoiseLineSpriteTemplate = { .tileTag = ANIM_TAG_NOISE_LINE, .paletteTag = ANIM_TAG_NOISE_LINE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sRoarNoiseLineAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRoarNoiseLine, }; const struct SpriteTemplate gGlareEyeDotSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_RED_EYE, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGlareEyeDot, }; const struct SpriteTemplate gAssistPawprintSpriteTemplate = { .tileTag = ANIM_TAG_PAW_PRINT, .paletteTag = ANIM_TAG_PAW_PRINT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimAssistPawprint, }; static const union AffineAnimCmd sBarrageBallAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0, 0, -4, 24), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sBarrageBallAffineAnimCmds2[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), AFFINEANIMCMD_FRAME(0, 0, 4, 24), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sBarrageBallAffineAnimTable[] = { sBarrageBallAffineAnimCmds1, sBarrageBallAffineAnimCmds2, }; const struct SpriteTemplate gBarrageBallSpriteTemplate = { .tileTag = ANIM_TAG_RED_BALL, .paletteTag = ANIM_TAG_RED_BALL, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sBarrageBallAffineAnimTable, .callback = SpriteCallbackDummy, }; const struct SpriteTemplate gSmellingSaltsHandSpriteTemplate = { .tileTag = ANIM_TAG_TAG_HAND, .paletteTag = ANIM_TAG_TAG_HAND, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmellingSaltsHand, }; static const union AffineAnimCmd sSmellingSaltsSquishAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, -16, 0, 6), AFFINEANIMCMD_FRAME(0, 16, 0, 6), AFFINEANIMCMD_END, }; const struct SpriteTemplate gSmellingSaltExclamationSpriteTemplate = { .tileTag = ANIM_TAG_SMELLINGSALT_EFFECT, .paletteTag = ANIM_TAG_SMELLINGSALT_EFFECT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmellingSaltExclamation, }; const struct SpriteTemplate gHelpingHandClapSpriteTemplate = { .tileTag = ANIM_TAG_TAG_HAND, .paletteTag = ANIM_TAG_TAG_HAND, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHelpingHandClap, }; const struct SpriteTemplate gForesightMagnifyingGlassSpriteTemplate = { .tileTag = ANIM_TAG_MAGNIFYING_GLASS, .paletteTag = ANIM_TAG_MAGNIFYING_GLASS, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimForesightMagnifyingGlass, }; const struct SpriteTemplate gMeteorMashStarSpriteTemplate = { .tileTag = ANIM_TAG_GOLD_STARS, .paletteTag = ANIM_TAG_GOLD_STARS, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMeteorMashStar, }; static const struct SpriteTemplate sUnusedStarBurstSpriteTemplate = { .tileTag = ANIM_TAG_GOLD_STARS, .paletteTag = ANIM_TAG_GOLD_STARS, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleBurst, }; const struct SpriteTemplate gBlockXSpriteTemplate = { .tileTag = ANIM_TAG_X_SIGN, .paletteTag = ANIM_TAG_X_SIGN, .oam = &gOamData_AffineOff_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlockX, }; static const struct SpriteTemplate sUnusedItemBagStealSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimUnusedItemBagSteal, }; static const union AnimCmd sKnockOffStrikeAnimCmds[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(64, 4), ANIMCMD_END, }; static const union AnimCmd *const sKnockOffStrikeAnimTable[] = { sKnockOffStrikeAnimCmds, }; static const union AffineAnimCmd sKnockOffStrikeAffineanimCmds1[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -4, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sKnockOffStrikeAffineanimCmds2[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 4, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sKnockOffStrikeAffineAnimTable[] = { sKnockOffStrikeAffineanimCmds1, sKnockOffStrikeAffineanimCmds2, }; const struct SpriteTemplate gKnockOffStrikeSpriteTemplate = { .tileTag = ANIM_TAG_SLAM_HIT_2, .paletteTag = ANIM_TAG_SLAM_HIT_2, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = sKnockOffStrikeAnimTable, .images = NULL, .affineAnims = sKnockOffStrikeAffineAnimTable, .callback = AnimKnockOffStrike, }; static const union AffineAnimCmd sRecycleSpriteAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 0, -4, 64), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sRecycleSpriteAffineAnimTable[] = { sRecycleSpriteAffineAnimCmds, }; const struct SpriteTemplate gRecycleSpriteTemplate = { .tileTag = ANIM_TAG_RECYCLE, .paletteTag = ANIM_TAG_RECYCLE, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sRecycleSpriteAffineAnimTable, .callback = AnimRecycle, }; static const union AffineAnimCmd sSlackOffSquishAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 16, 0, 4), AFFINEANIMCMD_FRAME(-2, 0, 0, 8), AFFINEANIMCMD_FRAME(0, 4, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 24), AFFINEANIMCMD_FRAME(1, -5, 0, 16), AFFINEANIMCMD_END, }; static void AnimBlackSmoke(struct Sprite *sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; if (!gBattleAnimArgs[3]) sprite->data[0] = gBattleAnimArgs[2]; else sprite->data[0] = -gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[4]; sprite->callback = AnimBlackSmoke_Step; } static void AnimBlackSmoke_Step(struct Sprite *sprite) { if (sprite->data[1] > 0) { sprite->x2 = sprite->data[2] >> 8; sprite->data[2] += sprite->data[0]; sprite->invisible ^= 1; sprite->data[1]--; } else { DestroyAnimSprite(sprite); } } void AnimTask_SmokescreenImpact(u8 taskId) { SmokescreenImpact( GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 8, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 8, FALSE); DestroyAnimVisualTask(taskId); } static void AnimWhiteHalo(struct Sprite *sprite) { sprite->data[0] = 90; sprite->callback = WaitAnimForDuration; sprite->data[1] = 7; StoreSpriteCallbackInData6(sprite, AnimWhiteHalo_Step1); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1])); } static void AnimWhiteHalo_Step1(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1])); if (--sprite->data[1] < 0) { sprite->invisible = TRUE; sprite->callback = AnimWhiteHalo_Step2; } } static void AnimWhiteHalo_Step2(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimSprite(sprite); } static void AnimTealAlert(struct Sprite *sprite) { u16 rotation; u8 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); u8 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitSpritePosToAnimTarget(sprite, TRUE); rotation = ArcTan2Neg(sprite->x - x, sprite->y - y); rotation += 0x6000; if (IsContest()) rotation += 0x4000; TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = x; sprite->data[4] = y; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimMeanLookEye(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); sprite->data[0] = 4; sprite->callback = AnimMeanLookEye_Step1; } static void AnimMeanLookEye_Step1(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0])); if (sprite->data[1]) sprite->data[0]--; else sprite->data[0]++; if (sprite->data[0] == 15 || sprite->data[0] == 4) sprite->data[1] ^= 1; if (sprite->data[2]++ > 70) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); StartSpriteAffineAnim(sprite, 1); sprite->data[2] = 0; sprite->invisible = TRUE; sprite->affineAnimPaused = TRUE; sprite->callback = AnimMeanLookEye_Step2; } } static void AnimMeanLookEye_Step2(struct Sprite *sprite) { if (sprite->data[2]++ > 9) { sprite->invisible = FALSE; sprite->affineAnimPaused = FALSE; if (sprite->affineAnimEnded) sprite->callback = AnimMeanLookEye_Step3; } } static void AnimMeanLookEye_Step3(struct Sprite *sprite) { switch (sprite->data[3]) { case 0: case 1: sprite->x2 = 1; sprite->y2 = 0; break; case 2: case 3: sprite->x2 = -1; sprite->y2 = 0; break; case 4: case 5: sprite->x2 = 0; sprite->y2 = 1; break; case 6: default: sprite->x2 = 0; sprite->y2 = -1; break; } if (++sprite->data[3] > 7) sprite->data[3] = 0; if (sprite->data[4]++ > 15) { sprite->data[0] = 16; sprite->data[1] = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 0)); sprite->callback = AnimMeanLookEye_Step4; } } static void AnimMeanLookEye_Step4(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0])); if (sprite->data[1]++ > 1) { sprite->data[0]--; sprite->data[1] = 0; } if (sprite->data[0] == 0) sprite->invisible = TRUE; if (sprite->data[0] < 0) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimSprite(sprite); } } void AnimTask_SetPsychicBackground(u8 taskId) { gTasks[taskId].func = SetPsychicBackground_Step; gAnimVisualTaskCount--; } static void SetPsychicBackground_Step(u8 taskId) { int i; u16 lastColor; u8 paletteIndex = GetBattleBgPaletteNum(); if (++gTasks[taskId].data[5] == 4) { lastColor = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 11]; for (i = 10; i > 0; i--) gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i + 1] = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i]; gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 1] = lastColor; gTasks[taskId].data[5] = 0; } if ((u16)gBattleAnimArgs[7] == 0xFFFF) DestroyTask(taskId); } void AnimTask_FadeScreenToWhite(u8 taskId) { gTasks[taskId].func = FadeScreenToWhite_Step; gAnimVisualTaskCount--; } static void FadeScreenToWhite_Step(u8 taskId) { int i; u16 lastColor; u8 paletteIndex = GetBattleBgPaletteNum(); if (++gTasks[taskId].data[5] == 4) { lastColor = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 11]; for (i = 10; i > 0; i--) gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i + 1] = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i]; gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 1] = lastColor; lastColor = gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + 11]; for (i = 10; i > 0; i--) gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + i + 1] = gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + i]; gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + 1] = lastColor; gTasks[taskId].data[5] = 0; } if ((u16)gBattleAnimArgs[7] == 0xFFFF) DestroyTask(taskId); } static void AnimSpikes(struct Sprite *sprite) { u16 x; u16 y; InitSpritePosToAnimAttacker(sprite, TRUE); SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &x, &y); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = x + gBattleAnimArgs[2]; sprite->data[4] = y + gBattleAnimArgs[3]; sprite->data[5] = -50; InitAnimArcTranslation(sprite); sprite->callback = AnimSpikes_Step1; } static void AnimSpikes_Step1(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { sprite->data[0] = 30; sprite->data[1] = 0; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimSpikes_Step2); } } static void AnimSpikes_Step2(struct Sprite *sprite) { if (sprite->data[1] & 1) sprite->invisible ^= 1; if (++sprite->data[1] == 16) DestroyAnimSprite(sprite); } static void AnimLeer(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimLetterZ(struct Sprite *sprite) { int var0; if (sprite->data[0] == 0) { SetSpriteCoordsToAnimAttackerCoords(sprite); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); if (!IsContest()) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { sprite->data[1] = gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[3]; } else { sprite->data[1] = -1 * gBattleAnimArgs[2]; sprite->data[2] = -1 * gBattleAnimArgs[3]; } } else { sprite->data[1] = -1 * gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[3]; } } sprite->data[0]++; var0 = (sprite->data[0] * 20) & 0xFF; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->x2 = sprite->data[3] / 2; sprite->y2 = Sin(var0 & 0xFF, 5) + (sprite->data[4] / 2); if ((u16)(sprite->x + sprite->x2) > 240) DestroyAnimSprite(sprite); } static void AnimFang(struct Sprite *sprite) { if (sprite->animEnded) DestroyAnimSprite(sprite); } void AnimTask_IsTargetPlayerSide(u8 taskId) { if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) gBattleAnimArgs[ARG_RET_ID] = FALSE; else gBattleAnimArgs[ARG_RET_ID] = TRUE; DestroyAnimVisualTask(taskId); } void AnimTask_IsHealingMove(u8 taskId) { if (gAnimMoveDmg > 0) gBattleAnimArgs[ARG_RET_ID] = FALSE; else gBattleAnimArgs[ARG_RET_ID] = TRUE; DestroyAnimVisualTask(taskId); } static void AnimSpotlight(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); InitSpritePosToAnimTarget(sprite, FALSE); sprite->oam.objMode = ST_OAM_OBJ_WINDOW; sprite->invisible = TRUE; sprite->callback = AnimSpotlight_Step1; } static void AnimSpotlight_Step1(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->invisible = FALSE; if (sprite->affineAnimEnded) sprite->data[0]++; break; case 1: case 3: sprite->data[1] += 117; sprite->x2 = sprite->data[1] >> 8; if (++sprite->data[2] == 21) { sprite->data[2] = 0; sprite->data[0]++; } break; case 2: sprite->data[1] -= 117; sprite->x2 = sprite->data[1] >> 8; if (++sprite->data[2] == 41) { sprite->data[2] = 0; sprite->data[0]++; } break; case 4: ChangeSpriteAffineAnim(sprite, 1); sprite->data[0]++; break; case 5: if (sprite->affineAnimEnded) { sprite->invisible = TRUE; sprite->callback = AnimSpotlight_Step2; } break; } } static void AnimSpotlight_Step2(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); DestroyAnimSprite(sprite); } static void AnimClappingHand(struct Sprite *sprite) { if (gBattleAnimArgs[3] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); } sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->oam.tileNum += 16; if (gBattleAnimArgs[2] == 0) { sprite->oam.matrixNum = ST_OAM_HFLIP; sprite->x2 = -12; sprite->data[1] = 2; } else { sprite->x2 = 12; sprite->data[1] = -2; } sprite->data[0] = gBattleAnimArgs[4]; if (sprite->data[3] != 255) sprite->data[3] = gBattleAnimArgs[2]; sprite->callback = AnimClappingHand_Step; } static void AnimClappingHand_Step(struct Sprite *sprite) { if (sprite->data[2] == 0) { sprite->x2 += sprite->data[1]; if (sprite->x2 == 0) { sprite->data[2]++; if (sprite->data[3] == 0) { PlaySE1WithPanning(SE_M_ENCORE, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER)); } } } else { sprite->x2 -= sprite->data[1]; if (abs(sprite->x2) == 12) { sprite->data[0]--; sprite->data[2]--; } } if (sprite->data[0] == 0) DestroyAnimSprite(sprite); } static void AnimClappingHand2(struct Sprite *sprite) { sprite->oam.objMode = ST_OAM_OBJ_WINDOW; sprite->data[3] = 255; AnimClappingHand(sprite); } void AnimTask_CreateSpotlight(u8 taskId) { if (IsContest()) { SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_OBJ | WININ_WIN1_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN0_BG_ALL); gBattle_WIN1H = WIN_RANGE(152, DISPLAY_WIDTH); gBattle_WIN1V = WIN_RANGE(0, DISPLAY_HEIGHT); SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN0H); SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN0V); } else { SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ); gBattle_WIN1H = WIN_RANGE(0, DISPLAY_WIDTH); gBattle_WIN1V = WIN_RANGE(120, DISPLAY_HEIGHT); SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN1H); SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN1V); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); } DestroyAnimVisualTask(taskId); } void AnimTask_RemoveSpotlight(u8 taskId) { SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); gBattle_WIN1H = 0; gBattle_WIN1V = 0; if (!IsContest()) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); DestroyAnimVisualTask(taskId); } static void AnimRapidSpin(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); } sprite->y2 = gBattleAnimArgs[2]; sprite->data[0] = (sprite->y2 > gBattleAnimArgs[3]); sprite->data[1] = 0; sprite->data[2] = gBattleAnimArgs[4]; sprite->data[3] = gBattleAnimArgs[5]; sprite->data[4] = gBattleAnimArgs[3]; sprite->callback = AnimRapidSpin_Step; } static void AnimRapidSpin_Step(struct Sprite *sprite) { sprite->data[1] = (sprite->data[1] + sprite->data[2]) & 0xFF; sprite->x2 = gSineTable[sprite->data[1]] >> 4; sprite->y2 += sprite->data[3]; if (sprite->data[0]) { if (sprite->y2 < sprite->data[4]) DestroyAnimSprite(sprite); } else { if (sprite->y2 > sprite->data[4]) DestroyAnimSprite(sprite); } } void AnimTask_RapinSpinMonElevation(u8 taskId) { s16 var0; u8 toBG2; s16 var2; int var3; int var4; s32 i; struct ScanlineEffectParams scanlineParams; struct Task *task = &gTasks[taskId]; if (!gBattleAnimArgs[0]) { var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker); toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); } else { var0 = GetBattlerYCoordWithElevation(gBattleAnimTarget); toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget); } task->data[0] = var0 + 36; task->data[1] = task->data[0]; task->data[2] = var0 - 33; if (task->data[2] < 0) task->data[2] = 0; task->data[3] = task->data[0]; task->data[4] = 8; task->data[5] = gBattleAnimArgs[1]; task->data[6] = 0; task->data[7] = 0; if (toBG2 == 1) { var3 = gBattle_BG1_X; task->data[8] = var3; var4 = var3 + DISPLAY_WIDTH; } else { var3 = gBattle_BG2_X; task->data[8] = var3; var4 = var3 + DISPLAY_WIDTH; } task->data[9] = var4; task->data[10] = gBattleAnimArgs[2]; if (!gBattleAnimArgs[2]) { task->data[11] = var4; var2 = task->data[8]; } else { task->data[11] = var3; var2 = task->data[9]; } task->data[15] = 0; i = task->data[2]; while (i <= task->data[3]) { gScanlineEffectRegBuffers[0][i] = var2; gScanlineEffectRegBuffers[1][i] = var2; i++; } if (toBG2 == 1) scanlineParams.dmaDest = ®_BG1HOFS; else scanlineParams.dmaDest = ®_BG2HOFS; scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; ScanlineEffect_SetParams(scanlineParams); task->func = RapinSpinMonElevation_Step; } static void RapinSpinMonElevation_Step(u8 taskId) { s32 i; struct Task *task = &gTasks[taskId]; task->data[0] -= task->data[5]; if (task->data[0] < task->data[2]) task->data[0] = task->data[2]; if (task->data[4] == 0) { task->data[1] -= task->data[5]; if (task->data[1] < task->data[2]) { task->data[1] = task->data[2]; task->data[15] = 1; } } else { task->data[4]--; } if (++task->data[6] > 1) { task->data[6] = 0; task->data[7] = task->data[7] == 0 ? 1 : 0; if (task->data[7]) task->data[12] = task->data[8]; else task->data[12] = task->data[9]; } i = task->data[0]; while (i < task->data[1]) { gScanlineEffectRegBuffers[0][i] = task->data[12]; gScanlineEffectRegBuffers[1][i] = task->data[12]; i++; } i = task->data[1]; while (i <= task->data[3]) { gScanlineEffectRegBuffers[0][i] = task->data[11]; gScanlineEffectRegBuffers[1][i] = task->data[11]; i++; } if (task->data[15]) { if (task->data[10]) gScanlineEffect.state = 3; DestroyAnimVisualTask(taskId); } } void AnimTask_TormentAttacker(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[0] = 0; task->data[1] = 0; task->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); task->data[4] = 32; task->data[5] = -20; task->data[6] = 0; task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->func = TormentAttacker_Step; } static void TormentAttacker_Step(u8 taskId) { int var0, var1; s16 x, y; u16 i, j; u8 spriteId; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: var0 = task->data[2]; if (task->data[1] & 1) { var1 = task->data[4]; x = var0 - var1; } else { var1 = task->data[4]; x = var0 + var1; } y = task->data[3] + task->data[5]; spriteId = CreateSprite(&gThoughtBubbleSpriteTemplate, x, y, 6 - task->data[1]); PlaySE12WithPanning(SE_M_METRONOME, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER)); if (spriteId != MAX_SPRITES) { gSprites[spriteId].hFlip = task->data[1] & 1; gSprites[spriteId].callback = SpriteCallbackDummy; } if (task->data[1] & 1) { task->data[4] -= 6; task->data[5] -= 6; } PrepareAffineAnimInTaskData(task, task->data[15], sAffineAnims_Torment); task->data[1]++; task->data[0] = 1; break; case 1: if (!RunAffineAnimFromTaskData(task)) { if (task->data[1] == 6) { task->data[6] = 8; task->data[0] = 3; } else { if (task->data[1] <= 2) task->data[6] = 10; else task->data[6] = 0; task->data[0] = 2; } } break; case 2: if (task->data[6] != 0) task->data[6]--; else task->data[0] = 0; break; case 3: if (task->data[6] != 0) task->data[6]--; else task->data[0] = 4; break; case 4: for (i = 0, j = 0; i < MAX_SPRITES; i++) { if (gSprites[i].template == &gThoughtBubbleSpriteTemplate) { gSprites[i].data[0] = taskId; gSprites[i].data[1] = 6; StartSpriteAnim(&gSprites[i], 2); gSprites[i].callback = TormentAttacker_Callback; if (++j == 6) break; } } task->data[6] = j; task->data[0] = 5; break; case 5: if (task->data[6] == 0) DestroyAnimVisualTask(taskId); break; } } static void TormentAttacker_Callback(struct Sprite *sprite) { if (sprite->animEnded) { gTasks[sprite->data[0]].data[sprite->data[1]]--; DestroySprite(sprite); } } static void AnimTriAttackTriangle(struct Sprite *sprite) { if (sprite->data[0] == 0) InitSpritePosToAnimAttacker(sprite, FALSE); if (++sprite->data[0] < 40) { u16 var = sprite->data[0]; if ((var & 1) == 0) sprite->invisible = TRUE; else sprite->invisible = FALSE; } if (sprite->data[0] > 30) sprite->invisible = FALSE; if (sprite->data[0] == 61) { StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; sprite->data[0] = 20; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; } } void AnimTask_DefenseCurlDeformMon(u8 taskId) { switch (gTasks[taskId].data[0]) { case 0: PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), DefenseCurlDeformMonAffineAnimCmds); gTasks[taskId].data[0]++; break; case 1: if (!RunAffineAnimFromTaskData(&gTasks[taskId])) DestroyAnimVisualTask(taskId); break; } } static void AnimBatonPassPokeball(struct Sprite *sprite) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); switch (sprite->data[0]) { case 0: sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL); sprite->data[1] = 256; sprite->data[2] = 256; sprite->data[0]++; break; case 1: sprite->data[1] += 96; sprite->data[2] -= 26; SetSpriteRotScale(spriteId, sprite->data[1], sprite->data[2], 0); if (++sprite->data[3] == 5) sprite->data[0]++; // fall through case 2: sprite->data[1] += 96; sprite->data[2] += 48; SetSpriteRotScale(spriteId, sprite->data[1], sprite->data[2], 0); if (++sprite->data[3] == 9) { sprite->data[3] = 0; gSprites[spriteId].invisible = TRUE; ResetSpriteRotScale(spriteId); sprite->data[0]++; } break; case 3: sprite->y2 -= 6; if (sprite->y + sprite->y2 < -32) DestroyAnimSprite(sprite); break; } } static void AnimWishStar(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x = -16; else sprite->x = DISPLAY_WIDTH + 16; sprite->y = 0; sprite->callback = AnimWishStar_Step; } static void AnimWishStar_Step(struct Sprite *sprite) { u32 newX; sprite->data[0] += 72; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x2 = sprite->data[0] >> 4; else sprite->x2 = -(sprite->data[0] >> 4); sprite->data[1] += 16; sprite->y2 += sprite->data[1] >> 8; if (++sprite->data[2] % 3 == 0) { CreateSpriteAndAnimate( &gMiniTwinklingStarSpriteTemplate, sprite->x + sprite->x2, sprite->y + sprite->y2, sprite->subpriority + 1); } newX = sprite->x + sprite->x2 + 32; if (newX > DISPLAY_WIDTH + 64) DestroyAnimSprite(sprite); } static void AnimMiniTwinklingStar(struct Sprite *sprite) { u8 rand; s8 y; rand = Random() & 3; if (rand == 0) sprite->oam.tileNum += 4; else sprite->oam.tileNum += 5; y = Random() & 7; if (y > 3) y = -y; sprite->y2 = y; sprite->callback = AnimMiniTwinklingStar_Step; } static void AnimMiniTwinklingStar_Step(struct Sprite *sprite) { if (++sprite->data[0] < 30) { if (++sprite->data[1] == 2) { sprite->invisible ^= 1; sprite->data[1] = 0; } } else { if (sprite->data[1] == 2) sprite->invisible = FALSE; if (sprite->data[1] == 3) { sprite->invisible = TRUE; sprite->data[1] = -1; } sprite->data[1]++; } if (sprite->data[0] > 60) DestroySprite(sprite); } void AnimTask_StockpileDeformMon(u8 taskId) { if (!gTasks[taskId].data[0]) { PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sStockpileDeformMonAffineAnimCmds); gTasks[taskId].data[0]++; } else { if (!RunAffineAnimFromTaskData(&gTasks[taskId])) DestroyAnimVisualTask(taskId); } } void AnimTask_SpitUpDeformMon(u8 taskId) { if (!gTasks[taskId].data[0]) { PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sSpitUpDeformMonAffineAnimCmds); gTasks[taskId].data[0]++; } else { if (!RunAffineAnimFromTaskData(&gTasks[taskId])) DestroyAnimVisualTask(taskId); } } static void AnimSwallowBlueOrb(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: InitSpritePosToAnimAttacker(sprite, FALSE); sprite->data[1] = 0x900; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0]++; break; case 1: sprite->y2 -= sprite->data[1] >> 8; sprite->data[1] -= 96; if (sprite->y + sprite->y2 > sprite->data[2]) DestroyAnimSprite(sprite); break; } } void AnimTask_SwallowDeformMon(u8 taskId) { if (!gTasks[taskId].data[0]) { PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sSwallowDeformMonAffineAnimCmds); gTasks[taskId].data[0]++; } else { if (!RunAffineAnimFromTaskData(&gTasks[taskId])) DestroyAnimVisualTask(taskId); } } void AnimTask_TransformMon(u8 taskId) { int i, j; u8 position; struct BattleAnimBgData animBg; u8 *dest; u8 *src; u16 *bgTilemap; u16 stretch; switch (gTasks[taskId].data[0]) { case 0: SetGpuReg(REG_OFFSET_MOSAIC, 0); if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) SetAnimBgAttribute(1, BG_ANIM_MOSAIC, 1); else SetAnimBgAttribute(2, BG_ANIM_MOSAIC, 1); gTasks[taskId].data[10] = gBattleAnimArgs[0]; gTasks[taskId].data[0]++; break; case 1: if (gTasks[taskId].data[2]++ > 1) { gTasks[taskId].data[2] = 0; gTasks[taskId].data[1]++; stretch = gTasks[taskId].data[1]; SetGpuReg(REG_OFFSET_MOSAIC, (stretch << 4) | stretch); if (stretch == 15) gTasks[taskId].data[0]++; } break; case 2: HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10]); GetBattleAnimBgDataByPriorityRank(&animBg, gBattleAnimAttacker); if (IsContest()) position = 0; else position = GetBattlerPosition(gBattleAnimAttacker); src = gMonSpritesGfxPtr->sprites[position] + (gBattleMonForms[gBattleAnimAttacker] << 11); dest = animBg.bgTiles; CpuCopy32(src, dest, MON_PIC_SIZE); LoadBgTiles(1, animBg.bgTiles, 0x800, animBg.tilesOffset); gTasks[taskId].data[0]++; break; case 3: if (gTasks[taskId].data[2]++ > 1) { gTasks[taskId].data[2] = 0; gTasks[taskId].data[1]--; stretch = gTasks[taskId].data[1]; SetGpuReg(REG_OFFSET_MOSAIC, (stretch << 4) | stretch); if (stretch == 0) gTasks[taskId].data[0]++; } break; case 4: SetGpuReg(REG_OFFSET_MOSAIC, 0); if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) SetAnimBgAttribute(1, BG_ANIM_MOSAIC, 0); else SetAnimBgAttribute(2, BG_ANIM_MOSAIC, 0); if (!IsContest()) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) { if (gTasks[taskId].data[10] == 0) SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies); } } DestroyAnimVisualTask(taskId); break; } } void AnimTask_IsMonInvisible(u8 taskId) { gBattleAnimArgs[ARG_RET_ID] = gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible; DestroyAnimVisualTask(taskId); } void AnimTask_CastformGfxChange(u8 taskId) { HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, TRUE); DestroyAnimVisualTask(taskId); } void AnimTask_MorningSunLightBeam(u8 taskId) { struct BattleAnimBgData animBg; switch (gTasks[taskId].data[0]) { case 0: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnim_MorningSunTilemap); AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnim_MorningSunGfx, animBg.tilesOffset); LoadCompressedPalette(gBattleAnim_MorningSunPal, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); if (IsContest()) { RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0); gBattle_BG1_X = -56; gBattle_BG1_Y = 0; } else { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattle_BG1_X = -135; else gBattle_BG1_X = -10; gBattle_BG1_Y = 0; } gTasks[taskId].data[10] = gBattle_BG1_X; gTasks[taskId].data[11] = gBattle_BG1_Y; gTasks[taskId].data[0]++; PlaySE12WithPanning(SE_M_MORNING_SUN, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER)); break; case 1: if (gTasks[taskId].data[4]++ > 0) { gTasks[taskId].data[4] = 0; if (++gTasks[taskId].data[1] > 12) gTasks[taskId].data[1] = 12; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1])); if (gTasks[taskId].data[1] == 12) gTasks[taskId].data[0]++; } break; case 2: if (--gTasks[taskId].data[1] < 0) gTasks[taskId].data[1] = 0; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1])); if (!gTasks[taskId].data[1]) { gBattle_BG1_X = sMorningSunLightBeamCoordsTable[gTasks[taskId].data[2]] + gTasks[taskId].data[10]; if (++gTasks[taskId].data[2] == 4) gTasks[taskId].data[0] = 4; else gTasks[taskId].data[0] = 3; } break; case 3: if (++gTasks[taskId].data[3] == 4) { gTasks[taskId].data[3] = 0; gTasks[taskId].data[0] = 1; PlaySE12WithPanning(SE_M_MORNING_SUN, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER)); } break; case 4: GetBattleAnimBg1Data(&animBg); InitBattleAnimBg(animBg.bgId); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimVisualTask(taskId); break; } } static void AnimGreenStar(struct Sprite *sprite) { s16 xOffset; u8 spriteId1; u8 spriteId2; xOffset = Random(); xOffset &= 0x3F; if (xOffset > 31) xOffset = 32 - xOffset; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + xOffset; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 32; sprite->data[1] = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[1]; spriteId1 = CreateSprite(&gGreenStarSpriteTemplate, sprite->x, sprite->y, sprite->subpriority + 1); spriteId2 = CreateSprite(&gGreenStarSpriteTemplate, sprite->x, sprite->y, sprite->subpriority + 1); StartSpriteAnim(&gSprites[spriteId1], 1); StartSpriteAnim(&gSprites[spriteId2], 2); gSprites[spriteId1].data[1] = gBattleAnimArgs[0]; gSprites[spriteId1].data[2] = gBattleAnimArgs[1]; gSprites[spriteId2].data[1] = gBattleAnimArgs[0]; gSprites[spriteId2].data[2] = gBattleAnimArgs[1]; gSprites[spriteId1].data[7] = -1; gSprites[spriteId2].data[7] = -1; gSprites[spriteId1].invisible = TRUE; gSprites[spriteId2].invisible = TRUE; gSprites[spriteId1].callback = AnimGreenStar_Callback; gSprites[spriteId2].callback = AnimGreenStar_Callback; sprite->data[6] = spriteId1; sprite->data[7] = spriteId2; sprite->callback = AnimGreenStar_Step1; } static void AnimGreenStar_Step1(struct Sprite *sprite) { s16 delta = sprite->data[3] + sprite->data[2]; sprite->y2 -= delta >> 8; sprite->data[3] += sprite->data[2]; sprite->data[3] &= 0xFF; if (sprite->data[4] == 0 && sprite->y2 < -8) { gSprites[sprite->data[6]].invisible = FALSE; sprite->data[4]++; } if (sprite->data[4] == 1 && sprite->y2 < -16) { gSprites[sprite->data[7]].invisible = FALSE; sprite->data[4]++; } if (--sprite->data[1] == -1) { sprite->invisible = TRUE; sprite->callback = AnimGreenStar_Step2; } } static void AnimGreenStar_Step2(struct Sprite *sprite) { if (gSprites[sprite->data[6]].callback == SpriteCallbackDummy && gSprites[sprite->data[7]].callback == SpriteCallbackDummy) { DestroySprite(&gSprites[sprite->data[6]]); DestroySprite(&gSprites[sprite->data[7]]); DestroyAnimSprite(sprite); } } static void AnimGreenStar_Callback(struct Sprite *sprite) { if (!sprite->invisible) { s16 delta = sprite->data[3] + sprite->data[2]; sprite->y2 -= delta >> 8; sprite->data[3] += sprite->data[2]; sprite->data[3] &= 0xFF; if (--sprite->data[1] == -1) { sprite->invisible = TRUE; sprite->callback = SpriteCallbackDummy; } } } void AnimTask_DoomDesireLightBeam(u8 taskId) { struct BattleAnimBgData animBg; switch (gTasks[taskId].data[0]) { case 0: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(3, 13)); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnim_MorningSunTilemap); AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnim_MorningSunGfx, animBg.tilesOffset); LoadCompressedPalette(gBattleAnim_MorningSunPal, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); if (IsContest()) { RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0); gBattle_BG1_X = -56; gBattle_BG1_Y = 0; } else { u8 position = GetBattlerPosition(gBattleAnimTarget); if (IsDoubleBattle() == TRUE) { if (position == B_POSITION_OPPONENT_LEFT) gBattle_BG1_X = -155; if (position == B_POSITION_OPPONENT_RIGHT) gBattle_BG1_X = -115; if (position == B_POSITION_PLAYER_LEFT) gBattle_BG1_X = 14; if (position == B_POSITION_PLAYER_RIGHT) gBattle_BG1_X = -20; } else { if (position == B_POSITION_OPPONENT_LEFT) gBattle_BG1_X = -135; if (position == B_POSITION_PLAYER_LEFT) gBattle_BG1_X = -10; } gBattle_BG1_Y = 0; } gTasks[taskId].data[10] = gBattle_BG1_X; gTasks[taskId].data[11] = gBattle_BG1_Y; gTasks[taskId].data[0]++; break; case 1: gTasks[taskId].data[3] = 0; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) gBattle_BG1_X = gTasks[taskId].data[10] + sDoomDesireLightBeamCoordTable[gTasks[taskId].data[2]]; else gBattle_BG1_X = gTasks[taskId].data[10] - sDoomDesireLightBeamCoordTable[gTasks[taskId].data[2]]; if (++gTasks[taskId].data[2] == 5) gTasks[taskId].data[0] = 5; else gTasks[taskId].data[0]++; break; case 2: if (--gTasks[taskId].data[1] <= 4) gTasks[taskId].data[1] = 5; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(3, gTasks[taskId].data[1])); if (gTasks[taskId].data[1] == 5) gTasks[taskId].data[0]++; break; case 3: if (++gTasks[taskId].data[3] > sDoomDesireLightBeamDelayTable[gTasks[taskId].data[2]]) gTasks[taskId].data[0]++; break; case 4: if (++gTasks[taskId].data[1] > 13) gTasks[taskId].data[1] = 13; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(3, gTasks[taskId].data[1])); if (gTasks[taskId].data[1] == 13) gTasks[taskId].data[0] = 1; break; case 5: GetBattleAnimBg1Data(&animBg); InitBattleAnimBg(animBg.bgId); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimVisualTask(taskId); break; } } // Briefly vertically grows and shrinks the attacking mon's sprite. // No args. void AnimTask_StrongFrustrationGrowAndShrink(u8 taskId) { if (gTasks[taskId].data[0] == 0) { PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sStrongFrustrationAffineAnimCmds); gTasks[taskId].data[0]++; } else { if (!RunAffineAnimFromTaskData(&gTasks[taskId])) DestroyAnimVisualTask(taskId); } } // Animates an anger mark near the mon's head. // arg 0: initial x pixel offset // arg 1: initial y pixel offset static void AnimWeakFrustrationAngerMark(struct Sprite *sprite) { if (sprite->data[0] == 0) { InitSpritePosToAnimAttacker(sprite, 0); sprite->data[0]++; } else if (sprite->data[0]++ > 20) { sprite->data[1] += 160; sprite->data[2] += 128; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x2 = -(sprite->data[1] >> 8); else sprite->x2 = sprite->data[1] >> 8; sprite->y2 += sprite->data[2] >> 8; if (sprite->y2 > 64) DestroyAnimSprite(sprite); } } // Rocks the mon back and forth. This is done on a pivot so it is done via rotation. // arg 0: which battler // arg 1: number of rocks // arg 2: rotation speed increase void AnimTask_RockMonBackAndForth(u8 taskId) { u8 side; struct Task *task = &gTasks[taskId]; if (!gBattleAnimArgs[1]) { DestroyAnimVisualTask(taskId); return; } if (gBattleAnimArgs[2] < 0) gBattleAnimArgs[2] = 0; if (gBattleAnimArgs[2] > 2) gBattleAnimArgs[2] = 2; task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; task->data[3] = 8 - (2 * gBattleAnimArgs[2]); task->data[4] = 0x100 + (gBattleAnimArgs[2] * 128); task->data[5] = gBattleAnimArgs[2] + 2; task->data[6] = gBattleAnimArgs[1] - 1; task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); if (gBattleAnimArgs[0] == ANIM_ATTACKER) side = GetBattlerSide(gBattleAnimAttacker); else side = GetBattlerSide(gBattleAnimTarget); if (side == B_SIDE_OPPONENT) { task->data[4] *= -1; task->data[5] *= -1; } PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL); task->func = AnimTask_RockMonBackAndForth_Step; } static void AnimTask_RockMonBackAndForth_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: gSprites[task->data[15]].x2 += task->data[5]; task->data[2] -= task->data[4]; SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]); SetBattlerSpriteYOffsetFromRotation(task->data[15]); if (++task->data[1] >= task->data[3]) { task->data[1] = 0; task->data[0]++; } break; case 1: gSprites[task->data[15]].x2 -= task->data[5]; task->data[2] += task->data[4]; SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]); SetBattlerSpriteYOffsetFromRotation(task->data[15]); if (++task->data[1] >= task->data[3] * 2) { task->data[1] = 0; task->data[0]++; } break; case 2: gSprites[task->data[15]].x2 += task->data[5]; task->data[2] -= task->data[4]; SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]); SetBattlerSpriteYOffsetFromRotation(task->data[15]); if (++task->data[1] >= task->data[3]) { if (task->data[6]) { task->data[6]--; task->data[1] = 0; task->data[0] = 0; } else { task->data[0]++; } } break; case 3: ResetSpriteRotScale(task->data[15]); DestroyAnimVisualTask(taskId); break; } } // Floats a petal across the screen towards the target mon's side. // arg 0: initial y pixel offset // arg 1: sprite anim num // arg 2: unused static void AnimSweetScentPetal(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { sprite->x = 0; sprite->y = gBattleAnimArgs[0]; } else { sprite->x = DISPLAY_WIDTH; sprite->y = gBattleAnimArgs[0] - 30; } sprite->data[2] = gBattleAnimArgs[2]; StartSpriteAnim(sprite, gBattleAnimArgs[1]); sprite->callback = AnimSweetScentPetal_Step; } static void AnimSweetScentPetal_Step(struct Sprite *sprite) { sprite->data[0] += 3; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { sprite->x += 5; sprite->y -= 1; if (sprite->x > DISPLAY_WIDTH) DestroyAnimSprite(sprite); sprite->y2 = Sin(sprite->data[0] & 0xFF, 16); } else { sprite->x -= 5; sprite->y += 1; if (sprite->x < 0) DestroyAnimSprite(sprite); sprite->y2 = Cos(sprite->data[0] & 0xFF, 16); } } // Moves the mon sprite in a flailing back-and-forth motion. // arg 0: which battler void AnimTask_FlailMovement(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; task->data[3] = 0; task->data[12] = 0x20; task->data[13] = 0x40; task->data[14] = 0x800; task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL); task->func = AnimTask_FlailMovement_Step; } static void AnimTask_FlailMovement_Step(u8 taskId) { int temp; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[2] += 0x200; if (task->data[2] >= task->data[14]) { s16 diff = task->data[14] - task->data[2]; s16 div = diff / (task->data[14] * 2); s16 mod = diff % (task->data[14] * 2); if ((div & 1) == 0) { task->data[2] = task->data[14] - mod; task->data[0] = 1; } else { task->data[2] = mod - task->data[14]; } } break; case 1: task->data[2] -= 0x200; if (task->data[2] <= -task->data[14]) { s16 diff = task->data[14] - task->data[2]; s16 div = diff / (task->data[14] * 2); s16 mod = diff % (task->data[14] * 2); if ((1 & div) == 0) { task->data[2] = mod - task->data[14]; task->data[0] = 0; } else { task->data[2] = task->data[14] - mod; } } break; case 2: ResetSpriteRotScale(task->data[15]); DestroyAnimVisualTask(taskId); return; } SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]); SetBattlerSpriteYOffsetFromRotation(task->data[15]); gSprites[task->data[15]].x2 = -(((temp = task->data[2]) >= 0 ? task->data[2] : temp + 63) >> 6); if (++task->data[1] > 8) { if (task->data[12]) { task->data[12]--; task->data[14] -= task->data[13]; if (task->data[14] < 16) task->data[14] = 16; } else { task->data[0] = 2; } } } // Makes a spark-like projectile fall on top of the mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: which battler static void AnimPainSplitProjectile(struct Sprite *sprite) { if (!sprite->data[0]) { if (gBattleAnimArgs[2] == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[1] = 0x80; sprite->data[2] = 0x300; sprite->data[3] = gBattleAnimArgs[1]; sprite->data[0]++; } else { sprite->x2 = sprite->data[1] >> 8; sprite->y2 += sprite->data[2] >> 8; if (sprite->data[4] == 0 && sprite->y2 > -sprite->data[3]) { sprite->data[4] = 1; sprite->data[2] = (-sprite->data[2] / 3) * 2; } sprite->data[1] += 192; sprite->data[2] += 128; if (sprite->animEnded) DestroyAnimSprite(sprite); } } // Performs one of several affine transformations on the mon sprite. // arg 0: which battler // arg 1: which transformation void AnimTask_PainSplitMovement(u8 taskId) { u8 spriteId; if (gTasks[taskId].data[0] == 0) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) gTasks[taskId].data[11] = gBattleAnimAttacker; else gTasks[taskId].data[11] = gBattleAnimTarget; spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); gTasks[taskId].data[10] = spriteId; PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL); switch (gBattleAnimArgs[1]) { case 0: SetSpriteRotScale(spriteId, 0xE0, 0x140, 0); SetBattlerSpriteYOffsetFromYScale(spriteId); break; case 1: SetSpriteRotScale(spriteId, 0xD0, 0x130, 0xF00); SetBattlerSpriteYOffsetFromYScale(spriteId); if (IsContest() || GetBattlerSide(gTasks[taskId].data[11]) == B_SIDE_PLAYER) gSprites[spriteId].y2 += 16; break; case 2: SetSpriteRotScale(spriteId, 0xD0, 0x130, 0xF100); SetBattlerSpriteYOffsetFromYScale(spriteId); if (IsContest() || GetBattlerSide(gTasks[taskId].data[11]) == B_SIDE_PLAYER) gSprites[spriteId].y2 += 16; break; } gSprites[spriteId].x2 = 2; gTasks[taskId].data[0]++; } else { spriteId = gTasks[taskId].data[10]; if (++gTasks[taskId].data[2] == 3) { gTasks[taskId].data[2] = 0; gSprites[spriteId].x2 = -gSprites[spriteId].x2; } if (++gTasks[taskId].data[1] == 13) { ResetSpriteRotScale(spriteId); gSprites[spriteId].x2 = 0; gSprites[spriteId].y2 = 0; DestroyAnimVisualTask(taskId); } } } // Move a piece of confetti in a slightly-random speed across the screen. // arg 0: which battler the confetti starts from static void AnimFlatterConfetti(struct Sprite *sprite) { u8 tileOffset; int rand1; int rand2; tileOffset = Random() % 12; sprite->oam.tileNum += tileOffset; rand1 = Random() & 0x1FF; rand2 = Random() & 0xFF; if (rand1 & 1) sprite->data[0] = 0x5E0 + rand1; else sprite->data[0] = 0x5E0 - rand1; if (rand2 & 1) sprite->data[1] = 0x480 + rand2; else sprite->data[1] = 0x480 - rand2; sprite->data[2] = gBattleAnimArgs[0]; if (sprite->data[2] == ANIM_ATTACKER) sprite->x = -8; else sprite->x = 248; sprite->y = 104; sprite->callback = AnimFlatterConfetti_Step; } static void AnimFlatterConfetti_Step(struct Sprite *sprite) { if (sprite->data[2] == 0) { sprite->x2 += sprite->data[0] >> 8; sprite->y2 -= sprite->data[1] >> 8; } else { sprite->x2 -= sprite->data[0] >> 8; sprite->y2 -= sprite->data[1] >> 8; } sprite->data[0] -= 22; sprite->data[1] -= 48; if (sprite->data[0] < 0) sprite->data[0] = 0; if (++sprite->data[3] == 31) DestroyAnimSprite(sprite); } // Uses a spotlight sprite as a light mask to illuminate the target mon. The spotlight grows and shrinks. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration of fully-opened spotlight static void AnimFlatterSpotlight(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); sprite->data[0] = gBattleAnimArgs[2]; InitSpritePosToAnimTarget(sprite, FALSE); sprite->oam.objMode = ST_OAM_OBJ_WINDOW; sprite->invisible = TRUE; sprite->callback = AnimFlatterSpotlight_Step; } static void AnimFlatterSpotlight_Step(struct Sprite *sprite) { switch (sprite->data[1]) { case 0: sprite->invisible = FALSE; if (sprite->affineAnimEnded) sprite->data[1]++; break; case 1: if (--sprite->data[0] == 0) { ChangeSpriteAffineAnim(sprite, 1); sprite->data[1]++; } break; case 2: if (sprite->affineAnimEnded) { sprite->invisible = TRUE; sprite->data[1]++; } break; case 3: SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); DestroyAnimSprite(sprite); break; } } // Spins an orb around the attacking mon, while its path radius grows and shrinks. // arg 0: duration // arg 1: initial wave offset static void AnimReversalOrb(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = gBattleAnimArgs[1]; sprite->callback = AnimReversalOrb_Step; sprite->callback(sprite); } static void AnimReversalOrb_Step(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8); sprite->y2 = Cos(sprite->data[1], sprite->data[3] >> 8); sprite->data[1] = (sprite->data[1] + 9) & 0xFF; if ((u16)sprite->data[1] < 64 || sprite->data[1] > 195) sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1; else sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + 1; if (!sprite->data[5]) { sprite->data[2] += 0x400; sprite->data[3] += 0x100; sprite->data[4]++; if (sprite->data[4] == sprite->data[0]) { sprite->data[4] = 0; sprite->data[5] = 1; } } else if (sprite->data[5] == 1) { sprite->data[2] -= 0x400; sprite->data[3] -= 0x100; sprite->data[4]++; if (sprite->data[4] == sprite->data[0]) DestroyAnimSprite(sprite); } } // Copies the target mon's sprite, and makes a white silhouette that shrinks away. void AnimTask_RolePlaySilhouette(u8 taskId) { bool8 isBackPic; u32 personality; u32 otId; u16 species; s16 xOffset; u32 priority; u8 spriteId; s16 coord1, coord2; GetAnimBattlerSpriteId(ANIM_ATTACKER); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { isBackPic = FALSE; personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY); otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_OT_ID); if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE) { if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); if(species == SPECIES_DEOXYS) { personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_FORME); } } else { species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); if(species == SPECIES_DEOXYS) { personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_FORME); } } } else { species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies; } xOffset = 20; priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); } else { isBackPic = TRUE; personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY); otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_OT_ID); if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE) { if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); if(species == SPECIES_DEOXYS) { personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_FORME); } } else { species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); if(species == SPECIES_DEOXYS) { personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_FORME); } } } else { species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies; } xOffset = -20; priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); } coord1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); coord2 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); spriteId = CreateAdditionalMonSpriteForMoveAnim(species, isBackPic, 0, coord1 + xOffset, coord2, 5, personality, otId, gBattleAnimTarget, 1); gSprites[spriteId].oam.priority = priority; gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; FillPalette(RGB_WHITE, OBJ_PLTT_ID(gSprites[spriteId].oam.paletteNum), PLTT_SIZE_4BPP); gSprites[spriteId].oam.priority = priority; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1])); gTasks[taskId].data[0] = spriteId; gTasks[taskId].func = AnimTask_RolePlaySilhouette_Step1; } static void AnimTask_RolePlaySilhouette_Step1(u8 taskId) { if (gTasks[taskId].data[10]++ > 1) { gTasks[taskId].data[10] = 0; gTasks[taskId].data[1]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1])); if (gTasks[taskId].data[1] == 10) { gTasks[taskId].data[10] = 256; gTasks[taskId].data[11] = 256; gTasks[taskId].func = AnimTask_RolePlaySilhouette_Step2; } } } static void AnimTask_RolePlaySilhouette_Step2(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; gTasks[taskId].data[10] -= 16; gTasks[taskId].data[11] += 128; gSprites[spriteId].oam.affineMode |= ST_OAM_AFFINE_DOUBLE_MASK; TrySetSpriteRotScale(&gSprites[spriteId], TRUE, gTasks[taskId].data[10], gTasks[taskId].data[11], 0); if (++gTasks[taskId].data[12] == 9) { TryResetSpriteAffineState(&gSprites[spriteId]); DestroySpriteAndFreeResources_(&gSprites[spriteId]); gTasks[taskId].func = DestroyAnimVisualTaskAndDisableBlend; } } // Performs a wavy transformation on the mon's sprite, and fades out. // arg 0: which battler void AnimTask_AcidArmor(u8 taskId) { u8 battler; u16 bgX, bgY; s16 y, i; struct ScanlineEffectParams scanlineParams; struct Task *task = &gTasks[taskId]; if (gBattleAnimArgs[0] == ANIM_ATTACKER) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; task->data[3] = 16; task->data[4] = 0; task->data[5] = battler; task->data[6] = 32; task->data[7] = 0; task->data[8] = 24; if (GetBattlerSide(battler) == B_SIDE_OPPONENT) task->data[8] *= -1; task->data[13] = GetBattlerYCoordWithElevation(battler) - 34; if (task->data[13] < 0) task->data[13] = 0; task->data[14] = task->data[13] + 66; task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); if (GetBattlerSpriteBGPriorityRank(battler) == 1) { scanlineParams.dmaDest = ®_BG1HOFS; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); bgX = gBattle_BG1_X; bgY = gBattle_BG1_Y; } else { scanlineParams.dmaDest = ®_BG2HOFS; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); bgX = gBattle_BG2_X; bgY = gBattle_BG2_Y; } for (y = 0, i = 0; y < 160; y++, i += 2) { gScanlineEffectRegBuffers[0][i] = bgX; gScanlineEffectRegBuffers[1][i] = bgX; gScanlineEffectRegBuffers[0][i + 1] = bgY; gScanlineEffectRegBuffers[1][i + 1] = bgY; } scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_32BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; ScanlineEffect_SetParams(scanlineParams); task->func = AnimTask_AcidArmor_Step; } static void AnimTask_AcidArmor_Step(u8 taskId) { struct Task *task; s16 var1; s16 var2; s16 bgX, bgY; s16 offset; s16 var0; s32 i; s16 sineIndex; s16 var3; task = &gTasks[taskId]; if (GetBattlerSpriteBGPriorityRank(task->data[5]) == 1) { bgX = gBattle_BG1_X; bgY = gBattle_BG1_Y; } else { bgX = gBattle_BG2_X; bgY = gBattle_BG2_Y; } switch (task->data[0]) { case 0: offset = task->data[14] * 2; var1 = 0; var2 = 0; i = 0; task->data[1] = (task->data[1] + 2) & 0xFF; sineIndex = task->data[1]; task->data[9] = 0x7E0 / task->data[6]; task->data[10] = -((task->data[7] * 2) / task->data[9]); task->data[11] = task->data[7]; var3 = task->data[11] >> 5; task->data[12] = var3; var0 = task->data[14]; while (var0 > task->data[13]) { gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][offset + 1] = (i - var2) + bgY; gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][offset] = bgX + var3 + (gSineTable[sineIndex] >> 5); sineIndex = (sineIndex + 10) & 0xFF; task->data[11] += task->data[10]; var3 = task->data[11] >> 5; task->data[12] = var3; i++; offset -= 2; var1 += task->data[6]; var2 = var1 >> 5; var0--; } var0 *= 2; while (var0 >= 0) { gScanlineEffectRegBuffers[0][var0] = bgX + 240; gScanlineEffectRegBuffers[1][var0] = bgX + 240; var0 -= 2; } if (++task->data[6] > 63) { task->data[6] = 64; task->data[2]++; if (task->data[2] & 1) task->data[3]--; else task->data[4]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4])); if (task->data[3] == 0 && task->data[4] == 16) { task->data[2] = 0; task->data[3] = 0; task->data[0]++; } } else { task->data[7] += task->data[8]; } break; case 1: if (++task->data[2] > 12) { gScanlineEffect.state = 3; task->data[2] = 0; task->data[0]++; } break; case 2: task->data[2]++; if (task->data[2] & 1) task->data[3]++; else task->data[4]--; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4])); if (task->data[3] == 16 && task->data[4] == 0) { task->data[2] = 0; task->data[3] = 0; task->data[0]++; } break; case 3: DestroyAnimVisualTask(taskId); break; } } // Runs an affine animation that makes it look like the mon is inhaling deeply. // arg 0: which battler void AnimTask_DeepInhale(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[0] = 0; task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); PrepareAffineAnimInTaskData(&gTasks[taskId], task->data[15], sDeepInhaleAffineAnimCmds); task->func = AnimTask_DeepInhale_Step; } static void AnimTask_DeepInhale_Step(u8 taskId) { u16 var0; struct Task *task = &gTasks[taskId]; var0 = task->data[0]; task->data[0]++; var0 -= 20; if (var0 < 23) { if (++task->data[1] > 1) { task->data[1] = 0; task->data[2]++; if (task->data[2] & 1) gSprites[task->data[15]].x2 = 1; else gSprites[task->data[15]].x2 = -1; } } else { gSprites[task->data[15]].x2 = 0; } if (!RunAffineAnimFromTaskData(&gTasks[taskId])) DestroyAnimVisualTask(taskId); } static void InitYawnCloudPosition(struct Sprite *sprite, s16 startX, s16 startY, s16 destX, s16 destY, u16 duration) { sprite->x = startX; sprite->y = startY; sprite->data[4] = startX << 4; sprite->data[5] = startY << 4; sprite->data[6] = ((destX - startX) << 4) / duration; sprite->data[7] = ((destY - startY) << 4) / duration; } static void UpdateYawnCloudPosition(struct Sprite *sprite) { sprite->data[4] += sprite->data[6]; sprite->data[5] += sprite->data[7]; sprite->x = sprite->data[4] >> 4; sprite->y = sprite->data[5] >> 4; } // Drifts a cloud in a wavy path towards the target mon. // arg 0: which affine anim static void AnimYawnCloud(struct Sprite *sprite) { s16 destX = sprite->x; s16 destY = sprite->y; SetSpriteCoordsToAnimAttackerCoords(sprite); StartSpriteAffineAnim(sprite, gBattleAnimArgs[0]); InitYawnCloudPosition(sprite, sprite->x, sprite->y, destX, destY, 64); sprite->data[0] = 0; sprite->callback = AnimYawnCloud_Step; } static void AnimYawnCloud_Step(struct Sprite *sprite) { int index; sprite->data[0]++; index = (sprite->data[0] * 8) & 0xFF; UpdateYawnCloudPosition(sprite); sprite->y2 = Sin(index, 8); if (sprite->data[0] > 58) { if (++sprite->data[1] > 1) { sprite->data[1] = 0; sprite->data[2]++; sprite->invisible = sprite->data[2] & 1; if (sprite->data[2] > 3) DestroySpriteAndMatrix(sprite); } } } // Animates a cloud coming from the smoke ball. // arg 0: ? // arg 1: initial x pixel offset // arg 2: initial y pixel offset // arg 3: ? static void AnimSmokeBallEscapeCloud(struct Sprite *sprite) { sprite->data[0] = gBattleAnimArgs[3]; StartSpriteAffineAnim(sprite, gBattleAnimArgs[0]); if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; sprite->callback = DestroyAnimSpriteAfterTimer; } static void AnimTask_SlideMonForFocusBand_Step2(u8 taskId) { u16 var0 = 0; u16 var1 = 0; gTasks[taskId].data[0]--; if ((gTasks[taskId].data[6] & 0x8000) && (--gTasks[taskId].data[1] == -1)) { if (gTasks[taskId].data[9] == 0) { gTasks[taskId].data[9] = gTasks[taskId].data[4]; gTasks[taskId].data[4] = -gTasks[taskId].data[4]; } else { gTasks[taskId].data[9] = 0; } if (gTasks[taskId].data[10] == 0) { gTasks[taskId].data[10] = gTasks[taskId].data[5]; gTasks[taskId].data[5] = -gTasks[taskId].data[5]; } else { gTasks[taskId].data[10] = 0; } gTasks[taskId].data[1] = gTasks[taskId].data[13]; } var0 = gTasks[taskId].data[7]; var1 = gTasks[taskId].data[8]; if (gTasks[taskId].data[2] & 0x8000) gSprites[gTasks[taskId].data[15]].x2 = gTasks[taskId].data[9] - (var0 >> 8); else gSprites[gTasks[taskId].data[15]].x2 = gTasks[taskId].data[9] + (var0 >> 8); if (gTasks[taskId].data[3] & 0x8000) gSprites[gTasks[taskId].data[15]].y2 = gTasks[taskId].data[10] - (var1 >> 8); else gSprites[gTasks[taskId].data[15]].y2 = gTasks[taskId].data[10] + (var1 >> 8); if (gTasks[taskId].data[0] < 1) { DestroyTask(taskId); gAnimVisualTaskCount--; } } static void AnimTask_SlideMonForFocusBand_Step1(u8 taskId) { u16 var0 = 0; u16 var1 = 0; gTasks[taskId].data[0]--; if ((gTasks[taskId].data[6] & 0x8000) && (--gTasks[taskId].data[1] == -1)) { if (gTasks[taskId].data[9] == 0) { gTasks[taskId].data[9] = gTasks[taskId].data[4]; gTasks[taskId].data[4] = -gTasks[taskId].data[4]; } else { gTasks[taskId].data[9] = var0; } if (gTasks[taskId].data[10] == 0) { gTasks[taskId].data[10] = gTasks[taskId].data[5]; gTasks[taskId].data[5] = -gTasks[taskId].data[5]; } else { gTasks[taskId].data[10] = 0; } gTasks[taskId].data[1] = gTasks[taskId].data[13]; } var0 = (gTasks[taskId].data[2] & 0x7FFF) + gTasks[taskId].data[7]; var1 = (gTasks[taskId].data[3] & 0x7FFF) + gTasks[taskId].data[8]; if (gTasks[taskId].data[2] & 0x8000) gSprites[gTasks[taskId].data[15]].x2 = gTasks[taskId].data[9] - (var0 >> 8); else gSprites[gTasks[taskId].data[15]].x2 = gTasks[taskId].data[9] + (var0 >> 8); if (gTasks[taskId].data[3] & 0x8000) gSprites[gTasks[taskId].data[15]].y2 = gTasks[taskId].data[10] - (var1 >> 8); else gSprites[gTasks[taskId].data[15]].y2 = gTasks[taskId].data[10] + (var1 >> 8); gTasks[taskId].data[7] = var0; gTasks[taskId].data[8] = var1; if (gTasks[taskId].data[0] < 1) { gTasks[taskId].data[0] = 30; gTasks[taskId].data[13] = 0; gTasks[taskId].func = AnimTask_SlideMonForFocusBand_Step2; } } void AnimTask_SlideMonForFocusBand(u8 taskId) { gTasks[taskId].data[15] = gBattlerSpriteIds[gBattleAnimAttacker]; gTasks[taskId].data[14] = gBattleAnimArgs[0]; gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[13] = gBattleAnimArgs[6]; if (gBattleAnimArgs[3]) gTasks[taskId].data[6] = gTasks[taskId].data[6] | -0x8000; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { gTasks[taskId].data[2] = gBattleAnimArgs[1]; gTasks[taskId].data[3] = gBattleAnimArgs[2]; } else { if (gBattleAnimArgs[1] & 0x8000) gTasks[taskId].data[2] = gBattleAnimArgs[1] & 0x7FFF; else gTasks[taskId].data[2] = gBattleAnimArgs[1] | -0x8000; if (gBattleAnimArgs[2] & 0x8000) gTasks[taskId].data[3] = gBattleAnimArgs[2] & 0x7FFF; else gTasks[taskId].data[3] = gBattleAnimArgs[2] | -0x8000; } gTasks[taskId].data[8] = 0; gTasks[taskId].data[7] = 0; gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].data[5] = gBattleAnimArgs[5]; gTasks[taskId].func = AnimTask_SlideMonForFocusBand_Step1; } #define IDX_ACTIVE_SPRITES 2 // Used by the sprite callback to modify the number of active sprites // Task data for AnimTask_SquishAndSweatDroplets #define tState data[0] #define tTimer data[1] #define tActiveSprites data[IDX_ACTIVE_SPRITES] #define tNumSquishes data[3] #define tBaseX data[4] #define tBaseY data[5] #define tSubpriority data[6] // data[7]-data[15] used by PrepareAffineAnimInTaskData #define tBattlerSpriteId data[15] // Sprite data for AnimFacadeSweatDrop #define sTimer data[0] #define sVelocX data[1] #define sVelocY data[2] #define sTaskId data[3] #define sActiveSpritesIdx data[4] // Squishes the mon vertically and emits sweat droplets a few times. // arg 0: battler // arg 1: num squishes void AnimTask_SquishAndSweatDroplets(u8 taskId) { u8 battler; struct Task *task = &gTasks[taskId]; if (!gBattleAnimArgs[1]) DestroyAnimVisualTask(taskId); task->tState = 0; task->tTimer = 0; task->tActiveSprites = 0; task->tNumSquishes = gBattleAnimArgs[1]; if (gBattleAnimArgs[0] == ANIM_ATTACKER) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; task->tBaseX = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); task->tBaseY = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y); task->tSubpriority = GetBattlerSpriteSubpriority(battler); task->tBattlerSpriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); PrepareAffineAnimInTaskData(task, task->tBattlerSpriteId, sFacadeSquishAffineAnimCmds); task->func = AnimTask_SquishAndSweatDroplets_Step; } static void AnimTask_SquishAndSweatDroplets_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: task->tTimer++; if (task->tTimer == 6) CreateSweatDroplets(taskId, TRUE); if (task->tTimer == 18) CreateSweatDroplets(taskId, FALSE); if (!RunAffineAnimFromTaskData(task)) { if (--task->tNumSquishes == 0) { // Animation is finished task->tState++; } else { // Animation continues, more droplet sprites to create task->tTimer = 0; PrepareAffineAnimInTaskData(task, task->tBattlerSpriteId, sFacadeSquishAffineAnimCmds); } } break; case 1: // Wait for sprites to be destroyed before ending task if (task->tActiveSprites == 0) DestroyAnimVisualTask(taskId); break; } } static void CreateSweatDroplets(u8 taskId, bool8 lowerDroplets) { u32 i; s8 xOffset, yOffset; struct Task *task; s16 xCoords[4]; s16 yCoords[2]; task = &gTasks[taskId]; if (!lowerDroplets) { xOffset = 18; yOffset = -20; } else { xOffset = 30; yOffset = 20; } xCoords[0] = task->tBaseX - xOffset; xCoords[1] = task->tBaseX - xOffset - 4; xCoords[2] = task->tBaseX + xOffset; xCoords[3] = task->tBaseX + xOffset + 4; yCoords[0] = task->tBaseY + yOffset; yCoords[1] = task->tBaseY + yOffset + 6; for (i = 0; i < 4; i++) { u8 spriteId = CreateSprite(&gFacadeSweatDropSpriteTemplate, xCoords[i], yCoords[i & 1], task->tSubpriority - 5); if (spriteId != MAX_SPRITES) { gSprites[spriteId].sTimer = 0; gSprites[spriteId].sVelocX = i < 2 ? -2 : 2; // First two travel left, remaining travel right gSprites[spriteId].sVelocY = -1; gSprites[spriteId].sTaskId = taskId; gSprites[spriteId].sActiveSpritesIdx = IDX_ACTIVE_SPRITES; task->tActiveSprites++; } } } static void AnimFacadeSweatDrop(struct Sprite *sprite) { sprite->x += sprite->sVelocX; sprite->y += sprite->sVelocY; if (++sprite->sTimer > 6) { gTasks[sprite->sTaskId].data[sprite->sActiveSpritesIdx]--; DestroySprite(sprite); } } #undef IDX_ACTIVE_SPRITES #undef tState #undef tTimer #undef tActiveSprites #undef tNumSquishes #undef tBaseX #undef tBaseY #undef tSubpriority #undef tBattlerSpriteId #undef sTimer #undef sVelocX #undef sVelocY #undef sTaskId #undef sActiveSpritesIdx // Blends the mon sprite's color with a rotating set of colors. // arg 0: battler // arg 1: duration void AnimTask_FacadeColorBlend(u8 taskId) { u8 spriteId; gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = gBattleAnimArgs[1]; spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); gTasks[taskId].data[2] = OBJ_PLTT_ID(gSprites[spriteId].oam.paletteNum); gTasks[taskId].func = AnimTask_FacadeColorBlend_Step; } static void AnimTask_FacadeColorBlend_Step(u8 taskId) { if (gTasks[taskId].data[1]) { BlendPalette(gTasks[taskId].data[2], 16, 8, sFacadeBlendColors[gTasks[taskId].data[0]]); if (++gTasks[taskId].data[0] > 23) gTasks[taskId].data[0] = 0; gTasks[taskId].data[1]--; } else { BlendPalette(gTasks[taskId].data[2], 16, 0, RGB_BLACK); DestroyAnimVisualTask(taskId); } } void AnimTask_StatusClearedEffect(u8 taskId) { StartMonScrollingBgMask(taskId, 0, 0x1A0, gBattleAnimAttacker, gBattleAnimArgs[0], 10, 2, 30, gCureBubblesGfx, gCureBubblesTilemap, gCureBubblesPal); } // Moves a noise line from the mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: which direction (0 = upward, 1 = downward, 2 = horizontal) static void AnimRoarNoiseLine(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; if (gBattleAnimArgs[2] == 0) { sprite->data[0] = 0x280; sprite->data[1] = -0x280; } else if (gBattleAnimArgs[2] == 1) { sprite->vFlip = TRUE; sprite->data[0] = 0x280; sprite->data[1] = 0x280; } else { StartSpriteAnim(sprite, 1); sprite->data[0] = 0x280; } if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->data[0] = -sprite->data[0]; sprite->hFlip = TRUE; } sprite->callback = AnimRoarNoiseLine_Step; } static void AnimRoarNoiseLine_Step(struct Sprite *sprite) { sprite->data[6] += sprite->data[0]; sprite->data[7] += sprite->data[1]; sprite->x2 = sprite->data[6] >> 8; sprite->y2 = sprite->data[7] >> 8; if (++sprite->data[5] == 14) DestroyAnimSprite(sprite); } #define IDX_ACTIVE_SPRITES 10 // Used by the sprite callback to modify the number of active sprites // Task data for AnimTask_GlareEyeDots #define tState data[0] #define tTimer data[1] #define tPairNum data[2] #define tPairMax data[5] #define tDotOffset data[6] #define tIsContest data[7] #define tActiveSprites data[IDX_ACTIVE_SPRITES] #define tStartX data[11] #define tStartY data[12] #define tEndX data[13] #define tEndY data[14] // Sprite data for AnimGlareEyeDot #define sTimer data[0] #define sTaskId data[1] #define sActiveSpritesIdx data[2] // Makes a series of dots in a trail from the attacker to the target. // arg 0: unused void AnimTask_GlareEyeDots(u8 taskId) { struct Task *task = &gTasks[taskId]; task->tPairMax = 12; task->tDotOffset = 3; task->tIsContest = FALSE; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) task->tStartX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4; else task->tStartX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4; task->tStartY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4; task->tEndX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); task->tEndY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); task->func = AnimTask_GlareEyeDots_Step; } static void AnimTask_GlareEyeDots_Step(u8 taskId) { u32 i; s16 x, y; struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: // Wait to create next pair of dots if (++task->tTimer > 3) { task->tTimer = 0; GetGlareEyeDotCoords( task->tStartX, task->tStartY, task->tEndX, task->tEndY, task->tPairMax, task->tPairNum, &x, &y); // Create dot pair for (i = 0; i < 2; i++) { u8 spriteId = CreateSprite(&gGlareEyeDotSpriteTemplate, x, y, 35); if (spriteId != MAX_SPRITES) { if (!task->tIsContest) { if (i == 0) gSprites[spriteId].x2 = gSprites[spriteId].y2 = -task->tDotOffset; else gSprites[spriteId].x2 = gSprites[spriteId].y2 = task->tDotOffset; } else { if (i == 0) { gSprites[spriteId].x2 = -task->tDotOffset; gSprites[spriteId].y2 = task->tDotOffset; } else { gSprites[spriteId].x2 = task->tDotOffset; gSprites[spriteId].y2 = -task->tDotOffset; } } gSprites[spriteId].sTimer = 0; gSprites[spriteId].sTaskId = taskId; gSprites[spriteId].sActiveSpritesIdx = IDX_ACTIVE_SPRITES; task->tActiveSprites++; } } if (task->tPairNum == task->tPairMax) task->tState++; task->tPairNum++; } break; case 1: // Wait for sprites to be destroyed before ending task if (task->tActiveSprites == 0) DestroyAnimVisualTask(taskId); break; } } static void GetGlareEyeDotCoords(s16 startX, s16 startY, s16 endX, s16 endY, u8 pairMax, u8 pairNum, s16 *x, s16 *y) { int x2; int y2; if (pairNum == 0) { *x = startX; *y = startY; return; } if (pairNum >= pairMax) { *x = endX; *y = endY; return; } pairMax--; x2 = (startX << 8) + pairNum * (((endX - startX) << 8) / pairMax); y2 = (startY << 8) + pairNum * (((endY - startY) << 8) / pairMax); *x = x2 >> 8; *y = y2 >> 8; } static void AnimGlareEyeDot(struct Sprite *sprite) { if (++sprite->sTimer > 36) { gTasks[sprite->sTaskId].data[sprite->sActiveSpritesIdx]--; DestroySprite(sprite); } } #undef IDX_ACTIVE_SPRITES #undef tState #undef tTimer #undef tPairNum #undef tPairMax #undef tDotOffset #undef tIsContest #undef tActiveSprites #undef tStartX #undef tStartY #undef tEndX #undef tEndY #undef sTimer #undef sTaskId #undef sActiveSpritesIdx // Moves a pawprint in a straight line. // arg 0: initial x position // arg 1: initial y position // arg 2: destination x position // arg 3: destination y position // arg 4: duration static void AnimAssistPawprint(struct Sprite *sprite) { sprite->x = gBattleAnimArgs[0]; sprite->y = gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[2]; sprite->data[4] = gBattleAnimArgs[3]; sprite->data[0] = gBattleAnimArgs[4]; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = InitAndRunAnimFastLinearTranslation; } // Moves a ball in an arc twoards the target, and rotates the ball while arcing. // No args. void AnimTask_BarrageBall(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) / 4; task->data[15] = CreateSprite(&gBarrageBallSpriteTemplate, task->data[11], task->data[12], GetBattlerSpriteSubpriority(gBattleAnimTarget) - 5); if (task->data[15] != MAX_SPRITES) { gSprites[task->data[15]].data[0] = 16; gSprites[task->data[15]].data[2] = task->data[13]; gSprites[task->data[15]].data[4] = task->data[14]; gSprites[task->data[15]].data[5] = -32; InitAnimArcTranslation(&gSprites[task->data[15]]); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) StartSpriteAffineAnim(&gSprites[task->data[15]], 1); task->func = AnimTask_BarrageBall_Step; } else { DestroyAnimVisualTask(taskId); } } static void AnimTask_BarrageBall_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (++task->data[1] > 1) { task->data[1] = 0; TranslateAnimHorizontalArc(&gSprites[task->data[15]]); if (++task->data[2] > 7) task->data[0]++; } break; case 1: if (TranslateAnimHorizontalArc(&gSprites[task->data[15]])) { task->data[1] = 0; task->data[2] = 0; task->data[0]++; } break; case 2: if (++task->data[1] > 1) { task->data[1] = 0; task->data[2]++; gSprites[task->data[15]].invisible = task->data[2] & 1; if (task->data[2] == 16) { FreeOamMatrix(gSprites[task->data[15]].oam.matrixNum); DestroySprite(&gSprites[task->data[15]]); task->data[0]++; } } break; case 3: DestroyAnimVisualTask(taskId); break; } } // Moves a hand back and forth in a squishing motion. // arg 0: which battler // arg 1: horizontal flip // arg 2: num squishes static void AnimSmellingSaltsHand(struct Sprite *sprite) { u8 battler; if (gBattleAnimArgs[0] == ANIM_ATTACKER) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; sprite->oam.tileNum += 16; sprite->data[6] = gBattleAnimArgs[2]; sprite->data[7] = gBattleAnimArgs[1] == 0 ? -1 : 1; sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET); if (gBattleAnimArgs[1] == 0) { sprite->oam.matrixNum |= ST_OAM_HFLIP; sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8; } else { sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8; } sprite->callback = AnimSmellingSaltsHand_Step; } static void AnimSmellingSaltsHand_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: if (++sprite->data[1] > 1) { sprite->data[1] = 0; sprite->x2 += sprite->data[7]; if (++sprite->data[2] == 12) sprite->data[0]++; } break; case 1: if (++sprite->data[1] == 8) { sprite->data[1] = 0; sprite->data[0]++; } break; case 2: sprite->x2 -= sprite->data[7] * 4; if (++sprite->data[1] == 6) { sprite->data[1] = 0; sprite->data[0]++; } break; case 3: sprite->x2 += sprite->data[7] * 3; if (++sprite->data[1] == 8) { if (--sprite->data[6]) { sprite->data[1] = 0; sprite->data[0]--; } else { DestroyAnimSprite(sprite); } } break; } } // Squishes the mon horizontally a few times. // arg 0: which mon // arg 1: number of squishes void AnimTask_SmellingSaltsSquish(u8 taskId) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) { DestroyAnimVisualTask(taskId); } else { gTasks[taskId].data[0] = gBattleAnimArgs[1]; gTasks[taskId].data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], sSmellingSaltsSquishAffineAnimCmds); gTasks[taskId].func = AnimTask_SmellingSaltsSquish_Step; } } static void AnimTask_SmellingSaltsSquish_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; if (++task->data[1] > 1) { task->data[1] = 0; if (!(task->data[2] & 1)) gSprites[task->data[15]].x2 = 2; else gSprites[task->data[15]].x2 = -2; } if (!RunAffineAnimFromTaskData(task)) { gSprites[task->data[15]].x2 = 0; if (--task->data[0]) { PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], sSmellingSaltsSquishAffineAnimCmds); task->data[1] = 0; task->data[2] = 0; } else { DestroyAnimVisualTask(taskId); } } } // Blinks an exclamation image over the mon a few times. // arg 0: which mon // arg 1: blink delay // arg 2: number of blinks static void AnimSmellingSaltExclamation(struct Sprite *sprite) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP); } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP); } if (sprite->y < 8) sprite->y = 8; sprite->data[0] = 0; sprite->data[1] = gBattleAnimArgs[1]; sprite->data[2] = 0; sprite->data[3] = gBattleAnimArgs[2]; sprite->callback = AnimSmellingSaltExclamation_Step; } static void AnimSmellingSaltExclamation_Step(struct Sprite *sprite) { if (++sprite->data[0] >= sprite->data[1]) { sprite->data[0] = 0; sprite->data[2] = (sprite->data[2] + 1) & 1; sprite->invisible = sprite->data[2]; if (sprite->data[2] && --sprite->data[3] == 0) DestroyAnimSprite(sprite); } } // Claps a hand several times. // arg 0: which hand // arg 1: static void AnimHelpingHandClap(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { sprite->oam.matrixNum |= ST_OAM_HFLIP; sprite->x = 100; sprite->data[7] = 1; } else { sprite->x = 140; sprite->data[7] = -1; } sprite->y = 56; sprite->callback = AnimHelpingHandClap_Step; } static void AnimHelpingHandClap_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->y -= sprite->data[7] * 2; if (sprite->data[1] & 1) sprite->x -= sprite->data[7] * 2; if (++sprite->data[1] == 9) { sprite->data[1] = 0; sprite->data[0]++; } break; case 1: if (++sprite->data[1] == 4) { sprite->data[1] = 0; sprite->data[0]++; } break; case 2: sprite->data[1]++; sprite->y += sprite->data[7] * 3; sprite->x2 = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3); if (sprite->data[1] == 12) { sprite->data[1] = 0; sprite->data[0]++; } break; case 3: if (++sprite->data[1] == 2) { sprite->data[1] = 0; sprite->data[0]++; } break; case 4: sprite->data[1]++; sprite->y -= sprite->data[7] * 3; sprite->x2 = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3); if (sprite->data[1] == 12) sprite->data[0]++; break; case 5: sprite->data[1]++; sprite->y += sprite->data[7] * 3; sprite->x2 = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3); if (sprite->data[1] == 15) sprite->oam.tileNum += 16; if (sprite->data[1] == 18) { sprite->data[1] = 0; sprite->data[0]++; } break; case 6: sprite->x += sprite->data[7] * 6; if (++sprite->data[1] == 9) { sprite->data[1] = 0; sprite->data[0]++; } break; case 7: sprite->x += sprite->data[7] * 2; if (++sprite->data[1] == 1) { sprite->data[1] = 0; sprite->data[0]++; } break; case 8: sprite->x -= sprite->data[7] * 3; if (++sprite->data[1] == 5) DestroyAnimSprite(sprite); break; } } // Repeatedly moves the attacking mon in a horizontal lunging motion. // No args. void AnimTask_HelpingHandAttackerMovement(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); if (IsDoubleBattle() == TRUE) { int attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); int partnerX = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X); if (attackerX > partnerX) task->data[14] = 1; else task->data[14] = -1; } else { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) task->data[14] = -1; else task->data[14] = 1; } task->func = AnimTask_HelpingHandAttackerMovement_Step; } static void AnimTask_HelpingHandAttackerMovement_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (++task->data[1] == 13) { task->data[1] = 0; task->data[0]++; } break; case 1: gSprites[task->data[15]].x2 -= task->data[14] * 3; if (++task->data[1] == 6) { task->data[1] = 0; task->data[0]++; } break; case 2: gSprites[task->data[15]].x2 += task->data[14] * 3; if (++task->data[1] == 6) { task->data[1] = 0; task->data[0]++; } break; case 3: if (++task->data[1] == 2) { task->data[1] = 0; if (task->data[2] == 0) { task->data[2]++; task->data[0] = 1; } else { task->data[0]++; } } break; case 4: gSprites[task->data[15]].x2 += task->data[14]; if (++task->data[1] == 3) { task->data[1] = 0; task->data[0]++; } break; case 5: if (++task->data[1] == 6) { task->data[1] = 0; task->data[0]++; } break; case 6: gSprites[task->data[15]].x2 -= task->data[14] * 4; if (++task->data[1] == 5) { task->data[1] = 0; task->data[0]++; } break; case 7: gSprites[task->data[15]].x2 += task->data[14] * 4; if (++task->data[1] == 5) { task->data[1] = 0; task->data[0]++; } break; case 8: gSprites[task->data[15]].x2 = 0; DestroyAnimVisualTask(taskId); break; } } // Moves a magnifying glass around in straight lines. // arg 0: magnifying glass target mon static void AnimForesightMagnifyingGlass(struct Sprite *sprite) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[7] = gBattleAnimAttacker; } else { sprite->data[7] = gBattleAnimTarget; } if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT) sprite->oam.matrixNum = ST_OAM_HFLIP; sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]); sprite->oam.objMode = ST_OAM_OBJ_BLEND; sprite->callback = AnimForesightMagnifyingGlass_Step; } static void AnimForesightMagnifyingGlass_Step(struct Sprite *sprite) { u16 x, y; switch (sprite->data[5]) { case 0: switch (sprite->data[6]) { default: sprite->data[6] = 0; case 0: case 4: x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_RIGHT) - 4; y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_BOTTOM) - 4; break; case 1: x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_RIGHT) - 4; y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_TOP) + 4; break; case 2: x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_LEFT) + 4; y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_BOTTOM) - 4; break; case 3: x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_LEFT) + 4; y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_TOP) - 4; break; case 5: x = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_X_2); y = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_Y_PIC_OFFSET); break; } if (sprite->data[6] == 4) sprite->data[0] = 24; else if (sprite->data[6] == 5) sprite->data[0] = 6; else sprite->data[0] = 12; sprite->data[1] = sprite->x; sprite->data[2] = x; sprite->data[3] = sprite->y; sprite->data[4] = y; InitAnimLinearTranslation(sprite); sprite->data[5]++; break; case 1: if (AnimTranslateLinear(sprite)) { switch (sprite->data[6]) { default: sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; sprite->data[0] = 0; sprite->data[5]++; sprite->data[6]++; break; case 4: sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; sprite->data[5] = 0; sprite->data[6]++; break; case 5: sprite->data[0] = 0; sprite->data[1] = 16; sprite->data[2] = 0; sprite->data[5] = 3; break; } } break; case 2: if (++sprite->data[0] == 4) sprite->data[5] = 0; break; case 3: if (!(sprite->data[0] & 1)) sprite->data[1]--; else sprite->data[2]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], sprite->data[2])); if (++sprite->data[0] == 32) { sprite->invisible = TRUE; sprite->data[5]++; } break; case 4: DestroyAnimSprite(sprite); break; } } static void AnimMeteorMashStar_Step(struct Sprite *sprite) { sprite->x2 = ((sprite->data[2] - sprite->data[0]) * sprite->data[5]) / sprite->data[4]; sprite->y2 = ((sprite->data[3] - sprite->data[1]) * sprite->data[5]) / sprite->data[4]; if (!(sprite->data[5] & 1)) { CreateSprite( &gMiniTwinklingStarSpriteTemplate, sprite->x + sprite->x2, sprite->y + sprite->y2, 5); } if (sprite->data[5] == sprite->data[4]) DestroyAnimSprite(sprite); sprite->data[5]++; } // Moves a shooting star across the screen that leaves little twinkling stars behind its path. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: destination x pixel offset // arg 3: destination y pixel offset // arg 4: duration static void AnimMeteorMashStar(struct Sprite *sprite) { s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { sprite->data[0] = sprite->x - gBattleAnimArgs[0]; sprite->data[2] = sprite->x - gBattleAnimArgs[2]; } else { sprite->data[0] = sprite->x + gBattleAnimArgs[0]; sprite->data[2] = sprite->x + gBattleAnimArgs[2]; } sprite->data[1] = sprite->y + gBattleAnimArgs[1]; sprite->data[3] = sprite->y + gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[4]; sprite->x = sprite->data[0]; sprite->y = sprite->data[1]; sprite->callback = AnimMeteorMashStar_Step; } void AnimTask_MonToSubstitute(u8 taskId) { int i; u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); if (gTasks[taskId].data[0] == 0) { PrepareBattlerSpriteForRotScale(spriteId, FALSE); gTasks[taskId].data[1] = 0x100; gTasks[taskId].data[2] = 0x100; gTasks[taskId].data[0]++; } else if (gTasks[taskId].data[0] == 1) { gTasks[taskId].data[1] += 0x60; gTasks[taskId].data[2] -= 0xD; SetSpriteRotScale(spriteId, gTasks[taskId].data[1], gTasks[taskId].data[2], 0); if (++gTasks[taskId].data[3] == 9) { gTasks[taskId].data[3] = 0; ResetSpriteRotScale(spriteId); gSprites[spriteId].invisible = TRUE; gTasks[taskId].data[0]++; } } else { LoadBattleMonGfxAndAnimate(gBattleAnimAttacker, 0, spriteId); for (i = 0; i < NUM_TASK_DATA; i++) gTasks[taskId].data[i] = 0; gTasks[taskId].func = AnimTask_MonToSubstituteDoll; } } static void AnimTask_MonToSubstituteDoll(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); switch (gTasks[taskId].data[0]) { case 0: gSprites[spriteId].y2 = -200; gSprites[spriteId].x2 = 200; gSprites[spriteId].invisible = FALSE; gTasks[taskId].data[10] = 0; gTasks[taskId].data[0]++; break; case 1: gTasks[taskId].data[10] += 112; gSprites[spriteId].y2 += gTasks[taskId].data[10] >> 8; if (gSprites[spriteId].y + gSprites[spriteId].y2 >= -32) gSprites[spriteId].x2 = 0; if (gSprites[spriteId].y2 > 0) gSprites[spriteId].y2 = 0; if (gSprites[spriteId].y2 == 0) { PlaySE12WithPanning(SE_M_BUBBLE2, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER)); gTasks[taskId].data[10] -= 0x800; gTasks[taskId].data[0]++; } break; case 2: gTasks[taskId].data[10] -= 112; if (gTasks[taskId].data[10] < 0) gTasks[taskId].data[10] = 0; gSprites[spriteId].y2 -= gTasks[taskId].data[10] >> 8; if (gTasks[taskId].data[10] == 0) gTasks[taskId].data[0]++; break; case 3: gTasks[taskId].data[10] += 112; gSprites[spriteId].y2 += gTasks[taskId].data[10] >> 8; if (gSprites[spriteId].y2 > 0) gSprites[spriteId].y2 = 0; if (gSprites[spriteId].y2 == 0) { PlaySE12WithPanning(SE_M_BUBBLE2, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER)); DestroyAnimVisualTask(taskId); } break; } } // Moves down an X that flickers and disappears. // No args. static void AnimBlockX(struct Sprite *sprite) { s16 y; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2; y = -144; } else { sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 2; y = -96; } sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->y2 = y; sprite->callback = AnimBlockX_Step; } static void AnimBlockX_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->y2 += 10; if (sprite->y2 >= 0) { PlaySE12WithPanning(SE_M_SKETCH, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); sprite->y2 = 0; sprite->data[0]++; } break; case 1: sprite->data[1] += 4; sprite->y2 = -(gSineTable[sprite->data[1]] >> 3); if (sprite->data[1] > 0x7F) { PlaySE12WithPanning(SE_M_SKETCH, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); sprite->data[1] = 0; sprite->y2 = 0; sprite->data[0]++; } break; case 2: sprite->data[1] += 6; sprite->y2 = -(gSineTable[sprite->data[1]] >> 4); if (sprite->data[1] > 0x7F) { sprite->data[1] = 0; sprite->y2 = 0; sprite->data[0]++; } break; case 3: if (++sprite->data[1] > 8) { PlaySE12WithPanning(SE_M_LEER, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); sprite->data[1] = 0; sprite->data[0]++; } break; case 4: if (++sprite->data[1] > 8) { sprite->data[1] = 0; sprite->data[2]++; sprite->invisible = sprite->data[2] & 1; if (sprite->data[2] == 7) DestroyAnimSprite(sprite); } break; } } // Quickly moves two clones of the target mon back and forth. // No args. void AnimTask_OdorSleuthMovement(u8 taskId) { s16 spriteId1, spriteId2; spriteId1 = CloneBattlerSpriteWithBlend(ANIM_TARGET); if (spriteId1 < 0) { DestroyAnimVisualTask(taskId); return; } spriteId2 = CloneBattlerSpriteWithBlend(ANIM_TARGET); if (spriteId2 < 0) { DestroySpriteWithActiveSheet(&gSprites[spriteId1]); DestroyAnimVisualTask(taskId); return; } gSprites[spriteId2].x2 += 24; gSprites[spriteId1].x2 -= 24; gSprites[spriteId2].data[0] = 0; gSprites[spriteId1].data[0] = 0; gSprites[spriteId2].data[1] = 0; gSprites[spriteId1].data[1] = 0; gSprites[spriteId2].data[2] = 0; gSprites[spriteId1].data[2] = 0; gSprites[spriteId2].data[3] = 16; gSprites[spriteId1].data[3] = -16; gSprites[spriteId2].data[4] = 0; gSprites[spriteId1].data[4] = 128; gSprites[spriteId2].data[5] = 24; gSprites[spriteId1].data[5] = 24; gSprites[spriteId2].data[6] = taskId; gSprites[spriteId1].data[6] = taskId; gSprites[spriteId2].data[7] = 0; gSprites[spriteId1].data[7] = 0; gTasks[taskId].data[0] = 2; if (!gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].invisible) { gSprites[spriteId2].invisible = FALSE; gSprites[spriteId1].invisible = TRUE; } else { gSprites[spriteId2].invisible = TRUE; gSprites[spriteId1].invisible = TRUE; } gSprites[spriteId2].oam.objMode = ST_OAM_OBJ_NORMAL; gSprites[spriteId1].oam.objMode = ST_OAM_OBJ_NORMAL; gSprites[spriteId2].callback = MoveOdorSleuthClone; gSprites[spriteId1].callback = MoveOdorSleuthClone; gTasks[taskId].func = AnimTask_OdorSleuthMovementWaitFinish; } static void AnimTask_OdorSleuthMovementWaitFinish(u8 taskId) { if (gTasks[taskId].data[0] == 0) DestroyAnimVisualTask(taskId); } static void MoveOdorSleuthClone(struct Sprite *sprite) { int zero = 0; if (++sprite->data[1] > 1) { sprite->data[1] = 0; if (!gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].invisible) sprite->invisible ^= 1; } sprite->data[4] = sprite->data[4] + sprite->data[3]; sprite->data[4] &= 0xFF; sprite->x2 = Cos(sprite->data[4], sprite->data[5]); switch (sprite->data[0]) { case 0: if (++sprite->data[2] == 60) { sprite->data[2] = 0; sprite->data[0]++; } break; case 1: if (++sprite->data[2] > 0) { sprite->data[2] = 0; sprite->data[5] -= 2; if (sprite->data[5] < 0) { gTasks[sprite->data[6]].data[sprite->data[7]]--; DestroySpriteWithActiveSheet(sprite); } } break; } } void AnimTask_GetReturnPowerLevel(u8 taskId) { gBattleAnimArgs[ARG_RET_ID] = 0; if (gAnimFriendship < 60) gBattleAnimArgs[ARG_RET_ID] = 0; if (gAnimFriendship > 60 && gAnimFriendship < 92) gBattleAnimArgs[ARG_RET_ID] = 1; if (gAnimFriendship > 91 && gAnimFriendship < 201) gBattleAnimArgs[ARG_RET_ID] = 2; if (gAnimFriendship > 200) gBattleAnimArgs[ARG_RET_ID] = 3; DestroyAnimVisualTask(taskId); } // Makes the mon run out of screen, run past the opposing mon, and return to its original position. // No args. void AnimTask_SnatchOpposingMonMove(u8 taskId) { u8 spriteId, spriteId2; u32 personality; u32 otId; u16 species; u8 subpriority; bool8 isBackPic; s16 x; switch (gTasks[taskId].data[0]) { case 0: spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); gTasks[taskId].data[1] += 0x800; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) gSprites[spriteId].x2 += (gTasks[taskId].data[1] >> 8); else gSprites[spriteId].x2 -= (gTasks[taskId].data[1] >> 8); gTasks[taskId].data[1] &= 0xFF; x = gSprites[spriteId].x + gSprites[spriteId].x2; if (x < -32 || x > DISPLAY_WIDTH + 32) { gTasks[taskId].data[1] = 0; gTasks[taskId].data[0]++; } break; case 1: { s16 x; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID); if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) { species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); if(species == SPECIES_DEOXYS) { personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_FORME); } } else species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1; isBackPic = FALSE; x = DISPLAY_WIDTH + 32; } else { personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID); if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) { species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); if(species == SPECIES_DEOXYS) { personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_FORME); } } else species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1; isBackPic = TRUE; x = -32; } spriteId2 = CreateAdditionalMonSpriteForMoveAnim(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId, gBattleAnimAttacker, 0); if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies != SPECIES_NONE) BlendPalette(OBJ_PLTT_ID(gSprites[spriteId2].oam.paletteNum), 16, 6, RGB_WHITE); gTasks[taskId].data[15] = spriteId2; gTasks[taskId].data[0]++; break; } case 2: spriteId2 = gTasks[taskId].data[15]; gTasks[taskId].data[1] += 0x800; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) gSprites[spriteId2].x2 -= (gTasks[taskId].data[1] >> 8); else gSprites[spriteId2].x2 += (gTasks[taskId].data[1] >> 8); gTasks[taskId].data[1] &= 0xFF; x = gSprites[spriteId2].x + gSprites[spriteId2].x2; if (gTasks[taskId].data[14] == 0) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { if (x < GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X)) { gTasks[taskId].data[14]++; gBattleAnimArgs[7] = 0xFFFF; } } else { if (x > GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X)) { gTasks[taskId].data[14]++; gBattleAnimArgs[7] = 0xFFFF; } } } if (x < -32 || x > DISPLAY_WIDTH + 32) { gTasks[taskId].data[1] = 0; gTasks[taskId].data[0]++; } break; case 3: spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); spriteId2 = gTasks[taskId].data[15]; DestroySpriteAndFreeResources_(&gSprites[spriteId2]); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) gSprites[spriteId].x2 = -gSprites[spriteId].x - 32; else gSprites[spriteId].x2 = DISPLAY_WIDTH + 32 - gSprites[spriteId].x; gTasks[taskId].data[0]++; break; case 4: spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); gTasks[taskId].data[1] += 0x800; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { gSprites[spriteId].x2 += (gTasks[taskId].data[1] >> 8); if (gSprites[spriteId].x2 + gSprites[spriteId].x >= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X)) gSprites[spriteId].x2 = 0; } else { gSprites[spriteId].x2 -= (gTasks[taskId].data[1] >> 8); if (gSprites[spriteId].x2 + gSprites[spriteId].x <= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X)) gSprites[spriteId].x2 = 0; } gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1]; if (gSprites[spriteId].x2 == 0) DestroyAnimVisualTask(taskId); break; } } static void AnimUnusedItemBagSteal(struct Sprite *sprite) { switch (sprite->data[7]) { case 0: if (gBattleAnimArgs[7] == -1) { PlaySE12WithPanning(SE_M_VITAL_THROW, BattleAnimAdjustPanning(SOUND_PAN_TARGET)); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 16; sprite->data[0] = -32; sprite->data[7]++; sprite->invisible = FALSE; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1; } else { sprite->invisible = TRUE; } break; case 1: sprite->y2 = Sin(sprite->data[1], sprite->data[0]); sprite->data[1] += 5; if (sprite->data[1] > 0x7F) { sprite->data[0] = sprite->data[0] / 2; sprite->data[3]++; sprite->data[1] -= 0x7F; } sprite->data[2] += 0x100; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) sprite->x2 -= (sprite->data[2] >> 8); else sprite->x2 += (sprite->data[2] >> 8); sprite->data[2] &= 0xFF; if (sprite->data[3] == 2) DestroyAnimSprite(sprite); break; } } // Quickly moves the mon towards its partner and back. // No args. void AnimTask_SnatchPartnerMove(u8 taskId) { s16 attackerX, targetX; u8 spriteId; switch (gTasks[taskId].data[15]) { case 0: attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); gTasks[taskId].data[0] = 6; if (attackerX > targetX) gTasks[taskId].data[0] *= -1; gTasks[taskId].data[1] = attackerX; gTasks[taskId].data[2] = targetX; gTasks[taskId].data[15]++; break; case 1: spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; gSprites[spriteId].x2 += gTasks[taskId].data[0]; if (gTasks[taskId].data[0] > 0) { if (gSprites[spriteId].x + gSprites[spriteId].x2 >= gTasks[taskId].data[2]) gTasks[taskId].data[15]++; } else { if (gSprites[spriteId].x + gSprites[spriteId].x2 <= gTasks[taskId].data[2]) gTasks[taskId].data[15]++; } break; case 2: gTasks[taskId].data[0] *= -1; gTasks[taskId].data[15]++; break; case 3: spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; gSprites[spriteId].x2 += gTasks[taskId].data[0]; if (gTasks[taskId].data[0] < 0) { if (gSprites[spriteId].x + gSprites[spriteId].x2 <= gTasks[taskId].data[1]) gTasks[taskId].data[15]++; } else { if (gSprites[spriteId].x + gSprites[spriteId].x2 >= gTasks[taskId].data[1]) gTasks[taskId].data[15]++; } break; case 4: default: spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; gSprites[spriteId].x2 = 0; DestroyAnimVisualTask(taskId); break; } } // Moves the mon's sprite back and forth in an unpredictable swaying motion. // No args. void AnimTask_TeeterDanceMovement(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[3] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[4] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1; task->data[6] = gSprites[task->data[3]].y; task->data[5] = gSprites[task->data[3]].x; task->data[9] = 0; task->data[11] = 0; task->data[10] = 1; task->data[12] = 0; task->func = AnimTask_TeeterDanceMovement_Step; } static void AnimTask_TeeterDanceMovement_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[11] += 8; task->data[11] &= 0xFF; gSprites[task->data[3]].x2 = gSineTable[task->data[11]] >> 5; task->data[9] += 2; task->data[9] &= 0xFF; gSprites[task->data[3]].x = (gSineTable[task->data[9]] >> 3) * task->data[4] + task->data[5]; if (task->data[9] == 0) { gSprites[task->data[3]].x = task->data[5]; task->data[0]++; } break; case 1: task->data[11] += 8; task->data[11] &= 0xFF; gSprites[task->data[3]].x2 = gSineTable[task->data[11]] >> 5; if (task->data[11] == 0) { gSprites[task->data[3]].x2 = 0; task->data[0]++; } break; case 2: DestroyAnimVisualTask(taskId); break; } } static void AnimKnockOffStrike_Step(struct Sprite *sprite) { // These two cases are identical. if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { sprite->data[1] += sprite->data[0]; sprite->data[1] &= 0xFF; } else { sprite->data[1] += sprite->data[0]; sprite->data[1] &= 0xFF; } sprite->x2 = Cos(sprite->data[1], 20); sprite->y2 = Sin(sprite->data[1], 20); if (sprite->animEnded) DestroyAnimSprite(sprite); sprite->data[2]++; } // Animates a strike that swipes downard at the target mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset static void AnimKnockOffStrike(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = -11; sprite->data[1] = 192; StartSpriteAffineAnim(sprite, 1); } else { sprite->data[0] = 11; sprite->data[1] = 192; sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } sprite->callback = AnimKnockOffStrike_Step; } // Gradually fades a rotating recyle arrow sprite in and back out. // No args. static void AnimRecycle(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP); if (sprite->y < 16) sprite->y = 16; sprite->data[6] = 0; sprite->data[7] = 16; sprite->callback = AnimRecycle_Step; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7])); } static void AnimRecycle_Step(struct Sprite *sprite) { switch (sprite->data[2]) { case 0: if (++sprite->data[0] > 1) { sprite->data[0] = 0; if (!(sprite->data[1] & 1)) { if (sprite->data[6] < 16) sprite->data[6]++; } else { if (sprite->data[7] != 0) sprite->data[7]--; } sprite->data[1]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7])); if (sprite->data[7] == 0) sprite->data[2]++; } break; case 1: if (++sprite->data[0] == 10) { sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2]++; } break; case 2: if (++sprite->data[0] > 1) { sprite->data[0] = 0; if (!(sprite->data[1] & 1)) { if (sprite->data[6] != 0) sprite->data[6]--; } else { if (sprite->data[7] < 16) sprite->data[7]++; } sprite->data[1]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7])); if (sprite->data[7] == 16) sprite->data[2]++; } break; case 3: DestroySpriteAndMatrix(sprite); break; } } void AnimTask_GetWeather(u8 taskId) { gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_NONE; if (gWeatherMoveAnim & B_WEATHER_SUN) gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SUN; else if (gWeatherMoveAnim & B_WEATHER_RAIN) gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_RAIN; else if (gWeatherMoveAnim & B_WEATHER_SANDSTORM) gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SANDSTORM; else if (gWeatherMoveAnim & B_WEATHER_HAIL) gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_HAIL; DestroyAnimVisualTask(taskId); } // Squishes the mon sprite vertically, and shakes it back and forth. // arg 0: which battler void AnimTask_SlackOffSquish(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[0] = 0; task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); PrepareAffineAnimInTaskData(task, task->data[15], sSlackOffSquishAffineAnimCmds); task->func = AnimTask_SlackOffSquish_Step; } static void AnimTask_SlackOffSquish_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; gTasks[taskId].data[0]++; if (gTasks[taskId].data[0] > 16 && gTasks[taskId].data[0] < 40) { if (++task->data[1] > 2) { task->data[1] = 0; task->data[2]++; if (!(task->data[2] & 1)) gSprites[task->data[15]].x2 = -1; else gSprites[task->data[15]].x2 = 1; } } else { gSprites[task->data[15]].x2 = 0; } if (!RunAffineAnimFromTaskData(&gTasks[taskId])) DestroyAnimVisualTask(taskId); } ================================================ FILE: src/battle_anim_electric.c ================================================ #include "global.h" #include "battle_anim.h" #include "trig.h" #include "sound.h" #include "constants/songs.h" static void AnimLightning(struct Sprite *sprite); static void AnimUnusedSpinningFist(struct Sprite *sprite); static void AnimUnusedCirclingShock(struct Sprite *sprite); static void AnimSparkElectricity(struct Sprite *sprite); static void AnimZapCannonSpark(struct Sprite *sprite); static void AnimThunderboltOrb(struct Sprite *sprite); static void AnimSparkElectricityFlashing(struct Sprite *sprite); static void AnimElectricity(struct Sprite *sprite); static void AnimElectricBoltSegment(struct Sprite *sprite); static void AnimThunderWave(struct Sprite *sprite); static void AnimGrowingChargeOrb(struct Sprite *sprite); static void AnimElectricPuff(struct Sprite *sprite); static void AnimVoltTackleOrbSlide(struct Sprite *sprite); static void AnimVoltTackleBolt(struct Sprite *sprite); static void AnimGrowingShockWaveOrb(struct Sprite *sprite); static void AnimShockWaveProgressingBolt(struct Sprite *sprite); static void AnimLightning_Step(struct Sprite *sprite); static void AnimUnusedSpinningFist_Step(struct Sprite *sprite); static void AnimZapCannonSpark_Step(struct Sprite *sprite); static void AnimSparkElectricityFlashing_Step(struct Sprite *sprite); static void AnimTask_ElectricBolt_Step(u8 taskId); static void AnimThunderWave_Step(struct Sprite *sprite); static void AnimTask_ElectricChargingParticles_Step(u8 taskId); static void AnimElectricChargingParticles(struct Sprite *sprite); static void AnimVoltTackleOrbSlide_Step(struct Sprite *sprite); static bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId); static bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId); static bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId); static void AnimShockWaveLightning(struct Sprite *sprite); static const union AnimCmd sAnim_Lightning[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(32, 8), ANIMCMD_FRAME(48, 5), ANIMCMD_FRAME(64, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_Lightning[] = { sAnim_Lightning, }; const struct SpriteTemplate gLightningSpriteTemplate = { .tileTag = ANIM_TAG_LIGHTNING, .paletteTag = ANIM_TAG_LIGHTNING, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_Lightning, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimLightning, }; static const union AffineAnimCmd sAffineAnim_UnusedSpinningFist[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 20), AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 60), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_UnusedSpinningFist[] = { sAffineAnim_UnusedSpinningFist, }; static const struct SpriteTemplate sUnusedSpinningFistSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_UnusedSpinningFist, .callback = AnimUnusedSpinningFist, }; static const union AnimCmd sAnim_UnusedCirclingShock[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(32, 5), ANIMCMD_FRAME(48, 5), ANIMCMD_FRAME(64, 5), ANIMCMD_FRAME(80, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_UnusedCirclingShock[] = { sAnim_UnusedCirclingShock, }; static const struct SpriteTemplate sUnusedCirclingShockSpriteTemplate = { .tileTag = ANIM_TAG_SHOCK, .paletteTag = ANIM_TAG_SHOCK, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_UnusedCirclingShock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimUnusedCirclingShock, }; const struct SpriteTemplate gSparkElectricitySpriteTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSparkElectricity, }; const struct SpriteTemplate gZapCannonBallSpriteTemplate = { .tileTag = ANIM_TAG_BLACK_BALL_2, .paletteTag = ANIM_TAG_BLACK_BALL_2, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation, }; static const union AffineAnimCmd sAffineAnim_FlashingSpark[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 20, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAffineAnims_FlashingSpark[] = { sAffineAnim_FlashingSpark, }; const struct SpriteTemplate gZapCannonSparkSpriteTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark, }; static const union AnimCmd sAnim_ThunderboltOrb[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(32, 6), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_ThunderboltOrb[] = { sAnim_ThunderboltOrb, }; static const union AffineAnimCmd sAffineAnim_ThunderboltOrb[] = { AFFINEANIMCMD_FRAME(0xE8, 0xE8, 0, 0), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 10), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 10), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sAffineAnims_ThunderboltOrb[] = { sAffineAnim_ThunderboltOrb, }; const struct SpriteTemplate gThunderboltOrbSpriteTemplate = { .tileTag = ANIM_TAG_SHOCK_3, .paletteTag = ANIM_TAG_SHOCK_3, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_ThunderboltOrb, .images = NULL, .affineAnims = sAffineAnims_ThunderboltOrb, .callback = AnimThunderboltOrb, }; const struct SpriteTemplate gSparkElectricityFlashingSpriteTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_FlashingSpark, .callback = AnimSparkElectricityFlashing, }; const struct SpriteTemplate gElectricitySpriteTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimElectricity, }; static const struct SpriteTemplate sElectricBoltSegmentSpriteTemplate = { .tileTag = ANIM_TAG_SPARK, .paletteTag = ANIM_TAG_SPARK, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimElectricBoltSegment, }; const struct SpriteTemplate gThunderWaveSpriteTemplate = { .tileTag = ANIM_TAG_SPARK_H, .paletteTag = ANIM_TAG_SPARK_H, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThunderWave, }; static const s8 sElectricChargingParticleCoordOffsets[][2] = { { 58, -60}, {-56, -36}, { 8, -56}, {-16, 56}, { 58, -10}, {-58, 10}, { 48, -18}, {-8, 56}, { 16, -56}, {-58, -42}, { 58, 30}, {-48, 40}, { 12, -48}, { 48, -12}, {-56, 18}, { 48, 48}, }; static const union AnimCmd sAnim_ElectricChargingParticles_0[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_FRAME(2, 1), ANIMCMD_FRAME(1, 1), ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_ElectricChargingParticles_1[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(1, 5), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(3, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_ElectricChargingParticles[] = { sAnim_ElectricChargingParticles_0, sAnim_ElectricChargingParticles_1, }; static const struct SpriteTemplate gElectricChargingParticlesSpriteTemplate = { .tileTag = ANIM_TAG_ELECTRIC_ORBS, .paletteTag = ANIM_TAG_ELECTRIC_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_ElectricChargingParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_0[] = { AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 60), AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(-0x4, -0x4, 0, 5), AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 5), AFFINEANIMCMD_LOOP(10), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_1[] = { AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 30), AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-0x4, -0x4, 0, 5), AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 5), AFFINEANIMCMD_JUMP(3), }; static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_2[] = { AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 30), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 30), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_GrowingElectricOrb[] = { sAffineAnim_GrowingElectricOrb_0, sAffineAnim_GrowingElectricOrb_1, sAffineAnim_GrowingElectricOrb_2, }; const struct SpriteTemplate gGrowingChargeOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb, }; static const union AnimCmd sAnim_ElectricPuff[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_END, }; static const union AnimCmd *const sAnims_ElectricPuff[] = { sAnim_ElectricPuff, }; const struct SpriteTemplate gElectricPuffSpriteTemplate = { .tileTag = ANIM_TAG_ELECTRICITY, .paletteTag = ANIM_TAG_ELECTRICITY, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_ElectricPuff, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimElectricPuff, }; const struct SpriteTemplate gVoltTackleOrbSlideSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_GrowingElectricOrb, .callback = AnimVoltTackleOrbSlide, }; static const union AnimCmd sAnim_VoltTackleBolt_0[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_END, }; static const union AnimCmd sAnim_VoltTackleBolt_1[] = { ANIMCMD_FRAME(2, 3), ANIMCMD_END, }; static const union AnimCmd sAnim_VoltTackleBolt_2[] = { ANIMCMD_FRAME(4, 3), ANIMCMD_END, }; static const union AnimCmd sAnim_VoltTackleBolt_3[] = { ANIMCMD_FRAME(6, 3), ANIMCMD_END, }; static const union AnimCmd *const sAnims_VoltTackleBolt[] = { sAnim_VoltTackleBolt_0, sAnim_VoltTackleBolt_1, sAnim_VoltTackleBolt_2, sAnim_VoltTackleBolt_3, }; static const union AffineAnimCmd sAffineAnim_VoltTackleBolt[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_VoltTackleBolt[] = { sAffineAnim_VoltTackleBolt, }; static const struct SpriteTemplate gVoltTackleBoltSpriteTemplate = { .tileTag = ANIM_TAG_SPARK, .paletteTag = ANIM_TAG_SPARK, .oam = &gOamData_AffineDouble_ObjNormal_8x16, .anims = sAnims_VoltTackleBolt, .images = NULL, .affineAnims = sAffineAnims_VoltTackleBolt, .callback = AnimVoltTackleBolt, }; const struct SpriteTemplate gGrowingShockWaveOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_GrowingElectricOrb, .callback = AnimGrowingShockWaveOrb, }; static const struct SpriteTemplate sShockWaveProgressingBoltSpriteTemplate = { .tileTag = ANIM_TAG_SPARK, .paletteTag = ANIM_TAG_SPARK, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimShockWaveProgressingBolt, }; static void AnimLightning(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->callback = AnimLightning_Step; } static void AnimLightning_Step(struct Sprite *sprite) { if (sprite->animEnded) DestroyAnimSprite(sprite); } static void AnimUnusedSpinningFist(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->callback = AnimUnusedSpinningFist_Step; } static void AnimUnusedSpinningFist_Step(struct Sprite *sprite) { if (sprite->affineAnimEnded) DestroySpriteAndMatrix(sprite); } static void AnimUnusedCirclingShock(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[0]; sprite->y -= gBattleAnimArgs[1]; } else { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } sprite->data[0] = 0; sprite->data[1] = gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[4]; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteInCircle; } static void AnimSparkElectricity(struct Sprite *sprite) { u8 battler; u32 matrixNum; s16 sineVal; switch (gBattleAnimArgs[4]) { case ANIM_ATTACKER: battler = gBattleAnimAttacker; break; case ANIM_TARGET: default: battler = gBattleAnimTarget; break; case ANIM_ATK_PARTNER: if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) battler = gBattleAnimAttacker; else battler = BATTLE_PARTNER(gBattleAnimAttacker); break; case ANIM_DEF_PARTNER: if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) battler = BATTLE_PARTNER(gBattleAnimTarget); else battler = gBattleAnimTarget; break; } if (gBattleAnimArgs[5] == 0) { sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y); } else { sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET); } sprite->x2 = (gSineTable[gBattleAnimArgs[0]] * gBattleAnimArgs[1]) >> 8; sprite->y2 = (gSineTable[gBattleAnimArgs[0] + 64] * gBattleAnimArgs[1]) >> 8; if (gBattleAnimArgs[6] & 1) sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1; matrixNum = sprite->oam.matrixNum; sineVal = gSineTable[gBattleAnimArgs[2]]; gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[gBattleAnimArgs[2] + 64]; gOamMatrices[matrixNum].b = sineVal; gOamMatrices[matrixNum].c = -sineVal; sprite->data[0] = gBattleAnimArgs[3]; sprite->callback = DestroyAnimSpriteAfterTimer; } static void AnimZapCannonSpark(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[2]; sprite->data[6] = gBattleAnimArgs[5]; sprite->data[7] = gBattleAnimArgs[4]; sprite->oam.tileNum += gBattleAnimArgs[6] * 4; sprite->callback = AnimZapCannonSpark_Step; sprite->callback(sprite); } static void AnimZapCannonSpark_Step(struct Sprite *sprite) { if (!AnimTranslateLinear(sprite)) { sprite->x2 += Sin(sprite->data[7], sprite->data[5]); sprite->y2 += Cos(sprite->data[7], sprite->data[5]); sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF; if(!(sprite->data[7] % 3)) sprite->invisible ^= 1; } else { DestroyAnimSprite(sprite); } } static void AnimThunderboltOrb_Step(struct Sprite *sprite) { if (--sprite->data[5] == -1) { sprite->invisible ^= 1; sprite->data[5] = sprite->data[4]; } if (sprite->data[3]-- <= 0) DestroyAnimSprite(sprite); } static void AnimThunderboltOrb(struct Sprite *sprite) { if (IsContest() || GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; sprite->data[3] = gBattleAnimArgs[0]; sprite->data[4] = gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = AnimThunderboltOrb_Step; } static void AnimSparkElectricityFlashing(struct Sprite *sprite) { u8 battler; sprite->data[0] = gBattleAnimArgs[3]; if (gBattleAnimArgs[7] & 0x8000) battler = gBattleAnimTarget; else battler = gBattleAnimAttacker; if (IsContest() || GetBattlerSide(battler) == B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; sprite->data[4] = gBattleAnimArgs[7] & 0x7FFF; sprite->data[5] = gBattleAnimArgs[2]; sprite->data[6] = gBattleAnimArgs[5]; sprite->data[7] = gBattleAnimArgs[4]; sprite->oam.tileNum += gBattleAnimArgs[6] * 4; sprite->callback = AnimSparkElectricityFlashing_Step; sprite->callback(sprite); } static void AnimSparkElectricityFlashing_Step(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[7], sprite->data[5]); sprite->y2 = Cos(sprite->data[7], sprite->data[5]); sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF; if (sprite->data[7] % sprite->data[4] == 0) sprite->invisible ^= 1; if (sprite->data[0]-- <= 0) DestroyAnimSprite(sprite); } // Electricity arcs around the target. Used for Paralysis and various electric move hits static void AnimElectricity(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, FALSE); sprite->oam.tileNum += gBattleAnimArgs[3] * 4; if (gBattleAnimArgs[3] == 1) sprite->oam.matrixNum = ST_OAM_HFLIP; else if (gBattleAnimArgs[3] == 2) sprite->oam.matrixNum = ST_OAM_VFLIP; sprite->data[0] = gBattleAnimArgs[2]; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // The vertical falling thunder bolt used in Thunder Wave/Shock/Bolt void AnimTask_ElectricBolt(u8 taskId) { gTasks[taskId].data[0] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[0]; gTasks[taskId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].func = AnimTask_ElectricBolt_Step; } static void AnimTask_ElectricBolt_Step(u8 taskId) { u16 r8; u16 r2; s16 r12; u8 spriteId = 0; u8 r7 = 0; u8 sp = gTasks[taskId].data[2]; s16 x = gTasks[taskId].data[0]; s16 y = gTasks[taskId].data[1]; if (!gTasks[taskId].data[2]) { r8 = 0; r2 = 1; r12 = 16; } else { r12 = 16; r8 = 8; r2 = 4; } switch (gTasks[taskId].data[10]) { case 0: r12 *= 1; spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2); ++r7; break; case 2: r12 *= 2; r8 += r2; spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2); ++r7; break; case 4: r12 *= 3; r8 += r2 * 2; spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2); ++r7; break; case 6: r12 *= 4; r8 += r2 * 3; spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2); ++r7; break; case 8: r12 *= 5; spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2); ++r7; break; case 10: DestroyAnimVisualTask(taskId); return; } if (r7) { gSprites[spriteId].oam.tileNum += r8; gSprites[spriteId].data[0] = sp; gSprites[spriteId].callback(&gSprites[spriteId]); } ++gTasks[taskId].data[10]; } static void AnimElectricBoltSegment(struct Sprite *sprite) { if (!sprite->data[0]) { sprite->oam.shape = SPRITE_SHAPE(8x16); sprite->oam.size = SPRITE_SIZE(8x16); } else { sprite->oam.shape = SPRITE_SHAPE(16x16); sprite->oam.size = SPRITE_SIZE(16x16); } if (++sprite->data[1] == 15) DestroySprite(sprite); } // The horizontal bands of electricity used in Thunder Wave static void AnimThunderWave(struct Sprite *sprite) { u8 spriteId; sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; spriteId = CreateSprite(&gThunderWaveSpriteTemplate, sprite->x + 32, sprite->y, sprite->subpriority); gSprites[spriteId].oam.tileNum += 8; ++gAnimVisualTaskCount; gSprites[spriteId].callback = AnimThunderWave_Step; sprite->callback = AnimThunderWave_Step; } static void AnimThunderWave_Step(struct Sprite *sprite) { if (++sprite->data[0] == 3) { sprite->data[0] = 0; sprite->invisible ^= 1; } if (++sprite->data[1] == 51) DestroyAnimSprite(sprite); } // Animates small electric orbs moving from around the battler inward. For Charge/Shock Wave void AnimTask_ElectricChargingParticles(u8 taskId) { struct Task *task = &gTasks[taskId]; if (!gBattleAnimArgs[0]) { task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[15] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } else { task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); task->data[15] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } task->data[6] = gBattleAnimArgs[1]; task->data[7] = 0; task->data[8] = 0; task->data[9] = 0; task->data[10] = 0; task->data[11] = gBattleAnimArgs[3]; task->data[12] = 0; task->data[13] = gBattleAnimArgs[2]; task->func = AnimTask_ElectricChargingParticles_Step; } static void AnimTask_ElectricChargingParticles_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; if (task->data[6]) { if (++task->data[12] > task->data[13]) { u8 spriteId; task->data[12] = 0; spriteId = CreateSprite(&gElectricChargingParticlesSpriteTemplate, task->data[14], task->data[15], 2); if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; sprite->x += sElectricChargingParticleCoordOffsets[task->data[9]][0]; sprite->y += sElectricChargingParticleCoordOffsets[task->data[9]][1]; sprite->data[0] = 40 - task->data[8] * 5; sprite->data[1] = sprite->x; sprite->data[2] = task->data[14]; sprite->data[3] = sprite->y; sprite->data[4] = task->data[15]; sprite->data[5] = taskId; InitAnimLinearTranslation(sprite); StoreSpriteCallbackInData6(sprite, AnimElectricChargingParticles); sprite->callback = RunStoredCallbackWhenAnimEnds; if (++task->data[9] > 15) task->data[9] = 0; if (++task->data[10] >= task->data[11]) { task->data[10] = 0; if (task->data[8] <= 5) ++task->data[8]; } ++task->data[7]; --task->data[6]; } } } else if(task->data[7] == 0) { DestroyAnimVisualTask(taskId); } } static void AnimElectricChargingParticles_Step(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) { --gTasks[sprite->data[5]].data[7]; DestroySprite(sprite); } } static void AnimElectricChargingParticles(struct Sprite *sprite) { StartSpriteAnim(sprite, 1); sprite->callback = AnimElectricChargingParticles_Step; } static void AnimGrowingChargeOrb(struct Sprite *sprite) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } // The quick electric burst at the end of Charge / during the Volt Tackle hit static void AnimElectricPuff(struct Sprite *sprite) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } sprite->x2 = gBattleAnimArgs[1]; sprite->y2 = gBattleAnimArgs[2]; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = RunStoredCallbackWhenAnimEnds; } // Creates an orb of electricity that grows then slides off-screen. The attacker slides with it static void AnimVoltTackleOrbSlide(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, 1); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[6] = GetAnimBattlerSpriteId(ANIM_ATTACKER); sprite->data[7] = 16; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) sprite->data[7] *= -1; sprite->callback = AnimVoltTackleOrbSlide_Step; } static void AnimVoltTackleOrbSlide_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: if (++sprite->data[1] > 40) ++sprite->data[0]; break; case 1: sprite->x += sprite->data[7]; gSprites[sprite->data[6]].x2 += sprite->data[7]; if ((u16)(sprite->x + 80) > 400) DestroySpriteAndMatrix(sprite); break; } } void AnimTask_VoltTackleAttackerReappear(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { task->data[14] = -32; task->data[13] = 2; } else { task->data[14] = 32; task->data[13] = -2; } gSprites[task->data[15]].x2 = task->data[14]; ++task->data[0]; break; case 1: if (++task->data[1] > 1) { task->data[1] = 0; gSprites[task->data[15]].invisible ^= 1; if (task->data[14]) { task->data[14] += task->data[13]; gSprites[task->data[15]].x2 = task->data[14]; } else { ++task->data[0]; } } break; case 2: if (++task->data[1] > 1) { task->data[1] = 0; gSprites[task->data[15]].invisible ^= 1; if (++task->data[2] == 8) ++task->data[0]; } break; case 3: gSprites[task->data[15]].invisible = FALSE; DestroyAnimVisualTask(taskId); break; } } // The horizontal bolts of electricity for Volt Tackle void AnimTask_VoltTackleBolt(u8 taskId) { struct Task *task = &gTasks[taskId]; switch(task->data[0]) { case 0: task->data[1] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1; switch (gBattleAnimArgs[0]) { case 0: task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[5] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); task->data[4] = (task->data[1] * 128) + 120; break; case 4: task->data[3] = 120 - (task->data[1] * 128); task->data[5] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); task->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) - (task->data[1] * 32); break; default: if ((gBattleAnimArgs[0] & 1) != 0) { task->data[3] = 256; task->data[4] = -16; } else { task->data[3] = -16; task->data[4] = 256; } if (task->data[1] == 1) { task->data[5] = 80 - gBattleAnimArgs[0] * 10; } else { u16 temp; task->data[5] = gBattleAnimArgs[0] * 10 + 40; temp = task->data[3]; task->data[3] = task->data[4]; task->data[4] = temp; } } if (task->data[3] < task->data[4]) { task->data[1] = 1; task->data[6] = 0; } else { task->data[1] = -1; task->data[6] = 3; } ++task->data[0]; break; case 1: if (++task->data[2] > 0) { task->data[2] = 0; if (CreateVoltTackleBolt(task, taskId) || CreateVoltTackleBolt(task, taskId)) ++task->data[0]; } break; case 2: if (task->data[7] == 0) DestroyAnimVisualTask(taskId); break; } } static bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId) { u8 spriteId = CreateSprite(&gVoltTackleBoltSpriteTemplate, task->data[3], task->data[5], 35); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 7; ++task->data[7]; } task->data[6] += task->data[1]; if (task->data[6] < 0) task->data[6] = 3; if (task->data[6] > 3) task->data[6] = 0; task->data[3] += task->data[1] * 16; if ((task->data[1] == 1 && task->data[3] >= task->data[4]) || (task->data[1] == -1 && task->data[3] <= task->data[4])) return TRUE; else return FALSE; } static void AnimVoltTackleBolt(struct Sprite *sprite) { if (++sprite->data[0] > 12) { --gTasks[sprite->data[6]].data[sprite->data[7]]; FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } } static void AnimGrowingShockWaveOrb(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); StartSpriteAffineAnim(sprite, 2); ++sprite->data[0]; break; case 1: if (sprite->affineAnimEnded) DestroySpriteAndMatrix(sprite); break; } } void AnimTask_ShockWaveProgressingBolt(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[6] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); task->data[8] = 4; task->data[10] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); task->data[9] = (task->data[10] - task->data[6]) / 5; task->data[4] = 7; task->data[5] = -1; task->data[11] = 12; task->data[12] = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER); task->data[13] = BattleAnimAdjustPanning(SOUND_PAN_TARGET); task->data[14] = task->data[12]; task->data[15] = (task->data[13] - task->data[12]) / 3; ++task->data[0]; break; case 1: if (++task->data[1] > 0) { task->data[1] = 0; if (CreateShockWaveBoltSprite(task, taskId)) { if (task->data[2] == 5) task->data[0] = 3; else ++task->data[0]; } } if (task->data[11]) --task->data[11]; break; case 2: if (task->data[11]) --task->data[11]; if (++task->data[1] > 4) { task->data[1] = 0; if (task->data[2] & 1) { task->data[7] = 4; task->data[8] = 68; task->data[4] = 0; task->data[5] = 1; } else { task->data[7] = 68; task->data[8] = 4; task->data[4] = 7; task->data[5] = -1; } if (task->data[11]) task->data[0] = 4; else task->data[0] = 1; } break; case 3: if (task->data[3] == 0) DestroyAnimVisualTask(taskId); break; case 4: if (task->data[11]) --task->data[11]; else task->data[0] = 1; break; } } static bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId) { u8 spriteId = CreateSprite(&sShockWaveProgressingBoltSpriteTemplate, task->data[6], task->data[7], 35); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.tileNum += task->data[4]; task->data[4] += task->data[5]; if (task->data[4] < 0) task->data[4] = 7; if (task->data[4] > 7) task->data[4] = 0; gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 3; ++task->data[3]; } if (task->data[4] == 0 && task->data[5] > 0) { task->data[14] += task->data[15]; PlaySE12WithPanning(SE_M_THUNDERBOLT, task->data[14]); } if ((task->data[5] < 0 && task->data[7] <= task->data[8]) || (task->data[5] > 0 && task->data[7] >= task->data[8])) { ++task->data[2]; task->data[6] += task->data[9]; return TRUE; } else { task->data[7] += task->data[5] * 8; return FALSE; } } // Just runs timer for sprite. See AnimTask_ShockWaveProgressingBolt static void AnimShockWaveProgressingBolt(struct Sprite *sprite) { if (++sprite->data[0] > 12) { --gTasks[sprite->data[6]].data[sprite->data[7]]; DestroySprite(sprite); } } void AnimTask_ShockWaveLightning(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[15] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 32; task->data[14] = task->data[15]; while (task->data[14] > 16) task->data[14] -= 32; task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); task->data[12] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2; ++task->data[0]; break; case 1: if (++task->data[1] > 1) { task->data[1] = 0; if (CreateShockWaveLightningSprite(task, taskId)) ++task->data[0]; } break; case 2: if (task->data[10] == 0) DestroyAnimVisualTask(taskId); break; } } static bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId) { u8 spriteId = CreateSprite(&gLightningSpriteTemplate, task->data[13], task->data[14], task->data[12]); if (spriteId != MAX_SPRITES) { gSprites[spriteId].callback = AnimShockWaveLightning; gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 10; ++task->data[10]; } if (task->data[14] >= task->data[15]) return TRUE; task->data[14] += 32; return FALSE; } static void AnimShockWaveLightning(struct Sprite *sprite) { if (sprite->animEnded) { --gTasks[sprite->data[6]].data[sprite->data[7]]; DestroySprite(sprite); } } ================================================ FILE: src/battle_anim_fight.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "random.h" #include "task.h" #include "trig.h" static void AnimUnusedHumanoidFoot(struct Sprite *sprite); static void AnimSlideHandOrFootToTarget(struct Sprite *sprite); static void AnimJumpKick(struct Sprite *sprite); static void AnimBasicFistOrFoot(struct Sprite *sprite); static void AnimFistOrFootRandomPos(struct Sprite *sprite); static void AnimCrossChopHand(struct Sprite *sprite); static void AnimSlidingKick(struct Sprite *sprite); static void AnimSpinningKickOrPunch(struct Sprite *sprite); static void AnimStompFoot(struct Sprite *sprite); static void AnimDizzyPunchDuck(struct Sprite *sprite); static void AnimBrickBreakWall(struct Sprite *sprite); static void AnimBrickBreakWallShard(struct Sprite *sprite); static void AnimSuperpowerOrb(struct Sprite *sprite); static void AnimSuperpowerRock(struct Sprite *sprite); static void AnimSuperpowerFireball(struct Sprite *sprite); static void AnimArmThrustHit(struct Sprite *sprite); static void AnimRevengeScratch(struct Sprite *sprite); static void AnimFocusPunchFist(struct Sprite *sprite); static void AnimFistOrFootRandomPos_Step(struct Sprite *sprite); static void AnimCrossChopHand_Step(struct Sprite *sprite); static void AnimSlidingKick_Step(struct Sprite *sprite); static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite); static void AnimStompFootStep(struct Sprite *sprite); static void AnimStompFootEnd(struct Sprite *sprite); static void AnimBrickBreakWall_Step(struct Sprite *sprite); static void AnimBrickBreakWallShard_Step(struct Sprite *sprite); static void AnimSuperpowerOrb_Step(struct Sprite *sprite); static void AnimSuperpowerRock_Step1(struct Sprite *sprite); static void AnimSuperpowerRock_Step2(struct Sprite *sprite); static const struct SpriteTemplate sUnusedHumanoidFootSpriteTemplate = { .tileTag = ANIM_TAG_HUMANOID_FOOT, .paletteTag = ANIM_TAG_HUMANOID_FOOT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimUnusedHumanoidFoot, }; static const union AnimCmd sAnim_Fist[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_FootWide[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_FootTall[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_HandLeft[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_HandRight[] = { ANIMCMD_FRAME(48, 1, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_HandsAndFeet[] = { sAnim_Fist, sAnim_FootWide, sAnim_FootTall, sAnim_HandLeft, sAnim_HandRight, }; const struct SpriteTemplate gKarateChopSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSlideHandOrFootToTarget, }; const struct SpriteTemplate gJumpKickSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimJumpKick, }; const struct SpriteTemplate gFistFootSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBasicFistOrFoot, }; const struct SpriteTemplate gFistFootRandomPosSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFistOrFootRandomPos, }; const struct SpriteTemplate gCrossChopHandSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = &sAnims_HandsAndFeet[3], .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCrossChopHand, }; const struct SpriteTemplate gSlidingKickSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = &sAnims_HandsAndFeet[1], .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSlidingKick, }; static const union AffineAnimCmd sAffineAnim_SpinningHandOrFoot[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-0x8, -0x8, 20, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sAffineAnims_SpinningHandOrFoot[] = { sAffineAnim_SpinningHandOrFoot, }; // Blaze Kick / Meteor Mash const struct SpriteTemplate gSpinningHandOrFootSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = sAffineAnims_SpinningHandOrFoot, .callback = AnimSpinningKickOrPunch, }; static const union AffineAnimCmd sAffineAnim_MegaPunchKick[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-0x4, -0x4, 20, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sAffineAnims_MegaPunchKick[] = { sAffineAnim_MegaPunchKick, }; const struct SpriteTemplate gMegaPunchKickSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = sAffineAnims_MegaPunchKick, .callback = AnimSpinningKickOrPunch, }; const struct SpriteTemplate gStompFootSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = &sAnims_HandsAndFeet[1], .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimStompFoot, }; const struct SpriteTemplate gDizzyPunchDuckSpriteTemplate = { .tileTag = ANIM_TAG_DUCK, .paletteTag = ANIM_TAG_DUCK, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDizzyPunchDuck, }; const struct SpriteTemplate gBrickBreakWallSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_LIGHT_WALL, .paletteTag = ANIM_TAG_BLUE_LIGHT_WALL, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBrickBreakWall, }; const struct SpriteTemplate gBrickBreakWallShardSpriteTemplate = { .tileTag = ANIM_TAG_TORN_METAL, .paletteTag = ANIM_TAG_TORN_METAL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBrickBreakWallShard, }; static const union AffineAnimCmd sAffineAnim_SuperpowerOrb[] = { AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 0), AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 64), AFFINEANIMCMD_FRAME(-0x6, -0x6, 0, 8), AFFINEANIMCMD_FRAME(0x6, 0x6, 0, 8), AFFINEANIMCMD_JUMP(2), }; static const union AffineAnimCmd *const sAffineAnims_SuperpowerOrb[] = { sAffineAnim_SuperpowerOrb, }; const struct SpriteTemplate gSuperpowerOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_SuperpowerOrb, .callback = AnimSuperpowerOrb, }; const struct SpriteTemplate gSuperpowerRockSpriteTemplate = { .tileTag = ANIM_TAG_FLAT_ROCK, .paletteTag = ANIM_TAG_FLAT_ROCK, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSuperpowerRock, }; const struct SpriteTemplate gSuperpowerFireballSpriteTemplate = { .tileTag = ANIM_TAG_METEOR, .paletteTag = ANIM_TAG_METEOR, .oam = &gOamData_AffineOff_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSuperpowerFireball, }; const struct SpriteTemplate gArmThrustHandSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimArmThrustHit, }; static const union AnimCmd sAnim_RevengeSmallScratch_0[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_RevengeSmallScratch_1[] = { ANIMCMD_FRAME(0, 4, .vFlip = TRUE), ANIMCMD_FRAME(16, 4, .vFlip = TRUE), ANIMCMD_FRAME(32, 4, .vFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_RevengeSmallScratch_2[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(16, 4, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_RevengeSmallScratch[] = { sAnim_RevengeSmallScratch_0, sAnim_RevengeSmallScratch_1, sAnim_RevengeSmallScratch_2, }; const struct SpriteTemplate gRevengeSmallScratchSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_SCRATCH, .paletteTag = ANIM_TAG_PURPLE_SCRATCH, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_RevengeSmallScratch, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRevengeScratch, }; static const union AnimCmd sAnim_RevengeBigScratch_0[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(64, 6), ANIMCMD_END, }; static const union AnimCmd sAnim_RevengeBigScratch_1[] = { ANIMCMD_FRAME(0, 6, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(64, 6, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_RevengeBigScratch_2[] = { ANIMCMD_FRAME(0, 6, .hFlip = TRUE), ANIMCMD_FRAME(64, 6, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_RevengeBigScratch[] = { sAnim_RevengeBigScratch_0, sAnim_RevengeBigScratch_1, sAnim_RevengeBigScratch_2, }; const struct SpriteTemplate gRevengeBigScratchSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_SWIPE, .paletteTag = ANIM_TAG_PURPLE_SWIPE, .oam = &gOamData_AffineOff_ObjNormal_64x64, .anims = sAnims_RevengeBigScratch, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRevengeScratch, }; static const union AffineAnimCmd sAffineAnim_FocusPunchFist[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_FRAME(-0x20, -0x20, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_FocusPunchFist[] = { sAffineAnim_FocusPunchFist, }; const struct SpriteTemplate gFocusPunchFistSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = sAffineAnims_FocusPunchFist, .callback = AnimFocusPunchFist, }; static void AnimUnusedHumanoidFoot(struct Sprite *sprite) { SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; sprite->data[0] = 15; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimSlideHandOrFootToTarget(struct Sprite *sprite) { if (gBattleAnimArgs[7] == 1 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; } StartSpriteAnim(sprite, gBattleAnimArgs[6]); gBattleAnimArgs[6] = 0; AnimTravelDiagonally(sprite); } static void AnimJumpKick(struct Sprite *sprite) { if (IsContest()) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; } AnimSlideHandOrFootToTarget(sprite); } // Displays a basic fist or foot sprite for a given duration. // Used by many fighting moves (and elemental "punch" moves). // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration // arg 3: ? (todo: related to initial pixel offsets) // arg 4: anim num static void AnimBasicFistOrFoot(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); if (gBattleAnimArgs[3] == 0) InitSpritePosToAnimAttacker(sprite, 1); else InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimFistOrFootRandomPos(struct Sprite *sprite) { u8 battler; s16 xMod, yMod; s16 x, y; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; if (gBattleAnimArgs[2] < 0) gBattleAnimArgs[2] = Random() % 5; StartSpriteAnim(sprite, gBattleAnimArgs[2]); sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET); xMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 2; yMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4; x = Random() % xMod; y = Random() % yMod; if (Random() & 1) x *= -1; if (Random() & 1) y *= -1; if ((gBattlerPositions[battler] & BIT_SIDE) == B_SIDE_PLAYER) y += 0xFFF0; sprite->x += x; sprite->y += y; sprite->data[0] = gBattleAnimArgs[1]; sprite->data[7] = CreateSprite(&gBasicHitSplatSpriteTemplate, sprite->x, sprite->y, sprite->subpriority + 1); if (sprite->data[7] != MAX_SPRITES) { StartSpriteAffineAnim(&gSprites[sprite->data[7]], 0); gSprites[sprite->data[7]].callback = SpriteCallbackDummy; } sprite->callback = AnimFistOrFootRandomPos_Step; } static void AnimFistOrFootRandomPos_Step(struct Sprite *sprite) { if (sprite->data[0] == 0) { if (sprite->data[7] != MAX_SPRITES) { FreeOamMatrix(gSprites[sprite->data[7]].oam.matrixNum); DestroySprite(&gSprites[sprite->data[7]]); } DestroyAnimSprite(sprite); } else { --sprite->data[0]; } } static void AnimCrossChopHand(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = 30; if (gBattleAnimArgs[2] == 0) { sprite->data[2] = sprite->x - 20; } else { sprite->data[2] = sprite->x + 20; sprite->hFlip = 1; } sprite->data[4] = sprite->y - 20; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, AnimCrossChopHand_Step); } static void AnimCrossChopHand_Step(struct Sprite *sprite) { if (++sprite->data[5] == 11) { sprite->data[2] = sprite->x - sprite->x2; sprite->data[4] = sprite->y - sprite->y2; sprite->data[0] = 8; sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } } // Rolling Kick / Low Kick static void AnimSlidingKick(struct Sprite *sprite) { if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget && GetBattlerPosition(gBattleAnimTarget) < B_POSITION_PLAYER_RIGHT) gBattleAnimArgs[0] *= -1; InitSpritePosToAnimTarget(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = sprite->x; sprite->data[2] = sprite->x + gBattleAnimArgs[2]; sprite->data[3] = sprite->y; sprite->data[4] = sprite->y; InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[5]; sprite->data[6] = gBattleAnimArgs[4]; sprite->data[7] = 0; sprite->callback = AnimSlidingKick_Step; } static void AnimSlidingKick_Step(struct Sprite *sprite) { if (!AnimTranslateLinear(sprite)) { sprite->y2 += Sin(sprite->data[7] >> 8, sprite->data[5]); sprite->data[7] += sprite->data[6]; } else { DestroyAnimSprite(sprite); } } // Animates the spinning, shrinking kick or punch, which then // reappears at full size. Used by moves such as MOVE_MEGA_PUNCH and MOVE_MEGA_KICK. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: anim num // arg 3: spin duration static void AnimSpinningKickOrPunch(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); StartSpriteAnim(sprite, gBattleAnimArgs[2]); sprite->data[0] = gBattleAnimArgs[3]; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimSpinningKickOrPunchFinish); } static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, 0); sprite->affineAnimPaused = 1; sprite->data[0] = 20; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Animates MOVE_STOMP's foot that slides downward. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: initial wait duration static void AnimStompFoot(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->callback = AnimStompFootStep; } static void AnimStompFootStep(struct Sprite *sprite) { if (--sprite->data[0] == -1) { sprite->data[0] = 6; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, AnimStompFootEnd); } } static void AnimStompFootEnd(struct Sprite *sprite) { sprite->data[0] = 15; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimDizzyPunchDuck(struct Sprite *sprite) { if (sprite->data[0] == 0) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[1] = gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[3]; ++sprite->data[0]; } else { sprite->data[4] += sprite->data[1]; sprite->x2 = sprite->data[4] >> 8; sprite->y2 = Sin(sprite->data[3], sprite->data[2]); sprite->data[3] = (sprite->data[3] + 3) & 0xFF; if (sprite->data[3] > 100) sprite->invisible = sprite->data[3] % 2; if (sprite->data[3] > 120) DestroyAnimSprite(sprite); } } // The wall that appears when Brick Break is going to shatter the target's defensive wall static void AnimBrickBreakWall(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); } sprite->x += gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[2]; sprite->data[0] = 0; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[4]; sprite->data[3] = 0; sprite->callback = AnimBrickBreakWall_Step; } static void AnimBrickBreakWall_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: if (--sprite->data[1] == 0) { if (sprite->data[2] == 0) DestroyAnimSprite(sprite); else ++sprite->data[0]; } break; case 1: if (++sprite->data[1] > 1) { sprite->data[1] = 0; ++sprite->data[3]; if (sprite->data[3] & 1) sprite->x2 = 2; else sprite->x2 = -2; } if (--sprite->data[2] == 0) DestroyAnimSprite(sprite); break; } } // Piece of shattered defensive wall flies off. Used by Brick Break when the target has a defensive wall static void AnimBrickBreakWallShard(struct Sprite *sprite) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[2]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[3]; } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3]; } sprite->oam.tileNum += gBattleAnimArgs[1] * 16; sprite->data[0] = 0; switch (gBattleAnimArgs[1]) { case 0: sprite->data[6] = -3; sprite->data[7] = -3; break; case 1: sprite->data[6] = 3; sprite->data[7] = -3; break; case 2: sprite->data[6] = -3; sprite->data[7] = 3; break; case 3: sprite->data[6] = 3; sprite->data[7] = 3; break; default: DestroyAnimSprite(sprite); return; } sprite->callback = AnimBrickBreakWallShard_Step; } static void AnimBrickBreakWallShard_Step(struct Sprite *sprite) { sprite->x += sprite->data[6]; sprite->y += sprite->data[7]; if (++sprite->data[0] > 40) DestroyAnimSprite(sprite); } static void AnimSuperpowerOrb(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); sprite->data[7] = gBattleAnimTarget; } else { sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); sprite->data[7] = gBattleAnimAttacker; } sprite->data[0] = 0; sprite->data[1] = 12; sprite->data[2] = 8; sprite->callback = AnimSuperpowerOrb_Step; } static void AnimSuperpowerOrb_Step(struct Sprite *sprite) { if (++sprite->data[0] == 180) { SetGpuReg(REG_OFFSET_BLDCNT, 0); sprite->data[0] = 16; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = AnimTranslateLinear_WithFollowup; } } // Floating rock that flies off to hit the target. Used by Superpower static void AnimSuperpowerRock(struct Sprite *sprite) { sprite->x = gBattleAnimArgs[0]; sprite->y = 120; sprite->data[0] = gBattleAnimArgs[3]; StorePointerInVars(&sprite->data[4], &sprite->data[5], (void *)(sprite->y << 8)); sprite->data[6] = gBattleAnimArgs[1]; sprite->oam.tileNum += gBattleAnimArgs[2] * 4; sprite->callback = AnimSuperpowerRock_Step1; } static void AnimSuperpowerRock_Step1(struct Sprite *sprite) { void *var0; if (sprite->data[0] != 0) { var0 = LoadPointerFromVars(sprite->data[4], sprite->data[5]); var0 -= sprite->data[6]; StorePointerInVars(&sprite->data[4], &sprite->data[5], var0); var0 = (void *)(((intptr_t)var0) >> 8); sprite->y = (intptr_t)var0; if (sprite->y < -8) DestroyAnimSprite(sprite); else --sprite->data[0]; } else { s16 pos0 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); s16 pos1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); s16 pos2 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); s16 pos3 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = pos2 - pos0; sprite->data[1] = pos3 - pos1; sprite->data[2] = sprite->x << 4; sprite->data[3] = sprite->y << 4; sprite->callback = AnimSuperpowerRock_Step2; } } static void AnimSuperpowerRock_Step2(struct Sprite *sprite) { u16 edgeX; sprite->data[2] += sprite->data[0]; sprite->data[3] += sprite->data[1]; sprite->x = sprite->data[2] >> 4; sprite->y = sprite->data[3] >> 4; edgeX = sprite->x + 8; if (edgeX > 256 || sprite->y < -8 || sprite->y > 120) DestroyAnimSprite(sprite); } static void AnimSuperpowerFireball(struct Sprite *sprite) { u8 battler; if (gBattleAnimArgs[0] == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_Y_PIC_OFFSET); battler = gBattleAnimTarget; sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); } else { battler = gBattleAnimAttacker; sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); } if (IsContest()) sprite->oam.matrixNum |= ST_OAM_HFLIP; else if (GetBattlerSide(battler) == B_SIDE_PLAYER) sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP); sprite->data[0] = 16; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = AnimTranslateLinear_WithFollowup; } static void AnimArmThrustHit_Step(struct Sprite *sprite) { if (sprite->data[0] == sprite->data[4]) DestroyAnimSprite(sprite); ++sprite->data[0]; } static void AnimArmThrustHit(struct Sprite *sprite) { u8 turn; sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[0]; sprite->data[3] = gBattleAnimArgs[1]; sprite->data[4] = gBattleAnimArgs[2]; turn = gAnimMoveTurn; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) ++turn; if (turn & 1) { sprite->data[2] = -sprite->data[2]; ++sprite->data[1]; } StartSpriteAnim(sprite, sprite->data[1]); sprite->x2 = sprite->data[2]; sprite->y2 = sprite->data[3]; sprite->callback = AnimArmThrustHit_Step; } static void AnimRevengeScratch(struct Sprite *sprite) { if (gBattleAnimArgs[2] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, 0); else InitSpritePosToAnimTarget(sprite, FALSE); if (IsContest()) StartSpriteAnim(sprite, 2); else if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) StartSpriteAnim(sprite, 1); sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Fist shrinks toward target and shakes static void AnimFocusPunchFist(struct Sprite *sprite) { if (sprite->affineAnimEnded) { sprite->data[1] = (sprite->data[1] + 40) & 0xFF; sprite->x2 = Sin(sprite->data[1], 2); if (++sprite->data[0] > 40) DestroyAnimSprite(sprite); } } void AnimTask_MoveSkyUppercutBg(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: ToggleBg3Mode(0); task->data[8] = gBattleAnimArgs[0]; ++task->data[0]; break; case 1: if (--task->data[8] == -1) ++task->data[0]; break; case 2: default: task->data[9] += 1280; break; } task->data[10] += 2816; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) gBattle_BG3_X += task->data[9] >> 8; else gBattle_BG3_X -= task->data[9] >> 8; gBattle_BG3_Y += task->data[10] >> 8; task->data[9] &= 0xFF; task->data[10] &= 0xFF; if (gBattleAnimArgs[7] == -1) { gBattle_BG3_X = 0; gBattle_BG3_Y = 0; ToggleBg3Mode(1); DestroyAnimVisualTask(taskId); } } ================================================ FILE: src/battle_anim_fire.c ================================================ #include "global.h" #include "battle_anim.h" #include "sound.h" #include "util.h" #include "task.h" #include "trig.h" #include "palette.h" #include "constants/songs.h" static void AnimFireSpiralInward(struct Sprite *sprite); static void AnimFireSpread(struct Sprite *sprite); static void AnimLargeFlame(struct Sprite *sprite); static void AnimFirePlume(struct Sprite *sprite); static void AnimUnusedSmallEmber(struct Sprite *sprite); static void AnimSunlight(struct Sprite *sprite); static void AnimEmberFlare(struct Sprite *sprite); static void AnimBurnFlame(struct Sprite *sprite); static void AnimFireRing(struct Sprite *sprite); static void AnimFireCross(struct Sprite *sprite); static void AnimFireSpiralOutward(struct Sprite *sprite); static void AnimEruptionLaunchRock(struct Sprite *sprite); static void AnimEruptionFallingRock(struct Sprite *sprite); static void AnimWillOWispOrb(struct Sprite *sprite); static void AnimWillOWispFire(struct Sprite *sprite); static void AnimLargeFlame_Step(struct Sprite *sprite); static void AnimUnusedSmallEmber_Step(struct Sprite *sprite); static void AnimFireRing_Step1(struct Sprite *sprite); static void AnimFireRing_Step2(struct Sprite *sprite); static void AnimFireRing_Step3(struct Sprite *sprite); static void UpdateFireRingCircleOffset(struct Sprite *sprite); static void AnimFireSpiralOutward_Step1(struct Sprite *sprite); static void AnimFireSpiralOutward_Step2(struct Sprite *sprite); static void AnimTask_EruptionLaunchRocks_Step(u8 taskId); static void CreateEruptionLaunchRocks(u8 spriteId, u8 taskId, u8 a3); static u16 GetEruptionLaunchRockInitialYPos(u8 spriteId); static void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 x, s16 y); static void UpdateEruptionLaunchRockPos(struct Sprite *sprite); static void AnimEruptionFallingRock_Step(struct Sprite *sprite); static void AnimWillOWispOrb_Step(struct Sprite *sprite); static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId); static const union AnimCmd sAnim_FireSpiralSpread_0[] = { ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_FireSpiralSpread_1[] = { ANIMCMD_FRAME(16, 4, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(48, 4, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_FireSpiralSpread[] = { sAnim_FireSpiralSpread_0, sAnim_FireSpiralSpread_1, }; const struct SpriteTemplate gFireSpiralInwardSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FireSpiralSpread, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpiralInward, }; const struct SpriteTemplate gFireSpreadSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FireSpiralSpread, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpread, }; static const union AnimCmd sAnim_LargeFlame[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_FRAME(64, 3), ANIMCMD_FRAME(80, 3), ANIMCMD_FRAME(96, 3), ANIMCMD_FRAME(112, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_LargeFlame[] = { sAnim_LargeFlame, }; static const union AnimCmd sAnim_FirePlume[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(32, 5), ANIMCMD_FRAME(48, 5), ANIMCMD_FRAME(64, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_FirePlume[] = { sAnim_FirePlume, }; static const union AffineAnimCmd sAffineAnim_LargeFlame[] = { AFFINEANIMCMD_FRAME(0x32, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x20, 0x0, 0, 7), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_LargeFlame[] = { sAffineAnim_LargeFlame, }; const struct SpriteTemplate gLargeFlameSpriteTemplate = { .tileTag = ANIM_TAG_FIRE, .paletteTag = ANIM_TAG_FIRE, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_LargeFlame, .images = NULL, .affineAnims = sAffineAnims_LargeFlame, .callback = AnimLargeFlame, }; const struct SpriteTemplate gLargeFlameScatterSpriteTemplate = { .tileTag = ANIM_TAG_FIRE, .paletteTag = ANIM_TAG_FIRE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_LargeFlame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimLargeFlame, }; const struct SpriteTemplate gFirePlumeSpriteTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_FIRE_PLUME, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFirePlume, }; static const struct SpriteTemplate sUnusedEmberFirePlumeSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFirePlume, }; static const union AnimCmd sAnim_UnusedSmallEmber[] = { ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(32, 6), ANIMCMD_FRAME(48, 6), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_UnusedSmallEmber[] = { sAnim_UnusedSmallEmber, }; static const struct SpriteTemplate sUnusedSmallEmberSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_UnusedSmallEmber, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimUnusedSmallEmber, }; static const union AffineAnimCmd sAffineAnim_SunlightRay[] = { AFFINEANIMCMD_FRAME(0x50, 0x50, 0, 0), AFFINEANIMCMD_FRAME(0x2, 0x2, 10, 1), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sAffineAnims_SunlightRay[] = { sAffineAnim_SunlightRay, }; const struct SpriteTemplate gSunlightRaySpriteTemplate = { .tileTag = ANIM_TAG_SUNLIGHT, .paletteTag = ANIM_TAG_SUNLIGHT, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_SunlightRay, .callback = AnimSunlight, }; static const union AnimCmd sAnim_BasicFire[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_FRAME(64, 4), ANIMCMD_JUMP(0), }; const union AnimCmd *const gAnims_BasicFire[] = { sAnim_BasicFire, }; const struct SpriteTemplate gEmberSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation, }; const struct SpriteTemplate gEmberFlareSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_BasicFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEmberFlare, }; const struct SpriteTemplate gBurnFlameSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_BasicFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBurnFlame, }; const struct SpriteTemplate gFireBlastRingSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_BasicFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireRing, }; static const union AnimCmd sAnim_FireBlastCross[] = { ANIMCMD_FRAME(32, 6), ANIMCMD_FRAME(48, 6), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_FireBlastCross[] = { sAnim_FireBlastCross, }; static const union AffineAnimCmd sAffineAnim_Unused_0[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Unused_1[] = { AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_Unused[] = { sAffineAnim_Unused_0, sAffineAnim_Unused_1, }; const struct SpriteTemplate gFireBlastCrossSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FireBlastCross, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireCross, }; const struct SpriteTemplate gFireSpiralOutwardSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_BasicFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpiralOutward, }; const struct SpriteTemplate gWeatherBallFireDownSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_BasicFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWeatherBallDown, }; static const struct SpriteTemplate gEruptionLaunchRockSpriteTemplate = { .tileTag = ANIM_TAG_WARM_ROCK, .paletteTag = ANIM_TAG_WARM_ROCK, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEruptionLaunchRock, }; static const s16 sEruptionLaunchRockSpeeds[][2] = { {-2, -5}, {-1, -1}, { 3, -6}, { 4, -2}, { 2, -8}, {-5, -5}, { 4, -7}, }; const struct SpriteTemplate gEruptionFallingRockSpriteTemplate = { .tileTag = ANIM_TAG_WARM_ROCK, .paletteTag = ANIM_TAG_WARM_ROCK, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEruptionFallingRock, }; static const union AnimCmd sAnim_WillOWispOrb_0[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_FRAME(12, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_WillOWispOrb_1[] = { ANIMCMD_FRAME(16, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_WillOWispOrb_2[] = { ANIMCMD_FRAME(20, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_WillOWispOrb_3[] = { ANIMCMD_FRAME(20, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_WillOWispOrb[] = { sAnim_WillOWispOrb_0, sAnim_WillOWispOrb_1, sAnim_WillOWispOrb_2, sAnim_WillOWispOrb_3, }; const struct SpriteTemplate gWillOWispOrbSpriteTemplate = { .tileTag = ANIM_TAG_WISP_ORB, .paletteTag = ANIM_TAG_WISP_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnims_WillOWispOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWillOWispOrb, }; static const union AnimCmd sAnim_WillOWispFire[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(32, 5), ANIMCMD_FRAME(48, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_WillOWispFire[] = { sAnim_WillOWispFire, }; const struct SpriteTemplate gWillOWispFireSpriteTemplate = { .tileTag = ANIM_TAG_WISP_FIRE, .paletteTag = ANIM_TAG_WISP_FIRE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_WillOWispFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWillOWispFire, }; // Directions for shaking up/down or left/right in AnimTask_ShakeTargetInPattern // Only first 10 values are ever accessed. // First pattern results in larger shakes, second results in faster oscillation static const s8 sShakeDirsPattern0[16] = { -1, -1, 0, 1, 1, 0, 0, -1, -1, 1, 1, 0, 0, -1, 0, 1, }; static const s8 sShakeDirsPattern1[16] = { -1, 0, 1, 0, -1, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, 1, }; // For the first stage of Fire Punch static void AnimFireSpiralInward(struct Sprite *sprite) { sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = 0x3C; sprite->data[2] = 0x9; sprite->data[3] = 0x1E; sprite->data[4] = 0xFE00; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteInGrowingCircle; sprite->callback(sprite); } // For the impact spread of fire sprites for moves like Blaze Kick or Fire Punch static void AnimFireSpread(struct Sprite *sprite) { SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[3]; sprite->callback = TranslateSpriteLinearFixedPoint; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimFirePlume(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[2] = -gBattleAnimArgs[4]; } else { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[4]; } sprite->data[1] = gBattleAnimArgs[2]; sprite->data[4] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[5]; sprite->callback = AnimLargeFlame_Step; } static void AnimLargeFlame(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[4]; } else { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[2] = -gBattleAnimArgs[4]; } sprite->data[1] = gBattleAnimArgs[2]; sprite->data[4] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[5]; sprite->callback = AnimLargeFlame_Step; } static void AnimLargeFlame_Step(struct Sprite *sprite) { if (++sprite->data[0] < sprite->data[4]) { sprite->x2 += sprite->data[2]; sprite->y2 += sprite->data[3]; } if (sprite->data[0] == sprite->data[1]) DestroySpriteAndMatrix(sprite); } static void AnimUnusedSmallEmber(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[0]; } else { sprite->x += gBattleAnimArgs[0]; sprite->subpriority = 8; } sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[4]; sprite->data[3] = gBattleAnimArgs[5]; sprite->data[4] = gBattleAnimArgs[6]; sprite->data[5] = 0; sprite->callback = AnimUnusedSmallEmber_Step; } static void AnimUnusedSmallEmber_Step(struct Sprite *sprite) { if (sprite->data[3]) { if(sprite->data[5] > 10000) sprite->subpriority = 1; sprite->x2 = Sin(sprite->data[0], sprite->data[1] + (sprite->data[5] >> 8)); sprite->y2 = Cos(sprite->data[0], sprite->data[1] + (sprite->data[5] >> 8)); sprite->data[0] += sprite->data[2]; sprite->data[5] += sprite->data[4]; if (sprite->data[0] > 255) sprite->data[0] -= 256; else if (sprite->data[0] < 0) sprite->data[0] += 256; --sprite->data[3]; } else { DestroySpriteAndMatrix(sprite); } } // Sunlight from Sunny Day / sunny weather static void AnimSunlight(struct Sprite *sprite) { sprite->x = 0; sprite->y = 0; sprite->data[0] = 60; sprite->data[2] = 140; sprite->data[4] = 80; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Animates the secondary effect of MOVE_EMBER, where the flames grow and slide // horizontally a bit. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x pixel offset // arg 3: target y pixel offset // arg 4: duration // arg 5: ? (TODO: something related to which mon the pixel offsets are based on) // arg 6: ? (TODO: something related to which mon the pixel offsets are based on) static void AnimEmberFlare(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget) && (gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) || gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->callback = AnimTravelDiagonally; sprite->callback(sprite); } static void AnimBurnFlame(struct Sprite *sprite) { gBattleAnimArgs[0] = -gBattleAnimArgs[0]; gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->callback = AnimTravelDiagonally; } // Animates the a fire sprite in the first-half of the MOVE_FIRE_BLAST // animation. The fire sprite first moves in a circle around the mon, // and then it is translated towards the target mon, while still rotating. // Lastly, it moves in a circle around the target mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: initial wave offset //void AnimFireRing(struct Sprite *sprite) static void AnimFireRing(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[7] = gBattleAnimArgs[2]; sprite->data[0] = 0; sprite->callback = AnimFireRing_Step1; } static void AnimFireRing_Step1(struct Sprite *sprite) { UpdateFireRingCircleOffset(sprite); if (++sprite->data[0] == 0x12) { sprite->data[0] = 0x19; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); sprite->callback = AnimFireRing_Step2; } } static void AnimFireRing_Step2(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) { sprite->data[0] = 0; sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->x2 = sprite->y2 = 0; sprite->callback = AnimFireRing_Step3; sprite->callback(sprite); } else { sprite->x2 += Sin(sprite->data[7], 28); sprite->y2 += Cos(sprite->data[7], 28); sprite->data[7] = (sprite->data[7] + 20) & 0xFF; } } static void AnimFireRing_Step3(struct Sprite *sprite) { UpdateFireRingCircleOffset(sprite); if (++sprite->data[0] == 0x1F) DestroyAnimSprite(sprite); } static void UpdateFireRingCircleOffset(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[7], 28); sprite->y2 = Cos(sprite->data[7], 28); sprite->data[7] = (sprite->data[7] + 20) & 0xFF; } // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration // arg 3: x delta // arg 4: y delta // AnimFireCross(struct Sprite *sprite) static void AnimFireCross(struct Sprite *sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[4]; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteLinear; } static void AnimFireSpiralOutward(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); sprite->data[1] = gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[3]; sprite->invisible = TRUE; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimFireSpiralOutward_Step1); } static void AnimFireSpiralOutward_Step1(struct Sprite *sprite) { sprite->invisible = FALSE; sprite->data[0] = sprite->data[1]; sprite->data[1] = 0; sprite->callback = AnimFireSpiralOutward_Step2; sprite->callback(sprite); } static void AnimFireSpiralOutward_Step2(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8); sprite->y2 = Cos(sprite->data[1], sprite->data[2] >> 8); sprite->data[1] = (sprite->data[1] + 10) & 0xFF; sprite->data[2] += 0xD0; if (--sprite->data[0] == -1) DestroyAnimSprite(sprite); } #define IDX_ACTIVE_SPRITES 6 // Used by the sprite callback to modify the number of active sprites #define tState data[0] #define tTimer1 data[1] #define tTimer2 data[2] #define tTimer3 data[3] #define tAttackerY data[4] #define tAttackerSide data[5] #define tActiveSprites data[IDX_ACTIVE_SPRITES] // data[8]-data[15] used by BattleAnimHelper_SetSpriteSquashParams / BattleAnimHelper_RunSpriteSquash #define tAttackerSpriteId data[15] #define sSpeedDelay data[0] #define sLaunchStage data[1] #define sX data[2] #define sY data[3] #define sSpeedX data[4] #define sSpeedY data[5] #define sTaskId data[6] #define sActiveSpritesIdx data[7] // Animates first stage of Eruption where the attacker squishes and launches rocks away from themself void AnimTask_EruptionLaunchRocks(u8 taskId) { struct Task *task = &gTasks[taskId]; task->tAttackerSpriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->tState = 0; task->tTimer1 = 0; task->tTimer2 = 0; task->tTimer3 = 0; task->tAttackerY = gSprites[task->tAttackerSpriteId].y; task->tAttackerSide = GetBattlerSide(gBattleAnimAttacker); task->tActiveSprites = 0; PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL); task->func = AnimTask_EruptionLaunchRocks_Step; } static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x100, 0x100, 0xE0, 0x200, 32); task->tState++; case 1: if (++task->tTimer1 > 1) { task->tTimer1 = 0; if (++task->tTimer2 & 1) gSprites[task->tAttackerSpriteId].x2 = 3; else gSprites[task->tAttackerSpriteId].x2 = -3; } if (task->tAttackerSide != B_SIDE_PLAYER) { if (++task->tTimer3 > 4) { task->tTimer3 = 0; gSprites[task->tAttackerSpriteId].y++; } } if(!BattleAnimHelper_RunSpriteSquash(task)) { SetBattlerSpriteYOffsetFromYScale(task->tAttackerSpriteId); gSprites[task->tAttackerSpriteId].x2 = 0; task->tTimer1 = 0; task->tTimer2 = 0; task->tTimer3 = 0; task->tState++; } break; case 2: if (++task->tTimer1 > 4) { if (task->tAttackerSide != B_SIDE_PLAYER) BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xF0, 6); else BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xC0, 6); task->tTimer1 = 0; task->tState++; } break; case 3: if (!BattleAnimHelper_RunSpriteSquash(task)) { CreateEruptionLaunchRocks(task->tAttackerSpriteId, taskId, IDX_ACTIVE_SPRITES); task->tState++; } break; case 4: if (++task->tTimer1 > 1) { task->tTimer1 = 0; if (++task->tTimer2 & 1) gSprites[task->tAttackerSpriteId].y2 += 3; else gSprites[task->tAttackerSpriteId].y2 -= 3; } if (++task->tTimer3 > 24) { if (task->tAttackerSide != B_SIDE_PLAYER) BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xF0, 0x100, 0x100, 8); else BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xC0, 0x100, 0x100, 8); if (task->tTimer2 & 1) gSprites[task->tAttackerSpriteId].y2 -= 3; task->tTimer1 = 0; task->tTimer2 = 0; task->tTimer3 = 0; task->tState++; } break; case 5: if (task->tAttackerSide != B_SIDE_PLAYER) gSprites[task->tAttackerSpriteId].y--; if (!BattleAnimHelper_RunSpriteSquash(task)) { gSprites[task->tAttackerSpriteId].y = task->tAttackerY; ResetSpriteRotScale(task->tAttackerSpriteId); task->tTimer2 = 0; task->tState++; } break; case 6: if (task->tActiveSprites == 0) DestroyAnimVisualTask(taskId); break; default: break; } } static void CreateEruptionLaunchRocks(u8 spriteId, u8 taskId, u8 activeSpritesIdx) { u16 i, j; s8 sign; u16 y = GetEruptionLaunchRockInitialYPos(spriteId); u16 x = gSprites[spriteId].x; if(!GetBattlerSide(gBattleAnimAttacker)) { x -= 12; sign = 1; } else { x += 16; sign = -1; } for (i = 0, j = 0; i <= 6; i++) { u8 spriteId = CreateSprite(&gEruptionLaunchRockSpriteTemplate, x, y, 2); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.tileNum += j * 4 + 0x40; if (++j >= 5) j = 0; InitEruptionLaunchRockCoordData(&gSprites[spriteId], sEruptionLaunchRockSpeeds[i][0] * sign, sEruptionLaunchRockSpeeds[i][1]); gSprites[spriteId].sTaskId = taskId; gSprites[spriteId].sActiveSpritesIdx = activeSpritesIdx; gTasks[taskId].data[activeSpritesIdx]++; } } } static void AnimEruptionLaunchRock(struct Sprite *sprite) { UpdateEruptionLaunchRockPos(sprite); if (sprite->invisible) { gTasks[sprite->sTaskId].data[sprite->sActiveSpritesIdx]--; DestroySprite(sprite); } } static u16 GetEruptionLaunchRockInitialYPos(u8 spriteId) { s16 y = gSprites[spriteId].y + gSprites[spriteId].y2 + gSprites[spriteId].centerToCornerVecY; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) y += 74; else y += 44; return y; } static void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 speedX, s16 speedY) { sprite->sSpeedDelay = 0; sprite->sLaunchStage = 0; sprite->sX = (u16)sprite->x * 8; sprite->sY = (u16)sprite->y * 8; sprite->sSpeedX = speedX * 8; sprite->sSpeedY = speedY * 8; } static void UpdateEruptionLaunchRockPos(struct Sprite *sprite) { int extraLaunchSpeed; if (++sprite->sSpeedDelay > 2) { sprite->sSpeedDelay = 0; ++sprite->sLaunchStage; extraLaunchSpeed = (u16)sprite->sLaunchStage * (u16)sprite->sLaunchStage; sprite->sY += extraLaunchSpeed; } sprite->sX += sprite->sSpeedX; sprite->x = sprite->sX >> 3; sprite->sY += sprite->sSpeedY; sprite->y = sprite->sY >> 3; if (sprite->x < -8 || sprite->x > DISPLAY_WIDTH + 8 || sprite->y < -8 || sprite->y > 120) sprite->invisible = TRUE; } #undef IDX_ACTIVE_SPRITES #undef tState #undef tTimer1 #undef tTimer2 #undef tTimer3 #undef tAttackerY #undef tAttackerSide #undef tActiveSprites #undef tAttackerSpriteId #undef sSpeedDelay #undef sLaunchStage #undef sX #undef sY #undef sSpeedX #undef sSpeedY #undef sTaskId #undef sActiveSpritesIdx #define sState data[0] #define sBounceTimer data[1] #define sBounceDir data[2] #define sEndTimer data[3] #define sFallDelay data[6] #define sTargetY data[7] static void AnimEruptionFallingRock(struct Sprite *sprite) { sprite->x = gBattleAnimArgs[0]; sprite->y = gBattleAnimArgs[1]; sprite->sState = 0; sprite->sBounceTimer = 0; sprite->sBounceDir = 0; sprite->sFallDelay = gBattleAnimArgs[2]; sprite->sTargetY = gBattleAnimArgs[3]; sprite->oam.tileNum += gBattleAnimArgs[4] * 16; sprite->callback = AnimEruptionFallingRock_Step; } static void AnimEruptionFallingRock_Step(struct Sprite *sprite) { switch (sprite->sState) { case 0: // Wait to begin falling if (sprite->sFallDelay != 0) { sprite->sFallDelay--; return; } sprite->sState++; // fall through case 1: // Rock is falling sprite->y += 8; if (sprite->y >= sprite->sTargetY) { sprite->y = sprite->sTargetY; sprite->sState++; } break; case 2: // Bounce up and down on landing spot if (++sprite->sBounceTimer > 1) { sprite->sBounceTimer = 0; if ((++sprite->sBounceDir & 1) != 0) sprite->y2 = -3; else sprite->y2 = 3; } if (++sprite->sEndTimer > 16) DestroyAnimSprite(sprite); break; } } #undef sState #undef sBounceTimer #undef sBounceDir #undef sEndTimer #undef sFallDelay #undef sTargetY //wisp orb static void AnimWillOWispOrb(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: InitSpritePosToAnimAttacker(sprite, FALSE); StartSpriteAnim(sprite, gBattleAnimArgs[2]); sprite->data[7] = gBattleAnimArgs[2]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->data[4] = 4; else sprite->data[4] = -4; sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); ++sprite->data[0]; break; case 1: sprite->data[1] += 192; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->y2 = -(sprite->data[1] >> 8); else sprite->y2 = sprite->data[1] >> 8; sprite->x2 = Sin(sprite->data[2], sprite->data[4]); sprite->data[2] = (sprite->data[2] + 4) & 0xFF; if (++sprite->data[3] == 1) { sprite->data[3] = 0; ++sprite->data[0]; } break; case 2: sprite->x2 = Sin(sprite->data[2], sprite->data[4]); sprite->data[2] = (sprite->data[2] + 4) & 0xFF; if (++sprite->data[3] == 31) { sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = sprite->y2 = 0; sprite->data[0] = 256; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslationWithSpeed(sprite); sprite->callback = AnimWillOWispOrb_Step; } break; } } static void AnimWillOWispOrb_Step(struct Sprite *sprite) { s16 initialData5, newData5; if (!AnimTranslateLinear(sprite)) { sprite->x2 += Sin(sprite->data[5], 16); initialData5 = sprite->data[5]; sprite->data[5] = (sprite->data[5] + 4) & 0xFF; newData5 = sprite->data[5]; if ((initialData5 == 0 || initialData5 > 196) && newData5 > 0 && sprite->data[7] == 0) PlaySE12WithPanning(SE_M_FLAME_WHEEL, gAnimCustomPanning); } else { DestroyAnimSprite(sprite); } } static void AnimWillOWispFire(struct Sprite *sprite) { if (!sprite->data[0]) { sprite->data[1] = gBattleAnimArgs[0]; ++sprite->data[0]; } sprite->data[3] += 0xC0 * 2; sprite->data[4] += 0xA0; sprite->x2 = Sin(sprite->data[1], sprite->data[3] >> 8); sprite->y2 = Cos(sprite->data[1], sprite->data[4] >> 8); sprite->data[1] = (sprite->data[1] + 7) & 0xFF; if (!IsContest()) { if (sprite->data[1] < 64 || sprite->data[1] > 195) sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); else sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1; } else { if (sprite->data[1] < 64 || sprite->data[1] > 195) sprite->subpriority = 0x1D; else sprite->subpriority = 0x1F; } if (++sprite->data[2] > 0x14) sprite->invisible ^= 1; if (sprite->data[2] == 0x1E) DestroyAnimSprite(sprite); } void AnimTask_MoveHeatWaveTargets(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[12] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1; task->data[13] = IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK) + 1; task->data[14] = GetAnimBattlerSpriteId(ANIM_TARGET); task->data[15] = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER); task->func = AnimTask_MoveHeatWaveTargets_Step; } static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[10] += task->data[12] * 2; if (++task->data[1] >= 2) { task->data[1] = 0; ++task->data[2]; if (task->data[2] & 1) task->data[11] = 2; else task->data[11] = -2; } for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) gSprites[task->data[task->data[3] + 14]].x2 = task->data[10] + task->data[11]; if (++task->data[9] == 16) { task->data[9] = 0; ++task->data[0]; } break; case 1: if (++task->data[1] >= 5) { task->data[1] = 0; ++task->data[2]; if (task->data[2] & 1) task->data[11] = 2; else task->data[11] = -2; } for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) gSprites[task->data[task->data[3] + 14]].x2 = task->data[10] + task->data[11]; if (++task->data[9] == 96) { task->data[9] = 0; ++task->data[0]; } break; case 2: task->data[10] -= task->data[12] * 2; if (++task->data[1] >= 2) { task->data[1] = 0; ++task->data[2]; if (task->data[2] & 1) task->data[11] = 2; else task->data[11] = -2; } for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) gSprites[task->data[task->data[3] + 14]].x2 = task->data[10] + task->data[11]; if (++task->data[9] == 16) ++task->data[0]; break; case 3: for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) gSprites[task->data[task->data[3] + 14]].x2 = 0; DestroyAnimVisualTask(taskId); break; } } // Used to add a color mask to the battle background. // arg 0: opacity // arg 1: color code void AnimTask_BlendBackground(u8 taskId) { struct BattleAnimBgData animBg; GetBattleAnimBg1Data(&animBg); BlendPalette(BG_PLTT_ID(animBg.paletteId), 16, gBattleAnimArgs[0], gBattleAnimArgs[1]); DestroyAnimVisualTask(taskId); } #define tShakeNum data[0] #define tMaxShakes data[1] #define tShakeOffset data[2] // Never read, gBattleAnimArgs[1] is used directly instead #define tVertical data[3] #define tPatternId data[4] // Shakes target horizontally or vertically tMaxShakes times, following a set pattern of alternations void AnimTask_ShakeTargetInPattern(u8 taskId) { s8 dir; u8 spriteId; if (gTasks[taskId].tShakeNum == 0) { gTasks[taskId].tMaxShakes = gBattleAnimArgs[0]; gTasks[taskId].tShakeOffset = gBattleAnimArgs[1]; gTasks[taskId].tVertical = gBattleAnimArgs[2]; gTasks[taskId].tPatternId = gBattleAnimArgs[3]; } gTasks[taskId].tShakeNum++; spriteId = gBattlerSpriteIds[gBattleAnimTarget]; if (gTasks[taskId].tPatternId == 0) dir = sShakeDirsPattern0[gTasks[taskId].tShakeNum % 10]; else dir = sShakeDirsPattern1[gTasks[taskId].tShakeNum % 10]; if (gTasks[taskId].tVertical == TRUE) gSprites[spriteId].y2 = gBattleAnimArgs[1] * dir < 0 ? -(gBattleAnimArgs[1] * dir) : gBattleAnimArgs[1] * dir; else gSprites[spriteId].x2 = gBattleAnimArgs[1] * dir; if (gTasks[taskId].tShakeNum == gTasks[taskId].tMaxShakes) { gSprites[spriteId].x2 = 0; gSprites[spriteId].y2 = 0; DestroyAnimVisualTask(taskId); } } ================================================ FILE: src/battle_anim_flying.c ================================================ #include "global.h" #include "battle_anim.h" #include "gflib.h" #include "trig.h" #include "constants/battle_anim.h" #include "random.h" static void AnimEllipticalGust(struct Sprite *sprite); static void AnimGustToTarget(struct Sprite *sprite); static void AnimAirWaveCrescent(struct Sprite *sprite); static void AnimFlyBallUp(struct Sprite *sprite); static void AnimFlyBallAttack(struct Sprite *sprite); static void AnimFallingFeather(struct Sprite *sprite); static void AnimUnusedBubbleThrow(struct Sprite *sprite); static void AnimUnusedFeather(struct Sprite *sprite); static void AnimWhirlwindLine(struct Sprite *sprite); static void AnimBounceBallShrink(struct Sprite *sprite); static void AnimBounceBallLand(struct Sprite *sprite); static void AnimDiveBall(struct Sprite *sprite); static void AnimDiveWaterSplash(struct Sprite *sprite); static void AnimSprayWaterDroplet(struct Sprite *sprite); static void AnimUnusedFlashingLight(struct Sprite *sprite); static void AnimSkyAttackBird(struct Sprite *sprite); static void AnimEllipticalGust_Step(struct Sprite *sprite); static void AnimTask_AnimateGustTornadoPalette_Step(u8 taskId); static void AnimGustToTarget_Step(struct Sprite *sprite); static void AnimFlyBallUp_Step(struct Sprite *sprite); static void AnimFlyBallAttack_Step(struct Sprite *sprite); static void AnimFallingFeather_Step(struct Sprite *sprite); static void AnimUnusedFeather_Step(struct Sprite *sprite); static void AnimWhirlwindLine_Step(struct Sprite *sprite); static void AnimDiveBall_Step1(struct Sprite *sprite); static void AnimDiveBall_Step2(struct Sprite *sprite); static void AnimSprayWaterDroplet_Step(struct Sprite *sprite); static void AnimUnusedFlashingLight_Step(struct Sprite *sprite); static void AnimSkyAttackBird_Step(struct Sprite *sprite); const struct SpriteTemplate gEllipticalGustSpriteTemplate = { .tileTag = ANIM_TAG_GUST, .paletteTag = ANIM_TAG_GUST, .oam = &gOamData_AffineOff_ObjNormal_32x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEllipticalGust, }; static const union AffineAnimCmd sAffineAnim_GustToTarget[] = { AFFINEANIMCMD_FRAME(0x10, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0xA, 0x0, 0, 24), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_GustToTarget[] = { sAffineAnim_GustToTarget, }; const struct SpriteTemplate gGustToTargetSpriteTemplate = { .tileTag = ANIM_TAG_GUST, .paletteTag = ANIM_TAG_GUST, .oam = &gOamData_AffineNormal_ObjNormal_32x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_GustToTarget, .callback = AnimGustToTarget, }; static const union AnimCmd sAffineAnim_AirWaveCrescent[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(0, 3, .hFlip = TRUE), ANIMCMD_FRAME(0, 3, .vFlip = TRUE), ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAffineAnims_AirWaveCrescent[] = { sAffineAnim_AirWaveCrescent, }; const struct SpriteTemplate gAirWaveCrescentSpriteTemplate = { .tileTag = ANIM_TAG_AIR_WAVE_2, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = sAffineAnims_AirWaveCrescent, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimAirWaveCrescent, }; static const union AffineAnimCmd sAffineAnim_FlyBallUp[] = { AFFINEANIMCMD_FRAME(0x10, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x28, 0x0, 0, 6), AFFINEANIMCMD_FRAME(0x0, -0x20, 0, 5), AFFINEANIMCMD_FRAME(-0x10, 0x20, 0, 10), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_FlyBallUp[] = { sAffineAnim_FlyBallUp, }; static const union AffineAnimCmd sAffineAnim_FlyBallAttack_0[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 50, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_FlyBallAttack_1[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -40, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_FlyBallAttack[] = { sAffineAnim_FlyBallAttack_0, sAffineAnim_FlyBallAttack_1, }; const struct SpriteTemplate gFlyBallUpSpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_ROUND_SHADOW, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_FlyBallUp, .callback = AnimFlyBallUp, }; const struct SpriteTemplate gFlyBallAttackSpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_ROUND_SHADOW, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_FlyBallAttack, .callback = AnimFlyBallAttack, }; static const union AnimCmd sAnim_FallingFeather_0[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, }; static const union AnimCmd sAnim_FallingFeather_1[] = { ANIMCMD_FRAME(16, 0, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_FallingFeather[] = { sAnim_FallingFeather_0, sAnim_FallingFeather_1, }; const struct SpriteTemplate gFallingFeatherSpriteTemplate = { .tileTag = ANIM_TAG_WHITE_FEATHER, .paletteTag = ANIM_TAG_WHITE_FEATHER, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_FallingFeather, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFallingFeather, }; static const u16 sUnusedPal[] = INCBIN_U16("graphics/battle_anims/unused/flying.gbapal"); static const struct SpriteTemplate sUnusedBubbleThrowSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimUnusedBubbleThrow, }; static const struct SpriteTemplate sUnusedFeatherSpriteTemplate = { .tileTag = ANIM_TAG_WHITE_FEATHER, .paletteTag = ANIM_TAG_WHITE_FEATHER, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_FallingFeather, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimUnusedFeather, }; static const union AnimCmd sAnim_WhirlwindLines[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(8, 1), ANIMCMD_FRAME(16, 1), ANIMCMD_FRAME(8, 1, .hFlip = TRUE), ANIMCMD_FRAME(0, 1, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnims_WhirlwindLines[] = { sAnim_WhirlwindLines, }; const struct SpriteTemplate gWhirlwindLineSpriteTemplate = { .tileTag = ANIM_TAG_WHIRLWIND_LINES, .paletteTag = ANIM_TAG_WHIRLWIND_LINES, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = sAnims_WhirlwindLines, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWhirlwindLine, }; static const union AffineAnimCmd sAffineAnim_BounceBallShrink[] = { AFFINEANIMCMD_FRAME(0x10, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x28, 0x0, 0, 6), AFFINEANIMCMD_FRAME(0x0, -0x20, 0, 5), AFFINEANIMCMD_FRAME(-0x14, 0x0, 0, 7), AFFINEANIMCMD_FRAME(-0x14, -0x14, 0, 5), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_BounceBallShrink[] = { sAffineAnim_BounceBallShrink, }; const struct SpriteTemplate gBounceBallShrinkSpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_ROUND_SHADOW, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_BounceBallShrink, .callback = AnimBounceBallShrink, }; static const union AffineAnimCmd sAffineAnim_BounceBallLand[] = { AFFINEANIMCMD_FRAME(0xA0, 0x100, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_BounceBallLand[] = { sAffineAnim_BounceBallLand, }; const struct SpriteTemplate gBounceBallLandSpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_ROUND_SHADOW, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_BounceBallLand, .callback = AnimBounceBallLand, }; static const union AffineAnimCmd sAffineAnim_DiveBall[] = { AFFINEANIMCMD_FRAME(0x10, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x28, 0x0, 0, 6), AFFINEANIMCMD_FRAME(0x0, -0x20, 0, 5), AFFINEANIMCMD_FRAME(-0x10, 0x20, 0, 10), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_DiveBall[] = { sAffineAnim_DiveBall, }; const struct SpriteTemplate gDiveBallSpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_ROUND_SHADOW, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_DiveBall, .callback = AnimDiveBall, }; static const union AffineAnimCmd sAnim_Unused[] = { AFFINEANIMCMD_FRAME(0x100, 0x0, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x20, 0, 12), AFFINEANIMCMD_FRAME(0x0, -0x20, 0, 11), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAnims_Unused[] = { sAnim_Unused, }; const struct SpriteTemplate gDiveWaterSplashSpriteTemplate = { .tileTag = ANIM_TAG_SPLASH, .paletteTag = ANIM_TAG_SPLASH, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDiveWaterSplash, }; const struct SpriteTemplate gSprayWaterDropletSpriteTemplate = { .tileTag = ANIM_TAG_SWEAT_BEAD, .paletteTag = ANIM_TAG_SWEAT_BEAD, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSprayWaterDroplet, }; static const struct SpriteTemplate sUnusedFlashingLightSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimUnusedFlashingLight, }; const struct SpriteTemplate gSkyAttackBirdSpriteTemplate = { .tileTag = ANIM_TAG_BIRD, .paletteTag = ANIM_TAG_BIRD, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSkyAttackBird, }; static void AnimEllipticalGust(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, FALSE); sprite->y += 20; sprite->data[1] = 191; sprite->callback = AnimEllipticalGust_Step; sprite->callback(sprite); } static void AnimEllipticalGust_Step(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[1], 32); sprite->y2 = Cos(sprite->data[1], 8); sprite->data[1] += 5; sprite->data[1] &= 0xFF; if (++sprite->data[0] == 71) DestroyAnimSprite(sprite); } // Animates the palette on the gust tornado to make it look like its spinning void AnimTask_AnimateGustTornadoPalette(u8 taskId) { gTasks[taskId].data[0] = gBattleAnimArgs[1]; gTasks[taskId].data[1] = gBattleAnimArgs[0]; gTasks[taskId].data[2] = IndexOfSpritePaletteTag(ANIM_TAG_GUST); gTasks[taskId].func = AnimTask_AnimateGustTornadoPalette_Step; } static void AnimTask_AnimateGustTornadoPalette_Step(u8 taskId) { u8 data2; u16 temp; s32 i, base; if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1]) { gTasks[taskId].data[10] = 0; data2 = gTasks[taskId].data[2]; temp = gPlttBufferFaded[OBJ_PLTT_ID(data2) + 8]; i = 7; base = PLTT_ID(data2); do { gPlttBufferFaded[base + OBJ_PLTT_OFFSET + 1 + i] = gPlttBufferFaded[base + OBJ_PLTT_OFFSET + i]; } while (--i > 0); gPlttBufferFaded[base + OBJ_PLTT_OFFSET + 1] = temp; } if (--gTasks[taskId].data[0] == 0) DestroyAnimVisualTask(taskId); } static void AnimGustToTarget(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; InitAnimLinearTranslation(sprite); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; StoreSpriteCallbackInData6(sprite, AnimGustToTarget_Step); } static void AnimGustToTarget_Step(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) DestroyAnimSprite(sprite); } static void AnimAirWaveCrescent(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { gBattleAnimArgs[0] = -gBattleAnimArgs[0]; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; } if (IsContest()) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; } sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[4]; if (gBattleAnimArgs[6] == 0) { sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } else { SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); } sprite->data[2] = sprite->data[2] + gBattleAnimArgs[2]; sprite->data[4] = sprite->data[4] + gBattleAnimArgs[3]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); SeekSpriteAnim(sprite, gBattleAnimArgs[5]); } static void AnimFlyBallUp(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->callback = AnimFlyBallUp_Step; gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE; } static void AnimFlyBallUp_Step(struct Sprite *sprite) { if (sprite->data[0] > 0) { --sprite->data[0]; } else { sprite->data[2] += sprite->data[1]; sprite->y2 -= (sprite->data[2] >> 8); } if (sprite->y + sprite->y2 < -32) DestroyAnimSprite(sprite); } static void AnimFlyBallAttack(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x = DISPLAY_WIDTH + 32; sprite->y = -32; StartSpriteAffineAnim(sprite, 1); } else { sprite->x = -32; sprite->y = -32; } sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); sprite->callback = AnimFlyBallAttack_Step; } static void AnimFlyBallAttack_Step(struct Sprite *sprite) { sprite->data[0] = 1; AnimTranslateLinear(sprite); if (((u16)sprite->data[3] >> 8) > 200) { sprite->x += sprite->x2; sprite->x2 = 0; sprite->data[3] &= 0xFF; } if (sprite->x + sprite->x2 < -32 || sprite->x + sprite->x2 > DISPLAY_WIDTH + 32 || sprite->y + sprite->y2 > DISPLAY_HEIGHT) { gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = FALSE; DestroyAnimSprite(sprite); } } void DestroyAnimSpriteAfterTimer(struct Sprite *sprite) { if (sprite->data[0]-- <= 0) { if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) { FreeOamMatrix(sprite->oam.matrixNum); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; } DestroySprite(sprite); --gAnimVisualTaskCount; } } struct FeatherDanceData { u16 unk0_0a:1; u16 unk0_0b:1; u16 unk0_0c:1; u16 unk0_0d:1; u16 unk0_1:4; u16 unk1:8; u16 unk2; s16 unk4; u16 unk6; u16 unk8; u16 unkA; u8 unkC[2]; u16 unkE_0:1; u16 unkE_1:15; }; static void AnimFallingFeather(struct Sprite *sprite) { u8 battler, matrixNum, sinIndex; s16 spriteCoord, sinVal; struct FeatherDanceData *data = (struct FeatherDanceData *)sprite->data; if (gBattleAnimArgs[7] & 0x100) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; if (GetBattlerSide(battler) == B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_ATTR_HEIGHT) + gBattleAnimArgs[0]; spriteCoord = GetBattlerSpriteCoord(battler, BATTLER_COORD_ATTR_WIDTH); sprite->y = spriteCoord + gBattleAnimArgs[1]; data->unk8 = sprite->y << 8; data->unkE_1 = spriteCoord + gBattleAnimArgs[6]; data->unk0_0c = 1; data->unk2 = gBattleAnimArgs[2] & 0xFF; data->unkA = (gBattleAnimArgs[2] >> 8) & 0xFF; data->unk4 = gBattleAnimArgs[3]; data->unk6 = gBattleAnimArgs[4]; *(u16 *)(data->unkC) = gBattleAnimArgs[5]; if (data->unk2 >= 64 && data->unk2 <= 191) { if (!IsContest()) sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1; else sprite->oam.priority = GetBattlerSpriteBGPriority(battler); data->unkE_0 = 0; if (!(data->unk4 & 0x8000)) { sprite->hFlip ^= 1; sprite->animNum = sprite->hFlip; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; } } else { sprite->oam.priority = GetBattlerSpriteBGPriority(battler); data->unkE_0 = 1; if (data->unk4 & 0x8000) { sprite->hFlip ^= 1; sprite->animNum = sprite->hFlip; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; } } data->unk0_1 = data->unk2 >> 6; sprite->x2 = (gSineTable[data->unk2] * data->unkC[0]) >> 8; matrixNum = sprite->oam.matrixNum; sinIndex = (-sprite->x2 >> 1) + data->unkA; sinVal = gSineTable[sinIndex]; gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[sinIndex + 64]; if (sprite) { gOamMatrices[matrixNum].b = sinVal; gOamMatrices[matrixNum].c = -sinVal; } else // pointless, exactly the same { gOamMatrices[matrixNum].b = sinVal; gOamMatrices[matrixNum].c = -sinVal; } sprite->callback = AnimFallingFeather_Step; } static void AnimFallingFeather_Step(struct Sprite *sprite) { u8 matrixNum, sinIndex; s16 sinVal = 0; struct FeatherDanceData *data = (struct FeatherDanceData *)sprite->data; if (data->unk0_0a) { if (data->unk1-- % 256 == 0) { data->unk0_0a = 0; data->unk1 = 0; } } else { switch (data->unk2 / 64) { case 0: if ((u8)data->unk0_1 == 1) //casts to u8 here are necessary for matching { data->unk0_0d = 1; data->unk0_0a = 1; data->unk1 = 0; } else if ((u8)data->unk0_1 == 3) { data->unk0_0b ^= 1; data->unk0_0a = 1; data->unk1 = 0; } else if (data->unk0_0d) { sprite->hFlip ^= 1; sprite->animNum = sprite->hFlip; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; if (data->unk0_0c) { if (!IsContest()) { if (!data->unkE_0) { --sprite->oam.priority; data->unkE_0 ^= 1; } else { ++sprite->oam.priority; data->unkE_0 ^= 1; } } else { if (!data->unkE_0) { sprite->subpriority -= 12; data->unkE_0 ^= 1; } else { sprite->subpriority += 12; data->unkE_0 ^= 1; } } } data->unk0_0d = 0; data->unk2; } data->unk0_1 = 0; break; case 1: if ((u8)data->unk0_1 == 0) { data->unk0_0d = 1; data->unk0_0a = 1; data->unk1 = 0; } else if ((u8)data->unk0_1 == 2) { data->unk0_0a = 1; data->unk1 = 0; } else if (data->unk0_0d) { sprite->hFlip ^= 1; sprite->animNum = sprite->hFlip; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; if (data->unk0_0c) { if (!IsContest()) { if (!data->unkE_0) { --sprite->oam.priority; data->unkE_0 ^= 1; } else { ++sprite->oam.priority; data->unkE_0 ^= 1; } } else { if (!data->unkE_0) { sprite->subpriority -= 12; data->unkE_0 ^= 1; } else { sprite->subpriority += 12; data->unkE_0 ^= 1; } } } data->unk0_0d = 0; } data->unk0_1 = 1; break; case 2: if ((u8)data->unk0_1 == 3) { data->unk0_0d = 1; data->unk0_0a = 1; data->unk1 = 0; } else if ((u8)data->unk0_1 == 1) { data->unk0_0a = 1; data->unk1 = 0; } else if (data->unk0_0d) { sprite->hFlip ^= 1; sprite->animNum = sprite->hFlip; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; if (data->unk0_0c) { if (!IsContest()) { if (!data->unkE_0) { --sprite->oam.priority; data->unkE_0 ^= 1; } else { ++sprite->oam.priority; data->unkE_0 ^= 1; } } else { if (!data->unkE_0) { sprite->subpriority -= 12; data->unkE_0 ^= 1; } else { sprite->subpriority += 12; data->unkE_0 ^= 1; } } } data->unk0_0d = 0; } data->unk0_1 = 2; break; case 3: if ((u8)data->unk0_1 == 2) { data->unk0_0d = 1; } else if ((u8)data->unk0_1 == 0) { data->unk0_0b ^= 1; data->unk0_0a = 1; data->unk1 = 0; } else if (data->unk0_0d) { sprite->hFlip ^= 1; sprite->animNum = sprite->hFlip; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; if (data->unk0_0c) { if (!IsContest()) { if (!data->unkE_0) { --sprite->oam.priority; data->unkE_0 ^= 1; } else { ++sprite->oam.priority; data->unkE_0 ^= 1; } } else { if (!data->unkE_0) { sprite->subpriority -= 12; data->unkE_0 ^= 1; } else { sprite->subpriority += 12; data->unkE_0 ^= 1; } } } data->unk0_0d = 0; } data->unk0_1 = 3; break; } sprite->x2 = ((s32)data->unkC[data->unk0_0b] * gSineTable[data->unk2]) >> 8; matrixNum = sprite->oam.matrixNum; sinIndex = (-sprite->x2 >> 1) + data->unkA; sinVal = gSineTable[sinIndex]; gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[sinIndex + 64]; gOamMatrices[matrixNum].b = sinVal; gOamMatrices[matrixNum].c = -sinVal; data->unk8 += data->unk6; sprite->y = data->unk8 >> 8; if (data->unk4 & 0x8000) data->unk2 = (data->unk2 - (data->unk4 & 0x7FFF)) & 0xFF; else data->unk2 = (data->unk2 + (data->unk4 & 0x7FFF)) & 0xFF; if (sprite->y + sprite->y2 >= data->unkE_1) { sprite->data[0] = 0; sprite->callback = DestroyAnimSpriteAfterTimer; } } } static void AnimUnusedBubbleThrow(struct Sprite *sprite) { sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = TranslateAnimSpriteToTargetMonLocation; } static void AnimUnusedFeather(struct Sprite *sprite) { u8 matrixNum; s16 rn, sinVal; sprite->data[1] = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[1]; sprite->data[3] = gBattleAnimArgs[2]; if (!IsContest()) { if (gBattlerPositions[gBattleAnimTarget] & B_POSITION_OPPONENT_LEFT) sprite->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH) + gBattleAnimArgs[3]; else sprite->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH) + 40; if (gBattleAnimArgs[4]) sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1; else sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); } else { sprite->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH) + gBattleAnimArgs[3]; } sprite->data[4] = gSineTable[sprite->data[1] & 0xFF]; sprite->data[5] = -gSineTable[(sprite->data[1] & 0xFF) + 64]; sprite->data[6] = 0; sprite->y2 = 0; sprite->x2 = 0; matrixNum = sprite->oam.matrixNum; sprite->data[1] = (u16)sprite->data[1] >> 8; rn = Random(); if (rn & 0x8000) sprite->data[1] = 0xFF - sprite->data[1]; sinVal = gSineTable[sprite->data[1]]; gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[sprite->data[1] + 64]; gOamMatrices[matrixNum].b = sinVal; gOamMatrices[matrixNum].c = -sinVal; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; if (rn & 1) { sprite->animNum = 1; sprite->hFlip = TRUE; } sprite->callback = AnimUnusedFeather_Step; } static void AnimUnusedFeather_Step(struct Sprite *sprite) { struct FeatherDanceData fData; struct FeatherDanceData *tData = (struct FeatherDanceData *)sprite->data; u8 item; u32 x, y; ++sprite->data[0]; if (sprite->data[0] <= 4) return; sprite->x2 = (sprite->data[4] * sprite->data[6]) >> 8; sprite->y2 = (sprite->data[5] * sprite->data[6]) >> 8; sprite->data[6] += sprite->data[3] & 0xFF; if (sprite->data[6] < (sprite->data[2] & 0xFF)) return; sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; memcpy(&fData, tData, sizeof(struct FeatherDanceData)); memset(tData, 0, sizeof(struct FeatherDanceData)); tData->unk8 = sprite->y << 8; tData->unk6 = fData.unk6 >> 8; tData->unk2 = 0; tData->unkA = fData.unk2; if (sprite->animNum != 0) { if (tData->unk6 & 8) tData->unk4 = 0x8001; else tData->unk4 = 0x8002; } else if (tData->unk6 & 8) { tData->unk4 = 1; } else { tData->unk4 = 2; } item = fData.unk4 >> 8; tData->unkC[0] = item; tData->unkC[1] = item - 2; x = (((u16 *)&fData)[7] << 1); y = (((u16 *)tData)[7] & 1); ((u16 *)tData)[7] = y | x; sprite->callback = AnimFallingFeather_Step; } static void AnimWhirlwindLine(struct Sprite *sprite) { u16 arg; u8 mult; if (gBattleAnimArgs[2] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, 0); else InitSpritePosToAnimTarget(sprite, FALSE); if ((gBattleAnimArgs[2] == ANIM_ATTACKER && GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) || (gBattleAnimArgs[2] == ANIM_TARGET && GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)) sprite->x += 8; SeekSpriteAnim(sprite, gBattleAnimArgs[4]); sprite->x -= 32; sprite->data[1] = 0x0ccc; arg = gBattleAnimArgs[4]; mult = 12; sprite->x2 += mult * arg; sprite->data[0] = arg; sprite->data[7] = gBattleAnimArgs[3]; sprite->callback = AnimWhirlwindLine_Step; } static void AnimWhirlwindLine_Step(struct Sprite *sprite) { sprite->x2 += sprite->data[1] >> 8; if (++sprite->data[0] == 6) { sprite->data[0] = 0; sprite->x2 = 0; StartSpriteAnim(sprite, 0); } if (--sprite->data[7] == -1) DestroyAnimSprite(sprite); } void AnimTask_DrillPeckHitSplats(u8 taskId) { if (!(gTasks[taskId].data[0] % 32)) { ++gAnimVisualTaskCount; gBattleAnimArgs[0] = Sin(gTasks[taskId].data[0], -13); gBattleAnimArgs[1] = Cos(gTasks[taskId].data[0], -13); gBattleAnimArgs[2] = 1; gBattleAnimArgs[3] = 3; CreateSpriteAndAnimate(&gFlashingHitSplatSpriteTemplate, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2), GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET), 3); } gTasks[taskId].data[0] += 8; if (gTasks[taskId].data[0] > 255) DestroyAnimVisualTask(taskId); } static void AnimBounceBallShrink(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: InitSpritePosToAnimAttacker(sprite, 1); gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE; ++sprite->data[0]; break; case 1: if (sprite->affineAnimEnded) DestroyAnimSprite(sprite); break; } } static void AnimBounceBallLand(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); sprite->y2 = -sprite->y - 32; ++sprite->data[0]; break; case 1: sprite->y2 += 10; if (sprite->y2 >= 0) ++sprite->data[0]; break; case 2: sprite->y2 -= 10; if (sprite->y + sprite->y2 < -32) { gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = FALSE; DestroyAnimSprite(sprite); } break; } } static void AnimDiveBall(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->callback = AnimDiveBall_Step1; gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE; } static void AnimDiveBall_Step1(struct Sprite *sprite) { if (sprite->data[0] > 0) { --sprite->data[0]; } else if (sprite->y + sprite->y2 > -32) { sprite->data[2] += sprite->data[1]; sprite->y2 -= (sprite->data[2] >> 8); } else { sprite->invisible = TRUE; if (sprite->data[3]++ > 20) sprite->callback = AnimDiveBall_Step2; } } static void AnimDiveBall_Step2(struct Sprite *sprite) { sprite->y2 += sprite->data[2] >> 8; if (sprite->y + sprite->y2 > -32) sprite->invisible = FALSE; if (sprite->y2 > 0) DestroyAnimSprite(sprite); } static void AnimDiveWaterSplash(struct Sprite *sprite) { u32 matrixNum; s32 t1, t2; switch (sprite->data[0]) { case 0: if (!gBattleAnimArgs[0]) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); } sprite->data[1] = 512; TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); ++sprite->data[0]; break; case 1: if (sprite->data[2] <= 11) sprite->data[1] -= 40; else sprite->data[1] += 40; ++sprite->data[2]; TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); matrixNum = sprite->oam.matrixNum; t1 = 15616; t2 = t1 / gOamMatrices[matrixNum].d + 1; if (t2 > 128) t2 = 128; t2 = (64 - t2) / 2; sprite->y2 = t2; if (sprite->data[2] == 24) { TryResetSpriteAffineState(sprite); DestroyAnimSprite(sprite); } break; } } // Launches a water droplet away from the specified battler. Used by Astonish and Dive static void AnimSprayWaterDroplet(struct Sprite *sprite) { s32 v1 = 0x1FF & Random(); s32 v2 = 0x7F & Random(); if (v1 % 2) sprite->data[0] = 736 + v1; else sprite->data[0] = 736 - v1; if (v2 % 2) sprite->data[1] = 896 + v2; else sprite->data[1] = 896 - v2; sprite->data[2] = gBattleAnimArgs[0]; if (sprite->data[2]) sprite->oam.matrixNum = ST_OAM_HFLIP; if (gBattleAnimArgs[1] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 32; } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 32; } sprite->callback = AnimSprayWaterDroplet_Step; } static void AnimSprayWaterDroplet_Step(struct Sprite *sprite) { if (sprite->data[2] == 0) { sprite->x2 += sprite->data[0] >> 8; sprite->y2 -= sprite->data[1] >> 8; } else { sprite->x2 -= sprite->data[0] >> 8; sprite->y2 -= sprite->data[1] >> 8; } sprite->data[0] = sprite->data[0]; sprite->data[1] -= 32; if (sprite->data[0] < 0) sprite->data[0] = 0; if (++sprite->data[3] == 31) DestroyAnimSprite(sprite); } static void AnimUnusedFlashingLight(struct Sprite *sprite) { sprite->data[6] = 0; sprite->data[7] = 64; sprite->callback = AnimUnusedFlashingLight_Step; } static void AnimUnusedFlashingLight_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: if (++sprite->data[1] > 8) { sprite->data[1] = 0; sprite->invisible ^= 1; if (++sprite->data[2] > 5 && sprite->invisible != FALSE) ++sprite->data[0]; } break; case 1: DestroyAnimSprite(sprite); break; } } static void AnimSkyAttackBird(struct Sprite *sprite) { u16 rotation; s16 posx = sprite->x; s16 posy = sprite->y; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[4] = sprite->x << 4; sprite->data[5] = sprite->y << 4; sprite->data[6] = ((posx - sprite->x) << 4) / 12; sprite->data[7] = ((posy - sprite->y) << 4) / 12; rotation = ArcTan2Neg(posx - sprite->x, posy - sprite->y); rotation += 49152; TrySetSpriteRotScale(sprite, 1, 0x100, 0x100, rotation); sprite->callback = AnimSkyAttackBird_Step; } static void AnimSkyAttackBird_Step(struct Sprite *sprite) { sprite->data[4] += sprite->data[6]; sprite->data[5] += sprite->data[7]; sprite->x = sprite->data[4] >> 4; sprite->y = sprite->data[5] >> 4; if (sprite->x > DISPLAY_WIDTH + 45 || sprite->x < -45 || sprite->y > 157 || sprite->y < -45) DestroySpriteAndMatrix(sprite); } // Unused static void AnimTask_SetAttackerVisibility(u8 taskId) { if (gBattleAnimArgs[0] == 0) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); gSprites[spriteId].invisible = TRUE; } else { u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); gSprites[spriteId].invisible = FALSE; } DestroyAnimVisualTask(taskId); } ================================================ FILE: src/battle_anim_ghost.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "scanline_effect.h" #include "graphics.h" #include "trig.h" #include "util.h" #include "decompress.h" #include "constants/songs.h" static void AnimConfuseRayBallBounce(struct Sprite *sprite); static void AnimConfuseRayBallBounce_Step1(struct Sprite *sprite); static void AnimConfuseRayBallBounce_Step2(struct Sprite *sprite); static void UpdateConfuseRayBallBlend(struct Sprite *sprite); static void AnimConfuseRayBallSpiral(struct Sprite *sprite); static void AnimConfuseRayBallSpiral_Step(struct Sprite *sprite); static void AnimTask_NightShadeClone_Step1(u8 taskId); static void AnimTask_NightShadeClone_Step2(u8 taskId); static void AnimShadowBall(struct Sprite *sprite); static void AnimShadowBall_Step(struct Sprite *sprite); static void AnimLick(struct Sprite *sprite); static void AnimLick_Step(struct Sprite *sprite); static void AnimTask_NightmareClone_Step(u8 taskId); static void AnimTask_SpiteTargetShadow_Step1(u8 taskId); static void AnimTask_SpiteTargetShadow_Step2(u8 taskId); static void AnimTask_SpiteTargetShadow_Step3(u8 taskId); static void AnimDestinyBondWhiteShadow(struct Sprite *sprite); static void AnimDestinyBondWhiteShadow_Step(struct Sprite *sprite); static void AnimTask_DestinyBondWhiteShadow_Step(u8 taskId); static void AnimTask_CurseStretchingBlackBg_Step1(u8 taskId); static void AnimTask_CurseStretchingBlackBg_Step2(u8 taskId); static void AnimCurseNail(struct Sprite *sprite); static void AnimCurseNail_Step1(struct Sprite *sprite); static void AnimCurseNail_Step2(struct Sprite *sprite); static void AnimCurseNail_End(struct Sprite *sprite); static void AnimGhostStatusSprite(struct Sprite *sprite); static void AnimGhostStatusSprite_End(struct Sprite *sprite); static void AnimTask_GrudgeFlames_Step(u8 taskId); static void AnimGrudgeFlame(struct Sprite *sprite); static void AnimMonMoveCircular(struct Sprite *sprite); static void AnimTask_GhostGetOut_Step1(u8 taskId); static void AnimTask_GhostGetOut_Step2(u8 taskId); static void AnimTask_GhostGetOut_Step3(u8 taskId); static void AnimMonMoveCircular_Step(struct Sprite *sprite); static const union AffineAnimCmd sAffineAnim_ConfuseRayBallBounce[] = { AFFINEANIMCMD_FRAME(0x1E, 0x1E, 10, 5), AFFINEANIMCMD_FRAME(-0x1E, -0x1E, 10, 5), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAffineAnims_ConfuseRayBallBounce[] = { sAffineAnim_ConfuseRayBallBounce, }; const struct SpriteTemplate gConfuseRayBallBounceSpriteTemplate = { .tileTag = ANIM_TAG_YELLOW_BALL, .paletteTag = ANIM_TAG_YELLOW_BALL, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_ConfuseRayBallBounce, .callback = AnimConfuseRayBallBounce, }; const struct SpriteTemplate gConfuseRayBallSpiralSpriteTemplate = { .tileTag = ANIM_TAG_YELLOW_BALL, .paletteTag = ANIM_TAG_YELLOW_BALL, .oam = &gOamData_AffineOff_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimConfuseRayBallSpiral, }; static const union AffineAnimCmd sAffineAnim_ShadowBall[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 10, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAffineAnims_ShadowBall[] = { sAffineAnim_ShadowBall, }; const struct SpriteTemplate gShadowBallSpriteTemplate = { .tileTag = ANIM_TAG_SHADOW_BALL, .paletteTag = ANIM_TAG_SHADOW_BALL, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_ShadowBall, .callback = AnimShadowBall, }; const union AnimCmd sAnim_Lick[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(8, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(24, 2), ANIMCMD_FRAME(32, 2), ANIMCMD_END, }; static const union AnimCmd *const sAnims_Lick[] = { sAnim_Lick, }; const struct SpriteTemplate gLickSpriteTemplate = { .tileTag = ANIM_TAG_LICK, .paletteTag = ANIM_TAG_LICK, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = sAnims_Lick, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimLick, }; static const union AffineAnimCmd sAffineAnim_Unused[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_Unused[] = { sAffineAnim_Unused, }; const struct SpriteTemplate gDestinyBondWhiteShadowSpriteTemplate = { .tileTag = ANIM_TAG_WHITE_SHADOW, .paletteTag = ANIM_TAG_WHITE_SHADOW, .oam = &gOamData_AffineOff_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDestinyBondWhiteShadow, }; const struct SpriteTemplate gCurseNailSpriteTemplate = { .tileTag = ANIM_TAG_NAIL, .paletteTag = ANIM_TAG_NAIL, .oam = &gOamData_AffineOff_ObjBlend_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCurseNail, }; const struct SpriteTemplate gCurseGhostSpriteTemplate = { .tileTag = ANIM_TAG_GHOSTLY_SPIRIT, .paletteTag = ANIM_TAG_GHOSTLY_SPIRIT, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGhostStatusSprite, }; const struct SpriteTemplate gNightmareDevilSpriteTemplate = { .tileTag = ANIM_TAG_DEVIL, .paletteTag = ANIM_TAG_DEVIL, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGhostStatusSprite, }; static const union AnimCmd sAnim_GrudgeFlame[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(24, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_GrudgeFlame[] = { sAnim_GrudgeFlame, }; const struct SpriteTemplate gGrudgeFlameSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_FLAME, .paletteTag = ANIM_TAG_PURPLE_FLAME, .oam = &gOamData_AffineOff_ObjBlend_16x32, .anims = sAnims_GrudgeFlame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGrudgeFlame, }; // Unused static const struct SpriteTemplate sMonMoveCircularSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMonMoveCircular, }; static void AnimConfuseRayBallBounce(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslationWithSpeed(sprite); sprite->callback = AnimConfuseRayBallBounce_Step1; sprite->data[6] = 16; SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[6]); } static void AnimConfuseRayBallBounce_Step1(struct Sprite *sprite) { s16 r0, r2; UpdateConfuseRayBallBlend(sprite); if (AnimTranslateLinear(sprite)) { sprite->callback = AnimConfuseRayBallBounce_Step2; return; } sprite->x2 += Sin(sprite->data[5], 10); sprite->y2 += Cos(sprite->data[5], 15); r2 = sprite->data[5]; sprite->data[5] = (sprite->data[5] + 5) & 0xFF; r0 = sprite->data[5]; if (r2 != 0 && r2 <= 196) return; if (r0 <= 0) return; PlaySE12WithPanning(SE_M_CONFUSE_RAY, gAnimCustomPanning); } static void AnimConfuseRayBallBounce_Step2(struct Sprite *sprite) { s16 r2, r0; sprite->data[0] = 1; AnimTranslateLinear(sprite); sprite->x2 += Sin(sprite->data[5], 10); sprite->y2 += Cos(sprite->data[5], 15); r2 = sprite->data[5]; sprite->data[5] = (sprite->data[5] + 5) & 0xFF; r0 = sprite->data[5]; if ((r2 == 0 || r2 > 196) && r0 > 0) PlaySE(SE_M_CONFUSE_RAY); if (sprite->data[6] == 0) { sprite->invisible = TRUE; sprite->callback = DestroyAnimSpriteAndDisableBlend; } else { UpdateConfuseRayBallBlend(sprite); } } static void UpdateConfuseRayBallBlend(struct Sprite *sprite) { s16 r0; if (sprite->data[6] > 0xFF) { if (++sprite->data[6] == 0x10d) sprite->data[6] = 0; return; } r0 = sprite->data[7]; ++sprite->data[7]; if ((r0 & 0xFF) == 0) { sprite->data[7] &= 0xff00; if ((sprite->data[7] & 0x100) != 0) ++sprite->data[6]; else --sprite->data[6]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], 16 - sprite->data[6])); if (sprite->data[6] == 0 || sprite->data[6] == 16) sprite->data[7] ^= 0x100; if (sprite->data[6] == 0) sprite->data[6] = 0x100; } } static void AnimConfuseRayBallSpiral(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->callback = AnimConfuseRayBallSpiral_Step; sprite->callback(sprite); } static void AnimConfuseRayBallSpiral_Step(struct Sprite *sprite) { u16 temp1; sprite->x2 = Sin(sprite->data[0], 32); sprite->y2 = Cos(sprite->data[0], 8); temp1 = sprite->data[0] - 65; if (temp1 <= 130) sprite->oam.priority = 2; else sprite->oam.priority = 1; sprite->data[0] = (sprite->data[0] + 19) & 0xFF; sprite->data[2] += 80; sprite->y2 += sprite->data[2] >> 8; sprite->data[7] += 1; if (sprite->data[7] == 61) DestroyAnimSprite(sprite); } // Creates a large transparent clone of the attacker centered on their position which shrinks to original size void AnimTask_NightShadeClone(u8 taskId) { u8 spriteId; SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND); SetSpriteRotScale(spriteId, 128, 128, 0); gSprites[spriteId].invisible = FALSE; gTasks[taskId].data[0] = 128; gTasks[taskId].data[1] = *gBattleAnimArgs; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 16; gTasks[taskId].func = AnimTask_NightShadeClone_Step1; } static void AnimTask_NightShadeClone_Step1(u8 taskId) { gTasks[taskId].data[10] += 1; if (gTasks[taskId].data[10] == 3) { gTasks[taskId].data[10] = 0; gTasks[taskId].data[2] += 1; gTasks[taskId].data[3] -= 1; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[2], gTasks[taskId].data[3])); if (gTasks[taskId].data[2] != 9) return; gTasks[taskId].func = AnimTask_NightShadeClone_Step2; } } static void AnimTask_NightShadeClone_Step2(u8 taskId) { u8 spriteId; if (gTasks[taskId].data[1] > 0) { gTasks[taskId].data[1] -= 1; return; } spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); gTasks[taskId].data[0] += 8; if (gTasks[taskId].data[0] <= 0xFF) { SetSpriteRotScale(spriteId, gTasks[taskId].data[0], gTasks[taskId].data[0], 0); } else { ResetSpriteRotScale(spriteId); DestroyAnimVisualTask(taskId); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); } } // Spins a sprite towards the target, pausing in the middle. // Used in Shadow Ball. // arg 0: duration step 1 (attacker -> center) // arg 1: duration step 2 (spin center) // arg 2: duration step 3 (center -> target) static void AnimShadowBall(struct Sprite *sprite) { s16 oldPosX = sprite->x; s16 oldPosY = sprite->y; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = 0; sprite->data[1] = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[1]; sprite->data[3] = gBattleAnimArgs[2]; sprite->data[4] = sprite->x << 4; sprite->data[5] = sprite->y << 4; sprite->data[6] = ((oldPosX - sprite->x) << 4) / (gBattleAnimArgs[0] << 1); sprite->data[7] = ((oldPosY - sprite->y) << 4) / (gBattleAnimArgs[0] << 1); sprite->callback = AnimShadowBall_Step; } static void AnimShadowBall_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->data[4] += sprite->data[6]; sprite->data[5] += sprite->data[7]; sprite->x = sprite->data[4] >> 4; sprite->y = sprite->data[5] >> 4; sprite->data[1] -= 1; if (sprite->data[1] > 0) break; sprite->data[0] += 1; break; case 1: sprite->data[2] -= 1; if (sprite->data[2] > 0) break; sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[4] = sprite->x << 4; sprite->data[5] = sprite->y << 4; sprite->data[6] = ((sprite->data[1] - sprite->x) << 4) / sprite->data[3]; sprite->data[7] = ((sprite->data[2] - sprite->y) << 4) / sprite->data[3]; sprite->data[0] += 1; break; case 2: sprite->data[4] += sprite->data[6]; sprite->data[5] += sprite->data[7]; sprite->x = sprite->data[4] >> 4; sprite->y = sprite->data[5] >> 4; sprite->data[3] -= 1; if (sprite->data[3] > 0) break; sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] += 1; break; case 3: DestroySpriteAndMatrix(sprite); break; } } static void AnimLick(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->callback = AnimLick_Step; } static void AnimLick_Step(struct Sprite *sprite) { bool8 r5 = FALSE; bool8 r6 = FALSE; if (sprite->animEnded) { if (!sprite->invisible) sprite->invisible = TRUE; switch (sprite->data[0]) { default: r6 = TRUE; break; case 0: if (sprite->data[1] == 2) r5 = TRUE; break; case 1: if (sprite->data[1] == 4) r5 = TRUE; break; } if (r5) { sprite->invisible ^= 1; ++sprite->data[2]; sprite->data[1] = 0; if (sprite->data[2] == 5) { sprite->data[2] = 0; ++sprite->data[0]; } } else if (r6) { DestroyAnimSprite(sprite); } else { ++sprite->data[1]; } } } // Creates a transparent clone of the target which drifts up and away to the side void AnimTask_NightmareClone(u8 taskId) { struct Task *task; task = &gTasks[taskId]; task->data[0] = CloneBattlerSpriteWithBlend(ANIM_TARGET); if (task->data[0] < 0) { DestroyAnimVisualTask(taskId); return; } task->data[1] = 0; task->data[2] = 15; task->data[3] = 2; task->data[4] = 0; SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3])); gSprites[task->data[0]].data[0] = 80; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { gSprites[task->data[0]].data[1] = -144; gSprites[task->data[0]].data[2] = 112; } else { gSprites[task->data[0]].data[1] = 144; gSprites[task->data[0]].data[2] = -112; } gSprites[task->data[0]].data[3] = 0; gSprites[task->data[0]].data[4] = 0; StoreSpriteCallbackInData6(&gSprites[task->data[0]], SpriteCallbackDummy); gSprites[task->data[0]].callback = TranslateSpriteLinearFixedPoint; task->func = AnimTask_NightmareClone_Step; } static void AnimTask_NightmareClone_Step(u8 taskId) { struct Task *task; task = &gTasks[taskId]; switch (task->data[4]) { case 0: task->data[1] += 1; task->data[5] = task->data[1] & 3; if (task->data[5] == 1) if (task->data[2] > 0) task->data[2] -= 1; if (task->data[5] == 3) if (task->data[3] <= 15) task->data[3] += 1; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3])); if (task->data[3] != 16 || task->data[2] != 0) break; if (task->data[1] <= 80) break; DestroySpriteWithActiveSheet(&gSprites[task->data[0]]); task->data[4] = 1; break; case 1: if (++task->data[6] <= 1) break; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); task->data[4] += 1; break; case 2: DestroyAnimVisualTask(taskId); break; } } // Creates a blended copy of the target that wavers in front of them void AnimTask_SpiteTargetShadow(u8 taskId) { struct Task *task; task = &gTasks[taskId]; task->data[15] = 0; task->func = AnimTask_SpiteTargetShadow_Step1; task->func(taskId); } static void AnimTask_SpiteTargetShadow_Step1(u8 taskId) { s16 startLine; struct Task *task = &gTasks[taskId]; u8 position = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget); switch (task->data[15]) { case 0: task->data[14] = AllocSpritePalette(ANIM_TAG_BENT_SPOON); if (task->data[14] == 0xFF || task->data[14] == 0xF) { DestroyAnimVisualTask(taskId); } else { task->data[0] = CloneBattlerSpriteWithBlend(1); if (task->data[0] < 0) { FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON); DestroyAnimVisualTask(taskId); } else { s16 mask2; gSprites[task->data[0]].oam.paletteNum = task->data[14]; gSprites[task->data[0]].oam.objMode = ST_OAM_OBJ_NORMAL; gSprites[task->data[0]].oam.priority = 3; gSprites[task->data[0]].invisible = (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].invisible); task->data[1] = 0; task->data[2] = 0; task->data[3] = 16; task->data[13] = GetAnimBattlerSpriteId(ANIM_TARGET); task->data[4] = OBJ_PLTT_ID2(gSprites[task->data[13]].oam.paletteNum); if (position == 1) { u16 mask = DISPCNT_BG1_ON; mask2 = mask; } else { u16 mask = DISPCNT_BG2_ON; mask2 = mask; } ClearGpuRegBits(REG_OFFSET_DISPCNT, mask2); ++task->data[15]; } } break; case 1: task->data[14] = OBJ_PLTT_ID2(task->data[14]); CpuCopy32(&gPlttBufferUnfaded[task->data[4]], &gPlttBufferFaded[task->data[14]], PLTT_SIZE_4BPP); BlendPalette(task->data[4], 16, 10, RGB(13, 0, 15)); ++task->data[15]; break; case 2: startLine = gSprites[task->data[13]].y + gSprites[task->data[13]].y2 - 32; if (startLine < 0) startLine = 0; if (position == 1) task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 4, 1); else task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 8, 1); ++task->data[15]; break; case 3: if (position == 1) SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG1)); else SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG2)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); ++task->data[15]; break; case 4: if (position == 1) SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); else SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); task->func = AnimTask_SpiteTargetShadow_Step2; ++task->data[15]; break; default: ++task->data[15]; break; } } static void AnimTask_SpiteTargetShadow_Step2(u8 taskId) { struct Task *task = &gTasks[taskId]; ++task->data[1]; task->data[5] = task->data[1] & 1; if (task->data[5] == 0) task->data[2] = gSineTable[task->data[1]] / 18; if (task->data[5] == 1) task->data[3] = 16 - (gSineTable[task->data[1]] / 18); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3])); if (task->data[1] == 128) { task->data[15] = 0; task->func = AnimTask_SpiteTargetShadow_Step3; task->func(taskId); } } static void AnimTask_SpiteTargetShadow_Step3(u8 taskId) { struct Task *task = &gTasks[taskId]; u8 rank = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget); switch (task->data[15]) { case 0: gScanlineEffect.state = 3; task->data[14] = GetAnimBattlerSpriteId(ANIM_TARGET); if (rank == 1) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); else ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); break; case 1: BlendPalette(task->data[4], 16, 0, RGB(13, 0, 15)); break; case 2: gSprites[task->data[14]].invisible = TRUE; DestroySpriteWithActiveSheet(&gSprites[task->data[0]]); FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); if (rank == 1) SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); else SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); DestroyAnimVisualTask(taskId); break; } ++task->data[15]; } static void AnimDestinyBondWhiteShadow(struct Sprite *sprite) { s16 battler1X, battler1Y; s16 battler2X, battler2Y; s16 yDiff; if (gBattleAnimArgs[0] == 0) { battler1X = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); battler1Y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 28; battler2X = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); battler2Y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 28; } else { battler1X = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); battler1Y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 28; battler2X = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); battler2Y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 28; } yDiff = battler2Y - battler1Y; sprite->data[0] = battler1X * 16; sprite->data[1] = battler1Y * 16; sprite->data[2] = ((battler2X - battler1X) * 16) / gBattleAnimArgs[1]; sprite->data[3] = (yDiff * 16) / gBattleAnimArgs[1]; sprite->data[4] = gBattleAnimArgs[1]; sprite->data[5] = battler2X; sprite->data[6] = battler2Y; sprite->data[7] = sprite->data[4] / 2; sprite->oam.priority = 2; sprite->x = battler1X; sprite->y = battler1Y; sprite->callback = AnimDestinyBondWhiteShadow_Step; sprite->invisible = TRUE; } static void AnimDestinyBondWhiteShadow_Step(struct Sprite *sprite) { if (sprite->data[4]) { sprite->data[0] += sprite->data[2]; sprite->data[1] += sprite->data[3]; sprite->x = sprite->data[0] >> 4; sprite->y = sprite->data[1] >> 4; if (--sprite->data[4] == 0) sprite->data[0] = 0; } } void AnimTask_DestinyBondWhiteShadow(u8 taskId) { struct Task *task; s16 battler; u8 spriteId; s16 baseX, baseY; s16 x, y; task = &gTasks[taskId]; SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); task->data[5] = 0; task->data[6] = 0; task->data[7] = 0; task->data[8] = 0; task->data[9] = 16; task->data[10] = gBattleAnimArgs[0]; baseX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); baseY = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM); if (!IsContest()) { for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) { if (battler != gBattleAnimAttacker && battler != (gBattleAnimAttacker ^ 2) && IsBattlerSpriteVisible(battler)) { spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); if (spriteId != MAX_SPRITES) { x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2); y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_BOTTOM); gSprites[spriteId].data[0] = baseX << 4; gSprites[spriteId].data[1] = baseY << 4; gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1]; gSprites[spriteId].data[3] = ((y - baseY) << 4) / gBattleAnimArgs[1]; gSprites[spriteId].data[4] = gBattleAnimArgs[1]; gSprites[spriteId].data[5] = x; gSprites[spriteId].data[6] = y; gSprites[spriteId].callback = AnimDestinyBondWhiteShadow_Step; task->data[task->data[12] + 13] = spriteId; ++task->data[12]; } } } } else { spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); if (spriteId != MAX_SPRITES) { x = 48; y = 40; gSprites[spriteId].data[0] = baseX << 4; gSprites[spriteId].data[1] = baseY << 4; gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1]; gSprites[spriteId].data[3] = ((y - baseY) << 4) / gBattleAnimArgs[1]; gSprites[spriteId].data[4] = gBattleAnimArgs[1]; gSprites[spriteId].data[5] = x; gSprites[spriteId].data[6] = y; gSprites[spriteId].callback = AnimDestinyBondWhiteShadow_Step; task->data[13] = spriteId; task->data[12] = 1; } } task->func = AnimTask_DestinyBondWhiteShadow_Step; } static void AnimTask_DestinyBondWhiteShadow_Step(u8 taskId) { u32 i; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (task->data[6] == 0) { if (++task->data[5] > 1) { task->data[5] = 0; ++task->data[7]; if (task->data[7] & 1) { if (task->data[8] < 16) ++task->data[8]; } else { if (task->data[9]) --task->data[9]; } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[8], task->data[9])); if (task->data[7] >= 24) { task->data[7] = 0; task->data[6] = 1; } } } if (task->data[10]) --task->data[10]; else if (task->data[6]) ++task->data[0]; break; case 1: if (++task->data[5] > 1) { task->data[5] = 0; ++task->data[7]; if (task->data[7] & 1) { if (task->data[8]) --task->data[8]; } else if (task->data[9] < 16) { ++task->data[9]; } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[8], task->data[9])); if (task->data[8] == 0 && task->data[9] == 16) { for (i = 0; i < task->data[12]; ++i) DestroySprite(&gSprites[task->data[i + 13]]); ++task->data[0]; } } break; case 2: if (++task->data[5] > 0) ++task->data[0]; break; case 3: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimVisualTask(taskId); break; } } void AnimTask_CurseStretchingBlackBg(u8 taskId) { s16 startX, startY; s16 leftDistance, topDistance, bottomDistance, rightDistance; gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, ((WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR) | (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR))); SetGpuReg(REG_OFFSET_WINOUT, ((WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ) | (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR))); SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN)); SetGpuReg(REG_OFFSET_BLDY, 16); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest()) startX = 40; else startX = 200; gBattle_WIN0H = WIN_RANGE(startX, startX); startY = 40; gBattle_WIN0V = WIN_RANGE(startY, startY); leftDistance = startX; rightDistance = 240 - startX; topDistance = startY; bottomDistance = 72; gTasks[taskId].data[1] = leftDistance; gTasks[taskId].data[2] = rightDistance; gTasks[taskId].data[3] = topDistance; gTasks[taskId].data[4] = bottomDistance; gTasks[taskId].data[5] = startX; gTasks[taskId].data[6] = startY; gTasks[taskId].func = AnimTask_CurseStretchingBlackBg_Step1; } static void AnimTask_CurseStretchingBlackBg_Step1(u8 taskId) { s16 step, leftDistance, rightDistance, topDistance, bottomDistance, startX, startY; u16 left, right, top, bottom, selectedPalettes; step = gTasks[taskId].data[0]; ++gTasks[taskId].data[0]; leftDistance = gTasks[taskId].data[1]; rightDistance = gTasks[taskId].data[2]; topDistance = gTasks[taskId].data[3]; bottomDistance = gTasks[taskId].data[4]; startX = gTasks[taskId].data[5]; startY = gTasks[taskId].data[6]; if (step < 16) { left = startX - (leftDistance * 0.0625) * step; right = startX + (rightDistance * 0.0625) * step; top = startY - (topDistance * 0.0625) * step; bottom = startY + (bottomDistance * 0.0625) * step; } else { left = 0; right = 240; top = 0; bottom = 112; selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE); BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB(0, 0, 0)); gTasks[taskId].func = AnimTask_CurseStretchingBlackBg_Step2; } gBattle_WIN0H = WIN_RANGE(left, right); gBattle_WIN0V = WIN_RANGE(top, bottom); } static void AnimTask_CurseStretchingBlackBg_Step2(u8 taskId) { if (!gPaletteFade.active) { gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, ((WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR) | (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR))); SetGpuReg(REG_OFFSET_WINOUT, ((WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR) | (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR))); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDY, 0); DestroyAnimVisualTask(taskId); } } static void AnimCurseNail(struct Sprite *sprite) { s16 xDelta, xDelta2; InitSpritePosToAnimAttacker(sprite, 1); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { xDelta = 24; xDelta2 = -2; sprite->oam.matrixNum = ST_OAM_HFLIP; } else { xDelta = -24; xDelta2 = 2; } sprite->x += xDelta; sprite->data[1] = xDelta2; sprite->data[0] = 60; sprite->callback = AnimCurseNail_Step1; } static void AnimCurseNail_Step1(struct Sprite *sprite) { u16 var0; if (sprite->data[0] > 0) { --sprite->data[0]; } else { sprite->x2 += sprite->data[1]; var0 = sprite->x2 + 7; if (var0 > 14) { sprite->x += sprite->x2; sprite->x2 = 0; sprite->oam.tileNum += 8; if (++sprite->data[2] == 3) { sprite->data[0] = 30; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimCurseNail_Step2); } else { sprite->data[0] = 40; } } } } static void AnimCurseNail_Step2(struct Sprite *sprite) { if (sprite->data[0] == 0) { SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); ++sprite->data[0]; sprite->data[1] = 0; sprite->data[2] = 0; } else if (sprite->data[1] < 2) { ++sprite->data[1]; } else { sprite->data[1] = 0; ++sprite->data[2]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND2(16 - sprite->data[2], sprite->data[2])); if (sprite->data[2] == 16) { sprite->invisible = TRUE; sprite->callback = AnimCurseNail_End; } } } static void AnimCurseNail_End(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); gBattle_WIN0H = 0; gBattle_WIN0V = 0; DestroyAnimSprite(sprite); } static void AnimGhostStatusSprite(struct Sprite *sprite) { u16 coeffB, coeffA; sprite->x2 = Sin(sprite->data[0], 12); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x2 = -sprite->x2; sprite->data[0] = (sprite->data[0] + 6) & 0xFF; sprite->data[1] += 0x100; sprite->y2 = -(sprite->data[1] >> 8); ++sprite->data[7]; if (sprite->data[7] == 1) { sprite->data[6] = 0x050B; SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[6]); } else if (sprite->data[7] > 30) { ++sprite->data[2]; coeffB = sprite->data[6] >> 8; coeffA = sprite->data[6] & 0xFF; if (++coeffB > 16) coeffB = 16; --coeffA; if ((s16)coeffA < 0) coeffA = 0; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(coeffA, coeffB)); sprite->data[6] = BLDALPHA_BLEND(coeffA, coeffB); if (coeffB == 16 && coeffA == 0) { sprite->invisible = TRUE; sprite->callback = AnimGhostStatusSprite_End; } } } static void AnimGhostStatusSprite_End(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimSprite(sprite); } void AnimTask_GrudgeFlames(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[0] = 0; task->data[1] = 16; task->data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[10] = GetBattlerYCoordWithElevation(gBattleAnimAttacker); task->data[11] = (GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2) + 8; task->data[7] = 0; task->data[5] = GetBattlerSpriteBGPriority(gBattleAnimAttacker); task->data[6] = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 2; task->data[3] = 0; task->data[4] = 16; SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); task->data[8] = 0; task->func = AnimTask_GrudgeFlames_Step; } static void AnimTask_GrudgeFlames_Step(u8 taskId) { u32 i; u8 spriteId; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: for (i = 0; i < 6; ++i) { spriteId = CreateSprite(&gGrudgeFlameSpriteTemplate, task->data[9], task->data[10], task->data[6]); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[0] = taskId; gSprites[spriteId].data[1] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER; gSprites[spriteId].data[2] = (i * 42) & 0xFF; gSprites[spriteId].data[3] = task->data[11]; gSprites[spriteId].data[5] = i * 6; ++task->data[7]; } } ++task->data[0]; break; case 1: if (++task->data[1] & 1) { if (task->data[3] < 14) ++task->data[3]; } else if (task->data[4] > 4) { --task->data[4]; } if (task->data[3] == 14 && task->data[4] == 4) { task->data[1] = 0; ++task->data[0]; } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4])); break; case 2: if (++task->data[1] > 30) { task->data[1] = 0; ++task->data[0]; } break; case 3: if (++task->data[1] & 1) { if (task->data[3] > 0) --task->data[3]; } else if (task->data[4] < 16) { ++task->data[4]; } if (task->data[3] == 0 && task->data[4] == 16) { task->data[8] = 1; ++task->data[0]; } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4])); break; case 4: if (task->data[7] == 0) ++task->data[0]; break; case 5: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimVisualTask(taskId); break; } } static void AnimGrudgeFlame(struct Sprite *sprite) { u16 index; if (sprite->data[1] == 0) sprite->data[2] += 2; else sprite->data[2] -= 2; sprite->data[2] &= 0xFF; sprite->x2 = Sin(sprite->data[2], sprite->data[3]); index = sprite->data[2] - 65; if (index < 127) sprite->oam.priority = gTasks[sprite->data[0]].data[5] + 1; else sprite->oam.priority = gTasks[sprite->data[0]].data[5]; ++sprite->data[5]; sprite->data[6] = (sprite->data[5] * 8) & 0xFF; sprite->y2 = Sin(sprite->data[6], 7); if (gTasks[sprite->data[0]].data[8]) { --gTasks[sprite->data[0]].data[7]; DestroySprite(sprite); } } // Used by the ghost Marowak when it hasn't been revealed by the Silph Scope. // Animates a shimmering copy of the attacker (the ghost) accompanied by the 'Scary Face' graphics void AnimTask_GhostGetOut(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[15] = 0; task->func = AnimTask_GhostGetOut_Step1; task->func(taskId); } static void AnimTask_GhostGetOut_Step1(u8 taskId) { s16 y; struct BattleAnimBgData animBgData; struct Task *task = &gTasks[taskId]; u8 rank = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); switch (task->data[15]) { case 0: SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2); SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 1); task->data[1] = 0; task->data[2] = 0; task->data[3] = 16; task->data[4] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[5] = gSprites[task->data[4]].oam.priority; task->data[6] = OBJ_PLTT_ID2(gSprites[task->data[4]].oam.paletteNum); gSprites[task->data[4]].oam.objMode = ST_OAM_OBJ_BLEND; gSprites[task->data[4]].oam.priority = 3; task->data[7] = BG_PLTT_ID(8); break; case 1: ++task->data[1]; if (task->data[1] & 1) return; BlendPalette(task->data[6], 0x10, task->data[2], RGB(0, 23, 25)); BlendPalette(task->data[7], 0x10, task->data[2], RGB(0, 23, 25)); if (task->data[2] <= 11) { ++task->data[2]; return; } task->data[1] = 0; task->data[2] = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); break; case 2: SetAnimBgAttribute(2, BG_ANIM_CHAR_BASE_BLOCK, 1); SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 0); gBattle_BG2_X = 0; gBattle_BG2_Y = 0; SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); GetBattleAnimBgData(&animBgData, 2); AnimLoadCompressedBgGfx(animBgData.bgId, gBattleAnim_ScaryFaceGfx, animBgData.tilesOffset); LoadCompressedPalette(gBattleAnim_ScaryFacePal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; case 3: GetBattleAnimBgData(&animBgData, 2); gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000); LZDecompressWram(gBattleAnimBgTilemap_ScaryFacePlayer, gMonSpritesGfxPtr->multiUseBuffer); RelocateBattleBgPal(animBgData.paletteId, gMonSpritesGfxPtr->multiUseBuffer, 256, 0); CopyToBgTilemapBufferRect_ChangePalette(animBgData.bgId, gMonSpritesGfxPtr->multiUseBuffer, 0, 0, 0x20, 0x20, 0x11); CopyBgTilemapBufferToVram(2); FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer); break; case 4: ++task->data[1]; if (task->data[1] & 1) return; ++task->data[2]; --task->data[3]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3])); if (task->data[3]) return; task->data[1] = 0; task->data[2] = 0; task->data[3] = 16; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); break; case 5: if (rank == 1) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); else ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); break; case 6: y = gSprites[task->data[4]].y + gSprites[task->data[4]].y2 - 0x20; if (y < 0) y = 0; if (rank == 1) task->data[10] = ScanlineEffect_InitWave(y, y + 0x40, 4, 8, 0, 4, 1); else task->data[10] = ScanlineEffect_InitWave(y, y + 0x40, 4, 8, 0, 8, 1); break; case 7: BlendPalette(task->data[7], 0x10, 0xC, RGB(31, 31, 29)); if (rank == 1) SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); else SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); task->func = AnimTask_GhostGetOut_Step2; task->data[15] = 0; break; } ++task->data[15]; } static void AnimTask_GhostGetOut_Step2(u8 taskId) { struct Task *task = &gTasks[taskId]; ++task->data[1]; task->data[8] = task->data[1] & 1; if (!task->data[8]) task->data[2] = gSineTable[task->data[1]] / 18; if (task->data[8] == 1) task->data[3] = 16 - gSineTable[task->data[1]] / 18; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3])); if (task->data[1] == 128) { task->data[15] = 0; task->func = AnimTask_GhostGetOut_Step3; task->func(taskId); } } static void AnimTask_GhostGetOut_Step3(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[15]) { case 0: gScanlineEffect.state = 3; BlendPalette(task->data[7], 0x10, 0xC, RGB(0, 23, 25)); break; case 1: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0)); task->data[2] = 16; task->data[3] = 0; break; case 2: --task->data[2]; ++task->data[3]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3])); if (task->data[3] <= 15) return; SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2); SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); break; case 3: InitBattleAnimBg(2); FillPalette(RGB_BLACK, BG_PLTT_ID(9), PLTT_SIZE_4BPP); SetAnimBgAttribute(2, BG_ANIM_CHAR_BASE_BLOCK, 0); task->data[1] = 12; break; case 4: BlendPalette(task->data[6], 0x10, task->data[1], RGB(0, 23, 25)); BlendPalette(task->data[7], 0x10, task->data[1], RGB(0, 23, 25)); if ( task->data[1] ) { --task->data[1]; return; } task->data[1] = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); break; case 5: gSprites[task->data[4]].oam.priority = task->data[5]; gSprites[task->data[4]].oam.objMode = ST_OAM_OBJ_NORMAL; SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 1); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_NONE); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimVisualTask(taskId); break; } ++task->data[15]; } static void AnimMonMoveCircular(struct Sprite *sprite) { sprite->invisible = TRUE; sprite->data[5] = gBattlerSpriteIds[gBattleAnimAttacker]; sprite->data[0] = 128; sprite->data[1] = 10; sprite->data[2] = gBattleAnimArgs[0]; sprite->data[3] = gBattleAnimArgs[1]; sprite->callback = AnimMonMoveCircular_Step; gSprites[sprite->data[5]].y += 8; } static void AnimMonMoveCircular_Step(struct Sprite *sprite) { if (sprite->data[3]) { --sprite->data[3]; gSprites[sprite->data[5]].x2 = Sin(sprite->data[0], sprite->data[1]); gSprites[sprite->data[5]].y2 = Cos(sprite->data[0], sprite->data[1]); sprite->data[0] += sprite->data[2]; if (sprite->data[0] > 255) sprite->data[0] -= 256; } else { gSprites[sprite->data[5]].x2 = 0; gSprites[sprite->data[5]].y2 = 0; gSprites[sprite->data[5]].y -= 8; sprite->callback = DestroySpriteAndMatrix; } } ================================================ FILE: src/battle_anim_ground.c ================================================ #include "global.h" #include "battle_anim.h" #include "random.h" #include "scanline_effect.h" #include "task.h" #include "trig.h" static void AnimBonemerangProjectile(struct Sprite *sprite); static void AnimBoneHitProjectile(struct Sprite *sprite); static void AnimDirtScatter(struct Sprite *sprite); static void AnimMudSportDirt(struct Sprite *sprite); static void AnimDirtPlumeParticle(struct Sprite *sprite); static void AnimDigDirtMound(struct Sprite *sprite); static void AnimBonemerangProjectile_Step(struct Sprite *sprite); static void AnimBonemerangProjectile_End(struct Sprite *sprite); static void AnimMudSportDirtRising(struct Sprite *sprite); static void AnimMudSportDirtFalling(struct Sprite *sprite); static void AnimTask_DigBounceMovement(u8 taskId); static void AnimTask_DigDisappear(u8 taskId); static void SetDigScanlineEffect(u8 useBg1, s16 y, s16 endY); static void AnimTask_DigSetVisibleUnderground(u8 taskId); static void AnimTask_DigRiseUpFromHole(u8 taskId); static void AnimDirtPlumeParticle_Step(struct Sprite *sprite); static void AnimTask_ShakeTerrain(u8 taskId); static void AnimTask_ShakeBattlers(u8 taskId); static void SetBattlersXOffsetForShake(struct Task *task); static void WaitForFissureCompletion(u8 taskId); static const union AffineAnimCmd sAffineAnim_Bonemerang[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 15, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sAffineAnim_SpinningBone[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 20, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAffineAnims_Bonemerang[] = { sAffineAnim_Bonemerang, }; static const union AffineAnimCmd *const sAffineAnims_SpinningBone[] = { sAffineAnim_SpinningBone, }; const struct SpriteTemplate gBonemerangSpriteTemplate = { .tileTag = ANIM_TAG_BONE, .paletteTag = ANIM_TAG_BONE, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_Bonemerang, .callback = AnimBonemerangProjectile, }; const struct SpriteTemplate gSpinningBoneSpriteTemplate = { .tileTag = ANIM_TAG_BONE, .paletteTag = ANIM_TAG_BONE, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_SpinningBone, .callback = AnimBoneHitProjectile, }; const struct SpriteTemplate gSandAttackDirtSpriteTemplate = { .tileTag = ANIM_TAG_MUD_SAND, .paletteTag = ANIM_TAG_MUD_SAND, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDirtScatter, }; static const union AnimCmd sAnim_MudSlapMud[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END, }; static const union AnimCmd *const sAnims_MudSlapMud[] = { sAnim_MudSlapMud, }; const struct SpriteTemplate gMudSlapMudSpriteTemplate = { .tileTag = ANIM_TAG_MUD_SAND, .paletteTag = ANIM_TAG_MUD_SAND, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnims_MudSlapMud, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDirtScatter, }; const struct SpriteTemplate gMudsportMudSpriteTemplate = { .tileTag = ANIM_TAG_MUD_SAND, .paletteTag = ANIM_TAG_MUD_SAND, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMudSportDirt, }; const struct SpriteTemplate gDirtPlumeSpriteTemplate = { .tileTag = ANIM_TAG_MUD_SAND, .paletteTag = ANIM_TAG_MUD_SAND, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDirtPlumeParticle, }; const struct SpriteTemplate gDirtMoundSpriteTemplate = { .tileTag = ANIM_TAG_DIRT_MOUND, .paletteTag = ANIM_TAG_DIRT_MOUND, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDigDirtMound, }; // Moves a bone projectile towards the target mon, which moves like // a boomerang. After hitting the target mon, it comes back to the user. static void AnimBonemerangProjectile(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = 20; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[5] = -40; InitAnimArcTranslation(sprite); sprite->callback = AnimBonemerangProjectile_Step; } static void AnimBonemerangProjectile_Step(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; sprite->data[0] = 20; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[5] = 40; InitAnimArcTranslation(sprite); sprite->callback = AnimBonemerangProjectile_End; } } static void AnimBonemerangProjectile_End(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) DestroyAnimSprite(sprite); } // Moves a bone projectile towards the target mon, starting right next to // the target mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x pixel offset // arg 3: target y pixel offset // arg 4: duration static void AnimBoneHitProjectile(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Moves a small dirt projectile towards the target mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration // arg 3: target x pixel offset // arg 4: target y pixel offset static void AnimDirtScatter(struct Sprite *sprite) { u8 targetXPos, targetYPos; s16 xOffset, yOffset; InitSpritePosToAnimAttacker(sprite, 1); targetXPos = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2); targetYPos = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); xOffset = Random() & 0x1F; yOffset = Random() & 0x1F; if (xOffset > 16) xOffset = 16 - xOffset; if (yOffset > 16) yOffset = 16 - yOffset; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = targetXPos + xOffset; sprite->data[4] = targetYPos + yOffset; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } // Moves a particle of dirt in the Mud Sport animation. // The dirt can either be rising upward, or falling down. // arg 0: 0 = dirt is rising into the air, 1 = dirt is falling down // arg 1: initial x pixel offset // arg 2: initial y pixel offset static void AnimMudSportDirt(struct Sprite *sprite) { ++sprite->oam.tileNum; if (gBattleAnimArgs[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1; sprite->callback = AnimMudSportDirtRising; } else { sprite->x = gBattleAnimArgs[1]; sprite->y = gBattleAnimArgs[2]; sprite->y2 = -gBattleAnimArgs[2]; sprite->callback = AnimMudSportDirtFalling; } } static void AnimMudSportDirtRising(struct Sprite *sprite) { if (++sprite->data[1] > 1) { sprite->data[1] = 0; sprite->x += sprite->data[0]; } sprite->y -= 4; if (sprite->y < -4) DestroyAnimSprite(sprite); } static void AnimMudSportDirtFalling(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->y2 += 4; if (sprite->y2 >= 0) { sprite->y2 = 0; ++sprite->data[0]; } break; case 1: if (++sprite->data[1] > 0) { sprite->data[1] = 0; sprite->invisible ^= 1; if (++sprite->data[2] == 10) DestroyAnimSprite(sprite); } break; } } void AnimTask_DigDownMovement(u8 taskId) { struct Task *task = &gTasks[taskId]; if (gBattleAnimArgs[0] == FALSE) task->func = AnimTask_DigBounceMovement; else task->func = AnimTask_DigDisappear; task->func(taskId); } static void AnimTask_DigBounceMovement(u8 taskId) { u8 var0; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[11] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); if (task->data[11] == 1) { task->data[12] = gBattle_BG1_X; task->data[13] = gBattle_BG1_Y; } else { task->data[12] = gBattle_BG2_X; task->data[13] = gBattle_BG2_Y; } var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker); task->data[14] = var0 - 32; task->data[15] = var0 + 32; if (task->data[14] < 0) task->data[14] = 0; gSprites[task->data[10]].invisible = TRUE; ++task->data[0]; break; case 1: SetDigScanlineEffect(task->data[11], task->data[14], task->data[15]); ++task->data[0]; break; case 2: task->data[2] = (task->data[2] + 6) & 0x7F; if (++task->data[4] > 2) { task->data[4] = 0; ++task->data[3]; } task->data[5] = task->data[3] + (gSineTable[task->data[2]] >> 4); if (task->data[11] == 1) gBattle_BG1_Y = task->data[13] - task->data[5]; else gBattle_BG2_Y = task->data[13] - task->data[5]; if (task->data[5] > 63) { task->data[5] = 120 - task->data[14]; if (task->data[11] == 1) gBattle_BG1_Y = task->data[13] - task->data[5]; else gBattle_BG2_Y = task->data[13] - task->data[5]; gSprites[task->data[10]].x2 = 272 - gSprites[task->data[10]].x; ++task->data[0]; } break; case 3: gScanlineEffect.state = 3; ++task->data[0]; break; case 4: DestroyAnimVisualTask(taskId); gSprites[task->data[10]].invisible = TRUE; break; } } static void AnimTask_DigDisappear(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); gSprites[spriteId].invisible = TRUE; gSprites[spriteId].x2 = 0; gSprites[spriteId].y2 = 0; if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) gBattle_BG1_Y = 0; else gBattle_BG2_Y = 0; DestroyAnimVisualTask(taskId); } void AnimTask_DigUpMovement(u8 taskId) { struct Task *task = &gTasks[taskId]; if (gBattleAnimArgs[0] == FALSE) task->func = AnimTask_DigSetVisibleUnderground; else task->func = AnimTask_DigRiseUpFromHole; task->func(taskId); } static void AnimTask_DigSetVisibleUnderground(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER); gSprites[task->data[10]].invisible = FALSE; gSprites[task->data[10]].x2 = 0; gSprites[task->data[10]].y2 = DISPLAY_HEIGHT - gSprites[task->data[10]].y; ++task->data[0]; break; case 1: DestroyAnimVisualTask(taskId); } } static void AnimTask_DigRiseUpFromHole(u8 taskId) { u8 var0; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[11] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); if (task->data[11] == 1) task->data[12] = gBattle_BG1_X; else task->data[12] = gBattle_BG2_X; var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker); task->data[14] = var0 - 32; task->data[15] = var0 + 32; ++task->data[0]; break; case 1: SetDigScanlineEffect(task->data[11], 0, task->data[15]); ++task->data[0]; break; case 2: gSprites[task->data[10]].y2 = 96; ++task->data[0]; break; case 3: gSprites[task->data[10]].y2 -= 8; if (gSprites[task->data[10]].y2 == 0) { gScanlineEffect.state = 3; ++task->data[0]; } break; case 4: DestroyAnimVisualTask(taskId); break; } } static void SetDigScanlineEffect(u8 useBG1, s16 y, s16 endY) { s16 bgX; struct ScanlineEffectParams scanlineParams; if (useBG1 == 1) { bgX = gBattle_BG1_X; scanlineParams.dmaDest = ®_BG1HOFS; } else { bgX = gBattle_BG2_X; scanlineParams.dmaDest = ®_BG2HOFS; } if (y < 0) y = 0; while (y < endY) { gScanlineEffectRegBuffers[0][y] = bgX; gScanlineEffectRegBuffers[1][y] = bgX; ++y; } while (y < 160) { gScanlineEffectRegBuffers[0][y] = bgX + 240; gScanlineEffectRegBuffers[1][y] = bgX + 240; ++y; } scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; ScanlineEffect_SetParams(scanlineParams); } // Moves a particle of dirt in a plume of dirt. Used in Fissure and Dig. // arg 0: which mon (0 = attacker, 1 = target) // arg 1: which side of mon (0 = left, 1 = right) // arg 2: target x offset // arg 3: target y offset // arg 4: wave amplitude // arg 5: duration static void AnimDirtPlumeParticle(struct Sprite *sprite) { s8 battler; s16 xOffset; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; xOffset = 24; if (gBattleAnimArgs[1] == 1) { xOffset *= -1; gBattleAnimArgs[2] *= -1; } sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + xOffset; sprite->y = GetBattlerYCoordWithElevation(battler) + 30; sprite->data[0] = gBattleAnimArgs[5]; sprite->data[2] = sprite->x + gBattleAnimArgs[2]; sprite->data[4] = sprite->y + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[4]; InitAnimArcTranslation(sprite); sprite->callback = AnimDirtPlumeParticle_Step; } static void AnimDirtPlumeParticle_Step(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) DestroyAnimSprite(sprite); } // Displays the dirt mound seen in the move Dig for set duration. // The dirt mound image is too large for a single sprite, so two // sprites are lined up next to each other. // arg 0: which mon (0 = attacker, 1 = target) // arg 1: oam tile num (0 = left half of image, 1 = right half of image) // arg 2: duration static void AnimDigDirtMound(struct Sprite *sprite) { s8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X) - 16 + (gBattleAnimArgs[1] * 32); sprite->y = GetBattlerYCoordWithElevation(battler) + 32; sprite->oam.tileNum += gBattleAnimArgs[1] * 8; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->data[0] = gBattleAnimArgs[2]; sprite->callback = WaitAnimForDuration; } #define tState data[0] #define tDelay data[1] #define tTimer data[2] #define tMaxTime data[3] #define tbattlerSpriteIds(i) data[9 + (i)] #define tNumBattlers data[13] // AnimTask_ShakeBattlers #define tInitialX data[13] // AnimTask_ShakeTerrain #define tHorizOffset data[14] #define tInitHorizOffset data[15] // Shakes battler(s) or the battle terrain back and forth horizontally. Used by e.g. Earthquake, Eruption // arg0: What to shake. 0-3 for any specific battler, MAX_BATTLERS_COUNT for all battlers, MAX_BATTLERS_COUNT + 1 for the terrain // arg1: Shake intensity, used to calculate horizontal pixel offset (if 0, use move power instead) // arg2: Length of time to shake for void AnimTask_HorizontalShake(u8 taskId) { u32 i; struct Task *task = &gTasks[taskId]; if (gBattleAnimArgs[1] != 0) task->tHorizOffset = task->tInitHorizOffset = gBattleAnimArgs[1] + 3; else task->tHorizOffset = task->tInitHorizOffset = (gAnimMovePower / 10) + 3; task->tMaxTime = gBattleAnimArgs[2]; switch (gBattleAnimArgs[0]) { case MAX_BATTLERS_COUNT + 1: // Shake terrain task->tInitialX = gBattle_BG3_X; task->func = AnimTask_ShakeTerrain; break; case MAX_BATTLERS_COUNT: // Shake all battlers task->tNumBattlers = 0; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (IsBattlerSpriteVisible(i)) { task->tbattlerSpriteIds(task->tNumBattlers) = gBattlerSpriteIds[i]; task->tNumBattlers++; } } task->func = AnimTask_ShakeBattlers; break; default: // Shake specific battler task->tbattlerSpriteIds(0) = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); if (task->tbattlerSpriteIds(0) == SPRITE_NONE) { DestroyAnimVisualTask(taskId); } else { task->tNumBattlers = 1; task->func = AnimTask_ShakeBattlers; } break; } } static void AnimTask_ShakeTerrain(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: if (++task->tDelay > 1) { task->tDelay = 0; if ((task->tTimer & 1) == 0) gBattle_BG3_X = task->tInitialX + task->tInitHorizOffset; else gBattle_BG3_X = task->tInitialX - task->tInitHorizOffset; if (++task->tTimer == task->tMaxTime) { task->tTimer = 0; task->tHorizOffset--; task->tState++; } } break; case 1: if (++task->tDelay > 1) { task->tDelay = 0; if ((task->tTimer & 1) == 0) gBattle_BG3_X = task->tInitialX + task->tHorizOffset; else gBattle_BG3_X = task->tInitialX - task->tHorizOffset; if (++task->tTimer == 4) { task->tTimer = 0; if (--task->tHorizOffset == 0) task->tState++; } } break; case 2: gBattle_BG3_X = task->tInitialX; DestroyAnimVisualTask(taskId); break; } } static void AnimTask_ShakeBattlers(u8 taskId) { u32 i; struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: if (++task->tDelay > 1) { task->tDelay = 0; SetBattlersXOffsetForShake(task); if (++task->tTimer == task->tMaxTime) { task->tTimer = 0; task->tHorizOffset--; task->tState++; } } break; case 1: if (++task->tDelay > 1) { task->tDelay = 0; SetBattlersXOffsetForShake(task); if (++task->tTimer == 4) { task->tTimer = 0; if (--task->tHorizOffset == 0) task->tState++; } } break; case 2: for (i = 0; i < task->tNumBattlers; i++) gSprites[task->tbattlerSpriteIds(i)].x2 = 0; DestroyAnimVisualTask(taskId); break; } } static void SetBattlersXOffsetForShake(struct Task *task) { u16 i, xOffset; if ((task->tTimer & 1) == 0) xOffset = (task->tHorizOffset / 2) + (task->tHorizOffset & 1); else xOffset = -(task->tHorizOffset / 2); for (i = 0; i < task->tNumBattlers; i++) { gSprites[task->tbattlerSpriteIds(i)].x2 = xOffset; } } #undef tState #undef tDelay #undef tTimer #undef tMaxTime #undef tbattlerSpriteIds #undef tNumBattlers #undef tInitialX #undef tHorizOffset #undef tInitHorizOffset void AnimTask_IsPowerOver99(u8 taskId) { gBattleAnimArgs[15] = gAnimMovePower > 99; DestroyAnimVisualTask(taskId); } void AnimTask_PositionFissureBgOnBattler(u8 taskId) { struct Task *newTask; u8 battler = (gBattleAnimArgs[0] & 1) ? gBattleAnimTarget : gBattleAnimAttacker; if (gBattleAnimArgs[0] > 1) battler ^= BIT_FLANK; newTask = &gTasks[CreateTask(WaitForFissureCompletion, gBattleAnimArgs[1])]; newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2)) & 0x1FF; newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET)) & 0xFF; gBattle_BG3_X = newTask->data[1]; gBattle_BG3_Y = newTask->data[2]; newTask->data[3] = gBattleAnimArgs[2]; DestroyAnimVisualTask(taskId); } static void WaitForFissureCompletion(u8 taskId) { struct Task *task = &gTasks[taskId]; // Holds the BG3 offsets until gBattleAnimArgs[7] // is set to a special terminator value. if (gBattleAnimArgs[7] == task->data[3]) { gBattle_BG3_X = 0; gBattle_BG3_Y = 0; DestroyTask(taskId); } else { gBattle_BG3_X = task->data[1]; gBattle_BG3_Y = task->data[2]; } } ================================================ FILE: src/battle_anim_ice.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "graphics.h" #include "random.h" #include "task.h" #include "trig.h" #include "constants/battle_anim.h" struct HailStruct { s32 x:10; s32 y:10; s32 bPosition:8; s32 unk3:4; }; static void AnimUnusedIceCrystalThrow(struct Sprite *sprite); static void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite); static void AnimIcePunchSwirlingParticle(struct Sprite *sprite); static void AnimIceBeamParticle(struct Sprite *sprite); static void AnimIceEffectParticle(struct Sprite *sprite); static void AnimFlickerIceEffectParticle(struct Sprite *sprite); static void AnimSwirlingSnowball(struct Sprite *sprite); static void AnimSwirlingSnowball_Step1(struct Sprite *sprite); static void AnimSwirlingSnowball_Step2(struct Sprite *sprite); static void AnimSwirlingSnowball_End(struct Sprite *sprite); static void AnimMoveParticleBeyondTarget(struct Sprite *sprite); static void AnimWiggleParticleTowardsTarget(struct Sprite *sprite); static void AnimWaveFromCenterOfTarget(struct Sprite *sprite); static void InitSwirlingFogAnim(struct Sprite *sprite); static void AnimSwirlingFogAnim(struct Sprite *sprite); static void AnimThrowMistBall(struct Sprite *sprite); static void InitPoisonGasCloudAnim(struct Sprite *sprite); static void MovePoisonGasCloud(struct Sprite *sprite); static void AnimHailBegin(struct Sprite *sprite); static void AnimHailContinue(struct Sprite *sprite); static void InitIceBallAnim(struct Sprite *sprite); static void AnimThrowIceBall(struct Sprite *sprite); static void InitIceBallParticle(struct Sprite *sprite); static void AnimIceBallParticle(struct Sprite *sprite); static void AnimTask_HazeScrollingFog_Step(u8 taskId); static void AnimTask_MistBallFog_Step(u8 taskId); static void AnimTask_Hail2(u8 taskId); static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c); static const union AnimCmd sAnim_Unused[] = { ANIMCMD_FRAME(0, 5, .hFlip = TRUE), ANIMCMD_FRAME(1, 5, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_Unused[] = { sAnim_Unused, }; static const struct SpriteTemplate sUnusedIceCrystalThrowSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimUnusedIceCrystalThrow, }; static const union AnimCmd sAnim_IceCrystalLargeChunk[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_IceCrystalLarge[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_IceCrystalSmall[] = { ANIMCMD_FRAME(6, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Snowball[] = { ANIMCMD_FRAME(7, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_BlizzardIceCrystal[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_SmallBubblePair[] = { ANIMCMD_FRAME(12, 6), ANIMCMD_FRAME(13, 6), ANIMCMD_JUMP(0), }; // Unused, contains just the top left corner of the large ice crystal static const union AnimCmd *const sAnims_IceCrystalLargeChunk[] = { sAnim_IceCrystalLargeChunk, }; static const union AnimCmd *const sAnims_IceCrystalLarge[] = { sAnim_IceCrystalLarge, }; static const union AnimCmd *const sAnims_IceCrystalSmall[] = { sAnim_IceCrystalSmall, }; static const union AnimCmd *const sAnims_Snowball[] = { sAnim_Snowball, }; static const union AnimCmd *const sAnims_BlizzardIceCrystal[] = { sAnim_BlizzardIceCrystal, }; const union AnimCmd *const gAnims_SmallBubblePair[] = { sAnim_SmallBubblePair, }; static const union AffineAnimCmd sAffineAnim_IceCrystalSpiralInwardLarge[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 40, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAffineAnims_IceCrystalSpiralInwardLarge[] = { sAffineAnim_IceCrystalSpiralInwardLarge, }; const struct SpriteTemplate gIceCrystalSpiralInwardLarge = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineDouble_ObjBlend_8x16, .anims = sAnims_IceCrystalLarge, .images = NULL, .affineAnims = sAffineAnims_IceCrystalSpiralInwardLarge, .callback = AnimIcePunchSwirlingParticle, }; const struct SpriteTemplate gIceCrystalSpiralInwardSmall = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjBlend_8x8, .anims = sAnims_IceCrystalSmall, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimIcePunchSwirlingParticle, }; static const union AffineAnimCmd sAffineAnim_IceBeamInnerCrystal[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 10, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAffineAnims_IceBeamInnerCrystal[] = { sAffineAnim_IceBeamInnerCrystal, }; const struct SpriteTemplate gIceBeamInnerCrystalSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineNormal_ObjBlend_8x16, .anims = sAnims_IceCrystalLarge, .images = NULL, .affineAnims = sAffineAnims_IceBeamInnerCrystal, .callback = AnimIceBeamParticle, }; const struct SpriteTemplate gIceBeamOuterCrystalSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjBlend_8x8, .anims = sAnims_IceCrystalSmall, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimIceBeamParticle, }; static const union AffineAnimCmd sAffineAnim_IceCrystalHit[] = { AFFINEANIMCMD_FRAME(0xCE, 0xCE, 0, 0), AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 10), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_IceCrystalHit[] = { sAffineAnim_IceCrystalHit, }; const struct SpriteTemplate gIceCrystalHitLargeSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineNormal_ObjBlend_8x16, .anims = sAnims_IceCrystalLarge, .images = NULL, .affineAnims = sAffineAnims_IceCrystalHit, .callback = AnimIceEffectParticle, }; const struct SpriteTemplate gIceCrystalHitSmallSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineNormal_ObjBlend_8x8, .anims = sAnims_IceCrystalSmall, .images = NULL, .affineAnims = sAffineAnims_IceCrystalHit, .callback = AnimIceEffectParticle, }; const struct SpriteTemplate gSwirlingSnowballSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_Snowball, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSwirlingSnowball, }; const struct SpriteTemplate gBlizzardIceCrystalSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnims_BlizzardIceCrystal, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveParticleBeyondTarget, }; const struct SpriteTemplate gPowderSnowSnowballSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_Snowball, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveParticleBeyondTarget, }; static const union AnimCmd sAnim_IceGroundSpike[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(6, 5), ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_IceGroundSpike[] = { sAnim_IceGroundSpike, }; const struct SpriteTemplate gIceGroundSpikeSpriteTemplate = { .tileTag = ANIM_TAG_ICE_SPIKES, .paletteTag = ANIM_TAG_ICE_SPIKES, .oam = &gOamData_AffineOff_ObjBlend_8x16, .anims = sAnims_IceGroundSpike, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWaveFromCenterOfTarget, }; static const union AnimCmd sAnim_Cloud[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(8, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_Cloud[] = { sAnim_Cloud, }; const struct SpriteTemplate gMistCloudSpriteTemplate = { .tileTag = ANIM_TAG_MIST_CLOUD, .paletteTag = ANIM_TAG_MIST_CLOUD, .oam = &gOamData_AffineOff_ObjBlend_32x16, .anims = sAnims_Cloud, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = InitSwirlingFogAnim, }; const struct SpriteTemplate gSmogCloudSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_GAS_CLOUD, .paletteTag = ANIM_TAG_PURPLE_GAS_CLOUD, .oam = &gOamData_AffineOff_ObjBlend_32x16, .anims = sAnims_Cloud, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = InitSwirlingFogAnim, }; static const u8 sHazeBlendAmounts[] = { 0, 1, 2, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 6, 7, 8, 8, 8, 9, }; const struct SpriteTemplate gMistBallSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThrowMistBall, }; static const u8 sMistBlendAmounts[] = { 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, }; const struct SpriteTemplate gPoisonGasCloudSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_GAS_CLOUD, .paletteTag = ANIM_TAG_PURPLE_GAS_CLOUD, .oam = &gOamData_AffineOff_ObjBlend_32x16, .anims = sAnims_Cloud, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = InitPoisonGasCloudAnim, }; static const struct HailStruct sHailCoordData[] = { {.x = 100, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2}, {.x = 85, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 0}, {.x = 242, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 1}, {.x = 66, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 1}, {.x = 182, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 0}, {.x = 60, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2}, {.x = 214, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 0}, {.x = 113, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 1}, {.x = 210, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 1}, {.x = 38, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 0}, }; static const union AffineAnimCmd sAffineAnim_HailParticle_0[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_HailParticle_1[] = { AFFINEANIMCMD_FRAME(0xF0, 0xF0, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_HailParticle_2[] = { AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_WeatherBallIceDown[] = { AFFINEANIMCMD_FRAME(0x150, 0x150, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_HailParticle[] = { sAffineAnim_HailParticle_0, sAffineAnim_HailParticle_1, sAffineAnim_HailParticle_2, }; static const union AffineAnimCmd *const sAffineAnims_WeatherBallIceDown[] = { sAffineAnim_WeatherBallIceDown, }; static const struct SpriteTemplate sHailParticleSpriteTemplate = { .tileTag = ANIM_TAG_HAIL, .paletteTag = ANIM_TAG_HAIL, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_HailParticle, .callback = AnimHailBegin, }; const struct SpriteTemplate gWeatherBallIceDownSpriteTemplate = { .tileTag = ANIM_TAG_HAIL, .paletteTag = ANIM_TAG_HAIL, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_WeatherBallIceDown, .callback = AnimWeatherBallDown, }; static const union AnimCmd sAnim_IceBallChunk_0[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_IceBallChunk_1[] = { ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_FRAME(64, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnims_IceBallChunk[] = { sAnim_IceBallChunk_0, sAnim_IceBallChunk_1, }; static const union AffineAnimCmd sAffineAnim_IceBallChunk_0[] = { AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_IceBallChunk_1[] = { AFFINEANIMCMD_FRAME(0x118, 0x118, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_IceBallChunk_2[] = { AFFINEANIMCMD_FRAME(0x150, 0x150, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_IceBallChunk_3[] = { AFFINEANIMCMD_FRAME(0x180, 0x180, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_IceBallChunk_4[] = { AFFINEANIMCMD_FRAME(0x1C0, 0x1C0, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_IceBallChunk[] = { sAffineAnim_IceBallChunk_0, sAffineAnim_IceBallChunk_1, sAffineAnim_IceBallChunk_2, sAffineAnim_IceBallChunk_3, sAffineAnim_IceBallChunk_4, }; const struct SpriteTemplate gIceBallChunkSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CHUNK, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = sAnims_IceBallChunk, .images = NULL, .affineAnims = sAffineAnims_IceBallChunk, .callback = InitIceBallAnim, }; const struct SpriteTemplate gIceBallImpactShardSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_IceCrystalSmall, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = InitIceBallParticle, }; static void AnimUnusedIceCrystalThrow(struct Sprite *sprite) { s16 targetX, targetY, attackerX, attackerY; sprite->oam.tileNum += 7; targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = gBattleAnimArgs[0] + attackerX; sprite->data[2] = gBattleAnimArgs[2] + targetX; sprite->data[3] = gBattleAnimArgs[1] + attackerY; sprite->data[4] = gBattleAnimArgs[3] + targetY; ConvertPosDataToTranslateLinearData(sprite); // won't match with while loop for (; (targetX >= -32 && targetX <= DISPLAY_WIDTH + 32) && (targetY >= -32 && targetY <= DISPLAY_HEIGHT + 32); targetX += sprite->data[1], targetY += sprite->data[2]) ; sprite->data[1] = -sprite->data[1]; sprite->data[2] = -sprite->data[2]; for (; (attackerX >= -32 && attackerX <= DISPLAY_WIDTH + 32) && (attackerY >= -32 && attackerY <= DISPLAY_HEIGHT + 32); attackerX += sprite->data[1], attackerY += sprite->data[2]) ; sprite->x = attackerX; sprite->y = attackerY; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = attackerX; sprite->data[2] = targetX; sprite->data[3] = attackerY; sprite->data[4] = targetY; ConvertPosDataToTranslateLinearData(sprite); sprite->data[3] = gBattleAnimArgs[5]; sprite->data[4] = gBattleAnimArgs[6]; sprite->callback = AnimUnusedIceCrystalThrow_Step; } static void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite) { if (sprite->data[0] != 0) { sprite->data[5] += sprite->data[1]; sprite->data[6] += sprite->data[2]; sprite->x2 = sprite->data[5]; sprite->y2 = sprite->data[6]; sprite->x2 += Sin(sprite->data[7], sprite->data[3]); sprite->y2 += Sin(sprite->data[7], sprite->data[3]); sprite->data[7] = (sprite->data[7] + sprite->data[4]) & 0xFF; --sprite->data[0]; } else { DestroyAnimSprite(sprite); } } // Animates the swirling ice crystals in Ice Punch. // arg 0: initial position angle around circle (0-256) static void AnimIcePunchSwirlingParticle(struct Sprite *sprite) { sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = 60; sprite->data[2] = 9; sprite->data[3] = 30; sprite->data[4] = -512; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteInGrowingCircle; sprite->callback(sprite); } // Animates the ice particles in Ice Beam. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x offset // arg 3: target y offset // arg 4: duration static void AnimIceBeamParticle(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->data[2] -= gBattleAnimArgs[2]; else sprite->data[2] += gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; sprite->data[0] = gBattleAnimArgs[4]; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = StartAnimLinearTranslation; } // Animates the ice crystals at the end of Ice Punch, Ice Beam, Tri Attack, // Weather Ball (Hail), Blizzard, and Powder Snow. // arg 0: target x offset // arg 1: target y offset // arg 2: ??? unknown boolean static void AnimIceEffectParticle(struct Sprite *sprite) { if (gBattleAnimArgs[2] == 0) { InitSpritePosToAnimTarget(sprite, TRUE); } else { SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->x, &sprite->y); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } StoreSpriteCallbackInData6(sprite, AnimFlickerIceEffectParticle); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } static void AnimFlickerIceEffectParticle(struct Sprite *sprite) { sprite->invisible ^= 1; if (++sprite->data[0] == 20) DestroySpriteAndMatrix(sprite); } // Animates the small snowballs that swirl around the target in Blizzard and Icy Wind. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x offset // arg 3: target y offset // arg 4: particle speed // arg 5: multiple targets? (boolean) static void AnimSwirlingSnowball(struct Sprite *sprite) { s32 i; s16 tempDataHolder[8]; InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; if (!gBattleAnimArgs[5]) { sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; } else { SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); } if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->data[2] -= gBattleAnimArgs[2]; else sprite->data[2] += gBattleAnimArgs[2]; for (i = 0; i < 8; ++i) tempDataHolder[i] = sprite->data[i]; InitAnimFastLinearTranslationWithSpeed(sprite); sprite->data[1] ^= 1; sprite->data[2] ^= 1; while (1) { sprite->data[0] = 1; AnimFastTranslateLinear(sprite); if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16 || sprite->x + sprite->x2 < -16 || sprite->y + sprite->y2 > DISPLAY_HEIGHT || sprite->y + sprite->y2 < -16) break; } sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = sprite->y2 = 0; for (i = 0; i < 8; ++i) sprite->data[i] = tempDataHolder[i]; sprite->callback = InitAnimFastLinearTranslationWithSpeedAndPos; StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step1); } static void AnimSwirlingSnowball_Step1(struct Sprite *sprite) { s16 tempVar; sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; sprite->data[0] = 128; tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20; sprite->data[3] = Sin(sprite->data[0], tempVar); sprite->data[4] = Cos(sprite->data[0], 0xF); sprite->data[5] = 0; sprite->callback = AnimSwirlingSnowball_Step2; sprite->callback(sprite); } static void AnimSwirlingSnowball_Step2(struct Sprite *sprite) { s16 tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20; if (sprite->data[5] <= 31) { sprite->x2 = Sin(sprite->data[0], tempVar) - sprite->data[3]; sprite->y2 = Cos(sprite->data[0], 15) - sprite->data[4]; sprite->data[0] = (sprite->data[0] + 16) & 0xFF; sprite->data[5] += 1; } else { sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = sprite->y2 = 0; sprite->data[3] = sprite->data[4] = 0; sprite->callback = AnimSwirlingSnowball_End; } } static void AnimSwirlingSnowball_End(struct Sprite *sprite) { sprite->data[0] = 1; AnimFastTranslateLinear(sprite); if ((u32)(sprite->x + sprite->x2 + 16) > 272 || sprite->y + sprite->y2 > 256 || sprite->y + sprite->y2 < -16) DestroyAnimSprite(sprite); } // Moves particles towards the target mon and off the screen. Used to animate // the large snowballs in Blizzard and the small snowballs in Powder Snow. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x offset // arg 3: target y offset // arg 4: speed // arg 5: wave amplitude // arg 6: wave frequency // arg 7: multiple targets? (boolean) static void AnimMoveParticleBeyondTarget(struct Sprite *sprite) { s32 i; s16 tempDataHolder[8]; InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; if (!gBattleAnimArgs[7]) { sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } else { SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); } if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->data[2] -= gBattleAnimArgs[2]; else sprite->data[2] += gBattleAnimArgs[2]; sprite->data[4] += gBattleAnimArgs[3]; InitAnimFastLinearTranslationWithSpeed(sprite); for (i = 0; i < 8; ++i) tempDataHolder[i] = sprite->data[i]; sprite->data[1] ^= 1; sprite->data[2] ^= 1; while (1) { sprite->data[0] = 1; AnimFastTranslateLinear(sprite); if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16 || sprite->x + sprite->x2 < -16 || sprite->y + sprite->y2 > DISPLAY_HEIGHT || sprite->y + sprite->y2 < -16) break; } sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; for (i = 0; i < 8; ++i) sprite->data[i] = tempDataHolder[i]; sprite->data[5] = gBattleAnimArgs[5]; sprite->data[6] = gBattleAnimArgs[6]; sprite->callback = AnimWiggleParticleTowardsTarget; } // Moves particles in a sine wave towards the target. static void AnimWiggleParticleTowardsTarget(struct Sprite *sprite) { AnimFastTranslateLinear(sprite); if (sprite->data[0] == 0) sprite->data[0] = 1; sprite->y2 += Sin(sprite->data[7], sprite->data[5]); sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF; if (sprite->data[0] == 1) { if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16 || sprite->x + sprite->x2 < -16 || sprite->y + sprite->y2 > DISPLAY_HEIGHT || sprite->y + sprite->y2 < -16) DestroyAnimSprite(sprite); } } // Animates the ice pilar wave used by Icy Wind. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: ??? unknown boolean static void AnimWaveFromCenterOfTarget(struct Sprite *sprite) { if (sprite->data[0] == 0) { if (gBattleAnimArgs[2] == 0) { InitSpritePosToAnimTarget(sprite, FALSE); } else { SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } ++sprite->data[0]; } else { if (sprite->animEnded) DestroyAnimSprite(sprite); } } // Animates the fog that swirls around the mon in Mist and Smog. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: change in y pixels per rotation // arg 3: duration // arg 4: animate on opponent? (boolean) // arg 5: ??? unknown boolean static void InitSwirlingFogAnim(struct Sprite *sprite) { s16 tempVar; u8 battler; if (gBattleAnimArgs[4] == 0) { if (gBattleAnimArgs[5] == 0) { InitSpritePosToAnimAttacker(sprite, FALSE); } else { SetAverageBattlerPositions(gBattleAnimAttacker, 0, &sprite->x, &sprite->y); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } battler = gBattleAnimAttacker; } else { if (gBattleAnimArgs[5] == 0) { InitSpritePosToAnimTarget(sprite, FALSE); } else { SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y); if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } battler = gBattleAnimTarget; } sprite->data[7] = battler; if (gBattleAnimArgs[5] == 0 || !IsDoubleBattle()) tempVar = 0x20; else tempVar = 0x40; sprite->data[6] = tempVar; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) sprite->y += 8; sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = sprite->x; sprite->data[2] = sprite->x; sprite->data[3] = sprite->y; sprite->data[4] = sprite->y + gBattleAnimArgs[2]; InitAnimLinearTranslation(sprite); sprite->data[5] = 64; sprite->callback = AnimSwirlingFogAnim; sprite->callback(sprite); } // Animates swirling fog initialized by InitSwirlingFogAnim. static void AnimSwirlingFogAnim(struct Sprite *sprite) { if (!AnimTranslateLinear(sprite)) { sprite->x2 += Sin(sprite->data[5], sprite->data[6]); sprite->y2 += Cos(sprite->data[5], -6); if ((u16)(sprite->data[5] - 64) <= 0x7F) sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]); else sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]) + 1; sprite->data[5] = (sprite->data[5] + 3) & 0xFF; } else { DestroyAnimSprite(sprite); } } // Fades mons to black and places foggy overlay in Haze. void AnimTask_HazeScrollingFog(u8 taskId) { struct BattleAnimBgData animBg; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); GetBattleAnimBg1Data(&animBg); LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset); AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimFogTilemap); LoadPalette(&gDefaultWeatherSpritePalette, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); if (IsContest()) RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0); gTasks[taskId].func = AnimTask_HazeScrollingFog_Step; } static void AnimTask_HazeScrollingFog_Step(u8 taskId) { struct BattleAnimBgData animBg; gBattle_BG1_X += -1; switch (gTasks[taskId].data[12]) { case 0: if (++gTasks[taskId].data[10] == 4) { gTasks[taskId].data[10] = 0; ++gTasks[taskId].data[9]; gTasks[taskId].data[11] = sHazeBlendAmounts[gTasks[taskId].data[9]]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 9) { ++gTasks[taskId].data[12]; gTasks[taskId].data[11] = 0; } } break; case 1: if (++gTasks[taskId].data[11] == 0x51) { gTasks[taskId].data[11] = 9; ++gTasks[taskId].data[12]; } break; case 2: if (++gTasks[taskId].data[10] == 4) { gTasks[taskId].data[10] = 0; --gTasks[taskId].data[11]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 0) { ++gTasks[taskId].data[12]; gTasks[taskId].data[11] = 0; } } break; case 3: GetBattleAnimBg1Data(&animBg); InitBattleAnimBg(1); InitBattleAnimBg(2); ++gTasks[taskId].data[12]; // fall through case 4: if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); DestroyAnimVisualTask(taskId); break; } } // Throws the ball in Mist Ball. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: targey x offset // arg 3: target y offset // arg 4: duration // arg 5: ??? unknown (seems to vibrate target mon somehow) static void AnimThrowMistBall(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = TranslateAnimSpriteToTargetMonLocation; } void AnimTask_MistBallFog(u8 taskId) { struct BattleAnimBgData animBg; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); GetBattleAnimBg1Data(&animBg); LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset); AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimFogTilemap); LoadPalette(&gDefaultWeatherSpritePalette, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); if (IsContest()) RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0); gTasks[taskId].data[15] = -1; gTasks[taskId].func = AnimTask_MistBallFog_Step; } static void AnimTask_MistBallFog_Step(u8 taskId) { struct BattleAnimBgData animBg; gBattle_BG1_X += gTasks[taskId].data[15]; switch (gTasks[taskId].data[12]) { case 0: gTasks[taskId].data[9] += 1; gTasks[taskId].data[11] = sMistBlendAmounts[gTasks[taskId].data[9]]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 17 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 5) { ++gTasks[taskId].data[12]; gTasks[taskId].data[11] = 0; } break; case 1: if (++gTasks[taskId].data[11] == 0x51) { gTasks[taskId].data[11] = 5; ++gTasks[taskId].data[12]; } break; case 2: if (++gTasks[taskId].data[10] == 4) { gTasks[taskId].data[10] = 0; gTasks[taskId].data[11] -= 1; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 0) { ++gTasks[taskId].data[12]; gTasks[taskId].data[11] = 0; } } break; case 3: GetBattleAnimBg1Data(&animBg); InitBattleAnimBg(1); InitBattleAnimBg(2); ++gTasks[taskId].data[12]; // fall through case 4: if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); DestroyAnimVisualTask(taskId); break; } } // Initializes gas clouds in the Poison Gas animation. // arg 0: duration // arg 1: ? target x offset // arg 2: ? target y offset // arg 3: ? swirl start x // arg 4: ? swirl start y // arg 5: ??? unknown // arg 6: ??? unknown // arg 7: ??? unknown boolean static void InitPoisonGasCloudAnim(struct Sprite *sprite) { sprite->data[0] = gBattleAnimArgs[0]; if (GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) < GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2)) sprite->data[7] = 0x8000; if ((gBattlerPositions[gBattleAnimTarget] & BIT_SIDE) == B_SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; if ((sprite->data[7] & 0x8000) && (gBattlerPositions[gBattleAnimAttacker] & BIT_SIDE) == B_SIDE_PLAYER) sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1; sprite->data[6] = 1; } sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); if (gBattleAnimArgs[7]) { sprite->data[1] = sprite->x + gBattleAnimArgs[1]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[3]; sprite->data[3] = sprite->y + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[4]; sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8; } else { sprite->data[1] = sprite->x + gBattleAnimArgs[1]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[3]; sprite->data[3] = sprite->y + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[4]; sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8; } if (IsContest()) { sprite->data[6] = 1; sprite->subpriority = 0x80; } InitAnimLinearTranslation(sprite); sprite->callback = MovePoisonGasCloud; } static void MovePoisonGasCloud(struct Sprite *sprite) { s32 value; switch (sprite->data[7] & 0xFF) { case 0: AnimTranslateLinear(sprite); value = gSineTable[sprite->data[5]]; sprite->x2 += value >> 4; if (sprite->data[6]) sprite->data[5] = (sprite->data[5] - 8) & 0xFF; else sprite->data[5] = (sprite->data[5] + 8) & 0xFF; if (sprite->data[0] <= 0) { sprite->data[0] = 80; sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->data[1] = sprite->x; sprite->data[2] = sprite->x; sprite->y += sprite->y2; sprite->data[3] = sprite->y; sprite->data[4] = sprite->y + 29; ++sprite->data[7]; if (IsContest()) sprite->data[5] = 80; else if (GET_BATTLER_SIDE2(gBattleAnimTarget) != B_SIDE_PLAYER) sprite->data[5] = 204; else sprite->data[5] = 80; sprite->y2 = 0; value = gSineTable[sprite->data[5]]; sprite->x2 = value >> 3; sprite->data[5] = (sprite->data[5] + 2) & 0xFF; InitAnimLinearTranslation(sprite); } break; case 1: AnimTranslateLinear(sprite); value = gSineTable[sprite->data[5]]; sprite->x2 += value >> 3; sprite->y2 += (gSineTable[sprite->data[5] + 0x40] * -3) >> 8; if (!IsContest()) { u16 var0 = sprite->data[5] - 0x40; if (var0 <= 0x7F) sprite->oam.priority = sprite->data[7] >> 8; else sprite->oam.priority = (sprite->data[7] >> 8) + 1; sprite->data[5] = (sprite->data[5] + 4) & 0xFF; } else { u16 var0 = sprite->data[5] - 0x40; if (var0 <= 0x7F) sprite->subpriority = 128; else sprite->subpriority = 140; sprite->data[5] = (sprite->data[5] - 4) & 0xFF; } if (sprite->data[0] <= 0) { sprite->data[0] = 0x300; sprite->data[1] = sprite->x += sprite->x2; sprite->data[3] = sprite->y += sprite->y2; sprite->data[4] = sprite->y + 4; if (IsContest()) sprite->data[2] = -0x10; else if (GET_BATTLER_SIDE2(gBattleAnimTarget) != B_SIDE_PLAYER) sprite->data[2] = 0x100; else sprite->data[2] = -0x10; ++sprite->data[7]; sprite->x2 = sprite->y2 = 0; InitAnimLinearTranslationWithSpeed(sprite); } break; case 2: if (AnimTranslateLinear(sprite)) { if (sprite->oam.affineMode & 1) { FreeOamMatrix(sprite->oam.matrixNum); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; } DestroySprite(sprite); --gAnimVisualTaskCount; } break; } } // Creates Hail. void AnimTask_Hail(u8 taskId) { struct Task *task = &gTasks[taskId]; task->func = AnimTask_Hail2; } static void AnimTask_Hail2(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (++task->data[4] > 2) { task->data[4] = 0; task->data[5] = 0; task->data[2] = 0; ++task->data[0]; } break; case 1: if (task->data[5] == 0) { if (GenerateHailParticle(task->data[3], task->data[2], taskId, 1)) ++task->data[1]; if (++task->data[2] == 3) { if (++task->data[3] == 10) ++task->data[0]; else --task->data[0]; } else { task->data[5] = 1; } } else { --task->data[5]; } break; case 2: if (task->data[1] == 0) DestroyAnimVisualTask(taskId); break; } } static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c) { u8 id; s16 battlerX, battlerY; s16 spriteX; bool8 possibleBool = FALSE; s8 unk = sHailCoordData[hailStructId].unk3; if (unk != 2) { id = GetBattlerAtPosition(sHailCoordData[hailStructId].bPosition); if (IsBattlerSpriteVisible(id)) { possibleBool = TRUE; battlerX = GetBattlerSpriteCoord(id, BATTLER_COORD_X_2); battlerY = GetBattlerSpriteCoord(id, BATTLER_COORD_Y_PIC_OFFSET); switch (unk) { case 0: battlerX -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6; battlerY -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6; break; case 1: battlerX += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6; battlerY += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6; break; } } else { battlerX = sHailCoordData[hailStructId].x; battlerY = sHailCoordData[hailStructId].y; } } else { battlerX = sHailCoordData[hailStructId].x; battlerY = sHailCoordData[hailStructId].y; } spriteX = battlerX - ((battlerY + 8) / 2); id = CreateSprite(&sHailParticleSpriteTemplate, spriteX, -8, 18); if (id == MAX_SPRITES) { return FALSE; } else { StartSpriteAffineAnim(&gSprites[id], affineAnimNum); gSprites[id].data[0] = possibleBool; gSprites[id].data[3] = battlerX; gSprites[id].data[4] = battlerY; gSprites[id].data[5] = affineAnimNum; gSprites[id].data[6] = taskId; gSprites[id].data[7] = c; return TRUE; } } static void AnimHailBegin(struct Sprite *sprite) { u8 spriteId; sprite->x += 4; sprite->y += 8; if (sprite->x < sprite->data[3] && sprite->y < sprite->data[4]) return; if (sprite->data[0] == 1 && sprite->data[5] == 0) { spriteId = CreateSprite(&gIceCrystalHitLargeSpriteTemplate, sprite->data[3], sprite->data[4], sprite->subpriority); sprite->data[0] = spriteId; if (spriteId != 64) { gSprites[sprite->data[0]].callback = AnimHailContinue; gSprites[sprite->data[0]].data[6] = sprite->data[6]; gSprites[sprite->data[0]].data[7] = sprite->data[7]; } FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } else { --gTasks[sprite->data[6]].data[sprite->data[7]]; FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } } static void AnimHailContinue(struct Sprite *sprite) { if (++sprite->data[0] == 20) { --gTasks[sprite->data[6]].data[sprite->data[7]]; FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } } // Initializes the animation for Ice Ball. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: target x offset // arg 3: target y offset // arg 4: duration // arg 5: arc height (negative) static void InitIceBallAnim(struct Sprite *sprite) { u8 animNum = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1; if (animNum > 4) animNum = 4; StartSpriteAffineAnim(sprite, animNum); InitSpritePosToAnimAttacker(sprite, 1); sprite->data[0] = gBattleAnimArgs[4]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); sprite->callback = AnimThrowIceBall; } // Throws the ball of ice in Ice Ball. static void AnimThrowIceBall(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { StartSpriteAnim(sprite, 1); sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } } // Initializes the particles that scatter at the end of the Ice Ball animation. static void InitIceBallParticle(struct Sprite *sprite) { s16 randA, randB; sprite->oam.tileNum += 8; InitSpritePosToAnimTarget(sprite, TRUE); randA = (Random() & 0xFF) + 256; randB = Random() & 0x1FF; if (randB > 0xFF) randB = 256 - randB; sprite->data[1] = randA; sprite->data[2] = randB; sprite->callback = AnimIceBallParticle; } // Animates the particles created by InitIceBallParticle. static void AnimIceBallParticle(struct Sprite *sprite) { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; if (sprite->data[1] & 1) sprite->x2 = -(sprite->data[3] >> 8); else sprite->x2 = sprite->data[3] >> 8; sprite->y2 = sprite->data[4] >> 8; if (++sprite->data[0] == 21) DestroyAnimSprite(sprite); } // Counter for Ice Ball. void AnimTask_GetRolloutCounter(u8 taskId) { u8 arg = gBattleAnimArgs[0]; gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1; DestroyAnimVisualTask(taskId); } ================================================ FILE: src/battle_anim_mon_movement.c ================================================ #include "global.h" #include "battle.h" #include "battle_anim.h" #include "task.h" #include "trig.h" #undef abs #define abs(x) ((x) < 0 ? -(x) : (x)) static void AnimTask_ShakeMon_Step(u8 taskId); static void AnimTask_ShakeMon2Step(u8 taskId); static void AnimTask_ShakeMonInPlace_Step(u8 taskId); static void AnimTask_ShakeAndSinkMon_Step(u8 taskId); static void AnimTask_TranslateMonElliptical_Step(u8 taskId); static void DoHorizontalLunge(struct Sprite *sprite); static void ReverseHorizontalLungeDirection(struct Sprite *sprite); static void DoVerticalDip(struct Sprite *sprite); static void ReverseVerticalDipDirection(struct Sprite *sprite); static void SlideMonToOriginalPos(struct Sprite *sprite); static void SlideMonToOriginalPos_Step(struct Sprite *sprite); static void SlideMonToOffset(struct Sprite *sprite); static void SlideMonToOffsetAndBack(struct Sprite *sprite); static void SlideMonToOffsetAndBack_End(struct Sprite *sprite); static void AnimTask_WindUpLunge_Step1(u8 taskId); static void AnimTask_WindUpLunge_Step2(u8 taskId); static void AnimTask_SlideOffScreen_Step(u8 taskId); static void AnimTask_SwayMon_Step(u8 taskId); static void AnimTask_ScaleMonAndRestore_Step(u8 taskId); static void AnimTask_RotateMonSpriteToSide_Step(u8 taskId); static void AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step(u8 taskId); const struct SpriteTemplate gHorizontalLungeSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = DoHorizontalLunge, }; const struct SpriteTemplate gVerticalDipSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = DoVerticalDip, }; const struct SpriteTemplate gSlideMonToOriginalPosSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SlideMonToOriginalPos, }; const struct SpriteTemplate gSlideMonToOffsetSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SlideMonToOffset, }; const struct SpriteTemplate gSlideMonToOffsetAndBackSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SlideMonToOffsetAndBack, }; // Task to facilitate simple shaking of a pokemon's picture in battle. // The shaking alternates between the original position and the target position. // arg 0: anim battler // arg 1: x pixel offset // arg 2: y pixel offset // arg 3: num times to shake // arg 4: frame delay void AnimTask_ShakeMon(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); if (spriteId == SPRITE_NONE) { DestroyAnimVisualTask(taskId); return; } gSprites[spriteId].x2 = gBattleAnimArgs[1]; gSprites[spriteId].y2 = gBattleAnimArgs[2]; gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[1] = gBattleAnimArgs[3]; gTasks[taskId].data[2] = gBattleAnimArgs[4]; gTasks[taskId].data[3] = gBattleAnimArgs[4]; gTasks[taskId].data[4] = gBattleAnimArgs[1]; gTasks[taskId].data[5] = gBattleAnimArgs[2]; gTasks[taskId].func = AnimTask_ShakeMon_Step; gTasks[taskId].func(taskId); } static void AnimTask_ShakeMon_Step(u8 taskId) { if (gTasks[taskId].data[3] == 0) { if (gSprites[gTasks[taskId].data[0]].x2 == 0) gSprites[gTasks[taskId].data[0]].x2 = gTasks[taskId].data[4]; else gSprites[gTasks[taskId].data[0]].x2 = 0; if (gSprites[gTasks[taskId].data[0]].y2 == 0) gSprites[gTasks[taskId].data[0]].y2 = gTasks[taskId].data[5]; else gSprites[gTasks[taskId].data[0]].y2 = 0; gTasks[taskId].data[3] = gTasks[taskId].data[2]; if (--gTasks[taskId].data[1] == 0) { gSprites[gTasks[taskId].data[0]].x2 = 0; gSprites[gTasks[taskId].data[0]].y2 = 0; DestroyAnimVisualTask(taskId); } } else gTasks[taskId].data[3]--; } // Task to facilitate simple shaking of a pokemon's picture in battle. // The shaking alternates between the positive and negative versions of the specified pixel offsets. // arg 0: anim battler // arg 1: x pixel offset // arg 2: y pixel offset // arg 3: num times to shake // arg 4: frame delay void AnimTask_ShakeMon2(u8 taskId) { bool8 abort = FALSE; u8 spriteId; u8 battlerId; if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT) { spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); if (spriteId == SPRITE_NONE) abort = TRUE; } else if (gBattleAnimArgs[0] != 8) { switch (gBattleAnimArgs[0]) { case 4: battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); break; case 5: battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); break; case 6: battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); break; default: battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); break; } if (!IsBattlerSpriteVisible(battlerId)) abort = TRUE; spriteId = gBattlerSpriteIds[battlerId]; } else spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; if (abort) { DestroyAnimVisualTask(taskId); return; } gSprites[spriteId].x2 = gBattleAnimArgs[1]; gSprites[spriteId].y2 = gBattleAnimArgs[2]; gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[1] = gBattleAnimArgs[3]; gTasks[taskId].data[2] = gBattleAnimArgs[4]; gTasks[taskId].data[3] = gBattleAnimArgs[4]; gTasks[taskId].data[4] = gBattleAnimArgs[1]; gTasks[taskId].data[5] = gBattleAnimArgs[2]; gTasks[taskId].func = AnimTask_ShakeMon2Step; gTasks[taskId].func(taskId); } static void AnimTask_ShakeMon2Step(u8 taskId) { if (gTasks[taskId].data[3] == 0) { if (gSprites[gTasks[taskId].data[0]].x2 == gTasks[taskId].data[4]) gSprites[gTasks[taskId].data[0]].x2 = -gTasks[taskId].data[4]; else gSprites[gTasks[taskId].data[0]].x2 = gTasks[taskId].data[4]; if (gSprites[gTasks[taskId].data[0]].y2 == gTasks[taskId].data[5]) gSprites[gTasks[taskId].data[0]].y2 = -gTasks[taskId].data[5]; else gSprites[gTasks[taskId].data[0]].y2 = gTasks[taskId].data[5]; gTasks[taskId].data[3] = gTasks[taskId].data[2]; if (--gTasks[taskId].data[1] == 0) { gSprites[gTasks[taskId].data[0]].x2 = 0; gSprites[gTasks[taskId].data[0]].y2 = 0; DestroyAnimVisualTask(taskId); } } else gTasks[taskId].data[3]--; } // Task to facilitate simple shaking of a pokemon's picture in battle. // The shaking alternates between the positive and negative versions of the specified pixel offsets // with respect to the current location of the mon's picture. // arg 0: battler // arg 1: x offset // arg 2: y offset // arg 3: num shakes // arg 4: delay void AnimTask_ShakeMonInPlace(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); if (spriteId == SPRITE_NONE) { DestroyAnimVisualTask(taskId); return; } gSprites[spriteId].x2 += gBattleAnimArgs[1]; gSprites[spriteId].y2 += gBattleAnimArgs[2]; gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = gBattleAnimArgs[3]; gTasks[taskId].data[3] = 0; gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].data[5] = gBattleAnimArgs[1] * 2; gTasks[taskId].data[6] = gBattleAnimArgs[2] * 2; gTasks[taskId].func = AnimTask_ShakeMonInPlace_Step; gTasks[taskId].func(taskId); } static void AnimTask_ShakeMonInPlace_Step(u8 taskId) { if (gTasks[taskId].data[3] == 0) { if (gTasks[taskId].data[1] & 1) { gSprites[gTasks[taskId].data[0]].x2 += gTasks[taskId].data[5]; gSprites[gTasks[taskId].data[0]].y2 += gTasks[taskId].data[6]; } else { gSprites[gTasks[taskId].data[0]].x2 -= gTasks[taskId].data[5]; gSprites[gTasks[taskId].data[0]].y2 -= gTasks[taskId].data[6]; } gTasks[taskId].data[3] = gTasks[taskId].data[4]; if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2]) { if (gTasks[taskId].data[1] & 1) { gSprites[gTasks[taskId].data[0]].x2 += gTasks[taskId].data[5] / 2; gSprites[gTasks[taskId].data[0]].y2 += gTasks[taskId].data[6] / 2; } else { gSprites[gTasks[taskId].data[0]].x2 -= gTasks[taskId].data[5] / 2; gSprites[gTasks[taskId].data[0]].y2 -= gTasks[taskId].data[6] / 2; } DestroyAnimVisualTask(taskId); } } else gTasks[taskId].data[3]--; } // Shakes a mon bg horizontally and moves it downward linearly. // arg 0: battler // arg 1: x offset // arg 2: frame delay between each movement // arg 3: downward speed (subpixel) // arg 4: duration void AnimTask_ShakeAndSinkMon(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); gSprites[spriteId].x2 = gBattleAnimArgs[1]; gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].func = AnimTask_ShakeAndSinkMon_Step; gTasks[taskId].func(taskId); } static void AnimTask_ShakeAndSinkMon_Step(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; s16 x = gTasks[taskId].data[1]; if (gTasks[taskId].data[2] == gTasks[taskId].data[8]++) { gTasks[taskId].data[8] = 0; if (gSprites[spriteId].x2 == x) x = -x; gSprites[spriteId].x2 += x; } gTasks[taskId].data[1] = x; gTasks[taskId].data[9] += gTasks[taskId].data[3]; gSprites[spriteId].y2 = gTasks[taskId].data[9] >> 8; if (--gTasks[taskId].data[4] == 0) DestroyAnimVisualTask(taskId); } // Moves a mon bg picture along an elliptical path that begins // and ends at the mon's origin location. // arg 0: battler // arg 1: ellipse width // arg 2: ellipse height // arg 3: num loops // arg 4: speed (valid values are 0-5) void AnimTask_TranslateMonElliptical(u8 taskId) { u8 wavePeriod = 1; u32 i; u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); if (gBattleAnimArgs[4] > 5) gBattleAnimArgs[4] = 5; for (i = 0; i < gBattleAnimArgs[4]; i++) wavePeriod *= 2; gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].data[4] = wavePeriod; gTasks[taskId].func = AnimTask_TranslateMonElliptical_Step; gTasks[taskId].func(taskId); } static void AnimTask_TranslateMonElliptical_Step(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; gSprites[spriteId].x2 = Sin(gTasks[taskId].data[5], gTasks[taskId].data[1]); gSprites[spriteId].y2 = -Cos(gTasks[taskId].data[5], gTasks[taskId].data[2]); gSprites[spriteId].y2 += gTasks[taskId].data[2]; gTasks[taskId].data[5] += gTasks[taskId].data[4]; gTasks[taskId].data[5] &= 0xFF; if (gTasks[taskId].data[5] == 0) gTasks[taskId].data[3]--; if (gTasks[taskId].data[3] == 0) { gSprites[spriteId].x2 = 0; gSprites[spriteId].y2 = 0; DestroyAnimVisualTask(taskId); } } // Moves a mon bg picture along an elliptical path that begins // and ends at the mon's origin location. Reverses the direction // of the path if it's not on the player's side of the battle. // arg 0: battler // arg 1: ellipse width // arg 2: ellipse height // arg 3: num loops // arg 4: speed (valid values are 0-5) void AnimTask_TranslateMonEllipticalRespectSide(u8 taskId) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; AnimTask_TranslateMonElliptical(taskId); } // Performs a simple horizontal lunge, where the mon moves // horizontally, and then moves back in the opposite direction. // arg 0: duration of single lunge direction // arg 1: x pixel delta that is applied each frame static void DoHorizontalLunge(struct Sprite *sprite) { sprite->invisible = TRUE; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->data[1] = -gBattleAnimArgs[1]; else sprite->data[1] = gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[0]; sprite->data[2] = 0; sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; sprite->data[4] = gBattleAnimArgs[0]; StoreSpriteCallbackInData6(sprite, ReverseHorizontalLungeDirection); sprite->callback = TranslateSpriteLinearById; } static void ReverseHorizontalLungeDirection(struct Sprite *sprite) { sprite->data[0] = sprite->data[4]; sprite->data[1] = -sprite->data[1]; sprite->callback = TranslateSpriteLinearById; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Performs a simple vertical dipping motion, where moves vertically, and then // moves back in the opposite direction. // arg 0: duration of single dip direction // arg 1: y pixel delta that is applied each frame // arg 2: battler static void DoVerticalDip(struct Sprite *sprite) { u8 spriteId; sprite->invisible = TRUE; spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]); sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = 0; sprite->data[2] = gBattleAnimArgs[1]; sprite->data[3] = spriteId; sprite->data[4] = gBattleAnimArgs[0]; StoreSpriteCallbackInData6(sprite, ReverseVerticalDipDirection); sprite->callback = TranslateSpriteLinearById; } static void ReverseVerticalDipDirection(struct Sprite *sprite) { sprite->data[0] = sprite->data[4]; sprite->data[2] = -sprite->data[2]; sprite->callback = TranslateSpriteLinearById; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Linearly slides a mon's bg picture back to its original sprite position. // The sprite parameter is a dummy sprite used for facilitating the movement with its callback. // arg 0: 1 = target or 0 = attacker // arg 1: direction (0 = horizontal and vertical, 1 = horizontal only, 2 = vertical only) // arg 2: duration static void SlideMonToOriginalPos(struct Sprite *sprite) { u8 spriteId; if (gBattleAnimArgs[0] == 0) spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; else spriteId = gBattlerSpriteIds[gBattleAnimTarget]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gSprites[spriteId].x + gSprites[spriteId].x2; sprite->data[2] = gSprites[spriteId].x; sprite->data[3] = gSprites[spriteId].y + gSprites[spriteId].y2; sprite->data[4] = gSprites[spriteId].y; InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = 0; sprite->data[4] = 0; sprite->data[5] = gSprites[spriteId].x2; sprite->data[6] = gSprites[spriteId].y2; sprite->invisible = TRUE; if (gBattleAnimArgs[1] == 1) sprite->data[2] = 0; else if (gBattleAnimArgs[1] == 2) sprite->data[1] = 0; sprite->data[7] = gBattleAnimArgs[1]; sprite->data[7] |= spriteId << 8; sprite->callback = SlideMonToOriginalPos_Step; } static void SlideMonToOriginalPos_Step(struct Sprite *sprite) { u8 data7 = sprite->data[7]; struct Sprite *monSprite = &gSprites[sprite->data[7] >> 8]; if (sprite->data[0] == 0) { if (data7 == 1 || data7 == 0) monSprite->x2 = 0; if (data7 == 2 || data7 == 0) monSprite->y2 = 0; DestroyAnimSprite(sprite); } else { sprite->data[0]--; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; monSprite->x2 = (sprite->data[3] >> 8) + sprite->data[5]; monSprite->y2 = (sprite->data[4] >> 8) + sprite->data[6]; } } // Linearly translates a mon to a target offset. The horizontal offset // is mirrored for the opponent's pokemon, and the vertical offset // is only mirrored if arg 3 is set to 1. // arg 0: 0 = attacker, 1 = target // arg 1: target x pixel offset // arg 2: target y pixel offset // arg 3: mirror vertical translation for opposite battle side // arg 4: duration static void SlideMonToOffset(struct Sprite *sprite) { u8 battlerId; u8 monSpriteId; if (gBattleAnimArgs[0] == 0) battlerId = gBattleAnimAttacker; else battlerId = gBattleAnimTarget; monSpriteId = gBattlerSpriteIds[battlerId]; if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; if (gBattleAnimArgs[3] == 1) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = gSprites[monSpriteId].x; sprite->data[2] = gSprites[monSpriteId].x + gBattleAnimArgs[1]; sprite->data[3] = gSprites[monSpriteId].y; sprite->data[4] = gSprites[monSpriteId].y + gBattleAnimArgs[2]; InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = 0; sprite->data[4] = 0; sprite->data[5] = monSpriteId; sprite->invisible = TRUE; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteLinearByIdFixedPoint; } static void SlideMonToOffsetAndBack(struct Sprite *sprite) { u8 battlerId; u8 spriteId; sprite->invisible = TRUE; if (gBattleAnimArgs[0] == ANIM_ATTACKER) battlerId = gBattleAnimAttacker; else battlerId = gBattleAnimTarget; spriteId = gBattlerSpriteIds[battlerId]; if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; if (gBattleAnimArgs[3] == 1) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = gSprites[spriteId].x + gSprites[spriteId].x2; sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1]; sprite->data[3] = gSprites[spriteId].y + gSprites[spriteId].y2; sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2]; InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = gSprites[spriteId].x2 << 8; sprite->data[4] = gSprites[spriteId].y2 << 8; sprite->data[5] = spriteId; sprite->data[6] = gBattleAnimArgs[5]; if (gBattleAnimArgs[5] == 0) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); else StoreSpriteCallbackInData6(sprite, SlideMonToOffsetAndBack_End); sprite->callback = TranslateSpriteLinearByIdFixedPoint; } static void SlideMonToOffsetAndBack_End(struct Sprite *sprite) { gSprites[sprite->data[5]].x2 = 0; gSprites[sprite->data[5]].y2 = 0; DestroyAnimSprite(sprite); } // Task to facilitate a two-part translation animation, in which the sprite // is first translated in an arc to one position. Then, it "lunges" to a target // x offset. Used in TAKE_DOWN, for example. // arg 0: anim bank // arg 1: horizontal speed (subpixel) // arg 2: wave amplitude // arg 3: first duration // arg 4: delay before starting lunge // arg 5: target x offset for lunge // arg 6: lunge duration void AnimTask_WindUpLunge(u8 taskId) { u16 wavePeriod = 0x8000 / gBattleAnimArgs[3]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[5] = -gBattleAnimArgs[5]; } gTasks[taskId].data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); gTasks[taskId].data[1] = gBattleAnimArgs[1] * 256 / gBattleAnimArgs[3]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6]; gTasks[taskId].data[6] = gBattleAnimArgs[6]; gTasks[taskId].data[7] = wavePeriod; gTasks[taskId].func = AnimTask_WindUpLunge_Step1; } static void AnimTask_WindUpLunge_Step1(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; gTasks[taskId].data[11] += gTasks[taskId].data[1]; gSprites[spriteId].x2 = gTasks[taskId].data[11] >> 8; gSprites[spriteId].y2 = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]); gTasks[taskId].data[10] += gTasks[taskId].data[7]; if (--gTasks[taskId].data[3] == 0) gTasks[taskId].func = AnimTask_WindUpLunge_Step2; } static void AnimTask_WindUpLunge_Step2(u8 taskId) { u8 spriteId; if (gTasks[taskId].data[4] > 0) gTasks[taskId].data[4]--; else { spriteId = gTasks[taskId].data[0]; gTasks[taskId].data[12] += gTasks[taskId].data[5]; gSprites[spriteId].x2 = (gTasks[taskId].data[12] >> 8) + (gTasks[taskId].data[11] >> 8); if (--gTasks[taskId].data[6] == 0) DestroyAnimVisualTask(taskId); } } // To move a mon off-screen when pushed out by Roar/Whirlwind void AnimTask_SlideOffScreen(u8 taskId) { u8 spriteId; switch (gBattleAnimArgs[0]) { case ANIM_ATTACKER: case ANIM_TARGET: spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); break; case ANIM_ATK_PARTNER: if (!IsBattlerSpriteVisible(gBattleAnimAttacker ^ BIT_FLANK)) { DestroyAnimVisualTask(taskId); return; } spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK]; break; case ANIM_DEF_PARTNER: if (!IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK)) { DestroyAnimVisualTask(taskId); return; } spriteId = gBattlerSpriteIds[gBattleAnimTarget ^ BIT_FLANK]; break; default: DestroyAnimVisualTask(taskId); return; } gTasks[taskId].data[0] = spriteId; if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) gTasks[taskId].data[1] = gBattleAnimArgs[1]; else gTasks[taskId].data[1] = -gBattleAnimArgs[1]; gTasks[taskId].func = AnimTask_SlideOffScreen_Step; } static void AnimTask_SlideOffScreen_Step(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; gSprites[spriteId].x2 += gTasks[taskId].data[1]; if (gSprites[spriteId].x2 + gSprites[spriteId].x < -32 || gSprites[spriteId].x2 + gSprites[spriteId].x > DISPLAY_WIDTH + 32) DestroyAnimVisualTask(taskId); } // Task that facilitates translating the mon bg picture back and forth // in a swaying motion (uses Sine wave). It can sway either horizontally // or vertically, but not both. // arg 0: direction (0 = horizontal, 1 = vertical) // arg 1: wave amplitude // arg 2: wave period // arg 3: num sways // arg 4: which mon (0 = attacker, 1 = target) void AnimTask_SwayMon(u8 taskId) { u8 spriteId; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[4]); gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].data[4] = spriteId; if (gBattleAnimArgs[4] == 0) gTasks[taskId].data[5] = gBattleAnimAttacker; else gTasks[taskId].data[5] = gBattleAnimTarget; gTasks[taskId].data[12] = 1; gTasks[taskId].func = AnimTask_SwayMon_Step; } static void AnimTask_SwayMon_Step(u8 taskId) { u8 spriteId; u32 waveIndex; s16 sineValue; u16 sineIndex; spriteId = gTasks[taskId].data[4]; sineIndex = gTasks[taskId].data[10] + gTasks[taskId].data[2]; gTasks[taskId].data[10] = sineIndex; waveIndex = sineIndex >> 8; sineValue = Sin(waveIndex, gTasks[taskId].data[1]); if (gTasks[taskId].data[0] == 0) { gSprites[spriteId].x2 = sineValue; } else if (GetBattlerSide(gTasks[taskId].data[5]) == B_SIDE_PLAYER) { gSprites[spriteId].y2 = abs(sineValue); } else gSprites[spriteId].y2 = -abs(sineValue); if ((waveIndex > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (waveIndex < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0)) { gTasks[taskId].data[11] ^= 1; gTasks[taskId].data[12] ^= 1; if (--gTasks[taskId].data[3] == 0) { gSprites[spriteId].x2 = 0; gSprites[spriteId].y2 = 0; DestroyAnimVisualTask(taskId); } } } // Scales a mon's sprite, and then scales back to its original dimensions. // arg 0: x scale delta // arg 1: y scale delta // arg 2: duration // arg 3: anim bank // arg 4: sprite object mode void AnimTask_ScaleMonAndRestore(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[3]); PrepareBattlerSpriteForRotScale(spriteId, gBattleAnimArgs[4]); gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[3] = gBattleAnimArgs[2]; gTasks[taskId].data[4] = spriteId; gTasks[taskId].data[10] = 0x100; gTasks[taskId].data[11] = 0x100; gTasks[taskId].func = AnimTask_ScaleMonAndRestore_Step; } static void AnimTask_ScaleMonAndRestore_Step(u8 taskId) { u8 spriteId; gTasks[taskId].data[10] += gTasks[taskId].data[0]; gTasks[taskId].data[11] += gTasks[taskId].data[1]; spriteId = gTasks[taskId].data[4]; SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0); if (--gTasks[taskId].data[2] == 0) { if (gTasks[taskId].data[3] > 0) { gTasks[taskId].data[0] = -gTasks[taskId].data[0]; gTasks[taskId].data[1] = -gTasks[taskId].data[1]; gTasks[taskId].data[2] = gTasks[taskId].data[3]; gTasks[taskId].data[3] = 0; } else { ResetSpriteRotScale(spriteId); DestroyAnimVisualTask(taskId); } } } void AnimTask_RotateMonSpriteToSide(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]); PrepareBattlerSpriteForRotScale(spriteId, 0); gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = gBattleAnimArgs[0]; if (gBattleAnimArgs[3] != 1) gTasks[taskId].data[3] = 0; else gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1]; gTasks[taskId].data[4] = gBattleAnimArgs[1]; gTasks[taskId].data[5] = spriteId; gTasks[taskId].data[6] = gBattleAnimArgs[3]; if (IsContest()) gTasks[taskId].data[7] = 1; else { if (gBattleAnimArgs[2] == ANIM_ATTACKER) gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : 0; else gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0; } if (gTasks[taskId].data[7] && !IsContest()) { s16 tmp; tmp = gTasks[taskId].data[3]; gTasks[taskId].data[3] = -tmp; tmp = gTasks[taskId].data[4]; gTasks[taskId].data[4] = -tmp; } gTasks[taskId].func = AnimTask_RotateMonSpriteToSide_Step; } // Rotates mon to side and back to original position. For Peck and when a held item activates void AnimTask_RotateMonToSideAndRestore(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]); PrepareBattlerSpriteForRotScale(spriteId, 0); gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = gBattleAnimArgs[0]; if (gBattleAnimArgs[2] == ANIM_ATTACKER) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } else { if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } if (gBattleAnimArgs[3] != 1) gTasks[taskId].data[3] = 0; else gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1]; gTasks[taskId].data[4] = gBattleAnimArgs[1]; gTasks[taskId].data[5] = spriteId; gTasks[taskId].data[6] = gBattleAnimArgs[3]; gTasks[taskId].data[7] = 1; if (gTasks[taskId].data[7] ) { s16 tmp = gTasks[taskId].data[3]; gTasks[taskId].data[3] = -tmp; tmp = gTasks[taskId].data[4]; gTasks[taskId].data[4] = -tmp; } gTasks[taskId].func = AnimTask_RotateMonSpriteToSide_Step; } static void AnimTask_RotateMonSpriteToSide_Step(u8 taskId) { gTasks[taskId].data[3] += gTasks[taskId].data[4]; SetSpriteRotScale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]); if (gTasks[taskId].data[7]) SetBattlerSpriteYOffsetFromRotation(gTasks[taskId].data[5]); if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2]) { switch (gTasks[taskId].data[6]) { case 1: ResetSpriteRotScale(gTasks[taskId].data[5]); // fallthrough case 0: default: DestroyAnimVisualTask(taskId); break; case 2: gTasks[taskId].data[1] = 0; gTasks[taskId].data[4] *= -1; gTasks[taskId].data[6] = 1; break; } } } void AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId) { if (gBattleAnimArgs[0] == 0) { gTasks[taskId].data[15] = gAnimMovePower / 12; if (gTasks[taskId].data[15] < 1) gTasks[taskId].data[15] = 1; if (gTasks[taskId].data[15] > 16) gTasks[taskId].data[15] = 16; } else { gTasks[taskId].data[15] = gAnimMoveDmg / 12; if (gTasks[taskId].data[15] < 1) gTasks[taskId].data[15] = 1; if (gTasks[taskId].data[15] > 16) gTasks[taskId].data[15] = 16; } gTasks[taskId].data[14] = gTasks[taskId].data[15] / 2; gTasks[taskId].data[13] = gTasks[taskId].data[14] + (gTasks[taskId].data[15] & 1); gTasks[taskId].data[12] = 0; gTasks[taskId].data[10] = gBattleAnimArgs[3]; gTasks[taskId].data[11] = gBattleAnimArgs[4]; gTasks[taskId].data[7] = GetAnimBattlerSpriteId(ANIM_TARGET); gTasks[taskId].data[8] = gSprites[gTasks[taskId].data[7]].x2; gTasks[taskId].data[9] = gSprites[gTasks[taskId].data[7]].y2; gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].func = AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step; } static void AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; if (++task->data[0] > task->data[1]) { task->data[0] = 0; task->data[12] = (task->data[12] + 1) & 1; if (task->data[10]) { if (task->data[12]) { gSprites[task->data[7]].x2 = task->data[8] + task->data[13]; } else { gSprites[task->data[7]].x2 = task->data[8] - task->data[14]; } } if (task->data[11]) { if (task->data[12]) { gSprites[task->data[7]].y2 = task->data[15]; } else { gSprites[task->data[7]].y2 = 0; } } if (!--task->data[2]) { gSprites[task->data[7]].x2 = 0; gSprites[task->data[7]].y2 = 0; DestroyAnimVisualTask(taskId); return; } } } ================================================ FILE: src/battle_anim_mons.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "data.h" #include "decompress.h" #include "pokemon_icon.h" #include "task.h" #include "trig.h" #include "util.h" #include "constants/battle_anim.h" #define IS_DOUBLE_BATTLE() (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) static u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3); static void PlayerThrowBall_AnimTranslateLinear_WithFollowup(struct Sprite *sprite); static void AnimFastTranslateLinearWaitEnd(struct Sprite *sprite); static bool8 ShouldRotScaleSpeciesBeFlipped(void); static void AnimThrowProjectile_Step(struct Sprite *sprite); static void AnimTask_AlphaFadeIn_Step(u8 taskId); static void AnimTask_BlendMonInAndOutSetup(struct Task *task); static void AnimTask_BlendMonInAndOut_Step(u8 taskId); static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId); static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId); static void CreateBattlerTrace(struct Task *task, u8 taskId); static void AnimBattlerTrace(struct Sprite *sprite); static void AnimWeatherBallUp_Step(struct Sprite *sprite); static EWRAM_DATA union AffineAnimCmd *sAnimTaskAffineAnim = NULL; static EWRAM_DATA u32 sUnused = 0; static const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] = { { // Single battle { 72, 80 }, { 176, 40 }, { 48, 40 }, { 112, 80 }, }, { // Double battle { 32, 80 }, { 200, 40 }, { 90, 88 }, { 152, 32 }, }, }; // One entry for each of the four Castform forms. const struct MonCoords gCastformFrontSpriteCoords[NUM_CASTFORM_FORMS] = { [CASTFORM_NORMAL] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 17 }, [CASTFORM_FIRE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9 }, [CASTFORM_WATER] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 9 }, [CASTFORM_ICE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8 }, }; static const u8 sCastformElevations[NUM_CASTFORM_FORMS] = { [CASTFORM_NORMAL] = 13, [CASTFORM_FIRE] = 14, [CASTFORM_WATER] = 13, [CASTFORM_ICE] = 13, }; // Y position of the backsprite for each of the four Castform forms. static const u8 sCastformBackSpriteYCoords[NUM_CASTFORM_FORMS] = { [CASTFORM_NORMAL] = 0, [CASTFORM_FIRE] = 0, [CASTFORM_WATER] = 0, [CASTFORM_ICE] = 0, }; // Placeholders for pokemon sprites to be created for a move animation effect (e.g. Role Play / Snatch) #define TAG_MOVE_EFFECT_MON_1 55125 #define TAG_MOVE_EFFECT_MON_2 55126 static const struct SpriteTemplate sSpriteTemplates_MoveEffectMons[] = { { .tileTag = TAG_MOVE_EFFECT_MON_1, .paletteTag = TAG_MOVE_EFFECT_MON_1, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, { .tileTag = TAG_MOVE_EFFECT_MON_2, .paletteTag = TAG_MOVE_EFFECT_MON_2, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, } }; static const struct SpriteSheet sSpriteSheets_MoveEffectMons[] = { { gMiscBlank_Gfx, MON_PIC_SIZE, TAG_MOVE_EFFECT_MON_1 }, { gMiscBlank_Gfx, MON_PIC_SIZE, TAG_MOVE_EFFECT_MON_2 }, }; u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) { u8 retVal; u16 species; struct BattleSpriteInfo *spriteInfo; switch (coordType) { case BATTLER_COORD_X: case BATTLER_COORD_X_2: retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].x; break; case BATTLER_COORD_Y: retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].y; break; case BATTLER_COORD_Y_PIC_OFFSET: case BATTLER_COORD_Y_PIC_OFFSET_DEFAULT: default: if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); else species = spriteInfo[battlerId].transformSpecies; } else { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); else species = spriteInfo[battlerId].transformSpecies; } if (coordType == BATTLER_COORD_Y_PIC_OFFSET) retVal = GetBattlerSpriteFinal_Y(battlerId, species, TRUE); else retVal = GetBattlerSpriteFinal_Y(battlerId, species, FALSE); break; } return retVal; } static u8 GetBattlerYDelta(u8 battlerId, u16 species) { u16 letter; u32 personality; struct BattleSpriteInfo *spriteInfo; u8 ret; u16 coordSpecies; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { if (species == SPECIES_UNOWN) { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); else personality = gTransformedPersonalities[battlerId]; letter = GET_UNOWN_LETTER(personality); if (!letter) coordSpecies = species; else coordSpecies = letter + SPECIES_UNOWN_B - 1; ret = gMonBackPicCoords[coordSpecies].y_offset; } else if (species == SPECIES_CASTFORM) { ret = sCastformBackSpriteYCoords[gBattleMonForms[battlerId]]; } else if (species > NUM_SPECIES) { ret = gMonBackPicCoords[0].y_offset; } else { ret = gMonBackPicCoords[species].y_offset; } } else { if (species == SPECIES_UNOWN) { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); else personality = gTransformedPersonalities[battlerId]; letter = GET_UNOWN_LETTER(personality); if (!letter) coordSpecies = species; else coordSpecies = letter + SPECIES_UNOWN_B - 1; ret = gMonFrontPicCoords[coordSpecies].y_offset; } else if (species == SPECIES_CASTFORM) { ret = gCastformFrontSpriteCoords[gBattleMonForms[battlerId]].y_offset; } else if (species > NUM_SPECIES) { ret = gMonFrontPicCoords[0].y_offset; } else { ret = gMonFrontPicCoords[species].y_offset; } } return ret; } static u8 GetBattlerElevation(u8 battlerId, u16 species) { u8 ret = 0; if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) { if (species == SPECIES_CASTFORM) ret = sCastformElevations[gBattleMonForms[battlerId]]; else if (species > NUM_SPECIES) ret = gEnemyMonElevation[0]; else ret = gEnemyMonElevation[species]; } return ret; } static u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3) { u16 offset; u8 y; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { offset = GetBattlerYDelta(battlerId, species); } else { offset = GetBattlerYDelta(battlerId, species); offset -= GetBattlerElevation(battlerId, species); } y = offset + sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].y; if (a3) { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) y += 8; if (y > DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8) y = DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8; } return y; } u8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType) { u16 species; struct BattleSpriteInfo *spriteInfo; if (coordType == BATTLER_COORD_Y_PIC_OFFSET || coordType == BATTLER_COORD_Y_PIC_OFFSET_DEFAULT) { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) species = gAnimBattlerSpecies[battlerId]; else species = spriteInfo[battlerId].transformSpecies; if (coordType == BATTLER_COORD_Y_PIC_OFFSET) return GetBattlerSpriteFinal_Y(battlerId, species, TRUE); else return GetBattlerSpriteFinal_Y(battlerId, species, FALSE); } else { return GetBattlerSpriteCoord(battlerId, coordType); } } u8 GetBattlerSpriteDefault_Y(u8 battlerId) { return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET_DEFAULT); } u8 GetSubstituteSpriteDefault_Y(u8 battlerId) { u16 y; if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 16; else y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 17; return y; } u8 GetGhostSpriteDefault_Y(u8 battlerId) { if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT) return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET_DEFAULT); else return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y); } u8 GetBattlerYCoordWithElevation(u8 battlerId) { u16 species; u8 y; struct BattleSpriteInfo *spriteInfo; y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y); if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); else species = spriteInfo[battlerId].transformSpecies; } else { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); else species = spriteInfo[battlerId].transformSpecies; } if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) y -= GetBattlerElevation(battlerId, species); return y; } u8 GetAnimBattlerSpriteId(u8 animBattler) { u8 *sprites; if (animBattler == ANIM_ATTACKER) { if (IsBattlerSpritePresent(gBattleAnimAttacker)) { sprites = gBattlerSpriteIds; return sprites[gBattleAnimAttacker]; } else { return SPRITE_NONE; } } else if (animBattler == ANIM_TARGET) { if (IsBattlerSpritePresent(gBattleAnimTarget)) { sprites = gBattlerSpriteIds; return sprites[gBattleAnimTarget]; } else { return SPRITE_NONE; } } else if (animBattler == ANIM_ATK_PARTNER) { if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) return SPRITE_NONE; else return gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]; } else { if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget))) return gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimTarget)]; else return SPRITE_NONE; } } void StoreSpriteCallbackInData6(struct Sprite *sprite, SpriteCallback callback) { sprite->data[6] = (u32)(callback) & 0xFFFF; sprite->data[7] = (u32)(callback) >> 16; } static void SetCallbackToStoredInData6(struct Sprite *sprite) { u32 callback = (u16)sprite->data[6] | (sprite->data[7] << 16); sprite->callback = (SpriteCallback)callback; } // Sprite data for TranslateSpriteInCircle/Ellipse and related #define sCirclePos data[0] #define sAmplitude data[1] #define sCircleSpeed data[2] #define sDuration data[3] // TranslateSpriteInGrowingCircle #define sAmplitudeSpeed data[4] #define sAmplitudeChange data[5] // TranslateSpriteInEllipse #define sAmplitudeX sAmplitude #define sAmplitudeY data[4] // TranslateSpriteInLissajousCurve #define sCirclePosX sCirclePos #define sCircleSpeedX sCircleSpeed #define sCirclePosY data[4] #define sCircleSpeedY data[5] // x = a * sin(theta0 + dtheta * t) // y = a * cos(theta0 + dtheta * t) void TranslateSpriteInCircle(struct Sprite *sprite) { if (sprite->sDuration) { sprite->x2 = Sin(sprite->sCirclePos, sprite->sAmplitude); sprite->y2 = Cos(sprite->sCirclePos, sprite->sAmplitude); sprite->sCirclePos += sprite->sCircleSpeed; if (sprite->sCirclePos >= 0x100) sprite->sCirclePos -= 0x100; else if (sprite->sCirclePos < 0) sprite->sCirclePos += 0x100; sprite->sDuration--; } else { SetCallbackToStoredInData6(sprite); } } // x = (a0 + da * t) * sin(theta0 + dtheta * t) // y = (a0 + da * t) * cos(theta0 + dtheta * t) void TranslateSpriteInGrowingCircle(struct Sprite *sprite) { if (sprite->sDuration) { sprite->x2 = Sin(sprite->sCirclePos, (sprite->sAmplitudeChange >> 8) + sprite->sAmplitude); sprite->y2 = Cos(sprite->sCirclePos, (sprite->sAmplitudeChange >> 8) + sprite->sAmplitude); sprite->sCirclePos += sprite->sCircleSpeed; sprite->sAmplitudeChange += sprite->sAmplitudeSpeed; if (sprite->sCirclePos >= 0x100) sprite->sCirclePos -= 0x100; else if (sprite->sCirclePos < 0) sprite->sCirclePos += 0x100; sprite->sDuration--; } else { SetCallbackToStoredInData6(sprite); } } // Unused // Exact shape depends on arguments. Can move in a figure-8-like pattern, or circular, etc. // x = alpl * sin(alpha0 + dalpha * t) // y = ampl * cos(beta0 + dbeta * t) static void TranslateSpriteInLissajousCurve(struct Sprite *sprite) { if (sprite->sDuration) { sprite->x2 = Sin(sprite->sCirclePosX, sprite->sAmplitude); sprite->y2 = Cos(sprite->sCirclePosY, sprite->sAmplitude); sprite->sCirclePosX += sprite->sCircleSpeedX; sprite->sCirclePosY += sprite->sCircleSpeedY; if (sprite->sCirclePosX >= 0x100) sprite->sCirclePosX -= 0x100; else if (sprite->sCirclePosX < 0) sprite->sCirclePosX += 0x100; if (sprite->sCirclePosY >= 0x100) sprite->sCirclePosY -= 0x100; else if (sprite->sCirclePosY < 0) sprite->sCirclePosY += 0x100; sprite->sDuration--; } else { SetCallbackToStoredInData6(sprite); } } // x = a * sin(theta0 + dtheta * t) // y = b * cos(theta0 + dtheta * t) void TranslateSpriteInEllipse(struct Sprite *sprite) { if (sprite->sDuration) { sprite->x2 = Sin(sprite->sCirclePos, sprite->sAmplitudeX); sprite->y2 = Cos(sprite->sCirclePos, sprite->sAmplitudeY); sprite->sCirclePos += sprite->sCircleSpeed; if (sprite->sCirclePos >= 0x100) sprite->sCirclePos -= 0x100; else if (sprite->sCirclePos < 0) sprite->sCirclePos += 0x100; sprite->sDuration--; } else { SetCallbackToStoredInData6(sprite); } } #undef sCirclePos #undef sAmplitude #undef sCircleSpeed #undef sDuration #undef sAmplitudeSpeed #undef sAmplitudeChange #undef sAmplitudeX #undef sAmplitudeY #undef sCirclePosX #undef sCircleSpeedX #undef sCirclePosY #undef sCircleSpeedY // Simply waits until the sprite's data[0] hits zero. // This is used to let sprite anims or affine anims to run for a designated // duration. void WaitAnimForDuration(struct Sprite *sprite) { if (sprite->data[0] > 0) --sprite->data[0]; else SetCallbackToStoredInData6(sprite); } // Sprite data for ConvertPosDataToTranslateLinearData #define sStepsX data[0] #define sStartX data[1] #define sTargetX data[2] #define sStartY data[3] #define sTargetY data[4] // Sprite data for TranslateSpriteLinear #define sMoveSteps data[0] #define sSpeedX data[1] #define sSpeedY data[2] static void AnimPosToTranslateLinear(struct Sprite *sprite) { ConvertPosDataToTranslateLinearData(sprite); sprite->callback = TranslateSpriteLinear; sprite->callback(sprite); } void ConvertPosDataToTranslateLinearData(struct Sprite *sprite) { s16 old; int xDiff; if (sprite->sStartX > sprite->sTargetX) sprite->sStepsX = -sprite->sStepsX; xDiff = sprite->sTargetX - sprite->sStartX; old = sprite->sStepsX; sprite->sMoveSteps = abs(xDiff / sprite->sStepsX); sprite->sSpeedY = (sprite->sTargetY - sprite->sStartY) / sprite->sMoveSteps; sprite->sSpeedX = old; } void TranslateSpriteLinear(struct Sprite *sprite) { if (sprite->sMoveSteps > 0) { sprite->sMoveSteps--; sprite->x2 += sprite->sSpeedX; sprite->y2 += sprite->sSpeedY; } else { SetCallbackToStoredInData6(sprite); } } void TranslateSpriteLinearFixedPoint(struct Sprite *sprite) { if (sprite->data[0] > 0) { --sprite->data[0]; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->x2 = sprite->data[3] >> 8; sprite->y2 = sprite->data[4] >> 8; } else { SetCallbackToStoredInData6(sprite); } } static void TranslateSpriteLinearFixedPointIconFrame(struct Sprite *sprite) { if (sprite->data[0] > 0) { --sprite->data[0]; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->x2 = sprite->data[3] >> 8; sprite->y2 = sprite->data[4] >> 8; } else { SetCallbackToStoredInData6(sprite); } UpdateMonIconFrame(sprite); } // Unused static void TranslateSpriteToBattleTargetPos(struct Sprite *sprite) { sprite->data[1] = sprite->x + sprite->x2; sprite->data[3] = sprite->y + sprite->y2; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = AnimPosToTranslateLinear; } // Same as TranslateSpriteLinear but takes an id to specify which sprite to move void TranslateSpriteLinearById(struct Sprite *sprite) { if (sprite->data[0] > 0) { --sprite->data[0]; gSprites[sprite->data[3]].x2 += sprite->data[1]; gSprites[sprite->data[3]].y2 += sprite->data[2]; } else { SetCallbackToStoredInData6(sprite); } } void TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite) { if (sprite->data[0] > 0) { --sprite->data[0]; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; gSprites[sprite->data[5]].x2 = sprite->data[3] >> 8; gSprites[sprite->data[5]].y2 = sprite->data[4] >> 8; } else { SetCallbackToStoredInData6(sprite); } } void TranslateSpriteLinearAndFlicker(struct Sprite *sprite) { if (sprite->data[0] > 0) { --sprite->data[0]; sprite->x2 = sprite->data[2] >> 8; sprite->data[2] += sprite->data[1]; sprite->y2 = sprite->data[4] >> 8; sprite->data[4] += sprite->data[3]; if (sprite->data[0] % sprite->data[5] == 0) { if (sprite->data[5]) sprite->invisible ^= 1; } } else { SetCallbackToStoredInData6(sprite); } } void DestroySpriteAndMatrix(struct Sprite *sprite) { FreeSpriteOamMatrix(sprite); DestroyAnimSprite(sprite); } // Unused static void SetupAndStartSpriteLinearTranslationToAttacker(struct Sprite *sprite) { sprite->sStartX = sprite->x + sprite->x2; sprite->sStartY = sprite->y + sprite->y2; sprite->sTargetX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->sTargetY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = AnimPosToTranslateLinear; } #undef sStepsX #undef sStartX #undef sTargetX #undef sStartY #undef sTargetY // Unused static void EndUnkPaletteAnim(struct Sprite *sprite) { PaletteStruct_ResetById(sprite->data[5]); DestroySpriteAndMatrix(sprite); } void RunStoredCallbackWhenAffineAnimEnds(struct Sprite *sprite) { if (sprite->affineAnimEnded) SetCallbackToStoredInData6(sprite); } void RunStoredCallbackWhenAnimEnds(struct Sprite *sprite) { if (sprite->animEnded) SetCallbackToStoredInData6(sprite); } void DestroyAnimSpriteAndDisableBlend(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimSprite(sprite); } void DestroyAnimVisualTaskAndDisableBlend(u8 taskId) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimVisualTask(taskId); } void SetSpriteCoordsToAnimAttackerCoords(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } // Sets the initial x offset of the anim sprite depending on the horizontal orientation // of the two involved mons. void SetAnimSpriteInitialXOffset(struct Sprite *sprite, s16 xOffset) { u16 attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); u16 targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); if (attackerX > targetX) { sprite->x -= xOffset; } else if (attackerX < targetX) { sprite->x += xOffset; } else { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= xOffset; else sprite->x += xOffset; } } void InitAnimArcTranslation(struct Sprite *sprite) { sprite->sTransl_InitX = sprite->x; sprite->sTransl_InitY = sprite->y; InitAnimLinearTranslation(sprite); sprite->data[6] = 0x8000 / sprite->sTransl_Speed; sprite->data[7] = 0; } bool8 TranslateAnimHorizontalArc(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) return TRUE; sprite->data[7] += sprite->data[6]; sprite->y2 += Sin((u8)(sprite->data[7] >> 8), sprite->sTransl_ArcAmpl); return FALSE; } bool8 TranslateAnimVerticalArc(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) return TRUE; sprite->data[7] += sprite->data[6]; sprite->x2 += Sin((u8)(sprite->data[7] >> 8), sprite->sTransl_ArcAmpl); return FALSE; } void SetSpritePrimaryCoordsFromSecondaryCoords(struct Sprite *sprite) { sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; } void InitSpritePosToAnimTarget(struct Sprite *sprite, bool8 respectMonPicOffsets) { // Battle anim sprites are automatically created at the anim target's center, which // is why there is no else clause for the "respectMonPicOffsets" check. if (!respectMonPicOffsets) { sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y); } SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; } void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets) { if (!respectMonPicOffsets) { sprite->x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y); } else { sprite->x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; } u8 GetBattlerSide(u8 battlerId) { return GET_BATTLER_SIDE2(battlerId); } u8 GetBattlerPosition(u8 battlerId) { return GET_BATTLER_POSITION(battlerId); } u8 GetBattlerAtPosition(u8 position) { u32 i; for (i = 0; i < gBattlersCount; ++i) if (gBattlerPositions[i] == position) break; return i; } bool8 IsBattlerSpritePresent(u8 battlerId) { if (gBattlerPositions[battlerId] == 0xFF) { return FALSE; } else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) != 0) return TRUE; } else { if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) != 0) return TRUE; } return FALSE; } bool8 IsDoubleBattle(void) { return IS_DOUBLE_BATTLE(); } #define BG_ANIM_PAL_1 8 #define BG_ANIM_PAL_2 9 void GetBattleAnimBg1Data(struct BattleAnimBgData *animBgData) { animBgData->bgTiles = gBattleAnimBgTileBuffer; animBgData->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer; animBgData->paletteId = BG_ANIM_PAL_1; animBgData->bgId = 1; animBgData->tilesOffset = 0x200; animBgData->unused = 0; } void GetBattleAnimBgData(struct BattleAnimBgData *animBgData, u32 bgId) { if (bgId == 1) { GetBattleAnimBg1Data(animBgData); } else { animBgData->bgTiles = gBattleAnimBgTileBuffer; animBgData->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer; animBgData->paletteId = BG_ANIM_PAL_2; animBgData->bgId = 2; animBgData->tilesOffset = 0x300; animBgData->unused = 0; } } void GetBattleAnimBgDataByPriorityRank(struct BattleAnimBgData *animBgData, u8 unused) { animBgData->bgTiles = gBattleAnimBgTileBuffer; animBgData->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer; if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) { animBgData->paletteId = BG_ANIM_PAL_1; animBgData->bgId = 1; animBgData->tilesOffset = 0x200; animBgData->unused = 0; } else { animBgData->paletteId = BG_ANIM_PAL_2; animBgData->bgId = 2; animBgData->tilesOffset = 0x300; animBgData->unused = 0; } } void InitBattleAnimBg(u32 bgId) { struct BattleAnimBgData animBgData; GetBattleAnimBgData(&animBgData, bgId); CpuFill32(0, animBgData.bgTiles, 0x2000); LoadBgTiles(bgId, animBgData.bgTiles, 0x2000, animBgData.tilesOffset); FillBgTilemapBufferRect(bgId, 0, 0, 0, 32, 64, 17); CopyBgTilemapBufferToVram(bgId); } void AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset) { CpuFill32(0, gBattleAnimBgTileBuffer, 0x2000); LZDecompressWram(src, gBattleAnimBgTileBuffer); LoadBgTiles(bgId, gBattleAnimBgTileBuffer, 0x2000, tilesOffset); } void InitAnimBgTilemapBuffer(u32 bgId, const void *src) { FillBgTilemapBufferRect(bgId, 0, 0, 0, 32, 64, 17); CopyToBgTilemapBuffer(bgId, src, 0, 0); } void AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src) { InitAnimBgTilemapBuffer(bgId, src); CopyBgTilemapBufferToVram(bgId); } u8 GetBattleBgPaletteNum(void) { /* if (IsContest()) return 1; */ return 2; } void ToggleBg3Mode(bool8 largeScreenSize) { if (!largeScreenSize) { SetAnimBgAttribute(3, BG_ANIM_SCREEN_SIZE, 0); SetAnimBgAttribute(3, BG_ANIM_AREA_OVERFLOW_MODE, 1); } else { SetAnimBgAttribute(3, BG_ANIM_SCREEN_SIZE, 1); SetAnimBgAttribute(3, BG_ANIM_AREA_OVERFLOW_MODE, 0); } } void Trade_MoveSelectedMonToTarget(struct Sprite *sprite) { sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; InitSpriteDataForLinearTranslation(sprite); sprite->callback = TranslateSpriteLinearFixedPointIconFrame; sprite->callback(sprite); } void InitSpriteDataForLinearTranslation(struct Sprite *sprite) { s16 x = (sprite->data[2] - sprite->data[1]) << 8; s16 y = (sprite->data[4] - sprite->data[3]) << 8; sprite->data[1] = x / sprite->data[0]; sprite->data[2] = y / sprite->data[0]; sprite->data[4] = 0; sprite->data[3] = 0; } void InitAnimLinearTranslation(struct Sprite *sprite) { s32 x = sprite->sTransl_DestX - sprite->sTransl_InitX; s32 y = sprite->sTransl_DestY - sprite->sTransl_InitY; bool8 movingLeft = x < 0; bool8 movingUp = y < 0; u16 xDelta = abs(x) << 8; u16 yDelta = abs(y) << 8; xDelta = xDelta / sprite->sTransl_Speed; yDelta = yDelta / sprite->sTransl_Speed; if (movingLeft) xDelta |= 1; else xDelta &= ~1; if (movingUp) yDelta |= 1; else yDelta &= ~1; sprite->data[1] = xDelta; sprite->data[2] = yDelta; sprite->data[4] = 0; sprite->data[3] = 0; } void StartAnimLinearTranslation(struct Sprite *sprite) { sprite->sTransl_InitX = sprite->x; sprite->sTransl_InitY = sprite->y; InitAnimLinearTranslation(sprite); sprite->callback = AnimTranslateLinear_WithFollowup; sprite->callback(sprite); } void PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite) { sprite->sTransl_InitX = sprite->x; sprite->sTransl_InitY = sprite->y; InitAnimLinearTranslation(sprite); sprite->callback = PlayerThrowBall_AnimTranslateLinear_WithFollowup; sprite->callback(sprite); } bool8 AnimTranslateLinear(struct Sprite *sprite) { u16 v1, v2, x, y; if (!sprite->data[0]) return TRUE; v1 = sprite->data[1]; v2 = sprite->data[2]; x = sprite->data[3]; y = sprite->data[4]; x += v1; y += v2; if (v1 & 1) sprite->x2 = -(x >> 8); else sprite->x2 = x >> 8; if (v2 & 1) sprite->y2 = -(y >> 8); else sprite->y2 = y >> 8; sprite->data[3] = x; sprite->data[4] = y; --sprite->data[0]; return FALSE; } void AnimTranslateLinear_WithFollowup(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) SetCallbackToStoredInData6(sprite); } static void PlayerThrowBall_AnimTranslateLinear_WithFollowup(struct Sprite *sprite) { UpdatePlayerPosInThrowAnim(sprite); if (AnimTranslateLinear(sprite)) SetCallbackToStoredInData6(sprite); } void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite) { s32 v1 = abs(sprite->sTransl_DestX - sprite->sTransl_InitX) << 8; sprite->sTransl_Speed = v1 / sprite->sTransl_Duration; InitAnimLinearTranslation(sprite); } void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite) { sprite->sTransl_InitX = sprite->x; sprite->sTransl_InitY = sprite->y; InitAnimLinearTranslationWithSpeed(sprite); sprite->callback = AnimTranslateLinear_WithFollowup; sprite->callback(sprite); } static void InitAnimFastLinearTranslation(struct Sprite *sprite) { s32 xDiff = sprite->sTransl_DestX - sprite->sTransl_InitX; s32 yDiff = sprite->sTransl_DestY - sprite->sTransl_InitY; bool8 xSign = xDiff < 0; bool8 ySign = yDiff < 0; u16 x2 = abs(xDiff) << 4; u16 y2 = abs(yDiff) << 4; x2 /= sprite->sTransl_Duration; y2 /= sprite->sTransl_Duration; if (xSign) x2 |= 1; else x2 &= ~1; if (ySign) y2 |= 1; else y2 &= ~1; sprite->data[1] = x2; sprite->data[2] = y2; sprite->data[4] = 0; sprite->data[3] = 0; } void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite) { sprite->sTransl_InitX = sprite->x; sprite->sTransl_InitY = sprite->y; InitAnimFastLinearTranslation(sprite); sprite->callback = AnimFastTranslateLinearWaitEnd; sprite->callback(sprite); } bool8 AnimFastTranslateLinear(struct Sprite *sprite) { u16 v1, v2, x, y; if (!sprite->data[0]) return TRUE; v1 = sprite->data[1]; v2 = sprite->data[2]; x = sprite->data[3]; y = sprite->data[4]; x += v1; y += v2; if (v1 & 1) sprite->x2 = -(x >> 4); else sprite->x2 = x >> 4; if (v2 & 1) sprite->y2 = -(y >> 4); else sprite->y2 = y >> 4; sprite->data[3] = x; sprite->data[4] = y; --sprite->data[0]; return FALSE; } static void AnimFastTranslateLinearWaitEnd(struct Sprite *sprite) { if (AnimFastTranslateLinear(sprite)) SetCallbackToStoredInData6(sprite); } void InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite) { s32 xDiff = abs(sprite->data[2] - sprite->data[1]) << 4; sprite->data[0] = xDiff / sprite->data[0]; InitAnimFastLinearTranslation(sprite); } void InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite) { sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; InitAnimFastLinearTranslationWithSpeed(sprite); sprite->callback = AnimFastTranslateLinearWaitEnd; sprite->callback(sprite); } void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation) { s32 i; struct ObjAffineSrcData src; struct OamMatrix matrix; src.xScale = xScale; src.yScale = yScale; src.rotation = rotation; if (ShouldRotScaleSpeciesBeFlipped()) src.xScale = -src.xScale; i = gSprites[spriteId].oam.matrixNum; ObjAffineSet(&src, &matrix, 1, 2); gOamMatrices[i].a = matrix.a; gOamMatrices[i].b = matrix.b; gOamMatrices[i].c = matrix.c; gOamMatrices[i].d = matrix.d; } // Pokémon in Contests (except Unown) should be flipped. static bool8 ShouldRotScaleSpeciesBeFlipped(void) { /* if (IsContest()) { if (gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].data[2] == SPECIES_UNOWN) return FALSE; else return TRUE; } */ return FALSE; } void PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode) { u8 battlerId = gSprites[spriteId].data[0]; if (IsBattlerSpriteVisible(battlerId)) gSprites[spriteId].invisible = FALSE; gSprites[spriteId].oam.objMode = objMode; gSprites[spriteId].affineAnimPaused = TRUE; if (!gSprites[spriteId].oam.affineMode) gSprites[spriteId].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[battlerId].matrixNum; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode); } void ResetSpriteRotScale(u8 spriteId) { SetSpriteRotScale(spriteId, 0x100, 0x100, 0); gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteId].oam.objMode = 0; gSprites[spriteId].affineAnimPaused = FALSE; CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode); } // Sets the sprite's y offset equal to the y displacement caused by the // matrix's rotation. void SetBattlerSpriteYOffsetFromRotation(u8 spriteId) { u16 matrixNum = gSprites[spriteId].oam.matrixNum; // The "c" component of the battler sprite matrix contains the sine of the rotation angle divided by some scale amount. s16 c = gOamMatrices[matrixNum].c; if (c < 0) c = -c; gSprites[spriteId].y2 = c >> 3; } void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 xScale, s16 yScale, u16 rotation) { s32 i; struct ObjAffineSrcData src; struct OamMatrix matrix; if (sprite->oam.affineMode & 1) { sprite->affineAnimPaused = TRUE; if (recalcCenterVector) CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); src.xScale = xScale; src.yScale = yScale; src.rotation = rotation; if (ShouldRotScaleSpeciesBeFlipped()) src.xScale = -src.xScale; i = sprite->oam.matrixNum; ObjAffineSet(&src, &matrix, 1, 2); gOamMatrices[i].a = matrix.a; gOamMatrices[i].b = matrix.b; gOamMatrices[i].c = matrix.c; gOamMatrices[i].d = matrix.d; } } void TryResetSpriteAffineState(struct Sprite *sprite) { TrySetSpriteRotScale(sprite, TRUE, 0x100, 0x100, 0); sprite->affineAnimPaused = FALSE; CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); } static u16 ArcTan2_(s16 a, s16 b) { return ArcTan2(a, b); } u16 ArcTan2Neg(s16 a, s16 b) { u16 var = ArcTan2_(a, b); return -var; } void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor) { s32 i; struct PlttData *originalColor; struct PlttData *destColor; u16 average; paletteNum = PLTT_ID(paletteNum); if (!restoreOriginalColor) { for (i = 0; i < 16; ++i) { originalColor = (struct PlttData *)&gPlttBufferUnfaded[paletteNum + i]; average = originalColor->r + originalColor->g + originalColor->b; average /= 3; destColor = (struct PlttData *)&gPlttBufferFaded[paletteNum + i]; destColor->r = average; destColor->g = average; destColor->b = average; } } else { CpuCopy32(&gPlttBufferUnfaded[paletteNum], &gPlttBufferFaded[paletteNum], PLTT_SIZE_4BPP); } } u32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 anim1, bool8 anim2) { u32 selectedPalettes = 0; u32 shift; if (battleBackground) { selectedPalettes = 0xe; // Palettes 1, 2, and 3 } if (attacker) { shift = gBattleAnimAttacker + 16; selectedPalettes |= 1 << shift; } if (target) { shift = gBattleAnimTarget + 16; selectedPalettes |= 1 << shift; } if (attackerPartner) { if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) { shift = BATTLE_PARTNER(gBattleAnimAttacker) + 16; selectedPalettes |= 1 << shift; } } if (targetPartner) { if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget))) { shift = BATTLE_PARTNER(gBattleAnimTarget) + 16; selectedPalettes |= 1 << shift; } } if (anim1) selectedPalettes |= 1 << BG_ANIM_PAL_1; if (anim2) selectedPalettes |= 1 << BG_ANIM_PAL_2; return selectedPalettes; } u32 GetBattleMonSpritePalettesMask(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight) { u32 selectedPalettes = 0; u32 shift; if (playerLeft) { if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) { selectedPalettes |= 1 << (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) + 16); } } if (playerRight) { if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))) { shift = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) + 16; selectedPalettes |= 1 << shift; } } if (foeLeft) { if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) { shift = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT) + 16; selectedPalettes |= 1 << shift; } } if (foeRight) { if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) { shift = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT) + 16; selectedPalettes |= 1 << shift; } } return selectedPalettes; } u8 GetSpritePalIdxByBattler(u8 battler) { return battler; } // Unused static u8 GetSpritePalIdxByPosition(u8 position) { return GetBattlerAtPosition(position); } void AnimSpriteOnMonPos(struct Sprite *sprite) { bool8 var; if (!sprite->data[0]) { if (!gBattleAnimArgs[3]) var = TRUE; else var = FALSE; if (!gBattleAnimArgs[2]) InitSpritePosToAnimAttacker(sprite, var); else InitSpritePosToAnimTarget(sprite, var); ++sprite->data[0]; } else if (sprite->animEnded || sprite->affineAnimEnded) { DestroySpriteAndMatrix(sprite); } } // Linearly translates a sprite to a target position on the // other mon's sprite. // arg 0: initial x offset // arg 1: initial y offset // arg 2: target x offset // arg 3: target y offset // arg 4: duration // arg 5: lower 8 bits = location on attacking mon, upper 8 bits = location on target mon pick to target void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite) { bool8 respectMonPicOffsets; u8 coordType; if (!(gBattleAnimArgs[5] & 0xFF00)) respectMonPicOffsets = TRUE; else respectMonPicOffsets = FALSE; if (!(gBattleAnimArgs[5] & 0xFF)) coordType = BATTLER_COORD_Y_PIC_OFFSET; else coordType = BATTLER_COORD_Y; InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, coordType) + gBattleAnimArgs[3]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } void AnimThrowProjectile(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); sprite->callback = AnimThrowProjectile_Step; } static void AnimThrowProjectile_Step(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) DestroyAnimSprite(sprite); } void AnimTravelDiagonally(struct Sprite *sprite) { bool8 r4; u8 battlerId, coordType; if (!gBattleAnimArgs[6]) { r4 = TRUE; coordType = BATTLER_COORD_Y_PIC_OFFSET; } else { r4 = FALSE; coordType = BATTLER_COORD_Y; } if (!gBattleAnimArgs[5]) { InitSpritePosToAnimAttacker(sprite, r4); battlerId = gBattleAnimAttacker; } else { InitSpritePosToAnimTarget(sprite, r4); battlerId = gBattleAnimTarget; } if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; InitSpritePosToAnimTarget(sprite, r4); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(battlerId, coordType) + gBattleAnimArgs[3]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } s16 CloneBattlerSpriteWithBlend(u8 animBattler) { u32 i; u8 spriteId = GetAnimBattlerSpriteId(animBattler); if (spriteId != SPRITE_NONE) { for (i = 0; i < MAX_SPRITES; ++i) { if (!gSprites[i].inUse) { gSprites[i] = gSprites[spriteId]; gSprites[i].oam.objMode = ST_OAM_OBJ_BLEND; gSprites[i].invisible = FALSE; return i; } } } return -1; } void DestroySpriteWithActiveSheet(struct Sprite *sprite) { sprite->usingSheet = TRUE; DestroySprite(sprite); } // Only used to fade Moonlight moon sprite in void AnimTask_AlphaFadeIn(u8 taskId) { s16 v1 = 0, v2 = 0; if (gBattleAnimArgs[2] > gBattleAnimArgs[0]) v2 = 1; if (gBattleAnimArgs[2] < gBattleAnimArgs[0]) v2 = -1; if (gBattleAnimArgs[3] > gBattleAnimArgs[1]) v1 = 1; if (gBattleAnimArgs[3] < gBattleAnimArgs[1]) v1 = -1; gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = gBattleAnimArgs[4]; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = gBattleAnimArgs[0]; gTasks[taskId].data[4] = gBattleAnimArgs[1]; gTasks[taskId].data[5] = v2; gTasks[taskId].data[6] = v1; gTasks[taskId].data[7] = gBattleAnimArgs[2]; gTasks[taskId].data[8] = gBattleAnimArgs[3]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gBattleAnimArgs[0], gBattleAnimArgs[1])); gTasks[taskId].func = AnimTask_AlphaFadeIn_Step; } static void AnimTask_AlphaFadeIn_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; if (++task->data[0] > task->data[1]) { task->data[0] = 0; if (++task->data[2] & 1) { if (task->data[3] != task->data[7]) task->data[3] += task->data[5]; } else { if (task->data[4] != task->data[8]) task->data[4] += task->data[6]; } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4])); if (task->data[3] == task->data[7] && task->data[4] == task->data[8]) { DestroyAnimVisualTask(taskId); return; } } } // Linearly blends a mon's sprite colors with a target color with increasing // strength, and then blends out to the original color. // arg 0: anim bank // arg 1: blend color // arg 2: target blend coefficient // arg 3: initial delay // arg 4: number of times to blend in and out void AnimTask_BlendMonInAndOut(u8 task) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); if (spriteId == 0xFF) { DestroyAnimVisualTask(task); return; } gTasks[task].data[0] = OBJ_PLTT_ID(gSprites[spriteId].oam.paletteNum) + 1; AnimTask_BlendMonInAndOutSetup(&gTasks[task]); } static void AnimTask_BlendMonInAndOutSetup(struct Task *task) { task->data[1] = gBattleAnimArgs[1]; task->data[2] = 0; task->data[3] = gBattleAnimArgs[2]; task->data[4] = 0; task->data[5] = gBattleAnimArgs[3]; task->data[6] = 0; task->data[7] = gBattleAnimArgs[4]; task->func = AnimTask_BlendMonInAndOut_Step; } static void AnimTask_BlendMonInAndOut_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; if (++task->data[4] >= task->data[5]) { task->data[4] = 0; if (!task->data[6]) { ++task->data[2]; BlendPalette(task->data[0], 15, task->data[2], task->data[1]); if (task->data[2] == task->data[3]) task->data[6] = 1; } else { --task->data[2]; BlendPalette(task->data[0], 15, task->data[2], task->data[1]); if (!task->data[2]) { if (--task->data[7]) { task->data[4] = 0; task->data[6] = 0; } else { DestroyAnimVisualTask(taskId); return; } } } } } // See AnimTask_BlendMonInAndOut. Same, but ANIM_TAG_* instead of mon void AnimTask_BlendPalInAndOutByTag(u8 taskId) { u8 palette = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); if (palette == 0xFF) { DestroyAnimVisualTask(taskId); return; } gTasks[taskId].data[0] = (palette * 0x10) + 0x101; AnimTask_BlendMonInAndOutSetup(&gTasks[taskId]); } void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds) { task->data[7] = 0; task->data[8] = 0; task->data[9] = 0; task->data[15] = spriteId; task->data[10] = 0x100; task->data[11] = 0x100; task->data[12] = 0; StorePointerInVars(&task->data[13], &task->data[14], affineAnimCmds); PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL); } bool8 RunAffineAnimFromTaskData(struct Task *task) { sAnimTaskAffineAnim = LoadPointerFromVars(task->data[13], task->data[14]) + (task->data[7] << 3); switch (sAnimTaskAffineAnim->type) { default: if (!sAnimTaskAffineAnim->frame.duration) { task->data[10] = sAnimTaskAffineAnim->frame.xScale; task->data[11] = sAnimTaskAffineAnim->frame.yScale; task->data[12] = sAnimTaskAffineAnim->frame.rotation; ++task->data[7]; ++sAnimTaskAffineAnim; } task->data[10] += sAnimTaskAffineAnim->frame.xScale; task->data[11] += sAnimTaskAffineAnim->frame.yScale; task->data[12] += sAnimTaskAffineAnim->frame.rotation; SetSpriteRotScale(task->data[15], task->data[10], task->data[11], task->data[12]); SetBattlerSpriteYOffsetFromYScale(task->data[15]); if (++task->data[8] >= sAnimTaskAffineAnim->frame.duration) { task->data[8] = 0; ++task->data[7]; } break; case AFFINEANIMCMDTYPE_JUMP: task->data[7] = sAnimTaskAffineAnim->jump.target; break; case AFFINEANIMCMDTYPE_LOOP: if (sAnimTaskAffineAnim->loop.count) { if (task->data[9]) { if (!--task->data[9]) { ++task->data[7]; break; } } else { task->data[9] = sAnimTaskAffineAnim->loop.count; } if (!task->data[7]) { break; } while (TRUE) { --task->data[7]; --sAnimTaskAffineAnim; if (sAnimTaskAffineAnim->type == AFFINEANIMCMDTYPE_LOOP) { ++task->data[7]; return TRUE; } if (!task->data[7]) return TRUE; } } ++task->data[7]; break; case AFFINEANIMCMDTYPE_END: gSprites[task->data[15]].y2 = 0; ResetSpriteRotScale(task->data[15]); return FALSE; } return TRUE; } // Sets the sprite's y offset equal to the y displacement caused by the // matrix's scale in the y dimension. void SetBattlerSpriteYOffsetFromYScale(u8 spriteId) { s32 var = MON_PIC_HEIGHT - GetBattlerYDeltaFromSpriteId(spriteId) * 2; u16 matrix = gSprites[spriteId].oam.matrixNum; s32 var2 = SAFE_DIV(var << 8, gOamMatrices[matrix].d); if (var2 > MON_PIC_HEIGHT * 2) var2 = MON_PIC_HEIGHT * 2; gSprites[spriteId].y2 = (var - var2) / 2; } // Sets the sprite's y offset equal to the y displacement caused by another sprite // matrix's scale in the y dimension. void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId) { s32 var = MON_PIC_HEIGHT - GetBattlerYDeltaFromSpriteId(otherSpriteId) * 2; u16 matrix = gSprites[spriteId].oam.matrixNum; s32 var2 = SAFE_DIV((var << 8), gOamMatrices[matrix].d); if (var2 > MON_PIC_HEIGHT * 2) var2 = MON_PIC_HEIGHT * 2; gSprites[spriteId].y2 = (var - var2) / 2; } static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId) { struct BattleSpriteInfo *spriteInfo; u8 battlerId = gSprites[spriteId].data[0]; u16 species; u32 i; for (i = 0; i < MAX_BATTLERS_COUNT; ++i) { if (gBattlerSpriteIds[i] == spriteId) { if (GetBattlerSide(i) == B_SIDE_PLAYER) { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); else species = spriteInfo[battlerId].transformSpecies; return gMonBackPicCoords[species].y_offset; } else { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); else species = spriteInfo[battlerId].transformSpecies; return gMonFrontPicCoords[species].y_offset; } } } return MON_PIC_HEIGHT; } void StorePointerInVars(s16 *lo, s16 *hi, const void *ptr) { *lo = ((intptr_t)ptr) & 0xffff; *hi = (((intptr_t)ptr) >> 16) & 0xffff; } void *LoadPointerFromVars(s16 lo, s16 hi) { return (void *)((u16)lo | ((u16)hi << 16)); } void BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScaleStart, s16 yScaleStart, s16 xScaleEnd, s16 yScaleEnd, u16 duration) { task->data[8] = duration; task->data[15] = spriteId; task->data[9] = xScaleStart; task->data[10] = yScaleStart; task->data[13] = xScaleEnd; task->data[14] = yScaleEnd; task->data[11] = (xScaleEnd - xScaleStart) / duration; task->data[12] = (yScaleEnd - yScaleStart) / duration; } u8 BattleAnimHelper_RunSpriteSquash(struct Task *task) { if (!task->data[8]) return 0; if (--task->data[8] != 0) { task->data[9] += task->data[11]; task->data[10] += task->data[12]; } else { task->data[9] = task->data[13]; task->data[10] = task->data[14]; } SetSpriteRotScale(task->data[15], task->data[9], task->data[10], 0); if (task->data[8]) SetBattlerSpriteYOffsetFromYScale(task->data[15]); else gSprites[task->data[15]].y2 = 0; return task->data[8]; } void AnimTask_GetFrustrationPowerLevel(u8 taskId) { u16 powerLevel; if (gAnimFriendship <= 30) powerLevel = 0; else if (gAnimFriendship <= 100) powerLevel = 1; else if (gAnimFriendship <= 200) powerLevel = 2; else powerLevel = 3; gBattleAnimArgs[ARG_RET_ID] = powerLevel; DestroyAnimVisualTask(taskId); } // Unused static void SetPriorityForVisibleBattlers(u8 priority) { if (IsBattlerSpriteVisible(gBattleAnimTarget)) gSprites[gBattlerSpriteIds[gBattleAnimTarget]].oam.priority = priority; if (IsBattlerSpriteVisible(gBattleAnimAttacker)) gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].oam.priority = priority; if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget))) gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimTarget)]].oam.priority = priority; if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority = priority; } void InitPrioritiesForVisibleBattlers(void) { s32 i; for (i = 0; i < gBattlersCount; ++i) { if (IsBattlerSpriteVisible(i)) { gSprites[gBattlerSpriteIds[i]].subpriority = GetBattlerSpriteSubpriority(i); gSprites[gBattlerSpriteIds[i]].oam.priority = 2; } } } u8 GetBattlerSpriteSubpriority(u8 battlerId) { u8 subpriority; u8 position = GetBattlerPosition(battlerId); if (position == B_POSITION_PLAYER_LEFT) subpriority = 30; else if (position == B_POSITION_PLAYER_RIGHT) subpriority = 20; else if (position == B_POSITION_OPPONENT_LEFT) subpriority = 40; else subpriority = 50; return subpriority; } u8 GetBattlerSpriteBGPriority(u8 battlerId) { u8 position = GetBattlerPosition(battlerId); if (position == B_POSITION_PLAYER_LEFT || position == B_POSITION_OPPONENT_RIGHT) return GetAnimBgAttribute(2, BG_ANIM_PRIORITY); else return GetAnimBgAttribute(1, BG_ANIM_PRIORITY); } u8 GetBattlerSpriteBGPriorityRank(u8 battlerId) { u8 position = GetBattlerPosition(battlerId); if (position == B_POSITION_PLAYER_LEFT || position == B_POSITION_OPPONENT_RIGHT) return 2; else return 1; } // Create pokemon sprite to be used for a move animation effect (e.g. Role Play / Snatch) u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templateId, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, bool32 ignoreDeoxys) { u8 spriteId; u16 sheet = LoadSpriteSheet(&sSpriteSheets_MoveEffectMons[templateId]); u16 palette = AllocSpritePalette(sSpriteTemplates_MoveEffectMons[templateId].paletteTag); if (gMonSpritesGfxPtr != NULL && gMonSpritesGfxPtr->multiUseBuffer == NULL) gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000); if (!isBackpic) { LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), OBJ_PLTT_ID(palette), PLTT_SIZE_4BPP); if (ignoreDeoxys == TRUE || ShouldIgnoreDeoxysForm(DEOXYS_CHECK_BATTLE_ANIM, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->multiUseBuffer, species, personality, TRUE); else LoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->multiUseBuffer, species, personality, TRUE); } else { LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), OBJ_PLTT_ID(palette), PLTT_SIZE_4BPP); if (ignoreDeoxys == TRUE || ShouldIgnoreDeoxysForm(DEOXYS_CHECK_BATTLE_ANIM, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->multiUseBuffer, species, personality, FALSE); else LoadSpecialPokePic(&gMonBackPicTable[species], gMonSpritesGfxPtr->multiUseBuffer, species, personality, FALSE); } RequestDma3Copy(gMonSpritesGfxPtr->multiUseBuffer, (void *)(OBJ_VRAM0 + (sheet * 0x20)), 0x800, 1); FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer); if (!isBackpic) spriteId = CreateSprite(&sSpriteTemplates_MoveEffectMons[templateId], x, y + gMonFrontPicCoords[species].y_offset, subpriority); else spriteId = CreateSprite(&sSpriteTemplates_MoveEffectMons[templateId], x, y + gMonBackPicCoords[species].y_offset, subpriority); return spriteId; } void DestroySpriteAndFreeResources_(struct Sprite *sprite) { DestroySpriteAndFreeResources(sprite); } s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr) { u16 species; u32 personality; u16 letter; u16 unownSpecies; s32 ret; const struct MonCoords *coords; struct BattleSpriteInfo *spriteInfo; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) { species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); } else { species = spriteInfo[battlerId].transformSpecies; personality = gTransformedPersonalities[battlerId]; } if (species == SPECIES_UNOWN) { letter = GET_UNOWN_LETTER(personality); if (!letter) unownSpecies = SPECIES_UNOWN; else unownSpecies = letter + SPECIES_UNOWN_B - 1; coords = &gMonBackPicCoords[unownSpecies]; } else if (species > NUM_SPECIES) { coords = &gMonBackPicCoords[0]; } else { coords = &gMonBackPicCoords[species]; } } else { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) { species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); } else { species = spriteInfo[battlerId].transformSpecies; personality = gTransformedPersonalities[battlerId]; } if (species == SPECIES_UNOWN) { letter = GET_UNOWN_LETTER(personality); if (!letter) unownSpecies = SPECIES_UNOWN; else unownSpecies = letter + SPECIES_UNOWN_B - 1; coords = &gMonFrontPicCoords[unownSpecies]; } else if (species == SPECIES_CASTFORM) { coords = &gCastformFrontSpriteCoords[gBattleMonForms[battlerId]]; } else if (species > NUM_SPECIES) { coords = &gMonFrontPicCoords[0]; } else { coords = &gMonFrontPicCoords[species]; } } switch (attr) { case BATTLER_COORD_ATTR_HEIGHT: return GET_MON_COORDS_HEIGHT(coords->size); case BATTLER_COORD_ATTR_WIDTH: return GET_MON_COORDS_WIDTH(coords->size); case BATTLER_COORD_ATTR_LEFT: return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) - (GET_MON_COORDS_WIDTH(coords->size) / 2); case BATTLER_COORD_ATTR_RIGHT: return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + (GET_MON_COORDS_WIDTH(coords->size) / 2); case BATTLER_COORD_ATTR_TOP: return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) - (GET_MON_COORDS_HEIGHT(coords->size) / 2); case BATTLER_COORD_ATTR_BOTTOM: return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) + (GET_MON_COORDS_HEIGHT(coords->size) / 2); case BATTLER_COORD_ATTR_RAW_BOTTOM: ret = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 31; return ret - coords->y_offset; default: return 0; } } void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y) { u8 xCoordType, yCoordType; s16 battlerX, battlerY; s16 partnerX, partnerY; if (!respectMonPicOffsets) { xCoordType = BATTLER_COORD_X; yCoordType = BATTLER_COORD_Y; } else { xCoordType = BATTLER_COORD_X_2; yCoordType = BATTLER_COORD_Y_PIC_OFFSET; } battlerX = GetBattlerSpriteCoord(battlerId, xCoordType); battlerY = GetBattlerSpriteCoord(battlerId, yCoordType); if (IsDoubleBattle()) { partnerX = GetBattlerSpriteCoord(BATTLE_PARTNER(battlerId), xCoordType); partnerY = GetBattlerSpriteCoord(BATTLE_PARTNER(battlerId), yCoordType); } else { partnerX = battlerX; partnerY = battlerY; } *x = (battlerX + partnerX) / 2; *y = (battlerY + partnerY) / 2; } u8 CreateInvisibleSpriteCopy(s32 battlerId, u8 spriteId, s32 species) { u8 newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); gSprites[newSpriteId] = gSprites[spriteId]; gSprites[newSpriteId].usingSheet = TRUE; gSprites[newSpriteId].oam.priority = 0; gSprites[newSpriteId].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[newSpriteId].oam.tileNum = gSprites[spriteId].oam.tileNum; gSprites[newSpriteId].callback = SpriteCallbackDummy; return newSpriteId; } void AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[0]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; sprite->hFlip = TRUE; } else { sprite->x += gBattleAnimArgs[0]; } sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[4]; sprite->data[5] = gBattleAnimArgs[5]; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteLinearAndFlicker; } // Used by three different unused battle anim sprite templates. void AnimTranslateLinearAndFlicker(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x -= gBattleAnimArgs[0]; gBattleAnimArgs[3] *= -1; } else { sprite->x += gBattleAnimArgs[0]; } sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[4]; sprite->data[5] = gBattleAnimArgs[5]; StartSpriteAnim(sprite, gBattleAnimArgs[6]); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteLinearAndFlicker; } // Used by Detect/Disable void AnimSpinningSparkle(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Task and sprite data for AnimTask_AttackerPunchWithTrace #define tBattlerSpriteId data[0] #define tMoveSpeed data[1] #define tState data[2] #define tCounter data[3] #define tPaletteNum data[4] #define tNumTracesActive data[5] #define tPriority data[6] #define sActiveTime data[0] #define sTaskId data[1] #define sSpriteId data[2] void AnimTask_AttackerPunchWithTrace(u8 taskId) { u16 src; u16 dest; struct Task *task = &gTasks[taskId]; task->tBattlerSpriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->tMoveSpeed = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? -8 : 8; task->tState = 0; task->tCounter = 0; gSprites[task->tBattlerSpriteId].x2 -= task->tBattlerSpriteId; task->tPaletteNum = AllocSpritePalette(ANIM_TAG_BENT_SPOON); task->tNumTracesActive = 0; dest = OBJ_PLTT_ID2(task->tPaletteNum); src = OBJ_PLTT_ID2(gSprites[task->tBattlerSpriteId].oam.paletteNum); // Set trace's priority based on battler's subpriority task->tPriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker); if (task->tPriority == 20 || task->tPriority == 40) task->tPriority = 2; else task->tPriority = 3; CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], PLTT_SIZE_4BPP); BlendPalette(dest, 16, gBattleAnimArgs[1], gBattleAnimArgs[0]); task->func = AnimTask_AttackerPunchWithTrace_Step; } static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: // Move forward CreateBattlerTrace(task, taskId); gSprites[task->tBattlerSpriteId].x2 += task->tMoveSpeed; if (++task->tCounter == 5) { task->tCounter--; task->tState++; } break; case 1: // Move back (do same number of traces as before) CreateBattlerTrace(task, taskId); gSprites[task->tBattlerSpriteId].x2 -= task->tMoveSpeed; if (--task->tCounter == 0) { gSprites[task->tBattlerSpriteId].x2 = 0; task->tState++; } break; case 2: if (task->tNumTracesActive == 0) { FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON); DestroyAnimVisualTask(taskId); } break; } } static void CreateBattlerTrace(struct Task *task, u8 taskId) { s16 spriteId = CloneBattlerSpriteWithBlend(0); if (spriteId >= 0) { gSprites[spriteId].oam.priority = task->tPriority; gSprites[spriteId].oam.paletteNum = task->tPaletteNum; gSprites[spriteId].sActiveTime = 8; gSprites[spriteId].sTaskId = taskId; gSprites[spriteId].sSpriteId = spriteId; gSprites[spriteId].x2 = gSprites[task->tBattlerSpriteId].x2; gSprites[spriteId].callback = AnimBattlerTrace; task->tNumTracesActive++; } } // Just waits until destroyed static void AnimBattlerTrace(struct Sprite *sprite) { if (--sprite->sActiveTime == 0) { gTasks[sprite->sTaskId].tNumTracesActive--; DestroySpriteWithActiveSheet(sprite); } } #undef tBattlerSpriteId #undef tMoveSpeed #undef tState #undef tCounter #undef tPaletteNum #undef tNumTracesActive #undef tPriority #undef sActiveTime #undef sTaskId #undef sSpriteId void AnimWeatherBallUp(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) sprite->data[0] = 5; else sprite->data[0] = -10; sprite->data[1] = -40; sprite->callback = AnimWeatherBallUp_Step; } static void AnimWeatherBallUp_Step(struct Sprite *sprite) { sprite->data[2] += sprite->data[0]; sprite->data[3] += sprite->data[1]; sprite->x2 = sprite->data[2] / 10; sprite->y2 = sprite->data[3] / 10; if (sprite->data[1] < -20) ++sprite->data[1]; if (sprite->y + sprite->y2 < -32) DestroyAnimSprite(sprite); } void AnimWeatherBallDown(struct Sprite *sprite) { s32 x; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = sprite->x + gBattleAnimArgs[4]; sprite->data[4] = sprite->y + gBattleAnimArgs[5]; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { x = (u16)gBattleAnimArgs[4] + 30; sprite->x += x; sprite->y = gBattleAnimArgs[5] - 20; } else { x = (u16)gBattleAnimArgs[4] - 30; sprite->x += x; sprite->y = gBattleAnimArgs[5] - 80; } sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } ================================================ FILE: src/battle_anim_normal.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "random.h" #include "task.h" #include "trig.h" static void AnimConfusionDuck(struct Sprite *sprite); static void AnimSimplePaletteBlend(struct Sprite *sprite); static void AnimComplexPaletteBlend(struct Sprite *sprite); static void AnimCirclingSparkle(struct Sprite *sprite); static void AnimShakeMonOrBattleTerrain(struct Sprite *sprite); static void AnimHitSplatBasic(struct Sprite *sprite); static void AnimHitSplatHandleInvert(struct Sprite *sprite); static void AnimHitSplatRandom(struct Sprite *sprite); static void AnimHitSplatOnMonEdge(struct Sprite *sprite); static void AnimCrossImpact(struct Sprite *sprite); static void AnimFlashingHitSplat(struct Sprite *sprite); static void AnimHitSplatPersistent(struct Sprite *sprite); static void AnimConfusionDuck_Step(struct Sprite *sprite); static void AnimSimplePaletteBlend_Step(struct Sprite *sprite); static void AnimComplexPaletteBlend_Step1(struct Sprite *sprite); static void AnimComplexPaletteBlend_Step2(struct Sprite *sprite); static void BlendColorCycle(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount); static void AnimTask_BlendColorCycleLoop(u8 taskId); static void BlendColorCycleExclude(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount); static void AnimTask_BlendColorCycleExcludeLoop(u8 taskId); static void BlendColorCycleByTag(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount); static void AnimTask_BlendColorCycleByTagLoop(u8 taskId); static void AnimTask_FlashAnimTagWithColor_Step1(u8 taskId); static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId); static void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void); static void AnimShakeMonOrBattleTerrain_Step(struct Sprite *sprite); static void AnimTask_ShakeBattleTerrain_Step(u8 taskId); static void AnimFlashingHitSplat_Step(struct Sprite *sprite); static const union AnimCmd sAnim_ConfusionDuck_0[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(0, 8, .hFlip = TRUE), ANIMCMD_FRAME(8, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_ConfusionDuck_1[] = { ANIMCMD_FRAME(0, 8, .hFlip = TRUE), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(8, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_ConfusionDuck[] = { sAnim_ConfusionDuck_0, sAnim_ConfusionDuck_1, }; const struct SpriteTemplate gConfusionDuckSpriteTemplate = { .tileTag = ANIM_TAG_DUCK, .paletteTag = ANIM_TAG_DUCK, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnims_ConfusionDuck, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimConfusionDuck, }; const struct SpriteTemplate gSimplePaletteBlendSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSimplePaletteBlend, }; const struct SpriteTemplate gComplexPaletteBlendSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimComplexPaletteBlend, }; static const union AnimCmd sAnim_CirclingSparkle[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_FRAME(64, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_CirclingSparkle[] = { sAnim_CirclingSparkle, }; // Unused static const struct SpriteTemplate sCirclingSparkleSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_CirclingSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCirclingSparkle, }; const struct SpriteTemplate gShakeMonOrTerrainSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimShakeMonOrBattleTerrain, }; static const union AffineAnimCmd sAffineAnim_HitSplat_0[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_HitSplat_1[] = { AFFINEANIMCMD_FRAME(0xD8, 0xD8, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_HitSplat_2[] = { AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_HitSplat_3[] = { AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_HitSplat[] = { sAffineAnim_HitSplat_0, sAffineAnim_HitSplat_1, sAffineAnim_HitSplat_2, sAffineAnim_HitSplat_3, }; const struct SpriteTemplate gBasicHitSplatSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_HitSplat, .callback = AnimHitSplatBasic, }; const struct SpriteTemplate gHandleInvertHitSplatSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_HitSplat, .callback = AnimHitSplatHandleInvert, }; const struct SpriteTemplate gWaterHitSplatSpriteTemplate = { .tileTag = ANIM_TAG_WATER_IMPACT, .paletteTag = ANIM_TAG_WATER_IMPACT, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_HitSplat, .callback = AnimHitSplatBasic, }; const struct SpriteTemplate gRandomPosHitSplatSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_HitSplat, .callback = AnimHitSplatRandom, }; const struct SpriteTemplate gMonEdgeHitSplatSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_HitSplat, .callback = AnimHitSplatOnMonEdge, }; const struct SpriteTemplate gCrossImpactSpriteTemplate = { .tileTag = ANIM_TAG_CROSS_IMPACT, .paletteTag = ANIM_TAG_CROSS_IMPACT, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCrossImpact, }; const struct SpriteTemplate gFlashingHitSplatSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_HitSplat, .callback = AnimFlashingHitSplat, }; const struct SpriteTemplate gPersistHitSplatSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_HitSplat, .callback = AnimHitSplatPersistent, }; // Moves a spinning duck around the mon's head. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: initial wave offset // arg 3: wave period (higher means faster wave) // arg 4: duration static void AnimConfusionDuck(struct Sprite *sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->data[1] = -gBattleAnimArgs[3]; sprite->data[4] = 1; } else { sprite->data[1] = gBattleAnimArgs[3]; sprite->data[4] = 0; StartSpriteAnim(sprite, 1); } sprite->data[3] = gBattleAnimArgs[4]; sprite->callback = AnimConfusionDuck_Step; sprite->callback(sprite); } static void AnimConfusionDuck_Step(struct Sprite *sprite) { sprite->x2 = Cos(sprite->data[0], 30); sprite->y2 = Sin(sprite->data[0], 10); if ((u16)sprite->data[0] < 128) sprite->oam.priority = 1; else sprite->oam.priority = 3; sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF; if (++sprite->data[2] == sprite->data[3]) DestroyAnimSprite(sprite); } // Performs a simple color blend on a specified sprite. // arg 0: palette selector // arg 1: delay // arg 2: start blend amount // arg 3: end blend amount // arg 4: blend color static void AnimSimplePaletteBlend(struct Sprite *sprite) { u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]); BeginNormalPaletteFade(selectedPalettes, gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]); sprite->invisible = TRUE; sprite->callback = AnimSimplePaletteBlend_Step; } // Unpacks a bitfield and returns a bitmask of its selected palettes. // Bits 0-6 of the selector parameter result in the following palettes being selected: // 0: F_PAL_BG, battle background palettes (BG palettes 1, 2, and 3) // 1: F_PAL_ATTACKER, gBattleAnimAttacker OBJ palette // 2: F_PAL_TARGET, gBattleAnimTarget OBJ palette // 3: F_PAL_ATK_PARTNER, gBattleAnimAttacker partner OBJ palette // 4: F_PAL_DEF_PARTNER, gBattleAnimTarget partner OBJ palette // 5: F_PAL_ANIM_1, BG palette 8 // 6: F_PAL_ANIM_2, BG palette 9 u32 UnpackSelectedBattlePalettes(s16 selector) { u8 battleBackground = selector & 1; u8 attacker = (selector >> 1) & 1; u8 target = (selector >> 2) & 1; u8 attackerPartner = (selector >> 3) & 1; u8 targetPartner = (selector >> 4) & 1; u8 anim1 = (selector >> 5) & 1; u8 anim2 = (selector >> 6) & 1; return GetBattlePalettesMask(battleBackground, attacker, target, attackerPartner, targetPartner, anim1, anim2); } static void AnimSimplePaletteBlend_Step(struct Sprite *sprite) { if (!gPaletteFade.active) DestroyAnimSprite(sprite); } static void AnimComplexPaletteBlend(struct Sprite *sprite) { u32 selectedPalettes; sprite->data[0] = gBattleAnimArgs[1]; sprite->data[1] = gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[2]; sprite->data[3] = gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[4]; sprite->data[5] = gBattleAnimArgs[5]; sprite->data[6] = gBattleAnimArgs[6]; sprite->data[7] = gBattleAnimArgs[0]; selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]); BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]); sprite->invisible = TRUE; sprite->callback = AnimComplexPaletteBlend_Step1; } static void AnimComplexPaletteBlend_Step1(struct Sprite *sprite) { u32 selectedPalettes; if (sprite->data[0] > 0) { --sprite->data[0]; return; } if (gPaletteFade.active) return; if (sprite->data[2] == 0) { sprite->callback = AnimComplexPaletteBlend_Step2; return; } selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]); if (sprite->data[1] & 0x100) BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]); else BlendPalettes(selectedPalettes, sprite->data[6], sprite->data[5]); sprite->data[1] ^= 0x100; sprite->data[0] = sprite->data[1] & 0xFF; --sprite->data[2]; } static void AnimComplexPaletteBlend_Step2(struct Sprite *sprite) { u32 selectedPalettes; if (!gPaletteFade.active) { selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]); BlendPalettes(selectedPalettes, 0, 0); DestroyAnimSprite(sprite); } } static void AnimCirclingSparkle(struct Sprite *sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = 0; sprite->data[1] = 10; sprite->data[2] = 8; sprite->data[3] = 40; sprite->data[4] = 112; sprite->data[5] = 0; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteInGrowingCircle; sprite->callback(sprite); } // Task data for AnimTask_BlendColorCycle, AnimTask_BlendColorCycleExclude, and AnimTask_BlendColorCycleByTag #define tPalSelector data[0] // AnimTask_BlendColorCycle #define tPalTag data[0] // AnimTask_BlendColorCycleByTag #define tDelay data[1] #define tNumBlends data[2] #define tInitialBlendY data[3] #define tTargetBlendY data[4] #define tBlendColor data[5] #define tRestoreBlend data[8] #define tPalSelectorHi data[9] #define tPalSelectorLo data[10] // Blends mon/screen to designated color or back alternately tNumBlends times // Many uses of this task only set a tNumBlends of 2, which has the effect of blending to a color and back once void AnimTask_BlendColorCycle(u8 taskId) { gTasks[taskId].tPalSelector = gBattleAnimArgs[0]; gTasks[taskId].tDelay = gBattleAnimArgs[1]; gTasks[taskId].tNumBlends = gBattleAnimArgs[2]; gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3]; gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4]; gTasks[taskId].tBlendColor = gBattleAnimArgs[5]; gTasks[taskId].tRestoreBlend = FALSE; BlendColorCycle(taskId, 0, gTasks[taskId].tTargetBlendY); gTasks[taskId].func = AnimTask_BlendColorCycleLoop; } static void BlendColorCycle(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount) { u32 selectedPalettes = UnpackSelectedBattlePalettes(gTasks[taskId].tPalSelector); BeginNormalPaletteFade( selectedPalettes, gTasks[taskId].tDelay, startBlendAmount, targetBlendAmount, gTasks[taskId].tBlendColor); gTasks[taskId].tNumBlends--; gTasks[taskId].tRestoreBlend ^= 1; } static void AnimTask_BlendColorCycleLoop(u8 taskId) { u8 startBlendAmount, targetBlendAmount; if (!gPaletteFade.active) { if (gTasks[taskId].tNumBlends > 0) { if (!gTasks[taskId].tRestoreBlend) { // Blend to designated color startBlendAmount = gTasks[taskId].tInitialBlendY; targetBlendAmount = gTasks[taskId].tTargetBlendY; } else { // Blend back to original color startBlendAmount = gTasks[taskId].tTargetBlendY; targetBlendAmount = gTasks[taskId].tInitialBlendY; } if (gTasks[taskId].tNumBlends == 1) targetBlendAmount = 0; BlendColorCycle(taskId, startBlendAmount, targetBlendAmount); } else { DestroyAnimVisualTask(taskId); } } } // See AnimTask_BlendColorCycle. Same, but excludes Attacker and Target void AnimTask_BlendColorCycleExclude(u8 taskId) { int battler; u32 selectedPalettes = 0; gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].tDelay = gBattleAnimArgs[1]; gTasks[taskId].tNumBlends = gBattleAnimArgs[2]; gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3]; gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4]; gTasks[taskId].tBlendColor = gBattleAnimArgs[5]; gTasks[taskId].tRestoreBlend = 0; for (battler = 0; battler < gBattlersCount; battler++) { if (battler != gBattleAnimAttacker && battler != gBattleAnimTarget) selectedPalettes |= 1 << (battler + 16); } if (gBattleAnimArgs[0] == 1) selectedPalettes |= 0xE; gTasks[taskId].tPalSelectorHi = selectedPalettes >> 16; gTasks[taskId].tPalSelectorLo = selectedPalettes & 0xFF; BlendColorCycleExclude(taskId, 0, gTasks[taskId].tTargetBlendY); gTasks[taskId].func = AnimTask_BlendColorCycleExcludeLoop; } static void BlendColorCycleExclude(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount) { u32 selectedPalettes = ((u16)gTasks[taskId].tPalSelectorHi << 16) | (u16)gTasks[taskId].tPalSelectorLo; BeginNormalPaletteFade( selectedPalettes, gTasks[taskId].tDelay, startBlendAmount, targetBlendAmount, gTasks[taskId].tBlendColor); gTasks[taskId].tNumBlends--; gTasks[taskId].tRestoreBlend ^= 1; } static void AnimTask_BlendColorCycleExcludeLoop(u8 taskId) { u8 startBlendAmount, targetBlendAmount; if (!gPaletteFade.active) { if (gTasks[taskId].tNumBlends > 0) { if (!gTasks[taskId].tRestoreBlend) { // Blend to designated color startBlendAmount = gTasks[taskId].tInitialBlendY; targetBlendAmount = gTasks[taskId].tTargetBlendY; } else { // Blend back to original color startBlendAmount = gTasks[taskId].tTargetBlendY; targetBlendAmount = gTasks[taskId].tInitialBlendY; } if (gTasks[taskId].tNumBlends == 1) targetBlendAmount = 0; BlendColorCycleExclude(taskId, startBlendAmount, targetBlendAmount); } else { DestroyAnimVisualTask(taskId); } } } // See AnimTask_BlendColorCycle. Same, but selects palette by ANIM_TAG_* void AnimTask_BlendColorCycleByTag(u8 taskId) { gTasks[taskId].tPalTag = gBattleAnimArgs[0]; gTasks[taskId].tDelay = gBattleAnimArgs[1]; gTasks[taskId].tNumBlends = gBattleAnimArgs[2]; gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3]; gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4]; gTasks[taskId].tBlendColor = gBattleAnimArgs[5]; gTasks[taskId].tRestoreBlend = FALSE; BlendColorCycleByTag(taskId, 0, gTasks[taskId].tTargetBlendY); gTasks[taskId].func = AnimTask_BlendColorCycleByTagLoop; } static void BlendColorCycleByTag(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount) { u8 paletteIndex = IndexOfSpritePaletteTag(gTasks[taskId].tPalTag); BeginNormalPaletteFade( 1 << (paletteIndex + 16), gTasks[taskId].tDelay, startBlendAmount, targetBlendAmount, gTasks[taskId].tBlendColor); gTasks[taskId].tNumBlends--; gTasks[taskId].tRestoreBlend ^= 1; } static void AnimTask_BlendColorCycleByTagLoop(u8 taskId) { u8 startBlendAmount, targetBlendAmount; if (!gPaletteFade.active) { if (gTasks[taskId].tNumBlends > 0) { if (!gTasks[taskId].tRestoreBlend) { // Blend to designated color startBlendAmount = gTasks[taskId].tInitialBlendY; targetBlendAmount = gTasks[taskId].tTargetBlendY; } else { // Blend back to original color startBlendAmount = gTasks[taskId].tTargetBlendY; targetBlendAmount = gTasks[taskId].tInitialBlendY; } if (gTasks[taskId].tNumBlends == 1) targetBlendAmount = 0; BlendColorCycleByTag(taskId, startBlendAmount, targetBlendAmount); } else { DestroyAnimVisualTask(taskId); } } } #undef tPalSelector #undef tPalTag #undef tDelay #undef tNumBlends #undef tInitialBlendY #undef tTargetBlendY #undef tBlendColor #undef tRestoreBlend #undef tPalSelectorHi #undef tPalSelectorLo // Flashes the specified anim tag with given color. Used e.g. to flash the particles red in Hyper Beam void AnimTask_FlashAnimTagWithColor(u8 taskId) { u8 paletteIndex; gTasks[taskId].data[0] = gBattleAnimArgs[1]; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].data[5] = gBattleAnimArgs[5]; gTasks[taskId].data[6] = gBattleAnimArgs[6]; gTasks[taskId].data[7] = gBattleAnimArgs[0]; paletteIndex = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); BeginNormalPaletteFade(1 << (paletteIndex + 16), 0, gBattleAnimArgs[4], gBattleAnimArgs[4], gBattleAnimArgs[3]); gTasks[taskId].func = AnimTask_FlashAnimTagWithColor_Step1; } static void AnimTask_FlashAnimTagWithColor_Step1(u8 taskId) { u32 selectedPalettes; if (gTasks[taskId].data[0] > 0) { --gTasks[taskId].data[0]; return; } if (gPaletteFade.active) return; if (gTasks[taskId].data[2] == 0) { gTasks[taskId].func = AnimTask_FlashAnimTagWithColor_Step2; return; } selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16); if (gTasks[taskId].data[1] & 0x100) BeginNormalPaletteFade(selectedPalettes, 0, gTasks[taskId].data[4], gTasks[taskId].data[4], gTasks[taskId].data[3]); else BeginNormalPaletteFade(selectedPalettes, 0, gTasks[taskId].data[6], gTasks[taskId].data[6], gTasks[taskId].data[5]); gTasks[taskId].data[1] ^= 0x100; gTasks[taskId].data[0] = gTasks[taskId].data[1] & 0xFF; --gTasks[taskId].data[2]; } static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId) { u32 selectedPalettes; if (!gPaletteFade.active) { selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16); BeginNormalPaletteFade(selectedPalettes, 0, 0, 0, RGB(0, 0, 0)); DestroyAnimVisualTask(taskId); } } void AnimTask_InvertScreenColor(u8 taskId) { u32 selectedPalettes = 0; u8 attackerBattler = gBattleAnimAttacker; u8 targetBattler = gBattleAnimTarget; if (gBattleAnimArgs[0] & 0x100) selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE); if (gBattleAnimArgs[1] & 0x100) selectedPalettes |= (0x10000 << attackerBattler); if (gBattleAnimArgs[2] & 0x100) selectedPalettes |= (0x10000 << targetBattler); InvertPlttBuffer(selectedPalettes); DestroyAnimVisualTask(taskId); } // Unused #define tTimer data[0] #define tLength data[1] #define tFlagsScenery data[2] #define tFlagsAttacker data[3] #define tFlagsTarget data[4] #define tColorR data[5] #define tColorG data[6] #define tColorB data[7] static void AnimTask_TintPalettes(u8 taskId) { u8 attackerBattler; u8 targetBattler; u8 paletteIndex; u32 selectedPalettes = 0; if (gTasks[taskId].data[0] == 0) { gTasks[taskId].data[2] = gBattleAnimArgs[0]; gTasks[taskId].data[3] = gBattleAnimArgs[1]; gTasks[taskId].data[4] = gBattleAnimArgs[2]; gTasks[taskId].data[1] = gBattleAnimArgs[3]; gTasks[taskId].data[5] = gBattleAnimArgs[4]; gTasks[taskId].data[6] = gBattleAnimArgs[5]; gTasks[taskId].data[7] = gBattleAnimArgs[6]; } ++gTasks[taskId].data[0]; attackerBattler = gBattleAnimAttacker; targetBattler = gBattleAnimTarget; if (gTasks[taskId].data[2] & 0x100) selectedPalettes = 0x0000FFFF; if (gTasks[taskId].data[2] & 0x1) { paletteIndex = IndexOfSpritePaletteTag(gSprites[gHealthboxSpriteIds[attackerBattler]].template->paletteTag); selectedPalettes |= (1 << paletteIndex) << 16; } if (gTasks[taskId].data[3] & 0x100) selectedPalettes |= (1 << attackerBattler) << 16; if (gTasks[taskId].data[4] & 0x100) selectedPalettes |= (1 << targetBattler) << 16; TintPlttBuffer(selectedPalettes, gTasks[taskId].data[5], gTasks[taskId].data[6], gTasks[taskId].data[7]); if (gTasks[taskId].data[0] == gTasks[taskId].data[1]) { UnfadePlttBuffer(selectedPalettes); DestroyAnimVisualTask(taskId); } } #undef tTimer #undef tLength #undef tFlagsScenery #undef tFlagsAttacker #undef tFlagsTarget #undef tColorR #undef tColorG #undef tColorB static void AnimShakeMonOrBattleTerrain(struct Sprite *sprite) { u16 var0; sprite->invisible = TRUE; sprite->data[0] = -gBattleAnimArgs[0]; sprite->data[1] = gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[1]; sprite->data[3] = gBattleAnimArgs[2]; switch (gBattleAnimArgs[3]) { case 0: StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_X); break; case 1: StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_Y); break; case 2: StoreSpriteCallbackInData6(sprite, (void *)&gSpriteCoordOffsetX); break; default: StoreSpriteCallbackInData6(sprite, (void *)&gSpriteCoordOffsetY); break; } sprite->data[4] = *(u16 *)(sprite->data[6] | (sprite->data[7] << 16)); sprite->data[5] = gBattleAnimArgs[3]; var0 = sprite->data[5] - 2; if (var0 < 2) AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(); sprite->callback = AnimShakeMonOrBattleTerrain_Step; } static void AnimShakeMonOrBattleTerrain_Step(struct Sprite *sprite) { u32 i; u16 var0; if (sprite->data[3] > 0) { --sprite->data[3]; if (sprite->data[1] > 0) { --sprite->data[1]; } else { sprite->data[1] = sprite->data[2]; *(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) += sprite->data[0]; sprite->data[0] = -sprite->data[0]; } } else { *(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) = sprite->data[4]; var0 = sprite->data[5] - 2; if (var0 < 2) for (i = 0; i < gBattlersCount; ++i) gSprites[gBattlerSpriteIds[i]].coordOffsetEnabled = FALSE; DestroyAnimSprite(sprite); } } static void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void) { gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = FALSE; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = FALSE; if (gBattleAnimArgs[4] == 2) { gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = TRUE; } else { if (gBattleAnimArgs[4] == 0) gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE; else gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = TRUE; } } // Task data for AnimTask_ShakeBattleTerrain #define tXOffset data[0] #define tYOffset data[1] #define tNumShakes data[2] #define tTimer data[3] #define tShakeDelay data[8] // Can shake battle terrain back and forth on the X or down and back to original pos on Y (cant shake up from orig pos) // arg0: x offset of shake // arg1: y offset of shake // arg2: number of shakes // arg3: time between shakes void AnimTask_ShakeBattleTerrain(u8 taskId) { gTasks[taskId].tXOffset = gBattleAnimArgs[0]; gTasks[taskId].tYOffset = gBattleAnimArgs[1]; gTasks[taskId].tNumShakes = gBattleAnimArgs[2]; gTasks[taskId].tTimer = gBattleAnimArgs[3]; gTasks[taskId].tShakeDelay = gBattleAnimArgs[3]; gBattle_BG3_X = gBattleAnimArgs[0]; gBattle_BG3_Y = gBattleAnimArgs[1]; gTasks[taskId].func = AnimTask_ShakeBattleTerrain_Step; gTasks[taskId].func(taskId); } static void AnimTask_ShakeBattleTerrain_Step(u8 taskId) { if (gTasks[taskId].tTimer == 0) { if (gBattle_BG3_X == gTasks[taskId].tXOffset) gBattle_BG3_X = -gTasks[taskId].tXOffset; else gBattle_BG3_X = gTasks[taskId].tXOffset; if (gBattle_BG3_Y == -gTasks[taskId].tYOffset) gBattle_BG3_Y = 0; else gBattle_BG3_Y = -gTasks[taskId].tYOffset; gTasks[taskId].tTimer = gTasks[taskId].tShakeDelay; if (--gTasks[taskId].tNumShakes == 0) { gBattle_BG3_X = 0; gBattle_BG3_Y = 0; DestroyAnimVisualTask(taskId); } } else { gTasks[taskId].tTimer--; } } #undef tXOffset #undef tYOffset #undef tNumShakes #undef tTimer #undef tShakeDelay static void AnimHitSplatBasic(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); if (gBattleAnimArgs[2] == 0) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Same as basic hit splat but takes a length of time to persist for (arg4) static void AnimHitSplatPersistent(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); if (gBattleAnimArgs[2] == 0) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[4]; sprite->callback = RunStoredCallbackWhenAffineAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSpriteAfterTimer); } // For paired hit splats whose position is inverted when used by the opponent on the player. // Used by Twineedle and Spike Cannon static void AnimHitSplatHandleInvert(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER && !IsContest()) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; AnimHitSplatBasic(sprite); } static void AnimHitSplatRandom(struct Sprite *sprite) { if (gBattleAnimArgs[1] == -1) gBattleAnimArgs[1] = Random() & 3; StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]); if (gBattleAnimArgs[0] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); sprite->x2 += (Random() % 48) - 24; sprite->y2 += (Random() % 24) - 12; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } static void AnimHitSplatOnMonEdge(struct Sprite *sprite) { sprite->data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); sprite->x = gSprites[sprite->data[0]].x + gSprites[sprite->data[0]].x2; sprite->y = gSprites[sprite->data[0]].y + gSprites[sprite->data[0]].y2; sprite->x2 = gBattleAnimArgs[1]; sprite->y2 = gBattleAnimArgs[2]; StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } static void AnimCrossImpact(struct Sprite *sprite) { if (gBattleAnimArgs[2] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[3]; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = WaitAnimForDuration; } static void AnimFlashingHitSplat(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); if (gBattleAnimArgs[2] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); sprite->callback = AnimFlashingHitSplat_Step; } static void AnimFlashingHitSplat_Step(struct Sprite *sprite) { sprite->invisible ^= 1; if (sprite->data[0]++ > 12) DestroyAnimSprite(sprite); } ================================================ FILE: src/battle_anim_poison.c ================================================ #include "global.h" #include "battle_anim.h" #include "trig.h" static void AnimSludgeProjectile(struct Sprite *sprite); static void AnimAcidPoisonBubble(struct Sprite *sprite); static void AnimSludgeBombHitParticle(struct Sprite *sprite); static void AnimAcidPoisonDroplet(struct Sprite *sprite); static void AnimBubbleEffect(struct Sprite *sprite); static void AnimSludgeProjectile_Step(struct Sprite *sprite); static void AnimAcidPoisonBubble_Step(struct Sprite *sprite); static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite); static void AnimBubbleEffect_Step(struct Sprite *sprite); static const union AnimCmd sAnim_ToxicBubble[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(24, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_ToxicBubble[] = { sAnim_ToxicBubble, }; const struct SpriteTemplate gToxicBubbleSpriteTemplate = { .tileTag = ANIM_TAG_TOXIC_BUBBLE, .paletteTag = ANIM_TAG_TOXIC_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = sAnims_ToxicBubble, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos, }; static const union AnimCmd sAnim_PoisonProjectile[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_AcidPoisonDroplet[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_SludgeBombHit[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END, }; static const union AnimCmd *const sAnims_PoisonProjectile[] = { sAnim_PoisonProjectile, }; static const union AnimCmd *const sAnims_AcidPoisonDroplet[] = { sAnim_AcidPoisonDroplet, }; static const union AnimCmd *const sAnims_SludgeBombHit[] = { sAnim_SludgeBombHit, }; static const union AffineAnimCmd sAffineAnim_PoisonProjectile[] = { AFFINEANIMCMD_FRAME(0x160, 0x160, 0, 0), AFFINEANIMCMD_FRAME(-0xA, -0xA, 0, 10), AFFINEANIMCMD_FRAME(0xA, 0xA, 0, 10), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sAffineAnim_SludgeBombHit[] = { AFFINEANIMCMD_FRAME(0xEC, 0xEC, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_PoisonProjectile[] = { sAffineAnim_PoisonProjectile, }; static const union AffineAnimCmd *const sAffineAnims_SludgeBombHit[] = { sAffineAnim_SludgeBombHit, }; const struct SpriteTemplate gSludgeProjectileSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = sAnims_PoisonProjectile, .images = NULL, .affineAnims = sAffineAnims_PoisonProjectile, .callback = AnimSludgeProjectile, }; const struct SpriteTemplate gAcidPoisonBubbleSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = sAnims_PoisonProjectile, .images = NULL, .affineAnims = sAffineAnims_PoisonProjectile, .callback = AnimAcidPoisonBubble, }; const struct SpriteTemplate gSludgeBombHitParticleSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = sAnims_SludgeBombHit, .images = NULL, .affineAnims = sAffineAnims_SludgeBombHit, .callback = AnimSludgeBombHitParticle, }; static const union AffineAnimCmd sAffineAnim_AcidPoisonDroplet[] = { AFFINEANIMCMD_FRAME(-0x10, 0x10, 0, 6), AFFINEANIMCMD_FRAME(0x10, -0x10, 0, 6), AFFINEANIMCMD_JUMP(0), }; const union AffineAnimCmd *const gAffineAnims_Droplet[] = { sAffineAnim_AcidPoisonDroplet, }; const struct SpriteTemplate gAcidPoisonDropletSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = sAnims_AcidPoisonDroplet, .images = NULL, .affineAnims = gAffineAnims_Droplet, .callback = AnimAcidPoisonDroplet, }; static const union AffineAnimCmd sAffineAnim_Bubble[] = { AFFINEANIMCMD_FRAME(0x9C, 0x9C, 0, 0), AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 20), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_Bubble[] = { sAffineAnim_Bubble, }; const struct SpriteTemplate gPoisonBubbleSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = sAnims_PoisonProjectile, .images = NULL, .affineAnims = sAffineAnims_Bubble, .callback = AnimBubbleEffect, }; const struct SpriteTemplate gWaterBubbleSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gAnims_WaterBubble, .images = NULL, .affineAnims = sAffineAnims_Bubble, .callback = AnimBubbleEffect, }; static void AnimSludgeProjectile(struct Sprite *sprite) { if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); InitSpritePosToAnimAttacker(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[5] = -30; InitAnimArcTranslation(sprite); sprite->callback = AnimSludgeProjectile_Step; } static void AnimSludgeProjectile_Step(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) DestroyAnimSprite(sprite); } static void AnimAcidPoisonBubble(struct Sprite *sprite) { s16 l1, l2; if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); InitSpritePosToAnimAttacker(sprite, 1); SetAverageBattlerPositions(gBattleAnimTarget, 1, &l1, &l2); if (GetBattlerSide(gBattleAnimAttacker)) gBattleAnimArgs[4] = -gBattleAnimArgs[4]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = l1 + gBattleAnimArgs[4]; sprite->data[4] = l2 + gBattleAnimArgs[5]; sprite->data[5] = -30; InitAnimArcTranslation(sprite); sprite->callback = AnimAcidPoisonBubble_Step; } static void AnimAcidPoisonBubble_Step(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) DestroyAnimSprite(sprite); } static void AnimSludgeBombHitParticle(struct Sprite *sprite) { sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->x; sprite->data[2] = sprite->x + gBattleAnimArgs[0]; sprite->data[3] = sprite->y; sprite->data[4] = sprite->y + gBattleAnimArgs[1]; InitSpriteDataForLinearTranslation(sprite); sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; sprite->callback = AnimSludgeBombHitParticle_Step; } static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite) { TranslateSpriteLinearFixedPoint(sprite); sprite->data[1] -= sprite->data[5]; sprite->data[2] -= sprite->data[6]; if (!sprite->data[0]) DestroyAnimSprite(sprite); } static void AnimAcidPoisonDroplet(struct Sprite *sprite) { SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = sprite->x + gBattleAnimArgs[2]; sprite->data[4] = sprite->y + sprite->data[0]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Animates a bubble by rising upward, swaying side to side, and // enlarging the sprite. This is used as an after-effect by poison-type // moves, along with MOVE_BUBBLE, and MOVE_BUBBLEBEAM. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: 0 = single-target, 1 = multi-target static void AnimBubbleEffect(struct Sprite *sprite) { if (!gBattleAnimArgs[2]) { InitSpritePosToAnimTarget(sprite, TRUE); } else { SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; } sprite->callback = AnimBubbleEffect_Step; } static void AnimBubbleEffect_Step(struct Sprite *sprite) { sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF; sprite->x2 = Sin(sprite->data[0], 4); sprite->data[1] += 0x30; sprite->y2 = -(sprite->data[1] >> 8); if (sprite->affineAnimEnded) DestroyAnimSprite(sprite); } ================================================ FILE: src/battle_anim_psychic.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "scanline_effect.h" #include "trig.h" #include "constants/songs.h" static void AnimDefensiveWall(struct Sprite *sprite); static void AnimWallSparkle(struct Sprite *sprite); static void AnimBentSpoon(struct Sprite *sprite); static void AnimQuestionMark(struct Sprite *sprite); static void AnimRedX(struct Sprite *sprite); static void AnimSkillSwapOrb(struct Sprite *sprite); static void AnimPsychoBoost(struct Sprite *sprite); static void AnimDefensiveWall_Step2(struct Sprite *sprite); static void AnimDefensiveWall_Step3(struct Sprite *sprite); static void AnimDefensiveWall_Step4(struct Sprite *sprite); static void AnimDefensiveWall_Step5(struct Sprite *sprite); static void AnimQuestionMark_Step1(struct Sprite *sprite); static void AnimQuestionMark_Step2(struct Sprite *sprite); static void AnimTask_MeditateStretchAttacker_Step(u8 taskId); static void AnimTask_Teleport_Step(u8 taskId); static void AnimTask_ImprisonOrbs_Step(u8 taskId); static void AnimTask_SkillSwap_Step(u8 taskId); static void AnimTask_ExtrasensoryDistortion_Step(u8 taskId); static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId); static const union AffineAnimCmd sAffineAnim_PsychUpSpiral[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-0x2, -0x2, -10, 120), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_PsychUpSpiral[] = { sAffineAnim_PsychUpSpiral, }; const struct SpriteTemplate gPsychUpSpiralSpriteTemplate = { .tileTag = ANIM_TAG_SPIRAL, .paletteTag = ANIM_TAG_SPIRAL, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_PsychUpSpiral, .callback = AnimSpriteOnMonPos, }; const struct SpriteTemplate gLightScreenWallSpriteTemplate = { .tileTag = ANIM_TAG_GREEN_LIGHT_WALL, .paletteTag = ANIM_TAG_GREEN_LIGHT_WALL, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDefensiveWall, }; const struct SpriteTemplate gReflectWallSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_LIGHT_WALL, .paletteTag = ANIM_TAG_BLUE_LIGHT_WALL, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDefensiveWall, }; const struct SpriteTemplate gMirrorCoatWallSpriteTemplate = { .tileTag = ANIM_TAG_RED_LIGHT_WALL, .paletteTag = ANIM_TAG_RED_LIGHT_WALL, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDefensiveWall, }; const struct SpriteTemplate gBarrierWallSpriteTemplate = { .tileTag = ANIM_TAG_GRAY_LIGHT_WALL, .paletteTag = ANIM_TAG_GRAY_LIGHT_WALL, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDefensiveWall, }; const struct SpriteTemplate gMagicCoatWallSpriteTemplate = { .tileTag = ANIM_TAG_ORANGE_LIGHT_WALL, .paletteTag = ANIM_TAG_ORANGE_LIGHT_WALL, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDefensiveWall, }; static const union AnimCmd sAnim_ReflectSparkle[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_FRAME(64, 3), ANIMCMD_END, }; static const union AnimCmd *const sAnims_ReflectSparkle[] = { sAnim_ReflectSparkle, }; const struct SpriteTemplate gReflectSparkleSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_ReflectSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWallSparkle, }; static const union AnimCmd sAnim_SpecialScreenSparkle[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_FRAME(12, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_SpecialScreenSparkle[] = { sAnim_SpecialScreenSparkle, }; const struct SpriteTemplate gSpecialScreenSparkleSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_3, .paletteTag = ANIM_TAG_SPARKLE_3, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnims_SpecialScreenSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWallSparkle, }; const struct SpriteTemplate gGoldRingSpriteTemplate = { .tileTag = ANIM_TAG_GOLD_RING, .paletteTag = ANIM_TAG_GOLD_RING, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation, }; static const union AnimCmd sAnim_BentSpoon_0[] = { ANIMCMD_FRAME(8, 60, .hFlip = TRUE), ANIMCMD_FRAME(16, 5, .hFlip = TRUE), ANIMCMD_FRAME(8, 5, .hFlip = TRUE), ANIMCMD_FRAME(0, 5, .hFlip = TRUE), ANIMCMD_FRAME(8, 22, .hFlip = TRUE), ANIMCMD_LOOP(0), ANIMCMD_FRAME(16, 5, .hFlip = TRUE), ANIMCMD_FRAME(8, 5, .hFlip = TRUE), ANIMCMD_FRAME(0, 5, .hFlip = TRUE), ANIMCMD_FRAME(8, 5, .hFlip = TRUE), ANIMCMD_LOOP(1), ANIMCMD_FRAME(8, 22, .hFlip = TRUE), ANIMCMD_FRAME(24, 3, .hFlip = TRUE), ANIMCMD_FRAME(32, 3, .hFlip = TRUE), ANIMCMD_FRAME(40, 22, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_BentSpoon_1[] = { ANIMCMD_FRAME(8, 60), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(8, 22), ANIMCMD_LOOP(0), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_LOOP(1), ANIMCMD_FRAME(8, 22), ANIMCMD_FRAME(24, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(40, 22), ANIMCMD_END, }; static const union AnimCmd *const sAnims_BentSpoon[] = { sAnim_BentSpoon_0, sAnim_BentSpoon_1, }; const struct SpriteTemplate gBentSpoonSpriteTemplate = { .tileTag = ANIM_TAG_BENT_SPOON, .paletteTag = ANIM_TAG_BENT_SPOON, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = sAnims_BentSpoon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBentSpoon, }; static const union AnimCmd sAnim_QuestionMark[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(32, 6), ANIMCMD_FRAME(48, 6), ANIMCMD_FRAME(64, 6), ANIMCMD_FRAME(80, 6), ANIMCMD_FRAME(96, 18), ANIMCMD_END, }; static const union AnimCmd *const sAnims_QuestionMark[] = { sAnim_QuestionMark, }; static const union AffineAnimCmd sAffineAnim_QuestionMark[] = { AFFINEANIMCMD_FRAME(0, 0, 4, 4), AFFINEANIMCMD_FRAME(0, 0, -4, 8), AFFINEANIMCMD_FRAME(0, 0, 4, 4), AFFINEANIMCMD_LOOP(2), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_QuestionMark[] = { sAffineAnim_QuestionMark, }; const struct SpriteTemplate gQuestionMarkSpriteTemplate = { .tileTag = ANIM_TAG_AMNESIA, .paletteTag = ANIM_TAG_AMNESIA, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_QuestionMark, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimQuestionMark, }; static const union AffineAnimCmd sAffineAnim_MeditateStretchAttacker[] = { AFFINEANIMCMD_FRAME(-8, 10, 0, 16), AFFINEANIMCMD_FRAME(18, -18, 0, 16), AFFINEANIMCMD_FRAME(-20, 16, 0, 8), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Teleport[] = { AFFINEANIMCMD_FRAME(64, -4, 0, 20), AFFINEANIMCMD_FRAME(0, 0, 0, -56), AFFINEANIMCMD_END, }; static const struct SpriteTemplate sImprisonOrbSpriteTemplate = { .tileTag = ANIM_TAG_HOLLOW_ORB, .paletteTag = ANIM_TAG_HOLLOW_ORB, .oam = &gOamData_AffineOff_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; const struct SpriteTemplate gRedXSpriteTemplate = { .tileTag = ANIM_TAG_X_SIGN, .paletteTag = ANIM_TAG_X_SIGN, .oam = &gOamData_AffineOff_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRedX, }; static const union AffineAnimCmd sAffineAnim_SkillSwapOrb_0[] = { AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 8), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sAffineAnim_SkillSwapOrb_1[] = { AFFINEANIMCMD_FRAME(0xF0, 0xF0, 0, 0), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 6), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 2), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd sAffineAnim_SkillSwapOrb_2[] = { AFFINEANIMCMD_FRAME(0xD0, 0xD0, 0, 0), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 4), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 4), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd sAffineAnim_SkillSwapOrb_3[] = { AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 2), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 6), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sAffineAnims_SkillSwapOrb[] = { sAffineAnim_SkillSwapOrb_0, sAffineAnim_SkillSwapOrb_1, sAffineAnim_SkillSwapOrb_2, sAffineAnim_SkillSwapOrb_3, }; static const struct SpriteTemplate sSkillSwapOrbSpriteTemplate = { .tileTag = ANIM_TAG_BLUEGREEN_ORB, .paletteTag = ANIM_TAG_BLUEGREEN_ORB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_SkillSwapOrb, .callback = AnimSkillSwapOrb, }; static const union AffineAnimCmd sAffineAnim_LusterPurgeCircle[] = { AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 0), AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 120), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd *const gAffineAnims_LusterPurgeCircle[] = { sAffineAnim_LusterPurgeCircle, }; const struct SpriteTemplate gLusterPurgeCircleSpriteTemplate = { .tileTag = ANIM_TAG_WHITE_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_WHITE_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_LusterPurgeCircle, .callback = AnimSpriteOnMonPos, }; static const union AffineAnimCmd sAffineAnim_PsychoBoostOrb_0[] = { AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 0), AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 17), AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 10), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 10), AFFINEANIMCMD_LOOP(4), AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 5), AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 5), AFFINEANIMCMD_LOOP(7), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_PsychoBoostOrb_1[] = { AFFINEANIMCMD_FRAME(-0x14, 0x18, 0, 15), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_PsychoBoostOrb[] = { sAffineAnim_PsychoBoostOrb_0, sAffineAnim_PsychoBoostOrb_1, }; const struct SpriteTemplate gPsychoBoostOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_PsychoBoostOrb, .callback = AnimPsychoBoost, }; // For the rectangular wall sprite used by Reflect, Mirror Coat, etc static void AnimDefensiveWall(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest()) { sprite->oam.priority = 2; sprite->subpriority = 200; } if (!IsContest()) { u8 battlerCopy; u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); u8 rank = GetBattlerSpriteBGPriorityRank(battler); s32 var0 = 1; bool8 toBG2 = (rank ^ var0) != 0; if (IsBattlerSpriteVisible(battler)) MoveBattlerSpriteToBG(battler, toBG2); battler = BATTLE_PARTNER(battlerCopy); if (IsBattlerSpriteVisible(battler)) MoveBattlerSpriteToBG(battler, toBG2 ^ var0); } if (!IsContest() && IsDoubleBattle()) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { sprite->x = 72; sprite->y = 80; } else { sprite->x = 176; sprite->y = 40; } } else { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; } if (IsContest()) sprite->y += 9; sprite->data[0] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(gBattleAnimArgs[2])); sprite->callback = AnimDefensiveWall_Step2; sprite->callback(sprite); } // AnimDefensiveWall_Step1 is removed in FRLG from the removal of Contest handling static void AnimDefensiveWall_Step2(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); if (sprite->data[3] == 13) sprite->callback = AnimDefensiveWall_Step3; else ++sprite->data[3]; } static void AnimDefensiveWall_Step3(struct Sprite *sprite) { u16 color; u16 startOffset; s32 i; if (++sprite->data[1] == 2) { sprite->data[1] = 0; startOffset = sprite->data[0]; color = gPlttBufferFaded[startOffset + 8]; for (i = 8; i > 0; --i) gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1]; gPlttBufferFaded[startOffset + 1] = color; if (++sprite->data[2] == 16) sprite->callback = AnimDefensiveWall_Step4; } } static void AnimDefensiveWall_Step4(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); if (--sprite->data[3] == -1) { if (!IsContest()) { u8 battlerCopy; u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); if (IsBattlerSpriteVisible(battler)) gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; battler = BATTLE_PARTNER(battlerCopy); if (IsBattlerSpriteVisible(battler)) gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; } sprite->invisible = TRUE; sprite->callback = AnimDefensiveWall_Step5; } } static void AnimDefensiveWall_Step5(struct Sprite *sprite) { if (!IsContest()) { u8 battlerCopy; u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); u8 rank = GetBattlerSpriteBGPriorityRank(battler); s32 var0 = 1; bool8 toBG2 = (rank ^ var0) != 0; if (IsBattlerSpriteVisible(battler)) ResetBattleAnimBg(toBG2); battler = battlerCopy ^ 2; if (IsBattlerSpriteVisible(battler)) ResetBattleAnimBg(toBG2 ^ var0); } sprite->callback = DestroyAnimSprite; } // Animates the sparkle that appears during Reflect or Light Screen/Mirror Coat static void AnimWallSparkle(struct Sprite *sprite) { if (sprite->data[0] == 0) { bool32 ignoreOffsets = gBattleAnimArgs[3]; bool8 respectMonPicOffsets = FALSE; if (!ignoreOffsets) respectMonPicOffsets = TRUE; if (!IsContest() && IsDoubleBattle()) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { sprite->x = 72 - gBattleAnimArgs[0]; sprite->y = gBattleAnimArgs[1] + 80; } else { sprite->x = gBattleAnimArgs[0] + 176; sprite->y = gBattleAnimArgs[1] + 40; } } else { if (gBattleAnimArgs[2] == 0) InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); else InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); } ++sprite->data[0]; } else if (sprite->animEnded || sprite->affineAnimEnded) { DestroySpriteAndMatrix(sprite); } } static void AnimBentSpoon(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { StartSpriteAnim(sprite, 1); sprite->x -= 40; sprite->y += 10; sprite->data[1] = -1; } else { sprite->x += 40; sprite->y -= 10; sprite->data[1] = 1; } StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = RunStoredCallbackWhenAnimEnds; } // Used by Amnesia static void AnimQuestionMark(struct Sprite *sprite) { s16 x = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2; s16 y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / -2; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) x = -x; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + x; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + y; if (sprite->y < 16) sprite->y = 16; StoreSpriteCallbackInData6(sprite, AnimQuestionMark_Step1); sprite->callback = RunStoredCallbackWhenAnimEnds; } static void AnimQuestionMark_Step1(struct Sprite *sprite) { sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; sprite->affineAnims = sAffineAnims_QuestionMark; sprite->data[0] = 0; InitSpriteAffineAnim(sprite); sprite->callback = AnimQuestionMark_Step2; } static void AnimQuestionMark_Step2(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: if (sprite->affineAnimEnded) { FreeOamMatrix(sprite->oam.matrixNum); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; sprite->data[1] = 18; ++sprite->data[0]; } break; case 1: if (--sprite->data[1] == -1) DestroyAnimSprite(sprite); break; } } void AnimTask_MeditateStretchAttacker(u8 taskId) { struct Task *task = &gTasks[taskId]; u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[0] = spriteId; PrepareAffineAnimInTaskData(task, spriteId, sAffineAnim_MeditateStretchAttacker); task->func = AnimTask_MeditateStretchAttacker_Step; } static void AnimTask_MeditateStretchAttacker_Step(u8 taskId) { if (!RunAffineAnimFromTaskData(&gTasks[taskId])) DestroyAnimVisualTask(taskId); } void AnimTask_Teleport(u8 taskId) { struct Task *task = &gTasks[taskId]; u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[0] = spriteId; task->data[1] = 0; task->data[2] = 0; task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8; PrepareAffineAnimInTaskData(task, task->data[0], sAffineAnim_Teleport); task->func = AnimTask_Teleport_Step; } static void AnimTask_Teleport_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[1]) { case 0: RunAffineAnimFromTaskData(task); if (++task->data[2] > 19) ++task->data[1]; break; case 1: if (task->data[3] != 0) { gSprites[task->data[0]].y2 -= 8; --task->data[3]; } else { gSprites[task->data[0]].invisible = TRUE; gSprites[task->data[0]].x = DISPLAY_WIDTH + 32; ResetSpriteRotScale(task->data[0]); DestroyAnimVisualTask(taskId); } break; } } void AnimTask_ImprisonOrbs(u8 taskId) { u16 var0, var1; struct Task *task = &gTasks[taskId]; task->data[3] = 16; task->data[4] = 0; task->data[13] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); var0 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 3; var1 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 3; task->data[12] = var0 > var1 ? var0 : var1; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); task->func = AnimTask_ImprisonOrbs_Step; } static void AnimTask_ImprisonOrbs_Step(u8 taskId) { u32 i; u8 spriteId; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (++task->data[1] > 8) { task->data[1] = 0; spriteId = CreateSprite(&sImprisonOrbSpriteTemplate, task->data[13], task->data[14], 0); task->data[task->data[2] + 8] = spriteId; if (spriteId != MAX_SPRITES) { switch (task->data[2]) { case 0: gSprites[spriteId].x2 = task->data[12]; gSprites[spriteId].y2 = -task->data[12]; break; case 1: gSprites[spriteId].x2 = -task->data[12]; gSprites[spriteId].y2 = task->data[12]; break; case 2: gSprites[spriteId].x2 = task->data[12]; gSprites[spriteId].y2 = task->data[12]; break; case 3: gSprites[spriteId].x2 = -task->data[12]; gSprites[spriteId].y2 = -task->data[12]; break; } } if (++task->data[2] == 5) ++task->data[0]; } break; case 1: if (task->data[1] & 1) --task->data[3]; else ++task->data[4]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4])); if (++task->data[1] == 32) { for (i = 8; i < 13; ++i) if (task->data[i] != MAX_SPRITES) DestroySprite(&gSprites[task->data[i]]); ++task->data[0]; } break; case 2: ++task->data[0]; break; case 3: SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); DestroyAnimVisualTask(taskId); break; } } static void AnimRedX_Step(struct Sprite *sprite) { if (sprite->data[1] > sprite->data[0] - 10) sprite->invisible = sprite->data[1] & 1; if (sprite->data[1] == sprite->data[0]) DestroyAnimSprite(sprite); ++sprite->data[1]; } static void AnimRedX(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } sprite->data[0] = gBattleAnimArgs[1]; sprite->callback = AnimRedX_Step; } void AnimTask_SkillSwap(u8 taskId) { struct Task *task = &gTasks[taskId]; if (IsContest()) { if (gBattleAnimArgs[0] == ANIM_TARGET) { task->data[10] = -10; task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8; task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8; task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8; task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8; } else { task->data[10] = 10; task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8; task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8; task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8; task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8; } } else { if (gBattleAnimArgs[0] == 1) { task->data[10] = -10; task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8; task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8; task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8; task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8; } else { task->data[10] = 10; task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8; task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8; task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8; task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8; } } task->data[1] = 6; task->func = AnimTask_SkillSwap_Step; } static void AnimTask_SkillSwap_Step(u8 taskId) { u8 spriteId; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (++task->data[1] > 6) { task->data[1] = 0; spriteId = CreateSprite(&sSkillSwapOrbSpriteTemplate, task->data[11], task->data[12], 0); if (spriteId != 64) { gSprites[spriteId].data[0] = 16; gSprites[spriteId].data[2] = task->data[13]; gSprites[spriteId].data[4] = task->data[14]; gSprites[spriteId].data[5] = task->data[10]; InitAnimArcTranslation(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3); } if (++task->data[2] == 12) ++task->data[0]; } break; case 1: if (++task->data[1] > 17) DestroyAnimVisualTask(taskId); break; } } static void AnimSkillSwapOrb(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } } // The scanline effect that distorts the target during Extrasensory by segmenting the mon vertically and shifting the slices // arg0: Stage. Stage 0 is a slight right distortion, 1 is a medium left distortion, and 2 is a severe right distortion void AnimTask_ExtrasensoryDistortion(u8 taskId) { s32 i; u8 yOffset; struct ScanlineEffectParams scanlineParams; struct Task *task = &gTasks[taskId]; yOffset = GetBattlerYCoordWithElevation(gBattleAnimTarget); task->data[14] = yOffset - 32; switch (gBattleAnimArgs[0]) { case 0: task->data[11] = 2; task->data[12] = 5; task->data[13] = 64; task->data[15] = yOffset + 32; break; case 1: task->data[11] = 2; task->data[12] = 5; task->data[13] = 192; task->data[15] = yOffset + 32; break; case 2: task->data[11] = 4; task->data[12] = 4; task->data[13] = 0; task->data[15] = yOffset + 32; break; } if (task->data[14] < 0) task->data[14] = 0; if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1) { task->data[10] = gBattle_BG1_X; scanlineParams.dmaDest = ®_BG1HOFS; } else { task->data[10] = gBattle_BG2_X; scanlineParams.dmaDest = ®_BG2HOFS; } for (i = task->data[14]; i <= task->data[14] + 64; ++i) { gScanlineEffectRegBuffers[0][i] = task->data[10]; gScanlineEffectRegBuffers[1][i] = task->data[10]; } scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; ScanlineEffect_SetParams(scanlineParams); task->func = AnimTask_ExtrasensoryDistortion_Step; } static void AnimTask_ExtrasensoryDistortion_Step(u8 taskId) { s16 sineIndex, i; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: sineIndex = task->data[13]; for (i = task->data[14]; i <= task->data[15]; ++i) { s16 var2 = (gSineTable[sineIndex] >> task->data[12]); if (var2 > 0) var2 += (task->data[1] & 3); else if (var2 < 0) var2 -= (task->data[1] & 3); gScanlineEffectRegBuffers[0][i] = task->data[10] + var2; gScanlineEffectRegBuffers[1][i] = task->data[10] + var2; sineIndex += task->data[11]; } if (++task->data[1] > 23) ++task->data[0]; break; case 1: gScanlineEffect.state = 3; ++task->data[0]; break; case 2: DestroyAnimVisualTask(taskId); break; } } // Creates a cloned transparent sprite of the battler that grows and then shrinks back to original size. Used by Extrasensory // arg0: battler void AnimTask_TransparentCloneGrowAndShrink(u8 taskId) { s16 spriteId; s16 matrixNum; struct Task *task = &gTasks[taskId]; matrixNum = AllocOamMatrix(); if (matrixNum == 0xFF) { DestroyAnimVisualTask(taskId); return; } spriteId = CloneBattlerSpriteWithBlend(gBattleAnimArgs[0]); if (spriteId < 0) { FreeOamMatrix(matrixNum); DestroyAnimVisualTask(taskId); return; } gSprites[spriteId].callback = SpriteCallbackDummy; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; gSprites[spriteId].oam.matrixNum = matrixNum; gSprites[spriteId].affineAnimPaused = TRUE; ++gSprites[spriteId].subpriority; SetSpriteRotScale(spriteId, 256, 256, 0); CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode); task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); task->data[14] = matrixNum; task->data[15] = spriteId; task->func = AnimTask_TransparentCloneGrowAndShrink_Step; } static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[1] += 4; task->data[2] = 256 - (gSineTable[task->data[1]] >> 1); SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0); SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]); if (task->data[1] == 48) ++task->data[0]; break; case 1: task->data[1] -= 4; task->data[2] = 256 - (gSineTable[task->data[1]] >> 1); SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0); SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]); if (task->data[1] == 0) ++task->data[0]; break; case 2: DestroySpriteWithActiveSheet(&gSprites[task->data[15]]); ++task->data[0]; break; case 3: FreeOamMatrix(task->data[14]); DestroyAnimVisualTask(taskId); break; } } static void AnimPsychoBoost(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); if (IsContest()) sprite->y += 12; sprite->data[1] = 8; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1])); ++sprite->data[0]; break; case 1: if (sprite->affineAnimEnded) { PlaySE12WithPanning(SE_M_TELEPORT, BattleAnimAdjustPanning(-64)); ChangeSpriteAffineAnim(sprite, 1); ++sprite->data[0]; } break; case 2: if (sprite->data[2]++ > 1) { sprite->data[2] = 0; --sprite->data[1]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1])); if (sprite->data[1] == 0) { ++sprite->data[0]; sprite->invisible = TRUE; } } sprite->data[3] += 0x380; sprite->y2 -= sprite->data[3] >> 8; sprite->data[3] &= 0xFF; break; case 3: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimSprite(sprite); break; } } ================================================ FILE: src/battle_anim_rock.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "graphics.h" #include "task.h" #include "trig.h" #include "constants/songs.h" static void AnimFallingRock(struct Sprite *sprite); static void AnimRockFragment(struct Sprite *sprite); static void AnimFlyingSandCrescent(struct Sprite *sprite); static void AnimRaiseSprite(struct Sprite *sprite); static void AnimTask_Rollout_Step(u8 taskId); static void AnimRolloutParticle(struct Sprite *sprite); static void AnimRockTomb(struct Sprite *sprite); static void AnimRockBlastRock(struct Sprite *sprite); static void AnimRockScatter(struct Sprite *sprite); static void AnimParticleInVortex(struct Sprite *sprite); static void AnimFallingRock_Step(struct Sprite *sprite); static void AnimParticleInVortex_Step(struct Sprite *sprite); static void AnimTask_LoadSandstormBackground_Step(u8 taskId); static void CreateRolloutDirtSprite(struct Task *task); static u8 GetRolloutCounter(void); static void AnimRockTomb_Step(struct Sprite *sprite); static void AnimRockScatter_Step(struct Sprite *sprite); static const union AnimCmd sAnim_FlyingRock_0[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_FlyingRock_1[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_FlyingRock_2[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END, }; static const union AnimCmd *const sAnims_FlyingRock[] = { sAnim_FlyingRock_0, sAnim_FlyingRock_1, sAnim_FlyingRock_2, }; const struct SpriteTemplate gFallingRockSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FlyingRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFallingRock, }; const struct SpriteTemplate gRockFragmentSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FlyingRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRockFragment, }; const struct SpriteTemplate gSwirlingDirtSpriteTemplate = { .tileTag = ANIM_TAG_MUD_SAND, .paletteTag = ANIM_TAG_MUD_SAND, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex, }; static const union AffineAnimCmd sAffineAnim_Whirlpool[] = { AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0), AFFINEANIMCMD_FRAME(0x2, -0x3, 0, 5), AFFINEANIMCMD_FRAME(-0x2, 0x3, 0, 5), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sAffineAnims_Whirlpool[] = { sAffineAnim_Whirlpool, }; const struct SpriteTemplate gWhirlpoolSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gAnims_WaterMudOrb, .images = NULL, .affineAnims = sAffineAnims_Whirlpool, .callback = AnimParticleInVortex, }; const struct SpriteTemplate gFireSpinSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_BasicFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex, }; const struct SpriteTemplate gFlyingSandCrescentSpriteTemplate = { .tileTag = ANIM_TAG_FLYING_DIRT, .paletteTag = ANIM_TAG_FLYING_DIRT, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFlyingSandCrescent, }; static const struct Subsprite sFlyingSandSubsprites[] = { { .x = -16, .y = 0, .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .tileOffset = 0, .priority = 1, }, { .x = 16, .y = 0, .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .tileOffset = 8, .priority = 1, }, }; static const struct SubspriteTable sFlyingSandSubspriteTable[] = { { NELEMS(sFlyingSandSubsprites), sFlyingSandSubsprites }, }; static const union AnimCmd sAnim_Rock_Biggest[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Rock_Bigger[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Rock_Big[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Rock_Small[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Rock_Smaller[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Rock_Smallest[] = { ANIMCMD_FRAME(80, 1), ANIMCMD_END, }; static const union AnimCmd *const sAnims_BasicRock[] = { sAnim_Rock_Biggest, sAnim_Rock_Bigger, sAnim_Rock_Big, sAnim_Rock_Small, sAnim_Rock_Smaller, sAnim_Rock_Smallest, }; const struct SpriteTemplate gAncientPowerRockSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_BasicRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRaiseSprite, }; const struct SpriteTemplate gRolloutMudSpriteTemplate = { .tileTag = ANIM_TAG_MUD_SAND, .paletteTag = ANIM_TAG_MUD_SAND, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRolloutParticle, }; const struct SpriteTemplate gRolloutRockSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRolloutParticle, }; const struct SpriteTemplate gRockTombRockSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_BasicRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRockTomb, }; static const union AffineAnimCmd sAffineAnim_BasicRock_0[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 5), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sAffineAnim_BasicRock_1[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 5), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAffineAnims_BasicRock[] = { sAffineAnim_BasicRock_0, sAffineAnim_BasicRock_1, }; const struct SpriteTemplate gRockBlastRockSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_BasicRock, .images = NULL, .affineAnims = sAffineAnims_BasicRock, .callback = AnimRockBlastRock, }; const struct SpriteTemplate gRockScatterSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_BasicRock, .images = NULL, .affineAnims = sAffineAnims_BasicRock, .callback = AnimRockScatter, }; const struct SpriteTemplate gTwisterRockSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = &sAnims_BasicRock[4], .images = NULL, .affineAnims = sAffineAnims_BasicRock, .callback = AnimMoveTwisterParticle, }; const struct SpriteTemplate gWeatherBallRockDownSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = &sAnims_BasicRock[2], .images = NULL, .affineAnims = sAffineAnims_BasicRock, .callback = AnimWeatherBallDown, }; static void AnimFallingRock(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0) SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y); sprite->x += gBattleAnimArgs[0]; sprite->y += 14; StartSpriteAnim(sprite, gBattleAnimArgs[1]); AnimateSprite(sprite); sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 4; sprite->data[3] = 16; sprite->data[4] = -70; sprite->data[5] = gBattleAnimArgs[2]; StoreSpriteCallbackInData6(sprite, AnimFallingRock_Step); sprite->callback = TranslateSpriteInEllipse; sprite->callback(sprite); } static void AnimFallingRock_Step(struct Sprite *sprite) { sprite->x += sprite->data[5]; sprite->data[0] = 192; sprite->data[1] = sprite->data[5]; sprite->data[2] = 4; sprite->data[3] = 32; sprite->data[4] = -24; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteInEllipse; sprite->callback(sprite); } // Animates the rock particles that are shown on the impact for Rock Blast / Rock Smash static void AnimRockFragment(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[5]); AnimateSprite(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = sprite->x; sprite->data[2] = sprite->x + gBattleAnimArgs[2]; sprite->data[3] = sprite->y; sprite->data[4] = sprite->y + gBattleAnimArgs[3]; InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = 0; sprite->data[4] = 0; sprite->callback = TranslateSpriteLinearFixedPoint; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } // Swirls particle in vortex. Used for moves like Fire Spin or Sand Tomb static void AnimParticleInVortex(struct Sprite *sprite) { if (gBattleAnimArgs[6] == 0) InitSpritePosToAnimAttacker(sprite, 0); else InitSpritePosToAnimTarget(sprite, FALSE); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[4]; sprite->data[3] = gBattleAnimArgs[5]; sprite->callback = AnimParticleInVortex_Step; } static void AnimParticleInVortex_Step(struct Sprite *sprite) { sprite->data[4] += sprite->data[1]; sprite->y2 = -(sprite->data[4] >> 8); sprite->x2 = Sin(sprite->data[5], sprite->data[3]); sprite->data[5] = (sprite->data[5] + sprite->data[2]) & 0xFF; if (--sprite->data[0] == -1) { DestroyAnimSprite(sprite); } } void AnimTask_LoadSandstormBackground(u8 taskId) { s32 var0; struct BattleAnimBgData animBg; var0 = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemap(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap); AnimLoadCompressedBgGfx(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet, animBg.tilesOffset); LoadCompressedPalette(gBattleAnimSpritePal_FlyingDirt, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); if (IsContest()) RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0); if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) var0 = 1; gTasks[taskId].data[0] = var0; gTasks[taskId].func = AnimTask_LoadSandstormBackground_Step; } static void AnimTask_LoadSandstormBackground_Step(u8 taskId) { struct BattleAnimBgData animBg; if (gTasks[taskId].data[0] == 0) gBattle_BG1_X += -6; else gBattle_BG1_X += 6; gBattle_BG1_Y += -1; switch (gTasks[taskId].data[12]) { case 0: if (++gTasks[taskId].data[10] == 4) { gTasks[taskId].data[10] = 0; ++gTasks[taskId].data[11]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 7) { ++gTasks[taskId].data[12]; gTasks[taskId].data[11] = 0; } } break; case 1: if (++gTasks[taskId].data[11] == 101) { gTasks[taskId].data[11] = 7; ++gTasks[taskId].data[12]; } break; case 2: if (++gTasks[taskId].data[10] == 4) { gTasks[taskId].data[10] = 0; --gTasks[taskId].data[11]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 0) { ++gTasks[taskId].data[12]; gTasks[taskId].data[11] = 0; } } break; case 3: GetBattleAnimBg1Data(&animBg); InitBattleAnimBg(animBg.bgId); ++gTasks[taskId].data[12]; break; case 4: if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); DestroyAnimVisualTask(taskId); break; } } // Animates the sprites that fly diagonally across the screen // in Sandstorm and Heat Wave. // arg 0: initial y pixel offset // arg 1: projectile speed // arg 2: y pixel drop // arg 3: ??? unknown (possibly a color bit) static void AnimFlyingSandCrescent(struct Sprite *sprite) { if (sprite->data[0] == 0) { if (gBattleAnimArgs[3] != 0 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x = 304; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; sprite->data[5] = 1; sprite->oam.matrixNum = ST_OAM_HFLIP; } else { sprite->x = -64; } sprite->y = gBattleAnimArgs[0]; SetSubspriteTables(sprite, sFlyingSandSubspriteTable); sprite->data[1] = gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[2]; ++sprite->data[0]; } else { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->x2 += (sprite->data[3] >> 8); sprite->y2 += (sprite->data[4] >> 8); sprite->data[3] &= 0xFF; sprite->data[4] &= 0xFF; if (sprite->data[5] == 0) { if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 32) { sprite->callback = DestroyAnimSprite; } } else if (sprite->x + sprite->x2 < -32) { sprite->callback = DestroyAnimSprite; } } } // Animates the rising rocks in Ancient Power. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: terminal y offset // arg 3: duration // arg 4: sprite size [1,5] static void AnimRaiseSprite(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); InitSpritePosToAnimAttacker(sprite, 0); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[2] = sprite->x; sprite->data[4] = sprite->y + gBattleAnimArgs[2]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } void AnimTask_Rollout(u8 taskId) { u16 var0, var1, var2, var3; u8 rolloutCounter; s32 var5; s16 pan1, pan2; struct Task *task; task = &gTasks[taskId]; var0 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); var1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 24; var2 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); var3 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 24; if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget) var3 = var1; rolloutCounter = GetRolloutCounter(); if (rolloutCounter == 1) task->data[8] = 32; else task->data[8] = 48 - (rolloutCounter * 8); task->data[0] = 0; task->data[11] = 0; task->data[9] = 0; task->data[12] = 1; var5 = task->data[8]; if (var5 < 0) var5 += 7; task->data[10] = (var5 >> 3) - 1; task->data[2] = var0 * 8; task->data[3] = var1 * 8; task->data[4] = ((var2 - var0) * 8) / task->data[8]; task->data[5] = ((var3 - var1) * 8) / task->data[8]; task->data[6] = 0; task->data[7] = 0; pan1 = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER); pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET); task->data[13] = pan1; task->data[14] = (pan2 - pan1) / task->data[8]; task->data[1] = rolloutCounter; task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->func = AnimTask_Rollout_Step; } static void AnimTask_Rollout_Step(u8 taskId) { struct Task *task; task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[6] -= task->data[4]; task->data[7] -= task->data[5]; gSprites[task->data[15]].x2 = task->data[6] >> 3; gSprites[task->data[15]].y2 = task->data[7] >> 3; if (++task->data[9] == 10) { task->data[11] = 20; ++task->data[0]; } PlaySE12WithPanning(SE_M_HEADBUTT, task->data[13]); break; case 1: if (--task->data[11] == 0) ++task->data[0]; break; case 2: if (--task->data[9] != 0) { task->data[6] += task->data[4]; task->data[7] += task->data[5]; } else { task->data[6] = 0; task->data[7] = 0; ++task->data[0]; } gSprites[task->data[15]].x2 = task->data[6] >> 3; gSprites[task->data[15]].y2 = task->data[7] >> 3; break; case 3: task->data[2] += task->data[4]; task->data[3] += task->data[5]; if (++task->data[9] >= task->data[10]) { task->data[9] = 0; CreateRolloutDirtSprite(task); task->data[13] += task->data[14]; PlaySE12WithPanning(SE_M_DIG, task->data[13]); } if (--task->data[8] == 0) { ++task->data[0]; } break; case 4: if (task->data[11] == 0) DestroyAnimVisualTask(taskId); break; } } static void CreateRolloutDirtSprite(struct Task *task) { const struct SpriteTemplate *spriteTemplate; s32 tileOffset; u16 x, y; u8 spriteId; switch (task->data[1]) { case 1: spriteTemplate = &gRolloutMudSpriteTemplate; tileOffset = 0; break; case 2: case 3: spriteTemplate = &gRolloutRockSpriteTemplate; tileOffset = 80; break; case 4: spriteTemplate = &gRolloutRockSpriteTemplate; tileOffset = 64; break; case 5: spriteTemplate = &gRolloutRockSpriteTemplate; tileOffset = 48; break; default: return; } x = task->data[2] >> 3; y = task->data[3] >> 3; x += (task->data[12] * 4); spriteId = CreateSprite(spriteTemplate, x, y, 35); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[0] = 18; gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3); gSprites[spriteId].data[4] = y; gSprites[spriteId].data[5] = -16 - (task->data[1] * 2); gSprites[spriteId].oam.tileNum += tileOffset; InitAnimArcTranslation(&gSprites[spriteId]); ++task->data[11]; } task->data[12] *= -1; } static void AnimRolloutParticle(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { u8 taskId = FindTaskIdByFunc(AnimTask_Rollout_Step); if (taskId != TASK_NONE) --gTasks[taskId].data[11]; DestroySprite(sprite); } } static u8 GetRolloutCounter(void) { u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer; u8 var0 = retVal - 1; if (var0 > 4) retVal = 1; return retVal; } static void AnimRockTomb(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); sprite->x2 = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[1]; sprite->data[3] -= gBattleAnimArgs[2]; sprite->data[0] = 3; sprite->data[1] = gBattleAnimArgs[3]; sprite->callback = AnimRockTomb_Step; sprite->invisible = TRUE; } static void AnimRockTomb_Step(struct Sprite *sprite) { sprite->invisible = FALSE; if (sprite->data[3] != 0) { sprite->y2 = sprite->data[2] + sprite->data[3]; sprite->data[3] += sprite->data[0]; ++sprite->data[0]; if (sprite->data[3] > 0) { sprite->data[3] = 0; } } else if (--sprite->data[1] == 0) { DestroyAnimSprite(sprite); } } static void AnimRockBlastRock(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) StartSpriteAffineAnim(sprite, 1); TranslateAnimSpriteToTargetMonLocation(sprite); } static void AnimRockScatter(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[1] = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[1]; sprite->data[5] = gBattleAnimArgs[2]; StartSpriteAnim(sprite, gBattleAnimArgs[3]); sprite->callback = AnimRockScatter_Step; } static void AnimRockScatter_Step(struct Sprite *sprite) { sprite->data[0] += 8; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->x2 += sprite->data[3] / 40; sprite->y2 -= Sin(sprite->data[0], sprite->data[5]); if (sprite->data[0] > 140) DestroyAnimSprite(sprite); } void AnimTask_GetSeismicTossDamageLevel(u8 taskId) { if (gAnimMoveDmg < 33) gBattleAnimArgs[ARG_RET_ID] = 0; if ((u32)gAnimMoveDmg - 33 < 33) gBattleAnimArgs[ARG_RET_ID] = 1; if (gAnimMoveDmg > 65) gBattleAnimArgs[ARG_RET_ID] = 2; DestroyAnimVisualTask(taskId); } void AnimTask_MoveSeismicTossBg(u8 taskId) { if (gTasks[taskId].data[0] == 0) { ToggleBg3Mode(0); gTasks[taskId].data[1] = 200; } gBattle_BG3_Y += gTasks[taskId].data[1] / 10; gTasks[taskId].data[1] -= 3; if (gTasks[taskId].data[0] == 120) { ToggleBg3Mode(1); DestroyAnimVisualTask(taskId); } ++gTasks[taskId].data[0]; } void AnimTask_SeismicTossBgAccelerateDownAtEnd(u8 taskId) { if (gTasks[taskId].data[0] == 0) { ToggleBg3Mode(0); ++gTasks[taskId].data[0]; gTasks[taskId].data[2] = gBattle_BG3_Y; } gTasks[taskId].data[1] += 80; gTasks[taskId].data[1] &= 0xFF; gBattle_BG3_Y = gTasks[taskId].data[2] + Cos(4, gTasks[taskId].data[1]); if (gBattleAnimArgs[7] == 0xFFF) { gBattle_BG3_Y = 0; ToggleBg3Mode(1); DestroyAnimVisualTask(taskId); } } ================================================ FILE: src/battle_anim_smokescreen.c ================================================ #include "global.h" #include "battle_gfx_sfx_util.h" #include "decompress.h" #include "graphics.h" #include "util.h" #define TAG_SMOKESCREEN 55019 #define PALTAG_SHADOW 55039 #define GFXTAG_SHADOW 55129 static void SpriteCB_SmokescreenImpactMain(struct Sprite *); static void SpriteCB_SmokescreenImpact(struct Sprite *); static const struct CompressedSpriteSheet sSmokescreenImpactSpriteSheet = { .data = gSmokescreenImpactTiles, .size = 0x180, .tag = TAG_SMOKESCREEN }; static const struct CompressedSpritePalette sSmokescreenImpactSpritePalette = { .data = gSmokescreenImpactPalette, .tag = TAG_SMOKESCREEN }; static const struct OamData sOamData_SmokescreenImpact = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0 }; static const union AnimCmd sAnim_SmokescreenImpact_0[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_END }; static const union AnimCmd sAnim_SmokescreenImpact_1[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(4, 4, .hFlip = TRUE), ANIMCMD_FRAME(8, 4, .hFlip = TRUE), ANIMCMD_END }; static const union AnimCmd sAnim_SmokescreenImpact_2[] = { ANIMCMD_FRAME(0, 4, .vFlip = TRUE), ANIMCMD_FRAME(4, 4, .vFlip = TRUE), ANIMCMD_FRAME(8, 4, .vFlip = TRUE), ANIMCMD_END }; static const union AnimCmd sAnim_SmokescreenImpact_3[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(4, 4, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(8, 4, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_END }; static const union AnimCmd *const sAnims_SmokescreenImpact[] = { sAnim_SmokescreenImpact_0, sAnim_SmokescreenImpact_1, sAnim_SmokescreenImpact_2, sAnim_SmokescreenImpact_3, }; static const struct SpriteTemplate sSmokescreenImpactSpriteTemplate = { .tileTag = TAG_SMOKESCREEN, .paletteTag = TAG_SMOKESCREEN, .oam = &sOamData_SmokescreenImpact, .anims = sAnims_SmokescreenImpact, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SmokescreenImpact }; const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow = { .data = gEnemyMonShadow_Gfx, .size = 0x80, .tag = GFXTAG_SHADOW }; static const struct OamData sOamData_EnemyShadow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 3, .paletteNum = 0, .affineParam = 0 }; const struct SpriteTemplate gSpriteTemplate_EnemyShadow = { .tileTag = GFXTAG_SHADOW, .paletteTag = PALTAG_SHADOW, .oam = &sOamData_EnemyShadow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SetInvisible }; #define sActiveSprites data[0] #define sPersist data[1] #define sMainSpriteId data[0] u8 SmokescreenImpact(s16 x, s16 y, bool8 persist) { u8 mainSpriteId; u8 spriteId1, spriteId2, spriteId3, spriteId4; struct Sprite *mainSprite; if (GetSpriteTileStartByTag(sSmokescreenImpactSpriteSheet.tag) == 0xFFFF) { LoadCompressedSpriteSheetUsingHeap(&sSmokescreenImpactSpriteSheet); LoadCompressedSpritePaletteUsingHeap(&sSmokescreenImpactSpritePalette); } mainSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_SmokescreenImpactMain); mainSprite = &gSprites[mainSpriteId]; mainSprite->sPersist = persist; // Top left sprite spriteId1 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2); gSprites[spriteId1].sMainSpriteId = mainSpriteId; mainSprite->sActiveSprites++; AnimateSprite(&gSprites[spriteId1]); // Top right sprite spriteId2 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y - 16, 2); gSprites[spriteId2].sMainSpriteId = mainSpriteId; mainSprite->sActiveSprites++; StartSpriteAnim(&gSprites[spriteId2], 1); AnimateSprite(&gSprites[spriteId2]); // Bottom left sprite spriteId3 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y, 2); gSprites[spriteId3].sMainSpriteId = mainSpriteId; mainSprite->sActiveSprites++; StartSpriteAnim(&gSprites[spriteId3], 2); AnimateSprite(&gSprites[spriteId3]); // Bottom right sprite spriteId4 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y, 2); gSprites[spriteId4].sMainSpriteId = mainSpriteId; mainSprite->sActiveSprites++; StartSpriteAnim(&gSprites[spriteId4], 3); AnimateSprite(&gSprites[spriteId4]); return mainSpriteId; } static void SpriteCB_SmokescreenImpactMain(struct Sprite *sprite) { if (sprite->sActiveSprites == 0) { FreeSpriteTilesByTag(sSmokescreenImpactSpriteSheet.tag); FreeSpritePaletteByTag(sSmokescreenImpactSpritePalette.tag); if (!sprite->sPersist) DestroySprite(sprite); else sprite->callback = SpriteCallbackDummy; } } static void SpriteCB_SmokescreenImpact(struct Sprite *sprite) { if (sprite->animEnded) { gSprites[sprite->sMainSpriteId].sActiveSprites--; DestroySprite(sprite); } } ================================================ FILE: src/battle_anim_sound_tasks.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "task.h" #include "constants/battle_anim.h" #include "constants/sound.h" static void SoundTask_FireBlast_Step1(u8 taskId); static void SoundTask_FireBlast_Step2(u8 taskId); static void SoundTask_LoopSEAdjustPanning_Step(u8 taskId); static void SoundTask_PlayDoubleCry_Step(u8 taskId); static void SoundTask_PlayCryWithEcho_Step(u8 taskId); static void SoundTask_AdjustPanningVar_Step(u8 taskId); // Loops the specified sound effect and pans from the // attacker to the target. The second specified sound effect // is played at the very end. This task is effectively // hardcoded to the move FIRE_BLAST due to the baked-in // durations. // arg 0: looped sound effect // arg 1: ending sound effect void SoundTask_FireBlast(u8 taskId) { s8 pan1, pan2, panIncrement; gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[1] = gBattleAnimArgs[1]; pan1 = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER); pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET); panIncrement = CalculatePanIncrement(pan1, pan2, 2); gTasks[taskId].data[2] = pan1; gTasks[taskId].data[3] = pan2; gTasks[taskId].data[4] = panIncrement; gTasks[taskId].data[10] = 10; gTasks[taskId].func = SoundTask_FireBlast_Step1; } static void SoundTask_FireBlast_Step1(u8 taskId) { s16 pan = gTasks[taskId].data[2]; s8 panIncrement = gTasks[taskId].data[4]; if (++gTasks[taskId].data[11] == 111) { gTasks[taskId].data[10] = 5; gTasks[taskId].data[11] = 0; gTasks[taskId].func = SoundTask_FireBlast_Step2; } else { if (++gTasks[taskId].data[10] == 11) { gTasks[taskId].data[10] = 0; PlaySE12WithPanning(gTasks[taskId].data[0], pan); } pan += panIncrement; gTasks[taskId].data[2] = KeepPanInRange(pan, panIncrement); } } static void SoundTask_FireBlast_Step2(u8 taskId) { if (++gTasks[taskId].data[10] == 6) { s8 pan; gTasks[taskId].data[10] = 0; pan = BattleAnimAdjustPanning(SOUND_PAN_TARGET); PlaySE12WithPanning(gTasks[taskId].data[1], pan); if (++gTasks[taskId].data[11] == 2) DestroyAnimSoundTask(taskId); } } void SoundTask_LoopSEAdjustPanning(u8 taskId) { u16 songId = gBattleAnimArgs[0]; s8 targetPan = gBattleAnimArgs[2]; s8 panIncrement = gBattleAnimArgs[3]; u8 r10 = gBattleAnimArgs[4]; u8 r7 = gBattleAnimArgs[5]; u8 r9 = gBattleAnimArgs[6]; s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); targetPan = BattleAnimAdjustPanning(targetPan); panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement); gTasks[taskId].data[0] = songId; gTasks[taskId].data[1] = sourcePan; gTasks[taskId].data[2] = targetPan; gTasks[taskId].data[3] = panIncrement; gTasks[taskId].data[4] = r10; gTasks[taskId].data[5] = r7; gTasks[taskId].data[6] = r9; gTasks[taskId].data[10] = 0; gTasks[taskId].data[11] = sourcePan; gTasks[taskId].data[12] = r9; gTasks[taskId].func = SoundTask_LoopSEAdjustPanning_Step; gTasks[taskId].func(taskId); } static void SoundTask_LoopSEAdjustPanning_Step(u8 taskId) { if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6]) { gTasks[taskId].data[12] = 0; PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[11]); if (--gTasks[taskId].data[4] == 0) { DestroyAnimSoundTask(taskId); return; } } if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5]) { u16 dPan, oldPan; gTasks[taskId].data[10] = 0; dPan = gTasks[taskId].data[3]; oldPan = gTasks[taskId].data[11]; gTasks[taskId].data[11] = dPan + oldPan; gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan); } } void SoundTask_PlayCryHighPitch(u8 taskId) { u16 species = SPECIES_NONE; u8 battlerId; s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER); // Get wanted battler. if (gBattleAnimArgs[0] == ANIM_ATTACKER) battlerId = gBattleAnimAttacker; else if (gBattleAnimArgs[0] == ANIM_TARGET) battlerId = gBattleAnimTarget; else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER) battlerId = BATTLE_PARTNER(gBattleAnimAttacker); else battlerId = BATTLE_PARTNER(gBattleAnimTarget); // Check if battler is visible. if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId)) { DestroyAnimVisualTask(taskId); return; } if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); if (species != SPECIES_NONE) PlayCry_ByMode(species, pan, CRY_MODE_HIGH_PITCH); DestroyAnimVisualTask(taskId); } void SoundTask_PlayDoubleCry(u8 taskId) { u16 species = SPECIES_NONE; u8 battlerId; s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER); // Get wanted battler. if (gBattleAnimArgs[0] == ANIM_ATTACKER) battlerId = gBattleAnimAttacker; else if (gBattleAnimArgs[0] == ANIM_TARGET) battlerId = gBattleAnimTarget; else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER) battlerId = BATTLE_PARTNER(gBattleAnimAttacker); else battlerId = BATTLE_PARTNER(gBattleAnimTarget); // Check if battler is visible. if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId)) { DestroyAnimVisualTask(taskId); return; } if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gTasks[taskId].data[0] = gBattleAnimArgs[1]; gTasks[taskId].data[1] = species; gTasks[taskId].data[2] = pan; if (species != SPECIES_NONE) { if (gBattleAnimArgs[1] == DOUBLE_CRY_GROWL) PlayCry_ByMode(species, pan, CRY_MODE_GROWL_1); else // DOUBLE_CRY_ROAR PlayCry_ByMode(species, pan, CRY_MODE_ROAR_1); gTasks[taskId].func = SoundTask_PlayDoubleCry_Step; } else { DestroyAnimVisualTask(taskId); } } static void SoundTask_PlayDoubleCry_Step(u8 taskId) { u16 species = gTasks[taskId].data[1]; s8 pan = gTasks[taskId].data[2]; if (gTasks[taskId].data[9] < 2) { ++gTasks[taskId].data[9]; } else if (gTasks[taskId].data[0] == DOUBLE_CRY_GROWL) { if (!IsCryPlaying()) { PlayCry_ByMode(species, pan, CRY_MODE_GROWL_2); DestroyAnimVisualTask(taskId); } } else // DOUBLE_CRY_ROAR { if (!IsCryPlaying()) { PlayCry_ByMode(species, pan, CRY_MODE_ROAR_2); DestroyAnimVisualTask(taskId); } } } void SoundTask_WaitForCry(u8 taskId) { if (gTasks[taskId].data[9] < 2) ++gTasks[taskId].data[9]; else if (!IsCryPlaying()) DestroyAnimVisualTask(taskId); } #define tSpecies data[1] #define tPan data[2] #define tState data[9] void SoundTask_PlayCryWithEcho(u8 taskId) { u16 species; s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER); species = gAnimBattlerSpecies[gBattleAnimAttacker]; gTasks[taskId].tSpecies = species; gTasks[taskId].tPan = pan; if (species != SPECIES_NONE) { PlayCry_ByMode(species, pan, CRY_MODE_ECHO_START); gTasks[taskId].func = SoundTask_PlayCryWithEcho_Step; } else { DestroyAnimVisualTask(taskId); } } static void SoundTask_PlayCryWithEcho_Step(u8 taskId) { if (gTasks[taskId].tState < 2) { gTasks[taskId].tState++; } else if (!IsCryPlaying()) { u16 species = gTasks[taskId].tSpecies; s8 pan = gTasks[taskId].tPan; PlayCry_ByMode(species, pan, CRY_MODE_ECHO_END); DestroyAnimVisualTask(taskId); } } #undef tSpecies #undef tPan #undef tState void SoundTask_PlaySE1WithPanning(u8 taskId) { u16 songId = gBattleAnimArgs[0]; s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); PlaySE1WithPanning(songId, pan); DestroyAnimVisualTask(taskId); } void SoundTask_PlaySE2WithPanning(u8 taskId) { u16 songId = gBattleAnimArgs[0]; s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); PlaySE2WithPanning(songId, pan); DestroyAnimVisualTask(taskId); } // Adjusts panning and assigns it to gAnimCustomPanning. Doesnt play sound. // Used by Confuse Ray and Will-O-Wisp (see uses of gAnimCustomPanning) void SoundTask_AdjustPanningVar(u8 taskId) { s8 targetPan = gBattleAnimArgs[1]; s8 panIncrement = gBattleAnimArgs[2]; u16 r9 = gBattleAnimArgs[3]; s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[0]); targetPan = BattleAnimAdjustPanning(targetPan); panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement); gTasks[taskId].data[1] = sourcePan; gTasks[taskId].data[2] = targetPan; gTasks[taskId].data[3] = panIncrement; gTasks[taskId].data[5] = r9; gTasks[taskId].data[10] = 0; gTasks[taskId].data[11] = sourcePan; gTasks[taskId].func = SoundTask_AdjustPanningVar_Step; gTasks[taskId].func(taskId); } static void SoundTask_AdjustPanningVar_Step(u8 taskId) { u16 oldPan, panIncrement = gTasks[taskId].data[3]; if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5]) { gTasks[taskId].data[10] = 0; oldPan = gTasks[taskId].data[11]; gTasks[taskId].data[11] = panIncrement + oldPan; gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan); } gAnimCustomPanning = gTasks[taskId].data[11]; if (gTasks[taskId].data[11] == gTasks[taskId].data[2]) DestroyAnimVisualTask(taskId); } ================================================ FILE: src/battle_anim_special.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "battle_main.h" #include "battle_message.h" #include "battle_controllers.h" #include "battle_interface.h" #include "decompress.h" #include "graphics.h" #include "m4a.h" #include "pokeball.h" #include "task.h" #include "trig.h" #include "util.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/songs.h" #define TAG_PARTICLES_POKEBALL 55020 #define TAG_PARTICLES_GREATBALL 55021 #define TAG_PARTICLES_SAFARIBALL 55022 #define TAG_PARTICLES_ULTRABALL 55023 #define TAG_PARTICLES_MASTERBALL 55024 #define TAG_PARTICLES_NETBALL 55025 #define TAG_PARTICLES_DIVEBALL 55026 #define TAG_PARTICLES_NESTBALL 55027 #define TAG_PARTICLES_REPEATBALL 55028 #define TAG_PARTICLES_TIMERBALL 55029 #define TAG_PARTICLES_LUXURYBALL 55030 #define TAG_PARTICLES_PREMIERBALL 55031 u32 gMonShrinkDuration; u16 gMonShrinkDelta; u16 gMonShrinkDistance; static void AnimTask_UnusedLevelUpHealthBox_Step(u8); static void AnimTask_FlashHealthboxOnLevelUp_Step(u8); static void AnimTask_ThrowBall_WaitAnimObjComplete(u8); static void SpriteCB_ThrowBall_Init(struct Sprite *); static void AnimTask_ThrowBallSpecial_PlaySfx(u8); static void AnimTask_ThrowBallSpecial_ResetPlayerSprite(u8); static void SpriteCB_ThrowBall_ArcFlight(struct Sprite *); static void TrainerBallBlock(struct Sprite *); static void SpriteCB_ThrowBall_TenFrameDelay(struct Sprite *); static void SpriteCB_ThrowBall_ShrinkMon(struct Sprite *); static void SpriteCB_ThrowBall_InitialFall(struct Sprite *); static void SpriteCB_ThrowBall_Bounce(struct Sprite *); static void SpriteCB_ThrowBall_DelayThenBreakOut(struct Sprite *); static void SpriteCB_ThrowBall_InitShake(struct Sprite *); static void SpriteCB_ThrowBall_DoShake(struct Sprite *); static void SpriteCB_ThrowBall_InitClick(struct Sprite *); static void SpriteCB_ThrowBall_BeginBreakOut(struct Sprite *); static void SpriteCB_ThrowBall_DoClick(struct Sprite *); static void CreateStarsWhenBallClicks(struct Sprite *); static void SpriteCB_ThrowBall_FinishClick(struct Sprite *); static void BattleAnimObj_SignalEnd(struct Sprite *); static void LoadBallParticleGfx(u8); static void SpriteCB_BallCaptureSuccessStar(struct Sprite *); static void SpriteCB_ThrowBall_RunBreakOut(struct Sprite *); static void TrainerBallBlock2(struct Sprite *); static void GhostBallDodge(struct Sprite *sprite); static void GhostBallDodge2(struct Sprite *sprite); static void PokeBallOpenParticleAnimation_Step1(struct Sprite *); static void PokeBallOpenParticleAnimation_Step2(struct Sprite *); static void DestroyBallOpenAnimationParticle(struct Sprite *); static void FanOutBallOpenParticles_Step1(struct Sprite *); static void RepeatBallOpenParticleAnimation_Step1(struct Sprite *); static void PremierBallOpenParticleAnimation_Step1(struct Sprite *); static void Task_FadeMon_ToBallColor(u8); static void Task_FadeMon_ToNormal(u8); static void Task_FadeMon_ToNormal_Step(u8); static void AnimTask_ShinySparkles(u8); static void SpriteCB_ShinySparkles_1(struct Sprite *); static void SpriteCB_ShinySparkles_2(struct Sprite *); static void AnimTask_ShinySparkles_WaitSparkles(u8); static void SpriteCB_SafariBaitOrRock_WaitPlayerThrow(struct Sprite *); static void SpriteCB_SafariBaitOrRock_ArcFlight(struct Sprite *); static void SpriteCB_SafariBaitOrRock_Finish(struct Sprite *); static void PokeBallOpenParticleAnimation(u8); static void GreatBallOpenParticleAnimation(u8); static void SafariBallOpenParticleAnimation(u8); static void UltraBallOpenParticleAnimation(u8); static void MasterBallOpenParticleAnimation(u8); static void DiveBallOpenParticleAnimation(u8); static void RepeatBallOpenParticleAnimation(u8); static void TimerBallOpenParticleAnimation(u8); static void PremierBallOpenParticleAnimation(u8); static void SpriteCB_SafariBaitOrRock_Init(struct Sprite *); struct CaptureStar { s8 xOffset; s8 yOffset; s8 amplitude; }; static const struct CaptureStar sCaptureStar[] = { { .xOffset = 10, .yOffset = 2, .amplitude = -3, }, { .xOffset = 15, .yOffset = 0, .amplitude = -4, }, { .xOffset = -10, .yOffset = 2, .amplitude = -4, }, }; const struct CompressedSpriteSheet gBallParticleSpritesheets[] = { [BALL_POKE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_POKEBALL}, [BALL_GREAT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_GREATBALL}, [BALL_SAFARI] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SAFARIBALL}, [BALL_ULTRA] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_ULTRABALL}, [BALL_MASTER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_MASTERBALL}, [BALL_NET] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NETBALL}, [BALL_DIVE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DIVEBALL}, [BALL_NEST] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NESTBALL}, [BALL_REPEAT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_REPEATBALL}, [BALL_TIMER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_TIMERBALL}, [BALL_LUXURY] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUXURYBALL}, [BALL_PREMIER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PREMIERBALL}, }; const struct CompressedSpritePalette gBallParticlePalettes[] = { [BALL_POKE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_POKEBALL}, [BALL_GREAT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_GREATBALL}, [BALL_SAFARI] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SAFARIBALL}, [BALL_ULTRA] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_ULTRABALL}, [BALL_MASTER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_MASTERBALL}, [BALL_NET] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NETBALL}, [BALL_DIVE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DIVEBALL}, [BALL_NEST] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NESTBALL}, [BALL_REPEAT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_REPEATBALL}, [BALL_TIMER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_TIMERBALL}, [BALL_LUXURY] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUXURYBALL}, [BALL_PREMIER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PREMIERBALL}, }; static const union AnimCmd sAnim_RegularBall[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(1, 1), ANIMCMD_FRAME(2, 1), ANIMCMD_FRAME(0, 1, .hFlip = TRUE), ANIMCMD_FRAME(2, 1), ANIMCMD_FRAME(1, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_MasterBall[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_NetDiveBall[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_NestBall[] = { ANIMCMD_FRAME(5, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_LuxuryPremierBall[] = { ANIMCMD_FRAME(6, 4), ANIMCMD_FRAME(7, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UltraRepeatTimerBall[] = { ANIMCMD_FRAME(7, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnims_BallParticles[] = { sAnim_RegularBall, sAnim_MasterBall, sAnim_NetDiveBall, sAnim_NestBall, sAnim_LuxuryPremierBall, sAnim_UltraRepeatTimerBall, }; static const u8 sBallParticleAnimNums[] = { [BALL_POKE] = 0, [BALL_GREAT] = 0, [BALL_SAFARI] = 0, [BALL_ULTRA] = 5, [BALL_MASTER] = 1, [BALL_NET] = 2, [BALL_DIVE] = 2, [BALL_NEST] = 3, [BALL_REPEAT] = 5, [BALL_TIMER] = 5, [BALL_LUXURY] = 4, [BALL_PREMIER] = 4, }; static const TaskFunc sBallParticleAnimationFuncs[] = { [BALL_POKE] = PokeBallOpenParticleAnimation, [BALL_GREAT] = GreatBallOpenParticleAnimation, [BALL_SAFARI] = SafariBallOpenParticleAnimation, [BALL_ULTRA] = UltraBallOpenParticleAnimation, [BALL_MASTER] = MasterBallOpenParticleAnimation, [BALL_NET] = SafariBallOpenParticleAnimation, [BALL_DIVE] = DiveBallOpenParticleAnimation, [BALL_NEST] = UltraBallOpenParticleAnimation, [BALL_REPEAT] = RepeatBallOpenParticleAnimation, [BALL_TIMER] = TimerBallOpenParticleAnimation, [BALL_LUXURY] = GreatBallOpenParticleAnimation, [BALL_PREMIER] = PremierBallOpenParticleAnimation, }; static const struct SpriteTemplate sBallParticlesSpriteTemplates[] = { [BALL_POKE] = { .tileTag = TAG_PARTICLES_POKEBALL, .paletteTag = TAG_PARTICLES_POKEBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_GREAT] = { .tileTag = TAG_PARTICLES_GREATBALL, .paletteTag = TAG_PARTICLES_GREATBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_SAFARI] = { .tileTag = TAG_PARTICLES_SAFARIBALL, .paletteTag = TAG_PARTICLES_SAFARIBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_ULTRA] = { .tileTag = TAG_PARTICLES_ULTRABALL, .paletteTag = TAG_PARTICLES_ULTRABALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_MASTER] = { .tileTag = TAG_PARTICLES_MASTERBALL, .paletteTag = TAG_PARTICLES_MASTERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_NET] = { .tileTag = TAG_PARTICLES_NETBALL, .paletteTag = TAG_PARTICLES_NETBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_DIVE] = { .tileTag = TAG_PARTICLES_DIVEBALL, .paletteTag = TAG_PARTICLES_DIVEBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_NEST] = { .tileTag = TAG_PARTICLES_NESTBALL, .paletteTag = TAG_PARTICLES_NESTBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_REPEAT] = { .tileTag = TAG_PARTICLES_REPEATBALL, .paletteTag = TAG_PARTICLES_REPEATBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_TIMER] = { .tileTag = TAG_PARTICLES_TIMERBALL, .paletteTag = TAG_PARTICLES_TIMERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_LUXURY] = { .tileTag = TAG_PARTICLES_LUXURYBALL, .paletteTag = TAG_PARTICLES_LUXURYBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, [BALL_PREMIER] = { .tileTag = TAG_PARTICLES_PREMIERBALL, .paletteTag = TAG_PARTICLES_PREMIERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, }; static const u16 sBallOpenFadeColors[] = { [BALL_POKE] = RGB(31, 22, 30), [BALL_GREAT] = RGB(16, 23, 30), [BALL_SAFARI] = RGB(23, 30, 20), [BALL_ULTRA] = RGB(31, 31, 15), [BALL_MASTER] = RGB(23, 20, 28), [BALL_NET] = RGB(21, 31, 25), [BALL_DIVE] = RGB(12, 25, 30), [BALL_NEST] = RGB(30, 27, 10), [BALL_REPEAT] = RGB(31, 24, 16), [BALL_TIMER] = RGB(29, 30, 30), [BALL_LUXURY] = RGB(31, 17, 10), [BALL_PREMIER] = RGB(31, 9, 10), // Unused RGB_BLACK, RGB(1, 16, 0), RGB(3, 0, 1), RGB(1, 8, 0), RGB(0, 8, 0), RGB(3, 8, 1), RGB(6, 8, 1), RGB(4, 0, 0), }; const struct SpriteTemplate gSafariBaitSpriteTemplate = { .tileTag = ANIM_TAG_SAFARI_BAIT, .paletteTag = ANIM_TAG_SAFARI_BAIT, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SafariBaitOrRock_Init, }; static const union AnimCmd sSpriteAnim_SafariRock_0[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END, }; static const union AnimCmd *const sSpriteAnimTable_SafariRock[] = { sSpriteAnim_SafariRock_0, }; const struct SpriteTemplate gSafariRockTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sSpriteAnimTable_SafariRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SafariBaitOrRock_Init, }; // Unused void AnimTask_LevelUpHealthBox(u8 taskId) { struct BattleAnimBgData animBgData; u8 healthBoxSpriteId; u8 battler; u8 spriteId1, spriteId2, spriteId3, spriteId4; battler = gBattleAnimAttacker; gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 1); SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); healthBoxSpriteId = gHealthboxSpriteIds[battler]; spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam; spriteId2 = gSprites[healthBoxSpriteId].data[5]; spriteId3 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); spriteId4 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); gSprites[healthBoxSpriteId].oam.priority = 1; gSprites[spriteId1].oam.priority = 1; gSprites[spriteId2].oam.priority = 1; gSprites[spriteId3] = gSprites[healthBoxSpriteId]; gSprites[spriteId4] = gSprites[spriteId1]; gSprites[spriteId3].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[spriteId4].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[spriteId3].callback = SpriteCallbackDummy; gSprites[spriteId4].callback = SpriteCallbackDummy; GetBattleAnimBg1Data(&animBgData); AnimLoadCompressedBgTilemap(animBgData.bgId, gUnusedLevelupAnimationTilemap); AnimLoadCompressedBgGfx(animBgData.bgId, gUnusedLevelupAnimationGfx, animBgData.tilesOffset); LoadCompressedPalette(gCureBubblesPal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); gBattle_BG1_X = -gSprites[spriteId3].x + 32; gBattle_BG1_Y = -gSprites[spriteId3].y - 32; gTasks[taskId].data[1] = 640; gTasks[taskId].data[0] = spriteId3; gTasks[taskId].data[2] = spriteId4; gTasks[taskId].func = AnimTask_UnusedLevelUpHealthBox_Step; } static void AnimTask_UnusedLevelUpHealthBox_Step(u8 taskId) { u8 spriteId1, spriteId2; u8 battler; battler = gBattleAnimAttacker; gTasks[taskId].data[13] += gTasks[taskId].data[1]; gBattle_BG1_Y += (u16)gTasks[taskId].data[13] >> 8; gTasks[taskId].data[13] &= 0xFF; switch (gTasks[taskId].data[15]) { case 0: if (gTasks[taskId].data[11]++ > 1) { gTasks[taskId].data[11] = 0; gTasks[taskId].data[12]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); if (gTasks[taskId].data[12] == 8) gTasks[taskId].data[15]++; } break; case 1: if (++gTasks[taskId].data[10] == 30) gTasks[taskId].data[15]++; break; case 2: if (gTasks[taskId].data[11]++ > 1) { gTasks[taskId].data[11] = 0; gTasks[taskId].data[12]--; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); if (gTasks[taskId].data[12] == 0) { ResetBattleAnimBg(0); gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); DestroySprite(&gSprites[gTasks[taskId].data[0]]); DestroySprite(&gSprites[gTasks[taskId].data[2]]); SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0); spriteId1 = gSprites[gHealthboxSpriteIds[battler]].oam.affineParam; spriteId2 = gSprites[gHealthboxSpriteIds[battler]].data[5]; gSprites[gHealthboxSpriteIds[battler]].oam.priority = 1; gSprites[spriteId1].oam.priority = 1; gSprites[spriteId2].oam.priority = 1; DestroyAnimVisualTask(taskId); } } break; } } void DoLoadHealthboxPalsForLevelUp(u8 *paletteId1, u8 *paletteId2, u8 battler) { u8 healthBoxSpriteId; u8 spriteId1, spriteId2; u16 offset1, offset2; healthBoxSpriteId = gHealthboxSpriteIds[battler]; spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam; spriteId2 = gSprites[healthBoxSpriteId].data[5]; *paletteId1 = AllocSpritePalette(TAG_HEALTHBOX_PALS_1); *paletteId2 = AllocSpritePalette(TAG_HEALTHBOX_PALS_2); offset1 = OBJ_PLTT_ID(gSprites[healthBoxSpriteId].oam.paletteNum); offset2 = OBJ_PLTT_ID(gSprites[spriteId2].oam.paletteNum); LoadPalette(&gPlttBufferUnfaded[offset1], OBJ_PLTT_ID(*paletteId1), PLTT_SIZE_4BPP); LoadPalette(&gPlttBufferUnfaded[offset2], OBJ_PLTT_ID(*paletteId2), PLTT_SIZE_4BPP); gSprites[healthBoxSpriteId].oam.paletteNum = *paletteId1; gSprites[spriteId1].oam.paletteNum = *paletteId1; gSprites[spriteId2].oam.paletteNum = *paletteId2; } void AnimTask_LoadHealthboxPalsForLevelUp(u8 taskId) { u8 paletteId1, paletteId2; DoLoadHealthboxPalsForLevelUp(&paletteId1, &paletteId2, gBattleAnimAttacker); DestroyAnimVisualTask(taskId); } void DoFreeHealthboxPalsForLevelUp(u8 battler) { u8 healthBoxSpriteId; u8 spriteId1, spriteId2; u8 paletteId1, paletteId2; healthBoxSpriteId = gHealthboxSpriteIds[battler]; spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam; spriteId2 = gSprites[healthBoxSpriteId].data[5]; FreeSpritePaletteByTag(TAG_HEALTHBOX_PALS_1); FreeSpritePaletteByTag(TAG_HEALTHBOX_PALS_2); paletteId1 = IndexOfSpritePaletteTag(TAG_HEALTHBOX_PAL); paletteId2 = IndexOfSpritePaletteTag(TAG_HEALTHBAR_PAL); gSprites[healthBoxSpriteId].oam.paletteNum = paletteId1; gSprites[spriteId1].oam.paletteNum = paletteId1; gSprites[spriteId2].oam.paletteNum = paletteId2; } void AnimTask_FreeHealthboxPalsForLevelUp(u8 taskId) { DoFreeHealthboxPalsForLevelUp(gBattleAnimAttacker); DestroyAnimVisualTask(taskId); } void AnimTask_FlashHealthboxOnLevelUp(u8 taskId) { gTasks[taskId].data[10] = gBattleAnimArgs[0]; gTasks[taskId].data[11] = gBattleAnimArgs[1]; gTasks[taskId].func = AnimTask_FlashHealthboxOnLevelUp_Step; } static void AnimTask_FlashHealthboxOnLevelUp_Step(u8 taskId) { u8 paletteNum; int paletteOffset, colorOffset; gTasks[taskId].data[0]++; if (gTasks[taskId].data[0]++ >= gTasks[taskId].data[11]) { gTasks[taskId].data[0] = 0; paletteNum = IndexOfSpritePaletteTag(TAG_HEALTHBOX_PALS_1); colorOffset = gTasks[taskId].data[10] == 0 ? 6 : 2; switch (gTasks[taskId].data[1]) { case 0: gTasks[taskId].data[2] += 2; if (gTasks[taskId].data[2] > 16) gTasks[taskId].data[2] = 16; paletteOffset = OBJ_PLTT_ID(paletteNum); BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31)); if (gTasks[taskId].data[2] == 16) gTasks[taskId].data[1]++; break; case 1: gTasks[taskId].data[2] -= 2; if (gTasks[taskId].data[2] < 0) gTasks[taskId].data[2] = 0; paletteOffset = OBJ_PLTT_ID(paletteNum); BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31)); if (gTasks[taskId].data[2] == 0) DestroyAnimVisualTask(taskId); break; } } } void AnimTask_SwitchOutShrinkMon(u8 taskId) { u8 spriteId; spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; switch (gTasks[taskId].data[0]) { case 0: PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL); gTasks[taskId].data[10] = 0x100; gTasks[taskId].data[0]++; break; case 1: gTasks[taskId].data[10] += 0x30; SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0); SetBattlerSpriteYOffsetFromYScale(spriteId); if (gTasks[taskId].data[10] >= 0x2D0) gTasks[taskId].data[0]++; break; case 2: ResetSpriteRotScale(spriteId); gSprites[spriteId].invisible = TRUE; DestroyAnimVisualTask(taskId); break; } } void AnimTask_SwitchOutBallEffect(u8 taskId) { u8 spriteId; u16 ball; u8 ballId; u8 x, y; u8 priority, subpriority; u32 selectedPalettes; spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) ball = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL); else ball = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL); ballId = ItemIdToBallId(ball); switch (gTasks[taskId].data[0]) { case 0: x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); priority = gSprites[spriteId].oam.priority; subpriority = gSprites[spriteId].subpriority; gTasks[taskId].data[10] = AnimateBallOpenParticles(x, y + 32, priority, subpriority, ballId); selectedPalettes = GetBattlePalettesMask(1, 0, 0, 0, 0, 0, 0); gTasks[taskId].data[11] = LaunchBallFadeMonTask(0, gBattleAnimAttacker, selectedPalettes, ballId); gTasks[taskId].data[0]++; break; case 1: if (!gTasks[gTasks[taskId].data[10]].isActive && !gTasks[gTasks[taskId].data[11]].isActive) DestroyAnimVisualTask(taskId); break; } } void AnimTask_LoadBallGfx(u8 taskId) { u8 ballId = ItemIdToBallId(gLastUsedItem); LoadBallGfx(ballId); DestroyAnimVisualTask(taskId); } void AnimTask_FreeBallGfx(u8 taskId) { u8 ballId = ItemIdToBallId(gLastUsedItem); FreeBallGfx(ballId); DestroyAnimVisualTask(taskId); } void AnimTask_IsBallBlockedByTrainerOrDodged(u8 taskId) { switch (gBattleSpritesDataPtr->animationData->ballThrowCaseId) { case BALL_TRAINER_BLOCK: gBattleAnimArgs[ARG_RET_ID] = -1; break; case BALL_GHOST_DODGE: gBattleAnimArgs[ARG_RET_ID] = -2; break; default: gBattleAnimArgs[ARG_RET_ID] = 0; break; } DestroyAnimVisualTask(taskId); } u8 ItemIdToBallId(u16 ballItem) { switch (ballItem) { case ITEM_MASTER_BALL: return BALL_MASTER; case ITEM_ULTRA_BALL: return BALL_ULTRA; case ITEM_GREAT_BALL: return BALL_GREAT; case ITEM_SAFARI_BALL: return BALL_SAFARI; case ITEM_NET_BALL: return BALL_NET; case ITEM_DIVE_BALL: return BALL_DIVE; case ITEM_NEST_BALL: return BALL_NEST; case ITEM_REPEAT_BALL: return BALL_REPEAT; case ITEM_TIMER_BALL: return BALL_TIMER; case ITEM_LUXURY_BALL: return BALL_LUXURY; case ITEM_PREMIER_BALL: return BALL_PREMIER; case ITEM_POKE_BALL: default: return BALL_POKE; } } void AnimTask_ThrowBall(u8 taskId) { u8 ballId; u8 spriteId; ballId = ItemIdToBallId(gLastUsedItem); spriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29); gSprites[spriteId].data[0] = 34; gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16; gSprites[spriteId].callback = SpriteCB_ThrowBall_Init; gBattleSpritesDataPtr->animationData->wildMonInvisible = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible; gTasks[taskId].data[0] = spriteId; gTasks[taskId].func = AnimTask_ThrowBall_WaitAnimObjComplete; } static void AnimTask_ThrowBall_WaitAnimObjComplete(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; if ((u16)gSprites[spriteId].data[0] == 0xFFFF) DestroyAnimVisualTask(taskId); } void AnimTask_ThrowBallSpecial(u8 taskId) { int x, y; u8 ballId; u8 subpriority; u8 spriteId; if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL) { x = 28; y = 11; } else { x = 23; y = 11; if (gSaveBlock2Ptr->playerGender == FEMALE) y = 13; } ballId = ItemIdToBallId(gLastUsedItem); subpriority = GetBattlerSpriteSubpriority(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + 1; spriteId = CreateSprite(&gBallSpriteTemplates[ballId], x | 32, y | 80, subpriority); gSprites[spriteId].data[0] = 34; gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16; gSprites[spriteId].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].callback = SpriteCB_PlayerThrowInit; gTasks[taskId].data[0] = spriteId; gTasks[taskId].func = AnimTask_ThrowBallSpecial_PlaySfx; } static void AnimTask_ThrowBallSpecial_PlaySfx(u8 taskId) { if (gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animCmdIndex == 1) { PlaySE12WithPanning(SE_BALL_THROW, 0); gSprites[gTasks[taskId].data[0]].callback = SpriteCB_ThrowBall_Init; CreateTask(AnimTask_ThrowBallSpecial_ResetPlayerSprite, 10); gTasks[taskId].func = AnimTask_ThrowBall_WaitAnimObjComplete; } } static void AnimTask_ThrowBallSpecial_ResetPlayerSprite(u8 taskId) { if (gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animEnded) { StartSpriteAnim(&gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]], 0); DestroyTask(taskId); } } static void SpriteCB_ThrowBall_Init(struct Sprite *sprite) { u16 destX = sprite->data[1]; u16 destY = sprite->data[2]; sprite->sTransl_InitX = sprite->x; sprite->sTransl_DestX = destX; sprite->sTransl_InitY = sprite->y; sprite->sTransl_DestY = destY; sprite->sTransl_ArcAmpl = -40; InitAnimArcTranslation(sprite); sprite->callback = SpriteCB_ThrowBall_ArcFlight; } static void SpriteCB_ThrowBall_ArcFlight(struct Sprite *sprite) { int i; u8 ballId; if (TranslateAnimHorizontalArc(sprite)) { if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_TRAINER_BLOCK) { sprite->callback = TrainerBallBlock; } else if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_GHOST_DODGE) { sprite->callback = GhostBallDodge; } else { StartSpriteAnim(sprite, 1); sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; for (i = 0; i < 8; i++) sprite->data[i] = 0; sprite->data[5] = 0; sprite->callback = SpriteCB_ThrowBall_TenFrameDelay; ballId = ItemIdToBallId(gLastUsedItem); switch (ballId) { case 0 ... POKEBALL_COUNT - 1: AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId); LaunchBallFadeMonTask(0, gBattleAnimTarget, 14, ballId); break; } } } } static void SpriteCB_ThrowBall_TenFrameDelay(struct Sprite *sprite) { if (++sprite->data[5] == 10) { sprite->data[5] = CreateTask(TaskDummy, 50); sprite->callback = SpriteCB_ThrowBall_ShrinkMon; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] = 0; } } static void SpriteCB_ThrowBall_ShrinkMon(struct Sprite *sprite) { u8 spriteId; u8 taskId; spriteId = gBattlerSpriteIds[gBattleAnimTarget]; taskId = sprite->data[5]; if (++gTasks[taskId].data[1] == 11) PlaySE(SE_BALL_TRADE); switch (gTasks[taskId].data[0]) { case 0: PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL); gTasks[taskId].data[10] = 256; gMonShrinkDuration = 28; gMonShrinkDistance = (gSprites[spriteId].y + gSprites[spriteId].y2) - (sprite->y + sprite->y2); gMonShrinkDelta = (gMonShrinkDistance * 256) / gMonShrinkDuration; gTasks[taskId].data[2] = gMonShrinkDelta; gTasks[taskId].data[0]++; break; case 1: gTasks[taskId].data[10] += 0x20; SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0); gTasks[taskId].data[3] += gTasks[taskId].data[2]; gSprites[spriteId].y2 = -gTasks[taskId].data[3] >> 8; if (gTasks[taskId].data[10] >= 0x480) gTasks[taskId].data[0]++; break; case 2: ResetSpriteRotScale(spriteId); gSprites[spriteId].invisible = TRUE; gTasks[taskId].data[0]++; break; default: if (gTasks[taskId].data[1] > 10) { DestroyTask(taskId); StartSpriteAnim(sprite, 2); sprite->data[5] = 0; sprite->callback = SpriteCB_ThrowBall_InitialFall; } break; } } static void SpriteCB_ThrowBall_InitialFall(struct Sprite *sprite) { int angle; if (sprite->animEnded) { sprite->data[3] = 0; sprite->data[4] = 40; sprite->data[5] = 0; angle = 0; sprite->y += Cos(angle, 40); sprite->y2 = -Cos(angle, sprite->data[4]); sprite->callback = SpriteCB_ThrowBall_Bounce; } } static void SpriteCB_ThrowBall_Bounce(struct Sprite *sprite) { bool8 lastBounce; int bounceCount; lastBounce = FALSE; switch (sprite->data[3] & 0xFF) { case 0: sprite->y2 = -Cos(sprite->data[5], sprite->data[4]); sprite->data[5] += (sprite->data[3] >> 8) + 4; if (sprite->data[5] >= 64) { sprite->data[4] -= 10; sprite->data[3] += 257; bounceCount = sprite->data[3] >> 8; if (bounceCount == 4) lastBounce = TRUE; // Play a different sound effect for each pokeball bounce. switch (bounceCount) { case 1: PlaySE(SE_BALL_BOUNCE_1); break; case 2: PlaySE(SE_BALL_BOUNCE_2); break; case 3: PlaySE(SE_BALL_BOUNCE_3); break; default: PlaySE(SE_BALL_BOUNCE_4); break; } } break; case 1: sprite->y2 = -Cos(sprite->data[5], sprite->data[4]); sprite->data[5] -= (sprite->data[3] >> 8) + 4; if (sprite->data[5] <= 0) { sprite->data[5] = 0; sprite->data[3] &= -0x100; } break; } if (lastBounce) { sprite->data[3] = 0; sprite->y += Cos(64, 40); sprite->y2 = 0; if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_NO_SHAKES) { sprite->data[5] = 0; sprite->callback = SpriteCB_ThrowBall_DelayThenBreakOut; } else { sprite->callback = SpriteCB_ThrowBall_InitShake; sprite->data[4] = 1; sprite->data[5] = 0; } } } static void SpriteCB_ThrowBall_InitShake(struct Sprite *sprite) { if (++sprite->data[3] == 31) { sprite->data[3] = 0; sprite->affineAnimPaused = TRUE; StartSpriteAffineAnim(sprite, 1); gBattleSpritesDataPtr->animationData->ballSubpx = 0; sprite->callback = SpriteCB_ThrowBall_DoShake; PlaySE(SE_BALL); } } static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite) { s8 state; u16 var0; switch (sprite->data[3] & 0xFF) { case 0: if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF) { sprite->x2 += sprite->data[4]; gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF; } else { gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0; } sprite->data[5]++; sprite->affineAnimPaused = FALSE; var0 = sprite->data[5] + 7; if (var0 > 14) { gBattleSpritesDataPtr->animationData->ballSubpx = 0; sprite->data[3]++; sprite->data[5] = 0; } break; case 1: if (++sprite->data[5] == 1) { sprite->data[5] = 0; sprite->data[4] = -sprite->data[4]; sprite->data[3]++; sprite->affineAnimPaused = FALSE; if (sprite->data[4] < 0) ChangeSpriteAffineAnim(sprite, 2); else ChangeSpriteAffineAnim(sprite, 1); } else { sprite->affineAnimPaused = TRUE; } break; case 2: if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF) { sprite->x2 += sprite->data[4]; gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF; } else { gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0; } sprite->data[5]++; sprite->affineAnimPaused = FALSE; var0 = sprite->data[5] + 12; if (var0 > 24) { gBattleSpritesDataPtr->animationData->ballSubpx = 0; sprite->data[3]++; sprite->data[5] = 0; } break; case 3: if (sprite->data[5]++ < 0) { sprite->affineAnimPaused = TRUE; break; } sprite->data[5] = 0; sprite->data[4] = -sprite->data[4]; sprite->data[3]++; sprite->affineAnimPaused = FALSE; if (sprite->data[4] < 0) ChangeSpriteAffineAnim(sprite, 2); else ChangeSpriteAffineAnim(sprite, 1); // fall through case 4: if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF) { sprite->x2 += sprite->data[4]; gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF; } else { gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0; } sprite->data[5]++; sprite->affineAnimPaused = FALSE; var0 = sprite->data[5] + 4; if (var0 > 8) { gBattleSpritesDataPtr->animationData->ballSubpx = 0; sprite->data[3]++; sprite->data[5] = 0; sprite->data[4] = -sprite->data[4]; } break; case 5: sprite->data[3] += 0x100; state = sprite->data[3] >> 8; if (state == gBattleSpritesDataPtr->animationData->ballThrowCaseId) { sprite->affineAnimPaused = TRUE; sprite->callback = SpriteCB_ThrowBall_DelayThenBreakOut; } else { if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_3_SHAKES_SUCCESS && state == 3) { sprite->callback = SpriteCB_ThrowBall_InitClick; sprite->affineAnimPaused = TRUE; } else { sprite->data[3]++; sprite->affineAnimPaused = TRUE; } } break; case 6: default: if (++sprite->data[5] == 31) { sprite->data[5] = 0; sprite->data[3] &= -0x100; StartSpriteAffineAnim(sprite, 3); if (sprite->data[4] < 0) StartSpriteAffineAnim(sprite, 2); else StartSpriteAffineAnim(sprite, 1); PlaySE(SE_BALL); } break; } } static void SpriteCB_ThrowBall_DelayThenBreakOut(struct Sprite *sprite) { if (++sprite->data[5] == 31) { sprite->data[5] = 0; sprite->callback = SpriteCB_ThrowBall_BeginBreakOut; } } static void SpriteCB_ThrowBall_InitClick(struct Sprite *sprite) { sprite->animPaused = TRUE; sprite->callback = SpriteCB_ThrowBall_DoClick; sprite->data[3] = 0; sprite->data[4] = 0; sprite->data[5] = 0; } static void SpriteCB_ThrowBall_DoClick(struct Sprite *sprite) { u8 *battler = &gBattleAnimTarget; sprite->data[4]++; if (sprite->data[4] == 40) { PlaySE(SE_BALL_CLICK); BlendPalettes(0x10000 << sprite->oam.paletteNum, 6, RGB_BLACK); CreateStarsWhenBallClicks(sprite); } else if (sprite->data[4] == 60) { BeginNormalPaletteFade(0x10000 << sprite->oam.paletteNum, 2, 6, 0, RGB_BLACK); } else if (sprite->data[4] == 95) { gDoingBattleAnim = FALSE; UpdateOamPriorityInAllHealthboxes(1); m4aMPlayAllStop(); PlaySE(MUS_CAUGHT_INTRO); } else if (sprite->data[4] == 315) { FreeOamMatrix(gSprites[gBattlerSpriteIds[*battler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[*battler]]); sprite->data[0] = 0; sprite->callback = SpriteCB_ThrowBall_FinishClick; } } static void SpriteCB_ThrowBall_FinishClick(struct Sprite *sprite) { u8 paletteIndex; switch (sprite->data[0]) { case 0: sprite->data[1] = 0; sprite->data[2] = 0; sprite->oam.objMode = ST_OAM_OBJ_BLEND; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); paletteIndex = IndexOfSpritePaletteTag(sprite->template->paletteTag); BeginNormalPaletteFade(1 << (paletteIndex + 0x10), 0, 0, 16, RGB_WHITE); sprite->data[0]++; break; case 1: if (sprite->data[1]++ > 0) { sprite->data[1] = 0; sprite->data[2]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[2], sprite->data[2])); if (sprite->data[2] == 16) sprite->data[0]++; } break; case 2: sprite->invisible = TRUE; sprite->data[0]++; break; default: if (!gPaletteFade.active) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); sprite->data[0] = 0; sprite->callback = BattleAnimObj_SignalEnd; } break; } } static void BattleAnimObj_SignalEnd(struct Sprite *sprite) { if (sprite->data[0] == 0) { sprite->data[0] = -1; } else { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } static void CreateStarsWhenBallClicks(struct Sprite *sprite) { u32 i; u8 subpriority; if (sprite->subpriority) { subpriority = sprite->subpriority - 1; } else { subpriority = 0; sprite->subpriority = 1; } LoadBallParticleGfx(BALL_MASTER); for (i = 0; i < 3; i++) { u8 spriteId = CreateSprite(&sBallParticlesSpriteTemplates[BALL_MASTER], sprite->x, sprite->y, subpriority); if (spriteId != MAX_SPRITES) { gSprites[spriteId].sTransl_Speed = 24; gSprites[spriteId].sTransl_DestX = sprite->x + sCaptureStar[i].xOffset; gSprites[spriteId].sTransl_DestY = sprite->y + sCaptureStar[i].yOffset; gSprites[spriteId].sTransl_ArcAmpl = sCaptureStar[i].amplitude; InitAnimArcTranslation(&gSprites[spriteId]); gSprites[spriteId].callback = SpriteCB_BallCaptureSuccessStar; StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[BALL_MASTER]); } } } static void SpriteCB_BallCaptureSuccessStar(struct Sprite *sprite) { sprite->invisible = !sprite->invisible; if (TranslateAnimHorizontalArc(sprite)) DestroySprite(sprite); } static void SpriteCB_ThrowBall_BeginBreakOut(struct Sprite *sprite) { u8 ballId; StartSpriteAnim(sprite, 1); StartSpriteAffineAnim(sprite, 0); sprite->callback = SpriteCB_ThrowBall_RunBreakOut; ballId = ItemIdToBallId(gLastUsedItem); switch (ballId) { case 0 ... POKEBALL_COUNT - 1: AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId); LaunchBallFadeMonTask(1, gBattleAnimTarget, 14, ballId); break; } gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = FALSE; StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 1); AnimateSprite(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]]); gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] = 0x1000; } static void SpriteCB_ThrowBall_RunBreakOut(struct Sprite *sprite) { bool32 next = FALSE; if (sprite->animEnded) sprite->invisible = TRUE; if (gSprites[gBattlerSpriteIds[gBattleAnimTarget]].affineAnimEnded) { StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 0); next = TRUE; } else { gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] -= 288; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].y2 = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] >> 8; } if (sprite->animEnded && next) { gSprites[gBattlerSpriteIds[gBattleAnimTarget]].y2 = 0; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = gBattleSpritesDataPtr->animationData->wildMonInvisible; sprite->data[0] = 0; sprite->callback = BattleAnimObj_SignalEnd; gDoingBattleAnim = FALSE; UpdateOamPriorityInAllHealthboxes(1); } } static void TrainerBallBlock(struct Sprite *sprite) { int i; sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = sprite->y2 = 0; for (i = 0; i < 6; i++) sprite->data[i] = 0; sprite->callback = TrainerBallBlock2; } static void TrainerBallBlock2(struct Sprite *sprite) { s16 var0 = sprite->data[0] + 0x800; s16 var1 = sprite->data[1] + 0x680; sprite->x2 -= var1 >> 8; sprite->y2 += var0 >> 8; sprite->data[0] = (sprite->data[0] + 0x800) & 0xFF; sprite->data[1] = (sprite->data[1] + 0x680) & 0xFF; if (sprite->y + sprite->y2 > 160 || sprite->x + sprite->x2 < -8) { sprite->data[0] = 0; sprite->callback = BattleAnimObj_SignalEnd; gDoingBattleAnim = FALSE; UpdateOamPriorityInAllHealthboxes(1); } } static void GhostBallDodge(struct Sprite *sprite) { sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = sprite->y2 = 0; sprite->data[0] = 0x22; sprite->data[1] = sprite->x; sprite->data[2] = sprite->x - 8; sprite->data[3] = sprite->y; sprite->data[4] = 0x90; sprite->data[5] = 0x20; InitAnimArcTranslation(sprite); TranslateAnimVerticalArc(sprite); sprite->callback = GhostBallDodge2; } static void GhostBallDodge2(struct Sprite *sprite) { if (!TranslateAnimVerticalArc(sprite)) { if ((sprite->y + sprite->y2) < 65) return; } sprite->data[0] = 0; sprite->callback = BattleAnimObj_SignalEnd; gDoingBattleAnim = FALSE; UpdateOamPriorityInAllHealthboxes(1); } static void LoadBallParticleGfx(u8 ballId) { if (GetSpriteTileStartByTag(gBallParticleSpritesheets[ballId].tag) == 0xFFFF) { LoadCompressedSpriteSheetUsingHeap(&gBallParticleSpritesheets[ballId]); LoadCompressedSpritePaletteUsingHeap(&gBallParticlePalettes[ballId]); } } u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId) { u8 taskId; LoadBallParticleGfx(ballId); taskId = CreateTask(sBallParticleAnimationFuncs[ballId], 5); gTasks[taskId].data[1] = x; gTasks[taskId].data[2] = y; gTasks[taskId].data[3] = priority; gTasks[taskId].data[4] = subpriority; gTasks[taskId].data[15] = ballId; PlaySE(SE_BALL_OPEN); return taskId; } static void IncrementBattleParticleCounter(void) { if (gMain.inBattle) gBattleSpritesDataPtr->animationData->numBallParticles++; } static void PokeBallOpenParticleAnimation(u8 taskId) { u8 spriteId; u8 x, y; u8 priority, subpriority; u8 ballId; u8 var0; ballId = gTasks[taskId].data[15]; if (gTasks[taskId].data[0] < 16) { x = gTasks[taskId].data[1]; y = gTasks[taskId].data[2]; priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { IncrementBattleParticleCounter(); StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = PokeBallOpenParticleAnimation_Step1; gSprites[spriteId].oam.priority = priority; var0 = (u8)gTasks[taskId].data[0]; if (var0 >= 8) var0 -= 8; gSprites[spriteId].data[0] = var0 * 32; } if (gTasks[taskId].data[0] == 15) { if (!gMain.inBattle) gSprites[spriteId].data[7] = 1; DestroyTask(taskId); return; } } gTasks[taskId].data[0]++; } static void PokeBallOpenParticleAnimation_Step1(struct Sprite *sprite) { if (sprite->data[1] == 0) sprite->callback = PokeBallOpenParticleAnimation_Step2; else sprite->data[1]--; } static void PokeBallOpenParticleAnimation_Step2(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[0], sprite->data[1]); sprite->y2 = Cos(sprite->data[0], sprite->data[1]); sprite->data[1] += 2; if (sprite->data[1] == 50) DestroyBallOpenAnimationParticle(sprite); } static void TimerBallOpenParticleAnimation(u8 taskId) { u32 i; u8 x, y, priority, subpriority, ballId; u8 spriteId; ballId = gTasks[taskId].data[15]; x = gTasks[taskId].data[1]; y = gTasks[taskId].data[2]; priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; for (i = 0; i < 8; i++) { spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { IncrementBattleParticleCounter(); StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; gSprites[spriteId].data[4] = 10; gSprites[spriteId].data[5] = 2; gSprites[spriteId].data[6] = 1; } } if (!gMain.inBattle) gSprites[spriteId].data[7] = 1; DestroyTask(taskId); } static void DiveBallOpenParticleAnimation(u8 taskId) { u32 i; u8 x, y, priority, subpriority, ballId; u8 spriteId; ballId = gTasks[taskId].data[15]; x = gTasks[taskId].data[1]; y = gTasks[taskId].data[2]; priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; for (i = 0; i < 8; i++) { spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { IncrementBattleParticleCounter(); StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; gSprites[spriteId].data[4] = 10; gSprites[spriteId].data[5] = 1; gSprites[spriteId].data[6] = 2; } } if (!gMain.inBattle) gSprites[spriteId].data[7] = 1; DestroyTask(taskId); } // Also used for Net Ball static void SafariBallOpenParticleAnimation(u8 taskId) { u32 i; u8 x, y, priority, subpriority, ballId; u8 spriteId; ballId = gTasks[taskId].data[15]; x = gTasks[taskId].data[1]; y = gTasks[taskId].data[2]; priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; for (i = 0; i < 8; i++) { spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { IncrementBattleParticleCounter(); StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; gSprites[spriteId].data[4] = 4; gSprites[spriteId].data[5] = 1; gSprites[spriteId].data[6] = 1; } } if (!gMain.inBattle) gSprites[spriteId].data[7] = 1; DestroyTask(taskId); } // Also used for Nest Ball static void UltraBallOpenParticleAnimation(u8 taskId) { u32 i; u8 x, y, priority, subpriority, ballId; u8 spriteId; ballId = gTasks[taskId].data[15]; x = gTasks[taskId].data[1]; y = gTasks[taskId].data[2]; priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; for (i = 0; i < 10; i++) { spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { IncrementBattleParticleCounter(); StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 25; gSprites[spriteId].data[4] = 5; gSprites[spriteId].data[5] = 1; gSprites[spriteId].data[6] = 1; } } if (!gMain.inBattle) gSprites[spriteId].data[7] = 1; DestroyTask(taskId); } // Also used for Luxury Ball static void GreatBallOpenParticleAnimation(u8 taskId) { u32 i; u8 x, y, priority, subpriority, ballId; u8 spriteId; if (gTasks[taskId].data[7]) { gTasks[taskId].data[7]--; } else { ballId = gTasks[taskId].data[15]; x = gTasks[taskId].data[1]; y = gTasks[taskId].data[2]; priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; for (i = 0; i < 8; i++) { spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { IncrementBattleParticleCounter(); StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; gSprites[spriteId].data[4] = 8; gSprites[spriteId].data[5] = 2; gSprites[spriteId].data[6] = 2; } } gTasks[taskId].data[7] = 8; if (++gTasks[taskId].data[0] == 2) { if (!gMain.inBattle) gSprites[spriteId].data[7] = 1; DestroyTask(taskId); } } } static void FanOutBallOpenParticles_Step1(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[0], sprite->data[1]); sprite->y2 = Cos(sprite->data[0], sprite->data[2]); sprite->data[0] = (sprite->data[0] + sprite->data[4]) & 0xFF; sprite->data[1] += sprite->data[5]; sprite->data[2] += sprite->data[6]; if (++sprite->data[3] == 51) DestroyBallOpenAnimationParticle(sprite); } static void RepeatBallOpenParticleAnimation(u8 taskId) { u32 i; u8 x, y, priority, subpriority, ballId; u8 spriteId; ballId = gTasks[taskId].data[15]; x = gTasks[taskId].data[1]; y = gTasks[taskId].data[2]; priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; for (i = 0; i < POKEBALL_COUNT; i++) { spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { IncrementBattleParticleCounter(); StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = RepeatBallOpenParticleAnimation_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 21; } } if (!gMain.inBattle) gSprites[spriteId].data[7] = 1; DestroyTask(taskId); } static void RepeatBallOpenParticleAnimation_Step1(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[0], sprite->data[1]); sprite->y2 = Cos(sprite->data[0], Sin(sprite->data[0], sprite->data[2])); sprite->data[0] = (sprite->data[0] + 6) & 0xFF; sprite->data[1]++; sprite->data[2]++; if (++sprite->data[3] == 51) DestroyBallOpenAnimationParticle(sprite); } static void MasterBallOpenParticleAnimation(u8 taskId) { u8 i, j; u8 x, y, priority, subpriority, ballId; u8 spriteId; ballId = gTasks[taskId].data[15]; x = gTasks[taskId].data[1]; y = gTasks[taskId].data[2]; priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; for (j = 0; j < 2; j++) { for (i = 0; i < 8; i++) { spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { IncrementBattleParticleCounter(); StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; gSprites[spriteId].data[4] = 8; if (j == 0) { gSprites[spriteId].data[5] = 2; gSprites[spriteId].data[6] = 1; } else { gSprites[spriteId].data[5] = 1; gSprites[spriteId].data[6] = 2; } } } } if (!gMain.inBattle) gSprites[spriteId].data[7] = 1; DestroyTask(taskId); } static void PremierBallOpenParticleAnimation(u8 taskId) { u32 i; u8 x, y, priority, subpriority, ballId; u8 spriteId; ballId = gTasks[taskId].data[15]; x = gTasks[taskId].data[1]; y = gTasks[taskId].data[2]; priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; for (i = 0; i < 8; i++) { spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { IncrementBattleParticleCounter(); StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = PremierBallOpenParticleAnimation_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; } } if (!gMain.inBattle) gSprites[spriteId].data[7] = 1; DestroyTask(taskId); } static void PremierBallOpenParticleAnimation_Step1(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[0], sprite->data[1]); sprite->y2 = Cos(sprite->data[0], Sin(sprite->data[0] & 0x3F, sprite->data[2])); sprite->data[0] = (sprite->data[0] + 10) & 0xFF; sprite->data[1]++; sprite->data[2]++; if (++sprite->data[3] == 51) DestroyBallOpenAnimationParticle(sprite); } static void DestroyBallOpenAnimationParticle(struct Sprite *sprite) { int i, j; if (!gMain.inBattle) { if (sprite->data[7] == 1) DestroySpriteAndFreeResources(sprite); else DestroySprite(sprite); } else { gBattleSpritesDataPtr->animationData->numBallParticles--; if (gBattleSpritesDataPtr->animationData->numBallParticles == 0) { for (j = 0; j < POKEBALL_COUNT; j++) { FreeSpriteTilesByTag(gBallParticleSpritesheets[j].tag); FreeSpritePaletteByTag(gBallParticlePalettes[j].tag); } DestroySprite(sprite); } else { DestroySprite(sprite); } } } u8 LaunchBallFadeMonTask(bool8 unfadeLater, u8 battler, u32 selectedPalettes, u8 ballId) { u8 taskId; taskId = CreateTask(Task_FadeMon_ToBallColor, 5); gTasks[taskId].data[15] = ballId; gTasks[taskId].data[3] = battler; gTasks[taskId].data[10] = selectedPalettes; gTasks[taskId].data[11] = selectedPalettes >> 16; if (!unfadeLater) { BlendPalette(OBJ_PLTT_ID(battler), 16, 0, sBallOpenFadeColors[ballId]); gTasks[taskId].data[1] = 1; } else { BlendPalette(OBJ_PLTT_ID(battler), 16, 16, sBallOpenFadeColors[ballId]); gTasks[taskId].data[0] = 16; gTasks[taskId].data[1] = -1; gTasks[taskId].func = Task_FadeMon_ToNormal; } BeginNormalPaletteFade(selectedPalettes, 0, 0, 16, RGB_WHITE); return taskId; } static void Task_FadeMon_ToBallColor(u8 taskId) { u8 ballId = gTasks[taskId].data[15]; if (gTasks[taskId].data[2] <= 16) { BlendPalette(OBJ_PLTT_ID(gTasks[taskId].data[3]), 16, gTasks[taskId].data[0], sBallOpenFadeColors[ballId]); gTasks[taskId].data[0] += gTasks[taskId].data[1]; gTasks[taskId].data[2]++; } else if (!gPaletteFade.active) { u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16); BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB_WHITE); DestroyTask(taskId); } } static void Task_FadeMon_ToNormal(u8 taskId) { if (!gPaletteFade.active) { u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16); BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB_WHITE); gTasks[taskId].func = Task_FadeMon_ToNormal_Step; } } static void Task_FadeMon_ToNormal_Step(u8 taskId) { u8 ballId = gTasks[taskId].data[15]; if (gTasks[taskId].data[2] <= 16) { BlendPalette(OBJ_PLTT_ID(gTasks[taskId].data[3]), 16, gTasks[taskId].data[0], sBallOpenFadeColors[ballId]); gTasks[taskId].data[0] += gTasks[taskId].data[1]; gTasks[taskId].data[2]++; } else { DestroyTask(taskId); } } void AnimTask_SwapMonSpriteToFromSubstitute(u8 taskId) { u8 spriteId; u32 x; bool32 done = FALSE; spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; switch (gTasks[taskId].data[10]) { case 0: gTasks[taskId].data[11] = gBattleAnimArgs[0]; gTasks[taskId].data[0] += 0x500; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gSprites[spriteId].x2 += gTasks[taskId].data[0] >> 8; else gSprites[spriteId].x2 -= gTasks[taskId].data[0] >> 8; gTasks[taskId].data[0] &= 0xFF; x = gSprites[spriteId].x + gSprites[spriteId].x2 + 32; if (x > 304) gTasks[taskId].data[10]++; break; case 1: LoadBattleMonGfxAndAnimate(gBattleAnimAttacker, gTasks[taskId].data[11], spriteId); gTasks[taskId].data[10]++; break; case 2: gTasks[taskId].data[0] += 0x500; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gSprites[spriteId].x2 -= gTasks[taskId].data[0] >> 8; else gSprites[spriteId].x2 += gTasks[taskId].data[0] >> 8; gTasks[taskId].data[0] &= 0xFF; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { if (gSprites[spriteId].x2 <= 0) { gSprites[spriteId].x2 = 0; done = TRUE; } } else { if (gSprites[spriteId].x2 >= 0) { gSprites[spriteId].x2 = 0; done = TRUE; } } if (done) DestroyAnimVisualTask(taskId); break; } } void AnimTask_SubstituteFadeToInvisible(u8 taskId) { u8 spriteId; switch (gTasks[taskId].data[15]) { case 0: if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == B_POSITION_OPPONENT_LEFT) SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); else SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); gTasks[taskId].data[15]++; break; case 1: if (gTasks[taskId].data[1]++ > 1) { gTasks[taskId].data[1] = 0; gTasks[taskId].data[0]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - gTasks[taskId].data[0], gTasks[taskId].data[0])); if (gTasks[taskId].data[0] == 16) gTasks[taskId].data[15]++; } break; case 2: spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; RequestDma3Fill(0, (void *)OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * TILE_SIZE_4BPP, 0x800, DMA3_32BIT); ClearBehindSubstituteBit(gBattleAnimAttacker); DestroyAnimVisualTask(taskId); break; } } void AnimTask_IsAttackerBehindSubstitute(u8 taskId) { gBattleAnimArgs[ARG_RET_ID] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].behindSubstitute; DestroyAnimVisualTask(taskId); } void AnimTask_SetTargetToEffectBattler(u8 taskId) { gBattleAnimTarget = gEffectBattler; DestroyAnimVisualTask(taskId); } void TryShinyAnimation(u8 battler, struct Pokemon *mon) { bool32 isShiny; u32 otId, personality; u32 shinyValue; u8 taskId1, taskId2; isShiny = FALSE; gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = TRUE; otId = GetMonData(mon, MON_DATA_OT_ID); personality = GetMonData(mon, MON_DATA_PERSONALITY); if (IsBattlerSpriteVisible(battler)) { shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); if (shinyValue < SHINY_ODDS) isShiny = TRUE; if (isShiny) { if (GetSpriteTileStartByTag(ANIM_TAG_GOLD_STARS) == 0xFFFF) { LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[ANIM_TAG_GOLD_STARS - ANIM_SPRITES_START]); LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[ANIM_TAG_GOLD_STARS - ANIM_SPRITES_START]); } taskId1 = CreateTask(AnimTask_ShinySparkles, 10); taskId2 = CreateTask(AnimTask_ShinySparkles, 10); gTasks[taskId1].data[0] = battler; gTasks[taskId2].data[0] = battler; gTasks[taskId1].data[1] = 0; gTasks[taskId2].data[1] = 1; return; } } gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = TRUE; } static void AnimTask_ShinySparkles(u8 taskId) { u8 battler; u8 x, y; u8 spriteId; u16 counter; s16 state; u8 pan; if (gTasks[taskId].data[13] < 60) { gTasks[taskId].data[13]++; return; } if (gBattleSpritesDataPtr->animationData->numBallParticles) return; counter = gTasks[taskId].data[10]++; if (counter & 3) return; battler = gTasks[taskId].data[0]; x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y); state = gTasks[taskId].data[11]; if (state == 0) { spriteId = CreateSprite(&gWishStarSpriteTemplate, x, y, 5); } else if (state >= 0 && gTasks[taskId].data[11] < 4) { spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5); gSprites[spriteId].oam.tileNum += 4; } else { spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5); gSprites[spriteId].oam.tileNum += 5; } if (gTasks[taskId].data[1] == FALSE) { gSprites[spriteId].callback = SpriteCB_ShinySparkles_1; } else { gSprites[spriteId].callback = SpriteCB_ShinySparkles_2; gSprites[spriteId].x2 = -32; gSprites[spriteId].y2 = 32; gSprites[spriteId].invisible = TRUE; if (gTasks[taskId].data[11] == FALSE) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) pan = SOUND_PAN_ATTACKER; else pan = SOUND_PAN_TARGET; PlaySE12WithPanning(SE_SHINY, pan); } } gSprites[spriteId].data[0] = taskId; gTasks[taskId].data[11]++; if (spriteId != MAX_SPRITES) gTasks[taskId].data[12]++; if (gTasks[taskId].data[11] == 5) gTasks[taskId].func = AnimTask_ShinySparkles_WaitSparkles; } static void AnimTask_ShinySparkles_WaitSparkles(u8 taskId) { u8 battler; if (gTasks[taskId].data[12] == FALSE) { if (gTasks[taskId].data[1] == TRUE) { battler = gTasks[taskId].data[0]; gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = TRUE; } DestroyTask(taskId); } } static void SpriteCB_ShinySparkles_1(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[1], 24); sprite->y2 = Cos(sprite->data[1], 24); sprite->data[1] += 12; if (sprite->data[1] > 0xFF) { gTasks[sprite->data[0]].data[12]--; FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } static void SpriteCB_ShinySparkles_2(struct Sprite *sprite) { if (sprite->data[1] < 4) { sprite->data[1]++; } else { sprite->invisible = FALSE; sprite->x2 += 5; sprite->y2 -= 5; if (sprite->x2 > 32) { gTasks[sprite->data[0]].data[12]--; FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } } void AnimTask_LoadBaitGfx(u8 taskId) { u8 paletteIndex; LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[ANIM_TAG_SAFARI_BAIT - ANIM_SPRITES_START]); LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[ANIM_TAG_SAFARI_BAIT - ANIM_SPRITES_START]); paletteIndex = IndexOfSpritePaletteTag(ANIM_TAG_SAFARI_BAIT); DestroyAnimVisualTask(taskId); } void AnimTask_FreeBaitGfx(u8 taskId) { FreeSpriteTilesByTag(ANIM_TAG_SAFARI_BAIT); FreeSpritePaletteByTag(ANIM_TAG_SAFARI_BAIT); DestroyAnimVisualTask(taskId); } static void SpriteCB_SafariBaitOrRock_Init(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 0); sprite->sTransl_Speed = 30; sprite->sTransl_DestX = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), BATTLER_COORD_X) + gBattleAnimArgs[2]; sprite->sTransl_DestY = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), BATTLER_COORD_Y) + gBattleAnimArgs[3]; sprite->sTransl_ArcAmpl = -32; InitAnimArcTranslation(sprite); gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].callback = SpriteCB_PlayerThrowInit; sprite->callback = SpriteCB_SafariBaitOrRock_WaitPlayerThrow; } static void SpriteCB_SafariBaitOrRock_WaitPlayerThrow(struct Sprite *sprite) { if (gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].animCmdIndex == 1) sprite->callback = SpriteCB_SafariBaitOrRock_ArcFlight; } static void SpriteCB_SafariBaitOrRock_ArcFlight(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { sprite->data[0] = 0; sprite->invisible = TRUE; sprite->callback = SpriteCB_SafariBaitOrRock_Finish; } } static void SpriteCB_SafariBaitOrRock_Finish(struct Sprite *sprite) { if (gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].animEnded) { if (++sprite->data[0] > 0) { StartSpriteAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], 0); DestroyAnimSprite(sprite); } } } void AnimTask_SafariOrGhost_DecideAnimSides(u8 taskId) { switch (gBattleAnimArgs[0]) { case 0: gBattleAnimAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); gBattleAnimTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); break; case 1: gBattleAnimAttacker = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); gBattleAnimTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); break; } DestroyAnimVisualTask(taskId); } void AnimTask_SafariGetReaction(u8 taskId) { if (gBattleCommunication[MULTISTRING_CHOOSER] >= NUM_SAFARI_REACTIONS) gBattleAnimArgs[7] = 0; else gBattleAnimArgs[7] = gBattleCommunication[MULTISTRING_CHOOSER]; DestroyAnimVisualTask(taskId); } void AnimTask_GetTrappedMoveAnimId(u8 taskId) { if (gBattleSpritesDataPtr->animationData->animArg == MOVE_FIRE_SPIN) gBattleAnimArgs[0] = TRAP_ANIM_FIRE_SPIN; else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_WHIRLPOOL) gBattleAnimArgs[0] = TRAP_ANIM_WHIRLPOOL; else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_CLAMP) gBattleAnimArgs[0] = TRAP_ANIM_CLAMP; else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_SAND_TOMB) gBattleAnimArgs[0] = TRAP_ANIM_SAND_TOMB; else gBattleAnimArgs[0] = TRAP_ANIM_BIND; DestroyAnimVisualTask(taskId); } void AnimTask_GetBattlersFromArg(u8 taskId) { gBattleAnimAttacker = gBattleSpritesDataPtr->animationData->animArg; gBattleAnimTarget = gBattleSpritesDataPtr->animationData->animArg >> 8; DestroyAnimVisualTask(taskId); } ================================================ FILE: src/battle_anim_status_effects.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "decompress.h" #include "task.h" #include "trig.h" #include "util.h" #include "constants/battle_anim.h" #include "constants/pokemon.h" static u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 b); static void Task_UpdateFlashingCircleImpacts(u8 taskId); static void AnimTask_FrozenIceCube_Step1(u8 taskId); static void AnimTask_FrozenIceCube_Step2(u8 taskId); static void AnimTask_FrozenIceCube_Step3(u8 taskId); static void AnimTask_FrozenIceCube_Step4(u8 taskId); static void Task_DoStatusAnimation(u8 taskId); static void AnimFlashingCircleImpact(struct Sprite *sprite); static void AnimFlashingCircleImpact_Step(struct Sprite *sprite); static const union AnimCmd sAnim_FlickeringOrb[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(4, 3), ANIMCMD_FRAME(8, 3), ANIMCMD_FRAME(12, 3), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_FlickeringOrb[] = { sAnim_FlickeringOrb }; // Unused static const struct SpriteTemplate sFlickeringOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORB, .paletteTag = ANIM_TAG_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnims_FlickeringOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTranslateLinearAndFlicker, }; // Unused static const struct SpriteTemplate sFlickeringOrbFlippedSpriteTemplate = { .tileTag = ANIM_TAG_ORB, .paletteTag = ANIM_TAG_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnims_FlickeringOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTranslateLinearAndFlicker_Flipped, }; static const union AnimCmd sAnim_WeatherBallNormal[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_WeatherBallNormal[] = { sAnim_WeatherBallNormal }; const struct SpriteTemplate gWeatherBallUpSpriteTemplate = { .tileTag = ANIM_TAG_WEATHER_BALL, .paletteTag = ANIM_TAG_WEATHER_BALL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_WeatherBallNormal, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWeatherBallUp, }; const struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate = { .tileTag = ANIM_TAG_WEATHER_BALL, .paletteTag = ANIM_TAG_WEATHER_BALL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_WeatherBallNormal, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWeatherBallDown, }; static const union AnimCmd sAnim_SpinningSparkle[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_FRAME(64, 3), ANIMCMD_END }; static const union AnimCmd *const sAnims_SpinningSparkle[] = { sAnim_SpinningSparkle }; const struct SpriteTemplate gSpinningSparkleSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_SpinningSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpinningSparkle, }; // Unused static const struct SpriteTemplate sFlickeringFootSpriteTemplate = { .tileTag = ANIM_TAG_MONSTER_FOOT, .paletteTag = ANIM_TAG_MONSTER_FOOT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTranslateLinearAndFlicker, }; static const union AnimCmd sAnim_FlickeringImpact_0[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_FlickeringImpact_1[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_FlickeringImpact_2[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_FlickeringImpact[] = { sAnim_FlickeringImpact_0, sAnim_FlickeringImpact_1, sAnim_FlickeringImpact_2 }; // Unused static const struct SpriteTemplate sFlickeringImpactSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FlickeringImpact, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTranslateLinearAndFlicker, }; static const union AnimCmd sAnim_FlickeringShrinkOrb[] = { ANIMCMD_FRAME(0, 15), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_FlickeringShrinkOrb[] = { sAnim_FlickeringShrinkOrb }; static const union AffineAnimCmd sAffineAnim_FlickeringShrinkOrb[] = { AFFINEANIMCMD_FRAME(96, 96, 0, 0), AFFINEANIMCMD_FRAME(2, 2, 0, 1), AFFINEANIMCMD_JUMP(1) }; static const union AffineAnimCmd *const sAffineAnims_FlickeringShrinkOrb[] = { sAffineAnim_FlickeringShrinkOrb }; // Unused static const struct SpriteTemplate sFlickeringShrinkOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORB, .paletteTag = ANIM_TAG_ORB, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = sAnims_FlickeringShrinkOrb, .images = NULL, .affineAnims = sAffineAnims_FlickeringShrinkOrb, .callback = AnimTranslateLinearAndFlicker_Flipped, }; static const struct Subsprite sFrozenIceCubeSubsprites[] = { {.x = -16, .y = -16, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .tileOffset = 0, .priority = 2}, {.x = -16, .y = 48, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 64, .priority = 2}, {.x = 48, .y = -16, .shape = SPRITE_SHAPE(32x64), .size = SPRITE_SIZE(32x64), .tileOffset = 96, .priority = 2}, {.x = 48, .y = 48, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .tileOffset = 128, .priority = 2}, }; static const struct SubspriteTable sFrozenIceCubeSubspriteTable[] = { {NELEMS(sFrozenIceCubeSubsprites), sFrozenIceCubeSubsprites}, }; static const struct SpriteTemplate sFrozenIceCubeSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CUBE, .paletteTag = ANIM_TAG_ICE_CUBE, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct SpriteTemplate sFlashingCircleImpactSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_IMPACT, .paletteTag = ANIM_TAG_CIRCLE_IMPACT, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFlashingCircleImpact, }; // Unused static u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 b) { u8 battlerSpriteId = gBattlerSpriteIds[battlerId]; u8 taskId = CreateTask(Task_UpdateFlashingCircleImpacts, 10); u8 spriteId2; u32 i; LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); gTasks[taskId].data[0] = battlerId; if (b) { gTasks[taskId].data[1] = RGB_RED; for (i = 0; i < 10; i++) { spriteId2 = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y + 32, 0); gSprites[spriteId2].data[0] = i * 51; gSprites[spriteId2].data[1] = -256; gSprites[spriteId2].invisible = TRUE; if (i > 4) gSprites[spriteId2].data[6] = 21; } } else { gTasks[taskId].data[1] = RGB_BLUE; for (i = 0; i < 10; i++) { spriteId2 = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y - 32, 0); gSprites[spriteId2].data[0] = i * 51; gSprites[spriteId2].data[1] = 256; gSprites[spriteId2].invisible = TRUE; if (i > 4) gSprites[spriteId2].data[6] = 21; } } gSprites[spriteId2].data[7] = 1; return taskId; } static void Task_UpdateFlashingCircleImpacts(u8 taskId) { if (gTasks[taskId].data[2] == 2) { gTasks[taskId].data[2] = 0; BlendPalette(OBJ_PLTT_ID(gTasks[taskId].data[0]), 16, gTasks[taskId].data[4], gTasks[taskId].data[1]); if (gTasks[taskId].data[5] == 0) { gTasks[taskId].data[4]++; if (gTasks[taskId].data[4] > 8) gTasks[taskId].data[5] ^= 1; } else { u16 var = gTasks[taskId].data[4]; gTasks[taskId].data[4]--; if (gTasks[taskId].data[4] < 0) { gTasks[taskId].data[4] = var; gTasks[taskId].data[5] ^= 1; gTasks[taskId].data[3]++; if (gTasks[taskId].data[3] == 2) DestroyTask(taskId); } } } else { gTasks[taskId].data[2]++; } } static void AnimFlashingCircleImpact(struct Sprite *sprite) { if (sprite->data[6] == 0) { sprite->invisible = FALSE; sprite->callback = AnimFlashingCircleImpact_Step; sprite->callback(sprite); } else { sprite->data[6]--; } } static void AnimFlashingCircleImpact_Step(struct Sprite *sprite) { sprite->x2 = Cos(sprite->data[0], 32); sprite->y2 = Sin(sprite->data[0], 8); if (sprite->data[0] < 128) sprite->subpriority = 29; else sprite->subpriority = 31; sprite->data[0] = (sprite->data[0] + 8) & 0xFF; sprite->data[5] += sprite->data[1]; sprite->y2 += sprite->data[5] >> 8; sprite->data[2]++; if (sprite->data[2] == 52) { if (sprite->data[7]) DestroySpriteAndFreeResources(sprite); else DestroySprite(sprite); } } void AnimTask_FrozenIceCube(u8 taskId) { s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) - 32; s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) - 36; u8 spriteId; if (IsContest()) x -= 6; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); spriteId = CreateSprite(&sFrozenIceCubeSpriteTemplate, x, y, 4); if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == 0xFFFF) gSprites[spriteId].invisible = TRUE; SetSubspriteTables(&gSprites[spriteId], sFrozenIceCubeSubspriteTable); gTasks[taskId].data[15] = spriteId; gTasks[taskId].func = AnimTask_FrozenIceCube_Step1; } static void AnimTask_FrozenIceCube_Step1(u8 taskId) { gTasks[taskId].data[1]++; if (gTasks[taskId].data[1] == 10) { gTasks[taskId].func = AnimTask_FrozenIceCube_Step2; gTasks[taskId].data[1] = 0; } else { u8 var = gTasks[taskId].data[1]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(var, 16 - var)); } } static void AnimTask_FrozenIceCube_Step2(u8 taskId) { u8 palIndex = IndexOfSpritePaletteTag(ANIM_TAG_ICE_CUBE); if (gTasks[taskId].data[1]++ > 13) { gTasks[taskId].data[2]++; if (gTasks[taskId].data[2] == 3) { u16 temp; temp = gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 13]; gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 13] = gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 14]; gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 14] = gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 15]; gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 15] = temp; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3]++; if (gTasks[taskId].data[3] == 3) { gTasks[taskId].data[3] = 0; gTasks[taskId].data[1] = 0; gTasks[taskId].data[4]++; if (gTasks[taskId].data[4] == 2) { gTasks[taskId].data[1] = 9; gTasks[taskId].func = AnimTask_FrozenIceCube_Step3; } } } } } static void AnimTask_FrozenIceCube_Step3(u8 taskId) { gTasks[taskId].data[1]--; if (gTasks[taskId].data[1] == -1) { gTasks[taskId].func = AnimTask_FrozenIceCube_Step4; gTasks[taskId].data[1] = 0; } else { u8 var = gTasks[taskId].data[1]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(var, 16 - var)); } } static void AnimTask_FrozenIceCube_Step4(u8 taskId) { gTasks[taskId].data[1]++; if (gTasks[taskId].data[1] == 37) { u8 spriteId = gTasks[taskId].data[15]; FreeSpriteOamMatrix(&gSprites[spriteId]); DestroySprite(&gSprites[spriteId]); } else if (gTasks[taskId].data[1] == 39) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyAnimVisualTask(taskId); } } #define CASE(by, stat) case (STAT_ANIM_##by + stat - 1) void AnimTask_StatsChange(u8 taskId) { bool16 goesDown = FALSE; s16 animStatId = 0; bool16 sharply = FALSE; switch (gBattleSpritesDataPtr->animationData->animArg) { CASE(PLUS1, STAT_ATK): goesDown = FALSE; animStatId = 0; break; CASE(PLUS1, STAT_DEF): goesDown = FALSE; animStatId = 1; break; CASE(PLUS1, STAT_SPEED): goesDown = FALSE; animStatId = 3; break; CASE(PLUS1, STAT_SPATK): goesDown = FALSE; animStatId = 5; break; CASE(PLUS1, STAT_SPDEF): goesDown = FALSE; animStatId = 6; break; CASE(PLUS1, STAT_ACC): goesDown = FALSE; animStatId = 2; break; CASE(PLUS1, STAT_EVASION): goesDown = FALSE; animStatId = 4; break; CASE(MINUS1, STAT_ATK): goesDown = TRUE; animStatId = 0; break; CASE(MINUS1, STAT_DEF): goesDown = TRUE; animStatId = 1; break; CASE(MINUS1, STAT_SPEED): goesDown = TRUE; animStatId = 3; break; CASE(MINUS1, STAT_SPATK): goesDown = TRUE; animStatId = 5; break; CASE(MINUS1, STAT_SPDEF): goesDown = TRUE; animStatId = 6; break; CASE(MINUS1, STAT_ACC): goesDown = TRUE; animStatId = 2; break; CASE(MINUS1, STAT_EVASION): goesDown = TRUE; animStatId = 4; break; CASE(PLUS2, STAT_ATK): goesDown = FALSE; animStatId = 0; sharply = TRUE; break; CASE(PLUS2, STAT_DEF): goesDown = FALSE; animStatId = 1; sharply = TRUE; break; CASE(PLUS2, STAT_SPEED): goesDown = FALSE; animStatId = 3; sharply = TRUE; break; CASE(PLUS2, STAT_SPATK): goesDown = FALSE; animStatId = 5; sharply = TRUE; break; CASE(PLUS2, STAT_SPDEF): goesDown = FALSE; animStatId = 6; sharply = TRUE; break; CASE(PLUS2, STAT_ACC): goesDown = FALSE; animStatId = 2; sharply = TRUE; break; CASE(PLUS2, STAT_EVASION): goesDown = FALSE; animStatId = 4; sharply = TRUE; break; CASE(MINUS2, STAT_ATK): goesDown = TRUE; animStatId = 0; sharply = TRUE; break; CASE(MINUS2, STAT_DEF): goesDown = TRUE; animStatId = 1; sharply = TRUE; break; CASE(MINUS2, STAT_SPEED): goesDown = TRUE; animStatId = 3; sharply = TRUE; break; CASE(MINUS2, STAT_SPATK): goesDown = TRUE; animStatId = 5; sharply = TRUE; break; CASE(MINUS2, STAT_SPDEF): goesDown = TRUE; animStatId = 6; sharply = TRUE; break; CASE(MINUS2, STAT_ACC): goesDown = TRUE; animStatId = 2; sharply = TRUE; break; CASE(MINUS2, STAT_EVASION): goesDown = TRUE; animStatId = 4; sharply = TRUE; break; case STAT_ANIM_MULTIPLE_PLUS1: goesDown = FALSE; animStatId = 0xFF; sharply = FALSE; break; case STAT_ANIM_MULTIPLE_PLUS2: goesDown = FALSE; animStatId = 0xFF; sharply = TRUE; break; case STAT_ANIM_MULTIPLE_MINUS1: goesDown = TRUE; animStatId = 0xFF; sharply = FALSE; break; case STAT_ANIM_MULTIPLE_MINUS2: goesDown = TRUE; animStatId = 0xFF; sharply = TRUE; break; default: DestroyAnimVisualTask(taskId); return; } gBattleAnimArgs[0] = goesDown; gBattleAnimArgs[1] = animStatId; gBattleAnimArgs[2] = 0; gBattleAnimArgs[3] = 0; gBattleAnimArgs[4] = sharply; gTasks[taskId].func = InitStatsChangeAnimation; InitStatsChangeAnimation(taskId); } #undef CASE void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId) { u8 taskId; gBattleAnimAttacker = battlerId; gBattleAnimTarget = battlerId; LaunchBattleAnimation(gBattleAnims_StatusConditions, statusAnimId, 0); taskId = CreateTask(Task_DoStatusAnimation, 10); gTasks[taskId].data[0] = battlerId; } static void Task_DoStatusAnimation(u8 taskId) { gAnimScriptCallback(); if (!gAnimScriptActive) { gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].data[0]].statusAnimActive = FALSE; DestroyTask(taskId); } } ================================================ FILE: src/battle_anim_utility_funcs.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "graphics.h" #include "task.h" #include "util.h" #include "constants/songs.h" struct AnimStatsChangeData { u8 battler1; u8 battler2; u8 higherPriority; s16 data[8]; u16 species; }; static void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes); static void AnimTask_BlendSpriteColor_Step2(u8 taskId); static void AnimTask_HardwarePaletteFade_Step(u8 taskId); static void AnimTask_TraceMonBlended_Step(u8 taskId); static void AnimMonTrace(struct Sprite *sprite); static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId); static void StatsChangeAnimation_Step1(u8 taskId); static void StatsChangeAnimation_Step2(u8 taskId); static void StatsChangeAnimation_Step3(u8 taskId); static void AnimTask_Flash_Step(u8 taskId); static void SetPalettesToColor(u32 selectedPalettes, u16 color); static void AnimTask_UpdateSlidingBg(u8 taskId); static void UpdateMonScrollingBgMask(u8 taskId); static void AnimTask_WaitAndRestoreVisibility(u8 taskId); static EWRAM_DATA struct AnimStatsChangeData *sAnimStatsChangeData = NULL; static const u16 sRgbWhite[] = { RGB_WHITE }; const u8 gBattleAnimRegOffsBgCnt[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT }; const u8 gBattleIntroRegOffsBgCnt[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT }; // gBattleAnimArgs[0] is a bitfield. // Bits 0-10 result in the following palettes being selected: // 0: battle background palettes (BG palettes 1, 2, and 3) // 1: gBattleAnimAttacker OBJ palette // 2: gBattleAnimTarget OBJ palette // 3: gBattleAnimAttacker partner OBJ palette // 4: gBattleAnimTarget partner OBJ palette // 5: BG palette 4 // 6: BG palette 5 // 7: Player battler left // 8: Player battler right // 9: Enemy battler left // 10: Enemy battler right void AnimTask_BlendBattleAnimPal(u8 taskId) { u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]); selectedPalettes |= GetBattleMonSpritePalettesMask( (gBattleAnimArgs[0] >> 7) & 1, (gBattleAnimArgs[0] >> 8) & 1, (gBattleAnimArgs[0] >> 9) & 1, (gBattleAnimArgs[0] >> 10) & 1); StartBlendAnimSpriteColor(taskId, selectedPalettes); } // gBattleAnimArgs[0] is a command ID // This command will blend bg and battlers except as commanded: // 0: Not attacker // 1: Not target // 2: Not attacker nor bg // 3: Not target nor bg // 4: Neither attacker nor target // 5: Blend all // 6: Neither bg nor attacker's partner // 7: Neither bg nor target's partner void AnimTask_BlendBattleAnimPalExclude(u8 taskId) { u8 battler; u32 selectedPalettes; u8 animBattlers[2]; animBattlers[1] = 0xFF; selectedPalettes = UnpackSelectedBattlePalettes(1); switch (gBattleAnimArgs[0]) { case 2: selectedPalettes = 0; // fall through case ANIM_ATTACKER: animBattlers[0] = gBattleAnimAttacker; break; case 3: selectedPalettes = 0; // fall through case ANIM_TARGET: animBattlers[0] = gBattleAnimTarget; break; case 4: animBattlers[0] = gBattleAnimAttacker; animBattlers[1] = gBattleAnimTarget; break; case 5: animBattlers[0] = 0xFF; break; case 6: selectedPalettes = 0; animBattlers[0] = BATTLE_PARTNER(gBattleAnimAttacker); break; case 7: selectedPalettes = 0; animBattlers[0] = BATTLE_PARTNER(gBattleAnimTarget); break; } for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) { if (battler != animBattlers[0] && battler != animBattlers[1] && IsBattlerSpriteVisible(battler)) selectedPalettes |= 0x10000 << GetSpritePalIdxByBattler(battler); } StartBlendAnimSpriteColor(taskId, selectedPalettes); } void AnimTask_SetCamouflageBlend(u8 taskId) { u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]); switch (gBattleTerrain) { case BATTLE_TERRAIN_GRASS: gBattleAnimArgs[4] = RGB(12, 24, 2); break; case BATTLE_TERRAIN_LONG_GRASS: gBattleAnimArgs[4] = RGB(0, 15, 2); break; case BATTLE_TERRAIN_SAND: gBattleAnimArgs[4] = RGB(30, 24, 11); break; case BATTLE_TERRAIN_UNDERWATER: gBattleAnimArgs[4] = RGB(0, 0, 18); break; case BATTLE_TERRAIN_WATER: gBattleAnimArgs[4] = RGB(11, 22, 31); break; case BATTLE_TERRAIN_POND: gBattleAnimArgs[4] = RGB(11, 22, 31); break; case BATTLE_TERRAIN_MOUNTAIN: gBattleAnimArgs[4] = RGB(22, 16, 10); break; case BATTLE_TERRAIN_CAVE: gBattleAnimArgs[4] = RGB(14, 9, 3); break; case BATTLE_TERRAIN_BUILDING: gBattleAnimArgs[4] = RGB(31, 31, 31); break; case BATTLE_TERRAIN_PLAIN: gBattleAnimArgs[4] = RGB(31, 31, 31); break; } StartBlendAnimSpriteColor(taskId, selectedPalettes); } void AnimTask_BlendParticle(u8 taskId) { u8 paletteIndex = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); u32 selectedPalettes = 1 << (paletteIndex + 16); StartBlendAnimSpriteColor(taskId, selectedPalettes); } static void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes) { gTasks[taskId].data[0] = selectedPalettes; gTasks[taskId].data[1] = selectedPalettes >> 16; gTasks[taskId].data[2] = gBattleAnimArgs[1]; gTasks[taskId].data[3] = gBattleAnimArgs[2]; gTasks[taskId].data[4] = gBattleAnimArgs[3]; gTasks[taskId].data[5] = gBattleAnimArgs[4]; gTasks[taskId].data[10] = gBattleAnimArgs[2]; gTasks[taskId].func = AnimTask_BlendSpriteColor_Step2; gTasks[taskId].func(taskId); } static void AnimTask_BlendSpriteColor_Step2(u8 taskId) { u32 selectedPalettes; u16 singlePaletteMask = 0; if (gTasks[taskId].data[9] == gTasks[taskId].data[2]) { gTasks[taskId].data[9] = 0; selectedPalettes = gTasks[taskId].data[0] | (gTasks[taskId].data[1] << 16); while (selectedPalettes) { if (selectedPalettes & 1) BlendPalette(singlePaletteMask, 16, gTasks[taskId].data[10], gTasks[taskId].data[5]); singlePaletteMask += 0x10; selectedPalettes >>= 1; } if (gTasks[taskId].data[10] < gTasks[taskId].data[4]) ++gTasks[taskId].data[10]; else if (gTasks[taskId].data[10] > gTasks[taskId].data[4]) --gTasks[taskId].data[10]; else DestroyAnimVisualTask(taskId); } else { ++gTasks[taskId].data[9]; } } void AnimTask_HardwarePaletteFade(u8 taskId) { BeginHardwarePaletteFade(gBattleAnimArgs[0], gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]); gTasks[taskId].func = AnimTask_HardwarePaletteFade_Step; } static void AnimTask_HardwarePaletteFade_Step(u8 taskId) { if (!gPaletteFade.active) DestroyAnimVisualTask(taskId); } // Used to leave blended traces of a mon, usually to imply speed as in Agility or Aerial Ace void AnimTask_TraceMonBlended(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[0] = gBattleAnimArgs[0]; task->data[1] = 0; task->data[2] = gBattleAnimArgs[1]; task->data[3] = gBattleAnimArgs[2]; task->data[4] = gBattleAnimArgs[3]; task->data[5] = 0; task->func = AnimTask_TraceMonBlended_Step; } static void AnimTask_TraceMonBlended_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; if (task->data[4]) { if (task->data[1]) { --task->data[1]; } else { task->data[6] = CloneBattlerSpriteWithBlend(task->data[0]); if (task->data[6] >= 0) { gSprites[task->data[6]].oam.priority = task->data[0] ? 1 : 2; gSprites[task->data[6]].data[0] = task->data[3]; gSprites[task->data[6]].data[1] = taskId; gSprites[task->data[6]].data[2] = 5; gSprites[task->data[6]].callback = AnimMonTrace; ++task->data[5]; } --task->data[4]; task->data[1] = task->data[2]; } } else if (task->data[5] == 0) { DestroyAnimVisualTask(taskId); } } static void AnimMonTrace(struct Sprite *sprite) { if (sprite->data[0]) { --sprite->data[0]; } else { --gTasks[sprite->data[1]].data[sprite->data[2]]; DestroySpriteWithActiveSheet(sprite); } } // Only used by Curse for non-Ghost mons void AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId) { u16 species; s32 newSpriteId; u16 var0; u16 bg1Cnt; u8 spriteId; struct BattleAnimBgData animBgData; var0 = 0; gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12)); bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT); ((struct BgCnt *)&bg1Cnt)->priority = 0; ((struct BgCnt *)&bg1Cnt)->screenSize = 0; SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); if (!IsContest()) { ((struct BgCnt *)&bg1Cnt)->charBaseBlock = 1; SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); } if (IsDoubleBattle() && !IsContest()) { if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT) { if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE) { gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority -= 1; ((struct BgCnt *)&bg1Cnt)->priority = 1; SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); var0 = 1; } } } if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); GetBattleAnimBg1Data(&animBgData); AnimLoadCompressedBgTilemap(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_tilemap); if (IsContest()) RelocateBattleBgPal(animBgData.paletteId, animBgData.bgTilemap, 0, 0); AnimLoadCompressedBgGfx(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_sheet, animBgData.tilesOffset); LoadPalette(sRgbWhite, BG_PLTT_ID(animBgData.paletteId) + 1, PLTT_SIZEOF(1)); gBattle_BG1_X = -gSprites[spriteId].x + 32; gBattle_BG1_Y = -gSprites[spriteId].y + 32; gTasks[taskId].data[0] = newSpriteId; gTasks[taskId].data[6] = var0; gTasks[taskId].func = AnimTask_DrawFallingWhiteLinesOnAttacker_Step; } static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId) { struct BattleAnimBgData animBgData; struct Sprite *sprite; u16 bg1Cnt; gTasks[taskId].data[10] += 4; gBattle_BG1_Y -= 4; if (gTasks[taskId].data[10] == 64) { gTasks[taskId].data[10] = 0; gBattle_BG1_Y += 64; if (++gTasks[taskId].data[11] == 4) { ResetBattleAnimBg(0); gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); if (!IsContest()) { bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT); ((struct BgCnt *)&bg1Cnt)->charBaseBlock = 0; SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); } SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); sprite = &gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)]; // unused sprite = &gSprites[gTasks[taskId].data[0]]; DestroySprite(sprite); GetBattleAnimBg1Data(&animBgData); InitBattleAnimBg(animBgData.bgId); if (gTasks[taskId].data[6] == 1) ++gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority; gBattle_BG1_Y = 0; DestroyAnimVisualTask(taskId); } } } void InitStatsChangeAnimation(u8 taskId) { u32 i; sAnimStatsChangeData = AllocZeroed(sizeof(struct AnimStatsChangeData)); for (i = 0; i < 8; ++i) sAnimStatsChangeData->data[i] = gBattleAnimArgs[i]; gTasks[taskId].func = StatsChangeAnimation_Step1; } static void StatsChangeAnimation_Step1(u8 taskId) { if (sAnimStatsChangeData->data[2] == 0) sAnimStatsChangeData->battler1 = gBattleAnimAttacker; else sAnimStatsChangeData->battler1 = gBattleAnimTarget; sAnimStatsChangeData->battler2 = BATTLE_PARTNER(sAnimStatsChangeData->battler1); if (IsContest() || (sAnimStatsChangeData->data[3] && !IsBattlerSpriteVisible(sAnimStatsChangeData->battler2))) sAnimStatsChangeData->data[3] = 0; gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); if (IsDoubleBattle() && sAnimStatsChangeData->data[3] == 0) { if (GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_PLAYER_LEFT) { if (IsBattlerSpriteVisible(sAnimStatsChangeData->battler2) == TRUE) { gSprites[gBattlerSpriteIds[sAnimStatsChangeData->battler2]].oam.priority -= 1; SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); sAnimStatsChangeData->higherPriority = 1; } } } if (GetBattlerSide(sAnimStatsChangeData->battler1) != B_SIDE_PLAYER) sAnimStatsChangeData->species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES); else sAnimStatsChangeData->species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES); gTasks[taskId].func = StatsChangeAnimation_Step2; } static void StatsChangeAnimation_Step2(u8 taskId) { struct BattleAnimBgData animBgData; u8 spriteId, newSpriteId = 0; u8 battlerSpriteId; battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1]; spriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species); if (sAnimStatsChangeData->data[3]) { battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; newSpriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species); } GetBattleAnimBg1Data(&animBgData); if (sAnimStatsChangeData->data[0] == 0) AnimLoadCompressedBgTilemap(animBgData.bgId, gBattleStatMask1_Tilemap); else AnimLoadCompressedBgTilemap(animBgData.bgId, gBattleStatMask2_Tilemap); if (IsContest()) RelocateBattleBgPal(animBgData.paletteId, animBgData.bgTilemap, 0, 0); AnimLoadCompressedBgGfx(animBgData.bgId, gBattleStatMask_Gfx, animBgData.tilesOffset); switch (sAnimStatsChangeData->data[1]) { case 0: LoadCompressedPalette(gBattleStatMask2_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; case 1: LoadCompressedPalette(gBattleStatMask1_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; case 2: LoadCompressedPalette(gBattleStatMask3_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; case 3: LoadCompressedPalette(gBattleStatMask4_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; case 4: LoadCompressedPalette(gBattleStatMask6_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; case 5: LoadCompressedPalette(gBattleStatMask7_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; case 6: LoadCompressedPalette(gBattleStatMask8_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; default: LoadCompressedPalette(gBattleStatMask5_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; } gBattle_BG1_X = 0; gBattle_BG1_Y = 0; if (sAnimStatsChangeData->data[0] == 1) { gBattle_BG1_X = 64; gTasks[taskId].data[1] = -3; } else { gTasks[taskId].data[1] = 3; } if (sAnimStatsChangeData->data[4] == 0) { gTasks[taskId].data[4] = 10; gTasks[taskId].data[5] = 20; } else { gTasks[taskId].data[4] = 13; gTasks[taskId].data[5] = 30; } gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[2] = sAnimStatsChangeData->data[3]; gTasks[taskId].data[3] = newSpriteId; gTasks[taskId].data[6] = sAnimStatsChangeData->higherPriority; gTasks[taskId].data[7] = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; gTasks[taskId].func = StatsChangeAnimation_Step3; if (sAnimStatsChangeData->data[0] == 0) PlaySE12WithPanning(SE_M_STAT_INCREASE, BattleAnimAdjustPanning2(SOUND_PAN_ATTACKER)); else PlaySE12WithPanning(SE_M_STAT_DECREASE, BattleAnimAdjustPanning2(SOUND_PAN_ATTACKER)); } static void StatsChangeAnimation_Step3(u8 taskId) { gBattle_BG1_Y += gTasks[taskId].data[1]; switch (gTasks[taskId].data[15]) { case 0: if (gTasks[taskId].data[11]++ > 0) { gTasks[taskId].data[11] = 0; ++gTasks[taskId].data[12]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); if (gTasks[taskId].data[12] == gTasks[taskId].data[4]) ++gTasks[taskId].data[15]; } break; case 1: if (++gTasks[taskId].data[10] == gTasks[taskId].data[5]) ++gTasks[taskId].data[15]; break; case 2: if (gTasks[taskId].data[11]++ > 0) { gTasks[taskId].data[11] = 0; --gTasks[taskId].data[12]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); if (gTasks[taskId].data[12] == 0) { ResetBattleAnimBg(0); ++gTasks[taskId].data[15]; } } break; case 3: gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroySprite(&gSprites[gTasks[taskId].data[0]]); if (gTasks[taskId].data[2]) DestroySprite(&gSprites[gTasks[taskId].data[3]]); if (gTasks[taskId].data[6] == 1) ++gSprites[gTasks[taskId].data[7]].oam.priority; Free(sAnimStatsChangeData); sAnimStatsChangeData = NULL; DestroyAnimVisualTask(taskId); break; } } void AnimTask_Flash(u8 taskId) { u32 selectedPalettes = GetBattleMonSpritePalettesMask(1, 1, 1, 1); SetPalettesToColor(selectedPalettes, 0); gTasks[taskId].data[14] = selectedPalettes >> 16; selectedPalettes = GetBattlePalettesMask(1, 0, 0, 0, 0, 0, 0) & 0xFFFF; SetPalettesToColor(selectedPalettes, 0xFFFF); gTasks[taskId].data[15] = selectedPalettes; gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 0; gTasks[taskId].func = AnimTask_Flash_Step; } static void AnimTask_Flash_Step(u8 taskId) { u32 i; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (++task->data[1] > 6) { task->data[1] = 0; task->data[2] = 16; ++task->data[0]; } break; case 1: if (++task->data[1] > 1) { task->data[1] = 0; --task->data[2]; for (i = 0; i < 16; ++i) { if ((task->data[15] >> i) & 1) { u16 paletteOffset = BG_PLTT_ID(i); BlendPalette(paletteOffset, 16, task->data[2], 0xFFFF); } if ((task->data[14] >> i) & 1) { u16 paletteOffset = OBJ_PLTT_ID(i); BlendPalette(paletteOffset, 16, task->data[2], 0); } } if (task->data[2] == 0) ++task->data[0]; } break; case 2: DestroyAnimVisualTask(taskId); break; } } static void SetPalettesToColor(u32 selectedPalettes, u16 color) { u16 i, curOffset, paletteOffset; for (i = 0; i < 32; selectedPalettes >>= 1, ++i) if (selectedPalettes & 1) for (curOffset = PLTT_ID(i), paletteOffset = curOffset; curOffset < paletteOffset + 16; ++curOffset) gPlttBufferFaded[curOffset] = color; } void AnimTask_BlendNonAttackerPalettes(u8 taskId) { s32 j; u32 battler, selectedPalettes = 0; for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) if (gBattleAnimAttacker != battler) selectedPalettes |= 1 << (battler + 16); for (j = 5; j != 0; --j) gBattleAnimArgs[j] = gBattleAnimArgs[j - 1]; StartBlendAnimSpriteColor(taskId, selectedPalettes); } void AnimTask_StartSlidingBg(u8 taskId) { u8 newTaskId; ToggleBg3Mode(0); newTaskId = CreateTask(AnimTask_UpdateSlidingBg, 5); if (gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { gBattleAnimArgs[0] = -gBattleAnimArgs[0]; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } gTasks[newTaskId].data[1] = gBattleAnimArgs[0]; gTasks[newTaskId].data[2] = gBattleAnimArgs[1]; gTasks[newTaskId].data[3] = gBattleAnimArgs[3]; ++gTasks[newTaskId].data[0]; DestroyAnimVisualTask(taskId); } static void AnimTask_UpdateSlidingBg(u8 taskId) { gTasks[taskId].data[10] += gTasks[taskId].data[1]; gTasks[taskId].data[11] += gTasks[taskId].data[2]; gBattle_BG3_X += gTasks[taskId].data[10] >> 8; gBattle_BG3_Y += gTasks[taskId].data[11] >> 8; gTasks[taskId].data[10] &= 0xFF; gTasks[taskId].data[11] &= 0xFF; if (gBattleAnimArgs[7] == gTasks[taskId].data[3]) { gBattle_BG3_X = 0; gBattle_BG3_Y = 0; ToggleBg3Mode(1); DestroyTask(taskId); } } void AnimTask_GetAttackerSide(u8 taskId) { gBattleAnimArgs[7] = GetBattlerSide(gBattleAnimAttacker); DestroyAnimVisualTask(taskId); } void AnimTask_GetTargetSide(u8 taskId) { gBattleAnimArgs[7] = GetBattlerSide(gBattleAnimTarget); DestroyAnimVisualTask(taskId); } void AnimTask_GetTargetIsAttackerPartner(u8 taskId) { gBattleAnimArgs[7] = BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget; DestroyAnimVisualTask(taskId); } // For hiding or subsequently revealing all other battlers void AnimTask_SetAllNonAttackersInvisiblity(u8 taskId) { u16 battler; for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) if (battler != gBattleAnimAttacker && IsBattlerSpriteVisible(battler)) gSprites[gBattlerSpriteIds[battler]].invisible = gBattleAnimArgs[0]; DestroyAnimVisualTask(taskId); } void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 scrollSpeed, u8 battler1, bool8 includePartner, u8 numFadeSteps, u8 fadeStepDelay, u8 duration, const u32 *gfx, const u32 *tilemap, const u32 *palette) { u16 species; u8 spriteId, newSpriteId = 0; u16 bg1Cnt; struct BattleAnimBgData animBgData; u8 battler2 = BATTLE_PARTNER(battler1); if (IsContest() || (includePartner && !IsBattlerSpriteVisible(battler2))) includePartner = FALSE; gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT); ((vBgCnt *)&bg1Cnt)->priority = 0; ((vBgCnt *)&bg1Cnt)->screenSize = 0; ((vBgCnt *)&bg1Cnt)->areaOverflowMode = 1; if (!IsContest()) ((vBgCnt *)&bg1Cnt)->charBaseBlock = 1; SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); if (GetBattlerSide(battler1) != B_SIDE_PLAYER) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); spriteId = CreateInvisibleSpriteCopy(battler1, gBattlerSpriteIds[battler1], species); if (includePartner) newSpriteId = CreateInvisibleSpriteCopy(battler2, gBattlerSpriteIds[battler2], species); GetBattleAnimBg1Data(&animBgData); AnimLoadCompressedBgTilemap(animBgData.bgId, tilemap); if (IsContest()) RelocateBattleBgPal(animBgData.paletteId, animBgData.bgTilemap, 0, 0); AnimLoadCompressedBgGfx(animBgData.bgId, gfx, animBgData.tilesOffset); LoadCompressedPalette(palette, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gTasks[taskId].data[1] = scrollSpeed; gTasks[taskId].data[4] = numFadeSteps; gTasks[taskId].data[5] = duration; gTasks[taskId].data[6] = fadeStepDelay; gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[2] = includePartner; gTasks[taskId].data[3] = newSpriteId; gTasks[taskId].func = UpdateMonScrollingBgMask; } static void UpdateMonScrollingBgMask(u8 taskId) { gTasks[taskId].data[13] += gTasks[taskId].data[1] < 0 ? -gTasks[taskId].data[1] : gTasks[taskId].data[1]; if (gTasks[taskId].data[1] < 0) gBattle_BG1_Y -= gTasks[taskId].data[13] >> 8; else gBattle_BG1_Y += gTasks[taskId].data[13] >> 8; gTasks[taskId].data[13] &= 0xFF; switch (gTasks[taskId].data[15]) { case 0: if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6]) { gTasks[taskId].data[11] = 0; ++gTasks[taskId].data[12]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); if (gTasks[taskId].data[12] == gTasks[taskId].data[4]) ++gTasks[taskId].data[15]; } break; case 1: if (++gTasks[taskId].data[10] == gTasks[taskId].data[5]) ++gTasks[taskId].data[15]; break; case 2: if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6]) { gTasks[taskId].data[11] = 0; --gTasks[taskId].data[12]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); if (gTasks[taskId].data[12] == 0) { ResetBattleAnimBg(0); gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); if (!IsContest()) { u16 bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT); ((vBgCnt *)&bg1Cnt)->charBaseBlock = 0; SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); } SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroySprite(&gSprites[gTasks[taskId].data[0]]); if (gTasks[taskId].data[2]) DestroySprite(&gSprites[gTasks[taskId].data[3]]); DestroyAnimVisualTask(taskId); } } break; } } void AnimTask_GetBattleTerrain(u8 taskId) { gBattleAnimArgs[0] = gBattleTerrain; DestroyAnimVisualTask(taskId); } void AnimTask_AllocBackupPalBuffer(u8 taskId) { gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000); DestroyAnimVisualTask(taskId); } void AnimTask_FreeBackupPalBuffer(u8 taskId) { FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer); DestroyAnimVisualTask(taskId); } void AnimTask_CopyPalUnfadedToBackup(u8 taskId) { u32 selectedPalettes; s32 paletteIndex = 0; if (gBattleAnimArgs[0] == 0) for (selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE); (selectedPalettes & 1) == 0; ++paletteIndex) selectedPalettes >>= 1; else if (gBattleAnimArgs[0] == 1) paletteIndex = gBattleAnimAttacker + 16; else if (gBattleAnimArgs[0] == 2) paletteIndex = gBattleAnimTarget + 16; memcpy(&gMonSpritesGfxPtr->multiUseBuffer[gBattleAnimArgs[1] * 16], &gPlttBufferUnfaded[PLTT_ID(paletteIndex)], PLTT_SIZE_4BPP); DestroyAnimVisualTask(taskId); } void AnimTask_CopyPalUnfadedFromBackup(u8 taskId) { u32 selectedPalettes; s32 paletteIndex = 0; if (gBattleAnimArgs[0] == 0) for (selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE); (selectedPalettes & 1) == 0; ++paletteIndex) selectedPalettes >>= 1; else if (gBattleAnimArgs[0] == 1) paletteIndex = gBattleAnimAttacker + 16; else if (gBattleAnimArgs[0] == 2) paletteIndex = gBattleAnimTarget + 16; memcpy(&gPlttBufferUnfaded[PLTT_ID(paletteIndex)], &gMonSpritesGfxPtr->multiUseBuffer[gBattleAnimArgs[1] * 16], PLTT_SIZE_4BPP); DestroyAnimVisualTask(taskId); } void AnimTask_CopyPalFadedToUnfaded(u8 taskId) { u32 selectedPalettes; s32 paletteIndex = 0; if (gBattleAnimArgs[0] == 0) for (selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE); (selectedPalettes & 1) == 0; ++paletteIndex) selectedPalettes >>= 1; else if (gBattleAnimArgs[0] == 1) paletteIndex = gBattleAnimAttacker + 16; else if (gBattleAnimArgs[0] == 2) paletteIndex = gBattleAnimTarget + 16; memcpy(&gPlttBufferUnfaded[PLTT_ID(paletteIndex)], &gPlttBufferFaded[PLTT_ID(paletteIndex)], PLTT_SIZE_4BPP); DestroyAnimVisualTask(taskId); } void AnimTask_IsContest(u8 taskId) { if (IsContest()) gBattleAnimArgs[ARG_RET_ID] = TRUE; else gBattleAnimArgs[ARG_RET_ID] = FALSE; DestroyAnimVisualTask(taskId); } void AnimTask_SetAnimAttackerAndTargetForEffectTgt(u8 taskId) { gBattleAnimAttacker = gBattlerTarget; gBattleAnimTarget = gEffectBattler; DestroyAnimVisualTask(taskId); } void AnimTask_IsTargetSameSide(u8 taskId) { if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) gBattleAnimArgs[ARG_RET_ID] = TRUE; else gBattleAnimArgs[ARG_RET_ID] = FALSE; DestroyAnimVisualTask(taskId); } void AnimTask_SetAnimTargetToBattlerTarget(u8 taskId) { gBattleAnimTarget = gBattlerTarget; DestroyAnimVisualTask(taskId); } void AnimTask_SetAnimAttackerAndTargetForEffectAtk(u8 taskId) { gBattleAnimAttacker = gBattlerAttacker; gBattleAnimTarget = gEffectBattler; DestroyAnimVisualTask(taskId); } void AnimTask_SetAttackerInvisibleWaitForSignal(u8 taskId) { if (IsContest()) { DestroyAnimVisualTask(taskId); } else { gTasks[taskId].data[0] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible; gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = 1; gTasks[taskId].func = AnimTask_WaitAndRestoreVisibility; --gAnimVisualTaskCount; } } static void AnimTask_WaitAndRestoreVisibility(u8 taskId) { if (gBattleAnimArgs[7] == 0x1000) { gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = (u8)gTasks[taskId].data[0] & 1; DestroyTask(taskId); } } ================================================ FILE: src/battle_anim_water.c ================================================ #include "global.h" #include "battle_anim.h" #include "decompress.h" #include "gpu_regs.h" #include "graphics.h" #include "palette.h" #include "pokemon.h" #include "random.h" #include "scanline_effect.h" #include "sprite.h" #include "task.h" #include "trig.h" #include "util.h" static void AnimRainDrop(struct Sprite *); static void AnimRainDrop_Step(struct Sprite *); static void AnimWaterBubbleProjectile(struct Sprite *); static void AnimWaterBubbleProjectile_Step1(struct Sprite *); static void AnimWaterBubbleProjectile_Step2(struct Sprite *); static void AnimWaterBubbleProjectile_Step3(struct Sprite *); static void AnimAuroraBeamRings(struct Sprite *); static void AnimAuroraBeamRings_Step(struct Sprite *); static void AnimToTargetInSinWave(struct Sprite *); static void AnimToTargetInSinWave_Step(struct Sprite *); static void AnimHydroCannonCharge(struct Sprite *); static void AnimHydroCannonCharge_Step(struct Sprite *); static void AnimHydroCannonBeam(struct Sprite *); static void AnimWaterGunDroplet(struct Sprite *); static void AnimSmallBubblePair(struct Sprite *); static void AnimSmallBubblePair_Step(struct Sprite *); static void AnimSmallDriftingBubbles(struct Sprite *); static void AnimSmallDriftingBubbles_Step(struct Sprite *); static void AnimSmallWaterOrb(struct Sprite *); static void AnimWaterSpoutRain(struct Sprite *); static void AnimWaterSpoutRainHit(struct Sprite *); static void AnimWaterSportDroplet(struct Sprite *); static void AnimWaterSportDroplet_Step(struct Sprite *); static void AnimWaterPulseBubble(struct Sprite *); static void AnimWaterPulseBubble_Step(struct Sprite *); static void AnimWaterPulseRingBubble(struct Sprite *); static void AnimWaterPulseRing_Step(struct Sprite *); static void AnimTask_RotateAuroraRingColors_Step(u8); static void AnimTask_RunSinAnimTimer(u8); static void AnimTask_CreateSurfWave_Step1(u8); static void AnimTask_CreateSurfWave_Step2(u8); static void AnimTask_SurfWaveScanlineEffect(u8); static void AnimTask_WaterSpoutLaunch_Step(u8); static void AnimTask_WaterSpoutRain_Step(u8); static u8 GetWaterSpoutPowerForAnim(void); static void CreateWaterSpoutLaunchDroplets(struct Task *, u8); static void CreateWaterSpoutRainDroplet(struct Task *, u8); static void AnimTask_WaterSport_Step(u8); static void CreateWaterSportDroplet(struct Task *); static void CreateWaterPulseRingBubbles(struct Sprite *, s32, s32); static const u8 sUnusedWater_Gfx[] = INCBIN_U8("graphics/battle_anims/unused/water.4bpp"); static const u8 sUnusedWater[] = INCBIN_U8("graphics/battle_anims/unused/water.bin"); static const union AnimCmd sAnim_RainDrop[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(8, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(24, 6), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(40, 2), ANIMCMD_FRAME(48, 2), ANIMCMD_END, }; static const union AnimCmd *const sAnims_RainDrop[] = { sAnim_RainDrop, }; const struct SpriteTemplate gRainDropSpriteTemplate = { .tileTag = ANIM_TAG_RAIN_DROPS, .paletteTag = ANIM_TAG_RAIN_DROPS, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = sAnims_RainDrop, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRainDrop, }; static const union AffineAnimCmd sAffineAnim_WaterBubbleProjectile[] = { AFFINEANIMCMD_FRAME(-0x5, -0x5, 0, 10), AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 10), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAffineAnims_WaterBubbleProjectile[] = { sAffineAnim_WaterBubbleProjectile, }; static const union AnimCmd sAnim_WaterBubbleProjectile[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_WaterBubbleProjectile[] = { sAnim_WaterBubbleProjectile, }; const struct SpriteTemplate gWaterBubbleProjectileSpriteTemplate = { .tileTag = ANIM_TAG_BUBBLE, .paletteTag = ANIM_TAG_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = sAnims_WaterBubbleProjectile, .images = NULL, .affineAnims = sAffineAnims_WaterBubbleProjectile, .callback = AnimWaterBubbleProjectile, }; static const union AnimCmd sAnim_AuroraBeamRing_0[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_AuroraBeamRing_1[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; static const union AnimCmd *const sAnims_AuroraBeamRing[] = { sAnim_AuroraBeamRing_0, sAnim_AuroraBeamRing_1, }; static const union AffineAnimCmd sAffineAnim_AuroraBeamRing[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), AFFINEANIMCMD_FRAME(0x60, 0x60, 0, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_AuroraBeamRing[] = { sAffineAnim_AuroraBeamRing, }; const struct SpriteTemplate gAuroraBeamRingSpriteTemplate = { .tileTag = ANIM_TAG_RAINBOW_RINGS, .paletteTag = ANIM_TAG_RAINBOW_RINGS, .oam = &gOamData_AffineDouble_ObjNormal_8x16, .anims = sAnims_AuroraBeamRing, .images = NULL, .affineAnims = sAffineAnims_AuroraBeamRing, .callback = AnimAuroraBeamRings, }; static const union AnimCmd sAnim_WaterMudOrb[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(4, 1), ANIMCMD_FRAME(8, 1), ANIMCMD_FRAME(12, 1), ANIMCMD_JUMP(0), }; const union AnimCmd *const gAnims_WaterMudOrb[] = { sAnim_WaterMudOrb, }; const struct SpriteTemplate gHydroPumpOrbSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjBlend_16x16, .anims = gAnims_WaterMudOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimToTargetInSinWave, }; const struct SpriteTemplate gMudShotOrbSpriteTemplate = { .tileTag = ANIM_TAG_BROWN_ORB, .paletteTag = ANIM_TAG_BROWN_ORB, .oam = &gOamData_AffineOff_ObjBlend_16x16, .anims = gAnims_WaterMudOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimToTargetInSinWave, }; const struct SpriteTemplate gSignalBeamRedOrbSpriteTemplate = { .tileTag = ANIM_TAG_GLOWY_RED_ORB, .paletteTag = ANIM_TAG_GLOWY_RED_ORB, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimToTargetInSinWave, }; const struct SpriteTemplate gSignalBeamGreenOrbSpriteTemplate = { .tileTag = ANIM_TAG_GLOWY_GREEN_ORB, .paletteTag = ANIM_TAG_GLOWY_GREEN_ORB, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimToTargetInSinWave, }; static const union AnimCmd sAnim_FlamethrowerFlame[] = { ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(48, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_FlamethrowerFlame[] = { sAnim_FlamethrowerFlame, }; const struct SpriteTemplate gFlamethrowerFlameSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_FlamethrowerFlame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimToTargetInSinWave, }; const struct SpriteTemplate gPsywaveRingSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_RING, .paletteTag = ANIM_TAG_BLUE_RING, .oam = &gOamData_AffineDouble_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGrowingRingAffineAnimTable, .callback = AnimToTargetInSinWave, }; static const union AffineAnimCmd sAffineAnim_HydroCannonCharge[] = { AFFINEANIMCMD_FRAME(0x3, 0x3, 10, 50), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 10), AFFINEANIMCMD_FRAME(-0x14, -0x14, -10, 20), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_HydroCannonBeam[] = { AFFINEANIMCMD_FRAME(0x150, 0x150, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_HydroCannonCharge[] = { sAffineAnim_HydroCannonCharge, }; static const union AffineAnimCmd *const sAffineAnims_HydroCannonBeam[] = { sAffineAnim_HydroCannonBeam, }; const struct SpriteTemplate gHydroCannonChargeSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_16x16, .anims = gAnims_WaterMudOrb, .images = NULL, .affineAnims = sAffineAnims_HydroCannonCharge, .callback = AnimHydroCannonCharge, }; const struct SpriteTemplate gHydroCannonBeamSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_16x16, .anims = gAnims_WaterMudOrb, .images = NULL, .affineAnims = sAffineAnims_HydroCannonBeam, .callback = AnimHydroCannonBeam, }; static const union AnimCmd sAnim_WaterBubble[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_WaterGunDroplet[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; const union AnimCmd *const gAnims_WaterBubble[] = { sAnim_WaterBubble, }; static const union AnimCmd *const sAnims_WaterGunDroplet[] = { sAnim_WaterGunDroplet, }; const struct SpriteTemplate gWaterGunProjectileSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineOff_ObjBlend_16x16, .anims = gAnims_WaterBubble, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThrowProjectile, }; const struct SpriteTemplate gWaterGunDropletSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineDouble_ObjBlend_16x16, .anims = sAnims_WaterGunDroplet, .images = NULL, .affineAnims = gAffineAnims_Droplet, .callback = AnimWaterGunDroplet, }; const struct SpriteTemplate gSmallBubblePairSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, // ice_crystals_4, which are bubbles .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gAnims_SmallBubblePair, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmallBubblePair, }; const struct SpriteTemplate gSmallDriftingBubblesSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmallDriftingBubbles, }; // Used by Water Spout / Water Sport const struct SpriteTemplate gSmallWaterOrbSpriteTemplate = { .tileTag = ANIM_TAG_GLOWY_BLUE_ORB, .paletteTag = ANIM_TAG_GLOWY_BLUE_ORB, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmallWaterOrb, }; static const union AnimCmd sAnim_WaterPulseBubble_0[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_WaterPulseBubble_1[] = { ANIMCMD_FRAME(9, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_WeatherBallWaterDown[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; static const union AnimCmd *const sAnims_WaterPulseBubble[] = { sAnim_WaterPulseBubble_0, sAnim_WaterPulseBubble_1, }; static const union AnimCmd *const sAnims_WeatherBallWaterDown[] = { sAnim_WeatherBallWaterDown, }; static const union AffineAnimCmd sAffineAnim_WaterPulseRingBubble_0[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-0xA, -0xA, 0, 15), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_WaterPulseRingBubble_1[] = { AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0), AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 15), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_WeatherBallWaterDown[] = { AFFINEANIMCMD_FRAME(0x150, 0x150, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 15), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_WaterPulseRingBubble[] = { sAffineAnim_WaterPulseRingBubble_0, sAffineAnim_WaterPulseRingBubble_1, }; static const union AffineAnimCmd *const sAffineAnims_WeatherBallWaterDown[] = { sAffineAnim_WeatherBallWaterDown, }; const struct SpriteTemplate gWaterPulseBubbleSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_WaterPulseBubble, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWaterPulseBubble, }; const struct SpriteTemplate gWaterPulseRingBubbleSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineNormal_ObjNormal_8x8, .anims = sAnims_WaterPulseBubble, .images = NULL, .affineAnims = sAffineAnims_WaterPulseRingBubble, .callback = AnimWaterPulseRingBubble, }; const struct SpriteTemplate gWeatherBallWaterDownSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = sAnims_WeatherBallWaterDown, .images = NULL, .affineAnims = sAffineAnims_WeatherBallWaterDown, .callback = AnimWeatherBallDown, }; void AnimTask_CreateRaindrops(u8 taskId) { u8 x, y; if (gTasks[taskId].data[0] == 0) { gTasks[taskId].data[1] = gBattleAnimArgs[0]; gTasks[taskId].data[2] = gBattleAnimArgs[1]; gTasks[taskId].data[3] = gBattleAnimArgs[2]; } gTasks[taskId].data[0]++; if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1) { x = Random() % DISPLAY_WIDTH; y = Random() % (DISPLAY_HEIGHT / 2); CreateSprite(&gRainDropSpriteTemplate, x, y, 4); } if (gTasks[taskId].data[0] == gTasks[taskId].data[3]) DestroyAnimVisualTask(taskId); } static void AnimRainDrop(struct Sprite *sprite) { sprite->callback = AnimRainDrop_Step; } static void AnimRainDrop_Step(struct Sprite *sprite) { if (++sprite->data[0] < 14) // Was 13 in emerald { sprite->x2 += 1; sprite->y2 += 4; } if (sprite->animEnded) { DestroySprite(sprite); } } // For water bubbles that move to a dest, as in Bubble/Bubblebeam static void AnimWaterBubbleProjectile(struct Sprite *sprite) { u8 spriteId; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; sprite->animPaused = TRUE; } else { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; sprite->animPaused = TRUE; } if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[6]; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); spriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); sprite->data[5] = spriteId; sprite->x -= Sin((u8)gBattleAnimArgs[4], gBattleAnimArgs[2]); sprite->y -= Cos((u8)gBattleAnimArgs[4], gBattleAnimArgs[3]); gSprites[spriteId].data[0] = gBattleAnimArgs[2]; gSprites[spriteId].data[1] = gBattleAnimArgs[3]; gSprites[spriteId].data[2] = gBattleAnimArgs[5]; gSprites[spriteId].data[3] = (u8)gBattleAnimArgs[4] * 256; gSprites[spriteId].data[4] = gBattleAnimArgs[6]; sprite->callback = AnimWaterBubbleProjectile_Step1; sprite->callback(sprite); } static void AnimWaterBubbleProjectile_Step1(struct Sprite *sprite) { u8 otherSpriteId = sprite->data[5]; u8 timer = gSprites[otherSpriteId].data[4]; u16 trigIndex = gSprites[otherSpriteId].data[3]; sprite->data[0] = 1; AnimTranslateLinear(sprite); sprite->x2 += Sin(trigIndex >> 8, gSprites[otherSpriteId].data[0]); sprite->y2 += Cos(trigIndex >> 8, gSprites[otherSpriteId].data[1]); gSprites[otherSpriteId].data[3] = trigIndex + gSprites[otherSpriteId].data[2]; if (--timer != 0) { gSprites[otherSpriteId].data[4] = timer; } else { sprite->callback = AnimWaterBubbleProjectile_Step2; DestroySprite(&gSprites[otherSpriteId]); } } static void AnimWaterBubbleProjectile_Step2(struct Sprite *sprite) { sprite->animPaused = FALSE; sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, AnimWaterBubbleProjectile_Step3); } static void AnimWaterBubbleProjectile_Step3(struct Sprite *sprite) { sprite->data[0] = 10; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } static void AnimAuroraBeamRings(struct Sprite *sprite) { s16 unkArg; InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) unkArg = -gBattleAnimArgs[2]; else unkArg = gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + unkArg; sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; InitAnimLinearTranslation(sprite); sprite->callback = AnimAuroraBeamRings_Step; sprite->affineAnimPaused = TRUE; sprite->callback(sprite); } static void AnimAuroraBeamRings_Step(struct Sprite *sprite) { if ((u16)gBattleAnimArgs[7] == 0xFFFF) { StartSpriteAnim(sprite, 1); sprite->affineAnimPaused = FALSE; } if (AnimTranslateLinear(sprite)) DestroyAnimSprite(sprite); } // Updates the palette on the rainbow rings used in Aurora Beam to make them appear to be rotating counterclockwise void AnimTask_RotateAuroraRingColors(u8 taskId) { gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[2] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_RAINBOW_RINGS)); gTasks[taskId].func = AnimTask_RotateAuroraRingColors_Step; } static void AnimTask_RotateAuroraRingColors_Step(u8 taskId) { int i; u16 palIndex; if (++gTasks[taskId].data[10] == 3) { u16 tempPlt; gTasks[taskId].data[10] = 0; palIndex = gTasks[taskId].data[2] + 1; tempPlt = gPlttBufferFaded[palIndex]; for (i = 1; i < 8; i++) gPlttBufferFaded[palIndex + i - 1] = gPlttBufferFaded[palIndex + i]; gPlttBufferFaded[palIndex + 7] = tempPlt; } if (++gTasks[taskId].data[11] == gTasks[taskId].data[0]) DestroyAnimVisualTask(taskId); } // For animating undulating beam attacks (e.g. Flamethrower, Hydro Pump, Signal Beam) static void AnimToTargetInSinWave(struct Sprite *sprite) { u16 retArg; InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = 30; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); sprite->data[5] = 0xD200 / sprite->data[0]; sprite->data[7] = gBattleAnimArgs[3]; retArg = gBattleAnimArgs[7]; if (gBattleAnimArgs[7] > 127) { sprite->data[6] = (retArg - 127) * 256; sprite->data[7] = -sprite->data[7]; } else { sprite->data[6] = retArg * 256; } sprite->callback = AnimToTargetInSinWave_Step; sprite->callback(sprite); } static void AnimToTargetInSinWave_Step(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) DestroyAnimSprite(sprite); sprite->y2 += Sin(sprite->data[6] >> 8, sprite->data[7]); if ((sprite->data[6] + sprite->data[5]) >> 8 > 127) { sprite->data[6] = 0; sprite->data[7] = -sprite->data[7]; } else { sprite->data[6] += sprite->data[5]; } } void AnimTask_StartSinAnimTimer(u8 taskId) { gTasks[taskId].data[0] = gBattleAnimArgs[0]; gBattleAnimArgs[7] = 0; gTasks[taskId].func = AnimTask_RunSinAnimTimer; } static void AnimTask_RunSinAnimTimer(u8 taskId) { gBattleAnimArgs[7] = (gBattleAnimArgs[7] + 3) & 0xFF; if (--gTasks[taskId].data[0] == 0) DestroyAnimVisualTask(taskId); } // Flashing blue orbs grow in size near the attacker. First stage of Hydro Cannon static void AnimHydroCannonCharge(struct Sprite *sprite) { u8 priority; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); sprite->y2 = -10; priority = GetBattlerSpriteSubpriority(gBattleAnimAttacker); if (!IsContest()) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { sprite->x2 = 10; sprite->subpriority = priority + 2; } else { sprite->x2 = -10; sprite->subpriority = priority - 2; } } else { sprite->x2 = -10; sprite->subpriority = priority + 2; } sprite->callback = AnimHydroCannonCharge_Step; } static void AnimHydroCannonCharge_Step(struct Sprite *sprite) { if (sprite->affineAnimEnded) DestroyAnimSprite(sprite); } // Flashing blue orbs move from the attacker to the target. Second stage of Hydro Cannon static void AnimHydroCannonBeam(struct Sprite *sprite) { bool8 animType; u8 coordType; if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) { gBattleAnimArgs[0] *= -1; if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_LEFT) gBattleAnimArgs[0] *= -1; } if ((gBattleAnimArgs[5] & 0xFF00) == 0) animType = TRUE; else animType = FALSE; if ((u8)gBattleAnimArgs[5] == 0) coordType = BATTLER_COORD_Y_PIC_OFFSET; else coordType = 1; InitSpritePosToAnimAttacker(sprite, animType); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, coordType) + gBattleAnimArgs[3]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // Water droplet appears and drips down. Used by Water Gun on impact static void AnimWaterGunDroplet(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = sprite->x + gBattleAnimArgs[2]; sprite->data[4] = sprite->y + gBattleAnimArgs[4]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimSmallBubblePair(struct Sprite *sprite) { if (gBattleAnimArgs[3] != ANIM_ATTACKER) InitSpritePosToAnimTarget(sprite, TRUE); else InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[7] = gBattleAnimArgs[2]; sprite->callback = AnimSmallBubblePair_Step; } static void AnimSmallBubblePair_Step(struct Sprite *sprite) { sprite->data[0] = (sprite->data[0] + 11) & 0xFF; sprite->x2 = Sin(sprite->data[0], 4); sprite->data[1] += 48; sprite->y2 = -(sprite->data[1] >> 8); if (sprite->data[7]-- == 0) DestroyAnimSprite(sprite); } void AnimTask_CreateSurfWave(u8 taskId) { struct BattleAnimBgData animBg; u8 taskId2; u16 *x, *y; //These pointers are needed to match x = &gBattle_BG1_X; y = &gBattle_BG1_Y; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1); GetBattleAnimBg1Data(&animBg); if (!IsContest()) { SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_SurfOpponent); else AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_SurfPlayer); } else { // Changed from Emerald LZDecompressVram(gBattleAnimBgTilemap_SurfContest, animBg.bgTilemap); RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 1); } AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_Surf, animBg.tilesOffset); if (gBattleAnimArgs[0] == 0) LoadCompressedPalette(gBattleAnimBgPalette_Surf, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); else LoadCompressedPalette(gBattleAnimBgPalette_MuddyWater, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); taskId2 = CreateTask(AnimTask_SurfWaveScanlineEffect, gTasks[taskId].priority + 1); gTasks[taskId].data[15] = taskId2; gTasks[taskId2].data[0] = 0; gTasks[taskId2].data[1] = 0x1000; gTasks[taskId2].data[2] = 0x1000; if (IsContest()) { *x = -80; *y = -48; gTasks[taskId].data[0] = 2; gTasks[taskId].data[1] = 1; gTasks[taskId2].data[3] = 0; } else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) { *x = -224; *y = 256; gTasks[taskId].data[0] = 2; gTasks[taskId].data[1] = -1; gTasks[taskId2].data[3] = 1; } else { *x = 0; *y = -48; gTasks[taskId].data[0] = -2; gTasks[taskId].data[1] = 1; gTasks[taskId2].data[3] = 0; } SetGpuReg(REG_OFFSET_BG1HOFS, *x); SetGpuReg(REG_OFFSET_BG1VOFS, *y); if (gTasks[taskId2].data[3] == 0) { gTasks[taskId2].data[4] = 48; gTasks[taskId2].data[5] = 112; } else { gTasks[taskId2].data[4] = 0; gTasks[taskId2].data[5] = 0; } gTasks[taskId].data[6] = 1; gTasks[taskId].func = AnimTask_CreateSurfWave_Step1; } static void AnimTask_CreateSurfWave_Step1(u8 taskId) { u16 rgbBuffer; u32 i; u16 *BGptrX, *BGptrY; struct BattleAnimBgData animBg; BGptrX = &gBattle_BG1_X; BGptrY = &gBattle_BG1_Y; *BGptrX += gTasks[taskId].data[0]; *BGptrY += gTasks[taskId].data[1]; GetBattleAnimBg1Data(&animBg); gTasks[taskId].data[2] += gTasks[taskId].data[1]; if (++gTasks[taskId].data[5] == 4) { rgbBuffer = gPlttBufferFaded[16 * animBg.paletteId + 7]; for (i = 6; i != 0; i--) // i > 0 generates the exact same code in this context { gPlttBufferFaded[16 * animBg.paletteId + 1 + i] = gPlttBufferFaded[16 * animBg.paletteId + 1 + i - 1]; // 1 + i - 1 is needed to match for some bizarre reason } gPlttBufferFaded[16 * animBg.paletteId + 1] = rgbBuffer; gTasks[taskId].data[5] = 0; } if (++gTasks[taskId].data[6] > 1) { gTasks[taskId].data[6] = 0; if (++gTasks[taskId].data[3] < 14) { gTasks[gTasks[taskId].data[15]].data[1] = (s16)((gTasks[taskId].data[3]) | ((16 - gTasks[taskId].data[3]) << 8)); gTasks[taskId].data[4]++; } if (gTasks[taskId].data[3] > 54) { gTasks[taskId].data[4]--; gTasks[gTasks[taskId].data[15]].data[1] = (s16)((gTasks[taskId].data[4]) | ((16 - gTasks[taskId].data[4]) << 8)); } } if (!(gTasks[gTasks[taskId].data[15]].data[1] & 0x1F)) { gTasks[taskId].data[0] = gTasks[gTasks[taskId].data[15]].data[1] & 0x1F; gTasks[taskId].func = AnimTask_CreateSurfWave_Step2; } } static void AnimTask_CreateSurfWave_Step2(u8 taskId) { u16 *BGptrX = &gBattle_BG1_X; u16 *BGptrY = &gBattle_BG1_Y; if (gTasks[taskId].data[0] == 0) { InitBattleAnimBg(1); InitBattleAnimBg(2); gTasks[taskId].data[0]++; } else { if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); *BGptrX = 0; *BGptrY = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); gTasks[gTasks[taskId].data[15]].data[15] = -1; DestroyAnimVisualTask(taskId); } } static void AnimTask_SurfWaveScanlineEffect(u8 taskId) { s32 i; struct ScanlineEffectParams params; struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: for (i = 0; i < task->data[4]; i++) gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; for (i = task->data[4]; i < task->data[5]; i++) gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[1]; for (i = task->data[5]; i < 160; i++) gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; if (task->data[4] == 0) gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[1]; else gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; params.dmaDest = (vu16 *)REG_ADDR_BLDALPHA; params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; params.initState = 1; params.unused9 = 0; ScanlineEffect_SetParams(params); task->data[0]++; break; case 1: if (task->data[3] == 0) { if (--task->data[4] <= 0) { task->data[4] = 0; task->data[0]++; } } else if (++task->data[5] > 111) { task->data[0]++; } for (i = 0; i < task->data[4]; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2]; for (i = task->data[4]; i < task->data[5]; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[1]; for (i = task->data[5]; i < 160; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2]; break; case 2: for (i = 0; i < task->data[4]; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2]; for (i = task->data[4]; i < task->data[5]; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[1]; for (i = task->data[5]; i < 160; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2]; if (task->data[15] == -1) { ScanlineEffect_Stop(); DestroyTask(taskId); } break; } } static void AnimSmallDriftingBubbles(struct Sprite *sprite) { s16 randData; s16 randData2; sprite->oam.tileNum += 8; InitSpritePosToAnimTarget(sprite, TRUE); randData = (Random() & 0xFF) | 256; randData2 = (Random() & 0x1FF); if (randData2 > 255) randData2 = 256 - randData2; sprite->data[1] = randData; sprite->data[2] = randData2; sprite->callback = AnimSmallDriftingBubbles_Step; } static void AnimSmallDriftingBubbles_Step(struct Sprite *sprite) { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; if (sprite->data[1] & 1) sprite->x2 = -(sprite->data[3] >> 8); else sprite->x2 = sprite->data[3] >> 8; sprite->y2 = sprite->data[4] >> 8; if (++sprite->data[0] == 21) DestroyAnimSprite(sprite); } void AnimTask_WaterSpoutLaunch(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[5] = gSprites[task->data[15]].y; task->data[1] = GetWaterSpoutPowerForAnim(); PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL); task->func = AnimTask_WaterSpoutLaunch_Step; } static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x100, 0x100, 224, 0x200, 32); task->data[0]++; case 1: if (++task->data[3] > 1) { task->data[3] = 0; if (++task->data[4] & 1) { gSprites[task->data[15]].x2 = 3; gSprites[task->data[15]].y++; } else { gSprites[task->data[15]].x2 = -3; } } if (BattleAnimHelper_RunSpriteSquash(task) == 0) { SetBattlerSpriteYOffsetFromYScale(task->data[15]); gSprites[task->data[15]].x2 = 0; task->data[3] = 0; task->data[4] = 0; task->data[0]++; } break; case 2: if (++task->data[3] > 4) { BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 224, 0x200, 384, 224, 8); task->data[3] = 0; task->data[0]++; } break; case 3: if (BattleAnimHelper_RunSpriteSquash(task) == 0) { task->data[3] = 0; task->data[4] = 0; task->data[0]++; } break; case 4: CreateWaterSpoutLaunchDroplets(task, taskId); task->data[0]++; case 5: if (++task->data[3] > 1) { task->data[3] = 0; if (++task->data[4] & 1) gSprites[task->data[15]].y2 += 2; else gSprites[task->data[15]].y2 -= 2; if (task->data[4] == 10) { BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 384, 224, 0x100, 0x100, 8); task->data[3] = 0; task->data[4] = 0; task->data[0]++; } } break; case 6: gSprites[task->data[15]].y--; if (BattleAnimHelper_RunSpriteSquash(task) == 0) { ResetSpriteRotScale(task->data[15]); gSprites[task->data[15]].y = task->data[5]; task->data[4] = 0; task->data[0]++; } break; case 7: if (task->data[2] == 0) DestroyAnimVisualTask(taskId); break; } } // Returns a value 0-3 relative to which quarter HP the attacker is in // A higher number results in more water sprites during the Water Spout animation static u8 GetWaterSpoutPowerForAnim(void) { u32 i; u16 hp; u16 maxhp; u16 partyIndex; struct Pokemon *slot; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker]; slot = &gPlayerParty[partyIndex]; maxhp = GetMonData(slot, MON_DATA_MAX_HP); hp = GetMonData(slot, MON_DATA_HP); maxhp /= 4; } else { partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker]; slot = &gEnemyParty[partyIndex]; maxhp = GetMonData(slot, MON_DATA_MAX_HP); hp = GetMonData(slot, MON_DATA_HP); maxhp /= 4; } for (i = 0; i < 3; i++) { if (hp < maxhp * (i + 1)) return i; } return 3; } static void CreateWaterSpoutLaunchDroplets(struct Task *task, u8 taskId) { s32 i; s16 attackerCoordX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); s16 attackerCoordY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); s16 trigIndex = 172; u8 subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1; s16 increment = 4 - task->data[1]; u8 spriteId; if (increment <= 0) increment = 1; for (i = 0; i < 20; i += increment) { spriteId = CreateSprite(&gSmallWaterOrbSpriteTemplate, attackerCoordX, attackerCoordY, subpriority); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[1] = i; gSprites[spriteId].data[2] = attackerCoordX * 16; gSprites[spriteId].data[3] = attackerCoordY * 16; gSprites[spriteId].data[4] = Cos(trigIndex, 64); gSprites[spriteId].data[5] = Sin(trigIndex, 64); gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 2; if (task->data[2] & 1) AnimSmallWaterOrb(&gSprites[spriteId]); task->data[2]++; } trigIndex = (trigIndex + increment * 2); trigIndex &= 0xFF; } } static void AnimSmallWaterOrb(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->data[4] += (sprite->data[1] % 6) * 3; sprite->data[5] += (sprite->data[1] % 3) * 3; sprite->data[0]++; case 1: sprite->data[2] += sprite->data[4]; sprite->data[3] += sprite->data[5]; sprite->x = sprite->data[2] >> 4; sprite->y = sprite->data[3] >> 4; if (sprite->x < -8 || sprite->x > 248 || sprite->y < -8 || sprite->y > 120) { gTasks[sprite->data[6]].data[sprite->data[7]]--; DestroySprite(sprite); } break; } } void AnimTask_WaterSpoutRain(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[1] = GetWaterSpoutPowerForAnim(); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { task->data[4] = 136; task->data[6] = 40; } else { task->data[4] = 16; task->data[6] = 80; } task->data[5] = 98; task->data[7] = task->data[4] + 49; task->data[12] = task->data[1] * 5 + 5; task->func = AnimTask_WaterSpoutRain_Step; } static void AnimTask_WaterSpoutRain_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; u8 taskId2; switch (task->data[0]) { case 0: if (++task->data[2] > 2) { task->data[2] = 0; CreateWaterSpoutRainDroplet(task, taskId); } if (task->data[10] != 0 && task->data[13] == 0) { gBattleAnimArgs[0] = ANIM_TARGET; gBattleAnimArgs[1] = 0; gBattleAnimArgs[2] = 12; taskId2 = CreateTask(AnimTask_HorizontalShake, 80); if (taskId2 != 0xFF) { gTasks[taskId2].func(taskId2); gAnimVisualTaskCount++; } gBattleAnimArgs[0] = ANIM_DEF_PARTNER; taskId2 = CreateTask(AnimTask_HorizontalShake, 80); if (taskId2 != 0xFF) { gTasks[taskId2].func(taskId2); gAnimVisualTaskCount++; } task->data[13] = 1; } if (task->data[11] >= task->data[12]) task->data[0]++; break; case 1: if (task->data[9] == 0) DestroyAnimVisualTask(taskId); break; } } static void CreateWaterSpoutRainDroplet(struct Task *task, u8 taskId) { u16 yPosArg = ((gSineTable[task->data[8]] + 3) >> 4) + task->data[6]; u8 spriteId = CreateSprite(&gSmallWaterOrbSpriteTemplate, task->data[7], 0, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].callback = AnimWaterSpoutRain; gSprites[spriteId].data[5] = yPosArg; gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 9; task->data[9]++; } task->data[11]++; task->data[8] = (task->data[8] + 39) & 0xFF; task->data[7] = (ISO_RANDOMIZE2(task->data[7]) % task->data[5]) + task->data[4]; } static void AnimWaterSpoutRain(struct Sprite *sprite) { if (sprite->data[0] == 0) { sprite->y += 8; if (sprite->y >= sprite->data[5]) { gTasks[sprite->data[6]].data[10] = 1; sprite->data[1] = CreateSprite(&gWaterHitSplatSpriteTemplate, sprite->x, sprite->y, 1); if (sprite->data[1] != MAX_SPRITES) { StartSpriteAffineAnim(&gSprites[sprite->data[1]], 3); gSprites[sprite->data[1]].data[6] = sprite->data[6]; gSprites[sprite->data[1]].data[7] = sprite->data[7]; gSprites[sprite->data[1]].callback = AnimWaterSpoutRainHit; } DestroySprite(sprite); } } } static void AnimWaterSpoutRainHit(struct Sprite *sprite) { if (++sprite->data[1] > 1) { sprite->data[1] = 0; sprite->invisible ^= 1; if (++sprite->data[2] == 12) { gTasks[sprite->data[6]].data[sprite->data[7]]--; FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } } } void AnimTask_WaterSport(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); task->data[7] = (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) ? 1 : -1; if (IsContest()) task->data[7] *= -1; task->data[5] = task->data[3] + task->data[7] * 8; task->data[6] = task->data[4] - task->data[7] * 8; task->data[9] = -32; task->data[1] = 0; task->data[0] = 0; task->func = AnimTask_WaterSport_Step; } static void AnimTask_WaterSport_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: CreateWaterSportDroplet(task); if (task->data[10] != 0) task->data[0]++; break; case 1: CreateWaterSportDroplet(task); if (++task->data[1] > 16) { task->data[1] = 0; task->data[0]++; } break; case 2: CreateWaterSportDroplet(task); task->data[5] += task->data[7] * 6; if (!(task->data[5] >= -16 && task->data[5] <= 256)) { if (++task->data[12] > 2) { task->data[13] = 1; task->data[0] = 6; task->data[1] = 0; } else { task->data[1] = 0; task->data[0]++; } } break; case 3: CreateWaterSportDroplet(task); task->data[6] -= task->data[7] * 2; if (++task->data[1] > 7) task->data[0]++; break; case 4: CreateWaterSportDroplet(task); task->data[5] -= task->data[7] * 6; if (!(task->data[5] >= -16 && task->data[5] <= 256)) { task->data[12]++; task->data[1] = 0; task->data[0]++; } break; case 5: CreateWaterSportDroplet(task); task->data[6] -= task->data[7] * 2; if (++task->data[1] > 7) task->data[0] = 2; break; case 6: if (task->data[8] == 0) task->data[0]++; break; default: DestroyAnimVisualTask(taskId); break; } } static void CreateWaterSportDroplet(struct Task *task) { u8 spriteId; if (++task->data[2] > 1) { task->data[2] = 0; spriteId = CreateSprite(&gSmallWaterOrbSpriteTemplate, task->data[3], task->data[4], 10); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[0] = 16; gSprites[spriteId].data[2] = task->data[5]; gSprites[spriteId].data[4] = task->data[6]; gSprites[spriteId].data[5] = task->data[9]; InitAnimArcTranslation(&gSprites[spriteId]); gSprites[spriteId].callback = AnimWaterSportDroplet; task->data[8]++; } } } static void AnimWaterSportDroplet(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->data[0] = 6; sprite->data[2] = (Random() & 0x1F) - 16 + sprite->x; sprite->data[4] = (Random() & 0x1F) - 16 + sprite->y; sprite->data[5] = ~(Random() & 7); InitAnimArcTranslation(sprite); sprite->callback = AnimWaterSportDroplet_Step; } } static void AnimWaterSportDroplet_Step(struct Sprite *sprite) { u32 i; if (TranslateAnimHorizontalArc(sprite)) { for (i = 0; i < NUM_TASKS; i++) { if (gTasks[i].func == AnimTask_WaterSport_Step) { gTasks[i].data[10] = 1; gTasks[i].data[8]--; DestroySprite(sprite); } } } } static void AnimWaterPulseBubble(struct Sprite *sprite) { sprite->x = gBattleAnimArgs[0]; sprite->y = gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[4]; sprite->data[3] = gBattleAnimArgs[5]; sprite->callback = AnimWaterPulseBubble_Step; } static void AnimWaterPulseBubble_Step(struct Sprite *sprite) { sprite->data[4] -= sprite->data[0]; sprite->y2 = sprite->data[4] / 10; sprite->data[5] = (sprite->data[5] + sprite->data[1]) & 0xFF; sprite->x2 = Sin(sprite->data[5], sprite->data[2]); if (--sprite->data[3] == 0) DestroyAnimSprite(sprite); } static void AnimWaterPulseRingBubble(struct Sprite *sprite) { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; sprite->x2 = sprite->data[3] >> 7; sprite->y2 = sprite->data[4] >> 7; if (--sprite->data[0] == 0) { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } void AnimWaterPulseRing(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[3] = gBattleAnimArgs[2]; sprite->data[4] = gBattleAnimArgs[3]; sprite->callback = AnimWaterPulseRing_Step; } static void AnimWaterPulseRing_Step(struct Sprite *sprite) { int xDiff = sprite->data[1] - sprite->x; int yDiff = sprite->data[2] - sprite->y; sprite->x2 = (sprite->data[0] * xDiff) / sprite->data[3]; sprite->y2 = (sprite->data[0] * yDiff) / sprite->data[3]; if (++sprite->data[5] == sprite->data[4]) { sprite->data[5] = 0; CreateWaterPulseRingBubbles(sprite, xDiff, yDiff); } if (sprite->data[3] == sprite->data[0]) DestroyAnimSprite(sprite); sprite->data[0]++; } static void CreateWaterPulseRingBubbles(struct Sprite *sprite, s32 xDiff, s32 yDiff) { s16 combinedX, combinedY; s16 i, something; s16 unusedVar = 1; //unusedVar is needed to match s16 somethingRandomX, somethingRandomY; u8 spriteId; something = sprite->data[0] / 2; combinedX = sprite->x + sprite->x2; combinedY = sprite->y + sprite->y2; if (yDiff < 0) unusedVar *= -1; //Needed to Match somethingRandomY = yDiff + (Random() % 10) - 5; somethingRandomX = -xDiff + (Random() % 10) - 5; for (i = 0; i < 1; i++) { spriteId = CreateSprite(&gWaterPulseRingBubbleSpriteTemplate, combinedX, combinedY + something, 130); gSprites[spriteId].data[0] = 20; gSprites[spriteId].data[1] = somethingRandomY; gSprites[spriteId].subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1; if (somethingRandomX < 0) { gSprites[spriteId].data[2] = -somethingRandomX; } else { gSprites[spriteId].data[2] = somethingRandomX; } } for (i = 0; i < 1; i++) { spriteId = CreateSprite(&gWaterPulseRingBubbleSpriteTemplate, combinedX, combinedY - something, 130); gSprites[spriteId].data[0] = 20; gSprites[spriteId].data[1] = somethingRandomY; gSprites[spriteId].subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1; if (somethingRandomX > 0) { gSprites[spriteId].data[2] = -somethingRandomX; } else { gSprites[spriteId].data[2] = somethingRandomX; } } } ================================================ FILE: src/battle_bg.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_bg.h" #include "battle_message.h" #include "decompress.h" #include "event_data.h" #include "graphics.h" #include "link.h" #include "new_menu_helpers.h" #include "overworld.h" #include "text_window.h" #include "trig.h" #include "constants/maps.h" #include "constants/songs.h" #include "constants/trainers.h" #define TAG_VS_LETTERS 10000 struct BattleBackground { const void *tileset; const void *tilemap; const void *entryTileset; const void *entryTilemap; const void *palette; }; static void CB2_unused(void); static u8 GetBattleTerrainOverride(void); static const u8 sUnused[] = {1, 2}; static const struct OamData sVsLetter_V_OamData = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 0, .paletteNum = 0, .affineParam = 0 }; static const struct OamData sVsLetter_S_OamData = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0x040, .priority = 0, .paletteNum = 0, .affineParam = 0 }; static const union AffineAnimCmd sVsLetterAffineAnimCmds0[] = { AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sVsLetterAffineAnimCmds1[] = { AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), AFFINEANIMCMD_FRAME(0x18, 0x18, 0x0, 0x80), AFFINEANIMCMD_FRAME(0x18, 0x18, 0x0, 0x80), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sVsLetterAffineAnimTable[] = { sVsLetterAffineAnimCmds0, sVsLetterAffineAnimCmds1 }; static const struct SpriteTemplate sVsLetter_V_SpriteTemplate = { .tileTag = TAG_VS_LETTERS, .paletteTag = TAG_VS_LETTERS, .oam = &sVsLetter_V_OamData, .anims = gDummySpriteAnimTable, .affineAnims = sVsLetterAffineAnimTable, .callback = SpriteCB_VsLetterDummy }; static const struct SpriteTemplate sVsLetter_S_SpriteTemplate = { .tileTag = TAG_VS_LETTERS, .paletteTag = TAG_VS_LETTERS, .oam = &sVsLetter_S_OamData, .anims = gDummySpriteAnimTable, .affineAnims = sVsLetterAffineAnimTable, .callback = SpriteCB_VsLetterDummy }; static const struct CompressedSpriteSheet sVsLettersSpriteSheet = { gVsLettersGfx, 0x1000, TAG_VS_LETTERS }; const struct BgTemplate gBattleBgTemplates[4] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 24, .screenSize = 2, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 1, .mapBaseIndex = 28, .screenSize = 2, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 1, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 2, .mapBaseIndex = 26, .screenSize = 1, .paletteMode = 0, .priority = 3, .baseTile = 0x000 } }; static const struct WindowTemplate sStandardBattleWindowTemplates[] = { [B_WIN_MSG] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 15, .width = 28, .height = 4, .paletteNum = 0, .baseBlock = 0x090 }, [B_WIN_ACTION_PROMPT] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 35, .width = 14, .height = 4, .paletteNum = 0, .baseBlock = 0x1c0 }, [B_WIN_ACTION_MENU] = { .bg = 0, .tilemapLeft = 17, .tilemapTop = 35, .width = 12, .height = 4, .paletteNum = 5, .baseBlock = 0x190 }, [B_WIN_MOVE_NAME_1] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 55, .width = 8, .height = 2, .paletteNum = 5, .baseBlock = 0x300 }, [B_WIN_MOVE_NAME_2] = { .bg = 0, .tilemapLeft = 11, .tilemapTop = 55, .width = 8, .height = 2, .paletteNum = 5, .baseBlock = 0x310 }, [B_WIN_MOVE_NAME_3] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 57, .width = 8, .height = 2, .paletteNum = 5, .baseBlock = 0x320 }, [B_WIN_MOVE_NAME_4] = { .bg = 0, .tilemapLeft = 11, .tilemapTop = 57, .width = 8, .height = 2, .paletteNum = 5, .baseBlock = 0x330 }, [B_WIN_PP] = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 55, .width = 3, .height = 2, .paletteNum = 5, .baseBlock = 0x290 }, [B_WIN_MOVE_TYPE] = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 57, .width = 8, .height = 2, .paletteNum = 5, .baseBlock = 0x296 }, [B_WIN_PP_REMAINING] = { .bg = 0, .tilemapLeft = 24, .tilemapTop = 55, .width = 5, .height = 2, .paletteNum = 5, .baseBlock = 0x2a6 }, [B_WIN_DUMMY] = { .bg = 0, .tilemapLeft = 25, .tilemapTop = 57, .width = 0, .height = 0, .paletteNum = 5, .baseBlock = 0x2b0 }, [B_WIN_SWITCH_PROMPT] = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 55, .width = 8, .height = 4, .paletteNum = 5, .baseBlock = 0x2b0 }, [B_WIN_LEVEL_UP_BOX] = { .bg = 1, .tilemapLeft = 19, .tilemapTop = 8, .width = 10, .height = 11, .paletteNum = 5, .baseBlock = 0x100 }, [B_WIN_LEVEL_UP_BANNER] = { .bg = 2, .tilemapLeft = 18, .tilemapTop = 0, .width = 12, .height = 3, .paletteNum = 6, .baseBlock = 0x16e }, [B_WIN_YESNO] = { .bg = 0, .tilemapLeft = 25, .tilemapTop = 9, .width = 4, .height = 4, .paletteNum = 5, .baseBlock = 0x100 }, [B_WIN_VS_PLAYER] = { .bg = 1, .tilemapLeft = 2, .tilemapTop = 3, .width = 7, .height = 2, .paletteNum = 5, .baseBlock = 0x020 }, [B_WIN_VS_OPPONENT] = { .bg = 2, .tilemapLeft = 2, .tilemapTop = 3, .width = 7, .height = 2, .paletteNum = 5, .baseBlock = 0x040 }, [B_WIN_VS_MULTI_PLAYER_1] = { .bg = 1, .tilemapLeft = 2, .tilemapTop = 2, .width = 7, .height = 2, .paletteNum = 5, .baseBlock = 0x020 }, [B_WIN_VS_MULTI_PLAYER_2] = { .bg = 2, .tilemapLeft = 2, .tilemapTop = 2, .width = 7, .height = 2, .paletteNum = 5, .baseBlock = 0x040 }, [B_WIN_VS_MULTI_PLAYER_3] = { .bg = 1, .tilemapLeft = 2, .tilemapTop = 6, .width = 7, .height = 2, .paletteNum = 5, .baseBlock = 0x060 }, [B_WIN_VS_MULTI_PLAYER_4] = { .bg = 2, .tilemapLeft = 2, .tilemapTop = 6, .width = 7, .height = 2, .paletteNum = 5, .baseBlock = 0x080 }, [B_WIN_VS_OUTCOME_DRAW] = { .bg = 0, .tilemapLeft = 11, .tilemapTop = 2, .width = 8, .height = 2, .paletteNum = 0, .baseBlock = 0x0a0 }, [B_WIN_VS_OUTCOME_LEFT] = { .bg = 0, .tilemapLeft = 4, .tilemapTop = 2, .width = 8, .height = 2, .paletteNum = 0, .baseBlock = 0x0a0 }, [B_WIN_VS_OUTCOME_RIGHT] = { .bg = 0, .tilemapLeft = 19, .tilemapTop = 2, .width = 8, .height = 2, .paletteNum = 0, .baseBlock = 0x0b0 }, [B_WIN_OAK_OLD_MAN] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 7, .baseBlock = 0x090 }, DUMMY_WIN_TEMPLATE }; static const u32 sBattleTerrainPalette_Grass[] = INCBIN_U32("graphics/battle_terrain/grass/terrain.gbapal.lz"); static const u32 sBattleTerrainTiles_Grass[] = INCBIN_U32("graphics/battle_terrain/grass/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_Grass[] = INCBIN_U32("graphics/battle_terrain/grass/terrain.bin.lz"); static const u32 sBattleTerrainAnimTiles_Grass[] = INCBIN_U32("graphics/battle_terrain/grass/anim.4bpp.lz"); static const u32 sBattleTerrainAnimTilemap_Grass[] = INCBIN_U32("graphics/battle_terrain/grass/anim.bin.lz"); static const u32 sBattleTerrainPalette_LongGrass[] = INCBIN_U32("graphics/battle_terrain/longgrass/terrain.gbapal.lz"); static const u32 sBattleTerrainTiles_LongGrass[] = INCBIN_U32("graphics/battle_terrain/longgrass/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_LongGrass[] = INCBIN_U32("graphics/battle_terrain/longgrass/terrain.bin.lz"); static const u32 sBattleTerrainAnimTiles_LongGrass[] = INCBIN_U32("graphics/battle_terrain/longgrass/anim.4bpp.lz"); static const u32 sBattleTerrainAnimTilemap_LongGrass[] = INCBIN_U32("graphics/battle_terrain/longgrass/anim.bin.lz"); static const u32 sBattleTerrainPalette_Sand[] = INCBIN_U32("graphics/battle_terrain/sand/terrain.gbapal.lz"); static const u32 sBattleTerrainTiles_Sand[] = INCBIN_U32("graphics/battle_terrain/sand/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_Sand[] = INCBIN_U32("graphics/battle_terrain/sand/terrain.bin.lz"); static const u32 sBattleTerrainAnimTiles_Sand[] = INCBIN_U32("graphics/battle_terrain/sand/anim.4bpp.lz"); static const u32 sBattleTerrainAnimTilemap_Sand[] = INCBIN_U32("graphics/battle_terrain/sand/anim.bin.lz"); static const u32 sBattleTerrainPalette_Underwater[] = INCBIN_U32("graphics/battle_terrain/underwater/terrain.gbapal.lz"); static const u32 sBattleTerrainTiles_Underwater[] = INCBIN_U32("graphics/battle_terrain/underwater/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_Underwater[] = INCBIN_U32("graphics/battle_terrain/underwater/terrain.bin.lz"); static const u32 sBattleTerrainAnimTiles_Underwater[] = INCBIN_U32("graphics/battle_terrain/underwater/anim.4bpp.lz"); static const u32 sBattleTerrainAnimTilemap_Underwater[] = INCBIN_U32("graphics/battle_terrain/underwater/anim.bin.lz"); static const u32 sBattleTerrainPalette_Water[] = INCBIN_U32("graphics/battle_terrain/water/terrain.gbapal.lz"); static const u32 sBattleTerrainTiles_Water[] = INCBIN_U32("graphics/battle_terrain/water/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_Water[] = INCBIN_U32("graphics/battle_terrain/water/terrain.bin.lz"); static const u32 sBattleTerrainAnimTiles_Water[] = INCBIN_U32("graphics/battle_terrain/water/anim.4bpp.lz"); static const u32 sBattleTerrainAnimTilemap_Water[] = INCBIN_U32("graphics/battle_terrain/water/anim.bin.lz"); static const u32 sBattleTerrainPalette_Pond[] = INCBIN_U32("graphics/battle_terrain/pond/terrain.gbapal.lz"); static const u32 sBattleTerrainTiles_Pond[] = INCBIN_U32("graphics/battle_terrain/pond/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_Pond[] = INCBIN_U32("graphics/battle_terrain/pond/terrain.bin.lz"); static const u32 sBattleTerrainAnimTiles_Pond[] = INCBIN_U32("graphics/battle_terrain/pond/anim.4bpp.lz"); static const u32 sBattleTerrainAnimTilemap_Pond[] = INCBIN_U32("graphics/battle_terrain/pond/anim.bin.lz"); static const u32 sBattleTerrainPalette_Mountain[] = INCBIN_U32("graphics/battle_terrain/mountain/terrain.gbapal.lz"); static const u32 sBattleTerrainTiles_Mountain[] = INCBIN_U32("graphics/battle_terrain/mountain/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_Mountain[] = INCBIN_U32("graphics/battle_terrain/mountain/terrain.bin.lz"); static const u32 sBattleTerrainAnimTiles_Mountain[] = INCBIN_U32("graphics/battle_terrain/mountain/anim.4bpp.lz"); static const u32 sBattleTerrainAnimTilemap_Mountain[] = INCBIN_U32("graphics/battle_terrain/mountain/anim.bin.lz"); static const u32 sBattleTerrainPalette_Cave[] = INCBIN_U32("graphics/battle_terrain/cave/terrain.gbapal.lz"); static const u32 sBattleTerrainTiles_Cave[] = INCBIN_U32("graphics/battle_terrain/cave/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_Cave[] = INCBIN_U32("graphics/battle_terrain/cave/terrain.bin.lz"); static const u32 sBattleTerrainAnimTiles_Cave[] = INCBIN_U32("graphics/battle_terrain/cave/anim.4bpp.lz"); static const u32 sBattleTerrainAnimTilemap_Cave[] = INCBIN_U32("graphics/battle_terrain/cave/anim.bin.lz"); static const u32 sBattleTerrainPalette_Building[] = INCBIN_U32("graphics/battle_terrain/building/terrain.gbapal.lz"); static const u32 sBattleTerrainTiles_Building[] = INCBIN_U32("graphics/battle_terrain/building/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_Building[] = INCBIN_U32("graphics/battle_terrain/building/terrain.bin.lz"); static const u32 sBattleTerrainAnimTiles_Building[] = INCBIN_U32("graphics/battle_terrain/building/anim.4bpp.lz"); static const u32 sBattleTerrainAnimTilemap_Building[] = INCBIN_U32("graphics/battle_terrain/building/anim.bin.lz"); static const u32 sBattleTerrainPalette_Link[] = INCBIN_U32("graphics/battle_terrain/indoor/link.gbapal.lz"); static const u32 sBattleTerrainPalette_Gym[] = INCBIN_U32("graphics/battle_terrain/indoor/gym.gbapal.lz"); static const u32 sBattleTerrainPalette_Leader[] = INCBIN_U32("graphics/battle_terrain/indoor/leader.gbapal.lz"); static const u32 sBattleTerrainPalette_Indoor2[] = INCBIN_U32("graphics/battle_terrain/indoor/2.gbapal.lz"); static const u32 sBattleTerrainPalette_Indoor1[] = INCBIN_U32("graphics/battle_terrain/indoor/1.gbapal.lz"); static const u32 sBattleTerrainPalette_Lorelei[] = INCBIN_U32("graphics/battle_terrain/indoor/lorelei.gbapal.lz"); static const u32 sBattleTerrainPalette_Bruno[] = INCBIN_U32("graphics/battle_terrain/indoor/bruno.gbapal.lz"); static const u32 sBattleTerrainPalette_Agatha[] = INCBIN_U32("graphics/battle_terrain/indoor/agatha.gbapal.lz"); static const u32 sBattleTerrainPalette_Lance[] = INCBIN_U32("graphics/battle_terrain/indoor/lance.gbapal.lz"); static const u32 sBattleTerrainPalette_Champion[] = INCBIN_U32("graphics/battle_terrain/indoor/champion.gbapal.lz"); static const u32 sBattleTerrainPalette_Plain[] = INCBIN_U32("graphics/battle_terrain/indoor/plain.gbapal.lz"); static const u32 sBattleTerrainTiles_Indoor[] = INCBIN_U32("graphics/battle_terrain/indoor/terrain.4bpp.lz"); static const u32 sBattleTerrainTilemap_Indoor[] = INCBIN_U32("graphics/battle_terrain/indoor/terrain.bin.lz"); static const struct BattleBackground sBattleTerrainTable[] = { [BATTLE_TERRAIN_GRASS] = { .tileset = sBattleTerrainTiles_Grass, .tilemap = sBattleTerrainTilemap_Grass, .entryTileset = sBattleTerrainAnimTiles_Grass, .entryTilemap = sBattleTerrainAnimTilemap_Grass, .palette = sBattleTerrainPalette_Grass }, [BATTLE_TERRAIN_LONG_GRASS] = { .tileset = sBattleTerrainTiles_LongGrass, .tilemap = sBattleTerrainTilemap_LongGrass, .entryTileset = sBattleTerrainAnimTiles_LongGrass, .entryTilemap = sBattleTerrainAnimTilemap_LongGrass, .palette = sBattleTerrainPalette_LongGrass }, [BATTLE_TERRAIN_SAND] = { .tileset = sBattleTerrainTiles_Sand, .tilemap = sBattleTerrainTilemap_Sand, .entryTileset = sBattleTerrainAnimTiles_Sand, .entryTilemap = sBattleTerrainAnimTilemap_Sand, .palette = sBattleTerrainPalette_Sand }, [BATTLE_TERRAIN_UNDERWATER] = { .tileset = sBattleTerrainTiles_Underwater, .tilemap = sBattleTerrainTilemap_Underwater, .entryTileset = sBattleTerrainAnimTiles_Underwater, .entryTilemap = sBattleTerrainAnimTilemap_Underwater, .palette = sBattleTerrainPalette_Underwater }, [BATTLE_TERRAIN_WATER] = { .tileset = sBattleTerrainTiles_Water, .tilemap = sBattleTerrainTilemap_Water, .entryTileset = sBattleTerrainAnimTiles_Water, .entryTilemap = sBattleTerrainAnimTilemap_Water, .palette = sBattleTerrainPalette_Water }, [BATTLE_TERRAIN_POND] = { .tileset = sBattleTerrainTiles_Pond, .tilemap = sBattleTerrainTilemap_Pond, .entryTileset = sBattleTerrainAnimTiles_Pond, .entryTilemap = sBattleTerrainAnimTilemap_Pond, .palette = sBattleTerrainPalette_Pond }, [BATTLE_TERRAIN_MOUNTAIN] = { .tileset = sBattleTerrainTiles_Mountain, .tilemap = sBattleTerrainTilemap_Mountain, .entryTileset = sBattleTerrainAnimTiles_Mountain, .entryTilemap = sBattleTerrainAnimTilemap_Mountain, .palette = sBattleTerrainPalette_Mountain }, [BATTLE_TERRAIN_CAVE] = { .tileset = sBattleTerrainTiles_Cave, .tilemap = sBattleTerrainTilemap_Cave, .entryTileset = sBattleTerrainAnimTiles_Cave, .entryTilemap = sBattleTerrainAnimTilemap_Cave, .palette = sBattleTerrainPalette_Cave }, [BATTLE_TERRAIN_BUILDING] = { .tileset = sBattleTerrainTiles_Building, .tilemap = sBattleTerrainTilemap_Building, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Building }, [BATTLE_TERRAIN_PLAIN] = { .tileset = sBattleTerrainTiles_Building, .tilemap = sBattleTerrainTilemap_Building, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Plain }, [BATTLE_TERRAIN_LINK] = { .tileset = sBattleTerrainTiles_Building, .tilemap = sBattleTerrainTilemap_Building, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Link }, [BATTLE_TERRAIN_GYM] = { .tileset = sBattleTerrainTiles_Building, .tilemap = sBattleTerrainTilemap_Building, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Gym }, [BATTLE_TERRAIN_LEADER] = { .tileset = sBattleTerrainTiles_Building, .tilemap = sBattleTerrainTilemap_Building, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Leader }, [BATTLE_TERRAIN_INDOOR_2] = { .tileset = sBattleTerrainTiles_Indoor, .tilemap = sBattleTerrainTilemap_Indoor, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Indoor2 }, [BATTLE_TERRAIN_INDOOR_1] = { .tileset = sBattleTerrainTiles_Indoor, .tilemap = sBattleTerrainTilemap_Indoor, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Indoor1 }, [BATTLE_TERRAIN_LORELEI] = { .tileset = sBattleTerrainTiles_Indoor, .tilemap = sBattleTerrainTilemap_Indoor, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Lorelei }, [BATTLE_TERRAIN_BRUNO] = { .tileset = sBattleTerrainTiles_Indoor, .tilemap = sBattleTerrainTilemap_Indoor, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Bruno }, [BATTLE_TERRAIN_AGATHA] = { .tileset = sBattleTerrainTiles_Indoor, .tilemap = sBattleTerrainTilemap_Indoor, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Agatha }, [BATTLE_TERRAIN_LANCE] = { .tileset = sBattleTerrainTiles_Indoor, .tilemap = sBattleTerrainTilemap_Indoor, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Lance }, [BATTLE_TERRAIN_CHAMPION] = { .tileset = sBattleTerrainTiles_Indoor, .tilemap = sBattleTerrainTilemap_Indoor, .entryTileset = sBattleTerrainAnimTiles_Building, .entryTilemap = sBattleTerrainAnimTilemap_Building, .palette = sBattleTerrainPalette_Champion } }; static const struct { u8 mapScene; u8 battleTerrain; } sMapBattleSceneMapping[] = { {MAP_BATTLE_SCENE_GYM, BATTLE_TERRAIN_GYM}, {MAP_BATTLE_SCENE_INDOOR_1, BATTLE_TERRAIN_INDOOR_1}, {MAP_BATTLE_SCENE_INDOOR_2, BATTLE_TERRAIN_INDOOR_2}, {MAP_BATTLE_SCENE_LORELEI, BATTLE_TERRAIN_LORELEI}, {MAP_BATTLE_SCENE_BRUNO, BATTLE_TERRAIN_BRUNO}, {MAP_BATTLE_SCENE_AGATHA, BATTLE_TERRAIN_AGATHA}, {MAP_BATTLE_SCENE_LANCE, BATTLE_TERRAIN_LANCE}, {MAP_BATTLE_SCENE_LINK, BATTLE_TERRAIN_LINK} }; // Unused void CreateUnknownDebugSprite(void) { u8 spriteId; ResetSpriteData(); spriteId = CreateSprite(&gUnknownDebugSprite, 0, 0, 0); gSprites[spriteId].invisible = TRUE; SetMainCallback2(CB2_unused); } static void CB2_unused(void) { AnimateSprites(); BuildOamBuffer(); } static u8 GetBattleTerrainByMapScene(u8 mapBattleScene) { int i; for (i = 0; i < NELEMS(sMapBattleSceneMapping); i++) { if (mapBattleScene == sMapBattleSceneMapping[i].mapScene) return sMapBattleSceneMapping[i].battleTerrain; } return BATTLE_TERRAIN_PLAIN; } static void LoadBattleTerrainGfx(u16 terrain) { if (terrain >= NELEMS(sBattleTerrainTable)) terrain = BATTLE_TERRAIN_PLAIN; // Copy to bg3 LZDecompressVram(sBattleTerrainTable[terrain].tileset, (void *)BG_CHAR_ADDR(2)); LZDecompressVram(sBattleTerrainTable[terrain].tilemap, (void *)BG_SCREEN_ADDR(26)); LoadCompressedPalette(sBattleTerrainTable[terrain].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); } static void LoadBattleTerrainEntryGfx(u16 terrain) { if(gSaveBlock2Ptr->optionsBattleIntroAnim) //don't do entry anim graphics if set to Fast return; if (terrain >= NELEMS(sBattleTerrainTable)) terrain = BATTLE_TERRAIN_PLAIN; // Copy to bg1 LZDecompressVram(sBattleTerrainTable[terrain].entryTileset, (void *)BG_CHAR_ADDR(1)); LZDecompressVram(sBattleTerrainTable[terrain].entryTilemap, (void *)BG_SCREEN_ADDR(28)); } // Unused void GetBattleTerrainGfxPtrs(u8 terrain, const u32 **tilesPtr, const u32 **mapPtr, const u32 **palPtr) { if (terrain > BATTLE_TERRAIN_PLAIN) terrain = BATTLE_TERRAIN_PLAIN; *tilesPtr = sBattleTerrainTable[terrain].tileset; *mapPtr = sBattleTerrainTable[terrain].tilemap; *palPtr = sBattleTerrainTable[terrain].palette; } void BattleInitBgsAndWindows(void) { ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, gBattleBgTemplates, NELEMS(gBattleBgTemplates)); InitWindows(sStandardBattleWindowTemplates); DeactivateAllTextPrinters(); } void InitBattleBgsVideo(void) { EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); BattleInitBgsAndWindows(); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_OBJWIN_ON); } void LoadBattleMenuWindowGfx(void) { LoadUserWindowGfx(2, 0x012, BG_PLTT_ID(1)); LoadUserWindowGfx(2, 0x022, BG_PLTT_ID(1)); gPlttBufferUnfaded[BG_PLTT_ID(5) + 12] = RGB( 9, 9, 9); gPlttBufferUnfaded[BG_PLTT_ID(5) + 13] = RGB( 9, 9, 9); gPlttBufferUnfaded[BG_PLTT_ID(5) + 14] = RGB(31, 31, 31); gPlttBufferUnfaded[BG_PLTT_ID(5) + 15] = RGB( 26, 26, 25); CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(5) + 12], &gPlttBufferFaded[BG_PLTT_ID(5) + 12], PLTT_SIZEOF(4)); if (gBattleTypeFlags & (BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_POKEDUDE)) { Menu_LoadStdPalAt(BG_PLTT_ID(7)); LoadMenuMessageWindowGfx(0, 0x030, BG_PLTT_ID(7)); gPlttBufferUnfaded[BG_PLTT_ID(7) + 6] = RGB( 0, 0, 0); CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(7) + 6], &gPlttBufferFaded[BG_PLTT_ID(7) + 6], PLTT_SIZEOF(1)); } } void DrawMainBattleBackground(void) { LoadBattleTerrainGfx(GetBattleTerrainOverride()); } void LoadBattleTextboxAndBackground(void) { LZDecompressVram(gBattleInterface_Textbox_Gfx, (void *)BG_CHAR_ADDR(0)); CopyToBgTilemapBuffer(0, gBattleInterface_Textbox_Tilemap, 0, 0x000); CopyBgTilemapBufferToVram(0); LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadBattleMenuWindowGfx(); DrawMainBattleBackground(); } static void DrawLinkBattleParticipantPokeballs(u8 taskId, u8 multiplayerId, u8 bgId, u8 destX, u8 destY) { s32 i; u16 pokeballStatuses = 0; u16 tiles[6]; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (gTasks[taskId].data[5] != 0) { switch (multiplayerId) { case 0: pokeballStatuses = 0x3F & gTasks[taskId].data[3]; break; case 1: pokeballStatuses = (0xFC0 & gTasks[taskId].data[4]) >> 6; break; case 2: pokeballStatuses = (0xFC0 & gTasks[taskId].data[3]) >> 6; break; case 3: pokeballStatuses = 0x3F & gTasks[taskId].data[4]; break; } } else { switch (multiplayerId) { case 0: pokeballStatuses = 0x3F & gTasks[taskId].data[3]; break; case 1: pokeballStatuses = 0x3F & gTasks[taskId].data[4]; break; case 2: pokeballStatuses = (0xFC0 & gTasks[taskId].data[3]) >> 6; break; case 3: pokeballStatuses = (0xFC0 & gTasks[taskId].data[4]) >> 6; break; } } for (i = 0; i < 3; i++) tiles[i] = ((pokeballStatuses & (3 << (i * 2))) >> (i * 2)) + 0x6001; CopyToBgTilemapBufferRect_ChangePalette(bgId, tiles, destX, destY, 3, 1, 0x11); CopyBgTilemapBufferToVram(bgId); } else { if (multiplayerId == gBattleStruct->multiplayerId) pokeballStatuses = gTasks[taskId].data[3]; else pokeballStatuses = gTasks[taskId].data[4]; for (i = 0; i < 6; i++) tiles[i] = ((pokeballStatuses & (3 << (i * 2))) >> (i * 2)) + 0x6001; CopyToBgTilemapBufferRect_ChangePalette(bgId, tiles, destX, destY, 6, 1, 0x11); CopyBgTilemapBufferToVram(bgId); } } static void DrawLinkBattleVsScreenOutcomeText(void) { if (gBattleOutcome == B_OUTCOME_DREW) { BattlePutTextOnWindow(gText_Draw, B_WIN_VS_OUTCOME_DRAW); } else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (gBattleOutcome == B_OUTCOME_WON) { switch (gLinkPlayers[gBattleStruct->multiplayerId].id) { case 0: BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT); break; case 1: BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT); break; case 2: BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT); break; case 3: BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT); break; } } else { switch (gLinkPlayers[gBattleStruct->multiplayerId].id) { case 0: BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT); break; case 1: BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT); break; case 2: BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT); break; case 3: BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT); break; } } } else if (gBattleOutcome == B_OUTCOME_WON) { if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0) { BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT); } else { BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT); } } else { if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0) { BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT); } else { BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT); BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT); } } } void InitLinkBattleVsScreen(u8 taskId) { struct LinkPlayer *linkPlayer; u8 *name; s32 i, palId; switch (gTasks[taskId].data[0]) { case 0: if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { for (i = 0; i < MAX_BATTLERS_COUNT; i++) { name = gLinkPlayers[i].name; linkPlayer = &gLinkPlayers[i]; switch (linkPlayer->id) { case 0: BattlePutTextOnWindow(name, B_WIN_VS_MULTI_PLAYER_1); DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 1, 2, 4); break; case 1: BattlePutTextOnWindow(name, B_WIN_VS_MULTI_PLAYER_2); DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 2, 2, 4); break; case 2: BattlePutTextOnWindow(name, B_WIN_VS_MULTI_PLAYER_3); DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 1, 2, 8); break; case 3: BattlePutTextOnWindow(name, B_WIN_VS_MULTI_PLAYER_4); DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 2, 2, 8); break; } } } else { u8 playerId = gBattleStruct->multiplayerId; u8 opponentId = playerId ^ BIT_SIDE; u8 opponentId_copy = opponentId; if (gLinkPlayers[playerId].id != 0) opponentId = playerId, playerId = opponentId_copy; name = gLinkPlayers[playerId].name; BattlePutTextOnWindow(name, B_WIN_VS_PLAYER); name = gLinkPlayers[opponentId].name; BattlePutTextOnWindow(name, B_WIN_VS_OPPONENT); DrawLinkBattleParticipantPokeballs(taskId, playerId, 1, 2, 7); DrawLinkBattleParticipantPokeballs(taskId, opponentId, 2, 2, 7); } gTasks[taskId].data[0]++; break; case 1: palId = AllocSpritePalette(TAG_VS_LETTERS); gPlttBufferUnfaded[OBJ_PLTT_ID(palId) + 15] = gPlttBufferFaded[OBJ_PLTT_ID(palId) + 15] = RGB_WHITE; gBattleStruct->linkBattleVsSpriteId_V = CreateSprite(&sVsLetter_V_SpriteTemplate, 108, 80, 0); gBattleStruct->linkBattleVsSpriteId_S = CreateSprite(&sVsLetter_S_SpriteTemplate, 132, 80, 0); gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = TRUE; gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = TRUE; gTasks[taskId].data[0]++; break; case 2: if (gTasks[taskId].data[5] != 0) { gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32); gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32); gBattle_BG1_Y = -36; gBattle_BG2_Y = -36; } else { gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32); gBattle_BG1_Y = (Cos2(gTasks[taskId].data[1]) / 32) - 164; gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32); gBattle_BG2_Y = (Cos2(gTasks[taskId].data[2]) / 32) - 164; } if (gTasks[taskId].data[2] != 0) { gTasks[taskId].data[2] -= 2; gTasks[taskId].data[1] += 2; } else { if (gTasks[taskId].data[5] != 0) DrawLinkBattleVsScreenOutcomeText(); PlaySE(SE_M_HARDEN); DestroyTask(taskId); gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = FALSE; gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = FALSE; gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.tileNum += 0x40; gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[0] = 0; gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[0] = 1; gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_V].x; gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_S].x; gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[2] = 0; gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[2] = 0; } break; } } void DrawBattleEntryBackground(void) { struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { LZDecompressVram(gFile_graphics_battle_transitions_vs_frame_sheet, (void *)(BG_CHAR_ADDR(1))); LZDecompressVram(gVsLettersGfx, (void *)(VRAM + 0x10000)); LoadCompressedPalette(gFile_graphics_battle_transitions_vs_frame_palette, BG_PLTT_ID(6), PLTT_SIZE_4BPP); SetBgAttribute(1, BG_ATTR_SCREENSIZE, 1); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT512x256); CopyToBgTilemapBuffer(1, gFile_graphics_battle_transitions_vs_frame_tilemap, 0, 0); CopyToBgTilemapBuffer(2, gFile_graphics_battle_transitions_vs_frame_tilemap, 0, 0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); gBattle_BG1_Y = -164; gBattle_BG2_Y = -164; LoadCompressedSpriteSheetUsingHeap(&sVsLettersSpriteSheet); } else if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) { LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_GRASS); } else if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) { LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING); } else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { if (gGameVersion == VERSION_FIRE_RED) { LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_CAVE); } else { LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_WATER); } } else { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { u8 trainerClass = sTrainers[gTrainerBattleOpponent_A].trainerClass; if (trainerClass == TRAINER_CLASS_LEADER) { LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING); return; } else if (trainerClass == TRAINER_CLASS_CHAMPION) { LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING); return; } } if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL) { LoadBattleTerrainEntryGfx(gBattleTerrain); } else { LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING); } } } static u8 GetBattleTerrainOverride(void) { u8 battleScene; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) { return BATTLE_TERRAIN_LINK; } else if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) { gBattleTerrain = BATTLE_TERRAIN_GRASS; return BATTLE_TERRAIN_GRASS; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER) return BATTLE_TERRAIN_LEADER; else if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION) return BATTLE_TERRAIN_CHAMPION; } battleScene = GetCurrentMapBattleScene(); if (battleScene == MAP_BATTLE_SCENE_NORMAL) { return gBattleTerrain; } return GetBattleTerrainByMapScene(battleScene); } bool8 LoadChosenBattleElement(u8 caseId) { bool8 ret = FALSE; u8 battleScene; switch (caseId) { case 0: LZDecompressVram(gBattleInterface_Textbox_Gfx, (void *)BG_CHAR_ADDR(0)); break; case 1: CopyToBgTilemapBuffer(0, gBattleInterface_Textbox_Tilemap, 0, 0x000); CopyBgTilemapBufferToVram(0); break; case 2: LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); break; case 3: battleScene = GetBattleTerrainOverride(); LZDecompressVram(sBattleTerrainTable[battleScene].tileset, (void *)BG_CHAR_ADDR(2)); // fallthrough case 4: battleScene = GetBattleTerrainOverride(); LZDecompressVram(sBattleTerrainTable[battleScene].tilemap, (void *)BG_SCREEN_ADDR(26)); break; case 5: battleScene = GetBattleTerrainOverride(); LoadCompressedPalette(sBattleTerrainTable[battleScene].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case 6: LoadBattleMenuWindowGfx(); break; default: ret = TRUE; break; } return ret; } ================================================ FILE: src/battle_controller_link_opponent.c ================================================ #include "global.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_message.h" #include "gflib.h" #include "data.h" #include "link.h" #include "m4a.h" #include "pokeball.h" #include "task.h" #include "util.h" #include "constants/battle_anim.h" #include "constants/songs.h" #include "constants/sound.h" #include "constants/trainers.h" static void LinkOpponentHandleGetMonData(void); static void LinkOpponentHandleGetRawMonData(void); static void LinkOpponentHandleSetMonData(void); static void LinkOpponentHandleSetRawMonData(void); static void LinkOpponentHandleLoadMonSprite(void); static void LinkOpponentHandleSwitchInAnim(void); static void LinkOpponentHandleReturnMonToBall(void); static void LinkOpponentHandleDrawTrainerPic(void); static void LinkOpponentHandleTrainerSlide(void); static void LinkOpponentHandleTrainerSlideBack(void); static void LinkOpponentHandleFaintAnimation(void); static void LinkOpponentHandlePaletteFade(void); static void LinkOpponentHandleSuccessBallThrowAnim(void); static void LinkOpponentHandleBallThrowAnim(void); static void LinkOpponentHandlePause(void); static void LinkOpponentHandleMoveAnimation(void); static void LinkOpponentHandlePrintString(void); static void LinkOpponentHandlePrintSelectionString(void); static void LinkOpponentHandleChooseAction(void); static void LinkOpponentHandleUnknownYesNoBox(void); static void LinkOpponentHandleChooseMove(void); static void LinkOpponentHandleChooseItem(void); static void LinkOpponentHandleChoosePokemon(void); static void LinkOpponentHandleCmd23(void); static void LinkOpponentHandleHealthBarUpdate(void); static void LinkOpponentHandleExpUpdate(void); static void LinkOpponentHandleStatusIconUpdate(void); static void LinkOpponentHandleStatusAnimation(void); static void LinkOpponentHandleStatusXor(void); static void LinkOpponentHandleDataTransfer(void); static void LinkOpponentHandleDMA3Transfer(void); static void LinkOpponentHandlePlayBGM(void); static void LinkOpponentHandleCmd32(void); static void LinkOpponentHandleTwoReturnValues(void); static void LinkOpponentHandleChosenMonReturnValue(void); static void LinkOpponentHandleOneReturnValue(void); static void LinkOpponentHandleOneReturnValue_Duplicate(void); static void LinkOpponentHandleClearUnkVar(void); static void LinkOpponentHandleSetUnkVar(void); static void LinkOpponentHandleClearUnkFlag(void); static void LinkOpponentHandleToggleUnkFlag(void); static void LinkOpponentHandleHitAnimation(void); static void LinkOpponentHandleCantSwitch(void); static void LinkOpponentHandlePlaySE(void); static void LinkOpponentHandlePlayFanfare(void); static void LinkOpponentHandleFaintingCry(void); static void LinkOpponentHandleIntroSlide(void); static void LinkOpponentHandleIntroTrainerBallThrow(void); static void LinkOpponentHandleDrawPartyStatusSummary(void); static void LinkOpponentHandleHidePartyStatusSummary(void); static void LinkOpponentHandleEndBounceEffect(void); static void LinkOpponentHandleSpriteInvisibility(void); static void LinkOpponentHandleBattleAnimation(void); static void LinkOpponentHandleLinkStandbyMsg(void); static void LinkOpponentHandleResetActionMoveSelection(void); static void LinkOpponentHandleEndLinkBattle(void); static void LinkOpponentCmdEnd(void); static void LinkOpponentBufferRunCommand(void); static void LinkOpponentBufferExecCompleted(void); static void SwitchIn_HandleSoundAndEnd(void); static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst); static void SetLinkOpponentMonData(u8 monId); static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void LinkOpponentDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); static void EndDrawPartyStatusSummary(void); static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { [CONTROLLER_GETMONDATA] = LinkOpponentHandleGetMonData, [CONTROLLER_GETRAWMONDATA] = LinkOpponentHandleGetRawMonData, [CONTROLLER_SETMONDATA] = LinkOpponentHandleSetMonData, [CONTROLLER_SETRAWMONDATA] = LinkOpponentHandleSetRawMonData, [CONTROLLER_LOADMONSPRITE] = LinkOpponentHandleLoadMonSprite, [CONTROLLER_SWITCHINANIM] = LinkOpponentHandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = LinkOpponentHandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = LinkOpponentHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = LinkOpponentHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = LinkOpponentHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = LinkOpponentHandleFaintAnimation, [CONTROLLER_PALETTEFADE] = LinkOpponentHandlePaletteFade, [CONTROLLER_SUCCESSBALLTHROWANIM] = LinkOpponentHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = LinkOpponentHandleBallThrowAnim, [CONTROLLER_PAUSE] = LinkOpponentHandlePause, [CONTROLLER_MOVEANIMATION] = LinkOpponentHandleMoveAnimation, [CONTROLLER_PRINTSTRING] = LinkOpponentHandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = LinkOpponentHandlePrintSelectionString, [CONTROLLER_CHOOSEACTION] = LinkOpponentHandleChooseAction, [CONTROLLER_UNKNOWNYESNOBOX] = LinkOpponentHandleUnknownYesNoBox, [CONTROLLER_CHOOSEMOVE] = LinkOpponentHandleChooseMove, [CONTROLLER_OPENBAG] = LinkOpponentHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = LinkOpponentHandleChoosePokemon, [CONTROLLER_23] = LinkOpponentHandleCmd23, [CONTROLLER_HEALTHBARUPDATE] = LinkOpponentHandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = LinkOpponentHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = LinkOpponentHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = LinkOpponentHandleStatusAnimation, [CONTROLLER_STATUSXOR] = LinkOpponentHandleStatusXor, [CONTROLLER_DATATRANSFER] = LinkOpponentHandleDataTransfer, [CONTROLLER_DMA3TRANSFER] = LinkOpponentHandleDMA3Transfer, [CONTROLLER_PLAYBGM] = LinkOpponentHandlePlayBGM, [CONTROLLER_32] = LinkOpponentHandleCmd32, [CONTROLLER_TWORETURNVALUES] = LinkOpponentHandleTwoReturnValues, [CONTROLLER_CHOSENMONRETURNVALUE] = LinkOpponentHandleChosenMonReturnValue, [CONTROLLER_ONERETURNVALUE] = LinkOpponentHandleOneReturnValue, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = LinkOpponentHandleOneReturnValue_Duplicate, [CONTROLLER_CLEARUNKVAR] = LinkOpponentHandleClearUnkVar, [CONTROLLER_SETUNKVAR] = LinkOpponentHandleSetUnkVar, [CONTROLLER_CLEARUNKFLAG] = LinkOpponentHandleClearUnkFlag, [CONTROLLER_TOGGLEUNKFLAG] = LinkOpponentHandleToggleUnkFlag, [CONTROLLER_HITANIMATION] = LinkOpponentHandleHitAnimation, [CONTROLLER_CANTSWITCH] = LinkOpponentHandleCantSwitch, [CONTROLLER_PLAYSE] = LinkOpponentHandlePlaySE, [CONTROLLER_PLAYFANFARE] = LinkOpponentHandlePlayFanfare, [CONTROLLER_FAINTINGCRY] = LinkOpponentHandleFaintingCry, [CONTROLLER_INTROSLIDE] = LinkOpponentHandleIntroSlide, [CONTROLLER_INTROTRAINERBALLTHROW] = LinkOpponentHandleIntroTrainerBallThrow, [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = LinkOpponentHandleDrawPartyStatusSummary, [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = LinkOpponentHandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = LinkOpponentHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = LinkOpponentHandleSpriteInvisibility, [CONTROLLER_BATTLEANIMATION] = LinkOpponentHandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = LinkOpponentHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = LinkOpponentHandleResetActionMoveSelection, [CONTROLLER_ENDLINKBATTLE] = LinkOpponentHandleEndLinkBattle, [CONTROLLER_TERMINATOR_NOP] = LinkOpponentCmdEnd }; static void LinkOpponentDummy(void) { } void SetControllerToLinkOpponent(void) { gBattlerControllerFuncs[gActiveBattler] = LinkOpponentBufferRunCommand; } static void LinkOpponentBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands)) sLinkOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]](); else LinkOpponentBufferExecCompleted(); } } static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) LinkOpponentBufferExecCompleted(); } static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { FreeTrainerFrontPicPaletteAndTile(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = gSprites[gBattlerSpriteIds[gActiveBattler]].data[5]; FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); LinkOpponentBufferExecCompleted(); } } static void Intro_DelayAndEnd(void) { if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; LinkOpponentBufferExecCompleted(); } } static void Intro_WaitForShinyAnimAndHealthbox(void) { bool32 healthboxAnimDone = FALSE; if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) healthboxAnimDone = TRUE; } else if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == gSprites[gHealthboxSpriteIds[gActiveBattler]].callback) { healthboxAnimDone = TRUE; } if (IsCryPlayingOrClearCrySongs()) healthboxAnimDone = FALSE; if (healthboxAnimDone) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) return; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); } if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) m4aMPlayContinue(&gMPlayInfo_BGM); } else { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } static void Intro_TryShinyAnimShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim) TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == 3) { if (++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == 1) return; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; } if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); SetBattlerShadowSpriteCallback(gActiveBattler ^ BIT_FLANK, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], MON_DATA_SPECIES)); } DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } static void TryShinyAnimAfterMonAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded == TRUE && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) { TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); LinkOpponentBufferExecCompleted(); } } } static void CompleteOnHealthbarDone(void) { s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); if (hpValue != -1) UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT); else LinkOpponentBufferExecCompleted(); } static void HideHealthboxAfterMonFaint(void) { if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse) { SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); LinkOpponentBufferExecCompleted(); } } static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); HideBattlerShadowSprite(gActiveBattler); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); LinkOpponentBufferExecCompleted(); } } static void CompleteOnInactiveTextPrinter(void) { if (!IsTextPrinterActive(B_WIN_MSG)) LinkOpponentBufferExecCompleted(); } static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBattlerSpriteIds[gActiveBattler]; if (gSprites[spriteId].data[1] == 32) { gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; LinkOpponentBufferExecCompleted(); } else { if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; gSprites[spriteId].data[1]++; } } static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; } } static void SwitchIn_HandleSoundAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); LinkOpponentBufferExecCompleted(); } } static void SwitchIn_ShowHealthbox(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); CopyBattleSpriteInvisibility(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } static void SwitchIn_TryShinyAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) { TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } static void CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) LinkOpponentBufferExecCompleted(); } static void CompleteOnFinishedBattleAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) LinkOpponentBufferExecCompleted(); } static void LinkOpponentBufferExecCompleted(void) { gBattlerControllerFuncs[gActiveBattler] = LinkOpponentBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { gBattleControllerExecFlags &= ~gBitTable[gActiveBattler]; } } static void LinkOpponentHandleGetMonData(void) { u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { size += CopyLinkOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) size += CopyLinkOpponentMonData(i, monData + size); monToCheck >>= 1; } } BtlController_EmitDataTransfer(BUFFER_B, size, monData); LinkOpponentBufferExecCompleted(); } static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; u8 nickname[20]; u8 *src; s16 data16; u32 data32; s32 size = 0; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); } battleMon.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); battleMon.friendship = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP); battleMon.experience = GetMonData(&gEnemyParty[monId], MON_DATA_EXP); battleMon.hpIV = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); battleMon.attackIV = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); battleMon.defenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); battleMon.speedIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); battleMon.spAttackIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); battleMon.spDefenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); battleMon.personality = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY); battleMon.status1 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS); battleMon.level = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL); battleMon.hp = GetMonData(&gEnemyParty[monId], MON_DATA_HP); battleMon.maxHP = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP); battleMon.attack = GetMonData(&gEnemyParty[monId], MON_DATA_ATK); battleMon.defense = GetMonData(&gEnemyParty[monId], MON_DATA_DEF); battleMon.speed = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); battleMon.isEgg = GetMonData(&gEnemyParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gEnemyParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); GetMonData(&gEnemyParty[monId], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(battleMon.nickname, nickname); GetMonData(&gEnemyParty[monId], MON_DATA_OT_NAME, battleMon.otName); src = (u8 *)&battleMon; for (size = 0; size < sizeof(battleMon); size++) dst[size] = src[size]; break; case REQUEST_SPECIES_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_HELDITEM_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MOVES_PP_BATTLE: for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); src = (u8 *)(&moveData); for (size = 0; size < sizeof(moveData); size++) dst[size] = src[size]; break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_PP_DATA_BATTLE: for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); size++; break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: data32 = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_EXP_BATTLE: data32 = GetMonData(&gEnemyParty[monId], MON_DATA_EXP); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_HP_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_EV); size = 1; break; case REQUEST_ATK_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV); size = 1; break; case REQUEST_DEF_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV); size = 1; break; case REQUEST_SPEED_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV); size = 1; break; case REQUEST_SPATK_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV); size = 1; break; case REQUEST_SPDEF_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV); size = 1; break; case REQUEST_FRIENDSHIP_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP); size = 1; break; case REQUEST_POKERUS_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKERUS); size = 1; break; case REQUEST_MET_LOCATION_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION); size = 1; break; case REQUEST_MET_LEVEL_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL); size = 1; break; case REQUEST_MET_GAME_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME); size = 1; break; case REQUEST_POKEBALL_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL); size = 1; break; case REQUEST_ALL_IVS_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); dst[1] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); dst[2] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); dst[3] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); dst[4] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); dst[5] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); size = 6; break; case REQUEST_HP_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); size = 1; break; case REQUEST_ATK_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); size = 1; break; case REQUEST_DEF_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); size = 1; break; case REQUEST_SPEED_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); size = 1; break; case REQUEST_SPATK_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); size = 1; break; case REQUEST_SPDEF_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); size = 1; break; case REQUEST_PERSONALITY_BATTLE: data32 = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_CHECKSUM_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_STATUS_BATTLE: data32 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_LEVEL_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL); size = 1; break; case REQUEST_HP_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MAX_HP_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_ATK_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_ATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_DEF_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_DEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPEED_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPATK_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPDEF_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_COOL_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL); size = 1; break; case REQUEST_BEAUTY_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY); size = 1; break; case REQUEST_CUTE_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE); size = 1; break; case REQUEST_SMART_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART); size = 1; break; case REQUEST_TOUGH_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH); size = 1; break; case REQUEST_SHEEN_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SHEEN); size = 1; break; case REQUEST_COOL_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON); size = 1; break; case REQUEST_BEAUTY_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON); size = 1; break; case REQUEST_CUTE_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON); size = 1; break; case REQUEST_SMART_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON); size = 1; break; case REQUEST_TOUGH_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON); size = 1; break; } return size; } static void LinkOpponentHandleGetRawMonData(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleSetMonData(void) { u8 monToCheck; u32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { SetLinkOpponentMonData(gBattlerPartyIndexes[gActiveBattler]); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) SetLinkOpponentMonData(i); monToCheck >>= 1; } } LinkOpponentBufferExecCompleted(); } static void SetLinkOpponentMonData(u8 monId) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; s32 i; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { u8 iv; SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &iv); SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality); SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &battlePokemon->status1); SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &battlePokemon->level); SetMonData(&gEnemyParty[monId], MON_DATA_HP, &battlePokemon->hp); SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP); SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &battlePokemon->attack); SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &battlePokemon->defense); SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &battlePokemon->speed); SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack); SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case REQUEST_SPECIES_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; } } static void LinkOpponentHandleSetRawMonData(void) { u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; u32 i; for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = gBattleBufferA[gActiveBattler][3 + i]; LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleLoadMonSprite(void) { u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2), GetBattlerSpriteDefault_Y(gActiveBattler), GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); gBattlerControllerFuncs[gActiveBattler] = TryShinyAnimAfterMonAnim; } static void LinkOpponentHandleSwitchInAnim(void) { gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void LinkOpponentHandleReturnMonToBall(void) { if (gBattleBufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; } else { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); HideBattlerShadowSprite(gActiveBattler); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); LinkOpponentBufferExecCompleted(); } } static void DoSwitchOutAnimation(void) { switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON); gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } #define sSpeedX data[0] static void LinkOpponentHandleDrawTrainerPic(void) { s16 xPos; u32 trainerPicId; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon xPos = 152; else // first mon xPos = 200; if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE) { if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE) trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_MAY]; else trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_BRENDAN]; } else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_EMERALD) { if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE) trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_EM_MAY]; else trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_EM_BRENDAN]; } else if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE) { trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_LEAF]; } else { trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_RED]; } } else { xPos = 176; if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) { trainerPicId = GetUnionRoomTrainerPic(); } else if ((gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_SAPPHIRE) { if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != MALE) trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_MAY]; else trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_BRENDAN]; } else if ((gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_EMERALD) { if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != MALE) trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_EM_MAY]; else trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_EM_BRENDAN]; } else if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != MALE) { trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_LEAF]; } else { trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_RED]; } } DecompressTrainerFrontPic(trainerPicId, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void LinkOpponentHandleTrainerSlide(void) { LinkOpponentBufferExecCompleted(); } #undef sSpeedX static void LinkOpponentHandleTrainerSlideBack(void) { SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } static void LinkOpponentHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++; } else { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET); gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; gBattlerControllerFuncs[gActiveBattler] = HideHealthboxAfterMonFaint; } } } static void LinkOpponentHandlePaletteFade(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleSuccessBallThrowAnim(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleBallThrowAnim(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandlePause(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleMoveAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); gAnimFriendship = gBattleBufferA[gActiveBattler][10]; gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { LinkOpponentBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDoMoveAnimation; } } } static void LinkOpponentDoMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); u8 multihit = gBattleBufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8) { gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } break; case 2: gAnimScriptCallback(); if (!gAnimScriptActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3; } break; case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; LinkOpponentBufferExecCompleted(); } break; } } static void LinkOpponentHandlePrintString(void) { u16 *stringId; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); if (BattleStringShouldBeColored(*stringId)) BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT)); else BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } static void LinkOpponentHandlePrintSelectionString(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleChooseAction(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleUnknownYesNoBox(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleChooseMove(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleChooseItem(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleChoosePokemon(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleCmd23(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleHealthBarUpdate(void) { s16 hpVal; LoadBattleBarGfx(0); hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); u32 curHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal); } else { u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal); } gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone; } static void LinkOpponentHandleExpUpdate(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); battlerId = gActiveBattler; gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void LinkOpponentHandleStatusAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void LinkOpponentHandleStatusXor(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleDataTransfer(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleDMA3Transfer(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandlePlayBGM(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleCmd32(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleTwoReturnValues(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleChosenMonReturnValue(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleOneReturnValue(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleOneReturnValue_Duplicate(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleClearUnkVar(void) { gUnusedControllerStruct.unk = 0; LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleSetUnkVar(void) { gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleClearUnkFlag(void) { gUnusedControllerStruct.flag = 0; LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleToggleUnkFlag(void) { gUnusedControllerStruct.flag ^= 1; LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleHitAnimation(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE) { LinkOpponentBufferExecCompleted(); } else { gDoingBattleAnim = TRUE; gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect; } } static void LinkOpponentHandleCantSwitch(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandlePlaySE(void) { s8 pan; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) pan = SOUND_PAN_ATTACKER; else pan = SOUND_PAN_TARGET; PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandlePlayFanfare(void) { PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleFaintingCry(void) { u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); PlayCry_ByMode(species, 25, CRY_MODE_FAINT); LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleIntroTrainerBallThrow(void) { u8 taskId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreeOpponentSprite); taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDummy; } static void Task_StartSendOutAnim(u8 taskId) { u8 savedActiveBank = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler = BATTLE_PARTNER(gActiveBattler); gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler = BATTLE_PARTNER(gActiveBattler); } gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBank; DestroyTask(taskId); } static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) { FreeTrainerFrontPicPaletteAndTile(sprite->oam.affineParam); sprite->oam.tileNum = sprite->data[5]; FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } static void LinkOpponentHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { LinkOpponentBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE; if (gBattleBufferA[gActiveBattler][2] != 0) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay < 2) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay++; return; } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay = 0; } } gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2] != 0) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } static void EndDrawPartyStatusSummary(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; LinkOpponentBufferExecCompleted(); } } static void LinkOpponentHandleHidePartyStatusSummary(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleEndBounceEffect(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleBattleAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) LinkOpponentBufferExecCompleted(); else gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; } } static void LinkOpponentHandleLinkStandbyMsg(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleResetActionMoveSelection(void) { LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandleEndLinkBattle(void) { if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW) gBattleOutcome = gBattleBufferA[gActiveBattler][1]; else gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ B_OUTCOME_DREW; FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkOpponentBufferExecCompleted(); gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void LinkOpponentCmdEnd(void) { } ================================================ FILE: src/battle_controller_link_partner.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "link.h" #include "pokeball.h" #include "task.h" #include "util.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_message.h" #include "constants/battle_anim.h" #include "constants/songs.h" #include "constants/sound.h" static void LinkPartnerHandleGetMonData(void); static void LinkPartnerHandleGetRawMonData(void); static void LinkPartnerHandleSetMonData(void); static void LinkPartnerHandleSetRawMonData(void); static void LinkPartnerHandleLoadMonSprite(void); static void LinkPartnerHandleSwitchInAnim(void); static void LinkPartnerHandleReturnMonToBall(void); static void LinkPartnerHandleDrawTrainerPic(void); static void LinkPartnerHandleTrainerSlide(void); static void LinkPartnerHandleTrainerSlideBack(void); static void LinkPartnerHandleFaintAnimation(void); static void LinkPartnerHandlePaletteFade(void); static void LinkPartnerHandleSuccessBallThrowAnim(void); static void LinkPartnerHandleBallThrowAnim(void); static void LinkPartnerHandlePause(void); static void LinkPartnerHandleMoveAnimation(void); static void LinkPartnerHandlePrintString(void); static void LinkPartnerHandlePrintSelectionString(void); static void LinkPartnerHandleChooseAction(void); static void LinkPartnerHandleUnknownYesNoBox(void); static void LinkPartnerHandleChooseMove(void); static void LinkPartnerHandleChooseItem(void); static void LinkPartnerHandleChoosePokemon(void); static void LinkPartnerHandleCmd23(void); static void LinkPartnerHandleHealthBarUpdate(void); static void LinkPartnerHandleExpUpdate(void); static void LinkPartnerHandleStatusIconUpdate(void); static void LinkPartnerHandleStatusAnimation(void); static void LinkPartnerHandleStatusXor(void); static void LinkPartnerHandleDataTransfer(void); static void LinkPartnerHandleDMA3Transfer(void); static void LinkPartnerHandlePlayBGM(void); static void LinkPartnerHandleCmd32(void); static void LinkPartnerHandleTwoReturnValues(void); static void LinkPartnerHandleChosenMonReturnValue(void); static void LinkPartnerHandleOneReturnValue(void); static void LinkPartnerHandleOneReturnValue_Duplicate(void); static void LinkPartnerHandleClearUnkVar(void); static void LinkPartnerHandleSetUnkVar(void); static void LinkPartnerHandleClearUnkFlag(void); static void LinkPartnerHandleToggleUnkFlag(void); static void LinkPartnerHandleHitAnimation(void); static void LinkPartnerHandleCantSwitch(void); static void LinkPartnerHandlePlaySE(void); static void LinkPartnerHandlePlayFanfare(void); static void LinkPartnerHandleFaintingCry(void); static void LinkPartnerHandleIntroSlide(void); static void LinkPartnerHandleIntroTrainerBallThrow(void); static void LinkPartnerHandleDrawPartyStatusSummary(void); static void LinkPartnerHandleHidePartyStatusSummary(void); static void LinkPartnerHandleEndBounceEffect(void); static void LinkPartnerHandleSpriteInvisibility(void); static void LinkPartnerHandleBattleAnimation(void); static void LinkPartnerHandleLinkStandbyMsg(void); static void LinkPartnerHandleResetActionMoveSelection(void); static void LinkPartnerHandleEndLinkBattle(void); static void LinkPartnerCmdEnd(void); static void LinkPartnerBufferRunCommand(void); static void LinkPartnerBufferExecCompleted(void); static void SwitchIn_WaitAndEnd(void); static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst); static void SetLinkPartnerMonData(u8 monId); static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void LinkPartnerDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); static void EndDrawPartyStatusSummary(void); static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { [CONTROLLER_GETMONDATA] = LinkPartnerHandleGetMonData, [CONTROLLER_GETRAWMONDATA] = LinkPartnerHandleGetRawMonData, [CONTROLLER_SETMONDATA] = LinkPartnerHandleSetMonData, [CONTROLLER_SETRAWMONDATA] = LinkPartnerHandleSetRawMonData, [CONTROLLER_LOADMONSPRITE] = LinkPartnerHandleLoadMonSprite, [CONTROLLER_SWITCHINANIM] = LinkPartnerHandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = LinkPartnerHandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = LinkPartnerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = LinkPartnerHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = LinkPartnerHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = LinkPartnerHandleFaintAnimation, [CONTROLLER_PALETTEFADE] = LinkPartnerHandlePaletteFade, [CONTROLLER_SUCCESSBALLTHROWANIM] = LinkPartnerHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = LinkPartnerHandleBallThrowAnim, [CONTROLLER_PAUSE] = LinkPartnerHandlePause, [CONTROLLER_MOVEANIMATION] = LinkPartnerHandleMoveAnimation, [CONTROLLER_PRINTSTRING] = LinkPartnerHandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = LinkPartnerHandlePrintSelectionString, [CONTROLLER_CHOOSEACTION] = LinkPartnerHandleChooseAction, [CONTROLLER_UNKNOWNYESNOBOX] = LinkPartnerHandleUnknownYesNoBox, [CONTROLLER_CHOOSEMOVE] = LinkPartnerHandleChooseMove, [CONTROLLER_OPENBAG] = LinkPartnerHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = LinkPartnerHandleChoosePokemon, [CONTROLLER_23] = LinkPartnerHandleCmd23, [CONTROLLER_HEALTHBARUPDATE] = LinkPartnerHandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = LinkPartnerHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = LinkPartnerHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = LinkPartnerHandleStatusAnimation, [CONTROLLER_STATUSXOR] = LinkPartnerHandleStatusXor, [CONTROLLER_DATATRANSFER] = LinkPartnerHandleDataTransfer, [CONTROLLER_DMA3TRANSFER] = LinkPartnerHandleDMA3Transfer, [CONTROLLER_PLAYBGM] = LinkPartnerHandlePlayBGM, [CONTROLLER_32] = LinkPartnerHandleCmd32, [CONTROLLER_TWORETURNVALUES] = LinkPartnerHandleTwoReturnValues, [CONTROLLER_CHOSENMONRETURNVALUE] = LinkPartnerHandleChosenMonReturnValue, [CONTROLLER_ONERETURNVALUE] = LinkPartnerHandleOneReturnValue, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = LinkPartnerHandleOneReturnValue_Duplicate, [CONTROLLER_CLEARUNKVAR] = LinkPartnerHandleClearUnkVar, [CONTROLLER_SETUNKVAR] = LinkPartnerHandleSetUnkVar, [CONTROLLER_CLEARUNKFLAG] = LinkPartnerHandleClearUnkFlag, [CONTROLLER_TOGGLEUNKFLAG] = LinkPartnerHandleToggleUnkFlag, [CONTROLLER_HITANIMATION] = LinkPartnerHandleHitAnimation, [CONTROLLER_CANTSWITCH] = LinkPartnerHandleCantSwitch, [CONTROLLER_PLAYSE] = LinkPartnerHandlePlaySE, [CONTROLLER_PLAYFANFARE] = LinkPartnerHandlePlayFanfare, [CONTROLLER_FAINTINGCRY] = LinkPartnerHandleFaintingCry, [CONTROLLER_INTROSLIDE] = LinkPartnerHandleIntroSlide, [CONTROLLER_INTROTRAINERBALLTHROW] = LinkPartnerHandleIntroTrainerBallThrow, [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = LinkPartnerHandleDrawPartyStatusSummary, [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = LinkPartnerHandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = LinkPartnerHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = LinkPartnerHandleSpriteInvisibility, [CONTROLLER_BATTLEANIMATION] = LinkPartnerHandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = LinkPartnerHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = LinkPartnerHandleResetActionMoveSelection, [CONTROLLER_ENDLINKBATTLE] = LinkPartnerHandleEndLinkBattle, [CONTROLLER_TERMINATOR_NOP] = LinkPartnerCmdEnd }; static void LinkPartnerDummy(void) { } void SetControllerToLinkPartner(void) { gBattlerControllerFuncs[gActiveBattler] = LinkPartnerBufferRunCommand; } static void LinkPartnerBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands)) sLinkPartnerBufferCommands[gBattleBufferA[gActiveBattler][0]](); else LinkPartnerBufferExecCompleted(); } } static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) LinkPartnerBufferExecCompleted(); } static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { BattleGfxSfxDummy3(MALE); FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); LinkPartnerBufferExecCompleted(); } } static void Intro_DelayAndEnd(void) { if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; LinkPartnerBufferExecCompleted(); } } static void Intro_WaitForHealthbox(void) { bool32 finished = FALSE; if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) finished = TRUE; } else if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) { finished = TRUE; } if (IsCryPlayingOrClearCrySongs()) finished = FALSE; if (finished) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } static void Intro_ShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay != 1) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForHealthbox; } } static void WaitForMonAnimAfterLoad(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0) LinkPartnerBufferExecCompleted(); } static void CompleteOnHealthbarDone(void) { s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); if (hpValue != -1) { UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT); } else { HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); LinkPartnerBufferExecCompleted(); } } static void FreeMonSpriteAfterFaintAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT) { FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); LinkPartnerBufferExecCompleted(); } } static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); LinkPartnerBufferExecCompleted(); } } static void CompleteOnInactiveTextPrinter(void) { if (!IsTextPrinterActive(B_WIN_MSG)) LinkPartnerBufferExecCompleted(); } static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBattlerSpriteIds[gActiveBattler]; if (gSprites[spriteId].data[1] == 32) { gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; LinkPartnerBufferExecCompleted(); } else { if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; gSprites[spriteId].data[1]++; } } static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_WaitAndEnd; } } static void SwitchIn_WaitAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { LinkPartnerBufferExecCompleted(); } } static void SwitchIn_ShowHealthbox(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); CopyBattleSpriteInvisibility(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } static void SwitchIn_TryShinyAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); } if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } static void LinkPartnerBufferExecCompleted(void) { gBattlerControllerFuncs[gActiveBattler] = LinkPartnerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { gBattleControllerExecFlags &= ~gBitTable[gActiveBattler]; } } static void CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) LinkPartnerBufferExecCompleted(); } static void CompleteOnFinishedBattleAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleGetMonData(void) { u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { size += CopyLinkPartnerMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) size += CopyLinkPartnerMonData(i, monData + size); monToCheck >>= 1; } } BtlController_EmitDataTransfer(BUFFER_B, size, monData); LinkPartnerBufferExecCompleted(); } static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; u8 nickname[20]; u8 *src; s16 data16; u32 data32; s32 size = 0; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); } battleMon.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); battleMon.friendship = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); battleMon.experience = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); battleMon.hpIV = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); battleMon.attackIV = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); battleMon.defenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); battleMon.speedIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); battleMon.spAttackIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); battleMon.spDefenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); battleMon.personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); battleMon.status1 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); battleMon.level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); battleMon.hp = GetMonData(&gPlayerParty[monId], MON_DATA_HP); battleMon.maxHP = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); battleMon.attack = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); battleMon.defense = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(battleMon.nickname, nickname); GetMonData(&gPlayerParty[monId], MON_DATA_OT_NAME, battleMon.otName); src = (u8 *)&battleMon; for (size = 0; size < sizeof(battleMon); size++) dst[size] = src[size]; break; case REQUEST_SPECIES_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_HELDITEM_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MOVES_PP_BATTLE: for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); src = (u8 *)(&moveData); for (size = 0; size < sizeof(moveData); size++) dst[size] = src[size]; break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_PP_DATA_BATTLE: for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); size++; break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_EXP_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_HP_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_EV); size = 1; break; case REQUEST_ATK_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV); size = 1; break; case REQUEST_DEF_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV); size = 1; break; case REQUEST_SPEED_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV); size = 1; break; case REQUEST_SPATK_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV); size = 1; break; case REQUEST_SPDEF_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV); size = 1; break; case REQUEST_FRIENDSHIP_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); size = 1; break; case REQUEST_POKERUS_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKERUS); size = 1; break; case REQUEST_MET_LOCATION_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION); size = 1; break; case REQUEST_MET_LEVEL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL); size = 1; break; case REQUEST_MET_GAME_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME); size = 1; break; case REQUEST_POKEBALL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL); size = 1; break; case REQUEST_ALL_IVS_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); dst[1] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); dst[2] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); dst[3] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); dst[4] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); dst[5] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); size = 6; break; case REQUEST_HP_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); size = 1; break; case REQUEST_ATK_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); size = 1; break; case REQUEST_DEF_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); size = 1; break; case REQUEST_SPEED_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); size = 1; break; case REQUEST_SPATK_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); size = 1; break; case REQUEST_SPDEF_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); size = 1; break; case REQUEST_PERSONALITY_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_CHECKSUM_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_STATUS_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_LEVEL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); size = 1; break; case REQUEST_HP_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MAX_HP_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_ATK_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_DEF_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPEED_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPATK_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPDEF_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_COOL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL); size = 1; break; case REQUEST_BEAUTY_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY); size = 1; break; case REQUEST_CUTE_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE); size = 1; break; case REQUEST_SMART_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART); size = 1; break; case REQUEST_TOUGH_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH); size = 1; break; case REQUEST_SHEEN_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SHEEN); size = 1; break; case REQUEST_COOL_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON); size = 1; break; case REQUEST_BEAUTY_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON); size = 1; break; case REQUEST_CUTE_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON); size = 1; break; case REQUEST_SMART_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON); size = 1; break; case REQUEST_TOUGH_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON); size = 1; break; } return size; } static void LinkPartnerHandleGetRawMonData(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleSetMonData(void) { u8 monToCheck; u32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { SetLinkPartnerMonData(gBattlerPartyIndexes[gActiveBattler]); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) SetLinkPartnerMonData(i); monToCheck >>= 1; } } LinkPartnerBufferExecCompleted(); } static void SetLinkPartnerMonData(u8 monId) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; s32 i; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { u8 iv; SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &iv); SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality); SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &battlePokemon->status1); SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &battlePokemon->level); SetMonData(&gPlayerParty[monId], MON_DATA_HP, &battlePokemon->hp); SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP); SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &battlePokemon->attack); SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &battlePokemon->defense); SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &battlePokemon->speed); SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack); SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case REQUEST_SPECIES_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; } HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); } static void LinkPartnerHandleSetRawMonData(void) { u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; u32 i; for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = gBattleBufferA[gActiveBattler][3 + i]; LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleLoadMonSprite(void) { u16 species; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2), GetBattlerSpriteDefault_Y(gActiveBattler), GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); gBattlerControllerFuncs[gActiveBattler] = WaitForMonAnimAfterLoad; } static void LinkPartnerHandleSwitchInAnim(void) { ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void LinkPartnerHandleReturnMonToBall(void) { if (gBattleBufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; } else { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); LinkPartnerBufferExecCompleted(); } } static void DoSwitchOutAnimation(void) { switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } #define sSpeedX data[0] static void LinkPartnerHandleDrawTrainerPic(void) { s16 xPos; u32 trainerPicId; if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right. xPos = 90; else // First mon, on the left. xPos = 32; if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE) { trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN; } else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_EMERALD) { trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_EMERALD_BRENDAN; } else { trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender; } DecompressTrainerBackPalette(trainerPicId, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } #undef sSpeedX static void LinkPartnerHandleTrainerSlide(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleTrainerSlideBack(void) { SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } #define sSpeedX data[1] #define sSpeedY data[2] static void LinkPartnerHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++; } else { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER); gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 0; gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedY = 5; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; } } } #undef sSpeedX #undef sSpeedY static void LinkPartnerHandlePaletteFade(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleSuccessBallThrowAnim(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleBallThrowAnim(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandlePause(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleMoveAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); gAnimFriendship = gBattleBufferA[gActiveBattler][10]; gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { LinkPartnerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = LinkPartnerDoMoveAnimation; } } } static void LinkPartnerDoMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); u8 multihit = gBattleBufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8) { gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } break; case 2: gAnimScriptCallback(); if (!gAnimScriptActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3; } break; case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; LinkPartnerBufferExecCompleted(); } break; } } static void LinkPartnerHandlePrintString(void) { u16 *stringId; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); if (BattleStringShouldBeColored(*stringId)) BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT)); else BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } static void LinkPartnerHandlePrintSelectionString(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleChooseAction(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleUnknownYesNoBox(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleChooseMove(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleChooseItem(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleChoosePokemon(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleCmd23(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleHealthBarUpdate(void) { s16 hpVal; LoadBattleBarGfx(0); hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal); } else { u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal); } gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone; } static void LinkPartnerHandleExpUpdate(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); battlerId = gActiveBattler; gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void LinkPartnerHandleStatusAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void LinkPartnerHandleStatusXor(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleDataTransfer(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleDMA3Transfer(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandlePlayBGM(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleCmd32(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleTwoReturnValues(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleChosenMonReturnValue(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleOneReturnValue(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleOneReturnValue_Duplicate(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleClearUnkVar(void) { gUnusedControllerStruct.unk = 0; LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleSetUnkVar(void) { gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleClearUnkFlag(void) { gUnusedControllerStruct.flag = 0; LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleToggleUnkFlag(void) { gUnusedControllerStruct.flag ^= 1; LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleHitAnimation(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE) { LinkPartnerBufferExecCompleted(); } else { gDoingBattleAnim = TRUE; gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect; } } static void LinkPartnerHandleCantSwitch(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandlePlaySE(void) { s8 pan; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) pan = SOUND_PAN_ATTACKER; else pan = SOUND_PAN_TARGET; PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandlePlayFanfare(void) { PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleFaintingCry(void) { u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); PlayCry_ByMode(species, -25, CRY_MODE_FAINT); LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleIntroTrainerBallThrow(void) { u8 paletteNum; u8 taskId; u32 trainerPicId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F9); if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE) { trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN; } else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_EMERALD) { trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_EMERALD_BRENDAN; } else { trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender; } LoadCompressedPalette(gTrainerBackPicPaletteTable[trainerPicId].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; gBattlerControllerFuncs[gActiveBattler] = LinkPartnerDummy; } static void Task_StartSendOutAnim(u8 taskId) { if (gTasks[taskId].data[1] < 24) { gTasks[taskId].data[1]++; } else { u8 savedActiveBattler = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } gBattlerControllerFuncs[gActiveBattler] = Intro_ShowHealthbox; gActiveBattler = savedActiveBattler; DestroyTask(taskId); } } static void LinkPartnerHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { LinkPartnerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2] != 0) // Skip delay on battle start gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } static void EndDrawPartyStatusSummary(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; LinkPartnerBufferExecCompleted(); } } static void LinkPartnerHandleHidePartyStatusSummary(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleEndBounceEffect(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleBattleAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) LinkPartnerBufferExecCompleted(); else gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; } } static void LinkPartnerHandleLinkStandbyMsg(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleResetActionMoveSelection(void) { LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandleEndLinkBattle(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkPartnerBufferExecCompleted(); gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void LinkPartnerCmdEnd(void) { } ================================================ FILE: src/battle_controller_oak_old_man.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "pokeball.h" #include "party_menu.h" #include "util.h" #include "m4a.h" #include "link.h" #include "item.h" #include "item_menu.h" #include "strings.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_message.h" #include "reshow_battle_screen.h" #include "constants/songs.h" #include "constants/items.h" static void OakOldManHandleGetMonData(void); static void OakOldManHandleGetRawMonData(void); static void OakOldManHandleSetMonData(void); static void OakOldManHandleSetRawMonData(void); static void OakOldManHandleLoadMonSprite(void); static void OakOldManHandleSwitchInAnim(void); static void OakOldManHandleReturnMonToBall(void); static void OakOldManHandleDrawTrainerPic(void); static void OakOldManHandleTrainerSlide(void); static void OakOldManHandleTrainerSlideBack(void); static void OakOldManHandleFaintAnimation(void); static void OakOldManHandlePaletteFade(void); static void OakOldManHandleSuccessBallThrowAnim(void); static void OakOldManHandleBallThrowAnim(void); static void OakOldManHandlePause(void); static void OakOldManHandleMoveAnimation(void); static void OakOldManHandlePrintString(void); static void OakOldManHandlePrintSelectionString(void); static void OakOldManHandleChooseAction(void); static void OakOldManHandleUnknownYesNoBox(void); static void OakOldManHandleChooseMove(void); static void OakOldManHandleChooseItem(void); static void OakOldManHandleChoosePokemon(void); static void OakOldManHandleCmd23(void); static void OakOldManHandleHealthBarUpdate(void); static void OakOldManHandleExpUpdate(void); static void OakOldManHandleStatusIconUpdate(void); static void OakOldManHandleStatusAnimation(void); static void OakOldManHandleStatusXor(void); static void OakOldManHandleDataTransfer(void); static void OakOldManHandleDMA3Transfer(void); static void OakOldManHandlePlayBGM(void); static void OakOldManHandleCmd32(void); static void OakOldManHandleTwoReturnValues(void); static void OakOldManHandleChosenMonReturnValue(void); static void OakOldManHandleOneReturnValue(void); static void OakOldManHandleOneReturnValue_Duplicate(void); static void OakOldManHandleCmd37(void); static void OakOldManHandleCmd38(void); static void OakOldManHandleCmd39(void); static void OakOldManHandleCmd40(void); static void OakOldManHandleHitAnimation(void); static void OakOldManHandleCmd42(void); static void OakOldManHandlePlaySE(void); static void OakOldManHandlePlayFanfare(void); static void OakOldManHandleFaintingCry(void); static void OakOldManHandleIntroSlide(void); static void OakOldManHandleIntroTrainerBallThrow(void); static void OakOldManHandleDrawPartyStatusSummary(void); static void OakOldManHandleHidePartyStatusSummary(void); static void OakOldManHandleEndBounceEffect(void); static void OakOldManHandleSpriteInvisibility(void); static void OakOldManHandleBattleAnimation(void); static void OakOldManHandleLinkStandbyMsg(void); static void OakOldManHandleResetActionMoveSelection(void); static void OakOldManHandleCmd55(void); static void OakOldManCmdEnd(void); static void OakOldManBufferRunCommand(void); static void OakOldManBufferExecCompleted(void); static void WaitForMonSelection(void); static void CompleteWhenChoseItem(void); static void PrintOakText_KeepAnEyeOnHP(void); static void Intro_WaitForShinyAnimAndHealthbox(void); static void PrintOakText_ForPetesSake(void); static void Task_LaunchLvlUpAnim(u8 taskId); static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId); static void CompleteOnInactiveTextPrinter2(void); static void Task_PrepareToGiveExpWithExpBar(u8 taskId); static void Task_GiveExpWithExpBar(u8 taskId); static void Task_UpdateLvlInHealthbox(u8 taskId); static void PrintOakTextWithMainBgDarkened(const u8 *text, u8 delay); static u32 CopyOakOldManMonData(u8 monId, u8 *dst); static void SetOakOldManMonData(u8 monId); static void OakOldManDoMoveAnimation(void); static void HandleInputChooseAction(void); static void Task_StartSendOutAnim(u8 taskId); static void (*const sOakOldManBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { [CONTROLLER_GETMONDATA] = OakOldManHandleGetMonData, [CONTROLLER_GETRAWMONDATA] = OakOldManHandleGetRawMonData, [CONTROLLER_SETMONDATA] = OakOldManHandleSetMonData, [CONTROLLER_SETRAWMONDATA] = OakOldManHandleSetRawMonData, [CONTROLLER_LOADMONSPRITE] = OakOldManHandleLoadMonSprite, [CONTROLLER_SWITCHINANIM] = OakOldManHandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = OakOldManHandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = OakOldManHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = OakOldManHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = OakOldManHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = OakOldManHandleFaintAnimation, [CONTROLLER_PALETTEFADE] = OakOldManHandlePaletteFade, [CONTROLLER_SUCCESSBALLTHROWANIM] = OakOldManHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = OakOldManHandleBallThrowAnim, [CONTROLLER_PAUSE] = OakOldManHandlePause, [CONTROLLER_MOVEANIMATION] = OakOldManHandleMoveAnimation, [CONTROLLER_PRINTSTRING] = OakOldManHandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = OakOldManHandlePrintSelectionString, [CONTROLLER_CHOOSEACTION] = OakOldManHandleChooseAction, [CONTROLLER_UNKNOWNYESNOBOX] = OakOldManHandleUnknownYesNoBox, [CONTROLLER_CHOOSEMOVE] = OakOldManHandleChooseMove, [CONTROLLER_OPENBAG] = OakOldManHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = OakOldManHandleChoosePokemon, [CONTROLLER_23] = OakOldManHandleCmd23, [CONTROLLER_HEALTHBARUPDATE] = OakOldManHandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = OakOldManHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = OakOldManHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = OakOldManHandleStatusAnimation, [CONTROLLER_STATUSXOR] = OakOldManHandleStatusXor, [CONTROLLER_DATATRANSFER] = OakOldManHandleDataTransfer, [CONTROLLER_DMA3TRANSFER] = OakOldManHandleDMA3Transfer, [CONTROLLER_PLAYBGM] = OakOldManHandlePlayBGM, [CONTROLLER_32] = OakOldManHandleCmd32, [CONTROLLER_TWORETURNVALUES] = OakOldManHandleTwoReturnValues, [CONTROLLER_CHOSENMONRETURNVALUE] = OakOldManHandleChosenMonReturnValue, [CONTROLLER_ONERETURNVALUE] = OakOldManHandleOneReturnValue, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = OakOldManHandleOneReturnValue_Duplicate, [CONTROLLER_CLEARUNKVAR] = OakOldManHandleCmd37, [CONTROLLER_SETUNKVAR] = OakOldManHandleCmd38, [CONTROLLER_CLEARUNKFLAG] = OakOldManHandleCmd39, [CONTROLLER_TOGGLEUNKFLAG] = OakOldManHandleCmd40, [CONTROLLER_HITANIMATION] = OakOldManHandleHitAnimation, [CONTROLLER_CANTSWITCH] = OakOldManHandleCmd42, [CONTROLLER_PLAYSE] = OakOldManHandlePlaySE, [CONTROLLER_PLAYFANFARE] = OakOldManHandlePlayFanfare, [CONTROLLER_FAINTINGCRY] = OakOldManHandleFaintingCry, [CONTROLLER_INTROSLIDE] = OakOldManHandleIntroSlide, [CONTROLLER_INTROTRAINERBALLTHROW] = OakOldManHandleIntroTrainerBallThrow, [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = OakOldManHandleDrawPartyStatusSummary, [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = OakOldManHandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = OakOldManHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = OakOldManHandleSpriteInvisibility, [CONTROLLER_BATTLEANIMATION] = OakOldManHandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = OakOldManHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = OakOldManHandleResetActionMoveSelection, [CONTROLLER_ENDLINKBATTLE] = OakOldManHandleCmd55, [CONTROLLER_TERMINATOR_NOP] = OakOldManCmdEnd, }; static void OakOldManDummy(void) { } void SetControllerToOakOrOldMan(void) { gBattlerControllerFuncs[gActiveBattler] = OakOldManBufferRunCommand; gBattleStruct->simulatedInputState[0] = 0; gBattleStruct->simulatedInputState[1] = 0; gBattleStruct->simulatedInputState[2] = 0; gBattleStruct->simulatedInputState[3] = 0; } static void OakOldManBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { if (gBattleBufferA[gActiveBattler][0] < NELEMS(sOakOldManBufferCommands)) sOakOldManBufferCommands[gBattleBufferA[gActiveBattler][0]](); else OakOldManBufferExecCompleted(); } } static void HandleInputChooseAction(void) { // Like player, but specifically for Rival in Oak's Lab u16 itemId = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); switch (gActionSelectionCursor[gActiveBattler]) { case 0: BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0); break; case 1: BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0); break; case 2: BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); break; case 3: BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0); break; } OakOldManBufferExecCompleted(); } else if (JOY_NEW(DPAD_LEFT)) { if (gActionSelectionCursor[gActiveBattler] & 1) // if is B_ACTION_USE_ITEM or B_ACTION_RUN { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 1; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(DPAD_RIGHT)) { if (!(gActionSelectionCursor[gActiveBattler] & 1)) // if is B_ACTION_USE_MOVE or B_ACTION_SWITCH { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 1; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(DPAD_UP)) { if (gActionSelectionCursor[gActiveBattler] & 2) // if is B_ACTION_SWITCH or B_ACTION_RUN { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 2; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(DPAD_DOWN)) { if (!(gActionSelectionCursor[gActiveBattler] & 2)) // if is B_ACTION_USE_MOVE or B_ACTION_USE_ITEM { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 2; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(B_BUTTON)) { if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { if (gBattleBufferA[gActiveBattler][1] == B_ACTION_USE_ITEM) { // Add item to bag if it is a ball if (itemId <= ITEM_PREMIER_BALL) AddBagItem(itemId, 1); else return; } PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(1, B_ACTION_CANCEL_PARTNER, 0); OakOldManBufferExecCompleted(); } } else if (JOY_NEW(START_BUTTON)) { SwapHpBarsWithHpText(); } } static void SimulateInputChooseAction(void) { // Old Man switch (gBattleStruct->simulatedInputState[0]) { case 0: gBattleStruct->simulatedInputState[2] = 64; ++gBattleStruct->simulatedInputState[0]; // fall through case 1: if (--gBattleStruct->simulatedInputState[2] == 0) { // Move cursor to BAG PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(0); ActionSelectionCreateCursorAt(1, 0); gBattleStruct->simulatedInputState[2] = 64; ++gBattleStruct->simulatedInputState[0]; } break; case 2: if (--gBattleStruct->simulatedInputState[2] == 0) { // Open bag PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0); OakOldManBufferExecCompleted(); } break; } } static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) OakOldManBufferExecCompleted(); } static void CompleteOnInactiveTextPrinter(void) { if (!IsTextPrinterActive(0)) OakOldManBufferExecCompleted(); } static void OakOldManSetBattleEndCallbacks(void) { if (!gPaletteFade.active) { gMain.inBattle = FALSE; gMain.callback1 = gPreBattleCallback1; SetMainCallback2(gMain.savedCallback); } } static void CompleteOnSpecialAnimDone(void) { if (!gDoingBattleAnim) OakOldManBufferExecCompleted(); } void OakOldManHandleInputChooseMove(void) { HandleInputChooseMove(); if (!(gBattleControllerExecFlags & gBitTable[gActiveBattler])) OakOldManBufferExecCompleted(); } static void OpenPartyMenuToChooseMon(void) { if (!gPaletteFade.active) { u8 caseId; gBattlerControllerFuncs[gActiveBattler] = WaitForMonSelection; caseId = gTasks[gBattleControllerData[gActiveBattler]].data[0]; DestroyTask(gBattleControllerData[gActiveBattler]); FreeAllWindowBuffers(); OpenPartyMenuInTutorialBattle(caseId); } } static void WaitForMonSelection(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (gPartyMenuUseExitCallback == TRUE) BtlController_EmitChosenMonReturnValue(1, gSelectedMonPartyId, gBattlePartyCurrentOrder); else BtlController_EmitChosenMonReturnValue(1, 6, NULL); OakOldManBufferExecCompleted(); } } static void OpenBagAndChooseItem(void) { if (!gPaletteFade.active) { gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChoseItem; ReshowBattleScreenDummy(); FreeAllWindowBuffers(); if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) CB2_BagMenuFromBattle(); else InitOldManBag(); } } static void CompleteWhenChoseItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (!BtlCtrl_OakOldMan_TestState2Flag(FIRST_BATTLE_MSG_FLAG_HP_RESTORE) && gSpecialVar_ItemId == ITEM_POTION && gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { BtlCtrl_OakOldMan_SetState2Flag(FIRST_BATTLE_MSG_FLAG_HP_RESTORE); gBattlerControllerFuncs[gActiveBattler] = PrintOakText_KeepAnEyeOnHP; } else { BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId); OakOldManBufferExecCompleted(); } } } static void Intro_TryShinyAnimShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } static void Intro_WaitForShinyAnimAndHealthbox(void) { bool32 r4 = FALSE; if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) r4 = TRUE; if (r4 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = PrintOakText_ForPetesSake; } } #define tExpTask_monId data[0] #define tExpTask_gainedExp data[1] #define tExpTask_battler data[2] #define tExpTask_frames data[10] static void Task_GiveExpToMon(u8 taskId) { u32 monId = (u8)gTasks[taskId].tExpTask_monId; u8 battlerId = gTasks[taskId].tExpTask_battler; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar. { struct Pokemon *mon = &gPlayerParty[monId]; u16 species = GetMonData(mon, MON_DATA_SPECIES); u8 level = GetMonData(mon, MON_DATA_LEVEL); u32 currExp = GetMonData(mon, MON_DATA_EXP); u32 nextLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1]; if (currExp + gainedExp >= nextLvlExp) { u8 savedActiveBattler; SetMonData(mon, MON_DATA_EXP, &nextLvlExp); CalculateMonStats(mon, TRUE); gainedExp -= nextLvlExp - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; if (IsDoubleBattle() == TRUE && ((u16)monId == gBattlerPartyIndexes[battlerId] || (u16)monId == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])) gTasks[taskId].func = Task_LaunchLvlUpAnim; else gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } else { currExp += gainedExp; SetMonData(mon, MON_DATA_EXP, &currExp); gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2; DestroyTask(taskId); } } else { gTasks[taskId].func = Task_PrepareToGiveExpWithExpBar; } } static void Task_PrepareToGiveExpWithExpBar(u8 taskId) { u8 monIndex = gTasks[taskId].tExpTask_monId; s32 gainedExp = gTasks[taskId].tExpTask_gainedExp; u8 battlerId = gTasks[taskId].tExpTask_battler; struct Pokemon *mon = &gPlayerParty[monIndex]; u8 level = GetMonData(mon, MON_DATA_LEVEL); u16 species = GetMonData(mon, MON_DATA_SPECIES); u32 exp = GetMonData(mon, MON_DATA_EXP); u32 currLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level]; u32 expToNextLvl; exp -= currLvlExp; expToNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLvlExp; SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp); PlaySE(SE_EXP); gTasks[taskId].func = Task_GiveExpWithExpBar; } static void Task_GiveExpWithExpBar(u8 taskId) { if (gTasks[taskId].tExpTask_frames < 13) { ++gTasks[taskId].tExpTask_frames; } else { u8 monId = gTasks[taskId].tExpTask_monId; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; u8 battlerId = gTasks[taskId].tExpTask_battler; s16 newExpPoints; newExpPoints = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]); if (newExpPoints == -1) // The bar has been filled with given exp points. { u8 level; s32 currExp; u16 species; s32 expOnNextLvl; m4aSongNumStop(SE_EXP); level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); currExp = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); expOnNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1]; if (currExp + gainedExp >= expOnNextLvl) { u8 savedActiveBattler; SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl); CalculateMonStats(&gPlayerParty[monId], TRUE); gainedExp -= expOnNextLvl - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; gTasks[taskId].func = Task_LaunchLvlUpAnim; } else { currExp += gainedExp; SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp); gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2; DestroyTask(taskId); } } } } static void Task_LaunchLvlUpAnim(u8 taskId) { u8 battlerId = gTasks[taskId].tExpTask_battler; u8 monIndex = gTasks[taskId].tExpTask_monId; if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]) battlerId ^= BIT_FLANK; InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP); gTasks[taskId].func = Task_UpdateLvlInHealthbox; } static void Task_UpdateLvlInHealthbox(u8 taskId) { u8 battlerId = gTasks[taskId].tExpTask_battler; if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive) { u8 monIndex = gTasks[taskId].tExpTask_monId; GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value. if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]) UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId ^ BIT_FLANK], &gPlayerParty[monIndex], HEALTHBOX_ALL); else UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL); gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } } static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId) { u8 monIndex = gTasks[taskId].tExpTask_monId; u8 battlerId; GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value battlerId = gTasks[taskId].tExpTask_battler; gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2; DestroyTask(taskId); } static void FreeMonSpriteAfterFaintAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT) { FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); OakOldManBufferExecCompleted(); } } static void PrintOakText_ForPetesSake(void) { u32 mask; switch (gBattleStruct->simulatedInputState[0]) { case 0: if (!gPaletteFade.active) { DoLoadHealthboxPalsForLevelUp(&gBattleStruct->simulatedInputState[1], &gBattleStruct->simulatedInputState[3], GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); BeginNormalPaletteFade(0xFFFFFF7E, 4, 0, 8, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 1: if (!gPaletteFade.active) { BtlCtrl_DrawVoiceoverMessageFrame(); ++gBattleStruct->simulatedInputState[0]; } break; case 2: BattleStringExpandPlaceholdersToDisplayedString(gText_ForPetesSake); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN); ++gBattleStruct->simulatedInputState[0]; break; case 3: if (!IsTextPrinterActive(24)) { mask = (gBitTable[gBattleStruct->simulatedInputState[1]] | gBitTable[gBattleStruct->simulatedInputState[3]]) << 16; BeginNormalPaletteFade(mask, 4, 8, 0, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 4: if (!gPaletteFade.active) { BattleStringExpandPlaceholdersToDisplayedString(gText_TheTrainerThat); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN); ++gBattleStruct->simulatedInputState[0]; } break; case 5: if (!IsTextPrinterActive(24)) { mask = (gBitTable[gBattleStruct->simulatedInputState[1]] | gBitTable[gBattleStruct->simulatedInputState[3]]) << 16; BeginNormalPaletteFade(mask, 4, 0, 8, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 6: if (!gPaletteFade.active) { BattleStringExpandPlaceholdersToDisplayedString(gText_TryBattling); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN); ++gBattleStruct->simulatedInputState[0]; } break; case 7: if (!IsTextPrinterActive(24)) { BeginNormalPaletteFade(0xFFFFFF7E, 4, 8, 0, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 8: if (!gPaletteFade.active) { DoFreeHealthboxPalsForLevelUp(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); BtlCtrl_RemoveVoiceoverMessageFrame(); gBattleStruct->simulatedInputState[0] = 0; OakOldManBufferExecCompleted(); } break; } } void PrintOakText_InflictingDamageIsKey(void) { PrintOakTextWithMainBgDarkened(gText_InflictingDamageIsKey, 1); } static void PrintOakText_LoweringStats(void) { PrintOakTextWithMainBgDarkened(gText_LoweringStats, 64); } void PrintOakText_OakNoRunningFromATrainer(void) { PrintOakTextWithMainBgDarkened(gText_OakNoRunningFromATrainer, 1); } static void PrintOakText_WinEarnsPrizeMoney(void) { PrintOakTextWithMainBgDarkened(gText_WinEarnsPrizeMoney, 64); } void PrintOakText_HowDisappointing(void) { PrintOakTextWithMainBgDarkened(gText_HowDissapointing, 64); } static void PrintOakTextWithMainBgDarkened(const u8 *text, u8 delay) { // If delay is 0, it's treated as 256. switch (gBattleStruct->simulatedInputState[0]) { case 0: if (!IsTextPrinterActive(0)) { gBattleStruct->simulatedInputState[3] = delay; ++gBattleStruct->simulatedInputState[0]; } break; case 1: if (--gBattleStruct->simulatedInputState[3] == 0) { BeginNormalPaletteFade(0xFFFFFF7E, 4, 0, 8, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 2: if (!gPaletteFade.active) { BtlCtrl_DrawVoiceoverMessageFrame(); ++gBattleStruct->simulatedInputState[0]; } break; case 3: BattleStringExpandPlaceholdersToDisplayedString(text); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN); ++gBattleStruct->simulatedInputState[0]; break; case 4: if (!IsTextPrinterActive(24)) { BeginNormalPaletteFade(0xFFFFFF7E, 4, 8, 0, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 5: if (!gPaletteFade.active) { BtlCtrl_RemoveVoiceoverMessageFrame(); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) OakOldManBufferExecCompleted(); else OpponentBufferExecCompleted(); gBattleCommunication[MSG_DISPLAY] = 0; gBattleStruct->simulatedInputState[0] = 0; } break; } } static void PrintOakText_KeepAnEyeOnHP(void) { u32 mask; switch (gBattleStruct->simulatedInputState[0]) { case 0: if (!gPaletteFade.active) { DoLoadHealthboxPalsForLevelUp(&gBattleStruct->simulatedInputState[1], &gBattleStruct->simulatedInputState[3], gActiveBattler); BeginNormalPaletteFade(0xFFFFFF7E, 4, 0, 8, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 1: if (!gPaletteFade.active) { mask = (gBitTable[gBattleStruct->simulatedInputState[1]] | gBitTable[gBattleStruct->simulatedInputState[3]]) << 16; BeginNormalPaletteFade(mask, 4, 8, 0, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 2: if (!gPaletteFade.active) { BtlCtrl_DrawVoiceoverMessageFrame(); ++gBattleStruct->simulatedInputState[0]; } break; case 3: BattleStringExpandPlaceholdersToDisplayedString(gText_KeepAnEyeOnHP); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN); ++gBattleStruct->simulatedInputState[0]; break; case 4: if (!IsTextPrinterActive(24)) { mask = (gBitTable[gBattleStruct->simulatedInputState[1]] | gBitTable[gBattleStruct->simulatedInputState[3]]) << 16; BeginNormalPaletteFade(mask, 4, 0, 8, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 5: if (!gPaletteFade.active) { BeginNormalPaletteFade(0xFFFFFF7E, 4, 8, 0, RGB_BLACK); ++gBattleStruct->simulatedInputState[0]; } break; case 6: if (!gPaletteFade.active) { BtlCtrl_RemoveVoiceoverMessageFrame(); BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId); OakOldManBufferExecCompleted(); gBattleStruct->simulatedInputState[0] = 0; } break; } } static void CompleteOnHealthbarDone(void) { s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); if (hpValue != -1) { UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT); } else { HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); OakOldManBufferExecCompleted(); } } static void CompleteOnInactiveTextPrinter2(void) { if (!IsTextPrinterActive(0)) OakOldManBufferExecCompleted(); } static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBattlerSpriteIds[gActiveBattler]; if (gSprites[spriteId].data[1] == 32) { gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; OakOldManBufferExecCompleted(); } else { if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; ++gSprites[spriteId].data[1]; } } static void DoSwitchOutAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); OakOldManBufferExecCompleted(); } } static void CompleteOnBattlerSpriteCallbackDummy2(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) OakOldManBufferExecCompleted(); } static void CompleteOnFinishedBattleAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) OakOldManBufferExecCompleted(); } static void OakOldManBufferExecCompleted(void) { gBattlerControllerFuncs[gActiveBattler] = OakOldManBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { gBattleControllerExecFlags &= ~gBitTable[gActiveBattler]; } } static void CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) OakOldManBufferExecCompleted(); } static void OakOldManHandleGetMonData(void) { u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { size += CopyOakOldManMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; ++i) { if (monToCheck & 1) size += CopyOakOldManMonData(i, monData + size); monToCheck >>= 1; } } BtlController_EmitDataTransfer(BUFFER_B, size, monData); OakOldManBufferExecCompleted(); } static u32 CopyOakOldManMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; u8 nickname[20]; u8 *src; s16 data16; u32 data32; s32 size = 0; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); for (size = 0; size < MAX_MON_MOVES; ++size) { battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); } battleMon.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); battleMon.friendship = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); battleMon.experience = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); battleMon.hpIV = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); battleMon.attackIV = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); battleMon.defenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); battleMon.speedIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); battleMon.spAttackIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); battleMon.spDefenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); battleMon.personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); battleMon.status1 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); battleMon.level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); battleMon.hp = GetMonData(&gPlayerParty[monId], MON_DATA_HP); battleMon.maxHP = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); battleMon.attack = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); battleMon.defense = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(battleMon.nickname, nickname); GetMonData(&gPlayerParty[monId], MON_DATA_OT_NAME, battleMon.otName); src = (u8 *)&battleMon; for (size = 0; size < sizeof(battleMon); ++size) dst[size] = src[size]; break; case REQUEST_SPECIES_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_HELDITEM_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MOVES_PP_BATTLE: for (size = 0; size < MAX_MON_MOVES; ++size) { moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); src = (u8 *)(&moveData); for (size = 0; size < sizeof(moveData); ++size) dst[size] = src[size]; break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_PP_DATA_BATTLE: for (size = 0; size < MAX_MON_MOVES; ++size) dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); ++size; break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_EXP_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_HP_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_EV); size = 1; break; case REQUEST_ATK_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV); size = 1; break; case REQUEST_DEF_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV); size = 1; break; case REQUEST_SPEED_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV); size = 1; break; case REQUEST_SPATK_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV); size = 1; break; case REQUEST_SPDEF_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV); size = 1; break; case REQUEST_FRIENDSHIP_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); size = 1; break; case REQUEST_POKERUS_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKERUS); size = 1; break; case REQUEST_MET_LOCATION_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION); size = 1; break; case REQUEST_MET_LEVEL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL); size = 1; break; case REQUEST_MET_GAME_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME); size = 1; break; case REQUEST_POKEBALL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL); size = 1; break; case REQUEST_ALL_IVS_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); dst[1] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); dst[2] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); dst[3] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); dst[4] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); dst[5] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); size = 6; break; case REQUEST_HP_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); size = 1; break; case REQUEST_ATK_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); size = 1; break; case REQUEST_DEF_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); size = 1; break; case REQUEST_SPEED_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); size = 1; break; case REQUEST_SPATK_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); size = 1; break; case REQUEST_SPDEF_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); size = 1; break; case REQUEST_PERSONALITY_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_CHECKSUM_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_STATUS_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_LEVEL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); size = 1; break; case REQUEST_HP_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MAX_HP_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_ATK_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_DEF_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPEED_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPATK_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPDEF_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_COOL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL); size = 1; break; case REQUEST_BEAUTY_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY); size = 1; break; case REQUEST_CUTE_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE); size = 1; break; case REQUEST_SMART_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART); size = 1; break; case REQUEST_TOUGH_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH); size = 1; break; case REQUEST_SHEEN_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SHEEN); size = 1; break; case REQUEST_COOL_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON); size = 1; break; case REQUEST_BEAUTY_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON); size = 1; break; case REQUEST_CUTE_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON); size = 1; break; case REQUEST_SMART_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON); size = 1; break; case REQUEST_TOUGH_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON); size = 1; break; } return size; } static void OakOldManHandleGetRawMonData(void) { PlayerHandleGetRawMonData(); } static void OakOldManHandleSetMonData(void) { u8 monToCheck; u32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { SetOakOldManMonData(gBattlerPartyIndexes[gActiveBattler]); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; ++i) { if (monToCheck & 1) SetOakOldManMonData(i); monToCheck >>= 1; } } OakOldManBufferExecCompleted(); } static void SetOakOldManMonData(u8 monId) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; s32 i; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { u8 iv; SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < MAX_MON_MOVES; ++i) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &iv); SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality); SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &battlePokemon->status1); SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &battlePokemon->level); SetMonData(&gPlayerParty[monId], MON_DATA_HP, &battlePokemon->hp); SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP); SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &battlePokemon->attack); SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &battlePokemon->defense); SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &battlePokemon->speed); SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack); SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case REQUEST_SPECIES_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; ++i) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; } HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); } static void OakOldManHandleSetRawMonData(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleLoadMonSprite(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleSwitchInAnim(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleReturnMonToBall(void) { if (gBattleBufferA[gActiveBattler][1] == 0) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; } else { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); OakOldManBufferExecCompleted(); } } static void OakOldManHandleDrawTrainerPic(void) { if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80, 30); } else { DecompressTrainerBackPalette(TRAINER_BACK_PIC_OLD_MAN, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_OLD_MAN, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_OLD_MAN].size) * 4 + 80, 30); } gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -240; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void OakOldManHandleTrainerSlide(void) { if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80, 30); } else { DecompressTrainerBackPalette(TRAINER_BACK_PIC_OLD_MAN, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_OLD_MAN, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_OLD_MAN].size) * 4 + 80, 30); } gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -96; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy2; } static void OakOldManHandleTrainerSlideBack(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState; } else { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER); gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; } } } static void OakOldManHandlePaletteFade(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void OakOldManHandleBallThrowAnim(void) { u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void OakOldManHandlePause(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); gAnimFriendship = gBattleBufferA[gActiveBattler][10]; gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { OakOldManBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = OakOldManDoMoveAnimation; } } static void OakOldManDoMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } break; case 2: gAnimScriptCallback(); if (!gAnimScriptActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3; } break; case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; OakOldManBufferExecCompleted(); } break; } } static void OakOldManHandlePrintString(void) { u16 *stringId; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]); if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && *stringId == 1) { OakOldManBufferExecCompleted(); } else { BufferStringBattle(*stringId); if (BattleStringShouldBeColored(*stringId)) BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT)); else BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { switch (*stringId) { case STRINGID_DEFENDERSSTATFELL: if (!BtlCtrl_OakOldMan_TestState2Flag(FIRST_BATTLE_MSG_FLAG_STAT_CHG)) { BtlCtrl_OakOldMan_SetState2Flag(FIRST_BATTLE_MSG_FLAG_STAT_CHG); gBattlerControllerFuncs[gActiveBattler] = PrintOakText_LoweringStats; return; } break; case STRINGID_PLAYERGOTMONEY: gBattlerControllerFuncs[gActiveBattler] = PrintOakText_WinEarnsPrizeMoney; return; case STRINGID_TRAINER1WINTEXT: gBattlerControllerFuncs[gActiveBattler] = PrintOakText_HowDisappointing; return; case STRINGID_DONTLEAVEBIRCH: gBattlerControllerFuncs[gActiveBattler] = PrintOakText_OakNoRunningFromATrainer; return; } } gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } } static void OakOldManHandlePrintSelectionString(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) OakOldManHandlePrintString(); else OakOldManBufferExecCompleted(); } static void HandleChooseActionAfterDma3(void) { if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; gBattle_BG0_Y = 160; if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction; else gBattlerControllerFuncs[gActiveBattler] = SimulateInputChooseAction; } } static void OakOldManHandleChooseAction(void) { s32 i; gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3; BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); BattlePutTextOnWindow(gText_BattleMenu, B_WIN_ACTION_MENU); for (i = 0; i < MAX_MON_MOVES; ++i) ActionSelectionDestroyCursorAt((u8)i); ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo); else BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillOldManDo); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT); } static void OakOldManHandleUnknownYesNoBox(void) { OakOldManBufferExecCompleted(); } static void OakHandleChooseMove_WaitDma3(void) { if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; gBattle_BG0_Y = 320; gBattlerControllerFuncs[gActiveBattler] = OakOldManHandleInputChooseMove; } } static void OakOldManHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { InitMoveSelectionsVarsAndStrings(); gBattlerControllerFuncs[gActiveBattler] = OakHandleChooseMove_WaitDma3; } else { switch (gBattleStruct->simulatedInputState[1]) { case 0: InitMoveSelectionsVarsAndStrings(); ++gBattleStruct->simulatedInputState[1]; gBattleStruct->simulatedInputState[3] = 80; // fall through case 1: if (--gBattleStruct->simulatedInputState[3] == 0) { PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(1, 10, 0x100); OakOldManBufferExecCompleted(); } break; } } } static void OakOldManHandleChooseItem(void) { s32 i; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem; gBattlerInMenuId = gActiveBattler; for (i = 0; i < 3; ++i) gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][i + 1]; } static void OakOldManHandleChoosePokemon(void) { s32 i; gBattleControllerData[gActiveBattler] = CreateTask(TaskDummy, 0xFF); gTasks[gBattleControllerData[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF; *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4; *(&gBattleStruct->playerPartyIdx) = gBattleBufferA[gActiveBattler][2]; *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3]; for (i = 0; i < 3; ++i) gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][4 + i]; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon; gBattlerInMenuId = gActiveBattler; } static void OakOldManHandleCmd23(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleHealthBarUpdate(void) { s16 hpVal; LoadBattleBarGfx(0); hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal); } else { u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal); UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT); } gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone; } static void OakOldManHandleExpUpdate(void) { u8 monId = gBattleBufferA[gActiveBattler][1]; if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL) { OakOldManBufferExecCompleted(); } else { s16 expPointsToGive; u8 taskId; LoadBattleBarGfx(1); GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // Unused return value. expPointsToGive = T1_READ_16(&gBattleBufferA[gActiveBattler][2]); taskId = CreateTask(Task_GiveExpToMon, 10); gTasks[taskId].tExpTask_monId = monId; gTasks[taskId].tExpTask_gainedExp = expPointsToGive; gTasks[taskId].tExpTask_battler = gActiveBattler; gBattlerControllerFuncs[gActiveBattler] = OakOldManDummy; } } static void OakOldManHandleStatusIconUpdate(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleStatusAnimation(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleStatusXor(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleDataTransfer(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleDMA3Transfer(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandlePlayBGM(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleCmd32(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleTwoReturnValues(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleChosenMonReturnValue(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleOneReturnValue(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleOneReturnValue_Duplicate(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleCmd37(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleCmd38(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleCmd39(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleCmd40(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleHitAnimation(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE) { OakOldManBufferExecCompleted(); } else { gDoingBattleAnim = TRUE; gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect; } } static void OakOldManHandleCmd42(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandlePlaySE(void) { PlaySE(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); OakOldManBufferExecCompleted(); } static void OakOldManHandlePlayFanfare(void) { PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); OakOldManBufferExecCompleted(); } static void OakOldManHandleFaintingCry(void) { u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); PlayCry_Normal(species, 25); OakOldManBufferExecCompleted(); } static void OakOldManHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; OakOldManBufferExecCompleted(); } static void OakOldManHandleIntroTrainerBallThrow(void) { u8 paletteNum; u8 taskId; if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; } else { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; OakOldManBufferExecCompleted(); } } static void StartSendOutAnim(u8 battlerId) { u16 species; gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = SPECIES_NONE; gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void Task_StartSendOutAnim(u8 taskId) { if (gTasks[taskId].data[1] < 31) { ++gTasks[taskId].data[1]; } else { u8 savedActiveBattler = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBattler; DestroyTask(taskId); } } static void OakOldManHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { OakOldManBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); OakOldManBufferExecCompleted(); } } static void OakOldManHandleHidePartyStatusSummary(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleEndBounceEffect(void) { EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); EndBounceEffect(gActiveBattler, BOUNCE_MON); OakOldManBufferExecCompleted(); } static void OakOldManHandleSpriteInvisibility(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleBattleAnimation(void) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) OakOldManBufferExecCompleted(); else gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; } static void OakOldManHandleLinkStandbyMsg(void) { switch (gBattleBufferA[gActiveBattler][1]) { case 0: case 1: EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); EndBounceEffect(gActiveBattler, BOUNCE_MON); break; case 2: break; } OakOldManBufferExecCompleted(); } static void OakOldManHandleResetActionMoveSelection(void) { OakOldManBufferExecCompleted(); } static void OakOldManHandleCmd55(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); OakOldManBufferExecCompleted(); if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK) gBattlerControllerFuncs[gActiveBattler] = OakOldManSetBattleEndCallbacks; } static void OakOldManCmdEnd(void) { } bool8 BtlCtrl_OakOldMan_TestState2Flag(u8 mask) { return gBattleStruct->simulatedInputState[2] & mask; } void BtlCtrl_OakOldMan_SetState2Flag(u8 mask) { gBattleStruct->simulatedInputState[2] |= mask; } void BtlCtrl_DrawVoiceoverMessageFrame(void) { u32 width = 0x1A; u32 pal = 7; FillBgTilemapBufferRect(0, 0x30, 0, 0xE, 1, 1, pal); FillBgTilemapBufferRect(0, 0x31, 1, 0xE, 1, 1, pal); FillBgTilemapBufferRect(0, 0x32, 2, 0xE, width, 1, pal); FillBgTilemapBufferRect(0, 0x33, 0x1C, 0xE, 1, 1, pal); FillBgTilemapBufferRect(0, 0x34, 0x1D, 0xE, 1, 1, pal); FillBgTilemapBufferRect(0, 0x35, 0, 0xF, 1, 1, pal); FillBgTilemapBufferRect(0, 0x36, 1, 0xF, 1, 1, pal); FillBgTilemapBufferRect(0, 0x38, 0x1C, 0xF, 1, 1, pal); FillBgTilemapBufferRect(0, 0x39, 0x1D, 0xF, 1, 1, pal); FillBgTilemapBufferRect(0, 0x3A, 0, 0x10, 1, 1, pal); FillBgTilemapBufferRect(0, 0x3B, 1, 0x10, 1, 1, pal); FillBgTilemapBufferRect(0, 0x3C, 0x1C, 0x10, 1, 1, pal); FillBgTilemapBufferRect(0, 0x3D, 0x1D, 0x10, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x3A), 0, 0x11, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x3B), 1, 0x11, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x3C), 0x1C, 0x11, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x3D), 0x1D, 0x11, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x35), 0, 0x12, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x36), 1, 0x12, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x38), 0x1C, 0x12, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x39), 0x1D, 0x12, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x30), 0, 0x13, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x31), 1, 0x13, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x32), 2, 0x13, width, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x33), 0x1C, 0x13, 1, 1, pal); FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x34), 0x1D, 0x13, 1, 1, pal); } void BtlCtrl_RemoveVoiceoverMessageFrame(void) { u32 pal = 0; u32 width = 0x1A; u32 height; FillBgTilemapBufferRect(0, 3, 0, 0xE, 1, 1, pal); height = 4; FillBgTilemapBufferRect(0, 4, 1, 0xE, 1, 1, pal); FillBgTilemapBufferRect(0, 5, 2, 0xE, width, 1, pal); FillBgTilemapBufferRect(0, 6, 0x1C, 0xE, 1, 1, pal); FillBgTilemapBufferRect(0, 7, 0x1D, 0xE, 1, 1, pal); FillBgTilemapBufferRect(0, 8, 0, 0xF, 1, height, pal); FillBgTilemapBufferRect(0, 9, 1, 0xF, 1, height, pal); FillBgTilemapBufferRect(0, 0xA, 2, 0xF, width, height, pal); FillBgTilemapBufferRect(0, 0xB, 0x1C, 0xF, 1, height, pal); FillBgTilemapBufferRect(0, 0xC, 0x1D, 0xF, 1, height, pal); FillBgTilemapBufferRect(0, 0xD, 0, 0x13, 1, 1, pal); FillBgTilemapBufferRect(0, 0xE, 1, 0x13, 1, 1, pal); FillBgTilemapBufferRect(0, 0xF, 2, 0x13, width, 1, pal); FillBgTilemapBufferRect(0, 0x10, 0x1C, 0x13, 1, 1, pal); FillBgTilemapBufferRect(0, 0x11, 0x1D, 0x13, 1, 1, pal); } ================================================ FILE: src/battle_controller_opponent.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "m4a.h" #include "task.h" #include "util.h" #include "pokeball.h" #include "random.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_message.h" #include "battle_interface.h" #include "battle_tower.h" #include "battle_gfx_sfx_util.h" #include "battle_ai_script_commands.h" #include "battle_ai_switch_items.h" #include "event_data.h" #include "trainer_tower.h" #include "constants/battle_anim.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/sound.h" static void OpponentHandleGetMonData(void); static void OpponentHandleGetRawMonData(void); static void OpponentHandleSetMonData(void); static void OpponentHandleSetRawMonData(void); static void OpponentHandleLoadMonSprite(void); static void OpponentHandleSwitchInAnim(void); static void OpponentHandleReturnMonToBall(void); static void OpponentHandleDrawTrainerPic(void); static void OpponentHandleTrainerSlide(void); static void OpponentHandleTrainerSlideBack(void); static void OpponentHandleFaintAnimation(void); static void OpponentHandlePaletteFade(void); static void OpponentHandleSuccessBallThrowAnim(void); static void OpponentHandleBallThrowAnim(void); static void OpponentHandlePause(void); static void OpponentHandleMoveAnimation(void); static void OpponentHandlePrintString(void); static void OpponentHandlePrintSelectionString(void); static void OpponentHandleChooseAction(void); static void OpponentHandleUnknownYesNoBox(void); static void OpponentHandleChooseMove(void); static void OpponentHandleChooseItem(void); static void OpponentHandleChoosePokemon(void); static void OpponentHandleCmd23(void); static void OpponentHandleHealthBarUpdate(void); static void OpponentHandleExpUpdate(void); static void OpponentHandleStatusIconUpdate(void); static void OpponentHandleStatusAnimation(void); static void OpponentHandleStatusXor(void); static void OpponentHandleDataTransfer(void); static void OpponentHandleDMA3Transfer(void); static void OpponentHandlePlayBGM(void); static void OpponentHandleCmd32(void); static void OpponentHandleTwoReturnValues(void); static void OpponentHandleChosenMonReturnValue(void); static void OpponentHandleOneReturnValue(void); static void OpponentHandleOneReturnValue_Duplicate(void); static void OpponentHandleCmd37(void); static void OpponentHandleCmd38(void); static void OpponentHandleCmd39(void); static void OpponentHandleCmd40(void); static void OpponentHandleHitAnimation(void); static void OpponentHandleCmd42(void); static void OpponentHandlePlaySE(void); static void OpponentHandlePlayFanfare(void); static void OpponentHandleFaintingCry(void); static void OpponentHandleIntroSlide(void); static void OpponentHandleIntroTrainerBallThrow(void); static void OpponentHandleDrawPartyStatusSummary(void); static void OpponentHandleHidePartyStatusSummary(void); static void OpponentHandleEndBounceEffect(void); static void OpponentHandleSpriteInvisibility(void); static void OpponentHandleBattleAnimation(void); static void OpponentHandleLinkStandbyMsg(void); static void OpponentHandleResetActionMoveSelection(void); static void OpponentHandleCmd55(void); static void OpponentCmdEnd(void); static void OpponentBufferRunCommand(void); static u32 GetOpponentMonData(u8 monId, u8 *dst); static void SetOpponentMonData(u8 monId); static void DoSwitchOutAnimation(void); static void OpponentDoMoveAnimation(void); static void SwitchIn_HandleSoundAndEnd(void); static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void Task_StartSendOutAnim(u8 taskId); static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); static void EndDrawPartyStatusSummary(void); static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { [CONTROLLER_GETMONDATA] = OpponentHandleGetMonData, [CONTROLLER_GETRAWMONDATA] = OpponentHandleGetRawMonData, [CONTROLLER_SETMONDATA] = OpponentHandleSetMonData, [CONTROLLER_SETRAWMONDATA] = OpponentHandleSetRawMonData, [CONTROLLER_LOADMONSPRITE] = OpponentHandleLoadMonSprite, [CONTROLLER_SWITCHINANIM] = OpponentHandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = OpponentHandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = OpponentHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = OpponentHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = OpponentHandleFaintAnimation, [CONTROLLER_PALETTEFADE] = OpponentHandlePaletteFade, [CONTROLLER_SUCCESSBALLTHROWANIM] = OpponentHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = OpponentHandleBallThrowAnim, [CONTROLLER_PAUSE] = OpponentHandlePause, [CONTROLLER_MOVEANIMATION] = OpponentHandleMoveAnimation, [CONTROLLER_PRINTSTRING] = OpponentHandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = OpponentHandlePrintSelectionString, [CONTROLLER_CHOOSEACTION] = OpponentHandleChooseAction, [CONTROLLER_UNKNOWNYESNOBOX] = OpponentHandleUnknownYesNoBox, [CONTROLLER_CHOOSEMOVE] = OpponentHandleChooseMove, [CONTROLLER_OPENBAG] = OpponentHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = OpponentHandleChoosePokemon, [CONTROLLER_23] = OpponentHandleCmd23, [CONTROLLER_HEALTHBARUPDATE] = OpponentHandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = OpponentHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = OpponentHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = OpponentHandleStatusAnimation, [CONTROLLER_STATUSXOR] = OpponentHandleStatusXor, [CONTROLLER_DATATRANSFER] = OpponentHandleDataTransfer, [CONTROLLER_DMA3TRANSFER] = OpponentHandleDMA3Transfer, [CONTROLLER_PLAYBGM] = OpponentHandlePlayBGM, [CONTROLLER_32] = OpponentHandleCmd32, [CONTROLLER_TWORETURNVALUES] = OpponentHandleTwoReturnValues, [CONTROLLER_CHOSENMONRETURNVALUE] = OpponentHandleChosenMonReturnValue, [CONTROLLER_ONERETURNVALUE] = OpponentHandleOneReturnValue, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = OpponentHandleOneReturnValue_Duplicate, [CONTROLLER_CLEARUNKVAR] = OpponentHandleCmd37, [CONTROLLER_SETUNKVAR] = OpponentHandleCmd38, [CONTROLLER_CLEARUNKFLAG] = OpponentHandleCmd39, [CONTROLLER_TOGGLEUNKFLAG] = OpponentHandleCmd40, [CONTROLLER_HITANIMATION] = OpponentHandleHitAnimation, [CONTROLLER_CANTSWITCH] = OpponentHandleCmd42, [CONTROLLER_PLAYSE] = OpponentHandlePlaySE, [CONTROLLER_PLAYFANFARE] = OpponentHandlePlayFanfare, [CONTROLLER_FAINTINGCRY] = OpponentHandleFaintingCry, [CONTROLLER_INTROSLIDE] = OpponentHandleIntroSlide, [CONTROLLER_INTROTRAINERBALLTHROW] = OpponentHandleIntroTrainerBallThrow, [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = OpponentHandleDrawPartyStatusSummary, [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = OpponentHandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = OpponentHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = OpponentHandleSpriteInvisibility, [CONTROLLER_BATTLEANIMATION] = OpponentHandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = OpponentHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = OpponentHandleResetActionMoveSelection, [CONTROLLER_ENDLINKBATTLE] = OpponentHandleCmd55, [CONTROLLER_TERMINATOR_NOP] = OpponentCmdEnd }; // unknown unused data static const u8 sUnused[] = { 0xB0, 0xB0, 0xC8, 0x98, 0x28, 0x28, 0x28, 0x20 }; static void OpponentDummy(void) { } void SetControllerToOpponent(void) { gBattlerControllerFuncs[gActiveBattler] = OpponentBufferRunCommand; } static void OpponentBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { if (gBattleBufferA[gActiveBattler][0] < NELEMS(sOpponentBufferCommands)) sOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]](); else OpponentBufferExecCompleted(); } } static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) OpponentBufferExecCompleted(); } static void CompleteOnBattlerSpriteCallbackDummy2(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) OpponentBufferExecCompleted(); } static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { FreeTrainerFrontPicPaletteAndTile(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = gSprites[gBattlerSpriteIds[gActiveBattler]].data[5]; FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); OpponentBufferExecCompleted(); } } static void Intro_DelayAndEnd(void) { if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; OpponentBufferExecCompleted(); } } static void Intro_WaitForShinyAnimAndHealthbox(void) { bool8 var = FALSE; if (!IsDoubleBattle() || ((IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) var = TRUE; } else if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == gSprites[gHealthboxSpriteIds[gActiveBattler]].callback) { var = TRUE; } if (IsCryPlayingOrClearCrySongs()) var = FALSE; if (var && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); if (gBattleTypeFlags & BATTLE_TYPE_MULTI) m4aMPlayContinue(&gMPlayInfo_BGM); else m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } static void Intro_TryShinyAnimShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); SetBattlerShadowSpriteCallback(gActiveBattler ^ BIT_FLANK, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], MON_DATA_SPECIES)); } DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } static void TryShinyAnimAfterMonAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded == TRUE && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) { TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); OpponentBufferExecCompleted(); } } } static void CompleteOnHealthbarDone(void) { s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); if (hpValue != -1) { UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT); } else { if (!BtlCtrl_OakOldMan_TestState2Flag(1) && (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)) { BtlCtrl_OakOldMan_SetState2Flag(1); gBattlerControllerFuncs[gActiveBattler] = PrintOakText_InflictingDamageIsKey; } else { OpponentBufferExecCompleted(); } } } static void HideHealthboxAfterMonFaint(void) { if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse) { SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); OpponentBufferExecCompleted(); } } static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); HideBattlerShadowSprite(gActiveBattler); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); OpponentBufferExecCompleted(); } } static void CompleteOnInactiveTextPrinter(void) { if (!IsTextPrinterActive(0)) OpponentBufferExecCompleted(); } static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBattlerSpriteIds[gActiveBattler]; if (gSprites[spriteId].data[1] == 32) { gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; OpponentBufferExecCompleted(); } else { if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; ++gSprites[spriteId].data[1]; } } static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; } } static void SwitchIn_HandleSoundAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); OpponentBufferExecCompleted(); } } static void SwitchIn_ShowHealthbox(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); CopyBattleSpriteInvisibility(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } static void SwitchIn_TryShinyAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } static void CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) OpponentBufferExecCompleted(); } static void CompleteOnFinishedBattleAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) OpponentBufferExecCompleted(); } void OpponentBufferExecCompleted(void) { gBattlerControllerFuncs[gActiveBattler] = OpponentBufferRunCommand; gBattleControllerExecFlags &= ~gBitTable[gActiveBattler]; } static void OpponentHandleGetMonData(void) { u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; if (!gBattleBufferA[gActiveBattler][2]) { size += GetOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; ++i) { if (monToCheck & 1) size += GetOpponentMonData(i, monData + size); monToCheck >>= 1; } } BtlController_EmitDataTransfer(BUFFER_B, size, monData); OpponentBufferExecCompleted(); } static u32 GetOpponentMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; u8 nickname[20]; u8 *src; s16 data16; u32 data32; s32 size = 0; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); for (size = 0; size < MAX_MON_MOVES; ++size) { battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); } battleMon.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); battleMon.friendship = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP); battleMon.experience = GetMonData(&gEnemyParty[monId], MON_DATA_EXP); battleMon.hpIV = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); battleMon.attackIV = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); battleMon.defenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); battleMon.speedIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); battleMon.spAttackIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); battleMon.spDefenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); battleMon.personality = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY); battleMon.status1 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS); battleMon.level = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL); battleMon.hp = GetMonData(&gEnemyParty[monId], MON_DATA_HP); battleMon.maxHP = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP); battleMon.attack = GetMonData(&gEnemyParty[monId], MON_DATA_ATK); battleMon.defense = GetMonData(&gEnemyParty[monId], MON_DATA_DEF); battleMon.speed = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); battleMon.isEgg = GetMonData(&gEnemyParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gEnemyParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); GetMonData(&gEnemyParty[monId], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(battleMon.nickname, nickname); GetMonData(&gEnemyParty[monId], MON_DATA_OT_NAME, battleMon.otName); src = (u8 *)&battleMon; for (size = 0; size < sizeof(battleMon); ++size) dst[size] = src[size]; break; case REQUEST_SPECIES_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_HELDITEM_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MOVES_PP_BATTLE: for (size = 0; size < MAX_MON_MOVES; ++size) { moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); src = (u8 *)(&moveData); for (size = 0; size < sizeof(moveData); ++size) dst[size] = src[size]; break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_PP_DATA_BATTLE: for (size = 0; size < MAX_MON_MOVES; ++size) dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); ++size; break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: data32 = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_EXP_BATTLE: data32 = GetMonData(&gEnemyParty[monId], MON_DATA_EXP); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_HP_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_EV); size = 1; break; case REQUEST_ATK_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV); size = 1; break; case REQUEST_DEF_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV); size = 1; break; case REQUEST_SPEED_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV); size = 1; break; case REQUEST_SPATK_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV); size = 1; break; case REQUEST_SPDEF_EV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV); size = 1; break; case REQUEST_FRIENDSHIP_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP); size = 1; break; case REQUEST_POKERUS_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKERUS); size = 1; break; case REQUEST_MET_LOCATION_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION); size = 1; break; case REQUEST_MET_LEVEL_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL); size = 1; break; case REQUEST_MET_GAME_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME); size = 1; break; case REQUEST_POKEBALL_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL); size = 1; break; case REQUEST_ALL_IVS_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); dst[1] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); dst[2] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); dst[3] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); dst[4] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); dst[5] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); size = 6; break; case REQUEST_HP_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); size = 1; break; case REQUEST_ATK_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); size = 1; break; case REQUEST_DEF_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); size = 1; break; case REQUEST_SPEED_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); size = 1; break; case REQUEST_SPATK_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); size = 1; break; case REQUEST_SPDEF_IV_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); size = 1; break; case REQUEST_PERSONALITY_BATTLE: data32 = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_CHECKSUM_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_STATUS_BATTLE: data32 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_LEVEL_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL); size = 1; break; case REQUEST_HP_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MAX_HP_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_ATK_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_ATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_DEF_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_DEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPEED_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPATK_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPDEF_BATTLE: data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_COOL_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL); size = 1; break; case REQUEST_BEAUTY_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY); size = 1; break; case REQUEST_CUTE_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE); size = 1; break; case REQUEST_SMART_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART); size = 1; break; case REQUEST_TOUGH_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH); size = 1; break; case REQUEST_SHEEN_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SHEEN); size = 1; break; case REQUEST_COOL_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON); size = 1; break; case REQUEST_BEAUTY_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON); size = 1; break; case REQUEST_CUTE_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON); size = 1; break; case REQUEST_SMART_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON); size = 1; break; case REQUEST_TOUGH_RIBBON_BATTLE: dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON); size = 1; break; } return size; } static void OpponentHandleGetRawMonData(void) { struct BattlePokemon battleMon; u8 *src = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBattler][1]; u32 i; for (i = 0; i < gBattleBufferA[gActiveBattler][2]; ++i) dst[i] = src[i]; BtlController_EmitDataTransfer(BUFFER_B, gBattleBufferA[gActiveBattler][2], dst); OpponentBufferExecCompleted(); } static void OpponentHandleSetMonData(void) { u8 monToCheck; u32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { SetOpponentMonData(gBattlerPartyIndexes[gActiveBattler]); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; ++i) { if (monToCheck & 1) SetOpponentMonData(i); monToCheck >>= 1; } } OpponentBufferExecCompleted(); } static void SetOpponentMonData(u8 monId) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; s32 i; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { u8 iv; SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < MAX_MON_MOVES; ++i) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &iv); SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality); SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &battlePokemon->status1); SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &battlePokemon->level); SetMonData(&gEnemyParty[monId], MON_DATA_HP, &battlePokemon->hp); SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP); SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &battlePokemon->attack); SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &battlePokemon->defense); SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &battlePokemon->speed); SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack); SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case REQUEST_SPECIES_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; ++i) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; } } static void OpponentHandleSetRawMonData(void) { u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; u32 i; for (i = 0; i < gBattleBufferA[gActiveBattler][2]; ++i) dst[i] = gBattleBufferA[gActiveBattler][3 + i]; OpponentBufferExecCompleted(); } static void OpponentHandleLoadMonSprite(void) { u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); u32 y; if (gBattleTypeFlags & BATTLE_TYPE_GHOST) { DecompressGhostFrontPic(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); y = GetGhostSpriteDefault_Y(gActiveBattler); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = TRUE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = TRUE; } else { BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); y = GetBattlerSpriteDefault_Y(gActiveBattler); } SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2), y, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = 0; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = species; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); if (!(gBattleTypeFlags & BATTLE_TYPE_GHOST)) SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); gBattlerControllerFuncs[gActiveBattler] = TryShinyAnimAfterMonAnim; } static void OpponentHandleSwitchInAnim(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = 6; gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void OpponentHandleReturnMonToBall(void) { if (!gBattleBufferA[gActiveBattler][1]) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; } else { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); HideBattlerShadowSprite(gActiveBattler); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); OpponentBufferExecCompleted(); } } static void DoSwitchOutAnimation(void) { switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON); gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } static void OpponentHandleDrawTrainerPic(void) { u32 trainerPicId; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) trainerPicId = GetSecretBaseTrainerPicIndex(); else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) trainerPicId = GetBattleTowerTrainerFrontSpriteId(); else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) trainerPicId = GetTrainerTowerTrainerFrontSpriteId(); else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) trainerPicId = GetEreaderTrainerFrontSpriteId(); else trainerPicId = sTrainers[gTrainerBattleOpponent_A].trainerPic; DecompressTrainerFrontPic(trainerPicId, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 176, (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 240; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void OpponentHandleTrainerSlide(void) { u32 trainerPicId; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) trainerPicId = GetSecretBaseTrainerPicIndex(); else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) trainerPicId = GetBattleTowerTrainerFrontSpriteId(); else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) trainerPicId = GetTrainerTowerTrainerFrontSpriteId(); else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) trainerPicId = GetEreaderTrainerFrontSpriteId(); else trainerPicId = sTrainers[gTrainerBattleOpponent_A].trainerPic; DecompressTrainerFrontPic(trainerPicId, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 176, (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40, 30); gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = 96; gSprites[gBattlerSpriteIds[gActiveBattler]].x += 32; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy2; } static void OpponentHandleTrainerSlideBack(void) { SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } static void OpponentHandleFaintAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState; } else { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET); gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; gBattlerControllerFuncs[gActiveBattler] = HideHealthboxAfterMonFaint; } } } static void OpponentHandlePaletteFade(void) { OpponentBufferExecCompleted(); } static void OpponentHandleSuccessBallThrowAnim(void) { OpponentBufferExecCompleted(); } static void OpponentHandleBallThrowAnim(void) { OpponentBufferExecCompleted(); } static void OpponentHandlePause(void) { OpponentBufferExecCompleted(); } static void OpponentHandleMoveAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); gAnimFriendship = gBattleBufferA[gActiveBattler][10]; gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { OpponentBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = OpponentDoMoveAnimation; } } } static void OpponentDoMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); u8 multihit = gBattleBufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8) { gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } break; case 2: gAnimScriptCallback(); if (!gAnimScriptActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3; } break; case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; OpponentBufferExecCompleted(); } break; } } static void OpponentHandlePrintString(void) { u16 *stringId; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); if (BattleStringShouldBeColored(*stringId)) BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT)); else BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { switch (*stringId) { case 0x17F: gBattlerControllerFuncs[gActiveBattler] = PrintOakText_HowDisappointing; return; case 0xE3: gBattlerControllerFuncs[gActiveBattler] = PrintOakText_OakNoRunningFromATrainer; return; } } gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } static void OpponentHandlePrintSelectionString(void) { OpponentBufferExecCompleted(); } static void OpponentHandleChooseAction(void) { AI_TrySwitchOrUseItem(); OpponentBufferExecCompleted(); } static void OpponentHandleUnknownYesNoBox(void) { OpponentBufferExecCompleted(); } static void OpponentHandleChooseMove(void) { u8 chosenMoveId; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]); if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER)) { BattleAI_SetupAIData(); chosenMoveId = BattleAI_ChooseMoveOrAction(); switch (chosenMoveId) { case AI_CHOICE_WATCH: BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); break; case AI_CHOICE_FLEE: BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0); break; default: if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) gBattlerTarget = gActiveBattler; if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_BOTH) { gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gBattlerTarget << 8)); break; } OpponentBufferExecCompleted(); } else { u16 move; do { chosenMoveId = Random() & 3; move = moveInfo->moves[chosenMoveId]; } while (move == MOVE_NONE); if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gActiveBattler << 8)); else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); else BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); OpponentBufferExecCompleted(); } } static void OpponentHandleChooseItem(void) { BtlController_EmitOneReturnValue(1, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2)); OpponentBufferExecCompleted(); } static void OpponentHandleChoosePokemon(void) { s32 chosenMonId; if (*(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) == PARTY_SIZE) { chosenMonId = GetMostSuitableMonToSwitchInto(); if (chosenMonId == PARTY_SIZE) { s32 battler1, battler2; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { battler2 = battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); } else { battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } for (chosenMonId = 0; chosenMonId < PARTY_SIZE; ++chosenMonId) if (GetMonData(&gEnemyParty[chosenMonId], MON_DATA_HP) != 0 && chosenMonId != gBattlerPartyIndexes[battler1] && chosenMonId != gBattlerPartyIndexes[battler2]) break; } } else { chosenMonId = *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)); *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE; } *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId; BtlController_EmitChosenMonReturnValue(1, chosenMonId, NULL); OpponentBufferExecCompleted(); } static void OpponentHandleCmd23(void) { OpponentBufferExecCompleted(); } static void OpponentHandleHealthBarUpdate(void) { s16 hpVal; LoadBattleBarGfx(0); hpVal = (gBattleBufferA[gActiveBattler][3] << 8) | gBattleBufferA[gActiveBattler][2]; if (hpVal != INSTANT_HP_BAR_DROP) { u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); u32 curHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal); } else { u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal); } gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone; } static void OpponentHandleExpUpdate(void) { OpponentBufferExecCompleted(); } static void OpponentHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); battlerId = gActiveBattler; gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = FALSE; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void OpponentHandleStatusAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void OpponentHandleStatusXor(void) { OpponentBufferExecCompleted(); } static void OpponentHandleDataTransfer(void) { OpponentBufferExecCompleted(); } static void OpponentHandleDMA3Transfer(void) { OpponentBufferExecCompleted(); } static void OpponentHandlePlayBGM(void) { OpponentBufferExecCompleted(); } static void OpponentHandleCmd32(void) { OpponentBufferExecCompleted(); } static void OpponentHandleTwoReturnValues(void) { OpponentBufferExecCompleted(); } static void OpponentHandleChosenMonReturnValue(void) { OpponentBufferExecCompleted(); } static void OpponentHandleOneReturnValue(void) { OpponentBufferExecCompleted(); } static void OpponentHandleOneReturnValue_Duplicate(void) { OpponentBufferExecCompleted(); } static void OpponentHandleCmd37(void) { gUnusedControllerStruct.unk = 0; OpponentBufferExecCompleted(); } static void OpponentHandleCmd38(void) { gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; OpponentBufferExecCompleted(); } static void OpponentHandleCmd39(void) { gUnusedControllerStruct.flag = 0; OpponentBufferExecCompleted(); } static void OpponentHandleCmd40(void) { gUnusedControllerStruct.flag ^= 1; OpponentBufferExecCompleted(); } static void OpponentHandleHitAnimation(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE) { OpponentBufferExecCompleted(); } else { gDoingBattleAnim = TRUE; gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect; } } static void OpponentHandleCmd42(void) { OpponentBufferExecCompleted(); } static void OpponentHandlePlaySE(void) { s8 pan; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) pan = SOUND_PAN_ATTACKER; else pan = SOUND_PAN_TARGET; PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); OpponentBufferExecCompleted(); } static void OpponentHandlePlayFanfare(void) { PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); OpponentBufferExecCompleted(); } static void OpponentHandleFaintingCry(void) { u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); PlayCry_ByMode(species, 25, CRY_MODE_FAINT); OpponentBufferExecCompleted(); } static void OpponentHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; OpponentBufferExecCompleted(); } static void OpponentHandleIntroTrainerBallThrow(void) { u8 paletteNum; u8 taskId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreeOpponentSprite); taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; gBattlerControllerFuncs[gActiveBattler] = OpponentDummy; } static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) { FreeTrainerFrontPicPaletteAndTile(sprite->oam.affineParam); sprite->oam.tileNum = sprite->data[5]; FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } static void Task_StartSendOutAnim(u8 taskId) { u8 savedActiveBattler = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBattler; DestroyTask(taskId); } static void OpponentHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { OpponentBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE; if (gBattleBufferA[gActiveBattler][2]) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay < 2) { ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay; return; } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay = 0; } } gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2]) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0x5D; gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } static void EndDrawPartyStatusSummary(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 0x5C) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; OpponentBufferExecCompleted(); } } static void OpponentHandleHidePartyStatusSummary(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; OpponentBufferExecCompleted(); } static void OpponentHandleEndBounceEffect(void) { OpponentBufferExecCompleted(); } static void OpponentHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } OpponentBufferExecCompleted(); } static void OpponentHandleBattleAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) OpponentBufferExecCompleted(); else gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; } } static void OpponentHandleLinkStandbyMsg(void) { OpponentBufferExecCompleted(); } static void OpponentHandleResetActionMoveSelection(void) { OpponentBufferExecCompleted(); } static void OpponentHandleCmd55(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) { gMain.inBattle = 0; gMain.callback1 = gPreBattleCallback1; SetMainCallback2(gMain.savedCallback); } OpponentBufferExecCompleted(); } static void OpponentCmdEnd(void) { } ================================================ FILE: src/battle_controller_player.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "item.h" #include "item_menu.h" #include "link.h" #include "m4a.h" #include "party_menu.h" #include "pokeball.h" #include "strings.h" #include "pokemon_special_anim.h" #include "task.h" #include "util.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_message.h" #include "battle_script_commands.h" #include "reshow_battle_screen.h" #include "constants/battle_anim.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/sound.h" static void PlayerHandleGetMonData(void); static void PlayerHandleSetMonData(void); static void PlayerHandleSetRawMonData(void); static void PlayerHandleLoadMonSprite(void); static void PlayerHandleSwitchInAnim(void); static void PlayerHandleReturnMonToBall(void); static void PlayerHandleDrawTrainerPic(void); static void PlayerHandleTrainerSlide(void); static void PlayerHandleTrainerSlideBack(void); static void PlayerHandleFaintAnimation(void); static void PlayerHandlePaletteFade(void); static void PlayerHandleSuccessBallThrowAnim(void); static void PlayerHandleBallThrowAnim(void); static void PlayerHandlePause(void); static void PlayerHandleMoveAnimation(void); static void PlayerHandlePrintString(void); static void PlayerHandlePrintSelectionString(void); static void PlayerHandleChooseAction(void); static void PlayerHandleUnknownYesNoBox(void); static void PlayerHandleChooseMove(void); static void PlayerHandleChooseItem(void); static void PlayerHandleChoosePokemon(void); static void PlayerHandleCmd23(void); static void PlayerHandleHealthBarUpdate(void); static void PlayerHandleExpUpdate(void); static void PlayerHandleStatusIconUpdate(void); static void PlayerHandleStatusAnimation(void); static void PlayerHandleStatusXor(void); static void PlayerHandleDataTransfer(void); static void PlayerHandleDMA3Transfer(void); static void PlayerHandlePlayBGM(void); static void PlayerHandleCmd32(void); static void PlayerHandleTwoReturnValues(void); static void PlayerHandleChosenMonReturnValue(void); static void PlayerHandleOneReturnValue(void); static void PlayerHandleOneReturnValue_Duplicate(void); static void PlayerHandleCmd37(void); static void PlayerHandleCmd38(void); static void PlayerHandleCmd39(void); static void PlayerHandleCmd40(void); static void PlayerHandleHitAnimation(void); static void PlayerHandleCmd42(void); static void PlayerHandlePlaySE(void); static void PlayerHandlePlayFanfare(void); static void PlayerHandleFaintingCry(void); static void PlayerHandleIntroSlide(void); static void PlayerHandleIntroTrainerBallThrow(void); static void PlayerHandleDrawPartyStatusSummary(void); static void PlayerHandleHidePartyStatusSummary(void); static void PlayerHandleEndBounceEffect(void); static void PlayerHandleSpriteInvisibility(void); static void PlayerHandleBattleAnimation(void); static void PlayerHandleLinkStandbyMsg(void); static void PlayerHandleResetActionMoveSelection(void); static void PlayerHandleCmd55(void); static void PlayerCmdEnd(void); static void PlayerBufferRunCommand(void); static void HandleInputChooseTarget(void); static void MoveSelectionDisplayPpNumber(void); static void MoveSelectionDisplayPpString(void); static void MoveSelectionDisplayMoveType(void); static void MoveSelectionDisplayMoveNames(void); static void HandleMoveSwitching(void); static void WaitForMonSelection(void); static void CompleteWhenChoseItem(void); static void Task_LaunchLvlUpAnim(u8 taskId); static void Task_PrepareToGiveExpWithExpBar(u8 taskId); static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId); static void Task_UpdateLvlInHealthbox(u8 taskId); static void PrintLinkStandbyMsg(void); static u32 CopyPlayerMonData(u8 monId, u8 *dst); static void SetPlayerMonData(u8 monId); static void DoSwitchOutAnimation(void); static void PlayerDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); static void PreviewDeterminativeMoveTargets(void); static void SwitchIn_HandleSoundAndEnd(void); static void Task_GiveExpWithExpBar(u8 taskId); static void Task_CreateLevelUpVerticalStripes(u8 taskId); static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void EndDrawPartyStatusSummary(void); extern u8 GetWeatherBallType(void); extern u8 GetHiddenPowerType(struct Pokemon * mon); extern const u16 gNaturePowerMoves[]; static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { [CONTROLLER_GETMONDATA] = PlayerHandleGetMonData, [CONTROLLER_GETRAWMONDATA] = PlayerHandleGetRawMonData, [CONTROLLER_SETMONDATA] = PlayerHandleSetMonData, [CONTROLLER_SETRAWMONDATA] = PlayerHandleSetRawMonData, [CONTROLLER_LOADMONSPRITE] = PlayerHandleLoadMonSprite, [CONTROLLER_SWITCHINANIM] = PlayerHandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = PlayerHandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = PlayerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = PlayerHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = PlayerHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = PlayerHandleFaintAnimation, [CONTROLLER_PALETTEFADE] = PlayerHandlePaletteFade, [CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, [CONTROLLER_PAUSE] = PlayerHandlePause, [CONTROLLER_MOVEANIMATION] = PlayerHandleMoveAnimation, [CONTROLLER_PRINTSTRING] = PlayerHandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = PlayerHandlePrintSelectionString, [CONTROLLER_CHOOSEACTION] = PlayerHandleChooseAction, [CONTROLLER_UNKNOWNYESNOBOX] = PlayerHandleUnknownYesNoBox, [CONTROLLER_CHOOSEMOVE] = PlayerHandleChooseMove, [CONTROLLER_OPENBAG] = PlayerHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = PlayerHandleChoosePokemon, [CONTROLLER_23] = PlayerHandleCmd23, [CONTROLLER_HEALTHBARUPDATE] = PlayerHandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = PlayerHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = PlayerHandleStatusAnimation, [CONTROLLER_STATUSXOR] = PlayerHandleStatusXor, [CONTROLLER_DATATRANSFER] = PlayerHandleDataTransfer, [CONTROLLER_DMA3TRANSFER] = PlayerHandleDMA3Transfer, [CONTROLLER_PLAYBGM] = PlayerHandlePlayBGM, [CONTROLLER_32] = PlayerHandleCmd32, [CONTROLLER_TWORETURNVALUES] = PlayerHandleTwoReturnValues, [CONTROLLER_CHOSENMONRETURNVALUE] = PlayerHandleChosenMonReturnValue, [CONTROLLER_ONERETURNVALUE] = PlayerHandleOneReturnValue, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PlayerHandleOneReturnValue_Duplicate, [CONTROLLER_CLEARUNKVAR] = PlayerHandleCmd37, [CONTROLLER_SETUNKVAR] = PlayerHandleCmd38, [CONTROLLER_CLEARUNKFLAG] = PlayerHandleCmd39, [CONTROLLER_TOGGLEUNKFLAG] = PlayerHandleCmd40, [CONTROLLER_HITANIMATION] = PlayerHandleHitAnimation, [CONTROLLER_CANTSWITCH] = PlayerHandleCmd42, [CONTROLLER_PLAYSE] = PlayerHandlePlaySE, [CONTROLLER_PLAYFANFARE] = PlayerHandlePlayFanfare, [CONTROLLER_FAINTINGCRY] = PlayerHandleFaintingCry, [CONTROLLER_INTROSLIDE] = PlayerHandleIntroSlide, [CONTROLLER_INTROTRAINERBALLTHROW] = PlayerHandleIntroTrainerBallThrow, [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = PlayerHandleDrawPartyStatusSummary, [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = PlayerHandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = PlayerHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = PlayerHandleSpriteInvisibility, [CONTROLLER_BATTLEANIMATION] = PlayerHandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = PlayerHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = PlayerHandleResetActionMoveSelection, [CONTROLLER_ENDLINKBATTLE] = PlayerHandleCmd55, [CONTROLLER_TERMINATOR_NOP] = PlayerCmdEnd, }; static const u8 sTargetIdentities[] = { B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT }; // unknown unused data static const u8 sUnused[] = { 0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58 }; void BattleControllerDummy(void) { } void SetControllerToPlayer(void) { gBattlerControllerFuncs[gActiveBattler] = PlayerBufferRunCommand; gDoingBattleAnim = FALSE; } static void PlayerBufferExecCompleted(void) { gBattlerControllerFuncs[gActiveBattler] = PlayerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { gBattleControllerExecFlags &= ~gBitTable[gActiveBattler]; } } static void PlayerBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { if (gBattleBufferA[gActiveBattler][0] < NELEMS(sPlayerBufferCommands)) sPlayerBufferCommands[gBattleBufferA[gActiveBattler][0]](); else PlayerBufferExecCompleted(); } } static void CompleteOnBattlerSpritePosX_0(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0) PlayerBufferExecCompleted(); } static void HandleInputChooseAction(void) { u16 itemId = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); switch (gActionSelectionCursor[gActiveBattler]) { case 0: BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0); break; case 1: BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0); break; case 2: BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); break; case 3: BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0); break; } PlayerBufferExecCompleted(); } else if (JOY_NEW(DPAD_LEFT)) { if (gActionSelectionCursor[gActiveBattler] & 1) // if is B_ACTION_USE_ITEM or B_ACTION_RUN { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 1; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(DPAD_RIGHT)) { if (!(gActionSelectionCursor[gActiveBattler] & 1)) // if is B_ACTION_USE_MOVE or B_ACTION_SWITCH { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 1; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(DPAD_UP)) { if (gActionSelectionCursor[gActiveBattler] & 2) // if is B_ACTION_SWITCH or B_ACTION_RUN { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 2; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(DPAD_DOWN)) { if (!(gActionSelectionCursor[gActiveBattler] & 2)) // if is B_ACTION_USE_MOVE or B_ACTION_USE_ITEM { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 2; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(B_BUTTON)) { if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { if (gBattleBufferA[gActiveBattler][1] == B_ACTION_USE_ITEM) { // Add item to bag if it is a ball if (itemId <= ITEM_PREMIER_BALL) AddBagItem(itemId, 1); else return; } PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(1, B_ACTION_CANCEL_PARTNER, 0); PlayerBufferExecCompleted(); } else { if(!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) //if wild, pressing B moves cursor to run { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] = 3; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } } else if (JOY_NEW(START_BUTTON)) { SwapHpBarsWithHpText(); } } // Unused static void EndBounceEffect2(void) { EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); EndBounceEffect(gActiveBattler, BOUNCE_MON); gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget; } static void HandleInputChooseTarget(void) { s32 i; u8 identities[4]; memcpy(identities, sTargetIdentities, NELEMS(sTargetIdentities)); DoBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX, 15, 1); i = 0; if (gBattlersCount != 0) { do { if (i != gMultiUsePlayerCursor) EndBounceEffect(i, BOUNCE_HEALTHBOX); ++i; } while (i < gBattlersCount); } if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); PlayerBufferExecCompleted(); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove; DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); } else if (JOY_NEW(DPAD_LEFT | DPAD_UP)) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; do { u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); for (i = 0; i < MAX_BATTLERS_COUNT; ++i) if (currSelIdentity == identities[i]) break; do { if (--i < 0) i = MAX_BATTLERS_COUNT; // UB: array out of range gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]); } while (gMultiUsePlayerCursor == gBattlersCount); i = 0; switch (GetBattlerPosition(gMultiUsePlayerCursor)) { case B_POSITION_PLAYER_LEFT: case B_POSITION_PLAYER_RIGHT: if (gActiveBattler != gMultiUsePlayerCursor) ++i; else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED) ++i; break; case B_POSITION_OPPONENT_LEFT: case B_POSITION_OPPONENT_RIGHT: ++i; break; } if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor]) i = 0; } while (i == 0); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget; } else if (JOY_NEW(DPAD_RIGHT | DPAD_DOWN)) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; do { u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); for (i = 0; i < MAX_BATTLERS_COUNT; ++i) if (currSelIdentity == identities[i]) break; do { if (++i > 3) i = 0; gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]); } while (gMultiUsePlayerCursor == gBattlersCount); i = 0; switch (GetBattlerPosition(gMultiUsePlayerCursor)) { case B_POSITION_PLAYER_LEFT: case B_POSITION_PLAYER_RIGHT: if (gActiveBattler != gMultiUsePlayerCursor) ++i; else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED) ++i; break; case B_POSITION_OPPONENT_LEFT: case B_POSITION_OPPONENT_RIGHT: ++i; break; } if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor]) i = 0; } while (i == 0); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget; } } void HandleInputChooseMove(void) { bool32 canSelectTarget = FALSE; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]); PreviewDeterminativeMoveTargets(); if (JOY_NEW(A_BUTTON)) { u8 moveTarget; PlaySE(SE_SELECT); if (moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] == MOVE_CURSE) { if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST) moveTarget = MOVE_TARGET_USER; else moveTarget = MOVE_TARGET_SELECTED; } else { moveTarget = gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].target; } if (moveTarget & MOVE_TARGET_USER) gMultiUsePlayerCursor = gActiveBattler; else gMultiUsePlayerCursor = GetBattlerAtPosition((GetBattlerPosition(gActiveBattler) & BIT_SIDE) ^ BIT_SIDE); if (!gBattleBufferA[gActiveBattler][1]) // not a double battle { if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleBufferA[gActiveBattler][2]) ++canSelectTarget; } else // double battle { if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER))) ++canSelectTarget; // either selected or user if (moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]] == 0) { canSelectTarget = FALSE; } else if (!(moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) <= 1) { gMultiUsePlayerCursor = GetDefaultMoveTarget(gActiveBattler); canSelectTarget = FALSE; } } ResetPaletteFadeControl(); BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE); if (!canSelectTarget) { BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); PlayerBufferExecCompleted(); } else { gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget; if (moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) gMultiUsePlayerCursor = gActiveBattler; else if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]) gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); else gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget; } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(1, 10, 0xFFFF); PlayerBufferExecCompleted(); ResetPaletteFadeControl(); BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE); } else if (JOY_NEW(DPAD_LEFT)) { if (gMoveSelectionCursor[gActiveBattler] & 1) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 1; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); MoveSelectionDisplayPpNumber(); MoveSelectionDisplayMoveType(); BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE); } } else if (JOY_NEW(DPAD_RIGHT)) { if (!(gMoveSelectionCursor[gActiveBattler] & 1) && (gMoveSelectionCursor[gActiveBattler] ^ 1) < gNumberOfMovesToChoose) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 1; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); MoveSelectionDisplayPpNumber(); MoveSelectionDisplayMoveType(); BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE); } } else if (JOY_NEW(DPAD_UP)) { if (gMoveSelectionCursor[gActiveBattler] & 2) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 2; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); MoveSelectionDisplayPpNumber(); MoveSelectionDisplayMoveType(); BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE); } } else if (JOY_NEW(DPAD_DOWN)) { if (!(gMoveSelectionCursor[gActiveBattler] & 2) && (gMoveSelectionCursor[gActiveBattler] ^ 2) < gNumberOfMovesToChoose) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 2; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); MoveSelectionDisplayPpNumber(); MoveSelectionDisplayMoveType(); BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE); } } else if (JOY_NEW(SELECT_BUTTON)) { if (gNumberOfMovesToChoose > 1 && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) { MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29); if (gMoveSelectionCursor[gActiveBattler] != 0) gMultiUsePlayerCursor = 0; else gMultiUsePlayerCursor = gMoveSelectionCursor[gActiveBattler] + 1; MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27); BattlePutTextOnWindow(gText_BattleSwitchWhich, B_WIN_SWITCH_PROMPT); gBattlerControllerFuncs[gActiveBattler] = HandleMoveSwitching; } } } // not used static u32 HandleMoveInputUnused(void) { u32 var = 0; if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); var = 1; } if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); gBattle_BG0_X = 0; gBattle_BG0_Y = 0x140; var = 0xFF; } if (JOY_NEW(DPAD_LEFT) && gMoveSelectionCursor[gActiveBattler] & 1) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 1; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); } if (JOY_NEW(DPAD_RIGHT) && !(gMoveSelectionCursor[gActiveBattler] & 1) && (gMoveSelectionCursor[gActiveBattler] ^ 1) < gNumberOfMovesToChoose) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 1; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); } if (JOY_NEW(DPAD_UP) && gMoveSelectionCursor[gActiveBattler] & 2) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 2; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); } if (JOY_NEW(DPAD_DOWN) && !(gMoveSelectionCursor[gActiveBattler] & 2) && (gMoveSelectionCursor[gActiveBattler] ^ 2) < gNumberOfMovesToChoose) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 2; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); } return var; } static void HandleMoveSwitching(void) { u8 perMovePPBonuses[4]; struct ChooseMoveStruct moveStruct; u8 totalPPBonuses; if (JOY_NEW(A_BUTTON | SELECT_BUTTON)) { PlaySE(SE_SELECT); if (gMoveSelectionCursor[gActiveBattler] != gMultiUsePlayerCursor) { struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]); s32 i; // swap moves and pp i = moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]; moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] = moveInfo->moves[gMultiUsePlayerCursor]; moveInfo->moves[gMultiUsePlayerCursor] = i; i = moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]]; moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]] = moveInfo->currentPp[gMultiUsePlayerCursor]; moveInfo->currentPp[gMultiUsePlayerCursor] = i; i = moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]]; moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]] = moveInfo->maxPp[gMultiUsePlayerCursor]; moveInfo->maxPp[gMultiUsePlayerCursor] = i; if (gDisableStructs[gActiveBattler].mimickedMoves & gBitTable[gMoveSelectionCursor[gActiveBattler]]) { gDisableStructs[gActiveBattler].mimickedMoves &= (~gBitTable[gMoveSelectionCursor[gActiveBattler]]); gDisableStructs[gActiveBattler].mimickedMoves |= gBitTable[gMultiUsePlayerCursor]; } MoveSelectionDisplayMoveNames(); for (i = 0; i < MAX_MON_MOVES; ++i) perMovePPBonuses[i] = (gBattleMons[gActiveBattler].ppBonuses & (3 << (i * 2))) >> (i * 2); totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]]; perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]] = perMovePPBonuses[gMultiUsePlayerCursor]; perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses; totalPPBonuses = 0; for (i = 0; i < MAX_MON_MOVES; ++i) totalPPBonuses |= perMovePPBonuses[i] << (i * 2); gBattleMons[gActiveBattler].ppBonuses = totalPPBonuses; for (i = 0; i < MAX_MON_MOVES; ++i) { gBattleMons[gActiveBattler].moves[i] = moveInfo->moves[i]; gBattleMons[gActiveBattler].pp[i] = moveInfo->currentPp[i]; } if (!(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { for (i = 0; i < MAX_MON_MOVES; ++i) { moveStruct.moves[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i); moveStruct.currentPp[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i); } totalPPBonuses = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES); for (i = 0; i < MAX_MON_MOVES; ++i) perMovePPBonuses[i] = (totalPPBonuses & (3 << (i * 2))) >> (i * 2); i = moveStruct.moves[gMoveSelectionCursor[gActiveBattler]]; moveStruct.moves[gMoveSelectionCursor[gActiveBattler]] = moveStruct.moves[gMultiUsePlayerCursor]; moveStruct.moves[gMultiUsePlayerCursor] = i; i = moveStruct.currentPp[gMoveSelectionCursor[gActiveBattler]]; moveStruct.currentPp[gMoveSelectionCursor[gActiveBattler]] = moveStruct.currentPp[gMultiUsePlayerCursor]; moveStruct.currentPp[gMultiUsePlayerCursor] = i; totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]]; perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]] = perMovePPBonuses[gMultiUsePlayerCursor]; perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses; totalPPBonuses = 0; for (i = 0; i < MAX_MON_MOVES; ++i) totalPPBonuses |= perMovePPBonuses[i] << (i * 2); for (i = 0; i < MAX_MON_MOVES; ++i) { SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i, &moveStruct.moves[i]); SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i, &moveStruct.currentPp[i]); } SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES, &totalPPBonuses); } } if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) gBattlerControllerFuncs[gActiveBattler] = OakOldManHandleInputChooseMove; else gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove; gMoveSelectionCursor[gActiveBattler] = gMultiUsePlayerCursor; MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); MoveSelectionDisplayPpString(); MoveSelectionDisplayPpNumber(); MoveSelectionDisplayMoveType(); } if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor); MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) gBattlerControllerFuncs[gActiveBattler] = OakOldManHandleInputChooseMove; else gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove; MoveSelectionDisplayPpString(); MoveSelectionDisplayPpNumber(); MoveSelectionDisplayMoveType(); } if (JOY_NEW(DPAD_LEFT)) { if (gMultiUsePlayerCursor & 1) { if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler]) MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29); else MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor); gMultiUsePlayerCursor ^= 1; PlaySE(SE_SELECT); if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler]) MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0); else MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27); } } if (JOY_NEW(DPAD_RIGHT)) { if (!(gMultiUsePlayerCursor & 1) && (gMultiUsePlayerCursor ^ 1) < gNumberOfMovesToChoose) { if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler]) MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29); else MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor); gMultiUsePlayerCursor ^= 1; PlaySE(SE_SELECT); if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler]) MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0); else MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27); } } if (JOY_NEW(DPAD_UP)) { if (gMultiUsePlayerCursor & 2) { if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler]) MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29); else MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor); gMultiUsePlayerCursor ^= 2; PlaySE(SE_SELECT); if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler]) MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0); else MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27); } } if (JOY_NEW(DPAD_DOWN)) { if (!(gMultiUsePlayerCursor & 2) && (gMultiUsePlayerCursor ^ 2) < gNumberOfMovesToChoose) { if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler]) MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29); else MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor); gMultiUsePlayerCursor ^= 2; PlaySE(SE_SELECT); if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler]) MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0); else MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27); } } } static void SetLinkBattleEndCallbacks(void) { if (gWirelessCommType == 0) { if (!gReceivedRemoteLinkPlayers) { m4aSongNumStop(SE_LOW_HEALTH); gMain.inBattle = 0; gMain.callback1 = gPreBattleCallback1; SetMainCallback2(CB2_InitEndLinkBattle); FreeAllWindowBuffers(); } } else if (IsLinkTaskFinished()) { m4aSongNumStop(SE_LOW_HEALTH); gMain.inBattle = 0; gMain.callback1 = gPreBattleCallback1; SetMainCallback2(CB2_InitEndLinkBattle); FreeAllWindowBuffers(); } } void SetBattleEndCallbacks(void) { if (!gPaletteFade.active) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (gWirelessCommType == 0) SetCloseLinkCallback(); else SetLinkStandbyCallback(); gBattlerControllerFuncs[gActiveBattler] = SetLinkBattleEndCallbacks; } else { m4aSongNumStop(SE_LOW_HEALTH); gMain.inBattle = FALSE; gMain.callback1 = gPreBattleCallback1; SetMainCallback2(gMain.savedCallback); } } } static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) PlayerBufferExecCompleted(); } static void CompleteOnBattlerSpriteCallbackDummy2(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) PlayerBufferExecCompleted(); } static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { BattleGfxSfxDummy3(gSaveBlock2Ptr->playerGender); FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); PlayerBufferExecCompleted(); } } static void Intro_DelayAndEnd(void) { if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; PlayerBufferExecCompleted(); } } static void Intro_WaitForShinyAnimAndHealthbox(void) { bool8 var = FALSE; if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) var = TRUE; } else { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) var = TRUE; } if (IsCryPlayingOrClearCrySongs()) var = FALSE; if (var && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); if (gBattleTypeFlags & BATTLE_TYPE_MULTI) m4aMPlayContinue(&gMPlayInfo_BGM); else m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); if (IsDoubleBattle()) HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], gActiveBattler ^ BIT_FLANK); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } static void Intro_TryShinyAnimShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim) TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } static void SwitchIn_CleanShinyAnimShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; } } static void SwitchIn_HandleSoundAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlayerBufferExecCompleted(); } } static void SwitchIn_TryShinyAnimShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !(gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); CopyBattleSpriteInvisibility(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_CleanShinyAnimShowSubstitute; } } void Task_PlayerController_RestoreBgmAfterCry(u8 taskId) { if (!IsCryPlayingOrClearCrySongs()) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); DestroyTask(taskId); } } static void CompleteOnHealthbarDone(void) { s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); if (hpValue != -1) { UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT); } else { HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlayerBufferExecCompleted(); } } void CompleteOnInactiveTextPrinter(void) { if (!IsTextPrinterActive(0)) PlayerBufferExecCompleted(); } #define tExpTask_monId data[0] #define tExpTask_gainedExp data[1] #define tExpTask_battler data[2] #define tExpTask_frames data[10] // TODO: document other used fields static void Task_GiveExpToMon(u8 taskId) { u32 monId = (u8)(gTasks[taskId].tExpTask_monId); u8 battlerId = gTasks[taskId].tExpTask_battler; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar. { struct Pokemon *mon = &gPlayerParty[monId]; u16 species = GetMonData(mon, MON_DATA_SPECIES); u8 level = GetMonData(mon, MON_DATA_LEVEL); u32 currExp = GetMonData(mon, MON_DATA_EXP); u32 nextLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1]; if (currExp + gainedExp >= nextLvlExp) { u8 savedActiveBattler; SetMonData(mon, MON_DATA_EXP, &nextLvlExp); CalculateMonStats(mon, FALSE); gainedExp -= nextLvlExp - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; if (IsDoubleBattle() == TRUE && ((u16)(monId) == gBattlerPartyIndexes[battlerId] || (u16)(monId) == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])) gTasks[taskId].func = Task_LaunchLvlUpAnim; else gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } else { currExp += gainedExp; SetMonData(mon, MON_DATA_EXP, &currExp); gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } } else { gTasks[taskId].func = Task_PrepareToGiveExpWithExpBar; } } static void Task_PrepareToGiveExpWithExpBar(u8 taskId) { u8 monIndex = gTasks[taskId].tExpTask_monId; s32 gainedExp = gTasks[taskId].tExpTask_gainedExp; u8 battlerId = gTasks[taskId].tExpTask_battler; struct Pokemon *mon = &gPlayerParty[monIndex]; u8 level = GetMonData(mon, MON_DATA_LEVEL); u16 species = GetMonData(mon, MON_DATA_SPECIES); u32 exp = GetMonData(mon, MON_DATA_EXP); u32 currLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level]; u32 expToNextLvl; exp -= currLvlExp; expToNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLvlExp; SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp); PlaySE(SE_EXP); gTasks[taskId].func = Task_GiveExpWithExpBar; } static void Task_GiveExpWithExpBar(u8 taskId) { if (gTasks[taskId].tExpTask_frames < 13) { ++gTasks[taskId].tExpTask_frames; } else { u8 monId = gTasks[taskId].tExpTask_monId; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; u8 battlerId = gTasks[taskId].tExpTask_battler; s16 newExpPoints; newExpPoints = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]); if (newExpPoints == -1) // The bar has been filled with given exp points. { u8 level; s32 currExp; u16 species; s32 expOnNextLvl; m4aSongNumStop(SE_EXP); level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); currExp = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); expOnNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1]; if (currExp + gainedExp >= expOnNextLvl) { u8 savedActiveBattler; SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl); CalculateMonStats(&gPlayerParty[monId], FALSE); gainedExp -= expOnNextLvl - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; gTasks[taskId].func = Task_LaunchLvlUpAnim; } else { currExp += gainedExp; SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp); gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } } } } static void Task_LaunchLvlUpAnim(u8 taskId) { u8 battlerId = gTasks[taskId].tExpTask_battler; u8 monIndex = gTasks[taskId].tExpTask_monId; if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]) battlerId ^= BIT_FLANK; InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP); gTasks[taskId].func = Task_UpdateLvlInHealthbox; } static void Task_UpdateLvlInHealthbox(u8 taskId) { u8 battlerId = gTasks[taskId].tExpTask_battler; if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive) { u8 monIndex = gTasks[taskId].tExpTask_monId; GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value. if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]) UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId ^ BIT_FLANK], &gPlayerParty[monIndex], HEALTHBOX_ALL); else UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL); gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } } static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId) { u8 monIndex; s32 battlerId = gTasks[taskId].tExpTask_battler; if (IsBattlerSpriteVisible((u8)battlerId) == TRUE) { gTasks[taskId].func = Task_CreateLevelUpVerticalStripes; gTasks[taskId].data[15] = 0; } else { gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } } static void Task_CreateLevelUpVerticalStripes(u8 taskId) { s16 *data = gTasks[taskId].data; u8 battlerId = tExpTask_battler; u16 bgPriorityRank = GetBattlerSpriteBGPriorityRank(battlerId); bool32 isOnBg2 = ((bgPriorityRank ^ 1)) != 0; struct Sprite *sprite = &gSprites[gBattlerSpriteIds[battlerId]]; switch (data[15]) { case 0: if (!IsTextPrinterActive(0)) { if (!isOnBg2) { data[14] = gBattle_BG1_X; data[13] = gBattle_BG1_Y; gBattle_BG1_X = -(sprite->x + sprite->x2) + 32; gBattle_BG1_Y = -(sprite->y + sprite->y2) + 32; } else { data[14] = gBattle_BG2_X; data[13] = gBattle_BG2_Y; gBattle_BG2_X = -(sprite->x + sprite->x2) + 32; gBattle_BG2_Y = -(sprite->y + sprite->y2) + 32; } ++data[15]; } break; case 1: { u32 battlerIdAlt = battlerId; bool32 v6Alt = isOnBg2; MoveBattlerSpriteToBG(battlerIdAlt, v6Alt); } ++data[15]; break; case 2: PlaySE(SE_RS_SHOP); if (IsMonGettingExpSentOut()) CreateLevelUpVerticalSpritesTask(sprite->x + sprite->x2, sprite->y + sprite->y2, 10000, 10000, 1, 0); ++data[15]; break; case 3: if (!LevelUpVerticalSpritesTaskIsRunning()) { sprite->invisible = FALSE; ++data[15]; } break; case 5: ResetBattleAnimBg(isOnBg2); ++data[15]; break; case 4: ++data[15]; break; case 6: if (!isOnBg2) { gBattle_BG1_X = data[14]; gBattle_BG1_Y = data[13]; } else { gBattle_BG2_X = data[14]; gBattle_BG2_Y = data[13]; } gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); break; } } static void FreeMonSpriteAfterFaintAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT) { FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); PlayerBufferExecCompleted(); } } static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); PlayerBufferExecCompleted(); } } static void CompleteOnInactiveTextPrinter2(void) { if (!IsTextPrinterActive(0)) PlayerBufferExecCompleted(); } static void OpenPartyMenuToChooseMon(void) { if (!gPaletteFade.active) { u8 caseId; gBattlerControllerFuncs[gActiveBattler] = WaitForMonSelection; caseId = gTasks[gBattleControllerData[gActiveBattler]].data[0]; DestroyTask(gBattleControllerData[gActiveBattler]); FreeAllWindowBuffers(); OpenPartyMenuInTutorialBattle(caseId); } } static void WaitForMonSelection(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (gPartyMenuUseExitCallback == TRUE) BtlController_EmitChosenMonReturnValue(1, gSelectedMonPartyId, gBattlePartyCurrentOrder); else BtlController_EmitChosenMonReturnValue(1, 6, NULL); if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1) PrintLinkStandbyMsg(); PlayerBufferExecCompleted(); } } static void OpenBagAndChooseItem(void) { if (!gPaletteFade.active) { gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChoseItem; ReshowBattleScreenDummy(); FreeAllWindowBuffers(); CB2_BagMenuFromBattle(); } } static void CompleteWhenChoseItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId); PlayerBufferExecCompleted(); } } static void CompleteOnSpecialAnimDone(void) { if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) PlayerBufferExecCompleted(); } static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBattlerSpriteIds[gActiveBattler]; if (gSprites[spriteId].data[1] == 32) { gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; PlayerBufferExecCompleted(); } else { if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; ++gSprites[spriteId].data[1]; } } static void MoveSelectionDisplayMoveNames(void) { s32 i; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]); gNumberOfMovesToChoose = 0; for (i = 0; i < MAX_MON_MOVES; ++i) { MoveSelectionDestroyCursorAt(i); StringCopy(gDisplayedStringBattle, gText_MoveInterfaceDynamicColors); StringAppend(gDisplayedStringBattle, gMoveNames[moveInfo->moves[i]]); BattlePutTextOnWindow(gDisplayedStringBattle, i + 3); if (moveInfo->moves[i] != MOVE_NONE) ++gNumberOfMovesToChoose; } } static void MoveSelectionDisplayPpString(void) { StringCopy(gDisplayedStringBattle, gText_MoveInterfacePP); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_PP); } static void MoveSelectionDisplayPpNumber(void) { u8 *txtPtr; struct ChooseMoveStruct *moveInfo; if (gBattleBufferA[gActiveBattler][2] == TRUE) // check if we didn't want to display pp number return; SetPpNumbersPaletteInMoveSelection(); moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]); txtPtr = ConvertIntToDecimalStringN(gDisplayedStringBattle, moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]], STR_CONV_MODE_RIGHT_ALIGN, 2); *txtPtr = CHAR_SLASH; ConvertIntToDecimalStringN(++txtPtr, moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]], STR_CONV_MODE_RIGHT_ALIGN, 2); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_PP_REMAINING); } static void MoveSelectionDisplayMoveType(void) { u8 *txtPtr; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]); u16 move = moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]; const u8 *strPtr; txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); *txtPtr++ = EXT_CTRL_CODE_BEGIN; *txtPtr++ = 6; *txtPtr++ = 1; txtPtr = StringCopy(txtPtr, gText_MoveInterfaceDynamicColors); switch(move) { case MOVE_HIDDEN_POWER: { strPtr = gTypeNames[GetHiddenPowerType(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]])]; break; } case MOVE_WEATHER_BALL: { strPtr = gTypeNames[GetWeatherBallType()]; break; } case MOVE_NATURE_POWER: { strPtr = gTypeNames[gBattleMoves[gNaturePowerMoves[gBattleTerrain]].type]; break; } default: { strPtr = gTypeNames[gBattleMoves[move].type]; break; } } StringCopy(txtPtr, strPtr); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MOVE_TYPE); } void MoveSelectionCreateCursorAt(u8 cursorPosition, u8 arg1) { u16 src[2]; src[0] = arg1 + 1; src[1] = arg1 + 2; CopyToBgTilemapBufferRect_ChangePalette(0, src, 9 * (cursorPosition & 1) + 1, 55 + (cursorPosition & 2), 1, 2, 0x11); CopyBgTilemapBufferToVram(0); } void MoveSelectionDestroyCursorAt(u8 cursorPosition) { u16 src[2]; src[0] = 32; src[1] = 32; CopyToBgTilemapBufferRect_ChangePalette(0, src, 9 * (cursorPosition & 1) + 1, 55 + (cursorPosition & 2), 1, 2, 0x11); CopyBgTilemapBufferToVram(0); } void ActionSelectionCreateCursorAt(u8 cursorPosition, u8 arg1) { u16 src[2]; src[0] = 1; src[1] = 2; CopyToBgTilemapBufferRect_ChangePalette(0, src, 7 * (cursorPosition & 1) + 16, 35 + (cursorPosition & 2), 1, 2, 0x11); CopyBgTilemapBufferToVram(0); } void ActionSelectionDestroyCursorAt(u8 cursorPosition) { u16 src[2]; src[0] = 32; src[1] = 32; CopyToBgTilemapBufferRect_ChangePalette(0, src, 7 * (cursorPosition & 1) + 16, 35 + (cursorPosition & 2), 1, 2, 0x11); CopyBgTilemapBufferToVram(0); } void SetCB2ToReshowScreenAfterMenu(void) { SetMainCallback2(ReshowBattleScreenAfterMenu); } void SetCB2ToReshowScreenAfterMenu2(void) { SetMainCallback2(ReshowBattleScreenAfterMenu); } static void CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) PlayerBufferExecCompleted(); } static void CompleteOnFinishedBattleAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) PlayerBufferExecCompleted(); } static void PrintLinkStandbyMsg(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gBattle_BG0_X = 0; gBattle_BG0_Y = 0; BattlePutTextOnWindow(gText_LinkStandby, B_WIN_MSG); } } static void PlayerHandleGetMonData(void) { u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { size += CopyPlayerMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; ++i) { if (monToCheck & 1) size += CopyPlayerMonData(i, monData + size); monToCheck >>= 1; } } BtlController_EmitDataTransfer(BUFFER_B, size, monData); PlayerBufferExecCompleted(); } static u32 CopyPlayerMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; u8 nickname[20]; u8 *src; s16 data16; u32 data32; s32 size = 0; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); for (size = 0; size < MAX_MON_MOVES; ++size) { battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); } battleMon.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); battleMon.friendship = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); battleMon.experience = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); battleMon.hpIV = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); battleMon.attackIV = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); battleMon.defenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); battleMon.speedIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); battleMon.spAttackIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); battleMon.spDefenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); battleMon.personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); battleMon.status1 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); battleMon.level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); battleMon.hp = GetMonData(&gPlayerParty[monId], MON_DATA_HP); battleMon.maxHP = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); battleMon.attack = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); battleMon.defense = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(battleMon.nickname, nickname); GetMonData(&gPlayerParty[monId], MON_DATA_OT_NAME, battleMon.otName); src = (u8 *)&battleMon; for (size = 0; size < sizeof(battleMon); ++size) dst[size] = src[size]; break; case REQUEST_SPECIES_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_HELDITEM_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MOVES_PP_BATTLE: for (size = 0; size < MAX_MON_MOVES; ++size) { moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); src = (u8 *)(&moveData); for (size = 0; size < sizeof(moveData); ++size) dst[size] = src[size]; break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_PP_DATA_BATTLE: for (size = 0; size < MAX_MON_MOVES; ++size) dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); ++size; break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_EXP_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_HP_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_EV); size = 1; break; case REQUEST_ATK_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV); size = 1; break; case REQUEST_DEF_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV); size = 1; break; case REQUEST_SPEED_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV); size = 1; break; case REQUEST_SPATK_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV); size = 1; break; case REQUEST_SPDEF_EV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV); size = 1; break; case REQUEST_FRIENDSHIP_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); size = 1; break; case REQUEST_POKERUS_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKERUS); size = 1; break; case REQUEST_MET_LOCATION_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION); size = 1; break; case REQUEST_MET_LEVEL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL); size = 1; break; case REQUEST_MET_GAME_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME); size = 1; break; case REQUEST_POKEBALL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL); size = 1; break; case REQUEST_ALL_IVS_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); dst[1] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); dst[2] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); dst[3] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); dst[4] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); dst[5] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); size = 6; break; case REQUEST_HP_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); size = 1; break; case REQUEST_ATK_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); size = 1; break; case REQUEST_DEF_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); size = 1; break; case REQUEST_SPEED_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); size = 1; break; case REQUEST_SPATK_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); size = 1; break; case REQUEST_SPDEF_IV_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); size = 1; break; case REQUEST_PERSONALITY_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_CHECKSUM_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_STATUS_BATTLE: data32 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_LEVEL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); size = 1; break; case REQUEST_HP_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MAX_HP_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_ATK_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_DEF_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPEED_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPATK_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPDEF_BATTLE: data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_COOL_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL); size = 1; break; case REQUEST_BEAUTY_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY); size = 1; break; case REQUEST_CUTE_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE); size = 1; break; case REQUEST_SMART_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART); size = 1; break; case REQUEST_TOUGH_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH); size = 1; break; case REQUEST_SHEEN_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SHEEN); size = 1; break; case REQUEST_COOL_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON); size = 1; break; case REQUEST_BEAUTY_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON); size = 1; break; case REQUEST_CUTE_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON); size = 1; break; case REQUEST_SMART_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON); size = 1; break; case REQUEST_TOUGH_RIBBON_BATTLE: dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON); size = 1; break; } return size; } void PlayerHandleGetRawMonData(void) { struct BattlePokemon battleMon; u8 *src = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBattler][1]; u32 i; for (i = 0; i < gBattleBufferA[gActiveBattler][2]; ++i) dst[i] = src[i]; BtlController_EmitDataTransfer(BUFFER_B, gBattleBufferA[gActiveBattler][2], dst); PlayerBufferExecCompleted(); } static void PlayerHandleSetMonData(void) { u8 monToCheck; u32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { SetPlayerMonData(gBattlerPartyIndexes[gActiveBattler]); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; ++i) { if (monToCheck & 1) SetPlayerMonData(i); monToCheck >>= 1; } } PlayerBufferExecCompleted(); } static void SetPlayerMonData(u8 monId) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; s32 i; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { u8 iv; SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < MAX_MON_MOVES; ++i) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &iv); SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality); SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &battlePokemon->status1); SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &battlePokemon->level); SetMonData(&gPlayerParty[monId], MON_DATA_HP, &battlePokemon->hp); SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP); SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &battlePokemon->attack); SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &battlePokemon->defense); SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &battlePokemon->speed); SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack); SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case REQUEST_SPECIES_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; ++i) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; } HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); } static void PlayerHandleSetRawMonData(void) { u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; u32 i; for (i = 0; i < gBattleBufferA[gActiveBattler][2]; ++i) dst[i] = gBattleBufferA[gActiveBattler][3 + i]; PlayerBufferExecCompleted(); } static void PlayerHandleLoadMonSprite(void) { BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpritePosX_0; } static void PlayerHandleSwitchInAnim(void) { ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnimShowHealthbox; } static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void PlayerHandleReturnMonToBall(void) { if (gBattleBufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; } else { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); PlayerBufferExecCompleted(); } } static void DoSwitchOutAnimation(void) { switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } static void PlayerHandleDrawTrainerPic(void) { s16 xPos; u32 trainerPicId; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right. xPos = 90; else // First mon, on the left. xPos = 32; } else { xPos = 80; } if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_SAPPHIRE) trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN; else if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_EMERALD) trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_EMERALD_BRENDAN; else trainerPicId = gLinkPlayers[GetMultiplayerId()].gender; } else { trainerPicId = gSaveBlock2Ptr->playerGender; } DecompressTrainerBackPalette(trainerPicId, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -240; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void PlayerHandleTrainerSlide(void) { u32 trainerPicId; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_SAPPHIRE) trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + 2; else if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_EMERALD) trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + 6; else trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + 0; } else { trainerPicId = gSaveBlock2Ptr->playerGender + 0; } DecompressTrainerBackPalette(trainerPicId, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80, 30); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -96; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy2; } static void PlayerHandleTrainerSlideBack(void) { SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } static void PlayerHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState; } else { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER); gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; } } } static void PlayerHandlePaletteFade(void) { BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); PlayerBufferExecCompleted(); } static void PlayerHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void PlayerHandleBallThrowAnim(void) { u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void PlayerHandlePause(void) { u8 var = gBattleBufferA[gActiveBattler][1]; while (var) --var; PlayerBufferExecCompleted(); } static void PlayerHandleMoveAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); gAnimFriendship = gBattleBufferA[gActiveBattler][10]; gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // Always returns FALSE. { PlayerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = PlayerDoMoveAnimation; } } } static void PlayerDoMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); u8 multihit = gBattleBufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8) { gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } break; case 2: gAnimScriptCallback(); if (!gAnimScriptActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3; } break; case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlayerBufferExecCompleted(); } break; } } static void PlayerHandlePrintString(void) { u16 *stringId; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); if (BattleStringShouldBeColored(*stringId)) BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT)); else BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2; } static void PlayerHandlePrintSelectionString(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) PlayerHandlePrintString(); else PlayerBufferExecCompleted(); } static void HandleChooseActionAfterDma3(void) { if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; gBattle_BG0_Y = 160; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction; } } static void PlayerHandleChooseAction(void) { s32 i; gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3; BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); BattlePutTextOnWindow(gText_BattleMenu, B_WIN_ACTION_MENU); for (i = 0; i < 4; ++i) ActionSelectionDestroyCursorAt(i); ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT); } static void PlayerHandleUnknownYesNoBox(void) { } static void HandleChooseMoveAfterDma3(void) { if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; gBattle_BG0_Y = 320; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove; } } static void PlayerHandleChooseMove(void) { InitMoveSelectionsVarsAndStrings(); gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3; } void InitMoveSelectionsVarsAndStrings(void) { MoveSelectionDisplayMoveNames(); gMultiUsePlayerCursor = 0xFF; MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); MoveSelectionDisplayPpString(); MoveSelectionDisplayPpNumber(); MoveSelectionDisplayMoveType(); } static void PlayerHandleChooseItem(void) { s32 i; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem; gBattlerInMenuId = gActiveBattler; for (i = 0; i < 3; ++i) gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][1 + i]; } static void PlayerHandleChoosePokemon(void) { s32 i; gBattleControllerData[gActiveBattler] = CreateTask(TaskDummy, 0xFF); gTasks[gBattleControllerData[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF; *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4; *(&gBattleStruct->playerPartyIdx) = gBattleBufferA[gActiveBattler][2]; *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3]; for (i = 0; i < 3; ++i) gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][4 + i]; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon; gBattlerInMenuId = gActiveBattler; } static void PlayerHandleCmd23(void) { BattleStopLowHpSound(); BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); PlayerBufferExecCompleted(); } static void PlayerHandleHealthBarUpdate(void) { s16 hpVal; LoadBattleBarGfx(0); hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal); } else { u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal); UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT); } gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone; } static void PlayerHandleExpUpdate(void) { u8 monId = gBattleBufferA[gActiveBattler][1]; if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL) { PlayerBufferExecCompleted(); } else { s16 expPointsToGive; u8 taskId; LoadBattleBarGfx(1); GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // Unused return value. expPointsToGive = T1_READ_16(&gBattleBufferA[gActiveBattler][2]); taskId = CreateTask(Task_GiveExpToMon, 10); gTasks[taskId].tExpTask_monId = monId; gTasks[taskId].tExpTask_gainedExp = expPointsToGive; gTasks[taskId].tExpTask_battler = gActiveBattler; gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; } } static void PlayerHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); battlerId = gActiveBattler; gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = FALSE; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void PlayerHandleStatusAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void PlayerHandleStatusXor(void) { u8 val = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBattler][1]; SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS, &val); PlayerBufferExecCompleted(); } static void PlayerHandleDataTransfer(void) { PlayerBufferExecCompleted(); } static void PlayerHandleDMA3Transfer(void) { u32 dstArg = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8) | (gBattleBufferA[gActiveBattler][3] << 16) | (gBattleBufferA[gActiveBattler][4] << 24); u16 sizeArg = gBattleBufferA[gActiveBattler][5] | (gBattleBufferA[gActiveBattler][6] << 8); const u8 *src = &gBattleBufferA[gActiveBattler][7]; u8 *dst = (u8 *)(dstArg); u32 size = sizeArg; while (TRUE) { if (size <= 0x1000) { DmaCopy16(3, src, dst, size); break; } DmaCopy16(3, src, dst, 0x1000); src += 0x1000; dst += 0x1000; size -= 0x1000; } PlayerBufferExecCompleted(); } static void PlayerHandlePlayBGM(void) { PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); PlayerBufferExecCompleted(); } static void PlayerHandleCmd32(void) { PlayerBufferExecCompleted(); } static void PlayerHandleTwoReturnValues(void) { BtlController_EmitTwoReturnValues(1, 0, 0); PlayerBufferExecCompleted(); } static void PlayerHandleChosenMonReturnValue(void) { BtlController_EmitChosenMonReturnValue(1, 0, NULL); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue(void) { BtlController_EmitOneReturnValue(1, 0); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue_Duplicate(void) { BtlController_EmitOneReturnValue_Duplicate(1, 0); PlayerBufferExecCompleted(); } static void PlayerHandleCmd37(void) { gUnusedControllerStruct.unk = 0; PlayerBufferExecCompleted(); } static void PlayerHandleCmd38(void) { gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; PlayerBufferExecCompleted(); } static void PlayerHandleCmd39(void) { gUnusedControllerStruct.flag = 0; PlayerBufferExecCompleted(); } static void PlayerHandleCmd40(void) { gUnusedControllerStruct.flag ^= 1; PlayerBufferExecCompleted(); } static void PlayerHandleHitAnimation(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE) { PlayerBufferExecCompleted(); } else { gDoingBattleAnim = TRUE; gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect; } } static void PlayerHandleCmd42(void) { PlayerBufferExecCompleted(); } static void PlayerHandlePlaySE(void) { s8 pan; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) pan = SOUND_PAN_ATTACKER; else pan = SOUND_PAN_TARGET; PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); PlayerBufferExecCompleted(); } static void PlayerHandlePlayFanfare(void) { PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); PlayerBufferExecCompleted(); } static void PlayerHandleFaintingCry(void) { PlayCry_ByMode(GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES), -25, CRY_MODE_FAINT); PlayerBufferExecCompleted(); } static void PlayerHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; PlayerBufferExecCompleted(); } static void PlayerHandleIntroTrainerBallThrow(void) { u8 paletteNum; u8 taskId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = PlayerThrowBall_StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; } void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite) { u8 battlerId = sprite->data[5]; FreeSpriteOamMatrix(sprite); FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); DestroySprite(sprite); BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0); } static void Task_StartSendOutAnim(u8 taskId) { if (gTasks[taskId].data[1] < 31) { ++gTasks[taskId].data[1]; } else { u8 savedActiveBattler = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBattler; DestroyTask(taskId); } } static void PlayerHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { PlayerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2] != 0) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } static void EndDrawPartyStatusSummary(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 0x5C) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; PlayerBufferExecCompleted(); } } static void PlayerHandleHidePartyStatusSummary(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; PlayerBufferExecCompleted(); } static void PlayerHandleEndBounceEffect(void) { EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); EndBounceEffect(gActiveBattler, BOUNCE_MON); PlayerBufferExecCompleted(); } static void PlayerHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } PlayerBufferExecCompleted(); } static void PlayerHandleBattleAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) PlayerBufferExecCompleted(); else gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; } } static void PlayerHandleLinkStandbyMsg(void) { switch (gBattleBufferA[gActiveBattler][1]) { case 0: PrintLinkStandbyMsg(); // fall through case 1: EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); EndBounceEffect(gActiveBattler, BOUNCE_MON); break; case 2: PrintLinkStandbyMsg(); break; } PlayerBufferExecCompleted(); } static void PlayerHandleResetActionMoveSelection(void) { switch (gBattleBufferA[gActiveBattler][1]) { case RESET_ACTION_MOVE_SELECTION: gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; break; case RESET_ACTION_SELECTION: gActionSelectionCursor[gActiveBattler] = 0; break; case RESET_MOVE_SELECTION: gMoveSelectionCursor[gActiveBattler] = 0; break; } PlayerBufferExecCompleted(); } static void PlayerHandleCmd55(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); PlayerBufferExecCompleted(); gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void PlayerCmdEnd(void) { } static void PreviewDeterminativeMoveTargets(void) { u32 bitMask = 0; u8 startY = 0; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { u8 moveTarget; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]); u16 move = moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]; if (move == MOVE_CURSE) { if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST) moveTarget = MOVE_TARGET_USER; else moveTarget = MOVE_TARGET_SELECTED; } else { moveTarget = gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].target; } switch (moveTarget) { case MOVE_TARGET_SELECTED: case MOVE_TARGET_DEPENDS: case MOVE_TARGET_USER_OR_SELECTED: case MOVE_TARGET_RANDOM: bitMask = 0xF0000; startY = 0; break; case MOVE_TARGET_BOTH: case MOVE_TARGET_OPPONENTS_FIELD: bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)] | gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16; startY = 8; break; case MOVE_TARGET_USER: switch (move) { case MOVE_HAZE: case MOVE_SANDSTORM: case MOVE_PERISH_SONG: case MOVE_RAIN_DANCE: case MOVE_SUNNY_DAY: case MOVE_HAIL: case MOVE_MUD_SPORT: case MOVE_WATER_SPORT: bitMask = 0xF0000; break; case MOVE_SAFEGUARD: case MOVE_REFLECT: case MOVE_LIGHT_SCREEN: case MOVE_MIST: case MOVE_HEAL_BELL: case MOVE_AROMATHERAPY: bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)] | gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]) << 16; break; case MOVE_HELPING_HAND: bitMask = (gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) << 16; break; default: bitMask = (gBitTable[gActiveBattler]) << 16; break; } startY = 8; break; case MOVE_TARGET_FOES_AND_ALLY: bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)] | gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)] | gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16; startY = 8; break; } BeginNormalPaletteFade(bitMask, 8, startY, 0, RGB_WHITE); } } ================================================ FILE: src/battle_controller_pokedude.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "party_menu.h" #include "pokeball.h" #include "data.h" #include "util.h" #include "m4a.h" #include "link.h" #include "event_data.h" #include "item_menu.h" #include "strings.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_message.h" #include "reshow_battle_screen.h" #include "teachy_tv.h" #include "constants/songs.h" #include "constants/moves.h" #include "constants/pokemon.h" struct PokedudeTextScriptHeader { u8 btlcmd; u8 side; u16 stringid; void (*callback)(void); }; struct PokedudeBattlePartyInfo { u8 side; u8 level; u16 species; u16 moves[MAX_MON_MOVES]; u8 nature; u8 gender; }; static void PokedudeHandleGetMonData(void); static void PokedudeHandleGetRawMonData(void); static void PokedudeHandleSetMonData(void); static void PokedudeHandleSetRawMonData(void); static void PokedudeHandleLoadMonSprite(void); static void PokedudeHandleSwitchInAnim(void); static void PokedudeHandleReturnMonToBall(void); static void PokedudeHandleDrawTrainerPic(void); static void PokedudeHandleTrainerSlide(void); static void PokedudeHandleTrainerSlideBack(void); static void PokedudeHandleFaintAnimation(void); static void PokedudeHandlePaletteFade(void); static void PokedudeHandleSuccessBallThrowAnim(void); static void PokedudeHandleBallThrowAnim(void); static void PokedudeHandlePause(void); static void PokedudeHandleMoveAnimation(void); static void PokedudeHandlePrintString(void); static void PokedudeHandlePrintSelectionString(void); static void PokedudeHandleChooseAction(void); static void PokedudeHandleUnknownYesNoBox(void); static void PokedudeHandleChooseMove(void); static void PokedudeHandleChooseItem(void); static void PokedudeHandleChoosePokemon(void); static void PokedudeHandleCmd23(void); static void PokedudeHandleHealthBarUpdate(void); static void PokedudeHandleExpUpdate(void); static void PokedudeHandleStatusIconUpdate(void); static void PokedudeHandleStatusAnimation(void); static void PokedudeHandleStatusXor(void); static void PokedudeHandleDataTransfer(void); static void PokedudeHandleDMA3Transfer(void); static void PokedudeHandlePlayBGM(void); static void PokedudeHandleCmd32(void); static void PokedudeHandleTwoReturnValues(void); static void PokedudeHandleChosenMonReturnValue(void); static void PokedudeHandleOneReturnValue(void); static void PokedudeHandleOneReturnValue_Duplicate(void); static void PokedudeHandleCmd37(void); static void PokedudeHandleCmd38(void); static void PokedudeHandleCmd39(void); static void PokedudeHandleCmd40(void); static void PokedudeHandleHitAnimation(void); static void PokedudeHandleCmd42(void); static void PokedudeHandlePlaySE(void); static void PokedudeHandlePlayFanfare(void); static void PokedudeHandleFaintingCry(void); static void PokedudeHandleIntroSlide(void); static void PokedudeHandleIntroTrainerBallThrow(void); static void PokedudeHandleDrawPartyStatusSummary(void); static void PokedudeHandleHidePartyStatusSummary(void); static void PokedudeHandleEndBounceEffect(void); static void PokedudeHandleSpriteInvisibility(void); static void PokedudeHandleBattleAnimation(void); static void PokedudeHandleLinkStandbyMsg(void); static void PokedudeHandleResetActionMoveSelection(void); static void PokedudeHandleCmd55(void); static void PokedudeCmdEnd(void); static void PokedudeAction_PrintVoiceoverMessage(void); static void PokedudeAction_PrintMessageWithHealthboxPals(void); static void PokedudeBufferExecCompleted(void); static void PokedudeSimulateInputChooseAction(void); static void PokedudeBufferRunCommand(void); static bool8 HandlePokedudeVoiceoverEtc(void); static void PokedudeSimulateInputChooseMove(void); static void WaitForMonSelection(void); static void CompleteWhenChoseItem(void); static void Intro_WaitForShinyAnimAndHealthbox(void); static void Task_LaunchLvlUpAnim(u8 taskId); static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId); static void CompleteOnInactiveTextPrinter2(void); static void Task_PrepareToGiveExpWithExpBar(u8 taskId); static void Task_GiveExpWithExpBar(u8 taskId); static void Task_UpdateLvlInHealthbox(u8 taskId); static u32 CopyPokedudeMonData(u8 monId, u8 *dst); static void SetPokedudeMonData(u8 monId); static void StartSendOutAnim(u8 battlerId); static void PokedudeDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); static const u8 *GetPokedudeText(void); static void (*const sPokedudeBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { [CONTROLLER_GETMONDATA] = PokedudeHandleGetMonData, [CONTROLLER_GETRAWMONDATA] = PokedudeHandleGetRawMonData, [CONTROLLER_SETMONDATA] = PokedudeHandleSetMonData, [CONTROLLER_SETRAWMONDATA] = PokedudeHandleSetRawMonData, [CONTROLLER_LOADMONSPRITE] = PokedudeHandleLoadMonSprite, [CONTROLLER_SWITCHINANIM] = PokedudeHandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = PokedudeHandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = PokedudeHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = PokedudeHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = PokedudeHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = PokedudeHandleFaintAnimation, [CONTROLLER_PALETTEFADE] = PokedudeHandlePaletteFade, [CONTROLLER_SUCCESSBALLTHROWANIM] = PokedudeHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = PokedudeHandleBallThrowAnim, [CONTROLLER_PAUSE] = PokedudeHandlePause, [CONTROLLER_MOVEANIMATION] = PokedudeHandleMoveAnimation, [CONTROLLER_PRINTSTRING] = PokedudeHandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = PokedudeHandlePrintSelectionString, [CONTROLLER_CHOOSEACTION] = PokedudeHandleChooseAction, [CONTROLLER_UNKNOWNYESNOBOX] = PokedudeHandleUnknownYesNoBox, [CONTROLLER_CHOOSEMOVE] = PokedudeHandleChooseMove, [CONTROLLER_OPENBAG] = PokedudeHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = PokedudeHandleChoosePokemon, [CONTROLLER_23] = PokedudeHandleCmd23, [CONTROLLER_HEALTHBARUPDATE] = PokedudeHandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = PokedudeHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = PokedudeHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = PokedudeHandleStatusAnimation, [CONTROLLER_STATUSXOR] = PokedudeHandleStatusXor, [CONTROLLER_DATATRANSFER] = PokedudeHandleDataTransfer, [CONTROLLER_DMA3TRANSFER] = PokedudeHandleDMA3Transfer, [CONTROLLER_PLAYBGM] = PokedudeHandlePlayBGM, [CONTROLLER_32] = PokedudeHandleCmd32, [CONTROLLER_TWORETURNVALUES] = PokedudeHandleTwoReturnValues, [CONTROLLER_CHOSENMONRETURNVALUE] = PokedudeHandleChosenMonReturnValue, [CONTROLLER_ONERETURNVALUE] = PokedudeHandleOneReturnValue, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PokedudeHandleOneReturnValue_Duplicate, [CONTROLLER_CLEARUNKVAR] = PokedudeHandleCmd37, [CONTROLLER_SETUNKVAR] = PokedudeHandleCmd38, [CONTROLLER_CLEARUNKFLAG] = PokedudeHandleCmd39, [CONTROLLER_TOGGLEUNKFLAG] = PokedudeHandleCmd40, [CONTROLLER_HITANIMATION] = PokedudeHandleHitAnimation, [CONTROLLER_CANTSWITCH] = PokedudeHandleCmd42, [CONTROLLER_PLAYSE] = PokedudeHandlePlaySE, [CONTROLLER_PLAYFANFARE] = PokedudeHandlePlayFanfare, [CONTROLLER_FAINTINGCRY] = PokedudeHandleFaintingCry, [CONTROLLER_INTROSLIDE] = PokedudeHandleIntroSlide, [CONTROLLER_INTROTRAINERBALLTHROW] = PokedudeHandleIntroTrainerBallThrow, [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = PokedudeHandleDrawPartyStatusSummary, [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = PokedudeHandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = PokedudeHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = PokedudeHandleSpriteInvisibility, [CONTROLLER_BATTLEANIMATION] = PokedudeHandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = PokedudeHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = PokedudeHandleResetActionMoveSelection, [CONTROLLER_ENDLINKBATTLE] = PokedudeHandleCmd55, [CONTROLLER_TERMINATOR_NOP] = PokedudeCmdEnd, }; // unknown unused data static const u8 sUnused[] = { 0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58 }; #define pdHealthboxPal1 simulatedInputState[0] #define pdHealthboxPal2 simulatedInputState[1] #define pdScriptNum simulatedInputState[2] #define pdMessageNo simulatedInputState[3] static void PokedudeDummy(void) { } void SetControllerToPokedude(void) { gBattlerControllerFuncs[gActiveBattler] = PokedudeBufferRunCommand; *(&gBattleStruct->pdScriptNum) = gSpecialVar_0x8004; gBattleStruct->pdMessageNo = 0; } static void PokedudeBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { if (gBattleBufferA[gActiveBattler][0] < NELEMS(sPokedudeBufferCommands)) { if (!HandlePokedudeVoiceoverEtc()) sPokedudeBufferCommands[gBattleBufferA[gActiveBattler][0]](); } else { PokedudeBufferExecCompleted(); } } } static void HandleInputChooseAction(void) { PokedudeSimulateInputChooseAction(); } static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) PokedudeBufferExecCompleted(); } static void CompleteOnBattlerSpritePosX_0(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded == TRUE && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) { TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); PokedudeBufferExecCompleted(); } } } static void CompleteOnInactiveTextPrinter(void) { if (!IsTextPrinterActive(0)) PokedudeBufferExecCompleted(); } static void Pokedude_SetBattleEndCallbacks(void) { if (!gPaletteFade.active) { gMain.inBattle = FALSE; gMain.callback1 = gPreBattleCallback1; SetMainCallback2(gMain.savedCallback); } } static void SwitchIn_HandleSoundAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PokedudeBufferExecCompleted(); } } static void SwitchIn_CleanShinyAnimShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; } } static void SwitchIn_TryShinyAnimShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !(gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); CopyBattleSpriteInvisibility(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_CleanShinyAnimShowSubstitute; } } static void CompleteOnSpecialAnimDone(void) { if (!gDoingBattleAnim) PokedudeBufferExecCompleted(); } static void Intro_DelayAndEnd(void) { if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == 255) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; PokedudeBufferExecCompleted(); } } static void PokedudeHandleInputChooseMove(void) { PokedudeSimulateInputChooseMove(); } static void OpenPartyMenuToChooseMon(void) { if (!gPaletteFade.active) { gBattlerControllerFuncs[gActiveBattler] = WaitForMonSelection; DestroyTask(gBattleControllerData[gActiveBattler]); FreeAllWindowBuffers(); Pokedude_OpenPartyMenuInBattle(); } } static void WaitForMonSelection(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (gPartyMenuUseExitCallback == TRUE) BtlController_EmitChosenMonReturnValue(1, gSelectedMonPartyId, gBattlePartyCurrentOrder); else BtlController_EmitChosenMonReturnValue(1, 6, NULL); PokedudeBufferExecCompleted(); } } static void OpenBagAndChooseItem(void) { u8 callbackId; if (!gPaletteFade.active) { gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChoseItem; ReshowBattleScreenDummy(); FreeAllWindowBuffers(); switch (gSpecialVar_0x8004) { case TTVSCR_STATUS: default: callbackId = ITEMMENULOCATION_TTVSCR_STATUS; break; case TTVSCR_CATCHING: callbackId = ITEMMENULOCATION_TTVSCR_CATCHING; break; } InitPokedudeBag(callbackId); } } static void CompleteWhenChoseItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId); PokedudeBufferExecCompleted(); } } static void Intro_TryShinyAnimShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } static void Intro_WaitForShinyAnimAndHealthbox(void) { bool32 r4 = FALSE; if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) r4 = TRUE; if (r4 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } #define tExpTask_monId data[0] #define tExpTask_gainedExp data[1] #define tExpTask_battler data[2] #define tExpTask_frames data[10] static void Task_GiveExpToMon(u8 taskId) { u32 monId = (u8)gTasks[taskId].tExpTask_monId; u8 battlerId = gTasks[taskId].tExpTask_battler; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar. { struct Pokemon *mon = &gPlayerParty[monId]; u16 species = GetMonData(mon, MON_DATA_SPECIES); u8 level = GetMonData(mon, MON_DATA_LEVEL); u32 currExp = GetMonData(mon, MON_DATA_EXP); u32 nextLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1]; if (currExp + gainedExp >= nextLvlExp) { u8 savedActiveBattler; SetMonData(mon, MON_DATA_EXP, &nextLvlExp); CalculateMonStats(mon, TRUE); gainedExp -= nextLvlExp - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; if (IsDoubleBattle() == TRUE && ((u16)monId == gBattlerPartyIndexes[battlerId] || (u16)monId == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])) gTasks[taskId].func = Task_LaunchLvlUpAnim; else gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } else { currExp += gainedExp; SetMonData(mon, MON_DATA_EXP, &currExp); gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2; DestroyTask(taskId); } } else { gTasks[taskId].func = Task_PrepareToGiveExpWithExpBar; } } static void Task_PrepareToGiveExpWithExpBar(u8 taskId) { u8 monIndex = gTasks[taskId].tExpTask_monId; s32 gainedExp = gTasks[taskId].tExpTask_gainedExp; u8 battlerId = gTasks[taskId].tExpTask_battler; struct Pokemon *mon = &gPlayerParty[monIndex]; u8 level = GetMonData(mon, MON_DATA_LEVEL); u16 species = GetMonData(mon, MON_DATA_SPECIES); u32 exp = GetMonData(mon, MON_DATA_EXP); u32 currLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level]; u32 expToNextLvl; exp -= currLvlExp; expToNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLvlExp; SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp); PlaySE(SE_EXP); gTasks[taskId].func = Task_GiveExpWithExpBar; } static void Task_GiveExpWithExpBar(u8 taskId) { if (gTasks[taskId].tExpTask_frames < 13) { ++gTasks[taskId].tExpTask_frames; } else { u8 monId = gTasks[taskId].tExpTask_monId; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; u8 battlerId = gTasks[taskId].tExpTask_battler; s16 newExpPoints; newExpPoints = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]); if (newExpPoints == -1) // The bar has been filled with given exp points. { u8 level; s32 currExp; u16 species; s32 expOnNextLvl; m4aSongNumStop(SE_EXP); level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); currExp = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); expOnNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1]; if (currExp + gainedExp >= expOnNextLvl) { u8 savedActiveBattler; SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl); CalculateMonStats(&gPlayerParty[monId], TRUE); gainedExp -= expOnNextLvl - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; gTasks[taskId].func = Task_LaunchLvlUpAnim; } else { currExp += gainedExp; SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp); gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2; DestroyTask(taskId); } } } } static void Task_LaunchLvlUpAnim(u8 taskId) { u8 battlerId = gTasks[taskId].tExpTask_battler; u8 monIndex = gTasks[taskId].tExpTask_monId; if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]) battlerId ^= BIT_FLANK; InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP); gTasks[taskId].func = Task_UpdateLvlInHealthbox; } static void Task_UpdateLvlInHealthbox(u8 taskId) { u8 battlerId = gTasks[taskId].tExpTask_battler; if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive) { u8 monIndex = gTasks[taskId].tExpTask_monId; GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value. if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]) UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId ^ BIT_FLANK], &gPlayerParty[monIndex], HEALTHBOX_ALL); else UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL); gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } } static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId) { u8 monIndex = gTasks[taskId].tExpTask_monId; u8 battlerId; GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value battlerId = gTasks[taskId].tExpTask_battler; gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2; DestroyTask(taskId); } static void FreeMonSpriteAfterFaintAnim(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT) { FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); PokedudeBufferExecCompleted(); } } else { if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse) { SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); PokedudeBufferExecCompleted(); } } } static void CompleteOnHealthbarDone(void) { s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); if (hpValue != -1) { UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT); } else { HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PokedudeBufferExecCompleted(); } } static void CompleteOnInactiveTextPrinter2(void) { if (!IsTextPrinterActive(0)) PokedudeBufferExecCompleted(); } static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBattlerSpriteIds[gActiveBattler]; if (gSprites[spriteId].data[1] == 32) { gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; PokedudeBufferExecCompleted(); } else { if ((gSprites[spriteId].data[1] % 4) == 0) gSprites[spriteId].invisible ^= 1; ++gSprites[spriteId].data[1]; } } static void DoSwitchOutAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); PokedudeBufferExecCompleted(); } } static void CompleteOnBattlerSpriteCallbackDummy2(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) PokedudeBufferExecCompleted(); } static void CompleteOnFinishedBattleAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) PokedudeBufferExecCompleted(); } static void CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) PokedudeBufferExecCompleted(); } static void PokedudeBufferExecCompleted(void) { gBattlerControllerFuncs[gActiveBattler] = PokedudeBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { gBattleControllerExecFlags &= ~gBitTable[gActiveBattler]; } } // not used static void CompleteOnFinishedStatusAnimation2(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) PokedudeBufferExecCompleted(); } static void PokedudeHandleGetMonData(void) { u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { size += CopyPokedudeMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; ++i) { if (monToCheck & 1) size += CopyPokedudeMonData(i, monData + size); monToCheck >>= 1; } } BtlController_EmitDataTransfer(BUFFER_B, size, monData); PokedudeBufferExecCompleted(); } static u32 CopyPokedudeMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; u8 nickname[20]; u8 *src; s16 data16; u32 data32; s32 size = 0; struct Pokemon *mon; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) mon = &gPlayerParty[monId]; else mon = &gEnemyParty[monId]; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(mon, MON_DATA_SPECIES); battleMon.item = GetMonData(mon, MON_DATA_HELD_ITEM); for (size = 0; size < MAX_MON_MOVES; ++size) { battleMon.moves[size] = GetMonData(mon, MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(mon, MON_DATA_PP1 + size); } battleMon.ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); battleMon.friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); battleMon.experience = GetMonData(mon, MON_DATA_EXP); battleMon.hpIV = GetMonData(mon, MON_DATA_HP_IV); battleMon.attackIV = GetMonData(mon, MON_DATA_ATK_IV); battleMon.defenseIV = GetMonData(mon, MON_DATA_DEF_IV); battleMon.speedIV = GetMonData(mon, MON_DATA_SPEED_IV); battleMon.spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV); battleMon.spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV); battleMon.personality = GetMonData(mon, MON_DATA_PERSONALITY); battleMon.status1 = GetMonData(mon, MON_DATA_STATUS); battleMon.level = GetMonData(mon, MON_DATA_LEVEL); battleMon.hp = GetMonData(mon, MON_DATA_HP); battleMon.maxHP = GetMonData(mon, MON_DATA_MAX_HP); battleMon.attack = GetMonData(mon, MON_DATA_ATK); battleMon.defense = GetMonData(mon, MON_DATA_DEF); battleMon.speed = GetMonData(mon, MON_DATA_SPEED); battleMon.spAttack = GetMonData(mon, MON_DATA_SPATK); battleMon.spDefense = GetMonData(mon, MON_DATA_SPDEF); battleMon.isEgg = GetMonData(mon, MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(mon, MON_DATA_OT_ID); GetMonData(mon, MON_DATA_NICKNAME, nickname); StringCopy_Nickname(battleMon.nickname, nickname); GetMonData(mon, MON_DATA_OT_NAME, battleMon.otName); src = (u8 *)&battleMon; for (size = 0; size < sizeof(battleMon); ++size) dst[size] = src[size]; break; case REQUEST_SPECIES_BATTLE: data16 = GetMonData(mon, MON_DATA_SPECIES); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_HELDITEM_BATTLE: data16 = GetMonData(mon, MON_DATA_HELD_ITEM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MOVES_PP_BATTLE: for (size = 0; size < MAX_MON_MOVES; ++size) { moveData.moves[size] = GetMonData(mon, MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(mon, MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); src = (u8 *)(&moveData); for (size = 0; size < sizeof(moveData); ++size) dst[size] = src[size]; break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: data16 = GetMonData(mon, MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_PP_DATA_BATTLE: for (size = 0; size < MAX_MON_MOVES; ++size) dst[size] = GetMonData(mon, MON_DATA_PP1 + size); dst[size] = GetMonData(mon, MON_DATA_PP_BONUSES); ++size; break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: dst[0] = GetMonData(mon, MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: data32 = GetMonData(mon, MON_DATA_OT_ID); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_EXP_BATTLE: data32 = GetMonData(mon, MON_DATA_EXP); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_HP_EV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_HP_EV); size = 1; break; case REQUEST_ATK_EV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_ATK_EV); size = 1; break; case REQUEST_DEF_EV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_DEF_EV); size = 1; break; case REQUEST_SPEED_EV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_SPEED_EV); size = 1; break; case REQUEST_SPATK_EV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_SPATK_EV); size = 1; break; case REQUEST_SPDEF_EV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_SPDEF_EV); size = 1; break; case REQUEST_FRIENDSHIP_BATTLE: dst[0] = GetMonData(mon, MON_DATA_FRIENDSHIP); size = 1; break; case REQUEST_POKERUS_BATTLE: dst[0] = GetMonData(mon, MON_DATA_POKERUS); size = 1; break; case REQUEST_MET_LOCATION_BATTLE: dst[0] = GetMonData(mon, MON_DATA_MET_LOCATION); size = 1; break; case REQUEST_MET_LEVEL_BATTLE: dst[0] = GetMonData(mon, MON_DATA_MET_LEVEL); size = 1; break; case REQUEST_MET_GAME_BATTLE: dst[0] = GetMonData(mon, MON_DATA_MET_GAME); size = 1; break; case REQUEST_POKEBALL_BATTLE: dst[0] = GetMonData(mon, MON_DATA_POKEBALL); size = 1; break; case REQUEST_ALL_IVS_BATTLE: dst[0] = GetMonData(mon, MON_DATA_HP_IV); dst[1] = GetMonData(mon, MON_DATA_ATK_IV); dst[2] = GetMonData(mon, MON_DATA_DEF_IV); dst[3] = GetMonData(mon, MON_DATA_SPEED_IV); dst[4] = GetMonData(mon, MON_DATA_SPATK_IV); dst[5] = GetMonData(mon, MON_DATA_SPDEF_IV); size = 6; break; case REQUEST_HP_IV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_HP_IV); size = 1; break; case REQUEST_ATK_IV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_ATK_IV); size = 1; break; case REQUEST_DEF_IV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_DEF_IV); size = 1; break; case REQUEST_SPEED_IV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_SPEED_IV); size = 1; break; case REQUEST_SPATK_IV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_SPATK_IV); size = 1; break; case REQUEST_SPDEF_IV_BATTLE: dst[0] = GetMonData(mon, MON_DATA_SPDEF_IV); size = 1; break; case REQUEST_PERSONALITY_BATTLE: data32 = GetMonData(mon, MON_DATA_PERSONALITY); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_CHECKSUM_BATTLE: data16 = GetMonData(mon, MON_DATA_CHECKSUM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_STATUS_BATTLE: data32 = GetMonData(mon, MON_DATA_STATUS); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; dst[3] = (data32 & 0xFF000000) >> 24; size = 4; break; case REQUEST_LEVEL_BATTLE: dst[0] = GetMonData(mon, MON_DATA_LEVEL); size = 1; break; case REQUEST_HP_BATTLE: data16 = GetMonData(mon, MON_DATA_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MAX_HP_BATTLE: data16 = GetMonData(mon, MON_DATA_MAX_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_ATK_BATTLE: data16 = GetMonData(mon, MON_DATA_ATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_DEF_BATTLE: data16 = GetMonData(mon, MON_DATA_DEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPEED_BATTLE: data16 = GetMonData(mon, MON_DATA_SPEED); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPATK_BATTLE: data16 = GetMonData(mon, MON_DATA_SPATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPDEF_BATTLE: data16 = GetMonData(mon, MON_DATA_SPDEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_COOL_BATTLE: dst[0] = GetMonData(mon, MON_DATA_COOL); size = 1; break; case REQUEST_BEAUTY_BATTLE: dst[0] = GetMonData(mon, MON_DATA_BEAUTY); size = 1; break; case REQUEST_CUTE_BATTLE: dst[0] = GetMonData(mon, MON_DATA_CUTE); size = 1; break; case REQUEST_SMART_BATTLE: dst[0] = GetMonData(mon, MON_DATA_SMART); size = 1; break; case REQUEST_TOUGH_BATTLE: dst[0] = GetMonData(mon, MON_DATA_TOUGH); size = 1; break; case REQUEST_SHEEN_BATTLE: dst[0] = GetMonData(mon, MON_DATA_SHEEN); size = 1; break; case REQUEST_COOL_RIBBON_BATTLE: dst[0] = GetMonData(mon, MON_DATA_COOL_RIBBON); size = 1; break; case REQUEST_BEAUTY_RIBBON_BATTLE: dst[0] = GetMonData(mon, MON_DATA_BEAUTY_RIBBON); size = 1; break; case REQUEST_CUTE_RIBBON_BATTLE: dst[0] = GetMonData(mon, MON_DATA_CUTE_RIBBON); size = 1; break; case REQUEST_SMART_RIBBON_BATTLE: dst[0] = GetMonData(mon, MON_DATA_SMART_RIBBON); size = 1; break; case REQUEST_TOUGH_RIBBON_BATTLE: dst[0] = GetMonData(mon, MON_DATA_TOUGH_RIBBON); size = 1; break; } return size; } static void PokedudeHandleGetRawMonData(void) { PlayerHandleGetRawMonData(); } static void PokedudeHandleSetMonData(void) { u8 monToCheck; u32 i; if (gBattleBufferA[gActiveBattler][2] == 0) { SetPokedudeMonData(gBattlerPartyIndexes[gActiveBattler]); } else { monToCheck = gBattleBufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; ++i) { if (monToCheck & 1) SetPokedudeMonData(i); monToCheck >>= 1; } } PokedudeBufferExecCompleted(); } static void SetPokedudeMonData(u8 monId) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; s32 i; struct Pokemon *mon; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) mon = &gPlayerParty[monId]; else mon = &gEnemyParty[monId]; switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { u8 iv; SetMonData(mon, MON_DATA_SPECIES, &battlePokemon->species); SetMonData(mon, MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < MAX_MON_MOVES; ++i) { SetMonData(mon, MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(mon, MON_DATA_PP1 + i, &battlePokemon->pp[i]); } SetMonData(mon, MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); SetMonData(mon, MON_DATA_FRIENDSHIP, &battlePokemon->friendship); SetMonData(mon, MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; SetMonData(mon, MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; SetMonData(mon, MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; SetMonData(mon, MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; SetMonData(mon, MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; SetMonData(mon, MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; SetMonData(mon, MON_DATA_SPDEF_IV, &iv); SetMonData(mon, MON_DATA_PERSONALITY, &battlePokemon->personality); SetMonData(mon, MON_DATA_STATUS, &battlePokemon->status1); SetMonData(mon, MON_DATA_LEVEL, &battlePokemon->level); SetMonData(mon, MON_DATA_HP, &battlePokemon->hp); SetMonData(mon, MON_DATA_MAX_HP, &battlePokemon->maxHP); SetMonData(mon, MON_DATA_ATK, &battlePokemon->attack); SetMonData(mon, MON_DATA_DEF, &battlePokemon->defense); SetMonData(mon, MON_DATA_SPEED, &battlePokemon->speed); SetMonData(mon, MON_DATA_SPATK, &battlePokemon->spAttack); SetMonData(mon, MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case REQUEST_SPECIES_BATTLE: SetMonData(mon, MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: SetMonData(mon, MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; ++i) { SetMonData(mon, MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(mon, MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(mon, MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: SetMonData(mon, MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(mon, MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); SetMonData(mon, MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); SetMonData(mon, MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); SetMonData(mon, MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); SetMonData(mon, MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: SetMonData(mon, MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: SetMonData(mon, MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: SetMonData(mon, MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: SetMonData(mon, MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: SetMonData(mon, MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: SetMonData(mon, MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: SetMonData(mon, MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: SetMonData(mon, MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: SetMonData(mon, MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: SetMonData(mon, MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: SetMonData(mon, MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: SetMonData(mon, MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: SetMonData(mon, MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: SetMonData(mon, MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: SetMonData(mon, MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: SetMonData(mon, MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); SetMonData(mon, MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); SetMonData(mon, MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); SetMonData(mon, MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); SetMonData(mon, MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); SetMonData(mon, MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: SetMonData(mon, MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: SetMonData(mon, MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: SetMonData(mon, MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: SetMonData(mon, MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: SetMonData(mon, MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: SetMonData(mon, MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: SetMonData(mon, MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: SetMonData(mon, MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData(mon, MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(mon, MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: SetMonData(mon, MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: SetMonData(mon, MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: SetMonData(mon, MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: SetMonData(mon, MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: SetMonData(mon, MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: SetMonData(mon, MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: SetMonData(mon, MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(mon, MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: SetMonData(mon, MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: SetMonData(mon, MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: SetMonData(mon, MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: SetMonData(mon, MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: SetMonData(mon, MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: SetMonData(mon, MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: SetMonData(mon, MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: SetMonData(mon, MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: SetMonData(mon, MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: SetMonData(mon, MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; } HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); } static void PokedudeHandleSetRawMonData(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleLoadMonSprite(void) { u32 y; u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); y = GetBattlerSpriteDefault_Y(gActiveBattler); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2), y, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = 0; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = species; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpritePosX_0; PokedudeBufferExecCompleted(); } static void PokedudeHandleSwitchInAnim(void) { ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; StartSendOutAnim(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnimShowHealthbox; } static void PokedudeHandleReturnMonToBall(void) { if (gBattleBufferA[gActiveBattler][1] == 0) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; } else { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); PokedudeBufferExecCompleted(); } } static void PokedudeHandleDrawTrainerPic(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { DecompressTrainerBackPalette(TRAINER_BACK_PIC_POKEDUDE, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_POKEDUDE, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_POKEDUDE].size) * 4 + 80, 30); gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -240; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; } else { u32 tranerPicid = TRAINER_PIC_PROFESSOR_OAK; DecompressTrainerFrontPic(tranerPicid, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(tranerPicid, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 176, (8 - gTrainerFrontPicCoords[tranerPicid].size) * 4 + 40, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 240; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[tranerPicid].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[tranerPicid].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = tranerPicid; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; } gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void PokedudeHandleTrainerSlide(void) { DecompressTrainerBackPalette(TRAINER_BACK_PIC_POKEDUDE, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_POKEDUDE, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_POKEDUDE].size) * 4 + 80, 30); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -96; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy2; } static void PokedudeHandleTrainerSlideBack(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState; } else { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER); gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; } else { PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET); gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; } gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; } } } static void PokedudeHandlePaletteFade(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void PokedudeHandleBallThrowAnim(void) { u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void PokedudeHandlePause(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); gAnimFriendship = gBattleBufferA[gActiveBattler][10]; gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { PokedudeBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = PokedudeDoMoveAnimation; } } static void PokedudeDoMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; break; case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } break; case 2: gAnimScriptCallback(); if (!gAnimScriptActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3; } break; case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PokedudeBufferExecCompleted(); } break; } } static void PokedudeHandlePrintString(void) { u16 *stringId; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); if (BattleStringShouldBeColored(*stringId)) BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT)); else BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } static void PokedudeHandlePrintSelectionString(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) PokedudeHandlePrintString(); else PokedudeBufferExecCompleted(); } static void HandleChooseActionAfterDma3(void) { if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; gBattle_BG0_Y = 160; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction; } } static void PokedudeHandleChooseAction(void) { s32 i; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3; BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); BattlePutTextOnWindow(gText_BattleMenu, B_WIN_ACTION_MENU); for (i = 0; i < MAX_MON_MOVES; ++i) ActionSelectionDestroyCursorAt((u8)i); ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT); } else { gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction; } } static void PokedudeHandleUnknownYesNoBox(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleChooseMoveAfterDma3(void) { if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; gBattle_BG0_Y = 320; gBattlerControllerFuncs[gActiveBattler] = PokedudeHandleInputChooseMove; } } static void PokedudeHandleChooseMove(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { InitMoveSelectionsVarsAndStrings(); gBattlerControllerFuncs[gActiveBattler] = PokedudeHandleChooseMoveAfterDma3; } else { gBattlerControllerFuncs[gActiveBattler] = PokedudeHandleInputChooseMove; } } static void PokedudeHandleChooseItem(void) { s32 i; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem; gBattlerInMenuId = gActiveBattler; for (i = 0; i < 3; ++i) gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][i + 1]; } static void PokedudeHandleChoosePokemon(void) { s32 i; gBattleControllerData[gActiveBattler] = CreateTask(TaskDummy, 0xFF); gTasks[gBattleControllerData[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF; *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4; *(&gBattleStruct->playerPartyIdx) = gBattleBufferA[gActiveBattler][2]; *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3]; for (i = 0; i < 3; ++i) gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][4 + i]; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon; gBattlerInMenuId = gActiveBattler; } static void PokedudeHandleCmd23(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleHealthBarUpdate(void) { s16 hpVal; struct Pokemon *mon; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; else mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; LoadBattleBarGfx(0); hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { u32 maxHP = GetMonData(mon, MON_DATA_MAX_HP); u32 curHP = GetMonData(mon, MON_DATA_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal); } else { u32 maxHP = GetMonData(mon, MON_DATA_MAX_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal); UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT); } gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone; } static void PokedudeHandleExpUpdate(void) { u8 monId = gBattleBufferA[gActiveBattler][1]; if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL) { PokedudeBufferExecCompleted(); } else { s16 expPointsToGive; u8 taskId; LoadBattleBarGfx(1); GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // Unused return value. expPointsToGive = T1_READ_16(&gBattleBufferA[gActiveBattler][2]); taskId = CreateTask(Task_GiveExpToMon, 10); gTasks[taskId].tExpTask_monId = monId; gTasks[taskId].tExpTask_gainedExp = expPointsToGive; gTasks[taskId].tExpTask_battler = gActiveBattler; gBattlerControllerFuncs[gActiveBattler] = PokedudeDummy; } } static void PokedudeHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; struct Pokemon *mon; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; else mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_STATUS_ICON); battlerId = gActiveBattler; gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = FALSE; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void PokedudeHandleStatusAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void PokedudeHandleStatusXor(void) { struct Pokemon *mon; u8 val; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; else mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; val = GetMonData(mon, MON_DATA_STATUS) ^ gBattleBufferA[gActiveBattler][1]; SetMonData(mon, MON_DATA_STATUS, &val); PokedudeBufferExecCompleted(); } static void PokedudeHandleDataTransfer(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleDMA3Transfer(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandlePlayBGM(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleCmd32(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleTwoReturnValues(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleChosenMonReturnValue(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleOneReturnValue(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleOneReturnValue_Duplicate(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleCmd37(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleCmd38(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleCmd39(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleCmd40(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleHitAnimation(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE) { PokedudeBufferExecCompleted(); } else { gDoingBattleAnim = TRUE; gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; DoHitAnimHealthboxEffect(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect; } } static void PokedudeHandleCmd42(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandlePlaySE(void) { PlaySE(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); PokedudeBufferExecCompleted(); } static void PokedudeHandlePlayFanfare(void) { PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); PokedudeBufferExecCompleted(); } static void PokedudeHandleFaintingCry(void) { struct Pokemon *mon; u16 species; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; else mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; species = GetMonData(mon, MON_DATA_SPECIES); PlayCry_Normal(species, 25); PokedudeBufferExecCompleted(); } static void PokedudeHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; PokedudeBufferExecCompleted(); } static void PokedudeHandleIntroTrainerBallThrow(void) { u8 paletteNum; u8 taskId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[TRAINER_BACK_PIC_POKEDUDE].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; gBattlerControllerFuncs[gActiveBattler] = PokedudeDummy; } static void StartSendOutAnim(u8 battlerId) { u16 species; gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = SPECIES_NONE; gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void Task_StartSendOutAnim(u8 taskId) { if (gTasks[taskId].data[1] < 31) { ++gTasks[taskId].data[1]; } else { u8 savedActiveBattler = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; StartSendOutAnim(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBattler; DestroyTask(taskId); } } static void PokedudeHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { PokedudeBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); PokedudeBufferExecCompleted(); } } static void PokedudeHandleHidePartyStatusSummary(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleEndBounceEffect(void) { EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); EndBounceEffect(gActiveBattler, BOUNCE_MON); PokedudeBufferExecCompleted(); } static void PokedudeHandleSpriteInvisibility(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleBattleAnimation(void) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) PokedudeBufferExecCompleted(); else gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; } static void PokedudeHandleLinkStandbyMsg(void) { switch (gBattleBufferA[gActiveBattler][1]) { case 0: case 1: EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); EndBounceEffect(gActiveBattler, BOUNCE_MON); break; case 2: break; } PokedudeBufferExecCompleted(); } static void PokedudeHandleResetActionMoveSelection(void) { PokedudeBufferExecCompleted(); } static void PokedudeHandleCmd55(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(FAST_FADE_OUT_TO_BLACK); PokedudeBufferExecCompleted(); if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK) gBattlerControllerFuncs[gActiveBattler] = Pokedude_SetBattleEndCallbacks; } static void PokedudeCmdEnd(void) { } // Script handlers struct PokedudeInputScript { // 0-3 for selection, 4 to repeat action, 255 to repeat move u8 cursorPos[MAX_BATTLERS_COUNT]; u8 delay[MAX_BATTLERS_COUNT]; }; static const struct PokedudeInputScript sInputScripts_ChooseAction_Battle[] = { { .cursorPos = {0, 0}, .delay = {64, 0} }, { .cursorPos = {4, 4}, .delay = {0, 0} }, }; static const struct PokedudeInputScript sInputScripts_ChooseAction_Status[] = { { .cursorPos = {0, 0}, .delay = {64, 0} }, { .cursorPos = {1, 0}, .delay = {64, 0} }, { .cursorPos = {0, 0}, .delay = {64, 0} }, }; static const struct PokedudeInputScript sInputScripts_ChooseAction_Matchups[] = { { .cursorPos = {0, 0}, .delay = {64, 0} }, { .cursorPos = {2, 0}, .delay = {64, 0} }, { .cursorPos = {0, 0}, .delay = {64, 0} }, }; static const struct PokedudeInputScript sInputScripts_ChooseAction_Catching[] = { { .cursorPos = {0, 0}, .delay = {64, 0} }, { .cursorPos = {0, 0}, .delay = {64, 0} }, { .cursorPos = {1, 0}, .delay = {64, 0} }, }; static const struct PokedudeInputScript *const sInputScripts_ChooseAction[] = { [TTVSCR_BATTLE] = sInputScripts_ChooseAction_Battle, [TTVSCR_STATUS] = sInputScripts_ChooseAction_Status, [TTVSCR_MATCHUPS] = sInputScripts_ChooseAction_Matchups, [TTVSCR_CATCHING] = sInputScripts_ChooseAction_Catching, }; static const struct PokedudeInputScript sInputScripts_ChooseMove_Battle[] = { { .cursorPos = { 2, 2}, .delay = { 64, 0} }, { .cursorPos = {255, 255}, .delay = { 0, 0} }, }; static const struct PokedudeInputScript sInputScripts_ChooseMove_Status[] = { { .cursorPos = { 2, 2}, .delay = { 64, 0} }, { .cursorPos = { 2, 0}, .delay = { 64, 0} }, { .cursorPos = { 2, 0}, .delay = { 64, 0} }, { .cursorPos = {255, 255}, .delay = { 0, 0} }, }; static const struct PokedudeInputScript sInputScripts_ChooseMove_Matchups[] = { { .cursorPos = { 2, 0}, .delay = { 64, 0} }, { .cursorPos = { 0, 0}, .delay = { 64, 0} }, { .cursorPos = { 0, 0}, .delay = { 64, 0} }, { .cursorPos = {255, 255}, .delay = { 0, 0} }, }; static const struct PokedudeInputScript sInputScripts_ChooseMove_Catching[] = { { .cursorPos = { 0, 2}, .delay = { 64, 0} }, { .cursorPos = { 2, 2}, .delay = { 64, 0} }, { .cursorPos = {255, 255}, .delay = { 0, 0} }, }; static const struct PokedudeInputScript *const sInputScripts_ChooseMove[] = { [TTVSCR_BATTLE] = sInputScripts_ChooseMove_Battle, [TTVSCR_STATUS] = sInputScripts_ChooseMove_Status, [TTVSCR_MATCHUPS] = sInputScripts_ChooseMove_Matchups, [TTVSCR_CATCHING] = sInputScripts_ChooseMove_Catching, }; static const struct PokedudeTextScriptHeader sPokedudeTextScripts_Battle[] = { { .btlcmd = CONTROLLER_CHOOSEACTION, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_PRINTSTRING, .side = B_SIDE_OPPONENT, .stringid = STRINGID_USEDMOVE, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_CHOOSEACTION, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_PRINTSTRING, .side = B_SIDE_PLAYER, .stringid = STRINGID_PKMNGAINEDEXP, .callback = PokedudeAction_PrintVoiceoverMessage, }, }; static const struct PokedudeTextScriptHeader sPokedudeTextScripts_Status[] = { { .btlcmd = CONTROLLER_CHOOSEACTION, .side = B_SIDE_PLAYER, .callback = NULL, }, { .btlcmd = CONTROLLER_CHOOSEACTION, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintMessageWithHealthboxPals, }, { .btlcmd = CONTROLLER_OPENBAG, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_PRINTSTRING, .side = B_SIDE_OPPONENT, .stringid = STRINGID_USEDMOVE, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_PRINTSTRING, .side = B_SIDE_PLAYER, .stringid = STRINGID_PKMNGAINEDEXP, .callback = PokedudeAction_PrintVoiceoverMessage, }, }; static const struct PokedudeTextScriptHeader sPokedudeTextScripts_Matchups[] = { { .btlcmd = CONTROLLER_PRINTSTRING, .side = B_SIDE_OPPONENT, .stringid = STRINGID_USEDMOVE, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_CHOOSEACTION, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_CHOOSEPOKEMON, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_PRINTSTRING, .side = B_SIDE_OPPONENT, .stringid = STRINGID_USEDMOVE, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_CHOOSEACTION, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_CHOOSEMOVE, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_PRINTSTRING, .side = B_SIDE_PLAYER, .stringid = STRINGID_PKMNGAINEDEXP, .callback = PokedudeAction_PrintVoiceoverMessage, }, }; static const struct PokedudeTextScriptHeader sPokedudeTextScripts_Catching[] = { { .btlcmd = CONTROLLER_CHOOSEACTION, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_CHOOSEACTION, .side = B_SIDE_PLAYER, .callback = NULL, }, { .btlcmd = CONTROLLER_CHOOSEACTION, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_PRINTSTRING, .side = B_SIDE_OPPONENT, .stringid = STRINGID_PKMNFASTASLEEP, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_OPENBAG, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, { .btlcmd = CONTROLLER_ENDLINKBATTLE, .side = B_SIDE_PLAYER, .callback = PokedudeAction_PrintVoiceoverMessage, }, }; static const struct PokedudeTextScriptHeader *const sPokedudeTextScripts[] = { [TTVSCR_BATTLE] = sPokedudeTextScripts_Battle, [TTVSCR_STATUS] = sPokedudeTextScripts_Status, [TTVSCR_MATCHUPS] = sPokedudeTextScripts_Matchups, [TTVSCR_CATCHING] = sPokedudeTextScripts_Catching, }; static const u8 *const sPokedudeTexts_Battle[] = { Pokedude_Text_SpeedierBattlerGoesFirst, Pokedude_Text_MyRattataFasterThanPidgey, Pokedude_Text_BattlersTakeTurnsAttacking, Pokedude_Text_MyRattataWonGetsEXP, }; static const u8 *const sPokedudeTexts_Status[] = { Pokedude_Text_UhOhRattataPoisoned, Pokedude_Text_UhOhRattataPoisoned, Pokedude_Text_HealStatusRightAway, Pokedude_Text_UsingItemTakesTurn, Pokedude_Text_YayWeManagedToWin, }; static const u8 *const sPokedudeTexts_TypeMatchup[] = { Pokedude_Text_WaterNotVeryEffectiveAgainstGrass, Pokedude_Text_GrassEffectiveAgainstWater, Pokedude_Text_LetsTryShiftingMons, Pokedude_Text_ShiftingUsesTurn, Pokedude_Text_ButterfreeDoubleResistsGrass, Pokedude_Text_ButterfreeGoodAgainstOddish, Pokedude_Text_YeahWeWon, }; static const u8 *const sPokedudeTexts_Catching[] = { Pokedude_Text_WeakenMonBeforeCatching, Pokedude_Text_WeakenMonBeforeCatching, Pokedude_Text_BestIfTargetStatused, Pokedude_Text_CantDoubleUpOnStatus, Pokedude_Text_LetMeThrowBall, Pokedude_Text_PickBestKindOfBall, }; static const struct PokedudeBattlePartyInfo sParties_Battle[] = { { .side = B_SIDE_PLAYER, .level = 15, .species = SPECIES_RATTATA, .moves = { MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_HYPER_FANG, MOVE_QUICK_ATTACK }, .nature = NATURE_LONELY, .gender = MALE, }, { .side = B_SIDE_OPPONENT, .level = 18, .species = SPECIES_PIDGEY, .moves = { MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK }, .nature = NATURE_NAUGHTY, .gender = MALE, }, {0xFF} }; static const struct PokedudeBattlePartyInfo sParties_Status[] = { { .side = B_SIDE_PLAYER, .level = 15, .species = SPECIES_RATTATA, .moves = { MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_HYPER_FANG, MOVE_QUICK_ATTACK }, .nature = NATURE_LONELY, .gender = MALE, }, { .side = B_SIDE_OPPONENT, .level = 14, .species = SPECIES_ODDISH, .moves = { MOVE_ABSORB, MOVE_SWEET_SCENT, MOVE_POISON_POWDER }, .nature = NATURE_RASH, .gender = MALE, }, {0xFF} }; static const struct PokedudeBattlePartyInfo sParties_Matchups[] = { { .side = B_SIDE_PLAYER, .level = 15, .species = SPECIES_POLIWAG, .moves = { MOVE_WATER_GUN, MOVE_HYPNOSIS, MOVE_BUBBLE }, .nature = NATURE_RASH, .gender = MALE, }, { .side = B_SIDE_PLAYER, .level = 15, .species = SPECIES_BUTTERFREE, .moves = { MOVE_CONFUSION, MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER }, .nature = NATURE_RASH, .gender = MALE, }, { .side = B_SIDE_OPPONENT, .level = 14, .species = SPECIES_ODDISH, .moves = { MOVE_ABSORB, MOVE_SWEET_SCENT, MOVE_POISON_POWDER }, .nature = NATURE_RASH, .gender = MALE, }, {0xFF} }; static const struct PokedudeBattlePartyInfo sParties_Catching[] = { { .side = B_SIDE_PLAYER, .level = 15, .species = SPECIES_BUTTERFREE, .moves = { MOVE_CONFUSION, MOVE_POISON_POWDER, MOVE_SLEEP_POWDER, MOVE_STUN_SPORE }, .nature = NATURE_RASH, .gender = MALE, }, { .side = B_SIDE_OPPONENT, .level = 11, .species = SPECIES_JIGGLYPUFF, .moves = { MOVE_SING, MOVE_DEFENSE_CURL, MOVE_POUND }, .nature = NATURE_CAREFUL, .gender = MALE, }, {0xFF} }; static const struct PokedudeBattlePartyInfo *const sPokedudeBattlePartyPointers[] = { [TTVSCR_BATTLE] = sParties_Battle, [TTVSCR_STATUS] = sParties_Status, [TTVSCR_MATCHUPS] = sParties_Matchups, [TTVSCR_CATCHING] = sParties_Catching, }; struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT]; static void PokedudeSimulateInputChooseAction(void) { const struct PokedudeInputScript *script_p = sInputScripts_ChooseAction[gBattleStruct->pdScriptNum]; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); } if (script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].delay[gActiveBattler] == gPokedudeBattlerStates[gActiveBattler]->timer) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) PlaySE(SE_SELECT); gPokedudeBattlerStates[gActiveBattler]->timer = 0; switch (script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].cursorPos[gActiveBattler]) { case 0: BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0); break; case 1: BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0); break; case 2: BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); break; case 3: BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0); break; } PokedudeBufferExecCompleted(); ++gPokedudeBattlerStates[gActiveBattler]->action_idx; if (script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].cursorPos[gActiveBattler] == 4) gPokedudeBattlerStates[gActiveBattler]->action_idx = 0; } else { if (gActionSelectionCursor[gActiveBattler] != script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].cursorPos[gActiveBattler] && script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].delay[gActiveBattler] / 2 == gPokedudeBattlerStates[gActiveBattler]->timer) { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] = script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].cursorPos[gActiveBattler]; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } ++gPokedudeBattlerStates[gActiveBattler]->timer; } } static void PokedudeSimulateInputChooseMove(void) { const struct PokedudeInputScript *script_p = sInputScripts_ChooseMove[gBattleStruct->pdScriptNum]; if (script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].delay[gActiveBattler] == gPokedudeBattlerStates[gActiveBattler]->timer) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) PlaySE(SE_SELECT); gPokedudeBattlerStates[gActiveBattler]->timer = 0; BtlController_EmitTwoReturnValues(1, B_ACTION_EXEC_SCRIPT, script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].cursorPos[gActiveBattler] | ((gActiveBattler ^ BIT_SIDE) << 8)); PokedudeBufferExecCompleted(); ++gPokedudeBattlerStates[gActiveBattler]->move_idx; if (script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].cursorPos[gActiveBattler] == 255) gPokedudeBattlerStates[gActiveBattler]->move_idx = 0; } else { if (script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].cursorPos[gActiveBattler] != gMoveSelectionCursor[gActiveBattler] && script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].delay[gActiveBattler] / 2 == gPokedudeBattlerStates[gActiveBattler]->timer) { PlaySE(SE_SELECT); MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] = script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].cursorPos[gActiveBattler]; MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0); } ++gPokedudeBattlerStates[gActiveBattler]->timer; } } static bool8 HandlePokedudeVoiceoverEtc(void) { const struct PokedudeTextScriptHeader *header_p = sPokedudeTextScripts[gBattleStruct->pdScriptNum]; const u16 * bstringid_p = (const u16 *)&gBattleBufferA[gActiveBattler][2]; if (gBattleBufferA[gActiveBattler][0] != header_p[gBattleStruct->pdMessageNo].btlcmd) return FALSE; if (gActiveBattler != header_p[gBattleStruct->pdMessageNo].side) return FALSE; if (gBattleBufferA[gActiveBattler][0] == CONTROLLER_PRINTSTRING && header_p[gBattleStruct->pdMessageNo].stringid != *bstringid_p) return FALSE; if (header_p[gBattleStruct->pdMessageNo].callback == NULL) { gBattleStruct->pdMessageNo++; return FALSE; } gBattlerControllerFuncs[gActiveBattler] = header_p[gBattleStruct->pdMessageNo].callback; gPokedudeBattlerStates[gActiveBattler]->timer = 0; gPokedudeBattlerStates[gActiveBattler]->msg_idx = header_p[gBattleStruct->pdMessageNo].stringid; gBattleStruct->pdMessageNo++; return TRUE; } static void ReturnFromPokedudeAction(void) { gPokedudeBattlerStates[gActiveBattler]->timer = 0; gBattlerControllerFuncs[gActiveBattler] = PokedudeBufferRunCommand; } static void PokedudeAction_PrintVoiceoverMessage(void) { switch (gPokedudeBattlerStates[gActiveBattler]->timer) { case 0: if (!gPaletteFade.active) { BeginNormalPaletteFade(0xFFFFFF7F, 4, 0, 8, RGB_BLACK); ++gPokedudeBattlerStates[gActiveBattler]->timer; } break; case 1: if (!gPaletteFade.active) { gPokedudeBattlerStates[gActiveBattler]->saved_bg0y = gBattle_BG0_Y; BtlCtrl_DrawVoiceoverMessageFrame(); ++gPokedudeBattlerStates[gActiveBattler]->timer; } break; case 2: gBattle_BG0_Y = 0; BattleStringExpandPlaceholdersToDisplayedString(GetPokedudeText()); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN); ++gPokedudeBattlerStates[gActiveBattler]->timer; break; case 3: if (!IsTextPrinterActive(24) && JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); BeginNormalPaletteFade(0xFFFFFF7F, 4, 8, 0, RGB_BLACK); ++gPokedudeBattlerStates[gActiveBattler]->timer; } break; case 4: if (!gPaletteFade.active) { if (gPokedudeBattlerStates[gActiveBattler]->msg_idx == STRINGID_PKMNGAINEDEXP) { BattleStopLowHpSound(); PlayBGM(MUS_VICTORY_WILD); } gBattle_BG0_Y = gPokedudeBattlerStates[gActiveBattler]->saved_bg0y; BtlCtrl_RemoveVoiceoverMessageFrame(); ReturnFromPokedudeAction(); } break; } } static void PokedudeAction_PrintMessageWithHealthboxPals(void) { switch (gPokedudeBattlerStates[gActiveBattler]->timer) { case 0: if (!gPaletteFade.active) { DoLoadHealthboxPalsForLevelUp(&gBattleStruct->pdHealthboxPal2, &gBattleStruct->pdHealthboxPal1, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); BeginNormalPaletteFade(0xFFFFFF7F, 4, 0, 8, RGB_BLACK); ++gPokedudeBattlerStates[gActiveBattler]->timer; } break; case 1: if (!gPaletteFade.active) { u32 mask = (gBitTable[gBattleStruct->pdHealthboxPal2] | gBitTable[gBattleStruct->pdHealthboxPal1]) << 16; ++mask; // It's possible that this is influenced by other functions, as --mask; // this also striked in battle_controller_oak_old_man.c but was naturally fixed. BeginNormalPaletteFade(mask, 4, 8, 0, RGB_BLACK); ++gPokedudeBattlerStates[gActiveBattler]->timer; } break; case 2: if (!gPaletteFade.active) { BtlCtrl_DrawVoiceoverMessageFrame(); ++gPokedudeBattlerStates[gActiveBattler]->timer; } break; case 3: BattleStringExpandPlaceholdersToDisplayedString(GetPokedudeText()); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN); ++gPokedudeBattlerStates[gActiveBattler]->timer; break; case 4: if (!IsTextPrinterActive(24) && JOY_NEW(A_BUTTON)) { u32 mask; PlaySE(SE_SELECT); mask = (gBitTable[gBattleStruct->pdHealthboxPal2] | gBitTable[gBattleStruct->pdHealthboxPal1]) << 16; ++mask; --mask; BeginNormalPaletteFade(mask, 4, 0, 8, RGB_BLACK); ++gPokedudeBattlerStates[gActiveBattler]->timer; } break; case 5: if (!gPaletteFade.active) { BeginNormalPaletteFade(0xFFFFFF7F, 4, 8, 0, RGB_BLACK); ++gPokedudeBattlerStates[gActiveBattler]->timer; } break; case 6: if (!gPaletteFade.active) { if (gPokedudeBattlerStates[gActiveBattler]->msg_idx == STRINGID_PKMNGAINEDEXP) { BattleStopLowHpSound(); PlayBGM(MUS_VICTORY_WILD); } DoFreeHealthboxPalsForLevelUp(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); BtlCtrl_RemoveVoiceoverMessageFrame(); ReturnFromPokedudeAction(); } break; } } static const u8 *GetPokedudeText(void) { switch (gBattleStruct->pdScriptNum) { case TTVSCR_BATTLE: default: return sPokedudeTexts_Battle[gBattleStruct->pdMessageNo - 1]; case TTVSCR_STATUS: return sPokedudeTexts_Status[gBattleStruct->pdMessageNo - 1]; case TTVSCR_MATCHUPS: return sPokedudeTexts_TypeMatchup[gBattleStruct->pdMessageNo - 1]; case TTVSCR_CATCHING: return sPokedudeTexts_Catching[gBattleStruct->pdMessageNo - 1]; } } void InitPokedudePartyAndOpponent(void) { s32 i, j; struct Pokemon *mon; s32 myIdx = 0; s32 opIdx = 0; const struct PokedudeBattlePartyInfo *data; gBattleTypeFlags = BATTLE_TYPE_POKEDUDE; ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); data = sPokedudeBattlePartyPointers[gSpecialVar_0x8004]; i = 0; do { if (data[i].side == B_SIDE_PLAYER) mon = &gPlayerParty[myIdx++]; else mon = &gEnemyParty[opIdx++]; CreateMonWithGenderNatureLetter(mon, data[i].species, data[i].level, 0, data[i].gender, data[i].nature, 0); for (j = 0; j < 4; ++j) SetMonMoveSlot(mon, data[i].moves[j], j); } while (data[++i].side != 0xFF); } ================================================ FILE: src/battle_controller_safari.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_message.h" #include "data.h" #include "item_menu.h" #include "link.h" #include "main.h" #include "pokeball.h" #include "util.h" #include "strings.h" #include "constants/songs.h" #include "constants/battle_anim.h" static void SafariHandleGetMonData(void); static void SafariHandleGetRawMonData(void); static void SafariHandleSetMonData(void); static void SafariHandleSetRawMonData(void); static void SafariHandleLoadMonSprite(void); static void SafariHandleSwitchInAnim(void); static void SafariHandleReturnMonToBall(void); static void SafariHandleDrawTrainerPic(void); static void SafariHandleTrainerSlide(void); static void SafariHandleTrainerSlideBack(void); static void SafariHandleFaintAnimation(void); static void SafariHandlePaletteFade(void); static void SafariHandleSuccessBallThrowAnim(void); static void SafariHandleBallThrowAnim(void); static void SafariHandlePause(void); static void SafariHandleMoveAnimation(void); static void SafariHandlePrintString(void); static void SafariHandlePrintSelectionString(void); static void SafariHandleChooseAction(void); static void SafariHandleUnknownYesNoBox(void); static void SafariHandleChooseMove(void); static void SafariHandleChooseItem(void); static void SafariHandleChoosePokemon(void); static void SafariHandleCmd23(void); static void SafariHandleHealthBarUpdate(void); static void SafariHandleExpUpdate(void); static void SafariHandleStatusIconUpdate(void); static void SafariHandleStatusAnimation(void); static void SafariHandleStatusXor(void); static void SafariHandleDataTransfer(void); static void SafariHandleDMA3Transfer(void); static void SafariHandlePlayBGM(void); static void SafariHandleCmd32(void); static void SafariHandleTwoReturnValues(void); static void SafariHandleChosenMonReturnValue(void); static void SafariHandleOneReturnValue(void); static void SafariHandleOneReturnValue_Duplicate(void); static void SafariHandleCmd37(void); static void SafariHandleCmd38(void); static void SafariHandleCmd39(void); static void SafariHandleCmd40(void); static void SafariHandleHitAnimation(void); static void SafariHandleCmd42(void); static void SafariHandlePlaySE(void); static void SafariHandlePlayFanfareOrBGM(void); static void SafariHandleFaintingCry(void); static void SafariHandleIntroSlide(void); static void SafariHandleIntroTrainerBallThrow(void); static void SafariHandleDrawPartyStatusSummary(void); static void SafariHandleHidePartyStatusSummary(void); static void SafariHandleEndBounceEffect(void); static void SafariHandleSpriteInvisibility(void); static void SafariHandleBattleAnimation(void); static void SafariHandleLinkStandbyMsg(void); static void SafariHandleResetActionMoveSelection(void); static void SafariHandleCmd55(void); static void SafariCmdEnd(void); static void SafariBufferRunCommand(void); static void SafariBufferExecCompleted(void); static void CompleteWhenChosePokeblock(void); static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { [CONTROLLER_GETMONDATA] = SafariHandleGetMonData, [CONTROLLER_GETRAWMONDATA] = SafariHandleGetRawMonData, [CONTROLLER_SETMONDATA] = SafariHandleSetMonData, [CONTROLLER_SETRAWMONDATA] = SafariHandleSetRawMonData, [CONTROLLER_LOADMONSPRITE] = SafariHandleLoadMonSprite, [CONTROLLER_SWITCHINANIM] = SafariHandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = SafariHandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = SafariHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = SafariHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = SafariHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = SafariHandleFaintAnimation, [CONTROLLER_PALETTEFADE] = SafariHandlePaletteFade, [CONTROLLER_SUCCESSBALLTHROWANIM] = SafariHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = SafariHandleBallThrowAnim, [CONTROLLER_PAUSE] = SafariHandlePause, [CONTROLLER_MOVEANIMATION] = SafariHandleMoveAnimation, [CONTROLLER_PRINTSTRING] = SafariHandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = SafariHandlePrintSelectionString, [CONTROLLER_CHOOSEACTION] = SafariHandleChooseAction, [CONTROLLER_UNKNOWNYESNOBOX] = SafariHandleUnknownYesNoBox, [CONTROLLER_CHOOSEMOVE] = SafariHandleChooseMove, [CONTROLLER_OPENBAG] = SafariHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = SafariHandleChoosePokemon, [CONTROLLER_23] = SafariHandleCmd23, [CONTROLLER_HEALTHBARUPDATE] = SafariHandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = SafariHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = SafariHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = SafariHandleStatusAnimation, [CONTROLLER_STATUSXOR] = SafariHandleStatusXor, [CONTROLLER_DATATRANSFER] = SafariHandleDataTransfer, [CONTROLLER_DMA3TRANSFER] = SafariHandleDMA3Transfer, [CONTROLLER_PLAYBGM] = SafariHandlePlayBGM, [CONTROLLER_32] = SafariHandleCmd32, [CONTROLLER_TWORETURNVALUES] = SafariHandleTwoReturnValues, [CONTROLLER_CHOSENMONRETURNVALUE] = SafariHandleChosenMonReturnValue, [CONTROLLER_ONERETURNVALUE] = SafariHandleOneReturnValue, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = SafariHandleOneReturnValue_Duplicate, [CONTROLLER_CLEARUNKVAR] = SafariHandleCmd37, [CONTROLLER_SETUNKVAR] = SafariHandleCmd38, [CONTROLLER_CLEARUNKFLAG] = SafariHandleCmd39, [CONTROLLER_TOGGLEUNKFLAG] = SafariHandleCmd40, [CONTROLLER_HITANIMATION] = SafariHandleHitAnimation, [CONTROLLER_CANTSWITCH] = SafariHandleCmd42, [CONTROLLER_PLAYSE] = SafariHandlePlaySE, [CONTROLLER_PLAYFANFARE] = SafariHandlePlayFanfareOrBGM, [CONTROLLER_FAINTINGCRY] = SafariHandleFaintingCry, [CONTROLLER_INTROSLIDE] = SafariHandleIntroSlide, [CONTROLLER_INTROTRAINERBALLTHROW] = SafariHandleIntroTrainerBallThrow, [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = SafariHandleDrawPartyStatusSummary, [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = SafariHandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = SafariHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = SafariHandleSpriteInvisibility, [CONTROLLER_BATTLEANIMATION] = SafariHandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = SafariHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = SafariHandleResetActionMoveSelection, [CONTROLLER_ENDLINKBATTLE] = SafariHandleCmd55, [CONTROLLER_TERMINATOR_NOP] = SafariCmdEnd, }; // not used static void SafariDummy(void) { } void SetControllerToSafari(void) { gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand; } static void SafariBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { if (gBattleBufferA[gActiveBattler][0] < NELEMS(sSafariBufferCommands)) sSafariBufferCommands[gBattleBufferA[gActiveBattler][0]](); else SafariBufferExecCompleted(); } } static void HandleInputChooseAction(void) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); switch (gActionSelectionCursor[gActiveBattler]) { case 0: BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_BALL, 0); break; case 1: BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_BAIT, 0); break; case 2: BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_GO_NEAR, 0); break; case 3: BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_RUN, 0); break; } SafariBufferExecCompleted(); } else if (JOY_NEW(DPAD_LEFT)) { if (gActionSelectionCursor[gActiveBattler] & 1) { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 1; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(DPAD_RIGHT)) { if (!(gActionSelectionCursor[gActiveBattler] & 1)) { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 1; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(DPAD_UP)) { if (gActionSelectionCursor[gActiveBattler] & 2) { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 2; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(DPAD_DOWN)) { if (!(gActionSelectionCursor[gActiveBattler] & 2)) { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] ^= 2; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]); gActionSelectionCursor[gActiveBattler] = 3; ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); } } static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) SafariBufferExecCompleted(); } static void CompleteOnInactiveTextPrinter(void) { if (!IsTextPrinterActive(0)) SafariBufferExecCompleted(); } static void CompleteOnHealthboxSpriteCallbackDummy(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) SafariBufferExecCompleted(); } static void Safari_SetBattleEndCallbacks(void) { if (!gPaletteFade.active) { gMain.inBattle = FALSE; gMain.callback1 = gPreBattleCallback1; SetMainCallback2(gMain.savedCallback); } } static void CompleteOnSpecialAnimDone(void) { if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) SafariBufferExecCompleted(); } static void SafariOpenPokeblockCase(void) { if (!gPaletteFade.active) gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChosePokeblock; } static void CompleteWhenChosePokeblock(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId); SafariBufferExecCompleted(); } } static void CompleteOnFinishedBattleAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) SafariBufferExecCompleted(); } static void SafariBufferExecCompleted(void) { gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { gBattleControllerExecFlags &= ~gBitTable[gActiveBattler]; } } // not used static void CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) SafariBufferExecCompleted(); } static void SafariHandleGetMonData(void) { SafariBufferExecCompleted(); } static void SafariHandleGetRawMonData(void) { SafariBufferExecCompleted(); } static void SafariHandleSetMonData(void) { SafariBufferExecCompleted(); } static void SafariHandleSetRawMonData(void) { SafariBufferExecCompleted(); } static void SafariHandleLoadMonSprite(void) { SafariBufferExecCompleted(); } static void SafariHandleSwitchInAnim(void) { SafariBufferExecCompleted(); } static void SafariHandleReturnMonToBall(void) { SafariBufferExecCompleted(); } static void SafariHandleDrawTrainerPic(void) { DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80, 30); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -240; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void SafariHandleTrainerSlide(void) { SafariBufferExecCompleted(); } static void SafariHandleTrainerSlideBack(void) { SafariBufferExecCompleted(); } static void SafariHandleFaintAnimation(void) { SafariBufferExecCompleted(); } static void SafariHandlePaletteFade(void) { SafariBufferExecCompleted(); } static void SafariHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void SafariHandleBallThrowAnim(void) { u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void SafariHandlePause(void) { SafariBufferExecCompleted(); } static void SafariHandleMoveAnimation(void) { SafariBufferExecCompleted(); } static void SafariHandlePrintString(void) { u16 *stringId; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); if (BattleStringShouldBeColored(*stringId)) BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT)); else BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } static void SafariHandlePrintSelectionString(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) SafariHandlePrintString(); else SafariBufferExecCompleted(); } static void HandleChooseActionAfterDma3(void) { if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; gBattle_BG0_Y = 160; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction; } } static void SafariHandleChooseAction(void) { s32 i; gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3; BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); BattlePutTextOnWindow(gText_SafariZoneMenu, B_WIN_ACTION_MENU); for (i = 0; i < 4; ++i) ActionSelectionDestroyCursorAt(i); ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPlayerThrow); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT); } static void SafariHandleUnknownYesNoBox(void) { SafariBufferExecCompleted(); } static void SafariHandleChooseMove(void) { SafariBufferExecCompleted(); } static void SafariHandleChooseItem(void) { s32 i; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = SafariOpenPokeblockCase; gBattlerInMenuId = gActiveBattler; } static void SafariHandleChoosePokemon(void) { SafariBufferExecCompleted(); } static void SafariHandleCmd23(void) { SafariBufferExecCompleted(); } static void SafariHandleHealthBarUpdate(void) { SafariBufferExecCompleted(); } static void SafariHandleExpUpdate(void) { SafariBufferExecCompleted(); } static void SafariHandleStatusIconUpdate(void) { UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_BALLS_TEXT); SafariBufferExecCompleted(); } static void SafariHandleStatusAnimation(void) { SafariBufferExecCompleted(); } static void SafariHandleStatusXor(void) { SafariBufferExecCompleted(); } static void SafariHandleDataTransfer(void) { SafariBufferExecCompleted(); } static void SafariHandleDMA3Transfer(void) { SafariBufferExecCompleted(); } static void SafariHandlePlayBGM(void) { SafariBufferExecCompleted(); } static void SafariHandleCmd32(void) { SafariBufferExecCompleted(); } static void SafariHandleTwoReturnValues(void) { SafariBufferExecCompleted(); } static void SafariHandleChosenMonReturnValue(void) { SafariBufferExecCompleted(); } static void SafariHandleOneReturnValue(void) { SafariBufferExecCompleted(); } static void SafariHandleOneReturnValue_Duplicate(void) { SafariBufferExecCompleted(); } static void SafariHandleCmd37(void) { SafariBufferExecCompleted(); } static void SafariHandleCmd38(void) { SafariBufferExecCompleted(); } static void SafariHandleCmd39(void) { SafariBufferExecCompleted(); } static void SafariHandleCmd40(void) { SafariBufferExecCompleted(); } static void SafariHandleHitAnimation(void) { SafariBufferExecCompleted(); } static void SafariHandleCmd42(void) { SafariBufferExecCompleted(); } static void SafariHandlePlaySE(void) { s8 pan; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) pan = SOUND_PAN_ATTACKER; else pan = SOUND_PAN_TARGET; PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); SafariBufferExecCompleted(); } static void SafariHandlePlayFanfareOrBGM(void) { PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); SafariBufferExecCompleted(); } static void SafariHandleFaintingCry(void) { u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); PlayCry_Normal(species, 25); SafariBufferExecCompleted(); } static void SafariHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; SafariBufferExecCompleted(); } static void SafariHandleIntroTrainerBallThrow(void) { UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_ALL_TEXT); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthboxSpriteCallbackDummy; } static void SafariHandleDrawPartyStatusSummary(void) { SafariBufferExecCompleted(); } static void SafariHandleHidePartyStatusSummary(void) { SafariBufferExecCompleted(); } static void SafariHandleEndBounceEffect(void) { SafariBufferExecCompleted(); } static void SafariHandleSpriteInvisibility(void) { SafariBufferExecCompleted(); } static void SafariHandleBattleAnimation(void) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) SafariBufferExecCompleted(); else gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; } static void SafariHandleLinkStandbyMsg(void) { SafariBufferExecCompleted(); } static void SafariHandleResetActionMoveSelection(void) { SafariBufferExecCompleted(); } static void SafariHandleCmd55(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); SafariBufferExecCompleted(); if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) gBattlerControllerFuncs[gActiveBattler] = Safari_SetBattleEndCallbacks; } static void SafariCmdEnd(void) { } ================================================ FILE: src/battle_controllers.c ================================================ #include "global.h" #include "battle.h" #include "battle_ai_script_commands.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_message.h" #include "cable_club.h" #include "link.h" #include "link_rfu.h" #include "party_menu.h" #include "task.h" #include "util.h" #include "constants/abilities.h" static EWRAM_DATA u8 sLinkSendTaskId = 0; static EWRAM_DATA u8 sLinkReceiveTaskId = 0; static EWRAM_DATA u8 sUnused = 0; // Debug? Never read EWRAM_DATA struct UnusedControllerStruct gUnusedControllerStruct = {}; // Debug? Unused code that writes to it, never read static EWRAM_DATA u8 sBattleBuffersTransferData[0x100] = {}; static void CreateTasksForSendRecvLinkBuffers(void); static void InitLinkBtlControllers(void); static void InitSinglePlayerBtlControllers(void); static void SetBattlePartyIds(void); static void Task_HandleSendLinkBuffersData(u8 taskId); static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId); void HandleLinkBattleSetup(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (gWirelessCommType) SetWirelessCommType1(); if (!gReceivedRemoteLinkPlayers) OpenLink(); CreateTask(Task_WaitForLinkPlayerConnection, 0); CreateTasksForSendRecvLinkBuffers(); } } void SetUpBattleVars(void) { s32 i; gBattleMainFunc = BeginBattleIntroDummy; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gBattlerControllerFuncs[i] = BattleControllerDummy; gBattlerPositions[i] = 0xFF; gActionSelectionCursor[i] = 0; gMoveSelectionCursor[i] = 0; } HandleLinkBattleSetup(); gBattleControllerExecFlags = 0; ClearBattleAnimationVars(); ClearBattleMonForms(); BattleAI_HandleItemUseBeforeAISetup(); // Below are never read gUnusedFirstBattleVar1 = 0; gUnusedFirstBattleVar2 = 0; } void InitBattleControllers(void) { s32 i; if (gBattleTypeFlags & BATTLE_TYPE_LINK) InitLinkBtlControllers(); else InitSinglePlayerBtlControllers(); SetBattlePartyIds(); if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { for (i = 0; i < gBattlersCount; i++) BufferBattlePartyCurrentOrderBySide(i, 0); } } static void InitSinglePlayerBtlControllers(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { gBattleMainFunc = BeginBattleIntro; if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) { gBattlerControllerFuncs[0] = SetControllerToPokedude; gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; gBattlerControllerFuncs[1] = SetControllerToPokedude; gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; gBattlersCount = 2; } else { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) gBattlerControllerFuncs[0] = SetControllerToSafari; else if (gBattleTypeFlags & (BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) gBattlerControllerFuncs[0] = SetControllerToOakOrOldMan; else gBattlerControllerFuncs[0] = SetControllerToPlayer; gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; gBattlerControllerFuncs[1] = SetControllerToOpponent; gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; gBattlersCount = 2; } } else { gBattleMainFunc = BeginBattleIntro; if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) { gBattlerControllerFuncs[0] = SetControllerToPokedude; gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; gBattlerControllerFuncs[1] = SetControllerToPokedude; gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; gBattlerControllerFuncs[2] = SetControllerToPokedude; gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; gBattlerControllerFuncs[3] = SetControllerToPokedude; gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; } else { gBattlerControllerFuncs[0] = SetControllerToPlayer; gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; gBattlerControllerFuncs[1] = SetControllerToOpponent; gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; gBattlerControllerFuncs[2] = SetControllerToPlayer; gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; gBattlerControllerFuncs[3] = SetControllerToOpponent; gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; } } } static void InitLinkBtlControllers(void) { s32 i; u8 multiplayerId; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) { gBattleMainFunc = BeginBattleIntro; gBattlerControllerFuncs[0] = SetControllerToPlayer; gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; gBattlerControllerFuncs[1] = SetControllerToLinkOpponent; gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; gBattlersCount = 2; } else { gBattlerControllerFuncs[1] = SetControllerToPlayer; gBattlerPositions[1] = B_POSITION_PLAYER_LEFT; gBattlerControllerFuncs[0] = SetControllerToLinkOpponent; gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT; gBattlersCount = 2; } } else if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) { gBattleMainFunc = BeginBattleIntro; gBattlerControllerFuncs[0] = SetControllerToPlayer; gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; gBattlerControllerFuncs[1] = SetControllerToLinkOpponent; gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; gBattlerControllerFuncs[2] = SetControllerToPlayer; gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; gBattlerControllerFuncs[3] = SetControllerToLinkOpponent; gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; } else { gBattlerControllerFuncs[1] = SetControllerToPlayer; gBattlerPositions[1] = B_POSITION_PLAYER_LEFT; gBattlerControllerFuncs[0] = SetControllerToLinkOpponent; gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT; gBattlerControllerFuncs[3] = SetControllerToPlayer; gBattlerPositions[3] = B_POSITION_PLAYER_RIGHT; gBattlerControllerFuncs[2] = SetControllerToLinkOpponent; gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; } } else { multiplayerId = GetMultiplayerId(); if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) gBattleMainFunc = BeginBattleIntro; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { switch (gLinkPlayers[i].id) { case 0: case 3: BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 0); break; case 1: case 2: BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 1); break; } if (i == multiplayerId) { gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToPlayer; switch (gLinkPlayers[i].id) { case 0: case 3: gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; break; case 1: case 2: gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; break; } } else { if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1)) || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1))) { gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkPartner; switch (gLinkPlayers[i].id) { case 0: case 3: gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; break; case 1: case 2: gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT; break; } } else { gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkOpponent; switch (gLinkPlayers[i].id) { case 0: case 3: gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT; gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; break; case 1: case 2: gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT; gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT; break; } } } } gBattlersCount = MAX_BATTLERS_COUNT; } } static void SetBattlePartyIds(void) { s32 i, j; if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { for (i = 0; i < gBattlersCount; i++) { for (j = 0; j < PARTY_SIZE; ++j) { if (i < 2) { if (GET_BATTLER_SIDE2(i) == B_SIDE_PLAYER) { if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG && !GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG)) { gBattlerPartyIndexes[i] = j; break; } } else { if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG && !GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG)) { gBattlerPartyIndexes[i] = j; break; } } } else { if (GET_BATTLER_SIDE2(i) == B_SIDE_PLAYER) { if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != SPECIES_NONE // Probably a typo by Game Freak. The rest use SPECIES2. && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG && !GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) && gBattlerPartyIndexes[i - 2] != j) { gBattlerPartyIndexes[i] = j; break; } } else { if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG && !GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) && gBattlerPartyIndexes[i - 2] != j) { gBattlerPartyIndexes[i] = j; break; } } } } } } } static void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) { s32 i; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { PrepareBufferDataTransferLink(bufferId, size, data); } else { switch (bufferId) { case BUFFER_A: for (i = 0; i < size; data++, i++) gBattleBufferA[gActiveBattler][i] = *data; break; case BUFFER_B: for (i = 0; i < size; data++, i++) gBattleBufferB[gActiveBattler][i] = *data; break; } } } static void CreateTasksForSendRecvLinkBuffers(void) { sLinkSendTaskId = CreateTask(Task_HandleSendLinkBuffersData, 0); gTasks[sLinkSendTaskId].data[11] = 0; gTasks[sLinkSendTaskId].data[12] = 0; gTasks[sLinkSendTaskId].data[13] = 0; gTasks[sLinkSendTaskId].data[14] = 0; gTasks[sLinkSendTaskId].data[15] = 0; sLinkReceiveTaskId = CreateTask(Task_HandleCopyReceivedLinkBuffersData, 0); gTasks[sLinkReceiveTaskId].data[12] = 0; gTasks[sLinkReceiveTaskId].data[13] = 0; gTasks[sLinkReceiveTaskId].data[14] = 0; gTasks[sLinkReceiveTaskId].data[15] = 0; sUnused = 0; } enum { LINK_BUFF_BUFFER_ID, LINK_BUFF_ACTIVE_BATTLER, LINK_BUFF_ATTACKER, LINK_BUFF_TARGET, LINK_BUFF_SIZE_LO, LINK_BUFF_SIZE_HI, LINK_BUFF_ABSENT_BATTLER_FLAGS, LINK_BUFF_EFFECT_BATTLER, LINK_BUFF_DATA, }; void PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data) { s32 alignedSize; s32 i; alignedSize = size - size % 4 + 4; if (gTasks[sLinkSendTaskId].data[14] + alignedSize + LINK_BUFF_DATA + 1 > BATTLE_BUFFER_LINK_SIZE) { gTasks[sLinkSendTaskId].data[12] = gTasks[sLinkSendTaskId].data[14]; gTasks[sLinkSendTaskId].data[14] = 0; } gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_BUFFER_ID] = bufferId; gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_ACTIVE_BATTLER] = gActiveBattler; gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_ATTACKER] = gBattlerAttacker; gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_TARGET] = gBattlerTarget; gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_SIZE_LO] = alignedSize; gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_SIZE_HI] = (alignedSize & 0x0000FF00) >> 8; gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_ABSENT_BATTLER_FLAGS] = gAbsentBattlerFlags; gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_EFFECT_BATTLER] = gEffectBattler; for (i = 0; i < size; i++) gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_DATA + i] = data[i]; gTasks[sLinkSendTaskId].data[14] = gTasks[sLinkSendTaskId].data[14] + alignedSize + LINK_BUFF_DATA; } static void Task_HandleSendLinkBuffersData(u8 taskId) { u16 blockSize; s32 playerCount; switch (gTasks[taskId].data[11]) { case 0: gTasks[taskId].data[10] = 100; gTasks[taskId].data[11]++; break; case 1: gTasks[taskId].data[10]--; if (gTasks[taskId].data[10] == 0) { gTasks[taskId].data[11]++; if (gReceivedRemoteLinkPlayers) gTasks[taskId].data[11] = 3; } break; case 2: playerCount = GetLinkPlayerCount_2(); if ((gBattleTypeFlags & BATTLE_TYPE_MULTI && playerCount > 3) || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && playerCount > 1)) { if (IsLinkMaster()) { CheckShouldAdvanceLinkState(); gTasks[taskId].data[11]++; } else { gTasks[taskId].data[11]++; } } break; case 3: if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) { if (gTasks[taskId].data[13] == 0) { if (gTasks[taskId].data[15] > gTasks[taskId].data[14] && gTasks[taskId].data[15] == gTasks[taskId].data[12]) { gTasks[taskId].data[12] = 0; gTasks[taskId].data[15] = 0; } blockSize = (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8)) + LINK_BUFF_DATA; SendBlock(BitmaskAllOtherLinkPlayers(), &gLinkBattleSendBuffer[gTasks[taskId].data[15]], blockSize); gTasks[taskId].data[11]++; } else { gTasks[taskId].data[13]--; break; } } break; case 4: if (IsLinkTaskFinished()) { blockSize = gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8); gTasks[taskId].data[13] = 5; gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + LINK_BUFF_DATA; gTasks[taskId].data[11] = 3; } break; case 5: if (--gTasks[taskId].data[13] == 0) { gTasks[taskId].data[13] = 5; gTasks[taskId].data[11] = 3; } break; } } void TryReceiveLinkBattleData(void) { u32 i; s32 j; u8 *recvBuffer; if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & BATTLE_TYPE_LINK_IN_BATTLE) && (gLinkPlayers[0].linkType == 0x2211)) { DestroyTask_RfuIdle(); for (i = 0; i < GetLinkPlayerCount(); i++) { if (GetBlockReceivedStatus() & gBitTable[i]) { ResetBlockReceivedFlag(i); recvBuffer = (u8 *)gBlockRecvBuffer[i]; { u8 *dest, *src; u16 dataSize = gBlockRecvBuffer[i][2]; if (gTasks[sLinkReceiveTaskId].data[14] + 9 + dataSize > 0x1000) { gTasks[sLinkReceiveTaskId].data[12] = gTasks[sLinkReceiveTaskId].data[14]; gTasks[sLinkReceiveTaskId].data[14] = 0; } dest = &gLinkBattleRecvBuffer[gTasks[sLinkReceiveTaskId].data[14]]; src = recvBuffer; for (j = 0; j < dataSize + 8; j++) dest[j] = src[j]; gTasks[sLinkReceiveTaskId].data[14] = gTasks[sLinkReceiveTaskId].data[14] + dataSize + 8; } } } } } static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) { u16 blockSize; u8 battlerId; u8 var; if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) { if (gTasks[taskId].data[15] > gTasks[taskId].data[14] && gTasks[taskId].data[15] == gTasks[taskId].data[12]) { gTasks[taskId].data[12] = 0; gTasks[taskId].data[15] = 0; } battlerId = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_ACTIVE_BATTLER]; blockSize = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8); switch (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 0]) { case 0: if (gBattleControllerExecFlags & gBitTable[battlerId]) return; memcpy(gBattleBufferA[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); MarkBattlerReceivedLinkData(battlerId); if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) { gBattlerAttacker = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_ATTACKER]; gBattlerTarget = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_TARGET]; gAbsentBattlerFlags = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_ABSENT_BATTLER_FLAGS]; gEffectBattler = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_EFFECT_BATTLER]; } break; case 1: memcpy(gBattleBufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); break; case 2: var = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA]; gBattleControllerExecFlags &= ~(gBitTable[battlerId] << (var * 4)); break; } gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + LINK_BUFF_DATA; } } void BtlController_EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck) { sBattleBuffersTransferData[0] = CONTROLLER_GETMONDATA; sBattleBuffersTransferData[1] = requestId; sBattleBuffersTransferData[2] = monToCheck; sBattleBuffersTransferData[3] = 0; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } // Unused static void BtlController_EmitGetRawMonData(u8 bufferId, u8 monId, u8 bytes) { sBattleBuffersTransferData[0] = CONTROLLER_GETRAWMONDATA; sBattleBuffersTransferData[1] = monId; sBattleBuffersTransferData[2] = bytes; sBattleBuffersTransferData[3] = 0; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitSetMonData(u8 bufferId, u8 requestId, u8 monToCheck, u8 bytes, void *data) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_SETMONDATA; sBattleBuffersTransferData[1] = requestId; sBattleBuffersTransferData[2] = monToCheck; for (i = 0; i < bytes; i++) sBattleBuffersTransferData[3 + i] = *(u8 *)(data++); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 3 + bytes); } // Unused static void BtlController_EmitSetRawMonData(u8 bufferId, u8 monId, u8 bytes, void *data) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_SETRAWMONDATA; sBattleBuffersTransferData[1] = monId; sBattleBuffersTransferData[2] = bytes; for (i = 0; i < bytes; i++) sBattleBuffersTransferData[3 + i] = *(u8 *)(data++); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, bytes + 3); } void BtlController_EmitLoadMonSprite(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_LOADMONSPRITE; sBattleBuffersTransferData[1] = CONTROLLER_LOADMONSPRITE; sBattleBuffersTransferData[2] = CONTROLLER_LOADMONSPRITE; sBattleBuffersTransferData[3] = CONTROLLER_LOADMONSPRITE; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit) { sBattleBuffersTransferData[0] = CONTROLLER_SWITCHINANIM; sBattleBuffersTransferData[1] = partyId; sBattleBuffersTransferData[2] = dontClearSubstituteBit; sBattleBuffersTransferData[3] = 5; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitReturnMonToBall(u8 bufferId, bool8 skipAnim) { sBattleBuffersTransferData[0] = CONTROLLER_RETURNMONTOBALL; sBattleBuffersTransferData[1] = skipAnim; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } void BtlController_EmitDrawTrainerPic(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_DRAWTRAINERPIC; sBattleBuffersTransferData[1] = CONTROLLER_DRAWTRAINERPIC; sBattleBuffersTransferData[2] = CONTROLLER_DRAWTRAINERPIC; sBattleBuffersTransferData[3] = CONTROLLER_DRAWTRAINERPIC; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitTrainerSlide(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDE; sBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDE; sBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDE; sBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDE; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitTrainerSlideBack(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDEBACK; sBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDEBACK; sBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDEBACK; sBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDEBACK; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitFaintAnimation(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_FAINTANIMATION; sBattleBuffersTransferData[1] = CONTROLLER_FAINTANIMATION; sBattleBuffersTransferData[2] = CONTROLLER_FAINTANIMATION; sBattleBuffersTransferData[3] = CONTROLLER_FAINTANIMATION; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } // Unused static void BtlController_EmitPaletteFade(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_PALETTEFADE; sBattleBuffersTransferData[1] = CONTROLLER_PALETTEFADE; sBattleBuffersTransferData[2] = CONTROLLER_PALETTEFADE; sBattleBuffersTransferData[3] = CONTROLLER_PALETTEFADE; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } // Unused static void BtlController_EmitSuccessBallThrowAnim(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_SUCCESSBALLTHROWANIM; sBattleBuffersTransferData[1] = CONTROLLER_SUCCESSBALLTHROWANIM; sBattleBuffersTransferData[2] = CONTROLLER_SUCCESSBALLTHROWANIM; sBattleBuffersTransferData[3] = CONTROLLER_SUCCESSBALLTHROWANIM; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitBallThrowAnim(u8 bufferId, u8 caseId) { sBattleBuffersTransferData[0] = CONTROLLER_BALLTHROWANIM; sBattleBuffersTransferData[1] = caseId; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } // Unused static void BtlController_EmitPause(u8 bufferId, u8 toWait, void *data) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_PAUSE; sBattleBuffersTransferData[1] = toWait; for (i = 0; i < toWait * 3; i++) sBattleBuffersTransferData[2 + i] = *(u8 *)(data++); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, toWait * 3 + 2); } void BtlController_EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr) { sBattleBuffersTransferData[0] = CONTROLLER_MOVEANIMATION; sBattleBuffersTransferData[1] = move; sBattleBuffersTransferData[2] = (move & 0xFF00) >> 8; sBattleBuffersTransferData[3] = turnOfMove; sBattleBuffersTransferData[4] = movePower; sBattleBuffersTransferData[5] = (movePower & 0xFF00) >> 8; sBattleBuffersTransferData[6] = dmg; sBattleBuffersTransferData[7] = (dmg & 0x0000FF00) >> 8; sBattleBuffersTransferData[8] = (dmg & 0x00FF0000) >> 16; sBattleBuffersTransferData[9] = (dmg & 0xFF000000) >> 24; sBattleBuffersTransferData[10] = friendship; sBattleBuffersTransferData[11] = gMultiHitCounter; // multihit in pokeem if (WEATHER_HAS_EFFECT2) { sBattleBuffersTransferData[12] = gBattleWeather; sBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8; } else { sBattleBuffersTransferData[12] = 0; sBattleBuffersTransferData[13] = 0; } sBattleBuffersTransferData[14] = 0; sBattleBuffersTransferData[15] = 0; memcpy(&sBattleBuffersTransferData[16], disableStructPtr, sizeof(struct DisableStruct)); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 16 + sizeof(struct DisableStruct)); } void BtlController_EmitPrintString(u8 bufferId, u16 stringID) { s32 i; struct BattleMsgData *stringInfo; sBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRING; sBattleBuffersTransferData[1] = gBattleOutcome; sBattleBuffersTransferData[2] = stringID; sBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; stringInfo = (struct BattleMsgData *)(&sBattleBuffersTransferData[4]); stringInfo->currentMove = gCurrentMove; stringInfo->originallyUsedMove = gChosenMove; stringInfo->lastItem = gLastUsedItem; stringInfo->lastAbility = gLastUsedAbility; stringInfo->scrActive = gBattleScripting.battler; stringInfo->bakScriptPartyIdx = gBattleStruct->scriptPartyIdx; stringInfo->hpScale = gBattleStruct->hpScale; stringInfo->itemEffectBattler = gPotentialItemEffectBattler; stringInfo->moveType = gBattleMoves[gCurrentMove].type; for (i = 0; i < MAX_BATTLERS_COUNT; i++) stringInfo->abilities[i] = gBattleMons[i].ability; for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++) { stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; } PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct BattleMsgData) + 4); } void BtlController_EmitPrintSelectionString(u8 bufferId, u16 stringID) { s32 i; struct BattleMsgData *stringInfo; sBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRINGPLAYERONLY; sBattleBuffersTransferData[1] = CONTROLLER_PRINTSTRINGPLAYERONLY; sBattleBuffersTransferData[2] = stringID; sBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; stringInfo = (struct BattleMsgData *)(&sBattleBuffersTransferData[4]); stringInfo->currentMove = gCurrentMove; stringInfo->originallyUsedMove = gChosenMove; stringInfo->lastItem = gLastUsedItem; stringInfo->lastAbility = gLastUsedAbility; stringInfo->scrActive = gBattleScripting.battler; stringInfo->bakScriptPartyIdx = gBattleStruct->scriptPartyIdx; for (i = 0; i < MAX_BATTLERS_COUNT; i++) stringInfo->abilities[i] = gBattleMons[i].ability; for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++) { stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; } PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct BattleMsgData) + 4); } // itemId only relevant for B_ACTION_USE_ITEM void BtlController_EmitChooseAction(u8 bufferId, u8 action, u16 itemId) { sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEACTION; sBattleBuffersTransferData[1] = action; sBattleBuffersTransferData[2] = itemId; sBattleBuffersTransferData[3] = (itemId & 0xFF00) >> 8; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } // Unused static void BtlController_EmitUnknownYesNoBox(u8 bufferId, u32 arg1) // TODO: Does the function name make sense for pokefirered? { sBattleBuffersTransferData[0] = CONTROLLER_UNKNOWNYESNOBOX; sBattleBuffersTransferData[1] = arg1; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } void BtlController_EmitChooseMove(u8 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEMOVE; sBattleBuffersTransferData[1] = isDoubleBattle; sBattleBuffersTransferData[2] = NoPpNumber; sBattleBuffersTransferData[3] = 0; for (i = 0; i < sizeof(*movePpData); i++) sBattleBuffersTransferData[4 + i] = *((u8 *)(movePpData) + i); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(*movePpData) + 4); } void BtlController_EmitChooseItem(u8 bufferId, u8 *battlePartyOrder) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_OPENBAG; for (i = 0; i < PARTY_SIZE / 2; i++) sBattleBuffersTransferData[1 + i] = battlePartyOrder[i]; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 slotId, u8 abilityId, u8 *data) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEPOKEMON; sBattleBuffersTransferData[1] = caseId; sBattleBuffersTransferData[2] = slotId; sBattleBuffersTransferData[3] = abilityId; for (i = 0; i < 3; i++) sBattleBuffersTransferData[4 + i] = data[i]; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 8); // Only 7 bytes were written. } // Unused static void BtlController_EmitCmd23(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_23; sBattleBuffersTransferData[1] = CONTROLLER_23; sBattleBuffersTransferData[2] = CONTROLLER_23; sBattleBuffersTransferData[3] = CONTROLLER_23; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitHealthBarUpdate(u8 bufferId, u16 hpValue) { sBattleBuffersTransferData[0] = CONTROLLER_HEALTHBARUPDATE; sBattleBuffersTransferData[1] = 0; sBattleBuffersTransferData[2] = (s16)hpValue; sBattleBuffersTransferData[3] = ((s16)hpValue & 0xFF00) >> 8; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitExpUpdate(u8 bufferId, u8 partyId, u16 expPoints) { sBattleBuffersTransferData[0] = CONTROLLER_EXPUPDATE; sBattleBuffersTransferData[1] = partyId; sBattleBuffersTransferData[2] = (s16)expPoints; sBattleBuffersTransferData[3] = ((s16)expPoints & 0xFF00) >> 8; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitStatusIconUpdate(u8 bufferId, u32 status1, u32 status2) { sBattleBuffersTransferData[0] = CONTROLLER_STATUSICONUPDATE; sBattleBuffersTransferData[1] = status1; sBattleBuffersTransferData[2] = (status1 & 0x0000FF00) >> 8; sBattleBuffersTransferData[3] = (status1 & 0x00FF0000) >> 16; sBattleBuffersTransferData[4] = (status1 & 0xFF000000) >> 24; sBattleBuffersTransferData[5] = status2; sBattleBuffersTransferData[6] = (status2 & 0x0000FF00) >> 8; sBattleBuffersTransferData[7] = (status2 & 0x00FF0000) >> 16; sBattleBuffersTransferData[8] = (status2 & 0xFF000000) >> 24; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 9); } void BtlController_EmitStatusAnimation(u8 bufferId, bool8 status2, u32 status) { sBattleBuffersTransferData[0] = CONTROLLER_STATUSANIMATION; sBattleBuffersTransferData[1] = status2; sBattleBuffersTransferData[2] = status; sBattleBuffersTransferData[3] = (status & 0x0000FF00) >> 8; sBattleBuffersTransferData[4] = (status & 0x00FF0000) >> 16; sBattleBuffersTransferData[5] = (status & 0xFF000000) >> 24; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 6); } // Unused static void BtlController_EmitStatusXor(u8 bufferId, u8 b) { sBattleBuffersTransferData[0] = CONTROLLER_STATUSXOR; sBattleBuffersTransferData[1] = b; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } void BtlController_EmitDataTransfer(u8 bufferId, u16 size, void *data) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_DATATRANSFER; sBattleBuffersTransferData[1] = CONTROLLER_DATATRANSFER; sBattleBuffersTransferData[2] = size; sBattleBuffersTransferData[3] = (size & 0xFF00) >> 8; for (i = 0; i < size; i++) sBattleBuffersTransferData[4 + i] = *(u8 *)(data++); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 4); } // Unused static void BtlController_EmitDMA3Transfer(u8 bufferId, void *dst, u16 size, void *data) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_DMA3TRANSFER; sBattleBuffersTransferData[1] = (u32)(dst); sBattleBuffersTransferData[2] = ((u32)(dst) & 0x0000FF00) >> 8; sBattleBuffersTransferData[3] = ((u32)(dst) & 0x00FF0000) >> 16; sBattleBuffersTransferData[4] = ((u32)(dst) & 0xFF000000) >> 24; sBattleBuffersTransferData[5] = size; sBattleBuffersTransferData[6] = (size & 0xFF00) >> 8; for (i = 0; i < size; i++) sBattleBuffersTransferData[7 + i] = *(u8 *)(data++); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 7); } // Unused static void BtlController_EmitPlayBGM(u8 bufferId, u16 songId, void *data) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_PLAYBGM; sBattleBuffersTransferData[1] = songId; sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8; // Nonsense loop using songId as a size // Would go out of bounds for any song id after SE_DEOXYS_MOVE (253) for (i = 0; i < songId; i++) sBattleBuffersTransferData[3 + i] = *(u8 *)(data++); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, songId + 3); } // Unused static void BtlController_EmitCmd32(u8 bufferId, u16 size, void *data) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_32; sBattleBuffersTransferData[1] = size; sBattleBuffersTransferData[2] = (size & 0xFF00) >> 8; for (i = 0; i < size; i++) sBattleBuffersTransferData[3 + i] = *(u8 *)(data++); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 3); } void BtlController_EmitTwoReturnValues(u8 bufferId, u8 ret8, u16 ret16) { sBattleBuffersTransferData[0] = CONTROLLER_TWORETURNVALUES; sBattleBuffersTransferData[1] = ret8; sBattleBuffersTransferData[2] = ret16; sBattleBuffersTransferData[3] = (ret16 & 0xFF00) >> 8; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitChosenMonReturnValue(u8 bufferId, u8 partyId, u8 *battlePartyOrder) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_CHOSENMONRETURNVALUE; sBattleBuffersTransferData[1] = partyId; for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) sBattleBuffersTransferData[2 + i] = battlePartyOrder[i]; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 5); } void BtlController_EmitOneReturnValue(u8 bufferId, u16 ret) { sBattleBuffersTransferData[0] = CONTROLLER_ONERETURNVALUE; sBattleBuffersTransferData[1] = ret; sBattleBuffersTransferData[2] = (ret & 0xFF00) >> 8; sBattleBuffersTransferData[3] = 0; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitOneReturnValue_Duplicate(u8 bufferId, u16 ret) { sBattleBuffersTransferData[0] = CONTROLLER_ONERETURNVALUE_DUPLICATE; sBattleBuffersTransferData[1] = ret; sBattleBuffersTransferData[2] = (ret & 0xFF00) >> 8; sBattleBuffersTransferData[3] = 0; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } // Unused static void BtlController_EmitClearUnkVar(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_CLEARUNKVAR; sBattleBuffersTransferData[1] = CONTROLLER_CLEARUNKVAR; sBattleBuffersTransferData[2] = CONTROLLER_CLEARUNKVAR; sBattleBuffersTransferData[3] = CONTROLLER_CLEARUNKVAR; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } // Unused static void BtlController_EmitSetUnkVar(u8 bufferId, u8 b) { sBattleBuffersTransferData[0] = CONTROLLER_SETUNKVAR; sBattleBuffersTransferData[1] = b; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } // Unused static void BtlController_EmitClearUnkFlag(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_CLEARUNKFLAG; sBattleBuffersTransferData[1] = CONTROLLER_CLEARUNKFLAG; sBattleBuffersTransferData[2] = CONTROLLER_CLEARUNKFLAG; sBattleBuffersTransferData[3] = CONTROLLER_CLEARUNKFLAG; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } // Unused static void BtlController_EmitToggleUnkFlag(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_TOGGLEUNKFLAG; sBattleBuffersTransferData[1] = CONTROLLER_TOGGLEUNKFLAG; sBattleBuffersTransferData[2] = CONTROLLER_TOGGLEUNKFLAG; sBattleBuffersTransferData[3] = CONTROLLER_TOGGLEUNKFLAG; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitHitAnimation(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_HITANIMATION; sBattleBuffersTransferData[1] = CONTROLLER_HITANIMATION; sBattleBuffersTransferData[2] = CONTROLLER_HITANIMATION; sBattleBuffersTransferData[3] = CONTROLLER_HITANIMATION; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitCantSwitch(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_CANTSWITCH; sBattleBuffersTransferData[1] = CONTROLLER_CANTSWITCH; sBattleBuffersTransferData[2] = CONTROLLER_CANTSWITCH; sBattleBuffersTransferData[3] = CONTROLLER_CANTSWITCH; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitPlaySE(u8 bufferId, u16 songId) { sBattleBuffersTransferData[0] = CONTROLLER_PLAYSE; sBattleBuffersTransferData[1] = songId; sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8; sBattleBuffersTransferData[3] = 0; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitPlayFanfare(u8 bufferId, u16 songId) { sBattleBuffersTransferData[0] = CONTROLLER_PLAYFANFARE; sBattleBuffersTransferData[1] = songId; sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8; sBattleBuffersTransferData[3] = 0; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitFaintingCry(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_FAINTINGCRY; sBattleBuffersTransferData[1] = CONTROLLER_FAINTINGCRY; sBattleBuffersTransferData[2] = CONTROLLER_FAINTINGCRY; sBattleBuffersTransferData[3] = CONTROLLER_FAINTINGCRY; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitIntroSlide(u8 bufferId, u8 terrainId) { sBattleBuffersTransferData[0] = CONTROLLER_INTROSLIDE; sBattleBuffersTransferData[1] = terrainId; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } void BtlController_EmitIntroTrainerBallThrow(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_INTROTRAINERBALLTHROW; sBattleBuffersTransferData[1] = CONTROLLER_INTROTRAINERBALLTHROW; sBattleBuffersTransferData[2] = CONTROLLER_INTROTRAINERBALLTHROW; sBattleBuffersTransferData[3] = CONTROLLER_INTROTRAINERBALLTHROW; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 flags) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_DRAWPARTYSTATUSSUMMARY; sBattleBuffersTransferData[1] = flags & ~PARTY_SUMM_SKIP_DRAW_DELAY; // If true, skip player side sBattleBuffersTransferData[2] = (flags & PARTY_SUMM_SKIP_DRAW_DELAY) >> 7; // If true, skip delay after drawing. True during intro sBattleBuffersTransferData[3] = CONTROLLER_DRAWPARTYSTATUSSUMMARY; for (i = 0; i < (s32)(sizeof(struct HpAndStatus) * PARTY_SIZE); i++) sBattleBuffersTransferData[4 + i] = *(i + (u8 *)(hpAndStatus)); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct HpAndStatus) * PARTY_SIZE + 4); } void BtlController_EmitHidePartyStatusSummary(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_HIDEPARTYSTATUSSUMMARY; sBattleBuffersTransferData[1] = CONTROLLER_HIDEPARTYSTATUSSUMMARY; sBattleBuffersTransferData[2] = CONTROLLER_HIDEPARTYSTATUSSUMMARY; sBattleBuffersTransferData[3] = CONTROLLER_HIDEPARTYSTATUSSUMMARY; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitEndBounceEffect(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_ENDBOUNCE; sBattleBuffersTransferData[1] = CONTROLLER_ENDBOUNCE; sBattleBuffersTransferData[2] = CONTROLLER_ENDBOUNCE; sBattleBuffersTransferData[3] = CONTROLLER_ENDBOUNCE; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitSpriteInvisibility(u8 bufferId, bool8 isInvisible) { sBattleBuffersTransferData[0] = CONTROLLER_SPRITEINVISIBILITY; sBattleBuffersTransferData[1] = isInvisible; sBattleBuffersTransferData[2] = CONTROLLER_SPRITEINVISIBILITY; sBattleBuffersTransferData[3] = CONTROLLER_SPRITEINVISIBILITY; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument) { sBattleBuffersTransferData[0] = CONTROLLER_BATTLEANIMATION; sBattleBuffersTransferData[1] = animationId; sBattleBuffersTransferData[2] = argument; sBattleBuffersTransferData[3] = (argument & 0xFF00) >> 8; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } // mode is a LINK_STANDBY_* constant void BtlController_EmitLinkStandbyMsg(u8 bufferId, u8 mode) { sBattleBuffersTransferData[0] = CONTROLLER_LINKSTANDBYMSG; sBattleBuffersTransferData[1] = mode; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } void BtlController_EmitResetActionMoveSelection(u8 bufferId, u8 caseId) { sBattleBuffersTransferData[0] = CONTROLLER_RESETACTIONMOVESELECTION; sBattleBuffersTransferData[1] = caseId; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } void BtlController_EmitEndLinkBattle(u8 bufferId, u8 battleOutcome) { sBattleBuffersTransferData[0] = CONTROLLER_ENDLINKBATTLE; sBattleBuffersTransferData[1] = battleOutcome; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } ================================================ FILE: src/battle_gfx_sfx_util.c ================================================ #include "global.h" #include "gflib.h" #include "m4a.h" #include "task.h" #include "graphics.h" #include "decompress.h" #include "palette.h" #include "sprite.h" #include "data.h" #include "util.h" #include "party_menu.h" #include "battle.h" #include "battle_main.h" #include "battle_anim.h" #include "battle_interface.h" #include "constants/battle_anim.h" #include "constants/moves.h" #include "constants/songs.h" static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId); static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId); static void Task_ClearBitWhenSpecialAnimDone(u8 taskId); static void ClearSpritesBattlerHealthboxAnimData(void); static const struct CompressedSpriteSheet sSpriteSheet_SinglesPlayerHealthbox = { .data = gHealthboxSinglesPlayerGfx, .size = 0x1000, .tag = TAG_HEALTHBOX_PLAYER1_TILE, }; static const struct CompressedSpriteSheet sSpriteSheet_SinglesOpponentHealthbox = { .data = gHealthboxSinglesOpponentGfx, .size = 0x1000, .tag = TAG_HEALTHBOX_OPPONENT1_TILE, }; static const struct CompressedSpriteSheet sSpriteSheets_DoublesPlayerHealthbox[2] = { { .data = gHealthboxDoublesPlayerGfx, .size = 0x800, .tag = TAG_HEALTHBOX_PLAYER1_TILE, }, { .data = gHealthboxDoublesPlayerGfx, .size = 0x800, .tag = TAG_HEALTHBOX_PLAYER2_TILE, }, }; static const struct CompressedSpriteSheet sSpriteSheets_DoublesOpponentHealthbox[2] = { { .data = gHealthboxDoublesOpponentGfx, .size = 0x800, .tag = TAG_HEALTHBOX_OPPONENT1_TILE, }, { .data = gHealthboxDoublesOpponentGfx, .size = 0x800, .tag = TAG_HEALTHBOX_OPPONENT2_TILE, }, }; static const struct CompressedSpriteSheet sSpriteSheet_SafariHealthbox = { .data = gHealthboxSafariGfx, .size = 0x1000, .tag = TAG_HEALTHBOX_SAFARI_TILE, }; static const struct CompressedSpriteSheet sSpriteSheets_HealthBar[MAX_BATTLERS_COUNT] = { { .data = gBlankGfxCompressed, .size = 0x100, .tag = TAG_HEALTHBAR_PLAYER1_TILE, }, { .data = gBlankGfxCompressed, .size = 0x120, .tag = TAG_HEALTHBAR_OPPONENT1_TILE, }, { .data = gBlankGfxCompressed, .size = 0x100, .tag = TAG_HEALTHBAR_PLAYER2_TILE, }, { .data = gBlankGfxCompressed, .size = 0x120, .tag = TAG_HEALTHBAR_OPPONENT2_TILE, }, }; static const struct SpritePalette sSpritePalettes_HealthBoxHealthBar[2] = { { .data = gBattleInterface_Healthbox_Pal, .tag = TAG_HEALTHBOX_PAL, }, { .data = gBattleInterface_Healthbar_Pal, .tag = TAG_HEALTHBAR_PAL, }, }; void AllocateBattleSpritesData(void) { gBattleSpritesDataPtr = AllocZeroed(sizeof(struct BattleSpriteData)); gBattleSpritesDataPtr->battlerData = AllocZeroed(sizeof(struct BattleSpriteInfo) * MAX_BATTLERS_COUNT); gBattleSpritesDataPtr->healthBoxesData = AllocZeroed(sizeof(struct BattleHealthboxInfo) * MAX_BATTLERS_COUNT); gBattleSpritesDataPtr->animationData = AllocZeroed(sizeof(struct BattleAnimationInfo)); gBattleSpritesDataPtr->battleBars = AllocZeroed(sizeof(struct BattleBarInfo) * MAX_BATTLERS_COUNT); } void FreeBattleSpritesData(void) { if (gBattleSpritesDataPtr) { FREE_AND_SET_NULL(gBattleSpritesDataPtr->battleBars); FREE_AND_SET_NULL(gBattleSpritesDataPtr->animationData); FREE_AND_SET_NULL(gBattleSpritesDataPtr->healthBoxesData); FREE_AND_SET_NULL(gBattleSpritesDataPtr->battlerData); FREE_AND_SET_NULL(gBattleSpritesDataPtr); } } void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite) { u8 spriteId = sprite->data[1]; if (!gSprites[spriteId].affineAnimEnded) return; if (gSprites[spriteId].invisible) return; if (gSprites[spriteId].animPaused) gSprites[spriteId].animPaused = 0; else if (gSprites[spriteId].animEnded) { gSprites[spriteId].callback = SetIdleSpriteCallback; StartSpriteAffineAnim(&gSprites[spriteId], 0); sprite->callback = SpriteCallbackDummy; } } // Unused static void DoBattleSpriteAffineAnim(struct Sprite *sprite, bool8 arg1) { sprite->animPaused = 1; sprite->callback = SpriteCallbackDummy; if (!arg1) StartSpriteAffineAnim(sprite, 1); else StartSpriteAffineAnim(sprite, 1); AnimateSprite(sprite); } void SpriteCB_TrainerSlideIn(struct Sprite *sprite) { if (!(gIntroSlideFlags & 1)) { sprite->x2 += sprite->data[0]; if (sprite->x2 == 0) sprite->callback = SpriteCallbackDummy; } } void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 1; if (!isStatus2) { if (status == STATUS1_FREEZE) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_FRZ); else if (status == STATUS1_POISON || status & STATUS1_TOXIC_POISON) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_PSN); else if (status == STATUS1_BURN) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_BRN); else if (status & STATUS1_SLEEP) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_SLP); else if (status == STATUS1_PARALYSIS) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_PRZ); else // no animation gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 0; } else { if (status & STATUS2_INFATUATION) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_INFATUATION); else if (status & STATUS2_CONFUSION) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_CONFUSION); else if (status & STATUS2_CURSED) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_CURSED); else if (status & STATUS2_NIGHTMARE) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_NIGHTMARE); else if (status & STATUS2_WRAPPED) LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_WRAPPED); // this animation doesn't actually exist else // no animation gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 0; } } #define tBattlerId data[0] bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId, u16 argument) { u8 taskId; if (tableId == B_ANIM_CASTFORM_CHANGE && (argument & 0x80)) { gBattleMonForms[activeBattler] = (argument & ~(0x80)); return TRUE; } else if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute && !ShouldAnimBeDoneRegardlessOfSubsitute(tableId)) { return TRUE; } else if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute && tableId == B_ANIM_SUBSTITUTE_FADE && gSprites[gBattlerSpriteIds[activeBattler]].invisible) { LoadBattleMonGfxAndAnimate(activeBattler, TRUE, gBattlerSpriteIds[activeBattler]); ClearBehindSubstituteBit(activeBattler); return TRUE; } gBattleAnimAttacker = atkBattler; gBattleAnimTarget = defBattler; gBattleSpritesDataPtr->animationData->animArg = argument; LaunchBattleAnimation(gBattleAnims_General, tableId, FALSE); taskId = CreateTask(Task_ClearBitWhenBattleTableAnimDone, 10); gTasks[taskId].tBattlerId = activeBattler; gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].animFromTableActive = 1; return FALSE; } static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId) { gAnimScriptCallback(); if (!gAnimScriptActive) { gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].animFromTableActive = 0; DestroyTask(taskId); } } static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId) { switch (animId) { case B_ANIM_SUBSTITUTE_FADE: case B_ANIM_RAIN_CONTINUES: case B_ANIM_SUN_CONTINUES: case B_ANIM_SANDSTORM_CONTINUES: case B_ANIM_HAIL_CONTINUES: case B_ANIM_SNATCH_MOVE: return TRUE; default: return FALSE; } } void InitAndLaunchSpecialAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId) { u8 taskId; gBattleAnimAttacker = atkBattler; gBattleAnimTarget = defBattler; LaunchBattleAnimation(gBattleAnims_Special, tableId, FALSE); taskId = CreateTask(Task_ClearBitWhenSpecialAnimDone, 10); gTasks[taskId].tBattlerId = activeBattler; gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].specialAnimActive = 1; } static void Task_ClearBitWhenSpecialAnimDone(u8 taskId) { gAnimScriptCallback(); if (!gAnimScriptActive) { gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].specialAnimActive = 0; DestroyTask(taskId); } } bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn) { return FALSE; } bool8 IsBattleSEPlaying(u8 battlerId) { u8 zero = 0; if (IsSEPlaying()) { ++gBattleSpritesDataPtr->healthBoxesData[battlerId].soundTimer; // UB: Uses gActiveBattler instead of battlerId. // In practice, this is never a problem, as this routine // is only ever passed gActiveBattler. if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].soundTimer < 30) return TRUE; m4aMPlayStop(&gMPlayInfo_SE1); m4aMPlayStop(&gMPlayInfo_SE2); } if (zero == 0) { gBattleSpritesDataPtr->healthBoxesData[battlerId].soundTimer = 0; return FALSE; } else { return TRUE; } } void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) { u32 monsPersonality, currentPersonality, otId; u16 species; u8 position; u16 paletteOffset; const void *lzPaletteData; void *buffer; monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) { species = GetMonData(mon, MON_DATA_SPECIES); currentPersonality = monsPersonality; if(species == SPECIES_DEOXYS) { currentPersonality = GetMonData(mon, MON_DATA_FORME); } } else { species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies; currentPersonality = gTransformedPersonalities[battlerId]; } otId = GetMonData(mon, MON_DATA_OT_ID); position = GetBattlerPosition(battlerId); HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[position], species, currentPersonality); paletteOffset = OBJ_PLTT_ID(battlerId); if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) lzPaletteData = GetMonFrontSpritePal(mon); else lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality); buffer = AllocZeroed(0x400); LZDecompressWram(lzPaletteData, buffer); LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP); LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP); Free(buffer); if (species == SPECIES_CASTFORM) { paletteOffset = OBJ_PLTT_ID(battlerId); LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, PLTT_SIZE_4BPP); } // transform's pink color if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP); } } void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) { u32 monsPersonality, currentPersonality, otId; u16 species; u8 position; u16 paletteOffset; const void *lzPaletteData; void *buffer; monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) { species = GetMonData(mon, MON_DATA_SPECIES); currentPersonality = monsPersonality; if(species == SPECIES_DEOXYS) { currentPersonality = GetMonData(mon, MON_DATA_FORME); } } else { species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies; currentPersonality = gTransformedPersonalities[battlerId]; } otId = GetMonData(mon, MON_DATA_OT_ID); position = GetBattlerPosition(battlerId); if (ShouldIgnoreDeoxysForm(DEOXYS_CHECK_BATTLE_SPRITE, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites[position], species, currentPersonality); else HandleLoadSpecialPokePic(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites[position], species, currentPersonality); paletteOffset = OBJ_PLTT_ID(battlerId); if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) lzPaletteData = GetMonFrontSpritePal(mon); else lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality); buffer = AllocZeroed(0x400); LZDecompressWram(lzPaletteData, buffer); LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP); LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP); Free(buffer); if (species == SPECIES_CASTFORM) { paletteOffset = OBJ_PLTT_ID(battlerId); LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, PLTT_SIZE_4BPP); } // transform's pink color if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP); } } void DecompressGhostFrontPic(struct Pokemon *unused, u8 battlerId) { u16 palOffset; void *buffer; u8 position = GetBattlerPosition(battlerId); LZ77UnCompWram(gGhostFrontPic, gMonSpritesGfxPtr->sprites[position]); palOffset = OBJ_PLTT_ID(battlerId); buffer = AllocZeroed(0x400); LZDecompressWram(gGhostPalette, buffer); LoadPalette(buffer, palOffset, PLTT_SIZE_4BPP); LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP); Free(buffer); } void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId) { struct SpriteSheet sheet; u8 position = GetBattlerPosition(battlerId); DecompressPicFromTable(&gTrainerFrontPicTable[frontPicId], gMonSpritesGfxPtr->sprites[position], SPECIES_NONE); sheet.data = gMonSpritesGfxPtr->sprites[position]; sheet.size = gTrainerFrontPicTable[frontPicId].size; sheet.tag = gTrainerFrontPicTable[frontPicId].tag; LoadSpriteSheet(&sheet); LoadCompressedSpritePaletteUsingHeap(&gTrainerFrontPicPaletteTable[frontPicId]); } void DecompressTrainerBackPalette(u16 index, u8 palette) { LoadCompressedPalette(gTrainerBackPicPaletteTable[index].data, OBJ_PLTT_ID2(palette), PLTT_SIZE_4BPP); } void BattleGfxSfxDummy3(u8 gender) { } void FreeTrainerFrontPicPaletteAndTile(u16 frontPicId) { FreeSpritePaletteByTag(gTrainerFrontPicPaletteTable[frontPicId].tag); FreeSpriteTilesByTag(gTrainerFrontPicTable[frontPicId].tag); } // not used static void BattleLoadAllHealthBoxesGfxAtOnce(void) { u8 numberOfBattlers = 0; u32 i; LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]); LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]); if (!IsDoubleBattle()) { LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SinglesPlayerHealthbox); LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SinglesOpponentHealthbox); numberOfBattlers = 2; } else { LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesPlayerHealthbox[0]); LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesPlayerHealthbox[1]); LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesOpponentHealthbox[0]); LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesOpponentHealthbox[1]); numberOfBattlers = MAX_BATTLERS_COUNT; } for (i = 0; i < numberOfBattlers; ++i) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[i]]); } bool8 BattleLoadAllHealthBoxesGfx(u8 state) { bool8 retVal = FALSE; if (state) { if (state == 1) { LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]); LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]); } else if (!IsDoubleBattle()) { if (state == 2) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SafariHealthbox); else LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SinglesPlayerHealthbox); } else if (state == 3) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SinglesOpponentHealthbox); else if (state == 4) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); else if (state == 5) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); else retVal = TRUE; } else { if (state == 2) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesPlayerHealthbox[0]); else if (state == 3) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesPlayerHealthbox[1]); else if (state == 4) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesOpponentHealthbox[0]); else if (state == 5) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesOpponentHealthbox[1]); else if (state == 6) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); else if (state == 7) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); else if (state == 8) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[2]]); else if (state == 9) LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[3]]); else retVal = TRUE; } } return retVal; } void LoadBattleBarGfx(u8 arg0) { LZDecompressWram(gInterfaceGfx_HPNumbers, gMonSpritesGfxPtr->barFontGfx); } bool8 BattleInitAllSprites(u8 *state, u8 *battlerId) { bool8 retVal = FALSE; switch (*state) { case 0: ClearSpritesBattlerHealthboxAnimData(); ++*state; break; case 1: if (!BattleLoadAllHealthBoxesGfx(*battlerId)) { ++*battlerId; } else { *battlerId = 0; ++*state; } break; case 2: ++*state; break; case 3: if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && *battlerId == 0) gHealthboxSpriteIds[*battlerId] = CreateSafariPlayerHealthboxSprites(); else gHealthboxSpriteIds[*battlerId] = CreateBattlerHealthboxSprites(*battlerId); ++*battlerId; if (*battlerId == gBattlersCount) { *battlerId = 0; ++*state; } break; case 4: InitBattlerHealthboxCoords(*battlerId); if (gBattlerPositions[*battlerId] <= 1) DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battlerId], FALSE); else DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battlerId], TRUE); ++*battlerId; if (*battlerId == gBattlersCount) { *battlerId = 0; ++*state; } break; case 5: if (GetBattlerSide(*battlerId) == B_SIDE_PLAYER) { if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) UpdateHealthboxAttribute(gHealthboxSpriteIds[*battlerId], &gPlayerParty[gBattlerPartyIndexes[*battlerId]], HEALTHBOX_ALL); } else { UpdateHealthboxAttribute(gHealthboxSpriteIds[*battlerId], &gEnemyParty[gBattlerPartyIndexes[*battlerId]], HEALTHBOX_ALL); } SetHealthboxSpriteInvisible(gHealthboxSpriteIds[*battlerId]); ++*battlerId; if (*battlerId == gBattlersCount) { *battlerId = 0; ++*state; } break; case 6: LoadAndCreateEnemyShadowSprites(); BufferBattlePartyCurrentOrder(); retVal = TRUE; break; } return retVal; } void ClearSpritesHealthboxAnimData(void) { memset(gBattleSpritesDataPtr->healthBoxesData, 0, sizeof(struct BattleHealthboxInfo) * MAX_BATTLERS_COUNT); memset(gBattleSpritesDataPtr->animationData, 0, sizeof(struct BattleAnimationInfo)); } static void ClearSpritesBattlerHealthboxAnimData(void) { ClearSpritesHealthboxAnimData(); memset(gBattleSpritesDataPtr->battlerData, 0, sizeof(struct BattleSpriteInfo) * MAX_BATTLERS_COUNT); } void CopyAllBattleSpritesInvisibilities(void) { s32 i; for (i = 0; i < gBattlersCount; ++i) gBattleSpritesDataPtr->battlerData[i].invisible = gSprites[gBattlerSpriteIds[i]].invisible; } void CopyBattleSpriteInvisibility(u8 battlerId) { gBattleSpritesDataPtr->battlerData[battlerId].invisible = gSprites[gBattlerSpriteIds[battlerId]].invisible; } void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 transformType) { u16 paletteOffset, targetSpecies; u32 personalityValue; u32 otId; u8 position; const u32 *lzPaletteData; void *buffer; if (transformType == 255) // Ghost unveiled with Silph Scope { const void *src; void *dst; position = GetBattlerPosition(battlerAtk); targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_SPECIES); personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID); HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies], gMonSpritesGfxPtr->sprites[position], targetSpecies, personalityValue); src = gMonSpritesGfxPtr->sprites[position]; dst = (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32); DmaCopy32(3, src, dst, 0x800); paletteOffset = OBJ_PLTT_ID(battlerAtk); lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue); buffer = AllocZeroed(0x400); LZDecompressWram(lzPaletteData, buffer); LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP); Free(buffer); gSprites[gBattlerSpriteIds[battlerAtk]].y = GetBattlerSpriteDefault_Y(battlerAtk); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleMonForms[battlerAtk]); SetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_NICKNAME, gSpeciesNames[targetSpecies]); UpdateNickInHealthbox(gHealthboxSpriteIds[battlerAtk], &gEnemyParty[gBattlerPartyIndexes[battlerAtk]]); TryAddPokeballIconToHealthbox(gHealthboxSpriteIds[battlerAtk], 1); } else if (transformType) // Castform form change { StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleSpritesDataPtr->animationData->animArg); paletteOffset = OBJ_PLTT_ID(battlerAtk); LoadPalette(gBattleStruct->castformPalette[gBattleSpritesDataPtr->animationData->animArg], paletteOffset, PLTT_SIZE_4BPP); gBattleMonForms[battlerAtk] = gBattleSpritesDataPtr->animationData->animArg; if (gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP); } gSprites[gBattlerSpriteIds[battlerAtk]].y = GetBattlerSpriteDefault_Y(battlerAtk); } else // Transform move { const void *src; void *dst; position = GetBattlerPosition(battlerAtk); if (GetBattlerSide(battlerDef) == B_SIDE_OPPONENT) targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES); else targetSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES); if (GetBattlerSide(battlerAtk) == B_SIDE_PLAYER) { personalityValue = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID); HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], gMonSpritesGfxPtr->sprites[position], targetSpecies, gTransformedPersonalities[battlerAtk]); } else { personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID); HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies], gMonSpritesGfxPtr->sprites[position], targetSpecies, gTransformedPersonalities[battlerAtk]); } src = gMonSpritesGfxPtr->sprites[position]; dst = (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32); DmaCopy32(3, src, dst, 0x800); paletteOffset = OBJ_PLTT_ID(battlerAtk); lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue); buffer = AllocZeroed(0x400); LZDecompressWram(lzPaletteData, buffer); LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP); Free(buffer); if (targetSpecies == SPECIES_CASTFORM) { LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); LoadPalette(gBattleStruct->castformPalette[0] + gBattleMonForms[battlerDef] * 16, paletteOffset, PLTT_SIZE_4BPP); } BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP); gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies = targetSpecies; gBattleMonForms[battlerAtk] = gBattleMonForms[battlerDef]; gSprites[gBattlerSpriteIds[battlerAtk]].y = GetBattlerSpriteDefault_Y(battlerAtk); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleMonForms[battlerAtk]); } } void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite) { u8 position; s32 i; u32 palOffset; if (!loadMonSprite) { position = GetBattlerPosition(battlerId); if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) LZDecompressVram(gSubstituteDollGfx, gMonSpritesGfxPtr->sprites[position]); else LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[position]); for (i = 1; i < 4; ++i) { u8 (*ptr)[4][0x800] = gMonSpritesGfxPtr->sprites[position]; ++ptr; --ptr; DmaCopy32Defvars(3, (*ptr)[0], (*ptr)[i], 0x800); } palOffset = OBJ_PLTT_ID(battlerId); LoadCompressedPalette(gSubstituteDollPal, palOffset, PLTT_SIZE_4BPP); } else { if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); else BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); } } void LoadBattleMonGfxAndAnimate(u8 battlerId, bool8 loadMonSprite, u8 spriteId) { BattleLoadSubstituteOrMonSpriteGfx(battlerId, loadMonSprite); StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[battlerId]); if (!loadMonSprite) gSprites[spriteId].y = GetSubstituteSpriteDefault_Y(battlerId); else gSprites[spriteId].y = GetBattlerSpriteDefault_Y(battlerId); } void TrySetBehindSubstituteSpriteBit(u8 battlerId, u16 move) { if (move == MOVE_SUBSTITUTE) gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute = 1; } void ClearBehindSubstituteBit(u8 battlerId) { gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute = 0; } void HandleLowHpMusicChange(struct Pokemon *mon, u8 battlerId) { u16 hp = GetMonData(mon, MON_DATA_HP); u16 maxHP = GetMonData(mon, MON_DATA_MAX_HP); if (GetHPBarLevel(hp, maxHP) == HP_BAR_RED) { if (!gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong) { if (!gBattleSpritesDataPtr->battlerData[battlerId ^ BIT_FLANK].lowHpSong) PlaySE(SE_LOW_HEALTH); gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong = 1; } } else { gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong = 0; if (!IsDoubleBattle()) m4aSongNumStop(SE_LOW_HEALTH); else if (IsDoubleBattle() && !gBattleSpritesDataPtr->battlerData[battlerId ^ BIT_FLANK].lowHpSong) m4aSongNumStop(SE_LOW_HEALTH); } } void BattleStopLowHpSound(void) { u8 playerBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); gBattleSpritesDataPtr->battlerData[playerBattler].lowHpSong = 0; if (IsDoubleBattle()) gBattleSpritesDataPtr->battlerData[playerBattler ^ BIT_FLANK].lowHpSong = 0; m4aSongNumStop(SE_LOW_HEALTH); } // not used static u8 GetMonHPBarLevel(struct Pokemon *mon) { u16 hp = GetMonData(mon, MON_DATA_HP); u16 maxHP = GetMonData(mon, MON_DATA_MAX_HP); return GetHPBarLevel(hp, maxHP); } void HandleBattleLowHpMusicChange(void) { if (gMain.inBattle) { u8 playerBattler1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); u8 playerBattler2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); u8 battler1PartyId = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[playerBattler1]); u8 battler2PartyId = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[playerBattler2]); if (GetMonData(&gPlayerParty[battler1PartyId], MON_DATA_HP) != 0) HandleLowHpMusicChange(&gPlayerParty[battler1PartyId], playerBattler1); if (IsDoubleBattle() && GetMonData(&gPlayerParty[battler2PartyId], MON_DATA_HP) != 0) HandleLowHpMusicChange(&gPlayerParty[battler2PartyId], playerBattler2); } } void SetBattlerSpriteAffineMode(u8 affineMode) { s32 i; for (i = 0; i < gBattlersCount; ++i) { if (IsBattlerSpritePresent(i)) { gSprites[gBattlerSpriteIds[i]].oam.affineMode = affineMode; if (affineMode == ST_OAM_AFFINE_OFF) { gBattleSpritesDataPtr->healthBoxesData[i].matrixNum = gSprites[gBattlerSpriteIds[i]].oam.matrixNum; gSprites[gBattlerSpriteIds[i]].oam.matrixNum = 0; } else { gSprites[gBattlerSpriteIds[i]].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[i].matrixNum; } } } } void LoadAndCreateEnemyShadowSprites(void) { u8 battlerId; LoadCompressedSpriteSheetUsingHeap(&gSpriteSheet_EnemyShadow); battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X), GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 29, 0xC8); gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].data[0] = battlerId; if (IsDoubleBattle()) { battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X), GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 29, 0xC8); gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].data[0] = battlerId; } } static void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) { bool8 invisible = FALSE; u8 battlerId = shadowSprite->tBattlerId; struct Sprite *battlerSprite = &gSprites[gBattlerSpriteIds[battlerId]]; if (!battlerSprite->inUse || !IsBattlerSpritePresent(battlerId)) { shadowSprite->callback = SpriteCB_SetInvisible; return; } if (gAnimScriptActive || battlerSprite->invisible) invisible = TRUE; else if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE && gEnemyMonElevation[gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies] == 0) invisible = TRUE; if (gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute) invisible = TRUE; shadowSprite->x = battlerSprite->x; shadowSprite->x2 = battlerSprite->x2; shadowSprite->invisible = invisible; } void SpriteCB_SetInvisible(struct Sprite *sprite) { sprite->invisible = TRUE; } void SetBattlerShadowSpriteCallback(u8 battlerId, u16 species) { // The player's shadow is never seen. if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) return; if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies; if (gEnemyMonElevation[species] != 0) gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_EnemyShadow; else gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_SetInvisible; } void HideBattlerShadowSprite(u8 battlerId) { gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_SetInvisible; } // Low-level function that sets specific interface tiles' palettes, // overwriting any pixel with value 0. void BattleInterfaceSetWindowPals(void) { // 9 tiles at 0x06000240 u16 *vramPtr = (u16 *)(BG_VRAM + 0x240); s32 i; s32 j; for (i = 0; i < 9; ++i) { for (j = 0; j < 16; ++vramPtr, ++j) { if (!(*vramPtr & 0xF000)) *vramPtr |= 0xF000; if (!(*vramPtr & 0x0F00)) *vramPtr |= 0x0F00; if (!(*vramPtr & 0x00F0)) *vramPtr |= 0x00F0; if (!(*vramPtr & 0x000F)) *vramPtr |= 0x000F; } } // 18 tiles at 0x06000600 vramPtr = (u16 *)(BG_VRAM + 0x600); for (i = 0; i < 18; ++i) { for (j = 0; j < 16; ++vramPtr, ++j) { if (!(*vramPtr & 0xF000)) *vramPtr |= 0x6000; if (!(*vramPtr & 0x0F00)) *vramPtr |= 0x0600; if (!(*vramPtr & 0x00F0)) *vramPtr |= 0x0060; if (!(*vramPtr & 0x000F)) *vramPtr |= 0x0006; } } } void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute) { gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = SPECIES_NONE; gBattleMonForms[battlerId] = 0; if (!dontClearSubstitute) ClearBehindSubstituteBit(battlerId); } void AllocateMonSpritesGfx(void) { u8 i = 0, j; gMonSpritesGfxPtr = NULL; gMonSpritesGfxPtr = AllocZeroed(sizeof(*gMonSpritesGfxPtr)); gMonSpritesGfxPtr->firstDecompressed = AllocZeroed(0x8000); for (i = 0; i < MAX_BATTLERS_COUNT; ++i) { gMonSpritesGfxPtr->sprites[i] = gMonSpritesGfxPtr->firstDecompressed + (i * 0x2000); *(gMonSpritesGfxPtr->templates + i) = gSpriteTemplates_Battlers[i]; for (j = 0; j < 4; ++j) { gMonSpritesGfxPtr->images[i][j].data = gMonSpritesGfxPtr->sprites[i] + (j * 0x800); gMonSpritesGfxPtr->images[i][j].size = 0x800; } gMonSpritesGfxPtr->templates[i].images = gMonSpritesGfxPtr->images[i]; } gMonSpritesGfxPtr->barFontGfx = AllocZeroed(0x1000); } void FreeMonSpritesGfx(void) { if (gMonSpritesGfxPtr == NULL) return; if (gMonSpritesGfxPtr->multiUseBuffer != NULL) FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer); if (gMonSpritesGfxPtr->field_178 != NULL) FREE_AND_SET_NULL(gMonSpritesGfxPtr->field_178); FREE_AND_SET_NULL(gMonSpritesGfxPtr->barFontGfx); FREE_AND_SET_NULL(gMonSpritesGfxPtr->firstDecompressed); gMonSpritesGfxPtr->sprites[0] = NULL; gMonSpritesGfxPtr->sprites[1] = NULL; gMonSpritesGfxPtr->sprites[2] = NULL; gMonSpritesGfxPtr->sprites[3] = NULL; FREE_AND_SET_NULL(gMonSpritesGfxPtr); } bool32 ShouldPlayNormalMonCry(struct Pokemon *mon) { s16 hp, maxHP; s32 barLevel; if (GetMonData(mon, MON_DATA_STATUS) & (STATUS1_ANY | STATUS1_TOXIC_COUNTER)) return FALSE; hp = GetMonData(mon, MON_DATA_HP); maxHP = GetMonData(mon, MON_DATA_MAX_HP); barLevel = GetHPBarLevel(hp, maxHP); if (barLevel <= HP_BAR_YELLOW) return FALSE; return TRUE; } ================================================ FILE: src/battle_interface.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "battle_interface.h" #include "battle_setup.h" #include "battle_message.h" #include "event_data.h" #include "decompress.h" #include "graphics.h" #include "menu.h" #include "overworld.h" #include "pokedex.h" #include "pokemon_summary_screen.h" #include "safari_zone.h" #include "constants/songs.h" #undef abs #define abs(a) ((a) < 0 ? -(a) : (a)) struct TestingBar { s32 maxValue; s32 oldValue; s32 receivedValue; u32 pal:5; u32 tileOffset; }; // These are used as indexes for each "section of tiles" in gBattleInterface_Gfx #define B_INTERFACE_GFX_TRANSPARENT 0 #define B_INTERFACE_GFX_HP_BAR_HP_TEXT 1 #define B_INTERFACE_GFX_HP_BAR_GREEN 3 #define B_INTERFACE_GFX_EXP_BAR 12 #define B_INTERFACE_GFX_STATUS_PSN_BATTLER0 21 // BATTLER0: B_POSITION_PLAYER_LEFT #define B_INTERFACE_GFX_STATUS_PAR_BATTLER0 24 #define B_INTERFACE_GFX_STATUS_SLP_BATTLER0 27 #define B_INTERFACE_GFX_STATUS_FRZ_BATTLER0 30 #define B_INTERFACE_GFX_STATUS_BRN_BATTLER0 33 // tiles 36 through 38 are unused #define B_INTERFACE_GFX_STATUS_NONE 39 // tiles 40 through 42 are unused #define B_INTERFACE_GFX_SAFARI_HEALTHBOX_0 43 #define B_INTERFACE_GFX_SAFARI_HEALTHBOX_1 44 #define B_INTERFACE_GFX_SAFARI_HEALTHBOX_2 45 // tile 46 is unused #define B_INTERFACE_GFX_HP_BAR_YELLOW 47 #define B_INTERFACE_GFX_HP_BAR_RED 56 #define B_INTERFACE_GFX_HP_BAR_LEFT_BORDER 65 // Used in place of the HP text graphic if the pokemon is statused #define B_INTERFACE_GFX_BALL_PARTY_SUMMARY 66 #define B_INTERFACE_GFX_BALL_CAUGHT 70 #define B_INTERFACE_GFX_STATUS_PSN_BATTLER1 71 // BATTLER1: B_POSITION_OPPONENT_LEFT #define B_INTERFACE_GFX_STATUS_PAR_BATTLER1 74 #define B_INTERFACE_GFX_STATUS_SLP_BATTLER1 77 #define B_INTERFACE_GFX_STATUS_FRZ_BATTLER1 80 #define B_INTERFACE_GFX_STATUS_BRN_BATTLER1 83 #define B_INTERFACE_GFX_STATUS_PSN_BATTLER2 86 // BATTLER2: B_POSITION_PLAYER_RIGHT #define B_INTERFACE_GFX_STATUS_PAR_BATTLER2 89 #define B_INTERFACE_GFX_STATUS_SLP_BATTLER2 92 #define B_INTERFACE_GFX_STATUS_FRZ_BATTLER2 95 #define B_INTERFACE_GFX_STATUS_BRN_BATTLER2 98 #define B_INTERFACE_GFX_STATUS_PSN_BATTLER3 101 // BATTLER3: B_POSITION_OPPONENT_RIGHT #define B_INTERFACE_GFX_STATUS_PAR_BATTLER3 104 #define B_INTERFACE_GFX_STATUS_SLP_BATTLER3 107 #define B_INTERFACE_GFX_STATUS_FRZ_BATTLER3 110 #define B_INTERFACE_GFX_STATUS_BRN_BATTLER3 113 #define B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_TEXT 116 // Used in the player's #define B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_BAR 117 // healthbox in double battles #define B_INTERFACE_GFX_NUZLOCKE_INDICATOR 118 //Nuzlocke indicator static void SpriteCB_HealthBoxOther(struct Sprite *sprite); static void SpriteCB_HealthBar(struct Sprite *sprite); static const u8 *GetBattleInterfaceGfxPtr(u8 which); static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); static void Task_HidePartyStatusSummary_BattleStart_1(u8 taskId); static void Task_HidePartyStatusSummary_BattleStart_2(u8 taskId); static void SpriteCB_PartySummaryBar_Exit(struct Sprite *sprite); static void SpriteCB_PartySummaryBall_Exit(struct Sprite *sprite); static void Task_HidePartyStatusSummary_DuringBattle(u8 taskId); static void SpriteCB_PartySummaryBall_OnSwitchout(struct Sprite *sprite); static void UpdateStatusIconInHealthbox(u8 spriteId); static void SpriteCB_PartySummaryBar(struct Sprite *sprite); static void SpriteCB_PartySummaryBall_OnBattleStart(struct Sprite *sprite); static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId); static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar); static u8 GetReceivedValueInPixels(s32 oldValue, s32 receivedValue, s32 maxValue, u8 scale); static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale); static s32 CalcNewBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5); static s32 CalcNewExpBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5); static void DrawHealthbarOntoScreen(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y); static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth); static u8 *AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 *windowId); static void RemoveWindowOnHealthbox(u32 windowId); static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 windowWidth); static const struct OamData sOamData_Healthbox = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; static const struct SpriteTemplate sHealthboxPlayerSpriteTemplates[] = { [B_POSITION_PLAYER_LEFT / 2] = { .tileTag = TAG_HEALTHBOX_PLAYER1_TILE, .paletteTag = TAG_HEALTHBOX_PAL, .oam = &sOamData_Healthbox, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }, [B_POSITION_PLAYER_RIGHT / 2] = { .tileTag = TAG_HEALTHBOX_PLAYER2_TILE, .paletteTag = TAG_HEALTHBOX_PAL, .oam = &sOamData_Healthbox, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy } }; static const struct SpriteTemplate sHealthboxOpponentSpriteTemplates[] = { [B_POSITION_OPPONENT_LEFT / 2] = { .tileTag = TAG_HEALTHBOX_OPPONENT1_TILE, .paletteTag = TAG_HEALTHBOX_PAL, .oam = &sOamData_Healthbox, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }, [B_POSITION_OPPONENT_RIGHT / 2] = { .tileTag = TAG_HEALTHBOX_OPPONENT2_TILE, .paletteTag = TAG_HEALTHBOX_PAL, .oam = &sOamData_Healthbox, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy } }; static const struct SpriteTemplate sHealthboxSafariSpriteTemplate = { .tileTag = TAG_HEALTHBOX_SAFARI_TILE, .paletteTag = TAG_HEALTHBOX_PAL, .oam = &sOamData_Healthbox, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_Healthbar = { .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .priority = 1 }; static const struct SpriteTemplate sHealthbarSpriteTemplates[] = { [B_POSITION_PLAYER_LEFT] = { .tileTag = TAG_HEALTHBAR_PLAYER1_TILE, .paletteTag = TAG_HEALTHBAR_PAL, .oam = &sOamData_Healthbar, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_HealthBar }, [B_POSITION_OPPONENT_LEFT] = { .tileTag = TAG_HEALTHBAR_OPPONENT1_TILE, .paletteTag = TAG_HEALTHBAR_PAL, .oam = &sOamData_Healthbar, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_HealthBar }, [B_POSITION_PLAYER_RIGHT] = { .tileTag = TAG_HEALTHBAR_PLAYER2_TILE, .paletteTag = TAG_HEALTHBAR_PAL, .oam = &sOamData_Healthbar, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_HealthBar }, [B_POSITION_OPPONENT_RIGHT] = { .tileTag = TAG_HEALTHBAR_OPPONENT2_TILE, .paletteTag = TAG_HEALTHBAR_PAL, .oam = &sOamData_Healthbar, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_HealthBar } }; static const struct Subsprite sUnused_Subsprites_0[] = { { -16, 0, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), 0, 1 }, { 48, 0, SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), 32, 1 }, { -16, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 48, 1 }, { 16, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 52, 1 }, { 48, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 56, 1 } }; static const struct Subsprite sUnused_Subsprites_2[] = { { -16, 0, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), 64, 1 }, { 48, 0, SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), 96, 1 }, { -16, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 112, 1 }, { 16, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 116, 1 }, { 48, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 120, 1 } }; static const struct Subsprite sUnused_Subsprites_1[] = { { -16, 0, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), 0, 1 }, { 48, 0, SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), 32, 1 } }; static const struct Subsprite sUnused_Subsprites_3[] = { { -16, 0, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), 0, 1 }, { 48, 0, SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), 32, 1 } }; static const struct Subsprite sHealthBar_Subsprites_Player[] = { { .x = -16, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = 16, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 1 } }; static const struct Subsprite sHealthBar_Subsprites_Opponent[] = { { .x = -16, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = 16, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 1 }, { .x = -32, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 8, .priority = 1 }, }; // Unused static const struct SubspriteTable sUnused_SubspriteTable[] = { {ARRAY_COUNT(sUnused_Subsprites_0), sUnused_Subsprites_0}, {ARRAY_COUNT(sUnused_Subsprites_1), sUnused_Subsprites_1}, {ARRAY_COUNT(sUnused_Subsprites_2), sUnused_Subsprites_2}, {ARRAY_COUNT(sUnused_Subsprites_3), sUnused_Subsprites_3} }; static const struct SubspriteTable sHealthBar_SubspriteTable[] = { [B_SIDE_PLAYER] = {ARRAY_COUNT(sHealthBar_Subsprites_Player), sHealthBar_Subsprites_Player}, [B_SIDE_OPPONENT] = {ARRAY_COUNT(sHealthBar_Subsprites_Opponent), sHealthBar_Subsprites_Opponent}, }; static const struct Subsprite sStatusSummaryBar_Subsprites_Enter[] = { { .x = -96, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = -64, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 1 }, { .x = -32, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 1 }, { .x = 0, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 12, .priority = 1 } }; static const struct Subsprite sStatusSummaryBar_Subsprites_Exit[] = { { .x = -96, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = -64, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 1 }, { .x = -32, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 1 }, { .x = 0, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 1 }, { .x = 32, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 1 }, { .x = 64, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 12, .priority = 1 } }; static const struct SubspriteTable sStatusSummaryBar_SubspriteTable_Enter[] = { {ARRAY_COUNT(sStatusSummaryBar_Subsprites_Enter), sStatusSummaryBar_Subsprites_Enter} }; static const struct SubspriteTable sStatusSummaryBar_SubspriteTable_Exit[] = { {ARRAY_COUNT(sStatusSummaryBar_Subsprites_Exit), sStatusSummaryBar_Subsprites_Exit} }; static const u16 sBattleInterface_Unused[] = INCBIN_U16("graphics/battle_interface/unused.4bpp"); static const struct CompressedSpriteSheet sPartySummaryBarSpriteSheets[] = { {gBattleInterface_PartySummaryBar_Gfx, 16 * TILE_SIZE_4BPP, TAG_PARTY_SUMMARY_BAR_PLAYER_TILE}, {gBattleInterface_PartySummaryBar_Gfx, 16 * TILE_SIZE_4BPP, TAG_PARTY_SUMMARY_BAR_OPPONENT_TILE} }; static const struct SpritePalette sPartySummaryBarSpritePals[] = { {gBattleInterface_Healthbox_Pal, TAG_PARTY_SUMMARY_BAR_PLAYER_PAL}, {gBattleInterface_Healthbox_Pal, TAG_PARTY_SUMMARY_BAR_OPPONENT_PAL} }; static const struct SpritePalette sPartySummaryBallSpritePals[] = { {gBattleInterface_Healthbar_Pal, TAG_PARTY_SUMMARY_BALL_PLAYER_PAL}, {gBattleInterface_Healthbar_Pal, TAG_PARTY_SUMMARY_BALL_OPPONENT_PAL} }; static const struct SpriteSheet sPartySummaryBallSpriteSheets[] = { {gBattleInterface_Gfx + B_INTERFACE_GFX_BALL_PARTY_SUMMARY, 4 * TILE_SIZE_4BPP, TAG_PARTY_SUMMARY_BALL_PLAYER_TILE}, {gBattleInterface_Gfx + B_INTERFACE_GFX_BALL_PARTY_SUMMARY, 4 * TILE_SIZE_4BPP, TAG_PARTY_SUMMARY_BALL_OPPONENT_TILE} }; // Unused static const struct OamData sOamData_Healthbox2 = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; static const struct OamData sOamData_PartySummaryBall = { .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .priority = 1 }; static const struct SpriteTemplate sPartySummaryBarSpriteTemplates[] = { { .tileTag = TAG_PARTY_SUMMARY_BAR_PLAYER_TILE, .paletteTag = TAG_PARTY_SUMMARY_BAR_PLAYER_PAL, .oam = &sOamData_Healthbox, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PartySummaryBar }, { .tileTag = TAG_PARTY_SUMMARY_BAR_OPPONENT_TILE, .paletteTag = TAG_PARTY_SUMMARY_BAR_OPPONENT_PAL, .oam = &sOamData_Healthbox, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PartySummaryBar } }; static const struct SpriteTemplate sPartySummaryBallSpriteTemplates[] = { { .tileTag = TAG_PARTY_SUMMARY_BALL_PLAYER_TILE, .paletteTag = TAG_PARTY_SUMMARY_BALL_PLAYER_PAL, .oam = &sOamData_PartySummaryBall, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PartySummaryBall_OnBattleStart }, { .tileTag = TAG_PARTY_SUMMARY_BALL_OPPONENT_TILE, .paletteTag = TAG_PARTY_SUMMARY_BALL_OPPONENT_PAL, .oam = &sOamData_PartySummaryBall, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PartySummaryBall_OnBattleStart } }; static void Debug_DrawNumber(s16 number, u16 *dest, bool8 singleRow) { s8 i, j; u8 buff[4]; for (i = 0; i < 4; i++) buff[i] = 0; for (i = 3; ; i--) { if (number > 0) { buff[i] = number % 10; number /= 10; } else { while (i > -1) { buff[i] = 0xFF; i--; } if (buff[3] == 0xFF) buff[3] = 0; break; } } if (!singleRow) { for (i = 0, j = 0; i < 4; i++) { if (buff[j] == 0xFF) { dest[j + 0x00] &= 0xFC00; dest[j + 0x00] |= 30; dest[i + 0x20] &= 0xFC00; dest[i + 0x20] |= 30; } else { dest[j + 0x00] &= 0xFC00; dest[j + 0x00] |= 20 + buff[j]; dest[i + 0x20] &= 0xFC00; dest[i + 0x20] |= 20 + buff[i] + 1 * TILE_SIZE_4BPP; } j++; } } else { for (i = 0; i < 4; i++) { if (buff[i] == 0xFF) { dest[i + 0x00] &= 0xFC00; dest[i + 0x00] |= 30; dest[i + 0x20] &= 0xFC00; dest[i + 0x20] |= 30; } else { dest[i + 0x00] &= 0xFC00; dest[i + 0x00] |= 20 + buff[i]; dest[i + 0x20] &= 0xFC00; dest[i + 0x20] |= 20 + buff[i] + 1 * TILE_SIZE_4BPP; } } } } // Unused static void Debug_DrawNumberPair(s16 num1, s16 num2, u16 *dest) { dest[4] = 30; Debug_DrawNumber(num2, &dest[0], FALSE); Debug_DrawNumber(num1, &dest[5], TRUE); } // Because the healthbox is too large to fit into one sprite, it is divided // into two sprites. The left sprite is used as the 'main' healthbox sprite, // while the right sprite is the 'other' healthbox sprite. // There is also a third sprite for the healthbar, visible on the healthbox. // sprite data for main (left) healthbox sprite #define sHealthboxOtherSpriteId oam.affineParam #define sHealthBarSpriteId data[5] #define sBattlerId data[6] // sprite data for other (right) healthbox sprite #define sHealthboxSpriteId data[5] // sprite data for healthbar sprite #define sHealthboxSpriteId data[5] #define sHealthbarType data[6] enum { HEALTHBAR_TYPE_PLAYER_SINGLE, HEALTHBAR_TYPE_PLAYER_DOUBLE, HEALTHBAR_TYPE_OPPONENT, }; u8 CreateBattlerHealthboxSprites(u8 battlerId) { s16 healthbarType = HEALTHBAR_TYPE_PLAYER_SINGLE; u8 healthboxSpriteId; u8 healthboxOtherSpriteId; u8 healthbarSpriteId; struct Sprite *healthbarSprite; if (!IsDoubleBattle()) { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { healthboxSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[B_POSITION_PLAYER_LEFT / 2], 240, 160, 1); healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[B_POSITION_PLAYER_LEFT / 2], 240, 160, 1); gSprites[healthboxSpriteId].oam.shape = SPRITE_SHAPE(64x64); gSprites[healthboxOtherSpriteId].oam.shape = SPRITE_SHAPE(64x64); gSprites[healthboxOtherSpriteId].oam.tileNum += 2 * TILE_SIZE_4BPP; } else { healthboxSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[B_POSITION_OPPONENT_LEFT / 2], 240, 160, 1); healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[B_POSITION_OPPONENT_LEFT / 2], 240, 160, 1); gSprites[healthboxOtherSpriteId].oam.tileNum += 1 * TILE_SIZE_4BPP; healthbarType = HEALTHBAR_TYPE_OPPONENT; } gSprites[healthboxSpriteId].sHealthboxOtherSpriteId = healthboxOtherSpriteId; gSprites[healthboxOtherSpriteId].sHealthboxSpriteId = healthboxSpriteId; gSprites[healthboxOtherSpriteId].callback = SpriteCB_HealthBoxOther; } else { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { healthboxSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); gSprites[healthboxSpriteId].sHealthboxOtherSpriteId = healthboxOtherSpriteId; gSprites[healthboxOtherSpriteId].sHealthboxSpriteId = healthboxSpriteId; gSprites[healthboxOtherSpriteId].oam.tileNum += 1 * TILE_SIZE_4BPP; gSprites[healthboxOtherSpriteId].callback = SpriteCB_HealthBoxOther; healthbarType = HEALTHBAR_TYPE_PLAYER_DOUBLE; } else { healthboxSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); gSprites[healthboxSpriteId].sHealthboxOtherSpriteId = healthboxOtherSpriteId; gSprites[healthboxOtherSpriteId].sHealthboxSpriteId = healthboxSpriteId; gSprites[healthboxOtherSpriteId].oam.tileNum += 1 * TILE_SIZE_4BPP; gSprites[healthboxOtherSpriteId].callback = SpriteCB_HealthBoxOther; healthbarType = HEALTHBAR_TYPE_OPPONENT; } } healthbarSpriteId = CreateSpriteAtEnd(&sHealthbarSpriteTemplates[gBattlerPositions[battlerId]], 140, 60, 0); healthbarSprite = &gSprites[healthbarSpriteId]; SetSubspriteTables(healthbarSprite, &sHealthBar_SubspriteTable[GetBattlerSide(battlerId)]); healthbarSprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; healthbarSprite->oam.priority = 1; CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_HP_BAR_HP_TEXT), OBJ_VRAM0 + healthbarSprite->oam.tileNum * TILE_SIZE_4BPP, 2 * TILE_SIZE_4BPP); gSprites[healthboxSpriteId].sHealthBarSpriteId = healthbarSpriteId; gSprites[healthboxSpriteId].sBattlerId = battlerId; gSprites[healthboxSpriteId].invisible = TRUE; gSprites[healthboxOtherSpriteId].invisible = TRUE; healthbarSprite->sHealthboxSpriteId = healthboxSpriteId; healthbarSprite->sHealthbarType = healthbarType; healthbarSprite->invisible = TRUE; return healthboxSpriteId; } u8 CreateSafariPlayerHealthboxSprites(void) { u8 healthboxSpriteId = CreateSprite(&sHealthboxSafariSpriteTemplate, 240, 160, 1); u8 healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxSafariSpriteTemplate, 240, 160, 1); gSprites[healthboxSpriteId].oam.shape = SPRITE_SHAPE(64x64); gSprites[healthboxOtherSpriteId].oam.shape = SPRITE_SHAPE(64x64); gSprites[healthboxOtherSpriteId].oam.tileNum += 2 * TILE_SIZE_4BPP; gSprites[healthboxSpriteId].sHealthboxOtherSpriteId = healthboxOtherSpriteId; gSprites[healthboxOtherSpriteId].sHealthboxSpriteId = healthboxSpriteId; gSprites[healthboxOtherSpriteId].callback = SpriteCB_HealthBoxOther; return healthboxSpriteId; } static const u8 *GetBattleInterfaceGfxPtr(u8 elementId) { return gBattleInterface_Gfx[elementId]; } // Syncs the position of healthbar accordingly with the healthbox. static void SpriteCB_HealthBar(struct Sprite *sprite) { u8 healthboxSpriteId = sprite->sHealthboxSpriteId; switch (sprite->sHealthbarType) { case HEALTHBAR_TYPE_PLAYER_SINGLE: sprite->x = gSprites[healthboxSpriteId].x + 16; sprite->y = gSprites[healthboxSpriteId].y; break; case HEALTHBAR_TYPE_PLAYER_DOUBLE: sprite->x = gSprites[healthboxSpriteId].x + 16; sprite->y = gSprites[healthboxSpriteId].y; break; default: case HEALTHBAR_TYPE_OPPONENT: sprite->x = gSprites[healthboxSpriteId].x + 8; sprite->y = gSprites[healthboxSpriteId].y; break; } sprite->x2 = gSprites[healthboxSpriteId].x2; sprite->y2 = gSprites[healthboxSpriteId].y2; } static void SpriteCB_HealthBoxOther(struct Sprite *sprite) { u8 healthboxSpriteId = sprite->sHealthboxSpriteId; sprite->x = gSprites[healthboxSpriteId].x + 64; sprite->y = gSprites[healthboxSpriteId].y; sprite->x2 = gSprites[healthboxSpriteId].x2; sprite->y2 = gSprites[healthboxSpriteId].y2; } void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 oldVal, s32 receivedValue) { gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId = healthboxSpriteId; gBattleSpritesDataPtr->battleBars[battlerId].maxValue = maxVal; gBattleSpritesDataPtr->battleBars[battlerId].oldValue = oldVal; gBattleSpritesDataPtr->battleBars[battlerId].receivedValue = receivedValue; gBattleSpritesDataPtr->battleBars[battlerId].currValue = -32768; } void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) { gSprites[healthboxSpriteId].invisible = TRUE; gSprites[gSprites[healthboxSpriteId].sHealthBarSpriteId].invisible = TRUE; gSprites[gSprites[healthboxSpriteId].sHealthboxOtherSpriteId].invisible = TRUE; } void SetHealthboxSpriteVisible(u8 healthboxSpriteId) { gSprites[healthboxSpriteId].invisible = FALSE; gSprites[gSprites[healthboxSpriteId].sHealthBarSpriteId].invisible = FALSE; gSprites[gSprites[healthboxSpriteId].sHealthboxOtherSpriteId].invisible = FALSE; } static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) { gSprites[spriteId].x = x; gSprites[spriteId].y = y; } void DestoryHealthboxSprite(u8 healthboxSpriteId) { DestroySprite(&gSprites[gSprites[healthboxSpriteId].sHealthboxOtherSpriteId]); DestroySprite(&gSprites[gSprites[healthboxSpriteId].sHealthBarSpriteId]); DestroySprite(&gSprites[healthboxSpriteId]); } void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBattlerOnly) { } void UpdateOamPriorityInAllHealthboxes(u8 priority) { s32 i; for (i = 0; i < gBattlersCount; i++) { u8 healthboxSpriteId = gHealthboxSpriteIds[i]; u8 healthboxOtherSpriteId = gSprites[gHealthboxSpriteIds[i]].sHealthboxOtherSpriteId; u8 healthbarSpriteId = gSprites[gHealthboxSpriteIds[i]].sHealthBarSpriteId; gSprites[healthboxSpriteId].oam.priority = priority; gSprites[healthboxOtherSpriteId].oam.priority = priority; gSprites[healthbarSpriteId].oam.priority = priority; } } void InitBattlerHealthboxCoords(u8 battler) { s16 x = 0, y = 0; if (!IsDoubleBattle()) { if (GetBattlerSide(battler) != B_SIDE_PLAYER) x = 44, y = 30; else x = 158, y = 88; } else { switch (GetBattlerPosition(battler)) { case B_POSITION_PLAYER_LEFT: x = 159, y = 75; break; case B_POSITION_PLAYER_RIGHT: x = 171, y = 100; break; case B_POSITION_OPPONENT_LEFT: x = 44, y = 19; break; case B_POSITION_OPPONENT_RIGHT: x = 32, y = 44; break; } } UpdateSpritePos(gHealthboxSpriteIds[battler], x, y); } static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) { u32 windowId, spriteTileNum; u8 *windowTileData; u8 text[16] = _("{LV_2}"); u32 xPos; u8 *objVram; objVram = ConvertIntToDecimalStringN(text + 2, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); xPos = 5 * (3 - (objVram - (text + 2))); windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER) { objVram = (void *)(OBJ_VRAM0); if (!IsDoubleBattle()) objVram += spriteTileNum + 0x820; else objVram += spriteTileNum + 0x420; } else { objVram = (void *)(OBJ_VRAM0); objVram += spriteTileNum + 0x400; } TextIntoHealthboxObject(objVram, windowTileData, 3); RemoveWindowOnHealthbox(windowId); } void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) { u32 windowId, spriteTileNum; u8 *windowTileData; if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER && !IsDoubleBattle()) { // Only in the Japanese release can HP be displayed as text outside of double battles u8 text[8]; if (maxOrCurrent != HP_CURRENT) // singles, max { ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum; TextIntoHealthboxObject((void *)(OBJ_VRAM0) + spriteTileNum * TILE_SIZE_4BPP + 0xA40, windowTileData, 2); RemoveWindowOnHealthbox(windowId); } else // singles, current { u8 *strptr; strptr = ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); *strptr++ = CHAR_SLASH; *strptr++ = EOS; windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 4, 5, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum; TextIntoHealthboxObject((void *)(OBJ_VRAM0) + spriteTileNum * TILE_SIZE_4BPP + 0x2E0, windowTileData, 1); TextIntoHealthboxObject((void *)(OBJ_VRAM0) + spriteTileNum * TILE_SIZE_4BPP + 0xA00, windowTileData + 0x20, 2); RemoveWindowOnHealthbox(windowId); } } else { u8 battler; u8 text[20] = __("{COLOR 01}{HIGHLIGHT 02}"); battler = gSprites[healthboxSpriteId].sBattlerId; if (IsDoubleBattle() == TRUE || GetBattlerSide(battler) == B_SIDE_OPPONENT) UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent); else { // Only in the Japanese release can HP be displayed as text outside of double battles u32 var; u32 i; if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER) { if (maxOrCurrent == HP_CURRENT) var = 29; else var = 89; } else { if (maxOrCurrent == HP_CURRENT) var = 20; else var = 48; } ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3); RenderTextHandleBold(gMonSpritesGfxPtr->barFontGfx, 0, text, 0, 0, 0, 0, 0); for (i = 0; i < 3; i++) { CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[i * 64 + 32], (void *)((OBJ_VRAM0) + TILE_SIZE_4BPP * (gSprites[healthboxSpriteId].oam.tileNum + var + i)), 1 * TILE_SIZE_4BPP); } } } } static const u8 sText_Slash[] = _("/"); static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) { u32 windowId, spriteTileNum; u8 *windowTileData; u8 battlerId; u8 text[20] = __("{COLOR 01}{HIGHLIGHT 00}"); battlerId = gSprites[healthboxSpriteId].sBattlerId; if (gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) { u8 var = 4; u8 healthBarSpriteId; u8 *txtPtr; u32 i; if (maxOrCurrent == HP_CURRENT) var = 0; healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId; txtPtr = ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3); if (maxOrCurrent == HP_CURRENT) StringCopy(txtPtr, sText_Slash); RenderTextHandleBold(gMonSpritesGfxPtr->barFontGfx, 0, text, 0, 0, 0, 0, 0); for (i = var; i < var + 3; i++) { if (i < 3) { CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[((i - var) * 64) + 32], (void *)((OBJ_VRAM0) + (1 + gSprites[healthBarSpriteId].oam.tileNum + i) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); } else { CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[((i - var) * 64) + 32], (void *)((OBJ_VRAM0 + 0x20) + (i + gSprites[healthBarSpriteId].oam.tileNum) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); } } if (maxOrCurrent == HP_CURRENT) { CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[224], (void *)((OBJ_VRAM0) + ((gSprites[healthBarSpriteId].oam.tileNum + 4) * TILE_SIZE_4BPP)), 1 * TILE_SIZE_4BPP); CpuFill32(0, (void *)((OBJ_VRAM0) + (gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP)), 1 * TILE_SIZE_4BPP); } else { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_TEXT), (void *)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); } } } } // Prints mon's nature, catch and flee rate. Probably used to test pokeblock-related features. static void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon) { u8 text[20] = __("{COLOR 01}{HIGHLIGHT 02}"); s32 j, spriteTileNum; u8 *barFontGfx; u8 i, var, nature, healthBarSpriteId; barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBattlerPosition(gSprites[healthboxSpriteId].sBattlerId) * 384)]; var = 5; nature = GetNature(mon); StringCopy(text + 6, gNatureNamePointers[nature]); RenderTextHandleBold(barFontGfx, 0, text, 0, 0, 0, 0, 0); for (j = 6, i = 0; i < var; i++, j++) { u8 elementId; if ((text[j] >= 55 && text[j] <= 74) || (text[j] >= 135 && text[j] <= 154)) elementId = B_INTERFACE_GFX_SAFARI_HEALTHBOX_1; else if ((text[j] >= 75 && text[j] <= 79) || (text[j] >= 155 && text[j] <= 159)) elementId = B_INTERFACE_GFX_SAFARI_HEALTHBOX_2; else elementId = B_INTERFACE_GFX_SAFARI_HEALTHBOX_0; CpuCopy32(GetBattleInterfaceGfxPtr(elementId), barFontGfx + (i * 64), 0x20); } for (j = 1; j < var + 1; j++) { spriteTileNum = (gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * TILE_SIZE_4BPP; CpuCopy32(barFontGfx, (void *)(OBJ_VRAM0) + (spriteTileNum), 0x20); barFontGfx += 0x20; spriteTileNum = (8 + gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * TILE_SIZE_4BPP; CpuCopy32(barFontGfx, (void *)(OBJ_VRAM0) + (spriteTileNum), 0x20); barFontGfx += 0x20; } healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId; ConvertIntToDecimalStringN(text + 6, gBattleStruct->safariCatchFactor, STR_CONV_MODE_RIGHT_ALIGN, 2); ConvertIntToDecimalStringN(text + 9, gBattleStruct->safariEscapeFactor, STR_CONV_MODE_RIGHT_ALIGN, 2); text[5] = CHAR_SPACE; text[8] = CHAR_SLASH; RenderTextHandleBold(gMonSpritesGfxPtr->barFontGfx, 0, text, 0, 0, 0, 0, 0); j = healthBarSpriteId; // Needed to match for some reason. for (j = 0; j < 5; j++) { if (j <= 1) { CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20], (void *)(OBJ_VRAM0) + (gSprites[healthBarSpriteId].oam.tileNum + 2 + j) * TILE_SIZE_4BPP, 32); } else { CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20], (void *)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthBarSpriteId].oam.tileNum) * TILE_SIZE_4BPP, 32); } } } void SwapHpBarsWithHpText(void) { s32 i; u8 healthBarSpriteId; for (i = 0; i < gBattlersCount; i++) { if (gSprites[gHealthboxSpriteIds[i]].callback == SpriteCallbackDummy && GetBattlerSide(i) != B_SIDE_OPPONENT && (IsDoubleBattle() || GetBattlerSide(i) != B_SIDE_PLAYER)) { bool8 noBars; gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars ^= 1; noBars = gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars; if (GetBattlerSide(i) == B_SIDE_PLAYER) { if (!IsDoubleBattle()) continue; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) continue; if (noBars == TRUE) // bars to text { healthBarSpriteId = gSprites[gHealthboxSpriteIds[i]].sHealthBarSpriteId; CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 8 * TILE_SIZE_4BPP); UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT); UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX); } else // text to bars { UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]); UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gPlayerParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR); CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_BAR), (void *)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); } } else { if (noBars == TRUE) // bars to text { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { // Most likely a debug function. PrintSafariMonInfo(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]]); } else { healthBarSpriteId = gSprites[gHealthboxSpriteIds[i]].sHealthBarSpriteId; CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 8 * TILE_SIZE_4BPP); UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT); UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX); } } else // text to bars { UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]); UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR); if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_NICK); } } gSprites[gHealthboxSpriteIds[i]].data[7] ^= 1; } } } #define tBattler data[0] #define tSummaryBarSpriteId data[1] #define tBallIconSpriteId(n) data[3 + n] #define tIsBattleStart data[10] #define tTimer data[11] #define tBlendWeight data[15] // sprite data for party summary bar #define sEnterSpeed data[0] #define sExitSpeed data[1] // sprite data for party summary ball icon #define sSummaryBarSpriteId data[0] #define sTimer data[1] #define sIsOpponent data[2] #define sSpeed data[3] #define sIsEmptyBall data[7] u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, bool8 isSwitchingMons, bool8 isBattleStart) { bool8 isOpponent; s8 nValidMons; s16 x, y, x2, speed; s32 i; u8 summaryBarSpriteId; u8 ballIconSpritesIds[PARTY_SIZE]; u8 taskId; if (!isSwitchingMons || GetBattlerPosition(battlerId) != B_POSITION_OPPONENT_RIGHT) { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { isOpponent = FALSE; x = 136, y = 96; x2 = 100; speed = -5; } else { isOpponent = TRUE; if (!isSwitchingMons || !IsDoubleBattle()) x = 104, y = 40; else x = 104, y = 16; x2 = -100; speed = 5; } } else { isOpponent = TRUE; x = 104, y = 40; x2 = -100; speed = 5; } for (i = 0, nValidMons = 0; i < PARTY_SIZE; i++) { if (partyInfo[i].hp != HP_EMPTY_SLOT) nValidMons++; } LoadCompressedSpriteSheetUsingHeap(&sPartySummaryBarSpriteSheets[isOpponent]); LoadSpriteSheet(&sPartySummaryBallSpriteSheets[isOpponent]); LoadSpritePalette(&sPartySummaryBarSpritePals[isOpponent]); LoadSpritePalette(&sPartySummaryBallSpritePals[isOpponent]); summaryBarSpriteId = CreateSprite(&sPartySummaryBarSpriteTemplates[isOpponent], x, y, 10); SetSubspriteTables(&gSprites[summaryBarSpriteId], sStatusSummaryBar_SubspriteTable_Enter); gSprites[summaryBarSpriteId].x2 = x2; gSprites[summaryBarSpriteId].sEnterSpeed = speed; if (isOpponent) { gSprites[summaryBarSpriteId].x -= 96; gSprites[summaryBarSpriteId].oam.matrixNum = ST_OAM_HFLIP; } else gSprites[summaryBarSpriteId].x += 96; for (i = 0; i < PARTY_SIZE; i++) { ballIconSpritesIds[i] = CreateSpriteAtEnd(&sPartySummaryBallSpriteTemplates[isOpponent], x, y - 4, 9); if (!isBattleStart) gSprites[ballIconSpritesIds[i]].callback = SpriteCB_PartySummaryBall_OnSwitchout; if (!isOpponent) { gSprites[ballIconSpritesIds[i]].x2 = 0; gSprites[ballIconSpritesIds[i]].y2 = 0; } gSprites[ballIconSpritesIds[i]].sSummaryBarSpriteId = summaryBarSpriteId; if (!isOpponent) { gSprites[ballIconSpritesIds[i]].x += 10 * i + 24; gSprites[ballIconSpritesIds[i]].sTimer = i * 7 + 10; gSprites[ballIconSpritesIds[i]].x2 = 120; } else { gSprites[ballIconSpritesIds[i]].x -= 10 * (5 - i) + 24; gSprites[ballIconSpritesIds[i]].sTimer = (6 - i) * 7 + 10; gSprites[ballIconSpritesIds[i]].x2 = -120; } gSprites[ballIconSpritesIds[i]].sIsOpponent = isOpponent; } if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { for (i = 0; i < PARTY_SIZE; i++) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (partyInfo[i].hp == HP_EMPTY_SLOT) { gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; gSprites[ballIconSpritesIds[i]].sIsEmptyBall = TRUE; } else if (partyInfo[i].hp == 0) gSprites[ballIconSpritesIds[i]].oam.tileNum += 3; else if (partyInfo[i].status != STATUS1_NONE) gSprites[ballIconSpritesIds[i]].oam.tileNum += 2; } else { if (i >= nValidMons) { gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; gSprites[ballIconSpritesIds[i]].sIsEmptyBall = TRUE; } else if (partyInfo[i].hp == 0) gSprites[ballIconSpritesIds[i]].oam.tileNum += 3; else if (partyInfo[i].status != STATUS1_NONE) gSprites[ballIconSpritesIds[i]].oam.tileNum += 2; } } } else { for (i = 0; i < PARTY_SIZE; i++) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (partyInfo[i].hp == HP_EMPTY_SLOT) { gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 1; gSprites[ballIconSpritesIds[5 - i]].sIsEmptyBall = TRUE; } else if (partyInfo[i].hp == 0) gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 3; else if (partyInfo[i].status != STATUS1_NONE) gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 2; } else { ballIconSpritesIds[5 - i] += 0; if (i >= nValidMons) { gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 1; gSprites[ballIconSpritesIds[5 - i]].sIsEmptyBall = TRUE; } else if (partyInfo[i].hp == 0) gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 3; else if (partyInfo[i].status != STATUS1_NONE) { do { gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 2; } while (0); } } ballIconSpritesIds[5 - ++i] += 0; i--; } } taskId = CreateTask(TaskDummy, 5); gTasks[taskId].tBattler = battlerId; gTasks[taskId].tSummaryBarSpriteId = summaryBarSpriteId; for (i = 0; i < PARTY_SIZE; i++) gTasks[taskId].tBallIconSpriteId(i) = ballIconSpritesIds[i]; gTasks[taskId].tIsBattleStart = isBattleStart; PlaySE12WithPanning(SE_BALL_TRAY_ENTER, 0); return taskId; } void Task_HidePartyStatusSummary(u8 taskId) { u8 ballIconSpriteIds[PARTY_SIZE]; bool8 isBattleStart; u8 summaryBarSpriteId; u8 battlerId; s32 i; isBattleStart = gTasks[taskId].tIsBattleStart; summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; battlerId = gTasks[taskId].tBattler; for (i = 0; i < PARTY_SIZE; i++) ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); gTasks[taskId].tBlendWeight = 16; for (i = 0; i < PARTY_SIZE; i++) gSprites[ballIconSpriteIds[i]].oam.objMode = ST_OAM_OBJ_BLEND; gSprites[summaryBarSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; if (isBattleStart) { for (i = 0; i < PARTY_SIZE; i++) { if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { gSprites[ballIconSpriteIds[5 - i]].sTimer = 7 * i; gSprites[ballIconSpriteIds[5 - i]].sSpeed = 0; gSprites[ballIconSpriteIds[5 - i]].data[4] = 0; gSprites[ballIconSpriteIds[5 - i]].callback = SpriteCB_PartySummaryBall_Exit; } else { gSprites[ballIconSpriteIds[i]].sTimer = 7 * i; gSprites[ballIconSpriteIds[i]].sSpeed = 0; gSprites[ballIconSpriteIds[i]].data[4] = 0; gSprites[ballIconSpriteIds[i]].callback = SpriteCB_PartySummaryBall_Exit; } } gSprites[summaryBarSpriteId].sEnterSpeed /= 2; gSprites[summaryBarSpriteId].sExitSpeed = 0; gSprites[summaryBarSpriteId].callback = SpriteCB_PartySummaryBar_Exit; SetSubspriteTables(&gSprites[summaryBarSpriteId], sStatusSummaryBar_SubspriteTable_Exit); gTasks[taskId].func = Task_HidePartyStatusSummary_BattleStart_1; } else gTasks[taskId].func = Task_HidePartyStatusSummary_DuringBattle; } static void Task_HidePartyStatusSummary_BattleStart_1(u8 taskId) { if ((gTasks[taskId].tTimer++ % 2) == 0) { if (--gTasks[taskId].tBlendWeight < 0) return; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlendWeight, 16 - gTasks[taskId].tBlendWeight)); } if (gTasks[taskId].tBlendWeight == 0) gTasks[taskId].func = Task_HidePartyStatusSummary_BattleStart_2; } static void Task_HidePartyStatusSummary_BattleStart_2(u8 taskId) { u8 ballIconSpriteIds[PARTY_SIZE]; s32 i; u8 battlerId = gTasks[taskId].tBattler; if (--gTasks[taskId].tBlendWeight == -1) { u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; for (i = 0; i < PARTY_SIZE; i++) ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]); DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]); for (i = 1; i < PARTY_SIZE; i++) DestroySprite(&gSprites[ballIconSpriteIds[i]]); } else if (gTasks[taskId].tBlendWeight == -3) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyTask(taskId); } } static void Task_HidePartyStatusSummary_DuringBattle(u8 taskId) { u8 ballIconSpriteIds[PARTY_SIZE]; s32 i; u8 battlerId = gTasks[taskId].tBattler; if (--gTasks[taskId].tBlendWeight >= 0) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlendWeight, 16 - gTasks[taskId].tBlendWeight)); else if (gTasks[taskId].tBlendWeight == -1) { u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; for (i = 0; i < PARTY_SIZE; i++) ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]); DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]); for (i = 1; i < PARTY_SIZE; i++) DestroySprite(&gSprites[ballIconSpriteIds[i]]); } else if (gTasks[taskId].tBlendWeight == -3) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyTask(taskId); } } #undef tBattler #undef tSummaryBarSpriteId #undef tBallIconSpriteId #undef tIsBattleStart #undef tBlendWeight static void SpriteCB_PartySummaryBar(struct Sprite *sprite) { if (sprite->x2 != 0) sprite->x2 += sprite->sEnterSpeed; } static void SpriteCB_PartySummaryBar_Exit(struct Sprite *sprite) { sprite->sExitSpeed += 32; if (sprite->sEnterSpeed > 0) sprite->x2 += sprite->sExitSpeed >> 4; else sprite->x2 -= sprite->sExitSpeed >> 4; sprite->sExitSpeed &= 0xF; } static void SpriteCB_PartySummaryBall_OnBattleStart(struct Sprite *sprite) { bool8 isOpponent; u16 speed; if (sprite->sTimer > 0) { sprite->sTimer--; return; } isOpponent = sprite->sIsOpponent; speed = sprite->sSpeed; speed += 56; sprite->sSpeed = speed & 0xFFF0; if (isOpponent != FALSE) { sprite->x2 += speed / 16; if (sprite->x2 > 0) sprite->x2 = 0; } else { sprite->x2 -= speed / 16; if (sprite->x2 < 0) sprite->x2 = 0; } if (sprite->x2 == 0) { s8 pan = isOpponent ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET; if (sprite->sIsEmptyBall != FALSE) PlaySE2WithPanning(SE_BALL_TRAY_EXIT, pan); else PlaySE1WithPanning(SE_BALL_TRAY_BALL, pan); sprite->callback = SpriteCallbackDummy; } } static void SpriteCB_PartySummaryBall_Exit(struct Sprite *sprite) { bool8 isOpponent; u16 speed; if (sprite->sTimer > 0) { sprite->sTimer--; return; } isOpponent = sprite->sIsOpponent; speed = sprite->sSpeed; speed += 56; sprite->sSpeed = speed & 0xFFF0; if (isOpponent != FALSE) sprite->x2 += speed / 16; else sprite->x2 -= speed / 16; if (sprite->x2 + sprite->x > DISPLAY_WIDTH + 8 || sprite->x2 + sprite->x < -8) { sprite->invisible = TRUE; sprite->callback = SpriteCallbackDummy; } } static void SpriteCB_PartySummaryBall_OnSwitchout(struct Sprite *sprite) { u8 summaryBarSpriteId = sprite->sSummaryBarSpriteId; sprite->x2 = gSprites[summaryBarSpriteId].x2; sprite->y2 = gSprites[summaryBarSpriteId].y2; } #undef sSummaryBarSpriteId #undef sTimer #undef sIsOpponent #undef sSpeed #undef sIsEmptyBall #undef sEnterSpeed #undef sExitSpeed static const u8 sText_HealthboxNickname[] = _("{HIGHLIGHT 02}"); void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) { u8 nickname[POKEMON_NAME_LENGTH + 1]; u8 *ptr; u32 windowId, spriteTileNum; u8 *windowTileData; u16 species; u8 gender; ptr = StringCopy(gDisplayedStringBattle, sText_HealthboxNickname); GetMonData(mon, MON_DATA_NICKNAME, nickname); StringGet_Nickname(nickname); ptr = StringCopy(ptr, nickname); *ptr++ = EXT_CTRL_CODE_BEGIN; *ptr++ = EXT_CTRL_CODE_COLOR; gender = GetMonGender(mon); species = GetMonData(mon, MON_DATA_SPECIES); if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && StringCompare(nickname, gSpeciesNames[species]) == 0) gender = 100; if (CheckBattleTypeGhost(mon, gSprites[healthboxSpriteId].sBattlerId)) gender = 100; // AddTextPrinterAndCreateWindowOnHealthbox's arguments are the same in all 3 cases. // It's possible they may have been different in early development phases. switch (gender) { default: *ptr++ = TEXT_DYNAMIC_COLOR_2; *ptr++ = EOS; windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, &windowId); break; case MON_MALE: *ptr++ = TEXT_DYNAMIC_COLOR_2; *ptr++ = CHAR_MALE; *ptr++ = EOS; windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, &windowId); break; case MON_FEMALE: *ptr++ = TEXT_DYNAMIC_COLOR_1; *ptr++ = CHAR_FEMALE; *ptr++ = EOS; windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, &windowId); break; } spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER) { TextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x40 + spriteTileNum), windowTileData, 6); ptr = (void *)(OBJ_VRAM0); if (!IsDoubleBattle()) ptr += spriteTileNum + 0x800; else ptr += spriteTileNum + 0x400; TextIntoHealthboxObject(ptr, windowTileData + 0xC0, 1); } else TextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x20 + spriteTileNum), windowTileData, 7); RemoveWindowOnHealthbox(windowId); } void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) { u8 battlerId, healthBarSpriteId; if (gBattleTypeFlags & (BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) return; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) return; battlerId = gSprites[healthboxSpriteId].sBattlerId; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) return; if (CheckBattleTypeGhost(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId)) return; if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT)) { if(gSaveBlock1Ptr->keyFlags.nuzlocke == 0) { return; } else { if(FlagGet(FLAG_SYS_POKEDEX_GET)) //don't print indicator before has Pokedex { if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)) && NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == FALSE) { //not dupe && first encounter healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId; if (noStatus) CpuCopy32(gNuzlockeFirstEncounterIndicator, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32); else CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32); return; } } return; } } healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId; if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(FlagGet(FLAG_SYS_POKEDEX_GET)) //don't print indicator before has Pokedex { if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)) && NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == FALSE) { //not dupe && first encounter if (noStatus) CpuCopy32(gNuzlockeFirstEncounterIndicator, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32); else CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32); return; } } } if (noStatus) CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_BALL_CAUGHT), (void *)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); else CpuFill32(0, (void *)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); } enum { PAL_STATUS_PSN, PAL_STATUS_PAR, PAL_STATUS_SLP, PAL_STATUS_FRZ, PAL_STATUS_BRN }; static const u16 sStatusIconColors[] = { [PAL_STATUS_PSN] = RGB(24, 12, 24), [PAL_STATUS_PAR] = RGB(23, 23, 3), [PAL_STATUS_SLP] = RGB(20, 20, 17), [PAL_STATUS_FRZ] = RGB(17, 22, 28), [PAL_STATUS_BRN] = RGB(28, 14, 10) }; static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) { s32 i; u8 battlerId, healthBarSpriteId; u32 status, pltAdder; const u8 *statusGfxPtr; s16 tileNumAdder; u8 statusPalId; battlerId = gSprites[healthboxSpriteId].sBattlerId; healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS); if (!IsDoubleBattle()) tileNumAdder = 0x1A; else tileNumAdder = 0x12; } else { status = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS); tileNumAdder = 0x11; } if (status & STATUS1_SLEEP) { statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_SLP_BATTLER0, battlerId)); statusPalId = PAL_STATUS_SLP; } else if (status & STATUS1_PSN_ANY) { statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_PSN_BATTLER0, battlerId)); statusPalId = PAL_STATUS_PSN; } else if (status & STATUS1_BURN) { statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_BRN_BATTLER0, battlerId)); statusPalId = PAL_STATUS_BRN; } else if (status & STATUS1_FREEZE) { statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_FRZ_BATTLER0, battlerId)); statusPalId = PAL_STATUS_FRZ; } else if (status & STATUS1_PARALYSIS) { statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_PAR_BATTLER0, battlerId)); statusPalId = PAL_STATUS_PAR; } else { statusGfxPtr = GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_STATUS_NONE); for (i = 0; i < 3; i++) CpuCopy32(statusGfxPtr, (void *)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_HP_BAR_HP_TEXT), (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 2 * TILE_SIZE_4BPP); TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE); return; } pltAdder = PLTT_ID(gSprites[healthboxSpriteId].oam.paletteNum); pltAdder += battlerId + 12; FillPalette(sStatusIconColors[statusPalId], pltAdder + OBJ_PLTT_OFFSET, PLTT_SIZEOF(1)); CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_OFFSET + pltAdder], (u16 *)OBJ_PLTT + pltAdder, PLTT_SIZEOF(1)); CpuCopy32(statusGfxPtr, (void *)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * TILE_SIZE_4BPP), 3 * TILE_SIZE_4BPP); if (IsDoubleBattle() == TRUE || GetBattlerSide(battlerId) == B_SIDE_OPPONENT) { if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) { CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_TRANSPARENT), (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_HP_BAR_LEFT_BORDER), (void *)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 1) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); } } TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE); } static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId) { u8 ret = statusElementId; switch (statusElementId) { case B_INTERFACE_GFX_STATUS_PSN_BATTLER0: if (battlerId == 0) ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER0; else if (battlerId == 1) ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER1; else if (battlerId == 2) ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER2; else ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER3; break; case B_INTERFACE_GFX_STATUS_PAR_BATTLER0: if (battlerId == 0) ret = B_INTERFACE_GFX_STATUS_PAR_BATTLER0; else if (battlerId == 1) ret = B_INTERFACE_GFX_STATUS_PAR_BATTLER1; else if (battlerId == 2) ret = B_INTERFACE_GFX_STATUS_PAR_BATTLER2; else ret = B_INTERFACE_GFX_STATUS_PAR_BATTLER3; break; case B_INTERFACE_GFX_STATUS_SLP_BATTLER0: if (battlerId == 0) ret = B_INTERFACE_GFX_STATUS_SLP_BATTLER0; else if (battlerId == 1) ret = B_INTERFACE_GFX_STATUS_SLP_BATTLER1; else if (battlerId == 2) ret = B_INTERFACE_GFX_STATUS_SLP_BATTLER2; else ret = B_INTERFACE_GFX_STATUS_SLP_BATTLER3; break; case B_INTERFACE_GFX_STATUS_FRZ_BATTLER0: if (battlerId == 0) ret = B_INTERFACE_GFX_STATUS_FRZ_BATTLER0; else if (battlerId == 1) ret = B_INTERFACE_GFX_STATUS_FRZ_BATTLER1; else if (battlerId == 2) ret = B_INTERFACE_GFX_STATUS_FRZ_BATTLER2; else ret = B_INTERFACE_GFX_STATUS_FRZ_BATTLER3; break; case B_INTERFACE_GFX_STATUS_BRN_BATTLER0: if (battlerId == 0) ret = B_INTERFACE_GFX_STATUS_BRN_BATTLER0; else if (battlerId == 1) ret = B_INTERFACE_GFX_STATUS_BRN_BATTLER1; else if (battlerId == 2) ret = B_INTERFACE_GFX_STATUS_BRN_BATTLER2; else ret = B_INTERFACE_GFX_STATUS_BRN_BATTLER3; break; } return ret; } static void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId) { u32 windowId, spriteTileNum; u8 *windowTileData; windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gText_SafariBalls, 0, 3, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; TextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x40) + spriteTileNum, windowTileData, 6); TextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x800) + spriteTileNum, windowTileData + 0xC0, 2); RemoveWindowOnHealthbox(windowId); } static void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId) { u8 text[16]; u8 *txtPtr; u32 windowId, spriteTileNum; u8 *windowTileData; txtPtr = StringCopy(text, gText_HighlightRed_Left); ConvertIntToDecimalStringN(txtPtr, gNumSafariBalls, STR_CONV_MODE_LEFT_ALIGN, 2); windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 47 - GetStringWidth(FONT_SMALL, text, 0), 3, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; SafariTextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x2C0) + spriteTileNum, windowTileData, 2); SafariTextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0xA00) + spriteTileNum, windowTileData + 0x40, 4); RemoveWindowOnHealthbox(windowId); } void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId) { s32 maxHp, currHp; u8 battlerId = gSprites[healthboxSpriteId].sBattlerId; if (elementId == HEALTHBOX_ALL && !IsDoubleBattle()) GetBattlerSide(battlerId); // Pointless function call. if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER) { u8 isDoubles; if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL) UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL)); if (elementId == HEALTHBOX_CURRENT_HP || elementId == HEALTHBOX_ALL) UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_HP), HP_CURRENT); if (elementId == HEALTHBOX_MAX_HP || elementId == HEALTHBOX_ALL) UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_MAX_HP), HP_MAX); if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL) { LoadBattleBarGfx(0); maxHp = GetMonData(mon, MON_DATA_MAX_HP); currHp = GetMonData(mon, MON_DATA_HP); SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0); MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0); } isDoubles = IsDoubleBattle(); if (!isDoubles && (elementId == HEALTHBOX_EXP_BAR || elementId == HEALTHBOX_ALL)) { u16 species; u32 exp, currLevelExp; s32 currExpBarValue, maxExpBarValue; u8 level; LoadBattleBarGfx(3); species = GetMonData(mon, MON_DATA_SPECIES); level = GetMonData(mon, MON_DATA_LEVEL); exp = GetMonData(mon, MON_DATA_EXP); currLevelExp = gExperienceTables[gSpeciesInfo[species].growthRate][level]; currExpBarValue = exp - currLevelExp; maxExpBarValue = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLevelExp; SetBattleBarStruct(battlerId, healthboxSpriteId, maxExpBarValue, currExpBarValue, isDoubles); MoveBattleBar(battlerId, healthboxSpriteId, EXP_BAR, 0); } if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) UpdateNickInHealthbox(healthboxSpriteId, mon); if (elementId == HEALTHBOX_STATUS_ICON || elementId == HEALTHBOX_ALL) UpdateStatusIconInHealthbox(healthboxSpriteId); if (elementId == HEALTHBOX_SAFARI_ALL_TEXT) UpdateSafariBallsTextOnHealthbox(healthboxSpriteId); if (elementId == HEALTHBOX_SAFARI_ALL_TEXT || elementId == HEALTHBOX_SAFARI_BALLS_TEXT) UpdateLeftNoOfBallsTextOnHealthbox(healthboxSpriteId); } else { if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL) UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL)); if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL) { LoadBattleBarGfx(0); maxHp = GetMonData(mon, MON_DATA_MAX_HP); currHp = GetMonData(mon, MON_DATA_HP); SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0); MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0); } if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) UpdateNickInHealthbox(healthboxSpriteId, mon); if (elementId == HEALTHBOX_STATUS_ICON || elementId == HEALTHBOX_ALL) UpdateStatusIconInHealthbox(healthboxSpriteId); } } #define B_HEALTHBAR_NUM_PIXELS 48 #define B_HEALTHBAR_NUM_TILES (B_HEALTHBAR_NUM_PIXELS / 8) #define B_EXPBAR_NUM_PIXELS 64 #define B_EXPBAR_NUM_TILES (B_EXPBAR_NUM_PIXELS / 8) s32 MoveBattleBar(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 unused) { s32 currentBarValue; if (whichBar == HEALTH_BAR) { if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 0) //standard { currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, B_HEALTHBAR_NUM_TILES, 1); } else if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 1) //fast { currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, B_HEALTHBAR_NUM_TILES, 1 + (u16) (gBattleMons[battlerId].maxHP / 80)); } else if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 2) //faster { currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, B_HEALTHBAR_NUM_TILES, 1 + (u16) (gBattleMons[battlerId].maxHP / 30)); } else // instant healthbar drop { currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, B_HEALTHBAR_NUM_TILES, 714); //max HP of Blissey, makes the healthbar drop in one tick } } else // exp bar { if(gSaveBlock2Ptr->optionsExpBarAnimSpeed) // instant expbar movement { currentBarValue = CalcNewExpBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, B_EXPBAR_NUM_TILES, 65535); //largest possible value to move in one tick } else { u16 increment = GetReceivedValueInPixels(gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, gBattleSpritesDataPtr->battleBars[battlerId].maxValue, B_EXPBAR_NUM_TILES); if (increment == 0) increment = 1; increment = abs(gBattleSpritesDataPtr->battleBars[battlerId].receivedValue / increment); currentBarValue = CalcNewExpBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, B_EXPBAR_NUM_TILES, increment); } } if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)) MoveBattleBarGraphically(battlerId, whichBar); if (currentBarValue == -1) gBattleSpritesDataPtr->battleBars[battlerId].currValue = 0; return currentBarValue; } static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar) { u8 filledPixels[B_HEALTHBAR_NUM_TILES > B_EXPBAR_NUM_TILES ? B_HEALTHBAR_NUM_TILES : B_EXPBAR_NUM_TILES]; u8 totalFilledPixels, level; u8 barElementId; u32 i; switch (whichBar) { case HEALTH_BAR: totalFilledPixels = CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, filledPixels, B_HEALTHBAR_NUM_TILES); if (totalFilledPixels > (B_HEALTHBAR_NUM_PIXELS * 50 / 100)) // more than 50 % hp barElementId = B_INTERFACE_GFX_HP_BAR_GREEN; else if (totalFilledPixels > (B_HEALTHBAR_NUM_PIXELS * 20 / 100)) // more than 20% hp barElementId = B_INTERFACE_GFX_HP_BAR_YELLOW; else barElementId = B_INTERFACE_GFX_HP_BAR_RED; // 20 % or less for (i = 0; i < B_HEALTHBAR_NUM_TILES; i++) { u8 healthbarSpriteId = gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].sHealthBarSpriteId; if (i < 2) // first 2 tiles are on left healthbar sprite CpuCopy32(GetBattleInterfaceGfxPtr(barElementId) + filledPixels[i] * TILE_SIZE_4BPP, (void *)(OBJ_VRAM0 + (gSprites[healthbarSpriteId].oam.tileNum + 2 + i) * TILE_SIZE_4BPP), // + 2 here is due to B_INTERFACE_GFX_HP_BAR_HP_TEXT 1 * TILE_SIZE_4BPP); else // remaining 4 tiles are on right healthbar sprite CpuCopy32(GetBattleInterfaceGfxPtr(barElementId) + filledPixels[i] * TILE_SIZE_4BPP, (void *)(OBJ_VRAM0 + 64 + (i + gSprites[healthbarSpriteId].oam.tileNum) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); } break; case EXP_BAR: CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, &gBattleSpritesDataPtr->battleBars[battlerId].currValue, filledPixels, B_EXPBAR_NUM_TILES); level = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_LEVEL); if (level == MAX_LEVEL) { for (i = 0; i < B_EXPBAR_NUM_TILES; i++) filledPixels[i] = 0; } for (i = 0; i < B_EXPBAR_NUM_TILES; i++) { if (i < 4) // first 4 tiles are on left healthbox sprite CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_EXP_BAR) + filledPixels[i] * TILE_SIZE_4BPP, (void *)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum + 36 + i) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); else // remaining 4 tiles are on right healthbox sprite CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_EXP_BAR) + filledPixels[i] * TILE_SIZE_4BPP, (void *)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP); } break; } } static s32 CalcNewBarValue(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 totalPixels, u16 increment) { s32 ret, newValue; totalPixels *= 8; if (*currValue == -32768) // first function call { if (maxValue < totalPixels) *currValue = Q_24_8(oldValue); else *currValue = oldValue; } newValue = oldValue - receivedValue; if (newValue < 0) newValue = 0; else if (newValue > maxValue) newValue = maxValue; if (maxValue < totalPixels) { if (newValue == Q_24_8_TO_INT(*currValue) && (*currValue & 0xFF) == 0) return -1; } else { if (newValue == *currValue) // we're done, the bar's value has been updated return -1; } if (maxValue < totalPixels) // handle cases of max var having less pixels than the whole bar { s32 incrementInQ = Q_24_8(maxValue) / totalPixels; if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 3) //instant { if(*currValue - receivedValue <= 0) incrementInQ = *currValue; else incrementInQ = *currValue - receivedValue; } if (receivedValue < 0) // fill bar right { *currValue += incrementInQ; ret = Q_24_8_TO_INT(*currValue); if (ret >= newValue) { *currValue = Q_24_8(newValue); ret = newValue; } } else // move bar left { *currValue -= incrementInQ; ret = Q_24_8_TO_INT(*currValue); // try round up if ((*currValue & 0xFF) > 0) ret++; if (ret <= newValue) { *currValue = Q_24_8(newValue); ret = newValue; } } } else { if (receivedValue < 0) // fill bar right { *currValue += increment; if (*currValue > newValue) *currValue = newValue; ret = *currValue; } else // move bar left { *currValue -= increment; if (*currValue < newValue) *currValue = newValue; ret = *currValue; } } return ret; } static s32 CalcNewExpBarValue(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 scale, u16 toAdd) { s32 ret, newValue; scale *= 8; if (*currValue == -32768) // first function call { if (maxValue < scale) *currValue = Q_24_8(oldValue); else *currValue = oldValue; } newValue = oldValue - receivedValue; if (newValue < 0) newValue = 0; else if (newValue > maxValue) newValue = maxValue; if (maxValue < scale) { if (newValue == Q_24_8_TO_INT(*currValue) && (*currValue & 0xFF) == 0) return -1; } else { if (newValue == *currValue) // we're done, the bar's value has been updated return -1; } if (maxValue < scale) // handle cases of max var having less pixels than the whole bar { s32 toAdd_ = Q_24_8(maxValue) / scale; if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 3) //instant { if(*currValue - receivedValue <= 0) toAdd_ = *currValue; else toAdd_ = *currValue - receivedValue; } if (receivedValue < 0) // fill bar right { *currValue += toAdd_; ret = Q_24_8_TO_INT(*currValue); if (ret >= newValue) { *currValue = Q_24_8(newValue); ret = newValue; } } else // move bar left { *currValue -= toAdd_; ret = Q_24_8_TO_INT(*currValue); // try round up if ((*currValue & 0xFF) > 0) ret++; if (ret <= newValue) { *currValue = Q_24_8(newValue); ret = newValue; } } } else { if (receivedValue < 0) // fill bar right { *currValue += toAdd; if (*currValue > newValue) *currValue = newValue; ret = *currValue; } else // move bar left { *currValue -= toAdd; if (*currValue < newValue) *currValue = newValue; ret = *currValue; } } return ret; } static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *filledPixels, u8 numTiles) { u8 numPixelsToFill, totalFilledPixels, totalPixels; u32 i; s32 newValue = oldValue - receivedValue; if (newValue < 0) newValue = 0; else if (newValue > maxValue) newValue = maxValue; totalPixels = numTiles * 8; for (i = 0; i < numTiles; i++) filledPixels[i] = 0; if (maxValue < totalPixels) numPixelsToFill = Q_24_8_TO_INT(*currValue * totalPixels / maxValue); else numPixelsToFill = *currValue * totalPixels / maxValue; totalFilledPixels = numPixelsToFill; if (numPixelsToFill == 0 && newValue > 0) { filledPixels[0] = 1; totalFilledPixels = 1; } else { for (i = 0; i < numTiles; i++) { if (numPixelsToFill >= 8) // too many to fill into a single tile filledPixels[i] = 8; else { filledPixels[i] = numPixelsToFill; break; } numPixelsToFill -= 8; } } return totalFilledPixels; } // Unused // These functions seem as if they were made for testing the health bar. static s16 UpdateAndDrawHealthbarOntoScreen(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y) { s16 hpVal; hpVal = CalcNewBarValue(barInfo->maxValue, barInfo->oldValue, barInfo->receivedValue, currValue, B_HEALTHBAR_NUM_TILES, 1); DrawHealthbarOntoScreen(barInfo, currValue, bg, x, y); return hpVal; } // Unused static s16 CalcNewHealthbarValue(struct TestingBar *barInfo, s32 *currValue) { return CalcNewBarValue(barInfo->maxValue, barInfo->oldValue, barInfo->receivedValue, currValue, B_HEALTHBAR_NUM_TILES, 1); } // Unused static void DoDrawHealthbarOntoScreen(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y) { DrawHealthbarOntoScreen(barInfo, currValue, bg, x, y); } // Unused static void DrawHealthbarOntoScreen(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y) { u8 filledPixels[B_HEALTHBAR_NUM_TILES]; u16 tiles[B_HEALTHBAR_NUM_TILES]; u32 i; CalcBarFilledPixels(barInfo->maxValue, barInfo->oldValue, barInfo->receivedValue, currValue, filledPixels, B_HEALTHBAR_NUM_TILES); for (i = 0; i < ARRAY_COUNT(tiles); i++) tiles[i] = (barInfo->pal << 12) | (barInfo->tileOffset + filledPixels[i]); CopyToBgTilemapBufferRect_ChangePalette(bg, tiles, x, y, 6, 1, 17); } static u8 GetReceivedValueInPixels(s32 oldValue, s32 receivedValue, s32 maxValue, u8 totalPixels) { s32 newVal, result; s8 oldToMax, newToMax; totalPixels *= 8; newVal = oldValue - receivedValue; if (newVal < 0) newVal = 0; else if (newVal > maxValue) newVal = maxValue; oldToMax = oldValue * totalPixels / maxValue; newToMax = newVal * totalPixels / maxValue; result = oldToMax - newToMax; return abs(result); } u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale) { u8 result = hp * scale / maxhp; if (result == 0 && hp > 0) return 1; return result; } u8 GetHPBarLevel(s16 hp, s16 maxhp) { u8 result; if (hp == maxhp) result = HP_BAR_FULL; else { u8 fraction = GetScaledHPFraction(hp, maxhp, B_HEALTHBAR_NUM_PIXELS); if (fraction > (B_HEALTHBAR_NUM_PIXELS * 50 / 100)) result = HP_BAR_GREEN; else if (fraction > (B_HEALTHBAR_NUM_PIXELS * 20 / 100)) result = HP_BAR_YELLOW; else if (fraction > 0) result = HP_BAR_RED; else result = HP_BAR_EMPTY; } return result; } static const struct WindowTemplate sHealthboxWindowTemplate = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 8, .height = 2, .paletteNum = 0, .baseBlock = 0 }; static u8 *AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 *windowId) { u16 winId; u8 color[3]; struct WindowTemplate winTemplate = sHealthboxWindowTemplate; winId = AddWindow(&winTemplate); FillWindowPixelBuffer(winId, PIXEL_FILL(2)); color[0] = 2; color[1] = 1; color[2] = 3; AddTextPrinterParameterized4(winId, FONT_SMALL, x, y, 0, 0, color, -1, str); *windowId = winId; return (u8 *)(GetWindowAttribute(winId, WINDOW_TILE_DATA)); } static void RemoveWindowOnHealthbox(u32 windowId) { RemoveWindow(windowId); } static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 windowWidth) { CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP); // + 256 as that prevents the top 4 blank rows of sHealthboxWindowTemplate from being copied if (windowWidth > 0) { do { CpuCopy32(windowTileData + 20, dest + 20, 12); dest += 32, windowTileData += 32; windowWidth--; } while (windowWidth != 0); } } static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth) { CpuCopy32(windowTileData, dest, windowWidth * TILE_SIZE_4BPP); CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP); } ================================================ FILE: src/battle_intro.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "battle_setup.h" #include "scanline_effect.h" #include "task.h" #include "trig.h" static EWRAM_DATA u16 sBgCnt = 0; extern const u8 gBattleAnimRegOffsBgCnt[]; extern const u8 gBattleIntroRegOffsBgCnt[]; static void BattleIntroSlide1(u8 taskId); static void BattleIntroSlide2(u8 taskId); static void BattleIntroSlide3(u8 taskId); static void BattleIntroSlideLink(u8 taskId); static const TaskFunc sBattleIntroSlideFuncs[] = { BattleIntroSlide1, // BATTLE_TERRAIN_GRASS BattleIntroSlide1, // BATTLE_TERRAIN_LONG_GRASS BattleIntroSlide2, // BATTLE_TERRAIN_SAND BattleIntroSlide2, // BATTLE_TERRAIN_UNDERWATER BattleIntroSlide2, // BATTLE_TERRAIN_WATER BattleIntroSlide1, // BATTLE_TERRAIN_POND BattleIntroSlide1, // BATTLE_TERRAIN_MOUNTAIN BattleIntroSlide1, // BATTLE_TERRAIN_CAVE BattleIntroSlide3, // BATTLE_TERRAIN_BUILDING BattleIntroSlide3, // BATTLE_TERRAIN_PLAIN }; void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value) { if (bgId < 4) { sBgCnt = GetGpuReg(gBattleAnimRegOffsBgCnt[bgId]); switch (attributeId) { case BG_ANIM_SCREEN_SIZE: ((struct BgCnt *)&sBgCnt)->screenSize = value; break; case BG_ANIM_AREA_OVERFLOW_MODE: ((struct BgCnt *)&sBgCnt)->areaOverflowMode = value; break; case BG_ANIM_MOSAIC: ((struct BgCnt *)&sBgCnt)->mosaic = value; break; case BG_ANIM_CHAR_BASE_BLOCK: ((struct BgCnt *)&sBgCnt)->charBaseBlock = value; break; case BG_ANIM_PRIORITY: ((struct BgCnt *)&sBgCnt)->priority = value; break; case BG_ANIM_PALETTES_MODE: ((struct BgCnt *)&sBgCnt)->palettes = value; break; case BG_ANIM_SCREEN_BASE_BLOCK: ((struct BgCnt *)&sBgCnt)->screenBaseBlock = value; break; } SetGpuReg(gBattleAnimRegOffsBgCnt[bgId], sBgCnt); } } s32 GetAnimBgAttribute(u8 bgId, u8 attributeId) { u16 bgCnt; if (bgId < 4) { bgCnt = GetGpuReg(gBattleIntroRegOffsBgCnt[bgId]); switch (attributeId) { case BG_ANIM_SCREEN_SIZE: return ((struct BgCnt *)&bgCnt)->screenSize; case BG_ANIM_AREA_OVERFLOW_MODE: return ((struct BgCnt *)&bgCnt)->areaOverflowMode; case BG_ANIM_MOSAIC: return ((struct BgCnt *)&bgCnt)->mosaic; case BG_ANIM_CHAR_BASE_BLOCK: return ((struct BgCnt *)&bgCnt)->charBaseBlock; case BG_ANIM_PRIORITY: return ((struct BgCnt *)&bgCnt)->priority; case BG_ANIM_PALETTES_MODE: return ((struct BgCnt *)&bgCnt)->palettes; case BG_ANIM_SCREEN_BASE_BLOCK: return ((struct BgCnt *)&bgCnt)->screenBaseBlock; } } return 0; } void HandleIntroSlide(u8 terrain) { u8 taskId; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { taskId = CreateTask(BattleIntroSlideLink, 0); } else if ((gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) && gGameVersion != VERSION_RUBY) { terrain = BATTLE_TERRAIN_UNDERWATER; taskId = CreateTask(BattleIntroSlide2, 0); } else { taskId = CreateTask(sBattleIntroSlideFuncs[terrain], 0); } gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = terrain; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 0; gTasks[taskId].data[4] = 0; gTasks[taskId].data[5] = 0; gTasks[taskId].data[6] = 0; } void BattleIntroSlideEnd(u8 taskId) { DestroyTask(taskId); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); } static void BattleIntroSlide1(u8 taskId) { s32 i; gBattle_BG1_X += 6; switch (gTasks[taskId].data[0]) { case 0: if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTasks[taskId].data[2] = 16; ++gTasks[taskId].data[0]; } else { gTasks[taskId].data[2] = 1; ++gTasks[taskId].data[0]; } break; case 1: if (--gTasks[taskId].data[2] == 0) { ++gTasks[taskId].data[0]; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); } break; case 2: gBattle_WIN0V -= 0xFF; if ((gBattle_WIN0V & 0xFF00) == 0x3000) { ++gTasks[taskId].data[0]; gTasks[taskId].data[2] = 240; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 32; gIntroSlideFlags &= ~1; } break; case 3: if (gTasks[taskId].data[3]) { --gTasks[taskId].data[3]; } else { if (gTasks[taskId].data[1] == 1) { if (gBattle_BG1_Y != 0xFFB0) gBattle_BG1_Y -= 2; } else if (gBattle_BG1_Y != 0xFFC8) { gBattle_BG1_Y -= 1; } } if (gBattle_WIN0V & 0xFF00) gBattle_WIN0V -= 0x3FC; if (gTasks[taskId].data[2]) gTasks[taskId].data[2] -= 2; // Scanline settings have already been set in CB2_InitBattleInternal for (i = 0; i < 80; ++i) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2]; while (i < 160) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2]; if(gSaveBlock2Ptr->optionsBattleIntroAnim == 0) { if (!gTasks[taskId].data[2]) { gScanlineEffect.state = 3; ++gTasks[taskId].data[0]; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } } else { if (gTasks[taskId].data[3] == 0) //wait for black bars to be done splitting { gScanlineEffect.state = 3; ++gTasks[taskId].data[0]; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); //intro particles on this bg SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } } break; case 4: BattleIntroSlideEnd(taskId); break; } } static void BattleIntroSlide2(u8 taskId) { s32 i; switch (gTasks[taskId].data[1]) { case 2: case 4: gBattle_BG1_X += 8; break; case 3: gBattle_BG1_X += 6; break; } if (gTasks[taskId].data[1] == 4) { gBattle_BG1_Y = Cos2(gTasks[taskId].data[6]) / 512 - 8; if (gTasks[taskId].data[6] < 180) gTasks[taskId].data[6] += 4; else gTasks[taskId].data[6] += 6; if (gTasks[taskId].data[6] == 360) gTasks[taskId].data[6] = 0; } switch (gTasks[taskId].data[0]) { case 0: gTasks[taskId].data[4] = 16; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTasks[taskId].data[2] = 16; ++gTasks[taskId].data[0]; } else { gTasks[taskId].data[2] = 1; ++gTasks[taskId].data[0]; } break; case 1: if (--gTasks[taskId].data[2] == 0) { ++gTasks[taskId].data[0]; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); } break; case 2: gBattle_WIN0V -= 0xFF; if ((gBattle_WIN0V & 0xFF00) == 0x3000) { ++gTasks[taskId].data[0]; gTasks[taskId].data[2] = 240; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 32; gTasks[taskId].data[5] = 1; gIntroSlideFlags &= ~1; } break; case 3: if (gTasks[taskId].data[3]) { if (--gTasks[taskId].data[3] == 0) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(15, 0)); SetGpuReg(REG_OFFSET_BLDY, 0); } } else if ((gTasks[taskId].data[4] & 0x1F) && --gTasks[taskId].data[5] == 0) { gTasks[taskId].data[4] += 0xFF; gTasks[taskId].data[5] = 4; } if (gBattle_WIN0V & 0xFF00) gBattle_WIN0V -= 0x3FC; if (gTasks[taskId].data[2]) gTasks[taskId].data[2] -= 2; // Scanline settings have already been set in CB2_InitBattleInternal() for (i = 0; i < 80; ++i) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2]; while (i < 160) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2]; if(gSaveBlock2Ptr->optionsBattleIntroAnim == 0) { if (!gTasks[taskId].data[2]) { gScanlineEffect.state = 3; ++gTasks[taskId].data[0]; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } } else { if (gTasks[taskId].data[3] == 0) //wait for black bars to be done splitting { gScanlineEffect.state = 3; ++gTasks[taskId].data[0]; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); //intro particles on this bg SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } } break; case 4: BattleIntroSlideEnd(taskId); break; } if (gTasks[taskId].data[0] != 4) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0)); } static void BattleIntroSlide3(u8 taskId) { s32 i; gBattle_BG1_X += 8; switch (gTasks[taskId].data[0]) { case 0: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); SetGpuReg(REG_OFFSET_BLDY, 0); gTasks[taskId].data[4] = BLDALPHA_BLEND(8, 8); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTasks[taskId].data[2] = 16; ++gTasks[taskId].data[0]; } else { gTasks[taskId].data[2] = 1; ++gTasks[taskId].data[0]; } break; case 1: if (--gTasks[taskId].data[2] == 0) { ++gTasks[taskId].data[0]; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); } break; case 2: gBattle_WIN0V -= 0xFF; if ((gBattle_WIN0V & 0xFF00) == 0x3000) { ++gTasks[taskId].data[0]; gTasks[taskId].data[2] = 240; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 32; gTasks[taskId].data[5] = 1; gIntroSlideFlags &= ~1; } break; case 3: if (gTasks[taskId].data[3]) { --gTasks[taskId].data[3]; } else if ((gTasks[taskId].data[4] & 0xF) && --gTasks[taskId].data[5] == 0) { gTasks[taskId].data[4] += 0xFF; gTasks[taskId].data[5] = 6; } if (gBattle_WIN0V & 0xFF00) gBattle_WIN0V -= 0x3FC; if (gTasks[taskId].data[2]) gTasks[taskId].data[2] -= 2; // Scanline settings have already been set in CB2_InitBattleInternal() for (i = 0; i < 80; ++i) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2]; while (i < 160) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2]; if(gSaveBlock2Ptr->optionsBattleIntroAnim == 0) { if (!gTasks[taskId].data[2]) { gScanlineEffect.state = 3; ++gTasks[taskId].data[0]; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } } else { if (gTasks[taskId].data[3] == 0) //wait for black bars to be done splitting { gScanlineEffect.state = 3; ++gTasks[taskId].data[0]; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); //intro particles on this bg SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } } break; case 4: BattleIntroSlideEnd(taskId); break; } if (gTasks[taskId].data[0] != 4) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0)); } static void BattleIntroSlideLink(u8 taskId) { s32 i; if (gTasks[taskId].data[0] > 1 && !gTasks[taskId].data[4]) { u16 var0 = gBattle_BG1_X & 0x8000; if (var0 || gBattle_BG1_X < 80) { gBattle_BG1_X += 3; gBattle_BG2_X -= 3; } else { CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); CpuFill32(0, (void *)BG_SCREEN_ADDR(30), BG_SCREEN_SIZE); gTasks[taskId].data[4] = 1; } } switch (gTasks[taskId].data[0]) { case 0: gTasks[taskId].data[2] = 32; ++gTasks[taskId].data[0]; break; case 1: if (--gTasks[taskId].data[2] == 0) { ++gTasks[taskId].data[0]; gSprites[gBattleStruct->linkBattleVsSpriteId_V].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[gBattleStruct->linkBattleVsSpriteId_V].callback = SpriteCB_VsLetterInit; gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[gBattleStruct->linkBattleVsSpriteId_S].callback = SpriteCB_VsLetterInit; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2); } break; case 2: gBattle_WIN0V -= 0xFF; if ((gBattle_WIN0V & 0xFF00) == 0x3000) { ++gTasks[taskId].data[0]; gTasks[taskId].data[2] = 240; if(gSaveBlock2Ptr->optionsBattleIntroAnim) gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 32; gIntroSlideFlags &= ~1; } break; case 3: if (gBattle_WIN0V & 0xFF00) gBattle_WIN0V -= 0x3FC; if (gTasks[taskId].data[2]) gTasks[taskId].data[2] -= 2; // Scanline settings have already been set in CB2_InitBattleInternal() for (i = 0; i < 80; ++i) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2]; while (i < 160) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2]; if(gSaveBlock2Ptr->optionsBattleIntroAnim != 0) { CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); CpuFill32(0, (void *)BG_SCREEN_ADDR(30), BG_SCREEN_SIZE); gTasks[taskId].data[4] = 1; } if (!gTasks[taskId].data[2]) { gScanlineEffect.state = 3; ++gTasks[taskId].data[0]; SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } break; case 4: BattleIntroSlideEnd(taskId); break; } } void CopyBattlerSpriteToBg(s32 bgId, u8 x, u8 y, u8 battlerPosition, u8 palno, u8 *tilesDest, u16 *tilemapDest, u16 tilesOffset) { s32 i, j; u8 battler = GetBattlerAtPosition(battlerPosition); s32 offset = tilesOffset; CpuCopy16(gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * gBattleMonForms[battler], tilesDest, BG_SCREEN_SIZE); LoadBgTiles(bgId, tilesDest, 0x1000, tilesOffset); for (i = y; i < y + 8; ++i) for (j = x; j < x + 8; ++j) tilemapDest[i * 32 + j] = offset++ | (palno << 12); LoadBgTilemap(bgId, tilemapDest, BG_SCREEN_SIZE, 0); } // Unused static void DrawBattlerOnBgDMA(u8 arg0, u8 arg1, u8 battlerPosition, u8 arg3, u8 arg4, u16 arg5, u8 arg6, u8 arg7) { s32 i, j, offset; DmaCopy16(3, gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * arg3, (void *)BG_SCREEN_ADDR(0) + arg5, BG_SCREEN_SIZE); offset = (arg5 >> 5) - (arg7 << 9); for (i = arg1; i < arg1 + 8; ++i) for (j = arg0; j < arg0 + 8; ++j) *((u16 *)(BG_VRAM) + (i * 32) + (j + (arg6 << 10))) = offset++ | (arg4 << 12); } ================================================ FILE: src/battle_main.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "battle_ai_script_commands.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_main.h" #include "battle_message.h" #include "battle_scripts.h" #include "battle_setup.h" #include "berry.h" #include "data.h" #include "decompress.h" #include "event_data.h" #include "evolution_scene.h" #include "graphics.h" #include "help_system.h" #include "item.h" #include "link.h" #include "link_rfu.h" #include "load_save.h" #include "m4a.h" #include "party_menu.h" #include "pokeball.h" #include "pokedex.h" #include "quest_log.h" #include "random.h" #include "roamer.h" #include "safari_zone.h" #include "scanline_effect.h" #include "script.h" #include "task.h" #include "trig.h" #include "vs_seeker.h" #include "util.h" #include "constants/abilities.h" #include "constants/battle_move_effects.h" #include "constants/battle_setup.h" #include "constants/hold_effects.h" #include "constants/items.h" #include "constants/layouts.h" #include "constants/moves.h" #include "constants/pokemon.h" #include "constants/songs.h" #include "constants/trainers.h" static void SpriteCB_UnusedDebugSprite(struct Sprite *sprite); static void HandleAction_UseMove(void); static void HandleAction_Switch(void); static void HandleAction_UseItem(void); static void HandleAction_Run(void); static void HandleAction_WatchesCarefully(void); static void HandleAction_SafariZoneBallThrow(void); static void HandleAction_ThrowBait(void); static void HandleAction_ThrowRock(void); static void HandleAction_SafariZoneRun(void); static void HandleAction_OldManBallThrow(void); static void HandleAction_TryFinish(void); static void HandleAction_NothingIsFainted(void); static void HandleAction_ActionFinished(void); static void HandleEndTurn_ContinueBattle(void); static void HandleEndTurn_BattleWon(void); static void HandleEndTurn_BattleLost(void); static void HandleEndTurn_RanFromBattle(void); static void HandleEndTurn_MonFled(void); static void HandleEndTurn_FinishBattle(void); static void CB2_InitBattleInternal(void); static void CB2_PreInitMultiBattle(void); static void CB2_HandleStartMultiBattle(void); static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum); static void CB2_HandleStartBattle(void); static void TryCorrectShedinjaLanguage(struct Pokemon *mon); static void BattleMainCB1(void); static void CB2_QuitPokedudeBattle(void); static void SpriteCB_UnusedDebugSprite_Step(struct Sprite *sprite); static void CB2_EndLinkBattle(void); static void EndLinkBattleInSteps(void); static void SpriteCB_MoveWildMonToRight(struct Sprite *sprite); static void SpriteCB_WildMonShowHealthbox(struct Sprite *sprite); static void SpriteCB_Flicker(struct Sprite *sprite); static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite); static void SpriteCB_BlinkVisible(struct Sprite *sprite); static void oac_poke_ally_(struct Sprite *sprite); static void SpriteCB_Idle(struct Sprite *sprite); static void SpriteCB_BounceEffect(struct Sprite *sprite); static void SpriteCB_PlayerThrowUpdate(struct Sprite *sprite); static void BattleStartClearSetData(void); static void BattleIntroGetMonsData(void); static void TurnValuesCleanUp(bool8 var0); static void SpecialStatusesClear(void); static void BattleIntroPrepareBackgroundSlide(void); static void BattleIntroDrawTrainersOrMonsSprites(void); static void BattleIntroDrawPartySummaryScreens(void); static void BattleIntroPrintTrainerWantsToBattle(void); static void BattleIntroPrintWildMonAttacked(void); static void BattleIntroPrintOpponentSendsOut(void); static void BattleIntroPrintPlayerSendsOut(void); static void BattleIntroRecordMonsToDex(void); static void BattleIntroOpponentSendsOutMonAnimation(void); static void BattleIntroPlayerSendsOutMonAnimation(void); static void TryDoEventsBeforeFirstTurn(void); static void HandleTurnActionSelectionState(void); static void RunTurnActionsFunctions(void); static void SetActionsAndBattlersTurnOrder(void); static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); static void HandleEndTurn_FinishBattle(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void ReturnFromBattleToOverworld(void); static void TryEvolvePokemon(void); static void WaitForEvoSceneToFinish(void); EWRAM_DATA u16 gBattle_BG0_X = 0; EWRAM_DATA u16 gBattle_BG0_Y = 0; EWRAM_DATA u16 gBattle_BG1_X = 0; EWRAM_DATA u16 gBattle_BG1_Y = 0; EWRAM_DATA u16 gBattle_BG2_X = 0; EWRAM_DATA u16 gBattle_BG2_Y = 0; EWRAM_DATA u16 gBattle_BG3_X = 0; EWRAM_DATA u16 gBattle_BG3_Y = 0; EWRAM_DATA u16 gBattle_WIN0H = 0; EWRAM_DATA u16 gBattle_WIN0V = 0; EWRAM_DATA u16 gBattle_WIN1H = 0; EWRAM_DATA u16 gBattle_WIN1V = 0; EWRAM_DATA u8 gDisplayedStringBattle[300] = {0}; EWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0}; EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0}; EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0}; // The below array is never intentionally used. However, Brock's // defeat text (PewterCity_Gym_Text_BrockDefeat) is too long // for gDisplayedStringBattle and overflows into this array. If it // is removed (and none of the buffers above are increased in size) // it will instead overflow into useful data. static EWRAM_DATA u32 sFlickerArray[25] = {0}; EWRAM_DATA u32 gBattleTypeFlags = 0; EWRAM_DATA u8 gBattleTerrain = 0; EWRAM_DATA u32 gUnusedFirstBattleVar1 = 0; EWRAM_DATA struct MultiBattlePokemonTx gMultiPartnerParty[3] = {0}; EWRAM_DATA u8 *gBattleAnimBgTileBuffer = NULL; EWRAM_DATA u8 *gBattleAnimBgTilemapBuffer = NULL; static EWRAM_DATA u16 *sUnknownDebugSpriteDataBuffer = NULL; EWRAM_DATA u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200] = {0}; EWRAM_DATA u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200] = {0}; EWRAM_DATA u8 gActiveBattler = 0; EWRAM_DATA u32 gBattleControllerExecFlags = 0; EWRAM_DATA u8 gBattlersCount = 0; EWRAM_DATA u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gBattlerPositions[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gCurrentTurnActionNumber = 0; EWRAM_DATA u8 gCurrentActionFuncId = 0; EWRAM_DATA struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gCurrMovePos = 0; EWRAM_DATA u8 gChosenMovePos = 0; EWRAM_DATA u16 gCurrentMove = 0; EWRAM_DATA u16 gChosenMove = 0; EWRAM_DATA u16 gCalledMove = 0; EWRAM_DATA s32 gBattleMoveDamage = 0; EWRAM_DATA s32 gHpDealt = 0; EWRAM_DATA s32 gTakenDmg[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastUsedItem = 0; EWRAM_DATA u8 gLastUsedAbility = 0; EWRAM_DATA u8 gBattlerAttacker = 0; EWRAM_DATA u8 gBattlerTarget = 0; EWRAM_DATA u8 gBattlerFainted = 0; EWRAM_DATA u8 gEffectBattler = 0; EWRAM_DATA u8 gPotentialItemEffectBattler = 0; EWRAM_DATA u8 gAbsentBattlerFlags = 0; EWRAM_DATA u8 gCritMultiplier = 0; EWRAM_DATA u8 gMultiHitCounter = 0; EWRAM_DATA const u8 *gBattlescriptCurrInstr = NULL; EWRAM_DATA u32 gUnusedBattleMainVar = 0; EWRAM_DATA u8 gChosenActionByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT] = {NULL}; EWRAM_DATA u16 gLastPrintedMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastLandedMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastHitByType[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastResultingMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLockedMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gMoveResultFlags = 0; EWRAM_DATA u32 gHitMarker = 0; static EWRAM_DATA u8 sUnusedBattlersArray[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gUnusedFirstBattleVar2 = 0; EWRAM_DATA u16 gSideStatuses[2] = {0}; EWRAM_DATA struct SideTimer gSideTimers[2] = {0}; EWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gPauseCounterBattle = 0; EWRAM_DATA u16 gPaydayMoney = 0; EWRAM_DATA u16 gRandomTurnNumber = 0; EWRAM_DATA u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT] = {0}; EWRAM_DATA u8 gBattleOutcome = 0; EWRAM_DATA struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gBattleWeather = 0; EWRAM_DATA struct WishFutureKnock gWishFutureKnock = {0}; EWRAM_DATA u16 gIntroSlideFlags = 0; EWRAM_DATA u8 gSentPokesToOpponent[2] = {0}; EWRAM_DATA u16 gDynamicBasePower = 0; EWRAM_DATA u16 gExpShareExp = 0; EWRAM_DATA struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct BattleScripting gBattleScripting = {0}; EWRAM_DATA struct BattleStruct *gBattleStruct = NULL; EWRAM_DATA u8 *gLinkBattleSendBuffer = NULL; EWRAM_DATA u8 *gLinkBattleRecvBuffer = NULL; EWRAM_DATA struct BattleResources *gBattleResources = NULL; EWRAM_DATA u8 gActionSelectionCursor[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gBattlerInMenuId = 0; EWRAM_DATA bool8 gDoingBattleAnim = FALSE; EWRAM_DATA u32 gTransformedPersonalities[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct BattleSpriteData *gBattleSpritesDataPtr = NULL; EWRAM_DATA struct MonSpritesGfx *gMonSpritesGfxPtr = NULL; EWRAM_DATA u16 gBattleMovePower = 0; EWRAM_DATA u16 gMoveToLearn = 0; EWRAM_DATA u8 gBattleMonForms[MAX_BATTLERS_COUNT] = {0}; void (*gPreBattleCallback1)(void); void (*gBattleMainFunc)(void); struct BattleResults gBattleResults; u8 gLeveledUpInBattle; void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void); u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT]; u8 gMultiUsePlayerCursor; u8 gNumberOfMovesToChoose; u8 gBattleControllerData[MAX_BATTLERS_COUNT]; static const struct ScanlineEffectParams sIntroScanlineParams16Bit = { ®_BG3HOFS, SCANLINE_EFFECT_DMACNT_16BIT, 1 }; const struct SpriteTemplate gUnknownDebugSprite = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_UnusedDebugSprite, }; static const u8 sText_ShedinjaJpnName[] = _("ヌケニン"); // Nukenin const struct OamData gOamData_BattlerOpponent = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0, }; const struct OamData gOamData_BattlerPlayer = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 2, .affineParam = 0, }; static const union AnimCmd sAnim_Unused[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnims_Unused[] = { sAnim_Unused, }; static const union AffineAnimCmd sAffineAnim_Unused[] = { AFFINEANIMCMD_FRAME(-0x10, 0x0, 0, 4), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 0x3C), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd *const sAffineAnims_Unused[] = { sAffineAnim_Unused, }; static const s8 sPlayerThrowXTranslation[] = { -32, -16, -16, -32, -32, 0, 0, 0 }; // format: attacking type, defending type, damage multiplier // the multiplier is a (decimal) fixed-point number: // 20 is ×2.0 TYPE_MUL_SUPER_EFFECTIVE // 10 is ×1.0 TYPE_MUL_NORMAL // 05 is ×0.5 TYPE_MUL_NOT_EFFECTIVE // 00 is ×0.0 TYPE_MUL_NO_EFFECT const u8 gTypeEffectiveness[336] = { TYPE_NORMAL, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE, TYPE_NORMAL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIRE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIRE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIRE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FIRE, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FIRE, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FIRE, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIRE, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIRE, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE, TYPE_WATER, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE, TYPE_WATER, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE, TYPE_WATER, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE, TYPE_WATER, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE, TYPE_WATER, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, TYPE_WATER, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE, TYPE_ELECTRIC, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ELECTRIC, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE, TYPE_ELECTRIC, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE, TYPE_ELECTRIC, TYPE_GROUND, TYPE_MUL_NO_EFFECT, TYPE_ELECTRIC, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ELECTRIC, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE, TYPE_GRASS, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, TYPE_GRASS, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE, TYPE_GRASS, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE, TYPE_GRASS, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE, TYPE_GRASS, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE, TYPE_GRASS, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE, TYPE_GRASS, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE, TYPE_GRASS, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, TYPE_GRASS, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE, TYPE_GRASS, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_ICE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE, TYPE_ICE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ICE, TYPE_ICE, TYPE_MUL_NOT_EFFECTIVE, TYPE_ICE, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ICE, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ICE, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ICE, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_ICE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIGHTING, TYPE_NORMAL, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FIGHTING, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FIGHTING, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIGHTING, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIGHTING, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIGHTING, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE, TYPE_FIGHTING, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FIGHTING, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FIGHTING, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE, TYPE_POISON, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, TYPE_POISON, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE, TYPE_POISON, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE, TYPE_POISON, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE, TYPE_POISON, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE, TYPE_POISON, TYPE_STEEL, TYPE_MUL_NO_EFFECT, TYPE_GROUND, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE, TYPE_GROUND, TYPE_ELECTRIC, TYPE_MUL_SUPER_EFFECTIVE, TYPE_GROUND, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE, TYPE_GROUND, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE, TYPE_GROUND, TYPE_FLYING, TYPE_MUL_NO_EFFECT, TYPE_GROUND, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE, TYPE_GROUND, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, TYPE_GROUND, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FLYING, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE, TYPE_FLYING, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FLYING, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FLYING, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE, TYPE_FLYING, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE, TYPE_FLYING, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_PSYCHIC, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE, TYPE_PSYCHIC, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE, TYPE_PSYCHIC, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE, TYPE_PSYCHIC, TYPE_DARK, TYPE_MUL_NO_EFFECT, TYPE_PSYCHIC, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_BUG, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, TYPE_BUG, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, TYPE_BUG, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE, TYPE_BUG, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE, TYPE_BUG, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE, TYPE_BUG, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE, TYPE_BUG, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE, TYPE_BUG, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE, TYPE_BUG, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_ROCK, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ROCK, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ROCK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE, TYPE_ROCK, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE, TYPE_ROCK, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ROCK, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE, TYPE_ROCK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_GHOST, TYPE_NORMAL, TYPE_MUL_NO_EFFECT, TYPE_GHOST, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE, TYPE_GHOST, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE, TYPE_GHOST, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_GHOST, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE, TYPE_DRAGON, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE, TYPE_DRAGON, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_DARK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE, TYPE_DARK, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE, TYPE_DARK, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE, TYPE_DARK, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE, TYPE_DARK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_STEEL, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, TYPE_STEEL, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE, TYPE_STEEL, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE, TYPE_STEEL, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE, TYPE_STEEL, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, TYPE_STEEL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, TYPE_FORESIGHT, TYPE_FORESIGHT, TYPE_MUL_NO_EFFECT, TYPE_NORMAL, TYPE_GHOST, TYPE_MUL_NO_EFFECT, TYPE_FIGHTING, TYPE_GHOST, TYPE_MUL_NO_EFFECT, TYPE_ENDTABLE, TYPE_ENDTABLE, TYPE_MUL_NO_EFFECT }; const u8 gTypeNames[NUMBER_OF_MON_TYPES][TYPE_NAME_LENGTH + 1] = { [TYPE_NORMAL] = _("NORMAL"), [TYPE_FIGHTING] = _("FIGHT"), [TYPE_FLYING] = _("FLYING"), [TYPE_POISON] = _("POISON"), [TYPE_GROUND] = _("GROUND"), [TYPE_ROCK] = _("ROCK"), [TYPE_BUG] = _("BUG"), [TYPE_GHOST] = _("GHOST"), [TYPE_STEEL] = _("STEEL"), [TYPE_MYSTERY] = _("???"), [TYPE_FIRE] = _("FIRE"), [TYPE_WATER] = _("WATER"), [TYPE_GRASS] = _("GRASS"), [TYPE_ELECTRIC] = _("ELECTR"), [TYPE_PSYCHIC] = _("PSYCHC"), [TYPE_ICE] = _("ICE"), [TYPE_DRAGON] = _("DRAGON"), [TYPE_DARK] = _("DARK"), }; // This is a factor in how much money you get for beating a trainer. const struct TrainerMoney gTrainerMoneyTable[] = { {TRAINER_CLASS_LEADER, 25}, {TRAINER_CLASS_ELITE_FOUR, 25}, {TRAINER_CLASS_PKMN_PROF, 25}, {TRAINER_CLASS_RIVAL_EARLY, 4}, {TRAINER_CLASS_RIVAL_LATE, 9}, {TRAINER_CLASS_CHAMPION, 25}, {TRAINER_CLASS_YOUNGSTER, 4}, {TRAINER_CLASS_BUG_CATCHER, 3}, {TRAINER_CLASS_HIKER, 9}, {TRAINER_CLASS_BIRD_KEEPER, 6}, {TRAINER_CLASS_PICNICKER, 5}, {TRAINER_CLASS_SUPER_NERD, 6}, {TRAINER_CLASS_FISHERMAN, 9}, {TRAINER_CLASS_TEAM_ROCKET, 8}, {TRAINER_CLASS_LASS, 4}, {TRAINER_CLASS_BEAUTY, 18}, {TRAINER_CLASS_BLACK_BELT, 6}, {TRAINER_CLASS_CUE_BALL, 6}, {TRAINER_CLASS_CHANNELER, 8}, {TRAINER_CLASS_ROCKER, 6}, {TRAINER_CLASS_GENTLEMAN, 18}, {TRAINER_CLASS_BURGLAR, 22}, {TRAINER_CLASS_SWIMMER_M, 1}, {TRAINER_CLASS_ENGINEER, 12}, {TRAINER_CLASS_JUGGLER, 10}, {TRAINER_CLASS_SAILOR, 8}, {TRAINER_CLASS_COOLTRAINER, 9}, {TRAINER_CLASS_POKEMANIAC, 12}, {TRAINER_CLASS_TAMER, 10}, {TRAINER_CLASS_CAMPER, 5}, {TRAINER_CLASS_PSYCHIC, 5}, {TRAINER_CLASS_BIKER, 5}, {TRAINER_CLASS_GAMER, 18}, {TRAINER_CLASS_SCIENTIST, 12}, {TRAINER_CLASS_CRUSH_GIRL, 6}, {TRAINER_CLASS_TUBER, 1}, {TRAINER_CLASS_PKMN_BREEDER, 7}, {TRAINER_CLASS_PKMN_RANGER, 9}, {TRAINER_CLASS_AROMA_LADY, 7}, {TRAINER_CLASS_RUIN_MANIAC, 12}, {TRAINER_CLASS_LADY, 50}, {TRAINER_CLASS_PAINTER, 4}, {TRAINER_CLASS_TWINS, 3}, {TRAINER_CLASS_YOUNG_COUPLE, 7}, {TRAINER_CLASS_SIS_AND_BRO, 1}, {TRAINER_CLASS_COOL_COUPLE, 6}, {TRAINER_CLASS_CRUSH_KIN, 6}, {TRAINER_CLASS_SWIMMER_F, 1}, {TRAINER_CLASS_PLAYER, 1}, {TRAINER_CLASS_RS_LEADER, 25}, {TRAINER_CLASS_RS_ELITE_FOUR, 25}, {TRAINER_CLASS_RS_LASS, 4}, {TRAINER_CLASS_RS_YOUNGSTER, 4}, {TRAINER_CLASS_PKMN_TRAINER, 15}, {TRAINER_CLASS_RS_HIKER, 10}, {TRAINER_CLASS_RS_BEAUTY, 20}, {TRAINER_CLASS_RS_FISHERMAN, 10}, {TRAINER_CLASS_RS_LADY, 50}, {TRAINER_CLASS_TRIATHLETE, 10}, {TRAINER_CLASS_TEAM_AQUA, 5}, {TRAINER_CLASS_RS_TWINS, 3}, {TRAINER_CLASS_RS_SWIMMER_F, 2}, {TRAINER_CLASS_RS_BUG_CATCHER, 4}, {TRAINER_CLASS_SCHOOL_KID, 5}, {TRAINER_CLASS_RICH_BOY, 50}, {TRAINER_CLASS_SR_AND_JR, 4}, {TRAINER_CLASS_RS_BLACK_BELT, 8}, {TRAINER_CLASS_RS_TUBER_F, 1}, {TRAINER_CLASS_HEX_MANIAC, 6}, {TRAINER_CLASS_RS_PKMN_BREEDER, 10}, {TRAINER_CLASS_TEAM_MAGMA, 5}, {TRAINER_CLASS_INTERVIEWER, 12}, {TRAINER_CLASS_RS_TUBER_M, 1}, {TRAINER_CLASS_RS_YOUNG_COUPLE, 8}, {TRAINER_CLASS_GUITARIST, 8}, {TRAINER_CLASS_RS_GENTLEMAN, 20}, {TRAINER_CLASS_RS_CHAMPION, 50}, {TRAINER_CLASS_MAGMA_LEADER, 20}, {TRAINER_CLASS_BATTLE_GIRL, 6}, {TRAINER_CLASS_RS_SWIMMER_M, 2}, {TRAINER_CLASS_POKEFAN, 20}, {TRAINER_CLASS_EXPERT, 10}, {TRAINER_CLASS_DRAGON_TAMER, 12}, {TRAINER_CLASS_RS_BIRD_KEEPER, 8}, {TRAINER_CLASS_NINJA_BOY, 3}, {TRAINER_CLASS_PARASOL_LADY, 10}, {TRAINER_CLASS_BUG_MANIAC, 15}, {TRAINER_CLASS_RS_SAILOR, 8}, {TRAINER_CLASS_COLLECTOR, 15}, {TRAINER_CLASS_RS_PKMN_RANGER, 12}, {TRAINER_CLASS_MAGMA_ADMIN, 10}, {TRAINER_CLASS_RS_AROMA_LADY, 10}, {TRAINER_CLASS_RS_RUIN_MANIAC, 15}, {TRAINER_CLASS_RS_COOLTRAINER, 12}, {TRAINER_CLASS_RS_POKEMANIAC, 15}, {TRAINER_CLASS_KINDLER, 8}, {TRAINER_CLASS_RS_CAMPER, 4}, {TRAINER_CLASS_RS_PICNICKER, 4}, {TRAINER_CLASS_RS_PSYCHIC, 6}, {TRAINER_CLASS_RS_SIS_AND_BRO, 3}, {TRAINER_CLASS_OLD_COUPLE, 10}, {TRAINER_CLASS_AQUA_ADMIN, 10}, {TRAINER_CLASS_AQUA_LEADER, 20}, {TRAINER_CLASS_BOSS, 25}, { 0xFF, 5}, }; #include "data/text/abilities.h" static void (*const sTurnActionsFuncsTable[])(void) = { [B_ACTION_USE_MOVE] = HandleAction_UseMove, [B_ACTION_USE_ITEM] = HandleAction_UseItem, [B_ACTION_SWITCH] = HandleAction_Switch, [B_ACTION_RUN] = HandleAction_Run, [B_ACTION_SAFARI_WATCH_CAREFULLY] = HandleAction_WatchesCarefully, [B_ACTION_SAFARI_BALL] = HandleAction_SafariZoneBallThrow, [B_ACTION_SAFARI_BAIT] = HandleAction_ThrowBait, [B_ACTION_SAFARI_GO_NEAR] = HandleAction_ThrowRock, [B_ACTION_SAFARI_RUN] = HandleAction_SafariZoneRun, [B_ACTION_OLDMAN_THROW] = HandleAction_OldManBallThrow, [B_ACTION_EXEC_SCRIPT] = HandleAction_RunBattleScript, [B_ACTION_TRY_FINISH] = HandleAction_TryFinish, [B_ACTION_FINISHED] = HandleAction_ActionFinished, [B_ACTION_NOTHING_FAINTED] = HandleAction_NothingIsFainted, }; static void (*const sEndTurnFuncsTable[])(void) = { [0] = HandleEndTurn_ContinueBattle, [B_OUTCOME_WON] = HandleEndTurn_BattleWon, [B_OUTCOME_LOST] = HandleEndTurn_BattleLost, [B_OUTCOME_DREW] = HandleEndTurn_BattleLost, [B_OUTCOME_RAN] = HandleEndTurn_RanFromBattle, [B_OUTCOME_PLAYER_TELEPORTED] = HandleEndTurn_FinishBattle, [B_OUTCOME_MON_FLED] = HandleEndTurn_MonFled, [B_OUTCOME_CAUGHT] = HandleEndTurn_FinishBattle, [B_OUTCOME_NO_SAFARI_BALLS] = HandleEndTurn_FinishBattle, }; const u8 gStatusConditionString_PoisonJpn[] = _("どく$$$$$"); const u8 gStatusConditionString_SleepJpn[] = _("ねむり$$$$"); const u8 gStatusConditionString_ParalysisJpn[] = _("まひ$$$$$"); const u8 gStatusConditionString_BurnJpn[] = _("やけど$$$$"); const u8 gStatusConditionString_IceJpn[] = _("こおり$$$$"); const u8 gStatusConditionString_ConfusionJpn[] = _("こんらん$$$"); const u8 gStatusConditionString_LoveJpn[] = _("メロメロ$$$"); const u8 *const gStatusConditionStringsTable[][2] = { {gStatusConditionString_PoisonJpn, gText_Poison}, {gStatusConditionString_SleepJpn, gText_Sleep}, {gStatusConditionString_ParalysisJpn, gText_Paralysis}, {gStatusConditionString_BurnJpn, gText_Burn}, {gStatusConditionString_IceJpn, gText_Ice}, {gStatusConditionString_ConfusionJpn, gText_Confusion}, {gStatusConditionString_LoveJpn, gText_Love} }; void CB2_InitBattle(void) { MoveSaveBlocks_ResetHeap(); AllocateBattleResources(); AllocateBattleSpritesData(); AllocateMonSpritesGfx(); if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { HandleLinkBattleSetup(); SetMainCallback2(CB2_PreInitMultiBattle); gBattleCommunication[MULTIUSE_STATE] = 0; } else { CB2_InitBattleInternal(); if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_DOUBLE); else SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_SINGLE); } else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { SetHelpContext(HELPCONTEXT_SAFARI_BATTLE); } else { SetHelpContext(HELPCONTEXT_WILD_BATTLE); } } } } static void CB2_InitBattleInternal(void) { s32 i; SetHBlankCallback(NULL); SetVBlankCallback(NULL); CpuFill32(0, (void *)(VRAM), VRAM_SIZE); SetGpuReg(REG_OFFSET_MOSAIC, 0); SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1)); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); gBattle_WIN0H = DISPLAY_WIDTH; gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1); ScanlineEffect_Clear(); for (i = 0; i < 80; ++i) { gScanlineEffectRegBuffers[0][i] = 0xF0; gScanlineEffectRegBuffers[1][i] = 0xF0; } for (; i < 160; ++i) { gScanlineEffectRegBuffers[0][i] = 0xFF10; gScanlineEffectRegBuffers[1][i] = 0xFF10; } ScanlineEffect_SetParams(sIntroScanlineParams16Bit); ResetPaletteFade(); gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; gBattle_BG3_X = 0; gBattle_BG3_Y = 0; gBattleTerrain = BattleSetup_GetTerrainId(); InitBattleBgsVideo(); LoadBattleTextboxAndBackground(); ResetSpriteData(); ResetTasks(); DrawBattleEntryBackground(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; SetVBlankCallback(VBlankCB_Battle); SetUpBattleVars(); if (gBattleTypeFlags & BATTLE_TYPE_MULTI) SetMainCallback2(CB2_HandleStartMultiBattle); else SetMainCallback2(CB2_HandleStartBattle); if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) { CreateNPCTrainerParty(&gEnemyParty[0], gTrainerBattleOpponent_A); SetWildMonHeldItem(); } gMain.inBattle = TRUE; for (i = 0; i < PARTY_SIZE; i++) AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE); gBattleCommunication[MULTIUSE_STATE] = 0; } #define BUFFER_PARTY_VS_SCREEN_STATUS(party, flags, i) \ for ((i) = 0; (i) < PARTY_SIZE; (i)++) \ { \ u16 species = GetMonData(&(party)[(i)], MON_DATA_SPECIES_OR_EGG); \ u16 hp = GetMonData(&(party)[(i)], MON_DATA_HP); \ u32 status = GetMonData(&(party)[(i)], MON_DATA_STATUS); \ \ if (species == SPECIES_NONE) \ continue; \ \ /* Is healthy mon? */ \ if (species != SPECIES_EGG && hp != 0 && status == 0) \ (flags) |= 1 << (i) * 2; \ \ if (species == SPECIES_NONE) /* Redundant */ \ continue; \ \ /* Is Egg or statused? */ \ if (hp != 0 && (species == SPECIES_EGG || status != 0)) \ (flags) |= 2 << (i) * 2; \ \ if (species == SPECIES_NONE) /* Redundant */ \ continue; \ \ /* Is fainted? */ \ if (species != SPECIES_EGG && hp == 0) \ (flags) |= 3 << (i) * 2; \ } // For Vs Screen at link battle start static void BufferPartyVsScreenHealth_AtStart(void) { u16 flags = 0; s32 i; BUFFER_PARTY_VS_SCREEN_STATUS(gPlayerParty, flags, i); gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo = flags; *(&gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi) = flags >> 8; } static void SetPlayerBerryDataInBattleStruct(void) { s32 i; struct BattleStruct *battleStruct = gBattleStruct; struct BattleEnigmaBerry *battleBerry = &battleStruct->multiBuffer.linkBattlerHeader.battleEnigmaBerry; if (IsEnigmaBerryValid() == TRUE) { for (i = 0; i < BERRY_NAME_LENGTH; i++) battleBerry->name[i] = gSaveBlock1Ptr->enigmaBerry.berry.name[i]; battleBerry->name[i] = EOS; for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++) battleBerry->itemEffect[i] = gSaveBlock1Ptr->enigmaBerry.itemEffect[i]; battleBerry->holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; battleBerry->holdEffectParam = gSaveBlock1Ptr->enigmaBerry.holdEffectParam; } else { const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); for (i = 0; i < BERRY_NAME_LENGTH; i++) battleBerry->name[i] = berryData->name[i]; battleBerry->name[i] = EOS; for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++) battleBerry->itemEffect[i] = 0; battleBerry->holdEffect = HOLD_EFFECT_NONE; battleBerry->holdEffectParam = 0; } } static void SetAllPlayersBerryData(void) { s32 i, j; if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) { if (IsEnigmaBerryValid() == TRUE) { for (i = 0; i < BERRY_NAME_LENGTH; i++) { gEnigmaBerries[0].name[i] = gSaveBlock1Ptr->enigmaBerry.berry.name[i]; gEnigmaBerries[2].name[i] = gSaveBlock1Ptr->enigmaBerry.berry.name[i]; } gEnigmaBerries[0].name[i] = EOS; gEnigmaBerries[2].name[i] = EOS; for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++) { gEnigmaBerries[0].itemEffect[i] = gSaveBlock1Ptr->enigmaBerry.itemEffect[i]; gEnigmaBerries[2].itemEffect[i] = gSaveBlock1Ptr->enigmaBerry.itemEffect[i]; } gEnigmaBerries[0].holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; gEnigmaBerries[2].holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; gEnigmaBerries[0].holdEffectParam = gSaveBlock1Ptr->enigmaBerry.holdEffectParam; gEnigmaBerries[2].holdEffectParam = gSaveBlock1Ptr->enigmaBerry.holdEffectParam; } else { const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); for (i = 0; i < BERRY_NAME_LENGTH; i++) { gEnigmaBerries[0].name[i] = berryData->name[i]; gEnigmaBerries[2].name[i] = berryData->name[i]; } gEnigmaBerries[0].name[i] = EOS; gEnigmaBerries[2].name[i] = EOS; for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++) { gEnigmaBerries[0].itemEffect[i] = 0; gEnigmaBerries[2].itemEffect[i] = 0; } gEnigmaBerries[0].holdEffect = HOLD_EFFECT_NONE; gEnigmaBerries[2].holdEffect = HOLD_EFFECT_NONE; gEnigmaBerries[0].holdEffectParam = 0; gEnigmaBerries[2].holdEffectParam = 0; } } else { s32 numPlayers; struct BattleEnigmaBerry *src; u8 battlerId; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { for (i = 0; i < 4; i++) { src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); battlerId = gLinkPlayers[i].id; for (j = 0; j < BERRY_NAME_LENGTH; j++) gEnigmaBerries[battlerId].name[j] = src->name[j]; gEnigmaBerries[battlerId].name[j] = EOS; for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++) gEnigmaBerries[battlerId].itemEffect[j] = src->itemEffect[j]; gEnigmaBerries[battlerId].holdEffect = src->holdEffect; gEnigmaBerries[battlerId].holdEffectParam = src->holdEffectParam; } } else { for (i = 0; i < 2; i++) { src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); for (j = 0; j < BERRY_NAME_LENGTH; j++) { gEnigmaBerries[i].name[j] = src->name[j]; gEnigmaBerries[i + 2].name[j] = src->name[j]; } gEnigmaBerries[i].name[j] = EOS; gEnigmaBerries[i + 2].name[j] = EOS; for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++) { gEnigmaBerries[i].itemEffect[j] = src->itemEffect[j]; gEnigmaBerries[i + 2].itemEffect[j] = src->itemEffect[j]; } gEnigmaBerries[i].holdEffect = src->holdEffect; gEnigmaBerries[i + 2].holdEffect = src->holdEffect; gEnigmaBerries[i].holdEffectParam = src->holdEffectParam; gEnigmaBerries[i + 2].holdEffectParam = src->holdEffectParam; } } } } static void LinkBattleComputeBattleTypeFlags(u8 numPlayers, u8 multiPlayerId) { u8 found = 0; // If player 1 is playing the minimum version, player 1 is master. if (gBlockRecvBuffer[0][0] == 0x100) { if (multiPlayerId == 0) gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; else gBattleTypeFlags |= BATTLE_TYPE_TRAINER; found++; } if (found == 0) { // If multiple different versions are being used, player 1 is master. s32 i; for (i = 0; i < numPlayers; i++) if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0]) break; if (i == numPlayers) { if (multiPlayerId == 0) gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; else gBattleTypeFlags |= BATTLE_TYPE_TRAINER; found++; } if (found == 0) { // Lowest index player with the highest game version is master. for (i = 0; i < numPlayers; i++) { if (gBlockRecvBuffer[i][0] == 0x201 && i != multiPlayerId) if (i < multiPlayerId) break; if (gBlockRecvBuffer[i][0] > 0x201 && i != multiPlayerId) break; } if (i == numPlayers) gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; else gBattleTypeFlags |= BATTLE_TYPE_TRAINER; } } } static void CB2_HandleStartBattle(void) { u8 playerMultiplayerId; u8 enemyMultiplayerId; RunTasks(); AnimateSprites(); BuildOamBuffer(); playerMultiplayerId = GetMultiplayerId(); gBattleStruct->multiplayerId = playerMultiplayerId; enemyMultiplayerId = playerMultiplayerId ^ BIT_SIDE; switch (gBattleCommunication[MULTIUSE_STATE]) { case 0: if (!IsDma3ManagerBusyWithBgCopy()) { ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); BattleInterfaceSetWindowPals(); gBattleCommunication[MULTIUSE_STATE] = 1; } if (gWirelessCommType) LoadWirelessStatusIndicatorSpriteGfx(); break; case 1: if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (gReceivedRemoteLinkPlayers) { if (IsLinkTaskFinished()) { // 0x201 *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 1; *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 2; BufferPartyVsScreenHealth_AtStart(); SetPlayerBerryDataInBattleStruct(); SendBlock(BitmaskAllOtherLinkPlayers(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader)); gBattleCommunication[MULTIUSE_STATE] = 2; } if (gWirelessCommType != 0) CreateWirelessStatusIndicatorSprite(0, 0); } } else { gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER; gBattleCommunication[MULTIUSE_STATE] = 15; SetAllPlayersBerryData(); } break; case 2: if ((GetBlockReceivedStatus() & 3) == 3) { u8 taskId; ResetBlockReceivedFlags(); LinkBattleComputeBattleTypeFlags(2, playerMultiplayerId); SetAllPlayersBerryData(); taskId = CreateTask(InitLinkBattleVsScreen, 0); gTasks[taskId].data[1] = 270; gTasks[taskId].data[2] = 90; gTasks[taskId].data[5] = 0; gTasks[taskId].data[3] = gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo | (gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi << 8); gTasks[taskId].data[4] = gBlockRecvBuffer[enemyMultiplayerId][1]; SetDeoxysStats(); gBattleCommunication[MULTIUSE_STATE]++; } break; case 3: if (IsLinkTaskFinished()) { SendBlock(BitmaskAllOtherLinkPlayers(), gPlayerParty, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; } break; case 4: if ((GetBlockReceivedStatus() & 3) == 3) { ResetBlockReceivedFlags(); memcpy(gEnemyParty, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; } break; case 7: if (IsLinkTaskFinished()) { SendBlock(BitmaskAllOtherLinkPlayers(), gPlayerParty + 2, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; } break; case 8: if ((GetBlockReceivedStatus() & 3) == 3) { ResetBlockReceivedFlags(); memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; } break; case 11: if (IsLinkTaskFinished()) { SendBlock(BitmaskAllOtherLinkPlayers(), gPlayerParty + 4, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; } break; case 12: if ((GetBlockReceivedStatus() & 3) == 3) { ResetBlockReceivedFlags(); memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2); TryCorrectShedinjaLanguage(&gEnemyParty[0]); TryCorrectShedinjaLanguage(&gEnemyParty[1]); TryCorrectShedinjaLanguage(&gEnemyParty[2]); TryCorrectShedinjaLanguage(&gEnemyParty[3]); TryCorrectShedinjaLanguage(&gEnemyParty[4]); TryCorrectShedinjaLanguage(&gEnemyParty[5]); gBattleCommunication[MULTIUSE_STATE]++; } break; case 15: InitBattleControllers(); gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[SPRITES_INIT_STATE1] = 0; gBattleCommunication[SPRITES_INIT_STATE2] = 0; break; case 16: if (BattleInitAllSprites(&gBattleCommunication[SPRITES_INIT_STATE1], &gBattleCommunication[SPRITES_INIT_STATE2])) { gPreBattleCallback1 = gMain.callback1; gMain.callback1 = BattleMainCB1; SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE; } } break; case 5: case 9: case 13: gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[1] = 1; case 6: case 10: case 14: if (--gBattleCommunication[1] == 0) gBattleCommunication[MULTIUSE_STATE]++; break; } } static void PrepareOwnMultiPartnerBuffer(void) { s32 i, j; u8 *nick, *cur; for (i = 0; i < 3; i++) { gMultiPartnerParty[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES); gMultiPartnerParty[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); nick = gMultiPartnerParty[i].nickname; GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nick); gMultiPartnerParty[i].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); gMultiPartnerParty[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); gMultiPartnerParty[i].maxhp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); gMultiPartnerParty[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); gMultiPartnerParty[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); gMultiPartnerParty[i].gender = GetMonGender(&gPlayerParty[i]); StripExtCtrlCodes(nick); if (GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE) { for (cur = nick, j = 0; cur[j] != EOS; j++) ; while (j < 6) cur[j++] = 0; cur[j] = EOS; } } memcpy(gBattleStruct->multiBuffer.multiBattleMons, gMultiPartnerParty, sizeof(gMultiPartnerParty)); } static void CB2_PreInitMultiBattle(void) { s32 i; u8 playerMultiplierId; u8 r4 = 0xF; u16 *savedBattleTypeFlags; void (**savedCallback)(void); playerMultiplierId = GetMultiplayerId(); gBattleStruct->multiplayerId = playerMultiplierId; savedCallback = &gBattleStruct->savedCallback; savedBattleTypeFlags = &gBattleStruct->savedBattleTypeFlags; RunTasks(); AnimateSprites(); BuildOamBuffer(); switch (gBattleCommunication[MULTIUSE_STATE]) { case 0: if (gReceivedRemoteLinkPlayers && IsLinkTaskFinished()) { PrepareOwnMultiPartnerBuffer(); SendBlock(BitmaskAllOtherLinkPlayers(), gBattleStruct->multiBuffer.multiBattleMons, sizeof(gBattleStruct->multiBuffer.multiBattleMons)); gBattleCommunication[MULTIUSE_STATE]++; } break; case 1: if ((GetBlockReceivedStatus() & r4) == r4) { ResetBlockReceivedFlags(); for (i = 0; i < 4; i++) { if (i == playerMultiplierId) continue; if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[playerMultiplierId].id & 1)) || (gLinkPlayers[i].id & 1 && gLinkPlayers[playerMultiplierId].id & 1)) memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(gMultiPartnerParty)); } gBattleCommunication[MULTIUSE_STATE]++; *savedCallback = gMain.savedCallback; *savedBattleTypeFlags = gBattleTypeFlags; gMain.savedCallback = CB2_PreInitMultiBattle; ShowPartyMenuToShowcaseMultiBattleParty(); } break; case 2: if (!gPaletteFade.active) { gBattleCommunication[MULTIUSE_STATE]++; if (gWirelessCommType) SetLinkStandbyCallback(); else SetCloseLinkCallback(); } break; case 3: if (gWirelessCommType) { if (IsLinkRfuTaskFinished()) { gBattleTypeFlags = *savedBattleTypeFlags; gMain.savedCallback = *savedCallback; SetMainCallback2(CB2_InitBattleInternal); } } else if (!gReceivedRemoteLinkPlayers) { gBattleTypeFlags = *savedBattleTypeFlags; gMain.savedCallback = *savedCallback; SetMainCallback2(CB2_InitBattleInternal); } break; } } static void CB2_HandleStartMultiBattle(void) { u8 playerMultiplayerId; s32 id; u8 taskId; playerMultiplayerId = GetMultiplayerId(); gBattleStruct->multiplayerId = playerMultiplayerId; RunTasks(); AnimateSprites(); BuildOamBuffer(); switch (gBattleCommunication[MULTIUSE_STATE]) { case 0: if (!IsDma3ManagerBusyWithBgCopy()) { ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); BattleInterfaceSetWindowPals(); gBattleCommunication[MULTIUSE_STATE] = 1; } if (gWirelessCommType) LoadWirelessStatusIndicatorSpriteGfx(); break; case 1: if (gReceivedRemoteLinkPlayers) { if (IsLinkTaskFinished()) { // 0x201 *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 1; *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 2; BufferPartyVsScreenHealth_AtStart(); SetPlayerBerryDataInBattleStruct(); SendBlock(BitmaskAllOtherLinkPlayers(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader)); gBattleCommunication[MULTIUSE_STATE]++; } if (gWirelessCommType) CreateWirelessStatusIndicatorSprite(0, 0); } break; case 2: if ((GetBlockReceivedStatus() & 0xF) == 0xF) { ResetBlockReceivedFlags(); LinkBattleComputeBattleTypeFlags(4, playerMultiplayerId); SetAllPlayersBerryData(); SetDeoxysStats(); memcpy(gDecompressionBuffer, gPlayerParty, sizeof(struct Pokemon) * 3); taskId = CreateTask(InitLinkBattleVsScreen, 0); gTasks[taskId].data[1] = 270; gTasks[taskId].data[2] = 90; gTasks[taskId].data[5] = 0; gTasks[taskId].data[3] = 0; gTasks[taskId].data[4] = 0; for (id = 0; id < MAX_LINK_PLAYERS; ++id) { switch (gLinkPlayers[id].id) { case 0: gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F; break; case 1: gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F; break; case 2: gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; break; case 3: gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; break; } } ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); gBattleCommunication[MULTIUSE_STATE]++; } else { break; } // fall through case 3: if (IsLinkTaskFinished()) { SendBlock(BitmaskAllOtherLinkPlayers(), gDecompressionBuffer, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; } break; case 4: if ((GetBlockReceivedStatus() & 0xF) == 0xF) { ResetBlockReceivedFlags(); for (id = 0; id < MAX_LINK_PLAYERS; ++id) { if (id == playerMultiplayerId) { switch (gLinkPlayers[id].id) { case 0: case 3: memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); break; case 1: case 2: memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); break; } } else { if ((!(gLinkPlayers[id].id & 1) && !(gLinkPlayers[playerMultiplayerId].id & 1)) || ((gLinkPlayers[id].id & 1) && (gLinkPlayers[playerMultiplayerId].id & 1))) { switch (gLinkPlayers[id].id) { case 0: case 3: memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); break; case 1: case 2: memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); break; } } else { switch (gLinkPlayers[id].id) { case 0: case 3: memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); break; case 1: case 2: memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); break; } } } } gBattleCommunication[MULTIUSE_STATE]++; } break; case 7: if (IsLinkTaskFinished()) { SendBlock(BitmaskAllOtherLinkPlayers(), gDecompressionBuffer + sizeof(struct Pokemon) * 2, sizeof(struct Pokemon)); gBattleCommunication[MULTIUSE_STATE]++; } break; case 8: if ((GetBlockReceivedStatus() & 0xF) == 0xF) { ResetBlockReceivedFlags(); for (id = 0; id < MAX_LINK_PLAYERS; ++id) { if (id == playerMultiplayerId) { switch (gLinkPlayers[id].id) { case 0: case 3: memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); break; case 1: case 2: memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); break; } } else { if ((!(gLinkPlayers[id].id & 1) && !(gLinkPlayers[playerMultiplayerId].id & 1)) || ((gLinkPlayers[id].id & 1) && (gLinkPlayers[playerMultiplayerId].id & 1))) { switch (gLinkPlayers[id].id) { case 0: case 3: memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); break; case 1: case 2: memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); break; } } else { switch (gLinkPlayers[id].id) { case 0: case 3: memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); break; case 1: case 2: memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); break; } } } } TryCorrectShedinjaLanguage(&gPlayerParty[0]); TryCorrectShedinjaLanguage(&gPlayerParty[1]); TryCorrectShedinjaLanguage(&gPlayerParty[2]); TryCorrectShedinjaLanguage(&gPlayerParty[3]); TryCorrectShedinjaLanguage(&gPlayerParty[4]); TryCorrectShedinjaLanguage(&gPlayerParty[5]); TryCorrectShedinjaLanguage(&gEnemyParty[0]); TryCorrectShedinjaLanguage(&gEnemyParty[1]); TryCorrectShedinjaLanguage(&gEnemyParty[2]); TryCorrectShedinjaLanguage(&gEnemyParty[3]); TryCorrectShedinjaLanguage(&gEnemyParty[4]); TryCorrectShedinjaLanguage(&gEnemyParty[5]); gBattleCommunication[MULTIUSE_STATE]++; } break; case 11: InitBattleControllers(); gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[SPRITES_INIT_STATE1] = 0; gBattleCommunication[SPRITES_INIT_STATE2] = 0; break; case 12: if (BattleInitAllSprites(&gBattleCommunication[SPRITES_INIT_STATE1], &gBattleCommunication[SPRITES_INIT_STATE2])) { gPreBattleCallback1 = gMain.callback1; gMain.callback1 = BattleMainCB1; SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE; } break; case 5: case 9: ++gBattleCommunication[0]; gBattleCommunication[SPRITES_INIT_STATE1] = 1; // fall through case 6: case 10: if (--gBattleCommunication[SPRITES_INIT_STATE1] == 0) ++gBattleCommunication[0]; break; } } void BattleMainCB2(void) { AnimateSprites(); BuildOamBuffer(); RunTextPrinters(); UpdatePaletteFade(); RunTasks(); if (JOY_HELD(B_BUTTON) && gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) { gSpecialVar_Result = gBattleOutcome = B_OUTCOME_DREW; ResetPaletteFadeControl(); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); SetMainCallback2(CB2_QuitPokedudeBattle); } } void FreeRestoreBattleData(void) { gMain.callback1 = gPreBattleCallback1; gScanlineEffect.state = 3; gMain.inBattle = FALSE; ZeroEnemyPartyMons(); m4aSongNumStop(SE_LOW_HEALTH); FreeMonSpritesGfx(); FreeBattleSpritesData(); FreeBattleResources(); } static void CB2_QuitPokedudeBattle(void) { UpdatePaletteFade(); if (!gPaletteFade.active) { FreeRestoreBattleData(); FreeAllWindowBuffers(); SetMainCallback2(gMain.savedCallback); } } static void SpriteCB_UnusedDebugSprite(struct Sprite *sprite) { sprite->data[0] = 0; sprite->callback = SpriteCB_UnusedDebugSprite_Step; } static void SpriteCB_UnusedDebugSprite_Step(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sUnknownDebugSpriteDataBuffer = AllocZeroed(0x1000); ++sprite->data[0]; sprite->data[1] = 0; sprite->data[2] = 0x281; sprite->data[3] = 0; sprite->data[4] = 1; // fall through case 1: if (--sprite->data[4] == 0) { s32 i, r2, r0; sprite->data[4] = 2; r2 = sprite->data[1] + sprite->data[3] * 32; r0 = sprite->data[2] - sprite->data[3] * 32; for (i = 0; i <= 29; i += 2) { *(&sUnknownDebugSpriteDataBuffer[r2] + i) = 0x3D; *(&sUnknownDebugSpriteDataBuffer[r0] + i) = 0x3D; } if (++sprite->data[3] == 21) { ++sprite->data[0]; sprite->data[1] = 32; } } break; case 2: if (--sprite->data[1] == 20) { if (sUnknownDebugSpriteDataBuffer != NULL) { memset(sUnknownDebugSpriteDataBuffer, 0, 0x1000); FREE_AND_SET_NULL(sUnknownDebugSpriteDataBuffer); } SetMainCallback2(CB2_InitBattle); } break; } } static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) { u32 nameHash = 0; u32 personalityValue; u8 fixedIV; s32 i, j; s8 levelScaling = GetScaledLevel(); u8 ivCalcMode = gSaveBlock1Ptr->keyFlags.ivCalcMode; struct Trainer* sTrainers; bool8 inBattleHouse = FALSE; u8 level; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if(gMapHeader.mapLayoutId == LAYOUT_SEVEN_ISLAND_HOUSE_ROOM2) inBattleHouse = TRUE; if(trainerNum >= TRAINER_RIVAL_ROUTE22_LATE_SQUIRTLE && trainerNum <= TRAINER_RIVAL_ROUTE22_LATE_CHARMANDER) { //adjust level scaling for penultimate Rival battle if(levelScaling < 0) { //Easy Mode levelScaling -= 3; } if(levelScaling > 0) { //Challenge Mode levelScaling += 3; } } if((trainerNum >= TRAINER_ELITE_FOUR_LORELEI_2 && trainerNum <= TRAINER_CHAMPION_REMATCH_CHARMANDER) || (trainerNum >= TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2 && trainerNum <= TRAINER_CHAMPION_REMATCH_CHARMANDER_CHALLENGE)) { //adjust level scaling for E4 and Champ rematches if(levelScaling < 0) { //Easy Mode levelScaling -= 5; } if(levelScaling > 0) { //Challenge Mode levelScaling += 5; } } if (trainerNum == TRAINER_SECRET_BASE) return 0; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_TOWER))) { ZeroEnemyPartyMons(); for (i = 0; i < sTrainers[trainerNum].partySize; i++) { if (sTrainers[trainerNum].doubleBattle == TRUE) personalityValue = 0x80; else if (sTrainers[trainerNum].encounterMusic_gender & F_TRAINER_FEMALE) personalityValue = 0x78; // Use personality more likely to result in a female Pokémon else personalityValue = 0x88; // Use personality more likely to result in a male Pokémon for (j = 0; sTrainers[trainerNum].trainerName[j] != EOS; j++) nameHash += sTrainers[trainerNum].trainerName[j]; switch (sTrainers[trainerNum].partyFlags) { case 0: { const struct TrainerMonNoItemDefaultMoves *partyData = sTrainers[trainerNum].party.NoItemDefaultMoves; for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j) nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; if(ivCalcMode == IV_CALC_PERFECT) fixedIV = MAX_PER_STAT_IVS; else fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; CreateMon(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); break; } case F_TRAINER_PARTY_CUSTOM_MOVESET: { const struct TrainerMonNoItemCustomMoves *partyData = sTrainers[trainerNum].party.NoItemCustomMoves; for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j) nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; if(ivCalcMode == IV_CALC_PERFECT) fixedIV = MAX_PER_STAT_IVS; else fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; CreateMon(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); for (j = 0; j < MAX_MON_MOVES; ++j) { SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); } break; } case F_TRAINER_PARTY_HELD_ITEM: { const struct TrainerMonItemDefaultMoves *partyData = sTrainers[trainerNum].party.ItemDefaultMoves; for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j) nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; if(ivCalcMode == IV_CALC_PERFECT) fixedIV = MAX_PER_STAT_IVS; else fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; CreateMon(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); break; } case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM: { const struct TrainerMonItemCustomMoves *partyData = sTrainers[trainerNum].party.ItemCustomMoves; for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j) nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += ((nameHash << 8) - partyData[i].abilityNum); if(ivCalcMode == IV_CALC_PERFECT) fixedIV = MAX_PER_STAT_IVS; if((trainerNum == TRAINER_LEADER_LT_SURGE_CHALLENGE || TRAINER_CHAMPION_FIRST_SQUIRTLE_CHALLENGE) && i == 3) //preserving Hidden Power IVs fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; else if(trainerNum == TRAINER_CHAMPION_FIRST_BULBASAUR_CHALLENGE && i == 4) //preserving Hidden Power IVs fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; else if(ivCalcMode != IV_CALC_PERFECT) fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; if(inBattleHouse) { level = partyData[i].lvl + ReturnBattleHouseLevel(); if(level > 75) level = 75; CreateMon(&party[i], partyData[i].species, level + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); } else CreateMon(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); for (j = 0; j < MAX_MON_MOVES; ++j) { SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); } break; } case F_TRAINER_PARTY_EVS: { const struct TrainerMonItemCustomMovesEVs *partyData = sTrainers[trainerNum].party.ItemCustomMovesEVs; u8 gender; u8 friendship = 255; for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j) nameHash += gSpeciesNames[partyData[i].species][j]; if (sTrainers[trainerNum].encounterMusic_gender & 0x80) gender = MON_FEMALE; else gender = MON_MALE; if(ivCalcMode == IV_CALC_PERFECT) fixedIV = MAX_PER_STAT_IVS; else fixedIV = partyData[i].iv; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE) || inBattleHouse) fixedIV = partyData[i].iv; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) CreateMonWithGenderNatureAbility(&party[i], partyData[i].species, GetMonData(&gPlayerParty[0], MON_DATA_LEVEL, NULL), fixedIV, gender, partyData[i].nature, partyData[i].abilityNum); else if(inBattleHouse) { level = partyData[i].lvl + ReturnBattleHouseLevel(); if(level > 75) level = 75; CreateMonWithGenderNatureAbility(&party[i], partyData[i].species, level + levelScaling, fixedIV, gender, partyData[i].nature, partyData[i].abilityNum); } else { if(gMapHeader.mapLayoutId == LAYOUT_PALLET_TOWN_PROFESSOR_OAKS_LAB) { //special casing superboss battle with Oak if(gSaveBlock1Ptr->keyFlags.difficulty == DIFFICULTY_CHALLENGE) levelScaling = 5; else if(gSaveBlock1Ptr->keyFlags.difficulty == DIFFICULTY_EASY) levelScaling = -5; else levelScaling = 0; } CreateMonWithGenderNatureAbility(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, gender, partyData[i].nature, partyData[i].abilityNum); } SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); for (j = 0; j < MAX_MON_MOVES; ++j) { SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); } for (j = 0; j < NUM_STATS; j++) { SetMonData(&party[i], MON_DATA_HP_EV + j, &partyData[i].evs[j]); } SetMonData(&party[i], MON_DATA_FRIENDSHIP, &friendship); CalculateMonStats(&party[i], FALSE); break; } } } gBattleTypeFlags |= sTrainers[trainerNum].doubleBattle; } return sTrainers[trainerNum].partySize; } // Unused static void HBlankCB_Battle(void) { if (REG_VCOUNT < DISPLAY_HEIGHT && REG_VCOUNT >= 111) REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x512; } void VBlankCB_Battle(void) { // Change gRngSeed every vblank. Random(); SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X); SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y); SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN1H); SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN1V); LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); ScanlineEffect_InitHBlankDmaTransfer(); } void SpriteCB_VsLetterDummy(struct Sprite *sprite) { } static void SpriteCB_VsLetter(struct Sprite *sprite) { if (sprite->data[0] != 0) sprite->x = sprite->data[1] + ((sprite->data[2] & 0xFF00) >> 8); else sprite->x = sprite->data[1] - ((sprite->data[2] & 0xFF00) >> 8); sprite->data[2] += 0x180; if (sprite->affineAnimEnded) { FreeSpriteTilesByTag(ANIM_SPRITES_START); FreeSpritePaletteByTag(ANIM_SPRITES_START); FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } void SpriteCB_VsLetterInit(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, 1); sprite->callback = SpriteCB_VsLetter; PlaySE(SE_MUGSHOT); } static void BufferPartyVsScreenHealth_AtEnd(u8 taskId) { struct Pokemon *party1 = NULL; struct Pokemon *party2 = NULL; u8 multiplayerId = gBattleStruct->multiplayerId; u32 flags; s32 i; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { switch (gLinkPlayers[multiplayerId].id) { case 0: case 2: party1 = gPlayerParty; party2 = gEnemyParty; break; case 1: case 3: party1 = gEnemyParty; party2 = gPlayerParty; break; } } else { party1 = gPlayerParty; party2 = gEnemyParty; } flags = 0; BUFFER_PARTY_VS_SCREEN_STATUS(party1, flags, i); gTasks[taskId].data[3] = flags; flags = 0; BUFFER_PARTY_VS_SCREEN_STATUS(party2, flags, i); gTasks[taskId].data[4] = flags; } void CB2_InitEndLinkBattle(void) { s32 i; u8 taskId; SetHBlankCallback(NULL); SetVBlankCallback(NULL); CpuFill32(0, (void *)VRAM, VRAM_SIZE); SetGpuReg(REG_OFFSET_MOSAIC, 0); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0xF0)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0x50, 0x51)); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); gBattle_WIN0H = WIN_RANGE(0, 0xF0); gBattle_WIN0V = WIN_RANGE(0x50, 0x51); ScanlineEffect_Clear(); for (i = 0; i < 80; i++) { gScanlineEffectRegBuffers[0][i] = 0xF0; gScanlineEffectRegBuffers[1][i] = 0xF0; } for (; i < 160; i++) { gScanlineEffectRegBuffers[0][i] = 0xFF10; gScanlineEffectRegBuffers[1][i] = 0xFF10; } ResetPaletteFade(); gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; gBattle_BG3_X = 0; gBattle_BG3_Y = 0; InitBattleBgsVideo(); LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadBattleMenuWindowGfx(); ResetSpriteData(); ResetTasks(); DrawBattleEntryBackground(); SetGpuReg(REG_OFFSET_WINOUT, WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; SetVBlankCallback(VBlankCB_Battle); taskId = CreateTask(InitLinkBattleVsScreen, 0); gTasks[taskId].data[1] = 270; gTasks[taskId].data[2] = 90; gTasks[taskId].data[5] = 1; BufferPartyVsScreenHealth_AtEnd(taskId); SetMainCallback2(CB2_EndLinkBattle); gBattleCommunication[MULTIUSE_STATE] = 0; } static void CB2_EndLinkBattle(void) { EndLinkBattleInSteps(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); RunTasks(); } static void EndLinkBattleInSteps(void) { s32 i; switch (gBattleCommunication[MULTIUSE_STATE]) { case 0: ShowBg(0); ShowBg(1); ShowBg(2); gBattleCommunication[1] = 0xFF; gBattleCommunication[MULTIUSE_STATE]++; break; case 1: if (--gBattleCommunication[1] == 0) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE]++; } break; case 2: if (!gPaletteFade.active) { SetMainCallback2(gMain.savedCallback); TrySetQuestLogLinkBattleEvent(); FreeMonSpritesGfx(); FreeBattleSpritesData(); FreeBattleResources(); } break; } } u32 GetBattleBgTemplateData(u8 arrayId, u8 caseId) { u32 ret = 0; switch (caseId) { case 0: ret = gBattleBgTemplates[arrayId].bg; break; case 1: ret = gBattleBgTemplates[arrayId].charBaseIndex; break; case 2: ret = gBattleBgTemplates[arrayId].mapBaseIndex; break; case 3: ret = gBattleBgTemplates[arrayId].screenSize; break; case 4: ret = gBattleBgTemplates[arrayId].paletteMode; break; case 5: ret = gBattleBgTemplates[arrayId].priority; break; case 6: ret = gBattleBgTemplates[arrayId].baseTile; break; } return ret; } static void TryCorrectShedinjaLanguage(struct Pokemon *mon) { u8 nickname[POKEMON_NAME_LENGTH + 1]; u8 language = LANGUAGE_JAPANESE; if (GetMonData(mon, MON_DATA_SPECIES) == SPECIES_SHEDINJA && GetMonData(mon, MON_DATA_LANGUAGE) != language) { GetMonData(mon, MON_DATA_NICKNAME, nickname); if (StringCompareWithoutExtCtrlCodes(nickname, sText_ShedinjaJpnName) == 0) SetMonData(mon, MON_DATA_LANGUAGE, &language); } } #define sBattler data[0] #define sSpeciesId data[2] void SpriteCB_EnemyMon(struct Sprite *sprite) { sprite->callback = SpriteCB_MoveWildMonToRight; StartSpriteAnimIfDifferent(sprite, 0); BeginNormalPaletteFade(0x20000, 0, 10, 10, RGB(8, 8, 8)); } static void SpriteCB_MoveWildMonToRight(struct Sprite *sprite) { if(gSaveBlock2Ptr->optionsBattleIntroAnim) sprite->invisible = TRUE; if ((gIntroSlideFlags & 1) == 0) { if(gSaveBlock2Ptr->optionsBattleIntroAnim == 0) sprite->x2 += 2; if (sprite->x2 == 0) { sprite->invisible = FALSE; sprite->callback = SpriteCB_WildMonShowHealthbox; PlayCry_Normal(sprite->data[2], 25); } } } static void SpriteCB_WildMonShowHealthbox(struct Sprite *sprite) { if (sprite->animEnded) { StartHealthboxSlideIn(sprite->sBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]); sprite->callback = SpriteCallbackDummy_2; StartSpriteAnimIfDifferent(sprite, 0); BeginNormalPaletteFade(0x20000, 0, 10, 0, RGB(8, 8, 8)); } } void SpriteCallbackDummy_2(struct Sprite *sprite) { } #define sNumFlickers data[3] #define sDelay data[4] // Unused static void SpriteCB_InitFlicker(struct Sprite *sprite) { sprite->sNumFlickers = 6; sprite->sDelay = 1; sprite->callback = SpriteCB_Flicker; } static void SpriteCB_Flicker(struct Sprite *sprite) { sprite->sDelay--; if (sprite->sDelay == 0) { sprite->sDelay = 8; sprite->invisible ^= 1; sprite->sNumFlickers--; if (sprite->sNumFlickers == 0) { sprite->invisible = FALSE; sprite->callback = SpriteCallbackDummy_2; sFlickerArray[0] = 0; } } } #undef sNumFlickers #undef sDelay void SpriteCB_FaintOpponentMon(struct Sprite *sprite) { u8 battler = sprite->sBattler; u16 species; u8 yOffset; if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != 0) species = gBattleSpritesDataPtr->battlerData[battler].transformSpecies; else species = sprite->sSpeciesId; GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); // Unused return value. if (species == SPECIES_UNOWN) { u32 personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); u16 unownForm = GET_UNOWN_LETTER(personalityValue); u16 unownSpecies; if (unownForm == 0) unownSpecies = SPECIES_UNOWN; // Use the A Unown form. else unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters. yOffset = gMonFrontPicCoords[unownSpecies].y_offset; } else if (species == SPECIES_CASTFORM) { yOffset = gCastformFrontSpriteCoords[gBattleMonForms[battler]].y_offset; } else if (species > NUM_SPECIES) { yOffset = gMonFrontPicCoords[SPECIES_NONE].y_offset; } else { yOffset = gMonFrontPicCoords[species].y_offset; } sprite->data[3] = 8 - yOffset / 8; sprite->data[4] = 1; sprite->callback = SpriteCB_AnimFaintOpponent; } static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite) { s32 i; if (--sprite->data[4] == 0) { sprite->data[4] = 2; sprite->y2 += 8; // Move the sprite down. if (--sprite->data[3] < 0) { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } else // Erase bottom part of the sprite to create a smooth illusion of mon falling down. { u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBattlerPosition(sprite->sBattler)] + (gBattleMonForms[sprite->sBattler] << 11) + (sprite->data[3] << 8); for (i = 0; i < 0x100; i++) *(dst++) = 0; StartSpriteAnim(sprite, gBattleMonForms[sprite->sBattler]); } } } // Used when selecting a move, which can hit multiple targets, in double battles. void SpriteCB_ShowAsMoveTarget(struct Sprite *sprite) { sprite->data[3] = 8; sprite->data[4] = sprite->invisible; sprite->callback = SpriteCB_BlinkVisible; } static void SpriteCB_BlinkVisible(struct Sprite *sprite) { if (--sprite->data[3] == 0) { sprite->invisible ^= 1; sprite->data[3] = 8; } } void SpriteCB_HideAsMoveTarget(struct Sprite *sprite) { sprite->invisible = sprite->data[4]; sprite->data[4] = FALSE; sprite->callback = SpriteCallbackDummy_2; } void SpriteCB_AllyMon(struct Sprite *sprite) { sprite->callback = oac_poke_ally_; } static void oac_poke_ally_(struct Sprite *sprite) { if (!(gIntroSlideFlags & 1)) { sprite->x2 -= 2; if (sprite->x2 == 0) { sprite->callback = SpriteCB_Idle; sprite->data[1] = 0; } } } void SetIdleSpriteCallback(struct Sprite *sprite) { sprite->callback = SpriteCB_Idle; } static void SpriteCB_Idle(struct Sprite *sprite) { } #define sSpeedX data[1] #define sSpeedY data[2] void SpriteCB_FaintSlideAnim(struct Sprite *sprite) { if (!(gIntroSlideFlags & 1)) { sprite->x2 += sprite->sSpeedX; sprite->y2 += sprite->sSpeedY; } } #define sSpeedX data[1] #define sSpeedY data[2] #define sSinIndex data[0] #define sDelta data[1] #define sAmplitude data[2] #define sBouncerSpriteId data[3] #define sWhich data[4] void DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude) { u8 invisibleSpriteId; u8 bouncerSpriteId; switch (which) { case BOUNCE_HEALTHBOX: default: if (gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing) return; break; case BOUNCE_MON: if (gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing) return; break; } invisibleSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_BounceEffect); if (which == BOUNCE_HEALTHBOX) { bouncerSpriteId = gHealthboxSpriteIds[battler]; gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId = invisibleSpriteId; gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 1; gSprites[invisibleSpriteId].sSinIndex = 128; // 0 } else { bouncerSpriteId = gBattlerSpriteIds[battler]; gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId = invisibleSpriteId; gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 1; gSprites[invisibleSpriteId].sSinIndex = 192; // -1 } gSprites[invisibleSpriteId].sDelta = delta; gSprites[invisibleSpriteId].sAmplitude = amplitude; gSprites[invisibleSpriteId].sBouncerSpriteId = bouncerSpriteId; gSprites[invisibleSpriteId].sWhich = which; gSprites[bouncerSpriteId].x2 = 0; gSprites[bouncerSpriteId].y2 = 0; } void EndBounceEffect(u8 battler, u8 which) { u8 bouncerSpriteId; if (which == BOUNCE_HEALTHBOX) { if (!gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing) return; bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId].sBouncerSpriteId; DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId]); gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 0; } else { if (!gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing) return; bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId].sBouncerSpriteId; DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId]); gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 0; } gSprites[bouncerSpriteId].x2 = 0; gSprites[bouncerSpriteId].y2 = 0; } static void SpriteCB_BounceEffect(struct Sprite *sprite) { u8 bouncerSpriteId = sprite->sBouncerSpriteId; s32 index; if (sprite->sWhich == BOUNCE_HEALTHBOX) index = sprite->sSinIndex; else index = sprite->sSinIndex; gSprites[bouncerSpriteId].y2 = Sin(index, sprite->sAmplitude) + sprite->sAmplitude; sprite->sSinIndex = (sprite->sSinIndex + sprite->sDelta) & 0xFF; } void SpriteCB_PlayerThrowInit(struct Sprite *sprite) { StartSpriteAnim(sprite, 1); sprite->callback = SpriteCB_PlayerThrowUpdate; } void UpdatePlayerPosInThrowAnim(struct Sprite *sprite) { if (sprite->animDelayCounter == 0) sprite->centerToCornerVecX = sPlayerThrowXTranslation[sprite->animCmdIndex]; } static void SpriteCB_PlayerThrowUpdate(struct Sprite *sprite) { UpdatePlayerPosInThrowAnim(sprite); if (sprite->animEnded) sprite->callback = SpriteCB_Idle; } void BeginBattleIntroDummy(void) { } void BeginBattleIntro(void) { BattleStartClearSetData(); gBattleCommunication[1] = 0; gBattleMainFunc = BattleIntroGetMonsData; } static void BattleMainCB1(void) { gBattleMainFunc(); for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) gBattlerControllerFuncs[gActiveBattler](); } static void BattleStartClearSetData(void) { s32 i; u32 j; u8 *dataPtr; TurnValuesCleanUp(FALSE); SpecialStatusesClear(); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gStatuses3[i] = 0; dataPtr = (u8 *)&gDisableStructs[i]; for (j = 0; j < sizeof(struct DisableStruct); j++) dataPtr[j] = 0; gDisableStructs[i].isFirstTurn = 2; sUnusedBattlersArray[i] = 0; gLastMoves[i] = MOVE_NONE; gLastLandedMoves[i] = MOVE_NONE; gLastHitByType[i] = 0; gLastResultingMoves[i] = MOVE_NONE; gLastHitBy[i] = 0xFF; gLockedMoves[i] = MOVE_NONE; gLastPrintedMoves[i] = MOVE_NONE; gBattleResources->flags->flags[i] = 0; } for (i = 0; i < 2; i++) { gSideStatuses[i] = 0; dataPtr = (u8 *)&gSideTimers[i]; for (j = 0; j < sizeof(struct SideTimer); j++) dataPtr[j] = 0; } gBattlerAttacker = 0; gBattlerTarget = 0; gBattleWeather = 0; dataPtr = (u8 *)&gWishFutureKnock; for (i = 0; i < sizeof(struct WishFutureKnock); i++) dataPtr[i] = 0; gHitMarker = 0; if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_POKEDUDE)) && gSaveBlock2Ptr->optionsBattleSceneOff) gHitMarker |= HITMARKER_NO_ANIMATIONS; gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; gMultiHitCounter = 0; gBattleOutcome = 0; gBattleControllerExecFlags = 0; gPaydayMoney = 0; gBattleResources->battleScriptsStack->size = 0; gBattleResources->battleCallbackStack->size = 0; for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++) gBattleCommunication[i] = 0; gPauseCounterBattle = 0; gBattleMoveDamage = 0; gIntroSlideFlags = 0; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gLeveledUpInBattle = 0; gAbsentBattlerFlags = 0; gBattleStruct->runTries = 0; gBattleStruct->safariRockThrowCounter = 0; gBattleStruct->safariBaitThrowCounter = 0; *(&gBattleStruct->safariCatchFactor) = gSpeciesInfo[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; *(&gBattleStruct->safariEscapeFactor) = gSpeciesInfo[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].safariZoneFleeRate * 100 / 1275; if (gBattleStruct->safariEscapeFactor <= 1) gBattleStruct->safariEscapeFactor = 2; gBattleStruct->wildVictorySong = 0; gBattleStruct->moneyMultiplier = 1; for (i = 0; i < 8; i++) { *((u8 *)gBattleStruct->lastTakenMove + i) = MOVE_NONE; *((u8 *)gBattleStruct->usedHeldItems + i) = ITEM_NONE; *((u8 *)gBattleStruct->choicedMove + i) = MOVE_NONE; *((u8 *)gBattleStruct->changedItems + i) = ITEM_NONE; *(i + 0 * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(i + 1 * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(i + 2 * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(i + 3 * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; } *(gBattleStruct->AI_monToSwitchIntoId + 0) = PARTY_SIZE; *(gBattleStruct->AI_monToSwitchIntoId + 1) = PARTY_SIZE; *(&gBattleStruct->givenExpMons) = 0; for (i = 0; i < 11; i++) gBattleResults.catchAttempts[i] = 0; gBattleResults.battleTurnCounter = 0; gBattleResults.playerFaintCounter = 0; gBattleResults.opponentFaintCounter = 0; gBattleResults.playerSwitchesCounter = 0; gBattleResults.numHealingItemsUsed = 0; gBattleResults.numRevivesUsed = 0; gBattleResults.playerMonWasDamaged = FALSE; gBattleResults.usedMasterBall = FALSE; gBattleResults.lastOpponentSpecies = SPECIES_NONE; gBattleResults.lastUsedMovePlayer = MOVE_NONE; gBattleResults.lastUsedMoveOpponent = MOVE_NONE; gBattleResults.playerMon1Species = SPECIES_NONE; gBattleResults.playerMon2Species = SPECIES_NONE; gBattleResults.caughtMonSpecies = SPECIES_NONE; for (i = 0; i < POKEMON_NAME_LENGTH; ++i) { gBattleResults.playerMon1Name[i] = 0; gBattleResults.playerMon2Name[i] = 0; gBattleResults.caughtMonNick[i] = 0; } } void SwitchInClearSetData(void) { struct DisableStruct disableStructCopy = gDisableStructs[gActiveBattler]; s32 i; u8 *ptr; if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS) { for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; for (i = 0; i < gBattlersCount; i++) { if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == gActiveBattler) gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].battlerWithSureHit == gActiveBattler) { gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; gDisableStructs[i].battlerWithSureHit = 0; } } } if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) { gBattleMons[gActiveBattler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT); for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(gActiveBattler) != GetBattlerSide(i) && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0 && (gDisableStructs[i].battlerWithSureHit == gActiveBattler)) { gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; gStatuses3[i] |= STATUS3_ALWAYS_HITS_TURN(2); } } } else { gBattleMons[gActiveBattler].status2 = 0; gStatuses3[gActiveBattler] = 0; } for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBattler)) gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(gActiveBattler); if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler) gBattleMons[i].status2 &= ~STATUS2_WRAPPED; } gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; ptr = (u8 *)&gDisableStructs[gActiveBattler]; for (i = 0; i < sizeof(struct DisableStruct); i++) ptr[i] = 0; if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) { gDisableStructs[gActiveBattler].substituteHP = disableStructCopy.substituteHP; gDisableStructs[gActiveBattler].battlerWithSureHit = disableStructCopy.battlerWithSureHit; gDisableStructs[gActiveBattler].perishSongTimer = disableStructCopy.perishSongTimer; gDisableStructs[gActiveBattler].perishSongTimerStartValue = disableStructCopy.perishSongTimerStartValue; gDisableStructs[gActiveBattler].battlerPreventingEscape = disableStructCopy.battlerPreventingEscape; } gMoveResultFlags = 0; gDisableStructs[gActiveBattler].isFirstTurn = 2; gLastMoves[gActiveBattler] = MOVE_NONE; gLastLandedMoves[gActiveBattler] = MOVE_NONE; gLastHitByType[gActiveBattler] = 0; gLastResultingMoves[gActiveBattler] = MOVE_NONE; gLastPrintedMoves[gActiveBattler] = MOVE_NONE; gLastHitBy[gActiveBattler] = 0xFF; *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 0) = MOVE_NONE; *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 1) = MOVE_NONE; *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; *(1 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(1 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; for (i = 0; i < gBattlersCount; i++) { if (i != gActiveBattler) { *(gBattleStruct->lastTakenMove + i * 2 + 0) = MOVE_NONE; *(gBattleStruct->lastTakenMove + i * 2 + 1) = MOVE_NONE; } *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; } *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = MOVE_NONE; *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = MOVE_NONE; gBattleResources->flags->flags[gActiveBattler] = 0; gCurrentMove = MOVE_NONE; } void FaintClearSetData(void) { s32 i; u8 *ptr; for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; gBattleMons[gActiveBattler].status2 = 0; gStatuses3[gActiveBattler] = 0; for (i = 0; i < gBattlersCount; i++) { if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == gActiveBattler) gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBattler)) gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(gActiveBattler); if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler) gBattleMons[i].status2 &= ~STATUS2_WRAPPED; } gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; ptr = (u8 *)&gDisableStructs[gActiveBattler]; for (i = 0; i < sizeof(struct DisableStruct); i++) ptr[i] = 0; gProtectStructs[gActiveBattler].protected = FALSE; gProtectStructs[gActiveBattler].endured = FALSE; gProtectStructs[gActiveBattler].noValidMoves = FALSE; gProtectStructs[gActiveBattler].helpingHand = FALSE; gProtectStructs[gActiveBattler].bounceMove = FALSE; gProtectStructs[gActiveBattler].stealMove = FALSE; gProtectStructs[gActiveBattler].flag0Unknown = FALSE; gProtectStructs[gActiveBattler].prlzImmobility = FALSE; gProtectStructs[gActiveBattler].confusionSelfDmg = FALSE; gProtectStructs[gActiveBattler].targetNotAffected = FALSE; gProtectStructs[gActiveBattler].chargingTurn = FALSE; gProtectStructs[gActiveBattler].fleeType = 0; gProtectStructs[gActiveBattler].usedImprisonedMove = FALSE; gProtectStructs[gActiveBattler].loveImmobility = FALSE; gProtectStructs[gActiveBattler].usedDisabledMove = FALSE; gProtectStructs[gActiveBattler].usedTauntedMove = FALSE; gProtectStructs[gActiveBattler].flag2Unknown = FALSE; gProtectStructs[gActiveBattler].flinchImmobility = FALSE; gProtectStructs[gActiveBattler].notFirstStrike = FALSE; gDisableStructs[gActiveBattler].isFirstTurn = 2; gLastMoves[gActiveBattler] = MOVE_NONE; gLastLandedMoves[gActiveBattler] = MOVE_NONE; gLastHitByType[gActiveBattler] = 0; gLastResultingMoves[gActiveBattler] = MOVE_NONE; gLastPrintedMoves[gActiveBattler] = MOVE_NONE; gLastHitBy[gActiveBattler] = 0xFF; *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = MOVE_NONE; *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = MOVE_NONE; *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 0) = MOVE_NONE; *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 1) = MOVE_NONE; *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; *(1 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(1 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; for (i = 0; i < gBattlersCount; i++) { if (i != gActiveBattler) { *(gBattleStruct->lastTakenMove + i * 2 + 0) = MOVE_NONE; *(gBattleStruct->lastTakenMove + i * 2 + 1) = MOVE_NONE; } *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; } gBattleResources->flags->flags[gActiveBattler] = 0; gBattleMons[gActiveBattler].type1 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; gBattleMons[gActiveBattler].type2 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; } static void BattleIntroGetMonsData(void) { switch (gBattleCommunication[MULTIUSE_STATE]) { case 0: gActiveBattler = gBattleCommunication[1]; BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[MULTIUSE_STATE]++; break; case 1: if (gBattleControllerExecFlags == 0) { gBattleCommunication[1]++; if (gBattleCommunication[1] == gBattlersCount) gBattleMainFunc = BattleIntroPrepareBackgroundSlide; else gBattleCommunication[MULTIUSE_STATE] = 0; } break; } } static void BattleIntroPrepareBackgroundSlide(void) { if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerAtPosition(0); BtlController_EmitIntroSlide(BUFFER_A, gBattleTerrain); MarkBattlerForControllerExec(gActiveBattler); gBattleMainFunc = BattleIntroDrawTrainersOrMonsSprites; gBattleCommunication[MULTIUSE_STATE] = 0; gBattleCommunication[SPRITES_INIT_STATE1] = 0; } } static void BattleIntroDrawTrainersOrMonsSprites(void) { u8 *ptr; s32 i; if (gBattleControllerExecFlags) return; for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { ptr = (u8 *)&gBattleMons[gActiveBattler]; for (i = 0; i < sizeof(struct BattlePokemon); i++) ptr[i] = 0; } else { u16 *hpOnSwitchout; ptr = (u8 *)&gBattleMons[gActiveBattler]; for (i = 0; i < sizeof(struct BattlePokemon); i++) ptr[i] = gBattleBufferB[gActiveBattler][4 + i]; gBattleMons[gActiveBattler].type1 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; gBattleMons[gActiveBattler].type2 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)]; *hpOnSwitchout = gBattleMons[gActiveBattler].hp; for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; gBattleMons[gActiveBattler].status2 = 0; } if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { BtlController_EmitDrawTrainerPic(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { BtlController_EmitDrawTrainerPic(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_LINK | BATTLE_TYPE_GHOST | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_LEGENDARY))) HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); } else { if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) { if (gBattleTypeFlags & (BATTLE_TYPE_GHOST | BATTLE_TYPE_GHOST_UNVEILED)) { if (!IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); } else if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_LINK | BATTLE_TYPE_GHOST | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_LEGENDARY))) { HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); } BtlController_EmitLoadMonSprite(0); MarkBattlerForControllerExec(gActiveBattler); } } if (gBattleTypeFlags & BATTLE_TYPE_MULTI && (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)) { BtlController_EmitDrawTrainerPic(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } } gBattleMainFunc = BattleIntroDrawPartySummaryScreens; } static void BattleIntroDrawPartySummaryScreens(void) { s32 i; struct HpAndStatus hpStatus[PARTY_SIZE]; if (gBattleControllerExecFlags) return; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) { hpStatus[i].hp = HP_EMPTY_SLOT; hpStatus[i].status = 0; } else { hpStatus[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); } } gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(gActiveBattler); for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) { hpStatus[i].hp = HP_EMPTY_SLOT; hpStatus[i].status = 0; } else { hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); } } gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(gActiveBattler); gBattleMainFunc = BattleIntroPrintTrainerWantsToBattle; } else { // The struct gets set here, but nothing is ever done with it since // wild battles don't show the party summary. // Still, there's no point in having dead code. for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) { hpStatus[i].hp = HP_EMPTY_SLOT; hpStatus[i].status = 0; } else { hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); } } gBattleMainFunc = BattleIntroPrintWildMonAttacked; } } static void BattleIntroPrintTrainerWantsToBattle(void) { if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); PrepareStringBattle(STRINGID_INTROMSG, gActiveBattler); gBattleMainFunc = BattleIntroPrintOpponentSendsOut; } } static void BattleIntroPrintWildMonAttacked(void) { if (gBattleControllerExecFlags == 0) { gBattleMainFunc = BattleIntroPrintPlayerSendsOut; PrepareStringBattle(STRINGID_INTROMSG, 0); if (IS_BATTLE_TYPE_GHOST_WITH_SCOPE(gBattleTypeFlags)) { gBattleScripting.battler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); BattleScriptExecute(BattleScript_SilphScopeUnveiled); } } } static void BattleIntroPrintOpponentSendsOut(void) { if (gBattleControllerExecFlags == 0) { PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); gBattleMainFunc = BattleIntroOpponentSendsOutMonAnimation; } } static void BattleIntroOpponentSendsOutMonAnimation(void) { if (gBattleControllerExecFlags == 0) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { BtlController_EmitIntroTrainerBallThrow(0); MarkBattlerForControllerExec(gActiveBattler); } if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { BtlController_EmitIntroTrainerBallThrow(0); MarkBattlerForControllerExec(gActiveBattler); } } gBattleMainFunc = BattleIntroRecordMonsToDex; } } static void BattleIntroRecordMonsToDex(void) { if (gBattleControllerExecFlags == 0) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_LINK | BATTLE_TYPE_GHOST | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_LEGENDARY))) HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); gBattleMainFunc = BattleIntroPrintPlayerSendsOut; } } // not used static void Unused_AutoProgressToIntro(void) { if (gBattleControllerExecFlags == 0) gBattleMainFunc = BattleIntroPrintPlayerSendsOut; } static void BattleIntroPrintPlayerSendsOut(void) { if (gBattleControllerExecFlags == 0) { if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); gBattleMainFunc = BattleIntroPlayerSendsOutMonAnimation; } } static void BattleIntroPlayerSendsOutMonAnimation(void) { u32 position; if (gBattleControllerExecFlags) return; for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { BtlController_EmitIntroTrainerBallThrow(0); MarkBattlerForControllerExec(gActiveBattler); } if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT) { BtlController_EmitIntroTrainerBallThrow(0); MarkBattlerForControllerExec(gActiveBattler); } } gBattleStruct->switchInAbilitiesCounter = 0; gBattleStruct->switchInItemsCounter = 0; gBattleStruct->overworldWeatherDone = FALSE; gBattleMainFunc = TryDoEventsBeforeFirstTurn; } // Unused static void BattleIntroSwitchInPlayerMons(void) { if (gBattleControllerExecFlags == 0) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { BtlController_EmitSwitchInAnim(BUFFER_A, gBattlerPartyIndexes[gActiveBattler], FALSE); MarkBattlerForControllerExec(gActiveBattler); } } gBattleStruct->switchInAbilitiesCounter = 0; gBattleStruct->switchInItemsCounter = 0; gBattleStruct->overworldWeatherDone = FALSE; gBattleMainFunc = TryDoEventsBeforeFirstTurn; } } static void TryDoEventsBeforeFirstTurn(void) { s32 i, j; u8 effect = 0; if (gBattleControllerExecFlags) return; if (gBattleStruct->switchInAbilitiesCounter == 0) { for (i = 0; i < gBattlersCount; i++) gBattlerByTurnOrder[i] = i; for (i = 0; i < gBattlersCount - 1; i++) for (j = i + 1; j < gBattlersCount; j++) if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], TRUE) != 0) SwapTurnOrder(i, j); } if (!gBattleStruct->overworldWeatherDone && AbilityBattleEffects(0, 0, 0, ABILITYEFFECT_SWITCH_IN_WEATHER, 0) != 0) { gBattleStruct->overworldWeatherDone = TRUE; return; } // Check all switch in abilities happening from the fastest mon to slowest. while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount) { if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0) effect++; ++gBattleStruct->switchInAbilitiesCounter; if (effect != 0) return; } if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) != 0) return; if (AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) != 0) return; // Check all switch in items having effect from the fastest mon to slowest. while (gBattleStruct->switchInItemsCounter < gBattlersCount) { if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattlerByTurnOrder[gBattleStruct->switchInItemsCounter], FALSE)) effect++; ++gBattleStruct->switchInItemsCounter; if (effect != 0) return; } for (i = 0; i < gBattlersCount; i++) // pointless, ruby leftover ; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; } TurnValuesCleanUp(FALSE); SpecialStatusesClear(); *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags; gBattleMainFunc = HandleTurnActionSelectionState; ResetSentPokesToOpponentValue(); for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++) gBattleCommunication[i] = 0; for (i = 0; i < gBattlersCount; i++) gBattleMons[i].status2 &= ~(STATUS2_FLINCHED); *(&gBattleStruct->turnEffectsTracker) = 0; *(&gBattleStruct->turnEffectsBattlerId) = 0; *(&gBattleStruct->wishPerishSongState) = 0; *(&gBattleStruct->wishPerishSongBattlerId) = 0; gBattleScripting.moveendState = 0; gBattleStruct->faintedActionsState = 0; gBattleStruct->turnCountersTracker = 0; gMoveResultFlags = 0; gRandomTurnNumber = Random(); } static void HandleEndTurn_ContinueBattle(void) { s32 i; if (gBattleControllerExecFlags == 0) { gBattleMainFunc = BattleTurnPassed; for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++) gBattleCommunication[i] = 0; for (i = 0; i < gBattlersCount; i++) { gBattleMons[i].status2 &= ~(STATUS2_FLINCHED); if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS)) CancelMultiTurnMoves(i); } gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId = 0; gBattleStruct->wishPerishSongState = 0; gBattleStruct->wishPerishSongBattlerId = 0; gBattleStruct->turnCountersTracker = 0; gMoveResultFlags = 0; } } void BattleTurnPassed(void) { s32 i; TurnValuesCleanUp(TRUE); if (gBattleOutcome == 0) { if (DoFieldEndTurnEffects()) return; if (DoBattlerEndTurnEffects()) return; } if (HandleFaintedMonActions()) return; gBattleStruct->faintedActionsState = 0; if (HandleWishPerishSongOnTurnEnd()) return; TurnValuesCleanUp(FALSE); gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING); gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE); gHitMarker &= ~(HITMARKER_PLAYER_FAINTED); gHitMarker &= ~(HITMARKER_PASSIVE_DAMAGE); gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gBattleScripting.moveendState = 0; gBattleMoveDamage = 0; gMoveResultFlags = 0; for (i = 0; i < 5; i++) gBattleCommunication[i] = 0; if (gBattleOutcome != 0) { gCurrentActionFuncId = B_ACTION_FINISHED; gBattleMainFunc = RunTurnActionsFunctions; return; } if (gBattleResults.battleTurnCounter < 0xFF) ++gBattleResults.battleTurnCounter; for (i = 0; i < gBattlersCount; i++) { gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; } for (i = 0; i < MAX_BATTLERS_COUNT; i++) *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags; gBattleMainFunc = HandleTurnActionSelectionState; gRandomTurnNumber = Random(); } u8 IsRunningFromBattleImpossible(void) { u8 holdEffect; u8 side; s32 i; if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gActiveBattler].holdEffect; else holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item); gPotentialItemEffectBattler = gActiveBattler; if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN || (gBattleTypeFlags & BATTLE_TYPE_LINK) || gBattleMons[gActiveBattler].ability == ABILITY_RUN_AWAY) return BATTLE_RUN_SUCCESS; side = GetBattlerSide(gActiveBattler); for (i = 0; i < gBattlersCount; i++) { if (side != GetBattlerSide(i) && gBattleMons[i].ability == ABILITY_SHADOW_TAG) { gBattleScripting.battler = i; gLastUsedAbility = gBattleMons[i].ability; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return BATTLE_RUN_FAILURE; } if (side != GetBattlerSide(i) && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) && gBattleMons[i].ability == ABILITY_ARENA_TRAP) { gBattleScripting.battler = i; gLastUsedAbility = gBattleMons[i].ability; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return BATTLE_RUN_FAILURE; } } i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0); if (i != 0 && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL)) { gBattleScripting.battler = i - 1; gLastUsedAbility = gBattleMons[i - 1].ability; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return BATTLE_RUN_FAILURE; } if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; return BATTLE_RUN_FORBIDDEN; } if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { gBattleCommunication[MULTISTRING_CHOOSER] = 1; return BATTLE_RUN_FORBIDDEN; } return BATTLE_RUN_SUCCESS; } void UpdatePartyOwnerOnSwitch_NonMulti(u8 battler) { s32 i; u8 r4, r1; for (i = 0; i < 3; i++) gBattlePartyCurrentOrder[i] = *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)); r4 = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battler]); r1 = GetPartyIdFromBattlePartyId(*(gBattleStruct->monToSwitchIntoId + battler)); SwitchPartyMonSlots(r4, r1); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { for (i = 0; i < 3; i++) { *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; *(BATTLE_PARTNER(battler) * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; } } else { for (i = 0; i < 3; i++) *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; } } enum { STATE_BEFORE_ACTION_CHOSEN, STATE_WAIT_ACTION_CHOSEN, STATE_WAIT_ACTION_CASE_CHOSEN, STATE_WAIT_ACTION_CONFIRMED_STANDBY, STATE_WAIT_ACTION_CONFIRMED, STATE_SELECTION_SCRIPT, STATE_WAIT_SET_BEFORE_ACTION, }; static void HandleTurnActionSelectionState(void) { s32 i; gBattleCommunication[ACTIONS_CONFIRMED_COUNT] = 0; for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { u8 position = GetBattlerPosition(gActiveBattler); switch (gBattleCommunication[gActiveBattler]) { case STATE_BEFORE_ACTION_CHOSEN: // Choose an action. *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI || (position & BIT_FLANK) == B_FLANK_LEFT || gBattleStruct->absentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))] || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == STATE_WAIT_ACTION_CONFIRMED) { if (gBattleStruct->absentBattlerFlags & gBitTable[gActiveBattler]) { gChosenActionByBattler[gActiveBattler] = B_ACTION_NOTHING_FAINTED; if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED; else gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; } else { if (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gActiveBattler].status2 & STATUS2_RECHARGE) { gChosenActionByBattler[gActiveBattler] = B_ACTION_USE_MOVE; gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; } else { BtlController_EmitChooseAction(0, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[gActiveBattler]++; } } } break; case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action. if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) { gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1]; switch (gBattleBufferB[gActiveBattler][1]) { case B_ACTION_USE_MOVE: if (AreAllMovesUnusable()) { gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_WAIT_ACTION_CONFIRMED_STANDBY; *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3]; return; } else if (gDisableStructs[gActiveBattler].encoredMove != MOVE_NONE) { gChosenMoveByBattler[gActiveBattler] = gDisableStructs[gActiveBattler].encoredMove; *(gBattleStruct->chosenMovePositions + gActiveBattler) = gDisableStructs[gActiveBattler].encoredMovePos; gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; return; } else { struct ChooseMoveStruct moveInfo; moveInfo.species = gBattleMons[gActiveBattler].species; moveInfo.monType1 = gBattleMons[gActiveBattler].type1; moveInfo.monType2 = gBattleMons[gActiveBattler].type2; for (i = 0; i < MAX_MON_MOVES; i++) { moveInfo.moves[i] = gBattleMons[gActiveBattler].moves[i]; moveInfo.currentPp[i] = gBattleMons[gActiveBattler].pp[i]; moveInfo.maxPp[i] = CalculatePPWithBonus(gBattleMons[gActiveBattler].moves[i], gBattleMons[gActiveBattler].ppBonuses, i); } BtlController_EmitChooseMove(0, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo); MarkBattlerForControllerExec(gActiveBattler); } break; case B_ACTION_USE_ITEM: if ((gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) || FlagGet(FLAG_MASTER_TRAINER_BATTLE)) { gSelectionBattleScripts[gActiveBattler] = BattleScript_ActionSelectionItemsCantBeUsed; gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN; return; } else { BtlController_EmitChooseItem(0, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } break; case B_ACTION_SWITCH: *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) || gStatuses3[gActiveBattler] & STATUS3_ROOTED) { BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CANT_SWITCH, 6, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); } else if ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG)) || ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP)) && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0)) && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))) { BtlController_EmitChoosePokemon(BUFFER_A, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, 6, gLastUsedAbility, gBattleStruct->battlerPartyOrders[gActiveBattler]); } else { if (gActiveBattler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH) BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); else if (gActiveBattler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH) BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); else BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, 6, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); } MarkBattlerForControllerExec(gActiveBattler); break; case B_ACTION_SAFARI_BALL: if (IsPlayerPartyAndPokemonStorageFull()) { gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintFullBox; gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN; return; } break; case B_ACTION_CANCEL_PARTNER: gBattleCommunication[gActiveBattler] = STATE_WAIT_SET_BEFORE_ACTION; gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] = STATE_BEFORE_ACTION_CHOSEN; BtlController_EmitEndBounceEffect(0); MarkBattlerForControllerExec(gActiveBattler); return; } if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK) && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) { BattleScriptExecute(BattleScript_PrintCantRunFromTrainer); gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } else if (IsRunningFromBattleImpossible() != BATTLE_RUN_SUCCESS && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) { gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintCantEscapeFromBattle; gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN; return; } else { gBattleCommunication[gActiveBattler]++; } } break; case STATE_WAIT_ACTION_CASE_CHOSEN: if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) { switch (gChosenActionByBattler[gActiveBattler]) { case B_ACTION_USE_MOVE: switch (gBattleBufferB[gActiveBattler][1]) { case 3 ... 9: gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1]; return; default: if ((gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)) == 0xFFFF) { gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } else if (TrySetCantSelectMoveBattleScript()) { gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE; gBattleBufferB[gActiveBattler][1] = 0; *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_WAIT_ACTION_CHOSEN; return; } else { *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleBufferB[gActiveBattler][2]; gChosenMoveByBattler[gActiveBattler] = gBattleMons[gActiveBattler].moves[*(gBattleStruct->chosenMovePositions + gActiveBattler)]; *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3]; gBattleCommunication[gActiveBattler]++; } break; } break; case B_ACTION_USE_ITEM: if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) == 0) { gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } else { gLastUsedItem = (gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)); gBattleCommunication[gActiveBattler]++; } break; case B_ACTION_SWITCH: if (gBattleBufferB[gActiveBattler][1] == PARTY_SIZE) { gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } else { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1]; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= 0xF; *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0); *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 1) = gBattleBufferB[gActiveBattler][3]; *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= (0xF0); *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 2) = gBattleBufferB[gActiveBattler][3]; } gBattleCommunication[gActiveBattler]++; } break; case B_ACTION_RUN: gHitMarker |= HITMARKER_RUN; gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_WATCH_CAREFULLY: gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_BALL: gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_BAIT: case B_ACTION_SAFARI_GO_NEAR: gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_RUN: gHitMarker |= HITMARKER_RUN; gBattleCommunication[gActiveBattler]++; break; case B_ACTION_OLDMAN_THROW: gBattleCommunication[gActiveBattler]++; break; } } break; case STATE_WAIT_ACTION_CONFIRMED_STANDBY: if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) { if (((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) != BATTLE_TYPE_DOUBLE) || (position & BIT_FLANK) != B_FLANK_LEFT || (*(&gBattleStruct->absentBattlerFlags) & gBitTable[GetBattlerAtPosition(position ^ BIT_FLANK)])) BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_STOP_BOUNCE); else BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_STOP_BOUNCE_ONLY); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[gActiveBattler]++; } break; case STATE_WAIT_ACTION_CONFIRMED: if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) ++gBattleCommunication[ACTIONS_CONFIRMED_COUNT]; break; case STATE_SELECTION_SCRIPT: if (*(gBattleStruct->selectionScriptFinished + gActiveBattler)) { gBattleCommunication[gActiveBattler] = *(gBattleStruct->stateIdAfterSelScript + gActiveBattler); } else { gBattlerAttacker = gActiveBattler; gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler]; if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); gSelectionBattleScripts[gActiveBattler] = gBattlescriptCurrInstr; } break; case STATE_WAIT_SET_BEFORE_ACTION: if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; break; } } // Check if everyone chose actions. if (gBattleCommunication[ACTIONS_CONFIRMED_COUNT] == gBattlersCount) gBattleMainFunc = SetActionsAndBattlersTurnOrder; } void SwapTurnOrder(u8 id1, u8 id2) { u32 temp; SWAP(gActionsByTurnOrder[id1], gActionsByTurnOrder[id2], temp); SWAP(gBattlerByTurnOrder[id1], gBattlerByTurnOrder[id2], temp); } u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) { u8 strikesFirst = 0; u8 speedMultiplierBattler1 = 0, speedMultiplierBattler2 = 0; u32 speedBattler1 = 0, speedBattler2 = 0; u8 holdEffect = 0; u8 holdEffectParam = 0; u16 moveBattler1 = 0, moveBattler2 = 0; if (WEATHER_HAS_EFFECT) { if ((gBattleMons[battler1].ability == ABILITY_SWIFT_SWIM && gBattleWeather & B_WEATHER_RAIN) || (gBattleMons[battler1].ability == ABILITY_CHLOROPHYLL && gBattleWeather & B_WEATHER_SUN)) speedMultiplierBattler1 = 2; else speedMultiplierBattler1 = 1; if ((gBattleMons[battler2].ability == ABILITY_SWIFT_SWIM && gBattleWeather & B_WEATHER_RAIN) || (gBattleMons[battler2].ability == ABILITY_CHLOROPHYLL && gBattleWeather & B_WEATHER_SUN)) speedMultiplierBattler2 = 2; else speedMultiplierBattler2 = 1; } else { speedMultiplierBattler1 = 1; speedMultiplierBattler2 = 1; } speedBattler1 = (gBattleMons[battler1].speed * speedMultiplierBattler1) * (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][0]) / (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][1]); if (gBattleMons[battler1].item == ITEM_ENIGMA_BERRY) { holdEffect = gEnigmaBerries[battler1].holdEffect; holdEffectParam = gEnigmaBerries[battler1].holdEffectParam; } else { holdEffect = ItemId_GetHoldEffect(gBattleMons[battler1].item); holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler1].item); } // badge boost if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gSaveBlock1Ptr->keyFlags.difficulty != DIFFICULTY_CHALLENGE && FlagGet(FLAG_BADGE03_GET) && GetBattlerSide(battler1) == B_SIDE_PLAYER) speedBattler1 = (speedBattler1 * 110) / 100; if (holdEffect == HOLD_EFFECT_MACHO_BRACE) speedBattler1 /= 2; if (gBattleMons[battler1].status1 & STATUS1_PARALYSIS) speedBattler1 /= 4; if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100) speedBattler1 = UINT_MAX; // check second battlerId's speed speedBattler2 = (gBattleMons[battler2].speed * speedMultiplierBattler2) * (gStatStageRatios[gBattleMons[battler2].statStages[STAT_SPEED]][0]) / (gStatStageRatios[gBattleMons[battler2].statStages[STAT_SPEED]][1]); if (gBattleMons[battler2].item == ITEM_ENIGMA_BERRY) { holdEffect = gEnigmaBerries[battler2].holdEffect; holdEffectParam = gEnigmaBerries[battler2].holdEffectParam; } else { holdEffect = ItemId_GetHoldEffect(gBattleMons[battler2].item); holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler2].item); } // badge boost if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && FlagGet(FLAG_BADGE03_GET) && GetBattlerSide(battler2) == B_SIDE_PLAYER) speedBattler2 = (speedBattler2 * 110) / 100; if (holdEffect == HOLD_EFFECT_MACHO_BRACE) speedBattler2 /= 2; if (gBattleMons[battler2].status1 & STATUS1_PARALYSIS) speedBattler2 /= 4; if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100) speedBattler2 = UINT_MAX; if (ignoreChosenMoves) { moveBattler1 = MOVE_NONE; moveBattler2 = MOVE_NONE; } else { if (gChosenActionByBattler[battler1] == B_ACTION_USE_MOVE) { if (gProtectStructs[battler1].noValidMoves) moveBattler1 = MOVE_STRUGGLE; else moveBattler1 = gBattleMons[battler1].moves[*(gBattleStruct->chosenMovePositions + battler1)]; } else moveBattler1 = MOVE_NONE; if (gChosenActionByBattler[battler2] == B_ACTION_USE_MOVE) { if (gProtectStructs[battler2].noValidMoves) moveBattler2 = MOVE_STRUGGLE; else moveBattler2 = gBattleMons[battler2].moves[*(gBattleStruct->chosenMovePositions + battler2)]; } else moveBattler2 = MOVE_NONE; } // both move priorities are different than 0 if (gBattleMoves[moveBattler1].priority != 0 || gBattleMoves[moveBattler2].priority != 0) { // both priorities are the same if (gBattleMoves[moveBattler1].priority == gBattleMoves[moveBattler2].priority) { if (speedBattler1 == speedBattler2 && Random() & 1) strikesFirst = 2; // same speeds, same priorities else if (speedBattler1 < speedBattler2) strikesFirst = 1; // battler2 has more speed // else battler1 has more speed } else if (gBattleMoves[moveBattler1].priority < gBattleMoves[moveBattler2].priority) strikesFirst = 1; // battler2's move has greater priority // else battler1's move has greater priority } // both priorities are equal to 0 else { if (speedBattler1 == speedBattler2 && Random() & 1) strikesFirst = 2; // same speeds, same priorities else if (speedBattler1 < speedBattler2) strikesFirst = 1; // battler2 has more speed // else battler1 has more speed } return strikesFirst; } static void SetActionsAndBattlersTurnOrder(void) { s32 turnOrderId = 0; s32 i, j; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[turnOrderId] = gActiveBattler; turnOrderId++; } } else { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN) { turnOrderId = 5; break; } } } else if (gChosenActionByBattler[0] == B_ACTION_RUN) { gActiveBattler = 0; turnOrderId = 5; } if (turnOrderId == 5) // One of battlers wants to run. { gActionsByTurnOrder[0] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[0] = gActiveBattler; turnOrderId = 1; for (i = 0; i < gBattlersCount; i++) { if (i != gActiveBattler) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[i]; gBattlerByTurnOrder[turnOrderId] = i; turnOrderId++; } } gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; gBattleStruct->focusPunchBattlerId = 0; return; } else { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_ITEM || gChosenActionByBattler[gActiveBattler] == B_ACTION_SWITCH) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[turnOrderId] = gActiveBattler; turnOrderId++; } } for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gChosenActionByBattler[gActiveBattler] != B_ACTION_USE_ITEM && gChosenActionByBattler[gActiveBattler] != B_ACTION_SWITCH) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; gBattlerByTurnOrder[turnOrderId] = gActiveBattler; turnOrderId++; } } for (i = 0; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { u8 battler1 = gBattlerByTurnOrder[i]; u8 battler2 = gBattlerByTurnOrder[j]; if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM && gActionsByTurnOrder[i] != B_ACTION_SWITCH && gActionsByTurnOrder[j] != B_ACTION_SWITCH) if (GetWhoStrikesFirst(battler1, battler2, FALSE)) SwapTurnOrder(i, j); } } } } gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; gBattleStruct->focusPunchBattlerId = 0; } static void TurnValuesCleanUp(bool8 var0) { s32 i; u8 *dataPtr; for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (var0) { gProtectStructs[gActiveBattler].protected = FALSE; gProtectStructs[gActiveBattler].endured = FALSE; } else { dataPtr = (u8 *)(&gProtectStructs[gActiveBattler]); for (i = 0; i < sizeof(struct ProtectStruct); i++) dataPtr[i] = 0; if (gDisableStructs[gActiveBattler].isFirstTurn) --gDisableStructs[gActiveBattler].isFirstTurn; if (gDisableStructs[gActiveBattler].rechargeTimer) { --gDisableStructs[gActiveBattler].rechargeTimer; if (gDisableStructs[gActiveBattler].rechargeTimer == 0) gBattleMons[gActiveBattler].status2 &= ~(STATUS2_RECHARGE); } } if (gDisableStructs[gActiveBattler].substituteHP == 0) gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); } gSideTimers[0].followmeTimer = 0; gSideTimers[1].followmeTimer = 0; } static void SpecialStatusesClear(void) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { s32 i; u8 *dataPtr = (u8 *)(&gSpecialStatuses[gActiveBattler]); for (i = 0; i < sizeof(struct SpecialStatus); i++) dataPtr[i] = 0; } } static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) { if (!(gHitMarker & HITMARKER_RUN)) { while (gBattleStruct->focusPunchBattlerId < gBattlersCount) { gActiveBattler = gBattlerAttacker = gBattleStruct->focusPunchBattlerId; ++gBattleStruct->focusPunchBattlerId; if (gChosenMoveByBattler[gActiveBattler] == MOVE_FOCUS_PUNCH && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) && !(gDisableStructs[gBattlerAttacker].truantCounter) && !(gProtectStructs[gActiveBattler].noValidMoves)) { BattleScriptExecute(BattleScript_FocusPunchSetUp); return; } } } TryClearRageStatuses(); gCurrentTurnActionNumber = 0; { // something stupid needed to match u8 zero; gCurrentActionFuncId = gActionsByTurnOrder[(zero = 0)]; } gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gBattleMainFunc = RunTurnActionsFunctions; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; } static void RunTurnActionsFunctions(void) { if (gBattleOutcome != 0) gCurrentActionFuncId = B_ACTION_FINISHED; *(&gBattleStruct->savedTurnActionNumber) = gCurrentTurnActionNumber; sTurnActionsFuncsTable[gCurrentActionFuncId](); if (gCurrentTurnActionNumber >= gBattlersCount) // everyone did their actions, turn finished { gHitMarker &= ~(HITMARKER_PASSIVE_DAMAGE); gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F]; } else { if (gBattleStruct->savedTurnActionNumber != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another battlerId { gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING); gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE); } } } static void HandleEndTurn_BattleWon(void) { struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; gCurrentActionFuncId = 0; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gBattleTextBuff1[0] = gBattleOutcome; gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN); } else if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER)) { BattleStopLowHpSound(); PlayBGM(MUS_VICTORY_TRAINER); gBattlescriptCurrInstr = BattleScript_BattleTowerTrainerBattleWon; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) { BattleStopLowHpSound(); if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) gBattlescriptCurrInstr = BattleScript_MasterTrainerBattleWon; else gBattlescriptCurrInstr = BattleScript_LocalTrainerBattleWon; switch (sTrainers[gTrainerBattleOpponent_A].trainerClass) { case TRAINER_CLASS_LEADER: case TRAINER_CLASS_CHAMPION: case TRAINER_CLASS_PKMN_PROF: PlayBGM(MUS_VICTORY_GYM_LEADER); break; case TRAINER_CLASS_BOSS: case TRAINER_CLASS_TEAM_ROCKET: case TRAINER_CLASS_COOLTRAINER: case TRAINER_CLASS_ELITE_FOUR: case TRAINER_CLASS_GENTLEMAN: default: PlayBGM(MUS_VICTORY_TRAINER); break; } } else { gBattlescriptCurrInstr = BattleScript_PayDayMoneyAndPickUpItems; } gBattleMainFunc = HandleEndTurn_FinishBattle; } static void HandleEndTurn_BattleLost(void) { gCurrentActionFuncId = 0; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gBattleTextBuff1[0] = gBattleOutcome; gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN); } else { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL) { if (GetRivalBattleFlags() & RIVAL_BATTLE_HEAL_AFTER) gBattleCommunication[MULTISTRING_CHOOSER] = 1; // Dont do white out text else gBattleCommunication[MULTISTRING_CHOOSER] = 2; // Do white out text gBattlerAttacker = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); } else { gBattleCommunication[MULTISTRING_CHOOSER] = 0; } if(!FlagGet(FLAG_MASTER_TRAINER_BATTLE)) gBattlescriptCurrInstr = BattleScript_LocalBattleLost; else gBattlescriptCurrInstr = BattleScript_EReaderOrSecretBaseTrainerEnd; } gBattleMainFunc = HandleEndTurn_FinishBattle; } static void HandleEndTurn_RanFromBattle(void) { gCurrentActionFuncId = 0; switch (gProtectStructs[gBattlerAttacker].fleeType) { default: gBattlescriptCurrInstr = BattleScript_GotAwaySafely; break; case 1: gBattlescriptCurrInstr = BattleScript_SmokeBallEscape; break; case 2: gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility; break; } gBattleMainFunc = HandleEndTurn_FinishBattle; } static void HandleEndTurn_MonFled(void) { gCurrentActionFuncId = 0; PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]); gBattlescriptCurrInstr = BattleScript_WildMonFled; gBattleMainFunc = HandleEndTurn_FinishBattle; } static void HandleEndTurn_FinishBattle(void) { if (gCurrentActionFuncId == B_ACTION_TRY_FINISH || gCurrentActionFuncId == B_ACTION_FINISHED) { if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_SAFARI | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_LINK))) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { if (gBattleResults.playerMon1Species == SPECIES_NONE) { gBattleResults.playerMon1Species = gBattleMons[gActiveBattler].species; StringCopy(gBattleResults.playerMon1Name, gBattleMons[gActiveBattler].nickname); } else { gBattleResults.playerMon2Species = gBattleMons[gActiveBattler].species; StringCopy(gBattleResults.playerMon2Name, gBattleMons[gActiveBattler].nickname); } } } } TrySetQuestLogBattleEvent(); if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) ClearRematchStateByTrainerId(); BeginFastPaletteFade(3); FadeOutMapMusic(5); gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; gCB2_AfterEvolution = BattleMainCB2; } else if (gBattleControllerExecFlags == 0) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } } static void FreeResetData_ReturnToOvOrDoEvolutions(void) { if (!gPaletteFade.active) { ResetSpriteData(); if (gLeveledUpInBattle == 0 || gBattleOutcome != B_OUTCOME_WON) gBattleMainFunc = ReturnFromBattleToOverworld; else gBattleMainFunc = TryEvolvePokemon; FreeAllWindowBuffers(); if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) { FreeMonSpritesGfx(); FreeBattleSpritesData(); FreeBattleResources(); } } } static void TryEvolvePokemon(void) { s32 i; while (gLeveledUpInBattle != 0) { for (i = 0; i < PARTY_SIZE; i++) { if (gLeveledUpInBattle & gBitTable[i]) { u16 species; u8 levelUpBits = gLeveledUpInBattle; levelUpBits &= ~(gBitTable[i]); gLeveledUpInBattle = levelUpBits; species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_NORMAL, levelUpBits); if (species != SPECIES_NONE) { gBattleMainFunc = WaitForEvoSceneToFinish; EvolutionScene(&gPlayerParty[i], species, 0x81, i); return; } } } } gBattleMainFunc = ReturnFromBattleToOverworld; } static void WaitForEvoSceneToFinish(void) { if (gMain.callback2 == BattleMainCB2) gBattleMainFunc = TryEvolvePokemon; } static void ReturnFromBattleToOverworld(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) { RandomlyGivePartyPokerus(gPlayerParty); PartySpreadPokerus(gPlayerParty); } if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) || !gReceivedRemoteLinkPlayers) { gSpecialVar_Result = gBattleOutcome; gMain.inBattle = FALSE; gMain.callback1 = gPreBattleCallback1; if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) { UpdateRoamerHPStatus(&gEnemyParty[0]); if ((gBattleOutcome == B_OUTCOME_WON) || gBattleOutcome == B_OUTCOME_CAUGHT) // & with B_OUTCOME_WON (1) will return TRUE and deactivates the roamer. { SetRoamerInactive(); if(gBattleOutcome == B_OUTCOME_CAUGHT) //caught roamer { u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); switch(species) { case SPECIES_RAIKOU: FlagSet(FLAG_CAUGHT_RAIKOU); break; case SPECIES_ENTEI: FlagSet(FLAG_CAUGHT_ENTEI); break; default: FlagSet(FLAG_CAUGHT_SUICUNE); break; } } } } m4aSongNumStop(SE_LOW_HEALTH); SetMainCallback2(gMain.savedCallback); } } void RunBattleScriptCommands_PopCallbacksStack(void) { if (gCurrentActionFuncId == B_ACTION_TRY_FINISH || gCurrentActionFuncId == B_ACTION_FINISHED) { if (gBattleResources->battleCallbackStack->size != 0) gBattleResources->battleCallbackStack->size--; gBattleMainFunc = gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size]; } else { if (gBattleControllerExecFlags == 0) gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } } void RunBattleScriptCommands(void) { if (gBattleControllerExecFlags == 0) gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } static void HandleAction_UseMove(void) { u8 side; u8 var = 4; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; if (*(&gBattleStruct->absentBattlerFlags) & gBitTable[gBattlerAttacker]) { gCurrentActionFuncId = B_ACTION_FINISHED; return; } gCritMultiplier = 1; gBattleScripting.dmgMultiplier = 1; gBattleStruct->atkCancellerTracker = 0; gMoveResultFlags = 0; gMultiHitCounter = 0; gBattleCommunication[MISS_TYPE] = 0; gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); // choose move if (gProtectStructs[gBattlerAttacker].noValidMoves) { gProtectStructs[gBattlerAttacker].noValidMoves = 0; gCurrentMove = gChosenMove = MOVE_STRUGGLE; gHitMarker |= HITMARKER_NO_PPDEDUCT; *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE); } else if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) { gCurrentMove = gChosenMove = gLockedMoves[gBattlerAttacker]; } // encore forces you to use the same move else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE && gDisableStructs[gBattlerAttacker].encoredMove == gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos]) { gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove; gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos; *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } // check if the encored move wasn't overwritten else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE && gDisableStructs[gBattlerAttacker].encoredMove != gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos]) { gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos; gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; gDisableStructs[gBattlerAttacker].encoredMove = MOVE_NONE; gDisableStructs[gBattlerAttacker].encoredMovePos = 0; gDisableStructs[gBattlerAttacker].encoreTimer = 0; *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } else if (gBattleMons[gBattlerAttacker].moves[gCurrMovePos] != gChosenMoveByBattler[gBattlerAttacker]) { gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } else { gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; } if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) gBattleResults.lastUsedMovePlayer = gCurrentMove; else gBattleResults.lastUsedMoveOpponent = gCurrentMove; // choose target side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer != 0 && gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gSideTimers[side].followmeTarget) && gBattleMons[gSideTimers[side].followmeTarget].hp != 0) { gBattlerTarget = gSideTimers[side].followmeTarget; } else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gSideTimers[side].followmeTimer == 0 && (gBattleMoves[gCurrentMove].power != 0 || gBattleMoves[gCurrentMove].target != MOVE_TARGET_USER) && gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_LIGHTNING_ROD && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) { side = GetBattlerSide(gBattlerAttacker); for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) if (side != GetBattlerSide(gActiveBattler) && *(gBattleStruct->moveTarget + gBattlerAttacker) != gActiveBattler && gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD && GetBattlerTurnOrderNum(gActiveBattler) < var) var = GetBattlerTurnOrderNum(gActiveBattler); if (var == 4) { if (gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) { if (Random() & 1) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); else gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } else { if (Random() & 1) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); else gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } } else { gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); } if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) { if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } else { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE); if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } } } else { gActiveBattler = gBattlerByTurnOrder[var]; RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1; gBattlerTarget = gActiveBattler; } } else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) { if (Random() & 1) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); else gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } else { if (Random() & 1) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); else gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } if (gAbsentBattlerFlags & gBitTable[gBattlerTarget] && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } else { gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) { if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } else { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE); if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } } } gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } static void HandleAction_Switch(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gActionSelectionCursor[gBattlerAttacker] = 0; gMoveSelectionCursor[gBattlerAttacker] = 0; PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, *(gBattleStruct->battlerPartyIndexes + gBattlerAttacker)); gBattleScripting.battler = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_ActionSwitch; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; if (gBattleResults.playerSwitchesCounter < 255) ++gBattleResults.playerSwitchesCounter; } static void HandleAction_UseItem(void) { gBattlerAttacker = gBattlerTarget = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; ClearFuryCutterDestinyBondGrudge(gBattlerAttacker); gLastUsedItem = gBattleBufferB[gBattlerAttacker][1] | (gBattleBufferB[gBattlerAttacker][2] << 8); if (gLastUsedItem <= ITEM_PREMIER_BALL) // is ball { gBattlescriptCurrInstr = gBattlescriptsForBallThrow[gLastUsedItem]; } else if (gLastUsedItem == ITEM_POKE_DOLL || gLastUsedItem == ITEM_FLUFFY_TAIL) { gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0]; } else if (gLastUsedItem == ITEM_POKE_FLUTE) { gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[1]; } else if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) { gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0]; } else { gBattleScripting.battler = gBattlerAttacker; switch (*(gBattleStruct->AI_itemType + (gBattlerAttacker >> 1))) { case AI_ITEM_FULL_RESTORE: case AI_ITEM_HEAL_HP: break; case AI_ITEM_CURE_CONDITION: gBattleCommunication[MULTISTRING_CHOOSER] = 0; if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1) { if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 0x3E) gBattleCommunication[MULTISTRING_CHOOSER] = 5; } else { while (!(*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1)) { *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1; gBattleCommunication[MULTISTRING_CHOOSER]++; } } break; case AI_ITEM_X_STAT: gBattleCommunication[MULTISTRING_CHOOSER] = 4; if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 0x80) { gBattleCommunication[MULTISTRING_CHOOSER] = 5; } else { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); PREPARE_STRING_BUFFER(gBattleTextBuff2, CHAR_X); while (!((*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1))) & 1)) { *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1; ++gBattleTextBuff1[2]; } gBattleScripting.animArg1 = gBattleTextBuff1[2] + 14; gBattleScripting.animArg2 = 0; } break; case AI_ITEM_GUARD_SPECS: if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) gBattleCommunication[MULTISTRING_CHOOSER] = 2; else gBattleCommunication[MULTISTRING_CHOOSER] = 0; break; } gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + gBattlerAttacker / 2)]; } gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } bool8 TryRunFromBattle(u8 battler) { bool8 effect = FALSE; u8 holdEffect; u8 speedVar; if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[battler].holdEffect; else holdEffect = ItemId_GetHoldEffect(gBattleMons[battler].item); gPotentialItemEffectBattler = battler; if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) { gLastUsedItem = gBattleMons[battler].item; gProtectStructs[battler].fleeType = FLEE_ITEM; effect++; } else if (gBattleMons[battler].ability == ABILITY_RUN_AWAY) { gLastUsedAbility = ABILITY_RUN_AWAY; gProtectStructs[battler].fleeType = FLEE_ABILITY; effect++; } else if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) effect++; } else { if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { if (gBattleMons[battler].speed < gBattleMons[BATTLE_OPPOSITE(battler)].speed) { speedVar = (gBattleMons[battler].speed * 128) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30); if (speedVar > (Random() & 0xFF)) effect++; } else // same speed or faster { effect++; } } ++gBattleStruct->runTries; } if (effect != 0) { gCurrentTurnActionNumber = gBattlersCount; gBattleOutcome = B_OUTCOME_RAN; } return effect; } static void HandleAction_Run(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gCurrentTurnActionNumber = gBattlersCount; for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN) gBattleOutcome |= B_OUTCOME_LOST; } else { if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN) gBattleOutcome |= B_OUTCOME_WON; } } gBattleOutcome |= B_OUTCOME_LINK_BATTLE_RAN; } else { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) { if (!TryRunFromBattle(gBattlerAttacker)) // failed to run away { ClearFuryCutterDestinyBondGrudge(gBattlerAttacker); gBattleCommunication[MULTISTRING_CHOOSER] = 3; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } } else { if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) { gBattleCommunication[MULTISTRING_CHOOSER] = 4; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } else { gCurrentTurnActionNumber = gBattlersCount; gBattleOutcome = B_OUTCOME_MON_FLED; } } } } static void HandleAction_WatchesCarefully(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; if (gBattleStruct->safariRockThrowCounter != 0) { --gBattleStruct->safariRockThrowCounter; if (gBattleStruct->safariRockThrowCounter == 0) { *(&gBattleStruct->safariCatchFactor) = gSpeciesInfo[GetMonData(gEnemyParty, MON_DATA_SPECIES)].catchRate * 100 / 1275; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_ANGRY; } } else { if (gBattleStruct->safariBaitThrowCounter != 0) { --gBattleStruct->safariBaitThrowCounter; if (gBattleStruct->safariBaitThrowCounter == 0) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_EATING; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING; } } gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } static void HandleAction_SafariZoneBallThrow(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; --gNumSafariBalls; gLastUsedItem = ITEM_SAFARI_BALL; gBattlescriptCurrInstr = gBattlescriptsForBallThrow[ITEM_SAFARI_BALL]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } static void HandleAction_ThrowBait(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattleStruct->safariBaitThrowCounter += Random() % 5 + 2; if (gBattleStruct->safariBaitThrowCounter > 6) gBattleStruct->safariBaitThrowCounter = 6; gBattleStruct->safariRockThrowCounter = 0; gBattleStruct->safariCatchFactor >>= 1; if (gBattleStruct->safariCatchFactor <= 2) gBattleStruct->safariCatchFactor = 3; gBattlescriptCurrInstr = gBattlescriptsForSafariActions[2]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } static void HandleAction_ThrowRock(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattleStruct->safariRockThrowCounter += Random() % 5 + 2; if (gBattleStruct->safariRockThrowCounter > 6) gBattleStruct->safariRockThrowCounter = 6; gBattleStruct->safariBaitThrowCounter = 0; gBattleStruct->safariCatchFactor <<= 1; if (gBattleStruct->safariCatchFactor > 20) gBattleStruct->safariCatchFactor = 20; gBattlescriptCurrInstr = gBattlescriptsForSafariActions[1]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } static void HandleAction_SafariZoneRun(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; PlaySE(SE_FLEE); gCurrentTurnActionNumber = gBattlersCount; gBattleOutcome = B_OUTCOME_RAN; } static void HandleAction_OldManBallThrow(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]) gBattlescriptCurrInstr = gBattlescriptsForSafariActions[3]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; gActionsByTurnOrder[1] = B_ACTION_FINISHED; } static void HandleAction_TryFinish(void) { if (!HandleFaintedMonActions()) { gBattleStruct->faintedActionsState = 0; gCurrentActionFuncId = B_ACTION_FINISHED; } } static void HandleAction_NothingIsFainted(void) { ++gCurrentTurnActionNumber; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_IGNORE_ON_AIR | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_PASSIVE_DAMAGE | HITMARKER_OBEYS | HITMARKER_WAKE_UP_CLEAR | HITMARKER_SYNCHRONISE_EFFECT | HITMARKER_CHARGING | HITMARKER_NEVER_SET); } static void HandleAction_ActionFinished(void) { ++gCurrentTurnActionNumber; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; SpecialStatusesClear(); gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_IGNORE_ON_AIR | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_PASSIVE_DAMAGE | HITMARKER_OBEYS | HITMARKER_WAKE_UP_CLEAR | HITMARKER_SYNCHRONISE_EFFECT | HITMARKER_CHARGING | HITMARKER_NEVER_SET); gCurrentMove = MOVE_NONE; gBattleMoveDamage = 0; gMoveResultFlags = 0; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gLastLandedMoves[gBattlerAttacker] = 0; gLastHitByType[gBattlerAttacker] = 0; gBattleStruct->dynamicMoveType = 0; gDynamicBasePower = 0; gBattleScripting.moveendState = 0; gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattleCommunication[ACTIONS_CONFIRMED_COUNT] = 0; gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; } ================================================ FILE: src/battle_message.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "strings.h" #include "battle_message.h" #include "link.h" #include "event_scripts.h" #include "event_data.h" #include "item.h" #include "battle_tower.h" #include "trainer_tower.h" #include "battle_setup.h" #include "field_specials.h" #include "new_menu_helpers.h" #include "battle_controllers.h" #include "graphics.h" #include "battle_ai_switch_items.h" #include "constants/moves.h" #include "constants/items.h" #include "constants/trainers.h" #include "constants/weather.h" struct BattleWindowText { u8 fillValue; u8 fontId; u8 x; u8 y; u8 letterSpacing; u8 lineSpacing; u8 speed; u8 fgColor; u8 bgColor; u8 shadowColor; }; static EWRAM_DATA u8 sBattlerAbilities[MAX_BATTLERS_COUNT] = {}; static EWRAM_DATA struct BattleMsgData *sBattleMsgDataPtr = NULL; static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst); static const u8 sText_Empty1[] = _(""); static const u8 sText_Trainer1LoseText[] = _("{B_TRAINER1_LOSE_TEXT}"); static const u8 sText_Trainer2LoseText[] = _("{B_TRAINER2_LOSE_TEXT}"); static const u8 sText_Trainer1RecallPkmn1[] = _("{B_TRAINER1_NAME}: {B_OPPONENT_MON1_NAME}, come back!"); static const u8 sText_Trainer1WinText[] = _("{B_TRAINER1_WIN_TEXT}"); static const u8 sText_Trainer1RecallPkmn2[] = _("{B_TRAINER1_NAME}: {B_OPPONENT_MON2_NAME}, come back!"); static const u8 sText_Trainer1RecallBoth[] = _("{B_TRAINER1_NAME}: {B_OPPONENT_MON1_NAME} and\n{B_OPPONENT_MON2_NAME}, come back!"); static const u8 sText_Trainer2WinText[] = _("{B_TRAINER2_WIN_TEXT}"); static const u8 sText_PkmnGainedEXP[] = _("{B_BUFF1} gained{B_BUFF2}\n{B_BUFF3} EXP. Points!\p"); static const u8 sText_EmptyString4[] = _(""); static const u8 sText_ABoosted[] = _(" a boosted"); static const u8 sText_PkmnGrewToLv[] = _("{B_BUFF1} grew to\nLV. {B_BUFF2}!{WAIT_SE}\p"); static const u8 sText_PkmnLearnedMove[] = _("{B_BUFF1} learned\n{B_BUFF2}!{WAIT_SE}\p"); static const u8 sText_TryToLearnMove1[] = _("{B_BUFF1} is trying to\nlearn {B_BUFF2}.\p"); static const u8 sText_TryToLearnMove2[] = _("But, {B_BUFF1} can't learn\nmore than four moves.\p"); static const u8 sText_TryToLearnMove3[] = _("Delete a move to make\nroom for {B_BUFF2}?"); static const u8 sText_PkmnForgotMove[] = _("{B_BUFF1} forgot\n{B_BUFF2}.\p"); static const u8 sText_StopLearningMove[] = _("{PAUSE 32}Stop learning\n{B_BUFF2}?"); static const u8 sText_DidNotLearnMove[] = _("{B_BUFF1} did not learn\n{B_BUFF2}.\p"); static const u8 sText_UseNextPkmn[] = _("Use next POKéMON?"); static const u8 sText_AttackMissed[] = _("{B_ATK_NAME_WITH_PREFIX}'s\nattack missed!"); static const u8 sText_PkmnProtectedItself[] = _("{B_DEF_NAME_WITH_PREFIX}\nprotected itself!"); static const u8 sText_AvoidedDamage[] = _("{B_DEF_NAME_WITH_PREFIX} avoided\ndamage with {B_DEF_ABILITY}!"); static const u8 sText_PkmnMakesGroundMiss[] = _("{B_DEF_NAME_WITH_PREFIX} makes GROUND\nmoves miss with {B_DEF_ABILITY}!"); static const u8 sText_PkmnAvoidedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} avoided\nthe attack!"); static const u8 sText_ItDoesntAffect[] = _("It doesn't affect\n{B_DEF_NAME_WITH_PREFIX}…"); static const u8 sText_AttackerFainted[] = _("{B_ATK_NAME_WITH_PREFIX}\nfainted!\p"); static const u8 sText_TargetFainted[] = _("{B_DEF_NAME_WITH_PREFIX}\nfainted!\p"); static const u8 sText_PlayerGotMoney[] = _("{B_PLAYER_NAME} got ¥{B_BUFF1}\nfor winning!\p"); static const u8 sText_PlayerWhiteout[] = _("{B_PLAYER_NAME} is out of\nusable POKéMON!\p"); static const u8 sText_PlayerPanicked[] = _("{B_PLAYER_NAME} panicked and lost ¥{B_BUFF1}…\p… … … …\p{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}"); static const u8 sText_PlayerWhiteoutAgainstTrainer[] = _("{B_PLAYER_NAME} is out of\nusable POKéMON!\pPlayer lost against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!{PAUSE_UNTIL_PRESS}"); static const u8 sText_PlayerPaidAsPrizeMoney[] = _("{B_PLAYER_NAME} paid ¥{B_BUFF1} as the prize\nmoney…\p… … … …\p{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}"); static const u8 sText_PlayerWhiteout2[] = _("{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}"); static const u8 sText_PreventsEscape[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} prevents\nescape with {B_SCR_ACTIVE_ABILITY}!\p"); static const u8 sText_CantEscape2[] = _("Can't escape!\p"); static const u8 sText_AttackerCantEscape[] = _("{B_ATK_NAME_WITH_PREFIX} can't escape!"); static const u8 sText_HitXTimes[] = _("Hit {B_BUFF1} time(s)!"); static const u8 sText_PkmnFellAsleep[] = _("{B_EFF_NAME_WITH_PREFIX}\nfell asleep!"); static const u8 sText_PkmnMadeSleep[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nmade {B_EFF_NAME_WITH_PREFIX} sleep!"); static const u8 sText_PkmnAlreadyAsleep[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready asleep!"); static const u8 sText_PkmnAlreadyAsleep2[] = _("{B_ATK_NAME_WITH_PREFIX} is\nalready asleep!"); static const u8 sText_PkmnWasntAffected[] = _("{B_DEF_NAME_WITH_PREFIX}\nwasn't affected!"); static const u8 sText_PkmnWasPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX}\nwas poisoned!"); static const u8 sText_PkmnPoisonedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\npoisoned {B_EFF_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnHurtByPoison[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby poison!"); static const u8 sText_PkmnAlreadyPoisoned[] = _("{B_DEF_NAME_WITH_PREFIX} is already\npoisoned."); static const u8 sText_PkmnBadlyPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX} is badly\npoisoned!"); static const u8 sText_PkmnEnergyDrained[] = _("{B_DEF_NAME_WITH_PREFIX} had its\nenergy drained!"); static const u8 sText_PkmnWasBurned[] = _("{B_EFF_NAME_WITH_PREFIX} was burned!"); static const u8 sText_PkmnBurnedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nburned {B_EFF_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnHurtByBurn[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby its burn!"); static const u8 sText_PkmnAlreadyHasBurn[] = _("{B_DEF_NAME_WITH_PREFIX} already\nhas a burn."); static const u8 sText_PkmnWasFrozen[] = _("{B_EFF_NAME_WITH_PREFIX} was\nfrozen solid!"); static const u8 sText_PkmnFrozenBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nfroze {B_EFF_NAME_WITH_PREFIX} solid!"); static const u8 sText_PkmnIsFrozen[] = _("{B_ATK_NAME_WITH_PREFIX} is\nfrozen solid!"); static const u8 sText_PkmnWasDefrosted[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndefrosted!"); static const u8 sText_PkmnWasDefrosted2[] = _("{B_ATK_NAME_WITH_PREFIX} was\ndefrosted!"); static const u8 sText_PkmnWasDefrostedBy[] = _("{B_ATK_NAME_WITH_PREFIX} was\ndefrosted by {B_CURRENT_MOVE}!"); static const u8 sText_PkmnWasParalyzed[] = _("{B_EFF_NAME_WITH_PREFIX} is paralyzed!\nIt may be unable to move!"); static const u8 sText_PkmnWasParalyzedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nparalyzed {B_EFF_NAME_WITH_PREFIX}!\lIt may be unable to move!"); static const u8 sText_PkmnIsParalyzed[] = _("{B_ATK_NAME_WITH_PREFIX} is paralyzed!\nIt can't move!"); static const u8 sText_PkmnIsAlreadyParalyzed[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready paralyzed!"); static const u8 sText_PkmnHealedParalysis[] = _("{B_DEF_NAME_WITH_PREFIX} was\nhealed of paralysis!"); static const u8 sText_PkmnDreamEaten[] = _("{B_DEF_NAME_WITH_PREFIX}'s\ndream was eaten!"); static const u8 sText_StatsWontIncrease[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\nwon't go higher!"); static const u8 sText_StatsWontDecrease[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\nwon't go lower!"); static const u8 sText_TeamStoppedWorking[] = _("Your team's {B_BUFF1}\nstopped working!"); static const u8 sText_FoeStoppedWorking[] = _("The foe's {B_BUFF1}\nstopped working!"); static const u8 sText_PkmnIsConfused[] = _("{B_ATK_NAME_WITH_PREFIX} is\nconfused!"); static const u8 sText_PkmnHealedConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} snapped\nout of confusion!"); static const u8 sText_PkmnWasConfused[] = _("{B_EFF_NAME_WITH_PREFIX} became\nconfused!"); static const u8 sText_PkmnAlreadyConfused[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready confused!"); static const u8 sText_PkmnFellInLove[] = _("{B_DEF_NAME_WITH_PREFIX}\nfell in love!"); static const u8 sText_PkmnInLove[] = _("{B_ATK_NAME_WITH_PREFIX} is in love\nwith {B_SCR_ACTIVE_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnImmobilizedByLove[] = _("{B_ATK_NAME_WITH_PREFIX} is\nimmobilized by love!"); static const u8 sText_PkmnBlownAway[] = _("{B_DEF_NAME_WITH_PREFIX} was\nblown away!"); static const u8 sText_PkmnChangedType[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto the {B_BUFF1} type!"); static const u8 sText_PkmnFlinched[] = _("{B_ATK_NAME_WITH_PREFIX} flinched!"); static const u8 sText_PkmnRegainedHealth[] = _("{B_DEF_NAME_WITH_PREFIX} regained\nhealth!"); static const u8 sText_PkmnHPFull[] = _("{B_DEF_NAME_WITH_PREFIX}'s\nHP is full!"); static const u8 sText_PkmnRaisedSpDef[] = _("{B_ATK_PREFIX2}'s {B_CURRENT_MOVE}\nraised SP. DEF!"); static const u8 sText_PkmnRaisedSpDefALittle[] = _("{B_ATK_PREFIX2}'s {B_CURRENT_MOVE}\nraised SP. DEF a little!"); static const u8 sText_PkmnRaisedDef[] = _("{B_ATK_PREFIX2}'s {B_CURRENT_MOVE}\nraised DEFENSE!"); static const u8 sText_PkmnRaisedDefALittle[] = _("{B_ATK_PREFIX2}'s {B_CURRENT_MOVE}\nraised DEFENSE a little!"); static const u8 sText_PkmnCoveredByVeil[] = _("{B_ATK_PREFIX2}'s party is covered\nby a veil!"); static const u8 sText_PkmnUsedSafeguard[] = _("{B_DEF_NAME_WITH_PREFIX}'s party is protected\nby SAFEGUARD!"); static const u8 sText_PkmnSafeguardExpired[] = _("{B_ATK_PREFIX3}'s party is no longer\nprotected by SAFEGUARD!"); static const u8 sText_PkmnWentToSleep[] = _("{B_ATK_NAME_WITH_PREFIX} went\nto sleep!"); static const u8 sText_PkmnSleptHealthy[] = _("{B_ATK_NAME_WITH_PREFIX} slept and\nbecame healthy!"); static const u8 sText_PkmnWhippedWhirlwind[] = _("{B_ATK_NAME_WITH_PREFIX} whipped\nup a whirlwind!"); static const u8 sText_PkmnTookSunlight[] = _("{B_ATK_NAME_WITH_PREFIX} took\nin sunlight!"); static const u8 sText_PkmnLoweredHead[] = _("{B_ATK_NAME_WITH_PREFIX} lowered\nits head!"); static const u8 sText_PkmnIsGlowing[] = _("{B_ATK_NAME_WITH_PREFIX} is glowing!"); static const u8 sText_PkmnFlewHigh[] = _("{B_ATK_NAME_WITH_PREFIX} flew\nup high!"); static const u8 sText_PkmnDugHole[] = _("{B_ATK_NAME_WITH_PREFIX} dug a hole!"); static const u8 sText_PkmnHidUnderwater[] = _("{B_ATK_NAME_WITH_PREFIX} hid\nunderwater!"); static const u8 sText_PkmnSprangUp[] = _("{B_ATK_NAME_WITH_PREFIX} sprang up!"); static const u8 sText_PkmnSqueezedByBind[] = _("{B_DEF_NAME_WITH_PREFIX} was squeezed by\n{B_ATK_NAME_WITH_PREFIX}'s BIND!"); static const u8 sText_PkmnTrappedInVortex[] = _("{B_DEF_NAME_WITH_PREFIX} was trapped\nin the vortex!"); static const u8 sText_PkmnTrappedBySandTomb[] = _("{B_DEF_NAME_WITH_PREFIX} was trapped\nby SAND TOMB!"); static const u8 sText_PkmnWrappedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was WRAPPED by\n{B_ATK_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnClamped[] = _("{B_ATK_NAME_WITH_PREFIX} CLAMPED\n{B_DEF_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnHurtBy[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby {B_BUFF1}!"); static const u8 sText_PkmnFreedFrom[] = _("{B_ATK_NAME_WITH_PREFIX} was freed\nfrom {B_BUFF1}!"); static const u8 sText_PkmnCrashed[] = _("{B_ATK_NAME_WITH_PREFIX} kept going\nand crashed!"); const u8 gBattleText_MistShroud[] = _("{B_ATK_PREFIX2} became\nshrouded in MIST!"); static const u8 sText_PkmnProtectedByMist[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is protected\nby MIST!"); const u8 gBattleText_GetPumped[] = _("{B_ATK_NAME_WITH_PREFIX} is getting\npumped!"); static const u8 sText_PkmnHitWithRecoil[] = _("{B_ATK_NAME_WITH_PREFIX} is hit\nwith recoil!"); static const u8 sText_PkmnProtectedItself2[] = _("{B_ATK_NAME_WITH_PREFIX} protected\nitself!"); static const u8 sText_PkmnBuffetedBySandstorm[] = _("{B_ATK_NAME_WITH_PREFIX} is buffeted\nby the sandstorm!"); static const u8 sText_PkmnPeltedByHail[] = _("{B_ATK_NAME_WITH_PREFIX} is pelted\nby HAIL!"); static const u8 sText_PkmnsXWoreOff[] = _("{B_ATK_PREFIX1}'s {B_BUFF1}\nwore off!"); static const u8 sText_PkmnSeeded[] = _("{B_DEF_NAME_WITH_PREFIX} was seeded!"); static const u8 sText_PkmnEvadedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} evaded\nthe attack!"); static const u8 sText_PkmnSappedByLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX}'s health is\nsapped by LEECH SEED!"); static const u8 sText_PkmnFastAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} is fast\nasleep."); static const u8 sText_PkmnWokeUp[] = _("{B_ATK_NAME_WITH_PREFIX} woke up!"); static const u8 sText_PkmnUproarKeptAwake[] = _("But {B_SCR_ACTIVE_NAME_WITH_PREFIX}'s UPROAR\nkept it awake!"); static const u8 sText_PkmnWokeUpInUproar[] = _("{B_ATK_NAME_WITH_PREFIX} woke up\nin the UPROAR!"); static const u8 sText_PkmnCausedUproar[] = _("{B_ATK_NAME_WITH_PREFIX} caused\nan UPROAR!"); static const u8 sText_PkmnMakingUproar[] = _("{B_ATK_NAME_WITH_PREFIX} is making\nan UPROAR!"); static const u8 sText_PkmnCalmedDown[] = _("{B_ATK_NAME_WITH_PREFIX} calmed down."); static const u8 sText_PkmnCantSleepInUproar[] = _("But {B_DEF_NAME_WITH_PREFIX} can't\nsleep in an UPROAR!"); static const u8 sText_PkmnStockpiled[] = _("{B_ATK_NAME_WITH_PREFIX} STOCKPILED\n{B_BUFF1}!"); static const u8 sText_PkmnCantStockpile[] = _("{B_ATK_NAME_WITH_PREFIX} can't\nSTOCKPILE any more!"); static const u8 sText_PkmnCantSleepInUproar2[] = _("But {B_DEF_NAME_WITH_PREFIX} can't\nsleep in an UPROAR!"); static const u8 sText_UproarKeptPkmnAwake[] = _("But the UPROAR kept\n{B_DEF_NAME_WITH_PREFIX} awake!"); static const u8 sText_PkmnStayedAwakeUsing[] = _("{B_DEF_NAME_WITH_PREFIX} stayed awake\nusing its {B_DEF_ABILITY}!"); static const u8 sText_PkmnStoringEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} is storing\nenergy!"); static const u8 sText_PkmnUnleashedEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} unleashed\nenergy!"); static const u8 sText_PkmnFatigueConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} became\nconfused due to fatigue!"); static const u8 sText_PkmnPickedUpItem[] = _("{B_PLAYER_NAME} picked up\n¥{B_BUFF1}!\p"); static const u8 sText_PkmnUnaffected[] = _("{B_DEF_NAME_WITH_PREFIX} is\nunaffected!"); static const u8 sText_PkmnTransformedInto[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto {B_BUFF1}!"); static const u8 sText_PkmnMadeSubstitute[] = _("{B_ATK_NAME_WITH_PREFIX} made\na SUBSTITUTE!"); static const u8 sText_PkmnHasSubstitute[] = _("{B_ATK_NAME_WITH_PREFIX} already\nhas a SUBSTITUTE!"); static const u8 sText_SubstituteDamaged[] = _("The SUBSTITUTE took damage\nfor {B_DEF_NAME_WITH_PREFIX}!\p"); static const u8 sText_PkmnSubstituteFaded[] = _("{B_DEF_NAME_WITH_PREFIX}'s\nSUBSTITUTE faded!\p"); static const u8 sText_PkmnMustRecharge[] = _("{B_ATK_NAME_WITH_PREFIX} must\nrecharge!"); static const u8 sText_PkmnRageBuilding[] = _("{B_DEF_NAME_WITH_PREFIX}'s RAGE\nis building!"); static const u8 sText_PkmnMoveWasDisabled[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\nwas disabled!"); static const u8 sText_PkmnMoveDisabledNoMore[] = _("{B_ATK_NAME_WITH_PREFIX} is disabled\nno more!"); static const u8 sText_PkmnGotEncore[] = _("{B_DEF_NAME_WITH_PREFIX} got\nan ENCORE!"); static const u8 sText_PkmnEncoreEnded[] = _("{B_ATK_NAME_WITH_PREFIX}'s ENCORE\nended!"); static const u8 sText_PkmnTookAim[] = _("{B_ATK_NAME_WITH_PREFIX} took aim\nat {B_DEF_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnSketchedMove[] = _("{B_ATK_NAME_WITH_PREFIX} SKETCHED\n{B_BUFF1}!"); static const u8 sText_PkmnTryingToTakeFoe[] = _("{B_ATK_NAME_WITH_PREFIX} is trying\nto take its foe with it!"); static const u8 sText_PkmnTookFoe[] = _("{B_DEF_NAME_WITH_PREFIX} took\n{B_ATK_NAME_WITH_PREFIX} with it!"); static const u8 sText_PkmnReducedPP[] = _("Reduced {B_DEF_NAME_WITH_PREFIX}'s\n{B_BUFF1} by {B_BUFF2}!"); static const u8 sText_PkmnStoleItem[] = _("{B_ATK_NAME_WITH_PREFIX} stole\n{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!"); static const u8 sText_TargetCantEscapeNow[] = _("{B_DEF_NAME_WITH_PREFIX} can't\nescape now!"); static const u8 sText_PkmnFellIntoNightmare[] = _("{B_DEF_NAME_WITH_PREFIX} fell into\na NIGHTMARE!"); static const u8 sText_PkmnLockedInNightmare[] = _("{B_ATK_NAME_WITH_PREFIX} is locked\nin a NIGHTMARE!"); static const u8 sText_PkmnLaidCurse[] = _("{B_ATK_NAME_WITH_PREFIX} cut its own HP and\nlaid a CURSE on {B_DEF_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnAfflictedByCurse[] = _("{B_ATK_NAME_WITH_PREFIX} is afflicted\nby the CURSE!"); static const u8 sText_SpikesScattered[] = _("SPIKES were scattered all around\nthe opponent's side!"); static const u8 sText_PkmnHurtBySpikes[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is hurt\nby SPIKES!"); static const u8 sText_PkmnIdentified[] = _("{B_ATK_NAME_WITH_PREFIX} identified\n{B_DEF_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnPerishCountFell[] = _("{B_ATK_NAME_WITH_PREFIX}'s PERISH count\nfell to {B_BUFF1}!"); static const u8 sText_PkmnBracedItself[] = _("{B_ATK_NAME_WITH_PREFIX} braced\nitself!"); static const u8 sText_PkmnEnduredHit[] = _("{B_DEF_NAME_WITH_PREFIX} ENDURED\nthe hit!"); static const u8 sText_MagnitudeStrength[] = _("MAGNITUDE {B_BUFF1}!"); static const u8 sText_PkmnCutHPMaxedAttack[] = _("{B_ATK_NAME_WITH_PREFIX} cut its own HP\nand maximized ATTACK!"); static const u8 sText_PkmnCopiedStatChanges[] = _("{B_ATK_NAME_WITH_PREFIX} copied\n{B_DEF_NAME_WITH_PREFIX}'s stat changes!"); static const u8 sText_PkmnGotFree[] = _("{B_ATK_NAME_WITH_PREFIX} got free of\n{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}!"); static const u8 sText_PkmnShedLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX} shed\nLEECH SEED!"); static const u8 sText_PkmnBlewAwaySpikes[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSPIKES!"); static const u8 sText_PkmnFledFromBattle[] = _("{B_ATK_NAME_WITH_PREFIX} fled from\nbattle!"); static const u8 sText_PkmnForesawAttack[] = _("{B_ATK_NAME_WITH_PREFIX} foresaw\nan attack!"); static const u8 sText_PkmnTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX} took the\n{B_BUFF1} attack!"); static const u8 sText_PkmnChoseXAsDestiny[] = _("{B_ATK_NAME_WITH_PREFIX} chose\n{B_CURRENT_MOVE} as its destiny!"); static const u8 sText_PkmnAttack[] = _("{B_BUFF1}'s attack!"); static const u8 sText_PkmnCenterAttention[] = _("{B_ATK_NAME_WITH_PREFIX} became the\ncenter of attention!"); static const u8 sText_PkmnChargingPower[] = _("{B_ATK_NAME_WITH_PREFIX} began\ncharging power!"); static const u8 sText_NaturePowerTurnedInto[] = _("NATURE POWER turned into\n{B_CURRENT_MOVE}!"); static const u8 sText_PkmnStatusNormal[] = _("{B_ATK_NAME_WITH_PREFIX}'s status\nreturned to normal!"); static const u8 sText_PkmnSubjectedToTorment[] = _("{B_DEF_NAME_WITH_PREFIX} was subjected\nto TORMENT!"); static const u8 sText_PkmnTighteningFocus[] = _("{B_ATK_NAME_WITH_PREFIX} is tightening\nits focus!"); static const u8 sText_PkmnFellForTaunt[] = _("{B_DEF_NAME_WITH_PREFIX} fell for\nthe TAUNT!"); static const u8 sText_PkmnReadyToHelp[] = _("{B_ATK_NAME_WITH_PREFIX} is ready to\nhelp {B_DEF_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnSwitchedItems[] = _("{B_ATK_NAME_WITH_PREFIX} switched\nitems with its opponent!"); static const u8 sText_PkmnObtainedX[] = _("{B_ATK_NAME_WITH_PREFIX} obtained\n{B_BUFF1}."); static const u8 sText_PkmnObtainedX2[] = _("{B_DEF_NAME_WITH_PREFIX} obtained\n{B_BUFF2}."); static const u8 sText_PkmnObtainedXYObtainedZ[] = _("{B_ATK_NAME_WITH_PREFIX} obtained\n{B_BUFF1}.\p{B_DEF_NAME_WITH_PREFIX} obtained\n{B_BUFF2}."); static const u8 sText_PkmnCopiedFoe[] = _("{B_ATK_NAME_WITH_PREFIX} copied\n{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}!"); static const u8 sText_PkmnMadeWish[] = _("{B_ATK_NAME_WITH_PREFIX} made a WISH!"); static const u8 sText_PkmnWishCameTrue[] = _("{B_BUFF1}'s WISH\ncame true!"); static const u8 sText_PkmnPlantedRoots[] = _("{B_ATK_NAME_WITH_PREFIX} planted its roots!"); static const u8 sText_PkmnAbsorbedNutrients[] = _("{B_ATK_NAME_WITH_PREFIX} absorbed\nnutrients with its roots!"); static const u8 sText_PkmnAnchoredItself[] = _("{B_DEF_NAME_WITH_PREFIX} anchored\nitself with its roots!"); static const u8 sText_PkmnWasMadeDrowsy[] = _("{B_ATK_NAME_WITH_PREFIX} made\n{B_DEF_NAME_WITH_PREFIX} drowsy!"); static const u8 sText_PkmnKnockedOff[] = _("{B_ATK_NAME_WITH_PREFIX} knocked off\n{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!"); static const u8 sText_PkmnSwappedAbilities[] = _("{B_ATK_NAME_WITH_PREFIX} swapped abilities\nwith its opponent!"); static const u8 sText_PkmnSealedOpponentMove[] = _("{B_ATK_NAME_WITH_PREFIX} sealed the\nopponent's moveシsス!"); static const u8 sText_PkmnWantsGrudge[] = _("{B_ATK_NAME_WITH_PREFIX} wants the\nopponent to bear a GRUDGE!"); static const u8 sText_PkmnLostPPGrudge[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} lost\nall its PP due to the GRUDGE!"); static const u8 sText_PkmnShroudedItself[] = _("{B_ATK_NAME_WITH_PREFIX} shrouded\nitself in {B_CURRENT_MOVE}!"); static const u8 sText_PkmnMoveBounced[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE}\nwas bounced back by MAGIC COAT!"); static const u8 sText_PkmnWaitsForTarget[] = _("{B_ATK_NAME_WITH_PREFIX} waits for its foe\nto make a move!"); static const u8 sText_PkmnSnatchedMove[] = _("{B_DEF_NAME_WITH_PREFIX} SNATCHED\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s move!"); static const u8 sText_ElectricityWeakened[] = _("Electricity's power was\nweakened!"); static const u8 sText_FireWeakened[] = _("Fire's power was\nweakened!"); static const u8 sText_XFoundOneY[] = _("{B_ATK_NAME_WITH_PREFIX} found\none {B_LAST_ITEM}!"); static const u8 sText_SoothingAroma[] = _("A soothing aroma wafted\nthrough the area!"); static const u8 sText_ItemsCantBeUsedNow[] = _("Items can't be used now.{PAUSE 64}"); static const u8 sText_ForXCommaYZ[] = _("For {B_SCR_ACTIVE_NAME_WITH_PREFIX},\n{B_LAST_ITEM} {B_BUFF1}"); static const u8 sText_PkmnUsedXToGetPumped[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used\n{B_LAST_ITEM} to hustle!"); static const u8 sText_PkmnLostFocus[] = _("{B_ATK_NAME_WITH_PREFIX} lost its\nfocus and couldn't move!"); static const u8 sText_PkmnWasDraggedOut[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndragged out!\p"); static const u8 sText_TheWallShattered[] = _("The wall shattered!"); static const u8 sText_ButNoEffect[] = _("But it had no effect!"); static const u8 sText_PkmnHasNoMovesLeft[] = _("{B_ACTIVE_NAME_WITH_PREFIX} has no\nmoves left!\p"); static const u8 sText_PkmnMoveIsDisabled[] = _("{B_ACTIVE_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE}\nis disabled!\p"); static const u8 sText_PkmnCantUseMoveTorment[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can't use the same\nmove in a row due to the TORMENT!\p"); static const u8 sText_PkmnCantUseMoveTaunt[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can't use\n{B_CURRENT_MOVE} after the TAUNT!\p"); static const u8 sText_PkmnCantUseMoveSealed[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can't use the\nsealed {B_CURRENT_MOVE}!\p"); static const u8 sText_PkmnMadeItRain[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nmade it rain!"); static const u8 sText_PkmnRaisedSpeed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nraised its SPEED!"); static const u8 sText_PkmnProtectedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was protected\nby {B_DEF_ABILITY}!"); static const u8 sText_PkmnPreventsUsage[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nprevents {B_ATK_NAME_WITH_PREFIX}\lfrom using {B_CURRENT_MOVE}!"); static const u8 sText_PkmnRestoredHPUsing[] = _("{B_DEF_NAME_WITH_PREFIX} restored HP\nusing its {B_DEF_ABILITY}!"); static const u8 sText_PkmnsXMadeYUseless[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nmade {B_CURRENT_MOVE} useless!"); static const u8 sText_PkmnChangedTypeWith[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nmade it the {B_BUFF1} type!"); static const u8 sText_PkmnPreventsParalysisWith[] = _("{B_EFF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nprevents paralysis!"); static const u8 sText_PkmnPreventsRomanceWith[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nprevents romance!"); static const u8 sText_PkmnPreventsPoisoningWith[] = _("{B_EFF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nprevents poisoning!"); static const u8 sText_PkmnPreventsConfusionWith[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nprevents confusion!"); static const u8 sText_PkmnRaisedFirePowerWith[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nraised its FIRE power!"); static const u8 sText_PkmnAnchorsItselfWith[] = _("{B_DEF_NAME_WITH_PREFIX} anchors\nitself with {B_DEF_ABILITY}!"); static const u8 sText_PkmnCutsAttackWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\ncuts {B_DEF_NAME_WITH_PREFIX}'s ATTACK!"); static const u8 sText_PkmnPreventsStatLossWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nprevents stat loss!"); static const u8 sText_PkmnHurtsWith[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nhurt {B_ATK_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnTraced[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} TRACED\n{B_BUFF1}'s {B_BUFF2}!"); static const u8 sText_PkmnsXPreventsBurns[] = _("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY}\nprevents burns!"); static const u8 sText_PkmnsXBlocksY[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nblocks {B_CURRENT_MOVE}!"); static const u8 sText_PkmnsXBlocksY2[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nblocks {B_CURRENT_MOVE}!"); static const u8 sText_PkmnsXRestoredHPALittle2[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\nrestored its HP a little!"); static const u8 sText_PkmnsXWhippedUpSandstorm[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nwhipped up a sandstorm!"); static const u8 sText_PkmnsXIntensifiedSun[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nintensified the sun's rays!"); static const u8 sText_PkmnsXPreventsYLoss[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nprevents {B_BUFF1} loss!"); static const u8 sText_PkmnsXInfatuatedY[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\ninfatuated {B_ATK_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnsXMadeYIneffective[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nmade {B_CURRENT_MOVE} ineffective!"); static const u8 sText_PkmnsXCuredYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!"); static const u8 sText_ItSuckedLiquidOoze[] = _("It sucked up the\nLIQUID OOZE!"); static const u8 sText_PkmnTransformed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} transformed!"); static const u8 sText_PkmnsXTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\ntook the attack!"); const u8 gText_PkmnsXPreventsSwitching[] = _("{B_BUFF1}'s {B_LAST_ABILITY}\nprevents switching!\p"); static const u8 sText_PreventedFromWorking[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nprevented {B_SCR_ACTIVE_NAME_WITH_PREFIX}'s\l{B_BUFF1} from working!"); static const u8 sText_PkmnsXMadeItIneffective[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nmade it ineffective!"); static const u8 sText_PkmnsXPreventsFlinching[] = _("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY}\nprevents flinching!"); static const u8 sText_PkmnsXPreventsYsZ[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\nprevents {B_DEF_NAME_WITH_PREFIX}'s\l{B_DEF_ABILITY} from working!"); static const u8 sText_PkmnsXCuredItsYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!"); static const u8 sText_PkmnsXHadNoEffectOnY[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nhad no effect on {B_EFF_NAME_WITH_PREFIX}!"); static const u8 sText_TooScaredToMove[] = _("{B_ATK_NAME_WITH_PREFIX} is too scared to move!"); static const u8 sText_GetOutGetOut[] = _("GHOST: Get out…… Get out……"); static const u8 sText_StatSharply[] = _("sharply "); const u8 gBattleText_Rose[] = _("rose!"); static const u8 sText_StatHarshly[] = _("harshly "); static const u8 sText_StatFell[] = _("fell!"); static const u8 sText_AttackersStatRose[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); const u8 gText_DefendersStatRose[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); static const u8 sText_UsingItemTheStatOfPkmnRose[] = _("Using {B_LAST_ITEM}, the {B_BUFF1}\nof {B_SCR_ACTIVE_NAME_WITH_PREFIX} {B_BUFF2}"); static const u8 sText_AttackersStatFell[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); static const u8 sText_DefendersStatFell[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); static const u8 sText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}'s stats won't\ngo any higher!"); static const u8 sText_StatsWontDecrease2[] = _("{B_DEF_NAME_WITH_PREFIX}'s stats won't\ngo any lower!"); static const u8 sText_CriticalHit[] = _("A critical hit!"); static const u8 sText_OneHitKO[] = _("It's a one-hit KO!"); static const u8 sText_123Poof[] = _("{PAUSE 32}1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE SE_BALL_BOUNCE_1}Poof!\p"); static const u8 sText_AndEllipsis[] = _("And…\p"); static const u8 sText_HMMovesCantBeForgotten[] = _("HM moves can't be\nforgotten now.\p"); static const u8 sText_NotVeryEffective[] = _("It's not very effective…"); static const u8 sText_SuperEffective[] = _("It's super effective!"); static const u8 sText_GotAwaySafely[] = _("{PLAY_SE SE_FLEE}Got away safely!\p"); static const u8 sText_PkmnFledUsingIts[] = _("{PLAY_SE SE_FLEE}{B_ATK_NAME_WITH_PREFIX} fled\nusing its {B_LAST_ITEM}!\p"); static const u8 sText_PkmnFledUsing[] = _("{PLAY_SE SE_FLEE}{B_ATK_NAME_WITH_PREFIX} fled\nusing {B_ATK_ABILITY}!\p"); static const u8 sText_WildPkmnFled[] = _("{PLAY_SE SE_FLEE}Wild {B_BUFF1} fled!"); static const u8 sText_PlayerDefeatedLinkTrainer[] = _("Player defeated\n{B_LINK_OPPONENT1_NAME}!"); static const u8 sText_TwoLinkTrainersDefeated[] = _("Player beat {B_LINK_OPPONENT1_NAME}\nand {B_LINK_OPPONENT2_NAME}!"); static const u8 sText_PlayerLostAgainstLinkTrainer[] = _("Player lost against\n{B_LINK_OPPONENT1_NAME}!"); static const u8 sText_PlayerLostToTwo[] = _("Player lost to {B_LINK_OPPONENT1_NAME}\nand {B_LINK_OPPONENT2_NAME}!"); static const u8 sText_PlayerBattledToDrawLinkTrainer[] = _("Player battled to a draw against\n{B_LINK_OPPONENT1_NAME}!"); static const u8 sText_PlayerBattledToDrawVsTwo[] = _("Player battled to a draw against\n{B_LINK_OPPONENT1_NAME} and {B_LINK_OPPONENT2_NAME}!"); static const u8 sText_WildFled[] = _("{PLAY_SE SE_FLEE}{B_LINK_OPPONENT1_NAME} fled!"); static const u8 sText_TwoWildFled[] = _("{PLAY_SE SE_FLEE}{B_LINK_OPPONENT1_NAME} and\n{B_LINK_OPPONENT2_NAME} fled!"); static const u8 sText_NoRunningFromTrainers[] = _("No! There's no running\nfrom a TRAINER battle!\p"); static const u8 sText_CantEscape[] = _("Can't escape!\p"); static const u8 sText_DontLeaveBirch[] = _(""); // Dummied static const u8 sText_ButNothingHappened[] = _("But nothing happened!"); static const u8 sText_ButItFailed[] = _("But it failed!"); static const u8 sText_ItHurtConfusion[] = _("It hurt itself in its\nconfusion!"); static const u8 sText_MirrorMoveFailed[] = _("The MIRROR MOVE failed!"); static const u8 sText_StartedToRain[] = _("It started to rain!"); static const u8 sText_DownpourStarted[] = _("A downpour started!"); // corresponds to DownpourText in pokegold and pokecrystal and is used by Rain Dance in GSC static const u8 sText_RainContinues[] = _("Rain continues to fall."); static const u8 sText_DownpourContinues[] = _("The downpour continues."); // unused static const u8 sText_RainStopped[] = _("The rain stopped."); static const u8 sText_SandstormBrewed[] = _("A sandstorm brewed!"); static const u8 sText_SandstormRages[] = _("The sandstorm rages."); static const u8 sText_SandstormSubsided[] = _("The sandstorm subsided."); static const u8 sText_SunlightGotBright[] = _("The sunlight got bright!"); static const u8 sText_SunlightStrong[] = _("The sunlight is strong."); static const u8 sText_SunlightFaded[] = _("The sunlight faded."); static const u8 sText_StartedHail[] = _("It started to hail!"); static const u8 sText_HailContinues[] = _("Hail continues to fall."); static const u8 sText_HailStopped[] = _("The hail stopped."); static const u8 sText_FailedToSpitUp[] = _("But it failed to SPIT UP\na thing!"); static const u8 sText_FailedToSwallow[] = _("But it failed to SWALLOW\na thing!"); static const u8 sText_WindBecameHeatWave[] = _("The wind turned into a\nHEAT WAVE!"); static const u8 sText_StatChangesGone[] = _("All stat changes were\neliminated!"); static const u8 sText_CoinsScattered[] = _("Coins scattered everywhere!"); static const u8 sText_TooWeakForSubstitute[] = _("It was too weak to make\na SUBSTITUTE!"); static const u8 sText_SharedPain[] = _("The battlers shared\ntheir pain!"); static const u8 sText_BellChimed[] = _("A bell chimed!"); static const u8 sText_FaintInThree[] = _("All affected POKéMON will\nfaint in three turns!"); static const u8 sText_NoPPLeft[] = _("There's no PP left for\nthis move!\p"); static const u8 sText_ButNoPPLeft[] = _("But there was no PP left\nfor the move!"); static const u8 sText_PkmnIgnoresAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} ignored\norders while asleep!"); static const u8 sText_PkmnIgnoredOrders[] = _("{B_ATK_NAME_WITH_PREFIX} ignored\norders!"); static const u8 sText_PkmnBeganToNap[] = _("{B_ATK_NAME_WITH_PREFIX} began to nap!"); static const u8 sText_PkmnLoafing[] = _("{B_ATK_NAME_WITH_PREFIX} is\nloafing around!"); static const u8 sText_PkmnWontObey[] = _("{B_ATK_NAME_WITH_PREFIX} won't\nobey!"); static const u8 sText_PkmnTurnedAway[] = _("{B_ATK_NAME_WITH_PREFIX} turned away!"); static const u8 sText_PkmnPretendNotNotice[] = _("{B_ATK_NAME_WITH_PREFIX} pretended\nnot to notice!"); static const u8 sText_EnemyAboutToSwitchPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} is\nabout to use {B_BUFF2}.\pWill {B_PLAYER_NAME} change\nPOKéMON?"); static const u8 sText_EnemyAboutToSwitchPkmnNoPredict[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} is\nabout to switch POKéMON.\pWill {B_PLAYER_NAME} change\nPOKéMON?"); static const u8 sText_PkmnLearnedMove2[] = _("{B_ATK_NAME_WITH_PREFIX} learned\n{B_BUFF1}!"); static const u8 sText_PlayerDefeatedLinkTrainerTrainer1[] = _("Player defeated\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!\p"); static const u8 sText_ThrewARock[] = _("{B_PLAYER_NAME} threw a ROCK\nat the {B_OPPONENT_MON1_NAME}!"); static const u8 sText_ThrewSomeBait[] = _("{B_PLAYER_NAME} threw some BAIT\nat the {B_OPPONENT_MON1_NAME}!"); static const u8 sText_PkmnWatchingCarefully[] = _("{B_OPPONENT_MON1_NAME} is watching\ncarefully!"); static const u8 sText_PkmnIsAngry[] = _("{B_OPPONENT_MON1_NAME} is angry!"); static const u8 sText_PkmnIsEating[] = _("{B_OPPONENT_MON1_NAME} is eating!"); static const u8 sText_OutOfSafariBalls[] = _("{PLAY_SE SE_DING_DONG}ANNOUNCER: You're out of\nSAFARI BALLS! Game over!\p"); static const u8 sText_WildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p"); static const u8 sText_WildPkmnAppeared2[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p"); static const u8 sText_WildPkmnAppearedPause[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!{PAUSE 127}"); static const u8 sText_TwoWildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} and\n{B_OPPONENT_MON2_NAME} appeared!\p"); static const u8 sText_GhostAppearedCantId[] = _("The GHOST appeared!\pDarn!\nThe GHOST can't be ID'd!\p"); static const u8 sText_TheGhostAppeared[] = _("The GHOST appeared!\p"); static const u8 sText_SilphScopeUnveil[] = _("SILPH SCOPE unveiled the GHOST's\nidentity!"); static const u8 sText_TheGhostWas[] = _("The GHOST was MAROWAK!\p\n"); static const u8 sText_Trainer1WantsToBattle[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwould like to battle!\p"); static const u8 sText_LinkTrainerWantsToBattle[] = _("{B_LINK_OPPONENT1_NAME}\nwants to battle!"); static const u8 sText_TwoLinkTrainersWantToBattle[] = _("{B_LINK_OPPONENT1_NAME} and {B_LINK_OPPONENT2_NAME}\nwant to battle!"); static const u8 sText_Trainer1SentOutPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME}!{PAUSE 60}"); static const u8 sText_Trainer1SentOutTwoPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!{PAUSE 60}"); static const u8 sText_Trainer1SentOutPkmn2[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_BUFF1}!"); static const u8 sText_LinkTrainerSentOutPkmn[] = _("{B_LINK_OPPONENT1_NAME} sent out\n{B_OPPONENT_MON1_NAME}!"); static const u8 sText_LinkTrainerSentOutTwoPkmn[] = _("{B_LINK_OPPONENT1_NAME} sent out\n{B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!"); static const u8 sText_TwoLinkTrainersSentOutPkmn[] = _("{B_LINK_OPPONENT1_NAME} sent out {B_LINK_OPPONENT_MON1_NAME}!\n{B_LINK_OPPONENT2_NAME} sent out {B_LINK_OPPONENT_MON2_NAME}!"); static const u8 sText_LinkTrainerSentOutPkmn2[] = _("{B_LINK_OPPONENT1_NAME} sent out\n{B_BUFF1}!"); static const u8 sText_LinkTrainerMultiSentOutPkmn[] = _("{B_LINK_SCR_TRAINER_NAME} sent out\n{B_BUFF1}!"); static const u8 sText_GoPkmn[] = _("Go! {B_PLAYER_MON1_NAME}!"); static const u8 sText_GoTwoPkmn[] = _("Go! {B_PLAYER_MON1_NAME} and\n{B_PLAYER_MON2_NAME}!"); static const u8 sText_GoPkmn2[] = _("Go! {B_BUFF1}!"); static const u8 sText_DoItPkmn[] = _("Do it! {B_BUFF1}!"); static const u8 sText_GoForItPkmn[] = _("Go for it, {B_BUFF1}!"); static const u8 sText_YourFoesWeakGetEmPkmn[] = _("Your foe's weak!\nGet 'em, {B_BUFF1}!"); static const u8 sText_LinkPartnerSentOutPkmnGoPkmn[] = _("{B_LINK_PARTNER_NAME} sent out {B_LINK_PLAYER_MON2_NAME}!\nGo! {B_LINK_PLAYER_MON1_NAME}!"); static const u8 sText_PkmnThatsEnough[] = _("{B_BUFF1}, that's enough!\nCome back!"); static const u8 sText_PkmnComeBack[] = _("{B_BUFF1}, come back!"); static const u8 sText_PkmnOkComeBack[] = _("{B_BUFF1}, OK!\nCome back!"); const u8 sText_PkmnGoodComeBack[] = _("{B_BUFF1}, good!\nCome back!"); static const u8 sText_Trainer1WithdrewPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwithdrew {B_BUFF1}!"); static const u8 sText_LinkTrainer1WithdrewPkmn[] = _("{B_LINK_OPPONENT1_NAME} withdrew\n{B_BUFF1}!"); static const u8 sText_LinkTrainer2WithdrewPkmn[] = _("{B_LINK_SCR_TRAINER_NAME} withdrew\n{B_BUFF1}!"); static const u8 sText_WildPkmnPrefix[] = _("Wild "); static const u8 sText_FoePkmnPrefix[] = _("Foe "); static const u8 sText_FoePkmnPrefix2[] = _("Foe"); static const u8 sText_AllyPkmnPrefix[] = _("Ally"); static const u8 sText_FoePkmnPrefix3[] = _("Foe"); static const u8 sText_AllyPkmnPrefix2[] = _("Ally"); static const u8 sText_FoePkmnPrefix4[] = _("Foe"); static const u8 sText_AllyPkmnPrefix3[] = _("Ally"); static const u8 sText_AttackerUsedX[] = _("{B_ATK_NAME_WITH_PREFIX} used\n{B_BUFF2}!"); static const u8 sText_MonPickedUpItem[] = _("Your POKéMON picked\nup some items!"); static const u8 sText_MonPickedUpItemSolo[] = _("{B_BUFF1} picked up {B_BUFF2} {B_BUFF3}!"); //link title strings static const u8 sText_LinkTrainerSentOutPkmnTitle[] = _("{B_LINK_OPPONENT1_NAME}\nsent out {B_OPPONENT_MON1_NAME}!"); static const u8 sText_LinkTrainerSentOutTwoPkmnTitle[] = _("{B_LINK_OPPONENT1_NAME}\nsent out {B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!"); static const u8 sText_LinkPartnerSentOutPkmnGoPkmnTitle[] = _("{B_LINK_PARTNER_NAME}\nsent out {B_LINK_PLAYER_MON2_NAME}!\lGo! {B_LINK_PLAYER_MON1_NAME}!"); static const u8 sText_TwoLinkTrainersSentOutPkmnYY[] = _("{B_LINK_OPPONENT1_NAME}\nsent out {B_LINK_OPPONENT_MON1_NAME}!\p{B_LINK_OPPONENT2_NAME}\nsent out {B_LINK_OPPONENT_MON2_NAME}!"); static const u8 sText_TwoLinkTrainersSentOutPkmnYN[] = _("{B_LINK_OPPONENT1_NAME}\nsent out {B_LINK_OPPONENT_MON1_NAME}!\l{B_LINK_OPPONENT2_NAME} sent out {B_LINK_OPPONENT_MON2_NAME}!"); static const u8 sText_TwoLinkTrainersSentOutPkmnNY[] = _("{B_LINK_OPPONENT1_NAME} sent out {B_LINK_OPPONENT_MON1_NAME}!\p{B_LINK_OPPONENT2_NAME}\nsent out {B_LINK_OPPONENT_MON2_NAME}!"); static const u8 sText_LinkTrainer1WithdrewPkmnTitle[] = _("{B_LINK_OPPONENT1_NAME}\nwithdrew {B_BUFF1}!"); static const u8 sText_LinkTrainer2WithdrewPkmnTitle[] = _("{B_LINK_SCR_TRAINER_NAME}\nwithdrew {B_BUFF1}!"); static const u8 sText_LinkTrainerSentOutPkmn2Title[] = _("{B_LINK_OPPONENT1_NAME}\nsent out {B_BUFF1}!"); static const u8 sText_LinkTrainerMultiSentOutPkmnTitle[] = _("{B_LINK_SCR_TRAINER_NAME}\nsent out {B_BUFF1}!"); static const u8 sText_TwoLinkTrainersWantToBattleYY[] = _("{B_LINK_OPPONENT1_NAME} and\n{B_LINK_OPPONENT2_NAME}\lwant to battle!"); static const u8 sText_TwoLinkTrainersWantToBattleYN[] = _("{B_LINK_OPPONENT1_NAME} and\n{B_LINK_OPPONENT2_NAME} want to battle!"); static const u8 sText_HP2[] = _("HP"); static const u8 sText_Attack2[] = _("ATTACK"); static const u8 sText_Defense2[] = _("DEFENSE"); static const u8 sText_Speed[] = _("SPEED"); static const u8 sText_SpAtk2[] = _("SP. ATK"); static const u8 sText_SpDef2[] = _("SP. DEF"); static const u8 sText_Accuracy[] = _("accuracy"); static const u8 sText_Evasiveness[] = _("evasiveness"); const u8 *const gStatNamesTable[] = { sText_HP2, sText_Attack2, sText_Defense2, sText_Speed, sText_SpAtk2, sText_SpDef2, sText_Accuracy, sText_Evasiveness }; static const u8 sText_PokeblockWasTooSpicy[] = _("was too spicy!"); // static const u8 sText_PokeblockWasTooDry[] = _("was too dry!"); static const u8 sText_PokeblockWasTooSweet[] = _("was too sweet!"); static const u8 sText_PokeblockWasTooBitter[] = _("was too bitter!"); static const u8 sText_PokeblockWasTooSour[] = _("was too sour!"); const u8 *const gPokeblockWasTooXStringTable[] = { sText_PokeblockWasTooSpicy, sText_PokeblockWasTooDry, sText_PokeblockWasTooSweet, sText_PokeblockWasTooBitter, sText_PokeblockWasTooSour }; static const u8 sText_PlayerUsedItem[] = _("{B_PLAYER_NAME} used\n{B_LAST_ITEM}!"); static const u8 sText_OldManUsedItem[] = _("The old man used\n{B_LAST_ITEM}!"); static const u8 sText_PokedudeUsedItem[] = _("The POKé DUDE used\n{B_LAST_ITEM}!"); static const u8 sText_Trainer1UsedItem[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nused {B_LAST_ITEM}!"); static const u8 sText_TrainerBlockedBall[] = _("The TRAINER blocked the BALL!"); static const u8 sText_DontBeAThief[] = _("Don't be a thief!"); static const u8 sText_ItDodgedBall[] = _("It dodged the thrown BALL!\nThis POKéMON can't be caught!"); static const u8 sText_YouMissedPkmn[] = _("You missed the POKéMON!"); static const u8 sText_PkmnBrokeFree[] = _("Oh, no!\nThe POKéMON broke free!"); static const u8 sText_ItAppearedCaught[] = _("Aww!\nIt appeared to be caught!"); static const u8 sText_AarghAlmostHadIt[] = _("Aargh!\nAlmost had it!"); static const u8 sText_ShootSoClose[] = _("Shoot!\nIt was so close, too!"); static const u8 sText_GotchaPkmnCaught[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{WAIT_SE}{PLAY_BGM MUS_CAUGHT}\p"); static const u8 sText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{WAIT_SE}{PLAY_BGM MUS_CAUGHT}{PAUSE 127}"); static const u8 sText_GiveNicknameCaptured[] = _("Give a nickname to the\ncaptured {B_OPPONENT_MON1_NAME}?"); static const u8 sText_PkmnSentToPC[] = _("{B_OPPONENT_MON1_NAME} was sent to\n{B_PC_CREATOR_NAME} PC."); static const u8 sText_Someones[] = _("someone's"); static const u8 sText_Bills[] = _("BILL's"); static const u8 sText_PkmnDataAddedToDex[] = _("{B_OPPONENT_MON1_NAME}'s data was\nadded to the POKéDEX.\p"); static const u8 sText_ItIsRaining[] = _("It is raining."); // used only in RSE when a battle starts in a rainy area static const u8 sText_SandstormIsRaging[] = _("A sandstorm is raging."); static const u8 sText_BoxIsFull[] = _("The BOX is full!\nYou can't catch any more!\p"); static const u8 sText_EnigmaBerry[] = _("ENIGMA BERRY"); static const u8 sText_BerrySuffix[] = _(" BERRY"); static const u8 sText_PkmnsItemCuredParalysis[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\ncured paralysis!"); static const u8 sText_PkmnsItemCuredPoison[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\ncured poison!"); static const u8 sText_PkmnsItemHealedBurn[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\nhealed its burn!"); static const u8 sText_PkmnsItemDefrostedIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\ndefrosted it!"); static const u8 sText_PkmnsItemWokeIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\nwoke it from its sleep!"); static const u8 sText_PkmnsItemSnappedOut[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\nsnapped it out of confusion!"); static const u8 sText_PkmnsItemCuredProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\ncured its {B_BUFF1} problem!"); static const u8 sText_PkmnsItemNormalizedStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\nnormalized its status!"); static const u8 sText_PkmnsItemRestoredHealth[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\nrestored health!"); static const u8 sText_PkmnsItemRestoredPP[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\nrestored {B_BUFF1}'s PP!"); static const u8 sText_PkmnsItemRestoredStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\nrestored its status!"); static const u8 sText_PkmnsItemRestoredHPALittle[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\nrestored its HP a little!"); static const u8 sText_ItemAllowsOnlyYMove[] = _("{B_LAST_ITEM}'s effect allows only\n{B_CURRENT_MOVE} to be used!\p"); static const u8 sText_PkmnHungOnWithX[] = _("{B_DEF_NAME_WITH_PREFIX} hung on\nusing its {B_LAST_ITEM}!"); const u8 gText_EmptyString3[] = _(""); static const u8 sText_PlayedFluteCatchyTune[] = _("{B_PLAYER_NAME} played the {B_LAST_ITEM}.\pNow, that's a catchy tune!"); static const u8 sText_PlayedThe[] = _("{B_PLAYER_NAME} played the\n{B_LAST_ITEM}."); static const u8 sText_PkmnHearingFluteAwoke[] = _("The POKéMON hearing the FLUTE\nawoke!"); static const u8 sText_YouThrowABallNowRight[] = _("You throw a BALL now, right?\nI… I'll do my best!"); const u8 gText_ForPetesSake[] = _("OAK: Oh, for Pete's sake…\nSo pushy, as always.\p{B_PLAYER_NAME}.\pYou've never had a POKéMON battle\nbefore, have you?\pA POKéMON battle is when TRAINERS\npit their POKéMON against each\lother.\p"); const u8 gText_TheTrainerThat[] = _("The TRAINER that makes the other\nTRAINER's POKéMON faint by lowering\ltheir HP to “0,” wins.\p"); const u8 gText_TryBattling[] = _("But rather than talking about it,\nyou'll learn more from experience.\pTry battling and see for yourself.\p"); const u8 gText_InflictingDamageIsKey[] = _("OAK: Inflicting damage on the foe\nis the key to any battle.\p"); const u8 gText_LoweringStats[] = _("OAK: Lowering the foe's stats\nwill put you at an advantage.\p"); const u8 gText_KeepAnEyeOnHP[] = _("OAK: Keep your eyes on your\nPOKéMON's HP.\pIt will faint if the HP drops to\n“0.”\p"); const u8 gText_OakNoRunningFromATrainer[] = _("OAK: No! There's no running away\nfrom a TRAINER POKéMON battle!\p"); const u8 gText_WinEarnsPrizeMoney[] = _("OAK: Hm! Excellent!\pIf you win, you earn prize money,\nand your POKéMON will grow!\pBattle other TRAINERS and make\nyour POKéMON strong!\p"); const u8 gText_HowDissapointing[] = _("OAK: Hm…\nHow disappointing…\pIf you win, you earn prize money,\nand your POKéMON grow.\pBut if you lose, {B_PLAYER_NAME}, you end\nup paying prize money…\pHowever, since you had no warning\nthis time, I'll pay for you.\pBut things won't be this way once\nyou step outside these doors.\pThat's why you must strengthen your\nPOKéMON by battling wild POKéMON.\p"); const u8 gText_GrandMaster[] = _("GRAND MASTER "); const u8 gText_Master[] = _(" MASTER "); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_START] = { [STRINGID_TRAINER1LOSETEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer1LoseText, [STRINGID_PKMNGAINEDEXP - BATTLESTRINGS_TABLE_START] = sText_PkmnGainedEXP, [STRINGID_PKMNGREWTOLV - BATTLESTRINGS_TABLE_START] = sText_PkmnGrewToLv, [STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnLearnedMove, [STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_TABLE_START] = sText_TryToLearnMove1, [STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_TABLE_START] = sText_TryToLearnMove2, [STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_TABLE_START] = sText_TryToLearnMove3, [STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnForgotMove, [STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_TABLE_START] = sText_StopLearningMove, [STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_TABLE_START] = sText_DidNotLearnMove, [STRINGID_PKMNLEARNEDMOVE2 - BATTLESTRINGS_TABLE_START] = sText_PkmnLearnedMove2, [STRINGID_ATTACKMISSED - BATTLESTRINGS_TABLE_START] = sText_AttackMissed, [STRINGID_PKMNPROTECTEDITSELF - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedItself, [STRINGID_STATSWONTINCREASE2 - BATTLESTRINGS_TABLE_START] = sText_StatsWontIncrease2, [STRINGID_AVOIDEDDAMAGE - BATTLESTRINGS_TABLE_START] = sText_AvoidedDamage, [STRINGID_ITDOESNTAFFECT - BATTLESTRINGS_TABLE_START] = sText_ItDoesntAffect, [STRINGID_ATTACKERFAINTED - BATTLESTRINGS_TABLE_START] = sText_AttackerFainted, [STRINGID_TARGETFAINTED - BATTLESTRINGS_TABLE_START] = sText_TargetFainted, [STRINGID_PLAYERGOTMONEY - BATTLESTRINGS_TABLE_START] = sText_PlayerGotMoney, [STRINGID_PLAYERWHITEOUT - BATTLESTRINGS_TABLE_START] = sText_PlayerWhiteout, [STRINGID_PLAYERWHITEOUT2 - BATTLESTRINGS_TABLE_START] = sText_PlayerPanicked, [STRINGID_PREVENTSESCAPE - BATTLESTRINGS_TABLE_START] = sText_PreventsEscape, [STRINGID_HITXTIMES - BATTLESTRINGS_TABLE_START] = sText_HitXTimes, [STRINGID_PKMNFELLASLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnFellAsleep, [STRINGID_PKMNMADESLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnMadeSleep, [STRINGID_PKMNALREADYASLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyAsleep, [STRINGID_PKMNALREADYASLEEP2 - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyAsleep2, [STRINGID_PKMNWASNTAFFECTED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasntAffected, [STRINGID_PKMNWASPOISONED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasPoisoned, [STRINGID_PKMNPOISONEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnPoisonedBy, [STRINGID_PKMNHURTBYPOISON - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtByPoison, [STRINGID_PKMNALREADYPOISONED - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyPoisoned, [STRINGID_PKMNBADLYPOISONED - BATTLESTRINGS_TABLE_START] = sText_PkmnBadlyPoisoned, [STRINGID_PKMNENERGYDRAINED - BATTLESTRINGS_TABLE_START] = sText_PkmnEnergyDrained, [STRINGID_PKMNWASBURNED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasBurned, [STRINGID_PKMNBURNEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnBurnedBy, [STRINGID_PKMNHURTBYBURN - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtByBurn, [STRINGID_PKMNWASFROZEN - BATTLESTRINGS_TABLE_START] = sText_PkmnWasFrozen, [STRINGID_PKMNFROZENBY - BATTLESTRINGS_TABLE_START] = sText_PkmnFrozenBy, [STRINGID_PKMNISFROZEN - BATTLESTRINGS_TABLE_START] = sText_PkmnIsFrozen, [STRINGID_PKMNWASDEFROSTED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasDefrosted, [STRINGID_PKMNWASDEFROSTED2 - BATTLESTRINGS_TABLE_START] = sText_PkmnWasDefrosted2, [STRINGID_PKMNWASDEFROSTEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnWasDefrostedBy, [STRINGID_PKMNWASPARALYZED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasParalyzed, [STRINGID_PKMNWASPARALYZEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnWasParalyzedBy, [STRINGID_PKMNISPARALYZED - BATTLESTRINGS_TABLE_START] = sText_PkmnIsParalyzed, [STRINGID_PKMNISALREADYPARALYZED - BATTLESTRINGS_TABLE_START] = sText_PkmnIsAlreadyParalyzed, [STRINGID_PKMNHEALEDPARALYSIS - BATTLESTRINGS_TABLE_START] = sText_PkmnHealedParalysis, [STRINGID_PKMNDREAMEATEN - BATTLESTRINGS_TABLE_START] = sText_PkmnDreamEaten, [STRINGID_STATSWONTINCREASE - BATTLESTRINGS_TABLE_START] = sText_StatsWontIncrease, [STRINGID_STATSWONTDECREASE - BATTLESTRINGS_TABLE_START] = sText_StatsWontDecrease, [STRINGID_TEAMSTOPPEDWORKING - BATTLESTRINGS_TABLE_START] = sText_TeamStoppedWorking, [STRINGID_FOESTOPPEDWORKING - BATTLESTRINGS_TABLE_START] = sText_FoeStoppedWorking, [STRINGID_PKMNISCONFUSED - BATTLESTRINGS_TABLE_START] = sText_PkmnIsConfused, [STRINGID_PKMNHEALEDCONFUSION - BATTLESTRINGS_TABLE_START] = sText_PkmnHealedConfusion, [STRINGID_PKMNWASCONFUSED - BATTLESTRINGS_TABLE_START] = sText_PkmnWasConfused, [STRINGID_PKMNALREADYCONFUSED - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyConfused, [STRINGID_PKMNFELLINLOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnFellInLove, [STRINGID_PKMNINLOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnInLove, [STRINGID_PKMNIMMOBILIZEDBYLOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnImmobilizedByLove, [STRINGID_PKMNBLOWNAWAY - BATTLESTRINGS_TABLE_START] = sText_PkmnBlownAway, [STRINGID_PKMNCHANGEDTYPE - BATTLESTRINGS_TABLE_START] = sText_PkmnChangedType, [STRINGID_PKMNFLINCHED - BATTLESTRINGS_TABLE_START] = sText_PkmnFlinched, [STRINGID_PKMNREGAINEDHEALTH - BATTLESTRINGS_TABLE_START] = sText_PkmnRegainedHealth, [STRINGID_PKMNHPFULL - BATTLESTRINGS_TABLE_START] = sText_PkmnHPFull, [STRINGID_PKMNRAISEDSPDEF - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedSpDef, [STRINGID_PKMNRAISEDDEF - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedDef, [STRINGID_PKMNCOVEREDBYVEIL - BATTLESTRINGS_TABLE_START] = sText_PkmnCoveredByVeil, [STRINGID_PKMNUSEDSAFEGUARD - BATTLESTRINGS_TABLE_START] = sText_PkmnUsedSafeguard, [STRINGID_PKMNSAFEGUARDEXPIRED - BATTLESTRINGS_TABLE_START] = sText_PkmnSafeguardExpired, [STRINGID_PKMNWENTTOSLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnWentToSleep, [STRINGID_PKMNSLEPTHEALTHY - BATTLESTRINGS_TABLE_START] = sText_PkmnSleptHealthy, [STRINGID_PKMNWHIPPEDWHIRLWIND - BATTLESTRINGS_TABLE_START] = sText_PkmnWhippedWhirlwind, [STRINGID_PKMNTOOKSUNLIGHT - BATTLESTRINGS_TABLE_START] = sText_PkmnTookSunlight, [STRINGID_PKMNLOWEREDHEAD - BATTLESTRINGS_TABLE_START] = sText_PkmnLoweredHead, [STRINGID_PKMNISGLOWING - BATTLESTRINGS_TABLE_START] = sText_PkmnIsGlowing, [STRINGID_PKMNFLEWHIGH - BATTLESTRINGS_TABLE_START] = sText_PkmnFlewHigh, [STRINGID_PKMNDUGHOLE - BATTLESTRINGS_TABLE_START] = sText_PkmnDugHole, [STRINGID_PKMNSQUEEZEDBYBIND - BATTLESTRINGS_TABLE_START] = sText_PkmnSqueezedByBind, [STRINGID_PKMNTRAPPEDINVORTEX - BATTLESTRINGS_TABLE_START] = sText_PkmnTrappedInVortex, [STRINGID_PKMNWRAPPEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnWrappedBy, [STRINGID_PKMNCLAMPED - BATTLESTRINGS_TABLE_START] = sText_PkmnClamped, [STRINGID_PKMNHURTBY - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtBy, [STRINGID_PKMNFREEDFROM - BATTLESTRINGS_TABLE_START] = sText_PkmnFreedFrom, [STRINGID_PKMNCRASHED - BATTLESTRINGS_TABLE_START] = sText_PkmnCrashed, [STRINGID_PKMNSHROUDEDINMIST - BATTLESTRINGS_TABLE_START] = gBattleText_MistShroud, [STRINGID_PKMNPROTECTEDBYMIST - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedByMist, [STRINGID_PKMNGETTINGPUMPED - BATTLESTRINGS_TABLE_START] = gBattleText_GetPumped, [STRINGID_PKMNHITWITHRECOIL - BATTLESTRINGS_TABLE_START] = sText_PkmnHitWithRecoil, [STRINGID_PKMNPROTECTEDITSELF2 - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedItself2, [STRINGID_PKMNBUFFETEDBYSANDSTORM - BATTLESTRINGS_TABLE_START] = sText_PkmnBuffetedBySandstorm, [STRINGID_PKMNPELTEDBYHAIL - BATTLESTRINGS_TABLE_START] = sText_PkmnPeltedByHail, [STRINGID_PKMNSEEDED - BATTLESTRINGS_TABLE_START] = sText_PkmnSeeded, [STRINGID_PKMNEVADEDATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnEvadedAttack, [STRINGID_PKMNSAPPEDBYLEECHSEED - BATTLESTRINGS_TABLE_START] = sText_PkmnSappedByLeechSeed, [STRINGID_PKMNFASTASLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnFastAsleep, [STRINGID_PKMNWOKEUP - BATTLESTRINGS_TABLE_START] = sText_PkmnWokeUp, [STRINGID_PKMNUPROARKEPTAWAKE - BATTLESTRINGS_TABLE_START] = sText_PkmnUproarKeptAwake, [STRINGID_PKMNWOKEUPINUPROAR - BATTLESTRINGS_TABLE_START] = sText_PkmnWokeUpInUproar, [STRINGID_PKMNCAUSEDUPROAR - BATTLESTRINGS_TABLE_START] = sText_PkmnCausedUproar, [STRINGID_PKMNMAKINGUPROAR - BATTLESTRINGS_TABLE_START] = sText_PkmnMakingUproar, [STRINGID_PKMNCALMEDDOWN - BATTLESTRINGS_TABLE_START] = sText_PkmnCalmedDown, [STRINGID_PKMNCANTSLEEPINUPROAR - BATTLESTRINGS_TABLE_START] = sText_PkmnCantSleepInUproar, [STRINGID_PKMNSTOCKPILED - BATTLESTRINGS_TABLE_START] = sText_PkmnStockpiled, [STRINGID_PKMNCANTSTOCKPILE - BATTLESTRINGS_TABLE_START] = sText_PkmnCantStockpile, [STRINGID_PKMNCANTSLEEPINUPROAR2 - BATTLESTRINGS_TABLE_START] = sText_PkmnCantSleepInUproar2, [STRINGID_UPROARKEPTPKMNAWAKE - BATTLESTRINGS_TABLE_START] = sText_UproarKeptPkmnAwake, [STRINGID_PKMNSTAYEDAWAKEUSING - BATTLESTRINGS_TABLE_START] = sText_PkmnStayedAwakeUsing, [STRINGID_PKMNSTORINGENERGY - BATTLESTRINGS_TABLE_START] = sText_PkmnStoringEnergy, [STRINGID_PKMNUNLEASHEDENERGY - BATTLESTRINGS_TABLE_START] = sText_PkmnUnleashedEnergy, [STRINGID_PKMNFATIGUECONFUSION - BATTLESTRINGS_TABLE_START] = sText_PkmnFatigueConfusion, [STRINGID_PLAYERPICKEDUPMONEY - BATTLESTRINGS_TABLE_START] = sText_PkmnPickedUpItem, [STRINGID_PKMNUNAFFECTED - BATTLESTRINGS_TABLE_START] = sText_PkmnUnaffected, [STRINGID_PKMNTRANSFORMEDINTO - BATTLESTRINGS_TABLE_START] = sText_PkmnTransformedInto, [STRINGID_PKMNMADESUBSTITUTE - BATTLESTRINGS_TABLE_START] = sText_PkmnMadeSubstitute, [STRINGID_PKMNHASSUBSTITUTE - BATTLESTRINGS_TABLE_START] = sText_PkmnHasSubstitute, [STRINGID_SUBSTITUTEDAMAGED - BATTLESTRINGS_TABLE_START] = sText_SubstituteDamaged, [STRINGID_PKMNSUBSTITUTEFADED - BATTLESTRINGS_TABLE_START] = sText_PkmnSubstituteFaded, [STRINGID_PKMNMUSTRECHARGE - BATTLESTRINGS_TABLE_START] = sText_PkmnMustRecharge, [STRINGID_PKMNRAGEBUILDING - BATTLESTRINGS_TABLE_START] = sText_PkmnRageBuilding, [STRINGID_PKMNMOVEWASDISABLED - BATTLESTRINGS_TABLE_START] = sText_PkmnMoveWasDisabled, [STRINGID_PKMNMOVEISDISABLED - BATTLESTRINGS_TABLE_START] = sText_PkmnMoveIsDisabled, [STRINGID_PKMNMOVEDISABLEDNOMORE - BATTLESTRINGS_TABLE_START] = sText_PkmnMoveDisabledNoMore, [STRINGID_PKMNGOTENCORE - BATTLESTRINGS_TABLE_START] = sText_PkmnGotEncore, [STRINGID_PKMNENCOREENDED - BATTLESTRINGS_TABLE_START] = sText_PkmnEncoreEnded, [STRINGID_PKMNTOOKAIM - BATTLESTRINGS_TABLE_START] = sText_PkmnTookAim, [STRINGID_PKMNSKETCHEDMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnSketchedMove, [STRINGID_PKMNTRYINGTOTAKEFOE - BATTLESTRINGS_TABLE_START] = sText_PkmnTryingToTakeFoe, [STRINGID_PKMNTOOKFOE - BATTLESTRINGS_TABLE_START] = sText_PkmnTookFoe, [STRINGID_PKMNREDUCEDPP - BATTLESTRINGS_TABLE_START] = sText_PkmnReducedPP, [STRINGID_PKMNSTOLEITEM - BATTLESTRINGS_TABLE_START] = sText_PkmnStoleItem, [STRINGID_TARGETCANTESCAPENOW - BATTLESTRINGS_TABLE_START] = sText_TargetCantEscapeNow, [STRINGID_PKMNFELLINTONIGHTMARE - BATTLESTRINGS_TABLE_START] = sText_PkmnFellIntoNightmare, [STRINGID_PKMNLOCKEDINNIGHTMARE - BATTLESTRINGS_TABLE_START] = sText_PkmnLockedInNightmare, [STRINGID_PKMNLAIDCURSE - BATTLESTRINGS_TABLE_START] = sText_PkmnLaidCurse, [STRINGID_PKMNAFFLICTEDBYCURSE - BATTLESTRINGS_TABLE_START] = sText_PkmnAfflictedByCurse, [STRINGID_SPIKESSCATTERED - BATTLESTRINGS_TABLE_START] = sText_SpikesScattered, [STRINGID_PKMNHURTBYSPIKES - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtBySpikes, [STRINGID_PKMNIDENTIFIED - BATTLESTRINGS_TABLE_START] = sText_PkmnIdentified, [STRINGID_PKMNPERISHCOUNTFELL - BATTLESTRINGS_TABLE_START] = sText_PkmnPerishCountFell, [STRINGID_PKMNBRACEDITSELF - BATTLESTRINGS_TABLE_START] = sText_PkmnBracedItself, [STRINGID_PKMNENDUREDHIT - BATTLESTRINGS_TABLE_START] = sText_PkmnEnduredHit, [STRINGID_MAGNITUDESTRENGTH - BATTLESTRINGS_TABLE_START] = sText_MagnitudeStrength, [STRINGID_PKMNCUTHPMAXEDATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnCutHPMaxedAttack, [STRINGID_PKMNCOPIEDSTATCHANGES - BATTLESTRINGS_TABLE_START] = sText_PkmnCopiedStatChanges, [STRINGID_PKMNGOTFREE - BATTLESTRINGS_TABLE_START] = sText_PkmnGotFree, [STRINGID_PKMNSHEDLEECHSEED - BATTLESTRINGS_TABLE_START] = sText_PkmnShedLeechSeed, [STRINGID_PKMNBLEWAWAYSPIKES - BATTLESTRINGS_TABLE_START] = sText_PkmnBlewAwaySpikes, [STRINGID_PKMNFLEDFROMBATTLE - BATTLESTRINGS_TABLE_START] = sText_PkmnFledFromBattle, [STRINGID_PKMNFORESAWATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnForesawAttack, [STRINGID_PKMNTOOKATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnTookAttack, [STRINGID_PKMNATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnAttack, [STRINGID_PKMNCENTERATTENTION - BATTLESTRINGS_TABLE_START] = sText_PkmnCenterAttention, [STRINGID_PKMNCHARGINGPOWER - BATTLESTRINGS_TABLE_START] = sText_PkmnChargingPower, [STRINGID_NATUREPOWERTURNEDINTO - BATTLESTRINGS_TABLE_START] = sText_NaturePowerTurnedInto, [STRINGID_PKMNSTATUSNORMAL - BATTLESTRINGS_TABLE_START] = sText_PkmnStatusNormal, [STRINGID_PKMNHASNOMOVESLEFT - BATTLESTRINGS_TABLE_START] = sText_PkmnHasNoMovesLeft, [STRINGID_PKMNSUBJECTEDTOTORMENT - BATTLESTRINGS_TABLE_START] = sText_PkmnSubjectedToTorment, [STRINGID_PKMNCANTUSEMOVETORMENT - BATTLESTRINGS_TABLE_START] = sText_PkmnCantUseMoveTorment, [STRINGID_PKMNTIGHTENINGFOCUS - BATTLESTRINGS_TABLE_START] = sText_PkmnTighteningFocus, [STRINGID_PKMNFELLFORTAUNT - BATTLESTRINGS_TABLE_START] = sText_PkmnFellForTaunt, [STRINGID_PKMNCANTUSEMOVETAUNT - BATTLESTRINGS_TABLE_START] = sText_PkmnCantUseMoveTaunt, [STRINGID_PKMNREADYTOHELP - BATTLESTRINGS_TABLE_START] = sText_PkmnReadyToHelp, [STRINGID_PKMNSWITCHEDITEMS - BATTLESTRINGS_TABLE_START] = sText_PkmnSwitchedItems, [STRINGID_PKMNCOPIEDFOE - BATTLESTRINGS_TABLE_START] = sText_PkmnCopiedFoe, [STRINGID_PKMNMADEWISH - BATTLESTRINGS_TABLE_START] = sText_PkmnMadeWish, [STRINGID_PKMNWISHCAMETRUE - BATTLESTRINGS_TABLE_START] = sText_PkmnWishCameTrue, [STRINGID_PKMNPLANTEDROOTS - BATTLESTRINGS_TABLE_START] = sText_PkmnPlantedRoots, [STRINGID_PKMNABSORBEDNUTRIENTS - BATTLESTRINGS_TABLE_START] = sText_PkmnAbsorbedNutrients, [STRINGID_PKMNANCHOREDITSELF - BATTLESTRINGS_TABLE_START] = sText_PkmnAnchoredItself, [STRINGID_PKMNWASMADEDROWSY - BATTLESTRINGS_TABLE_START] = sText_PkmnWasMadeDrowsy, [STRINGID_PKMNKNOCKEDOFF - BATTLESTRINGS_TABLE_START] = sText_PkmnKnockedOff, [STRINGID_PKMNSWAPPEDABILITIES - BATTLESTRINGS_TABLE_START] = sText_PkmnSwappedAbilities, [STRINGID_PKMNSEALEDOPPONENTMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnSealedOpponentMove, [STRINGID_PKMNCANTUSEMOVESEALED - BATTLESTRINGS_TABLE_START] = sText_PkmnCantUseMoveSealed, [STRINGID_PKMNWANTSGRUDGE - BATTLESTRINGS_TABLE_START] = sText_PkmnWantsGrudge, [STRINGID_PKMNLOSTPPGRUDGE - BATTLESTRINGS_TABLE_START] = sText_PkmnLostPPGrudge, [STRINGID_PKMNSHROUDEDITSELF - BATTLESTRINGS_TABLE_START] = sText_PkmnShroudedItself, [STRINGID_PKMNMOVEBOUNCED - BATTLESTRINGS_TABLE_START] = sText_PkmnMoveBounced, [STRINGID_PKMNWAITSFORTARGET - BATTLESTRINGS_TABLE_START] = sText_PkmnWaitsForTarget, [STRINGID_PKMNSNATCHEDMOVE - BATTLESTRINGS_TABLE_START] = sText_PkmnSnatchedMove, [STRINGID_PKMNMADEITRAIN - BATTLESTRINGS_TABLE_START] = sText_PkmnMadeItRain, [STRINGID_PKMNRAISEDSPEED - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedSpeed, [STRINGID_PKMNPROTECTEDBY - BATTLESTRINGS_TABLE_START] = sText_PkmnProtectedBy, [STRINGID_PKMNPREVENTSUSAGE - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsUsage, [STRINGID_PKMNRESTOREDHPUSING - BATTLESTRINGS_TABLE_START] = sText_PkmnRestoredHPUsing, [STRINGID_PKMNCHANGEDTYPEWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnChangedTypeWith, [STRINGID_PKMNPREVENTSPARALYSISWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsParalysisWith, [STRINGID_PKMNPREVENTSROMANCEWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsRomanceWith, [STRINGID_PKMNPREVENTSPOISONINGWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsPoisoningWith, [STRINGID_PKMNPREVENTSCONFUSIONWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsConfusionWith, [STRINGID_PKMNRAISEDFIREPOWERWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedFirePowerWith, [STRINGID_PKMNANCHORSITSELFWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnAnchorsItselfWith, [STRINGID_PKMNCUTSATTACKWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnCutsAttackWith, [STRINGID_PKMNPREVENTSSTATLOSSWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnPreventsStatLossWith, [STRINGID_PKMNHURTSWITH - BATTLESTRINGS_TABLE_START] = sText_PkmnHurtsWith, [STRINGID_PKMNTRACED - BATTLESTRINGS_TABLE_START] = sText_PkmnTraced, [STRINGID_STATSHARPLY - BATTLESTRINGS_TABLE_START] = sText_StatSharply, [STRINGID_STATROSE - BATTLESTRINGS_TABLE_START] = gBattleText_Rose, [STRINGID_STATHARSHLY - BATTLESTRINGS_TABLE_START] = sText_StatHarshly, [STRINGID_STATFELL - BATTLESTRINGS_TABLE_START] = sText_StatFell, [STRINGID_ATTACKERSSTATROSE - BATTLESTRINGS_TABLE_START] = sText_AttackersStatRose, [STRINGID_DEFENDERSSTATROSE - BATTLESTRINGS_TABLE_START] = gText_DefendersStatRose, [STRINGID_ATTACKERSSTATFELL - BATTLESTRINGS_TABLE_START] = sText_AttackersStatFell, [STRINGID_DEFENDERSSTATFELL - BATTLESTRINGS_TABLE_START] = sText_DefendersStatFell, [STRINGID_CRITICALHIT - BATTLESTRINGS_TABLE_START] = sText_CriticalHit, [STRINGID_ONEHITKO - BATTLESTRINGS_TABLE_START] = sText_OneHitKO, [STRINGID_123POOF - BATTLESTRINGS_TABLE_START] = sText_123Poof, [STRINGID_ANDELLIPSIS - BATTLESTRINGS_TABLE_START] = sText_AndEllipsis, [STRINGID_NOTVERYEFFECTIVE - BATTLESTRINGS_TABLE_START] = sText_NotVeryEffective, [STRINGID_SUPEREFFECTIVE - BATTLESTRINGS_TABLE_START] = sText_SuperEffective, [STRINGID_GOTAWAYSAFELY - BATTLESTRINGS_TABLE_START] = sText_GotAwaySafely, [STRINGID_WILDPKMNFLED - BATTLESTRINGS_TABLE_START] = sText_WildPkmnFled, [STRINGID_NORUNNINGFROMTRAINERS - BATTLESTRINGS_TABLE_START] = sText_NoRunningFromTrainers, [STRINGID_CANTESCAPE - BATTLESTRINGS_TABLE_START] = sText_CantEscape, [STRINGID_DONTLEAVEBIRCH - BATTLESTRINGS_TABLE_START] = sText_DontLeaveBirch, [STRINGID_BUTNOTHINGHAPPENED - BATTLESTRINGS_TABLE_START] = sText_ButNothingHappened, [STRINGID_BUTITFAILED - BATTLESTRINGS_TABLE_START] = sText_ButItFailed, [STRINGID_ITHURTCONFUSION - BATTLESTRINGS_TABLE_START] = sText_ItHurtConfusion, [STRINGID_MIRRORMOVEFAILED - BATTLESTRINGS_TABLE_START] = sText_MirrorMoveFailed, [STRINGID_STARTEDTORAIN - BATTLESTRINGS_TABLE_START] = sText_StartedToRain, [STRINGID_DOWNPOURSTARTED - BATTLESTRINGS_TABLE_START] = sText_DownpourStarted, [STRINGID_RAINCONTINUES - BATTLESTRINGS_TABLE_START] = sText_RainContinues, [STRINGID_DOWNPOURCONTINUES - BATTLESTRINGS_TABLE_START] = sText_DownpourContinues, [STRINGID_RAINSTOPPED - BATTLESTRINGS_TABLE_START] = sText_RainStopped, [STRINGID_SANDSTORMBREWED - BATTLESTRINGS_TABLE_START] = sText_SandstormBrewed, [STRINGID_SANDSTORMRAGES - BATTLESTRINGS_TABLE_START] = sText_SandstormRages, [STRINGID_SANDSTORMSUBSIDED - BATTLESTRINGS_TABLE_START] = sText_SandstormSubsided, [STRINGID_SUNLIGHTGOTBRIGHT - BATTLESTRINGS_TABLE_START] = sText_SunlightGotBright, [STRINGID_SUNLIGHTSTRONG - BATTLESTRINGS_TABLE_START] = sText_SunlightStrong, [STRINGID_SUNLIGHTFADED - BATTLESTRINGS_TABLE_START] = sText_SunlightFaded, [STRINGID_STARTEDHAIL - BATTLESTRINGS_TABLE_START] = sText_StartedHail, [STRINGID_HAILCONTINUES - BATTLESTRINGS_TABLE_START] = sText_HailContinues, [STRINGID_HAILSTOPPED - BATTLESTRINGS_TABLE_START] = sText_HailStopped, [STRINGID_FAILEDTOSPITUP - BATTLESTRINGS_TABLE_START] = sText_FailedToSpitUp, [STRINGID_FAILEDTOSWALLOW - BATTLESTRINGS_TABLE_START] = sText_FailedToSwallow, [STRINGID_WINDBECAMEHEATWAVE - BATTLESTRINGS_TABLE_START] = sText_WindBecameHeatWave, [STRINGID_STATCHANGESGONE - BATTLESTRINGS_TABLE_START] = sText_StatChangesGone, [STRINGID_COINSSCATTERED - BATTLESTRINGS_TABLE_START] = sText_CoinsScattered, [STRINGID_TOOWEAKFORSUBSTITUTE - BATTLESTRINGS_TABLE_START] = sText_TooWeakForSubstitute, [STRINGID_SHAREDPAIN - BATTLESTRINGS_TABLE_START] = sText_SharedPain, [STRINGID_BELLCHIMED - BATTLESTRINGS_TABLE_START] = sText_BellChimed, [STRINGID_FAINTINTHREE - BATTLESTRINGS_TABLE_START] = sText_FaintInThree, [STRINGID_NOPPLEFT - BATTLESTRINGS_TABLE_START] = sText_NoPPLeft, [STRINGID_BUTNOPPLEFT - BATTLESTRINGS_TABLE_START] = sText_ButNoPPLeft, [STRINGID_PLAYERUSEDITEM - BATTLESTRINGS_TABLE_START] = sText_PlayerUsedItem, [STRINGID_OLDMANUSEDITEM - BATTLESTRINGS_TABLE_START] = sText_OldManUsedItem, [STRINGID_TRAINERBLOCKEDBALL - BATTLESTRINGS_TABLE_START] = sText_TrainerBlockedBall, [STRINGID_DONTBEATHIEF - BATTLESTRINGS_TABLE_START] = sText_DontBeAThief, [STRINGID_ITDODGEDBALL - BATTLESTRINGS_TABLE_START] = sText_ItDodgedBall, [STRINGID_YOUMISSEDPKMN - BATTLESTRINGS_TABLE_START] = sText_YouMissedPkmn, [STRINGID_PKMNBROKEFREE - BATTLESTRINGS_TABLE_START] = sText_PkmnBrokeFree, [STRINGID_ITAPPEAREDCAUGHT - BATTLESTRINGS_TABLE_START] = sText_ItAppearedCaught, [STRINGID_AARGHALMOSTHADIT - BATTLESTRINGS_TABLE_START] = sText_AarghAlmostHadIt, [STRINGID_SHOOTSOCLOSE - BATTLESTRINGS_TABLE_START] = sText_ShootSoClose, [STRINGID_GOTCHAPKMNCAUGHT - BATTLESTRINGS_TABLE_START] = sText_GotchaPkmnCaught, [STRINGID_GOTCHAPKMNCAUGHT2 - BATTLESTRINGS_TABLE_START] = sText_GotchaPkmnCaught2, [STRINGID_GIVENICKNAMECAPTURED - BATTLESTRINGS_TABLE_START] = sText_GiveNicknameCaptured, [STRINGID_PKMNSENTTOPC - BATTLESTRINGS_TABLE_START] = sText_PkmnSentToPC, [STRINGID_PKMNDATAADDEDTODEX - BATTLESTRINGS_TABLE_START] = sText_PkmnDataAddedToDex, [STRINGID_ITISRAINING - BATTLESTRINGS_TABLE_START] = sText_ItIsRaining, [STRINGID_SANDSTORMISRAGING - BATTLESTRINGS_TABLE_START] = sText_SandstormIsRaging, [STRINGID_CANTESCAPE2 - BATTLESTRINGS_TABLE_START] = sText_CantEscape2, [STRINGID_PKMNIGNORESASLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnIgnoresAsleep, [STRINGID_PKMNIGNOREDORDERS - BATTLESTRINGS_TABLE_START] = sText_PkmnIgnoredOrders, [STRINGID_PKMNBEGANTONAP - BATTLESTRINGS_TABLE_START] = sText_PkmnBeganToNap, [STRINGID_PKMNLOAFING - BATTLESTRINGS_TABLE_START] = sText_PkmnLoafing, [STRINGID_PKMNWONTOBEY - BATTLESTRINGS_TABLE_START] = sText_PkmnWontObey, [STRINGID_PKMNTURNEDAWAY - BATTLESTRINGS_TABLE_START] = sText_PkmnTurnedAway, [STRINGID_PKMNPRETENDNOTNOTICE - BATTLESTRINGS_TABLE_START] = sText_PkmnPretendNotNotice, [STRINGID_ENEMYABOUTTOSWITCHPKMN - BATTLESTRINGS_TABLE_START] = sText_EnemyAboutToSwitchPkmn, [STRINGID_THREWROCK - BATTLESTRINGS_TABLE_START] = sText_ThrewARock, [STRINGID_THREWBAIT - BATTLESTRINGS_TABLE_START] = sText_ThrewSomeBait, [STRINGID_PKMNWATCHINGCAREFULLY - BATTLESTRINGS_TABLE_START] = sText_PkmnWatchingCarefully, [STRINGID_PKMNANGRY - BATTLESTRINGS_TABLE_START] = sText_PkmnIsAngry, [STRINGID_PKMNEATING - BATTLESTRINGS_TABLE_START] = sText_PkmnIsEating, [STRINGID_DUMMY288 - BATTLESTRINGS_TABLE_START] = sText_Empty1, [STRINGID_DUMMY289 - BATTLESTRINGS_TABLE_START] = sText_Empty1, [STRINGID_OUTOFSAFARIBALLS - BATTLESTRINGS_TABLE_START] = sText_OutOfSafariBalls, [STRINGID_PKMNSITEMCUREDPARALYSIS - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemCuredParalysis, [STRINGID_PKMNSITEMCUREDPOISON - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemCuredPoison, [STRINGID_PKMNSITEMHEALEDBURN - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemHealedBurn, [STRINGID_PKMNSITEMDEFROSTEDIT - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemDefrostedIt, [STRINGID_PKMNSITEMWOKEIT - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemWokeIt, [STRINGID_PKMNSITEMSNAPPEDOUT - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemSnappedOut, [STRINGID_PKMNSITEMCUREDPROBLEM - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemCuredProblem, [STRINGID_PKMNSITEMRESTOREDHEALTH - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemRestoredHealth, [STRINGID_PKMNSITEMRESTOREDPP - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemRestoredPP, [STRINGID_PKMNSITEMRESTOREDSTATUS - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemRestoredStatus, [STRINGID_PKMNSITEMRESTOREDHPALITTLE - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemRestoredHPALittle, [STRINGID_ITEMALLOWSONLYYMOVE - BATTLESTRINGS_TABLE_START] = sText_ItemAllowsOnlyYMove, [STRINGID_PKMNHUNGONWITHX - BATTLESTRINGS_TABLE_START] = sText_PkmnHungOnWithX, [STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START] = gText_EmptyString3, [STRINGID_PKMNSXPREVENTSBURNS - BATTLESTRINGS_TABLE_START] = sText_PkmnsXPreventsBurns, [STRINGID_PKMNSXBLOCKSY - BATTLESTRINGS_TABLE_START] = sText_PkmnsXBlocksY, [STRINGID_PKMNSXRESTOREDHPALITTLE2 - BATTLESTRINGS_TABLE_START] = sText_PkmnsXRestoredHPALittle2, [STRINGID_PKMNSXWHIPPEDUPSANDSTORM - BATTLESTRINGS_TABLE_START] = sText_PkmnsXWhippedUpSandstorm, [STRINGID_PKMNSXPREVENTSYLOSS - BATTLESTRINGS_TABLE_START] = sText_PkmnsXPreventsYLoss, [STRINGID_PKMNSXINFATUATEDY - BATTLESTRINGS_TABLE_START] = sText_PkmnsXInfatuatedY, [STRINGID_PKMNSXMADEYINEFFECTIVE - BATTLESTRINGS_TABLE_START] = sText_PkmnsXMadeYIneffective, [STRINGID_PKMNSXCUREDYPROBLEM - BATTLESTRINGS_TABLE_START] = sText_PkmnsXCuredYProblem, [STRINGID_ITSUCKEDLIQUIDOOZE - BATTLESTRINGS_TABLE_START] = sText_ItSuckedLiquidOoze, [STRINGID_PKMNTRANSFORMED - BATTLESTRINGS_TABLE_START] = sText_PkmnTransformed, [STRINGID_ELECTRICITYWEAKENED - BATTLESTRINGS_TABLE_START] = sText_ElectricityWeakened, [STRINGID_FIREWEAKENED - BATTLESTRINGS_TABLE_START] = sText_FireWeakened, [STRINGID_PKMNHIDUNDERWATER - BATTLESTRINGS_TABLE_START] = sText_PkmnHidUnderwater, [STRINGID_PKMNSPRANGUP - BATTLESTRINGS_TABLE_START] = sText_PkmnSprangUp, [STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_TABLE_START] = sText_HMMovesCantBeForgotten, [STRINGID_XFOUNDONEY - BATTLESTRINGS_TABLE_START] = sText_XFoundOneY, [STRINGID_PLAYERDEFEATEDTRAINER1 - BATTLESTRINGS_TABLE_START] = sText_PlayerDefeatedLinkTrainerTrainer1, [STRINGID_SOOTHINGAROMA - BATTLESTRINGS_TABLE_START] = sText_SoothingAroma, [STRINGID_ITEMSCANTBEUSEDNOW - BATTLESTRINGS_TABLE_START] = sText_ItemsCantBeUsedNow, [STRINGID_FORXCOMMAYZ - BATTLESTRINGS_TABLE_START] = sText_ForXCommaYZ, [STRINGID_USINGITEMSTATOFPKMNROSE - BATTLESTRINGS_TABLE_START] = sText_UsingItemTheStatOfPkmnRose, [STRINGID_PKMNUSEDXTOGETPUMPED - BATTLESTRINGS_TABLE_START] = sText_PkmnUsedXToGetPumped, [STRINGID_PKMNSXMADEYUSELESS - BATTLESTRINGS_TABLE_START] = sText_PkmnsXMadeYUseless, [STRINGID_PKMNTRAPPEDBYSANDTOMB - BATTLESTRINGS_TABLE_START] = sText_PkmnTrappedBySandTomb, [STRINGID_EMPTYSTRING4 - BATTLESTRINGS_TABLE_START] = sText_EmptyString4, [STRINGID_ABOOSTED - BATTLESTRINGS_TABLE_START] = sText_ABoosted, [STRINGID_PKMNSXINTENSIFIEDSUN - BATTLESTRINGS_TABLE_START] = sText_PkmnsXIntensifiedSun, [STRINGID_PKMNMAKESGROUNDMISS - BATTLESTRINGS_TABLE_START] = sText_PkmnMakesGroundMiss, [STRINGID_YOUTHROWABALLNOWRIGHT - BATTLESTRINGS_TABLE_START] = sText_YouThrowABallNowRight, [STRINGID_PKMNSXTOOKATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnsXTookAttack, [STRINGID_PKMNCHOSEXASDESTINY - BATTLESTRINGS_TABLE_START] = sText_PkmnChoseXAsDestiny, [STRINGID_PKMNLOSTFOCUS - BATTLESTRINGS_TABLE_START] = sText_PkmnLostFocus, [STRINGID_USENEXTPKMN - BATTLESTRINGS_TABLE_START] = sText_UseNextPkmn, [STRINGID_PKMNFLEDUSINGITS - BATTLESTRINGS_TABLE_START] = sText_PkmnFledUsingIts, [STRINGID_PKMNFLEDUSING - BATTLESTRINGS_TABLE_START] = sText_PkmnFledUsing, [STRINGID_PKMNWASDRAGGEDOUT - BATTLESTRINGS_TABLE_START] = sText_PkmnWasDraggedOut, [STRINGID_PREVENTEDFROMWORKING - BATTLESTRINGS_TABLE_START] = sText_PreventedFromWorking, [STRINGID_PKMNSITEMNORMALIZEDSTATUS - BATTLESTRINGS_TABLE_START] = sText_PkmnsItemNormalizedStatus, [STRINGID_TRAINER1USEDITEM - BATTLESTRINGS_TABLE_START] = sText_Trainer1UsedItem, [STRINGID_BOXISFULL - BATTLESTRINGS_TABLE_START] = sText_BoxIsFull, [STRINGID_PKMNAVOIDEDATTACK - BATTLESTRINGS_TABLE_START] = sText_PkmnAvoidedAttack, [STRINGID_PKMNSXMADEITINEFFECTIVE - BATTLESTRINGS_TABLE_START] = sText_PkmnsXMadeItIneffective, [STRINGID_PKMNSXPREVENTSFLINCHING - BATTLESTRINGS_TABLE_START] = sText_PkmnsXPreventsFlinching, [STRINGID_PKMNALREADYHASBURN - BATTLESTRINGS_TABLE_START] = sText_PkmnAlreadyHasBurn, [STRINGID_STATSWONTDECREASE2 - BATTLESTRINGS_TABLE_START] = sText_StatsWontDecrease2, [STRINGID_PKMNSXBLOCKSY2 - BATTLESTRINGS_TABLE_START] = sText_PkmnsXBlocksY2, [STRINGID_PKMNSXWOREOFF - BATTLESTRINGS_TABLE_START] = sText_PkmnsXWoreOff, [STRINGID_PKMNRAISEDDEFALITTLE - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedDefALittle, [STRINGID_PKMNRAISEDSPDEFALITTLE - BATTLESTRINGS_TABLE_START] = sText_PkmnRaisedSpDefALittle, [STRINGID_THEWALLSHATTERED - BATTLESTRINGS_TABLE_START] = sText_TheWallShattered, [STRINGID_PKMNSXPREVENTSYSZ - BATTLESTRINGS_TABLE_START] = sText_PkmnsXPreventsYsZ, [STRINGID_PKMNSXCUREDITSYPROBLEM - BATTLESTRINGS_TABLE_START] = sText_PkmnsXCuredItsYProblem, [STRINGID_ATTACKERCANTESCAPE - BATTLESTRINGS_TABLE_START] = sText_AttackerCantEscape, [STRINGID_PKMNOBTAINEDX - BATTLESTRINGS_TABLE_START] = sText_PkmnObtainedX, [STRINGID_PKMNOBTAINEDX2 - BATTLESTRINGS_TABLE_START] = sText_PkmnObtainedX2, [STRINGID_PKMNOBTAINEDXYOBTAINEDZ - BATTLESTRINGS_TABLE_START] = sText_PkmnObtainedXYObtainedZ, [STRINGID_BUTNOEFFECT - BATTLESTRINGS_TABLE_START] = sText_ButNoEffect, [STRINGID_PKMNSXHADNOEFFECTONY - BATTLESTRINGS_TABLE_START] = sText_PkmnsXHadNoEffectOnY, [STRINGID_OAKPLAYERWON - BATTLESTRINGS_TABLE_START] = gText_WinEarnsPrizeMoney, [STRINGID_OAKPLAYERLOST - BATTLESTRINGS_TABLE_START] = gText_HowDissapointing, [STRINGID_PLAYERLOSTAGAINSTENEMYTRAINER - BATTLESTRINGS_TABLE_START] = sText_PlayerWhiteoutAgainstTrainer, [STRINGID_PLAYERPAIDPRIZEMONEY - BATTLESTRINGS_TABLE_START] = sText_PlayerPaidAsPrizeMoney, [STRINGID_PKMNTRANSFERREDSOMEONESPC - BATTLESTRINGS_TABLE_START] = Text_MonSentToBoxInSomeonesPC, [STRINGID_PKMNTRANSFERREDBILLSPC - BATTLESTRINGS_TABLE_START] = Text_MonSentToBoxInBillsPC, [STRINGID_PKMNBOXSOMEONESPCFULL - BATTLESTRINGS_TABLE_START] = Text_MonSentToBoxSomeonesBoxFull, [STRINGID_PKMNBOXBILLSPCFULL - BATTLESTRINGS_TABLE_START] = Text_MonSentToBoxBillsBoxFull, [STRINGID_POKEDUDEUSED - BATTLESTRINGS_TABLE_START] = sText_PokedudeUsedItem, [STRINGID_POKEFLUTECATCHY - BATTLESTRINGS_TABLE_START] = sText_PlayedFluteCatchyTune, [STRINGID_POKEFLUTE - BATTLESTRINGS_TABLE_START] = sText_PlayedThe, [STRINGID_MONHEARINGFLUTEAWOKE - BATTLESTRINGS_TABLE_START] = sText_PkmnHearingFluteAwoke, [STRINGID_TRAINER2LOSETEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer2LoseText, [STRINGID_TRAINER2WINTEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer2WinText, [STRINGID_PLAYERWHITEDOUT - BATTLESTRINGS_TABLE_START] = sText_PlayerWhiteout2, [STRINGID_MONTOOSCAREDTOMOVE - BATTLESTRINGS_TABLE_START] = sText_TooScaredToMove, [STRINGID_GHOSTGETOUTGETOUT - BATTLESTRINGS_TABLE_START] = sText_GetOutGetOut, [STRINGID_SILPHSCOPEUNVEILED - BATTLESTRINGS_TABLE_START] = sText_SilphScopeUnveil, [STRINGID_GHOSTWASMAROWAK - BATTLESTRINGS_TABLE_START] = sText_TheGhostWas, [STRINGID_TRAINER1MON1COMEBACK - BATTLESTRINGS_TABLE_START] = sText_Trainer1RecallPkmn1, [STRINGID_TRAINER1WINTEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer1WinText, [STRINGID_TRAINER1MON2COMEBACK - BATTLESTRINGS_TABLE_START] = sText_Trainer1RecallPkmn2, [STRINGID_TRAINER1MON1AND2COMEBACK - BATTLESTRINGS_TABLE_START] = sText_Trainer1RecallBoth, [STRINGID_ENEMYABOUTTOSWITCHPKMNNOPREDICT - BATTLESTRINGS_TABLE_START] = sText_EnemyAboutToSwitchPkmnNoPredict, [STRINGID_PICKUP - BATTLESTRINGS_TABLE_START] = sText_MonPickedUpItem, [STRINGID_PICKUPSOLO - BATTLESTRINGS_TABLE_START] = sText_MonPickedUpItemSolo }; const u16 gMissStringIds[] = { [B_MSG_MISSED] = STRINGID_ATTACKMISSED, [B_MSG_PROTECTED] = STRINGID_PKMNPROTECTEDITSELF, [B_MSG_AVOIDED_ATK] = STRINGID_PKMNAVOIDEDATTACK, [B_MSG_AVOIDED_DMG] = STRINGID_AVOIDEDDAMAGE, [B_MSG_GROUND_MISS] = STRINGID_PKMNMAKESGROUNDMISS }; const u16 gNoEscapeStringIds[] = { [B_MSG_CANT_ESCAPE] = STRINGID_CANTESCAPE, [B_MSG_DONT_LEAVE_BIRCH] = STRINGID_DONTLEAVEBIRCH, [B_MSG_PREVENTS_ESCAPE] = STRINGID_PREVENTSESCAPE, [B_MSG_CANT_ESCAPE_2] = STRINGID_CANTESCAPE2, [B_MSG_ATTACKER_CANT_ESCAPE] = STRINGID_ATTACKERCANTESCAPE }; const u16 gMoveWeatherChangeStringIds[] = { [B_MSG_STARTED_RAIN] = STRINGID_STARTEDTORAIN, [B_MSG_STARTED_DOWNPOUR] = STRINGID_DOWNPOURSTARTED, [B_MSG_WEATHER_FAILED] = STRINGID_BUTITFAILED, [B_MSG_STARTED_SANDSTORM] = STRINGID_SANDSTORMBREWED, [B_MSG_STARTED_SUNLIGHT] = STRINGID_SUNLIGHTGOTBRIGHT, [B_MSG_STARTED_HAIL] = STRINGID_STARTEDHAIL }; const u16 gSandstormHailContinuesStringIds[] = { [B_MSG_SANDSTORM] = STRINGID_SANDSTORMRAGES, [B_MSG_HAIL] = STRINGID_HAILCONTINUES }; const u16 gSandstormHailDmgStringIds[] = { [B_MSG_SANDSTORM] = STRINGID_PKMNBUFFETEDBYSANDSTORM, [B_MSG_HAIL] = STRINGID_PKMNPELTEDBYHAIL }; const u16 gSandstormHailEndStringIds[] = { [B_MSG_SANDSTORM] = STRINGID_SANDSTORMSUBSIDED, [B_MSG_HAIL] = STRINGID_HAILSTOPPED }; const u16 gRainContinuesStringIds[] = { [B_MSG_RAIN_CONTINUES] = STRINGID_RAINCONTINUES, [B_MSG_DOWNPOUR_CONTINUES] = STRINGID_DOWNPOURCONTINUES, [B_MSG_RAIN_STOPPED] = STRINGID_RAINSTOPPED }; const u16 gProtectLikeUsedStringIds[] = { [B_MSG_PROTECTED_ITSELF] = STRINGID_PKMNPROTECTEDITSELF2, [B_MSG_BRACED_ITSELF] = STRINGID_PKMNBRACEDITSELF, [B_MSG_PROTECT_FAILED] = STRINGID_BUTITFAILED }; const u16 gReflectLightScreenSafeguardStringIds[] = { [B_MSG_SIDE_STATUS_FAILED] = STRINGID_BUTITFAILED, [B_MSG_SET_REFLECT_SINGLE] = STRINGID_PKMNRAISEDDEF, [B_MSG_SET_REFLECT_DOUBLE] = STRINGID_PKMNRAISEDDEFALITTLE, [B_MSG_SET_LIGHTSCREEN_SINGLE] = STRINGID_PKMNRAISEDSPDEF, [B_MSG_SET_LIGHTSCREEN_DOUBLE] = STRINGID_PKMNRAISEDSPDEFALITTLE, [B_MSG_SET_SAFEGUARD] = STRINGID_PKMNCOVEREDBYVEIL }; const u16 gLeechSeedStringIds[] = { [B_MSG_LEECH_SEED_SET] = STRINGID_PKMNSEEDED, [B_MSG_LEECH_SEED_MISS] = STRINGID_PKMNEVADEDATTACK, [B_MSG_LEECH_SEED_FAIL] = STRINGID_ITDOESNTAFFECT, [B_MSG_LEECH_SEED_DRAIN] = STRINGID_PKMNSAPPEDBYLEECHSEED, [B_MSG_LEECH_SEED_OOZE] = STRINGID_ITSUCKEDLIQUIDOOZE }; const u16 gRestUsedStringIds[] = { [B_MSG_REST] = STRINGID_PKMNWENTTOSLEEP, [B_MSG_REST_STATUSED] = STRINGID_PKMNSLEPTHEALTHY }; const u16 gUproarOverTurnStringIds[] = { [B_MSG_UPROAR_CONTINUES] = STRINGID_PKMNMAKINGUPROAR, [B_MSG_UPROAR_ENDS] = STRINGID_PKMNCALMEDDOWN }; const u16 gStockpileUsedStringIds[] = { [B_MSG_STOCKPILED] = STRINGID_PKMNSTOCKPILED, [B_MSG_CANT_STOCKPILE] = STRINGID_PKMNCANTSTOCKPILE }; const u16 gWokeUpStringIds[] = { [B_MSG_WOKE_UP] = STRINGID_PKMNWOKEUP, [B_MSG_WOKE_UP_UPROAR] = STRINGID_PKMNWOKEUPINUPROAR }; const u16 gSwallowFailStringIds[] = { [B_MSG_SWALLOW_FAILED] = STRINGID_FAILEDTOSWALLOW, [B_MSG_SWALLOW_FULL_HP] = STRINGID_PKMNHPFULL }; const u16 gUproarAwakeStringIds[] = { [B_MSG_CANT_SLEEP_UPROAR] = STRINGID_PKMNCANTSLEEPINUPROAR2, [B_MSG_UPROAR_KEPT_AWAKE] = STRINGID_UPROARKEPTPKMNAWAKE, [B_MSG_STAYED_AWAKE_USING] = STRINGID_PKMNSTAYEDAWAKEUSING }; const u16 gStatUpStringIds[] = { [B_MSG_ATTACKER_STAT_ROSE] = STRINGID_ATTACKERSSTATROSE, [B_MSG_DEFENDER_STAT_ROSE] = STRINGID_DEFENDERSSTATROSE, [B_MSG_STAT_WONT_INCREASE] = STRINGID_STATSWONTINCREASE, [B_MSG_STAT_ROSE_EMPTY] = STRINGID_EMPTYSTRING3, [B_MSG_STAT_ROSE_ITEM] = STRINGID_USINGITEMSTATOFPKMNROSE, [B_MSG_USED_DIRE_HIT] = STRINGID_PKMNUSEDXTOGETPUMPED, }; const u16 gStatDownStringIds[] = { [B_MSG_ATTACKER_STAT_FELL] = STRINGID_ATTACKERSSTATFELL, [B_MSG_DEFENDER_STAT_FELL] = STRINGID_DEFENDERSSTATFELL, [B_MSG_STAT_WONT_DECREASE] = STRINGID_STATSWONTDECREASE, [B_MSG_STAT_FELL_EMPTY] = STRINGID_EMPTYSTRING3 }; // Index read from sTWOTURN_STRINGID const u16 gFirstTurnOfTwoStringIds[] = { [B_MSG_TURN1_RAZOR_WIND] = STRINGID_PKMNWHIPPEDWHIRLWIND, [B_MSG_TURN1_SOLAR_BEAM] = STRINGID_PKMNTOOKSUNLIGHT, [B_MSG_TURN1_SKULL_BASH] = STRINGID_PKMNLOWEREDHEAD, [B_MSG_TURN1_SKY_ATTACK] = STRINGID_PKMNISGLOWING, [B_MSG_TURN1_FLY] = STRINGID_PKMNFLEWHIGH, [B_MSG_TURN1_DIG] = STRINGID_PKMNDUGHOLE, [B_MSG_TURN1_DIVE] = STRINGID_PKMNHIDUNDERWATER, [B_MSG_TURN1_BOUNCE] = STRINGID_PKMNSPRANGUP }; // Index copied from move's index in gTrappingMoves const u16 gWrappedStringIds[] = { STRINGID_PKMNSQUEEZEDBYBIND, // MOVE_BIND STRINGID_PKMNWRAPPEDBY, // MOVE_WRAP STRINGID_PKMNTRAPPEDINVORTEX, // MOVE_FIRE_SPIN STRINGID_PKMNCLAMPED, // MOVE_CLAMP STRINGID_PKMNTRAPPEDINVORTEX, // MOVE_WHIRLPOOL STRINGID_PKMNTRAPPEDBYSANDTOMB // MOVE_SAND_TOMB }; const u16 gMistUsedStringIds[] = { [B_MSG_SET_MIST] = STRINGID_PKMNSHROUDEDINMIST, [B_MSG_MIST_FAILED] = STRINGID_BUTITFAILED }; const u16 gFocusEnergyUsedStringIds[] = { [B_MSG_GETTING_PUMPED] = STRINGID_PKMNGETTINGPUMPED, [B_MSG_FOCUS_ENERGY_FAILED] = STRINGID_BUTITFAILED }; const u16 gTransformUsedStringIds[] = { [B_MSG_TRANSFORMED] = STRINGID_PKMNTRANSFORMEDINTO, [B_MSG_TRANSFORM_FAILED] = STRINGID_BUTITFAILED }; const u16 gSubstituteUsedStringIds[] = { [B_MSG_SET_SUBSTITUTE] = STRINGID_PKMNMADESUBSTITUTE, [B_MSG_SUBSTITUTE_FAILED] = STRINGID_TOOWEAKFORSUBSTITUTE }; const u16 gGotPoisonedStringIds[] = { [B_MSG_STATUSED] = STRINGID_PKMNWASPOISONED, [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNPOISONEDBY }; const u16 gGotParalyzedStringIds[] = { [B_MSG_STATUSED] = STRINGID_PKMNWASPARALYZED, [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNWASPARALYZEDBY }; const u16 gFellAsleepStringIds[] = { [B_MSG_STATUSED] = STRINGID_PKMNFELLASLEEP, [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNMADESLEEP }; const u16 gGotBurnedStringIds[] = { [B_MSG_STATUSED] = STRINGID_PKMNWASBURNED, [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNBURNEDBY }; const u16 gGotFrozenStringIds[] = { [B_MSG_STATUSED] = STRINGID_PKMNWASFROZEN, [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNFROZENBY }; const u16 gGotDefrostedStringIds[] = { [B_MSG_DEFROSTED] = STRINGID_PKMNWASDEFROSTED2, [B_MSG_DEFROSTED_BY_MOVE] = STRINGID_PKMNWASDEFROSTEDBY }; const u16 gKOFailedStringIds[] = { [B_MSG_KO_MISS] = STRINGID_ATTACKMISSED, [B_MSG_KO_UNAFFECTED] = STRINGID_PKMNUNAFFECTED }; const u16 gAttractUsedStringIds[] = { [B_MSG_STATUSED] = STRINGID_PKMNFELLINLOVE, [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNSXINFATUATEDY }; const u16 gAbsorbDrainStringIds[] = { [B_MSG_ABSORB] = STRINGID_PKMNENERGYDRAINED, [B_MSG_ABSORB_OOZE] = STRINGID_ITSUCKEDLIQUIDOOZE }; const u16 gSportsUsedStringIds[] = { [B_MSG_WEAKEN_ELECTRIC] = STRINGID_ELECTRICITYWEAKENED, [B_MSG_WEAKEN_FIRE] = STRINGID_FIREWEAKENED }; const u16 gPartyStatusHealStringIds[] = { [B_MSG_BELL] = STRINGID_BELLCHIMED, [B_MSG_BELL_SOUNDPROOF_ATTACKER] = STRINGID_BELLCHIMED, [B_MSG_BELL_SOUNDPROOF_PARTNER] = STRINGID_BELLCHIMED, [B_MSG_BELL_BOTH_SOUNDPROOF] = STRINGID_BELLCHIMED, [B_MSG_SOOTHING_AROMA] = STRINGID_SOOTHINGAROMA }; const u16 gFutureMoveUsedStringIds[] = { [B_MSG_FUTURE_SIGHT] = STRINGID_PKMNFORESAWATTACK, [B_MSG_DOOM_DESIRE] = STRINGID_PKMNCHOSEXASDESTINY }; const u16 gBallEscapeStringIds[] = { [BALL_NO_SHAKES] = STRINGID_PKMNBROKEFREE, [BALL_1_SHAKE] = STRINGID_ITAPPEAREDCAUGHT, [BALL_2_SHAKES] = STRINGID_AARGHALMOSTHADIT, [BALL_3_SHAKES_FAIL] = STRINGID_SHOOTSOCLOSE }; // Overworld weathers that don't have an associated battle weather default to "It is raining." const u16 gWeatherStartsStringIds[] = { [WEATHER_NONE] = STRINGID_ITISRAINING, [WEATHER_SUNNY_CLOUDS] = STRINGID_ITISRAINING, [WEATHER_SUNNY] = STRINGID_ITISRAINING, [WEATHER_RAIN] = STRINGID_ITISRAINING, [WEATHER_SNOW] = STRINGID_ITISRAINING, [WEATHER_RAIN_THUNDERSTORM] = STRINGID_ITISRAINING, [WEATHER_FOG_HORIZONTAL] = STRINGID_ITISRAINING, [WEATHER_VOLCANIC_ASH] = STRINGID_ITISRAINING, [WEATHER_SANDSTORM] = STRINGID_SANDSTORMISRAGING, [WEATHER_FOG_DIAGONAL] = STRINGID_ITISRAINING, [WEATHER_UNDERWATER] = STRINGID_ITISRAINING, [WEATHER_SHADE] = STRINGID_ITISRAINING, [WEATHER_DROUGHT] = STRINGID_SUNLIGHTSTRONG, [WEATHER_DOWNPOUR] = STRINGID_ITISRAINING, [WEATHER_UNDERWATER_BUBBLES] = STRINGID_ITISRAINING, [WEATHER_ABNORMAL] = STRINGID_ITISRAINING }; const u16 gInobedientStringIds[] = { [B_MSG_LOAFING] = STRINGID_PKMNLOAFING, [B_MSG_WONT_OBEY] = STRINGID_PKMNWONTOBEY, [B_MSG_TURNED_AWAY] = STRINGID_PKMNTURNEDAWAY, [B_MSG_PRETEND_NOT_NOTICE] = STRINGID_PKMNPRETENDNOTNOTICE }; const u16 gSafariReactionStringIds[NUM_SAFARI_REACTIONS] = { [B_MSG_MON_WATCHING] = STRINGID_PKMNWATCHINGCAREFULLY, [B_MSG_MON_ANGRY] = STRINGID_PKMNANGRY, [B_MSG_MON_EATING] = STRINGID_PKMNEATING }; const u16 gTrainerItemCuredStatusStringIds[] = { [AI_HEAL_CONFUSION] = STRINGID_PKMNSITEMSNAPPEDOUT, [AI_HEAL_PARALYSIS] = STRINGID_PKMNSITEMCUREDPARALYSIS, [AI_HEAL_FREEZE] = STRINGID_PKMNSITEMDEFROSTEDIT, [AI_HEAL_BURN] = STRINGID_PKMNSITEMHEALEDBURN, [AI_HEAL_POISON] = STRINGID_PKMNSITEMCUREDPOISON, [AI_HEAL_SLEEP] = STRINGID_PKMNSITEMWOKEIT }; const u16 gBerryEffectStringIds[] = { [B_MSG_CURED_PROBLEM] = STRINGID_PKMNSITEMCUREDPROBLEM, [B_MSG_NORMALIZED_STATUS] = STRINGID_PKMNSITEMNORMALIZEDSTATUS }; const u16 gBRNPreventionStringIds[] = { [B_MSG_ABILITY_PREVENTS_MOVE_STATUS] = STRINGID_PKMNSXPREVENTSBURNS, [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ, [B_MSG_STATUS_HAD_NO_EFFECT] = STRINGID_PKMNSXHADNOEFFECTONY }; const u16 gPRLZPreventionStringIds[] = { [B_MSG_ABILITY_PREVENTS_MOVE_STATUS] = STRINGID_PKMNPREVENTSPARALYSISWITH, [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ, [B_MSG_STATUS_HAD_NO_EFFECT] = STRINGID_PKMNSXHADNOEFFECTONY }; const u16 gPSNPreventionStringIds[] = { [B_MSG_ABILITY_PREVENTS_MOVE_STATUS] = STRINGID_PKMNPREVENTSPOISONINGWITH, [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ, [B_MSG_STATUS_HAD_NO_EFFECT] = STRINGID_PKMNSXHADNOEFFECTONY }; const u16 gItemSwapStringIds[] = { [B_MSG_ITEM_SWAP_TAKEN] = STRINGID_PKMNOBTAINEDX, [B_MSG_ITEM_SWAP_GIVEN] = STRINGID_PKMNOBTAINEDX2, [B_MSG_ITEM_SWAP_BOTH] = STRINGID_PKMNOBTAINEDXYOBTAINEDZ }; const u16 gFlashFireStringIds[] = { [B_MSG_FLASH_FIRE_BOOST] = STRINGID_PKMNRAISEDFIREPOWERWITH, [B_MSG_FLASH_FIRE_NO_BOOST] = STRINGID_PKMNSXMADEYINEFFECTIVE }; const u16 gCaughtMonStringIds[] = { [B_MSG_SENT_SOMEONES_PC] = STRINGID_PKMNTRANSFERREDSOMEONESPC, [B_MSG_SENT_BILLS_PC] = STRINGID_PKMNTRANSFERREDBILLSPC, [B_MSG_SOMEONES_BOX_FULL] = STRINGID_PKMNBOXSOMEONESPCFULL, [B_MSG_BILLS_BOX_FULL] = STRINGID_PKMNBOXBILLSPCFULL }; // Index is determined in VARIOUS_GET_BATTLERS_FOR_RECALL by ORing flags for each present battler on the losing side. // No battlers (0) is skipped. const u16 gDoubleBattleRecallStrings[1 << (MAX_BATTLERS_COUNT / 2)] = { STRINGID_TRAINER1MON1COMEBACK, STRINGID_TRAINER1MON1COMEBACK, STRINGID_TRAINER1MON2COMEBACK, STRINGID_TRAINER1MON1AND2COMEBACK }; const u16 gTrappingMoves[NUM_TRAPPING_MOVES + 1] = { MOVE_BIND, MOVE_WRAP, MOVE_FIRE_SPIN, MOVE_CLAMP, MOVE_WHIRLPOOL, MOVE_SAND_TOMB, 0xFFFF // Never read }; const u8 gText_PkmnIsEvolving[] = _("What?\n{STR_VAR_1} is evolving!"); const u8 gText_CongratsPkmnEvolved[] = _("Congratulations! Your {STR_VAR_1}\nevolved into {STR_VAR_2}!{WAIT_SE}\p"); const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p"); const u8 gText_EllipsisQuestionMark[] = _("……?\p"); const u8 gText_WhatWillPkmnDo[] = _("What will\n{B_ACTIVE_NAME_WITH_PREFIX} do?"); const u8 gText_WhatWillPlayerThrow[] = _("What will {B_PLAYER_NAME}\nthrow?"); const u8 gText_WhatWillOldManDo[] = _("What will the\nold man do?"); const u8 gText_LinkStandby[] = _("{PAUSE 16}Link standby…"); const u8 gText_BattleMenu[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}FIGHT{CLEAR_TO 56}BAG\nPOKéMON{CLEAR_TO 56}RUN"); const u8 gText_SafariZoneMenu[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}BALL{CLEAR_TO 56}BAIT\nROCK{CLEAR_TO 56}RUN"); const u8 gText_MoveInterfacePP[] = _("PP "); const u8 gText_MoveInterfaceType[] = _("TYPE/"); const u8 gText_MoveInterfaceDynamicColors[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}"); const u8 gText_BattleYesNoChoice[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}Yes\nNo"); const u8 gText_BattleSwitchWhich[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}Switch\nwhich?"); static const u8 sText_UnusedColors[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}"); static const u8 sText_RightArrow2[] = _("{RIGHT_ARROW_2}"); static const u8 sText_Plus[] = _("{PLUS}"); static const u8 sText_Dash[] = _("-"); static const u8 sText_MaxHP[] = _("{FONT_SMALL}Max{FONT_NORMAL} HP"); static const u8 sText_Attack[] = _("ATTACK "); static const u8 sText_Defense[] = _("DEFENSE"); static const u8 sText_SpAtk[] = _("SP. ATK"); static const u8 sText_SpDef[] = _("SP. DEF"); // Unused static const u8 *const sStatNamesTable2[] = { sText_MaxHP, sText_SpAtk, sText_Attack, sText_SpDef, sText_Defense, sText_Speed }; const u8 gText_SafariBalls[] = _("{HIGHLIGHT 2}SAFARI BALLS"); // const u8 gText_HighlightRed_Left[] = _("{HIGHLIGHT 2}Left: "); const u8 gText_HighlightRed[] = _("{HIGHLIGHT 2}"); const u8 gText_Sleep[] = _("sleep"); const u8 gText_Poison[] = _("poison"); const u8 gText_Burn[] = _("burn"); const u8 gText_Paralysis[] = _("paralysis"); const u8 gText_Ice[] = _("ice"); const u8 gText_Confusion[] = _("confusion"); const u8 gText_Love[] = _("love"); const u8 gText_BattleTowerBan_Space[] = _(" "); const u8 gText_BattleTowerBan_Newline1[] = _("\n"); const u8 gText_BattleTowerBan_Newline2[] = _("\n"); const u8 gText_BattleTowerBan_Is1[] = _(" is"); const u8 gText_BattleTowerBan_Is2[] = _(" is"); const u8 gText_BadEgg[] = _("Bad EGG"); const u8 gText_BattleWallyName[] = _("ミツル"); const u8 gText_Win[] = _("{HIGHLIGHT 0}Win"); const u8 gText_Loss[] = _("{HIGHLIGHT 0}Loss"); const u8 gText_Draw[] = _("{HIGHLIGHT 0}Draw"); static const u8 sText_SpaceIs[] = _(" is"); static const u8 sText_ApostropheS[] = _("'s"); const u8 gText_ANormalMove[] = _("a NORMAL move"); const u8 gText_AFightingMove[] = _("a FIGHTING move"); const u8 gText_AFlyingMove[] = _("a FLYING move"); const u8 gText_APoisonMove[] = _("a POISON move"); const u8 gText_AGroundMove[] = _("a GROUND move"); const u8 gText_ARockMove[] = _("a ROCK move"); const u8 gText_ABugMove[] = _("a BUG move"); const u8 gText_AGhostMove[] = _("a GHOST move"); const u8 gText_ASteelMove[] = _("a STEEL move"); const u8 gText_AMysteryMove[] = _("a ??? move"); const u8 gText_AFireMove[] = _("a FIRE move"); const u8 gText_AWaterMove[] = _("a WATER move"); const u8 gText_AGrassMove[] = _("a GRASS move"); const u8 gText_AnElectricMove[] = _("an ELECTRIC move"); const u8 gText_APsychicMove[] = _("a PSYCHIC move"); const u8 gText_AnIceMove[] = _("an ICE move"); const u8 gText_ADragonMove[] = _("a DRAGON move"); const u8 gText_ADarkMove[] = _("a DARK move"); const u8 gText_TimeBoard[] = _("TIME BOARD"); const u8 gText_ClearTime[] = _("CLEAR TIME"); // Unused const u8 gText_XMinYZSec[] = _("{STR_VAR_1}MIN. {STR_VAR_2}.{STR_VAR_3}SEC."); const u8 gText_Unused_1F[] = _("1F"); const u8 gText_Unused_2F[] = _("2F"); const u8 gText_Unused_3F[] = _("3F"); const u8 gText_Unused_4F[] = _("4F"); const u8 gText_Unused_5F[] = _("5F"); const u8 gText_Unused_6F[] = _("6F"); const u8 gText_Unused_7F[] = _("7F"); const u8 gText_Unused_8F[] = _("8F"); const u8 *const gTrainerTowerChallengeTypeTexts[NUM_TOWER_CHALLENGE_TYPES] = { gOtherText_Single, gOtherText_Double, gOtherText_Knockout, gOtherText_Mixed }; static const u8 sText_Trainer1Fled[] = _("{PLAY_SE SE_FLEE}{B_TRAINER1_CLASS} {B_TRAINER1_NAME} fled!"); static const u8 sText_PlayerLostAgainstTrainer1[] = _("Player lost against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!"); static const u8 sText_PlayerBattledToDrawTrainer1[] = _("Player battled to a draw against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!"); static const u8 *const sATypeMove_Table[NUMBER_OF_MON_TYPES] = { [TYPE_NORMAL] = gText_ANormalMove, [TYPE_FIGHTING] = gText_AFightingMove, [TYPE_FLYING] = gText_AFlyingMove, [TYPE_POISON] = gText_APoisonMove, [TYPE_GROUND] = gText_AGroundMove, [TYPE_ROCK] = gText_ARockMove, [TYPE_BUG] = gText_ABugMove, [TYPE_GHOST] = gText_AGhostMove, [TYPE_STEEL] = gText_ASteelMove, [TYPE_MYSTERY] = gText_AMysteryMove, [TYPE_FIRE] = gText_AFireMove, [TYPE_WATER] = gText_AWaterMove, [TYPE_GRASS] = gText_AGrassMove, [TYPE_ELECTRIC] = gText_AnElectricMove, [TYPE_PSYCHIC] = gText_APsychicMove, [TYPE_ICE] = gText_AnIceMove, [TYPE_DRAGON] = gText_ADragonMove, [TYPE_DARK] = gText_ADarkMove }; // code void BufferStringBattle(u16 stringId) { s32 i; const u8 *stringPtr = NULL; u8 multiplayerId = GetMultiplayerId(); sBattleMsgDataPtr = (struct BattleMsgData *)(&gBattleBufferA[gActiveBattler][4]); gLastUsedItem = sBattleMsgDataPtr->lastItem; gLastUsedAbility = sBattleMsgDataPtr->lastAbility; gBattleScripting.battler = sBattleMsgDataPtr->scrActive; *(&gBattleStruct->scriptPartyIdx) = sBattleMsgDataPtr->bakScriptPartyIdx; *(&gBattleStruct->hpScale) = sBattleMsgDataPtr->hpScale; gPotentialItemEffectBattler = sBattleMsgDataPtr->itemEffectBattler; *(&gBattleStruct->stringMoveType) = sBattleMsgDataPtr->moveType; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { sBattlerAbilities[i] = sBattleMsgDataPtr->abilities[i]; } for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++) { gBattleTextBuff1[i] = sBattleMsgDataPtr->textBuffs[0][i]; gBattleTextBuff2[i] = sBattleMsgDataPtr->textBuffs[1][i]; gBattleTextBuff3[i] = sBattleMsgDataPtr->textBuffs[2][i]; } switch (stringId) { case STRINGID_INTROMSG: // first battle msg if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { u8 title1 = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead; u8 title2 = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].neverRead; if(title1 && title2) stringPtr = sText_TwoLinkTrainersWantToBattleYY; else if(title1 && !title2) stringPtr = sText_TwoLinkTrainersWantToBattleYN; else if(!title1 && title2) stringPtr = sText_TwoLinkTrainersWantToBattleYY; else stringPtr = sText_TwoLinkTrainersWantToBattle; } else { if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1WantsToBattle; else stringPtr = sText_LinkTrainerWantsToBattle; } } else { stringPtr = sText_Trainer1WantsToBattle; } } else { if (gBattleTypeFlags & BATTLE_TYPE_GHOST) { if (gBattleTypeFlags & BATTLE_TYPE_GHOST_UNVEILED) stringPtr = sText_TheGhostAppeared; else stringPtr = sText_GhostAppearedCantId; } else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) stringPtr = sText_WildPkmnAppeared2; else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) // interesting, looks like they had something planned for wild double battles stringPtr = sText_TwoWildPkmnAppeared; else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL) stringPtr = sText_WildPkmnAppearedPause; else stringPtr = sText_WildPkmnAppeared; } break; case STRINGID_INTROSENDOUT: // poke first send-out if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(gLinkPlayers[multiplayerId].id))].neverRead != 0) stringPtr = sText_LinkPartnerSentOutPkmnGoPkmnTitle; else stringPtr = sText_LinkPartnerSentOutPkmnGoPkmn; } else stringPtr = sText_GoTwoPkmn; } else { stringPtr = sText_GoPkmn; } } else { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { u8 title1 = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead; u8 title2 = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].neverRead; if(title1 && title2) stringPtr = sText_TwoLinkTrainersSentOutPkmnYY; else if(title1 && !title2) stringPtr = sText_TwoLinkTrainersSentOutPkmnYN; else if(!title1 && title2) stringPtr = sText_TwoLinkTrainersSentOutPkmnNY; else stringPtr = sText_TwoLinkTrainersSentOutPkmn; } else if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead != 0) stringPtr = sText_LinkTrainerSentOutTwoPkmnTitle; else stringPtr = sText_LinkTrainerSentOutTwoPkmn; } else stringPtr = sText_Trainer1SentOutTwoPkmn; } else { if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) stringPtr = sText_Trainer1SentOutPkmn; else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1SentOutPkmn; else { if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead != 0) stringPtr = sText_LinkTrainerSentOutPkmnTitle; else stringPtr = sText_LinkTrainerSentOutPkmn; } } } break; case STRINGID_RETURNMON: // sending poke to ball msg if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { if (*(&gBattleStruct->hpScale) == 0) stringPtr = sText_PkmnThatsEnough; else if (*(&gBattleStruct->hpScale) == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) stringPtr = sText_PkmnComeBack; else if (*(&gBattleStruct->hpScale) == 2) stringPtr = sText_PkmnOkComeBack; else stringPtr = sText_PkmnGoodComeBack; } else { if (gTrainerBattleOpponent_A == TRAINER_LINK_OPPONENT) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if(gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].neverRead != 0) stringPtr = sText_LinkTrainer2WithdrewPkmnTitle; else stringPtr = sText_LinkTrainer2WithdrewPkmn; } else { if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead != 0) stringPtr = sText_LinkTrainer1WithdrewPkmnTitle; else stringPtr = sText_LinkTrainer1WithdrewPkmn; } } else { stringPtr = sText_Trainer1WithdrewPkmn; } } break; case STRINGID_SWITCHINMON: // switch-in msg if (GetBattlerSide(gBattleScripting.battler) == B_SIDE_PLAYER) { if (*(&gBattleStruct->hpScale) == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) stringPtr = sText_GoPkmn2; else if (*(&gBattleStruct->hpScale) == 1) stringPtr = sText_DoItPkmn; else if (*(&gBattleStruct->hpScale) == 2) stringPtr = sText_GoForItPkmn; else stringPtr = sText_YourFoesWeakGetEmPkmn; } else { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if(gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].neverRead != 0) stringPtr = sText_LinkTrainerMultiSentOutPkmnTitle; else stringPtr = sText_LinkTrainerMultiSentOutPkmn; } else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1SentOutPkmn2; else { if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead != 0) stringPtr = sText_LinkTrainerSentOutPkmn2Title; else stringPtr = sText_LinkTrainerSentOutPkmn2; } } else { stringPtr = sText_Trainer1SentOutPkmn2; } } break; case STRINGID_USEDMOVE: // pokemon used a move msg if (sBattleMsgDataPtr->currentMove >= MOVES_COUNT) StringCopy(gBattleTextBuff2, sATypeMove_Table[*(&gBattleStruct->stringMoveType)]); else StringCopy(gBattleTextBuff2, gMoveNames[sBattleMsgDataPtr->currentMove]); stringPtr = sText_AttackerUsedX; break; case STRINGID_BATTLEEND: // battle end if (gBattleTextBuff1[0] & B_OUTCOME_LINK_BATTLE_RAN) { gBattleTextBuff1[0] &= ~(B_OUTCOME_LINK_BATTLE_RAN); if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW) gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON); if (gBattleTextBuff1[0] == B_OUTCOME_LOST || gBattleTextBuff1[0] == B_OUTCOME_DREW) stringPtr = sText_GotAwaySafely; else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) stringPtr = sText_TwoWildFled; else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1Fled; else stringPtr = sText_WildFled; } else { if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW) gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON); if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { switch (gBattleTextBuff1[0]) { case B_OUTCOME_WON: stringPtr = sText_TwoLinkTrainersDefeated; break; case B_OUTCOME_LOST: stringPtr = sText_PlayerLostToTwo; break; case B_OUTCOME_DREW: stringPtr = sText_PlayerBattledToDrawVsTwo; break; } } else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) { switch (gBattleTextBuff1[0]) { case B_OUTCOME_WON: stringPtr = sText_PlayerDefeatedLinkTrainerTrainer1; break; case B_OUTCOME_LOST: stringPtr = sText_PlayerLostAgainstTrainer1; break; case B_OUTCOME_DREW: stringPtr = sText_PlayerBattledToDrawTrainer1; break; } } else { switch (gBattleTextBuff1[0]) { case B_OUTCOME_WON: stringPtr = sText_PlayerDefeatedLinkTrainer; break; case B_OUTCOME_LOST: stringPtr = sText_PlayerLostAgainstLinkTrainer; break; case B_OUTCOME_DREW: stringPtr = sText_PlayerBattledToDrawLinkTrainer; break; } } } break; default: // load a string from the table if (stringId >= BATTLESTRINGS_COUNT) { gDisplayedStringBattle[0] = EOS; return; } else { stringPtr = gBattleStringsTable[stringId - BATTLESTRINGS_TABLE_START]; } break; } BattleStringExpandPlaceholdersToDisplayedString(stringPtr); } u32 BattleStringExpandPlaceholdersToDisplayedString(const u8 *src) { BattleStringExpandPlaceholders(src, gDisplayedStringBattle); } static const u8 *TryGetStatusString(u8 *src) { u32 i; u8 status[] = _("$$$$$$$"); u32 chars1, chars2; u8 *statusPtr; statusPtr = status; for (i = 0; i < 8; i++) { if (*src == EOS) break; *statusPtr = *src; src++; statusPtr++; } chars1 = *(u32 *)(&status[0]); chars2 = *(u32 *)(&status[4]); for (i = 0; i < NELEMS(gStatusConditionStringsTable); i++) { if (chars1 == *(u32 *)(&gStatusConditionStringsTable[i][0][0]) && chars2 == *(u32 *)(&gStatusConditionStringsTable[i][0][4])) return gStatusConditionStringsTable[i][1]; } return NULL; } #define HANDLE_NICKNAME_STRING_CASE(battlerId, monIndex) \ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) \ { \ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ toCpy = sText_FoePkmnPrefix; \ else \ toCpy = sText_WildPkmnPrefix; \ while (*toCpy != EOS) \ { \ dst[dstId] = *toCpy; \ dstId++; \ toCpy++; \ } \ GetMonData(&gEnemyParty[monIndex], MON_DATA_NICKNAME, text); \ } \ else \ { \ GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, text); \ } \ StringGet_Nickname(text); \ toCpy = text; u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) { u32 dstId = 0; // if they used dstId, why not use srcId as well? const u8 *toCpy = NULL; u8 text[30]; u8 multiplayerId; s32 i; struct Trainer* sTrainers; u8 title = 0; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; multiplayerId = GetMultiplayerId(); while (*src != EOS) { if (*src == PLACEHOLDER_BEGIN) { src++; switch (*src) { case B_TXT_BUFF1: if (gBattleTextBuff1[0] == B_BUFF_PLACEHOLDER_BEGIN) { ExpandBattleTextBuffPlaceholders(gBattleTextBuff1, gStringVar1); toCpy = gStringVar1; } else { toCpy = TryGetStatusString(gBattleTextBuff1); if (toCpy == NULL) toCpy = gBattleTextBuff1; } break; case B_TXT_BUFF2: if (gBattleTextBuff2[0] == B_BUFF_PLACEHOLDER_BEGIN) { ExpandBattleTextBuffPlaceholders(gBattleTextBuff2, gStringVar2); toCpy = gStringVar2; } else toCpy = gBattleTextBuff2; break; case B_TXT_BUFF3: if (gBattleTextBuff3[0] == B_BUFF_PLACEHOLDER_BEGIN) { ExpandBattleTextBuffPlaceholders(gBattleTextBuff3, gStringVar3); toCpy = gStringVar3; } else toCpy = gBattleTextBuff3; break; case B_TXT_COPY_VAR_1: toCpy = gStringVar1; break; case B_TXT_COPY_VAR_2: toCpy = gStringVar2; break; case B_TXT_COPY_VAR_3: toCpy = gStringVar3; break; case B_TXT_PLAYER_MON1_NAME: // first player poke name GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]], MON_DATA_NICKNAME, text); StringGet_Nickname(text); toCpy = text; break; case B_TXT_OPPONENT_MON1_NAME: // first enemy poke name GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]], MON_DATA_NICKNAME, text); StringGet_Nickname(text); toCpy = text; break; case B_TXT_PLAYER_MON2_NAME: // second player poke name GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]], MON_DATA_NICKNAME, text); StringGet_Nickname(text); toCpy = text; break; case B_TXT_OPPONENT_MON2_NAME: // second enemy poke name GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]], MON_DATA_NICKNAME, text); StringGet_Nickname(text); toCpy = text; break; case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id]], MON_DATA_NICKNAME, text); StringGet_Nickname(text); toCpy = text; break; case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 1]], MON_DATA_NICKNAME, text); StringGet_Nickname(text); toCpy = text; break; case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 2]], MON_DATA_NICKNAME, text); StringGet_Nickname(text); toCpy = text; break; case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 3]], MON_DATA_NICKNAME, text); StringGet_Nickname(text); toCpy = text; break; case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only battlerId 0/1 HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker, gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker))]) break; case B_TXT_ATK_PARTNER_NAME: // attacker partner name if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) GetMonData( &gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text); else GetMonData( &gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text); StringGet_Nickname(text); toCpy = text; break; case B_TXT_ATK_NAME_WITH_PREFIX: // attacker name with prefix HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]) break; case B_TXT_DEF_NAME_WITH_PREFIX: // target name with prefix HANDLE_NICKNAME_STRING_CASE(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]) break; case B_TXT_EFF_NAME_WITH_PREFIX: // effect battlerId name with prefix HANDLE_NICKNAME_STRING_CASE(gEffectBattler, gBattlerPartyIndexes[gEffectBattler]) break; case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active battlerId name with prefix HANDLE_NICKNAME_STRING_CASE(gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) break; case B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX: // scripting active battlerId name with prefix HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, gBattlerPartyIndexes[gBattleScripting.battler]) break; case B_TXT_CURRENT_MOVE: // current move name if (sBattleMsgDataPtr->currentMove >= MOVES_COUNT) toCpy = (const u8 *)&sATypeMove_Table[gBattleStruct->stringMoveType]; else toCpy = gMoveNames[sBattleMsgDataPtr->currentMove]; break; case B_TXT_LAST_MOVE: // originally used move name if (sBattleMsgDataPtr->originallyUsedMove >= MOVES_COUNT) toCpy = (const u8 *)&sATypeMove_Table[gBattleStruct->stringMoveType]; else toCpy = gMoveNames[sBattleMsgDataPtr->originallyUsedMove]; break; case B_TXT_LAST_ITEM: // last used item if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (gLastUsedItem == ITEM_ENIGMA_BERRY) { if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { if ((gBattleStruct->multiplayerId != 0 && (gPotentialItemEffectBattler & BIT_SIDE)) || (gBattleStruct->multiplayerId == 0 && !(gPotentialItemEffectBattler & BIT_SIDE))) { StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name); StringAppend(text, sText_BerrySuffix); toCpy = text; } else { toCpy = sText_EnigmaBerry; } } else { if (gLinkPlayers[gBattleStruct->multiplayerId].id == gPotentialItemEffectBattler) { StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name); StringAppend(text, sText_BerrySuffix); toCpy = text; } else toCpy = sText_EnigmaBerry; } } else { CopyItemName(gLastUsedItem, text); toCpy = text; } } else { CopyItemName(gLastUsedItem, text); toCpy = text; } break; case B_TXT_LAST_ABILITY: // last used ability toCpy = gAbilityNames[gLastUsedAbility]; break; case B_TXT_ATK_ABILITY: // attacker ability toCpy = gAbilityNames[sBattlerAbilities[gBattlerAttacker]]; break; case B_TXT_DEF_ABILITY: // target ability toCpy = gAbilityNames[sBattlerAbilities[gBattlerTarget]]; break; case B_TXT_SCR_ACTIVE_ABILITY: // scripting active ability toCpy = gAbilityNames[sBattlerAbilities[gBattleScripting.battler]]; break; case B_TXT_EFF_ABILITY: // effect battlerId ability toCpy = gAbilityNames[sBattlerAbilities[gEffectBattler]]; break; case B_TXT_TRAINER1_CLASS: // trainer class name if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) toCpy = gTrainerClassNames[GetSecretBaseTrainerNameIndex()]; else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) toCpy = gTrainerClassNames[GetUnionRoomTrainerClass()]; else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) toCpy = gTrainerClassNames[GetBattleTowerTrainerClassNameId()]; else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) toCpy = gTrainerClassNames[GetTrainerTowerOpponentClass()]; else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) toCpy = gTrainerClassNames[GetEreaderTrainerClassId()]; else toCpy = gTrainerClassNames[sTrainers[gTrainerBattleOpponent_A].trainerClass]; break; case B_TXT_TRAINER1_NAME: // trainer1 name if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) { for (i = 0; i < (s32)NELEMS(gBattleResources->secretBase->trainerName); i++) text[i] = gBattleResources->secretBase->trainerName[i]; text[i] = EOS; toCpy = text; } if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) { toCpy = gLinkPlayers[multiplayerId ^ BIT_SIDE].name; } else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) { GetBattleTowerTrainerName(text); toCpy = text; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) { GetTrainerTowerOpponentName(text); toCpy = text; } else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) { CopyEReaderTrainerName5(text); toCpy = text; } else { if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_RIVAL_EARLY || sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_RIVAL_LATE || sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION) toCpy = GetExpandedPlaceholder(PLACEHOLDER_ID_RIVAL); else toCpy = sTrainers[gTrainerBattleOpponent_A].trainerName; } break; case B_TXT_LINK_PLAYER_NAME: // link player name title = gLinkPlayers[multiplayerId].neverRead; if(title != 0) { if(title == 152) { //GRAND MASTER StringCopy(gStringVar1, gText_GrandMaster); } else { //MON MASTER StringCopy(gStringVar1, gSpeciesNames[title]); StringAppend(gStringVar1, gText_Master); } StringAppend(gStringVar1, gLinkPlayers[multiplayerId].name); toCpy = gStringVar1; } else { toCpy = gLinkPlayers[multiplayerId].name; } break; case B_TXT_LINK_PARTNER_NAME: // link partner name title = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(gLinkPlayers[multiplayerId].id))].neverRead; if(title != 0) { if(title == 152) { //GRAND MASTER StringCopy(gStringVar1, gText_GrandMaster); } else { //MON MASTER StringCopy(gStringVar1, gSpeciesNames[title]); StringAppend(gStringVar1, gText_Master); } StringAppend(gStringVar1, gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(gLinkPlayers[multiplayerId].id))].name); toCpy = gStringVar1; } else { toCpy = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(gLinkPlayers[multiplayerId].id))].name; } break; case B_TXT_LINK_OPPONENT1_NAME: // link opponent 1 name title = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead; if(title != 0) { if(title == 152) { //GRAND MASTER StringCopy(gStringVar1, gText_GrandMaster); } else { //MON MASTER StringCopy(gStringVar1, gSpeciesNames[title]); StringAppend(gStringVar1, gText_Master); } StringAppend(gStringVar1, gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].name); toCpy = gStringVar1; } else { toCpy = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].name; } break; case B_TXT_LINK_OPPONENT2_NAME: // link opponent 2 name title = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].neverRead; if(title != 0) { if(title == 152) { //GRAND MASTER StringCopy(gStringVar1, gText_GrandMaster); } else { //MON MASTER StringCopy(gStringVar1, gSpeciesNames[title]); StringAppend(gStringVar1, gText_Master); } StringAppend(gStringVar1, gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].name); toCpy = gStringVar1; } else { toCpy = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].name; } break; case B_TXT_LINK_SCR_TRAINER_NAME: // link scripting active name title = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].neverRead; if(title != 0) { if(title == 152) { //GRAND MASTER StringCopy(gStringVar1, gText_GrandMaster); } else { //MON MASTER StringCopy(gStringVar1, gSpeciesNames[title]); StringAppend(gStringVar1, gText_Master); } StringAppend(gStringVar1, gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name); toCpy = gStringVar1; } else { toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name; } break; case B_TXT_PLAYER_NAME: // player name toCpy = gSaveBlock2Ptr->playerName; break; case B_TXT_TRAINER1_LOSE_TEXT: // trainerA lose text if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) { GetTrainerTowerOpponentLoseText(gStringVar4, 0); toCpy = gStringVar4; } else { toCpy = GetTrainerALoseText(); } break; case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) { GetTrainerTowerOpponentWinText(gStringVar4, 0); toCpy = gStringVar4; } else { toCpy = GetTrainerWonSpeech(); } break; case B_TXT_TRAINER2_LOSE_TEXT: GetTrainerTowerOpponentLoseText(gStringVar4, 1); toCpy = gStringVar4; break; case B_TXT_TRAINER2_WIN_TEXT: GetTrainerTowerOpponentWinText(gStringVar4, 1); toCpy = gStringVar4; break; case B_TXT_26: // ? HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, *(&gBattleStruct->scriptPartyIdx)) break; case B_TXT_PC_CREATOR_NAME: // lanette pc if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC)) toCpy = sText_Bills; else toCpy = sText_Someones; break; case B_TXT_ATK_PREFIX2: if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) toCpy = sText_AllyPkmnPrefix2; else toCpy = sText_FoePkmnPrefix3; break; case B_TXT_DEF_PREFIX2: if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) toCpy = sText_AllyPkmnPrefix2; else toCpy = sText_FoePkmnPrefix3; break; case B_TXT_ATK_PREFIX1: if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) toCpy = sText_AllyPkmnPrefix; else toCpy = sText_FoePkmnPrefix2; break; case B_TXT_DEF_PREFIX1: if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) toCpy = sText_AllyPkmnPrefix; else toCpy = sText_FoePkmnPrefix2; break; case B_TXT_ATK_PREFIX3: if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) toCpy = sText_AllyPkmnPrefix3; else toCpy = sText_FoePkmnPrefix4; break; case B_TXT_DEF_PREFIX3: if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) toCpy = sText_AllyPkmnPrefix3; else toCpy = sText_FoePkmnPrefix4; break; } // missing if (toCpy != NULL) check while (*toCpy != EOS) { dst[dstId++] = *toCpy; toCpy++; } if (*src == B_TXT_TRAINER1_LOSE_TEXT || *src == B_TXT_TRAINER1_WIN_TEXT || *src == B_TXT_TRAINER2_LOSE_TEXT || *src == B_TXT_TRAINER2_WIN_TEXT) { dst[dstId++] = EXT_CTRL_CODE_BEGIN; dst[dstId++] = EXT_CTRL_CODE_PAUSE_UNTIL_PRESS; } } else { dst[dstId++] = *src; } src++; } dst[dstId++] = *src; return dstId; } static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) { u32 srcId = 1; u32 value = 0; u8 text[12]; u16 hword; *dst = EOS; while (src[srcId] != B_BUFF_EOS) { switch (src[srcId]) { case B_BUFF_STRING: // battle string hword = T1_READ_16(&src[srcId + 1]); StringAppend(dst, gBattleStringsTable[hword - BATTLESTRINGS_TABLE_START]); srcId += 3; break; case B_BUFF_NUMBER: // int to string switch (src[srcId + 1]) { case 1: value = src[srcId + 3]; break; case 2: value = T1_READ_16(&src[srcId + 3]); break; case 4: value = T1_READ_32(&src[srcId + 3]); break; } ConvertIntToDecimalStringN(dst, value, STR_CONV_MODE_LEFT_ALIGN, src[srcId + 2]); srcId += src[srcId + 1] + 3; break; case B_BUFF_MOVE: // move name StringAppend(dst, gMoveNames[T1_READ_16(&src[srcId + 1])]); srcId += 3; break; case B_BUFF_TYPE: // type name StringAppend(dst, gTypeNames[src[srcId + 1]]); srcId += 2; break; case B_BUFF_MON_NICK_WITH_PREFIX: // poke nick with prefix if (GetBattlerSide(src[srcId + 1]) == B_SIDE_PLAYER) { GetMonData(&gPlayerParty[src[srcId + 2]], MON_DATA_NICKNAME, text); } else { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) StringAppend(dst, sText_FoePkmnPrefix); else StringAppend(dst, sText_WildPkmnPrefix); GetMonData(&gEnemyParty[src[srcId + 2]], MON_DATA_NICKNAME, text); } StringGet_Nickname(text); StringAppend(dst, text); srcId += 3; break; case B_BUFF_STAT: // stats StringAppend(dst, gStatNamesTable[src[srcId + 1]]); srcId += 2; break; case B_BUFF_SPECIES: // species name bufferspeciesname(dst, T1_READ_16(&src[srcId + 1])); srcId += 3; break; case B_BUFF_MON_NICK: // poke nick without prefix if (GetBattlerSide(src[srcId + 1]) == B_SIDE_PLAYER) GetMonData(&gPlayerParty[src[srcId + 2]], MON_DATA_NICKNAME, dst); else GetMonData(&gEnemyParty[src[srcId + 2]], MON_DATA_NICKNAME, dst); StringGet_Nickname(dst); srcId += 3; break; case B_BUFF_NEGATIVE_FLAVOR: // flavor table StringAppend(dst, gPokeblockWasTooXStringTable[src[srcId + 1]]); srcId += 2; break; case B_BUFF_ABILITY: // ability names StringAppend(dst, gAbilityNames[src[srcId + 1]]); srcId += 2; break; case B_BUFF_ITEM: // item name hword = T1_READ_16(&src[srcId + 1]); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (hword == ITEM_ENIGMA_BERRY) { if (gLinkPlayers[gBattleStruct->multiplayerId].id == gPotentialItemEffectBattler) { StringCopy(dst, gEnigmaBerries[gPotentialItemEffectBattler].name); StringAppend(dst, sText_BerrySuffix); } else { StringAppend(dst, sText_EnigmaBerry); } } else { CopyItemName(hword, dst); } } else { CopyItemName(hword, dst); } srcId += 3; break; } } } static const struct BattleWindowText sTextOnWindowsInfo_Normal[] = { [B_WIN_MSG] = { .fillValue = PIXEL_FILL(0xf), .fontId = FONT_NORMAL, .x = 2, .y = 2, .letterSpacing = 0, .lineSpacing = 2, .speed = 1, .fgColor = 1, .bgColor = 15, .shadowColor = 6, }, [B_WIN_ACTION_PROMPT] = { .fillValue = PIXEL_FILL(0xf), .fontId = FONT_NORMAL, .x = 2, .y = 2, .letterSpacing = 0, .lineSpacing = 2, .speed = 0, .fgColor = 1, .bgColor = 15, .shadowColor = 6, }, [B_WIN_ACTION_MENU] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL_COPY_1, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 2, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_MOVE_NAME_1] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_SMALL, .x = 0, .y = 1, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_MOVE_NAME_2] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_SMALL, .x = 0, .y = 1, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_MOVE_NAME_3] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_SMALL, .x = 0, .y = 1, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_MOVE_NAME_4] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_SMALL, .x = 0, .y = 1, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_PP] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_SMALL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 12, .bgColor = 14, .shadowColor = 11, }, [B_WIN_MOVE_TYPE] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_SMALL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_PP_REMAINING] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL_COPY_1, .x = 10, .y = 2, .letterSpacing = 0, .lineSpacing = 2, .speed = 0, .fgColor = 12, .bgColor = 14, .shadowColor = 11, }, [B_WIN_DUMMY] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL_COPY_1, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 2, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_SWITCH_PROMPT] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL_COPY_1, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 2, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_LEVEL_UP_BOX] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL, .x = 0, .y = 0, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_LEVEL_UP_BANNER] = { .fillValue = PIXEL_FILL(0x0), .fontId = FONT_SMALL, .x = 0x20, .y = 0, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 1, .bgColor = 0, .shadowColor = 2, }, [B_WIN_YESNO] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 1, .lineSpacing = 2, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_VS_PLAYER] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_VS_OPPONENT] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_VS_MULTI_PLAYER_1] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_VS_MULTI_PLAYER_2] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_VS_MULTI_PLAYER_3] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_VS_MULTI_PLAYER_4] = { .fillValue = PIXEL_FILL(0xe), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 13, .bgColor = 14, .shadowColor = 15, }, [B_WIN_VS_OUTCOME_DRAW] = { .fillValue = PIXEL_FILL(0x0), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 1, .bgColor = 0, .shadowColor = 6, }, [B_WIN_VS_OUTCOME_LEFT] = { .fillValue = PIXEL_FILL(0x0), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 1, .bgColor = 0, .shadowColor = 6, }, [B_WIN_VS_OUTCOME_RIGHT] = { .fillValue = PIXEL_FILL(0x0), .fontId = FONT_NORMAL, .x = 0, .y = 2, .letterSpacing = 0, .lineSpacing = 0, .speed = 0, .fgColor = 1, .bgColor = 0, .shadowColor = 6, }, [B_WIN_OAK_OLD_MAN] = { .fillValue = PIXEL_FILL(0x1), .fontId = FONT_MALE, .x = 0, .y = 1, .letterSpacing = 0, .lineSpacing = 1, .speed = 1, .fgColor = 2, .bgColor = 1, .shadowColor = 3, } }; static const u8 sNpcTextColorToFont[] = { [NPC_TEXT_COLOR_MALE] = FONT_MALE, [NPC_TEXT_COLOR_FEMALE] = FONT_FEMALE, [NPC_TEXT_COLOR_MON] = FONT_NORMAL, [NPC_TEXT_COLOR_NEUTRAL] = FONT_NORMAL, }; // windowId: Upper 2 bits are text flags // x40: Use NPC context-defined font // x80: Inhibit window clear void BattlePutTextOnWindow(const u8 *text, u8 windowId) { bool32 copyToVram; struct TextPrinterTemplate printerTemplate; u8 speed; int x; u8 color; u8 textFlags = windowId & 0xC0; windowId &= 0x3F; if (!(textFlags & 0x80)) FillWindowPixelBuffer(windowId, sTextOnWindowsInfo_Normal[windowId].fillValue); if (textFlags & 0x40) { color = ContextNpcGetTextColor(); printerTemplate.fontId = sNpcTextColorToFont[color]; } else { printerTemplate.fontId = sTextOnWindowsInfo_Normal[windowId].fontId; } switch (windowId) { case B_WIN_VS_PLAYER: case B_WIN_VS_OPPONENT: case B_WIN_VS_MULTI_PLAYER_1: case B_WIN_VS_MULTI_PLAYER_2: case B_WIN_VS_MULTI_PLAYER_3: case B_WIN_VS_MULTI_PLAYER_4: x = (48 - GetStringWidth(sTextOnWindowsInfo_Normal[windowId].fontId, text, sTextOnWindowsInfo_Normal[windowId].letterSpacing)) / 2; break; case B_WIN_VS_OUTCOME_DRAW: case B_WIN_VS_OUTCOME_LEFT: case B_WIN_VS_OUTCOME_RIGHT: x = (64 - GetStringWidth(sTextOnWindowsInfo_Normal[windowId].fontId, text, sTextOnWindowsInfo_Normal[windowId].letterSpacing)) / 2; break; default: x = sTextOnWindowsInfo_Normal[windowId].x; break; } if (x < 0) x = 0; printerTemplate.currentChar = text; printerTemplate.windowId = windowId; printerTemplate.x = x; printerTemplate.y = sTextOnWindowsInfo_Normal[windowId].y; printerTemplate.currentX = printerTemplate.x; printerTemplate.currentY = printerTemplate.y; printerTemplate.letterSpacing = sTextOnWindowsInfo_Normal[windowId].letterSpacing; printerTemplate.lineSpacing = sTextOnWindowsInfo_Normal[windowId].lineSpacing; printerTemplate.unk = 0; printerTemplate.fgColor = sTextOnWindowsInfo_Normal[windowId].fgColor; printerTemplate.bgColor = sTextOnWindowsInfo_Normal[windowId].bgColor; printerTemplate.shadowColor = sTextOnWindowsInfo_Normal[windowId].shadowColor; if (windowId == B_WIN_OAK_OLD_MAN) gTextFlags.useAlternateDownArrow = FALSE; else gTextFlags.useAlternateDownArrow = TRUE; if ((gBattleTypeFlags & BATTLE_TYPE_LINK) || ((gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) && windowId != B_WIN_OAK_OLD_MAN)) gTextFlags.autoScroll = TRUE; else gTextFlags.autoScroll = FALSE; if (windowId == B_WIN_MSG || windowId == B_WIN_OAK_OLD_MAN) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) speed = 1; else speed = GetTextSpeedSetting(); gTextFlags.canABSpeedUpPrint = TRUE; } else { speed = sTextOnWindowsInfo_Normal[windowId].speed; gTextFlags.canABSpeedUpPrint = FALSE; } AddTextPrinter(&printerTemplate, speed, NULL); if (!(textFlags & 0x80)) { PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); } } bool8 BattleStringShouldBeColored(u16 stringId) { if (stringId == STRINGID_TRAINER1LOSETEXT || stringId == STRINGID_TRAINER2LOSETEXT || stringId == STRINGID_TRAINER1WINTEXT || stringId == STRINGID_TRAINER2WINTEXT) return TRUE; return FALSE; } void SetPpNumbersPaletteInMoveSelection(void) { struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]); const u16 *palPtr = gPPTextPalette; u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBattler]], chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBattler]]); gPlttBufferUnfaded[BG_PLTT_ID(5) + 12] = palPtr[(var * 2) + 0]; gPlttBufferUnfaded[BG_PLTT_ID(5) + 11] = palPtr[(var * 2) + 1]; CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(5) + 12], &gPlttBufferFaded[BG_PLTT_ID(5) + 12], PLTT_SIZEOF(1)); CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(5) + 11], &gPlttBufferFaded[BG_PLTT_ID(5) + 11], PLTT_SIZEOF(1)); } u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp) { if (maxPp == currentPp) { return 3; } else if (maxPp <= 2) { if (currentPp > 1) return 3; else return 2 - currentPp; } else if (maxPp <= 7) { if (currentPp > 2) return 3; else return 2 - currentPp; } else { if (currentPp == 0) return 2; if (currentPp <= maxPp / 4) return 1; if (currentPp > maxPp / 2) return 3; } return 0; } ================================================ FILE: src/battle_records.c ================================================ #include "global.h" #include "gflib.h" #include "event_data.h" #include "task.h" #include "text_window.h" #include "battle.h" #include "trainer_tower.h" #include "trainer_pokemon_sprites.h" #include "scanline_effect.h" #include "link.h" #include "menu.h" #include "overworld.h" #include "strings.h" #include "trainer_card.h" #include "text.h" #include "new_menu_helpers.h" #include "constants/battle.h" #include "constants/songs.h" #include "constants/maps.h" static EWRAM_DATA u16 * sBg3TilemapBuffer_p = NULL; static void MainCB2_SetUp(void); static void VBlankCB(void); static void MainCB2(void); static void Task_WaitFadeIn(u8 taskId); static void Task_WaitButton(u8 taskId); static void Task_FadeOut(u8 taskId); static void Task_DestroyAndReturnToField(u8 taskId); static void ClearWindowCommitAndRemove(u8 windowId); static void ResetGpu(void); static void StopAllRunningTasks(void); static void EnableDisplay(void); static void ResetBGPos(void); static void PrintBattleRecords(void); static void CommitWindow(u8 windowId); static void LoadFrameGfxOnBg(u8 bgId); void ShowBattleTowerRecords(void); void RemoveRecordsWindow(void); static const u16 sTiles[] = INCBIN_U16("graphics/battle_records/bg_tiles.4bpp"); static const u16 sPalette[] = INCBIN_U16("graphics/battle_records/bg_tiles.gbapal"); static const u16 sTilemap[] = INCBIN_U16("graphics/battle_records/bg_tiles.bin"); static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 2, .tilemapTop = 1, .width = 27, .height = 18, .paletteNum = 15, .baseBlock = 0x014 }, DUMMY_WIN_TEMPLATE }; static const u8 sTextColor[3] = { 0, 2, 3 }; static const struct BgTemplate sBgTemplates[2] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, // 4bpp .priority = 0, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, // 4bpp .priority = 3, .baseTile = 0x000 } }; static const struct WindowTemplate sFrontierResultsWindowTemplate = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 0x1c, .height = 0x12, .paletteNum = 15, .baseBlock = 1 }; static u8 *const sStringVars[3] = { gStringVar1, gStringVar2, gStringVar3 }; void ShowBattleRecords(void) { SetVBlankCallback(NULL); SetMainCallback2(MainCB2_SetUp); } static void MainCB2_SetUp(void) { switch (gMain.state) { case 0: SetVBlankCallback(NULL); ResetGpu(); gMain.state++; break; case 1: StopAllRunningTasks(); gMain.state++; break; case 2: sBg3TilemapBuffer_p = AllocZeroed(0x800); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetBgTilemapBuffer(3, sBg3TilemapBuffer_p); ResetBGPos(); gMain.state++; break; case 3: LoadFrameGfxOnBg(3); LoadPalette(GetTextWindowPalette(0), BG_PLTT_ID(15), PLTT_SIZE_4BPP); gMain.state++; break; case 4: if (IsDma3ManagerBusyWithBgCopy() != TRUE) { ShowBg(0); ShowBg(3); CopyBgTilemapBufferToVram(3); gMain.state++; } break; case 5: InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); gMain.state++; break; case 6: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; break; case 7: EnableDisplay(); SetVBlankCallback(VBlankCB); if (gSpecialVar_0x8004) PrintTrainerTowerRecords(); else PrintBattleRecords(); CreateTask(Task_WaitFadeIn, 8); SetMainCallback2(MainCB2); gMain.state = 0; break; } } static void VBlankCB(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void MainCB2(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void Task_WaitFadeIn(u8 taskId) { if (!gPaletteFade.active) gTasks[taskId].func = Task_WaitButton; } static void Task_WaitButton(u8 taskId) { struct Task *task = &gTasks[taskId]; if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); task->func = Task_FadeOut; } } static void Task_FadeOut(u8 taskId) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_DestroyAndReturnToField; } static void Task_DestroyAndReturnToField(u8 taskId) { if (!gPaletteFade.active) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); Free(sBg3TilemapBuffer_p); ClearWindowCommitAndRemove(0); FreeAllWindowBuffers(); DestroyTask(taskId); } } static void ClearWindowCommitAndRemove(u8 windowId) { FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); ClearWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_GFX); RemoveWindow(windowId); } static void ResetGpu(void) { { void *dest = (void *)VRAM; u32 size = VRAM_SIZE; DmaClearLarge16(3, dest, size, 0x1000); } { void *dest = (void *)OAM; u32 size = OAM_SIZE; DmaClear32(3, dest, size); } { void *dest = (void *)PLTT; u32 size = PLTT_SIZE; DmaClear16(3, dest, size); } SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG0CNT, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1CNT, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2CNT, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3CNT, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); } static void StopAllRunningTasks(void) { ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetAllPicSprites(); ResetPaletteFade(); FreeAllSpritePalettes(); } static void EnableDisplay(void) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON); } static void ResetBGPos(void) { ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); } static void ClearLinkBattleRecord(struct LinkBattleRecord *record) { CpuFill16(0, record, sizeof(*record)); record->name[0] = EOS; record->trainerId = 0; record->wins = 0; record->losses = 0; record->draws = 0; } static void ClearLinkBattleRecords(struct LinkBattleRecords *records) { s32 i; for (i = 0; i < LINK_B_RECORDS_COUNT; i++) ClearLinkBattleRecord(&records->entries[i]); SetGameStat(GAME_STAT_LINK_BATTLE_WINS, 0); SetGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 0); SetGameStat(GAME_STAT_LINK_BATTLE_DRAWS, 0); } static s32 GetLinkBattleRecordTotalBattles(struct LinkBattleRecord * record) { return record->wins + record->losses + record->draws; } static s32 IndexOfOpponentLinkBattleRecord(struct LinkBattleRecords * records, const u8 * name, u16 trainerId) { s32 i; for (i = 0; i < LINK_B_RECORDS_COUNT; i++) { if (StringCompareN(records->entries[i].name, name, PLAYER_NAME_LENGTH) == 0 && records->entries[i].trainerId == trainerId) return i; } return LINK_B_RECORDS_COUNT; } static void SortLinkBattleRecords(struct LinkBattleRecords * records) { struct LinkBattleRecord tmp; s32 i; s32 j; for (i = LINK_B_RECORDS_COUNT - 1; i > 0; i--) { for (j = i - 1; j >= 0; j--) { if (GetLinkBattleRecordTotalBattles(&records->entries[i]) > GetLinkBattleRecordTotalBattles(&records->entries[j])) { tmp = records->entries[i]; records->entries[i] = records->entries[j]; records->entries[j] = tmp; } } } } static void UpdateLinkBattleRecord(struct LinkBattleRecord * record, s32 outcome) { switch (outcome) { case B_OUTCOME_WON: record->wins++; if (record->wins > 9999) record->wins = 9999; break; case B_OUTCOME_LOST: record->losses++; if (record->losses > 9999) record->losses = 9999; break; case B_OUTCOME_DREW: record->draws++; if (record->draws > 9999) record->draws = 9999; break; } } static void UpdateLinkBattleGameStats(s32 outcome) { u8 statId; switch (outcome) { case B_OUTCOME_WON: statId = GAME_STAT_LINK_BATTLE_WINS; break; case B_OUTCOME_LOST: statId = GAME_STAT_LINK_BATTLE_LOSSES; break; case B_OUTCOME_DREW: statId = GAME_STAT_LINK_BATTLE_DRAWS; break; default: return; } if (GetGameStat(statId) < 9999) IncrementGameStat(statId); } static void AddOpponentLinkBattleRecord(struct LinkBattleRecords * records, const u8 * name, u16 trainerId, s32 outcome, u32 language) { u8 namebuf[PLAYER_NAME_LENGTH + 1]; s32 i; struct LinkBattleRecord * record; if (language == LANGUAGE_JAPANESE) { namebuf[0] = EXT_CTRL_CODE_BEGIN; namebuf[1] = EXT_CTRL_CODE_JPN; StringCopy(&namebuf[2], name); } else StringCopy(namebuf, name); UpdateLinkBattleGameStats(outcome); SortLinkBattleRecords(records); i = IndexOfOpponentLinkBattleRecord(records, namebuf, trainerId); if (i == LINK_B_RECORDS_COUNT) { i = LINK_B_RECORDS_COUNT - 1; record = &records->entries[LINK_B_RECORDS_COUNT - 1]; ClearLinkBattleRecord(record); StringCopyN(record->name, namebuf, PLAYER_NAME_LENGTH); record->trainerId = trainerId; } UpdateLinkBattleRecord(&records->entries[i], outcome); SortLinkBattleRecords(records); } void ClearPlayerLinkBattleRecords(void) { ClearLinkBattleRecords(&gSaveBlock2Ptr->linkBattleRecords); } static void IncTrainerCardWinCount(s32 battlerId) { u16 *wins = &gTrainerCards[battlerId].rse.linkBattleWins; (*wins)++; if (*wins > 9999) *wins = 9999; } static void IncTrainerCardLossCount(s32 battlerId) { u16 *losses = &gTrainerCards[battlerId].rse.linkBattleLosses; (*losses)++; if (*losses > 9999) *losses = 9999; } static void UpdateBattleOutcomeOnTrainerCards(s32 battlerId) { switch (gBattleOutcome) { case B_OUTCOME_WON: IncTrainerCardWinCount(battlerId ^ 1); IncTrainerCardLossCount(battlerId); break; case B_OUTCOME_LOST: IncTrainerCardLossCount(battlerId ^ 1); IncTrainerCardWinCount(battlerId); break; } } void UpdatePlayerLinkBattleRecords(s32 battlerId) { if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(UNION_ROOM) || gSaveBlock1Ptr->location.mapNum != MAP_NUM(UNION_ROOM)) { UpdateBattleOutcomeOnTrainerCards(battlerId); AddOpponentLinkBattleRecord(&gSaveBlock2Ptr->linkBattleRecords, gTrainerCards[battlerId].rse.playerName, gTrainerCards[battlerId].rse.trainerId, gBattleOutcome, gLinkPlayers[battlerId].language); } } static void PrintTotalRecord(struct LinkBattleRecords * records) { u32 nwins = GetGameStat(GAME_STAT_LINK_BATTLE_WINS); u32 nlosses = GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES); u32 ndraws = GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS); s32 i; s32 j; bool32 foundEnd; u8 * strvar; if (nwins > 9999) nwins = 9999; if (nlosses > 9999) nlosses = 9999; if (ndraws > 9999) ndraws = 9999; ConvertIntToDecimalStringN(gStringVar1, nwins, STR_CONV_MODE_LEFT_ALIGN, 4); ConvertIntToDecimalStringN(gStringVar2, nlosses, STR_CONV_MODE_LEFT_ALIGN, 4); ConvertIntToDecimalStringN(gStringVar3, ndraws, STR_CONV_MODE_LEFT_ALIGN, 4); for (i = 0; i < NELEMS(sStringVars); i++) { strvar = sStringVars[i]; foundEnd = FALSE; for (j = 0; j < 4; j++) { if (!foundEnd && *strvar == EOS) foundEnd = TRUE; if (foundEnd) *strvar = CHAR_SPACE; strvar++; } *strvar = 0xFF; } StringExpandPlaceholders(gStringVar4, gString_BattleRecords_TotalRecord); AddTextPrinterParameterized4(0, FONT_NORMAL, 12, 24, 0, 2, sTextColor, 0, gStringVar4); } static void PrintOpponentBattleRecord(struct LinkBattleRecord * record, u8 y) { u8 i = 0; s32 x; if (record->wins == 0 && record->losses == 0 && record->draws == 0) { AddTextPrinterParameterized4(0, FONT_NORMAL, 0, y, 0, 2, sTextColor, 0, gString_BattleRecords_7Dashes); for (i = 0; i < 3; i++) { if (i == 0) x = 0x54; else if (i == 1) x = 0x84; else x = 0xB4; AddTextPrinterParameterized4(0, FONT_NORMAL, x, y, 0, 2, sTextColor, 0, gString_BattleRecords_4Dashes); } } else { for (i = 0; i < 4; i++) { if (i == 0) { x = 0; StringFillWithTerminator(gStringVar1, PLAYER_NAME_LENGTH + 1); StringCopyN(gStringVar1, record->name, PLAYER_NAME_LENGTH); } else if (i == 1) { x = 0x54; ConvertIntToDecimalStringN(gStringVar1, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4); } else if (i == 2) { x = 0x84; ConvertIntToDecimalStringN(gStringVar1, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4); } else { x = 0xB4; ConvertIntToDecimalStringN(gStringVar1, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4); } AddTextPrinterParameterized4(0, FONT_NORMAL, x, y, 0, 2, sTextColor, 0, gStringVar1); } } } static void PrintBattleRecords(void) { u32 left; s32 i; FillWindowPixelRect(0, PIXEL_FILL(0), 0, 0, 0xD8, 0x90); StringExpandPlaceholders(gStringVar4, gString_BattleRecords_PlayersBattleResults); left = 0xD0 - GetStringWidth(FONT_NORMAL, gStringVar4, -1); AddTextPrinterParameterized4(0, FONT_NORMAL, left / 2, 4, 0, 2, sTextColor, 0, gStringVar4); PrintTotalRecord(&gSaveBlock2Ptr->linkBattleRecords); AddTextPrinterParameterized4(0, FONT_NORMAL, 0x54, 0x30, 0, 2, sTextColor, 0, gString_BattleRecords_ColumnHeaders); for (i = 0; i < LINK_B_RECORDS_COUNT; i++) PrintOpponentBattleRecord(&gSaveBlock2Ptr->linkBattleRecords.entries[i], 0x3D + 14 * i); CommitWindow(0); } static void CommitWindow(u8 windowId) { PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); } static void LoadFrameGfxOnBg(u8 bg) { LoadBgTiles(bg, sTiles, 0xC0, 0); CopyToBgTilemapBufferRect(bg, sTilemap, 0, 0, 32, 32); LoadPalette(sPalette, BG_PLTT_ID(0), PLTT_SIZE_4BPP); } // Battle Tower Stuff static void PrintHyphens(s32 y, u8 gRecordsWindowId) { s32 i; u8 text[37]; for (i = 0; i < 36; i++) text[i] = CHAR_HYPHEN; text[i] = EOS; y = (y * 8) + 1; AddTextPrinterParameterized(gRecordsWindowId, 1, text, 4, y, TEXT_SKIP_DRAW, NULL); } // Battle Tower records. static bool32 sub_8110494(u8 level) { switch (gSaveBlock2Ptr->battleTower.var_4AE[level]) { case 0: return FALSE; case 1: return FALSE; case 2: return TRUE; case 4: return FALSE; case 3: return TRUE; case 5: return FALSE; case 6: return TRUE; default: return FALSE; } } static void TowerPrintStreak(const u8 *str, u16 num, u8 x1, u8 x2, u8 y, u8 gRecordsWindowId) { AddTextPrinterParameterized(gRecordsWindowId, 1, str, x1, y, TEXT_SKIP_DRAW, NULL); if (num > 9999) num = 9999; ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_RIGHT_ALIGN, 4); StringExpandPlaceholders(gStringVar4, gOtherText_WinStreak); AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x2, y, TEXT_SKIP_DRAW, NULL); } static void TowerPrintRecordStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 y, u8 gRecordsWindowId) { u16 num = gSaveBlock2Ptr->battleTower.recordWinStreaks[lvlMode]; TowerPrintStreak(gOtherText_Record, num, x1, x2, y, gRecordsWindowId); } static u16 TowerGetWinStreak(u8 battleMode, u8 lvlMode) { u16 winStreak = gSaveBlock2Ptr->battleTower.currentWinStreaks[lvlMode]; if (winStreak > 9999) return 9999; else return winStreak; } static void TowerPrintPrevOrCurrentStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 y, u8 gRecordsWindowId) { bool8 isCurrent; u16 winStreak = TowerGetWinStreak(battleMode, lvlMode); if (lvlMode != 0) isCurrent = sub_8110494(lvlMode); else isCurrent = sub_8110494(lvlMode); if (isCurrent == TRUE) TowerPrintStreak(gOtherText_Current, winStreak, x1, x2, y, gRecordsWindowId); else TowerPrintStreak(gOtherText_Prev, winStreak, x1, x2, y, gRecordsWindowId); } static void PrintAligned(const u8 *str, s32 y, u8 gRecordsWindowId) { s32 x = GetStringCenterAlignXOffset(1, str, 224); y = (y * 8) + 1; AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, y, TEXT_SKIP_DRAW, NULL); } void ShowBattleTowerRecords(void) { u8 battleMode = 0; u8 gRecordsWindowId; gRecordsWindowId = AddWindow(&sFrontierResultsWindowTemplate); DrawStdWindowFrame(gRecordsWindowId, FALSE); FillWindowPixelBuffer(gRecordsWindowId, PIXEL_FILL(1)); StringExpandPlaceholders(gStringVar4, gOtherText_BattleTowerResults); PrintAligned(gStringVar4, 2, gRecordsWindowId); AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Lv50, 8, 49, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(gRecordsWindowId, 1, gText_OpenLv, 8, 97, TEXT_SKIP_DRAW, NULL); PrintHyphens(10, gRecordsWindowId); TowerPrintPrevOrCurrentStreak(battleMode, 0, 72, 121, 49, gRecordsWindowId); TowerPrintRecordStreak(battleMode, 0, 72, 121, 65, gRecordsWindowId); TowerPrintPrevOrCurrentStreak(battleMode, 1, 72, 121, 97, gRecordsWindowId); TowerPrintRecordStreak(battleMode, 1, 72, 121, 113, gRecordsWindowId); PutWindowTilemap(gRecordsWindowId); CopyWindowToVram(gRecordsWindowId, 3); gSpecialVar_Result = gRecordsWindowId; } void RemoveRecordsWindow(void) { ClearStdWindowAndFrame(gSpecialVar_Result, FALSE); RemoveWindow(gSpecialVar_Result); } ================================================ FILE: src/battle_script_commands.c ================================================ #include "global.h" #include "gflib.h" #include "item.h" #include "util.h" #include "random.h" #include "pokedex.h" #include "money.h" #include "pokemon_icon.h" #include "mail.h" #include "event_data.h" #include "strings.h" #include "pokemon_special_anim.h" #include "pokemon_storage_system.h" #include "pokemon_summary_screen.h" #include "task.h" #include "naming_screen.h" #include "overworld.h" #include "party_menu.h" #include "trainer_pokemon_sprites.h" #include "field_specials.h" #include "battle.h" #include "battle_message.h" #include "battle_anim.h" #include "battle_ai_script_commands.h" #include "battle_scripts.h" #include "reshow_battle_screen.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_setup.h" #include "constants/battle_anim.h" #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" #include "constants/items.h" #include "constants/hold_effects.h" #include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/moves.h" #include "constants/abilities.h" #include "constants/pokemon.h" #include "constants/maps.h" extern const u8 *const gBattleScriptsForMoveEffects[]; #define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) #define LEVEL_UP_BANNER_START 416 #define LEVEL_UP_BANNER_END 512 #define TAG_LVLUP_BANNER_MON_ICON 55130 static bool8 IsTwoTurnsMove(u16 move); static void TrySetDestinyBondToHappen(void); static u8 AttacksThisTurn(u8 battlerId, u16 move); // Note: returns 1 if it's a charging turn, otherwise 2. static void CheckWonderGuardAndLevitate(void); static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8, const u8 *BS_ptr); static void InitLevelUpBanner(void); static bool8 SlideInLevelUpBanner(void); static bool8 SlideOutLevelUpBanner(void); static void DrawLevelUpWindow1(void); static void DrawLevelUpWindow2(void); static void PutMonIconOnLvlUpBanner(void); static void DrawLevelUpBannerText(void); static void SpriteCB_MonIconOnLvlUpBanner(struct Sprite* sprite); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); static void Cmd_attackstring(void); static void Cmd_ppreduce(void); static void Cmd_critcalc(void); static void Cmd_damagecalc(void); static void Cmd_typecalc(void); static void Cmd_adjustnormaldamage(void); static void Cmd_adjustnormaldamage2(void); static void Cmd_attackanimation(void); static void Cmd_waitanimation(void); static void Cmd_healthbarupdate(void); static void Cmd_datahpupdate(void); static void Cmd_critmessage(void); static void Cmd_effectivenesssound(void); static void Cmd_resultmessage(void); static void Cmd_printstring(void); static void Cmd_printselectionstring(void); static void Cmd_waitmessage(void); static void Cmd_printfromtable(void); static void Cmd_printselectionstringfromtable(void); static void Cmd_seteffectwithchance(void); static void Cmd_seteffectprimary(void); static void Cmd_seteffectsecondary(void); static void Cmd_clearstatusfromeffect(void); static void Cmd_tryfaintmon(void); static void Cmd_dofaintanimation(void); static void Cmd_cleareffectsonfaint(void); static void Cmd_jumpifstatus(void); static void Cmd_jumpifstatus2(void); static void Cmd_jumpifability(void); static void Cmd_jumpifsideaffecting(void); static void Cmd_jumpifstat(void); static void Cmd_jumpifstatus3condition(void); static void Cmd_jumpiftype(void); static void Cmd_getexp(void); static void Cmd_checkteamslost(void); static void Cmd_movevaluescleanup(void); static void Cmd_setmultihit(void); static void Cmd_decrementmultihit(void); static void Cmd_goto(void); static void Cmd_jumpifbyte(void); static void Cmd_jumpifhalfword(void); static void Cmd_jumpifword(void); static void Cmd_jumpifarrayequal(void); static void Cmd_jumpifarraynotequal(void); static void Cmd_setbyte(void); static void Cmd_addbyte(void); static void Cmd_subbyte(void); static void Cmd_copyarray(void); static void Cmd_copyarraywithindex(void); static void Cmd_orbyte(void); static void Cmd_orhalfword(void); static void Cmd_orword(void); static void Cmd_bicbyte(void); static void Cmd_bichalfword(void); static void Cmd_bicword(void); static void Cmd_pause(void); static void Cmd_waitstate(void); static void Cmd_healthbar_update(void); static void Cmd_return(void); static void Cmd_end(void); static void Cmd_end2(void); static void Cmd_end3(void); static void Cmd_jumpifaffectedbyprotect(void); static void Cmd_call(void); static void Cmd_jumpiftype2(void); static void Cmd_jumpifabilitypresent(void); static void Cmd_endselectionscript(void); static void Cmd_playanimation(void); static void Cmd_playanimation_var(void); static void Cmd_setgraphicalstatchangevalues(void); static void Cmd_playstatchangeanimation(void); static void Cmd_moveend(void); static void Cmd_typecalc2(void); static void Cmd_returnatktoball(void); static void Cmd_getswitchedmondata(void); static void Cmd_switchindataupdate(void); static void Cmd_switchinanim(void); static void Cmd_jumpifcantswitch(void); static void Cmd_openpartyscreen(void); static void Cmd_switchhandleorder(void); static void Cmd_switchineffects(void); static void Cmd_trainerslidein(void); static void Cmd_playse(void); static void Cmd_fanfare(void); static void Cmd_playfaintcry(void); static void Cmd_endlinkbattle(void); static void Cmd_returntoball(void); static void Cmd_handlelearnnewmove(void); static void Cmd_yesnoboxlearnmove(void); static void Cmd_yesnoboxstoplearningmove(void); static void Cmd_hitanimation(void); static void Cmd_getmoneyreward(void); static void Cmd_updatebattlermoves(void); static void Cmd_swapattackerwithtarget(void); static void Cmd_incrementgamestat(void); static void Cmd_drawpartystatussummary(void); static void Cmd_hidepartystatussummary(void); static void Cmd_jumptocalledmove(void); static void Cmd_statusanimation(void); static void Cmd_status2animation(void); static void Cmd_chosenstatusanimation(void); static void Cmd_yesnobox(void); static void Cmd_cancelallactions(void); static void Cmd_adjustsetdamage(void); static void Cmd_removeitem(void); static void Cmd_atknameinbuff1(void); static void Cmd_drawlvlupbox(void); static void Cmd_resetsentmonsvalue(void); static void Cmd_setatktoplayer0(void); static void Cmd_makevisible(void); static void Cmd_recordlastability(void); static void Cmd_buffermovetolearn(void); static void Cmd_jumpifplayerran(void); static void Cmd_hpthresholds(void); static void Cmd_hpthresholds2(void); static void Cmd_useitemonopponent(void); static void Cmd_various(void); static void Cmd_setprotectlike(void); static void Cmd_tryexplosion(void); static void Cmd_setatkhptozero(void); static void Cmd_jumpifnexttargetvalid(void); static void Cmd_tryhealhalfhealth(void); static void Cmd_trymirrormove(void); static void Cmd_setrain(void); static void Cmd_setreflect(void); static void Cmd_setseeded(void); static void Cmd_manipulatedamage(void); static void Cmd_trysetrest(void); static void Cmd_jumpifnotfirstturn(void); static void Cmd_nop(void); static void Cmd_jumpifcantmakeasleep(void); static void Cmd_stockpile(void); static void Cmd_stockpiletobasedamage(void); static void Cmd_stockpiletohpheal(void); static void Cmd_negativedamage(void); static void Cmd_statbuffchange(void); static void Cmd_normalisebuffs(void); static void Cmd_setbide(void); static void Cmd_confuseifrepeatingattackends(void); static void Cmd_setmultihitcounter(void); static void Cmd_initmultihitstring(void); static void Cmd_forcerandomswitch(void); static void Cmd_tryconversiontypechange(void); static void Cmd_givepaydaymoney(void); static void Cmd_setlightscreen(void); static void Cmd_tryKO(void); static void Cmd_damagetohalftargethp(void); static void Cmd_setsandstorm(void); static void Cmd_weatherdamage(void); static void Cmd_tryinfatuating(void); static void Cmd_updatestatusicon(void); static void Cmd_setmist(void); static void Cmd_setfocusenergy(void); static void Cmd_transformdataexecution(void); static void Cmd_setsubstitute(void); static void Cmd_mimicattackcopy(void); static void Cmd_metronome(void); static void Cmd_dmgtolevel(void); static void Cmd_psywavedamageeffect(void); static void Cmd_counterdamagecalculator(void); static void Cmd_mirrorcoatdamagecalculator(void); static void Cmd_disablelastusedattack(void); static void Cmd_trysetencore(void); static void Cmd_painsplitdmgcalc(void); static void Cmd_settypetorandomresistance(void); static void Cmd_setalwayshitflag(void); static void Cmd_copymovepermanently(void); static void Cmd_trychoosesleeptalkmove(void); static void Cmd_setdestinybond(void); static void Cmd_trysetdestinybondtohappen(void); static void Cmd_remaininghptopower(void); static void Cmd_tryspiteppreduce(void); static void Cmd_healpartystatus(void); static void Cmd_cursetarget(void); static void Cmd_trysetspikes(void); static void Cmd_setforesight(void); static void Cmd_trysetperishsong(void); static void Cmd_rolloutdamagecalculation(void); static void Cmd_jumpifconfusedandstatmaxed(void); static void Cmd_furycuttercalc(void); static void Cmd_friendshiptodamagecalculation(void); static void Cmd_presentdamagecalculation(void); static void Cmd_setsafeguard(void); static void Cmd_magnitudedamagecalculation(void); static void Cmd_jumpifnopursuitswitchdmg(void); static void Cmd_setsunny(void); static void Cmd_maxattackhalvehp(void); static void Cmd_copyfoestats(void); static void Cmd_rapidspinfree(void); static void Cmd_setdefensecurlbit(void); static void Cmd_recoverbasedonsunlight(void); static void Cmd_hiddenpowercalc(void); static void Cmd_selectfirstvalidtarget(void); static void Cmd_trysetfutureattack(void); static void Cmd_trydobeatup(void); static void Cmd_setsemiinvulnerablebit(void); static void Cmd_clearsemiinvulnerablebit(void); static void Cmd_setminimize(void); static void Cmd_sethail(void); static void Cmd_trymemento(void); static void Cmd_setforcedtarget(void); static void Cmd_setcharge(void); static void Cmd_callterrainattack(void); static void Cmd_cureifburnedparalysedorpoisoned(void); static void Cmd_settorment(void); static void Cmd_jumpifnodamage(void); static void Cmd_settaunt(void); static void Cmd_trysethelpinghand(void); static void Cmd_tryswapitems(void); static void Cmd_trycopyability(void); static void Cmd_trywish(void); static void Cmd_trysetroots(void); static void Cmd_doubledamagedealtifdamaged(void); static void Cmd_setyawn(void); static void Cmd_setdamagetohealthdifference(void); static void Cmd_scaledamagebyhealthratio(void); static void Cmd_tryswapabilities(void); static void Cmd_tryimprison(void); static void Cmd_trysetgrudge(void); static void Cmd_weightdamagecalculation(void); static void Cmd_assistattackselect(void); static void Cmd_trysetmagiccoat(void); static void Cmd_trysetsnatch(void); static void Cmd_trygetintimidatetarget(void); static void Cmd_switchoutabilities(void); static void Cmd_jumpifhasnohp(void); static void Cmd_getsecretpowereffect(void); static void Cmd_pickup(void); static void Cmd_docastformchangeanimation(void); static void Cmd_trycastformdatachange(void); static void Cmd_settypebasedhalvers(void); static void Cmd_setweatherballtype(void); static void Cmd_tryrecycleitem(void); static void Cmd_settypetoterrain(void); static void Cmd_pursuitdoubles(void); static void Cmd_snatchsetbattlers(void); static void Cmd_removelightscreenreflect(void); static void Cmd_handleballthrow(void); static void Cmd_givecaughtmon(void); static void Cmd_trysetcaughtmondexflags(void); static void Cmd_displaydexinfo(void); static void Cmd_trygivecaughtmonnick(void); static void Cmd_subattackerhpbydmg(void); static void Cmd_removeattackerstatus1(void); static void Cmd_finishaction(void); static void Cmd_finishturn(void); void (* const gBattleScriptingCommandsTable[])(void) = { Cmd_attackcanceler, //0x0 Cmd_accuracycheck, //0x1 Cmd_attackstring, //0x2 Cmd_ppreduce, //0x3 Cmd_critcalc, //0x4 Cmd_damagecalc, //0x5 Cmd_typecalc, //0x6 Cmd_adjustnormaldamage, //0x7 Cmd_adjustnormaldamage2, //0x8 Cmd_attackanimation, //0x9 Cmd_waitanimation, //0xA Cmd_healthbarupdate, //0xB Cmd_datahpupdate, //0xC Cmd_critmessage, //0xD Cmd_effectivenesssound, //0xE Cmd_resultmessage, //0xF Cmd_printstring, //0x10 Cmd_printselectionstring, //0x11 Cmd_waitmessage, //0x12 Cmd_printfromtable, //0x13 Cmd_printselectionstringfromtable, //0x14 Cmd_seteffectwithchance, //0x15 Cmd_seteffectprimary, //0x16 Cmd_seteffectsecondary, //0x17 Cmd_clearstatusfromeffect, //0x18 Cmd_tryfaintmon, //0x19 Cmd_dofaintanimation, //0x1A Cmd_cleareffectsonfaint, //0x1B Cmd_jumpifstatus, //0x1C Cmd_jumpifstatus2, //0x1D Cmd_jumpifability, //0x1E Cmd_jumpifsideaffecting, //0x1F Cmd_jumpifstat, //0x20 Cmd_jumpifstatus3condition, //0x21 Cmd_jumpiftype, //0x22 Cmd_getexp, //0x23 Cmd_checkteamslost, //0x24 Cmd_movevaluescleanup, //0x25 Cmd_setmultihit, //0x26 Cmd_decrementmultihit, //0x27 Cmd_goto, //0x28 Cmd_jumpifbyte, //0x29 Cmd_jumpifhalfword, //0x2A Cmd_jumpifword, //0x2B Cmd_jumpifarrayequal, //0x2C Cmd_jumpifarraynotequal, //0x2D Cmd_setbyte, //0x2E Cmd_addbyte, //0x2F Cmd_subbyte, //0x30 Cmd_copyarray, //0x31 Cmd_copyarraywithindex, //0x32 Cmd_orbyte, //0x33 Cmd_orhalfword, //0x34 Cmd_orword, //0x35 Cmd_bicbyte, //0x36 Cmd_bichalfword, //0x37 Cmd_bicword, //0x38 Cmd_pause, //0x39 Cmd_waitstate, //0x3A Cmd_healthbar_update, //0x3B Cmd_return, //0x3C Cmd_end, //0x3D Cmd_end2, //0x3E Cmd_end3, //0x3F Cmd_jumpifaffectedbyprotect, //0x40 Cmd_call, //0x41 Cmd_jumpiftype2, //0x42 Cmd_jumpifabilitypresent, //0x43 Cmd_endselectionscript, //0x44 Cmd_playanimation, //0x45 Cmd_playanimation_var, //0x46 Cmd_setgraphicalstatchangevalues, //0x47 Cmd_playstatchangeanimation, //0x48 Cmd_moveend, //0x49 Cmd_typecalc2, //0x4A Cmd_returnatktoball, //0x4B Cmd_getswitchedmondata, //0x4C Cmd_switchindataupdate, //0x4D Cmd_switchinanim, //0x4E Cmd_jumpifcantswitch, //0x4F Cmd_openpartyscreen, //0x50 Cmd_switchhandleorder, //0x51 Cmd_switchineffects, //0x52 Cmd_trainerslidein, //0x53 Cmd_playse, //0x54 Cmd_fanfare, //0x55 Cmd_playfaintcry, //0x56 Cmd_endlinkbattle, //0x57 Cmd_returntoball, //0x58 Cmd_handlelearnnewmove, //0x59 Cmd_yesnoboxlearnmove, //0x5A Cmd_yesnoboxstoplearningmove, //0x5B Cmd_hitanimation, //0x5C Cmd_getmoneyreward, //0x5D Cmd_updatebattlermoves, //0x5E Cmd_swapattackerwithtarget, //0x5F Cmd_incrementgamestat, //0x60 Cmd_drawpartystatussummary, //0x61 Cmd_hidepartystatussummary, //0x62 Cmd_jumptocalledmove, //0x63 Cmd_statusanimation, //0x64 Cmd_status2animation, //0x65 Cmd_chosenstatusanimation, //0x66 Cmd_yesnobox, //0x67 Cmd_cancelallactions, //0x68 Cmd_adjustsetdamage, //0x69 Cmd_removeitem, //0x6A Cmd_atknameinbuff1, //0x6B Cmd_drawlvlupbox, //0x6C Cmd_resetsentmonsvalue, //0x6D Cmd_setatktoplayer0, //0x6E Cmd_makevisible, //0x6F Cmd_recordlastability, //0x70 Cmd_buffermovetolearn, //0x71 Cmd_jumpifplayerran, //0x72 Cmd_hpthresholds, //0x73 Cmd_hpthresholds2, //0x74 Cmd_useitemonopponent, //0x75 Cmd_various, //0x76 Cmd_setprotectlike, //0x77 Cmd_tryexplosion, //0x78 Cmd_setatkhptozero, //0x79 Cmd_jumpifnexttargetvalid, //0x7A Cmd_tryhealhalfhealth, //0x7B Cmd_trymirrormove, //0x7C Cmd_setrain, //0x7D Cmd_setreflect, //0x7E Cmd_setseeded, //0x7F Cmd_manipulatedamage, //0x80 Cmd_trysetrest, //0x81 Cmd_jumpifnotfirstturn, //0x82 Cmd_nop, //0x83 Cmd_jumpifcantmakeasleep, //0x84 Cmd_stockpile, //0x85 Cmd_stockpiletobasedamage, //0x86 Cmd_stockpiletohpheal, //0x87 Cmd_negativedamage, //0x88 Cmd_statbuffchange, //0x89 Cmd_normalisebuffs, //0x8A Cmd_setbide, //0x8B Cmd_confuseifrepeatingattackends, //0x8C Cmd_setmultihitcounter, //0x8D Cmd_initmultihitstring, //0x8E Cmd_forcerandomswitch, //0x8F Cmd_tryconversiontypechange, //0x90 Cmd_givepaydaymoney, //0x91 Cmd_setlightscreen, //0x92 Cmd_tryKO, //0x93 Cmd_damagetohalftargethp, //0x94 Cmd_setsandstorm, //0x95 Cmd_weatherdamage, //0x96 Cmd_tryinfatuating, //0x97 Cmd_updatestatusicon, //0x98 Cmd_setmist, //0x99 Cmd_setfocusenergy, //0x9A Cmd_transformdataexecution, //0x9B Cmd_setsubstitute, //0x9C Cmd_mimicattackcopy, //0x9D Cmd_metronome, //0x9E Cmd_dmgtolevel, //0x9F Cmd_psywavedamageeffect, //0xA0 Cmd_counterdamagecalculator, //0xA1 Cmd_mirrorcoatdamagecalculator, //0xA2 Cmd_disablelastusedattack, //0xA3 Cmd_trysetencore, //0xA4 Cmd_painsplitdmgcalc, //0xA5 Cmd_settypetorandomresistance, //0xA6 Cmd_setalwayshitflag, //0xA7 Cmd_copymovepermanently, //0xA8 Cmd_trychoosesleeptalkmove, //0xA9 Cmd_setdestinybond, //0xAA Cmd_trysetdestinybondtohappen, //0xAB Cmd_remaininghptopower, //0xAC Cmd_tryspiteppreduce, //0xAD Cmd_healpartystatus, //0xAE Cmd_cursetarget, //0xAF Cmd_trysetspikes, //0xB0 Cmd_setforesight, //0xB1 Cmd_trysetperishsong, //0xB2 Cmd_rolloutdamagecalculation, //0xB3 Cmd_jumpifconfusedandstatmaxed, //0xB4 Cmd_furycuttercalc, //0xB5 Cmd_friendshiptodamagecalculation, //0xB6 Cmd_presentdamagecalculation, //0xB7 Cmd_setsafeguard, //0xB8 Cmd_magnitudedamagecalculation, //0xB9 Cmd_jumpifnopursuitswitchdmg, //0xBA Cmd_setsunny, //0xBB Cmd_maxattackhalvehp, //0xBC Cmd_copyfoestats, //0xBD Cmd_rapidspinfree, //0xBE Cmd_setdefensecurlbit, //0xBF Cmd_recoverbasedonsunlight, //0xC0 Cmd_hiddenpowercalc, //0xC1 Cmd_selectfirstvalidtarget, //0xC2 Cmd_trysetfutureattack, //0xC3 Cmd_trydobeatup, //0xC4 Cmd_setsemiinvulnerablebit, //0xC5 Cmd_clearsemiinvulnerablebit, //0xC6 Cmd_setminimize, //0xC7 Cmd_sethail, //0xC8 Cmd_trymemento, //0xC9 Cmd_setforcedtarget, //0xCA Cmd_setcharge, //0xCB Cmd_callterrainattack, //0xCC Cmd_cureifburnedparalysedorpoisoned, //0xCD Cmd_settorment, //0xCE Cmd_jumpifnodamage, //0xCF Cmd_settaunt, //0xD0 Cmd_trysethelpinghand, //0xD1 Cmd_tryswapitems, //0xD2 Cmd_trycopyability, //0xD3 Cmd_trywish, //0xD4 Cmd_trysetroots, //0xD5 Cmd_doubledamagedealtifdamaged, //0xD6 Cmd_setyawn, //0xD7 Cmd_setdamagetohealthdifference, //0xD8 Cmd_scaledamagebyhealthratio, //0xD9 Cmd_tryswapabilities, //0xDA Cmd_tryimprison, //0xDB Cmd_trysetgrudge, //0xDC Cmd_weightdamagecalculation, //0xDD Cmd_assistattackselect, //0xDE Cmd_trysetmagiccoat, //0xDF Cmd_trysetsnatch, //0xE0 Cmd_trygetintimidatetarget, //0xE1 Cmd_switchoutabilities, //0xE2 Cmd_jumpifhasnohp, //0xE3 Cmd_getsecretpowereffect, //0xE4 Cmd_pickup, //0xE5 Cmd_docastformchangeanimation, //0xE6 Cmd_trycastformdatachange, //0xE7 Cmd_settypebasedhalvers, //0xE8 Cmd_setweatherballtype, //0xE9 Cmd_tryrecycleitem, //0xEA Cmd_settypetoterrain, //0xEB Cmd_pursuitdoubles, //0xEC Cmd_snatchsetbattlers, //0xED Cmd_removelightscreenreflect, //0xEE Cmd_handleballthrow, //0xEF Cmd_givecaughtmon, //0xF0 Cmd_trysetcaughtmondexflags, //0xF1 Cmd_displaydexinfo, //0xF2 Cmd_trygivecaughtmonnick, //0xF3 Cmd_subattackerhpbydmg, //0xF4 Cmd_removeattackerstatus1, //0xF5 Cmd_finishaction, //0xF6 Cmd_finishturn, //0xF7 }; struct StatFractions { u8 dividend; u8 divisor; }; static const struct StatFractions sAccuracyStageRatios[] = { { 33, 100}, // -6 { 36, 100}, // -5 { 43, 100}, // -4 { 50, 100}, // -3 { 60, 100}, // -2 { 75, 100}, // -1 { 1, 1}, // 0 {133, 100}, // +1 {166, 100}, // +2 { 2, 1}, // +3 {233, 100}, // +4 {133, 50}, // +5 { 3, 1}, // +6 }; // The chance is 1/N for each stage. static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2}; static const u32 sStatusFlagsForMoveEffects[NUM_MOVE_EFFECTS] = { [MOVE_EFFECT_SLEEP] = STATUS1_SLEEP, [MOVE_EFFECT_POISON] = STATUS1_POISON, [MOVE_EFFECT_BURN] = STATUS1_BURN, [MOVE_EFFECT_FREEZE] = STATUS1_FREEZE, [MOVE_EFFECT_PARALYSIS] = STATUS1_PARALYSIS, [MOVE_EFFECT_TOXIC] = STATUS1_TOXIC_POISON, [MOVE_EFFECT_CONFUSION] = STATUS2_CONFUSION, [MOVE_EFFECT_FLINCH] = STATUS2_FLINCHED, [MOVE_EFFECT_UPROAR] = STATUS2_UPROAR, [MOVE_EFFECT_CHARGING] = STATUS2_MULTIPLETURNS, [MOVE_EFFECT_WRAP] = STATUS2_WRAPPED, [MOVE_EFFECT_RECHARGE] = STATUS2_RECHARGE, [MOVE_EFFECT_PREVENT_ESCAPE] = STATUS2_ESCAPE_PREVENTION, [MOVE_EFFECT_NIGHTMARE] = STATUS2_NIGHTMARE, [MOVE_EFFECT_THRASH] = STATUS2_LOCK_CONFUSE, }; static const u8 *const sMoveEffectBS_Ptrs[] = { [0] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_SLEEP] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_POISON] = BattleScript_MoveEffectPoison, [MOVE_EFFECT_BURN] = BattleScript_MoveEffectBurn, [MOVE_EFFECT_FREEZE] = BattleScript_MoveEffectFreeze, [MOVE_EFFECT_PARALYSIS] = BattleScript_MoveEffectParalysis, [MOVE_EFFECT_TOXIC] = BattleScript_MoveEffectToxic, [MOVE_EFFECT_CONFUSION] = BattleScript_MoveEffectConfusion, [MOVE_EFFECT_FLINCH] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_TRI_ATTACK] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_UPROAR] = BattleScript_MoveEffectUproar, [MOVE_EFFECT_PAYDAY] = BattleScript_MoveEffectPayDay, [MOVE_EFFECT_CHARGING] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_WRAP] = BattleScript_MoveEffectWrap, [MOVE_EFFECT_RECOIL_25] = BattleScript_MoveEffectRecoil, [MOVE_EFFECT_ATK_PLUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_DEF_PLUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_SPD_PLUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_SP_ATK_PLUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_SP_DEF_PLUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_ACC_PLUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_EVS_PLUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_ATK_MINUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_DEF_MINUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_SPD_MINUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_SP_ATK_MINUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_SP_DEF_MINUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_ACC_MINUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_EVS_MINUS_1] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_RECHARGE] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_RAGE] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_STEAL_ITEM] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_PREVENT_ESCAPE] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_NIGHTMARE] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_ALL_STATS_UP] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_RAPIDSPIN] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_REMOVE_PARALYSIS] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_ATK_DEF_DOWN] = BattleScript_MoveEffectSleep, [MOVE_EFFECT_RECOIL_33] = BattleScript_MoveEffectRecoil, }; static const struct WindowTemplate sUnusedWinTemplate = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 3, .width = 7, .height = 15, .paletteNum = 31, .baseBlock = 0x3F }; static const u16 sLevelUpBanner_Pal[] = INCBIN_U16("graphics/battle_interface/level_up_banner.gbapal"); static const u32 sLevelUpBanner_Gfx[] = INCBIN_U32("graphics/battle_interface/level_up_banner.4bpp.lz"); // unused static const u8 sRubyLevelUpStatBoxStats[] = { MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED }; static const struct OamData sOamData_MonIconOnLvlUpBanner = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(32x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 0, .paletteNum = 0, .affineParam = 0, }; static const struct SpriteTemplate sSpriteTemplate_MonIconOnLvlUpBanner = { .tileTag = TAG_LVLUP_BANNER_MON_ICON, .paletteTag = TAG_LVLUP_BANNER_MON_ICON, .oam = &sOamData_MonIconOnLvlUpBanner, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_MonIconOnLvlUpBanner }; static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / 4, USHRT_MAX / 8}; #define MIMIC_FORBIDDEN_END 0xFFFE #define METRONOME_FORBIDDEN_END 0xFFFF #define ASSIST_FORBIDDEN_END 0xFFFF static const u16 sMovesForbiddenToCopy[] = { MOVE_METRONOME, MOVE_STRUGGLE, MOVE_SKETCH, MOVE_MIMIC, MIMIC_FORBIDDEN_END, MOVE_COUNTER, MOVE_MIRROR_COAT, MOVE_PROTECT, MOVE_DETECT, MOVE_ENDURE, MOVE_DESTINY_BOND, MOVE_SLEEP_TALK, MOVE_THIEF, MOVE_FOLLOW_ME, MOVE_SNATCH, MOVE_HELPING_HAND, MOVE_COVET, MOVE_TRICK, MOVE_FOCUS_PUNCH, METRONOME_FORBIDDEN_END }; static const u8 sFlailHpScaleToPowerTable[] = { 1, 200, 4, 150, 9, 100, 16, 80, 32, 40, 48, 20 }; const u16 gNaturePowerMoves[] = { [BATTLE_TERRAIN_GRASS] = MOVE_STUN_SPORE, [BATTLE_TERRAIN_LONG_GRASS] = MOVE_RAZOR_LEAF, [BATTLE_TERRAIN_SAND] = MOVE_EARTHQUAKE, [BATTLE_TERRAIN_UNDERWATER] = MOVE_HYDRO_PUMP, [BATTLE_TERRAIN_WATER] = MOVE_SURF, [BATTLE_TERRAIN_POND] = MOVE_BUBBLE_BEAM, [BATTLE_TERRAIN_MOUNTAIN] = MOVE_ROCK_SLIDE, [BATTLE_TERRAIN_CAVE] = MOVE_SHADOW_BALL, [BATTLE_TERRAIN_BUILDING] = MOVE_SWIFT, [BATTLE_TERRAIN_PLAIN] = MOVE_SWIFT }; // format: min. weight (hectograms), base power static const u16 sWeightToDamageTable[] = { 100, 20, 250, 40, 500, 60, 1000, 80, 2000, 100, 0xFFFF, 0xFFFF }; struct PickupItem { u16 itemId; u8 chance; }; static const struct PickupItem sPickupItems[] = { { ITEM_ORAN_BERRY, 15 }, { ITEM_CHERI_BERRY, 25 }, { ITEM_CHESTO_BERRY, 35 }, { ITEM_PECHA_BERRY, 45 }, { ITEM_RAWST_BERRY, 55 }, { ITEM_ASPEAR_BERRY, 65 }, { ITEM_PERSIM_BERRY, 75 }, { ITEM_PP_UP, 80 }, { ITEM_RARE_CANDY, 85 }, { ITEM_NUGGET, 90 }, { ITEM_POMEG_BERRY, 95 }, { ITEM_KELPSY_BERRY, 96 }, { ITEM_QUALOT_BERRY, 97 }, { ITEM_HONDEW_BERRY, 98 }, { ITEM_GREPA_BERRY, 99 }, { ITEM_TAMATO_BERRY, 1 }, }; static const u8 sTerrainToType[] = { [BATTLE_TERRAIN_GRASS] = TYPE_GRASS, [BATTLE_TERRAIN_LONG_GRASS] = TYPE_GRASS, [BATTLE_TERRAIN_SAND] = TYPE_GROUND, [BATTLE_TERRAIN_UNDERWATER] = TYPE_WATER, [BATTLE_TERRAIN_WATER] = TYPE_WATER, [BATTLE_TERRAIN_POND] = TYPE_WATER, [BATTLE_TERRAIN_MOUNTAIN] = TYPE_ROCK, [BATTLE_TERRAIN_CAVE] = TYPE_ROCK, [BATTLE_TERRAIN_BUILDING] = TYPE_NORMAL, [BATTLE_TERRAIN_PLAIN] = TYPE_NORMAL, }; // - ITEM_ULTRA_BALL skips Master Ball and ITEM_NONE static const u8 sBallCatchBonuses[] = { [ITEM_ULTRA_BALL - ITEM_ULTRA_BALL] = 20, [ITEM_GREAT_BALL - ITEM_ULTRA_BALL] = 15, [ITEM_POKE_BALL - ITEM_ULTRA_BALL] = 10, [ITEM_SAFARI_BALL - ITEM_ULTRA_BALL] = 15 }; // unknown unused data static const u32 sUnused = 0xFF7EAE60; static void Cmd_attackcanceler(void) { s32 i; if (gBattleOutcome != 0) { gCurrentActionFuncId = B_ACTION_FINISHED; return; } if (gBattleMons[gBattlerAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveEnd; return; } if (AtkCanceller_UnableToUseMove()) return; if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0)) return; if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & (HITMARKER_ALLOW_NO_PP | HITMARKER_NO_ATTACKSTRING)) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) { gBattlescriptCurrInstr = BattleScript_NoPPForMove; gMoveResultFlags |= MOVE_RESULT_MISSED; return; } gHitMarker &= ~HITMARKER_ALLOW_NO_PP; if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) { i = IsMonDisobedient(); // why use the 'i' variable...? switch (i) { case 0: break; case 2: gHitMarker |= HITMARKER_OBEYS; return; default: gMoveResultFlags |= MOVE_RESULT_MISSED; return; } } gHitMarker |= HITMARKER_OBEYS; if (gProtectStructs[gBattlerTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGIC_COAT_AFFECTED) { PressurePPLose(gBattlerAttacker, gBattlerTarget, MOVE_MAGIC_COAT); gProtectStructs[gBattlerTarget].bounceMove = FALSE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; return; } for (i = 0; i < gBattlersCount; i++) { if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) { PressurePPLose(gBattlerAttacker, gBattlerByTurnOrder[i], MOVE_SNATCH); gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE; gBattleScripting.battler = gBattlerByTurnOrder[i]; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SnatchedMove; return; } } if (gSpecialStatuses[gBattlerTarget].lightningRodRedirected) { gSpecialStatuses[gBattlerTarget].lightningRodRedirected = FALSE; gLastUsedAbility = ABILITY_LIGHTNING_ROD; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_TookAttack; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else if (DEFENDER_IS_PROTECTED && (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)))) { CancelMultiTurnMoves(gBattlerAttacker); gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; gBattlescriptCurrInstr++; } else { gBattlescriptCurrInstr++; } } static void JumpIfMoveFailed(u8 adder, u16 move) { const u8 *BS_ptr = gBattlescriptCurrInstr + adder; if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { TrySetDestinyBondToHappen(); if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, move)) return; } gBattlescriptCurrInstr = BS_ptr; } static void Cmd_jumpifaffectedbyprotect(void) { if (DEFENDER_IS_PROTECTED) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(5, 0); gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; } else { gBattlescriptCurrInstr += 5; } } static bool8 JumpIfMoveAffectedByProtect(u16 move) { bool8 affected = FALSE; if (DEFENDER_IS_PROTECTED) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; affected = TRUE; } return affected; } static bool8 AccuracyCalcHelper(u16 move) { if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) { JumpIfMoveFailed(7, move); return TRUE; } if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); return TRUE; } gHitMarker &= ~HITMARKER_IGNORE_ON_AIR; if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); return TRUE; } gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND; if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); return TRUE; } gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; if ((WEATHER_HAS_EFFECT && (gBattleWeather & B_WEATHER_RAIN) && gBattleMoves[move].effect == EFFECT_THUNDER) || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) { JumpIfMoveFailed(7, move); return TRUE; } return FALSE; } static void Cmd_accuracycheck(void) { u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); if ((gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && !BtlCtrl_OakOldMan_TestState2Flag(1) && gBattleMoves[move].power != 0 && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) || (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && !BtlCtrl_OakOldMan_TestState2Flag(2) && gBattleMoves[move].power == 0 && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) || (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)) { JumpIfMoveFailed(7, move); return; } if (move == NO_ACC_CALC || move == NO_ACC_CALC_CHECK_LOCK_ON) { if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && move == NO_ACC_CALC_CHECK_LOCK_ON && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) gBattlescriptCurrInstr += 7; else if (gStatuses3[gBattlerTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else if (!JumpIfMoveAffectedByProtect(0)) gBattlescriptCurrInstr += 7; } else { u8 type, moveAcc, holdEffect, param; s8 buff; u16 calc; if (move == ACC_CURR_MOVE) move = gCurrentMove; GET_MOVE_TYPE(move, type); if (JumpIfMoveAffectedByProtect(move)) return; if (AccuracyCalcHelper(move)) return; if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) { u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; buff = acc; } else { u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; buff = acc + DEFAULT_STAT_STAGE - gBattleMons[gBattlerTarget].statStages[STAT_EVASION]; } if (buff < MIN_STAT_STAGE) buff = MIN_STAT_STAGE; if (buff > MAX_STAT_STAGE) buff = MAX_STAT_STAGE; moveAcc = gBattleMoves[move].accuracy; // check Thunder on sunny weather if (WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_SUN && gBattleMoves[move].effect == EFFECT_THUNDER) moveAcc = 50; calc = sAccuracyStageRatios[buff].dividend * moveAcc; calc /= sAccuracyStageRatios[buff].divisor; if (gBattleMons[gBattlerAttacker].ability == ABILITY_COMPOUND_EYES) calc = (calc * 130) / 100; // 1.3 compound eyes boost if (WEATHER_HAS_EFFECT && gBattleMons[gBattlerTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & B_WEATHER_SANDSTORM) calc = (calc * 80) / 100; // 1.2 sand veil loss if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && IS_TYPE_PHYSICAL(type)) calc = (calc * 80) / 100; // 1.2 hustle loss if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) { holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; param = gEnigmaBerries[gBattlerTarget].holdEffectParam; } else { holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; if (holdEffect == HOLD_EFFECT_EVASION_UP) calc = (calc * (100 - param)) / 100; // final calculation if ((Random() % 100 + 1) > calc) { gMoveResultFlags |= MOVE_RESULT_MISSED; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && (gBattleMoves[move].target == MOVE_TARGET_BOTH || gBattleMoves[move].target == MOVE_TARGET_FOES_AND_ALLY)) gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_ATK; else gBattleCommunication[MISS_TYPE] = B_MSG_MISSED; CheckWonderGuardAndLevitate(); } JumpIfMoveFailed(7, move); } } static void Cmd_attackstring(void) { if (gBattleControllerExecFlags) return; if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED))) { PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker); gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; } gBattlescriptCurrInstr++; gBattleCommunication[MSG_DISPLAY] = 0; } static void Cmd_ppreduce(void) { s32 ppToDeduct = 1; if (gBattleControllerExecFlags) return; if (!gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure) { switch (gBattleMoves[gCurrentMove].target) { case MOVE_TARGET_FOES_AND_ALLY: ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBattlerAttacker, ABILITY_PRESSURE, 0, 0); break; case MOVE_TARGET_BOTH: case MOVE_TARGET_OPPONENTS_FIELD: ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_PRESSURE, 0, 0); break; default: if (gBattlerAttacker != gBattlerTarget && gBattleMons[gBattlerTarget].ability == ABILITY_PRESSURE) ppToDeduct++; break; } } if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBattlerAttacker].pp[gCurrMovePos]) { gProtectStructs[gBattlerAttacker].notFirstStrike = 1; if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] > ppToDeduct) gBattleMons[gBattlerAttacker].pp[gCurrMovePos] -= ppToDeduct; else gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 0; if (MOVE_IS_PERMANENT(gBattlerAttacker, gCurrMovePos)) { gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, sizeof(gBattleMons[gBattlerAttacker].pp[gCurrMovePos]), &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]); MarkBattlerForControllerExec(gBattlerAttacker); } } gHitMarker &= ~HITMARKER_NO_PPDEDUCT; gBattlescriptCurrInstr++; } static void Cmd_critcalc(void) { u8 holdEffect; u16 item, critChance; item = gBattleMons[gBattlerAttacker].item; if (item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gBattlerAttacker].holdEffect; else holdEffect = ItemId_GetHoldEffect(item); gPotentialItemEffectBattler = gBattlerAttacker; critChance = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0) + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL) + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK) + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK) + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL) + (holdEffect == HOLD_EFFECT_SCOPE_LENS) + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBattlerAttacker].species == SPECIES_CHANSEY) + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBattlerAttacker].species == SPECIES_FARFETCHD); if (critChance >= ARRAY_COUNT(sCriticalHitChance)) critChance = ARRAY_COUNT(sCriticalHitChance) - 1; if ((gBattleMons[gBattlerTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBattlerTarget].ability != ABILITY_SHELL_ARMOR) && !(gStatuses3[gBattlerAttacker] & STATUS3_CANT_SCORE_A_CRIT) && !(gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL) && !(Random() % sCriticalHitChance[critChance]) && (!(gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) || BtlCtrl_OakOldMan_TestState2Flag(1)) && !(gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)) gCritMultiplier = 2; else gCritMultiplier = 1; gBattlescriptCurrInstr++; } static void Cmd_damagecalc(void) { u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)]; gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, sideStatus, gDynamicBasePower, gBattleStruct->dynamicMoveType, gBattlerAttacker, gBattlerTarget); gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier; if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) gBattleMoveDamage *= 2; if (gProtectStructs[gBattlerAttacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; gBattlescriptCurrInstr++; } void AI_CalcDmg(u8 attacker, u8 defender) { u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(defender)]; gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[attacker], &gBattleMons[defender], gCurrentMove, sideStatus, gDynamicBasePower, gBattleStruct->dynamicMoveType, attacker, defender); gDynamicBasePower = 0; gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier; if (gStatuses3[attacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) gBattleMoveDamage *= 2; if (gProtectStructs[attacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; } static void ModulateDmgByType(u8 multiplier) { gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; if (gBattleMoveDamage == 0 && multiplier != 0) gBattleMoveDamage = 1; switch (multiplier) { case TYPE_MUL_NO_EFFECT: gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; break; case TYPE_MUL_NOT_EFFECTIVE: if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; else gMoveResultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; } break; case TYPE_MUL_SUPER_EFFECTIVE: if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; else gMoveResultFlags |= MOVE_RESULT_SUPER_EFFECTIVE; } break; } } static void Cmd_typecalc(void) { s32 i = 0; u8 moveType; if (gCurrentMove == MOVE_STRUGGLE) { gBattlescriptCurrInstr++; return; } GET_MOVE_TYPE(gCurrentMove, moveType); // check stab if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType)) { gBattleMoveDamage = gBattleMoveDamage * 15; gBattleMoveDamage = gBattleMoveDamage / 10; } if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) { gLastUsedAbility = gBattleMons[gBattlerTarget].ability; gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else { while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) { if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) { if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) break; i += 3; continue; } else if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check type1 if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1) ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i)); // check type2 if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2) ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i)); } i += 3; } } if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2 && (!(gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || ((gMoveResultFlags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) && gBattleMoves[gCurrentMove].power) { gLastUsedAbility = ABILITY_WONDER_GUARD; gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) gProtectStructs[gBattlerAttacker].targetNotAffected = 1; gBattlescriptCurrInstr++; } static void CheckWonderGuardAndLevitate(void) { u8 flags = 0; s32 i = 0; u8 moveType; if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power) return; GET_MOVE_TYPE(gCurrentMove, moveType); if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) { gLastUsedAbility = ABILITY_LEVITATE; gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; RecordAbilityBattle(gBattlerTarget, ABILITY_LEVITATE); return; } while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) { if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) { if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) break; i += 3; continue; } if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check no effect if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) { gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; gProtectStructs[gBattlerAttacker].targetNotAffected = 1; } if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) { gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; gProtectStructs[gBattlerAttacker].targetNotAffected = 1; } // check super effective if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 20) flags |= 1; if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) flags |= 1; // check not very effective if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 5) flags |= 2; if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE) flags |= 2; } i += 3; } if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2) { if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power) { gLastUsedAbility = ABILITY_WONDER_GUARD; gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(gBattlerTarget, ABILITY_WONDER_GUARD); } } } // Same as ModulateDmgByType except different arguments static void ModulateDmgByType2(u8 multiplier, u16 move, u8 *flags) { gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; if (gBattleMoveDamage == 0 && multiplier != 0) gBattleMoveDamage = 1; switch (multiplier) { case TYPE_MUL_NO_EFFECT: *flags |= MOVE_RESULT_DOESNT_AFFECT_FOE; *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE; break; case TYPE_MUL_NOT_EFFECTIVE: if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT)) { if (*flags & MOVE_RESULT_SUPER_EFFECTIVE) *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE; else *flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; } break; case TYPE_MUL_SUPER_EFFECTIVE: if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT)) { if (*flags & MOVE_RESULT_NOT_VERY_EFFECTIVE) *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; else *flags |= MOVE_RESULT_SUPER_EFFECTIVE; } break; } } u8 TypeCalc(u16 move, u8 attacker, u8 defender) { s32 i = 0; u8 flags = 0; u8 moveType; if (move == MOVE_STRUGGLE) return 0; if(gBattleMoves[move].effect != EFFECT_HIDDEN_POWER) moveType = gBattleMoves[move].type; else { s32 typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0) | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1) | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2) | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3) | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4) | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5); u8 moveType = (15 * typeBits) / 63 + 1; if (moveType >= TYPE_MYSTERY) moveType++; moveType |= 0xC0; } // check stab if (IS_BATTLER_OF_TYPE(attacker, moveType)) { gBattleMoveDamage = gBattleMoveDamage * 15; gBattleMoveDamage = gBattleMoveDamage / 10; } if (gBattleMons[defender].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) { flags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); } else { while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) { if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) { if (gBattleMons[defender].status2 & STATUS2_FORESIGHT) break; i += 3; continue; } else if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check type1 if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type1) ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); // check type2 if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type2 && gBattleMons[defender].type1 != gBattleMons[defender].type2) ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); } i += 3; } } if (gBattleMons[defender].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_MISSED) && AttacksThisTurn(attacker, move) == 2 && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) && gBattleMoves[move].power) { flags |= MOVE_RESULT_MISSED; } return flags; } u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility) { s32 i = 0; u8 flags = 0; u8 type1 = gSpeciesInfo[targetSpecies].types[0], type2 = gSpeciesInfo[targetSpecies].types[1]; u8 moveType; if (move == MOVE_STRUGGLE) return 0; if(gBattleMoves[move].effect != EFFECT_HIDDEN_POWER) moveType = gBattleMoves[move].type; else { s32 typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0) | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1) | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2) | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3) | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4) | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5); u8 moveType = (15 * typeBits) / 63 + 1; if (moveType >= TYPE_MYSTERY) moveType++; moveType |= 0xC0; } if (targetAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND) { flags = MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE; } else { while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) { if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) { i += 3; continue; } if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check type1 if (TYPE_EFFECT_DEF_TYPE(i) == type1) ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); // check type2 if (TYPE_EFFECT_DEF_TYPE(i) == type2 && type1 != type2) ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); } i += 3; } } if (targetAbility == ABILITY_WONDER_GUARD && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) && gBattleMoves[move].power) flags |= MOVE_RESULT_DOESNT_AFFECT_FOE; return flags; } // Multiplies the damage by a random factor between 85% to 100% inclusive static inline void ApplyRandomDmgMultiplier(void) { u16 rand = Random(); u16 randPercent = 100 - (rand % 16); if (gBattleMoveDamage != 0) { gBattleMoveDamage *= randPercent; gBattleMoveDamage /= 100; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } } static void Unused_ApplyRandomDmgMultiplier(void) { ApplyRandomDmgMultiplier(); } static void Cmd_adjustnormaldamage(void) { u8 holdEffect, param; ApplyRandomDmgMultiplier(); if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) { holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; param = gEnigmaBerries[gBattlerTarget].holdEffectParam; } else { holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) { RecordItemEffectBattle(gBattlerTarget, holdEffect); gSpecialStatuses[gBattlerTarget].focusBanded = 1; } if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) && (gBattleMoves[gCurrentMove].effect == EFFECT_FALSE_SWIPE || gProtectStructs[gBattlerTarget].endured || gSpecialStatuses[gBattlerTarget].focusBanded) && gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; if (gProtectStructs[gBattlerTarget].endured) { gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; } else if (gSpecialStatuses[gBattlerTarget].focusBanded) { gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; gLastUsedItem = gBattleMons[gBattlerTarget].item; } } gBattlescriptCurrInstr++; } // The same as adjustnormaldamage except it doesn't check for false swipe move effect. static void Cmd_adjustnormaldamage2(void) { u8 holdEffect, param; ApplyRandomDmgMultiplier(); if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) { holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; param = gEnigmaBerries[gBattlerTarget].holdEffectParam; } else { holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) { RecordItemEffectBattle(gBattlerTarget, holdEffect); gSpecialStatuses[gBattlerTarget].focusBanded = 1; } if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) && (gProtectStructs[gBattlerTarget].endured || gSpecialStatuses[gBattlerTarget].focusBanded) && gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; if (gProtectStructs[gBattlerTarget].endured) { gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; } else if (gSpecialStatuses[gBattlerTarget].focusBanded) { gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; gLastUsedItem = gBattleMons[gBattlerTarget].item; } } gBattlescriptCurrInstr++; } static void Cmd_attackanimation(void) { if (gBattleControllerExecFlags) return; if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_Pausex20; gBattleScripting.animTurn++; gBattleScripting.animTargetsHit++; } else { if ((gBattleMoves[gCurrentMove].target & MOVE_TARGET_BOTH || gBattleMoves[gCurrentMove].target & MOVE_TARGET_FOES_AND_ALLY || gBattleMoves[gCurrentMove].target & MOVE_TARGET_DEPENDS) && gBattleScripting.animTargetsHit) { gBattlescriptCurrInstr++; return; } if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { gActiveBattler = gBattlerAttacker; BtlController_EmitMoveAnimation(BUFFER_A, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker]); gBattleScripting.animTurn++; gBattleScripting.animTargetsHit++; MarkBattlerForControllerExec(gBattlerAttacker); gBattlescriptCurrInstr++; } else { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_Pausex20; } } } static void Cmd_waitanimation(void) { if (gBattleControllerExecFlags == 0) gBattlescriptCurrInstr++; } static void Cmd_healthbarupdate(void) { if (gBattleControllerExecFlags) return; if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, gActiveBattler); } else { s16 healthValue; s32 currDmg = gBattleMoveDamage; s32 maxPossibleDmgValue = 10000; // not present in R/S, ensures that huge damage values don't change sign if (currDmg <= maxPossibleDmgValue) healthValue = currDmg; else healthValue = maxPossibleDmgValue; BtlController_EmitHealthBarUpdate(BUFFER_A, healthValue); MarkBattlerForControllerExec(gActiveBattler); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0) gBattleResults.playerMonWasDamaged = TRUE; } } gBattlescriptCurrInstr += 2; } static void Cmd_datahpupdate(void) { u32 moveType; if (gBattleControllerExecFlags) return; if (gBattleStruct->dynamicMoveType == 0) moveType = gBattleMoves[gCurrentMove].type; else if (!(gBattleStruct->dynamicMoveType & F_DYNAMIC_TYPE_1)) moveType = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; else moveType = gBattleMoves[gCurrentMove].type; if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage) { if (gSpecialStatuses[gActiveBattler].dmg == 0) gSpecialStatuses[gActiveBattler].dmg = gBattleMoveDamage; gDisableStructs[gActiveBattler].substituteHP -= gBattleMoveDamage; gHpDealt = gBattleMoveDamage; } else { if (gSpecialStatuses[gActiveBattler].dmg == 0) gSpecialStatuses[gActiveBattler].dmg = gDisableStructs[gActiveBattler].substituteHP; gHpDealt = gDisableStructs[gActiveBattler].substituteHP; gDisableStructs[gActiveBattler].substituteHP = 0; } // check substitute fading if (gDisableStructs[gActiveBattler].substituteHP == 0) { gBattlescriptCurrInstr += 2; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SubstituteFade; return; } } else { gHitMarker &= ~HITMARKER_IGNORE_SUBSTITUTE; if (gBattleMoveDamage < 0) // hp goes up { gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; if (gBattleMons[gActiveBattler].hp > gBattleMons[gActiveBattler].maxHP) gBattleMons[gActiveBattler].hp = gBattleMons[gActiveBattler].maxHP; } else // hp goes down { if (gHitMarker & HITMARKER_SKIP_DMG_TRACK) { gHitMarker &= ~HITMARKER_SKIP_DMG_TRACK; } else { gTakenDmg[gActiveBattler] += gBattleMoveDamage; if (gBattlescriptCurrInstr[1] == BS_TARGET) gTakenDmgByBattler[gActiveBattler] = gBattlerAttacker; else gTakenDmgByBattler[gActiveBattler] = gBattlerTarget; } if (gBattleMons[gActiveBattler].hp > gBattleMoveDamage) { gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; gHpDealt = gBattleMoveDamage; } else { gHpDealt = gBattleMons[gActiveBattler].hp; gBattleMons[gActiveBattler].hp = 0; } if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) gSpecialStatuses[gActiveBattler].dmg = gHpDealt; if (IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gCurrentMove != MOVE_PAIN_SPLIT) { gProtectStructs[gActiveBattler].physicalDmg = gHpDealt; gSpecialStatuses[gActiveBattler].physicalDmg = gHpDealt; if (gBattlescriptCurrInstr[1] == BS_TARGET) { gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerAttacker; gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerAttacker; } else { gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerTarget; gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerTarget; } } else if (!IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) { gProtectStructs[gActiveBattler].specialDmg = gHpDealt; gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt; if (gBattlescriptCurrInstr[1] == BS_TARGET) { gProtectStructs[gActiveBattler].specialBattlerId = gBattlerAttacker; gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerAttacker; } else { gProtectStructs[gActiveBattler].specialBattlerId = gBattlerTarget; gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerTarget; } } } gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); } } else { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gSpecialStatuses[gActiveBattler].dmg == 0) gSpecialStatuses[gActiveBattler].dmg = 0xFFFF; } gBattlescriptCurrInstr += 2; } static void Cmd_critmessage(void) { if (gBattleControllerExecFlags == 0) { if (gCritMultiplier == 2 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker); gBattleCommunication[MSG_DISPLAY] = 1; } gBattlescriptCurrInstr++; } } static void Cmd_effectivenesssound(void) { if (gBattleControllerExecFlags) return; gActiveBattler = gBattlerTarget; if (!(gMoveResultFlags & MOVE_RESULT_MISSED)) { switch (gMoveResultFlags & (u8)(~MOVE_RESULT_MISSED)) { case MOVE_RESULT_SUPER_EFFECTIVE: BtlController_EmitPlaySE(BUFFER_A, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); break; case MOVE_RESULT_NOT_VERY_EFFECTIVE: BtlController_EmitPlaySE(BUFFER_A, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); break; case MOVE_RESULT_DOESNT_AFFECT_FOE: case MOVE_RESULT_FAILED: // no sound break; case MOVE_RESULT_FOE_ENDURED: case MOVE_RESULT_ONE_HIT_KO: case MOVE_RESULT_FOE_HUNG_ON: default: if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) { BtlController_EmitPlaySE(BUFFER_A, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) { BtlController_EmitPlaySE(BUFFER_A, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) { BtlController_EmitPlaySE(BUFFER_A, SE_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } break; } } gBattlescriptCurrInstr++; } static void Cmd_resultmessage(void) { u32 stringId = 0; if (gBattleControllerExecFlags) return; if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK)) { stringId = gMissStringIds[gBattleCommunication[MISS_TYPE]]; gBattleCommunication[MSG_DISPLAY] = 1; } else { gBattleCommunication[MSG_DISPLAY] = 1; switch (gMoveResultFlags & (u8)(~MOVE_RESULT_MISSED)) { case MOVE_RESULT_SUPER_EFFECTIVE: stringId = STRINGID_SUPEREFFECTIVE; break; case MOVE_RESULT_NOT_VERY_EFFECTIVE: stringId = STRINGID_NOTVERYEFFECTIVE; break; case MOVE_RESULT_ONE_HIT_KO: stringId = STRINGID_ONEHITKO; break; case MOVE_RESULT_FOE_ENDURED: stringId = STRINGID_PKMNENDUREDHIT; break; case MOVE_RESULT_FAILED: stringId = STRINGID_BUTITFAILED; break; case MOVE_RESULT_DOESNT_AFFECT_FOE: stringId = STRINGID_ITDOESNTAFFECT; break; case MOVE_RESULT_FOE_HUNG_ON: gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_FocusBandActivates; return; default: if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) { stringId = STRINGID_ITDOESNTAFFECT; } else if (gMoveResultFlags & MOVE_RESULT_ONE_HIT_KO) { gMoveResultFlags &= ~MOVE_RESULT_ONE_HIT_KO; gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; return; } else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED) { gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EnduredMsg; return; } else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON) { gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_FocusBandActivates; return; } else if (gMoveResultFlags & MOVE_RESULT_FAILED) { stringId = STRINGID_BUTITFAILED; } else { gBattleCommunication[MSG_DISPLAY] = 0; } } } if (stringId) PrepareStringBattle(stringId, gBattlerAttacker); gBattlescriptCurrInstr++; } static void Cmd_printstring(void) { if (gBattleControllerExecFlags == 0) { u16 var = T2_READ_16(gBattlescriptCurrInstr + 1); PrepareStringBattle(var, gBattlerAttacker); gBattlescriptCurrInstr += 3; gBattleCommunication[MSG_DISPLAY] = 1; } } static void Cmd_printselectionstring(void) { gActiveBattler = gBattlerAttacker; BtlController_EmitPrintSelectionString(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; gBattleCommunication[MSG_DISPLAY] = 1; } static void Cmd_waitmessage(void) { if (gBattleControllerExecFlags == 0) { if (!gBattleCommunication[MSG_DISPLAY]) { gBattlescriptCurrInstr += 3; } else { u16 toWait = T2_READ_16(gBattlescriptCurrInstr + 1); if (++gPauseCounterBattle >= toWait || (gSaveBlock2Ptr->optionsBattleSceneOff && (JOY_NEW(A_BUTTON | B_BUTTON)))) { gPauseCounterBattle = 0; gBattlescriptCurrInstr += 3; gBattleCommunication[MSG_DISPLAY] = 0; } } } } static void Cmd_printfromtable(void) { if (gBattleControllerExecFlags == 0) { const u16 *ptr = (const u16 *) T1_READ_PTR(gBattlescriptCurrInstr + 1); ptr += gBattleCommunication[MULTISTRING_CHOOSER]; PrepareStringBattle(*ptr, gBattlerAttacker); gBattlescriptCurrInstr += 5; gBattleCommunication[MSG_DISPLAY] = 1; } } static void Cmd_printselectionstringfromtable(void) { if (gBattleControllerExecFlags == 0) { const u16 *ptr = (const u16 *) T1_READ_PTR(gBattlescriptCurrInstr + 1); ptr += gBattleCommunication[MULTISTRING_CHOOSER]; gActiveBattler = gBattlerAttacker; BtlController_EmitPrintSelectionString(BUFFER_A, *ptr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; gBattleCommunication[MSG_DISPLAY] = 1; } } u8 GetBattlerTurnOrderNum(u8 battlerId) { s32 i; for (i = 0; i < gBattlersCount; i++) { if (gBattlerByTurnOrder[i] == battlerId) break; } return i; } // Called INCREMENT_RESET_RETURN in Emerald which adds "gBattleCommunication[MOVE_EFFECT_BYTE] = 0;" before the return. #define INCREMENT_RETURN \ { \ gBattlescriptCurrInstr++; \ return; \ } void SetMoveEffect(bool8 primary, u8 certain) { bool32 statusChanged = FALSE; u8 affectsUser = 0; // 0x40 otherwise bool32 noSunCanFreeze = TRUE; if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_AFFECTS_USER) { gEffectBattler = gBattlerAttacker; // battlerId that effects get applied on gBattleCommunication[MOVE_EFFECT_BYTE] &= ~MOVE_EFFECT_AFFECTS_USER; affectsUser = MOVE_EFFECT_AFFECTS_USER; gBattleScripting.battler = gBattlerTarget; // theoretically the attacker } else { gEffectBattler = gBattlerTarget; gBattleScripting.battler = gBattlerAttacker; } if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE && gBattleCommunication[MOVE_EFFECT_BYTE] != 1 && GetBattlerSide(gEffectBattler) == B_SIDE_OPPONENT) INCREMENT_RETURN if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) INCREMENT_RETURN if (gSideStatuses[GET_BATTLER_SIDE(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) INCREMENT_RETURN if (gBattleMons[gEffectBattler].hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_PAYDAY && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_STEAL_ITEM) INCREMENT_RETURN if (gBattleMons[gEffectBattler].status2 & STATUS2_SUBSTITUTE && affectsUser != MOVE_EFFECT_AFFECTS_USER) INCREMENT_RETURN if (gBattleCommunication[MOVE_EFFECT_BYTE] <= PRIMARY_STATUS_MOVE_EFFECT) { switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) { case STATUS1_SLEEP: // check active uproar if (gBattleMons[gEffectBattler].ability != ABILITY_SOUNDPROOF) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR); gActiveBattler++) {} } else gActiveBattler = gBattlersCount; if (gBattleMons[gEffectBattler].status1) break; if (gActiveBattler != gBattlersCount) break; if (gBattleMons[gEffectBattler].ability == ABILITY_VITAL_SPIRIT) break; if (gBattleMons[gEffectBattler].ability == ABILITY_INSOMNIA) break; CancelMultiTurnMoves(gEffectBattler); statusChanged = TRUE; break; case STATUS1_POISON: if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } return; } if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; return; } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON)) break; if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) break; if (gBattleMons[gEffectBattler].status1) break; if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY) break; statusChanged = TRUE; break; case STATUS1_BURN: if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_WATER_VEIL; RecordAbilityBattle(gEffectBattler, ABILITY_WATER_VEIL); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } return; } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE) && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; return; } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)) break; if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL) break; if (gBattleMons[gEffectBattler].status1) break; statusChanged = TRUE; break; case STATUS1_FREEZE: if (WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_SUN) noSunCanFreeze = FALSE; if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ICE)) break; if (gBattleMons[gEffectBattler].status1) break; if (noSunCanFreeze == FALSE) break; if (gBattleMons[gEffectBattler].ability == ABILITY_MAGMA_ARMOR) break; CancelMultiTurnMoves(gEffectBattler); statusChanged = TRUE; break; case STATUS1_PARALYSIS: if (gBattleMons[gEffectBattler].ability == ABILITY_LIMBER) { if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN) { gLastUsedAbility = ABILITY_LIMBER; RecordAbilityBattle(gEffectBattler, ABILITY_LIMBER); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PRLZPrevention; if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } return; } else break; } if (gBattleMons[gEffectBattler].status1) break; statusChanged = TRUE; break; case STATUS1_TOXIC_POISON: if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } return; } if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; return; } if (gBattleMons[gEffectBattler].status1) break; if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) { if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY) break; // It's redundant, because at this point we know the status1 value is 0. gBattleMons[gEffectBattler].status1 &= ~STATUS1_TOXIC_POISON; gBattleMons[gEffectBattler].status1 &= ~STATUS1_POISON; statusChanged = TRUE; break; } else { gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; } break; } if (statusChanged == TRUE) { BattleScriptPush(gBattlescriptCurrInstr + 1); if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS1_SLEEP) gBattleMons[gEffectBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns else gBattleMons[gEffectBattler].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gActiveBattler = gEffectBattler; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1); MarkBattlerForControllerExec(gActiveBattler); if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED_BY_ABILITY; gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED; } // for synchronize if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_POISON || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_TOXIC || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_PARALYSIS || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN) { u8 *synchronizeEffect = &gBattleStruct->synchronizeMoveEffect; *synchronizeEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; } } else if (statusChanged == FALSE) { gBattlescriptCurrInstr++; } return; } else { if (gBattleMons[gEffectBattler].status2 & sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) { gBattlescriptCurrInstr++; } else { u8 side; switch (gBattleCommunication[MOVE_EFFECT_BYTE]) { case MOVE_EFFECT_CONFUSION: if (gBattleMons[gEffectBattler].ability == ABILITY_OWN_TEMPO || gBattleMons[gEffectBattler].status2 & STATUS2_CONFUSION) { gBattlescriptCurrInstr++; } else { gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; } break; case MOVE_EFFECT_FLINCH: if (gBattleMons[gEffectBattler].ability == ABILITY_INNER_FOCUS) { if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN) { gLastUsedAbility = ABILITY_INNER_FOCUS; RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS); gBattlescriptCurrInstr = BattleScript_FlinchPrevention; } else { gBattlescriptCurrInstr++; } } else { if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber) gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; gBattlescriptCurrInstr++; } break; case MOVE_EFFECT_UPROAR: if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR)) { gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gEffectBattler] = gCurrentMove; gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN((Random() & 3) + 2); // 2-5 turns BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; } else { gBattlescriptCurrInstr++; } break; case MOVE_EFFECT_PAYDAY: if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER) { u16 payday = gPaydayMoney; gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5); if (payday > gPaydayMoney) gPaydayMoney = 0xFFFF; } BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case MOVE_EFFECT_TRI_ATTACK: if (gBattleMons[gEffectBattler].status1) { gBattlescriptCurrInstr++; } else { gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; SetMoveEffect(FALSE, 0); } break; case MOVE_EFFECT_CHARGING: gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gEffectBattler] = gCurrentMove; gProtectStructs[gEffectBattler].chargingTurn = 1; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_WRAP: if (gBattleMons[gEffectBattler].status2 & STATUS2_WRAPPED) { gBattlescriptCurrInstr++; } else { gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED_TURN((Random() & 3) + 3); // 3-6 turns *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 0) = gCurrentMove; *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 1) = gCurrentMove >> 8; *(gBattleStruct->wrappedBy + gEffectBattler) = gBattlerAttacker; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; ; gBattleCommunication[MULTISTRING_CHOOSER]++) { if (gBattleCommunication[MULTISTRING_CHOOSER] >= NUM_TRAPPING_MOVES - 1) break; if (gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) break; } } break; case MOVE_EFFECT_RECOIL_25: // 25% recoil gBattleMoveDamage = (gHpDealt) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_DEF_PLUS_1: case MOVE_EFFECT_SPD_PLUS_1: case MOVE_EFFECT_SP_ATK_PLUS_1: case MOVE_EFFECT_SP_DEF_PLUS_1: case MOVE_EFFECT_ACC_PLUS_1: case MOVE_EFFECT_EVS_PLUS_1: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_PLUS_1 + 1, affectsUser, 0)) { gBattlescriptCurrInstr++; } else { gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; } break; case MOVE_EFFECT_ATK_MINUS_1: case MOVE_EFFECT_DEF_MINUS_1: case MOVE_EFFECT_SPD_MINUS_1: case MOVE_EFFECT_SP_ATK_MINUS_1: case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_MINUS_1 + 1, affectsUser, 0)) { gBattlescriptCurrInstr++; } else { gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; } break; case MOVE_EFFECT_ATK_PLUS_2: case MOVE_EFFECT_DEF_PLUS_2: case MOVE_EFFECT_SPD_PLUS_2: case MOVE_EFFECT_SP_ATK_PLUS_2: case MOVE_EFFECT_SP_DEF_PLUS_2: case MOVE_EFFECT_ACC_PLUS_2: case MOVE_EFFECT_EVS_PLUS_2: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2), gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_PLUS_2 + 1, affectsUser, 0)) { gBattlescriptCurrInstr++; } else { gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; } break; case MOVE_EFFECT_ATK_MINUS_2: case MOVE_EFFECT_DEF_MINUS_2: case MOVE_EFFECT_SPD_MINUS_2: case MOVE_EFFECT_SP_ATK_MINUS_2: case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_MINUS_2 + 1, affectsUser, 0)) { gBattlescriptCurrInstr++; } else { gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; } break; case MOVE_EFFECT_RECHARGE: gBattleMons[gEffectBattler].status2 |= STATUS2_RECHARGE; gDisableStructs[gEffectBattler].rechargeTimer = 2; gLockedMoves[gEffectBattler] = gCurrentMove; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_RAGE: gBattleMons[gBattlerAttacker].status2 |= STATUS2_RAGE; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_STEAL_ITEM: { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) { gBattlescriptCurrInstr++; break; } side = GetBattlerSide(gBattlerAttacker); if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE) { gBattlescriptCurrInstr++; } else if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE && (gWishFutureKnock.knockedOffMons[side] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]])) { gBattlescriptCurrInstr++; } else if (gBattleMons[gBattlerTarget].item && gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD) { gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; gLastUsedAbility = gBattleMons[gBattlerTarget].ability; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else if (gBattleMons[gBattlerAttacker].item != ITEM_NONE || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item) || gBattleMons[gBattlerTarget].item == ITEM_NONE) { gBattlescriptCurrInstr++; } else { u16 *changedItem = &gBattleStruct->changedItems[gBattlerAttacker]; gLastUsedItem = *changedItem = gBattleMons[gBattlerTarget].item; gBattleMons[gBattlerTarget].item = ITEM_NONE; gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); MarkBattlerForControllerExec(gBattlerAttacker); gActiveBattler = gBattlerTarget; BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_ItemSteal; *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0; } } break; case MOVE_EFFECT_PREVENT_ESCAPE: gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_NIGHTMARE: gBattleMons[gBattlerTarget].status2 |= STATUS2_NIGHTMARE; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_ALL_STATS_UP: BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AllStatsUp; break; case MOVE_EFFECT_RAPIDSPIN: BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_RapidSpinAway; break; case MOVE_EFFECT_REMOVE_PARALYSIS: // Smelling salts if (!(gBattleMons[gBattlerTarget].status1 & STATUS1_PARALYSIS)) { gBattlescriptCurrInstr++; } else { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_PARALYSIS; gActiveBattler = gBattlerTarget; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; } break; case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AtkDefDown; break; case MOVE_EFFECT_RECOIL_33: // Double Edge gBattleMoveDamage = gHpDealt / 3; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case MOVE_EFFECT_THRASH: if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE) { gBattlescriptCurrInstr++; } else { gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gEffectBattler] = gCurrentMove; gBattleMons[gEffectBattler].status2 |= STATUS2_LOCK_CONFUSE_TURN((Random() & 1) + 2); // thrash for 2-3 turns } break; case MOVE_EFFECT_KNOCK_OFF: if (gBattleMons[gEffectBattler].ability == ABILITY_STICKY_HOLD) { if (gBattleMons[gEffectBattler].item == ITEM_NONE) { gBattlescriptCurrInstr++; } else { gLastUsedAbility = ABILITY_STICKY_HOLD; gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; RecordAbilityBattle(gEffectBattler, ABILITY_STICKY_HOLD); } break; } if (gBattleMons[gEffectBattler].item) { side = GetBattlerSide(gEffectBattler); gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = ITEM_NONE; gWishFutureKnock.knockedOffMons[side] |= gBitTable[gBattlerPartyIndexes[gEffectBattler]]; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_KnockedOff; *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gEffectBattler]) + 0) = 0; *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gEffectBattler]) + 1) = 0; } else { gBattlescriptCurrInstr++; } break; case MOVE_EFFECT_SP_ATK_TWO_DOWN: // Overheat BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_SAtkDown2; break; } } } } static void Cmd_seteffectwithchance(void) { u32 percentChance; if (gBattleMons[gBattlerAttacker].ability == ABILITY_SERENE_GRACE) percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2; else percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance; if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_CERTAIN && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { gBattleCommunication[MOVE_EFFECT_BYTE] &= ~MOVE_EFFECT_CERTAIN; SetMoveEffect(FALSE, MOVE_EFFECT_CERTAIN); } else if (Random() % 100 <= percentChance && gBattleCommunication[MOVE_EFFECT_BYTE] && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { if (percentChance >= 100) SetMoveEffect(FALSE, MOVE_EFFECT_CERTAIN); else SetMoveEffect(FALSE, 0); } else { gBattlescriptCurrInstr++; } gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattleScripting.multihitMoveEffect = 0; } static void Cmd_seteffectprimary(void) { SetMoveEffect(TRUE, 0); } static void Cmd_seteffectsecondary(void) { SetMoveEffect(FALSE, 0); } static void Cmd_clearstatusfromeffect(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gBattleCommunication[MOVE_EFFECT_BYTE] <= PRIMARY_STATUS_MOVE_EFFECT) gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); else gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattlescriptCurrInstr += 2; gBattleScripting.multihitMoveEffect = 0; } static void Cmd_tryfaintmon(void) { const u8 *BS_ptr; if (gBattlescriptCurrInstr[2] != 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) { BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 3); BattleScriptPop(); gBattlescriptCurrInstr = BS_ptr; gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~SIDE_STATUS_SPIKES_DAMAGED; } else { gBattlescriptCurrInstr += 7; } } else { u8 battlerId; if (gBattlescriptCurrInstr[1] == BS_ATTACKER) { gActiveBattler = gBattlerAttacker; battlerId = gBattlerTarget; BS_ptr = BattleScript_FaintAttacker; } else { gActiveBattler = gBattlerTarget; battlerId = gBattlerAttacker; BS_ptr = BattleScript_FaintTarget; } if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]) && gBattleMons[gActiveBattler].hp == 0) { gHitMarker |= HITMARKER_FAINTED(gActiveBattler); BattleScriptPush(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr = BS_ptr; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { gHitMarker |= HITMARKER_PLAYER_FAINTED; if (gBattleResults.playerFaintCounter < 255) gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); } else { if (gBattleResults.opponentFaintCounter < 255) gBattleResults.opponentFaintCounter++; gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); *(u8 *)(&gBattleStruct->lastAttackerToFaintOpponent) = gBattlerAttacker; } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) { gHitMarker &= ~HITMARKER_DESTINYBOND; BattleScriptPush(gBattlescriptCurrInstr); gBattleMoveDamage = gBattleMons[battlerId].hp; gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; } if ((gStatuses3[gBattlerTarget] & STATUS3_GRUDGE) && !(gHitMarker & HITMARKER_GRUDGE) && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget) && gBattleMons[gBattlerAttacker].hp != 0 && gCurrentMove != MOVE_STRUGGLE) { u8 moveIndex = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); gBattleMons[gBattlerAttacker].pp[moveIndex] = 0; BattleScriptPush(gBattlescriptCurrInstr); gBattlescriptCurrInstr = BattleScript_GrudgeTakesPp; gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(BUFFER_A, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].pp[moveIndex]), &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) } } else { gBattlescriptCurrInstr += 7; } } } static void Cmd_dofaintanimation(void) { if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitFaintAnimation(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } } static void Cmd_cleareffectsonfaint(void) { if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); gBattleMons[gActiveBattler].status1 = 0; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); FaintClearSetData(); // Effects like attractions, trapping, etc. gBattlescriptCurrInstr += 2; } } static void Cmd_jumpifstatus(void) { u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); if (gBattleMons[battlerId].status1 & flags && gBattleMons[battlerId].hp != 0) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 10; } static void Cmd_jumpifstatus2(void) { u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); if (gBattleMons[battlerId].status2 & flags && gBattleMons[battlerId].hp != 0) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 10; } static void Cmd_jumpifability(void) { u8 battlerId; u8 ability = gBattlescriptCurrInstr[2]; const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); if (gBattlescriptCurrInstr[1] == BS_ATTACKER_SIDE) { battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_BATTLER_SIDE, gBattlerAttacker, ability, 0, 0); if (battlerId) { gLastUsedAbility = ability; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(battlerId - 1, gLastUsedAbility); gBattleScripting.battlerWithAbility = battlerId - 1; } else gBattlescriptCurrInstr += 7; } else if (gBattlescriptCurrInstr[1] == BS_NOT_ATTACKER_SIDE) { battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBattlerAttacker, ability, 0, 0); if (battlerId) { gLastUsedAbility = ability; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(battlerId - 1, gLastUsedAbility); gBattleScripting.battlerWithAbility = battlerId - 1; } else gBattlescriptCurrInstr += 7; } else { battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gBattleMons[battlerId].ability == ability) { gLastUsedAbility = ability; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(battlerId, gLastUsedAbility); gBattleScripting.battlerWithAbility = battlerId; } else gBattlescriptCurrInstr += 7; } } static void Cmd_jumpifsideaffecting(void) { u8 side; u16 flags; const u8 *jumpPtr; if (gBattlescriptCurrInstr[1] == BS_ATTACKER) side = GET_BATTLER_SIDE(gBattlerAttacker); else side = GET_BATTLER_SIDE(gBattlerTarget); flags = T2_READ_16(gBattlescriptCurrInstr + 2); jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 4); if (gSideStatuses[side] & flags) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 8; } static void Cmd_jumpifstat(void) { u8 ret = 0; u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); u8 value = gBattleMons[battlerId].statStages[gBattlescriptCurrInstr[3]]; switch (gBattlescriptCurrInstr[2]) { case CMP_EQUAL: if (value == gBattlescriptCurrInstr[4]) ret++; break; case CMP_NOT_EQUAL: if (value != gBattlescriptCurrInstr[4]) ret++; break; case CMP_GREATER_THAN: if (value > gBattlescriptCurrInstr[4]) ret++; break; case CMP_LESS_THAN: if (value < gBattlescriptCurrInstr[4]) ret++; break; case CMP_COMMON_BITS: if (value & gBattlescriptCurrInstr[4]) ret++; break; case CMP_NO_COMMON_BITS: if (!(value & gBattlescriptCurrInstr[4])) ret++; break; } if (ret) gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 5); else gBattlescriptCurrInstr += 9; } static void Cmd_jumpifstatus3condition(void) { u32 status; const u8 *jumpPtr; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); status = T2_READ_32(gBattlescriptCurrInstr + 2); jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 7); if (gBattlescriptCurrInstr[6]) { if ((gStatuses3[gActiveBattler] & status) != 0) gBattlescriptCurrInstr += 11; else gBattlescriptCurrInstr = jumpPtr; } else { if ((gStatuses3[gActiveBattler] & status) != 0) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 11; } } static void Cmd_jumpiftype(void) { u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); u8 type = gBattlescriptCurrInstr[2]; const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); if (IS_BATTLER_OF_TYPE(battlerId, type)) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 7; } static void Cmd_getexp(void) { u16 item; s32 i; // also used as stringId u8 holdEffect; s32 sentIn; s32 viaExpShare = 0; u16 *exp = &gBattleStruct->expValue; gBattlerFainted = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); sentIn = gSentPokesToOpponent[(gBattlerFainted & 2) >> 1]; switch (gBattleScripting.getexpState) { case 0: // check if should receive exp at all if (GetBattlerSide(gBattlerFainted) != B_SIDE_OPPONENT || (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_SAFARI | BATTLE_TYPE_EREADER_TRAINER))) { gBattleScripting.getexpState = 6; // goto last case } else { gBattleScripting.getexpState++; gBattleStruct->givenExpMons |= gBitTable[gBattlerPartyIndexes[gBattlerFainted]]; } break; case 1: // calculate experience points to redistribute { u16 calculatedExp; s32 viaSentIn; for (viaSentIn = 0, i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) continue; if (gBitTable[i] & sentIn) viaSentIn++; item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); if (item == ITEM_ENIGMA_BERRY) holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; else holdEffect = ItemId_GetHoldEffect(item); if (holdEffect == HOLD_EFFECT_EXP_SHARE) viaExpShare++; } calculatedExp = gSpeciesInfo[gBattleMons[gBattlerFainted].species].expYield * gBattleMons[gBattlerFainted].level / 7; switch(gSaveBlock1Ptr->keyFlags.expMod) { case 0: calculatedExp = 0; break; case 1: calculatedExp = calculatedExp / 2; if(calculatedExp == 0) calculatedExp = 1; break; case 3: calculatedExp = calculatedExp * 2; break; } if (viaExpShare) // at least one mon is getting exp via exp share { *exp = SAFE_DIV(calculatedExp / 2, viaSentIn); if (*exp == 0) *exp = 1; gExpShareExp = calculatedExp / 2 / viaExpShare; if (gExpShareExp == 0) gExpShareExp = 1; } else { *exp = SAFE_DIV(calculatedExp, viaSentIn); if (*exp == 0) *exp = 1; gExpShareExp = 0; } gBattleScripting.getexpState++; gBattleStruct->expGetterMonId = 0; gBattleStruct->sentInPokes = sentIn; } // fall through case 2: // set exp value to the poke in expgetter_id and print message if (gBattleControllerExecFlags == 0) { item = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HELD_ITEM); if (item == ITEM_ENIGMA_BERRY) holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; else holdEffect = ItemId_GetHoldEffect(item); if (holdEffect != HOLD_EFFECT_EXP_SHARE && !(gBattleStruct->sentInPokes & 1)) { *(&gBattleStruct->sentInPokes) >>= 1; gBattleScripting.getexpState = 5; gBattleMoveDamage = 0; // used for exp } else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) == MAX_LEVEL || gSaveBlock1Ptr->keyFlags.expMod == 0 || FlagGet(FLAG_MASTER_TRAINER_BATTLE)) { *(&gBattleStruct->sentInPokes) >>= 1; gBattleScripting.getexpState = 5; gBattleMoveDamage = 0; // used for exp if (!FlagGet(FLAG_MASTER_TRAINER_BATTLE) && gSaveBlock1Ptr->keyFlags.expMod == 0) { MonGainEVs(&gPlayerParty[gBattleStruct->expGetterMonId], gBattleMons[gBattlerFainted].species); } } else { // music change in wild battle after fainting a poke if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_POKEDUDE)) && gBattleMons[0].hp != 0 && !gBattleStruct->wildVictorySong) { BattleStopLowHpSound(); PlayBGM(MUS_VICTORY_WILD); gBattleStruct->wildVictorySong++; } if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP)) { if (gBattleStruct->sentInPokes & 1) gBattleMoveDamage = *exp; else gBattleMoveDamage = 0; if (holdEffect == HOLD_EFFECT_EXP_SHARE) gBattleMoveDamage += gExpShareExp; if (holdEffect == HOLD_EFFECT_LUCKY_EGG) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterMonId]) && !(gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)) { gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; i = STRINGID_ABOOSTED; } else { i = STRINGID_EMPTYSTRING4; } // get exp getter battlerId if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && !(gAbsentBattlerFlags & gBitTable[2])) gBattleStruct->expGetterBattlerId = 2; else { if (!(gAbsentBattlerFlags & gBitTable[0])) gBattleStruct->expGetterBattlerId = 0; else gBattleStruct->expGetterBattlerId = 2; } } else { gBattleStruct->expGetterBattlerId = 0; } PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBattlerId, gBattleStruct->expGetterMonId); // buffer 'gained' or 'gained a boosted' PREPARE_STRING_BUFFER(gBattleTextBuff2, i); PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage); PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBattlerId); MonGainEVs(&gPlayerParty[gBattleStruct->expGetterMonId], gBattleMons[gBattlerFainted].species); } gBattleStruct->sentInPokes >>= 1; gBattleScripting.getexpState++; } } break; case 3: // Set stats and give exp if (gBattleControllerExecFlags == 0) { gBattleBufferB[gBattleStruct->expGetterBattlerId][0] = 0; if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) != MAX_LEVEL) { gBattleResources->beforeLvlUp->stats[STAT_HP] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); gBattleResources->beforeLvlUp->stats[STAT_ATK] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK); gBattleResources->beforeLvlUp->stats[STAT_DEF] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF); gBattleResources->beforeLvlUp->stats[STAT_SPEED] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); gBattleResources->beforeLvlUp->stats[STAT_SPATK] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK); gBattleResources->beforeLvlUp->stats[STAT_SPDEF] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); gActiveBattler = gBattleStruct->expGetterBattlerId; BtlController_EmitExpUpdate(BUFFER_A, gBattleStruct->expGetterMonId, gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); } gBattleScripting.getexpState++; } break; case 4: // lvl up if necessary if (gBattleControllerExecFlags == 0) { gActiveBattler = gBattleStruct->expGetterBattlerId; if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELED_UP) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId) HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattleStruct->expGetterMonId); PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL)); BattleScriptPushCursor(); gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterMonId]; gBattlescriptCurrInstr = BattleScript_LevelUp; gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)); AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], FRIENDSHIP_EVENT_GROW_LEVEL); // update battle mon structure after level up if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && gBattleMons[0].hp) { gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL); gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP); gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK); gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF); // Speed is duplicated, likely due to a copy-paste error. gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK); gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); } // What is else if? if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL); gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP); gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK); gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF); gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); // Speed is duplicated again, but Special Defense is missing. #ifdef BUGFIX gBattleMons[2].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); #else gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); #endif gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK); } gBattleScripting.getexpState = 5; } else { gBattleMoveDamage = 0; gBattleScripting.getexpState = 5; } } break; case 5: // looper increment if (gBattleMoveDamage) // there is exp to give, goto case 3 that gives exp { gBattleScripting.getexpState = 3; } else { gBattleStruct->expGetterMonId++; if (gBattleStruct->expGetterMonId < PARTY_SIZE) gBattleScripting.getexpState = 2; // loop again else gBattleScripting.getexpState = 6; // we're done } break; case 6: // increment instruction if (gBattleControllerExecFlags == 0) { // not sure why gf clears the item and ability here gBattleMons[gBattlerFainted].item = ITEM_NONE; gBattleMons[gBattlerFainted].ability = ABILITY_NONE; gBattlescriptCurrInstr += 2; } break; } } // For battles that aren't BATTLE_TYPE_LINK, the only thing this // command does is check whether the player has won/lost by totaling each team's HP. It then // sets gBattleOutcome accordingly, if necessary. static void Cmd_checkteamslost(void) { u16 HP_count = 0; s32 i; if (gBattleControllerExecFlags) return; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) { HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); } } if (HP_count == 0) gBattleOutcome |= B_OUTCOME_LOST; HP_count = 0; // Get total HP for the enemy's party to determine if the player has won for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)) { HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); } } if (HP_count == 0) gBattleOutcome |= B_OUTCOME_WON; // For link battles that haven't ended, count number of empty battler spots // In link multi battles, jump to pointer if more than 1 spot empty // In non-multi battles, jump to pointer if 1 spot is missing on both sides if (gBattleOutcome == 0 && (gBattleTypeFlags & BATTLE_TYPE_LINK)) { s32 emptyPlayerSpots; s32 emptyOpponentSpots; for (emptyPlayerSpots = 0, i = 0; i < gBattlersCount; i += 2) { u32 *ptr = &gHitMarker; u32 hitMarkerUnk = 0x10000000; i++; --i; if ((hitMarkerUnk << i) & *ptr && !gSpecialStatuses[i].faintedHasReplacement) emptyPlayerSpots++; } for (emptyOpponentSpots = 0, i = 1; i < gBattlersCount; i += 2) { u32 *ptr = &gHitMarker; u32 hitMarkerUnk = 0x10000000; { u8 match; ++match; --match; } if ((hitMarkerUnk << i) & *ptr && !gSpecialStatuses[i].faintedHasReplacement) emptyOpponentSpots++; } if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (emptyOpponentSpots + emptyPlayerSpots > 1) gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } else { if (emptyOpponentSpots != 0 && emptyPlayerSpots != 0) gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } } else { gBattlescriptCurrInstr += 5; } } static void MoveValuesCleanUp(void) { gMoveResultFlags = 0; gBattleScripting.dmgMultiplier = 1; gCritMultiplier = 1; gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattleCommunication[MISS_TYPE] = 0; gHitMarker &= ~HITMARKER_DESTINYBOND; gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT; } static void Cmd_movevaluescleanup(void) { MoveValuesCleanUp(); gBattlescriptCurrInstr += 1; } static void Cmd_setmultihit(void) { gMultiHitCounter = gBattlescriptCurrInstr[1]; gBattlescriptCurrInstr += 2; } static void Cmd_decrementmultihit(void) { if (--gMultiHitCounter == 0) gBattlescriptCurrInstr += 5; else gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); } static void Cmd_goto(void) { gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); } static void Cmd_jumpifbyte(void) { u8 caseID = gBattlescriptCurrInstr[1]; const u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 2); u8 value = gBattlescriptCurrInstr[6]; const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr += 11; switch (caseID) { case CMP_EQUAL: if (*memByte == value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_NOT_EQUAL: if (*memByte != value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_GREATER_THAN: if (*memByte > value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_LESS_THAN: if (*memByte < value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_COMMON_BITS: if (*memByte & value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_NO_COMMON_BITS: if (!(*memByte & value)) gBattlescriptCurrInstr = jumpPtr; break; } } static void Cmd_jumpifhalfword(void) { u8 caseID = gBattlescriptCurrInstr[1]; const u16 *memHword = T2_READ_PTR(gBattlescriptCurrInstr + 2); u16 value = T2_READ_16(gBattlescriptCurrInstr + 6); const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 8); gBattlescriptCurrInstr += 12; switch (caseID) { case CMP_EQUAL: if (*memHword == value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_NOT_EQUAL: if (*memHword != value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_GREATER_THAN: if (*memHword > value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_LESS_THAN: if (*memHword < value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_COMMON_BITS: if (*memHword & value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_NO_COMMON_BITS: if (!(*memHword & value)) gBattlescriptCurrInstr = jumpPtr; break; } } static void Cmd_jumpifword(void) { u8 caseID = gBattlescriptCurrInstr[1]; const u32 *memWord = T2_READ_PTR(gBattlescriptCurrInstr + 2); u32 value = T1_READ_32(gBattlescriptCurrInstr + 6); const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10); gBattlescriptCurrInstr += 14; switch (caseID) { case CMP_EQUAL: if (*memWord == value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_NOT_EQUAL: if (*memWord != value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_GREATER_THAN: if (*memWord > value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_LESS_THAN: if (*memWord < value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_COMMON_BITS: if (*memWord & value) gBattlescriptCurrInstr = jumpPtr; break; case CMP_NO_COMMON_BITS: if (!(*memWord & value)) gBattlescriptCurrInstr = jumpPtr; break; } } static void Cmd_jumpifarrayequal(void) { const u8 *mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); const u8 *mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); u32 size = gBattlescriptCurrInstr[9]; const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10); u32 i; for (i = 0; i < size; i++) { if (*mem1 != *mem2) { gBattlescriptCurrInstr += 14; break; } mem1++, mem2++; } if (i == size) gBattlescriptCurrInstr = jumpPtr; } static void Cmd_jumpifarraynotequal(void) { u8 equalBytes = 0; const u8 *mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); const u8 *mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); u32 size = gBattlescriptCurrInstr[9]; const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10); u32 i; for (i = 0; i < size; i++) { if (*mem1 == *mem2) equalBytes++; mem1++, mem2++; } if (equalBytes != size) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 14; } static void Cmd_setbyte(void) { u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte = gBattlescriptCurrInstr[5]; gBattlescriptCurrInstr += 6; } static void Cmd_addbyte(void) { u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte += gBattlescriptCurrInstr[5]; gBattlescriptCurrInstr += 6; } static void Cmd_subbyte(void) { u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte -= gBattlescriptCurrInstr[5]; gBattlescriptCurrInstr += 6; } static void Cmd_copyarray(void) { u8 *dest = T2_READ_PTR(gBattlescriptCurrInstr + 1); const u8 *src = T2_READ_PTR(gBattlescriptCurrInstr + 5); s32 size = gBattlescriptCurrInstr[9]; s32 i; for (i = 0; i < size; i++) dest[i] = src[i]; gBattlescriptCurrInstr += 10; } static void Cmd_copyarraywithindex(void) { u8 *dest = T2_READ_PTR(gBattlescriptCurrInstr + 1); const u8 *src = T2_READ_PTR(gBattlescriptCurrInstr + 5); const u8 *index = T2_READ_PTR(gBattlescriptCurrInstr + 9); s32 size = gBattlescriptCurrInstr[13]; s32 i; for (i = 0; i < size; i++) dest[i] = src[i + *index]; gBattlescriptCurrInstr += 14; } static void Cmd_orbyte(void) { u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte |= gBattlescriptCurrInstr[5]; gBattlescriptCurrInstr += 6; } static void Cmd_orhalfword(void) { u16 *memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1); u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); *memHword |= val; gBattlescriptCurrInstr += 7; } static void Cmd_orword(void) { u32 *memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1); u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); *memWord |= val; gBattlescriptCurrInstr += 9; } static void Cmd_bicbyte(void) { u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1); *memByte &= ~(gBattlescriptCurrInstr[5]); gBattlescriptCurrInstr += 6; } static void Cmd_bichalfword(void) { u16 *memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1); u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); *memHword &= ~val; gBattlescriptCurrInstr += 7; } static void Cmd_bicword(void) { u32 *memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1); u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); *memWord &= ~val; gBattlescriptCurrInstr += 9; } static void Cmd_pause(void) { if (gBattleControllerExecFlags == 0) { u16 value = T2_READ_16(gBattlescriptCurrInstr + 1); bool32 isGhostPause = FALSE; if(value == B_WAIT_TIME_SHORT_UNSKIPPABLE) { isGhostPause = TRUE; value = B_WAIT_TIME_SHORT; } // can't skip Ghost revealed pause if (++gPauseCounterBattle >= value || (gSaveBlock2Ptr->optionsBattleSceneOff && !isGhostPause && (JOY_NEW(A_BUTTON | B_BUTTON)))) { gPauseCounterBattle = 0; gBattlescriptCurrInstr += 3; } } } static void Cmd_waitstate(void) { if (gBattleControllerExecFlags == 0) gBattlescriptCurrInstr++; } static void Cmd_healthbar_update(void) { if (gBattlescriptCurrInstr[1] == BS_TARGET) gActiveBattler = gBattlerTarget; else gActiveBattler = gBattlerAttacker; BtlController_EmitHealthBarUpdate(BUFFER_A, gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } static void Cmd_return(void) { BattleScriptPop(); } static void Cmd_end(void) { gMoveResultFlags = 0; gActiveBattler = 0; gCurrentActionFuncId = B_ACTION_TRY_FINISH; } static void Cmd_end2(void) { gActiveBattler = 0; gCurrentActionFuncId = B_ACTION_TRY_FINISH; } // Pops the main function stack static void Cmd_end3(void) { BattleScriptPop(); if (gBattleResources->battleCallbackStack->size != 0) gBattleResources->battleCallbackStack->size--; gBattleMainFunc = gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size]; } static void Cmd_call(void) { BattleScriptPush(gBattlescriptCurrInstr + 5); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void Cmd_jumpiftype2(void) { u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type1 || gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type2) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else gBattlescriptCurrInstr += 7; } static void Cmd_jumpifabilitypresent(void) { if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, gBattlescriptCurrInstr[1], 0, 0)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } static void Cmd_endselectionscript(void) { *(gBattlerAttacker + gBattleStruct->selectionScriptFinished) = TRUE; } static void Cmd_playanimation(void) { const u16 *argumentPtr; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE || gBattlescriptCurrInstr[2] == B_ANIM_SILPH_SCOPED) { BtlController_EmitBattleAnimation(BUFFER_A, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } else if (gHitMarker & HITMARKER_NO_ANIMATIONS) { BattleScriptPush(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr = BattleScript_Pausex20; } else if (gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES || gBattlescriptCurrInstr[2] == B_ANIM_SUN_CONTINUES || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES) { BtlController_EmitBattleAnimation(BUFFER_A, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) { gBattlescriptCurrInstr += 7; } else { BtlController_EmitBattleAnimation(BUFFER_A, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } } // Same as playanimation, except it takes a pointer to some animation id, instead of taking the value directly static void Cmd_playanimation_var(void) { const u16 *argumentPtr; const u8 *animationIdPtr; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); animationIdPtr = T2_READ_PTR(gBattlescriptCurrInstr + 2); argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); if (*animationIdPtr == B_ANIM_STATS_CHANGE || *animationIdPtr == B_ANIM_SNATCH_MOVE || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) { BtlController_EmitBattleAnimation(BUFFER_A, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } else if (gHitMarker & HITMARKER_NO_ANIMATIONS) { gBattlescriptCurrInstr += 10; } else if (*animationIdPtr == B_ANIM_RAIN_CONTINUES || *animationIdPtr == B_ANIM_SUN_CONTINUES || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES || *animationIdPtr == B_ANIM_HAIL_CONTINUES) { BtlController_EmitBattleAnimation(BUFFER_A, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) { gBattlescriptCurrInstr += 10; } else { BtlController_EmitBattleAnimation(BUFFER_A, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } } static void Cmd_setgraphicalstatchangevalues(void) { u8 value = 0; switch (GET_STAT_BUFF_VALUE2(gBattleScripting.statChanger)) { case SET_STAT_BUFF_VALUE(1): // +1 value = STAT_ANIM_PLUS1; break; case SET_STAT_BUFF_VALUE(2): // +2 value = STAT_ANIM_PLUS2; break; case SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE: // -1 value = STAT_ANIM_MINUS1; break; case SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE: // -2 value = STAT_ANIM_MINUS2; break; } gBattleScripting.animArg1 = GET_STAT_BUFF_ID(gBattleScripting.statChanger) + value - 1; gBattleScripting.animArg2 = 0; gBattlescriptCurrInstr++; } static void Cmd_playstatchangeanimation(void) { u32 currStat = 0; u16 statAnimId = 0; s32 changeableStatsCount = 0; u8 statsToCheck = 0; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); statsToCheck = gBattlescriptCurrInstr[2]; if (gBattlescriptCurrInstr[3] & STAT_CHANGE_NEGATIVE) // goes down { s16 startingStatAnimId; if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) startingStatAnimId = STAT_ANIM_MINUS2 - 1; else startingStatAnimId = STAT_ANIM_MINUS1 - 1; while (statsToCheck != 0) { if (statsToCheck & 1) { if (gBattlescriptCurrInstr[3] & STAT_CHANGE_CANT_PREVENT) { if (gBattleMons[gActiveBattler].statStages[currStat] > MIN_STAT_STAGE) { statAnimId = startingStatAnimId + currStat; changeableStatsCount++; } } else if (!gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer && gBattleMons[gActiveBattler].ability != ABILITY_CLEAR_BODY && gBattleMons[gActiveBattler].ability != ABILITY_WHITE_SMOKE && !(gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE && currStat == STAT_ACC) && !(gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK)) { if (gBattleMons[gActiveBattler].statStages[currStat] > MIN_STAT_STAGE) { statAnimId = startingStatAnimId + currStat; changeableStatsCount++; } } } statsToCheck >>= 1, currStat++; } if (changeableStatsCount > 1) // more than one stat, so the color is gray { if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) statAnimId = STAT_ANIM_MULTIPLE_MINUS2; else statAnimId = STAT_ANIM_MULTIPLE_MINUS1; } } else // goes up { s16 startingStatAnimId; if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) startingStatAnimId = STAT_ANIM_PLUS2 - 1; else startingStatAnimId = STAT_ANIM_PLUS1 - 1; while (statsToCheck != 0) { if (statsToCheck & 1 && gBattleMons[gActiveBattler].statStages[currStat] < MAX_STAT_STAGE) { statAnimId = startingStatAnimId + currStat; changeableStatsCount++; } statsToCheck >>= 1, currStat++; } if (changeableStatsCount > 1) // more than one stat, so the color is gray { if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) statAnimId = STAT_ANIM_MULTIPLE_PLUS2; else statAnimId = STAT_ANIM_MULTIPLE_PLUS1; } } if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount < 2) { gBattlescriptCurrInstr += 4; } else if (changeableStatsCount != 0 && !gBattleScripting.statAnimPlayed) { BtlController_EmitBattleAnimation(BUFFER_A, B_ANIM_STATS_CHANGE, statAnimId); MarkBattlerForControllerExec(gActiveBattler); if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount > 1) gBattleScripting.statAnimPlayed = TRUE; gBattlescriptCurrInstr += 4; } else { gBattlescriptCurrInstr += 4; } } static void Cmd_moveend(void) { s32 i; bool32 effect = FALSE; u8 moveType = 0; u8 holdEffectAtk = 0; u16 *choicedMoveAtk = NULL; u8 endMode, endState; u16 originallyUsedMove; if (gChosenMove == MOVE_UNAVAILABLE) originallyUsedMove = MOVE_NONE; else originallyUsedMove = gChosenMove; endMode = gBattlescriptCurrInstr[1]; endState = gBattlescriptCurrInstr[2]; if (gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY) holdEffectAtk = gEnigmaBerries[gBattlerAttacker].holdEffect; else holdEffectAtk = ItemId_GetHoldEffect(gBattleMons[gBattlerAttacker].item); choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker]; GET_MOVE_TYPE(gCurrentMove, moveType); do { switch (gBattleScripting.moveendState) { case MOVEEND_RAGE: // rage check if (gBattleMons[gBattlerTarget].status2 & STATUS2_RAGE && gBattleMons[gBattlerTarget].hp != 0 && gBattlerAttacker != gBattlerTarget && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && TARGET_TURN_DAMAGED && gBattleMoves[gCurrentMove].power != 0 && gBattleMons[gBattlerTarget].statStages[STAT_ATK] < MAX_STAT_STAGE) { gBattleMons[gBattlerTarget].statStages[STAT_ATK]++; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RageIsBuilding; effect = TRUE; } gBattleScripting.moveendState++; break; case MOVEEND_DEFROST: // defrosting check if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE && gBattleMons[gBattlerTarget].hp != 0 && gBattlerAttacker != gBattlerTarget && gSpecialStatuses[gBattlerTarget].specialDmg && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && moveType == TYPE_FIRE) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; gActiveBattler = gBattlerTarget; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; effect = TRUE; } gBattleScripting.moveendState++; break; case MOVEEND_SYNCHRONIZE_TARGET: // target synchronize if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBattlerTarget, 0, 0, 0)) effect = TRUE; gBattleScripting.moveendState++; break; case MOVEEND_ON_DAMAGE_ABILITIES: // Such as abilities activating on contact (Effect Spore, Rough Skin, etc.). if (AbilityBattleEffects(ABILITYEFFECT_ON_DAMAGE, gBattlerTarget, 0, 0, 0)) effect = TRUE; gBattleScripting.moveendState++; break; case MOVEEND_IMMUNITY_ABILITIES: // status immunities if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) effect = TRUE; // it loops through all battlers, so we increment after its done with all battlers else gBattleScripting.moveendState++; break; case MOVEEND_SYNCHRONIZE_ATTACKER: // attacker synchronize if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBattlerAttacker, 0, 0, 0)) effect = TRUE; gBattleScripting.moveendState++; break; case MOVEEND_CHOICE_MOVE: // update choice band move if (gHitMarker & HITMARKER_OBEYS && holdEffectAtk == HOLD_EFFECT_CHOICE_BAND && gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE)) { if (gChosenMove == MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_FAILED)) { gBattleScripting.moveendState++; break; } *choicedMoveAtk = gChosenMove; } for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] == *choicedMoveAtk) break; } if (i == MAX_MON_MOVES) *choicedMoveAtk = MOVE_NONE; gBattleScripting.moveendState++; break; case MOVEEND_CHANGED_ITEMS: // changed held items for (i = 0; i < gBattlersCount; i++) { u16 *changedItem = &gBattleStruct->changedItems[i]; if (*changedItem != ITEM_NONE) { gBattleMons[i].item = *changedItem; *changedItem = ITEM_NONE; } } gBattleScripting.moveendState++; break; case MOVEEND_ITEM_EFFECTS_ALL: // item effects for all battlers if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE)) effect = TRUE; else gBattleScripting.moveendState++; break; case MOVEEND_KINGSROCK_SHELLBELL: // king's rock and shell bell if (ItemBattleEffects(ITEMEFFECT_KINGSROCK_SHELLBELL, 0, FALSE)) effect = TRUE; gBattleScripting.moveendState++; break; case MOVEEND_ATTACKER_INVISIBLE: // make attacker sprite invisible if (gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE) && gHitMarker & HITMARKER_NO_ANIMATIONS) { gActiveBattler = gBattlerAttacker; BtlController_EmitSpriteInvisibility(BUFFER_A, TRUE); MarkBattlerForControllerExec(gActiveBattler); gBattleScripting.moveendState++; return; } gBattleScripting.moveendState++; break; case MOVEEND_ATTACKER_VISIBLE: // make attacker sprite visible if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || !(gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE)) || WasUnableToUseMove(gBattlerAttacker)) { gActiveBattler = gBattlerAttacker; BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerAttacker] &= ~STATUS3_SEMI_INVULNERABLE; gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1; gBattleScripting.moveendState++; return; } gBattleScripting.moveendState++; break; case MOVEEND_TARGET_VISIBLE: // make target sprite visible if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) { gActiveBattler = gBattlerTarget; BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerTarget] &= ~STATUS3_SEMI_INVULNERABLE; gBattleScripting.moveendState++; return; } gBattleScripting.moveendState++; break; case MOVEEND_SUBSTITUTE: // update substitute for (i = 0; i < gBattlersCount; i++) { if (gDisableStructs[i].substituteHP == 0) gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; } gBattleScripting.moveendState++; break; case MOVEEND_UPDATE_LAST_MOVES: if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) { gActiveBattler = gBattlerAttacker; gBattlerAttacker = gBattlerTarget; gBattlerTarget = gActiveBattler; gHitMarker &= ~HITMARKER_SWAP_ATTACKER_TARGET; } if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) { gLastPrintedMoves[gBattlerAttacker] = gChosenMove; } if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) && !(gBattleStruct->absentBattlerFlags & gBitTable[gBattlerAttacker]) && gBattleMoves[originallyUsedMove].effect != EFFECT_BATON_PASS) { if (gHitMarker & HITMARKER_OBEYS) { gLastMoves[gBattlerAttacker] = gChosenMove; gLastResultingMoves[gBattlerAttacker] = gCurrentMove; } else { gLastMoves[gBattlerAttacker] = MOVE_UNAVAILABLE; gLastResultingMoves[gBattlerAttacker] = MOVE_UNAVAILABLE; } if (!(gHitMarker & HITMARKER_FAINTED(gBattlerTarget))) gLastHitBy[gBattlerTarget] = gBattlerAttacker; if (gHitMarker & HITMARKER_OBEYS && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { if (gChosenMove == MOVE_UNAVAILABLE) { gLastLandedMoves[gBattlerTarget] = gChosenMove; } else { gLastLandedMoves[gBattlerTarget] = gCurrentMove; GET_MOVE_TYPE(gCurrentMove, gLastHitByType[gBattlerTarget]); } } else { gLastLandedMoves[gBattlerTarget] = MOVE_UNAVAILABLE; } } gBattleScripting.moveendState++; break; case MOVEEND_MIRROR_MOVE: // mirror move if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) && !(gBattleStruct->absentBattlerFlags & gBitTable[gBattlerAttacker]) && gBattleMoves[originallyUsedMove].flags & FLAG_MIRROR_MOVE_AFFECTED && gHitMarker & HITMARKER_OBEYS && gBattlerAttacker != gBattlerTarget && !(gHitMarker & HITMARKER_FAINTED(gBattlerTarget)) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { u8 target, attacker; *(gBattleStruct->lastTakenMove + gBattlerTarget * 2 + 0) = gChosenMove; *(gBattleStruct->lastTakenMove + gBattlerTarget * 2 + 1) = gChosenMove >> 8; target = gBattlerTarget; attacker = gBattlerAttacker; *(attacker * 2 + target * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = gChosenMove; target = gBattlerTarget; attacker = gBattlerAttacker; *(attacker * 2 + target * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = gChosenMove >> 8; } gBattleScripting.moveendState++; break; case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokemon. if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !gProtectStructs[gBattlerAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) { u8 battlerId = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); if (gBattleMons[battlerId].hp != 0) { gBattlerTarget = battlerId; gHitMarker |= HITMARKER_NO_ATTACKSTRING; gBattleScripting.moveendState = 0; MoveValuesCleanUp(); BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; } else { gHitMarker |= HITMARKER_NO_ATTACKSTRING; } } gBattleScripting.moveendState++; break; case MOVEEND_COUNT: break; } if (endMode == 1 && effect == FALSE) gBattleScripting.moveendState = MOVEEND_COUNT; if (endMode == 2 && endState == gBattleScripting.moveendState) gBattleScripting.moveendState = MOVEEND_COUNT; } while (gBattleScripting.moveendState != MOVEEND_COUNT && effect == FALSE); if (gBattleScripting.moveendState == MOVEEND_COUNT && effect == FALSE) gBattlescriptCurrInstr += 3; } static void Cmd_typecalc2(void) { u8 flags = 0; s32 i = 0; u8 moveType = gBattleMoves[gCurrentMove].type; if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) { gLastUsedAbility = gBattleMons[gBattlerTarget].ability; gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastLandedMoves[gBattlerTarget] = 0; gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else { while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) { if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) { if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) { break; } else { i += 3; continue; } } if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check type1 if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1) { if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) { gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; break; } if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE) { flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; } if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) { flags |= MOVE_RESULT_SUPER_EFFECTIVE; } } // check type2 if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2) { if (gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) { gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; break; } if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE) { flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; } if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) { flags |= MOVE_RESULT_SUPER_EFFECTIVE; } } } i += 3; } } if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_NO_EFFECT) && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2 && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) && gBattleMoves[gCurrentMove].power) { gLastUsedAbility = ABILITY_WONDER_GUARD; gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) gProtectStructs[gBattlerAttacker].targetNotAffected = 1; gBattlescriptCurrInstr++; } static void Cmd_returnatktoball(void) { gActiveBattler = gBattlerAttacker; if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler))) { BtlController_EmitReturnMonToBall(BUFFER_A, FALSE); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr++; } static void Cmd_getswitchedmondata(void) { if (gBattleControllerExecFlags) return; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); gBattlerPartyIndexes[gActiveBattler] = *(gBattleStruct->monToSwitchIntoId + gActiveBattler); BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } static void Cmd_switchindataupdate(void) { struct BattlePokemon oldData; s32 i; u8 *monData; if (gBattleControllerExecFlags) return; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); oldData = gBattleMons[gActiveBattler]; monData = (u8 *)(&gBattleMons[gActiveBattler]); for (i = 0; i < sizeof(struct BattlePokemon); i++) monData[i] = gBattleBufferB[gActiveBattler][4 + i]; gBattleMons[gActiveBattler].type1 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; gBattleMons[gActiveBattler].type2 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); // check knocked off item i = GetBattlerSide(gActiveBattler); if (gWishFutureKnock.knockedOffMons[i] & gBitTable[gBattlerPartyIndexes[gActiveBattler]]) { gBattleMons[gActiveBattler].item = ITEM_NONE; } if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) { for (i = 0; i < NUM_BATTLE_STATS; i++) { gBattleMons[gActiveBattler].statStages[i] = oldData.statStages[i]; } gBattleMons[gActiveBattler].status2 = oldData.status2; } SwitchInClearSetData(); gBattleScripting.battler = gActiveBattler; PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]); gBattlescriptCurrInstr += 2; } static void Cmd_switchinanim(void) { if (gBattleControllerExecFlags) return; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_GHOST))) HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]); BtlController_EmitSwitchInAnim(BUFFER_A, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; } static void Cmd_jumpifcantswitch(void) { s32 i; s32 lastMonId; struct Pokemon *party; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~SWITCH_IGNORE_ESCAPE_PREVENTION); if (!(gBattlescriptCurrInstr[1] & SWITCH_IGNORE_ESCAPE_PREVENTION) && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); } else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) party = gEnemyParty; else party = gPlayerParty; i = 0; if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gActiveBattler)) == TRUE) i = 3; for (lastMonId = i + 3; i < lastMonId; i++) { if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) && GetMonData(&party[i], MON_DATA_HP) != 0 && gBattlerPartyIndexes[gActiveBattler] != i) break; } if (i == lastMonId) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } else { u8 battlerIn1, battlerIn2; if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) { battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); else battlerIn2 = battlerIn1; party = gEnemyParty; } else { battlerIn1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) battlerIn2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); else battlerIn2 = battlerIn1; party = gPlayerParty; } for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) && i != gBattlerPartyIndexes[battlerIn1] && i != gBattlerPartyIndexes[battlerIn2]) break; } if (i == PARTY_SIZE) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } } // Opens the party screen to choose a new Pokémon to send out. // slotId is the Pokémon to replace. // Note that this is not used by the Switch action, only replacing fainted Pokémon or Baton Pass static void ChooseMonToSendOut(u8 slotId) { *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } static void Cmd_openpartyscreen(void) { u32 flags; u8 hitmarkerFaintBits; u8 battlerId; const u8 *jumpPtr; battlerId = 0; flags = 0; jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2); if (gBattlescriptCurrInstr[1] == BS_FAINTED_LINK_MULTIPLE_1) { if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) { if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) { ChooseMonToSendOut(PARTY_SIZE); gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE; } } else { BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } } } else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { bool8 hasReplacement_0, hasReplacement_1, hasReplacement_2, hasReplacement_3; hitmarkerFaintBits = gHitMarker >> 28; if (gBitTable[0] & hitmarkerFaintBits) { gActiveBattler = 0; if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); BtlController_EmitCantSwitch(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) { ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[2]); gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE; } else { BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); flags |= 1; } } if (gBitTable[2] & hitmarkerFaintBits && !(gBitTable[0] & hitmarkerFaintBits)) { gActiveBattler = 2; if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); BtlController_EmitCantSwitch(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) { ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[0]); gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE; } else if (!(flags & 1)) { BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } } if (gBitTable[1] & hitmarkerFaintBits) { gActiveBattler = 1; if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); BtlController_EmitCantSwitch(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) { ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[3]); gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE; } else { BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); flags |= 2; } } if (gBitTable[3] & hitmarkerFaintBits && !(gBitTable[1] & hitmarkerFaintBits)) { gActiveBattler = 3; if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); BtlController_EmitCantSwitch(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) { ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[1]); gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE; } else if (!(flags & 2)) { BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } } hasReplacement_0 = gSpecialStatuses[0].faintedHasReplacement; if (!hasReplacement_0) { hasReplacement_2 = gSpecialStatuses[2].faintedHasReplacement; if (!hasReplacement_2 && hitmarkerFaintBits != 0) { if (gAbsentBattlerFlags & gBitTable[0]) gActiveBattler = 2; else gActiveBattler = 0; BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } } hasReplacement_1 = gSpecialStatuses[1].faintedHasReplacement; if (!hasReplacement_1) { hasReplacement_3 = gSpecialStatuses[3].faintedHasReplacement; if (!hasReplacement_3 && hitmarkerFaintBits != 0) { if (gAbsentBattlerFlags & gBitTable[1]) gActiveBattler = 3; else gActiveBattler = 1; BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } } } gBattlescriptCurrInstr += 6; } else if (gBattlescriptCurrInstr[1] == BS_FAINTED_LINK_MULTIPLE_2) { if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { hitmarkerFaintBits = gHitMarker >> 28; if (gBitTable[2] & hitmarkerFaintBits && gBitTable[0] & hitmarkerFaintBits) { gActiveBattler = 2; if (HasNoMonsToSwitch(gActiveBattler, gBattleBufferB[0][1], PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); BtlController_EmitCantSwitch(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) { ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[0]); gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE; } } if (gBitTable[3] & hitmarkerFaintBits && hitmarkerFaintBits & gBitTable[1]) { gActiveBattler = 3; if (HasNoMonsToSwitch(gActiveBattler, gBattleBufferB[1][1], PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); BtlController_EmitCantSwitch(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) { ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[1]); gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE; } } gBattlescriptCurrInstr += 6; } else { // Not multi or double battle gBattlescriptCurrInstr += 6; } } else { // Multi battle gBattlescriptCurrInstr += 6; } hitmarkerFaintBits = gHitMarker >> 28; gBattlerFainted = 0; while (!(gBitTable[gBattlerFainted] & hitmarkerFaintBits) && gBattlerFainted < gBattlersCount) gBattlerFainted++; if (gBattlerFainted == gBattlersCount) gBattlescriptCurrInstr = jumpPtr; } else { if (gBattlescriptCurrInstr[1] & PARTY_SCREEN_OPTIONAL) hitmarkerFaintBits = PARTY_ACTION_CHOOSE_MON; // Used here as the caseId for the EmitChoose function. else hitmarkerFaintBits = PARTY_ACTION_SEND_OUT; battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~PARTY_SCREEN_OPTIONAL); if (gSpecialStatuses[battlerId].faintedHasReplacement) { gBattlescriptCurrInstr += 6; } else if (HasNoMonsToSwitch(battlerId, PARTY_SIZE, PARTY_SIZE)) { gActiveBattler = battlerId; gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); gBattlescriptCurrInstr = jumpPtr; } else { gActiveBattler = battlerId; *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; BtlController_EmitChoosePokemon(BUFFER_A, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + (gActiveBattler ^ 2)), 0, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 6; if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT && gBattleResults.playerSwitchesCounter < 255) gBattleResults.playerSwitchesCounter++; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gActiveBattler != battlerId) { BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } } } else { gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(battlerId) ^ BIT_SIDE); if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) gActiveBattler ^= BIT_FLANK; BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY); MarkBattlerForControllerExec(gActiveBattler); } } } } static void Cmd_switchhandleorder(void) { s32 i; if (gBattleControllerExecFlags) return; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); switch (gBattlescriptCurrInstr[2]) { case 0: for (i = 0; i < gBattlersCount; i++) { if (gBattleBufferB[i][0] == CONTROLLER_CHOSENMONRETURNVALUE) { *(gBattleStruct->monToSwitchIntoId + i) = gBattleBufferB[i][1]; } } break; case 1: if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) UpdatePartyOwnerOnSwitch_NonMulti(gActiveBattler); break; case 2: gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1]; *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1]; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= 0xF; *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0); *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 1) = gBattleBufferB[gActiveBattler][3]; *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= (0xF0); *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 2) = gBattleBufferB[gActiveBattler][3]; } else { UpdatePartyOwnerOnSwitch_NonMulti(gActiveBattler); } PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species) PREPARE_MON_NICK_BUFFER(gBattleTextBuff2, gActiveBattler, gBattleBufferB[gActiveBattler][1]) break; } gBattlescriptCurrInstr += 3; } static void Cmd_switchineffects(void) { s32 i; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); UpdateSentPokesToOpponentValue(gActiveBattler); gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); gSpecialStatuses[gActiveBattler].faintedHasReplacement = FALSE; if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED) && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES) && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) { u8 spikesDmg; gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_SPIKES_DAMAGED; // Present in pokeemerald but not here // gBattleMons[gActiveBattler].status2 &= ~STATUS2_DESTINY_BOND; // gHitMarker &= ~HITMARKER_DESTINYBOND; spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2; gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (spikesDmg); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleScripting.battler = gActiveBattler; BattleScriptPushCursor(); if (gBattlescriptCurrInstr[1] == BS_TARGET) gBattlescriptCurrInstr = BattleScript_SpikesOnTarget; else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) gBattlescriptCurrInstr = BattleScript_SpikesOnAttacker; else gBattlescriptCurrInstr = BattleScript_SpikesOnFaintedBattler; } else { // There is a hack here in pokeemerald to ensure the truant counter will be 0 when the battler's next turn starts. // The truant counter is not updated in the case where a mon switches in after a lost judgement in the battle arena. if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT) //if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT && !gDisableStructs[gActiveBattler].truantSwitchInHack) // In pokeemerald. gDisableStructs[gActiveBattler].truantCounter = 1; //gDisableStructs[gActiveBattler].truantSwitchInHack = 0; // In pokeemerald, otherwise unused. if (!AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0) && !ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gActiveBattler, FALSE)) { gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~SIDE_STATUS_SPIKES_DAMAGED; for (i = 0; i < gBattlersCount; i++) { if (gBattlerByTurnOrder[i] == gActiveBattler) gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER; } for (i = 0; i < gBattlersCount; i++) { u16 *hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(i)]; *hpOnSwitchout = gBattleMons[i].hp; } if (gBattlescriptCurrInstr[1] == BS_FAINTED_LINK_MULTIPLE_1) { u32 hitmarkerFaintBits = gHitMarker >> 28; gBattlerFainted++; while (TRUE) { if (hitmarkerFaintBits & gBitTable[gBattlerFainted] && !(gAbsentBattlerFlags & gBitTable[gBattlerFainted])) break; if (gBattlerFainted >= gBattlersCount) break; gBattlerFainted++; } } gBattlescriptCurrInstr += 2; } } } static void Cmd_trainerslidein(void) { if (!gBattlescriptCurrInstr[1]) gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); else gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); BtlController_EmitTrainerSlide(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } static void Cmd_playse(void) { gActiveBattler = gBattlerAttacker; BtlController_EmitPlaySE(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; } static void Cmd_fanfare(void) { gActiveBattler = gBattlerAttacker; BtlController_EmitPlayFanfare(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; } static void Cmd_playfaintcry(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitFaintingCry(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } static void Cmd_endlinkbattle(void) { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); BtlController_EmitEndLinkBattle(BUFFER_A, gBattleOutcome); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 1; } static void Cmd_returntoball(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitReturnMonToBall(BUFFER_A, TRUE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } static void Cmd_handlelearnnewmove(void) { const u8 *learnedMovePtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); const u8 *nothingToLearnPtr = T1_READ_PTR(gBattlescriptCurrInstr + 5); u16 learnMove = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterMonId], gBattlescriptCurrInstr[9]); while (learnMove == MON_ALREADY_KNOWS_MOVE) learnMove = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterMonId], FALSE); if (learnMove == MOVE_NONE) { gBattlescriptCurrInstr = nothingToLearnPtr; } else if (learnMove == MON_HAS_MAX_MOVES) { gBattlescriptCurrInstr += 10; } else { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { GiveMoveToBattleMon(&gBattleMons[gActiveBattler], learnMove); } if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { GiveMoveToBattleMon(&gBattleMons[gActiveBattler], learnMove); } } gBattlescriptCurrInstr = learnedMovePtr; } } static void Cmd_yesnoboxlearnmove(void) { gActiveBattler = 0; switch (gBattleScripting.learnMoveState) { case 0: HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); gBattleScripting.learnMoveState++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); break; case 1: if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) { PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); } if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) { PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); gBattleCommunication[CURSOR_POSITION] = 1; BattleCreateYesNoCursorAt(); } if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); if (gBattleCommunication[1] == 0) { HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gBattleScripting.learnMoveState++; } else { gBattleScripting.learnMoveState = 4; } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); gBattleScripting.learnMoveState = 4; } break; case 2: if (!gPaletteFade.active) { FreeAllWindowBuffers(); ShowSelectMovePokemonSummaryScreen(gPlayerParty, gBattleStruct->expGetterMonId, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn); gBattleScripting.learnMoveState++; } break; case 3: if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2) { u8 movePosition = GetMoveSlotToReplace(); if (movePosition == MAX_MON_MOVES) { gBattleScripting.learnMoveState = 4; } else { u16 moveId = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition); if (IsHMMove2(moveId)) { PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, gActiveBattler); gBattleScripting.learnMoveState = 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); PREPARE_MOVE_BUFFER(gBattleTextBuff2, moveId) RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterMonId], movePosition); SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterMonId], gMoveToLearn, movePosition); if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && MOVE_IS_PERMANENT(0, movePosition)) { RemoveBattleMonPPBonus(&gBattleMons[0], movePosition); SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, movePosition); } if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && MOVE_IS_PERMANENT(2, movePosition)) { RemoveBattleMonPPBonus(&gBattleMons[2], movePosition); SetBattleMonMoveSlot(&gBattleMons[2], gMoveToLearn, movePosition); } } } } break; case 4: HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); gBattlescriptCurrInstr += 5; break; case 5: if (gBattleControllerExecFlags == 0) { gBattleScripting.learnMoveState = 2; } break; } } static void Cmd_yesnoboxstoplearningmove(void) { switch (gBattleScripting.learnMoveState) { case 0: HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); gBattleScripting.learnMoveState++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); break; case 1: if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) { PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); } if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) { PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); gBattleCommunication[CURSOR_POSITION] = 1; BattleCreateYesNoCursorAt(); } if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); if (gBattleCommunication[1] != 0) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); } break; } } static void Cmd_hitanimation(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { gBattlescriptCurrInstr += 2; } else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0) { BtlController_EmitHitAnimation(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } else { gBattlescriptCurrInstr += 2; } } static void Cmd_getmoneyreward(void) { u32 i = 0; u32 moneyReward; u8 lastMonLevel = 0; const struct TrainerMonItemCustomMoves *party4; //This needs to be out here const struct TrainerMonItemCustomMovesEVs *party5; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (gBattleOutcome == B_OUTCOME_WON) { if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) { moneyReward = gBattleResources->secretBase->party.levels[0] * 20 * gBattleStruct->moneyMultiplier; } else { switch (sTrainers[gTrainerBattleOpponent_A].partyFlags) { case 0: { const struct TrainerMonNoItemDefaultMoves *party1 = sTrainers[gTrainerBattleOpponent_A].party.NoItemDefaultMoves; lastMonLevel = party1[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl; } break; case F_TRAINER_PARTY_CUSTOM_MOVESET: { const struct TrainerMonNoItemCustomMoves *party2 = sTrainers[gTrainerBattleOpponent_A].party.NoItemCustomMoves; lastMonLevel = party2[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl; } break; case F_TRAINER_PARTY_HELD_ITEM: { const struct TrainerMonItemDefaultMoves *party3 = sTrainers[gTrainerBattleOpponent_A].party.ItemDefaultMoves; lastMonLevel = party3[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl; } break; case (F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM): { party4 = sTrainers[gTrainerBattleOpponent_A].party.ItemCustomMoves; lastMonLevel = party4[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl; } break; case F_TRAINER_PARTY_EVS: { party5 = sTrainers[gTrainerBattleOpponent_A].party.ItemCustomMovesEVs; lastMonLevel = party5[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl; } break; } for (; gTrainerMoneyTable[i].classId != 0xFF; i++) { if (gTrainerMoneyTable[i].classId == sTrainers[gTrainerBattleOpponent_A].trainerClass) break; } party4 = sTrainers[gTrainerBattleOpponent_A].party.ItemCustomMoves; // Needed to Match. Has no effect. moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * (gBattleTypeFlags & BATTLE_TYPE_DOUBLE ? 2 : 1) * gTrainerMoneyTable[i].value; } AddMoney(&gSaveBlock1Ptr->money, moneyReward); } else { moneyReward = ComputeWhiteOutMoneyLoss(); } PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff1, 5, moneyReward); if (moneyReward) gBattlescriptCurrInstr += 5; else gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } // Command is never used static void Cmd_updatebattlermoves(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); switch (gBattleCommunication[0]) { case 0: BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[0]++; break; case 1: if (gBattleControllerExecFlags == 0) { s32 i; struct BattlePokemon *bufferPoke = (struct BattlePokemon *) &gBattleBufferB[gActiveBattler][4]; for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i]; gBattleMons[gActiveBattler].pp[i] = bufferPoke->pp[i]; } gBattlescriptCurrInstr += 2; } break; } } static void Cmd_swapattackerwithtarget(void) { gActiveBattler = gBattlerAttacker; gBattlerAttacker = gBattlerTarget; gBattlerTarget = gActiveBattler; if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) gHitMarker &= ~HITMARKER_SWAP_ATTACKER_TARGET; else gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; gBattlescriptCurrInstr++; } static void Cmd_incrementgamestat(void) { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) IncrementGameStat(gBattlescriptCurrInstr[1]); gBattlescriptCurrInstr += 2; } static void Cmd_drawpartystatussummary(void) { s32 i; struct Pokemon *party; struct HpAndStatus hpStatuses[PARTY_SIZE]; if (gBattleControllerExecFlags) return; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE || GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) { hpStatuses[i].hp = 0xFFFF; hpStatuses[i].status = 0; } else { hpStatuses[i].hp = GetMonData(&party[i], MON_DATA_HP); hpStatuses[i].status = GetMonData(&party[i], MON_DATA_STATUS); } } BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatuses, 1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } static void Cmd_hidepartystatussummary(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitHidePartyStatusSummary(BUFFER_A); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } static void Cmd_jumptocalledmove(void) { if (gBattlescriptCurrInstr[1]) gCurrentMove = gCalledMove; else gChosenMove = gCurrentMove = gCalledMove; gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; } static void Cmd_statusanimation(void) { if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { BtlController_EmitStatusAnimation(BUFFER_A, FALSE, gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 2; } } static void Cmd_status2animation(void) { u32 wantedToAnimate; if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); wantedToAnimate = T1_READ_32(gBattlescriptCurrInstr + 2); if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { BtlController_EmitStatusAnimation(BUFFER_A, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 6; } } static void Cmd_chosenstatusanimation(void) { u32 wantedStatus; if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); wantedStatus = T1_READ_32(gBattlescriptCurrInstr + 3); if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { BtlController_EmitStatusAnimation(BUFFER_A, gBattlescriptCurrInstr[2], wantedStatus); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 7; } } static void Cmd_yesnobox(void) { switch (gBattleCommunication[0]) { case 0: HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); gBattleCommunication[0]++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); break; case 1: if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) { PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); } if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) { PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); gBattleCommunication[CURSOR_POSITION] = 1; BattleCreateYesNoCursorAt(); } if (JOY_NEW(B_BUTTON)) { gBattleCommunication[CURSOR_POSITION] = 1; PlaySE(SE_SELECT); HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); gBattlescriptCurrInstr++; } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR); gBattlescriptCurrInstr++; } break; } } static void Cmd_cancelallactions(void) { s32 i; for (i = 0; i < gBattlersCount; i++) gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER; gBattlescriptCurrInstr++; } // The same as adjustnormaldamage, except there's no random damage multiplier. static void Cmd_adjustsetdamage(void) { u8 holdEffect, param; if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) { holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; param = gEnigmaBerries[gBattlerTarget].holdEffectParam; } else { holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) { RecordItemEffectBattle(gBattlerTarget, holdEffect); gSpecialStatuses[gBattlerTarget].focusBanded = 1; } if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) && (gBattleMoves[gCurrentMove].effect == EFFECT_FALSE_SWIPE || gProtectStructs[gBattlerTarget].endured || gSpecialStatuses[gBattlerTarget].focusBanded) && gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; if (gProtectStructs[gBattlerTarget].endured) { gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; } else if (gSpecialStatuses[gBattlerTarget].focusBanded) { gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; gLastUsedItem = gBattleMons[gBattlerTarget].item; } } gBattlescriptCurrInstr++; } static void Cmd_removeitem(void) { u16 *usedHeldItem; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler]; *usedHeldItem = gBattleMons[gActiveBattler].item; gBattleMons[gActiveBattler].item = ITEM_NONE; BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } static void Cmd_atknameinbuff1(void) { PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]) gBattlescriptCurrInstr++; } static void Cmd_drawlvlupbox(void) { if (gBattleScripting.drawlvlupboxState == 0) { // If the Pokémon getting exp is not in-battle then // slide out a banner with their name and icon on it. // Otherwise skip ahead. if (IsMonGettingExpSentOut()) gBattleScripting.drawlvlupboxState = 3; else gBattleScripting.drawlvlupboxState = 1; } switch (gBattleScripting.drawlvlupboxState) { case 1: // Start level up banner gBattle_BG2_Y = 96; SetBgAttribute(2, BG_ATTR_PRIORITY, 0); ShowBg(2); InitLevelUpBanner(); gBattleScripting.drawlvlupboxState = 2; break; case 2: if (!SlideInLevelUpBanner()) gBattleScripting.drawlvlupboxState = 3; break; case 3: // Init level up box gBattle_BG1_X = 0; gBattle_BG1_Y = 256; SetBgAttribute(0, BG_ATTR_PRIORITY, 1); SetBgAttribute(1, BG_ATTR_PRIORITY, 0); ShowBg(0); ShowBg(1); HandleBattleWindow(18, 7, 29, 19, WINDOW_BG1); gBattleScripting.drawlvlupboxState = 4; break; case 4: // Draw page 1 of level up box DrawLevelUpWindow1(); PutWindowTilemap(B_WIN_LEVEL_UP_BOX); CopyWindowToVram(B_WIN_LEVEL_UP_BOX, COPYWIN_FULL); gBattleScripting.drawlvlupboxState++; break; case 5: case 7: // Wait for draw after each page if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG1_Y = 0; gBattleScripting.drawlvlupboxState++; } break; case 6: if (gMain.newKeys != 0) { // Draw page 2 of level up box PlaySE(SE_SELECT); DrawLevelUpWindow2(); CopyWindowToVram(B_WIN_LEVEL_UP_BOX, COPYWIN_GFX); gBattleScripting.drawlvlupboxState++; } break; case 8: if (gMain.newKeys != 0) { // Close level up box PlaySE(SE_SELECT); HandleBattleWindow(18, 7, 29, 19, WINDOW_BG1 | WINDOW_CLEAR); gBattleScripting.drawlvlupboxState++; } break; case 9: if (!SlideOutLevelUpBanner()) { ClearWindowTilemap(B_WIN_LEVEL_UP_BANNER); CopyWindowToVram(B_WIN_LEVEL_UP_BANNER, COPYWIN_MAP); ClearWindowTilemap(B_WIN_LEVEL_UP_BOX); CopyWindowToVram(B_WIN_LEVEL_UP_BOX, COPYWIN_MAP); SetBgAttribute(2, BG_ATTR_PRIORITY, 2); ShowBg(2); gBattleScripting.drawlvlupboxState = 10; } break; case 10: if (!IsDma3ManagerBusyWithBgCopy()) { SetBgAttribute(0, BG_ATTR_PRIORITY, 0); SetBgAttribute(1, BG_ATTR_PRIORITY, 1); ShowBg(0); ShowBg(1); gBattlescriptCurrInstr++; } break; } } static void DrawLevelUpWindow1(void) { u16 currStats[NUM_STATS]; GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats); DrawLevelUpWindowPg1(B_WIN_LEVEL_UP_BOX, gBattleResources->beforeLvlUp->stats, currStats, TEXT_DYNAMIC_COLOR_5, TEXT_DYNAMIC_COLOR_4, TEXT_DYNAMIC_COLOR_6); } static void DrawLevelUpWindow2(void) { u16 currStats[NUM_STATS]; GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats); DrawLevelUpWindowPg2(B_WIN_LEVEL_UP_BOX, currStats, TEXT_DYNAMIC_COLOR_5, TEXT_DYNAMIC_COLOR_4, TEXT_DYNAMIC_COLOR_6); } static void InitLevelUpBanner(void) { gBattle_BG2_Y = 0; gBattle_BG2_X = LEVEL_UP_BANNER_START; LoadPalette(sLevelUpBanner_Pal, BG_PLTT_ID(6), sizeof(sLevelUpBanner_Pal)); CopyToWindowPixelBuffer(B_WIN_LEVEL_UP_BANNER, sLevelUpBanner_Gfx, 0, 0); PutWindowTilemap(B_WIN_LEVEL_UP_BANNER); CopyWindowToVram(B_WIN_LEVEL_UP_BANNER, COPYWIN_FULL); PutMonIconOnLvlUpBanner(); } static bool8 SlideInLevelUpBanner(void) { if (IsDma3ManagerBusyWithBgCopy()) return TRUE; if (gBattle_BG2_X == LEVEL_UP_BANNER_END) return FALSE; if (gBattle_BG2_X == LEVEL_UP_BANNER_START) DrawLevelUpBannerText(); gBattle_BG2_X += 8; if (gBattle_BG2_X >= LEVEL_UP_BANNER_END) gBattle_BG2_X = LEVEL_UP_BANNER_END; return (gBattle_BG2_X != LEVEL_UP_BANNER_END); } static void DrawLevelUpBannerText(void) { u16 monLevel; u8 monGender; struct TextPrinterTemplate printerTemplate; u8 *txtPtr; u8 *txtPtr2; monLevel = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL); monGender = GetMonGender(&gPlayerParty[gBattleStruct->expGetterMonId]); GetMonNickname(&gPlayerParty[gBattleStruct->expGetterMonId], gStringVar4); printerTemplate.currentChar = gStringVar4; printerTemplate.windowId = B_WIN_LEVEL_UP_BANNER; printerTemplate.fontId = FONT_SMALL; printerTemplate.x = 32; printerTemplate.y = 0; printerTemplate.currentX = 32; printerTemplate.currentY = 0; printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.unk = 0; printerTemplate.fgColor = TEXT_COLOR_WHITE; printerTemplate.bgColor = TEXT_COLOR_TRANSPARENT; printerTemplate.shadowColor = TEXT_COLOR_DARK_GRAY; AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL); txtPtr = gStringVar4; gStringVar4[0] = CHAR_EXTRA_SYMBOL; *++txtPtr = CHAR_LV_2; *++txtPtr = 0; txtPtr2 = txtPtr + 1; txtPtr = ConvertIntToDecimalStringN(++txtPtr, monLevel, STR_CONV_MODE_LEFT_ALIGN, 3); txtPtr = StringFill(txtPtr, 0, 5); txtPtr = txtPtr2 + 4; if (monGender != MON_GENDERLESS) { if (monGender == MON_MALE) { txtPtr = WriteColorChangeControlCode(txtPtr, 0, TEXT_DYNAMIC_COLOR_3); txtPtr = WriteColorChangeControlCode(txtPtr, 1, TEXT_DYNAMIC_COLOR_4); *(txtPtr++) = CHAR_MALE; } else { txtPtr = WriteColorChangeControlCode(txtPtr, 0, TEXT_DYNAMIC_COLOR_5); txtPtr = WriteColorChangeControlCode(txtPtr, 1, TEXT_DYNAMIC_COLOR_6); *(txtPtr++) = CHAR_FEMALE; } *(txtPtr++) = EOS; } printerTemplate.y = 10; printerTemplate.currentY = 10; AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(B_WIN_LEVEL_UP_BANNER, COPYWIN_GFX); } static bool8 SlideOutLevelUpBanner(void) { if (gBattle_BG2_X == LEVEL_UP_BANNER_START) return FALSE; if (gBattle_BG2_X - 16 < LEVEL_UP_BANNER_START) gBattle_BG2_X = LEVEL_UP_BANNER_START; else gBattle_BG2_X -= 16; return (gBattle_BG2_X != LEVEL_UP_BANNER_START); } #define sDestroy data[0] #define sXOffset data[1] static void PutMonIconOnLvlUpBanner(void) { u8 spriteId; const u16 *iconPal; struct SpriteSheet iconSheet; struct SpritePalette iconPalSheet; u16 species = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPECIES); u32 personality = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_PERSONALITY); const u8 *iconPtr = GetMonIconPtr(species, personality, 1); iconSheet.data = iconPtr; iconSheet.size = 0x200; iconSheet.tag = TAG_LVLUP_BANNER_MON_ICON; iconPal = GetValidMonIconPalettePtr(species); iconPalSheet.data = iconPal; iconPalSheet.tag = TAG_LVLUP_BANNER_MON_ICON; LoadSpriteSheet(&iconSheet); LoadSpritePalette(&iconPalSheet); spriteId = CreateSprite(&sSpriteTemplate_MonIconOnLvlUpBanner, 256, 10, 0); gSprites[spriteId].sDestroy = FALSE; gSprites[spriteId].sXOffset = gBattle_BG2_X; } static void SpriteCB_MonIconOnLvlUpBanner(struct Sprite* sprite) { sprite->x2 = sprite->sXOffset - gBattle_BG2_X; if (sprite->x2 != 0) { sprite->sDestroy = TRUE; } else if (sprite->sDestroy) { DestroySprite(sprite); FreeSpriteTilesByTag(TAG_LVLUP_BANNER_MON_ICON); FreeSpritePaletteByTag(TAG_LVLUP_BANNER_MON_ICON); } } #undef sDestroy #undef sXOffset bool32 IsMonGettingExpSentOut(void) { if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId) return TRUE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) return TRUE; return FALSE; } static void Cmd_resetsentmonsvalue(void) { ResetSentPokesToOpponentValue(); gBattlescriptCurrInstr++; } static void Cmd_setatktoplayer0(void) { gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); gBattlescriptCurrInstr++; } static void Cmd_makevisible(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } static void Cmd_recordlastability(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); RecordAbilityBattle(gActiveBattler, gLastUsedAbility); #ifdef BUGFIX // This command occupies two bytes (one for the command id, and one for the battler id parameter). gBattlescriptCurrInstr += 2; #else gBattlescriptCurrInstr += 1; #endif } void BufferMoveToLearnIntoBattleTextBuff2(void) { PREPARE_MOVE_BUFFER(gBattleTextBuff2, gMoveToLearn); } static void Cmd_buffermovetolearn(void) { BufferMoveToLearnIntoBattleTextBuff2(); gBattlescriptCurrInstr++; } static void Cmd_jumpifplayerran(void) { if (TryRunFromBattle(gBattlerFainted)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } static void Cmd_hpthresholds(void) { u8 opposingBattler; s32 result; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); opposingBattler = gActiveBattler ^ BIT_SIDE; result = gBattleMons[opposingBattler].hp * 100 / gBattleMons[opposingBattler].maxHP; if (result == 0) result = 1; if (result > 69 || gBattleMons[opposingBattler].hp == 0) gBattleStruct->hpScale = 0; else if (result > 39) gBattleStruct->hpScale = 1; else if (result > 9) gBattleStruct->hpScale = 2; else gBattleStruct->hpScale = 3; } gBattlescriptCurrInstr += 2; } static void Cmd_hpthresholds2(void) { u8 opposingBattler; s32 result; u8 hpSwitchout; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); opposingBattler = gActiveBattler ^ BIT_SIDE; hpSwitchout = *(gBattleStruct->hpOnSwitchout + GetBattlerSide(opposingBattler)); result = (hpSwitchout - gBattleMons[opposingBattler].hp) * 100 / hpSwitchout; if (gBattleMons[opposingBattler].hp >= hpSwitchout) gBattleStruct->hpScale = 0; else if (result <= 29) gBattleStruct->hpScale = 1; else if (result <= 69) gBattleStruct->hpScale = 2; else gBattleStruct->hpScale = 3; } gBattlescriptCurrInstr += 2; } static void Cmd_useitemonopponent(void) { gBattlerInMenuId = gBattlerAttacker; PokemonUseItemEffects(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]], gLastUsedItem, gBattlerPartyIndexes[gBattlerAttacker], 0, TRUE); gBattlescriptCurrInstr++; } static void Cmd_various(void) { u8 side; s32 i; u32 monToCheck, status; u16 species; u8 abilityNum; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); switch (gBattlescriptCurrInstr[2]) { case VARIOUS_CANCEL_MULTI_TURN_MOVES: CancelMultiTurnMoves(gActiveBattler); break; case VARIOUS_SET_MAGIC_COAT_TARGET: gBattlerAttacker = gBattlerTarget; side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer != 0 && gBattleMons[gSideTimers[side].followmeTarget].hp != 0) gBattlerTarget = gSideTimers[side].followmeTarget; else gBattlerTarget = gActiveBattler; break; case VARIOUS_IS_RUNNING_IMPOSSIBLE: gBattleCommunication[0] = IsRunningFromBattleImpossible(); break; case VARIOUS_GET_MOVE_TARGET: gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); break; case VARIOUS_GET_BATTLER_FAINTED: if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) gBattleCommunication[0] = TRUE; else gBattleCommunication[0] = FALSE; break; case VARIOUS_RESET_INTIMIDATE_TRACE_BITS: gSpecialStatuses[gActiveBattler].intimidatedMon = 0; gSpecialStatuses[gActiveBattler].traced = 0; break; case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP: if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId || gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) { u16 *choicedMove; if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId) gActiveBattler = 0; else gActiveBattler = 2; choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gActiveBattler].moves[i] == *choicedMove) break; } if (i == MAX_MON_MOVES) *choicedMove = MOVE_NONE; } break; case VARIOUS_RESET_PLAYER_FAINTED: if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE)) && gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattleMons[0].hp != 0 && gBattleMons[1].hp != 0) { gHitMarker &= ~HITMARKER_PLAYER_FAINTED; } break; case VARIOUS_GET_BATTLERS_FOR_RECALL: i = 0; // redundant gBattleCommunication[MULTISTRING_CHOOSER] = 0; gActiveBattler = 1; for (i = 0; gActiveBattler < MAX_BATTLERS_COUNT; gActiveBattler += 2) { if (gActiveBattler < gBattlersCount && gBattleMons[gActiveBattler].hp != 0) gBattleCommunication[MULTISTRING_CHOOSER] |= gBitTable[i]; i++; } break; case VARIOUS_RETURN_OPPONENT_MON1: gActiveBattler = 1; if (gBattleMons[gActiveBattler].hp != 0) { BtlController_EmitReturnMonToBall(BUFFER_A, FALSE); MarkBattlerForControllerExec(gActiveBattler); } break; case VARIOUS_RETURN_OPPONENT_MON2: if (gBattlersCount > 3) { gActiveBattler = 3; if (gBattleMons[gActiveBattler].hp != 0) { BtlController_EmitReturnMonToBall(BUFFER_A, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } break; case VARIOUS_CHECK_POKEFLUTE: gBattleCommunication[MULTISTRING_CHOOSER] = 0; monToCheck = 0; for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability != ABILITY_SOUNDPROOF) { gBattleMons[i].status1 &= ~STATUS1_SLEEP; gBattleMons[i].status2 &= ~STATUS2_NIGHTMARE; } } for (i = 0; i < PARTY_SIZE; i++) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); abilityNum = GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM); status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); if (species != SPECIES_NONE && species != SPECIES_EGG && status & AILMENT_FNT && GetAbilityBySpecies(species, abilityNum) != ABILITY_SOUNDPROOF) monToCheck |= (1 << i); } if (monToCheck) { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); status = 0; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, monToCheck, 4, &status); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[MULTISTRING_CHOOSER] = 1; } monToCheck = 0; for (i = 0; i < PARTY_SIZE; i++) { species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG); abilityNum = GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM); status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); if (species != SPECIES_NONE && species != SPECIES_EGG && status & AILMENT_FNT && GetAbilityBySpecies(species, abilityNum) != ABILITY_SOUNDPROOF) monToCheck |= (1 << i); } if (monToCheck) { gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); status = 0; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, monToCheck, 4, &status); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[5] = 1; } break; case VARIOUS_WAIT_FANFARE: if (!IsFanfareTaskInactive()) return; break; } gBattlescriptCurrInstr += 3; } // Protect and Endure static void Cmd_setprotectlike(void) { bool8 notLastTurn = TRUE; u16 lastMove = gLastResultingMoves[gBattlerAttacker]; if (lastMove != MOVE_PROTECT && lastMove != MOVE_DETECT && lastMove != MOVE_ENDURE) gDisableStructs[gBattlerAttacker].protectUses = 0; if (gCurrentTurnActionNumber == (gBattlersCount - 1)) notLastTurn = FALSE; if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= Random() && notLastTurn) { if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) { gProtectStructs[gBattlerAttacker].protected = 1; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) { gProtectStructs[gBattlerAttacker].endured = 1; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF; } gDisableStructs[gBattlerAttacker].protectUses++; } else { gDisableStructs[gBattlerAttacker].protectUses = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECT_FAILED; gMoveResultFlags |= MOVE_RESULT_MISSED; } gBattlescriptCurrInstr++; } static void Cmd_tryexplosion(void) { if (gBattleControllerExecFlags) return; // Explosion can only fail if any battler has Damp for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { if (gBattleMons[gBattlerTarget].ability == ABILITY_DAMP) break; } if (gBattlerTarget == gBattlersCount) { // Success, no battlers with Damp. Drop user's HP bar to 0 gActiveBattler = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gActiveBattler].hp; BtlController_EmitHealthBarUpdate(BUFFER_A, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; // Find first target for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { if (gBattlerTarget == gBattlerAttacker) continue; if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) break; } } else { // Failed, a battler has Damp gLastUsedAbility = ABILITY_DAMP; RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; } } static void Cmd_setatkhptozero(void) { if (gBattleControllerExecFlags) return; gActiveBattler = gBattlerAttacker; gBattleMons[gActiveBattler].hp = 0; BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; } static void Cmd_jumpifnexttargetvalid(void) { const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { for (gBattlerTarget++; ; gBattlerTarget++) { if (gBattlerTarget == gBattlerAttacker) continue; if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) break; } if (gBattlerTarget >= gBattlersCount) gBattlescriptCurrInstr += 5; else gBattlescriptCurrInstr = jumpPtr; } else { gBattlescriptCurrInstr += 5; } } static void Cmd_tryhealhalfhealth(void) { const u8 *failPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gBattlescriptCurrInstr[5] == BS_ATTACKER) gBattlerTarget = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = failPtr; else gBattlescriptCurrInstr += 6; } static void Cmd_trymirrormove(void) { s32 validMovesCount; s32 i; u16 move; u16 validMoves[MAX_BATTLERS_COUNT - 1]; for (i = 0; i < (MAX_BATTLERS_COUNT - 1); i++) // -1 to exclude the user validMoves[i] = MOVE_NONE; for (validMovesCount = 0, i = 0; i < gBattlersCount; i++) { if (i != gBattlerAttacker) { move = T1_READ_16(i * 2 + gBattlerAttacker * 8 + gBattleStruct->lastTakenMoveFrom); if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) { validMoves[validMovesCount] = move; validMovesCount++; } } } move = T1_READ_16(gBattleStruct->lastTakenMove + gBattlerAttacker * 2); move++;move--; // why? if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) { gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gCurrentMove = move; gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; } else if (validMovesCount != 0) { gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; i = Random() % validMovesCount; gCurrentMove = validMoves[i]; gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; } else // no valid moves found { gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE; gBattlescriptCurrInstr++; } } static void Cmd_setrain(void) { if (gBattleWeather & B_WEATHER_RAIN) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = B_WEATHER_RAIN_TEMPORARY; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_RAIN; gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; } static void Cmd_setreflect(void) { if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_REFLECT) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_REFLECT; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; } gBattlescriptCurrInstr++; } static void Cmd_setseeded(void) { if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_MISS; } else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS)) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_FAIL; } else { gStatuses3[gBattlerTarget] |= gBattlerAttacker; gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_SET; } gBattlescriptCurrInstr++; } static void Cmd_manipulatedamage(void) { switch (gBattlescriptCurrInstr[1]) { case DMG_CHANGE_SIGN: gBattleMoveDamage *= -1; break; case DMG_RECOIL_FROM_MISS: gBattleMoveDamage /= 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage) gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; break; case DMG_DOUBLED: gBattleMoveDamage *= 2; break; } gBattlescriptCurrInstr += 2; } static void Cmd_trysetrest(void) { const u8 *failJump = T1_READ_PTR(gBattlescriptCurrInstr + 1); gActiveBattler = gBattlerTarget = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP * (-1); if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) { gBattlescriptCurrInstr = failJump; } else { if (gBattleMons[gBattlerTarget].status1 & ((u8)(~STATUS1_SLEEP))) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST_STATUSED; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST; gBattleMons[gBattlerTarget].status1 = STATUS1_SLEEP_TURN(3); BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } } static void Cmd_jumpifnotfirstturn(void) { const u8 *failJump = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gDisableStructs[gBattlerAttacker].isFirstTurn) gBattlescriptCurrInstr += 5; else gBattlescriptCurrInstr = failJump; } static void Cmd_nop(void) { gBattlescriptCurrInstr++; } bool8 UproarWakeUpCheck(u8 battlerId) { s32 i; for (i = 0; i < gBattlersCount; i++) { if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[battlerId].ability == ABILITY_SOUNDPROOF) continue; gBattleScripting.battler = i; if (gBattlerTarget == 0xFF) gBattlerTarget = i; else if (gBattlerTarget == i) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_SLEEP_UPROAR; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_KEPT_AWAKE; break; } if (i == gBattlersCount) return FALSE; else return TRUE; } static void Cmd_jumpifcantmakeasleep(void) { const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (UproarWakeUpCheck(gBattlerTarget)) { gBattlescriptCurrInstr = jumpPtr; } else if (gBattleMons[gBattlerTarget].ability == ABILITY_INSOMNIA || gBattleMons[gBattlerTarget].ability == ABILITY_VITAL_SPIRIT) { gLastUsedAbility = gBattleMons[gBattlerTarget].ability; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAYED_AWAKE_USING; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else { gBattlescriptCurrInstr += 5; } } static void Cmd_stockpile(void) { if (gDisableStructs[gBattlerAttacker].stockpileCounter == 3) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_STOCKPILE; } else { gDisableStructs[gBattlerAttacker].stockpileCounter++; PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STOCKPILED; } gBattlescriptCurrInstr++; } static void Cmd_stockpiletobasedamage(void) { const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0) { gBattlescriptCurrInstr = jumpPtr; } else { if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) { gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0, 0, gBattlerAttacker, gBattlerTarget) * gDisableStructs[gBattlerAttacker].stockpileCounter; gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; if (gProtectStructs[gBattlerAttacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; } gDisableStructs[gBattlerAttacker].stockpileCounter = 0; gBattlescriptCurrInstr += 5; } } static void Cmd_stockpiletohpheal(void) { const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0) { gBattlescriptCurrInstr = jumpPtr; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FAILED; } else if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) { gDisableStructs[gBattlerAttacker].stockpileCounter = 0; gBattlescriptCurrInstr = jumpPtr; gBattlerTarget = gBattlerAttacker; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FULL_HP; } else { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; gDisableStructs[gBattlerAttacker].stockpileCounter = 0; gBattlescriptCurrInstr += 5; gBattlerTarget = gBattlerAttacker; } } static void Cmd_negativedamage(void) { gBattleMoveDamage = -(gHpDealt / 2); if (gBattleMoveDamage == 0) gBattleMoveDamage = -1; gBattlescriptCurrInstr++; } #define STAT_CHANGE_WORKED 0 #define STAT_CHANGE_DIDNT_WORK 1 static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) { bool8 certain = FALSE; bool8 notProtectAffected = FALSE; u32 index; if (flags & MOVE_EFFECT_AFFECTS_USER) gActiveBattler = gBattlerAttacker; else gActiveBattler = gBattlerTarget; flags &= ~MOVE_EFFECT_AFFECTS_USER; if (flags & MOVE_EFFECT_CERTAIN) certain++; flags &= ~MOVE_EFFECT_CERTAIN; if (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED) notProtectAffected++; flags &= ~STAT_CHANGE_NOT_PROTECT_AFFECTED; PREPARE_STAT_BUFFER(gBattleTextBuff1, statId) if (statValue <= -1) // Stat decrease. { if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer && !certain && gCurrentMove != MOVE_CURSE) { if (flags == STAT_CHANGE_ALLOW_PTR) { if (gSpecialStatuses[gActiveBattler].statLowered) { gBattlescriptCurrInstr = BS_ptr; } else { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; gBattlescriptCurrInstr = BattleScript_MistProtected; gSpecialStatuses[gActiveBattler].statLowered = 1; } } return STAT_CHANGE_DIDNT_WORK; } else if (gCurrentMove != MOVE_CURSE && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(0)) { gBattlescriptCurrInstr = BattleScript_ButItFailed; return STAT_CHANGE_DIDNT_WORK; } else if ((gBattleMons[gActiveBattler].ability == ABILITY_CLEAR_BODY || gBattleMons[gActiveBattler].ability == ABILITY_WHITE_SMOKE) && !certain && gCurrentMove != MOVE_CURSE) { if (flags == STAT_CHANGE_ALLOW_PTR) { if (gSpecialStatuses[gActiveBattler].statLowered) { gBattlescriptCurrInstr = BS_ptr; } else { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; gLastUsedAbility = gBattleMons[gActiveBattler].ability; RecordAbilityBattle(gActiveBattler, gLastUsedAbility); gSpecialStatuses[gActiveBattler].statLowered = 1; } } return STAT_CHANGE_DIDNT_WORK; } else if (gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE && !certain && statId == STAT_ACC) { if (flags == STAT_CHANGE_ALLOW_PTR) { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; gLastUsedAbility = gBattleMons[gActiveBattler].ability; RecordAbilityBattle(gActiveBattler, gLastUsedAbility); } return STAT_CHANGE_DIDNT_WORK; } else if (gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER && !certain && statId == STAT_ATK) { if (flags == STAT_CHANGE_ALLOW_PTR) { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; gLastUsedAbility = gBattleMons[gActiveBattler].ability; RecordAbilityBattle(gActiveBattler, gLastUsedAbility); } return STAT_CHANGE_DIDNT_WORK; } else if (gBattleMons[gActiveBattler].ability == ABILITY_SHIELD_DUST && flags == 0) { return STAT_CHANGE_DIDNT_WORK; } else // try to decrease { statValue = -GET_STAT_BUFF_VALUE(statValue); gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; if (statValue == -2) { gBattleTextBuff2[1] = B_BUFF_STRING; gBattleTextBuff2[2] = STRINGID_STATHARSHLY; gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; index = 4; } gBattleTextBuff2[index++] = B_BUFF_STRING; gBattleTextBuff2[index++] = STRINGID_STATFELL; gBattleTextBuff2[index++] = STRINGID_STATFELL >> 8; gBattleTextBuff2[index] = B_BUFF_EOS; if (gBattleMons[gActiveBattler].statStages[statId] == MIN_STAT_STAGE) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_DECREASE; else gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); // B_MSG_ATTACKER_STAT_FELL or B_MSG_DEFENDER_STAT_FELL } } else // stat increase { statValue = GET_STAT_BUFF_VALUE(statValue); gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; if (statValue == 2) { gBattleTextBuff2[1] = B_BUFF_STRING; gBattleTextBuff2[2] = STRINGID_STATSHARPLY; gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; index = 4; } gBattleTextBuff2[index++] = B_BUFF_STRING; gBattleTextBuff2[index++] = STRINGID_STATROSE; gBattleTextBuff2[index++] = STRINGID_STATROSE >> 8; gBattleTextBuff2[index] = B_BUFF_EOS; if (gBattleMons[gActiveBattler].statStages[statId] == MAX_STAT_STAGE) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_INCREASE; else gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); // B_MSG_ATTACKER_STAT_ROSE or B_MSG_DEFENDER_STAT_ROSE } gBattleMons[gActiveBattler].statStages[statId] += statValue; if (gBattleMons[gActiveBattler].statStages[statId] < MIN_STAT_STAGE) gBattleMons[gActiveBattler].statStages[statId] = MIN_STAT_STAGE; if (gBattleMons[gActiveBattler].statStages[statId] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[statId] = MAX_STAT_STAGE; if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && flags & STAT_CHANGE_ALLOW_PTR) gMoveResultFlags |= MOVE_RESULT_MISSED; if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && !(flags & STAT_CHANGE_ALLOW_PTR)) return STAT_CHANGE_DIDNT_WORK; return STAT_CHANGE_WORKED; } static void Cmd_statbuffchange(void) { const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2); if (ChangeStatBuffs(gBattleScripting.statChanger & 0xF0, GET_STAT_BUFF_ID(gBattleScripting.statChanger), gBattlescriptCurrInstr[1], jumpPtr) == STAT_CHANGE_WORKED) gBattlescriptCurrInstr += 6; } // Haze static void Cmd_normalisebuffs(void) { s32 i, j; for (i = 0; i < gBattlersCount; i++) { for (j = 0; j < NUM_BATTLE_STATS; j++) gBattleMons[i].statStages[j] = DEFAULT_STAT_STAGE; } gBattlescriptCurrInstr++; } static void Cmd_setbide(void) { gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gBattlerAttacker] = gCurrentMove; gTakenDmg[gBattlerAttacker] = 0; gBattleMons[gBattlerAttacker].status2 |= STATUS2_BIDE_TURN(2); gBattlescriptCurrInstr++; } static void Cmd_confuseifrepeatingattackends(void) { if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE)) gBattleCommunication[MOVE_EFFECT_BYTE] = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER); gBattlescriptCurrInstr++; } static void Cmd_setmultihitcounter(void) { if (gBattlescriptCurrInstr[1]) { gMultiHitCounter = gBattlescriptCurrInstr[1]; } else { gMultiHitCounter = Random() & 3; if (gMultiHitCounter > 1) gMultiHitCounter = (Random() & 3) + 2; else gMultiHitCounter += 2; } gBattlescriptCurrInstr += 2; } static void Cmd_initmultihitstring(void) { PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) gBattlescriptCurrInstr++; } static bool8 TryDoForceSwitchOut(void) { if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) { *(gBattleStruct->battlerPartyIndexes + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget]; } else { u16 random = Random() & 0xFF; if ((u32)((random * (gBattleMons[gBattlerAttacker].level + gBattleMons[gBattlerTarget].level) >> 8) + 1) <= (gBattleMons[gBattlerTarget].level / 4)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); return FALSE; } *(gBattleStruct->battlerPartyIndexes + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget]; } gBattlescriptCurrInstr = BattleScript_SuccessForceOut; return TRUE; } #define MON_CAN_BATTLE(mon) (((GetMonData(mon, MON_DATA_SPECIES) && GetMonData(mon, MON_DATA_IS_EGG) != TRUE && GetMonData(mon, MON_DATA_HP)))) static void Cmd_forcerandomswitch(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { u32 i; struct Pokemon *party; u8 valid; u8 val; if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { valid = 0; val = 0; if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == 1) val = PARTY_SIZE / 2; for (i = val; i < val + (PARTY_SIZE / 2); i++) { if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) && GetMonData(&party[i], MON_DATA_HP) != 0) ++valid; } } else { valid = 0; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) && GetMonData(&party[i], MON_DATA_HP) != 0) ++valid; } } // Fails if there's only 1 mon left in single battle or there's less than 3 left in non-multi double battle. if ((valid < 2 && (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) || (valid < 3 && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else if (TryDoForceSwitchOut()) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { do { val = Random() % (PARTY_SIZE / 2); if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == 1) i = val + (PARTY_SIZE / 2); else i = val; } while (i == gBattlerPartyIndexes[gBattlerTarget] || i == gBattlerPartyIndexes[gBattlerTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); } else { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { do { i = Random() % PARTY_SIZE; } while (i == gBattlerPartyIndexes[gBattlerTarget] || i == gBattlerPartyIndexes[gBattlerTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); } else { do { i = Random() % PARTY_SIZE; } while (i == gBattlerPartyIndexes[gBattlerTarget] || !MON_CAN_BATTLE(&party[i])); } } *(gBattleStruct->monToSwitchIntoId + gBattlerTarget) = i; if (!IsMultiBattle()) UpdatePartyOwnerOnSwitch_NonMulti(gBattlerTarget); SwitchPartyOrderLinkMulti(gBattlerTarget, i, 0); SwitchPartyOrderLinkMulti(gBattlerTarget ^ BIT_FLANK, i, 1); } } else { TryDoForceSwitchOut(); } } // Randomly changes user's type to one of its moves' type static void Cmd_tryconversiontypechange(void) { u8 validMoves = 0; u8 moveChecked; u8 moveType; while (validMoves < MAX_MON_MOVES) { if (gBattleMons[gBattlerAttacker].moves[validMoves] == MOVE_NONE) break; validMoves++; } for (moveChecked = 0; moveChecked < validMoves; moveChecked++) { moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; if (moveType == TYPE_MYSTERY) { if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) moveType = TYPE_GHOST; else moveType = TYPE_NORMAL; } if (moveType != gBattleMons[gBattlerAttacker].type1 && moveType != gBattleMons[gBattlerAttacker].type2) { break; } } if (moveChecked == validMoves) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { do { while ((moveChecked = Random() & (MAX_MON_MOVES - 1)) >= validMoves); moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; if (moveType == TYPE_MYSTERY) { if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) moveType = TYPE_GHOST; else moveType = TYPE_NORMAL; } } while (moveType == gBattleMons[gBattlerAttacker].type1 || moveType == gBattleMons[gBattlerAttacker].type2); SET_BATTLER_TYPE(gBattlerAttacker, moveType); PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); gBattlescriptCurrInstr += 5; } } static void Cmd_givepaydaymoney(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney != 0) { u32 bonusMoney = gPaydayMoney * gBattleStruct->moneyMultiplier; AddMoney(&gSaveBlock1Ptr->money, bonusMoney); PREPARE_HWORD_NUMBER_BUFFER(gBattleTextBuff1, 5, bonusMoney) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString; } else { gBattlescriptCurrInstr++; } } static void Cmd_setlightscreen(void) { if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_LIGHTSCREEN) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_LIGHTSCREEN; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; } gBattlescriptCurrInstr++; } static void Cmd_tryKO(void) { u8 holdEffect, param; if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) { holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; param = gEnigmaBerries[gBattlerTarget].holdEffectParam; } else { holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) { RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_FOCUS_BAND); gSpecialStatuses[gBattlerTarget].focusBanded = 1; } if (gBattleMons[gBattlerTarget].ability == ABILITY_STURDY) { gMoveResultFlags |= MOVE_RESULT_MISSED; gLastUsedAbility = ABILITY_STURDY; gBattlescriptCurrInstr = BattleScript_SturdyPreventsOHKO; RecordAbilityBattle(gBattlerTarget, ABILITY_STURDY); } else { u16 chance; if (!(gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS)) { chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); if (Random() % 100 + 1 < chance && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) chance = TRUE; else chance = FALSE; } else if (gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) { chance = TRUE; } else { chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); if (Random() % 100 + 1 < chance && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) chance = TRUE; else chance = FALSE; } if (chance) { if (gProtectStructs[gBattlerTarget].endured) { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; } else if (gSpecialStatuses[gBattlerTarget].focusBanded) { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; gLastUsedItem = gBattleMons[gBattlerTarget].item; } else { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp; gMoveResultFlags |= MOVE_RESULT_ONE_HIT_KO; } gBattlescriptCurrInstr += 5; } else { gMoveResultFlags |= MOVE_RESULT_MISSED; if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_MISS; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } } // Super Fang static void Cmd_damagetohalftargethp(void) { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattlescriptCurrInstr++; } static void Cmd_setsandstorm(void) { if (gBattleWeather & B_WEATHER_SANDSTORM) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = B_WEATHER_SANDSTORM_TEMPORARY; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SANDSTORM; gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; } static void Cmd_weatherdamage(void) { if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags) && (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT)) { gBattleMoveDamage = 0; gBattlescriptCurrInstr++; return; } if (WEATHER_HAS_EFFECT) { if (gBattleWeather & B_WEATHER_SANDSTORM) { if (gBattleMons[gBattlerAttacker].type1 != TYPE_ROCK && gBattleMons[gBattlerAttacker].type1 != TYPE_STEEL && gBattleMons[gBattlerAttacker].type1 != TYPE_GROUND && gBattleMons[gBattlerAttacker].type2 != TYPE_ROCK && gBattleMons[gBattlerAttacker].type2 != TYPE_STEEL && gBattleMons[gBattlerAttacker].type2 != TYPE_GROUND && gBattleMons[gBattlerAttacker].ability != ABILITY_SAND_VEIL && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } else { gBattleMoveDamage = 0; } } if (gBattleWeather & B_WEATHER_HAIL) { if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE) && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } else { gBattleMoveDamage = 0; } } } else { gBattleMoveDamage = 0; } if (gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) gBattleMoveDamage = 0; gBattlescriptCurrInstr++; } static void Cmd_tryinfatuating(void) { struct Pokemon *monAttacker, *monTarget; u16 speciesAttacker, speciesTarget; u32 personalityAttacker, personalityTarget; if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) monAttacker = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]; else monAttacker = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]]; if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) monTarget = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]; else monTarget = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]; speciesAttacker = GetMonData(monAttacker, MON_DATA_SPECIES); personalityAttacker = GetMonData(monAttacker, MON_DATA_PERSONALITY); speciesTarget = GetMonData(monTarget, MON_DATA_SPECIES); personalityTarget = GetMonData(monTarget, MON_DATA_PERSONALITY); if (gBattleMons[gBattlerTarget].ability == ABILITY_OBLIVIOUS) { gBattlescriptCurrInstr = BattleScript_ObliviousPreventsAttraction; gLastUsedAbility = ABILITY_OBLIVIOUS; RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS); } else { if (GetGenderFromSpeciesAndPersonality(speciesAttacker, personalityAttacker) == GetGenderFromSpeciesAndPersonality(speciesTarget, personalityTarget) || gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION || GetGenderFromSpeciesAndPersonality(speciesAttacker, personalityAttacker) == MON_GENDERLESS || GetGenderFromSpeciesAndPersonality(speciesTarget, personalityTarget) == MON_GENDERLESS) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); gBattlescriptCurrInstr += 5; } } } static void Cmd_updatestatusicon(void) { if (gBattleControllerExecFlags) return; if (gBattlescriptCurrInstr[1] == BS_PLAYER2) { for (gActiveBattler = gBattleControllerExecFlags; gActiveBattler < gBattlersCount; gActiveBattler++) { if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } } gBattlescriptCurrInstr += 2; } else if (gBattlescriptCurrInstr[1] == BS_ATTACKER_WITH_PARTNER) { gActiveBattler = gBattlerAttacker; if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } } gBattlescriptCurrInstr += 2; } else { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } } static void Cmd_setmist(void) { if (gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer) { gMoveResultFlags |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MIST_FAILED; } else { gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistBattlerId = gBattlerAttacker; gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_MIST; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST; } gBattlescriptCurrInstr++; } static void Cmd_setfocusenergy(void) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) { gMoveResultFlags |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED; } else { gBattleMons[gBattlerAttacker].status2 |= STATUS2_FOCUS_ENERGY; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } gBattlescriptCurrInstr++; } static void Cmd_transformdataexecution(void) { gChosenMove = MOVE_UNAVAILABLE; gBattlescriptCurrInstr++; if (gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE) { gMoveResultFlags |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORM_FAILED; } else { s32 i; u8 *battleMonAttacker, *battleMonTarget; gBattleMons[gBattlerAttacker].status2 |= STATUS2_TRANSFORMED; gDisableStructs[gBattlerAttacker].disabledMove = MOVE_NONE; gDisableStructs[gBattlerAttacker].disableTimer = 0; gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; gDisableStructs[gBattlerAttacker].mimickedMoves = 0; PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species) battleMonAttacker = (u8 *)(&gBattleMons[gBattlerAttacker]); battleMonTarget = (u8 *)(&gBattleMons[gBattlerTarget]); for (i = 0; i < offsetof(struct BattlePokemon, pp); i++) battleMonAttacker[i] = battleMonTarget[i]; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp < 5) gBattleMons[gBattlerAttacker].pp[i] = gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp; else gBattleMons[gBattlerAttacker].pp[i] = 5; } gActiveBattler = gBattlerAttacker; BtlController_EmitResetActionMoveSelection(BUFFER_A, RESET_MOVE_SELECTION); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORMED; } } static void Cmd_setsubstitute(void) { u32 hp = gBattleMons[gBattlerAttacker].maxHP / 4; if (gBattleMons[gBattlerAttacker].maxHP / 4 == 0) hp = 1; if (gBattleMons[gBattlerAttacker].hp <= hp) { gBattleMoveDamage = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SUBSTITUTE_FAILED; } else { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; // one bit value will only work for pokemon which max hp can go to 1020(which is more than possible in games) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMons[gBattlerAttacker].status2 |= STATUS2_SUBSTITUTE; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; gDisableStructs[gBattlerAttacker].substituteHP = gBattleMoveDamage; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SUBSTITUTE; gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; } gBattlescriptCurrInstr++; } static bool8 IsMoveUncopyableByMimic(u16 move) { s32 i; for (i = 0; sMovesForbiddenToCopy[i] != MIMIC_FORBIDDEN_END && sMovesForbiddenToCopy[i] != move; i++); return (sMovesForbiddenToCopy[i] != MIMIC_FORBIDDEN_END); } static void Cmd_mimicattackcopy(void) { gChosenMove = MOVE_UNAVAILABLE; if (IsMoveUncopyableByMimic(gLastMoves[gBattlerTarget]) || gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED || gLastMoves[gBattlerTarget] == MOVE_NONE || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { int i; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] == gLastMoves[gBattlerTarget]) break; } if (i == MAX_MON_MOVES) { gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget]; if (gBattleMoves[gLastMoves[gBattlerTarget]].pp < 5) gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastMoves[gBattlerTarget]].pp; else gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 5; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) gDisableStructs[gBattlerAttacker].mimickedMoves |= gBitTable[gCurrMovePos]; gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } } static void Cmd_metronome(void) { while (TRUE) { s32 i; gCurrentMove = (Random() & 0x1FF) + 1; if (gCurrentMove >= MOVES_COUNT) continue; for (i = 0; i < MAX_MON_MOVES; i++); // ? i = -1; while (TRUE) { i++; if (sMovesForbiddenToCopy[i] == gCurrentMove) break; if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) break; } if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) { gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); return; } } } static void Cmd_dmgtolevel(void) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].level; gBattlescriptCurrInstr++; } static void Cmd_psywavedamageeffect(void) { s32 randDamage; while ((randDamage = Random() % 16) > 10); randDamage *= 10; gBattleMoveDamage = gBattleMons[gBattlerAttacker].level * (randDamage + 50) / 100; gBattlescriptCurrInstr++; } static void Cmd_counterdamagecalculator(void) { u8 sideAttacker = GetBattlerSide(gBattlerAttacker); u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId); if (gProtectStructs[gBattlerAttacker].physicalDmg && sideAttacker != sideTarget && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) { gBattleMoveDamage = gProtectStructs[gBattlerAttacker].physicalDmg * 2; if (gSideTimers[sideTarget].followmeTimer && gBattleMons[gSideTimers[sideTarget].followmeTarget].hp) gBattlerTarget = gSideTimers[sideTarget].followmeTarget; else gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId; gBattlescriptCurrInstr += 5; } else { gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } // A copy of Cmd_counterdamagecalculator with the physical -> special field changes static void Cmd_mirrorcoatdamagecalculator(void) { u8 sideAttacker = GetBattlerSide(gBattlerAttacker); u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId); if (gProtectStructs[gBattlerAttacker].specialDmg && sideAttacker != sideTarget && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) { gBattleMoveDamage = gProtectStructs[gBattlerAttacker].specialDmg * 2; if (gSideTimers[sideTarget].followmeTimer && gBattleMons[gSideTimers[sideTarget].followmeTarget].hp) gBattlerTarget = gSideTimers[sideTarget].followmeTarget; else gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId; gBattlescriptCurrInstr += 5; } else { gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_disablelastusedattack(void) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) break; } if (gDisableStructs[gBattlerTarget].disabledMove == MOVE_NONE && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) { PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i]) gDisableStructs[gBattlerTarget].disabledMove = gBattleMons[gBattlerTarget].moves[i]; gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 2; gDisableStructs[gBattlerTarget].disableTimerStartValue = gDisableStructs[gBattlerTarget].disableTimer; // used to save the random amount of turns? gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_trysetencore(void) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) break; } if (gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_ENCORE || gLastMoves[gBattlerTarget] == MOVE_MIRROR_MOVE) { i = MAX_MON_MOVES; } if (gDisableStructs[gBattlerTarget].encoredMove == MOVE_NONE && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) { gDisableStructs[gBattlerTarget].encoredMove = gBattleMons[gBattlerTarget].moves[i]; gDisableStructs[gBattlerTarget].encoredMovePos = i; gDisableStructs[gBattlerTarget].encoreTimer = (Random() & 3) + 3; gDisableStructs[gBattlerTarget].encoreTimerStartValue = gDisableStructs[gBattlerTarget].encoreTimer; gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_painsplitdmgcalc(void) { if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)) { s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + gBattleMons[gBattlerTarget].hp) / 2; s32 painSplitHp = gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - hpDiff; u8 *storeLoc = (void *)(&gBattleScripting.painSplitHp); storeLoc[0] = (painSplitHp); storeLoc[1] = (painSplitHp & 0x0000FF00) >> 8; storeLoc[2] = (painSplitHp & 0x00FF0000) >> 16; storeLoc[3] = (painSplitHp & 0xFF000000) >> 24; gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp - hpDiff; gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF; gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } // Conversion 2 static void Cmd_settypetorandomresistance(void) { if (gLastLandedMoves[gBattlerAttacker] == MOVE_NONE || gLastLandedMoves[gBattlerAttacker] == MOVE_UNAVAILABLE) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else if (IsTwoTurnsMove(gLastLandedMoves[gBattlerAttacker]) && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { s32 i, j, rands; for (rands = 0; rands < 1000; rands++) { while (((i = Random() % 128) > sizeof(gTypeEffectiveness) / 3)); i *= 3; if (TYPE_EFFECT_ATK_TYPE(i) == gLastHitByType[gBattlerAttacker] && TYPE_EFFECT_MULTIPLIER(i) <= TYPE_MUL_NOT_EFFECTIVE && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i))) { SET_BATTLER_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i)); PREPARE_TYPE_BUFFER(gBattleTextBuff1, TYPE_EFFECT_DEF_TYPE(i)); gBattlescriptCurrInstr += 5; return; } } for (j = 0, rands = 0; rands < sizeof(gTypeEffectiveness); j += 3, rands += 3) { switch (TYPE_EFFECT_ATK_TYPE(j)) { case TYPE_ENDTABLE: case TYPE_FORESIGHT: break; default: if (TYPE_EFFECT_ATK_TYPE(j) == gLastHitByType[gBattlerAttacker] && TYPE_EFFECT_MULTIPLIER(j) <= 5 && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i))) { SET_BATTLER_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(rands)); PREPARE_TYPE_BUFFER(gBattleTextBuff1, TYPE_EFFECT_DEF_TYPE(rands)) gBattlescriptCurrInstr += 5; return; } break; } } gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_setalwayshitflag(void) { gStatuses3[gBattlerTarget] &= ~STATUS3_ALWAYS_HITS; gStatuses3[gBattlerTarget] |= STATUS3_ALWAYS_HITS_TURN(2); gDisableStructs[gBattlerTarget].battlerWithSureHit = gBattlerAttacker; gBattlescriptCurrInstr++; } // Sketch static void Cmd_copymovepermanently(void) { gChosenMove = MOVE_UNAVAILABLE; if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) && gLastPrintedMoves[gBattlerTarget] != MOVE_STRUGGLE && gLastPrintedMoves[gBattlerTarget] != MOVE_NONE && gLastPrintedMoves[gBattlerTarget] != MOVE_UNAVAILABLE && gLastPrintedMoves[gBattlerTarget] != MOVE_SKETCH) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] == MOVE_SKETCH) continue; if (gBattleMons[gBattlerAttacker].moves[i] == gLastPrintedMoves[gBattlerTarget]) break; } if (i != MAX_MON_MOVES) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else // sketch worked { struct MovePpInfo movePpData; gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastPrintedMoves[gBattlerTarget]; gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastPrintedMoves[gBattlerTarget]].pp; gActiveBattler = gBattlerAttacker; for (i = 0; i < MAX_MON_MOVES; i++) { movePpData.moves[i] = gBattleMons[gBattlerAttacker].moves[i]; movePpData.pp[i] = gBattleMons[gBattlerAttacker].pp[i]; } movePpData.ppBonuses = gBattleMons[gBattlerAttacker].ppBonuses; BtlController_EmitSetMonData(BUFFER_A, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); MarkBattlerForControllerExec(gActiveBattler); PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBattlerTarget]) gBattlescriptCurrInstr += 5; } } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static bool8 IsTwoTurnsMove(u16 move) { if (gBattleMoves[move].effect == EFFECT_SKULL_BASH || gBattleMoves[move].effect == EFFECT_RAZOR_WIND || gBattleMoves[move].effect == EFFECT_SKY_ATTACK || gBattleMoves[move].effect == EFFECT_SOLAR_BEAM || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE || gBattleMoves[move].effect == EFFECT_BIDE) return TRUE; else return FALSE; } static bool8 IsInvalidForSleepTalkOrAssist(u16 move) { if (move == MOVE_NONE || move == MOVE_SLEEP_TALK || move == MOVE_ASSIST || move == MOVE_MIRROR_MOVE || move == MOVE_METRONOME) return TRUE; else return FALSE; } static u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a charging turn, otherwise 2 { // first argument is unused if (gBattleMoves[move].effect == EFFECT_SOLAR_BEAM && (gBattleWeather & B_WEATHER_SUN)) return 2; if (gBattleMoves[move].effect == EFFECT_SKULL_BASH || gBattleMoves[move].effect == EFFECT_RAZOR_WIND || gBattleMoves[move].effect == EFFECT_SKY_ATTACK || gBattleMoves[move].effect == EFFECT_SOLAR_BEAM || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE || gBattleMoves[move].effect == EFFECT_BIDE) { if ((gHitMarker & HITMARKER_CHARGING)) return 1; } return 2; } static void Cmd_trychoosesleeptalkmove(void) { s32 i; u8 unusableMovesBits = 0; for (i = 0; i < MAX_MON_MOVES; i++) { if (IsInvalidForSleepTalkOrAssist(gBattleMons[gBattlerAttacker].moves[i]) || gBattleMons[gBattlerAttacker].moves[i] == MOVE_FOCUS_PUNCH || gBattleMons[gBattlerAttacker].moves[i] == MOVE_UPROAR || IsTwoTurnsMove(gBattleMons[gBattlerAttacker].moves[i])) { unusableMovesBits |= gBitTable[i]; } } unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~MOVE_LIMITATION_PP); if (unusableMovesBits == (1 << MAX_MON_MOVES) - 1) // all 4 moves cannot be chosen { gBattlescriptCurrInstr += 5; } else // at least one move can be chosen { u32 movePosition; do { movePosition = Random() & (MAX_MON_MOVES - 1); } while ((gBitTable[movePosition] & unusableMovesBits)); gCalledMove = gBattleMons[gBattlerAttacker].moves[movePosition]; gCurrMovePos = movePosition; gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_setdestinybond(void) { gBattleMons[gBattlerAttacker].status2 |= STATUS2_DESTINY_BOND; gBattlescriptCurrInstr++; } static void TrySetDestinyBondToHappen(void) { u8 sideAttacker = GetBattlerSide(gBattlerAttacker); u8 sideTarget = GetBattlerSide(gBattlerTarget); if (gBattleMons[gBattlerTarget].status2 & STATUS2_DESTINY_BOND && sideAttacker != sideTarget && !(gHitMarker & HITMARKER_GRUDGE)) { gHitMarker |= HITMARKER_DESTINYBOND; } } static void Cmd_trysetdestinybondtohappen(void) { TrySetDestinyBondToHappen(); gBattlescriptCurrInstr++; } static void Cmd_remaininghptopower(void) { s32 i; s32 hpFraction = GetScaledHPFraction(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerAttacker].maxHP, 48); for (i = 0; i < (s32) sizeof(sFlailHpScaleToPowerTable); i += 2) { if (hpFraction <= sFlailHpScaleToPowerTable[i]) break; } gDynamicBasePower = sFlailHpScaleToPowerTable[i + 1]; gBattlescriptCurrInstr++; } static void Cmd_tryspiteppreduce(void) { if (gLastMoves[gBattlerTarget] != MOVE_NONE && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) break; } if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] > 1) { s32 ppToDeduct = (Random() & 3) + 2; if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) ppToDeduct = gBattleMons[gBattlerTarget].pp[i]; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; gActiveBattler = gBattlerTarget; // if (MOVE_IS_PERMANENT(gActiveBattler, i)), but backwards if (!(gDisableStructs[gActiveBattler].mimickedMoves & gBitTable[i]) && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gActiveBattler].pp[i]), &gBattleMons[gActiveBattler].pp[i]); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 5; if (gBattleMons[gBattlerTarget].pp[i] == 0) CancelMultiTurnMoves(gBattlerTarget); } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_healpartystatus(void) { u32 zero = 0; u8 toHeal = 0; if (gCurrentMove == MOVE_HEAL_BELL) { struct Pokemon *party; s32 i; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL; if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; if (gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF) { gBattleMons[gBattlerAttacker].status1 = 0; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; } else { RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_ATTACKER; } gActiveBattler = gBattleScripting.battler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { if (gBattleMons[gActiveBattler].ability != ABILITY_SOUNDPROOF) { gBattleMons[gActiveBattler].status1 = 0; gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; } else { RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_PARTNER; } } // Because the above MULTISTRING_CHOOSER are ORd, if both are set then it will be B_MSG_BELL_BOTH_SOUNDPROOF for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); u8 abilityNum = GetMonData(&party[i], MON_DATA_ABILITY_NUM); if (species != SPECIES_NONE && species != SPECIES_EGG) { u8 ability; if (gBattlerPartyIndexes[gBattlerAttacker] == i) ability = gBattleMons[gBattlerAttacker].ability; else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[gActiveBattler] == i && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) ability = gBattleMons[gActiveBattler].ability; else ability = GetAbilityBySpecies(species, abilityNum); if (ability != ABILITY_SOUNDPROOF) toHeal |= (1 << i); } } } else // Aromatherapy { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; toHeal = (1 << PARTY_SIZE) - 1; gBattleMons[gBattlerAttacker].status1 = 0; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { gBattleMons[gActiveBattler].status1 = 0; gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; } } if (toHeal) { gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr++; } static void Cmd_cursetarget(void) { if (gBattleMons[gBattlerTarget].status2 & STATUS2_CURSED) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gBattleMons[gBattlerTarget].status2 |= STATUS2_CURSED; gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattlescriptCurrInstr += 5; } } static void Cmd_trysetspikes(void) { u8 targetSide = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[targetSide].spikesAmount == 3) { gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gSideStatuses[targetSide] |= SIDE_STATUS_SPIKES; gSideTimers[targetSide].spikesAmount++; gBattlescriptCurrInstr += 5; } } static void Cmd_setforesight(void) { gBattleMons[gBattlerTarget].status2 |= STATUS2_FORESIGHT; gBattlescriptCurrInstr++; } static void Cmd_trysetperishsong(void) { s32 i; s32 notAffectedCount = 0; for (i = 0; i < gBattlersCount; i++) { if (gStatuses3[i] & STATUS3_PERISH_SONG || gBattleMons[i].ability == ABILITY_SOUNDPROOF) { notAffectedCount++; } else { gStatuses3[i] |= STATUS3_PERISH_SONG; gDisableStructs[i].perishSongTimer = 3; gDisableStructs[i].perishSongTimerStartValue = 3; } } PressurePPLoseOnUsingPerishSong(gBattlerAttacker); if (notAffectedCount == gBattlersCount) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } static void Cmd_rolloutdamagecalculation(void) { if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveMissedPause; } else { s32 i; if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // first hit { gDisableStructs[gBattlerAttacker].rolloutTimer = 5; gDisableStructs[gBattlerAttacker].rolloutTimerStartValue = 5; gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gBattlerAttacker] = gCurrentMove; } if (--gDisableStructs[gBattlerAttacker].rolloutTimer == 0) // last hit { gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; } gDynamicBasePower = gBattleMoves[gCurrentMove].power; for (i = 1; i < (5 - gDisableStructs[gBattlerAttacker].rolloutTimer); i++) gDynamicBasePower *= 2; if (gBattleMons[gBattlerAttacker].status2 & STATUS2_DEFENSE_CURL) gDynamicBasePower *= 2; gBattlescriptCurrInstr++; } } static void Cmd_jumpifconfusedandstatmaxed(void) { if (gBattleMons[gBattlerTarget].status2 & STATUS2_CONFUSION && gBattleMons[gBattlerTarget].statStages[gBattlescriptCurrInstr[1]] == MAX_STAT_STAGE) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } static void Cmd_furycuttercalc(void) { if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { gDisableStructs[gBattlerAttacker].furyCutterCounter = 0; gBattlescriptCurrInstr = BattleScript_MoveMissedPause; } else { s32 i; if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5) gDisableStructs[gBattlerAttacker].furyCutterCounter++; gDynamicBasePower = gBattleMoves[gCurrentMove].power; for (i = 1; i < gDisableStructs[gBattlerAttacker].furyCutterCounter; i++) gDynamicBasePower *= 2; gBattlescriptCurrInstr++; } } static void Cmd_friendshiptodamagecalculation(void) { if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN) gDynamicBasePower = 10 * (gBattleMons[gBattlerAttacker].friendship) / 25; else // EFFECT_FRUSTRATION gDynamicBasePower = 10 * (255 - gBattleMons[gBattlerAttacker].friendship) / 25; gBattlescriptCurrInstr++; } static void Cmd_presentdamagecalculation(void) { s32 rand = Random() & 0xFF; if (rand < 102) gDynamicBasePower = 40; else if (rand < 178) gDynamicBasePower = 80; else if (rand < 204) gDynamicBasePower = 120; else { gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; } if (rand < 204) gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp) gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp; else { gMoveResultFlags &= ~MOVE_RESULT_DOESNT_AFFECT_FOE; gBattlescriptCurrInstr = BattleScript_PresentHealTarget; } } static void Cmd_setsafeguard(void) { if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_SAFEGUARD) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardBattlerId = gBattlerAttacker; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; } gBattlescriptCurrInstr++; } static void Cmd_magnitudedamagecalculation(void) { s32 magnitude = Random() % 100; if (magnitude < 5) { gDynamicBasePower = 10; magnitude = 4; } else if (magnitude < 15) { gDynamicBasePower = 30; magnitude = 5; } else if (magnitude < 35) { gDynamicBasePower = 50; magnitude = 6; } else if (magnitude < 65) { gDynamicBasePower = 70; magnitude = 7; } else if (magnitude < 85) { gDynamicBasePower = 90; magnitude = 8; } else if (magnitude < 95) { gDynamicBasePower = 110; magnitude = 9; } else { gDynamicBasePower = 150; magnitude = 10; } PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude) for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { if (gBattlerTarget == gBattlerAttacker) continue; if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) // a valid target was found break; } gBattlescriptCurrInstr++; } static void Cmd_jumpifnopursuitswitchdmg(void) { if (gMultiHitCounter == 1) { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); else gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); } else { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); else gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } if (gChosenActionByBattler[gBattlerTarget] == B_ACTION_USE_MOVE && gBattlerAttacker == *(gBattleStruct->moveTarget + gBattlerTarget) && !(gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) && gBattleMons[gBattlerAttacker].hp && !gDisableStructs[gBattlerTarget].truantCounter && gChosenMoveByBattler[gBattlerTarget] == MOVE_PURSUIT) { s32 i; for (i = 0; i < gBattlersCount; i++) { if (gBattlerByTurnOrder[i] == gBattlerTarget) gActionsByTurnOrder[i] = B_ACTION_TRY_FINISH; } gCurrentMove = MOVE_PURSUIT; gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerTarget); gBattlescriptCurrInstr += 5; gBattleScripting.animTurn = 1; gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_setsunny(void) { if (gBattleWeather & B_WEATHER_SUN) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = B_WEATHER_SUN_TEMPORARY; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SUNLIGHT; gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; } // Belly Drum static void Cmd_maxattackhalvehp(void) { u32 halfHp = gBattleMons[gBattlerAttacker].maxHP / 2; if (!(gBattleMons[gBattlerAttacker].maxHP / 2)) halfHp = 1; if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] < MAX_STAT_STAGE && gBattleMons[gBattlerAttacker].hp > halfHp) { gBattleMons[gBattlerAttacker].statStages[STAT_ATK] = MAX_STAT_STAGE; gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } // Psych Up static void Cmd_copyfoestats(void) { s32 i; for (i = 0; i < NUM_BATTLE_STATS; i++) { gBattleMons[gBattlerAttacker].statStages[i] = gBattleMons[gBattlerTarget].statStages[i]; } gBattlescriptCurrInstr += 5; // Has an unused jump ptr(possibly for a failed attempt) parameter. } static void Cmd_rapidspinfree(void) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_WRAPPED) { gBattleScripting.battler = gBattlerTarget; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; gBattlerTarget = *(gBattleStruct->wrappedBy + gBattlerAttacker); gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff1[1] = B_BUFF_MOVE; gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 0); gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 1); gBattleTextBuff1[4] = B_BUFF_EOS; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WrapFree; } else if (gStatuses3[gBattlerAttacker] & STATUS3_LEECHSEED) { gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED; gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED_BATTLER; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_LeechSeedFree; } else if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_SPIKES) { gSideStatuses[GetBattlerSide(gBattlerAttacker)] &= ~SIDE_STATUS_SPIKES; gSideTimers[GetBattlerSide(gBattlerAttacker)].spikesAmount = 0; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SpikesFree; } else { gBattlescriptCurrInstr++; } } static void Cmd_setdefensecurlbit(void) { gBattleMons[gBattlerAttacker].status2 |= STATUS2_DEFENSE_CURL; gBattlescriptCurrInstr++; } static void Cmd_recoverbasedonsunlight(void) { gBattlerTarget = gBattlerAttacker; if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) { if (gBattleWeather == 0 || !WEATHER_HAS_EFFECT) gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; else if (gBattleWeather & B_WEATHER_SUN) gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30; else // not sunny weather gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_hiddenpowercalc(void) { s32 powerBits, typeBits; powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1) | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0) | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1) | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2) | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3) | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4); typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0) | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1) | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2) | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3) | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4) | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5); gDynamicBasePower = (40 * powerBits) / 63 + 30; // Subtract 3 instead of 1 below because 2 types are excluded (TYPE_NORMAL and TYPE_MYSTERY) // The final + 1 skips past Normal, and the following conditional skips TYPE_MYSTERY gBattleStruct->dynamicMoveType = ((NUMBER_OF_MON_TYPES - 3) * typeBits) / 63 + 1; if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY) gBattleStruct->dynamicMoveType++; gBattleStruct->dynamicMoveType |= F_DYNAMIC_TYPE_1 | F_DYNAMIC_TYPE_2; gBattlescriptCurrInstr++; } static void Cmd_selectfirstvalidtarget(void) { for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { if (gBattlerTarget == gBattlerAttacker) continue; if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) break; } gBattlescriptCurrInstr++; } static void Cmd_trysetfutureattack(void) { if (gWishFutureKnock.futureSightCounter[gBattlerTarget] != 0) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; gWishFutureKnock.futureSightAttacker[gBattlerTarget] = gBattlerAttacker; gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3; gWishFutureKnock.futureSightDmg[gBattlerTarget] = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0, 0, gBattlerAttacker, gBattlerTarget); if (gProtectStructs[gBattlerAttacker].helpingHand) gWishFutureKnock.futureSightDmg[gBattlerTarget] = gWishFutureKnock.futureSightDmg[gBattlerTarget] * 15 / 10; if (gCurrentMove == MOVE_DOOM_DESIRE) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; gBattlescriptCurrInstr += 5; } } static void Cmd_trydobeatup(void) { struct Pokemon *party; if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; if (gBattleMons[gBattlerTarget].hp == 0) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { u8 beforeLoop = gBattleCommunication[0]; for (;gBattleCommunication[0] < PARTY_SIZE; gBattleCommunication[0]++) { if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES_OR_EGG) && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) break; } if (gBattleCommunication[0] < PARTY_SIZE) { PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleCommunication[0]) gBattlescriptCurrInstr += 9; gBattleMoveDamage = gSpeciesInfo[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; gBattleMoveDamage *= gBattleMoves[gCurrentMove].power; gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); gBattleMoveDamage /= gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseDefense; gBattleMoveDamage = (gBattleMoveDamage / 50) + 2; if (gProtectStructs[gBattlerAttacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; gBattleCommunication[0]++; } else if (beforeLoop != 0) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); } } static void Cmd_setsemiinvulnerablebit(void) { switch (gCurrentMove) { case MOVE_FLY: case MOVE_BOUNCE: gStatuses3[gBattlerAttacker] |= STATUS3_ON_AIR; break; case MOVE_DIG: gStatuses3[gBattlerAttacker] |= STATUS3_UNDERGROUND; break; case MOVE_DIVE: gStatuses3[gBattlerAttacker] |= STATUS3_UNDERWATER; break; } gBattlescriptCurrInstr++; } static void Cmd_clearsemiinvulnerablebit(void) { switch (gCurrentMove) { case MOVE_FLY: case MOVE_BOUNCE: gStatuses3[gBattlerAttacker] &= ~STATUS3_ON_AIR; break; case MOVE_DIG: gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERGROUND; break; case MOVE_DIVE: gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERWATER; break; } gBattlescriptCurrInstr++; } static void Cmd_setminimize(void) { if (gHitMarker & HITMARKER_OBEYS) gStatuses3[gBattlerAttacker] |= STATUS3_MINIMIZED; gBattlescriptCurrInstr++; } static void Cmd_sethail(void) { if (gBattleWeather & B_WEATHER_HAIL) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = B_WEATHER_HAIL_TEMPORARY; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_HAIL; gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; } static void Cmd_trymemento(void) { if (gBattleMons[gBattlerTarget].statStages[STAT_ATK] == MIN_STAT_STAGE && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == MIN_STAT_STAGE && gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) { // Failed, unprotected target already has minimum Attack and Special Attack. gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { // Success, drop user's HP bar to 0 gActiveBattler = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gActiveBattler].hp; BtlController_EmitHealthBarUpdate(BUFFER_A, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } } // Follow Me static void Cmd_setforcedtarget(void) { gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTimer = 1; gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTarget = gBattlerAttacker; gBattlescriptCurrInstr++; } static void Cmd_setcharge(void) { gStatuses3[gBattlerAttacker] |= STATUS3_CHARGED_UP; gDisableStructs[gBattlerAttacker].chargeTimer = 2; gDisableStructs[gBattlerAttacker].chargeTimerStartValue = 2; gBattlescriptCurrInstr++; } // Nature Power static void Cmd_callterrainattack(void) { gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gCurrentMove = gNaturePowerMoves[gBattleTerrain]; gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); gBattlescriptCurrInstr++; } // Refresh static void Cmd_cureifburnedparalysedorpoisoned(void) { if (gBattleMons[gBattlerAttacker].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON)) { gBattleMons[gBattlerAttacker].status1 = 0; gBattlescriptCurrInstr += 5; gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_settorment(void) { if (gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; gBattlescriptCurrInstr += 5; } } static void Cmd_jumpifnodamage(void) { if (gProtectStructs[gBattlerAttacker].physicalDmg || gProtectStructs[gBattlerAttacker].specialDmg) gBattlescriptCurrInstr += 5; else gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void Cmd_settaunt(void) { if (gDisableStructs[gBattlerTarget].tauntTimer == 0) { gDisableStructs[gBattlerTarget].tauntTimer = 2; gDisableStructs[gBattlerTarget].tauntTimer2 = 2; gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_trysethelpinghand(void) { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget]) && !gProtectStructs[gBattlerAttacker].helpingHand && !gProtectStructs[gBattlerTarget].helpingHand) { gProtectStructs[gBattlerTarget].helpingHand = 1; gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } // Trick static void Cmd_tryswapitems(void) { // opponent can't swap items with player in regular battles if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER || (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { u8 sideAttacker = GetBattlerSide(gBattlerAttacker); u8 sideTarget = GetBattlerSide(gBattlerTarget); // you can't swap items if they were knocked off in regular battles if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE && (gWishFutureKnock.knockedOffMons[sideAttacker] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]] || gWishFutureKnock.knockedOffMons[sideTarget] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]])) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } // can't swap if two pokemon don't have an item // or if either of them is an enigma berry or a mail else if ((gBattleMons[gBattlerAttacker].item == ITEM_NONE && gBattleMons[gBattlerTarget].item == ITEM_NONE) || gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY || IS_ITEM_MAIL(gBattleMons[gBattlerAttacker].item) || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } // check if ability prevents swapping else if (gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD) { gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; gLastUsedAbility = gBattleMons[gBattlerTarget].ability; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } // took a while, but all checks passed and items can be safely swapped else { u16 oldItemAtk, *newItemAtk; newItemAtk = &gBattleStruct->changedItems[gBattlerAttacker]; oldItemAtk = gBattleMons[gBattlerAttacker].item; *newItemAtk = gBattleMons[gBattlerTarget].item; gBattleMons[gBattlerAttacker].item = ITEM_NONE; gBattleMons[gBattlerTarget].item = oldItemAtk; gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); MarkBattlerForControllerExec(gBattlerAttacker); gActiveBattler = gBattlerTarget; BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0; *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 0) = 0; *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 1) = 0; gBattlescriptCurrInstr += 5; PREPARE_ITEM_BUFFER(gBattleTextBuff1, *newItemAtk) PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk) if (oldItemAtk != ITEM_NONE && *newItemAtk != ITEM_NONE) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_BOTH; // attacker's item -> <- target's item else if (oldItemAtk == ITEM_NONE && *newItemAtk != ITEM_NONE) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_TAKEN; // nothing -> <- target's item else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_GIVEN; // attacker's item -> <- nothing } } } // Role Play static void Cmd_trycopyability(void) { if (gBattleMons[gBattlerTarget].ability != ABILITY_NONE && gBattleMons[gBattlerTarget].ability != ABILITY_WONDER_GUARD) { gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; gLastUsedAbility = gBattleMons[gBattlerTarget].ability; gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_trywish(void) { switch (gBattlescriptCurrInstr[1]) { case 0: // use wish if (gWishFutureKnock.wishCounter[gBattlerAttacker] == 0) { gWishFutureKnock.wishCounter[gBattlerAttacker] = 2; gWishFutureKnock.wishMonId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker]; gBattlescriptCurrInstr += 6; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); } break; case 1: // heal effect PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gWishFutureKnock.wishMonId[gBattlerTarget]) gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; break; } } // Ingrain static void Cmd_trysetroots(void) { if (gStatuses3[gBattlerAttacker] & STATUS3_ROOTED) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gStatuses3[gBattlerAttacker] |= STATUS3_ROOTED; gBattlescriptCurrInstr += 5; } } static void Cmd_doubledamagedealtifdamaged(void) { if ((gProtectStructs[gBattlerAttacker].physicalDmg != 0 && gProtectStructs[gBattlerAttacker].physicalBattlerId == gBattlerTarget) || (gProtectStructs[gBattlerAttacker].specialDmg != 0 && gProtectStructs[gBattlerAttacker].specialBattlerId == gBattlerTarget)) { gBattleScripting.dmgMultiplier = 2; } gBattlescriptCurrInstr++; } static void Cmd_setyawn(void) { if (gStatuses3[gBattlerTarget] & STATUS3_YAWN || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); gBattlescriptCurrInstr += 5; } } static void Cmd_setdamagetohealthdifference(void) { if (gBattleMons[gBattlerTarget].hp <= gBattleMons[gBattlerAttacker].hp) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - gBattleMons[gBattlerAttacker].hp; gBattlescriptCurrInstr += 5; } } static void Cmd_scaledamagebyhealthratio(void) { if (gDynamicBasePower == 0) { u8 power = gBattleMoves[gCurrentMove].power; gDynamicBasePower = gBattleMons[gBattlerAttacker].hp * power / gBattleMons[gBattlerAttacker].maxHP; if (gDynamicBasePower == 0) gDynamicBasePower = 1; } gBattlescriptCurrInstr++; } // Skill Swap static void Cmd_tryswapabilities(void) { if ((gBattleMons[gBattlerAttacker].ability == ABILITY_NONE && gBattleMons[gBattlerTarget].ability == ABILITY_NONE) || gBattleMons[gBattlerAttacker].ability == ABILITY_WONDER_GUARD || gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD || gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { u8 abilityAtk = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = abilityAtk; gBattlescriptCurrInstr += 5; } } static void Cmd_tryimprison(void) { if ((gStatuses3[gBattlerAttacker] & STATUS3_IMPRISONED_OTHERS)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { u8 battlerId, sideAttacker; sideAttacker = GetBattlerSide(gBattlerAttacker); PressurePPLoseOnUsingImprison(gBattlerAttacker); for (battlerId = 0; battlerId < gBattlersCount; battlerId++) { if (sideAttacker != GetBattlerSide(battlerId)) { s32 attackerMoveId; for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; attackerMoveId++) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battlerId].moves[i] && gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE) break; } if (i != MAX_MON_MOVES) break; } if (attackerMoveId != MAX_MON_MOVES) { gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS; gBattlescriptCurrInstr += 5; break; } } } if (battlerId == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_trysetgrudge(void) { if (gStatuses3[gBattlerAttacker] & STATUS3_GRUDGE) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gStatuses3[gBattlerAttacker] |= STATUS3_GRUDGE; gBattlescriptCurrInstr += 5; } } static void Cmd_weightdamagecalculation(void) { s32 i; for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2) { if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), 1)) break; } if (sWeightToDamageTable[i] != 0xFFFF) gDynamicBasePower = sWeightToDamageTable[i + 1]; else gDynamicBasePower = 120; gBattlescriptCurrInstr++; } static void Cmd_assistattackselect(void) { s32 chooseableMovesNo = 0; struct Pokemon* party; s32 monId, moveId; u16 *validMoves = gBattleStruct->assistPossibleMoves; if (GET_BATTLER_SIDE(gBattlerAttacker) != B_SIDE_PLAYER) party = gEnemyParty; else party = gPlayerParty; for (monId = 0; monId < PARTY_SIZE; monId++) { if (monId == gBattlerPartyIndexes[gBattlerAttacker]) continue; if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) continue; if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) continue; for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) { s32 i = 0; u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); if (IsInvalidForSleepTalkOrAssist(move)) continue; for (; sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END && move != sMovesForbiddenToCopy[i]; i++); if (sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END) continue; if (move == MOVE_NONE) continue; validMoves[chooseableMovesNo] = move; chooseableMovesNo++; } } if (chooseableMovesNo) { gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gCalledMove = validMoves[((Random() & 0xFF) * chooseableMovesNo) >> 8]; gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_trysetmagiccoat(void) { gBattlerTarget = gBattlerAttacker; gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gProtectStructs[gBattlerAttacker].bounceMove = TRUE; gBattlescriptCurrInstr += 5; } } // Snatch static void Cmd_trysetsnatch(void) { gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { gProtectStructs[gBattlerAttacker].stealMove = 1; gBattlescriptCurrInstr += 5; } } static void Cmd_trygetintimidatetarget(void) { u8 side; gBattleScripting.battler = gBattleStruct->intimidateBattler; side = GetBattlerSide(gBattleScripting.battler); PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gBattleMons[gBattleScripting.battler].ability) for (;gBattlerTarget < gBattlersCount; gBattlerTarget++) { if (GetBattlerSide(gBattlerTarget) == side) continue; if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) break; } if (gBattlerTarget >= gBattlersCount) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } static void Cmd_switchoutabilities(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); switch (gBattleMons[gActiveBattler].ability) { case ABILITY_NATURAL_CURE: gBattleMons[gActiveBattler].status1 = 0; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, gBitTable[*(gBattleStruct->battlerPartyIndexes + gActiveBattler)], sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } gBattlescriptCurrInstr += 2; } static void Cmd_jumpifhasnohp(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gBattleMons[gActiveBattler].hp == 0) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } static void Cmd_getsecretpowereffect(void) { switch (gBattleTerrain) { case BATTLE_TERRAIN_GRASS: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_POISON; break; case BATTLE_TERRAIN_LONG_GRASS: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SLEEP; break; case BATTLE_TERRAIN_SAND: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_ACC_MINUS_1; break; case BATTLE_TERRAIN_UNDERWATER: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_DEF_MINUS_1; break; case BATTLE_TERRAIN_WATER: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_ATK_MINUS_1; break; case BATTLE_TERRAIN_POND: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SPD_MINUS_1; break; case BATTLE_TERRAIN_MOUNTAIN: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION; break; case BATTLE_TERRAIN_CAVE: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH; break; default: gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_PARALYSIS; break; } gBattlescriptCurrInstr++; } static void Cmd_pickup(void) { s32 i; u32 j; u16 species, heldItem; u32 ability; u8 nickname[POKEMON_NAME_LENGTH * 2]; u32 index = 0; u32 count = 0; u32 pickupSuccess = 0; for (i = 0; i < PARTY_SIZE; i++) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); if (GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM) != ABILITY_NONE) ability = gSpeciesInfo[species].abilities[1]; else ability = gSpeciesInfo[species].abilities[0]; if (ability == ABILITY_PICKUP && species != SPECIES_NONE && species != SPECIES_EGG && heldItem == ITEM_NONE && !(Random() % 10)) { s32 random = Random() % 100; for (j = 0; j < 15; ++j) if (sPickupItems[j].chance > random) break; SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &sPickupItems[j]); pickupSuccess++; index = i; } } if(pickupSuccess == 1) // only one Pokemon has picked something up, print solo message { GetMonData(&gPlayerParty[index], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gBattleTextBuff1, nickname); if(GetMonData(&gPlayerParty[index], MON_DATA_HELD_ITEM) == ITEM_ORAN_BERRY || GetMonData(&gPlayerParty[index], MON_DATA_HELD_ITEM) == ITEM_ASPEAR_BERRY) StringCopy(gBattleTextBuff2, (u8 *)gText_An); else StringCopy(gBattleTextBuff2, (u8 *)gText_A); CopyItemName(GetMonData(&gPlayerParty[index], MON_DATA_HELD_ITEM), gBattleTextBuff3); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PickedUpItemSolo; } else if(pickupSuccess > 1) // multiple Pokemon have picked something up, print multi message { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PickedUpItem; } else gBattlescriptCurrInstr++; } static void Cmd_docastformchangeanimation(void) { gActiveBattler = gBattleScripting.battler; if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) *(&gBattleStruct->formToChangeInto) |= CASTFORM_SUBSTITUTE; BtlController_EmitBattleAnimation(BUFFER_A, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; } static void Cmd_trycastformdatachange(void) { u8 form; gBattlescriptCurrInstr++; form = CastformDataTypeChange(gBattleScripting.battler); if (form) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); *(&gBattleStruct->formToChangeInto) = form - 1; } } // Water and Mud Sport static void Cmd_settypebasedhalvers(void) { bool8 worked = FALSE; if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT) { if (!(gStatuses3[gBattlerAttacker] & STATUS3_MUDSPORT)) { gStatuses3[gBattlerAttacker] |= STATUS3_MUDSPORT; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; worked = TRUE; } } else // Water Sport { if (!(gStatuses3[gBattlerAttacker] & STATUS3_WATERSPORT)) { gStatuses3[gBattlerAttacker] |= STATUS3_WATERSPORT; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; worked = TRUE; } } if (worked) gBattlescriptCurrInstr += 5; else gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void Cmd_setweatherballtype(void) { if (WEATHER_HAS_EFFECT) { if (gBattleWeather & B_WEATHER_ANY) gBattleScripting.dmgMultiplier = 2; if (gBattleWeather & B_WEATHER_RAIN) *(&gBattleStruct->dynamicMoveType) = TYPE_WATER | F_DYNAMIC_TYPE_2; else if (gBattleWeather & B_WEATHER_SANDSTORM) *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | F_DYNAMIC_TYPE_2; else if (gBattleWeather & B_WEATHER_SUN) *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | F_DYNAMIC_TYPE_2; else if (gBattleWeather & B_WEATHER_HAIL) *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | F_DYNAMIC_TYPE_2; else *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | F_DYNAMIC_TYPE_2; } gBattlescriptCurrInstr++; } static void Cmd_tryrecycleitem(void) { u16 *usedHeldItem; gActiveBattler = gBattlerAttacker; usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler]; if (*usedHeldItem != ITEM_NONE && gBattleMons[gActiveBattler].item == ITEM_NONE) { gLastUsedItem = *usedHeldItem; *usedHeldItem = ITEM_NONE; gBattleMons[gActiveBattler].item = gLastUsedItem; BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_settypetoterrain(void) { if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, sTerrainToType[gBattleTerrain])) { SET_BATTLER_TYPE(gBattlerAttacker, sTerrainToType[gBattleTerrain]); PREPARE_TYPE_BUFFER(gBattleTextBuff1, sTerrainToType[gBattleTerrain]); gBattlescriptCurrInstr += 5; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } // Unused static void Cmd_pursuitdoubles(void) { gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]) && gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_MOVE && gChosenMoveByBattler[gActiveBattler] == MOVE_PURSUIT) { gActionsByTurnOrder[gActiveBattler] = B_ACTION_TRY_FINISH; gCurrentMove = MOVE_PURSUIT; gBattlescriptCurrInstr += 5; gBattleScripting.animTurn = 1; gBattleScripting.pursuitDoublesAttacker = gBattlerAttacker; gBattlerAttacker = gActiveBattler; } else { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void Cmd_snatchsetbattlers(void) { gEffectBattler = gBattlerAttacker; if (gBattlerAttacker == gBattlerTarget) gBattlerAttacker = gBattlerTarget = gBattleScripting.battler; else gBattlerTarget = gBattleScripting.battler; gBattleScripting.battler = gEffectBattler; gBattlescriptCurrInstr++; } // Brick Break static void Cmd_removelightscreenreflect(void) { u8 opposingSide = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[opposingSide].reflectTimer || gSideTimers[opposingSide].lightscreenTimer) { gSideStatuses[opposingSide] &= ~SIDE_STATUS_REFLECT; gSideStatuses[opposingSide] &= ~SIDE_STATUS_LIGHTSCREEN; gSideTimers[opposingSide].reflectTimer = 0; gSideTimers[opposingSide].lightscreenTimer = 0; gBattleScripting.animTurn = 1; gBattleScripting.animTargetsHit = 1; } else { gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; } gBattlescriptCurrInstr++; } static void Cmd_handleballthrow(void) { u8 ballMultiplier = 0; if (gBattleControllerExecFlags) return; gActiveBattler = gBattlerAttacker; gBattlerTarget = gBattlerAttacker ^ BIT_SIDE; if (gBattleTypeFlags & BATTLE_TYPE_GHOST) { BtlController_EmitBallThrowAnim(BUFFER_A, BALL_GHOST_DODGE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_GhostBallDodge; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { BtlController_EmitBallThrowAnim(BUFFER_A, BALL_TRAINER_BLOCK); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; } else if (gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_OLD_MAN_TUTORIAL)) { BtlController_EmitBallThrowAnim(BUFFER_A, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_OldMan_Pokedude_CaughtMessage; } else { u32 odds; u8 catchRate; if (gLastUsedItem == ITEM_SAFARI_BALL) catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; else catchRate = gSpeciesInfo[gBattleMons[gBattlerTarget].species].catchRate; if (gLastUsedItem > ITEM_SAFARI_BALL) { switch (gLastUsedItem) { case ITEM_NET_BALL: if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_WATER) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_BUG)) ballMultiplier = 30; else ballMultiplier = 10; break; case ITEM_DIVE_BALL: if (GetCurrentMapType() == MAP_TYPE_UNDERWATER) ballMultiplier = 35; else ballMultiplier = 10; break; case ITEM_NEST_BALL: if (gBattleMons[gBattlerTarget].level < 40) { ballMultiplier = 40 - gBattleMons[gBattlerTarget].level; if (ballMultiplier <= 9) ballMultiplier = 10; } else { ballMultiplier = 10; } break; case ITEM_REPEAT_BALL: if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), FLAG_GET_CAUGHT)) ballMultiplier = 30; else ballMultiplier = 10; break; case ITEM_TIMER_BALL: ballMultiplier = gBattleResults.battleTurnCounter + 10; if (ballMultiplier > 40) ballMultiplier = 40; break; case ITEM_LUXURY_BALL: case ITEM_PREMIER_BALL: ballMultiplier = 10; break; } } else ballMultiplier = sBallCatchBonuses[gLastUsedItem - ITEM_ULTRA_BALL]; odds = (catchRate * ballMultiplier / 10) * (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2) / (3 * gBattleMons[gBattlerTarget].maxHP); if (gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) odds *= 2; if (gBattleMons[gBattlerTarget].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON)) odds = (odds * 15) / 10; if (gLastUsedItem != ITEM_SAFARI_BALL) { if (gLastUsedItem == ITEM_MASTER_BALL) { gBattleResults.usedMasterBall = TRUE; } else { if (gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL] < 255) gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL]++; } } if (odds > 254) // mon caught { BtlController_EmitBallThrowAnim(0, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gActiveBattler); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) gBattlescriptCurrInstr = BattleScript_SuccessBallThrowForceNick; else gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == TRUE) //already caught something here, faint mon { u8 arg[4]; u16 zeroHP = 0; // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. arg[0] = 0; arg[1] = 0; arg[2] = 0; arg[3] = 0; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_STATUS, arg); //clear status SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_HP, &zeroHP); } else { //if first catch in area, set dupe flag for this species. SetNuzlockeDupeFlags(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES))); } NuzlockeFlagSet(GetCurrentRegionMapSectionId()); } if((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(THREE_ISLAND_BOND_BRIDGE_UNDERWATER) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(THREE_ISLAND_BOND_BRIDGE_UNDERWATER)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ARTISAN_CAVE_B1F) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ARTISAN_CAVE_B1F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ARTISAN_CAVE_1F)))) { u8 version = VERSION_EMERALD; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_GAME, &version); } if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SAFARI_ZONE_NORTH_WEST) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_WEST) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_EAST))) { u8 mapSec = MAPSEC_SAFARI_ZONE; u8 version = VERSION_EMERALD; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_LOCATION, &mapSec); SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_GAME, &version); } if (CalculatePlayerPartyCount() == PARTY_SIZE) gBattleCommunication[MULTISTRING_CHOOSER] = 0; else gBattleCommunication[MULTISTRING_CHOOSER] = 1; } else // mon may be caught, calculate shakes { u8 shakes; odds = Sqrt(Sqrt(16711680 / odds)); odds = 1048560 / odds; for (shakes = 0; shakes < BALL_3_SHAKES_SUCCESS && Random() < odds; shakes++); if (gLastUsedItem == ITEM_MASTER_BALL) shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check? BtlController_EmitBallThrowAnim(BUFFER_A, shakes); MarkBattlerForControllerExec(gActiveBattler); if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above { if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) gBattlescriptCurrInstr = BattleScript_SuccessBallThrowForceNick; else gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == TRUE) //already caught something here, faint mon { u8 arg[4]; u16 zeroHP = 0; // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. arg[0] = 0; arg[1] = 0; arg[2] = 0; arg[3] = 0; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_STATUS, arg); //clear status SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_HP, &zeroHP); } else { //if first catch in area, set dupe flag for this species. SetNuzlockeDupeFlags(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES))); } NuzlockeFlagSet(GetCurrentRegionMapSectionId()); } if((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(THREE_ISLAND_BOND_BRIDGE_UNDERWATER) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(THREE_ISLAND_BOND_BRIDGE_UNDERWATER)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ARTISAN_CAVE_B1F) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ARTISAN_CAVE_B1F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ARTISAN_CAVE_1F)))) { u8 version = VERSION_EMERALD; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_GAME, &version); } if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SAFARI_ZONE_NORTH_WEST) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_WEST) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_EAST))) { u8 mapSec = MAPSEC_SAFARI_ZONE; u8 version = VERSION_EMERALD; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_LOCATION, &mapSec); SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_GAME, &version); } if (CalculatePlayerPartyCount() == PARTY_SIZE) gBattleCommunication[MULTISTRING_CHOOSER] = 0; else gBattleCommunication[MULTISTRING_CHOOSER] = 1; } else // not caught { gBattleCommunication[MULTISTRING_CHOOSER] = shakes; gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; } } } } static void Cmd_givecaughtmon(void) { if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]) != MON_GIVEN_TO_PARTY) { if (!ShouldShowBoxWasFullMessage()) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); } else { StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; } // Change to B_MSG_SENT_BILLS_PC or B_MSG_BILLS_BOX_FULL if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC)) gBattleCommunication[MULTISTRING_CHOOSER]++; } gBattleResults.caughtMonSpecies = gBattleMons[gBattlerAttacker ^ BIT_SIDE].species; GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); gBattlescriptCurrInstr++; } static void Cmd_trysetcaughtmondexflags(void) { u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); u32 personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL); if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { HandleSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_SET_CAUGHT, personality); gBattlescriptCurrInstr += 5; } } static void Cmd_displaydexinfo(void) { u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); switch (gBattleCommunication[0]) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE); gBattleCommunication[0]++; break; case 1: if (!gPaletteFade.active) { FreeAllWindowBuffers(); gBattleCommunication[TASK_ID] = DexScreen_RegisterMonToPokedex(species); gBattleCommunication[0]++; } break; case 2: if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2 && !gTasks[gBattleCommunication[TASK_ID]].isActive) { CpuFill32(0, (void *)VRAM, VRAM_SIZE); SetVBlankCallback(VBlankCB_Battle); gBattleCommunication[0]++; } break; case 3: InitBattleBgsVideo(); LoadBattleTextboxAndBackground(); gBattle_BG3_X = 256; gBattleCommunication[0]++; break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) { CreateMonPicSprite_HandleDeoxys(species, gBattleMons[B_POSITION_OPPONENT_LEFT].otId, gBattleMons[B_POSITION_OPPONENT_LEFT].personality, TRUE, 120, 64, 0, 0xFFFF); CpuFill32(0, gPlttBufferFaded, BG_PLTT_SIZE); BeginNormalPaletteFade(0x1FFFF, 0, 16, 0, RGB_BLACK); ShowBg(0); ShowBg(3); gBattleCommunication[0]++; } break; case 5: if (!gPaletteFade.active) gBattlescriptCurrInstr++; break; } } void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags) { s32 destY, destX; u16 var = 0; for (destY = yStart; destY <= yEnd; destY++) { for (destX = xStart; destX <= xEnd; destX++) { if (destY == yStart) { if (destX == xStart) var = 0x1022; else if (destX == xEnd) var = 0x1024; else var = 0x1023; } else if (destY == yEnd) { if (destX == xStart) var = 0x1028; else if (destX == xEnd) var = 0x102A; else var = 0x1029; } else { if (destX == xStart) var = 0x1025; else if (destX == xEnd) var = 0x1027; else var = 0x1026; } if (flags & WINDOW_CLEAR) var = 0; if (flags & WINDOW_BG1) CopyToBgTilemapBufferRect_ChangePalette(1, &var, destX, destY, 1, 1, 0x11); else CopyToBgTilemapBufferRect_ChangePalette(0, &var, destX, destY, 1, 1, 0x11); } } CopyBgTilemapBufferToVram(1); } void BattleCreateYesNoCursorAt(void) { u16 src[2]; src[0] = 1; src[1] = 2; CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x18, 9 + (2 * gBattleCommunication[1]), 1, 2, 0x11); CopyBgTilemapBufferToVram(0); } void BattleDestroyYesNoCursorAt(void) { u16 src[2]; src[0] = 32; src[1] = 32; CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x18, 9 + (2 * gBattleCommunication[1]), 1, 2, 0x11); CopyBgTilemapBufferToVram(0); } static void Cmd_trygivecaughtmonnick(void) { switch (gBattleCommunication[MULTIUSE_STATE]) { case 0: HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); break; case 1: if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) { PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(); } if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) { PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); gBattleCommunication[CURSOR_POSITION] = 1; BattleCreateYesNoCursorAt(); } if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); if (gBattleCommunication[CURSOR_POSITION] == 0) { gBattleCommunication[MULTIUSE_STATE]++; BeginFastPaletteFade(3); } else { gBattleCommunication[MULTIUSE_STATE] = 4; } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); gBattleCommunication[MULTIUSE_STATE] = 4; } break; case 2: if (!gPaletteFade.active) { GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); FreeAllWindowBuffers(); DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]), GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_PERSONALITY, NULL), BattleMainCB2); gBattleCommunication[MULTIUSE_STATE]++; } break; case 3: if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } break; case 4: if (CalculatePlayerPartyCount() == PARTY_SIZE) gBattlescriptCurrInstr += 5; else gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); break; } } static void Cmd_subattackerhpbydmg(void) { gBattleMons[gBattlerAttacker].hp -= gBattleMoveDamage; gBattlescriptCurrInstr++; } static void Cmd_removeattackerstatus1(void) { gBattleMons[gBattlerAttacker].status1 = 0; gBattlescriptCurrInstr++; } static void Cmd_finishaction(void) { gCurrentActionFuncId = B_ACTION_FINISHED; } static void Cmd_finishturn(void) { gCurrentActionFuncId = B_ACTION_FINISHED; gCurrentTurnActionNumber = gBattlersCount; } ================================================ FILE: src/battle_setup.c ================================================ #include "global.h" #include "task.h" #include "help_system.h" #include "overworld.h" #include "item.h" #include "sound.h" #include "pokemon.h" #include "load_save.h" #include "safari_zone.h" #include "quest_log.h" #include "script.h" #include "script_pokemon_util.h" #include "strings.h" #include "string_util.h" #include "event_data.h" #include "event_object_movement.h" #include "metatile_behavior.h" #include "event_scripts.h" #include "fldeff.h" #include "fieldmap.h" #include "field_control_avatar.h" #include "field_player_avatar.h" #include "field_screen_effect.h" #include "field_message_box.h" #include "vs_seeker.h" #include "battle.h" #include "battle_transition.h" #include "battle_controllers.h" #include "pokedex.h" #include "constants/battle_setup.h" #include "constants/items.h" #include "constants/maps.h" #include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/pokemon.h" #include "constants/trainers.h" enum { TRANSITION_TYPE_NORMAL, TRANSITION_TYPE_CAVE, TRANSITION_TYPE_FLASH, TRANSITION_TYPE_WATER, }; enum { TRAINER_PARAM_LOAD_VAL_8BIT, TRAINER_PARAM_LOAD_VAL_16BIT, TRAINER_PARAM_LOAD_VAL_32BIT, TRAINER_PARAM_CLEAR_VAL_8BIT, TRAINER_PARAM_CLEAR_VAL_16BIT, TRAINER_PARAM_CLEAR_VAL_32BIT, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR, }; struct TrainerBattleParameter { void *varPtr; u8 ptrType; }; static void DoSafariBattle(void); static void DoGhostBattle(void); static void DoStandardWildBattle(void); static void CB2_EndWildBattle(void); static u8 GetWildBattleTransition(void); static u8 GetTrainerBattleTransition(void); static void CB2_EndScriptedWildBattle(void); static void CB2_EndMarowakBattle(void); static bool32 IsPlayerDefeated(u32 battleOutcome); static void CB2_EndTrainerBattle(void); static const u8 *GetIntroSpeechOfApproachingTrainer(void); static const u8 *GetTrainerCantBattleSpeech(void); s8 GetScaledLevel(void); static EWRAM_DATA u16 sTrainerBattleMode = 0; EWRAM_DATA u16 gTrainerBattleOpponent_A = 0; static EWRAM_DATA u16 sTrainerObjectEventLocalId = 0; static EWRAM_DATA u8 *sTrainerAIntroSpeech = NULL; static EWRAM_DATA u8 *sTrainerADefeatSpeech = NULL; static EWRAM_DATA u8 *sTrainerVictorySpeech = NULL; static EWRAM_DATA u8 *sTrainerCannotBattleSpeech = NULL; static EWRAM_DATA u8 *sTrainerBattleEndScript = NULL; static EWRAM_DATA u8 *sTrainerABattleScriptRetAddr = NULL; static EWRAM_DATA u16 sRivalBattleFlags = 0; EWRAM_DATA u8 HasAlreadyCapturedHere = 0; // The first transition is used if the enemy pokemon are lower level than our pokemon. // Otherwise, the second transition is used. static const u8 sBattleTransitionTable_Wild[][2] = { [TRANSITION_TYPE_NORMAL] = {B_TRANSITION_SLICE, B_TRANSITION_WHITE_BARS_FADE}, [TRANSITION_TYPE_CAVE] = {B_TRANSITION_CLOCKWISE_WIPE, B_TRANSITION_GRID_SQUARES}, [TRANSITION_TYPE_FLASH] = {B_TRANSITION_BLUR, B_TRANSITION_GRID_SQUARES}, [TRANSITION_TYPE_WATER] = {B_TRANSITION_WAVE, B_TRANSITION_RIPPLE}, }; static const u8 sBattleTransitionTable_Trainer[][2] = { [TRANSITION_TYPE_NORMAL] = {B_TRANSITION_POKEBALLS_TRAIL, B_TRANSITION_ANGLED_WIPES}, [TRANSITION_TYPE_CAVE] = {B_TRANSITION_SHUFFLE, B_TRANSITION_BIG_POKEBALL}, [TRANSITION_TYPE_FLASH] = {B_TRANSITION_BLUR, B_TRANSITION_GRID_SQUARES}, [TRANSITION_TYPE_WATER] = {B_TRANSITION_SWIRL, B_TRANSITION_RIPPLE}, }; static const struct TrainerBattleParameter sOrdinaryBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, }; static const struct TrainerBattleParameter sContinueScriptBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, }; static const struct TrainerBattleParameter sDoubleBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, }; static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, }; static const struct TrainerBattleParameter sEarlyRivalBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sRivalBattleFlags, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, }; static const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, }; const u8 NuzlockeLUT[MAPSEC_COUNT] = //84 used, 214 total { //any mapsec not in this list = 0x0 [MAPSEC_PALLET_TOWN] = 0x1, [MAPSEC_VIRIDIAN_CITY] = 0x2, [MAPSEC_CERULEAN_CITY] = 0x3, [MAPSEC_VERMILION_CITY] = 0x4, [MAPSEC_CELADON_CITY] = 0x5, [MAPSEC_FUCHSIA_CITY] = 0x6, [MAPSEC_CINNABAR_ISLAND] = 0x7, [MAPSEC_ROUTE_1] = 0x8, [MAPSEC_ROUTE_2] = 0x9, [MAPSEC_ROUTE_3] = 0xA, [MAPSEC_ROUTE_4] = 0xB, [MAPSEC_ROUTE_5] = 0xC, [MAPSEC_ROUTE_6] = 0xD, [MAPSEC_ROUTE_7] = 0xE, [MAPSEC_ROUTE_8] = 0xF, [MAPSEC_ROUTE_9] = 0x10, [MAPSEC_ROUTE_10] = 0x11, [MAPSEC_ROUTE_11] = 0x12, [MAPSEC_ROUTE_12] = 0x13, [MAPSEC_ROUTE_13] = 0x14, [MAPSEC_ROUTE_14] = 0x15, [MAPSEC_ROUTE_15] = 0x16, [MAPSEC_ROUTE_16] = 0x17, [MAPSEC_ROUTE_17] = 0x18, [MAPSEC_ROUTE_18] = 0x19, [MAPSEC_ROUTE_19] = 0x1A, [MAPSEC_ROUTE_20] = 0x1B, [MAPSEC_ROUTE_21] = 0x1C, [MAPSEC_ROUTE_22] = 0x1D, [MAPSEC_ROUTE_23] = 0x1E, [MAPSEC_ROUTE_24] = 0x1F, [MAPSEC_ROUTE_25] = 0x20, [MAPSEC_VIRIDIAN_FOREST] = 0x21, [MAPSEC_MT_MOON] = 0x22, [MAPSEC_S_S_ANNE] = 0x23, [MAPSEC_DIGLETTS_CAVE] = 0x24, [MAPSEC_KANTO_VICTORY_ROAD] = 0x25, [MAPSEC_POKEMON_MANSION] = 0x26, [MAPSEC_KANTO_SAFARI_ZONE] = 0x27, [MAPSEC_ROCK_TUNNEL] = 0x28, [MAPSEC_SEAFOAM_ISLANDS] = 0x29, [MAPSEC_POKEMON_TOWER] = 0x2A, [MAPSEC_CERULEAN_CAVE] = 0x2B, [MAPSEC_POWER_PLANT] = 0x2C, [MAPSEC_ONE_ISLAND] = 0x2D, [MAPSEC_FOUR_ISLAND] = 0x2E, [MAPSEC_FIVE_ISLAND] = 0x2F, [MAPSEC_KINDLE_ROAD] = 0x30, [MAPSEC_TREASURE_BEACH] = 0x31, [MAPSEC_CAPE_BRINK] = 0x32, [MAPSEC_BOND_BRIDGE] = 0x33, [MAPSEC_THREE_ISLE_PORT] = 0x34, [MAPSEC_RESORT_GORGEOUS] = 0x35, [MAPSEC_WATER_LABYRINTH] = 0x36, [MAPSEC_FIVE_ISLE_MEADOW] = 0x37, [MAPSEC_MEMORIAL_PILLAR] = 0x38, [MAPSEC_OUTCAST_ISLAND] = 0x39, [MAPSEC_GREEN_PATH] = 0x3A, [MAPSEC_WATER_PATH] = 0x3B, [MAPSEC_RUIN_VALLEY] = 0x3C, [MAPSEC_TRAINER_TOWER] = 0x3D, [MAPSEC_CANYON_ENTRANCE] = 0x3E, [MAPSEC_SEVAULT_CANYON] = 0x3F, [MAPSEC_TANOBY_RUINS] = 0x40, [MAPSEC_NAVEL_ROCK] = 0x41, [MAPSEC_MT_EMBER] = 0x42, [MAPSEC_BERRY_FOREST] = 0x43, [MAPSEC_ICEFALL_CAVE] = 0x44, [MAPSEC_LOST_CAVE] = 0x45, [MAPSEC_PATTERN_BUSH] = 0x46, [MAPSEC_ALTERING_CAVE] = 0x47, [MAPSEC_MONEAN_CHAMBER] = 0x48, [MAPSEC_LIPTOO_CHAMBER] = 0x49, [MAPSEC_WEEPTH_CHAMBER] = 0x4A, [MAPSEC_DILFORD_CHAMBER] = 0x4B, [MAPSEC_SCUFIB_CHAMBER] = 0x4C, [MAPSEC_RIXY_CHAMBER] = 0x4D, [MAPSEC_VIAPOIS_CHAMBER] = 0x4E, //Other Safari Zone areas here, taking up 0x4F to 0x53 [MAPSEC_ARTISAN_CAVE] = 0x54, [MAPSEC_SOUTHERN_ISLAND] = 0x55, //84 [MAPSEC_UNDERWATER_124] = 0x33, //reused Bond Bridge; same area but Underwater [MAPSEC_BATTLE_FRONTIER] = 0x56 }; #define tState data[0] #define tTransition data[1] static void Task_BattleStart(u8 taskId) { s16 *data = gTasks[taskId].data; switch (tState) { case 0: if (!FldEffPoison_IsActive()) { HelpSystem_Disable(); BattleTransition_StartOnField(tTransition); ++tState; } break; case 1: if (IsBattleTransitionDone() == TRUE) { HelpSystem_Enable(); CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_InitBattle); RestartWildEncounterImmunitySteps(); ClearPoisonStepCounter(); DestroyTask(taskId); } break; } } static void CreateBattleStartTask(u8 transition, u16 song) // song == 0 means default music for current map { u8 taskId = CreateTask(Task_BattleStart, 1); gTasks[taskId].tTransition = transition; PlayMapChosenOrBattleBGM(song); } static bool8 CheckSilphScopeInPokemonTower(u16 mapGroup, u16 mapNum) { if (mapGroup == MAP_GROUP(POKEMON_TOWER_1F) && (mapNum == MAP_NUM(POKEMON_TOWER_1F) || mapNum == MAP_NUM(POKEMON_TOWER_2F) || mapNum == MAP_NUM(POKEMON_TOWER_3F) || mapNum == MAP_NUM(POKEMON_TOWER_4F) || mapNum == MAP_NUM(POKEMON_TOWER_5F) || mapNum == MAP_NUM(POKEMON_TOWER_6F) || mapNum == MAP_NUM(POKEMON_TOWER_7F)) && !(CheckBagHasItem(ITEM_SILPH_SCOPE, 1))) return TRUE; else return FALSE; } void StartWildBattle(void) { if (GetSafariZoneFlag()) DoSafariBattle(); else if (CheckSilphScopeInPokemonTower(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)) DoGhostBattle(); else DoStandardWildBattle(); } static void DoStandardWildBattle(void) { LockPlayerFieldControls(); FreezeObjectEvents(); StopPlayerAvatar(); gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = 0; CreateBattleStartTask(GetWildBattleTransition(), 0); IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_WILD_BATTLES); } void StartRoamerBattle(void) { LockPlayerFieldControls(); FreezeObjectEvents(); StopPlayerAvatar(); gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = BATTLE_TYPE_ROAMER; CreateBattleStartTask(GetWildBattleTransition(), MUS_C_VS_LEGEND_BEAST); IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_WILD_BATTLES); } static void DoSafariBattle(void) { LockPlayerFieldControls(); FreezeObjectEvents(); StopPlayerAvatar(); gMain.savedCallback = CB2_EndSafariBattle; gBattleTypeFlags = BATTLE_TYPE_SAFARI; CreateBattleStartTask(GetWildBattleTransition(), 0); } static void DoGhostBattle(void) { LockPlayerFieldControls(); FreezeObjectEvents(); StopPlayerAvatar(); gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = BATTLE_TYPE_GHOST; CreateBattleStartTask(GetWildBattleTransition(), 0); SetMonData(&gEnemyParty[0], MON_DATA_NICKNAME, gText_Ghost); IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_WILD_BATTLES); } static void DoTrainerBattle(void) { CreateBattleStartTask(GetTrainerBattleTransition(), 0); IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_TRAINER_BATTLES); } void StartOldManTutorialBattle(void) { CreateMaleMon(&gEnemyParty[0], SPECIES_WEEDLE, 5); LockPlayerFieldControls(); gMain.savedCallback = CB2_ReturnToFieldContinueScriptPlayMapMusic; gBattleTypeFlags = BATTLE_TYPE_OLD_MAN_TUTORIAL; CreateBattleStartTask(B_TRANSITION_SLICE, 0); } void StartScriptedWildBattle(void) { LockPlayerFieldControls(); gMain.savedCallback = CB2_EndScriptedWildBattle; gBattleTypeFlags = BATTLE_TYPE_WILD_SCRIPTED; CreateBattleStartTask(GetWildBattleTransition(), 0); IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_WILD_BATTLES); } void StartMarowakBattle(void) { LockPlayerFieldControls(); gMain.savedCallback = CB2_EndMarowakBattle; if (CheckBagHasItem(ITEM_SILPH_SCOPE, 1)) { gBattleTypeFlags = BATTLE_TYPE_GHOST | BATTLE_TYPE_GHOST_UNVEILED; CreateMonWithGenderNatureLetter(gEnemyParty, SPECIES_MAROWAK, 30, 31, MON_FEMALE, NATURE_SERIOUS, 0); } else { gBattleTypeFlags = BATTLE_TYPE_GHOST; } CreateBattleStartTask(GetWildBattleTransition(), 0); SetMonData(&gEnemyParty[0], MON_DATA_NICKNAME, gText_Ghost); IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_WILD_BATTLES); } void StartSouthernIslandBattle(void) { LockPlayerFieldControls(); gMain.savedCallback = CB2_EndScriptedWildBattle; gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; CreateBattleStartTask(GetWildBattleTransition(), MUS_RS_VS_WILD); IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_WILD_BATTLES); } void StartLegendaryBattle(void) { u16 species; LockPlayerFieldControls(); gMain.savedCallback = CB2_EndScriptedWildBattle; gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_LEGENDARY_FRLG; species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES); switch (species) { case SPECIES_MEWTWO: CreateBattleStartTask(B_TRANSITION_BLUR, MUS_VS_MEWTWO); break; case SPECIES_MEW: CreateBattleStartTask(B_TRANSITION_GRID_SQUARES, MUS_VS_MEWTWO); break; case SPECIES_DEOXYS: CreateBattleStartTask(B_TRANSITION_BLUR, MUS_VS_DEOXYS); break; case SPECIES_MOLTRES: case SPECIES_ARTICUNO: case SPECIES_ZAPDOS: case SPECIES_HO_OH: case SPECIES_LUGIA: CreateBattleStartTask(B_TRANSITION_BLUR, MUS_VS_LEGEND); break; default: CreateBattleStartTask(B_TRANSITION_BLUR, MUS_RS_VS_TRAINER); break; } IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_WILD_BATTLES); } void StartGroudonKyogreBattle(void) { LockPlayerFieldControls(); gMain.savedCallback = CB2_EndScriptedWildBattle; gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON; if (gGameVersion == VERSION_FIRE_RED) CreateBattleStartTask(B_TRANSITION_ANGLED_WIPES, MUS_RS_VS_TRAINER); else // pointless, exactly the same CreateBattleStartTask(B_TRANSITION_ANGLED_WIPES, MUS_RS_VS_TRAINER); IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_WILD_BATTLES); } void StartRegiBattle(void) { LockPlayerFieldControls(); gMain.savedCallback = CB2_EndScriptedWildBattle; gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI; CreateBattleStartTask(B_TRANSITION_BLUR, MUS_RS_VS_TRAINER); IncrementGameStat(GAME_STAT_TOTAL_BATTLES); IncrementGameStat(GAME_STAT_WILD_BATTLES); } // Unused static void EndPokedudeBattle(void) { LoadPlayerParty(); CB2_EndWildBattle(); } // Unused static void StartPokedudeBattle(void) { LockPlayerFieldControls(); FreezeObjectEvents(); StopPlayerAvatar(); gMain.savedCallback = EndPokedudeBattle; SavePlayerParty(); InitPokedudePartyAndOpponent(); CreateBattleStartTask(GetWildBattleTransition(), 0); } bool8 CheckNuzlockeDupeFlags(u16 species) { u8 index = species / 8; //get byte in array u8 bit = species % 8; //get bit in byte u8 mask = 1 << bit; return (gSaveBlock1Ptr->nuzlockeDupeFlags[index] & mask) != 0; } bool8 IsWildMonNuzlockeDupe(u16 species) { u32 i; for (i = 0; i < EVOS_PER_LINE; i++) { if (CheckNuzlockeDupeFlags(SpeciesToNationalPokedexNum(gEvolutionLines[species][i]))) return TRUE; } return FALSE; } void SetNuzlockeDupeFlags(u16 species) { u8 index = species / 8; //get byte in array u8 bit = species % 8; //get bit in byte u8 mask = 1 << bit; gSaveBlock1Ptr->nuzlockeDupeFlags[index] |= mask; } static void CB2_EndWildBattle(void) { if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[0], MON_DATA_SPECIES))) { NuzlockeFlagSet(GetCurrentRegionMapSectionId()); } } CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); ResetOamRange(0, 128); if (IsPlayerDefeated(gBattleOutcome) == TRUE) { SetMainCallback2(CB2_WhiteOut); } else { SetMainCallback2(CB2_ReturnToField); gFieldCallback = FieldCB_SafariZoneRanOutOfBalls; } } static void CB2_EndScriptedWildBattle(void) { if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[0], MON_DATA_SPECIES))) { NuzlockeFlagSet(GetCurrentRegionMapSectionId()); } } CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); ResetOamRange(0, 128); if (IsPlayerDefeated(gBattleOutcome) == TRUE) SetMainCallback2(CB2_WhiteOut); else SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } static void CB2_EndMarowakBattle(void) { CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); ResetOamRange(0, 128); if (IsPlayerDefeated(gBattleOutcome)) { SetMainCallback2(CB2_WhiteOut); } else { // If result is TRUE player didnt defeat Marowak, force player back from stairs if (gBattleOutcome == B_OUTCOME_WON) gSpecialVar_Result = FALSE; else gSpecialVar_Result = TRUE; SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } } u8 BattleSetup_GetTerrainId(void) { u16 tileBehavior; s16 x, y; PlayerGetDestCoords(&x, &y); tileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsTallGrass(tileBehavior)) return BATTLE_TERRAIN_GRASS; if (MetatileBehavior_IsLongGrass(tileBehavior)) return BATTLE_TERRAIN_LONG_GRASS; if (MetatileBehavior_IsSandOrShallowFlowingWater(tileBehavior)) return BATTLE_TERRAIN_SAND; switch (gMapHeader.mapType) { case MAP_TYPE_TOWN: case MAP_TYPE_CITY: case MAP_TYPE_ROUTE: break; case MAP_TYPE_UNDERGROUND: if (MetatileBehavior_IsIndoorEncounter(tileBehavior)) return BATTLE_TERRAIN_BUILDING; if (MetatileBehavior_IsSurfable(tileBehavior)) return BATTLE_TERRAIN_POND; return BATTLE_TERRAIN_CAVE; case MAP_TYPE_INDOOR: case MAP_TYPE_SECRET_BASE: return BATTLE_TERRAIN_BUILDING; case MAP_TYPE_UNDERWATER: return BATTLE_TERRAIN_UNDERWATER; case MAP_TYPE_OCEAN_ROUTE: if (MetatileBehavior_IsSurfable(tileBehavior)) return BATTLE_TERRAIN_WATER; return BATTLE_TERRAIN_PLAIN; } if (MetatileBehavior_IsDeepWaterTerrain(tileBehavior)) return BATTLE_TERRAIN_WATER; if (MetatileBehavior_IsSurfable(tileBehavior)) return BATTLE_TERRAIN_POND; if (MetatileBehavior_IsMountain(tileBehavior)) return BATTLE_TERRAIN_MOUNTAIN; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) { if (MetatileBehavior_GetBridgeType(tileBehavior)) return BATTLE_TERRAIN_POND; if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) return BATTLE_TERRAIN_WATER; } return BATTLE_TERRAIN_PLAIN; } static u8 GetBattleTransitionTypeByMap(void) { u16 behavior; s16 x, y; PlayerGetDestCoords(&x, &y); behavior = MapGridGetMetatileBehaviorAt(x, y); if (Overworld_GetFlashLevel()) return TRANSITION_TYPE_FLASH; if (MetatileBehavior_IsSurfable(behavior)) return TRANSITION_TYPE_WATER; switch (gMapHeader.mapType) { case MAP_TYPE_UNDERGROUND: return TRANSITION_TYPE_CAVE; case MAP_TYPE_UNDERWATER: return TRANSITION_TYPE_WATER; default: return TRANSITION_TYPE_NORMAL; } } static u16 GetSumOfPlayerPartyLevel(u8 numMons) { u8 sum = 0; s32 i; for (i = 0; i < PARTY_SIZE; ++i) { u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); if (species != SPECIES_EGG && species != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) { sum += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); if (--numMons == 0) break; } } return sum; } static u8 GetSumOfEnemyPartyLevel(u16 opponentId, u8 numMons) { u32 i; u8 sum; u32 count = numMons; s8 levelScaling = GetScaledLevel(); if (gTrainers[opponentId].partySize < count) count = gTrainers[opponentId].partySize; sum = 0; switch (gTrainers[opponentId].partyFlags) { case 0: { const struct TrainerMonNoItemDefaultMoves *party; party = gTrainers[opponentId].party.NoItemDefaultMoves; for (i = 0; i < count; ++i) sum += (party[i].lvl + levelScaling); } break; case F_TRAINER_PARTY_CUSTOM_MOVESET: { const struct TrainerMonNoItemCustomMoves *party; party = gTrainers[opponentId].party.NoItemCustomMoves; for (i = 0; i < count; ++i) sum += (party[i].lvl + levelScaling); } break; case F_TRAINER_PARTY_HELD_ITEM: { const struct TrainerMonItemDefaultMoves *party; party = gTrainers[opponentId].party.ItemDefaultMoves; for (i = 0; i < count; ++i) sum += (party[i].lvl + levelScaling); } break; case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM: { const struct TrainerMonItemCustomMoves *party; party = gTrainers[opponentId].party.ItemCustomMoves; for (i = 0; i < count; ++i) sum += (party[i].lvl + levelScaling); } break; case F_TRAINER_PARTY_EVS: { const struct TrainerMonItemCustomMovesEVs *party; party = gTrainers[opponentId].party.ItemCustomMovesEVs; for (i = 0; i < count; ++i) sum += (party[i].lvl + levelScaling); } } if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) { return GetMonData(gPlayerParty[0], MON_DATA_LEVEL, NULL); } return sum; } static u8 GetWildBattleTransition(void) { u8 transitionType = GetBattleTransitionTypeByMap(); u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); u8 playerLevel = GetSumOfPlayerPartyLevel(1); if (enemyLevel < playerLevel) return sBattleTransitionTable_Wild[transitionType][0]; else return sBattleTransitionTable_Wild[transitionType][1]; } static u8 GetTrainerBattleTransition(void) { u8 minPartyCount; u8 transitionType; u8 enemyLevel; u8 playerLevel; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) return B_TRANSITION_BLUE; if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR) { if (gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LORELEI || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LORELEI_2 || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LORELEI_CHALLENGE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2) return B_TRANSITION_LORELEI; if (gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_BRUNO || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_BRUNO_2 || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_BRUNO_CHALLENGE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_BRUNO_CHALLENGE_2) return B_TRANSITION_BRUNO; if (gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_AGATHA || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_AGATHA_2 || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_AGATHA_CHALLENGE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_AGATHA_CHALLENGE_2) return B_TRANSITION_AGATHA; if (gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LANCE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LANCE_2 || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LANCE_CHALLENGE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LANCE_CHALLENGE_2) return B_TRANSITION_LANCE; return B_TRANSITION_BLUE; } if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION) return B_TRANSITION_BLUE; if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_PKMN_PROF) return B_TRANSITION_OAK; if (sTrainers[gTrainerBattleOpponent_A].doubleBattle == TRUE) minPartyCount = 2; // double battles always at least have 2 pokemon. else minPartyCount = 1; transitionType = GetBattleTransitionTypeByMap(); enemyLevel = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent_A, minPartyCount); playerLevel = GetSumOfPlayerPartyLevel(minPartyCount); if (enemyLevel < playerLevel) return sBattleTransitionTable_Trainer[transitionType][0]; else return sBattleTransitionTable_Trainer[transitionType][1]; } u8 BattleSetup_GetBattleTowerBattleTransition(void) { u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); u8 playerLevel = GetSumOfPlayerPartyLevel(1); if (enemyLevel < playerLevel) return B_TRANSITION_POKEBALLS_TRAIL; else return B_TRANSITION_BIG_POKEBALL; } static u32 TrainerBattleLoadArg32(const u8 *ptr) { return T1_READ_32(ptr); } static u16 TrainerBattleLoadArg16(const u8 *ptr) { return T1_READ_16(ptr); } static u8 TrainerBattleLoadArg8(const u8 *ptr) { return T1_READ_8(ptr); } static u16 GetTrainerAFlag(void) { return TRAINER_FLAGS_START + gTrainerBattleOpponent_A; } static bool32 IsPlayerDefeated(u32 battleOutcome) { switch (battleOutcome) { case B_OUTCOME_LOST: case B_OUTCOME_DREW: return TRUE; case B_OUTCOME_WON: case B_OUTCOME_RAN: case B_OUTCOME_PLAYER_TELEPORTED: case B_OUTCOME_MON_FLED: case B_OUTCOME_CAUGHT: return FALSE; default: return FALSE; } } static void InitTrainerBattleVariables(void) { sTrainerBattleMode = 0; gTrainerBattleOpponent_A = 0; sTrainerObjectEventLocalId = 0; sTrainerAIntroSpeech = NULL; sTrainerADefeatSpeech = NULL; sTrainerVictorySpeech = NULL; sTrainerCannotBattleSpeech = NULL; sTrainerBattleEndScript = NULL; sTrainerABattleScriptRetAddr = NULL; sRivalBattleFlags = 0; } static inline void SetU8(void *ptr, u8 value) { *(u8 *)(ptr) = value; } static inline void SetU16(void *ptr, u16 value) { *(u16 *)(ptr) = value; } static inline void SetU32(void *ptr, u32 value) { *(u32 *)(ptr) = value; } static inline void SetPtr(const void *ptr, const void *value) { *(const void **)(ptr) = value; } static void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, const u8 *data) { while (1) { switch (specs->ptrType) { case TRAINER_PARAM_LOAD_VAL_8BIT: SetU8(specs->varPtr, TrainerBattleLoadArg8(data)); data += 1; break; case TRAINER_PARAM_LOAD_VAL_16BIT: SetU16(specs->varPtr, TrainerBattleLoadArg16(data)); data += 2; break; case TRAINER_PARAM_LOAD_VAL_32BIT: SetU32(specs->varPtr, TrainerBattleLoadArg32(data)); data += 4; break; case TRAINER_PARAM_CLEAR_VAL_8BIT: SetU8(specs->varPtr, 0); break; case TRAINER_PARAM_CLEAR_VAL_16BIT: SetU16(specs->varPtr, 0); break; case TRAINER_PARAM_CLEAR_VAL_32BIT: SetU32(specs->varPtr, 0); break; case TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR: SetPtr(specs->varPtr, data); return; } ++specs; } } static void SetMapVarsToTrainer(void) { if (sTrainerObjectEventLocalId != 0) { gSpecialVar_LastTalked = sTrainerObjectEventLocalId; gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(sTrainerObjectEventLocalId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } } const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) { InitTrainerBattleVariables(); sTrainerBattleMode = TrainerBattleLoadArg8(data); switch (sTrainerBattleMode) { case TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT: TrainerBattleLoadArgs(sOrdinaryNoIntroBattleParams, data); return EventScript_DoNoIntroTrainerBattle; case TRAINER_BATTLE_DOUBLE: TrainerBattleLoadArgs(sDoubleBattleParams, data); SetMapVarsToTrainer(); return EventScript_TryDoDoubleTrainerBattle; case TRAINER_BATTLE_CONTINUE_SCRIPT: case TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC: TrainerBattleLoadArgs(sContinueScriptBattleParams, data); SetMapVarsToTrainer(); return EventScript_TryDoNormalTrainerBattle; case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE: case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC: TrainerBattleLoadArgs(sContinueScriptDoubleBattleParams, data); SetMapVarsToTrainer(); return EventScript_TryDoDoubleTrainerBattle; case TRAINER_BATTLE_REMATCH_DOUBLE: QL_FinishRecordingScene(); TrainerBattleLoadArgs(sDoubleBattleParams, data); SetMapVarsToTrainer(); gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); return EventScript_TryDoDoubleRematchBattle; case TRAINER_BATTLE_REMATCH: QL_FinishRecordingScene(); TrainerBattleLoadArgs(sOrdinaryBattleParams, data); SetMapVarsToTrainer(); gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); return EventScript_TryDoRematchBattle; case TRAINER_BATTLE_EARLY_RIVAL: TrainerBattleLoadArgs(sEarlyRivalBattleParams, data); return EventScript_DoNoIntroTrainerBattle; default: TrainerBattleLoadArgs(sOrdinaryBattleParams, data); SetMapVarsToTrainer(); return EventScript_TryDoNormalTrainerBattle; } } void ConfigureAndSetUpOneTrainerBattle(u8 trainerEventObjId, const u8 *trainerScript) { gSelectedObjectEvent = trainerEventObjId; gSpecialVar_LastTalked = gObjectEvents[trainerEventObjId].localId; BattleSetup_ConfigureTrainerBattle(trainerScript + 1); ScriptContext_SetupScript(EventScript_DoTrainerBattleFromApproach); LockPlayerFieldControls(); } bool32 GetTrainerFlagFromScriptPointer(const u8 *data) { u32 flag = TrainerBattleLoadArg16(data + 2); return FlagGet(TRAINER_FLAGS_START + flag); } void SetUpTrainerMovement(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gSelectedObjectEvent]; SetTrainerMovementType(objectEvent, GetTrainerFacingDirectionMovementType(objectEvent->facingDirection)); } u8 GetTrainerBattleMode(void) { return sTrainerBattleMode; } u16 GetRivalBattleFlags(void) { return sRivalBattleFlags; } u16 Script_HasTrainerBeenFought(void) { if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) { return CheckMasterTrainerFlag(gSpecialVar_0x8009); } return FlagGet(GetTrainerAFlag()); } void SetBattledTrainerFlag(void) { if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) { SetMasterTrainerFlag(gSpecialVar_0x8009); return; } FlagSet(GetTrainerAFlag()); } // not used static void SetBattledTrainerFlag2(void) { FlagSet(GetTrainerAFlag()); } bool8 HasTrainerBeenFought(u16 trainerId) { if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) { return CheckMasterTrainerFlag(gSpecialVar_0x8009); } return FlagGet(TRAINER_FLAGS_START + trainerId); } void SetTrainerFlag(u16 trainerId) { if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) { SetMasterTrainerFlag(gSpecialVar_0x8009); return; } FlagSet(TRAINER_FLAGS_START + trainerId); } void ClearTrainerFlag(u16 trainerId) { FlagClear(TRAINER_FLAGS_START + trainerId); } void StartTrainerBattle(void) { gBattleTypeFlags = BATTLE_TYPE_TRAINER; if (GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL && GetRivalBattleFlags() & RIVAL_BATTLE_TUTORIAL) gBattleTypeFlags |= BATTLE_TYPE_FIRST_BATTLE; gMain.savedCallback = CB2_EndTrainerBattle; DoTrainerBattle(); ScriptContext_Stop(); } static void CB2_EndTrainerBattle(void) { if (sTrainerBattleMode == TRAINER_BATTLE_EARLY_RIVAL) { if (IsPlayerDefeated(gBattleOutcome) == TRUE) { gSpecialVar_Result = TRUE; if (sRivalBattleFlags & RIVAL_BATTLE_HEAL_AFTER) { HealPlayerPartyOak(); } else { SetMainCallback2(CB2_WhiteOut); return; } SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); SetBattledTrainerFlag(); QuestLogEvents_HandleEndTrainerBattle(); } else { gSpecialVar_Result = FALSE; SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); SetBattledTrainerFlag(); QuestLogEvents_HandleEndTrainerBattle(); } } else { if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) { if(IsPlayerDefeated(gBattleOutcome) == TRUE) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); QuestLogEvents_HandleEndTrainerBattle(); } else { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); SetBattledTrainerFlag(); QuestLogEvents_HandleEndTrainerBattle(); } return; } if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) { SetMainCallback2(CB2_WhiteOut); } else { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); SetBattledTrainerFlag(); QuestLogEvents_HandleEndTrainerBattle(); } } } static void CB2_EndRematchBattle(void) { if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) { SetMainCallback2(CB2_WhiteOut); } else { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); SetBattledTrainerFlag(); ClearRematchStateOfLastTalked(); ResetDeferredLinkEvent(); } } void StartRematchBattle(void) { gBattleTypeFlags = BATTLE_TYPE_TRAINER; gMain.savedCallback = CB2_EndRematchBattle; DoTrainerBattle(); ScriptContext_Stop(); } void ShowTrainerIntroSpeech(void) { ShowFieldMessage(GetIntroSpeechOfApproachingTrainer()); } const u8 *BattleSetup_GetScriptAddrAfterBattle(void) { if (sTrainerBattleEndScript != NULL) return sTrainerBattleEndScript; else return EventScript_ReleaseEnd; } const u8 *BattleSetup_GetTrainerPostBattleScript(void) { if (sTrainerABattleScriptRetAddr != NULL) return sTrainerABattleScriptRetAddr; else return EventScript_ReleaseEnd; } void ShowTrainerCantBattleSpeech(void) { ShowFieldMessage(GetTrainerCantBattleSpeech()); } void PlayTrainerEncounterMusic(void) { u16 music; if (!QL_IS_PLAYBACK_STATE && sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC && sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC) { switch (GetTrainerEncounterMusicId(gTrainerBattleOpponent_A)) { case TRAINER_ENCOUNTER_MUSIC_FEMALE: case TRAINER_ENCOUNTER_MUSIC_GIRL: case TRAINER_ENCOUNTER_MUSIC_TWINS: music = MUS_ENCOUNTER_GIRL; break; case TRAINER_ENCOUNTER_MUSIC_MALE: case TRAINER_ENCOUNTER_MUSIC_INTENSE: case TRAINER_ENCOUNTER_MUSIC_COOL: case TRAINER_ENCOUNTER_MUSIC_SWIMMER: case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR: case TRAINER_ENCOUNTER_MUSIC_HIKER: case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER: case TRAINER_ENCOUNTER_MUSIC_RICH: music = MUS_ENCOUNTER_BOY; break; default: music = MUS_ENCOUNTER_ROCKET; break; } PlayNewMapMusic(music); } } static const u8 *ReturnEmptyStringIfNull(const u8 *string) { if (string == NULL) return gString_Dummy; else return string; } static const u8 *GetIntroSpeechOfApproachingTrainer(void) { return ReturnEmptyStringIfNull(sTrainerAIntroSpeech); } const u8 *GetTrainerALoseText(void) { const u8 *string = sTrainerADefeatSpeech; StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(string)); return gStringVar4; } const u8 *GetTrainerWonSpeech(void) { StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(sTrainerVictorySpeech)); return gStringVar4; } static const u8 *GetTrainerCantBattleSpeech(void) { return ReturnEmptyStringIfNull(sTrainerCannotBattleSpeech); } s8 GetScaledLevel(void) { u8 levelScaling = gMapHeader.levelScaling; if(gSaveBlock1Ptr->keyFlags.difficulty == DIFFICULTY_CHALLENGE) { //we're good, just return return levelScaling; } else if(gSaveBlock1Ptr->keyFlags.difficulty == DIFFICULTY_EASY) { levelScaling = 0 - levelScaling; return levelScaling; } else { //normal mode levelScaling = 0; return levelScaling; } } ================================================ FILE: src/battle_tower.c ================================================ #include "global.h" #include "battle_tower.h" #include "random.h" #include "text.h" #include "event_data.h" #include "event_object_movement.h" #include "string_util.h" #include "battle_message.h" #include "data.h" #include "pokedex.h" #include "overworld.h" #include "battle_transition.h" #include "easy_chat.h" #include "battle_setup.h" #include "battle_main.h" #include "task.h" #include "battle.h" #include "party_menu.h" #include "new_game.h" #include "save.h" #include "item.h" #include "script_pokemon_util.h" #include "trainer_tower.h" #include "load_save.h" #include "malloc.h" #include "constants/trainers.h" #include "constants/species.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/pokemon.h" #include "constants/event_objects.h" static EWRAM_DATA u16 sSpecialVar_0x8004_Copy = 0; #define TakeBravoTrainerBattleTowerOffTheAir() #define ewram160FB (*((u8 *)&gBattleStruct->field_DA)) static void ResetBattleTowerStreak(u8 levelType); static void SetBattleTowerTrainerGfxId(u8 trainerClass); static void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid); static void SaveCurrentWinStreak(void); static void ValidateBattleTowerRecordChecksums(void); static void SetBattleTowerRecordChecksum(struct BattleTowerRecord * record); static void ClearBattleTowerRecord(struct BattleTowerRecord * record); static void PopulateBravoTrainerBattleTowerLostData(void); static u16 GetCurrentBattleTowerWinStreak(u8 levelType); static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer * eReaderTrainer); static void PrintEReaderTrainerFarewellMessage(void); void SaveGameFrontier(void); // unknown unused data static const u8 sUnused[] = { 5, 4, 1, 16, 4, 2, 5, 6, 3, 16, 6, 4, 0, 1, 2, 3, 0, 2, 3 }; struct SinglesTrainerInfo { u8 objGfx; u8 facilityClass; bool8 gender; }; static const struct SinglesTrainerInfo sSingleBattleTrainerInfo[] = { {OBJ_EVENT_GFX_AROMA_LADY, FACILITY_CLASS_RS_AROMA_LADY, FEMALE}, {OBJ_EVENT_GFX_RUIN_MANIAC, FACILITY_CLASS_RS_RUIN_MANIAC, MALE}, {OBJ_EVENT_GFX_TUBER_F, FACILITY_CLASS_RS_TUBER_F, FEMALE}, {OBJ_EVENT_GFX_TUBER_M_LAND, FACILITY_CLASS_RS_TUBER_M, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_RS_COOLTRAINER_M, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_RS_COOLTRAINER_F, FEMALE}, {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_HEX_MANIAC, MALE}, {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_RS_LADY, FEMALE}, {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_RS_BEAUTY, FEMALE}, {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_RICH_BOY, MALE}, {OBJ_EVENT_GFX_POKE_MANIAC, FACILITY_CLASS_RS_POKEMANIAC, MALE}, {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_RS_SWIMMER_M, MALE}, {OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_RS_BLACK_BELT, MALE}, {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_GUITARIST, MALE}, {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_KINDLER, MALE}, {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_RS_CAMPER, MALE}, {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BUG_MANIAC, MALE}, {OBJ_EVENT_GFX_PSYCHIC_M, FACILITY_CLASS_RS_PSYCHIC_M, MALE}, {OBJ_EVENT_GFX_PSYCHIC_F, FACILITY_CLASS_RS_PSYCHIC_F, FEMALE}, {OBJ_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_RS_GENTLEMAN, MALE}, {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_SCHOOL_KID_M, MALE}, {OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SCHOOL_KID_F, FEMALE}, {OBJ_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_POKEFAN_M, MALE}, {OBJ_EVENT_GFX_WOMAN_3, FACILITY_CLASS_POKEFAN_F, FEMALE}, {OBJ_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_EXPERT_M, MALE}, {OBJ_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_EXPERT_F, FEMALE}, {OBJ_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_RS_YOUNGSTER, MALE}, {OBJ_EVENT_GFX_FISHER, FACILITY_CLASS_RS_FISHERMAN, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_DRAGON_TAMER, MALE}, {OBJ_EVENT_GFX_BIRD_KEEPER, FACILITY_CLASS_RS_BIRD_KEEPER, MALE}, {OBJ_EVENT_GFX_LITTLE_BOY, FACILITY_CLASS_NINJA_BOY, MALE}, {OBJ_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_BATTLE_GIRL, FEMALE}, {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_PARASOL_LADY, FEMALE}, {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_RS_SWIMMER_F, FEMALE}, {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_RS_PICNICKER, FEMALE}, {OBJ_EVENT_GFX_SAILOR, FACILITY_CLASS_RS_SAILOR, MALE}, {OBJ_EVENT_GFX_FAT_MAN, FACILITY_CLASS_COLLECTOR, MALE}, {OBJ_EVENT_GFX_MAN, FACILITY_CLASS_RS_PKMN_BREEDER_M, MALE}, {OBJ_EVENT_GFX_POKEMON_BREEDER, FACILITY_CLASS_RS_PKMN_BREEDER_F, FEMALE}, {OBJ_EVENT_GFX_POKEMON_RANGER_M, FACILITY_CLASS_RS_PKMN_RANGER_M, MALE}, {OBJ_EVENT_GFX_POKEMON_RANGER_F, FACILITY_CLASS_RS_PKMN_RANGER_F, FEMALE}, {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_RS_LASS, FEMALE}, {OBJ_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_RS_BUG_CATCHER, MALE}, {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_RS_HIKER, MALE}, {OBJ_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, MALE}, {OBJ_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER, MALE}, {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_LASS, FEMALE}, {OBJ_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR, MALE}, {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER, MALE}, {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER, FEMALE}, {OBJ_EVENT_GFX_POKE_MANIAC, FACILITY_CLASS_POKEMANIAC, MALE}, {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_SUPER_NERD, MALE}, {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER, MALE}, {OBJ_EVENT_GFX_BIKER, FACILITY_CLASS_BIKER, MALE}, {OBJ_EVENT_GFX_BURGLAR, FACILITY_CLASS_BURGLAR, MALE}, {OBJ_EVENT_GFX_ENGINEER, FACILITY_CLASS_ENGINEER, MALE}, {OBJ_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN, MALE}, {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_M, MALE}, {OBJ_EVENT_GFX_CUE_BALL, FACILITY_CLASS_CUE_BALL, MALE}, {OBJ_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_GAMER, MALE}, {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY, FEMALE}, {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_F, FEMALE}, {OBJ_EVENT_GFX_PSYCHIC_M, FACILITY_CLASS_PSYCHIC_M, MALE}, {OBJ_EVENT_GFX_ROCKER_2, FACILITY_CLASS_ROCKER, MALE}, {OBJ_EVENT_GFX_JUGGLER, FACILITY_CLASS_JUGGLER, MALE}, {OBJ_EVENT_GFX_TAMER, FACILITY_CLASS_TAMER, MALE}, {OBJ_EVENT_GFX_BIRD_KEEPER, FACILITY_CLASS_BIRD_KEEPER, MALE}, {OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT, MALE}, {OBJ_EVENT_GFX_SCIENTIST, FACILITY_CLASS_SCIENTIST, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER_M, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_F, FEMALE}, {OBJ_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN, MALE}, {OBJ_EVENT_GFX_CHANNELER, FACILITY_CLASS_CHANNELER, FEMALE}, {OBJ_EVENT_GFX_PSYCHIC_F, FACILITY_CLASS_PSYCHIC_F, FEMALE}, {OBJ_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_CRUSH_GIRL, FEMALE}, {OBJ_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER, FEMALE}, {OBJ_EVENT_GFX_POKEMON_BREEDER, FACILITY_CLASS_PKMN_BREEDER, FEMALE}, {OBJ_EVENT_GFX_POKEMON_RANGER_M, FACILITY_CLASS_PKMN_RANGER_M, MALE}, {OBJ_EVENT_GFX_POKEMON_RANGER_F, FACILITY_CLASS_PKMN_RANGER_F, FEMALE}, {OBJ_EVENT_GFX_AROMA_LADY, FACILITY_CLASS_AROMA_LADY, FEMALE}, {OBJ_EVENT_GFX_RUIN_MANIAC, FACILITY_CLASS_RUIN_MANIAC, MALE}, {OBJ_EVENT_GFX_LADY, FACILITY_CLASS_LADY, FEMALE}, {OBJ_EVENT_GFX_PAINTER, FACILITY_CLASS_PAINTER, FEMALE} }; #include "data/battle_tower/trainers.h" static const u16 sBattleTowerHeldItems[] = { ITEM_NONE, ITEM_KINGS_ROCK, ITEM_SITRUS_BERRY, ITEM_ORAN_BERRY, ITEM_CHESTO_BERRY, ITEM_HARD_STONE, ITEM_FOCUS_BAND, ITEM_PERSIM_BERRY, ITEM_MIRACLE_SEED, ITEM_BERRY_JUICE, ITEM_MACHO_BRACE, ITEM_SILVER_POWDER, ITEM_CHERI_BERRY, ITEM_BLACK_GLASSES, ITEM_BLACK_BELT, ITEM_SOUL_DEW, ITEM_CHOICE_BAND, ITEM_MAGNET, ITEM_SILK_SCARF, ITEM_WHITE_HERB, ITEM_DEEP_SEA_SCALE, ITEM_DEEP_SEA_TOOTH, ITEM_MYSTIC_WATER, ITEM_SHARP_BEAK, ITEM_QUICK_CLAW, ITEM_LEFTOVERS, ITEM_RAWST_BERRY, ITEM_LIGHT_BALL, ITEM_POISON_BARB, ITEM_NEVER_MELT_ICE, ITEM_ASPEAR_BERRY, ITEM_SPELL_TAG, ITEM_BRIGHT_POWDER, ITEM_LEPPA_BERRY, ITEM_SCOPE_LENS, ITEM_TWISTED_SPOON, ITEM_METAL_COAT, ITEM_MENTAL_HERB, ITEM_CHARCOAL, ITEM_PECHA_BERRY, ITEM_SOFT_SAND, ITEM_LUM_BERRY, ITEM_DRAGON_SCALE, ITEM_DRAGON_FANG, ITEM_IAPAPA_BERRY, ITEM_WIKI_BERRY, ITEM_SEA_INCENSE, ITEM_SHELL_BELL, ITEM_SALAC_BERRY, ITEM_LANSAT_BERRY, ITEM_APICOT_BERRY, ITEM_STARF_BERRY, ITEM_LIECHI_BERRY, ITEM_STICK, ITEM_LAX_INCENSE, ITEM_AGUAV_BERRY, ITEM_FIGY_BERRY, ITEM_THICK_CLUB, ITEM_MAGO_BERRY, ITEM_METAL_POWDER, ITEM_PETAYA_BERRY, ITEM_LUCKY_PUNCH, ITEM_GANLON_BERRY }; #include "data/battle_tower/level_50_mons.h" #include "data/battle_tower/level_100_mons.h" static const u8 sMaleTrainerClasses[] = { }; static const u8 sFemaleTrainerClasses[] = { }; static const u8 sMaleTrainerGfx[] = { }; static const u8 sFemaleTrainerGfx[] = { }; const u16 gBattleTowerBannedSpecies[] = { SPECIES_MEW, SPECIES_MEWTWO, SPECIES_HO_OH, SPECIES_LUGIA, SPECIES_CELEBI, SPECIES_KYOGRE, SPECIES_GROUDON, SPECIES_RAYQUAZA, SPECIES_JIRACHI, SPECIES_DEOXYS, 0xFFFF }; static const u16 sShortStreakPrizes[] = { ITEM_HP_UP, ITEM_PROTEIN, ITEM_IRON, ITEM_CALCIUM, ITEM_CARBOS, ITEM_ZINC }; static const u16 sLongStreakPrizes[] = { ITEM_BRIGHT_POWDER, ITEM_WHITE_HERB, ITEM_QUICK_CLAW, ITEM_LEFTOVERS, ITEM_MENTAL_HERB, ITEM_KINGS_ROCK, ITEM_FOCUS_BAND, ITEM_SCOPE_LENS, ITEM_CHOICE_BAND }; void BattleTowerMapScript2(void) { u8 count = 0; s32 levelType; for (levelType = 0; levelType < 2; levelType++) { switch (gSaveBlock2Ptr->battleTower.var_4AE[levelType]) { default: case 0: ResetBattleTowerStreak(levelType); if (count == 0) VarSet(VAR_TEMP_0, 5); break; case 1: ResetBattleTowerStreak(levelType); VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_SAVE_SCUM); count++; break; case 3: break; case 4: VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_WON7); count++; break; case 5: VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_LOST); count++; break; case 6: break; case 2: VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_QUICKSAVE); count++; break; } } if (gSaveBlock2Ptr->battleTower.var_4AE[0] == 3 && gSaveBlock2Ptr->battleTower.var_4AE[1] == 3) VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_INACTIVE); ValidateBattleTowerRecordChecksums(); } static void ResetBattleTowerStreak(u8 levelType) { gSaveBlock2Ptr->battleTower.var_4AE[levelType] = 0; gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] = 1; gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] = 1; } static bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak) { u8 trainerTeamLevel; u8 monLevel; s32 i; u16 validPartySpecies[6]; u16 validPartyHeldItems[6]; u8 numValid; numValid = 0; ValidateEReaderTrainer(); if (gSpecialVar_Result != 0 || gSaveBlock2Ptr->battleTower.ereaderTrainer.winStreak != winStreak) return FALSE; if (levelType != 0) trainerTeamLevel = 100; else trainerTeamLevel = 50; for (i = 0; i < 3; i++) { monLevel = gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].level; if (gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].level != trainerTeamLevel) return FALSE; CheckMonBattleTowerBanlist( gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].species, gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].heldItem, 1, levelType, monLevel, validPartySpecies, validPartyHeldItems, &numValid); } return (numValid == 3); } static bool8 ChooseSpecialBattleTowerTrainer(void) { s32 recordIndex, i; u8 battleTowerLevelType; u16 winStreak; bool8 retVal; s32 numCandidates; u32 trainerIds[5]; numCandidates = 0; battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); if (ShouldBattleEReaderTrainer(battleTowerLevelType, winStreak)) { gSaveBlock2Ptr->battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID; retVal = TRUE; } else { // Check if one of the battle tower trainers from record mixing should be the next trainer. for (recordIndex = 0; recordIndex < 5; recordIndex++) { struct BattleTowerRecord *record = &gSaveBlock2Ptr->battleTower.records[recordIndex]; u32 recordHasData = 0; u32 checksum = 0; for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32) - 1; i++) { recordHasData |= ((u32 *) record)[i]; checksum += ((u32 *) record)[i]; } if (gSaveBlock2Ptr->battleTower.records[recordIndex].winStreak == winStreak && gSaveBlock2Ptr->battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType && recordHasData && gSaveBlock2Ptr->battleTower.records[recordIndex].checksum == checksum) { trainerIds[numCandidates] = recordIndex; numCandidates++; } } if (numCandidates == 0) { retVal = FALSE; } else { gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerIds[Random() % numCandidates] + BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID; retVal = TRUE; } } return retVal; } void ChooseNextBattleTowerTrainer(void) { int i; u16 trainerId; bool8 levelType; levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; if (ChooseSpecialBattleTowerTrainer()) { SetBattleTowerTrainerGfxId(gSaveBlock2Ptr->battleTower.battleTowerTrainerId); gSaveBlock2Ptr->battleTower.battledTrainerIds[gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1] = gSaveBlock2Ptr->battleTower.battleTowerTrainerId; return; } if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] <= 7) { if (gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] == 7) { do { trainerId = ((Random() & 0xFF) * 5) >> 7; trainerId += (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] - 1) * 10 + 20; // Ensure trainer wasn't previously fought in this challenge. for (i = 0; i < gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2Ptr->battleTower.battledTrainerIds[i] != trainerId; i++); } while (i != gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1); gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId; } else { do { trainerId = (((Random() & 0xFF) * 5) >> 6); trainerId += (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] - 1) * 10; // Ensure trainer wasn't previously fought in this challenge. for (i = 0; i < gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2Ptr->battleTower.battledTrainerIds[i] != trainerId; i++); } while (i != gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1); gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId; } } else { do { trainerId = (((Random() & 0xFF) * 30) >> 8) + 70; // Ensure trainer wasn't previously fought in this challenge. for (i = 0; i < gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2Ptr->battleTower.battledTrainerIds[i] != trainerId; i++); } while (i != gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1); gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId; } SetBattleTowerTrainerGfxId(gSaveBlock2Ptr->battleTower.battleTowerTrainerId); // Don't bother saving this trainer, since it's the last one in the challenge. if (gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] < 7) gSaveBlock2Ptr->battleTower.battledTrainerIds[gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1] = gSaveBlock2Ptr->battleTower.battleTowerTrainerId; } static void SetBattleTowerTrainerGfxId(u8 trainerClass) { u32 i; u8 facilityClass, trainerGfx1; facilityClass = gBattleTowerTrainers[trainerClass].trainerClass; for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++) { if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass) break; } if (i != NELEMS(sSingleBattleTrainerInfo)) { trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx; gSpecialVar_LastTalked = sSingleBattleTrainerInfo[i].gender; } else { trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER; gSpecialVar_LastTalked = MALE; } VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1); } void SetEReaderTrainerGfxId(void) { SetBattleTowerTrainerGfxId(BATTLE_TOWER_EREADER_TRAINER_ID); } // Unreferenced; formerly used by Record Mixing in R/S static void UpdateOrInsertReceivedBattleTowerRecord(struct BattleTowerRecord * record0) { s32 i; s32 j; s32 k; s32 l = 0; struct BattleTowerRecord * record = record0; u16 winStreaks[6]; u16 indices[6]; for (i = 0; i < 5; i++) { k = 0; for (j = 0; j < 4; j++) { if (gSaveBlock2Ptr->battleTower.records[i].trainerId[j] != record->trainerId[j]) break; } if (j == 4) { for (k = 0; k < 7; k++) { if (gSaveBlock2Ptr->battleTower.records[i].name[j] != record->name[j]) break; if (record->name[j] == EOS) { k = 7; break; } } } if (k == 7) break; } if (i < 5) { gSaveBlock2Ptr->battleTower.records[i] = *record; return; } for (i = 0; i < 5; i++) { if (gSaveBlock2Ptr->battleTower.records[i].winStreak == 0) break; } if (i < 5) { gSaveBlock2Ptr->battleTower.records[i] = *record; return; } winStreaks[0] = gSaveBlock2Ptr->battleTower.records[0].winStreak; indices[0] = 0; l++; for (i = 1; i < 5; i++) { for (j = 0; j < l; j++) { if (gSaveBlock2Ptr->battleTower.records[i].winStreak < winStreaks[j]) { j = 0; l = 1; winStreaks[0] = gSaveBlock2Ptr->battleTower.records[i].winStreak; indices[0] = i; break; } if (gSaveBlock2Ptr->battleTower.records[i].winStreak > winStreaks[j]) break; } if (j == l) { winStreaks[l] = gSaveBlock2Ptr->battleTower.records[i].winStreak; indices[l] = i; l++; } } i = Random() % l; gSaveBlock2Ptr->battleTower.records[indices[i]] = *record; } u8 GetBattleTowerTrainerFrontSpriteId(void) { if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) { return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass]; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) { return gFacilityClassToPicIndex[gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].trainerClass]; } else { return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; } } u8 GetBattleTowerTrainerClassNameId(void) { if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) { return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass]; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) { return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; } else { return gFacilityClassToTrainerClass[gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].trainerClass]; } } void GetBattleTowerTrainerName(u8 *dest) { s32 i; if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) { for (i = 0; i < 7; i++) dest[i] = gSaveBlock2Ptr->battleTower.ereaderTrainer.name[i]; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) { for (i = 0; i < 7; i++) dest[i] = gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].name[i]; } else { for (i = 0; i < 7; i++) dest[i] = gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].name[i]; } dest[i] = EOS; } static void FillBattleTowerTrainerParty(void) { s32 partyIndex; s32 i; u16 chosenMonIndices[3]; u8 friendship; u8 level; u8 fixedIV; u8 battleMonsOffset; u8 monPoolSize; u8 teamFlags; const struct BattleTowerPokemonTemplate *battleTowerMons; battleMonsOffset = 0; monPoolSize = 60; friendship = 255; ZeroEnemyPartyMons(); // Different trainers have access to different sets of pokemon to use in battle. // The pokemon later in gBattleTowerLevel100Mons or gBattleTowerLevel50Mons are // stronger. Additionally, the later trainers' pokemon are granted higher IVs. if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 20) { fixedIV = 6; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 30) { fixedIV = 9; battleMonsOffset = 30; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 40) { fixedIV = 12; battleMonsOffset = 60; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 50) { fixedIV = 15; battleMonsOffset = 90; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 60) { fixedIV = 18; battleMonsOffset = 120; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 70) { fixedIV = 21; battleMonsOffset = 150; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 80) { fixedIV = 31; battleMonsOffset = 180; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) { fixedIV = 31; battleMonsOffset = 200; monPoolSize = 100; } else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) { // Load E-Reader trainer's party. do { for (partyIndex = 0; partyIndex < 3; partyIndex++) CreateBattleTowerMon(&gEnemyParty[partyIndex], &gSaveBlock2Ptr->battleTower.ereaderTrainer.party[partyIndex]); return; } while (0); } else { // Load a battle tower record's party. (From record mixing) for (partyIndex = 0; partyIndex < 3; partyIndex++) { CreateBattleTowerMon( &gEnemyParty[partyIndex], &gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]); } return; } // Use the appropriate list of pokemon and level depending on the // current challenge type. (level 50 or level 100 challenge) if (gSaveBlock2Ptr->battleTower.battleTowerLevelType != 0) { battleTowerMons = gBattleTowerLevel100Mons; level = GetHighestLevelInPlayerParty(); if(level < 60) level = 60; } else { battleTowerMons = gBattleTowerLevel50Mons; level = 50; } teamFlags = gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].teamFlags; // Attempt to fill the trainer's party with random Pokemon until 3 have been // successfully chosen. The trainer's party may not have duplicate pokemon species // or duplicate held items. Each pokemon must have all of the trainer's team flags // set, as well. If any of those conditions are not met, then the loop starts over // and another pokemon is chosen at random. partyIndex = 0; while (partyIndex != 3) { // Pick a random pokemon index based on the number of pokemon available to choose from // and the starting offset in the battle tower pokemon array. s32 battleMonIndex = ((Random() & 0xFF) * monPoolSize) / 256 + battleMonsOffset; // Ensure the chosen pokemon has compatible team flags with the trainer. if (teamFlags == 0 || (battleTowerMons[battleMonIndex].teamFlags & teamFlags) == teamFlags) { // Ensure this pokemon species isn't a duplicate. for (i = 0; i < partyIndex; i++) { if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) == battleTowerMons[battleMonIndex].species) break; } if (i != partyIndex) continue; // Ensure this pokemon's held item isn't a duplicate. for (i = 0; i < partyIndex; i++) { if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != ITEM_NONE && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) break; } if (i != partyIndex) continue; // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary // because the species and held items were already checked directly above. Perhaps this // is leftover code before the logic for duplicate species and held items was added. //for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); for (i = 0; i < partyIndex; i++) { if (chosenMonIndices[i] == battleMonIndex) break; } if (i != partyIndex) continue; chosenMonIndices[partyIndex] = battleMonIndex; // Place the chosen pokemon into the trainer's party. CreateMonWithEVSpread( &gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].species, level, fixedIV, battleTowerMons[battleMonIndex].evSpread); // Give the chosen pokemon its specified moves. for (i = 0; i < 4; i++) { SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i); if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION) friendship = 0; // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. } SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship); SetMonData(&gEnemyParty[partyIndex], MON_DATA_HELD_ITEM, &sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]); // The pokemon was successfully added to the trainer's party, so it's safe to move on to // the next party slot. partyIndex++; } } } static u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 count) { if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { if (count == 0) StringAppend(gStringVar1, gText_BattleTowerBan_Space); count++; StringAppend(gStringVar1, gSpeciesNames[species]); switch (count) { case 2: StringAppend(gStringVar1, gText_BattleTowerBan_Newline2); break; case 5: case 8: case 11: StringAppend(gStringVar1, gText_BattleTowerBan_Newline1); break; default: StringAppend(gStringVar1, gText_BattleTowerBan_Space); break; } } return count; } static void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid) { s32 i; u32 counter = 0; if (species == SPECIES_EGG || species == SPECIES_NONE) return; while (1) { if (gBattleTowerBannedSpecies[counter] == 0xFFFF) break; if (gBattleTowerBannedSpecies[counter] == species) break; counter++; } if (gBattleTowerBannedSpecies[counter] != 0xFFFF) return; if (battleTowerLevelType == 0 && monLevel > 50) return; for (i = 0; i < *numValid && validPartySpecies[i] != species ; i++); if (i != *numValid) return; if (heldItem != ITEM_NONE) { for (i = 0; i < *numValid && validPartyHeldItems[i] != heldItem ; i++); if (i != *numValid) return; } validPartySpecies[*numValid] = species; validPartyHeldItems[*numValid] = heldItem; *numValid = *numValid + 1; } void CheckPartyBattleTowerBanlist(void) { s32 i; u16 species2; u16 heldItem; u8 level; u16 hp; u32 numBanlistCaught; u16 validPartySpecies[6]; u16 validPartyHeldItems[6]; u8 counter; counter = 0; for (i = 0; i < PARTY_SIZE; i++) { species2 = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); CheckMonBattleTowerBanlist(species2, heldItem, hp, gSpecialVar_Result, level, validPartySpecies, validPartyHeldItems, &counter); } if (counter < 3) { gStringVar1[0] = EOS; gSpecialVar_0x8004 = 1; counter = 0; for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) counter = AppendBattleTowerBannedSpeciesName(gBattleTowerBannedSpecies[i], counter); i = StringLength(gStringVar1); gStringVar1[i - 1] = EOS; if (counter < 3) StringAppend(gStringVar1, gText_BattleTowerBan_Is1); else StringAppend(gStringVar1, gText_BattleTowerBan_Is2); } else { gSpecialVar_0x8004 = 0; gSaveBlock2Ptr->battleTower.battleTowerLevelType = gSpecialVar_Result; } } static void BufferBattleTowerTrainerMessage(const u16 *greeting) { s32 i; if (EC_DoesEasyChatStringFitOnLine(greeting, 3, 2, 18)) { ConvertEasyChatWordsToString(gStringVar4, greeting, 2, 3); i = 0; while (gStringVar4[i++] != CHAR_NEWLINE) ; while (gStringVar4[i] != CHAR_NEWLINE) i++; gStringVar4[i] = CHAR_PROMPT_SCROLL; } else { ConvertEasyChatWordsToString(gStringVar4, greeting, 3, 2); } } void PrintBattleTowerTrainerGreeting(void) { if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting); else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) BufferBattleTowerTrainerMessage(gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].greeting); else BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting); } static void CB2_FinishEReaderBattle(void) { s32 i; u16 heldItem; switch (sSpecialVar_0x8004_Copy) { case 0: break; case 1: for (i = 0; i < PARTY_SIZE; i++) { heldItem = GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM); SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); } break; case 2: PrintEReaderTrainerFarewellMessage(); break; } SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } static void Task_WaitBT(u8 taskId) { if (IsBattleTransitionDone() == TRUE) { gMain.savedCallback = CB2_FinishEReaderBattle; CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_InitBattle); DestroyTask(taskId); } } void StartSpecialBattle(void) { s32 i; u16 heldItem; u8 transition; sSpecialVar_0x8004_Copy = gSpecialVar_0x8004; switch (sSpecialVar_0x8004_Copy) { case 0: // battle tower battle gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER); gTrainerBattleOpponent_A = 0; FillBattleTowerTrainerParty(); CreateTask(Task_WaitBT, 1); PlayMapChosenOrBattleBGM(0); transition = BattleSetup_GetBattleTowerBattleTransition(); BattleTransition_StartOnField(transition); break; case 1: // secret base battle for (i = 0; i < PARTY_SIZE; i++) { heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); SetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM, &heldItem); } CreateTask(Task_WaitBT, 1); PlayMapChosenOrBattleBGM(0); transition = BattleSetup_GetBattleTowerBattleTransition(); BattleTransition_StartOnField(transition); break; case 2: // e-reader trainer battle ZeroEnemyPartyMons(); for (i = 0; i < 3; i++) CreateBattleTowerMon(&gEnemyParty[i], &gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i]); gBattleTypeFlags = (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER); gTrainerBattleOpponent_A = 0; CreateTask(Task_WaitBT, 1); PlayMapChosenOrBattleBGM(0); transition = BattleSetup_GetBattleTowerBattleTransition(); BattleTransition_StartOnField(transition); break; } } void SetBattleTowerProperty(void) { s32 i; u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; switch (gSpecialVar_0x8004) { case 0: ewram160FB = gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType]; gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8005; break; case 1: gSaveBlock2Ptr->battleTower.battleTowerLevelType = gSpecialVar_0x8005; break; case 2: gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] = gSpecialVar_0x8005; break; case 3: gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] = gSpecialVar_0x8005; break; case 4: gSaveBlock2Ptr->battleTower.battleTowerTrainerId = gSpecialVar_0x8005; break; case 5: for (i = 0; i < 3; i++) gSaveBlock2Ptr->battleTower.selectedPartyMons[i] = gSelectedOrderFromParty[i]; break; case 6: if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer); if (gSaveBlock2Ptr->battleTower.totalBattleTowerWins < 9999) gSaveBlock2Ptr->battleTower.totalBattleTowerWins++; gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType]++; SaveCurrentWinStreak(); gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType]; gStringVar1[0] = gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1; gStringVar1[1] = 0xFF; break; case 7: if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] < 1430) gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType]++; SaveCurrentWinStreak(); gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType]; break; case 8: gSaveBlock2Ptr->battleTower.unk_554 = gSpecialVar_0x8005; break; case 9: break; case 10: SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak); break; case 11: if (gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] != 3) ResetBattleTowerStreak(battleTowerLevelType); break; case 12: gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = ewram160FB; break; case 13: gSaveBlock2Ptr->battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); break; case 14: gSaveBlock2Ptr->battleTower.lastStreakLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; break; } } void BattleTowerUtil(void) { u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; switch (gSpecialVar_0x8004) { case 0: gSpecialVar_Result = gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType]; break; case 1: gSpecialVar_Result = gSaveBlock2Ptr->battleTower.battleTowerLevelType; break; case 2: gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType]; break; case 3: gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType]; break; case 4: gSpecialVar_Result = gSaveBlock2Ptr->battleTower.battleTowerTrainerId; break; case 5: case 6: case 7: break; case 8: gSpecialVar_Result = gSaveBlock2Ptr->battleTower.unk_554; break; case 9: gSpecialVar_Result = GetCurrentBattleTowerWinStreak(battleTowerLevelType); break; case 10: SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak); break; case 11: ResetBattleTowerStreak(battleTowerLevelType); break; case 12: gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = ewram160FB; break; case 13: gSaveBlock2Ptr->battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); break; case 14: gSaveBlock2Ptr->battleTower.lastStreakLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; break; } } void SetBattleTowerParty(void) { s32 i; for (i = 0; i < 3; i++) gSelectedOrderFromParty[i] = gSaveBlock2Ptr->battleTower.selectedPartyMons[i]; ReducePlayerPartyToThree(); } static void SaveCurrentWinStreak(void) { u8 levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; u16 streak = GetCurrentBattleTowerWinStreak(levelType); if (gSaveBlock2Ptr->battleTower.recordWinStreaks[levelType] < streak) gSaveBlock2Ptr->battleTower.recordWinStreaks[levelType] = streak; if (gSaveBlock2Ptr->battleTower.recordWinStreaks[0] > gSaveBlock2Ptr->battleTower.recordWinStreaks[1]) { streak = gSaveBlock2Ptr->battleTower.recordWinStreaks[0]; SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); if (streak > 9999) gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = 9999; else gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = streak; } else { streak = gSaveBlock2Ptr->battleTower.recordWinStreaks[1]; SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); if (streak > 9999) gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = 9999; else gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = streak; } } static void SetPlayerBattleTowerRecord(void) { s32 i; u8 trainerClass; struct BattleTowerRecord *playerRecord = &gSaveBlock2Ptr->battleTower.playerRecord; u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; if (gSaveBlock2Ptr->playerGender != MALE) { trainerClass = sFemaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1] + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sFemaleTrainerClasses)]; } else { trainerClass = sMaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1] + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sMaleTrainerClasses)]; } playerRecord->battleTowerLevelType = battleTowerLevelType; playerRecord->trainerClass = trainerClass; CopyTrainerId(playerRecord->trainerId, gSaveBlock2Ptr->playerTrainerId); StringCopy_PlayerName(playerRecord->name, gSaveBlock2Ptr->playerName); playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); for (i = 0; i < 6; i++) playerRecord->greeting[i] = gSaveBlock1Ptr->easyChatBattleStart[i]; for (i = 0; i < 3; i++) ConvertPokemonToBattleTowerPokemon(&gPlayerParty[gSaveBlock2Ptr->battleTower.selectedPartyMons[i] - 1], &playerRecord->party[i]); SetBattleTowerRecordChecksum(&gSaveBlock2Ptr->battleTower.playerRecord); SaveCurrentWinStreak(); } void SaveBattleTowerProgress(void) { u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; /*if (gSpecialVar_0x8004 == 3 || gSpecialVar_0x8004 == 0) { if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] > 1 || gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] > 1) SetPlayerBattleTowerRecord(); }*/ //PopulateBravoTrainerBattleTowerLostData(); gSaveBlock2Ptr->battleTower.battleOutcome = gBattleOutcome; if (gSpecialVar_0x8004 != 3) gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8004; VarSet(VAR_TEMP_0, BTSPECIAL_TEST); gSaveBlock2Ptr->battleTower.unk_554 = 1; SaveGameFrontier(); //this is clobbering items, money, and other data } void SaveGameFrontier(void) //from Emerald { s32 i; struct Pokemon *monsParty = calloc(PARTY_SIZE, sizeof(struct Pokemon)); for (i = 0; i < PARTY_SIZE; i++) monsParty[i] = gPlayerParty[i]; i = gPlayerPartyCount; LoadPlayerParty(); SetContinueGameWarpStatusToDynamicWarp(); TrySavingData(SAVE_LINK); ClearContinueGameWarpStatus2(); gPlayerPartyCount = i; for (i = 0; i < PARTY_SIZE; i++) gPlayerParty[i] = monsParty[i]; free(monsParty); } void BattleTower_SoftReset(void) { DoSoftReset(); } static void ValidateBattleTowerRecordChecksums(void) { u32 i; s32 recordIndex; struct BattleTowerRecord *record; u32 checksum; record = &gSaveBlock2Ptr->battleTower.playerRecord; checksum = 0; for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) checksum += ((u32 *)record)[i]; if (gSaveBlock2Ptr->battleTower.playerRecord.checksum != checksum) ClearBattleTowerRecord(&gSaveBlock2Ptr->battleTower.playerRecord); for (recordIndex = 0; recordIndex < 5; recordIndex++) { record = &gSaveBlock2Ptr->battleTower.records[recordIndex]; checksum = 0; for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) checksum += ((u32 *)record)[i]; if (gSaveBlock2Ptr->battleTower.records[recordIndex].checksum != checksum) ClearBattleTowerRecord(&gSaveBlock2Ptr->battleTower.records[recordIndex]); } } static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record) { u32 i; record->checksum = 0; for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) record->checksum += ((u32 *)record)[i]; } static void ClearBattleTowerRecord(struct BattleTowerRecord *record) { u32 i; for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32); i++) ((u32 *)record)[i] = 0; } static void PopulateBravoTrainerBattleTowerLostData(void) { s32 i; GetBattleTowerTrainerName(gSaveBlock2Ptr->battleTower.defeatedByTrainerName); gSaveBlock2Ptr->battleTower.defeatedBySpecies = gBattleMons[1].species; gSaveBlock2Ptr->battleTower.firstMonSpecies = gBattleMons[0].species; for (i = 0; i < POKEMON_NAME_LENGTH; i++) gSaveBlock2Ptr->battleTower.firstMonNickname[i] = gBattleMons[0].nickname[i]; } static u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType) { u16 winStreak = ((gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] - 1) * 7 - 1) + gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType]; if (winStreak > 9999) return 9999; else return winStreak; } void DetermineBattleTowerPrize(void) { u8 levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] - 1 > 5) gSaveBlock2Ptr->battleTower.prizeItem = sLongStreakPrizes[Random() % NELEMS(sLongStreakPrizes)]; else gSaveBlock2Ptr->battleTower.prizeItem = sShortStreakPrizes[Random() % NELEMS(sShortStreakPrizes)]; } void GiveBattleTowerPrize(void) { u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; if (AddBagItem(gSaveBlock2Ptr->battleTower.prizeItem, 1) == TRUE) { CopyItemName(gSaveBlock2Ptr->battleTower.prizeItem, gStringVar1); gSpecialVar_Result = 1; } else { gSpecialVar_Result = 0; gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = 6; } } void AwardBattleTowerRibbons(void) { s32 i; u32 partyIndex; struct Pokemon *pokemon; u8 ribbonType; u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; if (battleTowerLevelType != 0) ribbonType = MON_DATA_VICTORY_RIBBON; else ribbonType = MON_DATA_WINNING_RIBBON; gSpecialVar_Result = 0; if (GetCurrentBattleTowerWinStreak(battleTowerLevelType) > 55) { for (i = 0; i < 3; i++) { partyIndex = gSaveBlock2Ptr->battleTower.selectedPartyMons[i] - 1; pokemon = &gPlayerParty[partyIndex]; if (!GetMonData(pokemon, ribbonType)) { gSpecialVar_Result = 1; SetMonData(pokemon, ribbonType, &gSpecialVar_Result); } } } if (gSpecialVar_Result != 0) IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); } // This is a leftover debugging function that is used to populate the E-Reader // trainer with the player's current data. static void Debug_FillEReaderTrainerWithPlayerData(void) { struct BattleTowerEReaderTrainer *ereaderTrainer; s32 i; s32 j; ereaderTrainer = &gSaveBlock2Ptr->battleTower.ereaderTrainer; if (gSaveBlock2Ptr->playerGender != MALE) { ereaderTrainer->trainerClass = sFemaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1] + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sFemaleTrainerClasses)]; } else { ereaderTrainer->trainerClass = sMaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1] + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sMaleTrainerClasses)]; } CopyTrainerId(ereaderTrainer->trainerId, gSaveBlock2Ptr->playerTrainerId); StringCopy_PlayerName(ereaderTrainer->name, gSaveBlock2Ptr->playerName); ereaderTrainer->winStreak = 1; j = 7; for (i = 0; i < 6; i++) { ereaderTrainer->greeting[i] = gSaveBlock1Ptr->easyChatBattleStart[i]; ereaderTrainer->farewellPlayerLost[i] = j; ereaderTrainer->farewellPlayerWon[i] = j + 6; j++; } for (i = 0; i < 3; i++) ConvertPokemonToBattleTowerPokemon(&gPlayerParty[i], &ereaderTrainer->party[i]); SetEReaderTrainerChecksum(ereaderTrainer); } u8 GetEreaderTrainerFrontSpriteId(void) { return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass]; } u8 GetEreaderTrainerClassId(void) { return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass]; } void CopyEReaderTrainerName5(u8 *trainerName) { s32 i; for (i = 0; i < 5; i++) trainerName[i] = gSaveBlock2Ptr->battleTower.ereaderTrainer.name[i]; trainerName[i] = EOS; } // Checks if the saved E-Reader trainer is valid. void ValidateEReaderTrainer(void) { u32 i; u32 checksum; struct BattleTowerEReaderTrainer *ereaderTrainer; gSpecialVar_Result = 0; ereaderTrainer = &gSaveBlock2Ptr->battleTower.ereaderTrainer; checksum = 0; for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) checksum |= ((u32 *)ereaderTrainer)[i]; if (checksum == 0) { gSpecialVar_Result = 1; return; } checksum = 0; for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) checksum += ((u32 *)ereaderTrainer)[i]; if (gSaveBlock2Ptr->battleTower.ereaderTrainer.checksum != checksum) { ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer); gSpecialVar_Result = 1; } } static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer) { s32 i; ereaderTrainer->checksum = 0; for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) ereaderTrainer->checksum += ((u32 *)ereaderTrainer)[i]; } void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer) { u32 i; for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32); i++) ((u32 *)ereaderTrainer)[i] = 0; } void BufferEReaderTrainerGreeting(void) { BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting); } static void PrintEReaderTrainerFarewellMessage(void) { if (gBattleOutcome == B_OUTCOME_DREW) gStringVar4[0] = EOS; else if (gBattleOutcome == B_OUTCOME_WON) BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerWon); else BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerLost); } void Dummy_TryEnableBravoTrainerBattleTower(void) { s32 i; for (i = 0; i < 2; i++) { if (gSaveBlock2Ptr->battleTower.var_4AE[i] == 1) TakeBravoTrainerBattleTowerOffTheAir(); } } void GetBestBattleTowerStreakToVar0x8007(void) { gSpecialVar_0x8007 = GetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK); } void TryInitBattleTowerAwardManObjectEvent(void) { Unref_TryInitLocalObjectEvent(5); } s32 GetHighestLevelInPlayerParty(void) { s32 highestLevel = 0; s32 i; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG) { s32 level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL, NULL); if (level > highestLevel) highestLevel = level; } } return highestLevel; } ================================================ FILE: src/battle_transition.c ================================================ #include "global.h" #include "sprite.h" #include "task.h" #include "overworld.h" #include "malloc.h" #include "palette.h" #include "trig.h" #include "random.h" #include "sound.h" #include "decompress.h" #include "event_data.h" #include "field_fadetransition.h" #include "gpu_regs.h" #include "battle_transition.h" #include "field_effect.h" #include "field_weather.h" #include "field_camera.h" #include "trainer_pokemon_sprites.h" #include "scanline_effect.h" #include "event_object_movement.h" #include "constants/layouts.h" #include "constants/region_map_sections.h" #include "constants/songs.h" #define PALTAG_UNUSED_MUGSHOT 0x100A #define B_TRANS_DMA_FLAGS (1 | ((DMA_SRC_INC | DMA_DEST_FIXED | DMA_REPEAT | DMA_16BIT | DMA_START_HBLANK | DMA_ENABLE) << 16)) // Used by each transition task to determine which of its functions to call #define tState data[0] // Below are data defines for InitBlackWipe and UpdateBlackWipe, for the TransitionData data array. // These will be re-used by any transitions that use these functions. #define tWipeStartX data[0] #define tWipeStartY data[1] #define tWipeCurrX data[2] #define tWipeCurrY data[3] #define tWipeEndX data[4] #define tWipeEndY data[5] #define tWipeXMove data[6] #define tWipeYMove data[7] #define tWipeXDist data[8] #define tWipeYDist data[9] #define tWipeTemp data[10] #define SET_TILE(ptr, posY, posX, tile) \ { \ u32 index = (posY) * 32 + posX; \ ptr[index] = tile | (15 << 12); \ } typedef bool8 (*TransitionStateFunc)(struct Task *task); typedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite); struct TransitionData { vu8 vblankDma; u16 winIn; u16 winOut; u16 win0H; u16 win0V; u16 win1H; // not used u16 win1V; u16 bldCnt; u16 bldAlpha; u16 bldY; s16 cameraX; s16 cameraY; s16 bg0HOfsOpponent; s16 bg0HOfsPlayer; s16 bg0VOfs; s16 unused_1E; s16 counter; s16 unused_22; s16 data[11]; // for multiple purposes }; static EWRAM_DATA struct TransitionData *sTransitionData = NULL; static bool8 TransitionIntro_FadeToGray(struct Task *task); static bool8 TransitionIntro_FadeFromGray(struct Task *task); static bool8 AngledWipes_Init(struct Task *task); static bool8 AngledWipes_SetWipeData(struct Task *task); static bool8 AngledWipes_DoWipe(struct Task *task); static bool8 AngledWipes_TryEnd(struct Task *task); static bool8 AngledWipes_StartNext(struct Task *task); static bool8 GridSquares_Init(struct Task *task); static bool8 GridSquares_Main(struct Task *task); static bool8 GridSquares_End(struct Task *task); static bool8 WhiteBarsFade_Init(struct Task *task); static bool8 WhiteBarsFade_StartBars(struct Task *task); static bool8 WhiteBarsFade_WaitBars(struct Task *task); static bool8 WhiteBarsFade_BlendToBlack(struct Task *task); static bool8 WhiteBarsFade_End(struct Task *task); static bool8 Slice_Init(struct Task *task); static bool8 Slice_Main(struct Task *task); static bool8 Slice_End(struct Task *task); static bool8 Mugshot_Init(struct Task *task); static bool8 Mugshot_SetGfx(struct Task *task); static bool8 Mugshot_ShowBanner(struct Task *task); static bool8 Mugshot_StartOpponentSlide(struct Task *task); static bool8 Mugshot_WaitStartPlayerSlide(struct Task *task); static bool8 Mugshot_WaitPlayerSlide(struct Task *task); static bool8 Mugshot_GradualWhiteFade(struct Task *task); static bool8 Mugshot_InitFadeWhiteToBlack(struct Task *task); static bool8 Mugshot_FadeToBlack(struct Task *task); static bool8 Mugshot_End(struct Task *task); static bool8 Spiral_Init(struct Task *task); static bool8 Spiral_End(struct Task *task); static bool8 Wave_Init(struct Task *task); static bool8 Wave_Main(struct Task *task); static bool8 Wave_End(struct Task *task); static bool8 Ripple_Init(struct Task *task); static bool8 Ripple_Main(struct Task *task); static bool8 ClockwiseWipe_Init(struct Task *task); static bool8 ClockwiseWipe_TopRight(struct Task *task); static bool8 ClockwiseWipe_Right(struct Task *task); static bool8 ClockwiseWipe_Bottom(struct Task *task); static bool8 ClockwiseWipe_Left(struct Task *task); static bool8 ClockwiseWipe_TopLeft(struct Task *task); static bool8 ClockwiseWipe_End(struct Task *task); static bool8 PokeballsTrail_Init(struct Task *task); static bool8 PokeballsTrail_Main(struct Task *task); static bool8 PokeballsTrail_End(struct Task *task); static bool8 BigPokeball_Init(struct Task *task); static bool8 BigPokeball_SetGfx(struct Task *task); static bool8 PatternWeave_Blend1(struct Task *task); static bool8 PatternWeave_Blend2(struct Task *task); static bool8 PatternWeave_FinishAppear(struct Task *task); static bool8 PatternWeave_CircularMask(struct Task *task); static bool8 Shuffle_Init(struct Task *task); static bool8 Shuffle_End(struct Task *task); static bool8 Swirl_Init(struct Task *task); static bool8 Swirl_End(struct Task *task); static bool8 Blur_Init(struct Task *task); static bool8 Blur_Main(struct Task *task); static bool8 Blur_End(struct Task *task); static bool8 Transition_StartIntro(struct Task *task); static bool8 Transition_WaitForIntro(struct Task *task); static bool8 Transition_StartMain(struct Task *task); static bool8 Transition_WaitForMain(struct Task *task); static void Task_Blur(u8 taskId); static void Task_Swirl(u8 taskId); static void Task_Shuffle(u8 taskId); static void Task_BigPokeball(u8 taskId); static void Task_PokeballsTrail(u8 taskId); static void Task_ClockwiseWipe(u8 taskId); static void Task_Ripple(u8 taskId); static void Task_Wave(u8 taskId); static void Task_Slice(u8 taskId); static void Task_WhiteBarsFade(u8 taskId); static void Task_GridSquares(u8 taskId); static void Task_AngledWipes(u8 taskId); static void Task_Lorelei(u8 taskId); static void Task_Bruno(u8 taskId); static void Task_Agatha(u8 taskId); static void Task_Lance(u8 taskId); static void Task_Blue(u8 taskId); static void Task_Spiral(u8 taskId); static void Task_Oak(u8 taskId); static void Task_Intro(u8 taskId); static void DoMugshotTransition(u8 taskId); static void Task_BattleTransition_Intro(u8 taskId); static void SpriteCB_MugshotTrainerPic(struct Sprite *sprite); static void SpriteCB_FldEffPokeballTrail(struct Sprite *sprite); static void SpriteCB_WhiteBarFade(struct Sprite *sprite); static bool8 MugshotTrainerPic_Pause(struct Sprite *sprite); static bool8 MugshotTrainerPic_Init(struct Sprite *sprite); static bool8 MugshotTrainerPic_Slide(struct Sprite *sprite); static bool8 MugshotTrainerPic_SlideSlow(struct Sprite *sprite); static bool8 MugshotTrainerPic_SlideOffscreen(struct Sprite *sprite); static void VBlankCB_Swirl(void); static void HBlankCB_Swirl(void); static void VBlankCB_Shuffle(void); static void HBlankCB_Shuffle(void); static void VBlankCB_PatternWeave(void); static void VBlankCB_CircularMask(void); static void VBlankCB_ClockwiseWipe(void); static void VBlankCB_Ripple(void); static void HBlankCB_Ripple(void); static void VBlankCB_Wave(void); static void VBlankCB_Spiral(void); static void VBlankCB_Mugshots(void); static void VBlankCB_MugshotsFadeOut(void); static void HBlankCB_Mugshots(void); static void VBlankCB_Slice(void); static void HBlankCB_Slice(void); static void VBlankCB_WhiteBarsFade(void); static void VBlankCB_WhiteBarsFade_Blend(void); static void HBlankCB_WhiteBarsFade(void); static void VBlankCB_AngledWipes(void); static void LaunchBattleTransitionTask(u8 transitionId); static void Task_BattleTransition(u8 taskId); static void InitTransitionData(void); static void CreateIntroTask(s16 fadeOutDelay, s16 fadeInDelay, s16 blinkTimes, s16 fadeOutSpeed, s16 fadeInSpeed); static bool8 IsIntroTaskDone(void); static void VBlankCB_BattleTransition(void); static void GetBg0TilemapDst(u16 **tilesetPtr); static void GetBg0TilesDst(u16 **tilemapPtr, u16 **tilesetPtr); static void SetSinWave(s16 *buffer, s16 offset, s16 sinIndex, s16 frequency, s16 amplitude, s16 bufSize); static void SetCircularMask(s16 *buffer, s16 x, s16 y, s16 radius); static void FadeScreenBlack(void); static void InitBlackWipe(s16 *data, s16 startX, s16 startY, s16 endX, s16 endY, s16 stepX, s16 stepY); static bool8 UpdateBlackWipe(s16 *data, bool8 xExact, bool8 yExact); static void SetTrainerPicSlideDirection(s16 spriteId, bool16 value); static void IncrementTrainerPicState(s16 spriteId); static s16 IsTrainerPicSlideDone(s16 spriteId); static void Mugshots_CreateTrainerPics(struct Task *task); static bool32 IsMugshotTransition(u8 transitionId); static const u32 sBigPokeball_Gfx[] = INCBIN_U32("graphics/battle_transitions/big_pokeball.4bpp"); static const u32 sSlidingPokeball_Tilemap[] = INCBIN_U32("graphics/battle_transitions/sliding_pokeball.bin"); static const u8 sSlidingPokeball_Gfx[] = INCBIN_U8("graphics/battle_transitions/sliding_pokeball.4bpp"); static const u32 sMugshotBanner_Gfx[] = INCBIN_U32("graphics/battle_transitions/mugshot_banner.4bpp"); static const u8 sUnusedBrendan_Gfx[] = INCBIN_U8("graphics/battle_transitions/unused_brendan.4bpp"); static const u8 sUnusedLass_Gfx[] = INCBIN_U8("graphics/battle_transitions/unused_lass.4bpp"); static const u32 sGridSquare_Gfx[] = INCBIN_U32("graphics/battle_transitions/grid_square.4bpp"); // All battle transitions use the same intro static const TaskFunc sTasks_Intro[] = { [0 ... B_TRANSITION_COUNT - 1] = &Task_Intro, }; // After the intro each transition has a unique main task. // This task will call the functions that do the transition effects. static const TaskFunc sTasks_Main[] = { [B_TRANSITION_BLUR] = Task_Blur, [B_TRANSITION_SWIRL] = Task_Swirl, [B_TRANSITION_SHUFFLE] = Task_Shuffle, [B_TRANSITION_BIG_POKEBALL] = Task_BigPokeball, [B_TRANSITION_POKEBALLS_TRAIL] = Task_PokeballsTrail, [B_TRANSITION_CLOCKWISE_WIPE] = Task_ClockwiseWipe, [B_TRANSITION_RIPPLE] = Task_Ripple, [B_TRANSITION_WAVE] = Task_Wave, [B_TRANSITION_SLICE] = Task_Slice, [B_TRANSITION_WHITE_BARS_FADE] = Task_WhiteBarsFade, [B_TRANSITION_GRID_SQUARES] = Task_GridSquares, [B_TRANSITION_ANGLED_WIPES] = Task_AngledWipes, [B_TRANSITION_LORELEI] = Task_Lorelei, [B_TRANSITION_BRUNO] = Task_Bruno, [B_TRANSITION_AGATHA] = Task_Agatha, [B_TRANSITION_LANCE] = Task_Lance, [B_TRANSITION_BLUE] = Task_Blue, [B_TRANSITION_SPIRAL] = Task_Spiral, [B_TRANSITION_OAK] = Task_Oak, }; static const TransitionStateFunc sTaskHandlers[] = { Transition_StartIntro, Transition_WaitForIntro, Transition_StartMain, Transition_WaitForMain, }; static const TransitionStateFunc sBlur_Funcs[] = { Blur_Init, Blur_Main, Blur_End, }; static const TransitionStateFunc sSwirl_Funcs[] = { Swirl_Init, Swirl_End, }; static const TransitionStateFunc sShuffle_Funcs[] = { Shuffle_Init, Shuffle_End, }; static const TransitionStateFunc sBigPokeball_Funcs[] = { BigPokeball_Init, BigPokeball_SetGfx, PatternWeave_Blend1, PatternWeave_Blend2, PatternWeave_FinishAppear, PatternWeave_CircularMask, }; static const TransitionStateFunc sPokeballsTrail_Funcs[] = { PokeballsTrail_Init, PokeballsTrail_Main, PokeballsTrail_End, }; #define NUM_POKEBALL_TRAILS 5 static const s16 sPokeballsTrail_StartXCoords[] = { -16, DISPLAY_WIDTH + 16 }; static const s16 sPokeballsTrail_Delays[NUM_POKEBALL_TRAILS] = { 0, 16, 32, 8, 24 }; static const s16 sPokeballsTrail_Speeds[] = { 8, -8 }; static const TransitionStateFunc sClockwiseWipe_Funcs[] = { ClockwiseWipe_Init, ClockwiseWipe_TopRight, ClockwiseWipe_Right, ClockwiseWipe_Bottom, ClockwiseWipe_Left, ClockwiseWipe_TopLeft, ClockwiseWipe_End, }; static const TransitionStateFunc sRipple_Funcs[] = { Ripple_Init, Ripple_Main, }; static const TransitionStateFunc sWave_Funcs[] = { Wave_Init, Wave_Main, Wave_End, }; static const s16 sSpiral_AngleData[] = { 0x0, 0x26E, 0x100, 0x69, 0x0, -0x69, -0x100, -0x266E, 0x0, 0x26E, 0x100, 0x69, 0x0, -0x69, -0x100, -0x266E, }; static const TransitionStateFunc sSpiral_Funcs[] = { Spiral_Init, Spiral_End, }; static const TransitionStateFunc sMugshot_Funcs[] = { Mugshot_Init, Mugshot_SetGfx, Mugshot_ShowBanner, Mugshot_StartOpponentSlide, Mugshot_WaitStartPlayerSlide, Mugshot_WaitPlayerSlide, Mugshot_GradualWhiteFade, Mugshot_InitFadeWhiteToBlack, Mugshot_FadeToBlack, Mugshot_End, }; static const u8 sMugshotsTrainerPicIDsTable[MUGSHOTS_COUNT] = { [MUGSHOT_LORELEI] = TRAINER_PIC_ELITE_FOUR_LORELEI, [MUGSHOT_BRUNO] = TRAINER_PIC_ELITE_FOUR_BRUNO, [MUGSHOT_AGATHA] = TRAINER_PIC_ELITE_FOUR_AGATHA, [MUGSHOT_LANCE] = TRAINER_PIC_ELITE_FOUR_LANCE, [MUGSHOT_BLUE] = TRAINER_PIC_CHAMPION_RIVAL, [MUGSHOT_OAK] = TRAINER_PIC_PROFESSOR_OAK, }; static const s16 sMugshotsOpponentRotationScales[MUGSHOTS_COUNT][2] = { [MUGSHOT_LORELEI] = {0x200, 0x200}, [MUGSHOT_BRUNO] = {0x200, 0x200}, [MUGSHOT_AGATHA] = {0x200, 0x200}, [MUGSHOT_LANCE] = {0x200, 0x200}, [MUGSHOT_BLUE] = {0x200, 0x200}, [MUGSHOT_OAK] = {0x200, 0x200}, }; static const s16 sMugshotsOpponentCoords[MUGSHOTS_COUNT][2] = { [MUGSHOT_LORELEI] = { -8, 0 }, [MUGSHOT_BRUNO] = { -10, 0 }, [MUGSHOT_AGATHA] = { 0, 0 }, [MUGSHOT_LANCE] = { -32, 0 }, [MUGSHOT_BLUE] = { 0, 0 }, [MUGSHOT_OAK] = { -6, 0 }, }; static const TransitionSpriteCallback sMugshotTrainerPicFuncs[] = { MugshotTrainerPic_Pause, MugshotTrainerPic_Init, MugshotTrainerPic_Slide, MugshotTrainerPic_SlideSlow, MugshotTrainerPic_Pause, MugshotTrainerPic_SlideOffscreen, MugshotTrainerPic_Pause, }; // One element per slide direction. // Sign of acceleration is opposite speed, so slide decelerates. static const s16 sTrainerPicSlideSpeeds[] = {12, -12}; static const s16 sTrainerPicSlideAccels[] = {-1, 1}; static const TransitionStateFunc sSlice_Funcs[] = { Slice_Init, Slice_Main, Slice_End, }; static const TransitionStateFunc sWhiteBarsFade_Funcs[] = { WhiteBarsFade_Init, WhiteBarsFade_StartBars, WhiteBarsFade_WaitBars, WhiteBarsFade_BlendToBlack, WhiteBarsFade_End, }; #define NUM_WHITE_BARS 6 #define WHITE_BAR_HEIGHT (1 + DISPLAY_HEIGHT / NUM_WHITE_BARS) static const u16 sWhiteBarsFade_StartDelays[NUM_WHITE_BARS] = {0, 9, 15, 6, 12, 3}; static const TransitionStateFunc sGridSquares_Funcs[] = { GridSquares_Init, GridSquares_Main, GridSquares_End, }; static const TransitionStateFunc sAngledWipes_Funcs[] = { AngledWipes_Init, AngledWipes_SetWipeData, AngledWipes_DoWipe, AngledWipes_TryEnd, AngledWipes_StartNext, }; #define NUM_ANGLED_WIPES 7 static const s16 sAngledWipes_MoveData[NUM_ANGLED_WIPES][5] = { // startX startY endX endY yDirection {56, 0, 0, DISPLAY_HEIGHT, 0}, {104, DISPLAY_HEIGHT, DISPLAY_WIDTH, 88, 1}, {DISPLAY_WIDTH, 72, 56, 0, 1}, {0, 32, 144, DISPLAY_HEIGHT, 0}, {144, DISPLAY_HEIGHT, 184, 0, 1}, {56, 0, 168, DISPLAY_HEIGHT, 0}, {168, DISPLAY_HEIGHT, 48, 0, 1}, }; static const s16 sAngledWipes_EndDelays[NUM_ANGLED_WIPES] = { 1, 1, 1, 1, 1, 1, 0 }; static const TransitionStateFunc sTransitionIntroFuncs[] = { TransitionIntro_FadeToGray, TransitionIntro_FadeFromGray, }; static const struct SpriteFrameImage sSpriteImage_Pokeball[] = { { .data = sSlidingPokeball_Gfx, .size = sizeof(sSlidingPokeball_Gfx), }, }; static const union AnimCmd sSpriteAnim_Pokeball[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd *const sSpriteAnimTable_Pokeball[] = { sSpriteAnim_Pokeball }; static const union AffineAnimCmd sSpriteAffineAnim_Pokeball1[] = { AFFINEANIMCMD_FRAME(0, 0, -4, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sSpriteAffineAnim_Pokeball2[] = { AFFINEANIMCMD_FRAME(0, 0, 4, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sSpriteAffineAnimTable_Pokeball[] = { sSpriteAffineAnim_Pokeball1, sSpriteAffineAnim_Pokeball2, }; static const struct SpriteTemplate sSpriteTemplate_Pokeball = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_POKEBALL_TRAIL, .oam = &gObjectEventBaseOam_32x32, .anims = sSpriteAnimTable_Pokeball, .images = sSpriteImage_Pokeball, .affineAnims = sSpriteAffineAnimTable_Pokeball, .callback = SpriteCB_FldEffPokeballTrail, }; static const struct OamData sOam_UnusedBrendanLass = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 0, .paletteNum = 0, .affineParam = 0, }; static const struct SpriteFrameImage sImageTable_UnusedBrendan[] = { { .data = sUnusedBrendan_Gfx, .size = sizeof(sUnusedBrendan_Gfx), }, }; static const struct SpriteFrameImage sImageTable_UnusedLass[] = { { .data = sUnusedLass_Gfx, .size = sizeof(sUnusedLass_Gfx), }, }; static const union AnimCmd sSpriteAnim_UnusedBrendanLass[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd *const sSpriteAnimTable_UnusedBrendanLass[] = { sSpriteAnim_UnusedBrendanLass }; static const struct SpriteTemplate sSpriteTemplate_UnusedBrendanLass[] = { { .tileTag = TAG_NONE, .paletteTag = PALTAG_UNUSED_MUGSHOT, .oam = &sOam_UnusedBrendanLass, .anims = sSpriteAnimTable_UnusedBrendanLass, .images = sImageTable_UnusedBrendan, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_MugshotTrainerPic, }, { .tileTag = TAG_NONE, .paletteTag = PALTAG_UNUSED_MUGSHOT, .oam = &sOam_UnusedBrendanLass, .anims = sSpriteAnimTable_UnusedBrendanLass, .images = sImageTable_UnusedLass, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_MugshotTrainerPic, }, }; // this palette is shared by big pokeball and sliding pokeball static const u16 sFieldEffectPal_Pokeball[] = INCBIN_U16("graphics/battle_transitions/sliding_pokeball.gbapal"); const struct SpritePalette gSpritePalette_Pokeball = { .data = sFieldEffectPal_Pokeball, .tag = FLDEFF_PAL_TAG_POKEBALL_TRAIL, }; static const u16 sMugshotPal_Lorelei[] = INCBIN_U16("graphics/battle_transitions/lorelei_bg.gbapal"); static const u16 sMugshotPal_Bruno[] = INCBIN_U16("graphics/battle_transitions/bruno_bg.gbapal"); static const u16 sMugshotPal_Agatha[] = INCBIN_U16("graphics/battle_transitions/agatha_bg.gbapal"); static const u16 sMugshotPal_Lance[] = INCBIN_U16("graphics/battle_transitions/lance_bg.gbapal"); static const u16 sMugshotPal_Blue[] = INCBIN_U16("graphics/battle_transitions/blue_bg.gbapal"); static const u16 sMugshotPal_Red[] = INCBIN_U16("graphics/battle_transitions/red_bg.gbapal"); static const u16 sMugshotPal_Green[] = INCBIN_U16("graphics/battle_transitions/green_bg.gbapal"); static const u16 *const sOpponentMugshotsPals[MUGSHOTS_COUNT] = { [MUGSHOT_LORELEI] = sMugshotPal_Lorelei, [MUGSHOT_BRUNO] = sMugshotPal_Bruno, [MUGSHOT_AGATHA] = sMugshotPal_Agatha, [MUGSHOT_LANCE] = sMugshotPal_Lance, [MUGSHOT_BLUE] = sMugshotPal_Blue, [MUGSHOT_OAK] = sMugshotPal_Blue, }; static const u16 *const sPlayerMugshotsPals[GENDER_COUNT] = { [MALE] = sMugshotPal_Red, [FEMALE] = sMugshotPal_Green, }; static const u16 sUnusedTrainerPalette[] = INCBIN_U16("graphics/battle_transitions/unused_trainer.gbapal"); static const struct SpritePalette sSpritePalette_UnusedTrainer = { .data = sUnusedTrainerPalette, .tag = PALTAG_UNUSED_MUGSHOT, }; static const u16 sBigPokeball_Tilemap[] = INCBIN_U16("graphics/battle_transitions/big_pokeball_tilemap.bin"); static const u16 sMugshotsTilemap[] = INCBIN_U16("graphics/battle_transitions/vsbar_tilemap.bin"); void BattleTransition_StartOnField(u8 transitionId) { sTransitionData = AllocZeroed(sizeof(*sTransitionData)); gMain.callback2 = CB2_OverworldBasic; LaunchBattleTransitionTask(transitionId); } // Unused static void BattleTransition_Start(u8 transitionId) { LaunchBattleTransitionTask(transitionId); } #define tTransitionId data[1] #define tTransitionDone data[15] bool8 IsBattleTransitionDone(void) { u8 taskId = FindTaskIdByFunc(Task_BattleTransition); if (gTasks[taskId].tTransitionDone) { InitTransitionData(); FREE_AND_SET_NULL(sTransitionData); DestroyTask(taskId); return TRUE; } else { return FALSE; } } static void LaunchBattleTransitionTask(u8 transitionId) { u8 taskId = CreateTask(Task_BattleTransition, 2); gTasks[taskId].tTransitionId = transitionId; } static void Task_BattleTransition(u8 taskId) { while (sTaskHandlers[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 Transition_StartIntro(struct Task *task) { SetWeatherScreenFadeOut(); CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); if(gSaveBlock2Ptr->optionsBattleTransitions && !IsMugshotTransition(task->tTransitionId)) { // Instantly cuts to black and skips battle transition if optionsBattleTransitions is On. // Doesn't skip if a mugshot battle transition should be happening, for the cool factor. palette_bg_faded_fill_black(); task->tState = 3; return TRUE; } if (sTasks_Intro[task->tTransitionId] != NULL) { CreateTask(sTasks_Intro[task->tTransitionId], 4); task->tState++; return FALSE; } else { task->tState = 2; return TRUE; } } static bool8 Transition_WaitForIntro(struct Task *task) { if (FindTaskIdByFunc(sTasks_Intro[task->tTransitionId]) == TASK_NONE) { task->tState++; return TRUE; } else { return FALSE; } } static bool8 Transition_StartMain(struct Task *task) { CreateTask(sTasks_Main[task->tTransitionId], 0); task->tState++; return FALSE; } static bool8 Transition_WaitForMain(struct Task *task) { task->tTransitionDone = FALSE; if (FindTaskIdByFunc(sTasks_Main[task->tTransitionId]) == TASK_NONE) task->tTransitionDone = TRUE; return FALSE; } #undef tTransitionId #undef tTransitionDone static void Task_Intro(u8 taskId) { if (gTasks[taskId].tState == 0) { gTasks[taskId].tState++; CreateIntroTask(0, 0, 2, 2, 2); } else if (IsIntroTaskDone()) { DestroyTask(taskId); } } //-------------------- // B_TRANSITION_BLUR //-------------------- #define tDelay data[1] #define tCounter data[2] static void Task_Blur(u8 taskId) { while (sBlur_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 Blur_Init(struct Task *task) { SetGpuReg(REG_OFFSET_MOSAIC, 0); SetGpuRegBits(REG_OFFSET_BG1CNT, BGCNT_MOSAIC); SetGpuRegBits(REG_OFFSET_BG2CNT, BGCNT_MOSAIC); SetGpuRegBits(REG_OFFSET_BG3CNT, BGCNT_MOSAIC); task->tState++; return TRUE; } static bool8 Blur_Main(struct Task *task) { if (task->tDelay != 0) { task->tDelay--; } else { task->tDelay = 2; if (++task->tCounter == 10) BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); SetGpuReg(REG_OFFSET_MOSAIC, (task->tCounter & 0xF) + ((task->tCounter & 0xF) << 4)); if (task->tCounter > 14) task->tState++; } return FALSE; } static bool8 Blur_End(struct Task *task) { if (!gPaletteFade.active) DestroyTask(FindTaskIdByFunc(Task_Blur)); return FALSE; } #undef tDelay #undef tCounter //-------------------- // B_TRANSITION_SWIRL //-------------------- #define tSinIndex data[1] #define tAmplitude data[2] static void Task_Swirl(u8 taskId) { while (sSwirl_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 Swirl_Init(struct Task *task) { InitTransitionData(); ScanlineEffect_Clear(); BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 16, RGB_BLACK); SetSinWave(gScanlineEffectRegBuffers[1], sTransitionData->cameraX, 0, 2, 0, DISPLAY_HEIGHT); SetVBlankCallback(VBlankCB_Swirl); SetHBlankCallback(HBlankCB_Swirl); EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK); task->tState++; return FALSE; } static bool8 Swirl_End(struct Task *task) { sTransitionData->vblankDma = FALSE; task->tSinIndex += 4; task->tAmplitude += 8; SetSinWave(gScanlineEffectRegBuffers[0], sTransitionData->cameraX, task->tSinIndex, 2, task->tAmplitude, 160); if (!gPaletteFade.active) DestroyTask(FindTaskIdByFunc(Task_Swirl)); sTransitionData->vblankDma++; return FALSE; } static void VBlankCB_Swirl(void) { VBlankCB_BattleTransition(); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); } static void HBlankCB_Swirl(void) { s16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT]; REG_BG1HOFS = offset; REG_BG2HOFS = offset; REG_BG3HOFS = offset; } #undef tSinIndex #undef tAmplitude //---------------------- // B_TRANSITION_SHUFFLE //---------------------- #define tSinVal data[1] #define tAmplitude data[2] static void Task_Shuffle(u8 taskId) { while (sShuffle_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 Shuffle_Init(struct Task *task) { InitTransitionData(); ScanlineEffect_Clear(); BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 16, RGB_BLACK); memset(gScanlineEffectRegBuffers[1], sTransitionData->cameraY, DISPLAY_HEIGHT * 2); SetVBlankCallback(VBlankCB_Shuffle); SetHBlankCallback(HBlankCB_Shuffle); EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK); task->tState++; return FALSE; } static bool8 Shuffle_End(struct Task *task) { u32 i; u16 sinVal, amplitude; sTransitionData->vblankDma = FALSE; sinVal = task->tSinVal; amplitude = task->tAmplitude >> 8; task->tSinVal += 4224; task->tAmplitude += 384; for (i = 0; i < DISPLAY_HEIGHT; i++, sinVal += 4224) gScanlineEffectRegBuffers[0][i] = sTransitionData->cameraY + Sin(sinVal / 256, amplitude); if (!gPaletteFade.active) DestroyTask(FindTaskIdByFunc(Task_Shuffle)); sTransitionData->vblankDma++; return FALSE; } static void VBlankCB_Shuffle(void) { VBlankCB_BattleTransition(); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); } static void HBlankCB_Shuffle(void) { s16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT]; REG_BG1VOFS = offset; REG_BG2VOFS = offset; REG_BG3VOFS = offset; } #undef tSinVal #undef tAmplitude //------------------------------------------------------------------------ // B_TRANSITION_BIG_POKEBALL // // In Emerald, the "PatternWeave" effect of this transition is used // by multiple different transitions. In FRLG it's unique to this one. //------------------------------------------------------------------------ #define tBlendTarget1 data[1] #define tBlendTarget2 data[2] #define tBlendDelay data[3] // Data 1-3 change purpose for PatternWeave_CircularMask #define tRadius data[1] #define tRadiusDelta data[2] #define tVBlankSet data[3] #define tSinIndex data[4] #define tAmplitude data[5] #define tEndDelay data[8] static void Task_BigPokeball(u8 taskId) { while (sBigPokeball_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } // Separate function in Emerald #define InitPatternWeaveTransition(task) \ { \ u16 i; \ InitTransitionData(); \ ScanlineEffect_Clear(); \ (task)->tBlendTarget1 = 16; \ (task)->tBlendTarget2 = 0; \ (task)->tSinIndex = 0; \ (task)->tAmplitude = 0x4000; \ sTransitionData->winIn = WININ_WIN0_ALL; \ sTransitionData->winOut = 0; \ sTransitionData->win0H = DISPLAY_WIDTH; \ sTransitionData->win0V = DISPLAY_HEIGHT; \ sTransitionData->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; \ sTransitionData->bldAlpha = BLDALPHA_BLEND((task)->tBlendTarget2, (task)->tBlendTarget1); \ for (i = 0; i < DISPLAY_HEIGHT; i++) \ gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH; \ SetVBlankCallback(VBlankCB_PatternWeave); \ } static bool8 BigPokeball_Init(struct Task *task) { u16 *tilemap, *tileset; InitPatternWeaveTransition(task); GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); CpuCopy16(sBigPokeball_Gfx, tileset, sizeof(sBigPokeball_Gfx)); LoadPalette(sFieldEffectPal_Pokeball, BG_PLTT_ID(15), sizeof(sFieldEffectPal_Pokeball)); task->tState++; return FALSE; } static bool8 BigPokeball_SetGfx(struct Task *task) { s16 i, j; u16 *tilemap, *tileset; const u16 *bigPokeballMap = sBigPokeball_Tilemap; GetBg0TilesDst(&tilemap, &tileset); for (i = 0; i < 20; i++) for (j = 0; j < 30; j++, bigPokeballMap++) SET_TILE(tilemap, i, j, *bigPokeballMap); SetSinWave(gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude, DISPLAY_HEIGHT); task->tState++; return TRUE; } static bool8 PatternWeave_Blend1(struct Task *task) { sTransitionData->vblankDma = FALSE; if (task->tBlendDelay == 0 || --task->tBlendDelay == 0) { task->tBlendTarget2++; task->tBlendDelay = 1; // Broken logic. This makes the condition always TRUE. } sTransitionData->bldAlpha = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1); // Increment eva until it reaches 50% coeff if (task->tBlendTarget2 > 15) task->tState++; task->tSinIndex += 12; task->tAmplitude -= 384; // Assign a very high frequency value so that 2 adjacent values in gScanlineEffectRegBuffers[0] will have different sign. SetSinWave(gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude >> 8, DISPLAY_HEIGHT); sTransitionData->vblankDma++; return FALSE; } static bool8 PatternWeave_Blend2(struct Task *task) { sTransitionData->vblankDma = FALSE; if (task->tBlendDelay == 0 || --task->tBlendDelay == 0) { task->tBlendTarget1--; task->tBlendDelay = 2; } sTransitionData->bldAlpha = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1); if (task->tBlendTarget1 == 0) task->tState++; if (task->tAmplitude > 0) { task->tSinIndex += 12; task->tAmplitude -= 384; } else { task->tAmplitude = 0; } SetSinWave(gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude >> 8, DISPLAY_HEIGHT); sTransitionData->vblankDma++; return FALSE; } static bool8 PatternWeave_FinishAppear(struct Task *task) { sTransitionData->vblankDma = FALSE; if (task->tAmplitude > 0) { task->tSinIndex += 12; task->tAmplitude -= 384; } else { task->tAmplitude = 0; } SetSinWave(gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude >> 8, DISPLAY_HEIGHT); if (task->tAmplitude <= 0) { task->tState++; task->tRadius = DISPLAY_HEIGHT; task->tRadiusDelta = 1 << 8; task->tVBlankSet = FALSE; } sTransitionData->vblankDma++; return FALSE; } // Do a shrinking circular mask to go to a black screen after the pattern appears. static bool8 PatternWeave_CircularMask(struct Task *task) { sTransitionData->vblankDma = FALSE; if (task->tRadiusDelta < (8 << 8)) task->tRadiusDelta += (1 << 8); if (task->tRadius != 0) { task->tRadius -= (task->tRadiusDelta >> 8); if (task->tRadius < 0) task->tRadius = 0; } SetCircularMask(gScanlineEffectRegBuffers[0], DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, task->tRadius); if (task->tRadius == 0) { DmaStop(0); FadeScreenBlack(); DestroyTask(FindTaskIdByFunc(Task_BigPokeball)); // FindTaskIdByFunc(task->func) in Emerald to accomdate other functions } if (!task->tVBlankSet) { task->tVBlankSet++; SetVBlankCallback(VBlankCB_CircularMask); } sTransitionData->vblankDma++; return FALSE; } static void VBlankCB_SetWinAndBlend(void) { DmaStop(0); VBlankCB_BattleTransition(); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn); SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut); SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V); SetGpuReg(REG_OFFSET_BLDCNT, sTransitionData->bldCnt); SetGpuReg(REG_OFFSET_BLDALPHA, sTransitionData->bldAlpha); } static void VBlankCB_PatternWeave(void) { VBlankCB_SetWinAndBlend(); DmaSet(0, gScanlineEffectRegBuffers[1], ®_BG0HOFS, B_TRANS_DMA_FLAGS); } static void VBlankCB_CircularMask(void) { VBlankCB_SetWinAndBlend(); DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, B_TRANS_DMA_FLAGS); } #undef tAmplitude #undef tSinIndex #undef tBlendTarget1 #undef tBlendTarget2 #undef tRadius #undef tRadiusDelta #undef tVBlankSet //------------------------------ // B_TRANSITION_POKEBALLS_TRAIL //------------------------------ #define sSide data[0] #define sDelay data[1] #define sPrevX data[2] static void Task_PokeballsTrail(u8 taskId) { while (sPokeballsTrail_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 PokeballsTrail_Init(struct Task *task) { u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); CpuCopy16(sSlidingPokeball_Tilemap, tileset, sizeof(sSlidingPokeball_Tilemap)); CpuFill32(0, tilemap, BG_SCREEN_SIZE); LoadPalette(sFieldEffectPal_Pokeball, BG_PLTT_ID(15), sizeof(sFieldEffectPal_Pokeball)); task->tState++; return FALSE; } static bool8 PokeballsTrail_Main(struct Task *task) { s16 i, side; s16 startX[ARRAY_COUNT(sPokeballsTrail_StartXCoords)]; s16 delays[ARRAY_COUNT(sPokeballsTrail_Delays)]; memcpy(startX, sPokeballsTrail_StartXCoords, sizeof(sPokeballsTrail_StartXCoords)); memcpy(delays, sPokeballsTrail_Delays, sizeof(sPokeballsTrail_Delays)); // Randomly pick which side the first ball should start on. // The side is then flipped for each subsequent ball. side = Random() & 1; for (i = 0; i < NUM_POKEBALL_TRAILS; i++, side ^= 1) { gFieldEffectArguments[0] = startX[side]; // x gFieldEffectArguments[1] = (i * 32) + 16; // y gFieldEffectArguments[2] = side; gFieldEffectArguments[3] = delays[i]; FieldEffectStart(FLDEFF_POKEBALL); } task->tState++; return FALSE; } static bool8 PokeballsTrail_End(struct Task *task) { if (!FieldEffectActiveListContains(FLDEFF_POKEBALL)) { FadeScreenBlack(); DestroyTask(FindTaskIdByFunc(Task_PokeballsTrail)); } return FALSE; } bool8 FldEff_PokeballTrail(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Pokeball, gFieldEffectArguments[0], gFieldEffectArguments[1], 0); gSprites[spriteId].oam.priority = 0; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteId].sSide = gFieldEffectArguments[2]; gSprites[spriteId].sDelay = gFieldEffectArguments[3]; gSprites[spriteId].sPrevX = -1; InitSpriteAffineAnim(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], gFieldEffectArguments[2]); return FALSE; } static void SpriteCB_FldEffPokeballTrail(struct Sprite *sprite) { s16 speeds[ARRAY_COUNT(sPokeballsTrail_Speeds)]; memcpy(speeds, sPokeballsTrail_Speeds, sizeof(sPokeballsTrail_Speeds)); if (sprite->sDelay) { sprite->sDelay--; } else { if (sprite->x >= 0 && sprite->x <= DISPLAY_WIDTH) { // Set Pokéball position s16 posX = sprite->x >> 3; s16 posY = sprite->y >> 3; // If Pokéball moved forward clear trail behind it if (posX != sprite->sPrevX) { u16 *ptr; sprite->sPrevX = posX; ptr = (u16 *)BG_SCREEN_ADDR((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) & 0x1F); SET_TILE(ptr, posY - 2, posX, 1); SET_TILE(ptr, posY - 1, posX, 1); SET_TILE(ptr, posY - 0, posX, 1); SET_TILE(ptr, posY + 1, posX, 1); } } sprite->x += speeds[sprite->sSide]; if (sprite->x < -15 || sprite->x > DISPLAY_WIDTH + 15) FieldEffectStop(sprite, FLDEFF_POKEBALL); } } #undef sSide #undef sDelay #undef sPrevX //----------------------------- // B_TRANSITION_CLOCKWISE_WIPE //----------------------------- static void Task_ClockwiseWipe(u8 taskId) { while (sClockwiseWipe_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 ClockwiseWipe_Init(struct Task *task) { u32 i; InitTransitionData(); ScanlineEffect_Clear(); sTransitionData->winIn = 0; sTransitionData->winOut = WINOUT_WIN01_ALL; sTransitionData->win0H = WIN_RANGE(DISPLAY_WIDTH, DISPLAY_WIDTH + 1); sTransitionData->win0V = DISPLAY_HEIGHT; for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i] = WIN_RANGE(DISPLAY_WIDTH + 3, DISPLAY_WIDTH + 4); SetVBlankCallback(VBlankCB_ClockwiseWipe); sTransitionData->tWipeEndX = DISPLAY_WIDTH / 2; task->tState++; return TRUE; } static bool8 ClockwiseWipe_TopRight(struct Task *task) { sTransitionData->vblankDma = FALSE; InitBlackWipe(sTransitionData->data, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, sTransitionData->tWipeEndX, -1, 1, 1); do { gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = WIN_RANGE(DISPLAY_WIDTH / 2, sTransitionData->tWipeCurrX + 1); } while (!UpdateBlackWipe(sTransitionData->data, TRUE, TRUE)); sTransitionData->tWipeEndX += 32; if (sTransitionData->tWipeEndX >= DISPLAY_WIDTH) { sTransitionData->tWipeEndY = 0; task->tState++; } sTransitionData->vblankDma++; return FALSE; } static bool8 ClockwiseWipe_Right(struct Task *task) { s16 start, end; vu8 finished = FALSE; sTransitionData->vblankDma = FALSE; InitBlackWipe(sTransitionData->data, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, DISPLAY_WIDTH, sTransitionData->tWipeEndY, 1, 1); while (TRUE) { start = DISPLAY_WIDTH / 2; end = sTransitionData->tWipeCurrX + 1; if (sTransitionData->tWipeEndY >= DISPLAY_HEIGHT / 2) { start = sTransitionData->tWipeCurrX; end = DISPLAY_WIDTH; } gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = WIN_RANGE2(start, end); if (finished) break; finished = UpdateBlackWipe(sTransitionData->data, TRUE, TRUE); } sTransitionData->tWipeEndY += 16; if (sTransitionData->tWipeEndY >= DISPLAY_HEIGHT) { sTransitionData->tWipeEndX = DISPLAY_WIDTH; task->tState++; } else { while (sTransitionData->tWipeCurrY < sTransitionData->tWipeEndY) gScanlineEffectRegBuffers[0][++sTransitionData->tWipeCurrY] = WIN_RANGE2(start, end); } sTransitionData->vblankDma++; return FALSE; } static bool8 ClockwiseWipe_Bottom(struct Task *task) { sTransitionData->vblankDma = FALSE; InitBlackWipe(sTransitionData->data, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, sTransitionData->tWipeEndX, DISPLAY_HEIGHT, 1, 1); do { gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = (sTransitionData->tWipeCurrX << 8) | DISPLAY_WIDTH; } while (!UpdateBlackWipe(sTransitionData->data, TRUE, TRUE)); sTransitionData->tWipeEndX -= 32; if (sTransitionData->tWipeEndX <= 0) { sTransitionData->tWipeEndY = DISPLAY_HEIGHT; task->tState++; } sTransitionData->vblankDma++; return FALSE; } /* * BUG: The following 2 functions are incorrect. The animation after * the rotation angle reaches 1.5π will not be displayed. * * There're 2 problems which need to be solved in order to correct the logic. * 1. With current setup, nothing is displayed inside WIN0 and everything * is displayed outside WIN0. Thus, if the rotation angle is > 1.5π, it * won't be able to handle the situation. * 2. The programmer sometimes swapped the place of start and end boundary * of WIN0 (see variables start and end), which will sometimes cause end * to be smaller than start. In this way, garbage data will be written to WIN0H. */ static bool8 ClockwiseWipe_Left(struct Task *task) { s16 end, start; u16 win0H; vu8 finished = FALSE; sTransitionData->vblankDma = FALSE; InitBlackWipe(sTransitionData->data, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0, sTransitionData->tWipeEndY, 1, 1); while (TRUE) { end = (gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY]) & 0xFF; start = sTransitionData->tWipeCurrX; if (sTransitionData->tWipeEndY <= DISPLAY_HEIGHT / 2) { start = DISPLAY_WIDTH / 2; end = sTransitionData->tWipeCurrX; } win0H = WIN_RANGE2(start, end); gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = win0H; if (finished) break; finished = UpdateBlackWipe(sTransitionData->data, TRUE, TRUE); } sTransitionData->tWipeEndY -= 16; if (sTransitionData->tWipeEndY <= 0) { sTransitionData->tWipeEndX = 0; task->tState++; } else { while (sTransitionData->tWipeCurrY > sTransitionData->tWipeEndY) gScanlineEffectRegBuffers[0][--sTransitionData->tWipeCurrY] = WIN_RANGE2(start, end); } sTransitionData->vblankDma++; return FALSE; } static bool8 ClockwiseWipe_TopLeft(struct Task *task) { sTransitionData->vblankDma = FALSE; InitBlackWipe(sTransitionData->data, 120, 80, sTransitionData->tWipeEndX, 0, 1, 1); do { s16 start = DISPLAY_WIDTH / 2; s16 end = sTransitionData->tWipeCurrX; if (sTransitionData->tWipeCurrX >= 120) { start = 0; end = DISPLAY_WIDTH; } gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = WIN_RANGE2(start, end); } while (!UpdateBlackWipe(sTransitionData->data, TRUE, TRUE)); sTransitionData->tWipeEndX += 32; if (sTransitionData->tWipeCurrX > DISPLAY_WIDTH / 2) task->tState++; sTransitionData->vblankDma++; return FALSE; } static bool8 ClockwiseWipe_End(struct Task *task) { DmaStop(0); FadeScreenBlack(); DestroyTask(FindTaskIdByFunc(Task_ClockwiseWipe)); return FALSE; } static void VBlankCB_ClockwiseWipe(void) { DmaStop(0); VBlankCB_BattleTransition(); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2); SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn); SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut); SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V); SetGpuReg(REG_OFFSET_WIN0H, gScanlineEffectRegBuffers[1][0]); DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, B_TRANS_DMA_FLAGS); } //--------------------- // B_TRANSITION_RIPPLE //--------------------- #define tSinVal data[1] #define tAmplitude data[2] #define tTimer data[3] #define tFadeStarted data[4] static void Task_Ripple(u8 taskId) { while (sRipple_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 Ripple_Init(struct Task *task) { u32 i; InitTransitionData(); ScanlineEffect_Clear(); for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i] = sTransitionData->cameraY; SetVBlankCallback(VBlankCB_Ripple); SetHBlankCallback(HBlankCB_Ripple); EnableInterrupts(INTR_FLAG_HBLANK); task->tState++; return TRUE; } static bool8 Ripple_Main(struct Task *task) { u32 i; s16 amplitude; u16 sinVal, speed; sTransitionData->vblankDma = FALSE; amplitude = task->tAmplitude >> 8; sinVal = task->tSinVal; speed = 384; task->tSinVal += 0x400; if (task->tAmplitude <= 0x1FFF) task->tAmplitude += 384; for (i = 0; i < DISPLAY_HEIGHT; i++, sinVal += speed) { s16 sinIndex = sinVal >> 8; gScanlineEffectRegBuffers[0][i] = sTransitionData->cameraY + Sin(sinIndex & 0xFFFF, amplitude); } if (++task->tTimer == 41) { task->tFadeStarted++; BeginNormalPaletteFade(PALETTES_ALL, -8, 0, 16, RGB_BLACK); } if (task->tFadeStarted && !gPaletteFade.active) DestroyTask(FindTaskIdByFunc(Task_Ripple)); sTransitionData->vblankDma++; return FALSE; } static void VBlankCB_Ripple(void) { VBlankCB_BattleTransition(); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320); } static void HBlankCB_Ripple(void) { s16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT]; REG_BG1VOFS = offset; REG_BG2VOFS = offset; REG_BG3VOFS = offset; } #undef tSinVal #undef tAmplitudeVal #undef tTimer #undef tFadeStarted //------------------- // B_TRANSITION_WAVE //------------------- #define tX data[1] #define tSinIndex data[2] static void Task_Wave(u8 taskId) { while (sWave_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 Wave_Init(struct Task *task) { u32 i; InitTransitionData(); ScanlineEffect_Clear(); sTransitionData->winIn = WININ_WIN0_ALL; sTransitionData->winOut = 0; sTransitionData->win0H = DISPLAY_WIDTH; sTransitionData->win0V = DISPLAY_HEIGHT; for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH + 2; SetVBlankCallback(VBlankCB_Wave); task->tState++; return TRUE; } static bool8 Wave_Main(struct Task *task) { u8 i, sinIndex; u16 *winVal; bool8 finished; sTransitionData->vblankDma = FALSE; winVal = gScanlineEffectRegBuffers[0]; sinIndex = task->tSinIndex; task->tSinIndex += 16; task->tX += 8; for (i = 0, finished = TRUE; i < DISPLAY_HEIGHT; i++, sinIndex += 4, winVal++) { s16 x = task->tX + Sin(sinIndex, 40); if (x < 0) x = 0; if (x > DISPLAY_WIDTH) x = DISPLAY_WIDTH; *winVal = WIN_RANGE(x, DISPLAY_WIDTH + 1); if (x < DISPLAY_WIDTH) finished = FALSE; } if (finished) task->tState++; sTransitionData->vblankDma++; return FALSE; } static bool8 Wave_End(struct Task *task) { DmaStop(0); FadeScreenBlack(); DestroyTask(FindTaskIdByFunc(Task_Wave)); return FALSE; } static void VBlankCB_Wave(void) { DmaStop(0); VBlankCB_BattleTransition(); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2); SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn); SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut); SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V); DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, B_TRANS_DMA_FLAGS); } #undef tX #undef tSinIndex //--------------------- // B_TRANSITION_SPIRAL //--------------------- static void Task_Spiral(u8 taskId) { while (sSpiral_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static void Spiral_UpdateFrame(s16 initRadius, s16 deltaAngleMax, u8 offsetMaybe) { u8 sinIndex = 0; s16 i, amplitude1, amplitude2; s16 y1, x1, y2, x2; for (i = DISPLAY_HEIGHT * 2; i < DISPLAY_HEIGHT * 6; i++) gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH / 2; for (i = 0; i < (deltaAngleMax * 16); i++, sinIndex++) { amplitude1 = initRadius + (sinIndex >> 3); if ((sinIndex >> 3) != ((sinIndex + 1) >> 3)) { amplitude2 = amplitude1 + 1; } else { amplitude2 = amplitude1; } y1 = DISPLAY_HEIGHT / 2 - Sin(sinIndex, amplitude1); x1 = Cos(sinIndex, amplitude1) + DISPLAY_WIDTH / 2; y2 = DISPLAY_HEIGHT / 2 - Sin(sinIndex + 1, amplitude2); x2 = Cos(sinIndex + 1, amplitude2) + DISPLAY_WIDTH / 2; if (y1 < 0 && y2 < 0) continue; if (y1 > DISPLAY_HEIGHT - 1 && y2 > DISPLAY_HEIGHT - 1) continue; if (y1 < 0) y1 = 0; if (y1 > DISPLAY_HEIGHT - 1) y1 = DISPLAY_HEIGHT - 1; if (x1 < 0) x1 = 0; if (x1 > 255) x1 = 255; if (y2 < 0) y2 = 0; if (y2 > DISPLAY_HEIGHT - 1) y2 = DISPLAY_HEIGHT - 1; if (x2 < 0) x2 = 0; if (x2 > 255) x2 = 255; y2 -= y1; if (sinIndex >= 64 && sinIndex < 64 * 3) { gScanlineEffectRegBuffers[1][y1 + DISPLAY_HEIGHT * 2] = x1; if (y2 == 0) continue; x2 -= x1; if (x2 < -1 && x1 > 1) x1--; else if (x2 > 1 && x1 < 255) x1++; if (y2 < 0) for (; y2 < 0; y2++) gScanlineEffectRegBuffers[1][y1 + y2 + DISPLAY_HEIGHT * 2] = x1; else for (; y2 > 0; y2--) gScanlineEffectRegBuffers[1][y1 + y2 + DISPLAY_HEIGHT * 2] = x1; } else { gScanlineEffectRegBuffers[1][y1 + DISPLAY_HEIGHT * 3] = x1; if (y2 == 0) continue; x2 -= x1; if (x2 < -1 && x1 > 1) x1--; else if (x2 > 1 && x1 < 255) x1++; if (y2 < 0) for (; y2 < 0; y2++) gScanlineEffectRegBuffers[1][y1 + y2 + DISPLAY_HEIGHT * 3] = x1; else for (; y2 > 0; y2--) gScanlineEffectRegBuffers[1][y1 + y2 + DISPLAY_HEIGHT * 3] = x1; } } if (offsetMaybe == 0 || deltaAngleMax % 4 == 0) { for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i * 2 + offsetMaybe] = gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT * 2] << 8 | gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT * 3]; return; } y1 = Sin(deltaAngleMax * 16, initRadius + (deltaAngleMax << 1)); switch (deltaAngleMax / 4) { case 0: if (y1 > DISPLAY_HEIGHT / 2) y1 = DISPLAY_HEIGHT / 2; for (i = y1; i > 0; i--) { sTransitionData->data[2] = x1 = ((i * sSpiral_AngleData[deltaAngleMax]) >> 8) + DISPLAY_WIDTH / 2; if (x1 < 0 || x1 > 255) continue; sTransitionData->cameraX = 400 - i; sTransitionData->data[10] = gScanlineEffectRegBuffers[1][400 - i]; if (gScanlineEffectRegBuffers[1][560 - i] < x1) gScanlineEffectRegBuffers[1][560 - i] = DISPLAY_WIDTH / 2; else if (gScanlineEffectRegBuffers[1][400 - i] < x1) gScanlineEffectRegBuffers[1][400 - i] = x1; } break; case 1: if (y1 > DISPLAY_HEIGHT / 2) y1 = DISPLAY_HEIGHT / 2; for (i = y1; i > 0; i--) { sTransitionData->data[2] = x1 = ((i * sSpiral_AngleData[deltaAngleMax]) >> 8) + DISPLAY_WIDTH / 2; if (x1 < 0 || x1 > 255) continue; sTransitionData->cameraX = 400 - i; sTransitionData->data[10] = gScanlineEffectRegBuffers[1][400 - i]; if (gScanlineEffectRegBuffers[1][400 - i] < x1) gScanlineEffectRegBuffers[1][400 - i] = x1; } break; case 2: if (y1 < -(DISPLAY_HEIGHT / 2 - 1)) y1 = -(DISPLAY_HEIGHT / 2 - 1); for (i = y1; i <= 0; i++) { sTransitionData->data[2] = x1 = ((i * sSpiral_AngleData[deltaAngleMax]) >> 8) + DISPLAY_WIDTH / 2; if (x1 < 0 || x1 > 255) continue; sTransitionData->cameraX = 560 - i; sTransitionData->data[10] = gScanlineEffectRegBuffers[1][560 - i]; if (gScanlineEffectRegBuffers[1][400 - i] >= x1) gScanlineEffectRegBuffers[1][400 - i] = DISPLAY_WIDTH / 2; else if (gScanlineEffectRegBuffers[1][560 - i] > x1) gScanlineEffectRegBuffers[1][560 - i] = x1; } break; case 3: if (y1 < -(DISPLAY_HEIGHT / 2 - 1)) y1 = -(DISPLAY_HEIGHT / 2 - 1); for (i = y1; i <= 0; i++) { sTransitionData->data[2] = x1 = ((i * sSpiral_AngleData[deltaAngleMax]) >> 8) + 120; if (x1 < 0 || x1 > 255) continue; sTransitionData->cameraX = 560 - i; sTransitionData->data[10] = gScanlineEffectRegBuffers[1][560 - i]; if (gScanlineEffectRegBuffers[1][560 - i] > x1) gScanlineEffectRegBuffers[1][560 - i] = x1; } break; default: break; } for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i * 2 + offsetMaybe] = (gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT * 2] << 8) | gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT * 3]; } static bool8 Spiral_Init(struct Task *task) { InitTransitionData(); ScanlineEffect_Clear(); sTransitionData->winIn = 0; sTransitionData->winOut = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR; sTransitionData->win0H = WIN_RANGE(DISPLAY_WIDTH / 2, DISPLAY_WIDTH / 2); sTransitionData->win0V = WIN_RANGE(48, DISPLAY_HEIGHT - 48); sTransitionData->win1V = WIN_RANGE(16, DISPLAY_HEIGHT - 16); sTransitionData->counter = 0; Spiral_UpdateFrame(0, 0, 0); Spiral_UpdateFrame(0, 0, 1); DmaCopy16(3, gScanlineEffectRegBuffers[1], gScanlineEffectRegBuffers[0], DISPLAY_HEIGHT * 4); SetVBlankCallback(VBlankCB_Spiral); task->tState++; task->data[1] = 0; task->data[2] = 0; return FALSE; } static bool8 Spiral_End(struct Task *task) { s16 win_top, win_bottom; Spiral_UpdateFrame(task->data[2], task->data[1], 1); sTransitionData->vblankDma |= TRUE; if (++task->data[1] == (int)ARRAY_COUNT(sSpiral_AngleData) + 1) { Spiral_UpdateFrame(task->data[2], 16, 0); win_top = 48 - task->data[2]; if (win_top < 0) win_top = 0; win_bottom = task->data[2] + 112; if (win_bottom > 255) win_bottom = 255; sTransitionData->win0V = win_top | win_bottom; // UB: win_top should be shifted task->data[2] += 32; task->data[1] = 0; Spiral_UpdateFrame(task->data[2], 0, 1); win_top = 48 - task->data[2]; if (win_top < 0) win_top = 0; win_bottom = task->data[2] + 112; if (win_bottom > 255) win_bottom = 255; sTransitionData->win1V = win_top | win_bottom; // UB: win_top should be shifted sTransitionData->vblankDma |= TRUE; if (task->data[2] >= DISPLAY_HEIGHT) { sTransitionData->counter = 1; FadeScreenBlack(); } } return FALSE; } static void VBlankCB_Spiral(void) { DmaStop(0); VBlankCB_BattleTransition(); if (sTransitionData->counter) { DestroyTask(FindTaskIdByFunc(Task_Spiral)); } else { if (sTransitionData->vblankDma) { DmaCopy16(3, gScanlineEffectRegBuffers[1], gScanlineEffectRegBuffers[0], DISPLAY_HEIGHT * 4); sTransitionData->vblankDma = FALSE; } SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn); SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut); SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V); SetGpuReg(REG_OFFSET_WIN1V, sTransitionData->win1V); SetGpuReg(REG_OFFSET_WIN0H, gScanlineEffectRegBuffers[0][0]); SetGpuReg(REG_OFFSET_WIN1H, gScanlineEffectRegBuffers[0][1]); DmaSet(0, gScanlineEffectRegBuffers[0], ®_WIN0H, (DMA_32BIT << 16) | B_TRANS_DMA_FLAGS); } } //---------------------------------------------------------------- // B_TRANSITION_LORELEI, B_TRANSITION_BRUNO, B_TRANSITION_AGATHA, // B_TRANSITION_LANCE, and B_TRANSITION_BLUE // // These are all the "mugshot" transitions, where a banner shows // the trainer pic of the player and their opponent. //---------------------------------------------------------------- #define tSinIndex data[1] #define tTopBannerX data[2] #define tBottomBannerX data[3] #define tTimer data[3] // Re-used #define tFadeSpread data[4] #define tOpponentSpriteId data[13] #define tPlayerSpriteId data[14] #define tMugshotId data[15] // Sprite data for trainer sprites in mugshots #define sState data[0] #define sSlideSpeed data[1] #define sSlideAccel data[2] #define sDone data[6] #define sSlideDir data[7] static void Task_Lorelei(u8 taskId) { gTasks[taskId].tMugshotId = MUGSHOT_LORELEI; DoMugshotTransition(taskId); } static void Task_Bruno(u8 taskId) { gTasks[taskId].tMugshotId = MUGSHOT_BRUNO; DoMugshotTransition(taskId); } static void Task_Agatha(u8 taskId) { gTasks[taskId].tMugshotId = MUGSHOT_AGATHA; DoMugshotTransition(taskId); } static void Task_Lance(u8 taskId) { gTasks[taskId].tMugshotId = MUGSHOT_LANCE; DoMugshotTransition(taskId); } static void Task_Blue(u8 taskId) { gTasks[taskId].tMugshotId = MUGSHOT_BLUE; DoMugshotTransition(taskId); } static void Task_Oak(u8 taskId) { gTasks[taskId].tMugshotId = MUGSHOT_OAK; DoMugshotTransition(taskId); } static void DoMugshotTransition(u8 taskId) { while (sMugshot_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 Mugshot_Init(struct Task *task) { u32 i; InitTransitionData(); ScanlineEffect_Clear(); Mugshots_CreateTrainerPics(task); task->tSinIndex = 0; task->tTopBannerX = 1; task->tBottomBannerX = DISPLAY_WIDTH - 1; sTransitionData->winIn = WININ_WIN0_ALL; sTransitionData->winOut = WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR; sTransitionData->win0V = DISPLAY_HEIGHT; for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i] = WIN_RANGE(DISPLAY_WIDTH, DISPLAY_WIDTH + 1); SetVBlankCallback(VBlankCB_Mugshots); task->tState++; return FALSE; } static bool8 Mugshot_SetGfx(struct Task *task) { s16 i, j; u16 *tilemap, *tileset; const u16 *mugshotsMap = sMugshotsTilemap; GetBg0TilesDst(&tilemap, &tileset); CpuCopy16(sMugshotBanner_Gfx, tileset, sizeof(sMugshotBanner_Gfx)); LoadPalette(sOpponentMugshotsPals[task->tMugshotId], BG_PLTT_ID(15), PLTT_SIZE_4BPP); LoadPalette(sPlayerMugshotsPals[gSaveBlock2Ptr->playerGender], BG_PLTT_ID(15) + 10, PLTT_SIZEOF(16 - 10)); for (i = 0; i < 20; i++) for (j = 0; j < 32; j++, mugshotsMap++) SET_TILE(tilemap, i, j, *mugshotsMap); EnableInterrupts(INTR_FLAG_HBLANK); SetHBlankCallback(HBlankCB_Mugshots); task->tState++; return FALSE; } static bool8 Mugshot_ShowBanner(struct Task *task) { u8 i, sinIndex; u16 *winVal; s16 x; s32 mergedValue; sTransitionData->vblankDma = FALSE; winVal = gScanlineEffectRegBuffers[0]; sinIndex = task->tSinIndex; task->tSinIndex += 16; // Update top banner for (i = 0; i < DISPLAY_HEIGHT / 2; i++, winVal++, sinIndex += 16) { x = task->tTopBannerX + Sin(sinIndex, 16); if (x < 0) x = 1; if (x > DISPLAY_WIDTH) x = DISPLAY_WIDTH; *winVal = x; } // Update bottom banner for (; i < DISPLAY_HEIGHT; i++, winVal++, sinIndex += 16) { x = task->tBottomBannerX - Sin(sinIndex, 16); if (x < 0) x = 0; if (x > DISPLAY_WIDTH - 1) x = DISPLAY_WIDTH - 1; *winVal = (x << 8) | (DISPLAY_WIDTH); } // Slide banners across screen task->tTopBannerX += 8; task->tBottomBannerX -= 8; if (task->tTopBannerX > DISPLAY_WIDTH) task->tTopBannerX = DISPLAY_WIDTH; if (task->tBottomBannerX < 0) task->tBottomBannerX = 0; mergedValue = *(s32 *)(&task->tTopBannerX); if (mergedValue == DISPLAY_WIDTH) task->tState++; sTransitionData->bg0HOfsOpponent -= 8; sTransitionData->bg0HOfsPlayer += 8; sTransitionData->vblankDma++; return FALSE; } static bool8 Mugshot_StartOpponentSlide(struct Task *task) { u32 i; u16 *winVal; sTransitionData->vblankDma = FALSE; for (i = 0, winVal = gScanlineEffectRegBuffers[0]; i < DISPLAY_HEIGHT; i++, winVal++) *winVal = DISPLAY_WIDTH; task->tState++; // Clear old data task->tSinIndex = 0; task->tTopBannerX = 0; task->tBottomBannerX = 0; sTransitionData->bg0HOfsOpponent -= 8; sTransitionData->bg0HOfsPlayer += 8; SetTrainerPicSlideDirection(task->tOpponentSpriteId, 0); SetTrainerPicSlideDirection(task->tPlayerSpriteId, 1); // Start opponent slide IncrementTrainerPicState(task->tOpponentSpriteId); PlaySE(SE_MUGSHOT); sTransitionData->vblankDma++; return FALSE; } static bool8 Mugshot_WaitStartPlayerSlide(struct Task *task) { sTransitionData->bg0HOfsOpponent -= 8; sTransitionData->bg0HOfsPlayer += 8; // Start player's slide in once the opponent is finished if (IsTrainerPicSlideDone(task->tOpponentSpriteId)) { task->tState++; IncrementTrainerPicState(task->tPlayerSpriteId); } return FALSE; } static bool8 Mugshot_WaitPlayerSlide(struct Task *task) { sTransitionData->bg0HOfsOpponent -= 8; sTransitionData->bg0HOfsPlayer += 8; if (IsTrainerPicSlideDone(task->tPlayerSpriteId)) { sTransitionData->vblankDma = FALSE; SetVBlankCallback(NULL); DmaStop(0); memset(gScanlineEffectRegBuffers[0], 0, DISPLAY_HEIGHT * 2); memset(gScanlineEffectRegBuffers[1], 0, DISPLAY_HEIGHT * 2); SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); SetGpuReg(REG_OFFSET_BLDY, 0); task->tState++; task->tTimer = 0; task->tFadeSpread = 0; sTransitionData->bldCnt = BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN; SetVBlankCallback(VBlankCB_MugshotsFadeOut); } return FALSE; } static bool8 Mugshot_GradualWhiteFade(struct Task *task) { bool32 active; sTransitionData->vblankDma = FALSE; active = TRUE; sTransitionData->bg0HOfsOpponent -= 8; sTransitionData->bg0HOfsPlayer += 8; if (task->tFadeSpread < DISPLAY_HEIGHT / 2) task->tFadeSpread += 2; if (task->tFadeSpread > DISPLAY_HEIGHT / 2) task->tFadeSpread = DISPLAY_HEIGHT / 2; if (++task->tTimer & 1) { s32 i; for (i = 0, active = FALSE; i <= task->tFadeSpread; i++) { // Fade starts in middle of screen and // spreads outwards in both directions. s16 y1 = DISPLAY_HEIGHT / 2 - i; s16 y2 = DISPLAY_HEIGHT / 2 + i; if (gScanlineEffectRegBuffers[0][y1] <= 15) { active = TRUE; gScanlineEffectRegBuffers[0][y1]++; } if (gScanlineEffectRegBuffers[0][y2] <= 15) { active = TRUE; gScanlineEffectRegBuffers[0][y2]++; } } } if (task->tFadeSpread == DISPLAY_HEIGHT / 2 && !active) task->tState++; sTransitionData->vblankDma++; return FALSE; } // Set palette to white to replace the scanline white fade // before the screen fades to black. static bool8 Mugshot_InitFadeWhiteToBlack(struct Task *task) { sTransitionData->vblankDma = FALSE; BlendPalettes(PALETTES_ALL, 16, RGB_WHITE); sTransitionData->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN; task->tTimer = 0; task->tState++; return TRUE; } static bool8 Mugshot_FadeToBlack(struct Task *task) { sTransitionData->vblankDma = FALSE; task->tTimer++; memset(gScanlineEffectRegBuffers[0], task->tTimer, DISPLAY_HEIGHT * 2); if (task->tTimer > 15) task->tState++; sTransitionData->vblankDma++; return FALSE; } static bool8 Mugshot_End(struct Task *task) { DmaStop(0); FadeScreenBlack(); DestroyTask(FindTaskIdByFunc(task->func)); return FALSE; } static void VBlankCB_Mugshots(void) { DmaStop(0); VBlankCB_BattleTransition(); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2); SetGpuReg(REG_OFFSET_BG0VOFS, sTransitionData->bg0VOfs); SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn); SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut); SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V); DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, B_TRANS_DMA_FLAGS); } static void VBlankCB_MugshotsFadeOut(void) { DmaStop(0); VBlankCB_BattleTransition(); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2); SetGpuReg(REG_OFFSET_BLDCNT, sTransitionData->bldCnt); DmaSet(0, gScanlineEffectRegBuffers[1], ®_BLDY, B_TRANS_DMA_FLAGS); } static void HBlankCB_Mugshots(void) { if (REG_VCOUNT < DISPLAY_HEIGHT / 2) REG_BG0HOFS = sTransitionData->bg0HOfsOpponent; else REG_BG0HOFS = sTransitionData->bg0HOfsPlayer; } static void Mugshots_CreateTrainerPics(struct Task *task) { struct Sprite *opponentSprite, *playerSprite; s16 mugshotId; gReservedSpritePaletteCount = 10; mugshotId = task->tMugshotId; task->tOpponentSpriteId = CreateTrainerSprite(sMugshotsTrainerPicIDsTable[mugshotId], sMugshotsOpponentCoords[mugshotId][0] - 32, sMugshotsOpponentCoords[mugshotId][1] + 42, 0, gDecompressionBuffer); task->tPlayerSpriteId = CreateTrainerSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender, TRUE), DISPLAY_WIDTH + 32, 106, 0, gDecompressionBuffer); gReservedSpritePaletteCount = 12; opponentSprite = &gSprites[task->tOpponentSpriteId]; playerSprite = &gSprites[task->tPlayerSpriteId]; opponentSprite->callback = SpriteCB_MugshotTrainerPic; playerSprite->callback = SpriteCB_MugshotTrainerPic; opponentSprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; playerSprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; opponentSprite->oam.matrixNum = AllocOamMatrix(); playerSprite->oam.matrixNum = AllocOamMatrix(); opponentSprite->oam.shape = SPRITE_SHAPE(64x32); playerSprite->oam.shape = SPRITE_SHAPE(64x32); opponentSprite->oam.size = SPRITE_SIZE(64x32); playerSprite->oam.size = SPRITE_SIZE(64x32); CalcCenterToCornerVec(opponentSprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_DOUBLE); CalcCenterToCornerVec(playerSprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_DOUBLE); SetOamMatrixRotationScaling(opponentSprite->oam.matrixNum, sMugshotsOpponentRotationScales[mugshotId][0], sMugshotsOpponentRotationScales[mugshotId][1], 0); SetOamMatrixRotationScaling(playerSprite->oam.matrixNum, -512, 512, 0); } static void SpriteCB_MugshotTrainerPic(struct Sprite *sprite) { while (sMugshotTrainerPicFuncs[sprite->sState](sprite)); } // Wait until IncrementTrainerPicState is called static bool8 MugshotTrainerPic_Pause(struct Sprite *sprite) { return FALSE; } static bool8 MugshotTrainerPic_Init(struct Sprite *sprite) { s16 speeds[ARRAY_COUNT(sTrainerPicSlideSpeeds)]; s16 accels[ARRAY_COUNT(sTrainerPicSlideAccels)]; memcpy(speeds, sTrainerPicSlideSpeeds, sizeof(sTrainerPicSlideSpeeds)); memcpy(accels, sTrainerPicSlideAccels, sizeof(sTrainerPicSlideAccels)); sprite->sState++; sprite->sSlideSpeed = speeds[sprite->sSlideDir]; sprite->sSlideAccel = accels[sprite->sSlideDir]; return TRUE; } static bool8 MugshotTrainerPic_Slide(struct Sprite *sprite) { sprite->x += sprite->sSlideSpeed; // Advance state when pic passes ~40% of screen if (sprite->sSlideDir && sprite->x < DISPLAY_WIDTH - 107) sprite->sState++; else if (!sprite->sSlideDir && sprite->x > 103) sprite->sState++; return FALSE; } static bool8 MugshotTrainerPic_SlideSlow(struct Sprite *sprite) { // Add acceleration value to speed, then add speed. // For both sides acceleration is opposite speed, so slide slows down. sprite->sSlideSpeed += sprite->sSlideAccel; sprite->x += sprite->sSlideSpeed; // Advance state when slide comes to a stop if (sprite->sSlideSpeed == 0) { sprite->sState++; sprite->sSlideAccel = -sprite->sSlideAccel; sprite->sDone = TRUE; } return FALSE; } // Slides trainer pic offscreen. This is never reached, because it's preceded // by a second MugshotTrainerPic_Pause, and IncrementTrainerPicState is // only called once per trainer pic. static bool8 MugshotTrainerPic_SlideOffscreen(struct Sprite *sprite) { sprite->sSlideSpeed += sprite->sSlideAccel; sprite->x += sprite->sSlideSpeed; if (sprite->x < -31 || sprite->x > DISPLAY_WIDTH + 31) sprite->sState++; return FALSE; } static void SetTrainerPicSlideDirection(s16 spriteId, bool16 dirId) { gSprites[spriteId].sSlideDir = dirId; } static void IncrementTrainerPicState(s16 spriteId) { gSprites[spriteId].sState++; } static s16 IsTrainerPicSlideDone(s16 spriteId) { return gSprites[spriteId].sDone; } #undef sState #undef sSlideSpeed #undef sSlideAccel #undef sDone #undef sSlideDir #undef tSinIndex #undef tTopBannerX #undef tBottomBannerX #undef tTimer #undef tFadeSpread #undef tOpponentSpriteId #undef tPlayerSpriteId #undef tMugshotId //-------------------- // B_TRANSITION_SLICE //-------------------- #define tEffectX data[1] #define tSpeed data[2] #define tAccel data[3] static void Task_Slice(u8 taskId) { while (sSlice_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 Slice_Init(struct Task *task) { u32 i; InitTransitionData(); ScanlineEffect_Clear(); task->tSpeed = 1 << 8; task->tAccel = 1; sTransitionData->winIn = WININ_WIN0_ALL; sTransitionData->winOut = 0; sTransitionData->win0V = DISPLAY_HEIGHT; for (i = 0; i < DISPLAY_HEIGHT; i++) { gScanlineEffectRegBuffers[1][i] = sTransitionData->cameraX; gScanlineEffectRegBuffers[1][DISPLAY_HEIGHT + i] = DISPLAY_WIDTH; } EnableInterrupts(INTR_FLAG_HBLANK); SetVBlankCallback(VBlankCB_Slice); SetHBlankCallback(HBlankCB_Slice); task->tState++; return TRUE; } static bool8 Slice_Main(struct Task *task) { u32 i; sTransitionData->vblankDma = FALSE; task->tEffectX += (task->tSpeed >> 8); if (task->tEffectX > DISPLAY_WIDTH) task->tEffectX = DISPLAY_WIDTH; if (task->tSpeed <= 0xFFF) task->tSpeed += task->tAccel; if (task->tAccel < 128) task->tAccel <<= 1; for (i = 0; i < DISPLAY_HEIGHT; i++) { u16 *ofsBuffer = &gScanlineEffectRegBuffers[0][i]; u16 *win0HBuffer = &gScanlineEffectRegBuffers[0][i + DISPLAY_HEIGHT]; // Alternate rows if (i & 1) { *ofsBuffer = sTransitionData->cameraX + task->tEffectX; *win0HBuffer = DISPLAY_WIDTH - task->tEffectX; } else { *ofsBuffer = sTransitionData->cameraX - task->tEffectX; *win0HBuffer = WIN_RANGE(task->tEffectX, DISPLAY_WIDTH + 1); } } if (task->tEffectX >= DISPLAY_WIDTH) task->tState++; sTransitionData->vblankDma++; return FALSE; } static bool8 Slice_End(struct Task *task) { DmaStop(0); FadeScreenBlack(); DestroyTask(FindTaskIdByFunc(Task_Slice)); return FALSE; } static void VBlankCB_Slice(void) { DmaStop(0); VBlankCB_BattleTransition(); SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn); SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut); SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 4); DmaSet(0, &gScanlineEffectRegBuffers[1][DISPLAY_HEIGHT], ®_WIN0H, B_TRANS_DMA_FLAGS); } static void HBlankCB_Slice(void) { s16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT]; REG_BG1HOFS = offset; REG_BG2HOFS = offset; REG_BG3HOFS = offset; } #undef tEffectX #undef tSpeed #undef tAccel //------------------------------ // B_TRANSITION_WHITE_BARS_FADE //------------------------------ #define sFade data[0] #define sFinished data[1] #define sDestroyAttempts data[2] #define sDelay data[5] #define sIsMainSprite data[6] #define FADE_TARGET (16 << 8) static void Task_WhiteBarsFade(u8 taskId) { while (sWhiteBarsFade_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 WhiteBarsFade_Init(struct Task *task) { u32 i; InitTransitionData(); ScanlineEffect_Clear(); sTransitionData->bldCnt = BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN; sTransitionData->bldY = 0; sTransitionData->winIn = WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ; sTransitionData->winOut = WINOUT_WIN01_ALL; sTransitionData->win0V = DISPLAY_HEIGHT; for (i = 0; i < DISPLAY_HEIGHT; i++) { gScanlineEffectRegBuffers[1][i] = 0; gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT] = DISPLAY_WIDTH; } EnableInterrupts(INTR_FLAG_HBLANK); SetHBlankCallback(HBlankCB_WhiteBarsFade); SetVBlankCallback(VBlankCB_WhiteBarsFade); task->tState++; return FALSE; } static bool8 WhiteBarsFade_StartBars(struct Task *task) { s16 i, posY; s16 delays[ARRAY_COUNT(sWhiteBarsFade_StartDelays)]; struct Sprite *sprite; memcpy(delays, sWhiteBarsFade_StartDelays, sizeof(sWhiteBarsFade_StartDelays)); for (i = 0, posY = 0; i < NUM_WHITE_BARS; i++, posY += WHITE_BAR_HEIGHT) { sprite = &gSprites[CreateInvisibleSprite(SpriteCB_WhiteBarFade)]; sprite->x = DISPLAY_WIDTH; sprite->y = posY; sprite->sDelay = delays[i]; } // Set on one sprite only. This one will enable the DMA // copy in VBlank and wait for the others to destroy. sprite->sIsMainSprite++; task->tState++; return FALSE; } static bool8 WhiteBarsFade_WaitBars(struct Task *task) { sTransitionData->vblankDma = FALSE; if (sTransitionData->counter >= NUM_WHITE_BARS) { BlendPalettes(PALETTES_ALL, 16, RGB_WHITE); task->tState++; } return FALSE; } static bool8 WhiteBarsFade_BlendToBlack(struct Task *task) { sTransitionData->vblankDma = FALSE; DmaStop(0); SetVBlankCallback(NULL); SetHBlankCallback(NULL); sTransitionData->win0H = DISPLAY_WIDTH; sTransitionData->bldY = 0; sTransitionData->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN; sTransitionData->winIn = WININ_WIN0_ALL; sTransitionData->counter = 0; SetVBlankCallback(VBlankCB_WhiteBarsFade_Blend); task->tState++; return FALSE; } static bool8 WhiteBarsFade_End(struct Task *task) { sTransitionData->counter += 480; sTransitionData->bldY = sTransitionData->counter >> 8; if (sTransitionData->bldY > 16) { FadeScreenBlack(); DestroyTask(FindTaskIdByFunc(Task_WhiteBarsFade)); } return FALSE; } static void VBlankCB_WhiteBarsFade(void) { DmaStop(0); VBlankCB_BattleTransition(); SetGpuReg(REG_OFFSET_BLDCNT, sTransitionData->bldCnt); SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn); SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut); SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0H); // BUG: This should obviously be sTransitionData->win0V if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 4); DmaSet(0, &gScanlineEffectRegBuffers[1][DISPLAY_HEIGHT], ®_WIN0H, B_TRANS_DMA_FLAGS); } static void VBlankCB_WhiteBarsFade_Blend(void) { VBlankCB_BattleTransition(); SetGpuReg(REG_OFFSET_BLDY, sTransitionData->bldY); SetGpuReg(REG_OFFSET_BLDCNT, sTransitionData->bldCnt); SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn); SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut); SetGpuReg(REG_OFFSET_WIN0H, sTransitionData->win0H); SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V); } static void HBlankCB_WhiteBarsFade(void) { vu16 index = REG_VCOUNT; if (index == 227) index = 0; REG_BLDY = gScanlineEffectRegBuffers[1][index]; } static void SpriteCB_WhiteBarFade(struct Sprite *sprite) { if (sprite->sDelay) { sprite->sDelay--; if (sprite->sIsMainSprite) sTransitionData->vblankDma = TRUE; } else { u32 i; u16 *bldY = &gScanlineEffectRegBuffers[0][sprite->y]; u16 *win0H = &gScanlineEffectRegBuffers[0][sprite->y + DISPLAY_HEIGHT]; // Each bar is 27 pixels high. With 6 bars this is a total of 162, which is 2 pixels taller than the screen. // 1 bar is therefore shortened by 2 pixels u32 stripeWidth = sprite->sIsMainSprite ? (WHITE_BAR_HEIGHT - 2) : WHITE_BAR_HEIGHT; for (i = 0; i < stripeWidth; i++) { bldY[i] = sprite->sFade >> 8; win0H[i] = (u8)(sprite->x); } if (sprite->x == 0 && sprite->sFade == FADE_TARGET) sprite->sFinished = TRUE; sprite->x -= 24; sprite->sFade += 192; if (sprite->x < 0) sprite->x = 0; if (sprite->sFade > FADE_TARGET) sprite->sFade = FADE_TARGET; if (sprite->sIsMainSprite) sTransitionData->vblankDma = TRUE; if (sprite->sFinished) { if (sprite->sIsMainSprite == FALSE || (sTransitionData->counter > 4)) { sTransitionData->counter++; DestroySprite(sprite); } } } } #undef sFade #undef sFinished #undef sDestroyAttempts #undef sDelay #undef sIsMainSprite //--------------------------- // B_TRANSITION_GRID_SQUARES //--------------------------- #define tDelay data[1] #define tShrinkStage data[2] static void Task_GridSquares(u8 taskId) { while (sGridSquares_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 GridSquares_Init(struct Task *task) { u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); CpuCopy16(sGridSquare_Gfx, tileset, 0x20); CpuFill16(0xF0 << 8, tilemap, BG_SCREEN_SIZE); LoadPalette(sFieldEffectPal_Pokeball, BG_PLTT_ID(15), sizeof(sFieldEffectPal_Pokeball)); task->tState++; return FALSE; } static bool8 GridSquares_Main(struct Task *task) { u16 *tileset; if (task->tDelay == 0) { GetBg0TilemapDst(&tileset); task->tDelay = 3; task->tShrinkStage++; CpuCopy16(&sGridSquare_Gfx[task->tShrinkStage * 8], tileset, 0x20); if (task->tShrinkStage > 13) { task->tState++; task->tDelay = 16; } } task->tDelay--; return FALSE; } static bool8 GridSquares_End(struct Task *task) { if (--task->tDelay == 0) { FadeScreenBlack(); DestroyTask(FindTaskIdByFunc(Task_GridSquares)); } return FALSE; } #undef tDelay #undef tShrinkStage //--------------------------- // B_TRANSITION_ANGLED_WIPES //--------------------------- #define tWipeId data[1] #define tDir data[2] #define tDelay data[3] static void Task_AngledWipes(u8 taskId) { while (sAngledWipes_Funcs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 AngledWipes_Init(struct Task *task) { u32 i; InitTransitionData(); ScanlineEffect_Clear(); sTransitionData->winIn = WININ_WIN0_ALL; sTransitionData->winOut = 0; sTransitionData->win0V = DISPLAY_HEIGHT; for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[0][i] = WIN_RANGE(0, DISPLAY_WIDTH); CpuCopy16(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2); SetVBlankCallback(VBlankCB_AngledWipes); task->tState++; return TRUE; } static bool8 AngledWipes_SetWipeData(struct Task *task) { InitBlackWipe(sTransitionData->data, sAngledWipes_MoveData[task->tWipeId][0], sAngledWipes_MoveData[task->tWipeId][1], sAngledWipes_MoveData[task->tWipeId][2], sAngledWipes_MoveData[task->tWipeId][3], 1, 1); task->tDir = sAngledWipes_MoveData[task->tWipeId][4]; task->tState++; return TRUE; } static bool8 AngledWipes_DoWipe(struct Task *task) { s32 i; bool8 finished; sTransitionData->vblankDma = FALSE; for (i = 0, finished = FALSE; i < 16; i++) { s16 left = gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] >> 8; s16 right = gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] & 0xFF; if (task->tDir == 0) { // Moving down if (left < sTransitionData->tWipeCurrX) left = sTransitionData->tWipeCurrX; if (left > right) left = right; } else { // Moving up if (right > sTransitionData->tWipeCurrX) right = sTransitionData->tWipeCurrX; if (right <= left) right = left; } gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = WIN_RANGE2(left, right); if (finished) { task->tState++; break; } finished = UpdateBlackWipe(sTransitionData->data, TRUE, TRUE); } sTransitionData->vblankDma++; return FALSE; } static bool8 AngledWipes_TryEnd(struct Task *task) { if (++task->tWipeId < NUM_ANGLED_WIPES) { // Continue with next wipe task->tState++; task->tDelay = sAngledWipes_EndDelays[task->tWipeId - 1]; return TRUE; } else { // End transition DmaStop(0); FadeScreenBlack(); DestroyTask(FindTaskIdByFunc(Task_AngledWipes)); return FALSE; } } static bool8 AngledWipes_StartNext(struct Task *task) { if (--task->tDelay == 0) { // Return to AngledWipes_SetWipeData task->tState = 1; return TRUE; } else return FALSE; } static void VBlankCB_AngledWipes(void) { DmaStop(0); VBlankCB_BattleTransition(); if (sTransitionData->vblankDma) DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2); SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn); SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut); SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V); SetGpuReg(REG_OFFSET_WIN0H, gScanlineEffectRegBuffers[1][0]); DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, B_TRANS_DMA_FLAGS); } #undef tWipeId #undef tDir #undef tDelay //----------------------------------- // Transition intro //----------------------------------- #define tFadeToGrayDelay data[1] #define tFadeFromGrayDelay data[2] #define tNumFades data[3] #define tFadeToGraySpeed data[4] #define tFadeFromGraySpeed data[5] #define tDelayTimer data[6] #define tBlend data[7] static void CreateIntroTask(s16 fadeToGrayDelay, s16 fadeFromGrayDelay, s16 numFades, s16 fadeToGraySpeed, s16 fadeFromGraySpeed) { u8 taskId = CreateTask(Task_BattleTransition_Intro, 3); gTasks[taskId].tFadeToGrayDelay = fadeToGrayDelay; gTasks[taskId].tFadeFromGrayDelay = fadeFromGrayDelay; gTasks[taskId].tNumFades = numFades; gTasks[taskId].tFadeToGraySpeed = fadeToGraySpeed; gTasks[taskId].tFadeFromGraySpeed = fadeFromGraySpeed; gTasks[taskId].tDelayTimer = fadeToGrayDelay; } static bool8 IsIntroTaskDone(void) { if (FindTaskIdByFunc(Task_BattleTransition_Intro) == TASK_NONE) return TRUE; else return FALSE; } static void Task_BattleTransition_Intro(u8 taskId) { while (sTransitionIntroFuncs[gTasks[taskId].tState](&gTasks[taskId])); } static bool8 TransitionIntro_FadeToGray(struct Task *task) { if (task->tDelayTimer == 0 || --task->tDelayTimer == 0) { task->tDelayTimer = task->tFadeToGrayDelay; task->tBlend += task->tFadeToGraySpeed; if (task->tBlend > 16) task->tBlend = 16; BlendPalettes(-1, task->tBlend, RGB(11, 11, 11)); } if (task->tBlend >= 16) { // Fade to gray complete, start fade back task->tState++; task->tDelayTimer = task->tFadeFromGrayDelay; } return FALSE; } static bool8 TransitionIntro_FadeFromGray(struct Task *task) { if (task->tDelayTimer == 0 || --task->tDelayTimer == 0) { task->tDelayTimer = task->tFadeFromGrayDelay; task->tBlend -= task->tFadeFromGraySpeed; if (task->tBlend < 0) task->tBlend = 0; BlendPalettes(PALETTES_ALL, task->tBlend, RGB(11, 11, 11)); } if (task->tBlend == 0) { if (--task->tNumFades == 0) { // All fades done, end intro DestroyTask(FindTaskIdByFunc(Task_BattleTransition_Intro)); } else { // Fade from gray complete, start new fade task->tDelayTimer = task->tFadeToGrayDelay; task->tState = 0; } } return FALSE; } #undef tFadeToGrayDelay #undef tFadeFromGrayDelay #undef tNumFades #undef tFadeToGraySpeed #undef tFadeFromGraySpeed #undef tDelayTimer #undef tBlend //----------------------------------- // General transition functions //----------------------------------- static void InitTransitionData(void) { memset(sTransitionData, 0, sizeof(*sTransitionData)); FieldCameraGetPixelOffsetAtGround(&sTransitionData->cameraX, &sTransitionData->cameraY); } static void VBlankCB_BattleTransition(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void GetBg0TilemapDst(u16 **tilesetPtr) { u16 charBase; charBase = GetGpuReg(REG_OFFSET_BG0CNT) >> 2; charBase <<= 14; *tilesetPtr = (u16 *)(VRAM + charBase); } static void GetBg0TilesDst(u16 **tilemapPtr, u16 **tilesetPtr) { u16 screenBase, charBase; screenBase = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) & 0x1F; charBase = GetGpuReg(REG_OFFSET_BG0CNT) >> 2; screenBase <<= 11; charBase <<= 14; *tilemapPtr = (u16 *)(VRAM + screenBase); *tilesetPtr = (u16 *)(VRAM + charBase); } static void FadeScreenBlack(void) { BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); } static void SetSinWave(s16 *buffer, s16 offset, s16 index, s16 frequency, s16 amplitude, s16 bufSize) { u32 i; for (i = 0; bufSize > 0; bufSize--, i++, index += frequency) buffer[i] = offset + Sin(index & 0xFF, amplitude); } static void SetCircularMask(s16 *buffer, s16 x, s16 y, s16 radius) { s32 i; memset(buffer, 10, DISPLAY_HEIGHT * sizeof(u16)); // 64 iterations because we only want to cover [0, π/2) discretely. for (i = 0; i < 64; i++) { s16 sinResult, cosResult, leftX, topY, bottomY, nextTopY, nextBottomY, winVal; // The loop variable i here does not stand for rotation angle, // but is the angle between segment (center, pointOnCircle) // and vertical line. sinResult = Sin(i, radius); cosResult = Cos(i, radius); leftX = x - sinResult; winVal = x + sinResult; topY = y - cosResult; bottomY = y + cosResult; if (leftX < 0) leftX = 0; if (winVal > DISPLAY_WIDTH) winVal = DISPLAY_WIDTH; if (topY < 0) topY = 0; if (bottomY > DISPLAY_HEIGHT - 1) bottomY = DISPLAY_HEIGHT - 1; winVal |= (leftX << 8); buffer[topY] = winVal; buffer[bottomY] = winVal; cosResult = Cos(i + 1, radius); nextTopY = y - cosResult; nextBottomY = y + cosResult; if (nextTopY < 0) nextTopY = 0; if (nextBottomY > DISPLAY_HEIGHT - 1) nextBottomY = DISPLAY_HEIGHT - 1; // fill everything in between with the same WIN0H value while (topY > nextTopY) buffer[--topY] = winVal; while (topY < nextTopY) buffer[++topY] = winVal; while (bottomY > nextBottomY) buffer[--bottomY] = winVal; while (bottomY < nextBottomY) buffer[++bottomY] = winVal; } } static void InitBlackWipe(s16 *data, s16 startX, s16 startY, s16 endX, s16 endY, s16 stepX, s16 stepY) { tWipeStartX = startX; tWipeStartY = startY; tWipeCurrX = startX; tWipeCurrY = startY; tWipeEndX = endX; tWipeEndY = endY; tWipeXMove = stepX; tWipeYMove = stepY; tWipeXDist = endX - startX; if (tWipeXDist < 0) { // If end was less than start, reverse direction tWipeXDist = -tWipeXDist; tWipeXMove = -stepX; } tWipeYDist = endY - startY; if (tWipeYDist < 0) { // If end was less than start, reverse direction tWipeYDist = -tWipeYDist; tWipeYMove = -stepY; } tWipeTemp = 0; } static bool8 UpdateBlackWipe(s16 *data, bool8 xExact, bool8 yExact) { u8 numFinished; if (tWipeXDist > tWipeYDist) { // X has further to move, move it first tWipeCurrX += tWipeXMove; // If it has been far enough since Y's // last move then move it too tWipeTemp += tWipeYDist; if (tWipeTemp > tWipeXDist) { tWipeCurrY += tWipeYMove; tWipeTemp -= tWipeXDist; } } else { // Y has further to move, move it first tWipeCurrY += tWipeYMove; // If it has been far enough since X's // last move then move it too tWipeTemp += tWipeXDist; if (tWipeTemp > tWipeYDist) { tWipeCurrX += tWipeXMove; tWipeTemp -= tWipeYDist; } } numFinished = 0; // Has X coord reached end? if ((tWipeXMove > 0 && tWipeCurrX >= tWipeEndX) || (tWipeXMove < 0 && tWipeCurrX <= tWipeEndX)) { numFinished++; if (xExact) tWipeCurrX = tWipeEndX; } // Has Y coord reached end? if ((tWipeYMove > 0 && tWipeCurrY >= tWipeEndY) || (tWipeYMove < 0 && tWipeCurrY <= tWipeEndY)) { numFinished++; if (yExact) tWipeCurrY = tWipeEndY; } // Return TRUE if both coords have reached end if (numFinished == 2) return TRUE; else return FALSE; } static bool32 IsMugshotTransition(u8 transitionId) { switch(transitionId) { case B_TRANSITION_LORELEI ... B_TRANSITION_BLUE: case B_TRANSITION_OAK: return TRUE; default: return FALSE; } } ================================================ FILE: src/battle_util.c ================================================ #include "global.h" #include "item.h" #include "text.h" #include "util.h" #include "link.h" #include "berry.h" #include "random.h" #include "pokemon.h" #include "string_util.h" #include "field_weather.h" #include "event_data.h" #include "battle.h" #include "battle_anim.h" #include "battle_scripts.h" #include "battle_message.h" #include "constants/battle_anim.h" #include "battle_controllers.h" #include "battle_ai_script_commands.h" #include "constants/battle.h" #include "constants/moves.h" #include "constants/items.h" #include "constants/weather.h" #include "constants/abilities.h" #include "constants/pokemon.h" #include "constants/hold_effects.h" #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" #define SOUND_MOVES_END 0xFFFF static const u16 sSoundMovesTable[] = { MOVE_GROWL, MOVE_ROAR, MOVE_SING, MOVE_SUPERSONIC, MOVE_SCREECH, MOVE_SNORE, MOVE_UPROAR, MOVE_METAL_SOUND, MOVE_GRASS_WHISTLE, MOVE_HYPER_VOICE, SOUND_MOVES_END }; u8 GetBattlerForBattleScript(u8 caseId) { u8 ret = 0; switch (caseId) { case BS_TARGET: ret = gBattlerTarget; break; case BS_ATTACKER: ret = gBattlerAttacker; break; case BS_EFFECT_BATTLER: ret = gEffectBattler; break; case BS_BATTLER_0: ret = 0; break; case BS_SCRIPTING: ret = gBattleScripting.battler; break; case BS_FAINTED: ret = gBattlerFainted; break; case BS_FAINTED_LINK_MULTIPLE_1: ret = gBattlerFainted; break; case BS_PLAYER1: ret = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); break; case BS_OPPONENT1: ret = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); break; case BS_ATTACKER_WITH_PARTNER: case BS_FAINTED_LINK_MULTIPLE_2: case BS_ATTACKER_SIDE: case BS_NOT_ATTACKER_SIDE: break; } return ret; } void PressurePPLose(u8 target, u8 attacker, u16 move) { int moveIndex; if (gBattleMons[target].ability != ABILITY_PRESSURE) return; for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (gBattleMons[attacker].moves[moveIndex] == move) break; } if (moveIndex == MAX_MON_MOVES) return; if (gBattleMons[attacker].pp[moveIndex] != 0) gBattleMons[attacker].pp[moveIndex]--; if (MOVE_IS_PERMANENT(attacker, moveIndex)) { gActiveBattler = attacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); } } void PressurePPLoseOnUsingImprison(u8 attacker) { int i, j; int imprisonPos = MAX_MON_MOVES; u8 atkSide = GetBattlerSide(attacker); for (i = 0; i < gBattlersCount; i++) { if (atkSide != GetBattlerSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE) { for (j = 0; j < MAX_MON_MOVES; j++) { if (gBattleMons[attacker].moves[j] == MOVE_IMPRISON) break; } if (j != MAX_MON_MOVES) { imprisonPos = j; if (gBattleMons[attacker].pp[j] != 0) gBattleMons[attacker].pp[j]--; } } } if (imprisonPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, imprisonPos)) { gActiveBattler = attacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + imprisonPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisonPos]); MarkBattlerForControllerExec(gActiveBattler); } } void PressurePPLoseOnUsingPerishSong(u8 attacker) { int i, j; int perishSongPos = MAX_MON_MOVES; for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ABILITY_PRESSURE && i != attacker) { for (j = 0; j < MAX_MON_MOVES; j++) { if (gBattleMons[attacker].moves[j] == MOVE_PERISH_SONG) break; } if (j != MAX_MON_MOVES) { perishSongPos = j; if (gBattleMons[attacker].pp[j] != 0) gBattleMons[attacker].pp[j]--; } } } if (perishSongPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, perishSongPos)) { gActiveBattler = attacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); MarkBattlerForControllerExec(gActiveBattler); } } // Unused static void MarkAllBattlersForControllerExec(void) { int i; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { for (i = 0; i < gBattlersCount; i++) gBattleControllerExecFlags |= gBitTable[i] << (32 - MAX_BATTLERS_COUNT); } else { for (i = 0; i < gBattlersCount; i++) gBattleControllerExecFlags |= gBitTable[i]; } } void MarkBattlerForControllerExec(u8 battlerId) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) gBattleControllerExecFlags |= gBitTable[battlerId] << (32 - MAX_BATTLERS_COUNT); else gBattleControllerExecFlags |= gBitTable[battlerId]; } void MarkBattlerReceivedLinkData(u8 battlerId) { s32 i; for (i = 0; i < GetLinkPlayerCount(); i++) gBattleControllerExecFlags |= gBitTable[battlerId] << (i << 2); gBattleControllerExecFlags &= ~((1 << 28) << battlerId); } void CancelMultiTurnMoves(u8 battler) { gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS; gBattleMons[battler].status2 &= ~STATUS2_LOCK_CONFUSE; gBattleMons[battler].status2 &= ~STATUS2_UPROAR; gBattleMons[battler].status2 &= ~STATUS2_BIDE; gStatuses3[battler] &= ~STATUS3_SEMI_INVULNERABLE; gDisableStructs[battler].rolloutTimer = 0; gDisableStructs[battler].furyCutterCounter = 0; } bool8 WasUnableToUseMove(u8 battler) { if (gProtectStructs[battler].prlzImmobility || gProtectStructs[battler].targetNotAffected || gProtectStructs[battler].usedImprisonedMove || gProtectStructs[battler].loveImmobility || gProtectStructs[battler].usedDisabledMove || gProtectStructs[battler].usedTauntedMove || gProtectStructs[battler].flag2Unknown || gProtectStructs[battler].flinchImmobility || gProtectStructs[battler].confusionSelfDmg) return TRUE; else return FALSE; } void PrepareStringBattle(u16 stringId, u8 battler) { gActiveBattler = battler; BtlController_EmitPrintString(BUFFER_A, stringId); MarkBattlerForControllerExec(gActiveBattler); } void ResetSentPokesToOpponentValue(void) { s32 i; u32 bits = 0; gSentPokesToOpponent[0] = 0; gSentPokesToOpponent[1] = 0; for (i = 0; i < gBattlersCount; i += 2) bits |= gBitTable[gBattlerPartyIndexes[i]]; for (i = 1; i < gBattlersCount; i += 2) gSentPokesToOpponent[(i & BIT_FLANK) >> 1] = bits; } void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler) { s32 i = 0; u32 bits = 0; if (GetBattlerSide(battler) == B_SIDE_OPPONENT) { u8 flank = ((battler & BIT_FLANK) >> 1); gSentPokesToOpponent[flank] = 0; for (i = 0; i < gBattlersCount; i += 2) { if (!(gAbsentBattlerFlags & gBitTable[i])) bits |= gBitTable[gBattlerPartyIndexes[i]]; } gSentPokesToOpponent[flank] = bits; } } void UpdateSentPokesToOpponentValue(u8 battler) { if (GetBattlerSide(battler) == B_SIDE_OPPONENT) { OpponentSwitchInResetSentPokesToOpponentValue(battler); } else { s32 i; for (i = 1; i < gBattlersCount; i++) gSentPokesToOpponent[(i & BIT_FLANK) >> 1] |= gBitTable[gBattlerPartyIndexes[battler]]; } } void BattleScriptPush(const u8 *bsPtr) { gBattleResources->battleScriptsStack->ptr[gBattleResources->battleScriptsStack->size++] = bsPtr; } void BattleScriptPushCursor(void) { gBattleResources->battleScriptsStack->ptr[gBattleResources->battleScriptsStack->size++] = gBattlescriptCurrInstr; } void BattleScriptPop(void) { gBattlescriptCurrInstr = gBattleResources->battleScriptsStack->ptr[--gBattleResources->battleScriptsStack->size]; } u8 TrySetCantSelectMoveBattleScript(void) { u8 holdEffect; u8 limitations = 0; u16 move = gBattleMons[gActiveBattler].moves[gBattleBufferB[gActiveBattler][2]]; u16 *choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; if (gDisableStructs[gActiveBattler].disabledMove == move && move != MOVE_NONE) { gBattleScripting.battler = gActiveBattler; gCurrentMove = move; gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMove; limitations = 1; } if (move == gLastMoves[gActiveBattler] && move != MOVE_STRUGGLE && (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT)) { CancelMultiTurnMoves(gActiveBattler); gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingTormentedMove; limitations++; } if (gDisableStructs[gActiveBattler].tauntTimer != 0 && gBattleMoves[move].power == 0) { gCurrentMove = move; gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveTaunt; limitations++; } if (GetImprisonedMovesCount(gActiveBattler, move)) { gCurrentMove = move; gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingImprisonedMove; limitations++; } if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gActiveBattler].holdEffect; else holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item); gPotentialItemEffectBattler = gActiveBattler; if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) { gCurrentMove = *choicedMove; gLastUsedItem = gBattleMons[gActiveBattler].item; gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveChoiceItem; limitations++; } if (gBattleMons[gActiveBattler].pp[gBattleBufferB[gActiveBattler][2]] == 0) { gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingMoveWithNoPP; limitations++; } return limitations; } u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) { u8 holdEffect; u16 *choicedMove = &gBattleStruct->choicedMove[battlerId]; s32 i; if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[battlerId].holdEffect; else holdEffect = ItemId_GetHoldEffect(gBattleMons[battlerId].item); gPotentialItemEffectBattler = battlerId; for (i = 0; i < MAX_MON_MOVES; i++) { // No move if (gBattleMons[battlerId].moves[i] == MOVE_NONE && check & MOVE_LIMITATION_ZEROMOVE) unusableMoves |= gBitTable[i]; // No PP if (gBattleMons[battlerId].pp[i] == 0 && check & MOVE_LIMITATION_PP) unusableMoves |= gBitTable[i]; // Disable if (gBattleMons[battlerId].moves[i] == gDisableStructs[battlerId].disabledMove && check & MOVE_LIMITATION_DISABLED) unusableMoves |= gBitTable[i]; // Torment if (gBattleMons[battlerId].moves[i] == gLastMoves[battlerId] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[battlerId].status2 & STATUS2_TORMENT) unusableMoves |= gBitTable[i]; // Taunt if (gDisableStructs[battlerId].tauntTimer && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0) unusableMoves |= gBitTable[i]; // Imprison if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISON) unusableMoves |= gBitTable[i]; // Encore if (gDisableStructs[battlerId].encoreTimer && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i]) unusableMoves |= gBitTable[i]; // Choice Band if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != gBattleMons[battlerId].moves[i]) unusableMoves |= gBitTable[i]; } return unusableMoves; } #define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1) bool8 AreAllMovesUnusable(void) { u8 unusable = CheckMoveLimitations(gActiveBattler, 0, MOVE_LIMITATIONS_ALL); if (unusable == ALL_MOVES_MASK) // All moves are unusable. { gProtectStructs[gActiveBattler].noValidMoves = TRUE; gSelectionBattleScripts[gActiveBattler] = BattleScript_NoMovesLeft; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) gBattleBufferB[gActiveBattler][3] = GetBattlerAtPosition((BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler))) | (Random() & 2)); else gBattleBufferB[gActiveBattler][3] = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler))); } else { gProtectStructs[gActiveBattler].noValidMoves = FALSE; } return (unusable == ALL_MOVES_MASK); } #undef ALL_MOVES_MASK u8 GetImprisonedMovesCount(u8 battlerId, u16 move) { s32 i; u8 imprisonedMoves = 0; u8 battlerSide = GetBattlerSide(battlerId); for (i = 0; i < gBattlersCount; i++) { if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS) { s32 j; for (j = 0; j < MAX_MON_MOVES; j++) { if (move == gBattleMons[i].moves[j]) break; } if (j < MAX_MON_MOVES) imprisonedMoves++; } } return imprisonedMoves; } enum { ENDTURN_ORDER, ENDTURN_REFLECT, ENDTURN_LIGHT_SCREEN, ENDTURN_MIST, ENDTURN_SAFEGUARD, ENDTURN_WISH, ENDTURN_RAIN, ENDTURN_SANDSTORM, ENDTURN_SUN, ENDTURN_HAIL, ENDTURN_FIELD_COUNT, }; u8 DoFieldEndTurnEffects(void) { u8 effect = 0; s32 i; for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerAttacker]; gBattlerAttacker++) { } for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerTarget]; gBattlerTarget++) { } do { u8 side; switch (gBattleStruct->turnCountersTracker) { case ENDTURN_ORDER: for (i = 0; i < gBattlersCount; i++) { gBattlerByTurnOrder[i] = i; } for (i = 0; i < gBattlersCount - 1; i++) { s32 j; for (j = i + 1; j < gBattlersCount; j++) { if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE)) SwapTurnOrder(i, j); } } { u8 *var = &gBattleStruct->turnCountersTracker; ++*var; gBattleStruct->turnSideTracker = 0; } // fall through case ENDTURN_REFLECT: while (gBattleStruct->turnSideTracker < 2) { side = gBattleStruct->turnSideTracker; gActiveBattler = gBattlerAttacker = gSideTimers[side].reflectBattlerId; if (gSideStatuses[side] & SIDE_STATUS_REFLECT) { if (--gSideTimers[side].reflectTimer == 0) { gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; BattleScriptExecute(BattleScript_SideStatusWoreOff); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT); effect++; } } gBattleStruct->turnSideTracker++; if (effect != 0) break; } if (effect == 0) { gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; } break; case ENDTURN_LIGHT_SCREEN: while (gBattleStruct->turnSideTracker < 2) { side = gBattleStruct->turnSideTracker; gActiveBattler = gBattlerAttacker = gSideTimers[side].lightscreenBattlerId; if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN) { if (--gSideTimers[side].lightscreenTimer == 0) { gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN; BattleScriptExecute(BattleScript_SideStatusWoreOff); gBattleCommunication[MULTISTRING_CHOOSER] = side; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN); effect++; } } gBattleStruct->turnSideTracker++; if (effect != 0) break; } if (effect == 0) { gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; } break; case ENDTURN_MIST: while (gBattleStruct->turnSideTracker < 2) { side = gBattleStruct->turnSideTracker; gActiveBattler = gBattlerAttacker = gSideTimers[side].mistBattlerId; if (gSideTimers[side].mistTimer != 0 && --gSideTimers[side].mistTimer == 0) { gSideStatuses[side] &= ~SIDE_STATUS_MIST; BattleScriptExecute(BattleScript_SideStatusWoreOff); gBattleCommunication[MULTISTRING_CHOOSER] = side; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST); effect++; } gBattleStruct->turnSideTracker++; if (effect != 0) break; } if (effect == 0) { gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; } break; case ENDTURN_SAFEGUARD: while (gBattleStruct->turnSideTracker < 2) { side = gBattleStruct->turnSideTracker; gActiveBattler = gBattlerAttacker = gSideTimers[side].safeguardBattlerId; if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD) { if (--gSideTimers[side].safeguardTimer == 0) { gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD; BattleScriptExecute(BattleScript_SafeguardEnds); effect++; } } gBattleStruct->turnSideTracker++; if (effect != 0) break; } if (effect == 0) { gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; } break; case ENDTURN_WISH: while (gBattleStruct->turnSideTracker < gBattlersCount) { gActiveBattler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker]; if (gWishFutureKnock.wishCounter[gActiveBattler] != 0 && --gWishFutureKnock.wishCounter[gActiveBattler] == 0 && gBattleMons[gActiveBattler].hp != 0) { gBattlerTarget = gActiveBattler; BattleScriptExecute(BattleScript_WishComesTrue); effect++; } gBattleStruct->turnSideTracker++; if (effect != 0) break; } if (effect == 0) { gBattleStruct->turnCountersTracker++; } break; case ENDTURN_RAIN: if (gBattleWeather & B_WEATHER_RAIN) { if (!(gBattleWeather & B_WEATHER_RAIN_PERMANENT)) { if (--gWishFutureKnock.weatherDuration == 0) { gBattleWeather &= ~B_WEATHER_RAIN_TEMPORARY; gBattleWeather &= ~B_WEATHER_RAIN_DOWNPOUR; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_STOPPED; } else if (gBattleWeather & B_WEATHER_RAIN_DOWNPOUR) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES; } else if (gBattleWeather & B_WEATHER_RAIN_DOWNPOUR) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES; } BattleScriptExecute(BattleScript_RainContinuesOrEnds); effect++; } gBattleStruct->turnCountersTracker++; break; case ENDTURN_SANDSTORM: if (gBattleWeather & B_WEATHER_SANDSTORM) { if (!(gBattleWeather & B_WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) { gBattleWeather &= ~B_WEATHER_SANDSTORM_TEMPORARY; gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; } else { gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; } gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM; BattleScriptExecute(gBattlescriptCurrInstr); effect++; } gBattleStruct->turnCountersTracker++; break; case ENDTURN_SUN: if (gBattleWeather & B_WEATHER_SUN) { if (!(gBattleWeather & B_WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) { gBattleWeather &= ~B_WEATHER_SUN_TEMPORARY; gBattlescriptCurrInstr = BattleScript_SunlightFaded; } else { gBattlescriptCurrInstr = BattleScript_SunlightContinues; } BattleScriptExecute(gBattlescriptCurrInstr); effect++; } gBattleStruct->turnCountersTracker++; break; case ENDTURN_HAIL: if (gBattleWeather & B_WEATHER_HAIL) { if (--gWishFutureKnock.weatherDuration == 0) { gBattleWeather &= ~B_WEATHER_HAIL_TEMPORARY; gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; } else { gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; } gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL; BattleScriptExecute(gBattlescriptCurrInstr); effect++; } gBattleStruct->turnCountersTracker++; break; case ENDTURN_FIELD_COUNT: effect++; break; } } while (effect == 0); return (gBattleMainFunc != BattleTurnPassed); } enum { ENDTURN_INGRAIN, ENDTURN_ABILITIES, ENDTURN_ITEMS1, ENDTURN_LEECH_SEED, ENDTURN_POISON, ENDTURN_BAD_POISON, ENDTURN_BURN, ENDTURN_NIGHTMARES, ENDTURN_CURSE, ENDTURN_WRAP, ENDTURN_UPROAR, ENDTURN_THRASH, ENDTURN_DISABLE, ENDTURN_ENCORE, ENDTURN_LOCK_ON, ENDTURN_CHARGE, ENDTURN_TAUNT, ENDTURN_YAWN, ENDTURN_ITEMS2, ENDTURN_BATTLER_COUNT }; u8 DoBattlerEndTurnEffects(void) { u8 effect = 0; gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) { gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { gBattleStruct->turnEffectsBattlerId++; } else { switch (gBattleStruct->turnEffectsTracker) { case ENDTURN_INGRAIN: // ingrain if ((gStatuses3[gActiveBattler] & STATUS3_ROOTED) && gBattleMons[gActiveBattler].hp != gBattleMons[gActiveBattler].maxHP && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_IngrainTurnHeal); effect++; } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ABILITIES: // end turn abilities if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBattler, 0, 0, 0)) effect++; gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ITEMS1: // item effects if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, FALSE)) effect++; gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ITEMS2: // item effects again if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, TRUE)) effect++; gBattleStruct->turnEffectsTracker++; break; case ENDTURN_LEECH_SEED: // leech seed if ((gStatuses3[gActiveBattler] & STATUS3_LEECHSEED) && gBattleMons[gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER].hp != 0 && gBattleMons[gActiveBattler].hp != 0) { gBattlerTarget = gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleScripting.animArg1 = gBattlerTarget; gBattleScripting.animArg2 = gBattlerAttacker; BattleScriptExecute(BattleScript_LeechSeedTurnDrain); effect++; } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_POISON: // poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_PoisonTurnDmg); effect++; } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_BAD_POISON: // toxic poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns gBattleMons[gActiveBattler].status1 += STATUS1_TOXIC_TURN(1); gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) >> 8; BattleScriptExecute(BattleScript_PoisonTurnDmg); effect++; } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_BURN: // burn if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_BurnTurnDmg); effect++; } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_NIGHTMARES: // spooky nightmares if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBattler].hp != 0) { // R/S does not perform this sleep check, which causes the nightmare effect to // persist even after the affected Pokemon has been awakened by Shed Skin. if (gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_NightmareTurnDmg); effect++; } else { gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; } } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_CURSE: // curse if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_CurseTurnDmg); effect++; } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_WRAP: // wrap if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0) { gBattleMons[gActiveBattler].status2 -= STATUS2_WRAPPED_TURN(1); if (gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) // damaged by wrap { gBattleScripting.animArg1 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0); gBattleScripting.animArg2 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1); gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff1[1] = B_BUFF_MOVE; gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0); gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1); gBattleTextBuff1[4] = EOS; gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } else // broke free { gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff1[1] = B_BUFF_MOVE; gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0); gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1); gBattleTextBuff1[4] = EOS; gBattlescriptCurrInstr = BattleScript_WrapEnds; } BattleScriptExecute(gBattlescriptCurrInstr); effect++; } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_UPROAR: // uproar if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) { for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) { if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) && gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF) { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptExecute(BattleScript_MonWokeUpInUproar); gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } } if (gBattlerAttacker != gBattlersCount) { effect = 2; // a pokemon was awaken break; } else { gBattlerAttacker = gActiveBattler; gBattleMons[gActiveBattler].status2 -= STATUS2_UPROAR_TURN(1); if (WasUnableToUseMove(gActiveBattler)) { CancelMultiTurnMoves(gActiveBattler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; } else if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_CONTINUES; gBattleMons[gActiveBattler].status2 |= STATUS2_MULTIPLETURNS; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; CancelMultiTurnMoves(gActiveBattler); } BattleScriptExecute(BattleScript_PrintUproarOverTurns); effect = 1; } } if (effect != 2) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_THRASH: // thrash if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) { gBattleMons[gActiveBattler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1); if (WasUnableToUseMove(gActiveBattler)) CancelMultiTurnMoves(gActiveBattler); else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) && (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS)) { gBattleMons[gActiveBattler].status2 &= ~STATUS2_MULTIPLETURNS; if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; SetMoveEffect(TRUE, 0); if (gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) BattleScriptExecute(BattleScript_ThrashConfuses); effect++; } } } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_DISABLE: // disable if (gDisableStructs[gActiveBattler].disableTimer != 0) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i]) break; } if (i == MAX_MON_MOVES) // pokemon does not have the disabled move anymore { gDisableStructs[gActiveBattler].disabledMove = MOVE_NONE; gDisableStructs[gActiveBattler].disableTimer = 0; } else if (--gDisableStructs[gActiveBattler].disableTimer == 0) // disable ends { gDisableStructs[gActiveBattler].disabledMove = MOVE_NONE; BattleScriptExecute(BattleScript_DisabledNoMore); effect++; } } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ENCORE: // encore if (gDisableStructs[gActiveBattler].encoreTimer != 0) { if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove) // pokemon does not have the encored move anymore { gDisableStructs[gActiveBattler].encoredMove = MOVE_NONE; gDisableStructs[gActiveBattler].encoreTimer = 0; } else if (--gDisableStructs[gActiveBattler].encoreTimer == 0 || gBattleMons[gActiveBattler].pp[gDisableStructs[gActiveBattler].encoredMovePos] == 0) { gDisableStructs[gActiveBattler].encoredMove = MOVE_NONE; gDisableStructs[gActiveBattler].encoreTimer = 0; BattleScriptExecute(BattleScript_EncoredNoMore); effect++; } } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_LOCK_ON: // lock-on decrement if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS) gStatuses3[gActiveBattler] -= STATUS3_ALWAYS_HITS_TURN(1); gBattleStruct->turnEffectsTracker++; break; case ENDTURN_CHARGE: // charge if (gDisableStructs[gActiveBattler].chargeTimer && --gDisableStructs[gActiveBattler].chargeTimer == 0) gStatuses3[gActiveBattler] &= ~STATUS3_CHARGED_UP; gBattleStruct->turnEffectsTracker++; break; case ENDTURN_TAUNT: // taunt if (gDisableStructs[gActiveBattler].tauntTimer) gDisableStructs[gActiveBattler].tauntTimer--; gBattleStruct->turnEffectsTracker++; break; case ENDTURN_YAWN: // yawn if (gStatuses3[gActiveBattler] & STATUS3_YAWN) { gStatuses3[gActiveBattler] -= STATUS3_YAWN_TURN(1); if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY) && gBattleMons[gActiveBattler].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler)) { CancelMultiTurnMoves(gActiveBattler); gBattleMons[gActiveBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns of sleep BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gEffectBattler = gActiveBattler; BattleScriptExecute(BattleScript_YawnMakesAsleep); effect++; } } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId++; break; } if (effect != 0) return effect; } } gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); return 0; } bool8 HandleWishPerishSongOnTurnEnd(void) { gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); switch (gBattleStruct->wishPerishSongState) { case 0: while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount) { gActiveBattler = gBattleStruct->wishPerishSongBattlerId; if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { gBattleStruct->wishPerishSongBattlerId++; continue; } gBattleStruct->wishPerishSongBattlerId++; if (gWishFutureKnock.futureSightCounter[gActiveBattler] != 0 && --gWishFutureKnock.futureSightCounter[gActiveBattler] == 0 && gBattleMons[gActiveBattler].hp != 0) { if (gWishFutureKnock.futureSightMove[gActiveBattler] == MOVE_FUTURE_SIGHT) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gWishFutureKnock.futureSightMove[gActiveBattler]); gBattlerTarget = gActiveBattler; gBattlerAttacker = gWishFutureKnock.futureSightAttacker[gActiveBattler]; gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBattler]; gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF; BattleScriptExecute(BattleScript_MonTookFutureAttack); return TRUE; } } { u8 *state = &gBattleStruct->wishPerishSongState; *state = 1; gBattleStruct->wishPerishSongBattlerId = 0; } // fall through case 1: while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount) { gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->wishPerishSongBattlerId]; if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { gBattleStruct->wishPerishSongBattlerId++; continue; } gBattleStruct->wishPerishSongBattlerId++; if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG) { PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gActiveBattler].perishSongTimer); if (gDisableStructs[gActiveBattler].perishSongTimer == 0) { gStatuses3[gActiveBattler] &= ~STATUS3_PERISH_SONG; gBattleMoveDamage = gBattleMons[gActiveBattler].hp; gBattlescriptCurrInstr = BattleScript_PerishSongTakesLife; } else { gDisableStructs[gActiveBattler].perishSongTimer--; gBattlescriptCurrInstr = BattleScript_PerishSongCountGoesDown; } BattleScriptExecute(gBattlescriptCurrInstr); return TRUE; } } break; } gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); return FALSE; } #define FAINTED_ACTIONS_MAX_CASE 7 bool8 HandleFaintedMonActions(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) return FALSE; do { s32 i; switch (gBattleStruct->faintedActionsState) { case 0: gBattleStruct->faintedActionsBattlerId = 0; gBattleStruct->faintedActionsState++; for (i = 0; i < gBattlersCount; i++) { if (gAbsentBattlerFlags & gBitTable[i] && !HasNoMonsToSwitch(i, PARTY_SIZE, PARTY_SIZE)) gAbsentBattlerFlags &= ~(gBitTable[i]); } // fall through case 1: do { gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId; if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0 && !(gBattleStruct->givenExpMons & gBitTable[gBattlerPartyIndexes[gBattleStruct->faintedActionsBattlerId]]) && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->faintedActionsBattlerId])) { BattleScriptExecute(BattleScript_GiveExp); gBattleStruct->faintedActionsState = 2; return TRUE; } } while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount); gBattleStruct->faintedActionsState = 3; break; case 2: OpponentSwitchInResetSentPokesToOpponentValue(gBattlerFainted); if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount) gBattleStruct->faintedActionsState = 3; else gBattleStruct->faintedActionsState = 1; break; case 3: gBattleStruct->faintedActionsBattlerId = 0; gBattleStruct->faintedActionsState++; // fall through case 4: do { gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId; if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0 && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->faintedActionsBattlerId])) { BattleScriptExecute(BattleScript_HandleFaintedMon); gBattleStruct->faintedActionsState = 5; return TRUE; } } while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount); gBattleStruct->faintedActionsState = 6; break; case 5: if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount) gBattleStruct->faintedActionsState = 6; else gBattleStruct->faintedActionsState = 4; break; case 6: if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) || ItemBattleEffects(ITEMEFFECT_NORMAL, 0, TRUE) || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0)) return TRUE; gBattleStruct->faintedActionsState++; break; case FAINTED_ACTIONS_MAX_CASE: break; } } while (gBattleStruct->faintedActionsState != FAINTED_ACTIONS_MAX_CASE); return FALSE; } void TryClearRageStatuses(void) { s32 i; for (i = 0; i < gBattlersCount; i++) { if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE) gBattleMons[i].status2 &= ~STATUS2_RAGE; } } enum { CANCELLER_FLAGS, CANCELLER_ASLEEP, CANCELLER_FROZEN, CANCELLER_TRUANT, CANCELLER_RECHARGE, CANCELLER_FLINCH, CANCELLER_DISABLED, CANCELLER_TAUNTED, CANCELLER_IMPRISONED, CANCELLER_CONFUSED, CANCELLER_PARALYSED, CANCELLER_GHOST, CANCELLER_IN_LOVE, CANCELLER_BIDE, CANCELLER_THAW, CANCELLER_END, }; u8 AtkCanceller_UnableToUseMove(void) { u8 effect = 0; s32 *bideDmg = &gBattleScripting.bideDmg; do { switch (gBattleStruct->atkCancellerTracker) { case CANCELLER_FLAGS: // flags clear gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND; gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE; gBattleStruct->atkCancellerTracker++; break; case CANCELLER_ASLEEP: // check being asleep if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { if (UproarWakeUpCheck(gBattlerAttacker)) { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; } else { u8 toSub; if (gBattleMons[gBattlerAttacker].ability == ABILITY_EARLY_BIRD) toSub = 2; else toSub = 1; if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub) gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; else gBattleMons[gBattlerAttacker].status1 -= toSub; if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { if (gCurrentMove != MOVE_SNORE && gCurrentMove != MOVE_SLEEP_TALK) { gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 2; } } else { gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; } } } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_FROZEN: // check being frozen if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { if (Random() % 5) { if (gBattleMoves[gCurrentMove].effect != EFFECT_THAW_HIT) // unfreezing via a move effect happens in case 13 { gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; gHitMarker |= HITMARKER_NO_ATTACKSTRING; } else { gBattleStruct->atkCancellerTracker++; break; } } else // unfreeze { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } effect = 2; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_TRUANT: // truant if (gBattleMons[gBattlerAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) { CancelMultiTurnMoves(gBattlerAttacker); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING; gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; gMoveResultFlags |= MOVE_RESULT_MISSED; effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_RECHARGE: // recharge if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) { gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RECHARGE; gDisableStructs[gBattlerAttacker].rechargeTimer = 0; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_FLINCH: // flinch if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) { gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_FLINCHED; gProtectStructs[gBattlerAttacker].flinchImmobility = 1; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_DISABLED: // disabled move if (gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE) { gProtectStructs[gBattlerAttacker].usedDisabledMove = 1; gBattleScripting.battler = gBattlerAttacker; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_TAUNTED: // taunt if (gDisableStructs[gBattlerAttacker].tauntTimer && gBattleMoves[gCurrentMove].power == 0) { gProtectStructs[gBattlerAttacker].usedTauntedMove = 1; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_IMPRISONED: // imprisoned if (GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) { gProtectStructs[gBattlerAttacker].usedImprisonedMove = 1; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_CONFUSED: // confusion if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1); if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { if (Random() & 1) { // The MULTISTRING_CHOOSER is used here as a bool to signal // to BattleScript_MoveUsedIsConfused whether or not damage was taken gBattleCommunication[MULTISTRING_CHOOSER] = FALSE; BattleScriptPushCursor(); } else // confusion dmg { gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; gBattlerTarget = gBattlerAttacker; gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker); gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; } else // snapped out of confusion { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore; } effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_PARALYSED: // paralysis if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0) { gProtectStructs[gBattlerAttacker].prlzImmobility = 1; // This is removed in FRLG and Emerald for some reason //CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_GHOST: // GHOST in pokemon tower if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) gBattlescriptCurrInstr = BattleScript_TooScaredToMove; else gBattlescriptCurrInstr = BattleScript_GhostGetOutGetOut; gBattleCommunication[MULTISTRING_CHOOSER] = 0; effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_IN_LOVE: // infatuation if (gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) { gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); if (Random() & 1) { BattleScriptPushCursor(); } else { BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gProtectStructs[gBattlerAttacker].loveImmobility = 1; CancelMultiTurnMoves(gBattlerAttacker); } gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_BIDE: // bide if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) { gBattleMons[gBattlerAttacker].status2 -= STATUS2_BIDE_TURN(1); if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) { gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; } else { // This is removed in FRLG and Emerald for some reason //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; if (gTakenDmg[gBattlerAttacker]) { gCurrentMove = MOVE_BIDE; *bideDmg = gTakenDmg[gBattlerAttacker] * 2; gBattlerTarget = gTakenDmgByBattler[gBattlerAttacker]; if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); gBattlescriptCurrInstr = BattleScript_BideAttack; } else { gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; } } effect = 1; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_THAW: // move thawing if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; } effect = 2; } gBattleStruct->atkCancellerTracker++; break; case CANCELLER_END: break; } } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && effect == 0); if (effect == 2) { gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } return effect; } bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2) { u8 playerId, flankId; struct Pokemon *party; s32 i; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { flankId = GetBattlerMultiplayerId(battler); if (GetBattlerSide(battler) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; playerId = GetLinkTrainerFlankId(flankId); for (i = playerId * MULTI_PARTY_SIZE; i < playerId * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG) break; } return (i == playerId * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE); } else { if (GetBattlerSide(battler) == B_SIDE_OPPONENT) { flankId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); playerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); party = gEnemyParty; } else { flankId = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); playerId = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); party = gPlayerParty; } if (partyIdBattlerOn1 == PARTY_SIZE) partyIdBattlerOn1 = gBattlerPartyIndexes[flankId]; if (partyIdBattlerOn2 == PARTY_SIZE) partyIdBattlerOn2 = gBattlerPartyIndexes[playerId]; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG && i != partyIdBattlerOn1 && i != partyIdBattlerOn2 && i != *(gBattleStruct->monToSwitchIntoId + flankId) && i != playerId[gBattleStruct->monToSwitchIntoId]) break; } return (i == PARTY_SIZE); } } enum { CASTFORM_NO_CHANGE, CASTFORM_TO_NORMAL, CASTFORM_TO_FIRE, CASTFORM_TO_WATER, CASTFORM_TO_ICE, }; u8 CastformDataTypeChange(u8 battler) { u8 formChange = 0; if (gBattleMons[battler].species != SPECIES_CASTFORM || gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0) return CASTFORM_NO_CHANGE; if (!WEATHER_HAS_EFFECT && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL)) { SET_BATTLER_TYPE(battler, TYPE_NORMAL); return CASTFORM_TO_NORMAL; } if (!WEATHER_HAS_EFFECT) return CASTFORM_NO_CHANGE; if (!(gBattleWeather & (B_WEATHER_RAIN | B_WEATHER_SUN | B_WEATHER_HAIL)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL)) { SET_BATTLER_TYPE(battler, TYPE_NORMAL); formChange = CASTFORM_TO_NORMAL; } if (gBattleWeather & B_WEATHER_SUN && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE)) { SET_BATTLER_TYPE(battler, TYPE_FIRE); formChange = CASTFORM_TO_FIRE; } if (gBattleWeather & B_WEATHER_RAIN && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER)) { SET_BATTLER_TYPE(battler, TYPE_WATER); formChange = CASTFORM_TO_WATER; } if (gBattleWeather & B_WEATHER_HAIL && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE)) { SET_BATTLER_TYPE(battler, TYPE_ICE); formChange = CASTFORM_TO_ICE; } return formChange; } u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg) { u8 effect = 0; struct Pokemon *pokeAtk; struct Pokemon *pokeDef; u16 speciesAtk; u16 speciesDef; u32 pidAtk; u32 pidDef; if (gBattlerAttacker >= gBattlersCount) gBattlerAttacker = battler; if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) pokeAtk = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]; else pokeAtk = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]]; if (gBattlerTarget >= gBattlersCount) gBattlerTarget = battler; if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) pokeDef = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]; else pokeDef = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]; speciesAtk = GetMonData(pokeAtk, MON_DATA_SPECIES); pidAtk = GetMonData(pokeAtk, MON_DATA_PERSONALITY); speciesDef = GetMonData(pokeDef, MON_DATA_SPECIES); pidDef = GetMonData(pokeDef, MON_DATA_PERSONALITY); if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // Why isn't that check done at the beginning? { u8 moveType; s32 i; u16 move; u8 side; u8 target1; if (special) gLastUsedAbility = special; else gLastUsedAbility = gBattleMons[battler].ability; if (moveArg) move = moveArg; else move = gCurrentMove; GET_MOVE_TYPE(move, moveType); if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags) && (gLastUsedAbility == ABILITY_INTIMIDATE || gLastUsedAbility == ABILITY_TRACE)) return effect; switch (caseID) { case ABILITYEFFECT_ON_SWITCHIN: // 0 if (gBattlerAttacker >= gBattlersCount) gBattlerAttacker = battler; switch (gLastUsedAbility) { case ABILITYEFFECT_SWITCH_IN_WEATHER: switch (GetCurrentWeather()) { case WEATHER_RAIN: case WEATHER_RAIN_THUNDERSTORM: case WEATHER_DOWNPOUR: if (!(gBattleWeather & B_WEATHER_RAIN)) { gBattleWeather = (B_WEATHER_RAIN_TEMPORARY | B_WEATHER_RAIN_PERMANENT); gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; gBattleScripting.battler = battler; effect++; } break; case WEATHER_SANDSTORM: if (!(gBattleWeather & B_WEATHER_SANDSTORM)) { gBattleWeather = B_WEATHER_SANDSTORM; gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; gBattleScripting.battler = battler; effect++; } break; case WEATHER_DROUGHT: if (!(gBattleWeather & B_WEATHER_SUN)) { gBattleWeather = B_WEATHER_SUN; gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; gBattleScripting.battler = battler; effect++; } break; } if (effect != 0) { gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); } break; case ABILITY_DRIZZLE: if (!(gBattleWeather & B_WEATHER_RAIN_PERMANENT)) { gBattleWeather = (B_WEATHER_RAIN_PERMANENT | B_WEATHER_RAIN_TEMPORARY); BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); gBattleScripting.battler = battler; effect++; } break; case ABILITY_SAND_STREAM: if (!(gBattleWeather & B_WEATHER_SANDSTORM_PERMANENT)) { gBattleWeather = B_WEATHER_SANDSTORM; BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); gBattleScripting.battler = battler; effect++; } break; case ABILITY_DROUGHT: if (!(gBattleWeather & B_WEATHER_SUN_PERMANENT)) { gBattleWeather = B_WEATHER_SUN; BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); gBattleScripting.battler = battler; effect++; } break; case ABILITY_INTIMIDATE: if (!(gSpecialStatuses[battler].intimidatedMon)) { gStatuses3[battler] |= STATUS3_INTIMIDATE_POKES; gSpecialStatuses[battler].intimidatedMon = 1; } break; case ABILITY_FORECAST: effect = CastformDataTypeChange(battler); if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); gBattleScripting.battler = battler; *(&gBattleStruct->formToChangeInto) = effect - 1; } break; case ABILITY_TRACE: if (!(gSpecialStatuses[battler].traced)) { gStatuses3[battler] |= STATUS3_TRACE; gSpecialStatuses[battler].traced = 1; } break; case ABILITY_CLOUD_NINE: case ABILITY_AIR_LOCK: { for (target1 = 0; target1 < gBattlersCount; target1++) { effect = CastformDataTypeChange(target1); if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); gBattleScripting.battler = target1; *(&gBattleStruct->formToChangeInto) = effect - 1; break; } } } break; } break; case ABILITYEFFECT_ENDTURN: // 1 if (gBattleMons[battler].hp != 0) { gBattlerAttacker = battler; switch (gLastUsedAbility) { case ABILITY_RAIN_DISH: if (WEATHER_HAS_EFFECT && (gBattleWeather & B_WEATHER_RAIN) && gBattleMons[battler].maxHP > gBattleMons[battler].hp) { gLastUsedAbility = ABILITY_RAIN_DISH; // why BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); gBattleMoveDamage = gBattleMons[battler].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; effect++; } break; case ABILITY_SHED_SKIN: if ((gBattleMons[battler].status1 & STATUS1_ANY) && (Random() % 3) == 0) { if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON)) StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); if (gBattleMons[battler].status1 & STATUS1_SLEEP) StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); if (gBattleMons[battler].status1 & STATUS1_BURN) StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); if (gBattleMons[battler].status1 & STATUS1_FREEZE) StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); gBattleMons[battler].status1 = 0; gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; // fix nightmare glitch gBattleScripting.battler = gActiveBattler = battler; BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(gActiveBattler); effect++; } break; case ABILITY_SPEED_BOOST: if (gBattleMons[battler].statStages[STAT_SPEED] < MAX_STAT_STAGE && gDisableStructs[battler].isFirstTurn != 2) { gBattleMons[battler].statStages[STAT_SPEED]++; gBattleScripting.animArg1 = 14 + STAT_SPEED; gBattleScripting.animArg2 = 0; BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); gBattleScripting.battler = battler; effect++; } break; case ABILITY_TRUANT: gDisableStructs[gBattlerAttacker].truantCounter ^= 1; break; } } break; case ABILITYEFFECT_MOVES_BLOCK: // 2 if (gLastUsedAbility == ABILITY_SOUNDPROOF) { for (i = 0; sSoundMovesTable[i] != SOUND_MOVES_END; i++) { if (sSoundMovesTable[i] == move) break; } if (sSoundMovesTable[i] != SOUND_MOVES_END) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) gHitMarker |= HITMARKER_NO_PPDEDUCT; gBattlescriptCurrInstr = BattleScript_SoundproofProtected; effect = 1; } } break; case ABILITYEFFECT_ABSORBING: // 3 if (move) { switch (gLastUsedAbility) { case ABILITY_VOLT_ABSORB: if (moveType == TYPE_ELECTRIC && gBattleMoves[move].power != 0) { if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_MoveHPDrain; else gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; effect = 1; } break; case ABILITY_WATER_ABSORB: if (moveType == TYPE_WATER && gBattleMoves[move].power != 0) { if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_MoveHPDrain; else gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; effect = 1; } break; case ABILITY_FLASH_FIRE: if (moveType == TYPE_FIRE && !(gBattleMons[battler].status1 & STATUS1_FREEZE)) { if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_FlashFireBoost; else gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_FLASH_FIRE; effect = 2; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_FlashFireBoost; else gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; effect = 2; } } break; } if (effect == 1) { if (gBattleMons[battler].maxHP == gBattleMons[battler].hp) { if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; else gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss; } else { gBattleMoveDamage = gBattleMons[battler].maxHP / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; } } } break; case ABILITYEFFECT_ON_DAMAGE: // Think contact abilities. switch (gLastUsedAbility) { case ABILITY_COLOR_CHANGE: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && move != MOVE_STRUGGLE && gBattleMoves[move].power != 0 && TARGET_TURN_DAMAGED && !IS_BATTLER_OF_TYPE(battler, moveType) && gBattleMons[battler].hp != 0) { SET_BATTLER_TYPE(battler, moveType); PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; effect++; } break; case ABILITY_ROUGH_SKIN: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; effect++; } break; case ABILITY_EFFECT_SPORE: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 10) == 0) { do { gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN) gBattleCommunication[MOVE_EFFECT_BYTE] += 2; // 5 MOVE_EFFECT_PARALYSIS gBattleCommunication[MOVE_EFFECT_BYTE] += MOVE_EFFECT_AFFECTS_USER; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; case ABILITY_POISON_POINT: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; case ABILITY_STATIC: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; case ABILITY_FLAME_BODY: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && TARGET_TURN_DAMAGED && (Random() % 3) == 0) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; case ABILITY_CUTE_CHARM: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && TARGET_TURN_DAMAGED && gBattleMons[gBattlerTarget].hp != 0 && (Random() % 3) == 0 && gBattleMons[gBattlerAttacker].ability != ABILITY_OBLIVIOUS && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != MON_GENDERLESS && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != MON_GENDERLESS) { gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; effect++; } break; } break; case ABILITYEFFECT_IMMUNITY: // 5 for (battler = 0; battler < gBattlersCount; battler++) { switch (gBattleMons[battler].ability) { case ABILITY_IMMUNITY: if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER)) { StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); effect = 1; } break; case ABILITY_OWN_TEMPO: if (gBattleMons[battler].status2 & STATUS2_CONFUSION) { StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); effect = 2; } break; case ABILITY_LIMBER: if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) { StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); effect = 1; } break; case ABILITY_INSOMNIA: case ABILITY_VITAL_SPIRIT: if (gBattleMons[battler].status1 & STATUS1_SLEEP) { gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); effect = 1; } break; case ABILITY_WATER_VEIL: if (gBattleMons[battler].status1 & STATUS1_BURN) { StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); effect = 1; } break; case ABILITY_MAGMA_ARMOR: if (gBattleMons[battler].status1 & STATUS1_FREEZE) { StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); effect = 1; } break; case ABILITY_OBLIVIOUS: if (gBattleMons[battler].status2 & STATUS2_INFATUATION) { StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); effect = 3; } break; } if (effect != 0) { switch (effect) { case 1: // status cleared gBattleMons[battler].status1 = 0; break; case 2: // get rid of confusion gBattleMons[battler].status2 &= ~STATUS2_CONFUSION; break; case 3: // get rid of infatuation gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; break; } BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; gBattleScripting.battler = battler; gActiveBattler = battler; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); return effect; } } break; case ABILITYEFFECT_FORECAST: // 6 for (battler = 0; battler < gBattlersCount; battler++) { if (gBattleMons[battler].ability == ABILITY_FORECAST) { effect = CastformDataTypeChange(battler); if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); gBattleScripting.battler = battler; *(&gBattleStruct->formToChangeInto) = effect - 1; return effect; } } } break; case ABILITYEFFECT_SYNCHRONIZE: // 7 if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) { gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT; gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; gBattleScripting.battler = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8 if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) { gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT; gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect; gBattleScripting.battler = gBattlerAttacker; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; case ABILITYEFFECT_INTIMIDATE1: // 9 for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES) { gLastUsedAbility = ABILITY_INTIMIDATE; gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES; BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3); gBattleStruct->intimidateBattler = i; effect++; break; } } break; case ABILITYEFFECT_TRACE: // 11 for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) { u8 target2; side = (GetBattlerPosition(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon target1 = GetBattlerAtPosition(side); target2 = GetBattlerAtPosition(side + BIT_FLANK); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (gBattleMons[target1].ability != ABILITY_NONE && gBattleMons[target1].hp != 0 && gBattleMons[target2].ability != ABILITY_NONE && gBattleMons[target2].hp != 0) { gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side); gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; gLastUsedAbility = gBattleMons[gActiveBattler].ability; effect++; } else if (gBattleMons[target1].ability != ABILITY_NONE && gBattleMons[target1].hp != 0) { gActiveBattler = target1; gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; gLastUsedAbility = gBattleMons[gActiveBattler].ability; effect++; } else if (gBattleMons[target2].ability != ABILITY_NONE && gBattleMons[target2].hp != 0) { gActiveBattler = target2; gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; gLastUsedAbility = gBattleMons[gActiveBattler].ability; effect++; } } else { gActiveBattler = target1; if (gBattleMons[target1].ability && gBattleMons[target1].hp) { gBattleMons[i].ability = gBattleMons[target1].ability; gLastUsedAbility = gBattleMons[target1].ability; effect++; } } if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); gStatuses3[i] &= ~STATUS3_TRACE; gBattleScripting.battler = i; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) break; } } } break; case ABILITYEFFECT_INTIMIDATE2: // 10 for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES)) { gLastUsedAbility = ABILITY_INTIMIDATE; gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_IntimidateActivates; gBattleStruct->intimidateBattler = i; effect++; break; } } break; case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12 side = GetBattlerSide(battler); for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) { gLastUsedAbility = ability; effect = i + 1; } } break; case ABILITYEFFECT_CHECK_BATTLER_SIDE: // 13 side = GetBattlerSide(battler); for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability) { gLastUsedAbility = ability; effect = i + 1; } } break; case ABILITYEFFECT_FIELD_SPORT: // 14 switch (gLastUsedAbility) { case ABILITYEFFECT_MUD_SPORT: for (i = 0; i < gBattlersCount; i++) { if (gStatuses3[i] & STATUS3_MUDSPORT) effect = i + 1; } break; case ABILITYEFFECT_WATER_SPORT: for (i = 0; i < gBattlersCount; i++) { if (gStatuses3[i] & STATUS3_WATERSPORT) effect = i + 1; } break; default: for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ability) { gLastUsedAbility = ability; effect = i + 1; } } break; } break; case ABILITYEFFECT_CHECK_ON_FIELD: // 19 for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0) { gLastUsedAbility = ability; effect = i + 1; } } break; case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER: // 15 side = GetBattlerSide(battler); for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) { gLastUsedAbility = ability; effect = i + 1; break; } } if (effect == 0) { for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ability && GetBattlerSide(i) == side && i != battler) { gLastUsedAbility = ability; effect = i + 1; } } } break; case ABILITYEFFECT_COUNT_OTHER_SIDE: // 16 side = GetBattlerSide(battler); for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) { gLastUsedAbility = ability; effect++; } } break; case ABILITYEFFECT_COUNT_BATTLER_SIDE: // 17 side = GetBattlerSide(battler); for (i = 0; i < gBattlersCount; i++) { if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability) { gLastUsedAbility = ability; effect++; } } break; case ABILITYEFFECT_COUNT_ON_FIELD: // 18 for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ability && i != battler) { gLastUsedAbility = ability; effect++; } } break; } if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF) RecordAbilityBattle(battler, gLastUsedAbility); } return effect; } void BattleScriptExecute(const u8 *BS_ptr) { gBattlescriptCurrInstr = BS_ptr; gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size++] = gBattleMainFunc; gBattleMainFunc = RunBattleScriptCommands_PopCallbacksStack; gCurrentActionFuncId = 0; } void BattleScriptPushCursorAndCallback(const u8 *BS_ptr) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BS_ptr; gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size++] = gBattleMainFunc; gBattleMainFunc = RunBattleScriptCommands; } enum { ITEM_NO_EFFECT, ITEM_STATUS_CHANGE, ITEM_EFFECT_OTHER, ITEM_PP_CHANGE, ITEM_HP_CHANGE, ITEM_STATS_CHANGE, }; #define TRY_EAT_CONFUSE_BERRY(flavor) \ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) \ { \ PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavor); \ gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; \ if (gBattleMoveDamage == 0) \ gBattleMoveDamage = 1; \ if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) \ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; \ gBattleMoveDamage *= -1; \ if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavor) < 0) \ BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); \ else \ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); \ effect = ITEM_HP_CHANGE; \ } #define TRY_EAT_STAT_UP_BERRY(stat) \ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam \ && !moveTurn && gBattleMons[battlerId].statStages[stat] < MAX_STAT_STAGE) \ { \ PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); \ gEffectBattler = battlerId; \ SET_STATCHANGER(stat, 1, FALSE); \ gBattleScripting.animArg1 = 14 + (stat); \ gBattleScripting.animArg2 = 0; \ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); \ effect = ITEM_STATS_CHANGE; \ } u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { int i = 0; u8 effect = ITEM_NO_EFFECT; u8 changedPP = 0; u8 battlerHoldEffect, atkHoldEffect, defHoldEffect; u8 battlerHoldEffectParam, atkHoldEffectParam, defHoldEffectParam; u16 atkItem, defItem; gLastUsedItem = gBattleMons[battlerId].item; if (gLastUsedItem == ITEM_ENIGMA_BERRY) { battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam; } else { battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem); } atkItem = gBattleMons[gBattlerAttacker].item; if (atkItem == ITEM_ENIGMA_BERRY) { atkHoldEffect = gEnigmaBerries[gBattlerAttacker].holdEffect; atkHoldEffectParam = gEnigmaBerries[gBattlerAttacker].holdEffectParam; } else { atkHoldEffect = ItemId_GetHoldEffect(atkItem); atkHoldEffectParam = ItemId_GetHoldEffectParam(atkItem); } // def variables are unused defItem = gBattleMons[gBattlerTarget].item; if (defItem == ITEM_ENIGMA_BERRY) { defHoldEffect = gEnigmaBerries[gBattlerTarget].holdEffect; defHoldEffectParam = gEnigmaBerries[gBattlerTarget].holdEffectParam; } else { defHoldEffect = ItemId_GetHoldEffect(defItem); defHoldEffectParam = ItemId_GetHoldEffectParam(defItem); } switch (caseID) { case ITEMEFFECT_ON_SWITCH_IN: switch (battlerHoldEffect) { case HOLD_EFFECT_DOUBLE_PRIZE: gBattleStruct->moneyMultiplier = 2; break; case HOLD_EFFECT_RESTORE_STATS: for (i = 0; i < NUM_BATTLE_STATS; i++) { if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) { gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; effect = ITEM_STATS_CHANGE; } } if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; gActiveBattler = gBattlerAttacker = battlerId; BattleScriptExecute(BattleScript_WhiteHerbEnd2); } break; } break; case ITEMEFFECT_NORMAL: if (gBattleMons[battlerId].hp) { switch (battlerHoldEffect) { case HOLD_EFFECT_RESTORE_HP: if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) { gBattleMoveDamage = battlerHoldEffectParam; if (gBattleMons[battlerId].hp + battlerHoldEffectParam > gBattleMons[battlerId].maxHP) gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; } break; case HOLD_EFFECT_RESTORE_PP: if (!moveTurn) { struct Pokemon *mon; u8 ppBonuses; u16 move; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; else mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; for (i = 0; i < MAX_MON_MOVES; i++) { move = GetMonData(mon, MON_DATA_MOVE1 + i); changedPP = GetMonData(mon, MON_DATA_PP1 + i); ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); if (move && changedPP == 0) break; } if (i != MAX_MON_MOVES) { u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); if (changedPP + battlerHoldEffectParam > maxPP) changedPP = maxPP; else changedPP = changedPP + battlerHoldEffectParam; PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); BattleScriptExecute(BattleScript_BerryPPHealEnd2); BtlController_EmitSetMonData(BUFFER_A, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); MarkBattlerForControllerExec(gActiveBattler); effect = ITEM_PP_CHANGE; } } break; case HOLD_EFFECT_RESTORE_STATS: for (i = 0; i < NUM_BATTLE_STATS; i++) { if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) { gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; effect = ITEM_STATS_CHANGE; } } if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; gActiveBattler = gBattlerAttacker = battlerId; BattleScriptExecute(BattleScript_WhiteHerbEnd2); } break; case HOLD_EFFECT_LEFTOVERS: if (gBattleMons[battlerId].hp < gBattleMons[battlerId].maxHP && !moveTurn) { gBattleMoveDamage = gBattleMons[battlerId].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_ItemHealHP_End2); effect = ITEM_HP_CHANGE; RecordItemEffectBattle(battlerId, battlerHoldEffect); } break; case HOLD_EFFECT_CONFUSE_SPICY: TRY_EAT_CONFUSE_BERRY(FLAVOR_SPICY); break; case HOLD_EFFECT_CONFUSE_DRY: TRY_EAT_CONFUSE_BERRY(FLAVOR_DRY); break; case HOLD_EFFECT_CONFUSE_SWEET: TRY_EAT_CONFUSE_BERRY(FLAVOR_SWEET); break; case HOLD_EFFECT_CONFUSE_BITTER: TRY_EAT_CONFUSE_BERRY(FLAVOR_BITTER); break; case HOLD_EFFECT_CONFUSE_SOUR: TRY_EAT_CONFUSE_BERRY(FLAVOR_SOUR); break; case HOLD_EFFECT_ATTACK_UP: if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < MAX_STAT_STAGE) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); // Only the Attack stat-up berry has this gEffectBattler = battlerId; SET_STATCHANGER(STAT_ATK, 1, FALSE); gBattleScripting.animArg1 = 14 + STAT_ATK; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } break; case HOLD_EFFECT_DEFENSE_UP: TRY_EAT_STAT_UP_BERRY(STAT_DEF); break; case HOLD_EFFECT_SPEED_UP: TRY_EAT_STAT_UP_BERRY(STAT_SPEED); break; case HOLD_EFFECT_SP_ATTACK_UP: TRY_EAT_STAT_UP_BERRY(STAT_SPATK); break; case HOLD_EFFECT_SP_DEFENSE_UP: TRY_EAT_STAT_UP_BERRY(STAT_SPDEF); break; case HOLD_EFFECT_CRITICAL_UP: if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY)) { gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY; BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); effect = ITEM_EFFECT_OTHER; } break; case HOLD_EFFECT_RANDOM_STAT_UP: if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam) { for (i = 0; i < NUM_STATS - 1; i++) { if (gBattleMons[battlerId].statStages[STAT_ATK + i] < MAX_STAT_STAGE) break; } if (i != NUM_STATS - 1) { do { i = Random() % (NUM_STATS - 1); } while (gBattleMons[battlerId].statStages[STAT_ATK + i] == MAX_STAT_STAGE); PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1); gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff2[1] = B_BUFF_STRING; gBattleTextBuff2[2] = STRINGID_STATSHARPLY; gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; gBattleTextBuff2[4] = B_BUFF_STRING; gBattleTextBuff2[5] = STRINGID_STATROSE; gBattleTextBuff2[6] = STRINGID_STATROSE >> 8; gBattleTextBuff2[7] = EOS; gEffectBattler = battlerId; SET_STATCHANGER(i + 1, 2, FALSE); gBattleScripting.animArg1 = 0x21 + i + 6; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } } break; case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) { gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS; BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_PSN: if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) { gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); BattleScriptExecute(BattleScript_BerryCurePsnEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_BRN: if (gBattleMons[battlerId].status1 & STATUS1_BURN) { gBattleMons[battlerId].status1 &= ~STATUS1_BURN; BattleScriptExecute(BattleScript_BerryCureBrnEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_FRZ: if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) { gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE; BattleScriptExecute(BattleScript_BerryCureFrzEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_SLP: if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) { gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP; gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; BattleScriptExecute(BattleScript_BerryCureSlpEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_CONFUSION: if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) { gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); effect = ITEM_EFFECT_OTHER; } break; case HOLD_EFFECT_CURE_STATUS: if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) { i = 0; if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) { StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); i++; } if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) { gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); i++; } if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) { StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); i++; } if (gBattleMons[battlerId].status1 & STATUS1_BURN) { StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); i++; } if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) { StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); i++; } if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) { StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); i++; } if (i <= 1) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS; gBattleMons[battlerId].status1 = 0; gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_ATTRACT: if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION) { gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION; StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; effect = ITEM_EFFECT_OTHER; } break; } if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; gActiveBattler = gBattlerAttacker = battlerId; switch (effect) { case ITEM_STATUS_CHANGE: BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); MarkBattlerForControllerExec(gActiveBattler); break; case ITEM_PP_CHANGE: if (MOVE_IS_PERMANENT(battlerId, i)) gBattleMons[battlerId].pp[i] = changedPP; break; } } } break; case ITEMEFFECT_DUMMY: break; case ITEMEFFECT_MOVE_END: for (battlerId = 0; battlerId < gBattlersCount; battlerId++) { gLastUsedItem = gBattleMons[battlerId].item; if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) { battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam; } else { battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem); } switch (battlerHoldEffect) { case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) { gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureParRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_PSN: if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) { gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_BRN: if (gBattleMons[battlerId].status1 & STATUS1_BURN) { gBattleMons[battlerId].status1 &= ~STATUS1_BURN; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_FRZ: if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) { gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_SLP: if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) { gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP; gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_CONFUSION: if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) { gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet; effect = ITEM_EFFECT_OTHER; } break; case HOLD_EFFECT_CURE_ATTRACT: if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION) { gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION; StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; effect = ITEM_EFFECT_OTHER; } break; case HOLD_EFFECT_CURE_STATUS: if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) { if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) { gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); } if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); if (gBattleMons[battlerId].status1 & STATUS1_BURN) StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); gBattleMons[battlerId].status1 = 0; gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_RESTORE_STATS: for (i = 0; i < NUM_BATTLE_STATS; i++) { if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) { gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; effect = ITEM_STATS_CHANGE; } } if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; return effect; } break; } if (effect != 0) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; gActiveBattler = battlerId; BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } } break; case ITEMEFFECT_KINGSROCK_SHELLBELL: if (gBattleMoveDamage) { switch (atkHoldEffect) { case HOLD_EFFECT_FLINCH: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && TARGET_TURN_DAMAGED && (Random() % 100) < battlerHoldEffectParam && gBattleMoves[gCurrentMove].flags & FLAG_KINGS_ROCK_AFFECTED && gBattleMons[gBattlerTarget].hp) { gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH; BattleScriptPushCursor(); SetMoveEffect(FALSE, 0); BattleScriptPop(); } break; case HOLD_EFFECT_SHELL_BELL: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gSpecialStatuses[gBattlerTarget].dmg != 0 && gSpecialStatuses[gBattlerTarget].dmg != 0xFFFF && gBattlerAttacker != gBattlerTarget && gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP && gBattleMons[gBattlerAttacker].hp != 0) { gLastUsedItem = atkItem; gPotentialItemEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerAttacker; gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].dmg / atkHoldEffectParam) * -1; if (gBattleMoveDamage == 0) gBattleMoveDamage = -1; gSpecialStatuses[gBattlerTarget].dmg = 0; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; effect++; } break; } } break; } return effect; } void ClearFuryCutterDestinyBondGrudge(u8 battlerId) { gDisableStructs[battlerId].furyCutterCounter = 0; gBattleMons[battlerId].status2 &= ~STATUS2_DESTINY_BOND; gStatuses3[battlerId] &= ~STATUS3_GRUDGE; } void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands { if (gBattleControllerExecFlags == 0) gBattleScriptingCommandsTable[*gBattlescriptCurrInstr](); } u8 GetMoveTarget(u16 move, u8 setTarget) { u8 targetBattler = 0; u8 moveTarget; u8 side; if (setTarget != NO_TARGET_OVERRIDE) moveTarget = setTarget - 1; else moveTarget = gBattleMoves[move].target; switch (moveTarget) { case MOVE_TARGET_SELECTED: side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) targetBattler = gSideTimers[side].followmeTarget; else { side = GetBattlerSide(gBattlerAttacker); do { targetBattler = Random() % gBattlersCount; } while (targetBattler == gBattlerAttacker || side == GetBattlerSide(targetBattler) || gAbsentBattlerFlags & gBitTable[targetBattler]); if (gBattleMoves[move].type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_LIGHTNING_ROD, 0, 0) && gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD) { targetBattler ^= BIT_FLANK; RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); gSpecialStatuses[targetBattler].lightningRodRedirected = 1; } } break; case MOVE_TARGET_DEPENDS: case MOVE_TARGET_BOTH: case MOVE_TARGET_FOES_AND_ALLY: case MOVE_TARGET_OPPONENTS_FIELD: targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE); if (gAbsentBattlerFlags & gBitTable[targetBattler]) targetBattler ^= BIT_FLANK; break; case MOVE_TARGET_RANDOM: side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) targetBattler = gSideTimers[side].followmeTarget; else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & MOVE_TARGET_RANDOM) { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) { if (Random() & 1) targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); else targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } else { if (Random() & 1) targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); else targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } if (gAbsentBattlerFlags & gBitTable[targetBattler]) targetBattler ^= BIT_FLANK; } else targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE); break; case MOVE_TARGET_USER_OR_SELECTED: case MOVE_TARGET_USER: targetBattler = gBattlerAttacker; break; } *(gBattleStruct->moveTarget + gBattlerAttacker) = targetBattler; return targetBattler; } static bool32 IsBattlerModernFatefulEncounter(u8 battlerId) { /*if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) return TRUE; if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_MEW) return TRUE; return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MODERN_FATEFUL_ENCOUNTER, NULL);*/ return TRUE; } u8 IsMonDisobedient(void) { s32 rnd; s32 calc; u8 obedienceLevel = 0; if ((gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_POKEDUDE))) return 0; if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT) return 0; if (IsBattlerModernFatefulEncounter(gBattlerAttacker)) // only false if illegal Mew or Deoxys { if (!IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName)) return 0; if (FlagGet(FLAG_BADGE08_GET)) return 0; obedienceLevel = 10; if (FlagGet(FLAG_BADGE02_GET)) obedienceLevel = 30; if (FlagGet(FLAG_BADGE04_GET)) obedienceLevel = 50; if (FlagGet(FLAG_BADGE06_GET)) obedienceLevel = 70; } if (gBattleMons[gBattlerAttacker].level <= obedienceLevel) return 0; rnd = (Random() & 255); calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8; if (calc < obedienceLevel) return 0; // is not obedient if (gCurrentMove == MOVE_RAGE) gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE; if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK)) { gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; return 1; } rnd = (Random() & 255); calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8; if (calc < obedienceLevel && gCurrentMove != MOVE_FOCUS_PUNCH) // Additional check for focus punch in FR { calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], MOVE_LIMITATIONS_ALL); if (calc == 0xF) // all moves cannot be used { // Randomly select, then print a disobedient string // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE gBattleCommunication[MULTISTRING_CHOOSER] = Random() & (NUM_LOAF_STRINGS - 1); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; return 1; } else // use a random move { do { gCurrMovePos = gChosenMovePos = Random() & (MAX_MON_MOVES - 1); } while (gBitTable[gCurrMovePos] & calc); gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gHitMarker |= HITMARKER_DISOBEDIENT_MOVE; return 2; } } else { obedienceLevel = gBattleMons[gBattlerAttacker].level - obedienceLevel; calc = (Random() & 255); if (calc < obedienceLevel && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && gBattleMons[gBattlerAttacker].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gBattlerAttacker].ability != ABILITY_INSOMNIA) { // try putting asleep int i; for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].status2 & STATUS2_UPROAR) break; } if (i == gBattlersCount) { gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; return 1; } } calc -= obedienceLevel; if (calc < obedienceLevel) { gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker); gBattlerTarget = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return 2; } else { // Randomly select, then print a disobedient string // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE gBattleCommunication[MULTISTRING_CHOOSER] = Random() & (NUM_LOAF_STRINGS - 1); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; return 1; } } } ================================================ FILE: src/battle_util2.c ================================================ #include "global.h" #include "bg.h" #include "battle.h" #include "battle_anim.h" #include "malloc.h" #include "pokemon.h" #include "trainer_tower.h" void AllocateBattleResources(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) InitTrainerTowerBattleStruct(); if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) { s32 i; for (i = 0; i < 4; i++) gPokedudeBattlerStates[i] = AllocZeroed(sizeof(struct PokedudeBattlerState)); } gBattleStruct = AllocZeroed(sizeof(*gBattleStruct)); gBattleResources = AllocZeroed(sizeof(*gBattleResources)); gBattleResources->secretBase = AllocZeroed(sizeof(*gBattleResources->secretBase)); gBattleResources->flags = AllocZeroed(sizeof(*gBattleResources->flags)); gBattleResources->battleScriptsStack = AllocZeroed(sizeof(*gBattleResources->battleScriptsStack)); gBattleResources->battleCallbackStack = AllocZeroed(sizeof(*gBattleResources->battleCallbackStack)); gBattleResources->beforeLvlUp = AllocZeroed(sizeof(*gBattleResources->beforeLvlUp)); gBattleResources->ai = AllocZeroed(sizeof(*gBattleResources->ai)); gBattleResources->battleHistory = AllocZeroed(sizeof(*gBattleResources->battleHistory)); gBattleResources->AI_ScriptsStack = AllocZeroed(sizeof(*gBattleResources->AI_ScriptsStack)); gLinkBattleSendBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE); gLinkBattleRecvBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE); gBattleAnimBgTileBuffer = AllocZeroed(0x2000); gBattleAnimBgTilemapBuffer = AllocZeroed(0x1000); SetBgTilemapBuffer(1, gBattleAnimBgTilemapBuffer); SetBgTilemapBuffer(2, gBattleAnimBgTilemapBuffer); } void FreeBattleResources(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) FreeTrainerTowerBattleStruct(); if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) { s32 i; for (i = 0; i < 4; i++) { FREE_AND_SET_NULL(gPokedudeBattlerStates[i]); } } if (gBattleResources != NULL) { FREE_AND_SET_NULL(gBattleStruct); FREE_AND_SET_NULL(gBattleResources->secretBase); FREE_AND_SET_NULL(gBattleResources->flags); FREE_AND_SET_NULL(gBattleResources->battleScriptsStack); FREE_AND_SET_NULL(gBattleResources->battleCallbackStack); FREE_AND_SET_NULL(gBattleResources->beforeLvlUp); FREE_AND_SET_NULL(gBattleResources->ai); FREE_AND_SET_NULL(gBattleResources->battleHistory); FREE_AND_SET_NULL(gBattleResources->AI_ScriptsStack); FREE_AND_SET_NULL(gBattleResources); FREE_AND_SET_NULL(gLinkBattleSendBuffer); FREE_AND_SET_NULL(gLinkBattleRecvBuffer); FREE_AND_SET_NULL(gBattleAnimBgTileBuffer); FREE_AND_SET_NULL(gBattleAnimBgTilemapBuffer); } } void AdjustFriendshipOnBattleFaint(u8 battlerId) { u8 opposingBattlerId; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { u8 opposingBattlerId2; opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); opposingBattlerId2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); if (gBattleMons[opposingBattlerId2].level > gBattleMons[opposingBattlerId].level) opposingBattlerId = opposingBattlerId2; } else { opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); } if (gBattleMons[opposingBattlerId].level > gBattleMons[battlerId].level) { if (gBattleMons[opposingBattlerId].level - gBattleMons[battlerId].level > 29) AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_LARGE); else AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL); } else { AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL); } } ================================================ FILE: src/berry.c ================================================ #include "global.h" #include "berry.h" #include "text.h" #include "constants/items.h" static const u8 sBerryDescriptionPart1_Cheri[] = _("とても かわいい はなが さく."); static const u8 sBerryDescriptionPart2_Cheri[] = _("まっかな みは とても からい."); static const u8 sBerryDescriptionPart1_Chesto[] = _("そとの かわの ぶぶんも なかみも すべてが"); static const u8 sBerryDescriptionPart2_Chesto[] = _("かたい. どこを たべても しぶい."); static const u8 sBerryDescriptionPart1_Pecha[] = _("とても あまくて おいしい."); static const u8 sBerryDescriptionPart2_Pecha[] = _("やわらかいので はこぶときは ちゅうい."); static const u8 sBerryDescriptionPart1_Rawst[] = _("はっぱの ぶぶんが ながく まるまっていると"); static const u8 sBerryDescriptionPart2_Rawst[] = _("みが とても にがく なるらしい."); static const u8 sBerryDescriptionPart1_Aspear[] = _("かたい みの なかには すいぶんが とても"); static const u8 sBerryDescriptionPart2_Aspear[] = _("おおく ふくまれている. かなり すっぱい."); static const u8 sBerryDescriptionPart1_Leppa[] = _("クラボなどに くらべて すこし そだつのが"); static const u8 sBerryDescriptionPart2_Leppa[] = _("おそい. みが ちいさいほど おいしい."); static const u8 sBerryDescriptionPart1_Oran[] = _("いろいろな あじが まざった ふしぎな み."); static const u8 sBerryDescriptionPart2_Oran[] = _("みを つけるのに はんにち かかる."); static const u8 sBerryDescriptionPart1_Persim[] = _("たいようが だいすき. ひに あたると"); static const u8 sBerryDescriptionPart2_Persim[] = _("どんどん いろが あざやかに なる."); static const u8 sBerryDescriptionPart1_Lum[] = _("そだつのに じかんが かかるが たいせつに"); static const u8 sBerryDescriptionPart2_Lum[] = _("そだてると みが 2つ つくことも ある."); static const u8 sBerryDescriptionPart1_Sitrus[] = _("オレンとは きょうだいの ような そんざい."); static const u8 sBerryDescriptionPart2_Sitrus[] = _("おおきくて あじも ととのっている."); static const u8 sBerryDescriptionPart1_Figy[] = _("たべられた あとのような かたちの なかには"); static const u8 sBerryDescriptionPart2_Figy[] = _("からい せいぶんが つまっている."); static const u8 sBerryDescriptionPart1_Wiki[] = _("まわりに ついている イボイボは ポケモンが"); static const u8 sBerryDescriptionPart2_Wiki[] = _("もちやすいように できたと いわれている."); static const u8 sBerryDescriptionPart1_Mago[] = _("おおきく なれば なるほど みが まがる."); static const u8 sBerryDescriptionPart2_Mago[] = _("まがるほど あまくて おいしい."); static const u8 sBerryDescriptionPart1_Aguav[] = _("ちいさい サイズの はなで しかも ひかりを"); static const u8 sBerryDescriptionPart2_Aguav[] = _("ひつようと しない めずらしい きのみ."); static const u8 sBerryDescriptionPart1_Iapapa[] = _("とても おおきな すっぱい きのみ."); static const u8 sBerryDescriptionPart2_Iapapa[] = _("そだてるには みじかくても 1にち かかる."); static const u8 sBerryDescriptionPart1_Razz[] = _("あかい みは たべると ちょっぴり からい."); static const u8 sBerryDescriptionPart2_Razz[] = _("そだつのが はやく 4じかんで みを つける"); static const u8 sBerryDescriptionPart1_Bluk[] = _("そとがわは あおいいろだが たべると"); static const u8 sBerryDescriptionPart2_Bluk[] = _("くちの なかが まっくろに なる."); static const u8 sBerryDescriptionPart1_Nanab[] = _("せかいで 7ばんめに はっけん されたので"); static const u8 sBerryDescriptionPart2_Nanab[] = _("ナナという せつが ゆうりょく. あまい."); static const u8 sBerryDescriptionPart1_Wepear[] = _("ちいさな しろい はなが さく. にがさと"); static const u8 sBerryDescriptionPart2_Wepear[] = _("すっぱさが まざりあった びみょうな あじ."); static const u8 sBerryDescriptionPart1_Pinap[] = _("かぜに よわく さむさにも よわい."); static const u8 sBerryDescriptionPart2_Pinap[] = _("みの なかが からく そとがわが すっぱい."); static const u8 sBerryDescriptionPart1_Pomeg[] = _("どんなに みずを あげても えいようが"); static const u8 sBerryDescriptionPart2_Pomeg[] = _("あっても 6つの み しか つけない."); static const u8 sBerryDescriptionPart1_Kelpsy[] = _("ねっこの ような かたちの めずらしい"); static const u8 sBerryDescriptionPart2_Kelpsy[] = _("しゅるい. とても おおきな はなが さく."); static const u8 sBerryDescriptionPart1_Qualot[] = _("みずが だいすき. ずっと あめが ふる"); static const u8 sBerryDescriptionPart2_Qualot[] = _("ばしょでも しっかりと そだつ."); static const u8 sBerryDescriptionPart1_Hondew[] = _("とても こうかで なかなか めに することが"); static const u8 sBerryDescriptionPart2_Hondew[] = _("できない きのみ. とても おいしい."); static const u8 sBerryDescriptionPart1_Grepa[] = _("やわらかさと まるい かたちからは"); static const u8 sBerryDescriptionPart2_Grepa[] = _("そうぞうが できないほど すっぱい."); static const u8 sBerryDescriptionPart1_Tamato[] = _("くちびるが まがって しまうほど からい."); static const u8 sBerryDescriptionPart2_Tamato[] = _("そだてるにも じかんが かかる."); static const u8 sBerryDescriptionPart1_Cornn[] = _("おおむかしから はえていた. たくさん"); static const u8 sBerryDescriptionPart2_Cornn[] = _("うえないと みが つかないときも ある."); static const u8 sBerryDescriptionPart1_Magost[] = _("とても あじの バランスが よいと"); static const u8 sBerryDescriptionPart2_Magost[] = _("ひょうばんの きのみ."); static const u8 sBerryDescriptionPart1_Rabuta[] = _("たくさんの けが はえている めずらしい"); static const u8 sBerryDescriptionPart2_Rabuta[] = _("しゅるい. かなり にがい."); static const u8 sBerryDescriptionPart1_Nomel[] = _("かなり すっぱい. 1くち たべると"); static const u8 sBerryDescriptionPart2_Nomel[] = _("3にちかん ほかの あじが しなくなる."); static const u8 sBerryDescriptionPart1_Spelon[] = _("まっかになった みは とてつもなく からい."); static const u8 sBerryDescriptionPart2_Spelon[] = _("イボからも からい せいぶんが でている."); static const u8 sBerryDescriptionPart1_Pamtre[] = _("どこからともなく うみを ただよってくる."); static const u8 sBerryDescriptionPart2_Pamtre[] = _("せかいの どこかで そだっている らしい."); static const u8 sBerryDescriptionPart1_Watmel[] = _("とても おおきく 50センチを こえるものも"); static const u8 sBerryDescriptionPart2_Watmel[] = _("はっけん された. ものすごく あまい."); static const u8 sBerryDescriptionPart1_Durin[] = _("みただけで にがい. あまりにも にがいので"); static const u8 sBerryDescriptionPart2_Durin[] = _("そのままで たべたひとは だれもいない."); static const u8 sBerryDescriptionPart1_Belue[] = _("つるつるとして おいしそうだが とてつもなく"); static const u8 sBerryDescriptionPart2_Belue[] = _("すっぱい. そだてるにも じかんが かかる."); static const u8 sBerryDescriptionPart1_Liechi[] = _("なぞのタネ. チイラのみには うみの"); static const u8 sBerryDescriptionPart2_Liechi[] = _("ちからが やどるという うわさが ある."); static const u8 sBerryDescriptionPart1_Ganlon[] = _("なぞのタネ. リュガのみには りくの"); static const u8 sBerryDescriptionPart2_Ganlon[] = _("ちからが やどるという うわさが ある."); static const u8 sBerryDescriptionPart1_Salac[] = _("なぞのタネ. カムラのみには そらの"); static const u8 sBerryDescriptionPart2_Salac[] = _("ちからが やどるという うわさが ある."); static const u8 sBerryDescriptionPart1_Petaya[] = _("なぞのタネ. ヤタピのみには すべての"); static const u8 sBerryDescriptionPart2_Petaya[] = _("いきものの ちからが やどると いわれている"); static const u8 sBerryDescriptionPart1_Apicot[] = _("ふしぎな ふしぎな きのみ. なにが"); static const u8 sBerryDescriptionPart2_Apicot[] = _("おこるのか なにが できるのか わからない."); static const u8 sBerryDescriptionPart1_Lansat[] = _("でんせつのみ と いわれている. この みを"); static const u8 sBerryDescriptionPart2_Lansat[] = _("もつと とても しあわせに なるらしい."); static const u8 sBerryDescriptionPart1_Starf[] = _("あまりにも ちからが つよすぎるため"); static const u8 sBerryDescriptionPart2_Starf[] = _("せかいの はてに すてた まぼろしのみ."); static const u8 sBerryDescriptionPart1_Enigma[] = _("しょうたい ふめいの きのみ."); static const u8 sBerryDescriptionPart2_Enigma[] = _("ほしの ちからを もっている らしい."); const struct Berry gBerries[] = { [ITEM_CHERI_BERRY - FIRST_BERRY_INDEX] = { .name = _("CHERI"), .firmness = BERRY_FIRMNESS_SOFT, .size = 20, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Cheri, .description2 = sBerryDescriptionPart2_Cheri, .stageDuration = 3, .spicy = 10, .dry = 0, .sweet = 0, .bitter = 0, .sour = 0, .smoothness = 25 }, [ITEM_CHESTO_BERRY - FIRST_BERRY_INDEX] = { .name = _("CHESTO"), .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 80, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Chesto, .description2 = sBerryDescriptionPart2_Chesto, .stageDuration = 3, .spicy = 0, .dry = 10, .sweet = 0, .bitter = 0, .sour = 0, .smoothness = 25 }, [ITEM_PECHA_BERRY - FIRST_BERRY_INDEX] = { .name = _("PECHA"), .firmness = BERRY_FIRMNESS_VERY_SOFT, .size = 40, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Pecha, .description2 = sBerryDescriptionPart2_Pecha, .stageDuration = 3, .spicy = 0, .dry = 0, .sweet = 10, .bitter = 0, .sour = 0, .smoothness = 25 }, [ITEM_RAWST_BERRY - FIRST_BERRY_INDEX] = { .name = _("RAWST"), .firmness = BERRY_FIRMNESS_HARD, .size = 32, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Rawst, .description2 = sBerryDescriptionPart2_Rawst, .stageDuration = 3, .spicy = 0, .dry = 0, .sweet = 0, .bitter = 10, .sour = 0, .smoothness = 25 }, [ITEM_ASPEAR_BERRY - FIRST_BERRY_INDEX] = { .name = _("ASPEAR"), .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 50, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Aspear, .description2 = sBerryDescriptionPart2_Aspear, .stageDuration = 3, .spicy = 0, .dry = 0, .sweet = 0, .bitter = 0, .sour = 10, .smoothness = 25 }, [ITEM_LEPPA_BERRY - FIRST_BERRY_INDEX] = { .name = _("LEPPA"), .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 28, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Leppa, .description2 = sBerryDescriptionPart2_Leppa, .stageDuration = 4, .spicy = 10, .dry = 0, .sweet = 10, .bitter = 10, .sour = 10, .smoothness = 20 }, [ITEM_ORAN_BERRY - FIRST_BERRY_INDEX] = { .name = _("ORAN"), .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 35, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Oran, .description2 = sBerryDescriptionPart2_Oran, .stageDuration = 3, .spicy = 10, .dry = 10, .sweet = 10, .bitter = 10, .sour = 10, .smoothness = 20 }, [ITEM_PERSIM_BERRY - FIRST_BERRY_INDEX] = { .name = _("PERSIM"), .firmness = BERRY_FIRMNESS_HARD, .size = 47, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Persim, .description2 = sBerryDescriptionPart2_Persim, .stageDuration = 3, .spicy = 10, .dry = 10, .sweet = 10, .bitter = 10, .sour = 10, .smoothness = 20 }, [ITEM_LUM_BERRY - FIRST_BERRY_INDEX] = { .name = _("LUM"), .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 34, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Lum, .description2 = sBerryDescriptionPart2_Lum, .stageDuration = 12, .spicy = 10, .dry = 10, .sweet = 10, .bitter = 10, .sour = 10, .smoothness = 20 }, [ITEM_SITRUS_BERRY - FIRST_BERRY_INDEX] = { .name = _("SITRUS"), .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 95, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Sitrus, .description2 = sBerryDescriptionPart2_Sitrus, .stageDuration = 6, .spicy = 10, .dry = 10, .sweet = 10, .bitter = 10, .sour = 10, .smoothness = 20 }, [ITEM_FIGY_BERRY - FIRST_BERRY_INDEX] = { .name = _("FIGY"), .firmness = BERRY_FIRMNESS_SOFT, .size = 100, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Figy, .description2 = sBerryDescriptionPart2_Figy, .stageDuration = 6, .spicy = 10, .dry = 0, .sweet = 0, .bitter = 0, .sour = 0, .smoothness = 25 }, [ITEM_WIKI_BERRY - FIRST_BERRY_INDEX] = { .name = _("WIKI"), .firmness = BERRY_FIRMNESS_HARD, .size = 115, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Wiki, .description2 = sBerryDescriptionPart2_Wiki, .stageDuration = 6, .spicy = 0, .dry = 10, .sweet = 0, .bitter = 0, .sour = 0, .smoothness = 25 }, [ITEM_MAGO_BERRY - FIRST_BERRY_INDEX] = { .name = _("MAGO"), .firmness = BERRY_FIRMNESS_HARD, .size = 126, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Mago, .description2 = sBerryDescriptionPart2_Mago, .stageDuration = 6, .spicy = 0, .dry = 0, .sweet = 10, .bitter = 0, .sour = 0, .smoothness = 25 }, [ITEM_AGUAV_BERRY - FIRST_BERRY_INDEX] = { .name = _("AGUAV"), .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 64, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Aguav, .description2 = sBerryDescriptionPart2_Aguav, .stageDuration = 6, .spicy = 0, .dry = 0, .sweet = 0, .bitter = 10, .sour = 0, .smoothness = 25 }, [ITEM_IAPAPA_BERRY - FIRST_BERRY_INDEX] = { .name = _("IAPAPA"), .firmness = BERRY_FIRMNESS_SOFT, .size = 223, .maxYield = 3, .minYield = 2, .description1 = sBerryDescriptionPart1_Iapapa, .description2 = sBerryDescriptionPart2_Iapapa, .stageDuration = 6, .spicy = 0, .dry = 0, .sweet = 0, .bitter = 0, .sour = 10, .smoothness = 25 }, [ITEM_RAZZ_BERRY - FIRST_BERRY_INDEX] = { .name = _("RAZZ"), .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 120, .maxYield = 6, .minYield = 3, .description1 = sBerryDescriptionPart1_Razz, .description2 = sBerryDescriptionPart2_Razz, .stageDuration = 1, .spicy = 10, .dry = 10, .sweet = 0, .bitter = 0, .sour = 0, .smoothness = 20 }, [ITEM_BLUK_BERRY - FIRST_BERRY_INDEX] = { .name = _("BLUK"), .firmness = BERRY_FIRMNESS_SOFT, .size = 108, .maxYield = 6, .minYield = 3, .description1 = sBerryDescriptionPart1_Bluk, .description2 = sBerryDescriptionPart2_Bluk, .stageDuration = 1, .spicy = 0, .dry = 10, .sweet = 10, .bitter = 0, .sour = 0, .smoothness = 20 }, [ITEM_NANAB_BERRY - FIRST_BERRY_INDEX] = { .name = _("NANAB"), .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 77, .maxYield = 6, .minYield = 3, .description1 = sBerryDescriptionPart1_Nanab, .description2 = sBerryDescriptionPart2_Nanab, .stageDuration = 1, .spicy = 0, .dry = 0, .sweet = 10, .bitter = 10, .sour = 0, .smoothness = 20 }, [ITEM_WEPEAR_BERRY - FIRST_BERRY_INDEX] = { .name = _("WEPEAR"), .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 74, .maxYield = 6, .minYield = 3, .description1 = sBerryDescriptionPart1_Wepear, .description2 = sBerryDescriptionPart2_Wepear, .stageDuration = 1, .spicy = 0, .dry = 0, .sweet = 0, .bitter = 10, .sour = 10, .smoothness = 20 }, [ITEM_PINAP_BERRY - FIRST_BERRY_INDEX] = { .name = _("PINAP"), .firmness = BERRY_FIRMNESS_HARD, .size = 80, .maxYield = 6, .minYield = 3, .description1 = sBerryDescriptionPart1_Pinap, .description2 = sBerryDescriptionPart2_Pinap, .stageDuration = 1, .spicy = 10, .dry = 0, .sweet = 0, .bitter = 0, .sour = 10, .smoothness = 20 }, [ITEM_POMEG_BERRY - FIRST_BERRY_INDEX] = { .name = _("POMEG"), .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 135, .maxYield = 6, .minYield = 2, .description1 = sBerryDescriptionPart1_Pomeg, .description2 = sBerryDescriptionPart2_Pomeg, .stageDuration = 3, .spicy = 10, .dry = 0, .sweet = 10, .bitter = 10, .sour = 0, .smoothness = 20 }, [ITEM_KELPSY_BERRY - FIRST_BERRY_INDEX] = { .name = _("KELPSY"), .firmness = BERRY_FIRMNESS_HARD, .size = 150, .maxYield = 6, .minYield = 2, .description1 = sBerryDescriptionPart1_Kelpsy, .description2 = sBerryDescriptionPart2_Kelpsy, .stageDuration = 3, .spicy = 0, .dry = 10, .sweet = 0, .bitter = 10, .sour = 10, .smoothness = 20 }, [ITEM_QUALOT_BERRY - FIRST_BERRY_INDEX] = { .name = _("QUALOT"), .firmness = BERRY_FIRMNESS_HARD, .size = 110, .maxYield = 6, .minYield = 2, .description1 = sBerryDescriptionPart1_Qualot, .description2 = sBerryDescriptionPart2_Qualot, .stageDuration = 3, .spicy = 10, .dry = 0, .sweet = 10, .bitter = 0, .sour = 10, .smoothness = 20 }, [ITEM_HONDEW_BERRY - FIRST_BERRY_INDEX] = { .name = _("HONDEW"), .firmness = BERRY_FIRMNESS_HARD, .size = 162, .maxYield = 6, .minYield = 2, .description1 = sBerryDescriptionPart1_Hondew, .description2 = sBerryDescriptionPart2_Hondew, .stageDuration = 3, .spicy = 10, .dry = 10, .sweet = 0, .bitter = 10, .sour = 0, .smoothness = 20 }, [ITEM_GREPA_BERRY - FIRST_BERRY_INDEX] = { .name = _("GREPA"), .firmness = BERRY_FIRMNESS_SOFT, .size = 149, .maxYield = 6, .minYield = 2, .description1 = sBerryDescriptionPart1_Grepa, .description2 = sBerryDescriptionPart2_Grepa, .stageDuration = 3, .spicy = 0, .dry = 10, .sweet = 10, .bitter = 0, .sour = 10, .smoothness = 20 }, [ITEM_TAMATO_BERRY - FIRST_BERRY_INDEX] = { .name = _("TAMATO"), .firmness = BERRY_FIRMNESS_SOFT, .size = 200, .maxYield = 4, .minYield = 2, .description1 = sBerryDescriptionPart1_Tamato, .description2 = sBerryDescriptionPart2_Tamato, .stageDuration = 6, .spicy = 20, .dry = 10, .sweet = 0, .bitter = 0, .sour = 0, .smoothness = 30 }, [ITEM_CORNN_BERRY - FIRST_BERRY_INDEX] = { .name = _("CORNN"), .firmness = BERRY_FIRMNESS_HARD, .size = 75, .maxYield = 4, .minYield = 2, .description1 = sBerryDescriptionPart1_Cornn, .description2 = sBerryDescriptionPart2_Cornn, .stageDuration = 6, .spicy = 0, .dry = 20, .sweet = 10, .bitter = 0, .sour = 0, .smoothness = 30 }, [ITEM_MAGOST_BERRY - FIRST_BERRY_INDEX] = { .name = _("MAGOST"), .firmness = BERRY_FIRMNESS_HARD, .size = 140, .maxYield = 4, .minYield = 2, .description1 = sBerryDescriptionPart1_Magost, .description2 = sBerryDescriptionPart2_Magost, .stageDuration = 6, .spicy = 0, .dry = 0, .sweet = 20, .bitter = 10, .sour = 0, .smoothness = 30 }, [ITEM_RABUTA_BERRY - FIRST_BERRY_INDEX] = { .name = _("RABUTA"), .firmness = BERRY_FIRMNESS_SOFT, .size = 226, .maxYield = 4, .minYield = 2, .description1 = sBerryDescriptionPart1_Rabuta, .description2 = sBerryDescriptionPart2_Rabuta, .stageDuration = 6, .spicy = 0, .dry = 0, .sweet = 0, .bitter = 20, .sour = 10, .smoothness = 30 }, [ITEM_NOMEL_BERRY - FIRST_BERRY_INDEX] = { .name = _("NOMEL"), .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 285, .maxYield = 4, .minYield = 2, .description1 = sBerryDescriptionPart1_Nomel, .description2 = sBerryDescriptionPart2_Nomel, .stageDuration = 6, .spicy = 10, .dry = 0, .sweet = 0, .bitter = 0, .sour = 20, .smoothness = 30 }, [ITEM_SPELON_BERRY - FIRST_BERRY_INDEX] = { .name = _("SPELON"), .firmness = BERRY_FIRMNESS_SOFT, .size = 133, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Spelon, .description2 = sBerryDescriptionPart2_Spelon, .stageDuration = 18, .spicy = 40, .dry = 10, .sweet = 0, .bitter = 0, .sour = 0, .smoothness = 70 }, [ITEM_PAMTRE_BERRY - FIRST_BERRY_INDEX] = { .name = _("PAMTRE"), .firmness = BERRY_FIRMNESS_VERY_SOFT, .size = 244, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Pamtre, .description2 = sBerryDescriptionPart2_Pamtre, .stageDuration = 18, .spicy = 0, .dry = 40, .sweet = 10, .bitter = 0, .sour = 0, .smoothness = 70 }, [ITEM_WATMEL_BERRY - FIRST_BERRY_INDEX] = { .name = _("WATMEL"), .firmness = BERRY_FIRMNESS_SOFT, .size = 250, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Watmel, .description2 = sBerryDescriptionPart2_Watmel, .stageDuration = 18, .spicy = 0, .dry = 0, .sweet = 40, .bitter = 10, .sour = 0, .smoothness = 70 }, [ITEM_DURIN_BERRY - FIRST_BERRY_INDEX] = { .name = _("DURIN"), .firmness = BERRY_FIRMNESS_HARD, .size = 280, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Durin, .description2 = sBerryDescriptionPart2_Durin, .stageDuration = 18, .spicy = 0, .dry = 0, .sweet = 0, .bitter = 40, .sour = 10, .smoothness = 70 }, [ITEM_BELUE_BERRY - FIRST_BERRY_INDEX] = { .name = _("BELUE"), .firmness = BERRY_FIRMNESS_VERY_SOFT, .size = 300, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Belue, .description2 = sBerryDescriptionPart2_Belue, .stageDuration = 18, .spicy = 10, .dry = 0, .sweet = 0, .bitter = 0, .sour = 40, .smoothness = 70 }, [ITEM_LIECHI_BERRY - FIRST_BERRY_INDEX] = { .name = _("LIECHI"), .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 111, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Liechi, .description2 = sBerryDescriptionPart2_Liechi, .stageDuration = 24, .spicy = 40, .dry = 0, .sweet = 40, .bitter = 0, .sour = 10, .smoothness = 80 }, [ITEM_GANLON_BERRY - FIRST_BERRY_INDEX] = { .name = _("GANLON"), .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 33, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Ganlon, .description2 = sBerryDescriptionPart2_Ganlon, .stageDuration = 24, .spicy = 0, .dry = 40, .sweet = 0, .bitter = 40, .sour = 0, .smoothness = 80 }, [ITEM_SALAC_BERRY - FIRST_BERRY_INDEX] = { .name = _("SALAC"), .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 95, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Salac, .description2 = sBerryDescriptionPart2_Salac, .stageDuration = 24, .spicy = 0, .dry = 0, .sweet = 40, .bitter = 0, .sour = 40, .smoothness = 80 }, [ITEM_PETAYA_BERRY - FIRST_BERRY_INDEX] = { .name = _("PETAYA"), .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 237, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Petaya, .description2 = sBerryDescriptionPart2_Petaya, .stageDuration = 24, .spicy = 40, .dry = 0, .sweet = 0, .bitter = 40, .sour = 0, .smoothness = 80 }, [ITEM_APICOT_BERRY - FIRST_BERRY_INDEX] = { .name = _("APICOT"), .firmness = BERRY_FIRMNESS_HARD, .size = 75, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Apicot, .description2 = sBerryDescriptionPart2_Apicot, .stageDuration = 24, .spicy = 0, .dry = 40, .sweet = 0, .bitter = 0, .sour = 40, .smoothness = 80 }, [ITEM_LANSAT_BERRY - FIRST_BERRY_INDEX] = { .name = _("LANSAT"), .firmness = BERRY_FIRMNESS_SOFT, .size = 97, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Lansat, .description2 = sBerryDescriptionPart2_Lansat, .stageDuration = 24, .spicy = 10, .dry = 10, .sweet = 10, .bitter = 10, .sour = 10, .smoothness = 30 }, [ITEM_STARF_BERRY - FIRST_BERRY_INDEX] = { .name = _("STARF"), .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 153, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Starf, .description2 = sBerryDescriptionPart2_Starf, .stageDuration = 24, .spicy = 10, .dry = 10, .sweet = 10, .bitter = 10, .sour = 10, .smoothness = 30 }, [ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX] = { .name = _("ENIGMA"), .firmness = BERRY_FIRMNESS_UNKNOWN, .size = 0, .maxYield = 2, .minYield = 1, .description1 = sBerryDescriptionPart1_Enigma, .description2 = sBerryDescriptionPart2_Enigma, .stageDuration = 24, .spicy = 40, .dry = 40, .sweet = 40, .bitter = 40, .sour = 40, .smoothness = 40 }, }; const struct BerryCrushStats gBerryCrush_BerryData[] = { [ITEM_CHERI_BERRY - FIRST_BERRY_INDEX] = { 50, 20}, [ITEM_CHESTO_BERRY - FIRST_BERRY_INDEX] = { 50, 20}, [ITEM_PECHA_BERRY - FIRST_BERRY_INDEX] = { 50, 20}, [ITEM_RAWST_BERRY - FIRST_BERRY_INDEX] = { 50, 20}, [ITEM_ASPEAR_BERRY - FIRST_BERRY_INDEX] = { 50, 20}, [ITEM_LEPPA_BERRY - FIRST_BERRY_INDEX] = { 50, 30}, [ITEM_ORAN_BERRY - FIRST_BERRY_INDEX] = { 50, 30}, [ITEM_PERSIM_BERRY - FIRST_BERRY_INDEX] = { 50, 30}, [ITEM_LUM_BERRY - FIRST_BERRY_INDEX] = { 50, 30}, [ITEM_SITRUS_BERRY - FIRST_BERRY_INDEX] = { 50, 30}, [ITEM_FIGY_BERRY - FIRST_BERRY_INDEX] = { 60, 50}, [ITEM_WIKI_BERRY - FIRST_BERRY_INDEX] = { 60, 50}, [ITEM_MAGO_BERRY - FIRST_BERRY_INDEX] = { 60, 50}, [ITEM_AGUAV_BERRY - FIRST_BERRY_INDEX] = { 60, 50}, [ITEM_IAPAPA_BERRY - FIRST_BERRY_INDEX] = { 60, 50}, [ITEM_RAZZ_BERRY - FIRST_BERRY_INDEX] = { 80, 70}, [ITEM_BLUK_BERRY - FIRST_BERRY_INDEX] = { 80, 70}, [ITEM_NANAB_BERRY - FIRST_BERRY_INDEX] = { 80, 70}, [ITEM_WEPEAR_BERRY - FIRST_BERRY_INDEX] = { 80, 70}, [ITEM_PINAP_BERRY - FIRST_BERRY_INDEX] = { 80, 70}, [ITEM_POMEG_BERRY - FIRST_BERRY_INDEX] = {100, 100}, [ITEM_KELPSY_BERRY - FIRST_BERRY_INDEX] = {100, 100}, [ITEM_QUALOT_BERRY - FIRST_BERRY_INDEX] = {100, 100}, [ITEM_HONDEW_BERRY - FIRST_BERRY_INDEX] = {100, 100}, [ITEM_GREPA_BERRY - FIRST_BERRY_INDEX] = {100, 100}, [ITEM_TAMATO_BERRY - FIRST_BERRY_INDEX] = {130, 150}, [ITEM_CORNN_BERRY - FIRST_BERRY_INDEX] = {130, 150}, [ITEM_MAGOST_BERRY - FIRST_BERRY_INDEX] = {130, 150}, [ITEM_RABUTA_BERRY - FIRST_BERRY_INDEX] = {130, 150}, [ITEM_NOMEL_BERRY - FIRST_BERRY_INDEX] = {130, 150}, [ITEM_SPELON_BERRY - FIRST_BERRY_INDEX] = {160, 250}, [ITEM_PAMTRE_BERRY - FIRST_BERRY_INDEX] = {160, 250}, [ITEM_WATMEL_BERRY - FIRST_BERRY_INDEX] = {160, 250}, [ITEM_DURIN_BERRY - FIRST_BERRY_INDEX] = {160, 250}, [ITEM_BELUE_BERRY - FIRST_BERRY_INDEX] = {160, 250}, [ITEM_LIECHI_BERRY - FIRST_BERRY_INDEX] = {180, 500}, [ITEM_GANLON_BERRY - FIRST_BERRY_INDEX] = {180, 500}, [ITEM_SALAC_BERRY - FIRST_BERRY_INDEX] = {180, 500}, [ITEM_PETAYA_BERRY - FIRST_BERRY_INDEX] = {180, 500}, [ITEM_APICOT_BERRY - FIRST_BERRY_INDEX] = {180, 500}, [ITEM_LANSAT_BERRY - FIRST_BERRY_INDEX] = {200, 750}, [ITEM_STARF_BERRY - FIRST_BERRY_INDEX] = {200, 750}, [ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX] = {150, 200} }; // Leftover from R/S const struct BerryTree gBlankBerryTree = {}; #define ENIGMA_BERRY_STRUCT ({ \ const struct Berry2 * berries = (const struct Berry2 *)gBerries; \ berries[ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX]; \ }) static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *); void InitEnigmaBerry(void) { s32 i; gSaveBlock1Ptr->enigmaBerry.berry = ENIGMA_BERRY_STRUCT; for (i = 0; i < 18; i++) gSaveBlock1Ptr->enigmaBerry.itemEffect[i] = 0; gSaveBlock1Ptr->enigmaBerry.holdEffect = 0; gSaveBlock1Ptr->enigmaBerry.holdEffectParam = 0; gSaveBlock1Ptr->enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1Ptr->enigmaBerry); } void ClearEnigmaBerries(void) { CpuFill16(0, &gSaveBlock1Ptr->enigmaBerry, sizeof(gSaveBlock1Ptr->enigmaBerry)); InitEnigmaBerry(); } struct ReceivedEnigmaBerry { struct Berry2 berry; u8 unk_001C[0x4FA]; u8 itemEffect[18]; u8 holdEffect; u8 holdEffectParam; }; void SetEnigmaBerry(u8 * berry) { struct EnigmaBerry * enigmaBerry; struct ReceivedEnigmaBerry * src2; s32 i; ClearEnigmaBerries(); src2 = (struct ReceivedEnigmaBerry *)berry; enigmaBerry = &gSaveBlock1Ptr->enigmaBerry; enigmaBerry->berry = src2->berry; for (i = 0; i < 18; i++) enigmaBerry->itemEffect[i] = src2->itemEffect[i]; enigmaBerry->holdEffect = src2->holdEffect; enigmaBerry->holdEffectParam = src2->holdEffectParam; enigmaBerry->checksum = GetEnigmaBerryChecksum(enigmaBerry); } static u32 GetEnigmaBerryChecksum(struct EnigmaBerry * enigmaBerry) { const u8 * src = (const u8 *)enigmaBerry; u32 result = 0; u32 i; for (i = 0; i < offsetof(struct EnigmaBerry, checksum); i++) result += src[i]; return result; } bool32 IsEnigmaBerryValid(void) { if (gSaveBlock1Ptr->enigmaBerry.berry.stageDuration == 0) return FALSE; if (gSaveBlock1Ptr->enigmaBerry.berry.maxYield == 0) return FALSE; if (GetEnigmaBerryChecksum(&gSaveBlock1Ptr->enigmaBerry) != gSaveBlock1Ptr->enigmaBerry.checksum) return FALSE; return TRUE; } const struct Berry * GetBerryInfo(u8 berryIdx) { if (berryIdx == ITEM_TO_BERRY(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid()) return (struct Berry *)&gSaveBlock1Ptr->enigmaBerry.berry; if (berryIdx == 0 || berryIdx > ITEM_TO_BERRY(ITEM_ENIGMA_BERRY)) berryIdx = 1; return &gBerries[berryIdx - 1]; } u8 ItemIdToBerryType(u16 itemId) { if (itemId - FIRST_BERRY_INDEX < 0 || itemId - FIRST_BERRY_INDEX > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX) return 1; return ITEM_TO_BERRY(itemId); } u16 BerryTypeToItemId(u16 berryType) { if (berryType - 1 < 0 || berryType - 1 > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX) return FIRST_BERRY_INDEX; return berryType + FIRST_BERRY_INDEX - 1; } void GetBerryNameByBerryType(u8 berryType, u8 * dest) { const struct Berry * berry = GetBerryInfo(berryType); memcpy(dest, berry->name, 6); dest[6] = EOS; } ================================================ FILE: src/berry_crush.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "berry.h" #include "berry_crush.h" #include "berry_pouch.h" #include "berry_powder.h" #include "decompress.h" #include "digit_obj_util.h" #include "dynamic_placeholder_text_util.h" #include "graphics.h" #include "item.h" #include "item_menu.h" #include "item_menu_icons.h" #include "link.h" #include "link_rfu.h" #include "list_menu.h" #include "math_util.h" #include "menu.h" #include "minigame_countdown.h" #include "new_menu_helpers.h" #include "overworld.h" #include "random.h" #include "save.h" #include "scanline_effect.h" #include "script.h" #include "strings.h" #include "task.h" #include "text_window.h" #include "trig.h" #include "constants/songs.h" #include "constants/items.h" #define MAX_TIME (10 * 60 * 60) // Timer can go up to 9:59:59 #define TAG_CRUSHER_BASE 1 #define PALTAG_EFFECT 2 // The next two gfx tags share this pal tag #define GFXTAG_IMPACT 2 #define GFXTAG_SPARKLE 3 #define TAG_TIMER_DIGITS 4 #define TAG_PLAYER1_BERRY 5 #define TAG_PLAYER2_BERRY 6 #define TAG_PLAYER3_BERRY 7 #define TAG_PLAYER4_BERRY 8 #define TAG_PLAYER5_BERRY 9 #define TAG_COUNTDOWN 0x1000 #define CRUSHER_START_Y (-104) enum { RUN_CMD, SCHEDULE_CMD, }; enum { MSG_PICK_BERRY, MSG_WAIT_PICK, MSG_POWDER, MSG_SAVING, MSG_PLAY_AGAIN, MSG_NO_BERRIES, MSG_DROPPED, MSG_TIMES_UP, MSG_COMM_STANDBY, }; enum { CMD_NONE = 0, CMD_FADE, CMD_WAIT_FADE, CMD_PRINT_MSG, CMD_SHOW_GAME, CMD_HIDE_GAME, CMD_READY_BEGIN, CMD_ASK_PICK_BERRY, CMD_PICK_BERRY, CMD_WAIT_BERRIES, CMD_DROP_BERRIES, CMD_DROP_LID, CMD_COUNTDOWN, CMD_PLAY_GAME_LEADER, CMD_PLAY_GAME_MEMBER, CMD_FINISH_GAME, CMD_TIMES_UP, CMD_CALC_RESULTS, CMD_SHOW_RESULTS, CMD_SAVE, CMD_ASK_PLAY_AGAIN, CMD_COMM_PLAY_AGAIN, CMD_PLAY_AGAIN_YES, CMD_PLAY_AGAIN_NO, CMD_CLOSE_LINK, CMD_QUIT, }; // Args for Cmd_BeginNormalPaletteFade #define bSelectedPals(i) args[0 + i] #define bDelay args[4] #define bStartY args[5] #define bTargetY args[6] #define bPalette(i) args[7 + i] #define bCommunicateAfter args[9] // Args for Cmd_WaitPaletteFade #define bWaitFadeCommAfter args[0] // Args for Cmd_PrintMessage #define bMsgId args[0] #define bFlags args[1] #define bKeys(i) args[2 + i] #define bNextCmdState args[4] #define F_MSG_CLEAR (1 << 0) #define F_MSG_EXPAND (1 << 1) // Main states for the game. Many are assigned but never checked enum { STATE_INIT = 1, STATE_RESET, STATE_PICK_BERRY, STATE_DROP_BERRIES, STATE_DROP_LID, STATE_COUNTDOWN, STATE_PLAYING, STATE_FINISHED, STATE_TIMES_UP, STATE_10, // Unused STATE_RESULTS_PRESSES, STATE_RESULTS_RANDOM, STATE_RESULTS_CRUSHING, STATE_14, // Unused STATE_PLAY_AGAIN, }; #define RESULTS_STATE_START STATE_RESULTS_PRESSES #define RESULTS_STATE_END STATE_RESULTS_CRUSHING // IDs for each results page that shows in succession at the game's end. // Only 3 pages are shown for a given game. Presses and Crushing are always shown 1st and 3rd. // The 2nd page is random, and can be rankings for either Neatness, Cooperative, or Power. enum { RESULTS_PAGE_PRESSES, RESULTS_PAGE_RANDOM, RESULTS_PAGE_CRUSHING, NUM_RESULTS_PAGES, }; // Random pages, see above // "Neatness" is how many of the player's inputs were at a regular interval // "Cooperative" is how often the player pressed A at the same time as others // "Power" is how much of the time the player spent pressing A enum { RESULTS_PAGE_NEATNESS, RESULTS_PAGE_COOPERATIVE, RESULTS_PAGE_POWER, NUM_RANDOM_RESULTS_PAGES }; #define PLAY_AGAIN_YES 0 #define PLAY_AGAIN_NO 1 #define PLAY_AGAIN_NO_BERRIES 3 enum { COLORID_GRAY, COLORID_BLACK, COLORID_LIGHT_GRAY, COLORID_BLUE, COLORID_GREEN, COLORID_RED, }; // Flags for the inputFlags field // Field is 16 bits; 3 bits for each player, last bit is unused // The first two bits are interchangeable // Needlessly complicated system, the inputState field is sufficient by itself #define F_INPUT_HIT_A (1 << 0) #define F_INPUT_HIT_B (1 << 1) #define F_INPUT_HIT_SYNC (1 << 2) // Input at same time as another player #define INPUT_FLAGS_PER_PLAYER 3 #define INPUT_FLAG_MASK ((1 << INPUT_FLAGS_PER_PLAYER) - 1) // Values for the inputState field enum { INPUT_STATE_NONE, INPUT_STATE_HIT, // Hit the crusher INPUT_STATE_HIT_SYNC, // Hit the crusher at same time as another player }; // No reason for this to be 2 // Simply a flag for whether a given player has sent their data this round // Data is only sent if the player is the leader or if they pressed A #define SEND_GAME_STATE 2 struct BerryCrushGame_Player { u8 name[PLAYER_NAME_LENGTH + 1 + 4]; u16 berryId; u16 inputTime; u16 neatInputStreak; u16 timeSincePrevInput; u16 maxNeatInputStreak; u16 numAPresses; u16 numSyncedAPresses; u16 timePressingA; u8 inputFlags; u8 inputState; }; struct BerryCrushGame_LocalState { u16 sendFlag; bool8 endGame:1; bool8 bigSparkle:1; bool8 pushedAButton:1; u8 playerPressedAFlags:5; s8 vibration; u16 depth; u16 timer; u16 inputFlags; u16 sparkleAmount; }; struct BerryCrushGame_LinkState { u16 rfuCmd; u16 sendFlag; bool8 endGame:1; bool8 bigSparkle:1; bool8 pushedAButton:1; u8 playerPressedAFlags:5; s8 vibration; u16 depth; u16 timer; u16 inputFlags; u16 sparkleAmount; }; // Flags for the inputFlags field // Field is 16 bits; 3 bits for each player, last bit is unused // The first two bits are interchangeable // Needlessly complicated system, the inputState field is sufficient by itself #define F_INPUT_HIT_A (1 << 0) #define F_INPUT_HIT_B (1 << 1) #define F_INPUT_HIT_SYNC (1 << 2) // Input at same time as another player #define INPUT_FLAGS_PER_PLAYER 3 #define INPUT_FLAG_MASK ((1 << INPUT_FLAGS_PER_PLAYER) - 1) struct BerryCrushGame_Results { u32 powder; u16 time; u16 targetPressesPerSec; // Never read u16 silkiness; u16 totalAPresses; u16 stats[2][MAX_RFU_PLAYERS]; u8 playerIdsRanked[2][MAX_RFU_PLAYERS + 3]; }; // playerIdsRanked above has 3 additional elements after the players. // Only 1 of these 2*3 is ever used, and it stores the id for which // random results page to show. Its define below is for readability. #define randomPageId playerIdsRanked[0][7] struct BerryCrushPlayerCoords { u8 playerId; u8 windowGfxX; u8 windowGfxY; s16 impactXOffset; s16 impactYOffset; s16 berryXOffset; s16 berryXDest; }; struct BerryCrushGame_Gfx { u8 counter; u8 vibrationIdx; u8 numVibrations; bool8 vibrating; s16 minutes; s16 secondsInt; s16 secondsFrac; const struct BerryCrushPlayerCoords *playerCoords[MAX_RFU_PLAYERS]; struct Sprite *coreSprite; struct Sprite *impactSprites[MAX_RFU_PLAYERS]; struct Sprite *berrySprites[MAX_RFU_PLAYERS]; struct Sprite *sparkleSprites[11]; struct Sprite *timerSprites[2]; u8 resultsState; u8 unused; u8 resultsWindowId; u8 nameWindowIds[MAX_RFU_PLAYERS]; u16 bgBuffers[4][BG_SCREEN_SIZE]; }; struct BerryCrushGame; typedef u32 (*CmdFunc)(struct BerryCrushGame * game, u8 * args); struct BerryCrushGame { MainCallback savedCallback; CmdFunc cmdCallback; u8 localId; u8 playerCount; u8 mainTask; u8 textSpeed; u8 cmdState; u8 unused; // Never read u8 nextCmd; u8 afterPalFadeCmd; u16 cmdTimer; u16 gameState; u16 playAgainState; u16 pressingSpeed; s16 targetAPresses; s16 totalAPresses; s32 powder; s32 targetDepth; u8 newDepth; bool8 noRoomForPowder:1; // Never read bool8 newRecord:1; bool8 playedSound:1; bool8 endGame:1; bool8 bigSparkle:1; u8 sparkleAmount:3; u16 leaderTimer; u16 timer; s16 depth; s16 vibration; s16 bigSparkleCounter; s16 numBigSparkles; s16 numBigSparkleChecks; s16 sparkleCounter; u8 commandParams[12]; u16 sendCmd[6]; u16 recvCmd[7]; struct BerryCrushGame_LocalState localState; struct BerryCrushGame_Results results; struct BerryCrushGame_Player players[5]; struct BerryCrushGame_Gfx gfx; }; static EWRAM_DATA struct BerryCrushGame *sGame = NULL; static void SetNamesAndTextSpeed(struct BerryCrushGame *game); static void GetBerryFromBag(void); static void VBlankCB(void); static void MainCB(void); static void MainTask(u8 taskId); static u32 Cmd_BeginNormalPaletteFade(struct BerryCrushGame * game, u8 *args); static u32 Cmd_WaitPaletteFade(struct BerryCrushGame * game, u8 *args); static u32 Cmd_PrintMessage(struct BerryCrushGame * game, u8 *args); static u32 Cmd_ShowGameDisplay(struct BerryCrushGame * game, u8 *args); static u32 Cmd_HideGameDisplay(struct BerryCrushGame * game, u8 *args); static u32 Cmd_SignalReadyToBegin(struct BerryCrushGame * game, u8 *args); static u32 Cmd_AskPickBerry(struct BerryCrushGame * game, u8 *args); static u32 Cmd_GoToBerryPouch(struct BerryCrushGame * game, u8 *args); static u32 Cmd_WaitForOthersToPickBerries(struct BerryCrushGame * game, u8 *args); static u32 Cmd_DropBerriesIntoCrusher(struct BerryCrushGame * game, u8 *args); static u32 Cmd_DropLid(struct BerryCrushGame * game, u8 *args); static u32 Cmd_Countdown(struct BerryCrushGame * game, u8 *args); static u32 Cmd_PlayGame_Leader(struct BerryCrushGame * game, u8 *args); static u32 Cmd_PlayGame_Member(struct BerryCrushGame * game, u8 *args); static u32 Cmd_FinishGame(struct BerryCrushGame * game, u8 *args); static u32 Cmd_HandleTimeUp(struct BerryCrushGame * game, u8 *args); static u32 Cmd_TabulateResults(struct BerryCrushGame * game, u8 *args); static u32 Cmd_ShowResults(struct BerryCrushGame * game, u8 *args); static u32 Cmd_SaveGame(struct BerryCrushGame * game, u8 *args); static u32 Cmd_AskPlayAgain(struct BerryCrushGame * game, u8 *args); static u32 Cmd_CommunicatePlayAgainResponses(struct BerryCrushGame * game, u8 *args); static u32 Cmd_PlayAgain(struct BerryCrushGame * game, u8 *args); static u32 Cmd_StopGame(struct BerryCrushGame * game, u8 *args); static u32 Cmd_CloseLink(struct BerryCrushGame * game, u8 *args); static u32 Cmd_Quit(struct BerryCrushGame * game, u8 *args); static void ResetGame(struct BerryCrushGame * game); static void SetPrintMessageArgs(u8 *args, u8 stringId, u8 flags, u16 waitKeys, u8 followupCmd); static void FramesToMinSec(struct BerryCrushGame_Gfx * gfx, u16 frames); static void PrintTextCentered(u8 windowId, u8 left, u8 colorId, const u8 *string); static void PrintResultsText(struct BerryCrushGame * game, u8 command, u8 x, u8 y); static void printCrushingResults(struct BerryCrushGame * game); static void Task_ShowBerryCrushRankings(u8 r4); static void PrintTimer(struct BerryCrushGame_Gfx * gfx, u16 frames); static void CreatePlayerNameWindows(struct BerryCrushGame * game); static void DrawPlayerNameWindows(struct BerryCrushGame * game); static void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame * game); static void CreateGameSprites(struct BerryCrushGame * game); static void DestroyGameSprites(struct BerryCrushGame * game); static void SpriteCB_Impact(struct Sprite *sprite); static void SpriteCB_Sparkle_End(struct Sprite *sprite); static void SpriteCB_Sparkle(struct Sprite *sprite); static void SpriteCB_Sparkle_Init(struct Sprite *sprite); static struct BerryCrushGame *GetBerryCrushGame(void); static u32 QuitBerryCrush(MainCallback callback); static void ChooseBerry(void); static void BerryCrush_SetVBlankCallback(void); static void BerryCrush_InitVBlankCB(void); static void SaveResults(void); static void RunOrScheduleCommand(u16 command, u8 runMode, u8 *args); static void SetPaletteFadeArgs(u8 *args, bool8 communicateAfter, u32 selectedPals, s8 delay, u8 startY, u8 targetY, u16 palette); static s32 UpdateGame(struct BerryCrushGame *game); static s32 ShowGameDisplay(void); static s32 HideGameDisplay(void); static void CreateBerrySprites(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *spritesManager); static void BerryCrushFreeBerrySpriteGfx(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx); static void UpdateInputEffects(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx); static bool32 AreEffectsFinished(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx); static bool32 OpenResultsWindow(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *spriteManager); static void CloseResultsWindow(struct BerryCrushGame *game); static void ResetCrusherPos(struct BerryCrushGame *game); static void HideTimer(struct BerryCrushGame_Gfx *gfx); static void SpriteCB_DropBerryIntoCrusher(struct Sprite *sprite); static const u8 sBitTable[] = { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, }; // Additional A presses are counted depending on the number of players // The bonus of 5 is unobtainable static const u8 sSyncPressBonus[MAX_RFU_PLAYERS] = {0, 1, 2, 3, 5 }; ALIGNED(4) static const s8 sIntroOutroVibrationData[][7] = { { 4, 1, 0, -1, 0, 0, 0}, { 4, 2, 0, -1, 0, 0, 0}, { 4, 2, 0, -2, 0, 0, 0}, { 6, 3, 1, -1, -3, -1, 0}, { 6, 4, 1, -2, -4, -2, 0}, }; ALIGNED(4) const u8 sVibrationData[MAX_RFU_PLAYERS][4] = { { 3, 2, 1, 0}, { 3, 3, 1, 0}, { 3, 3, 2, 0}, { 3, 4, 2, 0}, { 3, 5, 3, 0} }; static const u8 *const sMessages[] = { [MSG_PICK_BERRY] = gText_BerryCrush_AreYouReady, [MSG_WAIT_PICK] = gText_BerryCrush_WaitForOthersToChooseBerry, [MSG_POWDER] = gText_BerryCrush_GainedXUnitsOfPowder, [MSG_SAVING] = gText_BerryCrush_RecordingGameResults, [MSG_PLAY_AGAIN] = gText_BerryCrush_WantToPlayAgain, [MSG_NO_BERRIES] = gText_BerryCrush_NoBerries, [MSG_DROPPED] = gText_BerryCrush_MemberDroppedOut, [MSG_TIMES_UP] = gText_BerryCrush_TimeUp, [MSG_COMM_STANDBY] = gText_BerryCrush_CommunicationStandby }; static u32 (*const sBerryCrushCommands[])(struct BerryCrushGame * berryCrushGame, u8 *args) = { [CMD_NONE] = NULL, [CMD_FADE] = Cmd_BeginNormalPaletteFade, [CMD_WAIT_FADE] = Cmd_WaitPaletteFade, [CMD_PRINT_MSG] = Cmd_PrintMessage, [CMD_SHOW_GAME] = Cmd_ShowGameDisplay, [CMD_HIDE_GAME] = Cmd_HideGameDisplay, [CMD_READY_BEGIN] = Cmd_SignalReadyToBegin, [CMD_ASK_PICK_BERRY] = Cmd_AskPickBerry, [CMD_PICK_BERRY] = Cmd_GoToBerryPouch, [CMD_WAIT_BERRIES] = Cmd_WaitForOthersToPickBerries, [CMD_DROP_BERRIES] = Cmd_DropBerriesIntoCrusher, [CMD_DROP_LID] = Cmd_DropLid, [CMD_COUNTDOWN] = Cmd_Countdown, [CMD_PLAY_GAME_LEADER] = Cmd_PlayGame_Leader, [CMD_PLAY_GAME_MEMBER] = Cmd_PlayGame_Member, [CMD_FINISH_GAME] = Cmd_FinishGame, [CMD_TIMES_UP] = Cmd_HandleTimeUp, [CMD_CALC_RESULTS] = Cmd_TabulateResults, [CMD_SHOW_RESULTS] = Cmd_ShowResults, [CMD_SAVE] = Cmd_SaveGame, [CMD_ASK_PLAY_AGAIN] = Cmd_AskPlayAgain, [CMD_COMM_PLAY_AGAIN] = Cmd_CommunicatePlayAgainResponses, [CMD_PLAY_AGAIN_YES] = Cmd_PlayAgain, [CMD_PLAY_AGAIN_NO] = Cmd_StopGame, [CMD_CLOSE_LINK] = Cmd_CloseLink, [CMD_QUIT] = Cmd_Quit }; static const u8 sSparkleThresholds[MAX_RFU_PLAYERS - 1][4] = { {2, 4, 6, 7}, // 2 players {3, 5, 8, 11}, // 3 players {3, 7, 11, 15}, // 4 players {4, 8, 12, 17}, // 5 players }; static const u8 sBigSparkleThresholds[MAX_RFU_PLAYERS - 1] = {5, 7, 9, 12}; static const u8 sReceivedPlayerBitmasks[MAX_RFU_PLAYERS - 1] = {0x03, 0x07, 0x0F, 0x1F}; static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 15, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x0000 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 13, .screenSize = 2, .paletteMode = 0, .priority = 1, .baseTile = 0x0000 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 12, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x0000 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 11, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x0000 } }; static const u8 sBerryCrushTextColorTable[][3] = { [COLORID_GRAY] = { TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY }, [COLORID_BLACK] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY }, [COLORID_LIGHT_GRAY] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_RED }, [COLORID_BLUE] = { TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE }, [COLORID_GREEN] = { TEXT_COLOR_WHITE, TEXT_COLOR_GREEN, TEXT_COLOR_LIGHT_GREEN }, [COLORID_RED] = { TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED } }; static const struct WindowTemplate sWindowTemplate_BerryCrushRankings = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 4, .width = 24, .height = 13, .paletteNum = 15, .baseBlock = 0x001 }; static const struct WindowTemplate sWindowTemplates_PlayerNames[] = { { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 9, .height = 2, .paletteNum = 8, .baseBlock = 0x3ed }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 3, .width = 9, .height = 2, .paletteNum = 8, .baseBlock = 0x3db }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 6, .width = 9, .height = 2, .paletteNum = 8, .baseBlock = 0x3c9 }, { .bg = 0, .tilemapLeft = 21, .tilemapTop = 3, .width = 9, .height = 2, .paletteNum = 8, .baseBlock = 0x3b7 }, { .bg = 0, .tilemapLeft = 21, .tilemapTop = 6, .width = 9, .height = 2, .paletteNum = 8, .baseBlock = 0x3a5 }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sWindowTemplates_Results[] = { [STATE_RESULTS_PRESSES - RESULTS_STATE_START] = { .bg = 0, .tilemapLeft = 4, .tilemapTop = 2, .width = 22, .height = 16, .paletteNum = 15, .baseBlock = 0x001 }, [STATE_RESULTS_RANDOM - RESULTS_STATE_START] = { .bg = 0, .tilemapLeft = 4, .tilemapTop = 2, .width = 22, .height = 16, .paletteNum = 15, .baseBlock = 0x001 }, [STATE_RESULTS_CRUSHING - RESULTS_STATE_START] = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 2, .width = 24, .height = 16, .paletteNum = 15, .baseBlock = 0x001 }, DUMMY_WIN_TEMPLATE }; static const u8 sResultsWindowHeights[][MAX_RFU_PLAYERS - 1] = { { 6, 8, 9, 11 }, // "Presses" and "Neatness/Cooperative/Power" pages { 12, 14, 15, 16 }, // "Crushing" page }; static const u32 sPressingSpeedConversionTable[] = { // Hundred-millionths of a second 50000000, // 50 25000000, // 25 12500000, // 12.5 6250000, // 6.25 3125000, // 3.125 1562500, // 1.5625 781250, // 0.78125 390625 // 0.390625 }; static const u16 sBerryCrushCorePal[] = INCBIN_U16("graphics/berry_crush/crusher_base.gbapal"); static const u16 sBerryCrushImpactAndSparklesPal[] = INCBIN_U16("graphics/berry_crush/impact.gbapal"); static const u16 sBerryCrushTimerPal[] = INCBIN_U16("graphics/berry_crush/timer_digits.gbapal"); static const u32 sBerryCrushCoreTiles[] = INCBIN_U32("graphics/berry_crush/crusher_base.4bpp.lz"); static const u32 sBerryCrushImpactTiles[] = INCBIN_U32("graphics/berry_crush/impact.4bpp.lz"); static const u32 sBerryCrushPowderSparklesTiles[] = INCBIN_U32("graphics/berry_crush/sparkle.4bpp.lz"); static const u32 sBerryCrushTimerTiles[] = INCBIN_U32("graphics/berry_crush/timer_digits.4bpp.lz"); static const u32 sCrusherTop_Tilemap[] = INCBIN_U32("graphics/berry_crush/crusher_top.bin.lz"); static const u32 sContainerCap_Tilemap[] = INCBIN_U32("graphics/berry_crush/container_cap.bin.lz"); static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/berry_crush/bg.bin.lz"); // Takes the number of players - 2 and a player id and returns the // index into sPlayerCoords where that player should be seated static const u8 sPlayerIdToPosId[MAX_RFU_PLAYERS - 1][MAX_RFU_PLAYERS] = { {1, 3}, {0, 1, 3}, {1, 3, 2, 4}, {0, 1, 3, 2, 4} }; static const struct BerryCrushPlayerCoords sPlayerCoords[] = { { .playerId = 0, .windowGfxX = 0, .windowGfxY = 0, .impactXOffset = 0, .impactYOffset = -16, .berryXOffset = 0, .berryXDest = 0 }, { .playerId = 1, .windowGfxX = 0, .windowGfxY = 3, .impactXOffset = -28, .impactYOffset = -4, .berryXOffset = -24, .berryXDest = 16 }, { .playerId = 2, .windowGfxX = 0, .windowGfxY = 6, .impactXOffset = -16, .impactYOffset = 20, .berryXOffset = -8, .berryXDest = 16 }, { .playerId = 3, .windowGfxX = 20, .windowGfxY = 3, .impactXOffset = 28, .impactYOffset = -4, .berryXOffset = 32, .berryXDest = -8 }, { .playerId = 4, .windowGfxX = 20, .windowGfxY = 6, .impactXOffset = 16, .impactYOffset = 20, .berryXOffset = 16, .berryXDest = -8 }, }; static const s8 sImpactCoords[][2] = { { 0, 0}, {-1, 0}, { 1, 1} }; static const s8 sSparkleCoords[][2] = { { 0, 0}, {-16, -4}, { 16, -4}, { -8, -2}, { 8, -2}, {-24, -8}, { 24, -8}, {-32, -12}, { 32, -12}, {-40, -16}, { 40, -16} }; static const u16 sPlayerBerrySpriteTags[] = { TAG_PLAYER1_BERRY, TAG_PLAYER2_BERRY, TAG_PLAYER3_BERRY, TAG_PLAYER4_BERRY, TAG_PLAYER5_BERRY, }; static const struct CompressedSpriteSheet sSpriteSheets[] = { {sBerryCrushCoreTiles, 0x0800, TAG_CRUSHER_BASE}, {sBerryCrushImpactTiles, 0x0e00, GFXTAG_IMPACT}, {sBerryCrushPowderSparklesTiles, 0x0700, GFXTAG_SPARKLE}, {sBerryCrushTimerTiles, 0x02c0, TAG_TIMER_DIGITS}, {} }; static const struct SpritePalette sSpritePals[] = { {sBerryCrushCorePal, TAG_CRUSHER_BASE}, {sBerryCrushImpactAndSparklesPal, PALTAG_EFFECT}, {sBerryCrushTimerPal, TAG_TIMER_DIGITS}, {} }; static const union AnimCmd sAnim_CrusherBase[] = { ANIMCMD_FRAME(0x00, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Impact_Small[] = { ANIMCMD_FRAME(0x00, 4), ANIMCMD_FRAME(0x10, 4), ANIMCMD_FRAME(0x20, 4), ANIMCMD_END }; static const union AnimCmd sAnim_Impact_Big[] = { ANIMCMD_FRAME(0x30, 2), ANIMCMD_FRAME(0x40, 2), ANIMCMD_FRAME(0x50, 2), ANIMCMD_FRAME(0x60, 2), ANIMCMD_END }; static const union AnimCmd sAnim_Sparkle_Small[] = { ANIMCMD_FRAME(0x00, 2), ANIMCMD_FRAME(0x04, 2), ANIMCMD_FRAME(0x08, 2), ANIMCMD_FRAME(0x0c, 2), ANIMCMD_FRAME(0x10, 2), ANIMCMD_FRAME(0x14, 2), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Sparkle_Big[] = { ANIMCMD_FRAME(0x18, 4), ANIMCMD_FRAME(0x1c, 4), ANIMCMD_FRAME(0x20, 4), ANIMCMD_FRAME(0x24, 4), ANIMCMD_FRAME(0x28, 4), ANIMCMD_FRAME(0x2c, 4), ANIMCMD_FRAME(0x30, 4), ANIMCMD_FRAME(0x34, 4), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Timer[] = { ANIMCMD_FRAME(0x14, 0), ANIMCMD_END }; static const union AnimCmd sAnim_PlayerBerry[] = { ANIMCMD_FRAME(0x00, 0), ANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_PlayerBerry_0[] = { AFFINEANIMCMD_FRAME(Q_8_8(1.0), Q_8_8(1.0), 0, 0), AFFINEANIMCMD_FRAME(0, 0, 2, 1), AFFINEANIMCMD_JUMP(1) }; static const union AffineAnimCmd sAffineAnim_PlayerBerry_1[] = { AFFINEANIMCMD_FRAME(Q_8_8(1.0), Q_8_8(1.0), 0, 0), AFFINEANIMCMD_FRAME(0, 0, -2, 1), AFFINEANIMCMD_JUMP(1) }; static const union AnimCmd *const sAnimTable_BerryCrushCore[] = { sAnim_CrusherBase }; static const union AnimCmd *const sAnimTable_BerryCrushImpact[] = { sAnim_Impact_Small, sAnim_Impact_Big }; static const union AnimCmd *const sAnimTable_BerryCrushPowderSparkles[] = { sAnim_Sparkle_Small, sAnim_Sparkle_Big }; static const union AnimCmd *const sAnimTable_BerryCrushTimer[] = { sAnim_Timer }; static const union AnimCmd *const sAnimTable_PlayerBerry[] = { sAnim_PlayerBerry }; static const union AffineAnimCmd *const sAffineAnimTable_PlayerBerry[] = { sAffineAnim_PlayerBerry_0, sAffineAnim_PlayerBerry_1 }; static const struct SpriteTemplate sSpriteTemplate_BerryCrushCore = { .tileTag = TAG_CRUSHER_BASE, .paletteTag = TAG_CRUSHER_BASE, .oam = &gOamData_AffineOff_ObjNormal_64x64, .anims = sAnimTable_BerryCrushCore, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_BerryCrushImpact = { .tileTag = GFXTAG_IMPACT, .paletteTag = PALTAG_EFFECT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnimTable_BerryCrushImpact, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Impact }; static const struct SpriteTemplate sSpriteTemplate_BerryCrushPowderSparkles = { .tileTag = GFXTAG_SPARKLE, .paletteTag = PALTAG_EFFECT, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnimTable_BerryCrushPowderSparkles, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_BerryCrushTimer = { .tileTag = TAG_TIMER_DIGITS, .paletteTag = TAG_TIMER_DIGITS, .oam = &gOamData_AffineOff_ObjNormal_8x16, .anims = sAnimTable_BerryCrushTimer, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_PlayerBerry = { .tileTag = TAG_PLAYER1_BERRY, .paletteTag = TAG_PLAYER1_BERRY, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = sAnimTable_PlayerBerry, .affineAnims = sAffineAnimTable_PlayerBerry, .callback = SpriteCallbackDummy }; static const struct DigitObjUtilTemplate sDigitObjTemplates[] = { { .strConvMode = 1, .shape = SPRITE_SHAPE(8x16), .size = SPRITE_SIZE(8x16), .priority = 0, .oamCount = 2, .xDelta = 8, .x = 156, .y = 0, .spriteSheet = {.compressed = &sSpriteSheets[3]}, .spritePal = &sSpritePals[2], }, { .strConvMode = 0, .shape = SPRITE_SHAPE(8x16), .size = SPRITE_SIZE(8x16), .priority = 0, .oamCount = 2, .xDelta = 8, .x = 180, .y = 0, .spriteSheet = {.compressed = &sSpriteSheets[3]}, .spritePal = &sSpritePals[2], }, { .strConvMode = 0, .shape = SPRITE_SHAPE(8x16), .size = SPRITE_SIZE(8x16), .priority = 0, .oamCount = 2, .xDelta = 8, .x = 204, .y = 0, .spriteSheet = {.compressed = &sSpriteSheets[3]}, .spritePal = &sSpritePals[2], } }; static const u8 *const sBCRankingHeaders[] = { [RESULTS_PAGE_PRESSES] = gText_SpaceTimes2, [RESULTS_PAGE_RANDOM] = gText_XDotY, [RESULTS_PAGE_CRUSHING] = gText_StrVar1Berry, [RESULTS_PAGE_NEATNESS + NUM_RESULTS_PAGES] = gText_NeatnessRankings, [RESULTS_PAGE_COOPERATIVE + NUM_RESULTS_PAGES] = gText_CooperativeRankings, [RESULTS_PAGE_POWER + NUM_RESULTS_PAGES] = gText_PressingPowerRankings }; static struct BerryCrushGame *GetBerryCrushGame(void) { return sGame; } static u32 QuitBerryCrush(MainCallback callback) { if (sGame == NULL) return 2; if (callback == NULL) callback = sGame->savedCallback; DestroyTask(sGame->mainTask); FREE_AND_SET_NULL(sGame); SetMainCallback2(callback); if (callback == CB2_ReturnToField) { PlayNewMapMusic(MUS_POKE_CENTER); SetMainCallback1(CB1_Overworld); } return 0; } #define ERROR_EXIT(exitCallback) \ { \ SetMainCallback2(exitCallback); \ gRfu.errorParams[0] = 0; \ gRfu.errorParams[1] = 0; \ gRfu.errorState = 1; \ } void StartBerryCrush(MainCallback callback) { u8 playerCount = 0; u8 multiplayerId; if (!gReceivedRemoteLinkPlayers || gWirelessCommType == 0) { ERROR_EXIT(callback); return; } playerCount = GetLinkPlayerCount(); multiplayerId = GetMultiplayerId(); if (playerCount < 2 || multiplayerId >= playerCount) { ERROR_EXIT(callback); return; } sGame = AllocZeroed(sizeof(struct BerryCrushGame)); if (!sGame) { ERROR_EXIT(callback); return; } sGame->savedCallback = callback; sGame->localId = multiplayerId; sGame->playerCount = playerCount; SetNamesAndTextSpeed(sGame); sGame->gameState = STATE_INIT; sGame->nextCmd = CMD_FADE; sGame->afterPalFadeCmd = CMD_READY_BEGIN; SetPaletteFadeArgs(sGame->commandParams, TRUE, PALETTES_ALL, 0, 16, 0, RGB_BLACK); RunOrScheduleCommand(CMD_SHOW_GAME, SCHEDULE_CMD, sGame->commandParams); SetMainCallback2(MainCB); sGame->mainTask = CreateTask(MainTask, 8); } static void GetBerryFromBag(void) { if (gSpecialVar_ItemId < FIRST_BERRY_INDEX || gSpecialVar_ItemId > LAST_BERRY_INDEX + 1) gSpecialVar_ItemId = FIRST_BERRY_INDEX; else RemoveBagItem(gSpecialVar_ItemId, 1); sGame->players[sGame->localId].berryId = gSpecialVar_ItemId - FIRST_BERRY_INDEX; sGame->nextCmd = CMD_FADE; sGame->afterPalFadeCmd = CMD_WAIT_BERRIES; SetPaletteFadeArgs(sGame->commandParams, FALSE, PALETTES_ALL, 0, 16, 0, RGB_BLACK); RunOrScheduleCommand(CMD_SHOW_GAME, SCHEDULE_CMD, sGame->commandParams); sGame->mainTask = CreateTask(MainTask, 8); SetMainCallback2(MainCB); } static void ChooseBerry(void) { DestroyTask(sGame->mainTask); InitBerryPouch(BERRYPOUCH_FROMBERRYCRUSH, GetBerryFromBag, FALSE); } static void BerryCrush_SetVBlankCallback(void) { SetVBlankCallback(VBlankCB); } static void BerryCrush_InitVBlankCB(void) { SetVBlankCallback(NULL); } static void SaveResults(void) { u32 time, presses; time = sGame->results.time; time = Q_24_8(time); time = Q_24_8_div(time, Q_24_8(60)); presses = sGame->results.totalAPresses; presses = Q_24_8(presses); presses = Q_24_8_div(presses, time) & 0xFFFF; sGame->pressingSpeed = presses; switch (sGame->playerCount) { case 2: if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[0]) { sGame->newRecord = TRUE; gSaveBlock2Ptr->berryCrush.pressingSpeeds[0] = sGame->pressingSpeed; } break; case 3: if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[1]) { sGame->newRecord = TRUE; gSaveBlock2Ptr->berryCrush.pressingSpeeds[1] = sGame->pressingSpeed; } break; case 4: if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[2]) { sGame->newRecord = TRUE; gSaveBlock2Ptr->berryCrush.pressingSpeeds[2] = sGame->pressingSpeed; } break; case 5: if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[3]) { sGame->newRecord = TRUE; gSaveBlock2Ptr->berryCrush.pressingSpeeds[3] = sGame->pressingSpeed; } break; } sGame->powder = sGame->results.powder; if (GiveBerryPowder(sGame->powder)) return; sGame->noRoomForPowder = TRUE; } static void VBlankCB(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); } static void MainCB(void) { RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); } static void MainTask(u8 taskId) { if (sGame->cmdCallback != NULL) sGame->cmdCallback(sGame, sGame->commandParams); UpdateGame(sGame); } static void SetNamesAndTextSpeed(struct BerryCrushGame *game) { u8 i; for (i = 0; i < game->playerCount; i++) { StringCopy(game->players[i].name, gLinkPlayers[i].name); game->players[i].name[PLAYER_NAME_LENGTH] = EOS; } for (; i < 5; i++) { memset(game->players[i].name, 1, PLAYER_NAME_LENGTH); game->players[i].name[PLAYER_NAME_LENGTH] = EOS; } switch (gSaveBlock2Ptr->optionsTextSpeed) { case OPTIONS_TEXT_SPEED_SLOW: game->textSpeed = 8; break; case OPTIONS_TEXT_SPEED_MID: game->textSpeed = 4; break; case OPTIONS_TEXT_SPEED_FAST: case OPTIONS_TEXT_SPEED_INSTANT: game->textSpeed = 1; break; } } // GF file break static void RunOrScheduleCommand(u16 command, u8 runMode, u8 *args) { struct BerryCrushGame * game = GetBerryCrushGame(); if (command >= NELEMS(sBerryCrushCommands)) command = CMD_NONE; switch (runMode) { case RUN_CMD: // Call now and set followup to game->nextCmd if (command != CMD_NONE) sBerryCrushCommands[command](game, args); if (game->nextCmd >= NELEMS(sBerryCrushCommands)) game->nextCmd = CMD_NONE; game->cmdCallback = sBerryCrushCommands[game->nextCmd]; break; case SCHEDULE_CMD: // Schedule for next frame game->cmdCallback = sBerryCrushCommands[command]; break; } } static u32 Cmd_BeginNormalPaletteFade(struct BerryCrushGame * game, u8 *args) { // args points to packed values: // bytes 0-3: selectedPals (bitfield) // byte 4: delay // byte 5: startY // byte 6: stopY // bytes 7-8: fade color // byte 9: if TRUE, communicate on fade complete u16 color; u32 selectedPals[2]; selectedPals[0] = (u32)bSelectedPals(0); selectedPals[1] = (u32)bSelectedPals(1); selectedPals[1] <<= 8; selectedPals[0] |= selectedPals[1]; selectedPals[1] = (u32)bSelectedPals(2); selectedPals[1] <<= 16; selectedPals[0] |= selectedPals[1]; selectedPals[1] = (u32)bSelectedPals(3); selectedPals[1] <<= 24; selectedPals[0] |= selectedPals[1]; bWaitFadeCommAfter = bCommunicateAfter; color = bPalette(1); color <<= 8; color |= bPalette(0); gPaletteFade.bufferTransferDisabled = FALSE; BeginNormalPaletteFade(selectedPals[0], bDelay, bStartY, bTargetY, color); UpdatePaletteFade(); game->nextCmd = CMD_WAIT_FADE; return 0; } static u32 Cmd_WaitPaletteFade(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: if (UpdatePaletteFade()) return 0; if (bWaitFadeCommAfter) ++game->cmdState; else game->cmdState = 3; return 0; case 1: Rfu_SetLinkStandbyCallback(); ++game->cmdState; return 0; case 2: if (IsLinkTaskFinished()) { ++game->cmdState; return 0; } return 0; case 3: RunOrScheduleCommand(game->afterPalFadeCmd, SCHEDULE_CMD, NULL); game->cmdState = 0; return 0; default: ++game->cmdState; return 0; } } static u32 Cmd_PrintMessage(struct BerryCrushGame * game, u8 *args) { // args[0]: msg id // args[1]: flags // args[2]: keys lo // args[3]: keys hi // args[4]: follow-up cmd state u16 keys; keys = bKeys(1); keys <<= 8; keys |= bKeys(0) << 0; switch (game->cmdState) { case 0: DrawDialogueFrame(0, FALSE); if (bFlags & F_MSG_EXPAND) { StringExpandPlaceholders(gStringVar4, sMessages[bMsgId]); AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, game->textSpeed, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } else { AddTextPrinterParameterized2(0, FONT_NORMAL, sMessages[bMsgId], game->textSpeed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } CopyWindowToVram(0, COPYWIN_FULL); break; case 1: if (!IsTextPrinterActive(0)) { if (keys == 0) ++game->cmdState; break; } return 0; case 2: if (!JOY_NEW(keys)) return 0; break; case 3: if (bFlags & F_MSG_CLEAR) ClearDialogWindowAndFrame(0, TRUE); RunOrScheduleCommand(game->nextCmd, SCHEDULE_CMD, NULL); game->cmdState = bNextCmdState; return 0; } ++game->cmdState; return 0; } static u32 Cmd_ShowGameDisplay(struct BerryCrushGame * game, u8 *args) { if (ShowGameDisplay()) RunOrScheduleCommand(game->nextCmd, RUN_CMD, game->commandParams); return 0; } static u32 Cmd_HideGameDisplay(struct BerryCrushGame * game, u8 *args) { if (HideGameDisplay()) RunOrScheduleCommand(game->nextCmd, RUN_CMD, game->commandParams); return 0; } static u32 Cmd_SignalReadyToBegin(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: Rfu_SetLinkStandbyCallback(); break; case 1: if (IsLinkTaskFinished()) { PlayNewMapMusic(MUS_GAME_CORNER); RunOrScheduleCommand(CMD_ASK_PICK_BERRY, SCHEDULE_CMD, NULL); game->gameState = STATE_PICK_BERRY; game->cmdState = 0; } return 0; } ++game->cmdState; return 0; } static u32 Cmd_AskPickBerry(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { default: ++game->cmdState; break; case 0: ResetGame(game); SetPrintMessageArgs(args, MSG_PICK_BERRY, F_MSG_CLEAR, 0, CMD_FADE); game->nextCmd = CMD_ASK_PICK_BERRY; RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); break; case 1: game->nextCmd = CMD_PICK_BERRY; RunOrScheduleCommand(CMD_HIDE_GAME, SCHEDULE_CMD, NULL); game->cmdState = 2; break; } return 0; } static u32 Cmd_GoToBerryPouch(struct BerryCrushGame * game, u8 *args) { game->cmdCallback = NULL; SetMainCallback2(ChooseBerry); return 0; } static u32 Cmd_WaitForOthersToPickBerries(struct BerryCrushGame * game, u8 *args) { u8 i; switch (game->cmdState) { case 0: SetPrintMessageArgs(args, MSG_WAIT_PICK, 0, 0, CMD_FADE); game->nextCmd = CMD_WAIT_BERRIES; RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); return 0; case 1: Rfu_SetLinkStandbyCallback(); break; case 2: if (!IsLinkTaskFinished()) return 0; memset(game->sendCmd, 0, sizeof(game->sendCmd)); game->sendCmd[0] = game->players[game->localId].berryId; SendBlock(0, game->sendCmd, 2); break; case 3: if (!IsLinkTaskFinished()) return 0; game->cmdTimer = 0; break; case 4: if (GetBlockReceivedStatus() != sReceivedPlayerBitmasks[game->playerCount - 2]) return 0; for (i = 0; i < game->playerCount; ++i) { game->players[i].berryId = gBlockRecvBuffer[i][0]; if (game->players[i].berryId > LAST_BERRY_INDEX + 1) game->players[i].berryId = 0; game->targetAPresses += gBerryCrush_BerryData[game->players[i].berryId].difficulty; game->powder += gBerryCrush_BerryData[game->players[i].berryId].powder; } game->cmdTimer = 0; ResetBlockReceivedFlags(); game->targetDepth = Q_24_8_div(Q_24_8(game->targetAPresses), Q_24_8(32)); break; case 5: ClearDialogWindowAndFrame(0, TRUE); RunOrScheduleCommand(CMD_DROP_BERRIES, SCHEDULE_CMD, NULL); game->gameState = STATE_DROP_BERRIES; game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_DropBerriesIntoCrusher(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: CreateBerrySprites(game, &game->gfx); Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) return 0; game->gfx.counter = 0; game->gfx.vibrationIdx = 0; game->gfx.numVibrations = 0; game->gfx.vibrating = 0; break; case 2: game->gfx.berrySprites[game->gfx.counter]->callback = SpriteCB_DropBerryIntoCrusher; game->gfx.berrySprites[game->gfx.counter]->affineAnimPaused = FALSE; PlaySE(SE_BALL_THROW); break; case 3: if (game->gfx.berrySprites[game->gfx.counter]->callback == SpriteCB_DropBerryIntoCrusher) return 0; game->gfx.berrySprites[game->gfx.counter] = NULL; ++game->gfx.counter; Rfu_SetLinkStandbyCallback(); break; case 4: if (!IsLinkTaskFinished()) return 0; if (game->gfx.counter < game->playerCount) { game->cmdState = 2; return 0; } game->gfx.counter = 0; break; case 5: BerryCrushFreeBerrySpriteGfx(game, &game->gfx); Rfu_SetLinkStandbyCallback(); break; case 6: if (!IsLinkTaskFinished()) return 0; PlaySE(SE_FALL); RunOrScheduleCommand(CMD_DROP_LID, SCHEDULE_CMD, NULL); game->gameState = STATE_DROP_LID; game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_DropLid(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: game->depth += 4; if (game->depth < 0) return 0; game->depth = 0; game->gfx.vibrationIdx = 4; game->gfx.counter = 0; game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0]; PlaySE(SE_M_STRENGTH); break; case 1: game->vibration = sIntroOutroVibrationData[game->gfx.vibrationIdx][game->gfx.counter]; SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration); SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration); SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration); ++game->gfx.counter; if (game->gfx.counter < game->gfx.numVibrations) return 0; if (game->gfx.vibrationIdx == 0) break; --game->gfx.vibrationIdx; game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0]; game->gfx.counter = 0; return 0; case 2: game->vibration = 0; SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); Rfu_SetLinkStandbyCallback(); break; case 3: if (!IsLinkTaskFinished()) return 0; RunOrScheduleCommand(CMD_COUNTDOWN, SCHEDULE_CMD, NULL); game->gameState = STATE_COUNTDOWN; game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_Countdown(struct BerryCrushGame * game, u8 *args) { switch (game-> cmdState) { case 0: Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) return 0; StartMinigameCountdown(TAG_COUNTDOWN, TAG_COUNTDOWN, 120, 80, 0); break; case 2: if (IsMinigameCountdownRunning()) return 0; Rfu_SetLinkStandbyCallback(); break; case 3: if (!IsLinkTaskFinished()) return 0; game->gfx.counter = 0; game->gfx.vibrationIdx = 0; game->gfx.numVibrations = 0; game->gfx.vibrating = FALSE; game->cmdTimer = 0; if (game->localId == 0) RunOrScheduleCommand(CMD_PLAY_GAME_LEADER, SCHEDULE_CMD, NULL); else RunOrScheduleCommand(CMD_PLAY_GAME_MEMBER, SCHEDULE_CMD, NULL); game->gameState = STATE_PLAYING; game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static void HandlePartnerInput(struct BerryCrushGame * game) { u8 numPlayersPressed = 0; u8 i = 0; u16 timeDiff; s32 temp = 0; struct BerryCrushGame_LinkState *linkState; for (i = 0; i < game->playerCount; ++i) { linkState = (struct BerryCrushGame_LinkState *)gRecvCmds[i]; if ((linkState->rfuCmd & 0xFF00) != RFUCMD_SEND_PACKET) continue; if (linkState->sendFlag != SEND_GAME_STATE) continue; if (linkState->pushedAButton) { game->localState.playerPressedAFlags |= sBitTable[i]; game->players[i].inputState = 1; ++game->players[i].numAPresses; ++numPlayersPressed; timeDiff = game->timer - game->players[i].inputTime; // If the interval between inputs is regular, the input is considered "neat" // This counts toward the player's neatness score if (timeDiff >= game->players[i].timeSincePrevInput - 1 && timeDiff <= game->players[i].timeSincePrevInput + 1) { // On neat input streak ++game->players[i].neatInputStreak; game->players[i].timeSincePrevInput = timeDiff; if (game->players[i].neatInputStreak > game->players[i].maxNeatInputStreak) game->players[i].maxNeatInputStreak = game->players[i].neatInputStreak; } else { // End neat input streak game->players[i].neatInputStreak = 0; game->players[i].timeSincePrevInput = timeDiff; } game->players[i].inputTime = game->timer; ++game->players[i].inputFlags; if (game->players[i].inputFlags > F_INPUT_HIT_B) game->players[i].inputFlags = 0; } else { game->players[i].inputState = INPUT_STATE_NONE; } } if (numPlayersPressed > 1) { // For each player that pressed A, flag their input as synchronous // This is used to change their impact sprite to a big impact for (i = 0; i < game->playerCount; ++i) { if (game->players[i].inputState == INPUT_STATE_NONE) continue; game->players[i].inputState |= INPUT_STATE_HIT_SYNC; ++game->players[i].numSyncedAPresses; } } if (numPlayersPressed == 0) return; game->bigSparkleCounter += numPlayersPressed; numPlayersPressed += sSyncPressBonus[numPlayersPressed - 1]; game->sparkleCounter += numPlayersPressed; game->totalAPresses += numPlayersPressed; if (game->targetAPresses - game->totalAPresses > 0) { temp = game->totalAPresses; temp = Q_24_8(temp); temp = Q_24_8_div(temp, game->targetDepth); temp = Q_24_8_TO_INT(temp); game->newDepth = (u8)temp; return; } // Target number of A presses has been reached, game is complete game->newDepth = 32; game->localState.endGame = TRUE; } static void BerryCrush_BuildLocalState(struct BerryCrushGame * game) { u8 numPlayersPressed = 0; u16 r1 = 0; u8 i = 0; for (i = 0; i < game->playerCount; ++i) { if (game->players[i].inputState != 0) { ++numPlayersPressed; r1 = game->players[i].inputFlags + 1; if (game->players[i].inputState & 2) r1 |= 4; r1 <<= 3 * i; game->localState.inputFlags |= r1; } } game->localState.depth = game->newDepth; if (numPlayersPressed == 0) { if (game->gfx.vibrating != 0) ++game->gfx.counter; } else if (game->gfx.vibrating != 0) { if (numPlayersPressed != game->gfx.vibrationIdx) { game->gfx.vibrationIdx = numPlayersPressed - 1; game->gfx.numVibrations = sVibrationData[numPlayersPressed - 1][0]; } else { ++game->gfx.counter; } } else { game->gfx.counter = 0; game->gfx.vibrationIdx = numPlayersPressed - 1; game->gfx.numVibrations = sVibrationData[numPlayersPressed - 1][0]; game->gfx.vibrating = 1; } if (game->gfx.vibrating != 0) { if (game->gfx.counter >= game->gfx.numVibrations) { game->gfx.counter = 0; game->gfx.vibrationIdx = 0; game->gfx.numVibrations = 0; game->gfx.vibrating = 0; r1 = 0; } else { r1 = sVibrationData[game->gfx.vibrationIdx][game->gfx.counter + 1]; } game->localState.vibration = r1; } else { game->localState.vibration = 0; } game->localState.timer = game->leaderTimer; } static void HandlePlayerInput(struct BerryCrushGame * game) { if (JOY_NEW(A_BUTTON)) game->localState.pushedAButton = TRUE; if (JOY_HELD(A_BUTTON)) { if (game->players[game->localId].timePressingA < game->timer) ++game->players[game->localId].timePressingA; } // Only send data to other players if you are the leader or you pressed A if (game->localId != 0 && !game->localState.pushedAButton) return; game->localState.sendFlag = SEND_GAME_STATE; // Every 30 frames, check whether the sparkles produced should be big, // depending on how many A presses there were in that time if (game->timer % 30 == 0) { if (game->bigSparkleCounter > sBigSparkleThresholds[game->playerCount - 2]) { ++game->numBigSparkles; game->bigSparkle = TRUE; } else { game->bigSparkle = FALSE; } game->bigSparkleCounter = 0; ++game->numBigSparkleChecks; } // Every 15 frames, update the amount of sparkles that should be produced, // depending on how many A presses there were in that time (including the bonus) if (game->timer % 15 == 0) { // BUG: The wrong field is used twice below // As a result, only a sparkleAmount of 0, 1, or 4 is attainable #ifdef BUGFIX #define field sparkleAmount #else #define field sparkleCounter #endif if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][0]) game->sparkleAmount = 0; else if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][1]) game->sparkleAmount = 1; else if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][2]) game->field = 2; else if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][3]) game->field = 3; else game->sparkleAmount = 4; game->sparkleCounter = 0; #undef field } else { ++game->cmdTimer; if (game->cmdTimer > 60) { if (game->cmdTimer > 70) { ClearRecvCommands(); game->cmdTimer = 0; } else if (game->localState.playerPressedAFlags == 0) { ClearRecvCommands(); game->cmdTimer = 0; } } } if (game->timer >= MAX_TIME) game->localState.endGame = TRUE; game->localState.bigSparkle = game->bigSparkle; game->localState.sparkleAmount = game->sparkleAmount; memcpy(&game->sendCmd, &game->localState, sizeof(game->sendCmd)); Rfu_SendPacket(game->sendCmd); } static void RecvLinkData(struct BerryCrushGame * game) { u8 i = 0; struct BerryCrushGame_LinkState * linkState = NULL; for (i = 0; i < game->playerCount; ++i) game->players[i].inputState = INPUT_STATE_NONE; if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) { game->playedSound = FALSE; return; } if (gRecvCmds[0][1] != SEND_GAME_STATE) { game->playedSound = FALSE; return; } memcpy(game->recvCmd, gRecvCmds[0], sizeof(game->recvCmd)); linkState = (struct BerryCrushGame_LinkState *)&game->recvCmd; game->depth = linkState->depth; game->vibration = linkState->vibration; game->timer = linkState->timer; UpdateInputEffects(game, &game->gfx); if (linkState->endGame) game->endGame = TRUE; } static u32 Cmd_PlayGame_Leader(struct BerryCrushGame * game, u8 *args) { memset(&game->localState, 0, sizeof(game->localState)); memset(&game->recvCmd, 0, sizeof(game->recvCmd)); RecvLinkData(game); SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration); SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration); SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration); if (game->endGame) { if (game->timer >= MAX_TIME) { game->timer = MAX_TIME; RunOrScheduleCommand(CMD_TIMES_UP, SCHEDULE_CMD, NULL); } else { RunOrScheduleCommand(CMD_FINISH_GAME, SCHEDULE_CMD, NULL); } game->cmdTimer = 0; game->cmdState = 0; return 0; } else { ++game->leaderTimer; HandlePartnerInput(game); BerryCrush_BuildLocalState(game); HandlePlayerInput(game); return 0; } } static u32 Cmd_PlayGame_Member(struct BerryCrushGame * game, u8 *args) { memset(&game->localState, 0, sizeof(game->localState)); memset(&game->recvCmd, 0, sizeof(game->recvCmd)); RecvLinkData(game); SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration); SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration); SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration); if (game->endGame) { if (game->timer >= MAX_TIME) { game->timer = MAX_TIME; RunOrScheduleCommand(CMD_TIMES_UP, SCHEDULE_CMD, NULL); } else { RunOrScheduleCommand(CMD_FINISH_GAME, SCHEDULE_CMD, NULL); } game->cmdTimer = 0; game->cmdState = 0; return 0; } else { HandlePlayerInput(game); return 0; } } // Game was 'won', crusher was pushed down fully before time was up static u32 Cmd_FinishGame(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: game->gameState = STATE_FINISHED; PlaySE(SE_M_STRENGTH); BlendPalettes(PALETTES_ALL, 8, RGB(31, 31, 0)); game->gfx.counter = 2; break; case 1: if (--game->gfx.counter != UINT8_MAX) return 0; BlendPalettes(PALETTES_ALL, 0, RGB(31, 31, 0)); game->gfx.vibrationIdx = 4; game->gfx.counter = 0; game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0]; break; case 2: game->vibration = sIntroOutroVibrationData[game->gfx.vibrationIdx][game->gfx.counter]; SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration); SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration); SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration); if (++game->gfx.counter < game->gfx.numVibrations) return 0; if (game->gfx.vibrationIdx != 0) { --game->gfx.vibrationIdx; game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0]; game->gfx.counter = 0; return 0; } break; case 3: game->vibration = 0; SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); break; case 4: if (!AreEffectsFinished(game, &game->gfx)) return 0; Rfu_SetLinkStandbyCallback(); game->cmdTimer = 0; break; case 5: if (!IsLinkTaskFinished()) return 0; RunOrScheduleCommand(CMD_CALC_RESULTS, SCHEDULE_CMD, NULL); game->cmdTimer = 0; game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_HandleTimeUp(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: game->gameState = STATE_TIMES_UP; PlaySE(SE_FAILURE); BlendPalettes(PALETTES_ALL, 8, RGB(31, 0, 0)); game->gfx.counter = 4; break; case 1: if (--game->gfx.counter != UINT8_MAX) return 0; BlendPalettes(PALETTES_ALL, 0, RGB(31, 0, 0)); game->gfx.counter = 0; break; case 2: if (!AreEffectsFinished(game, &game->gfx)) return 0; Rfu_SetLinkStandbyCallback(); game->cmdTimer = 0; SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); break; case 3: if (!IsLinkTaskFinished()) return 0; ConvertIntToDecimalStringN(gStringVar1, game->powder, STR_CONV_MODE_LEFT_ALIGN, 6); SetPrintMessageArgs(args, MSG_TIMES_UP, F_MSG_CLEAR, 0, CMD_NONE); game->nextCmd = CMD_SAVE; RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); game->cmdTimer = 0; game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_TabulateResults(struct BerryCrushGame * game, u8 *args) { u8 i, j, tempPlayerId; s32 temp1, temp2; u16 tempStat; switch (game->cmdState) { case 0: memset(game->sendCmd, 0, 2 * sizeof(u16)); if (game->players[game->localId].timePressingA > game->timer) game->players[game->localId].timePressingA = game->timer; game->sendCmd[0] = game->players[game->localId].timePressingA; SendBlock(0, game->sendCmd, 2); break; case 1: if (!IsLinkTaskFinished()) return 0; game->cmdTimer = 0; break; case 2: if (GetBlockReceivedStatus() != sReceivedPlayerBitmasks[game->playerCount - 2]) return 0; for (i = 0; i < game->playerCount; ++i) game->players[i].timePressingA = gBlockRecvBuffer[i][0]; game->cmdTimer = 0; game->sendCmd[0] = 0; ResetBlockReceivedFlags(); // If player is not leader, skip the steps // where the results are calculated and sent. // Group members just read the results sent // to them by the leader. if (game->localId == 0) game->cmdState = 3; else game->cmdState = 6; return 0; case 3: memset(&game->results, 0, sizeof(struct BerryCrushGame_Results)); game->results.time = game->timer; game->results.targetPressesPerSec = game->targetAPresses / (game->timer / 60); // Calculate silkiness // Silkiness is the percentage of times big sparkles were produced when possible, // which itself depends on the number of A presses every 30 frames // (numBigSparkles * 50 / numBigSparkleChecks) + 50 temp1 = Q_24_8_mul(Q_24_8(game->numBigSparkles), Q_24_8(50)); temp1 = Q_24_8_div(temp1, Q_24_8(game->numBigSparkleChecks)) + Q_24_8(50); temp1 = Q_24_8_TO_INT(temp1); game->results.silkiness = temp1 & 0x7F; // Calculate amount of powder temp1 = Q_24_8(temp1); temp1 = Q_24_8_div(temp1, Q_24_8(100)); temp2 = Q_24_8(game->powder * game->playerCount); temp2 = Q_24_8_mul(temp2, temp1); game->results.powder = Q_24_8_TO_INT(temp2); // Choose random second results page game->results.randomPageId = Random() % NUM_RANDOM_RESULTS_PAGES; for (i = 0; i < game->playerCount; ++i) { game->results.playerIdsRanked[0][i] = i; game->results.playerIdsRanked[1][i] = i; game->results.stats[RESULTS_PAGE_PRESSES][i] = game->players[i].numAPresses; game->results.totalAPresses += game->results.stats[RESULTS_PAGE_PRESSES][i]; // Calculate value for random second results page switch (game->results.randomPageId) { case RESULTS_PAGE_NEATNESS: if (game->players[i].numAPresses != 0) { // Calculate percentage of inputs that were in largest "neat" streak // "Neat" inputs are those done at a regular interval temp1 = game->players[i].maxNeatInputStreak; temp1 = Q_24_8(temp1); temp1 = Q_24_8_mul(temp1, Q_24_8(100)); temp2 = game->players[i].numAPresses; temp2 = Q_24_8(temp2); temp2 = Q_24_8_div(temp1, temp2); } else { temp2 = 0; } break; case RESULTS_PAGE_COOPERATIVE: if (game->players[i].numAPresses != 0) { // Calculate percentage of inputs that were // done at the same time as another player temp1 = game->players[i].numSyncedAPresses; temp1 = Q_24_8(temp1); temp1 = Q_24_8_mul(temp1, Q_24_8(100)); temp2 = game->players[i].numAPresses; temp2 = Q_24_8(temp2); temp2 = Q_24_8_div(temp1, temp2); } else { temp2 = 0; } break; case RESULTS_PAGE_POWER: if (game->players[i].numAPresses == 0) { temp2 = 0; } else if (game->players[i].timePressingA >= game->timer) { // Spent 100% of the time pressing A temp2 = Q_24_8(100); } else { // Calculate percentage of time the // player spent pressing A temp1 = game->players[i].timePressingA; temp1 = Q_24_8(temp1); temp1 = Q_24_8_mul(temp1, Q_24_8(100)); temp2 = game->timer; temp2 = Q_24_8(temp2); temp2 = Q_24_8_div(temp1, temp2); } break; } temp2 >>= 4; game->results.stats[RESULTS_PAGE_RANDOM][i] = temp2; } break; case 4: for (i = 0; i < game->playerCount - 1; ++i) { for (j = game->playerCount - 1; j > i; --j) { if (game->results.stats[RESULTS_PAGE_PRESSES][j - 1] < game->results.stats[RESULTS_PAGE_PRESSES][j]) { SWAP(game->results.stats[RESULTS_PAGE_PRESSES][j], game->results.stats[RESULTS_PAGE_PRESSES][j - 1], tempStat); SWAP(game->results.playerIdsRanked[0][j], game->results.playerIdsRanked[0][j - 1], tempPlayerId); } if (game->results.stats[RESULTS_PAGE_RANDOM][j - 1] < game->results.stats[RESULTS_PAGE_RANDOM][j]) { SWAP(game->results.stats[RESULTS_PAGE_RANDOM][j], game->results.stats[RESULTS_PAGE_RANDOM][j - 1], tempStat); SWAP(game->results.playerIdsRanked[1][j], game->results.playerIdsRanked[1][j - 1], tempPlayerId); } } } SendBlock(0, &game->results, sizeof(struct BerryCrushGame_Results)); break; case 5: if (!IsLinkTaskFinished()) return 0; game->cmdTimer = 0; break; case 6: if (GetBlockReceivedStatus() != 1) return 0; memset(&game->results, 0, sizeof(struct BerryCrushGame_Results)); memcpy(&game->results, gBlockRecvBuffer, sizeof(struct BerryCrushGame_Results)); ResetBlockReceivedFlags(); game->cmdTimer = 0; break; case 7: SaveResults(); RunOrScheduleCommand(CMD_SHOW_RESULTS, SCHEDULE_CMD, NULL); game->gameState = STATE_RESULTS_PRESSES; game->cmdState = 0; game->newDepth = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_ShowResults(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: if (!OpenResultsWindow(game, &game->gfx)) return 0; break; case 1: CopyBgTilemapBufferToVram(0); game->gfx.counter = 30; break; case 2: if (game->gfx.counter != 0) { --game->gfx.counter; return 0; } if (!JOY_NEW(A_BUTTON)) return 0; PlaySE(SE_SELECT); CloseResultsWindow(game); break; case 3: if (game->gameState <= STATE_RESULTS_RANDOM) { ++game->gameState; game->cmdState = 0; return 0; } break; case 4: ConvertIntToDecimalStringN(gStringVar1, game->powder, STR_CONV_MODE_LEFT_ALIGN, 6); ConvertIntToDecimalStringN(gStringVar2, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 6); SetPrintMessageArgs(args, MSG_POWDER, F_MSG_CLEAR | F_MSG_EXPAND, 0, CMD_NONE); game->nextCmd = CMD_SAVE; RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_SaveGame(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: if (game->timer >= MAX_TIME) HideTimer(&game->gfx); SetPrintMessageArgs(args, MSG_COMM_STANDBY, 0, 0, CMD_FADE); game->nextCmd = CMD_SAVE; RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); game->cmdState = 0; return 0; case 1: Rfu_SetLinkStandbyCallback(); break; case 2: if (!IsLinkTaskFinished()) return 0; DrawDialogueFrame(0, FALSE); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_SavingDontTurnOffThePower2, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(0, COPYWIN_FULL); CreateTask(Task_LinkFullSave, 0); break; case 3: if (FuncIsActiveTask(Task_LinkFullSave)) return 0; break; case 4: RunOrScheduleCommand(CMD_ASK_PLAY_AGAIN, SCHEDULE_CMD, NULL); game->gameState = STATE_PLAY_AGAIN; game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_AskPlayAgain(struct BerryCrushGame * game, u8 *args) { s8 input = 0; switch (game->cmdState) { case 0: SetPrintMessageArgs(args, MSG_PLAY_AGAIN, 0, 0, CMD_FADE); game->nextCmd = CMD_ASK_PLAY_AGAIN; RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); game->cmdState = 0; // State is progressed by CMD_PRINT_MSG return 0; case 1: DisplayYesNoMenuDefaultYes(); break; case 2: input = Menu_ProcessInputNoWrapClearOnChoose(); if (input != LIST_CANCEL) { memset(game->sendCmd, 0, sizeof(game->sendCmd)); if (input == 0) { if (HasAtLeastOneBerry()) game->playAgainState = PLAY_AGAIN_YES; else game->playAgainState = PLAY_AGAIN_NO_BERRIES; } else { game->playAgainState = PLAY_AGAIN_NO; } ClearDialogWindowAndFrame(0, TRUE); SetPrintMessageArgs(args, MSG_COMM_STANDBY, 0, 0, CMD_NONE); game->nextCmd = CMD_COMM_PLAY_AGAIN; RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); game->cmdState = 0; } return 0; } ++game->cmdState; return 0; } static u32 Cmd_CommunicatePlayAgainResponses(struct BerryCrushGame * game, u8 *args) { u8 i = 0; switch (game->cmdState) { case 0: Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) return 0; // Send player's Yes/No response to partners game->sendCmd[0] = game->playAgainState; game->recvCmd[0] = 0; SendBlock(0, game->sendCmd, sizeof(u16)); break; case 2: if (!IsLinkTaskFinished()) return 0; game->cmdTimer = 0; break; case 3: // Wait for partners responses if (GetBlockReceivedStatus() != sReceivedPlayerBitmasks[game->playerCount - 2]) return 0; // Read partners responses for (i = 0; i < game->playerCount; ++i) game->recvCmd[0] += gBlockRecvBuffer[i][0]; if (game->recvCmd[0] != PLAY_AGAIN_YES) RunOrScheduleCommand(CMD_PLAY_AGAIN_NO, SCHEDULE_CMD, NULL); else RunOrScheduleCommand(CMD_PLAY_AGAIN_YES, SCHEDULE_CMD, NULL); ResetBlockReceivedFlags(); game->sendCmd[0] = 0; game->recvCmd[0] = 0; game->cmdTimer = 0; game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_PlayAgain(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 1, 0, 0x10, RGB_BLACK); UpdatePaletteFade(); break; case 1: if (UpdatePaletteFade()) return 0; break; case 2: ClearDialogWindowAndFrame(0, TRUE); ResetCrusherPos(game); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); UpdatePaletteFade(); break; case 3: if (UpdatePaletteFade()) return 0; RunOrScheduleCommand(CMD_ASK_PICK_BERRY, SCHEDULE_CMD, NULL); game->gameState = STATE_PICK_BERRY; game->cmdState = 0; return 0; } ++game->cmdState; return 0; } static u32 Cmd_StopGame(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: DrawDialogueFrame(0, FALSE); if (game->playAgainState == PLAY_AGAIN_NO_BERRIES) AddTextPrinterParameterized2(0, FONT_NORMAL, sMessages[MSG_NO_BERRIES], game->textSpeed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); else AddTextPrinterParameterized2(0, FONT_NORMAL, sMessages[MSG_DROPPED], game->textSpeed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(0, COPYWIN_FULL); break; case 1: if (IsTextPrinterActive(0)) return 0; game->gfx.counter = 120; break; case 2: if (game->gfx.counter != 0) --game->gfx.counter; else { RunOrScheduleCommand(CMD_CLOSE_LINK, SCHEDULE_CMD, NULL); game->cmdState = 0; } return 0; } ++game->cmdState; return 0; } static u32 Cmd_CloseLink(struct BerryCrushGame * game, u8 *args) { switch (game->cmdState) { case 0: Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) return 0; SetCloseLinkCallback(); break; case 2: if (gReceivedRemoteLinkPlayers) return 0; game->nextCmd = CMD_QUIT; RunOrScheduleCommand(CMD_HIDE_GAME, SCHEDULE_CMD, NULL); game->cmdState = 2; // State is not progressed return 0; } ++game->cmdState; return 0; } static u32 Cmd_Quit(struct BerryCrushGame * game, u8 *args) { QuitBerryCrush(NULL); return 0; } static void ResetGame(struct BerryCrushGame * game) { u8 i = 0; IncrementGameStat(GAME_STAT_BERRY_CRUSH_POINTS); game->unused = 0; game->cmdTimer = 0; game->gameState = STATE_RESET; game->playAgainState = PLAY_AGAIN_YES; game->powder = 0; game->targetAPresses = 0; game->totalAPresses = 0; game->targetDepth = 0; game->newDepth = 0; game->noRoomForPowder = FALSE; game->newRecord = FALSE; game->playedSound = FALSE; game->endGame = FALSE; game->bigSparkle = FALSE; game->sparkleAmount = 0; game->leaderTimer = 0; game->timer = 0; game->bigSparkleCounter = 0; game->numBigSparkleChecks = -1; game->numBigSparkles = 0; game->sparkleCounter = 0; for (i = 0; i < MAX_RFU_PLAYERS; ++i) { game->players[i].berryId = -1; game->players[i].inputTime = 0; game->players[i].neatInputStreak = 0; game->players[i].timeSincePrevInput = 1; game->players[i].maxNeatInputStreak = 0; game->players[i].numAPresses = 0; game->players[i].numSyncedAPresses = 0; game->players[i].timePressingA = 0; game->players[i].inputFlags = 0; game->players[i].inputState = INPUT_STATE_NONE; } } static void SetPaletteFadeArgs(u8 *args, bool8 communicateAfter, u32 selectedPals, s8 delay, u8 startY, u8 targetY, u16 palette) { bSelectedPals(0) = ((u8 *)&selectedPals)[0]; bSelectedPals(1) = ((u8 *)&selectedPals)[1]; bSelectedPals(2) = ((u8 *)&selectedPals)[2]; bSelectedPals(3) = ((u8 *)&selectedPals)[3]; bDelay = delay; bStartY = startY; bTargetY = targetY; bPalette(0) = ((u8 *)&palette)[0]; bPalette(1) = ((u8 *)&palette)[1]; bCommunicateAfter = communicateAfter; } static void SetPrintMessageArgs(u8 *args, u8 stringId, u8 flags, u16 waitKeys, u8 followupCmd) { bMsgId = stringId; bFlags = flags; bKeys(0) = ((u8 *)&waitKeys)[0]; bKeys(1) = ((u8 *)&waitKeys)[1]; bNextCmdState = followupCmd; } // GF file break static s32 ShowGameDisplay(void) { struct BerryCrushGame * game = GetBerryCrushGame(); if (game == NULL) return -1; switch (game->cmdState) { case 0: SetVBlankCallback(NULL); SetHBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, 0); ScanlineEffect_Stop(); ResetTempTileDataBuffers(); break; case 1: CpuFill16(0, (void *)OAM, OAM_SIZE); gReservedSpritePaletteCount = 0; DigitObjUtil_Init(3); break; case 2: ResetPaletteFade(); ResetSpriteData(); FreeAllSpritePalettes(); break; case 3: ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetBgTilemapBuffer(1, game->gfx.bgBuffers[0]); SetBgTilemapBuffer(2, game->gfx.bgBuffers[2]); SetBgTilemapBuffer(3, game->gfx.bgBuffers[3]); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); break; case 4: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 64); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32); FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32); break; case 5: CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); DecompressAndCopyTileDataToVram(1, gBerryCrush_Crusher_Gfx, 0, 0, 0); break; case 6: if (FreeTempTileDataBuffersIfPossible()) return 0; InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); CreatePlayerNameWindows(game); DrawPlayerNameWindows(game); gPaletteFade.bufferTransferDisabled = TRUE; break; case 7: LoadPalette(gBerryCrush_Crusher_Pal, BG_PLTT_ID(0), 12 * PLTT_SIZE_4BPP); CopyToBgTilemapBuffer(1, sCrusherTop_Tilemap, 0, 0); CopyToBgTilemapBuffer(2, sContainerCap_Tilemap, 0, 0); CopyToBgTilemapBuffer(3, sBg_Tilemap, 0, 0); CopyPlayerNameWindowGfxToBg(game); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); break; case 8: LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); CreateGameSprites(game); SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); break; case 9: gPaletteFade.bufferTransferDisabled = FALSE; BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); BerryCrush_SetVBlankCallback(); game->cmdState = 0; return 1; } game->cmdState++; return 0; } static s32 HideGameDisplay(void) { struct BerryCrushGame * game = GetBerryCrushGame(); if (!game) return -1; switch (game->cmdState) { case 0: Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) return 0; // fall through. The original author forgot to use "break" here // because this will call BeginNormalPaletteFade() twice. case 2: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); UpdatePaletteFade(); break; case 3: if (UpdatePaletteFade()) return 0; break; case 4: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 32); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32); FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); break; case 5: FreeAllWindowBuffers(); HideBg(0); UnsetBgTilemapBuffer(0); HideBg(1); UnsetBgTilemapBuffer(1); HideBg(2); UnsetBgTilemapBuffer(2); HideBg(3); UnsetBgTilemapBuffer(3); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); break; case 6: DestroyWirelessStatusIndicatorSprite(); DestroyGameSprites(game); DigitObjUtil_Free(); break; case 7: game->cmdState = 0; return 1; } game->cmdState++; return 0; } static s32 UpdateGame(struct BerryCrushGame * game) { gSpriteCoordOffsetY = game->depth + game->vibration; SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY); if (game->gameState == STATE_PLAYING) { PrintTimer(&game->gfx, game->timer); } return 0; } static void ResetCrusherPos(struct BerryCrushGame * game) { game->depth = CRUSHER_START_Y; game->vibration = 0; gSpriteCoordOffsetX = 0; gSpriteCoordOffsetY = CRUSHER_START_Y; } // Sprite data for berry sprites. Identical to fields for sparkle sprites #define sX data[0] #define sYSpeed data[1] #define sYAccel data[2] #define sXSpeed data[3] #define sSinIdx data[4] #define sSinSpeed data[5] #define sAmplitude data[6] // The last element (data[7]) is a bitfield. // The first 15 bits are the y coord to stop at. // The last bit is a flag for whether or not to move horizontally too #define sBitfield data[7] #define MASK_TARGET_Y 0x7FFF #define F_MOVE_HORIZ 0x8000 static void CreateBerrySprites(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * spritesManager) { u8 i; u8 spriteId; s16 distance, var1; s16 *data; s32 amplitude; s16 speed; u32 var2; for (i = 0; i < game->playerCount; i++) { spriteId = AddItemIconObjectWithCustomObjectTemplate( &sSpriteTemplate_PlayerBerry, sPlayerBerrySpriteTags[i], sPlayerBerrySpriteTags[i], game->players[i].berryId + FIRST_BERRY_INDEX); spritesManager->berrySprites[i] = &gSprites[spriteId]; spritesManager->berrySprites[i]->oam.priority = 3; spritesManager->berrySprites[i]->affineAnimPaused = TRUE; spritesManager->berrySprites[i]->x = spritesManager->playerCoords[i]->berryXOffset + 120; spritesManager->berrySprites[i]->y = -16; data = spritesManager->berrySprites[i]->data; speed = Q_8_8(2.0); sYSpeed = speed; sYAccel = Q_8_8(0.125); sBitfield = 112; // Setting bits in MASK_TARGET_Y distance = spritesManager->playerCoords[i]->berryXDest - spritesManager->playerCoords[i]->berryXOffset; amplitude = distance; if (distance < 0) amplitude += 3; sAmplitude = amplitude >> 2; distance = Q_N_S(7, distance); var2 = speed + Q_8_8(0.125); var2 = var2 / 2; // go from Q8.8 to Q9.7 var1 = Q_N_S_div(7, Q_N_S(7, 127), var2); sX = Q_N_S(7, (u16)spritesManager->berrySprites[i]->x); sXSpeed = Q_N_S_div(7, distance, var1); var1 = Q_N_S_mul(7, var1, Q_N_S(7, 0.666666667)); sSinIdx = 0; sSinSpeed = Q_N_S_div(7, Q_N_S(7, 127), var1); sBitfield |= F_MOVE_HORIZ; if (spritesManager->playerCoords[i]->berryXOffset < 0) StartSpriteAffineAnim(spritesManager->berrySprites[i], 1); } } static void SpriteCB_DropBerryIntoCrusher(struct Sprite *sprite) { s16 *data = sprite->data; sYSpeed += sYAccel; sprite->y2 += Q_8_8_TO_INT(sYSpeed); if (sBitfield & F_MOVE_HORIZ) { sprite->sX += sXSpeed; sSinIdx += sSinSpeed; sprite->x2 = Sin(Q_N_S_TO_INT(7, sSinIdx), sAmplitude); if ((sBitfield & F_MOVE_HORIZ) && Q_N_S_TO_INT(7, sSinIdx) > 126) { sprite->x2 = 0; sBitfield &= MASK_TARGET_Y; } } sprite->x = Q_N_S_TO_INT(7, sX); if (sprite->y + sprite->y2 >= (sBitfield & MASK_TARGET_Y)) { sprite->callback = SpriteCallbackDummy; FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } #undef sX #undef sYSpeed #undef sYAccel #undef sXSpeed #undef sSinIdx #undef sSinSpeed #undef sAmplitude #undef sBitfield #undef MASK_TARGET_Y #undef F_MOVE_HORIZ static void BerryCrushFreeBerrySpriteGfx(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * gfx) { u8 i; for (i = 0; i < game->playerCount; i++) { FreeSpritePaletteByTag(sPlayerBerrySpriteTags[i]); FreeSpriteTilesByTag(sPlayerBerrySpriteTags[i]); } } static void UpdateInputEffects(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * gfx) { u8 numPlayersPressed; struct BerryCrushGame_LinkState * linkState; u8 i; u16 temp1, xModifier; numPlayersPressed = 0; linkState = (struct BerryCrushGame_LinkState *)&game->recvCmd; for (i = 0; i < game->playerCount; i++) { #define flags temp1 flags = linkState->inputFlags >> (i * INPUT_FLAGS_PER_PLAYER); flags &= INPUT_FLAG_MASK; if (flags) { numPlayersPressed++; if (flags & F_INPUT_HIT_SYNC) StartSpriteAnim(gfx->impactSprites[i], 1); else StartSpriteAnim(gfx->impactSprites[i], 0); gfx->impactSprites[i]->invisible = FALSE; gfx->impactSprites[i]->animPaused = FALSE; gfx->impactSprites[i]->x2 = sImpactCoords[(flags % (NELEMS(sImpactCoords) + 1)) - 1][0]; gfx->impactSprites[i]->y2 = sImpactCoords[(flags % (NELEMS(sImpactCoords) + 1)) - 1][1]; #undef flags } } if (numPlayersPressed == 0) { game->playedSound = FALSE; } else { #define yModifier temp1 yModifier = (u8)(game->timer % 3); xModifier = yModifier; for (i = 0; i < linkState->sparkleAmount * 2 + 3; i++) { if (gfx->sparkleSprites[i]->invisible) { gfx->sparkleSprites[i]->callback = SpriteCB_Sparkle_Init; gfx->sparkleSprites[i]->x = sSparkleCoords[i][0] + 120; gfx->sparkleSprites[i]->y = sSparkleCoords[i][1] + 136 - (yModifier * 4); gfx->sparkleSprites[i]->x2 = sSparkleCoords[i][0] + (sSparkleCoords[i][0] / (xModifier * 4)); gfx->sparkleSprites[i]->y2 = sSparkleCoords[i][1]; if (linkState->bigSparkle) StartSpriteAnim(gfx->sparkleSprites[i], 1); else StartSpriteAnim(gfx->sparkleSprites[i], 0); yModifier++; if (yModifier > 3) yModifier = 0; } } #undef yModifier if (game->playedSound) { game->playedSound = FALSE; } else { if (numPlayersPressed == 1) PlaySE(SE_MUD_BALL); else PlaySE(SE_BREAKABLE_DOOR); game->playedSound = TRUE; } } } static bool32 AreEffectsFinished(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * gfx) { u8 i; for (i = 0; i < game->playerCount; i++) { if (!gfx->impactSprites[i]->invisible) return FALSE; } for (i = 0; i < NELEMS(gfx->sparkleSprites); i++) { if (!gfx->sparkleSprites[i]->invisible) return FALSE; } if (game->vibration != 0) game->vibration = 0; return TRUE; } static void FramesToMinSec(struct BerryCrushGame_Gfx * gfx, u16 frames) { u8 i = 0; u32 fractionalFrames = 0; s16 frac_secs = 0; gfx->minutes = frames / 3600; gfx->secondsInt = (frames % 3600) / 60; frac_secs = Q_8_8_mul(Q_8_8(frames % 60), Q_8_8(0.016666667)); for (i = 0; i < 8; i++) { if ((frac_secs >> (7 - i)) & 1) fractionalFrames += sPressingSpeedConversionTable[i]; } gfx->secondsFrac = fractionalFrames / 1000000; } static void PrintTextCentered(u8 windowId, u8 left, u8 colorId, const u8 *string) { left = (left * 4) - (GetStringWidth(FONT_NORMAL, string, -1) / 2u); AddTextPrinterParameterized3(windowId, FONT_NORMAL, left, 0, sBerryCrushTextColorTable[colorId], 0, string); } static void PrintResultsText(struct BerryCrushGame * game, u8 command, u8 x, u8 y) { u8 i = 0; u8 linkPlayerId = 0; u8 linkIdToPrint = 0; u8 j; s32 score; u8 realX; struct BerryCrushGame_Results * bcPlayers = &game->results; s32 realX2; for (i = 0; i < game->playerCount; i++) { DynamicPlaceholderTextUtil_Reset(); switch (command) { case RESULTS_PAGE_PRESSES: // Number of presses linkPlayerId = bcPlayers->playerIdsRanked[command][i]; if (i != 0 && bcPlayers->stats[command][i] != bcPlayers->stats[command][i - 1]) linkIdToPrint = i; ConvertIntToDecimalStringN(gStringVar1, bcPlayers->stats[command][i], STR_CONV_MODE_RIGHT_ALIGN, 4); realX = x - GetStringWidth(FONT_NORMAL, sBCRankingHeaders[command], -1) - 4; AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, realX, y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, sBCRankingHeaders[command]); AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, realX - 24, y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar1); break; case RESULTS_PAGE_RANDOM: // Neatness linkPlayerId = bcPlayers->playerIdsRanked[command][i]; if (i != 0 && bcPlayers->stats[command][i] != bcPlayers->stats[command][i - 1]) linkIdToPrint = i; ConvertIntToDecimalStringN(gStringVar1, bcPlayers->stats[command][i] >> 4, STR_CONV_MODE_RIGHT_ALIGN, 3); score = 0; realX = bcPlayers->stats[command][i] & 15; for (j = 0; j < 4; j++) { if ((realX >> (3 - j)) & 1) score += sPressingSpeedConversionTable[j]; } realX = score / 1000000u; ConvertIntToDecimalStringN(gStringVar2, realX, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, sBCRankingHeaders[command]); realX2 = x - 4; AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, realX2 - GetStringWidth(FONT_NORMAL, gStringVar4, 0), y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4); break; case RESULTS_PAGE_CRUSHING: // Berry names linkPlayerId = i; linkIdToPrint = i; j = game->players[i].berryId; if (j >= LAST_BERRY_INDEX - FIRST_BERRY_INDEX + 2) j = 0; StringCopy(gStringVar1, gBerries[j].name); StringExpandPlaceholders(gStringVar4, sBCRankingHeaders[command]); AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x - GetStringWidth(FONT_NORMAL, gStringVar4, -1) - 4, y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4); break; } if (linkPlayerId == game->localId) StringCopy(gStringVar3, gText_1_ClrBluShdwLtBlu_Dynamic0); else StringCopy(gStringVar3, gText_1_Dynamic0); gStringVar3[0] = linkIdToPrint + CHAR_1; DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, game->players[linkPlayerId].name); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gStringVar3); AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, 4, y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4); } } static void printCrushingResults(struct BerryCrushGame * game) { u8 i = 0; u8 x = 0; u32 score = 0; struct BerryCrushGame_Results *players = &game->results; u8 y = GetWindowAttribute(game->gfx.resultsWindowId, WINDOW_HEIGHT) * 8 - 42; FramesToMinSec(&game->gfx, players->time); AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, 2, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_TimeColon); x = 190 - (u8)GetStringWidth(FONT_NORMAL, gText_SpaceSec, 0); AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_SpaceSec); x -= 32; ConvertIntToDecimalStringN(gStringVar1, game->gfx.secondsInt, STR_CONV_MODE_LEADING_ZEROS, 2); ConvertIntToDecimalStringN(gStringVar2, game->gfx.secondsFrac, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_XDotY2); AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4); x -= (u8)GetStringWidth(FONT_NORMAL, gText_SpaceMin, 0) + 3; AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_SpaceMin); x -= 9; ConvertIntToDecimalStringN(gStringVar1, game->gfx.minutes, STR_CONV_MODE_LEADING_ZEROS, 1); StringExpandPlaceholders(gStringVar4, gText_StrVar1); AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4); y += 14; AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, 2, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_PressingSpeed); x = 190 - (u8)GetStringWidth(FONT_NORMAL, gText_TimesPerSec, 0); AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL_COPY_2, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_TimesPerSec); for (i = 0; i < 8; ++i) if (((u8)game->pressingSpeed >> (7 - i)) & 1) score += *(i + sPressingSpeedConversionTable); // It's accessed in a different way here for unknown reason ConvertIntToDecimalStringN(gStringVar1, game->pressingSpeed >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(gStringVar2, score / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_XDotY3); x -= 38; if (game->newRecord) AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_RED], 0, gStringVar4); else AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4); y += 14; AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, 2, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_Silkiness); ConvertIntToDecimalStringN(gStringVar1, players->silkiness, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_Var1Percent); x = 190 - (u8)GetStringWidth(FONT_NORMAL, gStringVar4, 0); AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4); } static bool32 OpenResultsWindow(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * spriteManager) { u8 playerCountMinus2; struct WindowTemplate template; switch (spriteManager->resultsState) { case 0: playerCountMinus2 = game->playerCount - 2; HideTimer(spriteManager); // template = sWindowTemplates_Results[game->gameState - STATE_RESULTS_PRESSES]; memcpy(&template, &sWindowTemplates_Results[game->gameState - STATE_RESULTS_PRESSES], sizeof(struct WindowTemplate)); if (game->gameState == STATE_RESULTS_CRUSHING) template.height = sResultsWindowHeights[1][playerCountMinus2]; else template.height = sResultsWindowHeights[0][playerCountMinus2]; spriteManager->resultsWindowId = AddWindow(&template); break; case 1: PutWindowTilemap(spriteManager->resultsWindowId); FillWindowPixelBuffer(spriteManager->resultsWindowId, PIXEL_FILL(0)); break; case 2: LoadStdWindowGfx(spriteManager->resultsWindowId, 0x21D, BG_PLTT_ID(13)); DrawStdFrameWithCustomTileAndPalette(spriteManager->resultsWindowId, FALSE, 541, 13); break; case 3: playerCountMinus2 = game->playerCount - 2; switch (game->gameState) { case STATE_RESULTS_PRESSES: PrintTextCentered(spriteManager->resultsWindowId, 22, COLORID_BLUE, gText_PressesRankings); PrintResultsText(game, RESULTS_PAGE_PRESSES, 0xB0, 8 * sResultsWindowHeights[0][playerCountMinus2] - game->playerCount * 14); spriteManager->resultsState = 5; return FALSE; case STATE_RESULTS_RANDOM: PrintTextCentered(spriteManager->resultsWindowId, 22, COLORID_GREEN, sBCRankingHeaders[game->results.randomPageId + 3]); PrintResultsText(game, RESULTS_PAGE_RANDOM, 0xB0, 8 * sResultsWindowHeights[0][playerCountMinus2] - game->playerCount * 14); spriteManager->resultsState = 5; return FALSE; case STATE_RESULTS_CRUSHING: PrintTextCentered(spriteManager->resultsWindowId, 24, COLORID_BLUE, gText_CrushingResults); PrintResultsText(game, RESULTS_PAGE_CRUSHING, 0xC0, 0x10); break; } break; case 4: printCrushingResults(game); break; case 5: CopyWindowToVram(spriteManager->resultsWindowId, COPYWIN_FULL); spriteManager->resultsState = 0; return TRUE; } ++spriteManager->resultsState; return FALSE; } static void CloseResultsWindow(struct BerryCrushGame * game) { ClearStdWindowAndFrameToTransparent(game->gfx.resultsWindowId, TRUE); RemoveWindow(game->gfx.resultsWindowId); DrawPlayerNameWindows(game); } #define tState data[0] #define tWindowId data[1] #define tPressingSpeeds(i) data[2 + (i)] // data[2]-[5], for different group sizes static void Task_ShowBerryCrushRankings(u8 taskId) { u8 i = 0, j, xPos, yPos; u32 score = 0; s16 *data = gTasks[taskId].data; u8 *str; switch (tState) { case 0: tWindowId = AddWindow(&sWindowTemplate_BerryCrushRankings); PutWindowTilemap(tWindowId); FillWindowPixelBuffer(tWindowId, PIXEL_FILL(0)); LoadStdWindowGfx(tWindowId, 0x21D, BG_PLTT_ID(13)); DrawStdFrameWithCustomTileAndPalette(tWindowId, 0, 0x21D, 13); break; case 1: xPos = 96 - GetStringWidth(FONT_NORMAL, gText_BerryCrush2, -1) / 2u; AddTextPrinterParameterized3( tWindowId, FONT_NORMAL, xPos, 2, sBerryCrushTextColorTable[COLORID_BLUE], 0, gText_BerryCrush2 ); xPos = 96 - GetStringWidth(FONT_NORMAL, gText_PressingSpeedRankings, -1) / 2u; AddTextPrinterParameterized3( tWindowId, FONT_NORMAL, xPos, 18, sBerryCrushTextColorTable[COLORID_BLUE], 0, gText_PressingSpeedRankings ); yPos = 42; for (i = 0; i < 4; ++i) { ConvertIntToDecimalStringN(gStringVar1, i + 2, STR_CONV_MODE_LEFT_ALIGN, 1); StringExpandPlaceholders(gStringVar4, gText_Var1Players); AddTextPrinterParameterized3( tWindowId, FONT_NORMAL, 4, yPos, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4 ); for (j = 0; j < 8; ++j) { if (((tPressingSpeeds(i) & 0xFF) >> (7 - j)) & 1) score += sPressingSpeedConversionTable[j]; } ConvertIntToDecimalStringN(gStringVar1, (u16)tPressingSpeeds(i) >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(gStringVar2, score / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2); str = StringExpandPlaceholders(gStringVar4, gText_XDotY3); *str++ = CHAR_SPACE; StringCopy(str, gText_TimesPerSec); xPos = 192 - (u8)GetStringWidth(FONT_NORMAL_COPY_2, gStringVar4, 0); AddTextPrinterParameterized3( tWindowId, FONT_NORMAL_COPY_2, xPos, yPos, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4 ); yPos += 14; score = 0; } CopyWindowToVram(tWindowId, COPYWIN_FULL); break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON)) break; else return; case 3: ClearStdWindowAndFrameToTransparent(tWindowId, TRUE); ClearWindowTilemap(tWindowId); RemoveWindow(tWindowId); DestroyTask(taskId); ScriptContext_Enable(); UnlockPlayerFieldControls(); tState = 0; return; } ++tState; } void ShowBerryCrushRankings(void) { u8 taskId; LockPlayerFieldControls(); taskId = CreateTask(Task_ShowBerryCrushRankings, 0); gTasks[taskId].tPressingSpeeds(0) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[0]; gTasks[taskId].tPressingSpeeds(1) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[1]; gTasks[taskId].tPressingSpeeds(2) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[2]; gTasks[taskId].tPressingSpeeds(3) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[3]; } static void PrintTimer(struct BerryCrushGame_Gfx * gfx, u16 frames) { FramesToMinSec(gfx, frames); DigitObjUtil_PrintNumOn(0, gfx->minutes); DigitObjUtil_PrintNumOn(1, gfx->secondsInt); DigitObjUtil_PrintNumOn(2, gfx->secondsFrac); } static void HideTimer(struct BerryCrushGame_Gfx * gfx) { gfx->timerSprites[0]->invisible = TRUE; gfx->timerSprites[1]->invisible = TRUE; DigitObjUtil_HideOrShow(2, 1); DigitObjUtil_HideOrShow(1, 1); DigitObjUtil_HideOrShow(0, 1); } static void CreatePlayerNameWindows(struct BerryCrushGame * game) { u8 i; for (i = 0; i < game->playerCount; ++i) { game->gfx.playerCoords[i] = &sPlayerCoords[sPlayerIdToPosId[game->playerCount - 2][i]]; game->gfx.nameWindowIds[i] = AddWindow(&sWindowTemplates_PlayerNames[game->gfx.playerCoords[i]->playerId]); PutWindowTilemap(game->gfx.nameWindowIds[i]); FillWindowPixelBuffer(game->gfx.nameWindowIds[i], PIXEL_FILL(0)); } } static void DrawPlayerNameWindows(struct BerryCrushGame * game) { u8 i; for (i = 0; i < game->playerCount; ++i) { PutWindowTilemap(game->gfx.nameWindowIds[i]); if (i == game->localId) { AddTextPrinterParameterized4( game->gfx.nameWindowIds[i], FONT_NORMAL, 36 - GetStringWidth(FONT_NORMAL, game->players[i].name, 0) / 2u, 1, 0, 0, sBerryCrushTextColorTable[COLORID_BLACK], 0, game->players[i].name ); } else { AddTextPrinterParameterized4( game->gfx.nameWindowIds[i], FONT_NORMAL, 36 - GetStringWidth(FONT_NORMAL, game->players[i].name, 0) / 2u, 1, 0, 0, sBerryCrushTextColorTable[COLORID_LIGHT_GRAY], 0, game->players[i].name ); } CopyWindowToVram(game->gfx.nameWindowIds[i], COPYWIN_FULL); } CopyBgTilemapBufferToVram(0); } // Each player name window border uses a color that corresponds to a slot of the crusher lid static void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame * game) { u8 i = 0; u8 *crusherGfx; LZ77UnCompWram(gBerryCrush_TextWindows_Tilemap, gDecompressionBuffer); for (crusherGfx = gDecompressionBuffer; i < game->playerCount; ++i) { CopyToBgTilemapBufferRect( 3, &crusherGfx[game->gfx.playerCoords[i]->playerId * 40], game->gfx.playerCoords[i]->windowGfxX, game->gfx.playerCoords[i]->windowGfxY, 10, 2 ); } CopyBgTilemapBufferToVram(3); } static void CreateGameSprites(struct BerryCrushGame * game) { u8 i = 0; u8 spriteId; game->depth = CRUSHER_START_Y; game->vibration = 0; gSpriteCoordOffsetX = 0; gSpriteCoordOffsetY = CRUSHER_START_Y; for (i = 0; i < NELEMS(sSpriteSheets) - 1; ++i) LoadCompressedSpriteSheet(&sSpriteSheets[i]); LoadSpritePalettes(sSpritePals); // Create sprite for crusher base spriteId = CreateSprite(&sSpriteTemplate_BerryCrushCore, 120, 88, 5); game->gfx.coreSprite = &gSprites[spriteId]; game->gfx.coreSprite->oam.priority = 3; game->gfx.coreSprite->coordOffsetEnabled = TRUE; game->gfx.coreSprite->animPaused = TRUE; // Create sprites for the impact effect for (i = 0; i < game->playerCount; ++i) { spriteId = CreateSprite( &sSpriteTemplate_BerryCrushImpact, game->gfx.playerCoords[i]->impactXOffset + 120, game->gfx.playerCoords[i]->impactYOffset + 32, 0 ); game->gfx.impactSprites[i] = &gSprites[spriteId]; game->gfx.impactSprites[i]->oam.priority = 1; game->gfx.impactSprites[i]->invisible = TRUE; game->gfx.impactSprites[i]->coordOffsetEnabled = TRUE; game->gfx.impactSprites[i]->animPaused = TRUE; } // Create sprites for sparkle effect for (i = 0; i < NELEMS(game->gfx.sparkleSprites); ++i) { spriteId = CreateSprite( &sSpriteTemplate_BerryCrushPowderSparkles, sSparkleCoords[i][0] + 120, sSparkleCoords[i][1] + 136, 6 ); game->gfx.sparkleSprites[i] = &gSprites[spriteId]; game->gfx.sparkleSprites[i]->oam.priority = 3; game->gfx.sparkleSprites[i]->invisible = TRUE; game->gfx.sparkleSprites[i]->animPaused = TRUE; game->gfx.sparkleSprites[i]->data[0] = i; } // Create sprites for timer for (i = 0; i < NELEMS(game->gfx.timerSprites); ++i) { spriteId = CreateSprite( &sSpriteTemplate_BerryCrushTimer, 24 * i + 176, 8, 0 ); game->gfx.timerSprites[i] = &gSprites[spriteId]; game->gfx.timerSprites[i]->oam.priority = 0; game->gfx.timerSprites[i]->invisible = FALSE; game->gfx.timerSprites[i]->animPaused = FALSE; } DigitObjUtil_CreatePrinter(0, 0, &sDigitObjTemplates[0]); DigitObjUtil_CreatePrinter(1, 0, &sDigitObjTemplates[1]); DigitObjUtil_CreatePrinter(2, 0, &sDigitObjTemplates[2]); if (game->gameState == STATE_INIT) HideTimer(&game->gfx); } static void DestroyGameSprites(struct BerryCrushGame * game) { u8 i = 0; FreeSpriteTilesByTag(TAG_TIMER_DIGITS); FreeSpriteTilesByTag(GFXTAG_SPARKLE); FreeSpriteTilesByTag(GFXTAG_IMPACT); FreeSpriteTilesByTag(TAG_CRUSHER_BASE); FreeSpritePaletteByTag(TAG_TIMER_DIGITS); FreeSpritePaletteByTag(PALTAG_EFFECT); FreeSpritePaletteByTag(TAG_CRUSHER_BASE); for (; i < NELEMS(game->gfx.timerSprites); ++i) DestroySprite(game->gfx.timerSprites[i]); DigitObjUtil_DeletePrinter(2); DigitObjUtil_DeletePrinter(1); DigitObjUtil_DeletePrinter(0); for (i = 0; i < NELEMS(game->gfx.sparkleSprites); ++i) DestroySprite(game->gfx.sparkleSprites[i]); for (i = 0; i < game->playerCount; ++i) DestroySprite(game->gfx.impactSprites[i]); if (game->gfx.coreSprite->inUse) DestroySprite(game->gfx.coreSprite); } static void SpriteCB_Impact(struct Sprite *sprite) { if (sprite->animEnded) { sprite->invisible = TRUE; sprite->animPaused = TRUE; } } static void SpriteCB_Sparkle_End(struct Sprite *sprite) { u8 r1 = 0; SpriteCallback r5 = SpriteCallbackDummy; for (; r1 < NELEMS(sprite->data); ++r1) sprite->data[r1] = 0; sprite->x2 = 0; sprite->y2 = 0; sprite->invisible = TRUE; sprite->animPaused = TRUE; sprite->callback = r5; } // Redefining from above #define sX data[0] #define sYSpeed data[1] #define sYAccel data[2] #define sXSpeed data[3] #define sSinIdx data[4] #define sSinSpeed data[5] #define sAmplitude data[6] // The last element (data[7]) is a bitfield. // The first 15 bits are the y coord to stop at. // The last bit is a flag for whether or not to move on the x too #define sBitfield data[7] #define MASK_TARGET_Y 0x7FFF #define F_MOVE_HORIZ 0x8000 static void SpriteCB_Sparkle(struct Sprite *sprite) { s16 *data = sprite->data; sYSpeed += sYAccel; sprite->y2 += Q_8_8_TO_INT(sYSpeed); if (sBitfield & F_MOVE_HORIZ) { sprite->sX += sXSpeed; sSinIdx += sSinSpeed; sprite->x2 = Sin(Q_N_S_TO_INT(7, sSinIdx), sAmplitude); if ((sBitfield & F_MOVE_HORIZ) && Q_N_S_TO_INT(7, sSinIdx) > 126) { sprite->x2 = 0; sBitfield &= MASK_TARGET_Y; } } sprite->x = Q_N_S_TO_INT(7, sX); if (sprite->y + sprite->y2 > (sBitfield & MASK_TARGET_Y)) sprite->callback = SpriteCB_Sparkle_End; } static void SpriteCB_Sparkle_Init(struct Sprite *sprite) { s16 *data = sprite->data; s16 xMult, var; s16 targetY; s32 speed; u32 zero = 0; speed = Q_8_8(2.5); sYSpeed = speed; sYAccel = Q_8_8(0.125); targetY = 168; sBitfield = targetY; xMult = Q_N_S(7, sprite->x2); var = Q_N_S_div(7, Q_N_S(7, targetY - (u16) sprite->y), (speed + Q_8_8(0.125)) >> 1); sprite->sX = Q_N_S(7, (u16)sprite->x); sXSpeed = Q_N_S_div(7, xMult, var); speed = Q_N_S_mul(7, var, Q_N_S(7, 0.666666667)); sSinIdx = zero; sSinSpeed = Q_N_S_div(7, Q_N_S(7, 127), speed); sAmplitude = sprite->x2 / 4; sBitfield |= F_MOVE_HORIZ; sprite->y2 = zero; sprite->x2 = zero; sprite->callback = SpriteCB_Sparkle; sprite->animPaused = FALSE; sprite->invisible = FALSE; } #undef sX #undef sYSpeed #undef sYAccel #undef sXSpeed #undef sSinIdx #undef sSinSpeed #undef sAmplitude #undef sBitfield #undef MASK_TARGET_Y #undef F_MOVE_HORIZ ================================================ FILE: src/berry_fix_program.c ================================================ #include "global.h" #include "gpu_regs.h" #include "multiboot.h" #include "graphics.h" #include "main.h" #include "sprite.h" #include "task.h" #include "scanline_effect.h" #include "help_system.h" #include "m4a.h" enum { SCENE_ENSURE_CONNECT, SCENE_TURN_OFF_POWER, SCENE_TRANSMITTING, SCENE_FOLLOW_INSTRUCT, SCENE_TRANSMIT_FAILED, SCENE_BEGIN, }; enum { STATE_BEGIN, STATE_CONNECT, STATE_TURN_OFF_POWER, STATE_UNUSED, STATE_INIT_MULTIBOOT, STATE_MULTIBOOT, STATE_TRANSMIT, STATE_SUCCEEDED, STATE_EXIT, STATE_FAILED, STATE_RETRY, }; const void *gMultibootStart; int gMultibootStatus; size_t gMultibootSize; struct MultiBootParam gMultibootParam; static void CB2_BerryFix(void); static void Task_BerryFixMain(u8 taskId); static const void *const sBerryFixGraphics[][3] = { [SCENE_ENSURE_CONNECT] = { gBerryFixGameboy_Gfx, gBerryFixGameboy_Tilemap, gBerryFixGameboy_Pal }, [SCENE_TURN_OFF_POWER] = { gBerryFixGameboyLogo_Gfx, gBerryFixGameboyLogo_Tilemap, gBerryFixGameboyLogo_Pal }, [SCENE_TRANSMITTING] = { gBerryFixGbaTransfer_Gfx, gBerryFixGbaTransfer_Tilemap, gBerryFixGbaTransfer_Pal }, [SCENE_FOLLOW_INSTRUCT] = { gBerryFixGbaTransferHighlight_Gfx, gBerryFixGbaTransferHighlight_Tilemap, gBerryFixGbaTransferHighlight_Pal }, [SCENE_TRANSMIT_FAILED] = { gBerryFixGbaTransferError_Gfx, gBerryFixGbaTransferError_Tilemap, gBerryFixGbaTransferError_Pal }, [SCENE_BEGIN] = { gBerryFixWindow_Gfx, gBerryFixWindow_Tilemap, gBerryFixWindow_Pal }, }; extern const u8 gMultiBootProgram_BerryGlitchFix_Start[0x3BF4]; extern const u8 gMultiBootProgram_BerryGlitchFix_End[]; static void SetScene(int scene) { REG_DISPCNT = 0; REG_BG0HOFS = 0; REG_BG0VOFS = 0; REG_BLDCNT = 0; LZ77UnCompVram(sBerryFixGraphics[scene][0], (void *)BG_CHAR_ADDR(0)); LZ77UnCompVram(sBerryFixGraphics[scene][1], (void *)BG_SCREEN_ADDR(31)); CpuCopy16(sBerryFixGraphics[scene][2], (void *)BG_PLTT, 0x200); REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(31) | BGCNT_TXT256x256; REG_DISPCNT = DISPCNT_BG0_ON; } #define tState data[0] #define tTimer data[1] void CB2_InitBerryFixProgram(void) { u8 taskId; DisableInterrupts(0xFFFF); EnableInterrupts(INTR_FLAG_VBLANK); m4aSoundVSyncOff(); SetVBlankCallback(NULL); DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE); DmaFill32(3, 0, (void *)PLTT, PLTT_SIZE); ResetSpriteData(); ResetTasks(); ScanlineEffect_Stop(); gHelpSystemEnabled = FALSE; taskId = CreateTask(Task_BerryFixMain, 0); gTasks[taskId].tState = STATE_BEGIN; SetMainCallback2(CB2_BerryFix); } static void CB2_BerryFix(void) { RunTasks(); } static void Task_BerryFixMain(u8 taskId) { s16 * data = gTasks[taskId].data; switch (tState) { case STATE_BEGIN: SetScene(SCENE_BEGIN); tState = STATE_CONNECT; break; case STATE_CONNECT: if (JOY_NEW(A_BUTTON)) { SetScene(SCENE_ENSURE_CONNECT); tState = STATE_TURN_OFF_POWER; } break; case STATE_TURN_OFF_POWER: if (JOY_NEW(A_BUTTON)) { SetScene(SCENE_TURN_OFF_POWER); tState = STATE_INIT_MULTIBOOT; } break; case STATE_INIT_MULTIBOOT: gMultibootStart = gMultiBootProgram_BerryGlitchFix_Start; gMultibootSize = gMultiBootProgram_BerryGlitchFix_End - gMultiBootProgram_BerryGlitchFix_Start; gMultibootParam.masterp = (void *)gMultiBootProgram_BerryGlitchFix_Start; gMultibootParam.server_type = MULTIBOOT_SERVER_TYPE_NORMAL; MultiBootInit(&gMultibootParam); tTimer = 0; tState = STATE_MULTIBOOT; break; case STATE_MULTIBOOT: if (gMultibootParam.probe_count == 0 && gMultibootParam.response_bit & 0x2 && gMultibootParam.client_bit & 0x2) { if (++tTimer > 180) { SetScene(SCENE_TRANSMITTING); MultiBootStartMaster(&gMultibootParam, gMultibootStart + MULTIBOOT_HEADER_SIZE, gMultibootSize - MULTIBOOT_HEADER_SIZE, 4, 1); tTimer = 0; tState = STATE_TRANSMIT; } else { gMultibootStatus = MultiBootMain(&gMultibootParam); } } else { tTimer = 0; gMultibootStatus = MultiBootMain(&gMultibootParam); } break; case STATE_TRANSMIT: gMultibootStatus = MultiBootMain(&gMultibootParam); if (MultiBootCheckComplete(&gMultibootParam)) { SetScene(SCENE_FOLLOW_INSTRUCT); tState = STATE_SUCCEEDED; } else if (!(gMultibootParam.client_bit & 2)) { tState = STATE_FAILED; } break; case STATE_SUCCEEDED: tState = STATE_EXIT; break; case STATE_EXIT: if (JOY_NEW(A_BUTTON)) { DestroyTask(taskId); DoSoftReset(); } break; case STATE_FAILED: SetScene(SCENE_TRANSMIT_FAILED); tState = STATE_RETRY; break; case STATE_RETRY: if (JOY_NEW(A_BUTTON)) tState = STATE_BEGIN; break; } } ================================================ FILE: src/berry_pouch.c ================================================ #include "global.h" #include "malloc.h" #include "bg.h" #include "decompress.h" #include "gpu_regs.h" #include "palette.h" #include "text.h" #include "berry_pouch.h" #include "item_menu.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "scanline_effect.h" #include "item_menu_icons.h" #include "list_menu.h" #include "graphics.h" #include "berry.h" #include "item.h" #include "item_use.h" #include "party_menu.h" #include "text_window.h" #include "strings.h" #include "string_util.h" #include "sound.h" #include "link.h" #include "money.h" #include "shop.h" #include "menu.h" #include "menu_indicators.h" #include "pokemon_storage_system.h" #include "constants/items.h" #include "constants/songs.h" #include "constants/quest_log.h" struct BerryPouchStruct_203F36C { void (*exitCallback)(void); u16 indicatorOffset; u8 indicatorTaskId; u8 listMenuNumItems; u8 listMenuMaxShowed; u8 itemMenuIconId; u8 ALIGNED(4) bg1TilemapBuffer[BG_SCREEN_SIZE]; s16 data[4]; }; struct BerryPouchStruct_203F370 { void (*savedCallback)(void); u8 type; u8 allowSelect; u8 unused_06; u16 listMenuSelectedRow; u16 listMenuScrollOffset; }; enum { BP_ACTION_USE = 0, BP_ACTION_TOSS, BP_ACTION_GIVE, BP_ACTION_EXIT, BP_ACTION_DUMMY }; static EWRAM_DATA struct BerryPouchStruct_203F36C *sResources = NULL; static EWRAM_DATA struct BerryPouchStruct_203F370 sStaticCnt = {}; static EWRAM_DATA struct ListMenuItem *sListMenuItems = NULL; static EWRAM_DATA u8 * sListMenuStrbuf = NULL; static EWRAM_DATA const u8 * sContextMenuOptions = NULL; static EWRAM_DATA u8 sContextMenuNumOptions = 0; static ALIGNED(4) EWRAM_DATA u8 sVariableWindowIds[14] = {}; static ALIGNED(4) EWRAM_DATA u8 sBerryPouchSpriteId = 0; static void CB2_InitBerryPouch(void); static bool8 RunBerryPouchInit(void); static void AbortBerryPouchLoading(void); static void Task_AbortBerryPouchLoading_WaitFade(u8 taskId); static void BerryPouchInitBgs(void); static bool8 BerryPouchLoadGfx(void); static bool8 AllocateListMenuBuffers(void); static void SetUpListMenuTemplate(void); static void GetBerryNameAndIndexForMenu(u8 * dest, u16 itemId); static void BerryPouchMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); static void BerryPouchItemPrintFunc(u8 windowId, u32 itemId, u8 y); static void BerryPouchSetArrowCursorAt(u8 y, u8 colorIdx); static void PrintSelectedBerryDescription(s32 itemIndex); static void CreateScrollIndicatorArrows_BerryPouchList(void); static void PrintBerryPouchHeaderCentered(void); static void SanitizeListMenuSelectionParams(void); static void UpdateListMenuScrollOffset(void); static void BerryPouch_DestroyResources(void); static void Task_BerryPouchFadeToExitCallback(u8 taskId); static void SortAndCountBerries(void); static void Task_BerryPouchMain(u8 taskId); static void Task_NormalContextMenu(u8 taskId); static void Task_NormalContextMenu_HandleInput(u8 taskId); static void Task_BerryPouch_Use(u8 taskId); static void Task_BerryPouch_Toss(u8 taskId); static void Task_AskTossMultiple(u8 taskId); static void Task_TossNo(u8 taskId); static void Task_Toss_SelectMultiple(u8 taskId); static void Task_TossYes(u8 taskId); static void Task_WaitButtonThenTossBerries(u8 taskId); static void Task_BerryPouch_Give(u8 taskId); static void Task_Give_PrintThereIsNoPokemon(u8 taskId); static void Task_WaitButtonBeforeDialogueWindowDestruction(u8 taskId); static void Task_BerryPouch_Exit(u8 taskId); static void Task_ContextMenu_FromPartyGiveMenu(u8 taskId); static void Task_ContextMenu_FromPokemonPC(u8 taskId); static void Task_ContextMenu_Sell(u8 taskId); static void Task_AskSellMultiple(u8 taskId); static void Task_SellMultiple_CreateYesNoMenu(u8 taskId); static void Task_SellNo(u8 taskId); static void Task_Sell_PrintSelectMultipleUI(u8 taskId); static void SellMultiple_UpdateSellPriceDisplay(s32 price); static void Task_Sell_SelectMultiple(u8 taskId); static void Task_SellYes(u8 taskId); static void Task_SellBerries_PlaySfxAndRemoveBerries(u8 taskId); static void Task_SellBerries_WaitButton(u8 taskId); static void BerryPouchInitWindows(void); static void BerryPouchPrint(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx); static u8 GetOrCreateVariableWindow(u8 winIdx); static void DestroyVariableWindow(u8 winIdx); static void TryDestroyVariableWindow(u8 winIdx); static u8 GetVariableWindowId(u8 winIdx); static void CreateYesNoMenuWin3(u8 taskId, const struct YesNoFuncTable *ptrs); static void CreateYesNoMenuWin4(u8 taskId, const struct YesNoFuncTable *ptrs); static void PrintMoneyInWin2(void); static void CreateBerryPouchSprite(void); static void StartBerryPouchSpriteWobbleAnim(void); static void SpriteCB_BerryPouchWaitWobbleAnim(struct Sprite *sprite); static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 3, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 } }; static const TaskFunc sBerryPouchContextMenuTasks[] = { Task_NormalContextMenu, Task_ContextMenu_FromPartyGiveMenu, Task_ContextMenu_Sell, Task_ContextMenu_FromPokemonPC, Task_NormalContextMenu }; static const struct YesNoFuncTable sYesNoFuncs_Toss = { .yesFunc = Task_TossYes, .noFunc = Task_TossNo }; static const struct YesNoFuncTable sYesNoFuncs_Sell = { .yesFunc = Task_SellYes, .noFunc = Task_SellNo }; static const struct MenuAction sContextMenuActions[] = { {gOtherText_Use, Task_BerryPouch_Use}, {gOtherText_Toss, Task_BerryPouch_Toss}, {gOtherText_Give, Task_BerryPouch_Give}, {gOtherText_Exit, Task_BerryPouch_Exit}, {gString_Dummy, NULL} }; static const u8 sOptions_UseGiveTossExit[] = { BP_ACTION_USE, BP_ACTION_GIVE, BP_ACTION_TOSS, BP_ACTION_EXIT }; static const u8 sOptions_GiveExit[] = { BP_ACTION_GIVE, BP_ACTION_EXIT, BP_ACTION_DUMMY, BP_ACTION_DUMMY }; static const u8 sOptions_Exit[] = { BP_ACTION_EXIT, BP_ACTION_DUMMY, BP_ACTION_DUMMY, BP_ACTION_DUMMY }; static const u8 sOptions_UseToss_Exit[] = { BP_ACTION_USE, BP_ACTION_TOSS, BP_ACTION_EXIT, BP_ACTION_DUMMY }; static const u8 sText_Space[] = _(" "); static const struct WindowTemplate sWindowTemplates_Main[] = { { .bg = 0, .tilemapLeft = 11, .tilemapTop = 1, .width = 18, .height = 14, .paletteNum = 15, .baseBlock = 0x027 }, { .bg = 0, .tilemapLeft = 5, .tilemapTop = 16, .width = 25, .height = 4, .paletteNum = 15, .baseBlock = 0x123 }, { .bg = 2, .tilemapLeft = 1, .tilemapTop = 1, .width = 9, .height = 2, .paletteNum = 15, .baseBlock = 0x187 }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sWindowTemplates_Variable[] = { { .bg = 2, .tilemapLeft = 24, .tilemapTop = 15, .width = 5, .height = 4, .paletteNum = 15, .baseBlock = 0x1d1 }, { .bg = 2, .tilemapLeft = 17, .tilemapTop = 9, .width = 12, .height = 4, .paletteNum = 15, .baseBlock = 0x1d1 }, { .bg = 2, .tilemapLeft = 1, .tilemapTop = 1, .width = 8, .height = 3, .paletteNum = 12, .baseBlock = 0x201 }, { .bg = 2, .tilemapLeft = 23, .tilemapTop = 15, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x219 }, { .bg = 2, .tilemapLeft = 21, .tilemapTop = 9, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x219 }, { .bg = 2, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 15, .baseBlock = 0x231 }, { .bg = 2, .tilemapLeft = 6, .tilemapTop = 15, .width = 14, .height = 4, .paletteNum = 12, .baseBlock = 0x231 }, { .bg = 2, .tilemapLeft = 6, .tilemapTop = 15, .width = 15, .height = 4, .paletteNum = 12, .baseBlock = 0x269 }, { .bg = 2, .tilemapLeft = 6, .tilemapTop = 15, .width = 16, .height = 4, .paletteNum = 12, .baseBlock = 0x2a5 }, { .bg = 2, .tilemapLeft = 6, .tilemapTop = 15, .width = 23, .height = 4, .paletteNum = 12, .baseBlock = 0x2e5 }, { .bg = 2, .tilemapLeft = 22, .tilemapTop = 17, .width = 7, .height = 2, .paletteNum = 15, .baseBlock = 0x199 }, { .bg = 2, .tilemapLeft = 22, .tilemapTop = 15, .width = 7, .height = 4, .paletteNum = 15, .baseBlock = 0x199 }, { .bg = 2, .tilemapLeft = 22, .tilemapTop = 13, .width = 7, .height = 6, .paletteNum = 15, .baseBlock = 0x199 }, { .bg = 2, .tilemapLeft = 22, .tilemapTop = 11, .width = 7, .height = 8, .paletteNum = 15, .baseBlock = 0x199 } }; static const u8 sTextColors[][3] = { { 0, 1, 2 }, { 0, 2, 3 }, { 0, 3, 2 } }; static const struct OamData sOamData = { .affineMode = ST_OAM_AFFINE_NORMAL, .shape = ST_OAM_SQUARE, .size = ST_OAM_SIZE_3, .priority = 1 }; static const union AnimCmd sSpriteAnim_Dummy[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable[] = { sSpriteAnim_Dummy }; static const union AffineAnimCmd sSpriteAffineAnim_Static[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sSpriteAffineAnim_Wobble[] = { AFFINEANIMCMD_FRAME(0, 0, -2, 2), AFFINEANIMCMD_FRAME(0, 0, 2, 4), AFFINEANIMCMD_FRAME(0, 0, -2, 4), AFFINEANIMCMD_FRAME(0, 0, 2, 2), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sSpriteAffineAnimTable[] = { sSpriteAffineAnim_Static, sSpriteAffineAnim_Wobble }; static const struct CompressedSpriteSheet sBerryPouchSpriteSheet = { gBerryPouchSpriteTiles, 0x800, 100 }; static const struct CompressedSpritePalette sBerryPouchSpritePal = { gBerryPouchSpritePalette, 100 }; static const struct SpriteTemplate sSpriteTemplate_BerryPouch = { 100, 100, &sOamData, sSpriteAnimTable, NULL, sSpriteAffineAnimTable, SpriteCallbackDummy }; void InitBerryPouch(u8 type, void (*savedCallback)(void), u8 allowSelect) { u32 i; sResources = Alloc(sizeof(struct BerryPouchStruct_203F36C)); if (sResources == NULL) { SetMainCallback2(savedCallback); } else { if (type != BERRYPOUCH_NA) sStaticCnt.type = type; if (allowSelect != 0xFF) sStaticCnt.allowSelect = allowSelect; if (savedCallback != NULL) sStaticCnt.savedCallback = savedCallback; sResources->exitCallback = NULL; sResources->itemMenuIconId = 0; sResources->indicatorTaskId = 0xFF; for (i = 0; i < 4; i++) sResources->data[i] = 0; gTextFlags.autoScroll = FALSE; gSpecialVar_ItemId = ITEM_NONE; SetMainCallback2(CB2_InitBerryPouch); } } static void CB2_BerryPouchIdle(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); DoScheduledBgTilemapCopiesToVram(); UpdatePaletteFade(); } static void VBlankCB_BerryPouchIdle(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB2_InitBerryPouch(void) { while (1) { if (IsActiveOverworldLinkBusy() == TRUE) break; if (RunBerryPouchInit() == TRUE) break; if (MenuHelpers_IsLinkActive() == TRUE) break; } } static bool8 RunBerryPouchInit(void) { u8 taskId; switch (gMain.state) { case 0: SetVBlankHBlankCallbacksToNull(); ClearScheduledBgCopiesToVram(); gMain.state++; break; case 1: ScanlineEffect_Stop(); gMain.state++; break; case 2: FreeAllSpritePalettes(); gMain.state++; break; case 3: ResetPaletteFade(); gMain.state++; break; case 4: ResetSpriteData(); gMain.state++; break; case 5: ResetItemMenuIconState(); gMain.state++; break; case 6: if (!MenuHelpers_IsLinkActive()) ResetTasks(); gMain.state++; break; case 7: BerryPouchInitBgs(); sResources->data[0] = 0; gMain.state++; break; case 8: if (BerryPouchLoadGfx()) gMain.state++; break; case 9: BerryPouchInitWindows(); gMain.state++; break; case 10: SortAndCountBerries(); SanitizeListMenuSelectionParams(); UpdateListMenuScrollOffset(); gMain.state++; break; case 11: if (!AllocateListMenuBuffers()) { AbortBerryPouchLoading(); return TRUE; } gMain.state++; break; case 12: SetUpListMenuTemplate(); gMain.state++; break; case 13: PrintBerryPouchHeaderCentered(); gMain.state++; break; case 14: taskId = CreateTask(Task_BerryPouchMain, 0); gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow); gTasks[taskId].data[8] = 0; gMain.state++; break; case 15: CreateBerryPouchSprite(); gMain.state++; break; case 16: CreateScrollIndicatorArrows_BerryPouchList(); gMain.state++; break; case 17: BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); gMain.state++; break; case 18: BeginNormalPaletteFade(PALETTES_ALL, -2, 16, 0, RGB_BLACK); gMain.state++; break; default: SetVBlankCallback(VBlankCB_BerryPouchIdle); SetMainCallback2(CB2_BerryPouchIdle); return TRUE; } return FALSE; } static void AbortBerryPouchLoading(void) { BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); CreateTask(Task_AbortBerryPouchLoading_WaitFade, 0); SetVBlankCallback(VBlankCB_BerryPouchIdle); SetMainCallback2(CB2_BerryPouchIdle); } static void Task_AbortBerryPouchLoading_WaitFade(u8 taskId) { if (!gPaletteFade.active) { SetMainCallback2(sStaticCnt.savedCallback); BerryPouch_DestroyResources(); DestroyTask(taskId); } } static void BerryPouchInitBgs(void) { ResetAllBgsCoordinatesAndBgCntRegs(); memset(sResources->bg1TilemapBuffer, 0, BG_SCREEN_SIZE); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetBgTilemapBuffer(1, sResources->bg1TilemapBuffer); ScheduleBgCopyTilemapToVram(1); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); ShowBg(1); ShowBg(2); } static bool8 BerryPouchLoadGfx(void) { switch (sResources->data[0]) { case 0: ResetTempTileDataBuffers(); DecompressAndCopyTileDataToVram(1, gBerryPouchBgGfx, 0, 0, 0); sResources->data[0]++; break; case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { LZDecompressWram(gBerryPouchBg1Tilemap, sResources->bg1TilemapBuffer); sResources->data[0]++; } break; case 2: LoadCompressedPalette(gBerryPouchBgPals, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP); if (gSaveBlock2Ptr->playerGender != MALE) LoadCompressedPalette(gBerryPouchBgPal0FemaleOverride, BG_PLTT_ID(0), PLTT_SIZE_4BPP); sResources->data[0]++; break; case 3: LoadCompressedSpriteSheet(&sBerryPouchSpriteSheet); sResources->data[0]++; break; default: LoadCompressedSpritePalette(&sBerryPouchSpritePal); sResources->data[0] = 0; return TRUE; } return FALSE; } static bool8 AllocateListMenuBuffers(void) { sListMenuItems = Alloc(NUM_BERRIES * sizeof(struct ListMenuItem)); if (sListMenuItems == NULL) return FALSE; sListMenuStrbuf = Alloc(sResources->listMenuNumItems * 27); if (sListMenuStrbuf == NULL) return FALSE; return TRUE; } static void SetUpListMenuTemplate(void) { u32 i; struct BagPocket *pocket = &gBagPockets[POCKET_BERRY_POUCH - 1]; for (i = 0; i < sResources->listMenuNumItems; i++) { GetBerryNameAndIndexForMenu(&sListMenuStrbuf[i * 27], pocket->itemSlots[i].itemId); sListMenuItems[i].label = &sListMenuStrbuf[i * 27]; sListMenuItems[i].index = i; } sListMenuItems[i].label = gText_Close; sListMenuItems[i].index = i; gMultiuseListMenuTemplate.items = sListMenuItems; if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) gMultiuseListMenuTemplate.totalItems = sResources->listMenuNumItems + 1; else gMultiuseListMenuTemplate.totalItems = sResources->listMenuNumItems; gMultiuseListMenuTemplate.windowId = 0; gMultiuseListMenuTemplate.header_X = 0; gMultiuseListMenuTemplate.item_X = 9; gMultiuseListMenuTemplate.cursor_X = 1; gMultiuseListMenuTemplate.lettersSpacing = 0; gMultiuseListMenuTemplate.itemVerticalPadding = 2; gMultiuseListMenuTemplate.upText_Y = 2; gMultiuseListMenuTemplate.maxShowed = sResources->listMenuMaxShowed; gMultiuseListMenuTemplate.fontId = FONT_NORMAL; gMultiuseListMenuTemplate.cursorPal = 2; gMultiuseListMenuTemplate.fillValue = 0; gMultiuseListMenuTemplate.cursorShadowPal = 3; gMultiuseListMenuTemplate.moveCursorFunc = BerryPouchMoveCursorFunc; gMultiuseListMenuTemplate.itemPrintFunc = BerryPouchItemPrintFunc; gMultiuseListMenuTemplate.cursorKind = 0; gMultiuseListMenuTemplate.scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD; } static void GetBerryNameAndIndexForMenu(u8 * dest, u16 itemId) { StringCopy(gStringVar4, gText_FontSmall); StringAppend(gStringVar4, gText_NumberClear01); ConvertIntToDecimalStringN(gStringVar1, itemId - FIRST_BERRY_INDEX + 1, STR_CONV_MODE_LEADING_ZEROS, 2); StringAppend(gStringVar4, gStringVar1); CopyItemName(itemId, gStringVar1); StringAppend(gStringVar4, sText_Space); StringAppend(gStringVar4, gText_FontNormal); StringAppend(gStringVar4, gStringVar1); StringCopy(dest, gStringVar4); } static void CopySelectedListMenuItemName(s16 itemIdx, u8 * dest) { StringCopy(dest, &sListMenuStrbuf[itemIdx * 27]); } static void BerryPouchMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) { if (onInit != TRUE) { PlaySE(SE_BAG_CURSOR); StartBerryPouchSpriteWobbleAnim(); } DestroyItemMenuIcon(sResources->itemMenuIconId ^ 1); if (sResources->listMenuNumItems != itemIndex) CreateBerryPouchItemIcon(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, itemIndex), sResources->itemMenuIconId); else CreateBerryPouchItemIcon(ITEMS_COUNT, sResources->itemMenuIconId); sResources->itemMenuIconId ^= 1; PrintSelectedBerryDescription(itemIndex); } static void BerryPouchItemPrintFunc(u8 windowId, u32 itemId, u8 y) { u16 unused; u16 itemQuantity; if (itemId != -2 && sResources->listMenuNumItems != itemId) { unused = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, itemId); itemQuantity = BagGetQuantityByPocketPosition(POCKET_BERRY_POUCH, itemId); ConvertIntToDecimalStringN(gStringVar1, itemQuantity, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); BerryPouchPrint(windowId, FONT_SMALL, gStringVar4, 110, y, 0, 0, 0xFF, 1); } } static void BerryPouchSetArrowCursorFromListMenu(u8 taskId, u8 colorIdx) { BerryPouchSetArrowCursorAt(ListMenuGetYCoordForPrintingArrowCursor(taskId), colorIdx); } static void BerryPouchSetArrowCursorAt(u8 y, u8 colorIdx) { u8 width; u8 height; if (colorIdx == 0xFF) { width = GetMenuCursorDimensionByFont(FONT_NORMAL, 0); height = GetMenuCursorDimensionByFont(FONT_NORMAL, 1); FillWindowPixelRect(0, 0, 1, y, width, height); CopyWindowToVram(0, COPYWIN_GFX); } else { BerryPouchPrint(0, FONT_NORMAL, gText_SelectorArrow2, 1, y, 0, 0, 0, colorIdx); } } static void PrintSelectedBerryDescription(s32 itemIdx) { const u8 * str; if (itemIdx != sResources->listMenuNumItems) str = ItemId_GetDescription(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, itemIdx)); else str = gText_TheBerryPouchWillBePutAway; FillWindowPixelBuffer(1, PIXEL_FILL(0)); BerryPouchPrint(1, FONT_NORMAL, str, 0, 2, 2, 0, 0, 0); } static void SetDescriptionWindowBorderPalette(s32 pal) { SetBgTilemapPalette(1, 0, 16, 30, 4, pal + 1); ScheduleBgCopyTilemapToVram(1); } static void CreateScrollIndicatorArrows_BerryPouchList(void) { if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 160, 8, 120, sResources->listMenuNumItems - sResources->listMenuMaxShowed + 1, 110, 110, &sStaticCnt.listMenuScrollOffset); else sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 160, 8, 120, sResources->listMenuNumItems - sResources->listMenuMaxShowed, 110, 110, &sStaticCnt.listMenuScrollOffset); } static void CreateScrollIndicatorArrows_TossQuantity(void) { sResources->indicatorOffset = 1; sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 212, 120, 152, 2, 110, 110, &sResources->indicatorOffset); } static void CreateScrollIndicatorArrows_SellQuantity(void) { sResources->indicatorOffset = 1; sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 152, 72, 104, 2, 110, 110, &sResources->indicatorOffset); } static void DestroyScrollIndicatorArrows(void) { if (sResources->indicatorTaskId != 0xFF) { RemoveScrollIndicatorArrowPair(sResources->indicatorTaskId); sResources->indicatorTaskId = 0xFF; } } static void PrintBerryPouchHeaderCentered(void) { u32 slack = 72 - GetStringWidth(FONT_NORMAL_COPY_1, gText_BerryPouch, 0); BerryPouchPrint(2, FONT_NORMAL_COPY_1, gText_BerryPouch, slack / 2, 1, 0, 0, 0, 0); } void BerryPouch_CursorResetToTop(void) { sStaticCnt.listMenuSelectedRow = 0; sStaticCnt.listMenuScrollOffset = 0; } static void SanitizeListMenuSelectionParams(void) { s32 r2; if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) r2 = sResources->listMenuNumItems + 1; else r2 = sResources->listMenuNumItems; if (sStaticCnt.listMenuScrollOffset != 0 && sStaticCnt.listMenuScrollOffset + sResources->listMenuMaxShowed > r2) sStaticCnt.listMenuScrollOffset = r2 - sResources->listMenuMaxShowed; if (sStaticCnt.listMenuScrollOffset + sStaticCnt.listMenuSelectedRow >= r2) { if (r2 == 0 || r2 == 1) sStaticCnt.listMenuSelectedRow = 0; else sStaticCnt.listMenuSelectedRow = r2 - 1; } } static void UpdateListMenuScrollOffset(void) { u8 lim; u32 i; if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) lim = sResources->listMenuNumItems + 1; else lim = sResources->listMenuNumItems; if (sStaticCnt.listMenuSelectedRow > 4) { for (i = 0; i <= sStaticCnt.listMenuSelectedRow - 4; sStaticCnt.listMenuSelectedRow--, sStaticCnt.listMenuScrollOffset++, i++) { if (sStaticCnt.listMenuScrollOffset + sResources->listMenuMaxShowed == lim) break; } } } static void BerryPouch_DestroyResources(void) { if (sResources != NULL) Free(sResources); if (sListMenuItems != NULL) Free(sListMenuItems); if (sListMenuStrbuf != NULL) Free(sListMenuStrbuf); FreeAllWindowBuffers(); } void BerryPouch_StartFadeToExitCallback(u8 taskId) { BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_BerryPouchFadeToExitCallback; } static void Task_BerryPouchFadeToExitCallback(u8 taskId) { s16 * data = gTasks[taskId].data; if (!gPaletteFade.active) { DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); if (sResources->exitCallback != NULL) SetMainCallback2(sResources->exitCallback); else SetMainCallback2(sStaticCnt.savedCallback); DestroyScrollIndicatorArrows(); BerryPouch_DestroyResources(); DestroyTask(taskId); } } static void SortAndCountBerries(void) { u32 i; u32 r2; struct BagPocket *pocket = &gBagPockets[POCKET_BERRY_POUCH - 1]; SortAndCompactBagPocket(pocket); sResources->listMenuNumItems = 0; for (i = 0; i < pocket->capacity; i++) { if (pocket->itemSlots[i].itemId == ITEM_NONE) break; sResources->listMenuNumItems++; } if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) r2 = sResources->listMenuNumItems + 1; else r2 = sResources->listMenuNumItems; if (r2 > 7) sResources->listMenuMaxShowed = 7; else sResources->listMenuMaxShowed = r2; } void BerryPouch_SetExitCallback(void (*callback)(void)) { sResources->exitCallback = callback; } void InitTossQuantitySelectUI(u8 taskId, const u8 * str) { s16 * data = gTasks[taskId].data; u8 windowId = GetOrCreateVariableWindow(8); u8 windowId2; CopySelectedListMenuItemName(data[1], gStringVar1); StringExpandPlaceholders(gStringVar4, str); BerryPouchPrint(windowId, FONT_NORMAL, gStringVar4, 0, 2, 1, 2, 0, 1); windowId2 = GetOrCreateVariableWindow(0); ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 3); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); BerryPouchPrint(windowId2, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, 1); } static void PrintxQuantityOnWindow(u8 whichWindow, s16 quantity, u8 ndigits) { u8 windowId = GetVariableWindowId(whichWindow); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, ndigits); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); BerryPouchPrint(windowId, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, 1); } static void Task_BerryPouchMain(u8 taskId) { s16 * data = gTasks[taskId].data; s32 menuInput; if (!gPaletteFade.active && IsActiveOverworldLinkBusy() != TRUE) { menuInput = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); if (JOY_NEW(SELECT_BUTTON) && sStaticCnt.allowSelect == 1) { PlaySE(SE_SELECT); gSpecialVar_ItemId = 0; BerryPouch_StartFadeToExitCallback(taskId); } else { switch (menuInput) { case -1: return; case -2: if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) { PlaySE(SE_SELECT); gSpecialVar_ItemId = 0; BerryPouch_StartFadeToExitCallback(taskId); } break; default: PlaySE(SE_SELECT); if (sStaticCnt.type == BERRYPOUCH_FROMBERRYCRUSH) { gSpecialVar_ItemId = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, menuInput); BerryPouch_StartFadeToExitCallback(taskId); } else if (menuInput == sResources->listMenuNumItems) { gSpecialVar_ItemId = 0; BerryPouch_StartFadeToExitCallback(taskId); } else { DestroyScrollIndicatorArrows(); SetDescriptionWindowBorderPalette(1); BerryPouchSetArrowCursorFromListMenu(data[0], 2); data[1] = menuInput; data[2] = BagGetQuantityByPocketPosition(POCKET_BERRY_POUCH, menuInput); gSpecialVar_ItemId = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, menuInput); gTasks[taskId].func = sBerryPouchContextMenuTasks[sStaticCnt.type]; } break; } } } } static void Task_CleanUpAndReturnToMain(u8 taskId) { SetDescriptionWindowBorderPalette(0); CreateScrollIndicatorArrows_BerryPouchList(); gTasks[taskId].func = Task_BerryPouchMain; } static void CreateNormalContextMenu(u8 taskId) { s16 * data = gTasks[taskId].data; u8 windowId; u8 windowId2; if (sStaticCnt.type == BERRYPOUCH_FROMBATTLE) { sContextMenuOptions = sOptions_UseToss_Exit; sContextMenuNumOptions = 3; } else if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE) { if (!IsHoldingItemAllowed(gSpecialVar_ItemId)) { sContextMenuOptions = sOptions_Exit; sContextMenuNumOptions = 1; } else { sContextMenuOptions = sOptions_GiveExit; sContextMenuNumOptions = 2; } } else { sContextMenuOptions = sOptions_UseGiveTossExit; sContextMenuNumOptions = 4; } windowId = GetOrCreateVariableWindow(sContextMenuNumOptions + 9); AddItemMenuActionTextPrinters(windowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING), GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumOptions, sContextMenuActions, sContextMenuOptions); Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumOptions, 0); windowId2 = GetOrCreateVariableWindow(6); CopySelectedListMenuItemName(data[1], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected); BerryPouchPrint(windowId2, FONT_NORMAL, gStringVar4, 0, 2, 1, 2, 0, 1); } static void Task_NormalContextMenu(u8 taskId) { CreateNormalContextMenu(taskId); gTasks[taskId].func = Task_NormalContextMenu_HandleInput; } static void Task_NormalContextMenu_HandleInput(u8 taskId) { s8 input; if (IsActiveOverworldLinkBusy() != TRUE) { input = Menu_ProcessInputNoWrapAround(); switch (input) { case -2: break; case -1: PlaySE(SE_SELECT); sContextMenuActions[BP_ACTION_EXIT].func.void_u8(taskId); break; default: PlaySE(SE_SELECT); sContextMenuActions[sContextMenuOptions[input]].func.void_u8(taskId); break; } } } static void Task_BerryPouch_Use(u8 taskId) { DestroyVariableWindow(sContextMenuNumOptions + 9); DestroyVariableWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(2); if (sStaticCnt.type == BERRYPOUCH_FROMBATTLE) { if (ItemId_GetBattleFunc(gSpecialVar_ItemId) == NULL) FieldUseFunc_OakStopsYou(taskId); else ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId); } else if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == ITEM_TYPE_PARTY_MENU) Task_Give_PrintThereIsNoPokemon(taskId); else ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); } static void Task_BerryPouch_Toss(u8 taskId) { s16 * data = gTasks[taskId].data; ClearWindowTilemap(GetVariableWindowId(sContextMenuNumOptions + 9)); ClearWindowTilemap(GetVariableWindowId(6)); DestroyVariableWindow(sContextMenuNumOptions + 9); DestroyVariableWindow(6); PutWindowTilemap(0); data[8] = 1; if (data[2] == 1) Task_AskTossMultiple(taskId); else { InitTossQuantitySelectUI(taskId, gText_TossOutHowManyStrVar1s); CreateScrollIndicatorArrows_TossQuantity(); gTasks[taskId].func = Task_Toss_SelectMultiple; } } static void Task_AskTossMultiple(u8 taskId) { s16 * data = gTasks[taskId].data; ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_ThrowAwayStrVar2OfThisItemQM); BerryPouchPrint(GetOrCreateVariableWindow(7), FONT_NORMAL, gStringVar4, 0, 2, 1, 2, 0, 1); CreateYesNoMenuWin3(taskId, &sYesNoFuncs_Toss); } static void Task_TossNo(u8 taskId) { s16 * data = gTasks[taskId].data; DestroyVariableWindow(7); PutWindowTilemap(1); PutWindowTilemap(0); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(2); BerryPouchSetArrowCursorFromListMenu(data[0], 1); Task_CleanUpAndReturnToMain(taskId); } static void Task_Toss_SelectMultiple(u8 taskId) { s16 * data = gTasks[taskId].data; if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) PrintxQuantityOnWindow(0, data[8], 3); else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); ClearWindowTilemap(GetVariableWindowId(8)); DestroyVariableWindow(8); DestroyVariableWindow(0); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(2); DestroyScrollIndicatorArrows(); Task_AskTossMultiple(taskId); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); DestroyVariableWindow(8); DestroyVariableWindow(0); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(2); BerryPouchSetArrowCursorFromListMenu(data[0], 1); DestroyScrollIndicatorArrows(); Task_CleanUpAndReturnToMain(taskId); } } static void Task_TossYes(u8 taskId) { s16 * data = gTasks[taskId].data; DestroyVariableWindow(7); CopySelectedListMenuItemName(data[1], gStringVar1); ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_ThrewAwayStrVar2StrVar1s); BerryPouchPrint(GetOrCreateVariableWindow(9), FONT_NORMAL, gStringVar4, 0, 2, 1, 2, 0, 1); gTasks[taskId].func = Task_WaitButtonThenTossBerries; } static void Task_WaitButtonThenTossBerries(u8 taskId) { s16 * data = gTasks[taskId].data; if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); RemoveBagItem(gSpecialVar_ItemId, data[8]); DestroyVariableWindow(9); DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); SortAndCountBerries(); SanitizeListMenuSelectionParams(); SetUpListMenuTemplate(); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); BerryPouchSetArrowCursorFromListMenu(data[0], 1); Task_CleanUpAndReturnToMain(taskId); } } static void Task_BerryPouch_Give(u8 taskId) { DestroyVariableWindow(sContextMenuNumOptions + 9); DestroyVariableWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(2); if (CalculatePlayerPartyCount() == 0) Task_Give_PrintThereIsNoPokemon(taskId); else { sResources->exitCallback = CB2_ChooseMonToGiveItem; gTasks[taskId].func = BerryPouch_StartFadeToExitCallback; } } static void Task_Give_PrintThereIsNoPokemon(u8 taskId) { DisplayItemMessageInBerryPouch(taskId, FONT_NORMAL, gText_ThereIsNoPokemon, Task_WaitButtonBeforeDialogueWindowDestruction); } static void Task_WaitButtonBeforeDialogueWindowDestruction(u8 taskId) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(taskId); } } void Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(u8 taskId) { s16 * data = gTasks[taskId].data; TryDestroyVariableWindow(5); DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); SortAndCountBerries(); SanitizeListMenuSelectionParams(); SetUpListMenuTemplate(); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow); ScheduleBgCopyTilemapToVram(0); BerryPouchSetArrowCursorFromListMenu(data[0], 1); Task_CleanUpAndReturnToMain(taskId); } static void Task_BerryPouch_Exit(u8 taskId) { DestroyVariableWindow(sContextMenuNumOptions + 9); DestroyVariableWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(2); BerryPouchSetArrowCursorFromListMenu(gTasks[taskId].data[0], 1); Task_CleanUpAndReturnToMain(taskId); } static void Task_ContextMenu_FromPartyGiveMenu(u8 taskId) { s16 * data = gTasks[taskId].data; u16 itemId = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1]); if (!IsHoldingItemAllowed(itemId)) { CopyItemName(itemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_TheStrVar1CantBeHeldHere); DisplayItemMessageInBerryPouch(taskId, FONT_NORMAL, gStringVar4, Task_WaitButtonBeforeDialogueWindowDestruction); } else { sResources->exitCallback = CB2_GiveHoldItem; gTasks[taskId].func = BerryPouch_StartFadeToExitCallback; } } static void Task_ContextMenu_FromPokemonPC(u8 taskId) { sResources->exitCallback = CB2_ReturnToPokeStorage; gTasks[taskId].func = BerryPouch_StartFadeToExitCallback; } static void Task_ContextMenu_Sell(u8 taskId) { s16 * data = gTasks[taskId].data; if (ItemId_GetPrice(gSpecialVar_ItemId) == 0) { CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat); DisplayItemMessageInBerryPouch(taskId, GetDialogBoxFontId(), gStringVar4, Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu); } else { data[8] = 1; if (data[2] == 1) { PrintMoneyInWin2(); Task_AskSellMultiple(taskId); } else { if (data[2] > 99) data[2] = 99; CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell); DisplayItemMessageInBerryPouch(taskId, GetDialogBoxFontId(), gStringVar4, Task_Sell_PrintSelectMultipleUI); } } } static void Task_AskSellMultiple(u8 taskId) { s16 * data = gTasks[taskId].data; ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay); DisplayItemMessageInBerryPouch(taskId, GetDialogBoxFontId(), gStringVar4, Task_SellMultiple_CreateYesNoMenu); } static void Task_SellMultiple_CreateYesNoMenu(u8 taskId) { CreateYesNoMenuWin4(taskId, &sYesNoFuncs_Sell); } static void Task_SellNo(u8 taskId) { s16 * data = gTasks[taskId].data; DestroyVariableWindow(2); TryDestroyVariableWindow(5); PutWindowTilemap(2); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); BerryPouchSetArrowCursorFromListMenu(data[0], 1); Task_CleanUpAndReturnToMain(taskId); } static void Task_Sell_PrintSelectMultipleUI(u8 taskId) { s16 * data = gTasks[taskId].data; u8 windowId = GetOrCreateVariableWindow(1); ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); BerryPouchPrint(windowId, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0xFF, 1); SellMultiple_UpdateSellPriceDisplay(ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8]); PrintMoneyInWin2(); CreateScrollIndicatorArrows_SellQuantity(); gTasks[taskId].func = Task_Sell_SelectMultiple; } static void SellMultiple_UpdateSellPriceDisplay(s32 price) { PrintMoneyAmount(GetVariableWindowId(1), 56, 10, price, 0); } static void Task_Sell_SelectMultiple(u8 taskId) { s16 * data = gTasks[taskId].data; if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) { PrintxQuantityOnWindow(1, data[8], 2); SellMultiple_UpdateSellPriceDisplay(ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8]); } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); DestroyVariableWindow(1); PutWindowTilemap(0); ScheduleBgCopyTilemapToVram(0); DestroyScrollIndicatorArrows(); Task_AskSellMultiple(taskId); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); DestroyVariableWindow(1); DestroyVariableWindow(2); TryDestroyVariableWindow(5); PutWindowTilemap(2); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); DestroyScrollIndicatorArrows(); BerryPouchSetArrowCursorFromListMenu(data[0], 1); Task_CleanUpAndReturnToMain(taskId); } } static void Task_SellYes(u8 taskId) { s16 * data = gTasks[taskId].data; PutWindowTilemap(0); ScheduleBgCopyTilemapToVram(0); CopyItemName(gSpecialVar_ItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen); DisplayItemMessageInBerryPouch(taskId, FONT_NORMAL, gStringVar4, Task_SellBerries_PlaySfxAndRemoveBerries); } static void Task_SellBerries_PlaySfxAndRemoveBerries(u8 taskId) { s16 * data = gTasks[taskId].data; PlaySE(SE_SHOP); RemoveBagItem(gSpecialVar_ItemId, data[8]); AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * data[8]); RecordItemTransaction(gSpecialVar_ItemId, data[8], QL_EVENT_SOLD_ITEM - QL_EVENT_USED_POKEMART); DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); SortAndCountBerries(); SanitizeListMenuSelectionParams(); SetUpListMenuTemplate(); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow); BerryPouchSetArrowCursorFromListMenu(data[0], 2); PrintMoneyAmountInMoneyBox(GetVariableWindowId(2), GetMoney(&gSaveBlock1Ptr->money), 0); gTasks[taskId].func = Task_SellBerries_WaitButton; } static void Task_SellBerries_WaitButton(u8 taskId) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); DestroyVariableWindow(2); PutWindowTilemap(2); Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(taskId); } } static void BerryPouchInitWindows(void) { u32 i; InitWindows(sWindowTemplates_Main); DeactivateAllTextPrinters(); LoadUserWindowGfx(0, 0x001, BG_PLTT_ID(14)); LoadMenuMessageWindowGfx(0, 0x013, BG_PLTT_ID(13)); LoadStdWindowGfx(0, 0x00A, BG_PLTT_ID(12)); LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZE_4BPP); for (i = 0; i < 3; i++) FillWindowPixelBuffer(i, PIXEL_FILL(0)); PutWindowTilemap(0); PutWindowTilemap(1); PutWindowTilemap(2); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(2); for (i = 0; i < 14; i++) sVariableWindowIds[i] = 0xFF; } static void BerryPouchPrint(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx) { AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str); } static u8 GetOrCreateVariableWindow(u8 winIdx) { u8 retval = sVariableWindowIds[winIdx]; if (retval == 0xFF) { sVariableWindowIds[winIdx] = AddWindow(&sWindowTemplates_Variable[winIdx]); if (winIdx == 2 || winIdx == 6 || winIdx == 7 || winIdx == 8 || winIdx == 9) DrawStdFrameWithCustomTileAndPalette(sVariableWindowIds[winIdx], FALSE, 0x00A, 12); else DrawStdFrameWithCustomTileAndPalette(sVariableWindowIds[winIdx], FALSE, 0x001, 14); ScheduleBgCopyTilemapToVram(2); retval = sVariableWindowIds[winIdx]; } return retval; } static void VariableWindowSetAltFrameTileAndPalette(u8 winIdx) { DrawStdFrameWithCustomTileAndPalette(sVariableWindowIds[winIdx], FALSE, 0x001, 14); } static void DestroyVariableWindow(u8 winIdx) { ClearStdWindowAndFrameToTransparent(sVariableWindowIds[winIdx], FALSE); ClearWindowTilemap(sVariableWindowIds[winIdx]); RemoveWindow(sVariableWindowIds[winIdx]); ScheduleBgCopyTilemapToVram(2); sVariableWindowIds[winIdx] = 0xFF; } static void TryDestroyVariableWindow(u8 winIdx) { if (sVariableWindowIds[winIdx] != 0xFF) { ClearDialogWindowAndFrameToTransparent(sVariableWindowIds[winIdx], FALSE); ClearWindowTilemap(sVariableWindowIds[winIdx]); RemoveWindow(sVariableWindowIds[winIdx]); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(2); sVariableWindowIds[winIdx] = 0xFF; } } static u8 GetVariableWindowId(u8 winIdx) { return sVariableWindowIds[winIdx]; } void DisplayItemMessageInBerryPouch(u8 taskId, u8 fontId, const u8 * str, TaskFunc followUpFunc) { if (sVariableWindowIds[5] == 0xFF) sVariableWindowIds[5] = AddWindow(&sWindowTemplates_Variable[5]); DisplayMessageAndContinueTask(taskId, sVariableWindowIds[5], 0x013, 0xD, fontId, GetTextSpeedSetting(), str, followUpFunc); ScheduleBgCopyTilemapToVram(2); } static void CreateYesNoMenuWin3(u8 taskId, const struct YesNoFuncTable *ptrs) { CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_Variable[3], FONT_NORMAL, 0, 2, 0x001, 14, ptrs); } static void CreateYesNoMenuWin4(u8 taskId, const struct YesNoFuncTable *ptrs) { CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_Variable[4], FONT_NORMAL, 0, 2, 0x001, 14, ptrs); } static void PrintMoneyInWin2(void) { PrintMoneyAmountInMoneyBoxWithBorder(GetOrCreateVariableWindow(2), 0x00A, 0xC, GetMoney(&gSaveBlock1Ptr->money)); } static void CreateBerryPouchSprite(void) { sBerryPouchSpriteId = CreateSprite(&sSpriteTemplate_BerryPouch, 40, 76, 0); } static void StartBerryPouchSpriteWobbleAnim(void) { struct Sprite *sprite = &gSprites[sBerryPouchSpriteId]; if (sprite->affineAnimEnded) { StartSpriteAffineAnim(sprite, 1); sprite->callback = SpriteCB_BerryPouchWaitWobbleAnim; } } static void SpriteCB_BerryPouchWaitWobbleAnim(struct Sprite *sprite) { if (sprite->affineAnimEnded) { StartSpriteAffineAnim(sprite, 0); sprite->callback = SpriteCallbackDummy; } } ================================================ FILE: src/berry_powder.c ================================================ #include "global.h" #include "event_data.h" #include "load_save.h" #include "menu.h" #include "palette.h" #include "quest_log.h" #include "script_menu.h" #include "string_util.h" #include "strings.h" #include "text.h" #include "text_window.h" #define MAX_BERRY_POWDER 99999 static EWRAM_DATA u8 sBerryPowderVendorWindowId = 0; u32 DecryptBerryPowder(u32 *powder) { return *powder ^ gSaveBlock2Ptr->encryptionKey; } void SetBerryPowder(u32 *powder, u32 amount) { *powder = amount ^ gSaveBlock2Ptr->encryptionKey; } void ApplyNewEncryptionKeyToBerryPowder(u32 encryptionKey) { ApplyNewEncryptionKeyToWord(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, encryptionKey); } static bool8 HasEnoughBerryPowder(u32 cost) { if (DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < cost) return FALSE; else return TRUE; } bool8 Script_HasEnoughBerryPowder(void) { if (DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < gSpecialVar_0x8004) return FALSE; else return TRUE; } bool8 GiveBerryPowder(u32 amountToAdd) { u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount; u32 amount = DecryptBerryPowder(powder) + amountToAdd; if (amount > MAX_BERRY_POWDER) { SetBerryPowder(powder, MAX_BERRY_POWDER); return FALSE; } else { SetBerryPowder(powder, amount); return TRUE; } } static bool8 TakeBerryPowder(u32 cost) { u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount; if (!HasEnoughBerryPowder(cost)) return FALSE; else { u32 amount = DecryptBerryPowder(powder); SetBerryPowder(powder, amount - cost); return TRUE; } } bool8 Script_TakeBerryPowder(void) { u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount; if (!HasEnoughBerryPowder(gSpecialVar_0x8004)) return FALSE; else { u32 amount = DecryptBerryPowder(powder); SetBerryPowder(powder, amount - gSpecialVar_0x8004); return TRUE; } } u32 GetBerryPowder(void) { return DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount); } static void PrintBerryPowderAmount(u8 windowId, u32 amount, u8 x, u8 y, u8 speed) { ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_RIGHT_ALIGN, 5); AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar1, x, y, speed, NULL); } static void DrawPlayerPowderAmount(u8 windowId, u16 baseBlock, u8 palette, u32 amount) { DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, baseBlock, palette); AddTextPrinterParameterized(windowId, FONT_SMALL, gOtherText_Powder, 0, 0, -1, NULL); PrintBerryPowderAmount(windowId, amount, 39, 12, 0); } void PrintPlayerBerryPowderAmount(void) { PrintBerryPowderAmount(sBerryPowderVendorWindowId, GetBerryPowder(), 39, 12, 0); } void DisplayBerryPowderVendorMenu(void) { struct WindowTemplate template; if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE) return; template = SetWindowTemplateFields(0, 1, 1, 8, 3, 15, 32); sBerryPowderVendorWindowId = AddWindow(&template); FillWindowPixelBuffer(sBerryPowderVendorWindowId, 0); PutWindowTilemap(sBerryPowderVendorWindowId); LoadStdWindowGfx(sBerryPowderVendorWindowId, 0x21D, BG_PLTT_ID(13)); DrawPlayerPowderAmount(sBerryPowderVendorWindowId, 0x21D, 13, GetBerryPowder()); } void RemoveBerryPowderVendorMenu(void) { ClearWindowTilemap(sBerryPowderVendorWindowId); ClearStdWindowAndFrameToTransparent(sBerryPowderVendorWindowId, 1); RemoveWindow(sBerryPowderVendorWindowId); } ================================================ FILE: src/bg.c ================================================ #include #include "global.h" #include "bg.h" #include "dma3.h" #include "gpu_regs.h" #define DISPCNT_ALL_BG_AND_MODE_BITS (DISPCNT_BG_ALL_ON | 0x7) struct BgControl { struct BgConfig { u16 visible:1; u16 unknown_1:1; u16 screenSize:2; u16 priority:2; u16 mosaic:1; u16 wraparound:1; u16 charBaseIndex:2; u16 mapBaseIndex:5; u16 paletteMode:1; u8 unknown_2; u8 unknown_3; } configs[4]; u16 bgVisibilityAndMode; }; struct BgConfig2 { u32 baseTile:10; u32 basePalette:4; u32 unk_3:18; void *tilemap; u32 bg_x; u32 bg_y; }; static struct BgControl sGpuBgConfigs; static struct BgConfig2 sGpuBgConfigs2[4]; static u32 sDmaBusyBitfield[4]; static u8 gpu_tile_allocation_map_bg[0x100]; bool32 gWindowTileAutoAllocEnabled; static const struct BgConfig sZeroedBgControlStruct = { 0 }; void ResetBgs(void) { ResetBgControlStructs(); sGpuBgConfigs.bgVisibilityAndMode = 0; SetTextModeAndHideBgs(); } void SetBgModeInternal(u8 bgMode) { sGpuBgConfigs.bgVisibilityAndMode &= 0xFFF8; sGpuBgConfigs.bgVisibilityAndMode |= bgMode; } u8 GetBgMode(void) { return sGpuBgConfigs.bgVisibilityAndMode & 0x7; } void ResetBgControlStructs(void) { struct BgConfig* bgConfigs = &sGpuBgConfigs.configs[0]; struct BgConfig zeroedConfig = sZeroedBgControlStruct; int i; for (i = 0; i < 4; i++) { bgConfigs[i] = zeroedConfig; } } void Unused_ResetBgControlStruct(u8 bg) { if (IsInvalidBg(bg) == FALSE) { sGpuBgConfigs.configs[bg] = sZeroedBgControlStruct; } } void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound) { if (IsInvalidBg(bg) == FALSE) { if (charBaseIndex != 0xFF) { sGpuBgConfigs.configs[bg].charBaseIndex = charBaseIndex & 0x3; } if (mapBaseIndex != 0xFF) { sGpuBgConfigs.configs[bg].mapBaseIndex = mapBaseIndex & 0x1F; } if (screenSize != 0xFF) { sGpuBgConfigs.configs[bg].screenSize = screenSize & 0x3; } if (paletteMode != 0xFF) { sGpuBgConfigs.configs[bg].paletteMode = paletteMode; } if (priority != 0xFF) { sGpuBgConfigs.configs[bg].priority = priority & 0x3; } if (mosaic != 0xFF) { sGpuBgConfigs.configs[bg].mosaic = mosaic & 0x1; } if (wraparound != 0xFF) { sGpuBgConfigs.configs[bg].wraparound = wraparound; } sGpuBgConfigs.configs[bg].unknown_2 = 0; sGpuBgConfigs.configs[bg].unknown_3 = 0; sGpuBgConfigs.configs[bg].visible = 1; } } u16 GetBgControlAttribute(u8 bg, u8 attributeId) { if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE) { switch (attributeId) { case BG_CTRL_ATTR_VISIBLE: return sGpuBgConfigs.configs[bg].visible; case BG_CTRL_ATTR_CHARBASEINDEX: return sGpuBgConfigs.configs[bg].charBaseIndex; case BG_CTRL_ATTR_MAPBASEINDEX: return sGpuBgConfigs.configs[bg].mapBaseIndex; case BG_CTRL_ATTR_SCREENSIZE: return sGpuBgConfigs.configs[bg].screenSize; case BG_CTRL_ATTR_PALETTEMODE: return sGpuBgConfigs.configs[bg].paletteMode; case BG_CTRL_ATTR_PRIORITY: return sGpuBgConfigs.configs[bg].priority; case BG_CTRL_ATTR_MOSAIC: return sGpuBgConfigs.configs[bg].mosaic; case BG_CTRL_ATTR_WRAPAROUND: return sGpuBgConfigs.configs[bg].wraparound; } } return 0xFF; } u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode) { u16 offset; s8 cursor; if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE) { switch (mode) { case 0x1: offset = sGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE; break; case 0x2: offset = sGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE; break; default: cursor = -1; goto end; } offset = destOffset + offset; cursor = RequestDma3Copy(src, (void *)(offset + BG_VRAM), size, DMA3_16BIT); if (cursor == -1) { return -1; } } else { return -1; } end: return cursor; } void ShowBgInternal(u8 bg) { u16 value; if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE) { value = sGpuBgConfigs.configs[bg].priority | (sGpuBgConfigs.configs[bg].charBaseIndex << 2) | (sGpuBgConfigs.configs[bg].mosaic << 6) | (sGpuBgConfigs.configs[bg].paletteMode << 7) | (sGpuBgConfigs.configs[bg].mapBaseIndex << 8) | (sGpuBgConfigs.configs[bg].wraparound << 13) | (sGpuBgConfigs.configs[bg].screenSize << 14); SetGpuReg((bg << 1) + 0x8, value); sGpuBgConfigs.bgVisibilityAndMode |= 1 << (bg + 8); sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; } } static void HideBgInternal(u8 bg) { if (IsInvalidBg(bg) == FALSE) { sGpuBgConfigs.bgVisibilityAndMode &= ~(1 << (bg + 8)); sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; } } static void SyncBgVisibilityAndMode(void) { SetGpuReg(0, (GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | sGpuBgConfigs.bgVisibilityAndMode); } void SetTextModeAndHideBgs(void) { SetGpuReg(0, GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS); } static void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) { struct BgAffineSrcData src; struct BgAffineDstData dest; switch (sGpuBgConfigs.bgVisibilityAndMode & 0x7) { case 1: if (bg != 2) return; break; case 2: if (bg < 2 || bg > 3) return; break; case 0: default: return; } src.texX = srcCenterX; src.texY = srcCenterY; src.scrX = dispCenterX; src.scrY = dispCenterY; src.sx = scaleX; src.sy = scaleY; src.alpha = rotationAngle; BgAffineSet(&src, &dest, 1); SetGpuReg(REG_OFFSET_BG2PA, dest.pa); SetGpuReg(REG_OFFSET_BG2PB, dest.pb); SetGpuReg(REG_OFFSET_BG2PC, dest.pc); SetGpuReg(REG_OFFSET_BG2PD, dest.pd); SetGpuReg(REG_OFFSET_BG2PA, dest.pa); SetGpuReg(REG_OFFSET_BG2X_L, (s16)(dest.dx)); SetGpuReg(REG_OFFSET_BG2X_H, (s16)(dest.dx >> 16)); SetGpuReg(REG_OFFSET_BG2Y_L, (s16)(dest.dy)); SetGpuReg(REG_OFFSET_BG2Y_H, (s16)(dest.dy >> 16)); } bool8 IsInvalidBg(u8 bg) { if (bg > 3) return TRUE; return FALSE; } int BgTileAllocOp(int bg, int offset, int count, int mode) { int start, end; int blockSize; int blockStart; int i; switch (mode) { case BG_TILE_FIND_FREE_SPACE: start = GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX) * (BG_CHAR_SIZE / TILE_SIZE_4BPP); end = start + 0x400; if (end > 0x800) end = 0x800; blockSize = 0; blockStart = 0; for (i = start, offset = 0; i < end; i++, offset++) { if (!((gpu_tile_allocation_map_bg[i / 8] >> (i % 8)) & 1)) { if (blockSize) { blockSize++; if (blockSize == count) return blockStart; } else { blockStart = offset; blockSize = 1; } } else { blockSize = 0; } } return -1; case BG_TILE_ALLOC: start = GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX) * (BG_CHAR_SIZE / TILE_SIZE_4BPP) + offset; end = start + count; for (i = start; i < end; i++) gpu_tile_allocation_map_bg[i / 8] |= 1 << (i % 8); break; case BG_TILE_FREE: start = GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX) * (BG_CHAR_SIZE / TILE_SIZE_4BPP) + offset; end = start + count; for (i = start; i < end; i++) gpu_tile_allocation_map_bg[i / 8] &= ~(1 << (i % 8)); break; } return 0; } void ResetBgsAndClearDma3BusyFlags(bool32 enableWindowTileAutoAlloc) { int i; ResetBgs(); for (i = 0; i < 4; i++) { sDmaBusyBitfield[i] = 0; } gWindowTileAutoAllocEnabled = enableWindowTileAutoAlloc; for (i = 0; i < 0x100; i++) { gpu_tile_allocation_map_bg[i] = 0; } } void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates) { int i; u8 bg; SetBgModeInternal(bgMode); ResetBgControlStructs(); for (i = 0; i < numTemplates; i++) { bg = templates[i].bg; if (bg < 4) { SetBgControlAttributes(bg, templates[i].charBaseIndex, templates[i].mapBaseIndex, templates[i].screenSize, templates[i].paletteMode, templates[i].priority, 0, 0); sGpuBgConfigs2[bg].baseTile = templates[i].baseTile; sGpuBgConfigs2[bg].basePalette = 0; sGpuBgConfigs2[bg].unk_3 = 0; sGpuBgConfigs2[bg].tilemap = NULL; sGpuBgConfigs2[bg].bg_x = 0; sGpuBgConfigs2[bg].bg_y = 0; gpu_tile_allocation_map_bg[(templates[i].charBaseIndex * (BG_CHAR_SIZE / TILE_SIZE_4BPP)) / 8] = 1; } } } void InitBgFromTemplate(const struct BgTemplate *template) { u8 bg = template->bg; if (bg < 4) { SetBgControlAttributes(bg, template->charBaseIndex, template->mapBaseIndex, template->screenSize, template->paletteMode, template->priority, 0, 0); sGpuBgConfigs2[bg].baseTile = template->baseTile; sGpuBgConfigs2[bg].basePalette = 0; sGpuBgConfigs2[bg].unk_3 = 0; sGpuBgConfigs2[bg].tilemap = NULL; sGpuBgConfigs2[bg].bg_x = 0; sGpuBgConfigs2[bg].bg_y = 0; gpu_tile_allocation_map_bg[(template->charBaseIndex * (BG_CHAR_SIZE / TILE_SIZE_4BPP)) / 8] = 1; } } u16 LoadBgTiles(u8 bg, const void *src, u16 size, u16 destOffset) { u16 tileOffset; u8 cursor; if (GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE) == 0) { tileOffset = (sGpuBgConfigs2[bg].baseTile + destOffset) * 0x20; } else { tileOffset = (sGpuBgConfigs2[bg].baseTile + destOffset) * 0x40; } cursor = LoadBgVram(bg, src, size, tileOffset, DISPCNT_MODE_1); if (cursor == 0xFF) { return -1; } sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20)); if (gWindowTileAutoAllocEnabled == TRUE) { BgTileAllocOp(bg, tileOffset / 0x20, size / 0x20, BG_TILE_ALLOC); } return cursor; } u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset) { u8 cursor; cursor = LoadBgVram(bg, src, size, destOffset * 32, DISPCNT_MODE_2); if (cursor == 0xFF) { return -1; } sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20)); return cursor; } u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset) { u16 paletteOffset; s8 cursor; if (IsInvalidBg32(bg) == FALSE) { paletteOffset = (sGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2); cursor = RequestDma3Copy(src, (void *)(paletteOffset + BG_PLTT), size, DMA3_16BIT); if (cursor == -1) { return -1; } } else { return -1; } sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20)); return (u8)cursor; } bool8 IsDma3ManagerBusyWithBgCopy(void) { int i; for (i = 0; i < 0x80; i++) { u8 div = i / 0x20; u8 mod = i % 0x20; if ((sDmaBusyBitfield[div] & (1 << mod))) { s8 reqSpace = WaitDma3Request(i); if (reqSpace == -1) return TRUE; sDmaBusyBitfield[div] &= ~(1 << mod); } } return FALSE; } void ShowBg(u8 bg) { ShowBgInternal(bg); SyncBgVisibilityAndMode(); } void HideBg(u8 bg) { HideBgInternal(bg); SyncBgVisibilityAndMode(); } void SetBgAttribute(u8 bg, u8 attributeId, u8 value) { switch (attributeId) { case 1: SetBgControlAttributes(bg, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); break; case 2: SetBgControlAttributes(bg, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); break; case 3: SetBgControlAttributes(bg, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF); break; case 4: SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF); break; case 7: SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF); break; case 5: SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF); break; case 6: SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value); break; } } u16 GetBgAttribute(u8 bg, u8 attributeId) { switch (attributeId) { case BG_ATTR_CHARBASEINDEX: return GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX); case BG_ATTR_MAPBASEINDEX: return GetBgControlAttribute(bg, BG_CTRL_ATTR_MAPBASEINDEX); case BG_ATTR_SCREENSIZE: return GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); case BG_ATTR_PALETTEMODE: return GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE); case BG_ATTR_PRIORITY: return GetBgControlAttribute(bg, BG_CTRL_ATTR_PRIORITY); case BG_ATTR_MOSAIC: return GetBgControlAttribute(bg, BG_CTRL_ATTR_MOSAIC); case BG_ATTR_WRAPAROUND: return GetBgControlAttribute(bg, BG_CTRL_ATTR_WRAPAROUND); case BG_ATTR_MAPSIZE: switch (GetBgType(bg)) { case 0: return GetBgMetricTextMode(bg, 0) * 0x800; case 1: return GetBgMetricAffineMode(bg, 0) * 0x100; default: return 0; } case BG_ATTR_BGTYPE: return GetBgType(bg); case BG_ATTR_BASETILE: return sGpuBgConfigs2[bg].baseTile; default: return -1; } } u32 ChangeBgX(u8 bg, u32 value, u8 op) { u8 mode; u16 temp1; u16 temp2; if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) { return -1; } switch (op) { case BG_COORD_SET: default: sGpuBgConfigs2[bg].bg_x = value; break; case BG_COORD_ADD: sGpuBgConfigs2[bg].bg_x += value; break; case BG_COORD_SUB: sGpuBgConfigs2[bg].bg_x -= value; break; } mode = GetBgMode(); switch (bg) { case 0: temp1 = sGpuBgConfigs2[0].bg_x >> 0x8; SetGpuReg(REG_OFFSET_BG0HOFS, temp1); break; case 1: temp1 = sGpuBgConfigs2[1].bg_x >> 0x8; SetGpuReg(REG_OFFSET_BG1HOFS, temp1); break; case 2: if (mode == 0) { temp1 = sGpuBgConfigs2[2].bg_x >> 0x8; SetGpuReg(REG_OFFSET_BG2HOFS, temp1); } else { temp1 = sGpuBgConfigs2[2].bg_x >> 0x10; temp2 = sGpuBgConfigs2[2].bg_x & 0xFFFF; SetGpuReg(REG_OFFSET_BG2X_H, temp1); SetGpuReg(REG_OFFSET_BG2X_L, temp2); } break; case 3: if (mode == 0) { temp1 = sGpuBgConfigs2[3].bg_x >> 0x8; SetGpuReg(REG_OFFSET_BG3HOFS, temp1); } else if (mode == 2) { temp1 = sGpuBgConfigs2[3].bg_x >> 0x10; temp2 = sGpuBgConfigs2[3].bg_x & 0xFFFF; SetGpuReg(REG_OFFSET_BG3X_H, temp1); SetGpuReg(REG_OFFSET_BG3X_L, temp2); } break; } return sGpuBgConfigs2[bg].bg_x; } u32 GetBgX(u8 bg) { if (IsInvalidBg32(bg) != FALSE) return -1; if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) return -1; return sGpuBgConfigs2[bg].bg_x; } u32 ChangeBgY(u8 bg, u32 value, u8 op) { u8 mode; u16 temp1; u16 temp2; if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) { return -1; } switch (op) { case BG_COORD_SET: default: sGpuBgConfigs2[bg].bg_y = value; break; case BG_COORD_ADD: sGpuBgConfigs2[bg].bg_y += value; break; case BG_COORD_SUB: sGpuBgConfigs2[bg].bg_y -= value; break; } mode = GetBgMode(); switch (bg) { case 0: temp1 = sGpuBgConfigs2[0].bg_y >> 0x8; SetGpuReg(REG_OFFSET_BG0VOFS, temp1); break; case 1: temp1 = sGpuBgConfigs2[1].bg_y >> 0x8; SetGpuReg(REG_OFFSET_BG1VOFS, temp1); break; case 2: if (mode == 0) { temp1 = sGpuBgConfigs2[2].bg_y >> 0x8; SetGpuReg(REG_OFFSET_BG2VOFS, temp1); } else { temp1 = sGpuBgConfigs2[2].bg_y >> 0x10; temp2 = sGpuBgConfigs2[2].bg_y & 0xFFFF; SetGpuReg(REG_OFFSET_BG2Y_H, temp1); SetGpuReg(REG_OFFSET_BG2Y_L, temp2); } break; case 3: if (mode == 0) { temp1 = sGpuBgConfigs2[3].bg_y >> 0x8; SetGpuReg(REG_OFFSET_BG3VOFS, temp1); } else if (mode == 2) { temp1 = sGpuBgConfigs2[3].bg_y >> 0x10; temp2 = sGpuBgConfigs2[3].bg_y & 0xFFFF; SetGpuReg(REG_OFFSET_BG3Y_H, temp1); SetGpuReg(REG_OFFSET_BG3Y_L, temp2); } break; } return sGpuBgConfigs2[bg].bg_y; } u32 GetBgY(u8 bg) { if (IsInvalidBg32(bg) != FALSE) return -1; if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) return -1; return sGpuBgConfigs2[bg].bg_y; } void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) { SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle); } u8 AdjustBgMosaic(u8 value, u8 mode) { u16 mosaicSize; s16 bgMosaicH; s16 bgMosaicV; mosaicSize = GetGpuReg(REG_OFFSET_MOSAIC); bgMosaicH = mosaicSize & 0xF; bgMosaicV = (mosaicSize >> 4) & 0xF; mosaicSize &= 0xFF00; switch (mode) { case BG_MOSAIC_SET: default: bgMosaicH = value & 0xF; bgMosaicV = value >> 0x4; break; case BG_MOSAIC_SET_H: bgMosaicH = value & 0xF; break; case BG_MOSAIC_INC_H: if ((bgMosaicH + value) > 0xF) bgMosaicH = 0xF; else bgMosaicH += value; break; case BG_MOSAIC_DEC_H: if ((bgMosaicH - value) < 0) bgMosaicH = 0x0; else bgMosaicH -= value; break; case BG_MOSAIC_SET_V: bgMosaicV = value & 0xF; break; case BG_MOSAIC_INC_V: if ((bgMosaicV + value) > 0xF) bgMosaicV = 0xF; else bgMosaicV += value; break; case BG_MOSAIC_DEC_V: if ((bgMosaicV - value) < 0) bgMosaicV = 0x0; else bgMosaicV -= value; break; } mosaicSize |= ((bgMosaicV << 0x4) & 0xF0); mosaicSize |= (bgMosaicH & 0xF); SetGpuReg(REG_OFFSET_MOSAIC, mosaicSize); return mosaicSize; } void SetBgTilemapBuffer(u8 bg, void *tilemap) { if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0) { sGpuBgConfigs2[bg].tilemap = tilemap; } } void UnsetBgTilemapBuffer(u8 bg) { if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0) { sGpuBgConfigs2[bg].tilemap = NULL; } } void *GetBgTilemapBuffer(u8 bg) { if (IsInvalidBg32(bg) != FALSE) return NULL; if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) return NULL; return sGpuBgConfigs2[bg].tilemap; } void CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset) { if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { if (mode != 0) { CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 32)), mode); } else { LZ77UnCompWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 32))); } } } void CopyBgTilemapBufferToVram(u8 bg) { u16 sizeToLoad; if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { switch (GetBgType(bg)) { case 0: sizeToLoad = GetBgMetricTextMode(bg, 0) * 0x800; break; case 1: sizeToLoad = GetBgMetricAffineMode(bg, 0) * 0x100; break; default: sizeToLoad = 0; break; } LoadBgVram(bg, sGpuBgConfigs2[bg].tilemap, sizeToLoad, 0, 2); } } void CopyToBgTilemapBufferRect(u8 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height) { u16 destX16; u16 destY16; u16 mode; if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { switch (GetBgType(bg)) { case 0: { const u16 * srcCopy = src; for (destY16 = destY; destY16 < (destY + height); destY16++) { for (destX16 = destX; destX16 < (destX + width); destX16++) { ((u16 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *(srcCopy)++; } } break; } case 1: { const u8 * srcCopy = src; mode = GetBgMetricAffineMode(bg, 0x1); for (destY16 = destY; destY16 < (destY + height); destY16++) { for (destX16 = destX; destX16 < (destX + width); destX16++) { ((u8 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *(srcCopy)++; } } break; } } } } void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette) { CopyRectToBgTilemapBufferRect(bg, src, 0, 0, rectWidth, rectHeight, destX, destY, rectWidth, rectHeight, palette, 0, 0); } void CopyRectToBgTilemapBufferRect(u8 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, s16 tileOffset, s16 palette2) { u16 screenWidth, screenHeight, screenSize; u16 var; const void *srcPtr; u16 i, j; if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) { screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); screenWidth = GetBgMetricTextMode(bg, 0x1) * 0x20; screenHeight = GetBgMetricTextMode(bg, 0x2) * 0x20; switch (GetBgType(bg)) { case 0: srcPtr = src + ((srcY * srcWidth) + srcX) * 2; for (i = destY; i < (destY + rectHeight); i++) { for (j = destX; j < (destX + rectWidth); j++) { u16 index = GetTileMapIndexFromCoords(j, i, screenSize, screenWidth, screenHeight); CopyTileMapEntry(srcPtr, sGpuBgConfigs2[bg].tilemap + (index * 2), palette1, tileOffset, palette2); srcPtr += 2; } srcPtr += (srcWidth - rectWidth) * 2; } break; case 1: srcPtr = src + ((srcY * srcWidth) + srcX); var = GetBgMetricAffineMode(bg, 0x1); for (i = destY; i < (destY + rectHeight); i++) { for (j = destX; j < (destX + rectWidth); j++) { *(u8 *)(sGpuBgConfigs2[bg].tilemap + ((var * i) + j)) = *(u8 *)(srcPtr) + tileOffset; srcPtr++; } srcPtr += (srcWidth - rectWidth); } break; } } } void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height) { u16 x16; u16 y16; u16 mode; if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { switch (GetBgType(bg)) { case 0: for (y16 = y; y16 < (y + height); y16++) { for (x16 = x; x16 < (x + width); x16++) { ((u16 *)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum; } } break; case 1: mode = GetBgMetricAffineMode(bg, 0x1); for (y16 = y; y16 < (y + height); y16++) { for (x16 = x; x16 < (x + width); x16++) { ((u8 *)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum; } } break; } } } void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette) { WriteSequenceToBgTilemapBuffer(bg, tileNum, x, y, width, height, palette, 0); } void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta) { u16 mode; u16 mode2; u16 attribute; u16 mode3; u16 x16; u16 y16; if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); mode = GetBgMetricTextMode(bg, 0x1) * 0x20; mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20; switch (GetBgType(bg)) { case 0: for (y16 = y; y16 < (y + height); y16++) { for (x16 = x; x16 < (x + width); x16++) { CopyTileMapEntry(&firstTileNum, &((u16 *)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0); firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } } break; case 1: mode3 = GetBgMetricAffineMode(bg, 0x1); for (y16 = y; y16 < (y + height); y16++) { for (x16 = x; x16 < (x + width); x16++) { ((u8 *)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum; firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } } break; } } } u16 GetBgMetricTextMode(u8 bg, u8 whichMetric) { u8 attribute; attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); switch (whichMetric) { case 0: switch (attribute) { case 0: return 1; case 1: case 2: return 2; case 3: return 4; } break; case 1: switch (attribute) { case 0: return 1; case 1: return 2; case 2: return 1; case 3: return 2; } break; case 2: switch (attribute) { case 0: case 1: return 1; case 2: case 3: return 2; } break; } return 0; } u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric) { u8 attribute; attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); switch (whichMetric) { case 0: switch (attribute) { case 0: return 0x1; case 1: return 0x4; case 2: return 0x10; case 3: return 0x40; } break; case 1: case 2: return 0x10 << attribute; } return 0; } u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight) { x = x & (screenWidth - 1); y = y & (screenHeight - 1); switch (screenSize) { case 0: case 2: break; case 3: if (y >= 0x20) y += 0x20; case 1: if (x >= 0x20) { x -= 0x20; y += 0x20; } } return (y * 0x20) + x; } void CopyTileMapEntry(const u16 *src, u16 *dest, s32 palette1, s32 tileOffset, s32 palette2) { u16 var; switch (palette1) { case 0 ... 15: var = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12); break; case 16: var = *dest; var &= 0xFC00; var += palette2 << 12; var |= (*src + tileOffset) & 0x3FF; break; default: case 17 ... INT_MAX: var = *src + tileOffset + (palette2 << 12); break; } *dest = var; } u32 GetBgType(u8 bg) { u8 mode; mode = GetBgMode(); switch (bg) { case 0: case 1: switch (mode) { case 0: case 1: return 0; } break; case 2: switch (mode) { case 0: return 0; case 1: case 2: return 1; } break; case 3: switch (mode) { case 0: return 0; case 2: return 1; } break; } return 0xFFFF; } bool32 IsInvalidBg32(u8 bg) { if (bg > 3) return TRUE; return FALSE; } bool32 IsTileMapOutsideWram(u8 bg) { if (sGpuBgConfigs2[bg].tilemap > (void *)IWRAM_END) return TRUE; if (sGpuBgConfigs2[bg].tilemap == 0x0) return TRUE; return FALSE; } ================================================ FILE: src/bg_regs.c ================================================ #include "global.h" vu16 *const gBGControlRegs[] = { ®_BG0CNT, ®_BG1CNT, ®_BG2CNT, ®_BG3CNT, }; vu16 *const gBGHOffsetRegs[] = { ®_BG0HOFS, ®_BG1HOFS, ®_BG2HOFS, ®_BG3HOFS, }; vu16 *const gBGVOffsetRegs[] = { ®_BG0VOFS, ®_BG1VOFS, ®_BG2VOFS, ®_BG3VOFS, }; const u16 gDISPCNTBGFlags[] = { DISPCNT_BG0_ON, DISPCNT_BG1_ON, DISPCNT_BG2_ON, DISPCNT_BG3_ON }; const u16 gOverworldBackgroundLayerFlags[] = { BLDCNT_TGT2_BG0, BLDCNT_TGT2_BG1, BLDCNT_TGT2_BG2, BLDCNT_TGT2_BG3 }; const u16 gBLDCNTTarget1BGFlags[] = { BLDCNT_TGT1_BG0, BLDCNT_TGT1_BG1, BLDCNT_TGT1_BG2, BLDCNT_TGT1_BG3 }; const u8 gBGControlRegOffsets[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT, }; const u8 gBGHOffsetRegOffsets[] = { REG_OFFSET_BG0HOFS, REG_OFFSET_BG1HOFS, REG_OFFSET_BG2HOFS, REG_OFFSET_BG3HOFS, }; const u8 gBGVOffsetRegOffsets[] = { REG_OFFSET_BG0VOFS, REG_OFFSET_BG1VOFS, REG_OFFSET_BG2VOFS, REG_OFFSET_BG3VOFS, }; ================================================ FILE: src/bike.c ================================================ #include "global.h" #include "bike.h" #include "field_player_avatar.h" #include "metatile_behavior.h" #include "event_data.h" #include "event_object_movement.h" #include "fieldmap.h" #include "field_camera.h" #include "overworld.h" #include "constants/map_types.h" #include "constants/songs.h" #include "constants/flags.h" static u8 GetBikeTransitionId(u8 *, u16, u16); static void Bike_SetBikeStill(void); static u8 CanBikeFaceDirectionOnRail(u8 direction, u8 metatileBehavior); static u8 GetBikeCollision(u8); static u8 GetBikeCollisionAt(struct ObjectEvent *playerObjEvent, s16 x, s16 y, u8 direction, u8 metatileBehavior); static bool8 MetatileBehaviorForbidsBiking(u8); static void BikeTransition_FaceDirection(u8); static void BikeTransition_TurnDirection(u8); static void BikeTransition_MoveDirection(u8); static void BikeTransition_Downhill(u8); static void BikeTransition_Uphill(u8); static u8 BikeInputHandler_Normal(u8 *, u16, u16); static u8 BikeInputHandler_Turning(u8 *, u16, u16); static u8 BikeInputHandler_Slope(u8 *, u16, u16); static void (*const sBikeTransitions[])(u8) = { [BIKE_TRANS_FACE_DIRECTION] = BikeTransition_FaceDirection, [BIKE_TRANS_TURNING] = BikeTransition_TurnDirection, [BIKE_TRANS_MOVE] = BikeTransition_MoveDirection, [BIKE_TRANS_DOWNHILL] = BikeTransition_Downhill, [BIKE_TRANS_UPHILL] = BikeTransition_Uphill, }; static u8 (*const sBikeInputHandlers[])(u8 *, u16, u16) = { [BIKE_STATE_NORMAL] = BikeInputHandler_Normal, [BIKE_STATE_TURNING] = BikeInputHandler_Turning, [BIKE_STATE_SLOPE] = BikeInputHandler_Slope, }; void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) { sBikeTransitions[GetBikeTransitionId(&direction, newKeys, heldKeys)](direction); } static u8 GetBikeTransitionId(u8 *direction, u16 newKeys, u16 heldKeys) { return sBikeInputHandlers[gPlayerAvatar.acroBikeState](direction, newKeys, heldKeys); } static u8 BikeInputHandler_Normal(u8 *direction_p, u16 newKeys, u16 heldKeys) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; u8 direction = GetPlayerMovementDirection(); gPlayerAvatar.bikeFrameCounter = 0; if (MetatileBehavior_IsCyclingRoadPullDownTile(playerObjEvent->currentMetatileBehavior) == TRUE) { if (!JOY_HELD(B_BUTTON)) { gPlayerAvatar.acroBikeState = BIKE_STATE_SLOPE; gPlayerAvatar.runningState = MOVING; if (*direction_p < DIR_NORTH) return BIKE_TRANS_DOWNHILL; else return BIKE_TRANS_UPHILL; } else { if (*direction_p != DIR_NONE) { gPlayerAvatar.acroBikeState = BIKE_STATE_SLOPE; gPlayerAvatar.runningState = MOVING; return BIKE_TRANS_UPHILL; } } } if (*direction_p == DIR_NONE) { *direction_p = direction; gPlayerAvatar.runningState = NOT_MOVING; return BIKE_TRANS_FACE_DIRECTION; } else { if (*direction_p != direction && gPlayerAvatar.runningState != MOVING) { gPlayerAvatar.acroBikeState = BIKE_STATE_TURNING; gPlayerAvatar.newDirBackup = *direction_p; gPlayerAvatar.runningState = NOT_MOVING; return GetBikeTransitionId(direction_p, newKeys, heldKeys); } else { gPlayerAvatar.runningState = MOVING; return BIKE_TRANS_MOVE; } } } static u8 BikeInputHandler_Turning(u8 *direction_p, u16 newKeys, u16 heldKeys) { *direction_p = gPlayerAvatar.newDirBackup; gPlayerAvatar.runningState = TURN_DIRECTION; gPlayerAvatar.acroBikeState = BIKE_STATE_NORMAL; Bike_SetBikeStill(); return BIKE_TRANS_TURNING; } static u8 BikeInputHandler_Slope(u8 *direction_p, u16 newKeys, u16 heldKeys) { u8 direction = GetPlayerMovementDirection(); u8 playerObjEventId = gPlayerAvatar.objectEventId; if (MetatileBehavior_IsCyclingRoadPullDownTile(playerObjEventId[gObjectEvents].currentMetatileBehavior) == TRUE) { if (*direction_p != direction) { gPlayerAvatar.acroBikeState = BIKE_STATE_TURNING; gPlayerAvatar.newDirBackup = *direction_p; gPlayerAvatar.runningState = NOT_MOVING; return GetBikeTransitionId(direction_p, newKeys, heldKeys); } else { gPlayerAvatar.runningState = MOVING; gPlayerAvatar.acroBikeState = BIKE_STATE_SLOPE; if (*direction_p < DIR_NORTH) return BIKE_TRANS_DOWNHILL; else return BIKE_TRANS_UPHILL; } } gPlayerAvatar.acroBikeState = BIKE_STATE_NORMAL; if (*direction_p == DIR_NONE) { *direction_p = direction; gPlayerAvatar.runningState = NOT_MOVING; return BIKE_TRANS_FACE_DIRECTION; } else { gPlayerAvatar.runningState = MOVING; return BIKE_TRANS_MOVE; } } static void BikeTransition_FaceDirection(u8 direction) { PlayerFaceDirection(direction); } static void BikeTransition_TurnDirection(u8 direction) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!CanBikeFaceDirectionOnRail(direction, playerObjEvent->currentMetatileBehavior)) direction = playerObjEvent->movementDirection; PlayerFaceDirection(direction); } static void BikeTransition_MoveDirection(u8 direction) { struct ObjectEvent *playerObjEvent; playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!CanBikeFaceDirectionOnRail(direction, playerObjEvent->currentMetatileBehavior)) { BikeTransition_FaceDirection(playerObjEvent->movementDirection); } else { u8 collision = GetBikeCollision(direction); if (collision > COLLISION_NONE && collision <= COLLISION_ISOLATED_HORIZONTAL_RAIL) { if (collision == COLLISION_LEDGE_JUMP) PlayerJumpLedge(direction); else if (collision != COLLISION_STOP_SURFING && collision != COLLISION_LEDGE_JUMP && collision != COLLISION_PUSHED_BOULDER && collision != COLLISION_DIRECTIONAL_STAIR_WARP) PlayerOnBikeCollide(direction); } else { if(!FlagGet(FLAG_BIKE_GEAR)) //if not set, FRLG speed { if (collision == COLLISION_COUNT) PlayerWalkFast(direction); else if (PlayerIsMovingOnRockStairs(direction)) PlayerWalkFast(direction); else PlayerRideWaterCurrent(direction); } else { if (collision == COLLISION_COUNT) PlayerRideWaterCurrent(direction); else if (PlayerIsMovingOnRockStairs(direction)) PlayerRideWaterCurrent(direction); else PlayerWalkFaster(direction); } } } } static void BikeTransition_Downhill(u8 v) { u8 collision = GetBikeCollision(DIR_SOUTH); if (collision == COLLISION_NONE) PlayerWalkFaster(DIR_SOUTH); else if (collision == COLLISION_LEDGE_JUMP) PlayerJumpLedge(DIR_SOUTH); } static void BikeTransition_Uphill(u8 direction) { if (GetBikeCollision(direction) == COLLISION_NONE) PlayerWalkNormal(direction); } static u8 GetBikeCollision(u8 direction) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; s16 x, y; u8 metatileBehavior; x = playerObjEvent->currentCoords.x; y = playerObjEvent->currentCoords.y; MoveCoords(direction, &x, &y); metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); return GetBikeCollisionAt(playerObjEvent, x, y, direction, metatileBehavior); } static u8 GetBikeCollisionAt(struct ObjectEvent *playerObjEvent, s16 x, s16 y, u8 direction, u8 metatileBehavior) { u8 retVal = CheckForObjectEventCollision(playerObjEvent, x, y, direction, metatileBehavior); if (retVal <= COLLISION_OBJECT_EVENT) { bool8 isCrackedIce = MetatileBehavior_IsCrackedIce(metatileBehavior); if (isCrackedIce == TRUE) return COLLISION_COUNT; if (retVal == COLLISION_NONE && MetatileBehaviorForbidsBiking(metatileBehavior)) retVal = COLLISION_IMPASSABLE; } return retVal; } bool8 RS_IsRunningDisallowed(u8 r0) { if (MetatileBehaviorForbidsBiking(r0)) return TRUE; if (gMapHeader.mapType != MAP_TYPE_INDOOR) return FALSE; else return TRUE; } bool32 IsRunningDisallowed(u8 metatileBehavior) { if (MetatileBehaviorForbidsBiking(metatileBehavior) != TRUE) return FALSE; else return TRUE; } static bool8 MetatileBehaviorForbidsBiking(u8 metatileBehavior) { if(MetatileBehavior_IsLongGrass(metatileBehavior)) return TRUE; if (MetatileBehavior_IsRunningDisallowed(metatileBehavior)) return TRUE; if (!MetatileBehavior_IsFortreeBridge(metatileBehavior)) return FALSE; if (PlayerGetElevation() & 1) return FALSE; return TRUE; } static bool8 CanBikeFaceDirectionOnRail(u8 direction, u8 metatileBehavior) { if (direction == DIR_EAST || direction == DIR_WEST) { if (MetatileBehavior_IsIsolatedVerticalRail(metatileBehavior) || MetatileBehavior_IsVerticalRail(metatileBehavior)) return FALSE; } else { if (MetatileBehavior_IsIsolatedHorizontalRail(metatileBehavior) || MetatileBehavior_IsHorizontalRail(metatileBehavior)) return FALSE; } return TRUE; } bool8 IsBikingDisallowedByPlayer(void) { s16 x, y; u8 metatileBehavior; if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_UNDERWATER | PLAYER_AVATAR_FLAG_SURFING))) { PlayerGetDestCoords(&x, &y); metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (!MetatileBehaviorForbidsBiking(metatileBehavior)) return FALSE; } return TRUE; } bool8 IsPlayerNotUsingAcroBikeOnBumpySlope(void) { if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) { if (MetatileBehavior_IsBumpySlope(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior)) return FALSE; } return TRUE; } void GetOnOffBike(u8 flags) { gBikeCameraAheadPanback = FALSE; if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) { SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); Overworld_ClearSavedMusic(); Overworld_PlaySpecialMapMusic(); } else { SetPlayerAvatarTransitionFlags(flags); if (Overworld_MusicCanOverrideMapMusic(MUS_CYCLING)) { Overworld_SetSavedMusic(MUS_CYCLING); Overworld_ChangeMusicTo(MUS_CYCLING); } } } void BikeClearState(u32 directionHistory, u32 abStartSelectHistory) { u32 i; gPlayerAvatar.acroBikeState = BIKE_STATE_NORMAL; gPlayerAvatar.newDirBackup = 0; gPlayerAvatar.bikeFrameCounter = 0; gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING; gPlayerAvatar.directionHistory = directionHistory; gPlayerAvatar.abStartSelectHistory = abStartSelectHistory; gPlayerAvatar.lastSpinTile = 0; for (i = 0; i < NELEMS(gPlayerAvatar.dirTimerHistory); ++i) gPlayerAvatar.dirTimerHistory[i] = 0; } void Bike_UpdateBikeCounterSpeed(u8 counter) { gPlayerAvatar.bikeFrameCounter = counter; gPlayerAvatar.bikeSpeed = counter + (gPlayerAvatar.bikeFrameCounter >> 1); } static void Bike_SetBikeStill(void) { gPlayerAvatar.bikeFrameCounter = 0; gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING; } s16 GetPlayerSpeed(void) { s16 machBikeSpeeds[] = { PLAYER_SPEED_NORMAL, PLAYER_SPEED_FAST, PLAYER_SPEED_FASTEST }; if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) return machBikeSpeeds[gPlayerAvatar.bikeFrameCounter]; else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) return PLAYER_SPEED_FASTER; else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH)) return PLAYER_SPEED_FAST; else return PLAYER_SPEED_NORMAL; } void Bike_HandleBumpySlopeJump(void) { s16 x, y; u8 tileBehavior; if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) { PlayerGetDestCoords(&x, &y); tileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsBumpySlope(tileBehavior)) { gPlayerAvatar.acroBikeState = BIKE_STATE_SLOPE; PlayerUseAcroBikeOnBumpySlope(GetPlayerMovementDirection()); } } } // R/S leftover // the struct below is used for checking button combinations of the last input so that the acro can potentially perform a side/turn jump. // its possible that at some point Game Freak intended for the acro bike to have more complex tricks: but only the acro jump combinations can be seen in the final ROM. struct BikeHistoryInputInfo { u32 dirHistoryMatch; // the direction you need to press u32 abStartSelectHistoryMatch; // the button you need to press u32 dirHistoryMask; // mask applied so that way only the recent nybble (the recent input) is checked u32 abStartSelectHistoryMask; // mask applied so that way only the recent nybble (the recent input) is checked const u8 *dirTimerHistoryList; // list of timers to check for direction before the button+dir combination can be verified. const u8 *abStartSelectHistoryList; // list of timers to check for buttons before the button+dir combination can be verified. u32 direction; // direction to jump }; // this is a list of timers to compare against later, terminated with 0. the only timer being compared against is 4 frames in this list. static const u8 sAcroBikeJumpTimerList[] = {4, 0}; // this is a list of history inputs to do in order to do the check to retrieve a jump direction for acro bike. it seems to be an extensible list, so its possible that Game Freak may have intended for the Acro Bike to have more complex tricks at some point. The final list only has the acro jump. static const struct BikeHistoryInputInfo sAcroBikeTricksList[] = { // the 0xF is a mask performed with each byte of the array in order to perform the check on only the last entry of the history list, otherwise the check wouldn't work as there can be 0xF0 as opposed to 0x0F. {DIR_SOUTH, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_SOUTH}, {DIR_NORTH, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_NORTH}, {DIR_WEST, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_WEST}, {DIR_EAST, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_EAST}, }; ================================================ FILE: src/blend_palette.c ================================================ #include "global.h" #include "blend_palette.h" #include "palette.h" void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { u32 i; for (i = 0; i < numEntries; i++) { u16 index = i + palOffset; struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index]; s8 r = data1->r; s8 g = data1->g; s8 b = data1->b; struct PlttData *data2 = (struct PlttData *)&blendColor; gPlttBufferFaded[index] = ((r + (((data2->r - r) * coeff) >> 4)) << 0) | ((g + (((data2->g - g) * coeff) >> 4)) << 5) | ((b + (((data2->b - b) * coeff) >> 4)) << 10); } } void BlendPalettesAt(u16 * palbuff, u16 blend_pal, u32 coefficient, s32 size) { if (coefficient == 16) { while (--size != -1) { *palbuff++ = blend_pal; } } else { u16 r = (blend_pal >> 0) & 0x1F; u16 g = (blend_pal >> 5) & 0x1F; u16 b = (blend_pal >> 10) & 0x1F; while (--size != -1) { u16 r2 = (*palbuff >> 0) & 0x1F; u16 g2 = (*palbuff >> 5) & 0x1F; u16 b2 = (*palbuff >> 10) & 0x1F; *palbuff++ = ((r2 + (((r - r2) * coefficient) >> 4)) << 0) | ((g2 + (((g - g2) * coefficient) >> 4)) << 5) | ((b2 + (((b - b2) * coefficient) >> 4)) << 10); } } } ================================================ FILE: src/blit.c ================================================ #include "global.h" #include "blit.h" void BlitBitmapRect4BitWithoutColorKey(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height) { BlitBitmapRect4Bit(src, dst, srcX, srcY, dstX, dstY, width, height, 0xFF); } void BlitBitmapRect4Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey) { s32 xEnd; s32 yEnd; s32 multiplierSrcY; s32 multiplierDstY; s32 loopSrcY, loopDstY; s32 loopSrcX, loopDstX; const u8 *pixelsSrc; u8 *pixelsDst; s32 toOrr; s32 toAnd; s32 toShift; if (dst->width - dstX < width) xEnd = (dst->width - dstX) + srcX; else xEnd = srcX + width; if (dst->height - dstY < height) yEnd = (dst->height - dstY) + srcY; else yEnd = height + srcY; multiplierSrcY = (src->width + (src->width & 7)) >> 3; multiplierDstY = (dst->width + (dst->width & 7)) >> 3; if (colorKey == 0xFF) { for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++) { for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) { pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B); pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B); toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF); toShift = ((loopDstX & 1) << 2); toOrr <<= toShift; toAnd = 0xF0 >> (toShift); *pixelsDst = toOrr | (*pixelsDst & toAnd); } } } else { for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++) { for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) { pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B); pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B); toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF); if (toOrr != colorKey) { toShift = ((loopDstX & 1) << 2); toOrr <<= toShift; toAnd = 0xF0 >> (toShift); *pixelsDst = toOrr | (*pixelsDst & toAnd); } } } } } void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue) { s32 xEnd; s32 yEnd; s32 multiplierY; s32 loopX, loopY; xEnd = x + width; if (xEnd > surface->width) xEnd = surface->width; yEnd = y + height; if (yEnd > surface->height) yEnd = surface->height; multiplierY = (surface->width + (surface->width & 7)) >> 3; for (loopY = y; loopY < yEnd; loopY++) { for (loopX = x; loopX < xEnd; loopX++) { u8 *pixels = surface->pixels + ((loopX >> 1) & 3) + ((loopX >> 3) << 5) + (((loopY >> 3) * multiplierY) << 5) + ((u32)(loopY << 0x1d) >> 0x1B); if ((loopX & 1) != 0) { *pixels &= 0xF; *pixels |= fillValue << 4; } else { *pixels &= 0xF0; *pixels |= fillValue; } } } } void BlitBitmapRect4BitTo8Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset) { s32 palOffsetBits; s32 xEnd; s32 yEnd; s32 multiplierSrcY; s32 multiplierDstY; s32 loopSrcY, loopDstY; s32 loopSrcX, loopDstX; const u8 *pixelsSrc; u8 *pixelsDst; s32 colorKeyBits; palOffsetBits = (u32)(paletteOffset << 0x1C) >> 0x18; colorKeyBits = (u32)(colorKey << 0x1C) >> 0x18; if (dst->width - dstX < width) xEnd = (dst->width - dstX) + srcX; else xEnd = width + srcX; if (dst->height - dstY < height) yEnd = (srcY + dst->height) - dstY; else yEnd = srcY + height; multiplierSrcY = (src->width + (src->width & 7)) >> 3; multiplierDstY = (dst->width + (dst->width & 7)) >> 3; if (colorKey == 0xFF) { for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++) { pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b); for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) { pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a); if (loopSrcX & 1) { *pixelsDst = palOffsetBits + (*pixelsSrc >> 4); } else { pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b); *pixelsDst = palOffsetBits + (*pixelsSrc & 0xF); } } } } else { for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++) { pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b); for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) { if (loopSrcX & 1) { if ((*pixelsSrc & 0xF0) != colorKeyBits) { pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a); *pixelsDst = palOffsetBits + (*pixelsSrc >> 4); } } else { pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b); if ((*pixelsSrc & 0xF) != colorKey) { pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a); *pixelsDst = palOffsetBits + (*pixelsSrc & 0xF); } } } } } } void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue) { s32 xEnd; s32 yEnd; s32 multiplierY; s32 loopX, loopY; xEnd = x + width; if (xEnd > surface->width) xEnd = surface->width; yEnd = y + height; if (yEnd > surface->height) yEnd = surface->height; multiplierY = (surface->width + (surface->width & 7)) >> 3; for (loopY = y; loopY < yEnd; loopY++) { for (loopX = x; loopX < xEnd; loopX++) { u8 *pixels = surface->pixels + (loopX & 7) + ((loopX >> 3) << 6) + (((loopY >> 3) * multiplierY) << 6) + ((u32)(loopY << 0x1d) >> 0x1a); *pixels = fillValue; } } } ================================================ FILE: src/braille_text.c ================================================ #include "global.h" #include "main.h" #include "window.h" #include "text.h" #include "sound.h" // This file handles the braille font. // For printing braille messages, see ScrCmd_braillemessage static const u8 sScrollDistances[] = { [OPTIONS_TEXT_SPEED_SLOW] = 1, [OPTIONS_TEXT_SPEED_MID] = 2, [OPTIONS_TEXT_SPEED_FAST] = 4, }; static const u16 sBrailleGlyphs[] = INCBIN_U16("graphics/fonts/braille.fwjpnfont"); static void DecompressGlyph_Braille(u16); u16 FontFunc_Braille(struct TextPrinter *textPrinter) { u16 char_; struct TextPrinterSubStruct *sub = &textPrinter->subUnion.sub; switch (textPrinter->state) { case RENDER_STATE_HANDLE_CHAR: if (JOY_HELD(A_BUTTON | B_BUTTON) && sub->hasPrintBeenSpedUp) { textPrinter->delayCounter = 0; } if (textPrinter->delayCounter && textPrinter->textSpeed) { textPrinter->delayCounter--; if (gTextFlags.canABSpeedUpPrint && JOY_NEW(A_BUTTON | B_BUTTON)) { sub->hasPrintBeenSpedUp = TRUE; textPrinter->delayCounter = 0; } return RENDER_UPDATE; } if (gTextFlags.autoScroll) textPrinter->delayCounter = 1; else textPrinter->delayCounter = textPrinter->textSpeed; char_ = *textPrinter->printerTemplate.currentChar++; switch (char_) { case EOS: return RENDER_FINISH; case CHAR_NEWLINE: textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x; textPrinter->printerTemplate.currentY += gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing; return RENDER_REPEAT; case PLACEHOLDER_BEGIN: textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_BEGIN: char_ = *textPrinter->printerTemplate.currentChar++; switch (char_) { case EXT_CTRL_CODE_COLOR: textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return RENDER_REPEAT; case EXT_CTRL_CODE_HIGHLIGHT: textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return RENDER_REPEAT; case EXT_CTRL_CODE_SHADOW: textPrinter->printerTemplate.shadowColor = *textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return RENDER_REPEAT; case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.bgColor = *++textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.shadowColor = *++textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return RENDER_REPEAT; case EXT_CTRL_CODE_PALETTE: textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_FONT: sub->glyphId = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_RESET_FONT: return RENDER_REPEAT; case EXT_CTRL_CODE_PAUSE: textPrinter->delayCounter = *textPrinter->printerTemplate.currentChar++; textPrinter->state = RENDER_STATE_PAUSE; return RENDER_REPEAT; case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS: textPrinter->state = RENDER_STATE_WAIT; if (gTextFlags.autoScroll) sub->autoScrollDelay = 0; return RENDER_UPDATE; case EXT_CTRL_CODE_WAIT_SE: textPrinter->state = RENDER_STATE_WAIT_SE; return RENDER_UPDATE; case EXT_CTRL_CODE_PLAY_BGM: case EXT_CTRL_CODE_PLAY_SE: textPrinter->printerTemplate.currentChar += 2; return RENDER_REPEAT; case EXT_CTRL_CODE_ESCAPE: char_ = *++textPrinter->printerTemplate.currentChar; break; case EXT_CTRL_CODE_SHIFT_RIGHT: textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x + *textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_SHIFT_DOWN: textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y + *textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_FILL_WINDOW: FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); return RENDER_REPEAT; } break; case CHAR_PROMPT_CLEAR: textPrinter->state = RENDER_STATE_CLEAR; TextPrinterInitDownArrowCounters(textPrinter); return RENDER_UPDATE; case CHAR_PROMPT_SCROLL: textPrinter->state = RENDER_STATE_SCROLL_START; TextPrinterInitDownArrowCounters(textPrinter); return RENDER_UPDATE; case CHAR_EXTRA_SYMBOL: char_ = *textPrinter->printerTemplate.currentChar++| 0x100; break; case CHAR_KEYPAD_ICON: textPrinter->printerTemplate.currentChar++; return RENDER_PRINT; } DecompressGlyph_Braille(char_); CopyGlyphToWindow(textPrinter); textPrinter->printerTemplate.currentX += gGlyphInfo.width + textPrinter->printerTemplate.letterSpacing; return RENDER_PRINT; case RENDER_STATE_WAIT: if (TextPrinterWait(textPrinter)) textPrinter->state = RENDER_STATE_HANDLE_CHAR; return RENDER_UPDATE; case RENDER_STATE_CLEAR: if (TextPrinterWaitWithDownArrow(textPrinter)) { FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x; textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y; textPrinter->state = RENDER_STATE_HANDLE_CHAR; } return RENDER_UPDATE; case RENDER_STATE_SCROLL_START: if (TextPrinterWaitWithDownArrow(textPrinter)) { TextPrinterClearDownArrow(textPrinter); textPrinter->scrollDistance = gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing; textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x; textPrinter->state = RENDER_STATE_SCROLL; } return RENDER_UPDATE; case RENDER_STATE_SCROLL: if (textPrinter->scrollDistance) { if (textPrinter->scrollDistance < sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed]) { ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); textPrinter->scrollDistance = 0; } else { ScrollWindow(textPrinter->printerTemplate.windowId, 0, sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor)); textPrinter->scrollDistance -= sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed]; } CopyWindowToVram(textPrinter->printerTemplate.windowId, COPYWIN_GFX); } else { textPrinter->state = RENDER_STATE_HANDLE_CHAR; } return RENDER_UPDATE; case RENDER_STATE_WAIT_SE: if (!IsSEPlaying()) textPrinter->state = RENDER_STATE_HANDLE_CHAR; return RENDER_UPDATE; case RENDER_STATE_PAUSE: if (textPrinter->delayCounter) textPrinter->delayCounter--; else textPrinter->state = RENDER_STATE_HANDLE_CHAR; return RENDER_UPDATE; } return RENDER_FINISH; } static void DecompressGlyph_Braille(u16 glyph) { const u16 *glyphs; glyphs = sBrailleGlyphs + 0x100 * (glyph / 8) + 0x10 * (glyph % 8); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); gGlyphInfo.width = 16; gGlyphInfo.height = 16; } s32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese) { return 16; } ================================================ FILE: src/buy_menu_helpers.c ================================================ #include "global.h" #include "task.h" #include "text.h" #include "window.h" #include "text_window.h" #include "money.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "menu.h" #include "shop.h" #include "palette.h" static const struct WindowTemplate sShopBuyMenuWindowTemplatesNormal[] = { { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 8, .height = 3, .paletteNum = 15, .baseBlock = 0x27, }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 11, .width = 13, .height = 2, .paletteNum = 15, .baseBlock = 0x3F, }, { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 14, .baseBlock = 0x59, }, { .bg = 0, .tilemapLeft = 17, .tilemapTop = 9, .width = 12, .height = 4, .paletteNum = 14, .baseBlock = 0xC1, }, { .bg = 0, .tilemapLeft = 11, .tilemapTop = 1, .width = 17, .height = 12, .paletteNum = 14, .baseBlock = 0xF1, }, { .bg = 0, .tilemapLeft = 5, .tilemapTop = 14, .width = 25, .height = 6, .paletteNum = 15, .baseBlock = 0x1BD, }, DUMMY_WIN_TEMPLATE, }; // firered uses different layout when selling TMs static const struct WindowTemplate sShopBuyMenuWindowTemplatesTM[] = { { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 8, .height = 3, .paletteNum = 15, .baseBlock = 0x27, }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 11, .width = 13, .height = 2, .paletteNum = 15, .baseBlock = 0x3F, }, { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 14, .baseBlock = 0x59, }, { .bg = 0, .tilemapLeft = 17, .tilemapTop = 9, .width = 12, .height = 4, .paletteNum = 14, .baseBlock = 0xC1, }, { .bg = 0, .tilemapLeft = 11, .tilemapTop = 1, .width = 17, .height = 10, .paletteNum = 14, .baseBlock = 0xF1, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 12, .width = 18, .height = 8, .paletteNum = 14, .baseBlock = 0x19B, }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 14, .width = 10, .height = 4, .paletteNum = 14, .baseBlock = 0x22B, }, DUMMY_WIN_TEMPLATE, }; static const struct WindowTemplate sShopBuyMenuYesNoWindowTemplate = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 9, .width = 6, .height = 4, .paletteNum = 14, .baseBlock = 0xC1, }; static const u8 sShopBuyMenuTextColors[][3] = { {0, 1, 2}, {0, 2, 3}, {0, 3, 2} }; void BuyMenuInitWindows(bool32 isSellingTM) { if (isSellingTM != TRUE) InitWindows(sShopBuyMenuWindowTemplatesNormal); else InitWindows(sShopBuyMenuWindowTemplatesTM); DeactivateAllTextPrinters(); LoadUserWindowGfx(0, 0x1, BG_PLTT_ID(13)); LoadMenuMessageWindowGfx(0, 0x13, BG_PLTT_ID(14)); LoadStdWindowGfx(0, 0xA, BG_PLTT_ID(15)); PutWindowTilemap(0); PutWindowTilemap(4); PutWindowTilemap(5); if (isSellingTM == TRUE) PutWindowTilemap(6); } void BuyMenuDrawMoneyBox(void) { PrintMoneyAmountInMoneyBoxWithBorder(0, 0xA, 0xF, GetMoney(&gSaveBlock1Ptr->money)); } void BuyMenuPrint(u8 windowId, u8 font, const u8 *text, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 color) { AddTextPrinterParameterized4(windowId, font, x, y, letterSpacing, lineSpacing, sShopBuyMenuTextColors[color], speed, text); } void BuyMenuDisplayMessage(u8 taskId, const u8 *text, TaskFunc callback) { DisplayMessageAndContinueTask(taskId, 2, 0x13, 0xE, GetMartFontId(), GetTextSpeedSetting(), text, callback); ScheduleBgCopyTilemapToVram(0); } void BuyMenuQuantityBoxNormalBorder(u8 windowId, bool8 copyToVram) { DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, 0x1, 13); } void BuyMenuQuantityBoxThinBorder(u8 windowId, bool8 copyToVram) { DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, 0xA, 15); } void BuyMenuConfirmPurchase(u8 taskId, const struct YesNoFuncTable *yesNo) { CreateYesNoMenuWithCallbacks(taskId, &sShopBuyMenuYesNoWindowTemplate, FONT_NORMAL, 0, 2, 1, 13, yesNo); } ================================================ FILE: src/cable_car.c ================================================ #include "global.h" #include "bg.h" #include "decompress.h" #include "event_data.h" #include "event_object_movement.h" #include "field_weather.h" #include "gpu_regs.h" #include "graphics.h" #include "malloc.h" #include "main.h" #include "new_menu_helpers.h" #include "menu.h" #include "overworld.h" #include "palette.h" #include "random.h" #include "scanline_effect.h" #include "script.h" #include "sound.h" #include "sprite.h" #include "task.h" #include "constants/event_objects.h" #include "constants/rgb.h" #include "constants/songs.h" #include "constants/weather.h" #define GOING_DOWN gSpecialVar_0x8004 #define STATE_END 0xFF #define TAG_CABLE_CAR 1 #define TAG_DOOR 2 #define TAG_CABLE 3 struct CableCar { u8 bgTaskId; u8 state; u8 weather; u16 weatherDelay; u16 timer; u8 bg0HorizontalOffset; u8 bg0VerticalOffset; u8 unused0[2]; u8 bg1HorizontalOffset; u8 bg1VerticalOffset; u8 unused1[6]; u8 bg3HorizontalOffset; u8 bg3VerticalOffset; u8 unused2[2]; u8 groundTileIdx; u8 groundSegmentXStart; u8 groundSegmentYStart; u8 groundTilemapOffset; u8 groundTimer; // Incremented, but does nothing u8 groundXOffset; u8 groundYOffset; u8 groundXBase; u8 groundYBase; u16 groundTileBuffer[9][12]; u8 unused3[2]; u16 bgTilemapBuffers[4][BG_SCREEN_SIZE]; u16 *groundTilemap; u16 *treesTilemap; u16 *bgMountainsTilemap; const u16 *pylonHookTilemapEntries; u8 *pylonStemTilemap; }; static EWRAM_DATA struct CableCar *sCableCar = NULL; static EWRAM_DATA u8 sGroundX_Up = 0; static EWRAM_DATA u8 sGroundY_Up = 0; static EWRAM_DATA u8 sGroundSegmentY_Up = 0; static EWRAM_DATA u8 sGroundX_Down = 0; static EWRAM_DATA u8 sGroundY_Down = 0; static EWRAM_DATA u8 sGroundSegmentY_Down = 0; static void CB2_LoadCableCar(void); static void SetBgRegs(bool8); static void CreateCableCarSprites(void); static void InitGroundTilemapData(bool8); static void Task_CableCar(u8); static void Task_AnimateBgGoingUp(u8); static void Task_AnimateBgGoingDown(u8); static void VBlankCB_CableCar(void); static void CB2_CableCar(void); static void AnimateGroundGoingUp(void); static void AnimateGroundGoingDown(void); static void SpriteCB_CableCar(struct Sprite *); static void SpriteCB_Cable(struct Sprite *); static void DrawNextGroundSegmentGoingUp(void); static void DrawNextGroundSegmentGoingDown(void); static const struct BgTemplate sBgTemplates[4] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0 }, }; static const u8 sGround_Tilemap[] = INCBIN_U8("graphics/cable_car/ground.bin.lz"); static const u8 sTrees_Tilemap[] = INCBIN_U8("graphics/cable_car/trees.bin.lz"); static const u8 sBgMountains_Tilemap[] = INCBIN_U8("graphics/cable_car/bg_mountains.bin.lz"); static const u16 sPylonHook_TilemapEntries[] = { 0x3000, 0x3001, 0x3002, 0x3003, 0x3004, 0x3005, 0x3006, 0x3007, 0x3008, 0x3009, }; static const u8 sPylonStems_Tilemap[] = INCBIN_U8("graphics/cable_car/pylons.bin.lz"); static const struct CompressedSpriteSheet sSpriteSheets[] = { { gCableCar_Gfx, 0x800, TAG_CABLE_CAR }, { gCableCarDoor_Gfx, 0x40, TAG_DOOR }, { gCableCarCable_Gfx, 0x80, TAG_CABLE }, { }, }; static const struct SpritePalette sSpritePalettes[] = { { gCableCar_Pal, TAG_CABLE_CAR }, { } }; static const struct OamData sOam_CableCar = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; static const struct OamData sOam_CableCarDoor = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x8), .x = 0, .size = SPRITE_SIZE(16x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; static const struct OamData sOam_Cable = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; static const struct SpriteTemplate sSpriteTemplate_CableCar[] = { { .tileTag = TAG_CABLE_CAR, .paletteTag = TAG_CABLE_CAR, .oam = &sOam_CableCar, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_CableCar, }, { .tileTag = TAG_DOOR, .paletteTag = TAG_CABLE_CAR, .oam = &sOam_CableCarDoor, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_CableCar, }, }; static const struct SpriteTemplate sSpriteTemplate_Cable = { .tileTag = TAG_CABLE, .paletteTag = TAG_CABLE_CAR, .oam = &sOam_Cable, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Cable, }; static void Task_LoadCableCar(u8 taskId) { if (!gPaletteFade.active) { SetMainCallback2(CB2_LoadCableCar); DestroyTask(taskId); } } void CableCar(void) { LockPlayerFieldControls(); CreateTask(Task_LoadCableCar, 1); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); } static void CB2_LoadCableCar(void) { u16 imebak; u8 i = 0; u32 sizeOut = 0; switch (gMain.state) { case 0: default: SetVBlankCallback(NULL); SetBgRegs(FALSE); ScanlineEffect_Stop(); DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE); DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE); sCableCar = AllocZeroed(sizeof(*sCableCar)); gMain.state++; break; case 1: ResetSpriteData(); ResetTasks(); FreeAllSpritePalettes(); ResetPaletteFade(); ResetTempTileDataBuffers(); StartWeather(); for (i = 0; i < NUM_ASH_SPRITES; i++) gWeatherPtr->sprites.s2.ashSprites[i] = NULL; InitMapMusic(); ResetMapMusic(); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetBgTilemapBuffer(0, sCableCar->bgTilemapBuffers[0]); SetBgTilemapBuffer(1, sCableCar->bgTilemapBuffers[1]); SetBgTilemapBuffer(2, sCableCar->bgTilemapBuffers[2]); SetBgTilemapBuffer(3, sCableCar->bgTilemapBuffers[3]); gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0; gMain.state++; break; case 2: for (i = 0; i < NELEMS(sSpriteSheets) - 1; i++) LoadCompressedSpriteSheet(&sSpriteSheets[i]); LoadSpritePalettes(sSpritePalettes); sCableCar->groundTilemap = MallocAndDecompress(sGround_Tilemap, &sizeOut); sCableCar->treesTilemap = MallocAndDecompress(sTrees_Tilemap, &sizeOut); sCableCar->bgMountainsTilemap = MallocAndDecompress(sBgMountains_Tilemap, &sizeOut); sCableCar->pylonStemTilemap = MallocAndDecompress(sPylonStems_Tilemap, &sizeOut); sCableCar->pylonHookTilemapEntries = sPylonHook_TilemapEntries; DecompressAndCopyTileDataToVram(0, gCableCarBg_Gfx, 0, 0, 0); gMain.state++; break; case 3: if (!FreeTempTileDataBuffersIfPossible()) { LoadPalette(gCableCarBg_Pal, 0, 0x80); gMain.state++; } break; case 4: CreateCableCarSprites(); RunTasks(); gMain.state++; break; case 5: if (sCableCar->weather == WEATHER_VOLCANIC_ASH) { gMain.state++; } else if (gWeatherPtr->sprites.s2.ashSprites[0]) { for (i = 0; i < NUM_ASH_SPRITES; i++) { if (gWeatherPtr->sprites.s2.ashSprites[i]) gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0; } gMain.state++; } break; case 6: CopyToBgTilemapBufferRect_ChangePalette(1, sCableCar->treesTilemap, 0, 17, 32, 15, 17); CopyToBgTilemapBufferRect_ChangePalette(2, sCableCar->bgMountainsTilemap, 0, 0, 30, 20, 17); CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonHookTilemapEntries, 0, 0, 5, 2, 17); CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonStemTilemap, 0, 2, 2, 20, 17); gMain.state++; break; case 7: InitGroundTilemapData(GOING_DOWN); CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x48, 0, 14, 12, 3, 17); CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x6C, 12, 17, 12, 3, 17); CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x90, 24, 20, 12, 3, 17); CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x0, 0, 17, 12, 3, 17); CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x24, 0, 20, 12, 3, 17); CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x0, 12, 20, 12, 3, 17); CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x24, 12, 23, 12, 3, 17); CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x0, 24, 23, 12, 3, 17); gMain.state++; break; case 8: BeginNormalPaletteFade(0xFFFFFFFF, 3, 16, 0, RGB(0, 0, 0)); FadeInNewBGM(MUS_CABLE_CAR, 1); SetBgRegs(TRUE); gMain.state++; break; case 9: imebak = REG_IME; REG_IME = 0; REG_IE |= INTR_FLAG_VBLANK; REG_IME = imebak; SetVBlankCallback(VBlankCB_CableCar); SetMainCallback2(CB2_CableCar); CreateTask(Task_CableCar, 0); if (!GOING_DOWN) sCableCar->bgTaskId = CreateTask(Task_AnimateBgGoingUp, 1); else sCableCar->bgTaskId = CreateTask(Task_AnimateBgGoingDown, 1); break; } } static void CB2_CableCar(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); MapMusicMain(); } static void CB2_EndCableCar(void) { u8 i = 0; HideBg(0); HideBg(1); HideBg(2); HideBg(3); SetBgRegs(FALSE); gSpriteCoordOffsetX = 0; SetCurrentAndNextWeatherNoDelay(WEATHER_NONE); for (i = 0; i < NUM_ASH_SPRITES; i++) gWeatherPtr->sprites.s2.ashSprites[i] = NULL; ResetTasks(); ResetSpriteData(); ResetPaletteFade(); UnsetBgTilemapBuffer(0); UnsetBgTilemapBuffer(1); UnsetBgTilemapBuffer(2); UnsetBgTilemapBuffer(3); ResetBgsAndClearDma3BusyFlags(0); sCableCar->pylonHookTilemapEntries = NULL; FREE_AND_SET_NULL(sCableCar->pylonStemTilemap); FREE_AND_SET_NULL(sCableCar->bgMountainsTilemap); FREE_AND_SET_NULL(sCableCar->treesTilemap); FREE_AND_SET_NULL(sCableCar->groundTilemap); FREE_AND_SET_NULL(sCableCar); DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE); DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE); WarpIntoMap(); gFieldCallback = NULL; SetMainCallback2(CB2_LoadMap); } static void Task_CableCar(u8 taskId) { u8 i = 0; sCableCar->timer++; switch (sCableCar->state) { case 0: // Wait to change weather if (sCableCar->timer == sCableCar->weatherDelay) { SetNextWeather(sCableCar->weather); sCableCar->state = 1; } break; case 1: // Update ash sprites switch (sCableCar->weather) { case WEATHER_VOLCANIC_ASH: if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL && gWeatherPtr->sprites.s2.ashSprites[0]->oam.priority != 0) { for (; i < NUM_ASH_SPRITES; i++) { if (gWeatherPtr->sprites.s2.ashSprites[i]) gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0; } sCableCar->state = 2; } break; case WEATHER_SUNNY: if (gWeatherPtr->currWeather == WEATHER_SUNNY) { sCableCar->state = 2; } else if (sCableCar->timer >= sCableCar->weatherDelay + 8) { for (; i < NUM_ASH_SPRITES; i++) { if (gWeatherPtr->sprites.s2.ashSprites[i]) gWeatherPtr->sprites.s2.ashSprites[i]->invisible ^= 1; } } break; } break; case 2: // Wait to fade out if (sCableCar->timer == 570) { sCableCar->state = 3; BeginNormalPaletteFade(0xFFFFFFFF, 3, 0, 16, RGB(0, 0, 0)); FadeOutBGM(4); } break; case 3: // Wait for fade out if (!gPaletteFade.active) sCableCar->state = STATE_END; break; case STATE_END: SetVBlankCallback(NULL); DestroyTask(taskId); DestroyTask(sCableCar->bgTaskId); SetMainCallback2(CB2_EndCableCar); break; } } static void Task_AnimateBgGoingUp(u8 taskId) { if (sCableCar->state != STATE_END) { sCableCar->bg3HorizontalOffset--; if ((sCableCar->timer % 2) == 0) sCableCar->bg3VerticalOffset--; if ((sCableCar->timer % 8) == 0) { sCableCar->bg1HorizontalOffset--; sCableCar->bg1VerticalOffset--; } switch (sCableCar->bg3HorizontalOffset) { case 175: FillBgTilemapBufferRect(3, 0, 0, 22, 2, 10, 17); break; case 40: FillBgTilemapBufferRect(3, 0, 3, 0, 2, 2, 17); break; case 32: FillBgTilemapBufferRect(3, 0, 2, 0, 1, 2, 17); break; case 16: CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonHookTilemapEntries, 0, 0, 5, 2, 17); CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonStemTilemap, 0, 2, 2, 30, 17); sCableCar->bg3VerticalOffset = 64; break; } } AnimateGroundGoingUp(); gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 1) % 128; } static void Task_AnimateBgGoingDown(u8 taskId) { if (sCableCar->state != STATE_END) { sCableCar->bg3HorizontalOffset++; if ((sCableCar->timer % 2) == 0) sCableCar->bg3VerticalOffset++; if ((sCableCar->timer % 8) == 0) { sCableCar->bg1HorizontalOffset++; sCableCar->bg1VerticalOffset++; } switch (sCableCar->bg3HorizontalOffset) { case 176: CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonStemTilemap, 0, 2, 2, 30, 17); break; case 16: FillBgTilemapBufferRect(3, 0, 2, 0, 3, 2, 17); FillBgTilemapBufferRect(3, 0, 0, 22, 2, 10, 17); sCableCar->bg3VerticalOffset = 192; break; case 32: FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[2], 2, 0, 1, 1, 17); FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[3], 3, 0, 1, 1, 17); FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[7], 2, 1, 1, 1, 17); FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[8], 3, 1, 1, 1, 17); break; case 40: FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[4], 4, 0, 1, 1, 17); FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[9], 4, 1, 1, 1, 17); break; } } AnimateGroundGoingDown(); if (sCableCar->timer < sCableCar->weatherDelay) gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 247) % 248; else gWeatherPtr->ashBaseSpritesX = (gWeatherPtr->ashBaseSpritesX + 247) % 248; } static void VBlankCB_CableCar(void) { CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); SetGpuReg(REG_OFFSET_BG3HOFS, sCableCar->bg3HorizontalOffset); SetGpuReg(REG_OFFSET_BG3VOFS, sCableCar->bg3VerticalOffset); SetGpuReg(REG_OFFSET_BG1HOFS, sCableCar->bg1HorizontalOffset); SetGpuReg(REG_OFFSET_BG1VOFS, sCableCar->bg1VerticalOffset); SetGpuReg(REG_OFFSET_BG0HOFS, sCableCar->bg0HorizontalOffset); SetGpuReg(REG_OFFSET_BG0VOFS, sCableCar->bg0VerticalOffset); LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void SpriteCB_Cable(struct Sprite *sprite) { } #define sXPos data[0] #define sYPos data[1] static void SpriteCB_CableCar(struct Sprite *sprite) { if (sCableCar->state != STATE_END) { if (!GOING_DOWN) { sprite->x = sprite->sXPos - (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); sprite->y = sprite->sYPos - (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); } else { sprite->x = sprite->sXPos + (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); sprite->y = sprite->sYPos + (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); } } } #define sState data[2] #define sTimer data[3] static void SpriteCB_Player(struct Sprite *sprite) { if (sCableCar->state != STATE_END) { // Move along with cable car if (!GOING_DOWN) { sprite->x = sprite->sXPos - (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); sprite->y = sprite->sYPos - (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); } else { sprite->x = sprite->sXPos + (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); sprite->y = sprite->sYPos + (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); } // Bounce up and down switch (sprite->sState) { case 0: sprite->y2 = 17; if (sprite->sTimer++ > 9) { sprite->sTimer = 0; sprite->sState++; } break; default: sprite->y2 = 16; if (sprite->sTimer++ > 9) { sprite->sTimer = 0; sprite->sState = 0; } break; } } } #undef sState #undef sTimer #define sTimer data[0] #define sSameDir data[1] // Whether or not the hiker is headed the same dir as the Cable Car #define sDelay data[2] static void SpriteCB_HikerGoingUp(struct Sprite *sprite) { if (sprite->sTimer == 0) { sprite->x += 2 * sprite->centerToCornerVecX; sprite->y += 16 + sprite->centerToCornerVecY; } if (++sprite->sTimer >= sprite->sDelay) { switch (sprite->sSameDir) { case FALSE: sprite->x++; if ((sprite->sTimer % 4) == 0) sprite->y++; break; case TRUE: // Hiker moves slower if travelling with the Cable Car if ((sprite->sTimer % 2) != 0) { sprite->x++; if ((sprite->x % 4) == 0) sprite->y++; } break; } if (sprite->y > 160) DestroySprite(sprite); } } static void SpriteCB_HikerGoingDown(struct Sprite *sprite) { if (sprite->sTimer == 0) sprite->y += 16 + sprite->centerToCornerVecY; if (++sprite->sTimer >= sprite->sDelay) { switch (sprite->sSameDir) { case FALSE: sprite->x--; if ((sprite->sTimer % 4) == 0) sprite->y--; break; case TRUE: // Hiker moves slower if travelling with the Cable Car if ((sprite->sTimer % 2) != 0) { sprite->x--; if ((sprite->x % 4) == 0) sprite->y--; } break; } if (sprite->y < 80) DestroySprite(sprite); } } #undef sTimer static void SetBgRegs(bool8 active) { switch (active) { case FALSE: default: SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN1H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN1V, 0); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG3CNT, 0); SetGpuReg(REG_OFFSET_BG2CNT, 0); SetGpuReg(REG_OFFSET_BG1CNT, 0); SetGpuReg(REG_OFFSET_BG0CNT, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); break; case TRUE: SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN1H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN1V, 0); if (!GOING_DOWN) { sCableCar->bg3HorizontalOffset = 176; sCableCar->bg3VerticalOffset = 16; sCableCar->bg1HorizontalOffset = 0; sCableCar->bg1VerticalOffset = 80; sCableCar->bg0VerticalOffset = 0; sCableCar->bg0VerticalOffset = 0; } else { sCableCar->bg3HorizontalOffset = 96; sCableCar->bg3VerticalOffset = 232; sCableCar->bg1HorizontalOffset = 0; sCableCar->bg1VerticalOffset = 4; sCableCar->bg0VerticalOffset = 0; sCableCar->bg0VerticalOffset = 0; } SetGpuReg(REG_OFFSET_BG3HOFS, sCableCar->bg3HorizontalOffset); SetGpuReg(REG_OFFSET_BG3VOFS, sCableCar->bg3VerticalOffset); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, sCableCar->bg1HorizontalOffset); SetGpuReg(REG_OFFSET_BG1VOFS, sCableCar->bg1VerticalOffset); SetGpuReg(REG_OFFSET_BG0HOFS, sCableCar->bg0HorizontalOffset); SetGpuReg(REG_OFFSET_BG0VOFS, sCableCar->bg0VerticalOffset); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL); break; } } static void CreateCableCarSprites(void) { u8 spriteId; u8 i; u8 playerGraphicsIds[2] = { [MALE] = OBJ_EVENT_GFX_RED_NORMAL, [FEMALE] = OBJ_EVENT_GFX_GREEN_NORMAL }; u16 rval = Random(); u8 hikerGraphicsIds[4] = { OBJ_EVENT_GFX_HIKER, OBJ_EVENT_GFX_CAMPER, OBJ_EVENT_GFX_PICNICKER, OBJ_EVENT_GFX_HIKER }; s16 hikerCoords[2][2] = { { 0, 80 }, // Going up { 240, 146 } // Going down }; u8 hikerMovementDelayTable[4] = { 0, 60, 120, 170}; void (*hikerCallbacks[2])(struct Sprite *) = { SpriteCB_HikerGoingUp, SpriteCB_HikerGoingDown }; switch (GOING_DOWN) { case FALSE: default: // Create player sprite spriteId = CreateObjectGraphicsSprite(playerGraphicsIds[gSaveBlock2Ptr->playerGender], SpriteCB_Player, 200, 73, 102); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = 2; gSprites[spriteId].x2 = 8; gSprites[spriteId].y2 = 16; gSprites[spriteId].sXPos = 200; gSprites[spriteId].sYPos = 73; } // Create car sprite spriteId = CreateSprite(&sSpriteTemplate_CableCar[0], 176, 43, 0x67); gSprites[spriteId].x2 = gSprites[spriteId].y2 = 32; gSprites[spriteId].sXPos = 176; gSprites[spriteId].sYPos = 43; // Create door sprite spriteId = CreateSprite(&sSpriteTemplate_CableCar[1], 200, 99, 0x65); gSprites[spriteId].x2 = 8; gSprites[spriteId].y2 = 4; gSprites[spriteId].sXPos = 200; gSprites[spriteId].sYPos = 99; // Init weather sCableCar->weather = WEATHER_VOLCANIC_ASH; sCableCar->weatherDelay = 350; SetCurrentAndNextWeatherNoDelay(WEATHER_SUNNY); break; case TRUE: CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x24, 24, 26, 12, 3, 17); // Create player sprite spriteId = CreateObjectGraphicsSprite(playerGraphicsIds[gSaveBlock2Ptr->playerGender], SpriteCB_Player, 128, 39, 102); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = 2; gSprites[spriteId].x2 = 8; gSprites[spriteId].y2 = 16; gSprites[spriteId].sXPos = 128; gSprites[spriteId].sYPos = 39; } // Create car sprite spriteId = CreateSprite(&sSpriteTemplate_CableCar[0], 104, 9, 0x67); gSprites[spriteId].x2 = gSprites[spriteId].y2 = 32; gSprites[spriteId].sXPos = 104; gSprites[spriteId].sYPos = 9; // Create door sprite spriteId = CreateSprite(&sSpriteTemplate_CableCar[1], 128, 65, 0x65); gSprites[spriteId].x2 = 8; gSprites[spriteId].y2 = 4; gSprites[spriteId].sXPos = 128; gSprites[spriteId].sYPos = 65; // Init weather sCableCar->weather = WEATHER_SUNNY; sCableCar->weatherDelay = 265; SetCurrentAndNextWeatherNoDelay(WEATHER_VOLCANIC_ASH); break; } for (i = 0; i < 9; i++) { spriteId = CreateSprite(&sSpriteTemplate_Cable, 16 * i + 96, 8 * i - 8, 0x68); gSprites[spriteId].x2 = 8; gSprites[spriteId].y2 = 8; } // 1/64 chance for an NPC to appear hiking on the ground below the Cable Car if ((rval % 64) == 0) { // Unclear if this was intentional, but the - 1 in the below NELEMS means the Zigzagoon is never used spriteId = CreateObjectGraphicsSprite(hikerGraphicsIds[rval % (NELEMS(hikerGraphicsIds) - 1)], hikerCallbacks[GOING_DOWN], hikerCoords[GOING_DOWN][0], hikerCoords[GOING_DOWN][1], 106); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = 2; gSprites[spriteId].x2 = -gSprites[spriteId].centerToCornerVecX; gSprites[spriteId].y2 = -gSprites[spriteId].centerToCornerVecY; // Randomly choose which direction the NPC is going if (!GOING_DOWN) { if (rval % 2) { // Do walking west anim StartSpriteAnim(&gSprites[spriteId], 6); gSprites[spriteId].sSameDir = TRUE; gSprites[spriteId].y += 2; } else { // Do walking east anim StartSpriteAnim(&gSprites[spriteId], 7); gSprites[spriteId].sSameDir = FALSE; } } else { if (rval % 2) { // Do walking east anim StartSpriteAnim(&gSprites[spriteId], 7); gSprites[spriteId].sSameDir = TRUE; gSprites[spriteId].y += 2; } else { // Do walking west anim StartSpriteAnim(&gSprites[spriteId], 6); gSprites[spriteId].sSameDir = FALSE; } } gSprites[spriteId].sDelay = hikerMovementDelayTable[rval % NELEMS(hikerMovementDelayTable)]; } } } static void BufferNextGroundSegment(void) { u8 i, j, k; u8 offset; for (i = 0, k = 0, offset = 0x24 * (sCableCar->groundTilemapOffset + 2); i < 3; i++) { for (j = 0; j < NELEMS(sCableCar->groundTileBuffer[0]); j++) { sCableCar->groundTileBuffer[i][j] = sCableCar->groundTilemap[offset++]; sCableCar->groundTileBuffer[i + 3][j] = sCableCar->groundTilemap[k]; sCableCar->groundTileBuffer[i + 6][j] = (sCableCar->groundTilemap + 0x24)[k]; k++; } } sCableCar->groundTilemapOffset = (sCableCar->groundTilemapOffset + 1) % 3; } static void AnimateGroundGoingUp(void) { sCableCar->groundTimer = (sCableCar->groundTimer + 1) % 96; sCableCar->bg0HorizontalOffset = sCableCar->groundXBase - sCableCar->groundXOffset; sCableCar->bg0VerticalOffset = sCableCar->groundYBase - sCableCar->groundYOffset; sCableCar->groundXOffset++; if ((sCableCar->groundXOffset % 4) == 0) sCableCar->groundYOffset++; if (sCableCar->groundXOffset > 16) DrawNextGroundSegmentGoingUp(); } static void AnimateGroundGoingDown(void) { sCableCar->groundTimer = (sCableCar->groundTimer + 1) % 96; sCableCar->bg0HorizontalOffset = sCableCar->groundXBase + sCableCar->groundXOffset; sCableCar->bg0VerticalOffset = sCableCar->groundYBase + sCableCar->groundYOffset; sCableCar->groundXOffset++; if ((sCableCar->groundXOffset % 4) == 0) sCableCar->groundYOffset++; if (sCableCar->groundXOffset > 16) DrawNextGroundSegmentGoingDown(); } static void DrawNextGroundSegmentGoingUp(void) { u8 i = 0; sCableCar->groundXOffset = sCableCar->groundYOffset = 0; sCableCar->groundXBase = sCableCar->bg0HorizontalOffset; sCableCar->groundYBase = sCableCar->bg0VerticalOffset; sCableCar->groundSegmentXStart = (sCableCar->groundSegmentXStart + 30) % 32; sCableCar->groundTileIdx -= 2; sGroundSegmentY_Up = (sCableCar->groundSegmentYStart + 23) % 32; // Draw next segment for (i = 0; i < NELEMS(sCableCar->groundTileBuffer); i++) { sGroundX_Up = sCableCar->groundSegmentXStart; sGroundY_Up = (sGroundSegmentY_Up + i) % 32; FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx], sGroundX_Up, sGroundY_Up, 1, 1, 17); sGroundX_Up = (sGroundX_Up + 1) % 32; FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx + 1], sGroundX_Up, sGroundY_Up, 1, 1, 17); } // Erase old segment sGroundX_Up = (sCableCar->groundSegmentXStart + 30) % 32; FillBgTilemapBufferRect(0, 0, sGroundX_Up, 0, 2, 32, 17); if (sCableCar->groundTileIdx == 0) { sCableCar->groundSegmentYStart = (sCableCar->groundSegmentYStart + 29) % 32; sCableCar->groundTileIdx = 12; BufferNextGroundSegment(); sGroundX_Up = (sCableCar->groundSegmentYStart + 1) % 32; FillBgTilemapBufferRect(0, 0, 0, sGroundX_Up, 32, 9, 17); } } static void DrawNextGroundSegmentGoingDown(void) { u8 i = 0; sCableCar->groundXOffset = sCableCar->groundYOffset = 0; sCableCar->groundXBase = sCableCar->bg0HorizontalOffset; sCableCar->groundYBase = sCableCar->bg0VerticalOffset; sCableCar->groundSegmentXStart = (sCableCar->groundSegmentXStart + 2) % 32; sCableCar->groundTileIdx += 2; sGroundSegmentY_Down = sCableCar->groundSegmentYStart; // Draw next segment for (i = 0; i < NELEMS(sCableCar->groundTileBuffer); i++) { sGroundX_Down = sCableCar->groundSegmentXStart; sGroundY_Down = (sGroundSegmentY_Down + i) % 32; FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx], sGroundX_Down, sGroundY_Down, 1, 1, 17); sGroundX_Down = (sGroundX_Down + 1) % 32; FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx + 1], sGroundX_Down, sGroundY_Down, 1, 1, 17); } // Erase old segment sGroundY_Down = (sCableCar->groundSegmentYStart + 23) % 32; FillBgTilemapBufferRect(0, 0, sCableCar->groundSegmentXStart, sGroundY_Down, 2, 9, 17); if (sCableCar->groundTileIdx == 10) { sCableCar->groundSegmentYStart = (sCableCar->groundSegmentYStart + 3) % 32; sCableCar->groundTileIdx = -2; BufferNextGroundSegment(); } } static void InitGroundTilemapData(bool8 goingDown) { switch (goingDown) { case FALSE: default: sCableCar->groundTilemapOffset = 2; sCableCar->groundSegmentXStart = 0; sCableCar->groundSegmentYStart = 20; sCableCar->groundTileIdx = 12; BufferNextGroundSegment(); DrawNextGroundSegmentGoingUp(); break; case TRUE: sCableCar->groundTilemapOffset = 2; sCableCar->groundSegmentXStart = 28; sCableCar->groundSegmentYStart = 20; sCableCar->groundTileIdx = 4; BufferNextGroundSegment(); DrawNextGroundSegmentGoingDown(); break; } sCableCar->groundTimer = 0; } ================================================ FILE: src/cable_car_util.c ================================================ #include "global.h" static void CableCarUtil_FillWrapped(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) { u32 i; u32 j; u8 x; u8 y; for (i = 0, y = top; i < height; i++) { for (x = left, j = 0; j < width; j++) { *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = value; x = (x + 1) % 32; } y = (y + 1) % 32; } } static void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) { u32 i; u32 j; u8 x; u8 y; const u16 *_src; for (i = 0, _src = src, y = top; i < height; i++) { for (x = left, j = 0; j < width; j++) { *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = *_src++; x = (x + 1) % 32; } y = (y + 1) % 32; } } ================================================ FILE: src/cable_club.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_records.h" #include "cable_club.h" #include "event_data.h" #include "event_scripts.h" #include "field_message_box.h" #include "field_weather.h" #include "link.h" #include "load_save.h" #include "m4a.h" #include "mystery_gift.h" #include "new_menu_helpers.h" #include "overworld.h" #include "quest_log.h" #include "script.h" #include "script_pokemon_util.h" #include "start_menu.h" #include "strings.h" #include "task.h" #include "trade.h" #include "trainer_card.h" #include "union_room.h" #include "constants/songs.h" #include "constants/cable_club.h" #include "constants/field_weather.h" #include "constants/maps.h" u32 UnusedVarNeededToMatch[8]; static void Task_LinkupStart(u8 taskId); static void Task_LinkupAwaitConnection(u8 taskId); static void Task_LinkupConfirmWhenReady(u8 taskId); static void Task_LinkupAwaitConfirmation(u8 taskId); static void Task_LinkupTryConfirmation(u8 taskId); static void Task_LinkupConfirm(u8 taskId); static void Task_LinkupExchangeDataWithLeader(u8 taskId); static void Task_LinkupCheckStatusAfterConfirm(u8 taskId); static void Task_LinkupAwaitTrainerCardData(u8 taskId); static void Task_StopLinkup(u8 taskId); static void Task_LinkupFailed(u8 taskId); static void Task_LinkupConnectionError(u8 taskId); static bool8 TryLinkTimeout(u8 taskId); static void Task_ReestablishLink(u8 taskId); static void Task_ReestablishLinkAwaitConnection(u8 taskId); static void Task_ReestablishLinkLeader(u8 taskId); static void Task_ReestablishLinkAwaitConfirmation(u8 taskId); #define tState data[0] #define tMinPlayers data[1] #define tMaxPlayers data[2] #define tNumPlayers data[3] #define tTimer data[4] #define tWindowId data[5] static const struct WindowTemplate sWindowTemplate_LinkPlayerCount = { .bg = 0, .tilemapLeft = 16, .tilemapTop = 11, .width = 11, .height = 2, .paletteNum = 15, .baseBlock = 0x125 }; static const u8 *const sTrainerCardColorNames[] = { gText_BronzeCard, gText_CopperCard, gText_SilverCard, gText_GoldCard }; static void CreateLinkupTask(u8 minPlayers, u8 maxPlayers) { u8 taskId; if (FindTaskIdByFunc(Task_LinkupStart) == TASK_NONE) { taskId = CreateTask(Task_LinkupStart, 80); gTasks[taskId].tMinPlayers = minPlayers; gTasks[taskId].tMaxPlayers = maxPlayers; } } static void PrintNumPlayersInLink(u16 windowId, s32 numPlayers) { ConvertIntToDecimalStringN(gStringVar1, numPlayers, STR_CONV_MODE_LEFT_ALIGN, 1); SetStdWindowBorderStyle(windowId, FALSE); StringExpandPlaceholders(gStringVar4, gText_NumPlayerLink); AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, 0, 0, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(windowId, COPYWIN_FULL); } static void ClearLinkPlayerCountWindow(u16 windowId) { ClearStdWindowAndFrame(windowId, FALSE); CopyWindowToVram(windowId, COPYWIN_FULL); } static void UpdateLinkPlayerCountDisplay(u8 taskId, u8 numPlayers) { s16 *data = gTasks[taskId].data; if (numPlayers != tNumPlayers) { if (numPlayers < 2) ClearLinkPlayerCountWindow(tWindowId); else PrintNumPlayersInLink(tWindowId, numPlayers); tNumPlayers = numPlayers; } } static u16 ExchangeDataAndGetLinkupStatus(u8 minPlayers, u8 maxPlayers) { switch (GetLinkPlayerDataExchangeStatusTimed(minPlayers, maxPlayers)) { case EXCHANGE_COMPLETE: return LINKUP_SUCCESS; case EXCHANGE_DIFF_SELECTIONS: return LINKUP_DIFF_SELECTIONS; case EXCHANGE_PLAYER_NOT_READY: return LINKUP_PLAYER_NOT_READY; case EXCHANGE_PARTNER_NOT_READY: return LINKUP_PARTNER_NOT_READY; case EXCHANGE_WRONG_NUM_PLAYERS: ConvertIntToDecimalStringN(gStringVar1, GetLinkPlayerCount_2(), STR_CONV_MODE_LEFT_ALIGN, 1); return LINKUP_WRONG_NUM_PLAYERS; default: return LINKUP_ONGOING; } } static bool32 CheckLinkErrored(u8 taskId) { if (HasLinkErrorOccurred() == TRUE) { gTasks[taskId].func = Task_LinkupConnectionError; return TRUE; } return FALSE; } static bool32 CheckLinkCanceledBeforeConnection(u8 taskId) { if (JOY_NEW(B_BUTTON) && !IsLinkConnectionEstablished()) { gLinkType = 0; gTasks[taskId].func = Task_LinkupFailed; return TRUE; } return FALSE; } static bool32 CheckLinkCanceled(u8 taskId) { if (IsLinkConnectionEstablished()) SetSuppressLinkErrorMessage(TRUE); if (JOY_NEW(B_BUTTON)) { gLinkType = 0; gTasks[taskId].func = Task_LinkupFailed; return TRUE; } return FALSE; } static bool32 CheckSioErrored(u8 taskId) { if (GetSioMultiSI() == TRUE) { gTasks[taskId].func = Task_LinkupConnectionError; return TRUE; } return FALSE; } // Unused static void Task_DelayedBlockRequest(u8 taskId) { gTasks[taskId].data[0]++; if (gTasks[taskId].data[0] == 10) { SendBlockRequest(BLOCK_REQ_SIZE_100); DestroyTask(taskId); } } static void Task_LinkupStart(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[0] == 0) { OpenLinkTimed(); ResetLinkPlayerCount(); ResetLinkPlayers(); tWindowId = AddWindow(&sWindowTemplate_LinkPlayerCount); } else if (data[0] > 9) { gTasks[taskId].func = Task_LinkupAwaitConnection; } data[0]++; } static void Task_LinkupAwaitConnection(u8 taskId) { u8 playerCount = GetLinkPlayerCount_2(); if (CheckLinkCanceledBeforeConnection(taskId) == TRUE || CheckLinkCanceled(taskId) == TRUE || playerCount < 2) return; SetSuppressLinkErrorMessage(TRUE); gTasks[taskId].data[3] = 0; if (IsLinkMaster() == TRUE) { PlaySE(SE_PIN); ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel); gTasks[taskId].func = Task_LinkupConfirmWhenReady; } else { PlaySE(SE_BOO); ShowFieldAutoScrollMessage(CableClub_Text_AwaitingLinkupBCancel); gTasks[taskId].func = Task_LinkupExchangeDataWithLeader; } } static void Task_LinkupConfirmWhenReady(u8 taskId) { if (CheckLinkCanceledBeforeConnection(taskId) == TRUE || CheckSioErrored(taskId) == TRUE || CheckLinkErrored(taskId) == TRUE) return; if (GetFieldMessageBoxType() == FIELD_MESSAGE_BOX_HIDDEN) { gTasks[taskId].tNumPlayers = 0; gTasks[taskId].func = Task_LinkupAwaitConfirmation; } } static void Task_LinkupAwaitConfirmation(u8 taskId) { s16 *data = gTasks[taskId].data; s32 linkPlayerCount = GetLinkPlayerCount_2(); if (CheckLinkCanceledBeforeConnection(taskId) == TRUE || CheckSioErrored(taskId) == TRUE || CheckLinkErrored(taskId) == TRUE) return; UpdateLinkPlayerCountDisplay(taskId, linkPlayerCount); if (JOY_NEW(A_BUTTON) && linkPlayerCount >= tMinPlayers) { SaveLinkPlayers(linkPlayerCount); ClearLinkPlayerCountWindow(tWindowId); ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); ShowFieldAutoScrollMessage(CableClub_Text_StartLinkWithXPlayersAConfirmBCancel); gTasks[taskId].func = Task_LinkupTryConfirmation; } } static void Task_LinkupTryConfirmation(u8 taskId) { if (CheckLinkCanceledBeforeConnection(taskId) == TRUE || CheckSioErrored(taskId) == TRUE || CheckLinkErrored(taskId) == TRUE) return; if (GetFieldMessageBoxType() == FIELD_MESSAGE_BOX_HIDDEN) { if (GetSavedPlayerCount() != GetLinkPlayerCount_2()) { ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel); gTasks[taskId].func = Task_LinkupConfirmWhenReady; } else if (JOY_HELD(B_BUTTON)) { ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel); gTasks[taskId].func = Task_LinkupConfirmWhenReady; } else if (JOY_HELD(A_BUTTON)) { PlaySE(SE_SELECT); CheckShouldAdvanceLinkState(); gTasks[taskId].func = Task_LinkupConfirm; } } } static void Task_LinkupConfirm(u8 taskId) { u8 minPlayers = gTasks[taskId].tMinPlayers; u8 maxPlayers = gTasks[taskId].tMaxPlayers; if (CheckLinkErrored(taskId) == TRUE || TryLinkTimeout(taskId) == TRUE) return; if (GetLinkPlayerCount_2() != GetSavedPlayerCount()) { gTasks[taskId].func = Task_LinkupConnectionError; } else { u16 *result = &gSpecialVar_Result; *result = ExchangeDataAndGetLinkupStatus(minPlayers, maxPlayers); if (*result) gTasks[taskId].func = Task_LinkupCheckStatusAfterConfirm; } } static void Task_LinkupExchangeDataWithLeader(u8 taskId) { u8 minPlayers = gTasks[taskId].tMinPlayers; u8 maxPlayers = gTasks[taskId].tMaxPlayers; u16 *result; if (CheckLinkCanceledBeforeConnection(taskId) == TRUE || CheckLinkErrored(taskId) == TRUE) return; result = &gSpecialVar_Result; *result = ExchangeDataAndGetLinkupStatus(minPlayers, maxPlayers); if (*result == LINKUP_ONGOING) return; if (*result == LINKUP_DIFF_SELECTIONS || *result == LINKUP_WRONG_NUM_PLAYERS) { SetCloseLinkCallback(); HideFieldMessageBox(); gTasks[taskId].func = Task_StopLinkup; } else if (*result == LINKUP_PLAYER_NOT_READY || *result == LINKUP_PARTNER_NOT_READY) { CloseLink(); HideFieldMessageBox(); gTasks[taskId].func = Task_StopLinkup; } else { gFieldLinkPlayerCount = GetLinkPlayerCount_2(); gLocalLinkPlayerId = GetMultiplayerId(); SaveLinkPlayers(gFieldLinkPlayerCount); TrainerCard_GenerateCardForLinkPlayer((void *)gBlockSendBuffer); gTasks[taskId].func = Task_LinkupAwaitTrainerCardData; } } static bool32 AnyConnectedPartnersPlayingRS(void) { int i; u16 version; for (i = 0; i < GetLinkPlayerCount(); i++) { version = gLinkPlayers[i].version & 0xFF; if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) return TRUE; } return FALSE; } static void Task_LinkupCheckStatusAfterConfirm(u8 taskId) { if (CheckLinkErrored(taskId) == TRUE) return; if (gSpecialVar_Result == LINKUP_WRONG_NUM_PLAYERS) { if (AnyConnectedPartnersPlayingRS() == TRUE) CloseLink(); else SetCloseLinkCallback(); HideFieldMessageBox(); gTasks[taskId].func = Task_StopLinkup; } else if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS) { SetCloseLinkCallback(); HideFieldMessageBox(); gTasks[taskId].func = Task_StopLinkup; } else if (gSpecialVar_Result == LINKUP_PLAYER_NOT_READY || gSpecialVar_Result == LINKUP_PARTNER_NOT_READY) { CloseLink(); HideFieldMessageBox(); gTasks[taskId].func = Task_StopLinkup; } else { gFieldLinkPlayerCount = GetLinkPlayerCount_2(); gLocalLinkPlayerId = GetMultiplayerId(); SaveLinkPlayers(gFieldLinkPlayerCount); TrainerCard_GenerateCardForLinkPlayer((void *)gBlockSendBuffer); gTasks[taskId].func = Task_LinkupAwaitTrainerCardData; SendBlockRequest(BLOCK_REQ_SIZE_100); } } static void Task_LinkupAwaitTrainerCardData(u8 taskId) { u8 i; u16 version; u8 * dest; if (CheckLinkErrored(taskId) == TRUE) return; if (GetBlockReceivedStatus() != GetSavedLinkPlayerCountAsBitFlags()) return; for (i = 0; i < GetLinkPlayerCount(); i++) { version = gLinkPlayers[i].version & 0xFF; if (version != VERSION_FIRE_RED && version != VERSION_LEAF_GREEN) { const struct TrainerCardRSE * src = (const struct TrainerCardRSE *)gBlockRecvBuffer[i]; gTrainerCards[i].rse = *src; gTrainerCards[i].version = gLinkPlayers[i].version; } else { const struct TrainerCard * src = (const struct TrainerCard *)gBlockRecvBuffer[i]; gTrainerCards[i] = *src; } } SetSuppressLinkErrorMessage(FALSE); ResetBlockReceivedFlags(); HideFieldMessageBox(); if (gSpecialVar_Result == LINKUP_SUCCESS) { // Dumb trick required to match if (gLinkType == LINKTYPE_BERRY_BLENDER_SETUP) *UnusedVarNeededToMatch += 0; ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId); ScriptContext_Enable(); DestroyTask(taskId); } else { SetCloseLinkCallback(); gTasks[taskId].func = Task_StopLinkup; } } static void Task_StopLinkup(u8 taskId) { if (!gReceivedRemoteLinkPlayers) { ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId); ScriptContext_Enable(); RemoveWindow(gTasks[taskId].tWindowId); DestroyTask(taskId); } } static void Task_LinkupFailed(u8 taskId) { gSpecialVar_Result = LINKUP_FAILED; ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId); HideFieldMessageBox(); ScriptContext_Enable(); DestroyTask(taskId); } static void Task_LinkupConnectionError(u8 taskId) { gSpecialVar_Result = LINKUP_CONNECTION_ERROR; ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId); HideFieldMessageBox(); ScriptContext_Enable(); DestroyTask(taskId); } static bool8 TryLinkTimeout(u8 taskId) { if (++gTasks[taskId].tTimer > 600) { gTasks[taskId].func = Task_LinkupConnectionError; return TRUE; } return FALSE; } void TryBattleLinkup(void) { u8 minPlayers = 2; u8 maxPlayers = 2; switch (gSpecialVar_0x8004) { case USING_SINGLE_BATTLE: minPlayers = 2; maxPlayers = 2; gLinkType = LINKTYPE_SINGLE_BATTLE; break; case USING_DOUBLE_BATTLE: minPlayers = 2; maxPlayers = 2; gLinkType = LINKTYPE_DOUBLE_BATTLE; break; case USING_MULTI_BATTLE: minPlayers = 4; maxPlayers = 4; gLinkType = LINKTYPE_MULTI_BATTLE; break; } CreateLinkupTask(minPlayers, maxPlayers); } #undef tMinPlayers #undef tMaxPlayers #undef tNumPlayers #undef tTimer #undef tWindowId void TryTradeLinkup(void) { gLinkType = LINKTYPE_TRADE_SETUP; gBattleTypeFlags = 0; CreateLinkupTask(2, 2); } void TryRecordMixLinkup(void) { gSpecialVar_Result = LINKUP_ONGOING; gLinkType = LINKTYPE_RECORD_MIX_BEFORE; gBattleTypeFlags = 0; CreateLinkupTask(2, 4); } void TryContestLinkup(void) { gLinkType = LINKTYPE_CONTEST_GMODE; gBattleTypeFlags = 0; CreateLinkupTask(4, 4); } u8 CreateTask_ReestablishCableClubLink(void) { if (FuncIsActiveTask(Task_ReestablishLink)) return TASK_NONE; switch (gSpecialVar_0x8004) { case USING_SINGLE_BATTLE: gLinkType = LINKTYPE_SINGLE_BATTLE; break; case USING_DOUBLE_BATTLE: gLinkType = LINKTYPE_DOUBLE_BATTLE; break; case USING_MULTI_BATTLE: gLinkType = LINKTYPE_MULTI_BATTLE; break; case USING_TRADE_CENTER: gLinkType = LINKTYPE_TRADE; break; case USING_RECORD_CORNER: gLinkType = LINKTYPE_RECORD_MIX_AFTER; break; } return CreateTask(Task_ReestablishLink, 80); } static void Task_ReestablishLink(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[0] == 0) { OpenLink(); ResetLinkPlayers(); CreateTask(Task_WaitForLinkPlayerConnection, 80); } else if (data[0] > 9) { gTasks[taskId].func = Task_ReestablishLinkAwaitConnection; } data[0]++; } static void Task_ReestablishLinkAwaitConnection(u8 taskId) { if (GetLinkPlayerCount_2() >= 2) { if (IsLinkMaster() == TRUE) gTasks[taskId].func = Task_ReestablishLinkLeader; else gTasks[taskId].func = Task_ReestablishLinkAwaitConfirmation; } } static void Task_ReestablishLinkLeader(u8 taskId) { if (GetSavedPlayerCount() == GetLinkPlayerCount_2()) { CheckShouldAdvanceLinkState(); gTasks[taskId].func = Task_ReestablishLinkAwaitConfirmation; } } static void Task_ReestablishLinkAwaitConfirmation(u8 taskId) { if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) { CheckLinkPlayersMatchSaved(); StartSendingKeysToLink(); DestroyTask(taskId); } } // Unused void CableClub_AskSaveTheGame(void) { Field_AskSaveTheGame(); } #define tTimer data[1] static void Task_StartWiredCableClubBattle(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: FadeScreen(FADE_TO_BLACK, 0); gLinkType = LINKTYPE_BATTLE; ClearLinkCallback_2(); task->tState++; break; case 1: if (!gPaletteFade.active) task->tState++; break; case 2: if (++task->tTimer > 20) task->tState++; break; case 3: SetCloseLinkCallback(); task->tState++; break; case 4: if (!gReceivedRemoteLinkPlayers) task->tState++; break; case 5: if (gLinkPlayers[0].trainerId & 1) PlayMapChosenOrBattleBGM(MUS_RS_VS_GYM_LEADER); else PlayMapChosenOrBattleBGM(MUS_RS_VS_TRAINER); switch (gSpecialVar_0x8004) { case USING_SINGLE_BATTLE: gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK; break; case USING_DOUBLE_BATTLE: gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE; break; case USING_MULTI_BATTLE: ReducePlayerPartyToThree(); gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI; break; } CleanupOverworldWindowsAndTilemaps(); gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; SetMainCallback2(CB2_InitBattle); gMain.savedCallback = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); break; } } static void Task_StartWirelessCableClubBattle(u8 taskId) { s16 *data = gTasks[taskId].data; int i; switch (tState) { case 0: FadeScreen(FADE_TO_BLACK, 0); gLinkType = LINKTYPE_BATTLE; ClearLinkCallback_2(); tState = 1; break; case 1: if (!gPaletteFade.active) tState = 2; break; case 2: SendBlock(0, &gLocalLinkPlayer, sizeof(gLocalLinkPlayer)); tState = 3; break; case 3: if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { for (i = 0; i < GetLinkPlayerCount(); i++) { gLinkPlayers[i] = *(struct LinkPlayer *)gBlockRecvBuffer[i]; ConvertLinkPlayerName(&gLinkPlayers[i]); ResetBlockReceivedFlag(i); } tState = 4; } break; case 4: if (++tTimer > 20) tState = 5; break; case 5: SetLinkStandbyCallback(); tState = 6; break; case 6: if (IsLinkTaskFinished()) tState = 7; break; case 7: if (gLinkPlayers[0].trainerId & 1) PlayMapChosenOrBattleBGM(MUS_RS_VS_GYM_LEADER); else PlayMapChosenOrBattleBGM(MUS_RS_VS_TRAINER); gLinkPlayers[0].linkType = LINKTYPE_BATTLE; switch (gSpecialVar_0x8004) { case USING_SINGLE_BATTLE: gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK; break; case USING_DOUBLE_BATTLE: gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE; break; case USING_MULTI_BATTLE: ReducePlayerPartyToThree(); gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI; break; } CleanupOverworldWindowsAndTilemaps(); gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; SetMainCallback2(CB2_InitBattle); gMain.savedCallback = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); break; } } #undef tTimer static void CB2_ReturnFromUnionRoomBattle(void) { switch (gMain.state) { case 0: SetCloseLinkCallback(); gMain.state++; break; case 1: if (IsLinkTaskFinished()) SetMainCallback2(CB2_ReturnToField); break; } } void CB2_ReturnFromCableClubBattle(void) { gBattleTypeFlags &= (u16)~BATTLE_TYPE_LINK_IN_BATTLE; Overworld_ResetMapMusic(); LoadPlayerParty(); SavePlayerBag(); Special_UpdateTrainerFansAfterLinkBattle(); if (gSpecialVar_0x8004 != USING_MULTI_BATTLE) { UpdatePlayerLinkBattleRecords(gLocalLinkPlayerId ^ 1); if (gWirelessCommType != 0) { switch (gBattleOutcome) { case B_OUTCOME_WON: MysteryGift_TryIncrementStat(CARD_STAT_BATTLES_WON, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); break; case B_OUTCOME_LOST: MysteryGift_TryIncrementStat(CARD_STAT_BATTLES_LOST, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); break; } } } if (InUnionRoom() == TRUE) gMain.savedCallback = CB2_ReturnFromUnionRoomBattle; else gMain.savedCallback = CB2_ReturnToFieldFromMultiplayer; SetMainCallback2(CB2_SetUpSaveAfterLinkBattle); } void CleanupLinkRoomState(void) { if (gSpecialVar_0x8004 == USING_SINGLE_BATTLE || gSpecialVar_0x8004 == USING_DOUBLE_BATTLE || gSpecialVar_0x8004 == USING_MULTI_BATTLE) { LoadPlayerParty(); SavePlayerBag(); } SetWarpDestinationToDynamicWarp(WARP_ID_DYNAMIC); } void ExitLinkRoom(void) { QueueExitLinkRoomKey(); } // Note: gSpecialVar_0x8005 contains the id of the seat the player entered static void Task_EnterCableClubSeat(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: ShowFieldMessage(CableClub_Text_PleaseWaitBCancel); task->tState = 1; break; case 1: if (IsFieldMessageBoxHidden()) { SetInCableClubSeat(); SetLocalLinkPlayerId(gSpecialVar_0x8005); task->tState = 2; } break; case 2: switch (GetCableClubPartnersReady()) { case CABLE_SEAT_WAITING: break; case CABLE_SEAT_SUCCESS: // Partners linked and ready, switch to relevant link function HideFieldMessageBox(); task->tState = 0; SetStartedCableClubActivity(); SwitchTaskToFollowupFunc(taskId); break; case CABLE_SEAT_FAILED: task->tState = 3; break; } break; case 3: // Exit, failure SetLinkWaitingForScript(); EraseFieldMessageBox(TRUE); DestroyTask(taskId); ScriptContext_Enable(); break; } } static void CreateTask_EnterCableClubSeat(TaskFunc followUpFunc) { u8 taskId = CreateTask(Task_EnterCableClubSeat, 80); SetTaskFuncWithFollowupFunc(taskId, Task_EnterCableClubSeat, followUpFunc); ScriptContext_Stop(); } static void Task_StartWiredTrade(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: LockPlayerFieldControls(); FadeScreen(FADE_TO_BLACK, 0); ClearLinkCallback_2(); task->tState++; break; case 1: if (!gPaletteFade.active) task->tState++; break; case 2: gSelectedTradeMonPositions[TRADE_PLAYER] = 0; gSelectedTradeMonPositions[TRADE_PARTNER] = 0; m4aMPlayAllStop(); SetCloseLinkCallback(); task->tState++; break; case 3: if (!gReceivedRemoteLinkPlayers) { SetMainCallback2(CB2_StartCreateTradeMenu); DestroyTask(taskId); } break; } } static void Task_StartWirelessTrade(u8 taskId) { s16 *data = gTasks[taskId].data; switch (tState) { case 0: LockPlayerFieldControls(); FadeScreen(FADE_TO_BLACK, 0); ClearLinkRfuCallback(); tState++; break; case 1: if (!gPaletteFade.active) tState++; break; case 2: gSelectedTradeMonPositions[TRADE_PLAYER] = 0; gSelectedTradeMonPositions[TRADE_PARTNER] = 0; m4aMPlayAllStop(); SetLinkStandbyCallback(); tState++; break; case 3: if (IsLinkTaskFinished()) { CreateTask_CreateTradeMenu(); DestroyTask(taskId); } break; } } void EnterTradeSeat(void) { if (gWirelessCommType) CreateTask_EnterCableClubSeat(Task_StartWirelessTrade); else CreateTask_EnterCableClubSeat(Task_StartWiredTrade); } static void CreateTask_StartWiredTrade(void) { CreateTask(Task_StartWiredTrade, 80); } void StartWiredCableClubTrade(void) { CreateTask_StartWiredTrade(); ScriptContext_Stop(); } void EnterColosseumPlayerSpot(void) { gLinkType = LINKTYPE_BATTLE; if (gWirelessCommType) CreateTask_EnterCableClubSeat(Task_StartWirelessCableClubBattle); else CreateTask_EnterCableClubSeat(Task_StartWiredCableClubBattle); } // Unused static void CreateTask_EnterCableClubSeatNoFollowup(void) { CreateTask(Task_EnterCableClubSeat, 80); ScriptContext_Stop(); } void Script_ShowLinkTrainerCard(void) { ShowTrainerCardInLink(gSpecialVar_0x8006, CB2_ReturnToFieldContinueScriptPlayMapMusic); } bool32 GetSeeingLinkPlayerCardMsg(u8 linkPlayerIndex) { u8 numStars; gSpecialVar_0x8006 = linkPlayerIndex; StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name); numStars = GetTrainerCardStars(linkPlayerIndex); if (numStars == 0) return FALSE; StringCopy(gStringVar2, sTrainerCardColorNames[numStars - 1]); return TRUE; } #define tTimer data[0] void Task_WaitForLinkPlayerConnection(u8 taskId) { struct Task *task = &gTasks[taskId]; if (++task->tTimer > 300) { CloseLink(); SetMainCallback2(CB2_LinkError); DestroyTask(taskId); } if (gReceivedRemoteLinkPlayers) DestroyTask(taskId); } #undef tTimer static void Task_WaitExitToScript(u8 taskId) { if (!gReceivedRemoteLinkPlayers) { ScriptContext_Enable(); DestroyTask(taskId); } } // Unused static void ExitLinkToScript(u8 taskId) { SetCloseLinkCallback(); gTasks[taskId].func = Task_WaitExitToScript; } ================================================ FILE: src/cereader_tool.c ================================================ #include "global.h" #include "gflib.h" #include "util.h" #include "save.h" #include "cereader_tool.h" #define SEC30_SIZE (offsetof(struct EReaderTrainerTowerSet, floors[4])) #define SEC31_SIZE (sizeof(struct EReaderTrainerTowerSet) - SEC30_SIZE) // The trainer tower data exceeds SECTOR_DATA_SIZE. They're allowed to use the full save sector up to the counter field. STATIC_ASSERT(SEC30_SIZE + SEC31_SIZE <= SECTOR_COUNTER_OFFSET * 2, EReaderTrainerTowerSetFreeSpace); static u8 GetTrainerHillUnkVal(void) { return (gSaveBlock1Ptr->trainerTower[0].unk9 + 1) % 256; } static bool32 ValidateTrainerTowerTrainer(struct TrainerTowerFloor * floor) { if (floor->floorIdx < 1 || floor->floorIdx > MAX_TRAINER_TOWER_FLOORS) return FALSE; if (floor->challengeType > CHALLENGE_TYPE_KNOCKOUT) return FALSE; if (CalcByteArraySum((const u8 *)floor, offsetof(typeof(*floor), checksum)) != floor->checksum) return FALSE; return TRUE; } bool32 ValidateTrainerTowerData(struct EReaderTrainerTowerSet * ttdata) { u32 numFloors = ttdata->numFloors; s32 i; if (numFloors < 1 || numFloors > MAX_TRAINER_TOWER_FLOORS) return FALSE; for (i = 0; i < numFloors; i++) { if (!ValidateTrainerTowerTrainer(&ttdata->floors[i])) return FALSE; } if (CalcByteArraySum((const u8 *)ttdata->floors, numFloors * sizeof(ttdata->floors[0])) != ttdata->checksum) return FALSE; return TRUE; } static bool32 CEReaderTool_SaveTrainerTower_r(struct EReaderTrainerTowerSet * ttdata, u8 * buffer) { AGB_ASSERT_EX(ttdata->dummy == 0, ABSPATH("cereader_tool.c"), 198); AGB_ASSERT_EX(ttdata->id == 0, ABSPATH("cereader_tool.c"), 199) memset(buffer, 0, SECTOR_SIZE); memcpy(buffer, ttdata, SEC30_SIZE); buffer[1] = GetTrainerHillUnkVal(); if (TryWriteSpecialSaveSector(SECTOR_ID_TRAINER_TOWER_1, buffer) != TRUE) return FALSE; memset(buffer, 0, SECTOR_SIZE); memcpy(buffer, (u8 *)ttdata + SEC30_SIZE, SEC31_SIZE); if (TryWriteSpecialSaveSector(SECTOR_ID_TRAINER_TOWER_2, buffer) != TRUE) return FALSE; return TRUE; } bool32 CEReaderTool_SaveTrainerTower(struct EReaderTrainerTowerSet * ttdata) { u8 * buffer = AllocZeroed(SECTOR_SIZE); bool32 result = CEReaderTool_SaveTrainerTower_r(ttdata, buffer); Free(buffer); return result; } static bool32 CEReaderTool_LoadTrainerTower_r(struct EReaderTrainerTowerSet * ttdata, void *buffer) { if (TryReadSpecialSaveSector(SECTOR_ID_TRAINER_TOWER_1, buffer) != 1) return FALSE; memcpy(ttdata + 0x000, buffer, SEC30_SIZE); if (TryReadSpecialSaveSector(SECTOR_ID_TRAINER_TOWER_2, buffer) != 1) return FALSE; memcpy((u8 *)ttdata + SEC30_SIZE, buffer, SEC31_SIZE); if (!ValidateTrainerTowerData(ttdata)) return FALSE; return TRUE; } bool32 CEReaderTool_LoadTrainerTower(struct EReaderTrainerTowerSet * ttdata) { void *buffer = AllocZeroed(SECTOR_SIZE); bool32 success = CEReaderTool_LoadTrainerTower_r(ttdata, buffer); Free(buffer); return success; } bool32 ReadTrainerTowerAndValidate(void) { // Stubbed out. Populated in Emerald return FALSE; } ================================================ FILE: src/clear_save_data_screen.c ================================================ #include "global.h" #include "gflib.h" #include "menu.h" #include "save.h" #include "strings.h" #include "task.h" #include "text_window.h" #include "constants/songs.h" struct ClearSaveDataStruct { u8 unk0; u8 unk1; u8 unk2; }; static EWRAM_DATA struct ClearSaveDataStruct * sClearSaveDataState = NULL; static void Task_DrawClearSaveDataScreen(u8 taskId); static void Task_HandleYesNoMenu(u8 taskId); static void Task_CleanUpAndSoftReset(u8 taskId); static void CB2_Sub_SaveClearScreen_Init(void); static void SaveClearScreen_GpuInit(void); static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 } }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 3, .tilemapTop = 5, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x00A }, { .bg = 0, .tilemapLeft = 3, .tilemapTop = 15, .width = 23, .height = 4, .paletteNum = 15, .baseBlock = 0x022 }, DUMMY_WIN_TEMPLATE }; static const u8 sTextColor[] = { TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY }; static void CB2_RunClearSaveDataScreen(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCB_WaitYesNo(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void CB2_SaveClearScreen_Init(void) { sClearSaveDataState = AllocZeroed(sizeof(struct ClearSaveDataStruct)); sClearSaveDataState->unk1 = 0; sClearSaveDataState->unk0 = 0; sClearSaveDataState->unk2 = 0; CB2_Sub_SaveClearScreen_Init(); CreateTask(Task_DrawClearSaveDataScreen, 0); SetMainCallback2(CB2_RunClearSaveDataScreen); } static void Task_DrawClearSaveDataScreen(u8 taskId) { switch (sClearSaveDataState->unk1) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case 1: if (gPaletteFade.active) return; SetVBlankCallback(NULL); break; case 2: SaveClearScreen_GpuInit(); break; case 3: LoadStdWindowGfx(0, 0x001, BG_PLTT_ID(15)); LoadStdWindowGfx(1, 0x001, BG_PLTT_ID(15)); break; case 4: DrawStdFrameWithCustomTileAndPalette(1, TRUE, 0x001, 15); AddTextPrinterParameterized4(1, FONT_NORMAL, 0, 3, 1, 1, sTextColor, 0, gText_ClearAllSaveData); CopyWindowToVram(1, COPYWIN_GFX); break; case 5: CreateYesNoMenu(&sWindowTemplates[0], FONT_NORMAL, 0, 2, 0x001, 15, 1); CopyBgTilemapBufferToVram(0); break; default: BeginNormalPaletteFade(0xFFFF, 0, 16, 0, RGB_WHITEALPHA); SetVBlankCallback(VBlankCB_WaitYesNo); gTasks[taskId].func = Task_HandleYesNoMenu; break; } sClearSaveDataState->unk1++; } static void Task_HandleYesNoMenu(u8 taskId) { // agbcc refuses to keep &sClearSaveDataState in a register // unless explicitly told to do so as such: struct ClearSaveDataStruct ** r5 = &sClearSaveDataState; if ((*r5)->unk0 == 0) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case MENU_B_PRESSED: case 1: PlaySE(SE_SELECT); break; case 0: PlaySE(SE_SELECT); FillWindowPixelBuffer(1, PIXEL_FILL(1)); AddTextPrinterParameterized4(1, FONT_NORMAL, 0, 3, 1, 1, sTextColor, 0, gText_ClearingData); CopyWindowToVram(1, COPYWIN_FULL); ClearSaveData(); break; case MENU_NOTHING_CHOSEN: default: return; } (*r5)->unk0++; } else { Task_CleanUpAndSoftReset(taskId); } } static void Task_CleanUpAndSoftReset(u8 taskId) { switch (sClearSaveDataState->unk2) { case 0: BeginNormalPaletteFade(0xFFFF, 0, 0, 16, RGB_WHITEALPHA); sClearSaveDataState->unk2++; break; case 1: if (!gPaletteFade.active) { DestroyYesNoMenu(); DestroyTask(taskId); FreeAllWindowBuffers(); FREE_AND_SET_NULL(sClearSaveDataState); DoSoftReset(); // noreturn } break; } } static void CB2_Sub_SaveClearScreen_Init(void) { ResetSpriteData(); ResetPaletteFade(); ResetTasks(); } static void SaveClearScreen_GpuInit(void) { DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BLDY, 0); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); } ================================================ FILE: src/coins.c ================================================ #include "global.h" #include "gflib.h" #include "string_util.h" #include "menu.h" #include "text_window.h" #include "strings.h" #include "constants/coins.h" EWRAM_DATA static u8 sCoinsWindowId = 0; u16 GetCoins(void) { return gSaveBlock1Ptr->coins ^ gSaveBlock2Ptr->encryptionKey; } void SetCoins(u16 coinAmount) { gSaveBlock1Ptr->coins = coinAmount ^ gSaveBlock2Ptr->encryptionKey; } bool8 AddCoins(u16 toAdd) { u16 coins = GetCoins(); if (coins >= MAX_COINS) return FALSE; // check overflow, can't have less coins than previously if (coins <= coins + toAdd) { coins += toAdd; if (coins > MAX_COINS) coins = MAX_COINS; } else { coins = MAX_COINS; } SetCoins(coins); return TRUE; } bool8 RemoveCoins(u16 toSub) { u16 coins = GetCoins(); if (coins >= toSub) { SetCoins(coins - toSub); return TRUE; } return FALSE; } static void PrintCoinsString_Parameterized(u8 windowId, u32 coinAmount, u8 x, u8 y, u8 speed) { ConvertIntToDecimalStringN(gStringVar1, coinAmount, STR_CONV_MODE_RIGHT_ALIGN, 4); StringExpandPlaceholders(gStringVar4, gText_Coins); AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, x, y, speed, NULL); } // Unused static void ShowCoinsWindow_Parameterized(u8 windowId, u16 tileStart, u8 palette, u32 coinAmount) { DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, tileStart, palette); AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_Coins_2, 0, 0, 0xFF, 0); PrintCoinsString_Parameterized(windowId, coinAmount, 0x10, 0xC, 0); } void PrintCoinsString(u32 coinAmount) { u8 windowId; int width; ConvertIntToDecimalStringN(gStringVar1, coinAmount, STR_CONV_MODE_RIGHT_ALIGN, 4); StringExpandPlaceholders(gStringVar4, gText_Coins); width = GetStringWidth(FONT_SMALL, gStringVar4, 0); windowId = sCoinsWindowId; AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, 64 - width, 0xC, 0, NULL); } void ShowCoinsWindow(u32 coinAmount, u8 x, u8 y) { struct WindowTemplate template; template = SetWindowTemplateFields(0, x + 1, y + 1, 8, 3, 0xF, 0x20); sCoinsWindowId = AddWindow(&template); FillWindowPixelBuffer(sCoinsWindowId, 0); PutWindowTilemap(sCoinsWindowId); LoadStdWindowGfx(sCoinsWindowId, 0x21D, BG_PLTT_ID(13)); DrawStdFrameWithCustomTileAndPalette(sCoinsWindowId, FALSE, 0x21D, 13); AddTextPrinterParameterized(sCoinsWindowId, FONT_NORMAL, gText_Coins_2, 0, 0, 0xFF, 0); PrintCoinsString(coinAmount); } void HideCoinsWindow(void) { ClearWindowTilemap(sCoinsWindowId); ClearStdWindowAndFrameToTransparent(sCoinsWindowId, TRUE); RemoveWindow(sCoinsWindowId); } ================================================ FILE: src/coord_event_weather.c ================================================ #include "global.h" #include "constants/weather.h" // These were all dummied out because it's always sunny in Viridian void WeatherCoordEvent_SunnyClouds(void) {} void WeatherCoordEvent_Sunny(void) {} void WeatherCoordEvent_Rain(void) {} void WeatherCoordEvent_Snow(void) {} void WeatherCoordEvent_RainThunderstorm(void) {} void WeatherCoordEvent_FogHorizontal(void) {} void WeatherCoordEvent_VolcanicAsh(void) {} void WeatherCoordEvent_Sandstorm(void) {} void WeatherCoordEvent_FogDiagonal(void) {} void WeatherCoordEvent_Underwater(void) {} void WeatherCoordEvent_Shade(void) {} void WeatherCoordEvent_Route119Cycle(void) {} void WeatherCoordEvent_Route123Cycle(void) {} static struct { u8 weatherId; void (*callback)(void); } const sWeatherCoordEventFuncs[] = { {WEATHER_SUNNY_CLOUDS, WeatherCoordEvent_SunnyClouds }, {WEATHER_SUNNY, WeatherCoordEvent_Sunny }, {WEATHER_RAIN, WeatherCoordEvent_Rain }, {WEATHER_SNOW, WeatherCoordEvent_Snow }, {WEATHER_RAIN_THUNDERSTORM, WeatherCoordEvent_RainThunderstorm}, {WEATHER_FOG_HORIZONTAL, WeatherCoordEvent_FogHorizontal }, {WEATHER_VOLCANIC_ASH, WeatherCoordEvent_VolcanicAsh }, {WEATHER_SANDSTORM, WeatherCoordEvent_Sandstorm }, {WEATHER_FOG_DIAGONAL, WeatherCoordEvent_FogDiagonal }, {WEATHER_UNDERWATER, WeatherCoordEvent_Underwater }, {WEATHER_SHADE, WeatherCoordEvent_Shade }, {WEATHER_ROUTE119_CYCLE, WeatherCoordEvent_Route119Cycle }, {WEATHER_ROUTE123_CYCLE, WeatherCoordEvent_Route123Cycle } }; void DoCoordEventWeather(u8 weatherId) { u32 i; for (i = 0; i < NELEMS(sWeatherCoordEventFuncs); i++) { if (sWeatherCoordEventFuncs[i].weatherId == weatherId) { sWeatherCoordEventFuncs[i].callback(); return; } } } ================================================ FILE: src/credits.c ================================================ #include "global.h" #include "gflib.h" #include "credits.h" #include "task.h" #include "overworld.h" #include "event_data.h" #include "new_menu_helpers.h" #include "decompress.h" #include "graphics.h" #include "strings.h" #include "trainer_pokemon_sprites.h" #include "menu.h" #include "field_weather.h" #include "quest_log.h" #include "constants/maps.h" #include "constants/field_weather.h" #include "constants/sound.h" enum CreditsSceneIdx { CREDITSSCENE_INIT_WIN0 = 0, CREDITSSCENE_SETUP_DARKEN_EFFECT, CREDITSSCENE_OPEN_WIN0, CREDITSSCENE_LOAD_PLAYER_SPRITE_AT_INDIGO, CREDITSSCENE_PRINT_TITLE_STAFF, CREDITSSCENE_WAIT_TITLE_STAFF, CREDITSSCENE_EXEC_CMD, CREDITSSCENE_PRINT_ADDPRINTER1, CREDITSSCENE_PRINT_ADDPRINTER2, CREDITSSCENE_PRINT_DELAY, CREDITSSCENE_MAPNEXT_DESTROYWINDOW, CREDITSSCENE_MAPNEXT_LOADMAP, CREDITSSCENE_MAP_LOADMAP_CREATESPRITES, CREDITSSCENE_MON_DESTROY_ASSETS, CREDITSSCENE_MON_SHOW, CREDITSSCENE_THEEND_DESTROY_ASSETS, CREDITSSCENE_THEEND_SHOW, CREDITSSCENE_WAITBUTTON, CREDITSSCENE_TERMINATE, }; enum CreditsScrCmd { CREDITSSCRCMD_PRINT = 0, CREDITSSCRCMD_MAPNEXT, CREDITSSCRCMD_MAP, CREDITSSCRCMD_MON, CREDITSSCRCMD_THEENDGFX, CREDITSSCRCMD_WAITBUTTON }; enum CreditsMon { CREDITSMON_CHARIZARD = 0, CREDITSMON_VENUSAUR, CREDITSMON_BLASTOISE, CREDITSMON_PIKACHU }; enum CreditsClosingText { CREDITSCLOSING_ALLRIGHTSRESERVED = 0, CREDITSCLOSING_THEEND }; enum CreditsString { CREDITS_STRING_DIRECTOR = 0, CREDITS_STRING_ART_DIRECTOR_BATTLE_DIRECTOR, CREDITS_STRING_PROGRAM_LEADER_PLANNING_LEADER_GRAPHIC_DESIGN_LEADER, CREDITS_STRING_PROGRAMMERS, CREDITS_STRING_SYSTEM_PROGRAMMERS, CREDITS_STRING_GRAPHIC_DESIGNERS, CREDITS_STRING_GRAPHIC_DESIGNERS_2, CREDITS_STRING_MUSIC_COMPOSITION, CREDITS_STRING_SOUND_EFFECTS, CREDITS_STRING_GAME_DESIGNERS, CREDITS_STRING_GAME_DESIGNERS_2, CREDITS_STRING_GAME_SCENARIO, CREDITS_STRING_SCRIPT_DESIGNER_MAP_DESIGNER, CREDITS_STRING_PARAMETRIC_DESIGNERS, CREDITS_STRING_POKEDEX_TEXT, CREDITS_STRING_POKEMON_DESIGNERS, CREDITS_STRING_POKEMON_DESIGNERS_2, CREDITS_STRING_POKEMON_DESIGNERS_3, CREDITS_STRING_SUPPORTING_PROGRAMMERS, CREDITS_STRING_NCL_PRODUCT_TESTING, CREDITS_STRING_SPECIAL_THANKS, CREDITS_STRING_SPECIAL_THANKS_2, CREDITS_STRING_SPECIAL_THANKS_3, CREDITS_STRING_BRAILLE_CODE_CHECK, CREDITS_STRING_INFORMATION_SUPERVISORS, CREDITS_STRING_COORDINATORS, CREDITS_STRING_TASK_MANAGERS, CREDITS_STRING_PRODUCERS, CREDITS_STRING_EXECUTIVE_DIRECTOR, CREDITS_STRING_EXECUTIVE_PRODUCER, CREDITS_STRING_EXECUTIVE_PRODUCER_2, CREDITS_STRING_ENGLISH_VERSION_COORDINATORS, CREDITS_STRING_TRANSLATOR_TEXT_EDITOR, CREDITS_STRING_PROGRAMMERS_2, CREDITS_STRING_ENVIRONMENT_TOOL_PROGRAMMERS, CREDITS_STRING_NOA_PRODUCT_TESTING, CREDITS_STRING_BRAILLE_CODE_CHECK_2, CREDITS_STRING_BRAILLE_CODE_CHECK_3, CREDITS_STRING_SPECIAL_THANKS_4, CREDITS_STRING_SPECIAL_THANKS_5, CREDITS_STRING_BRAILLE_CODE_CHECK_4, CREDITS_STRING_GRAPHIC_DESIGNER, CREDITS_STRING_DUMMY }; enum CreditsMap { CREDITS_MAP_ROUTE23 = 0, CREDITS_MAP_VIRIDIAN_CITY, CREDITS_MAP_PEWTER_CITY, CREDITS_MAP_CERULEAN_CITY, CREDITS_MAP_ROUTE25, CREDITS_MAP_VERMILION_CITY, CREDITS_MAP_ROUTE10, CREDITS_MAP_CELADON_CITY, CREDITS_MAP_SAFFRON_CITY, CREDITS_MAP_ROUTE17, CREDITS_MAP_FUCHSIA_CITY, CREDITS_MAP_CINNABAR_ISLAND, CREDITS_MAP_ROUTE21_NORTH }; enum { GFXTAG_CHARACTER = 0x2000, // Player/Rival GFXTAG_GROUND, }; struct CreditsResources { u8 mainseqno; u8 subseqno; u8 taskId; u16 timer; u16 scrcmdidx; bool8 canSpeedThrough; u8 whichMon; u8 windowId; bool8 windowIsActive; u16 creditsMonTimer; u16 unk_0E; u8 filler_10[12]; u8 ovwldseqno; u8 unk_1D; }; struct CreditsScrcmd { u8 cmd; u8 param; u16 duration; }; struct CreditsTextHeader { const u8 * title; const u8 * names; bool8 unused; }; struct CompressedGraphicsHeader { const u8 * tiles; const u8 * map; const u16 * palette; }; struct CreditsTaskData { u8 spriteMoveCmd; u8 characterSpriteId; // Player or rival u16 characterTilesTag; u16 characterPalTag; u8 groundSpriteId; u16 groundTilesTag; u16 groundPalTag; }; static EWRAM_DATA struct CreditsResources * sCreditsMgr = NULL; EWRAM_DATA bool8 gHasHallOfFameRecords = FALSE; static void CB2_Credits(void); static s32 RollCredits(void); static bool32 DoCreditsMonScene(void); static bool32 DoCopyrightOrTheEndGfxScene(void); static void DestroyPlayerOrRivalSprite(void); static void LoadPlayerOrRivalSprite(u8 a0); static const struct BgTemplate sBgTemplates_MonSceneOrTheEnd[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 15, .screenSize = 0, .paletteMode = FALSE, .priority = 0, .baseTile = 0x0 }, { .bg = 1, .charBaseIndex = 2, .mapBaseIndex = 23, .screenSize = 0, .paletteMode = FALSE, .priority = 1, .baseTile = 0x0 }, { .bg = 2, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 1, .paletteMode = TRUE, .priority = 2, .baseTile = 0x0 } }; static const struct WindowTemplate sWindowTemplates_Charizard[] = { { .bg = 0, .tilemapLeft = 11, .tilemapTop = 6, .width = 8, .height = 8, .paletteNum = 10, .baseBlock = 0x0008 }, { .bg = 0, .tilemapLeft = 10, .tilemapTop = 5, .width = 10, .height = 10, .paletteNum = 10, .baseBlock = 0x0048 }, { .bg = 0, .tilemapLeft = 9, .tilemapTop = 3, .width = 12, .height = 13, .paletteNum = 10, .baseBlock = 0x00ac }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sWindowTemplates_Venusaur[] = { { .bg = 0, .tilemapLeft = 11, .tilemapTop = 6, .width = 8, .height = 8, .paletteNum = 10, .baseBlock = 0x0008 }, { .bg = 0, .tilemapLeft = 10, .tilemapTop = 5, .width = 10, .height = 10, .paletteNum = 10, .baseBlock = 0x0048 }, { .bg = 0, .tilemapLeft = 9, .tilemapTop = 5, .width = 12, .height = 10, .paletteNum = 10, .baseBlock = 0x00ac }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sWindowTemplates_Blastoise[] = { { .bg = 0, .tilemapLeft = 11, .tilemapTop = 6, .width = 8, .height = 8, .paletteNum = 10, .baseBlock = 0x0008 }, { .bg = 0, .tilemapLeft = 10, .tilemapTop = 5, .width = 10, .height = 10, .paletteNum = 10, .baseBlock = 0x0048 }, { .bg = 0, .tilemapLeft = 10, .tilemapTop = 4, .width = 10, .height = 12, .paletteNum = 10, .baseBlock = 0x00ac }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sWindowTemplates_Pikachu[] = { { .bg = 0, .tilemapLeft = 11, .tilemapTop = 6, .width = 8, .height = 8, .paletteNum = 10, .baseBlock = 0x0008 }, { .bg = 0, .tilemapLeft = 10, .tilemapTop = 5, .width = 10, .height = 10, .paletteNum = 10, .baseBlock = 0x0048 }, { .bg = 0, .tilemapLeft = 9, .tilemapTop = 4, .width = 12, .height = 12, .paletteNum = 10, .baseBlock = 0x00ac }, DUMMY_WIN_TEMPLATE }; static const u16 sCreditsMonCircle_Pal[] = INCBIN_U16("graphics/credits/white_circle.gbapal"); static const u32 sCreditsMonCircle_Tiles[] = INCBIN_U32("graphics/credits/white_circle.8bpp.lz"); static const u32 sCreditsMonCircle_Tilemap[] = INCBIN_U32("graphics/credits/white_circle.bin.lz"); static const u32 sCharizard1_Tiles[] = INCBIN_U32("graphics/credits/charizard_1.4bpp.lz"); static const u32 sCharizard2_Tiles[] = INCBIN_U32("graphics/credits/charizard_2.4bpp.lz"); static const u32 sVenusaurUnused_Tiles[] = INCBIN_U32("graphics/credits/venusaur_unused.4bpp.lz"); static const u32 sVenusaur1_Tiles[] = INCBIN_U32("graphics/credits/venusaur_1.4bpp.lz"); static const u32 sVenusaur2_Tiles[] = INCBIN_U32("graphics/credits/venusaur_2.4bpp.lz"); static const u32 sBlastoise1_Tiles[] = INCBIN_U32("graphics/credits/blastoise_1.4bpp.lz"); static const u32 sBlastoise2_Tiles[] = INCBIN_U32("graphics/credits/blastoise_2.4bpp.lz"); static const u32 sPikachu1_Tiles[] = INCBIN_U32("graphics/credits/pikachu_1.4bpp.lz"); static const u32 sPikachu2_Tiles[] = INCBIN_U32("graphics/credits/pikachu_2.4bpp.lz"); static const u32 sUnused = 0xF0; static const u16 sTheEnd_Pal[] = INCBIN_U16("graphics/credits/the_end.gbapal"); static const u8 sTheEnd_Tiles[] = INCBIN_U8("graphics/credits/the_end.4bpp.lz"); static const u8 sTheEnd_Tilemap[] = INCBIN_U8("graphics/credits/the_end.bin.lz"); static const struct CompressedGraphicsHeader sCopyrightOrTheEndGfxHeaders[] = { { .tiles = gCreditsCopyright_Tiles, .map = gCreditsCopyright_Tilemap, .palette = gCreditsCopyright_Pal }, { .tiles = sTheEnd_Tiles, .map = sTheEnd_Tilemap, .palette = sTheEnd_Pal } }; #define CREDITS_PRINT(text, duration) { CREDITSSCRCMD_PRINT, CREDITS_STRING_##text, duration } #define CREDITS_MAPNEXT(map, duration) { CREDITSSCRCMD_MAPNEXT, CREDITS_MAP_##map, duration } #define CREDITS_MAP(map, duration) { CREDITSSCRCMD_MAP, CREDITS_MAP_##map, duration } #define CREDITS_MON(mon) { CREDITSSCRCMD_MON, CREDITSMON_##mon } #define CREDITS_THEENDGFX(idx, duration) { CREDITSSCRCMD_THEENDGFX, CREDITSCLOSING_##idx, duration } #define CREDITS_WAITBUTTON(time) { CREDITSSCRCMD_WAITBUTTON, .duration = time } static const struct CreditsScrcmd sCreditsScript[] = { CREDITS_MAPNEXT(ROUTE23, 16), CREDITS_PRINT(DIRECTOR, 300), CREDITS_PRINT(ART_DIRECTOR_BATTLE_DIRECTOR, 300), CREDITS_PRINT(PROGRAM_LEADER_PLANNING_LEADER_GRAPHIC_DESIGN_LEADER, 300), CREDITS_PRINT(DUMMY, 60), CREDITS_MAPNEXT(VIRIDIAN_CITY, 0), CREDITS_PRINT(PROGRAMMERS, 211), CREDITS_PRINT(SYSTEM_PROGRAMMERS, 211), CREDITS_PRINT(GRAPHIC_DESIGNERS, 211), CREDITS_MAPNEXT(PEWTER_CITY, 0), CREDITS_PRINT(GRAPHIC_DESIGNERS_2, 211), CREDITS_PRINT(MUSIC_COMPOSITION, 210), CREDITS_PRINT(SOUND_EFFECTS, 210), CREDITS_MON(CHARIZARD), CREDITS_MAP(CERULEAN_CITY, 16), CREDITS_PRINT(GAME_DESIGNERS, 211), CREDITS_PRINT(GAME_DESIGNERS_2, 210), CREDITS_PRINT(GAME_SCENARIO, 210), CREDITS_MAPNEXT(ROUTE25, 16), CREDITS_PRINT(SCRIPT_DESIGNER_MAP_DESIGNER, 211), CREDITS_PRINT(PARAMETRIC_DESIGNERS, 210), CREDITS_PRINT(POKEDEX_TEXT, 210), CREDITS_MAPNEXT(VERMILION_CITY, 16), CREDITS_PRINT(POKEMON_DESIGNERS, 211), CREDITS_PRINT(POKEMON_DESIGNERS_2, 210), CREDITS_PRINT(POKEMON_DESIGNERS_3, 210), CREDITS_MON(VENUSAUR), CREDITS_MAP(ROUTE10, 16), CREDITS_PRINT(SUPPORTING_PROGRAMMERS, 211), CREDITS_PRINT(NCL_PRODUCT_TESTING, 210), CREDITS_PRINT(SPECIAL_THANKS, 210), CREDITS_MAPNEXT(CELADON_CITY, 16), CREDITS_PRINT(SPECIAL_THANKS_2, 221), CREDITS_PRINT(SPECIAL_THANKS_3, 221), CREDITS_PRINT(BRAILLE_CODE_CHECK, 221), CREDITS_PRINT(INFORMATION_SUPERVISORS, 221), CREDITS_PRINT(DUMMY, 51), CREDITS_MAPNEXT(SAFFRON_CITY, 16), CREDITS_PRINT(COORDINATORS, 211), CREDITS_PRINT(TASK_MANAGERS, 210), CREDITS_PRINT(PRODUCERS, 210), CREDITS_MON(BLASTOISE), CREDITS_MAP(ROUTE17, 16), CREDITS_PRINT(EXECUTIVE_DIRECTOR, 331), CREDITS_PRINT(EXECUTIVE_PRODUCER, 331), CREDITS_PRINT(EXECUTIVE_PRODUCER_2, 331), CREDITS_MAPNEXT(FUCHSIA_CITY, 16), CREDITS_PRINT(ENGLISH_VERSION_COORDINATORS, 221), CREDITS_PRINT(TRANSLATOR_TEXT_EDITOR, 221), CREDITS_PRINT(PROGRAMMERS_2, 221), CREDITS_PRINT(ENVIRONMENT_TOOL_PROGRAMMERS, 221), CREDITS_PRINT(DUMMY, 52), CREDITS_MAPNEXT(CINNABAR_ISLAND, 16), CREDITS_PRINT(GRAPHIC_DESIGNER, 210), CREDITS_PRINT(NOA_PRODUCT_TESTING, 210), CREDITS_PRINT(BRAILLE_CODE_CHECK_2, 211), CREDITS_MON(PIKACHU), CREDITS_MAP(ROUTE21_NORTH, 16), CREDITS_PRINT(BRAILLE_CODE_CHECK_3, 221), CREDITS_PRINT(BRAILLE_CODE_CHECK_4, 221), CREDITS_PRINT(SPECIAL_THANKS_4, 221), CREDITS_PRINT(SPECIAL_THANKS_5, 221), CREDITS_PRINT(DUMMY, 52), CREDITS_THEENDGFX(ALLRIGHTSRESERVED, 224), CREDITS_THEENDGFX(THEEND, 240), CREDITS_WAITBUTTON(600) }; static const ALIGNED(4) u8 sTextColor_Unused[3] = {0, 1, 2}; static const ALIGNED(4) u8 sTextColor_Header[3] = {0, 5, 2}; static const ALIGNED(4) u8 sTextColor_Regular[3] = {0, 1, 2}; static const struct WindowTemplate sCreditsWindowTemplate = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 4, .width = 30, .height = 12, .paletteNum = 15, .baseBlock = 0x008 }; static const u16 sPlayerMale_Pal[] = INCBIN_U16("graphics/credits/player_male.gbapal"); static const u32 sPlayerMale_Tiles[] = INCBIN_U32("graphics/credits/player_male.4bpp.lz"); static const u16 sPlayerFemale_Pal[] = INCBIN_U16("graphics/credits/player_female.gbapal"); static const u32 sPlayerFemale_Tiles[] = INCBIN_U32("graphics/credits/player_female.4bpp.lz"); static const u16 sRival_Pal[] = INCBIN_U16("graphics/credits/rival.gbapal"); static const u32 sRival_Tiles[] = INCBIN_U32("graphics/credits/rival.4bpp.lz"); static const u16 sGround_Grass_Pal[] = INCBIN_U16("graphics/credits/ground_grass.gbapal"); static const u32 sGround_Grass_Tiles[] = INCBIN_U32("graphics/credits/ground_grass.4bpp.lz"); static const u16 sGround_Dirt_Pal[] = INCBIN_U16("graphics/credits/ground_dirt.gbapal"); static const u32 sGround_Dirt_Tiles[] = INCBIN_U32("graphics/credits/ground_dirt.4bpp.lz"); static const u16 sGround_City_Pal[] = INCBIN_U16("graphics/credits/ground_city.gbapal"); static const u32 sGround_City_Tiles[] = INCBIN_U32("graphics/credits/ground_city.4bpp.lz"); static const u16 sPlayerRivalSpriteParams[][3] = { { 0, 3, 1 }, { 0, 2, 0 }, { 0, 3, 0 }, { 1, 1, 2 }, { 0, 0, 3 } }; static const struct OamData sOamData_PlayerOrRival = { .affineMode = ST_OAM_AFFINE_OFF, .mosaic = FALSE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .size = ST_OAM_SIZE_3, .tileNum = 0x000, .priority = 0, .paletteNum = 15 }; const union AnimCmd sAnimCmds_PlayerOrRival[] = { ANIMCMD_FRAME(0x000, 8), ANIMCMD_FRAME(0x040, 8), ANIMCMD_FRAME(0x080, 8), ANIMCMD_FRAME(0x0C0, 8), ANIMCMD_FRAME(0x100, 8), ANIMCMD_FRAME(0x140, 8), ANIMCMD_JUMP(0) }; const union AnimCmd *const sAnimCmdTable_PlayerOrRival[] = { sAnimCmds_PlayerOrRival }; static const struct SpriteTemplate sPlayerOrRivalSpriteTemplate = { .oam = &sOamData_PlayerOrRival, .anims = sAnimCmdTable_PlayerOrRival, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_Ground = { .affineMode = ST_OAM_AFFINE_OFF, .mosaic = FALSE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = ST_OAM_H_RECTANGLE, .size = ST_OAM_SIZE_3, .tileNum = 0x000, .priority = 0, .paletteNum = 14 }; const union AnimCmd sAnimCmds_GroundRunning[] = { ANIMCMD_FRAME(0x00, 8), ANIMCMD_FRAME(0x20, 8), ANIMCMD_FRAME(0x40, 8), ANIMCMD_FRAME(0x60, 8), ANIMCMD_FRAME(0x80, 8), ANIMCMD_FRAME(0xA0, 8), ANIMCMD_FRAME(0xC0, 8), ANIMCMD_FRAME(0xE0, 8), ANIMCMD_JUMP(0) }; const union AnimCmd sAnimCmds_GroundStatic[] = { ANIMCMD_FRAME(0x00, 8), ANIMCMD_JUMP(0) }; const union AnimCmd *const sAnimCmdTable_GroundRunning[] = { sAnimCmds_GroundRunning }; const union AnimCmd *const sAnimCmdTable_GroundStatic[] = { sAnimCmds_GroundStatic }; static const struct SpriteTemplate sGroundSpriteTemplate_Running = { .oam = &sOamData_Ground, .anims = sAnimCmdTable_GroundRunning, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sGroundSpriteTemplate_Static = { .oam = &sOamData_Ground, .anims = sAnimCmdTable_GroundStatic, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct CreditsOverworldCmd sOverworldCmd_Route23[] = { CREDITSOVWLDLOADMAP(ROUTE23, 11, 107, 1), CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_ViridianCity[] = { CREDITSOVWLDLOADMAP(VIRIDIAN_CITY, 30, 34, 1), CREDITSOVWLDSCROLL(0, -1, 0x0500), // Scroll up CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_PewterCity[] = { CREDITSOVWLDLOADMAP(PEWTER_CITY, 20, 26, 1), CREDITSOVWLDSCROLL(0, -1, 0x0500), // Scroll up CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_CeruleanCity[] = { CREDITSOVWLDLOADMAP(CERULEAN_CITY, 8, 6, 1), CREDITSOVWLDSCROLL(1, 1, 0x0500), // Scroll right and down CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_Route25[] = { CREDITSOVWLDLOADMAP(ROUTE25, 25, 6, 1), CREDITSOVWLDSCROLL(1, 0, 0x0500), // Scroll right CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_VermilionCity[] = { CREDITSOVWLDLOADMAP(VERMILION_CITY, 9, 7, 1), CREDITSOVWLDSCROLL(1, 1, 0x0500), // Scroll right and down CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_Route10[] = { CREDITSOVWLDLOADMAP(ROUTE10, 11, 68, 1), CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_CeladonCity[] = { CREDITSOVWLDLOADMAP(CELADON_CITY, 48, 16, 1), CREDITSOVWLDSCROLL(-1, 0, 0x0500), // Scroll left CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_SaffronCity[] = { CREDITSOVWLDLOADMAP(SAFFRON_CITY, 39, 5, 1), CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_Route17[] = { CREDITSOVWLDLOADMAP(ROUTE17, 7, 43, 1), CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_FuchsiaCity[] = { CREDITSOVWLDLOADMAP(FUCHSIA_CITY, 28, 5, 1), CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_CinnabarIsland[] = { CREDITSOVWLDLOADMAP(CINNABAR_ISLAND, 13, 17, 1), CREDITSOVWLDSCROLL(0, -1, 0x0500), // Scroll up CREDITSOVWLDEND }; static const struct CreditsOverworldCmd sOverworldCmd_Route21[] = { CREDITSOVWLDLOADMAP(ROUTE21_NORTH, 8, 20, 1), CREDITSOVWLDSCROLL(0, -1, 0x0500), // Scroll up CREDITSOVWLDEND, }; static const struct CreditsOverworldCmd *const sOverworldMapScenes[] = { sOverworldCmd_Route23, sOverworldCmd_ViridianCity, sOverworldCmd_PewterCity, sOverworldCmd_CeruleanCity, sOverworldCmd_Route25, sOverworldCmd_VermilionCity, sOverworldCmd_Route10, sOverworldCmd_CeladonCity, sOverworldCmd_SaffronCity, sOverworldCmd_Route17, sOverworldCmd_FuchsiaCity, sOverworldCmd_CinnabarIsland, sOverworldCmd_Route21 }; static const struct CreditsTextHeader sCreditsTexts[] = { { gCreditsString_Director, gCreditsString_Junichi_Masuda, FALSE }, { gCreditsString_Art_Director_Battle_Director, gCreditsString_Ken_Sugimori_Shigeki_Morimoto, FALSE }, { gCreditsString_Program_Leader_Planning_Leader_Graphic_Design_Leader, gCreditsString_Tetsuya_Watanabe_Koji_Nishino_Takao_Unno, FALSE }, { gCreditsString_Programmers, gCreditsString_Hiroyuki_Nakamura_Masao_Taya_Satoshi_Nohara_Miyuki_Iwasawa_Daisuke_Goto, FALSE }, { gCreditsString_System_Programmers, gCreditsString_Tetsuya_Watanabe_Akito_Mori_Hisashi_Sogabe_Sousuke_Tamada, TRUE }, { gCreditsString_Graphic_Designers, gCreditsString_Takao_Unno_Asuka_Iwashita_Kanako_Eo_Hiroki_Fuchino, TRUE }, { gCreditsString_Graphic_Designers_2, gCreditsString_Ken_Sugimori_Hironobu_Yoshida, TRUE }, { gCreditsString_Music_Composition, gCreditsString_Go_Ichinose_Junichi_Masuda, TRUE }, { gCreditsString_Sound_Effects, gCreditsString_Go_Ichinose, FALSE }, { gCreditsString_Game_Designers, gCreditsString_Junichi_Masuda_Koji_Nishino_Tetsuji_Ohta, FALSE }, { gCreditsString_Game_Designers_2, gCreditsString_Hitomi_Sato_Shigeru_Ohmori_Tadashi_Takahashi, FALSE }, { gCreditsString_Game_Scenario, gCreditsString_Hitomi_Sato_Satoshi_Tajiri, TRUE }, { gCreditsString_Script_Designer_Map_Designer, gCreditsString_Satoshi_Nohara_Shigeru_Ohmori, FALSE }, { gCreditsString_Parametric_Designers, gCreditsString_Koji_Nishino_Tetsuji_Ohta_Shigeki_Morimoto, FALSE }, { gCreditsString_POKeDEX_Text, gCreditsString_Kenji_Matsushima, FALSE }, { gCreditsString_POKeMON_Designers, gCreditsString_Ken_Sugimori_Motofumi_Fujiwara_Shigeki_Morimoto_Hironobu_Yoshida, TRUE }, { gCreditsString_POKeMON_Designers_2, gCreditsString_Satoshi_Ohta_Asuka_Iwashita_Takao_Unno_Kanako_Eo_Aimi_Tomita, FALSE }, { gCreditsString_POKeMON_Designers_3, gCreditsString_Atsuko_Nishida_Muneo_Saito_Rena_Yoshikawa_Jun_Okutani, TRUE }, { gCreditsString_Supporting_Programmers, gCreditsString_Teruyuki_Yoshioka_Takao_Nakano_Satoshi_Mitsuhara_Daisuke_Hoshino, FALSE }, { gCreditsString_NCL_Product_Testing, gCreditsString_NCL_Super_Mario_Club, FALSE }, { gCreditsString_Special_Thanks, gCreditsString_Hiro_Nakamura_Hiroyuki_Uesugi_Teruki_Murakawa_Kazuya_Suyama, FALSE }, { gCreditsString_Special_Thanks_2, gCreditsString_Kenji_Tominaga_Kenjiro_Ito_Tomotaka_Komura_Michiko_Takizawa, FALSE }, { gCreditsString_Special_Thanks_3, gCreditsString_Makiko_Takada_Mikiko_Ohashi_Shusaku_Egami_Takanao_Kondo_Rui_Kawaguchi, FALSE }, { gCreditsString_Braille_Code_Check, gCreditsString_Japan_Braille_Library, FALSE }, { gCreditsString_Information_Supervisors, gCreditsString_Hiroki_Enomoto_Kazuyuki_Terada_Yuri_Sakurai_Yumi_Funasaka_Naoko_Yanase, FALSE }, { gCreditsString_Coordinators, gCreditsString_Azusa_Tajima_Akira_Kinashi_Kazuki_Yoshihara_Retsuji_Nomoto, FALSE }, { gCreditsString_Task_Managers, gCreditsString_Hitoshi_Yamagami_Gakuji_Nomoto, TRUE }, { gCreditsString_Producers, gCreditsString_Hiroyuki_Jinnai_Takehiro_Izushi_Hiroaki_Tsuru, FALSE }, { gCreditsString_Executive_Director, gCreditsString_Satoshi_Tajiri, FALSE }, { gCreditsString_Executive_Producer, gCreditsString_Satoru_Iwata, FALSE }, { gCreditsString_Executive_Producer_2, gCreditsString_Tsunekaz_Ishihara, FALSE }, { gCreditsString_English_Version_Coordinators, gCreditsString_Hiro_Nakamura_Seth_McMahill, FALSE }, { gCreditsString_Translator_Text_Editor, gCreditsString_Nob_Ogasawara_Teresa_Lillygren, FALSE }, { gCreditsString_Programmers_2, gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Yuichiro_Ito_Akira_Kinashi, FALSE }, { gCreditsString_Environment_Tool_Programmers, gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Kimiko_Nakamichi, TRUE }, { gCreditsString_NOA_Product_Testing, gCreditsString_Thomas_Hertzog_Kathy_Huguenard_Mika_Kurosawa, TRUE }, { gCreditsString_Braille_Code_Check_2, gCreditsString_National_Federation_of_the_Blind_Patricia_A_Maurer_Japan_Braille_Library_European_Blind_Union, TRUE }, { gCreditsString_Braille_Code_Check_3, gCreditsString_National_Information_Library_Service_Margaret_Campion, TRUE }, { gCreditsString_Special_Thanks_4, gCreditsString_Takehiro_Izushi_Motoyasu_Tojima_Hitoshi_Yamagami_Hiroyuki_Uesugi, FALSE }, { gCreditsString_Special_Thanks_5, gCreditsString_Nicola_Pratt_Barlow_Shellie_Dow_Anthony_Howitt_Naoko_Saeki_Kyoko_Onishi, FALSE }, { gCreditsString_Braille_Code_Check_4, gCreditsString_The_Royal_New_Zealand_Foundation_of_the_Blind_Greg_Moran, FALSE }, { gCreditsString_Graphic_Designer, gCreditsString_Akira_Kinashi, FALSE }, { gString_Dummy, gString_Dummy, FALSE } }; void DoCredits(void) { sCreditsMgr = AllocZeroed(sizeof(*sCreditsMgr)); ResetTasks(); sCreditsMgr->taskId = TASK_NONE; sCreditsMgr->unk_1D = 0; ResetSpriteData(); SetMainCallback2(CB2_Credits); } static void CB2_Credits(void) { switch (RollCredits()) { case 0: RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); break; case 1: if (sCreditsMgr->unk_1D & 1) { Overworld_CreditsMainCB(); } else { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } sCreditsMgr->unk_1D++; break; case 2: FlagClear(FLAG_DONT_SHOW_MAP_NAME_POPUP); gDisableMapMusicChangeOnMapLoad = MUSIC_DISABLE_OFF; Free(sCreditsMgr); SoftReset(RESET_ALL); // noreturn } } static void SwitchWin1OffWin0On(void) { ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WININ, 0x1F3F); SetGpuReg(REG_OFFSET_WINOUT, 0x000E); } static void InitBgDarkenEffect(void) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4)); SetGpuReg(REG_OFFSET_BLDY, 10); } static void CreateCreditsWindow(void) { sCreditsMgr->windowId = AddWindow(&sCreditsWindowTemplate); FillWindowPixelBuffer(sCreditsMgr->windowId, PIXEL_FILL(0)); PutWindowTilemap(sCreditsMgr->windowId); CopyWindowToVram(sCreditsMgr->windowId, COPYWIN_FULL); sCreditsMgr->windowIsActive = TRUE; } static void DestroyCreditsWindow(void) { if (sCreditsMgr->windowIsActive) { RemoveWindow(sCreditsMgr->windowId); CleanupOverworldWindowsAndTilemaps(); sCreditsMgr->windowIsActive = FALSE; } } static bool32 DoOverworldMapScrollScene(u8 whichMon) { switch (sCreditsMgr->subseqno) { case 0: FlagSet(FLAG_DONT_SHOW_MAP_NAME_POPUP); gDisableMapMusicChangeOnMapLoad = MUSIC_DISABLE_KEEP; sCreditsMgr->ovwldseqno = 0; sCreditsMgr->subseqno++; // fallthrough case 1: if (!Overworld_DoScrollSceneForCredits(&sCreditsMgr->ovwldseqno, sOverworldMapScenes[sCreditsMgr->whichMon], QL_TINT_NONE)) return FALSE; CreateCreditsWindow(); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(36, DISPLAY_HEIGHT - 36)); SwitchWin1OffWin0On(); InitBgDarkenEffect(); Menu_LoadStdPalAt(BG_PLTT_ID(15)); gPlttBufferUnfaded[BG_PLTT_ID(15) + 15] = RGB_BLACK; gPlttBufferFaded[BG_PLTT_ID(15) + 15] = RGB_BLACK; return TRUE; default: return FALSE; } } static s32 RollCredits(void) { u16 win0v[8]; switch (sCreditsMgr->mainseqno) { case CREDITSSCENE_INIT_WIN0: SwitchWin1OffWin0On(); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(DISPLAY_HEIGHT / 2 - 1, DISPLAY_HEIGHT / 2 + 1)); sCreditsMgr->mainseqno = CREDITSSCENE_SETUP_DARKEN_EFFECT; return 0; case CREDITSSCENE_SETUP_DARKEN_EFFECT: InitBgDarkenEffect(); CreateCreditsWindow(); Menu_LoadStdPalAt(BG_PLTT_ID(15)); gPlttBufferUnfaded[BG_PLTT_ID(15) + 15] = RGB_BLACK; gPlttBufferFaded[BG_PLTT_ID(15) + 15] = RGB_BLACK; sCreditsMgr->mainseqno = CREDITSSCENE_OPEN_WIN0; return 0; case CREDITSSCENE_OPEN_WIN0: win0v[0] = GetGpuReg(REG_OFFSET_WIN0V) >> 8; win0v[1] = GetGpuReg(REG_OFFSET_WIN0V) & 0xFF; if (win0v[0] == 0x24) { sCreditsMgr->timer = 0; sCreditsMgr->mainseqno = CREDITSSCENE_LOAD_PLAYER_SPRITE_AT_INDIGO; } else { win0v[0]--; win0v[1]++; SetGpuReg(REG_OFFSET_WIN0V, (win0v[0] << 8) + win0v[1]); } return 0; case CREDITSSCENE_LOAD_PLAYER_SPRITE_AT_INDIGO: if (sCreditsMgr->timer) { sCreditsMgr->timer--; return 0; } LoadPlayerOrRivalSprite(0); sCreditsMgr->timer = 100; sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_TITLE_STAFF; return 0; case CREDITSSCENE_PRINT_TITLE_STAFF: if (sCreditsMgr->timer) { sCreditsMgr->timer--; return 0; } sCreditsMgr->timer = 360; if(gSaveBlock1Ptr->keyFlags.version == 0) //FR AddTextPrinterParameterized4(sCreditsMgr->windowId, FONT_NORMAL_COPY_1, 0x08, 0x29, 1, 2, sTextColor_Header, 0, gString_PokemonFireRed_Staff); else //LG AddTextPrinterParameterized4(sCreditsMgr->windowId, FONT_NORMAL_COPY_1, 0x08, 0x29, 1, 2, sTextColor_Header, 0, gString_PokemonLeafGreen_Staff); sCreditsMgr->mainseqno = CREDITSSCENE_WAIT_TITLE_STAFF; return 0; case CREDITSSCENE_WAIT_TITLE_STAFF: if (sCreditsMgr->timer) { sCreditsMgr->timer--; return 0; } DestroyCreditsWindow(); sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD; sCreditsMgr->timer = 0; sCreditsMgr->scrcmdidx = 0; return 0; case CREDITSSCENE_EXEC_CMD: if (sCreditsMgr->timer != 0) { sCreditsMgr->timer--; return sCreditsMgr->canSpeedThrough; } switch (sCreditsScript[sCreditsMgr->scrcmdidx].cmd) { case CREDITSSCRCMD_PRINT: BeginNormalPaletteFade(0x00008000, 0, 0, 16, RGB_BLACK); sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_ADDPRINTER1; FillWindowPixelBuffer(sCreditsMgr->windowId, PIXEL_FILL(0)); return sCreditsMgr->canSpeedThrough; case CREDITSSCRCMD_MAPNEXT: sCreditsMgr->mainseqno = CREDITSSCENE_MAPNEXT_DESTROYWINDOW; sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param; FadeSelectedPals(1, 0, 0x3FFFFFFF); break; case CREDITSSCRCMD_MAP: sCreditsMgr->mainseqno = CREDITSSCENE_MAP_LOADMAP_CREATESPRITES; sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param; break; case CREDITSSCRCMD_MON: sCreditsMgr->mainseqno = CREDITSSCENE_MON_DESTROY_ASSETS; sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param; FadeScreen(FADE_TO_BLACK, 0); break; case CREDITSSCRCMD_THEENDGFX: sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_DESTROY_ASSETS; sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param; BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 16, RGB_BLACK); break; case CREDITSSCRCMD_WAITBUTTON: sCreditsMgr->mainseqno = CREDITSSCENE_WAITBUTTON; break; } sCreditsMgr->timer = sCreditsScript[sCreditsMgr->scrcmdidx].duration; sCreditsMgr->scrcmdidx++; return 0; case CREDITSSCENE_PRINT_ADDPRINTER1: if (gPaletteFade.active) return sCreditsMgr->canSpeedThrough; win0v[0] = sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unused; AddTextPrinterParameterized4(sCreditsMgr->windowId, FONT_NORMAL_COPY_1, 2, 6, 0, 0, sTextColor_Header, -1, sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].title); sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_ADDPRINTER2; return sCreditsMgr->canSpeedThrough; case CREDITSSCENE_PRINT_ADDPRINTER2: win0v[0] = sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unused; AddTextPrinterParameterized4(sCreditsMgr->windowId, FONT_NORMAL, 8, 6, 0, 0, sTextColor_Regular, -1, sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].names); sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_DELAY; return sCreditsMgr->canSpeedThrough; case CREDITSSCENE_PRINT_DELAY: CopyWindowToVram(sCreditsMgr->windowId, COPYWIN_GFX); sCreditsMgr->timer = sCreditsScript[sCreditsMgr->scrcmdidx].duration; sCreditsMgr->scrcmdidx++; BeginNormalPaletteFade(0x00008000, 0, 16, 0, RGB_BLACK); sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD; return sCreditsMgr->canSpeedThrough; case CREDITSSCENE_MAPNEXT_DESTROYWINDOW: if (!gPaletteFade.active) { DestroyCreditsWindow(); sCreditsMgr->subseqno = 0; sCreditsMgr->mainseqno = CREDITSSCENE_MAPNEXT_LOADMAP; } return 0; case CREDITSSCENE_MAPNEXT_LOADMAP: if (DoOverworldMapScrollScene(sCreditsMgr->whichMon)) { sCreditsMgr->canSpeedThrough = TRUE; sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD; } return 0; case CREDITSSCENE_MAP_LOADMAP_CREATESPRITES: if (!gPaletteFade.active) { DestroyCreditsWindow(); sCreditsMgr->subseqno = 0; while (!DoOverworldMapScrollScene(sCreditsMgr->whichMon)){}; switch (sCreditsMgr->whichMon) { default: case 3: win0v[0] = 1; break; case 6: win0v[0] = 2; break; case 9: win0v[0] = 3; break; case 12: win0v[0] = 4; break; } LoadPlayerOrRivalSprite(win0v[0]); sCreditsMgr->canSpeedThrough = TRUE; sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD; } return 0; case CREDITSSCENE_MON_DESTROY_ASSETS: if (!gPaletteFade.active) { DestroyPlayerOrRivalSprite(); DestroyCreditsWindow(); sCreditsMgr->subseqno = 0; sCreditsMgr->canSpeedThrough = FALSE; sCreditsMgr->mainseqno = CREDITSSCENE_MON_SHOW; } return 0; case CREDITSSCENE_MON_SHOW: if (DoCreditsMonScene()) { sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD; } return 0; case CREDITSSCENE_THEEND_DESTROY_ASSETS: if (!gPaletteFade.active) { DestroyCreditsWindow(); sCreditsMgr->subseqno = 0; sCreditsMgr->canSpeedThrough = FALSE; sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_SHOW; } return 0; case CREDITSSCENE_THEEND_SHOW: if (DoCopyrightOrTheEndGfxScene()) { sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD; } return 0; case CREDITSSCENE_WAITBUTTON: if (JOY_NEW(A_BUTTON)) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE); sCreditsMgr->mainseqno = CREDITSSCENE_TERMINATE; return 0; } if (sCreditsMgr->timer) { sCreditsMgr->timer--; } else { sCreditsMgr->mainseqno = CREDITSSCENE_TERMINATE; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE); } return 0; case CREDITSSCENE_TERMINATE: if (!gPaletteFade.active) DestroyCreditsWindow(); break; } return 2; } static void VBlankCB(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void LoadCreditsMonPic(u8 whichMon) { switch (whichMon) { case CREDITSMON_CHARIZARD: InitWindows(sWindowTemplates_Charizard); FillWindowPixelBuffer(0, PIXEL_FILL(0)); LoadMonPicInWindow(SPECIES_CHARIZARD, SHINY_ODDS, 0, TRUE, 10, 0); CopyToWindowPixelBuffer(1, (const void *)sCharizard1_Tiles, 0, 0); CopyToWindowPixelBuffer(2, (const void *)sCharizard2_Tiles, 0, 0); break; case CREDITSMON_VENUSAUR: InitWindows(sWindowTemplates_Venusaur); FillWindowPixelBuffer(0, PIXEL_FILL(0)); LoadMonPicInWindow(SPECIES_VENUSAUR, SHINY_ODDS, 0, TRUE, 10, 0); CopyToWindowPixelBuffer(1, (const void *)sVenusaur1_Tiles, 0, 0); CopyToWindowPixelBuffer(2, (const void *)sVenusaur2_Tiles, 0, 0); break; case CREDITSMON_BLASTOISE: InitWindows(sWindowTemplates_Blastoise); FillWindowPixelBuffer(0, PIXEL_FILL(0)); LoadMonPicInWindow(SPECIES_BLASTOISE, SHINY_ODDS, 0, TRUE, 10, 0); CopyToWindowPixelBuffer(1, (const void *)sBlastoise1_Tiles, 0, 0); CopyToWindowPixelBuffer(2, (const void *)sBlastoise2_Tiles, 0, 0); break; case CREDITSMON_PIKACHU: InitWindows(sWindowTemplates_Pikachu); FillWindowPixelBuffer(0, PIXEL_FILL(0)); LoadMonPicInWindow(SPECIES_PIKACHU, SHINY_ODDS, 0, TRUE, 10, 0); CopyToWindowPixelBuffer(1, (const void *)sPikachu1_Tiles, 0, 0); CopyToWindowPixelBuffer(2, (const void *)sPikachu2_Tiles, 0, 0); break; } CopyWindowToVram(0, COPYWIN_GFX); CopyWindowToVram(1, COPYWIN_GFX); CopyWindowToVram(2, COPYWIN_GFX); } static u16 GetCreditsMonSpecies(u8 whichMon) { switch (whichMon) { case CREDITSMON_CHARIZARD: return SPECIES_CHARIZARD; case CREDITSMON_VENUSAUR: return SPECIES_VENUSAUR; case CREDITSMON_BLASTOISE: return SPECIES_BLASTOISE; case CREDITSMON_PIKACHU: return SPECIES_PIKACHU; default: return SPECIES_NONE; } } static bool32 DoCreditsMonScene(void) { switch (sCreditsMgr->subseqno) { case 0: SetVBlankCallback(NULL); SetHBlankCallback(NULL); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); ResetPaletteFade(); ResetSpriteData(); ResetTasks(); ResetBgsAndClearDma3BusyFlags(1); InitBgsFromTemplates(1, sBgTemplates_MonSceneOrTheEnd, NELEMS(sBgTemplates_MonSceneOrTheEnd)); SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); ChangeBgX(0, 0, BG_COORD_SET); ChangeBgY(0, 0, BG_COORD_SET); ChangeBgX(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); sCreditsMgr->creditsMonTimer = 0; sCreditsMgr->unk_0E = 0; SetBgAffine(2, 0x8000, 0x8000, 0x78, 0x50, sCreditsMgr->creditsMonTimer, sCreditsMgr->creditsMonTimer, 0); DecompressAndLoadBgGfxUsingHeap(1, gCreditsMonPokeball_Tiles, 0x2000, 0, 0); DecompressAndLoadBgGfxUsingHeap(2, sCreditsMonCircle_Tiles, 0x2000, 0, 0); DecompressAndLoadBgGfxUsingHeap(1, gCreditsMonPokeball_Tilemap, 0x500, 0, 1); DecompressAndLoadBgGfxUsingHeap(2, sCreditsMonCircle_Tilemap, 0x400, 0, 1); LoadPalette(gCreditsMonPokeball_Pals[sCreditsMgr->whichMon], BG_PLTT_ID(0), PLTT_SIZE_4BPP); LoadPalette(sCreditsMonCircle_Pal, BG_PLTT_ID(15), sizeof(sCreditsMonCircle_Pal)); LoadCreditsMonPic(sCreditsMgr->whichMon); SetVBlankCallback(VBlankCB); EnableInterrupts(INTR_FLAG_VBLANK); sCreditsMgr->subseqno++; break; case 1: FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 17); PutWindowTilemap(0); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sCreditsMgr->subseqno++; break; case 2: ShowBg(2); ShowBg(0); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sCreditsMgr->creditsMonTimer = 40; sCreditsMgr->subseqno++; break; case 3: if (sCreditsMgr->creditsMonTimer != 0) sCreditsMgr->creditsMonTimer--; else sCreditsMgr->subseqno++; break; case 4: if (!gPaletteFade.active) { sCreditsMgr->creditsMonTimer = 8; sCreditsMgr->unk_0E = 1; sCreditsMgr->subseqno++; } break; case 5: if (sCreditsMgr->creditsMonTimer != 0) sCreditsMgr->creditsMonTimer--; else { if (sCreditsMgr->unk_0E < 3) { PutWindowTilemap(sCreditsMgr->unk_0E); CopyBgTilemapBufferToVram(0); sCreditsMgr->creditsMonTimer = 4; sCreditsMgr->unk_0E++; } else sCreditsMgr->subseqno++; } break; case 6: if (sCreditsMgr->creditsMonTimer < 256) { sCreditsMgr->creditsMonTimer += 16; SetBgAffine(2, 0x8000, 0x8000, 0x78, 0x50, sCreditsMgr->creditsMonTimer, sCreditsMgr->creditsMonTimer, 0); } else { SetBgAffine(2, 0x8000, 0x8000, 0x78, 0x50, 0x100, 0x100, 0); sCreditsMgr->creditsMonTimer = 32; sCreditsMgr->subseqno++; } break; case 7: if (sCreditsMgr->creditsMonTimer != 0) sCreditsMgr->creditsMonTimer--; else { HideBg(2); ShowBg(1); PlayCry_NormalNoDucking(GetCreditsMonSpecies(sCreditsMgr->whichMon), 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL); sCreditsMgr->creditsMonTimer = 128; sCreditsMgr->subseqno++; } break; case 8: if (sCreditsMgr->creditsMonTimer != 0) sCreditsMgr->creditsMonTimer--; else { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sCreditsMgr->subseqno++; } break; case 9: if (!gPaletteFade.active) { FreeAllWindowBuffers(); Free(GetBgTilemapBuffer(0)); sCreditsMgr->subseqno = 0; return TRUE; } break; } return FALSE; } static bool32 DoCopyrightOrTheEndGfxScene(void) { switch (sCreditsMgr->subseqno) { case 0: SetVBlankCallback(NULL); SetHBlankCallback(NULL); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); ResetPaletteFade(); ResetSpriteData(); ResetTasks(); ResetBgsAndClearDma3BusyFlags(1); InitBgsFromTemplates(0, sBgTemplates_MonSceneOrTheEnd, 1); ChangeBgX(0, 0, BG_COORD_SET); ChangeBgY(0, 0, BG_COORD_SET); DecompressAndLoadBgGfxUsingHeap(0, sCopyrightOrTheEndGfxHeaders[sCreditsMgr->whichMon].tiles, 0x2000, 0, 0); DecompressAndLoadBgGfxUsingHeap(0, sCopyrightOrTheEndGfxHeaders[sCreditsMgr->whichMon].map, 0x800, 0, 1); LoadPalette(sCopyrightOrTheEndGfxHeaders[sCreditsMgr->whichMon].palette, BG_PLTT_ID(0), 16 * PLTT_SIZE_4BPP); SetVBlankCallback(VBlankCB); EnableInterrupts(INTR_FLAG_VBLANK); sCreditsMgr->subseqno++; break; case 1: CopyBgTilemapBufferToVram(0); sCreditsMgr->subseqno++; break; case 2: ShowBg(0); if (sCreditsMgr->whichMon != 0) BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0, RGB_BLACK); else BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sCreditsMgr->subseqno++; break; case 3: if (!gPaletteFade.active) { sCreditsMgr->subseqno = 0; return TRUE; } break; } return FALSE; } static void Task_MovePlayerAndGroundSprites(u8 taskId) { struct CreditsTaskData * data = (struct CreditsTaskData*)gTasks[taskId].data; switch (data->spriteMoveCmd) { case 0: break; case 1: if (gSprites[data->characterSpriteId].x != 0xD0) { gSprites[data->characterSpriteId].x--; gSprites[data->groundSpriteId].x--; } else { data->spriteMoveCmd = 0; } break; case 2: if (sCreditsMgr->unk_1D & 1) { if (gSprites[data->characterSpriteId].y != 0x50) { gSprites[data->characterSpriteId].y--; gSprites[data->groundSpriteId].y--; } else { data->spriteMoveCmd = 0; } } break; case 3: if (sCreditsMgr->mainseqno == 15) { gSprites[data->characterSpriteId].x--; gSprites[data->groundSpriteId].x--; } break; } } static void DestroyPlayerOrRivalSprite(void) { if (sCreditsMgr->taskId != TASK_NONE) { struct CreditsTaskData * data = (void *)gTasks[sCreditsMgr->taskId].data; FreeSpriteTilesByTag(data->characterTilesTag); DestroySprite(&gSprites[data->characterSpriteId]); FreeSpriteTilesByTag(data->groundTilesTag); DestroySprite(&gSprites[data->groundSpriteId]); DestroyTask(sCreditsMgr->taskId); sCreditsMgr->taskId = TASK_NONE; } } static void LoadPlayerOrRivalSprite(u8 whichScene) { u8 taskId; struct CreditsTaskData * data; s32 x, y; struct SpriteTemplate sprTemplate; struct CompressedSpriteSheet sprSheet; if (sCreditsMgr->taskId == TASK_NONE) { taskId = CreateTask(Task_MovePlayerAndGroundSprites, 0); data = (struct CreditsTaskData *)gTasks[taskId].data; sCreditsMgr->taskId = taskId; switch (sPlayerRivalSpriteParams[whichScene][2]) { default: case 0: x = DISPLAY_WIDTH - 32; y = DISPLAY_HEIGHT / 2; break; case 1: x = DISPLAY_WIDTH + 32; y = DISPLAY_HEIGHT / 2; break; case 2: x = DISPLAY_WIDTH - 32; y = DISPLAY_HEIGHT; break; } data->spriteMoveCmd = sPlayerRivalSpriteParams[whichScene][2]; data->characterTilesTag = GFXTAG_CHARACTER; data->characterPalTag = TAG_NONE; switch (sPlayerRivalSpriteParams[whichScene][0]) { case 0: // Player if (gSaveBlock2Ptr->playerGender == MALE) { sprSheet.data = sPlayerMale_Tiles; sprSheet.size = 0x3000; sprSheet.tag = data->characterTilesTag; LoadCompressedSpriteSheet(&sprSheet); LoadPalette(sPlayerMale_Pal, OBJ_PLTT_ID(15), sizeof(sPlayerMale_Pal)); } else { sprSheet.data = sPlayerFemale_Tiles; sprSheet.size = 0x3000; sprSheet.tag = data->characterTilesTag; LoadCompressedSpriteSheet(&sprSheet); LoadPalette(sPlayerFemale_Pal, OBJ_PLTT_ID(15), sizeof(sPlayerFemale_Pal)); } break; case 1: // Rival sprSheet.data = sRival_Tiles; sprSheet.size = 0x3000; sprSheet.tag = data->characterTilesTag; LoadCompressedSpriteSheet(&sprSheet); LoadPalette(sRival_Pal, OBJ_PLTT_ID(15), sizeof(sRival_Pal)); break; } sprTemplate = sPlayerOrRivalSpriteTemplate; sprTemplate.tileTag = data->characterTilesTag; data->characterSpriteId = CreateSprite(&sprTemplate, x, y, 0); gSprites[data->characterSpriteId].oam.paletteNum = 15; gSprites[data->characterSpriteId].subpriority = 0; data->groundTilesTag = GFXTAG_GROUND; data->groundPalTag = TAG_NONE; switch (sPlayerRivalSpriteParams[whichScene][1]) { case 0: sprSheet.data = sGround_Grass_Tiles; sprSheet.size = 0x3000; sprSheet.tag = data->groundTilesTag; LoadCompressedSpriteSheet(&sprSheet); LoadPalette(sGround_Grass_Pal, OBJ_PLTT_ID(14), sizeof(sGround_Grass_Pal)); sprTemplate = sGroundSpriteTemplate_Running; break; case 1: sprSheet.data = sGround_Grass_Tiles; sprSheet.size = 0x3000; sprSheet.tag = data->groundTilesTag; LoadCompressedSpriteSheet(&sprSheet); LoadPalette(sGround_Grass_Pal, OBJ_PLTT_ID(14), sizeof(sGround_Grass_Pal)); sprTemplate = sGroundSpriteTemplate_Static; break; case 2: sprSheet.data = sGround_Dirt_Tiles; sprSheet.size = 0x3000; sprSheet.tag = data->groundTilesTag; LoadCompressedSpriteSheet(&sprSheet); LoadPalette(sGround_Dirt_Pal, OBJ_PLTT_ID(14), sizeof(sGround_Dirt_Pal)); sprTemplate = sGroundSpriteTemplate_Running; break; case 3: sprSheet.data = sGround_City_Tiles; sprSheet.size = 0x3000; sprSheet.tag = data->groundTilesTag; LoadCompressedSpriteSheet(&sprSheet); LoadPalette(sGround_City_Pal, OBJ_PLTT_ID(14), sizeof(sGround_City_Pal)); sprTemplate = sGroundSpriteTemplate_Running; break; } sprTemplate.tileTag = data->groundTilesTag; data->groundSpriteId = CreateSprite(&sprTemplate, x, y + 38, 0); gSprites[data->groundSpriteId].oam.paletteNum = 14; gSprites[data->groundSpriteId].subpriority = 1; } } ================================================ FILE: src/crt0.s ================================================ .include "constants/gba_constants.inc" .include "constants/misc_constants.inc" .syntax unified .arm .align 2, 0 .global start_vector start_vector: mov r0, #PSR_IRQ_MODE msr cpsr_cf, r0 ldr sp, sp_irq mov r0, #PSR_SYS_MODE msr cpsr_cf, r0 ldr sp, sp_usr ldr r1, =INTR_VECTOR adr r0, intr_main str r0, [r1] ldr r1, =AgbMain mov lr, pc bx r1 b start_vector .align 2, 0 sp_usr: .word IWRAM_END - 0x1C0 sp_irq: .word IWRAM_END - 0x60 .pool .arm .align 2, 0 .global intr_main intr_main: mov r3, #REG_BASE add r3, r3, #OFFSET_REG_IE ldr r2, [r3] ldrh r1, [r3, #REG_IME - REG_IE] mrs r0, spsr stmdb sp!, {r0-r3,lr} mov r0, #0 strh r0, [r3, #REG_IME - REG_IE] and r1, r2, r2, lsr #16 mov r12, #0 ands r0, r1, #INTR_FLAG_VCOUNT bne jump_intr add r12, r12, 0x4 mov r0, 0x1 strh r0, [r3, #REG_IME - REG_IE] ands r0, r1, #INTR_FLAG_SERIAL bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_TIMER3 bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_HBLANK bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_VBLANK bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_TIMER0 bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_TIMER1 bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_TIMER2 bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_DMA0 bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_DMA1 bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_DMA2 bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_DMA3 bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_KEYPAD bne jump_intr add r12, r12, 0x4 ands r0, r1, #INTR_FLAG_GAMEPAK strbne r0, [r3, #REG_SOUNDCNT_X - REG_IE] loop: bne loop @ spin jump_intr: strh r0, [r3, #REG_IF - REG_IE] bic r2, r2, r0 ldr r0, =gSTWIStatus ldr r0, [r0] ldrb r0, [r0, 0xA] mov r1, #INTR_FLAG_TIMER0 lsl r0, r1, r0 orr r0, r0, #INTR_FLAG_GAMEPAK orr r1, r0, #INTR_FLAG_SERIAL | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_HBLANK and r1, r1, r2 strh r1, [r3, #0] mrs r3, cpsr bic r3, r3, #PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK orr r3, r3, #PSR_SYS_MODE msr cpsr_cf, r3 ldr r1, =gIntrTable add r1, r1, r12 ldr r0, [r1] stmdb sp!, {lr} adr lr, intr_return bx r0 intr_return: ldmia sp!, {lr} mrs r3, cpsr bic r3, r3, #PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK orr r3, r3, #PSR_I_BIT | PSR_IRQ_MODE msr cpsr_cf, r3 ldmia sp!, {r0-r3,lr} strh r2, [r3, #0] strh r1, [r3, #REG_IME - REG_IE] msr spsr_cf, r0 bx lr .pool .align 2, 0 @ Don't pad with nop. ================================================ FILE: src/data/battle_anim.h ================================================ const struct OamData gOamData_AffineOff_ObjNormal_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .x = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_16x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x8), .x = 0, .size = SPRITE_SIZE(16x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_32x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_64x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x32), .x = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_8x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x16), .x = 0, .size = SPRITE_SIZE(8x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_8x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x32), .x = 0, .size = SPRITE_SIZE(8x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x32), .x = 0, .size = SPRITE_SIZE(16x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjNormal_32x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x64), .x = 0, .size = SPRITE_SIZE(32x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .x = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_16x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x8), .x = 0, .size = SPRITE_SIZE(16x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_32x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_64x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x32), .x = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_8x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x16), .x = 0, .size = SPRITE_SIZE(8x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_8x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x32), .x = 0, .size = SPRITE_SIZE(8x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x32), .x = 0, .size = SPRITE_SIZE(16x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjNormal_32x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x64), .x = 0, .size = SPRITE_SIZE(32x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .x = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_16x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x8), .x = 0, .size = SPRITE_SIZE(16x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_32x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_64x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x32), .x = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_8x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x16), .x = 0, .size = SPRITE_SIZE(8x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_8x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x32), .x = 0, .size = SPRITE_SIZE(8x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x32), .x = 0, .size = SPRITE_SIZE(16x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjNormal_32x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x64), .x = 0, .size = SPRITE_SIZE(32x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .x = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_16x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x8), .x = 0, .size = SPRITE_SIZE(16x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_32x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_64x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x32), .x = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_8x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x16), .x = 0, .size = SPRITE_SIZE(8x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_8x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x32), .x = 0, .size = SPRITE_SIZE(8x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x32), .x = 0, .size = SPRITE_SIZE(16x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineOff_ObjBlend_32x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x64), .x = 0, .size = SPRITE_SIZE(32x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .x = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_16x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x8), .x = 0, .size = SPRITE_SIZE(16x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_32x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_64x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x32), .x = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_8x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x16), .x = 0, .size = SPRITE_SIZE(8x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_8x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x32), .x = 0, .size = SPRITE_SIZE(8x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x32), .x = 0, .size = SPRITE_SIZE(16x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineNormal_ObjBlend_32x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x64), .x = 0, .size = SPRITE_SIZE(32x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .x = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_16x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x8), .x = 0, .size = SPRITE_SIZE(16x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_32x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_64x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x32), .x = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_8x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x16), .x = 0, .size = SPRITE_SIZE(8x16), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_8x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x32), .x = 0, .size = SPRITE_SIZE(8x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x32), .x = 0, .size = SPRITE_SIZE(16x32), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct OamData gOamData_AffineDouble_ObjBlend_32x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x64), .x = 0, .size = SPRITE_SIZE(32x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; const struct CompressedSpriteSheet gBattleAnimPicTable[] = { {gBattleAnimSpriteGfx_Bone, 0x0200, ANIM_TAG_BONE}, {gBattleAnimSpriteGfx_Spark, 0x0300, ANIM_TAG_SPARK}, {gBattleAnimSpriteGfx_Pencil, 0x0200, ANIM_TAG_PENCIL}, {gBattleAnimSpriteGfx_AirWave, 0x0100, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpriteGfx_Orb, 0x0200, ANIM_TAG_ORB}, {gBattleAnimSpriteGfx_Sword, 0x0400, ANIM_TAG_SWORD}, {gBattleAnimSpriteGfx_Seed, 0x0180, ANIM_TAG_SEED}, {gBattleAnimSpriteGfx_Explosion6, 0x0800, ANIM_TAG_EXPLOSION_6}, {gBattleAnimSpriteGfx_PinkOrb, 0x0020, ANIM_TAG_PINK_ORB}, {gBattleAnimSpriteGfx_Gust, 0x0400, ANIM_TAG_GUST}, {gBattleAnimSpriteGfx_IceCube, 0x1200, ANIM_TAG_ICE_CUBE}, {gBattleAnimSpriteGfx_Spark2, 0x0180, ANIM_TAG_SPARK_2}, {gBattleAnimSpriteGfx_Orange, 0x0080, ANIM_TAG_ORANGE}, {gBattleAnimSpriteGfx_YellowBall, 0x0080, ANIM_TAG_YELLOW_BALL}, {gBattleAnimSpriteGfx_LockOn, 0x0280, ANIM_TAG_LOCK_ON}, {gBattleAnimSpriteGfx_TiedBag, 0x0080, ANIM_TAG_TIED_BAG}, {gBattleAnimSpriteGfx_BlackSmoke, 0x0100, ANIM_TAG_BLACK_SMOKE}, {gBattleAnimSpriteGfx_BlackBall, 0x0020, ANIM_TAG_BLACK_BALL}, {gBattleAnimSpriteGfx_Conversion, 0x0080, ANIM_TAG_CONVERSION}, {gBattleAnimSpriteGfx_Glass, 0x0400, ANIM_TAG_GLASS}, {gBattleAnimSpriteGfx_HornHit, 0x0200, ANIM_TAG_HORN_HIT}, {gBattleAnimSpriteGfx_Hit, 0x0A00, ANIM_TAG_HIT}, {gBattleAnimSpriteGfx_Hit, 0x0A00, ANIM_TAG_HIT_2}, {gBattleAnimSpriteGfx_BlueShards, 0x0380, ANIM_TAG_BLUE_SHARDS}, {gBattleAnimSpriteGfx_ClosingEye, 0x0300, ANIM_TAG_CLOSING_EYE}, {gBattleAnimSpriteGfx_WavingHand, 0x0A00, ANIM_TAG_WAVING_HAND}, {gBattleAnimSpriteGfx_HitDuplicate, 0x0A00, ANIM_TAG_HIT_DUPLICATE}, {gBattleAnimSpriteGfx_Leer, 0x0A00, ANIM_TAG_LEER}, {gBattleAnimSpriteGfx_BlueBurst, 0x0A00, ANIM_TAG_BLUE_BURST}, {gBattleAnimSpriteGfx_SmallEmber, 0x0A00, ANIM_TAG_SMALL_EMBER}, {gBattleAnimSpriteGfx_GraySmoke, 0x0A00, ANIM_TAG_GRAY_SMOKE}, {gBattleAnimSpriteGfx_BlueStar, 0x0E00, ANIM_TAG_BLUE_STAR}, {gBattleAnimSpriteGfx_BubbleBurst, 0x0380, ANIM_TAG_BUBBLE_BURST}, {gBattleAnimSpriteGfx_Fire, 0x1000, ANIM_TAG_FIRE}, {gBattleAnimSpriteGfx_SpinningFire, 0x0800, ANIM_TAG_SPINNING_FIRE}, {gBattleAnimSpriteGfx_FirePlume, 0x0A00, ANIM_TAG_FIRE_PLUME}, {gBattleAnimSpriteGfx_Lightning2, 0x0800, ANIM_TAG_LIGHTNING_2}, {gBattleAnimSpriteGfx_Lightning, 0x0A00, ANIM_TAG_LIGHTNING}, {gBattleAnimSpriteGfx_ClawSlash2, 0x0A00, ANIM_TAG_CLAW_SLASH_2}, {gBattleAnimSpriteGfx_ClawSlash, 0x0A00, ANIM_TAG_CLAW_SLASH}, {gBattleAnimSpriteGfx_Scratch3, 0x0A00, ANIM_TAG_SCRATCH_3}, {gBattleAnimSpriteGfx_Scratch2, 0x0A00, ANIM_TAG_SCRATCH_2}, {gBattleAnimSpriteGfx_BubbleBurst2, 0x0A00, ANIM_TAG_BUBBLE_BURST_2}, {gBattleAnimSpriteGfx_IceChunk, 0x0A00, ANIM_TAG_ICE_CHUNK}, {gBattleAnimSpriteGfx_Glass2, 0x0A00, ANIM_TAG_GLASS_2}, {gBattleAnimSpriteGfx_PinkHeart2, 0x0A00, ANIM_TAG_PINK_HEART_2}, {gBattleAnimSpriteGfx_SapDrip, 0x1000, ANIM_TAG_SAP_DRIP}, {gBattleAnimSpriteGfx_SapDrip, 0x1000, ANIM_TAG_SAP_DRIP_2}, {gBattleAnimSpriteGfx_Sparkle1, 0x1000, ANIM_TAG_SPARKLE_1}, {gBattleAnimSpriteGfx_Sparkle1, 0x1000, ANIM_TAG_SPARKLE_2}, {gBattleAnimSpriteGfx_HumanoidFoot, 0x0200, ANIM_TAG_HUMANOID_FOOT}, {gBattleAnimSpriteGfx_MonsterFoot, 0x0200, ANIM_TAG_MONSTER_FOOT}, {gBattleAnimSpriteGfx_HumanoidHand, 0x0200, ANIM_TAG_HUMANOID_HAND}, {gBattleAnimSpriteGfx_NoiseLine, 0x0800, ANIM_TAG_NOISE_LINE}, {gBattleAnimSpriteGfx_YellowUnk, 0x0080, ANIM_TAG_YELLOW_UNK}, {gBattleAnimSpriteGfx_RedFist, 0x0200, ANIM_TAG_RED_FIST}, {gBattleAnimSpriteGfx_SlamHit, 0x1000, ANIM_TAG_SLAM_HIT}, {gBattleAnimSpriteGfx_Ring, 0x0180, ANIM_TAG_RING}, {gBattleAnimSpriteGfx_Rocks, 0x0C00, ANIM_TAG_ROCKS}, {gBattleAnimSpriteGfx_Z, 0x0100, ANIM_TAG_Z}, {gBattleAnimSpriteGfx_YellowUnk2, 0x0040, ANIM_TAG_YELLOW_UNK_2}, {gBattleAnimSpriteGfx_AirSlash, 0x0180, ANIM_TAG_AIR_SLASH}, {gBattleAnimSpriteGfx_SpinningGreenOrbs, 0x0800, ANIM_TAG_SPINNING_GREEN_ORBS}, {gBattleAnimSpriteGfx_Leaf, 0x0480, ANIM_TAG_LEAF}, {gBattleAnimSpriteGfx_Finger, 0x0200, ANIM_TAG_FINGER}, {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_POISON_POWDER}, {gBattleAnimSpriteGfx_BrownTriangle, 0x0100, ANIM_TAG_BROWN_TRIANGLE}, {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_SLEEP_POWDER}, {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_STUN_SPORE}, {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_POWDER}, {gBattleAnimSpriteGfx_Sparkle3, 0x0200, ANIM_TAG_SPARKLE_3}, {gBattleAnimSpriteGfx_Sparkle4, 0x0A00, ANIM_TAG_SPARKLE_4}, {gBattleAnimSpriteGfx_MusicNotes, 0x0300, ANIM_TAG_MUSIC_NOTES}, {gBattleAnimSpriteGfx_Duck, 0x0180, ANIM_TAG_DUCK}, {gBattleAnimSpriteGfx_MudSand, 0x00A0, ANIM_TAG_MUD_SAND}, {gBattleAnimSpriteGfx_Alert, 0x0700, ANIM_TAG_ALERT}, {gBattleAnimSpriteGfx_BlueFlames, 0x0400, ANIM_TAG_BLUE_FLAMES}, {gBattleAnimSpriteGfx_BlueFlames2, 0x0200, ANIM_TAG_BLUE_FLAMES_2}, {gBattleAnimSpriteGfx_Shock4, 0x0300, ANIM_TAG_SHOCK_4}, {gBattleAnimSpriteGfx_Shock, 0x0C00, ANIM_TAG_SHOCK}, {gBattleAnimSpriteGfx_Bell2, 0x0A00, ANIM_TAG_BELL_2}, {gBattleAnimSpriteGfx_PinkGlove, 0x0080, ANIM_TAG_PINK_GLOVE}, {gBattleAnimSpriteGfx_BlueLines, 0x0040, ANIM_TAG_BLUE_LINES}, {gBattleAnimSpriteGfx_Impact3, 0x0E00, ANIM_TAG_IMPACT_3}, {gBattleAnimSpriteGfx_Impact2, 0x0E00, ANIM_TAG_IMPACT_2}, {gBattleAnimSpriteGfx_Reticle, 0x0280, ANIM_TAG_RETICLE}, {gBattleAnimSpriteGfx_Breath, 0x0200, ANIM_TAG_BREATH}, {gBattleAnimSpriteGfx_Anger, 0x0080, ANIM_TAG_ANGER}, {gBattleAnimSpriteGfx_Snowball, 0x00C0, ANIM_TAG_SNOWBALL}, {gBattleAnimSpriteGfx_Vine, 0x0A00, ANIM_TAG_VINE}, {gBattleAnimSpriteGfx_Sword2, 0x0200, ANIM_TAG_SWORD_2}, {gBattleAnimSpriteGfx_Clapping, 0x0180, ANIM_TAG_CLAPPING}, {gBattleAnimSpriteGfx_RedTube, 0x0080, ANIM_TAG_RED_TUBE}, {gBattleAnimSpriteGfx_Amnesia, 0x1000, ANIM_TAG_AMNESIA}, {gBattleAnimSpriteGfx_String2, 0x0A00, ANIM_TAG_STRING_2}, {gBattleAnimSpriteGfx_Pencil2, 0x0180, ANIM_TAG_PENCIL_2}, {gBattleAnimSpriteGfx_Petal, 0x0380, ANIM_TAG_PETAL}, {gBattleAnimSpriteGfx_BentSpoon, 0x0C00, ANIM_TAG_BENT_SPOON}, {gBattleAnimSpriteGfx_Web, 0x0200, ANIM_TAG_WEB}, {gBattleAnimSpriteGfx_MilkBottle, 0x0200, ANIM_TAG_MILK_BOTTLE}, {gBattleAnimSpriteGfx_Coin, 0x0200, ANIM_TAG_COIN}, {gBattleAnimSpriteGfx_CrackedEgg, 0x0200, ANIM_TAG_CRACKED_EGG}, {gBattleAnimSpriteGfx_HatchedEgg, 0x0400, ANIM_TAG_HATCHED_EGG}, {gBattleAnimSpriteGfx_FreshEgg, 0x0080, ANIM_TAG_FRESH_EGG}, {gBattleAnimSpriteGfx_Fangs, 0x0400, ANIM_TAG_FANGS}, {gBattleAnimSpriteGfx_Explosion2, 0x0c00, ANIM_TAG_EXPLOSION_2}, {gBattleAnimSpriteGfx_Explosion3, 0x0200, ANIM_TAG_EXPLOSION_3}, {gBattleAnimSpriteGfx_WaterDroplet, 0x1000, ANIM_TAG_WATER_DROPLET}, {gBattleAnimSpriteGfx_WaterDroplet2, 0x0a00, ANIM_TAG_WATER_DROPLET_2}, {gBattleAnimSpriteGfx_Seed2, 0x0020, ANIM_TAG_SEED_2}, {gBattleAnimSpriteGfx_Sprout, 0x0e00, ANIM_TAG_SPROUT}, {gBattleAnimSpriteGfx_RedWand, 0x0080, ANIM_TAG_RED_WAND}, {gBattleAnimSpriteGfx_PurpleGreenUnk, 0x0a00, ANIM_TAG_PURPLE_GREEN_UNK}, {gBattleAnimSpriteGfx_WaterColumn, 0x0400, ANIM_TAG_WATER_COLUMN}, {gBattleAnimSpriteGfx_MudUnk, 0x0200, ANIM_TAG_MUD_UNK}, {gBattleAnimSpriteGfx_RainDrops, 0x0700, ANIM_TAG_RAIN_DROPS}, {gBattleAnimSpriteGfx_FurySwipes, 0x0800, ANIM_TAG_FURY_SWIPES}, {gBattleAnimSpriteGfx_Vine2, 0x0a00, ANIM_TAG_VINE_2}, {gBattleAnimSpriteGfx_Teeth, 0x0600, ANIM_TAG_TEETH}, {gBattleAnimSpriteGfx_Bone2, 0x0800, ANIM_TAG_BONE_2}, {gBattleAnimSpriteGfx_WhiteBag, 0x0200, ANIM_TAG_WHITE_BAG}, {gBattleAnimSpriteGfx_Unknown, 0x0040, ANIM_TAG_UNKNOWN}, {gBattleAnimSpriteGfx_PurpleCoral, 0x0180, ANIM_TAG_PURPLE_CORAL}, {gBattleAnimSpriteGfx_PurpleDroplet, 0x0600, ANIM_TAG_PURPLE_DROPLET}, {gBattleAnimSpriteGfx_Shock2, 0x0600, ANIM_TAG_SHOCK_2}, {gBattleAnimSpriteGfx_ClosingEye2, 0x0200, ANIM_TAG_CLOSING_EYE_2}, {gBattleAnimSpriteGfx_MetalBall, 0x0080, ANIM_TAG_METAL_BALL}, {gBattleAnimSpriteGfx_MonsterDoll, 0x0200, ANIM_TAG_MONSTER_DOLL}, {gBattleAnimSpriteGfx_Whirlwind, 0x0800, ANIM_TAG_WHIRLWIND}, {gBattleAnimSpriteGfx_Whirlwind2, 0x0080, ANIM_TAG_WHIRLWIND_2}, {gBattleAnimSpriteGfx_Explosion4, 0x0a00, ANIM_TAG_EXPLOSION_4}, {gBattleAnimSpriteGfx_Explosion5, 0x0280, ANIM_TAG_EXPLOSION_5}, {gBattleAnimSpriteGfx_Tongue, 0x0280, ANIM_TAG_TONGUE}, {gBattleAnimSpriteGfx_Smoke, 0x0100, ANIM_TAG_SMOKE}, {gBattleAnimSpriteGfx_Smoke2, 0x0200, ANIM_TAG_SMOKE_2}, {gBattleAnimSpriteGfx_Impact, 0x0200, ANIM_TAG_IMPACT}, {gBattleAnimSpriteGfx_CircleImpact, 0x0020, ANIM_TAG_CIRCLE_IMPACT}, {gBattleAnimSpriteGfx_Scratch, 0x0a00, ANIM_TAG_SCRATCH}, {gBattleAnimSpriteGfx_Cut, 0x0800, ANIM_TAG_CUT}, {gBattleAnimSpriteGfx_SharpTeeth, 0x0800, ANIM_TAG_SHARP_TEETH}, {gBattleAnimSpriteGfx_RainbowRings, 0x00c0, ANIM_TAG_RAINBOW_RINGS}, {gBattleAnimSpriteGfx_IceCrystals, 0x01c0, ANIM_TAG_ICE_CRYSTALS}, {gBattleAnimSpriteGfx_IceSpikes, 0x0100, ANIM_TAG_ICE_SPIKES}, {gBattleAnimSpriteGfx_HandsAndFeet, 0x0800, ANIM_TAG_HANDS_AND_FEET}, {gBattleAnimSpriteGfx_MistCloud, 0x0200, ANIM_TAG_MIST_CLOUD}, {gBattleAnimSpriteGfx_Clamp, 0x0800, ANIM_TAG_CLAMP}, {gBattleAnimSpriteGfx_Bubble, 0x0180, ANIM_TAG_BUBBLE}, {gBattleAnimSpriteGfx_Orbs, 0x0180, ANIM_TAG_ORBS}, {gBattleAnimSpriteGfx_WaterImpact, 0x0200, ANIM_TAG_WATER_IMPACT}, {gBattleAnimSpriteGfx_WaterOrb, 0x0200, ANIM_TAG_WATER_ORB}, {gBattleAnimSpriteGfx_PoisonBubble, 0x0180, ANIM_TAG_POISON_BUBBLE}, {gBattleAnimSpriteGfx_ToxicBubble, 0x0400, ANIM_TAG_TOXIC_BUBBLE}, {gBattleAnimSpriteGfx_Spikes, 0x0080, ANIM_TAG_SPIKES}, {gBattleAnimSpriteGfx_HornHit2, 0x0100, ANIM_TAG_HORN_HIT_2}, {gBattleAnimSpriteGfx_AirWave2, 0x0100, ANIM_TAG_AIR_WAVE_2}, {gBattleAnimSpriteGfx_SmallBubbles, 0x0140, ANIM_TAG_SMALL_BUBBLES}, {gBattleAnimSpriteGfx_RoundShadow, 0x0800, ANIM_TAG_ROUND_SHADOW}, {gBattleAnimSpriteGfx_Sunlight, 0x0200, ANIM_TAG_SUNLIGHT}, {gBattleAnimSpriteGfx_Spore, 0x0100, ANIM_TAG_SPORE}, {gBattleAnimSpriteGfx_Flower, 0x00a0, ANIM_TAG_FLOWER}, {gBattleAnimSpriteGfx_RazorLeaf, 0x0100, ANIM_TAG_RAZOR_LEAF}, {gBattleAnimSpriteGfx_Needle, 0x0080, ANIM_TAG_NEEDLE}, {gBattleAnimSpriteGfx_WhirlwindLines, 0x0300, ANIM_TAG_WHIRLWIND_LINES}, {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_GOLD_RING}, {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_PURPLE_RING}, {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_BLUE_RING}, {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_GREEN_LIGHT_WALL}, {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_BLUE_LIGHT_WALL}, {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_RED_LIGHT_WALL}, {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_GRAY_LIGHT_WALL}, {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_ORANGE_LIGHT_WALL}, {gBattleAnimSpriteGfx_BlackBall2, 0x0080, ANIM_TAG_BLACK_BALL_2}, {gBattleAnimSpriteGfx_MistCloud, 0x0200, ANIM_TAG_PURPLE_GAS_CLOUD}, {gBattleAnimSpriteGfx_SparkH, 0x0200, ANIM_TAG_SPARK_H}, {gBattleAnimSpriteGfx_YellowStar, 0x0200, ANIM_TAG_YELLOW_STAR}, {gBattleAnimSpriteGfx_LargeFreshEgg, 0x0080, ANIM_TAG_LARGE_FRESH_EGG}, {gBattleAnimSpriteGfx_ShadowBall, 0x0200, ANIM_TAG_SHADOW_BALL}, {gBattleAnimSpriteGfx_Lick, 0x0500, ANIM_TAG_LICK}, {gBattleAnimSpriteGfx_VoidLines, 0x0800, ANIM_TAG_VOID_LINES}, {gBattleAnimSpriteGfx_String, 0x0400, ANIM_TAG_STRING}, {gBattleAnimSpriteGfx_WebThread, 0x0020, ANIM_TAG_WEB_THREAD}, {gBattleAnimSpriteGfx_SpiderWeb, 0x0800, ANIM_TAG_SPIDER_WEB}, {gBattleAnimSpriteGfx_Lightbulb, 0x0100, ANIM_TAG_LIGHTBULB}, {gBattleAnimSpriteGfx_Slash, 0x0800, ANIM_TAG_SLASH}, {gBattleAnimSpriteGfx_FocusEnergy, 0x0400, ANIM_TAG_FOCUS_ENERGY}, {gBattleAnimSpriteGfx_SphereToCube, 0x0a00, ANIM_TAG_SPHERE_TO_CUBE}, {gBattleAnimSpriteGfx_Tendrils, 0x1000, ANIM_TAG_TENDRILS}, {gBattleAnimSpriteGfx_Eye, 0x0800, ANIM_TAG_EYE}, {gBattleAnimSpriteGfx_WhiteShadow, 0x0400, ANIM_TAG_WHITE_SHADOW}, {gBattleAnimSpriteGfx_TealAlert, 0x0200, ANIM_TAG_TEAL_ALERT}, {gBattleAnimSpriteGfx_OpeningEye, 0x0800, ANIM_TAG_OPENING_EYE}, {gBattleAnimSpriteGfx_RoundWhiteHalo, 0x0800, ANIM_TAG_ROUND_WHITE_HALO}, {gBattleAnimSpriteGfx_FangAttack, 0x0800, ANIM_TAG_FANG_ATTACK}, {gBattleAnimSpriteGfx_PurpleHandOutline, 0x0200, ANIM_TAG_PURPLE_HAND_OUTLINE}, {gBattleAnimSpriteGfx_Moon, 0x0800, ANIM_TAG_MOON}, {gBattleAnimSpriteGfx_GreenSparkle, 0x0200, ANIM_TAG_GREEN_SPARKLE}, {gBattleAnimSpriteGfx_Spiral, 0x0800, ANIM_TAG_SPIRAL}, {gBattleAnimSpriteGfx_SnoreZ, 0x0200, ANIM_TAG_SNORE_Z}, {gBattleAnimSpriteGfx_Explosion, 0x0800, ANIM_TAG_EXPLOSION}, {gBattleAnimSpriteGfx_Nail, 0x0400, ANIM_TAG_NAIL}, {gBattleAnimSpriteGfx_GhostlySpirit, 0x0200, ANIM_TAG_GHOSTLY_SPIRIT}, {gBattleAnimSpriteGfx_WarmRock, 0x0a80, ANIM_TAG_WARM_ROCK}, {gBattleAnimSpriteGfx_BreakingEgg, 0x0600, ANIM_TAG_BREAKING_EGG}, {gBattleAnimSpriteGfx_ThinRing, 0x0800, ANIM_TAG_THIN_RING}, {gBattleAnimSpriteGfx_PunchImpact, 0x0200, ANIM_TAG_PUNCH_IMPACT}, {gBattleAnimSpriteGfx_Bell, 0x0600, ANIM_TAG_BELL}, {gBattleAnimSpriteGfx_MusicNotes2, 0x0800, ANIM_TAG_MUSIC_NOTES_2}, {gBattleAnimSpriteGfx_SpeedDust, 0x0180, ANIM_TAG_SPEED_DUST}, {gBattleAnimSpriteGfx_TornMetal, 0x0800, ANIM_TAG_TORN_METAL}, {gBattleAnimSpriteGfx_ThoughtBubble, 0x0800, ANIM_TAG_THOUGHT_BUBBLE}, {gBattleAnimSpriteGfx_MagentaHeart, 0x0080, ANIM_TAG_MAGENTA_HEART}, {gBattleAnimSpriteGfx_ElectricOrbs, 0x0080, ANIM_TAG_ELECTRIC_ORBS}, {gBattleAnimSpriteGfx_CircleOfLight, 0x0800, ANIM_TAG_CIRCLE_OF_LIGHT}, {gBattleAnimSpriteGfx_Electricity, 0x0800, ANIM_TAG_ELECTRICITY}, {gBattleAnimSpriteGfx_Finger2, 0x0600, ANIM_TAG_FINGER_2}, {gBattleAnimSpriteGfx_MovementWaves, 0x0600, ANIM_TAG_MOVEMENT_WAVES}, {gBattleAnimSpriteGfx_MagentaHeart, 0x0080, ANIM_TAG_RED_HEART}, {gBattleAnimSpriteGfx_RedOrb, 0x0080, ANIM_TAG_RED_ORB}, {gBattleAnimSpriteGfx_EyeSparkle, 0x0180, ANIM_TAG_EYE_SPARKLE}, {gBattleAnimSpriteGfx_MagentaHeart, 0x0080, ANIM_TAG_PINK_HEART}, {gBattleAnimSpriteGfx_Angel, 0x0200, ANIM_TAG_ANGEL}, {gBattleAnimSpriteGfx_Devil, 0x0400, ANIM_TAG_DEVIL}, {gBattleAnimSpriteGfx_Swipe, 0x0a00, ANIM_TAG_SWIPE}, {gBattleAnimSpriteGfx_Roots, 0x0800, ANIM_TAG_ROOTS}, {gBattleAnimSpriteGfx_ItemBag, 0x0200, ANIM_TAG_ITEM_BAG}, {gBattleAnimSpriteGfx_JaggedMusicNote, 0x0400, ANIM_TAG_JAGGED_MUSIC_NOTE}, {gBattleAnimSpriteGfx_Pokeball, 0x0080, ANIM_TAG_POKEBALL}, {gBattleAnimSpriteGfx_Spotlight, 0x0800, ANIM_TAG_SPOTLIGHT}, {gBattleAnimSpriteGfx_LetterZ, 0x0200, ANIM_TAG_LETTER_Z}, {gBattleAnimSpriteGfx_RapidSpin, 0x0300, ANIM_TAG_RAPID_SPIN}, {gBattleAnimSpriteGfx_TriAttackTriangle, 0x0800, ANIM_TAG_TRI_ATTACK_TRIANGLE}, {gBattleAnimSpriteGfx_WispOrb, 0x0380, ANIM_TAG_WISP_ORB}, {gBattleAnimSpriteGfx_WispFire, 0x0800, ANIM_TAG_WISP_FIRE}, {gBattleAnimSpriteGfx_GoldStars, 0x00c0, ANIM_TAG_GOLD_STARS}, {gBattleAnimSpriteGfx_EclipsingOrb, 0x0800, ANIM_TAG_ECLIPSING_ORB}, {gBattleAnimSpriteGfx_GrayOrb, 0x0060, ANIM_TAG_GRAY_ORB}, {gBattleAnimSpriteGfx_GrayOrb, 0x0060, ANIM_TAG_BLUE_ORB}, {gBattleAnimSpriteGfx_GrayOrb, 0x0060, ANIM_TAG_RED_ORB_2}, {gBattleAnimSpriteGfx_PinkPetal, 0x0080, ANIM_TAG_PINK_PETAL}, {gBattleAnimSpriteGfx_PainSplit, 0x0180, ANIM_TAG_PAIN_SPLIT}, {gBattleAnimSpriteGfx_Confetti, 0x0180, ANIM_TAG_CONFETTI}, {gBattleAnimSpriteGfx_GreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, {gBattleAnimSpriteGfx_PinkCloud, 0x0200, ANIM_TAG_PINK_CLOUD}, {gBattleAnimSpriteGfx_SweatDrop, 0x0020, ANIM_TAG_SWEAT_DROP}, {gBattleAnimSpriteGfx_GuardRing, 0x0400, ANIM_TAG_GUARD_RING}, {gBattleAnimSpriteGfx_PurpleScratch, 0x0600, ANIM_TAG_PURPLE_SCRATCH}, {gBattleAnimSpriteGfx_PurpleSwipe, 0x1000, ANIM_TAG_PURPLE_SWIPE}, {gBattleAnimSpriteGfx_TagHand, 0x0400, ANIM_TAG_TAG_HAND}, {gBattleAnimSpriteGfx_SmallRedEye, 0x0020, ANIM_TAG_SMALL_RED_EYE}, {gBattleAnimSpriteGfx_HollowOrb, 0x0080, ANIM_TAG_HOLLOW_ORB}, {gBattleAnimSpriteGfx_XSign, 0x0800, ANIM_TAG_X_SIGN}, {gBattleAnimSpriteGfx_BluegreenOrb, 0x0080, ANIM_TAG_BLUEGREEN_ORB}, {gBattleAnimSpriteGfx_PawPrint, 0x0200, ANIM_TAG_PAW_PRINT}, {gBattleAnimSpriteGfx_PurpleFlame, 0x0400, ANIM_TAG_PURPLE_FLAME}, {gBattleAnimSpriteGfx_RedBall, 0x0200, ANIM_TAG_RED_BALL}, {gBattleAnimSpriteGfx_SmellingsaltEffect, 0x0200, ANIM_TAG_SMELLINGSALT_EFFECT}, {gBattleAnimSpriteGfx_Meteor, 0x0800, ANIM_TAG_METEOR}, {gBattleAnimSpriteGfx_FlatRock, 0x0280, ANIM_TAG_FLAT_ROCK}, {gBattleAnimSpriteGfx_MagnifyingGlass, 0x0200, ANIM_TAG_MAGNIFYING_GLASS}, {gBattleAnimSpriteGfx_WaterOrb, 0x0200, ANIM_TAG_BROWN_ORB}, {gBattleAnimSpriteGfx_MetalSoundWaves, 0x0400, ANIM_TAG_METAL_SOUND_WAVES}, {gBattleAnimSpriteGfx_FlyingDirt, 0x0200, ANIM_TAG_FLYING_DIRT}, {gBattleAnimSpriteGfx_IcicleSpear, 0x0200, ANIM_TAG_ICICLE_SPEAR}, {gBattleAnimSpriteGfx_Hail, 0x0080, ANIM_TAG_HAIL}, {gBattleAnimSpriteGfx_GlowyRedOrb, 0x0020, ANIM_TAG_GLOWY_RED_ORB}, {gBattleAnimSpriteGfx_GlowyRedOrb, 0x0020, ANIM_TAG_GLOWY_GREEN_ORB}, {gBattleAnimSpriteGfx_GreenSpike, 0x0080, ANIM_TAG_GREEN_SPIKE}, {gBattleAnimSpriteGfx_CircleOfLight, 0x0800, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT}, {gBattleAnimSpriteGfx_GlowyRedOrb, 0x0020, ANIM_TAG_GLOWY_BLUE_ORB}, {gBattleAnimSpriteGfx_SafariBait, 0x0080, ANIM_TAG_SAFARI_BAIT}, {gBattleAnimSpriteGfx_WhiteFeather, 0x0400, ANIM_TAG_WHITE_FEATHER}, {gBattleAnimSpriteGfx_Sparkle6, 0x0080, ANIM_TAG_SPARKLE_6}, {gBattleAnimSpriteGfx_Splash, 0x0800, ANIM_TAG_SPLASH}, {gBattleAnimSpriteGfx_SweatBead, 0x0020, ANIM_TAG_SWEAT_BEAD}, {gBattleAnimSpriteGfx_Gem1, 0x0800, ANIM_TAG_GEM_1}, {gBattleAnimSpriteGfx_Gem2, 0x0800, ANIM_TAG_GEM_2}, {gBattleAnimSpriteGfx_Gem3, 0x0800, ANIM_TAG_GEM_3}, {gBattleAnimSpriteGfx_SlamHit2, 0x1000, ANIM_TAG_SLAM_HIT_2}, {gBattleAnimSpriteGfx_Recycle, 0x0800, ANIM_TAG_RECYCLE}, {gBattleAnimSpriteGfx_RedParticles, 0x00a0, ANIM_TAG_RED_PARTICLES}, {gBattleAnimSpriteGfx_Protect, 0x0800, ANIM_TAG_PROTECT}, {gBattleAnimSpriteGfx_DirtMound, 0x0200, ANIM_TAG_DIRT_MOUND}, {gBattleAnimSpriteGfx_Shock3, 0x0600, ANIM_TAG_SHOCK_3}, {gBattleAnimSpriteGfx_WeatherBall, 0x0200, ANIM_TAG_WEATHER_BALL}, {gBattleAnimSpriteGfx_Bird, 0x0800, ANIM_TAG_BIRD}, {gBattleAnimSpriteGfx_CrossImpact, 0x0200, ANIM_TAG_CROSS_IMPACT}, {gBattleAnimSpriteGfx_Slash, 0x0800, ANIM_TAG_SLASH_2}, {gBattleAnimSpriteGfx_SlamHit, 0x1000, ANIM_TAG_WHIP_HIT}, {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_BLUE_RING_2}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = { {gBattleAnimSpritePal_Bone, ANIM_TAG_BONE}, {gBattleAnimSpritePal_Spark, ANIM_TAG_SPARK}, {gBattleAnimSpritePal_Pencil, ANIM_TAG_PENCIL}, {gBattleAnimSpritePal_AirWave, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpritePal_Orb, ANIM_TAG_ORB}, {gBattleAnimSpritePal_Sword, ANIM_TAG_SWORD}, {gBattleAnimSpritePal_Seed, ANIM_TAG_SEED}, {gBattleAnimSpritePal_Explosion6, ANIM_TAG_EXPLOSION_6}, {gBattleAnimSpritePal_PinkOrb, ANIM_TAG_PINK_ORB}, {gBattleAnimSpritePal_Gust, ANIM_TAG_GUST}, {gBattleAnimSpritePal_IceCube, ANIM_TAG_ICE_CUBE}, {gBattleAnimSpritePal_Spark2, ANIM_TAG_SPARK_2}, {gBattleAnimSpritePal_Orange, ANIM_TAG_ORANGE}, {gBattleAnimSpritePal_YellowBall, ANIM_TAG_YELLOW_BALL}, {gBattleAnimSpritePal_LockOn, ANIM_TAG_LOCK_ON}, {gBattleAnimSpritePal_TiedBag, ANIM_TAG_TIED_BAG}, {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_SMOKE}, {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_BALL}, {gBattleAnimSpritePal_Conversion, ANIM_TAG_CONVERSION}, {gBattleAnimSpritePal_Glass, ANIM_TAG_GLASS}, {gBattleAnimSpritePal_HornHit, ANIM_TAG_HORN_HIT}, {gBattleAnimSpritePal_Hit, ANIM_TAG_HIT}, {gBattleAnimSpritePal_Hit2, ANIM_TAG_HIT_2}, {gBattleAnimSpritePal_BlueShards, ANIM_TAG_BLUE_SHARDS}, {gBattleAnimSpritePal_ClosingEye, ANIM_TAG_CLOSING_EYE}, {gBattleAnimSpritePal_WavingHand, ANIM_TAG_WAVING_HAND}, {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_HIT_DUPLICATE}, {gBattleAnimSpritePal_Leer, ANIM_TAG_LEER}, {gBattleAnimSpritePal_BlueBurst, ANIM_TAG_BLUE_BURST}, {gBattleAnimSpritePal_SmallEmber, ANIM_TAG_SMALL_EMBER}, {gBattleAnimSpritePal_GraySmoke, ANIM_TAG_GRAY_SMOKE}, {gBattleAnimSpritePal_BlueStar, ANIM_TAG_BLUE_STAR}, {gBattleAnimSpritePal_BubbleBurst, ANIM_TAG_BUBBLE_BURST}, {gBattleAnimSpritePal_Fire, ANIM_TAG_FIRE}, {gBattleAnimSpritePal_Fire, ANIM_TAG_SPINNING_FIRE}, {gBattleAnimSpritePal_Fire, ANIM_TAG_FIRE_PLUME}, {gBattleAnimSpritePal_Lightning2, ANIM_TAG_LIGHTNING_2}, {gBattleAnimSpritePal_Lightning2, ANIM_TAG_LIGHTNING}, {gBattleAnimSpritePal_ClawSlash2, ANIM_TAG_CLAW_SLASH_2}, {gBattleAnimSpritePal_ClawSlash, ANIM_TAG_CLAW_SLASH}, {gBattleAnimSpritePal_ClawSlash2, ANIM_TAG_SCRATCH_3}, {gBattleAnimSpritePal_ClawSlash2, ANIM_TAG_SCRATCH_2}, {gBattleAnimSpritePal_BubbleBurst2, ANIM_TAG_BUBBLE_BURST_2}, {gBattleAnimSpritePal_IceChunk, ANIM_TAG_ICE_CHUNK}, {gBattleAnimSpritePal_Glass2, ANIM_TAG_GLASS_2}, {gBattleAnimSpritePal_PinkHeart2, ANIM_TAG_PINK_HEART_2}, {gBattleAnimSpritePal_SapDrip, ANIM_TAG_SAP_DRIP}, {gBattleAnimSpritePal_SapDrip2, ANIM_TAG_SAP_DRIP}, {gBattleAnimSpritePal_Sparkle1, ANIM_TAG_SPARKLE_1}, {gBattleAnimSpritePal_Sparkle2, ANIM_TAG_SPARKLE_2}, {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_HUMANOID_FOOT}, {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_MONSTER_FOOT}, {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_HUMANOID_HAND}, {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_NOISE_LINE}, {gBattleAnimSpritePal_YellowUnk, ANIM_TAG_YELLOW_UNK}, {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_RED_FIST}, {gBattleAnimSpritePal_SlamHit, ANIM_TAG_SLAM_HIT}, {gBattleAnimSpritePal_Ring, ANIM_TAG_RING}, {gBattleAnimSpritePal_Rocks, ANIM_TAG_ROCKS}, {gBattleAnimSpritePal_Z, ANIM_TAG_Z}, {gBattleAnimSpritePal_YellowUnk2, ANIM_TAG_YELLOW_UNK_2}, {gBattleAnimSpritePal_AirSlash, ANIM_TAG_AIR_SLASH}, {gBattleAnimSpritePal_SpinningGreenOrbs, ANIM_TAG_SPINNING_GREEN_ORBS}, {gBattleAnimSpritePal_Leaf, ANIM_TAG_LEAF}, {gBattleAnimSpritePal_Finger, ANIM_TAG_FINGER}, {gBattleAnimSpritePal_PoisonPowder, ANIM_TAG_POISON_POWDER}, {gBattleAnimSpritePal_BrownTriangle, ANIM_TAG_BROWN_TRIANGLE}, {gBattleAnimSpritePal_SleepPowder, ANIM_TAG_SLEEP_POWDER}, {gBattleAnimSpritePal_StunSpore, ANIM_TAG_STUN_SPORE}, {gBattleAnimSpritePal_PoisonPowder, ANIM_TAG_POWDER}, {gBattleAnimSpritePal_Sparkle3, ANIM_TAG_SPARKLE_3}, {gBattleAnimSpritePal_Sparkle3, ANIM_TAG_SPARKLE_4}, {gBattleAnimSpritePal_MusicNotes, ANIM_TAG_MUSIC_NOTES}, {gBattleAnimSpritePal_Duck, ANIM_TAG_DUCK}, {gBattleAnimSpritePal_MudSand, ANIM_TAG_MUD_SAND}, {gBattleAnimSpritePal_Alert, ANIM_TAG_ALERT}, {gBattleAnimSpritePal_BlueFlames, ANIM_TAG_BLUE_FLAMES}, {gBattleAnimSpritePal_BlueFlames, ANIM_TAG_BLUE_FLAMES_2}, {gBattleAnimSpritePal_Shock4, ANIM_TAG_SHOCK_4}, {gBattleAnimSpritePal_Shock4, ANIM_TAG_SHOCK}, {gBattleAnimSpritePal_Bell2, ANIM_TAG_BELL_2}, {gBattleAnimSpritePal_PinkGlove, ANIM_TAG_PINK_GLOVE}, {gBattleAnimSpritePal_BlueLines, ANIM_TAG_BLUE_LINES}, {gBattleAnimSpritePal_Impact3, ANIM_TAG_IMPACT_3}, {gBattleAnimSpritePal_Impact2, ANIM_TAG_IMPACT_2}, {gBattleAnimSpritePal_Reticle, ANIM_TAG_RETICLE}, {gBattleAnimSpritePal_Breath, ANIM_TAG_BREATH}, {gBattleAnimSpritePal_Anger, ANIM_TAG_ANGER}, {gBattleAnimSpritePal_Snowball, ANIM_TAG_SNOWBALL}, {gBattleAnimSpritePal_Vine, ANIM_TAG_VINE}, {gBattleAnimSpritePal_Sword2, ANIM_TAG_SWORD_2}, {gBattleAnimSpritePal_Clapping, ANIM_TAG_CLAPPING}, {gBattleAnimSpritePal_RedTube, ANIM_TAG_RED_TUBE}, {gBattleAnimSpritePal_Amnesia, ANIM_TAG_AMNESIA}, {gBattleAnimSpritePal_String2, ANIM_TAG_STRING_2}, {gBattleAnimSpritePal_Pencil2, ANIM_TAG_PENCIL_2}, {gBattleAnimSpritePal_Petal, ANIM_TAG_PETAL}, {gBattleAnimSpritePal_BentSpoon, ANIM_TAG_BENT_SPOON}, {gBattleAnimSpritePal_String2, ANIM_TAG_WEB}, {gBattleAnimSpritePal_MilkBottle, ANIM_TAG_MILK_BOTTLE}, {gBattleAnimSpritePal_Coin, ANIM_TAG_COIN}, {gBattleAnimSpritePal_CrackedEgg, ANIM_TAG_CRACKED_EGG}, {gBattleAnimSpritePal_CrackedEgg, ANIM_TAG_HATCHED_EGG}, {gBattleAnimSpritePal_FreshEgg, ANIM_TAG_FRESH_EGG}, {gBattleAnimSpritePal_Fangs, ANIM_TAG_FANGS}, {gBattleAnimSpritePal_Explosion2, ANIM_TAG_EXPLOSION_2}, {gBattleAnimSpritePal_Explosion2, ANIM_TAG_EXPLOSION_3}, {gBattleAnimSpritePal_WaterDroplet, ANIM_TAG_WATER_DROPLET}, {gBattleAnimSpritePal_WaterDroplet, ANIM_TAG_WATER_DROPLET_2}, {gBattleAnimSpritePal_Seed2, ANIM_TAG_SEED_2}, {gBattleAnimSpritePal_Seed2, ANIM_TAG_SPROUT}, {gBattleAnimSpritePal_RedWand, ANIM_TAG_RED_WAND}, {gBattleAnimSpritePal_PurpleGreenUnk, ANIM_TAG_PURPLE_GREEN_UNK}, {gBattleAnimSpritePal_WaterColumn, ANIM_TAG_WATER_COLUMN}, {gBattleAnimSpritePal_MudUnk, ANIM_TAG_MUD_UNK}, {gBattleAnimSpritePal_RainDrops, ANIM_TAG_RAIN_DROPS}, {gBattleAnimSpritePal_FurySwipes, ANIM_TAG_FURY_SWIPES}, {gBattleAnimSpritePal_Vine2, ANIM_TAG_VINE_2}, {gBattleAnimSpritePal_Teeth, ANIM_TAG_TEETH}, {gBattleAnimSpritePal_Bone2, ANIM_TAG_BONE_2}, {gBattleAnimSpritePal_WhiteBag, ANIM_TAG_WHITE_BAG}, {gBattleAnimSpritePal_Unknown, ANIM_TAG_UNKNOWN}, {gBattleAnimSpritePal_PurpleCoral, ANIM_TAG_PURPLE_CORAL}, {gBattleAnimSpritePal_PurpleCoral, ANIM_TAG_PURPLE_DROPLET}, {gBattleAnimSpritePal_Shock2, ANIM_TAG_SHOCK_2}, {gBattleAnimSpritePal_ClosingEye2, ANIM_TAG_CLOSING_EYE_2}, {gBattleAnimSpritePal_MetalBall, ANIM_TAG_METAL_BALL}, {gBattleAnimSpritePal_MonsterDoll, ANIM_TAG_MONSTER_DOLL}, {gBattleAnimSpritePal_Whirlwind, ANIM_TAG_WHIRLWIND}, {gBattleAnimSpritePal_Whirlwind, ANIM_TAG_WHIRLWIND_2}, {gBattleAnimSpritePal_Explosion4, ANIM_TAG_EXPLOSION_4}, {gBattleAnimSpritePal_Explosion4, ANIM_TAG_EXPLOSION_5}, {gBattleAnimSpritePal_Tongue, ANIM_TAG_TONGUE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE_2}, {gBattleAnimSpritePal_Impact, ANIM_TAG_IMPACT}, {gBattleAnimSpritePal_CircleImpact, ANIM_TAG_CIRCLE_IMPACT}, {gBattleAnimSpritePal_Impact, ANIM_TAG_SCRATCH}, {gBattleAnimSpritePal_Impact, ANIM_TAG_CUT}, {gBattleAnimSpritePal_SharpTeeth, ANIM_TAG_SHARP_TEETH}, {gBattleAnimSpritePal_RainbowRings, ANIM_TAG_RAINBOW_RINGS}, {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_CRYSTALS}, {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_SPIKES}, {gBattleAnimSpritePal_HandsAndFeet, ANIM_TAG_HANDS_AND_FEET}, {gBattleAnimSpritePal_MistCloud, ANIM_TAG_MIST_CLOUD}, {gBattleAnimSpritePal_SharpTeeth, ANIM_TAG_CLAMP}, {gBattleAnimSpritePal_RainDrops, ANIM_TAG_BUBBLE}, {gBattleAnimSpritePal_Orbs, ANIM_TAG_ORBS}, {gBattleAnimSpritePal_WaterImpact, ANIM_TAG_WATER_IMPACT}, {gBattleAnimSpritePal_WaterImpact, ANIM_TAG_WATER_ORB}, {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_POISON_BUBBLE}, {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_TOXIC_BUBBLE}, {gBattleAnimSpritePal_Spikes, ANIM_TAG_SPIKES}, {gBattleAnimSpritePal_HornHit2, ANIM_TAG_HORN_HIT_2}, {gBattleAnimSpritePal_AirWave2, ANIM_TAG_AIR_WAVE_2}, {gBattleAnimSpritePal_SmallBubbles, ANIM_TAG_SMALL_BUBBLES}, {gBattleAnimSpritePal_RoundShadow, ANIM_TAG_ROUND_SHADOW}, {gBattleAnimSpritePal_Sunlight, ANIM_TAG_SUNLIGHT}, {gBattleAnimSpritePal_Spore, ANIM_TAG_SPORE}, {gBattleAnimSpritePal_Flower, ANIM_TAG_FLOWER}, {gBattleAnimSpritePal_RazorLeaf, ANIM_TAG_RAZOR_LEAF}, {gBattleAnimSpritePal_Needle, ANIM_TAG_NEEDLE}, {gBattleAnimSpritePal_WhirlwindLines, ANIM_TAG_WHIRLWIND_LINES}, {gBattleAnimSpritePal_GoldRing, ANIM_TAG_GOLD_RING}, {gBattleAnimSpritePal_PurpleRing, ANIM_TAG_PURPLE_RING}, {gBattleAnimSpritePal_BlueRing, ANIM_TAG_BLUE_RING}, {gBattleAnimSpritePal_GreenLightWall, ANIM_TAG_GREEN_LIGHT_WALL}, {gBattleAnimSpritePal_BlueLightWall, ANIM_TAG_BLUE_LIGHT_WALL}, {gBattleAnimSpritePal_RedLightWall, ANIM_TAG_RED_LIGHT_WALL}, {gBattleAnimSpritePal_GrayLightWall, ANIM_TAG_GRAY_LIGHT_WALL}, {gBattleAnimSpritePal_OrangeLightWall, ANIM_TAG_ORANGE_LIGHT_WALL}, {gBattleAnimSpritePal_BlackBall2, ANIM_TAG_BLACK_BALL_2}, {gBattleAnimSpritePal_PurpleGasCloud, ANIM_TAG_PURPLE_GAS_CLOUD}, {gBattleAnimSpritePal_Spark, ANIM_TAG_SPARK_H}, {gBattleAnimSpritePal_YellowStar, ANIM_TAG_YELLOW_STAR}, {gBattleAnimSpritePal_LargeFreshEgg, ANIM_TAG_LARGE_FRESH_EGG}, {gBattleAnimSpritePal_ShadowBall, ANIM_TAG_SHADOW_BALL}, {gBattleAnimSpritePal_Lick, ANIM_TAG_LICK}, {gBattleAnimSpritePal_VoidLines, ANIM_TAG_VOID_LINES}, {gBattleAnimSpritePal_String, ANIM_TAG_STRING}, {gBattleAnimSpritePal_String, ANIM_TAG_WEB_THREAD}, {gBattleAnimSpritePal_String, ANIM_TAG_SPIDER_WEB}, {gBattleAnimSpritePal_Lightbulb, ANIM_TAG_LIGHTBULB}, {gBattleAnimSpritePal_Slash, ANIM_TAG_SLASH}, {gBattleAnimSpritePal_FocusEnergy, ANIM_TAG_FOCUS_ENERGY}, {gBattleAnimSpritePal_SphereToCube, ANIM_TAG_SPHERE_TO_CUBE}, {gBattleAnimSpritePal_Tendrils, ANIM_TAG_TENDRILS}, {gBattleAnimSpritePal_Eye, ANIM_TAG_EYE}, {gBattleAnimSpritePal_WhiteShadow, ANIM_TAG_WHITE_SHADOW}, {gBattleAnimSpritePal_TealAlert, ANIM_TAG_TEAL_ALERT}, {gBattleAnimSpritePal_OpeningEye, ANIM_TAG_OPENING_EYE}, {gBattleAnimSpritePal_RoundWhiteHalo, ANIM_TAG_ROUND_WHITE_HALO}, {gBattleAnimSpritePal_FangAttack, ANIM_TAG_FANG_ATTACK}, {gBattleAnimSpritePal_PurpleHandOutline, ANIM_TAG_PURPLE_HAND_OUTLINE}, {gBattleAnimSpritePal_Moon, ANIM_TAG_MOON}, {gBattleAnimSpritePal_GreenSparkle, ANIM_TAG_GREEN_SPARKLE}, {gBattleAnimSpritePal_Spiral, ANIM_TAG_SPIRAL}, {gBattleAnimSpritePal_SnoreZ, ANIM_TAG_SNORE_Z}, {gBattleAnimSpritePal_Explosion, ANIM_TAG_EXPLOSION}, {gBattleAnimSpritePal_Nail, ANIM_TAG_NAIL}, {gBattleAnimSpritePal_GhostlySpirit, ANIM_TAG_GHOSTLY_SPIRIT}, {gBattleAnimSpritePal_WarmRock, ANIM_TAG_WARM_ROCK}, {gBattleAnimSpritePal_BreakingEgg, ANIM_TAG_BREAKING_EGG}, {gBattleAnimSpritePal_ThinRing, ANIM_TAG_THIN_RING}, {gBattleAnimSpritePal_PunchImpact, ANIM_TAG_PUNCH_IMPACT}, {gBattleAnimSpritePal_Bell, ANIM_TAG_BELL}, {gBattleAnimSpritePal_MusicNotes2, ANIM_TAG_MUSIC_NOTES_2}, {gBattleAnimSpritePal_SpeedDust, ANIM_TAG_SPEED_DUST}, {gBattleAnimSpritePal_BlueLightWall, ANIM_TAG_TORN_METAL}, {gBattleAnimSpritePal_ThoughtBubble, ANIM_TAG_THOUGHT_BUBBLE}, {gBattleAnimSpritePal_MagentaHeart, ANIM_TAG_MAGENTA_HEART}, {gBattleAnimSpritePal_ElectricOrbs, ANIM_TAG_ELECTRIC_ORBS}, {gBattleAnimSpritePal_ElectricOrbs, ANIM_TAG_CIRCLE_OF_LIGHT}, {gBattleAnimSpritePal_ElectricOrbs, ANIM_TAG_ELECTRICITY}, {gBattleAnimSpritePal_Finger, ANIM_TAG_FINGER_2}, {gBattleAnimSpritePal_MovementWaves, ANIM_TAG_MOVEMENT_WAVES}, {gBattleAnimSpritePal_RedHeart, ANIM_TAG_RED_HEART}, {gBattleAnimSpritePal_RedOrb, ANIM_TAG_RED_ORB}, {gBattleAnimSpritePal_EyeSparkle, ANIM_TAG_EYE_SPARKLE}, {gBattleAnimSpritePal_PinkHeart, ANIM_TAG_PINK_HEART}, {gBattleAnimSpritePal_Angel, ANIM_TAG_ANGEL}, {gBattleAnimSpritePal_Devil, ANIM_TAG_DEVIL}, {gBattleAnimSpritePal_Swipe, ANIM_TAG_SWIPE}, {gBattleAnimSpritePal_Roots, ANIM_TAG_ROOTS}, {gBattleAnimSpritePal_ItemBag, ANIM_TAG_ITEM_BAG}, {gBattleAnimSpritePal_JaggedMusicNote, ANIM_TAG_JAGGED_MUSIC_NOTE}, {gBattleAnimSpritePal_Pokeball, ANIM_TAG_POKEBALL}, {gBattleAnimSpritePal_Pokeball, ANIM_TAG_SPOTLIGHT}, {gBattleAnimSpritePal_LetterZ, ANIM_TAG_LETTER_Z}, {gBattleAnimSpritePal_RapidSpin, ANIM_TAG_RAPID_SPIN}, {gBattleAnimSpritePal_TriAttackTriangle, ANIM_TAG_TRI_ATTACK_TRIANGLE}, {gBattleAnimSpritePal_WispOrb, ANIM_TAG_WISP_ORB}, {gBattleAnimSpritePal_WispOrb, ANIM_TAG_WISP_FIRE}, {gBattleAnimSpritePal_GoldStars, ANIM_TAG_GOLD_STARS}, {gBattleAnimSpritePal_EclipsingOrb, ANIM_TAG_ECLIPSING_ORB}, {gBattleAnimSpritePal_GrayOrb, ANIM_TAG_GRAY_ORB}, {gBattleAnimSpritePal_BlueOrb, ANIM_TAG_BLUE_ORB}, {gBattleAnimSpritePal_RedOrb2, ANIM_TAG_RED_ORB_2}, {gBattleAnimSpritePal_PinkPetal, ANIM_TAG_PINK_PETAL}, {gBattleAnimSpritePal_PainSplit, ANIM_TAG_PAIN_SPLIT}, {gBattleAnimSpritePal_Confetti, ANIM_TAG_CONFETTI}, {gBattleAnimSpritePal_GreenStar, ANIM_TAG_GREEN_STAR}, {gBattleAnimSpritePal_PinkCloud, ANIM_TAG_PINK_CLOUD}, {gBattleAnimSpritePal_SweatDrop, ANIM_TAG_SWEAT_DROP}, {gBattleAnimSpritePal_GuardRing, ANIM_TAG_GUARD_RING}, {gBattleAnimSpritePal_PurpleScratch, ANIM_TAG_PURPLE_SCRATCH}, {gBattleAnimSpritePal_PurpleScratch, ANIM_TAG_PURPLE_SWIPE}, {gBattleAnimSpritePal_Finger, ANIM_TAG_TAG_HAND}, {gBattleAnimSpritePal_SmallRedEye, ANIM_TAG_SMALL_RED_EYE}, {gBattleAnimSpritePal_HollowOrb, ANIM_TAG_HOLLOW_ORB}, {gBattleAnimSpritePal_HollowOrb, ANIM_TAG_X_SIGN}, {gBattleAnimSpritePal_BluegreenOrb, ANIM_TAG_BLUEGREEN_ORB}, {gBattleAnimSpritePal_PawPrint, ANIM_TAG_PAW_PRINT}, {gBattleAnimSpritePal_PurpleFlame, ANIM_TAG_PURPLE_FLAME}, {gBattleAnimSpritePal_RedBall, ANIM_TAG_RED_BALL}, {gBattleAnimSpritePal_SmellingsaltEffect, ANIM_TAG_SMELLINGSALT_EFFECT}, {gBattleAnimSpritePal_Meteor, ANIM_TAG_METEOR}, {gBattleAnimSpritePal_FlatRock, ANIM_TAG_FLAT_ROCK}, {gBattleAnimSpritePal_MagnifyingGlass, ANIM_TAG_MAGNIFYING_GLASS}, {gBattleAnimSpritePal_BrownOrb, ANIM_TAG_BROWN_ORB}, {gBattleAnimSpritePal_MetalSoundWaves, ANIM_TAG_METAL_SOUND_WAVES}, {gBattleAnimSpritePal_FlyingDirt, ANIM_TAG_FLYING_DIRT}, {gBattleAnimSpritePal_IcicleSpear, ANIM_TAG_ICICLE_SPEAR}, {gBattleAnimSpritePal_Hail, ANIM_TAG_HAIL}, {gBattleAnimSpritePal_GlowyRedOrb, ANIM_TAG_GLOWY_RED_ORB}, {gBattleAnimSpritePal_GlowyGreenOrb, ANIM_TAG_GLOWY_GREEN_ORB}, {gBattleAnimSpritePal_GreenSpike, ANIM_TAG_GREEN_SPIKE}, {gBattleAnimSpritePal_WhiteCircleOfLight, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT}, {gBattleAnimSpritePal_GlowyBlueOrb, ANIM_TAG_GLOWY_BLUE_ORB}, {gBattleAnimSpritePal_SafariBait, ANIM_TAG_SAFARI_BAIT}, {gBattleAnimSpritePal_WhiteFeather, ANIM_TAG_WHITE_FEATHER}, {gBattleAnimSpritePal_Sparkle6, ANIM_TAG_SPARKLE_6}, {gBattleAnimSpritePal_Splash, ANIM_TAG_SPLASH}, {gBattleAnimSpritePal_Splash, ANIM_TAG_SWEAT_BEAD}, {gBattleAnimSpritePal_Gem1, ANIM_TAG_GEM_1}, {gBattleAnimSpritePal_Gem1, ANIM_TAG_GEM_2}, {gBattleAnimSpritePal_Gem1, ANIM_TAG_GEM_3}, {gBattleAnimSpritePal_SlamHit2, ANIM_TAG_SLAM_HIT_2}, {gBattleAnimSpritePal_Recycle, ANIM_TAG_RECYCLE}, {gBattleAnimSpritePal_RedParticles, ANIM_TAG_RED_PARTICLES}, {gBattleAnimSpritePal_Protect, ANIM_TAG_PROTECT}, {gBattleAnimSpritePal_DirtMound, ANIM_TAG_DIRT_MOUND}, {gBattleAnimSpritePal_Shock3, ANIM_TAG_SHOCK_3}, {gBattleAnimSpritePal_WeatherBall, ANIM_TAG_WEATHER_BALL}, {gBattleAnimSpritePal_Bird, ANIM_TAG_BIRD}, {gBattleAnimSpritePal_CrossImpact, ANIM_TAG_CROSS_IMPACT}, {gBattleAnimSpritePal_Slash2, ANIM_TAG_SLASH_2}, {gBattleAnimSpritePal_WhipHit, ANIM_TAG_WHIP_HIT}, {gBattleAnimSpritePal_BlueRing2, ANIM_TAG_BLUE_RING_2}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = { [BG_NONE] = {gBattleAnimBgImage_Dark, gBattleAnimBgPalette_Dark, gBattleAnimBgTilemap_Dark}, [BG_DARK] = {gBattleAnimBgImage_Dark, gBattleAnimBgPalette_Dark, gBattleAnimBgTilemap_Dark}, [BG_GHOST] = {gBattleAnimBgImage_Ghost, gBattleAnimBgPalette_Ghost, gBattleAnimBgTilemap_Ghost}, [BG_PSYCHIC] = {gBattleAnimBgImage_Psychic, gBattleAnimBgPalette_Psychic, gBattleAnimBgTilemap_Psychic}, [BG_IMPACT_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactOpponent}, [BG_IMPACT_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactPlayer}, [BG_IMPACT_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactContests}, [BG_DRILL] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Drill, gBattleAnimBgTilemap_Drill}, [BG_DRILL_CONTESTS] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Drill, gBattleAnimBgTilemap_DrillContests}, [BG_HIGHSPEED_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Highspeed, gBattleAnimBgTilemap_HighspeedOpponent}, [BG_HIGHSPEED_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Highspeed, gBattleAnimBgTilemap_HighspeedPlayer}, [BG_THUNDER] = {gBattleAnimBgImage_Thunder, gBattleAnimBgPalette_Thunder, gBattleAnimBgTilemap_Thunder}, [BG_GUILLOTINE_OPPONENT] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotineOpponent}, [BG_GUILLOTINE_PLAYER] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotinePlayer}, [BG_GUILLOTINE_CONTESTS] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotineContests}, [BG_ICE] = {gBattleAnimBgImage_Ice, gBattleAnimBgPalette_Ice, gBattleAnimBgTilemap_Ice}, [BG_COSMIC] = {gBattleAnimBgImage_Cosmic, gBattleAnimBgPalette_Cosmic, gBattleAnimBgTilemap_Cosmic}, [BG_IN_AIR] = {gBattleAnimBgImage_InAir, gBattleAnimBgPalette_InAir, gBattleAnimBgTilemap_InAir}, [BG_SKY] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Sky, gBattleAnimBgTilemap_Drill}, [BG_SKY_CONTESTS] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Sky, gBattleAnimBgTilemap_DrillContests}, [BG_AURORA] = {gBattleAnimBgImage_Aurora, gBattleAnimBgPalette_Aurora, gBattleAnimBgTilemap_Aurora}, [BG_FISSURE] = {gBattleAnimBgImage_Fissure, gBattleAnimBgPalette_Fissure, gBattleAnimBgTilemap_Fissure}, [BG_BUG_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedOpponent}, [BG_BUG_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedPlayer}, [BG_SOLAR_BEAM_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_SolarBeam, gBattleAnimBgTilemap_ImpactOpponent}, [BG_SOLAR_BEAM_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_SolarBeam, gBattleAnimBgTilemap_ImpactPlayer}, [BG_SOLAR_BEAM_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_SolarBeam, gBattleAnimBgTilemap_ImpactContests}, }; ================================================ FILE: src/data/battle_moves.h ================================================ const struct BattleMove gBattleMoves[MOVES_COUNT] = { [MOVE_NONE] = { .effect = EFFECT_HIT, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 0, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, }, [MOVE_POUND] = { .effect = EFFECT_HIT, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, .pp = 35, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_KARATE_CHOP] = { .effect = EFFECT_HIGH_CRITICAL, .power = 50, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_DOUBLE_SLAP] = { .effect = EFFECT_MULTI_HIT, .power = 15, .type = TYPE_NORMAL, .accuracy = 85, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_COMET_PUNCH] = { .effect = EFFECT_MULTI_HIT, .power = 18, .type = TYPE_NORMAL, .accuracy = 85, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_MEGA_PUNCH] = { .effect = EFFECT_HIT, .power = 80, .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_PAY_DAY] = { .effect = EFFECT_PAY_DAY, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_FIRE_PUNCH] = { .effect = EFFECT_BURN_HIT, .power = 75, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ICE_PUNCH] = { .effect = EFFECT_FREEZE_HIT, .power = 75, .type = TYPE_ICE, .accuracy = 100, .pp = 15, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_THUNDER_PUNCH] = { .effect = EFFECT_PARALYZE_HIT, .power = 75, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SCRATCH] = { .effect = EFFECT_HIT, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, .pp = 35, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_VICE_GRIP] = { .effect = EFFECT_HIT, .power = 55, .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_GUILLOTINE] = { .effect = EFFECT_OHKO, .power = 1, .type = TYPE_NORMAL, .accuracy = 30, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_RAZOR_WIND] = { .effect = EFFECT_RAZOR_WIND, .power = 80, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SWORDS_DANCE] = { .effect = EFFECT_ATTACK_UP_2, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_CUT] = { .effect = EFFECT_HIT, .power = 50, .type = TYPE_NORMAL, .accuracy = 95, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_GUST] = { .effect = EFFECT_GUST, .power = 40, .type = TYPE_FLYING, .accuracy = 100, .pp = 35, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_WING_ATTACK] = { .effect = EFFECT_HIT, .power = 60, .type = TYPE_FLYING, .accuracy = 100, .pp = 35, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_WHIRLWIND] = { .effect = EFFECT_ROAR, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FLY] = { .effect = EFFECT_SEMI_INVULNERABLE, .power = 70, .type = TYPE_FLYING, .accuracy = 95, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_BIND] = { .effect = EFFECT_TRAP, .power = 15, .type = TYPE_NORMAL, .accuracy = 75, .pp = 20, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SLAM] = { .effect = EFFECT_HIT, .power = 80, .type = TYPE_NORMAL, .accuracy = 75, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_VINE_WHIP] = { .effect = EFFECT_HIT, .power = 35, .type = TYPE_GRASS, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_STOMP] = { .effect = EFFECT_FLINCH_MINIMIZE_HIT, .power = 65, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_DOUBLE_KICK] = { .effect = EFFECT_DOUBLE_HIT, .power = 30, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_MEGA_KICK] = { .effect = EFFECT_HIT, .power = 120, .type = TYPE_NORMAL, .accuracy = 75, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_JUMP_KICK] = { .effect = EFFECT_RECOIL_IF_MISS, .power = 70, .type = TYPE_FIGHTING, .accuracy = 95, .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_ROLLING_KICK] = { .effect = EFFECT_FLINCH_HIT, .power = 60, .type = TYPE_FIGHTING, .accuracy = 85, .pp = 15, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SAND_ATTACK] = { .effect = EFFECT_ACCURACY_DOWN, .power = 0, .type = TYPE_GROUND, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_HEADBUTT] = { .effect = EFFECT_FLINCH_HIT, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_HORN_ATTACK] = { .effect = EFFECT_HIT, .power = 65, .type = TYPE_NORMAL, .accuracy = 100, .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_FURY_ATTACK] = { .effect = EFFECT_MULTI_HIT, .power = 15, .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_HORN_DRILL] = { .effect = EFFECT_OHKO, .power = 1, .type = TYPE_NORMAL, .accuracy = 30, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_TACKLE] = { .effect = EFFECT_HIT, .power = 35, .type = TYPE_NORMAL, .accuracy = 95, .pp = 35, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_BODY_SLAM] = { .effect = EFFECT_PARALYZE_HIT, .power = 85, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_WRAP] = { .effect = EFFECT_TRAP, .power = 15, .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_TAKE_DOWN] = { .effect = EFFECT_RECOIL, .power = 90, .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_THRASH] = { .effect = EFFECT_RAMPAGE, .power = 90, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_DOUBLE_EDGE] = { .effect = EFFECT_DOUBLE_EDGE, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_TAIL_WHIP] = { .effect = EFFECT_DEFENSE_DOWN, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_POISON_STING] = { .effect = EFFECT_POISON_HIT, .power = 15, .type = TYPE_POISON, .accuracy = 100, .pp = 35, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_TWINEEDLE] = { .effect = EFFECT_TWINEEDLE, .power = 25, .type = TYPE_BUG, .accuracy = 100, .pp = 20, .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_PIN_MISSILE] = { .effect = EFFECT_MULTI_HIT, .power = 14, .type = TYPE_BUG, .accuracy = 85, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_LEER] = { .effect = EFFECT_DEFENSE_DOWN, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_BITE] = { .effect = EFFECT_FLINCH_HIT, .power = 60, .type = TYPE_DARK, .accuracy = 100, .pp = 25, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_GROWL] = { .effect = EFFECT_ATTACK_DOWN, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ROAR] = { .effect = EFFECT_ROAR, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SING] = { .effect = EFFECT_SLEEP, .power = 0, .type = TYPE_NORMAL, .accuracy = 55, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SUPERSONIC] = { .effect = EFFECT_CONFUSE, .power = 0, .type = TYPE_NORMAL, .accuracy = 55, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SONIC_BOOM] = { .effect = EFFECT_SONICBOOM, .power = 1, .type = TYPE_NORMAL, .accuracy = 90, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_DISABLE] = { .effect = EFFECT_DISABLE, .power = 0, .type = TYPE_NORMAL, .accuracy = 55, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ACID] = { .effect = EFFECT_DEFENSE_DOWN_HIT, .power = 40, .type = TYPE_POISON, .accuracy = 100, .pp = 30, .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_EMBER] = { .effect = EFFECT_BURN_HIT, .power = 40, .type = TYPE_FIRE, .accuracy = 100, .pp = 25, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FLAMETHROWER] = { .effect = EFFECT_BURN_HIT, .power = 95, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MIST] = { .effect = EFFECT_MIST, .power = 0, .type = TYPE_ICE, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_WATER_GUN] = { .effect = EFFECT_HIT, .power = 40, .type = TYPE_WATER, .accuracy = 100, .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_HYDRO_PUMP] = { .effect = EFFECT_HIT, .power = 120, .type = TYPE_WATER, .accuracy = 80, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SURF] = { .effect = EFFECT_HIT, .power = 95, .type = TYPE_WATER, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_ICE_BEAM] = { .effect = EFFECT_FREEZE_HIT, .power = 95, .type = TYPE_ICE, .accuracy = 100, .pp = 10, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_BLIZZARD] = { .effect = EFFECT_FREEZE_HIT, .power = 120, .type = TYPE_ICE, .accuracy = 70, .pp = 5, .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_PSYBEAM] = { .effect = EFFECT_CONFUSE_HIT, .power = 65, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 20, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_BUBBLE_BEAM] = { .effect = EFFECT_SPEED_DOWN_HIT, .power = 65, .type = TYPE_WATER, .accuracy = 100, .pp = 20, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_AURORA_BEAM] = { .effect = EFFECT_ATTACK_DOWN_HIT, .power = 65, .type = TYPE_ICE, .accuracy = 100, .pp = 20, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_HYPER_BEAM] = { .effect = EFFECT_RECHARGE, .power = 150, .type = TYPE_NORMAL, .accuracy = 90, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_PECK] = { .effect = EFFECT_HIT, .power = 35, .type = TYPE_FLYING, .accuracy = 100, .pp = 35, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_DRILL_PECK] = { .effect = EFFECT_HIT, .power = 80, .type = TYPE_FLYING, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SUBMISSION] = { .effect = EFFECT_RECOIL, .power = 80, .type = TYPE_FIGHTING, .accuracy = 80, .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_LOW_KICK] = { .effect = EFFECT_LOW_KICK, .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_COUNTER] = { .effect = EFFECT_COUNTER, .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = -5, .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SEISMIC_TOSS] = { .effect = EFFECT_LEVEL_DAMAGE, .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_STRENGTH] = { .effect = EFFECT_HIT, .power = 80, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_ABSORB] = { .effect = EFFECT_ABSORB, .power = 20, .type = TYPE_GRASS, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MEGA_DRAIN] = { .effect = EFFECT_ABSORB, .power = 40, .type = TYPE_GRASS, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_LEECH_SEED] = { .effect = EFFECT_LEECH_SEED, .power = 0, .type = TYPE_GRASS, .accuracy = 90, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_GROWTH] = { .effect = EFFECT_SPECIAL_ATTACK_UP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_RAZOR_LEAF] = { .effect = EFFECT_HIGH_CRITICAL, .power = 55, .type = TYPE_GRASS, .accuracy = 95, .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SOLAR_BEAM] = { .effect = EFFECT_SOLAR_BEAM, .power = 120, .type = TYPE_GRASS, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_POISON_POWDER] = { .effect = EFFECT_POISON, .power = 0, .type = TYPE_POISON, .accuracy = 75, .pp = 35, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_STUN_SPORE] = { .effect = EFFECT_PARALYZE, .power = 0, .type = TYPE_GRASS, .accuracy = 75, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SLEEP_POWDER] = { .effect = EFFECT_SLEEP, .power = 0, .type = TYPE_GRASS, .accuracy = 75, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_PETAL_DANCE] = { .effect = EFFECT_RAMPAGE, .power = 70, .type = TYPE_GRASS, .accuracy = 100, .pp = 20, .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_STRING_SHOT] = { .effect = EFFECT_SPEED_DOWN, .power = 0, .type = TYPE_BUG, .accuracy = 95, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_DRAGON_RAGE] = { .effect = EFFECT_DRAGON_RAGE, .power = 1, .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_FIRE_SPIN] = { .effect = EFFECT_TRAP, .power = 15, .type = TYPE_FIRE, .accuracy = 70, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_THUNDER_SHOCK] = { .effect = EFFECT_PARALYZE_HIT, .power = 40, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 30, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_THUNDERBOLT] = { .effect = EFFECT_PARALYZE_HIT, .power = 95, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_THUNDER_WAVE] = { .effect = EFFECT_PARALYZE, .power = 0, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_THUNDER] = { .effect = EFFECT_THUNDER, .power = 120, .type = TYPE_ELECTRIC, .accuracy = 70, .pp = 10, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ROCK_THROW] = { .effect = EFFECT_HIT, .power = 50, .type = TYPE_ROCK, .accuracy = 90, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_EARTHQUAKE] = { .effect = EFFECT_EARTHQUAKE, .power = 100, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_FISSURE] = { .effect = EFFECT_OHKO, .power = 1, .type = TYPE_GROUND, .accuracy = 30, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_DIG] = { .effect = EFFECT_SEMI_INVULNERABLE, .power = 60, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_TOXIC] = { .effect = EFFECT_TOXIC, .power = 0, .type = TYPE_POISON, .accuracy = 85, .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_CONFUSION] = { .effect = EFFECT_CONFUSE_HIT, .power = 50, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 25, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_PSYCHIC] = { .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 90, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_HYPNOSIS] = { .effect = EFFECT_SLEEP, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 60, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MEDITATE] = { .effect = EFFECT_ATTACK_UP, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_AGILITY] = { .effect = EFFECT_SPEED_UP_2, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_QUICK_ATTACK] = { .effect = EFFECT_QUICK_ATTACK, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_RAGE] = { .effect = EFFECT_RAGE, .power = 20, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_TELEPORT] = { .effect = EFFECT_TELEPORT, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_NIGHT_SHADE] = { .effect = EFFECT_LEVEL_DAMAGE, .power = 1, .type = TYPE_GHOST, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_MIMIC] = { .effect = EFFECT_MIMIC, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, }, [MOVE_SCREECH] = { .effect = EFFECT_DEFENSE_DOWN_2, .power = 0, .type = TYPE_NORMAL, .accuracy = 85, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_DOUBLE_TEAM] = { .effect = EFFECT_EVASION_UP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_RECOVER] = { .effect = EFFECT_RESTORE_HP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_HARDEN] = { .effect = EFFECT_DEFENSE_UP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_MINIMIZE] = { .effect = EFFECT_MINIMIZE, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_SMOKESCREEN] = { .effect = EFFECT_ACCURACY_DOWN, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_CONFUSE_RAY] = { .effect = EFFECT_CONFUSE, .power = 0, .type = TYPE_GHOST, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_WITHDRAW] = { .effect = EFFECT_DEFENSE_UP, .power = 0, .type = TYPE_WATER, .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_DEFENSE_CURL] = { .effect = EFFECT_DEFENSE_CURL, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_BARRIER] = { .effect = EFFECT_DEFENSE_UP_2, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_LIGHT_SCREEN] = { .effect = EFFECT_LIGHT_SCREEN, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_HAZE] = { .effect = EFFECT_HAZE, .power = 0, .type = TYPE_ICE, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, }, [MOVE_REFLECT] = { .effect = EFFECT_REFLECT, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_FOCUS_ENERGY] = { .effect = EFFECT_FOCUS_ENERGY, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_BIDE] = { .effect = EFFECT_BIDE, .power = 1, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_METRONOME] = { .effect = EFFECT_METRONOME, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, }, [MOVE_MIRROR_MOVE] = { .effect = EFFECT_MIRROR_MOVE, .power = 0, .type = TYPE_FLYING, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, }, [MOVE_SELF_DESTRUCT] = { .effect = EFFECT_EXPLOSION, .power = 200, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_EGG_BOMB] = { .effect = EFFECT_HIT, .power = 100, .type = TYPE_NORMAL, .accuracy = 75, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_LICK] = { .effect = EFFECT_PARALYZE_HIT, .power = 20, .type = TYPE_GHOST, .accuracy = 100, .pp = 30, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SMOG] = { .effect = EFFECT_POISON_HIT, .power = 20, .type = TYPE_POISON, .accuracy = 70, .pp = 20, .secondaryEffectChance = 40, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SLUDGE] = { .effect = EFFECT_POISON_HIT, .power = 65, .type = TYPE_POISON, .accuracy = 100, .pp = 20, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_BONE_CLUB] = { .effect = EFFECT_FLINCH_HIT, .power = 65, .type = TYPE_GROUND, .accuracy = 85, .pp = 20, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FIRE_BLAST] = { .effect = EFFECT_BURN_HIT, .power = 120, .type = TYPE_FIRE, .accuracy = 85, .pp = 5, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_WATERFALL] = { .effect = EFFECT_HIT, .power = 80, .type = TYPE_WATER, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_CLAMP] = { .effect = EFFECT_TRAP, .power = 35, .type = TYPE_WATER, .accuracy = 75, .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SWIFT] = { .effect = EFFECT_ALWAYS_HIT, .power = 60, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SKULL_BASH] = { .effect = EFFECT_SKULL_BASH, .power = 100, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SPIKE_CANNON] = { .effect = EFFECT_MULTI_HIT, .power = 20, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_CONSTRICT] = { .effect = EFFECT_SPEED_DOWN_HIT, .power = 10, .type = TYPE_NORMAL, .accuracy = 100, .pp = 35, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_AMNESIA] = { .effect = EFFECT_SPECIAL_DEFENSE_UP_2, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_KINESIS] = { .effect = EFFECT_ACCURACY_DOWN, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 80, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SOFT_BOILED] = { .effect = EFFECT_SOFTBOILED, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_HI_JUMP_KICK] = { .effect = EFFECT_RECOIL_IF_MISS, .power = 85, .type = TYPE_FIGHTING, .accuracy = 90, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_GLARE] = { .effect = EFFECT_PARALYZE, .power = 0, .type = TYPE_NORMAL, .accuracy = 75, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_DREAM_EATER] = { .effect = EFFECT_DREAM_EATER, .power = 100, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_POISON_GAS] = { .effect = EFFECT_POISON, .power = 0, .type = TYPE_POISON, .accuracy = 55, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_BARRAGE] = { .effect = EFFECT_MULTI_HIT, .power = 15, .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_LEECH_LIFE] = { .effect = EFFECT_ABSORB, .power = 20, .type = TYPE_BUG, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_LOVELY_KISS] = { .effect = EFFECT_SLEEP, .power = 0, .type = TYPE_NORMAL, .accuracy = 75, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SKY_ATTACK] = { .effect = EFFECT_SKY_ATTACK, .power = 140, .type = TYPE_FLYING, .accuracy = 90, .pp = 5, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_TRANSFORM] = { .effect = EFFECT_TRANSFORM, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, }, [MOVE_BUBBLE] = { .effect = EFFECT_SPEED_DOWN_HIT, .power = 20, .type = TYPE_WATER, .accuracy = 100, .pp = 30, .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_DIZZY_PUNCH] = { .effect = EFFECT_CONFUSE_HIT, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SPORE] = { .effect = EFFECT_SLEEP, .power = 0, .type = TYPE_GRASS, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FLASH] = { .effect = EFFECT_ACCURACY_DOWN, .power = 0, .type = TYPE_NORMAL, .accuracy = 70, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_PSYWAVE] = { .effect = EFFECT_PSYWAVE, .power = 1, .type = TYPE_PSYCHIC, .accuracy = 80, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SPLASH] = { .effect = EFFECT_SPLASH, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_ACID_ARMOR] = { .effect = EFFECT_DEFENSE_UP_2, .power = 0, .type = TYPE_POISON, .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_CRABHAMMER] = { .effect = EFFECT_HIGH_CRITICAL, .power = 90, .type = TYPE_WATER, .accuracy = 85, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_EXPLOSION] = { .effect = EFFECT_EXPLOSION, .power = 250, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_FURY_SWIPES] = { .effect = EFFECT_MULTI_HIT, .power = 18, .type = TYPE_NORMAL, .accuracy = 80, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_BONEMERANG] = { .effect = EFFECT_DOUBLE_HIT, .power = 50, .type = TYPE_GROUND, .accuracy = 90, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_REST] = { .effect = EFFECT_REST, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_ROCK_SLIDE] = { .effect = EFFECT_FLINCH_HIT, .power = 75, .type = TYPE_ROCK, .accuracy = 90, .pp = 10, .secondaryEffectChance = 30, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_HYPER_FANG] = { .effect = EFFECT_FLINCH_HIT, .power = 80, .type = TYPE_NORMAL, .accuracy = 90, .pp = 15, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SHARPEN] = { .effect = EFFECT_ATTACK_UP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_CONVERSION] = { .effect = EFFECT_CONVERSION, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_TRI_ATTACK] = { .effect = EFFECT_TRI_ATTACK, .power = 80, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SUPER_FANG] = { .effect = EFFECT_SUPER_FANG, .power = 1, .type = TYPE_NORMAL, .accuracy = 90, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SLASH] = { .effect = EFFECT_HIGH_CRITICAL, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SUBSTITUTE] = { .effect = EFFECT_SUBSTITUTE, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_STRUGGLE] = { .effect = EFFECT_RECOIL, .power = 50, .type = TYPE_NORMAL, .accuracy = 100, .pp = 1, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SKETCH] = { .effect = EFFECT_SKETCH, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, }, [MOVE_TRIPLE_KICK] = { .effect = EFFECT_TRIPLE_KICK, .power = 10, .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_THIEF] = { .effect = EFFECT_THIEF, .power = 40, .type = TYPE_DARK, .accuracy = 100, .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SPIDER_WEB] = { .effect = EFFECT_MEAN_LOOK, .power = 0, .type = TYPE_BUG, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MIND_READER] = { .effect = EFFECT_LOCK_ON, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_NIGHTMARE] = { .effect = EFFECT_NIGHTMARE, .power = 0, .type = TYPE_GHOST, .accuracy = 0, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FLAME_WHEEL] = { .effect = EFFECT_THAW_HIT, .power = 60, .type = TYPE_FIRE, .accuracy = 100, .pp = 25, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SNORE] = { .effect = EFFECT_SNORE, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_CURSE] = { .effect = EFFECT_CURSE, .power = 0, .type = TYPE_MYSTERY, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, }, [MOVE_FLAIL] = { .effect = EFFECT_FLAIL, .power = 1, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_CONVERSION_2] = { .effect = EFFECT_CONVERSION_2, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_AEROBLAST] = { .effect = EFFECT_HIGH_CRITICAL, .power = 100, .type = TYPE_FLYING, .accuracy = 95, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_COTTON_SPORE] = { .effect = EFFECT_SPEED_DOWN_2, .power = 0, .type = TYPE_GRASS, .accuracy = 85, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_REVERSAL] = { .effect = EFFECT_FLAIL, .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SPITE] = { .effect = EFFECT_SPITE, .power = 0, .type = TYPE_GHOST, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_POWDER_SNOW] = { .effect = EFFECT_FREEZE_HIT, .power = 40, .type = TYPE_ICE, .accuracy = 100, .pp = 25, .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_PROTECT] = { .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, .flags = 0, }, [MOVE_MACH_PUNCH] = { .effect = EFFECT_QUICK_ATTACK, .power = 40, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SCARY_FACE] = { .effect = EFFECT_SPEED_DOWN_2, .power = 0, .type = TYPE_NORMAL, .accuracy = 90, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FAINT_ATTACK] = { .effect = EFFECT_ALWAYS_HIT, .power = 60, .type = TYPE_DARK, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SWEET_KISS] = { .effect = EFFECT_CONFUSE, .power = 0, .type = TYPE_NORMAL, .accuracy = 75, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_BELLY_DRUM] = { .effect = EFFECT_BELLY_DRUM, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_SLUDGE_BOMB] = { .effect = EFFECT_POISON_HIT, .power = 90, .type = TYPE_POISON, .accuracy = 100, .pp = 10, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MUD_SLAP] = { .effect = EFFECT_ACCURACY_DOWN_HIT, .power = 20, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_OCTAZOOKA] = { .effect = EFFECT_ACCURACY_DOWN_HIT, .power = 65, .type = TYPE_WATER, .accuracy = 85, .pp = 10, .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SPIKES] = { .effect = EFFECT_SPIKES, .power = 0, .type = TYPE_GROUND, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, .flags = 0, }, [MOVE_ZAP_CANNON] = { .effect = EFFECT_PARALYZE_HIT, .power = 100, .type = TYPE_ELECTRIC, .accuracy = 50, .pp = 5, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FORESIGHT] = { .effect = EFFECT_FORESIGHT, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_DESTINY_BOND] = { .effect = EFFECT_DESTINY_BOND, .power = 0, .type = TYPE_GHOST, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_PERISH_SONG] = { .effect = EFFECT_PERISH_SONG, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_ICY_WIND] = { .effect = EFFECT_SPEED_DOWN_HIT, .power = 55, .type = TYPE_ICE, .accuracy = 95, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_DETECT] = { .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_FIGHTING, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, .flags = 0, }, [MOVE_BONE_RUSH] = { .effect = EFFECT_MULTI_HIT, .power = 25, .type = TYPE_GROUND, .accuracy = 80, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_LOCK_ON] = { .effect = EFFECT_LOCK_ON, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_OUTRAGE] = { .effect = EFFECT_RAMPAGE, .power = 90, .type = TYPE_DRAGON, .accuracy = 100, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SANDSTORM] = { .effect = EFFECT_SANDSTORM, .power = 0, .type = TYPE_ROCK, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_GIGA_DRAIN] = { .effect = EFFECT_ABSORB, .power = 60, .type = TYPE_GRASS, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ENDURE] = { .effect = EFFECT_ENDURE, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, .flags = 0, }, [MOVE_CHARM] = { .effect = EFFECT_ATTACK_DOWN_2, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ROLLOUT] = { .effect = EFFECT_ROLLOUT, .power = 30, .type = TYPE_ROCK, .accuracy = 90, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_FALSE_SWIPE] = { .effect = EFFECT_FALSE_SWIPE, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SWAGGER] = { .effect = EFFECT_SWAGGER, .power = 0, .type = TYPE_NORMAL, .accuracy = 90, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MILK_DRINK] = { .effect = EFFECT_SOFTBOILED, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_SNATCH_AFFECTED, }, [MOVE_SPARK] = { .effect = EFFECT_PARALYZE_HIT, .power = 65, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FURY_CUTTER] = { .effect = EFFECT_FURY_CUTTER, .power = 10, .type = TYPE_BUG, .accuracy = 95, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_STEEL_WING] = { .effect = EFFECT_DEFENSE_UP_HIT, .power = 70, .type = TYPE_STEEL, .accuracy = 90, .pp = 25, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_MEAN_LOOK] = { .effect = EFFECT_MEAN_LOOK, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ATTRACT] = { .effect = EFFECT_ATTRACT, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SLEEP_TALK] = { .effect = EFFECT_SLEEP_TALK, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, }, [MOVE_HEAL_BELL] = { .effect = EFFECT_HEAL_BELL, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_RETURN] = { .effect = EFFECT_RETURN, .power = 1, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_PRESENT] = { .effect = EFFECT_PRESENT, .power = 1, .type = TYPE_NORMAL, .accuracy = 90, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FRUSTRATION] = { .effect = EFFECT_FRUSTRATION, .power = 1, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SAFEGUARD] = { .effect = EFFECT_SAFEGUARD, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_PAIN_SPLIT] = { .effect = EFFECT_PAIN_SPLIT, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SACRED_FIRE] = { .effect = EFFECT_THAW_HIT, .power = 100, .type = TYPE_FIRE, .accuracy = 95, .pp = 5, .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MAGNITUDE] = { .effect = EFFECT_MAGNITUDE, .power = 1, .type = TYPE_GROUND, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_DYNAMIC_PUNCH] = { .effect = EFFECT_CONFUSE_HIT, .power = 100, .type = TYPE_FIGHTING, .accuracy = 50, .pp = 5, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MEGAHORN] = { .effect = EFFECT_HIT, .power = 120, .type = TYPE_BUG, .accuracy = 85, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_DRAGON_BREATH] = { .effect = EFFECT_PARALYZE_HIT, .power = 60, .type = TYPE_DRAGON, .accuracy = 100, .pp = 20, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_BATON_PASS] = { .effect = EFFECT_BATON_PASS, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_ENCORE] = { .effect = EFFECT_ENCORE, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_PURSUIT] = { .effect = EFFECT_PURSUIT, .power = 40, .type = TYPE_DARK, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_RAPID_SPIN] = { .effect = EFFECT_RAPID_SPIN, .power = 20, .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SWEET_SCENT] = { .effect = EFFECT_EVASION_DOWN, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_IRON_TAIL] = { .effect = EFFECT_DEFENSE_DOWN_HIT, .power = 100, .type = TYPE_STEEL, .accuracy = 75, .pp = 15, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_METAL_CLAW] = { .effect = EFFECT_ATTACK_UP_HIT, .power = 50, .type = TYPE_STEEL, .accuracy = 95, .pp = 35, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_VITAL_THROW] = { .effect = EFFECT_VITAL_THROW, .power = 70, .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -1, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_MORNING_SUN] = { .effect = EFFECT_MORNING_SUN, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_SYNTHESIS] = { .effect = EFFECT_SYNTHESIS, .power = 0, .type = TYPE_GRASS, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_MOONLIGHT] = { .effect = EFFECT_MOONLIGHT, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_HIDDEN_POWER] = { .effect = EFFECT_HIDDEN_POWER, .power = 1, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_CROSS_CHOP] = { .effect = EFFECT_HIGH_CRITICAL, .power = 100, .type = TYPE_FIGHTING, .accuracy = 80, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_TWISTER] = { .effect = EFFECT_TWISTER, .power = 40, .type = TYPE_DRAGON, .accuracy = 100, .pp = 20, .secondaryEffectChance = 20, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_RAIN_DANCE] = { .effect = EFFECT_RAIN_DANCE, .power = 0, .type = TYPE_WATER, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_SUNNY_DAY] = { .effect = EFFECT_SUNNY_DAY, .power = 0, .type = TYPE_FIRE, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_CRUNCH] = { .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, .pp = 15, .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MIRROR_COAT] = { .effect = EFFECT_MIRROR_COAT, .power = 1, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = -5, .flags = FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_PSYCH_UP] = { .effect = EFFECT_PSYCH_UP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_EXTREME_SPEED] = { .effect = EFFECT_QUICK_ATTACK, .power = 80, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_ANCIENT_POWER] = { .effect = EFFECT_ALL_STATS_UP_HIT, .power = 60, .type = TYPE_ROCK, .accuracy = 100, .pp = 5, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SHADOW_BALL] = { .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 80, .type = TYPE_GHOST, .accuracy = 100, .pp = 15, .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FUTURE_SIGHT] = { .effect = EFFECT_FUTURE_SIGHT, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 90, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, }, [MOVE_ROCK_SMASH] = { .effect = EFFECT_DEFENSE_DOWN_HIT, .power = 20, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_WHIRLPOOL] = { .effect = EFFECT_TRAP, .power = 15, .type = TYPE_WATER, .accuracy = 70, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_BEAT_UP] = { .effect = EFFECT_BEAT_UP, .power = 10, .type = TYPE_DARK, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_FAKE_OUT] = { .effect = EFFECT_FAKE_OUT, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_UPROAR] = { .effect = EFFECT_UPROAR, .power = 50, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_STOCKPILE] = { .effect = EFFECT_STOCKPILE, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_SPIT_UP] = { .effect = EFFECT_SPIT_UP, .power = 100, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SWALLOW] = { .effect = EFFECT_SWALLOW, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_HEAT_WAVE] = { .effect = EFFECT_BURN_HIT, .power = 100, .type = TYPE_FIRE, .accuracy = 90, .pp = 10, .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_HAIL] = { .effect = EFFECT_HAIL, .power = 0, .type = TYPE_ICE, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, }, [MOVE_TORMENT] = { .effect = EFFECT_TORMENT, .power = 0, .type = TYPE_DARK, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FLATTER] = { .effect = EFFECT_FLATTER, .power = 0, .type = TYPE_DARK, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_WILL_O_WISP] = { .effect = EFFECT_WILL_O_WISP, .power = 0, .type = TYPE_FIRE, .accuracy = 75, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MEMENTO] = { .effect = EFFECT_MEMENTO, .power = 0, .type = TYPE_DARK, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FACADE] = { .effect = EFFECT_FACADE, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FOCUS_PUNCH] = { .effect = EFFECT_FOCUS_PUNCH, .power = 150, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -3, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED, }, [MOVE_SMELLING_SALT] = { .effect = EFFECT_SMELLINGSALT, .power = 60, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FOLLOW_ME] = { .effect = EFFECT_FOLLOW_ME, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, .flags = 0, }, [MOVE_NATURE_POWER] = { .effect = EFFECT_NATURE_POWER, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, }, [MOVE_CHARGE] = { .effect = EFFECT_CHARGE, .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_TAUNT] = { .effect = EFFECT_TAUNT, .power = 0, .type = TYPE_DARK, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, }, [MOVE_HELPING_HAND] = { .effect = EFFECT_HELPING_HAND, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 5, .flags = 0, }, [MOVE_TRICK] = { .effect = EFFECT_TRICK, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ROLE_PLAY] = { .effect = EFFECT_ROLE_PLAY, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, }, [MOVE_WISH] = { .effect = EFFECT_WISH, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, }, [MOVE_ASSIST] = { .effect = EFFECT_ASSIST, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, }, [MOVE_INGRAIN] = { .effect = EFFECT_INGRAIN, .power = 0, .type = TYPE_GRASS, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_SUPERPOWER] = { .effect = EFFECT_SUPERPOWER, .power = 120, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MAGIC_COAT] = { .effect = EFFECT_MAGIC_COAT, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 4, .flags = 0, }, [MOVE_RECYCLE] = { .effect = EFFECT_RECYCLE, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_REVENGE] = { .effect = EFFECT_REVENGE, .power = 60, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -4, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_BRICK_BREAK] = { .effect = EFFECT_BRICK_BREAK, .power = 75, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_YAWN] = { .effect = EFFECT_YAWN, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_KNOCK_OFF] = { .effect = EFFECT_KNOCK_OFF, .power = 20, .type = TYPE_DARK, .accuracy = 100, .pp = 20, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ENDEAVOR] = { .effect = EFFECT_ENDEAVOR, .power = 1, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_ERUPTION] = { .effect = EFFECT_ERUPTION, .power = 150, .type = TYPE_FIRE, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SKILL_SWAP] = { .effect = EFFECT_SKILL_SWAP, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_IMPRISON] = { .effect = EFFECT_IMPRISON, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, }, [MOVE_REFRESH] = { .effect = EFFECT_REFRESH, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_GRUDGE] = { .effect = EFFECT_GRUDGE, .power = 0, .type = TYPE_GHOST, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SNATCH] = { .effect = EFFECT_SNATCH, .power = 0, .type = TYPE_DARK, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 4, .flags = 0, }, [MOVE_SECRET_POWER] = { .effect = EFFECT_SECRET_POWER, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_DIVE] = { .effect = EFFECT_SEMI_INVULNERABLE, .power = 60, .type = TYPE_WATER, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_ARM_THRUST] = { .effect = EFFECT_MULTI_HIT, .power = 15, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_CAMOUFLAGE] = { .effect = EFFECT_CAMOUFLAGE, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_TAIL_GLOW] = { .effect = EFFECT_SPECIAL_ATTACK_UP_2, .power = 0, .type = TYPE_BUG, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_LUSTER_PURGE] = { .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 70, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MIST_BALL] = { .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, .power = 70, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_FEATHER_DANCE] = { .effect = EFFECT_ATTACK_DOWN_2, .power = 0, .type = TYPE_FLYING, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_TEETER_DANCE] = { .effect = EFFECT_TEETER_DANCE, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, }, [MOVE_BLAZE_KICK] = { .effect = EFFECT_BLAZE_KICK, .power = 85, .type = TYPE_FIRE, .accuracy = 90, .pp = 10, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MUD_SPORT] = { .effect = EFFECT_MUD_SPORT, .power = 0, .type = TYPE_GROUND, .accuracy = 0, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_ICE_BALL] = { .effect = EFFECT_ROLLOUT, .power = 30, .type = TYPE_ICE, .accuracy = 90, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_NEEDLE_ARM] = { .effect = EFFECT_FLINCH_MINIMIZE_HIT, .power = 60, .type = TYPE_GRASS, .accuracy = 100, .pp = 15, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SLACK_OFF] = { .effect = EFFECT_RESTORE_HP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_HYPER_VOICE] = { .effect = EFFECT_HIT, .power = 90, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_POISON_FANG] = { .effect = EFFECT_POISON_FANG, .power = 50, .type = TYPE_POISON, .accuracy = 100, .pp = 15, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_CRUSH_CLAW] = { .effect = EFFECT_DEFENSE_DOWN_HIT, .power = 75, .type = TYPE_NORMAL, .accuracy = 95, .pp = 10, .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_BLAST_BURN] = { .effect = EFFECT_RECHARGE, .power = 150, .type = TYPE_FIRE, .accuracy = 90, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_HYDRO_CANNON] = { .effect = EFFECT_RECHARGE, .power = 150, .type = TYPE_WATER, .accuracy = 90, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_METEOR_MASH] = { .effect = EFFECT_ATTACK_UP_HIT, .power = 100, .type = TYPE_STEEL, .accuracy = 85, .pp = 10, .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_ASTONISH] = { .effect = EFFECT_FLINCH_MINIMIZE_HIT, .power = 30, .type = TYPE_GHOST, .accuracy = 100, .pp = 15, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_WEATHER_BALL] = { .effect = EFFECT_WEATHER_BALL, .power = 50, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_AROMATHERAPY] = { .effect = EFFECT_HEAL_BELL, .power = 0, .type = TYPE_GRASS, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_FAKE_TEARS] = { .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2, .power = 0, .type = TYPE_DARK, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_AIR_CUTTER] = { .effect = EFFECT_HIGH_CRITICAL, .power = 55, .type = TYPE_FLYING, .accuracy = 95, .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_OVERHEAT] = { .effect = EFFECT_OVERHEAT, .power = 140, .type = TYPE_FIRE, .accuracy = 90, .pp = 5, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_ODOR_SLEUTH] = { .effect = EFFECT_FORESIGHT, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_ROCK_TOMB] = { .effect = EFFECT_SPEED_DOWN_HIT, .power = 50, .type = TYPE_ROCK, .accuracy = 80, .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SILVER_WIND] = { .effect = EFFECT_ALL_STATS_UP_HIT, .power = 60, .type = TYPE_BUG, .accuracy = 100, .pp = 5, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_METAL_SOUND] = { .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2, .power = 0, .type = TYPE_STEEL, .accuracy = 85, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_GRASS_WHISTLE] = { .effect = EFFECT_SLEEP, .power = 0, .type = TYPE_GRASS, .accuracy = 55, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_TICKLE] = { .effect = EFFECT_TICKLE, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_COSMIC_POWER] = { .effect = EFFECT_COSMIC_POWER, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_WATER_SPOUT] = { .effect = EFFECT_ERUPTION, .power = 150, .type = TYPE_WATER, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SIGNAL_BEAM] = { .effect = EFFECT_CONFUSE_HIT, .power = 75, .type = TYPE_BUG, .accuracy = 100, .pp = 15, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SHADOW_PUNCH] = { .effect = EFFECT_ALWAYS_HIT, .power = 60, .type = TYPE_GHOST, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_EXTRASENSORY] = { .effect = EFFECT_FLINCH_MINIMIZE_HIT, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 30, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_SKY_UPPERCUT] = { .effect = EFFECT_SKY_UPPERCUT, .power = 85, .type = TYPE_FIGHTING, .accuracy = 90, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SAND_TOMB] = { .effect = EFFECT_TRAP, .power = 15, .type = TYPE_GROUND, .accuracy = 70, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SHEER_COLD] = { .effect = EFFECT_OHKO, .power = 1, .type = TYPE_ICE, .accuracy = 30, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_MUDDY_WATER] = { .effect = EFFECT_ACCURACY_DOWN_HIT, .power = 95, .type = TYPE_WATER, .accuracy = 85, .pp = 10, .secondaryEffectChance = 30, .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_BULLET_SEED] = { .effect = EFFECT_MULTI_HIT, .power = 10, .type = TYPE_GRASS, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_AERIAL_ACE] = { .effect = EFFECT_ALWAYS_HIT, .power = 60, .type = TYPE_FLYING, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_ICICLE_SPEAR] = { .effect = EFFECT_MULTI_HIT, .power = 10, .type = TYPE_ICE, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_IRON_DEFENSE] = { .effect = EFFECT_DEFENSE_UP_2, .power = 0, .type = TYPE_STEEL, .accuracy = 0, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_BLOCK] = { .effect = EFFECT_MEAN_LOOK, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_HOWL] = { .effect = EFFECT_ATTACK_UP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_DRAGON_CLAW] = { .effect = EFFECT_HIT, .power = 80, .type = TYPE_DRAGON, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_FRENZY_PLANT] = { .effect = EFFECT_RECHARGE, .power = 150, .type = TYPE_GRASS, .accuracy = 90, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_BULK_UP] = { .effect = EFFECT_BULK_UP, .power = 0, .type = TYPE_FIGHTING, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_BOUNCE] = { .effect = EFFECT_SEMI_INVULNERABLE, .power = 85, .type = TYPE_FLYING, .accuracy = 85, .pp = 5, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_MUD_SHOT] = { .effect = EFFECT_SPEED_DOWN_HIT, .power = 55, .type = TYPE_GROUND, .accuracy = 95, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_POISON_TAIL] = { .effect = EFFECT_POISON_TAIL, .power = 50, .type = TYPE_POISON, .accuracy = 100, .pp = 25, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_COVET] = { .effect = EFFECT_THIEF, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, }, [MOVE_VOLT_TACKLE] = { .effect = EFFECT_DOUBLE_EDGE, .power = 120, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_MAGICAL_LEAF] = { .effect = EFFECT_ALWAYS_HIT, .power = 60, .type = TYPE_GRASS, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_WATER_SPORT] = { .effect = EFFECT_WATER_SPORT, .power = 0, .type = TYPE_WATER, .accuracy = 0, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, }, [MOVE_CALM_MIND] = { .effect = EFFECT_CALM_MIND, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_LEAF_BLADE] = { .effect = EFFECT_HIGH_CRITICAL, .power = 70, .type = TYPE_GRASS, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_DRAGON_DANCE] = { .effect = EFFECT_DRAGON_DANCE, .power = 0, .type = TYPE_DRAGON, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, }, [MOVE_ROCK_BLAST] = { .effect = EFFECT_MULTI_HIT, .power = 25, .type = TYPE_ROCK, .accuracy = 80, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_SHOCK_WAVE] = { .effect = EFFECT_ALWAYS_HIT, .power = 60, .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_WATER_PULSE] = { .effect = EFFECT_CONFUSE_HIT, .power = 60, .type = TYPE_WATER, .accuracy = 100, .pp = 20, .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, [MOVE_DOOM_DESIRE] = { .effect = EFFECT_FUTURE_SIGHT, .power = 120, .type = TYPE_STEEL, .accuracy = 85, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, }, [MOVE_PSYCHO_BOOST] = { .effect = EFFECT_OVERHEAT, .power = 140, .type = TYPE_PSYCHIC, .accuracy = 90, .pp = 5, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, }, }; ================================================ FILE: src/data/battle_tower/level_100_mons.h ================================================ const struct BattleTowerPokemonTemplate gBattleTowerLevel100Mons[] = { { .species = SPECIES_LINOONE, .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, .teamFlags = 0x42, .moves = { MOVE_SLASH, MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_SAND_ATTACK }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_SERIOUS, }, { .species = SPECIES_MIGHTYENA, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x41, .moves = { MOVE_BITE, MOVE_HOWL, MOVE_ODOR_SLEUTH, MOVE_SCARY_FACE }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_NAIVE, }, { .species = SPECIES_BEAUTIFLY, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x41, .moves = { MOVE_GIGA_DRAIN, MOVE_GUST, MOVE_STUN_SPORE, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_CAREFUL, }, { .species = SPECIES_DUSTOX, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x41, .moves = { MOVE_PSYBEAM, MOVE_GUST, MOVE_DOUBLE_TEAM, MOVE_SILVER_WIND }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_RELAXED, }, { .species = SPECIES_LOMBRE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x03, .moves = { MOVE_ASTONISH, MOVE_GROWL, MOVE_MEGA_DRAIN, MOVE_SURF }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_LONELY, }, { .species = SPECIES_NUZLEAF, .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, .teamFlags = 0x01, .moves = { MOVE_BULLET_SEED, MOVE_RAZOR_WIND, MOVE_FAINT_ATTACK, MOVE_GROWTH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_SWELLOW, .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, .teamFlags = 0x42, .moves = { MOVE_AERIAL_ACE, MOVE_GROWL, MOVE_ENDEAVOR, MOVE_FOCUS_ENERGY }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_PELIPPER, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x02, .moves = { MOVE_SURF, MOVE_WATER_SPORT, MOVE_PROTECT, MOVE_SUPERSONIC }, .evSpread = F_EV_SPREAD_SP_ATTACK, .nature = NATURE_MILD, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x42, .moves = { MOVE_MACH_PUNCH, MOVE_MEGA_DRAIN, MOVE_HEADBUTT, MOVE_STUN_SPORE }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_NINJASK, .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, .teamFlags = 0x41, .moves = { MOVE_SCRATCH, MOVE_SCREECH, MOVE_LEECH_LIFE, MOVE_FLASH }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_SERIOUS, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x01, .moves = { MOVE_BITE, MOVE_FLY, MOVE_SUPERSONIC, MOVE_HAZE }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_IMPISH, }, { .species = SPECIES_MAWILE, .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, .teamFlags = 0x03, .moves = { MOVE_VICE_GRIP, MOVE_SWEET_SCENT, MOVE_ASTONISH, MOVE_STRENGTH }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_NOSEPASS, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x01, .moves = { MOVE_ROCK_THROW, MOVE_SANDSTORM, MOVE_HARDEN, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_IMPISH, }, { .species = SPECIES_DELCATTY, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x42, .moves = { MOVE_DOUBLE_SLAP, MOVE_TAIL_WHIP, MOVE_ATTRACT, MOVE_CHARM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_BOLD, }, { .species = SPECIES_CAMERUPT, .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, .teamFlags = 0x01, .moves = { MOVE_EMBER, MOVE_TAKE_DOWN, MOVE_GROWL, MOVE_SANDSTORM }, .evSpread = F_EV_SPREAD_SP_DEFENSE, .nature = NATURE_RASH, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_ORAN_BERRY, .teamFlags = 0x01, .moves = { MOVE_POISON_GAS, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_SCREECH }, .evSpread = F_EV_SPREAD_HP, .nature = NATURE_CALM, }, { .species = SPECIES_SANDSLASH, .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, .teamFlags = 0x03, .moves = { MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_DEFENSE_CURL, MOVE_SWIFT }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_SPINDA, .heldItem = BATTLE_TOWER_ITEM_SILK_SCARF, .teamFlags = 0x42, .moves = { MOVE_UPROAR, MOVE_WATER_PULSE, MOVE_THRASH, MOVE_SAFEGUARD }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_TIMID, }, { .species = SPECIES_WHISCASH, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x01, .moves = { MOVE_TICKLE, MOVE_MUD_SPORT, MOVE_WATER_GUN, MOVE_WATER_SPORT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HASTY, }, { .species = SPECIES_CACTURNE, .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, .teamFlags = 0x01, .moves = { MOVE_POISON_STING, MOVE_PIN_MISSILE, MOVE_ABSORB, MOVE_COTTON_SPORE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_NAIVE, }, { .species = SPECIES_JIGGLYPUFF, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x42, .moves = { MOVE_SING, MOVE_ROLLOUT, MOVE_POUND, MOVE_LIGHT_SCREEN }, .evSpread = F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MARILL, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x42, .moves = { MOVE_BUBBLE_BEAM, MOVE_DEFENSE_CURL, MOVE_RAIN_DANCE, MOVE_IRON_TAIL }, .evSpread = F_EV_SPREAD_SP_DEFENSE, .nature = NATURE_QUIET, }, { .species = SPECIES_MAGNETON, .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, .teamFlags = 0x01, .moves = { MOVE_THUNDER_SHOCK, MOVE_SUPERSONIC, MOVE_FLASH, MOVE_SCREECH }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_CAREFUL, }, { .species = SPECIES_CARVANHA, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x01, .moves = { MOVE_BITE, MOVE_RAGE, MOVE_SCARY_FACE, MOVE_LEER }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_QUIRKY, }, { .species = SPECIES_KECLEON, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x03, .moves = { MOVE_THIEF, MOVE_LICK, MOVE_BIND, MOVE_FURY_SWIPES }, .evSpread = F_EV_SPREAD_DEFENSE, .nature = NATURE_JOLLY, }, { .species = SPECIES_NINETALES, .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, .teamFlags = 0x02, .moves = { MOVE_EMBER, MOVE_CONFUSE_RAY, MOVE_FIRE_SPIN, MOVE_SAFEGUARD }, .evSpread = F_EV_SPREAD_SP_ATTACK, .nature = NATURE_LONELY, }, { .species = SPECIES_RAICHU, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x42, .moves = { MOVE_SHOCK_WAVE, MOVE_GROWL, MOVE_DOUBLE_TEAM, MOVE_LIGHT_SCREEN }, .evSpread = F_EV_SPREAD_DEFENSE, .nature = NATURE_NAIVE, }, { .species = SPECIES_SEALEO, .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, .teamFlags = 0x01, .moves = { MOVE_ICE_BALL, MOVE_WATER_GUN, MOVE_ENCORE, MOVE_HAIL }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_LAX, }, { .species = SPECIES_GRAVELER, .heldItem = BATTLE_TOWER_ITEM_HARD_STONE, .teamFlags = 0x01, .moves = { MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_SANDSTORM, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_SHUPPET, .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, .teamFlags = 0x03, .moves = { MOVE_NIGHT_SHADE, MOVE_WILL_O_WISP, MOVE_SCREECH, MOVE_KNOCK_OFF }, .evSpread = F_EV_SPREAD_SP_ATTACK, .nature = NATURE_QUIET, }, { .species = SPECIES_LUVDISC, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x0A, .moves = { MOVE_ATTRACT, MOVE_FLAIL, MOVE_SWEET_KISS, MOVE_WATER_PULSE }, .evSpread = F_EV_SPREAD_SP_ATTACK, .nature = NATURE_ADAMANT, }, { .species = SPECIES_LANTURN, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0x0A, .moves = { MOVE_THUNDER_WAVE, MOVE_SUPERSONIC, MOVE_WATER_GUN, MOVE_SPARK }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_BOLD, }, { .species = SPECIES_CORSOLA, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x0A, .moves = { MOVE_MIRROR_COAT, MOVE_BUBBLE, MOVE_HARDEN, MOVE_LIGHT_SCREEN }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_TIMID, }, { .species = SPECIES_WAILMER, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x05, .moves = { MOVE_SURF, MOVE_ROAR, MOVE_GROWL, MOVE_MIST }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_RHYDON, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x05, .moves = { MOVE_TAKE_DOWN, MOVE_SCARY_FACE, MOVE_TAIL_WHIP, MOVE_ROAR }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_DODRIO, .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, .teamFlags = 0x05, .moves = { MOVE_FURY_ATTACK, MOVE_PURSUIT, MOVE_AERIAL_ACE, MOVE_AGILITY }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_GOLDUCK, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x05, .moves = { MOVE_FURY_SWIPES, MOVE_TAIL_WHIP, MOVE_DISABLE, MOVE_PSYCH_UP }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_BELLOSSOM, .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, .teamFlags = 0x0A, .moves = { MOVE_GIGA_DRAIN, MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_ACID }, .evSpread = F_EV_SPREAD_SP_ATTACK, .nature = NATURE_BOLD, }, { .species = SPECIES_TROPIUS, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x05, .moves = { MOVE_STOMP, MOVE_RAZOR_LEAF, MOVE_GUST, MOVE_SYNTHESIS }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_SABLEYE, .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, .teamFlags = 0x0A, .moves = { MOVE_NIGHT_SHADE, MOVE_FAKE_OUT, MOVE_PSYCH_UP, MOVE_DETECT }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x03, .moves = { MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_SPARK, MOVE_SELF_DESTRUCT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_QUIRKY, }, { .species = SPECIES_TENTACRUEL, .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, .teamFlags = 0x01, .moves = { MOVE_ACID, MOVE_WATER_PULSE, MOVE_BARRIER, MOVE_WRAP }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_HASTY, }, { .species = SPECIES_CLAYDOL, .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, .teamFlags = 0x05, .moves = { MOVE_ANCIENT_POWER, MOVE_MUD_SLAP, MOVE_RAPID_SPIN, MOVE_CONFUSION }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_QUIET, }, { .species = SPECIES_GRUMPIG, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x0A, .moves = { MOVE_PSYBEAM, MOVE_PSYCH_UP, MOVE_BOUNCE, MOVE_MAGIC_COAT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_CRAWDAUNT, .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, .teamFlags = 0x05, .moves = { MOVE_CRABHAMMER, MOVE_BUBBLE_BEAM, MOVE_BRICK_BREAK, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_CALM, }, { .species = SPECIES_SEVIPER, .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, .teamFlags = 0x01, .moves = { MOVE_POISON_TAIL, MOVE_GLARE, MOVE_WRAP, MOVE_THIEF }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_CAREFUL, }, { .species = SPECIES_ZANGOOSE, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x05, .moves = { MOVE_FURY_CUTTER, MOVE_LEER, MOVE_QUICK_ATTACK, MOVE_DETECT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_ALTARIA, .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, .teamFlags = 0x03, .moves = { MOVE_DRAGON_BREATH, MOVE_SING, MOVE_SAFEGUARD, MOVE_TAKE_DOWN }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_ROSELIA, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x0A, .moves = { MOVE_LEECH_SEED, MOVE_MEGA_DRAIN, MOVE_GROWTH, MOVE_STUN_SPORE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_VOLBEAT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x09, .moves = { MOVE_SIGNAL_BEAM, MOVE_CONFUSE_RAY, MOVE_DOUBLE_TEAM, MOVE_LIGHT_SCREEN }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_ILLUMISE, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x09, .moves = { MOVE_CHARM, MOVE_ENCORE, MOVE_SOLAR_BEAM, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_MAGNET, .teamFlags = 0x03, .moves = { MOVE_BITE, MOVE_HOWL, MOVE_THUNDER_WAVE, MOVE_SPARK }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_SERIOUS, }, { .species = SPECIES_MAWILE, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x0A, .moves = { MOVE_CRUNCH, MOVE_IRON_DEFENSE, MOVE_TORMENT, MOVE_SANDSTORM }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_RASH, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x05, .moves = { MOVE_ARM_THRUST, MOVE_FAKE_OUT, MOVE_WHIRLWIND, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_SKARMORY, .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, .teamFlags = 0x01, .moves = { MOVE_STEEL_WING, MOVE_AGILITY, MOVE_TAUNT, MOVE_FLY }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_NAIVE, }, { .species = SPECIES_TORKOAL, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x03, .moves = { MOVE_FIRE_SPIN, MOVE_SMOKESCREEN, MOVE_BODY_SLAM, MOVE_AMNESIA }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_MILD, }, { .species = SPECIES_GYARADOS, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x05, .moves = { MOVE_THRASH, MOVE_DRAGON_RAGE, MOVE_TWISTER, MOVE_HYDRO_PUMP }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIRKY, }, { .species = SPECIES_MIGHTYENA, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x05, .moves = { MOVE_CRUNCH, MOVE_HOWL, MOVE_IRON_TAIL, MOVE_TORMENT }, .evSpread = F_EV_SPREAD_SP_ATTACK, .nature = NATURE_QUIRKY, }, { .species = SPECIES_LINOONE, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0x06, .moves = { MOVE_SLASH, MOVE_ATTRACT, MOVE_SHOCK_WAVE, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_MASQUERAIN, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x0A, .moves = { MOVE_TOXIC, MOVE_STUN_SPORE, MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_LAX, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x06, .moves = { MOVE_BULLET_SEED, MOVE_SLAM, MOVE_SCREECH, MOVE_DETECT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_RELAXED, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x06, .moves = { MOVE_DOUBLE_KICK, MOVE_FLAMETHROWER, MOVE_DOUBLE_TEAM, MOVE_ROAR }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x49, .moves = { MOVE_SURF, MOVE_MUD_SHOT, MOVE_MUD_SPORT, MOVE_RAIN_DANCE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_SALAMENCE, .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, .teamFlags = 0x49, .moves = { MOVE_DRAGON_BREATH, MOVE_FLY, MOVE_TOXIC, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_CALM, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x49, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_SMOKESCREEN, MOVE_RAIN_DANCE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_SERIOUS, }, { .species = SPECIES_CORSOLA, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x03, .moves = { MOVE_ANCIENT_POWER, MOVE_MIRROR_COAT, MOVE_SAFEGUARD, MOVE_REFLECT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_BOLD, }, { .species = SPECIES_RHYDON, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x41, .moves = { MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_ROAR, MOVE_THUNDERBOLT }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x06, .moves = { MOVE_MEGAHORN, MOVE_COUNTER, MOVE_PROTECT, MOVE_LEER }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_GIRAFARIG, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x09, .moves = { MOVE_PSYCHIC, MOVE_CRUNCH, MOVE_BATON_PASS, MOVE_AGILITY }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_XATU, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x09, .moves = { MOVE_PSYCHIC, MOVE_FLY, MOVE_CONFUSE_RAY, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_BASHFUL, }, { .species = SPECIES_DODRIO, .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, .teamFlags = 0x03, .moves = { MOVE_DRILL_PECK, MOVE_TRI_ATTACK, MOVE_PURSUIT, MOVE_TORMENT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SERIOUS, }, { .species = SPECIES_VILEPLUME, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x89, .moves = { MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER, MOVE_PETAL_DANCE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_MODEST, }, { .species = SPECIES_MEDICHAM, .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, .teamFlags = 0x06, .moves = { MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_BULK_UP, MOVE_PSYCHIC }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_JOLLY, }, { .species = SPECIES_ABSOL, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x06, .moves = { MOVE_SLASH, MOVE_SWORDS_DANCE, MOVE_DOUBLE_TEAM, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_DUSCLOPS, .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, .teamFlags = 0x4B, .moves = { MOVE_CONFUSE_RAY, MOVE_WILL_O_WISP, MOVE_NIGHT_SHADE, MOVE_DISABLE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_LAX, }, { .species = SPECIES_SHUPPET, .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, .teamFlags = 0x43, .moves = { MOVE_GRUDGE, MOVE_SHADOW_BALL, MOVE_CURSE, MOVE_KNOCK_OFF }, .evSpread = F_EV_SPREAD_SP_ATTACK, .nature = NATURE_IMPISH, }, { .species = SPECIES_CASTFORM, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x82, .moves = { MOVE_WEATHER_BALL, MOVE_HAIL, MOVE_SUNNY_DAY, MOVE_RAIN_DANCE }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_MODEST, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, .teamFlags = 0x02, .moves = { MOVE_SURF, MOVE_REFRESH, MOVE_RECOVER, MOVE_RAIN_DANCE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_ADAMANT, }, { .species = SPECIES_SHARPEDO, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x01, .moves = { MOVE_CRUNCH, MOVE_FOCUS_ENERGY, MOVE_SCARY_FACE, MOVE_SCREECH }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_LAX, }, { .species = SPECIES_FLYGON, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0x06, .moves = { MOVE_EARTHQUAKE, MOVE_SAND_ATTACK, MOVE_DRAGON_BREATH, MOVE_SAND_TOMB }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_TRAPINCH, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x09, .moves = { MOVE_TOXIC, MOVE_SAND_TOMB, MOVE_CRUNCH, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_LUNATONE, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x43, .moves = { MOVE_PSYCHIC, MOVE_ROCK_THROW, MOVE_HYPNOSIS, MOVE_LIGHT_SCREEN }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_SOLROCK, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x43, .moves = { MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_COSMIC_POWER, MOVE_CALM_MIND }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_QUIET, }, { .species = SPECIES_BALTOY, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x43, .moves = { MOVE_PSYCHIC, MOVE_EARTHQUAKE, MOVE_REFLECT, MOVE_SELF_DESTRUCT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_BASHFUL, }, { .species = SPECIES_CRAWDAUNT, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x06, .moves = { MOVE_CRABHAMMER, MOVE_SURF, MOVE_PROTECT, MOVE_BRICK_BREAK }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_RASH, }, { .species = SPECIES_WHISCASH, .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, .teamFlags = 0x06, .moves = { MOVE_EARTHQUAKE, MOVE_TICKLE, MOVE_AMNESIA, MOVE_SURF }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_SEVIPER, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x09, .moves = { MOVE_POISON_TAIL, MOVE_CRUNCH, MOVE_GIGA_DRAIN, MOVE_HAZE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_MAGCARGO, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x89, .moves = { MOVE_FLAMETHROWER, MOVE_LIGHT_SCREEN, MOVE_AMNESIA, MOVE_ROCK_SLIDE }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, .teamFlags = 0x09, .moves = { MOVE_KARATE_CHOP, MOVE_SEISMIC_TOSS, MOVE_BRICK_BREAK, MOVE_LOW_KICK }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_SWALOT, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x86, .moves = { MOVE_YAWN, MOVE_WATER_PULSE, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x0C, .moves = { MOVE_LEAF_BLADE, MOVE_GIGA_DRAIN, MOVE_FURY_CUTTER, MOVE_DETECT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x0C, .moves = { MOVE_BLAZE_KICK, MOVE_FLAMETHROWER, MOVE_PROTECT, MOVE_QUICK_ATTACK }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x4C, .moves = { MOVE_SURF, MOVE_MUD_SHOT, MOVE_MUD_SLAP, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MIGHTYENA, .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, .teamFlags = 0x04, .moves = { MOVE_CRUNCH, MOVE_HOWL, MOVE_SWAGGER, MOVE_SHADOW_BALL }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_CALM, }, { .species = SPECIES_LINOONE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x04, .moves = { MOVE_SLASH, MOVE_REST, MOVE_BELLY_DRUM, MOVE_THUNDERBOLT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_MILD, }, { .species = SPECIES_BEAUTIFLY, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x08, .moves = { MOVE_GIGA_DRAIN, MOVE_ATTRACT, MOVE_MORNING_SUN, MOVE_STUN_SPORE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_DUSTOX, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x08, .moves = { MOVE_PSYCHIC, MOVE_SILVER_WIND, MOVE_MOONLIGHT, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x0C, .moves = { MOVE_FAKE_OUT, MOVE_HYDRO_PUMP, MOVE_ICE_BEAM, MOVE_UPROAR }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_SHIFTRY, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x0C, .moves = { MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_TORMENT, MOVE_SWAGGER }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_SWELLOW, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x88, .moves = { MOVE_FLY, MOVE_ENDEAVOR, MOVE_AERIAL_ACE, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_GARDEVOIR, .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, .teamFlags = 0x4A, .moves = { MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_PSYCHIC, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_CAREFUL, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x0C, .moves = { MOVE_DYNAMIC_PUNCH, MOVE_MIND_READER, MOVE_SNATCH, MOVE_MEGA_DRAIN }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_VIGOROTH, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x04, .moves = { MOVE_SLASH, MOVE_UPROAR, MOVE_ENCORE, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_CALM, }, { .species = SPECIES_NINJASK, .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, .teamFlags = 0x04, .moves = { MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, MOVE_SWORDS_DANCE, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_SASSY, }, { .species = SPECIES_SHEDINJA, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0xCA, .moves = { MOVE_CONFUSE_RAY, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_GRUDGE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_JOLLY, }, { .species = SPECIES_LOUDRED, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x04, .moves = { MOVE_HYPER_VOICE, MOVE_HOWL, MOVE_SHADOW_BALL, MOVE_TORMENT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x04, .moves = { MOVE_ARM_THRUST, MOVE_BULK_UP, MOVE_BRICK_BREAK, MOVE_HIDDEN_POWER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_BASHFUL, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, .teamFlags = 0x88, .moves = { MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_FUTURE_SIGHT, MOVE_DISABLE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0x88, .moves = { MOVE_CONFUSE_RAY, MOVE_TOXIC, MOVE_MEAN_LOOK, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MAWILE, .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, .teamFlags = 0x04, .moves = { MOVE_CRUNCH, MOVE_IRON_DEFENSE, MOVE_FAKE_TEARS, MOVE_POISON_FANG }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_NAIVE, }, { .species = SPECIES_AGGRON, .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, .teamFlags = 0x45, .moves = { MOVE_METAL_CLAW, MOVE_FLAMETHROWER, MOVE_METAL_SOUND, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_GOLEM, .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, .teamFlags = 0xC5, .moves = { MOVE_ROLLOUT, MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, MOVE_SELF_DESTRUCT }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_MAGNET, .teamFlags = 0x04, .moves = { MOVE_THUNDER, MOVE_RAIN_DANCE, MOVE_THUNDER_WAVE, MOVE_CHARGE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_VOLBEAT, .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, .teamFlags = 0x08, .moves = { MOVE_CONFUSE_RAY, MOVE_SIGNAL_BEAM, MOVE_MOONLIGHT, MOVE_TAIL_GLOW }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_ILLUMISE, .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, .teamFlags = 0x08, .moves = { MOVE_THUNDERBOLT, MOVE_FLATTER, MOVE_WISH, MOVE_ENCORE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_MASQUERAIN, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x88, .moves = { MOVE_GIGA_DRAIN, MOVE_SILVER_WIND, MOVE_STUN_SPORE, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_NAIVE, }, { .species = SPECIES_ROSELIA, .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, .teamFlags = 0x08, .moves = { MOVE_PETAL_DANCE, MOVE_GROWTH, MOVE_SYNTHESIS, MOVE_GRASS_WHISTLE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_IMPISH, }, { .species = SPECIES_DELCATTY, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x08, .moves = { MOVE_SING, MOVE_ATTRACT, MOVE_DOUBLE_SLAP, MOVE_HEAL_BELL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_TIMID, }, { .species = SPECIES_SEAKING, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x88, .moves = { MOVE_RAIN_DANCE, MOVE_SURF, MOVE_ATTRACT, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_BRAVE, }, { .species = SPECIES_GYARADOS, .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, .teamFlags = 0x8C, .moves = { MOVE_HYDRO_PUMP, MOVE_EARTHQUAKE, MOVE_DRAGON_RAGE, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_CALM, }, { .species = SPECIES_SWALOT, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x42, .moves = { MOVE_STOCKPILE, MOVE_SWALLOW, MOVE_SPIT_UP, MOVE_YAWN }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_MAGCARGO, .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, .teamFlags = 0x41, .moves = { MOVE_ROCK_SLIDE, MOVE_FIRE_BLAST, MOVE_BODY_SLAM, MOVE_LIGHT_SCREEN }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_LONELY, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, .teamFlags = 0xC3, .moves = { MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ACID_ARMOR, MOVE_DISABLE }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_SPINDA, .heldItem = BATTLE_TOWER_ITEM_SILK_SCARF, .teamFlags = 0x42, .moves = { MOVE_DIZZY_PUNCH, MOVE_TEETER_DANCE, MOVE_PSYCH_UP, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_MODEST, }, { .species = SPECIES_ALTARIA, .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, .teamFlags = 0x03, .moves = { MOVE_DRAGON_CLAW, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE, MOVE_REFRESH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_RASH, }, { .species = SPECIES_ZANGOOSE, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x03, .moves = { MOVE_CRUSH_CLAW, MOVE_TAUNT, MOVE_SWORDS_DANCE, MOVE_DETECT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIRKY, }, { .species = SPECIES_SEVIPER, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x41, .moves = { MOVE_SWAGGER, MOVE_TAUNT, MOVE_GLARE, MOVE_POISON_TAIL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_GRUMPIG, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x42, .moves = { MOVE_TOXIC, MOVE_BOUNCE, MOVE_CONFUSE_RAY, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_CACTURNE, .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, .teamFlags = 0x41, .moves = { MOVE_NEEDLE_ARM, MOVE_INGRAIN, MOVE_SPIKES, MOVE_COTTON_SPORE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_SASSY, }, { .species = SPECIES_CLAYDOL, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x03, .moves = { MOVE_EARTHQUAKE, MOVE_SANDSTORM, MOVE_COSMIC_POWER, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_TENTACRUEL, .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, .teamFlags = 0xC1, .moves = { MOVE_SLUDGE_BOMB, MOVE_HYDRO_PUMP, MOVE_BARRIER, MOVE_SUPERSONIC }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WIGGLYTUFF, .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, .teamFlags = 0xC3, .moves = { MOVE_SING, MOVE_FOCUS_PUNCH, MOVE_DISABLE, MOVE_FACADE }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_AZUMARILL, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0xC2, .moves = { MOVE_SURF, MOVE_ATTRACT, MOVE_DEFENSE_CURL, MOVE_ROLLOUT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_RASH, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0xC3, .moves = { MOVE_THUNDERBOLT, MOVE_MIRROR_COAT, MOVE_LIGHT_SCREEN, MOVE_SELF_DESTRUCT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x42, .moves = { MOVE_HYDRO_PUMP, MOVE_ATTRACT, MOVE_RECOVER, MOVE_REFRESH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_JOLLY, }, { .species = SPECIES_KECLEON, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x43, .moves = { MOVE_SKILL_SWAP, MOVE_ANCIENT_POWER, MOVE_WATER_PULSE, MOVE_THUNDERBOLT }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_DUSCLOPS, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x43, .moves = { MOVE_CONFUSE_RAY, MOVE_CURSE, MOVE_REST, MOVE_MEAN_LOOK }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_BASHFUL, }, { .species = SPECIES_ABSOL, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x41, .moves = { MOVE_SLASH, MOVE_SWORDS_DANCE, MOVE_DOUBLE_TEAM, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_NINETALES, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0xC2, .moves = { MOVE_FLAMETHROWER, MOVE_CONFUSE_RAY, MOVE_DOUBLE_TEAM, MOVE_WILL_O_WISP }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_TIMID, }, { .species = SPECIES_PIKACHU, .heldItem = BATTLE_TOWER_ITEM_LIGHT_BALL, .teamFlags = 0xC2, .moves = { MOVE_THUNDER_WAVE, MOVE_THUNDER, MOVE_RAIN_DANCE, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_VILEPLUME, .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, .teamFlags = 0xC3, .moves = { MOVE_GIGA_DRAIN, MOVE_SLEEP_POWDER, MOVE_MOONLIGHT, MOVE_SLUDGE_BOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_DONPHAN, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x41, .moves = { MOVE_EARTHQUAKE, MOVE_DOUBLE_EDGE, MOVE_IRON_TAIL, MOVE_FISSURE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIRKY, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0xC3, .moves = { MOVE_CONFUSE_RAY, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HASTY, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, .teamFlags = 0x43, .moves = { MOVE_ICE_BEAM, MOVE_BODY_SLAM, MOVE_ENCORE, MOVE_HAIL }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_RELICANTH, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x41, .moves = { MOVE_YAWN, MOVE_MUD_SPORT, MOVE_DOUBLE_EDGE, MOVE_SANDSTORM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_LONELY, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x43, .moves = { MOVE_RAIN_DANCE, MOVE_ICE_BEAM, MOVE_HYDRO_PUMP, MOVE_AGILITY }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_CRADILY, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x43, .moves = { MOVE_CONFUSE_RAY, MOVE_INGRAIN, MOVE_ANCIENT_POWER, MOVE_GIGA_DRAIN }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_MILD, }, { .species = SPECIES_ARMALDO, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x43, .moves = { MOVE_SLASH, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE, MOVE_WATER_PULSE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_METAGROSS, .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, .teamFlags = 0x41, .moves = { MOVE_METAL_CLAW, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN, MOVE_AGILITY }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_SALAMENCE, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x42, .moves = { MOVE_DRAGON_BREATH, MOVE_CRUNCH, MOVE_FLAMETHROWER, MOVE_AERIAL_ACE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HASTY, }, { .species = SPECIES_MIGHTYENA, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x01, .moves = { MOVE_CRUNCH, MOVE_YAWN, MOVE_FACADE, MOVE_HOWL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_LINOONE, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x02, .moves = { MOVE_HYPER_BEAM, MOVE_FACADE, MOVE_ATTRACT, MOVE_TRICK }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x03, .moves = { MOVE_SURF, MOVE_FOCUS_PUNCH, MOVE_FAKE_OUT, MOVE_SYNTHESIS }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_TIMID, }, { .species = SPECIES_EXPLOUD, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x01, .moves = { MOVE_UPROAR, MOVE_EARTHQUAKE, MOVE_ICE_BEAM, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_SWELLOW, .heldItem = BATTLE_TOWER_ITEM_LANSAT_BERRY, .teamFlags = 0x02, .moves = { MOVE_FACADE, MOVE_SUPERSONIC, MOVE_WING_ATTACK, MOVE_ENDEAVOR }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_PELIPPER, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x82, .moves = { MOVE_STOCKPILE, MOVE_SWALLOW, MOVE_SPIT_UP, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x01, .moves = { MOVE_DYNAMIC_PUNCH, MOVE_COUNTER, MOVE_BULK_UP, MOVE_MIND_READER }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_SHEDINJA, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x01, .moves = { MOVE_RETURN, MOVE_DOUBLE_TEAM, MOVE_TOXIC, MOVE_SHADOW_BALL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_EXPLOUD, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x01, .moves = { MOVE_HYPER_BEAM, MOVE_SUPERSONIC, MOVE_FLAMETHROWER, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x01, .moves = { MOVE_CROSS_CHOP, MOVE_COUNTER, MOVE_FACADE, MOVE_FAKE_OUT }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x83, .moves = { MOVE_PSYCHIC, MOVE_ENCORE, MOVE_DISABLE, MOVE_RECOVER }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x81, .moves = { MOVE_CONFUSE_RAY, MOVE_AIR_CUTTER, MOVE_TORMENT, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_SABLEYE, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x83, .moves = { MOVE_TOXIC, MOVE_DETECT, MOVE_RECOVER, MOVE_TORMENT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_RELAXED, }, { .species = SPECIES_MAWILE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x02, .moves = { MOVE_CRUNCH, MOVE_SWORDS_DANCE, MOVE_IRON_DEFENSE, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_AGGRON, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x01, .moves = { MOVE_DOUBLE_EDGE, MOVE_IRON_DEFENSE, MOVE_ROAR, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_GOLEM, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x01, .moves = { MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_FLAMETHROWER, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_NOSEPASS, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x81, .moves = { MOVE_THUNDER_WAVE, MOVE_ROCK_SLIDE, MOVE_TORMENT, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x02, .moves = { MOVE_THUNDER, MOVE_CRUNCH, MOVE_THUNDER_WAVE, MOVE_QUICK_ATTACK }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_JOLLY, }, { .species = SPECIES_ROSELIA, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x82, .moves = { MOVE_GRASS_WHISTLE, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_GROWTH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_DELCATTY, .heldItem = BATTLE_TOWER_ITEM_STARF_BERRY, .teamFlags = 0x02, .moves = { MOVE_ASSIST, MOVE_SING, MOVE_ATTRACT, MOVE_SUBSTITUTE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_TROPIUS, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0xC2, .moves = { MOVE_RAZOR_LEAF, MOVE_EARTHQUAKE, MOVE_ATTRACT, MOVE_SYNTHESIS }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_JOLLY, }, { .species = SPECIES_SWALOT, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x03, .moves = { MOVE_YAWN, MOVE_SLUDGE_BOMB, MOVE_ATTRACT, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, .teamFlags = 0x01, .moves = { MOVE_CROSS_CHOP, MOVE_BULK_UP, MOVE_LOW_KICK, MOVE_BRICK_BREAK }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_BASHFUL, }, { .species = SPECIES_CAMERUPT, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x40, .moves = { MOVE_ERUPTION, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_OVERHEAT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_MAGCARGO, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x03, .moves = { MOVE_FLAMETHROWER, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE, MOVE_REFLECT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WEEZING, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x81, .moves = { MOVE_WILL_O_WISP, MOVE_HYPER_BEAM, MOVE_THUNDERBOLT, MOVE_DESTINY_BOND }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_SPINDA, .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, .teamFlags = 0x82, .moves = { MOVE_TRICK, MOVE_TEETER_DANCE, MOVE_FOCUS_PUNCH, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_TIMID, }, { .species = SPECIES_SKARMORY, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x01, .moves = { MOVE_DRILL_PECK, MOVE_STEEL_WING, MOVE_TORMENT, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_ALTARIA, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x02, .moves = { MOVE_SING, MOVE_DRAGON_CLAW, MOVE_ICE_BEAM, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_GRUMPIG, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x82, .moves = { MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_CALM_MIND, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_SHIFTRY, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x20, .moves = { MOVE_SWAGGER, MOVE_FRUSTRATION, MOVE_ATTRACT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_CLAYDOL, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x20, .moves = { MOVE_COSMIC_POWER, MOVE_PSYCHIC, MOVE_EARTHQUAKE, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x33, .moves = { MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_BELLY_DRUM, MOVE_REST }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_NOSEPASS, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x20, .moves = { MOVE_ROCK_SLIDE, MOVE_THUNDER_WAVE, MOVE_EARTHQUAKE, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_DUSCLOPS, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x33, .moves = { MOVE_SHADOW_PUNCH, MOVE_WILL_O_WISP, MOVE_CONFUSE_RAY, MOVE_DESTINY_BOND }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SASSY, }, { .species = SPECIES_SEAKING, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0x20, .moves = { MOVE_HORN_DRILL, MOVE_AGILITY, MOVE_SLEEP_TALK, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_CAMERUPT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x73, .moves = { MOVE_EARTHQUAKE, MOVE_ERUPTION, MOVE_ROCK_SLIDE, MOVE_FISSURE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_LANTURN, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x13, .moves = { MOVE_THUNDERBOLT, MOVE_SURF, MOVE_THUNDER_WAVE, MOVE_CONFUSE_RAY }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_WEEZING, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x33, .moves = { MOVE_SLUDGE_BOMB, MOVE_THUNDERBOLT, MOVE_FIRE_BLAST, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WHISCASH, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0x20, .moves = { MOVE_EARTHQUAKE, MOVE_SURF, MOVE_SPARK, MOVE_FISSURE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_AGGRON, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x51, .moves = { MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_SURF, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_KECLEON, .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, .teamFlags = 0x12, .moves = { MOVE_TRICK, MOVE_FOCUS_PUNCH, MOVE_ATTRACT, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_MILD, }, { .species = SPECIES_SHARPEDO, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x11, .moves = { MOVE_CRUNCH, MOVE_DOUBLE_EDGE, MOVE_SURF, MOVE_SWAGGER }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_ABSOL, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x12, .moves = { MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_SWORDS_DANCE, MOVE_QUICK_ATTACK }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WAILORD, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0x72, .moves = { MOVE_HYDRO_PUMP, MOVE_EARTHQUAKE, MOVE_ATTRACT, MOVE_FISSURE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_TIMID, }, { .species = SPECIES_TENTACRUEL, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x20, .moves = { MOVE_HYDRO_PUMP, MOVE_SLUDGE_BOMB, MOVE_BARRIER, MOVE_MIRROR_COAT }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_JOLLY, }, { .species = SPECIES_SABLEYE, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x32, .moves = { MOVE_SHADOW_BALL, MOVE_TOXIC, MOVE_RECOVER, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WOBBUFFET, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x20, .moves = { MOVE_ENCORE, MOVE_COUNTER, MOVE_MIRROR_COAT, MOVE_DESTINY_BOND }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_MILD, }, { .species = SPECIES_RHYDON, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x71, .moves = { MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_BRICK_BREAK, MOVE_HORN_DRILL }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_GLALIE, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x31, .moves = { MOVE_CRUNCH, MOVE_BLIZZARD, MOVE_HAIL, MOVE_SHEER_COLD }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_BASHFUL, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x8C, .moves = { MOVE_LEAF_BLADE, MOVE_EARTHQUAKE, MOVE_DRAGON_CLAW, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_QUIET, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x8C, .moves = { MOVE_BLAZE_KICK, MOVE_COUNTER, MOVE_ENDURE, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x8C, .moves = { MOVE_SURF, MOVE_EARTHQUAKE, MOVE_MIRROR_COAT, MOVE_BLIZZARD }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_GARDEVOIR, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x1A, .moves = { MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_DESTINY_BOND, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_BRAVE, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x15, .moves = { MOVE_SPORE, MOVE_FOCUS_PUNCH, MOVE_MACH_PUNCH, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x58, .moves = { MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_RECOVER }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_HASTY, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x15, .moves = { MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FAKE_OUT }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_GYARADOS, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x55, .moves = { MOVE_HYPER_BEAM, MOVE_EARTHQUAKE, MOVE_SURF, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_BOLD, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x58, .moves = { MOVE_SLUDGE_BOMB, MOVE_CONFUSE_RAY, MOVE_AIR_CUTTER, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x5D, .moves = { MOVE_CROSS_CHOP, MOVE_FLAMETHROWER, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x1A, .moves = { MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_ROAR, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x60, .moves = { MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_MIRROR_COAT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_BASHFUL, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x64, .moves = { MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_FLYGON, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x1C, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FLAMETHROWER, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_TIMID, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x5C, .moves = { MOVE_SURF, MOVE_THUNDERBOLT, MOVE_RECOVER, MOVE_CONFUSE_RAY }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_NINETALES, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x4A, .moves = { MOVE_CONFUSE_RAY, MOVE_TOXIC, MOVE_FIRE_SPIN, MOVE_HEAT_WAVE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_RAICHU, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x5A, .moves = { MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_REVERSAL, MOVE_IRON_TAIL }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_TIMID, }, { .species = SPECIES_GOLDUCK, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x55, .moves = { MOVE_SURF, MOVE_CROSS_CHOP, MOVE_ICE_BEAM, MOVE_DIG }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_JOLLY, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x5D, .moves = { MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x26, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_SHEER_COLD }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x5B, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_DRAGON_BREATH, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_QUIET, }, { .species = SPECIES_SALAMENCE, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x0D, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_CRUNCH, MOVE_FIRE_BLAST }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_METAGROSS, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x3D, .moves = { MOVE_METEOR_MASH, MOVE_PSYCHIC, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_REGIROCK, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x3C, .moves = { MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_THUNDERBOLT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_REGICE, .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, .teamFlags = 0x3C, .moves = { MOVE_ICE_BEAM, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_REGISTEEL, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x3C, .moves = { MOVE_METAL_CLAW, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_LATIAS, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x0E, .moves = { MOVE_MIST_BALL, MOVE_THUNDERBOLT, MOVE_RECOVER, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_LATIOS, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x0D, .moves = { MOVE_LUSTER_PURGE, MOVE_THUNDERBOLT, MOVE_RECOVER, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x1A, .moves = { MOVE_SURF, MOVE_TOXIC, MOVE_RECOVER, MOVE_MIRROR_COAT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_SLAKING, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x15, .moves = { MOVE_YAWN, MOVE_FOCUS_PUNCH, MOVE_COUNTER, MOVE_SLACK_OFF }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x8C, .moves = { MOVE_GIGA_DRAIN, MOVE_DOUBLE_TEAM, MOVE_LEECH_SEED, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x8C, .moves = { MOVE_BLAZE_KICK, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_QUICK_ATTACK }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x8C, .moves = { MOVE_MUDDY_WATER, MOVE_MUD_SHOT, MOVE_MIRROR_COAT, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_CAREFUL, }, { .species = SPECIES_GARDEVOIR, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x0A, .moves = { MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_HYPNOSIS, MOVE_DREAM_EATER }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_RELAXED, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x05, .moves = { MOVE_SPORE, MOVE_COUNTER, MOVE_SKY_UPPERCUT, MOVE_GIGA_DRAIN }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x58, .moves = { MOVE_PSYCHIC, MOVE_THUNDER_PUNCH, MOVE_FIRE_PUNCH, MOVE_RECOVER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_HASTY, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x04, .moves = { MOVE_CROSS_CHOP, MOVE_COUNTER, MOVE_ENDURE, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_GYARADOS, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x44, .moves = { MOVE_HYPER_BEAM, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_BOLD, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x48, .moves = { MOVE_TOXIC, MOVE_CONFUSE_RAY, MOVE_ATTRACT, MOVE_FLY }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x5D, .moves = { MOVE_CROSS_CHOP, MOVE_COUNTER, MOVE_EARTHQUAKE, MOVE_FACADE }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x0A, .moves = { MOVE_THUNDER, MOVE_THUNDER_WAVE, MOVE_QUICK_ATTACK, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x60, .moves = { MOVE_THUNDERBOLT, MOVE_LIGHT_SCREEN, MOVE_MIRROR_COAT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_BASHFUL, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x64, .moves = { MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN, MOVE_FLAMETHROWER, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_FLYGON, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x1C, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_TIMID, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x5C, .moves = { MOVE_BLIZZARD, MOVE_THUNDERBOLT, MOVE_PSYCHIC, MOVE_RECOVER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_DODRIO, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x5A, .moves = { MOVE_DRILL_PECK, MOVE_TRI_ATTACK, MOVE_AGILITY, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_RAICHU, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x4A, .moves = { MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_ATTRACT, MOVE_FOCUS_PUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_TIMID, }, { .species = SPECIES_GOLDUCK, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x45, .moves = { MOVE_HYDRO_PUMP, MOVE_CROSS_CHOP, MOVE_BLIZZARD, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x5D, .moves = { MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x26, .moves = { MOVE_SURF, MOVE_BLIZZARD, MOVE_ROCK_SLIDE, MOVE_SHEER_COLD }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x5C, .moves = { MOVE_HYDRO_PUMP, MOVE_ICE_BEAM, MOVE_DRAGON_BREATH, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_SALAMENCE, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x1D, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_CRUNCH, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_METAGROSS, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x3D, .moves = { MOVE_METEOR_MASH, MOVE_PSYCHIC, MOVE_EARTHQUAKE, MOVE_SHADOW_BALL }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_REGIROCK, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x3C, .moves = { MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_FOCUS_PUNCH, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_REGICE, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x3C, .moves = { MOVE_ICE_BEAM, MOVE_THUNDERBOLT, MOVE_HAIL, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_CAREFUL, }, { .species = SPECIES_REGISTEEL, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x3C, .moves = { MOVE_METAL_CLAW, MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_LATIAS, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x1E, .moves = { MOVE_MIST_BALL, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_LATIOS, .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, .teamFlags = 0x1D, .moves = { MOVE_LUSTER_PURGE, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x1A, .moves = { MOVE_HYDRO_PUMP, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_MIRROR_COAT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_SLAKING, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x15, .moves = { MOVE_YAWN, MOVE_FOCUS_PUNCH, MOVE_COUNTER, MOVE_PURSUIT }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x8C, .moves = { MOVE_LEAF_BLADE, MOVE_ROCK_TOMB, MOVE_DRAGON_CLAW, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, .teamFlags = 0x8C, .moves = { MOVE_FOCUS_PUNCH, MOVE_COUNTER, MOVE_SWAGGER, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x8C, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_ATTRACT, MOVE_REST }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_GARDEVOIR, .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, .teamFlags = 0x0A, .moves = { MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_ATTRACT, MOVE_WILL_O_WISP }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x05, .moves = { MOVE_SPORE, MOVE_FOCUS_PUNCH, MOVE_MACH_PUNCH, MOVE_COUNTER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, .teamFlags = 0x58, .moves = { MOVE_PSYCHIC, MOVE_TRICK, MOVE_RECOVER, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x05, .moves = { MOVE_REVENGE, MOVE_COUNTER, MOVE_FOCUS_PUNCH, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x0A, .moves = { MOVE_RAIN_DANCE, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_DIVE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x48, .moves = { MOVE_SLUDGE_BOMB, MOVE_CONFUSE_RAY, MOVE_SHADOW_BALL, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x5D, .moves = { MOVE_CROSS_CHOP, MOVE_FIRE_BLAST, MOVE_LOW_KICK, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x08, .moves = { MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_ATTRACT, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_QUIET, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x60, .moves = { MOVE_THUNDER, MOVE_SWIFT, MOVE_MIRROR_COAT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_BASHFUL, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x64, .moves = { MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_PUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_FLYGON, .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, .teamFlags = 0x0C, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FIRE_BLAST, MOVE_SANDSTORM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_TIMID, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x4C, .moves = { MOVE_SURF, MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_PSYCHIC }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x4A, .moves = { MOVE_LEECH_SEED, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_SKARMORY, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x4B, .moves = { MOVE_DRILL_PECK, MOVE_STEEL_WING, MOVE_ATTRACT, MOVE_PURSUIT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_SASSY, }, { .species = SPECIES_GOLDUCK, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x49, .moves = { MOVE_SURF, MOVE_PSYCHIC, MOVE_ICE_BEAM, MOVE_CROSS_CHOP }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_JOLLY, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x5D, .moves = { MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0x26, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_FISSURE, MOVE_SHEER_COLD }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x5C, .moves = { MOVE_SURF, MOVE_BLIZZARD, MOVE_HYPER_BEAM, MOVE_FLAIL }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_SALAMENCE, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x1D, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FIRE_BLAST, MOVE_HYDRO_PUMP }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_METAGROSS, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x3D, .moves = { MOVE_METEOR_MASH, MOVE_PSYCHIC, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_REGIROCK, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x3C, .moves = { MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_SUPERPOWER, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_REGICE, .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, .teamFlags = 0x3C, .moves = { MOVE_ICE_BEAM, MOVE_THUNDERBOLT, MOVE_ANCIENT_POWER, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_CAREFUL, }, { .species = SPECIES_REGISTEEL, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x3C, .moves = { MOVE_METAL_CLAW, MOVE_THUNDERBOLT, MOVE_HYPER_BEAM, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_LATIAS, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x1E, .moves = { MOVE_MIST_BALL, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_QUIET, }, { .species = SPECIES_LATIOS, .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, .teamFlags = 0x1D, .moves = { MOVE_LUSTER_PURGE, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_QUIET, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x1A, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_ALTARIA, .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, .teamFlags = 0x0A, .moves = { MOVE_DRAGON_CLAW, MOVE_ICE_BEAM, MOVE_SING, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_QUIET, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x9C, .moves = { MOVE_LEAF_BLADE, MOVE_DETECT, MOVE_DRAGON_CLAW, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x9C, .moves = { MOVE_BLAZE_KICK, MOVE_SKY_UPPERCUT, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x9C, .moves = { MOVE_SURF, MOVE_EARTHQUAKE, MOVE_ICE_BEAM, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_SHEDINJA, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x20, .moves = { MOVE_CONFUSE_RAY, MOVE_SHADOW_BALL, MOVE_TOXIC, MOVE_GRUDGE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_METAGROSS, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x1D, .moves = { MOVE_METEOR_MASH, MOVE_EARTHQUAKE, MOVE_DOUBLE_TEAM, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x58, .moves = { MOVE_PSYCHIC, MOVE_THUNDER_PUNCH, MOVE_ICE_PUNCH, MOVE_FIRE_PUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_HASTY, }, { .species = SPECIES_LATIAS, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x1E, .moves = { MOVE_MIST_BALL, MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_LATIOS, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x1D, .moves = { MOVE_LUSTER_PURGE, MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_SALAMENCE, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x1D, .moves = { MOVE_DRAGON_CLAW, MOVE_FLAMETHROWER, MOVE_EARTHQUAKE, MOVE_AERIAL_ACE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_RELAXED, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x5D, .moves = { MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_LOW_KICK, MOVE_ROCK_SLIDE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, }; ================================================ FILE: src/data/battle_tower/level_50_mons.h ================================================ const struct BattleTowerPokemonTemplate gBattleTowerLevel50Mons[] = { { .species = SPECIES_PIKACHU, .heldItem = BATTLE_TOWER_ITEM_ORAN_BERRY, .teamFlags = 0x42, .moves = { MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_THUNDER_SHOCK, MOVE_GROWL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_BEAUTIFLY, .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, .teamFlags = 0x41, .moves = { MOVE_ABSORB, MOVE_STUN_SPORE, MOVE_GUST, MOVE_SAFEGUARD }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_SWELLOW, .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, .teamFlags = 0x07, .moves = { MOVE_PECK, MOVE_WING_ATTACK, MOVE_AERIAL_ACE, MOVE_AGILITY }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x0B, .moves = { MOVE_HAIL, MOVE_ENCORE, MOVE_ICE_BALL, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_SEAKING, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x07, .moves = { MOVE_PECK, MOVE_FLAIL, MOVE_FURY_ATTACK, MOVE_SURF }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_HASTY, }, { .species = SPECIES_TORCHIC, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x42, .moves = { MOVE_FIRE_SPIN, MOVE_PROTECT, MOVE_SAND_ATTACK, MOVE_SLASH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_MASQUERAIN, .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, .teamFlags = 0x41, .moves = { MOVE_STUN_SPORE, MOVE_WATER_SPORT, MOVE_QUICK_ATTACK, MOVE_GUST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_IMPISH, }, { .species = SPECIES_ILLUMISE, .heldItem = BATTLE_TOWER_ITEM_NONE, .teamFlags = 0x41, .moves = { MOVE_FLATTER, MOVE_COVET, MOVE_WISH, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_DELCATTY, .heldItem = BATTLE_TOWER_ITEM_SILK_SCARF, .teamFlags = 0x42, .moves = { MOVE_ATTRACT, MOVE_TAIL_WHIP, MOVE_FAINT_ATTACK, MOVE_DIG }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LONELY, }, { .species = SPECIES_KECLEON, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x0B, .moves = { MOVE_TAIL_WHIP, MOVE_SLASH, MOVE_LICK, MOVE_SCREECH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_BRAVE, }, { .species = SPECIES_MIGHTYENA, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x05, .moves = { MOVE_BITE, MOVE_TAKE_DOWN, MOVE_ROAR, MOVE_HOWL }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_SLAKING, .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, .teamFlags = 0x05, .moves = { MOVE_FAINT_ATTACK, MOVE_COUNTER, MOVE_SCRATCH, MOVE_TAUNT }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_MACHOKE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x05, .moves = { MOVE_LEER, MOVE_DIG, MOVE_LOW_KICK, MOVE_FOCUS_PUNCH }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_TIMID, }, { .species = SPECIES_RHYDON, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x05, .moves = { MOVE_STRENGTH, MOVE_ROCK_TOMB, MOVE_STOMP, MOVE_ROCK_SMASH }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_QUIRKY, }, { .species = SPECIES_CACTURNE, .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, .teamFlags = 0x0B, .moves = { MOVE_POISON_STING, MOVE_GROWTH, MOVE_ABSORB, MOVE_SOLAR_BEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_ZIGZAGOON, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x0A, .moves = { MOVE_FLAIL, MOVE_SAND_ATTACK, MOVE_REST, MOVE_SURF }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_DODRIO, .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, .teamFlags = 0x03, .moves = { MOVE_PURSUIT, MOVE_TRI_ATTACK, MOVE_GROWL, MOVE_AGILITY }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_SERIOUS, }, { .species = SPECIES_WHISCASH, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x0B, .moves = { MOVE_WATER_GUN, MOVE_AMNESIA, MOVE_MAGNITUDE, MOVE_MUD_SLAP }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_LAX, }, { .species = SPECIES_NINJASK, .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, .teamFlags = 0x41, .moves = { MOVE_SAND_ATTACK, MOVE_FURY_CUTTER, MOVE_AGILITY, MOVE_HARDEN }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_DUSCLOPS, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x01, .moves = { MOVE_PROTECT, MOVE_NIGHT_SHADE, MOVE_ASTONISH, MOVE_WILL_O_WISP }, .evSpread = F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_CAMERUPT, .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, .teamFlags = 0x07, .moves = { MOVE_DIG, MOVE_EMBER, MOVE_GROWL, MOVE_ROCK_SMASH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_BOLD, }, { .species = SPECIES_SPINDA, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0x4A, .moves = { MOVE_TEETER_DANCE, MOVE_FLAIL, MOVE_PSYCH_UP, MOVE_DOUBLE_EDGE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_CALM, }, { .species = SPECIES_SEVIPER, .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, .teamFlags = 0x09, .moves = { MOVE_SCREECH, MOVE_GLARE, MOVE_DIG, MOVE_POISON_FANG }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_FLYGON, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x49, .moves = { MOVE_SAND_ATTACK, MOVE_SAND_TOMB, MOVE_FACADE, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_AZUMARILL, .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, .teamFlags = 0x42, .moves = { MOVE_BUBBLE_BEAM, MOVE_TAIL_WHIP, MOVE_RAIN_DANCE, MOVE_ROLLOUT }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_ZANGOOSE, .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, .teamFlags = 0x07, .moves = { MOVE_STRENGTH, MOVE_TAUNT, MOVE_CRUSH_CLAW, MOVE_DETECT }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MEDICHAM, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x07, .moves = { MOVE_REVERSAL, MOVE_MEDITATE, MOVE_CONFUSION, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HASTY, }, { .species = SPECIES_ROSELIA, .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, .teamFlags = 0x0A, .moves = { MOVE_GROWTH, MOVE_MEGA_DRAIN, MOVE_TOXIC, MOVE_CUT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_SWALOT, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x0B, .moves = { MOVE_STOCKPILE, MOVE_SPIT_UP, MOVE_SLUDGE, MOVE_POISON_GAS }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_MAGNETON, .heldItem = BATTLE_TOWER_ITEM_MAGNET, .teamFlags = 0x0B, .moves = { MOVE_SUPERSONIC, MOVE_THUNDER_WAVE, MOVE_SCREECH, MOVE_TRI_ATTACK }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_GARDEVOIR, .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, .teamFlags = 0x09, .moves = { MOVE_CONFUSION, MOVE_TOXIC, MOVE_TORMENT, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_BOLD, }, { .species = SPECIES_RELICANTH, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x01, .moves = { MOVE_SURF, MOVE_ANCIENT_POWER, MOVE_ROCK_TOMB, MOVE_HARDEN }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_TIMID, }, { .species = SPECIES_NINETALES, .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, .teamFlags = 0x03, .moves = { MOVE_CONFUSE_RAY, MOVE_FIRE_SPIN, MOVE_QUICK_ATTACK, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HASTY, }, { .species = SPECIES_SHARPEDO, .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, .teamFlags = 0x05, .moves = { MOVE_BITE, MOVE_SKULL_BASH, MOVE_RAIN_DANCE, MOVE_SURF }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_GIRAFARIG, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x03, .moves = { MOVE_STRENGTH, MOVE_PSYBEAM, MOVE_AGILITY, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_IMPISH, }, { .species = SPECIES_PELIPPER, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x0B, .moves = { MOVE_MIST, MOVE_STOCKPILE, MOVE_SWALLOW, MOVE_SPIT_UP }, .evSpread = F_EV_SPREAD_DEFENSE, .nature = NATURE_QUIRKY, }, { .species = SPECIES_SABLEYE, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0x09, .moves = { MOVE_SHADOW_BALL, MOVE_NIGHT_SHADE, MOVE_SNATCH, MOVE_FAKE_OUT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_LUNATONE, .heldItem = BATTLE_TOWER_ITEM_HARD_STONE, .teamFlags = 0x0B, .moves = { MOVE_COSMIC_POWER, MOVE_SANDSTORM, MOVE_PSYCHIC, MOVE_ROCK_THROW }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_GENTLE, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_NONE, .teamFlags = 0x0B, .moves = { MOVE_THIEF, MOVE_FAKE_OUT, MOVE_SURF, MOVE_RAIN_DANCE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_GRUMPIG, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x0B, .moves = { MOVE_ODOR_SLEUTH, MOVE_CONFUSE_RAY, MOVE_MAGIC_COAT, MOVE_PSYCHIC }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x0B, .moves = { MOVE_CUT, MOVE_LEECH_SEED, MOVE_MEGA_DRAIN, MOVE_STUN_SPORE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_SASSY, }, { .species = SPECIES_WAILORD, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x03, .moves = { MOVE_WATER_SPOUT, MOVE_ROLLOUT, MOVE_MIST, MOVE_RAIN_DANCE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_GENTLE, }, { .species = SPECIES_WEEZING, .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, .teamFlags = 0x05, .moves = { MOVE_SMOG, MOVE_SELF_DESTRUCT, MOVE_TOXIC, MOVE_SLUDGE_BOMB }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_BASHFUL, }, { .species = SPECIES_KADABRA, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0x0B, .moves = { MOVE_FUTURE_SIGHT, MOVE_FOCUS_PUNCH, MOVE_SKILL_SWAP, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_CAREFUL, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_MAGNET, .teamFlags = 0x07, .moves = { MOVE_THUNDER_WAVE, MOVE_BITE, MOVE_SPARK, MOVE_QUICK_ATTACK }, .evSpread = F_EV_SPREAD_SP_ATTACK, .nature = NATURE_RASH, }, { .species = SPECIES_RAICHU, .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, .teamFlags = 0x03, .moves = { MOVE_QUICK_ATTACK, MOVE_AGILITY, MOVE_LIGHT_SCREEN, MOVE_THUNDERBOLT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_XATU, .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, .teamFlags = 0x03, .moves = { MOVE_NIGHT_SHADE, MOVE_PECK, MOVE_CONFUSE_RAY, MOVE_FUTURE_SIGHT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_LOUDRED, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x05, .moves = { MOVE_UPROAR, MOVE_STOMP, MOVE_SCREECH, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_MODEST, }, { .species = SPECIES_SOLROCK, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x03, .moves = { MOVE_ROCK_THROW, MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_SANDSTORM }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_MILD, }, { .species = SPECIES_CLAYDOL, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x03, .moves = { MOVE_SANDSTORM, MOVE_REFLECT, MOVE_ROCK_TOMB, MOVE_STRENGTH }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_SERIOUS, }, { .species = SPECIES_CRAWDAUNT, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x03, .moves = { MOVE_WATER_PULSE, MOVE_KNOCK_OFF, MOVE_HARDEN, MOVE_CUT }, .evSpread = F_EV_SPREAD_HP, .nature = NATURE_JOLLY, }, { .species = SPECIES_GOLBAT, .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, .teamFlags = 0x09, .moves = { MOVE_CONFUSE_RAY, MOVE_WING_ATTACK, MOVE_MEAN_LOOK, MOVE_BITE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_BELLOSSOM, .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, .teamFlags = 0x0A, .moves = { MOVE_SOLAR_BEAM, MOVE_PETAL_DANCE, MOVE_SWEET_SCENT, MOVE_BULLET_SEED }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_DONPHAN, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x05, .moves = { MOVE_ROCK_SMASH, MOVE_RAPID_SPIN, MOVE_FLAIL, MOVE_HORN_ATTACK }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_IMPISH, }, { .species = SPECIES_NOSEPASS, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x0B, .moves = { MOVE_SANDSTORM, MOVE_ROCK_SLIDE, MOVE_BLOCK, MOVE_THUNDER_WAVE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_JOLLY, }, { .species = SPECIES_PINSIR, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x05, .moves = { MOVE_SWORDS_DANCE, MOVE_HARDEN, MOVE_CUT, MOVE_SEISMIC_TOSS }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_DOCILE, }, { .species = SPECIES_GOLDUCK, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x0B, .moves = { MOVE_DISABLE, MOVE_PSYCH_UP, MOVE_WATER_PULSE, MOVE_BRICK_BREAK }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_SHIFTRY, .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, .teamFlags = 0x07, .moves = { MOVE_TORMENT, MOVE_EXTRASENSORY, MOVE_SOLAR_BEAM, MOVE_AERIAL_ACE }, .evSpread = F_EV_SPREAD_DEFENSE, .nature = NATURE_NAIVE, }, { .species = SPECIES_DUSTOX, .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, .teamFlags = 0x01, .moves = { MOVE_CONFUSION, MOVE_SILVER_WIND, MOVE_PSYBEAM, MOVE_WHIRLWIND }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_SERIOUS, }, { .species = SPECIES_SHUPPET, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x03, .moves = { MOVE_WILL_O_WISP, MOVE_NIGHT_SHADE, MOVE_FAINT_ATTACK, MOVE_CURSE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_SEAKING, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x07, .moves = { MOVE_RAIN_DANCE, MOVE_SURF, MOVE_HORN_ATTACK, MOVE_HORN_DRILL }, .evSpread = F_EV_SPREAD_SP_DEFENSE, .nature = NATURE_LONELY, }, { .species = SPECIES_SKARMORY, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x07, .moves = { MOVE_STEEL_WING, MOVE_SAND_ATTACK, MOVE_SWIFT, MOVE_AGILITY }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_RELAXED, }, { .species = SPECIES_TORKOAL, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x43, .moves = { MOVE_FLAMETHROWER, MOVE_IRON_DEFENSE, MOVE_BODY_SLAM, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_GOLEM, .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, .teamFlags = 0x05, .moves = { MOVE_MAGNITUDE, MOVE_EXPLOSION, MOVE_STRENGTH, MOVE_SANDSTORM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_GARDEVOIR, .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, .teamFlags = 0x41, .moves = { MOVE_REFLECT, MOVE_PSYCHIC, MOVE_IMPRISON, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_HASTY, }, { .species = SPECIES_SANDSLASH, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x07, .moves = { MOVE_SANDSTORM, MOVE_SLASH, MOVE_EARTHQUAKE, MOVE_SWIFT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_ADAMANT, }, { .species = SPECIES_WOBBUFFET, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x0B, .moves = { MOVE_COUNTER, MOVE_MIRROR_COAT, MOVE_SAFEGUARD, MOVE_DESTINY_BOND }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_CALM, }, { .species = SPECIES_TENTACRUEL, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0x05, .moves = { MOVE_CONSTRICT, MOVE_SURF, MOVE_HYPER_BEAM, MOVE_SCREECH }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_IMPISH, }, { .species = SPECIES_TROPIUS, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x05, .moves = { MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_SYNTHESIS, MOVE_RAZOR_LEAF }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_DOCILE, }, { .species = SPECIES_MAWILE, .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, .teamFlags = 0x43, .moves = { MOVE_IRON_DEFENSE, MOVE_SLUDGE_BOMB, MOVE_CRUNCH, MOVE_STRENGTH }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_CALM, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, .teamFlags = 0x09, .moves = { MOVE_SLUDGE, MOVE_ACID_ARMOR, MOVE_GIGA_DRAIN, MOVE_DISABLE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_MAGCARGO, .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, .teamFlags = 0x0D, .moves = { MOVE_FLAMETHROWER, MOVE_ROCK_THROW, MOVE_HARDEN, MOVE_AMNESIA }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_LINOONE, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x07, .moves = { MOVE_HEADBUTT, MOVE_TAIL_WHIP, MOVE_SURF, MOVE_DIG }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_QUIRKY, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, .teamFlags = 0x05, .moves = { MOVE_LIGHT_SCREEN, MOVE_THUNDERBOLT, MOVE_SWIFT, MOVE_ROLLOUT }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_SERIOUS, }, { .species = SPECIES_DUSCLOPS, .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, .teamFlags = 0x09, .moves = { MOVE_MEAN_LOOK, MOVE_NIGHT_SHADE, MOVE_SKILL_SWAP, MOVE_SHADOW_BALL }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_VILEPLUME, .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, .teamFlags = 0x0A, .moves = { MOVE_TOXIC, MOVE_MOONLIGHT, MOVE_GIGA_DRAIN, MOVE_STUN_SPORE }, .evSpread = F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0x05, .moves = { MOVE_BITE, MOVE_HAZE, MOVE_WING_ATTACK, MOVE_STEEL_WING }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_TIMID, }, { .species = SPECIES_CORSOLA, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x0A, .moves = { MOVE_RECOVER, MOVE_MIRROR_COAT, MOVE_HAIL, MOVE_SURF }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x0B, .moves = { MOVE_RAPID_SPIN, MOVE_WATER_PULSE, MOVE_REFLECT, MOVE_SKILL_SWAP }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_EXPLOUD, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x41, .moves = { MOVE_HYPER_BEAM, MOVE_HOWL, MOVE_UPROAR, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, .teamFlags = 0x0B, .moves = { MOVE_PSYBEAM, MOVE_SNATCH, MOVE_REFLECT, MOVE_HYPER_BEAM }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_RELAXED, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x05, .moves = { MOVE_HORN_ATTACK, MOVE_COUNTER, MOVE_REVERSAL, MOVE_LEER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_BOLD, }, { .species = SPECIES_CASTFORM, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x0B, .moves = { MOVE_WEATHER_BALL, MOVE_SUNNY_DAY, MOVE_RAIN_DANCE, MOVE_HAIL }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_VIGOROTH, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x05, .moves = { MOVE_FOCUS_PUNCH, MOVE_REVERSAL, MOVE_COUNTER, MOVE_TAUNT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_DUSKULL, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x09, .moves = { MOVE_TOXIC, MOVE_CONFUSE_RAY, MOVE_SHADOW_BALL, MOVE_WILL_O_WISP }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_LANTURN, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x07, .moves = { MOVE_FLAIL, MOVE_SURF, MOVE_SPARK, MOVE_TAKE_DOWN }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_SASSY, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x05, .moves = { MOVE_STRENGTH, MOVE_FAKE_OUT, MOVE_FACADE, MOVE_SAND_ATTACK }, .evSpread = F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x43, .moves = { MOVE_AGILITY, MOVE_DIVE, MOVE_ICE_BEAM, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_GYARADOS, .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, .teamFlags = 0x41, .moves = { MOVE_RAIN_DANCE, MOVE_SURF, MOVE_WATER_PULSE, MOVE_HYPER_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_IMPISH, }, { .species = SPECIES_AGGRON, .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, .teamFlags = 0x45, .moves = { MOVE_EARTHQUAKE, MOVE_BRICK_BREAK, MOVE_METAL_CLAW, MOVE_ROAR }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_RELAXED, }, { .species = SPECIES_ABSOL, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0xC7, .moves = { MOVE_SWORDS_DANCE, MOVE_IRON_TAIL, MOVE_SLASH, MOVE_FACADE }, .evSpread = F_EV_SPREAD_ATTACK, .nature = NATURE_LAX, }, { .species = SPECIES_SWELLOW, .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, .teamFlags = 0x0F, .moves = { MOVE_DOUBLE_TEAM, MOVE_FLY, MOVE_TOXIC, MOVE_STEEL_WING }, .evSpread = 0, .nature = NATURE_HASTY, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, .teamFlags = 0x05, .moves = { MOVE_STRENGTH, MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_HASTY, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, .teamFlags = 0x41, .moves = { MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_HYPER_BEAM, MOVE_SURF }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, .teamFlags = 0x41, .moves = { MOVE_LEAF_BLADE, MOVE_DRAGON_CLAW, MOVE_AGILITY, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, .teamFlags = 0x41, .moves = { MOVE_BLAZE_KICK, MOVE_MIRROR_MOVE, MOVE_EARTHQUAKE, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_ALTARIA, .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, .teamFlags = 0x43, .moves = { MOVE_DRAGON_CLAW, MOVE_DRAGON_DANCE, MOVE_TOXIC, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, .teamFlags = 0x43, .moves = { MOVE_BRICK_BREAK, MOVE_WATER_PULSE, MOVE_RAIN_DANCE, MOVE_FOCUS_PUNCH }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_SABLEYE, .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, .teamFlags = 0x49, .moves = { MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_DIG, MOVE_CONFUSE_RAY }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HARDY, }, { .species = SPECIES_ZANGOOSE, .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, .teamFlags = 0x0F, .moves = { MOVE_FACADE, MOVE_THUNDERBOLT, MOVE_CRUSH_CLAW, MOVE_DETECT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_CALM, }, { .species = SPECIES_LINOONE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x0F, .moves = { MOVE_IRON_TAIL, MOVE_HEADBUTT, MOVE_ATTRACT, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_WHISCASH, .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, .teamFlags = 0x07, .moves = { MOVE_MUD_SLAP, MOVE_EARTHQUAKE, MOVE_SURF, MOVE_AMNESIA }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_BOLD, }, { .species = SPECIES_SOLROCK, .heldItem = BATTLE_TOWER_ITEM_HARD_STONE, .teamFlags = 0x43, .moves = { MOVE_EARTHQUAKE, MOVE_LIGHT_SCREEN, MOVE_ROCK_SLIDE, MOVE_CONFUSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_BASHFUL, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x03, .moves = { MOVE_RECOVER, MOVE_RAIN_DANCE, MOVE_SURF, MOVE_CONFUSE_RAY }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_CACTURNE, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x0F, .moves = { MOVE_INGRAIN, MOVE_LEECH_SEED, MOVE_PROTECT, MOVE_FRUSTRATION }, .evSpread = 0, .nature = NATURE_HARDY, }, { .species = SPECIES_SHIFTRY, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x05, .moves = { MOVE_FRUSTRATION, MOVE_HYPER_BEAM, MOVE_GIGA_DRAIN, MOVE_TORMENT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_ADAMANT, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_MAGNET, .teamFlags = 0x0F, .moves = { MOVE_THUNDER, MOVE_THUNDER_WAVE, MOVE_IRON_TAIL, MOVE_ROAR }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_KECLEON, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0xC3, .moves = { MOVE_THUNDERBOLT, MOVE_FOCUS_PUNCH, MOVE_IRON_TAIL, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_PINSIR, .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, .teamFlags = 0x8D, .moves = { MOVE_GUILLOTINE, MOVE_SUBMISSION, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_METANG, .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, .teamFlags = 0x05, .moves = { MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_METEOR_MASH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_IMPISH, }, { .species = SPECIES_CLAYDOL, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x43, .moves = { MOVE_EARTHQUAKE, MOVE_SELF_DESTRUCT, MOVE_SANDSTORM, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_MASQUERAIN, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x0A, .moves = { MOVE_TOXIC, MOVE_SILVER_WIND, MOVE_ATTRACT, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_QUIET, }, { .species = SPECIES_RELICANTH, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0xC5, .moves = { MOVE_ROCK_TOMB, MOVE_DOUBLE_EDGE, MOVE_SURF, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x0D, .moves = { MOVE_SURF, MOVE_ENCORE, MOVE_BLIZZARD, MOVE_HYPER_BEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_WAILORD, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x0B, .moves = { MOVE_WATER_SPOUT, MOVE_REST, MOVE_AMNESIA, MOVE_HAIL }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_HASTY, }, { .species = SPECIES_GIRAFARIG, .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, .teamFlags = 0x4F, .moves = { MOVE_DOUBLE_TEAM, MOVE_CRUNCH, MOVE_PSYCHIC, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_MEDICHAM, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x4B, .moves = { MOVE_CALM_MIND, MOVE_REVERSAL, MOVE_ROCK_TOMB, MOVE_PSYCHIC }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_RELAXED, }, { .species = SPECIES_TROPIUS, .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, .teamFlags = 0xC7, .moves = { MOVE_EARTHQUAKE, MOVE_SYNTHESIS, MOVE_RAZOR_LEAF, MOVE_HYPER_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_BOLD, }, { .species = SPECIES_NINJASK, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x05, .moves = { MOVE_DOUBLE_TEAM, MOVE_SLASH, MOVE_SWORDS_DANCE, MOVE_LEECH_LIFE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_CAMERUPT, .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, .teamFlags = 0x0D, .moves = { MOVE_EARTHQUAKE, MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_ROCK_SLIDE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_SHARPEDO, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x05, .moves = { MOVE_CRUNCH, MOVE_SURF, MOVE_EARTHQUAKE, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_WIGGLYTUFF, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x0E, .moves = { MOVE_PROTECT, MOVE_TOXIC, MOVE_DOUBLE_TEAM, MOVE_DIG }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_LAX, }, { .species = SPECIES_SEVIPER, .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, .teamFlags = 0x05, .moves = { MOVE_SLUDGE_BOMB, MOVE_HAZE, MOVE_CRUNCH, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_NAIVE, }, { .species = SPECIES_CRADILY, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0xC1, .moves = { MOVE_ROCK_TOMB, MOVE_CONFUSE_RAY, MOVE_INGRAIN, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_ARMALDO, .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, .teamFlags = 0xC1, .moves = { MOVE_EARTHQUAKE, MOVE_SANDSTORM, MOVE_PROTECT, MOVE_SLASH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MAGNETON, .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, .teamFlags = 0x0D, .moves = { MOVE_ZAP_CANNON, MOVE_SUPERSONIC, MOVE_TOXIC, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_ADAMANT, }, { .species = SPECIES_LANTURN, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x06, .moves = { MOVE_THUNDER, MOVE_SURF, MOVE_ICE_BEAM, MOVE_RAIN_DANCE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_ADAMANT, }, { .species = SPECIES_SWALOT, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0x8B, .moves = { MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_ENCORE, MOVE_BODY_SLAM }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_SKARMORY, .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, .teamFlags = 0x81, .moves = { MOVE_STEEL_WING, MOVE_AGILITY, MOVE_TORMENT, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_DONPHAN, .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, .teamFlags = 0x0D, .moves = { MOVE_EARTHQUAKE, MOVE_FLAIL, MOVE_ROAR, MOVE_IRON_TAIL }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x41, .moves = { MOVE_FACADE, MOVE_REVERSAL, MOVE_MEGAHORN, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_BANETTE, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x83, .moves = { MOVE_SHADOW_BALL, MOVE_HYPER_BEAM, MOVE_THUNDERBOLT, MOVE_SKILL_SWAP }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_CAREFUL, }, { .species = SPECIES_SANDSLASH, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x0F, .moves = { MOVE_SANDSTORM, MOVE_TOXIC, MOVE_SLASH, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_CRAWDAUNT, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x05, .moves = { MOVE_GUILLOTINE, MOVE_CRABHAMMER, MOVE_BLIZZARD, MOVE_SLUDGE_BOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_GRUMPIG, .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, .teamFlags = 0x8B, .moves = { MOVE_MAGIC_COAT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_CONFUSE_RAY }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_LONELY, }, { .species = SPECIES_RHYDON, .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, .teamFlags = 0x45, .moves = { MOVE_IRON_TAIL, MOVE_EARTHQUAKE, MOVE_SURF, MOVE_FIRE_BLAST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_RASH, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x8B, .moves = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_RECOVER, MOVE_SKILL_SWAP }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_HASTY, }, { .species = SPECIES_DUSCLOPS, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x41, .moves = { MOVE_SHADOW_BALL, MOVE_WILL_O_WISP, MOVE_BLIZZARD, MOVE_PSYCHIC }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_CAREFUL, }, { .species = SPECIES_TORKOAL, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x09, .moves = { MOVE_FLAMETHROWER, MOVE_AMNESIA, MOVE_IRON_TAIL, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_NAIVE, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x09, .moves = { MOVE_SCREECH, MOVE_EXPLOSION, MOVE_MIRROR_COAT, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_RASH, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x0B, .moves = { MOVE_IRON_TAIL, MOVE_FOCUS_PUNCH, MOVE_DOUBLE_TEAM, MOVE_LEECH_SEED }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, .teamFlags = 0x05, .moves = { MOVE_SLUDGE_BOMB, MOVE_THUNDERBOLT, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_WEEZING, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x05, .moves = { MOVE_EXPLOSION, MOVE_SLUDGE_BOMB, MOVE_SHADOW_BALL, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_RAICHU, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x4E, .moves = { MOVE_THUNDERBOLT, MOVE_DOUBLE_TEAM, MOVE_FOCUS_PUNCH, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_JOLLY, }, { .species = SPECIES_TENTACRUEL, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0x09, .moves = { MOVE_DOUBLE_TEAM, MOVE_TOXIC, MOVE_SURF, MOVE_SLUDGE_BOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_BOLD, }, { .species = SPECIES_EXPLOUD, .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, .teamFlags = 0x05, .moves = { MOVE_BLIZZARD, MOVE_FLAMETHROWER, MOVE_EARTHQUAKE, MOVE_RETURN }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_BASHFUL, }, { .species = SPECIES_XATU, .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, .teamFlags = 0x43, .moves = { MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_GOLEM, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x05, .moves = { MOVE_EXPLOSION, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_IMPISH, }, { .species = SPECIES_GOLDUCK, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x83, .moves = { MOVE_SURF, MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_BLIZZARD }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_NINETALES, .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, .teamFlags = 0x4A, .moves = { MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_TOXIC, MOVE_CONFUSE_RAY }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_QUIET, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x13, .moves = { MOVE_DOUBLE_TEAM, MOVE_REST, MOVE_SURF, MOVE_DRAGON_BREATH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_ADAMANT, }, { .species = SPECIES_SLAKING, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x03, .moves = { MOVE_CURSE, MOVE_AMNESIA, MOVE_YAWN, MOVE_FOCUS_PUNCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_LAX, }, { .species = SPECIES_GYARADOS, .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, .teamFlags = 0x03, .moves = { MOVE_THUNDER, MOVE_EARTHQUAKE, MOVE_HYDRO_PUMP, MOVE_RAIN_DANCE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x21, .moves = { MOVE_BELLY_DRUM, MOVE_ENDURE, MOVE_EARTHQUAKE, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_SASSY, }, { .species = SPECIES_ABSOL, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0xC3, .moves = { MOVE_FAINT_ATTACK, MOVE_DOUBLE_EDGE, MOVE_SHADOW_BALL, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_RELAXED, }, { .species = SPECIES_ALTARIA, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x83, .moves = { MOVE_DRAGON_DANCE, MOVE_MIRROR_MOVE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_RASH, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, .teamFlags = 0x11, .moves = { MOVE_CROSS_CHOP, MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_ENCORE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_SASSY, }, { .species = SPECIES_FLYGON, .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, .teamFlags = 0x43, .moves = { MOVE_CRUNCH, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x33, .moves = { MOVE_COUNTER, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_GLALIE, .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, .teamFlags = 0x81, .moves = { MOVE_BLIZZARD, MOVE_CRUNCH, MOVE_ICY_WIND, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_JOLLY, }, { .species = SPECIES_HUNTAIL, .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, .teamFlags = 0xA1, .moves = { MOVE_RAIN_DANCE, MOVE_HYDRO_PUMP, MOVE_CRUNCH, MOVE_BLIZZARD }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, .teamFlags = 0xD3, .moves = { MOVE_SURF, MOVE_ATTRACT, MOVE_RECOVER, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_GOREBYSS, .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, .teamFlags = 0x83, .moves = { MOVE_PSYCHIC, MOVE_SURF, MOVE_BLIZZARD, MOVE_SHADOW_BALL }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x53, .moves = { MOVE_LEAF_BLADE, MOVE_ENDEAVOR, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_BASHFUL, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x53, .moves = { MOVE_EARTHQUAKE, MOVE_SURF, MOVE_MUD_SHOT, MOVE_BLIZZARD }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_AGGRON, .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, .teamFlags = 0x41, .moves = { MOVE_DOUBLE_EDGE, MOVE_FLAMETHROWER, MOVE_IRON_TAIL, MOVE_BLIZZARD }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_BOLD, }, { .species = SPECIES_CRADILY, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0xE1, .moves = { MOVE_STOCKPILE, MOVE_SPIT_UP, MOVE_SWALLOW, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_ARMALDO, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0xC1, .moves = { MOVE_EARTHQUAKE, MOVE_HYPER_BEAM, MOVE_SLASH, MOVE_SWORDS_DANCE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x82, .moves = { MOVE_FOCUS_PUNCH, MOVE_COUNTER, MOVE_MACH_PUNCH, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x83, .moves = { MOVE_RAIN_DANCE, MOVE_SURF, MOVE_PROTECT, MOVE_TOXIC }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_SHIFTRY, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x03, .moves = { MOVE_TORMENT, MOVE_FAINT_ATTACK, MOVE_SHADOW_BALL, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_TROPIUS, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0xC3, .moves = { MOVE_SUNNY_DAY, MOVE_SYNTHESIS, MOVE_SOLAR_BEAM, MOVE_LEECH_SEED }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, .nature = NATURE_QUIET, }, { .species = SPECIES_GRUMPIG, .heldItem = BATTLE_TOWER_ITEM_MACHO_BRACE, .teamFlags = 0x23, .moves = { MOVE_TRICK, MOVE_SKILL_SWAP, MOVE_PSYCHIC, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_TORKOAL, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x81, .moves = { MOVE_IRON_DEFENSE, MOVE_TOXIC, MOVE_REST, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_NONE, .teamFlags = 0x03, .moves = { MOVE_THUNDERBOLT, MOVE_CRUNCH, MOVE_ROAR, MOVE_THIEF }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_PINSIR, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0x61, .moves = { MOVE_GUILLOTINE, MOVE_EARTHQUAKE, MOVE_DOUBLE_TEAM, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x93, .moves = { MOVE_LIGHT_SCREEN, MOVE_THUNDERBOLT, MOVE_SURF, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x51, .moves = { MOVE_MEGAHORN, MOVE_REVERSAL, MOVE_EARTHQUAKE, MOVE_COUNTER }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, .teamFlags = 0x83, .moves = { MOVE_BLIZZARD, MOVE_EARTHQUAKE, MOVE_SURF, MOVE_ROCK_SLIDE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_CAREFUL, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x13, .moves = { MOVE_PSYCHIC, MOVE_RECOVER, MOVE_ENCORE, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x93, .moves = { MOVE_SURF, MOVE_BLIZZARD, MOVE_RECOVER, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_REGICE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x11, .moves = { MOVE_REST, MOVE_CURSE, MOVE_BLIZZARD, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_MILD, }, { .species = SPECIES_REGISTEEL, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x11, .moves = { MOVE_REST, MOVE_IRON_DEFENSE, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_MILD, }, { .species = SPECIES_REGIROCK, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x91, .moves = { MOVE_ROCK_TOMB, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SASSY, }, { .species = SPECIES_DUSCLOPS, .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, .teamFlags = 0x20, .moves = { MOVE_SHADOW_BALL, MOVE_EARTHQUAKE, MOVE_BLIZZARD, MOVE_DESTINY_BOND }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_SEAKING, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0xB2, .moves = { MOVE_HORN_DRILL, MOVE_AGILITY, MOVE_SLEEP_TALK, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_CAMERUPT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x00, .moves = { MOVE_EARTHQUAKE, MOVE_ERUPTION, MOVE_ROCK_SLIDE, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_LANTURN, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x82, .moves = { MOVE_THUNDERBOLT, MOVE_SURF, MOVE_THUNDER_WAVE, MOVE_BLIZZARD }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_WEEZING, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x20, .moves = { MOVE_SLUDGE_BOMB, MOVE_THUNDERBOLT, MOVE_FIRE_BLAST, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SERIOUS, }, { .species = SPECIES_WHISCASH, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x41, .moves = { MOVE_EARTHQUAKE, MOVE_SURF, MOVE_ROCK_TOMB, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_AGGRON, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x11, .moves = { MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_SURF, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_CACTURNE, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x63, .moves = { MOVE_DYNAMIC_PUNCH, MOVE_COUNTER, MOVE_FAINT_ATTACK, MOVE_GIGA_DRAIN }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_RELAXED, }, { .species = SPECIES_SHARPEDO, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x01, .moves = { MOVE_CRUNCH, MOVE_DOUBLE_EDGE, MOVE_SURF, MOVE_SWAGGER }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_ABSOL, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x82, .moves = { MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_SWORDS_DANCE, MOVE_QUICK_ATTACK }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WAILORD, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0x23, .moves = { MOVE_HYDRO_PUMP, MOVE_EARTHQUAKE, MOVE_ATTRACT, MOVE_FISSURE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_TIMID, }, { .species = SPECIES_TENTACRUEL, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x21, .moves = { MOVE_HYDRO_PUMP, MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN, MOVE_MIRROR_COAT }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_RASH, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0xA2, .moves = { MOVE_RAIN_DANCE, MOVE_SURF, MOVE_TOXIC, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WOBBUFFET, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x23, .moves = { MOVE_ENCORE, MOVE_COUNTER, MOVE_MIRROR_COAT, MOVE_DESTINY_BOND }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SERIOUS, }, { .species = SPECIES_RHYDON, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x21, .moves = { MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_HORN_DRILL, MOVE_ROCK_SLIDE }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_GLALIE, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x21, .moves = { MOVE_CRUNCH, MOVE_BLIZZARD, MOVE_HAIL, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SERIOUS, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x13, .moves = { MOVE_LEAF_BLADE, MOVE_EARTHQUAKE, MOVE_DRAGON_CLAW, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x17, .moves = { MOVE_BLAZE_KICK, MOVE_ROCK_TOMB, MOVE_ENDURE, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_RASH, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x17, .moves = { MOVE_SURF, MOVE_EARTHQUAKE, MOVE_MUD_SHOT, MOVE_BLIZZARD }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SERIOUS, }, { .species = SPECIES_GARDEVOIR, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x19, .moves = { MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_DESTINY_BOND, MOVE_WILL_O_WISP }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0xF6, .moves = { MOVE_SPORE, MOVE_FOCUS_PUNCH, MOVE_BRICK_BREAK, MOVE_SLUDGE_BOMB }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, .teamFlags = 0x1B, .moves = { MOVE_PSYCHIC, MOVE_THUNDER_PUNCH, MOVE_REFLECT, MOVE_RECOVER }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_SHIFTRY, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x89, .moves = { MOVE_FAINT_ATTACK, MOVE_SHADOW_BALL, MOVE_DOUBLE_TEAM, MOVE_REST }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SERIOUS, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x85, .moves = { MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FAKE_OUT }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x49, .moves = { MOVE_ATTRACT, MOVE_CONFUSE_RAY, MOVE_BITE, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x15, .moves = { MOVE_CROSS_CHOP, MOVE_FLAMETHROWER, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x0B, .moves = { MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_ROAR, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x27, .moves = { MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_MIRROR_COAT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_BASHFUL, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x05, .moves = { MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_FLYGON, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x4D, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FLAMETHROWER, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_SERIOUS, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x1B, .moves = { MOVE_SURF, MOVE_THUNDERBOLT, MOVE_RECOVER, MOVE_CONFUSE_RAY }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_DODRIO, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x2B, .moves = { MOVE_DRILL_PECK, MOVE_TRI_ATTACK, MOVE_AGILITY, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_RAICHU, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x0A, .moves = { MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_REVERSAL, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_SERIOUS, }, { .species = SPECIES_GOLDUCK, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x0A, .moves = { MOVE_SURF, MOVE_CROSS_CHOP, MOVE_ICE_BEAM, MOVE_HYPER_BEAM }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SERIOUS, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x54, .moves = { MOVE_MEGAHORN, MOVE_ROCK_TOMB, MOVE_ENDURE, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x06, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_NAIVE, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x1D, .moves = { MOVE_SURF, MOVE_TOXIC, MOVE_PROTECT, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_SALAMENCE, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x9C, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_CRUNCH, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_METAGROSS, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x15, .moves = { MOVE_METEOR_MASH, MOVE_PSYCHIC, MOVE_EARTHQUAKE, MOVE_LIGHT_SCREEN }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_REGIROCK, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0xB5, .moves = { MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_FOCUS_PUNCH, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_REGICE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x96, .moves = { MOVE_ICE_BEAM, MOVE_THUNDERBOLT, MOVE_DOUBLE_TEAM, MOVE_REST }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_REGISTEEL, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x94, .moves = { MOVE_METAL_CLAW, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_LATIAS, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x96, .moves = { MOVE_MIST_BALL, MOVE_THUNDERBOLT, MOVE_REST, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_MILD, }, { .species = SPECIES_LATIOS, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x95, .moves = { MOVE_LUSTER_PURGE, MOVE_REFLECT, MOVE_RECOVER, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x96, .moves = { MOVE_SURF, MOVE_TOXIC, MOVE_RECOVER, MOVE_MIRROR_COAT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_BRAVE, }, { .species = SPECIES_SLAKING, .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, .teamFlags = 0x05, .moves = { MOVE_HYPER_BEAM, MOVE_EARTHQUAKE, MOVE_NONE, MOVE_NONE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SERIOUS, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x1F, .moves = { MOVE_GIGA_DRAIN, MOVE_DOUBLE_TEAM, MOVE_LEECH_SEED, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x17, .moves = { MOVE_BLAZE_KICK, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x17, .moves = { MOVE_MUDDY_WATER, MOVE_MUD_SHOT, MOVE_MIRROR_COAT, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_GARDEVOIR, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x7B, .moves = { MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_DESTINY_BOND, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_RELAXED, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x56, .moves = { MOVE_SPORE, MOVE_COUNTER, MOVE_IRON_TAIL, MOVE_GIGA_DRAIN }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x0A, .moves = { MOVE_PSYCHIC, MOVE_THUNDER_PUNCH, MOVE_FIRE_PUNCH, MOVE_RECOVER }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, .teamFlags = 0x05, .moves = { MOVE_CROSS_CHOP, MOVE_ROCK_TOMB, MOVE_ENDURE, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_SASSY, }, { .species = SPECIES_GYARADOS, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x0C, .moves = { MOVE_HYPER_BEAM, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_BOLD, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x49, .moves = { MOVE_TOXIC, MOVE_CONFUSE_RAY, MOVE_ATTRACT, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x15, .moves = { MOVE_CROSS_CHOP, MOVE_COUNTER, MOVE_EARTHQUAKE, MOVE_FACADE }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SERIOUS, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x63, .moves = { MOVE_THUNDER, MOVE_THUNDER_WAVE, MOVE_REST, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x07, .moves = { MOVE_THUNDERBOLT, MOVE_SCREECH, MOVE_MIRROR_COAT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_MODEST, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x45, .moves = { MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN, MOVE_ROCK_TOMB, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_RASH, }, { .species = SPECIES_FLYGON, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x4D, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_IMPISH, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x1B, .moves = { MOVE_LIGHT_SCREEN, MOVE_THUNDERBOLT, MOVE_SURF, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_NINETALES, .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, .teamFlags = 0x0A, .moves = { MOVE_CONFUSE_RAY, MOVE_OVERHEAT, MOVE_FLAMETHROWER, MOVE_IRON_TAIL }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_GOLEM, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x25, .moves = { MOVE_EARTHQUAKE, MOVE_ROAR, MOVE_FIRE_BLAST, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_SERIOUS, }, { .species = SPECIES_GOLDUCK, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x27, .moves = { MOVE_HYDRO_PUMP, MOVE_CROSS_CHOP, MOVE_BLIZZARD, MOVE_PSYCH_UP }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x55, .moves = { MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x36, .moves = { MOVE_SURF, MOVE_BLIZZARD, MOVE_ROCK_SLIDE, MOVE_SHEER_COLD }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SERIOUS, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x5C, .moves = { MOVE_HYDRO_PUMP, MOVE_PROTECT, MOVE_DRAGON_BREATH, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_SALAMENCE, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x9D, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FLAMETHROWER, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_SERIOUS, }, { .species = SPECIES_METAGROSS, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x15, .moves = { MOVE_METEOR_MASH, MOVE_PSYCHIC, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_REGIROCK, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x95, .moves = { MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_FACADE, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_REGICE, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x96, .moves = { MOVE_BLIZZARD, MOVE_THUNDERBOLT, MOVE_HAIL, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, .nature = NATURE_CAREFUL, }, { .species = SPECIES_REGISTEEL, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x94, .moves = { MOVE_METAL_CLAW, MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_GENTLE, }, { .species = SPECIES_LATIAS, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x96, .moves = { MOVE_MIST_BALL, MOVE_REFLECT, MOVE_RECOVER, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_LATIOS, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x95, .moves = { MOVE_LUSTER_PURGE, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0xD6, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_DOUBLE_TEAM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_KECLEON, .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, .teamFlags = 0x69, .moves = { MOVE_TRICK, MOVE_REST, MOVE_IRON_TAIL, MOVE_DISABLE }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIRKY, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x5F, .moves = { MOVE_LEAF_BLADE, MOVE_EARTHQUAKE, MOVE_REST, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_BRAVE, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x7F, .moves = { MOVE_FOCUS_PUNCH, MOVE_COUNTER, MOVE_SWAGGER, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SASSY, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x57, .moves = { MOVE_IRON_TAIL, MOVE_CURSE, MOVE_DOUBLE_TEAM, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_GARDEVOIR, .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, .teamFlags = 0x3B, .moves = { MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_REST, MOVE_IMPRISON }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_BRAVE, }, { .species = SPECIES_BRELOOM, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x56, .moves = { MOVE_SPORE, MOVE_FOCUS_PUNCH, MOVE_SLUDGE_BOMB, MOVE_IRON_TAIL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_SASSY, }, { .species = SPECIES_ALAKAZAM, .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, .teamFlags = 0x1A, .moves = { MOVE_PSYCHIC, MOVE_TRICK, MOVE_RECOVER, MOVE_SNATCH }, .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HASTY, }, { .species = SPECIES_HARIYAMA, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x65, .moves = { MOVE_REVENGE, MOVE_COUNTER, MOVE_FOCUS_PUNCH, MOVE_REVERSAL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SASSY, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x54, .moves = { MOVE_RAIN_DANCE, MOVE_PROTECT, MOVE_TOXIC, MOVE_SURF }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_CROBAT, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0x4B, .moves = { MOVE_SLUDGE_BOMB, MOVE_BITE, MOVE_AIR_CUTTER, MOVE_SHADOW_BALL }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x75, .moves = { MOVE_CROSS_CHOP, MOVE_ROCK_SLIDE, MOVE_DYNAMIC_PUNCH, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_MANECTRIC, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x0A, .moves = { MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_ATTRACT, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_ELECTRODE, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x64, .moves = { MOVE_THUNDER, MOVE_DOUBLE_TEAM, MOVE_MIRROR_COAT, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_BASHFUL, }, { .species = SPECIES_MUK, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x49, .moves = { MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_PUNCH }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_GENTLE, }, { .species = SPECIES_FLYGON, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0xCD, .moves = { MOVE_PROTECT, MOVE_DIG, MOVE_TOXIC, MOVE_SANDSTORM }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x5B, .moves = { MOVE_SURF, MOVE_THUNDERBOLT, MOVE_BLIZZARD, MOVE_PSYCHIC }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_LUDICOLO, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0x1A, .moves = { MOVE_RAIN_DANCE, MOVE_LEECH_SEED, MOVE_DIVE, MOVE_PROTECT }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_RAICHU, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x4A, .moves = { MOVE_THUNDER, MOVE_REVERSAL, MOVE_FACADE, MOVE_IRON_TAIL }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_TIMID, }, { .species = SPECIES_GOLDUCK, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x0A, .moves = { MOVE_SURF, MOVE_PSYCHIC, MOVE_ICE_BEAM, MOVE_IRON_TAIL }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_DOCILE, }, { .species = SPECIES_HERACROSS, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0x15, .moves = { MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_WALREIN, .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, .teamFlags = 0x26, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_FISSURE, MOVE_SHEER_COLD }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, { .species = SPECIES_KINGDRA, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x4D, .moves = { MOVE_HYDRO_PUMP, MOVE_BLIZZARD, MOVE_HYPER_BEAM, MOVE_DISABLE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_SALAMENCE, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x9C, .moves = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FIRE_BLAST, MOVE_HYDRO_PUMP }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_NAUGHTY, }, { .species = SPECIES_METAGROSS, .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, .teamFlags = 0xB5, .moves = { MOVE_METEOR_MASH, MOVE_PSYCHIC, MOVE_PURSUIT, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_REGIROCK, .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, .teamFlags = 0x95, .moves = { MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_SUPERPOWER, MOVE_REST }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SERIOUS, }, { .species = SPECIES_REGICE, .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, .teamFlags = 0x96, .moves = { MOVE_ICE_BEAM, MOVE_THUNDERBOLT, MOVE_ANCIENT_POWER, MOVE_EXPLOSION }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, .nature = NATURE_RASH, }, { .species = SPECIES_REGISTEEL, .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, .teamFlags = 0xB4, .moves = { MOVE_CURSE, MOVE_AMNESIA, MOVE_RETURN, MOVE_REST }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_LAX, }, { .species = SPECIES_LATIAS, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x92, .moves = { MOVE_MIST_BALL, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_LATIOS, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0x91, .moves = { MOVE_LUSTER_PURGE, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_SURF }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_MILOTIC, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0xB2, .moves = { MOVE_SURF, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_ATTRACT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_BRAVE, }, { .species = SPECIES_SLAKING, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0x65, .moves = { MOVE_YAWN, MOVE_SLASH, MOVE_COUNTER, MOVE_HYPER_BEAM }, .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_DOCILE, }, { .species = SPECIES_SCEPTILE, .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, .teamFlags = 0xDF, .moves = { MOVE_LEAF_BLADE, MOVE_DETECT, MOVE_DRAGON_CLAW, MOVE_CRUNCH }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_BLAZIKEN, .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, .teamFlags = 0xD7, .moves = { MOVE_BLAZE_KICK, MOVE_SKY_UPPERCUT, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, .nature = NATURE_DOCILE, }, { .species = SPECIES_SWAMPERT, .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, .teamFlags = 0x5F, .moves = { MOVE_SURF, MOVE_EARTHQUAKE, MOVE_ICE_BEAM, MOVE_ROCK_TOMB }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, .nature = NATURE_SASSY, }, { .species = SPECIES_SHEDINJA, .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, .teamFlags = 0xDB, .moves = { MOVE_CONFUSE_RAY, MOVE_SHADOW_BALL, MOVE_TOXIC, MOVE_HYPER_BEAM }, .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_METAGROSS, .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, .teamFlags = 0x94, .moves = { MOVE_METEOR_MASH, MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_EARTHQUAKE }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, .nature = NATURE_HARDY, }, { .species = SPECIES_GRUMPIG, .heldItem = BATTLE_TOWER_ITEM_MACHO_BRACE, .teamFlags = 0x4B, .moves = { MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_TRICK, MOVE_REFLECT }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, .nature = NATURE_QUIET, }, { .species = SPECIES_LATIAS, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x92, .moves = { MOVE_MIST_BALL, MOVE_RECOVER, MOVE_ATTRACT, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_ADAMANT, }, { .species = SPECIES_LATIOS, .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, .teamFlags = 0x91, .moves = { MOVE_LUSTER_PURGE, MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_DRAGON_CLAW }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_HARDY, }, { .species = SPECIES_STARMIE, .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, .teamFlags = 0x1A, .moves = { MOVE_SURF, MOVE_THUNDERBOLT, MOVE_PSYCHIC, MOVE_ICE_BEAM }, .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, .nature = NATURE_QUIET, }, { .species = SPECIES_MACHAMP, .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, .teamFlags = 0x14, .moves = { MOVE_CROSS_CHOP, MOVE_COUNTER, MOVE_ROCK_TOMB, MOVE_FLAMETHROWER }, .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, .nature = NATURE_HARDY, }, }; ================================================ FILE: src/data/battle_tower/trainers.h ================================================ const struct BattleTowerTrainer gBattleTowerTrainers[] = { { .trainerClass = FACILITY_CLASS_YOUNGSTER, .name = _("ALVIN"), .teamFlags = 0x01, .greeting = { EC_WORD_ARE, EC_WORD_YOU, EC_WORD_READY, EC_WORD_QUES, EC_WORD_HERE_I_COME, EC_WORD_EXCL, }, }, { .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("DIRK"), .teamFlags = 0x01, .greeting = { EC_WORD_OKAY, EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_FOR, EC_WORD_IT, EC_WORD_EXCL, }, }, { .trainerClass = FACILITY_CLASS_LADY, .name = _("CYBIL"), .teamFlags = 0x02, .greeting = { EC_WORD_YOU_RE, EC_WORD_A, EC_WORD_PUSHOVER, EC_WORD_LET_S, EC_WORD_GET, EC_WORD_GOING, }, }, { .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("CHEN"), .teamFlags = 0x05, .greeting = { EC_WORD_MY, EC_WORD_SPIRIT, EC_WORD_IS, EC_WORD_ENOUGH, EC_WORD_SNORT, EC_WORD_ARRGH, }, }, { .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("YOSHI"), .teamFlags = 0x05, .greeting = { EC_WORD_GO, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_FIGHT, EC_WORD_THE, EC_WORD_BATTLE, }, }, { .trainerClass = FACILITY_CLASS_LASS, .name = _("TINA"), .teamFlags = 0x0A, .greeting = { EC_WORD_STUDY, EC_WORD_IS, EC_WORD_BORING, EC_WORD_LET_S, EC_WORD_BATTLE, EC_WORD_NOW, }, }, { .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("COREY"), .teamFlags = 0x41, .greeting = { EC_WORD_HEY, EC_WORD_I, EC_WORD_WILL, EC_MOVE2(TRANSFORM), EC_WORD_FOR, EC_MOVE(STRENGTH), }, }, { .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("GORDON"), .teamFlags = 0x01, .greeting = { EC_WORD_I, EC_WORD_NEED, EC_WORD_A, EC_WORD_VACATION, EC_WORD_RIGHT, EC_WORD_NOW, }, }, { .trainerClass = FACILITY_CLASS_TUBER, .name = _("ANN"), .teamFlags = 0x02, .greeting = { EC_WORD_WE, EC_WORD_ALL, EC_WORD_ADORE, EC_WORD_POKEMON, EC_WORD_ABSOLUTELY, EC_WORD_TRULY, }, }, { .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("JULIA"), .teamFlags = 0x42, .greeting = { EC_WORD_I_AM, EC_WORD_A, EC_WORD_CUTE, EC_WORD_LADY, EC_WORD_YES, EC_WORD_I_AM, }, }, { .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("GREGORY"), .teamFlags = 0x01, .greeting = { EC_WORD_I, EC_WORD_THINK, EC_WORD_WE, EC_WORD_SHOULD, EC_WORD_START, EC_WORD_TODAY, }, }, { .trainerClass = FACILITY_CLASS_CAMPER, .name = _("KEITH"), .teamFlags = 0x01, .greeting = { EC_WORD_YOU_RE, EC_WORD_MY, EC_WORD_FRIEND, EC_WORD_FROM, EC_WORD_NOW, EC_WORD_ON, }, }, { .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("KENDRA"), .teamFlags = 0x0A, .greeting = { EC_WORD_I_AM, EC_MOVE(SWIFT), EC_WORD_HOW, EC_WORD_ABOUT, EC_WORD_YOU, EC_WORD_QUES, }, }, { .trainerClass = FACILITY_CLASS_HIKER, .name = _("DEV"), .teamFlags = 0x01, .greeting = { EC_WORD_WAHAHAHA, EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_LIKE, EC_WORD_IT_S, EC_MOVE2(PAY_DAY), }, }, { .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("CASSIE"), .teamFlags = 0x0A, .greeting = { EC_WORD_YOU_RE, EC_WORD_STRONG, EC_WORD_AREN_T, 0xFFFF, EC_WORD_YOU, EC_WORD_QUES, }, }, { .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("JULIAN"), .teamFlags = 0x05, .greeting = { EC_WORD_FUFUFU, 0xFFFF, EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_WIN, EC_WORD_KID, }, }, { .trainerClass = FACILITY_CLASS_LASS, .name = _("JOYCE"), .teamFlags = 0x02, .greeting = { EC_WORD_BE, EC_WORD_KIND, EC_WORD_TO, EC_WORD_THE, EC_WORD_DIGITAL, EC_WORD_IDOL, }, }, { .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("LES"), .teamFlags = 0x01, .greeting = { EC_WORD_I_AM, EC_WORD_GREAT, EC_WORD_YOU_RE, EC_WORD_JUST, EC_WORD_RATHER, EC_WORD_OKAY, }, }, { .trainerClass = FACILITY_CLASS_RICH_BOY, .name = _("CLINTON"), .teamFlags = 0x01, .greeting = { EC_WORD_I, EC_WORD_HAVE, EC_WORD_ROUGH_SKIN, EC_WORD_I, EC_WORD_NEED, EC_WORD_NATURAL_CURE, }, }, { .trainerClass = FACILITY_CLASS_BUG_CATCHER, .name = _("LEWIS"), .teamFlags = 0x01, .greeting = { EC_WORD_THIS, EC_WORD_IS, EC_WORD_EXCITING, EC_WORD_CAN, EC_WORD_I, EC_WORD_WIN, }, }, { .trainerClass = FACILITY_CLASS_PICNICKER, .name = _("RACHAEL"), .teamFlags = 0x02, .greeting = { EC_WORD_I, EC_WORD_LIKE, EC_WORD_WALKING, EC_WORD_WITH, EC_WORD_MY, EC_WORD_POKEMON, }, }, { .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("HAROLD"), .teamFlags = 0x09, .greeting = { EC_WORD_HERE, EC_WORD_THEY, EC_WORD_COME, EC_WORD_MY, EC_MOVE2(SUPERPOWER), EC_WORD_POKEMON, }, }, { .trainerClass = FACILITY_CLASS_TUBER, .name = _("KIPP"), .teamFlags = 0x01, .greeting = { EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_I, EC_WORD_SHOULD, EC_WORD_WIN, }, }, { .trainerClass = FACILITY_CLASS_KINDLER, .name = _("IRWIN"), .teamFlags = 0x05, .greeting = { EC_WORD_YOU, EC_WORD_WILL, EC_WORD_BE, EC_WORD_FEELING, EC_WORD_MY, EC_WORD_FIRE, }, }, { .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("EILEEN"), .teamFlags = 0x0A, .greeting = { EC_WORD_I, EC_WORD_WILL, EC_MOVE(ASTONISH), EC_WORD_YOU, EC_WORD_IN, EC_WORD_BATTLE, }, }, { .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("ANNE"), .teamFlags = 0x02, .greeting = { EC_WORD_SORRY, EC_WORD_BUT, EC_WORD_YOU, EC_WORD_WILL, EC_WORD_NOT, EC_WORD_WIN, }, }, { .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("RUTH"), .teamFlags = 0x06, .greeting = { EC_WORD_A, EC_WORD_STRONG, EC_WORD_GIRL, EC_WORD_WANTS, EC_WORD_TOUGH, EC_WORD_POKEMON, }, }, { .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("JEREMY"), .teamFlags = 0x40, .greeting = { EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_COOL, EC_WORD_YOURS, EC_WORD_CAN_T_WIN, }, }, { .trainerClass = FACILITY_CLASS_SAILOR, .name = _("TREVOR"), .teamFlags = 0x09, .greeting = { EC_WORD_MY, EC_WORD_OPPONENT, EC_WORD_IS, EC_WORD_FINALLY, EC_WORD_HERE, EC_WORD_EXCELLENT, }, }, { .trainerClass = FACILITY_CLASS_PKMN_BREEDER, .name = _("COLETTE"), .teamFlags = 0x06, .greeting = { EC_WORD_I, EC_WORD_AM, EC_WORD_HUNGRY, EC_MOVE2(POUND), EC_WORD_MY, EC_MOVE2(BELLY_DRUM), }, }, { .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("PAULA"), .teamFlags = 0x42, .greeting = { EC_WORD_IT_S, EC_WORD_HARD, EC_WORD_TO, EC_WORD_TAKE, EC_WORD_UGLY, EC_MOVE(SPITE), }, }, { .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("STANLY"), .teamFlags = 0x41, .greeting = { EC_WORD_ADVENTURE, EC_WORD_AND, EC_WORD_BATTLE, EC_WORD_ARE, EC_WORD_MY, EC_WORD_LIKES, }, }, { .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("TROY"), .teamFlags = 0x09, .greeting = { EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_LOSE, EC_WORD_TO, EC_WORD_A, EC_WORD_KID, }, }, { .trainerClass = FACILITY_CLASS_YOUNGSTER, .name = _("ED"), .teamFlags = 0x08, .greeting = { EC_WORD_POKEMON, EC_WORD_DAILY, EC_WORD_AT, EC_WORD_SCHOOL, EC_WORD_IT_S, EC_WORD_AWESOME, }, }, { .trainerClass = FACILITY_CLASS_PKMN_RANGER_F, .name = _("ELLEN"), .teamFlags = 0x04, .greeting = { EC_WORD_ARE, EC_WORD_YOU, EC_WORD_KIND, EC_WORD_TO, EC_WORD_YOUR, EC_WORD_POKEMON, }, }, { .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("ARNIE"), .teamFlags = 0x09, .greeting = { EC_WORD_I, EC_WORD_BATTLE, EC_WORD_SERIOUSLY, EC_WORD_BEAUTIFUL, EC_WORD_YOU, EC_MOVE(DIG), }, }, { .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("HAL"), .teamFlags = 0x09, .greeting = { EC_WORD_BOY, EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_READY, EC_WORD_FOR, EC_WORD_SLEEP, }, }, { .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("LAUREN"), .teamFlags = 0x06, .greeting = { EC_WORD_A, EC_WORD_TRAINER, EC_WORD_LIKE, EC_WORD_YOU, EC_WORD_IS, EC_WORD_EXCITING, }, }, { .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("STACY"), .teamFlags = 0x06, .greeting = { EC_WORD_HAVE, EC_WORD_YOU, EC_WORD_A, EC_WORD_STENCH, EC_WORD_OR, EC_MOVE(SWEET_SCENT), }, }, { .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("DARYL"), .teamFlags = 0x81, .greeting = { EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, EC_WORD_I, EC_WORD_WANT, EC_WORD_IT, }, }, { .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("KATHY"), .teamFlags = 0x04, .greeting = { EC_WORD_I, EC_WORD_WILL, EC_WORD_TRY, EC_WORD_MY, EC_WORD_BEST, EC_WORD_TODAY, }, }, { .trainerClass = FACILITY_CLASS_PKMN_RANGER_M, .name = _("HARRIS"), .teamFlags = 0x0C, .greeting = { EC_WORD_WAAAH, EC_WORD_WAAAH, EC_WORD_WAAAH, EC_WORD_WAAAH, EC_WORD_EHEHE, EC_MOVE(FAKE_TEARS), }, }, { .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("GLENN"), .teamFlags = 0x80, .greeting = { EC_WORD_LISTEN, EC_WORD_TO, EC_WORD_MY, EC_WORD_LOUSY, EC_WORD_ANIME, EC_WORD_SONG, }, }, { .trainerClass = FACILITY_CLASS_BIKER, .name = _("NICO"), .teamFlags = 0x04, .greeting = { EC_WORD_DON_T, EC_WORD_JUST, EC_WORD_BATTLE, EC_WORD_DO, EC_WORD_SOMETHING, EC_WORD_ELSE, }, }, { .trainerClass = FACILITY_CLASS_RS_PKMN_BREEDER_M, .name = _("BAILEY"), .teamFlags = 0x41, .greeting = { EC_WORD_ARE, EC_WORD_YOU, EC_WORD_BUSY, EC_WORD_GET, EC_WORD_WITH, EC_WORD_IT, }, }, { .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("ABBIE"), .teamFlags = 0x08, .greeting = { EC_WORD_THE, EC_MOVE(MORNING_SUN), EC_WORD_HAS, EC_WORD_SO, EC_WORD_MUCH, EC_MOVE(COSMIC_POWER), }, }, { .trainerClass = FACILITY_CLASS_CAMPER, .name = _("AL"), .teamFlags = 0x0C, .greeting = { EC_WORD_LET_S, EC_WORD_HAVE, EC_WORD_AN, EC_WORD_EXCITING, EC_WORD_BATTLE, EC_WORD_YEEHAW_EXCL, }, }, { .trainerClass = FACILITY_CLASS_LASS, .name = _("PEGGY"), .teamFlags = 0x42, .greeting = { EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_SEE, EC_WORD_SOME, EC_MOVE(GROWTH), }, }, { .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("NAOMI"), .teamFlags = 0x04, .greeting = { EC_WORD_IT, EC_WORD_WAS, EC_WORD_GREAT, EC_WORD_TO, EC_WORD_BE, EC_WORD_YOUNG, }, }, { .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("KENJI"), .teamFlags = 0x0C, .greeting = { EC_WORD_PLEASE, 0xFFFF, EC_WORD_DON_T, EC_WORD_BE, EC_WORD_MEAN, EC_WORD_TO_ME, }, }, { .trainerClass = FACILITY_CLASS_BIKER, .name = _("ROSS"), .teamFlags = 0x01, .greeting = { EC_WORD_WAKE_UP, EC_WORD_MY, EC_MOVE2(HIDDEN_POWER), EC_WORD_AND, EC_MOVE(ASTONISH), EC_WORD_ME, }, }, { .trainerClass = FACILITY_CLASS_PKMN_RANGER_F, .name = _("EDNA"), .teamFlags = 0x02, .greeting = { EC_WORD_BATTLE_TOWER, EC_WORD_IS, EC_WORD_SO, EC_WORD_ENTERTAINING, EC_WORD_IT_S, EC_WORD_AWESOME, }, }, { .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("ANTON"), .teamFlags = 0x41, .greeting = { EC_WORD_BLEND, EC_WORD_THICK_FAT, EC_WORD_AND, EC_WORD_CHLOROPHYLL, EC_WORD_IT_S, EC_WORD_TASTY, }, }, { .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("MITCH"), .teamFlags = 0x81, .greeting = { EC_WORD_NEXT, EC_WORD_A, EC_WORD_GIRL, EC_WORD_WITH, EC_WORD_A, EC_MOVE(SCARY_FACE), }, }, { .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("ROD"), .teamFlags = 0x42, .greeting = { EC_WORD_GIMME, EC_WORD_A, EC_WORD_TOUGH, EC_WORD_BATTLE, EC_WORD_NOT, EC_WORD_WIMPY, }, }, { .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("RICH"), .teamFlags = 0x01, .greeting = { EC_WORD_TASTY, EC_WORD_WATER, EC_WORD_IS, EC_WORD_HIP_AND, EC_WORD_HAPPENING, EC_WORD_YES_SIR_EXCL, }, }, { .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("DANIEL"), .teamFlags = 0x80, .greeting = { EC_WORD_GO, EC_WORD_FOR, EC_WORD_IT, EC_WORD_MY, EC_WORD_LOVEY_DOVEY, EC_WORD_POKEMON, }, }, { .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("GLORIA"), .teamFlags = 0x82, .greeting = { EC_WORD_LET_S, EC_WORD_GET, EC_WORD_THIS, EC_WORD_FIERY, EC_WORD_BATTLE, EC_WORD_HAPPENING, }, }, { .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("NELSON"), .teamFlags = 0x01, .greeting = { EC_WORD_MUSIC, EC_WORD_IS, EC_WORD_MY, EC_WORD_ALL, EC_WORD_MY, EC_WORD_DESTINY, }, }, { .trainerClass = FACILITY_CLASS_KINDLER, .name = _("FERRIS"), .teamFlags = 0x41, .greeting = { EC_WORD_GOOD, EC_WORD_IT, EC_WORD_IS, EC_WORD_SO, EC_WORD_VERY, EC_WORD_GOOD, }, }, { .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("AMANDA"), .teamFlags = 0x82, .greeting = { EC_WORD_WHAT, EC_WORD_KIND, EC_WORD_OF, EC_WORD_TRAINER, EC_WORD_ARE, EC_WORD_YOU, }, }, { .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("MASON"), .teamFlags = 0x10, .greeting = { EC_WORD_I, EC_WORD_DON_T, EC_WORD_KNOW, EC_WORD_HOW, EC_WORD_TO, EC_WORD_LOSE, }, }, { .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("NATE"), .teamFlags = 0x10, .greeting = { EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_ALL, EC_WORD_THE, EC_MOVE(RAGE), }, }, { .trainerClass = FACILITY_CLASS_LASS, .name = _("MIRIAM"), .teamFlags = 0x82, .greeting = { EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, EC_WORD_SERIOUSLY, EC_WORD_IT_S, EC_WORD_BAD, EC_WORD_NEWS, }, }, { .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("THEO"), .teamFlags = 0x40, .greeting = { EC_WORD_I, EC_WORD_ADORE, EC_WORD_MY, EC_WORD_MEGA, EC_WORD_CUTE, EC_WORD_PLUSH_DOLL, }, }, { .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("PAMELA"), .teamFlags = 0x10, .greeting = { EC_WORD_HERE_I_COME, EC_WORD_I_AM, EC_WORD_THE, EC_WORD_CUTE, EC_MOVE2(WATER_SPORT), EC_WORD_IDOL, }, }, { .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("ALISSA"), .teamFlags = 0x20, .greeting = { EC_WORD_IT_S, EC_WORD_A, EC_WORD_PREPOSTEROUS, EC_WORD_MATCH, EC_WORD_I_AM, EC_WORD_SHOCKED, }, }, { .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("ARTHUR"), .teamFlags = 0x20, .greeting = { EC_WORD_PLEASE, EC_WORD_GIVE, EC_WORD_ME, EC_WORD_A, EC_WORD_GOOD, EC_WORD_BATTLE, }, }, { .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("MARCY"), .teamFlags = 0x82, .greeting = { EC_WORD_I_AM, EC_WORD_BEAUTIFUL, EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_ME, }, }, { .trainerClass = FACILITY_CLASS_COOLTRAINER_M, .name = _("MILLER"), .teamFlags = 0x10, .greeting = { EC_WORD_I, EC_WORD_BATTLE, EC_WORD_DAILY, EC_WORD_I, EC_WORD_WON_T, EC_WORD_LOSE, }, }, { .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("OLIVER"), .teamFlags = 0x11, .greeting = { EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, EC_WORD_GIGGLE, EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, }, }, { .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("MOLLY"), .teamFlags = 0x12, .greeting = { EC_WORD_HOW, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_ON, EC_WORD_MONDAY, EC_WORD_MORNING, }, }, { .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("JASON"), .teamFlags = 0x40, .greeting = { EC_WORD_WATER, EC_WORD_AND, EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_GREAT, }, }, { .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("AVA"), .teamFlags = 0x20, .greeting = { EC_WORD_WHAT, EC_WORD_IS, EC_WORD_THIS, EC_WORD_PRESSURE, EC_WORD_ELLIPSIS, EC_WORD_STATIC, }, }, { .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("HANK"), .teamFlags = 0x10, .greeting = { EC_WORD_YOU_RE, EC_WORD_A, EC_WORD_KID, EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_WIN, }, }, { .trainerClass = FACILITY_CLASS_SAILOR, .name = _("PETER"), .teamFlags = 0x20, .greeting = { EC_WORD_IT_S, EC_WORD_SERIOUSLY, EC_WORD_TERRIBLE, EC_WORD_I, EC_WORD_REALLY, EC_WORD_THINK, }, }, { .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("MINDY"), .teamFlags = 0x20, .greeting = { EC_WORD_YOU, EC_WORD_APPEAR, EC_WORD_TO, EC_WORD_TRAIN, EC_WORD_VERY, EC_WORD_WELL, }, }, { .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("DWIGHT"), .teamFlags = 0x11, .greeting = { EC_WORD_ARE, EC_WORD_YOU, EC_WORD_STRONG, EC_WORD_YOU, EC_WORD_ARE, EC_WORD_SCARY, }, }, { .trainerClass = FACILITY_CLASS_PKMN_BREEDER, .name = _("REENA"), .teamFlags = 0x12, .greeting = { EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_LOSE, EC_WORD_MAYBE, EC_WORD_TODAY, EC_WORD_ELLIPSIS, }, }, { .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("MEGAN"), .teamFlags = 0x10, .greeting = { EC_WORD_DON_T, EC_WORD_MAKE, EC_WORD_THAT, EC_MOVE(SCARY_FACE), EC_WORD_AT, EC_WORD_ME, }, }, { .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("SIERRA"), .teamFlags = 0x04, .greeting = { EC_WORD_I_VE, EC_WORD_RUN, EC_WORD_A_LOT, EC_WORD_SO, EC_WORD_I_AM, EC_WORD_HEALTHY, }, }, { .trainerClass = FACILITY_CLASS_PKMN_RANGER_M, .name = _("ARNOLD"), .teamFlags = 0x08, .greeting = { EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_AWESOME, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ROCK, }, }, { .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("XIN"), .teamFlags = 0x04, .greeting = { EC_WORD_HOO_HAH, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_READY, EC_WORD_TO, EC_WORD_ROCK, }, }, { .trainerClass = FACILITY_CLASS_COOLTRAINER_F, .name = _("KELLY"), .teamFlags = 0x02, .greeting = { EC_WORD_YOU, EC_WORD_COULDN_T, EC_WORD_BEAT, EC_WORD_ME, EC_WORD_EVER, EC_WORD_KID, }, }, { .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("VANCE"), .teamFlags = 0x80, .greeting = { EC_WORD_POKEMON, EC_WORD_ALL, EC_WORD_OVER, EC_WORD_THE, EC_WORD_PLACE, EC_WORD_WOWEE, }, }, { .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("TOBY"), .teamFlags = 0x01, .greeting = { EC_WORD_THIS, EC_WORD_ISN_T, EC_WORD_SPORTS, EC_WORD_IT_S, EC_WORD_A, EC_WORD_BATTLE, }, }, { .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("NORTON"), .teamFlags = 0x20, .greeting = { EC_WORD_I, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_WIN, EC_WORD_PLEASE, EC_WORD_LOSE, }, }, { .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("ZOE"), .teamFlags = 0x02, .greeting = { EC_WORD_THIS, EC_WORD_IS, EC_WORD_SCARY, EC_WORD_PLEASE, EC_WORD_BE, EC_WORD_NICE, }, }, { .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("EMMA"), .teamFlags = 0x20, .greeting = { EC_WORD_DON_T, EC_WORD_YOU, EC_MOVE(FLAIL), EC_WORD_YOU, EC_WORD_CAN_T, EC_MOVE(WITHDRAW), }, }, { .trainerClass = FACILITY_CLASS_HIKER, .name = _("VINCE"), .teamFlags = 0x04, .greeting = { EC_WORD_YAHOO, EC_WORD_YAHOO, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_LISTENING, EC_WORD_QUES, }, }, { .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("MARV"), .teamFlags = 0x10, .greeting = { EC_WORD_LEARN, EC_WORD_TO, EC_WORD_BATTLE, EC_WORD_THE, EC_WORD_CORRECT, EC_WORD_WAY, }, }, { .trainerClass = FACILITY_CLASS_RS_PKMN_BREEDER_M, .name = _("TODD"), .teamFlags = 0x40, .greeting = { EC_WORD_THE, EC_WORD_WAY, EC_WORD_YOU, EC_WORD_BATTLE, EC_WORD_IT_S, EC_WORD_CHILD_S_PLAY, }, }, { .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("GAVIN"), .teamFlags = 0x01, .greeting = { EC_WORD_BABY, EC_WORD_BABY, EC_WORD_BABY, EC_WORD_ROCK, EC_WORD_ME, EC_WORD_HARD, }, }, { .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("QUINN"), .teamFlags = 0x08, .greeting = { EC_WORD_I, EC_WORD_HAVE, EC_WORD_A, EC_WORD_STICKY_HOLD, EC_WORD_ON, EC_WORD_YOU, }, }, { .trainerClass = FACILITY_CLASS_COOLTRAINER_F, .name = _("JENN"), .teamFlags = 0x02, .greeting = { EC_WORD_I_AM, EC_WORD_ON, EC_WORD_A, EC_WORD_TOUGH, EC_WORD_TRAINER, EC_WORD_SEARCH, }, }, { .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("JOEL"), .teamFlags = 0x10, .greeting = { EC_WORD_BELIEVE, EC_WORD_IN, EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_AND, EC_WORD_WIN, }, }, { .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("KYLE"), .teamFlags = 0x0C, .greeting = { EC_WORD_I, EC_WORD_LIKE, EC_WORD_A, EC_WORD_GIRL, EC_WORD_WITH, EC_MOVE2(FORESIGHT), }, }, { .trainerClass = FACILITY_CLASS_COOLTRAINER_M, .name = _("BRET"), .teamFlags = 0x01, .greeting = { EC_WORD_TAKE, EC_WORD_MY, EC_WORD_OVERWHELMING, EC_WORD_POWER, EC_WORD_AND, EC_WORD_DISAPPEAR, }, }, { .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("CARRIE"), .teamFlags = 0x10, .greeting = { EC_WORD_TRAINER, EC_WORD_I, EC_WORD_SEE, EC_WORD_YOU, EC_WORD_ARE, EC_WORD_CAPABLE, }, }, { .trainerClass = FACILITY_CLASS_LADY, .name = _("GILLIAN"), .teamFlags = 0x02, .greeting = { EC_WORD_COME_ON, EC_WORD_SHOW, EC_WORD_ME, EC_WORD_AN, EC_WORD_EXCELLENT, EC_WORD_TIME, }, }, }; ================================================ FILE: src/data/decoration/description.h ================================================ const u8 DecorDesc_SMALL_DESK[] = _( "A small desk built\n" "for one."); const u8 DecorDesc_POKEMON_DESK[] = _( "A small desk built in\n" "the shape of a POKé\n" "BALL."); const u8 DecorDesc_HEAVY_DESK[] = _( "A large desk made\n" "of steel. Put some\n" "decorations on it."); const u8 DecorDesc_RAGGED_DESK[] = _( "A large desk made\n" "of wood. Put some\n" "decorations on it."); const u8 DecorDesc_COMFORT_DESK[] = _( "A large desk made\n" "of leaves. Put some\n" "decorations on it."); const u8 DecorDesc_PRETTY_DESK[] = _( "A huge desk made\n" "of glass. Holds lots\n" "of decorations."); const u8 DecorDesc_BRICK_DESK[] = _( "A huge desk made\n" "of brick. Holds lots\n" "of decorations."); const u8 DecorDesc_CAMP_DESK[] = _( "A huge desk made\n" "of logs. Put lots of\n" "decorations on it."); const u8 DecorDesc_HARD_DESK[] = _( "A huge desk made\n" "of rocks. Holds\n" "many decorations."); const u8 DecorDesc_SMALL_CHAIR[] = _( "A small chair made\n" "for one."); const u8 DecorDesc_POKEMON_CHAIR[] = _( "A small chair built\n" "in the shape of a\n" "POKé BALL."); const u8 DecorDesc_HEAVY_CHAIR[] = _( "A small chair made\n" "of steel."); const u8 DecorDesc_PRETTY_CHAIR[] = _( "A small chair made\n" "of glass."); const u8 DecorDesc_COMFORT_CHAIR[] = _( "A small chair made\n" "of leaves."); const u8 DecorDesc_RAGGED_CHAIR[] = _( "A small chair made\n" "of wood."); const u8 DecorDesc_BRICK_CHAIR[] = _( "A small chair made\n" "of brick."); const u8 DecorDesc_CAMP_CHAIR[] = _( "A small chair made\n" "of logs."); const u8 DecorDesc_HARD_CHAIR[] = _( "A small chair made\n" "of rock."); const u8 DecorDesc_RED_PLANT[] = _( "A vivid red potted\n" "plant."); const u8 DecorDesc_TROPICAL_PLANT[] = _( "A flowering tropical\n" "plant in a pot."); const u8 DecorDesc_PRETTY_FLOWERS[] = _( "A pot of cute\n" "flowers."); const u8 DecorDesc_COLORFUL_PLANT[] = _( "A large pot with\n" "many colorful\n" "flowers."); const u8 DecorDesc_BIG_PLANT[] = _( "A large, umbrella-\n" "shaped plant in a\n" "big pot."); const u8 DecorDesc_GORGEOUS_PLANT[] = _( "A large, impressive\n" "plant in a big pot."); const u8 DecorDesc_RED_BRICK[] = _( "A red-colored brick.\n" "Decorations can be\n" "placed on top."); const u8 DecorDesc_YELLOW_BRICK[] = _( "A yellow-colored\n" "brick. Put some\n" "decorations on top."); const u8 DecorDesc_BLUE_BRICK[] = _( "A blue-colored\n" "brick. Put some\n" "decorations on top."); const u8 DecorDesc_RED_BALLOON[] = _( "A red balloon filled\n" "with water. Bursts\n" "if stepped on."); const u8 DecorDesc_BLUE_BALLOON[] = _( "A blue balloon filled\n" "with water. Bursts\n" "if stepped on."); const u8 DecorDesc_YELLOW_BALLOON[] = _( "A yellow balloon\n" "filled with water.\n" "Pops if stepped on."); const u8 DecorDesc_RED_TENT[] = _( "A large red tent.\n" "You can hide inside\n" "it."); const u8 DecorDesc_BLUE_TENT[] = _( "A large blue tent.\n" "You can hide inside\n" "it."); const u8 DecorDesc_SOLID_BOARD[] = _( "Place over a hole to\n" "cross to the other\n" "side."); const u8 DecorDesc_SLIDE[] = _( "Use to slide down\n" "from the platform."); const u8 DecorDesc_FENCE_LENGTH[] = _( "A small fence that\n" "blocks passage."); const u8 DecorDesc_FENCE_WIDTH[] = _( "A small fence that\n" "blocks passage."); const u8 DecorDesc_TIRE[] = _( "An old large tire.\n" "Decorations can be\n" "placed on top."); const u8 DecorDesc_STAND[] = _( "A large pedestal\n" "with steps."); const u8 DecorDesc_MUD_BALL[] = _( "A large ball of mud.\n" "Crumbles if stepped\n" "on."); const u8 DecorDesc_BREAKABLE_DOOR[] = _( "A weird door that\n" "people can walk\n" "right through."); const u8 DecorDesc_SAND_ORNAMENT[] = _( "An ornament made\n" "of sand. Crumbles if\n" "touched."); const u8 DecorDesc_SILVER_SHIELD[] = _( "Awarded for 50\n" "straight wins at\n" "the BATTLE TOWER."); const u8 DecorDesc_GOLD_SHIELD[] = _( "Awarded for 100\n" "straight wins at\n" "the BATTLE TOWER."); const u8 DecorDesc_GLASS_ORNAMENT[] = _( "A glass replica of\n" "a famous sculpture\n" "at the ART MUSEUM."); const u8 DecorDesc_TV[] = _( "A small, gray-\n" "colored toy TV."); const u8 DecorDesc_ROUND_TV[] = _( "A toy TV modeled\n" "in the image of a\n" "SEEDOT."); const u8 DecorDesc_CUTE_TV[] = _( "A toy TV modeled\n" "in the image of a\n" "SKITTY."); const u8 DecorDesc_GLITTER_MAT[] = _( "An odd mat that\n" "glitters if stepped\n" "on."); const u8 DecorDesc_JUMP_MAT[] = _( "A trick mat that\n" "jumps when it is\n" "stepped on."); const u8 DecorDesc_SPIN_MAT[] = _( "A trick mat that\n" "spins around when\n" "stepped on."); const u8 DecorDesc_C_LOW_NOTE_MAT[] = _( "A mat that plays\n" "a low C note when\n" "stepped on."); const u8 DecorDesc_D_NOTE_MAT[] = _( "A mat that plays\n" "a D note when\n" "stepped on."); const u8 DecorDesc_E_NOTE_MAT[] = _( "A mat that plays\n" "an E note when\n" "stepped on."); const u8 DecorDesc_F_NOTE_MAT[] = _( "A mat that plays\n" "an F note when\n" "stepped on."); const u8 DecorDesc_G_NOTE_MAT[] = _( "A mat that plays\n" "a G note when\n" "stepped on."); const u8 DecorDesc_A_NOTE_MAT[] = _( "A mat that plays\n" "an A note when\n" "stepped on."); const u8 DecorDesc_B_NOTE_MAT[] = _( "A mat that plays\n" "a B note when\n" "stepped on."); const u8 DecorDesc_C_HIGH_NOTE_MAT[] = _( "A mat that plays\n" "a high C note when\n" "stepped on."); const u8 DecorDesc_SURF_MAT[] = _( "A mat designed with\n" "a SURF image.\n" "Put items on top."); const u8 DecorDesc_THUNDER_MAT[] = _( "A mat designed with\n" "a THUNDER image.\n" "Put items on top."); const u8 DecorDesc_FIRE_BLAST_MAT[] = _( "A mat designed with\n" "a FIRE BLAST image.\n" "Put items on top."); const u8 DecorDesc_POWDER_SNOW_MAT[] = _( "A mat with a POWDER\n" "SNOW image design.\n" "Put items on top."); const u8 DecorDesc_ATTRACT_MAT[] = _( "A mat designed with\n" "an ATTRACT image.\n" "Put items on top."); const u8 DecorDesc_FISSURE_MAT[] = _( "A mat designed with\n" "a FISSURE image.\n" "Put items on top."); const u8 DecorDesc_SPIKES_MAT[] = _( "A mat designed with\n" "a SPIKES image.\n" "Put items on top."); const u8 DecorDesc_BALL_POSTER[] = _( "A small poster\n" "printed with POKé\n" "BALLS."); const u8 DecorDesc_GREEN_POSTER[] = _( "A small poster with\n" "a TREECKO print."); const u8 DecorDesc_RED_POSTER[] = _( "A small poster with\n" "a TORCHIC print."); const u8 DecorDesc_BLUE_POSTER[] = _( "A small poster with\n" "a MUDKIP print."); const u8 DecorDesc_CUTE_POSTER[] = _( "A small poster with\n" "an AZURILL print."); const u8 DecorDesc_PIKA_POSTER[] = _( "A large poster with\n" "a PIKACHU and\n" "PICHU print."); const u8 DecorDesc_LONG_POSTER[] = _( "A large poster with\n" "a SEVIPER print."); const u8 DecorDesc_SEA_POSTER[] = _( "A large poster with\n" "a RELICANTH print."); const u8 DecorDesc_SKY_POSTER[] = _( "A large poster with\n" "a WINGULL print."); const u8 DecorDesc_KISS_POSTER[] = _( "A large poster with\n" "a SMOOCHUM print."); const u8 DecorDesc_PICHU_DOLL[] = _( "A PICHU doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_PIKACHU_DOLL[] = _( "A PIKACHU doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_MARILL_DOLL[] = _( "A MARILL doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_TOGEPI_DOLL[] = _( "A TOGEPI doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_CYNDAQUIL_DOLL[] = _( "A CYNDAQUIL doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_CHIKORITA_DOLL[] = _( "A CHIKORITA doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_TOTODILE_DOLL[] = _( "A TOTODILE doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_JIGGLYPUFF_DOLL[] = _( "A JIGGLYPUFF doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_MEOWTH_DOLL[] = _( "A MEOWTH doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_CLEFAIRY_DOLL[] = _( "A CLEFAIRY doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_DITTO_DOLL[] = _( "A DITTO doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_SMOOCHUM_DOLL[] = _( "A SMOOCHUM doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_TREECKO_DOLL[] = _( "A TREECKO doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_TORCHIC_DOLL[] = _( "A TORCHIC doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_MUDKIP_DOLL[] = _( "A MUDKIP doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_DUSKULL_DOLL[] = _( "A DUSKULL doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_WYNAUT_DOLL[] = _( "A WYNAUT doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_BALTOY_DOLL[] = _( "A BALTOY doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_KECLEON_DOLL[] = _( "A KECLEON doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_AZURILL_DOLL[] = _( "An AZURILL doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_SKITTY_DOLL[] = _( "A SKITTY doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_SWABLU_DOLL[] = _( "A SWABLU doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_GULPIN_DOLL[] = _( "A GULPIN doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_LOTAD_DOLL[] = _( "A LOTAD doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_SEEDOT_DOLL[] = _( "A SEEDOT doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_PIKA_CUSHION[] = _( "A PIKACHU cushion.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_ROUND_CUSHION[] = _( "A MARILL cushion.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_KISS_CUSHION[] = _( "A SMOOCHUM\n" "cushion. Place it on\n" "a mat or a desk."); const u8 DecorDesc_ZIGZAG_CUSHION[] = _( "A ZIGZAGOON\n" "cushion. Place it on\n" "a mat or a desk."); const u8 DecorDesc_SPIN_CUSHION[] = _( "A SPINDA cushion.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_DIAMOND_CUSHION[] = _( "A SABLEYE cushion.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_BALL_CUSHION[] = _( "A BALL cushion.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_GRASS_CUSHION[] = _( "A grass-mark\n" "cushion. Place it on\n" "a mat or a desk."); const u8 DecorDesc_FIRE_CUSHION[] = _( "A fire-mark\n" "cushion. Place it on\n" "a mat or a desk."); const u8 DecorDesc_WATER_CUSHION[] = _( "A water-mark\n" "cushion. Place it on\n" "a mat or a desk."); const u8 DecorDesc_SNORLAX_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_RHYDON_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_LAPRAS_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_VENUSAUR_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_CHARIZARD_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_BLASTOISE_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_WAILMER_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_REGIROCK_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_REGICE_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); const u8 DecorDesc_REGISTEEL_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); ================================================ FILE: src/data/decoration/header.h ================================================ const struct Decoration gDecorations[] = { { DECOR_NONE, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 0, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK }, { DECOR_SMALL_DESK, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK }, { DECOR_POKEMON_DESK, _("POKéMON DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_POKEMON_DESK, DecorGfx_POKEMON_DESK }, { DECOR_HEAVY_DESK, _("HEAVY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_HEAVY_DESK, DecorGfx_HEAVY_DESK }, { DECOR_RAGGED_DESK, _("RAGGED DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_RAGGED_DESK, DecorGfx_RAGGED_DESK }, { DECOR_COMFORT_DESK, _("COMFORT DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_COMFORT_DESK, DecorGfx_COMFORT_DESK }, { DECOR_PRETTY_DESK, _("PRETTY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_PRETTY_DESK, DecorGfx_PRETTY_DESK }, { DECOR_BRICK_DESK, _("BRICK DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_BRICK_DESK, DecorGfx_BRICK_DESK }, { DECOR_CAMP_DESK, _("CAMP DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_CAMP_DESK, DecorGfx_CAMP_DESK }, { DECOR_HARD_DESK, _("HARD DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_HARD_DESK, DecorGfx_HARD_DESK }, { DECOR_SMALL_CHAIR, _("SMALL CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_SMALL_CHAIR, DecorGfx_SMALL_CHAIR }, { DECOR_POKEMON_CHAIR, _("POKéMON CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_POKEMON_CHAIR, DecorGfx_POKEMON_CHAIR }, { DECOR_HEAVY_CHAIR, _("HEAVY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HEAVY_CHAIR, DecorGfx_HEAVY_CHAIR }, { DECOR_PRETTY_CHAIR, _("PRETTY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_PRETTY_CHAIR, DecorGfx_PRETTY_CHAIR }, { DECOR_COMFORT_CHAIR, _("COMFORT CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_COMFORT_CHAIR, DecorGfx_COMFORT_CHAIR }, { DECOR_RAGGED_CHAIR, _("RAGGED CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_RAGGED_CHAIR, DecorGfx_RAGGED_CHAIR }, { DECOR_BRICK_CHAIR, _("BRICK CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_BRICK_CHAIR, DecorGfx_BRICK_CHAIR }, { DECOR_CAMP_CHAIR, _("CAMP CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_CAMP_CHAIR, DecorGfx_CAMP_CHAIR }, { DECOR_HARD_CHAIR, _("HARD CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HARD_CHAIR, DecorGfx_HARD_CHAIR }, { DECOR_RED_PLANT, _("RED PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_RED_PLANT, DecorGfx_RED_PLANT }, { DECOR_TROPICAL_PLANT, _("TROPICAL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_TROPICAL_PLANT, DecorGfx_TROPICAL_PLANT }, { DECOR_PRETTY_FLOWERS, _("PRETTY FLOWERS"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_PRETTY_FLOWERS, DecorGfx_PRETTY_FLOWERS }, { DECOR_COLORFUL_PLANT, _("COLORFUL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_COLORFUL_PLANT, DecorGfx_COLORFUL_PLANT }, { DECOR_BIG_PLANT, _("BIG PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_BIG_PLANT, DecorGfx_BIG_PLANT }, { DECOR_GORGEOUS_PLANT, _("GORGEOUS PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_GORGEOUS_PLANT, DecorGfx_GORGEOUS_PLANT }, { DECOR_RED_BRICK, _("RED BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BRICK, DecorGfx_RED_BRICK }, { DECOR_YELLOW_BRICK, _("YELLOW BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BRICK, DecorGfx_YELLOW_BRICK }, { DECOR_BLUE_BRICK, _("BLUE BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BRICK, DecorGfx_BLUE_BRICK }, { DECOR_RED_BALLOON, _("RED BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BALLOON, DecorGfx_RED_BALLOON }, { DECOR_BLUE_BALLOON, _("BLUE BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BALLOON, DecorGfx_BLUE_BALLOON }, { DECOR_YELLOW_BALLOON, _("YELLOW BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BALLOON, DecorGfx_YELLOW_BALLOON }, { DECOR_RED_TENT, _("RED TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_RED_TENT, DecorGfx_RED_TENT }, { DECOR_BLUE_TENT, _("BLUE TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_BLUE_TENT, DecorGfx_BLUE_TENT }, { DECOR_SOLID_BOARD, _("SOLID BOARD"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SOLID_BOARD, DecorGfx_SOLID_BOARD }, { DECOR_SLIDE, _("SLIDE"), DECORPERM_PASS_FLOOR, DECORSHAPE_2x4, DECORCAT_ORNAMENT, 8000, DecorDesc_SLIDE, DecorGfx_SLIDE }, { DECOR_FENCE_LENGTH, _("FENCE LENGTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_LENGTH, DecorGfx_FENCE_LENGTH }, { DECOR_FENCE_WIDTH, _("FENCE WIDTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_WIDTH, DecorGfx_FENCE_WIDTH }, { DECOR_TIRE, _("TIRE"), DECORPERM_SOLID_FLOOR, DECORSHAPE_2x2, DECORCAT_ORNAMENT, 800, DecorDesc_TIRE, DecorGfx_TIRE }, { DECOR_STAND, _("STAND"), DECORPERM_PASS_FLOOR, DECORSHAPE_4x2, DECORCAT_ORNAMENT, 7000, DecorDesc_STAND, DecorGfx_STAND }, { DECOR_MUD_BALL, _("MUD BALL"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 200, DecorDesc_MUD_BALL, DecorGfx_MUD_BALL }, { DECOR_BREAKABLE_DOOR, _("BREAKABLE DOOR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_BREAKABLE_DOOR, DecorGfx_BREAKABLE_DOOR }, { DECOR_SAND_ORNAMENT, _("SAND ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SAND_ORNAMENT, DecorGfx_SAND_ORNAMENT }, { DECOR_SILVER_SHIELD, _("SILVER SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_SILVER_SHIELD, DecorGfx_SILVER_SHIELD }, { DECOR_GOLD_SHIELD, _("GOLD SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GOLD_SHIELD, DecorGfx_GOLD_SHIELD }, { DECOR_GLASS_ORNAMENT, _("GLASS ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GLASS_ORNAMENT, DecorGfx_GLASS_ORNAMENT }, { DECOR_TV, _("TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 3000, DecorDesc_TV, DecorGfx_TV }, { DECOR_ROUND_TV, _("ROUND TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_ROUND_TV, DecorGfx_ROUND_TV }, { DECOR_CUTE_TV, _("CUTE TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_CUTE_TV, DecorGfx_CUTE_TV }, { DECOR_GLITTER_MAT, _("GLITTER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_GLITTER_MAT, DecorGfx_GLITTER_MAT }, { DECOR_JUMP_MAT, _("JUMP MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_JUMP_MAT, DecorGfx_JUMP_MAT }, { DECOR_SPIN_MAT, _("SPIN MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_SPIN_MAT, DecorGfx_SPIN_MAT }, { DECOR_C_LOW_NOTE_MAT, _("C Low NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_LOW_NOTE_MAT, DecorGfx_C_LOW_NOTE_MAT }, { DECOR_D_NOTE_MAT, _("D NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_D_NOTE_MAT, DecorGfx_D_NOTE_MAT }, { DECOR_E_NOTE_MAT, _("E NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_E_NOTE_MAT, DecorGfx_E_NOTE_MAT }, { DECOR_F_NOTE_MAT, _("F NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_F_NOTE_MAT, DecorGfx_F_NOTE_MAT }, { DECOR_G_NOTE_MAT, _("G NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_G_NOTE_MAT, DecorGfx_G_NOTE_MAT }, { DECOR_A_NOTE_MAT, _("A NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_A_NOTE_MAT, DecorGfx_A_NOTE_MAT }, { DECOR_B_NOTE_MAT, _("B NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_B_NOTE_MAT, DecorGfx_B_NOTE_MAT }, { DECOR_C_HIGH_NOTE_MAT, _("C High NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_HIGH_NOTE_MAT, DecorGfx_C_HIGH_NOTE_MAT }, { DECOR_SURF_MAT, _("SURF MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SURF_MAT, DecorGfx_SURF_MAT }, { DECOR_THUNDER_MAT, _("THUNDER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_THUNDER_MAT, DecorGfx_THUNDER_MAT }, { DECOR_FIRE_BLAST_MAT, _("FIRE BLAST MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FIRE_BLAST_MAT, DecorGfx_FIRE_BLAST_MAT }, { DECOR_POWDER_SNOW_MAT, _("POWDER SNOW MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_POWDER_SNOW_MAT, DecorGfx_POWDER_SNOW_MAT }, { DECOR_ATTRACT_MAT, _("ATTRACT MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_ATTRACT_MAT, DecorGfx_ATTRACT_MAT }, { DECOR_FISSURE_MAT, _("FISSURE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FISSURE_MAT, DecorGfx_FISSURE_MAT }, { DECOR_SPIKES_MAT, _("SPIKES MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SPIKES_MAT, DecorGfx_SPIKES_MAT }, { DECOR_BALL_POSTER, _("BALL POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BALL_POSTER, DecorGfx_BALL_POSTER }, { DECOR_GREEN_POSTER, _("GREEN POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_GREEN_POSTER, DecorGfx_GREEN_POSTER }, { DECOR_RED_POSTER, _("RED POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_RED_POSTER, DecorGfx_RED_POSTER }, { DECOR_BLUE_POSTER, _("BLUE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BLUE_POSTER, DecorGfx_BLUE_POSTER }, { DECOR_CUTE_POSTER, _("CUTE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_CUTE_POSTER, DecorGfx_CUTE_POSTER }, { DECOR_PIKA_POSTER, _("PIKA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_PIKA_POSTER, DecorGfx_PIKA_POSTER }, { DECOR_LONG_POSTER, _("LONG POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_LONG_POSTER, DecorGfx_LONG_POSTER }, { DECOR_SEA_POSTER, _("SEA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SEA_POSTER, DecorGfx_SEA_POSTER }, { DECOR_SKY_POSTER, _("SKY POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SKY_POSTER, DecorGfx_SKY_POSTER }, { DECOR_KISS_POSTER, _("KISS POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_KISS_POSTER, DecorGfx_KISS_POSTER }, { DECOR_PICHU_DOLL, _("PICHU DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PICHU_DOLL, DecorGfx_PICHU_DOLL }, { DECOR_PIKACHU_DOLL, _("PIKACHU DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PIKACHU_DOLL, DecorGfx_PIKACHU_DOLL }, { DECOR_MARILL_DOLL, _("MARILL DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MARILL_DOLL, DecorGfx_MARILL_DOLL }, { DECOR_TOGEPI_DOLL, _("TOGEPI DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOGEPI_DOLL, DecorGfx_TOGEPI_DOLL }, { DECOR_CYNDAQUIL_DOLL, _("CYNDAQUIL DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CYNDAQUIL_DOLL, DecorGfx_CYNDAQUIL_DOLL }, { DECOR_CHIKORITA_DOLL, _("CHIKORITA DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CHIKORITA_DOLL, DecorGfx_CHIKORITA_DOLL }, { DECOR_TOTODILE_DOLL, _("TOTODILE DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOTODILE_DOLL, DecorGfx_TOTODILE_DOLL }, { DECOR_JIGGLYPUFF_DOLL, _("JIGGLYPUFF DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_JIGGLYPUFF_DOLL, DecorGfx_JIGGLYPUFF_DOLL }, { DECOR_MEOWTH_DOLL, _("MEOWTH DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MEOWTH_DOLL, DecorGfx_MEOWTH_DOLL }, { DECOR_CLEFAIRY_DOLL, _("CLEFAIRY DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CLEFAIRY_DOLL, DecorGfx_CLEFAIRY_DOLL }, { DECOR_DITTO_DOLL, _("DITTO DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DITTO_DOLL, DecorGfx_DITTO_DOLL }, { DECOR_SMOOCHUM_DOLL, _("SMOOCHUM DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SMOOCHUM_DOLL, DecorGfx_SMOOCHUM_DOLL }, { DECOR_TREECKO_DOLL, _("TREECKO DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TREECKO_DOLL, DecorGfx_TREECKO_DOLL }, { DECOR_TORCHIC_DOLL, _("TORCHIC DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TORCHIC_DOLL, DecorGfx_TORCHIC_DOLL }, { DECOR_MUDKIP_DOLL, _("MUDKIP DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MUDKIP_DOLL, DecorGfx_MUDKIP_DOLL }, { DECOR_DUSKULL_DOLL, _("DUSKULL DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DUSKULL_DOLL, DecorGfx_DUSKULL_DOLL }, { DECOR_WYNAUT_DOLL, _("WYNAUT DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_WYNAUT_DOLL, DecorGfx_WYNAUT_DOLL }, { DECOR_BALTOY_DOLL, _("BALTOY DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_BALTOY_DOLL, DecorGfx_BALTOY_DOLL }, { DECOR_KECLEON_DOLL, _("KECLEON DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_KECLEON_DOLL, DecorGfx_KECLEON_DOLL }, { DECOR_AZURILL_DOLL, _("AZURILL DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_AZURILL_DOLL, DecorGfx_AZURILL_DOLL }, { DECOR_SKITTY_DOLL, _("SKITTY DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SKITTY_DOLL, DecorGfx_SKITTY_DOLL }, { DECOR_SWABLU_DOLL, _("SWABLU DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SWABLU_DOLL, DecorGfx_SWABLU_DOLL }, { DECOR_GULPIN_DOLL, _("GULPIN DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_GULPIN_DOLL, DecorGfx_GULPIN_DOLL }, { DECOR_LOTAD_DOLL, _("LOTAD DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_LOTAD_DOLL, DecorGfx_LOTAD_DOLL }, { DECOR_SEEDOT_DOLL, _("SEEDOT DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SEEDOT_DOLL, DecorGfx_SEEDOT_DOLL }, { DECOR_PIKA_CUSHION, _("PIKA CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_PIKA_CUSHION, DecorGfx_PIKA_CUSHION }, { DECOR_ROUND_CUSHION, _("ROUND CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ROUND_CUSHION, DecorGfx_ROUND_CUSHION }, { DECOR_KISS_CUSHION, _("KISS CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_KISS_CUSHION, DecorGfx_KISS_CUSHION }, { DECOR_ZIGZAG_CUSHION, _("ZIGZAG CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ZIGZAG_CUSHION, DecorGfx_ZIGZAG_CUSHION }, { DECOR_SPIN_CUSHION, _("SPIN CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_SPIN_CUSHION, DecorGfx_SPIN_CUSHION }, { DECOR_DIAMOND_CUSHION, _("DIAMOND CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_DIAMOND_CUSHION, DecorGfx_DIAMOND_CUSHION }, { DECOR_BALL_CUSHION, _("BALL CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_BALL_CUSHION, DecorGfx_BALL_CUSHION }, { DECOR_GRASS_CUSHION, _("GRASS CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_GRASS_CUSHION, DecorGfx_GRASS_CUSHION }, { DECOR_FIRE_CUSHION, _("FIRE CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_FIRE_CUSHION, DecorGfx_FIRE_CUSHION }, { DECOR_WATER_CUSHION, _("WATER CUSHION"), DECORPERM_SPRITE, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_WATER_CUSHION, DecorGfx_WATER_CUSHION }, { DECOR_SNORLAX_DOLL, _("SNORLAX DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_SNORLAX_DOLL, DecorGfx_SNORLAX_DOLL }, { DECOR_RHYDON_DOLL, _("RHYDON DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_RHYDON_DOLL, DecorGfx_RHYDON_DOLL }, { DECOR_LAPRAS_DOLL, _("LAPRAS DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_LAPRAS_DOLL, DecorGfx_LAPRAS_DOLL }, { DECOR_VENUSAUR_DOLL, _("VENUSAUR DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_VENUSAUR_DOLL, DecorGfx_VENUSAUR_DOLL }, { DECOR_CHARIZARD_DOLL, _("CHARIZARD DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_CHARIZARD_DOLL, DecorGfx_CHARIZARD_DOLL }, { DECOR_BLASTOISE_DOLL, _("BLASTOISE DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_BLASTOISE_DOLL, DecorGfx_BLASTOISE_DOLL }, { DECOR_WAILMER_DOLL, _("WAILMER DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_WAILMER_DOLL, DecorGfx_WAILMER_DOLL }, { DECOR_REGIROCK_DOLL, _("REGIROCK DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGIROCK_DOLL, DecorGfx_REGIROCK_DOLL }, { DECOR_REGICE_DOLL, _("REGICE DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGICE_DOLL, DecorGfx_REGICE_DOLL }, { DECOR_REGISTEEL_DOLL, _("REGISTEEL DOLL"), DECORPERM_SPRITE, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGISTEEL_DOLL, DecorGfx_REGISTEEL_DOLL} }; ================================================ FILE: src/data/decoration/tiles.h ================================================ #include "constants/event_objects.h" const u16 DecorGfx_SMALL_DESK[] = { 0x87 }; const u16 DecorGfx_POKEMON_DESK[] = { 0x8F }; const u16 DecorGfx_HEAVY_DESK[] = { 0x90, 0x91, 0x92, 0x98, 0x99, 0x9A }; const u16 DecorGfx_RAGGED_DESK[] = { 0x93, 0x94, 0x95, 0x9B, 0x9C, 0x9D }; const u16 DecorGfx_COMFORT_DESK[] = { 0x96, 0x97, 0xA3, 0x9E, 0x9F, 0xAB }; const u16 DecorGfx_PRETTY_DESK[] = { 0xBD, 0xBE, 0xBF, 0xC5, 0xC6, 0xC7, 0xCD, 0xCE, 0xCF }; const u16 DecorGfx_BRICK_DESK[] = { 0xA0, 0xA1, 0xA2, 0xA8, 0xA9, 0xAA, 0xB0, 0xB1, 0xB2 }; const u16 DecorGfx_CAMP_DESK[] = { 0xA4, 0xA5, 0xA6, 0xAC, 0xAD, 0xAE, 0xB4, 0xB5, 0xB6 }; const u16 DecorGfx_HARD_DESK[] = { 0xA7, 0xBB, 0xBC, 0xAF, 0xC3, 0xC4, 0xB7, 0xCB, 0xCC }; const u16 DecorGfx_SMALL_CHAIR[] = { 0xB8 }; const u16 DecorGfx_POKEMON_CHAIR[] = { 0xB9 }; const u16 DecorGfx_HEAVY_CHAIR[] = { 0xBA }; const u16 DecorGfx_PRETTY_CHAIR[] = { 0xC0 }; const u16 DecorGfx_COMFORT_CHAIR[] = { 0xC1 }; const u16 DecorGfx_RAGGED_CHAIR[] = { 0xC2 }; const u16 DecorGfx_BRICK_CHAIR[] = { 0xC8 }; const u16 DecorGfx_CAMP_CHAIR[] = { 0xC9 }; const u16 DecorGfx_HARD_CHAIR[] = { 0xCA }; const u16 DecorGfx_RED_PLANT[] = { 0xD0, 0xD8 }; const u16 DecorGfx_TROPICAL_PLANT[] = { 0xD2, 0xDA }; const u16 DecorGfx_PRETTY_FLOWERS[] = { 0xD4, 0xDC }; const u16 DecorGfx_COLORFUL_PLANT[] = { 0xE0, 0xE2, 0xE8, 0xE9 }; const u16 DecorGfx_BIG_PLANT[] = { 0xE4, 0xE6, 0xEC, 0xED }; const u16 DecorGfx_GORGEOUS_PLANT[] = { 0xF0, 0xF2, 0xF8, 0xF9 }; const u16 DecorGfx_RED_BRICK[] = { 0x25, 0x2D }; const u16 DecorGfx_YELLOW_BRICK[] = { 0x26, 0x2E }; const u16 DecorGfx_BLUE_BRICK[] = { 0x27, 0x2F }; const u16 DecorGfx_RED_BALLOON[] = { 0x138 }; const u16 DecorGfx_BLUE_BALLOON[] = { 0x13C }; const u16 DecorGfx_YELLOW_BALLOON[] = { 0x140 }; const u16 DecorGfx_RED_TENT[] = { 0x30, 0x31, 0x32, 0x38, 0x39, 0x3A, 0x40, 0x41, 0x3B }; const u16 DecorGfx_BLUE_TENT[] = { 0x48, 0x49, 0x68, 0x50, 0x51, 0x70, 0x58, 0x59, 0x69 }; const u16 DecorGfx_SOLID_BOARD[] = { 0x34, 0x3C }; const u16 DecorGfx_SLIDE[] = { 0x35, 0x36, 0x3D, 0x3E, 0x63, 0x64, 0x6F, 0x77 }; const u16 DecorGfx_FENCE_LENGTH[] = { 0x33 }; const u16 DecorGfx_FENCE_WIDTH[] = { 0x2C }; const u16 DecorGfx_TIRE[] = { 0x80, 0x81, 0x88, 0x89 }; const u16 DecorGfx_STAND[] = { 0x6A, 0x6B, 0x6C, 0x6D, 0x72, 0x73, 0x74, 0x75 }; const u16 DecorGfx_MUD_BALL[] = { 0x28 }; const u16 DecorGfx_BREAKABLE_DOOR[] = { 0x37, 0x3F }; const u16 DecorGfx_SAND_ORNAMENT[] = { 0x85, 0x8D }; const u16 DecorGfx_SILVER_SHIELD[] = { 0xD6, 0xDE }; const u16 DecorGfx_GOLD_SHIELD[] = { 0x12E, 0x136 }; const u16 DecorGfx_GLASS_ORNAMENT[] = { 0x82, 0x8A }; const u16 DecorGfx_TV[] = { 0xF4 }; const u16 DecorGfx_ROUND_TV[] = { 0xF5 }; const u16 DecorGfx_CUTE_TV[] = { 0xF6 }; const u16 DecorGfx_GLITTER_MAT[] = { 0x60 }; const u16 DecorGfx_JUMP_MAT[] = { 0x61 }; const u16 DecorGfx_SPIN_MAT[] = { 0x62 }; const u16 DecorGfx_C_LOW_NOTE_MAT[] = { 0x78 }; const u16 DecorGfx_D_NOTE_MAT[] = { 0x79 }; const u16 DecorGfx_E_NOTE_MAT[] = { 0x7A }; const u16 DecorGfx_F_NOTE_MAT[] = { 0x7B }; const u16 DecorGfx_G_NOTE_MAT[] = { 0x7C }; const u16 DecorGfx_A_NOTE_MAT[] = { 0x7D }; const u16 DecorGfx_B_NOTE_MAT[] = { 0x7E }; const u16 DecorGfx_C_HIGH_NOTE_MAT[] = { 0xB3 }; const u16 DecorGfx_SURF_MAT[] = { 0x42, 0x43, 0x44, 0x4A, 0x4B, 0x4C, 0x52, 0x53, 0x54 }; const u16 DecorGfx_THUNDER_MAT[] = { 0x45, 0x46, 0x47, 0x4D, 0x4E, 0x4F, 0x55, 0x56, 0x57 }; const u16 DecorGfx_FIRE_BLAST_MAT[] = { 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x65, 0x66, 0x67 }; const u16 DecorGfx_POWDER_SNOW_MAT[] = { 0x100, 0x101, 0x102, 0x108, 0x109, 0x10A, 0x110, 0x111, 0x112 }; const u16 DecorGfx_ATTRACT_MAT[] = { 0x103, 0x104, 0x105, 0x10B, 0x10C, 0x10D, 0x113, 0x114, 0x115 }; const u16 DecorGfx_FISSURE_MAT[] = { 0x106, 0x107, 0x118, 0x10E, 0x10F, 0x120, 0x116, 0x117, 0x128 }; const u16 DecorGfx_SPIKES_MAT[] = { 0x119, 0x11A, 0x11B, 0x121, 0x122, 0x123, 0x129, 0x12A, 0x12B }; const u16 DecorGfx_BALL_POSTER[] = { 0x130 }; const u16 DecorGfx_GREEN_POSTER[] = { 0x131 }; const u16 DecorGfx_RED_POSTER[] = { 0x132 }; const u16 DecorGfx_BLUE_POSTER[] = { 0x133 }; const u16 DecorGfx_CUTE_POSTER[] = { 0x134 }; const u16 DecorGfx_PIKA_POSTER[] = { 0x11C, 0x11D }; const u16 DecorGfx_LONG_POSTER[] = { 0x11E, 0x11F }; const u16 DecorGfx_SEA_POSTER[] = { 0x124, 0x125 }; const u16 DecorGfx_SKY_POSTER[] = { 0x126, 0x127 }; const u16 DecorGfx_KISS_POSTER[] = { 0x12C, 0x12D }; const u16 DecorGfx_PICHU_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_PIKACHU_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_MARILL_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_TOGEPI_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_CYNDAQUIL_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_CHIKORITA_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_TOTODILE_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_JIGGLYPUFF_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_MEOWTH_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_CLEFAIRY_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_DITTO_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_SMOOCHUM_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_TREECKO_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_TORCHIC_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_MUDKIP_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_DUSKULL_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_WYNAUT_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_BALTOY_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_KECLEON_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_AZURILL_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_SKITTY_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_SWABLU_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_GULPIN_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_LOTAD_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_SEEDOT_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_PIKA_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_ROUND_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_KISS_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_ZIGZAG_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_SPIN_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_DIAMOND_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_BALL_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_GRASS_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_FIRE_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_WATER_CUSHION[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_SNORLAX_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_RHYDON_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_LAPRAS_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_VENUSAUR_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_CHARIZARD_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_BLASTOISE_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_WAILMER_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_REGIROCK_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_REGICE_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; const u16 DecorGfx_REGISTEEL_DOLL[] = { OBJ_EVENT_GFX_ITEM_BALL }; ================================================ FILE: src/data/easy_chat/easy_chat_group_actions.h ================================================ static const u8 sEasyChatWord_Meets[] = _("MEETS"); static const u8 sEasyChatWord_Concede[] = _("CONCEDE"); static const u8 sEasyChatWord_Give[] = _("GIVE"); static const u8 sEasyChatWord_Gives[] = _("GIVES"); static const u8 sEasyChatWord_Played[] = _("PLAYED"); static const u8 sEasyChatWord_Plays[] = _("PLAYS"); static const u8 sEasyChatWord_Collect[] = _("COLLECT"); static const u8 sEasyChatWord_Walking[] = _("WALKING"); static const u8 sEasyChatWord_Walks[] = _("WALKS"); static const u8 sEasyChatWord_Says[] = _("SAYS"); static const u8 sEasyChatWord_Went[] = _("WENT"); static const u8 sEasyChatWord_Said[] = _("SAID"); static const u8 sEasyChatWord_WakeUp[] = _("WAKE UP"); static const u8 sEasyChatWord_WakesUp[] = _("WAKES UP"); static const u8 sEasyChatWord_Angers[] = _("ANGERS"); static const u8 sEasyChatWord_Teach[] = _("TEACH"); static const u8 sEasyChatWord_Teaches[] = _("TEACHES"); static const u8 sEasyChatWord_Please[] = _("PLEASE"); static const u8 sEasyChatWord_Learn[] = _("LEARN"); static const u8 sEasyChatWord_Change[] = _("CHANGE"); static const u8 sEasyChatWord_Story[] = _("STORY"); static const u8 sEasyChatWord_Trust[] = _("TRUST"); static const u8 sEasyChatWord_Lavish[] = _("LAVISH"); static const u8 sEasyChatWord_Listens[] = _("LISTENS"); static const u8 sEasyChatWord_Hearing[] = _("HEARING"); static const u8 sEasyChatWord_Trains[] = _("TRAINS"); static const u8 sEasyChatWord_Choose[] = _("CHOOSE"); static const u8 sEasyChatWord_Come[] = _("COME"); static const u8 sEasyChatWord_Came[] = _("CAME"); static const u8 sEasyChatWord_Search[] = _("SEARCH"); static const u8 sEasyChatWord_Make[] = _("MAKE"); static const u8 sEasyChatWord_Cause[] = _("CAUSE"); static const u8 sEasyChatWord_Know[] = _("KNOW"); static const u8 sEasyChatWord_Knows[] = _("KNOWS"); static const u8 sEasyChatWord_Refuse[] = _("REFUSE"); static const u8 sEasyChatWord_Stores[] = _("STORES"); static const u8 sEasyChatWord_Brag[] = _("BRAG"); static const u8 sEasyChatWord_Ignorant[] = _("IGNORANT"); static const u8 sEasyChatWord_Thinks[] = _("THINKS"); static const u8 sEasyChatWord_Believe[] = _("BELIEVE"); static const u8 sEasyChatWord_Slide[] = _("SLIDE"); static const u8 sEasyChatWord_Eats[] = _("EATS"); static const u8 sEasyChatWord_Use[] = _("USE"); static const u8 sEasyChatWord_Uses[] = _("USES"); static const u8 sEasyChatWord_Using[] = _("USING"); static const u8 sEasyChatWord_Couldnt[] = _("COULDN'T"); static const u8 sEasyChatWord_Capable[] = _("CAPABLE"); static const u8 sEasyChatWord_Disappear[] = _("DISAPPEAR"); static const u8 sEasyChatWord_Appear[] = _("APPEAR"); static const u8 sEasyChatWord_Throw[] = _("THROW"); static const u8 sEasyChatWord_Worry[] = _("WORRY"); static const u8 sEasyChatWord_Slept[] = _("SLEPT"); static const u8 sEasyChatWord_Sleep[] = _("SLEEP"); static const u8 sEasyChatWord_Release[] = _("RELEASE"); static const u8 sEasyChatWord_Drinks[] = _("DRINKS"); static const u8 sEasyChatWord_Runs[] = _("RUNS"); static const u8 sEasyChatWord_Run[] = _("RUN"); static const u8 sEasyChatWord_Works[] = _("WORKS"); static const u8 sEasyChatWord_Working[] = _("WORKING"); static const u8 sEasyChatWord_Talking[] = _("TALKING"); static const u8 sEasyChatWord_Talk[] = _("TALK"); static const u8 sEasyChatWord_Sink[] = _("SINK"); static const u8 sEasyChatWord_Smack[] = _("SMACK"); static const u8 sEasyChatWord_Pretend[] = _("PRETEND"); static const u8 sEasyChatWord_Praise[] = _("PRAISE"); static const u8 sEasyChatWord_Overdo[] = _("OVERDO"); static const u8 sEasyChatWord_Show[] = _("SHOW"); static const u8 sEasyChatWord_Looks[] = _("LOOKS"); static const u8 sEasyChatWord_Sees[] = _("SEES"); static const u8 sEasyChatWord_Seek[] = _("SEEK"); static const u8 sEasyChatWord_Own[] = _("OWN"); static const u8 sEasyChatWord_Take[] = _("TAKE"); static const u8 sEasyChatWord_Allow[] = _("ALLOW"); static const u8 sEasyChatWord_Forget[] = _("FORGET"); static const u8 sEasyChatWord_Forgets[] = _("FORGETS"); static const u8 sEasyChatWord_Appears[] = _("APPEARS"); static const u8 sEasyChatWord_Faint[] = _("FAINT"); static const u8 sEasyChatWord_Fainted[] = _("FAINTED"); static const struct EasyChatWordInfo sEasyChatGroup_Actions[] = { { .text = sEasyChatWord_Meets, .alphabeticalOrder = 72, .enabled = TRUE }, { .text = sEasyChatWord_Concede, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Give, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_Gives, .alphabeticalOrder = 75, .enabled = TRUE }, { .text = sEasyChatWord_Played, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Plays, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_Collect, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Walking, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_Walks, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Says, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Went, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Said, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_WakeUp, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_WakesUp, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Angers, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_Teach, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_Teaches, .alphabeticalOrder = 54, .enabled = TRUE }, { .text = sEasyChatWord_Please, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Learn, .alphabeticalOrder = 76, .enabled = TRUE }, { .text = sEasyChatWord_Change, .alphabeticalOrder = 77, .enabled = TRUE }, { .text = sEasyChatWord_Story, .alphabeticalOrder = 73, .enabled = TRUE }, { .text = sEasyChatWord_Trust, .alphabeticalOrder = 74, .enabled = TRUE }, { .text = sEasyChatWord_Lavish, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Listens, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Hearing, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Trains, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Choose, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Come, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Came, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Search, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Make, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Cause, .alphabeticalOrder = 67, .enabled = TRUE }, { .text = sEasyChatWord_Know, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Knows, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Refuse, .alphabeticalOrder = 65, .enabled = TRUE }, { .text = sEasyChatWord_Stores, .alphabeticalOrder = 70, .enabled = TRUE }, { .text = sEasyChatWord_Brag, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Ignorant, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Thinks, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Believe, .alphabeticalOrder = 64, .enabled = TRUE }, { .text = sEasyChatWord_Slide, .alphabeticalOrder = 63, .enabled = TRUE }, { .text = sEasyChatWord_Eats, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Use, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_Uses, .alphabeticalOrder = 56, .enabled = TRUE }, { .text = sEasyChatWord_Using, .alphabeticalOrder = 55, .enabled = TRUE }, { .text = sEasyChatWord_Couldnt, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Capable, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Disappear, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Appear, .alphabeticalOrder = 69, .enabled = TRUE }, { .text = sEasyChatWord_Throw, .alphabeticalOrder = 68, .enabled = TRUE }, { .text = sEasyChatWord_Worry, .alphabeticalOrder = 66, .enabled = TRUE }, { .text = sEasyChatWord_Slept, .alphabeticalOrder = 61, .enabled = TRUE }, { .text = sEasyChatWord_Sleep, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_Release, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_Drinks, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_Runs, .alphabeticalOrder = 62, .enabled = TRUE }, { .text = sEasyChatWord_Run, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Works, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Working, .alphabeticalOrder = 71, .enabled = TRUE }, { .text = sEasyChatWord_Talking, .alphabeticalOrder = 60, .enabled = TRUE }, { .text = sEasyChatWord_Talk, .alphabeticalOrder = 59, .enabled = TRUE }, { .text = sEasyChatWord_Sink, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Smack, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Pretend, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Praise, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_Overdo, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Show, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Looks, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Sees, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Seek, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_Own, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Take, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Allow, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Forget, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Forgets, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Appears, .alphabeticalOrder = 58, .enabled = TRUE }, { .text = sEasyChatWord_Faint, .alphabeticalOrder = 57, .enabled = TRUE }, { .text = sEasyChatWord_Fainted, .alphabeticalOrder = 50, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_adjectives.h ================================================ static const u8 sEasyChatWord_Wandering[] = _("WANDERING"); static const u8 sEasyChatWord_Rickety[] = _("RICKETY"); static const u8 sEasyChatWord_RockSolid[] = _("ROCK-SOLID"); static const u8 sEasyChatWord_Hungry[] = _("HUNGRY"); static const u8 sEasyChatWord_Tight[] = _("TIGHT"); static const u8 sEasyChatWord_Ticklish[] = _("TICKLISH"); static const u8 sEasyChatWord_Twirling[] = _("TWIRLING"); static const u8 sEasyChatWord_Spiraling[] = _("SPIRALING"); static const u8 sEasyChatWord_Thirsty[] = _("THIRSTY"); static const u8 sEasyChatWord_Lolling[] = _("LOLLING"); static const u8 sEasyChatWord_Silky[] = _("SILKY"); static const u8 sEasyChatWord_Sadly[] = _("SADLY"); static const u8 sEasyChatWord_Hopeless[] = _("HOPELESS"); static const u8 sEasyChatWord_Useless[] = _("USELESS"); static const u8 sEasyChatWord_Drooling[] = _("DROOLING"); static const u8 sEasyChatWord_Exciting[] = _("EXCITING"); static const u8 sEasyChatWord_Thick[] = _("THICK"); static const u8 sEasyChatWord_Smooth[] = _("SMOOTH"); static const u8 sEasyChatWord_Slimy[] = _("SLIMY"); static const u8 sEasyChatWord_Thin[] = _("THIN"); static const u8 sEasyChatWord_Break[] = _("BREAK"); static const u8 sEasyChatWord_Voracious[] = _("VORACIOUS"); static const u8 sEasyChatWord_Scatter[] = _("SCATTER"); static const u8 sEasyChatWord_Awesome[] = _("AWESOME"); static const u8 sEasyChatWord_Wimpy[] = _("WIMPY"); static const u8 sEasyChatWord_Wobbly[] = _("WOBBLY"); static const u8 sEasyChatWord_Shaky[] = _("SHAKY"); static const u8 sEasyChatWord_Ripped[] = _("RIPPED"); static const u8 sEasyChatWord_Shredded[] = _("SHREDDED"); static const u8 sEasyChatWord_Increasing[] = _("INCREASING"); static const u8 sEasyChatWord_Yet[] = _("YET"); static const u8 sEasyChatWord_Destroyed[] = _("DESTROYED"); static const u8 sEasyChatWord_Fiery[] = _("FIERY"); static const u8 sEasyChatWord_LoveyDovey[] = _("LOVEY-DOVEY"); static const u8 sEasyChatWord_Happily[] = _("HAPPILY"); static const u8 sEasyChatWord_Anticipation[] = _("ANTICIPATION"); static const struct EasyChatWordInfo sEasyChatGroup_Adjectives[] = { { .text = sEasyChatWord_Wandering, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Rickety, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_RockSolid, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Hungry, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Tight, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Ticklish, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Twirling, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Spiraling, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Thirsty, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Lolling, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Silky, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Sadly, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Hopeless, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Useless, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Drooling, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Exciting, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Thick, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Smooth, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Slimy, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Thin, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Break, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Voracious, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Scatter, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Awesome, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Wimpy, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Wobbly, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Shaky, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Ripped, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Shredded, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Increasing, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Yet, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Destroyed, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Fiery, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_LoveyDovey, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Happily, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Anticipation, .alphabeticalOrder = 30, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_battle.h ================================================ static const u8 sEasyChatWord_MatchUp[] = _("MATCH UP"); static const u8 sEasyChatWord_Go[] = _("GO"); static const u8 sEasyChatWord_No1[] = _("NO. 1"); static const u8 sEasyChatWord_Decide[] = _("DECIDE"); static const u8 sEasyChatWord_LetMeWin[] = _("LET ME WIN"); static const u8 sEasyChatWord_Wins[] = _("WINS"); static const u8 sEasyChatWord_Win[] = _("WIN"); static const u8 sEasyChatWord_Won[] = _("WON"); static const u8 sEasyChatWord_IfIWin[] = _("IF I WIN"); static const u8 sEasyChatWord_WhenIWin[] = _("WHEN I WIN"); static const u8 sEasyChatWord_CantWin[] = _("CAN'T WIN"); static const u8 sEasyChatWord_CanWin[] = _("CAN WIN"); static const u8 sEasyChatWord_NoMatch[] = _("NO MATCH"); static const u8 sEasyChatWord_Spirit[] = _("SPIRIT"); static const u8 sEasyChatWord_Decided[] = _("DECIDED"); static const u8 sEasyChatWord_TrumpCard[] = _("TRUMP CARD"); static const u8 sEasyChatWord_TakeThat[] = _("TAKE THAT"); static const u8 sEasyChatWord_ComeOn[] = _("COME ON"); static const u8 sEasyChatWord_Attack[] = _("ATTACK"); static const u8 sEasyChatWord_Surrender[] = _("SURRENDER"); static const u8 sEasyChatWord_Gutsy[] = _("GUTSY"); static const u8 sEasyChatWord_Talent[] = _("TALENT"); static const u8 sEasyChatWord_Strategy[] = _("STRATEGY"); static const u8 sEasyChatWord_Smite[] = _("SMITE"); static const u8 sEasyChatWord_Match[] = _("MATCH"); static const u8 sEasyChatWord_Victory[] = _("VICTORY"); static const u8 sEasyChatWord_Offensive[] = _("OFFENSIVE"); static const u8 sEasyChatWord_Sense[] = _("SENSE"); static const u8 sEasyChatWord_Versus[] = _("VERSUS"); static const u8 sEasyChatWord_Fights[] = _("FIGHTS"); static const u8 sEasyChatWord_Power[] = _("POWER"); static const u8 sEasyChatWord_Challenge[] = _("CHALLENGE"); static const u8 sEasyChatWord_Strong[] = _("STRONG"); static const u8 sEasyChatWord_TooStrong[] = _("TOO STRONG"); static const u8 sEasyChatWord_GoEasy[] = _("GO EASY"); static const u8 sEasyChatWord_Foe[] = _("FOE"); static const u8 sEasyChatWord_Genius[] = _("GENIUS"); static const u8 sEasyChatWord_Legend[] = _("LEGEND"); static const u8 sEasyChatWord_Escape[] = _("ESCAPE"); static const u8 sEasyChatWord_Aim[] = _("AIM"); static const u8 sEasyChatWord_Battle[] = _("BATTLE"); static const u8 sEasyChatWord_Fight[] = _("FIGHT"); static const u8 sEasyChatWord_Resuscitate[] = _("RESUSCITATE"); static const u8 sEasyChatWord_Points[] = _("POINTS"); static const u8 sEasyChatWord_Serious[] = _("SERIOUS"); static const u8 sEasyChatWord_GiveUp[] = _("GIVE UP"); static const u8 sEasyChatWord_Loss[] = _("LOSS"); static const u8 sEasyChatWord_IfILose[] = _("IF I LOSE"); static const u8 sEasyChatWord_Lost[] = _("LOST"); static const u8 sEasyChatWord_Lose[] = _("LOSE"); static const u8 sEasyChatWord_Guard[] = _("GUARD"); static const u8 sEasyChatWord_Partner[] = _("PARTNER"); static const u8 sEasyChatWord_Reject[] = _("REJECT"); static const u8 sEasyChatWord_Accept[] = _("ACCEPT"); static const u8 sEasyChatWord_Invincible[] = _("INVINCIBLE"); static const u8 sEasyChatWord_Received[] = _("RECEIVED"); static const u8 sEasyChatWord_Easy[] = _("EASY"); static const u8 sEasyChatWord_Weak[] = _("WEAK"); static const u8 sEasyChatWord_TooWeak[] = _("TOO WEAK"); static const u8 sEasyChatWord_Pushover[] = _("PUSHOVER"); static const u8 sEasyChatWord_Leader[] = _("LEADER"); static const u8 sEasyChatWord_Rule[] = _("RULE"); static const u8 sEasyChatWord_Move[] = _("MOVE"); static const struct EasyChatWordInfo sEasyChatGroup_Battle[] = { { .text = sEasyChatWord_MatchUp, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_Go, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_No1, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Decide, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_LetMeWin, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Wins, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Win, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Won, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_IfIWin, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_WhenIWin, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_CantWin, .alphabeticalOrder = 56, .enabled = TRUE }, { .text = sEasyChatWord_CanWin, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_NoMatch, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Spirit, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Decided, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_TrumpCard, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_TakeThat, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_ComeOn, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Attack, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Surrender, .alphabeticalOrder = 50, .enabled = TRUE }, { .text = sEasyChatWord_Gutsy, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Talent, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_Strategy, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Smite, .alphabeticalOrder = 54, .enabled = TRUE }, { .text = sEasyChatWord_Match, .alphabeticalOrder = 60, .enabled = TRUE }, { .text = sEasyChatWord_Victory, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Offensive, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Sense, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_Versus, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_Fights, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_Power, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Challenge, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Strong, .alphabeticalOrder = 62, .enabled = TRUE }, { .text = sEasyChatWord_TooStrong, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_GoEasy, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Foe, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Genius, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_Legend, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Escape, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Aim, .alphabeticalOrder = 59, .enabled = TRUE }, { .text = sEasyChatWord_Battle, .alphabeticalOrder = 55, .enabled = TRUE }, { .text = sEasyChatWord_Fight, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_Resuscitate, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Points, .alphabeticalOrder = 61, .enabled = TRUE }, { .text = sEasyChatWord_Serious, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_GiveUp, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_Loss, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_IfILose, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Lost, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Lose, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Guard, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Partner, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Reject, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Accept, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Invincible, .alphabeticalOrder = 58, .enabled = TRUE }, { .text = sEasyChatWord_Received, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Easy, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Weak, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_TooWeak, .alphabeticalOrder = 57, .enabled = TRUE }, { .text = sEasyChatWord_Pushover, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Leader, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Rule, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Move, .alphabeticalOrder = 7, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_conditions.h ================================================ static const u8 sEasyChatWord_Hot[] = _("HOT"); static const u8 sEasyChatWord_Exists[] = _("EXISTS"); static const u8 sEasyChatWord_Excess[] = _("EXCESS"); static const u8 sEasyChatWord_Approved[] = _("APPROVED"); static const u8 sEasyChatWord_Has[] = _("HAS"); static const u8 sEasyChatWord_Good[] = _("GOOD"); static const u8 sEasyChatWord_Less[] = _("LESS"); static const u8 sEasyChatWord_Momentum[] = _("MOMENTUM"); static const u8 sEasyChatWord_Going[] = _("GOING"); static const u8 sEasyChatWord_Weird[] = _("WEIRD"); static const u8 sEasyChatWord_Busy[] = _("BUSY"); static const u8 sEasyChatWord_Together[] = _("TOGETHER"); static const u8 sEasyChatWord_Full[] = _("FULL"); static const u8 sEasyChatWord_Absent[] = _("ABSENT"); static const u8 sEasyChatWord_Being[] = _("BEING"); static const u8 sEasyChatWord_Need[] = _("NEED"); static const u8 sEasyChatWord_Tasty[] = _("TASTY"); static const u8 sEasyChatWord_Skilled[] = _("SKILLED"); static const u8 sEasyChatWord_Noisy[] = _("NOISY"); static const u8 sEasyChatWord_Big[] = _("BIG"); static const u8 sEasyChatWord_Late[] = _("LATE"); static const u8 sEasyChatWord_Close[] = _("CLOSE"); static const u8 sEasyChatWord_Docile[] = _("DOCILE"); static const u8 sEasyChatWord_Amusing[] = _("AMUSING"); static const u8 sEasyChatWord_Entertaining[] = _("ENTERTAINING"); static const u8 sEasyChatWord_Perfection[] = _("PERFECTION"); static const u8 sEasyChatWord_Pretty[] = _("PRETTY"); static const u8 sEasyChatWord_Healthy[] = _("HEALTHY"); static const u8 sEasyChatWord_Excellent[] = _("EXCELLENT"); static const u8 sEasyChatWord_UpsideDown[] = _("UPSIDE DOWN"); static const u8 sEasyChatWord_Cold[] = _("COLD"); static const u8 sEasyChatWord_Refreshing[] = _("REFRESHING"); static const u8 sEasyChatWord_Unavoidable[] = _("UNAVOIDABLE"); static const u8 sEasyChatWord_Much[] = _("MUCH"); static const u8 sEasyChatWord_Overwhelming[] = _("OVERWHELMING"); static const u8 sEasyChatWord_Fabulous[] = _("FABULOUS"); static const u8 sEasyChatWord_Else[] = _("ELSE"); static const u8 sEasyChatWord_Expensive[] = _("EXPENSIVE"); static const u8 sEasyChatWord_Correct[] = _("CORRECT"); static const u8 sEasyChatWord_Impossible[] = _("IMPOSSIBLE"); static const u8 sEasyChatWord_Small[] = _("SMALL"); static const u8 sEasyChatWord_Different[] = _("DIFFERENT"); static const u8 sEasyChatWord_Tired[] = _("TIRED"); static const u8 sEasyChatWord_Skill[] = _("SKILL"); static const u8 sEasyChatWord_Top[] = _("TOP"); static const u8 sEasyChatWord_NonStop[] = _("NON-STOP"); static const u8 sEasyChatWord_Preposterous[] = _("PREPOSTEROUS"); static const u8 sEasyChatWord_None[] = _("NONE"); static const u8 sEasyChatWord_Nothing[] = _("NOTHING"); static const u8 sEasyChatWord_Natural[] = _("NATURAL"); static const u8 sEasyChatWord_Becomes[] = _("BECOMES"); static const u8 sEasyChatWord_Lukewarm[] = _("LUKEWARM"); static const u8 sEasyChatWord_Fast[] = _("FAST"); static const u8 sEasyChatWord_Low[] = _("LOW"); static const u8 sEasyChatWord_Awful[] = _("AWFUL"); static const u8 sEasyChatWord_Alone[] = _("ALONE"); static const u8 sEasyChatWord_Bored[] = _("BORED"); static const u8 sEasyChatWord_Secret[] = _("SECRET"); static const u8 sEasyChatWord_Mystery[] = _("MYSTERY"); static const u8 sEasyChatWord_Lacks[] = _("LACKS"); static const u8 sEasyChatWord_Best[] = _("BEST"); static const u8 sEasyChatWord_Lousy[] = _("LOUSY"); static const u8 sEasyChatWord_Mistake[] = _("MISTAKE"); static const u8 sEasyChatWord_Kind[] = _("KIND"); static const u8 sEasyChatWord_Well[] = _("WELL"); static const u8 sEasyChatWord_Weakened[] = _("WEAKENED"); static const u8 sEasyChatWord_Simple[] = _("SIMPLE"); static const u8 sEasyChatWord_Seems[] = _("SEEMS"); static const u8 sEasyChatWord_Badly[] = _("BADLY"); static const struct EasyChatWordInfo sEasyChatGroup_Conditions[] = { { .text = sEasyChatWord_Hot, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Exists, .alphabeticalOrder = 55, .enabled = TRUE }, { .text = sEasyChatWord_Excess, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Approved, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Has, .alphabeticalOrder = 54, .enabled = TRUE }, { .text = sEasyChatWord_Good, .alphabeticalOrder = 68, .enabled = TRUE }, { .text = sEasyChatWord_Less, .alphabeticalOrder = 50, .enabled = TRUE }, { .text = sEasyChatWord_Momentum, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Going, .alphabeticalOrder = 60, .enabled = TRUE }, { .text = sEasyChatWord_Weird, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Busy, .alphabeticalOrder = 56, .enabled = TRUE }, { .text = sEasyChatWord_Together, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Full, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Absent, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Being, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Need, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Tasty, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Skilled, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_Noisy, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Big, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Late, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Close, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Docile, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Amusing, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Entertaining, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_Perfection, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Pretty, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Healthy, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Excellent, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_UpsideDown, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Cold, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Refreshing, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Unavoidable, .alphabeticalOrder = 63, .enabled = TRUE }, { .text = sEasyChatWord_Much, .alphabeticalOrder = 59, .enabled = TRUE }, { .text = sEasyChatWord_Overwhelming, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Fabulous, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Else, .alphabeticalOrder = 61, .enabled = TRUE }, { .text = sEasyChatWord_Expensive, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_Correct, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_Impossible, .alphabeticalOrder = 62, .enabled = TRUE }, { .text = sEasyChatWord_Small, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Different, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Tired, .alphabeticalOrder = 58, .enabled = TRUE }, { .text = sEasyChatWord_Skill, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_Top, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_NonStop, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Preposterous, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_None, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_Nothing, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_Natural, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Becomes, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Lukewarm, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_Fast, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Low, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Awful, .alphabeticalOrder = 57, .enabled = TRUE }, { .text = sEasyChatWord_Alone, .alphabeticalOrder = 67, .enabled = TRUE }, { .text = sEasyChatWord_Bored, .alphabeticalOrder = 66, .enabled = TRUE }, { .text = sEasyChatWord_Secret, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Mystery, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Lacks, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_Best, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Lousy, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Mistake, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Kind, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_Well, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Weakened, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Simple, .alphabeticalOrder = 65, .enabled = TRUE }, { .text = sEasyChatWord_Seems, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Badly, .alphabeticalOrder = 64, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_endings.h ================================================ static const u8 sEasyChatWord_Will[] = _("WILL"); static const u8 sEasyChatWord_WillBeHere[] = _("WILL BE HERE"); static const u8 sEasyChatWord_Or[] = _("OR"); static const u8 sEasyChatWord_Times[] = _("TIMES"); static const u8 sEasyChatWord_Wonder[] = _("WONDER"); static const u8 sEasyChatWord_IsItQues[] = _("IS IT?"); static const u8 sEasyChatWord_Be[] = _("BE"); static const u8 sEasyChatWord_Gimme[] = _("GIMME"); static const u8 sEasyChatWord_Could[] = _("COULD"); static const u8 sEasyChatWord_LikelyTo[] = _("LIKELY TO"); static const u8 sEasyChatWord_Would[] = _("WOULD"); static const u8 sEasyChatWord_Is[] = _("IS"); static const u8 sEasyChatWord_IsntItQues[] = _("ISN'T IT?"); static const u8 sEasyChatWord_Lets[] = _("LET'S"); static const u8 sEasyChatWord_Other[] = _("OTHER"); static const u8 sEasyChatWord_Are[] = _("ARE"); static const u8 sEasyChatWord_Was[] = _("WAS"); static const u8 sEasyChatWord_Were[] = _("WERE"); static const u8 sEasyChatWord_Those[] = _("THOSE"); static const u8 sEasyChatWord_Isnt[] = _("ISN'T"); static const u8 sEasyChatWord_Wont[] = _("WON'T"); static const u8 sEasyChatWord_Cant[] = _("CAN'T"); static const u8 sEasyChatWord_Can[] = _("CAN"); static const u8 sEasyChatWord_Dont[] = _("DON'T"); static const u8 sEasyChatWord_Do[] = _("DO"); static const u8 sEasyChatWord_Does[] = _("DOES"); static const u8 sEasyChatWord_Whom[] = _("WHOM"); static const u8 sEasyChatWord_Which[] = _("WHICH"); static const u8 sEasyChatWord_Wasnt[] = _("WASN'T"); static const u8 sEasyChatWord_Werent[] = _("WEREN'T"); static const u8 sEasyChatWord_Have[] = _("HAVE"); static const u8 sEasyChatWord_Havent[] = _("HAVEN'T"); static const u8 sEasyChatWord_A[] = _("A"); static const u8 sEasyChatWord_An[] = _("AN"); static const u8 sEasyChatWord_Not[] = _("NOT"); static const u8 sEasyChatWord_There[] = _("THERE"); static const u8 sEasyChatWord_OkQues[] = _("OK?"); static const u8 sEasyChatWord_So[] = _("SO"); static const u8 sEasyChatWord_Maybe[] = _("MAYBE"); static const u8 sEasyChatWord_About[] = _("ABOUT"); static const u8 sEasyChatWord_Over[] = _("OVER"); static const u8 sEasyChatWord_It[] = _("IT"); static const u8 sEasyChatWord_All[] = _("ALL"); static const u8 sEasyChatWord_For[] = _("FOR"); static const u8 sEasyChatWord_On[] = _("ON"); static const u8 sEasyChatWord_Off[] = _("OFF"); static const u8 sEasyChatWord_As[] = _("AS"); static const u8 sEasyChatWord_To[] = _("TO"); static const u8 sEasyChatWord_With[] = _("WITH"); static const u8 sEasyChatWord_Better[] = _("BETTER"); static const u8 sEasyChatWord_Ever[] = _("EVER"); static const u8 sEasyChatWord_Since[] = _("SINCE"); static const u8 sEasyChatWord_Of[] = _("OF"); static const u8 sEasyChatWord_BelongsTo[] = _("BELONGS TO"); static const u8 sEasyChatWord_At[] = _("AT"); static const u8 sEasyChatWord_In[] = _("IN"); static const u8 sEasyChatWord_Out[] = _("OUT"); static const u8 sEasyChatWord_Too[] = _("TOO"); static const u8 sEasyChatWord_Like[] = _("LIKE"); static const u8 sEasyChatWord_Did[] = _("DID"); static const u8 sEasyChatWord_Didnt[] = _("DIDN'T"); static const u8 sEasyChatWord_Doesnt[] = _("DOESN'T"); static const u8 sEasyChatWord_Without[] = _("WITHOUT"); static const u8 sEasyChatWord_After[] = _("AFTER"); static const u8 sEasyChatWord_Before[] = _("BEFORE"); static const u8 sEasyChatWord_While[] = _("WHILE"); static const u8 sEasyChatWord_Than[] = _("THAN"); static const u8 sEasyChatWord_Once[] = _("ONCE"); static const u8 sEasyChatWord_Anywhere[] = _("ANYWHERE"); static const struct EasyChatWordInfo sEasyChatGroup_Endings[] = { { .text = sEasyChatWord_Will, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_WillBeHere, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Or, .alphabeticalOrder = 63, .enabled = TRUE }, { .text = sEasyChatWord_Times, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Wonder, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_IsItQues, .alphabeticalOrder = 68, .enabled = TRUE }, { .text = sEasyChatWord_Be, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Gimme, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_Could, .alphabeticalOrder = 54, .enabled = TRUE }, { .text = sEasyChatWord_LikelyTo, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Would, .alphabeticalOrder = 64, .enabled = TRUE }, { .text = sEasyChatWord_Is, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_IsntItQues, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_Lets, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Other, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Are, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Was, .alphabeticalOrder = 59, .enabled = TRUE }, { .text = sEasyChatWord_Were, .alphabeticalOrder = 60, .enabled = TRUE }, { .text = sEasyChatWord_Those, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Isnt, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Wont, .alphabeticalOrder = 61, .enabled = TRUE }, { .text = sEasyChatWord_Cant, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Can, .alphabeticalOrder = 50, .enabled = TRUE }, { .text = sEasyChatWord_Dont, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Do, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Does, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Whom, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Which, .alphabeticalOrder = 55, .enabled = TRUE }, { .text = sEasyChatWord_Wasnt, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Werent, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Have, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Havent, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_A, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_An, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Not, .alphabeticalOrder = 58, .enabled = TRUE }, { .text = sEasyChatWord_There, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_OkQues, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_So, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Maybe, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_About, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_Over, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_It, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_All, .alphabeticalOrder = 67, .enabled = TRUE }, { .text = sEasyChatWord_For, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_On, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Off, .alphabeticalOrder = 56, .enabled = TRUE }, { .text = sEasyChatWord_As, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_To, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_With, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Better, .alphabeticalOrder = 66, .enabled = TRUE }, { .text = sEasyChatWord_Ever, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Since, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Of, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_BelongsTo, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_At, .alphabeticalOrder = 57, .enabled = TRUE }, { .text = sEasyChatWord_In, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Out, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Too, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Like, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Did, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Didnt, .alphabeticalOrder = 65, .enabled = TRUE }, { .text = sEasyChatWord_Doesnt, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Without, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_After, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Before, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_While, .alphabeticalOrder = 62, .enabled = TRUE }, { .text = sEasyChatWord_Than, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Once, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Anywhere, .alphabeticalOrder = 10, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_events.h ================================================ static const u8 sEasyChatWord_Appeal[] = _("APPEAL"); static const u8 sEasyChatWord_Events[] = _("EVENTS"); static const u8 sEasyChatWord_StayAtHome[] = _("STAY-AT-HOME"); static const u8 sEasyChatWord_Berry[] = _("BERRY"); static const u8 sEasyChatWord_Contest[] = _("CONTEST"); static const u8 sEasyChatWord_Mc[] = _("MC"); static const u8 sEasyChatWord_Judge[] = _("JUDGE"); static const u8 sEasyChatWord_Super[] = _("SUPER"); static const u8 sEasyChatWord_Stage[] = _("STAGE"); static const u8 sEasyChatWord_HallOfFame[] = _("HALL OF FAME"); static const u8 sEasyChatWord_Evolution[] = _("EVOLUTION"); static const u8 sEasyChatWord_Hyper[] = _("HYPER"); static const u8 sEasyChatWord_BattleTower[] = _("BATTLE TOWER"); static const u8 sEasyChatWord_Leaders[] = _("LEADERS"); static const u8 sEasyChatWord_BattleRoom[] = _("BATTLE ROOM"); static const u8 sEasyChatWord_Hidden[] = _("HIDDEN"); static const u8 sEasyChatWord_SecretBase[] = _("SECRET BASE"); static const u8 sEasyChatWord_Blend[] = _("BLEND"); static const u8 sEasyChatWord_POKEBLOCK[] = _("{POKEBLOCK}"); static const u8 sEasyChatWord_Master[] = _("MASTER"); static const u8 sEasyChatWord_Rank[] = _("RANK"); static const u8 sEasyChatWord_Ribbon[] = _("RIBBON"); static const u8 sEasyChatWord_Crush[] = _("CRUSH"); static const u8 sEasyChatWord_Direct[] = _("DIRECT"); static const u8 sEasyChatWord_Tower[] = _("TOWER"); static const u8 sEasyChatWord_Union[] = _("UNION"); static const u8 sEasyChatWord_Room[] = _("ROOM"); static const u8 sEasyChatWord_Wireless[] = _("WIRELESS"); static const struct EasyChatWordInfo sEasyChatGroup_Events[] = { { .text = sEasyChatWord_Appeal, .alphabeticalOrder = 0, .enabled = FALSE }, { .text = sEasyChatWord_Events, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_StayAtHome, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Berry, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Contest, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Mc, .alphabeticalOrder = 4, .enabled = FALSE }, { .text = sEasyChatWord_Judge, .alphabeticalOrder = 22, .enabled = FALSE }, { .text = sEasyChatWord_Super, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Stage, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_HallOfFame, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Evolution, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Hyper, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_BattleTower, .alphabeticalOrder = 11, .enabled = FALSE }, { .text = sEasyChatWord_Leaders, .alphabeticalOrder = 6, .enabled = FALSE }, { .text = sEasyChatWord_BattleRoom, .alphabeticalOrder = 13, .enabled = FALSE }, { .text = sEasyChatWord_Hidden, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_SecretBase, .alphabeticalOrder = 5, .enabled = FALSE }, { .text = sEasyChatWord_Blend, .alphabeticalOrder = 18, .enabled = FALSE }, { .text = sEasyChatWord_POKEBLOCK, .alphabeticalOrder = 20, .enabled = FALSE }, { .text = sEasyChatWord_Master, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Rank, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Ribbon, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Crush, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Direct, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Tower, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Union, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Room, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Wireless, .alphabeticalOrder = 27, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_feelings.h ================================================ static const u8 sEasyChatWord_Meet[] = _("MEET"); static const u8 sEasyChatWord_Play[] = _("PLAY"); static const u8 sEasyChatWord_Hurried[] = _("HURRIED"); static const u8 sEasyChatWord_Goes[] = _("GOES"); static const u8 sEasyChatWord_Giddy[] = _("GIDDY"); static const u8 sEasyChatWord_Happy[] = _("HAPPY"); static const u8 sEasyChatWord_Happiness[] = _("HAPPINESS"); static const u8 sEasyChatWord_Excite[] = _("EXCITE"); static const u8 sEasyChatWord_Important[] = _("IMPORTANT"); static const u8 sEasyChatWord_Funny[] = _("FUNNY"); static const u8 sEasyChatWord_Got[] = _("GOT"); static const u8 sEasyChatWord_GoHome[] = _("GO HOME"); static const u8 sEasyChatWord_Disappointed[] = _("DISAPPOINTED"); static const u8 sEasyChatWord_Disappoints[] = _("DISAPPOINTS"); static const u8 sEasyChatWord_Sad[] = _("SAD"); static const u8 sEasyChatWord_Try[] = _("TRY"); static const u8 sEasyChatWord_Tries[] = _("TRIES"); static const u8 sEasyChatWord_Hears[] = _("HEARS"); static const u8 sEasyChatWord_Think[] = _("THINK"); static const u8 sEasyChatWord_Hear[] = _("HEAR"); static const u8 sEasyChatWord_Wants[] = _("WANTS"); static const u8 sEasyChatWord_Misheard[] = _("MISHEARD"); static const u8 sEasyChatWord_Dislike[] = _("DISLIKE"); static const u8 sEasyChatWord_Angry[] = _("ANGRY"); static const u8 sEasyChatWord_Anger[] = _("ANGER"); static const u8 sEasyChatWord_Scary[] = _("SCARY"); static const u8 sEasyChatWord_Lonesome[] = _("LONESOME"); static const u8 sEasyChatWord_Disappoint[] = _("DISAPPOINT"); static const u8 sEasyChatWord_Joy[] = _("JOY"); static const u8 sEasyChatWord_Gets[] = _("GETS"); static const u8 sEasyChatWord_Never[] = _("NEVER"); static const u8 sEasyChatWord_Darn[] = _("DARN"); static const u8 sEasyChatWord_Downcast[] = _("DOWNCAST"); static const u8 sEasyChatWord_Incredible[] = _("INCREDIBLE"); static const u8 sEasyChatWord_Likes[] = _("LIKES"); static const u8 sEasyChatWord_Dislikes[] = _("DISLIKES"); static const u8 sEasyChatWord_Boring[] = _("BORING"); static const u8 sEasyChatWord_Care[] = _("CARE"); static const u8 sEasyChatWord_Cares[] = _("CARES"); static const u8 sEasyChatWord_AllRight[] = _("ALL RIGHT"); static const u8 sEasyChatWord_Adore[] = _("ADORE"); static const u8 sEasyChatWord_Disaster[] = _("DISASTER"); static const u8 sEasyChatWord_Enjoy[] = _("ENJOY"); static const u8 sEasyChatWord_Enjoys[] = _("ENJOYS"); static const u8 sEasyChatWord_Eat[] = _("EAT"); static const u8 sEasyChatWord_Lacking[] = _("LACKING"); static const u8 sEasyChatWord_Bad[] = _("BAD"); static const u8 sEasyChatWord_Hard[] = _("HARD"); static const u8 sEasyChatWord_Terrible[] = _("TERRIBLE"); static const u8 sEasyChatWord_Should[] = _("SHOULD"); static const u8 sEasyChatWord_Nice[] = _("NICE"); static const u8 sEasyChatWord_Drink[] = _("DRINK"); static const u8 sEasyChatWord_Surprise[] = _("SURPRISE"); static const u8 sEasyChatWord_Fear[] = _("FEAR"); static const u8 sEasyChatWord_Want[] = _("WANT"); static const u8 sEasyChatWord_Wait[] = _("WAIT"); static const u8 sEasyChatWord_Satisfied[] = _("SATISFIED"); static const u8 sEasyChatWord_See[] = _("SEE"); static const u8 sEasyChatWord_Rare[] = _("RARE"); static const u8 sEasyChatWord_Negative[] = _("NEGATIVE"); static const u8 sEasyChatWord_Done[] = _("DONE"); static const u8 sEasyChatWord_Danger[] = _("DANGER"); static const u8 sEasyChatWord_Defeated[] = _("DEFEATED"); static const u8 sEasyChatWord_Beat[] = _("BEAT"); static const u8 sEasyChatWord_Great[] = _("GREAT"); static const u8 sEasyChatWord_Romantic[] = _("ROMANTIC"); static const u8 sEasyChatWord_Question[] = _("QUESTION"); static const u8 sEasyChatWord_Understand[] = _("UNDERSTAND"); static const u8 sEasyChatWord_Understands[] = _("UNDERSTANDS"); static const struct EasyChatWordInfo sEasyChatGroup_Feelings[] = { { .text = sEasyChatWord_Meet, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_Play, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Hurried, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Goes, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Giddy, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_Happy, .alphabeticalOrder = 63, .enabled = TRUE }, { .text = sEasyChatWord_Happiness, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_Excite, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Important, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Funny, .alphabeticalOrder = 61, .enabled = TRUE }, { .text = sEasyChatWord_Got, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_GoHome, .alphabeticalOrder = 62, .enabled = TRUE }, { .text = sEasyChatWord_Disappointed, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Disappoints, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Sad, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Try, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Tries, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Hears, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Think, .alphabeticalOrder = 60, .enabled = TRUE }, { .text = sEasyChatWord_Hear, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Wants, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_Misheard, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_Dislike, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Angry, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Anger, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Scary, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_Lonesome, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Disappoint, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Joy, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Gets, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Never, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Darn, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Downcast, .alphabeticalOrder = 64, .enabled = TRUE }, { .text = sEasyChatWord_Incredible, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Likes, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Dislikes, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_Boring, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Care, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Cares, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_AllRight, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Adore, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Disaster, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Enjoy, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_Enjoys, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Eat, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Lacking, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Bad, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Hard, .alphabeticalOrder = 59, .enabled = TRUE }, { .text = sEasyChatWord_Terrible, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Should, .alphabeticalOrder = 50, .enabled = TRUE }, { .text = sEasyChatWord_Nice, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Drink, .alphabeticalOrder = 66, .enabled = TRUE }, { .text = sEasyChatWord_Surprise, .alphabeticalOrder = 58, .enabled = TRUE }, { .text = sEasyChatWord_Fear, .alphabeticalOrder = 65, .enabled = TRUE }, { .text = sEasyChatWord_Want, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Wait, .alphabeticalOrder = 56, .enabled = TRUE }, { .text = sEasyChatWord_Satisfied, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_See, .alphabeticalOrder = 57, .enabled = TRUE }, { .text = sEasyChatWord_Rare, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_Negative, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_Done, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_Danger, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Defeated, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Beat, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Great, .alphabeticalOrder = 67, .enabled = TRUE }, { .text = sEasyChatWord_Romantic, .alphabeticalOrder = 68, .enabled = TRUE }, { .text = sEasyChatWord_Question, .alphabeticalOrder = 55, .enabled = TRUE }, { .text = sEasyChatWord_Understand, .alphabeticalOrder = 54, .enabled = TRUE }, { .text = sEasyChatWord_Understands, .alphabeticalOrder = 20, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_greetings.h ================================================ static const u8 sEasyChatWord_Thanks[] = _("THANKS"); static const u8 sEasyChatWord_Yes[] = _("YES"); static const u8 sEasyChatWord_HereGoes[] = _("HERE GOES"); static const u8 sEasyChatWord_HereICome[] = _("HERE I COME"); static const u8 sEasyChatWord_HereItIs[] = _("HERE IT IS"); static const u8 sEasyChatWord_Yeah[] = _("YEAH"); static const u8 sEasyChatWord_Welcome[] = _("WELCOME"); static const u8 sEasyChatWord_Oi[] = _("OI"); static const u8 sEasyChatWord_HowDo[] = _("HOW DO"); static const u8 sEasyChatWord_Congrats[] = _("CONGRATS"); static const u8 sEasyChatWord_GiveMe[] = _("GIVE ME"); static const u8 sEasyChatWord_Sorry[] = _("SORRY"); static const u8 sEasyChatWord_Apologize[] = _("APOLOGIZE"); static const u8 sEasyChatWord_Forgive[] = _("FORGIVE"); static const u8 sEasyChatWord_HeyThere[] = _("HEY, THERE"); static const u8 sEasyChatWord_Hello[] = _("HELLO"); static const u8 sEasyChatWord_GoodBye[] = _("GOOD-BYE"); static const u8 sEasyChatWord_ThankYou[] = _("THANK YOU"); static const u8 sEasyChatWord_IveArrived[] = _("I'VE ARRIVED"); static const u8 sEasyChatWord_Pardon[] = _("PARDON"); static const u8 sEasyChatWord_Excuse[] = _("EXCUSE"); static const u8 sEasyChatWord_SeeYa[] = _("SEE YA"); static const u8 sEasyChatWord_ExcuseMe[] = _("EXCUSE ME"); static const u8 sEasyChatWord_WellThen[] = _("WELL, THEN"); static const u8 sEasyChatWord_GoAhead[] = _("GO AHEAD"); static const u8 sEasyChatWord_Appreciate[] = _("APPRECIATE"); static const u8 sEasyChatWord_HeyQues[] = _("HEY?"); static const u8 sEasyChatWord_WhatsUpQues[] = _("WHAT'S UP?"); static const u8 sEasyChatWord_HuhQues[] = _("HUH?"); static const u8 sEasyChatWord_No[] = _("NO"); static const u8 sEasyChatWord_Hi[] = _("HI"); static const u8 sEasyChatWord_YeahYeah[] = _("YEAH, YEAH"); static const u8 sEasyChatWord_ByeBye[] = _("BYE-BYE"); static const u8 sEasyChatWord_MeetYou[] = _("MEET YOU"); static const u8 sEasyChatWord_Hey[] = _("HEY"); static const u8 sEasyChatWord_Smell[] = _("SMELL"); static const u8 sEasyChatWord_Listening[] = _("LISTENING"); static const u8 sEasyChatWord_HooHah[] = _("HOO-HAH"); static const u8 sEasyChatWord_Yahoo[] = _("YAHOO"); static const u8 sEasyChatWord_Yo[] = _("YO"); static const u8 sEasyChatWord_ComeOver[] = _("COME OVER"); static const u8 sEasyChatWord_CountOn[] = _("COUNT ON"); static const struct EasyChatWordInfo sEasyChatGroup_Greetings[] = { { .text = sEasyChatWord_Thanks, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Yes, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_HereGoes, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_HereICome, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_HereItIs, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Yeah, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Welcome, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Oi, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_HowDo, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Congrats, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_GiveMe, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Sorry, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Apologize, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Forgive, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_HeyThere, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Hello, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_GoodBye, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_ThankYou, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_IveArrived, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Pardon, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Excuse, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_SeeYa, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_ExcuseMe, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_WellThen, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_GoAhead, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_Appreciate, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_HeyQues, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_WhatsUpQues, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_HuhQues, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_No, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Hi, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_YeahYeah, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_ByeBye, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_MeetYou, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Hey, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Smell, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Listening, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_HooHah, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Yahoo, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Yo, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_ComeOver, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_CountOn, .alphabeticalOrder = 39, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_hobbies.h ================================================ static const u8 sEasyChatWord_Idol[] = _("IDOL"); static const u8 sEasyChatWord_Anime[] = _("ANIME"); static const u8 sEasyChatWord_Song[] = _("SONG"); static const u8 sEasyChatWord_Movie[] = _("MOVIE"); static const u8 sEasyChatWord_Sweets[] = _("SWEETS"); static const u8 sEasyChatWord_Chat[] = _("CHAT"); static const u8 sEasyChatWord_ChildsPlay[] = _("CHILD'S PLAY"); static const u8 sEasyChatWord_Toys[] = _("TOYS"); static const u8 sEasyChatWord_Music[] = _("MUSIC"); static const u8 sEasyChatWord_Cards[] = _("CARDS"); static const u8 sEasyChatWord_Shopping[] = _("SHOPPING"); static const u8 sEasyChatWord_Camera[] = _("CAMERA"); static const u8 sEasyChatWord_Viewing[] = _("VIEWING"); static const u8 sEasyChatWord_Spectator[] = _("SPECTATOR"); static const u8 sEasyChatWord_Gourmet[] = _("GOURMET"); static const u8 sEasyChatWord_Game[] = _("GAME"); static const u8 sEasyChatWord_Rpg[] = _("RPG"); static const u8 sEasyChatWord_Collection[] = _("COLLECTION"); static const u8 sEasyChatWord_Complete[] = _("COMPLETE"); static const u8 sEasyChatWord_Magazine[] = _("MAGAZINE"); static const u8 sEasyChatWord_Walk[] = _("WALK"); static const u8 sEasyChatWord_Bike[] = _("BIKE"); static const u8 sEasyChatWord_Hobby[] = _("HOBBY"); static const u8 sEasyChatWord_Sports[] = _("SPORTS"); static const u8 sEasyChatWord_Software[] = _("SOFTWARE"); static const u8 sEasyChatWord_Songs[] = _("SONGS"); static const u8 sEasyChatWord_Diet[] = _("DIET"); static const u8 sEasyChatWord_Treasure[] = _("TREASURE"); static const u8 sEasyChatWord_Travel[] = _("TRAVEL"); static const u8 sEasyChatWord_Dance[] = _("DANCE"); static const u8 sEasyChatWord_Channel[] = _("CHANNEL"); static const u8 sEasyChatWord_Making[] = _("MAKING"); static const u8 sEasyChatWord_Fishing[] = _("FISHING"); static const u8 sEasyChatWord_Date[] = _("DATE"); static const u8 sEasyChatWord_Design[] = _("DESIGN"); static const u8 sEasyChatWord_Locomotive[] = _("LOCOMOTIVE"); static const u8 sEasyChatWord_PlushDoll[] = _("PLUSH DOLL"); static const u8 sEasyChatWord_Pc[] = _("PC"); static const u8 sEasyChatWord_Flowers[] = _("FLOWERS"); static const u8 sEasyChatWord_Hero[] = _("HERO"); static const u8 sEasyChatWord_Nap[] = _("NAP"); static const u8 sEasyChatWord_Heroine[] = _("HEROINE"); static const u8 sEasyChatWord_Fashion[] = _("FASHION"); static const u8 sEasyChatWord_Adventure[] = _("ADVENTURE"); static const u8 sEasyChatWord_Board[] = _("BOARD"); static const u8 sEasyChatWord_Ball[] = _("BALL"); static const u8 sEasyChatWord_Book[] = _("BOOK"); static const u8 sEasyChatWord_Festival[] = _("FESTIVAL"); static const u8 sEasyChatWord_Comics[] = _("COMICS"); static const u8 sEasyChatWord_Holiday[] = _("HOLIDAY"); static const u8 sEasyChatWord_Plans[] = _("PLANS"); static const u8 sEasyChatWord_Trendy[] = _("TRENDY"); static const u8 sEasyChatWord_Vacation[] = _("VACATION"); static const u8 sEasyChatWord_Look[] = _("LOOK"); static const struct EasyChatWordInfo sEasyChatGroup_Hobbies[] = { { .text = sEasyChatWord_Idol, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Anime, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Song, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_Movie, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Sweets, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_Chat, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_ChildsPlay, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Toys, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Music, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Cards, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Shopping, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Camera, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Viewing, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_Spectator, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Gourmet, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Game, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Rpg, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Collection, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Complete, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Magazine, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_Walk, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Bike, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Hobby, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Sports, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Software, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Songs, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Diet, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Treasure, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_Travel, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Dance, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Channel, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_Making, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Fishing, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Date, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Design, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Locomotive, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_PlushDoll, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Pc, .alphabeticalOrder = 50, .enabled = TRUE }, { .text = sEasyChatWord_Flowers, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_Hero, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Nap, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Heroine, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Fashion, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Adventure, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Board, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Ball, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Book, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Festival, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Comics, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Holiday, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Plans, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_Trendy, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_Vacation, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Look, .alphabeticalOrder = 20, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_lifestyle.h ================================================ static const u8 sEasyChatWord_Chores[] = _("CHORES"); static const u8 sEasyChatWord_Home[] = _("HOME"); static const u8 sEasyChatWord_Money[] = _("MONEY"); static const u8 sEasyChatWord_Allowance[] = _("ALLOWANCE"); static const u8 sEasyChatWord_Bath[] = _("BATH"); static const u8 sEasyChatWord_Conversation[] = _("CONVERSATION"); static const u8 sEasyChatWord_School[] = _("SCHOOL"); static const u8 sEasyChatWord_Commemorate[] = _("COMMEMORATE"); static const u8 sEasyChatWord_Habit[] = _("HABIT"); static const u8 sEasyChatWord_Group[] = _("GROUP"); static const u8 sEasyChatWord_Word[] = _("WORD"); static const u8 sEasyChatWord_Store[] = _("STORE"); static const u8 sEasyChatWord_Service[] = _("SERVICE"); static const u8 sEasyChatWord_Work[] = _("WORK"); static const u8 sEasyChatWord_System[] = _("SYSTEM"); static const u8 sEasyChatWord_Train[] = _("TRAIN"); static const u8 sEasyChatWord_Class[] = _("CLASS"); static const u8 sEasyChatWord_Lessons[] = _("LESSONS"); static const u8 sEasyChatWord_Information[] = _("INFORMATION"); static const u8 sEasyChatWord_Living[] = _("LIVING"); static const u8 sEasyChatWord_Teacher[] = _("TEACHER"); static const u8 sEasyChatWord_Tournament[] = _("TOURNAMENT"); static const u8 sEasyChatWord_Letter[] = _("LETTER"); static const u8 sEasyChatWord_Event[] = _("EVENT"); static const u8 sEasyChatWord_Digital[] = _("DIGITAL"); static const u8 sEasyChatWord_Test[] = _("TEST"); static const u8 sEasyChatWord_DeptStore[] = _("DEPT. STORE"); static const u8 sEasyChatWord_Television[] = _("TELEVISION"); static const u8 sEasyChatWord_Phone[] = _("PHONE"); static const u8 sEasyChatWord_Item[] = _("ITEM"); static const u8 sEasyChatWord_Name[] = _("NAME"); static const u8 sEasyChatWord_News[] = _("NEWS"); static const u8 sEasyChatWord_Popular[] = _("POPULAR"); static const u8 sEasyChatWord_Party[] = _("PARTY"); static const u8 sEasyChatWord_Study[] = _("STUDY"); static const u8 sEasyChatWord_Machine[] = _("MACHINE"); static const u8 sEasyChatWord_Mail[] = _("MAIL"); static const u8 sEasyChatWord_Message[] = _("MESSAGE"); static const u8 sEasyChatWord_Promise[] = _("PROMISE"); static const u8 sEasyChatWord_Dream[] = _("DREAM"); static const u8 sEasyChatWord_Kindergarten[] = _("KINDERGARTEN"); static const u8 sEasyChatWord_Life[] = _("LIFE"); static const u8 sEasyChatWord_Radio[] = _("RADIO"); static const u8 sEasyChatWord_Rental[] = _("RENTAL"); static const u8 sEasyChatWord_World[] = _("WORLD"); static const struct EasyChatWordInfo sEasyChatGroup_Lifestyle[] = { { .text = sEasyChatWord_Chores, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Home, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Money, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Allowance, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Bath, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Conversation, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_School, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Commemorate, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Habit, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Group, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Word, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Store, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Service, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Work, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_System, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Train, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_Class, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Lessons, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Information, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Living, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Teacher, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Tournament, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_Letter, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Event, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Digital, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Test, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_DeptStore, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Television, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Phone, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Item, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Name, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_News, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Popular, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Party, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Study, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Machine, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Mail, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Message, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Promise, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Dream, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Kindergarten, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Life, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Radio, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Rental, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_World, .alphabeticalOrder = 44, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_misc.h ================================================ static const u8 sEasyChatWord_Highs[] = _("HIGHS"); static const u8 sEasyChatWord_Lows[] = _("LOWS"); static const u8 sEasyChatWord_Um[] = _("UM"); static const u8 sEasyChatWord_Rear[] = _("REAR"); static const u8 sEasyChatWord_Things[] = _("THINGS"); static const u8 sEasyChatWord_Thing[] = _("THING"); static const u8 sEasyChatWord_Below[] = _("BELOW"); static const u8 sEasyChatWord_Above[] = _("ABOVE"); static const u8 sEasyChatWord_Back[] = _("BACK"); static const u8 sEasyChatWord_High[] = _("HIGH"); static const u8 sEasyChatWord_Here[] = _("HERE"); static const u8 sEasyChatWord_Inside[] = _("INSIDE"); static const u8 sEasyChatWord_Outside[] = _("OUTSIDE"); static const u8 sEasyChatWord_Beside[] = _("BESIDE"); static const u8 sEasyChatWord_ThisIsItExcl[] = _("THIS IS IT!"); static const u8 sEasyChatWord_This[] = _("THIS"); static const u8 sEasyChatWord_Every[] = _("EVERY"); static const u8 sEasyChatWord_These[] = _("THESE"); static const u8 sEasyChatWord_TheseWere[] = _("THESE WERE"); static const u8 sEasyChatWord_Down[] = _("DOWN"); static const u8 sEasyChatWord_That[] = _("THAT"); static const u8 sEasyChatWord_ThoseAre[] = _("THOSE ARE"); static const u8 sEasyChatWord_ThoseWere[] = _("THOSE WERE"); static const u8 sEasyChatWord_ThatsItExcl[] = _("THAT'S IT!"); static const u8 sEasyChatWord_Am[] = _("AM"); static const u8 sEasyChatWord_ThatWas[] = _("THAT WAS"); static const u8 sEasyChatWord_Front[] = _("FRONT"); static const u8 sEasyChatWord_Up[] = _("UP"); static const u8 sEasyChatWord_Choice[] = _("CHOICE"); static const u8 sEasyChatWord_Far[] = _("FAR"); static const u8 sEasyChatWord_Away[] = _("AWAY"); static const u8 sEasyChatWord_Near[] = _("NEAR"); static const u8 sEasyChatWord_Where[] = _("WHERE"); static const u8 sEasyChatWord_When[] = _("WHEN"); static const u8 sEasyChatWord_What[] = _("WHAT"); static const u8 sEasyChatWord_Deep[] = _("DEEP"); static const u8 sEasyChatWord_Shallow[] = _("SHALLOW"); static const u8 sEasyChatWord_Why[] = _("WHY"); static const u8 sEasyChatWord_Confused[] = _("CONFUSED"); static const u8 sEasyChatWord_Opposite[] = _("OPPOSITE"); static const u8 sEasyChatWord_Left[] = _("LEFT"); static const u8 sEasyChatWord_Right[] = _("RIGHT"); static const struct EasyChatWordInfo sEasyChatGroup_Misc[] = { { .text = sEasyChatWord_Highs, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Lows, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Um, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Rear, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Things, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Thing, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Below, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Above, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Back, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_High, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Here, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Inside, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Outside, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Beside, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_ThisIsItExcl, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_This, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Every, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_These, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_TheseWere, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Down, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_That, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_ThoseAre, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_ThoseWere, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_ThatsItExcl, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Am, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_ThatWas, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Front, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Up, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Choice, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Far, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Away, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Near, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Where, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_When, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_What, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Deep, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Shallow, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Why, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Confused, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Opposite, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Left, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Right, .alphabeticalOrder = 37, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_move_1.h ================================================ #include "constants/moves.h" static const u16 sEasyChatGroup_Move1[] = { MOVE_ABSORB, MOVE_AEROBLAST, MOVE_AGILITY, MOVE_AIR_CUTTER, MOVE_ANCIENT_POWER, MOVE_AROMATHERAPY, MOVE_ASTONISH, MOVE_AURORA_BEAM, MOVE_BIDE, MOVE_BIND, MOVE_BITE, MOVE_BRICK_BREAK, MOVE_BUBBLE, MOVE_CHARGE, MOVE_CHARM, MOVE_CLAMP, MOVE_CONFUSE_RAY, MOVE_CONSTRICT, MOVE_COSMIC_POWER, MOVE_COUNTER, MOVE_CRABHAMMER, MOVE_CROSS_CHOP, MOVE_CRUNCH, MOVE_CUT, MOVE_DIG, MOVE_DISABLE, MOVE_DOUBLE_TEAM, MOVE_DOUBLE_EDGE, MOVE_DOUBLE_SLAP, MOVE_EARTHQUAKE, MOVE_ENCORE, MOVE_ENDEAVOR, MOVE_ENDURE, MOVE_EXTRASENSORY, MOVE_EXTREME_SPEED, MOVE_FACADE, MOVE_FAKE_TEARS, MOVE_FISSURE, MOVE_FLAIL, MOVE_FLAME_WHEEL, MOVE_FLAMETHROWER, MOVE_FLATTER, MOVE_FLY, MOVE_FOCUS_ENERGY, MOVE_FOCUS_PUNCH, MOVE_FOLLOW_ME, MOVE_GIGA_DRAIN, MOVE_GRASS_WHISTLE, MOVE_GROWTH, MOVE_GRUDGE, MOVE_GUST, MOVE_HAIL, MOVE_HARDEN, MOVE_HAZE, MOVE_HEADBUTT, MOVE_HEAL_BELL, MOVE_HYPNOSIS, MOVE_ICE_BALL, MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_KARATE_CHOP, MOVE_KINESIS, MOVE_LEECH_LIFE, MOVE_LICK, MOVE_LOVELY_KISS, MOVE_LOW_KICK, MOVE_MEAN_LOOK, MOVE_MEMENTO, MOVE_METAL_SOUND, MOVE_METEOR_MASH, MOVE_MIND_READER, MOVE_MIRROR_MOVE, MOVE_MIST, MOVE_MORNING_SUN, MOVE_NATURE_POWER, MOVE_NIGHTMARE, MOVE_OCTAZOOKA, MOVE_ODOR_SLEUTH, MOVE_OUTRAGE, MOVE_OVERHEAT, MOVE_PAIN_SPLIT, MOVE_POWDER_SNOW, MOVE_PSYBEAM, MOVE_PSYCH_UP, MOVE_PSYCHIC, MOVE_PSYCHO_BOOST, MOVE_PSYWAVE, MOVE_PURSUIT, MOVE_RAGE, MOVE_RAIN_DANCE, MOVE_RAPID_SPIN, MOVE_RAZOR_WIND, MOVE_RECOVER, MOVE_RETURN, MOVE_REVERSAL, MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_THROW, MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SACRED_FIRE, MOVE_SAFEGUARD, MOVE_SAND_TOMB, MOVE_SAND_ATTACK, MOVE_SANDSTORM, MOVE_SCARY_FACE, MOVE_SCREECH, MOVE_SELF_DESTRUCT, MOVE_SHADOW_BALL, MOVE_SHADOW_PUNCH, MOVE_SHARPEN, MOVE_SHEER_COLD, MOVE_SIGNAL_BEAM, MOVE_SILVER_WIND, MOVE_SING, MOVE_SKETCH, MOVE_SKILL_SWAP, MOVE_SKY_ATTACK, MOVE_SKY_UPPERCUT, MOVE_SLASH, MOVE_SMELLING_SALT, MOVE_SMOG, MOVE_SMOKESCREEN, MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SONIC_BOOM, MOVE_SPARK, MOVE_SPIDER_WEB, MOVE_SPITE, MOVE_SPORE, MOVE_STRENGTH, MOVE_STRING_SHOT, MOVE_STUN_SPORE, MOVE_SUBMISSION, MOVE_SUPER_FANG, MOVE_SWAGGER, MOVE_SWEET_SCENT, MOVE_SWIFT, MOVE_SYNTHESIS, MOVE_TAIL_WHIP, MOVE_THRASH, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_TICKLE, MOVE_TORMENT, MOVE_UPROAR, MOVE_VITAL_THROW, MOVE_WATER_SPOUT, MOVE_WEATHER_BALL, MOVE_WHIRLPOOL, MOVE_WILL_O_WISP, MOVE_WITHDRAW, MOVE_YAWN, }; ================================================ FILE: src/data/easy_chat/easy_chat_group_move_2.h ================================================ #include "constants/moves.h" static const u16 sEasyChatGroup_Move2[] = { MOVE_ACID, MOVE_ACID_ARMOR, MOVE_AERIAL_ACE, MOVE_AMNESIA, MOVE_ARM_THRUST, MOVE_ASSIST, MOVE_ATTRACT, MOVE_BARRAGE, MOVE_BARRIER, MOVE_BATON_PASS, MOVE_BEAT_UP, MOVE_BELLY_DRUM, MOVE_BLAST_BURN, MOVE_BLAZE_KICK, MOVE_BLIZZARD, MOVE_BLOCK, MOVE_BODY_SLAM, MOVE_BONE_CLUB, MOVE_BONE_RUSH, MOVE_BONEMERANG, MOVE_BOUNCE, MOVE_BUBBLE_BEAM, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CAMOUFLAGE, MOVE_COMET_PUNCH, MOVE_CONFUSION, MOVE_CONVERSION, MOVE_CONVERSION_2, MOVE_COTTON_SPORE, MOVE_COVET, MOVE_CRUSH_CLAW, MOVE_CURSE, MOVE_DEFENSE_CURL, MOVE_DESTINY_BOND, MOVE_DETECT, MOVE_DIVE, MOVE_DIZZY_PUNCH, MOVE_DOOM_DESIRE, MOVE_DOUBLE_KICK, MOVE_DRAGON_CLAW, MOVE_DRAGON_DANCE, MOVE_DRAGON_RAGE, MOVE_DRAGON_BREATH, MOVE_DREAM_EATER, MOVE_DRILL_PECK, MOVE_DYNAMIC_PUNCH, MOVE_EGG_BOMB, MOVE_EMBER, MOVE_ERUPTION, MOVE_EXPLOSION, MOVE_FAINT_ATTACK, MOVE_FAKE_OUT, MOVE_FALSE_SWIPE, MOVE_FEATHER_DANCE, MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, MOVE_FIRE_SPIN, MOVE_FLASH, MOVE_FORESIGHT, MOVE_FRENZY_PLANT, MOVE_FRUSTRATION, MOVE_FURY_ATTACK, MOVE_FURY_CUTTER, MOVE_FURY_SWIPES, MOVE_FUTURE_SIGHT, MOVE_GLARE, MOVE_GROWL, MOVE_GUILLOTINE, MOVE_HEAT_WAVE, MOVE_HELPING_HAND, MOVE_HI_JUMP_KICK, MOVE_HIDDEN_POWER, MOVE_HORN_ATTACK, MOVE_HORN_DRILL, MOVE_HOWL, MOVE_HYDRO_CANNON, MOVE_HYDRO_PUMP, MOVE_HYPER_BEAM, MOVE_HYPER_FANG, MOVE_HYPER_VOICE, MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICICLE_SPEAR, MOVE_IMPRISON, MOVE_INGRAIN, MOVE_IRON_DEFENSE, MOVE_JUMP_KICK, MOVE_KNOCK_OFF, MOVE_LEAF_BLADE, MOVE_LEECH_SEED, MOVE_LEER, MOVE_LIGHT_SCREEN, MOVE_LOCK_ON, MOVE_LUSTER_PURGE, MOVE_MACH_PUNCH, MOVE_MAGIC_COAT, MOVE_MAGICAL_LEAF, MOVE_MAGNITUDE, MOVE_MEDITATE, MOVE_MEGA_DRAIN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_MEGAHORN, MOVE_METAL_CLAW, MOVE_METRONOME, MOVE_MILK_DRINK, MOVE_MIMIC, MOVE_MINIMIZE, MOVE_MIRROR_COAT, MOVE_MIST_BALL, MOVE_MOONLIGHT, MOVE_MUD_SHOT, MOVE_MUD_SPORT, MOVE_MUD_SLAP, MOVE_MUDDY_WATER, MOVE_NEEDLE_ARM, MOVE_NIGHT_SHADE, MOVE_PAY_DAY, MOVE_PECK, MOVE_PERISH_SONG, MOVE_PETAL_DANCE, MOVE_PIN_MISSILE, MOVE_POISON_FANG, MOVE_POISON_GAS, MOVE_POISON_STING, MOVE_POISON_TAIL, MOVE_POISON_POWDER, MOVE_POUND, MOVE_PRESENT, MOVE_PROTECT, MOVE_QUICK_ATTACK, MOVE_RAZOR_LEAF, MOVE_RECYCLE, MOVE_REFLECT, MOVE_REFRESH, MOVE_REST, MOVE_REVENGE, MOVE_ROAR, MOVE_ROCK_BLAST, MOVE_ROLE_PLAY, MOVE_ROLLING_KICK, MOVE_SCRATCH, MOVE_SECRET_POWER, MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, MOVE_SKULL_BASH, MOVE_SLACK_OFF, MOVE_SLAM, MOVE_SLEEP_POWDER, MOVE_SLEEP_TALK, MOVE_SLUDGE, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SOFT_BOILED, MOVE_SPIKE_CANNON, MOVE_SPIKES, MOVE_SPIT_UP, MOVE_SPLASH, MOVE_STEEL_WING, MOVE_STOCKPILE, MOVE_STOMP, MOVE_STRUGGLE, MOVE_SUBSTITUTE, MOVE_SUNNY_DAY, MOVE_SUPERPOWER, MOVE_SUPERSONIC, MOVE_SURF, MOVE_SWALLOW, MOVE_SWEET_KISS, MOVE_SWORDS_DANCE, MOVE_TACKLE, MOVE_TAIL_GLOW, MOVE_TAKE_DOWN, MOVE_TAUNT, MOVE_TEETER_DANCE, MOVE_TELEPORT, MOVE_THIEF, MOVE_THUNDER_WAVE, MOVE_THUNDER_SHOCK, MOVE_TOXIC, MOVE_TRANSFORM, MOVE_TRI_ATTACK, MOVE_TRICK, MOVE_TRIPLE_KICK, MOVE_TWINEEDLE, MOVE_TWISTER, MOVE_VICE_GRIP, MOVE_VINE_WHIP, MOVE_VOLT_TACKLE, MOVE_WATER_GUN, MOVE_WATER_PULSE, MOVE_WATER_SPORT, MOVE_WATERFALL, MOVE_WHIRLWIND, MOVE_WING_ATTACK, MOVE_WISH, MOVE_WRAP, MOVE_ZAP_CANNON, }; ================================================ FILE: src/data/easy_chat/easy_chat_group_people.h ================================================ static const u8 sEasyChatWord_Opponent[] = _("OPPONENT"); static const u8 sEasyChatWord_I[] = _("I"); static const u8 sEasyChatWord_You[] = _("YOU"); static const u8 sEasyChatWord_Yours[] = _("YOURS"); static const u8 sEasyChatWord_Son[] = _("SON"); static const u8 sEasyChatWord_Your[] = _("YOUR"); static const u8 sEasyChatWord_Youre[] = _("YOU'RE"); static const u8 sEasyChatWord_Youve[] = _("YOU'VE"); static const u8 sEasyChatWord_Mother[] = _("MOTHER"); static const u8 sEasyChatWord_Grandfather[] = _("GRANDFATHER"); static const u8 sEasyChatWord_Uncle[] = _("UNCLE"); static const u8 sEasyChatWord_Father[] = _("FATHER"); static const u8 sEasyChatWord_Boy[] = _("BOY"); static const u8 sEasyChatWord_Adult[] = _("ADULT"); static const u8 sEasyChatWord_Brother[] = _("BROTHER"); static const u8 sEasyChatWord_Sister[] = _("SISTER"); static const u8 sEasyChatWord_Grandmother[] = _("GRANDMOTHER"); static const u8 sEasyChatWord_Aunt[] = _("AUNT"); static const u8 sEasyChatWord_Parent[] = _("PARENT"); static const u8 sEasyChatWord_Man[] = _("MAN"); static const u8 sEasyChatWord_Me[] = _("ME"); static const u8 sEasyChatWord_Girl[] = _("GIRL"); static const u8 sEasyChatWord_Babe[] = _("BABE"); static const u8 sEasyChatWord_Family[] = _("FAMILY"); static const u8 sEasyChatWord_Her[] = _("HER"); static const u8 sEasyChatWord_Him[] = _("HIM"); static const u8 sEasyChatWord_He[] = _("HE"); static const u8 sEasyChatWord_Place[] = _("PLACE"); static const u8 sEasyChatWord_Daughter[] = _("DAUGHTER"); static const u8 sEasyChatWord_His[] = _("HIS"); static const u8 sEasyChatWord_Hes[] = _("HE'S"); static const u8 sEasyChatWord_Arent[] = _("AREN'T"); static const u8 sEasyChatWord_Siblings[] = _("SIBLINGS"); static const u8 sEasyChatWord_Kid[] = _("KID"); static const u8 sEasyChatWord_Children[] = _("CHILDREN"); static const u8 sEasyChatWord_Mr[] = _("MR."); static const u8 sEasyChatWord_Mrs[] = _("MRS."); static const u8 sEasyChatWord_Myself[] = _("MYSELF"); static const u8 sEasyChatWord_IWas[] = _("I WAS"); static const u8 sEasyChatWord_ToMe[] = _("TO ME"); static const u8 sEasyChatWord_My[] = _("MY"); static const u8 sEasyChatWord_IAm[] = _("I AM"); static const u8 sEasyChatWord_Ive[] = _("I'VE"); static const u8 sEasyChatWord_Who[] = _("WHO"); static const u8 sEasyChatWord_Someone[] = _("SOMEONE"); static const u8 sEasyChatWord_WhoWas[] = _("WHO WAS"); static const u8 sEasyChatWord_ToWhom[] = _("TO WHOM"); static const u8 sEasyChatWord_Whose[] = _("WHOSE"); static const u8 sEasyChatWord_WhoIs[] = _("WHO IS"); static const u8 sEasyChatWord_Its[] = _("IT'S"); static const u8 sEasyChatWord_Lady[] = _("LADY"); static const u8 sEasyChatWord_Friend[] = _("FRIEND"); static const u8 sEasyChatWord_Ally[] = _("ALLY"); static const u8 sEasyChatWord_Person[] = _("PERSON"); static const u8 sEasyChatWord_Dude[] = _("DUDE"); static const u8 sEasyChatWord_They[] = _("THEY"); static const u8 sEasyChatWord_TheyWere[] = _("THEY WERE"); static const u8 sEasyChatWord_ToThem[] = _("TO THEM"); static const u8 sEasyChatWord_Their[] = _("THEIR"); static const u8 sEasyChatWord_Theyre[] = _("THEY'RE"); static const u8 sEasyChatWord_Theyve[] = _("THEY'VE"); static const u8 sEasyChatWord_We[] = _("WE"); static const u8 sEasyChatWord_Been[] = _("BEEN"); static const u8 sEasyChatWord_ToUs[] = _("TO US"); static const u8 sEasyChatWord_Our[] = _("OUR"); static const u8 sEasyChatWord_WeAre[] = _("WE'RE"); static const u8 sEasyChatWord_Rival[] = _("RIVAL"); static const u8 sEasyChatWord_Weve[] = _("WE'VE"); static const u8 sEasyChatWord_Woman[] = _("WOMAN"); static const u8 sEasyChatWord_She[] = _("SHE"); static const u8 sEasyChatWord_SheWas[] = _("SHE WAS"); static const u8 sEasyChatWord_ToHer[] = _("TO HER"); static const u8 sEasyChatWord_Hers[] = _("HERS"); static const u8 sEasyChatWord_SheIs[] = _("SHE IS"); static const u8 sEasyChatWord_Some[] = _("SOME"); static const struct EasyChatWordInfo sEasyChatGroup_People[] = { { .text = sEasyChatWord_Opponent, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_I, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_You, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Yours, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Son, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Your, .alphabeticalOrder = 62, .enabled = TRUE }, { .text = sEasyChatWord_Youre, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Youve, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Mother, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Grandfather, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Uncle, .alphabeticalOrder = 54, .enabled = TRUE }, { .text = sEasyChatWord_Father, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Boy, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Adult, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_Brother, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Sister, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Grandmother, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Aunt, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Parent, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Man, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Me, .alphabeticalOrder = 72, .enabled = TRUE }, { .text = sEasyChatWord_Girl, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Babe, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Family, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Her, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Him, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_He, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Place, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_Daughter, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_His, .alphabeticalOrder = 50, .enabled = TRUE }, { .text = sEasyChatWord_Hes, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Arent, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Siblings, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Kid, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Children, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_Mr, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_Mrs, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Myself, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_IWas, .alphabeticalOrder = 64, .enabled = TRUE }, { .text = sEasyChatWord_ToMe, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_My, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_IAm, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Ive, .alphabeticalOrder = 66, .enabled = TRUE }, { .text = sEasyChatWord_Who, .alphabeticalOrder = 69, .enabled = TRUE }, { .text = sEasyChatWord_Someone, .alphabeticalOrder = 73, .enabled = TRUE }, { .text = sEasyChatWord_WhoWas, .alphabeticalOrder = 70, .enabled = TRUE }, { .text = sEasyChatWord_ToWhom, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Whose, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_WhoIs, .alphabeticalOrder = 74, .enabled = TRUE }, { .text = sEasyChatWord_Its, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_Lady, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Friend, .alphabeticalOrder = 58, .enabled = TRUE }, { .text = sEasyChatWord_Ally, .alphabeticalOrder = 55, .enabled = TRUE }, { .text = sEasyChatWord_Person, .alphabeticalOrder = 56, .enabled = TRUE }, { .text = sEasyChatWord_Dude, .alphabeticalOrder = 59, .enabled = TRUE }, { .text = sEasyChatWord_They, .alphabeticalOrder = 60, .enabled = TRUE }, { .text = sEasyChatWord_TheyWere, .alphabeticalOrder = 71, .enabled = TRUE }, { .text = sEasyChatWord_ToThem, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Their, .alphabeticalOrder = 57, .enabled = TRUE }, { .text = sEasyChatWord_Theyre, .alphabeticalOrder = 63, .enabled = TRUE }, { .text = sEasyChatWord_Theyve, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_We, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Been, .alphabeticalOrder = 61, .enabled = TRUE }, { .text = sEasyChatWord_ToUs, .alphabeticalOrder = 65, .enabled = TRUE }, { .text = sEasyChatWord_Our, .alphabeticalOrder = 67, .enabled = TRUE }, { .text = sEasyChatWord_WeAre, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Rival, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_Weve, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_Woman, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_She, .alphabeticalOrder = 68, .enabled = TRUE }, { .text = sEasyChatWord_SheWas, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_ToHer, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Hers, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_SheIs, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Some, .alphabeticalOrder = 3, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_pokemon.h ================================================ static const u16 sEasyChatGroup_Pokemon[] = { SPECIES_ABRA, SPECIES_ABSOL, SPECIES_AGGRON, SPECIES_ALAKAZAM, SPECIES_ALTARIA, SPECIES_ANORITH, SPECIES_ARMALDO, SPECIES_ARON, SPECIES_AZUMARILL, SPECIES_AZURILL, SPECIES_BAGON, SPECIES_BALTOY, SPECIES_BANETTE, SPECIES_BARBOACH, SPECIES_BEAUTIFLY, SPECIES_BELDUM, SPECIES_BELLOSSOM, SPECIES_BLAZIKEN, SPECIES_BRELOOM, SPECIES_CACNEA, SPECIES_CACTURNE, SPECIES_CAMERUPT, SPECIES_CARVANHA, SPECIES_CASCOON, SPECIES_CASTFORM, SPECIES_CHIMECHO, SPECIES_CHINCHOU, SPECIES_CLAMPERL, SPECIES_CLAYDOL, SPECIES_COMBUSKEN, SPECIES_CORPHISH, SPECIES_CORSOLA, SPECIES_CRADILY, SPECIES_CRAWDAUNT, SPECIES_CROBAT, SPECIES_DELCATTY, SPECIES_DEOXYS, SPECIES_DODRIO, SPECIES_DODUO, SPECIES_DONPHAN, SPECIES_DUSCLOPS, SPECIES_DUSKULL, SPECIES_DUSTOX, SPECIES_ELECTRIKE, SPECIES_ELECTRODE, SPECIES_EXPLOUD, SPECIES_FEEBAS, SPECIES_FLYGON, SPECIES_GARDEVOIR, SPECIES_GEODUDE, SPECIES_GIRAFARIG, SPECIES_GLALIE, SPECIES_GLOOM, SPECIES_GOLBAT, SPECIES_GOLDEEN, SPECIES_GOLDUCK, SPECIES_GOLEM, SPECIES_GOREBYSS, SPECIES_GRAVELER, SPECIES_GRIMER, SPECIES_GROUDON, SPECIES_GROVYLE, SPECIES_GRUMPIG, SPECIES_GULPIN, SPECIES_GYARADOS, SPECIES_HARIYAMA, SPECIES_HERACROSS, SPECIES_HORSEA, SPECIES_HUNTAIL, SPECIES_IGGLYBUFF, SPECIES_ILLUMISE, SPECIES_JIGGLYPUFF, SPECIES_JIRACHI, SPECIES_KADABRA, SPECIES_KECLEON, SPECIES_KINGDRA, SPECIES_KIRLIA, SPECIES_KOFFING, SPECIES_KYOGRE, SPECIES_LAIRON, SPECIES_LANTURN, SPECIES_LATIAS, SPECIES_LATIOS, SPECIES_LILEEP, SPECIES_LINOONE, SPECIES_LOMBRE, SPECIES_LOTAD, SPECIES_LOUDRED, SPECIES_LUDICOLO, SPECIES_LUNATONE, SPECIES_LUVDISC, SPECIES_MACHAMP, SPECIES_MACHOKE, SPECIES_MACHOP, SPECIES_MAGCARGO, SPECIES_MAGIKARP, SPECIES_MAGNEMITE, SPECIES_MAGNETON, SPECIES_MAKUHITA, SPECIES_MANECTRIC, SPECIES_MARILL, SPECIES_MARSHTOMP, SPECIES_MASQUERAIN, SPECIES_MAWILE, SPECIES_MEDICHAM, SPECIES_MEDITITE, SPECIES_METAGROSS, SPECIES_METANG, SPECIES_MIGHTYENA, SPECIES_MILOTIC, SPECIES_MINUN, SPECIES_MUDKIP, SPECIES_MUK, SPECIES_NATU, SPECIES_NINCADA, SPECIES_NINETALES, SPECIES_NINJASK, SPECIES_NOSEPASS, SPECIES_NUMEL, SPECIES_NUZLEAF, SPECIES_ODDISH, SPECIES_PELIPPER, SPECIES_PHANPY, SPECIES_PICHU, SPECIES_PIKACHU, SPECIES_PINSIR, SPECIES_PLUSLE, SPECIES_POOCHYENA, SPECIES_PSYDUCK, SPECIES_RAICHU, SPECIES_RALTS, SPECIES_RAYQUAZA, SPECIES_REGICE, SPECIES_REGIROCK, SPECIES_REGISTEEL, SPECIES_RELICANTH, SPECIES_RHYDON, SPECIES_RHYHORN, SPECIES_ROSELIA, SPECIES_SABLEYE, SPECIES_SALAMENCE, SPECIES_SANDSHREW, SPECIES_SANDSLASH, SPECIES_SCEPTILE, SPECIES_SEADRA, SPECIES_SEAKING, SPECIES_SEALEO, SPECIES_SEEDOT, SPECIES_SEVIPER, SPECIES_SHARPEDO, SPECIES_SHEDINJA, SPECIES_SHELGON, SPECIES_SHIFTRY, SPECIES_SHROOMISH, SPECIES_SHUPPET, SPECIES_SILCOON, SPECIES_SKARMORY, SPECIES_SKITTY, SPECIES_SLAKING, SPECIES_SLAKOTH, SPECIES_SLUGMA, SPECIES_SNORUNT, SPECIES_SOLROCK, SPECIES_SPHEAL, SPECIES_SPINDA, SPECIES_SPOINK, SPECIES_STARMIE, SPECIES_STARYU, SPECIES_SURSKIT, SPECIES_SWABLU, SPECIES_SWALOT, SPECIES_SWAMPERT, SPECIES_SWELLOW, SPECIES_TAILLOW, SPECIES_TENTACOOL, SPECIES_TENTACRUEL, SPECIES_TORCHIC, SPECIES_TORKOAL, SPECIES_TRAPINCH, SPECIES_TREECKO, SPECIES_TROPIUS, SPECIES_VIBRAVA, SPECIES_VIGOROTH, SPECIES_VILEPLUME, SPECIES_VOLBEAT, SPECIES_VOLTORB, SPECIES_VULPIX, SPECIES_WAILMER, SPECIES_WAILORD, SPECIES_WALREIN, SPECIES_WEEZING, SPECIES_WHISCASH, SPECIES_WHISMUR, SPECIES_WIGGLYTUFF, SPECIES_WINGULL, SPECIES_WOBBUFFET, SPECIES_WURMPLE, SPECIES_WYNAUT, SPECIES_XATU, SPECIES_ZANGOOSE, SPECIES_ZIGZAGOON, SPECIES_ZUBAT, }; ================================================ FILE: src/data/easy_chat/easy_chat_group_pokemon2.h ================================================ static const u16 sEasyChatGroup_Pokemon2[] = { SPECIES_ABRA, SPECIES_AERODACTYL, SPECIES_AIPOM, SPECIES_ALAKAZAM, SPECIES_AMPHAROS, SPECIES_ARBOK, SPECIES_ARCANINE, SPECIES_ARIADOS, SPECIES_ARTICUNO, SPECIES_AZUMARILL, SPECIES_BAYLEEF, SPECIES_BEEDRILL, SPECIES_BELLOSSOM, SPECIES_BELLSPROUT, SPECIES_BLASTOISE, SPECIES_BLISSEY, SPECIES_BULBASAUR, SPECIES_BUTTERFREE, SPECIES_CATERPIE, SPECIES_CELEBI, SPECIES_CHANSEY, SPECIES_CHARIZARD, SPECIES_CHARMANDER, SPECIES_CHARMELEON, SPECIES_CHIKORITA, SPECIES_CHINCHOU, SPECIES_CLEFABLE, SPECIES_CLEFAIRY, SPECIES_CLEFFA, SPECIES_CLOYSTER, SPECIES_CORSOLA, SPECIES_CROBAT, SPECIES_CROCONAW, SPECIES_CUBONE, SPECIES_CYNDAQUIL, SPECIES_DELIBIRD, SPECIES_DEWGONG, SPECIES_DIGLETT, SPECIES_DITTO, SPECIES_DODRIO, SPECIES_DODUO, SPECIES_DONPHAN, SPECIES_DRAGONAIR, SPECIES_DRAGONITE, SPECIES_DRATINI, SPECIES_DROWZEE, SPECIES_DUGTRIO, SPECIES_DUNSPARCE, SPECIES_EEVEE, SPECIES_EKANS, SPECIES_ELECTABUZZ, SPECIES_ELECTRODE, SPECIES_ELEKID, SPECIES_ENTEI, SPECIES_ESPEON, SPECIES_EXEGGCUTE, SPECIES_EXEGGUTOR, SPECIES_FARFETCHD, SPECIES_FEAROW, SPECIES_FERALIGATR, SPECIES_FLAAFFY, SPECIES_FLAREON, SPECIES_FORRETRESS, SPECIES_FURRET, SPECIES_GASTLY, SPECIES_GENGAR, SPECIES_GEODUDE, SPECIES_GIRAFARIG, SPECIES_GLIGAR, SPECIES_GLOOM, SPECIES_GOLBAT, SPECIES_GOLDEEN, SPECIES_GOLDUCK, SPECIES_GOLEM, SPECIES_GRANBULL, SPECIES_GRAVELER, SPECIES_GRIMER, SPECIES_GROWLITHE, SPECIES_GYARADOS, SPECIES_HAUNTER, SPECIES_HERACROSS, SPECIES_HITMONCHAN, SPECIES_HITMONLEE, SPECIES_HITMONTOP, SPECIES_HO_OH, SPECIES_HOOTHOOT, SPECIES_HOPPIP, SPECIES_HORSEA, SPECIES_HOUNDOOM, SPECIES_HOUNDOUR, SPECIES_HYPNO, SPECIES_IGGLYBUFF, SPECIES_IVYSAUR, SPECIES_JIGGLYPUFF, SPECIES_JOLTEON, SPECIES_JUMPLUFF, SPECIES_JYNX, SPECIES_KABUTO, SPECIES_KABUTOPS, SPECIES_KADABRA, SPECIES_KAKUNA, SPECIES_KANGASKHAN, SPECIES_KINGDRA, SPECIES_KINGLER, SPECIES_KOFFING, SPECIES_KRABBY, SPECIES_LANTURN, SPECIES_LAPRAS, SPECIES_LARVITAR, SPECIES_LEDIAN, SPECIES_LEDYBA, SPECIES_LICKITUNG, SPECIES_LUGIA, SPECIES_MACHAMP, SPECIES_MACHOKE, SPECIES_MACHOP, SPECIES_MAGBY, SPECIES_MAGCARGO, SPECIES_MAGIKARP, SPECIES_MAGMAR, SPECIES_MAGNEMITE, SPECIES_MAGNETON, SPECIES_MANKEY, SPECIES_MANTINE, SPECIES_MAREEP, SPECIES_MARILL, SPECIES_MAROWAK, SPECIES_MEGANIUM, SPECIES_MEOWTH, SPECIES_METAPOD, SPECIES_MEW, SPECIES_MEWTWO, SPECIES_MILTANK, SPECIES_MISDREAVUS, SPECIES_MOLTRES, SPECIES_MR_MIME, SPECIES_MUK, SPECIES_MURKROW, SPECIES_NATU, SPECIES_NIDOKING, SPECIES_NIDOQUEEN, SPECIES_NIDORAN_F, SPECIES_NIDORAN_M, SPECIES_NIDORINA, SPECIES_NIDORINO, SPECIES_NINETALES, SPECIES_NOCTOWL, SPECIES_OCTILLERY, SPECIES_ODDISH, SPECIES_OMANYTE, SPECIES_OMASTAR, SPECIES_ONIX, SPECIES_PARAS, SPECIES_PARASECT, SPECIES_PERSIAN, SPECIES_PHANPY, SPECIES_PICHU, SPECIES_PIDGEOT, SPECIES_PIDGEOTTO, SPECIES_PIDGEY, SPECIES_PIKACHU, SPECIES_PILOSWINE, SPECIES_PINECO, SPECIES_PINSIR, SPECIES_POLITOED, SPECIES_POLIWAG, SPECIES_POLIWHIRL, SPECIES_POLIWRATH, SPECIES_PONYTA, SPECIES_PORYGON, SPECIES_PORYGON2, SPECIES_PRIMEAPE, SPECIES_PSYDUCK, SPECIES_PUPITAR, SPECIES_QUAGSIRE, SPECIES_QUILAVA, SPECIES_QWILFISH, SPECIES_RAICHU, SPECIES_RAIKOU, SPECIES_RAPIDASH, SPECIES_RATICATE, SPECIES_RATTATA, SPECIES_REMORAID, SPECIES_RHYDON, SPECIES_RHYHORN, SPECIES_SANDSHREW, SPECIES_SANDSLASH, SPECIES_SCIZOR, SPECIES_SCYTHER, SPECIES_SEADRA, SPECIES_SEAKING, SPECIES_SEEL, SPECIES_SENTRET, SPECIES_SHELLDER, SPECIES_SHUCKLE, SPECIES_SKARMORY, SPECIES_SKIPLOOM, SPECIES_SLOWBRO, SPECIES_SLOWKING, SPECIES_SLOWPOKE, SPECIES_SLUGMA, SPECIES_SMEARGLE, SPECIES_SMOOCHUM, SPECIES_SNEASEL, SPECIES_SNORLAX, SPECIES_SNUBBULL, SPECIES_SPEAROW, SPECIES_SPINARAK, SPECIES_SQUIRTLE, SPECIES_STANTLER, SPECIES_STARMIE, SPECIES_STARYU, SPECIES_STEELIX, SPECIES_SUDOWOODO, SPECIES_SUICUNE, SPECIES_SUNFLORA, SPECIES_SUNKERN, SPECIES_SWINUB, SPECIES_TANGELA, SPECIES_TAUROS, SPECIES_TEDDIURSA, SPECIES_TENTACOOL, SPECIES_TENTACRUEL, SPECIES_TOGEPI, SPECIES_TOGETIC, SPECIES_TOTODILE, SPECIES_TYPHLOSION, SPECIES_TYRANITAR, SPECIES_TYROGUE, SPECIES_UMBREON, SPECIES_UNOWN, SPECIES_URSARING, SPECIES_VAPOREON, SPECIES_VENOMOTH, SPECIES_VENONAT, SPECIES_VENUSAUR, SPECIES_VICTREEBEL, SPECIES_VILEPLUME, SPECIES_VOLTORB, SPECIES_VULPIX, SPECIES_WARTORTLE, SPECIES_WEEDLE, SPECIES_WEEPINBELL, SPECIES_WEEZING, SPECIES_WIGGLYTUFF, SPECIES_WOBBUFFET, SPECIES_WOOPER, SPECIES_XATU, SPECIES_YANMA, SPECIES_ZAPDOS, SPECIES_ZUBAT, }; ================================================ FILE: src/data/easy_chat/easy_chat_group_speech.h ================================================ static const u8 sEasyChatWord_Listen[] = _("LISTEN"); static const u8 sEasyChatWord_NotVery[] = _("NOT VERY"); static const u8 sEasyChatWord_Mean[] = _("MEAN"); static const u8 sEasyChatWord_Lie[] = _("LIE"); static const u8 sEasyChatWord_Lay[] = _("LAY"); static const u8 sEasyChatWord_Recommend[] = _("RECOMMEND"); static const u8 sEasyChatWord_Nitwit[] = _("NITWIT"); static const u8 sEasyChatWord_Quite[] = _("QUITE"); static const u8 sEasyChatWord_From[] = _("FROM"); static const u8 sEasyChatWord_Feeling[] = _("FEELING"); static const u8 sEasyChatWord_But[] = _("BUT"); static const u8 sEasyChatWord_However[] = _("HOWEVER"); static const u8 sEasyChatWord_Case[] = _("CASE"); static const u8 sEasyChatWord_The[] = _("THE"); static const u8 sEasyChatWord_Miss[] = _("MISS"); static const u8 sEasyChatWord_How[] = _("HOW"); static const u8 sEasyChatWord_Hit[] = _("HIT"); static const u8 sEasyChatWord_Enough[] = _("ENOUGH"); static const u8 sEasyChatWord_ALot[] = _("A LOT"); static const u8 sEasyChatWord_ALittle[] = _("A LITTLE"); static const u8 sEasyChatWord_Absolutely[] = _("ABSOLUTELY"); static const u8 sEasyChatWord_And[] = _("AND"); static const u8 sEasyChatWord_Only[] = _("ONLY"); static const u8 sEasyChatWord_Around[] = _("AROUND"); static const u8 sEasyChatWord_Probably[] = _("PROBABLY"); static const u8 sEasyChatWord_If[] = _("IF"); static const u8 sEasyChatWord_Very[] = _("VERY"); static const u8 sEasyChatWord_ATinyBit[] = _("A TINY BIT"); static const u8 sEasyChatWord_Wild[] = _("WILD"); static const u8 sEasyChatWord_Thats[] = _("THAT'S"); static const u8 sEasyChatWord_Just[] = _("JUST"); static const u8 sEasyChatWord_EvenSo[] = _("EVEN SO,"); static const u8 sEasyChatWord_MustBe[] = _("MUST BE"); static const u8 sEasyChatWord_Naturally[] = _("NATURALLY"); static const u8 sEasyChatWord_ForNow[] = _("FOR NOW,"); static const u8 sEasyChatWord_Understood[] = _("UNDERSTOOD"); static const u8 sEasyChatWord_Joking[] = _("JOKING"); static const u8 sEasyChatWord_Ready[] = _("READY"); static const u8 sEasyChatWord_Something[] = _("SOMETHING"); static const u8 sEasyChatWord_Somehow[] = _("SOMEHOW"); static const u8 sEasyChatWord_Although[] = _("ALTHOUGH"); static const u8 sEasyChatWord_Also[] = _("ALSO"); static const u8 sEasyChatWord_Perfect[] = _("PERFECT"); static const u8 sEasyChatWord_AsMuchAs[] = _("AS MUCH AS"); static const u8 sEasyChatWord_Really[] = _("REALLY"); static const u8 sEasyChatWord_Truly[] = _("TRULY"); static const u8 sEasyChatWord_Seriously[] = _("SERIOUSLY"); static const u8 sEasyChatWord_Totally[] = _("TOTALLY"); static const u8 sEasyChatWord_Until[] = _("UNTIL"); static const u8 sEasyChatWord_AsIf[] = _("AS IF"); static const u8 sEasyChatWord_Mood[] = _("MOOD"); static const u8 sEasyChatWord_Rather[] = _("RATHER"); static const u8 sEasyChatWord_Awfully[] = _("AWFULLY"); static const u8 sEasyChatWord_Mode[] = _("MODE"); static const u8 sEasyChatWord_More[] = _("MORE"); static const u8 sEasyChatWord_TooLate[] = _("TOO LATE"); static const u8 sEasyChatWord_Finally[] = _("FINALLY"); static const u8 sEasyChatWord_Any[] = _("ANY"); static const u8 sEasyChatWord_Instead[] = _("INSTEAD"); static const u8 sEasyChatWord_Fantastic[] = _("FANTASTIC"); static const struct EasyChatWordInfo sEasyChatGroup_Speech[] = { { .text = sEasyChatWord_Listen, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_NotVery, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Mean, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Lie, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Lay, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Recommend, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_Nitwit, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Quite, .alphabeticalOrder = 57, .enabled = TRUE }, { .text = sEasyChatWord_From, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Feeling, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_But, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_However, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_Case, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_The, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Miss, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_How, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Hit, .alphabeticalOrder = 59, .enabled = TRUE }, { .text = sEasyChatWord_Enough, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_ALot, .alphabeticalOrder = 56, .enabled = TRUE }, { .text = sEasyChatWord_ALittle, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Absolutely, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_And, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Only, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Around, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Probably, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_If, .alphabeticalOrder = 58, .enabled = TRUE }, { .text = sEasyChatWord_Very, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_ATinyBit, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Wild, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Thats, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Just, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_EvenSo, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_MustBe, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Naturally, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_ForNow, .alphabeticalOrder = 50, .enabled = TRUE }, { .text = sEasyChatWord_Understood, .alphabeticalOrder = 54, .enabled = TRUE }, { .text = sEasyChatWord_Joking, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Ready, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Something, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Somehow, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Although, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Also, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Perfect, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_AsMuchAs, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Really, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_Truly, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Seriously, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_Totally, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Until, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_AsIf, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Mood, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Rather, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Awfully, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Mode, .alphabeticalOrder = 55, .enabled = TRUE }, { .text = sEasyChatWord_More, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_TooLate, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_Finally, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Any, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_Instead, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Fantastic, .alphabeticalOrder = 28, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_status.h ================================================ static const u8 sEasyChatWord_Dark[] = _("DARK"); static const u8 sEasyChatWord_Stench[] = _("STENCH"); static const u8 sEasyChatWord_ThickFat[] = _("THICK FAT"); static const u8 sEasyChatWord_RainDish[] = _("RAIN DISH"); static const u8 sEasyChatWord_Drizzle[] = _("DRIZZLE"); static const u8 sEasyChatWord_ArenaTrap[] = _("ARENA TRAP"); static const u8 sEasyChatWord_Intimidate[] = _("INTIMIDATE"); static const u8 sEasyChatWord_RockHead[] = _("ROCK HEAD"); static const u8 sEasyChatWord_Color[] = _("COLOR"); static const u8 sEasyChatWord_AltColor[] = _("ALT. COLOR"); static const u8 sEasyChatWord_Rock[] = _("ROCK"); static const u8 sEasyChatWord_Beautiful[] = _("BEAUTIFUL"); static const u8 sEasyChatWord_Beauty[] = _("BEAUTY"); static const u8 sEasyChatWord_AirLock[] = _("AIR LOCK"); static const u8 sEasyChatWord_Psychic[] = _("PSYCHIC"); static const u8 sEasyChatWord_HyperCutter[] = _("HYPER CUTTER"); static const u8 sEasyChatWord_Fighting[] = _("FIGHTING"); static const u8 sEasyChatWord_ShadowTag[] = _("SHADOW TAG"); static const u8 sEasyChatWord_Smart[] = _("SMART"); static const u8 sEasyChatWord_Smartness[] = _("SMARTNESS"); static const u8 sEasyChatWord_SpeedBoost[] = _("SPEED BOOST"); static const u8 sEasyChatWord_Cool[] = _("COOL"); static const u8 sEasyChatWord_Coolness[] = _("COOLNESS"); static const u8 sEasyChatWord_BattleArmor[] = _("BATTLE ARMOR"); static const u8 sEasyChatWord_Cute[] = _("CUTE"); static const u8 sEasyChatWord_Cuteness[] = _("CUTENESS"); static const u8 sEasyChatWord_Sturdy[] = _("STURDY"); static const u8 sEasyChatWord_SuctionCups[] = _("SUCTION CUPS"); static const u8 sEasyChatWord_Grass[] = _("GRASS"); static const u8 sEasyChatWord_ClearBody[] = _("CLEAR BODY"); static const u8 sEasyChatWord_Torrent[] = _("TORRENT"); static const u8 sEasyChatWord_Ghost[] = _("GHOST"); static const u8 sEasyChatWord_Ice[] = _("ICE"); static const u8 sEasyChatWord_Guts[] = _("GUTS"); static const u8 sEasyChatWord_RoughSkin[] = _("ROUGH SKIN"); static const u8 sEasyChatWord_ShellArmor[] = _("SHELL ARMOR"); static const u8 sEasyChatWord_NaturalCure[] = _("NATURAL CURE"); static const u8 sEasyChatWord_Damp[] = _("DAMP"); static const u8 sEasyChatWord_Ground[] = _("GROUND"); static const u8 sEasyChatWord_Limber[] = _("LIMBER"); static const u8 sEasyChatWord_MagnetPull[] = _("MAGNET PULL"); static const u8 sEasyChatWord_WhiteSmoke[] = _("WHITE SMOKE"); static const u8 sEasyChatWord_Synchronize[] = _("SYNCHRONIZE"); static const u8 sEasyChatWord_Overgrow[] = _("OVERGROW"); static const u8 sEasyChatWord_SwiftSwim[] = _("SWIFT SWIM"); static const u8 sEasyChatWord_SandStream[] = _("SAND STREAM"); static const u8 sEasyChatWord_SandVeil[] = _("SAND VEIL"); static const u8 sEasyChatWord_KeenEye[] = _("KEEN EYE"); static const u8 sEasyChatWord_InnerFocus[] = _("INNER FOCUS"); static const u8 sEasyChatWord_Static[] = _("STATIC"); static const u8 sEasyChatWord_Type[] = _("TYPE"); static const u8 sEasyChatWord_Tough[] = _("TOUGH"); static const u8 sEasyChatWord_Toughness[] = _("TOUGHNESS"); static const u8 sEasyChatWord_ShedSkin[] = _("SHED SKIN"); static const u8 sEasyChatWord_HugePower[] = _("HUGE POWER"); static const u8 sEasyChatWord_VoltAbsorb[] = _("VOLT ABSORB"); static const u8 sEasyChatWord_WaterAbsorb[] = _("WATER ABSORB"); static const u8 sEasyChatWord_Electric[] = _("ELECTRIC"); static const u8 sEasyChatWord_Forecast[] = _("FORECAST"); static const u8 sEasyChatWord_SereneGrace[] = _("SERENE GRACE"); static const u8 sEasyChatWord_Poison[] = _("POISON"); static const u8 sEasyChatWord_PoisonPoint[] = _("POISON POINT"); static const u8 sEasyChatWord_Dragon[] = _("DRAGON"); static const u8 sEasyChatWord_Trace[] = _("TRACE"); static const u8 sEasyChatWord_Oblivious[] = _("OBLIVIOUS"); static const u8 sEasyChatWord_Truant[] = _("TRUANT"); static const u8 sEasyChatWord_RunAway[] = _("RUN AWAY"); static const u8 sEasyChatWord_StickyHold[] = _("STICKY HOLD"); static const u8 sEasyChatWord_CloudNine[] = _("CLOUD NINE"); static const u8 sEasyChatWord_Normal[] = _("NORMAL"); static const u8 sEasyChatWord_Steel[] = _("STEEL"); static const u8 sEasyChatWord_Illuminate[] = _("ILLUMINATE"); static const u8 sEasyChatWord_EarlyBird[] = _("EARLY BIRD"); static const u8 sEasyChatWord_Hustle[] = _("HUSTLE"); static const u8 sEasyChatWord_Shine[] = _("SHINE"); static const u8 sEasyChatWord_Flying[] = _("FLYING"); static const u8 sEasyChatWord_Drought[] = _("DROUGHT"); static const u8 sEasyChatWord_Lightningrod[] = _("LIGHTNINGROD"); static const u8 sEasyChatWord_Compoundeyes[] = _("COMPOUNDEYES"); static const u8 sEasyChatWord_MarvelScale[] = _("MARVEL SCALE"); static const u8 sEasyChatWord_WonderGuard[] = _("WONDER GUARD"); static const u8 sEasyChatWord_Insomnia[] = _("INSOMNIA"); static const u8 sEasyChatWord_Levitate[] = _("LEVITATE"); static const u8 sEasyChatWord_Plus[] = _("PLUS"); static const u8 sEasyChatWord_Pressure[] = _("PRESSURE"); static const u8 sEasyChatWord_LiquidOoze[] = _("LIQUID OOZE"); static const u8 sEasyChatWord_ColorChange[] = _("COLOR CHANGE"); static const u8 sEasyChatWord_Soundproof[] = _("SOUNDPROOF"); static const u8 sEasyChatWord_EffectSpore[] = _("EFFECT SPORE"); static const u8 sEasyChatWord_Pkrs[] = _("{PK}RS"); static const u8 sEasyChatWord_Fire[] = _("FIRE"); static const u8 sEasyChatWord_FlameBody[] = _("FLAME BODY"); static const u8 sEasyChatWord_Minus[] = _("MINUS"); static const u8 sEasyChatWord_OwnTempo[] = _("OWN TEMPO"); static const u8 sEasyChatWord_MagmaArmor[] = _("MAGMA ARMOR"); static const u8 sEasyChatWord_Water[] = _("WATER"); static const u8 sEasyChatWord_WaterVeil[] = _("WATER VEIL"); static const u8 sEasyChatWord_Bug[] = _("BUG"); static const u8 sEasyChatWord_Swarm[] = _("SWARM"); static const u8 sEasyChatWord_CuteCharm[] = _("CUTE CHARM"); static const u8 sEasyChatWord_Immunity[] = _("IMMUNITY"); static const u8 sEasyChatWord_Blaze[] = _("BLAZE"); static const u8 sEasyChatWord_Pickup[] = _("PICKUP"); static const u8 sEasyChatWord_Pattern[] = _("PATTERN"); static const u8 sEasyChatWord_FlashFire[] = _("FLASH FIRE"); static const u8 sEasyChatWord_VitalSpirit[] = _("VITAL SPIRIT"); static const u8 sEasyChatWord_Chlorophyll[] = _("CHLOROPHYLL"); static const u8 sEasyChatWord_PurePower[] = _("PURE POWER"); static const u8 sEasyChatWord_ShieldDust[] = _("SHIELD DUST"); static const struct EasyChatWordInfo sEasyChatGroup_Status[] = { { .text = sEasyChatWord_Dark, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Stench, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_ThickFat, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_RainDish, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Drizzle, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_ArenaTrap, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Intimidate, .alphabeticalOrder = 101, .enabled = TRUE }, { .text = sEasyChatWord_RockHead, .alphabeticalOrder = 97, .enabled = TRUE }, { .text = sEasyChatWord_Color, .alphabeticalOrder = 106, .enabled = TRUE }, { .text = sEasyChatWord_AltColor, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Rock, .alphabeticalOrder = 68, .enabled = TRUE }, { .text = sEasyChatWord_Beautiful, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Beauty, .alphabeticalOrder = 86, .enabled = TRUE }, { .text = sEasyChatWord_AirLock, .alphabeticalOrder = 78, .enabled = TRUE }, { .text = sEasyChatWord_Psychic, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_HyperCutter, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Fighting, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_ShadowTag, .alphabeticalOrder = 99, .enabled = TRUE }, { .text = sEasyChatWord_Smart, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Smartness, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_SpeedBoost, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Cool, .alphabeticalOrder = 62, .enabled = TRUE }, { .text = sEasyChatWord_Coolness, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_BattleArmor, .alphabeticalOrder = 76, .enabled = TRUE }, { .text = sEasyChatWord_Cute, .alphabeticalOrder = 72, .enabled = TRUE }, { .text = sEasyChatWord_Cuteness, .alphabeticalOrder = 88, .enabled = TRUE }, { .text = sEasyChatWord_Sturdy, .alphabeticalOrder = 57, .enabled = TRUE }, { .text = sEasyChatWord_SuctionCups, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Grass, .alphabeticalOrder = 90, .enabled = TRUE }, { .text = sEasyChatWord_ClearBody, .alphabeticalOrder = 91, .enabled = TRUE }, { .text = sEasyChatWord_Torrent, .alphabeticalOrder = 104, .enabled = TRUE }, { .text = sEasyChatWord_Ghost, .alphabeticalOrder = 75, .enabled = TRUE }, { .text = sEasyChatWord_Ice, .alphabeticalOrder = 58, .enabled = TRUE }, { .text = sEasyChatWord_Guts, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_RoughSkin, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_ShellArmor, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_NaturalCure, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Damp, .alphabeticalOrder = 54, .enabled = TRUE }, { .text = sEasyChatWord_Ground, .alphabeticalOrder = 73, .enabled = TRUE }, { .text = sEasyChatWord_Limber, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_MagnetPull, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_WhiteSmoke, .alphabeticalOrder = 71, .enabled = TRUE }, { .text = sEasyChatWord_Synchronize, .alphabeticalOrder = 100, .enabled = TRUE }, { .text = sEasyChatWord_Overgrow, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_SwiftSwim, .alphabeticalOrder = 81, .enabled = TRUE }, { .text = sEasyChatWord_SandStream, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_SandVeil, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_KeenEye, .alphabeticalOrder = 82, .enabled = TRUE }, { .text = sEasyChatWord_InnerFocus, .alphabeticalOrder = 77, .enabled = TRUE }, { .text = sEasyChatWord_Static, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Type, .alphabeticalOrder = 85, .enabled = TRUE }, { .text = sEasyChatWord_Tough, .alphabeticalOrder = 94, .enabled = TRUE }, { .text = sEasyChatWord_Toughness, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_ShedSkin, .alphabeticalOrder = 79, .enabled = TRUE }, { .text = sEasyChatWord_HugePower, .alphabeticalOrder = 92, .enabled = TRUE }, { .text = sEasyChatWord_VoltAbsorb, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_WaterAbsorb, .alphabeticalOrder = 69, .enabled = TRUE }, { .text = sEasyChatWord_Electric, .alphabeticalOrder = 64, .enabled = TRUE }, { .text = sEasyChatWord_Forecast, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_SereneGrace, .alphabeticalOrder = 93, .enabled = TRUE }, { .text = sEasyChatWord_Poison, .alphabeticalOrder = 103, .enabled = TRUE }, { .text = sEasyChatWord_PoisonPoint, .alphabeticalOrder = 102, .enabled = TRUE }, { .text = sEasyChatWord_Dragon, .alphabeticalOrder = 89, .enabled = TRUE }, { .text = sEasyChatWord_Trace, .alphabeticalOrder = 83, .enabled = TRUE }, { .text = sEasyChatWord_Oblivious, .alphabeticalOrder = 60, .enabled = TRUE }, { .text = sEasyChatWord_Truant, .alphabeticalOrder = 61, .enabled = TRUE }, { .text = sEasyChatWord_RunAway, .alphabeticalOrder = 84, .enabled = TRUE }, { .text = sEasyChatWord_StickyHold, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_CloudNine, .alphabeticalOrder = 107, .enabled = TRUE }, { .text = sEasyChatWord_Normal, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Steel, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Illuminate, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_EarlyBird, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Hustle, .alphabeticalOrder = 66, .enabled = TRUE }, { .text = sEasyChatWord_Shine, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_Flying, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_Drought, .alphabeticalOrder = 59, .enabled = TRUE }, { .text = sEasyChatWord_Lightningrod, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Compoundeyes, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_MarvelScale, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_WonderGuard, .alphabeticalOrder = 108, .enabled = TRUE }, { .text = sEasyChatWord_Insomnia, .alphabeticalOrder = 74, .enabled = TRUE }, { .text = sEasyChatWord_Levitate, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Plus, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Pressure, .alphabeticalOrder = 87, .enabled = TRUE }, { .text = sEasyChatWord_LiquidOoze, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_ColorChange, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_Soundproof, .alphabeticalOrder = 70, .enabled = TRUE }, { .text = sEasyChatWord_EffectSpore, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Pkrs, .alphabeticalOrder = 67, .enabled = TRUE }, { .text = sEasyChatWord_Fire, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_FlameBody, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Minus, .alphabeticalOrder = 98, .enabled = TRUE }, { .text = sEasyChatWord_OwnTempo, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_MagmaArmor, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Water, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_WaterVeil, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Bug, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_Swarm, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_CuteCharm, .alphabeticalOrder = 63, .enabled = TRUE }, { .text = sEasyChatWord_Immunity, .alphabeticalOrder = 65, .enabled = TRUE }, { .text = sEasyChatWord_Blaze, .alphabeticalOrder = 50, .enabled = TRUE }, { .text = sEasyChatWord_Pickup, .alphabeticalOrder = 105, .enabled = TRUE }, { .text = sEasyChatWord_Pattern, .alphabeticalOrder = 55, .enabled = TRUE }, { .text = sEasyChatWord_FlashFire, .alphabeticalOrder = 95, .enabled = TRUE }, { .text = sEasyChatWord_VitalSpirit, .alphabeticalOrder = 56, .enabled = TRUE }, { .text = sEasyChatWord_Chlorophyll, .alphabeticalOrder = 96, .enabled = TRUE }, { .text = sEasyChatWord_PurePower, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_ShieldDust, .alphabeticalOrder = 80, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_time.h ================================================ static const u8 sEasyChatWord_Fall[] = _("FALL"); static const u8 sEasyChatWord_Morning[] = _("MORNING"); static const u8 sEasyChatWord_Tomorrow[] = _("TOMORROW"); static const u8 sEasyChatWord_Last[] = _("LAST"); static const u8 sEasyChatWord_Day[] = _("DAY"); static const u8 sEasyChatWord_Sometime[] = _("SOMETIME"); static const u8 sEasyChatWord_Always[] = _("ALWAYS"); static const u8 sEasyChatWord_Current[] = _("CURRENT"); static const u8 sEasyChatWord_Forever[] = _("FOREVER"); static const u8 sEasyChatWord_Days[] = _("DAYS"); static const u8 sEasyChatWord_End[] = _("END"); static const u8 sEasyChatWord_Tuesday[] = _("TUESDAY"); static const u8 sEasyChatWord_Yesterday[] = _("YESTERDAY"); static const u8 sEasyChatWord_Today[] = _("TODAY"); static const u8 sEasyChatWord_Friday[] = _("FRIDAY"); static const u8 sEasyChatWord_Monday[] = _("MONDAY"); static const u8 sEasyChatWord_Later[] = _("LATER"); static const u8 sEasyChatWord_Earlier[] = _("EARLIER"); static const u8 sEasyChatWord_Another[] = _("ANOTHER"); static const u8 sEasyChatWord_Time[] = _("TIME"); static const u8 sEasyChatWord_Finish[] = _("FINISH"); static const u8 sEasyChatWord_Wednesday[] = _("WEDNESDAY"); static const u8 sEasyChatWord_Soon[] = _("SOON"); static const u8 sEasyChatWord_Start[] = _("START"); static const u8 sEasyChatWord_Month[] = _("MONTH"); static const u8 sEasyChatWord_Stop[] = _("STOP"); static const u8 sEasyChatWord_Now[] = _("NOW"); static const u8 sEasyChatWord_Final[] = _("FINAL"); static const u8 sEasyChatWord_Next[] = _("NEXT"); static const u8 sEasyChatWord_Age[] = _("AGE"); static const u8 sEasyChatWord_Saturday[] = _("SATURDAY"); static const u8 sEasyChatWord_Summer[] = _("SUMMER"); static const u8 sEasyChatWord_Sunday[] = _("SUNDAY"); static const u8 sEasyChatWord_Beginning[] = _("BEGINNING"); static const u8 sEasyChatWord_Spring[] = _("SPRING"); static const u8 sEasyChatWord_Daytime[] = _("DAYTIME"); static const u8 sEasyChatWord_Winter[] = _("WINTER"); static const u8 sEasyChatWord_Daily[] = _("DAILY"); static const u8 sEasyChatWord_Olden[] = _("OLDEN"); static const u8 sEasyChatWord_Almost[] = _("ALMOST"); static const u8 sEasyChatWord_Nearly[] = _("NEARLY"); static const u8 sEasyChatWord_Thursday[] = _("THURSDAY"); static const u8 sEasyChatWord_Nighttime[] = _("NIGHTTIME"); static const u8 sEasyChatWord_Night[] = _("NIGHT"); static const u8 sEasyChatWord_Week[] = _("WEEK"); static const struct EasyChatWordInfo sEasyChatGroup_Time[] = { { .text = sEasyChatWord_Fall, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Morning, .alphabeticalOrder = 39, .enabled = TRUE }, { .text = sEasyChatWord_Tomorrow, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Last, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Day, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Sometime, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Always, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_Current, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Forever, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Days, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_End, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Tuesday, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Yesterday, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Today, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Friday, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Monday, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Later, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Earlier, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Another, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Time, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Finish, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Wednesday, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Soon, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_Start, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Month, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Stop, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Now, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Final, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Next, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Age, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Saturday, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Summer, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_Sunday, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Beginning, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Spring, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Daytime, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_Winter, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_Daily, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Olden, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Almost, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Nearly, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Thursday, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Nighttime, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_Night, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_Week, .alphabeticalOrder = 12, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_trainer.h ================================================ static const u8 sEasyChatWord_IChooseYou[] = _("I CHOOSE YOU"); static const u8 sEasyChatWord_Gotcha[] = _("GOTCHA"); static const u8 sEasyChatWord_Trade[] = _("TRADE"); static const u8 sEasyChatWord_Sapphire[] = _("SAPPHIRE"); static const u8 sEasyChatWord_Evolve[] = _("EVOLVE"); static const u8 sEasyChatWord_Encyclopedia[] = _("ENCYCLOPEDIA"); static const u8 sEasyChatWord_Nature[] = _("NATURE"); static const u8 sEasyChatWord_Center[] = _("CENTER"); static const u8 sEasyChatWord_Egg[] = _("EGG"); static const u8 sEasyChatWord_Link[] = _("LINK"); static const u8 sEasyChatWord_SpAbility[] = _("SP. ABILITY"); static const u8 sEasyChatWord_Trainer[] = _("TRAINER"); static const u8 sEasyChatWord_Version[] = _("VERSION"); static const u8 sEasyChatWord_Pokenav[] = _("POKéNAV"); static const u8 sEasyChatWord_Pokemon[] = _("POKéMON"); static const u8 sEasyChatWord_Get[] = _("GET"); static const u8 sEasyChatWord_Pokedex[] = _("POKéDEX"); static const u8 sEasyChatWord_Ruby[] = _("RUBY"); static const u8 sEasyChatWord_Level[] = _("LEVEL"); static const u8 sEasyChatWord_Red[] = _("RED"); static const u8 sEasyChatWord_Green[] = _("GREEN"); static const u8 sEasyChatWord_Bag[] = _("BAG"); static const u8 sEasyChatWord_Flame[] = _("FLAME"); static const u8 sEasyChatWord_Gold[] = _("GOLD"); static const u8 sEasyChatWord_Leaf[] = _("LEAF"); static const u8 sEasyChatWord_Silver[] = _("SILVER"); static const struct EasyChatWordInfo sEasyChatGroup_Trainer[] = { { .text = sEasyChatWord_IChooseYou, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Gotcha, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Trade, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Sapphire, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_Evolve, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_Encyclopedia, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Nature, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Center, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Egg, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_Link, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_SpAbility, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_Trainer, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Version, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Pokenav, .alphabeticalOrder = 9, .enabled = FALSE }, { .text = sEasyChatWord_Pokemon, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Get, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Pokedex, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Ruby, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Level, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Red, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Green, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_Bag, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Flame, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_Gold, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_Leaf, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Silver, .alphabeticalOrder = 12, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_trendy_saying.h ================================================ static const u8 sEasyChatWord_KthxBye[] = _("KTHX, BYE."); static const u8 sEasyChatWord_YesSirExcl[] = _("YES, SIR!"); static const u8 sEasyChatWord_AvantGarde[] = _("AVANT GARDE"); static const u8 sEasyChatWord_Couple[] = _("COUPLE"); static const u8 sEasyChatWord_MuchObliged[] = _("MUCH OBLIGED"); static const u8 sEasyChatWord_YeehawExcl[] = _("YEEHAW!"); static const u8 sEasyChatWord_Mega[] = _("MEGA"); static const u8 sEasyChatWord_1HitKOExcl[] = _("1-HIT KO!"); static const u8 sEasyChatWord_Destiny[] = _("DESTINY"); static const u8 sEasyChatWord_Cancel[] = _("CANCEL"); static const u8 sEasyChatWord_New[] = _("NEW"); static const u8 sEasyChatWord_Flatten[] = _("FLATTEN"); static const u8 sEasyChatWord_Kidding[] = _("KIDDING"); static const u8 sEasyChatWord_Loser[] = _("LOSER"); static const u8 sEasyChatWord_Losing[] = _("LOSING"); static const u8 sEasyChatWord_Happening[] = _("HAPPENING"); static const u8 sEasyChatWord_HipAnd[] = _("HIP AND"); static const u8 sEasyChatWord_Shake[] = _("SHAKE"); static const u8 sEasyChatWord_Shady[] = _("SHADY"); static const u8 sEasyChatWord_Upbeat[] = _("UPBEAT"); static const u8 sEasyChatWord_Modern[] = _("MODERN"); static const u8 sEasyChatWord_SmellYa[] = _("SMELL YA"); static const u8 sEasyChatWord_Bang[] = _("BANG"); static const u8 sEasyChatWord_Knockout[] = _("KNOCKOUT"); static const u8 sEasyChatWord_Hassle[] = _("HASSLE"); static const u8 sEasyChatWord_Winner[] = _("WINNER"); static const u8 sEasyChatWord_Fever[] = _("FEVER"); static const u8 sEasyChatWord_Wannabe[] = _("WANNABE"); static const u8 sEasyChatWord_Baby[] = _("BABY"); static const u8 sEasyChatWord_Heart[] = _("HEART"); static const u8 sEasyChatWord_Old[] = _("OLD"); static const u8 sEasyChatWord_Young[] = _("YOUNG"); static const u8 sEasyChatWord_Ugly[] = _("UGLY"); static const struct EasyChatWordInfo sEasyChatGroup_TrendySaying[] = { { .text = sEasyChatWord_KthxBye, .alphabeticalOrder = 7, .enabled = FALSE }, { .text = sEasyChatWord_YesSirExcl, .alphabeticalOrder = 2, .enabled = FALSE }, { .text = sEasyChatWord_AvantGarde, .alphabeticalOrder = 28, .enabled = FALSE }, { .text = sEasyChatWord_Couple, .alphabeticalOrder = 22, .enabled = FALSE }, { .text = sEasyChatWord_MuchObliged, .alphabeticalOrder = 9, .enabled = FALSE }, { .text = sEasyChatWord_YeehawExcl, .alphabeticalOrder = 3, .enabled = FALSE }, { .text = sEasyChatWord_Mega, .alphabeticalOrder = 8, .enabled = FALSE }, { .text = sEasyChatWord_1HitKOExcl, .alphabeticalOrder = 26, .enabled = FALSE }, { .text = sEasyChatWord_Destiny, .alphabeticalOrder = 11, .enabled = FALSE }, { .text = sEasyChatWord_Cancel, .alphabeticalOrder = 15, .enabled = FALSE }, { .text = sEasyChatWord_New, .alphabeticalOrder = 24, .enabled = FALSE }, { .text = sEasyChatWord_Flatten, .alphabeticalOrder = 29, .enabled = FALSE }, { .text = sEasyChatWord_Kidding, .alphabeticalOrder = 16, .enabled = FALSE }, { .text = sEasyChatWord_Loser, .alphabeticalOrder = 12, .enabled = FALSE }, { .text = sEasyChatWord_Losing, .alphabeticalOrder = 23, .enabled = FALSE }, { .text = sEasyChatWord_Happening, .alphabeticalOrder = 0, .enabled = FALSE }, { .text = sEasyChatWord_HipAnd, .alphabeticalOrder = 13, .enabled = FALSE }, { .text = sEasyChatWord_Shake, .alphabeticalOrder = 14, .enabled = FALSE }, { .text = sEasyChatWord_Shady, .alphabeticalOrder = 6, .enabled = FALSE }, { .text = sEasyChatWord_Upbeat, .alphabeticalOrder = 20, .enabled = FALSE }, { .text = sEasyChatWord_Modern, .alphabeticalOrder = 4, .enabled = FALSE }, { .text = sEasyChatWord_SmellYa, .alphabeticalOrder = 10, .enabled = FALSE }, { .text = sEasyChatWord_Bang, .alphabeticalOrder = 30, .enabled = FALSE }, { .text = sEasyChatWord_Knockout, .alphabeticalOrder = 18, .enabled = FALSE }, { .text = sEasyChatWord_Hassle, .alphabeticalOrder = 17, .enabled = FALSE }, { .text = sEasyChatWord_Winner, .alphabeticalOrder = 21, .enabled = FALSE }, { .text = sEasyChatWord_Fever, .alphabeticalOrder = 32, .enabled = FALSE }, { .text = sEasyChatWord_Wannabe, .alphabeticalOrder = 19, .enabled = FALSE }, { .text = sEasyChatWord_Baby, .alphabeticalOrder = 27, .enabled = FALSE }, { .text = sEasyChatWord_Heart, .alphabeticalOrder = 25, .enabled = FALSE }, { .text = sEasyChatWord_Old, .alphabeticalOrder = 5, .enabled = FALSE }, { .text = sEasyChatWord_Young, .alphabeticalOrder = 1, .enabled = FALSE }, { .text = sEasyChatWord_Ugly, .alphabeticalOrder = 31, .enabled = FALSE } }; ================================================ FILE: src/data/easy_chat/easy_chat_group_voices.h ================================================ static const u8 sEasyChatWord_Excl[] = _("!"); static const u8 sEasyChatWord_ExclExcl[] = _("!!"); static const u8 sEasyChatWord_QuesExcl[] = _("?!"); static const u8 sEasyChatWord_Ques[] = _("?"); static const u8 sEasyChatWord_Ellipsis[] = _("…"); static const u8 sEasyChatWord_EllipsisExcl[] = _("…!"); static const u8 sEasyChatWord_EllipsisEllipsisEllipsis[] = _("………"); static const u8 sEasyChatWord_Dash[] = _("-"); static const u8 sEasyChatWord_DashDashDash[] = _("- - -"); static const u8 sEasyChatWord_UhOh[] = _("UH-OH"); static const u8 sEasyChatWord_Waaah[] = _("WAAAH"); static const u8 sEasyChatWord_Ahaha[] = _("AHAHA"); static const u8 sEasyChatWord_OhQues[] = _("OH?"); static const u8 sEasyChatWord_Nope[] = _("NOPE"); static const u8 sEasyChatWord_Urgh[] = _("URGH"); static const u8 sEasyChatWord_Hmm[] = _("HMM"); static const u8 sEasyChatWord_Whoah[] = _("WHOAH"); static const u8 sEasyChatWord_WroooaarExcl[] = _("WROOOAAR!"); static const u8 sEasyChatWord_Wow[] = _("WOW"); static const u8 sEasyChatWord_Giggle[] = _("GIGGLE"); static const u8 sEasyChatWord_Sigh[] = _("SIGH"); static const u8 sEasyChatWord_Unbelievable[] = _("UNBELIEVABLE"); static const u8 sEasyChatWord_Cries[] = _("CRIES"); static const u8 sEasyChatWord_Agree[] = _("AGREE"); static const u8 sEasyChatWord_EhQues[] = _("EH?"); static const u8 sEasyChatWord_Cry[] = _("CRY"); static const u8 sEasyChatWord_Ehehe[] = _("EHEHE"); static const u8 sEasyChatWord_OiOiOi[] = _("OI, OI, OI"); static const u8 sEasyChatWord_OhYeah[] = _("OH, YEAH"); static const u8 sEasyChatWord_Oh[] = _("OH"); static const u8 sEasyChatWord_Oops[] = _("OOPS"); static const u8 sEasyChatWord_Shocked[] = _("SHOCKED"); static const u8 sEasyChatWord_Eek[] = _("EEK"); static const u8 sEasyChatWord_Graaah[] = _("GRAAAH"); static const u8 sEasyChatWord_Gwahahaha[] = _("GWAHAHAHA"); static const u8 sEasyChatWord_Way[] = _("WAY"); static const u8 sEasyChatWord_Tch[] = _("TCH"); static const u8 sEasyChatWord_Hehe[] = _("HEHE"); static const u8 sEasyChatWord_Hah[] = _("HAH"); static const u8 sEasyChatWord_Yup[] = _("YUP"); static const u8 sEasyChatWord_Hahaha[] = _("HAHAHA"); static const u8 sEasyChatWord_Aiyeeh[] = _("AIYEEH"); static const u8 sEasyChatWord_Hiyah[] = _("HIYAH"); static const u8 sEasyChatWord_Fufufu[] = _("FUFUFU"); static const u8 sEasyChatWord_Lol[] = _("LOL"); static const u8 sEasyChatWord_Snort[] = _("SNORT"); static const u8 sEasyChatWord_Humph[] = _("HUMPH"); static const u8 sEasyChatWord_Hehehe[] = _("HEHEHE"); static const u8 sEasyChatWord_Heh[] = _("HEH"); static const u8 sEasyChatWord_Hohoho[] = _("HOHOHO"); static const u8 sEasyChatWord_UhHuh[] = _("UH-HUH"); static const u8 sEasyChatWord_OhDear[] = _("OH, DEAR"); static const u8 sEasyChatWord_Arrgh[] = _("ARRGH"); static const u8 sEasyChatWord_Mufufu[] = _("MUFUFU"); static const u8 sEasyChatWord_Mmm[] = _("MMM"); static const u8 sEasyChatWord_OhKay[] = _("OH-KAY"); static const u8 sEasyChatWord_Okay[] = _("OKAY"); static const u8 sEasyChatWord_Lalala[] = _("LALALA"); static const u8 sEasyChatWord_Yay[] = _("YAY"); static const u8 sEasyChatWord_Aww[] = _("AWW"); static const u8 sEasyChatWord_Wowee[] = _("WOWEE"); static const u8 sEasyChatWord_Gwah[] = _("GWAH"); static const u8 sEasyChatWord_Wahahaha[] = _("WAHAHAHA"); static const struct EasyChatWordInfo sEasyChatGroup_Voices[] = { { .text = sEasyChatWord_Excl, .alphabeticalOrder = 0, .enabled = TRUE }, { .text = sEasyChatWord_ExclExcl, .alphabeticalOrder = 1, .enabled = TRUE }, { .text = sEasyChatWord_QuesExcl, .alphabeticalOrder = 7, .enabled = TRUE }, { .text = sEasyChatWord_Ques, .alphabeticalOrder = 8, .enabled = TRUE }, { .text = sEasyChatWord_Ellipsis, .alphabeticalOrder = 4, .enabled = TRUE }, { .text = sEasyChatWord_EllipsisExcl, .alphabeticalOrder = 5, .enabled = TRUE }, { .text = sEasyChatWord_EllipsisEllipsisEllipsis, .alphabeticalOrder = 6, .enabled = TRUE }, { .text = sEasyChatWord_Dash, .alphabeticalOrder = 3, .enabled = TRUE }, { .text = sEasyChatWord_DashDashDash, .alphabeticalOrder = 2, .enabled = TRUE }, { .text = sEasyChatWord_UhOh, .alphabeticalOrder = 23, .enabled = TRUE }, { .text = sEasyChatWord_Waaah, .alphabeticalOrder = 11, .enabled = TRUE }, { .text = sEasyChatWord_Ahaha, .alphabeticalOrder = 41, .enabled = TRUE }, { .text = sEasyChatWord_OhQues, .alphabeticalOrder = 52, .enabled = TRUE }, { .text = sEasyChatWord_Nope, .alphabeticalOrder = 59, .enabled = TRUE }, { .text = sEasyChatWord_Urgh, .alphabeticalOrder = 22, .enabled = TRUE }, { .text = sEasyChatWord_Hmm, .alphabeticalOrder = 25, .enabled = TRUE }, { .text = sEasyChatWord_Whoah, .alphabeticalOrder = 32, .enabled = TRUE }, { .text = sEasyChatWord_WroooaarExcl, .alphabeticalOrder = 24, .enabled = TRUE }, { .text = sEasyChatWord_Wow, .alphabeticalOrder = 26, .enabled = TRUE }, { .text = sEasyChatWord_Giggle, .alphabeticalOrder = 43, .enabled = TRUE }, { .text = sEasyChatWord_Sigh, .alphabeticalOrder = 19, .enabled = TRUE }, { .text = sEasyChatWord_Unbelievable, .alphabeticalOrder = 33, .enabled = TRUE }, { .text = sEasyChatWord_Cries, .alphabeticalOrder = 61, .enabled = TRUE }, { .text = sEasyChatWord_Agree, .alphabeticalOrder = 34, .enabled = TRUE }, { .text = sEasyChatWord_EhQues, .alphabeticalOrder = 38, .enabled = TRUE }, { .text = sEasyChatWord_Cry, .alphabeticalOrder = 40, .enabled = TRUE }, { .text = sEasyChatWord_Ehehe, .alphabeticalOrder = 48, .enabled = TRUE }, { .text = sEasyChatWord_OiOiOi, .alphabeticalOrder = 37, .enabled = TRUE }, { .text = sEasyChatWord_OhYeah, .alphabeticalOrder = 47, .enabled = TRUE }, { .text = sEasyChatWord_Oh, .alphabeticalOrder = 42, .enabled = TRUE }, { .text = sEasyChatWord_Oops, .alphabeticalOrder = 15, .enabled = TRUE }, { .text = sEasyChatWord_Shocked, .alphabeticalOrder = 49, .enabled = TRUE }, { .text = sEasyChatWord_Eek, .alphabeticalOrder = 46, .enabled = TRUE }, { .text = sEasyChatWord_Graaah, .alphabeticalOrder = 57, .enabled = TRUE }, { .text = sEasyChatWord_Gwahahaha, .alphabeticalOrder = 44, .enabled = TRUE }, { .text = sEasyChatWord_Way, .alphabeticalOrder = 54, .enabled = TRUE }, { .text = sEasyChatWord_Tch, .alphabeticalOrder = 53, .enabled = TRUE }, { .text = sEasyChatWord_Hehe, .alphabeticalOrder = 13, .enabled = TRUE }, { .text = sEasyChatWord_Hah, .alphabeticalOrder = 29, .enabled = TRUE }, { .text = sEasyChatWord_Yup, .alphabeticalOrder = 51, .enabled = TRUE }, { .text = sEasyChatWord_Hahaha, .alphabeticalOrder = 28, .enabled = TRUE }, { .text = sEasyChatWord_Aiyeeh, .alphabeticalOrder = 55, .enabled = TRUE }, { .text = sEasyChatWord_Hiyah, .alphabeticalOrder = 12, .enabled = TRUE }, { .text = sEasyChatWord_Fufufu, .alphabeticalOrder = 27, .enabled = TRUE }, { .text = sEasyChatWord_Lol, .alphabeticalOrder = 56, .enabled = TRUE }, { .text = sEasyChatWord_Snort, .alphabeticalOrder = 30, .enabled = TRUE }, { .text = sEasyChatWord_Humph, .alphabeticalOrder = 31, .enabled = TRUE }, { .text = sEasyChatWord_Hehehe, .alphabeticalOrder = 20, .enabled = TRUE }, { .text = sEasyChatWord_Heh, .alphabeticalOrder = 45, .enabled = TRUE }, { .text = sEasyChatWord_Hohoho, .alphabeticalOrder = 36, .enabled = TRUE }, { .text = sEasyChatWord_UhHuh, .alphabeticalOrder = 50, .enabled = TRUE }, { .text = sEasyChatWord_OhDear, .alphabeticalOrder = 9, .enabled = TRUE }, { .text = sEasyChatWord_Arrgh, .alphabeticalOrder = 21, .enabled = TRUE }, { .text = sEasyChatWord_Mufufu, .alphabeticalOrder = 14, .enabled = TRUE }, { .text = sEasyChatWord_Mmm, .alphabeticalOrder = 10, .enabled = TRUE }, { .text = sEasyChatWord_OhKay, .alphabeticalOrder = 62, .enabled = TRUE }, { .text = sEasyChatWord_Okay, .alphabeticalOrder = 35, .enabled = TRUE }, { .text = sEasyChatWord_Lalala, .alphabeticalOrder = 16, .enabled = TRUE }, { .text = sEasyChatWord_Yay, .alphabeticalOrder = 18, .enabled = TRUE }, { .text = sEasyChatWord_Aww, .alphabeticalOrder = 60, .enabled = TRUE }, { .text = sEasyChatWord_Wowee, .alphabeticalOrder = 17, .enabled = TRUE }, { .text = sEasyChatWord_Gwah, .alphabeticalOrder = 58, .enabled = TRUE }, { .text = sEasyChatWord_Wahahaha, .alphabeticalOrder = 39, .enabled = TRUE } }; ================================================ FILE: src/data/easy_chat/easy_chat_groups.h ================================================ #include "easy_chat.h" #include "easy_chat_group_pokemon.h" #include "easy_chat_group_trainer.h" #include "easy_chat_group_status.h" #include "easy_chat_group_battle.h" #include "easy_chat_group_greetings.h" #include "easy_chat_group_people.h" #include "easy_chat_group_voices.h" #include "easy_chat_group_speech.h" #include "easy_chat_group_endings.h" #include "easy_chat_group_feelings.h" #include "easy_chat_group_conditions.h" #include "easy_chat_group_actions.h" #include "easy_chat_group_lifestyle.h" #include "easy_chat_group_hobbies.h" #include "easy_chat_group_time.h" #include "easy_chat_group_misc.h" #include "easy_chat_group_adjectives.h" #include "easy_chat_group_events.h" #include "easy_chat_group_move_1.h" #include "easy_chat_group_move_2.h" #include "easy_chat_group_trendy_saying.h" #include "easy_chat_group_pokemon2.h" static const struct EasyChatGroup sEasyChatGroups[] = { { .wordData = {.valueList = sEasyChatGroup_Pokemon}, .numWords = 202, .numEnabledWords = 202 }, { .wordData = {.words = sEasyChatGroup_Trainer}, .numWords = 26, .numEnabledWords = 25 }, { .wordData = {.words = sEasyChatGroup_Status}, .numWords = 109, .numEnabledWords = 109 }, { .wordData = {.words = sEasyChatGroup_Battle}, .numWords = 63, .numEnabledWords = 63 }, { .wordData = {.words = sEasyChatGroup_Greetings}, .numWords = 42, .numEnabledWords = 42 }, { .wordData = {.words = sEasyChatGroup_People}, .numWords = 75, .numEnabledWords = 75 }, { .wordData = {.words = sEasyChatGroup_Voices}, .numWords = 63, .numEnabledWords = 63 }, { .wordData = {.words = sEasyChatGroup_Speech}, .numWords = 60, .numEnabledWords = 60 }, { .wordData = {.words = sEasyChatGroup_Endings}, .numWords = 69, .numEnabledWords = 69 }, { .wordData = {.words = sEasyChatGroup_Feelings}, .numWords = 69, .numEnabledWords = 69 }, { .wordData = {.words = sEasyChatGroup_Conditions}, .numWords = 69, .numEnabledWords = 69 }, { .wordData = {.words = sEasyChatGroup_Actions}, .numWords = 78, .numEnabledWords = 78 }, { .wordData = {.words = sEasyChatGroup_Lifestyle}, .numWords = 45, .numEnabledWords = 45 }, { .wordData = {.words = sEasyChatGroup_Hobbies}, .numWords = 54, .numEnabledWords = 54 }, { .wordData = {.words = sEasyChatGroup_Time}, .numWords = 45, .numEnabledWords = 45 }, { .wordData = {.words = sEasyChatGroup_Misc}, .numWords = 42, .numEnabledWords = 42 }, { .wordData = {.words = sEasyChatGroup_Adjectives}, .numWords = 36, .numEnabledWords = 36 }, { .wordData = {.words = sEasyChatGroup_Events}, .numWords = 28, .numEnabledWords = 19 }, { .wordData = {.valueList = sEasyChatGroup_Move1}, .numWords = 154, .numEnabledWords = 154 }, { .wordData = {.valueList = sEasyChatGroup_Move2}, .numWords = 200, .numEnabledWords = 200 }, { .wordData = {.words = sEasyChatGroup_TrendySaying}, .numWords = 33, .numEnabledWords = 0 }, { .wordData = {.valueList = sEasyChatGroup_Pokemon2}, .numWords = 251, .numEnabledWords = 251 }, }; ================================================ FILE: src/data/easy_chat/easy_chat_words_by_letter.h ================================================ #include "easy_chat.h" #include "constants/easy_chat.h" static const u16 sEasyChatWordsByLetter_Others[] = { EC_WORD_EXCL, EC_WORD_EXCL_EXCL, EC_WORD_DASH, EC_WORD_DASH_DASH_DASH, EC_WORD_ELLIPSIS, EC_WORD_ELLIPSIS_EXCL, EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, EC_WORD_1_HIT_KO_EXCL, EC_WORD_QUES, EC_WORD_QUES_EXCL, }; static const u16 sEasyChatWordsByLetter_A[] = { EC_WORD_A, EC_WORD_A_LITTLE, EC_WORD_A_LOT, EC_WORD_A_TINY_BIT, EC_WORD_ABOUT, EC_WORD_ABOVE, -1, 2, // Doubled pokemon species name EC_POKEMON2(ABRA), EC_POKEMON(ABRA), EC_WORD_ABSENT, EC_POKEMON2(ABSOL), EC_WORD_ABSOLUTELY, EC_MOVE(ABSORB), EC_WORD_ACCEPT, EC_MOVE2(ACID), EC_MOVE2(ACID_ARMOR), EC_WORD_ADORE, EC_WORD_ADULT, EC_WORD_ADVENTURE, EC_MOVE2(AERIAL_ACE), EC_MOVE(AEROBLAST), EC_POKEMON(AERODACTYL), EC_WORD_AFTER, EC_WORD_AGE, EC_POKEMON2(AGGRON), EC_MOVE(AGILITY), EC_WORD_AGREE, EC_WORD_AHAHA, EC_WORD_AIM, EC_POKEMON(AIPOM), EC_MOVE(AIR_CUTTER), EC_WORD_AIR_LOCK, EC_WORD_AIYEEH, -1, 2, // Doubled pokemon species name EC_POKEMON2(ALAKAZAM), EC_POKEMON(ALAKAZAM), EC_WORD_ALL, EC_WORD_ALL_RIGHT, EC_WORD_ALLOW, EC_WORD_ALLOWANCE, EC_WORD_ALLY, EC_WORD_ALMOST, EC_WORD_ALONE, EC_WORD_ALSO, EC_WORD_ALT_COLOR, EC_POKEMON2(ALTARIA), EC_WORD_ALTHOUGH, EC_WORD_ALWAYS, EC_WORD_AM, EC_MOVE2(AMNESIA), EC_POKEMON(AMPHAROS), EC_WORD_AMUSING, EC_WORD_AN, EC_MOVE(ANCIENT_POWER), EC_WORD_AND, EC_WORD_ANGER, EC_WORD_ANGERS, EC_WORD_ANGRY, EC_WORD_ANIME, EC_POKEMON2(ANORITH), EC_WORD_ANOTHER, EC_WORD_ANTICIPATION, EC_WORD_ANY, EC_WORD_ANYWHERE, EC_WORD_APOLOGIZE, EC_WORD_APPEAL, EC_WORD_APPEAR, EC_WORD_APPEARS, EC_WORD_APPRECIATE, EC_WORD_APPROVED, EC_POKEMON(ARBOK), EC_POKEMON(ARCANINE), EC_WORD_ARE, EC_WORD_AREN_T, EC_WORD_ARENA_TRAP, EC_POKEMON(ARIADOS), EC_MOVE2(ARM_THRUST), EC_POKEMON2(ARMALDO), EC_MOVE(AROMATHERAPY), EC_POKEMON2(ARON), EC_WORD_AROUND, EC_WORD_ARRGH, EC_POKEMON(ARTICUNO), EC_WORD_AS, EC_WORD_AS_IF, EC_WORD_AS_MUCH_AS, EC_MOVE2(ASSIST), EC_MOVE(ASTONISH), EC_WORD_AT, EC_WORD_ATTACK, EC_MOVE2(ATTRACT), EC_WORD_AUNT, EC_MOVE(AURORA_BEAM), EC_WORD_AVANT_GARDE, EC_WORD_AWAY, EC_WORD_AWESOME, EC_WORD_AWFUL, EC_WORD_AWFULLY, EC_WORD_AWW, -1, 2, // Doubled pokemon species name EC_POKEMON2(AZUMARILL), EC_POKEMON(AZUMARILL), EC_POKEMON2(AZURILL), }; static const u16 sEasyChatWordsByLetter_B[] = { EC_WORD_BABE, EC_WORD_BABY, EC_WORD_BACK, EC_WORD_BAD, EC_WORD_BADLY, EC_WORD_BAG, EC_POKEMON2(BAGON), EC_WORD_BALL, EC_POKEMON2(BALTOY), EC_POKEMON2(BANETTE), EC_WORD_BANG, EC_POKEMON2(BARBOACH), EC_MOVE2(BARRAGE), EC_MOVE2(BARRIER), EC_WORD_BATH, EC_MOVE2(BATON_PASS), EC_WORD_BATTLE, EC_WORD_BATTLE_ARMOR, EC_WORD_BATTLE_ROOM, EC_WORD_BATTLE_TOWER, EC_POKEMON(BAYLEEF), EC_WORD_BE, EC_WORD_BEAT, EC_MOVE2(BEAT_UP), EC_POKEMON2(BEAUTIFLY), EC_WORD_BEAUTIFUL, EC_WORD_BEAUTY, EC_WORD_BECOMES, EC_POKEMON(BEEDRILL), EC_WORD_BEEN, EC_WORD_BEFORE, EC_WORD_BEGINNING, EC_WORD_BEING, EC_POKEMON2(BELDUM), EC_WORD_BELIEVE, -1, 2, // Doubled pokemon species name EC_POKEMON2(BELLOSSOM), EC_POKEMON(BELLOSSOM), EC_POKEMON(BELLSPROUT), EC_MOVE2(BELLY_DRUM), EC_WORD_BELONGS_TO, EC_WORD_BELOW, EC_WORD_BERRY, EC_WORD_BESIDE, EC_WORD_BEST, EC_WORD_BETTER, EC_MOVE(BIDE), EC_WORD_BIG, EC_WORD_BIKE, EC_MOVE(BIND), EC_MOVE(BITE), EC_MOVE2(BLAST_BURN), EC_POKEMON(BLASTOISE), EC_WORD_BLAZE, EC_MOVE2(BLAZE_KICK), EC_POKEMON2(BLAZIKEN), EC_WORD_BLEND, EC_POKEMON(BLISSEY), EC_MOVE2(BLIZZARD), EC_MOVE2(BLOCK), EC_WORD_BOARD, EC_MOVE2(BODY_SLAM), EC_MOVE2(BONE_CLUB), EC_MOVE2(BONE_RUSH), EC_MOVE2(BONEMERANG), EC_WORD_BOOK, EC_WORD_BORED, EC_WORD_BORING, EC_MOVE2(BOUNCE), EC_WORD_BOY, EC_WORD_BRAG, EC_WORD_BREAK, EC_POKEMON2(BRELOOM), EC_MOVE(BRICK_BREAK), EC_WORD_BROTHER, EC_MOVE(BUBBLE), EC_MOVE2(BUBBLE_BEAM), EC_WORD_BUG, EC_POKEMON(BULBASAUR), EC_MOVE2(BULK_UP), EC_MOVE2(BULLET_SEED), EC_WORD_BUSY, EC_WORD_BUT, EC_POKEMON(BUTTERFREE), EC_WORD_BYE_BYE, }; static const u16 sEasyChatWordsByLetter_C[] = { EC_POKEMON2(CACNEA), EC_POKEMON2(CACTURNE), EC_MOVE2(CALM_MIND), EC_WORD_CAME, EC_WORD_CAMERA, EC_POKEMON2(CAMERUPT), EC_MOVE2(CAMOUFLAGE), EC_WORD_CAN, EC_WORD_CAN_WIN, EC_WORD_CAN_T, EC_WORD_CAN_T_WIN, EC_WORD_CANCEL, EC_WORD_CAPABLE, EC_WORD_CARDS, EC_WORD_CARE, EC_WORD_CARES, EC_POKEMON2(CARVANHA), EC_POKEMON2(CASCOON), EC_WORD_CASE, EC_POKEMON2(CASTFORM), EC_POKEMON(CATERPIE), EC_WORD_CAUSE, EC_POKEMON(CELEBI), EC_WORD_CENTER, EC_WORD_CHALLENGE, EC_WORD_CHANGE, EC_WORD_CHANNEL, EC_POKEMON(CHANSEY), EC_MOVE(CHARGE), EC_POKEMON(CHARIZARD), EC_MOVE(CHARM), EC_POKEMON(CHARMANDER), EC_POKEMON(CHARMELEON), EC_WORD_CHAT, EC_POKEMON(CHIKORITA), EC_WORD_CHILD_S_PLAY, EC_WORD_CHILDREN, EC_POKEMON2(CHIMECHO), -1, 2, // Doubled pokemon species name EC_POKEMON2(CHINCHOU), EC_POKEMON(CHINCHOU), EC_WORD_CHLOROPHYLL, EC_WORD_CHOICE, EC_WORD_CHOOSE, EC_WORD_CHORES, EC_MOVE(CLAMP), EC_POKEMON2(CLAMPERL), EC_WORD_CLASS, EC_POKEMON2(CLAYDOL), EC_WORD_CLEAR_BODY, EC_POKEMON(CLEFABLE), EC_POKEMON(CLEFAIRY), EC_POKEMON(CLEFFA), EC_WORD_CLOSE, EC_WORD_CLOUD_NINE, EC_POKEMON(CLOYSTER), EC_WORD_COLD, EC_WORD_COLLECT, EC_WORD_COLLECTION, EC_WORD_COLOR, EC_WORD_COLOR_CHANGE, EC_POKEMON2(COMBUSKEN), EC_WORD_COME, EC_WORD_COME_ON, EC_WORD_COME_OVER, EC_MOVE2(COMET_PUNCH), EC_WORD_COMICS, EC_WORD_COMMEMORATE, EC_WORD_COMPLETE, EC_WORD_COMPOUNDEYES, EC_WORD_CONCEDE, EC_MOVE(CONFUSE_RAY), EC_WORD_CONFUSED, EC_MOVE2(CONFUSION), EC_WORD_CONGRATS, EC_MOVE(CONSTRICT), EC_WORD_CONTEST, EC_WORD_CONVERSATION, EC_MOVE2(CONVERSION), EC_MOVE2(CONVERSION_2), EC_WORD_COOL, EC_WORD_COOLNESS, EC_POKEMON2(CORPHISH), EC_WORD_CORRECT, -1, 2, // Doubled pokemon species name EC_POKEMON2(CORSOLA), EC_POKEMON(CORSOLA), EC_MOVE(COSMIC_POWER), EC_MOVE2(COTTON_SPORE), EC_WORD_COULD, EC_WORD_COULDN_T, EC_WORD_COUNT_ON, EC_MOVE(COUNTER), EC_WORD_COUPLE, EC_MOVE2(COVET), EC_MOVE(CRABHAMMER), EC_POKEMON2(CRADILY), EC_POKEMON2(CRAWDAUNT), EC_WORD_CRIES, -1, 2, // Doubled pokemon species name EC_POKEMON2(CROBAT), EC_POKEMON(CROBAT), EC_POKEMON(CROCONAW), EC_MOVE(CROSS_CHOP), EC_MOVE(CRUNCH), EC_WORD_CRUSH, EC_MOVE2(CRUSH_CLAW), EC_WORD_CRY, EC_POKEMON(CUBONE), EC_WORD_CURRENT, EC_MOVE2(CURSE), EC_MOVE(CUT), EC_WORD_CUTE, EC_WORD_CUTE_CHARM, EC_WORD_CUTENESS, EC_POKEMON(CYNDAQUIL), }; static const u16 sEasyChatWordsByLetter_D[] = { EC_WORD_DAILY, EC_WORD_DAMP, EC_WORD_DANCE, EC_WORD_DANGER, EC_WORD_DARK, EC_WORD_DARN, EC_WORD_DATE, EC_WORD_DAUGHTER, EC_WORD_DAY, EC_WORD_DAYS, EC_WORD_DAYTIME, EC_WORD_DECIDE, EC_WORD_DECIDED, EC_WORD_DEEP, EC_WORD_DEFEATED, EC_MOVE2(DEFENSE_CURL), EC_POKEMON2(DELCATTY), EC_POKEMON(DELIBIRD), EC_POKEMON2(DEOXYS), EC_WORD_DEPT_STORE, EC_WORD_DESIGN, EC_WORD_DESTINY, EC_MOVE2(DESTINY_BOND), EC_WORD_DESTROYED, EC_MOVE2(DETECT), EC_POKEMON(DEWGONG), EC_WORD_DID, EC_WORD_DIDN_T, EC_WORD_DIET, EC_WORD_DIFFERENT, EC_MOVE(DIG), EC_WORD_DIGITAL, EC_POKEMON(DIGLETT), EC_WORD_DIRECT, EC_MOVE(DISABLE), EC_WORD_DISAPPEAR, EC_WORD_DISAPPOINT, EC_WORD_DISAPPOINTED, EC_WORD_DISAPPOINTS, EC_WORD_DISASTER, EC_WORD_DISLIKE, EC_WORD_DISLIKES, EC_POKEMON(DITTO), EC_MOVE2(DIVE), EC_MOVE2(DIZZY_PUNCH), EC_WORD_DO, EC_WORD_DOCILE, -1, 2, // Doubled pokemon species name EC_POKEMON2(DODRIO), EC_POKEMON(DODRIO), -1, 2, // Doubled pokemon species name EC_POKEMON2(DODUO), EC_POKEMON(DODUO), EC_WORD_DOES, EC_WORD_DOESN_T, EC_WORD_DON_T, EC_WORD_DONE, -1, 2, // Doubled pokemon species name EC_POKEMON2(DONPHAN), EC_POKEMON(DONPHAN), EC_MOVE2(DOOM_DESIRE), EC_MOVE2(DOUBLE_KICK), EC_MOVE(DOUBLE_TEAM), EC_MOVE(DOUBLE_EDGE), EC_MOVE(DOUBLE_SLAP), EC_WORD_DOWN, EC_WORD_DOWNCAST, EC_WORD_DRAGON, EC_MOVE2(DRAGON_CLAW), EC_MOVE2(DRAGON_DANCE), EC_MOVE2(DRAGON_RAGE), EC_POKEMON(DRAGONAIR), EC_MOVE2(DRAGON_BREATH), EC_POKEMON(DRAGONITE), EC_POKEMON(DRATINI), EC_WORD_DREAM, EC_MOVE2(DREAM_EATER), EC_MOVE2(DRILL_PECK), EC_WORD_DRINK, EC_WORD_DRINKS, EC_WORD_DRIZZLE, EC_WORD_DROOLING, EC_WORD_DROUGHT, EC_POKEMON(DROWZEE), EC_WORD_DUDE, EC_POKEMON(DUGTRIO), EC_POKEMON(DUNSPARCE), EC_POKEMON2(DUSCLOPS), EC_POKEMON2(DUSKULL), EC_POKEMON2(DUSTOX), EC_MOVE2(DYNAMIC_PUNCH), }; static const u16 sEasyChatWordsByLetter_E[] = { EC_WORD_EARLIER, EC_WORD_EARLY_BIRD, EC_MOVE(EARTHQUAKE), EC_WORD_EASY, EC_WORD_EAT, EC_WORD_EATS, EC_WORD_EEK, EC_POKEMON(EEVEE), EC_WORD_EFFECT_SPORE, EC_WORD_EGG, EC_MOVE2(EGG_BOMB), EC_WORD_EH_QUES, EC_WORD_EHEHE, EC_POKEMON(EKANS), EC_POKEMON(ELECTABUZZ), EC_WORD_ELECTRIC, EC_POKEMON2(ELECTRIKE), -1, 2, // Doubled pokemon species name EC_POKEMON2(ELECTRODE), EC_POKEMON(ELECTRODE), EC_POKEMON(ELEKID), EC_WORD_ELSE, EC_MOVE2(EMBER), EC_MOVE(ENCORE), EC_WORD_ENCYCLOPEDIA, EC_WORD_END, EC_MOVE(ENDEAVOR), EC_MOVE(ENDURE), EC_WORD_ENJOY, EC_WORD_ENJOYS, EC_WORD_ENOUGH, EC_POKEMON(ENTEI), EC_WORD_ENTERTAINING, EC_MOVE2(ERUPTION), EC_WORD_ESCAPE, EC_POKEMON(ESPEON), EC_WORD_EVEN_SO, EC_WORD_EVENT, EC_WORD_EVENTS, EC_WORD_EVER, EC_WORD_EVERY, EC_WORD_EVOLUTION, EC_WORD_EVOLVE, EC_WORD_EXCELLENT, EC_WORD_EXCESS, EC_WORD_EXCITE, EC_WORD_EXCITING, EC_WORD_EXCUSE, EC_WORD_EXCUSE_ME, EC_POKEMON(EXEGGCUTE), EC_POKEMON(EXEGGUTOR), EC_WORD_EXISTS, EC_WORD_EXPENSIVE, EC_MOVE2(EXPLOSION), EC_POKEMON2(EXPLOUD), EC_MOVE(EXTRASENSORY), EC_MOVE(EXTREME_SPEED), }; static const u16 sEasyChatWordsByLetter_F[] = { EC_WORD_FABULOUS, EC_MOVE(FACADE), EC_WORD_FAINT, EC_MOVE2(FAINT_ATTACK), EC_WORD_FAINTED, EC_MOVE2(FAKE_OUT), EC_MOVE(FAKE_TEARS), EC_WORD_FALL, EC_MOVE2(FALSE_SWIPE), EC_WORD_FAMILY, EC_WORD_FANTASTIC, EC_WORD_FAR, EC_POKEMON(FARFETCHD), EC_WORD_FASHION, EC_WORD_FAST, EC_WORD_FATHER, EC_WORD_FEAR, EC_POKEMON(FEAROW), EC_MOVE2(FEATHER_DANCE), EC_POKEMON2(FEEBAS), EC_WORD_FEELING, EC_POKEMON(FERALIGATR), EC_WORD_FESTIVAL, EC_WORD_FEVER, EC_WORD_FIERY, EC_WORD_FIGHT, EC_WORD_FIGHTING, EC_WORD_FIGHTS, EC_WORD_FINAL, EC_WORD_FINALLY, EC_WORD_FINISH, EC_WORD_FIRE, EC_MOVE2(FIRE_BLAST), EC_MOVE2(FIRE_PUNCH), EC_MOVE2(FIRE_SPIN), EC_WORD_FISHING, EC_MOVE(FISSURE), EC_POKEMON(FLAAFFY), EC_MOVE(FLAIL), EC_WORD_FLAME, EC_WORD_FLAME_BODY, EC_MOVE(FLAME_WHEEL), EC_MOVE(FLAMETHROWER), EC_POKEMON(FLAREON), EC_MOVE2(FLASH), EC_WORD_FLASH_FIRE, EC_WORD_FLATTEN, EC_MOVE(FLATTER), EC_WORD_FLOWERS, EC_MOVE(FLY), EC_POKEMON2(FLYGON), EC_WORD_FLYING, EC_MOVE(FOCUS_ENERGY), EC_MOVE(FOCUS_PUNCH), EC_WORD_FOE, EC_MOVE(FOLLOW_ME), EC_WORD_FOR, EC_WORD_FOR_NOW, EC_WORD_FORECAST, EC_MOVE2(FORESIGHT), EC_WORD_FOREVER, EC_WORD_FORGET, EC_WORD_FORGETS, EC_WORD_FORGIVE, EC_POKEMON(FORRETRESS), EC_MOVE2(FRENZY_PLANT), EC_WORD_FRIDAY, EC_WORD_FRIEND, EC_WORD_FROM, EC_WORD_FRONT, EC_MOVE2(FRUSTRATION), EC_WORD_FUFUFU, EC_WORD_FULL, EC_WORD_FUNNY, EC_POKEMON(FURRET), EC_MOVE2(FURY_ATTACK), EC_MOVE2(FURY_CUTTER), EC_MOVE2(FURY_SWIPES), EC_MOVE2(FUTURE_SIGHT), }; static const u16 sEasyChatWordsByLetter_G[] = { EC_WORD_GAME, EC_POKEMON2(GARDEVOIR), EC_POKEMON(GASTLY), EC_POKEMON(GENGAR), EC_WORD_GENIUS, -1, 2, // Doubled pokemon species name EC_POKEMON2(GEODUDE), EC_POKEMON(GEODUDE), EC_WORD_GET, EC_WORD_GETS, EC_WORD_GHOST, EC_WORD_GIDDY, EC_MOVE(GIGA_DRAIN), EC_WORD_GIGGLE, EC_WORD_GIMME, -1, 2, // Doubled pokemon species name EC_POKEMON2(GIRAFARIG), EC_POKEMON(GIRAFARIG), EC_WORD_GIRL, EC_WORD_GIVE, EC_WORD_GIVE_ME, EC_WORD_GIVE_UP, EC_WORD_GIVES, EC_POKEMON2(GLALIE), EC_MOVE2(GLARE), EC_POKEMON(GLIGAR), -1, 2, // Doubled pokemon species name EC_POKEMON2(GLOOM), EC_POKEMON(GLOOM), EC_WORD_GO, EC_WORD_GO_AHEAD, EC_WORD_GO_EASY, EC_WORD_GO_HOME, EC_WORD_GOES, EC_WORD_GOING, -1, 2, // Doubled pokemon species name EC_POKEMON2(GOLBAT), EC_POKEMON(GOLBAT), EC_WORD_GOLD, -1, 2, // Doubled pokemon species name EC_POKEMON2(GOLDEEN), EC_POKEMON(GOLDEEN), -1, 2, // Doubled pokemon species name EC_POKEMON2(GOLDUCK), EC_POKEMON(GOLDUCK), -1, 2, // Doubled pokemon species name EC_POKEMON2(GOLEM), EC_POKEMON(GOLEM), EC_WORD_GOOD, EC_WORD_GOOD_BYE, EC_POKEMON2(GOREBYSS), EC_WORD_GOT, EC_WORD_GOTCHA, EC_WORD_GOURMET, EC_WORD_GRAAAH, EC_POKEMON(GRANBULL), EC_WORD_GRANDFATHER, EC_WORD_GRANDMOTHER, EC_WORD_GRASS, EC_MOVE(GRASS_WHISTLE), -1, 2, // Doubled pokemon species name EC_POKEMON2(GRAVELER), EC_POKEMON(GRAVELER), EC_WORD_GREAT, EC_WORD_GREEN, -1, 2, // Doubled pokemon species name EC_POKEMON2(GRIMER), EC_POKEMON(GRIMER), EC_POKEMON2(GROUDON), EC_WORD_GROUND, EC_WORD_GROUP, EC_POKEMON2(GROVYLE), EC_MOVE2(GROWL), EC_POKEMON(GROWLITHE), EC_MOVE(GROWTH), EC_MOVE(GRUDGE), EC_POKEMON2(GRUMPIG), EC_WORD_GUARD, EC_MOVE2(GUILLOTINE), EC_POKEMON2(GULPIN), EC_MOVE(GUST), EC_WORD_GUTS, EC_WORD_GUTSY, EC_WORD_GWAH, EC_WORD_GWAHAHAHA, -1, 2, // Doubled pokemon species name EC_POKEMON2(GYARADOS), EC_POKEMON(GYARADOS), }; static const u16 sEasyChatWordsByLetter_H[] = { EC_WORD_HABIT, EC_WORD_HAH, EC_WORD_HAHAHA, EC_MOVE(HAIL), EC_WORD_HALL_OF_FAME, EC_WORD_HAPPENING, EC_WORD_HAPPILY, EC_WORD_HAPPINESS, EC_WORD_HAPPY, EC_WORD_HARD, EC_MOVE(HARDEN), EC_POKEMON2(HARIYAMA), EC_WORD_HAS, EC_WORD_HASSLE, EC_POKEMON(HAUNTER), EC_WORD_HAVE, EC_WORD_HAVEN_T, EC_MOVE(HAZE), EC_WORD_HE, EC_WORD_HE_S, EC_MOVE(HEADBUTT), EC_MOVE(HEAL_BELL), EC_WORD_HEALTHY, EC_WORD_HEAR, EC_WORD_HEARING, EC_WORD_HEARS, EC_WORD_HEART, EC_MOVE2(HEAT_WAVE), EC_WORD_HEH, EC_WORD_HEHE, EC_WORD_HEHEHE, EC_WORD_HELLO, EC_MOVE2(HELPING_HAND), EC_WORD_HER, -1, 2, // Doubled pokemon species name EC_POKEMON2(HERACROSS), EC_POKEMON(HERACROSS), EC_WORD_HERE, EC_WORD_HERE_GOES, EC_WORD_HERE_I_COME, EC_WORD_HERE_IT_IS, EC_WORD_HERO, EC_WORD_HEROINE, EC_WORD_HERS, EC_WORD_HEY, EC_WORD_HEY_THERE, EC_WORD_HEY_QUES, EC_WORD_HI, EC_MOVE2(HI_JUMP_KICK), EC_WORD_HIDDEN, EC_MOVE2(HIDDEN_POWER), EC_WORD_HIGH, EC_WORD_HIGHS, EC_WORD_HIM, EC_WORD_HIP_AND, EC_WORD_HIS, EC_WORD_HIT, EC_POKEMON(HITMONCHAN), EC_POKEMON(HITMONLEE), EC_POKEMON(HITMONTOP), EC_WORD_HIYAH, EC_WORD_HMM, EC_POKEMON(HO_OH), EC_WORD_HOBBY, EC_WORD_HOHOHO, EC_WORD_HOLIDAY, EC_WORD_HOME, EC_WORD_HOO_HAH, EC_POKEMON(HOOTHOOT), EC_WORD_HOPELESS, EC_POKEMON(HOPPIP), EC_MOVE2(HORN_ATTACK), EC_MOVE2(HORN_DRILL), -1, 2, // Doubled pokemon species name EC_POKEMON2(HORSEA), EC_POKEMON(HORSEA), EC_WORD_HOT, EC_POKEMON(HOUNDOOM), EC_POKEMON(HOUNDOUR), EC_WORD_HOW, EC_WORD_HOW_DO, EC_WORD_HOWEVER, EC_MOVE2(HOWL), EC_WORD_HUGE_POWER, EC_WORD_HUH_QUES, EC_WORD_HUMPH, EC_WORD_HUNGRY, EC_POKEMON2(HUNTAIL), EC_WORD_HURRIED, EC_WORD_HUSTLE, EC_MOVE2(HYDRO_CANNON), EC_MOVE2(HYDRO_PUMP), EC_WORD_HYPER, EC_MOVE2(HYPER_BEAM), EC_WORD_HYPER_CUTTER, EC_MOVE2(HYPER_FANG), EC_MOVE2(HYPER_VOICE), EC_POKEMON(HYPNO), EC_MOVE(HYPNOSIS), }; static const u16 sEasyChatWordsByLetter_I[] = { EC_WORD_I, EC_WORD_I_AM, EC_WORD_I_CHOOSE_YOU, EC_WORD_I_WAS, EC_WORD_I_VE, EC_WORD_I_VE_ARRIVED, EC_WORD_ICE, EC_MOVE(ICE_BALL), EC_MOVE2(ICE_BEAM), EC_MOVE2(ICE_PUNCH), EC_MOVE2(ICICLE_SPEAR), EC_MOVE(ICY_WIND), EC_WORD_IDOL, EC_WORD_IF, EC_WORD_IF_I_LOSE, EC_WORD_IF_I_WIN, -1, 2, // Doubled pokemon species name EC_POKEMON2(IGGLYBUFF), EC_POKEMON(IGGLYBUFF), EC_WORD_IGNORANT, EC_WORD_ILLUMINATE, EC_POKEMON2(ILLUMISE), EC_WORD_IMMUNITY, EC_WORD_IMPORTANT, EC_WORD_IMPOSSIBLE, EC_MOVE2(IMPRISON), EC_WORD_IN, EC_WORD_INCREASING, EC_WORD_INCREDIBLE, EC_WORD_INFORMATION, EC_MOVE2(INGRAIN), EC_WORD_INNER_FOCUS, EC_WORD_INSIDE, EC_WORD_INSOMNIA, EC_WORD_INSTEAD, EC_WORD_INTIMIDATE, EC_WORD_INVINCIBLE, EC_MOVE2(IRON_DEFENSE), EC_MOVE(IRON_TAIL), EC_WORD_IS, EC_WORD_IS_IT_QUES, EC_WORD_ISN_T, EC_WORD_ISN_T_IT_QUES, EC_WORD_IT, EC_WORD_IT_S, EC_WORD_ITEM, EC_POKEMON(IVYSAUR), }; static const u16 sEasyChatWordsByLetter_J[] = { -1, 2, // Doubled pokemon species name EC_POKEMON2(JIGGLYPUFF), EC_POKEMON(JIGGLYPUFF), EC_POKEMON2(JIRACHI), EC_WORD_JOKING, EC_POKEMON(JOLTEON), EC_WORD_JOY, EC_WORD_JUDGE, EC_MOVE2(JUMP_KICK), EC_POKEMON(JUMPLUFF), EC_WORD_JUST, EC_POKEMON(JYNX), }; static const u16 sEasyChatWordsByLetter_K[] = { EC_POKEMON(KABUTO), EC_POKEMON(KABUTOPS), -1, 2, // Doubled pokemon species name EC_POKEMON2(KADABRA), EC_POKEMON(KADABRA), EC_POKEMON(KAKUNA), EC_POKEMON(KANGASKHAN), EC_MOVE(KARATE_CHOP), EC_POKEMON2(KECLEON), EC_WORD_KEEN_EYE, EC_WORD_KID, EC_WORD_KIDDING, EC_WORD_KIND, EC_WORD_KINDERGARTEN, EC_MOVE(KINESIS), -1, 2, // Doubled pokemon species name EC_POKEMON2(KINGDRA), EC_POKEMON(KINGDRA), EC_POKEMON(KINGLER), EC_POKEMON2(KIRLIA), EC_MOVE2(KNOCK_OFF), EC_WORD_KNOCKOUT, EC_WORD_KNOW, EC_WORD_KNOWS, -1, 2, // Doubled pokemon species name EC_POKEMON2(KOFFING), EC_POKEMON(KOFFING), EC_POKEMON(KRABBY), EC_WORD_KTHX_BYE, EC_POKEMON2(KYOGRE), }; static const u16 sEasyChatWordsByLetter_L[] = { EC_WORD_LACKING, EC_WORD_LACKS, EC_WORD_LADY, EC_POKEMON2(LAIRON), EC_WORD_LALALA, -1, 2, // Doubled pokemon species name EC_POKEMON2(LANTURN), EC_POKEMON(LANTURN), EC_POKEMON(LAPRAS), EC_POKEMON(LARVITAR), EC_WORD_LAST, EC_WORD_LATE, EC_WORD_LATER, EC_POKEMON2(LATIAS), EC_POKEMON2(LATIOS), EC_WORD_LAVISH, EC_WORD_LAY, EC_WORD_LEADER, EC_WORD_LEADERS, EC_WORD_LEAF, EC_MOVE2(LEAF_BLADE), EC_WORD_LEARN, EC_POKEMON(LEDIAN), EC_POKEMON(LEDYBA), EC_MOVE(LEECH_LIFE), EC_MOVE2(LEECH_SEED), EC_MOVE2(LEER), EC_WORD_LEFT, EC_WORD_LEGEND, EC_WORD_LESS, EC_WORD_LESSONS, EC_WORD_LET_ME_WIN, EC_WORD_LET_S, EC_WORD_LETTER, EC_WORD_LEVEL, EC_WORD_LEVITATE, EC_MOVE(LICK), EC_POKEMON(LICKITUNG), EC_WORD_LIE, EC_WORD_LIFE, EC_MOVE2(LIGHT_SCREEN), EC_WORD_LIGHTNINGROD, EC_WORD_LIKE, EC_WORD_LIKELY_TO, EC_WORD_LIKES, EC_POKEMON2(LILEEP), EC_WORD_LIMBER, EC_WORD_LINK, EC_POKEMON2(LINOONE), EC_WORD_LIQUID_OOZE, EC_WORD_LISTEN, EC_WORD_LISTENING, EC_WORD_LISTENS, EC_WORD_LIVING, EC_MOVE2(LOCK_ON), EC_WORD_LOCOMOTIVE, EC_WORD_LOL, EC_WORD_LOLLING, EC_POKEMON2(LOMBRE), EC_WORD_LONESOME, EC_WORD_LOOK, EC_WORD_LOOKS, EC_WORD_LOSE, EC_WORD_LOSER, EC_WORD_LOSING, EC_WORD_LOSS, EC_WORD_LOST, EC_POKEMON2(LOTAD), EC_POKEMON2(LOUDRED), EC_WORD_LOUSY, EC_MOVE(LOVELY_KISS), EC_WORD_LOVEY_DOVEY, EC_WORD_LOW, EC_MOVE(LOW_KICK), EC_WORD_LOWS, EC_POKEMON2(LUDICOLO), EC_POKEMON(LUGIA), EC_WORD_LUKEWARM, EC_POKEMON2(LUNATONE), EC_MOVE2(LUSTER_PURGE), EC_POKEMON2(LUVDISC), }; static const u16 sEasyChatWordsByLetter_M[] = { EC_MOVE2(MACH_PUNCH), -1, 2, // Doubled pokemon species name EC_POKEMON2(MACHAMP), EC_POKEMON(MACHAMP), EC_WORD_MACHINE, -1, 2, // Doubled pokemon species name EC_POKEMON2(MACHOKE), EC_POKEMON(MACHOKE), -1, 2, // Doubled pokemon species name EC_POKEMON2(MACHOP), EC_POKEMON(MACHOP), EC_WORD_MAGAZINE, EC_POKEMON(MAGBY), -1, 2, // Doubled pokemon species name EC_POKEMON2(MAGCARGO), EC_POKEMON(MAGCARGO), EC_MOVE2(MAGIC_COAT), EC_MOVE2(MAGICAL_LEAF), -1, 2, // Doubled pokemon species name EC_POKEMON2(MAGIKARP), EC_POKEMON(MAGIKARP), EC_WORD_MAGMA_ARMOR, EC_POKEMON(MAGMAR), -1, 2, // Doubled pokemon species name EC_POKEMON2(MAGNEMITE), EC_POKEMON(MAGNEMITE), EC_WORD_MAGNET_PULL, -1, 2, // Doubled pokemon species name EC_POKEMON2(MAGNETON), EC_POKEMON(MAGNETON), EC_MOVE2(MAGNITUDE), EC_WORD_MAIL, EC_WORD_MAKE, EC_WORD_MAKING, EC_POKEMON2(MAKUHITA), EC_WORD_MAN, EC_POKEMON2(MANECTRIC), EC_POKEMON(MANKEY), EC_POKEMON(MANTINE), EC_POKEMON(MAREEP), -1, 2, // Doubled pokemon species name EC_POKEMON2(MARILL), EC_POKEMON(MARILL), EC_POKEMON(MAROWAK), EC_POKEMON2(MARSHTOMP), EC_WORD_MARVEL_SCALE, EC_POKEMON2(MASQUERAIN), EC_WORD_MASTER, EC_WORD_MATCH, EC_WORD_MATCH_UP, EC_POKEMON2(MAWILE), EC_WORD_MAYBE, EC_WORD_MC, EC_WORD_ME, EC_WORD_MEAN, EC_MOVE(MEAN_LOOK), EC_POKEMON2(MEDICHAM), EC_MOVE2(MEDITATE), EC_POKEMON2(MEDITITE), EC_WORD_MEET, EC_WORD_MEET_YOU, EC_WORD_MEETS, EC_WORD_MEGA, EC_MOVE2(MEGA_DRAIN), EC_MOVE2(MEGA_KICK), EC_MOVE2(MEGA_PUNCH), EC_MOVE2(MEGAHORN), EC_POKEMON(MEGANIUM), EC_MOVE(MEMENTO), EC_POKEMON(MEOWTH), EC_WORD_MESSAGE, EC_POKEMON2(METAGROSS), EC_MOVE2(METAL_CLAW), EC_MOVE(METAL_SOUND), EC_POKEMON2(METANG), EC_POKEMON(METAPOD), EC_MOVE(METEOR_MASH), EC_MOVE2(METRONOME), EC_POKEMON(MEW), EC_POKEMON(MEWTWO), EC_POKEMON2(MIGHTYENA), EC_MOVE2(MILK_DRINK), EC_POKEMON2(MILOTIC), EC_POKEMON(MILTANK), EC_MOVE2(MIMIC), EC_MOVE(MIND_READER), EC_MOVE2(MINIMIZE), EC_POKEMON2(MINUN), EC_WORD_MINUS, EC_MOVE2(MIRROR_COAT), EC_MOVE(MIRROR_MOVE), EC_POKEMON(MISDREAVUS), EC_WORD_MISHEARD, EC_WORD_MISS, EC_MOVE(MIST), EC_MOVE2(MIST_BALL), EC_WORD_MISTAKE, EC_WORD_MMM, EC_WORD_MODE, EC_WORD_MODERN, EC_POKEMON(MOLTRES), EC_WORD_MOMENTUM, EC_WORD_MONDAY, EC_WORD_MONEY, EC_WORD_MONTH, EC_WORD_MOOD, EC_MOVE2(MOONLIGHT), EC_WORD_MORE, EC_WORD_MORNING, EC_MOVE(MORNING_SUN), EC_WORD_MOTHER, EC_WORD_MOVE, EC_WORD_MOVIE, EC_WORD_MR, EC_POKEMON(MR_MIME), EC_WORD_MRS, EC_WORD_MUCH, EC_WORD_MUCH_OBLIGED, EC_MOVE2(MUD_SHOT), EC_MOVE2(MUD_SPORT), EC_MOVE2(MUD_SLAP), EC_MOVE2(MUDDY_WATER), EC_POKEMON2(MUDKIP), EC_WORD_MUFUFU, -1, 2, // Doubled pokemon species name EC_POKEMON2(MUK), EC_POKEMON(MUK), EC_POKEMON(MURKROW), EC_WORD_MUSIC, EC_WORD_MUST_BE, EC_WORD_MY, EC_WORD_MYSELF, EC_WORD_MYSTERY, }; static const u16 sEasyChatWordsByLetter_N[] = { EC_WORD_NAME, EC_WORD_NAP, -1, 2, // Doubled pokemon species name EC_POKEMON2(NATU), EC_POKEMON(NATU), EC_WORD_NATURAL, EC_WORD_NATURAL_CURE, EC_WORD_NATURALLY, EC_WORD_NATURE, EC_MOVE(NATURE_POWER), EC_WORD_NEAR, EC_WORD_NEARLY, EC_WORD_NEED, EC_MOVE2(NEEDLE_ARM), EC_WORD_NEGATIVE, EC_WORD_NEVER, EC_WORD_NEW, EC_WORD_NEWS, EC_WORD_NEXT, EC_WORD_NICE, EC_POKEMON(NIDOKING), EC_POKEMON(NIDOQUEEN), EC_POKEMON(NIDORAN_F), EC_POKEMON(NIDORAN_M), EC_POKEMON(NIDORINA), EC_POKEMON(NIDORINO), EC_WORD_NIGHT, EC_MOVE2(NIGHT_SHADE), EC_MOVE(NIGHTMARE), EC_WORD_NIGHTTIME, EC_POKEMON2(NINCADA), -1, 2, // Doubled pokemon species name EC_POKEMON2(NINETALES), EC_POKEMON(NINETALES), EC_POKEMON2(NINJASK), EC_WORD_NITWIT, EC_WORD_NO, EC_WORD_NO_MATCH, EC_WORD_NO_1, EC_POKEMON(NOCTOWL), EC_WORD_NOISY, EC_WORD_NON_STOP, EC_WORD_NONE, EC_WORD_NOPE, EC_WORD_NORMAL, EC_POKEMON2(NOSEPASS), EC_WORD_NOT, EC_WORD_NOT_VERY, EC_WORD_NOTHING, EC_WORD_NOW, EC_POKEMON2(NUMEL), EC_POKEMON2(NUZLEAF), }; static const u16 sEasyChatWordsByLetter_O[] = { EC_WORD_OBLIVIOUS, EC_MOVE(OCTAZOOKA), EC_POKEMON(OCTILLERY), -1, 2, // Doubled pokemon species name EC_POKEMON2(ODDISH), EC_POKEMON(ODDISH), EC_MOVE(ODOR_SLEUTH), EC_WORD_OF, EC_WORD_OFF, EC_WORD_OFFENSIVE, EC_WORD_OH, EC_WORD_OH_DEAR, EC_WORD_OH_YEAH, EC_WORD_OH_KAY, EC_WORD_OH_QUES, EC_WORD_OI, EC_WORD_OI_OI_OI, EC_WORD_OK_QUES, EC_WORD_OKAY, EC_WORD_OLD, EC_WORD_OLDEN, EC_POKEMON(OMANYTE), EC_POKEMON(OMASTAR), EC_WORD_ON, EC_WORD_ONCE, EC_POKEMON(ONIX), EC_WORD_ONLY, EC_WORD_OOPS, EC_WORD_OPPONENT, EC_WORD_OPPOSITE, EC_WORD_OR, EC_WORD_OTHER, EC_WORD_OUR, EC_WORD_OUT, EC_MOVE(OUTRAGE), EC_WORD_OUTSIDE, EC_WORD_OVER, EC_WORD_OVERDO, EC_WORD_OVERGROW, EC_MOVE(OVERHEAT), EC_WORD_OVERWHELMING, EC_WORD_OWN, EC_WORD_OWN_TEMPO, }; static const u16 sEasyChatWordsByLetter_P[] = { EC_MOVE(PAIN_SPLIT), EC_POKEMON(PARAS), EC_POKEMON(PARASECT), EC_WORD_PARDON, EC_WORD_PARENT, EC_WORD_PARTNER, EC_WORD_PARTY, EC_WORD_PATTERN, EC_MOVE2(PAY_DAY), EC_WORD_PC, EC_MOVE2(PECK), EC_POKEMON2(PELIPPER), EC_WORD_PERFECT, EC_WORD_PERFECTION, EC_MOVE2(PERISH_SONG), EC_POKEMON(PERSIAN), EC_WORD_PERSON, EC_MOVE2(PETAL_DANCE), -1, 2, // Doubled pokemon species name EC_POKEMON2(PHANPY), EC_POKEMON(PHANPY), EC_WORD_PHONE, -1, 2, // Doubled pokemon species name EC_POKEMON2(PICHU), EC_POKEMON(PICHU), EC_WORD_PICKUP, EC_POKEMON(PIDGEOT), EC_POKEMON(PIDGEOTTO), EC_POKEMON(PIDGEY), -1, 2, // Doubled pokemon species name EC_POKEMON2(PIKACHU), EC_POKEMON(PIKACHU), EC_POKEMON(PILOSWINE), EC_MOVE2(PIN_MISSILE), EC_POKEMON(PINECO), -1, 2, // Doubled pokemon species name EC_POKEMON2(PINSIR), EC_POKEMON(PINSIR), EC_WORD_PKRS, EC_WORD_PLACE, EC_WORD_PLANS, EC_WORD_PLAY, EC_WORD_PLAYED, EC_WORD_PLAYS, EC_WORD_PLEASE, EC_WORD_PLUS, EC_WORD_PLUSH_DOLL, EC_POKEMON2(PLUSLE), EC_WORD_POINTS, EC_WORD_POISON, EC_MOVE2(POISON_FANG), EC_MOVE2(POISON_GAS), EC_WORD_POISON_POINT, EC_MOVE2(POISON_STING), EC_MOVE2(POISON_TAIL), EC_MOVE2(POISON_POWDER), EC_WORD_POKEBLOCK, EC_WORD_POKEDEX, EC_WORD_POKEMON, EC_WORD_POKENAV, EC_POKEMON(POLITOED), EC_POKEMON(POLIWAG), EC_POKEMON(POLIWHIRL), EC_POKEMON(POLIWRATH), EC_POKEMON(PONYTA), EC_POKEMON2(POOCHYENA), EC_WORD_POPULAR, EC_POKEMON(PORYGON), EC_POKEMON(PORYGON2), EC_MOVE2(POUND), EC_MOVE(POWDER_SNOW), EC_WORD_POWER, EC_WORD_PRAISE, EC_WORD_PREPOSTEROUS, EC_MOVE2(PRESENT), EC_WORD_PRESSURE, EC_WORD_PRETEND, EC_WORD_PRETTY, EC_POKEMON(PRIMEAPE), EC_WORD_PROBABLY, EC_WORD_PROMISE, EC_MOVE2(PROTECT), EC_MOVE(PSYBEAM), EC_MOVE(PSYCH_UP), -1, 2, // Doubled pokemon species name EC_WORD_PSYCHIC, EC_MOVE(PSYCHIC), EC_MOVE(PSYCHO_BOOST), -1, 2, // Doubled pokemon species name EC_POKEMON2(PSYDUCK), EC_POKEMON(PSYDUCK), EC_MOVE(PSYWAVE), EC_POKEMON(PUPITAR), EC_WORD_PURE_POWER, EC_MOVE(PURSUIT), EC_WORD_PUSHOVER, }; static const u16 sEasyChatWordsByLetter_Q[] = { EC_POKEMON(QUAGSIRE), EC_WORD_QUESTION, EC_MOVE2(QUICK_ATTACK), EC_POKEMON(QUILAVA), EC_WORD_QUITE, EC_POKEMON(QWILFISH), }; static const u16 sEasyChatWordsByLetter_R[] = { EC_WORD_RADIO, EC_MOVE(RAGE), -1, 2, // Doubled pokemon species name EC_POKEMON2(RAICHU), EC_POKEMON(RAICHU), EC_POKEMON(RAIKOU), EC_MOVE(RAIN_DANCE), EC_WORD_RAIN_DISH, EC_POKEMON2(RALTS), EC_WORD_RANK, EC_MOVE(RAPID_SPIN), EC_POKEMON(RAPIDASH), EC_WORD_RARE, EC_WORD_RATHER, EC_POKEMON(RATICATE), EC_POKEMON(RATTATA), EC_POKEMON2(RAYQUAZA), EC_MOVE2(RAZOR_LEAF), EC_MOVE(RAZOR_WIND), EC_WORD_READY, EC_WORD_REALLY, EC_WORD_REAR, EC_WORD_RECEIVED, EC_WORD_RECOMMEND, EC_MOVE(RECOVER), EC_MOVE2(RECYCLE), EC_WORD_RED, EC_MOVE2(REFLECT), EC_MOVE2(REFRESH), EC_WORD_REFRESHING, EC_WORD_REFUSE, EC_POKEMON2(REGICE), EC_POKEMON2(REGIROCK), EC_POKEMON2(REGISTEEL), EC_WORD_REJECT, EC_WORD_RELEASE, EC_POKEMON2(RELICANTH), EC_POKEMON(REMORAID), EC_WORD_RENTAL, EC_MOVE2(REST), EC_WORD_RESUSCITATE, EC_MOVE(RETURN), EC_MOVE2(REVENGE), EC_MOVE(REVERSAL), -1, 2, // Doubled pokemon species name EC_POKEMON2(RHYDON), EC_POKEMON(RHYDON), -1, 2, // Doubled pokemon species name EC_POKEMON2(RHYHORN), EC_POKEMON(RHYHORN), EC_WORD_RIBBON, EC_WORD_RICKETY, EC_WORD_RIGHT, EC_WORD_RIPPED, EC_WORD_RIVAL, EC_MOVE2(ROAR), EC_WORD_ROCK, EC_MOVE2(ROCK_BLAST), EC_WORD_ROCK_HEAD, EC_MOVE(ROCK_SLIDE), EC_MOVE(ROCK_SMASH), EC_MOVE(ROCK_THROW), EC_MOVE(ROCK_TOMB), EC_WORD_ROCK_SOLID, EC_MOVE2(ROLE_PLAY), EC_MOVE2(ROLLING_KICK), EC_MOVE(ROLLOUT), EC_WORD_ROMANTIC, EC_WORD_ROOM, EC_POKEMON2(ROSELIA), EC_WORD_ROUGH_SKIN, EC_WORD_RPG, EC_WORD_RUBY, EC_WORD_RULE, EC_WORD_RUN, EC_WORD_RUN_AWAY, EC_WORD_RUNS, }; static const u16 sEasyChatWordsByLetter_S[] = { EC_POKEMON2(SABLEYE), EC_MOVE(SACRED_FIRE), EC_WORD_SAD, EC_WORD_SADLY, EC_MOVE(SAFEGUARD), EC_WORD_SAID, EC_POKEMON2(SALAMENCE), EC_WORD_SAND_STREAM, EC_MOVE(SAND_TOMB), EC_WORD_SAND_VEIL, EC_MOVE(SAND_ATTACK), -1, 2, // Doubled pokemon species name EC_POKEMON2(SANDSHREW), EC_POKEMON(SANDSHREW), -1, 2, // Doubled pokemon species name EC_POKEMON2(SANDSLASH), EC_POKEMON(SANDSLASH), EC_MOVE(SANDSTORM), EC_WORD_SAPPHIRE, EC_WORD_SATISFIED, EC_WORD_SATURDAY, EC_WORD_SAYS, EC_WORD_SCARY, EC_MOVE(SCARY_FACE), EC_WORD_SCATTER, EC_POKEMON2(SCEPTILE), EC_WORD_SCHOOL, EC_POKEMON(SCIZOR), EC_MOVE2(SCRATCH), EC_MOVE(SCREECH), EC_POKEMON(SCYTHER), -1, 2, // Doubled pokemon species name EC_POKEMON2(SEADRA), EC_POKEMON(SEADRA), -1, 2, // Doubled pokemon species name EC_POKEMON2(SEAKING), EC_POKEMON(SEAKING), EC_POKEMON2(SEALEO), EC_WORD_SEARCH, EC_WORD_SECRET, EC_WORD_SECRET_BASE, EC_MOVE2(SECRET_POWER), EC_WORD_SEE, EC_WORD_SEE_YA, EC_POKEMON2(SEEDOT), EC_WORD_SEEK, EC_POKEMON(SEEL), EC_WORD_SEEMS, EC_WORD_SEES, EC_MOVE2(SEISMIC_TOSS), EC_MOVE(SELF_DESTRUCT), EC_WORD_SENSE, EC_POKEMON(SENTRET), EC_WORD_SERENE_GRACE, EC_WORD_SERIOUS, EC_WORD_SERIOUSLY, EC_WORD_SERVICE, EC_POKEMON2(SEVIPER), EC_MOVE(SHADOW_BALL), EC_MOVE(SHADOW_PUNCH), EC_WORD_SHADOW_TAG, EC_WORD_SHADY, EC_WORD_SHAKE, EC_WORD_SHAKY, EC_WORD_SHALLOW, EC_POKEMON2(SHARPEDO), EC_MOVE(SHARPEN), EC_WORD_SHE, EC_WORD_SHE_IS, EC_WORD_SHE_WAS, EC_WORD_SHED_SKIN, EC_POKEMON2(SHEDINJA), EC_MOVE(SHEER_COLD), EC_POKEMON2(SHELGON), EC_WORD_SHELL_ARMOR, EC_POKEMON(SHELLDER), EC_WORD_SHIELD_DUST, EC_POKEMON2(SHIFTRY), EC_WORD_SHINE, EC_MOVE2(SHOCK_WAVE), EC_WORD_SHOCKED, EC_WORD_SHOPPING, EC_WORD_SHOULD, EC_WORD_SHOW, EC_WORD_SHREDDED, EC_POKEMON2(SHROOMISH), EC_POKEMON(SHUCKLE), EC_POKEMON2(SHUPPET), EC_WORD_SIBLINGS, EC_WORD_SIGH, EC_MOVE(SIGNAL_BEAM), EC_POKEMON2(SILCOON), EC_WORD_SILKY, EC_WORD_SILVER, EC_MOVE(SILVER_WIND), EC_WORD_SIMPLE, EC_WORD_SINCE, EC_MOVE(SING), EC_WORD_SINK, EC_WORD_SISTER, -1, 2, // Doubled pokemon species name EC_POKEMON2(SKARMORY), EC_POKEMON(SKARMORY), EC_MOVE(SKETCH), EC_WORD_SKILL, EC_MOVE(SKILL_SWAP), EC_WORD_SKILLED, EC_POKEMON(SKIPLOOM), EC_POKEMON2(SKITTY), EC_MOVE2(SKULL_BASH), EC_MOVE(SKY_ATTACK), EC_MOVE(SKY_UPPERCUT), EC_MOVE2(SLACK_OFF), EC_POKEMON2(SLAKING), EC_POKEMON2(SLAKOTH), EC_MOVE2(SLAM), EC_MOVE(SLASH), EC_WORD_SLEEP, EC_MOVE2(SLEEP_POWDER), EC_MOVE2(SLEEP_TALK), EC_WORD_SLEPT, EC_WORD_SLIDE, EC_WORD_SLIMY, EC_POKEMON(SLOWBRO), EC_POKEMON(SLOWKING), EC_POKEMON(SLOWPOKE), EC_MOVE2(SLUDGE), EC_MOVE2(SLUDGE_BOMB), -1, 2, // Doubled pokemon species name EC_POKEMON2(SLUGMA), EC_POKEMON(SLUGMA), EC_WORD_SMACK, EC_WORD_SMALL, EC_WORD_SMART, EC_WORD_SMARTNESS, EC_POKEMON(SMEARGLE), EC_WORD_SMELL, EC_WORD_SMELL_YA, EC_MOVE(SMELLING_SALT), EC_WORD_SMITE, EC_MOVE(SMOG), EC_MOVE(SMOKESCREEN), EC_POKEMON(SMOOCHUM), EC_WORD_SMOOTH, EC_MOVE2(SNATCH), EC_POKEMON(SNEASEL), EC_MOVE(SNORE), EC_POKEMON(SNORLAX), EC_WORD_SNORT, EC_POKEMON2(SNORUNT), EC_POKEMON(SNUBBULL), EC_WORD_SO, EC_MOVE2(SOFT_BOILED), EC_WORD_SOFTWARE, EC_MOVE(SOLAR_BEAM), EC_POKEMON2(SOLROCK), EC_WORD_SOME, EC_WORD_SOMEHOW, EC_WORD_SOMEONE, EC_WORD_SOMETHING, EC_WORD_SOMETIME, EC_WORD_SON, EC_WORD_SONG, EC_WORD_SONGS, EC_MOVE(SONIC_BOOM), EC_WORD_SOON, EC_WORD_SORRY, EC_WORD_SOUNDPROOF, EC_WORD_SP_ABILITY, EC_MOVE(SPARK), EC_POKEMON(SPEAROW), EC_WORD_SPECTATOR, EC_WORD_SPEED_BOOST, EC_POKEMON2(SPHEAL), EC_MOVE(SPIDER_WEB), EC_MOVE2(SPIKE_CANNON), EC_MOVE2(SPIKES), EC_POKEMON(SPINARAK), EC_POKEMON2(SPINDA), EC_WORD_SPIRALING, EC_WORD_SPIRIT, EC_MOVE2(SPIT_UP), EC_MOVE(SPITE), EC_MOVE2(SPLASH), EC_POKEMON2(SPOINK), EC_MOVE(SPORE), EC_WORD_SPORTS, EC_WORD_SPRING, EC_POKEMON(SQUIRTLE), EC_WORD_STAGE, EC_POKEMON(STANTLER), -1, 2, // Doubled pokemon species name EC_POKEMON2(STARMIE), EC_POKEMON(STARMIE), EC_WORD_START, -1, 2, // Doubled pokemon species name EC_POKEMON2(STARYU), EC_POKEMON(STARYU), EC_WORD_STATIC, EC_WORD_STAY_AT_HOME, EC_WORD_STEEL, EC_MOVE2(STEEL_WING), EC_POKEMON(STEELIX), EC_WORD_STENCH, EC_WORD_STICKY_HOLD, EC_MOVE2(STOCKPILE), EC_MOVE2(STOMP), EC_WORD_STOP, EC_WORD_STORE, EC_WORD_STORES, EC_WORD_STORY, EC_WORD_STRATEGY, EC_MOVE(STRENGTH), EC_MOVE(STRING_SHOT), EC_WORD_STRONG, EC_MOVE2(STRUGGLE), EC_WORD_STUDY, EC_MOVE(STUN_SPORE), EC_WORD_STURDY, EC_MOVE(SUBMISSION), EC_MOVE2(SUBSTITUTE), EC_WORD_SUCTION_CUPS, EC_POKEMON(SUDOWOODO), EC_POKEMON(SUICUNE), EC_WORD_SUMMER, EC_WORD_SUNDAY, EC_POKEMON(SUNFLORA), EC_POKEMON(SUNKERN), EC_MOVE2(SUNNY_DAY), EC_WORD_SUPER, EC_MOVE(SUPER_FANG), EC_MOVE2(SUPERPOWER), EC_MOVE2(SUPERSONIC), EC_MOVE2(SURF), EC_WORD_SURPRISE, EC_WORD_SURRENDER, EC_POKEMON2(SURSKIT), EC_POKEMON2(SWABLU), EC_MOVE(SWAGGER), EC_MOVE2(SWALLOW), EC_POKEMON2(SWALOT), EC_POKEMON2(SWAMPERT), EC_WORD_SWARM, EC_MOVE2(SWEET_KISS), EC_MOVE(SWEET_SCENT), EC_WORD_SWEETS, EC_POKEMON2(SWELLOW), EC_MOVE(SWIFT), EC_WORD_SWIFT_SWIM, EC_POKEMON(SWINUB), EC_MOVE2(SWORDS_DANCE), EC_WORD_SYNCHRONIZE, EC_MOVE(SYNTHESIS), EC_WORD_SYSTEM, }; static const u16 sEasyChatWordsByLetter_T[] = { EC_MOVE2(TACKLE), EC_MOVE2(TAIL_GLOW), EC_MOVE(TAIL_WHIP), EC_POKEMON2(TAILLOW), EC_WORD_TAKE, EC_MOVE2(TAKE_DOWN), EC_WORD_TAKE_THAT, EC_WORD_TALENT, EC_WORD_TALK, EC_WORD_TALKING, EC_POKEMON(TANGELA), EC_WORD_TASTY, EC_MOVE2(TAUNT), EC_POKEMON(TAUROS), EC_WORD_TCH, EC_WORD_TEACH, EC_WORD_TEACHER, EC_WORD_TEACHES, EC_POKEMON(TEDDIURSA), EC_MOVE2(TEETER_DANCE), EC_MOVE2(TELEPORT), EC_WORD_TELEVISION, -1, 2, // Doubled pokemon species name EC_POKEMON2(TENTACOOL), EC_POKEMON(TENTACOOL), -1, 2, // Doubled pokemon species name EC_POKEMON2(TENTACRUEL), EC_POKEMON(TENTACRUEL), EC_WORD_TERRIBLE, EC_WORD_TEST, EC_WORD_THAN, EC_WORD_THANK_YOU, EC_WORD_THANKS, EC_WORD_THAT, EC_WORD_THAT_WAS, EC_WORD_THAT_S, EC_WORD_THAT_S_IT_EXCL, EC_WORD_THE, EC_WORD_THEIR, EC_WORD_THERE, EC_WORD_THESE, EC_WORD_THESE_WERE, EC_WORD_THEY, EC_WORD_THEY_WERE, EC_WORD_THEY_RE, EC_WORD_THEY_VE, EC_WORD_THICK, EC_WORD_THICK_FAT, EC_MOVE2(THIEF), EC_WORD_THIN, EC_WORD_THING, EC_WORD_THINGS, EC_WORD_THINK, EC_WORD_THINKS, EC_WORD_THIRSTY, EC_WORD_THIS, EC_WORD_THIS_IS_IT_EXCL, EC_WORD_THOSE, EC_WORD_THOSE_ARE, EC_WORD_THOSE_WERE, EC_MOVE(THRASH), EC_WORD_THROW, EC_MOVE(THUNDER), EC_MOVE2(THUNDER_WAVE), EC_MOVE(THUNDERBOLT), EC_MOVE(THUNDER_PUNCH), EC_MOVE2(THUNDER_SHOCK), EC_WORD_THURSDAY, EC_MOVE(TICKLE), EC_WORD_TICKLISH, EC_WORD_TIGHT, EC_WORD_TIME, EC_WORD_TIMES, EC_WORD_TIRED, EC_WORD_TO, EC_WORD_TO_HER, EC_WORD_TO_ME, EC_WORD_TO_THEM, EC_WORD_TO_US, EC_WORD_TO_WHOM, EC_WORD_TODAY, EC_POKEMON(TOGEPI), EC_WORD_TOGETHER, EC_POKEMON(TOGETIC), EC_WORD_TOMORROW, EC_WORD_TOO, EC_WORD_TOO_LATE, EC_WORD_TOO_STRONG, EC_WORD_TOO_WEAK, EC_WORD_TOP, EC_POKEMON2(TORCHIC), EC_POKEMON2(TORKOAL), EC_MOVE(TORMENT), EC_WORD_TORRENT, EC_WORD_TOTALLY, EC_POKEMON(TOTODILE), EC_WORD_TOUGH, EC_WORD_TOUGHNESS, EC_WORD_TOURNAMENT, EC_WORD_TOWER, EC_MOVE2(TOXIC), EC_WORD_TOYS, EC_WORD_TRACE, EC_WORD_TRADE, EC_WORD_TRAIN, EC_WORD_TRAINER, EC_WORD_TRAINS, EC_MOVE2(TRANSFORM), EC_POKEMON2(TRAPINCH), EC_WORD_TRAVEL, EC_WORD_TREASURE, EC_POKEMON2(TREECKO), EC_WORD_TRENDY, EC_MOVE2(TRI_ATTACK), EC_MOVE2(TRICK), EC_WORD_TRIES, EC_MOVE2(TRIPLE_KICK), EC_POKEMON2(TROPIUS), EC_WORD_TRUANT, EC_WORD_TRULY, EC_WORD_TRUMP_CARD, EC_WORD_TRUST, EC_WORD_TRY, EC_WORD_TUESDAY, EC_MOVE2(TWINEEDLE), EC_WORD_TWIRLING, EC_MOVE2(TWISTER), EC_WORD_TYPE, EC_POKEMON(TYPHLOSION), EC_POKEMON(TYRANITAR), EC_POKEMON(TYROGUE), }; static const u16 sEasyChatWordsByLetter_U[] = { EC_WORD_UGLY, EC_WORD_UH_HUH, EC_WORD_UH_OH, EC_WORD_UM, EC_POKEMON(UMBREON), EC_WORD_UNAVOIDABLE, EC_WORD_UNBELIEVABLE, EC_WORD_UNCLE, EC_WORD_UNDERSTAND, EC_WORD_UNDERSTANDS, EC_WORD_UNDERSTOOD, EC_WORD_UNION, EC_POKEMON(UNOWN), EC_WORD_UNTIL, EC_WORD_UP, EC_WORD_UPBEAT, EC_MOVE(UPROAR), EC_WORD_UPSIDE_DOWN, EC_WORD_URGH, EC_POKEMON(URSARING), EC_WORD_USE, EC_WORD_USELESS, EC_WORD_USES, EC_WORD_USING, }; static const u16 sEasyChatWordsByLetter_V[] = { EC_WORD_VACATION, EC_POKEMON(VAPOREON), EC_POKEMON(VENOMOTH), EC_POKEMON(VENONAT), EC_POKEMON(VENUSAUR), EC_WORD_VERSION, EC_WORD_VERSUS, EC_WORD_VERY, EC_POKEMON2(VIBRAVA), EC_MOVE2(VICE_GRIP), EC_WORD_VICTORY, EC_POKEMON(VICTREEBEL), EC_WORD_VIEWING, EC_POKEMON2(VIGOROTH), -1, 2, // Doubled pokemon species name EC_POKEMON2(VILEPLUME), EC_POKEMON(VILEPLUME), EC_MOVE2(VINE_WHIP), EC_WORD_VITAL_SPIRIT, EC_MOVE(VITAL_THROW), EC_POKEMON2(VOLBEAT), EC_WORD_VOLT_ABSORB, EC_MOVE2(VOLT_TACKLE), -1, 2, // Doubled pokemon species name EC_POKEMON2(VOLTORB), EC_POKEMON(VOLTORB), EC_WORD_VORACIOUS, -1, 2, // Doubled pokemon species name EC_POKEMON2(VULPIX), EC_POKEMON(VULPIX), }; static const u16 sEasyChatWordsByLetter_W[] = { EC_WORD_WAAAH, EC_WORD_WAHAHAHA, EC_POKEMON2(WAILMER), EC_POKEMON2(WAILORD), EC_WORD_WAIT, EC_WORD_WAKE_UP, EC_WORD_WAKES_UP, EC_WORD_WALK, EC_WORD_WALKING, EC_WORD_WALKS, EC_POKEMON2(WALREIN), EC_WORD_WANDERING, EC_WORD_WANNABE, EC_WORD_WANT, EC_WORD_WANTS, EC_POKEMON(WARTORTLE), EC_WORD_WAS, EC_WORD_WASN_T, EC_WORD_WATER, EC_WORD_WATER_ABSORB, EC_MOVE2(WATER_GUN), EC_MOVE2(WATER_PULSE), EC_MOVE2(WATER_SPORT), EC_MOVE(WATER_SPOUT), EC_WORD_WATER_VEIL, EC_MOVE2(WATERFALL), EC_WORD_WAY, EC_WORD_WE, EC_WORD_WE_RE, EC_WORD_WE_VE, EC_WORD_WEAK, EC_WORD_WEAKENED, EC_MOVE(WEATHER_BALL), EC_WORD_WEDNESDAY, EC_POKEMON(WEEDLE), EC_WORD_WEEK, EC_POKEMON(WEEPINBELL), -1, 2, // Doubled pokemon species name EC_POKEMON2(WEEZING), EC_POKEMON(WEEZING), EC_WORD_WEIRD, EC_WORD_WELCOME, EC_WORD_WELL, EC_WORD_WELL_THEN, EC_WORD_WENT, EC_WORD_WERE, EC_WORD_WEREN_T, EC_WORD_WHAT, EC_WORD_WHAT_S_UP_QUES, EC_WORD_WHEN, EC_WORD_WHEN_I_WIN, EC_WORD_WHERE, EC_WORD_WHICH, EC_WORD_WHILE, EC_MOVE(WHIRLPOOL), EC_MOVE2(WHIRLWIND), EC_POKEMON2(WHISCASH), EC_POKEMON2(WHISMUR), EC_WORD_WHITE_SMOKE, EC_WORD_WHO, EC_WORD_WHO_IS, EC_WORD_WHO_WAS, EC_WORD_WHOAH, EC_WORD_WHOM, EC_WORD_WHOSE, EC_WORD_WHY, -1, 2, // Doubled pokemon species name EC_POKEMON2(WIGGLYTUFF), EC_POKEMON(WIGGLYTUFF), EC_WORD_WILD, EC_WORD_WILL, EC_WORD_WILL_BE_HERE, EC_MOVE(WILL_O_WISP), EC_WORD_WIMPY, EC_WORD_WIN, EC_MOVE2(WING_ATTACK), EC_POKEMON2(WINGULL), EC_WORD_WINNER, EC_WORD_WINS, EC_WORD_WINTER, EC_WORD_WIRELESS, EC_MOVE2(WISH), EC_WORD_WITH, EC_MOVE(WITHDRAW), EC_WORD_WITHOUT, EC_WORD_WOBBLY, -1, 2, // Doubled pokemon species name EC_POKEMON2(WOBBUFFET), EC_POKEMON(WOBBUFFET), EC_WORD_WOMAN, EC_WORD_WON, EC_WORD_WON_T, EC_WORD_WONDER, EC_WORD_WONDER_GUARD, EC_POKEMON(WOOPER), EC_WORD_WORD, EC_WORD_WORK, EC_WORD_WORKING, EC_WORD_WORKS, EC_WORD_WORLD, EC_WORD_WORRY, EC_WORD_WOULD, EC_WORD_WOW, EC_WORD_WOWEE, EC_MOVE2(WRAP), EC_WORD_WROOOAAR_EXCL, EC_POKEMON2(WURMPLE), EC_POKEMON2(WYNAUT), }; static const u16 sEasyChatWordsByLetter_X[] = { -1, 2, // Doubled pokemon species name EC_POKEMON2(XATU), EC_POKEMON(XATU), }; static const u16 sEasyChatWordsByLetter_Y[] = { EC_WORD_YAHOO, EC_POKEMON(YANMA), EC_MOVE(YAWN), EC_WORD_YAY, EC_WORD_YEAH, EC_WORD_YEAH_YEAH, EC_WORD_YEEHAW_EXCL, EC_WORD_YES, EC_WORD_YES_SIR_EXCL, EC_WORD_YESTERDAY, EC_WORD_YET, EC_WORD_YO, EC_WORD_YOU, EC_WORD_YOU_RE, EC_WORD_YOU_VE, EC_WORD_YOUNG, EC_WORD_YOUR, EC_WORD_YOURS, EC_WORD_YUP, }; static const u16 sEasyChatWordsByLetter_Z[] = { EC_POKEMON2(ZANGOOSE), EC_MOVE2(ZAP_CANNON), EC_POKEMON(ZAPDOS), EC_POKEMON2(ZIGZAGOON), -1, 2, // Doubled pokemon species name EC_POKEMON2(ZUBAT), EC_POKEMON(ZUBAT), }; static const struct EasyChatWordsByLetter sEasyChatWordsByLetterPointers[] = { { .words = sEasyChatWordsByLetter_Others, .numWords = 10, }, { .words = sEasyChatWordsByLetter_A, .numWords = 106, }, { .words = sEasyChatWordsByLetter_B, .numWords = 86, }, { .words = sEasyChatWordsByLetter_C, .numWords = 119, }, { .words = sEasyChatWordsByLetter_D, .numWords = 94, }, { .words = sEasyChatWordsByLetter_E, .numWords = 58, }, { .words = sEasyChatWordsByLetter_F, .numWords = 79, }, { .words = sEasyChatWordsByLetter_G, .numWords = 98, }, { .words = sEasyChatWordsByLetter_H, .numWords = 101, }, { .words = sEasyChatWordsByLetter_I, .numWords = 48, }, { .words = sEasyChatWordsByLetter_J, .numWords = 13, }, { .words = sEasyChatWordsByLetter_K, .numWords = 33, }, { .words = sEasyChatWordsByLetter_L, .numWords = 82, }, { .words = sEasyChatWordsByLetter_M, .numWords = 142, }, { .words = sEasyChatWordsByLetter_N, .numWords = 54, }, { .words = sEasyChatWordsByLetter_O, .numWords = 44, }, { .words = sEasyChatWordsByLetter_P, .numWords = 102, }, { .words = sEasyChatWordsByLetter_Q, .numWords = 6, }, { .words = sEasyChatWordsByLetter_R, .numWords = 80, }, { .words = sEasyChatWordsByLetter_S, .numWords = 262, }, { .words = sEasyChatWordsByLetter_T, .numWords = 133, }, { .words = sEasyChatWordsByLetter_U, .numWords = 24, }, { .words = sEasyChatWordsByLetter_V, .numWords = 33, }, { .words = sEasyChatWordsByLetter_W, .numWords = 111, }, { .words = sEasyChatWordsByLetter_X, .numWords = 4, }, { .words = sEasyChatWordsByLetter_Y, .numWords = 19, }, { .words = sEasyChatWordsByLetter_Z, .numWords = 8, }, }; ================================================ FILE: src/data/field_effects/field_effect_object_template_pointers.h ================================================ const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge; const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass; const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple; const struct SpriteTemplate gFieldEffectObjectTemplate_Ash; const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob; const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow; const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass; const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash; const struct SpriteTemplate gFieldEffectObjectTemplate_Splash; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash; const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass; const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass; const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2; const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand; const struct SpriteTemplate gFieldEffectObjectTemplate_WaterSurfacing; const struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion; const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints; /*const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle;*/ const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise; const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise; const struct SpriteTemplate gFieldEffectObjectTemplate_Bird; const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks; const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder; const struct SpriteTemplate gFieldEffectObjectTemplate_SandPile; const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass; const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater; const struct SpriteTemplate gFieldEffectObjectTemplate_AshPuff; const struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch; const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles; const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle; const struct SpriteTemplate gUnknown_TallGrass_OneIsland; const struct SpriteTemplate gUnknown_TallGrass_SevenIsland; const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall, [FLDEFFOBJ_SHADOW_M] = &gFieldEffectObjectTemplate_ShadowMedium, [FLDEFFOBJ_SHADOW_L] = &gFieldEffectObjectTemplate_ShadowLarge, [FLDEFFOBJ_SHADOW_XL] = &gFieldEffectObjectTemplate_ShadowExtraLarge, [FLDEFFOBJ_TALL_GRASS] = &gFieldEffectObjectTemplate_TallGrass, [FLDEFFOBJ_RIPPLE] = &gFieldEffectObjectTemplate_Ripple, [FLDEFFOBJ_ASH] = &gFieldEffectObjectTemplate_Ash, [FLDEFFOBJ_SURF_BLOB] = &gFieldEffectObjectTemplate_SurfBlob, [FLDEFFOBJ_ARROW] = &gFieldEffectObjectTemplate_Arrow, [FLDEFFOBJ_GROUND_IMPACT_DUST] = &gFieldEffectObjectTemplate_GroundImpactDust, [FLDEFFOBJ_JUMP_TALL_GRASS] = &gFieldEffectObjectTemplate_JumpTallGrass, [FLDEFFOBJ_SAND_FOOTPRINTS] = &gFieldEffectObjectTemplate_SandFootprints, [FLDEFFOBJ_JUMP_BIG_SPLASH] = &gFieldEffectObjectTemplate_JumpBigSplash, [FLDEFFOBJ_SPLASH] = &gFieldEffectObjectTemplate_Splash, [FLDEFFOBJ_JUMP_SMALL_SPLASH] = &gFieldEffectObjectTemplate_JumpSmallSplash, [FLDEFFOBJ_LONG_GRASS] = &gFieldEffectObjectTemplate_LongGrass, [FLDEFFOBJ_JUMP_LONG_GRASS] = &gFieldEffectObjectTemplate_JumpLongGrass, [FLDEFFOBJ_UNUSED_GRASS] = &gFieldEffectObjectTemplate_UnusedGrass, [FLDEFFOBJ_UNUSED_GRASS_2] = &gFieldEffectObjectTemplate_UnusedGrass2, [FLDEFFOBJ_UNUSED_SAND] = &gFieldEffectObjectTemplate_UnusedSand, [FLDEFFOBJ_WATER_SURFACING] = &gFieldEffectObjectTemplate_WaterSurfacing, [FLDEFFOBJ_REFLECTION_DISTORTION] = &gFieldEffectObjectTemplate_ReflectionDistortion, [FLDEFFOBJ_SPARKLE] = NULL, [FLDEFFOBJ_DEEP_SAND_FOOTPRINTS] = &gFieldEffectObjectTemplate_DeepSandFootprints, [FLDEFFOBJ_TREE_DISGUISE] = &gFieldEffectObjectTemplate_TreeDisguise, [FLDEFFOBJ_MOUNTAIN_DISGUISE] = &gFieldEffectObjectTemplate_MountainDisguise, [FLDEFFOBJ_BIRD] = &gFieldEffectObjectTemplate_Bird, [FLDEFFOBJ_BIKE_TIRE_TRACKS] = &gFieldEffectObjectTemplate_BikeTireTracks, [FLDEFFOBJ_SAND_DISGUISE] = &gFieldEffectObjectTemplate_SandDisguisePlaceholder, [FLDEFFOBJ_SAND_PILE] = &gFieldEffectObjectTemplate_SandPile, [FLDEFFOBJ_SHORT_GRASS] = &gFieldEffectObjectTemplate_ShortGrass, [FLDEFFOBJ_HOT_SPRINGS_WATER] = &gFieldEffectObjectTemplate_HotSpringsWater, [FLDEFFOBJ_ASH_PUFF] = &gFieldEffectObjectTemplate_AshPuff, [FLDEFFOBJ_ASH_LAUNCH] = &gFieldEffectObjectTemplate_AshLaunch, [FLDEFFOBJ_BUBBLES] = &gFieldEffectObjectTemplate_Bubbles, [FLDEFFOBJ_SMALL_SPARKLE] = &gFieldEffectObjectTemplate_SmallSparkle, [FLDEFFOBJ_SMALL_SPARKLE + 1] = &gUnknown_TallGrass_OneIsland, [FLDEFFOBJ_SMALL_SPARKLE + 2] = &gUnknown_TallGrass_SevenIsland, }; ================================================ FILE: src/data/field_effects/field_effect_objects.h ================================================ const struct SpritePalette gSpritePalette_GeneralFieldEffect0 = { .data = gFieldEffectObjectPalette0, .tag = FLDEFF_PAL_TAG_GENERAL_0 }; //sand footprints pal const struct SpritePalette gSpritePalette_GeneralFieldEffect1 = { .data = gFieldEffectObjectPalette1, .tag = FLDEFF_PAL_TAG_GENERAL_1 }; //tall grass pal const struct SpritePalette gBlackSandFootprintsPal = { .data = gBlackSandFootPrints_Pal, .tag = FLDEFF_PAL_TAG_GENERAL_0 }; const struct SpritePalette gThreeIslandGrassPal = { .data = gThreeIslandGrass_Pal, .tag = FLDEFF_PAL_TAG_GENERAL_1 }; const struct SpritePalette gSnowFootprintsPal = { .data = gSnowFootPrints_Pal, .tag = FLDEFF_PAL_TAG_GENERAL_0 }; static const union AnimCmd sAnim_Shadow[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_Shadow[] = { sAnim_Shadow, }; static const struct SpriteFrameImage sPicTable_ShadowSmall[] = {obj_frame_tiles(gFieldEffectObjectPic_ShadowSmall) }; static const struct SpriteFrameImage sPicTable_ShadowMedium[] = {obj_frame_tiles(gFieldEffectObjectPic_ShadowMedium) }; static const struct SpriteFrameImage sPicTable_ShadowLarge[] = {obj_frame_tiles(gFieldEffectObjectPic_ShadowLarge) }; static const struct SpriteFrameImage sPicTable_ShadowExtraLarge[] = { obj_frame_tiles(gFieldEffectObjectPic_ShadowExtraLarge) }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_8x8, .anims = sAnimTable_Shadow, .images = sPicTable_ShadowSmall, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateShadowFieldEffect, }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_16x8, .anims = sAnimTable_Shadow, .images = sPicTable_ShadowMedium, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateShadowFieldEffect, }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_32x8, .anims = sAnimTable_Shadow, .images = sPicTable_ShadowLarge, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateShadowFieldEffect, }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_64x32, .anims = sAnimTable_Shadow, .images = sPicTable_ShadowExtraLarge, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateShadowFieldEffect, }; static const struct SpriteFrameImage sPicTable_TallGrass[] = { overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 3), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 4), }; const struct SpriteFrameImage gSevenIsland_Grass_SpriteFrameImage[] = { overworld_frame(gSevenIsland_Grass, 2, 2, 0), overworld_frame(gSevenIsland_Grass, 2, 2, 1), overworld_frame(gSevenIsland_Grass, 2, 2, 2), overworld_frame(gSevenIsland_Grass, 2, 2, 3), overworld_frame(gSevenIsland_Grass, 2, 2, 4), }; const struct SpriteFrameImage gUnknown_83A53DC_OneIsland[] = //also Three Island { overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 5), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 5), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 6), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 7), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 8), }; const union AnimCmd sAnim_TallGrass[] = { ANIMCMD_FRAME(1, 10), ANIMCMD_FRAME(2, 10), ANIMCMD_FRAME(3, 10), ANIMCMD_FRAME(4, 10), ANIMCMD_FRAME(0, 10), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_TallGrass[] = { sAnim_TallGrass, }; const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_TallGrass, .images = sPicTable_TallGrass, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateTallGrassFieldEffect, }; const struct SpriteTemplate gUnknown_TallGrass_OneIsland = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_TallGrass, .images = gUnknown_83A53DC_OneIsland, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateTallGrassFieldEffect, }; const struct SpriteTemplate gUnknown_TallGrass_SevenIsland = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_TallGrass, .images = gSevenIsland_Grass_SpriteFrameImage, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateTallGrassFieldEffect, }; const struct SpriteFrameImage sPicTable_Ripple[] = { overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 3), overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 4), }; static const union AnimCmd sAnim_Ripple[] = { ANIMCMD_FRAME(0, 12), ANIMCMD_FRAME(1, 9), ANIMCMD_FRAME(2, 9), ANIMCMD_FRAME(3, 9), ANIMCMD_FRAME(0, 9), ANIMCMD_FRAME(1, 9), ANIMCMD_FRAME(2, 11), ANIMCMD_FRAME(4, 11), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_Ripple[] = { sAnim_Ripple, }; const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_Ripple, .images = sPicTable_Ripple, .affineAnims = gDummySpriteAffineAnimTable, .callback = WaitFieldEffectSpriteAnim, }; static const struct SpriteFrameImage sPicTable_Ash[] = { overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 3), overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 4), }; static const union AnimCmd sAnim_Ash[] = { ANIMCMD_FRAME(0, 12), ANIMCMD_FRAME(1, 12), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(3, 12), ANIMCMD_FRAME(4, 12), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_Ash[] = { sAnim_Ash, }; const struct SpriteTemplate gFieldEffectObjectTemplate_Ash = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_Ash, .images = sPicTable_Ash, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateAshFieldEffect, }; static const struct SpriteFrameImage sPicTable_SurfBlob[] = { overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 0), overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 1), overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 2), overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 3), overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 4), overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 5), }; static const union AnimCmd sSurfBlobAnim_FaceSouth[] = { ANIMCMD_FRAME(0, 48), ANIMCMD_FRAME(1, 48), ANIMCMD_JUMP(0), }; static const union AnimCmd sSurfBlobAnim_FaceNorth[] = { ANIMCMD_FRAME(2, 48), ANIMCMD_FRAME(3, 48), ANIMCMD_JUMP(0), }; static const union AnimCmd sSurfBlobAnim_FaceWest[] = { ANIMCMD_FRAME(4, 48), ANIMCMD_FRAME(5, 48), ANIMCMD_JUMP(0), }; static const union AnimCmd sSurfBlobAnim_FaceEast[] = { ANIMCMD_FRAME(4, 48, .hFlip = TRUE), ANIMCMD_FRAME(5, 48, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnimTable_SurfBlob[] = { [DIR_SOUTH - 1] = sSurfBlobAnim_FaceSouth, [DIR_NORTH - 1] = sSurfBlobAnim_FaceNorth, [DIR_WEST - 1] = sSurfBlobAnim_FaceWest, [DIR_EAST - 1] = sSurfBlobAnim_FaceEast, }; const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_32x32, .anims = sAnimTable_SurfBlob, .images = sPicTable_SurfBlob, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateSurfBlobFieldEffect, }; static const struct SpriteFrameImage sPicTable_Arrow[] = { overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 3), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 4), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 5), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 6), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 7), }; static const union AnimCmd sArrowAnim_South[] = { ANIMCMD_FRAME(2, 32), ANIMCMD_FRAME(3, 32), ANIMCMD_JUMP(0), }; static const union AnimCmd sArrowAnim_North[] = { ANIMCMD_FRAME(0, 32), ANIMCMD_FRAME(1, 32), ANIMCMD_JUMP(0), }; static const union AnimCmd sArrowAnim_West[] = { ANIMCMD_FRAME(4, 32), ANIMCMD_FRAME(5, 32), ANIMCMD_JUMP(0), }; static const union AnimCmd sArrowAnim_East[] = { ANIMCMD_FRAME(6, 32), ANIMCMD_FRAME(7, 32), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnimTable_Arrow[] = { [DIR_SOUTH - 1] = sArrowAnim_South, [DIR_NORTH - 1] = sArrowAnim_North, [DIR_WEST - 1] = sArrowAnim_West, [DIR_EAST - 1] = sArrowAnim_East, }; const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_Arrow, .images = sPicTable_Arrow, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct SpriteFrameImage sPicTable_GroundImpactDust[] = { overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 2), }; static const union AnimCmd sAnim_GroundImpactDust[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_GroundImpactDust[] = { sAnim_GroundImpactDust, }; const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, .anims = sAnimTable_GroundImpactDust, .images = sPicTable_GroundImpactDust, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateJumpImpactEffect, }; static const struct SpriteFrameImage sPicTable_JumpTallGrass[] = { overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 2), overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 3), }; static const union AnimCmd sAnim_JumpTallGrass[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(3, 8), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_JumpTallGrass[] = { sAnim_JumpTallGrass, }; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x8, .anims = sAnimTable_JumpTallGrass, .images = sPicTable_JumpTallGrass, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateJumpImpactEffect, }; static const struct SpriteFrameImage sPicTable_SandFootprints[] = { overworld_frame(gFieldEffectObjectPic_SandFootprints, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SandFootprints, 2, 2, 1), }; static const union AnimCmd sSandFootprintsAnim_South[] = { ANIMCMD_FRAME(0, 1, .vFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sSandFootprintsAnim_North[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sSandFootprintsAnim_West[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END, }; static const union AnimCmd sSandFootprintsAnim_East[] = { ANIMCMD_FRAME(1, 1, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_SandFootprints[] = { [DIR_NONE] = sSandFootprintsAnim_South, [DIR_SOUTH] = sSandFootprintsAnim_South, [DIR_NORTH] = sSandFootprintsAnim_North, [DIR_WEST] = sSandFootprintsAnim_West, [DIR_EAST] = sSandFootprintsAnim_East, }; const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_SandFootprints, .images = sPicTable_SandFootprints, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateFootprintsTireTracksFieldEffect, }; static const struct SpriteFrameImage sPicTable_DeepSandFootprints[] = { overworld_frame(gFieldEffectObjectPic_DeepSandFootprints, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_DeepSandFootprints, 2, 2, 1), }; static const union AnimCmd sDeepSandFootprintsAnim_South[] = { ANIMCMD_FRAME(0, 1, .vFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sDeepSandFootprintsAnim_North[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sDeepSandFootprintsAnim_West[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END, }; static const union AnimCmd sDeepSandFootprintsAnim_East[] = { ANIMCMD_FRAME(1, 1, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_DeepSandFootprints[] = { [DIR_NONE] = sDeepSandFootprintsAnim_South, [DIR_SOUTH] = sDeepSandFootprintsAnim_South, [DIR_NORTH] = sDeepSandFootprintsAnim_North, [DIR_WEST] = sDeepSandFootprintsAnim_West, [DIR_EAST] = sDeepSandFootprintsAnim_East, }; const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_DeepSandFootprints, .images = sPicTable_DeepSandFootprints, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateFootprintsTireTracksFieldEffect, }; static const struct SpriteFrameImage sPicTable_BikeTireTracks[] = { overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 3), }; static const union AnimCmd sBikeTireTracksAnim_South[] = { ANIMCMD_FRAME(2, 1), ANIMCMD_END, }; static const union AnimCmd sBikeTireTracksAnim_North[] = { ANIMCMD_FRAME(2, 1), ANIMCMD_END, }; static const union AnimCmd sBikeTireTracksAnim_West[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END, }; static const union AnimCmd sBikeTireTracksAnim_East[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END, }; static const union AnimCmd sBikeTireTracksAnim_SECornerTurn[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sBikeTireTracksAnim_SWCornerTurn[] = { ANIMCMD_FRAME(0, 1, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sBikeTireTracksAnim_NWCornerTurn[] = { ANIMCMD_FRAME(3, 1, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sBikeTireTracksAnim_NECornerTurn[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_BikeTireTracks[] = { [DIR_NONE] = sBikeTireTracksAnim_South, [DIR_SOUTH] = sBikeTireTracksAnim_South, [DIR_NORTH] = sBikeTireTracksAnim_North, [DIR_WEST] = sBikeTireTracksAnim_West, [DIR_EAST] = sBikeTireTracksAnim_East, [DIR_SOUTHWEST] = sBikeTireTracksAnim_SECornerTurn, [DIR_SOUTHEAST] = sBikeTireTracksAnim_SWCornerTurn, [DIR_NORTHWEST] = sBikeTireTracksAnim_NWCornerTurn, [DIR_NORTHEAST] = sBikeTireTracksAnim_NECornerTurn, }; const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_BikeTireTracks, .images = sPicTable_BikeTireTracks, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateFootprintsTireTracksFieldEffect, }; static const struct SpriteFrameImage sPicTable_JumpBigSplash[] = { overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 3), }; static const union AnimCmd sAnim_JumpBigSplash[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(3, 8), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_JumpBigSplash[] = { sAnim_JumpBigSplash, }; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_JumpBigSplash, .images = sPicTable_JumpBigSplash, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateJumpImpactEffect, }; static const struct SpriteFrameImage sPicTable_Splash[] = { overworld_frame(gFieldEffectObjectPic_Splash, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_Splash, 2, 1, 1), }; static const union AnimCmd sAnim_Splash_0[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_Splash_1[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(1, 6), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(1, 6), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnimTable_Splash[] = { sAnim_Splash_0, sAnim_Splash_1, }; const struct SpriteTemplate gFieldEffectObjectTemplate_Splash = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, .anims = sAnimTable_Splash, .images = sPicTable_Splash, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateSplashFieldEffect, }; static const struct SpriteFrameImage sPicTable_JumpSmallSplash[] = { overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 2), }; static const union AnimCmd sAnim_JumpSmallSplash[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_JumpSmallSplash[] = { sAnim_JumpSmallSplash, }; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, .anims = sAnimTable_JumpSmallSplash, .images = sPicTable_JumpSmallSplash, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateJumpImpactEffect, }; static const struct SpriteFrameImage sPicTable_LongGrass[] = { overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 3), }; static const union AnimCmd sAnim_LongGrass[] = { ANIMCMD_FRAME(1, 3), ANIMCMD_FRAME(2, 3), ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_LongGrass[] = { sAnim_LongGrass, }; const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_LongGrass, .images = sPicTable_LongGrass, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateLongGrassFieldEffect, }; static const struct SpriteFrameImage sPicTable_JumpLongGrass[] = { overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 3), overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 4), overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 6), }; static const union AnimCmd sAnim_JumpLongGrass[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(5, 8), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_JumpLongGrass[] = { sAnim_JumpLongGrass, }; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_JumpLongGrass, .images = sPicTable_JumpLongGrass, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateJumpImpactEffect, }; static const struct SpriteFrameImage sPicTable_UnusedGrass[] = { overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 3), overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 4), overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 5), overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 6), overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 7), overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 8), }; static const union AnimCmd sAnim_UnusedGrass[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(6, 4), ANIMCMD_FRAME(7, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_JUMP(7), }; static const union AnimCmd *const sAnimTable_UnusedGrass[] = { sAnim_UnusedGrass, }; const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_UnusedGrass, .images = sPicTable_UnusedGrass, .affineAnims = gDummySpriteAffineAnimTable, .callback = WaitFieldEffectSpriteAnim, }; static const struct SpriteFrameImage sPicTable_UnusedGrass2[] = { overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 3), }; static const union AnimCmd sAnim_UnusedGrass2[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnimTable_UnusedGrass2[] = { sAnim_UnusedGrass2, }; const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2 = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_UnusedGrass2, .images = sPicTable_UnusedGrass2, .affineAnims = gDummySpriteAffineAnimTable, .callback = WaitFieldEffectSpriteAnim, }; static const struct SpriteFrameImage sPicTable_UnusedSand[] = { overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 3), }; static const union AnimCmd sAnim_UnusedSand[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnimTable_UnusedSand[] = { sAnim_UnusedSand, }; const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_UnusedSand, .images = sPicTable_UnusedSand, .affineAnims = gDummySpriteAffineAnimTable, .callback = WaitFieldEffectSpriteAnim, }; static const struct SpriteFrameImage sPicTable_SandPile[] = { overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 2), }; static const union AnimCmd sAnim_SandPile[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_SandPile[] = { sAnim_SandPile, }; const struct SpriteTemplate gFieldEffectObjectTemplate_SandPile = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, .anims = sAnimTable_SandPile, .images = sPicTable_SandPile, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateSandPileFieldEffect, }; static const struct SpriteFrameImage sPicTable_WaterSurfacing[] = { overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 3), }; static const union AnimCmd sAnim_WaterSurfacing[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnimTable_WaterSurfacing[] = { sAnim_WaterSurfacing, }; const struct SpriteTemplate gFieldEffectObjectTemplate_WaterSurfacing = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_WaterSurfacing, .images = sPicTable_WaterSurfacing, .affineAnims = gDummySpriteAffineAnimTable, .callback = WaitFieldEffectSpriteAnim, }; const union AffineAnimCmd sAffineAnim_ReflectionDistortion_0[] = { AFFINEANIMCMD_FRAME(-256, 256, 128, 0), AFFINEANIMCMD_FRAME(1, 0, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 8), AFFINEANIMCMD_FRAME(-1, 0, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 8), AFFINEANIMCMD_FRAME(-1, 0, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 8), AFFINEANIMCMD_FRAME(1, 0, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 8), AFFINEANIMCMD_JUMP(1), }; const union AffineAnimCmd sAffineAnim_ReflectionDistortion_1[] = { AFFINEANIMCMD_FRAME(256, 256, 128, 0), AFFINEANIMCMD_FRAME(-1, 0, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 8), AFFINEANIMCMD_FRAME(1, 0, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 8), AFFINEANIMCMD_FRAME(1, 0, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 8), AFFINEANIMCMD_FRAME(-1, 0, 0, 4), AFFINEANIMCMD_FRAME(0, 0, 0, 8), AFFINEANIMCMD_JUMP(1), }; const union AffineAnimCmd *const sAffineAnims_ReflectionDistortion[] = { sAffineAnim_ReflectionDistortion_0, sAffineAnim_ReflectionDistortion_1, }; const struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion = { .tileTag = 0x0, .paletteTag = TAG_NONE, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_ReflectionDistortion, .callback = SpriteCallbackDummy, }; /* static const struct SpriteFrameImage sPicTable_Sparkle[] = { overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 3), overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 4), overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 5), }; static const union AnimCmd sAnim_Sparkle[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(5, 8), ANIMCMD_LOOP(0), ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(5, 4), ANIMCMD_LOOP(3), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(5, 8), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_Sparkle[] = { sAnim_Sparkle, }; const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle = { .tileTag = 0xFFFF, .paletteTag = 0xFFFF, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_Sparkle, .images = sPicTable_Sparkle, .affineAnims = gDummySpriteAffineAnimTable, .callback = WaitFieldEffectSpriteAnim, }; */ static const struct SpriteFrameImage sPicTable_TreeDisguise[] = { overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 2), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 3), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 4), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 5), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 6), }; static const union AnimCmd sAnim_TreeDisguise[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_END, }; static const union AnimCmd sAnim_TreeDisguiseReveal[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(6, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_TreeDisguise[] = { sAnim_TreeDisguise, sAnim_TreeDisguiseReveal, }; const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_16x32, .anims = sAnimTable_TreeDisguise, .images = sPicTable_TreeDisguise, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateDisguiseFieldEffect, }; static const struct SpriteFrameImage sPicTable_MountainDisguise[] = { overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 2), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 3), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 4), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 5), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 6), }; static const union AnimCmd sAnim_MountainDisguise[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_END, }; static const union AnimCmd sAnim_MountainDisguiseReveal[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(6, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_MountainDisguise[] = { sAnim_MountainDisguise, sAnim_MountainDisguiseReveal, }; const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_16x32, .anims = sAnimTable_MountainDisguise, .images = sPicTable_MountainDisguise, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateDisguiseFieldEffect, }; static const struct SpriteFrameImage sPicTable_SandDisguisePlaceholder[] = { overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 2), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 3), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 4), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 5), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 6), }; const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_16x32, .anims = sAnimTable_TreeDisguise, .images = sPicTable_SandDisguisePlaceholder, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateDisguiseFieldEffect, }; static const struct SpriteFrameImage sPicTable_Bird[] = { overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 0), overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 1), overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 2), overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 3), overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 4), }; static const union AnimCmd sAnim_Bird_WithoutPlayer[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Bird_Red_FlyOut[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Bird_Red_FlyIn[] = { ANIMCMD_FRAME(2, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Bird_Green_FlyOut[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_END, }; static const union AnimCmd sAnim_Bird_Green_FlyIn[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_Bird[] = { sAnim_Bird_WithoutPlayer, sAnim_Bird_Red_FlyOut, sAnim_Bird_Red_FlyIn, sAnim_Bird_Green_FlyOut, sAnim_Bird_Green_FlyIn, }; const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_64x64, .anims = sAnimTable_Bird, .images = sPicTable_Bird, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct SpriteFrameImage sPicTable_ShortGrass[] = { overworld_frame(gFieldEffectObjectPic_ShortGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_ShortGrass, 2, 2, 1), }; static const union AnimCmd sAnim_ShortGrass[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_ShortGrass[] = { sAnim_ShortGrass, }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_ShortGrass, .images = sPicTable_ShortGrass, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateShortGrassFieldEffect, }; static const struct SpriteFrameImage sPicTable_HotSpringsWater[] = { obj_frame_tiles(gFieldEffectObjectPic_HotSpringsWater), }; static const union AnimCmd sAnim_HotSpringsWater[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_HotSpringsWater[] = { sAnim_HotSpringsWater, }; const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_HotSpringsWater, .images = sPicTable_HotSpringsWater, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateHotSpringsWaterFieldEffect, }; static const struct SpriteFrameImage sPicTable_AshPuff[] = { overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 3), overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 4), }; static const union AnimCmd sAnim_AshPuff[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(1, 6), ANIMCMD_FRAME(2, 6), ANIMCMD_FRAME(3, 6), ANIMCMD_FRAME(4, 6), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_AshPuff[] = { sAnim_AshPuff, }; const struct SpriteTemplate gFieldEffectObjectTemplate_AshPuff = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_ASH, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_AshPuff, .images = sPicTable_AshPuff, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PopOutOfAsh, }; const struct SpritePalette gSpritePalette_Ash = { .data = gFieldEffectPal_Ash, .tag = FLDEFF_PAL_TAG_ASH }; static const struct SpriteFrameImage sPicTable_AshLaunch[] = { overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 2), overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 3), overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 4), }; static const union AnimCmd sAnim_AshLaunch[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(1, 6), ANIMCMD_FRAME(2, 6), ANIMCMD_FRAME(3, 6), ANIMCMD_FRAME(4, 6), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_AshLaunch[] = { sAnim_AshLaunch, }; const struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_ASH, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_AshLaunch, .images = sPicTable_AshLaunch, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_AshLaunch, }; static const struct SpriteFrameImage sPicTable_Bubbles[] = { overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 2), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 3), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 4), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 5), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 6), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 7), }; static const union AnimCmd sAnim_Bubbles[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 6), ANIMCMD_FRAME(4, 6), ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(6, 4), ANIMCMD_FRAME(7, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_Bubbles[] = { sAnim_Bubbles, }; const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x32, .anims = sAnimTable_Bubbles, .images = sPicTable_Bubbles, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateBubblesFieldEffect, }; static const struct SpriteFrameImage sPicTable_SmallSparkle[] = { overworld_frame(gFieldEffectObjectPic_SmallSparkle, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SmallSparkle, 2, 2, 1), }; static const union AnimCmd sAnim_SmallSparkle[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(1, 5), ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnimTable_SmallSparkle[] = { sAnim_SmallSparkle, }; const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_SMALL_SPARKLE, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_SmallSparkle, .images = sPicTable_SmallSparkle, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateSparkleFieldEffect, }; const struct SpritePalette gSpritePalette_SmallSparkle = { .data = gFieldEffectPal_SmallSparkle, .tag = FLDEFF_PAL_TAG_SMALL_SPARKLE }; ================================================ FILE: src/data/graphics/battle_terrain_unused.h ================================================ // All graphics in this file go completely unused. const u32 gUnusedBattleTerrain_Plain_Palette[] = INCBIN_U32("graphics/battle_terrain/unused/plain.gbapal.lz"); const u32 gUnusedBattleTerrain_Building_Tiles_Sheet[] = INCBIN_U32("graphics/battle_terrain/unused/building/tiles.4bpp.lz"); const u32 gUnusedBattleTerrain_Stadium_Battle_Frontier_Palette[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/battle_frontier.gbapal.lz"); const u32 gUnusedBattleTerrain_Building_Map_Tilemap[] = INCBIN_U32("graphics/battle_terrain/unused/building/map.bin.lz"); const u32 gUnusedBattleTerrain_Stadium_Tiles_Sheet[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/tiles.4bpp.lz"); const u32 gUnusedBattleTerrain_Stadium_Map_Tilemap[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/map.bin.lz"); const u32 gUnusedBattleTerrain_Building_Palette[] = INCBIN_U32("graphics/battle_terrain/unused/building/palette.gbapal.lz"); const u32 gUnusedBattleTerrain_Kyogre_Palette[] = INCBIN_U32("graphics/battle_terrain/unused/kyogre.gbapal.lz"); const u32 gUnusedBattleTerrain_Groudon_Palette[] = INCBIN_U32("graphics/battle_terrain/unused/groudon.gbapal.lz"); const u32 gUnusedBattleTerrain_Building_Palette2[] = INCBIN_U32("graphics/battle_terrain/unused/building/palette2.gbapal.lz"); const u32 gUnusedBattleTerrain_Building_Palette3[] = INCBIN_U32("graphics/battle_terrain/unused/building/palette3.gbapal.lz"); const u32 gUnusedBattleTerrain_Stadium_Palette1[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/palette1.gbapal.lz"); const u32 gUnusedBattleTerrain_Stadium_Palette2[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/palette2.gbapal.lz"); const u32 gUnusedBattleTerrain_Stadium_Palette3[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/palette3.gbapal.lz"); const u32 gUnusedBattleTerrain_Stadium_Palette4[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/palette4.gbapal.lz"); const u32 gUnusedBattleTerrain_Stadium_Palette5[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/palette5.gbapal.lz"); const u32 gUnusedBattleTerrain_Stadium_Palette6[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/palette6.gbapal.lz"); const u32 gUnusedBattleTerrain_Stadium_Palette7[] = INCBIN_U32("graphics/battle_terrain/unused/stadium/palette7.gbapal.lz"); const u32 gUnusedBattleTerrain_Building_Anim_Tiles_Sheet[] = INCBIN_U32("graphics/battle_terrain/unused/building/anim_tiles.4bpp.lz"); const u32 gUnusedBattleTerrain_Building_Anim_Map_Tilemap[] = INCBIN_U32("graphics/battle_terrain/unused/building/anim_map.bin.lz"); ================================================ FILE: src/data/graphics/interface_pokeballs.h ================================================ const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/interface/ball/poke.4bpp.lz"); const u32 gBallPal_Poke[] = INCBIN_U32("graphics/interface/ball/poke.gbapal.lz"); const u32 gBallGfx_Great[] = INCBIN_U32("graphics/interface/ball/great.4bpp.lz"); const u32 gBallPal_Great[] = INCBIN_U32("graphics/interface/ball/great.gbapal.lz"); const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/interface/ball/safari.4bpp.lz"); const u32 gBallPal_Safari[] = INCBIN_U32("graphics/interface/ball/safari.gbapal.lz"); const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/interface/ball/ultra.4bpp.lz"); const u32 gBallPal_Ultra[] = INCBIN_U32("graphics/interface/ball/ultra.gbapal.lz"); const u32 gBallGfx_Master[] = INCBIN_U32("graphics/interface/ball/master.4bpp.lz"); const u32 gBallPal_Master[] = INCBIN_U32("graphics/interface/ball/master.gbapal.lz"); const u32 gBallGfx_Net[] = INCBIN_U32("graphics/interface/ball/net.4bpp.lz"); const u32 gBallPal_Net[] = INCBIN_U32("graphics/interface/ball/net.gbapal.lz"); const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/interface/ball/dive.4bpp.lz"); const u32 gBallPal_Dive[] = INCBIN_U32("graphics/interface/ball/dive.gbapal.lz"); const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/interface/ball/nest.4bpp.lz"); const u32 gBallPal_Nest[] = INCBIN_U32("graphics/interface/ball/nest.gbapal.lz"); const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/interface/ball/repeat.4bpp.lz"); const u32 gBallPal_Repeat[] = INCBIN_U32("graphics/interface/ball/repeat.gbapal.lz"); const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/interface/ball/timer.4bpp.lz"); const u32 gBallPal_Timer[] = INCBIN_U32("graphics/interface/ball/timer.gbapal.lz"); const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/interface/ball/luxury.4bpp.lz"); const u32 gBallPal_Luxury[] = INCBIN_U32("graphics/interface/ball/luxury.gbapal.lz"); const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/interface/ball/premier.4bpp.lz"); const u32 gBallPal_Premier[] = INCBIN_U32("graphics/interface/ball/premier.gbapal.lz"); const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/interface/ball_open.4bpp.lz"); ================================================ FILE: src/data/graphics/items.h ================================================ const u32 gItemIcon_QuestionMark[] = INCBIN_U32("graphics/items/icons/question_mark.4bpp.lz"); const u32 gItemIconPalette_QuestionMark[] = INCBIN_U32("graphics/items/icon_palettes/question_mark.gbapal.lz"); const u32 gItemIcon_ReturnToFieldArrow[] = INCBIN_U32("graphics/items/icons/return_to_field_arrow.4bpp.lz"); const u32 gItemIconPalette_ReturnToFieldArrow[] = INCBIN_U32("graphics/items/icon_palettes/return_to_field_arrow.gbapal.lz"); // Pokeballs const u32 gItemIcon_MasterBall[] = INCBIN_U32("graphics/items/icons/master_ball.4bpp.lz"); const u32 gItemIconPalette_MasterBall[] = INCBIN_U32("graphics/items/icon_palettes/master_ball.gbapal.lz"); const u32 gItemIcon_UltraBall[] = INCBIN_U32("graphics/items/icons/ultra_ball.4bpp.lz"); const u32 gItemIconPalette_UltraBall[] = INCBIN_U32("graphics/items/icon_palettes/ultra_ball.gbapal.lz"); const u32 gItemIcon_GreatBall[] = INCBIN_U32("graphics/items/icons/great_ball.4bpp.lz"); const u32 gItemIconPalette_GreatBall[] = INCBIN_U32("graphics/items/icon_palettes/great_ball.gbapal.lz"); const u32 gItemIcon_PokeBall[] = INCBIN_U32("graphics/items/icons/poke_ball.4bpp.lz"); const u32 gItemIconPalette_PokeBall[] = INCBIN_U32("graphics/items/icon_palettes/poke_ball.gbapal.lz"); const u32 gItemIcon_SafariBall[] = INCBIN_U32("graphics/items/icons/safari_ball.4bpp.lz"); const u32 gItemIconPalette_SafariBall[] = INCBIN_U32("graphics/items/icon_palettes/safari_ball.gbapal.lz"); const u32 gItemIcon_NetBall[] = INCBIN_U32("graphics/items/icons/net_ball.4bpp.lz"); const u32 gItemIconPalette_NetBall[] = INCBIN_U32("graphics/items/icon_palettes/net_ball.gbapal.lz"); const u32 gItemIcon_DiveBall[] = INCBIN_U32("graphics/items/icons/dive_ball.4bpp.lz"); const u32 gItemIconPalette_DiveBall[] = INCBIN_U32("graphics/items/icon_palettes/dive_ball.gbapal.lz"); const u32 gItemIcon_NestBall[] = INCBIN_U32("graphics/items/icons/nest_ball.4bpp.lz"); const u32 gItemIconPalette_NestBall[] = INCBIN_U32("graphics/items/icon_palettes/nest_ball.gbapal.lz"); const u32 gItemIcon_RepeatBall[] = INCBIN_U32("graphics/items/icons/repeat_ball.4bpp.lz"); const u32 gItemIconPalette_RepeatBall[] = INCBIN_U32("graphics/items/icon_palettes/repeat_ball.gbapal.lz"); const u32 gItemIcon_TimerBall[] = INCBIN_U32("graphics/items/icons/timer_ball.4bpp.lz"); const u32 gItemIcon_LuxuryBall[] = INCBIN_U32("graphics/items/icons/luxury_ball.4bpp.lz"); const u32 gItemIconPalette_LuxuryBall[] = INCBIN_U32("graphics/items/icon_palettes/luxury_ball.gbapal.lz"); const u32 gItemIcon_PremierBall[] = INCBIN_U32("graphics/items/icons/premier_ball.4bpp.lz"); // Medicine const u32 gItemIcon_Potion[] = INCBIN_U32("graphics/items/icons/potion.4bpp.lz"); const u32 gItemIconPalette_Potion[] = INCBIN_U32("graphics/items/icon_palettes/potion.gbapal.lz"); const u32 gItemIcon_Antidote[] = INCBIN_U32("graphics/items/icons/antidote.4bpp.lz"); const u32 gItemIconPalette_Antidote[] = INCBIN_U32("graphics/items/icon_palettes/antidote.gbapal.lz"); const u32 gItemIconPalette_BurnHeal[] = INCBIN_U32("graphics/items/icon_palettes/burn_heal.gbapal.lz"); const u32 gItemIconPalette_IceHeal[] = INCBIN_U32("graphics/items/icon_palettes/ice_heal.gbapal.lz"); const u32 gItemIcon_StatusHeal[] = INCBIN_U32("graphics/items/icons/status_heal.4bpp.lz"); const u32 gItemIconPalette_Awakening[] = INCBIN_U32("graphics/items/icon_palettes/awakening.gbapal.lz"); const u32 gItemIconPalette_ParalyzeHeal[] = INCBIN_U32("graphics/items/icon_palettes/paralyze_heal.gbapal.lz"); const u32 gItemIcon_LargePotion[] = INCBIN_U32("graphics/items/icons/large_potion.4bpp.lz"); const u32 gItemIconPalette_FullRestore[] = INCBIN_U32("graphics/items/icon_palettes/full_restore.gbapal.lz"); const u32 gItemIconPalette_MaxPotion[] = INCBIN_U32("graphics/items/icon_palettes/max_potion.gbapal.lz"); const u32 gItemIconPalette_HyperPotion[] = INCBIN_U32("graphics/items/icon_palettes/hyper_potion.gbapal.lz"); const u32 gItemIconPalette_SuperPotion[] = INCBIN_U32("graphics/items/icon_palettes/super_potion.gbapal.lz"); const u32 gItemIcon_FullHeal[] = INCBIN_U32("graphics/items/icons/full_heal.4bpp.lz"); const u32 gItemIconPalette_FullHeal[] = INCBIN_U32("graphics/items/icon_palettes/full_heal.gbapal.lz"); const u32 gItemIcon_Revive[] = INCBIN_U32("graphics/items/icons/revive.4bpp.lz"); const u32 gItemIcon_MaxRevive[] = INCBIN_U32("graphics/items/icons/max_revive.4bpp.lz"); const u32 gItemIconPalette_Revive[] = INCBIN_U32("graphics/items/icon_palettes/revive.gbapal.lz"); const u32 gItemIcon_FreshWater[] = INCBIN_U32("graphics/items/icons/fresh_water.4bpp.lz"); const u32 gItemIconPalette_FreshWater[] = INCBIN_U32("graphics/items/icon_palettes/fresh_water.gbapal.lz"); const u32 gItemIcon_SodaPop[] = INCBIN_U32("graphics/items/icons/soda_pop.4bpp.lz"); const u32 gItemIconPalette_SodaPop[] = INCBIN_U32("graphics/items/icon_palettes/soda_pop.gbapal.lz"); const u32 gItemIcon_Lemonade[] = INCBIN_U32("graphics/items/icons/lemonade.4bpp.lz"); const u32 gItemIconPalette_Lemonade[] = INCBIN_U32("graphics/items/icon_palettes/lemonade.gbapal.lz"); const u32 gItemIcon_MoomooMilk[] = INCBIN_U32("graphics/items/icons/moomoo_milk.4bpp.lz"); const u32 gItemIconPalette_MoomooMilk[] = INCBIN_U32("graphics/items/icon_palettes/moomoo_milk.gbapal.lz"); const u32 gItemIcon_Powder[] = INCBIN_U32("graphics/items/icons/powder.4bpp.lz"); const u32 gItemIconPalette_EnergyPowder[] = INCBIN_U32("graphics/items/icon_palettes/energy_powder.gbapal.lz"); const u32 gItemIcon_EnergyRoot[] = INCBIN_U32("graphics/items/icons/energy_root.4bpp.lz"); const u32 gItemIconPalette_EnergyRoot[] = INCBIN_U32("graphics/items/icon_palettes/energy_root.gbapal.lz"); const u32 gItemIconPalette_HealPowder[] = INCBIN_U32("graphics/items/icon_palettes/heal_powder.gbapal.lz"); const u32 gItemIcon_RevivalHerb[] = INCBIN_U32("graphics/items/icons/revival_herb.4bpp.lz"); const u32 gItemIconPalette_RevivalHerb[] = INCBIN_U32("graphics/items/icon_palettes/revival_herb.gbapal.lz"); const u32 gItemIcon_Ether[] = INCBIN_U32("graphics/items/icons/ether.4bpp.lz"); const u32 gItemIconPalette_Ether[] = INCBIN_U32("graphics/items/icon_palettes/ether.gbapal.lz"); const u32 gItemIconPalette_MaxEther[] = INCBIN_U32("graphics/items/icon_palettes/max_ether.gbapal.lz"); const u32 gItemIconPalette_Elixir[] = INCBIN_U32("graphics/items/icon_palettes/elixir.gbapal.lz"); const u32 gItemIconPalette_MaxElixir[] = INCBIN_U32("graphics/items/icon_palettes/max_elixir.gbapal.lz"); const u32 gItemIcon_LavaCookie[] = INCBIN_U32("graphics/items/icons/lava_cookie.4bpp.lz"); const u32 gItemIconPalette_LavaCookieAndLetter[] = INCBIN_U32("graphics/items/icon_palettes/lava_cookie_and_letter.gbapal.lz"); const u32 gItemIcon_Flute[] = INCBIN_U32("graphics/items/icons/flute.4bpp.lz"); const u32 gItemIconPalette_BlueFlute[] = INCBIN_U32("graphics/items/icon_palettes/blue_flute.gbapal.lz"); const u32 gItemIconPalette_YellowFlute[] = INCBIN_U32("graphics/items/icon_palettes/yellow_flute.gbapal.lz"); const u32 gItemIconPalette_RedFlute[] = INCBIN_U32("graphics/items/icon_palettes/red_flute.gbapal.lz"); const u32 gItemIconPalette_BlackFlute[] = INCBIN_U32("graphics/items/icon_palettes/black_flute.gbapal.lz"); const u32 gItemIconPalette_WhiteFlute[] = INCBIN_U32("graphics/items/icon_palettes/white_flute.gbapal.lz"); const u32 gItemIcon_BerryJuice[] = INCBIN_U32("graphics/items/icons/berry_juice.4bpp.lz"); const u32 gItemIconPalette_BerryJuice[] = INCBIN_U32("graphics/items/icon_palettes/berry_juice.gbapal.lz"); const u32 gItemIcon_SacredAsh[] = INCBIN_U32("graphics/items/icons/sacred_ash.4bpp.lz"); const u32 gItemIconPalette_SacredAsh[] = INCBIN_U32("graphics/items/icon_palettes/sacred_ash.gbapal.lz"); // Collectibles const u32 gItemIconPalette_ShoalSalt[] = INCBIN_U32("graphics/items/icon_palettes/shoal_salt.gbapal.lz"); const u32 gItemIcon_ShoalShell[] = INCBIN_U32("graphics/items/icons/shoal_shell.4bpp.lz"); const u32 gItemIconPalette_Shell[] = INCBIN_U32("graphics/items/icon_palettes/shell.gbapal.lz"); const u32 gItemIcon_Shard[] = INCBIN_U32("graphics/items/icons/shard.4bpp.lz"); const u32 gItemIconPalette_RedShard[] = INCBIN_U32("graphics/items/icon_palettes/red_shard.gbapal.lz"); const u32 gItemIconPalette_BlueShard[] = INCBIN_U32("graphics/items/icon_palettes/blue_shard.gbapal.lz"); const u32 gItemIconPalette_YellowShard[] = INCBIN_U32("graphics/items/icon_palettes/yellow_shard.gbapal.lz"); const u32 gItemIconPalette_GreenShard[] = INCBIN_U32("graphics/items/icon_palettes/green_shard.gbapal.lz"); // Vitamins const u32 gItemIcon_HPUp[] = INCBIN_U32("graphics/items/icons/hp_up.4bpp.lz"); const u32 gItemIconPalette_HPUp[] = INCBIN_U32("graphics/items/icon_palettes/hp_up.gbapal.lz"); const u32 gItemIcon_Vitamin[] = INCBIN_U32("graphics/items/icons/vitamin.4bpp.lz"); const u32 gItemIconPalette_Protein[] = INCBIN_U32("graphics/items/icon_palettes/protein.gbapal.lz"); const u32 gItemIconPalette_Iron[] = INCBIN_U32("graphics/items/icon_palettes/iron.gbapal.lz"); const u32 gItemIconPalette_Carbos[] = INCBIN_U32("graphics/items/icon_palettes/carbos.gbapal.lz"); const u32 gItemIconPalette_Calcium[] = INCBIN_U32("graphics/items/icon_palettes/calcium.gbapal.lz"); const u32 gItemIcon_RareCandy[] = INCBIN_U32("graphics/items/icons/rare_candy.4bpp.lz"); const u32 gItemIconPalette_RareCandy[] = INCBIN_U32("graphics/items/icon_palettes/rare_candy.gbapal.lz"); const u32 gItemIcon_PPUp[] = INCBIN_U32("graphics/items/icons/pp_up.4bpp.lz"); const u32 gItemIconPalette_PPUp[] = INCBIN_U32("graphics/items/icon_palettes/pp_up.gbapal.lz"); const u32 gItemIconPalette_Zinc[] = INCBIN_U32("graphics/items/icon_palettes/zinc.gbapal.lz"); const u32 gItemIcon_PPMax[] = INCBIN_U32("graphics/items/icons/pp_max.4bpp.lz"); const u32 gItemIconPalette_PPMax[] = INCBIN_U32("graphics/items/icon_palettes/pp_max.gbapal.lz"); // Battle items const u32 gItemIconPalette_GuardSpec[] = INCBIN_U32("graphics/items/icon_palettes/guard_spec.gbapal.lz"); const u32 gItemIconPalette_DireHit[] = INCBIN_U32("graphics/items/icon_palettes/dire_hit.gbapal.lz"); const u32 gItemIconPalette_XAttack[] = INCBIN_U32("graphics/items/icon_palettes/x_attack.gbapal.lz"); const u32 gItemIcon_BattleStatItem[] = INCBIN_U32("graphics/items/icons/battle_stat_item.4bpp.lz"); const u32 gItemIconPalette_XDefend[] = INCBIN_U32("graphics/items/icon_palettes/x_defend.gbapal.lz"); const u32 gItemIconPalette_XSpeed[] = INCBIN_U32("graphics/items/icon_palettes/x_speed.gbapal.lz"); const u32 gItemIconPalette_XAccuracy[] = INCBIN_U32("graphics/items/icon_palettes/x_accuracy.gbapal.lz"); const u32 gItemIconPalette_XSpecial[] = INCBIN_U32("graphics/items/icon_palettes/x_special.gbapal.lz"); const u32 gItemIcon_PokeDoll[] = INCBIN_U32("graphics/items/icons/poke_doll.4bpp.lz"); const u32 gItemIconPalette_PokeDoll[] = INCBIN_U32("graphics/items/icon_palettes/poke_doll.gbapal.lz"); const u32 gItemIcon_FluffyTail[] = INCBIN_U32("graphics/items/icons/fluffy_tail.4bpp.lz"); const u32 gItemIconPalette_FluffyTail[] = INCBIN_U32("graphics/items/icon_palettes/fluffy_tail.gbapal.lz"); // Field items const u32 gItemIcon_Repel[] = INCBIN_U32("graphics/items/icons/repel.4bpp.lz"); const u32 gItemIconPalette_SuperRepel[] = INCBIN_U32("graphics/items/icon_palettes/super_repel.gbapal.lz"); const u32 gItemIconPalette_MaxRepel[] = INCBIN_U32("graphics/items/icon_palettes/max_repel.gbapal.lz"); const u32 gItemIcon_EscapeRope[] = INCBIN_U32("graphics/items/icons/escape_rope.4bpp.lz"); const u32 gItemIconPalette_EscapeRope[] = INCBIN_U32("graphics/items/icon_palettes/escape_rope.gbapal.lz"); const u32 gItemIconPalette_Repel[] = INCBIN_U32("graphics/items/icon_palettes/repel.gbapal.lz"); // Evolution stones const u32 gItemIcon_SunStone[] = INCBIN_U32("graphics/items/icons/sun_stone.4bpp.lz"); const u32 gItemIconPalette_SunStone[] = INCBIN_U32("graphics/items/icon_palettes/sun_stone.gbapal.lz"); const u32 gItemIcon_MoonStone[] = INCBIN_U32("graphics/items/icons/moon_stone.4bpp.lz"); const u32 gItemIconPalette_MoonStone[] = INCBIN_U32("graphics/items/icon_palettes/moon_stone.gbapal.lz"); const u32 gItemIcon_FireStone[] = INCBIN_U32("graphics/items/icons/fire_stone.4bpp.lz"); const u32 gItemIconPalette_FireStone[] = INCBIN_U32("graphics/items/icon_palettes/fire_stone.gbapal.lz"); const u32 gItemIcon_ThunderStone[] = INCBIN_U32("graphics/items/icons/thunder_stone.4bpp.lz"); const u32 gItemIconPalette_ThunderStone[] = INCBIN_U32("graphics/items/icon_palettes/thunder_stone.gbapal.lz"); const u32 gItemIcon_WaterStone[] = INCBIN_U32("graphics/items/icons/water_stone.4bpp.lz"); const u32 gItemIconPalette_WaterStone[] = INCBIN_U32("graphics/items/icon_palettes/water_stone.gbapal.lz"); const u32 gItemIcon_LeafStone[] = INCBIN_U32("graphics/items/icons/leaf_stone.4bpp.lz"); const u32 gItemIconPalette_LeafStone[] = INCBIN_U32("graphics/items/icon_palettes/leaf_stone.gbapal.lz"); // Valuables const u32 gItemIcon_TinyMushroom[] = INCBIN_U32("graphics/items/icons/tiny_mushroom.4bpp.lz"); const u32 gItemIcon_BigMushroom[] = INCBIN_U32("graphics/items/icons/big_mushroom.4bpp.lz"); const u32 gItemIconPalette_Mushroom[] = INCBIN_U32("graphics/items/icon_palettes/mushroom.gbapal.lz"); const u32 gItemIcon_Pearl[] = INCBIN_U32("graphics/items/icons/pearl.4bpp.lz"); const u32 gItemIconPalette_Pearl[] = INCBIN_U32("graphics/items/icon_palettes/pearl.gbapal.lz"); const u32 gItemIcon_BigPearl[] = INCBIN_U32("graphics/items/icons/big_pearl.4bpp.lz"); const u32 gItemIcon_Stardust[] = INCBIN_U32("graphics/items/icons/stardust.4bpp.lz"); const u32 gItemIconPalette_Star[] = INCBIN_U32("graphics/items/icon_palettes/star.gbapal.lz"); const u32 gItemIcon_StarPiece[] = INCBIN_U32("graphics/items/icons/star_piece.4bpp.lz"); const u32 gItemIcon_Nugget[] = INCBIN_U32("graphics/items/icons/nugget.4bpp.lz"); const u32 gItemIconPalette_Nugget[] = INCBIN_U32("graphics/items/icon_palettes/nugget.gbapal.lz"); const u32 gItemIcon_HeartScale[] = INCBIN_U32("graphics/items/icons/heart_scale.4bpp.lz"); const u32 gItemIconPalette_HeartScale[] = INCBIN_U32("graphics/items/icon_palettes/heart_scale.gbapal.lz"); // Mail const u32 gItemIcon_OrangeMail[] = INCBIN_U32("graphics/items/icons/orange_mail.4bpp.lz"); const u32 gItemIconPalette_OrangeMail[] = INCBIN_U32("graphics/items/icon_palettes/orange_mail.gbapal.lz"); const u32 gItemIcon_HarborMail[] = INCBIN_U32("graphics/items/icons/harbor_mail.4bpp.lz"); const u32 gItemIconPalette_HarborMail[] = INCBIN_U32("graphics/items/icon_palettes/harbor_mail.gbapal.lz"); const u32 gItemIcon_GlitterMail[] = INCBIN_U32("graphics/items/icons/glitter_mail.4bpp.lz"); const u32 gItemIconPalette_GlitterMail[] = INCBIN_U32("graphics/items/icon_palettes/glitter_mail.gbapal.lz"); const u32 gItemIcon_MechMail[] = INCBIN_U32("graphics/items/icons/mech_mail.4bpp.lz"); const u32 gItemIconPalette_MechMail[] = INCBIN_U32("graphics/items/icon_palettes/mech_mail.gbapal.lz"); const u32 gItemIcon_WoodMail[] = INCBIN_U32("graphics/items/icons/wood_mail.4bpp.lz"); const u32 gItemIconPalette_WoodMail[] = INCBIN_U32("graphics/items/icon_palettes/wood_mail.gbapal.lz"); const u32 gItemIcon_WaveMail[] = INCBIN_U32("graphics/items/icons/wave_mail.4bpp.lz"); const u32 gItemIconPalette_WaveMail[] = INCBIN_U32("graphics/items/icon_palettes/wave_mail.gbapal.lz"); const u32 gItemIcon_BeadMail[] = INCBIN_U32("graphics/items/icons/bead_mail.4bpp.lz"); const u32 gItemIconPalette_BeadMail[] = INCBIN_U32("graphics/items/icon_palettes/bead_mail.gbapal.lz"); const u32 gItemIcon_ShadowMail[] = INCBIN_U32("graphics/items/icons/shadow_mail.4bpp.lz"); const u32 gItemIconPalette_ShadowMail[] = INCBIN_U32("graphics/items/icon_palettes/shadow_mail.gbapal.lz"); const u32 gItemIcon_TropicMail[] = INCBIN_U32("graphics/items/icons/tropic_mail.4bpp.lz"); const u32 gItemIconPalette_TropicMail[] = INCBIN_U32("graphics/items/icon_palettes/tropic_mail.gbapal.lz"); const u32 gItemIcon_DreamMail[] = INCBIN_U32("graphics/items/icons/dream_mail.4bpp.lz"); const u32 gItemIconPalette_DreamMail[] = INCBIN_U32("graphics/items/icon_palettes/dream_mail.gbapal.lz"); const u32 gItemIcon_FabMail[] = INCBIN_U32("graphics/items/icons/fab_mail.4bpp.lz"); const u32 gItemIconPalette_FabMail[] = INCBIN_U32("graphics/items/icon_palettes/fab_mail.gbapal.lz"); const u32 gItemIcon_RetroMail[] = INCBIN_U32("graphics/items/icons/retro_mail.4bpp.lz"); const u32 gItemIconPalette_RetroMail[] = INCBIN_U32("graphics/items/icon_palettes/retro_mail.gbapal.lz"); // Berries const u32 gItemIcon_CheriBerry[] = INCBIN_U32("graphics/items/icons/cheri_berry.4bpp.lz"); const u32 gItemIconPalette_CheriBerry[] = INCBIN_U32("graphics/items/icon_palettes/cheri_berry.gbapal.lz"); const u32 gItemIcon_ChestoBerry[] = INCBIN_U32("graphics/items/icons/chesto_berry.4bpp.lz"); const u32 gItemIconPalette_ChestoBerry[] = INCBIN_U32("graphics/items/icon_palettes/chesto_berry.gbapal.lz"); const u32 gItemIcon_PechaBerry[] = INCBIN_U32("graphics/items/icons/pecha_berry.4bpp.lz"); const u32 gItemIconPalette_PechaBerry[] = INCBIN_U32("graphics/items/icon_palettes/pecha_berry.gbapal.lz"); const u32 gItemIcon_RawstBerry[] = INCBIN_U32("graphics/items/icons/rawst_berry.4bpp.lz"); const u32 gItemIconPalette_RawstBerry[] = INCBIN_U32("graphics/items/icon_palettes/rawst_berry.gbapal.lz"); const u32 gItemIcon_AspearBerry[] = INCBIN_U32("graphics/items/icons/aspear_berry.4bpp.lz"); const u32 gItemIconPalette_AspearBerry[] = INCBIN_U32("graphics/items/icon_palettes/aspear_berry.gbapal.lz"); const u32 gItemIcon_LeppaBerry[] = INCBIN_U32("graphics/items/icons/leppa_berry.4bpp.lz"); const u32 gItemIconPalette_LeppaBerry[] = INCBIN_U32("graphics/items/icon_palettes/leppa_berry.gbapal.lz"); const u32 gItemIcon_OranBerry[] = INCBIN_U32("graphics/items/icons/oran_berry.4bpp.lz"); const u32 gItemIconPalette_OranBerry[] = INCBIN_U32("graphics/items/icon_palettes/oran_berry.gbapal.lz"); const u32 gItemIcon_PersimBerry[] = INCBIN_U32("graphics/items/icons/persim_berry.4bpp.lz"); const u32 gItemIconPalette_PersimBerry[] = INCBIN_U32("graphics/items/icon_palettes/persim_berry.gbapal.lz"); const u32 gItemIcon_LumBerry[] = INCBIN_U32("graphics/items/icons/lum_berry.4bpp.lz"); const u32 gItemIconPalette_LumBerry[] = INCBIN_U32("graphics/items/icon_palettes/lum_berry.gbapal.lz"); const u32 gItemIcon_SitrusBerry[] = INCBIN_U32("graphics/items/icons/sitrus_berry.4bpp.lz"); const u32 gItemIconPalette_SitrusBerry[] = INCBIN_U32("graphics/items/icon_palettes/sitrus_berry.gbapal.lz"); const u32 gItemIcon_FigyBerry[] = INCBIN_U32("graphics/items/icons/figy_berry.4bpp.lz"); const u32 gItemIconPalette_FigyBerry[] = INCBIN_U32("graphics/items/icon_palettes/figy_berry.gbapal.lz"); const u32 gItemIcon_WikiBerry[] = INCBIN_U32("graphics/items/icons/wiki_berry.4bpp.lz"); const u32 gItemIconPalette_WikiBerry[] = INCBIN_U32("graphics/items/icon_palettes/wiki_berry.gbapal.lz"); const u32 gItemIcon_MagoBerry[] = INCBIN_U32("graphics/items/icons/mago_berry.4bpp.lz"); const u32 gItemIconPalette_MagoBerry[] = INCBIN_U32("graphics/items/icon_palettes/mago_berry.gbapal.lz"); const u32 gItemIcon_AguavBerry[] = INCBIN_U32("graphics/items/icons/aguav_berry.4bpp.lz"); const u32 gItemIconPalette_AguavBerry[] = INCBIN_U32("graphics/items/icon_palettes/aguav_berry.gbapal.lz"); const u32 gItemIcon_IapapaBerry[] = INCBIN_U32("graphics/items/icons/iapapa_berry.4bpp.lz"); const u32 gItemIconPalette_IapapaBerry[] = INCBIN_U32("graphics/items/icon_palettes/iapapa_berry.gbapal.lz"); const u32 gItemIcon_RazzBerry[] = INCBIN_U32("graphics/items/icons/razz_berry.4bpp.lz"); const u32 gItemIconPalette_RazzBerry[] = INCBIN_U32("graphics/items/icon_palettes/razz_berry.gbapal.lz"); const u32 gItemIcon_BlukBerry[] = INCBIN_U32("graphics/items/icons/bluk_berry.4bpp.lz"); const u32 gItemIconPalette_BlukBerry[] = INCBIN_U32("graphics/items/icon_palettes/bluk_berry.gbapal.lz"); const u32 gItemIcon_NanabBerry[] = INCBIN_U32("graphics/items/icons/nanab_berry.4bpp.lz"); const u32 gItemIconPalette_NanabBerry[] = INCBIN_U32("graphics/items/icon_palettes/nanab_berry.gbapal.lz"); const u32 gItemIcon_WepearBerry[] = INCBIN_U32("graphics/items/icons/wepear_berry.4bpp.lz"); const u32 gItemIconPalette_WepearBerry[] = INCBIN_U32("graphics/items/icon_palettes/wepear_berry.gbapal.lz"); const u32 gItemIcon_PinapBerry[] = INCBIN_U32("graphics/items/icons/pinap_berry.4bpp.lz"); const u32 gItemIconPalette_PinapBerry[] = INCBIN_U32("graphics/items/icon_palettes/pinap_berry.gbapal.lz"); const u32 gItemIcon_PomegBerry[] = INCBIN_U32("graphics/items/icons/pomeg_berry.4bpp.lz"); const u32 gItemIconPalette_PomegBerry[] = INCBIN_U32("graphics/items/icon_palettes/pomeg_berry.gbapal.lz"); const u32 gItemIcon_KelpsyBerry[] = INCBIN_U32("graphics/items/icons/kelpsy_berry.4bpp.lz"); const u32 gItemIconPalette_KelpsyBerry[] = INCBIN_U32("graphics/items/icon_palettes/kelpsy_berry.gbapal.lz"); const u32 gItemIcon_QualotBerry[] = INCBIN_U32("graphics/items/icons/qualot_berry.4bpp.lz"); const u32 gItemIconPalette_QualotBerry[] = INCBIN_U32("graphics/items/icon_palettes/qualot_berry.gbapal.lz"); const u32 gItemIcon_HondewBerry[] = INCBIN_U32("graphics/items/icons/hondew_berry.4bpp.lz"); const u32 gItemIconPalette_HondewBerry[] = INCBIN_U32("graphics/items/icon_palettes/hondew_berry.gbapal.lz"); const u32 gItemIcon_GrepaBerry[] = INCBIN_U32("graphics/items/icons/grepa_berry.4bpp.lz"); const u32 gItemIconPalette_GrepaBerry[] = INCBIN_U32("graphics/items/icon_palettes/grepa_berry.gbapal.lz"); const u32 gItemIcon_TamatoBerry[] = INCBIN_U32("graphics/items/icons/tamato_berry.4bpp.lz"); const u32 gItemIconPalette_TamatoBerry[] = INCBIN_U32("graphics/items/icon_palettes/tamato_berry.gbapal.lz"); const u32 gItemIcon_CornnBerry[] = INCBIN_U32("graphics/items/icons/cornn_berry.4bpp.lz"); const u32 gItemIconPalette_CornnBerry[] = INCBIN_U32("graphics/items/icon_palettes/cornn_berry.gbapal.lz"); const u32 gItemIcon_MagostBerry[] = INCBIN_U32("graphics/items/icons/magost_berry.4bpp.lz"); const u32 gItemIconPalette_MagostBerry[] = INCBIN_U32("graphics/items/icon_palettes/magost_berry.gbapal.lz"); const u32 gItemIcon_RabutaBerry[] = INCBIN_U32("graphics/items/icons/rabuta_berry.4bpp.lz"); const u32 gItemIconPalette_RabutaBerry[] = INCBIN_U32("graphics/items/icon_palettes/rabuta_berry.gbapal.lz"); const u32 gItemIcon_NomelBerry[] = INCBIN_U32("graphics/items/icons/nomel_berry.4bpp.lz"); const u32 gItemIconPalette_NomelBerry[] = INCBIN_U32("graphics/items/icon_palettes/nomel_berry.gbapal.lz"); const u32 gItemIcon_SpelonBerry[] = INCBIN_U32("graphics/items/icons/spelon_berry.4bpp.lz"); const u32 gItemIconPalette_SpelonBerry[] = INCBIN_U32("graphics/items/icon_palettes/spelon_berry.gbapal.lz"); const u32 gItemIcon_PamtreBerry[] = INCBIN_U32("graphics/items/icons/pamtre_berry.4bpp.lz"); const u32 gItemIconPalette_PamtreBerry[] = INCBIN_U32("graphics/items/icon_palettes/pamtre_berry.gbapal.lz"); const u32 gItemIcon_WatmelBerry[] = INCBIN_U32("graphics/items/icons/watmel_berry.4bpp.lz"); const u32 gItemIconPalette_WatmelBerry[] = INCBIN_U32("graphics/items/icon_palettes/watmel_berry.gbapal.lz"); const u32 gItemIcon_DurinBerry[] = INCBIN_U32("graphics/items/icons/durin_berry.4bpp.lz"); const u32 gItemIconPalette_DurinBerry[] = INCBIN_U32("graphics/items/icon_palettes/durin_berry.gbapal.lz"); const u32 gItemIcon_BelueBerry[] = INCBIN_U32("graphics/items/icons/belue_berry.4bpp.lz"); const u32 gItemIconPalette_BelueBerry[] = INCBIN_U32("graphics/items/icon_palettes/belue_berry.gbapal.lz"); const u32 gItemIcon_LiechiBerry[] = INCBIN_U32("graphics/items/icons/liechi_berry.4bpp.lz"); const u32 gItemIconPalette_LiechiBerry[] = INCBIN_U32("graphics/items/icon_palettes/liechi_berry.gbapal.lz"); const u32 gItemIcon_GanlonBerry[] = INCBIN_U32("graphics/items/icons/ganlon_berry.4bpp.lz"); const u32 gItemIconPalette_GanlonBerry[] = INCBIN_U32("graphics/items/icon_palettes/ganlon_berry.gbapal.lz"); const u32 gItemIcon_SalacBerry[] = INCBIN_U32("graphics/items/icons/salac_berry.4bpp.lz"); const u32 gItemIconPalette_SalacBerry[] = INCBIN_U32("graphics/items/icon_palettes/salac_berry.gbapal.lz"); const u32 gItemIcon_PetayaBerry[] = INCBIN_U32("graphics/items/icons/petaya_berry.4bpp.lz"); const u32 gItemIconPalette_PetayaBerry[] = INCBIN_U32("graphics/items/icon_palettes/petaya_berry.gbapal.lz"); const u32 gItemIcon_ApicotBerry[] = INCBIN_U32("graphics/items/icons/apicot_berry.4bpp.lz"); const u32 gItemIconPalette_ApicotBerry[] = INCBIN_U32("graphics/items/icon_palettes/apicot_berry.gbapal.lz"); const u32 gItemIcon_LansatBerry[] = INCBIN_U32("graphics/items/icons/lansat_berry.4bpp.lz"); const u32 gItemIconPalette_LansatBerry[] = INCBIN_U32("graphics/items/icon_palettes/lansat_berry.gbapal.lz"); const u32 gItemIcon_StarfBerry[] = INCBIN_U32("graphics/items/icons/starf_berry.4bpp.lz"); const u32 gItemIconPalette_StarfBerry[] = INCBIN_U32("graphics/items/icon_palettes/starf_berry.gbapal.lz"); const u32 gItemIcon_EnigmaBerry[] = INCBIN_U32("graphics/items/icons/enigma_berry.4bpp.lz"); const u32 gItemIconPalette_EnigmaBerry[] = INCBIN_U32("graphics/items/icon_palettes/enigma_berry.gbapal.lz"); // Hold items const u32 gItemIcon_BrightPowder[] = INCBIN_U32("graphics/items/icons/bright_powder.4bpp.lz"); const u32 gItemIconPalette_BrightPowder[] = INCBIN_U32("graphics/items/icon_palettes/bright_powder.gbapal.lz"); const u32 gItemIcon_InBattleHerb[] = INCBIN_U32("graphics/items/icons/in_battle_herb.4bpp.lz"); const u32 gItemIconPalette_WhiteHerb[] = INCBIN_U32("graphics/items/icon_palettes/white_herb.gbapal.lz"); const u32 gItemIcon_MachoBrace[] = INCBIN_U32("graphics/items/icons/macho_brace.4bpp.lz"); const u32 gItemIconPalette_MachoBrace[] = INCBIN_U32("graphics/items/icon_palettes/macho_brace.gbapal.lz"); const u32 gItemIcon_ExpShare[] = INCBIN_U32("graphics/items/icons/exp_share.4bpp.lz"); const u32 gItemIconPalette_ExpShare[] = INCBIN_U32("graphics/items/icon_palettes/exp_share.gbapal.lz"); const u32 gItemIcon_QuickClaw[] = INCBIN_U32("graphics/items/icons/quick_claw.4bpp.lz"); const u32 gItemIconPalette_QuickClaw[] = INCBIN_U32("graphics/items/icon_palettes/quick_claw.gbapal.lz"); const u32 gItemIcon_SootheBell[] = INCBIN_U32("graphics/items/icons/soothe_bell.4bpp.lz"); const u32 gItemIconPalette_SootheBell[] = INCBIN_U32("graphics/items/icon_palettes/soothe_bell.gbapal.lz"); const u32 gItemIconPalette_MentalHerb[] = INCBIN_U32("graphics/items/icon_palettes/mental_herb.gbapal.lz"); const u32 gItemIcon_ChoiceBand[] = INCBIN_U32("graphics/items/icons/choice_band.4bpp.lz"); const u32 gItemIconPalette_ChoiceBand[] = INCBIN_U32("graphics/items/icon_palettes/choice_band.gbapal.lz"); const u32 gItemIcon_KingsRock[] = INCBIN_U32("graphics/items/icons/kings_rock.4bpp.lz"); const u32 gItemIconPalette_KingsRock[] = INCBIN_U32("graphics/items/icon_palettes/kings_rock.gbapal.lz"); const u32 gItemIcon_SilverPowder[] = INCBIN_U32("graphics/items/icons/silver_powder.4bpp.lz"); const u32 gItemIconPalette_SilverPowder[] = INCBIN_U32("graphics/items/icon_palettes/silver_powder.gbapal.lz"); const u32 gItemIcon_AmuletCoin[] = INCBIN_U32("graphics/items/icons/amulet_coin.4bpp.lz"); const u32 gItemIconPalette_AmuletCoin[] = INCBIN_U32("graphics/items/icon_palettes/amulet_coin.gbapal.lz"); const u32 gItemIcon_CleanseTag[] = INCBIN_U32("graphics/items/icons/cleanse_tag.4bpp.lz"); const u32 gItemIconPalette_CleanseTag[] = INCBIN_U32("graphics/items/icon_palettes/cleanse_tag.gbapal.lz"); const u32 gItemIcon_SoulDew[] = INCBIN_U32("graphics/items/icons/soul_dew.4bpp.lz"); const u32 gItemIconPalette_SoulDew[] = INCBIN_U32("graphics/items/icon_palettes/soul_dew.gbapal.lz"); const u32 gItemIcon_DeepSeaTooth[] = INCBIN_U32("graphics/items/icons/deep_sea_tooth.4bpp.lz"); const u32 gItemIconPalette_DeepSeaTooth[] = INCBIN_U32("graphics/items/icon_palettes/deep_sea_tooth.gbapal.lz"); const u32 gItemIcon_DeepSeaScale[] = INCBIN_U32("graphics/items/icons/deep_sea_scale.4bpp.lz"); const u32 gItemIconPalette_DeepSeaScale[] = INCBIN_U32("graphics/items/icon_palettes/deep_sea_scale.gbapal.lz"); const u32 gItemIcon_SmokeBall[] = INCBIN_U32("graphics/items/icons/smoke_ball.4bpp.lz"); const u32 gItemIconPalette_SmokeBall[] = INCBIN_U32("graphics/items/icon_palettes/smoke_ball.gbapal.lz"); const u32 gItemIcon_Everstone[] = INCBIN_U32("graphics/items/icons/everstone.4bpp.lz"); const u32 gItemIconPalette_Everstone[] = INCBIN_U32("graphics/items/icon_palettes/everstone.gbapal.lz"); const u32 gItemIcon_FocusBand[] = INCBIN_U32("graphics/items/icons/focus_band.4bpp.lz"); const u32 gItemIconPalette_FocusBand[] = INCBIN_U32("graphics/items/icon_palettes/focus_band.gbapal.lz"); const u32 gItemIcon_LuckyEgg[] = INCBIN_U32("graphics/items/icons/lucky_egg.4bpp.lz"); const u32 gItemIconPalette_LuckyEgg[] = INCBIN_U32("graphics/items/icon_palettes/lucky_egg.gbapal.lz"); const u32 gItemIcon_ScopeLens[] = INCBIN_U32("graphics/items/icons/scope_lens.4bpp.lz"); const u32 gItemIconPalette_ScopeLens[] = INCBIN_U32("graphics/items/icon_palettes/scope_lens.gbapal.lz"); const u32 gItemIcon_MetalCoat[] = INCBIN_U32("graphics/items/icons/metal_coat.4bpp.lz"); const u32 gItemIconPalette_MetalCoat[] = INCBIN_U32("graphics/items/icon_palettes/metal_coat.gbapal.lz"); const u32 gItemIcon_Leftovers[] = INCBIN_U32("graphics/items/icons/leftovers.4bpp.lz"); const u32 gItemIconPalette_Leftovers[] = INCBIN_U32("graphics/items/icon_palettes/leftovers.gbapal.lz"); const u32 gItemIcon_DragonScale[] = INCBIN_U32("graphics/items/icons/dragon_scale.4bpp.lz"); const u32 gItemIconPalette_DragonScale[] = INCBIN_U32("graphics/items/icon_palettes/dragon_scale.gbapal.lz"); const u32 gItemIcon_LightBall[] = INCBIN_U32("graphics/items/icons/light_ball.4bpp.lz"); const u32 gItemIconPalette_LightBall[] = INCBIN_U32("graphics/items/icon_palettes/light_ball.gbapal.lz"); const u32 gItemIcon_SoftSand[] = INCBIN_U32("graphics/items/icons/soft_sand.4bpp.lz"); const u32 gItemIconPalette_SoftSand[] = INCBIN_U32("graphics/items/icon_palettes/soft_sand.gbapal.lz"); const u32 gItemIcon_HardStone[] = INCBIN_U32("graphics/items/icons/hard_stone.4bpp.lz"); const u32 gItemIconPalette_HardStone[] = INCBIN_U32("graphics/items/icon_palettes/hard_stone.gbapal.lz"); const u32 gItemIcon_MiracleSeed[] = INCBIN_U32("graphics/items/icons/miracle_seed.4bpp.lz"); const u32 gItemIconPalette_MiracleSeed[] = INCBIN_U32("graphics/items/icon_palettes/miracle_seed.gbapal.lz"); const u32 gItemIcon_BlackGlasses[] = INCBIN_U32("graphics/items/icons/black_glasses.4bpp.lz"); const u32 gItemIconPalette_BlackTypeEnhancingItem[] = INCBIN_U32("graphics/items/icon_palettes/black_type_enhancing_item.gbapal.lz"); const u32 gItemIcon_BlackBelt[] = INCBIN_U32("graphics/items/icons/black_belt.4bpp.lz"); const u32 gItemIcon_Magnet[] = INCBIN_U32("graphics/items/icons/magnet.4bpp.lz"); const u32 gItemIconPalette_Magnet[] = INCBIN_U32("graphics/items/icon_palettes/magnet.gbapal.lz"); const u32 gItemIcon_MysticWater[] = INCBIN_U32("graphics/items/icons/mystic_water.4bpp.lz"); const u32 gItemIconPalette_MysticWater[] = INCBIN_U32("graphics/items/icon_palettes/mystic_water.gbapal.lz"); const u32 gItemIcon_SharpBeak[] = INCBIN_U32("graphics/items/icons/sharp_beak.4bpp.lz"); const u32 gItemIconPalette_SharpBeak[] = INCBIN_U32("graphics/items/icon_palettes/sharp_beak.gbapal.lz"); const u32 gItemIcon_PoisonBarb[] = INCBIN_U32("graphics/items/icons/poison_barb.4bpp.lz"); const u32 gItemIconPalette_PoisonBarb[] = INCBIN_U32("graphics/items/icon_palettes/poison_barb.gbapal.lz"); const u32 gItemIcon_NeverMeltIce[] = INCBIN_U32("graphics/items/icons/never_melt_ice.4bpp.lz"); const u32 gItemIconPalette_NeverMeltIce[] = INCBIN_U32("graphics/items/icon_palettes/never_melt_ice.gbapal.lz"); const u32 gItemIcon_SpellTag[] = INCBIN_U32("graphics/items/icons/spell_tag.4bpp.lz"); const u32 gItemIconPalette_SpellTag[] = INCBIN_U32("graphics/items/icon_palettes/spell_tag.gbapal.lz"); const u32 gItemIcon_TwistedSpoon[] = INCBIN_U32("graphics/items/icons/twisted_spoon.4bpp.lz"); const u32 gItemIconPalette_TwistedSpoon[] = INCBIN_U32("graphics/items/icon_palettes/twisted_spoon.gbapal.lz"); const u32 gItemIcon_Charcoal[] = INCBIN_U32("graphics/items/icons/charcoal.4bpp.lz"); const u32 gItemIconPalette_Charcoal[] = INCBIN_U32("graphics/items/icon_palettes/charcoal.gbapal.lz"); const u32 gItemIcon_DragonFang[] = INCBIN_U32("graphics/items/icons/dragon_fang.4bpp.lz"); const u32 gItemIconPalette_DragonFang[] = INCBIN_U32("graphics/items/icon_palettes/dragon_fang.gbapal.lz"); const u32 gItemIcon_SilkScarf[] = INCBIN_U32("graphics/items/icons/silk_scarf.4bpp.lz"); const u32 gItemIconPalette_SilkScarf[] = INCBIN_U32("graphics/items/icon_palettes/silk_scarf.gbapal.lz"); const u32 gItemIcon_UpGrade[] = INCBIN_U32("graphics/items/icons/up_grade.4bpp.lz"); const u32 gItemIconPalette_UpGrade[] = INCBIN_U32("graphics/items/icon_palettes/up_grade.gbapal.lz"); const u32 gItemIcon_ShellBell[] = INCBIN_U32("graphics/items/icons/shell_bell.4bpp.lz"); const u32 gItemIcon_SeaIncense[] = INCBIN_U32("graphics/items/icons/sea_incense.4bpp.lz"); const u32 gItemIconPalette_SeaIncense[] = INCBIN_U32("graphics/items/icon_palettes/sea_incense.gbapal.lz"); const u32 gItemIcon_LaxIncense[] = INCBIN_U32("graphics/items/icons/lax_incense.4bpp.lz"); const u32 gItemIconPalette_LaxIncense[] = INCBIN_U32("graphics/items/icon_palettes/lax_incense.gbapal.lz"); const u32 gItemIcon_LuckyPunch[] = INCBIN_U32("graphics/items/icons/lucky_punch.4bpp.lz"); const u32 gItemIconPalette_LuckyPunch[] = INCBIN_U32("graphics/items/icon_palettes/lucky_punch.gbapal.lz"); const u32 gItemIcon_MetalPowder[] = INCBIN_U32("graphics/items/icons/metal_powder.4bpp.lz"); const u32 gItemIconPalette_MetalPowder[] = INCBIN_U32("graphics/items/icon_palettes/metal_powder.gbapal.lz"); const u32 gItemIcon_ThickClub[] = INCBIN_U32("graphics/items/icons/thick_club.4bpp.lz"); const u32 gItemIconPalette_ThickClub[] = INCBIN_U32("graphics/items/icon_palettes/thick_club.gbapal.lz"); const u32 gItemIcon_Stick[] = INCBIN_U32("graphics/items/icons/stick.4bpp.lz"); const u32 gItemIconPalette_Stick[] = INCBIN_U32("graphics/items/icon_palettes/stick.gbapal.lz"); const u32 gItemIcon_Scarf[] = INCBIN_U32("graphics/items/icons/scarf.4bpp.lz"); const u32 gItemIconPalette_RedScarf[] = INCBIN_U32("graphics/items/icon_palettes/red_scarf.gbapal.lz"); const u32 gItemIconPalette_BlueScarf[] = INCBIN_U32("graphics/items/icon_palettes/blue_scarf.gbapal.lz"); const u32 gItemIconPalette_PinkScarf[] = INCBIN_U32("graphics/items/icon_palettes/pink_scarf.gbapal.lz"); const u32 gItemIconPalette_GreenScarf[] = INCBIN_U32("graphics/items/icon_palettes/green_scarf.gbapal.lz"); const u32 gItemIconPalette_YellowScarf[] = INCBIN_U32("graphics/items/icon_palettes/yellow_scarf.gbapal.lz"); // Key items const u32 gItemIcon_MachBike[] = INCBIN_U32("graphics/items/icons/mach_bike.4bpp.lz"); const u32 gItemIconPalette_MachBike[] = INCBIN_U32("graphics/items/icon_palettes/mach_bike.gbapal.lz"); const u32 gItemIcon_CoinCase[] = INCBIN_U32("graphics/items/icons/coin_case.4bpp.lz"); const u32 gItemIconPalette_CoinCase[] = INCBIN_U32("graphics/items/icon_palettes/coin_case.gbapal.lz"); const u32 gItemIcon_Itemfinder[] = INCBIN_U32("graphics/items/icons/itemfinder.4bpp.lz"); const u32 gItemIconPalette_Itemfinder[] = INCBIN_U32("graphics/items/icon_palettes/itemfinder.gbapal.lz"); const u32 gItemIcon_OldRod[] = INCBIN_U32("graphics/items/icons/old_rod.4bpp.lz"); const u32 gItemIconPalette_OldRod[] = INCBIN_U32("graphics/items/icon_palettes/old_rod.gbapal.lz"); const u32 gItemIcon_GoodRod[] = INCBIN_U32("graphics/items/icons/good_rod.4bpp.lz"); const u32 gItemIconPalette_GoodRod[] = INCBIN_U32("graphics/items/icon_palettes/good_rod.gbapal.lz"); const u32 gItemIcon_SuperRod[] = INCBIN_U32("graphics/items/icons/super_rod.4bpp.lz"); const u32 gItemIconPalette_SuperRod[] = INCBIN_U32("graphics/items/icon_palettes/super_rod.gbapal.lz"); const u32 gItemIcon_SSTicket[] = INCBIN_U32("graphics/items/icons/ss_ticket.4bpp.lz"); const u32 gItemIconPalette_SSTicket[] = INCBIN_U32("graphics/items/icon_palettes/ss_ticket.gbapal.lz"); const u32 gItemIcon_ContestPass[] = INCBIN_U32("graphics/items/icons/contest_pass.4bpp.lz"); const u32 gItemIconPalette_ContestPass[] = INCBIN_U32("graphics/items/icon_palettes/contest_pass.gbapal.lz"); const u32 gItemIcon_WailmerPail[] = INCBIN_U32("graphics/items/icons/wailmer_pail.4bpp.lz"); const u32 gItemIconPalette_WailmerPail[] = INCBIN_U32("graphics/items/icon_palettes/wailmer_pail.gbapal.lz"); const u32 gItemIcon_DevonGoods[] = INCBIN_U32("graphics/items/icons/devon_goods.4bpp.lz"); const u32 gItemIconPalette_DevonGoods[] = INCBIN_U32("graphics/items/icon_palettes/devon_goods.gbapal.lz"); const u32 gItemIcon_SootSack[] = INCBIN_U32("graphics/items/icons/soot_sack.4bpp.lz"); const u32 gItemIconPalette_SootSack[] = INCBIN_U32("graphics/items/icon_palettes/soot_sack.gbapal.lz"); const u32 gItemIcon_BasementKey[] = INCBIN_U32("graphics/items/icons/basement_key.4bpp.lz"); const u32 gItemIconPalette_OldKey[] = INCBIN_U32("graphics/items/icon_palettes/old_key.gbapal.lz"); const u32 gItemIcon_AcroBike[] = INCBIN_U32("graphics/items/icons/acro_bike.4bpp.lz"); const u32 gItemIconPalette_AcroBike[] = INCBIN_U32("graphics/items/icon_palettes/acro_bike.gbapal.lz"); const u32 gItemIcon_PokeblockCase[] = INCBIN_U32("graphics/items/icons/pokeblock_case.4bpp.lz"); const u32 gItemIconPalette_PokeblockCase[] = INCBIN_U32("graphics/items/icon_palettes/pokeblock_case.gbapal.lz"); const u32 gItemIcon_Letter[] = INCBIN_U32("graphics/items/icons/letter.4bpp.lz"); const u32 gItemIcon_EonTicket[] = INCBIN_U32("graphics/items/icons/eon_ticket.4bpp.lz"); const u32 gItemIconPalette_EonTicket[] = INCBIN_U32("graphics/items/icon_palettes/eon_ticket.gbapal.lz"); const u32 gItemIcon_Orb[] = INCBIN_U32("graphics/items/icons/orb.4bpp.lz"); const u32 gItemIconPalette_RedOrb[] = INCBIN_U32("graphics/items/icon_palettes/red_orb.gbapal.lz"); const u32 gItemIconPalette_BlueOrb[] = INCBIN_U32("graphics/items/icon_palettes/blue_orb.gbapal.lz"); const u32 gItemIcon_Scanner[] = INCBIN_U32("graphics/items/icons/scanner.4bpp.lz"); const u32 gItemIconPalette_Scanner[] = INCBIN_U32("graphics/items/icon_palettes/scanner.gbapal.lz"); const u32 gItemIcon_GoGoggles[] = INCBIN_U32("graphics/items/icons/go_goggles.4bpp.lz"); const u32 gItemIconPalette_GoGoggles[] = INCBIN_U32("graphics/items/icon_palettes/go_goggles.gbapal.lz"); const u32 gItemIcon_Meteorite[] = INCBIN_U32("graphics/items/icons/meteorite.4bpp.lz"); const u32 gItemIconPalette_Meteorite[] = INCBIN_U32("graphics/items/icon_palettes/meteorite.gbapal.lz"); const u32 gItemIcon_Room1Key[] = INCBIN_U32("graphics/items/icons/room1_key.4bpp.lz"); const u32 gItemIcon_Room2Key[] = INCBIN_U32("graphics/items/icons/room2_key.4bpp.lz"); const u32 gItemIcon_Room4Key[] = INCBIN_U32("graphics/items/icons/room4_key.4bpp.lz"); const u32 gItemIcon_Room6Key[] = INCBIN_U32("graphics/items/icons/room6_key.4bpp.lz"); const u32 gItemIcon_StorageKey[] = INCBIN_U32("graphics/items/icons/storage_key.4bpp.lz"); const u32 gItemIcon_RootFossil[] = INCBIN_U32("graphics/items/icons/root_fossil.4bpp.lz"); const u32 gItemIconPalette_HoennFossil[] = INCBIN_U32("graphics/items/icon_palettes/hoenn_fossil.gbapal.lz"); const u32 gItemIcon_ClawFossil[] = INCBIN_U32("graphics/items/icons/claw_fossil.4bpp.lz"); const u32 gItemIcon_DevonScope[] = INCBIN_U32("graphics/items/icons/devon_scope.4bpp.lz"); const u32 gItemIconPalette_DevonScope[] = INCBIN_U32("graphics/items/icon_palettes/devon_scope.gbapal.lz"); // TMs/HMs const u32 gItemIcon_TMHM[] = INCBIN_U32("graphics/items/icons/tm_hm.4bpp.lz"); const u32 gItemIconPalette_FightingTMHM[] = INCBIN_U32("graphics/items/icon_palettes/fighting_tm_hm.gbapal.lz"); const u32 gItemIconPalette_DragonTMHM[] = INCBIN_U32("graphics/items/icon_palettes/dragon_tm_hm.gbapal.lz"); const u32 gItemIconPalette_WaterTMHM[] = INCBIN_U32("graphics/items/icon_palettes/water_tm_hm.gbapal.lz"); const u32 gItemIconPalette_PsychicTMHM[] = INCBIN_U32("graphics/items/icon_palettes/psychic_tm_hm.gbapal.lz"); const u32 gItemIconPalette_NormalTMHM[] = INCBIN_U32("graphics/items/icon_palettes/normal_tm_hm.gbapal.lz"); const u32 gItemIconPalette_PoisonTMHM[] = INCBIN_U32("graphics/items/icon_palettes/poison_tm_hm.gbapal.lz"); const u32 gItemIconPalette_IceTMHM[] = INCBIN_U32("graphics/items/icon_palettes/ice_tm_hm.gbapal.lz"); const u32 gItemIconPalette_GrassTMHM[] = INCBIN_U32("graphics/items/icon_palettes/grass_tm_hm.gbapal.lz"); const u32 gItemIconPalette_FireTMHM[] = INCBIN_U32("graphics/items/icon_palettes/fire_tm_hm.gbapal.lz"); const u32 gItemIconPalette_DarkTMHM[] = INCBIN_U32("graphics/items/icon_palettes/dark_tm_hm.gbapal.lz"); const u32 gItemIconPalette_SteelTMHM[] = INCBIN_U32("graphics/items/icon_palettes/steel_tm_hm.gbapal.lz"); const u32 gItemIconPalette_ElectricTMHM[] = INCBIN_U32("graphics/items/icon_palettes/electric_tm_hm.gbapal.lz"); const u32 gItemIconPalette_GroundTMHM[] = INCBIN_U32("graphics/items/icon_palettes/ground_tm_hm.gbapal.lz"); const u32 gItemIconPalette_GhostTMHM[] = INCBIN_U32("graphics/items/icon_palettes/ghost_tm_hm.gbapal.lz"); const u32 gItemIconPalette_RockTMHM[] = INCBIN_U32("graphics/items/icon_palettes/rock_tm_hm.gbapal.lz"); const u32 gItemIconPalette_FlyingTMHM[] = INCBIN_U32("graphics/items/icon_palettes/flying_tm_hm.gbapal.lz"); // FireRed/LeafGreen key items const u32 gItemIcon_OaksParcel[] = INCBIN_U32("graphics/items/icons/oaks_parcel.4bpp.lz"); const u32 gItemIconPalette_OaksParcel[] = INCBIN_U32("graphics/items/icon_palettes/oaks_parcel.gbapal.lz"); const u32 gItemIcon_PokeFlute[] = INCBIN_U32("graphics/items/icons/poke_flute.4bpp.lz"); const u32 gItemIconPalette_PokeFlute[] = INCBIN_U32("graphics/items/icon_palettes/poke_flute.gbapal.lz"); const u32 gItemIcon_SecretKey[] = INCBIN_U32("graphics/items/icons/secret_key.4bpp.lz"); const u32 gItemIconPalette_SecretKey[] = INCBIN_U32("graphics/items/icon_palettes/secret_key.gbapal.lz"); const u32 gItemIcon_BikeVoucher[] = INCBIN_U32("graphics/items/icons/bike_voucher.4bpp.lz"); const u32 gItemIconPalette_BikeVoucher[] = INCBIN_U32("graphics/items/icon_palettes/bike_voucher.gbapal.lz"); const u32 gItemIcon_GoldTeeth[] = INCBIN_U32("graphics/items/icons/gold_teeth.4bpp.lz"); const u32 gItemIconPalette_GoldTeeth[] = INCBIN_U32("graphics/items/icon_palettes/gold_teeth.gbapal.lz"); const u32 gItemIcon_OldAmber[] = INCBIN_U32("graphics/items/icons/old_amber.4bpp.lz"); const u32 gItemIconPalette_OldAmber[] = INCBIN_U32("graphics/items/icon_palettes/old_amber.gbapal.lz"); const u32 gItemIcon_CardKey[] = INCBIN_U32("graphics/items/icons/card_key.4bpp.lz"); const u32 gItemIconPalette_CardKey[] = INCBIN_U32("graphics/items/icon_palettes/card_key.gbapal.lz"); const u32 gItemIcon_LiftKey[] = INCBIN_U32("graphics/items/icons/lift_key.4bpp.lz"); const u32 gItemIconPalette_Key[] = INCBIN_U32("graphics/items/icon_palettes/key.gbapal.lz"); const u32 gItemIcon_HelixFossil[] = INCBIN_U32("graphics/items/icons/helix_fossil.4bpp.lz"); const u32 gItemIconPalette_KantoFossil[] = INCBIN_U32("graphics/items/icon_palettes/kanto_fossil.gbapal.lz"); const u32 gItemIcon_DomeFossil[] = INCBIN_U32("graphics/items/icons/dome_fossil.4bpp.lz"); const u32 gItemIcon_SilphScope[] = INCBIN_U32("graphics/items/icons/silph_scope.4bpp.lz"); const u32 gItemIconPalette_SilphScope[] = INCBIN_U32("graphics/items/icon_palettes/silph_scope.gbapal.lz"); const u32 gItemIcon_Bicycle[] = INCBIN_U32("graphics/items/icons/bicycle.4bpp.lz"); const u32 gItemIconPalette_Bicycle[] = INCBIN_U32("graphics/items/icon_palettes/bicycle.gbapal.lz"); const u32 gItemIcon_TownMap[] = INCBIN_U32("graphics/items/icons/town_map.4bpp.lz"); const u32 gItemIconPalette_TownMap[] = INCBIN_U32("graphics/items/icon_palettes/town_map.gbapal.lz"); const u32 gItemIcon_VSSeeker[] = INCBIN_U32("graphics/items/icons/vs_seeker.4bpp.lz"); const u32 gItemIconPalette_VSSeeker[] = INCBIN_U32("graphics/items/icon_palettes/vs_seeker.gbapal.lz"); const u32 gItemIcon_FameChecker[] = INCBIN_U32("graphics/items/icons/fame_checker.4bpp.lz"); const u32 gItemIconPalette_FameChecker[] = INCBIN_U32("graphics/items/icon_palettes/fame_checker.gbapal.lz"); const u32 gItemIcon_TMCase[] = INCBIN_U32("graphics/items/icons/tm_case.4bpp.lz"); const u32 gItemIconPalette_TMCase[] = INCBIN_U32("graphics/items/icon_palettes/tm_case.gbapal.lz"); const u32 gItemIcon_BerryPouch[] = INCBIN_U32("graphics/items/icons/berry_pouch.4bpp.lz"); const u32 gItemIconPalette_BerryPouch[] = INCBIN_U32("graphics/items/icon_palettes/berry_pouch.gbapal.lz"); const u32 gItemIcon_TeachyTV[] = INCBIN_U32("graphics/items/icons/teachy_tv.4bpp.lz"); const u32 gItemIconPalette_TeachyTV[] = INCBIN_U32("graphics/items/icon_palettes/teachy_tv.gbapal.lz"); const u32 gItemIcon_TriPass[] = INCBIN_U32("graphics/items/icons/tri_pass.4bpp.lz"); const u32 gItemIconPalette_TriPass[] = INCBIN_U32("graphics/items/icon_palettes/tri_pass.gbapal.lz"); const u32 gItemIcon_RainbowPass[] = INCBIN_U32("graphics/items/icons/rainbow_pass.4bpp.lz"); const u32 gItemIconPalette_RainbowPass[] = INCBIN_U32("graphics/items/icon_palettes/rainbow_pass.gbapal.lz"); const u32 gItemIcon_Tea[] = INCBIN_U32("graphics/items/icons/tea.4bpp.lz"); const u32 gItemIconPalette_Tea[] = INCBIN_U32("graphics/items/icon_palettes/tea.gbapal.lz"); const u32 gItemIcon_MysticTicket[] = INCBIN_U32("graphics/items/icons/mystic_ticket.4bpp.lz"); const u32 gItemIconPalette_MysticTicket[] = INCBIN_U32("graphics/items/icon_palettes/mystic_ticket.gbapal.lz"); const u32 gItemIcon_AuroraTicket[] = INCBIN_U32("graphics/items/icons/aurora_ticket.4bpp.lz"); const u32 gItemIconPalette_AuroraTicket[] = INCBIN_U32("graphics/items/icon_palettes/aurora_ticket.gbapal.lz"); const u32 gItemIcon_PowderJar[] = INCBIN_U32("graphics/items/icons/powder_jar.4bpp.lz"); const u32 gItemIconPalette_PowderJar[] = INCBIN_U32("graphics/items/icon_palettes/powder_jar.gbapal.lz"); const u32 gItemIconPalette_Ruby[] = INCBIN_U32("graphics/items/icon_palettes/ruby.gbapal.lz"); const u32 gItemIcon_Gem[] = INCBIN_U32("graphics/items/icons/gem.4bpp.lz"); const u32 gItemIconPalette_Sapphire[] = INCBIN_U32("graphics/items/icon_palettes/sapphire.gbapal.lz"); const u32 gItemIcon_MagmaEmblem[] = INCBIN_U32("graphics/items/icons/magma_emblem.4bpp.lz"); const u32 gItemIconPalette_MagmaEmblem[] = INCBIN_U32("graphics/items/icon_palettes/magma_emblem.gbapal.lz"); const u32 gItemIcon_OldSeaMap[] = INCBIN_U32("graphics/items/icons/old_sea_map.4bpp.lz"); const u32 gItemIconPalette_OldSeaMap[] = INCBIN_U32("graphics/items/icon_palettes/old_sea_map.gbapal.lz"); const u32 gItemIcon_LinkBracelet[] = INCBIN_U32("graphics/items/icons/link_bracelet.4bpp.lz"); const u32 gItemIconPalette_LinkBracelet[] = INCBIN_U32("graphics/items/icon_palettes/link_bracelet.gbapal.lz"); ================================================ FILE: src/data/graphics/mail.h ================================================ const u16 gFile_graphics_mail_orange_palette_pal[] = INCBIN_U16("graphics/mail/orange/palette.gbapal"); const u16 gFile_graphics_mail_harbor_palette_pal[] = INCBIN_U16("graphics/mail/harbor/palette.gbapal"); const u16 gFile_graphics_mail_glitter_palette_pal[] = INCBIN_U16("graphics/mail/glitter/palette.gbapal"); const u16 gFile_graphics_mail_mech_palette_pal[] = INCBIN_U16("graphics/mail/mech/palette.gbapal"); const u16 gFile_graphics_mail_wood_palette_pal[] = INCBIN_U16("graphics/mail/wood/palette.gbapal"); const u16 gFile_graphics_mail_wave_palette_pal[] = INCBIN_U16("graphics/mail/wave/palette.gbapal"); const u16 gFile_graphics_mail_bead_palette_pal[] = INCBIN_U16("graphics/mail/bead/palette.gbapal"); const u16 gFile_graphics_mail_shadow_palette_pal[] = INCBIN_U16("graphics/mail/shadow/palette.gbapal"); const u16 gFile_graphics_mail_tropic_palette_pal[] = INCBIN_U16("graphics/mail/tropic/palette.gbapal"); const u16 gFile_graphics_mail_dream_palette_pal[] = INCBIN_U16("graphics/mail/dream/palette.gbapal"); const u16 gFile_graphics_mail_fab_palette_pal[] = INCBIN_U16("graphics/mail/fab/palette.gbapal"); const u16 gFile_graphics_mail_retro_palette_pal[] = INCBIN_U16("graphics/mail/retro/palette.gbapal"); const u32 gFile_graphics_mail_orange_tiles_sheet[] = INCBIN_U32("graphics/mail/orange/tiles.4bpp.lz"); const u32 gFile_graphics_mail_harbor_tiles_sheet[] = INCBIN_U32("graphics/mail/harbor/tiles.4bpp.lz"); const u32 gFile_graphics_mail_glitter_tiles_sheet[] = INCBIN_U32("graphics/mail/glitter/tiles.4bpp.lz"); const u32 gFile_graphics_mail_mech_tiles_sheet[] = INCBIN_U32("graphics/mail/mech/tiles.4bpp.lz"); const u32 gFile_graphics_mail_wood_tiles_sheet[] = INCBIN_U32("graphics/mail/wood/tiles.4bpp.lz"); const u32 gFile_graphics_mail_wave_tiles_sheet[] = INCBIN_U32("graphics/mail/wave/tiles.4bpp.lz"); const u32 gFile_graphics_mail_bead_tiles_sheet[] = INCBIN_U32("graphics/mail/bead/tiles.4bpp.lz"); const u32 gFile_graphics_mail_shadow_tiles_sheet[] = INCBIN_U32("graphics/mail/shadow/tiles.4bpp.lz"); const u32 gFile_graphics_mail_tropic_tiles_sheet[] = INCBIN_U32("graphics/mail/tropic/tiles.4bpp.lz"); const u32 gFile_graphics_mail_dream_tiles_sheet[] = INCBIN_U32("graphics/mail/dream/tiles.4bpp.lz"); const u32 gFile_graphics_mail_fab_tiles_sheet[] = INCBIN_U32("graphics/mail/fab/tiles.4bpp.lz"); const u32 gFile_graphics_mail_retro_tiles_sheet[] = INCBIN_U32("graphics/mail/retro/tiles.4bpp.lz"); const u32 gFile_graphics_mail_orange_map_tilemap[] = INCBIN_U32("graphics/mail/orange/map.bin.lz"); const u32 gFile_graphics_mail_harbor_map_tilemap[] = INCBIN_U32("graphics/mail/harbor/map.bin.lz"); const u32 gFile_graphics_mail_glitter_map_tilemap[] = INCBIN_U32("graphics/mail/glitter/map.bin.lz"); const u32 gFile_graphics_mail_mech_map_tilemap[] = INCBIN_U32("graphics/mail/mech/map.bin.lz"); const u32 gFile_graphics_mail_wood_map_tilemap[] = INCBIN_U32("graphics/mail/wood/map.bin.lz"); const u32 gFile_graphics_mail_wave_map_tilemap[] = INCBIN_U32("graphics/mail/wave/map.bin.lz"); const u32 gFile_graphics_mail_bead_map_tilemap[] = INCBIN_U32("graphics/mail/bead/map.bin.lz"); const u32 gFile_graphics_mail_shadow_map_tilemap[] = INCBIN_U32("graphics/mail/shadow/map.bin.lz"); const u32 gFile_graphics_mail_tropic_map_tilemap[] = INCBIN_U32("graphics/mail/tropic/map.bin.lz"); const u32 gFile_graphics_mail_dream_map_tilemap[] = INCBIN_U32("graphics/mail/dream/map.bin.lz"); const u32 gFile_graphics_mail_fab_map_tilemap[] = INCBIN_U32("graphics/mail/fab/map.bin.lz"); const u32 gFile_graphics_mail_retro_map_tilemap[] = INCBIN_U32("graphics/mail/retro/map.bin.lz"); ================================================ FILE: src/data/graphics/pokemon.h ================================================ const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/front.4bpp.lz"); const u32 gMonPalette_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/normal.gbapal.lz"); const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back.4bpp.lz"); const u32 gMonShinyPalette_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/shiny.gbapal.lz"); const u8 gMonIcon_Bulbasaur[] = INCBIN_U8("graphics/pokemon/bulbasaur/icon.4bpp"); const u8 gMonFootprint_Bulbasaur[] = INCBIN_U8("graphics/pokemon/bulbasaur/footprint.1bpp"); const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/front.4bpp.lz"); const u32 gMonPalette_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/normal.gbapal.lz"); const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back.4bpp.lz"); const u32 gMonShinyPalette_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/shiny.gbapal.lz"); const u8 gMonIcon_Ivysaur[] = INCBIN_U8("graphics/pokemon/ivysaur/icon.4bpp"); const u8 gMonFootprint_Ivysaur[] = INCBIN_U8("graphics/pokemon/ivysaur/footprint.1bpp"); const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/front.4bpp.lz"); const u32 gMonPalette_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/normal.gbapal.lz"); const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back.4bpp.lz"); const u32 gMonShinyPalette_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/shiny.gbapal.lz"); const u8 gMonIcon_Venusaur[] = INCBIN_U8("graphics/pokemon/venusaur/icon.4bpp"); const u8 gMonFootprint_Venusaur[] = INCBIN_U8("graphics/pokemon/venusaur/footprint.1bpp"); const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/front.4bpp.lz"); const u32 gMonPalette_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/normal.gbapal.lz"); const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back.4bpp.lz"); const u32 gMonShinyPalette_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/shiny.gbapal.lz"); const u8 gMonIcon_Charmander[] = INCBIN_U8("graphics/pokemon/charmander/icon.4bpp"); const u8 gMonFootprint_Charmander[] = INCBIN_U8("graphics/pokemon/charmander/footprint.1bpp"); const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/front.4bpp.lz"); const u32 gMonPalette_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/normal.gbapal.lz"); const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back.4bpp.lz"); const u32 gMonShinyPalette_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/shiny.gbapal.lz"); const u8 gMonIcon_Charmeleon[] = INCBIN_U8("graphics/pokemon/charmeleon/icon.4bpp"); const u8 gMonFootprint_Charmeleon[] = INCBIN_U8("graphics/pokemon/charmeleon/footprint.1bpp"); const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/front.4bpp.lz"); const u32 gMonPalette_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/normal.gbapal.lz"); const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back.4bpp.lz"); const u32 gMonShinyPalette_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/shiny.gbapal.lz"); const u8 gMonIcon_Charizard[] = INCBIN_U8("graphics/pokemon/charizard/icon.4bpp"); const u8 gMonFootprint_Charizard[] = INCBIN_U8("graphics/pokemon/charizard/footprint.1bpp"); const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/front.4bpp.lz"); const u32 gMonPalette_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/normal.gbapal.lz"); const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back.4bpp.lz"); const u32 gMonShinyPalette_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/shiny.gbapal.lz"); const u8 gMonIcon_Squirtle[] = INCBIN_U8("graphics/pokemon/squirtle/icon.4bpp"); const u8 gMonFootprint_Squirtle[] = INCBIN_U8("graphics/pokemon/squirtle/footprint.1bpp"); const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/front.4bpp.lz"); const u32 gMonPalette_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/normal.gbapal.lz"); const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back.4bpp.lz"); const u32 gMonShinyPalette_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/shiny.gbapal.lz"); const u8 gMonIcon_Wartortle[] = INCBIN_U8("graphics/pokemon/wartortle/icon.4bpp"); const u8 gMonFootprint_Wartortle[] = INCBIN_U8("graphics/pokemon/wartortle/footprint.1bpp"); const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/front.4bpp.lz"); const u32 gMonPalette_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/normal.gbapal.lz"); const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back.4bpp.lz"); const u32 gMonShinyPalette_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/shiny.gbapal.lz"); const u8 gMonIcon_Blastoise[] = INCBIN_U8("graphics/pokemon/blastoise/icon.4bpp"); const u8 gMonFootprint_Blastoise[] = INCBIN_U8("graphics/pokemon/blastoise/footprint.1bpp"); const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/front.4bpp.lz"); const u32 gMonPalette_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/normal.gbapal.lz"); const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back.4bpp.lz"); const u32 gMonShinyPalette_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/shiny.gbapal.lz"); const u8 gMonIcon_Caterpie[] = INCBIN_U8("graphics/pokemon/caterpie/icon.4bpp"); const u8 gMonFootprint_Caterpie[] = INCBIN_U8("graphics/pokemon/caterpie/footprint.1bpp"); const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/front.4bpp.lz"); const u32 gMonPalette_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/normal.gbapal.lz"); const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back.4bpp.lz"); const u32 gMonShinyPalette_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/shiny.gbapal.lz"); const u8 gMonIcon_Metapod[] = INCBIN_U8( "graphics/pokemon/metapod/icon.4bpp"); const u8 gMonFootprint_Metapod[] = INCBIN_U8("graphics/pokemon/metapod/footprint.1bpp"); const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/front.4bpp.lz"); const u32 gMonPalette_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/normal.gbapal.lz"); const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back.4bpp.lz"); const u32 gMonShinyPalette_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/shiny.gbapal.lz"); const u8 gMonIcon_Butterfree[] = INCBIN_U8("graphics/pokemon/butterfree/icon.4bpp"); const u8 gMonFootprint_Butterfree[] = INCBIN_U8("graphics/pokemon/butterfree/footprint.1bpp"); const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/front.4bpp.lz"); const u32 gMonPalette_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/normal.gbapal.lz"); const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back.4bpp.lz"); const u32 gMonShinyPalette_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/shiny.gbapal.lz"); const u8 gMonIcon_Weedle[] = INCBIN_U8("graphics/pokemon/weedle/icon.4bpp"); const u8 gMonFootprint_Weedle[] = INCBIN_U8("graphics/pokemon/weedle/footprint.1bpp"); const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/front.4bpp.lz"); const u32 gMonPalette_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/normal.gbapal.lz"); const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back.4bpp.lz"); const u32 gMonShinyPalette_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/shiny.gbapal.lz"); const u8 gMonIcon_Kakuna[] = INCBIN_U8("graphics/pokemon/kakuna/icon.4bpp"); const u8 gMonFootprint_Kakuna[] = INCBIN_U8("graphics/pokemon/kakuna/footprint.1bpp"); const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/front.4bpp.lz"); const u32 gMonPalette_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/normal.gbapal.lz"); const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back.4bpp.lz"); const u32 gMonShinyPalette_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/shiny.gbapal.lz"); const u8 gMonIcon_Beedrill[] = INCBIN_U8("graphics/pokemon/beedrill/icon.4bpp"); const u8 gMonFootprint_Beedrill[] = INCBIN_U8("graphics/pokemon/beedrill/footprint.1bpp"); const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/front.4bpp.lz"); const u32 gMonPalette_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/normal.gbapal.lz"); const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back.4bpp.lz"); const u32 gMonShinyPalette_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/shiny.gbapal.lz"); const u8 gMonIcon_Pidgey[] = INCBIN_U8("graphics/pokemon/pidgey/icon.4bpp"); const u8 gMonFootprint_Pidgey[] = INCBIN_U8("graphics/pokemon/pidgey/footprint.1bpp"); const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/front.4bpp.lz"); const u32 gMonPalette_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/normal.gbapal.lz"); const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back.4bpp.lz"); const u32 gMonShinyPalette_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/shiny.gbapal.lz"); const u8 gMonIcon_Pidgeotto[] = INCBIN_U8("graphics/pokemon/pidgeotto/icon.4bpp"); const u8 gMonFootprint_Pidgeotto[] = INCBIN_U8("graphics/pokemon/pidgeotto/footprint.1bpp"); const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/front.4bpp.lz"); const u32 gMonPalette_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/normal.gbapal.lz"); const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back.4bpp.lz"); const u32 gMonShinyPalette_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/shiny.gbapal.lz"); const u8 gMonIcon_Pidgeot[] = INCBIN_U8("graphics/pokemon/pidgeot/icon.4bpp"); const u8 gMonFootprint_Pidgeot[] = INCBIN_U8("graphics/pokemon/pidgeot/footprint.1bpp"); const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/front.4bpp.lz"); const u32 gMonPalette_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/normal.gbapal.lz"); const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back.4bpp.lz"); const u32 gMonShinyPalette_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/shiny.gbapal.lz"); const u8 gMonIcon_Rattata[] = INCBIN_U8("graphics/pokemon/rattata/icon.4bpp"); const u8 gMonFootprint_Rattata[] = INCBIN_U8("graphics/pokemon/rattata/footprint.1bpp"); const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/front.4bpp.lz"); const u32 gMonPalette_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/normal.gbapal.lz"); const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back.4bpp.lz"); const u32 gMonShinyPalette_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/shiny.gbapal.lz"); const u8 gMonIcon_Raticate[] = INCBIN_U8("graphics/pokemon/raticate/icon.4bpp"); const u8 gMonFootprint_Raticate[] = INCBIN_U8("graphics/pokemon/raticate/footprint.1bpp"); const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/front.4bpp.lz"); const u32 gMonPalette_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/normal.gbapal.lz"); const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back.4bpp.lz"); const u32 gMonShinyPalette_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/shiny.gbapal.lz"); const u8 gMonIcon_Spearow[] = INCBIN_U8("graphics/pokemon/spearow/icon.4bpp"); const u8 gMonFootprint_Spearow[] = INCBIN_U8("graphics/pokemon/spearow/footprint.1bpp"); const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/front.4bpp.lz"); const u32 gMonPalette_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/normal.gbapal.lz"); const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back.4bpp.lz"); const u32 gMonShinyPalette_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/shiny.gbapal.lz"); const u8 gMonIcon_Fearow[] = INCBIN_U8("graphics/pokemon/fearow/icon.4bpp"); const u8 gMonFootprint_Fearow[] = INCBIN_U8("graphics/pokemon/fearow/footprint.1bpp"); const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/front.4bpp.lz"); const u32 gMonPalette_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/normal.gbapal.lz"); const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back.4bpp.lz"); const u32 gMonShinyPalette_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/shiny.gbapal.lz"); const u8 gMonIcon_Ekans[] = INCBIN_U8("graphics/pokemon/ekans/icon.4bpp"); const u8 gMonFootprint_Ekans[] = INCBIN_U8("graphics/pokemon/ekans/footprint.1bpp"); const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/front.4bpp.lz"); const u32 gMonPalette_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/normal.gbapal.lz"); const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back.4bpp.lz"); const u32 gMonShinyPalette_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/shiny.gbapal.lz"); const u8 gMonIcon_Arbok[] = INCBIN_U8("graphics/pokemon/arbok/icon.4bpp"); const u8 gMonFootprint_Arbok[] = INCBIN_U8("graphics/pokemon/arbok/footprint.1bpp"); const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/front.4bpp.lz"); const u32 gMonPalette_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/normal.gbapal.lz"); const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back.4bpp.lz"); const u32 gMonShinyPalette_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/shiny.gbapal.lz"); const u8 gMonIcon_Pikachu[] = INCBIN_U8("graphics/pokemon/pikachu/icon.4bpp"); const u8 gMonFootprint_Pikachu[] = INCBIN_U8("graphics/pokemon/pikachu/footprint.1bpp"); const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/front.4bpp.lz"); const u32 gMonPalette_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/normal.gbapal.lz"); const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back.4bpp.lz"); const u32 gMonShinyPalette_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/shiny.gbapal.lz"); const u8 gMonIcon_Raichu[] = INCBIN_U8("graphics/pokemon/raichu/icon.4bpp"); const u8 gMonFootprint_Raichu[] = INCBIN_U8("graphics/pokemon/raichu/footprint.1bpp"); const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/front.4bpp.lz"); const u32 gMonPalette_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/normal.gbapal.lz"); const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back.4bpp.lz"); const u32 gMonShinyPalette_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/shiny.gbapal.lz"); const u8 gMonIcon_Sandshrew[] = INCBIN_U8("graphics/pokemon/sandshrew/icon.4bpp"); const u8 gMonFootprint_Sandshrew[] = INCBIN_U8("graphics/pokemon/sandshrew/footprint.1bpp"); const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/front.4bpp.lz"); const u32 gMonPalette_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/normal.gbapal.lz"); const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back.4bpp.lz"); const u32 gMonShinyPalette_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/shiny.gbapal.lz"); const u8 gMonIcon_Sandslash[] = INCBIN_U8("graphics/pokemon/sandslash/icon.4bpp"); const u8 gMonFootprint_Sandslash[] = INCBIN_U8("graphics/pokemon/sandslash/footprint.1bpp"); const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/front.4bpp.lz"); const u32 gMonPalette_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/normal.gbapal.lz"); const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back.4bpp.lz"); const u32 gMonShinyPalette_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/shiny.gbapal.lz"); const u8 gMonIcon_NidoranF[] = INCBIN_U8("graphics/pokemon/nidoran_f/icon.4bpp"); const u8 gMonFootprint_NidoranF[] = INCBIN_U8("graphics/pokemon/nidoran_f/footprint.1bpp"); const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/front.4bpp.lz"); const u32 gMonPalette_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/normal.gbapal.lz"); const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back.4bpp.lz"); const u32 gMonShinyPalette_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/shiny.gbapal.lz"); const u8 gMonIcon_Nidorina[] = INCBIN_U8("graphics/pokemon/nidorina/icon.4bpp"); const u8 gMonFootprint_Nidorina[] = INCBIN_U8("graphics/pokemon/nidorina/footprint.1bpp"); const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/front.4bpp.lz"); const u32 gMonPalette_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/normal.gbapal.lz"); const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back.4bpp.lz"); const u32 gMonShinyPalette_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/shiny.gbapal.lz"); const u8 gMonIcon_Nidoqueen[] = INCBIN_U8("graphics/pokemon/nidoqueen/icon.4bpp"); const u8 gMonFootprint_Nidoqueen[] = INCBIN_U8("graphics/pokemon/nidoqueen/footprint.1bpp"); const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/front.4bpp.lz"); const u32 gMonPalette_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/normal.gbapal.lz"); const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back.4bpp.lz"); const u32 gMonShinyPalette_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/shiny.gbapal.lz"); const u8 gMonIcon_NidoranM[] = INCBIN_U8("graphics/pokemon/nidoran_m/icon.4bpp"); const u8 gMonFootprint_NidoranM[] = INCBIN_U8("graphics/pokemon/nidoran_m/footprint.1bpp"); const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/front.4bpp.lz"); const u32 gMonPalette_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/normal.gbapal.lz"); const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back.4bpp.lz"); const u32 gMonShinyPalette_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/shiny.gbapal.lz"); const u8 gMonIcon_Nidorino[] = INCBIN_U8("graphics/pokemon/nidorino/icon.4bpp"); const u8 gMonFootprint_Nidorino[] = INCBIN_U8("graphics/pokemon/nidorino/footprint.1bpp"); const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/front.4bpp.lz"); const u32 gMonPalette_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/normal.gbapal.lz"); const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back.4bpp.lz"); const u32 gMonShinyPalette_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/shiny.gbapal.lz"); const u8 gMonIcon_Nidoking[] = INCBIN_U8("graphics/pokemon/nidoking/icon.4bpp"); const u8 gMonFootprint_Nidoking[] = INCBIN_U8("graphics/pokemon/nidoking/footprint.1bpp"); const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/front.4bpp.lz"); const u32 gMonPalette_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/normal.gbapal.lz"); const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back.4bpp.lz"); const u32 gMonShinyPalette_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/shiny.gbapal.lz"); const u8 gMonIcon_Clefairy[] = INCBIN_U8("graphics/pokemon/clefairy/icon.4bpp"); const u8 gMonFootprint_Clefairy[] = INCBIN_U8("graphics/pokemon/clefairy/footprint.1bpp"); const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/front.4bpp.lz"); const u32 gMonPalette_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/normal.gbapal.lz"); const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back.4bpp.lz"); const u32 gMonShinyPalette_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/shiny.gbapal.lz"); const u8 gMonIcon_Clefable[] = INCBIN_U8("graphics/pokemon/clefable/icon.4bpp"); const u8 gMonFootprint_Clefable[] = INCBIN_U8("graphics/pokemon/clefable/footprint.1bpp"); const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/front.4bpp.lz"); const u32 gMonPalette_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/normal.gbapal.lz"); const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back.4bpp.lz"); const u32 gMonShinyPalette_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/shiny.gbapal.lz"); const u8 gMonIcon_Vulpix[] = INCBIN_U8("graphics/pokemon/vulpix/icon.4bpp"); const u8 gMonFootprint_Vulpix[] = INCBIN_U8("graphics/pokemon/vulpix/footprint.1bpp"); const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/front.4bpp.lz"); const u32 gMonPalette_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/normal.gbapal.lz"); const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back.4bpp.lz"); const u32 gMonShinyPalette_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/shiny.gbapal.lz"); const u8 gMonIcon_Ninetales[] = INCBIN_U8("graphics/pokemon/ninetales/icon.4bpp"); const u8 gMonFootprint_Ninetales[] = INCBIN_U8("graphics/pokemon/ninetales/footprint.1bpp"); const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/front.4bpp.lz"); const u32 gMonPalette_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/normal.gbapal.lz"); const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back.4bpp.lz"); const u32 gMonShinyPalette_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/shiny.gbapal.lz"); const u8 gMonIcon_Jigglypuff[] = INCBIN_U8("graphics/pokemon/jigglypuff/icon.4bpp"); const u8 gMonFootprint_Jigglypuff[] = INCBIN_U8("graphics/pokemon/jigglypuff/footprint.1bpp"); const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/front.4bpp.lz"); const u32 gMonPalette_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/normal.gbapal.lz"); const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back.4bpp.lz"); const u32 gMonShinyPalette_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/shiny.gbapal.lz"); const u8 gMonIcon_Wigglytuff[] = INCBIN_U8("graphics/pokemon/wigglytuff/icon.4bpp"); const u8 gMonFootprint_Wigglytuff[] = INCBIN_U8("graphics/pokemon/wigglytuff/footprint.1bpp"); const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/front.4bpp.lz"); const u32 gMonPalette_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/normal.gbapal.lz"); const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back.4bpp.lz"); const u32 gMonShinyPalette_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/shiny.gbapal.lz"); const u8 gMonIcon_Zubat[] = INCBIN_U8("graphics/pokemon/zubat/icon.4bpp"); const u8 gMonFootprint_Zubat[] = INCBIN_U8("graphics/pokemon/zubat/footprint.1bpp"); const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/front.4bpp.lz"); const u32 gMonPalette_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/normal.gbapal.lz"); const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back.4bpp.lz"); const u32 gMonShinyPalette_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/shiny.gbapal.lz"); const u8 gMonIcon_Golbat[] = INCBIN_U8("graphics/pokemon/golbat/icon.4bpp"); const u8 gMonFootprint_Golbat[] = INCBIN_U8("graphics/pokemon/golbat/footprint.1bpp"); const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/front.4bpp.lz"); const u32 gMonPalette_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/normal.gbapal.lz"); const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back.4bpp.lz"); const u32 gMonShinyPalette_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/shiny.gbapal.lz"); const u8 gMonIcon_Oddish[] = INCBIN_U8("graphics/pokemon/oddish/icon.4bpp"); const u8 gMonFootprint_Oddish[] = INCBIN_U8("graphics/pokemon/oddish/footprint.1bpp"); const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/front.4bpp.lz"); const u32 gMonPalette_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/normal.gbapal.lz"); const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back.4bpp.lz"); const u32 gMonShinyPalette_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/shiny.gbapal.lz"); const u8 gMonIcon_Gloom[] = INCBIN_U8("graphics/pokemon/gloom/icon.4bpp"); const u8 gMonFootprint_Gloom[] = INCBIN_U8("graphics/pokemon/gloom/footprint.1bpp"); const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/front.4bpp.lz"); const u32 gMonPalette_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/normal.gbapal.lz"); const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back.4bpp.lz"); const u32 gMonShinyPalette_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/shiny.gbapal.lz"); const u8 gMonIcon_Vileplume[] = INCBIN_U8("graphics/pokemon/vileplume/icon.4bpp"); const u8 gMonFootprint_Vileplume[] = INCBIN_U8("graphics/pokemon/vileplume/footprint.1bpp"); const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/front.4bpp.lz"); const u32 gMonPalette_Paras[] = INCBIN_U32("graphics/pokemon/paras/normal.gbapal.lz"); const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back.4bpp.lz"); const u32 gMonShinyPalette_Paras[] = INCBIN_U32("graphics/pokemon/paras/shiny.gbapal.lz"); const u8 gMonIcon_Paras[] = INCBIN_U8("graphics/pokemon/paras/icon.4bpp"); const u8 gMonFootprint_Paras[] = INCBIN_U8("graphics/pokemon/paras/footprint.1bpp"); const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/front.4bpp.lz"); const u32 gMonPalette_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/normal.gbapal.lz"); const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back.4bpp.lz"); const u32 gMonShinyPalette_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/shiny.gbapal.lz"); const u8 gMonIcon_Parasect[] = INCBIN_U8("graphics/pokemon/parasect/icon.4bpp"); const u8 gMonFootprint_Parasect[] = INCBIN_U8("graphics/pokemon/parasect/footprint.1bpp"); const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/front.4bpp.lz"); const u32 gMonPalette_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/normal.gbapal.lz"); const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back.4bpp.lz"); const u32 gMonShinyPalette_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/shiny.gbapal.lz"); const u8 gMonIcon_Venonat[] = INCBIN_U8("graphics/pokemon/venonat/icon.4bpp"); const u8 gMonFootprint_Venonat[] = INCBIN_U8("graphics/pokemon/venonat/footprint.1bpp"); const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/front.4bpp.lz"); const u32 gMonPalette_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/normal.gbapal.lz"); const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back.4bpp.lz"); const u32 gMonShinyPalette_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/shiny.gbapal.lz"); const u8 gMonIcon_Venomoth[] = INCBIN_U8("graphics/pokemon/venomoth/icon.4bpp"); const u8 gMonFootprint_Venomoth[] = INCBIN_U8("graphics/pokemon/venomoth/footprint.1bpp"); const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/front.4bpp.lz"); const u32 gMonPalette_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/normal.gbapal.lz"); const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back.4bpp.lz"); const u32 gMonShinyPalette_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/shiny.gbapal.lz"); const u8 gMonIcon_Diglett[] = INCBIN_U8("graphics/pokemon/diglett/icon.4bpp"); const u8 gMonFootprint_Diglett[] = INCBIN_U8("graphics/pokemon/diglett/footprint.1bpp"); const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/front.4bpp.lz"); const u32 gMonPalette_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/normal.gbapal.lz"); const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back.4bpp.lz"); const u32 gMonShinyPalette_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/shiny.gbapal.lz"); const u8 gMonIcon_Dugtrio[] = INCBIN_U8("graphics/pokemon/dugtrio/icon.4bpp"); const u8 gMonFootprint_Dugtrio[] = INCBIN_U8("graphics/pokemon/dugtrio/footprint.1bpp"); const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/front.4bpp.lz"); const u32 gMonPalette_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/normal.gbapal.lz"); const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back.4bpp.lz"); const u32 gMonShinyPalette_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/shiny.gbapal.lz"); const u8 gMonIcon_Meowth[] = INCBIN_U8("graphics/pokemon/meowth/icon.4bpp"); const u8 gMonFootprint_Meowth[] = INCBIN_U8("graphics/pokemon/meowth/footprint.1bpp"); const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/front.4bpp.lz"); const u32 gMonPalette_Persian[] = INCBIN_U32("graphics/pokemon/persian/normal.gbapal.lz"); const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back.4bpp.lz"); const u32 gMonShinyPalette_Persian[] = INCBIN_U32("graphics/pokemon/persian/shiny.gbapal.lz"); const u8 gMonIcon_Persian[] = INCBIN_U8("graphics/pokemon/persian/icon.4bpp"); const u8 gMonFootprint_Persian[] = INCBIN_U8("graphics/pokemon/persian/footprint.1bpp"); const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/front.4bpp.lz"); const u32 gMonPalette_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/normal.gbapal.lz"); const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back.4bpp.lz"); const u32 gMonShinyPalette_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/shiny.gbapal.lz"); const u8 gMonIcon_Psyduck[] = INCBIN_U8("graphics/pokemon/psyduck/icon.4bpp"); const u8 gMonFootprint_Psyduck[] = INCBIN_U8("graphics/pokemon/psyduck/footprint.1bpp"); const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/front.4bpp.lz"); const u32 gMonPalette_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/normal.gbapal.lz"); const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back.4bpp.lz"); const u32 gMonShinyPalette_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/shiny.gbapal.lz"); const u8 gMonIcon_Golduck[] = INCBIN_U8("graphics/pokemon/golduck/icon.4bpp"); const u8 gMonFootprint_Golduck[] = INCBIN_U8("graphics/pokemon/golduck/footprint.1bpp"); const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/front.4bpp.lz"); const u32 gMonPalette_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/normal.gbapal.lz"); const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back.4bpp.lz"); const u32 gMonShinyPalette_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/shiny.gbapal.lz"); const u8 gMonIcon_Mankey[] = INCBIN_U8("graphics/pokemon/mankey/icon.4bpp"); const u8 gMonFootprint_Mankey[] = INCBIN_U8("graphics/pokemon/mankey/footprint.1bpp"); const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/front.4bpp.lz"); const u32 gMonPalette_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/normal.gbapal.lz"); const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back.4bpp.lz"); const u32 gMonShinyPalette_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/shiny.gbapal.lz"); const u8 gMonIcon_Primeape[] = INCBIN_U8("graphics/pokemon/primeape/icon.4bpp"); const u8 gMonFootprint_Primeape[] = INCBIN_U8("graphics/pokemon/primeape/footprint.1bpp"); const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/front.4bpp.lz"); const u32 gMonPalette_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/normal.gbapal.lz"); const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back.4bpp.lz"); const u32 gMonShinyPalette_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/shiny.gbapal.lz"); const u8 gMonIcon_Growlithe[] = INCBIN_U8("graphics/pokemon/growlithe/icon.4bpp"); const u8 gMonFootprint_Growlithe[] = INCBIN_U8("graphics/pokemon/growlithe/footprint.1bpp"); const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/front.4bpp.lz"); const u32 gMonPalette_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/normal.gbapal.lz"); const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back.4bpp.lz"); const u32 gMonShinyPalette_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/shiny.gbapal.lz"); const u8 gMonIcon_Arcanine[] = INCBIN_U8("graphics/pokemon/arcanine/icon.4bpp"); const u8 gMonFootprint_Arcanine[] = INCBIN_U8("graphics/pokemon/arcanine/footprint.1bpp"); const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/front.4bpp.lz"); const u32 gMonPalette_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/normal.gbapal.lz"); const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back.4bpp.lz"); const u32 gMonShinyPalette_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/shiny.gbapal.lz"); const u8 gMonIcon_Poliwag[] = INCBIN_U8("graphics/pokemon/poliwag/icon.4bpp"); const u8 gMonFootprint_Poliwag[] = INCBIN_U8("graphics/pokemon/poliwag/footprint.1bpp"); const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/front.4bpp.lz"); const u32 gMonPalette_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/normal.gbapal.lz"); const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back.4bpp.lz"); const u32 gMonShinyPalette_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/shiny.gbapal.lz"); const u8 gMonIcon_Poliwhirl[] = INCBIN_U8("graphics/pokemon/poliwhirl/icon.4bpp"); const u8 gMonFootprint_Poliwhirl[] = INCBIN_U8("graphics/pokemon/poliwhirl/footprint.1bpp"); const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/front.4bpp.lz"); const u32 gMonPalette_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/normal.gbapal.lz"); const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back.4bpp.lz"); const u32 gMonShinyPalette_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/shiny.gbapal.lz"); const u8 gMonIcon_Poliwrath[] = INCBIN_U8("graphics/pokemon/poliwrath/icon.4bpp"); const u8 gMonFootprint_Poliwrath[] = INCBIN_U8("graphics/pokemon/poliwrath/footprint.1bpp"); const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/front.4bpp.lz"); const u32 gMonPalette_Abra[] = INCBIN_U32("graphics/pokemon/abra/normal.gbapal.lz"); const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back.4bpp.lz"); const u32 gMonShinyPalette_Abra[] = INCBIN_U32("graphics/pokemon/abra/shiny.gbapal.lz"); const u8 gMonIcon_Abra[] = INCBIN_U8("graphics/pokemon/abra/icon.4bpp"); const u8 gMonFootprint_Abra[] = INCBIN_U8("graphics/pokemon/abra/footprint.1bpp"); const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/front.4bpp.lz"); const u32 gMonPalette_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/normal.gbapal.lz"); const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back.4bpp.lz"); const u32 gMonShinyPalette_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/shiny.gbapal.lz"); const u8 gMonIcon_Kadabra[] = INCBIN_U8("graphics/pokemon/kadabra/icon.4bpp"); const u8 gMonFootprint_Kadabra[] = INCBIN_U8("graphics/pokemon/kadabra/footprint.1bpp"); const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/front.4bpp.lz"); const u32 gMonPalette_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/normal.gbapal.lz"); const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back.4bpp.lz"); const u32 gMonShinyPalette_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/shiny.gbapal.lz"); const u8 gMonIcon_Alakazam[] = INCBIN_U8("graphics/pokemon/alakazam/icon.4bpp"); const u8 gMonFootprint_Alakazam[] = INCBIN_U8("graphics/pokemon/alakazam/footprint.1bpp"); const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/front.4bpp.lz"); const u32 gMonPalette_Machop[] = INCBIN_U32("graphics/pokemon/machop/normal.gbapal.lz"); const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back.4bpp.lz"); const u32 gMonShinyPalette_Machop[] = INCBIN_U32("graphics/pokemon/machop/shiny.gbapal.lz"); const u8 gMonIcon_Machop[] = INCBIN_U8("graphics/pokemon/machop/icon.4bpp"); const u8 gMonFootprint_Machop[] = INCBIN_U8("graphics/pokemon/machop/footprint.1bpp"); const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/front.4bpp.lz"); const u32 gMonPalette_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/normal.gbapal.lz"); const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back.4bpp.lz"); const u32 gMonShinyPalette_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/shiny.gbapal.lz"); const u8 gMonIcon_Machoke[] = INCBIN_U8("graphics/pokemon/machoke/icon.4bpp"); const u8 gMonFootprint_Machoke[] = INCBIN_U8("graphics/pokemon/machoke/footprint.1bpp"); const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/front.4bpp.lz"); const u32 gMonPalette_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/normal.gbapal.lz"); const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back.4bpp.lz"); const u32 gMonShinyPalette_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/shiny.gbapal.lz"); const u8 gMonIcon_Machamp[] = INCBIN_U8("graphics/pokemon/machamp/icon.4bpp"); const u8 gMonFootprint_Machamp[] = INCBIN_U8("graphics/pokemon/machamp/footprint.1bpp"); const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/front.4bpp.lz"); const u32 gMonPalette_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/normal.gbapal.lz"); const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back.4bpp.lz"); const u32 gMonShinyPalette_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/shiny.gbapal.lz"); const u8 gMonIcon_Bellsprout[] = INCBIN_U8("graphics/pokemon/bellsprout/icon.4bpp"); const u8 gMonFootprint_Bellsprout[] = INCBIN_U8("graphics/pokemon/bellsprout/footprint.1bpp"); const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/front.4bpp.lz"); const u32 gMonPalette_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/normal.gbapal.lz"); const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back.4bpp.lz"); const u32 gMonShinyPalette_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/shiny.gbapal.lz"); const u8 gMonIcon_Weepinbell[] = INCBIN_U8("graphics/pokemon/weepinbell/icon.4bpp"); const u8 gMonFootprint_Weepinbell[] = INCBIN_U8("graphics/pokemon/weepinbell/footprint.1bpp"); const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/front.4bpp.lz"); const u32 gMonPalette_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/normal.gbapal.lz"); const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back.4bpp.lz"); const u32 gMonShinyPalette_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/shiny.gbapal.lz"); const u8 gMonIcon_Victreebel[] = INCBIN_U8("graphics/pokemon/victreebel/icon.4bpp"); const u8 gMonFootprint_Victreebel[] = INCBIN_U8("graphics/pokemon/victreebel/footprint.1bpp"); const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/front.4bpp.lz"); const u32 gMonPalette_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/normal.gbapal.lz"); const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back.4bpp.lz"); const u32 gMonShinyPalette_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/shiny.gbapal.lz"); const u8 gMonIcon_Tentacool[] = INCBIN_U8("graphics/pokemon/tentacool/icon.4bpp"); const u8 gMonFootprint_Tentacool[] = INCBIN_U8("graphics/pokemon/tentacool/footprint.1bpp"); const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/front.4bpp.lz"); const u32 gMonPalette_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/normal.gbapal.lz"); const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back.4bpp.lz"); const u32 gMonShinyPalette_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/shiny.gbapal.lz"); const u8 gMonIcon_Tentacruel[] = INCBIN_U8("graphics/pokemon/tentacruel/icon.4bpp"); const u8 gMonFootprint_Tentacruel[] = INCBIN_U8("graphics/pokemon/tentacruel/footprint.1bpp"); const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/front.4bpp.lz"); const u32 gMonPalette_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/normal.gbapal.lz"); const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back.4bpp.lz"); const u32 gMonShinyPalette_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/shiny.gbapal.lz"); const u8 gMonIcon_Geodude[] = INCBIN_U8("graphics/pokemon/geodude/icon.4bpp"); const u8 gMonFootprint_Geodude[] = INCBIN_U8("graphics/pokemon/geodude/footprint.1bpp"); const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/front.4bpp.lz"); const u32 gMonPalette_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/normal.gbapal.lz"); const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back.4bpp.lz"); const u32 gMonShinyPalette_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/shiny.gbapal.lz"); const u8 gMonIcon_Graveler[] = INCBIN_U8("graphics/pokemon/graveler/icon.4bpp"); const u8 gMonFootprint_Graveler[] = INCBIN_U8("graphics/pokemon/graveler/footprint.1bpp"); const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/front.4bpp.lz"); const u32 gMonPalette_Golem[] = INCBIN_U32("graphics/pokemon/golem/normal.gbapal.lz"); const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back.4bpp.lz"); const u32 gMonShinyPalette_Golem[] = INCBIN_U32("graphics/pokemon/golem/shiny.gbapal.lz"); const u8 gMonIcon_Golem[] = INCBIN_U8("graphics/pokemon/golem/icon.4bpp"); const u8 gMonFootprint_Golem[] = INCBIN_U8("graphics/pokemon/golem/footprint.1bpp"); const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/front.4bpp.lz"); const u32 gMonPalette_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/normal.gbapal.lz"); const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back.4bpp.lz"); const u32 gMonShinyPalette_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/shiny.gbapal.lz"); const u8 gMonIcon_Ponyta[] = INCBIN_U8("graphics/pokemon/ponyta/icon.4bpp"); const u8 gMonFootprint_Ponyta[] = INCBIN_U8("graphics/pokemon/ponyta/footprint.1bpp"); const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/front.4bpp.lz"); const u32 gMonPalette_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/normal.gbapal.lz"); const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back.4bpp.lz"); const u32 gMonShinyPalette_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/shiny.gbapal.lz"); const u8 gMonIcon_Rapidash[] = INCBIN_U8("graphics/pokemon/rapidash/icon.4bpp"); const u8 gMonFootprint_Rapidash[] = INCBIN_U8("graphics/pokemon/rapidash/footprint.1bpp"); const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/front.4bpp.lz"); const u32 gMonPalette_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/normal.gbapal.lz"); const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back.4bpp.lz"); const u32 gMonShinyPalette_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/shiny.gbapal.lz"); const u8 gMonIcon_Slowpoke[] = INCBIN_U8("graphics/pokemon/slowpoke/icon.4bpp"); const u8 gMonFootprint_Slowpoke[] = INCBIN_U8("graphics/pokemon/slowpoke/footprint.1bpp"); const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/front.4bpp.lz"); const u32 gMonPalette_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/normal.gbapal.lz"); const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back.4bpp.lz"); const u32 gMonShinyPalette_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/shiny.gbapal.lz"); const u8 gMonIcon_Slowbro[] = INCBIN_U8("graphics/pokemon/slowbro/icon.4bpp"); const u8 gMonFootprint_Slowbro[] = INCBIN_U8("graphics/pokemon/slowbro/footprint.1bpp"); const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/front.4bpp.lz"); const u32 gMonPalette_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/normal.gbapal.lz"); const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back.4bpp.lz"); const u32 gMonShinyPalette_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/shiny.gbapal.lz"); const u8 gMonIcon_Magnemite[] = INCBIN_U8("graphics/pokemon/magnemite/icon.4bpp"); const u8 gMonFootprint_Magnemite[] = INCBIN_U8("graphics/pokemon/magnemite/footprint.1bpp"); const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/front.4bpp.lz"); const u32 gMonPalette_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/normal.gbapal.lz"); const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back.4bpp.lz"); const u32 gMonShinyPalette_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/shiny.gbapal.lz"); const u8 gMonIcon_Magneton[] = INCBIN_U8("graphics/pokemon/magneton/icon.4bpp"); const u8 gMonFootprint_Magneton[] = INCBIN_U8("graphics/pokemon/magneton/footprint.1bpp"); const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/front.4bpp.lz"); const u32 gMonPalette_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/normal.gbapal.lz"); const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/back.4bpp.lz"); const u32 gMonShinyPalette_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/shiny.gbapal.lz"); const u8 gMonIcon_Farfetchd[] = INCBIN_U8("graphics/pokemon/farfetchd/icon.4bpp"); const u8 gMonFootprint_Farfetchd[] = INCBIN_U8("graphics/pokemon/farfetchd/footprint.1bpp"); const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/front.4bpp.lz"); const u32 gMonPalette_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/normal.gbapal.lz"); const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back.4bpp.lz"); const u32 gMonShinyPalette_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/shiny.gbapal.lz"); const u8 gMonIcon_Doduo[] = INCBIN_U8("graphics/pokemon/doduo/icon.4bpp"); const u8 gMonFootprint_Doduo[] = INCBIN_U8("graphics/pokemon/doduo/footprint.1bpp"); const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/front.4bpp.lz"); const u32 gMonPalette_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/normal.gbapal.lz"); const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back.4bpp.lz"); const u32 gMonShinyPalette_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/shiny.gbapal.lz"); const u8 gMonIcon_Dodrio[] = INCBIN_U8("graphics/pokemon/dodrio/icon.4bpp"); const u8 gMonFootprint_Dodrio[] = INCBIN_U8("graphics/pokemon/dodrio/footprint.1bpp"); const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/front.4bpp.lz"); const u32 gMonPalette_Seel[] = INCBIN_U32("graphics/pokemon/seel/normal.gbapal.lz"); const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back.4bpp.lz"); const u32 gMonShinyPalette_Seel[] = INCBIN_U32("graphics/pokemon/seel/shiny.gbapal.lz"); const u8 gMonIcon_Seel[] = INCBIN_U8("graphics/pokemon/seel/icon.4bpp"); const u8 gMonFootprint_Seel[] = INCBIN_U8("graphics/pokemon/seel/footprint.1bpp"); const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/front.4bpp.lz"); const u32 gMonPalette_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/normal.gbapal.lz"); const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back.4bpp.lz"); const u32 gMonShinyPalette_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/shiny.gbapal.lz"); const u8 gMonIcon_Dewgong[] = INCBIN_U8("graphics/pokemon/dewgong/icon.4bpp"); const u8 gMonFootprint_Dewgong[] = INCBIN_U8("graphics/pokemon/dewgong/footprint.1bpp"); const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/front.4bpp.lz"); const u32 gMonPalette_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/normal.gbapal.lz"); const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back.4bpp.lz"); const u32 gMonShinyPalette_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/shiny.gbapal.lz"); const u8 gMonIcon_Grimer[] = INCBIN_U8("graphics/pokemon/grimer/icon.4bpp"); const u8 gMonFootprint_Grimer[] = INCBIN_U8("graphics/pokemon/grimer/footprint.1bpp"); const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/front.4bpp.lz"); const u32 gMonPalette_Muk[] = INCBIN_U32("graphics/pokemon/muk/normal.gbapal.lz"); const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back.4bpp.lz"); const u32 gMonShinyPalette_Muk[] = INCBIN_U32("graphics/pokemon/muk/shiny.gbapal.lz"); const u8 gMonIcon_Muk[] = INCBIN_U8("graphics/pokemon/muk/icon.4bpp"); const u8 gMonFootprint_Muk[] = INCBIN_U8("graphics/pokemon/muk/footprint.1bpp"); const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/front.4bpp.lz"); const u32 gMonPalette_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/normal.gbapal.lz"); const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back.4bpp.lz"); const u32 gMonShinyPalette_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/shiny.gbapal.lz"); const u8 gMonIcon_Shellder[] = INCBIN_U8("graphics/pokemon/shellder/icon.4bpp"); const u8 gMonFootprint_Shellder[] = INCBIN_U8("graphics/pokemon/shellder/footprint.1bpp"); const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/front.4bpp.lz"); const u32 gMonPalette_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/normal.gbapal.lz"); const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back.4bpp.lz"); const u32 gMonShinyPalette_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/shiny.gbapal.lz"); const u8 gMonIcon_Cloyster[] = INCBIN_U8("graphics/pokemon/cloyster/icon.4bpp"); const u8 gMonFootprint_Cloyster[] = INCBIN_U8("graphics/pokemon/cloyster/footprint.1bpp"); const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/front.4bpp.lz"); const u32 gMonPalette_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/normal.gbapal.lz"); const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back.4bpp.lz"); const u32 gMonShinyPalette_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/shiny.gbapal.lz"); const u8 gMonIcon_Gastly[] = INCBIN_U8("graphics/pokemon/gastly/icon.4bpp"); const u8 gMonFootprint_Gastly[] = INCBIN_U8("graphics/pokemon/gastly/footprint.1bpp"); const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/front.4bpp.lz"); const u32 gMonPalette_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/normal.gbapal.lz"); const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back.4bpp.lz"); const u32 gMonShinyPalette_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/shiny.gbapal.lz"); const u8 gMonIcon_Haunter[] = INCBIN_U8("graphics/pokemon/haunter/icon.4bpp"); const u8 gMonFootprint_Haunter[] = INCBIN_U8("graphics/pokemon/haunter/footprint.1bpp"); const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/front.4bpp.lz"); const u32 gMonPalette_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/normal.gbapal.lz"); const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back.4bpp.lz"); const u32 gMonShinyPalette_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/shiny.gbapal.lz"); const u8 gMonIcon_Gengar[] = INCBIN_U8("graphics/pokemon/gengar/icon.4bpp"); const u8 gMonFootprint_Gengar[] = INCBIN_U8("graphics/pokemon/gengar/footprint.1bpp"); const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/front.4bpp.lz"); const u32 gMonPalette_Onix[] = INCBIN_U32("graphics/pokemon/onix/normal.gbapal.lz"); const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back.4bpp.lz"); const u32 gMonShinyPalette_Onix[] = INCBIN_U32("graphics/pokemon/onix/shiny.gbapal.lz"); const u8 gMonIcon_Onix[] = INCBIN_U8("graphics/pokemon/onix/icon.4bpp"); const u8 gMonFootprint_Onix[] = INCBIN_U8("graphics/pokemon/onix/footprint.1bpp"); const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/front.4bpp.lz"); const u32 gMonPalette_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/normal.gbapal.lz"); const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back.4bpp.lz"); const u32 gMonShinyPalette_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/shiny.gbapal.lz"); const u8 gMonIcon_Drowzee[] = INCBIN_U8("graphics/pokemon/drowzee/icon.4bpp"); const u8 gMonFootprint_Drowzee[] = INCBIN_U8("graphics/pokemon/drowzee/footprint.1bpp"); const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/front.4bpp.lz"); const u32 gMonPalette_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/normal.gbapal.lz"); const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back.4bpp.lz"); const u32 gMonShinyPalette_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/shiny.gbapal.lz"); const u8 gMonIcon_Hypno[] = INCBIN_U8("graphics/pokemon/hypno/icon.4bpp"); const u8 gMonFootprint_Hypno[] = INCBIN_U8("graphics/pokemon/hypno/footprint.1bpp"); const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/front.4bpp.lz"); const u32 gMonPalette_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/normal.gbapal.lz"); const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back.4bpp.lz"); const u32 gMonShinyPalette_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/shiny.gbapal.lz"); const u8 gMonIcon_Krabby[] = INCBIN_U8("graphics/pokemon/krabby/icon.4bpp"); const u8 gMonFootprint_Krabby[] = INCBIN_U8("graphics/pokemon/krabby/footprint.1bpp"); const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/front.4bpp.lz"); const u32 gMonPalette_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/normal.gbapal.lz"); const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back.4bpp.lz"); const u32 gMonShinyPalette_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/shiny.gbapal.lz"); const u8 gMonIcon_Kingler[] = INCBIN_U8("graphics/pokemon/kingler/icon.4bpp"); const u8 gMonFootprint_Kingler[] = INCBIN_U8("graphics/pokemon/kingler/footprint.1bpp"); const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/front.4bpp.lz"); const u32 gMonPalette_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/normal.gbapal.lz"); const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back.4bpp.lz"); const u32 gMonShinyPalette_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/shiny.gbapal.lz"); const u8 gMonIcon_Voltorb[] = INCBIN_U8("graphics/pokemon/voltorb/icon.4bpp"); const u8 gMonFootprint_Voltorb[] = INCBIN_U8("graphics/pokemon/voltorb/footprint.1bpp"); const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/front.4bpp.lz"); const u32 gMonPalette_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/normal.gbapal.lz"); const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back.4bpp.lz"); const u32 gMonShinyPalette_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/shiny.gbapal.lz"); const u8 gMonIcon_Electrode[] = INCBIN_U8("graphics/pokemon/electrode/icon.4bpp"); const u8 gMonFootprint_Electrode[] = INCBIN_U8("graphics/pokemon/electrode/footprint.1bpp"); const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/front.4bpp.lz"); const u32 gMonPalette_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/normal.gbapal.lz"); const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back.4bpp.lz"); const u32 gMonShinyPalette_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/shiny.gbapal.lz"); const u8 gMonIcon_Exeggcute[] = INCBIN_U8("graphics/pokemon/exeggcute/icon.4bpp"); const u8 gMonFootprint_Exeggcute[] = INCBIN_U8("graphics/pokemon/exeggcute/footprint.1bpp"); const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/front.4bpp.lz"); const u32 gMonPalette_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/normal.gbapal.lz"); const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back.4bpp.lz"); const u32 gMonShinyPalette_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/shiny.gbapal.lz"); const u8 gMonIcon_Exeggutor[] = INCBIN_U8("graphics/pokemon/exeggutor/icon.4bpp"); const u8 gMonFootprint_Exeggutor[] = INCBIN_U8("graphics/pokemon/exeggutor/footprint.1bpp"); const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/front.4bpp.lz"); const u32 gMonPalette_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/normal.gbapal.lz"); const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back.4bpp.lz"); const u32 gMonShinyPalette_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/shiny.gbapal.lz"); const u8 gMonIcon_Cubone[] = INCBIN_U8("graphics/pokemon/cubone/icon.4bpp"); const u8 gMonFootprint_Cubone[] = INCBIN_U8("graphics/pokemon/cubone/footprint.1bpp"); const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/front.4bpp.lz"); const u32 gMonPalette_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/normal.gbapal.lz"); const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back.4bpp.lz"); const u32 gMonShinyPalette_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/shiny.gbapal.lz"); const u8 gMonIcon_Marowak[] = INCBIN_U8("graphics/pokemon/marowak/icon.4bpp"); const u8 gMonFootprint_Marowak[] = INCBIN_U8("graphics/pokemon/marowak/footprint.1bpp"); const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/front.4bpp.lz"); const u32 gMonPalette_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/normal.gbapal.lz"); const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back.4bpp.lz"); const u32 gMonShinyPalette_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/shiny.gbapal.lz"); const u8 gMonIcon_Hitmonlee[] = INCBIN_U8("graphics/pokemon/hitmonlee/icon.4bpp"); const u8 gMonFootprint_Hitmonlee[] = INCBIN_U8("graphics/pokemon/hitmonlee/footprint.1bpp"); const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/front.4bpp.lz"); const u32 gMonPalette_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/normal.gbapal.lz"); const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back.4bpp.lz"); const u32 gMonShinyPalette_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/shiny.gbapal.lz"); const u8 gMonIcon_Hitmonchan[] = INCBIN_U8("graphics/pokemon/hitmonchan/icon.4bpp"); const u8 gMonFootprint_Hitmonchan[] = INCBIN_U8("graphics/pokemon/hitmonchan/footprint.1bpp"); const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/front.4bpp.lz"); const u32 gMonPalette_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/normal.gbapal.lz"); const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back.4bpp.lz"); const u32 gMonShinyPalette_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/shiny.gbapal.lz"); const u8 gMonIcon_Lickitung[] = INCBIN_U8("graphics/pokemon/lickitung/icon.4bpp"); const u8 gMonFootprint_Lickitung[] = INCBIN_U8("graphics/pokemon/lickitung/footprint.1bpp"); const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/front.4bpp.lz"); const u32 gMonPalette_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/normal.gbapal.lz"); const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back.4bpp.lz"); const u32 gMonShinyPalette_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/shiny.gbapal.lz"); const u8 gMonIcon_Koffing[] = INCBIN_U8("graphics/pokemon/koffing/icon.4bpp"); const u8 gMonFootprint_Koffing[] = INCBIN_U8("graphics/pokemon/koffing/footprint.1bpp"); const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/front.4bpp.lz"); const u32 gMonPalette_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/normal.gbapal.lz"); const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back.4bpp.lz"); const u32 gMonShinyPalette_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/shiny.gbapal.lz"); const u8 gMonIcon_Weezing[] = INCBIN_U8("graphics/pokemon/weezing/icon.4bpp"); const u8 gMonFootprint_Weezing[] = INCBIN_U8("graphics/pokemon/weezing/footprint.1bpp"); const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/front.4bpp.lz"); const u32 gMonPalette_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/normal.gbapal.lz"); const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back.4bpp.lz"); const u32 gMonShinyPalette_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/shiny.gbapal.lz"); const u8 gMonIcon_Rhyhorn[] = INCBIN_U8("graphics/pokemon/rhyhorn/icon.4bpp"); const u8 gMonFootprint_Rhyhorn[] = INCBIN_U8("graphics/pokemon/rhyhorn/footprint.1bpp"); const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/front.4bpp.lz"); const u32 gMonPalette_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/normal.gbapal.lz"); const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back.4bpp.lz"); const u32 gMonShinyPalette_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/shiny.gbapal.lz"); const u8 gMonIcon_Rhydon[] = INCBIN_U8("graphics/pokemon/rhydon/icon.4bpp"); const u8 gMonFootprint_Rhydon[] = INCBIN_U8("graphics/pokemon/rhydon/footprint.1bpp"); const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/front.4bpp.lz"); const u32 gMonPalette_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/normal.gbapal.lz"); const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back.4bpp.lz"); const u32 gMonShinyPalette_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/shiny.gbapal.lz"); const u8 gMonIcon_Chansey[] = INCBIN_U8("graphics/pokemon/chansey/icon.4bpp"); const u8 gMonFootprint_Chansey[] = INCBIN_U8("graphics/pokemon/chansey/footprint.1bpp"); const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/front.4bpp.lz"); const u32 gMonPalette_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/normal.gbapal.lz"); const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back.4bpp.lz"); const u32 gMonShinyPalette_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/shiny.gbapal.lz"); const u8 gMonIcon_Tangela[] = INCBIN_U8("graphics/pokemon/tangela/icon.4bpp"); const u8 gMonFootprint_Tangela[] = INCBIN_U8("graphics/pokemon/tangela/footprint.1bpp"); const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/front.4bpp.lz"); const u32 gMonPalette_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/normal.gbapal.lz"); const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back.4bpp.lz"); const u32 gMonShinyPalette_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/shiny.gbapal.lz"); const u8 gMonIcon_Kangaskhan[] = INCBIN_U8("graphics/pokemon/kangaskhan/icon.4bpp"); const u8 gMonFootprint_Kangaskhan[] = INCBIN_U8("graphics/pokemon/kangaskhan/footprint.1bpp"); const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/front.4bpp.lz"); const u32 gMonPalette_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/normal.gbapal.lz"); const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back.4bpp.lz"); const u32 gMonShinyPalette_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/shiny.gbapal.lz"); const u8 gMonIcon_Horsea[] = INCBIN_U8("graphics/pokemon/horsea/icon.4bpp"); const u8 gMonFootprint_Horsea[] = INCBIN_U8("graphics/pokemon/horsea/footprint.1bpp"); const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/front.4bpp.lz"); const u32 gMonPalette_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/normal.gbapal.lz"); const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back.4bpp.lz"); const u32 gMonShinyPalette_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/shiny.gbapal.lz"); const u8 gMonIcon_Seadra[] = INCBIN_U8("graphics/pokemon/seadra/icon.4bpp"); const u8 gMonFootprint_Seadra[] = INCBIN_U8("graphics/pokemon/seadra/footprint.1bpp"); const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/front.4bpp.lz"); const u32 gMonPalette_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/normal.gbapal.lz"); const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back.4bpp.lz"); const u32 gMonShinyPalette_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/shiny.gbapal.lz"); const u8 gMonIcon_Goldeen[] = INCBIN_U8("graphics/pokemon/goldeen/icon.4bpp"); const u8 gMonFootprint_Goldeen[] = INCBIN_U8("graphics/pokemon/goldeen/footprint.1bpp"); const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/front.4bpp.lz"); const u32 gMonPalette_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/normal.gbapal.lz"); const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back.4bpp.lz"); const u32 gMonShinyPalette_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/shiny.gbapal.lz"); const u8 gMonIcon_Seaking[] = INCBIN_U8("graphics/pokemon/seaking/icon.4bpp"); const u8 gMonFootprint_Seaking[] = INCBIN_U8("graphics/pokemon/seaking/footprint.1bpp"); const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/front.4bpp.lz"); const u32 gMonPalette_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/normal.gbapal.lz"); const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back.4bpp.lz"); const u32 gMonShinyPalette_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/shiny.gbapal.lz"); const u8 gMonIcon_Staryu[] = INCBIN_U8("graphics/pokemon/staryu/icon.4bpp"); const u8 gMonFootprint_Staryu[] = INCBIN_U8("graphics/pokemon/staryu/footprint.1bpp"); const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/front.4bpp.lz"); const u32 gMonPalette_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/normal.gbapal.lz"); const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back.4bpp.lz"); const u32 gMonShinyPalette_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/shiny.gbapal.lz"); const u8 gMonIcon_Starmie[] = INCBIN_U8("graphics/pokemon/starmie/icon.4bpp"); const u8 gMonFootprint_Starmie[] = INCBIN_U8("graphics/pokemon/starmie/footprint.1bpp"); const u32 gMonFrontPic_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/front.4bpp.lz"); const u32 gMonPalette_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/normal.gbapal.lz"); const u32 gMonBackPic_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/back.4bpp.lz"); const u32 gMonShinyPalette_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/shiny.gbapal.lz"); const u8 gMonIcon_Mrmime[] = INCBIN_U8("graphics/pokemon/mr_mime/icon.4bpp"); const u8 gMonFootprint_Mrmime[] = INCBIN_U8("graphics/pokemon/mr_mime/footprint.1bpp"); const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/front.4bpp.lz"); const u32 gMonPalette_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/normal.gbapal.lz"); const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back.4bpp.lz"); const u32 gMonShinyPalette_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/shiny.gbapal.lz"); const u8 gMonIcon_Scyther[] = INCBIN_U8("graphics/pokemon/scyther/icon.4bpp"); const u8 gMonFootprint_Scyther[] = INCBIN_U8("graphics/pokemon/scyther/footprint.1bpp"); const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/front.4bpp.lz"); const u32 gMonPalette_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/normal.gbapal.lz"); const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back.4bpp.lz"); const u32 gMonShinyPalette_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/shiny.gbapal.lz"); const u8 gMonIcon_Jynx[] = INCBIN_U8("graphics/pokemon/jynx/icon.4bpp"); const u8 gMonFootprint_Jynx[] = INCBIN_U8("graphics/pokemon/jynx/footprint.1bpp"); const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/front.4bpp.lz"); const u32 gMonPalette_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/normal.gbapal.lz"); const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back.4bpp.lz"); const u32 gMonShinyPalette_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/shiny.gbapal.lz"); const u8 gMonIcon_Electabuzz[] = INCBIN_U8("graphics/pokemon/electabuzz/icon.4bpp"); const u8 gMonFootprint_Electabuzz[] = INCBIN_U8("graphics/pokemon/electabuzz/footprint.1bpp"); const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/front.4bpp.lz"); const u32 gMonPalette_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/normal.gbapal.lz"); const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back.4bpp.lz"); const u32 gMonShinyPalette_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/shiny.gbapal.lz"); const u8 gMonIcon_Magmar[] = INCBIN_U8("graphics/pokemon/magmar/icon.4bpp"); const u8 gMonFootprint_Magmar[] = INCBIN_U8("graphics/pokemon/magmar/footprint.1bpp"); const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/front.4bpp.lz"); const u32 gMonPalette_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/normal.gbapal.lz"); const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back.4bpp.lz"); const u32 gMonShinyPalette_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/shiny.gbapal.lz"); const u8 gMonIcon_Pinsir[] = INCBIN_U8("graphics/pokemon/pinsir/icon.4bpp"); const u8 gMonFootprint_Pinsir[] = INCBIN_U8("graphics/pokemon/pinsir/footprint.1bpp"); const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/front.4bpp.lz"); const u32 gMonPalette_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/normal.gbapal.lz"); const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back.4bpp.lz"); const u32 gMonShinyPalette_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/shiny.gbapal.lz"); const u8 gMonIcon_Tauros[] = INCBIN_U8("graphics/pokemon/tauros/icon.4bpp"); const u8 gMonFootprint_Tauros[] = INCBIN_U8("graphics/pokemon/tauros/footprint.1bpp"); const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/front.4bpp.lz"); const u32 gMonPalette_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/normal.gbapal.lz"); const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back.4bpp.lz"); const u32 gMonShinyPalette_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/shiny.gbapal.lz"); const u8 gMonIcon_Magikarp[] = INCBIN_U8("graphics/pokemon/magikarp/icon.4bpp"); const u8 gMonFootprint_Magikarp[] = INCBIN_U8("graphics/pokemon/magikarp/footprint.1bpp"); const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/front.4bpp.lz"); const u32 gMonPalette_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/normal.gbapal.lz"); const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back.4bpp.lz"); const u32 gMonShinyPalette_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/shiny.gbapal.lz"); const u8 gMonIcon_Gyarados[] = INCBIN_U8("graphics/pokemon/gyarados/icon.4bpp"); const u8 gMonFootprint_Gyarados[] = INCBIN_U8("graphics/pokemon/gyarados/footprint.1bpp"); const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/front.4bpp.lz"); const u32 gMonPalette_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/normal.gbapal.lz"); const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back.4bpp.lz"); const u32 gMonShinyPalette_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/shiny.gbapal.lz"); const u8 gMonIcon_Lapras[] = INCBIN_U8("graphics/pokemon/lapras/icon.4bpp"); const u8 gMonFootprint_Lapras[] = INCBIN_U8("graphics/pokemon/lapras/footprint.1bpp"); const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/front.4bpp.lz"); const u32 gMonPalette_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/normal.gbapal.lz"); const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back.4bpp.lz"); const u32 gMonShinyPalette_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/shiny.gbapal.lz"); const u8 gMonIcon_Ditto[] = INCBIN_U8("graphics/pokemon/ditto/icon.4bpp"); const u8 gMonFootprint_Ditto[] = INCBIN_U8("graphics/pokemon/ditto/footprint.1bpp"); const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/front.4bpp.lz"); const u32 gMonPalette_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/normal.gbapal.lz"); const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back.4bpp.lz"); const u32 gMonShinyPalette_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/shiny.gbapal.lz"); const u8 gMonIcon_Eevee[] = INCBIN_U8("graphics/pokemon/eevee/icon.4bpp"); const u8 gMonFootprint_Eevee[] = INCBIN_U8("graphics/pokemon/eevee/footprint.1bpp"); const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/front.4bpp.lz"); const u32 gMonPalette_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/normal.gbapal.lz"); const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back.4bpp.lz"); const u32 gMonShinyPalette_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/shiny.gbapal.lz"); const u8 gMonIcon_Vaporeon[] = INCBIN_U8("graphics/pokemon/vaporeon/icon.4bpp"); const u8 gMonFootprint_Vaporeon[] = INCBIN_U8("graphics/pokemon/vaporeon/footprint.1bpp"); const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/front.4bpp.lz"); const u32 gMonPalette_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/normal.gbapal.lz"); const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back.4bpp.lz"); const u32 gMonShinyPalette_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/shiny.gbapal.lz"); const u8 gMonIcon_Jolteon[] = INCBIN_U8("graphics/pokemon/jolteon/icon.4bpp"); const u8 gMonFootprint_Jolteon[] = INCBIN_U8("graphics/pokemon/jolteon/footprint.1bpp"); const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/front.4bpp.lz"); const u32 gMonPalette_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/normal.gbapal.lz"); const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back.4bpp.lz"); const u32 gMonShinyPalette_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/shiny.gbapal.lz"); const u8 gMonIcon_Flareon[] = INCBIN_U8("graphics/pokemon/flareon/icon.4bpp"); const u8 gMonFootprint_Flareon[] = INCBIN_U8("graphics/pokemon/flareon/footprint.1bpp"); const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/front.4bpp.lz"); const u32 gMonPalette_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/normal.gbapal.lz"); const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back.4bpp.lz"); const u32 gMonShinyPalette_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/shiny.gbapal.lz"); const u8 gMonIcon_Porygon[] = INCBIN_U8("graphics/pokemon/porygon/icon.4bpp"); const u8 gMonFootprint_Porygon[] = INCBIN_U8("graphics/pokemon/porygon/footprint.1bpp"); const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/front.4bpp.lz"); const u32 gMonPalette_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/normal.gbapal.lz"); const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back.4bpp.lz"); const u32 gMonShinyPalette_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/shiny.gbapal.lz"); const u8 gMonIcon_Omanyte[] = INCBIN_U8("graphics/pokemon/omanyte/icon.4bpp"); const u8 gMonFootprint_Omanyte[] = INCBIN_U8("graphics/pokemon/omanyte/footprint.1bpp"); const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/front.4bpp.lz"); const u32 gMonPalette_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/normal.gbapal.lz"); const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back.4bpp.lz"); const u32 gMonShinyPalette_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/shiny.gbapal.lz"); const u8 gMonIcon_Omastar[] = INCBIN_U8("graphics/pokemon/omastar/icon.4bpp"); const u8 gMonFootprint_Omastar[] = INCBIN_U8("graphics/pokemon/omastar/footprint.1bpp"); const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/front.4bpp.lz"); const u32 gMonPalette_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/normal.gbapal.lz"); const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back.4bpp.lz"); const u32 gMonShinyPalette_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/shiny.gbapal.lz"); const u8 gMonIcon_Kabuto[] = INCBIN_U8("graphics/pokemon/kabuto/icon.4bpp"); const u8 gMonFootprint_Kabuto[] = INCBIN_U8("graphics/pokemon/kabuto/footprint.1bpp"); const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/front.4bpp.lz"); const u32 gMonPalette_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/normal.gbapal.lz"); const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back.4bpp.lz"); const u32 gMonShinyPalette_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/shiny.gbapal.lz"); const u8 gMonIcon_Kabutops[] = INCBIN_U8("graphics/pokemon/kabutops/icon.4bpp"); const u8 gMonFootprint_Kabutops[] = INCBIN_U8("graphics/pokemon/kabutops/footprint.1bpp"); const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/front.4bpp.lz"); const u32 gMonPalette_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/normal.gbapal.lz"); const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back.4bpp.lz"); const u32 gMonShinyPalette_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/shiny.gbapal.lz"); const u8 gMonIcon_Aerodactyl[] = INCBIN_U8("graphics/pokemon/aerodactyl/icon.4bpp"); const u8 gMonFootprint_Aerodactyl[] = INCBIN_U8("graphics/pokemon/aerodactyl/footprint.1bpp"); const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/front.4bpp.lz"); const u32 gMonPalette_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/normal.gbapal.lz"); const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back.4bpp.lz"); const u32 gMonShinyPalette_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/shiny.gbapal.lz"); const u8 gMonIcon_Snorlax[] = INCBIN_U8("graphics/pokemon/snorlax/icon.4bpp"); const u8 gMonFootprint_Snorlax[] = INCBIN_U8("graphics/pokemon/snorlax/footprint.1bpp"); const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/front.4bpp.lz"); const u32 gMonPalette_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/normal.gbapal.lz"); const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back.4bpp.lz"); const u32 gMonShinyPalette_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/shiny.gbapal.lz"); const u8 gMonIcon_Articuno[] = INCBIN_U8("graphics/pokemon/articuno/icon.4bpp"); const u8 gMonFootprint_Articuno[] = INCBIN_U8("graphics/pokemon/articuno/footprint.1bpp"); const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/front.4bpp.lz"); const u32 gMonPalette_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/normal.gbapal.lz"); const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back.4bpp.lz"); const u32 gMonShinyPalette_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/shiny.gbapal.lz"); const u8 gMonIcon_Zapdos[] = INCBIN_U8("graphics/pokemon/zapdos/icon.4bpp"); const u8 gMonFootprint_Zapdos[] = INCBIN_U8("graphics/pokemon/zapdos/footprint.1bpp"); const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/front.4bpp.lz"); const u32 gMonPalette_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/normal.gbapal.lz"); const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back.4bpp.lz"); const u32 gMonShinyPalette_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/shiny.gbapal.lz"); const u8 gMonIcon_Moltres[] = INCBIN_U8("graphics/pokemon/moltres/icon.4bpp"); const u8 gMonFootprint_Moltres[] = INCBIN_U8("graphics/pokemon/moltres/footprint.1bpp"); const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/front.4bpp.lz"); const u32 gMonPalette_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/normal.gbapal.lz"); const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back.4bpp.lz"); const u32 gMonShinyPalette_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/shiny.gbapal.lz"); const u8 gMonIcon_Dratini[] = INCBIN_U8("graphics/pokemon/dratini/icon.4bpp"); const u8 gMonFootprint_Dratini[] = INCBIN_U8("graphics/pokemon/dratini/footprint.1bpp"); const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/front.4bpp.lz"); const u32 gMonPalette_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/normal.gbapal.lz"); const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back.4bpp.lz"); const u32 gMonShinyPalette_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/shiny.gbapal.lz"); const u8 gMonIcon_Dragonair[] = INCBIN_U8("graphics/pokemon/dragonair/icon.4bpp"); const u8 gMonFootprint_Dragonair[] = INCBIN_U8("graphics/pokemon/dragonair/footprint.1bpp"); const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/front.4bpp.lz"); const u32 gMonPalette_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/normal.gbapal.lz"); const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back.4bpp.lz"); const u32 gMonShinyPalette_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/shiny.gbapal.lz"); const u8 gMonIcon_Dragonite[] = INCBIN_U8("graphics/pokemon/dragonite/icon.4bpp"); const u8 gMonFootprint_Dragonite[] = INCBIN_U8("graphics/pokemon/dragonite/footprint.1bpp"); const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/front.4bpp.lz"); const u32 gMonPalette_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/normal.gbapal.lz"); const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back.4bpp.lz"); const u32 gMonShinyPalette_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/shiny.gbapal.lz"); const u8 gMonIcon_Mewtwo[] = INCBIN_U8("graphics/pokemon/mewtwo/icon.4bpp"); const u8 gMonFootprint_Mewtwo[] = INCBIN_U8("graphics/pokemon/mewtwo/footprint.1bpp"); const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/front.4bpp.lz"); const u32 gMonPalette_Mew[] = INCBIN_U32("graphics/pokemon/mew/normal.gbapal.lz"); const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back.4bpp.lz"); const u32 gMonShinyPalette_Mew[] = INCBIN_U32("graphics/pokemon/mew/shiny.gbapal.lz"); const u8 gMonIcon_Mew[] = INCBIN_U8("graphics/pokemon/mew/icon.4bpp"); const u8 gMonFootprint_Mew[] = INCBIN_U8("graphics/pokemon/mew/footprint.1bpp"); const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/front.4bpp.lz"); const u32 gMonPalette_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/normal.gbapal.lz"); const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back.4bpp.lz"); const u32 gMonShinyPalette_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/shiny.gbapal.lz"); const u8 gMonIcon_Chikorita[] = INCBIN_U8("graphics/pokemon/chikorita/icon.4bpp"); const u8 gMonFootprint_Chikorita[] = INCBIN_U8("graphics/pokemon/chikorita/footprint.1bpp"); const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/front.4bpp.lz"); const u32 gMonPalette_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/normal.gbapal.lz"); const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back.4bpp.lz"); const u32 gMonShinyPalette_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/shiny.gbapal.lz"); const u8 gMonIcon_Bayleef[] = INCBIN_U8("graphics/pokemon/bayleef/icon.4bpp"); const u8 gMonFootprint_Bayleef[] = INCBIN_U8("graphics/pokemon/bayleef/footprint.1bpp"); const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/front.4bpp.lz"); const u32 gMonPalette_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/normal.gbapal.lz"); const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back.4bpp.lz"); const u32 gMonShinyPalette_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/shiny.gbapal.lz"); const u8 gMonIcon_Meganium[] = INCBIN_U8("graphics/pokemon/meganium/icon.4bpp"); const u8 gMonFootprint_Meganium[] = INCBIN_U8("graphics/pokemon/meganium/footprint.1bpp"); const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/front.4bpp.lz"); const u32 gMonPalette_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/normal.gbapal.lz"); const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back.4bpp.lz"); const u32 gMonShinyPalette_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/shiny.gbapal.lz"); const u8 gMonIcon_Cyndaquil[] = INCBIN_U8("graphics/pokemon/cyndaquil/icon.4bpp"); const u8 gMonFootprint_Cyndaquil[] = INCBIN_U8("graphics/pokemon/cyndaquil/footprint.1bpp"); const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/front.4bpp.lz"); const u32 gMonPalette_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/normal.gbapal.lz"); const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back.4bpp.lz"); const u32 gMonShinyPalette_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/shiny.gbapal.lz"); const u8 gMonIcon_Quilava[] = INCBIN_U8("graphics/pokemon/quilava/icon.4bpp"); const u8 gMonFootprint_Quilava[] = INCBIN_U8("graphics/pokemon/quilava/footprint.1bpp"); const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/front.4bpp.lz"); const u32 gMonPalette_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/normal.gbapal.lz"); const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back.4bpp.lz"); const u32 gMonShinyPalette_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/shiny.gbapal.lz"); const u8 gMonIcon_Typhlosion[] = INCBIN_U8("graphics/pokemon/typhlosion/icon.4bpp"); const u8 gMonFootprint_Typhlosion[] = INCBIN_U8("graphics/pokemon/typhlosion/footprint.1bpp"); const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/front.4bpp.lz"); const u32 gMonPalette_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/normal.gbapal.lz"); const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back.4bpp.lz"); const u32 gMonShinyPalette_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/shiny.gbapal.lz"); const u8 gMonIcon_Totodile[] = INCBIN_U8("graphics/pokemon/totodile/icon.4bpp"); const u8 gMonFootprint_Totodile[] = INCBIN_U8("graphics/pokemon/totodile/footprint.1bpp"); const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/front.4bpp.lz"); const u32 gMonPalette_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/normal.gbapal.lz"); const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back.4bpp.lz"); const u32 gMonShinyPalette_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/shiny.gbapal.lz"); const u8 gMonIcon_Croconaw[] = INCBIN_U8("graphics/pokemon/croconaw/icon.4bpp"); const u8 gMonFootprint_Croconaw[] = INCBIN_U8("graphics/pokemon/croconaw/footprint.1bpp"); const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/front.4bpp.lz"); const u32 gMonPalette_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/normal.gbapal.lz"); const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back.4bpp.lz"); const u32 gMonShinyPalette_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/shiny.gbapal.lz"); const u8 gMonIcon_Feraligatr[] = INCBIN_U8("graphics/pokemon/feraligatr/icon.4bpp"); const u8 gMonFootprint_Feraligatr[] = INCBIN_U8("graphics/pokemon/feraligatr/footprint.1bpp"); const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/front.4bpp.lz"); const u32 gMonPalette_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/normal.gbapal.lz"); const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back.4bpp.lz"); const u32 gMonShinyPalette_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/shiny.gbapal.lz"); const u8 gMonIcon_Sentret[] = INCBIN_U8("graphics/pokemon/sentret/icon.4bpp"); const u8 gMonFootprint_Sentret[] = INCBIN_U8("graphics/pokemon/sentret/footprint.1bpp"); const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/front.4bpp.lz"); const u32 gMonPalette_Furret[] = INCBIN_U32("graphics/pokemon/furret/normal.gbapal.lz"); const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back.4bpp.lz"); const u32 gMonShinyPalette_Furret[] = INCBIN_U32("graphics/pokemon/furret/shiny.gbapal.lz"); const u8 gMonIcon_Furret[] = INCBIN_U8("graphics/pokemon/furret/icon.4bpp"); const u8 gMonFootprint_Furret[] = INCBIN_U8("graphics/pokemon/furret/footprint.1bpp"); const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/front.4bpp.lz"); const u32 gMonPalette_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/normal.gbapal.lz"); const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back.4bpp.lz"); const u32 gMonShinyPalette_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/shiny.gbapal.lz"); const u8 gMonIcon_Hoothoot[] = INCBIN_U8("graphics/pokemon/hoothoot/icon.4bpp"); const u8 gMonFootprint_Hoothoot[] = INCBIN_U8("graphics/pokemon/hoothoot/footprint.1bpp"); const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/front.4bpp.lz"); const u32 gMonPalette_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/normal.gbapal.lz"); const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back.4bpp.lz"); const u32 gMonShinyPalette_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/shiny.gbapal.lz"); const u8 gMonIcon_Noctowl[] = INCBIN_U8("graphics/pokemon/noctowl/icon.4bpp"); const u8 gMonFootprint_Noctowl[] = INCBIN_U8("graphics/pokemon/noctowl/footprint.1bpp"); const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/front.4bpp.lz"); const u32 gMonPalette_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/normal.gbapal.lz"); const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back.4bpp.lz"); const u32 gMonShinyPalette_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/shiny.gbapal.lz"); const u8 gMonIcon_Ledyba[] = INCBIN_U8("graphics/pokemon/ledyba/icon.4bpp"); const u8 gMonFootprint_Ledyba[] = INCBIN_U8("graphics/pokemon/ledyba/footprint.1bpp"); const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/front.4bpp.lz"); const u32 gMonPalette_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/normal.gbapal.lz"); const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back.4bpp.lz"); const u32 gMonShinyPalette_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/shiny.gbapal.lz"); const u8 gMonIcon_Ledian[] = INCBIN_U8("graphics/pokemon/ledian/icon.4bpp"); const u8 gMonFootprint_Ledian[] = INCBIN_U8("graphics/pokemon/ledian/footprint.1bpp"); const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/front.4bpp.lz"); const u32 gMonPalette_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/normal.gbapal.lz"); const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back.4bpp.lz"); const u32 gMonShinyPalette_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/shiny.gbapal.lz"); const u8 gMonIcon_Spinarak[] = INCBIN_U8("graphics/pokemon/spinarak/icon.4bpp"); const u8 gMonFootprint_Spinarak[] = INCBIN_U8("graphics/pokemon/spinarak/footprint.1bpp"); const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/front.4bpp.lz"); const u32 gMonPalette_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/normal.gbapal.lz"); const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back.4bpp.lz"); const u32 gMonShinyPalette_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/shiny.gbapal.lz"); const u8 gMonIcon_Ariados[] = INCBIN_U8("graphics/pokemon/ariados/icon.4bpp"); const u8 gMonFootprint_Ariados[] = INCBIN_U8("graphics/pokemon/ariados/footprint.1bpp"); const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/front.4bpp.lz"); const u32 gMonPalette_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/normal.gbapal.lz"); const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back.4bpp.lz"); const u32 gMonShinyPalette_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/shiny.gbapal.lz"); const u8 gMonIcon_Crobat[] = INCBIN_U8("graphics/pokemon/crobat/icon.4bpp"); const u8 gMonFootprint_Crobat[] = INCBIN_U8("graphics/pokemon/crobat/footprint.1bpp"); const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/front.4bpp.lz"); const u32 gMonPalette_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/normal.gbapal.lz"); const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back.4bpp.lz"); const u32 gMonShinyPalette_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/shiny.gbapal.lz"); const u8 gMonIcon_Chinchou[] = INCBIN_U8("graphics/pokemon/chinchou/icon.4bpp"); const u8 gMonFootprint_Chinchou[] = INCBIN_U8("graphics/pokemon/chinchou/footprint.1bpp"); const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/front.4bpp.lz"); const u32 gMonPalette_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/normal.gbapal.lz"); const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back.4bpp.lz"); const u32 gMonShinyPalette_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/shiny.gbapal.lz"); const u8 gMonIcon_Lanturn[] = INCBIN_U8("graphics/pokemon/lanturn/icon.4bpp"); const u8 gMonFootprint_Lanturn[] = INCBIN_U8("graphics/pokemon/lanturn/footprint.1bpp"); const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/front.4bpp.lz"); const u32 gMonPalette_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/normal.gbapal.lz"); const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back.4bpp.lz"); const u32 gMonShinyPalette_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/shiny.gbapal.lz"); const u8 gMonIcon_Pichu[] = INCBIN_U8("graphics/pokemon/pichu/icon.4bpp"); const u8 gMonFootprint_Pichu[] = INCBIN_U8("graphics/pokemon/pichu/footprint.1bpp"); const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/front.4bpp.lz"); const u32 gMonPalette_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/normal.gbapal.lz"); const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back.4bpp.lz"); const u32 gMonShinyPalette_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/shiny.gbapal.lz"); const u8 gMonIcon_Cleffa[] = INCBIN_U8("graphics/pokemon/cleffa/icon.4bpp"); const u8 gMonFootprint_Cleffa[] = INCBIN_U8("graphics/pokemon/cleffa/footprint.1bpp"); const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/front.4bpp.lz"); const u32 gMonPalette_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/normal.gbapal.lz"); const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back.4bpp.lz"); const u32 gMonShinyPalette_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/shiny.gbapal.lz"); const u8 gMonIcon_Igglybuff[] = INCBIN_U8("graphics/pokemon/igglybuff/icon.4bpp"); const u8 gMonFootprint_Igglybuff[] = INCBIN_U8("graphics/pokemon/igglybuff/footprint.1bpp"); const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/front.4bpp.lz"); const u32 gMonPalette_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/normal.gbapal.lz"); const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back.4bpp.lz"); const u32 gMonShinyPalette_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/shiny.gbapal.lz"); const u8 gMonIcon_Togepi[] = INCBIN_U8("graphics/pokemon/togepi/icon.4bpp"); const u8 gMonFootprint_Togepi[] = INCBIN_U8("graphics/pokemon/togepi/footprint.1bpp"); const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/front.4bpp.lz"); const u32 gMonPalette_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/normal.gbapal.lz"); const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back.4bpp.lz"); const u32 gMonShinyPalette_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/shiny.gbapal.lz"); const u8 gMonIcon_Togetic[] = INCBIN_U8("graphics/pokemon/togetic/icon.4bpp"); const u8 gMonFootprint_Togetic[] = INCBIN_U8("graphics/pokemon/togetic/footprint.1bpp"); const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/front.4bpp.lz"); const u32 gMonPalette_Natu[] = INCBIN_U32("graphics/pokemon/natu/normal.gbapal.lz"); const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back.4bpp.lz"); const u32 gMonShinyPalette_Natu[] = INCBIN_U32("graphics/pokemon/natu/shiny.gbapal.lz"); const u8 gMonIcon_Natu[] = INCBIN_U8("graphics/pokemon/natu/icon.4bpp"); const u8 gMonFootprint_Natu[] = INCBIN_U8("graphics/pokemon/natu/footprint.1bpp"); const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/front.4bpp.lz"); const u32 gMonPalette_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/normal.gbapal.lz"); const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back.4bpp.lz"); const u32 gMonShinyPalette_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/shiny.gbapal.lz"); const u8 gMonIcon_Xatu[] = INCBIN_U8("graphics/pokemon/xatu/icon.4bpp"); const u8 gMonFootprint_Xatu[] = INCBIN_U8("graphics/pokemon/xatu/footprint.1bpp"); const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/front.4bpp.lz"); const u32 gMonPalette_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/normal.gbapal.lz"); const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back.4bpp.lz"); const u32 gMonShinyPalette_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/shiny.gbapal.lz"); const u8 gMonIcon_Mareep[] = INCBIN_U8("graphics/pokemon/mareep/icon.4bpp"); const u8 gMonFootprint_Mareep[] = INCBIN_U8("graphics/pokemon/mareep/footprint.1bpp"); const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/front.4bpp.lz"); const u32 gMonPalette_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/normal.gbapal.lz"); const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back.4bpp.lz"); const u32 gMonShinyPalette_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/shiny.gbapal.lz"); const u8 gMonIcon_Flaaffy[] = INCBIN_U8("graphics/pokemon/flaaffy/icon.4bpp"); const u8 gMonFootprint_Flaaffy[] = INCBIN_U8("graphics/pokemon/flaaffy/footprint.1bpp"); const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/front.4bpp.lz"); const u32 gMonPalette_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/normal.gbapal.lz"); const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back.4bpp.lz"); const u32 gMonShinyPalette_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/shiny.gbapal.lz"); const u8 gMonIcon_Ampharos[] = INCBIN_U8("graphics/pokemon/ampharos/icon.4bpp"); const u8 gMonFootprint_Ampharos[] = INCBIN_U8("graphics/pokemon/ampharos/footprint.1bpp"); const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/front.4bpp.lz"); const u32 gMonPalette_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/normal.gbapal.lz"); const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back.4bpp.lz"); const u32 gMonShinyPalette_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/shiny.gbapal.lz"); const u8 gMonIcon_Bellossom[] = INCBIN_U8("graphics/pokemon/bellossom/icon.4bpp"); const u8 gMonFootprint_Bellossom[] = INCBIN_U8("graphics/pokemon/bellossom/footprint.1bpp"); const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/front.4bpp.lz"); const u32 gMonPalette_Marill[] = INCBIN_U32("graphics/pokemon/marill/normal.gbapal.lz"); const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back.4bpp.lz"); const u32 gMonShinyPalette_Marill[] = INCBIN_U32("graphics/pokemon/marill/shiny.gbapal.lz"); const u8 gMonIcon_Marill[] = INCBIN_U8("graphics/pokemon/marill/icon.4bpp"); const u8 gMonFootprint_Marill[] = INCBIN_U8("graphics/pokemon/marill/footprint.1bpp"); const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/front.4bpp.lz"); const u32 gMonPalette_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/normal.gbapal.lz"); const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back.4bpp.lz"); const u32 gMonShinyPalette_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/shiny.gbapal.lz"); const u8 gMonIcon_Azumarill[] = INCBIN_U8("graphics/pokemon/azumarill/icon.4bpp"); const u8 gMonFootprint_Azumarill[] = INCBIN_U8("graphics/pokemon/azumarill/footprint.1bpp"); const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/front.4bpp.lz"); const u32 gMonPalette_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/normal.gbapal.lz"); const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back.4bpp.lz"); const u32 gMonShinyPalette_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/shiny.gbapal.lz"); const u8 gMonIcon_Sudowoodo[] = INCBIN_U8("graphics/pokemon/sudowoodo/icon.4bpp"); const u8 gMonFootprint_Sudowoodo[] = INCBIN_U8("graphics/pokemon/sudowoodo/footprint.1bpp"); const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/front.4bpp.lz"); const u32 gMonPalette_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/normal.gbapal.lz"); const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back.4bpp.lz"); const u32 gMonShinyPalette_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/shiny.gbapal.lz"); const u8 gMonIcon_Politoed[] = INCBIN_U8("graphics/pokemon/politoed/icon.4bpp"); const u8 gMonFootprint_Politoed[] = INCBIN_U8("graphics/pokemon/politoed/footprint.1bpp"); const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/front.4bpp.lz"); const u32 gMonPalette_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/normal.gbapal.lz"); const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back.4bpp.lz"); const u32 gMonShinyPalette_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/shiny.gbapal.lz"); const u8 gMonIcon_Hoppip[] = INCBIN_U8("graphics/pokemon/hoppip/icon.4bpp"); const u8 gMonFootprint_Hoppip[] = INCBIN_U8("graphics/pokemon/hoppip/footprint.1bpp"); const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/front.4bpp.lz"); const u32 gMonPalette_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/normal.gbapal.lz"); const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back.4bpp.lz"); const u32 gMonShinyPalette_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/shiny.gbapal.lz"); const u8 gMonIcon_Skiploom[] = INCBIN_U8("graphics/pokemon/skiploom/icon.4bpp"); const u8 gMonFootprint_Skiploom[] = INCBIN_U8("graphics/pokemon/skiploom/footprint.1bpp"); const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/front.4bpp.lz"); const u32 gMonPalette_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/normal.gbapal.lz"); const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back.4bpp.lz"); const u32 gMonShinyPalette_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/shiny.gbapal.lz"); const u8 gMonIcon_Jumpluff[] = INCBIN_U8("graphics/pokemon/jumpluff/icon.4bpp"); const u8 gMonFootprint_Jumpluff[] = INCBIN_U8("graphics/pokemon/jumpluff/footprint.1bpp"); const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/front.4bpp.lz"); const u32 gMonPalette_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/normal.gbapal.lz"); const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back.4bpp.lz"); const u32 gMonShinyPalette_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/shiny.gbapal.lz"); const u8 gMonIcon_Aipom[] = INCBIN_U8("graphics/pokemon/aipom/icon.4bpp"); const u8 gMonFootprint_Aipom[] = INCBIN_U8("graphics/pokemon/aipom/footprint.1bpp"); const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/front.4bpp.lz"); const u32 gMonPalette_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/normal.gbapal.lz"); const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back.4bpp.lz"); const u32 gMonShinyPalette_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/shiny.gbapal.lz"); const u8 gMonIcon_Sunkern[] = INCBIN_U8("graphics/pokemon/sunkern/icon.4bpp"); const u8 gMonFootprint_Sunkern[] = INCBIN_U8("graphics/pokemon/sunkern/footprint.1bpp"); const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/front.4bpp.lz"); const u32 gMonPalette_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/normal.gbapal.lz"); const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back.4bpp.lz"); const u32 gMonShinyPalette_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/shiny.gbapal.lz"); const u8 gMonIcon_Sunflora[] = INCBIN_U8("graphics/pokemon/sunflora/icon.4bpp"); const u8 gMonFootprint_Sunflora[] = INCBIN_U8("graphics/pokemon/sunflora/footprint.1bpp"); const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/front.4bpp.lz"); const u32 gMonPalette_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/normal.gbapal.lz"); const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back.4bpp.lz"); const u32 gMonShinyPalette_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/shiny.gbapal.lz"); const u8 gMonIcon_Yanma[] = INCBIN_U8("graphics/pokemon/yanma/icon.4bpp"); const u8 gMonFootprint_Yanma[] = INCBIN_U8("graphics/pokemon/yanma/footprint.1bpp"); const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/front.4bpp.lz"); const u32 gMonPalette_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/normal.gbapal.lz"); const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back.4bpp.lz"); const u32 gMonShinyPalette_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/shiny.gbapal.lz"); const u8 gMonIcon_Wooper[] = INCBIN_U8("graphics/pokemon/wooper/icon.4bpp"); const u8 gMonFootprint_Wooper[] = INCBIN_U8("graphics/pokemon/wooper/footprint.1bpp"); const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/front.4bpp.lz"); const u32 gMonPalette_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/normal.gbapal.lz"); const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back.4bpp.lz"); const u32 gMonShinyPalette_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/shiny.gbapal.lz"); const u8 gMonIcon_Quagsire[] = INCBIN_U8("graphics/pokemon/quagsire/icon.4bpp"); const u8 gMonFootprint_Quagsire[] = INCBIN_U8("graphics/pokemon/quagsire/footprint.1bpp"); const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/front.4bpp.lz"); const u32 gMonPalette_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/normal.gbapal.lz"); const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back.4bpp.lz"); const u32 gMonShinyPalette_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/shiny.gbapal.lz"); const u8 gMonIcon_Espeon[] = INCBIN_U8("graphics/pokemon/espeon/icon.4bpp"); const u8 gMonFootprint_Espeon[] = INCBIN_U8("graphics/pokemon/espeon/footprint.1bpp"); const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/front.4bpp.lz"); const u32 gMonPalette_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/normal.gbapal.lz"); const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back.4bpp.lz"); const u32 gMonShinyPalette_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/shiny.gbapal.lz"); const u8 gMonIcon_Umbreon[] = INCBIN_U8("graphics/pokemon/umbreon/icon.4bpp"); const u8 gMonFootprint_Umbreon[] = INCBIN_U8("graphics/pokemon/umbreon/footprint.1bpp"); const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/front.4bpp.lz"); const u32 gMonPalette_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/normal.gbapal.lz"); const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back.4bpp.lz"); const u32 gMonShinyPalette_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/shiny.gbapal.lz"); const u8 gMonIcon_Murkrow[] = INCBIN_U8("graphics/pokemon/murkrow/icon.4bpp"); const u8 gMonFootprint_Murkrow[] = INCBIN_U8("graphics/pokemon/murkrow/footprint.1bpp"); const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/front.4bpp.lz"); const u32 gMonPalette_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/normal.gbapal.lz"); const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back.4bpp.lz"); const u32 gMonShinyPalette_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/shiny.gbapal.lz"); const u8 gMonIcon_Slowking[] = INCBIN_U8("graphics/pokemon/slowking/icon.4bpp"); const u8 gMonFootprint_Slowking[] = INCBIN_U8("graphics/pokemon/slowking/footprint.1bpp"); const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/front.4bpp.lz"); const u32 gMonPalette_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/normal.gbapal.lz"); const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back.4bpp.lz"); const u32 gMonShinyPalette_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/shiny.gbapal.lz"); const u8 gMonIcon_Misdreavus[] = INCBIN_U8("graphics/pokemon/misdreavus/icon.4bpp"); const u8 gMonFootprint_Misdreavus[] = INCBIN_U8("graphics/pokemon/misdreavus/footprint.1bpp"); const u32 gMonFrontPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/a/front.4bpp.lz"); const u32 gMonPalette_Unown[] = INCBIN_U32("graphics/pokemon/unown/normal.gbapal.lz"); const u32 gMonBackPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/a/back.4bpp.lz"); const u32 gMonShinyPalette_Unown[] = INCBIN_U32("graphics/pokemon/unown/shiny.gbapal.lz"); const u8 gMonIcon_UnownA[] = INCBIN_U8("graphics/pokemon/unown/a/icon.4bpp"); const u8 gMonFootprint_Unown[] = INCBIN_U8("graphics/pokemon/unown/footprint.1bpp"); const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/front.4bpp.lz"); const u32 gMonPalette_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/normal.gbapal.lz"); const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back.4bpp.lz"); const u32 gMonShinyPalette_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/shiny.gbapal.lz"); const u8 gMonIcon_Wobbuffet[] = INCBIN_U8("graphics/pokemon/wobbuffet/icon.4bpp"); const u8 gMonFootprint_Wobbuffet[] = INCBIN_U8("graphics/pokemon/wobbuffet/footprint.1bpp"); const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/front.4bpp.lz"); const u32 gMonPalette_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/normal.gbapal.lz"); const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back.4bpp.lz"); const u32 gMonShinyPalette_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/shiny.gbapal.lz"); const u8 gMonIcon_Girafarig[] = INCBIN_U8("graphics/pokemon/girafarig/icon.4bpp"); const u8 gMonFootprint_Girafarig[] = INCBIN_U8("graphics/pokemon/girafarig/footprint.1bpp"); const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/front.4bpp.lz"); const u32 gMonPalette_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/normal.gbapal.lz"); const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back.4bpp.lz"); const u32 gMonShinyPalette_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/shiny.gbapal.lz"); const u8 gMonIcon_Pineco[] = INCBIN_U8("graphics/pokemon/pineco/icon.4bpp"); const u8 gMonFootprint_Pineco[] = INCBIN_U8("graphics/pokemon/pineco/footprint.1bpp"); const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/front.4bpp.lz"); const u32 gMonPalette_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/normal.gbapal.lz"); const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back.4bpp.lz"); const u32 gMonShinyPalette_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/shiny.gbapal.lz"); const u8 gMonIcon_Forretress[] = INCBIN_U8("graphics/pokemon/forretress/icon.4bpp"); const u8 gMonFootprint_Forretress[] = INCBIN_U8("graphics/pokemon/forretress/footprint.1bpp"); const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/front.4bpp.lz"); const u32 gMonPalette_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/normal.gbapal.lz"); const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back.4bpp.lz"); const u32 gMonShinyPalette_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/shiny.gbapal.lz"); const u8 gMonIcon_Dunsparce[] = INCBIN_U8("graphics/pokemon/dunsparce/icon.4bpp"); const u8 gMonFootprint_Dunsparce[] = INCBIN_U8("graphics/pokemon/dunsparce/footprint.1bpp"); const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/front.4bpp.lz"); const u32 gMonPalette_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/normal.gbapal.lz"); const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back.4bpp.lz"); const u32 gMonShinyPalette_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/shiny.gbapal.lz"); const u8 gMonIcon_Gligar[] = INCBIN_U8("graphics/pokemon/gligar/icon.4bpp"); const u8 gMonFootprint_Gligar[] = INCBIN_U8("graphics/pokemon/gligar/footprint.1bpp"); const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/front.4bpp.lz"); const u32 gMonPalette_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/normal.gbapal.lz"); const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back.4bpp.lz"); const u32 gMonShinyPalette_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/shiny.gbapal.lz"); const u8 gMonIcon_Steelix[] = INCBIN_U8("graphics/pokemon/steelix/icon.4bpp"); const u8 gMonFootprint_Steelix[] = INCBIN_U8("graphics/pokemon/steelix/footprint.1bpp"); const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/front.4bpp.lz"); const u32 gMonPalette_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/normal.gbapal.lz"); const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back.4bpp.lz"); const u32 gMonShinyPalette_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/shiny.gbapal.lz"); const u8 gMonIcon_Snubbull[] = INCBIN_U8("graphics/pokemon/snubbull/icon.4bpp"); const u8 gMonFootprint_Snubbull[] = INCBIN_U8("graphics/pokemon/snubbull/footprint.1bpp"); const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/front.4bpp.lz"); const u32 gMonPalette_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/normal.gbapal.lz"); const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back.4bpp.lz"); const u32 gMonShinyPalette_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/shiny.gbapal.lz"); const u8 gMonIcon_Granbull[] = INCBIN_U8("graphics/pokemon/granbull/icon.4bpp"); const u8 gMonFootprint_Granbull[] = INCBIN_U8("graphics/pokemon/granbull/footprint.1bpp"); const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/front.4bpp.lz"); const u32 gMonPalette_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/normal.gbapal.lz"); const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back.4bpp.lz"); const u32 gMonShinyPalette_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/shiny.gbapal.lz"); const u8 gMonIcon_Qwilfish[] = INCBIN_U8("graphics/pokemon/qwilfish/icon.4bpp"); const u8 gMonFootprint_Qwilfish[] = INCBIN_U8("graphics/pokemon/qwilfish/footprint.1bpp"); const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/front.4bpp.lz"); const u32 gMonPalette_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/normal.gbapal.lz"); const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back.4bpp.lz"); const u32 gMonShinyPalette_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/shiny.gbapal.lz"); const u8 gMonIcon_Scizor[] = INCBIN_U8("graphics/pokemon/scizor/icon.4bpp"); const u8 gMonFootprint_Scizor[] = INCBIN_U8("graphics/pokemon/scizor/footprint.1bpp"); const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/front.4bpp.lz"); const u32 gMonPalette_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/normal.gbapal.lz"); const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back.4bpp.lz"); const u32 gMonShinyPalette_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/shiny.gbapal.lz"); const u8 gMonIcon_Shuckle[] = INCBIN_U8("graphics/pokemon/shuckle/icon.4bpp"); const u8 gMonFootprint_Shuckle[] = INCBIN_U8("graphics/pokemon/shuckle/footprint.1bpp"); const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/front.4bpp.lz"); const u32 gMonPalette_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/normal.gbapal.lz"); const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back.4bpp.lz"); const u32 gMonShinyPalette_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/shiny.gbapal.lz"); const u8 gMonIcon_Heracross[] = INCBIN_U8("graphics/pokemon/heracross/icon.4bpp"); const u8 gUnknown_heracross_icon[] = INCBIN_U8("graphics/pokemon/heracross/unk_icon.4bpp"); const u8 gMonFootprint_Heracross[] = INCBIN_U8("graphics/pokemon/heracross/footprint.1bpp"); const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/front.4bpp.lz"); const u32 gMonPalette_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/normal.gbapal.lz"); const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back.4bpp.lz"); const u32 gMonShinyPalette_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/shiny.gbapal.lz"); const u8 gMonIcon_Sneasel[] = INCBIN_U8("graphics/pokemon/sneasel/icon.4bpp"); const u8 gMonFootprint_Sneasel[] = INCBIN_U8("graphics/pokemon/sneasel/footprint.1bpp"); const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/front.4bpp.lz"); const u32 gMonPalette_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/normal.gbapal.lz"); const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back.4bpp.lz"); const u32 gMonShinyPalette_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/shiny.gbapal.lz"); const u8 gMonIcon_Teddiursa[] = INCBIN_U8("graphics/pokemon/teddiursa/icon.4bpp"); const u8 gMonFootprint_Teddiursa[] = INCBIN_U8("graphics/pokemon/teddiursa/footprint.1bpp"); const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/front.4bpp.lz"); const u32 gMonPalette_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/normal.gbapal.lz"); const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back.4bpp.lz"); const u32 gMonShinyPalette_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/shiny.gbapal.lz"); const u8 gMonIcon_Ursaring[] = INCBIN_U8("graphics/pokemon/ursaring/icon.4bpp"); const u8 gMonFootprint_Ursaring[] = INCBIN_U8("graphics/pokemon/ursaring/footprint.1bpp"); const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/front.4bpp.lz"); const u32 gMonPalette_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/normal.gbapal.lz"); const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back.4bpp.lz"); const u32 gMonShinyPalette_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/shiny.gbapal.lz"); const u8 gMonIcon_Slugma[] = INCBIN_U8("graphics/pokemon/slugma/icon.4bpp"); const u8 gMonFootprint_Slugma[] = INCBIN_U8("graphics/pokemon/slugma/footprint.1bpp"); const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/front.4bpp.lz"); const u32 gMonPalette_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/normal.gbapal.lz"); const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back.4bpp.lz"); const u32 gMonShinyPalette_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/shiny.gbapal.lz"); const u8 gMonIcon_Magcargo[] = INCBIN_U8("graphics/pokemon/magcargo/icon.4bpp"); const u8 gMonFootprint_Magcargo[] = INCBIN_U8("graphics/pokemon/magcargo/footprint.1bpp"); const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/front.4bpp.lz"); const u32 gMonPalette_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/normal.gbapal.lz"); const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back.4bpp.lz"); const u32 gMonShinyPalette_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/shiny.gbapal.lz"); const u8 gMonIcon_Swinub[] = INCBIN_U8("graphics/pokemon/swinub/icon.4bpp"); const u8 gMonFootprint_Swinub[] = INCBIN_U8("graphics/pokemon/swinub/footprint.1bpp"); const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/front.4bpp.lz"); const u32 gMonPalette_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/normal.gbapal.lz"); const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back.4bpp.lz"); const u32 gMonShinyPalette_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/shiny.gbapal.lz"); const u8 gMonIcon_Piloswine[] = INCBIN_U8("graphics/pokemon/piloswine/icon.4bpp"); const u8 gMonFootprint_Piloswine[] = INCBIN_U8("graphics/pokemon/piloswine/footprint.1bpp"); const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/front.4bpp.lz"); const u32 gMonPalette_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/normal.gbapal.lz"); const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back.4bpp.lz"); const u32 gMonShinyPalette_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/shiny.gbapal.lz"); const u8 gMonIcon_Corsola[] = INCBIN_U8("graphics/pokemon/corsola/icon.4bpp"); const u8 gMonFootprint_Corsola[] = INCBIN_U8("graphics/pokemon/corsola/footprint.1bpp"); const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/front.4bpp.lz"); const u32 gMonPalette_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/normal.gbapal.lz"); const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back.4bpp.lz"); const u32 gMonShinyPalette_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/shiny.gbapal.lz"); const u8 gMonIcon_Remoraid[] = INCBIN_U8("graphics/pokemon/remoraid/icon.4bpp"); const u8 gMonFootprint_Remoraid[] = INCBIN_U8("graphics/pokemon/remoraid/footprint.1bpp"); const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/front.4bpp.lz"); const u32 gMonPalette_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/normal.gbapal.lz"); const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back.4bpp.lz"); const u32 gMonShinyPalette_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/shiny.gbapal.lz"); const u8 gMonIcon_Octillery[] = INCBIN_U8("graphics/pokemon/octillery/icon.4bpp"); const u8 gMonFootprint_Octillery[] = INCBIN_U8("graphics/pokemon/octillery/footprint.1bpp"); const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/front.4bpp.lz"); const u32 gMonPalette_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/normal.gbapal.lz"); const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back.4bpp.lz"); const u32 gMonShinyPalette_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/shiny.gbapal.lz"); const u8 gMonIcon_Delibird[] = INCBIN_U8("graphics/pokemon/delibird/icon.4bpp"); const u8 gMonFootprint_Delibird[] = INCBIN_U8("graphics/pokemon/delibird/footprint.1bpp"); const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/front.4bpp.lz"); const u32 gMonPalette_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/normal.gbapal.lz"); const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back.4bpp.lz"); const u32 gMonShinyPalette_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/shiny.gbapal.lz"); const u8 gMonIcon_Mantine[] = INCBIN_U8("graphics/pokemon/mantine/icon.4bpp"); const u8 gMonFootprint_Mantine[] = INCBIN_U8("graphics/pokemon/mantine/footprint.1bpp"); const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/front.4bpp.lz"); const u32 gMonPalette_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/normal.gbapal.lz"); const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back.4bpp.lz"); const u32 gMonShinyPalette_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/shiny.gbapal.lz"); const u8 gMonIcon_Skarmory[] = INCBIN_U8("graphics/pokemon/skarmory/icon.4bpp"); const u8 gMonFootprint_Skarmory[] = INCBIN_U8("graphics/pokemon/skarmory/footprint.1bpp"); const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/front.4bpp.lz"); const u32 gMonPalette_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/normal.gbapal.lz"); const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back.4bpp.lz"); const u32 gMonShinyPalette_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/shiny.gbapal.lz"); const u8 gMonIcon_Houndour[] = INCBIN_U8("graphics/pokemon/houndour/icon.4bpp"); const u8 gMonFootprint_Houndour[] = INCBIN_U8("graphics/pokemon/houndour/footprint.1bpp"); const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/front.4bpp.lz"); const u32 gMonPalette_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/normal.gbapal.lz"); const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back.4bpp.lz"); const u32 gMonShinyPalette_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/shiny.gbapal.lz"); const u8 gMonIcon_Houndoom[] = INCBIN_U8("graphics/pokemon/houndoom/icon.4bpp"); const u8 gMonFootprint_Houndoom[] = INCBIN_U8("graphics/pokemon/houndoom/footprint.1bpp"); const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/front.4bpp.lz"); const u32 gMonPalette_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/normal.gbapal.lz"); const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back.4bpp.lz"); const u32 gMonShinyPalette_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/shiny.gbapal.lz"); const u8 gMonIcon_Kingdra[] = INCBIN_U8("graphics/pokemon/kingdra/icon.4bpp"); const u8 gMonFootprint_Kingdra[] = INCBIN_U8("graphics/pokemon/kingdra/footprint.1bpp"); const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/front.4bpp.lz"); const u32 gMonPalette_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/normal.gbapal.lz"); const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back.4bpp.lz"); const u32 gMonShinyPalette_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/shiny.gbapal.lz"); const u8 gMonIcon_Phanpy[] = INCBIN_U8("graphics/pokemon/phanpy/icon.4bpp"); const u8 gMonFootprint_Phanpy[] = INCBIN_U8("graphics/pokemon/phanpy/footprint.1bpp"); const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/front.4bpp.lz"); const u32 gMonPalette_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/normal.gbapal.lz"); const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back.4bpp.lz"); const u32 gMonShinyPalette_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/shiny.gbapal.lz"); const u8 gMonIcon_Donphan[] = INCBIN_U8("graphics/pokemon/donphan/icon.4bpp"); const u8 gMonFootprint_Donphan[] = INCBIN_U8("graphics/pokemon/donphan/footprint.1bpp"); const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/front.4bpp.lz"); const u32 gMonPalette_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/normal.gbapal.lz"); const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back.4bpp.lz"); const u32 gMonShinyPalette_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/shiny.gbapal.lz"); const u8 gMonIcon_Porygon2[] = INCBIN_U8("graphics/pokemon/porygon2/icon.4bpp"); const u8 gMonFootprint_Porygon2[] = INCBIN_U8("graphics/pokemon/porygon2/footprint.1bpp"); const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/front.4bpp.lz"); const u32 gMonPalette_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/normal.gbapal.lz"); const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back.4bpp.lz"); const u32 gMonShinyPalette_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/shiny.gbapal.lz"); const u8 gMonIcon_Stantler[] = INCBIN_U8("graphics/pokemon/stantler/icon.4bpp"); const u8 gMonFootprint_Stantler[] = INCBIN_U8("graphics/pokemon/stantler/footprint.1bpp"); const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/front.4bpp.lz"); const u32 gMonPalette_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/normal.gbapal.lz"); const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back.4bpp.lz"); const u32 gMonShinyPalette_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/shiny.gbapal.lz"); const u8 gMonIcon_Smeargle[] = INCBIN_U8("graphics/pokemon/smeargle/icon.4bpp"); const u8 gMonFootprint_Smeargle[] = INCBIN_U8("graphics/pokemon/smeargle/footprint.1bpp"); const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/front.4bpp.lz"); const u32 gMonPalette_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/normal.gbapal.lz"); const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back.4bpp.lz"); const u32 gMonShinyPalette_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/shiny.gbapal.lz"); const u8 gMonIcon_Tyrogue[] = INCBIN_U8("graphics/pokemon/tyrogue/icon.4bpp"); const u8 gMonFootprint_Tyrogue[] = INCBIN_U8("graphics/pokemon/tyrogue/footprint.1bpp"); const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/front.4bpp.lz"); const u32 gMonPalette_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/normal.gbapal.lz"); const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back.4bpp.lz"); const u32 gMonShinyPalette_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/shiny.gbapal.lz"); const u8 gMonIcon_Hitmontop[] = INCBIN_U8("graphics/pokemon/hitmontop/icon.4bpp"); // This might be undefined memory garbage. Its all 00s except for 1 0F. Its also not referenced. const u32 gUnusedGarbage[] = INCBIN_U32("graphics/pokemon/hitmontop/unused_garbage.bin"); const u8 gMonFootprint_Hitmontop[] = INCBIN_U8("graphics/pokemon/hitmontop/footprint.1bpp"); const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/front.4bpp.lz"); const u32 gMonPalette_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/normal.gbapal.lz"); const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back.4bpp.lz"); const u32 gMonShinyPalette_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/shiny.gbapal.lz"); const u8 gMonIcon_Smoochum[] = INCBIN_U8("graphics/pokemon/smoochum/icon.4bpp"); const u8 gMonFootprint_Smoochum[] = INCBIN_U8("graphics/pokemon/smoochum/footprint.1bpp"); const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/front.4bpp.lz"); const u32 gMonPalette_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/normal.gbapal.lz"); const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back.4bpp.lz"); const u32 gMonShinyPalette_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/shiny.gbapal.lz"); const u8 gMonIcon_Elekid[] = INCBIN_U8("graphics/pokemon/elekid/icon.4bpp"); const u8 gMonFootprint_Elekid[] = INCBIN_U8("graphics/pokemon/elekid/footprint.1bpp"); const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/front.4bpp.lz"); const u32 gMonPalette_Magby[] = INCBIN_U32("graphics/pokemon/magby/normal.gbapal.lz"); const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back.4bpp.lz"); const u32 gMonShinyPalette_Magby[] = INCBIN_U32("graphics/pokemon/magby/shiny.gbapal.lz"); const u8 gMonIcon_Magby[] = INCBIN_U8("graphics/pokemon/magby/icon.4bpp"); const u8 gMonFootprint_Magby[] = INCBIN_U8("graphics/pokemon/magby/footprint.1bpp"); const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/front.4bpp.lz"); const u32 gMonPalette_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/normal.gbapal.lz"); const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back.4bpp.lz"); const u32 gMonShinyPalette_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/shiny.gbapal.lz"); const u8 gMonIcon_Miltank[] = INCBIN_U8("graphics/pokemon/miltank/icon.4bpp"); const u8 gMonFootprint_Miltank[] = INCBIN_U8("graphics/pokemon/miltank/footprint.1bpp"); const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/front.4bpp.lz"); const u32 gMonPalette_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/normal.gbapal.lz"); const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back.4bpp.lz"); const u32 gMonShinyPalette_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/shiny.gbapal.lz"); const u8 gMonIcon_Blissey[] = INCBIN_U8("graphics/pokemon/blissey/icon.4bpp"); const u8 gMonFootprint_Blissey[] = INCBIN_U8("graphics/pokemon/blissey/footprint.1bpp"); const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/front.4bpp.lz"); const u32 gMonPalette_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/normal.gbapal.lz"); const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back.4bpp.lz"); const u32 gMonShinyPalette_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/shiny.gbapal.lz"); const u8 gMonIcon_Raikou[] = INCBIN_U8("graphics/pokemon/raikou/icon.4bpp"); const u8 gMonFootprint_Raikou[] = INCBIN_U8("graphics/pokemon/raikou/footprint.1bpp"); const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/front.4bpp.lz"); const u32 gMonPalette_Entei[] = INCBIN_U32("graphics/pokemon/entei/normal.gbapal.lz"); const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back.4bpp.lz"); const u32 gMonShinyPalette_Entei[] = INCBIN_U32("graphics/pokemon/entei/shiny.gbapal.lz"); const u8 gMonIcon_Entei[] = INCBIN_U8("graphics/pokemon/entei/icon.4bpp"); const u8 gMonFootprint_Entei[] = INCBIN_U8("graphics/pokemon/entei/footprint.1bpp"); const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/front.4bpp.lz"); const u32 gMonPalette_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/normal.gbapal.lz"); const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back.4bpp.lz"); const u32 gMonShinyPalette_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/shiny.gbapal.lz"); const u8 gMonIcon_Suicune[] = INCBIN_U8("graphics/pokemon/suicune/icon.4bpp"); const u8 gMonFootprint_Suicune[] = INCBIN_U8("graphics/pokemon/suicune/footprint.1bpp"); const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/front.4bpp.lz"); const u32 gMonPalette_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/normal.gbapal.lz"); const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back.4bpp.lz"); const u32 gMonShinyPalette_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/shiny.gbapal.lz"); const u8 gMonIcon_Larvitar[] = INCBIN_U8("graphics/pokemon/larvitar/icon.4bpp"); const u8 gMonFootprint_Larvitar[] = INCBIN_U8("graphics/pokemon/larvitar/footprint.1bpp"); const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/front.4bpp.lz"); const u32 gMonPalette_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/normal.gbapal.lz"); const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back.4bpp.lz"); const u32 gMonShinyPalette_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/shiny.gbapal.lz"); const u8 gMonIcon_Pupitar[] = INCBIN_U8("graphics/pokemon/pupitar/icon.4bpp"); const u8 gMonFootprint_Pupitar[] = INCBIN_U8("graphics/pokemon/pupitar/footprint.1bpp"); const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/front.4bpp.lz"); const u32 gMonPalette_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/normal.gbapal.lz"); const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back.4bpp.lz"); const u32 gMonShinyPalette_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/shiny.gbapal.lz"); const u8 gMonIcon_Tyranitar[] = INCBIN_U8("graphics/pokemon/tyranitar/icon.4bpp"); const u8 gMonFootprint_Tyranitar[] = INCBIN_U8("graphics/pokemon/tyranitar/footprint.1bpp"); const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/front.4bpp.lz"); const u32 gMonPalette_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/normal.gbapal.lz"); const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back.4bpp.lz"); const u32 gMonShinyPalette_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/shiny.gbapal.lz"); const u8 gMonIcon_Lugia[] = INCBIN_U8("graphics/pokemon/lugia/icon.4bpp"); const u8 gMonFootprint_Lugia[] = INCBIN_U8("graphics/pokemon/lugia/footprint.1bpp"); const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/front.4bpp.lz"); const u32 gMonPalette_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/normal.gbapal.lz"); const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back.4bpp.lz"); const u32 gMonShinyPalette_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/shiny.gbapal.lz"); const u8 gMonIcon_HoOh[] = INCBIN_U8("graphics/pokemon/ho_oh/icon.4bpp"); const u8 gMonFootprint_HoOh[] = INCBIN_U8("graphics/pokemon/ho_oh/footprint.1bpp"); const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/front.4bpp.lz"); const u32 gMonPalette_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/normal.gbapal.lz"); const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back.4bpp.lz"); const u32 gMonShinyPalette_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/shiny.gbapal.lz"); const u8 gMonIcon_Celebi[] = INCBIN_U8("graphics/pokemon/celebi/icon.4bpp"); const u8 gMonFootprint_Celebi[] = INCBIN_U8("graphics/pokemon/celebi/footprint.1bpp"); const u32 gMonFrontPic_DoubleQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/double/front.4bpp.lz"); const u32 gMonPalette_DoubleQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/double/normal.gbapal.lz"); const u32 gMonBackPic_DoubleQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/double/back.4bpp.lz"); const u32 gMonShinyPalette_DoubleQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/double/shiny.gbapal.lz"); const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/front.4bpp.lz"); const u32 gMonPalette_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/normal.gbapal.lz"); const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back.4bpp.lz"); const u32 gMonShinyPalette_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/shiny.gbapal.lz"); const u8 gMonIcon_Treecko[] = INCBIN_U8("graphics/pokemon/treecko/icon.4bpp"); const u8 gMonFootprint_Treecko[] = INCBIN_U8("graphics/pokemon/treecko/footprint.1bpp"); const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/front.4bpp.lz"); const u32 gMonPalette_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/normal.gbapal.lz"); const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back.4bpp.lz"); const u32 gMonShinyPalette_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/shiny.gbapal.lz"); const u8 gMonIcon_Grovyle[] = INCBIN_U8("graphics/pokemon/grovyle/icon.4bpp"); const u8 gMonFootprint_Grovyle[] = INCBIN_U8("graphics/pokemon/grovyle/footprint.1bpp"); const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/front.4bpp.lz"); const u32 gMonPalette_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/normal.gbapal.lz"); const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back.4bpp.lz"); const u32 gMonShinyPalette_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/shiny.gbapal.lz"); const u8 gMonIcon_Sceptile[] = INCBIN_U8("graphics/pokemon/sceptile/icon.4bpp"); const u8 gMonFootprint_Sceptile[] = INCBIN_U8("graphics/pokemon/sceptile/footprint.1bpp"); const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/front.4bpp.lz"); const u32 gMonPalette_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/normal.gbapal.lz"); const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back.4bpp.lz"); const u32 gMonShinyPalette_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/shiny.gbapal.lz"); const u8 gMonIcon_Torchic[] = INCBIN_U8("graphics/pokemon/torchic/icon.4bpp"); const u8 gMonFootprint_Torchic[] = INCBIN_U8("graphics/pokemon/torchic/footprint.1bpp"); const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/front.4bpp.lz"); const u32 gMonPalette_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/normal.gbapal.lz"); const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back.4bpp.lz"); const u32 gMonShinyPalette_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/shiny.gbapal.lz"); const u8 gMonIcon_Combusken[] = INCBIN_U8("graphics/pokemon/combusken/icon.4bpp"); const u8 gMonFootprint_Combusken[] = INCBIN_U8("graphics/pokemon/combusken/footprint.1bpp"); const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/front.4bpp.lz"); const u32 gMonPalette_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/normal.gbapal.lz"); const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back.4bpp.lz"); const u32 gMonShinyPalette_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/shiny.gbapal.lz"); const u8 gMonIcon_Blaziken[] = INCBIN_U8("graphics/pokemon/blaziken/icon.4bpp"); const u8 gMonFootprint_Blaziken[] = INCBIN_U8("graphics/pokemon/blaziken/footprint.1bpp"); const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/front.4bpp.lz"); const u32 gMonPalette_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/normal.gbapal.lz"); const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back.4bpp.lz"); const u32 gMonShinyPalette_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/shiny.gbapal.lz"); const u8 gMonIcon_Mudkip[] = INCBIN_U8("graphics/pokemon/mudkip/icon.4bpp"); const u8 gMonFootprint_Mudkip[] = INCBIN_U8("graphics/pokemon/mudkip/footprint.1bpp"); const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/front.4bpp.lz"); const u32 gMonPalette_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/normal.gbapal.lz"); const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back.4bpp.lz"); const u32 gMonShinyPalette_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/shiny.gbapal.lz"); const u8 gMonIcon_Marshtomp[] = INCBIN_U8("graphics/pokemon/marshtomp/icon.4bpp"); const u8 gMonFootprint_Marshtomp[] = INCBIN_U8("graphics/pokemon/marshtomp/footprint.1bpp"); const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/front.4bpp.lz"); const u32 gMonPalette_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/normal.gbapal.lz"); const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back.4bpp.lz"); const u32 gMonShinyPalette_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/shiny.gbapal.lz"); const u8 gMonIcon_Swampert[] = INCBIN_U8("graphics/pokemon/swampert/icon.4bpp"); const u8 gMonFootprint_Swampert[] = INCBIN_U8("graphics/pokemon/swampert/footprint.1bpp"); const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/front.4bpp.lz"); const u32 gMonPalette_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/normal.gbapal.lz"); const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back.4bpp.lz"); const u32 gMonShinyPalette_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/shiny.gbapal.lz"); const u8 gMonIcon_Poochyena[] = INCBIN_U8("graphics/pokemon/poochyena/icon.4bpp"); const u8 gMonFootprint_Poochyena[] = INCBIN_U8("graphics/pokemon/poochyena/footprint.1bpp"); const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/front.4bpp.lz"); const u32 gMonPalette_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/normal.gbapal.lz"); const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back.4bpp.lz"); const u32 gMonShinyPalette_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/shiny.gbapal.lz"); const u8 gMonIcon_Mightyena[] = INCBIN_U8("graphics/pokemon/mightyena/icon.4bpp"); const u8 gMonFootprint_Mightyena[] = INCBIN_U8("graphics/pokemon/mightyena/footprint.1bpp"); const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/front.4bpp.lz"); const u32 gMonPalette_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/normal.gbapal.lz"); const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back.4bpp.lz"); const u32 gMonShinyPalette_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/shiny.gbapal.lz"); const u8 gMonIcon_Zigzagoon[] = INCBIN_U8("graphics/pokemon/zigzagoon/icon.4bpp"); const u8 gMonFootprint_Zigzagoon[] = INCBIN_U8("graphics/pokemon/zigzagoon/footprint.1bpp"); const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/front.4bpp.lz"); const u32 gMonPalette_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/normal.gbapal.lz"); const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back.4bpp.lz"); const u32 gMonShinyPalette_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/shiny.gbapal.lz"); const u8 gMonIcon_Linoone[] = INCBIN_U8("graphics/pokemon/linoone/icon.4bpp"); const u8 gMonFootprint_Linoone[] = INCBIN_U8("graphics/pokemon/linoone/footprint.1bpp"); const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/front.4bpp.lz"); const u32 gMonPalette_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/normal.gbapal.lz"); const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back.4bpp.lz"); const u32 gMonShinyPalette_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/shiny.gbapal.lz"); const u8 gMonIcon_Wurmple[] = INCBIN_U8("graphics/pokemon/wurmple/icon.4bpp"); const u8 gMonFootprint_Wurmple[] = INCBIN_U8("graphics/pokemon/wurmple/footprint.1bpp"); const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/front.4bpp.lz"); const u32 gMonPalette_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/normal.gbapal.lz"); const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back.4bpp.lz"); const u32 gMonShinyPalette_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/shiny.gbapal.lz"); const u8 gMonIcon_Silcoon[] = INCBIN_U8("graphics/pokemon/silcoon/icon.4bpp"); const u8 gMonFootprint_Silcoon[] = INCBIN_U8("graphics/pokemon/silcoon/footprint.1bpp"); const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/front.4bpp.lz"); const u32 gMonPalette_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/normal.gbapal.lz"); const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back.4bpp.lz"); const u32 gMonShinyPalette_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/shiny.gbapal.lz"); const u8 gMonIcon_Beautifly[] = INCBIN_U8("graphics/pokemon/beautifly/icon.4bpp"); const u8 gMonFootprint_Beautifly[] = INCBIN_U8("graphics/pokemon/beautifly/footprint.1bpp"); const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/front.4bpp.lz"); const u32 gMonPalette_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/normal.gbapal.lz"); const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back.4bpp.lz"); const u32 gMonShinyPalette_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/shiny.gbapal.lz"); const u8 gMonIcon_Cascoon[] = INCBIN_U8("graphics/pokemon/cascoon/icon.4bpp"); const u8 gMonFootprint_Cascoon[] = INCBIN_U8("graphics/pokemon/cascoon/footprint.1bpp"); const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/front.4bpp.lz"); const u32 gMonPalette_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/normal.gbapal.lz"); const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back.4bpp.lz"); const u32 gMonShinyPalette_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/shiny.gbapal.lz"); const u8 gMonIcon_Dustox[] = INCBIN_U8("graphics/pokemon/dustox/icon.4bpp"); const u8 gMonFootprint_Dustox[] = INCBIN_U8("graphics/pokemon/dustox/footprint.1bpp"); const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/front.4bpp.lz"); const u32 gMonPalette_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/normal.gbapal.lz"); const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back.4bpp.lz"); const u32 gMonShinyPalette_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/shiny.gbapal.lz"); const u8 gMonIcon_Lotad[] = INCBIN_U8("graphics/pokemon/lotad/icon.4bpp"); const u8 gMonFootprint_Lotad[] = INCBIN_U8("graphics/pokemon/lotad/footprint.1bpp"); const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/front.4bpp.lz"); const u32 gMonPalette_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/normal.gbapal.lz"); const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back.4bpp.lz"); const u32 gMonShinyPalette_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/shiny.gbapal.lz"); const u8 gMonIcon_Lombre[] = INCBIN_U8("graphics/pokemon/lombre/icon.4bpp"); const u8 gMonFootprint_Lombre[] = INCBIN_U8("graphics/pokemon/lombre/footprint.1bpp"); const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/front.4bpp.lz"); const u32 gMonPalette_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/normal.gbapal.lz"); const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back.4bpp.lz"); const u32 gMonShinyPalette_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/shiny.gbapal.lz"); const u8 gMonIcon_Ludicolo[] = INCBIN_U8("graphics/pokemon/ludicolo/icon.4bpp"); const u8 gMonFootprint_Ludicolo[] = INCBIN_U8("graphics/pokemon/ludicolo/footprint.1bpp"); const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/front.4bpp.lz"); const u32 gMonPalette_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/normal.gbapal.lz"); const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back.4bpp.lz"); const u32 gMonShinyPalette_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/shiny.gbapal.lz"); const u8 gMonIcon_Seedot[] = INCBIN_U8("graphics/pokemon/seedot/icon.4bpp"); const u8 gMonFootprint_Seedot[] = INCBIN_U8("graphics/pokemon/seedot/footprint.1bpp"); const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/front.4bpp.lz"); const u32 gMonPalette_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/normal.gbapal.lz"); const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back.4bpp.lz"); const u32 gMonShinyPalette_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/shiny.gbapal.lz"); const u8 gMonIcon_Nuzleaf[] = INCBIN_U8("graphics/pokemon/nuzleaf/icon.4bpp"); const u8 gMonFootprint_Nuzleaf[] = INCBIN_U8("graphics/pokemon/nuzleaf/footprint.1bpp"); const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/front.4bpp.lz"); const u32 gMonPalette_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/normal.gbapal.lz"); const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back.4bpp.lz"); const u32 gMonShinyPalette_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/shiny.gbapal.lz"); const u8 gMonIcon_Shiftry[] = INCBIN_U8("graphics/pokemon/shiftry/icon.4bpp"); const u8 gMonFootprint_Shiftry[] = INCBIN_U8("graphics/pokemon/shiftry/footprint.1bpp"); const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/front.4bpp.lz"); const u32 gMonPalette_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/normal.gbapal.lz"); const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back.4bpp.lz"); const u32 gMonShinyPalette_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/shiny.gbapal.lz"); const u8 gMonIcon_Nincada[] = INCBIN_U8("graphics/pokemon/nincada/icon.4bpp"); const u8 gMonFootprint_Nincada[] = INCBIN_U8("graphics/pokemon/nincada/footprint.1bpp"); const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/front.4bpp.lz"); const u32 gMonPalette_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/normal.gbapal.lz"); const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back.4bpp.lz"); const u32 gMonShinyPalette_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/shiny.gbapal.lz"); const u8 gMonIcon_Ninjask[] = INCBIN_U8("graphics/pokemon/ninjask/icon.4bpp"); const u8 gMonFootprint_Ninjask[] = INCBIN_U8("graphics/pokemon/ninjask/footprint.1bpp"); const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/front.4bpp.lz"); const u32 gMonPalette_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/normal.gbapal.lz"); const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back.4bpp.lz"); const u32 gMonShinyPalette_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/shiny.gbapal.lz"); const u8 gMonIcon_Shedinja[] = INCBIN_U8("graphics/pokemon/shedinja/icon.4bpp"); const u8 gMonFootprint_Shedinja[] = INCBIN_U8("graphics/pokemon/shedinja/footprint.1bpp"); const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/front.4bpp.lz"); const u32 gMonPalette_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/normal.gbapal.lz"); const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back.4bpp.lz"); const u32 gMonShinyPalette_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/shiny.gbapal.lz"); const u8 gMonIcon_Taillow[] = INCBIN_U8("graphics/pokemon/taillow/icon.4bpp"); const u8 gMonFootprint_Taillow[] = INCBIN_U8("graphics/pokemon/taillow/footprint.1bpp"); const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/front.4bpp.lz"); const u32 gMonPalette_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/normal.gbapal.lz"); const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back.4bpp.lz"); const u32 gMonShinyPalette_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/shiny.gbapal.lz"); const u8 gMonIcon_Swellow[] = INCBIN_U8("graphics/pokemon/swellow/icon.4bpp"); const u8 gMonFootprint_Swellow[] = INCBIN_U8("graphics/pokemon/swellow/footprint.1bpp"); const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/front.4bpp.lz"); const u32 gMonPalette_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/normal.gbapal.lz"); const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back.4bpp.lz"); const u32 gMonShinyPalette_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/shiny.gbapal.lz"); const u8 gMonIcon_Shroomish[] = INCBIN_U8("graphics/pokemon/shroomish/icon.4bpp"); const u8 gMonFootprint_Shroomish[] = INCBIN_U8("graphics/pokemon/shroomish/footprint.1bpp"); const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/front.4bpp.lz"); const u32 gMonPalette_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/normal.gbapal.lz"); const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back.4bpp.lz"); const u32 gMonShinyPalette_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/shiny.gbapal.lz"); const u8 gMonIcon_Breloom[] = INCBIN_U8("graphics/pokemon/breloom/icon.4bpp"); const u8 gMonFootprint_Breloom[] = INCBIN_U8("graphics/pokemon/breloom/footprint.1bpp"); const u32 gMonFrontPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/front.4bpp.lz"); const u32 gMonPalette_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/normal.gbapal.lz"); const u32 gMonBackPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/back.4bpp.lz"); const u32 gMonShinyPalette_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/shiny.gbapal.lz"); const u8 gMonIcon_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/icon.4bpp"); const u8 gMonFootprint_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/footprint.1bpp"); const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/front.4bpp.lz"); const u32 gMonPalette_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/normal.gbapal.lz"); const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back.4bpp.lz"); const u32 gMonShinyPalette_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/shiny.gbapal.lz"); const u8 gMonIcon_Wingull[] = INCBIN_U8("graphics/pokemon/wingull/icon.4bpp"); const u8 gMonFootprint_Wingull[] = INCBIN_U8("graphics/pokemon/wingull/footprint.1bpp"); const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/front.4bpp.lz"); const u32 gMonPalette_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/normal.gbapal.lz"); const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back.4bpp.lz"); const u32 gMonShinyPalette_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/shiny.gbapal.lz"); const u8 gMonIcon_Pelipper[] = INCBIN_U8("graphics/pokemon/pelipper/icon.4bpp"); const u8 gMonFootprint_Pelipper[] = INCBIN_U8("graphics/pokemon/pelipper/footprint.1bpp"); const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/front.4bpp.lz"); const u32 gMonPalette_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/normal.gbapal.lz"); const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back.4bpp.lz"); const u32 gMonShinyPalette_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/shiny.gbapal.lz"); const u8 gMonIcon_Surskit[] = INCBIN_U8("graphics/pokemon/surskit/icon.4bpp"); const u8 gMonFootprint_Surskit[] = INCBIN_U8("graphics/pokemon/surskit/footprint.1bpp"); const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/front.4bpp.lz"); const u32 gMonPalette_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/normal.gbapal.lz"); const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back.4bpp.lz"); const u32 gMonShinyPalette_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/shiny.gbapal.lz"); const u8 gMonIcon_Masquerain[] = INCBIN_U8("graphics/pokemon/masquerain/icon.4bpp"); const u8 gMonFootprint_Masquerain[] = INCBIN_U8("graphics/pokemon/masquerain/footprint.1bpp"); const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/front.4bpp.lz"); const u32 gMonPalette_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/normal.gbapal.lz"); const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back.4bpp.lz"); const u32 gMonShinyPalette_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/shiny.gbapal.lz"); const u8 gMonIcon_Wailmer[] = INCBIN_U8("graphics/pokemon/wailmer/icon.4bpp"); const u8 gMonFootprint_Wailmer[] = INCBIN_U8("graphics/pokemon/wailmer/footprint.1bpp"); const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/front.4bpp.lz"); const u32 gMonPalette_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/normal.gbapal.lz"); const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back.4bpp.lz"); const u32 gMonShinyPalette_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/shiny.gbapal.lz"); const u8 gMonIcon_Wailord[] = INCBIN_U8("graphics/pokemon/wailord/icon.4bpp"); const u8 gMonFootprint_Wailord[] = INCBIN_U8("graphics/pokemon/wailord/footprint.1bpp"); const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/front.4bpp.lz"); const u32 gMonPalette_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/normal.gbapal.lz"); const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back.4bpp.lz"); const u32 gMonShinyPalette_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/shiny.gbapal.lz"); const u8 gMonIcon_Skitty[] = INCBIN_U8("graphics/pokemon/skitty/icon.4bpp"); const u8 gMonFootprint_Skitty[] = INCBIN_U8("graphics/pokemon/skitty/footprint.1bpp"); const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/front.4bpp.lz"); const u32 gMonPalette_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/normal.gbapal.lz"); const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back.4bpp.lz"); const u32 gMonShinyPalette_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/shiny.gbapal.lz"); const u8 gMonIcon_Delcatty[] = INCBIN_U8("graphics/pokemon/delcatty/icon.4bpp"); const u8 gMonFootprint_Delcatty[] = INCBIN_U8("graphics/pokemon/delcatty/footprint.1bpp"); const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/front.4bpp.lz"); const u32 gMonPalette_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/normal.gbapal.lz"); const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back.4bpp.lz"); const u32 gMonShinyPalette_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/shiny.gbapal.lz"); const u8 gMonIcon_Kecleon[] = INCBIN_U8("graphics/pokemon/kecleon/icon.4bpp"); const u8 gMonFootprint_Kecleon[] = INCBIN_U8("graphics/pokemon/kecleon/footprint.1bpp"); const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/front.4bpp.lz"); const u32 gMonPalette_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/normal.gbapal.lz"); const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back.4bpp.lz"); const u32 gMonShinyPalette_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/shiny.gbapal.lz"); const u8 gMonIcon_Baltoy[] = INCBIN_U8("graphics/pokemon/baltoy/icon.4bpp"); const u8 gMonFootprint_Baltoy[] = INCBIN_U8("graphics/pokemon/baltoy/footprint.1bpp"); const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/front.4bpp.lz"); const u32 gMonPalette_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/normal.gbapal.lz"); const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back.4bpp.lz"); const u32 gMonShinyPalette_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/shiny.gbapal.lz"); const u8 gMonIcon_Claydol[] = INCBIN_U8("graphics/pokemon/claydol/icon.4bpp"); const u8 gMonFootprint_Claydol[] = INCBIN_U8("graphics/pokemon/claydol/footprint.1bpp"); const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/front.4bpp.lz"); const u32 gMonPalette_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/normal.gbapal.lz"); const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back.4bpp.lz"); const u32 gMonShinyPalette_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/shiny.gbapal.lz"); const u8 gMonIcon_Nosepass[] = INCBIN_U8("graphics/pokemon/nosepass/icon.4bpp"); const u8 gMonFootprint_Nosepass[] = INCBIN_U8("graphics/pokemon/nosepass/footprint.1bpp"); const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/front.4bpp.lz"); const u32 gMonPalette_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/normal.gbapal.lz"); const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back.4bpp.lz"); const u32 gMonShinyPalette_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/shiny.gbapal.lz"); const u8 gMonIcon_Torkoal[] = INCBIN_U8("graphics/pokemon/torkoal/icon.4bpp"); const u8 gMonFootprint_Torkoal[] = INCBIN_U8("graphics/pokemon/torkoal/footprint.1bpp"); const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/front.4bpp.lz"); const u32 gMonPalette_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/normal.gbapal.lz"); const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back.4bpp.lz"); const u32 gMonShinyPalette_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/shiny.gbapal.lz"); const u8 gMonIcon_Sableye[] = INCBIN_U8("graphics/pokemon/sableye/icon.4bpp"); const u8 gMonFootprint_Sableye[] = INCBIN_U8("graphics/pokemon/sableye/footprint.1bpp"); const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/front.4bpp.lz"); const u32 gMonPalette_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/normal.gbapal.lz"); const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back.4bpp.lz"); const u32 gMonShinyPalette_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/shiny.gbapal.lz"); const u8 gMonIcon_Barboach[] = INCBIN_U8("graphics/pokemon/barboach/icon.4bpp"); const u8 gMonFootprint_Barboach[] = INCBIN_U8("graphics/pokemon/barboach/footprint.1bpp"); const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/front.4bpp.lz"); const u32 gMonPalette_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/normal.gbapal.lz"); const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back.4bpp.lz"); const u32 gMonShinyPalette_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/shiny.gbapal.lz"); const u8 gMonIcon_Whiscash[] = INCBIN_U8("graphics/pokemon/whiscash/icon.4bpp"); const u8 gMonFootprint_Whiscash[] = INCBIN_U8("graphics/pokemon/whiscash/footprint.1bpp"); const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/front.4bpp.lz"); const u32 gMonPalette_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/normal.gbapal.lz"); const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back.4bpp.lz"); const u32 gMonShinyPalette_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/shiny.gbapal.lz"); const u8 gMonIcon_Luvdisc[] = INCBIN_U8("graphics/pokemon/luvdisc/icon.4bpp"); const u8 gMonFootprint_Luvdisc[] = INCBIN_U8("graphics/pokemon/luvdisc/footprint.1bpp"); const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/front.4bpp.lz"); const u32 gMonPalette_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/normal.gbapal.lz"); const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back.4bpp.lz"); const u32 gMonShinyPalette_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/shiny.gbapal.lz"); const u8 gMonIcon_Corphish[] = INCBIN_U8("graphics/pokemon/corphish/icon.4bpp"); const u8 gMonFootprint_Corphish[] = INCBIN_U8("graphics/pokemon/corphish/footprint.1bpp"); const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/front.4bpp.lz"); const u32 gMonPalette_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/normal.gbapal.lz"); const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back.4bpp.lz"); const u32 gMonShinyPalette_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/shiny.gbapal.lz"); const u8 gMonIcon_Crawdaunt[] = INCBIN_U8("graphics/pokemon/crawdaunt/icon.4bpp"); const u8 gMonFootprint_Crawdaunt[] = INCBIN_U8("graphics/pokemon/crawdaunt/footprint.1bpp"); const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/front.4bpp.lz"); const u32 gMonPalette_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/normal.gbapal.lz"); const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back.4bpp.lz"); const u32 gMonShinyPalette_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/shiny.gbapal.lz"); const u8 gMonIcon_Feebas[] = INCBIN_U8("graphics/pokemon/feebas/icon.4bpp"); const u8 gMonFootprint_Feebas[] = INCBIN_U8("graphics/pokemon/feebas/footprint.1bpp"); const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/front.4bpp.lz"); const u32 gMonPalette_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/normal.gbapal.lz"); const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back.4bpp.lz"); const u32 gMonShinyPalette_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/shiny.gbapal.lz"); const u8 gMonIcon_Milotic[] = INCBIN_U8("graphics/pokemon/milotic/icon.4bpp"); const u8 gMonFootprint_Milotic[] = INCBIN_U8("graphics/pokemon/milotic/footprint.1bpp"); const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/front.4bpp.lz"); const u32 gMonPalette_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/normal.gbapal.lz"); const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back.4bpp.lz"); const u32 gMonShinyPalette_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/shiny.gbapal.lz"); const u8 gMonIcon_Carvanha[] = INCBIN_U8("graphics/pokemon/carvanha/icon.4bpp"); const u8 gMonFootprint_Carvanha[] = INCBIN_U8("graphics/pokemon/carvanha/footprint.1bpp"); const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/front.4bpp.lz"); const u32 gMonPalette_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/normal.gbapal.lz"); const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back.4bpp.lz"); const u32 gMonShinyPalette_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/shiny.gbapal.lz"); const u8 gMonIcon_Sharpedo[] = INCBIN_U8("graphics/pokemon/sharpedo/icon.4bpp"); const u8 gMonFootprint_Sharpedo[] = INCBIN_U8("graphics/pokemon/sharpedo/footprint.1bpp"); const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/front.4bpp.lz"); const u32 gMonPalette_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/normal.gbapal.lz"); const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back.4bpp.lz"); const u32 gMonShinyPalette_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/shiny.gbapal.lz"); const u8 gMonIcon_Trapinch[] = INCBIN_U8("graphics/pokemon/trapinch/icon.4bpp"); const u8 gMonFootprint_Trapinch[] = INCBIN_U8("graphics/pokemon/trapinch/footprint.1bpp"); const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/front.4bpp.lz"); const u32 gMonPalette_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/normal.gbapal.lz"); const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back.4bpp.lz"); const u32 gMonShinyPalette_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/shiny.gbapal.lz"); const u8 gMonIcon_Vibrava[] = INCBIN_U8("graphics/pokemon/vibrava/icon.4bpp"); const u8 gMonFootprint_Vibrava[] = INCBIN_U8("graphics/pokemon/vibrava/footprint.1bpp"); const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/front.4bpp.lz"); const u32 gMonPalette_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/normal.gbapal.lz"); const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back.4bpp.lz"); const u32 gMonShinyPalette_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/shiny.gbapal.lz"); const u8 gMonIcon_Flygon[] = INCBIN_U8("graphics/pokemon/flygon/icon.4bpp"); const u8 gMonFootprint_Flygon[] = INCBIN_U8("graphics/pokemon/flygon/footprint.1bpp"); const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/front.4bpp.lz"); const u32 gMonPalette_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/normal.gbapal.lz"); const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back.4bpp.lz"); const u32 gMonShinyPalette_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/shiny.gbapal.lz"); const u8 gMonIcon_Makuhita[] = INCBIN_U8("graphics/pokemon/makuhita/icon.4bpp"); const u8 gMonFootprint_Makuhita[] = INCBIN_U8("graphics/pokemon/makuhita/footprint.1bpp"); const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/front.4bpp.lz"); const u32 gMonPalette_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/normal.gbapal.lz"); const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back.4bpp.lz"); const u32 gMonShinyPalette_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/shiny.gbapal.lz"); const u8 gMonIcon_Hariyama[] = INCBIN_U8("graphics/pokemon/hariyama/icon.4bpp"); const u8 gMonFootprint_Hariyama[] = INCBIN_U8("graphics/pokemon/hariyama/footprint.1bpp"); const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/front.4bpp.lz"); const u32 gMonPalette_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/normal.gbapal.lz"); const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back.4bpp.lz"); const u32 gMonShinyPalette_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/shiny.gbapal.lz"); const u8 gMonIcon_Electrike[] = INCBIN_U8("graphics/pokemon/electrike/icon.4bpp"); const u8 gMonFootprint_Electrike[] = INCBIN_U8("graphics/pokemon/electrike/footprint.1bpp"); const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/front.4bpp.lz"); const u32 gMonPalette_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/normal.gbapal.lz"); const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back.4bpp.lz"); const u32 gMonShinyPalette_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/shiny.gbapal.lz"); const u8 gMonIcon_Manectric[] = INCBIN_U8("graphics/pokemon/manectric/icon.4bpp"); const u8 gMonFootprint_Manectric[] = INCBIN_U8("graphics/pokemon/manectric/footprint.1bpp"); const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/front.4bpp.lz"); const u32 gMonPalette_Numel[] = INCBIN_U32("graphics/pokemon/numel/normal.gbapal.lz"); const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back.4bpp.lz"); const u32 gMonShinyPalette_Numel[] = INCBIN_U32("graphics/pokemon/numel/shiny.gbapal.lz"); const u8 gMonIcon_Numel[] = INCBIN_U8("graphics/pokemon/numel/icon.4bpp"); const u8 gMonFootprint_Numel[] = INCBIN_U8("graphics/pokemon/numel/footprint.1bpp"); const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/front.4bpp.lz"); const u32 gMonPalette_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/normal.gbapal.lz"); const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back.4bpp.lz"); const u32 gMonShinyPalette_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/shiny.gbapal.lz"); const u8 gMonIcon_Camerupt[] = INCBIN_U8("graphics/pokemon/camerupt/icon.4bpp"); const u8 gMonFootprint_Camerupt[] = INCBIN_U8("graphics/pokemon/camerupt/footprint.1bpp"); const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/front.4bpp.lz"); const u32 gMonPalette_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/normal.gbapal.lz"); const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back.4bpp.lz"); const u32 gMonShinyPalette_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/shiny.gbapal.lz"); const u8 gMonIcon_Spheal[] = INCBIN_U8("graphics/pokemon/spheal/icon.4bpp"); const u8 gMonFootprint_Spheal[] = INCBIN_U8("graphics/pokemon/spheal/footprint.1bpp"); const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/front.4bpp.lz"); const u32 gMonPalette_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/normal.gbapal.lz"); const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back.4bpp.lz"); const u32 gMonShinyPalette_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/shiny.gbapal.lz"); const u8 gMonIcon_Sealeo[] = INCBIN_U8("graphics/pokemon/sealeo/icon.4bpp"); const u8 gMonFootprint_Sealeo[] = INCBIN_U8("graphics/pokemon/sealeo/footprint.1bpp"); const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/front.4bpp.lz"); const u32 gMonPalette_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/normal.gbapal.lz"); const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back.4bpp.lz"); const u32 gMonShinyPalette_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/shiny.gbapal.lz"); const u8 gMonIcon_Walrein[] = INCBIN_U8("graphics/pokemon/walrein/icon.4bpp"); const u8 gMonFootprint_Walrein[] = INCBIN_U8("graphics/pokemon/walrein/footprint.1bpp"); const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/front.4bpp.lz"); const u32 gMonPalette_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/normal.gbapal.lz"); const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back.4bpp.lz"); const u32 gMonShinyPalette_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/shiny.gbapal.lz"); const u8 gMonIcon_Cacnea[] = INCBIN_U8("graphics/pokemon/cacnea/icon.4bpp"); const u8 gMonFootprint_Cacnea[] = INCBIN_U8("graphics/pokemon/cacnea/footprint.1bpp"); const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/front.4bpp.lz"); const u32 gMonPalette_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/normal.gbapal.lz"); const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back.4bpp.lz"); const u32 gMonShinyPalette_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/shiny.gbapal.lz"); const u8 gMonIcon_Cacturne[] = INCBIN_U8("graphics/pokemon/cacturne/icon.4bpp"); const u8 gMonFootprint_Cacturne[] = INCBIN_U8("graphics/pokemon/cacturne/footprint.1bpp"); const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/front.4bpp.lz"); const u32 gMonPalette_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/normal.gbapal.lz"); const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back.4bpp.lz"); const u32 gMonShinyPalette_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/shiny.gbapal.lz"); const u8 gMonIcon_Snorunt[] = INCBIN_U8("graphics/pokemon/snorunt/icon.4bpp"); const u8 gMonFootprint_Snorunt[] = INCBIN_U8("graphics/pokemon/snorunt/footprint.1bpp"); const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/front.4bpp.lz"); const u32 gMonPalette_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/normal.gbapal.lz"); const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back.4bpp.lz"); const u32 gMonShinyPalette_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/shiny.gbapal.lz"); const u8 gMonIcon_Glalie[] = INCBIN_U8("graphics/pokemon/glalie/icon.4bpp"); const u8 gMonFootprint_Glalie[] = INCBIN_U8("graphics/pokemon/glalie/footprint.1bpp"); const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/front.4bpp.lz"); const u32 gMonPalette_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/normal.gbapal.lz"); const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back.4bpp.lz"); const u32 gMonShinyPalette_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/shiny.gbapal.lz"); const u8 gMonIcon_Lunatone[] = INCBIN_U8("graphics/pokemon/lunatone/icon.4bpp"); const u8 gMonFootprint_Lunatone[] = INCBIN_U8("graphics/pokemon/lunatone/footprint.1bpp"); const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/front.4bpp.lz"); const u32 gMonPalette_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/normal.gbapal.lz"); const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back.4bpp.lz"); const u32 gMonShinyPalette_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/shiny.gbapal.lz"); const u8 gMonIcon_Solrock[] = INCBIN_U8("graphics/pokemon/solrock/icon.4bpp"); const u8 gMonFootprint_Solrock[] = INCBIN_U8("graphics/pokemon/solrock/footprint.1bpp"); const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/front.4bpp.lz"); const u32 gMonPalette_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/normal.gbapal.lz"); const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back.4bpp.lz"); const u32 gMonShinyPalette_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/shiny.gbapal.lz"); const u8 gMonIcon_Azurill[] = INCBIN_U8("graphics/pokemon/azurill/icon.4bpp"); const u8 gMonFootprint_Azurill[] = INCBIN_U8("graphics/pokemon/azurill/footprint.1bpp"); const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/front.4bpp.lz"); const u32 gMonPalette_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/normal.gbapal.lz"); const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back.4bpp.lz"); const u32 gMonShinyPalette_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/shiny.gbapal.lz"); const u8 gMonIcon_Spoink[] = INCBIN_U8("graphics/pokemon/spoink/icon.4bpp"); const u8 gMonFootprint_Spoink[] = INCBIN_U8("graphics/pokemon/spoink/footprint.1bpp"); const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/front.4bpp.lz"); const u32 gMonPalette_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/normal.gbapal.lz"); const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back.4bpp.lz"); const u32 gMonShinyPalette_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/shiny.gbapal.lz"); const u8 gMonIcon_Grumpig[] = INCBIN_U8("graphics/pokemon/grumpig/icon.4bpp"); const u8 gMonFootprint_Grumpig[] = INCBIN_U8("graphics/pokemon/grumpig/footprint.1bpp"); const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/front.4bpp.lz"); const u32 gMonPalette_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/normal.gbapal.lz"); const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back.4bpp.lz"); const u32 gMonShinyPalette_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/shiny.gbapal.lz"); const u8 gMonIcon_Plusle[] = INCBIN_U8("graphics/pokemon/plusle/icon.4bpp"); const u8 gMonFootprint_Plusle[] = INCBIN_U8("graphics/pokemon/plusle/footprint.1bpp"); const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/front.4bpp.lz"); const u32 gMonPalette_Minun[] = INCBIN_U32("graphics/pokemon/minun/normal.gbapal.lz"); const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back.4bpp.lz"); const u32 gMonShinyPalette_Minun[] = INCBIN_U32("graphics/pokemon/minun/shiny.gbapal.lz"); const u8 gMonIcon_Minun[] = INCBIN_U8("graphics/pokemon/minun/icon.4bpp"); const u8 gMonFootprint_Minun[] = INCBIN_U8("graphics/pokemon/minun/footprint.1bpp"); const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/front.4bpp.lz"); const u32 gMonPalette_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/normal.gbapal.lz"); const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back.4bpp.lz"); const u32 gMonShinyPalette_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/shiny.gbapal.lz"); const u8 gMonIcon_Mawile[] = INCBIN_U8("graphics/pokemon/mawile/icon.4bpp"); const u8 gMonFootprint_Mawile[] = INCBIN_U8("graphics/pokemon/mawile/footprint.1bpp"); const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/front.4bpp.lz"); const u32 gMonPalette_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/normal.gbapal.lz"); const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back.4bpp.lz"); const u32 gMonShinyPalette_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/shiny.gbapal.lz"); const u8 gMonIcon_Meditite[] = INCBIN_U8("graphics/pokemon/meditite/icon.4bpp"); const u8 gMonFootprint_Meditite[] = INCBIN_U8("graphics/pokemon/meditite/footprint.1bpp"); const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/front.4bpp.lz"); const u32 gMonPalette_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/normal.gbapal.lz"); const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back.4bpp.lz"); const u32 gMonShinyPalette_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/shiny.gbapal.lz"); const u8 gMonIcon_Medicham[] = INCBIN_U8("graphics/pokemon/medicham/icon.4bpp"); const u8 gMonFootprint_Medicham[] = INCBIN_U8("graphics/pokemon/medicham/footprint.1bpp"); const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/front.4bpp.lz"); const u32 gMonPalette_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/normal.gbapal.lz"); const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back.4bpp.lz"); const u32 gMonShinyPalette_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/shiny.gbapal.lz"); const u8 gMonIcon_Swablu[] = INCBIN_U8("graphics/pokemon/swablu/icon.4bpp"); const u8 gMonFootprint_Swablu[] = INCBIN_U8("graphics/pokemon/swablu/footprint.1bpp"); const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/front.4bpp.lz"); const u32 gMonPalette_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/normal.gbapal.lz"); const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back.4bpp.lz"); const u32 gMonShinyPalette_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/shiny.gbapal.lz"); const u8 gMonIcon_Altaria[] = INCBIN_U8("graphics/pokemon/altaria/icon.4bpp"); const u8 gMonFootprint_Altaria[] = INCBIN_U8("graphics/pokemon/altaria/footprint.1bpp"); const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/front.4bpp.lz"); const u32 gMonPalette_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/normal.gbapal.lz"); const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back.4bpp.lz"); const u32 gMonShinyPalette_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/shiny.gbapal.lz"); const u8 gMonIcon_Wynaut[] = INCBIN_U8("graphics/pokemon/wynaut/icon.4bpp"); const u8 gMonFootprint_Wynaut[] = INCBIN_U8("graphics/pokemon/wynaut/footprint.1bpp"); const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/front.4bpp.lz"); const u32 gMonPalette_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/normal.gbapal.lz"); const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back.4bpp.lz"); const u32 gMonShinyPalette_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/shiny.gbapal.lz"); const u8 gMonIcon_Duskull[] = INCBIN_U8("graphics/pokemon/duskull/icon.4bpp"); const u8 gMonFootprint_Duskull[] = INCBIN_U8("graphics/pokemon/duskull/footprint.1bpp"); const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/front.4bpp.lz"); const u32 gMonPalette_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/normal.gbapal.lz"); const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back.4bpp.lz"); const u32 gMonShinyPalette_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/shiny.gbapal.lz"); const u8 gMonIcon_Dusclops[] = INCBIN_U8("graphics/pokemon/dusclops/icon.4bpp"); const u8 gMonFootprint_Dusclops[] = INCBIN_U8("graphics/pokemon/dusclops/footprint.1bpp"); const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/front.4bpp.lz"); const u32 gMonPalette_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/normal.gbapal.lz"); const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back.4bpp.lz"); const u32 gMonShinyPalette_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/shiny.gbapal.lz"); const u8 gMonIcon_Roselia[] = INCBIN_U8("graphics/pokemon/roselia/icon.4bpp"); const u8 gMonFootprint_Roselia[] = INCBIN_U8("graphics/pokemon/roselia/footprint.1bpp"); const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/front.4bpp.lz"); const u32 gMonPalette_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/normal.gbapal.lz"); const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back.4bpp.lz"); const u32 gMonShinyPalette_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/shiny.gbapal.lz"); const u8 gMonIcon_Slakoth[] = INCBIN_U8("graphics/pokemon/slakoth/icon.4bpp"); const u8 gMonFootprint_Slakoth[] = INCBIN_U8("graphics/pokemon/slakoth/footprint.1bpp"); const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/front.4bpp.lz"); const u32 gMonPalette_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/normal.gbapal.lz"); const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back.4bpp.lz"); const u32 gMonShinyPalette_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/shiny.gbapal.lz"); const u8 gMonIcon_Vigoroth[] = INCBIN_U8("graphics/pokemon/vigoroth/icon.4bpp"); const u8 gMonFootprint_Vigoroth[] = INCBIN_U8("graphics/pokemon/vigoroth/footprint.1bpp"); const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/front.4bpp.lz"); const u32 gMonPalette_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/normal.gbapal.lz"); const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back.4bpp.lz"); const u32 gMonShinyPalette_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/shiny.gbapal.lz"); const u8 gMonIcon_Slaking[] = INCBIN_U8("graphics/pokemon/slaking/icon.4bpp"); const u8 gMonFootprint_Slaking[] = INCBIN_U8("graphics/pokemon/slaking/footprint.1bpp"); const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/front.4bpp.lz"); const u32 gMonPalette_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/normal.gbapal.lz"); const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back.4bpp.lz"); const u32 gMonShinyPalette_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/shiny.gbapal.lz"); const u8 gMonIcon_Gulpin[] = INCBIN_U8("graphics/pokemon/gulpin/icon.4bpp"); const u8 gMonFootprint_Gulpin[] = INCBIN_U8("graphics/pokemon/gulpin/footprint.1bpp"); const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/front.4bpp.lz"); const u32 gMonPalette_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/normal.gbapal.lz"); const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back.4bpp.lz"); const u32 gMonShinyPalette_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/shiny.gbapal.lz"); const u8 gMonIcon_Swalot[] = INCBIN_U8("graphics/pokemon/swalot/icon.4bpp"); const u8 gMonFootprint_Swalot[] = INCBIN_U8("graphics/pokemon/swalot/footprint.1bpp"); const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/front.4bpp.lz"); const u32 gMonPalette_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/normal.gbapal.lz"); const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back.4bpp.lz"); const u32 gMonShinyPalette_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/shiny.gbapal.lz"); const u8 gMonIcon_Tropius[] = INCBIN_U8("graphics/pokemon/tropius/icon.4bpp"); const u8 gMonFootprint_Tropius[] = INCBIN_U8("graphics/pokemon/tropius/footprint.1bpp"); const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/front.4bpp.lz"); const u32 gMonPalette_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/normal.gbapal.lz"); const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back.4bpp.lz"); const u32 gMonShinyPalette_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/shiny.gbapal.lz"); const u8 gMonIcon_Whismur[] = INCBIN_U8("graphics/pokemon/whismur/icon.4bpp"); const u8 gMonFootprint_Whismur[] = INCBIN_U8("graphics/pokemon/whismur/footprint.1bpp"); const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/front.4bpp.lz"); const u32 gMonPalette_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/normal.gbapal.lz"); const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back.4bpp.lz"); const u32 gMonShinyPalette_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/shiny.gbapal.lz"); const u8 gMonIcon_Loudred[] = INCBIN_U8("graphics/pokemon/loudred/icon.4bpp"); const u8 gMonFootprint_Loudred[] = INCBIN_U8("graphics/pokemon/loudred/footprint.1bpp"); const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/front.4bpp.lz"); const u32 gMonPalette_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/normal.gbapal.lz"); const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back.4bpp.lz"); const u32 gMonShinyPalette_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/shiny.gbapal.lz"); const u8 gMonIcon_Exploud[] = INCBIN_U8("graphics/pokemon/exploud/icon.4bpp"); const u8 gMonFootprint_Exploud[] = INCBIN_U8("graphics/pokemon/exploud/footprint.1bpp"); const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/front.4bpp.lz"); const u32 gMonPalette_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/normal.gbapal.lz"); const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back.4bpp.lz"); const u32 gMonShinyPalette_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/shiny.gbapal.lz"); const u8 gMonIcon_Clamperl[] = INCBIN_U8("graphics/pokemon/clamperl/icon.4bpp"); const u8 gMonFootprint_Clamperl[] = INCBIN_U8("graphics/pokemon/clamperl/footprint.1bpp"); const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/front.4bpp.lz"); const u32 gMonPalette_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/normal.gbapal.lz"); const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back.4bpp.lz"); const u32 gMonShinyPalette_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/shiny.gbapal.lz"); const u8 gMonIcon_Huntail[] = INCBIN_U8("graphics/pokemon/huntail/icon.4bpp"); const u8 gMonFootprint_Huntail[] = INCBIN_U8("graphics/pokemon/huntail/footprint.1bpp"); const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/front.4bpp.lz"); const u32 gMonPalette_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/normal.gbapal.lz"); const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back.4bpp.lz"); const u32 gMonShinyPalette_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/shiny.gbapal.lz"); const u8 gMonIcon_Gorebyss[] = INCBIN_U8("graphics/pokemon/gorebyss/icon.4bpp"); const u8 gMonFootprint_Gorebyss[] = INCBIN_U8("graphics/pokemon/gorebyss/footprint.1bpp"); const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/front.4bpp.lz"); const u32 gMonPalette_Absol[] = INCBIN_U32("graphics/pokemon/absol/normal.gbapal.lz"); const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back.4bpp.lz"); const u32 gMonShinyPalette_Absol[] = INCBIN_U32("graphics/pokemon/absol/shiny.gbapal.lz"); const u8 gMonIcon_Absol[] = INCBIN_U8("graphics/pokemon/absol/icon.4bpp"); const u8 gMonFootprint_Absol[] = INCBIN_U8("graphics/pokemon/absol/footprint.1bpp"); const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/front.4bpp.lz"); const u32 gMonPalette_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/normal.gbapal.lz"); const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back.4bpp.lz"); const u32 gMonShinyPalette_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/shiny.gbapal.lz"); const u8 gMonIcon_Shuppet[] = INCBIN_U8("graphics/pokemon/shuppet/icon.4bpp"); const u8 gMonFootprint_Shuppet[] = INCBIN_U8("graphics/pokemon/shuppet/footprint.1bpp"); const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/front.4bpp.lz"); const u32 gMonPalette_Banette[] = INCBIN_U32("graphics/pokemon/banette/normal.gbapal.lz"); const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back.4bpp.lz"); const u32 gMonShinyPalette_Banette[] = INCBIN_U32("graphics/pokemon/banette/shiny.gbapal.lz"); const u8 gMonIcon_Banette[] = INCBIN_U8("graphics/pokemon/banette/icon.4bpp"); const u8 gMonFootprint_Banette[] = INCBIN_U8("graphics/pokemon/banette/footprint.1bpp"); const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/front.4bpp.lz"); const u32 gMonPalette_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/normal.gbapal.lz"); const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back.4bpp.lz"); const u32 gMonShinyPalette_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/shiny.gbapal.lz"); const u8 gMonIcon_Seviper[] = INCBIN_U8("graphics/pokemon/seviper/icon.4bpp"); const u8 gMonFootprint_Seviper[] = INCBIN_U8("graphics/pokemon/seviper/footprint.1bpp"); const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/front.4bpp.lz"); const u32 gMonPalette_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/normal.gbapal.lz"); const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back.4bpp.lz"); const u32 gMonShinyPalette_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/shiny.gbapal.lz"); const u8 gMonIcon_Zangoose[] = INCBIN_U8("graphics/pokemon/zangoose/icon.4bpp"); const u8 gMonFootprint_Zangoose[] = INCBIN_U8("graphics/pokemon/zangoose/footprint.1bpp"); const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/front.4bpp.lz"); const u32 gMonPalette_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/normal.gbapal.lz"); const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back.4bpp.lz"); const u32 gMonShinyPalette_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/shiny.gbapal.lz"); const u8 gMonIcon_Relicanth[] = INCBIN_U8("graphics/pokemon/relicanth/icon.4bpp"); const u8 gMonFootprint_Relicanth[] = INCBIN_U8("graphics/pokemon/relicanth/footprint.1bpp"); const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/front.4bpp.lz"); const u32 gMonPalette_Aron[] = INCBIN_U32("graphics/pokemon/aron/normal.gbapal.lz"); const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back.4bpp.lz"); const u32 gMonShinyPalette_Aron[] = INCBIN_U32("graphics/pokemon/aron/shiny.gbapal.lz"); const u8 gMonIcon_Aron[] = INCBIN_U8("graphics/pokemon/aron/icon.4bpp"); const u8 gMonFootprint_Aron[] = INCBIN_U8("graphics/pokemon/aron/footprint.1bpp"); const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/front.4bpp.lz"); const u32 gMonPalette_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/normal.gbapal.lz"); const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back.4bpp.lz"); const u32 gMonShinyPalette_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/shiny.gbapal.lz"); const u8 gMonIcon_Lairon[] = INCBIN_U8("graphics/pokemon/lairon/icon.4bpp"); const u8 gMonFootprint_Lairon[] = INCBIN_U8("graphics/pokemon/lairon/footprint.1bpp"); const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/front.4bpp.lz"); const u32 gMonPalette_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/normal.gbapal.lz"); const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back.4bpp.lz"); const u32 gMonShinyPalette_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/shiny.gbapal.lz"); const u8 gMonIcon_Aggron[] = INCBIN_U8("graphics/pokemon/aggron/icon.4bpp"); const u8 gMonFootprint_Aggron[] = INCBIN_U8("graphics/pokemon/aggron/footprint.1bpp"); const u32 gMonFrontPic_Castform[] = INCBIN_U32("graphics/pokemon/castform/front.4bpp.lz"); const u32 gMonPalette_Castform[] = INCBIN_U32("graphics/pokemon/castform/normal.gbapal.lz"); const u32 gMonBackPic_Castform[] = INCBIN_U32("graphics/pokemon/castform/back.4bpp.lz"); const u32 gMonShinyPalette_Castform[] = INCBIN_U32("graphics/pokemon/castform/shiny.gbapal.lz"); const u8 gMonIcon_Castform[] = INCBIN_U8("graphics/pokemon/castform/icon.4bpp"); const u8 gMonFootprint_Castform[] = INCBIN_U8("graphics/pokemon/castform/footprint.1bpp"); const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/front.4bpp.lz"); const u32 gMonPalette_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/normal.gbapal.lz"); const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back.4bpp.lz"); const u32 gMonShinyPalette_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/shiny.gbapal.lz"); const u8 gMonIcon_Volbeat[] = INCBIN_U8("graphics/pokemon/volbeat/icon.4bpp"); const u8 gMonFootprint_Volbeat[] = INCBIN_U8("graphics/pokemon/volbeat/footprint.1bpp"); const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/front.4bpp.lz"); const u32 gMonPalette_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/normal.gbapal.lz"); const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back.4bpp.lz"); const u32 gMonShinyPalette_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/shiny.gbapal.lz"); const u8 gMonIcon_Illumise[] = INCBIN_U8("graphics/pokemon/illumise/icon.4bpp"); const u8 gMonFootprint_Illumise[] = INCBIN_U8("graphics/pokemon/illumise/footprint.1bpp"); const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/front.4bpp.lz"); const u32 gMonPalette_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/normal.gbapal.lz"); const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back.4bpp.lz"); const u32 gMonShinyPalette_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/shiny.gbapal.lz"); const u8 gMonIcon_Lileep[] = INCBIN_U8("graphics/pokemon/lileep/icon.4bpp"); const u8 gMonFootprint_Lileep[] = INCBIN_U8("graphics/pokemon/lileep/footprint.1bpp"); const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/front.4bpp.lz"); const u32 gMonPalette_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/normal.gbapal.lz"); const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back.4bpp.lz"); const u32 gMonShinyPalette_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/shiny.gbapal.lz"); const u8 gMonIcon_Cradily[] = INCBIN_U8("graphics/pokemon/cradily/icon.4bpp"); const u8 gMonFootprint_Cradily[] = INCBIN_U8("graphics/pokemon/cradily/footprint.1bpp"); const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/front.4bpp.lz"); const u32 gMonPalette_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/normal.gbapal.lz"); const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back.4bpp.lz"); const u32 gMonShinyPalette_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/shiny.gbapal.lz"); const u8 gMonIcon_Anorith[] = INCBIN_U8("graphics/pokemon/anorith/icon.4bpp"); const u8 gMonFootprint_Anorith[] = INCBIN_U8("graphics/pokemon/anorith/footprint.1bpp"); const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/front.4bpp.lz"); const u32 gMonPalette_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/normal.gbapal.lz"); const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back.4bpp.lz"); const u32 gMonShinyPalette_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/shiny.gbapal.lz"); const u8 gMonIcon_Armaldo[] = INCBIN_U8("graphics/pokemon/armaldo/icon.4bpp"); const u8 gMonFootprint_Armaldo[] = INCBIN_U8("graphics/pokemon/armaldo/footprint.1bpp"); const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/front.4bpp.lz"); const u32 gMonPalette_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/normal.gbapal.lz"); const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back.4bpp.lz"); const u32 gMonShinyPalette_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/shiny.gbapal.lz"); const u8 gMonIcon_Ralts[] = INCBIN_U8("graphics/pokemon/ralts/icon.4bpp"); const u8 gMonFootprint_Ralts[] = INCBIN_U8("graphics/pokemon/ralts/footprint.1bpp"); const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/front.4bpp.lz"); const u32 gMonPalette_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/normal.gbapal.lz"); const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back.4bpp.lz"); const u32 gMonShinyPalette_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/shiny.gbapal.lz"); const u8 gMonIcon_Kirlia[] = INCBIN_U8("graphics/pokemon/kirlia/icon.4bpp"); const u8 gMonFootprint_Kirlia[] = INCBIN_U8("graphics/pokemon/kirlia/footprint.1bpp"); const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/front.4bpp.lz"); const u32 gMonPalette_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/normal.gbapal.lz"); const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back.4bpp.lz"); const u32 gMonShinyPalette_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/shiny.gbapal.lz"); const u8 gMonIcon_Gardevoir[] = INCBIN_U8("graphics/pokemon/gardevoir/icon.4bpp"); const u8 gMonFootprint_Gardevoir[] = INCBIN_U8("graphics/pokemon/gardevoir/footprint.1bpp"); const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/front.4bpp.lz"); const u32 gMonPalette_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/normal.gbapal.lz"); const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back.4bpp.lz"); const u32 gMonShinyPalette_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/shiny.gbapal.lz"); const u8 gMonIcon_Bagon[] = INCBIN_U8("graphics/pokemon/bagon/icon.4bpp"); const u8 gMonFootprint_Bagon[] = INCBIN_U8("graphics/pokemon/bagon/footprint.1bpp"); const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/front.4bpp.lz"); const u32 gMonPalette_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/normal.gbapal.lz"); const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back.4bpp.lz"); const u32 gMonShinyPalette_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/shiny.gbapal.lz"); const u8 gMonIcon_Shelgon[] = INCBIN_U8("graphics/pokemon/shelgon/icon.4bpp"); const u8 gMonFootprint_Shelgon[] = INCBIN_U8("graphics/pokemon/shelgon/footprint.1bpp"); const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/front.4bpp.lz"); const u32 gMonPalette_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/normal.gbapal.lz"); const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back.4bpp.lz"); const u32 gMonShinyPalette_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/shiny.gbapal.lz"); const u8 gMonIcon_Salamence[] = INCBIN_U8("graphics/pokemon/salamence/icon.4bpp"); const u8 gMonFootprint_Salamence[] = INCBIN_U8("graphics/pokemon/salamence/footprint.1bpp"); const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/front.4bpp.lz"); const u32 gMonPalette_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/normal.gbapal.lz"); const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back.4bpp.lz"); const u32 gMonShinyPalette_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/shiny.gbapal.lz"); const u8 gMonIcon_Beldum[] = INCBIN_U8("graphics/pokemon/beldum/icon.4bpp"); const u8 gMonFootprint_Beldum[] = INCBIN_U8("graphics/pokemon/beldum/footprint.1bpp"); const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/front.4bpp.lz"); const u32 gMonPalette_Metang[] = INCBIN_U32("graphics/pokemon/metang/normal.gbapal.lz"); const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back.4bpp.lz"); const u32 gMonShinyPalette_Metang[] = INCBIN_U32("graphics/pokemon/metang/shiny.gbapal.lz"); const u8 gMonIcon_Metang[] = INCBIN_U8("graphics/pokemon/metang/icon.4bpp"); const u8 gMonFootprint_Metang[] = INCBIN_U8("graphics/pokemon/metang/footprint.1bpp"); const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/front.4bpp.lz"); const u32 gMonPalette_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/normal.gbapal.lz"); const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back.4bpp.lz"); const u32 gMonShinyPalette_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/shiny.gbapal.lz"); const u8 gMonIcon_Metagross[] = INCBIN_U8("graphics/pokemon/metagross/icon.4bpp"); const u8 gMonFootprint_Metagross[] = INCBIN_U8("graphics/pokemon/metagross/footprint.1bpp"); const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/front.4bpp.lz"); const u32 gMonPalette_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/normal.gbapal.lz"); const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back.4bpp.lz"); const u32 gMonShinyPalette_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/shiny.gbapal.lz"); const u8 gMonIcon_Regirock[] = INCBIN_U8("graphics/pokemon/regirock/icon.4bpp"); const u8 gMonFootprint_Regirock[] = INCBIN_U8("graphics/pokemon/regirock/footprint.1bpp"); const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/front.4bpp.lz"); const u32 gMonPalette_Regice[] = INCBIN_U32("graphics/pokemon/regice/normal.gbapal.lz"); const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back.4bpp.lz"); const u32 gMonShinyPalette_Regice[] = INCBIN_U32("graphics/pokemon/regice/shiny.gbapal.lz"); const u8 gMonIcon_Regice[] = INCBIN_U8("graphics/pokemon/regice/icon.4bpp"); const u8 gMonFootprint_Regice[] = INCBIN_U8("graphics/pokemon/regice/footprint.1bpp"); const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/front.4bpp.lz"); const u32 gMonPalette_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/normal.gbapal.lz"); const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back.4bpp.lz"); const u32 gMonShinyPalette_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/shiny.gbapal.lz"); const u8 gMonIcon_Registeel[] = INCBIN_U8("graphics/pokemon/registeel/icon.4bpp"); const u8 gMonFootprint_Registeel[] = INCBIN_U8("graphics/pokemon/registeel/footprint.1bpp"); const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/front.4bpp.lz"); const u32 gMonPalette_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/normal.gbapal.lz"); const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back.4bpp.lz"); const u32 gMonShinyPalette_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/shiny.gbapal.lz"); const u8 gMonIcon_Kyogre[] = INCBIN_U8("graphics/pokemon/kyogre/icon.4bpp"); const u8 gMonFootprint_Kyogre[] = INCBIN_U8("graphics/pokemon/kyogre/footprint.1bpp"); const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/front.4bpp.lz"); const u32 gMonPalette_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/normal.gbapal.lz"); const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back.4bpp.lz"); const u32 gMonShinyPalette_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/shiny.gbapal.lz"); const u8 gMonIcon_Groudon[] = INCBIN_U8("graphics/pokemon/groudon/icon.4bpp"); const u8 gMonFootprint_Groudon[] = INCBIN_U8("graphics/pokemon/groudon/footprint.1bpp"); const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/front.4bpp.lz"); const u32 gMonPalette_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/normal.gbapal.lz"); const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back.4bpp.lz"); const u32 gMonShinyPalette_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/shiny.gbapal.lz"); const u8 gMonIcon_Rayquaza[] = INCBIN_U8("graphics/pokemon/rayquaza/icon.4bpp"); const u8 gMonFootprint_Rayquaza[] = INCBIN_U8("graphics/pokemon/rayquaza/footprint.1bpp"); const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/front.4bpp.lz"); const u32 gMonPalette_Latias[] = INCBIN_U32("graphics/pokemon/latias/normal.gbapal.lz"); const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back.4bpp.lz"); const u32 gMonShinyPalette_Latias[] = INCBIN_U32("graphics/pokemon/latias/shiny.gbapal.lz"); const u8 gMonIcon_Latias[] = INCBIN_U8("graphics/pokemon/latias/icon.4bpp"); const u8 gMonFootprint_Latias[] = INCBIN_U8("graphics/pokemon/latias/footprint.1bpp"); const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/front.4bpp.lz"); const u32 gMonPalette_Latios[] = INCBIN_U32("graphics/pokemon/latios/normal.gbapal.lz"); const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back.4bpp.lz"); const u32 gMonShinyPalette_Latios[] = INCBIN_U32("graphics/pokemon/latios/shiny.gbapal.lz"); const u8 gMonIcon_Latios[] = INCBIN_U8("graphics/pokemon/latios/icon.4bpp"); const u8 gMonFootprint_Latios[] = INCBIN_U8("graphics/pokemon/latios/footprint.1bpp"); const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/front.4bpp.lz"); const u32 gMonPalette_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/normal.gbapal.lz"); const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back.4bpp.lz"); const u32 gMonShinyPalette_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/shiny.gbapal.lz"); const u8 gMonIcon_Jirachi[] = INCBIN_U8("graphics/pokemon/jirachi/icon.4bpp"); const u8 gMonFootprint_Jirachi[] = INCBIN_U8("graphics/pokemon/jirachi/footprint.1bpp"); const u32 gMonFrontPic_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/front.4bpp.lz"); const u32 gMonPalette_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/normal.gbapal.lz"); const u32 gMonBackPic_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/back.4bpp.lz"); const u32 gMonShinyPalette_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/shiny.gbapal.lz"); const u8 gMonIcon_Deoxys[] = INCBIN_U8("graphics/pokemon/deoxys/icon.4bpp", "graphics/pokemon/deoxys/icon_attack.4bpp", "graphics/pokemon/deoxys/icon_defense.4bpp", "graphics/pokemon/deoxys/icon_speed.4bpp"); const u8 gMonFootprint_Deoxys[] = INCBIN_U8("graphics/pokemon/deoxys/footprint.1bpp"); const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/front.4bpp.lz"); const u32 gMonPalette_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/normal.gbapal.lz"); const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back.4bpp.lz"); const u32 gMonShinyPalette_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/shiny.gbapal.lz"); const u8 gMonIcon_Chimecho[] = INCBIN_U8("graphics/pokemon/chimecho/icon.4bpp"); const u8 gMonFootprint_Chimecho[] = INCBIN_U8("graphics/pokemon/chimecho/footprint.1bpp"); const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/front.4bpp.lz"); const u32 gMonPalette_Egg[] = INCBIN_U32("graphics/pokemon/egg/normal.gbapal.lz"); const u32 gMonFrontPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/front.4bpp.lz"); const u32 gMonBackPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/back.4bpp.lz"); const u8 gMonIcon_UnownB[] = INCBIN_U8("graphics/pokemon/unown/b/icon.4bpp"); const u32 gMonFrontPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/front.4bpp.lz"); const u32 gMonBackPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/back.4bpp.lz"); const u8 gMonIcon_UnownC[] = INCBIN_U8("graphics/pokemon/unown/c/icon.4bpp"); const u32 gMonFrontPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/front.4bpp.lz"); const u32 gMonBackPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/back.4bpp.lz"); const u8 gMonIcon_UnownD[] = INCBIN_U8("graphics/pokemon/unown/d/icon.4bpp"); const u32 gMonFrontPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/front.4bpp.lz"); const u32 gMonBackPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/back.4bpp.lz"); const u8 gMonIcon_UnownE[] = INCBIN_U8("graphics/pokemon/unown/e/icon.4bpp"); const u32 gMonFrontPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/front.4bpp.lz"); const u32 gMonBackPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/back.4bpp.lz"); const u8 gMonIcon_UnownF[] = INCBIN_U8("graphics/pokemon/unown/f/icon.4bpp"); const u32 gMonFrontPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/front.4bpp.lz"); const u32 gMonBackPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/back.4bpp.lz"); const u8 gMonIcon_UnownG[] = INCBIN_U8("graphics/pokemon/unown/g/icon.4bpp"); const u32 gMonFrontPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/front.4bpp.lz"); const u32 gMonBackPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/back.4bpp.lz"); const u8 gMonIcon_UnownH[] = INCBIN_U8("graphics/pokemon/unown/h/icon.4bpp"); const u32 gMonFrontPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/front.4bpp.lz"); const u32 gMonBackPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/back.4bpp.lz"); const u8 gMonIcon_UnownI[] = INCBIN_U8("graphics/pokemon/unown/i/icon.4bpp"); const u32 gMonFrontPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/front.4bpp.lz"); const u32 gMonBackPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/back.4bpp.lz"); const u8 gMonIcon_UnownJ[] = INCBIN_U8("graphics/pokemon/unown/j/icon.4bpp"); const u32 gMonFrontPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/front.4bpp.lz"); const u32 gMonBackPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/back.4bpp.lz"); const u8 gMonIcon_UnownK[] = INCBIN_U8("graphics/pokemon/unown/k/icon.4bpp"); const u32 gMonFrontPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/front.4bpp.lz"); const u32 gMonBackPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/back.4bpp.lz"); const u8 gMonIcon_UnownL[] = INCBIN_U8("graphics/pokemon/unown/l/icon.4bpp"); const u32 gMonFrontPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/front.4bpp.lz"); const u32 gMonBackPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/back.4bpp.lz"); const u8 gMonIcon_UnownM[] = INCBIN_U8("graphics/pokemon/unown/m/icon.4bpp"); const u32 gMonFrontPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/front.4bpp.lz"); const u32 gMonBackPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/back.4bpp.lz"); const u8 gMonIcon_UnownN[] = INCBIN_U8("graphics/pokemon/unown/n/icon.4bpp"); const u32 gMonFrontPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/front.4bpp.lz"); const u32 gMonBackPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/back.4bpp.lz"); const u8 gMonIcon_UnownO[] = INCBIN_U8("graphics/pokemon/unown/o/icon.4bpp"); const u32 gMonFrontPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/front.4bpp.lz"); const u32 gMonBackPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/back.4bpp.lz"); const u8 gMonIcon_UnownP[] = INCBIN_U8("graphics/pokemon/unown/p/icon.4bpp"); const u32 gMonFrontPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/front.4bpp.lz"); const u32 gMonBackPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/back.4bpp.lz"); const u8 gMonIcon_UnownQ[] = INCBIN_U8("graphics/pokemon/unown/q/icon.4bpp"); const u32 gMonFrontPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/front.4bpp.lz"); const u32 gMonBackPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/back.4bpp.lz"); const u8 gMonIcon_UnownR[] = INCBIN_U8("graphics/pokemon/unown/r/icon.4bpp"); const u32 gMonFrontPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/front.4bpp.lz"); const u32 gMonBackPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/back.4bpp.lz"); const u8 gMonIcon_UnownS[] = INCBIN_U8("graphics/pokemon/unown/s/icon.4bpp"); const u32 gMonFrontPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/front.4bpp.lz"); const u32 gMonBackPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/back.4bpp.lz"); const u8 gMonIcon_UnownT[] = INCBIN_U8("graphics/pokemon/unown/t/icon.4bpp"); const u32 gMonFrontPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/front.4bpp.lz"); const u32 gMonBackPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/back.4bpp.lz"); const u8 gMonIcon_UnownU[] = INCBIN_U8("graphics/pokemon/unown/u/icon.4bpp"); const u32 gMonFrontPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/front.4bpp.lz"); const u32 gMonBackPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/back.4bpp.lz"); const u8 gMonIcon_UnownV[] = INCBIN_U8("graphics/pokemon/unown/v/icon.4bpp"); const u32 gMonFrontPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/front.4bpp.lz"); const u32 gMonBackPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/back.4bpp.lz"); const u8 gMonIcon_UnownW[] = INCBIN_U8("graphics/pokemon/unown/w/icon.4bpp"); const u32 gMonFrontPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/front.4bpp.lz"); const u32 gMonBackPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/back.4bpp.lz"); const u8 gMonIcon_UnownX[] = INCBIN_U8("graphics/pokemon/unown/x/icon.4bpp"); const u32 gMonFrontPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/front.4bpp.lz"); const u32 gMonBackPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/back.4bpp.lz"); const u8 gMonIcon_UnownY[] = INCBIN_U8("graphics/pokemon/unown/y/icon.4bpp"); const u32 gMonFrontPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/front.4bpp.lz"); const u32 gMonBackPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/back.4bpp.lz"); const u8 gMonIcon_UnownZ[] = INCBIN_U8("graphics/pokemon/unown/z/icon.4bpp"); const u32 gMonFrontPic_UnownExclamationMark[] = INCBIN_U32("graphics/pokemon/unown/exclamation_mark/front.4bpp.lz"); const u32 gMonBackPic_UnownExclamationMark[] = INCBIN_U32("graphics/pokemon/unown/exclamation_mark/back.4bpp.lz"); const u8 gMonIcon_UnownExclamationMark[] = INCBIN_U8("graphics/pokemon/unown/exclamation_mark/icon.4bpp"); const u32 gMonFrontPic_UnownQuestionMark[] = INCBIN_U32("graphics/pokemon/unown/question_mark/front.4bpp.lz"); const u32 gMonBackPic_UnownQuestionMark[] = INCBIN_U32("graphics/pokemon/unown/question_mark/back.4bpp.lz"); const u8 gMonIcon_UnownQuestionMark[] = INCBIN_U8("graphics/pokemon/unown/question_mark/icon.4bpp"); ================================================ FILE: src/data/graphics/trainers.h ================================================ const u32 gTrainerFrontPic_AquaLeaderArchie[] = INCBIN_U32("graphics/trainers/front_pics/aqua_leader_archie_front_pic.4bpp.lz"); const u32 gTrainerPalette_AquaLeaderArchie[] = INCBIN_U32("graphics/trainers/palettes/aqua_leader_archie.gbapal.lz"); const u32 gTrainerFrontPic_AquaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_AquaGruntM[] = INCBIN_U32("graphics/trainers/palettes/aqua_grunt_m.gbapal.lz"); const u32 gTrainerFrontPic_AquaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_AquaGruntF[] = INCBIN_U32("graphics/trainers/palettes/aqua_grunt_f.gbapal.lz"); const u32 gTrainerFrontPic_RSAromaLady[] = INCBIN_U32("graphics/trainers/front_pics/rs_aroma_lady_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSAromaLady[] = INCBIN_U32("graphics/trainers/palettes/rs_aroma_lady.gbapal.lz"); const u32 gTrainerFrontPic_RSRuinManiac[] = INCBIN_U32("graphics/trainers/front_pics/rs_ruin_maniac_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSRuinManiac[] = INCBIN_U32("graphics/trainers/palettes/rs_ruin_maniac.gbapal.lz"); const u32 gTrainerFrontPic_Interviewer[] = INCBIN_U32("graphics/trainers/front_pics/interviewer_front_pic.4bpp.lz"); const u32 gTrainerPalette_Interviewer[] = INCBIN_U32("graphics/trainers/palettes/interviewer.gbapal.lz"); const u32 gTrainerFrontPic_RSTuberF[] = INCBIN_U32("graphics/trainers/front_pics/rs_tuber_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSTuberF[] = INCBIN_U32("graphics/trainers/palettes/rs_tuber_f.gbapal.lz"); const u32 gTrainerFrontPic_TuberM[] = INCBIN_U32("graphics/trainers/front_pics/tuber_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_TuberM[] = INCBIN_U32("graphics/trainers/palettes/tuber_m.gbapal.lz"); const u32 gTrainerFrontPic_RSCooltrainerM[] = INCBIN_U32("graphics/trainers/front_pics/rs_cool_trainer_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSCooltrainerM[] = INCBIN_U32("graphics/trainers/palettes/rs_cool_trainer_m.gbapal.lz"); const u32 gTrainerFrontPic_RSCooltrainerF[] = INCBIN_U32("graphics/trainers/front_pics/rs_cool_trainer_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSCooltrainerF[] = INCBIN_U32("graphics/trainers/palettes/rs_cool_trainer_f.gbapal.lz"); const u32 gTrainerFrontPic_HexManiac[] = INCBIN_U32("graphics/trainers/front_pics/hex_maniac_front_pic.4bpp.lz"); const u32 gTrainerPalette_HexManiac[] = INCBIN_U32("graphics/trainers/palettes/hex_maniac.gbapal.lz"); const u32 gTrainerFrontPic_RSLady[] = INCBIN_U32("graphics/trainers/front_pics/rs_lady_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSLady[] = INCBIN_U32("graphics/trainers/palettes/rs_lady.gbapal.lz"); const u32 gTrainerFrontPic_RSBeauty[] = INCBIN_U32("graphics/trainers/front_pics/rs_beauty_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSBeauty[] = INCBIN_U32("graphics/trainers/palettes/rs_beauty.gbapal.lz"); const u32 gTrainerFrontPic_RichBoy[] = INCBIN_U32("graphics/trainers/front_pics/rich_boy_front_pic.4bpp.lz"); const u32 gTrainerPalette_RichBoy[] = INCBIN_U32("graphics/trainers/palettes/rich_boy.gbapal.lz"); const u32 gTrainerFrontPic_RSPokeManiac[] = INCBIN_U32("graphics/trainers/front_pics/rs_pokemaniac_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSPokeManiac[] = INCBIN_U32("graphics/trainers/palettes/rs_pokemaniac.gbapal.lz"); const u32 gTrainerFrontPic_RSSwimmerM[] = INCBIN_U32("graphics/trainers/front_pics/rs_swimmer_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSSwimmerM[] = INCBIN_U32("graphics/trainers/palettes/rs_swimmer_m.gbapal.lz"); const u32 gTrainerFrontPic_RSBlackBelt[] = INCBIN_U32("graphics/trainers/front_pics/rs_black_belt_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSBlackBelt[] = INCBIN_U32("graphics/trainers/palettes/rs_black_belt.gbapal.lz"); const u32 gTrainerFrontPic_Guitarist[] = INCBIN_U32("graphics/trainers/front_pics/guitarist_front_pic.4bpp.lz"); const u32 gTrainerPalette_Guitarist[] = INCBIN_U32("graphics/trainers/palettes/guitarist.gbapal.lz"); const u32 gTrainerFrontPic_Kindler[] = INCBIN_U32("graphics/trainers/front_pics/kindler_front_pic.4bpp.lz"); const u32 gTrainerPalette_Kindler[] = INCBIN_U32("graphics/trainers/palettes/kindler.gbapal.lz"); const u32 gTrainerFrontPic_RSCamper[] = INCBIN_U32("graphics/trainers/front_pics/rs_camper_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSCamper[] = INCBIN_U32("graphics/trainers/palettes/rs_camper.gbapal.lz"); const u32 gTrainerFrontPic_BugManiac[] = INCBIN_U32("graphics/trainers/front_pics/bug_maniac_front_pic.4bpp.lz"); const u32 gTrainerPalette_BugManiac[] = INCBIN_U32("graphics/trainers/palettes/bug_maniac.gbapal.lz"); const u32 gTrainerFrontPic_RSPsychicM[] = INCBIN_U32("graphics/trainers/front_pics/rs_psychic_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSPsychicM[] = INCBIN_U32("graphics/trainers/palettes/rs_psychic_m.gbapal.lz"); const u32 gTrainerFrontPic_RSPsychicF[] = INCBIN_U32("graphics/trainers/front_pics/rs_psychic_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSPsychicF[] = INCBIN_U32("graphics/trainers/palettes/rs_psychic_f.gbapal.lz"); const u32 gTrainerFrontPic_RSGentleman[] = INCBIN_U32("graphics/trainers/front_pics/rs_gentleman_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSGentleman[] = INCBIN_U32("graphics/trainers/palettes/rs_gentleman.gbapal.lz"); const u32 gTrainerFrontPic_EliteFourSidney[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_sidney_front_pic.4bpp.lz"); const u32 gTrainerPalette_EliteFourSidney[] = INCBIN_U32("graphics/trainers/palettes/elite_four_sidney.gbapal.lz"); const u32 gTrainerFrontPic_EliteFourPhoebe[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_phoebe_front_pic.4bpp.lz"); const u32 gTrainerPalette_EliteFourPhoebe[] = INCBIN_U32("graphics/trainers/palettes/elite_four_phoebe.gbapal.lz"); const u32 gTrainerFrontPic_LeaderRoxanne[] = INCBIN_U32("graphics/trainers/front_pics/leader_roxanne_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderRoxanne[] = INCBIN_U32("graphics/trainers/palettes/leader_roxanne.gbapal.lz"); const u32 gTrainerFrontPic_LeaderBrawly[] = INCBIN_U32("graphics/trainers/front_pics/leader_brawly_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderBrawly[] = INCBIN_U32("graphics/trainers/palettes/leader_brawly.gbapal.lz"); const u32 gTrainerFrontPic_LeaderTateAndLiza[] = INCBIN_U32("graphics/trainers/front_pics/leader_tate_and_liza_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderTateAndLiza[] = INCBIN_U32("graphics/trainers/palettes/leader_tate_and_liza.gbapal.lz"); const u32 gTrainerFrontPic_SchoolKidM[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_SchoolKidM[] = INCBIN_U32("graphics/trainers/palettes/school_kid_m.gbapal.lz"); const u32 gTrainerFrontPic_SchoolKidF[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_SchoolKidF[] = INCBIN_U32("graphics/trainers/palettes/school_kid_f.gbapal.lz"); const u32 gTrainerFrontPic_SrAndJr[] = INCBIN_U32("graphics/trainers/front_pics/sr_and_jr_front_pic.4bpp.lz"); const u32 gTrainerPalette_SrAndJr[] = INCBIN_U32("graphics/trainers/palettes/sr_and_jr.gbapal.lz"); const u32 gTrainerFrontPic_PokefanM[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_PokefanM[] = INCBIN_U32("graphics/trainers/palettes/pokefan_m.gbapal.lz"); const u32 gTrainerFrontPic_PokefanF[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_PokefanF[] = INCBIN_U32("graphics/trainers/palettes/pokefan_f.gbapal.lz"); const u32 gTrainerFrontPic_ExpertM[] = INCBIN_U32("graphics/trainers/front_pics/expert_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_ExpertM[] = INCBIN_U32("graphics/trainers/palettes/expert_m.gbapal.lz"); const u32 gTrainerFrontPic_ExpertF[] = INCBIN_U32("graphics/trainers/front_pics/expert_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_ExpertF[] = INCBIN_U32("graphics/trainers/palettes/expert_f.gbapal.lz"); const u32 gTrainerFrontPic_RSYoungster[] = INCBIN_U32("graphics/trainers/front_pics/rs_youngster_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSYoungster[] = INCBIN_U32("graphics/trainers/palettes/rs_youngster.gbapal.lz"); const u32 gTrainerFrontPic_ChampionSteven[] = INCBIN_U32("graphics/trainers/front_pics/champion_steven_front_pic.4bpp.lz"); const u32 gTrainerPalette_ChampionSteven[] = INCBIN_U32("graphics/trainers/palettes/champion_steven.gbapal.lz"); const u32 gTrainerFrontPic_RSFisherman[] = INCBIN_U32("graphics/trainers/front_pics/rs_fisherman_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSFisherman[] = INCBIN_U32("graphics/trainers/palettes/rs_fisherman.gbapal.lz"); const u32 gTrainerFrontPic_CyclingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_CyclingTriathleteM[] = INCBIN_U32("graphics/trainers/palettes/cycling_triathlete_m.gbapal.lz"); const u32 gTrainerFrontPic_CyclingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_CyclingTriathleteF[] = INCBIN_U32("graphics/trainers/palettes/cycling_triathlete_f.gbapal.lz"); const u32 gTrainerFrontPic_RunningTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_RunningTriathleteM[] = INCBIN_U32("graphics/trainers/palettes/running_triathlete_m.gbapal.lz"); const u32 gTrainerFrontPic_RunningTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_RunningTriathleteF[] = INCBIN_U32("graphics/trainers/palettes/running_triathlete_f.gbapal.lz"); const u32 gTrainerFrontPic_SwimmingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_SwimmingTriathleteM[] = INCBIN_U32("graphics/trainers/palettes/swimming_triathlete_m.gbapal.lz"); const u32 gTrainerFrontPic_SwimmingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_SwimmingTriathleteF[] = INCBIN_U32("graphics/trainers/palettes/swimming_triathlete_f.gbapal.lz"); const u32 gTrainerFrontPic_DragonTamer[] = INCBIN_U32("graphics/trainers/front_pics/dragon_tamer_front_pic.4bpp.lz"); const u32 gTrainerPalette_DragonTamer[] = INCBIN_U32("graphics/trainers/palettes/dragon_tamer.gbapal.lz"); const u32 gTrainerFrontPic_RSBirdKeeper[] = INCBIN_U32("graphics/trainers/front_pics/rs_bird_keeper_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSBirdKeeper[] = INCBIN_U32("graphics/trainers/palettes/rs_bird_keeper.gbapal.lz"); const u32 gTrainerFrontPic_NinjaBoy[] = INCBIN_U32("graphics/trainers/front_pics/ninja_boy_front_pic.4bpp.lz"); const u32 gTrainerPalette_NinjaBoy[] = INCBIN_U32("graphics/trainers/palettes/ninja_boy.gbapal.lz"); const u32 gTrainerFrontPic_BattleGirl[] = INCBIN_U32("graphics/trainers/front_pics/battle_girl_front_pic.4bpp.lz"); const u32 gTrainerPalette_BattleGirl[] = INCBIN_U32("graphics/trainers/palettes/battle_girl.gbapal.lz"); const u32 gTrainerFrontPic_ParasolLady[] = INCBIN_U32("graphics/trainers/front_pics/parasol_lady_front_pic.4bpp.lz"); const u32 gTrainerPalette_ParasolLady[] = INCBIN_U32("graphics/trainers/palettes/parasol_lady.gbapal.lz"); const u32 gTrainerFrontPic_RSSwimmerF[] = INCBIN_U32("graphics/trainers/front_pics/rs_swimmer_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSSwimmerF[] = INCBIN_U32("graphics/trainers/palettes/rs_swimmer_f.gbapal.lz"); const u32 gTrainerFrontPic_RSPicnicker[] = INCBIN_U32("graphics/trainers/front_pics/rs_picnicker_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSPicnicker[] = INCBIN_U32("graphics/trainers/palettes/rs_picnicker.gbapal.lz"); const u32 gTrainerFrontPic_RSTwins[] = INCBIN_U32("graphics/trainers/front_pics/rs_twins_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSTwins[] = INCBIN_U32("graphics/trainers/palettes/rs_twins.gbapal.lz"); const u32 gTrainerFrontPic_RSSailor[] = INCBIN_U32("graphics/trainers/front_pics/rs_sailor_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSSailor[] = INCBIN_U32("graphics/trainers/palettes/rs_sailor.gbapal.lz"); const u32 gTrainerFrontPic_Collector[] = INCBIN_U32("graphics/trainers/front_pics/collector_front_pic.4bpp.lz"); const u32 gTrainerPalette_Collector[] = INCBIN_U32("graphics/trainers/palettes/collector.gbapal.lz"); const u32 gTrainerFrontPic_Wally[] = INCBIN_U32("graphics/trainers/front_pics/wally_front_pic.4bpp.lz"); const u32 gTrainerPalette_Wally[] = INCBIN_U32("graphics/trainers/palettes/wally.gbapal.lz"); const u32 gTrainerFrontPic_RSBrendan1[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_brendan_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSBrendan1[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz"); const u32 gTrainerFrontPic_RSMay1[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSMay1[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz"); const u32 gTrainerFrontPic_RSPokemonBreederM[] = INCBIN_U32("graphics/trainers/front_pics/rs_pokemon_breeder_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSPokemonBreederM[] = INCBIN_U32("graphics/trainers/palettes/rs_pokemon_breeder_m.gbapal.lz"); const u32 gTrainerFrontPic_RSPokemonBreederF[] = INCBIN_U32("graphics/trainers/front_pics/rs_pokemon_breeder_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSPokemonBreederF[] = INCBIN_U32("graphics/trainers/palettes/rs_pokemon_breeder_f.gbapal.lz"); const u32 gTrainerFrontPic_RSPokemonRangerM[] = INCBIN_U32("graphics/trainers/front_pics/rs_pokemon_ranger_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSPokemonRangerM[] = INCBIN_U32("graphics/trainers/palettes/rs_pokemon_ranger_m.gbapal.lz"); const u32 gTrainerFrontPic_RSPokemonRangerF[] = INCBIN_U32("graphics/trainers/front_pics/rs_pokemon_ranger_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSPokemonRangerF[] = INCBIN_U32("graphics/trainers/palettes/rs_pokemon_ranger_f.gbapal.lz"); const u32 gTrainerFrontPic_MagmaLeaderMaxie[] = INCBIN_U32("graphics/trainers/front_pics/magma_leader_maxie_front_pic.4bpp.lz"); const u32 gTrainerPalette_MagmaLeaderMaxie[] = INCBIN_U32("graphics/trainers/palettes/magma_leader_maxie.gbapal.lz"); const u32 gTrainerFrontPic_MagmaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_MagmaGruntM[] = INCBIN_U32("graphics/trainers/palettes/magma_grunt_m.gbapal.lz"); const u32 gTrainerFrontPic_MagmaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_MagmaGruntF[] = INCBIN_U32("graphics/trainers/palettes/magma_grunt_f.gbapal.lz"); const u32 gTrainerFrontPic_RSLass[] = INCBIN_U32("graphics/trainers/front_pics/rs_lass_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSLass[] = INCBIN_U32("graphics/trainers/palettes/rs_lass.gbapal.lz"); const u32 gTrainerFrontPic_RSBugCatcher[] = INCBIN_U32("graphics/trainers/front_pics/rs_bug_catcher_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSBugCatcher[] = INCBIN_U32("graphics/trainers/palettes/rs_bug_catcher.gbapal.lz"); const u32 gTrainerFrontPic_RSHiker[] = INCBIN_U32("graphics/trainers/front_pics/rs_hiker_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSHiker[] = INCBIN_U32("graphics/trainers/palettes/rs_hiker.gbapal.lz"); const u32 gTrainerFrontPic_RSYoungCouple[] = INCBIN_U32("graphics/trainers/front_pics/rs_young_couple_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSYoungCouple[] = INCBIN_U32("graphics/trainers/palettes/rs_young_couple.gbapal.lz"); const u32 gTrainerFrontPic_OldCouple[] = INCBIN_U32("graphics/trainers/front_pics/old_couple_front_pic.4bpp.lz"); const u32 gTrainerPalette_OldCouple[] = INCBIN_U32("graphics/trainers/palettes/old_couple.gbapal.lz"); const u32 gTrainerFrontPic_RSSisAndBro[] = INCBIN_U32("graphics/trainers/front_pics/rs_sis_and_bro_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSSisAndBro[] = INCBIN_U32("graphics/trainers/palettes/rs_sis_and_bro.gbapal.lz"); const u32 gTrainerFrontPic_AquaAdminM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_AquaAdminM[] = INCBIN_U32("graphics/trainers/palettes/aqua_admin_m.gbapal.lz"); const u32 gTrainerFrontPic_AquaAdminF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_AquaAdminF[] = INCBIN_U32("graphics/trainers/palettes/aqua_admin_f.gbapal.lz"); const u32 gTrainerFrontPic_MagmaAdminM[] = INCBIN_U32("graphics/trainers/front_pics/magma_admin_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_MagmaAdminM[] = INCBIN_U32("graphics/trainers/palettes/magma_admin_m.gbapal.lz"); const u32 gTrainerFrontPic_MagmaAdminF[] = INCBIN_U32("graphics/trainers/front_pics/magma_admin_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_MagmaAdminF[] = INCBIN_U32("graphics/trainers/palettes/magma_admin_f.gbapal.lz"); const u32 gTrainerFrontPic_LeaderWattson[] = INCBIN_U32("graphics/trainers/front_pics/leader_wattson_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderWattson[] = INCBIN_U32("graphics/trainers/palettes/leader_wattson.gbapal.lz"); const u32 gTrainerFrontPic_LeaderFlannery[] = INCBIN_U32("graphics/trainers/front_pics/leader_flannery_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderFlannery[] = INCBIN_U32("graphics/trainers/palettes/leader_flannery.gbapal.lz"); const u32 gTrainerFrontPic_LeaderNorman[] = INCBIN_U32("graphics/trainers/front_pics/leader_norman_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderNorman[] = INCBIN_U32("graphics/trainers/palettes/leader_norman.gbapal.lz"); const u32 gTrainerFrontPic_LeaderWinona[] = INCBIN_U32("graphics/trainers/front_pics/leader_winona_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderWinona[] = INCBIN_U32("graphics/trainers/palettes/leader_winona.gbapal.lz"); const u32 gTrainerFrontPic_LeaderWallace[] = INCBIN_U32("graphics/trainers/front_pics/leader_wallace_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderWallace[] = INCBIN_U32("graphics/trainers/palettes/leader_wallace.gbapal.lz"); const u32 gTrainerFrontPic_EliteFourGlacia[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_glacia_front_pic.4bpp.lz"); const u32 gTrainerPalette_EliteFourGlacia[] = INCBIN_U32("graphics/trainers/palettes/elite_four_glacia.gbapal.lz"); const u32 gTrainerFrontPic_EliteFourDrake[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_drake_front_pic.4bpp.lz"); const u32 gTrainerPalette_EliteFourDrake[] = INCBIN_U32("graphics/trainers/palettes/elite_four_drake.gbapal.lz"); const u32 gTrainerFrontPic_Youngster[] = INCBIN_U32("graphics/trainers/front_pics/youngster_front_pic.4bpp.lz"); const u32 gTrainerPalette_Youngster[] = INCBIN_U32("graphics/trainers/palettes/youngster.gbapal.lz"); const u32 gTrainerFrontPic_BugCatcher[] = INCBIN_U32("graphics/trainers/front_pics/bug_catcher_front_pic.4bpp.lz"); const u32 gTrainerPalette_BugCatcher[] = INCBIN_U32("graphics/trainers/palettes/bug_catcher.gbapal.lz"); const u32 gTrainerFrontPic_Lass[] = INCBIN_U32("graphics/trainers/front_pics/lass_front_pic.4bpp.lz"); const u32 gTrainerPalette_Lass[] = INCBIN_U32("graphics/trainers/palettes/lass.gbapal.lz"); const u32 gTrainerFrontPic_Sailor[] = INCBIN_U32("graphics/trainers/front_pics/sailor_front_pic.4bpp.lz"); const u32 gTrainerPalette_Sailor[] = INCBIN_U32("graphics/trainers/palettes/sailor.gbapal.lz"); const u32 gTrainerFrontPic_Camper[] = INCBIN_U32("graphics/trainers/front_pics/camper_front_pic.4bpp.lz"); const u32 gTrainerPalette_Camper[] = INCBIN_U32("graphics/trainers/palettes/camper.gbapal.lz"); const u32 gTrainerFrontPic_Picnicker[] = INCBIN_U32("graphics/trainers/front_pics/picnicker_front_pic.4bpp.lz"); const u32 gTrainerPalette_Picnicker[] = INCBIN_U32("graphics/trainers/palettes/picnicker.gbapal.lz"); const u32 gTrainerFrontPic_PokeManiac[] = INCBIN_U32("graphics/trainers/front_pics/pokemaniac_front_pic.4bpp.lz"); const u32 gTrainerPalette_PokeManiac[] = INCBIN_U32("graphics/trainers/palettes/pokemaniac.gbapal.lz"); const u32 gTrainerFrontPic_SuperNerd[] = INCBIN_U32("graphics/trainers/front_pics/super_nerd_front_pic.4bpp.lz"); const u32 gTrainerPalette_SuperNerd[] = INCBIN_U32("graphics/trainers/palettes/super_nerd.gbapal.lz"); const u32 gTrainerFrontPic_Hiker[] = INCBIN_U32("graphics/trainers/front_pics/hiker_front_pic.4bpp.lz"); const u32 gTrainerPalette_Hiker[] = INCBIN_U32("graphics/trainers/palettes/hiker.gbapal.lz"); const u32 gTrainerFrontPic_Biker[] = INCBIN_U32("graphics/trainers/front_pics/biker_front_pic.4bpp.lz"); const u32 gTrainerPalette_Biker[] = INCBIN_U32("graphics/trainers/palettes/biker.gbapal.lz"); const u32 gTrainerFrontPic_Burglar[] = INCBIN_U32("graphics/trainers/front_pics/burglar_front_pic.4bpp.lz"); const u32 gTrainerPalette_Burglar[] = INCBIN_U32("graphics/trainers/palettes/burglar.gbapal.lz"); const u32 gTrainerFrontPic_Engineer[] = INCBIN_U32("graphics/trainers/front_pics/engineer_front_pic.4bpp.lz"); const u32 gTrainerPalette_Engineer[] = INCBIN_U32("graphics/trainers/palettes/engineer.gbapal.lz"); const u32 gTrainerFrontPic_Fisherman[] = INCBIN_U32("graphics/trainers/front_pics/fisherman_front_pic.4bpp.lz"); const u32 gTrainerPalette_Fisherman[] = INCBIN_U32("graphics/trainers/palettes/fisherman.gbapal.lz"); const u32 gTrainerFrontPic_SwimmerM[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_SwimmerM[] = INCBIN_U32("graphics/trainers/palettes/swimmer_m.gbapal.lz"); const u32 gTrainerFrontPic_CueBall[] = INCBIN_U32("graphics/trainers/front_pics/cue_ball_front_pic.4bpp.lz"); const u32 gTrainerPalette_CueBall[] = INCBIN_U32("graphics/trainers/palettes/cue_ball.gbapal.lz"); const u32 gTrainerFrontPic_Gamer[] = INCBIN_U32("graphics/trainers/front_pics/gamer_front_pic.4bpp.lz"); const u32 gTrainerPalette_Gamer[] = INCBIN_U32("graphics/trainers/palettes/gamer.gbapal.lz"); const u32 gTrainerFrontPic_Beauty[] = INCBIN_U32("graphics/trainers/front_pics/beauty_front_pic.4bpp.lz"); const u32 gTrainerPalette_Beauty[] = INCBIN_U32("graphics/trainers/palettes/beauty.gbapal.lz"); const u32 gTrainerFrontPic_SwimmerF[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_SwimmerF[] = INCBIN_U32("graphics/trainers/palettes/swimmer_f.gbapal.lz"); const u32 gTrainerFrontPic_PsychicM[] = INCBIN_U32("graphics/trainers/front_pics/psychic_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_PsychicM[] = INCBIN_U32("graphics/trainers/palettes/psychic_m.gbapal.lz"); const u32 gTrainerFrontPic_Rocker[] = INCBIN_U32("graphics/trainers/front_pics/rocker_front_pic.4bpp.lz"); const u32 gTrainerPalette_Rocker[] = INCBIN_U32("graphics/trainers/palettes/rocker.gbapal.lz"); const u32 gTrainerFrontPic_Juggler[] = INCBIN_U32("graphics/trainers/front_pics/juggler_front_pic.4bpp.lz"); const u32 gTrainerPalette_Juggler[] = INCBIN_U32("graphics/trainers/palettes/juggler.gbapal.lz"); const u32 gTrainerFrontPic_Tamer[] = INCBIN_U32("graphics/trainers/front_pics/tamer_front_pic.4bpp.lz"); const u32 gTrainerPalette_Tamer[] = INCBIN_U32("graphics/trainers/palettes/tamer.gbapal.lz"); const u32 gTrainerFrontPic_BirdKeeper[] = INCBIN_U32("graphics/trainers/front_pics/bird_keeper_front_pic.4bpp.lz"); const u32 gTrainerPalette_BirdKeeper[] = INCBIN_U32("graphics/trainers/palettes/bird_keeper.gbapal.lz"); const u32 gTrainerFrontPic_BlackBelt[] = INCBIN_U32("graphics/trainers/front_pics/black_belt_front_pic.4bpp.lz"); const u32 gTrainerPalette_BlackBelt[] = INCBIN_U32("graphics/trainers/palettes/black_belt.gbapal.lz"); const u32 gTrainerFrontPic_RivalEarly[] = INCBIN_U32("graphics/trainers/front_pics/rival_early_front_pic.4bpp.lz"); const u32 gTrainerPalette_RivalEarly[] = INCBIN_U32("graphics/trainers/palettes/rival_early.gbapal.lz"); const u32 gTrainerFrontPic_Scientist[] = INCBIN_U32("graphics/trainers/front_pics/scientist_front_pic.4bpp.lz"); const u32 gTrainerPalette_Scientist[] = INCBIN_U32("graphics/trainers/palettes/scientist.gbapal.lz"); const u32 gTrainerFrontPic_LeaderGiovanni[] = INCBIN_U32("graphics/trainers/front_pics/leader_giovanni_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderGiovanni[] = INCBIN_U32("graphics/trainers/palettes/leader_giovanni.gbapal.lz"); const u32 gTrainerFrontPic_RocketGruntM[] = INCBIN_U32("graphics/trainers/front_pics/rocket_grunt_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_RocketGruntM[] = INCBIN_U32("graphics/trainers/palettes/rocket_grunt_m.gbapal.lz"); const u32 gTrainerFrontPic_CooltrainerM[] = INCBIN_U32("graphics/trainers/front_pics/cool_trainer_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_CooltrainerM[] = INCBIN_U32("graphics/trainers/palettes/cool_trainer_m.gbapal.lz"); const u32 gTrainerFrontPic_CooltrainerF[] = INCBIN_U32("graphics/trainers/front_pics/cool_trainer_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_CooltrainerF[] = INCBIN_U32("graphics/trainers/palettes/cool_trainer_f.gbapal.lz"); const u32 gTrainerFrontPic_EliteFourLorelei[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_lorelei_front_pic.4bpp.lz"); const u32 gTrainerPalette_EliteFourLorelei[] = INCBIN_U32("graphics/trainers/palettes/elite_four_lorelei.gbapal.lz"); const u32 gTrainerFrontPic_EliteFourBruno[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_bruno_front_pic.4bpp.lz"); const u32 gTrainerPalette_EliteFourBruno[] = INCBIN_U32("graphics/trainers/palettes/elite_four_bruno.gbapal.lz"); const u32 gTrainerFrontPic_EliteFourAgatha[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_agatha_front_pic.4bpp.lz"); const u32 gTrainerPalette_EliteFourAgatha[] = INCBIN_U32("graphics/trainers/palettes/elite_four_agatha.gbapal.lz"); const u32 gTrainerFrontPic_EliteFourLance[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_lance_front_pic.4bpp.lz"); const u32 gTrainerPalette_EliteFourLance[] = INCBIN_U32("graphics/trainers/palettes/elite_four_lance.gbapal.lz"); const u32 gTrainerFrontPic_LeaderBrock[] = INCBIN_U32("graphics/trainers/front_pics/leader_brock_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderBrock[] = INCBIN_U32("graphics/trainers/palettes/leader_brock.gbapal.lz"); const u32 gTrainerFrontPic_LeaderMisty[] = INCBIN_U32("graphics/trainers/front_pics/leader_misty_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderMisty[] = INCBIN_U32("graphics/trainers/palettes/leader_misty.gbapal.lz"); const u32 gTrainerFrontPic_LeaderLtSurge[] = INCBIN_U32("graphics/trainers/front_pics/leader_lt_surge_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderLtSurge[] = INCBIN_U32("graphics/trainers/palettes/leader_lt_surge.gbapal.lz"); const u32 gTrainerFrontPic_LeaderErika[] = INCBIN_U32("graphics/trainers/front_pics/leader_erika_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderErika[] = INCBIN_U32("graphics/trainers/palettes/leader_erika.gbapal.lz"); const u32 gTrainerFrontPic_LeaderKoga[] = INCBIN_U32("graphics/trainers/front_pics/leader_koga_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderKoga[] = INCBIN_U32("graphics/trainers/palettes/leader_koga.gbapal.lz"); const u32 gTrainerFrontPic_LeaderBlaine[] = INCBIN_U32("graphics/trainers/front_pics/leader_blaine_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderBlaine[] = INCBIN_U32("graphics/trainers/palettes/leader_blaine.gbapal.lz"); const u32 gTrainerFrontPic_LeaderSabrina[] = INCBIN_U32("graphics/trainers/front_pics/leader_sabrina_front_pic.4bpp.lz"); const u32 gTrainerPalette_LeaderSabrina[] = INCBIN_U32("graphics/trainers/palettes/leader_sabrina.gbapal.lz"); const u32 gTrainerFrontPic_Gentleman[] = INCBIN_U32("graphics/trainers/front_pics/gentleman_front_pic.4bpp.lz"); const u32 gTrainerPalette_Gentleman[] = INCBIN_U32("graphics/trainers/palettes/gentleman.gbapal.lz"); const u32 gTrainerFrontPic_RivalLate[] = INCBIN_U32("graphics/trainers/front_pics/rival_late_front_pic.4bpp.lz"); const u32 gTrainerPalette_RivalLate[] = INCBIN_U32("graphics/trainers/palettes/rival_late.gbapal.lz"); const u32 gTrainerFrontPic_ChampionRival[] = INCBIN_U32("graphics/trainers/front_pics/champion_rival_front_pic.4bpp.lz"); const u32 gTrainerPalette_ChampionRival[] = INCBIN_U32("graphics/trainers/palettes/champion_rival.gbapal.lz"); const u32 gTrainerFrontPic_Channeler[] = INCBIN_U32("graphics/trainers/front_pics/channeler_front_pic.4bpp.lz"); const u32 gTrainerPalette_Channeler[] = INCBIN_U32("graphics/trainers/palettes/channeler.gbapal.lz"); const u32 gTrainerFrontPic_Twins[] = INCBIN_U32("graphics/trainers/front_pics/twins_front_pic.4bpp.lz"); const u32 gTrainerPalette_Twins[] = INCBIN_U32("graphics/trainers/palettes/twins.gbapal.lz"); const u32 gTrainerFrontPic_CoolCouple[] = INCBIN_U32("graphics/trainers/front_pics/cool_couple_front_pic.4bpp.lz"); const u32 gTrainerPalette_CoolCouple[] = INCBIN_U32("graphics/trainers/palettes/cool_couple.gbapal.lz"); const u32 gTrainerFrontPic_YoungCouple[] = INCBIN_U32("graphics/trainers/front_pics/young_couple_front_pic.4bpp.lz"); const u32 gTrainerPalette_YoungCouple[] = INCBIN_U32("graphics/trainers/palettes/young_couple.gbapal.lz"); const u32 gTrainerFrontPic_CrushKin[] = INCBIN_U32("graphics/trainers/front_pics/crush_kin_front_pic.4bpp.lz"); const u32 gTrainerPalette_CrushKin[] = INCBIN_U32("graphics/trainers/palettes/crush_kin.gbapal.lz"); const u32 gTrainerFrontPic_SisAndBro[] = INCBIN_U32("graphics/trainers/front_pics/sis_and_bro_front_pic.4bpp.lz"); const u32 gTrainerPalette_SisAndBro[] = INCBIN_U32("graphics/trainers/palettes/sis_and_bro.gbapal.lz"); const u32 gTrainerFrontPic_ProfessorOak[] = INCBIN_U32("graphics/trainers/front_pics/professor_oak_front_pic.4bpp.lz"); const u32 gTrainerPalette_ProfessorOak[] = INCBIN_U32("graphics/trainers/palettes/professor_oak.gbapal.lz"); const u32 gTrainerFrontPic_RSBrendan2[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_brendan_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSBrendan2[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz"); const u32 gTrainerFrontPic_RSMay2[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz"); const u32 gTrainerPalette_RSMay2[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz"); const u32 gTrainerFrontPic_Red[] = INCBIN_U32("graphics/trainers/front_pics/red_front_pic.4bpp.lz"); const u32 gTrainerPalette_Red[] = INCBIN_U32("graphics/trainers/palettes/red.gbapal.lz"); const u32 gTrainerFrontPic_Leaf[] = INCBIN_U32("graphics/trainers/front_pics/leaf_front_pic.4bpp.lz"); const u32 gTrainerPalette_Leaf[] = INCBIN_U32("graphics/trainers/palettes/leaf.gbapal.lz"); const u32 gTrainerFrontPic_RocketGruntF[] = INCBIN_U32("graphics/trainers/front_pics/rocket_grunt_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_RocketGruntF[] = INCBIN_U32("graphics/trainers/palettes/rocket_grunt_f.gbapal.lz"); const u32 gTrainerFrontPic_PsychicF[] = INCBIN_U32("graphics/trainers/front_pics/psychic_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_PsychicF[] = INCBIN_U32("graphics/trainers/palettes/psychic_f.gbapal.lz"); const u32 gTrainerFrontPic_CrushGirl[] = INCBIN_U32("graphics/trainers/front_pics/crush_girl_front_pic.4bpp.lz"); const u32 gTrainerPalette_CrushGirl[] = INCBIN_U32("graphics/trainers/palettes/crush_girl.gbapal.lz"); const u32 gTrainerFrontPic_TuberF[] = INCBIN_U32("graphics/trainers/front_pics/tuber_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_TuberF[] = INCBIN_U32("graphics/trainers/palettes/tuber_f.gbapal.lz"); const u32 gTrainerFrontPic_PokemonBreeder[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_front_pic.4bpp.lz"); const u32 gTrainerPalette_PokemonBreeder[] = INCBIN_U32("graphics/trainers/palettes/pokemon_breeder.gbapal.lz"); const u32 gTrainerFrontPic_PokemonRangerM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_PokemonRangerM[] = INCBIN_U32("graphics/trainers/palettes/pokemon_ranger_m.gbapal.lz"); const u32 gTrainerFrontPic_PokemonRangerF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_f_front_pic.4bpp.lz"); const u32 gTrainerPalette_PokemonRangerF[] = INCBIN_U32("graphics/trainers/palettes/pokemon_ranger_f.gbapal.lz"); const u32 gTrainerFrontPic_AromaLady[] = INCBIN_U32("graphics/trainers/front_pics/aroma_lady_front_pic.4bpp.lz"); const u32 gTrainerPalette_AromaLady[] = INCBIN_U32("graphics/trainers/palettes/aroma_lady.gbapal.lz"); const u32 gTrainerFrontPic_RuinManiac[] = INCBIN_U32("graphics/trainers/front_pics/ruin_maniac_front_pic.4bpp.lz"); const u32 gTrainerPalette_RuinManiac[] = INCBIN_U32("graphics/trainers/palettes/ruin_maniac.gbapal.lz"); const u32 gTrainerFrontPic_Lady[] = INCBIN_U32("graphics/trainers/front_pics/lady_front_pic.4bpp.lz"); const u32 gTrainerPalette_Lady[] = INCBIN_U32("graphics/trainers/palettes/lady.gbapal.lz"); const u32 gTrainerFrontPic_Painter[] = INCBIN_U32("graphics/trainers/front_pics/painter_front_pic.4bpp.lz"); const u32 gTrainerPalette_Painter[] = INCBIN_U32("graphics/trainers/palettes/painter.gbapal.lz"); const u32 gTrainerFrontPic_EmBrendan[] = INCBIN_U32("graphics/trainers/front_pics/emerald_brendan_front_pic.4bpp.lz"); const u32 gTrainerPalette_EmBrendan[] = INCBIN_U32("graphics/trainers/palettes/emerald_brendan.gbapal.lz"); const u32 gTrainerFrontPic_EmMay[] = INCBIN_U32("graphics/trainers/front_pics/emerald_may_front_pic.4bpp.lz"); const u32 gTrainerPalette_EmMay[] = INCBIN_U32("graphics/trainers/palettes/emerald_may.gbapal.lz"); const u32 gTrainerFrontPic_MasterBeauty[] = INCBIN_U32("graphics/trainers/front_pics/master_beauty_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterBeauty[] = INCBIN_U32("graphics/trainers/palettes/master_beauty.gbapal.lz"); const u32 gTrainerFrontPic_MasterBirdKeeper[] = INCBIN_U32("graphics/trainers/front_pics/master_bird_keeper_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterBirdKeeper[] = INCBIN_U32("graphics/trainers/palettes/master_bird_keeper.gbapal.lz"); const u32 gTrainerFrontPic_MasterBlackBelt[] = INCBIN_U32("graphics/trainers/front_pics/master_black_belt_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterBlackBelt[] = INCBIN_U32("graphics/trainers/palettes/master_black_belt.gbapal.lz"); const u32 gTrainerFrontPic_MasterBugCatcher[] = INCBIN_U32("graphics/trainers/front_pics/master_bug_catcher_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterBugCatcher[] = INCBIN_U32("graphics/trainers/palettes/master_bug_catcher.gbapal.lz"); const u32 gTrainerFrontPic_MasterCooltrainerM[] = INCBIN_U32("graphics/trainers/front_pics/master_cool_trainer_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterCooltrainerM[] = INCBIN_U32("graphics/trainers/palettes/master_cool_trainer_m.gbapal.lz"); const u32 gTrainerFrontPic_MasterHiker[] = INCBIN_U32("graphics/trainers/front_pics/master_hiker_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterHiker[] = INCBIN_U32("graphics/trainers/palettes/master_hiker.gbapal.lz"); const u32 gTrainerFrontPic_MasterLass[] = INCBIN_U32("graphics/trainers/front_pics/master_lass_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterLass[] = INCBIN_U32("graphics/trainers/palettes/master_lass.gbapal.lz"); const u32 gTrainerFrontPic_MasterPsychicM[] = INCBIN_U32("graphics/trainers/front_pics/master_psychic_m_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterPsychicM[] = INCBIN_U32("graphics/trainers/palettes/master_psychic_m.gbapal.lz"); const u32 gTrainerFrontPic_MasterScientist[] = INCBIN_U32("graphics/trainers/front_pics/master_scientist_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterScientist[] = INCBIN_U32("graphics/trainers/palettes/master_scientist.gbapal.lz"); const u32 gTrainerFrontPic_MasterYoungster[] = INCBIN_U32("graphics/trainers/front_pics/master_youngster_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterYoungster[] = INCBIN_U32("graphics/trainers/palettes/master_youngster.gbapal.lz"); const u32 gTrainerFrontPic_MasterSwimmer[] = INCBIN_U32("graphics/trainers/front_pics/master_swimmer_front_pic.4bpp.lz"); const u32 gTrainerPalette_MasterSwimmer[] = INCBIN_U32("graphics/trainers/palettes/master_swimmer.gbapal.lz"); const u8 gTrainerBackPic_Red[] = INCBIN_U8("graphics/trainers/back_pics/red_back_pic.4bpp"); const u8 gTrainerBackPic_Leaf[] = INCBIN_U8("graphics/trainers/back_pics/leaf_back_pic.4bpp"); const u8 gTrainerBackPic_Pokedude[] = INCBIN_U8("graphics/trainers/back_pics/pokedude_back_pic.4bpp"); const u8 gTrainerBackPic_OldMan[] = INCBIN_U8("graphics/trainers/back_pics/old_man_back_pic.4bpp"); const u8 gTrainerBackPic_RSBrendan[] = INCBIN_U8("graphics/trainers/back_pics/ruby_sapphire_brendan_back_pic.4bpp"); const u8 gTrainerBackPic_RSMay[] = INCBIN_U8("graphics/trainers/back_pics/ruby_sapphire_may_back_pic.4bpp"); const u8 gTrainerBackPic_EmBrendan[] = INCBIN_U8("graphics/trainers/back_pics/emerald_brendan_back_pic.4bpp"); const u8 gTrainerBackPic_EmMay[] = INCBIN_U8("graphics/trainers/back_pics/emerald_may_back_pic.4bpp"); const u32 gTrainerPalette_RedBackPic[] = INCBIN_U32("graphics/trainers/palettes/red_back_pic.gbapal.lz"); const u32 gTrainerPalette_LeafBackPic[] = INCBIN_U32("graphics/trainers/palettes/leaf_back_pic.gbapal.lz"); const u32 gTrainerPalette_PokedudeBackPic[] = INCBIN_U32("graphics/trainers/palettes/pokedude_back_pic.gbapal.lz"); const u32 gTrainerPalette_OldManBackPic[] = INCBIN_U32("graphics/trainers/palettes/old_man_back_pic.gbapal.lz"); ================================================ FILE: src/data/heal_locations.h ================================================ static const struct HealLocation sSpawnPoints[] = { [SPAWN_PALLET_TOWN - 1] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 6, 8}, [SPAWN_VIRIDIAN_CITY - 1] = {MAP_GROUP(VIRIDIAN_CITY), MAP_NUM(VIRIDIAN_CITY), 26, 27}, [SPAWN_PEWTER_CITY - 1] = {MAP_GROUP(PEWTER_CITY), MAP_NUM(PEWTER_CITY), 17, 26}, [SPAWN_CERULEAN_CITY - 1] = {MAP_GROUP(CERULEAN_CITY), MAP_NUM(CERULEAN_CITY), 22, 20}, [SPAWN_LAVENDER_TOWN - 1] = {MAP_GROUP(LAVENDER_TOWN), MAP_NUM(LAVENDER_TOWN), 6, 6}, [SPAWN_VERMILION_CITY - 1] = {MAP_GROUP(VERMILION_CITY), MAP_NUM(VERMILION_CITY), 15, 7}, [SPAWN_CELADON_CITY - 1] = {MAP_GROUP(CELADON_CITY), MAP_NUM(CELADON_CITY), 48, 12}, [SPAWN_FUCHSIA_CITY - 1] = {MAP_GROUP(FUCHSIA_CITY), MAP_NUM(FUCHSIA_CITY), 25, 32}, [SPAWN_CINNABAR_ISLAND - 1] = {MAP_GROUP(CINNABAR_ISLAND), MAP_NUM(CINNABAR_ISLAND), 14, 12}, [SPAWN_INDIGO_PLATEAU - 1] = {MAP_GROUP(INDIGO_PLATEAU_EXTERIOR), MAP_NUM(INDIGO_PLATEAU_EXTERIOR), 11, 7}, [SPAWN_SAFFRON_CITY - 1] = {MAP_GROUP(SAFFRON_CITY), MAP_NUM(SAFFRON_CITY), 24, 39}, [SPAWN_ROUTE4 - 1] = {MAP_GROUP(ROUTE4), MAP_NUM(ROUTE4), 12, 6}, [SPAWN_ROUTE10 - 1] = {MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10), 13, 21}, [SPAWN_ONE_ISLAND - 1] = {MAP_GROUP(ONE_ISLAND), MAP_NUM(ONE_ISLAND), 14, 6}, [SPAWN_TWO_ISLAND - 1] = {MAP_GROUP(TWO_ISLAND), MAP_NUM(TWO_ISLAND), 21, 8}, [SPAWN_THREE_ISLAND - 1] = {MAP_GROUP(THREE_ISLAND), MAP_NUM(THREE_ISLAND), 14, 28}, [SPAWN_FOUR_ISLAND - 1] = {MAP_GROUP(FOUR_ISLAND), MAP_NUM(FOUR_ISLAND), 18, 21}, [SPAWN_FIVE_ISLAND - 1] = {MAP_GROUP(FIVE_ISLAND), MAP_NUM(FIVE_ISLAND), 13, 7}, [SPAWN_SEVEN_ISLAND - 1] = {MAP_GROUP(SEVEN_ISLAND), MAP_NUM(SEVEN_ISLAND), 12, 4}, [SPAWN_SIX_ISLAND - 1] = {MAP_GROUP(SIX_ISLAND), MAP_NUM(SIX_ISLAND), 12, 12}, [SPAWN_BATTLE_FRONTIER - 1] = {MAP_GROUP(BATTLE_FRONTIER_OUTSIDE_EAST), MAP_NUM(BATTLE_FRONTIER_OUTSIDE_EAST), 4, 52}, }; static const u16 sWhiteoutRespawnHealCenterMapIdxs[][2] = { [SPAWN_PALLET_TOWN - 1] = {MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)}, [SPAWN_VIRIDIAN_CITY - 1] = {MAP_GROUP(VIRIDIAN_CITY_POKEMON_CENTER_1F), MAP_NUM(VIRIDIAN_CITY_POKEMON_CENTER_1F)}, [SPAWN_PEWTER_CITY - 1] = {MAP_GROUP(PEWTER_CITY_POKEMON_CENTER_1F), MAP_NUM(PEWTER_CITY_POKEMON_CENTER_1F)}, [SPAWN_CERULEAN_CITY - 1] = {MAP_GROUP(CERULEAN_CITY_POKEMON_CENTER_1F), MAP_NUM(CERULEAN_CITY_POKEMON_CENTER_1F)}, [SPAWN_LAVENDER_TOWN - 1] = {MAP_GROUP(LAVENDER_TOWN_POKEMON_CENTER_1F), MAP_NUM(LAVENDER_TOWN_POKEMON_CENTER_1F)}, [SPAWN_VERMILION_CITY - 1] = {MAP_GROUP(VERMILION_CITY_POKEMON_CENTER_1F), MAP_NUM(VERMILION_CITY_POKEMON_CENTER_1F)}, [SPAWN_CELADON_CITY - 1] = {MAP_GROUP(CELADON_CITY_POKEMON_CENTER_1F), MAP_NUM(CELADON_CITY_POKEMON_CENTER_1F)}, [SPAWN_FUCHSIA_CITY - 1] = {MAP_GROUP(FUCHSIA_CITY_POKEMON_CENTER_1F), MAP_NUM(FUCHSIA_CITY_POKEMON_CENTER_1F)}, [SPAWN_CINNABAR_ISLAND - 1] = {MAP_GROUP(CINNABAR_ISLAND_POKEMON_CENTER_1F), MAP_NUM(CINNABAR_ISLAND_POKEMON_CENTER_1F)}, [SPAWN_INDIGO_PLATEAU - 1] = {MAP_GROUP(INDIGO_PLATEAU_POKEMON_CENTER_1F), MAP_NUM(INDIGO_PLATEAU_POKEMON_CENTER_1F)}, [SPAWN_SAFFRON_CITY - 1] = {MAP_GROUP(SAFFRON_CITY_POKEMON_CENTER_1F), MAP_NUM(SAFFRON_CITY_POKEMON_CENTER_1F)}, [SPAWN_ROUTE4 - 1] = {MAP_GROUP(ROUTE4_POKEMON_CENTER_1F), MAP_NUM(ROUTE4_POKEMON_CENTER_1F)}, [SPAWN_ROUTE10 - 1] = {MAP_GROUP(ROUTE10_POKEMON_CENTER_1F), MAP_NUM(ROUTE10_POKEMON_CENTER_1F)}, [SPAWN_ONE_ISLAND - 1] = {MAP_GROUP(ONE_ISLAND_POKEMON_CENTER_1F), MAP_NUM(ONE_ISLAND_POKEMON_CENTER_1F)}, [SPAWN_TWO_ISLAND - 1] = {MAP_GROUP(TWO_ISLAND_POKEMON_CENTER_1F), MAP_NUM(TWO_ISLAND_POKEMON_CENTER_1F)}, [SPAWN_THREE_ISLAND - 1] = {MAP_GROUP(THREE_ISLAND_POKEMON_CENTER_1F), MAP_NUM(THREE_ISLAND_POKEMON_CENTER_1F)}, [SPAWN_FOUR_ISLAND - 1] = {MAP_GROUP(FOUR_ISLAND_POKEMON_CENTER_1F), MAP_NUM(FOUR_ISLAND_POKEMON_CENTER_1F)}, [SPAWN_FIVE_ISLAND - 1] = {MAP_GROUP(FIVE_ISLAND_POKEMON_CENTER_1F), MAP_NUM(FIVE_ISLAND_POKEMON_CENTER_1F)}, [SPAWN_SEVEN_ISLAND - 1] = {MAP_GROUP(SEVEN_ISLAND_POKEMON_CENTER_1F), MAP_NUM(SEVEN_ISLAND_POKEMON_CENTER_1F)}, [SPAWN_SIX_ISLAND - 1] = {MAP_GROUP(SIX_ISLAND_POKEMON_CENTER_1F), MAP_NUM(SIX_ISLAND_POKEMON_CENTER_1F)}, [SPAWN_BATTLE_FRONTIER - 1] = {MAP_GROUP(BATTLE_FRONTIER_POKEMON_CENTER_1F), MAP_NUM(BATTLE_FRONTIER_POKEMON_CENTER_1F)}, }; static const u8 sWhiteoutRespawnHealerNpcIds[] = { [SPAWN_PALLET_TOWN - 1] = 1, [SPAWN_VIRIDIAN_CITY - 1] = 1, [SPAWN_PEWTER_CITY - 1] = 3, [SPAWN_CERULEAN_CITY - 1] = 1, [SPAWN_LAVENDER_TOWN - 1] = 1, [SPAWN_VERMILION_CITY - 1] = 1, [SPAWN_CELADON_CITY - 1] = 1, [SPAWN_FUCHSIA_CITY - 1] = 1, [SPAWN_CINNABAR_ISLAND - 1] = 1, [SPAWN_INDIGO_PLATEAU - 1] = 2, [SPAWN_SAFFRON_CITY - 1] = 1, [SPAWN_ROUTE4 - 1] = 1, [SPAWN_ROUTE10 - 1] = 1, [SPAWN_ONE_ISLAND - 1] = 1, [SPAWN_TWO_ISLAND - 1] = 1, [SPAWN_THREE_ISLAND - 1] = 1, [SPAWN_FOUR_ISLAND - 1] = 1, [SPAWN_FIVE_ISLAND - 1] = 1, [SPAWN_SEVEN_ISLAND - 1] = 1, [SPAWN_SIX_ISLAND - 1] = 1, [SPAWN_BATTLE_FRONTIER - 1] = 1, }; ================================================ FILE: src/data/ingame_trades.h ================================================ static const struct InGameTrade sInGameTrades[] = { [INGAME_TRADE_MR_MIME] = { .nickname = _("MIMIEN"), .species = SPECIES_MR_MIME, .ivs = {20, 15, 17, 24, 23, 22}, .abilityNum = 0, .otId = 1985, .conditions = {5, 5, 5, 30, 5}, .personality = 0x00009cae, .heldItem = ITEM_NONE, .mailNum = 255, .otName = _("REYLEY"), .otGender = MALE, .sheen = 10, .requestedSpecies = SPECIES_ABRA }, [INGAME_TRADE_JYNX] = { .nickname = _("ZYNX"), .species = SPECIES_JYNX, .ivs = {18, 17, 18, 22, 25, 21}, .abilityNum = 0, .otId = 36728, .conditions = {5, 30, 5, 5, 5}, .personality = 0x498a2e1d, .heldItem = ITEM_FAB_MAIL, .mailNum = 0, .otName = _("DONTAE"), .otGender = MALE, .sheen = 10, .requestedSpecies = SPECIES_POLIWHIRL }, [INGAME_TRADE_NIDORAN_F_FR] = { .nickname = _("MS. NIDO"), .species = SPECIES_NIDORAN_F, .ivs = {22, 18, 25, 19, 15, 22}, .abilityNum = 0, .otId = 63184, .conditions = {5, 5, 5, 5, 30}, .personality = 0x4c970b89, .heldItem = ITEM_TINY_MUSHROOM, .mailNum = 255, .otName = _("SAIGE"), .otGender = FEMALE, .sheen = 10, .requestedSpecies = SPECIES_NIDORAN_M }, [INGAME_TRADE_FARFETCHD] = { .nickname = _("CH'DING"), .species = SPECIES_FARFETCHD, .ivs = {20, 25, 21, 24, 15, 20}, .abilityNum = 0, .otId = 8810, .conditions = {30, 5, 5, 5, 5}, .personality = 0x151943d7, .heldItem = ITEM_STICK, .mailNum = 255, .otName = _("ELYSSA"), .otGender = MALE, .sheen = 10, .requestedSpecies = SPECIES_SPEAROW }, [INGAME_TRADE_NIDORINA_FR] = { .nickname = _("NINA"), .species = SPECIES_NIDORINA, .ivs = {22, 25, 18, 19, 22, 15}, .abilityNum = 0, .otId = 13637, .conditions = {5, 5, 30, 5, 5}, .personality = 0x00eeca15, .heldItem = ITEM_NONE, .mailNum = 255, .otName = _("TURNER"), .otGender = MALE, .sheen = 10, .requestedSpecies = SPECIES_NIDORINO }, [INGAME_TRADE_LICKITUNG] = { .nickname = _("MARC"), .species = SPECIES_LICKITUNG, .ivs = {24, 19, 21, 15, 23, 21}, .abilityNum = 0, .otId = 1239, .conditions = {5, 5, 5, 5, 30}, .personality = 0x451308ab, .heldItem = ITEM_NONE, .mailNum = 255, .otName = _("HADEN"), .otGender = MALE, .sheen = 10, .requestedSpecies = SPECIES_GOLDUCK }, [INGAME_TRADE_ELECTRODE] = { .nickname = _("ESPHERE"), .species = SPECIES_ELECTRODE, .ivs = {19, 16, 18, 25, 25, 19}, .abilityNum = 1, .otId = 50298, .conditions = {30, 5, 5, 5, 5}, .personality = 0x06341016, .heldItem = ITEM_NONE, .mailNum = 255, .otName = _("CLIFTON"), .otGender = MALE, .sheen = 10, .requestedSpecies = SPECIES_RAICHU }, [INGAME_TRADE_TANGELA] = { .nickname = _("TANGENY"), .species = SPECIES_TANGELA, .ivs = {22, 17, 25, 16, 23, 20}, .abilityNum = 0, .otId = 60042, .conditions = {5, 5, 30, 5, 5}, .personality = 0x5c77ecfa, .heldItem = ITEM_STARDUST, .mailNum = 255, .otName = _("NORMA"), .otGender = FEMALE, .sheen = 10, .requestedSpecies = SPECIES_VENONAT }, [INGAME_TRADE_SEEL] = { .nickname = _("SEELOR"), .species = SPECIES_SEEL, .ivs = {24, 15, 22, 16, 23, 22}, .abilityNum = 0, .otId = 9853, .conditions = {5, 5, 5, 5, 30}, .personality = 0x482cac89, .heldItem = ITEM_NONE, .mailNum = 255, .otName = _("GARETT"), .otGender = MALE, .sheen = 10, .requestedSpecies = SPECIES_PONYTA }, [INGAME_TRADE_NIDORAN_M_LG] = { .nickname = _("MR. NIDO"), .species = SPECIES_NIDORAN_M, .ivs = {19, 25, 18, 22, 22, 15}, .abilityNum = 0, .otId = 63184, .conditions = {30, 5, 5, 5, 5}, .personality = 0x4c970b9e, .heldItem = ITEM_TINY_MUSHROOM, .mailNum = 255, .otName = _("SAIGE"), .otGender = FEMALE, .sheen = 10, .requestedSpecies = SPECIES_NIDORAN_F }, [INGAME_TRADE_NIDORINO_LG] = { .nickname = _("NINO"), .species = SPECIES_NIDORINO, .ivs = {19, 18, 25, 22, 15, 22}, .abilityNum = 0, .otId = 13637, .conditions = {5, 5, 5, 5, 30}, .personality = 0x00eeca19, .heldItem = ITEM_NONE, .mailNum = 255, .otName = _("TURNER"), .otGender = MALE, .sheen = 10, .requestedSpecies = SPECIES_NIDORINA } }; static const u16 sInGameTradeMailMessages[][10] = { { EC_WORD_THAT_S, EC_WORD_A, EC_WORD_HEALTHY, EC_POKEMON(JYNX), EC_WORD_EXCL, EC_WORD_BE, EC_WORD_KIND, EC_WORD_TO, EC_WORD_IT } }; ================================================ FILE: src/data/item_icon_table.h ================================================ static const u32 *const sItemIconTable[ITEMS_COUNT + 1][2] = { [ITEM_NONE] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // Pokeballs [ITEM_MASTER_BALL] = {gItemIcon_MasterBall, gItemIconPalette_MasterBall}, [ITEM_ULTRA_BALL] = {gItemIcon_UltraBall, gItemIconPalette_UltraBall}, [ITEM_GREAT_BALL] = {gItemIcon_GreatBall, gItemIconPalette_GreatBall}, [ITEM_POKE_BALL] = {gItemIcon_PokeBall, gItemIconPalette_PokeBall}, [ITEM_SAFARI_BALL] = {gItemIcon_SafariBall, gItemIconPalette_SafariBall}, [ITEM_NET_BALL] = {gItemIcon_NetBall, gItemIconPalette_NetBall}, [ITEM_DIVE_BALL] = {gItemIcon_DiveBall, gItemIconPalette_DiveBall}, [ITEM_NEST_BALL] = {gItemIcon_NestBall, gItemIconPalette_NestBall}, [ITEM_REPEAT_BALL] = {gItemIcon_RepeatBall, gItemIconPalette_RepeatBall}, [ITEM_TIMER_BALL] = {gItemIcon_TimerBall, gItemIconPalette_RepeatBall}, [ITEM_LUXURY_BALL] = {gItemIcon_LuxuryBall, gItemIconPalette_LuxuryBall}, [ITEM_PREMIER_BALL] = {gItemIcon_PremierBall, gItemIconPalette_LuxuryBall}, // Medicine [ITEM_POTION] = {gItemIcon_Potion, gItemIconPalette_Potion}, [ITEM_ANTIDOTE] = {gItemIcon_Antidote, gItemIconPalette_Antidote}, [ITEM_BURN_HEAL] = {gItemIcon_StatusHeal, gItemIconPalette_BurnHeal}, [ITEM_ICE_HEAL] = {gItemIcon_StatusHeal, gItemIconPalette_IceHeal}, [ITEM_AWAKENING] = {gItemIcon_StatusHeal, gItemIconPalette_Awakening}, [ITEM_PARALYZE_HEAL] = {gItemIcon_StatusHeal, gItemIconPalette_ParalyzeHeal}, [ITEM_FULL_RESTORE] = {gItemIcon_LargePotion, gItemIconPalette_FullRestore}, [ITEM_MAX_POTION] = {gItemIcon_LargePotion, gItemIconPalette_MaxPotion}, [ITEM_HYPER_POTION] = {gItemIcon_Potion, gItemIconPalette_HyperPotion}, [ITEM_SUPER_POTION] = {gItemIcon_Potion, gItemIconPalette_SuperPotion}, [ITEM_FULL_HEAL] = {gItemIcon_FullHeal, gItemIconPalette_FullHeal}, [ITEM_REVIVE] = {gItemIcon_Revive, gItemIconPalette_Revive}, [ITEM_MAX_REVIVE] = {gItemIcon_MaxRevive, gItemIconPalette_Revive}, [ITEM_FRESH_WATER] = {gItemIcon_FreshWater, gItemIconPalette_FreshWater}, [ITEM_SODA_POP] = {gItemIcon_SodaPop, gItemIconPalette_SodaPop}, [ITEM_LEMONADE] = {gItemIcon_Lemonade, gItemIconPalette_Lemonade}, [ITEM_MOOMOO_MILK] = {gItemIcon_MoomooMilk, gItemIconPalette_MoomooMilk}, [ITEM_ENERGY_POWDER] = {gItemIcon_Powder, gItemIconPalette_EnergyPowder}, [ITEM_ENERGY_ROOT] = {gItemIcon_EnergyRoot, gItemIconPalette_EnergyRoot}, [ITEM_HEAL_POWDER] = {gItemIcon_Powder, gItemIconPalette_HealPowder}, [ITEM_REVIVAL_HERB] = {gItemIcon_RevivalHerb, gItemIconPalette_RevivalHerb}, [ITEM_ETHER] = {gItemIcon_Ether, gItemIconPalette_Ether}, [ITEM_MAX_ETHER] = {gItemIcon_Ether, gItemIconPalette_MaxEther}, [ITEM_ELIXIR] = {gItemIcon_Ether, gItemIconPalette_Elixir}, [ITEM_MAX_ELIXIR] = {gItemIcon_Ether, gItemIconPalette_MaxElixir}, [ITEM_LAVA_COOKIE] = {gItemIcon_LavaCookie, gItemIconPalette_LavaCookieAndLetter}, [ITEM_BLUE_FLUTE] = {gItemIcon_Flute, gItemIconPalette_BlueFlute}, [ITEM_YELLOW_FLUTE] = {gItemIcon_Flute, gItemIconPalette_YellowFlute}, [ITEM_RED_FLUTE] = {gItemIcon_Flute, gItemIconPalette_RedFlute}, [ITEM_BLACK_FLUTE] = {gItemIcon_Flute, gItemIconPalette_BlackFlute}, [ITEM_WHITE_FLUTE] = {gItemIcon_Flute, gItemIconPalette_WhiteFlute}, [ITEM_BERRY_JUICE] = {gItemIcon_BerryJuice, gItemIconPalette_BerryJuice}, [ITEM_SACRED_ASH] = {gItemIcon_SacredAsh, gItemIconPalette_SacredAsh}, // Collectibles [ITEM_SHOAL_SALT] = {gItemIcon_Powder, gItemIconPalette_ShoalSalt}, [ITEM_SHOAL_SHELL] = {gItemIcon_ShoalShell, gItemIconPalette_Shell}, [ITEM_RED_SHARD] = {gItemIcon_Shard, gItemIconPalette_RedShard}, [ITEM_BLUE_SHARD] = {gItemIcon_Shard, gItemIconPalette_BlueShard}, [ITEM_YELLOW_SHARD] = {gItemIcon_Shard, gItemIconPalette_YellowShard}, [ITEM_GREEN_SHARD] = {gItemIcon_Shard, gItemIconPalette_GreenShard}, // ???????? [ITEM_034] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_035] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_036] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_037] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_038] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_039] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_03A] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_03B] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_03C] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_03D] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_03E] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // Vitamins [ITEM_HP_UP] = {gItemIcon_HPUp, gItemIconPalette_HPUp}, [ITEM_PROTEIN] = {gItemIcon_Vitamin, gItemIconPalette_Protein}, [ITEM_IRON] = {gItemIcon_Vitamin, gItemIconPalette_Iron}, [ITEM_CARBOS] = {gItemIcon_Vitamin, gItemIconPalette_Carbos}, [ITEM_CALCIUM] = {gItemIcon_Vitamin, gItemIconPalette_Calcium}, [ITEM_RARE_CANDY] = {gItemIcon_RareCandy, gItemIconPalette_RareCandy}, [ITEM_PP_UP] = {gItemIcon_PPUp, gItemIconPalette_PPUp}, [ITEM_ZINC] = {gItemIcon_Vitamin, gItemIconPalette_Zinc}, [ITEM_PP_MAX] = {gItemIcon_PPMax, gItemIconPalette_PPMax}, // ???????? [ITEM_048] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // Battle items [ITEM_GUARD_SPEC] = {gItemIcon_BattleStatItem, gItemIconPalette_GuardSpec}, [ITEM_DIRE_HIT] = {gItemIcon_BattleStatItem, gItemIconPalette_DireHit}, [ITEM_X_ATTACK] = {gItemIcon_BattleStatItem, gItemIconPalette_XAttack}, [ITEM_X_DEFEND] = {gItemIcon_BattleStatItem, gItemIconPalette_XDefend}, [ITEM_X_SPEED] = {gItemIcon_BattleStatItem, gItemIconPalette_XSpeed}, [ITEM_X_ACCURACY] = {gItemIcon_BattleStatItem, gItemIconPalette_XAccuracy}, [ITEM_X_SPECIAL] = {gItemIcon_BattleStatItem, gItemIconPalette_XSpecial}, [ITEM_POKE_DOLL] = {gItemIcon_PokeDoll, gItemIconPalette_PokeDoll}, [ITEM_FLUFFY_TAIL] = {gItemIcon_FluffyTail, gItemIconPalette_FluffyTail}, // ???????? [ITEM_052] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // Field items [ITEM_SUPER_REPEL] = {gItemIcon_Repel, gItemIconPalette_SuperRepel}, [ITEM_MAX_REPEL] = {gItemIcon_Repel, gItemIconPalette_MaxRepel}, [ITEM_ESCAPE_ROPE] = {gItemIcon_EscapeRope, gItemIconPalette_EscapeRope}, [ITEM_REPEL] = {gItemIcon_Repel, gItemIconPalette_Repel}, // ???????? [ITEM_057] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_058] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_059] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_05A] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_05B] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_05C] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // Evolution stones [ITEM_SUN_STONE] = {gItemIcon_SunStone, gItemIconPalette_SunStone}, [ITEM_MOON_STONE] = {gItemIcon_MoonStone, gItemIconPalette_MoonStone}, [ITEM_FIRE_STONE] = {gItemIcon_FireStone, gItemIconPalette_FireStone}, [ITEM_THUNDER_STONE] = {gItemIcon_ThunderStone, gItemIconPalette_ThunderStone}, [ITEM_WATER_STONE] = {gItemIcon_WaterStone, gItemIconPalette_WaterStone}, [ITEM_LEAF_STONE] = {gItemIcon_LeafStone, gItemIconPalette_LeafStone}, // ???????? [ITEM_063] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_064] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_065] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_066] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // Valuables [ITEM_TINY_MUSHROOM] = {gItemIcon_TinyMushroom, gItemIconPalette_Mushroom}, [ITEM_BIG_MUSHROOM] = {gItemIcon_BigMushroom, gItemIconPalette_Mushroom}, [ITEM_069] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_PEARL] = {gItemIcon_Pearl, gItemIconPalette_Pearl}, [ITEM_BIG_PEARL] = {gItemIcon_BigPearl, gItemIconPalette_Pearl}, [ITEM_STARDUST] = {gItemIcon_Stardust, gItemIconPalette_Star}, [ITEM_STAR_PIECE] = {gItemIcon_StarPiece, gItemIconPalette_Star}, [ITEM_NUGGET] = {gItemIcon_Nugget, gItemIconPalette_Nugget}, [ITEM_HEART_SCALE] = {gItemIcon_HeartScale, gItemIconPalette_HeartScale}, // ???????? [ITEM_LINK_BRACELET] = {gItemIcon_LinkBracelet, gItemIconPalette_LinkBracelet}, [ITEM_071] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_072] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_073] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_074] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_075] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_076] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_077] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_078] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // Mail [ITEM_ORANGE_MAIL] = {gItemIcon_OrangeMail, gItemIconPalette_OrangeMail}, [ITEM_HARBOR_MAIL] = {gItemIcon_HarborMail, gItemIconPalette_HarborMail}, [ITEM_GLITTER_MAIL] = {gItemIcon_GlitterMail, gItemIconPalette_GlitterMail}, [ITEM_MECH_MAIL] = {gItemIcon_MechMail, gItemIconPalette_MechMail}, [ITEM_WOOD_MAIL] = {gItemIcon_WoodMail, gItemIconPalette_WoodMail}, [ITEM_WAVE_MAIL] = {gItemIcon_WaveMail, gItemIconPalette_WaveMail}, [ITEM_BEAD_MAIL] = {gItemIcon_BeadMail, gItemIconPalette_BeadMail}, [ITEM_SHADOW_MAIL] = {gItemIcon_ShadowMail, gItemIconPalette_ShadowMail}, [ITEM_TROPIC_MAIL] = {gItemIcon_TropicMail, gItemIconPalette_TropicMail}, [ITEM_DREAM_MAIL] = {gItemIcon_DreamMail, gItemIconPalette_DreamMail}, [ITEM_FAB_MAIL] = {gItemIcon_FabMail, gItemIconPalette_FabMail}, [ITEM_RETRO_MAIL] = {gItemIcon_RetroMail, gItemIconPalette_RetroMail}, // Berries [ITEM_CHERI_BERRY] = {gItemIcon_CheriBerry, gItemIconPalette_CheriBerry}, [ITEM_CHESTO_BERRY] = {gItemIcon_ChestoBerry, gItemIconPalette_ChestoBerry}, [ITEM_PECHA_BERRY] = {gItemIcon_PechaBerry, gItemIconPalette_PechaBerry}, [ITEM_RAWST_BERRY] = {gItemIcon_RawstBerry, gItemIconPalette_RawstBerry}, [ITEM_ASPEAR_BERRY] = {gItemIcon_AspearBerry, gItemIconPalette_AspearBerry}, [ITEM_LEPPA_BERRY] = {gItemIcon_LeppaBerry, gItemIconPalette_LeppaBerry}, [ITEM_ORAN_BERRY] = {gItemIcon_OranBerry, gItemIconPalette_OranBerry}, [ITEM_PERSIM_BERRY] = {gItemIcon_PersimBerry, gItemIconPalette_PersimBerry}, [ITEM_LUM_BERRY] = {gItemIcon_LumBerry, gItemIconPalette_LumBerry}, [ITEM_SITRUS_BERRY] = {gItemIcon_SitrusBerry, gItemIconPalette_SitrusBerry}, [ITEM_FIGY_BERRY] = {gItemIcon_FigyBerry, gItemIconPalette_FigyBerry}, [ITEM_WIKI_BERRY] = {gItemIcon_WikiBerry, gItemIconPalette_WikiBerry}, [ITEM_MAGO_BERRY] = {gItemIcon_MagoBerry, gItemIconPalette_MagoBerry}, [ITEM_AGUAV_BERRY] = {gItemIcon_AguavBerry, gItemIconPalette_AguavBerry}, [ITEM_IAPAPA_BERRY] = {gItemIcon_IapapaBerry, gItemIconPalette_IapapaBerry}, [ITEM_RAZZ_BERRY] = {gItemIcon_RazzBerry, gItemIconPalette_RazzBerry}, [ITEM_BLUK_BERRY] = {gItemIcon_BlukBerry, gItemIconPalette_BlukBerry}, [ITEM_NANAB_BERRY] = {gItemIcon_NanabBerry, gItemIconPalette_NanabBerry}, [ITEM_WEPEAR_BERRY] = {gItemIcon_WepearBerry, gItemIconPalette_WepearBerry}, [ITEM_PINAP_BERRY] = {gItemIcon_PinapBerry, gItemIconPalette_PinapBerry}, [ITEM_POMEG_BERRY] = {gItemIcon_PomegBerry, gItemIconPalette_PomegBerry}, [ITEM_KELPSY_BERRY] = {gItemIcon_KelpsyBerry, gItemIconPalette_KelpsyBerry}, [ITEM_QUALOT_BERRY] = {gItemIcon_QualotBerry, gItemIconPalette_QualotBerry}, [ITEM_HONDEW_BERRY] = {gItemIcon_HondewBerry, gItemIconPalette_HondewBerry}, [ITEM_GREPA_BERRY] = {gItemIcon_GrepaBerry, gItemIconPalette_GrepaBerry}, [ITEM_TAMATO_BERRY] = {gItemIcon_TamatoBerry, gItemIconPalette_TamatoBerry}, [ITEM_CORNN_BERRY] = {gItemIcon_CornnBerry, gItemIconPalette_CornnBerry}, [ITEM_MAGOST_BERRY] = {gItemIcon_MagostBerry, gItemIconPalette_MagostBerry}, [ITEM_RABUTA_BERRY] = {gItemIcon_RabutaBerry, gItemIconPalette_RabutaBerry}, [ITEM_NOMEL_BERRY] = {gItemIcon_NomelBerry, gItemIconPalette_NomelBerry}, [ITEM_SPELON_BERRY] = {gItemIcon_SpelonBerry, gItemIconPalette_SpelonBerry}, [ITEM_PAMTRE_BERRY] = {gItemIcon_PamtreBerry, gItemIconPalette_PamtreBerry}, [ITEM_WATMEL_BERRY] = {gItemIcon_WatmelBerry, gItemIconPalette_WatmelBerry}, [ITEM_DURIN_BERRY] = {gItemIcon_DurinBerry, gItemIconPalette_DurinBerry}, [ITEM_BELUE_BERRY] = {gItemIcon_BelueBerry, gItemIconPalette_BelueBerry}, [ITEM_LIECHI_BERRY] = {gItemIcon_LiechiBerry, gItemIconPalette_LiechiBerry}, [ITEM_GANLON_BERRY] = {gItemIcon_GanlonBerry, gItemIconPalette_GanlonBerry}, [ITEM_SALAC_BERRY] = {gItemIcon_SalacBerry, gItemIconPalette_SalacBerry}, [ITEM_PETAYA_BERRY] = {gItemIcon_PetayaBerry, gItemIconPalette_PetayaBerry}, [ITEM_APICOT_BERRY] = {gItemIcon_ApicotBerry, gItemIconPalette_ApicotBerry}, [ITEM_LANSAT_BERRY] = {gItemIcon_LansatBerry, gItemIconPalette_LansatBerry}, [ITEM_STARF_BERRY] = {gItemIcon_StarfBerry, gItemIconPalette_StarfBerry}, [ITEM_ENIGMA_BERRY] = {gItemIcon_EnigmaBerry, gItemIconPalette_EnigmaBerry}, [ITEM_UNUSED_BERRY_1] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_UNUSED_BERRY_2] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_UNUSED_BERRY_3] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // Hold items [ITEM_BRIGHT_POWDER] = {gItemIcon_BrightPowder, gItemIconPalette_BrightPowder}, [ITEM_WHITE_HERB] = {gItemIcon_InBattleHerb, gItemIconPalette_WhiteHerb}, [ITEM_MACHO_BRACE] = {gItemIcon_MachoBrace, gItemIconPalette_MachoBrace}, [ITEM_EXP_SHARE] = {gItemIcon_ExpShare, gItemIconPalette_ExpShare}, [ITEM_QUICK_CLAW] = {gItemIcon_QuickClaw, gItemIconPalette_QuickClaw}, [ITEM_SOOTHE_BELL] = {gItemIcon_SootheBell, gItemIconPalette_SootheBell}, [ITEM_MENTAL_HERB] = {gItemIcon_InBattleHerb, gItemIconPalette_MentalHerb}, [ITEM_CHOICE_BAND] = {gItemIcon_ChoiceBand, gItemIconPalette_ChoiceBand}, [ITEM_KINGS_ROCK] = {gItemIcon_KingsRock, gItemIconPalette_KingsRock}, [ITEM_SILVER_POWDER] = {gItemIcon_SilverPowder, gItemIconPalette_SilverPowder}, [ITEM_AMULET_COIN] = {gItemIcon_AmuletCoin, gItemIconPalette_AmuletCoin}, [ITEM_CLEANSE_TAG] = {gItemIcon_CleanseTag, gItemIconPalette_CleanseTag}, [ITEM_SOUL_DEW] = {gItemIcon_SoulDew, gItemIconPalette_SoulDew}, [ITEM_DEEP_SEA_TOOTH] = {gItemIcon_DeepSeaTooth, gItemIconPalette_DeepSeaTooth}, [ITEM_DEEP_SEA_SCALE] = {gItemIcon_DeepSeaScale, gItemIconPalette_DeepSeaScale}, [ITEM_SMOKE_BALL] = {gItemIcon_SmokeBall, gItemIconPalette_SmokeBall}, [ITEM_EVERSTONE] = {gItemIcon_Everstone, gItemIconPalette_Everstone}, [ITEM_FOCUS_BAND] = {gItemIcon_FocusBand, gItemIconPalette_FocusBand}, [ITEM_LUCKY_EGG] = {gItemIcon_LuckyEgg, gItemIconPalette_LuckyEgg}, [ITEM_SCOPE_LENS] = {gItemIcon_ScopeLens, gItemIconPalette_ScopeLens}, [ITEM_METAL_COAT] = {gItemIcon_MetalCoat, gItemIconPalette_MetalCoat}, [ITEM_LEFTOVERS] = {gItemIcon_Leftovers, gItemIconPalette_Leftovers}, [ITEM_DRAGON_SCALE] = {gItemIcon_DragonScale, gItemIconPalette_DragonScale}, [ITEM_LIGHT_BALL] = {gItemIcon_LightBall, gItemIconPalette_LightBall}, [ITEM_SOFT_SAND] = {gItemIcon_SoftSand, gItemIconPalette_SoftSand}, [ITEM_HARD_STONE] = {gItemIcon_HardStone, gItemIconPalette_HardStone}, [ITEM_MIRACLE_SEED] = {gItemIcon_MiracleSeed, gItemIconPalette_MiracleSeed}, [ITEM_BLACK_GLASSES] = {gItemIcon_BlackGlasses, gItemIconPalette_BlackTypeEnhancingItem}, [ITEM_BLACK_BELT] = {gItemIcon_BlackBelt, gItemIconPalette_BlackTypeEnhancingItem}, [ITEM_MAGNET] = {gItemIcon_Magnet, gItemIconPalette_Magnet}, [ITEM_MYSTIC_WATER] = {gItemIcon_MysticWater, gItemIconPalette_MysticWater}, [ITEM_SHARP_BEAK] = {gItemIcon_SharpBeak, gItemIconPalette_SharpBeak}, [ITEM_POISON_BARB] = {gItemIcon_PoisonBarb, gItemIconPalette_PoisonBarb}, [ITEM_NEVER_MELT_ICE] = {gItemIcon_NeverMeltIce, gItemIconPalette_NeverMeltIce}, [ITEM_SPELL_TAG] = {gItemIcon_SpellTag, gItemIconPalette_SpellTag}, [ITEM_TWISTED_SPOON] = {gItemIcon_TwistedSpoon, gItemIconPalette_TwistedSpoon}, [ITEM_CHARCOAL] = {gItemIcon_Charcoal, gItemIconPalette_Charcoal}, [ITEM_DRAGON_FANG] = {gItemIcon_DragonFang, gItemIconPalette_DragonFang}, [ITEM_SILK_SCARF] = {gItemIcon_SilkScarf, gItemIconPalette_SilkScarf}, [ITEM_UP_GRADE] = {gItemIcon_UpGrade, gItemIconPalette_UpGrade}, [ITEM_SHELL_BELL] = {gItemIcon_ShellBell, gItemIconPalette_Shell}, [ITEM_SEA_INCENSE] = {gItemIcon_SeaIncense, gItemIconPalette_SeaIncense}, [ITEM_LAX_INCENSE] = {gItemIcon_LaxIncense, gItemIconPalette_LaxIncense}, [ITEM_LUCKY_PUNCH] = {gItemIcon_LuckyPunch, gItemIconPalette_LuckyPunch}, [ITEM_METAL_POWDER] = {gItemIcon_MetalPowder, gItemIconPalette_MetalPowder}, [ITEM_THICK_CLUB] = {gItemIcon_ThickClub, gItemIconPalette_ThickClub}, [ITEM_STICK] = {gItemIcon_Stick, gItemIconPalette_Stick}, // ???????? [ITEM_0E2] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E3] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E4] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E5] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E6] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E7] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E8] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E9] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0EA] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0EB] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0EC] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0ED] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0EE] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0EF] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F0] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F1] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F2] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F3] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F4] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F5] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F6] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F7] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F8] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0F9] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0FA] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0FB] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0FC] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0FD] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // Contest hold items [ITEM_RED_SCARF] = {gItemIcon_Scarf, gItemIconPalette_RedScarf}, [ITEM_BLUE_SCARF] = {gItemIcon_Scarf, gItemIconPalette_BlueScarf}, [ITEM_PINK_SCARF] = {gItemIcon_Scarf, gItemIconPalette_PinkScarf}, [ITEM_GREEN_SCARF] = {gItemIcon_Scarf, gItemIconPalette_GreenScarf}, [ITEM_YELLOW_SCARF] = {gItemIcon_Scarf, gItemIconPalette_YellowScarf}, // Key items [ITEM_MACH_BIKE] = {gItemIcon_MachBike, gItemIconPalette_MachBike}, [ITEM_COIN_CASE] = {gItemIcon_CoinCase, gItemIconPalette_CoinCase}, [ITEM_ITEMFINDER] = {gItemIcon_Itemfinder, gItemIconPalette_Itemfinder}, [ITEM_OLD_ROD] = {gItemIcon_OldRod, gItemIconPalette_OldRod}, [ITEM_GOOD_ROD] = {gItemIcon_GoodRod, gItemIconPalette_GoodRod}, [ITEM_SUPER_ROD] = {gItemIcon_SuperRod, gItemIconPalette_SuperRod}, [ITEM_SS_TICKET] = {gItemIcon_SSTicket, gItemIconPalette_SSTicket}, [ITEM_CONTEST_PASS] = {gItemIcon_ContestPass, gItemIconPalette_ContestPass}, [ITEM_10B] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_WAILMER_PAIL] = {gItemIcon_WailmerPail, gItemIconPalette_WailmerPail}, [ITEM_DEVON_GOODS] = {gItemIcon_DevonGoods, gItemIconPalette_DevonGoods}, [ITEM_SOOT_SACK] = {gItemIcon_SootSack, gItemIconPalette_SootSack}, [ITEM_BASEMENT_KEY] = {gItemIcon_BasementKey, gItemIconPalette_OldKey}, [ITEM_ACRO_BIKE] = {gItemIcon_AcroBike, gItemIconPalette_AcroBike}, [ITEM_POKEBLOCK_CASE] = {gItemIcon_PokeblockCase, gItemIconPalette_PokeblockCase}, [ITEM_LETTER] = {gItemIcon_Letter, gItemIconPalette_LavaCookieAndLetter}, [ITEM_EON_TICKET] = {gItemIcon_EonTicket, gItemIconPalette_EonTicket}, [ITEM_RED_ORB] = {gItemIcon_Orb, gItemIconPalette_RedOrb}, [ITEM_BLUE_ORB] = {gItemIcon_Orb, gItemIconPalette_BlueOrb}, [ITEM_SCANNER] = {gItemIcon_Scanner, gItemIconPalette_Scanner}, [ITEM_GO_GOGGLES] = {gItemIcon_GoGoggles, gItemIconPalette_GoGoggles}, [ITEM_METEORITE] = {gItemIcon_Meteorite, gItemIconPalette_Meteorite}, [ITEM_ROOM_1_KEY] = {gItemIcon_Room1Key, gItemIconPalette_Key}, [ITEM_ROOM_2_KEY] = {gItemIcon_Room2Key, gItemIconPalette_Key}, [ITEM_ROOM_4_KEY] = {gItemIcon_Room4Key, gItemIconPalette_Key}, [ITEM_ROOM_6_KEY] = {gItemIcon_Room6Key, gItemIconPalette_Key}, [ITEM_STORAGE_KEY] = {gItemIcon_StorageKey, gItemIconPalette_OldKey}, [ITEM_ROOT_FOSSIL] = {gItemIcon_RootFossil, gItemIconPalette_HoennFossil}, [ITEM_CLAW_FOSSIL] = {gItemIcon_ClawFossil, gItemIconPalette_HoennFossil}, [ITEM_DEVON_SCOPE] = {gItemIcon_DevonScope, gItemIconPalette_DevonScope}, // TMs / HMs [ITEM_TM01] = {gItemIcon_TMHM, gItemIconPalette_FightingTMHM}, [ITEM_TM02] = {gItemIcon_TMHM, gItemIconPalette_DragonTMHM}, [ITEM_TM03] = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM}, [ITEM_TM04] = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM}, [ITEM_TM05] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM06] = {gItemIcon_TMHM, gItemIconPalette_PoisonTMHM}, [ITEM_TM07] = {gItemIcon_TMHM, gItemIconPalette_IceTMHM}, [ITEM_TM08] = {gItemIcon_TMHM, gItemIconPalette_FightingTMHM}, [ITEM_TM09] = {gItemIcon_TMHM, gItemIconPalette_GrassTMHM}, [ITEM_TM10] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM11] = {gItemIcon_TMHM, gItemIconPalette_FireTMHM}, [ITEM_TM12] = {gItemIcon_TMHM, gItemIconPalette_DarkTMHM}, [ITEM_TM13] = {gItemIcon_TMHM, gItemIconPalette_IceTMHM}, [ITEM_TM14] = {gItemIcon_TMHM, gItemIconPalette_IceTMHM}, [ITEM_TM15] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM16] = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM}, [ITEM_TM17] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM18] = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM}, [ITEM_TM19] = {gItemIcon_TMHM, gItemIconPalette_GrassTMHM}, [ITEM_TM20] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM21] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM22] = {gItemIcon_TMHM, gItemIconPalette_GrassTMHM}, [ITEM_TM23] = {gItemIcon_TMHM, gItemIconPalette_SteelTMHM}, [ITEM_TM24] = {gItemIcon_TMHM, gItemIconPalette_ElectricTMHM}, [ITEM_TM25] = {gItemIcon_TMHM, gItemIconPalette_ElectricTMHM}, [ITEM_TM26] = {gItemIcon_TMHM, gItemIconPalette_GroundTMHM}, [ITEM_TM27] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM28] = {gItemIcon_TMHM, gItemIconPalette_GroundTMHM}, [ITEM_TM29] = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM}, [ITEM_TM30] = {gItemIcon_TMHM, gItemIconPalette_GhostTMHM}, [ITEM_TM31] = {gItemIcon_TMHM, gItemIconPalette_FightingTMHM}, [ITEM_TM32] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM33] = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM}, [ITEM_TM34] = {gItemIcon_TMHM, gItemIconPalette_ElectricTMHM}, [ITEM_TM35] = {gItemIcon_TMHM, gItemIconPalette_FireTMHM}, [ITEM_TM36] = {gItemIcon_TMHM, gItemIconPalette_PoisonTMHM}, [ITEM_TM37] = {gItemIcon_TMHM, gItemIconPalette_RockTMHM}, [ITEM_TM38] = {gItemIcon_TMHM, gItemIconPalette_FireTMHM}, [ITEM_TM39] = {gItemIcon_TMHM, gItemIconPalette_RockTMHM}, [ITEM_TM40] = {gItemIcon_TMHM, gItemIconPalette_FlyingTMHM}, [ITEM_TM41] = {gItemIcon_TMHM, gItemIconPalette_DarkTMHM}, [ITEM_TM42] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM43] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM44] = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM}, [ITEM_TM45] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_TM46] = {gItemIcon_TMHM, gItemIconPalette_DarkTMHM}, [ITEM_TM47] = {gItemIcon_TMHM, gItemIconPalette_SteelTMHM}, [ITEM_TM48] = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM}, [ITEM_TM49] = {gItemIcon_TMHM, gItemIconPalette_DarkTMHM}, [ITEM_TM50] = {gItemIcon_TMHM, gItemIconPalette_FireTMHM}, [ITEM_HM01] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_HM02] = {gItemIcon_TMHM, gItemIconPalette_FlyingTMHM}, [ITEM_HM03] = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM}, [ITEM_HM04] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_HM05] = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM}, [ITEM_HM06] = {gItemIcon_TMHM, gItemIconPalette_FightingTMHM}, [ITEM_HM07] = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM}, [ITEM_HM08] = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM}, // ???????? [ITEM_15B] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_15C] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, // FireRed/LeafGreen key items [ITEM_OAKS_PARCEL] = {gItemIcon_OaksParcel, gItemIconPalette_OaksParcel}, [ITEM_POKE_FLUTE] = {gItemIcon_PokeFlute, gItemIconPalette_PokeFlute}, [ITEM_SECRET_KEY] = {gItemIcon_SecretKey, gItemIconPalette_SecretKey}, [ITEM_BIKE_VOUCHER] = {gItemIcon_BikeVoucher, gItemIconPalette_BikeVoucher}, [ITEM_GOLD_TEETH] = {gItemIcon_GoldTeeth, gItemIconPalette_GoldTeeth}, [ITEM_OLD_AMBER] = {gItemIcon_OldAmber, gItemIconPalette_OldAmber}, [ITEM_CARD_KEY] = {gItemIcon_CardKey, gItemIconPalette_CardKey}, [ITEM_LIFT_KEY] = {gItemIcon_LiftKey, gItemIconPalette_Key}, [ITEM_HELIX_FOSSIL] = {gItemIcon_HelixFossil, gItemIconPalette_KantoFossil}, [ITEM_DOME_FOSSIL] = {gItemIcon_DomeFossil, gItemIconPalette_KantoFossil}, [ITEM_SILPH_SCOPE] = {gItemIcon_SilphScope, gItemIconPalette_SilphScope}, [ITEM_BICYCLE] = {gItemIcon_Bicycle, gItemIconPalette_Bicycle}, [ITEM_TOWN_MAP] = {gItemIcon_TownMap, gItemIconPalette_TownMap}, [ITEM_VS_SEEKER] = {gItemIcon_VSSeeker, gItemIconPalette_VSSeeker}, [ITEM_FAME_CHECKER] = {gItemIcon_FameChecker, gItemIconPalette_FameChecker}, [ITEM_TM_CASE] = {gItemIcon_TMCase, gItemIconPalette_TMCase}, [ITEM_BERRY_POUCH] = {gItemIcon_BerryPouch, gItemIconPalette_BerryPouch}, [ITEM_TEACHY_TV] = {gItemIcon_TeachyTV, gItemIconPalette_TeachyTV}, [ITEM_TRI_PASS] = {gItemIcon_TriPass, gItemIconPalette_TriPass}, [ITEM_RAINBOW_PASS] = {gItemIcon_RainbowPass, gItemIconPalette_RainbowPass}, [ITEM_TEA] = {gItemIcon_Tea, gItemIconPalette_Tea}, [ITEM_MYSTIC_TICKET] = {gItemIcon_MysticTicket, gItemIconPalette_MysticTicket}, [ITEM_AURORA_TICKET] = {gItemIcon_AuroraTicket, gItemIconPalette_AuroraTicket}, [ITEM_POWDER_JAR] = {gItemIcon_PowderJar, gItemIconPalette_PowderJar}, [ITEM_RUBY] = {gItemIcon_Gem, gItemIconPalette_Ruby}, [ITEM_SAPPHIRE] = {gItemIcon_Gem, gItemIconPalette_Sapphire}, [ITEM_MAGMA_EMBLEM] = {gItemIcon_MagmaEmblem, gItemIconPalette_MagmaEmblem}, [ITEM_OLD_SEA_MAP] = {gItemIcon_OldSeaMap, gItemIconPalette_OldSeaMap}, // Return to field arrow [ITEMS_COUNT] = {gItemIcon_ReturnToFieldArrow, gItemIconPalette_ReturnToFieldArrow}, }; ================================================ FILE: src/data/items.json ================================================ { "items": [ { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MASTER BALL", "itemId": "ITEM_MASTER_BALL", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The best BALL with the ultimate\\nperformance. It will catch any wild\\nPOKéMON without fail.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 0, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 0 }, { "english": "ULTRA BALL", "itemId": "ITEM_ULTRA_BALL", "price": 1200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A very high-grade BALL that offers\\na higher POKéMON catch rate than\\na GREAT BALL.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 1, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 1 }, { "english": "GREAT BALL", "itemId": "ITEM_GREAT_BALL", "price": 600, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A good, quality BALL that offers\\na higher POKéMON catch rate than\\na standard POKé BALL.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 2, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 2 }, { "english": "POK\u00e9 BALL", "itemId": "ITEM_POKE_BALL", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A BALL thrown to catch a wild\\nPOKéMON. It is designed in a\\ncapsule style.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 3, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 3 }, { "english": "SAFARI BALL", "itemId": "ITEM_SAFARI_BALL", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A special BALL that is used only in\\nthe SAFARI ZONE. It is finished in\\na camouflage pattern.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 4, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 4 }, { "english": "NET BALL", "itemId": "ITEM_NET_BALL", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A somewhat different BALL that\\nworks especially well on WATER- and\\nBUG-type POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 5, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 5 }, { "english": "DIVE BALL", "itemId": "ITEM_DIVE_BALL", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A somewhat different BALL that\\nworks especially well on POKéMON\\ndeep in the sea.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 6, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 6 }, { "english": "NEST BALL", "itemId": "ITEM_NEST_BALL", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A somewhat different BALL that\\nworks especially well on weaker\\nPOKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 7, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 7 }, { "english": "REPEAT BALL", "itemId": "ITEM_REPEAT_BALL", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A somewhat different BALL that\\nworks especially well on POKéMON\\ncaught before.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 8, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 8 }, { "english": "TIMER BALL", "itemId": "ITEM_TIMER_BALL", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A somewhat different BALL that\\nbecomes progressively better the\\nmore turns there are in a battle.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 9, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 9 }, { "english": "LUXURY BALL", "itemId": "ITEM_LUXURY_BALL", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A comfortable BALL that makes a\\ncaptured wild POKéMON quickly grow\\nfriendly.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 10, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 10 }, { "english": "PREMIER BALL", "itemId": "ITEM_PREMIER_BALL", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A rare BALL that has been\\nspecially made to commemorate an\\nevent of some sort.", "importance": 0, "registrability": 0, "pocket": "POCKET_POKE_BALLS", "type": 11, "fieldUseFunc": "NULL", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeBallEtc", "secondaryId": 11 }, { "english": "POTION", "itemId": "ITEM_POTION", "price": 300, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 20, "description_english": "A spray-type wound medicine.\\nIt restores the HP of one POKéMON\\nby 20 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "ANTIDOTE", "itemId": "ITEM_ANTIDOTE", "price": 100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A spray-type medicine.\\nIt heals one POKéMON from a\\npoisoning.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "BURN HEAL", "itemId": "ITEM_BURN_HEAL", "price": 250, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A spray-type medicine.\\nIt heals one POKéMON of a burn.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "ICE HEAL", "itemId": "ITEM_ICE_HEAL", "price": 250, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A spray-type medicine.\\nIt defrosts a frozen POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "AWAKENING", "itemId": "ITEM_AWAKENING", "price": 250, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A spray-type medicine.\\nIt awakens a sleeping POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "PARLYZ HEAL", "itemId": "ITEM_PARALYZE_HEAL", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A spray-type medicine.\\nIt heals one POKéMON from\\nparalysis.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "FULL RESTORE", "itemId": "ITEM_FULL_RESTORE", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 255, "description_english": "A medicine that fully restores the\\nHP and heals any status problems\\nof one POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "MAX POTION", "itemId": "ITEM_MAX_POTION", "price": 2500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 255, "description_english": "A spray-type wound medicine.\\nIt fully restores the HP of one\\nPOKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "HYPER POTION", "itemId": "ITEM_HYPER_POTION", "price": 1200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 200, "description_english": "A spray-type wound medicine.\\nIt restores the HP of one POKéMON\\nby 200 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "SUPER POTION", "itemId": "ITEM_SUPER_POTION", "price": 700, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 50, "description_english": "A spray-type wound medicine.\\nIt restores the HP of one POKéMON\\nby 50 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "FULL HEAL", "itemId": "ITEM_FULL_HEAL", "price": 600, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A spray-type medicine.\\nIt heals all the status problems of\\none POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "REVIVE", "itemId": "ITEM_REVIVE", "price": 1500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A medicine that revives a fainted\\nPOKéMON, restoring HP by half the\\nmaximum amount.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "MAX REVIVE", "itemId": "ITEM_MAX_REVIVE", "price": 4000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A medicine that revives a fainted\\nPOKéMON, restoring HP fully.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "FRESH WATER", "itemId": "ITEM_FRESH_WATER", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 50, "description_english": "Water with a high mineral content.\\nIt restores the HP of one POKéMON\\nby 50 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "SODA POP", "itemId": "ITEM_SODA_POP", "price": 300, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 60, "description_english": "A fizzy soda drink.\\nIt restores the HP of one POKéMON\\nby 60 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "LEMONADE", "itemId": "ITEM_LEMONADE", "price": 350, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 80, "description_english": "A very sweet drink.\\nIt restores the HP of one POKéMON\\nby 80 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "MOOMOO MILK", "itemId": "ITEM_MOOMOO_MILK", "price": 500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 100, "description_english": "Highly nutritious milk.\\nIt restores the HP of one POKéMON\\nby 100 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "ENERGYPOWDER", "itemId": "ITEM_ENERGY_POWDER", "price": 500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A very bitter medicine powder.\\nIt restores the HP of one POKéMON\\nby 50 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "ENERGY ROOT", "itemId": "ITEM_ENERGY_ROOT", "price": 800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A very bitter root.\\nIt restores the HP of one POKéMON\\nby 200 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "HEAL POWDER", "itemId": "ITEM_HEAL_POWDER", "price": 450, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A very bitter medicine powder.\\nIt heals all the status problems of\\none POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "REVIVAL HERB", "itemId": "ITEM_REVIVAL_HERB", "price": 2800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A very bitter medicinal herb.\\nIt revives a fainted POKéMON,\\nrestoring HP fully.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "ETHER", "itemId": "ITEM_ETHER", "price": 1200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 10, "description_english": "Restores a selected move's PP by\\n10 points for one POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Ether", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Ether", "secondaryId": 0 }, { "english": "MAX ETHER", "itemId": "ITEM_MAX_ETHER", "price": 2000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 255, "description_english": "Fully restores a selected move's PP\\nfor one POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Ether", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Ether", "secondaryId": 0 }, { "english": "ELIXIR", "itemId": "ITEM_ELIXIR", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 10, "description_english": "Restores the PP of all moves for\\none POKéMON by 10 points each.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Ether", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Ether", "secondaryId": 0 }, { "english": "MAX ELIXIR", "itemId": "ITEM_MAX_ELIXIR", "price": 4500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 255, "description_english": "Fully restores the PP of all moves\\nfor one POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Ether", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Ether", "secondaryId": 0 }, { "english": "LAVA COOKIE", "itemId": "ITEM_LAVA_COOKIE", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "LAVARIDGE TOWN's local specialty.\\nIt heals all the status problems of\\none POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "BLUE FLUTE", "itemId": "ITEM_BLUE_FLUTE", "price": 100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A blue glass flute that awakens\\na sleeping POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "YELLOW FLUTE", "itemId": "ITEM_YELLOW_FLUTE", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A yellow glass flute that snaps one\\nPOKéMON out of confusion.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "RED FLUTE", "itemId": "ITEM_RED_FLUTE", "price": 300, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A red glass flute that snaps one\\nPOKéMON out of infatuation.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "BLACK FLUTE", "itemId": "ITEM_BLACK_FLUTE", "price": 400, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 50, "description_english": "A black glass flute.\\nWhen blown, it makes wild POKéMON\\nless likely to appear.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_BlackWhiteFlute", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "WHITE FLUTE", "itemId": "ITEM_WHITE_FLUTE", "price": 500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 150, "description_english": "A white glass flute.\\nWhen blown, it makes wild POKéMON\\nmore likely to appear.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_BlackWhiteFlute", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BERRY JUICE", "itemId": "ITEM_BERRY_JUICE", "price": 100, "holdEffect": "HOLD_EFFECT_RESTORE_HP", "holdEffectParam": 20, "description_english": "A 100% pure juice.\\nIt restores the HP of one POKéMON\\nby 20 points.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "SACRED ASH", "itemId": "ITEM_SACRED_ASH", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Revives all fainted POKéMON,\\nrestoring HP fully.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_SacredAsh", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SHOAL SALT", "itemId": "ITEM_SHOAL_SALT", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Pure salt obtained from deep inside\\nthe SHOAL CAVE. It is extremely\\nsalty.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SHOAL SHELL", "itemId": "ITEM_SHOAL_SHELL", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A pretty seashell found deep inside\\nthe SHOAL CAVE. It is striped in\\nblue and white.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RED SHARD", "itemId": "ITEM_RED_SHARD", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A small red shard.\\nIt appears to be from some sort of\\na tool made long ago.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BLUE SHARD", "itemId": "ITEM_BLUE_SHARD", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A small blue shard.\\nIt appears to be from some sort of\\na tool made long ago.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "YELLOW SHARD", "itemId": "ITEM_YELLOW_SHARD", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A small yellow shard.\\nIt appears to be from some sort of\\na tool made long ago.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "GREEN SHARD", "itemId": "ITEM_GREEN_SHARD", "price": 200, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A small green shard.\\nIt appears to be from some sort of\\na tool made long ago.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "HP UP", "itemId": "ITEM_HP_UP", "price": 9800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A nutritious drink for POKéMON.\\nIt raises the base HP of one\\nPOKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "PROTEIN", "itemId": "ITEM_PROTEIN", "price": 9800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A nutritious drink for POKéMON.\\nIt raises the base ATTACK stat of\\none POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "IRON", "itemId": "ITEM_IRON", "price": 9800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A nutritious drink for POKéMON.\\nIt raises the base DEFENSE stat of\\none POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "CARBOS", "itemId": "ITEM_CARBOS", "price": 9800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A nutritious drink for POKéMON.\\nIt raises the base SPEED stat of\\none POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "CALCIUM", "itemId": "ITEM_CALCIUM", "price": 9800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A nutritious drink for POKéMON.\\nIt raises the base SP. ATK stat\\nof one POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RARE CANDY", "itemId": "ITEM_RARE_CANDY", "price": 4800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A candy that is packed with energy.\\nIt raises the level of a POKéMON\\nby one.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_RareCandy", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "PP UP", "itemId": "ITEM_PP_UP", "price": 9800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Slightly raises the maximum PP of\\na selected move for one POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_PpUp", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "ZINC", "itemId": "ITEM_ZINC", "price": 9800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A nutritious drink for POKéMON.\\nIt raises the base SP. DEF stat\\nof one POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "PP MAX", "itemId": "ITEM_PP_MAX", "price": 9800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Raises the PP of a selected move\\nto its maximum level for one\\nPOKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_MEDICINE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_PpUp", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "GUARD SPEC.", "itemId": "ITEM_GUARD_SPEC", "price": 700, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An item that prevents stat reduction\\namong party POKéMON for five turns\\nafter use.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_StatBooster", "secondaryId": 0 }, { "english": "DIRE HIT", "itemId": "ITEM_DIRE_HIT", "price": 650, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Raises the critical-hit ratio of\\nPOKéMON in battle. Wears off if the\\nPOKéMON is withdrawn.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_StatBooster", "secondaryId": 0 }, { "english": "X ATTACK", "itemId": "ITEM_X_ATTACK", "price": 500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Raises the ATTACK stat of POKéMON\\nin battle. Wears off if the POKéMON\\nis withdrawn.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_StatBooster", "secondaryId": 0 }, { "english": "X DEFEND", "itemId": "ITEM_X_DEFEND", "price": 550, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Raises the DEFENSE stat of POKéMON\\nin battle. Wears off if the POKéMON\\nis withdrawn.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_StatBooster", "secondaryId": 0 }, { "english": "X SPEED", "itemId": "ITEM_X_SPEED", "price": 350, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Raises the SPEED stat of POKéMON\\nin battle. Wears off if the POKéMON\\nis withdrawn.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_StatBooster", "secondaryId": 0 }, { "english": "X ACCURACY", "itemId": "ITEM_X_ACCURACY", "price": 950, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Raises the accuracy stat of\\nPOKéMON in battle. Wears off if the\\nPOKéMON is withdrawn.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_StatBooster", "secondaryId": 0 }, { "english": "X SPECIAL", "itemId": "ITEM_X_SPECIAL", "price": 350, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Raises the SP. ATK stat of\\nPOKéMON in battle. Wears off if the\\nPOKéMON is withdrawn.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_StatBooster", "secondaryId": 0 }, { "english": "POK\u00e9 DOLL", "itemId": "ITEM_POKE_DOLL", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An attractive doll.\\nUse it to flee from any battle with\\na wild POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeDoll", "secondaryId": 0 }, { "english": "FLUFFY TAIL", "itemId": "ITEM_FLUFFY_TAIL", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An attractive item.\\nUse it to flee from any battle with\\na wild POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeDoll", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SUPER REPEL", "itemId": "ITEM_SUPER_REPEL", "price": 500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 200, "description_english": "Prevents weak wild POKéMON from\\nappearing for 200 steps.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_Repel", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MAX REPEL", "itemId": "ITEM_MAX_REPEL", "price": 700, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 250, "description_english": "Prevents weak wild POKéMON from\\nappearing for 250 steps.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_Repel", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "ESCAPE ROPE", "itemId": "ITEM_ESCAPE_ROPE", "price": 550, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A long, durable rope.\\nUse it to escape instantly from a\\ncave or a dungeon.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "ItemUseOutOfBattle_EscapeRope", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "REPEL", "itemId": "ITEM_REPEL", "price": 350, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 100, "description_english": "Prevents weak wild POKéMON from\\nappearing for 100 steps.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_Repel", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SUN STONE", "itemId": "ITEM_SUN_STONE", "price": 2100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt is as red as the sun.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_EvoItem", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MOON STONE", "itemId": "ITEM_MOON_STONE", "price": 2100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt is as black as the night sky.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_EvoItem", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "FIRE STONE", "itemId": "ITEM_FIRE_STONE", "price": 2100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt is colored orange.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_EvoItem", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "THUNDERSTONE", "itemId": "ITEM_THUNDER_STONE", "price": 2100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt has a thunderbolt pattern.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_EvoItem", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "WATER STONE", "itemId": "ITEM_WATER_STONE", "price": 2100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt is a clear light blue.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_EvoItem", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LEAF STONE", "itemId": "ITEM_LEAF_STONE", "price": 2100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt has a leaf pattern.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_EvoItem", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "TINYMUSHROOM", "itemId": "ITEM_TINY_MUSHROOM", "price": 500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A small and rare mushroom.\\nIt is quite popular among certain\\npeople.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BIG MUSHROOM", "itemId": "ITEM_BIG_MUSHROOM", "price": 5000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A large and rare mushroom.\\nIt is very popular among certain\\npeople.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "PEARL", "itemId": "ITEM_PEARL", "price": 1400, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A relatively small pearl that\\nsparkles in a pretty silver color.\\nIt can be sold cheaply.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BIG PEARL", "itemId": "ITEM_BIG_PEARL", "price": 7500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A quite-large pearl that sparkles\\nin a pretty silver color.\\nIt can be sold at a high price.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "STARDUST", "itemId": "ITEM_STARDUST", "price": 2000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A pretty red sand with a loose,\\nsilky feel.\\nIt can be sold at a high price.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "STAR PIECE", "itemId": "ITEM_STAR_PIECE", "price": 9800, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A shard of a pretty gem that\\nsparkles in a red color.\\nIt can be sold at a high price.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "NUGGET", "itemId": "ITEM_NUGGET", "price": 10000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A nugget of pure gold that gives\\noff a lustrous gleam.\\nIt can be sold at a high price.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "HEART SCALE", "itemId": "ITEM_HEART_SCALE", "price": 100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A pretty, heart-shaped scale that\\nis extremely rare. It glows faintly\\nin the colors of a rainbow.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LINKBRACELET", "itemId": "ITEM_LINK_BRACELET", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A bracelet signifying your link with\\n{RIVAL}. Wearing it makes certain\\nspecies of POKéMON evolve.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_EvoItem", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "ORANGE MAIL", "itemId": "ITEM_ORANGE_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a cute\\nZIGZAGOON print.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "HARBOR MAIL", "itemId": "ITEM_HARBOR_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a cute\\nWINGULL print.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 1 }, { "english": "GLITTER MAIL", "itemId": "ITEM_GLITTER_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a cute\\nPIKACHU print.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 2 }, { "english": "MECH MAIL", "itemId": "ITEM_MECH_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a cute\\nMAGNEMITE print.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 3 }, { "english": "WOOD MAIL", "itemId": "ITEM_WOOD_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a cute\\nSLAKOTH print.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 4 }, { "english": "WAVE MAIL", "itemId": "ITEM_WAVE_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a cute\\nWAILMER print.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 5 }, { "english": "BEAD MAIL", "itemId": "ITEM_BEAD_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL to be held by a\\nPOKéMON. It will bear the print of\\nthe POKéMON holding it.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 6 }, { "english": "SHADOW MAIL", "itemId": "ITEM_SHADOW_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a cute\\nDUSKULL print.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 7 }, { "english": "TROPIC MAIL", "itemId": "ITEM_TROPIC_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a cute\\nBELLOSSOM print.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 8 }, { "english": "DREAM MAIL", "itemId": "ITEM_DREAM_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL to be held by a\\nPOKéMON. It will bear the print of\\nthe POKéMON holding it.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 9 }, { "english": "FAB MAIL", "itemId": "ITEM_FAB_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a\\ngorgeous, extravagant print.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 10 }, { "english": "RETRO MAIL", "itemId": "ITEM_RETRO_MAIL", "price": 50, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of MAIL featuring a print\\nof three cute POKéMON.\\nIt is to be held by a POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_MAIL", "fieldUseFunc": "FieldUseFunc_Mail", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 11 }, { "english": "CHERI BERRY", "itemId": "ITEM_CHERI_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CURE_PAR", "holdEffectParam": 0, "description_english": "When held by a POKéMON, it will be\\nused in battle to heal paralysis.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "CHESTO BERRY", "itemId": "ITEM_CHESTO_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CURE_SLP", "holdEffectParam": 0, "description_english": "When held by a POKéMON, it will be\\nused in battle to wake up.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "PECHA BERRY", "itemId": "ITEM_PECHA_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CURE_PSN", "holdEffectParam": 0, "description_english": "When held by a POKéMON, it will be\\nused in battle to cure poison.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "RAWST BERRY", "itemId": "ITEM_RAWST_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CURE_BRN", "holdEffectParam": 0, "description_english": "When held by a POKéMON, it will be\\nused in battle to heal a burn.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "ASPEAR BERRY", "itemId": "ITEM_ASPEAR_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CURE_FRZ", "holdEffectParam": 0, "description_english": "When held by a POKéMON, it will be\\nused in battle for defrosting.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "LEPPA BERRY", "itemId": "ITEM_LEPPA_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_RESTORE_PP", "holdEffectParam": 10, "description_english": "When held by a POKéMON, it will be\\nused in battle to restore 10 PP.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Ether", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Ether", "secondaryId": 0 }, { "english": "ORAN BERRY", "itemId": "ITEM_ORAN_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_RESTORE_HP", "holdEffectParam": 10, "description_english": "When held by a POKéMON, it will be\\nused in battle to restore 10 HP.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "PERSIM BERRY", "itemId": "ITEM_PERSIM_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CURE_CONFUSION", "holdEffectParam": 0, "description_english": "When held by a POKéMON, it will be\\nused in battle to lift confusion.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "LUM BERRY", "itemId": "ITEM_LUM_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CURE_STATUS", "holdEffectParam": 0, "description_english": "When held by a POKéMON, it will be\\nused in battle to heal any problem.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "SITRUS BERRY", "itemId": "ITEM_SITRUS_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_RESTORE_HP", "holdEffectParam": 30, "description_english": "When held by a POKéMON, it will be\\nused in battle to restore 30 HP.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "FieldUseFunc_Medicine", "battleUsage": 1, "battleUseFunc": "BattleUseFunc_Medicine", "secondaryId": 0 }, { "english": "FIGY BERRY", "itemId": "ITEM_FIGY_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CONFUSE_SPICY", "holdEffectParam": 8, "description_english": "A hold item that restores HP but\\nmay cause confusion when used.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "WIKI BERRY", "itemId": "ITEM_WIKI_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CONFUSE_DRY", "holdEffectParam": 8, "description_english": "A hold item that restores HP but\\nmay cause confusion when used.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MAGO BERRY", "itemId": "ITEM_MAGO_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CONFUSE_SWEET", "holdEffectParam": 8, "description_english": "A hold item that restores HP but\\nmay cause confusion when used.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "AGUAV BERRY", "itemId": "ITEM_AGUAV_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CONFUSE_BITTER", "holdEffectParam": 8, "description_english": "A hold item that restores HP but\\nmay cause confusion when used.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "IAPAPA BERRY", "itemId": "ITEM_IAPAPA_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CONFUSE_SOUR", "holdEffectParam": 8, "description_english": "A hold item that restores HP but\\nmay cause confusion when used.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RAZZ BERRY", "itemId": "ITEM_RAZZ_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BLUK BERRY", "itemId": "ITEM_BLUK_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "NANAB BERRY", "itemId": "ITEM_NANAB_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "WEPEAR BERRY", "itemId": "ITEM_WEPEAR_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "PINAP BERRY", "itemId": "ITEM_PINAP_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "POMEG BERRY", "itemId": "ITEM_POMEG_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Makes a POKéMON friendly but\\nlowers base HP.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "ItemUseOutOfBattle_ReduceEV", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "KELPSY BERRY", "itemId": "ITEM_KELPSY_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Makes a POKéMON friendly but\\nlowers base ATTACK.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "ItemUseOutOfBattle_ReduceEV", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "QUALOT BERRY", "itemId": "ITEM_QUALOT_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Makes a POKéMON friendly but\\nlowers base DEFENSE.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "ItemUseOutOfBattle_ReduceEV", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "HONDEW BERRY", "itemId": "ITEM_HONDEW_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Makes a POKéMON friendly but\\nlowers base SP. ATK.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "ItemUseOutOfBattle_ReduceEV", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "GREPA BERRY", "itemId": "ITEM_GREPA_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Makes a POKéMON friendly but\\nlowers base SP. DEF.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "ItemUseOutOfBattle_ReduceEV", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "TAMATO BERRY", "itemId": "ITEM_TAMATO_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Makes a POKéMON friendly but\\nlowers base SPEED.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "ItemUseOutOfBattle_ReduceEV", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "CORNN BERRY", "itemId": "ITEM_CORNN_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MAGOST BERRY", "itemId": "ITEM_MAGOST_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RABUTA BERRY", "itemId": "ITEM_RABUTA_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "NOMEL BERRY", "itemId": "ITEM_NOMEL_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SPELON BERRY", "itemId": "ITEM_SPELON_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "PAMTRE BERRY", "itemId": "ITEM_PAMTRE_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "WATMEL BERRY", "itemId": "ITEM_WATMEL_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "DURIN BERRY", "itemId": "ITEM_DURIN_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BELUE BERRY", "itemId": "ITEM_BELUE_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LIECHI BERRY", "itemId": "ITEM_LIECHI_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_ATTACK_UP", "holdEffectParam": 4, "description_english": "When held by a POKéMON, it raises\\nthe ATTACK stat in a pinch.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "GANLON BERRY", "itemId": "ITEM_GANLON_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_DEFENSE_UP", "holdEffectParam": 4, "description_english": "When held by a POKéMON, it raises\\nthe DEFENSE stat in a pinch.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SALAC BERRY", "itemId": "ITEM_SALAC_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_SPEED_UP", "holdEffectParam": 4, "description_english": "When held by a POKéMON, it raises\\nthe SPEED stat in a pinch.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "PETAYA BERRY", "itemId": "ITEM_PETAYA_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_SP_ATTACK_UP", "holdEffectParam": 4, "description_english": "When held by a POKéMON, it raises\\nthe SP. ATK stat in a pinch.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "APICOT BERRY", "itemId": "ITEM_APICOT_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_SP_DEFENSE_UP", "holdEffectParam": 4, "description_english": "When held by a POKéMON, it raises\\nthe SP. DEF stat in a pinch.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LANSAT BERRY", "itemId": "ITEM_LANSAT_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_CRITICAL_UP", "holdEffectParam": 4, "description_english": "When held by a POKéMON, it raises\\nthe critical-hit ratio in a pinch.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "STARF BERRY", "itemId": "ITEM_STARF_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_RANDOM_STAT_UP", "holdEffectParam": 4, "description_english": "When held by a POKéMON, it sharply\\nraises one stat in a pinch.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "ENIGMA BERRY", "itemId": "ITEM_ENIGMA_BERRY", "price": 20, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.", "importance": 0, "registrability": 0, "pocket": "POCKET_BERRY_POUCH", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "ItemUseOutOfBattle_EnigmaBerry", "battleUsage": 1, "battleUseFunc": "ItemUseInBattle_EnigmaBerry", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BRIGHTPOWDER", "itemId": "ITEM_BRIGHT_POWDER", "price": 10, "holdEffect": "HOLD_EFFECT_EVASION_UP", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nIt casts a tricky glare that lowers\\nthe opponent's accuracy.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "WHITE HERB", "itemId": "ITEM_WHITE_HERB", "price": 100, "holdEffect": "HOLD_EFFECT_RESTORE_STATS", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt restores any lowered stat in\\nbattle. It can be used only once.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MACHO BRACE", "itemId": "ITEM_MACHO_BRACE", "price": 3000, "holdEffect": "HOLD_EFFECT_MACHO_BRACE", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt promotes strong growth but\\nlowers SPEED while it is held.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "EXP. SHARE", "itemId": "ITEM_EXP_SHARE", "price": 3000, "holdEffect": "HOLD_EFFECT_EXP_SHARE", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nThe holder gets a share of EXP.\\npoints without having to battle.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "QUICK CLAW", "itemId": "ITEM_QUICK_CLAW", "price": 100, "holdEffect": "HOLD_EFFECT_QUICK_CLAW", "holdEffectParam": 20, "description_english": "An item to be held by a POKéMON.\\nA light and sharp claw. The holder\\nmay be able to strike first.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SOOTHE BELL", "itemId": "ITEM_SOOTHE_BELL", "price": 100, "holdEffect": "HOLD_EFFECT_FRIENDSHIP_UP", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nA bell with a comforting chime that\\nmakes the holder calm and friendly.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MENTAL HERB", "itemId": "ITEM_MENTAL_HERB", "price": 100, "holdEffect": "HOLD_EFFECT_CURE_ATTRACT", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt snaps the holder out of\\ninfatuation. It can be used once.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "CHOICE BAND", "itemId": "ITEM_CHOICE_BAND", "price": 100, "holdEffect": "HOLD_EFFECT_CHOICE_BAND", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt powers up one move, which\\nbecomes the only usable one.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "KING'S ROCK", "itemId": "ITEM_KINGS_ROCK", "price": 100, "holdEffect": "HOLD_EFFECT_FLINCH", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nIt may cause the foe to flinch\\nupon taking damage.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SILVERPOWDER", "itemId": "ITEM_SILVER_POWDER", "price": 100, "holdEffect": "HOLD_EFFECT_BUG_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA shiny silver powder that boosts\\nthe power of BUG-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "AMULET COIN", "itemId": "ITEM_AMULET_COIN", "price": 100, "holdEffect": "HOLD_EFFECT_DOUBLE_PRIZE", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nIt doubles the battle money if the\\nholding POKéMON takes part.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "CLEANSE TAG", "itemId": "ITEM_CLEANSE_TAG", "price": 200, "holdEffect": "HOLD_EFFECT_REPEL", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt repels wild POKéMON if the\\nholder is first in the party.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SOUL DEW", "itemId": "ITEM_SOUL_DEW", "price": 200, "holdEffect": "HOLD_EFFECT_SOUL_DEW", "holdEffectParam": 0, "description_english": "An orb to be held by a LATIOS or\\nLATIAS. It raises the SP. ATK\\nand SP. DEF stats.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "DEEPSEATOOTH", "itemId": "ITEM_DEEP_SEA_TOOTH", "price": 200, "holdEffect": "HOLD_EFFECT_DEEP_SEA_TOOTH", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nA fang that gleams a sharp silver.\\nIt raises the SP. ATK stat.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "DEEPSEASCALE", "itemId": "ITEM_DEEP_SEA_SCALE", "price": 200, "holdEffect": "HOLD_EFFECT_DEEP_SEA_SCALE", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nA scale that shines a faint pink.\\nIt raises the SP. DEF stat.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SMOKE BALL", "itemId": "ITEM_SMOKE_BALL", "price": 200, "holdEffect": "HOLD_EFFECT_CAN_ALWAYS_RUN", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON can flee from\\nany wild POKéMON for sure.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "EVERSTONE", "itemId": "ITEM_EVERSTONE", "price": 200, "holdEffect": "HOLD_EFFECT_PREVENT_EVOLVE", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON is prevented\\nfrom evolving.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "FOCUS BAND", "itemId": "ITEM_FOCUS_BAND", "price": 200, "holdEffect": "HOLD_EFFECT_FOCUS_BAND", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON may endure an\\nattack, leaving just 1 HP.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LUCKY EGG", "itemId": "ITEM_LUCKY_EGG", "price": 200, "holdEffect": "HOLD_EFFECT_LUCKY_EGG", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nAn egg filled with happiness that\\nearns extra EXP. points in battle.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SCOPE LENS", "itemId": "ITEM_SCOPE_LENS", "price": 200, "holdEffect": "HOLD_EFFECT_SCOPE_LENS", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nA lens that boosts the critical-hit\\nratio of the holding POKéMON.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "METAL COAT", "itemId": "ITEM_METAL_COAT", "price": 100, "holdEffect": "HOLD_EFFECT_STEEL_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA special metallic film that boosts\\nthe power of STEEL-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LEFTOVERS", "itemId": "ITEM_LEFTOVERS", "price": 200, "holdEffect": "HOLD_EFFECT_LEFTOVERS", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON gradually\\nregains HP during battle.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "DRAGON SCALE", "itemId": "ITEM_DRAGON_SCALE", "price": 2100, "holdEffect": "HOLD_EFFECT_DRAGON_SCALE", "holdEffectParam": 10, "description_english": "A thick and tough scale.\\nA DRAGON-type POKéMON may be\\nholding it.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LIGHT BALL", "itemId": "ITEM_LIGHT_BALL", "price": 100, "holdEffect": "HOLD_EFFECT_LIGHT_BALL", "holdEffectParam": 0, "description_english": "An orb to be held by a PIKACHU\\nthat raises the SP. ATK stat.\\nTouching it may cause a shock.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SOFT SAND", "itemId": "ITEM_SOFT_SAND", "price": 100, "holdEffect": "HOLD_EFFECT_GROUND_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA loose, silky sand that boosts the\\npower of GROUND-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "HARD STONE", "itemId": "ITEM_HARD_STONE", "price": 100, "holdEffect": "HOLD_EFFECT_ROCK_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nAn unbreakable stone that boosts\\nthe power of ROCK-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MIRACLE SEED", "itemId": "ITEM_MIRACLE_SEED", "price": 100, "holdEffect": "HOLD_EFFECT_GRASS_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA seed imbued with life that boosts\\nthe power of GRASS-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BLACKGLASSES", "itemId": "ITEM_BLACK_GLASSES", "price": 100, "holdEffect": "HOLD_EFFECT_DARK_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA shady-looking pair of glasses\\nthat boosts DARK-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BLACK BELT", "itemId": "ITEM_BLACK_BELT", "price": 100, "holdEffect": "HOLD_EFFECT_FIGHTING_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA belt that boosts determination\\nand FIGHTING-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MAGNET", "itemId": "ITEM_MAGNET", "price": 100, "holdEffect": "HOLD_EFFECT_ELECTRIC_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA powerful magnet that boosts the\\npower of ELECTRIC-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MYSTIC WATER", "itemId": "ITEM_MYSTIC_WATER", "price": 100, "holdEffect": "HOLD_EFFECT_WATER_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA teardrop-shaped gem that boosts\\nthe power of WATER-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SHARP BEAK", "itemId": "ITEM_SHARP_BEAK", "price": 100, "holdEffect": "HOLD_EFFECT_FLYING_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA long, sharp beak that boosts the\\npower of FLYING-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "POISON BARB", "itemId": "ITEM_POISON_BARB", "price": 100, "holdEffect": "HOLD_EFFECT_POISON_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA small, poisonous barb that boosts\\nthe power of POISON-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "NEVERMELTICE", "itemId": "ITEM_NEVER_MELT_ICE", "price": 100, "holdEffect": "HOLD_EFFECT_ICE_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA piece of ice that repels heat\\nand boosts ICE-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SPELL TAG", "itemId": "ITEM_SPELL_TAG", "price": 100, "holdEffect": "HOLD_EFFECT_GHOST_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA sinister, eerie tag that boosts\\nGHOST-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "TWISTEDSPOON", "itemId": "ITEM_TWISTED_SPOON", "price": 100, "holdEffect": "HOLD_EFFECT_PSYCHIC_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA spoon imbued with telekinetic\\npower boosts PSYCHIC-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "CHARCOAL", "itemId": "ITEM_CHARCOAL", "price": 9800, "holdEffect": "HOLD_EFFECT_FIRE_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA combustible fuel that boosts the\\npower of FIRE-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "DRAGON FANG", "itemId": "ITEM_DRAGON_FANG", "price": 100, "holdEffect": "HOLD_EFFECT_DRAGON_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA hard and sharp fang that boosts\\nthe power of DRAGON-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SILK SCARF", "itemId": "ITEM_SILK_SCARF", "price": 100, "holdEffect": "HOLD_EFFECT_NORMAL_POWER", "holdEffectParam": 10, "description_english": "An item to be held by a POKéMON.\\nA sumptuous scarf that boosts the\\npower of NORMAL-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "UP-GRADE", "itemId": "ITEM_UP_GRADE", "price": 2100, "holdEffect": "HOLD_EFFECT_UP_GRADE", "holdEffectParam": 0, "description_english": "A transparent device filled with all\\nsorts of data.\\nIt is made by SILPH CO.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SHELL BELL", "itemId": "ITEM_SHELL_BELL", "price": 200, "holdEffect": "HOLD_EFFECT_SHELL_BELL", "holdEffectParam": 8, "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON regains some\\nHP upon striking the foe.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SEA INCENSE", "itemId": "ITEM_SEA_INCENSE", "price": 9600, "holdEffect": "HOLD_EFFECT_WATER_POWER", "holdEffectParam": 5, "description_english": "An item to be held by a POKéMON.\\nIt slightly boosts the power of\\nWATER-type moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LAX INCENSE", "itemId": "ITEM_LAX_INCENSE", "price": 9600, "holdEffect": "HOLD_EFFECT_EVASION_UP", "holdEffectParam": 5, "description_english": "An item to be held by a POKéMON.\\nIts tricky aroma slightly reduces\\nthe foe's accuracy.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LUCKY PUNCH", "itemId": "ITEM_LUCKY_PUNCH", "price": 10, "holdEffect": "HOLD_EFFECT_LUCKY_PUNCH", "holdEffectParam": 0, "description_english": "A glove to be held by a CHANSEY.\\nIt raises CHANSEY's critical-hit\\nratio.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "METAL POWDER", "itemId": "ITEM_METAL_POWDER", "price": 10, "holdEffect": "HOLD_EFFECT_METAL_POWDER", "holdEffectParam": 0, "description_english": "A fine, hard powder to be held by\\na DITTO.\\nIt raises DITTO's DEFENSE stat.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "THICK CLUB", "itemId": "ITEM_THICK_CLUB", "price": 500, "holdEffect": "HOLD_EFFECT_THICK_CLUB", "holdEffectParam": 0, "description_english": "A hard bone of some sort to be\\nheld by a CUBONE or MAROWAK.\\nIt raises the ATTACK stat.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "STICK", "itemId": "ITEM_STICK", "price": 200, "holdEffect": "HOLD_EFFECT_STICK", "holdEffectParam": 0, "description_english": "A stick of leek to be held by a\\nFARFETCH'D. It raises FARFETCH'D's\\ncritical-hit ratio.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RED SCARF", "itemId": "ITEM_RED_SCARF", "price": 100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nCOOL condition in CONTESTS.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BLUE SCARF", "itemId": "ITEM_BLUE_SCARF", "price": 100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nBEAUTY condition in CONTESTS.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "PINK SCARF", "itemId": "ITEM_PINK_SCARF", "price": 100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nCUTE condition in CONTESTS.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "GREEN SCARF", "itemId": "ITEM_GREEN_SCARF", "price": 100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nSMART condition in CONTESTS.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "YELLOW SCARF", "itemId": "ITEM_YELLOW_SCARF", "price": 100, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nTOUGH condition in CONTESTS.", "importance": 0, "registrability": 0, "pocket": "POCKET_HELD_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MACH BIKE", "itemId": "ITEM_MACH_BIKE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A folding bicycle that is at least\\ntwice as fast as walking.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "FieldUseFunc_Bike", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "COIN CASE", "itemId": "ITEM_COIN_CASE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A case for holding COINS obtained\\nat the GAME CORNER.\\nIt holds up to 9,999 COINS.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_CoinCase", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "ITEMFINDER", "itemId": "ITEM_ITEMFINDER", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A device used for finding items.\\nIf there is a hidden item nearby\\nwhen it is used, it emits a signal.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "ItemUseOutOfBattle_Itemfinder", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "OLD ROD", "itemId": "ITEM_OLD_ROD", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An old and beat-up fishing rod.\\nUse it by any body of water to \\nfish for wild POKéMON.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "FieldUseFunc_Rod", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": "OLD_ROD" }, { "english": "GOOD ROD", "itemId": "ITEM_GOOD_ROD", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A new, good-quality fishing rod.\\nUse it by any body of water to \\nfish for wild POKéMON.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "FieldUseFunc_Rod", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": "GOOD_ROD" }, { "english": "SUPER ROD", "itemId": "ITEM_SUPER_ROD", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An awesome, high-tech fishing rod.\\nUse it by any body of water to fish\\nfor wild POKéMON.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "FieldUseFunc_Rod", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": "SUPER_ROD" }, { "english": "S.S. TICKET", "itemId": "ITEM_SS_TICKET", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The ticket required for sailing on\\nthe ferry S.S. ANNE.\\nIt has a drawing of a ship on it.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "CONTEST PASS", "itemId": "ITEM_CONTEST_PASS", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The pass required for entering\\nPOKéMON CONTESTS. It has a\\ndrawing of an award ribbon on it.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "WAILMER PAIL", "itemId": "ITEM_WAILMER_PAIL", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A nifty watering pail.\\nUse it to promote strong growth in\\nBERRIES planted in soft soil.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "DEVON GOODS", "itemId": "ITEM_DEVON_GOODS", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A package that contains mechanical\\nparts of some sort made by the\\nDEVON CORPORATION.", "importance": 2, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SOOT SACK", "itemId": "ITEM_SOOT_SACK", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A sack used to collect volcanic\\nash automatically during walks\\nover deep ash.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_SootSack", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BASEMENT KEY", "itemId": "ITEM_BASEMENT_KEY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The key to NEW MAUVILLE, which\\nwas constructed beneath MAUVILLE\\nCITY.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "ACRO BIKE", "itemId": "ITEM_ACRO_BIKE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A folding bicycle that is capable\\nof stunts like jumps and wheelies.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "FieldUseFunc_Bike", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 1 }, { "english": "{POKEBLOCK} CASE", "itemId": "ITEM_POKEBLOCK_CASE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A case for holding {POKEBLOCK}S made\\nwith a BERRY BLENDER. It releases\\none {POKEBLOCK} when shaken.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LETTER", "itemId": "ITEM_LETTER", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An extremely important letter to\\nSTEVEN from the PRESIDENT of the\\nDEVON CORPORATION.", "importance": 2, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "EON TICKET", "itemId": "ITEM_EON_TICKET", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The ticket required for sailing on a\\nferry to a distant southern island.\\nIt features a drawing of an island.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 1 }, { "english": "RED ORB", "itemId": "ITEM_RED_ORB", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An orb that glows red.\\nIt is said to contain an incredible\\npower from ancient times.", "importance": 2, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BLUE ORB", "itemId": "ITEM_BLUE_ORB", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An orb that glows blue.\\nIt is said to contain an incredible\\npower from ancient times.", "importance": 2, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SCANNER", "itemId": "ITEM_SCANNER", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A device used to search for\\nlife-forms in water.\\nIt looks too difficult to use.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "GO-GOGGLES", "itemId": "ITEM_GO_GOGGLES", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A pair of protective goggles.\\nThey enable a TRAINER to travel\\nthrough even desert sandstorms.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "METEORITE", "itemId": "ITEM_METEORITE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A meteorite that fell from space\\nonto MT. MOON long ago.\\nIt is very lumpy and hard.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RM. 1 KEY", "itemId": "ITEM_ROOM_1_KEY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A key that opens the door to Room\\n1 inside the ABANDONED SHIP.\\nIt is old and looks easily broken.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RM. 2 KEY", "itemId": "ITEM_ROOM_2_KEY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A key that opens the door to Room\\n2 inside the ABANDONED SHIP.\\nIt is old and looks easily broken.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RM. 4 KEY", "itemId": "ITEM_ROOM_4_KEY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A key that opens the door to Room\\n4 inside the ABANDONED SHIP.\\nIt is old and looks easily broken.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RM. 6 KEY", "itemId": "ITEM_ROOM_6_KEY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A key that opens the door to Room\\n6 inside the ABANDONED SHIP.\\nIt is old and looks easily broken.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "STORAGE KEY", "itemId": "ITEM_STORAGE_KEY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A key that opens the storage hold\\ninside the ABANDONED SHIP.\\nIt is old and looks easily broken.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "ROOT FOSSIL", "itemId": "ITEM_ROOT_FOSSIL", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A fossil of an ancient, seafloor-\\ndwelling POKéMON. It appears to be\\npart of a plant root.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "CLAW FOSSIL", "itemId": "ITEM_CLAW_FOSSIL", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A fossil of an ancient, seafloor-\\ndwelling POKéMON. It appears to be\\npart of a claw.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "DEVON SCOPE", "itemId": "ITEM_DEVON_SCOPE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A scope that signals the presence\\nof any unseeable POKéMON.\\nIt is made by the DEVON CORP.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "TM01", "itemId": "ITEM_TM01", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An extremely powerful attack.\\nHowever, if the user is hit before\\nusing the move, they will flinch.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "FocusPunch" }, { "english": "TM02", "itemId": "ITEM_TM02", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Sharp, huge claws hook and slash\\nthe foe quickly and with great\\npower.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "DragonClaw" }, { "english": "TM03", "itemId": "ITEM_TM03", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The foe is hit with a pulsing blast\\nof water. It may also confuse the\\ntarget.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "WaterPulse" }, { "english": "TM04", "itemId": "ITEM_TM04", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The user calms its spirit and\\nfocuses its mind to raise its\\nSP. ATK and SP. DEF stats.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "CalmMind" }, { "english": "TM05", "itemId": "ITEM_TM05", "price": 10000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A savage roar that causes the foe\\nto switch out of battle. In the\\nwild, ROAR ends the battle.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Roar" }, { "english": "TM06", "itemId": "ITEM_TM06", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A move that leaves the foe badly\\npoisoned. Its poison damage worsens\\nevery turn.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Toxic" }, { "english": "TM07", "itemId": "ITEM_TM07", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Summons a hailstorm that lasts for\\nfive turns. The hailstorm damages\\nall types except the ICE type.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Hail" }, { "english": "TM08", "itemId": "ITEM_TM08", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The user tightens all its muscles\\nand bulks up, boosting both its\\nATTACK and DEFENSE stats.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "BulkUp" }, { "english": "TM09", "itemId": "ITEM_TM09", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The user shoots seeds at the foe\\nin rapid succession. Two to five\\nseeds are shot at once.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "BulletSeed" }, { "english": "TM10", "itemId": "ITEM_TM10", "price": 10000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A variable move that changes type\\nand power depending on the POKéMON\\nusing it.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "HiddenPower" }, { "english": "TM11", "itemId": "ITEM_TM11", "price": 2000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The weather is turned sunny for\\nfive turns. Over that time, FIRE-\\ntype moves are powered up.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "SunnyDay" }, { "english": "TM12", "itemId": "ITEM_TM12", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A taunted foe may become enraged.\\nIt will then only be able to use\\nattack moves.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Taunt" }, { "english": "TM13", "itemId": "ITEM_TM13", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An icy-cold beam is shot at the\\nfoe. It may leave the target\\nfrozen.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "IceBeam" }, { "english": "TM14", "itemId": "ITEM_TM14", "price": 5500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A vicious snow-and-wind attack that\\nstrikes all foes in battle. It may\\ncause freezing.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Blizzard" }, { "english": "TM15", "itemId": "ITEM_TM15", "price": 50000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A harsh attack that inflicts severe\\ndamage on the foe. However, the\\nuser must rest the next turn.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "HyperBeam" }, { "english": "TM16", "itemId": "ITEM_TM16", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A wall of light is created over\\nfive turns. It reduces damage from\\nSP. ATK attacks.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "LightScreen" }, { "english": "TM17", "itemId": "ITEM_TM17", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The user is completely protected\\nfrom attack in the turn it is used.\\nIt may fail if used in succession.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Protect" }, { "english": "TM18", "itemId": "ITEM_TM18", "price": 2000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A heavy rain is summoned for five\\nturns. Over that time, WATER-type\\nmoves are powered up.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "RainDance" }, { "english": "TM19", "itemId": "ITEM_TM19", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The user strikes the foe with\\ntentacles or roots, stealing the\\ntarget's HP and healing itself.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "GigaDrain" }, { "english": "TM20", "itemId": "ITEM_TM20", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Protects the party with a shield\\nagainst all status problems over\\nfive turns.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Safeguard" }, { "english": "TM21", "itemId": "ITEM_TM21", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "This attack move grows more\\npowerful the more the POKéMON\\ndislikes its TRAINER.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Frustration" }, { "english": "TM22", "itemId": "ITEM_TM22", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A 2-turn attack that uses the first\\nturn for absorbing sunlight, then\\nblasting the foe in the next turn.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "SolarBeam" }, { "english": "TM23", "itemId": "ITEM_TM23", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The foe is slammed with a sturdy\\ntail of steel. It may lower the\\ntarget's DEFENSE stat.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "IronTail" }, { "english": "TM24", "itemId": "ITEM_TM24", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A massive jolt of electricity is\\nlaunched at the foe. It may cause\\nparalysis.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Thunderbolt" }, { "english": "TM25", "itemId": "ITEM_TM25", "price": 5500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Strikes the foe with a huge\\nthunderbolt. It may cause\\nparalysis.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Thunder" }, { "english": "TM26", "itemId": "ITEM_TM26", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Causes an earthquake that strikes\\nall POKéMON in battle, excluding\\nthe user.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Earthquake" }, { "english": "TM27", "itemId": "ITEM_TM27", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "This attack move grows more\\npowerful the more the POKéMON\\nlikes its TRAINER.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Return" }, { "english": "TM28", "itemId": "ITEM_TM28", "price": 10000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A 2-turn attack in which the user\\ndigs underground, then strikes.\\nIt can be used to exit dungeons.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Dig" }, { "english": "TM29", "itemId": "ITEM_TM29", "price": 2000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A powerful blast of telekinetic\\nenergy strikes the foe. It may\\nlower the target's SP. DEF stat.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Psychic" }, { "english": "TM30", "itemId": "ITEM_TM30", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The foe is attacked with a shadowy\\nlump. It may lower the target's\\nSP. DEF stat.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "ShadowBall" }, { "english": "TM31", "itemId": "ITEM_TM31", "price": 10000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Strikes the foe with a rock-hard\\nfist, etc. It shatters barriers such\\nas REFLECT and LIGHT SCREEN.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "BrickBreak" }, { "english": "TM32", "itemId": "ITEM_TM32", "price": 2000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The user begins moving so quickly\\nthat it creates illusory copies to\\nraise its evasiveness.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "DoubleTeam" }, { "english": "TM33", "itemId": "ITEM_TM33", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A tough barrier is put up over five\\nturns. It reduces damage from\\nphysical attacks over that time.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Reflect" }, { "english": "TM34", "itemId": "ITEM_TM34", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A rapid jolt of electricity strikes\\nthe foe. This attack is impossible\\nto evade.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "ShockWave" }, { "english": "TM35", "itemId": "ITEM_TM35", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The foe is roasted with a heavy\\nblast of fire. It may leave the\\ntarget with a burn.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Flamethrower" }, { "english": "TM36", "itemId": "ITEM_TM36", "price": 1000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Toxic sludge is hurled at the foe\\nwith great force. It may also\\npoison the target.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "SludgeBomb" }, { "english": "TM37", "itemId": "ITEM_TM37", "price": 2000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Summons a sandstorm that lasts for\\nfive turns. It damages all types\\nexcept ROCK, GROUND, and STEEL.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Sandstorm" }, { "english": "TM38", "itemId": "ITEM_TM38", "price": 5500, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The foe is incinerated with an\\nintense flame. It may leave the\\ntarget with a burn.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "FireBlast" }, { "english": "TM39", "itemId": "ITEM_TM39", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Boulders are hurled at the foe.\\nIt also lowers the target's SPEED\\nstat if it hits.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "RockTomb" }, { "english": "TM40", "itemId": "ITEM_TM40", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An extremely fast attack against\\none target. It is impossible to\\nevade.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "AerialAce" }, { "english": "TM41", "itemId": "ITEM_TM41", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "If enraged by this move, the target\\nbecomes incapable of using the same\\nmove twice in a row.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Torment" }, { "english": "TM42", "itemId": "ITEM_TM42", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An attack move that becomes very\\npowerful if the user is poisoned,\\nburned, or paralyzed.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Facade" }, { "english": "TM43", "itemId": "ITEM_TM43", "price": 10000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An attack move that may have an\\nadditional effect depending on the\\nbattle terrain.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "SecretPower" }, { "english": "TM44", "itemId": "ITEM_TM44", "price": 10000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A move that makes the user fall\\nasleep over two turns to restore HP\\nand heal any status problems.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Rest" }, { "english": "TM45", "itemId": "ITEM_TM45", "price": 10000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The foe, if it is the opposite\\ngender as the user, becomes\\ninfatuated and may not attack.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Attract" }, { "english": "TM46", "itemId": "ITEM_TM46", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An attack that gives the user an\\nopportunity to steal the foe's hold\\nitem.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Thief" }, { "english": "TM47", "itemId": "ITEM_TM47", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The foe is struck with steel-hard\\nwings. It may also raise the user's\\nDEFENSE stat.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "SteelWing" }, { "english": "TM48", "itemId": "ITEM_TM48", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A special power is transmitted to\\nthe foe, causing it to switch\\nabilities with the user.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "SkillSwap" }, { "english": "TM49", "itemId": "ITEM_TM49", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A move that steals the effects of\\nany status-changing or healing move\\nthat the foe tries to use.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Snatch" }, { "english": "TM50", "itemId": "ITEM_TM50", "price": 3000, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A maximum-power attack of great\\nferocity, but one that also sharply\\nreduces the user's SP. ATK stat.", "importance": 0, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Overheat" }, { "english": "HM01", "itemId": "ITEM_HM01", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Attacks the foe with sharp blades\\nor claws. It can also cut down thin\\ntrees and grass outside of battle.", "importance": 1, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Cut" }, { "english": "HM02", "itemId": "ITEM_HM02", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The user flies up on the first turn,\\nthen attacks next turn. It can be\\nused to fly to any known town.", "importance": 1, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Fly" }, { "english": "HM03", "itemId": "ITEM_HM03", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Creates a huge wave, then crashes\\nit down on the foe. It can be used\\nfor traveling on water.", "importance": 1, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Surf" }, { "english": "HM04", "itemId": "ITEM_HM04", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The user builds enormous power,\\nthen slams the foe. It can be used\\nfor moving large, round boulders.", "importance": 1, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Strength" }, { "english": "HM05", "itemId": "ITEM_HM05", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Looses a powerful blast of light\\nthat reduces the foe's accuracy.\\nIt also lights up dark caves.", "importance": 1, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Flash" }, { "english": "HM06", "itemId": "ITEM_HM06", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Hits the foe with a rock-crushingly\\ntough attack. It can smash cracked\\nboulders.", "importance": 1, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "RockSmash" }, { "english": "HM07", "itemId": "ITEM_HM07", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A powerful charge attack. It can\\nbe used for climbing a torrential\\nwaterfall.", "importance": 1, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Waterfall" }, { "english": "HM08", "itemId": "ITEM_HM08", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A 2-turn attack in which the user\\ndives underwater on the first turn,\\nthen strikes in the next turn.", "importance": 1, "registrability": 0, "pocket": "POCKET_TM_CASE", "type": "ITEM_TYPE_PARTY_MENU", "fieldUseFunc": "NULL", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0, "moveId": "Dive" }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "????????", "itemId": "ITEM_NONE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "?????", "importance": 0, "registrability": 0, "pocket": "POCKET_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "OAK'S PARCEL", "itemId": "ITEM_OAKS_PARCEL", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A parcel to be delivered to PROF.\\nOAK from VIRIDIAN CITY's POKéMON\\nMART.", "importance": 2, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "POK\u00e9 FLUTE", "itemId": "ITEM_POKE_FLUTE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A flute that is said to instantly\\nawaken any POKéMON. It has a\\nlovely tone.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_PokeFlute", "battleUsage": 2, "battleUseFunc": "BattleUseFunc_PokeFlute", "secondaryId": 0 }, { "english": "SECRET KEY", "itemId": "ITEM_SECRET_KEY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "The key to CINNABAR ISLAND GYM's\\nfront door. It is colored red and\\ndecorated.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BIKE VOUCHER", "itemId": "ITEM_BIKE_VOUCHER", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "Take this voucher to the BIKE SHOP\\nin CERULEAN CITY and exchange it\\nfor a bicycle.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "GOLD TEETH", "itemId": "ITEM_GOLD_TEETH", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A set of false teeth lost by the\\nSAFARI ZONE'S WARDEN. It makes his\\nsmile sparkle.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "OLD AMBER", "itemId": "ITEM_OLD_AMBER", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A piece of amber that contains\\nthe genes of an ancient POKéMON.\\nIt is clear with a reddish tint.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "CARD KEY", "itemId": "ITEM_CARD_KEY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A card-type key that unlocks doors\\nin SILPH CO.'s HEAD OFFICE in\\nSAFFRON CITY.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "LIFT KEY", "itemId": "ITEM_LIFT_KEY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A key that operates the elevator\\nin TEAM ROCKET's HIDEOUT.\\nIt bears the TEAM ROCKET logo.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "HELIX FOSSIL", "itemId": "ITEM_HELIX_FOSSIL", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A fossil of an ancient, seafloor-\\ndwelling POKéMON. It appears to be\\npart of a seashell.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "DOME FOSSIL", "itemId": "ITEM_DOME_FOSSIL", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A fossil of an ancient, seafloor-\\ndwelling POKéMON. It appears to be\\npart of a shell.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SILPH SCOPE", "itemId": "ITEM_SILPH_SCOPE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A scope that makes unseeable\\nPOKéMON visible.\\nIt is made by SILPH CO.", "importance": 1, "registrability": 0, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BICYCLE", "itemId": "ITEM_BICYCLE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A folding bicycle that allows\\nfaster movement than the RUNNING\\nSHOES.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "FieldUseFunc_Bike", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "TOWN MAP", "itemId": "ITEM_TOWN_MAP", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A very convenient map that can be\\nviewed anytime. It even shows your \\npresent location.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_TownMap", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "VS SEEKER", "itemId": "ITEM_VS_SEEKER", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A device that indicates TRAINERS\\nwho want to battle. The battery\\ncharges while traveling.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "FieldUseFunc_VsSeeker", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "FAME CHECKER", "itemId": "ITEM_FAME_CHECKER", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A device that enables you to\\nrecall what you've heard and seen\\nabout famous people.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_FameChecker", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "TM CASE", "itemId": "ITEM_TM_CASE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A case that holds TMs and HMs.\\nIt is attached to the BAG's\\ncompartment for important items.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_TmCase", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "BERRY POUCH", "itemId": "ITEM_BERRY_POUCH", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A pouch for carrying BERRIES.\\nIt is attached to the BAG's\\ncompartment for important items.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_BerryPouch", "battleUsage": 3, "battleUseFunc": "BattleUseFunc_BerryPouch", "secondaryId": 0 }, { "english": "TEACHY TV", "itemId": "ITEM_TEACHY_TV", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A television set that is tuned to\\na program with useful tips for\\nnovice TRAINERS.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_FIELD", "fieldUseFunc": "FieldUseFunc_TeachyTv", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "TRI-PASS", "itemId": "ITEM_TRI_PASS", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A pass for ferries between ONE,\\nTWO, and THREE ISLAND.\\nIt has a drawing of three islands.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RAINBOW PASS", "itemId": "ITEM_RAINBOW_PASS", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A pass for ferries between\\nVERMILION and the SEVII ISLANDS.\\nIt features a drawing of a rainbow.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "TEA", "itemId": "ITEM_TEA", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An aromatic tea prepared by an old\\nlady. It will slake even the worst\\nthirst.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MYSTICTICKET", "itemId": "ITEM_MYSTIC_TICKET", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A ticket required to board the ship\\nto NAVEL ROCK.\\nIt glows with a mystic light.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "AURORATICKET", "itemId": "ITEM_AURORA_TICKET", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A ticket required to board the ship\\nto BIRTH ISLAND.\\nIt glows beautifully.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "POWDER JAR", "itemId": "ITEM_POWDER_JAR", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A jar for storing BERRY POWDER\\nmade using a BERRY CRUSHER.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_PowderJar", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "RUBY", "itemId": "ITEM_RUBY", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An exquisitely beautiful gem that\\nhas a red glow.\\nIt symbolizes passion.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "SAPPHIRE", "itemId": "ITEM_SAPPHIRE", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "An exquisitely beautiful gem that\\nhas a blue glow.\\nIt symbolizes honesty.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": "ITEM_TYPE_BAG_MENU", "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "MAGMA EMBLEM", "itemId": "ITEM_MAGMA_EMBLEM", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A medal-like item in the same shape\\nas TEAM MAGMA's mark.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": 4, "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 }, { "english": "OLD SEA MAP", "itemId": "ITEM_OLD_SEA_MAP", "price": 0, "holdEffect": "HOLD_EFFECT_NONE", "holdEffectParam": 0, "description_english": "A faded sea chart that shows the\\nway to a certain island.\\nIt is yellow with age.", "importance": 1, "registrability": 1, "pocket": "POCKET_KEY_ITEMS", "type": 4, "fieldUseFunc": "FieldUseFunc_OakStopsYou", "battleUsage": 0, "battleUseFunc": "NULL", "secondaryId": 0 } ] } ================================================ FILE: src/data/items.json.txt ================================================ {{ doNotModifyHeader }} ## for item in items ## if item.pocket == "POCKET_TM_CASE" extern const u8 gMoveDescription_{{ item.moveId }}[]; ## endif {% if item.itemId != "ITEM_NONE" %}const u8 gItemDescription_{{ item.itemId }}[] = _("{{ item.description_english }}");{% endif %} ## endfor const u8 gItemDescription_ITEM_NONE[] = _("?????"); const struct Item gItems[] = { {% for item in items %}{ .name = _("{{ item.english }}"), .itemId = {{ item.itemId }}, .price = {{ item.price }}, .holdEffect = {{ item.holdEffect }}, .holdEffectParam = {{ item.holdEffectParam }}, ## if item.pocket == "POCKET_TM_CASE" .description = gMoveDescription_{{ item.moveId }}, ## else .description = gItemDescription_{{ item.itemId }}, ## endif .importance = {{ item.importance }}, .registrability = {{ item.registrability }}, .pocket = {{ item.pocket }}, .type = {{ item.type }}, .fieldUseFunc = {{ item.fieldUseFunc }}, .battleUsage = {{ item.battleUsage }}, .battleUseFunc = {{ item.battleUseFunc }}, .secondaryId = {{ item.secondaryId }} }, {% endfor %} }; ================================================ FILE: src/data/master_trainer_parties.h ================================================ static const struct TrainerMonItemCustomMovesEVs sParty_MasterBulbasaur[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_BULBASAUR, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_LIGHT_SCREEN, MOVE_ATTRACT, MOVE_BODY_SLAM, MOVE_SWORDS_DANCE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterIvysaur[] = { { .iv = 3, //flying .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_CAREFUL, .species = SPECIES_IVYSAUR, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_LIGHT_SCREEN, MOVE_HIDDEN_POWER, MOVE_REST, MOVE_CURSE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterVenusaur[] = { { .iv = 9, //fire .lvl = 60, .evs = { 152, 0, 100, 0, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_VENUSAUR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_SYNTHESIS, MOVE_LIGHT_SCREEN}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterCharmander[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 152, 0, 0, 100}, .nature = NATURE_ADAMANT, .species = SPECIES_CHARMANDER, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_DIG, MOVE_SMOKESCREEN, MOVE_AERIAL_ACE, MOVE_FACADE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterCharmeleon[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 152, 0, 0, 100}, .nature = NATURE_ADAMANT, .species = SPECIES_CHARMELEON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ANCIENT_POWER, MOVE_MUD_SLAP, MOVE_MEGA_KICK, MOVE_DRAGON_DANCE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterCharizard[] = { { .iv = 255, .lvl = 60, .evs = { 104, 0, 252, 100, 0, 54}, .nature = NATURE_CAREFUL, .species = SPECIES_CHARIZARD, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_BELLY_DRUM, MOVE_ROCK_SLIDE, MOVE_REST, MOVE_HYPER_BEAM}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSquirtle[] = { { .iv = 255, .lvl = 60, .evs = { 252, 0, 4, 0, 0, 252}, .nature = NATURE_IMPISH, .species = SPECIES_SQUIRTLE, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_YAWN, MOVE_SUBSTITUTE, MOVE_BODY_SLAM, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterWartortle[] = { { .iv = 255, .lvl = 60, .evs = { 252, 0, 4, 0, 0, 252}, .nature = NATURE_IMPISH, .species = SPECIES_WARTORTLE, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_REST, MOVE_SUBSTITUTE, MOVE_RETURN, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterBlastoise[] = { { .iv = 255, .lvl = 60, .evs = { 252, 252, 0, 0, 0, 4}, .nature = NATURE_CAREFUL, .species = SPECIES_BLASTOISE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ATTRACT, MOVE_EARTHQUAKE, MOVE_ROLLOUT, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterCaterpie[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_CATERPIE, .heldItem = ITEM_SILK_SCARF, .abilityNum = 0, .moves = {MOVE_TACKLE, MOVE_STRING_SHOT, MOVE_NONE, MOVE_NONE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMetapod[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_METAPOD, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_TACKLE, MOVE_STRING_SHOT, MOVE_HARDEN, MOVE_NONE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterButterfree[] = { { .iv = 6, //rock .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_BUTTERFREE, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_AERIAL_ACE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterWeedle[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_WEEDLE, .heldItem = ITEM_POISON_BARB, .abilityNum = 0, .moves = {MOVE_POISON_STING, MOVE_STRING_SHOT, MOVE_NONE, MOVE_NONE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterKakuna[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_KAKUNA, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_POISON_STING, MOVE_STRING_SHOT, MOVE_HARDEN, MOVE_NONE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterBeedrill[] = { { .iv = 6, //rock .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_BEEDRILL, .heldItem = ITEM_SCOPE_LENS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_SWORDS_DANCE, MOVE_FOCUS_ENERGY, MOVE_AERIAL_ACE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPidgey[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_PIDGEY, .heldItem = ITEM_METAL_COAT, .abilityNum = 0, .moves = {MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_FLY, MOVE_DOUBLE_TEAM}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPidgeotto[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_PIDGEOTTO, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_SWIFT, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPidgeot[] = { { .iv = 6, //rock .lvl = 60, .evs = { 4, 252, 248, 4, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_PIDGEOT, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_DOUBLE_TEAM, MOVE_AERIAL_ACE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterRattata[] = { { .iv = 255, .lvl = 60, .evs = { 4, 152, 252, 0, 0, 100}, .nature = NATURE_ADAMANT, .species = SPECIES_RATTATA, .heldItem = ITEM_SCOPE_LENS, .abilityNum = 1, .moves = {MOVE_FOCUS_ENERGY, MOVE_HYPER_FANG, MOVE_SCREECH, MOVE_THUNDER_WAVE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterRaticate[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 248, 4, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_RATICATE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SUPER_FANG, MOVE_RETURN, MOVE_FOCUS_ENERGY, MOVE_ATTRACT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSpearow[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 248, 4, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_SPEAROW, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_DRILL_PECK, MOVE_TRI_ATTACK, MOVE_PROTECT, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterFearow[] = { { .iv = 255, .lvl = 60, .evs = { 0, 252, 100, 156, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_FEAROW, .heldItem = ITEM_KINGS_ROCK, .abilityNum = 0, .moves = {MOVE_SKY_ATTACK, MOVE_SUBSTITUTE, MOVE_AGILITY, MOVE_DRILL_PECK}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterEkans[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_EKANS, .heldItem = ITEM_SOFT_SAND, .abilityNum = 0, .moves = {MOVE_DIG, MOVE_TORMENT, MOVE_SCREECH, MOVE_GLARE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterArbok[] = { { .iv = 255, .lvl = 60, .evs = { 0, 252, 252, 4, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_ARBOK, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_EARTHQUAKE, MOVE_PROTECT, MOVE_SCREECH, MOVE_GLARE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPikachu[] = { { .iv = 8, //ice .lvl = 60, .evs = { 4, 0, 100, 0, 252, 152}, .nature = NATURE_MODEST, .species = SPECIES_PIKACHU, .heldItem = ITEM_LIGHT_BALL, .abilityNum = 0, .moves = {MOVE_WISH, MOVE_PROTECT, MOVE_VOLT_TACKLE, MOVE_HIDDEN_POWER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterRaichu[] = { { .iv = 2, //ground .lvl = 60, .evs = { 4, 252, 100, 0, 0, 152}, .nature = NATURE_HASTY, .species = SPECIES_RAICHU, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_TOXIC, MOVE_LIGHT_SCREEN, MOVE_RETURN}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSandshrew[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_SANDSHREW, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_PROTECT, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSandslash[] = { { .iv = 255, .lvl = 60, .evs = { 0, 252, 252, 4, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_SANDSLASH, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_EARTHQUAKE, MOVE_CRUSH_CLAW, MOVE_PROTECT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterNidoranF[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_NIDORAN_F, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_DIG, MOVE_MUD_SLAP, MOVE_FLATTER, MOVE_CHARM}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterNidorina[] = { { .iv = 2, //ground .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_NIDORINA, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_MUD_SLAP, MOVE_FLATTER, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterNidoqueen[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 252, 0, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_NIDOQUEEN, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SURF, MOVE_DISABLE, MOVE_FOCUS_ENERGY, MOVE_PROTECT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterNidoranM[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_NIDORAN_M, .heldItem = ITEM_SCOPE_LENS, .abilityNum = 0, .moves = {MOVE_DIG, MOVE_DOUBLE_KICK, MOVE_FOCUS_ENERGY, MOVE_CHARM}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterNidorino[] = { { .iv = 2, //ground .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_NIDORINO, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_FLATTER, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterNidoking[] = { { .iv = 255, .lvl = 60, .evs = { 252, 0, 252, 0, 4, 0}, .nature = NATURE_BOLD, .species = SPECIES_NIDOKING, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_AMNESIA, MOVE_HORN_DRILL, MOVE_PROTECT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterClefairy[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 252, 0, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_CLEFAIRY, .heldItem = ITEM_MAGNET, .abilityNum = 0, .moves = {MOVE_RAIN_DANCE, MOVE_THUNDER, MOVE_SWEET_KISS, MOVE_COSMIC_POWER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterClefable[] = { { .iv = 255, .lvl = 60, .evs = { 252, 4, 252, 0, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_CLEFABLE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_COSMIC_POWER, MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_SOFT_BOILED}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterVulpix[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_VULPIX, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_CONFUSE_RAY, MOVE_HYPNOSIS, MOVE_DIG, MOVE_RETURN}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterNinetales[] = { { .iv = 11, //water .lvl = 60, .evs = { 252, 0, 0, 100, 252, 152}, .nature = NATURE_MODEST, .species = SPECIES_NINETALES, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CONFUSE_RAY, MOVE_HIDDEN_POWER, MOVE_DISABLE, MOVE_IMPRISON}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterJigglypuff[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 252, 0, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_JIGGLYPUFF, .heldItem = ITEM_CHARCOAL, .abilityNum = 0, .moves = {MOVE_FAKE_TEARS, MOVE_SUNNY_DAY, MOVE_FLAMETHROWER, MOVE_SING}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterWigglytuff[] = { { .iv = 255, .lvl = 60, .evs = { 252, 4, 252, 0, 0, 0}, .nature = NATURE_CAREFUL, .species = SPECIES_WIGGLYTUFF, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_LIGHT_SCREEN, MOVE_TICKLE, MOVE_BRICK_BREAK, MOVE_WISH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterZubat[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_ZUBAT, .heldItem = ITEM_SPELL_TAG, .abilityNum = 0, .moves = {MOVE_SHADOW_BALL, MOVE_AERIAL_ACE, MOVE_TORMENT, MOVE_CONFUSE_RAY}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGolbat[] = { { .iv = 6, //rock .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_CAREFUL, .species = SPECIES_GOLBAT, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SCREECH, MOVE_HIDDEN_POWER, MOVE_CONFUSE_RAY, MOVE_AERIAL_ACE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterOddish[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_ODDISH, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_ENDURE, MOVE_FLAIL, MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGloom[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_GLOOM, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_CHARM, MOVE_SLUDGE_BOMB, MOVE_SWORDS_DANCE, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterVileplume[] = { { .iv = 9, //fire .lvl = 60, .evs = { 252, 0, 0, 0, 4, 252}, .nature = NATURE_BOLD, .species = SPECIES_VILEPLUME, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_INGRAIN, MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_SYNTHESIS}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterParas[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_PARAS, .heldItem = ITEM_SHARP_BEAK, .abilityNum = 0, .moves = {MOVE_SPORE, MOVE_AERIAL_ACE, MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterParasect[] = { { .iv = 3, //flying .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_PARASECT, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SPORE, MOVE_HIDDEN_POWER, MOVE_SWORDS_DANCE, MOVE_SUBSTITUTE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterVenonat[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_VENONAT, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_DISABLE, MOVE_THIEF, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterVenomoth[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_VENOMOTH, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_SWAGGER, MOVE_SCREECH, MOVE_DISABLE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterDiglett[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_DIGLETT, .heldItem = ITEM_BRIGHT_POWDER, .abilityNum = 0, .moves = {MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_SUBSTITUTE, MOVE_MUD_SLAP}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterDugtrio[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_DUGTRIO, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_EARTHQUAKE, MOVE_TRI_ATTACK, MOVE_AERIAL_ACE, MOVE_HYPER_BEAM}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMeowth[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_MEOWTH, .heldItem = ITEM_SILK_SCARF, .abilityNum = 0, .moves = {MOVE_FAKE_OUT, MOVE_CHARM, MOVE_RETURN, MOVE_SCREECH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPersian[] = { { .iv = 4, //fighting .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_PERSIAN, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_FAKE_OUT, MOVE_SUBSTITUTE, MOVE_HIDDEN_POWER, MOVE_THIEF}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPsyduck[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_PSYDUCK, .heldItem = ITEM_TWISTED_SPOON, .abilityNum = 0, .moves = {MOVE_HYPNOSIS, MOVE_LIGHT_SCREEN, MOVE_CALM_MIND, MOVE_PSYCHIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGolduck[] = { { .iv = 10, //electric .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_GOLDUCK, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HYPNOSIS, MOVE_SUBSTITUTE, MOVE_TOXIC, MOVE_HIDDEN_POWER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMankey[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_BRAVE, .species = SPECIES_MANKEY, .heldItem = ITEM_SCOPE_LENS, .abilityNum = 0, .moves = {MOVE_FOCUS_ENERGY, MOVE_TAUNT, MOVE_REVENGE, MOVE_SCREECH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPrimeape[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_BRAVE, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_FOCUS_ENERGY, MOVE_CROSS_CHOP, MOVE_BULK_UP, MOVE_REVENGE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGrowlithe[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_GROWLITHE, .heldItem = ITEM_SOFT_SAND, .abilityNum = 0, .moves = {MOVE_HOWL, MOVE_DIG, MOVE_BODY_SLAM, MOVE_CHARM}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterArcanine[] = { { .iv = 6, //rock .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_ARCANINE, .heldItem = ITEM_WHITE_HERB, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_HYPER_BEAM, MOVE_HIDDEN_POWER, MOVE_BODY_SLAM}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPoliwag[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 252, 0, 0, 252}, .nature = NATURE_BOLD, .species = SPECIES_POLIWAG, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_DEFENSE_CURL, MOVE_ICE_BALL, MOVE_PSYCHIC, MOVE_DOUBLE_TEAM}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPoliwhirl[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_POLIWHIRL, .heldItem = ITEM_SOFT_SAND, .abilityNum = 0, .moves = {MOVE_HYPNOSIS, MOVE_COUNTER, MOVE_BODY_SLAM, MOVE_EARTHQUAKE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPoliwrath[] = { { .iv = 3, //flying .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_POLIWRATH, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_BELLY_DRUM, MOVE_HIDDEN_POWER, MOVE_HYPNOSIS}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterAbra[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_ABRA, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_LIGHT_SCREEN, MOVE_THIEF, MOVE_CALM_MIND, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterKadabra[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_KADABRA, .heldItem = ITEM_PETAYA_BERRY, .abilityNum = 0, .moves = {MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_THIEF, MOVE_TORMENT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterAlakazam[] = { { .iv = 255, //dark .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_CALM_MIND, MOVE_RECOVER, MOVE_THUNDER_WAVE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMachop[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_BRAVE, .species = SPECIES_MACHOP, .heldItem = ITEM_MACHO_BRACE, .abilityNum = 0, .moves = {MOVE_FOCUS_ENERGY, MOVE_REVENGE, MOVE_COUNTER, MOVE_ENCORE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMachoke[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_BRAVE, .species = SPECIES_MACHOKE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_FOCUS_ENERGY, MOVE_CROSS_CHOP, MOVE_BULK_UP, MOVE_ENCORE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMachamp[] = { { .iv = 3, //flying .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_MACHAMP, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_REST, MOVE_SLEEP_TALK, MOVE_CROSS_CHOP, MOVE_HIDDEN_POWER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterBellsprout[] = { { .iv = 255, .lvl = 60, .evs = { 252, 4, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_BELLSPROUT, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_REFLECT, MOVE_SLEEP_POWDER, MOVE_SWORDS_DANCE, MOVE_DOUBLE_EDGE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterWeepinbell[] = { { .iv = 3, //flying .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_WEEPINBELL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SYNTHESIS, MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_ENCORE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterVictreebel[] = { { .iv = 255, .lvl = 60, .evs = { 252, 252, 0, 4, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_VICTREEBEL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_INGRAIN, MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_DOUBLE_EDGE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterTentacool[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_TENTACOOL, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_RETURN, MOVE_CONFUSE_RAY, MOVE_THIEF}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterTentacruel[] = { { .iv = 2, //ground .lvl = 60, .evs = { 252, 252, 4, 0, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_TENTACRUEL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_SUBSTITUTE, MOVE_HIDDEN_POWER, MOVE_BARRIER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGeodude[] = { { .iv = 255, .lvl = 60, .evs = { 252, 4, 252, 0, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_GEODUDE, .heldItem = ITEM_LUM_BERRY, .abilityNum = 1, .moves = {MOVE_TOXIC, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_PROTECT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGraveler[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_GRAVELER, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 1, .moves = {MOVE_SWAGGER, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGolem[] = { { .iv = 7, //grass .lvl = 60, .evs = { 4, 0, 252, 252, 0, 0}, .nature = NATURE_TIMID, .species = SPECIES_GOLEM, .heldItem = ITEM_PETAYA_BERRY, .abilityNum = 1, .moves = {MOVE_HIDDEN_POWER, MOVE_REST, MOVE_SLEEP_TALK, MOVE_SUBSTITUTE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPonyta[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_PONYTA, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_CHARM, MOVE_BODY_SLAM, MOVE_AGILITY, MOVE_PROTECT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterRapidash[] = { { .iv = 2, //ground .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_RAPIDASH, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 1, .moves = {MOVE_HYPNOSIS, MOVE_HIDDEN_POWER, MOVE_CHARM, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSlowpoke[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_SLOWPOKE, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 1, .moves = {MOVE_BELLY_DRUM, MOVE_REST, MOVE_BODY_SLAM, MOVE_AMNESIA}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSlowbro[] = { { .iv = 5, //bug .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_SLOWBRO, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_CURSE, MOVE_HIDDEN_POWER, MOVE_THUNDER_WAVE, MOVE_AMNESIA}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMagnemite[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_MAGNEMITE, .heldItem = ITEM_MAGNET, .abilityNum = 1, .moves = {MOVE_METAL_SOUND, MOVE_RAIN_DANCE, MOVE_THUNDER, MOVE_SWAGGER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMagneton[] = { { .iv = 9, //fire .lvl = 60, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_MAGNETON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_METAL_SOUND, MOVE_HIDDEN_POWER, MOVE_THUNDER_WAVE, MOVE_SUBSTITUTE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterFarfetchd[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_FARFETCHD, .heldItem = ITEM_STICK, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_SLASH, MOVE_KNOCK_OFF, MOVE_FEATHER_DANCE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterDoduo[] = { { .iv = 255, .lvl = 60, .evs = { 252, 252, 4, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_DODUO, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 1, .moves = {MOVE_ENDURE, MOVE_ENDEAVOR, MOVE_QUICK_ATTACK, MOVE_SUBSTITUTE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterDodrio[] = { { .iv = 6, //rock .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_DODRIO, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_REST, MOVE_HIDDEN_POWER, MOVE_TORMENT, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSeel[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_SEEL, .heldItem = ITEM_KINGS_ROCK, .abilityNum = 0, .moves = {MOVE_PERISH_SONG, MOVE_FAKE_OUT, MOVE_HEADBUTT, MOVE_ICICLE_SPEAR}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterDewgong[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_DEWGONG, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_BODY_SLAM, MOVE_FAKE_OUT, MOVE_SHEER_COLD, MOVE_ENCORE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGrimer[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_GRIMER, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_ACID_ARMOR, MOVE_BODY_SLAM, MOVE_SCREECH, MOVE_MINIMIZE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMuk[] = { { .iv = 2, //ground .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_MUK, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CURSE, MOVE_SHADOW_PUNCH, MOVE_HIDDEN_POWER, MOVE_DISABLE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterShellder[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 0, 0, 252}, .nature = NATURE_CAREFUL, .species = SPECIES_SHELLDER, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_SCREECH, MOVE_DOUBLE_EDGE, MOVE_SWAGGER, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterCloyster[] = { { .iv = 10, //electric .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_CALM, .species = SPECIES_CLOYSTER, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PROTECT, MOVE_TORMENT, MOVE_TOXIC, MOVE_HIDDEN_POWER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGastly[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_GASTLY, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_CURSE, MOVE_SWAGGER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterHaunter[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_HAUNTER, .heldItem = ITEM_PETAYA_BERRY, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_PSYCHIC, MOVE_THIEF, MOVE_TAUNT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGengar[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_GENGAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HYPNOSIS, MOVE_WILL_O_WISP, MOVE_PSYCHIC, MOVE_DESTINY_BOND}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterOnix[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_ONIX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_TORMENT, MOVE_SCREECH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterDrowzee[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_DROWZEE, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_BELLY_DRUM, MOVE_RETURN, MOVE_THIEF, MOVE_DISABLE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterHypno[] = { { .iv = 255, //dark .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_HYPNO, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_REFLECT, MOVE_TOXIC, MOVE_HIDDEN_POWER, MOVE_DISABLE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterKrabby[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 152, 0, 100}, .nature = NATURE_JOLLY, .species = SPECIES_KRABBY, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 1, .moves = {MOVE_SWORDS_DANCE, MOVE_ENDURE, MOVE_FLAIL, MOVE_RETURN}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterKingler[] = { { .iv = 10, //electric .lvl = 60, .evs = { 4, 0, 252, 0, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_KINGLER, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_HIDDEN_POWER, MOVE_AMNESIA, MOVE_KNOCK_OFF, MOVE_GUILLOTINE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterVoltorb[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 0, 0, 252}, .nature = NATURE_ADAMANT, .species = SPECIES_VOLTORB, .heldItem = ITEM_HARD_STONE, .abilityNum = 0, .moves = {MOVE_LIGHT_SCREEN, MOVE_ROLLOUT, MOVE_SUBSTITUTE, MOVE_TAUNT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterElectrode[] = { { .iv = 2, //ground .lvl = 60, .evs = { 4, 252, 0, 0, 0, 252}, .nature = NATURE_ADAMANT, .species = SPECIES_ELECTRODE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_SUBSTITUTE, MOVE_LIGHT_SCREEN, MOVE_SWAGGER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterExeggcute[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 0, 0, 252}, .nature = NATURE_ADAMANT, .species = SPECIES_EXEGGCUTE, .heldItem = ITEM_POISON_BARB, .abilityNum = 0, .moves = {MOVE_LIGHT_SCREEN, MOVE_SLEEP_POWDER, MOVE_SLUDGE_BOMB, MOVE_SYNTHESIS}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterExeggutor[] = { { .iv = 9, //fire .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLEEP_POWDER, MOVE_SUBSTITUTE, MOVE_INGRAIN, MOVE_HIDDEN_POWER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterCubone[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_CUBONE, .heldItem = ITEM_THICK_CLUB, .abilityNum = 0, .moves = {MOVE_DOUBLE_EDGE, MOVE_FOCUS_ENERGY, MOVE_SWORDS_DANCE, MOVE_BODY_SLAM}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMarowak[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_MAROWAK, .heldItem = ITEM_THICK_CLUB, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_BONEMERANG, MOVE_FOCUS_ENERGY, MOVE_SWAGGER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterHitmonlee[] = { { .iv = 3, //flying .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_HITMONLEE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_HIDDEN_POWER, MOVE_MACH_PUNCH, MOVE_BULK_UP}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterHitmonchan[] = { { .iv = 3, //flying .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_AGILITY, MOVE_HIDDEN_POWER, MOVE_MACH_PUNCH, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterLickitung[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_LICKITUNG, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_BRICK_BREAK, MOVE_CURSE, MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterKoffing[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_KOFFING, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_PSYBEAM, MOVE_WILL_O_WISP, MOVE_TORMENT, MOVE_SMOKESCREEN}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterWeezing[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_WEEZING, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PSYBEAM, MOVE_WILL_O_WISP, MOVE_SUBSTITUTE, MOVE_DESTINY_BOND}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterRhyhorn[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_RHYHORN, .heldItem = ITEM_SOFT_SAND, .abilityNum = 1, .moves = {MOVE_HORN_DRILL, MOVE_MUD_SLAP, MOVE_SWORDS_DANCE, MOVE_EARTHQUAKE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterRhydon[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 100, 0, 252, 152}, .nature = NATURE_MODEST, .species = SPECIES_RHYDON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SURF, MOVE_TOXIC, MOVE_COUNTER, MOVE_RAIN_DANCE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterChansey[] = { { .iv = 255, .lvl = 60, .evs = { 152, 100, 252, 0, 0, 4}, .nature = NATURE_ADAMANT, .species = SPECIES_CHANSEY, .heldItem = ITEM_LUCKY_PUNCH, .abilityNum = 1, .moves = {MOVE_AROMATHERAPY, MOVE_TOXIC, MOVE_SOFT_BOILED, MOVE_ROCK_SMASH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterTangela[] = { { .iv = 255, .lvl = 60, .evs = { 252, 252, 4, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_TANGELA, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLEEP_POWDER, MOVE_INGRAIN, MOVE_SLUDGE_BOMB, MOVE_SWORDS_DANCE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterKangaskhan[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_KANGASKHAN, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_REST, MOVE_BRICK_BREAK, MOVE_FAKE_OUT, MOVE_SUBSTITUTE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterHorsea[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_HORSEA, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_ENDURE, MOVE_FLAIL, MOVE_DRAGON_DANCE, MOVE_RETURN}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSeadra[] = { { .iv = 10, //electric .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_SEADRA, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_DISABLE, MOVE_SUBSTITUTE, MOVE_DRAGON_BREATH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGoldeen[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_GOLDEEN, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_TOXIC, MOVE_RETURN, MOVE_ENDURE, MOVE_FLAIL}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSeaking[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_SEAKING, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HORN_DRILL, MOVE_RETURN, MOVE_SWAGGER, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterStaryu[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_STARYU, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_CAMOUFLAGE, MOVE_SURF}, //Camo to Ground type; neutralize enemy T-bolt }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterStarmie[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_STARMIE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_RECOVER, MOVE_SURF, MOVE_COSMIC_POWER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMrMime[] = { { .iv = 5, //bug .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_ADAMANT, .species = SPECIES_MR_MIME, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_TRICK, MOVE_MEDITATE, MOVE_HIDDEN_POWER, MOVE_BRICK_BREAK}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterScyther[] = { { .iv = 3, //flying .lvl = 60, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_SCYTHER, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_STEEL_WING, MOVE_SWORDS_DANCE, MOVE_QUICK_ATTACK}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterJynx[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 0, 0, 252}, .nature = NATURE_ADAMANT, .species = SPECIES_JYNX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SHADOW_BALL, MOVE_LOVELY_KISS, MOVE_FAKE_OUT, MOVE_TORMENT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterElectabuzz[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 0, 0, 0, 252}, .nature = NATURE_ADAMANT, .species = SPECIES_ELECTABUZZ, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CROSS_CHOP, MOVE_SCREECH, MOVE_QUICK_ATTACK, MOVE_LIGHT_SCREEN}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMagmar[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 152, 0, 0, 100}, .nature = NATURE_ADAMANT, .species = SPECIES_MAGMAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CROSS_CHOP, MOVE_SCREECH, MOVE_TOXIC, MOVE_CONFUSE_RAY}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPinsir[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_PINSIR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_ROCK_SLIDE, MOVE_HYPER_BEAM, MOVE_FOCUS_ENERGY}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterTauros[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_TAUROS, .heldItem = ITEM_WHITE_HERB, .abilityNum = 0, .moves = {MOVE_RETURN, MOVE_HYPER_BEAM, MOVE_REST, MOVE_SLEEP_TALK}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterMagikarp[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_MAGIKARP, .heldItem = ITEM_FOCUS_BAND, .abilityNum = 0, .moves = {MOVE_FLAIL, MOVE_TACKLE, MOVE_SPLASH, MOVE_NONE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterGyarados[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 252, 0, 0, 252}, .nature = NATURE_MODEST, .species = SPECIES_GYARADOS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDER, MOVE_RAIN_DANCE, MOVE_SUBSTITUTE, MOVE_TORMENT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterLapras[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 252, 0, 0, 252}, .nature = NATURE_MODEST, .species = SPECIES_LAPRAS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_RAIN_DANCE, MOVE_THUNDER, MOVE_TOXIC, MOVE_SHEER_COLD}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterEevee[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_EEVEE, .heldItem = ITEM_LUM_BERRY, .abilityNum = 0, .moves = {MOVE_CURSE, MOVE_RETURN, MOVE_TICKLE, MOVE_WISH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterVaporeon[] = { { .iv = 10, //electric .lvl = 60, .evs = { 252, 0, 4, 0, 0, 252}, .nature = NATURE_MODEST, .species = SPECIES_VAPOREON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ACID_ARMOR, MOVE_HIDDEN_POWER, MOVE_SUBSTITUTE, MOVE_WISH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterJolteon[] = { { .iv = 2, //ground .lvl = 60, .evs = { 4, 252, 0, 0, 0, 252}, .nature = NATURE_ADAMANT, .species = SPECIES_JOLTEON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_QUICK_ATTACK, MOVE_CURSE, MOVE_WISH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterFlareon[] = { { .iv = 2, //ground .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_FLAREON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_CURSE, MOVE_WISH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterPorygon[] = { { .iv = 255, .lvl = 60, .evs = { 252, 0, 4, 0, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_PORYGON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_CONVERSION, MOVE_RECOVER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterOmanyte[] = { { .iv = 255, .lvl = 60, .evs = { 252, 252, 4, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_OMANYTE, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 1, .moves = {MOVE_MUD_SHOT, MOVE_TOXIC, MOVE_PROTECT, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterOmastar[] = { { .iv = 7, //grass .lvl = 60, .evs = { 252, 0, 4, 0, 0, 252}, .nature = NATURE_MODEST, .species = SPECIES_OMASTAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_HIDDEN_POWER, MOVE_TOXIC, MOVE_SWAGGER, MOVE_ICY_WIND}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterKabuto[] = { { .iv = 255, .lvl = 60, .evs = { 252, 0, 4, 0, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_KABUTO, .heldItem = ITEM_MIRACLE_SEED, .abilityNum = 1, .moves = {MOVE_KNOCK_OFF, MOVE_MEGA_DRAIN, MOVE_METAL_SOUND, MOVE_PROTECT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterKabutops[] = { { .iv = 255, .lvl = 60, .evs = { 0, 0, 4, 0, 252, 252}, .nature = NATURE_CALM, .species = SPECIES_KABUTOPS, .heldItem = ITEM_SHELL_BELL, .abilityNum = 1, .moves = {MOVE_GIGA_DRAIN, MOVE_CONFUSE_RAY, MOVE_KNOCK_OFF, MOVE_ICY_WIND}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterAerodactyl[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_AERODACTYL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_ROCK_SLIDE, MOVE_TORMENT, MOVE_IRON_TAIL, MOVE_AGILITY}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterSnorlax[] = { { .iv = 255, .lvl = 60, .evs = { 4, 252, 252, 0, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_SNORLAX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_YAWN, MOVE_BELLY_DRUM, MOVE_REST, MOVE_BRICK_BREAK}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterDratini[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_CALM, .species = SPECIES_DRATINI, .heldItem = ITEM_PERSIM_BERRY, .abilityNum = 0, .moves = {MOVE_OUTRAGE, MOVE_ICY_WIND, MOVE_REST, MOVE_LIGHT_SCREEN}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterDragonair[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_DRAGONAIR, .heldItem = ITEM_PERSIM_BERRY, .abilityNum = 0, .moves = {MOVE_OUTRAGE, MOVE_AGILITY, MOVE_REST, MOVE_SUBSTITUTE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterDragonite[] = { { .iv = 255, .lvl = 60, .evs = { 4, 0, 0, 0, 252, 252}, .nature = NATURE_MODEST, .species = SPECIES_DRAGONITE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, MOVE_TOXIC, MOVE_PROTECT}, }, }; ================================================ FILE: src/data/master_trainers.h ================================================ const struct Trainer gMasterTrainers[] = { [TRAINER_NONE] = { .partyFlags = 0, .trainerClass = TRAINER_CLASS_PKMN_TRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_AQUA_LEADER_ARCHIE, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = 0, .partySize = 0, .party = NULL }, [MASTER_BULBASAUR] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("RENA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterBulbasaur), }, [MASTER_IVYSAUR] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("KATRINA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterIvysaur), }, [MASTER_VENUSAUR] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("SAL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterVenusaur), }, [MASTER_CHARMANDER] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("TIM"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterCharmander), }, [MASTER_CHARMELEON] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("CHRISTOPHER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterCharmeleon), }, [MASTER_CHARIZARD] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("EDMUND"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterCharizard), }, [MASTER_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_BEAUTY, .trainerName = _("SUZY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSquirtle), }, [MASTER_WARTORTLE] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("PRITA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterWartortle), }, [MASTER_BLASTOISE] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("TESSA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterBlastoise), }, [MASTER_CATERPIE] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("JAKE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterCaterpie), }, [MASTER_METAPOD] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("BRYSON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMetapod), }, [MASTER_BUTTERFREE] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("BOBBY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterButterfree), }, [MASTER_WEEDLE] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("SCOTT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterWeedle), }, [MASTER_KAKUNA] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("KENNY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterKakuna), }, [MASTER_BEEDRILL] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterBeedrill), }, [MASTER_PIDGEY] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER, .trainerName = _("LOUEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPidgey), }, [MASTER_PIDGEOTTO] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER, .trainerName = _("HOWIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPidgeotto), }, [MASTER_PIDGEOT] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER, .trainerName = _("WYATT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPidgeot), }, [MASTER_RATTATA] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER, .trainerName = _("BRET"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterRattata), }, [MASTER_RATICATE] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER, .trainerName = _("DENIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterRaticate), }, [MASTER_SPEAROW] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER, .trainerName = _("RALPH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSpearow), }, [MASTER_FEAROW] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER, .trainerName = _("THEO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterFearow), }, [MASTER_EKANS] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("HERBERT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterEkans), }, [MASTER_ARBOK] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("ADAM"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterArbok), }, [MASTER_PIKACHU] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("IKUE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPikachu), }, [MASTER_RAICHU] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("CHARLOTTE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterRaichu), }, [MASTER_SANDSHREW] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("PAUL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSandshrew), }, [MASTER_SANDSLASH] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("BENJAMIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSandslash), }, [MASTER_NIDORAN_F] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("RONNIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterNidoranF), }, [MASTER_NIDORINA] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("FRED"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterNidorina), }, [MASTER_NIDOQUEEN] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("PERCY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterNidoqueen), }, [MASTER_NIDORAN_M] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("ALVIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterNidoranM), }, [MASTER_NIDORINO] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("DAVE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterNidorino), }, [MASTER_NIDOKING] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("CARLTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterNidoking), }, [MASTER_CLEFAIRY] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("CHEL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterClefairy), }, [MASTER_CLEFABLE] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("ALEXANDRA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterClefable), }, [MASTER_VULPIX] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("FINN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterVulpix), }, [MASTER_NINETALES] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("ARNOLD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterNinetales), }, [MASTER_JIGGLYPUFF] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("MARGE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterJigglypuff), }, [MASTER_WIGGLYTUFF] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("YUMI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterWigglytuff), }, [MASTER_ZUBAT] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("WEST"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterZubat), }, [MASTER_GOLBAT] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("KEATON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGolbat), }, [MASTER_ODDISH] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("AMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterOddish), }, [MASTER_GLOOM] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("EMMA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGloom), }, [MASTER_VILEPLUME] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("SATOKO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterVileplume), }, [MASTER_PARAS] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("EVAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterParas), }, [MASTER_PARASECT] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("HANS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterParasect), }, [MASTER_VENONAT] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("OLLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterVenonat), }, [MASTER_VENOMOTH] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("LAJOS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterVenomoth), }, [MASTER_DIGLETT] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("COLIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterDiglett), }, [MASTER_DUGTRIO] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("DEXTER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterDugtrio), }, [MASTER_MEOWTH] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER, .trainerName = _("KEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMeowth), }, [MASTER_PERSIAN] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER, .trainerName = _("SHAWN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPersian), }, [MASTER_PSYDUCK] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("NICOLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPsyduck), }, [MASTER_GOLDUCK] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("CAMILLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGolduck), }, [MASTER_MANKEY] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT, .trainerName = _("TADASHI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMankey), }, [MASTER_PRIMEAPE] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT, .trainerName = _("KANO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPrimeape), }, [MASTER_GROWLITHE] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("AUSTIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGrowlithe), }, [MASTER_ARCANINE] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("SATCH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterArcanine), }, [MASTER_POLIWAG] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("VICKY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPoliwag), }, [MASTER_POLIWHIRL] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("KIMBERLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPoliwhirl), }, [MASTER_POLIWRATH] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT, .trainerName = _("YUEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPoliwrath), }, [MASTER_ABRA] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("ANGELO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterAbra), }, [MASTER_KADABRA] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("JAIME"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterKadabra), }, [MASTER_ALAKAZAM] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("FRASIER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterAlakazam), }, [MASTER_MACHOP] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT, .trainerName = _("MASAHIRO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMachop), }, [MASTER_MACHOKE] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT, .trainerName = _("RYUJI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMachoke), }, [MASTER_MACHAMP] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT, .trainerName = _("RANDY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMachamp), }, [MASTER_BELLSPROUT] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("HANA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterBellsprout), }, [MASTER_WEEPINBELL] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("EMILY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterWeepinbell), }, [MASTER_VICTREEBEL] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("DIANNE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterVictreebel), }, [MASTER_TENTACOOL] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("FRANCIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterTentacool), }, [MASTER_TENTACRUEL] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("MELVIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterTentacruel), }, [MASTER_GEODUDE] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("IRWIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGeodude), }, [MASTER_GRAVELER] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("DILLAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGraveler), }, [MASTER_GOLEM] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("VALENTINO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGolem), }, [MASTER_PONYTA] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("GARRET"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPonyta), }, [MASTER_RAPIDASH] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("RAYMOND"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterRapidash), }, [MASTER_SLOWPOKE] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_BEAUTY, .trainerName = _("JILL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSlowpoke), }, [MASTER_SLOWBRO] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_BEAUTY, .trainerName = _("HARUKA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSlowbro), }, [MASTER_MAGNEMITE] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("MURRAY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMagnemite), }, [MASTER_MAGNETON] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("JULIAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMagneton), }, [MASTER_FARFETCHD] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER, .trainerName = _("MOE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterFarfetchd), }, [MASTER_DODUO] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER, .trainerName = _("BARNEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterDoduo), }, [MASTER_DODRIO] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER, .trainerName = _("SEYMOUR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterDodrio), }, [MASTER_SEEL] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_BEAUTY, .trainerName = _("AINA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSeel), }, [MASTER_DEWGONG] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_BEAUTY, .trainerName = _("LOIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterDewgong), }, [MASTER_GRIMER] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("CORY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGrimer), }, [MASTER_MUK] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("GORDON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMuk), }, [MASTER_SHELLDER] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("SHELLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterShellder), }, [MASTER_CLOYSTER] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("ROSE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterCloyster), }, [MASTER_GASTLY] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("ARIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGastly), }, [MASTER_HAUNTER] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("DANNY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterHaunter), }, [MASTER_GENGAR] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("ROSS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGengar), }, [MASTER_ONIX] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("JIM"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterOnix), }, [MASTER_DROWZEE] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("ANTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterDrowzee), }, [MASTER_HYPNO] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("VLAD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterHypno), }, [MASTER_KRABBY] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("CARL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterKrabby), }, [MASTER_KINGLER] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("LEOPOLD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterKingler), }, [MASTER_VOLTORB] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("HUMPHREY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterVoltorb), }, [MASTER_ELECTRODE] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("ELTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterElectrode), }, [MASTER_EXEGGCUTE] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("SUMMER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterExeggcute), }, [MASTER_EXEGGUTOR] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("CINDY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterExeggutor), }, [MASTER_CUBONE] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("RICHTER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterCubone), }, [MASTER_MAROWAK] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("JULIUS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMarowak), }, [MASTER_HITMONLEE] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT, .trainerName = _("CHENG"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterHitmonlee), }, [MASTER_HITMONCHAN] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT, .trainerName = _("WONG"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterHitmonchan), }, [MASTER_LICKITUNG] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER, .trainerName = _("CID"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterLickitung), }, [MASTER_KOFFING] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("ALBERT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterKoffing), }, [MASTER_WEEZING] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("DONNIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterWeezing), }, [MASTER_RHYHORN] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("FARKAS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterRhyhorn), }, [MASTER_RHYDON] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("EUGGINE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterRhydon), }, [MASTER_CHANSEY] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("MIZUKI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterChansey), }, [MASTER_TANGELA] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("HARLEEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterTangela), }, [MASTER_KANGASKHAN] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("MAC"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterKangaskhan), }, [MASTER_HORSEA] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("BEVERLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterHorsea), }, [MASTER_SEADRA] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("LUCY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSeadra), }, [MASTER_GOLDEEN] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("EVETTE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGoldeen), }, [MASTER_SEAKING] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_SWIMMER, .trainerName = _("ARIANNA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSeaking), }, [MASTER_STARYU] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_BEAUTY, .trainerName = _("JO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterStaryu), }, [MASTER_STARMIE] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("HARRISON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterStarmie), }, [MASTER_MR_MIME] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("RUI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMrMime), }, [MASTER_SCYTHER] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("LOUIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterScyther), }, [MASTER_JYNX] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M, .trainerName = _("AVERY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterJynx), }, [MASTER_ELECTABUZZ] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("LEVI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterElectabuzz), }, [MASTER_MAGMAR] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("JACE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMagmar), }, [MASTER_PINSIR] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER, .trainerName = _("RYOUTA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPinsir), }, [MASTER_TAUROS] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("JAXSON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterTauros), }, [MASTER_MAGIKARP] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER, .trainerName = _("EASTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterMagikarp), }, [MASTER_GYARADOS] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("DOMINIC"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterGyarados), }, [MASTER_LAPRAS] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("HAZEL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterLapras), }, //DITTO [MASTER_EEVEE] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("AOI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterEevee), }, [MASTER_VAPOREON] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_MASTER_LASS, .trainerName = _("YUE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterVaporeon), }, [MASTER_JOLTEON] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("ALPHONSE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterJolteon), }, [MASTER_FLAREON] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("DAX"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterFlareon), }, [MASTER_PORYGON] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_MASTER_SCIENTIST, .trainerName = _("JORDAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterPorygon), }, [MASTER_OMANYTE] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("COLSON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterOmanyte), }, [MASTER_OMASTAR] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("LIONEL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterOmastar), }, [MASTER_KABUTO] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("BARNABY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterKabuto), }, [MASTER_KABUTOPS] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("KENJI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterKabutops), }, [MASTER_AERODACTYL] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_MASTER_HIKER, .trainerName = _("HISATO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterAerodactyl), }, [MASTER_SNORLAX] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("JAY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterSnorlax), }, //ARTICUNO //ZAPDOS //MOLTRES [MASTER_DRATINI] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("JIRARD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterDratini), }, [MASTER_DRAGONAIR] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("ARJUN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterDragonair), }, [MASTER_DRAGONITE] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M, .trainerName = _("GRAYSON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_MasterDragonite), }, //MEWTWO //MEW }; ================================================ FILE: src/data/object_events/base_oam.h ================================================ const struct OamData gObjectEventBaseOam_8x8 = { .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .priority = 2 }; const struct OamData gObjectEventBaseOam_16x8 = { .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .priority = 2 }; const struct OamData gObjectEventBaseOam_16x16 = { .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 2 }; const struct OamData gObjectEventBaseOam_32x16 = { .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .priority = 2 }; const struct OamData gObjectEventBaseOam_32x8 = { .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .priority = 2 }; const struct OamData gObjectEventBaseOam_64x32 = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 2 }; const struct OamData gObjectEventBaseOam_16x32 = { .shape = SPRITE_SHAPE(16x32), .size = SPRITE_SIZE(16x32), .priority = 2 }; const struct OamData gObjectEventBaseOam_32x32 = { .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .priority = 2 }; const struct OamData gObjectEventBaseOam_64x64 = { .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .priority = 2 }; ================================================ FILE: src/data/object_events/movement_action_func_tables.h ================================================ static bool8 MovementAction_FaceDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FaceUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FaceLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FaceRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_PauseSpriteAnim(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FaceDownFast_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FaceUpFast_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FaceLeftFast_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FaceRightFast_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowerDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowerDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowerUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowerUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowerLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowerLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowerRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowerRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkNormalUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkNormalRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceSlowLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceSlowRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceSlow_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceNormalDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceNormalUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceNormalLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceNormalRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlace_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceFastDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceFastUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceFastLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceFastRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceFasterDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceFasterUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceFasterLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkInPlaceFasterRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Jump2Down_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Jump2Up_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Jump2Left_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Jump2Right_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Jump2Right_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Delay1_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Delay2_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Delay4_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Delay8_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Delay16_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Delay_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFastUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFastRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RideWaterCurrentDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RideWaterCurrentDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RideWaterCurrentUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RideWaterCurrentLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RideWaterCurrentRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RideWaterCurrentRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFasterDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFasterDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFasterUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFasterUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFasterLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFasterLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFasterRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkFasterRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SlideDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SlideDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SlideUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SlideUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SlideLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SlideLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SlideRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SlideRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_PlayerRunDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_PlayerRunDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_PlayerRunUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_PlayerRunUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_PlayerRunLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_PlayerRunLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_PlayerRunRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_PlayerRunRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RunDownSlow_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RunDownSlow_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RunUpSlow_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RunUpSlow_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RunLeftSlow_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RunLeftSlow_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RunRightSlow_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RunRightSlow_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_StartAnimInDirection_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FacePlayer_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FaceAwayPlayer_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_LockFacingDirection_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_UnlockFacingDirection_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceDownUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceUpDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceLeftRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceRightLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FaceOriginalDirection_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_NurseJoyBowDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_DisableAnimation_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RestoreAnimation_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SetInvisible_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SetVisible_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_EmoteExclamationMark_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_EmoteQuestionMark_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_EmoteX_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_EmoteDoubleExclamationMark_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_EmoteSmile_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RevealTrainer_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RockSmashBreak_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RockSmashBreak_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RockSmashBreak_Step2(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_CutTree_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_CutTree_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_CutTree_Step2(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SetFixedPriority_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_ClearFixedPriority_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_InitAffineAnim_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_ClearAffineAnim_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkDownStartAffine_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkDownStartAffine_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkDownAffine_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkDownAffine_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieFaceDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieFaceUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieFaceLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieFaceRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroEndWheelieFaceDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroEndWheelieFaceUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroEndWheelieFaceLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroEndWheelieFaceRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_UnusedAcroActionDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_UnusedAcroActionUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_UnusedAcroActionLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_UnusedAcroActionRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopFaceDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopFaceUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopFaceRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieJumpDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieJumpUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieJumpRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieInPlaceDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieMoveDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieMoveUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroPopWheelieMoveRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieMoveDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieMoveDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieMoveUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieMoveRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_AcroWheelieMoveRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SpinDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SpinDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SpinUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SpinUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SpinLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SpinLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SpinRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_SpinRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RaiseHand_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RaiseHandAndStop_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RaiseHandAndJump_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_RaiseHandAndSwim_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowestDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowestDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowestUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowestUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowestLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowestLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowestRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WalkSlowestRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_ShakeHeadOrWalkInPlace_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_ShakeHeadOrWalkInPlace_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_GlideDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_GlideDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_GlideUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_GlideUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_GlideLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_GlideLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_GlideRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_GlideRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FlyUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FlyUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FlyUp_Step2(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FlyDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_FlyDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialWithEffectDown_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialWithEffectDown_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialWithEffectUp_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialWithEffectUp_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialWithEffectLeft_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialWithEffectLeft_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialWithEffectRight_Step0(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_JumpSpecialWithEffectRight_Step1(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_WaitSpriteAnim(struct ObjectEvent *, struct Sprite *); static bool8 MovementAction_Finish(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceDownFast[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceUpFast[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceLeftFast[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceRightFast[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowerDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowerUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowerLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowerRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkNormalDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkNormalUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkNormalLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkNormalRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_Jump2Down[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_Jump2Up[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_Jump2Left[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_Jump2Right[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_Delay1[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_Delay2[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_Delay4[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_Delay8[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_Delay16[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkFastDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkFastUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkFastLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkFastRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceSlowDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceSlowUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceSlowLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceSlowRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceNormalDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceNormalUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceNormalLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceNormalRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceFastDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceFastUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceFastLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceFastRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceFasterDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceFasterUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceFasterLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkInPlaceFasterRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RideWaterCurrentDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RideWaterCurrentUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RideWaterCurrentLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RideWaterCurrentRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkFasterDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkFasterUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkFasterLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkFasterRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SlideDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SlideUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SlideLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SlideRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_PlayerRunDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_PlayerRunUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_PlayerRunLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_PlayerRunRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_PlayerRunDownSlow[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_PlayerRunUpSlow[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_PlayerRunLeftSlow[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_PlayerRunRightSlow[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_StartAnimInDirection[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpSpecialDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpSpecialUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpSpecialLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpSpecialRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FacePlayer[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceAwayPlayer[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_LockFacingDirection[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_UnlockFacingDirection[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpInPlaceDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpInPlaceUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpInPlaceLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpInPlaceRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpInPlaceDownUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpInPlaceUpDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpInPlaceLeftRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpInPlaceRightLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FaceOriginalDirection[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_NurseJoyBowDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_EnableJumpLandingGroundEffect[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_DisableJumpLandingGroundEffect[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_DisableAnimation[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RestoreAnimation[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SetInvisible[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SetVisible[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_EmoteExclamationMark[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_EmoteQuestionMark[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_EmoteX[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_EmoteDoubleExclMark[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_EmoteSmile[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RevealTrainer[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RockSmashBreak[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_CutTree[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SetFixedPriority[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_ClearFixedPriority[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_InitAffineAnim[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_ClearAffineAnim[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkDownStartAffine[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkDownAffine[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieFaceDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieFaceUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieFaceLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieFaceRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroPopWheelieDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroPopWheelieUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroPopWheelieLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroPopWheelieRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieHopDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieHopUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieHopLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieHopRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieJumpDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieJumpUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieJumpLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieJumpRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieMoveDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieMoveUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieMoveLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_AcroWheelieMoveRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SpinDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SpinUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SpinLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_SpinRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RaiseHandAndStop[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RaiseHandAndJump[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_RaiseHandAndSwim[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowestDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowestUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowestLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_WalkSlowestRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_ShakeHeadOrWalkInPlace[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_GlideDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_GlideUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_GlideLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_GlideRight[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FlyUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectDown[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectUp[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectLeft[])(struct ObjectEvent *, struct Sprite *); static bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectRight[])(struct ObjectEvent *, struct Sprite *); static u8 GetMoveDirectionFastAnimNum(u8 direction); static u8 GetMoveDirectionFasterAnimNum(u8 direction); static u8 GetMoveDirectionFastestAnimNum(u8 direction); static bool8 (*const *const sMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = { [MOVEMENT_ACTION_FACE_DOWN] = sMovementActionFuncs_FaceDown, [MOVEMENT_ACTION_FACE_UP] = sMovementActionFuncs_FaceUp, [MOVEMENT_ACTION_FACE_LEFT] = sMovementActionFuncs_FaceLeft, [MOVEMENT_ACTION_FACE_RIGHT] = sMovementActionFuncs_FaceRight, [MOVEMENT_ACTION_FACE_DOWN_FAST] = sMovementActionFuncs_FaceDownFast, [MOVEMENT_ACTION_FACE_UP_FAST] = sMovementActionFuncs_FaceUpFast, [MOVEMENT_ACTION_FACE_LEFT_FAST] = sMovementActionFuncs_FaceLeftFast, [MOVEMENT_ACTION_FACE_RIGHT_FAST] = sMovementActionFuncs_FaceRightFast, [MOVEMENT_ACTION_WALK_SLOWER_DOWN] = sMovementActionFuncs_WalkSlowerDown, [MOVEMENT_ACTION_WALK_SLOWER_UP] = sMovementActionFuncs_WalkSlowerUp, [MOVEMENT_ACTION_WALK_SLOWER_LEFT] = sMovementActionFuncs_WalkSlowerLeft, [MOVEMENT_ACTION_WALK_SLOWER_RIGHT] = sMovementActionFuncs_WalkSlowerRight, [MOVEMENT_ACTION_WALK_SLOW_DOWN] = sMovementActionFuncs_WalkSlowDown, [MOVEMENT_ACTION_WALK_SLOW_UP] = sMovementActionFuncs_WalkSlowUp, [MOVEMENT_ACTION_WALK_SLOW_LEFT] = sMovementActionFuncs_WalkSlowLeft, [MOVEMENT_ACTION_WALK_SLOW_RIGHT] = sMovementActionFuncs_WalkSlowRight, [MOVEMENT_ACTION_WALK_NORMAL_DOWN] = sMovementActionFuncs_WalkNormalDown, [MOVEMENT_ACTION_WALK_NORMAL_UP] = sMovementActionFuncs_WalkNormalUp, [MOVEMENT_ACTION_WALK_NORMAL_LEFT] = sMovementActionFuncs_WalkNormalLeft, [MOVEMENT_ACTION_WALK_NORMAL_RIGHT] = sMovementActionFuncs_WalkNormalRight, [MOVEMENT_ACTION_JUMP_2_DOWN] = sMovementActionFuncs_Jump2Down, [MOVEMENT_ACTION_JUMP_2_UP] = sMovementActionFuncs_Jump2Up, [MOVEMENT_ACTION_JUMP_2_LEFT] = sMovementActionFuncs_Jump2Left, [MOVEMENT_ACTION_JUMP_2_RIGHT] = sMovementActionFuncs_Jump2Right, [MOVEMENT_ACTION_DELAY_1] = sMovementActionFuncs_Delay1, [MOVEMENT_ACTION_DELAY_2] = sMovementActionFuncs_Delay2, [MOVEMENT_ACTION_DELAY_4] = sMovementActionFuncs_Delay4, [MOVEMENT_ACTION_DELAY_8] = sMovementActionFuncs_Delay8, [MOVEMENT_ACTION_DELAY_16] = sMovementActionFuncs_Delay16, [MOVEMENT_ACTION_WALK_FAST_DOWN] = sMovementActionFuncs_WalkFastDown, [MOVEMENT_ACTION_WALK_FAST_UP] = sMovementActionFuncs_WalkFastUp, [MOVEMENT_ACTION_WALK_FAST_LEFT] = sMovementActionFuncs_WalkFastLeft, [MOVEMENT_ACTION_WALK_FAST_RIGHT] = sMovementActionFuncs_WalkFastRight, [MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN] = sMovementActionFuncs_WalkInPlaceSlowDown, [MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP] = sMovementActionFuncs_WalkInPlaceSlowUp, [MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT] = sMovementActionFuncs_WalkInPlaceSlowLeft, [MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT] = sMovementActionFuncs_WalkInPlaceSlowRight, [MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN] = sMovementActionFuncs_WalkInPlaceNormalDown, [MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP] = sMovementActionFuncs_WalkInPlaceNormalUp, [MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT] = sMovementActionFuncs_WalkInPlaceNormalLeft, [MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT] = sMovementActionFuncs_WalkInPlaceNormalRight, [MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN] = sMovementActionFuncs_WalkInPlaceFastDown, [MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP] = sMovementActionFuncs_WalkInPlaceFastUp, [MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT] = sMovementActionFuncs_WalkInPlaceFastLeft, [MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT] = sMovementActionFuncs_WalkInPlaceFastRight, [MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN] = sMovementActionFuncs_WalkInPlaceFasterDown, [MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP] = sMovementActionFuncs_WalkInPlaceFasterUp, [MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT] = sMovementActionFuncs_WalkInPlaceFasterLeft, [MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT] = sMovementActionFuncs_WalkInPlaceFasterRight, [MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN] = sMovementActionFuncs_RideWaterCurrentDown, [MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP] = sMovementActionFuncs_RideWaterCurrentUp, [MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT] = sMovementActionFuncs_RideWaterCurrentLeft, [MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT] = sMovementActionFuncs_RideWaterCurrentRight, [MOVEMENT_ACTION_WALK_FASTER_DOWN] = sMovementActionFuncs_WalkFasterDown, [MOVEMENT_ACTION_WALK_FASTER_UP] = sMovementActionFuncs_WalkFasterUp, [MOVEMENT_ACTION_WALK_FASTER_LEFT] = sMovementActionFuncs_WalkFasterLeft, [MOVEMENT_ACTION_WALK_FASTER_RIGHT] = sMovementActionFuncs_WalkFasterRight, [MOVEMENT_ACTION_SLIDE_DOWN] = sMovementActionFuncs_SlideDown, [MOVEMENT_ACTION_SLIDE_UP] = sMovementActionFuncs_SlideUp, [MOVEMENT_ACTION_SLIDE_LEFT] = sMovementActionFuncs_SlideLeft, [MOVEMENT_ACTION_SLIDE_RIGHT] = sMovementActionFuncs_SlideRight, [MOVEMENT_ACTION_PLAYER_RUN_DOWN] = sMovementActionFuncs_PlayerRunDown, [MOVEMENT_ACTION_PLAYER_RUN_UP] = sMovementActionFuncs_PlayerRunUp, [MOVEMENT_ACTION_PLAYER_RUN_LEFT] = sMovementActionFuncs_PlayerRunLeft, [MOVEMENT_ACTION_PLAYER_RUN_RIGHT] = sMovementActionFuncs_PlayerRunRight, [MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW] = sMovementActionFuncs_PlayerRunDownSlow, [MOVEMENT_ACTION_PLAYER_RUN_UP_SLOW] = sMovementActionFuncs_PlayerRunUpSlow, [MOVEMENT_ACTION_PLAYER_RUN_LEFT_SLOW] = sMovementActionFuncs_PlayerRunLeftSlow, [MOVEMENT_ACTION_PLAYER_RUN_RIGHT_SLOW] = sMovementActionFuncs_PlayerRunRightSlow, [MOVEMENT_ACTION_START_ANIM_IN_DIRECTION] = sMovementActionFuncs_StartAnimInDirection, [MOVEMENT_ACTION_JUMP_SPECIAL_DOWN] = sMovementActionFuncs_JumpSpecialDown, [MOVEMENT_ACTION_JUMP_SPECIAL_UP] = sMovementActionFuncs_JumpSpecialUp, [MOVEMENT_ACTION_JUMP_SPECIAL_LEFT] = sMovementActionFuncs_JumpSpecialLeft, [MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT] = sMovementActionFuncs_JumpSpecialRight, [MOVEMENT_ACTION_FACE_PLAYER] = sMovementActionFuncs_FacePlayer, [MOVEMENT_ACTION_FACE_AWAY_PLAYER] = sMovementActionFuncs_FaceAwayPlayer, [MOVEMENT_ACTION_LOCK_FACING_DIRECTION] = sMovementActionFuncs_LockFacingDirection, [MOVEMENT_ACTION_UNLOCK_FACING_DIRECTION] = sMovementActionFuncs_UnlockFacingDirection, [MOVEMENT_ACTION_JUMP_DOWN] = sMovementActionFuncs_JumpDown, [MOVEMENT_ACTION_JUMP_UP] = sMovementActionFuncs_JumpUp, [MOVEMENT_ACTION_JUMP_LEFT] = sMovementActionFuncs_JumpLeft, [MOVEMENT_ACTION_JUMP_RIGHT] = sMovementActionFuncs_JumpRight, [MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN] = sMovementActionFuncs_JumpInPlaceDown, [MOVEMENT_ACTION_JUMP_IN_PLACE_UP] = sMovementActionFuncs_JumpInPlaceUp, [MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT] = sMovementActionFuncs_JumpInPlaceLeft, [MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT] = sMovementActionFuncs_JumpInPlaceRight, [MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP] = sMovementActionFuncs_JumpInPlaceDownUp, [MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN] = sMovementActionFuncs_JumpInPlaceUpDown, [MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT] = sMovementActionFuncs_JumpInPlaceLeftRight, [MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT] = sMovementActionFuncs_JumpInPlaceRightLeft, [MOVEMENT_ACTION_FACE_ORIGINAL_DIRECTION] = sMovementActionFuncs_FaceOriginalDirection, [MOVEMENT_ACTION_NURSE_JOY_BOW_DOWN] = sMovementActionFuncs_NurseJoyBowDown, [MOVEMENT_ACTION_ENABLE_JUMP_LANDING_GROUND_EFFECT] = sMovementActionFuncs_EnableJumpLandingGroundEffect, [MOVEMENT_ACTION_DISABLE_JUMP_LANDING_GROUND_EFFECT] = sMovementActionFuncs_DisableJumpLandingGroundEffect, [MOVEMENT_ACTION_DISABLE_ANIMATION] = sMovementActionFuncs_DisableAnimation, [MOVEMENT_ACTION_RESTORE_ANIMATION] = sMovementActionFuncs_RestoreAnimation, [MOVEMENT_ACTION_SET_INVISIBLE] = sMovementActionFuncs_SetInvisible, [MOVEMENT_ACTION_SET_VISIBLE] = sMovementActionFuncs_SetVisible, [MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK] = sMovementActionFuncs_EmoteExclamationMark, [MOVEMENT_ACTION_EMOTE_QUESTION_MARK] = sMovementActionFuncs_EmoteQuestionMark, [MOVEMENT_ACTION_EMOTE_X] = sMovementActionFuncs_EmoteX, [MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK] = sMovementActionFuncs_EmoteDoubleExclMark, [MOVEMENT_ACTION_EMOTE_SMILE] = sMovementActionFuncs_EmoteSmile, [MOVEMENT_ACTION_REVEAL_TRAINER] = sMovementActionFuncs_RevealTrainer, [MOVEMENT_ACTION_ROCK_SMASH_BREAK] = sMovementActionFuncs_RockSmashBreak, [MOVEMENT_ACTION_CUT_TREE] = sMovementActionFuncs_CutTree, [MOVEMENT_ACTION_SET_FIXED_PRIORITY] = sMovementActionFuncs_SetFixedPriority, [MOVEMENT_ACTION_CLEAR_FIXED_PRIORITY] = sMovementActionFuncs_ClearFixedPriority, [MOVEMENT_ACTION_INIT_AFFINE_ANIM] = sMovementActionFuncs_InitAffineAnim, [MOVEMENT_ACTION_CLEAR_AFFINE_ANIM] = sMovementActionFuncs_ClearAffineAnim, [MOVEMENT_ACTION_WALK_DOWN_START_AFFINE] = sMovementActionFuncs_WalkDownStartAffine, [MOVEMENT_ACTION_WALK_DOWN_AFFINE] = sMovementActionFuncs_WalkDownAffine, [MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN] = sMovementActionFuncs_AcroWheelieFaceDown, [MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP] = sMovementActionFuncs_AcroWheelieFaceUp, [MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT] = sMovementActionFuncs_AcroWheelieFaceLeft, [MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT] = sMovementActionFuncs_AcroWheelieFaceRight, [MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN] = sMovementActionFuncs_AcroPopWheelieDown, [MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP] = sMovementActionFuncs_AcroPopWheelieUp, [MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT] = sMovementActionFuncs_AcroPopWheelieLeft, [MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT] = sMovementActionFuncs_AcroPopWheelieRight, [MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN] = sMovementActionFuncs_AcroEndWheelieFaceDown, [MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP] = sMovementActionFuncs_AcroEndWheelieFaceUp, [MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT] = sMovementActionFuncs_AcroEndWheelieFaceLeft, [MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT] = sMovementActionFuncs_AcroEndWheelieFaceRight, [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN] = sMovementActionFuncs_AcroWheelieHopFaceDown, [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP] = sMovementActionFuncs_AcroWheelieHopFaceUp, [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT] = sMovementActionFuncs_AcroWheelieHopFaceLeft, [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT] = sMovementActionFuncs_AcroWheelieHopFaceRight, [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN] = sMovementActionFuncs_AcroWheelieHopDown, [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP] = sMovementActionFuncs_AcroWheelieHopUp, [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT] = sMovementActionFuncs_AcroWheelieHopLeft, [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT] = sMovementActionFuncs_AcroWheelieHopRight, [MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN] = sMovementActionFuncs_AcroWheelieJumpDown, [MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP] = sMovementActionFuncs_AcroWheelieJumpUp, [MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT] = sMovementActionFuncs_AcroWheelieJumpLeft, [MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT] = sMovementActionFuncs_AcroWheelieJumpRight, [MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN] = sMovementActionFuncs_AcroWheelieInPlaceDown, [MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP] = sMovementActionFuncs_AcroWheelieInPlaceUp, [MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT] = sMovementActionFuncs_AcroWheelieInPlaceLeft, [MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT] = sMovementActionFuncs_AcroWheelieInPlaceRight, [MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN] = sMovementActionFuncs_AcroPopWheelieMoveDown, [MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP] = sMovementActionFuncs_AcroPopWheelieMoveUp, [MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT] = sMovementActionFuncs_AcroPopWheelieMoveLeft, [MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT] = sMovementActionFuncs_AcroPopWheelieMoveRight, [MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN] = sMovementActionFuncs_AcroWheelieMoveDown, [MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP] = sMovementActionFuncs_AcroWheelieMoveUp, [MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT] = sMovementActionFuncs_AcroWheelieMoveLeft, [MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT] = sMovementActionFuncs_AcroWheelieMoveRight, [MOVEMENT_ACTION_SPIN_DOWN] = sMovementActionFuncs_SpinDown, [MOVEMENT_ACTION_SPIN_UP] = sMovementActionFuncs_SpinUp, [MOVEMENT_ACTION_SPIN_LEFT] = sMovementActionFuncs_SpinLeft, [MOVEMENT_ACTION_SPIN_RIGHT] = sMovementActionFuncs_SpinRight, [MOVEMENT_ACTION_RAISE_HAND_AND_STOP] = sMovementActionFuncs_RaiseHandAndStop, [MOVEMENT_ACTION_RAISE_HAND_AND_JUMP] = sMovementActionFuncs_RaiseHandAndJump, [MOVEMENT_ACTION_RAISE_HAND_AND_SWIM] = sMovementActionFuncs_RaiseHandAndSwim, [MOVEMENT_ACTION_WALK_SLOWEST_DOWN] = sMovementActionFuncs_WalkSlowestDown, [MOVEMENT_ACTION_WALK_SLOWEST_UP] = sMovementActionFuncs_WalkSlowestUp, [MOVEMENT_ACTION_WALK_SLOWEST_LEFT] = sMovementActionFuncs_WalkSlowestLeft, [MOVEMENT_ACTION_WALK_SLOWEST_RIGHT] = sMovementActionFuncs_WalkSlowestRight, [MOVEMENT_ACTION_SHAKE_HEAD_OR_WALK_IN_PLACE] = sMovementActionFuncs_ShakeHeadOrWalkInPlace, [MOVEMENT_ACTION_GLIDE_DOWN] = sMovementActionFuncs_GlideDown, [MOVEMENT_ACTION_GLIDE_UP] = sMovementActionFuncs_GlideUp, [MOVEMENT_ACTION_GLIDE_LEFT] = sMovementActionFuncs_GlideLeft, [MOVEMENT_ACTION_GLIDE_RIGHT] = sMovementActionFuncs_GlideRight, [MOVEMENT_ACTION_FLY_UP] = sMovementActionFuncs_FlyUp, [MOVEMENT_ACTION_FLY_DOWN] = sMovementActionFuncs_FlyDown, [MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN] = sMovementActionFuncs_JumpSpecialWithEffectDown, [MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_UP] = sMovementActionFuncs_JumpSpecialWithEffectUp, [MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_LEFT] = sMovementActionFuncs_JumpSpecialWithEffectLeft, [MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_RIGHT] = sMovementActionFuncs_JumpSpecialWithEffectRight, }; static bool8 (*const sMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceDown_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_FaceUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceUp_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_FaceLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceLeft_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_FaceRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceRight_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sDirectionAnimFuncsBySpeed[])(u8) = { [MOVE_SPEED_NORMAL] = GetMoveDirectionAnimNum, [MOVE_SPEED_FAST_1] = GetMoveDirectionFastAnimNum, [MOVE_SPEED_FAST_2] = GetMoveDirectionFastAnimNum, [MOVE_SPEED_FASTER] = GetMoveDirectionFasterAnimNum, [MOVE_SPEED_FASTEST] = GetMoveDirectionFastestAnimNum, }; static bool8 (*const sMovementActionFuncs_WalkSlowestDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowestDown_Step0, MovementAction_WalkSlowestDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowestUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowestUp_Step0, MovementAction_WalkSlowestUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowestLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowestLeft_Step0, MovementAction_WalkSlowestLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowestRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowestRight_Step0, MovementAction_WalkSlowestRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowerDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowerDown_Step0, MovementAction_WalkSlowerDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowerUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowerUp_Step0, MovementAction_WalkSlowerUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowerLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowerLeft_Step0, MovementAction_WalkSlowerLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowerRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowerRight_Step0, MovementAction_WalkSlowerRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowUp_Step0, MovementAction_WalkSlowUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowDown_Step0, MovementAction_WalkSlowDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowLeft_Step0, MovementAction_WalkSlowLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkSlowRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkSlowRight_Step0, MovementAction_WalkSlowRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkNormalDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkNormalDown_Step0, MovementAction_WalkNormalDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkNormalUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkNormalUp_Step0, MovementAction_WalkNormalUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkNormalLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkNormalLeft_Step0, MovementAction_WalkNormalLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkNormalRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkNormalRight_Step0, MovementAction_WalkNormalRight_Step1, MovementAction_PauseSpriteAnim, }; static const s16 sJumpInitDisplacements[] = { [JUMP_DISTANCE_IN_PLACE] = 0, [JUMP_DISTANCE_NORMAL] = 1, [JUMP_DISTANCE_FAR] = 1, }; static const s16 sJumpDisplacements[] = { [JUMP_DISTANCE_IN_PLACE] = 0, [JUMP_DISTANCE_NORMAL] = 0, [JUMP_DISTANCE_FAR] = 1, }; static bool8 (*const sMovementActionFuncs_Jump2Down[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Jump2Down_Step0, MovementAction_Jump2Down_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_Jump2Up[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Jump2Up_Step0, MovementAction_Jump2Up_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_Jump2Left[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Jump2Left_Step0, MovementAction_Jump2Left_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_Jump2Right[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Jump2Right_Step0, MovementAction_Jump2Right_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_Delay1[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Delay1_Step0, MovementAction_Delay_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_Delay2[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Delay2_Step0, MovementAction_Delay_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_Delay4[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Delay4_Step0, MovementAction_Delay_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_Delay8[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Delay8_Step0, MovementAction_Delay_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_Delay16[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Delay16_Step0, MovementAction_Delay_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_WalkFastDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkFastDown_Step0, MovementAction_WalkFastDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkFastUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkFastUp_Step0, MovementAction_WalkFastUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkFastLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkFastLeft_Step0, MovementAction_WalkFastLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkFastRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkFastRight_Step0, MovementAction_WalkFastRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_GlideDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_GlideDown_Step0, MovementAction_GlideDown_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_GlideUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_GlideUp_Step0, MovementAction_GlideUp_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_GlideLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_GlideLeft_Step0, MovementAction_GlideLeft_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_GlideRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_GlideRight_Step0, MovementAction_GlideRight_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_FaceDownFast[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceDownFast_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_FaceUpFast[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceUpFast_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_FaceLeftFast[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceLeftFast_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_FaceRightFast[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceRightFast_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceSlowDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceSlowDown_Step0, MovementAction_WalkInPlaceSlow_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceSlowUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceSlowUp_Step0, MovementAction_WalkInPlaceSlow_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceSlowLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceSlowLeft_Step0, MovementAction_WalkInPlaceSlow_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceSlowRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceSlowRight_Step0, MovementAction_WalkInPlaceSlow_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceNormalDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceNormalDown_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceNormalUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceNormalUp_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceNormalLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceNormalLeft_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceNormalRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceNormalRight_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceFastDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceFastDown_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceFastUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceFastUp_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceFastLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceFastLeft_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceFastRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceFastRight_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceFasterDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceFasterDown_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceFasterUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceFasterUp_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceFasterLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceFasterLeft_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkInPlaceFasterRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkInPlaceFasterRight_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_RideWaterCurrentDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RideWaterCurrentDown_Step0, MovementAction_RideWaterCurrentDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_RideWaterCurrentUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RideWaterCurrentUp_Step0, MovementAction_RideWaterCurrentUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_RideWaterCurrentLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RideWaterCurrentLeft_Step0, MovementAction_RideWaterCurrentLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_RideWaterCurrentRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RideWaterCurrentRight_Step0, MovementAction_RideWaterCurrentRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkFasterDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkFasterDown_Step0, MovementAction_WalkFasterDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkFasterUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkFasterUp_Step0, MovementAction_WalkFasterUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkFasterLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkFasterLeft_Step0, MovementAction_WalkFasterLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkFasterRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkFasterRight_Step0, MovementAction_WalkFasterRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_SlideDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SlideDown_Step0, MovementAction_SlideDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_SlideUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SlideUp_Step0, MovementAction_SlideUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_SlideLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SlideLeft_Step0, MovementAction_SlideLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_SlideRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SlideRight_Step0, MovementAction_SlideRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_PlayerRunDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_PlayerRunDown_Step0, MovementAction_PlayerRunDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_PlayerRunUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_PlayerRunUp_Step0, MovementAction_PlayerRunUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_PlayerRunLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_PlayerRunLeft_Step0, MovementAction_PlayerRunLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_PlayerRunRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_PlayerRunRight_Step0, MovementAction_PlayerRunRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_PlayerRunDownSlow[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RunDownSlow_Step0, MovementAction_RunDownSlow_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_PlayerRunUpSlow[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RunUpSlow_Step0, MovementAction_RunUpSlow_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_PlayerRunLeftSlow[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RunLeftSlow_Step0, MovementAction_RunLeftSlow_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_PlayerRunRightSlow[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RunRightSlow_Step0, MovementAction_RunRightSlow_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_StartAnimInDirection[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_StartAnimInDirection_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpSpecialDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpSpecialDown_Step0, MovementAction_JumpSpecialDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpSpecialUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpSpecialUp_Step0, MovementAction_JumpSpecialUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpSpecialLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpSpecialLeft_Step0, MovementAction_JumpSpecialLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpSpecialRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpSpecialRight_Step0, MovementAction_JumpSpecialRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpSpecialWithEffectDown_Step0, MovementAction_JumpSpecialWithEffectDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpSpecialWithEffectUp_Step0, MovementAction_JumpSpecialWithEffectUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpSpecialWithEffectLeft_Step0, MovementAction_JumpSpecialWithEffectLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpSpecialWithEffectRight_Step0, MovementAction_JumpSpecialWithEffectRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_FacePlayer[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FacePlayer_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_FaceAwayPlayer[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceAwayPlayer_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_LockFacingDirection[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_LockFacingDirection_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_UnlockFacingDirection[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_UnlockFacingDirection_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpDown_Step0, MovementAction_JumpDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpUp_Step0, MovementAction_JumpUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpLeft_Step0, MovementAction_JumpLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpRight_Step0, MovementAction_JumpRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpInPlaceDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpInPlaceDown_Step0, MovementAction_JumpInPlaceDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpInPlaceUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpInPlaceUp_Step0, MovementAction_JumpInPlaceUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpInPlaceLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpInPlaceLeft_Step0, MovementAction_JumpInPlaceLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpInPlaceRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpInPlaceRight_Step0, MovementAction_JumpInPlaceRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpInPlaceDownUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpInPlaceDownUp_Step0, MovementAction_JumpInPlaceDownUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpInPlaceUpDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpInPlaceUpDown_Step0, MovementAction_JumpInPlaceUpDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpInPlaceLeftRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpInPlaceLeftRight_Step0, MovementAction_JumpInPlaceLeftRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_JumpInPlaceRightLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_JumpInPlaceRightLeft_Step0, MovementAction_JumpInPlaceRightLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_FaceOriginalDirection[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FaceOriginalDirection_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_NurseJoyBowDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_NurseJoyBowDown_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_EnableJumpLandingGroundEffect[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_EnableJumpLandingGroundEffect_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_DisableJumpLandingGroundEffect[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_DisableJumpLandingGroundEffect_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_DisableAnimation[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_DisableAnimation_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_RestoreAnimation[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RestoreAnimation_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_SetInvisible[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SetInvisible_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_SetVisible[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SetVisible_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_EmoteExclamationMark[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_EmoteExclamationMark_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_EmoteQuestionMark[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_EmoteQuestionMark_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_EmoteX[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_EmoteX_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_EmoteDoubleExclMark[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_EmoteDoubleExclamationMark_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_EmoteSmile[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_EmoteSmile_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_RevealTrainer[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RevealTrainer_Step0, MovementAction_RevealTrainer_Step1, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_RockSmashBreak[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RockSmashBreak_Step0, MovementAction_RockSmashBreak_Step1, MovementAction_RockSmashBreak_Step2, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_CutTree[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_CutTree_Step0, MovementAction_CutTree_Step1, MovementAction_CutTree_Step2, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_SetFixedPriority[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SetFixedPriority_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_ClearFixedPriority[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_ClearFixedPriority_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_InitAffineAnim[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_InitAffineAnim_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_ClearAffineAnim[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_ClearAffineAnim_Step0, MovementAction_Finish, }; static bool8 (*const sMovementActionFuncs_WalkDownStartAffine[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkDownStartAffine_Step0, MovementAction_WalkDownStartAffine_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_WalkDownAffine[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_WalkDownAffine_Step0, MovementAction_WalkDownAffine_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieFaceDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieFaceDown_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieFaceUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieFaceUp_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieFaceLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieFaceLeft_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieFaceRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieFaceRight_Step0, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroPopWheelieDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroPopWheelieDown_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroPopWheelieUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroPopWheelieUp_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroPopWheelieLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroPopWheelieLeft_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroPopWheelieRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroPopWheelieRight_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroEndWheelieFaceDown_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroEndWheelieFaceUp_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroEndWheelieFaceLeft_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroEndWheelieFaceRight_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const MovementActionFuncs_UnusedAcroActionDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_UnusedAcroActionDown_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const MovementActionFuncs_UnusedAcroActionUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_UnusedAcroActionUp_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const MovementActionFuncs_UnusedAcroActionLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_UnusedAcroActionLeft_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const MovementActionFuncs_UnusedAcroActionRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_UnusedAcroActionRight_Step0, MovementAction_WaitSpriteAnim, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieHopFaceDown_Step0, MovementAction_AcroWheelieHopFaceDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieHopFaceUp_Step0, MovementAction_AcroWheelieHopFaceUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieHopFaceLeft_Step0, MovementAction_AcroWheelieHopFaceLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieHopFaceRight_Step0, MovementAction_AcroWheelieHopFaceRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieHopDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieHopDown_Step0, MovementAction_AcroWheelieHopDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieHopUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieHopUp_Step0, MovementAction_AcroWheelieHopUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieHopLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieHopLeft_Step0, MovementAction_AcroWheelieHopLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieHopRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieHopRight_Step0, MovementAction_AcroWheelieHopRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieJumpDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieJumpDown_Step0, MovementAction_AcroWheelieJumpDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieJumpUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieJumpUp_Step0, MovementAction_AcroWheelieJumpUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieJumpLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieJumpLeft_Step0, MovementAction_AcroWheelieJumpLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieJumpRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieJumpRight_Step0, MovementAction_AcroWheelieJumpRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieInPlaceDown_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieInPlaceUp_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieInPlaceLeft_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieInPlaceRight_Step0, MovementAction_WalkInPlace_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroPopWheelieMoveDown_Step0, MovementAction_AcroPopWheelieMoveDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroPopWheelieMoveUp_Step0, MovementAction_AcroPopWheelieMoveUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroPopWheelieMoveLeft_Step0, MovementAction_AcroPopWheelieMoveLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroPopWheelieMoveRight_Step0, MovementAction_AcroPopWheelieMoveRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieMoveDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieMoveDown_Step0, MovementAction_AcroWheelieMoveDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieMoveUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieMoveUp_Step0, MovementAction_AcroWheelieMoveUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieMoveLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieMoveLeft_Step0, MovementAction_AcroWheelieMoveLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_AcroWheelieMoveRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_AcroWheelieMoveRight_Step0, MovementAction_AcroWheelieMoveRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_SpinDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SpinDown_Step0, MovementAction_SpinDown_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_SpinUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SpinUp_Step0, MovementAction_SpinUp_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_SpinLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SpinLeft_Step0, MovementAction_SpinLeft_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_SpinRight[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_SpinRight_Step0, MovementAction_SpinRight_Step1, MovementAction_PauseSpriteAnim, }; static bool8 (*const sMovementActionFuncs_RaiseHandAndStop[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RaiseHand_Step0, MovementAction_RaiseHandAndStop_Step1, }; static bool8 (*const sMovementActionFuncs_RaiseHandAndJump[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RaiseHand_Step0, MovementAction_RaiseHandAndJump_Step1, }; static bool8 (*const sMovementActionFuncs_RaiseHandAndSwim[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_RaiseHand_Step0, MovementAction_RaiseHandAndSwim_Step1, }; static bool8 (*const sMovementActionFuncs_ShakeHeadOrWalkInPlace[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_ShakeHeadOrWalkInPlace_Step0, MovementAction_ShakeHeadOrWalkInPlace_Step1, }; static bool8 (*const sMovementActionFuncs_FlyUp[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FlyUp_Step0, MovementAction_FlyUp_Step1, MovementAction_FlyUp_Step2, }; static bool8 (*const sMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_FlyDown_Step0, MovementAction_FlyDown_Step1, MovementAction_FlyUp_Step2, }; ================================================ FILE: src/data/object_events/movement_type_func_tables.h ================================================ static bool8 MovementType_WanderAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderAround_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderAround_Step5Slower(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderAround_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_LookAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_LookAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_LookAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_LookAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDirection_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDirection_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndUp_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndUp_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndUp_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceUpLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_FaceDownLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RotateCounterclockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RotateCounterclockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RotateCounterclockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RotateCounterclockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RotateClockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RotateClockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RotateClockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RotateClockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkBackAndForth_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkBackAndForth_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkBackAndForth_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkBackAndForth_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequence_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequence_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceUpRightLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceRightLeftDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceDownUpRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceLeftDownUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceUpLeftRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceLeftRightDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceDownUpLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceRightDownUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceLeftUpDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceUpDownRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceRightLeftUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceDownRightLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceRightUpDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceUpDownLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceLeftRightUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceDownLeftRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceUpLeftDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceDownRightUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceLeftDownRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceRightUpLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceUpRightDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceDownLeftUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceLeftUpRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkSequenceRightDownLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_CopyPlayer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_CopyPlayer_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 CopyablePlayerMovement_None(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); static bool8 CopyablePlayerMovement_FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); static bool8 CopyablePlayerMovement_GoSpeed0(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); static bool8 CopyablePlayerMovement_GoSpeed1(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); static bool8 CopyablePlayerMovement_GoSpeed2(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); static bool8 CopyablePlayerMovement_Slide(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); static bool8 cph_IM_DIFFERENT(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); static bool8 CopyablePlayerMovement_GoSpeed4(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); static bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); static bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_CopyPlayer_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_Buried_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_WalkInPlaceFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_JogInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_Invisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_Invisible_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_Invisible_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RaiseHandAndStop_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RaiseHandAndStop_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RaiseHandAndStop_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RaiseHandAndJump_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RaiseHandAndSwim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); static bool8 MovementType_RaiseHandAndMove_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); static u8 GetVectorDirection(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_SouthNorth(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_WestEast(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_WestNorth(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_EastNorth(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_WestSouth(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_EastSouth(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_SouthNorthWest(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_SouthNorthEast(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_NorthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy); static u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy); u8 (*const gMovementTypeFuncs_WanderAround[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WanderAround_Step0, MovementType_WanderAround_Step1, MovementType_WanderAround_Step2, MovementType_WanderAround_Step3, MovementType_WanderAround_Step4, MovementType_WanderAround_Step5, MovementType_WanderAround_Step6, }; u8 (*const gMovementTypeFuncs_WanderAroundSlower[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WanderAround_Step0, MovementType_WanderAround_Step1, MovementType_WanderAround_Step2, MovementType_WanderAround_Step3, MovementType_WanderAround_Step4, MovementType_WanderAround_Step5Slower, MovementType_WanderAround_Step6, }; const u8 gStandardDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST}; u8 (*const gGetVectorDirectionFuncs[])(s16, s16, s16, s16) = { GetVectorDirection, GetLimitedVectorDirection_SouthNorth, GetLimitedVectorDirection_WestEast, GetLimitedVectorDirection_WestNorth, GetLimitedVectorDirection_EastNorth, GetLimitedVectorDirection_WestSouth, GetLimitedVectorDirection_EastSouth, GetLimitedVectorDirection_SouthNorthWest, GetLimitedVectorDirection_SouthNorthEast, GetLimitedVectorDirection_NorthWestEast, GetLimitedVectorDirection_SouthWestEast, }; u8 (*const gMovementTypeFuncs_LookAround[])(struct ObjectEvent *, struct Sprite *) = { MovementType_LookAround_Step0, MovementType_LookAround_Step1, MovementType_LookAround_Step2, MovementType_LookAround_Step3, MovementType_LookAround_Step4, }; u8 (*const gMovementTypeFuncs_WanderUpAndDown[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WanderUpAndDown_Step0, MovementType_WanderUpAndDown_Step1, MovementType_WanderUpAndDown_Step2, MovementType_WanderUpAndDown_Step3, MovementType_WanderUpAndDown_Step4, MovementType_WanderUpAndDown_Step5, MovementType_WanderUpAndDown_Step6, }; const u8 gUpAndDownDirections[] = {DIR_SOUTH, DIR_NORTH}; u8 (*const gMovementTypeFuncs_WanderLeftAndRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WanderLeftAndRight_Step0, MovementType_WanderLeftAndRight_Step1, MovementType_WanderLeftAndRight_Step2, MovementType_WanderLeftAndRight_Step3, MovementType_WanderLeftAndRight_Step4, MovementType_WanderLeftAndRight_Step5, MovementType_WanderLeftAndRight_Step6, }; const u8 gLeftAndRightDirections[] = {DIR_WEST, DIR_EAST}; u8 (*const gMovementTypeFuncs_FaceDirection[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceDirection_Step0, MovementType_FaceDirection_Step1, MovementType_FaceDirection_Step2, }; u8 (*const gMovementTypeFuncs_FaceDownAndUp[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceDownAndUp_Step0, MovementType_FaceDownAndUp_Step1, MovementType_FaceDownAndUp_Step2, MovementType_FaceDownAndUp_Step3, MovementType_FaceDownAndUp_Step4, }; u8 (*const gMovementTypeFuncs_FaceLeftAndRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceLeftAndRight_Step0, MovementType_FaceLeftAndRight_Step1, MovementType_FaceLeftAndRight_Step2, MovementType_FaceLeftAndRight_Step3, MovementType_FaceLeftAndRight_Step4, }; u8 (*const gMovementTypeFuncs_FaceUpAndLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceUpAndLeft_Step0, MovementType_FaceUpAndLeft_Step1, MovementType_FaceUpAndLeft_Step2, MovementType_FaceUpAndLeft_Step3, MovementType_FaceUpAndLeft_Step4, }; const u8 gUpAndLeftDirections[] = {DIR_NORTH, DIR_WEST}; u8 (*const gMovementTypeFuncs_FaceUpAndRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceUpAndRight_Step0, MovementType_FaceUpAndRight_Step1, MovementType_FaceUpAndRight_Step2, MovementType_FaceUpAndRight_Step3, MovementType_FaceUpAndRight_Step4, }; const u8 gUpAndRightDirections[] = {DIR_NORTH, DIR_EAST}; u8 (*const gMovementTypeFuncs_FaceDownAndLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceDownAndLeft_Step0, MovementType_FaceDownAndLeft_Step1, MovementType_FaceDownAndLeft_Step2, MovementType_FaceDownAndLeft_Step3, MovementType_FaceDownAndLeft_Step4, }; const u8 gDownAndLeftDirections[] = {DIR_SOUTH, DIR_WEST}; u8 (*const gMovementTypeFuncs_FaceDownAndRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceDownAndRight_Step0, MovementType_FaceDownAndRight_Step1, MovementType_FaceDownAndRight_Step2, MovementType_FaceDownAndRight_Step3, MovementType_FaceDownAndRight_Step4, }; const u8 gDownAndRightDirections[] = {DIR_SOUTH, DIR_EAST}; u8 (*const gMovementTypeFuncs_FaceDownUpAndLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceDownUpAndLeft_Step0, MovementType_FaceDownUpAndLeft_Step1, MovementType_FaceDownUpAndLeft_Step2, MovementType_FaceDownUpAndLeft_Step3, MovementType_FaceDownUpAndLeft_Step4, }; const u8 gDownUpAndLeftDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_FaceDownUpAndRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceDownUpAndRight_Step0, MovementType_FaceDownUpAndRight_Step1, MovementType_FaceDownUpAndRight_Step2, MovementType_FaceDownUpAndRight_Step3, MovementType_FaceDownUpAndRight_Step4, }; const u8 gDownUpAndRightDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_FaceUpLeftAndRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceUpLeftAndRight_Step0, MovementType_FaceUpLeftAndRight_Step1, MovementType_FaceUpLeftAndRight_Step2, MovementType_FaceUpLeftAndRight_Step3, MovementType_FaceUpLeftAndRight_Step4, }; const u8 gUpLeftAndRightDirections[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_NORTH}; u8 (*const gMovementTypeFuncs_FaceDownLeftAndRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_FaceDownLeftAndRight_Step0, MovementType_FaceDownLeftAndRight_Step1, MovementType_FaceDownLeftAndRight_Step2, MovementType_FaceDownLeftAndRight_Step3, MovementType_FaceDownLeftAndRight_Step4, }; const u8 gDownLeftAndRightDirections[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_RotateCounterclockwise[])(struct ObjectEvent *, struct Sprite *) = { MovementType_RotateCounterclockwise_Step0, MovementType_RotateCounterclockwise_Step1, MovementType_RotateCounterclockwise_Step2, MovementType_RotateCounterclockwise_Step3, }; const u8 gCounterclockwiseDirections[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH}; u8 (*const gMovementTypeFuncs_RotateClockwise[])(struct ObjectEvent *, struct Sprite *) = { MovementType_RotateClockwise_Step0, MovementType_RotateClockwise_Step1, MovementType_RotateClockwise_Step2, MovementType_RotateClockwise_Step3, }; const u8 gClockwiseDirections[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_WalkBackAndForth[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkBackAndForth_Step0, MovementType_WalkBackAndForth_Step1, MovementType_WalkBackAndForth_Step2, MovementType_WalkBackAndForth_Step3, }; u8 (*const gMovementTypeFuncs_WalkSequenceUpRightLeftDown[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceUpRightLeftDown_Step1, MovementType_WalkSequence_Step2, }; const u8 gUpRightLeftDownDirections[] = {DIR_NORTH, DIR_EAST, DIR_WEST, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_WalkSequenceRightLeftDownUp[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceRightLeftDownUp_Step1, MovementType_WalkSequence_Step2, }; const u8 gRightLeftDownUpDirections[] = {DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH}; u8 (*const gMovementTypeFuncs_WalkSequenceDownUpRightLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceDownUpRightLeft_Step1, MovementType_WalkSequence_Step2, }; const u8 gDownUpRightLeftDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_WEST}; u8 (*const gMovementTypeFuncs_WalkSequenceLeftDownUpRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceLeftDownUpRight_Step1, MovementType_WalkSequence_Step2, }; const u8 gLeftDownUpRightDirections[] = {DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_EAST}; u8 (*const gMovementTypeFuncs_WalkSequenceUpLeftRightDown[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceUpLeftRightDown_Step1, MovementType_WalkSequence_Step2, }; const u8 gUpLeftRightDownDirections[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_WalkSequenceLeftRightDownUp[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceLeftRightDownUp_Step1, MovementType_WalkSequence_Step2, }; const u8 gLeftRightDownUpDirections[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH}; u8 (*const gMovementTypeFuncs_WalkSequenceDownUpLeftRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceDownUpLeftRight_Step1, MovementType_WalkSequence_Step2, }; u8 (*const gMovementTypeFuncs_WalkSequenceRightDownUpLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceRightDownUpLeft_Step1, MovementType_WalkSequence_Step2, }; const u8 gRightDownUpLeftDirections[] = {DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST}; u8 (*const gMovementTypeFuncs_WalkSequenceLeftUpDownRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceLeftUpDownRight_Step1, MovementType_WalkSequence_Step2, }; const u8 gLeftUpDownRightDirections[] = {DIR_WEST, DIR_NORTH, DIR_SOUTH, DIR_EAST}; u8 (*const gMovementTypeFuncs_WalkSequenceUpDownRightLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceUpDownRightLeft_Step1, MovementType_WalkSequence_Step2, }; const u8 gUpDownRightLeftDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_EAST, DIR_WEST}; u8 (*const gMovementTypeFuncs_WalkSequenceRightLeftUpDown[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceRightLeftUpDown_Step1, MovementType_WalkSequence_Step2, }; const u8 gRightLeftUpDownDirections[] = {DIR_EAST, DIR_WEST, DIR_NORTH, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_WalkSequenceDownRightLeftUp[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceDownRightLeftUp_Step1, MovementType_WalkSequence_Step2, }; const u8 gDownRightLeftUpDirections[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH}; u8 (*const gMovementTypeFuncs_WalkSequenceRightUpDownLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceRightUpDownLeft_Step1, MovementType_WalkSequence_Step2, }; const u8 gRightUpDownLeftDirections[] = {DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST}; u8 (*const gMovementTypeFuncs_WalkSequenceUpDownLeftRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceUpDownLeftRight_Step1, MovementType_WalkSequence_Step2, }; const u8 gUpDownLeftRightDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST}; u8 (*const gMovementTypeFuncs_WalkSequenceLeftRightUpDown[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceLeftRightUpDown_Step1, MovementType_WalkSequence_Step2, }; const u8 gLeftRightUpDownDirections[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_WalkSequenceDownLeftRightUp[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceDownLeftRightUp_Step1, MovementType_WalkSequence_Step2, }; const u8 gDownLeftRightUpDirections[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH}; u8 (*const gMovementTypeFuncs_WalkSequenceUpLeftDownRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceUpLeftDownRight_Step1, MovementType_WalkSequence_Step2, }; const u8 gUpLeftDownRightDirections[] = {DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST}; u8 (*const gMovementTypeFuncs_WalkSequenceDownRightUpLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceDownRightUpLeft_Step1, MovementType_WalkSequence_Step2, }; const u8 gDownRightUpLeftDirections[] = {DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST}; u8 (*const gMovementTypeFuncs_WalkSequenceLeftDownRightUp[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceLeftDownRightUp_Step1, MovementType_WalkSequence_Step2, }; const u8 gLeftDownRightUpDirections[] = {DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_NORTH}; u8 (*const gMovementTypeFuncs_WalkSequenceRightUpLeftDown[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceRightUpLeftDown_Step1, MovementType_WalkSequence_Step2, }; const u8 gRightUpLeftDownDirections[] = {DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_WalkSequenceUpRightDownLeft[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceUpRightDownLeft_Step1, MovementType_WalkSequence_Step2, }; const u8 gUpRightDownLeftDirections[] = {DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST}; u8 (*const gMovementTypeFuncs_WalkSequenceDownLeftUpRight[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceDownLeftUpRight_Step1, MovementType_WalkSequence_Step2, }; const u8 gDownLeftUpRightDirections[] = {DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_EAST}; u8 (*const gMovementTypeFuncs_WalkSequenceLeftUpRightDown[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceLeftUpRightDown_Step1, MovementType_WalkSequence_Step2, }; const u8 gLeftUpRightDownDirections[] = {DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH}; u8 (*const gMovementTypeFuncs_WalkSequenceRightDownLeftUp[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkSequence_Step0, MovementType_WalkSequenceRightDownLeftUp_Step1, MovementType_WalkSequence_Step2, }; const u8 gRightDownLeftUpDirections[] = {DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH}; u8 (*const gMovementTypeFuncs_CopyPlayer[])(struct ObjectEvent *, struct Sprite *) = { MovementType_CopyPlayer_Step0, MovementType_CopyPlayer_Step1, MovementType_CopyPlayer_Step2, }; bool8 (*const gCopyPlayerMovementFuncs[])(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)) = { CopyablePlayerMovement_None, CopyablePlayerMovement_FaceDirection, CopyablePlayerMovement_GoSpeed0, CopyablePlayerMovement_GoSpeed1, CopyablePlayerMovement_GoSpeed2, CopyablePlayerMovement_Slide, cph_IM_DIFFERENT, CopyablePlayerMovement_GoSpeed4, CopyablePlayerMovement_Jump, CopyablePlayerMovement_None, CopyablePlayerMovement_None, }; u8 (*const gMovementTypeFuncs_CopyPlayerInGrass[])(struct ObjectEvent *, struct Sprite *) = { MovementType_CopyPlayer_Step0, MovementType_CopyPlayerInGrass_Step1, MovementType_CopyPlayer_Step2, }; u8 (*const gMovementTypeFuncs_Buried[])(struct ObjectEvent *, struct Sprite *) = { MovementType_Buried_Step0, }; u8 (*const gMovementTypeFuncs_WalkInPlace[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkInPlace_Step0, MovementType_MoveInPlace_Step1, }; u8 (*const gMovementTypeFuncs_WalkInPlaceFast[])(struct ObjectEvent *, struct Sprite *) = { MovementType_WalkInPlaceFast_Step0, MovementType_MoveInPlace_Step1, }; u8 (*const gMovementTypeFuncs_JogInPlace[])(struct ObjectEvent *, struct Sprite *) = { MovementType_JogInPlace_Step0, MovementType_MoveInPlace_Step1, }; u8 (*const gMovementTypeFuncs_Invisible[])(struct ObjectEvent *, struct Sprite *) = { MovementType_Invisible_Step0, MovementType_Invisible_Step1, MovementType_Invisible_Step2, }; u8 (*const gMovementTypeFuncs_RaiseHandAndStop[])(struct ObjectEvent *, struct Sprite *) = { MovementType_RaiseHandAndStop_Step0, MovementType_RaiseHandAndStop_Step1, MovementType_RaiseHandAndStop_Step2, }; u8 (*const gMovementTypeFuncs_RaiseHandAndJump[])(struct ObjectEvent *, struct Sprite *) = { MovementType_RaiseHandAndJump_Step0, MovementType_RaiseHandAndMove_Step1, }; u8 (*const gMovementTypeFuncs_RaiseHandAndSwim[])(struct ObjectEvent *, struct Sprite *) = { MovementType_RaiseHandAndSwim_Step0, MovementType_RaiseHandAndMove_Step1, }; ================================================ FILE: src/data/object_events/object_event_anims.h ================================================ static const union AnimCmd sAnim_StayStill[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpFaceSouth[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpFaceNorth[] = { ANIMCMD_FRAME(1, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpFaceWest[] = { ANIMCMD_FRAME(2, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpFaceEast[] = { ANIMCMD_FRAME(2, 16, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoSouth[] = { ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(3, 8, .hFlip = TRUE), ANIMCMD_FRAME(0, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoNorth[] = { ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(4, 8, .hFlip = TRUE), ANIMCMD_FRAME(1, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoWest[] = { ANIMCMD_FRAME(5, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(6, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoEast[] = { ANIMCMD_FRAME(5, 8, .hFlip = TRUE), ANIMCMD_FRAME(2, 8, .hFlip = TRUE), ANIMCMD_FRAME(6, 8, .hFlip = TRUE), ANIMCMD_FRAME(2, 8, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFastSouth[] = { ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(3, 4, .hFlip = TRUE), ANIMCMD_FRAME(0, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFastNorth[] = { ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(4, 4, .hFlip = TRUE), ANIMCMD_FRAME(1, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFastWest[] = { ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(6, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFastEast[] = { ANIMCMD_FRAME(5, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_FRAME(6, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFasterSouth[] = { ANIMCMD_FRAME(3, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(3, 2, .hFlip = TRUE), ANIMCMD_FRAME(0, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFasterNorth[] = { ANIMCMD_FRAME(4, 2), ANIMCMD_FRAME(1, 2), ANIMCMD_FRAME(4, 2, .hFlip = TRUE), ANIMCMD_FRAME(1, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFasterWest[] = { ANIMCMD_FRAME(5, 2), ANIMCMD_FRAME(2, 2), ANIMCMD_FRAME(6, 2), ANIMCMD_FRAME(2, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFasterEast[] = { ANIMCMD_FRAME(5, 2, .hFlip = TRUE), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), ANIMCMD_FRAME(6, 2, .hFlip = TRUE), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFastestSouth[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(3, 1, .hFlip = TRUE), ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFastestNorth[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_FRAME(1, 1), ANIMCMD_FRAME(4, 1, .hFlip = TRUE), ANIMCMD_FRAME(1, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFastestWest[] = { ANIMCMD_FRAME(5, 1), ANIMCMD_FRAME(2, 1), ANIMCMD_FRAME(6, 1), ANIMCMD_FRAME(2, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_QuintyPlumpGoFastestEast[] = { ANIMCMD_FRAME(5, 1, .hFlip = TRUE), ANIMCMD_FRAME(2, 1, .hFlip = TRUE), ANIMCMD_FRAME(6, 1, .hFlip = TRUE), ANIMCMD_FRAME(2, 1, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_FaceSouth[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_FaceNorth[] = { ANIMCMD_FRAME(1, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_FaceWest[] = { ANIMCMD_FRAME(2, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_FaceEast[] = { ANIMCMD_FRAME(2, 16, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoSouth[] = { ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoNorth[] = { ANIMCMD_FRAME(5, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(6, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoWest[] = { ANIMCMD_FRAME(7, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(8, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoEast[] = { ANIMCMD_FRAME(7, 8, .hFlip = TRUE), ANIMCMD_FRAME(2, 8, .hFlip = TRUE), ANIMCMD_FRAME(8, 8, .hFlip = TRUE), ANIMCMD_FRAME(2, 8, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFastSouth[] = { ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFastNorth[] = { ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(6, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFastWest[] = { ANIMCMD_FRAME(7, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFastEast[] = { ANIMCMD_FRAME(7, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_FRAME(8, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFasterSouth[] = { ANIMCMD_FRAME(3, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(4, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFasterNorth[] = { ANIMCMD_FRAME(5, 2), ANIMCMD_FRAME(1, 2), ANIMCMD_FRAME(6, 2), ANIMCMD_FRAME(1, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFasterWest[] = { ANIMCMD_FRAME(7, 2), ANIMCMD_FRAME(2, 2), ANIMCMD_FRAME(8, 2), ANIMCMD_FRAME(2, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFasterEast[] = { ANIMCMD_FRAME(7, 2, .hFlip = TRUE), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), ANIMCMD_FRAME(8, 2, .hFlip = TRUE), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFastestSouth[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(4, 1), ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFastestNorth[] = { ANIMCMD_FRAME(5, 1), ANIMCMD_FRAME(1, 1), ANIMCMD_FRAME(6, 1), ANIMCMD_FRAME(1, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFastestWest[] = { ANIMCMD_FRAME(7, 1), ANIMCMD_FRAME(2, 1), ANIMCMD_FRAME(8, 1), ANIMCMD_FRAME(2, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoFastestEast[] = { ANIMCMD_FRAME(7, 1, .hFlip = TRUE), ANIMCMD_FRAME(2, 1, .hFlip = TRUE), ANIMCMD_FRAME(8, 1, .hFlip = TRUE), ANIMCMD_FRAME(2, 1, .hFlip = TRUE), ANIMCMD_JUMP(0), }; // For indicating a VS Seeker rematch static const union AnimCmd sAnim_RaiseHand[] = { ANIMCMD_FRAME(9, 0), ANIMCMD_END, }; static const union AnimCmd sAnim_HoOhFlapWings[] = { ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_HoOhStayStill[] = { ANIMCMD_FRAME(3, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_SurfFaceSouth[] = { ANIMCMD_FRAME(0, 60), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_SurfFaceNorth[] = { ANIMCMD_FRAME(1, 60), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_SurfFaceWest[] = { ANIMCMD_FRAME(2, 60), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_SurfFaceEast[] = { ANIMCMD_FRAME(2, 60, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownFaceSouth[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownFaceNorth[] = { ANIMCMD_FRAME(1, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownFaceWest[] = { ANIMCMD_FRAME(2, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownFaceEast[] = { ANIMCMD_FRAME(2, 16, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoSouth[] = { ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(6, 4), ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoNorth[] = { ANIMCMD_FRAME(7, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(7, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(9, 4), ANIMCMD_FRAME(10, 4), ANIMCMD_FRAME(9, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoWest[] = { ANIMCMD_FRAME(11, 4), ANIMCMD_FRAME(12, 4), ANIMCMD_FRAME(11, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(13, 4), ANIMCMD_FRAME(14, 4), ANIMCMD_FRAME(13, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoEast[] = { ANIMCMD_FRAME(11, 4, .hFlip = TRUE), ANIMCMD_FRAME(12, 4, .hFlip = TRUE), ANIMCMD_FRAME(11, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_FRAME(13, 4, .hFlip = TRUE), ANIMCMD_FRAME(14, 4, .hFlip = TRUE), ANIMCMD_FRAME(13, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFastNorth[] = { ANIMCMD_FRAME(3, 2), ANIMCMD_FRAME(4, 2), ANIMCMD_FRAME(3, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(5, 2), ANIMCMD_FRAME(6, 2), ANIMCMD_FRAME(5, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFastSouth[] = { ANIMCMD_FRAME(7, 2), ANIMCMD_FRAME(8, 2), ANIMCMD_FRAME(7, 2), ANIMCMD_FRAME(1, 2), ANIMCMD_FRAME(9, 2), ANIMCMD_FRAME(10, 2), ANIMCMD_FRAME(9, 2), ANIMCMD_FRAME(1, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFastWest[] = { ANIMCMD_FRAME(11, 2), ANIMCMD_FRAME(12, 2), ANIMCMD_FRAME(11, 2), ANIMCMD_FRAME(2, 2), ANIMCMD_FRAME(13, 2), ANIMCMD_FRAME(14, 2), ANIMCMD_FRAME(13, 2), ANIMCMD_FRAME(2, 2), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFastEast[] = { ANIMCMD_FRAME(11, 2, .hFlip = TRUE), ANIMCMD_FRAME(12, 2, .hFlip = TRUE), ANIMCMD_FRAME(11, 2, .hFlip = TRUE), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), ANIMCMD_FRAME(13, 2, .hFlip = TRUE), ANIMCMD_FRAME(14, 2, .hFlip = TRUE), ANIMCMD_FRAME(13, 2, .hFlip = TRUE), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFasterNorth[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_FRAME(4, 1), ANIMCMD_FRAME(3, 1), ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(5, 1), ANIMCMD_FRAME(6, 1), ANIMCMD_FRAME(5, 1), ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFasterSouth[] = { ANIMCMD_FRAME(7, 1), ANIMCMD_FRAME(8, 1), ANIMCMD_FRAME(7, 1), ANIMCMD_FRAME(1, 1), ANIMCMD_FRAME(9, 1), ANIMCMD_FRAME(10, 1), ANIMCMD_FRAME(9, 1), ANIMCMD_FRAME(1, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFasterWest[] = { ANIMCMD_FRAME(11, 1), ANIMCMD_FRAME(12, 1), ANIMCMD_FRAME(11, 1), ANIMCMD_FRAME(2, 1), ANIMCMD_FRAME(13, 1), ANIMCMD_FRAME(14, 1), ANIMCMD_FRAME(13, 1), ANIMCMD_FRAME(2, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFasterEast[] = { ANIMCMD_FRAME(11, 1, .hFlip = TRUE), ANIMCMD_FRAME(12, 1, .hFlip = TRUE), ANIMCMD_FRAME(11, 1, .hFlip = TRUE), ANIMCMD_FRAME(2, 1, .hFlip = TRUE), ANIMCMD_FRAME(13, 1, .hFlip = TRUE), ANIMCMD_FRAME(14, 1, .hFlip = TRUE), ANIMCMD_FRAME(13, 1, .hFlip = TRUE), ANIMCMD_FRAME(2, 1, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFastestNorth[] = { ANIMCMD_FRAME(3, 0), ANIMCMD_FRAME(4, 0), ANIMCMD_FRAME(3, 0), ANIMCMD_FRAME(0, 0), ANIMCMD_FRAME(5, 0), ANIMCMD_FRAME(6, 0), ANIMCMD_FRAME(5, 0), ANIMCMD_FRAME(0, 0), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFastestSouth[] = { ANIMCMD_FRAME(7, 0), ANIMCMD_FRAME(8, 0), ANIMCMD_FRAME(7, 0), ANIMCMD_FRAME(1, 0), ANIMCMD_FRAME(9, 0), ANIMCMD_FRAME(10, 0), ANIMCMD_FRAME(9, 0), ANIMCMD_FRAME(1, 0), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFastestWest[] = { ANIMCMD_FRAME(11, 0), ANIMCMD_FRAME(12, 0), ANIMCMD_FRAME(11, 0), ANIMCMD_FRAME(2, 0), ANIMCMD_FRAME(13, 0), ANIMCMD_FRAME(14, 0), ANIMCMD_FRAME(13, 0), ANIMCMD_FRAME(2, 0), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_UnknownGoFastestEast[] = { ANIMCMD_FRAME(11, 0, .hFlip = TRUE), ANIMCMD_FRAME(12, 0, .hFlip = TRUE), ANIMCMD_FRAME(11, 0, .hFlip = TRUE), ANIMCMD_FRAME(2, 0, .hFlip = TRUE), ANIMCMD_FRAME(13, 0, .hFlip = TRUE), ANIMCMD_FRAME(14, 0, .hFlip = TRUE), ANIMCMD_FRAME(13, 0, .hFlip = TRUE), ANIMCMD_FRAME(2, 0, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_SpinSouth[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), ANIMCMD_FRAME(1, 2), ANIMCMD_FRAME(2, 2), ANIMCMD_LOOP(1), ANIMCMD_END, }; static const union AnimCmd sAnim_SpinNorth[] = { ANIMCMD_FRAME(1, 2), ANIMCMD_FRAME(2, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), ANIMCMD_LOOP(1), ANIMCMD_END, }; static const union AnimCmd sAnim_SpinWest[] = { ANIMCMD_FRAME(2, 2, .hFlip = TRUE), // Starts by facing East? ANIMCMD_FRAME(1, 2), ANIMCMD_FRAME(2, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_LOOP(1), ANIMCMD_END, }; static const union AnimCmd sAnim_SpinEast[] = { ANIMCMD_FRAME(2, 2), // Starts by facing West? ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), ANIMCMD_FRAME(1, 2), ANIMCMD_LOOP(1), ANIMCMD_END, }; static const union AnimCmd sAnim_ShakeHeadOrWalkInPlace[] = { ANIMCMD_FRAME(18, 16), ANIMCMD_FRAME(0, 16), ANIMCMD_FRAME(19, 16), ANIMCMD_FRAME(0, 32), ANIMCMD_LOOP(1), ANIMCMD_END, }; static const union AnimCmd sAnim_RunSouth[] = { ANIMCMD_FRAME(9, 5), ANIMCMD_FRAME(10, 3), ANIMCMD_FRAME(9, 5), ANIMCMD_FRAME(11, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_RunNorth[] = { ANIMCMD_FRAME(12, 5), ANIMCMD_FRAME(13, 3), ANIMCMD_FRAME(12, 5), ANIMCMD_FRAME(14, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_RunWest[] = { ANIMCMD_FRAME(15, 5), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(15, 5), ANIMCMD_FRAME(17, 3), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_RunEast[] = { ANIMCMD_FRAME(15, 5, .hFlip = TRUE), ANIMCMD_FRAME(16, 3, .hFlip = TRUE), ANIMCMD_FRAME(15, 5, .hFlip = TRUE), ANIMCMD_FRAME(17, 3, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_FieldMove[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(4, 8), ANIMCMD_END, }; static const union AnimCmd sAnim_VSSeeker[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(6, 4), ANIMCMD_LOOP(0), ANIMCMD_FRAME(7, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_LOOP(6), ANIMCMD_FRAME(6, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_VSSeekerBike[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_LOOP(0), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(5, 4), ANIMCMD_LOOP(6), ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_GetOnOffSurfSouth[] = { ANIMCMD_FRAME(9, 32), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GetOnOffSurfNorth[] = { ANIMCMD_FRAME(10, 32), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GetOnOffSurfWest[] = { ANIMCMD_FRAME(11, 32), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GetOnOffSurfEast[] = { ANIMCMD_FRAME(11, 32, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_BunnyHopBackWheelSouth[] = { ANIMCMD_FRAME(15, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_BunnyHopBackWheelNorth[] = { ANIMCMD_FRAME(19, 4), ANIMCMD_FRAME(20, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_BunnyHopBackWheelWest[] = { ANIMCMD_FRAME(23, 4), ANIMCMD_FRAME(24, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_BunnyHopBackWheelEast[] = { ANIMCMD_FRAME(23, 4, .hFlip = TRUE), ANIMCMD_FRAME(24, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_BunnyHopFrontWheelSouth[] = { ANIMCMD_FRAME(17, 4), ANIMCMD_FRAME(18, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_BunnyHopFrontWheelNorth[] = { ANIMCMD_FRAME(21, 4), ANIMCMD_FRAME(22, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_BunnyHopFrontWheelWest[] = { ANIMCMD_FRAME(25, 4), ANIMCMD_FRAME(26, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_BunnyHopFrontWheelEast[] = { ANIMCMD_FRAME(25, 4, .hFlip = TRUE), ANIMCMD_FRAME(26, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_StandingWheelieBackWheelSouth[] = { ANIMCMD_FRAME(15, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_StandingWheelieBackWheelNorth[] = { ANIMCMD_FRAME(19, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_StandingWheelieBackWheelWest[] = { ANIMCMD_FRAME(23, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_StandingWheelieBackWheelEast[] = { ANIMCMD_FRAME(23, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_StandingWheelieFrontWheelSouth[] = { ANIMCMD_FRAME(17, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_StandingWheelieFrontWheelNorth[] = { ANIMCMD_FRAME(21, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_StandingWheelieFrontWheelWest[] = { ANIMCMD_FRAME(25, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_StandingWheelieFrontWheelEast[] = { ANIMCMD_FRAME(25, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_MovingWheelieSouth[] = { ANIMCMD_FRAME(27, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(28, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_MovingWheelieNorth[] = { ANIMCMD_FRAME(29, 4), ANIMCMD_FRAME(20, 4), ANIMCMD_FRAME(30, 4), ANIMCMD_FRAME(20, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_MovingWheelieWest[] = { ANIMCMD_FRAME(31, 4), ANIMCMD_FRAME(24, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(24, 4), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_MovingWheelieEast[] = { ANIMCMD_FRAME(31, 4, .hFlip = TRUE), ANIMCMD_FRAME(24, 4, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .hFlip = TRUE), ANIMCMD_FRAME(24, 4, .hFlip = TRUE), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_BerryTreeStage0[] = { ANIMCMD_FRAME(0, 32), ANIMCMD_END, }; static const union AnimCmd sAnim_BerryTreeStage1[] = { ANIMCMD_FRAME(1, 32), ANIMCMD_FRAME(2, 32), ANIMCMD_END, }; static const union AnimCmd sAnim_BerryTreeStage2[] = { ANIMCMD_FRAME(3, 48), ANIMCMD_FRAME(4, 48), ANIMCMD_END, }; static const union AnimCmd sAnim_BerryTreeStage3[] = { ANIMCMD_FRAME(5, 32), ANIMCMD_FRAME(5, 32), ANIMCMD_FRAME(6, 32), ANIMCMD_FRAME(6, 32), ANIMCMD_END, }; static const union AnimCmd sAnim_BerryTreeStage4[] = { ANIMCMD_FRAME(7, 48), ANIMCMD_FRAME(7, 48), ANIMCMD_FRAME(8, 48), ANIMCMD_FRAME(8, 48), ANIMCMD_END, }; static const union AnimCmd sAnim_NurseBow[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(9, 32), ANIMCMD_FRAME(0, 8), ANIMCMD_END, }; static const union AnimCmd sAnim_RockBreak[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(3, 8), ANIMCMD_END, }; static const union AnimCmd sAnim_TreeCut[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(1, 6), ANIMCMD_FRAME(2, 6), ANIMCMD_FRAME(3, 6), ANIMCMD_END, }; static const union AnimCmd sAnim_TakeOutRodSouth[] = { ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(9, 4), ANIMCMD_FRAME(10, 4), ANIMCMD_FRAME(11, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_TakeOutRodNorth[] = { ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(6, 4), ANIMCMD_FRAME(7, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_TakeOutRodWest[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_TakeOutRodEast[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(1, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_FRAME(3, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_PutAwayRodSouth[] = { ANIMCMD_FRAME(11, 4), ANIMCMD_FRAME(10, 6), ANIMCMD_FRAME(9, 6), ANIMCMD_FRAME(8, 6), ANIMCMD_END, }; static const union AnimCmd sAnim_PutAwayRodNorth[] = { ANIMCMD_FRAME(7, 4), ANIMCMD_FRAME(6, 6), ANIMCMD_FRAME(5, 6), ANIMCMD_FRAME(4, 6), ANIMCMD_END, }; static const union AnimCmd sAnim_PutAwayRodWest[] = { ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd sAnim_PutAwayRodEast[] = { ANIMCMD_FRAME(3, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_FRAME(1, 4, .hFlip = TRUE), ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd sAnim_HookedPokemonSouth[] = { ANIMCMD_FRAME(10, 6), ANIMCMD_FRAME(11, 6), ANIMCMD_LOOP(1), ANIMCMD_FRAME(11, 30), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_HookedPokemonNorth[] = { ANIMCMD_FRAME(6, 6), ANIMCMD_FRAME(7, 6), ANIMCMD_LOOP(1), ANIMCMD_FRAME(7, 30), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_HookedPokemonWest[] = { ANIMCMD_FRAME(2, 6), ANIMCMD_FRAME(3, 6), ANIMCMD_LOOP(1), ANIMCMD_FRAME(3, 30), ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_HookedPokemonEast[] = { ANIMCMD_FRAME(2, 6, .hFlip = TRUE), ANIMCMD_FRAME(3, 6, .hFlip = TRUE), ANIMCMD_LOOP(1), ANIMCMD_FRAME(3, 30, .hFlip = TRUE), ANIMCMD_JUMP(0), }; // Unused static const union AffineAnimCmd sAffineAnim_KyogreGroudon_GoSouthStart[] = { AFFINEANIMCMD_FRAME(0, 0, 1, 1), AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_LOOP(7), AFFINEANIMCMD_JUMP(0), }; // Unused static const union AffineAnimCmd sAffineAnim_KyogreGroudon_GoSouth[] = { AFFINEANIMCMD_FRAME(0, 0, -1, 1), AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_LOOP(15), AFFINEANIMCMD_FRAME(0, 0, 1, 1), AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_LOOP(15), AFFINEANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnimTable_Inanimate[] = { [ANIM_STAY_STILL] = sAnim_StayStill }; // Leftover from Ruby/Sapphire static const union AnimCmd *const sAnimTable_QuintyPlump[] = { [ANIM_STD_FACE_SOUTH] = sAnim_QuintyPlumpFaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_QuintyPlumpFaceNorth, [ANIM_STD_FACE_WEST] = sAnim_QuintyPlumpFaceWest, [ANIM_STD_FACE_EAST] = sAnim_QuintyPlumpFaceEast, [ANIM_STD_GO_SOUTH] = sAnim_QuintyPlumpGoSouth, [ANIM_STD_GO_NORTH] = sAnim_QuintyPlumpGoNorth, [ANIM_STD_GO_WEST] = sAnim_QuintyPlumpGoWest, [ANIM_STD_GO_EAST] = sAnim_QuintyPlumpGoEast, [ANIM_STD_GO_FAST_SOUTH] = sAnim_QuintyPlumpGoFastSouth, [ANIM_STD_GO_FAST_NORTH] = sAnim_QuintyPlumpGoFastNorth, [ANIM_STD_GO_FAST_WEST] = sAnim_QuintyPlumpGoFastWest, [ANIM_STD_GO_FAST_EAST] = sAnim_QuintyPlumpGoFastEast, [ANIM_STD_GO_FASTER_SOUTH] = sAnim_QuintyPlumpGoFasterSouth, [ANIM_STD_GO_FASTER_NORTH] = sAnim_QuintyPlumpGoFasterNorth, [ANIM_STD_GO_FASTER_WEST] = sAnim_QuintyPlumpGoFasterWest, [ANIM_STD_GO_FASTER_EAST] = sAnim_QuintyPlumpGoFasterEast, [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_QuintyPlumpGoFastestSouth, [ANIM_STD_GO_FASTEST_NORTH] = sAnim_QuintyPlumpGoFastestNorth, [ANIM_STD_GO_FASTEST_WEST] = sAnim_QuintyPlumpGoFastestWest, [ANIM_STD_GO_FASTEST_EAST] = sAnim_QuintyPlumpGoFastestEast, }; static const union AnimCmd *const sAnimTable_Standard[] = { [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, [ANIM_STD_FACE_WEST] = sAnim_FaceWest, [ANIM_STD_FACE_EAST] = sAnim_FaceEast, [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, [ANIM_STD_GO_NORTH] = sAnim_GoNorth, [ANIM_STD_GO_WEST] = sAnim_GoWest, [ANIM_STD_GO_EAST] = sAnim_GoEast, [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, [ANIM_RAISE_HAND] = sAnim_RaiseHand, }; static const union AnimCmd *const sAnimTable_HoOh[] = { [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, [ANIM_STD_FACE_WEST] = sAnim_FaceWest, [ANIM_STD_FACE_EAST] = sAnim_FaceEast, [ANIM_STD_GO_SOUTH] = sAnim_HoOhFlapWings, [ANIM_STD_GO_NORTH] = sAnim_HoOhStayStill, [ANIM_STD_GO_WEST] = sAnim_GoWest, [ANIM_STD_GO_EAST] = sAnim_GoEast, [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, [ANIM_RAISE_HAND] = sAnim_RaiseHand, }; static const union AnimCmd *const sAnimTable_Unknown[] = { [ANIM_STD_FACE_SOUTH] = sAnim_UnknownFaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_UnknownFaceNorth, [ANIM_STD_FACE_WEST] = sAnim_UnknownFaceWest, [ANIM_STD_FACE_EAST] = sAnim_UnknownFaceEast, [ANIM_STD_GO_SOUTH] = sAnim_UnknownGoSouth, [ANIM_STD_GO_NORTH] = sAnim_UnknownGoNorth, [ANIM_STD_GO_WEST] = sAnim_UnknownGoWest, [ANIM_STD_GO_EAST] = sAnim_UnknownGoEast, [ANIM_STD_GO_FAST_SOUTH] = sAnim_UnknownGoFastNorth, [ANIM_STD_GO_FAST_NORTH] = sAnim_UnknownGoFastSouth, [ANIM_STD_GO_FAST_WEST] = sAnim_UnknownGoFastWest, [ANIM_STD_GO_FAST_EAST] = sAnim_UnknownGoFastEast, [ANIM_STD_GO_FASTER_SOUTH] = sAnim_UnknownGoFasterNorth, [ANIM_STD_GO_FASTER_NORTH] = sAnim_UnknownGoFasterSouth, [ANIM_STD_GO_FASTER_WEST] = sAnim_UnknownGoFasterWest, [ANIM_STD_GO_FASTER_EAST] = sAnim_UnknownGoFasterEast, [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_UnknownGoFastestNorth, [ANIM_STD_GO_FASTEST_NORTH] = sAnim_UnknownGoFastestSouth, [ANIM_STD_GO_FASTEST_WEST] = sAnim_UnknownGoFastestWest, [ANIM_STD_GO_FASTEST_EAST] = sAnim_UnknownGoFastestEast, [ANIM_RUN_SOUTH] = sAnim_RunSouth, [ANIM_RUN_NORTH] = sAnim_RunNorth, [ANIM_RUN_WEST] = sAnim_RunWest, [ANIM_RUN_EAST] = sAnim_RunEast, }; static const union AnimCmd *const sAnimTable_RedGreenNormal[] = { [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, [ANIM_STD_FACE_WEST] = sAnim_FaceWest, [ANIM_STD_FACE_EAST] = sAnim_FaceEast, [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, [ANIM_STD_GO_NORTH] = sAnim_GoNorth, [ANIM_STD_GO_WEST] = sAnim_GoWest, [ANIM_STD_GO_EAST] = sAnim_GoEast, [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, [ANIM_RUN_SOUTH] = sAnim_RunSouth, [ANIM_RUN_NORTH] = sAnim_RunNorth, [ANIM_RUN_WEST] = sAnim_RunWest, [ANIM_RUN_EAST] = sAnim_RunEast, [ANIM_SPIN_SOUTH] = sAnim_SpinSouth, [ANIM_SPIN_NORTH] = sAnim_SpinNorth, [ANIM_SPIN_WEST] = sAnim_SpinWest, [ANIM_SPIN_EAST] = sAnim_SpinEast, [ANIM_SHAKE_HEAD_OR_WALK_IN_PLACE] = sAnim_ShakeHeadOrWalkInPlace, }; // Leftover from Ruby/Sapphire static const union AnimCmd *const sAnimTable_AcroBike[] = { [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, [ANIM_STD_FACE_WEST] = sAnim_FaceWest, [ANIM_STD_FACE_EAST] = sAnim_FaceEast, [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, [ANIM_STD_GO_NORTH] = sAnim_GoNorth, [ANIM_STD_GO_WEST] = sAnim_GoWest, [ANIM_STD_GO_EAST] = sAnim_GoEast, [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, [ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH] = sAnim_BunnyHopBackWheelSouth, [ANIM_BUNNY_HOP_BACK_WHEEL_NORTH] = sAnim_BunnyHopBackWheelNorth, [ANIM_BUNNY_HOP_BACK_WHEEL_WEST] = sAnim_BunnyHopBackWheelWest, [ANIM_BUNNY_HOP_BACK_WHEEL_EAST] = sAnim_BunnyHopBackWheelEast, [ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH] = sAnim_BunnyHopFrontWheelSouth, [ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH] = sAnim_BunnyHopFrontWheelNorth, [ANIM_BUNNY_HOP_FRONT_WHEEL_WEST] = sAnim_BunnyHopFrontWheelWest, [ANIM_BUNNY_HOP_FRONT_WHEEL_EAST] = sAnim_BunnyHopFrontWheelEast, [ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH] = sAnim_StandingWheelieBackWheelSouth, [ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH] = sAnim_StandingWheelieBackWheelNorth, [ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST] = sAnim_StandingWheelieBackWheelWest, [ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST] = sAnim_StandingWheelieBackWheelEast, [ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH] = sAnim_StandingWheelieFrontWheelSouth, [ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH] = sAnim_StandingWheelieFrontWheelNorth, [ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST] = sAnim_StandingWheelieFrontWheelWest, [ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST] = sAnim_StandingWheelieFrontWheelEast, [ANIM_MOVING_WHEELIE_SOUTH] = sAnim_MovingWheelieSouth, [ANIM_MOVING_WHEELIE_NORTH] = sAnim_MovingWheelieNorth, [ANIM_MOVING_WHEELIE_WEST] = sAnim_MovingWheelieWest, [ANIM_MOVING_WHEELIE_EAST] = sAnim_MovingWheelieEast, }; static const union AnimCmd *const sAnimTable_RedGreenSurf[] = { [ANIM_STD_FACE_SOUTH] = sAnim_SurfFaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_SurfFaceNorth, [ANIM_STD_FACE_WEST] = sAnim_SurfFaceWest, [ANIM_STD_FACE_EAST] = sAnim_SurfFaceEast, [ANIM_STD_GO_SOUTH] = sAnim_SurfFaceSouth, [ANIM_STD_GO_NORTH] = sAnim_SurfFaceNorth, [ANIM_STD_GO_WEST] = sAnim_SurfFaceWest, [ANIM_STD_GO_EAST] = sAnim_SurfFaceEast, [ANIM_STD_GO_FAST_SOUTH] = sAnim_SurfFaceSouth, [ANIM_STD_GO_FAST_NORTH] = sAnim_SurfFaceNorth, [ANIM_STD_GO_FAST_WEST] = sAnim_SurfFaceWest, [ANIM_STD_GO_FAST_EAST] = sAnim_SurfFaceEast, [ANIM_STD_GO_FASTER_SOUTH] = sAnim_SurfFaceSouth, [ANIM_STD_GO_FASTER_NORTH] = sAnim_SurfFaceNorth, [ANIM_STD_GO_FASTER_WEST] = sAnim_SurfFaceWest, [ANIM_STD_GO_FASTER_EAST] = sAnim_SurfFaceEast, [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_SurfFaceSouth, [ANIM_STD_GO_FASTEST_NORTH] = sAnim_SurfFaceNorth, [ANIM_STD_GO_FASTEST_WEST] = sAnim_SurfFaceWest, [ANIM_STD_GO_FASTEST_EAST] = sAnim_SurfFaceEast, [ANIM_GET_ON_OFF_POKEMON_SOUTH] = sAnim_GetOnOffSurfSouth, [ANIM_GET_ON_OFF_POKEMON_NORTH] = sAnim_GetOnOffSurfNorth, [ANIM_GET_ON_OFF_POKEMON_WEST] = sAnim_GetOnOffSurfWest, [ANIM_GET_ON_OFF_POKEMON_EAST] = sAnim_GetOnOffSurfEast, }; static const union AnimCmd *const sAnimTable_Nurse[] = { [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth, [ANIM_STD_FACE_WEST] = sAnim_FaceWest, [ANIM_STD_FACE_EAST] = sAnim_FaceEast, [ANIM_STD_GO_SOUTH] = sAnim_GoSouth, [ANIM_STD_GO_NORTH] = sAnim_GoNorth, [ANIM_STD_GO_WEST] = sAnim_GoWest, [ANIM_STD_GO_EAST] = sAnim_GoEast, [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth, [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth, [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest, [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast, [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth, [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth, [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest, [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast, [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth, [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth, [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest, [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast, [ANIM_NURSE_BOW] = sAnim_NurseBow, }; static const union AnimCmd *const sAnimTable_RedGreenFieldMove[] = { [ANIM_FIELD_MOVE] = sAnim_FieldMove, }; static const union AnimCmd *const sAnimTable_RedGreenVSSeeker[] = { [ANIM_VS_SEEKER] = sAnim_VSSeeker, }; static const union AnimCmd *const sAnimTable_RedGreenVSSeekerBike[] = { [ANIM_VS_SEEKER] = sAnim_VSSeekerBike, }; // Unused static const union AnimCmd *const sAnimTable_BerryTree[] = { sAnim_BerryTreeStage0, sAnim_BerryTreeStage1, sAnim_BerryTreeStage2, sAnim_BerryTreeStage3, sAnim_BerryTreeStage4, }; static const union AnimCmd *const sAnimTable_RockSmashRock[] = { [ANIM_STAY_STILL] = sAnim_StayStill, [ANIM_REMOVE_OBSTACLE] = sAnim_RockBreak, }; static const union AnimCmd *const sAnimTable_CutTree[] = { [ANIM_STAY_STILL] = sAnim_StayStill, [ANIM_REMOVE_OBSTACLE] = sAnim_TreeCut, }; static const union AnimCmd *const sAnimTable_RedGreenFish[] = { [ANIM_TAKE_OUT_ROD_SOUTH] = sAnim_TakeOutRodSouth, [ANIM_TAKE_OUT_ROD_NORTH] = sAnim_TakeOutRodNorth, [ANIM_TAKE_OUT_ROD_WEST] = sAnim_TakeOutRodWest, [ANIM_TAKE_OUT_ROD_EAST] = sAnim_TakeOutRodEast, [ANIM_PUT_AWAY_ROD_SOUTH] = sAnim_PutAwayRodSouth, [ANIM_PUT_AWAY_ROD_NORTH] = sAnim_PutAwayRodNorth, [ANIM_PUT_AWAY_ROD_WEST] = sAnim_PutAwayRodWest, [ANIM_PUT_AWAY_ROD_EAST] = sAnim_PutAwayRodEast, [ANIM_HOOKED_POKEMON_SOUTH] = sAnim_HookedPokemonSouth, [ANIM_HOOKED_POKEMON_NORTH] = sAnim_HookedPokemonNorth, [ANIM_HOOKED_POKEMON_WEST] = sAnim_HookedPokemonWest, [ANIM_HOOKED_POKEMON_EAST] = sAnim_HookedPokemonEast, }; static const struct StepAnimTable sStepAnimTables[] = { { .anims = sAnimTable_QuintyPlump, .animPos = {1, 3, 0, 2}, }, { .anims = sAnimTable_Standard, .animPos = {1, 3, 0, 2}, }, { .anims = sAnimTable_RedGreenNormal, .animPos = {1, 3, 0, 2}, }, { .anims = sAnimTable_AcroBike, .animPos = {1, 3, 0, 2}, }, { .anims = sAnimTable_RedGreenSurf, .animPos = {1, 3, 0, 2}, }, { .anims = sAnimTable_Nurse, .animPos = {1, 3, 0, 2}, }, { .anims = sAnimTable_RedGreenFish, .animPos = {1, 3, 0, 2}, }, { .anims = sAnimTable_Unknown, .animPos = {3, 7, 0, 4}, }, {} }; ================================================ FILE: src/data/object_events/object_event_graphics.h ================================================ const u16 gObjectEventPal_Player[] = INCBIN_U16("graphics/object_events/palettes/player.gbapal"); const u16 gObjectEventPal_PlayerUnused[] = INCBIN_U16("graphics/object_events/palettes/player_unused.gbapal"); // Identical except for the transparency const u16 gObjectEventPaletteNull1[16] = {}; const u16 gObjectEventPaletteNull2[16] = {}; const u16 gObjectEventPaletteNull3[16] = {}; const u16 gObjectEventPaletteNull4[16] = {}; const u16 gObjectEventPaletteNull5[16] = {}; const u16 gObjectEventPaletteNull6[16] = {}; const u16 gObjectEventPaletteNull7[16] = {}; const u16 gObjectEventPaletteNull8[16] = {}; const u16 gObjectEventPaletteNull9[16] = {}; const u16 gObjectEventPaletteNull10[16] = {}; const u16 gObjectEventPaletteNull11[16] = {}; const u16 gObjectEventPaletteNull12[16] = {}; const u16 gObjectEventPaletteNull13[16] = {}; const u16 gObjectEventPaletteNull14[16] = {}; const u16 gObjectEventPic_RedNormal[] = INCBIN_U16("graphics/object_events/pics/people/red_normal.4bpp"); const u16 gObjectEventPic_RedSurfRun[] = INCBIN_U16("graphics/object_events/pics/people/red_surf_run.4bpp"); const u16 gObjectEventPic_GreenNormal[] = INCBIN_U16("graphics/object_events/pics/people/green_normal.4bpp"); const u16 gObjectEventPic_GreenSurfRun[] = INCBIN_U16("graphics/object_events/pics/people/green_surf_run.4bpp"); const u16 gObjectEventPal_PlayerReflection[] = INCBIN_U16("graphics/object_events/palettes/player_reflection.gbapal"); const u16 gObjectEventPal_BridgeReflection[] = INCBIN_U16("graphics/object_events/palettes/bridge_reflection.gbapal"); const u16 gObjectEventPic_RedItem[] = INCBIN_U16("graphics/object_events/pics/people/red_item.4bpp"); const u16 gObjectEventPic_GreenItem[] = INCBIN_U16("graphics/object_events/pics/people/green_item.4bpp"); const u16 gObjectEventPic_RedSurf[] = INCBIN_U16("graphics/object_events/pics/people/red_surf.4bpp"); const u16 gObjectEventPic_GreenSurf[] = INCBIN_U16("graphics/object_events/pics/people/green_surf.4bpp"); const u16 gObjectEventPic_RedBike[] = INCBIN_U16("graphics/object_events/pics/people/red_bike.4bpp"); const u16 gObjectEventPic_RedVSSeekerBike[] = INCBIN_U16("graphics/object_events/pics/people/red_vs_seeker_bike.4bpp"); const u16 gObjectEventPic_GreenBike[] = INCBIN_U16("graphics/object_events/pics/people/green_bike.4bpp"); const u16 gObjectEventPic_GreenVSSeekerBike[] = INCBIN_U16("graphics/object_events/pics/people/green_vs_seeker_bike.4bpp"); const u16 gObjectEventPic_RSBrendan[] = INCBIN_U16("graphics/object_events/pics/people/rs_brendan.4bpp"); const u16 gObjectEventPic_RSMay[] = INCBIN_U16("graphics/object_events/pics/people/rs_may.4bpp"); const u16 gObjectEventPic_RedFish[] = INCBIN_U16("graphics/object_events/pics/people/red_fish.4bpp"); const u16 gObjectEventPic_GreenFish[] = INCBIN_U16("graphics/object_events/pics/people/green_fish.4bpp"); const u16 gObjectEventPic_Pokedex[] = INCBIN_U16("graphics/object_events/pics/misc/pokedex.4bpp"); const u16 gObjectEventPic_TownMap[] = INCBIN_U16("graphics/object_events/pics/misc/town_map.4bpp"); const u16 gObjectEventPic_UnusedMan[] = INCBIN_U16("graphics/object_events/pics/people/unused_man.4bpp"); // Unused const u16 gObjectEventPic_Giovanni[] = INCBIN_U16("graphics/object_events/pics/people/giovanni.4bpp"); const u16 gObjectEventPic_Blaine[] = INCBIN_U16("graphics/object_events/pics/people/blaine.4bpp"); const u16 gObjectEventPic_Sabrina[] = INCBIN_U16("graphics/object_events/pics/people/sabrina.4bpp"); const u16 gObjectEventPic_Daisy[] = INCBIN_U16("graphics/object_events/pics/people/daisy.4bpp"); const u16 gObjectEventPic_Lorelei[] = INCBIN_U16("graphics/object_events/pics/people/lorelei.4bpp"); const u16 gObjectEventPic_Erika[] = INCBIN_U16("graphics/object_events/pics/people/erika.4bpp"); const u16 gObjectEventPic_Koga[] = INCBIN_U16("graphics/object_events/pics/people/koga.4bpp"); const u16 gObjectEventPic_Brock[] = INCBIN_U16("graphics/object_events/pics/people/brock.4bpp"); const u16 gObjectEventPic_LtSurge[] = INCBIN_U16("graphics/object_events/pics/people/lt_surge.4bpp"); const u16 gObjectEventPic_Bill[] = INCBIN_U16("graphics/object_events/pics/people/bill.4bpp"); const u16 gObjectEventPal_NpcBlue[] = INCBIN_U16("graphics/object_events/palettes/npc_blue.gbapal"); const u16 gObjectEventPal_NpcPink[] = INCBIN_U16("graphics/object_events/palettes/npc_pink.gbapal"); const u16 gObjectEventPal_NpcGreen[] = INCBIN_U16("graphics/object_events/palettes/npc_green.gbapal"); const u16 gObjectEventPal_NpcWhite[] = INCBIN_U16("graphics/object_events/palettes/npc_white.gbapal"); const u16 gObjectEventPal_NpcBlueReflection[] = INCBIN_U16("graphics/object_events/palettes/npc_blue_reflection.gbapal"); const u16 gObjectEventPal_NpcPinkReflection[] = INCBIN_U16("graphics/object_events/palettes/npc_pink_reflection.gbapal"); const u16 gObjectEventPal_NpcGreenReflection[] = INCBIN_U16("graphics/object_events/palettes/npc_green_reflection.gbapal"); const u16 gObjectEventPal_NpcWhiteReflection[] = INCBIN_U16("graphics/object_events/palettes/npc_white_reflection.gbapal"); const u16 gUnderwaterEventObjectPalette[] = INCBIN_U16("graphics/object_events/palettes/underwater_sprites.gbapal"); const u16 gObjectEventPic_LittleBoy[] = INCBIN_U16("graphics/object_events/pics/people/little_boy.4bpp"); const u16 gObjectEventPic_LittleGirl[] = INCBIN_U16("graphics/object_events/pics/people/little_girl.4bpp"); const u16 gObjectEventPic_SittingBoy[] = INCBIN_U16("graphics/object_events/pics/people/sitting_boy.4bpp"); const u16 gObjectEventPic_Lass[] = INCBIN_U16("graphics/object_events/pics/people/lass.4bpp"); const u16 gObjectEventPic_Youngster[] = INCBIN_U16("graphics/object_events/pics/people/youngster.4bpp"); const u16 gObjectEventPic_Boy[] = INCBIN_U16("graphics/object_events/pics/people/boy.4bpp"); const u16 gObjectEventPic_Woman1[] = INCBIN_U16("graphics/object_events/pics/people/woman_1.4bpp"); const u16 gObjectEventPic_Woman3[] = INCBIN_U16("graphics/object_events/pics/people/woman_3.4bpp"); const u16 gObjectEventPic_BugCatcher[] = INCBIN_U16("graphics/object_events/pics/people/bug_catcher.4bpp"); const u16 gObjectEventPic_BattleGirl[] = INCBIN_U16("graphics/object_events/pics/people/battle_girl.4bpp"); const u16 gObjectEventPic_RichBoy[] = INCBIN_U16("graphics/object_events/pics/people/rich_boy.4bpp"); // Unused const u16 gObjectEventPic_FatMan[] = INCBIN_U16("graphics/object_events/pics/people/fat_man.4bpp"); const u16 gObjectEventPic_BaldingMan[] = INCBIN_U16("graphics/object_events/pics/people/balding_man.4bpp"); const u16 gObjectEventPic_Woman2[] = INCBIN_U16("graphics/object_events/pics/people/woman_2.4bpp"); const u16 gObjectEventPic_OldMan1[] = INCBIN_U16("graphics/object_events/pics/people/old_man_1.4bpp"); const u16 gObjectEventPic_OldManLyingDown[] = INCBIN_U16("graphics/object_events/pics/people/old_man_lying_down.4bpp"); const u16 gObjectEventPic_WorkerM[] = INCBIN_U16("graphics/object_events/pics/people/worker_m.4bpp"); const u16 gObjectEventPic_WorkerF[] = INCBIN_U16("graphics/object_events/pics/people/worker_f.4bpp"); const u16 gObjectEventPic_Beauty[] = INCBIN_U16("graphics/object_events/pics/people/beauty.4bpp"); const u16 gObjectEventPic_Chef[] = INCBIN_U16("graphics/object_events/pics/people/chef.4bpp"); const u16 gObjectEventPic_OldMan2[] = INCBIN_U16("graphics/object_events/pics/people/old_man_2.4bpp"); const u16 gObjectEventPic_OldWoman[] = INCBIN_U16("graphics/object_events/pics/people/old_woman.4bpp"); const u16 gObjectEventPic_Camper[] = INCBIN_U16("graphics/object_events/pics/people/camper.4bpp"); const u16 gObjectEventPic_Picnicker[] = INCBIN_U16("graphics/object_events/pics/people/picnicker.4bpp"); const u16 gObjectEventPic_CooltrainerM[] = INCBIN_U16("graphics/object_events/pics/people/cooltrainer_m.4bpp"); const u16 gObjectEventPic_CooltrainerF[] = INCBIN_U16("graphics/object_events/pics/people/cooltrainer_f.4bpp"); const u16 gObjectEventPic_Psyduck[] = INCBIN_U16("graphics/object_events/pics/pokemon/psyduck.4bpp"); const u16 gObjectEventPic_SuperNerd[] = INCBIN_U16("graphics/object_events/pics/people/super_nerd.4bpp"); const u16 gObjectEventPic_Channeler[] = INCBIN_U16("graphics/object_events/pics/people/channeler.4bpp"); const u16 gObjectEventPic_RocketF[] = INCBIN_U16("graphics/object_events/pics/people/rocket_f.4bpp"); const u16 gObjectEventPic_SwimmerMWater[] = INCBIN_U16("graphics/object_events/pics/people/swimmer_m_water.4bpp"); const u16 gObjectEventPic_SwimmerFWater[] = INCBIN_U16("graphics/object_events/pics/people/swimmer_f_water.4bpp"); const u16 gObjectEventPic_SwimmerMLand[] = INCBIN_U16("graphics/object_events/pics/people/swimmer_m_land.4bpp"); const u16 gObjectEventPic_SwimmerFLand[] = INCBIN_U16("graphics/object_events/pics/people/swimmer_f_land.4bpp"); const u16 gObjectEventPic_Blackbelt[] = INCBIN_U16("graphics/object_events/pics/people/blackbelt.4bpp"); const u16 gObjectEventPic_Scientist[] = INCBIN_U16("graphics/object_events/pics/people/scientist.4bpp"); const u16 gObjectEventPic_Gentleman[] = INCBIN_U16("graphics/object_events/pics/people/gentleman.4bpp"); const u16 gObjectEventPic_Sailor[] = INCBIN_U16("graphics/object_events/pics/people/sailor.4bpp"); const u16 gObjectEventPic_Captain[] = INCBIN_U16("graphics/object_events/pics/people/captain.4bpp"); const u16 gObjectEventPic_Fisher[] = INCBIN_U16("graphics/object_events/pics/people/fisher.4bpp"); const u16 gObjectEventPic_TeachyTVHost[] = INCBIN_U16("graphics/object_events/pics/people/teachy_tv_host.4bpp"); const u16 gObjectEventPic_UnusedWoman[] = INCBIN_U16("graphics/object_events/pics/people/unused_woman.4bpp"); const u16 gObjectEventPic_TuberF[] = INCBIN_U16("graphics/object_events/pics/people/tuber_f.4bpp"); const u16 gObjectEventPic_TuberMWater[] = INCBIN_U16("graphics/object_events/pics/people/tuber_m_water.4bpp"); const u16 gObjectEventPic_TuberMLand[] = INCBIN_U16("graphics/object_events/pics/people/tuber_m_land.4bpp"); const u16 gObjectEventPic_Hiker[] = INCBIN_U16("graphics/object_events/pics/people/hiker.4bpp"); const u16 gObjectEventPic_Biker[] = INCBIN_U16("graphics/object_events/pics/people/biker.4bpp"); const u16 gObjectEventPic_GymGuy[] = INCBIN_U16("graphics/object_events/pics/people/gym_guy.4bpp"); const u16 gObjectEventPic_Man[] = INCBIN_U16("graphics/object_events/pics/people/man.4bpp"); const u16 gObjectEventPic_Rocker[] = INCBIN_U16("graphics/object_events/pics/people/rocker.4bpp"); const u16 gObjectEventPic_ProfOak[] = INCBIN_U16("graphics/object_events/pics/people/prof_oak.4bpp"); const u16 gObjectEventPic_Blue[] = INCBIN_U16("graphics/object_events/pics/people/blue.4bpp"); const u16 gObjectEventPic_Nurse[] = INCBIN_U16("graphics/object_events/pics/people/nurse.4bpp"); const u16 gObjectEventPic_CableClubReceptionist[] = INCBIN_U16("graphics/object_events/pics/people/cable_club_receptionist.4bpp"); const u16 gObjectEventPic_UnionRoomReceptionist[] = INCBIN_U16("graphics/object_events/pics/people/union_room_receptionist.4bpp"); const u16 gObjectEventPic_UnusedMaleReceptionist[] = INCBIN_U16("graphics/object_events/pics/people/unused_male_receptionist.4bpp"); const u16 gObjectEventPic_ItemBall[] = INCBIN_U16("graphics/object_events/pics/misc/item_ball.4bpp"); const u16 gObjectEventPic_MrFuji[] = INCBIN_U16("graphics/object_events/pics/people/mr_fuji.4bpp"); const u16 gObjectEventPic_Bruno[] = INCBIN_U16("graphics/object_events/pics/people/bruno.4bpp"); const u16 gObjectEventPic_Clerk[] = INCBIN_U16("graphics/object_events/pics/people/clerk.4bpp"); const u16 gObjectEventPic_MGDeliveryman[] = INCBIN_U16("graphics/object_events/pics/people/mg_deliveryman.4bpp"); const u16 gObjectEventPic_TrainerTowerDude[] = INCBIN_U16("graphics/object_events/pics/people/trainer_tower_dude.4bpp"); const u16 gObjectEventPic_Cameraman[] = INCBIN_U16("graphics/object_events/pics/people/cameraman.4bpp"); // Unused const u16 gObjectEventPic_RocketM[] = INCBIN_U16("graphics/object_events/pics/people/rocket_m.4bpp"); const u16 gObjectEventPic_Celio[] = INCBIN_U16("graphics/object_events/pics/people/celio.4bpp"); const u16 gObjectEventPic_Lapras[] = INCBIN_U16("graphics/object_events/pics/pokemon/lapras.4bpp"); const u16 gObjectEventPic_Zapdos[] = INCBIN_U16("graphics/object_events/pics/pokemon/zapdos.4bpp"); const u16 gObjectEventPic_Moltres[] = INCBIN_U16("graphics/object_events/pics/pokemon/moltres.4bpp"); const u16 gObjectEventPic_Articuno[] = INCBIN_U16("graphics/object_events/pics/pokemon/articuno.4bpp"); const u16 gObjectEventPic_Mewtwo[] = INCBIN_U16("graphics/object_events/pics/pokemon/mewtwo.4bpp"); const u16 gObjectEventPic_Mew[] = INCBIN_U16("graphics/object_events/pics/pokemon/mew.4bpp"); const u16 gObjectEventPic_Entei[] = INCBIN_U16("graphics/object_events/pics/pokemon/entei.4bpp"); const u16 gObjectEventPic_Raikou[] = INCBIN_U16("graphics/object_events/pics/pokemon/raikou.4bpp"); const u16 gObjectEventPic_Suicune[] = INCBIN_U16("graphics/object_events/pics/pokemon/suicune.4bpp"); const u16 gObjectEventPic_Lugia[] = INCBIN_U16("graphics/object_events/pics/pokemon/lugia.4bpp"); const u16 gObjectEventPic_HoOh[] = INCBIN_U16("graphics/object_events/pics/pokemon/ho_oh.4bpp"); const u16 gObjectEventPic_Celebi[] = INCBIN_U16("graphics/object_events/pics/pokemon/celebi.4bpp"); const u16 gObjectEventPic_DeoxysD[] = INCBIN_U16("graphics/object_events/pics/pokemon/deoxys_d.4bpp"); const u16 gObjectEventPic_DeoxysA[] = INCBIN_U16("graphics/object_events/pics/pokemon/deoxys_a.4bpp"); const u16 gObjectEventPic_DeoxysN[] = INCBIN_U16("graphics/object_events/pics/pokemon/deoxys_n.4bpp"); const u16 gObjectEventPic_Agatha[] = INCBIN_U16("graphics/object_events/pics/people/agatha.4bpp"); const u16 gObjectEventPic_Misty[] = INCBIN_U16("graphics/object_events/pics/people/misty.4bpp"); const u16 gObjectEventPic_Lance[] = INCBIN_U16("graphics/object_events/pics/people/lance.4bpp"); const u16 gObjectEventPic_GBAKid[] = INCBIN_U16("graphics/object_events/pics/people/gba_kid.4bpp"); const u16 gObjectEventPic_Mom[] = INCBIN_U16("graphics/object_events/pics/people/mom.4bpp"); const u16 gObjectEventPic_Pidgeot[] = INCBIN_U16("graphics/object_events/pics/pokemon/pidgeot.4bpp"); const u16 gObjectEventPic_Omanyte[] = INCBIN_U16("graphics/object_events/pics/pokemon/omanyte.4bpp"); const u16 gObjectEventPic_Kangaskhan[] = INCBIN_U16("graphics/object_events/pics/pokemon/kangaskhan.4bpp"); const u16 gObjectEventPic_NidoranF[] = INCBIN_U16("graphics/object_events/pics/pokemon/nidoran_f.4bpp"); const u16 gObjectEventPic_NidoranM[] = INCBIN_U16("graphics/object_events/pics/pokemon/nidoran_m.4bpp"); const u16 gObjectEventPic_Nidorino[] = INCBIN_U16("graphics/object_events/pics/pokemon/nidorino.4bpp"); const u16 gObjectEventPic_Meowth[] = INCBIN_U16("graphics/object_events/pics/pokemon/meowth.4bpp"); const u16 gObjectEventPic_Seel[] = INCBIN_U16("graphics/object_events/pics/pokemon/seel.4bpp"); const u16 gObjectEventPic_Voltorb[] = INCBIN_U16("graphics/object_events/pics/pokemon/voltorb.4bpp"); const u16 gObjectEventPic_Slowpoke[] = INCBIN_U16("graphics/object_events/pics/pokemon/slowpoke.4bpp"); const u16 gObjectEventPic_Slowbro[] = INCBIN_U16("graphics/object_events/pics/pokemon/slowbro.4bpp"); const u16 gObjectEventPic_Machop[] = INCBIN_U16("graphics/object_events/pics/pokemon/machop.4bpp"); const u16 gObjectEventPic_Wigglytuff[] = INCBIN_U16("graphics/object_events/pics/pokemon/wigglytuff.4bpp"); const u16 gObjectEventPic_Doduo[] = INCBIN_U16("graphics/object_events/pics/pokemon/doduo.4bpp"); const u16 gObjectEventPic_Fearow[] = INCBIN_U16("graphics/object_events/pics/pokemon/fearow.4bpp"); const u16 gObjectEventPic_Kabuto[] = INCBIN_U16("graphics/object_events/pics/pokemon/kabuto.4bpp"); const u16 gObjectEventPic_Machoke[] = INCBIN_U16("graphics/object_events/pics/pokemon/machoke.4bpp"); const u16 gObjectEventPic_Snorlax[] = INCBIN_U16("graphics/object_events/pics/pokemon/snorlax.4bpp"); const u16 gObjectEventPic_Spearow[] = INCBIN_U16("graphics/object_events/pics/pokemon/spearow.4bpp"); const u16 gObjectEventPic_Cubone[] = INCBIN_U16("graphics/object_events/pics/pokemon/cubone.4bpp"); const u16 gObjectEventPic_Poliwrath[] = INCBIN_U16("graphics/object_events/pics/pokemon/poliwrath.4bpp"); const u16 gObjectEventPic_Chansey[] = INCBIN_U16("graphics/object_events/pics/pokemon/chansey.4bpp"); const u16 gObjectEventPic_Pikachu[] = INCBIN_U16("graphics/object_events/pics/pokemon/pikachu.4bpp"); const u16 gObjectEventPic_Jigglypuff[] = INCBIN_U16("graphics/object_events/pics/pokemon/jigglypuff.4bpp"); const u16 gObjectEventPic_Pidgey[] = INCBIN_U16("graphics/object_events/pics/pokemon/pidgey.4bpp"); const u16 gObjectEventPic_Clefairy[] = INCBIN_U16("graphics/object_events/pics/pokemon/clefairy.4bpp"); const u16 gObjectEventPic_CutTree[] = INCBIN_U16("graphics/object_events/pics/misc/cut_tree.4bpp"); const u16 gObjectEventPic_RockSmashRock[] = INCBIN_U16("graphics/object_events/pics/misc/rock_smash_rock.4bpp"); const u16 gObjectEventPic_StrengthBoulder[] = INCBIN_U16("graphics/object_events/pics/misc/strength_boulder.4bpp"); const u16 gObjectEventPic_Fossil[] = INCBIN_U16("graphics/object_events/pics/misc/fossil.4bpp"); const u16 gObjectEventPic_Ruby[] = INCBIN_U16("graphics/object_events/pics/misc/ruby.4bpp"); const u16 gObjectEventPic_Sapphire[] = INCBIN_U16("graphics/object_events/pics/misc/sapphire.4bpp"); const u16 gObjectEventPic_OldAmber[] = INCBIN_U16("graphics/object_events/pics/misc/old_amber.4bpp"); const u16 gObjectEventPic_GymSign[] = INCBIN_U16("graphics/object_events/pics/misc/gym_sign.4bpp"); const u16 gObjectEventPic_Sign[] = INCBIN_U16("graphics/object_events/pics/misc/sign.4bpp"); const u16 gObjectEventPic_WoodenSign[] = INCBIN_U16("graphics/object_events/pics/misc/wooden_sign.4bpp"); const u16 gObjectEventPic_Clipboard[] = INCBIN_U16("graphics/object_events/pics/misc/clipboard.4bpp"); const u16 gObjectEventPic_CableCar[] = INCBIN_U16("graphics/object_events/pics/misc/cable_car.4bpp"); const u16 gObjectEventPal_CableCar[] = INCBIN_U16("graphics/object_events/palettes/cable_car.gbapal"); const u16 gObjectEventPic_Sudowoodo[] = INCBIN_U16("graphics/object_events/pics/pokemon/sudowoodo.4bpp"); const u16 gObjectEventPic_Abra[] = INCBIN_U16("graphics/object_events/pics/pokemon/abra.4bpp"); const u16 gObjectEventPic_SwimmerFWater2[] = INCBIN_U16("graphics/object_events/pics/people/swimmer_f_water_2.4bpp"); const u16 gObjectEventPal_Meteorite[] = INCBIN_U16("graphics/object_events/palettes/meteorite.gbapal"); const u16 gObjectEventPic_BirthIslandStone[] = INCBIN_U16("graphics/object_events/pics/misc/birth_island_stone.4bpp"); const u16 gObjectEventPic_LaprasDoll[] = INCBIN_U16("graphics/object_events/pics/misc/lapras_doll.4bpp"); const u16 gObjectEventPal_Seagallop[] = INCBIN_U16("graphics/object_events/palettes/seagallop.gbapal"); const u16 gObjectEventPic_Seagallop[] = INCBIN_U16("graphics/object_events/pics/misc/seagallop.4bpp"); const u16 gObjectEventPal_SSAnne[] = INCBIN_U16("graphics/object_events/palettes/ss_anne.gbapal"); const u16 gEmBrendanPalette[] = INCBIN_U16("graphics/object_events/palettes/22.gbapal"); const u16 gEmMayPalette[] = INCBIN_U16("graphics/object_events/palettes/23.gbapal"); const u16 gObjectEventPic_SSAnne[] = INCBIN_U16("graphics/object_events/pics/misc/ss_anne.4bpp"); const u16 gObjectEventPic_SurfBlob[] = INCBIN_U16("graphics/object_events/pics/misc/surf_blob.4bpp"); const u16 gObjectEventPic_Policeman[] = INCBIN_U16("graphics/object_events/pics/people/policeman.4bpp"); const u16 gObjectEventPic_CueBall[] = INCBIN_U16("graphics/object_events/pics/people/cue_ball.4bpp"); const u16 gObjectEventPic_Painter[] = INCBIN_U16("graphics/object_events/pics/people/painter.4bpp"); const u16 gObjectEventPic_BirdKeeper[] = INCBIN_U16("graphics/object_events/pics/people/bird_keeper.4bpp"); const u16 gObjectEventPic_Burglar[] = INCBIN_U16("graphics/object_events/pics/people/burglar.4bpp"); const u16 gObjectEventPic_PokemonRangerF[] = INCBIN_U16("graphics/object_events/pics/people/pokemon_ranger_f.4bpp"); const u16 gObjectEventPic_PokemonRangerM[] = INCBIN_U16("graphics/object_events/pics/people/pokemon_ranger_m.4bpp"); const u16 gObjectEventPic_RuinManiac[] = INCBIN_U16("graphics/object_events/pics/people/ruin_maniac.4bpp"); const u16 gObjectEventPic_PokeManiac[] = INCBIN_U16("graphics/object_events/pics/people/pokemaniac.4bpp"); const u16 gObjectEventPic_PsychicM[] = INCBIN_U16("graphics/object_events/pics/people/psychic_m.4bpp"); const u16 gObjectEventPic_PsychicF[] = INCBIN_U16("graphics/object_events/pics/people/psychic_f.4bpp"); const u16 gObjectEventPic_AromaLady[] = INCBIN_U16("graphics/object_events/pics/people/aroma_lady.4bpp"); const u16 gObjectEventPic_Twin[] = INCBIN_U16("graphics/object_events/pics/people/twin.4bpp"); const u16 gObjectEventPic_YoungCoupleM[] = INCBIN_U16("graphics/object_events/pics/people/young_couple_m.4bpp"); const u16 gObjectEventPic_YoungCoupleF[] = INCBIN_U16("graphics/object_events/pics/people/young_couple_f.4bpp"); const u16 gObjectEventPic_Engineer[] = INCBIN_U16("graphics/object_events/pics/people/engineer.4bpp"); const u16 gObjectEventPic_Juggler[] = INCBIN_U16("graphics/object_events/pics/people/juggler.4bpp"); const u16 gObjectEventPic_Tamer[] = INCBIN_U16("graphics/object_events/pics/people/tamer.4bpp"); const u16 gObjectEventPic_PokemonBreeder[] = INCBIN_U16("graphics/object_events/pics/people/pokemon_breeder.4bpp"); const u16 gObjectEventPic_RedUnderwater[] = INCBIN_U16("graphics/object_events/pics/people/red_underwater.4bpp"); const u16 gObjectEventPic_GreenUnderwater[] = INCBIN_U16("graphics/object_events/pics/people/green_underwater.4bpp"); const u16 gObjectEventPic_Scott[] = INCBIN_U16("graphics/object_events/pics/people/scott.4bpp"); const u16 gObjectEventPic_Bulbasaur[] = INCBIN_U16("graphics/object_events/pics/pokemon/bulbasaur.4bpp"); const u16 gObjectEventPic_Charmander[] = INCBIN_U16("graphics/object_events/pics/pokemon/charmander.4bpp"); const u16 gObjectEventPic_Squirtle[] = INCBIN_U16("graphics/object_events/pics/pokemon/squirtle.4bpp"); const u16 gObjectEventPic_Latias[] = INCBIN_U16("graphics/object_events/pics/pokemon/latias.4bpp"); const u16 gObjectEventPic_Latios[] = INCBIN_U16("graphics/object_events/pics/pokemon/latios.4bpp"); const u16 gObjectEventPic_EmBrendan[] = INCBIN_U16("graphics/object_events/pics/people/em_brendan.4bpp"); const u16 gObjectEventPic_EmMay[] = INCBIN_U16("graphics/object_events/pics/people/em_may.4bpp"); const u16 gObjectEventPic_MasterBeauty[] = INCBIN_U16("graphics/object_events/pics/people/master_beauty.4bpp"); const u16 gObjectEventPic_MasterBirdKeeper[] = INCBIN_U16("graphics/object_events/pics/people/master_bird_keeper.4bpp"); const u16 gObjectEventPic_MasterBlackbelt[] = INCBIN_U16("graphics/object_events/pics/people/master_blackbelt.4bpp"); const u16 gObjectEventPic_MasterBugCatcher[] = INCBIN_U16("graphics/object_events/pics/people/master_bug_catcher.4bpp"); const u16 gObjectEventPic_MasterCooltrainerM[] = INCBIN_U16("graphics/object_events/pics/people/master_cooltrainer_m.4bpp"); const u16 gObjectEventPic_MasterHiker[] = INCBIN_U16("graphics/object_events/pics/people/master_hiker.4bpp"); const u16 gObjectEventPic_MasterLass[] = INCBIN_U16("graphics/object_events/pics/people/master_lass.4bpp"); const u16 gObjectEventPic_MasterPsychicM[] = INCBIN_U16("graphics/object_events/pics/people/master_psychic_m.4bpp"); const u16 gObjectEventPic_MasterScientist[] = INCBIN_U16("graphics/object_events/pics/people/master_scientist.4bpp"); const u16 gObjectEventPic_MasterYoungster[] = INCBIN_U16("graphics/object_events/pics/people/master_youngster.4bpp"); const u16 gObjectEventPal_RSQuintyPlump[] = INCBIN_U16("graphics/object_events/palettes/rs_quinty_plump.gbapal"); const u16 gObjectEventPal_RSQuintyPlumpReflection[] = INCBIN_U16("graphics/object_events/palettes/rs_quinty_plump_reflection.gbapal"); const u16 gObjectEventPic_Lady[] = INCBIN_U16("graphics/object_events/pics/people/lady.4bpp"); const u16 gObjectEventPal_Lady[] = INCBIN_U16("graphics/object_events/palettes/lady.gbapal"); const u16 gObjectEventPic_Rocker2[] = INCBIN_U16("graphics/object_events/pics/people/rocker_2.4bpp"); const u16 gObjectEventPic_Anabel[] = INCBIN_U16("graphics/object_events/pics/people/anabel.4bpp"); const u16 gObjectEventPic_Tucker[] = INCBIN_U16("graphics/object_events/pics/people/tucker.4bpp"); const u16 gObjectEventPic_Greta[] = INCBIN_U16("graphics/object_events/pics/people/greta.4bpp"); const u16 gObjectEventPic_Spenser[] = INCBIN_U16("graphics/object_events/pics/people/spenser.4bpp"); const u16 gObjectEventPic_Noland[] = INCBIN_U16("graphics/object_events/pics/people/noland.4bpp"); const u16 gObjectEventPic_Lucy[] = INCBIN_U16("graphics/object_events/pics/people/lucy.4bpp"); const u16 gObjectEventPic_Brandon[] = INCBIN_U16("graphics/object_events/pics/people/brandon.4bpp"); const u16 gFieldEffectObjectPic_ShadowSmall[] = INCBIN_U16("graphics/field_effects/pics/shadow_small.4bpp"); const u16 gFieldEffectObjectPic_ShadowMedium[] = INCBIN_U16("graphics/field_effects/pics/shadow_medium.4bpp"); const u16 gFieldEffectObjectPic_ShadowLarge[] = INCBIN_U16("graphics/field_effects/pics/shadow_large.4bpp"); const u16 gFieldEffectObjectPic_ShadowExtraLarge[] = INCBIN_U16("graphics/field_effects/pics/shadow_extra_large.4bpp"); const u16 sFiller1[0x90] = {}; const u16 gFieldEffectObjectPic_CutGrass[] = INCBIN_U16("graphics/field_effects/fldeff_cut.4bpp"); const u16 gFieldEffectObjectPic_CutGrass2[] = INCBIN_U16("graphics/field_effects/fldeff_cut.4bpp"); // Unused const u16 gFieldEffectPal_CutGrass[] = INCBIN_U16("graphics/field_effects/fldeff_cut.gbapal"); const u16 gFieldEffectObjectPic_Ripple[] = INCBIN_U16("graphics/field_effects/pics/ripple.4bpp"); const u16 gFieldEffectObjectPic_Ash[] = INCBIN_U16("graphics/field_effects/pics/ash.4bpp"); const u16 gFieldEffectObjectPic_Arrow[] = INCBIN_U16("graphics/field_effects/pics/arrow.4bpp"); const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/field_effects/palettes/general_0.gbapal"); const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effects/palettes/general_1.gbapal"); const u16 sFiller2[0x10] = {}; const u16 gFieldEffectObjectPic_GroundImpactDust[] = INCBIN_U16("graphics/field_effects/pics/ground_impact_dust.4bpp"); const u16 gFieldEffectObjectPic_UnusedGrass3[] = INCBIN_U16("graphics/field_effects/pics/unused_grass_3.4bpp"); // Unused const u16 gFieldEffectObjectPic_JumpTallGrass[] = INCBIN_U16("graphics/field_effects/pics/jump_tall_grass.4bpp"); const u16 gFieldEffectObjectPic_UnusedGrass4[] = INCBIN_U16("graphics/field_effects/pics/unused_grass_4.4bpp"); // Unused const u16 gFieldEffectObjectPic_JumpLongGrass[] = INCBIN_U16("graphics/field_effects/pics/jump_long_grass.4bpp"); const u16 gFieldEffectObjectPic_UnusedGrass[] = INCBIN_U16("graphics/field_effects/pics/unused_grass.4bpp"); const u16 gFieldEffectObjectPic_UnusedGrass2[] = INCBIN_U16("graphics/field_effects/pics/unused_grass_2.4bpp"); const u16 gFieldEffectObjectPic_LongGrass[] = INCBIN_U16("graphics/field_effects/pics/long_grass.4bpp"); const u16 gFieldEffectObjectPic_TallGrass[] = INCBIN_U16("graphics/field_effects/pics/tall_grass.4bpp"); const u16 gFieldEffectObjectPic_ShortGrass[] = INCBIN_U16("graphics/field_effects/pics/short_grass.4bpp"); const u16 gFieldEffectObjectPic_SandFootprints[] = INCBIN_U16("graphics/field_effects/pics/sand_footprints.4bpp"); const u16 gFieldEffectObjectPic_DeepSandFootprints[] = INCBIN_U16("graphics/field_effects/pics/deep_sand_footprints.4bpp"); const u16 gFieldEffectObjectPic_BikeTireTracks[] = INCBIN_U16("graphics/field_effects/pics/bike_tire_tracks.4bpp"); const u16 gFieldEffectObjectPic_UnusedSand[] = INCBIN_U16("graphics/field_effects/pics/unused_sand.4bpp"); const u16 gFieldEffectObjectPic_SandPile[] = INCBIN_U16("graphics/field_effects/pics/sand_pile.4bpp"); const u16 gFieldEffectObjectPic_JumpBigSplash[] = INCBIN_U16("graphics/field_effects/pics/jump_big_splash.4bpp"); const u16 gFieldEffectObjectPic_Splash[] = INCBIN_U16("graphics/field_effects/pics/splash.4bpp"); const u16 gFieldEffectObjectPic_JumpSmallSplash[] = INCBIN_U16("graphics/field_effects/pics/jump_small_splash.4bpp"); const u16 gFieldEffectObjectPic_WaterSurfacing[] = INCBIN_U16("graphics/field_effects/pics/water_surfacing.4bpp"); const u16 gFieldEffectObjectPic_TreeDisguise[] = INCBIN_U16("graphics/field_effects/pics/tree_disguise.4bpp"); const u16 gFieldEffectObjectPic_MountainDisguise[] = INCBIN_U16("graphics/field_effects/pics/mountain_disguise.4bpp"); const u16 gFieldEffectObjectPic_SandDisguisePlaceholder[] = INCBIN_U16("graphics/field_effects/pics/sand_disguise.4bpp"); const u16 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U16("graphics/field_effects/pics/hot_springs_water.4bpp"); const u16 gFieldEffectPal_Ash[] = INCBIN_U16("graphics/field_effects/palettes/ash.gbapal"); const u16 gFieldEffectObjectPic_AshPuff[] = INCBIN_U16("graphics/field_effects/pics/pop_out_of_ash.4bpp"); const u16 gFieldEffectObjectPic_AshLaunch[] = INCBIN_U16("graphics/field_effects/pics/lavaridge_warp.4bpp"); const u16 gFieldEffectObjectPic_Bubbles[] = INCBIN_U16("graphics/field_effects/pics/underwater_bubbles.4bpp"); const u16 gFieldEffectObjectPic_SmallSparkle[] = INCBIN_U16("graphics/field_effects/pics/small_sparkle.4bpp"); const u16 gFieldEffectPal_SmallSparkle[] = INCBIN_U16("graphics/field_effects/palettes/small_sparkle.gbapal"); const u16 gFieldEffectObjectPic_Bird[] = INCBIN_U16("graphics/field_effects/pics/bird.4bpp"); const u16 gSevenIsland_Grass[] = INCBIN_U16("graphics/object_events/pics/unknown/SevenIsland_Grass.4bpp"); const u16 gBlackSandFootPrints_Pal[] = INCBIN_U16("graphics/object_events/palettes/black_sand_footprints.gbapal"); const u16 gSnowFootPrints_Pal[] = INCBIN_U16("graphics/object_events/palettes/snow_footprints.gbapal"); const u16 gThreeIslandGrass_Pal[] = INCBIN_U16("graphics/object_events/palettes/three_island_grass.gbapal"); ================================================ FILE: src/data/object_events/object_event_graphics_info.h ================================================ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedNormal = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 512, .width = 16, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_RedGreenNormal, .images = sPicTable_RedNormal, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedBike = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_BIKE_TIRE, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_RedBike, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedSurf = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = TRUE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_RedGreenSurf, .images = sPicTable_RedSurf, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFieldMove = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_RedGreenFieldMove, .images = sPicTable_RedItem, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Policeman = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Policeman, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSBrendan = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_RSBrendan, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSMay = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_RSMay, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleBoy = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_LittleBoy, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleGirl = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_LittleGirl, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SittingBoy = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_SittingBoy, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lass = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Lass, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Youngster = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Youngster, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman1 = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Woman1, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman3 = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Woman3, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Boy, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BattleGirl = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_BattleGirl, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BugCatcher = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_BugCatcher, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_FatMan = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_FatMan, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BaldingMan = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_BaldingMan, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman2 = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Woman2, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan1 = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_OldMan1, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WorkerM = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_WorkerM, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WorkerF = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_WorkerF, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Beauty = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Beauty, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Chef = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Chef, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan2 = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_OldMan2, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldWoman = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_OldWoman, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Camper = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Camper, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Picnicker = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Picnicker, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CooltrainerM = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_CooltrainerM, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CooltrainerF = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_CooltrainerF, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SuperNerd = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_SuperNerd, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Channeler = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Channeler, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RocketF = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_RocketF, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerMWater = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_SwimmerMWater, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFWater = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_SwimmerFWater, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerMLand = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_SwimmerMLand, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFLand = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_SwimmerFLand, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blackbelt = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Blackbelt, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scientist = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Scientist, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Gentleman = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Gentleman, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sailor = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Sailor, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Captain = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Captain, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fisher = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Fisher, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TeachyTVHost = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_TeachyTVHost, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedWoman = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_UnusedWoman, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberF = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_TuberF, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMWater = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_TuberMWater, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMLand = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_TuberMLand, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hiker = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Hiker, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Biker = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_BIKE_TIRE, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_Biker, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GymGuy = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_BIKE_TIRE, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_GymGuy, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nurse = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Nurse, .images = sPicTable_Nurse, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMaleReceptionist = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_UnusedMaleReceptionist, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ItemBall = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_ItemBall, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ProfOak = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_ProfOak, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Man, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rocker = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Rocker, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MrFuji = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MrFuji, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bruno = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Bruno, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldManLyingDown = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_OldManLyingDown, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CutTree = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_CutTree, .images = sPicTable_CutTree, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clerk = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Clerk, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MGDeliveryman = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MGDeliveryman, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TrainerTowerDude = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_TrainerTowerDude, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableClubReceptionist = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_CableClubReceptionist, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnionRoomReceptionist = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_UnionRoomReceptionist, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RockSmashRock = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_RockSmashRock, .images = sPicTable_RockSmashRock, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_StrengthBoulder = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_StrengthBoulder, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenNormal = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 512, .width = 16, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_RedGreenNormal, .images = sPicTable_GreenNormal, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenBike = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_BIKE_TIRE, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_GreenBike, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenSurf = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = TRUE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_RedGreenSurf, .images = sPicTable_GreenSurf, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFieldMove = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_RedGreenFieldMove, .images = sPicTable_GreenItem, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedBikeAlt = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_SPECIAL, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_BIKE_TIRE, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_RedBike, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RocketM = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_RocketM, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Celio = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Celio, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Agatha = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Agatha, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brock = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Brock, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Misty = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Misty, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LtSurge = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_LtSurge, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Erika = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Erika, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Koga = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Koga, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Giovanni = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Giovanni, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blaine = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Blaine, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sabrina = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Sabrina, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bill = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Bill, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Daisy = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Daisy, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lorelei = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Lorelei, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lance = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Lance, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blue = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Blue, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFish = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_RedGreenFish, .images = sPicTable_RedFish, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFish = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_RedGreenFish, .images = sPicTable_GreenFish, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeeker = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_RedGreenVSSeeker, .images = sPicTable_RedItem, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeekerBike = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_RedGreenVSSeekerBike, .images = sPicTable_RedVSSeekerBike, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeeker = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_RedGreenVSSeeker, .images = sPicTable_GreenItem, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeekerBike = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_RedGreenVSSeekerBike, .images = sPicTable_GreenVSSeekerBike, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TownMap = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 32, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_32x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_TownMap, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pokedex = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_Pokedex, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GBAKid = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_GBAKid, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Snorlax = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_Snorlax, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fossil = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_Fossil, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Ruby = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_Ruby, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sapphire = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_Sapphire, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldAmber = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_OldAmber, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GymSign = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Inanimate, .images = sPicTable_GymSign, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sign = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_Sign, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TrainerTips = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_WoodenSign, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clipboard = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Inanimate, .images = sPicTable_Clipboard, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Meteorite = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_METEORITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_SPECIAL, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Inanimate, .images = sPicTable_BirthIslandStone, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LaprasDoll = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_S, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Inanimate, .images = sPicTable_LaprasDoll, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spearow = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Spearow, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Omanyte = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Omanyte, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kangaskhan = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Kangaskhan, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Psyduck = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Psyduck, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NidoranF = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_NidoranF, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NidoranM = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_NidoranM, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nidorino = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Nidorino, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Meowth = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Meowth, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Seel = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Seel, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Voltorb = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Voltorb, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Slowpoke = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Slowpoke, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Slowbro = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Slowbro, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Machop = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Machop, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wigglytuff = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Wigglytuff, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Doduo = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Doduo, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fearow = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Fearow, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lapras = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Lapras, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Zapdos = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_Zapdos, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Moltres = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_Moltres, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Articuno = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_Articuno, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysD = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_DeoxysD, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysA = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_DeoxysA, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysN = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_DeoxysN, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mewtwo = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Mewtwo, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mew = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Mew, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Entei = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Entei, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Raikou = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Raikou, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Suicune = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Suicune, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_Lugia, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_HoOh, .images = sPicTable_HoOh, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Celebi = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Celebi, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Cubone = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Cubone, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Machoke = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Machoke, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kabuto = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Kabuto, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Poliwrath = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Poliwrath, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pidgeot = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Pidgeot, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Chansey = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Chansey, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pikachu = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Pikachu, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Jigglypuff = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Jigglypuff, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pidgey = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Pidgey, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clefairy = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Clefairy, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mom = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Mom, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Seagallop = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_SEAGALLOP, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 2048, .width = 64, .height = 64, .paletteSlot = PALSLOT_NPC_SPECIAL, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_64x64, .subspriteTables = gObjectEventSpriteOamTables_64x64, .anims = sAnimTable_Standard, .images = sPicTable_Seagallop, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SSAnne = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_SS_ANNE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 4096, .width = 128, .height = 64, .paletteSlot = PALSLOT_NPC_SPECIAL, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_8x8, .subspriteTables = gObjectEventSpriteOamTables_128x64, .anims = sAnimTable_Standard, .images = sPicTable_SSAnne, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CueBall = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_BIKE_TIRE, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_CueBall, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Painter = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Painter, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BirdKeeper = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_BirdKeeper, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Burglar = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Burglar, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonRangerF = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_PokemonRangerF, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonRangerM = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_PokemonRangerM, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RuinManiac = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_RuinManiac, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokeManiac = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_PokeManiac, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicM = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_PsychicM, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicF = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_PsychicF, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AromaLady = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_AromaLady, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Twin = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Twin, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_YoungCoupleM = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_YoungCoupleM, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_YoungCoupleF = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_YoungCoupleF, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Engineer = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Engineer, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Juggler = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Juggler, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tamer = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Tamer, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonBreeder = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_PokemonBreeder, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedUnderwater = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_27, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = TRUE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_RedUnderwater, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenUnderwater = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_27, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_PLAYER, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = TRUE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_GreenUnderwater, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scott = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Scott, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bulbasaur = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Bulbasaur, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Charmander = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Charmander, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Squirtle = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Squirtle, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latias = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_Latias, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latios = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_Latios, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EmBrendan = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_28, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_EmBrendan, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EmMay = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_29, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_EmMay, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableCar = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_CABLE_CAR, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 2048, .width = 64, .height = 64, .paletteSlot = PALSLOT_NPC_SPECIAL, .shadowSize = SHADOW_SIZE_M, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_64x64, .subspriteTables = gObjectEventSpriteOamTables_64x64, .anims = sAnimTable_Inanimate, .images = sPicTable_CableCar, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sudowoodo = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Sudowoodo, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Abra = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 128, .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x16, .subspriteTables = gObjectEventSpriteOamTables_16x16, .anims = sAnimTable_Standard, .images = sPicTable_Abra, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFWater2 = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_SwimmerFWater2, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBeauty = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterBeauty, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBirdKeeper = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterBirdKeeper, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBlackbelt = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterBlackbelt, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBugCatcher = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterBugCatcher, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterCooltrainerM = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterCooltrainerM, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterHiker = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterHiker, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterLass = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterLass, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterPsychicM = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterPsychicM, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterScientist = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterScientist, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterYoungster = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_MasterYoungster, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lady = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_LADY, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_SPECIAL, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Lady, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rocker2 = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Rocker2, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Anabel = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Anabel, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tucker = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 512, .width = 32, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_32x32, .subspriteTables = gObjectEventSpriteOamTables_32x32, .anims = sAnimTable_Standard, .images = sPicTable_Tucker, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Greta = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Greta, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spenser = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Spenser, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Noland = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Noland, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lucy = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_2, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Lucy, .affineAnims = gDummySpriteAffineAnimTable, }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brandon = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN, .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, .size = 256, .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_3, .shadowSize = SHADOW_SIZE_M, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, .oam = &gObjectEventBaseOam_16x32, .subspriteTables = gObjectEventSpriteOamTables_16x32, .anims = sAnimTable_Standard, .images = sPicTable_Brandon, .affineAnims = gDummySpriteAffineAnimTable, }; ================================================ FILE: src/data/object_events/object_event_graphics_info_pointers.h ================================================ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedNormal; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedBike; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedSurf; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFieldMove; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFish; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeeker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeekerBike; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenNormal; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenBike; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenSurf; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFieldMove; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFish; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeeker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeekerBike; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSBrendan; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSMay; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleBoy; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleGirl; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Youngster; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BugCatcher; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SittingBoy; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lass; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman1; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BattleGirl; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rocker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_FatMan; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman2; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Beauty; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BaldingMan; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman3; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan1; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan2; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldManLyingDown; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldWoman; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMWater; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberF; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMLand; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Camper; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Picnicker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CooltrainerM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CooltrainerF; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerMWater; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFWater; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerMLand; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFLand; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WorkerM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WorkerF; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RocketM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RocketF; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GBAKid; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SuperNerd; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Biker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blackbelt; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scientist; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hiker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fisher; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Channeler; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Chef; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Policeman; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Gentleman; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sailor; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Captain; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nurse; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableClubReceptionist; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnionRoomReceptionist; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMaleReceptionist; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clerk; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MGDeliveryman; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TrainerTowerDude; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ProfOak; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blue; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bill; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lance; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Agatha; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Daisy; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lorelei; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MrFuji; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bruno; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brock; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Misty; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LtSurge; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Erika; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Koga; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sabrina; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blaine; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Giovanni; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mom; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Celio; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TeachyTVHost; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GymGuy; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ItemBall; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TownMap; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pokedex; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CutTree; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RockSmashRock; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_StrengthBoulder; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fossil; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Ruby; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sapphire; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldAmber; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GymSign; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sign; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TrainerTips; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clipboard; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Meteorite; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LaprasDoll; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Seagallop; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Snorlax; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spearow; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Cubone; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Poliwrath; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clefairy; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pidgeot; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Jigglypuff; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pidgey; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Chansey; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Omanyte; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kangaskhan; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pikachu; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Psyduck; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NidoranF; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NidoranM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nidorino; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Meowth; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Seel; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Voltorb; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Slowpoke; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Slowbro; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Machop; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wigglytuff; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Doduo; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fearow; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Machoke; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lapras; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Zapdos; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Moltres; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Articuno; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mewtwo; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mew; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Entei; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Suicune; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Raikou; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Celebi; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kabuto; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysD; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysA; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysN; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SSAnne; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CueBall; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Painter; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BirdKeeper; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Burglar; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonRangerF; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonRangerM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RuinManiac; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokeManiac; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicF; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AromaLady; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Twin; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_YoungCoupleM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_YoungCoupleF; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Engineer; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Juggler; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tamer; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonBreeder; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedUnderwater; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenUnderwater; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scott; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bulbasaur; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Charmander; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Squirtle; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latias; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latios; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EmBrendan; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EmMay; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableCar; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sudowoodo; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Abra; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFWater2; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBeauty; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBirdKeeper; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBlackbelt; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBugCatcher; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterCooltrainerM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterHiker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterLass; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterPsychicM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterScientist; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterYoungster; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lady; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rocker2; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Anabel; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tucker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Greta; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spenser; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Noland; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lucy; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brandon; const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM_OBJ_EVENT_GFX] = { [OBJ_EVENT_GFX_RED_NORMAL] = &gObjectEventGraphicsInfo_RedNormal, [OBJ_EVENT_GFX_RED_BIKE] = &gObjectEventGraphicsInfo_RedBike, [OBJ_EVENT_GFX_RED_SURF] = &gObjectEventGraphicsInfo_RedSurf, [OBJ_EVENT_GFX_RED_FIELD_MOVE] = &gObjectEventGraphicsInfo_RedFieldMove, [OBJ_EVENT_GFX_RED_FISH] = &gObjectEventGraphicsInfo_RedFish, [OBJ_EVENT_GFX_RED_VS_SEEKER] = &gObjectEventGraphicsInfo_RedVSSeeker, [OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE] = &gObjectEventGraphicsInfo_RedVSSeekerBike, [OBJ_EVENT_GFX_GREEN_NORMAL] = &gObjectEventGraphicsInfo_GreenNormal, [OBJ_EVENT_GFX_GREEN_BIKE] = &gObjectEventGraphicsInfo_GreenBike, [OBJ_EVENT_GFX_GREEN_SURF] = &gObjectEventGraphicsInfo_GreenSurf, [OBJ_EVENT_GFX_GREEN_FIELD_MOVE] = &gObjectEventGraphicsInfo_GreenFieldMove, [OBJ_EVENT_GFX_GREEN_FISH] = &gObjectEventGraphicsInfo_GreenFish, [OBJ_EVENT_GFX_GREEN_VS_SEEKER] = &gObjectEventGraphicsInfo_GreenVSSeeker, [OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE] = &gObjectEventGraphicsInfo_GreenVSSeekerBike, [OBJ_EVENT_GFX_RS_BRENDAN] = &gObjectEventGraphicsInfo_RSBrendan, [OBJ_EVENT_GFX_RS_MAY] = &gObjectEventGraphicsInfo_RSMay, [OBJ_EVENT_GFX_LITTLE_BOY] = &gObjectEventGraphicsInfo_LittleBoy, [OBJ_EVENT_GFX_LITTLE_GIRL] = &gObjectEventGraphicsInfo_LittleGirl, [OBJ_EVENT_GFX_YOUNGSTER] = &gObjectEventGraphicsInfo_Youngster, [OBJ_EVENT_GFX_BOY] = &gObjectEventGraphicsInfo_Boy, [OBJ_EVENT_GFX_BUG_CATCHER] = &gObjectEventGraphicsInfo_BugCatcher, [OBJ_EVENT_GFX_SITTING_BOY] = &gObjectEventGraphicsInfo_SittingBoy, [OBJ_EVENT_GFX_LASS] = &gObjectEventGraphicsInfo_Lass, [OBJ_EVENT_GFX_WOMAN_1] = &gObjectEventGraphicsInfo_Woman1, [OBJ_EVENT_GFX_BATTLE_GIRL] = &gObjectEventGraphicsInfo_BattleGirl, [OBJ_EVENT_GFX_MAN] = &gObjectEventGraphicsInfo_Man, [OBJ_EVENT_GFX_ROCKER] = &gObjectEventGraphicsInfo_Rocker, [OBJ_EVENT_GFX_FAT_MAN] = &gObjectEventGraphicsInfo_FatMan, [OBJ_EVENT_GFX_WOMAN_2] = &gObjectEventGraphicsInfo_Woman2, [OBJ_EVENT_GFX_BEAUTY] = &gObjectEventGraphicsInfo_Beauty, [OBJ_EVENT_GFX_BALDING_MAN] = &gObjectEventGraphicsInfo_BaldingMan, [OBJ_EVENT_GFX_WOMAN_3] = &gObjectEventGraphicsInfo_Woman3, [OBJ_EVENT_GFX_OLD_MAN_1] = &gObjectEventGraphicsInfo_OldMan1, [OBJ_EVENT_GFX_OLD_MAN_2] = &gObjectEventGraphicsInfo_OldMan2, [OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN] = &gObjectEventGraphicsInfo_OldManLyingDown, [OBJ_EVENT_GFX_OLD_WOMAN] = &gObjectEventGraphicsInfo_OldWoman, [OBJ_EVENT_GFX_TUBER_M_WATER] = &gObjectEventGraphicsInfo_TuberMWater, [OBJ_EVENT_GFX_TUBER_F] = &gObjectEventGraphicsInfo_TuberF, [OBJ_EVENT_GFX_TUBER_M_LAND] = &gObjectEventGraphicsInfo_TuberMLand, [OBJ_EVENT_GFX_CAMPER] = &gObjectEventGraphicsInfo_Camper, [OBJ_EVENT_GFX_PICNICKER] = &gObjectEventGraphicsInfo_Picnicker, [OBJ_EVENT_GFX_COOLTRAINER_M] = &gObjectEventGraphicsInfo_CooltrainerM, [OBJ_EVENT_GFX_COOLTRAINER_F] = &gObjectEventGraphicsInfo_CooltrainerF, [OBJ_EVENT_GFX_SWIMMER_M_WATER] = &gObjectEventGraphicsInfo_SwimmerMWater, [OBJ_EVENT_GFX_SWIMMER_F_WATER] = &gObjectEventGraphicsInfo_SwimmerFWater, [OBJ_EVENT_GFX_SWIMMER_M_LAND] = &gObjectEventGraphicsInfo_SwimmerMLand, [OBJ_EVENT_GFX_SWIMMER_F_LAND] = &gObjectEventGraphicsInfo_SwimmerFLand, [OBJ_EVENT_GFX_WORKER_M] = &gObjectEventGraphicsInfo_WorkerM, [OBJ_EVENT_GFX_WORKER_F] = &gObjectEventGraphicsInfo_WorkerF, [OBJ_EVENT_GFX_ROCKET_M] = &gObjectEventGraphicsInfo_RocketM, [OBJ_EVENT_GFX_ROCKET_F] = &gObjectEventGraphicsInfo_RocketF, [OBJ_EVENT_GFX_GBA_KID] = &gObjectEventGraphicsInfo_GBAKid, [OBJ_EVENT_GFX_SUPER_NERD] = &gObjectEventGraphicsInfo_SuperNerd, [OBJ_EVENT_GFX_BIKER] = &gObjectEventGraphicsInfo_Biker, [OBJ_EVENT_GFX_BLACKBELT] = &gObjectEventGraphicsInfo_Blackbelt, [OBJ_EVENT_GFX_SCIENTIST] = &gObjectEventGraphicsInfo_Scientist, [OBJ_EVENT_GFX_HIKER] = &gObjectEventGraphicsInfo_Hiker, [OBJ_EVENT_GFX_FISHER] = &gObjectEventGraphicsInfo_Fisher, [OBJ_EVENT_GFX_CHANNELER] = &gObjectEventGraphicsInfo_Channeler, [OBJ_EVENT_GFX_CHEF] = &gObjectEventGraphicsInfo_Chef, [OBJ_EVENT_GFX_POLICEMAN] = &gObjectEventGraphicsInfo_Policeman, [OBJ_EVENT_GFX_GENTLEMAN] = &gObjectEventGraphicsInfo_Gentleman, [OBJ_EVENT_GFX_SAILOR] = &gObjectEventGraphicsInfo_Sailor, [OBJ_EVENT_GFX_CAPTAIN] = &gObjectEventGraphicsInfo_Captain, [OBJ_EVENT_GFX_NURSE] = &gObjectEventGraphicsInfo_Nurse, [OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST] = &gObjectEventGraphicsInfo_CableClubReceptionist, [OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST] = &gObjectEventGraphicsInfo_UnionRoomReceptionist, [OBJ_EVENT_GFX_UNUSED_MALE_RECEPTIONIST] = &gObjectEventGraphicsInfo_UnusedMaleReceptionist, [OBJ_EVENT_GFX_CLERK] = &gObjectEventGraphicsInfo_Clerk, [OBJ_EVENT_GFX_MG_DELIVERYMAN] = &gObjectEventGraphicsInfo_MGDeliveryman, [OBJ_EVENT_GFX_TRAINER_TOWER_DUDE] = &gObjectEventGraphicsInfo_TrainerTowerDude, [OBJ_EVENT_GFX_PROF_OAK] = &gObjectEventGraphicsInfo_ProfOak, [OBJ_EVENT_GFX_BLUE] = &gObjectEventGraphicsInfo_Blue, [OBJ_EVENT_GFX_BILL] = &gObjectEventGraphicsInfo_Bill, [OBJ_EVENT_GFX_LANCE] = &gObjectEventGraphicsInfo_Lance, [OBJ_EVENT_GFX_AGATHA] = &gObjectEventGraphicsInfo_Agatha, [OBJ_EVENT_GFX_DAISY] = &gObjectEventGraphicsInfo_Daisy, [OBJ_EVENT_GFX_LORELEI] = &gObjectEventGraphicsInfo_Lorelei, [OBJ_EVENT_GFX_MR_FUJI] = &gObjectEventGraphicsInfo_MrFuji, [OBJ_EVENT_GFX_BRUNO] = &gObjectEventGraphicsInfo_Bruno, [OBJ_EVENT_GFX_BROCK] = &gObjectEventGraphicsInfo_Brock, [OBJ_EVENT_GFX_MISTY] = &gObjectEventGraphicsInfo_Misty, [OBJ_EVENT_GFX_LT_SURGE] = &gObjectEventGraphicsInfo_LtSurge, [OBJ_EVENT_GFX_ERIKA] = &gObjectEventGraphicsInfo_Erika, [OBJ_EVENT_GFX_KOGA] = &gObjectEventGraphicsInfo_Koga, [OBJ_EVENT_GFX_SABRINA] = &gObjectEventGraphicsInfo_Sabrina, [OBJ_EVENT_GFX_BLAINE] = &gObjectEventGraphicsInfo_Blaine, [OBJ_EVENT_GFX_GIOVANNI] = &gObjectEventGraphicsInfo_Giovanni, [OBJ_EVENT_GFX_MOM] = &gObjectEventGraphicsInfo_Mom, [OBJ_EVENT_GFX_CELIO] = &gObjectEventGraphicsInfo_Celio, [OBJ_EVENT_GFX_TEACHY_TV_HOST] = &gObjectEventGraphicsInfo_TeachyTVHost, [OBJ_EVENT_GFX_GYM_GUY] = &gObjectEventGraphicsInfo_GymGuy, [OBJ_EVENT_GFX_ITEM_BALL] = &gObjectEventGraphicsInfo_ItemBall, [OBJ_EVENT_GFX_TOWN_MAP] = &gObjectEventGraphicsInfo_TownMap, [OBJ_EVENT_GFX_POKEDEX] = &gObjectEventGraphicsInfo_Pokedex, [OBJ_EVENT_GFX_CUT_TREE] = &gObjectEventGraphicsInfo_CutTree, [OBJ_EVENT_GFX_ROCK_SMASH_ROCK] = &gObjectEventGraphicsInfo_RockSmashRock, [OBJ_EVENT_GFX_PUSHABLE_BOULDER] = &gObjectEventGraphicsInfo_StrengthBoulder, [OBJ_EVENT_GFX_FOSSIL] = &gObjectEventGraphicsInfo_Fossil, [OBJ_EVENT_GFX_RUBY] = &gObjectEventGraphicsInfo_Ruby, [OBJ_EVENT_GFX_SAPPHIRE] = &gObjectEventGraphicsInfo_Sapphire, [OBJ_EVENT_GFX_OLD_AMBER] = &gObjectEventGraphicsInfo_OldAmber, [OBJ_EVENT_GFX_GYM_SIGN] = &gObjectEventGraphicsInfo_GymSign, [OBJ_EVENT_GFX_SIGN] = &gObjectEventGraphicsInfo_Sign, [OBJ_EVENT_GFX_TRAINER_TIPS] = &gObjectEventGraphicsInfo_TrainerTips, [OBJ_EVENT_GFX_CLIPBOARD] = &gObjectEventGraphicsInfo_Clipboard, [OBJ_EVENT_GFX_METEORITE] = &gObjectEventGraphicsInfo_Meteorite, [OBJ_EVENT_GFX_LAPRAS_DOLL] = &gObjectEventGraphicsInfo_LaprasDoll, [OBJ_EVENT_GFX_SEAGALLOP] = &gObjectEventGraphicsInfo_Seagallop, [OBJ_EVENT_GFX_SNORLAX] = &gObjectEventGraphicsInfo_Snorlax, [OBJ_EVENT_GFX_SPEAROW] = &gObjectEventGraphicsInfo_Spearow, [OBJ_EVENT_GFX_CUBONE] = &gObjectEventGraphicsInfo_Cubone, [OBJ_EVENT_GFX_POLIWRATH] = &gObjectEventGraphicsInfo_Poliwrath, [OBJ_EVENT_GFX_CLEFAIRY] = &gObjectEventGraphicsInfo_Clefairy, [OBJ_EVENT_GFX_PIDGEOT] = &gObjectEventGraphicsInfo_Pidgeot, [OBJ_EVENT_GFX_JIGGLYPUFF] = &gObjectEventGraphicsInfo_Jigglypuff, [OBJ_EVENT_GFX_PIDGEY] = &gObjectEventGraphicsInfo_Pidgey, [OBJ_EVENT_GFX_CHANSEY] = &gObjectEventGraphicsInfo_Chansey, [OBJ_EVENT_GFX_OMANYTE] = &gObjectEventGraphicsInfo_Omanyte, [OBJ_EVENT_GFX_KANGASKHAN] = &gObjectEventGraphicsInfo_Kangaskhan, [OBJ_EVENT_GFX_PIKACHU] = &gObjectEventGraphicsInfo_Pikachu, [OBJ_EVENT_GFX_PSYDUCK] = &gObjectEventGraphicsInfo_Psyduck, [OBJ_EVENT_GFX_NIDORAN_F] = &gObjectEventGraphicsInfo_NidoranF, [OBJ_EVENT_GFX_NIDORAN_M] = &gObjectEventGraphicsInfo_NidoranM, [OBJ_EVENT_GFX_NIDORINO] = &gObjectEventGraphicsInfo_Nidorino, [OBJ_EVENT_GFX_MEOWTH] = &gObjectEventGraphicsInfo_Meowth, [OBJ_EVENT_GFX_SEEL] = &gObjectEventGraphicsInfo_Seel, [OBJ_EVENT_GFX_VOLTORB] = &gObjectEventGraphicsInfo_Voltorb, [OBJ_EVENT_GFX_SLOWPOKE] = &gObjectEventGraphicsInfo_Slowpoke, [OBJ_EVENT_GFX_SLOWBRO] = &gObjectEventGraphicsInfo_Slowbro, [OBJ_EVENT_GFX_MACHOP] = &gObjectEventGraphicsInfo_Machop, [OBJ_EVENT_GFX_WIGGLYTUFF] = &gObjectEventGraphicsInfo_Wigglytuff, [OBJ_EVENT_GFX_DODUO] = &gObjectEventGraphicsInfo_Doduo, [OBJ_EVENT_GFX_FEAROW] = &gObjectEventGraphicsInfo_Fearow, [OBJ_EVENT_GFX_MACHOKE] = &gObjectEventGraphicsInfo_Machoke, [OBJ_EVENT_GFX_LAPRAS] = &gObjectEventGraphicsInfo_Lapras, [OBJ_EVENT_GFX_ZAPDOS] = &gObjectEventGraphicsInfo_Zapdos, [OBJ_EVENT_GFX_MOLTRES] = &gObjectEventGraphicsInfo_Moltres, [OBJ_EVENT_GFX_ARTICUNO] = &gObjectEventGraphicsInfo_Articuno, [OBJ_EVENT_GFX_MEWTWO] = &gObjectEventGraphicsInfo_Mewtwo, [OBJ_EVENT_GFX_MEW] = &gObjectEventGraphicsInfo_Mew, [OBJ_EVENT_GFX_ENTEI] = &gObjectEventGraphicsInfo_Entei, [OBJ_EVENT_GFX_SUICUNE] = &gObjectEventGraphicsInfo_Suicune, [OBJ_EVENT_GFX_RAIKOU] = &gObjectEventGraphicsInfo_Raikou, [OBJ_EVENT_GFX_LUGIA] = &gObjectEventGraphicsInfo_Lugia, [OBJ_EVENT_GFX_HO_OH] = &gObjectEventGraphicsInfo_HoOh, [OBJ_EVENT_GFX_CELEBI] = &gObjectEventGraphicsInfo_Celebi, [OBJ_EVENT_GFX_KABUTO] = &gObjectEventGraphicsInfo_Kabuto, [OBJ_EVENT_GFX_DEOXYS_D] = &gObjectEventGraphicsInfo_DeoxysD, [OBJ_EVENT_GFX_DEOXYS_A] = &gObjectEventGraphicsInfo_DeoxysA, [OBJ_EVENT_GFX_DEOXYS_N] = &gObjectEventGraphicsInfo_DeoxysN, [OBJ_EVENT_GFX_SS_ANNE] = &gObjectEventGraphicsInfo_SSAnne, [OBJ_EVENT_GFX_CUE_BALL] = &gObjectEventGraphicsInfo_CueBall, [OBJ_EVENT_GFX_PAINTER] = &gObjectEventGraphicsInfo_Painter, [OBJ_EVENT_GFX_BIRD_KEEPER] = &gObjectEventGraphicsInfo_BirdKeeper, [OBJ_EVENT_GFX_BURGLAR] = &gObjectEventGraphicsInfo_Burglar, [OBJ_EVENT_GFX_POKEMON_RANGER_F] = &gObjectEventGraphicsInfo_PokemonRangerF, [OBJ_EVENT_GFX_POKEMON_RANGER_M] = &gObjectEventGraphicsInfo_PokemonRangerM, [OBJ_EVENT_GFX_RUIN_MANIAC] = &gObjectEventGraphicsInfo_RuinManiac, [OBJ_EVENT_GFX_POKE_MANIAC] = &gObjectEventGraphicsInfo_PokeManiac, [OBJ_EVENT_GFX_PSYCHIC_M] = &gObjectEventGraphicsInfo_PsychicM, [OBJ_EVENT_GFX_PSYCHIC_F] = &gObjectEventGraphicsInfo_PsychicF, [OBJ_EVENT_GFX_AROMA_LADY] = &gObjectEventGraphicsInfo_AromaLady, [OBJ_EVENT_GFX_TWIN] = &gObjectEventGraphicsInfo_Twin, [OBJ_EVENT_GFX_YOUNG_COUPLE_M] = &gObjectEventGraphicsInfo_YoungCoupleM, [OBJ_EVENT_GFX_YOUNG_COUPLE_F] = &gObjectEventGraphicsInfo_YoungCoupleF, [OBJ_EVENT_GFX_ENGINEER] = &gObjectEventGraphicsInfo_Engineer, [OBJ_EVENT_GFX_JUGGLER] = &gObjectEventGraphicsInfo_Juggler, [OBJ_EVENT_GFX_TAMER] = &gObjectEventGraphicsInfo_Tamer, [OBJ_EVENT_GFX_POKEMON_BREEDER] = &gObjectEventGraphicsInfo_PokemonBreeder, [OBJ_EVENT_GFX_RED_UNDERWATER] = &gObjectEventGraphicsInfo_RedUnderwater, [OBJ_EVENT_GFX_GREEN_UNDERWATER] = &gObjectEventGraphicsInfo_GreenUnderwater, [OBJ_EVENT_GFX_SCOTT] = &gObjectEventGraphicsInfo_Scott, [OBJ_EVENT_GFX_BULBASAUR] = &gObjectEventGraphicsInfo_Bulbasaur, [OBJ_EVENT_GFX_CHARMANDER] = &gObjectEventGraphicsInfo_Charmander, [OBJ_EVENT_GFX_SQUIRTLE] = &gObjectEventGraphicsInfo_Squirtle, [OBJ_EVENT_GFX_LATIAS] = &gObjectEventGraphicsInfo_Latias, [OBJ_EVENT_GFX_LATIOS] = &gObjectEventGraphicsInfo_Latios, [OBJ_EVENT_GFX_EM_BRENDAN] = &gObjectEventGraphicsInfo_EmBrendan, [OBJ_EVENT_GFX_EM_MAY] = &gObjectEventGraphicsInfo_EmMay, [OBJ_EVENT_GFX_CABLE_CAR] = &gObjectEventGraphicsInfo_CableCar, [OBJ_EVENT_GFX_SUDOWOODO] = &gObjectEventGraphicsInfo_Sudowoodo, [OBJ_EVENT_GFX_ABRA] = &gObjectEventGraphicsInfo_Abra, [OBJ_EVENT_GFX_SWIMMER_F_WATER_2] = &gObjectEventGraphicsInfo_SwimmerFWater2, [OBJ_EVENT_GFX_MASTER_BEAUTY] = &gObjectEventGraphicsInfo_MasterBeauty, [OBJ_EVENT_GFX_MASTER_BIRD_KEEPER] = &gObjectEventGraphicsInfo_MasterBirdKeeper, [OBJ_EVENT_GFX_MASTER_BLACK_BELT] = &gObjectEventGraphicsInfo_MasterBlackbelt, [OBJ_EVENT_GFX_MASTER_BUG_CATCHER] = &gObjectEventGraphicsInfo_MasterBugCatcher, [OBJ_EVENT_GFX_MASTER_COOLTRAINER_M] = &gObjectEventGraphicsInfo_MasterCooltrainerM, [OBJ_EVENT_GFX_MASTER_HIKER] = &gObjectEventGraphicsInfo_MasterHiker, [OBJ_EVENT_GFX_MASTER_LASS] = &gObjectEventGraphicsInfo_MasterLass, [OBJ_EVENT_GFX_MASTER_PSYCHIC_M] = &gObjectEventGraphicsInfo_MasterPsychicM, [OBJ_EVENT_GFX_MASTER_SCIENTIST] = &gObjectEventGraphicsInfo_MasterScientist, [OBJ_EVENT_GFX_MASTER_YOUNGSTER] = &gObjectEventGraphicsInfo_MasterYoungster, [OBJ_EVENT_GFX_LADY] = &gObjectEventGraphicsInfo_Lady, [OBJ_EVENT_GFX_ROCKER_2] = &gObjectEventGraphicsInfo_Rocker2, [OBJ_EVENT_GFX_ANABEL] = &gObjectEventGraphicsInfo_Anabel, [OBJ_EVENT_GFX_TUCKER] = &gObjectEventGraphicsInfo_Tucker, [OBJ_EVENT_GFX_GRETA] = &gObjectEventGraphicsInfo_Greta, [OBJ_EVENT_GFX_SPENSER] = &gObjectEventGraphicsInfo_Spenser, [OBJ_EVENT_GFX_NOLAND] = &gObjectEventGraphicsInfo_Noland, [OBJ_EVENT_GFX_LUCY] = &gObjectEventGraphicsInfo_Lucy, [OBJ_EVENT_GFX_BRANDON] = &gObjectEventGraphicsInfo_Brandon, }; ================================================ FILE: src/data/object_events/object_event_pic_tables.h ================================================ static const struct SpriteFrameImage sPicTable_RedNormal[] = { overworld_frame(gObjectEventPic_RedNormal, 2, 4, 0), overworld_frame(gObjectEventPic_RedNormal, 2, 4, 1), overworld_frame(gObjectEventPic_RedNormal, 2, 4, 2), overworld_frame(gObjectEventPic_RedNormal, 2, 4, 3), overworld_frame(gObjectEventPic_RedNormal, 2, 4, 4), overworld_frame(gObjectEventPic_RedNormal, 2, 4, 5), overworld_frame(gObjectEventPic_RedNormal, 2, 4, 6), overworld_frame(gObjectEventPic_RedNormal, 2, 4, 7), overworld_frame(gObjectEventPic_RedNormal, 2, 4, 8), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 3), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 4), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 5), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 6), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 7), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 8), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 9), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 10), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 11), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 12), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 13), }; static const struct SpriteFrameImage sPicTable_RedBike[] = { overworld_frame(gObjectEventPic_RedBike, 4, 4, 0), overworld_frame(gObjectEventPic_RedBike, 4, 4, 1), overworld_frame(gObjectEventPic_RedBike, 4, 4, 2), overworld_frame(gObjectEventPic_RedBike, 4, 4, 3), overworld_frame(gObjectEventPic_RedBike, 4, 4, 4), overworld_frame(gObjectEventPic_RedBike, 4, 4, 5), overworld_frame(gObjectEventPic_RedBike, 4, 4, 6), overworld_frame(gObjectEventPic_RedBike, 4, 4, 7), overworld_frame(gObjectEventPic_RedBike, 4, 4, 8), }; static const struct SpriteFrameImage sPicTable_GreenNormal[] = { overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 0), overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 1), overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 2), overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 3), overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 4), overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 5), overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 6), overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 7), overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 8), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 3), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 4), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 5), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 6), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 7), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 8), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 9), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 10), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 11), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 12), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 13), }; static const struct SpriteFrameImage sPicTable_GreenBike[] = { overworld_frame(gObjectEventPic_GreenBike, 4, 4, 0), overworld_frame(gObjectEventPic_GreenBike, 4, 4, 1), overworld_frame(gObjectEventPic_GreenBike, 4, 4, 2), overworld_frame(gObjectEventPic_GreenBike, 4, 4, 3), overworld_frame(gObjectEventPic_GreenBike, 4, 4, 4), overworld_frame(gObjectEventPic_GreenBike, 4, 4, 5), overworld_frame(gObjectEventPic_GreenBike, 4, 4, 6), overworld_frame(gObjectEventPic_GreenBike, 4, 4, 7), overworld_frame(gObjectEventPic_GreenBike, 4, 4, 8), }; static const struct SpriteFrameImage sPicTable_RedSurf[] = { overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 0), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 1), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 2), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 0), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 0), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 1), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 1), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 2), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 2), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 0), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 1), overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_GreenSurf[] = { overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 0), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 1), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 2), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 0), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 0), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 1), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 1), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 2), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 2), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 0), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 1), overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_RedItem[] = { overworld_frame(gObjectEventPic_RedItem, 2, 4, 0), overworld_frame(gObjectEventPic_RedItem, 2, 4, 1), overworld_frame(gObjectEventPic_RedItem, 2, 4, 2), overworld_frame(gObjectEventPic_RedItem, 2, 4, 3), overworld_frame(gObjectEventPic_RedItem, 2, 4, 4), overworld_frame(gObjectEventPic_RedItem, 2, 4, 5), overworld_frame(gObjectEventPic_RedItem, 2, 4, 6), overworld_frame(gObjectEventPic_RedItem, 2, 4, 7), overworld_frame(gObjectEventPic_RedItem, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_GreenItem[] = { overworld_frame(gObjectEventPic_GreenItem, 2, 4, 0), overworld_frame(gObjectEventPic_GreenItem, 2, 4, 1), overworld_frame(gObjectEventPic_GreenItem, 2, 4, 2), overworld_frame(gObjectEventPic_GreenItem, 2, 4, 3), overworld_frame(gObjectEventPic_GreenItem, 2, 4, 4), overworld_frame(gObjectEventPic_GreenItem, 2, 4, 5), overworld_frame(gObjectEventPic_GreenItem, 2, 4, 6), overworld_frame(gObjectEventPic_GreenItem, 2, 4, 7), overworld_frame(gObjectEventPic_GreenItem, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_RedVSSeekerBike[] = { overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 0), overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 1), overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 2), overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 3), overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 4), overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 5), }; static const struct SpriteFrameImage sPicTable_GreenVSSeekerBike[] = { overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 0), overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 1), overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 2), overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 3), overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 4), overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 5), }; static const struct SpriteFrameImage sPicTable_RedUnderwater[] = { overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 0), overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 1), overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 2), overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 0), overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 0), overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 1), overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 1), overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 2), overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 2), }; static const struct SpriteFrameImage sPicTable_GreenUnderwater[] = { overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 0), overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 1), overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 2), overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 0), overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 0), overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 1), overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 1), overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 2), overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 2), }; static const struct SpriteFrameImage sPicTable_RSBrendan[] = { overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 0), overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 1), overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 2), overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 3), overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 4), overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 5), overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 6), overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 7), overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 8), overworld_frame(gObjectEventPic_RSMay, 2, 4, 0), }; static const struct SpriteFrameImage sPicTable_RSMay[] = { overworld_frame(gObjectEventPic_RSMay, 2, 4, 0), overworld_frame(gObjectEventPic_RSMay, 2, 4, 1), overworld_frame(gObjectEventPic_RSMay, 2, 4, 2), overworld_frame(gObjectEventPic_RSMay, 2, 4, 3), overworld_frame(gObjectEventPic_RSMay, 2, 4, 4), overworld_frame(gObjectEventPic_RSMay, 2, 4, 5), overworld_frame(gObjectEventPic_RSMay, 2, 4, 6), overworld_frame(gObjectEventPic_RSMay, 2, 4, 7), overworld_frame(gObjectEventPic_RSMay, 2, 4, 8), overworld_frame(gObjectEventPic_RedFish, 2, 4, 0), }; static const struct SpriteFrameImage sPicTable_Policeman[] = { overworld_frame(gObjectEventPic_Policeman, 2, 4, 0), overworld_frame(gObjectEventPic_Policeman, 2, 4, 1), overworld_frame(gObjectEventPic_Policeman, 2, 4, 2), overworld_frame(gObjectEventPic_Policeman, 2, 4, 3), overworld_frame(gObjectEventPic_Policeman, 2, 4, 4), overworld_frame(gObjectEventPic_Policeman, 2, 4, 5), overworld_frame(gObjectEventPic_Policeman, 2, 4, 6), overworld_frame(gObjectEventPic_Policeman, 2, 4, 7), overworld_frame(gObjectEventPic_Policeman, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_LittleBoy[] = { overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 0), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 1), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 2), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 3), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 4), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 5), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 6), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 7), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 8), }; static const struct SpriteFrameImage sPicTable_LittleGirl[] = { overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 0), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 1), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 2), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 3), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 4), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 5), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 6), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 7), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 8), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 9), }; static const struct SpriteFrameImage sPicTable_Twin[] = { overworld_frame(gObjectEventPic_Twin, 2, 2, 0), overworld_frame(gObjectEventPic_Twin, 2, 2, 1), overworld_frame(gObjectEventPic_Twin, 2, 2, 2), overworld_frame(gObjectEventPic_Twin, 2, 2, 3), overworld_frame(gObjectEventPic_Twin, 2, 2, 4), overworld_frame(gObjectEventPic_Twin, 2, 2, 5), overworld_frame(gObjectEventPic_Twin, 2, 2, 6), overworld_frame(gObjectEventPic_Twin, 2, 2, 7), overworld_frame(gObjectEventPic_Twin, 2, 2, 8), overworld_frame(gObjectEventPic_Twin, 2, 2, 9), }; static const struct SpriteFrameImage sPicTable_SittingBoy[] = { overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 0), overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 2), overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 1), overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 0), overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 0), overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 2), overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 2), overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 1), overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 1), }; static const struct SpriteFrameImage sPicTable_Lass[] = { overworld_frame(gObjectEventPic_Lass, 2, 4, 0), overworld_frame(gObjectEventPic_Lass, 2, 4, 1), overworld_frame(gObjectEventPic_Lass, 2, 4, 2), overworld_frame(gObjectEventPic_Lass, 2, 4, 3), overworld_frame(gObjectEventPic_Lass, 2, 4, 4), overworld_frame(gObjectEventPic_Lass, 2, 4, 5), overworld_frame(gObjectEventPic_Lass, 2, 4, 6), overworld_frame(gObjectEventPic_Lass, 2, 4, 7), overworld_frame(gObjectEventPic_Lass, 2, 4, 8), overworld_frame(gObjectEventPic_Lass, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Youngster[] = { overworld_frame(gObjectEventPic_Youngster, 2, 4, 0), overworld_frame(gObjectEventPic_Youngster, 2, 4, 1), overworld_frame(gObjectEventPic_Youngster, 2, 4, 2), overworld_frame(gObjectEventPic_Youngster, 2, 4, 3), overworld_frame(gObjectEventPic_Youngster, 2, 4, 4), overworld_frame(gObjectEventPic_Youngster, 2, 4, 5), overworld_frame(gObjectEventPic_Youngster, 2, 4, 6), overworld_frame(gObjectEventPic_Youngster, 2, 4, 7), overworld_frame(gObjectEventPic_Youngster, 2, 4, 8), overworld_frame(gObjectEventPic_Youngster, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Woman1[] = { overworld_frame(gObjectEventPic_Woman1, 2, 4, 0), overworld_frame(gObjectEventPic_Woman1, 2, 4, 1), overworld_frame(gObjectEventPic_Woman1, 2, 4, 2), overworld_frame(gObjectEventPic_Woman1, 2, 4, 3), overworld_frame(gObjectEventPic_Woman1, 2, 4, 4), overworld_frame(gObjectEventPic_Woman1, 2, 4, 5), overworld_frame(gObjectEventPic_Woman1, 2, 4, 6), overworld_frame(gObjectEventPic_Woman1, 2, 4, 7), overworld_frame(gObjectEventPic_Woman1, 2, 4, 8), overworld_frame(gObjectEventPic_Woman1, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Woman3[] = { overworld_frame(gObjectEventPic_Woman3, 2, 4, 0), overworld_frame(gObjectEventPic_Woman3, 2, 4, 1), overworld_frame(gObjectEventPic_Woman3, 2, 4, 2), overworld_frame(gObjectEventPic_Woman3, 2, 4, 3), overworld_frame(gObjectEventPic_Woman3, 2, 4, 4), overworld_frame(gObjectEventPic_Woman3, 2, 4, 5), overworld_frame(gObjectEventPic_Woman3, 2, 4, 6), overworld_frame(gObjectEventPic_Woman3, 2, 4, 7), overworld_frame(gObjectEventPic_Woman3, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_BattleGirl[] = { overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 0), overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 1), overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 2), overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 3), overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 4), overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 5), overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 6), overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 7), overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 8), overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Painter[] = { overworld_frame(gObjectEventPic_Painter, 2, 4, 0), overworld_frame(gObjectEventPic_Painter, 2, 4, 1), overworld_frame(gObjectEventPic_Painter, 2, 4, 2), overworld_frame(gObjectEventPic_Painter, 2, 4, 3), overworld_frame(gObjectEventPic_Painter, 2, 4, 4), overworld_frame(gObjectEventPic_Painter, 2, 4, 5), overworld_frame(gObjectEventPic_Painter, 2, 4, 6), overworld_frame(gObjectEventPic_Painter, 2, 4, 7), overworld_frame(gObjectEventPic_Painter, 2, 4, 8), overworld_frame(gObjectEventPic_Painter, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_BugCatcher[] = { overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 0), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 1), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 2), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 3), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 4), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 5), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 6), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 7), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 8), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_FatMan[] = { overworld_frame(gObjectEventPic_FatMan, 2, 4, 0), overworld_frame(gObjectEventPic_FatMan, 2, 4, 1), overworld_frame(gObjectEventPic_FatMan, 2, 4, 2), overworld_frame(gObjectEventPic_FatMan, 2, 4, 3), overworld_frame(gObjectEventPic_FatMan, 2, 4, 4), overworld_frame(gObjectEventPic_FatMan, 2, 4, 5), overworld_frame(gObjectEventPic_FatMan, 2, 4, 6), overworld_frame(gObjectEventPic_FatMan, 2, 4, 7), overworld_frame(gObjectEventPic_FatMan, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Scott[] = { overworld_frame(gObjectEventPic_Scott, 2, 4, 0), overworld_frame(gObjectEventPic_Scott, 2, 4, 1), overworld_frame(gObjectEventPic_Scott, 2, 4, 2), overworld_frame(gObjectEventPic_Scott, 2, 4, 3), overworld_frame(gObjectEventPic_Scott, 2, 4, 4), overworld_frame(gObjectEventPic_Scott, 2, 4, 5), overworld_frame(gObjectEventPic_Scott, 2, 4, 6), overworld_frame(gObjectEventPic_Scott, 2, 4, 7), overworld_frame(gObjectEventPic_Scott, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_BaldingMan[] = { overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 0), overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 1), overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 2), overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 3), overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 4), overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 5), overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 6), overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 7), overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 8), overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Woman2[] = { overworld_frame(gObjectEventPic_Woman2, 2, 4, 0), overworld_frame(gObjectEventPic_Woman2, 2, 4, 1), overworld_frame(gObjectEventPic_Woman2, 2, 4, 2), overworld_frame(gObjectEventPic_Woman2, 2, 4, 3), overworld_frame(gObjectEventPic_Woman2, 2, 4, 4), overworld_frame(gObjectEventPic_Woman2, 2, 4, 5), overworld_frame(gObjectEventPic_Woman2, 2, 4, 6), overworld_frame(gObjectEventPic_Woman2, 2, 4, 7), overworld_frame(gObjectEventPic_Woman2, 2, 4, 8), overworld_frame(gObjectEventPic_Woman2, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_OldMan1[] = { overworld_frame(gObjectEventPic_OldMan1, 2, 4, 0), overworld_frame(gObjectEventPic_OldMan1, 2, 4, 1), overworld_frame(gObjectEventPic_OldMan1, 2, 4, 2), overworld_frame(gObjectEventPic_OldMan1, 2, 4, 3), overworld_frame(gObjectEventPic_OldMan1, 2, 4, 4), overworld_frame(gObjectEventPic_OldMan1, 2, 4, 5), overworld_frame(gObjectEventPic_OldMan1, 2, 4, 6), overworld_frame(gObjectEventPic_OldMan1, 2, 4, 7), overworld_frame(gObjectEventPic_OldMan1, 2, 4, 8), overworld_frame(gObjectEventPic_OldMan1, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_WorkerM[] = { overworld_frame(gObjectEventPic_WorkerM, 2, 4, 0), overworld_frame(gObjectEventPic_WorkerM, 2, 4, 1), overworld_frame(gObjectEventPic_WorkerM, 2, 4, 2), overworld_frame(gObjectEventPic_WorkerM, 2, 4, 3), overworld_frame(gObjectEventPic_WorkerM, 2, 4, 4), overworld_frame(gObjectEventPic_WorkerM, 2, 4, 5), overworld_frame(gObjectEventPic_WorkerM, 2, 4, 6), overworld_frame(gObjectEventPic_WorkerM, 2, 4, 7), overworld_frame(gObjectEventPic_WorkerM, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_WorkerF[] = { overworld_frame(gObjectEventPic_WorkerF, 2, 4, 0), overworld_frame(gObjectEventPic_WorkerF, 2, 4, 1), overworld_frame(gObjectEventPic_WorkerF, 2, 4, 2), overworld_frame(gObjectEventPic_WorkerF, 2, 4, 3), overworld_frame(gObjectEventPic_WorkerF, 2, 4, 4), overworld_frame(gObjectEventPic_WorkerF, 2, 4, 5), overworld_frame(gObjectEventPic_WorkerF, 2, 4, 6), overworld_frame(gObjectEventPic_WorkerF, 2, 4, 7), overworld_frame(gObjectEventPic_WorkerF, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Beauty[] = { overworld_frame(gObjectEventPic_Beauty, 2, 4, 0), overworld_frame(gObjectEventPic_Beauty, 2, 4, 1), overworld_frame(gObjectEventPic_Beauty, 2, 4, 2), overworld_frame(gObjectEventPic_Beauty, 2, 4, 3), overworld_frame(gObjectEventPic_Beauty, 2, 4, 4), overworld_frame(gObjectEventPic_Beauty, 2, 4, 5), overworld_frame(gObjectEventPic_Beauty, 2, 4, 6), overworld_frame(gObjectEventPic_Beauty, 2, 4, 7), overworld_frame(gObjectEventPic_Beauty, 2, 4, 8), overworld_frame(gObjectEventPic_Beauty, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Chef[] = { overworld_frame(gObjectEventPic_Chef, 2, 4, 0), overworld_frame(gObjectEventPic_Chef, 2, 4, 1), overworld_frame(gObjectEventPic_Chef, 2, 4, 2), overworld_frame(gObjectEventPic_Chef, 2, 4, 3), overworld_frame(gObjectEventPic_Chef, 2, 4, 4), overworld_frame(gObjectEventPic_Chef, 2, 4, 5), overworld_frame(gObjectEventPic_Chef, 2, 4, 6), overworld_frame(gObjectEventPic_Chef, 2, 4, 7), overworld_frame(gObjectEventPic_Chef, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_OldMan2[] = { overworld_frame(gObjectEventPic_OldMan2, 2, 4, 0), overworld_frame(gObjectEventPic_OldMan2, 2, 4, 1), overworld_frame(gObjectEventPic_OldMan2, 2, 4, 2), overworld_frame(gObjectEventPic_OldMan2, 2, 4, 0), overworld_frame(gObjectEventPic_OldMan2, 2, 4, 0), overworld_frame(gObjectEventPic_OldMan2, 2, 4, 1), overworld_frame(gObjectEventPic_OldMan2, 2, 4, 1), overworld_frame(gObjectEventPic_OldMan2, 2, 4, 2), overworld_frame(gObjectEventPic_OldMan2, 2, 4, 2), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 0), }; static const struct SpriteFrameImage sPicTable_OldManLyingDown[] = { overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0), overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0), overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0), overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0), overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0), overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0), overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0), overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0), overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0), }; static const struct SpriteFrameImage sPicTable_OldWoman[] = { overworld_frame(gObjectEventPic_OldWoman, 2, 4, 0), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 1), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 2), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 3), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 4), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 5), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 6), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 7), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Camper[] = { overworld_frame(gObjectEventPic_Camper, 2, 4, 0), overworld_frame(gObjectEventPic_Camper, 2, 4, 1), overworld_frame(gObjectEventPic_Camper, 2, 4, 2), overworld_frame(gObjectEventPic_Camper, 2, 4, 3), overworld_frame(gObjectEventPic_Camper, 2, 4, 4), overworld_frame(gObjectEventPic_Camper, 2, 4, 5), overworld_frame(gObjectEventPic_Camper, 2, 4, 6), overworld_frame(gObjectEventPic_Camper, 2, 4, 7), overworld_frame(gObjectEventPic_Camper, 2, 4, 8), overworld_frame(gObjectEventPic_Camper, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Picnicker[] = { overworld_frame(gObjectEventPic_Picnicker, 2, 4, 0), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 1), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 2), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 3), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 4), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 5), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 6), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 7), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 8), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_CooltrainerM[] = { overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 0), overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 1), overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 2), overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 3), overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 4), overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 5), overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 6), overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 7), overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 8), overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_CooltrainerF[] = { overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 0), overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 1), overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 2), overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 3), overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 4), overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 5), overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 6), overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 7), overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 8), overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Boy[] = { overworld_frame(gObjectEventPic_Boy, 2, 4, 0), overworld_frame(gObjectEventPic_Boy, 2, 4, 1), overworld_frame(gObjectEventPic_Boy, 2, 4, 2), overworld_frame(gObjectEventPic_Boy, 2, 4, 3), overworld_frame(gObjectEventPic_Boy, 2, 4, 4), overworld_frame(gObjectEventPic_Boy, 2, 4, 5), overworld_frame(gObjectEventPic_Boy, 2, 4, 6), overworld_frame(gObjectEventPic_Boy, 2, 4, 7), overworld_frame(gObjectEventPic_Boy, 2, 4, 8), overworld_frame(gObjectEventPic_Boy, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_SuperNerd[] = { overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 0), overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 1), overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 2), overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 3), overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 4), overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 5), overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 6), overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 7), overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 8), overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Channeler[] = { overworld_frame(gObjectEventPic_Channeler, 2, 4, 0), overworld_frame(gObjectEventPic_Channeler, 2, 4, 1), overworld_frame(gObjectEventPic_Channeler, 2, 4, 2), overworld_frame(gObjectEventPic_Channeler, 2, 4, 3), overworld_frame(gObjectEventPic_Channeler, 2, 4, 4), overworld_frame(gObjectEventPic_Channeler, 2, 4, 5), overworld_frame(gObjectEventPic_Channeler, 2, 4, 6), overworld_frame(gObjectEventPic_Channeler, 2, 4, 7), overworld_frame(gObjectEventPic_Channeler, 2, 4, 8), overworld_frame(gObjectEventPic_Channeler, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_RocketF[] = { overworld_frame(gObjectEventPic_RocketF, 2, 4, 0), overworld_frame(gObjectEventPic_RocketF, 2, 4, 1), overworld_frame(gObjectEventPic_RocketF, 2, 4, 2), overworld_frame(gObjectEventPic_RocketF, 2, 4, 3), overworld_frame(gObjectEventPic_RocketF, 2, 4, 4), overworld_frame(gObjectEventPic_RocketF, 2, 4, 5), overworld_frame(gObjectEventPic_RocketF, 2, 4, 6), overworld_frame(gObjectEventPic_RocketF, 2, 4, 7), overworld_frame(gObjectEventPic_RocketF, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_SwimmerMWater[] = { overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 0), overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 1), overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 2), overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 3), overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 4), overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 5), overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 6), overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 7), overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 8), overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_SwimmerFWater[] = { overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 0), overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 1), overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 2), overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 3), overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 4), overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 5), overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 6), overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 7), overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 8), overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_SwimmerMLand[] = { overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 0), overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 1), overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 2), overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 3), overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 4), overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 5), overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 6), overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 7), overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 8), overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_SwimmerFLand[] = { overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 0), overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 1), overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 2), overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 3), overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 4), overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 5), overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 6), overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 7), overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 8), overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Blackbelt[] = { overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 0), overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 1), overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 2), overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 3), overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 4), overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 5), overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 6), overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 7), overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 8), overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Scientist[] = { overworld_frame(gObjectEventPic_Scientist, 2, 4, 0), overworld_frame(gObjectEventPic_Scientist, 2, 4, 1), overworld_frame(gObjectEventPic_Scientist, 2, 4, 2), overworld_frame(gObjectEventPic_Scientist, 2, 4, 3), overworld_frame(gObjectEventPic_Scientist, 2, 4, 4), overworld_frame(gObjectEventPic_Scientist, 2, 4, 5), overworld_frame(gObjectEventPic_Scientist, 2, 4, 6), overworld_frame(gObjectEventPic_Scientist, 2, 4, 7), overworld_frame(gObjectEventPic_Scientist, 2, 4, 8), overworld_frame(gObjectEventPic_Scientist, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Gentleman[] = { overworld_frame(gObjectEventPic_Gentleman, 2, 4, 0), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 1), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 2), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 3), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 4), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 5), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 6), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 7), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 8), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Sailor[] = { overworld_frame(gObjectEventPic_Sailor, 2, 4, 0), overworld_frame(gObjectEventPic_Sailor, 2, 4, 1), overworld_frame(gObjectEventPic_Sailor, 2, 4, 2), overworld_frame(gObjectEventPic_Sailor, 2, 4, 3), overworld_frame(gObjectEventPic_Sailor, 2, 4, 4), overworld_frame(gObjectEventPic_Sailor, 2, 4, 5), overworld_frame(gObjectEventPic_Sailor, 2, 4, 6), overworld_frame(gObjectEventPic_Sailor, 2, 4, 7), overworld_frame(gObjectEventPic_Sailor, 2, 4, 8), overworld_frame(gObjectEventPic_Sailor, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Captain[] = { overworld_frame(gObjectEventPic_Captain, 2, 4, 0), overworld_frame(gObjectEventPic_Captain, 2, 4, 1), overworld_frame(gObjectEventPic_Captain, 2, 4, 2), overworld_frame(gObjectEventPic_Captain, 2, 4, 3), overworld_frame(gObjectEventPic_Captain, 2, 4, 4), overworld_frame(gObjectEventPic_Captain, 2, 4, 5), overworld_frame(gObjectEventPic_Captain, 2, 4, 6), overworld_frame(gObjectEventPic_Captain, 2, 4, 7), overworld_frame(gObjectEventPic_Captain, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Fisher[] = { overworld_frame(gObjectEventPic_Fisher, 2, 4, 0), overworld_frame(gObjectEventPic_Fisher, 2, 4, 1), overworld_frame(gObjectEventPic_Fisher, 2, 4, 2), overworld_frame(gObjectEventPic_Fisher, 2, 4, 3), overworld_frame(gObjectEventPic_Fisher, 2, 4, 4), overworld_frame(gObjectEventPic_Fisher, 2, 4, 5), overworld_frame(gObjectEventPic_Fisher, 2, 4, 6), overworld_frame(gObjectEventPic_Fisher, 2, 4, 7), overworld_frame(gObjectEventPic_Fisher, 2, 4, 8), overworld_frame(gObjectEventPic_Fisher, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_TeachyTVHost[] = { overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 0), overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 1), overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 2), overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 3), overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 4), overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 5), overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 6), overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 7), overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_UnusedWoman[] = { overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 0), overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 1), overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 2), overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 3), overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 4), overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 5), overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 6), overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 7), overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_TuberF[] = { overworld_frame(gObjectEventPic_TuberF, 2, 2, 0), overworld_frame(gObjectEventPic_TuberF, 2, 2, 1), overworld_frame(gObjectEventPic_TuberF, 2, 2, 2), overworld_frame(gObjectEventPic_TuberF, 2, 2, 3), overworld_frame(gObjectEventPic_TuberF, 2, 2, 4), overworld_frame(gObjectEventPic_TuberF, 2, 2, 5), overworld_frame(gObjectEventPic_TuberF, 2, 2, 6), overworld_frame(gObjectEventPic_TuberF, 2, 2, 7), overworld_frame(gObjectEventPic_TuberF, 2, 2, 8), overworld_frame(gObjectEventPic_TuberF, 2, 2, 9), }; static const struct SpriteFrameImage sPicTable_TuberMWater[] = { overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 0), overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 1), overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 2), overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 3), overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 4), overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 5), overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 6), overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 7), overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 8), overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 9), }; static const struct SpriteFrameImage sPicTable_TuberMLand[] = { overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 0), overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 1), overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 2), overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 3), overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 4), overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 5), overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 6), overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 7), overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 8), overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 9), }; static const struct SpriteFrameImage sPicTable_Hiker[] = { overworld_frame(gObjectEventPic_Hiker, 2, 4, 0), overworld_frame(gObjectEventPic_Hiker, 2, 4, 1), overworld_frame(gObjectEventPic_Hiker, 2, 4, 2), overworld_frame(gObjectEventPic_Hiker, 2, 4, 3), overworld_frame(gObjectEventPic_Hiker, 2, 4, 4), overworld_frame(gObjectEventPic_Hiker, 2, 4, 5), overworld_frame(gObjectEventPic_Hiker, 2, 4, 6), overworld_frame(gObjectEventPic_Hiker, 2, 4, 7), overworld_frame(gObjectEventPic_Hiker, 2, 4, 8), overworld_frame(gObjectEventPic_Hiker, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_BirdKeeper[] = { overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 0), overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 1), overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 2), overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 3), overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 4), overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 5), overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 6), overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 7), overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 8), overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_PokemonRangerF[] = { overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 0), overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 1), overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 2), overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 3), overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 4), overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 5), overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 6), overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 7), overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 8), overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_PokemonRangerM[] = { overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 0), overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 1), overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 2), overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 3), overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 4), overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 5), overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 6), overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 7), overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 8), overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Burglar[] = { overworld_frame(gObjectEventPic_Burglar, 2, 4, 0), overworld_frame(gObjectEventPic_Burglar, 2, 4, 1), overworld_frame(gObjectEventPic_Burglar, 2, 4, 2), overworld_frame(gObjectEventPic_Burglar, 2, 4, 3), overworld_frame(gObjectEventPic_Burglar, 2, 4, 4), overworld_frame(gObjectEventPic_Burglar, 2, 4, 5), overworld_frame(gObjectEventPic_Burglar, 2, 4, 6), overworld_frame(gObjectEventPic_Burglar, 2, 4, 7), overworld_frame(gObjectEventPic_Burglar, 2, 4, 8), overworld_frame(gObjectEventPic_Burglar, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_RuinManiac[] = { overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 0), overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 1), overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 2), overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 3), overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 4), overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 5), overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 6), overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 7), overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 8), overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_PsychicM[] = { overworld_frame(gObjectEventPic_PsychicM, 2, 4, 0), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 1), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 2), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 3), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 4), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 5), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 6), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 7), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 8), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_PsychicF[] = { overworld_frame(gObjectEventPic_PsychicF, 2, 4, 0), overworld_frame(gObjectEventPic_PsychicF, 2, 4, 1), overworld_frame(gObjectEventPic_PsychicF, 2, 4, 2), overworld_frame(gObjectEventPic_PsychicF, 2, 4, 3), overworld_frame(gObjectEventPic_PsychicF, 2, 4, 4), overworld_frame(gObjectEventPic_PsychicF, 2, 4, 5), overworld_frame(gObjectEventPic_PsychicF, 2, 4, 6), overworld_frame(gObjectEventPic_PsychicF, 2, 4, 7), overworld_frame(gObjectEventPic_PsychicF, 2, 4, 8), overworld_frame(gObjectEventPic_PsychicF, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_AromaLady[] = { overworld_frame(gObjectEventPic_AromaLady, 2, 4, 0), overworld_frame(gObjectEventPic_AromaLady, 2, 4, 1), overworld_frame(gObjectEventPic_AromaLady, 2, 4, 2), overworld_frame(gObjectEventPic_AromaLady, 2, 4, 3), overworld_frame(gObjectEventPic_AromaLady, 2, 4, 4), overworld_frame(gObjectEventPic_AromaLady, 2, 4, 5), overworld_frame(gObjectEventPic_AromaLady, 2, 4, 6), overworld_frame(gObjectEventPic_AromaLady, 2, 4, 7), overworld_frame(gObjectEventPic_AromaLady, 2, 4, 8), overworld_frame(gObjectEventPic_AromaLady, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_PokeManiac[] = { overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 0), overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 1), overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 2), overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 3), overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 4), overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 5), overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 6), overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 7), overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 8), overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Juggler[] = { overworld_frame(gObjectEventPic_Juggler, 2, 4, 0), overworld_frame(gObjectEventPic_Juggler, 2, 4, 1), overworld_frame(gObjectEventPic_Juggler, 2, 4, 2), overworld_frame(gObjectEventPic_Juggler, 2, 4, 3), overworld_frame(gObjectEventPic_Juggler, 2, 4, 4), overworld_frame(gObjectEventPic_Juggler, 2, 4, 5), overworld_frame(gObjectEventPic_Juggler, 2, 4, 6), overworld_frame(gObjectEventPic_Juggler, 2, 4, 7), overworld_frame(gObjectEventPic_Juggler, 2, 4, 8), overworld_frame(gObjectEventPic_Juggler, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_PokemonBreeder[] = { overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 0), overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 1), overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 2), overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 3), overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 4), overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 5), overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 6), overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 7), overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 8), overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Tamer[] = { overworld_frame(gObjectEventPic_Tamer, 2, 4, 0), overworld_frame(gObjectEventPic_Tamer, 2, 4, 1), overworld_frame(gObjectEventPic_Tamer, 2, 4, 2), overworld_frame(gObjectEventPic_Tamer, 2, 4, 3), overworld_frame(gObjectEventPic_Tamer, 2, 4, 4), overworld_frame(gObjectEventPic_Tamer, 2, 4, 5), overworld_frame(gObjectEventPic_Tamer, 2, 4, 6), overworld_frame(gObjectEventPic_Tamer, 2, 4, 7), overworld_frame(gObjectEventPic_Tamer, 2, 4, 8), overworld_frame(gObjectEventPic_Tamer, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Engineer[] = { overworld_frame(gObjectEventPic_Engineer, 2, 4, 0), overworld_frame(gObjectEventPic_Engineer, 2, 4, 1), overworld_frame(gObjectEventPic_Engineer, 2, 4, 2), overworld_frame(gObjectEventPic_Engineer, 2, 4, 3), overworld_frame(gObjectEventPic_Engineer, 2, 4, 4), overworld_frame(gObjectEventPic_Engineer, 2, 4, 5), overworld_frame(gObjectEventPic_Engineer, 2, 4, 6), overworld_frame(gObjectEventPic_Engineer, 2, 4, 7), overworld_frame(gObjectEventPic_Engineer, 2, 4, 8), overworld_frame(gObjectEventPic_Engineer, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_YoungCoupleM[] = { overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 0), overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 1), overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 2), overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 3), overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 4), overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 5), overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 6), overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 7), overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 8), overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_YoungCoupleF[] = { overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 0), overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 1), overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 2), overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 3), overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 4), overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 5), overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 6), overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 7), overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 8), overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_CueBall[] = { overworld_frame(gObjectEventPic_CueBall, 4, 4, 0), overworld_frame(gObjectEventPic_CueBall, 4, 4, 1), overworld_frame(gObjectEventPic_CueBall, 4, 4, 2), overworld_frame(gObjectEventPic_CueBall, 4, 4, 3), overworld_frame(gObjectEventPic_CueBall, 4, 4, 4), overworld_frame(gObjectEventPic_CueBall, 4, 4, 5), overworld_frame(gObjectEventPic_CueBall, 4, 4, 6), overworld_frame(gObjectEventPic_CueBall, 4, 4, 7), overworld_frame(gObjectEventPic_CueBall, 4, 4, 8), overworld_frame(gObjectEventPic_CueBall, 4, 4, 9), }; static const struct SpriteFrameImage sPicTable_Biker[] = { overworld_frame(gObjectEventPic_Biker, 4, 4, 0), overworld_frame(gObjectEventPic_Biker, 4, 4, 1), overworld_frame(gObjectEventPic_Biker, 4, 4, 2), overworld_frame(gObjectEventPic_Biker, 4, 4, 3), overworld_frame(gObjectEventPic_Biker, 4, 4, 4), overworld_frame(gObjectEventPic_Biker, 4, 4, 5), overworld_frame(gObjectEventPic_Biker, 4, 4, 6), overworld_frame(gObjectEventPic_Biker, 4, 4, 7), overworld_frame(gObjectEventPic_Biker, 4, 4, 8), overworld_frame(gObjectEventPic_Biker, 4, 4, 9), }; static const struct SpriteFrameImage sPicTable_GymGuy[] = { overworld_frame(gObjectEventPic_GymGuy, 2, 4, 0), overworld_frame(gObjectEventPic_GymGuy, 2, 4, 1), overworld_frame(gObjectEventPic_GymGuy, 2, 4, 2), overworld_frame(gObjectEventPic_GymGuy, 2, 4, 3), overworld_frame(gObjectEventPic_GymGuy, 2, 4, 4), overworld_frame(gObjectEventPic_GymGuy, 2, 4, 5), overworld_frame(gObjectEventPic_GymGuy, 2, 4, 6), overworld_frame(gObjectEventPic_GymGuy, 2, 4, 7), overworld_frame(gObjectEventPic_GymGuy, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Nurse[] = { overworld_frame(gObjectEventPic_Nurse, 2, 4, 0), overworld_frame(gObjectEventPic_Nurse, 2, 4, 1), overworld_frame(gObjectEventPic_Nurse, 2, 4, 2), overworld_frame(gObjectEventPic_Nurse, 2, 4, 0), overworld_frame(gObjectEventPic_Nurse, 2, 4, 0), overworld_frame(gObjectEventPic_Nurse, 2, 4, 1), overworld_frame(gObjectEventPic_Nurse, 2, 4, 1), overworld_frame(gObjectEventPic_Nurse, 2, 4, 2), overworld_frame(gObjectEventPic_Nurse, 2, 4, 2), overworld_frame(gObjectEventPic_Nurse, 2, 4, 3), }; static const struct SpriteFrameImage sPicTable_UnusedMaleReceptionist[] = { overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 0), overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 1), overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 2), overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 0), overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 0), overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 1), overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 1), overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 2), overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_ItemBall[] = { overworld_frame(gObjectEventPic_ItemBall, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_ProfOak[] = { overworld_frame(gObjectEventPic_ProfOak, 2, 4, 0), overworld_frame(gObjectEventPic_ProfOak, 2, 4, 1), overworld_frame(gObjectEventPic_ProfOak, 2, 4, 2), overworld_frame(gObjectEventPic_ProfOak, 2, 4, 3), overworld_frame(gObjectEventPic_ProfOak, 2, 4, 4), overworld_frame(gObjectEventPic_ProfOak, 2, 4, 5), overworld_frame(gObjectEventPic_ProfOak, 2, 4, 6), overworld_frame(gObjectEventPic_ProfOak, 2, 4, 7), overworld_frame(gObjectEventPic_ProfOak, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Man[] = { overworld_frame(gObjectEventPic_Man, 2, 4, 0), overworld_frame(gObjectEventPic_Man, 2, 4, 1), overworld_frame(gObjectEventPic_Man, 2, 4, 2), overworld_frame(gObjectEventPic_Man, 2, 4, 3), overworld_frame(gObjectEventPic_Man, 2, 4, 4), overworld_frame(gObjectEventPic_Man, 2, 4, 5), overworld_frame(gObjectEventPic_Man, 2, 4, 6), overworld_frame(gObjectEventPic_Man, 2, 4, 7), overworld_frame(gObjectEventPic_Man, 2, 4, 8), overworld_frame(gObjectEventPic_Man, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Rocker[] = { overworld_frame(gObjectEventPic_Rocker, 2, 4, 0), overworld_frame(gObjectEventPic_Rocker, 2, 4, 1), overworld_frame(gObjectEventPic_Rocker, 2, 4, 2), overworld_frame(gObjectEventPic_Rocker, 2, 4, 3), overworld_frame(gObjectEventPic_Rocker, 2, 4, 4), overworld_frame(gObjectEventPic_Rocker, 2, 4, 5), overworld_frame(gObjectEventPic_Rocker, 2, 4, 6), overworld_frame(gObjectEventPic_Rocker, 2, 4, 7), overworld_frame(gObjectEventPic_Rocker, 2, 4, 8), overworld_frame(gObjectEventPic_Rocker, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MrFuji[] = { overworld_frame(gObjectEventPic_MrFuji, 2, 4, 0), overworld_frame(gObjectEventPic_MrFuji, 2, 4, 1), overworld_frame(gObjectEventPic_MrFuji, 2, 4, 2), overworld_frame(gObjectEventPic_MrFuji, 2, 4, 3), overworld_frame(gObjectEventPic_MrFuji, 2, 4, 4), overworld_frame(gObjectEventPic_MrFuji, 2, 4, 5), overworld_frame(gObjectEventPic_MrFuji, 2, 4, 6), overworld_frame(gObjectEventPic_MrFuji, 2, 4, 7), overworld_frame(gObjectEventPic_MrFuji, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Bruno[] = { overworld_frame(gObjectEventPic_Bruno, 2, 4, 0), overworld_frame(gObjectEventPic_Bruno, 2, 4, 1), overworld_frame(gObjectEventPic_Bruno, 2, 4, 2), overworld_frame(gObjectEventPic_Bruno, 2, 4, 0), overworld_frame(gObjectEventPic_Bruno, 2, 4, 0), overworld_frame(gObjectEventPic_Bruno, 2, 4, 1), overworld_frame(gObjectEventPic_Bruno, 2, 4, 1), overworld_frame(gObjectEventPic_Bruno, 2, 4, 2), overworld_frame(gObjectEventPic_Bruno, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_CutTree[] = { overworld_frame(gObjectEventPic_CutTree, 2, 2, 0), overworld_frame(gObjectEventPic_CutTree, 2, 2, 1), overworld_frame(gObjectEventPic_CutTree, 2, 2, 2), overworld_frame(gObjectEventPic_CutTree, 2, 2, 3), }; static const struct SpriteFrameImage sPicTable_Clerk[] = { overworld_frame(gObjectEventPic_Clerk, 2, 4, 0), overworld_frame(gObjectEventPic_Clerk, 2, 4, 1), overworld_frame(gObjectEventPic_Clerk, 2, 4, 2), overworld_frame(gObjectEventPic_Clerk, 2, 4, 3), overworld_frame(gObjectEventPic_Clerk, 2, 4, 4), overworld_frame(gObjectEventPic_Clerk, 2, 4, 5), overworld_frame(gObjectEventPic_Clerk, 2, 4, 6), overworld_frame(gObjectEventPic_Clerk, 2, 4, 7), overworld_frame(gObjectEventPic_Clerk, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_MGDeliveryman[] = { overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 0), overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 1), overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 2), overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 0), overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 0), overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 1), overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 1), overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 2), overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_TrainerTowerDude[] = { overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 0), overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 1), overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 2), overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 0), overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 0), overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 1), overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 1), overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 2), overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_CableClubReceptionist[] = { overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 0), overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 1), overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 2), overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 3), overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 4), overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 5), overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 6), overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 7), overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_UnionRoomReceptionist[] = { overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 0), overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 1), overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 2), overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 0), overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 0), overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 1), overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 1), overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 2), overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_RockSmashRock[] = { overworld_frame(gObjectEventPic_RockSmashRock, 2, 2, 0), overworld_frame(gObjectEventPic_RockSmashRock, 2, 2, 1), overworld_frame(gObjectEventPic_RockSmashRock, 2, 2, 2), overworld_frame(gObjectEventPic_RockSmashRock, 2, 2, 3), }; static const struct SpriteFrameImage sPicTable_StrengthBoulder[] = { overworld_frame(gObjectEventPic_StrengthBoulder, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_RocketM[] = { overworld_frame(gObjectEventPic_RocketM, 2, 4, 0), overworld_frame(gObjectEventPic_RocketM, 2, 4, 1), overworld_frame(gObjectEventPic_RocketM, 2, 4, 2), overworld_frame(gObjectEventPic_RocketM, 2, 4, 3), overworld_frame(gObjectEventPic_RocketM, 2, 4, 4), overworld_frame(gObjectEventPic_RocketM, 2, 4, 5), overworld_frame(gObjectEventPic_RocketM, 2, 4, 6), overworld_frame(gObjectEventPic_RocketM, 2, 4, 7), overworld_frame(gObjectEventPic_RocketM, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Celio[] = { overworld_frame(gObjectEventPic_Celio, 2, 4, 0), overworld_frame(gObjectEventPic_Celio, 2, 4, 1), overworld_frame(gObjectEventPic_Celio, 2, 4, 2), overworld_frame(gObjectEventPic_Celio, 2, 4, 3), overworld_frame(gObjectEventPic_Celio, 2, 4, 4), overworld_frame(gObjectEventPic_Celio, 2, 4, 5), overworld_frame(gObjectEventPic_Celio, 2, 4, 6), overworld_frame(gObjectEventPic_Celio, 2, 4, 7), overworld_frame(gObjectEventPic_Celio, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Agatha[] = { overworld_frame(gObjectEventPic_Agatha, 2, 4, 0), overworld_frame(gObjectEventPic_Agatha, 2, 4, 1), overworld_frame(gObjectEventPic_Agatha, 2, 4, 2), overworld_frame(gObjectEventPic_Agatha, 2, 4, 0), overworld_frame(gObjectEventPic_Agatha, 2, 4, 0), overworld_frame(gObjectEventPic_Agatha, 2, 4, 1), overworld_frame(gObjectEventPic_Agatha, 2, 4, 1), overworld_frame(gObjectEventPic_Agatha, 2, 4, 2), overworld_frame(gObjectEventPic_Agatha, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_Brock[] = { overworld_frame(gObjectEventPic_Brock, 2, 4, 0), overworld_frame(gObjectEventPic_Brock, 2, 4, 1), overworld_frame(gObjectEventPic_Brock, 2, 4, 2), overworld_frame(gObjectEventPic_Brock, 2, 4, 3), overworld_frame(gObjectEventPic_Brock, 2, 4, 4), overworld_frame(gObjectEventPic_Brock, 2, 4, 5), overworld_frame(gObjectEventPic_Brock, 2, 4, 6), overworld_frame(gObjectEventPic_Brock, 2, 4, 7), overworld_frame(gObjectEventPic_Brock, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Misty[] = { overworld_frame(gObjectEventPic_Misty, 2, 4, 0), overworld_frame(gObjectEventPic_Misty, 2, 4, 1), overworld_frame(gObjectEventPic_Misty, 2, 4, 2), overworld_frame(gObjectEventPic_Misty, 2, 4, 3), overworld_frame(gObjectEventPic_Misty, 2, 4, 4), overworld_frame(gObjectEventPic_Misty, 2, 4, 5), overworld_frame(gObjectEventPic_Misty, 2, 4, 6), overworld_frame(gObjectEventPic_Misty, 2, 4, 7), overworld_frame(gObjectEventPic_Misty, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_LtSurge[] = { overworld_frame(gObjectEventPic_LtSurge, 2, 4, 0), overworld_frame(gObjectEventPic_LtSurge, 2, 4, 1), overworld_frame(gObjectEventPic_LtSurge, 2, 4, 2), overworld_frame(gObjectEventPic_LtSurge, 2, 4, 3), overworld_frame(gObjectEventPic_LtSurge, 2, 4, 4), overworld_frame(gObjectEventPic_LtSurge, 2, 4, 5), overworld_frame(gObjectEventPic_LtSurge, 2, 4, 6), overworld_frame(gObjectEventPic_LtSurge, 2, 4, 7), overworld_frame(gObjectEventPic_LtSurge, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Erika[] = { overworld_frame(gObjectEventPic_Erika, 2, 4, 0), overworld_frame(gObjectEventPic_Erika, 2, 4, 1), overworld_frame(gObjectEventPic_Erika, 2, 4, 2), overworld_frame(gObjectEventPic_Erika, 2, 4, 3), overworld_frame(gObjectEventPic_Erika, 2, 4, 4), overworld_frame(gObjectEventPic_Erika, 2, 4, 5), overworld_frame(gObjectEventPic_Erika, 2, 4, 6), overworld_frame(gObjectEventPic_Erika, 2, 4, 7), overworld_frame(gObjectEventPic_Erika, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Koga[] = { overworld_frame(gObjectEventPic_Koga, 2, 4, 0), overworld_frame(gObjectEventPic_Koga, 2, 4, 1), overworld_frame(gObjectEventPic_Koga, 2, 4, 2), overworld_frame(gObjectEventPic_Koga, 2, 4, 3), overworld_frame(gObjectEventPic_Koga, 2, 4, 4), overworld_frame(gObjectEventPic_Koga, 2, 4, 5), overworld_frame(gObjectEventPic_Koga, 2, 4, 6), overworld_frame(gObjectEventPic_Koga, 2, 4, 7), overworld_frame(gObjectEventPic_Koga, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Giovanni[] = { overworld_frame(gObjectEventPic_Giovanni, 2, 4, 0), overworld_frame(gObjectEventPic_Giovanni, 2, 4, 1), overworld_frame(gObjectEventPic_Giovanni, 2, 4, 2), overworld_frame(gObjectEventPic_Giovanni, 2, 4, 3), overworld_frame(gObjectEventPic_Giovanni, 2, 4, 4), overworld_frame(gObjectEventPic_Giovanni, 2, 4, 5), overworld_frame(gObjectEventPic_Giovanni, 2, 4, 6), overworld_frame(gObjectEventPic_Giovanni, 2, 4, 7), overworld_frame(gObjectEventPic_Giovanni, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Blaine[] = { overworld_frame(gObjectEventPic_Blaine, 2, 4, 0), overworld_frame(gObjectEventPic_Blaine, 2, 4, 1), overworld_frame(gObjectEventPic_Blaine, 2, 4, 2), overworld_frame(gObjectEventPic_Blaine, 2, 4, 3), overworld_frame(gObjectEventPic_Blaine, 2, 4, 4), overworld_frame(gObjectEventPic_Blaine, 2, 4, 5), overworld_frame(gObjectEventPic_Blaine, 2, 4, 6), overworld_frame(gObjectEventPic_Blaine, 2, 4, 7), overworld_frame(gObjectEventPic_Blaine, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Sabrina[] = { overworld_frame(gObjectEventPic_Sabrina, 2, 4, 0), overworld_frame(gObjectEventPic_Sabrina, 2, 4, 1), overworld_frame(gObjectEventPic_Sabrina, 2, 4, 2), overworld_frame(gObjectEventPic_Sabrina, 2, 4, 3), overworld_frame(gObjectEventPic_Sabrina, 2, 4, 4), overworld_frame(gObjectEventPic_Sabrina, 2, 4, 5), overworld_frame(gObjectEventPic_Sabrina, 2, 4, 6), overworld_frame(gObjectEventPic_Sabrina, 2, 4, 7), overworld_frame(gObjectEventPic_Sabrina, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Bill[] = { overworld_frame(gObjectEventPic_Bill, 2, 4, 0), overworld_frame(gObjectEventPic_Bill, 2, 4, 1), overworld_frame(gObjectEventPic_Bill, 2, 4, 2), overworld_frame(gObjectEventPic_Bill, 2, 4, 3), overworld_frame(gObjectEventPic_Bill, 2, 4, 4), overworld_frame(gObjectEventPic_Bill, 2, 4, 5), overworld_frame(gObjectEventPic_Bill, 2, 4, 6), overworld_frame(gObjectEventPic_Bill, 2, 4, 7), overworld_frame(gObjectEventPic_Bill, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Daisy[] = { overworld_frame(gObjectEventPic_Daisy, 2, 4, 0), overworld_frame(gObjectEventPic_Daisy, 2, 4, 1), overworld_frame(gObjectEventPic_Daisy, 2, 4, 2), overworld_frame(gObjectEventPic_Daisy, 2, 4, 3), overworld_frame(gObjectEventPic_Daisy, 2, 4, 4), overworld_frame(gObjectEventPic_Daisy, 2, 4, 5), overworld_frame(gObjectEventPic_Daisy, 2, 4, 6), overworld_frame(gObjectEventPic_Daisy, 2, 4, 7), overworld_frame(gObjectEventPic_Daisy, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Lorelei[] = { overworld_frame(gObjectEventPic_Lorelei, 2, 4, 0), overworld_frame(gObjectEventPic_Lorelei, 2, 4, 1), overworld_frame(gObjectEventPic_Lorelei, 2, 4, 2), overworld_frame(gObjectEventPic_Lorelei, 2, 4, 3), overworld_frame(gObjectEventPic_Lorelei, 2, 4, 4), overworld_frame(gObjectEventPic_Lorelei, 2, 4, 5), overworld_frame(gObjectEventPic_Lorelei, 2, 4, 6), overworld_frame(gObjectEventPic_Lorelei, 2, 4, 7), overworld_frame(gObjectEventPic_Lorelei, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Lance[] = { overworld_frame(gObjectEventPic_Lance, 2, 4, 0), overworld_frame(gObjectEventPic_Lance, 2, 4, 1), overworld_frame(gObjectEventPic_Lance, 2, 4, 2), overworld_frame(gObjectEventPic_Lance, 2, 4, 0), overworld_frame(gObjectEventPic_Lance, 2, 4, 0), overworld_frame(gObjectEventPic_Lance, 2, 4, 1), overworld_frame(gObjectEventPic_Lance, 2, 4, 1), overworld_frame(gObjectEventPic_Lance, 2, 4, 2), overworld_frame(gObjectEventPic_Lance, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_Blue[] = { overworld_frame(gObjectEventPic_Blue, 2, 4, 0), overworld_frame(gObjectEventPic_Blue, 2, 4, 1), overworld_frame(gObjectEventPic_Blue, 2, 4, 2), overworld_frame(gObjectEventPic_Blue, 2, 4, 3), overworld_frame(gObjectEventPic_Blue, 2, 4, 4), overworld_frame(gObjectEventPic_Blue, 2, 4, 5), overworld_frame(gObjectEventPic_Blue, 2, 4, 6), overworld_frame(gObjectEventPic_Blue, 2, 4, 7), overworld_frame(gObjectEventPic_Blue, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_RedFish[] = { overworld_frame(gObjectEventPic_RedFish, 4, 4, 0), overworld_frame(gObjectEventPic_RedFish, 4, 4, 1), overworld_frame(gObjectEventPic_RedFish, 4, 4, 2), overworld_frame(gObjectEventPic_RedFish, 4, 4, 3), overworld_frame(gObjectEventPic_RedFish, 4, 4, 4), overworld_frame(gObjectEventPic_RedFish, 4, 4, 5), overworld_frame(gObjectEventPic_RedFish, 4, 4, 6), overworld_frame(gObjectEventPic_RedFish, 4, 4, 7), overworld_frame(gObjectEventPic_RedFish, 4, 4, 8), overworld_frame(gObjectEventPic_RedFish, 4, 4, 9), overworld_frame(gObjectEventPic_RedFish, 4, 4, 10), overworld_frame(gObjectEventPic_RedFish, 4, 4, 11), }; static const struct SpriteFrameImage sPicTable_GreenFish[] = { overworld_frame(gObjectEventPic_GreenFish, 4, 4, 0), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 1), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 2), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 3), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 4), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 5), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 6), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 7), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 8), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 9), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 10), overworld_frame(gObjectEventPic_GreenFish, 4, 4, 11), }; static const struct SpriteFrameImage sPicTable_TownMap[] = { overworld_frame(gObjectEventPic_TownMap, 2, 4, 0), }; static const struct SpriteFrameImage sPicTable_Pokedex[] = { overworld_frame(gObjectEventPic_Pokedex, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_GBAKid[] = { overworld_frame(gObjectEventPic_GBAKid, 2, 4, 0), overworld_frame(gObjectEventPic_GBAKid, 2, 4, 1), overworld_frame(gObjectEventPic_GBAKid, 2, 4, 2), overworld_frame(gObjectEventPic_GBAKid, 2, 4, 0), overworld_frame(gObjectEventPic_GBAKid, 2, 4, 0), overworld_frame(gObjectEventPic_GBAKid, 2, 4, 1), overworld_frame(gObjectEventPic_GBAKid, 2, 4, 1), overworld_frame(gObjectEventPic_GBAKid, 2, 4, 2), overworld_frame(gObjectEventPic_GBAKid, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_Fossil[] = { overworld_frame(gObjectEventPic_Fossil, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_Ruby[] = { overworld_frame(gObjectEventPic_Ruby, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_Sapphire[] = { overworld_frame(gObjectEventPic_Sapphire, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_OldAmber[] = { overworld_frame(gObjectEventPic_OldAmber, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_GymSign[] = { overworld_frame(gObjectEventPic_GymSign, 2, 4, 0), }; static const struct SpriteFrameImage sPicTable_Sign[] = { overworld_frame(gObjectEventPic_Sign, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_WoodenSign[] = { overworld_frame(gObjectEventPic_WoodenSign, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_Clipboard[] = { overworld_frame(gObjectEventPic_Clipboard, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_BirthIslandStone[] = { overworld_frame(gObjectEventPic_BirthIslandStone, 4, 4, 0), }; static const struct SpriteFrameImage sPicTable_LaprasDoll[] = { overworld_frame(gObjectEventPic_LaprasDoll, 4, 4, 0), }; static const struct SpriteFrameImage sPicTable_Seagallop[] = { overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0), overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0), overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0), overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0), overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0), overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0), overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0), overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0), overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0), }; static const struct SpriteFrameImage sPicTable_SSAnne[] = { overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0), overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0), overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0), overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0), overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0), overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0), overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0), overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0), overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0), }; static const struct SpriteFrameImage sPicTable_Snorlax[] = { overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0), overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0), overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0), overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0), overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0), overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0), overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0), overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0), overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0), }; static const struct SpriteFrameImage sPicTable_Spearow[] = { overworld_frame(gObjectEventPic_Spearow, 2, 2, 0), overworld_frame(gObjectEventPic_Spearow, 2, 2, 1), overworld_frame(gObjectEventPic_Spearow, 2, 2, 2), overworld_frame(gObjectEventPic_Spearow, 2, 2, 0), overworld_frame(gObjectEventPic_Spearow, 2, 2, 0), overworld_frame(gObjectEventPic_Spearow, 2, 2, 1), overworld_frame(gObjectEventPic_Spearow, 2, 2, 1), overworld_frame(gObjectEventPic_Spearow, 2, 2, 2), overworld_frame(gObjectEventPic_Spearow, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Pidgeot[] = { overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 0), overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 1), overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 2), overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 0), overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 0), overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 1), overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 1), overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 2), overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Omanyte[] = { overworld_frame(gObjectEventPic_Omanyte, 2, 2, 0), overworld_frame(gObjectEventPic_Omanyte, 2, 2, 1), overworld_frame(gObjectEventPic_Omanyte, 2, 2, 2), overworld_frame(gObjectEventPic_Omanyte, 2, 2, 0), overworld_frame(gObjectEventPic_Omanyte, 2, 2, 0), overworld_frame(gObjectEventPic_Omanyte, 2, 2, 1), overworld_frame(gObjectEventPic_Omanyte, 2, 2, 1), overworld_frame(gObjectEventPic_Omanyte, 2, 2, 2), overworld_frame(gObjectEventPic_Omanyte, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Kangaskhan[] = { overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 0), overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 1), overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 2), overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 0), overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 0), overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 1), overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 1), overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 2), overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Psyduck[] = { overworld_frame(gObjectEventPic_Psyduck, 2, 2, 0), overworld_frame(gObjectEventPic_Psyduck, 2, 2, 1), overworld_frame(gObjectEventPic_Psyduck, 2, 2, 2), overworld_frame(gObjectEventPic_Psyduck, 2, 2, 0), overworld_frame(gObjectEventPic_Psyduck, 2, 2, 0), overworld_frame(gObjectEventPic_Psyduck, 2, 2, 1), overworld_frame(gObjectEventPic_Psyduck, 2, 2, 1), overworld_frame(gObjectEventPic_Psyduck, 2, 2, 2), overworld_frame(gObjectEventPic_Psyduck, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_NidoranF[] = { overworld_frame(gObjectEventPic_NidoranF, 2, 2, 0), overworld_frame(gObjectEventPic_NidoranF, 2, 2, 1), overworld_frame(gObjectEventPic_NidoranF, 2, 2, 2), overworld_frame(gObjectEventPic_NidoranF, 2, 2, 0), overworld_frame(gObjectEventPic_NidoranF, 2, 2, 0), overworld_frame(gObjectEventPic_NidoranF, 2, 2, 1), overworld_frame(gObjectEventPic_NidoranF, 2, 2, 1), overworld_frame(gObjectEventPic_NidoranF, 2, 2, 2), overworld_frame(gObjectEventPic_NidoranF, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_NidoranM[] = { overworld_frame(gObjectEventPic_NidoranM, 2, 2, 0), overworld_frame(gObjectEventPic_NidoranM, 2, 2, 1), overworld_frame(gObjectEventPic_NidoranM, 2, 2, 2), overworld_frame(gObjectEventPic_NidoranM, 2, 2, 0), overworld_frame(gObjectEventPic_NidoranM, 2, 2, 0), overworld_frame(gObjectEventPic_NidoranM, 2, 2, 1), overworld_frame(gObjectEventPic_NidoranM, 2, 2, 1), overworld_frame(gObjectEventPic_NidoranM, 2, 2, 2), overworld_frame(gObjectEventPic_NidoranM, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Nidorino[] = { overworld_frame(gObjectEventPic_Nidorino, 2, 2, 0), overworld_frame(gObjectEventPic_Nidorino, 2, 2, 1), overworld_frame(gObjectEventPic_Nidorino, 2, 2, 2), overworld_frame(gObjectEventPic_Nidorino, 2, 2, 0), overworld_frame(gObjectEventPic_Nidorino, 2, 2, 0), overworld_frame(gObjectEventPic_Nidorino, 2, 2, 1), overworld_frame(gObjectEventPic_Nidorino, 2, 2, 1), overworld_frame(gObjectEventPic_Nidorino, 2, 2, 2), overworld_frame(gObjectEventPic_Nidorino, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Meowth[] = { overworld_frame(gObjectEventPic_Meowth, 2, 2, 0), overworld_frame(gObjectEventPic_Meowth, 2, 2, 1), overworld_frame(gObjectEventPic_Meowth, 2, 2, 2), overworld_frame(gObjectEventPic_Meowth, 2, 2, 0), overworld_frame(gObjectEventPic_Meowth, 2, 2, 0), overworld_frame(gObjectEventPic_Meowth, 2, 2, 1), overworld_frame(gObjectEventPic_Meowth, 2, 2, 1), overworld_frame(gObjectEventPic_Meowth, 2, 2, 2), overworld_frame(gObjectEventPic_Meowth, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Seel[] = { overworld_frame(gObjectEventPic_Seel, 2, 2, 0), overworld_frame(gObjectEventPic_Seel, 2, 2, 1), overworld_frame(gObjectEventPic_Seel, 2, 2, 2), overworld_frame(gObjectEventPic_Seel, 2, 2, 0), overworld_frame(gObjectEventPic_Seel, 2, 2, 0), overworld_frame(gObjectEventPic_Seel, 2, 2, 1), overworld_frame(gObjectEventPic_Seel, 2, 2, 1), overworld_frame(gObjectEventPic_Seel, 2, 2, 2), overworld_frame(gObjectEventPic_Seel, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Voltorb[] = { overworld_frame(gObjectEventPic_Voltorb, 2, 2, 0), overworld_frame(gObjectEventPic_Voltorb, 2, 2, 1), overworld_frame(gObjectEventPic_Voltorb, 2, 2, 2), overworld_frame(gObjectEventPic_Voltorb, 2, 2, 0), overworld_frame(gObjectEventPic_Voltorb, 2, 2, 0), overworld_frame(gObjectEventPic_Voltorb, 2, 2, 1), overworld_frame(gObjectEventPic_Voltorb, 2, 2, 1), overworld_frame(gObjectEventPic_Voltorb, 2, 2, 2), overworld_frame(gObjectEventPic_Voltorb, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Slowpoke[] = { overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 0), overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 1), overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 2), overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 0), overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 0), overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 1), overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 1), overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 2), overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Slowbro[] = { overworld_frame(gObjectEventPic_Slowbro, 2, 2, 0), overworld_frame(gObjectEventPic_Slowbro, 2, 2, 1), overworld_frame(gObjectEventPic_Slowbro, 2, 2, 2), overworld_frame(gObjectEventPic_Slowbro, 2, 2, 0), overworld_frame(gObjectEventPic_Slowbro, 2, 2, 0), overworld_frame(gObjectEventPic_Slowbro, 2, 2, 1), overworld_frame(gObjectEventPic_Slowbro, 2, 2, 1), overworld_frame(gObjectEventPic_Slowbro, 2, 2, 2), overworld_frame(gObjectEventPic_Slowbro, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Machop[] = { overworld_frame(gObjectEventPic_Machop, 2, 2, 0), overworld_frame(gObjectEventPic_Machop, 2, 2, 1), overworld_frame(gObjectEventPic_Machop, 2, 2, 2), overworld_frame(gObjectEventPic_Machop, 2, 2, 0), overworld_frame(gObjectEventPic_Machop, 2, 2, 0), overworld_frame(gObjectEventPic_Machop, 2, 2, 1), overworld_frame(gObjectEventPic_Machop, 2, 2, 1), overworld_frame(gObjectEventPic_Machop, 2, 2, 2), overworld_frame(gObjectEventPic_Machop, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Wigglytuff[] = { overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 0), overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 1), overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 2), overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 0), overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 0), overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 1), overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 1), overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 2), overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Doduo[] = { overworld_frame(gObjectEventPic_Doduo, 2, 2, 0), overworld_frame(gObjectEventPic_Doduo, 2, 2, 1), overworld_frame(gObjectEventPic_Doduo, 2, 2, 2), overworld_frame(gObjectEventPic_Doduo, 2, 2, 0), overworld_frame(gObjectEventPic_Doduo, 2, 2, 0), overworld_frame(gObjectEventPic_Doduo, 2, 2, 1), overworld_frame(gObjectEventPic_Doduo, 2, 2, 1), overworld_frame(gObjectEventPic_Doduo, 2, 2, 2), overworld_frame(gObjectEventPic_Doduo, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Fearow[] = { overworld_frame(gObjectEventPic_Fearow, 2, 2, 0), overworld_frame(gObjectEventPic_Fearow, 2, 2, 1), overworld_frame(gObjectEventPic_Fearow, 2, 2, 2), overworld_frame(gObjectEventPic_Fearow, 2, 2, 0), overworld_frame(gObjectEventPic_Fearow, 2, 2, 0), overworld_frame(gObjectEventPic_Fearow, 2, 2, 1), overworld_frame(gObjectEventPic_Fearow, 2, 2, 1), overworld_frame(gObjectEventPic_Fearow, 2, 2, 2), overworld_frame(gObjectEventPic_Fearow, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Lapras[] = { overworld_frame(gObjectEventPic_Lapras, 2, 2, 0), overworld_frame(gObjectEventPic_Lapras, 2, 2, 1), overworld_frame(gObjectEventPic_Lapras, 2, 2, 2), overworld_frame(gObjectEventPic_Lapras, 2, 2, 0), overworld_frame(gObjectEventPic_Lapras, 2, 2, 0), overworld_frame(gObjectEventPic_Lapras, 2, 2, 1), overworld_frame(gObjectEventPic_Lapras, 2, 2, 1), overworld_frame(gObjectEventPic_Lapras, 2, 2, 2), overworld_frame(gObjectEventPic_Lapras, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Zapdos[] = { overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0), overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0), overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0), overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0), overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0), overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0), overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0), overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0), overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0), }; static const struct SpriteFrameImage sPicTable_Moltres[] = { overworld_frame(gObjectEventPic_Moltres, 4, 4, 0), overworld_frame(gObjectEventPic_Moltres, 4, 4, 0), overworld_frame(gObjectEventPic_Moltres, 4, 4, 0), overworld_frame(gObjectEventPic_Moltres, 4, 4, 0), overworld_frame(gObjectEventPic_Moltres, 4, 4, 0), overworld_frame(gObjectEventPic_Moltres, 4, 4, 0), overworld_frame(gObjectEventPic_Moltres, 4, 4, 0), overworld_frame(gObjectEventPic_Moltres, 4, 4, 0), overworld_frame(gObjectEventPic_Moltres, 4, 4, 0), }; static const struct SpriteFrameImage sPicTable_Articuno[] = { overworld_frame(gObjectEventPic_Articuno, 4, 4, 0), overworld_frame(gObjectEventPic_Articuno, 4, 4, 0), overworld_frame(gObjectEventPic_Articuno, 4, 4, 0), overworld_frame(gObjectEventPic_Articuno, 4, 4, 0), overworld_frame(gObjectEventPic_Articuno, 4, 4, 0), overworld_frame(gObjectEventPic_Articuno, 4, 4, 0), overworld_frame(gObjectEventPic_Articuno, 4, 4, 0), overworld_frame(gObjectEventPic_Articuno, 4, 4, 0), overworld_frame(gObjectEventPic_Articuno, 4, 4, 0), }; static const struct SpriteFrameImage sPicTable_DeoxysD[] = { overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 1), overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 1), overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 1), }; static const struct SpriteFrameImage sPicTable_DeoxysA[] = { overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 1), overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 1), overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 1), }; static const struct SpriteFrameImage sPicTable_DeoxysN[] = { overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 1), overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 1), overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0), overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 1), }; static const struct SpriteFrameImage sPicTable_Mewtwo[] = { overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0), overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0), overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0), overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0), overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0), overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0), overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0), overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0), overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_Mew[] = { overworld_frame(gObjectEventPic_Mew, 2, 4, 0), overworld_frame(gObjectEventPic_Mew, 2, 4, 1), overworld_frame(gObjectEventPic_Mew, 2, 4, 2), overworld_frame(gObjectEventPic_Mew, 2, 4, 3), overworld_frame(gObjectEventPic_Mew, 2, 4, 4), overworld_frame(gObjectEventPic_Mew, 2, 4, 5), overworld_frame(gObjectEventPic_Mew, 2, 4, 6), overworld_frame(gObjectEventPic_Mew, 2, 4, 7), overworld_frame(gObjectEventPic_Mew, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_Entei[] = { overworld_frame(gObjectEventPic_Entei, 2, 2, 0), overworld_frame(gObjectEventPic_Entei, 2, 2, 0), overworld_frame(gObjectEventPic_Entei, 2, 2, 0), overworld_frame(gObjectEventPic_Entei, 2, 2, 0), overworld_frame(gObjectEventPic_Entei, 2, 2, 0), overworld_frame(gObjectEventPic_Entei, 2, 2, 0), overworld_frame(gObjectEventPic_Entei, 2, 2, 0), overworld_frame(gObjectEventPic_Entei, 2, 2, 0), overworld_frame(gObjectEventPic_Entei, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_Raikou[] = { overworld_frame(gObjectEventPic_Raikou, 2, 2, 0), overworld_frame(gObjectEventPic_Raikou, 2, 2, 0), overworld_frame(gObjectEventPic_Raikou, 2, 2, 0), overworld_frame(gObjectEventPic_Raikou, 2, 2, 0), overworld_frame(gObjectEventPic_Raikou, 2, 2, 0), overworld_frame(gObjectEventPic_Raikou, 2, 2, 0), overworld_frame(gObjectEventPic_Raikou, 2, 2, 0), overworld_frame(gObjectEventPic_Raikou, 2, 2, 0), overworld_frame(gObjectEventPic_Raikou, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_Suicune[] = { overworld_frame(gObjectEventPic_Suicune, 2, 2, 0), overworld_frame(gObjectEventPic_Suicune, 2, 2, 0), overworld_frame(gObjectEventPic_Suicune, 2, 2, 0), overworld_frame(gObjectEventPic_Suicune, 2, 2, 0), overworld_frame(gObjectEventPic_Suicune, 2, 2, 0), overworld_frame(gObjectEventPic_Suicune, 2, 2, 0), overworld_frame(gObjectEventPic_Suicune, 2, 2, 0), overworld_frame(gObjectEventPic_Suicune, 2, 2, 0), overworld_frame(gObjectEventPic_Suicune, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_Bulbasaur[] = { overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 0), overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 1), overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 2), overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 0), overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 0), overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 1), overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 1), overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 2), overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Charmander[] = { overworld_frame(gObjectEventPic_Charmander, 2, 2, 0), overworld_frame(gObjectEventPic_Charmander, 2, 2, 1), overworld_frame(gObjectEventPic_Charmander, 2, 2, 2), overworld_frame(gObjectEventPic_Charmander, 2, 2, 0), overworld_frame(gObjectEventPic_Charmander, 2, 2, 0), overworld_frame(gObjectEventPic_Charmander, 2, 2, 1), overworld_frame(gObjectEventPic_Charmander, 2, 2, 1), overworld_frame(gObjectEventPic_Charmander, 2, 2, 2), overworld_frame(gObjectEventPic_Charmander, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Squirtle[] = { overworld_frame(gObjectEventPic_Squirtle, 2, 2, 0), overworld_frame(gObjectEventPic_Squirtle, 2, 2, 1), overworld_frame(gObjectEventPic_Squirtle, 2, 2, 2), overworld_frame(gObjectEventPic_Squirtle, 2, 2, 0), overworld_frame(gObjectEventPic_Squirtle, 2, 2, 0), overworld_frame(gObjectEventPic_Squirtle, 2, 2, 1), overworld_frame(gObjectEventPic_Squirtle, 2, 2, 1), overworld_frame(gObjectEventPic_Squirtle, 2, 2, 2), overworld_frame(gObjectEventPic_Squirtle, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Lugia[] = { overworld_frame(gObjectEventPic_Lugia, 4, 4, 0), overworld_frame(gObjectEventPic_Lugia, 4, 4, 0), overworld_frame(gObjectEventPic_Lugia, 4, 4, 0), overworld_frame(gObjectEventPic_Lugia, 4, 4, 0), overworld_frame(gObjectEventPic_Lugia, 4, 4, 1), overworld_frame(gObjectEventPic_Lugia, 4, 4, 0), overworld_frame(gObjectEventPic_Lugia, 4, 4, 1), overworld_frame(gObjectEventPic_Lugia, 4, 4, 0), overworld_frame(gObjectEventPic_Lugia, 4, 4, 1), }; static const struct SpriteFrameImage sPicTable_HoOh[] = { overworld_frame(gObjectEventPic_HoOh, 4, 4, 0), overworld_frame(gObjectEventPic_HoOh, 4, 4, 0), overworld_frame(gObjectEventPic_HoOh, 4, 4, 0), overworld_frame(gObjectEventPic_HoOh, 4, 4, 0), overworld_frame(gObjectEventPic_HoOh, 4, 4, 1), overworld_frame(gObjectEventPic_HoOh, 4, 4, 0), overworld_frame(gObjectEventPic_HoOh, 4, 4, 1), overworld_frame(gObjectEventPic_HoOh, 4, 4, 0), overworld_frame(gObjectEventPic_HoOh, 4, 4, 1), }; static const struct SpriteFrameImage sPicTable_Celebi[] = { overworld_frame(gObjectEventPic_Celebi, 2, 2, 0), overworld_frame(gObjectEventPic_Celebi, 2, 2, 0), overworld_frame(gObjectEventPic_Celebi, 2, 2, 0), overworld_frame(gObjectEventPic_Celebi, 2, 2, 0), overworld_frame(gObjectEventPic_Celebi, 2, 2, 0), overworld_frame(gObjectEventPic_Celebi, 2, 2, 0), overworld_frame(gObjectEventPic_Celebi, 2, 2, 0), overworld_frame(gObjectEventPic_Celebi, 2, 2, 0), overworld_frame(gObjectEventPic_Celebi, 2, 2, 0), }; static const struct SpriteFrameImage sPicTable_Cubone[] = { overworld_frame(gObjectEventPic_Cubone, 2, 2, 0), overworld_frame(gObjectEventPic_Cubone, 2, 2, 1), overworld_frame(gObjectEventPic_Cubone, 2, 2, 2), overworld_frame(gObjectEventPic_Cubone, 2, 2, 0), overworld_frame(gObjectEventPic_Cubone, 2, 2, 0), overworld_frame(gObjectEventPic_Cubone, 2, 2, 1), overworld_frame(gObjectEventPic_Cubone, 2, 2, 1), overworld_frame(gObjectEventPic_Cubone, 2, 2, 2), overworld_frame(gObjectEventPic_Cubone, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Poliwrath[] = { overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 0), overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 1), overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 2), overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 0), overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 0), overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 1), overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 1), overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 2), overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Chansey[] = { overworld_frame(gObjectEventPic_Chansey, 2, 2, 0), overworld_frame(gObjectEventPic_Chansey, 2, 2, 1), overworld_frame(gObjectEventPic_Chansey, 2, 2, 2), overworld_frame(gObjectEventPic_Chansey, 2, 2, 0), overworld_frame(gObjectEventPic_Chansey, 2, 2, 0), overworld_frame(gObjectEventPic_Chansey, 2, 2, 1), overworld_frame(gObjectEventPic_Chansey, 2, 2, 1), overworld_frame(gObjectEventPic_Chansey, 2, 2, 2), overworld_frame(gObjectEventPic_Chansey, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Pikachu[] = { overworld_frame(gObjectEventPic_Pikachu, 2, 2, 0), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 1), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 2), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 0), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 0), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 1), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 1), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 2), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Jigglypuff[] = { overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 0), overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 1), overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 2), overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 0), overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 0), overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 1), overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 1), overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 2), overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Pidgey[] = { overworld_frame(gObjectEventPic_Pidgey, 2, 2, 0), overworld_frame(gObjectEventPic_Pidgey, 2, 2, 1), overworld_frame(gObjectEventPic_Pidgey, 2, 2, 2), overworld_frame(gObjectEventPic_Pidgey, 2, 2, 0), overworld_frame(gObjectEventPic_Pidgey, 2, 2, 0), overworld_frame(gObjectEventPic_Pidgey, 2, 2, 1), overworld_frame(gObjectEventPic_Pidgey, 2, 2, 1), overworld_frame(gObjectEventPic_Pidgey, 2, 2, 2), overworld_frame(gObjectEventPic_Pidgey, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Clefairy[] = { overworld_frame(gObjectEventPic_Clefairy, 2, 2, 0), overworld_frame(gObjectEventPic_Clefairy, 2, 2, 1), overworld_frame(gObjectEventPic_Clefairy, 2, 2, 2), overworld_frame(gObjectEventPic_Clefairy, 2, 2, 0), overworld_frame(gObjectEventPic_Clefairy, 2, 2, 0), overworld_frame(gObjectEventPic_Clefairy, 2, 2, 1), overworld_frame(gObjectEventPic_Clefairy, 2, 2, 1), overworld_frame(gObjectEventPic_Clefairy, 2, 2, 2), overworld_frame(gObjectEventPic_Clefairy, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Machoke[] = { overworld_frame(gObjectEventPic_Machoke, 2, 2, 0), overworld_frame(gObjectEventPic_Machoke, 2, 2, 1), overworld_frame(gObjectEventPic_Machoke, 2, 2, 2), overworld_frame(gObjectEventPic_Machoke, 2, 2, 0), overworld_frame(gObjectEventPic_Machoke, 2, 2, 0), overworld_frame(gObjectEventPic_Machoke, 2, 2, 1), overworld_frame(gObjectEventPic_Machoke, 2, 2, 1), overworld_frame(gObjectEventPic_Machoke, 2, 2, 2), overworld_frame(gObjectEventPic_Machoke, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Kabuto[] = { overworld_frame(gObjectEventPic_Kabuto, 2, 2, 0), overworld_frame(gObjectEventPic_Kabuto, 2, 2, 1), overworld_frame(gObjectEventPic_Kabuto, 2, 2, 2), overworld_frame(gObjectEventPic_Kabuto, 2, 2, 0), overworld_frame(gObjectEventPic_Kabuto, 2, 2, 0), overworld_frame(gObjectEventPic_Kabuto, 2, 2, 1), overworld_frame(gObjectEventPic_Kabuto, 2, 2, 1), overworld_frame(gObjectEventPic_Kabuto, 2, 2, 2), overworld_frame(gObjectEventPic_Kabuto, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_Mom[] = { overworld_frame(gObjectEventPic_Mom, 2, 4, 0), overworld_frame(gObjectEventPic_Mom, 2, 4, 1), overworld_frame(gObjectEventPic_Mom, 2, 4, 2), overworld_frame(gObjectEventPic_Mom, 2, 4, 0), overworld_frame(gObjectEventPic_Mom, 2, 4, 0), overworld_frame(gObjectEventPic_Mom, 2, 4, 1), overworld_frame(gObjectEventPic_Mom, 2, 4, 1), overworld_frame(gObjectEventPic_Mom, 2, 4, 2), overworld_frame(gObjectEventPic_Mom, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_Latias[] = { overworld_frame(gObjectEventPic_Latias, 4, 4, 0), overworld_frame(gObjectEventPic_Latias, 4, 4, 0), overworld_frame(gObjectEventPic_Latias, 4, 4, 0), overworld_frame(gObjectEventPic_Latias, 4, 4, 1), overworld_frame(gObjectEventPic_Latias, 4, 4, 2), overworld_frame(gObjectEventPic_Latias, 4, 4, 1), overworld_frame(gObjectEventPic_Latias, 4, 4, 2), overworld_frame(gObjectEventPic_Latias, 4, 4, 1), overworld_frame(gObjectEventPic_Latias, 4, 4, 2), }; static const struct SpriteFrameImage sPicTable_Latios[] = { overworld_frame(gObjectEventPic_Latios, 4, 4, 0), overworld_frame(gObjectEventPic_Latios, 4, 4, 0), overworld_frame(gObjectEventPic_Latios, 4, 4, 0), overworld_frame(gObjectEventPic_Latios, 4, 4, 1), overworld_frame(gObjectEventPic_Latios, 4, 4, 2), overworld_frame(gObjectEventPic_Latios, 4, 4, 1), overworld_frame(gObjectEventPic_Latios, 4, 4, 2), overworld_frame(gObjectEventPic_Latios, 4, 4, 1), overworld_frame(gObjectEventPic_Latios, 4, 4, 2), }; static const struct SpriteFrameImage sPicTable_EmBrendan[] = { overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 0), overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 1), overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 2), overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 3), overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 4), overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 5), overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 6), overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 7), overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_EmMay[] = { overworld_frame(gObjectEventPic_EmMay, 2, 4, 0), overworld_frame(gObjectEventPic_EmMay, 2, 4, 1), overworld_frame(gObjectEventPic_EmMay, 2, 4, 2), overworld_frame(gObjectEventPic_EmMay, 2, 4, 3), overworld_frame(gObjectEventPic_EmMay, 2, 4, 4), overworld_frame(gObjectEventPic_EmMay, 2, 4, 5), overworld_frame(gObjectEventPic_EmMay, 2, 4, 6), overworld_frame(gObjectEventPic_EmMay, 2, 4, 7), overworld_frame(gObjectEventPic_EmMay, 2, 4, 8), }; static const struct SpriteFrameImage sPicTable_CableCar[] = { overworld_frame(gObjectEventPic_CableCar, 4, 16, 0), }; static const struct SpriteFrameImage sPicTable_Sudowoodo[] = { overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 1), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 1), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 2), }; static const struct SpriteFrameImage sPicTable_Abra[] = { overworld_frame(gObjectEventPic_Abra, 2, 2, 0), overworld_frame(gObjectEventPic_Abra, 2, 2, 1), overworld_frame(gObjectEventPic_Abra, 2, 2, 2), overworld_frame(gObjectEventPic_Abra, 2, 2, 0), overworld_frame(gObjectEventPic_Abra, 2, 2, 0), overworld_frame(gObjectEventPic_Abra, 2, 2, 1), overworld_frame(gObjectEventPic_Abra, 2, 2, 1), overworld_frame(gObjectEventPic_Abra, 2, 2, 2), overworld_frame(gObjectEventPic_Abra, 2, 2, 2), }; static const struct SpriteFrameImage sPicTable_SwimmerFWater2[] = { overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 0), overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 1), overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 2), overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 3), overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 4), overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 5), overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 6), overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 7), overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 8), overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterBeauty[] = { overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 0), overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 1), overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 2), overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 3), overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 4), overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 5), overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 6), overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 7), overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 8), overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterBirdKeeper[] = { overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 0), overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 1), overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 2), overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 3), overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 4), overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 5), overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 6), overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 7), overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 8), overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterBlackbelt[] = { overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 0), overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 1), overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 2), overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 3), overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 4), overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 5), overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 6), overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 7), overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 8), overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterBugCatcher[] = { overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 0), overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 1), overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 2), overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 3), overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 4), overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 5), overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 6), overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 7), overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 8), overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterCooltrainerM[] = { overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 0), overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 1), overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 2), overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 3), overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 4), overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 5), overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 6), overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 7), overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 8), overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterHiker[] = { overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 0), overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 1), overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 2), overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 3), overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 4), overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 5), overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 6), overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 7), overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 8), overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterLass[] = { overworld_frame(gObjectEventPic_MasterLass, 2, 4, 0), overworld_frame(gObjectEventPic_MasterLass, 2, 4, 1), overworld_frame(gObjectEventPic_MasterLass, 2, 4, 2), overworld_frame(gObjectEventPic_MasterLass, 2, 4, 3), overworld_frame(gObjectEventPic_MasterLass, 2, 4, 4), overworld_frame(gObjectEventPic_MasterLass, 2, 4, 5), overworld_frame(gObjectEventPic_MasterLass, 2, 4, 6), overworld_frame(gObjectEventPic_MasterLass, 2, 4, 7), overworld_frame(gObjectEventPic_MasterLass, 2, 4, 8), overworld_frame(gObjectEventPic_MasterLass, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterPsychicM[] = { overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 0), overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 1), overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 2), overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 3), overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 4), overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 5), overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 6), overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 7), overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 8), overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterScientist[] = { overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 0), overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 1), overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 2), overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 3), overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 4), overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 5), overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 6), overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 7), overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 8), overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_MasterYoungster[] = { overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 0), overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 1), overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 2), overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 3), overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 4), overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 5), overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 6), overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 7), overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 8), overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Lady[] = { overworld_frame(gObjectEventPic_Lady, 2, 4, 0), overworld_frame(gObjectEventPic_Lady, 2, 4, 1), overworld_frame(gObjectEventPic_Lady, 2, 4, 2), overworld_frame(gObjectEventPic_Lady, 2, 4, 3), overworld_frame(gObjectEventPic_Lady, 2, 4, 4), overworld_frame(gObjectEventPic_Lady, 2, 4, 5), overworld_frame(gObjectEventPic_Lady, 2, 4, 6), overworld_frame(gObjectEventPic_Lady, 2, 4, 7), overworld_frame(gObjectEventPic_Lady, 2, 4, 8), overworld_frame(gObjectEventPic_Lady, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Rocker2[] = { overworld_frame(gObjectEventPic_Rocker2, 2, 4, 0), overworld_frame(gObjectEventPic_Rocker2, 2, 4, 1), overworld_frame(gObjectEventPic_Rocker2, 2, 4, 2), overworld_frame(gObjectEventPic_Rocker2, 2, 4, 3), overworld_frame(gObjectEventPic_Rocker2, 2, 4, 4), overworld_frame(gObjectEventPic_Rocker2, 2, 4, 5), overworld_frame(gObjectEventPic_Rocker2, 2, 4, 6), overworld_frame(gObjectEventPic_Rocker2, 2, 4, 7), overworld_frame(gObjectEventPic_Rocker2, 2, 4, 8), overworld_frame(gObjectEventPic_Rocker2, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Anabel[] = { overworld_frame(gObjectEventPic_Anabel, 2, 4, 0), overworld_frame(gObjectEventPic_Anabel, 2, 4, 1), overworld_frame(gObjectEventPic_Anabel, 2, 4, 2), overworld_frame(gObjectEventPic_Anabel, 2, 4, 3), overworld_frame(gObjectEventPic_Anabel, 2, 4, 4), overworld_frame(gObjectEventPic_Anabel, 2, 4, 5), overworld_frame(gObjectEventPic_Anabel, 2, 4, 6), overworld_frame(gObjectEventPic_Anabel, 2, 4, 7), overworld_frame(gObjectEventPic_Anabel, 2, 4, 8), overworld_frame(gObjectEventPic_Anabel, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Tucker[] = { overworld_frame(gObjectEventPic_Tucker, 4, 4, 0), overworld_frame(gObjectEventPic_Tucker, 4, 4, 1), overworld_frame(gObjectEventPic_Tucker, 4, 4, 2), overworld_frame(gObjectEventPic_Tucker, 4, 4, 3), overworld_frame(gObjectEventPic_Tucker, 4, 4, 4), overworld_frame(gObjectEventPic_Tucker, 4, 4, 5), overworld_frame(gObjectEventPic_Tucker, 4, 4, 6), overworld_frame(gObjectEventPic_Tucker, 4, 4, 7), overworld_frame(gObjectEventPic_Tucker, 4, 4, 8), overworld_frame(gObjectEventPic_Tucker, 4, 4, 9), }; static const struct SpriteFrameImage sPicTable_Greta[] = { overworld_frame(gObjectEventPic_Greta, 2, 4, 0), overworld_frame(gObjectEventPic_Greta, 2, 4, 1), overworld_frame(gObjectEventPic_Greta, 2, 4, 2), overworld_frame(gObjectEventPic_Greta, 2, 4, 3), overworld_frame(gObjectEventPic_Greta, 2, 4, 4), overworld_frame(gObjectEventPic_Greta, 2, 4, 5), overworld_frame(gObjectEventPic_Greta, 2, 4, 6), overworld_frame(gObjectEventPic_Greta, 2, 4, 7), overworld_frame(gObjectEventPic_Greta, 2, 4, 8), overworld_frame(gObjectEventPic_Greta, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Spenser[] = { overworld_frame(gObjectEventPic_Spenser, 2, 4, 0), overworld_frame(gObjectEventPic_Spenser, 2, 4, 1), overworld_frame(gObjectEventPic_Spenser, 2, 4, 2), overworld_frame(gObjectEventPic_Spenser, 2, 4, 3), overworld_frame(gObjectEventPic_Spenser, 2, 4, 4), overworld_frame(gObjectEventPic_Spenser, 2, 4, 5), overworld_frame(gObjectEventPic_Spenser, 2, 4, 6), overworld_frame(gObjectEventPic_Spenser, 2, 4, 7), overworld_frame(gObjectEventPic_Spenser, 2, 4, 8), overworld_frame(gObjectEventPic_Spenser, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Noland[] = { overworld_frame(gObjectEventPic_Noland, 2, 4, 0), overworld_frame(gObjectEventPic_Noland, 2, 4, 1), overworld_frame(gObjectEventPic_Noland, 2, 4, 2), overworld_frame(gObjectEventPic_Noland, 2, 4, 3), overworld_frame(gObjectEventPic_Noland, 2, 4, 4), overworld_frame(gObjectEventPic_Noland, 2, 4, 5), overworld_frame(gObjectEventPic_Noland, 2, 4, 6), overworld_frame(gObjectEventPic_Noland, 2, 4, 7), overworld_frame(gObjectEventPic_Noland, 2, 4, 8), overworld_frame(gObjectEventPic_Noland, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Lucy[] = { overworld_frame(gObjectEventPic_Lucy, 2, 4, 0), overworld_frame(gObjectEventPic_Lucy, 2, 4, 1), overworld_frame(gObjectEventPic_Lucy, 2, 4, 2), overworld_frame(gObjectEventPic_Lucy, 2, 4, 3), overworld_frame(gObjectEventPic_Lucy, 2, 4, 4), overworld_frame(gObjectEventPic_Lucy, 2, 4, 5), overworld_frame(gObjectEventPic_Lucy, 2, 4, 6), overworld_frame(gObjectEventPic_Lucy, 2, 4, 7), overworld_frame(gObjectEventPic_Lucy, 2, 4, 8), overworld_frame(gObjectEventPic_Lucy, 2, 4, 9), }; static const struct SpriteFrameImage sPicTable_Brandon[] = { overworld_frame(gObjectEventPic_Brandon, 2, 4, 0), overworld_frame(gObjectEventPic_Brandon, 2, 4, 1), overworld_frame(gObjectEventPic_Brandon, 2, 4, 2), overworld_frame(gObjectEventPic_Brandon, 2, 4, 3), overworld_frame(gObjectEventPic_Brandon, 2, 4, 4), overworld_frame(gObjectEventPic_Brandon, 2, 4, 5), overworld_frame(gObjectEventPic_Brandon, 2, 4, 6), overworld_frame(gObjectEventPic_Brandon, 2, 4, 7), overworld_frame(gObjectEventPic_Brandon, 2, 4, 8), overworld_frame(gObjectEventPic_Brandon, 2, 4, 9), }; ================================================ FILE: src/data/object_events/object_event_subsprites.h ================================================ const struct Subsprite gObjectEventSpriteOamTable_16x16_0[] = { { .x = -8, .y = -8, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 0, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_16x16_1[] = { { .x = -8, .y = -8, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 0, .priority = 1 } }; const struct Subsprite gObjectEventSpriteOamTable_16x16_2[] = { { .x = -8, .y = -8, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 0, .priority = 2 }, { .x = -8, .y = 0, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 2, .priority = 3 } }; const struct Subsprite gObjectEventSpriteOamTable_16x16_3[] = { { .x = -8, .y = -8, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 0, .priority = 2 }, { .x = -8, .y = -8, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 0, .priority = 3 } }; const struct Subsprite gObjectEventSpriteOamTable_16x16_4[] = { { .x = -8, .y = -8, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 0, .priority = 1 }, { .x = -8, .y = -8, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 0, .priority = 3 } }; const struct SubspriteTable gObjectEventSpriteOamTables_16x16[] = { {0, NULL}, {1, gObjectEventSpriteOamTable_16x16_0}, {1, gObjectEventSpriteOamTable_16x16_1}, {2, gObjectEventSpriteOamTable_16x16_2}, {2, gObjectEventSpriteOamTable_16x16_3}, {2, gObjectEventSpriteOamTable_16x16_4}, }; const struct Subsprite gObjectEventSpriteOamTable_16x32_0[] = { { .x = -8, .y = -16, .shape = SPRITE_SHAPE(16x32), .size = SPRITE_SIZE(16x32), .tileOffset = 0, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_16x32_1[] = { { .x = -8, .y = -16, .shape = SPRITE_SHAPE(16x32), .size = SPRITE_SIZE(16x32), .tileOffset = 0, .priority = 1 } }; const struct Subsprite gObjectEventSpriteOamTable_16x32_2[] = { { .x = -8, .y = -16, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 0, .priority = 2 }, { .x = -8, .y = 0, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 4, .priority = 2 }, { .x = -8, .y = 8, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 6, .priority = 3 } }; const struct Subsprite gObjectEventSpriteOamTable_16x32_3[] = { { .x = -8, .y = -16, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 0, .priority = 2 }, { .x = -8, .y = 0, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 4, .priority = 3 } }; const struct Subsprite gObjectEventSpriteOamTable_16x32_4[] = { { .x = -8, .y = -16, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 0, .priority = 1 }, { .x = -8, .y = 0, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .tileOffset = 4, .priority = 3 } }; const struct SubspriteTable gObjectEventSpriteOamTables_16x32[] = { {0, NULL}, {1, gObjectEventSpriteOamTable_16x32_0}, {1, gObjectEventSpriteOamTable_16x32_1}, {3, gObjectEventSpriteOamTable_16x32_2}, {2, gObjectEventSpriteOamTable_16x32_3}, {2, gObjectEventSpriteOamTable_16x32_4}, }; const struct Subsprite gObjectEventSpriteOamTable_32x32_0[] = { { .x = -16, .y = -16, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .tileOffset = 0, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_32x32_1[] = { { .x = -16, .y = -16, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .tileOffset = 0, .priority = 1 } }; const struct Subsprite gObjectEventSpriteOamTable_32x32_2[] = { { .x = -16, .y = -16, .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .tileOffset = 0, .priority = 2 }, { .x = -16, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 2 }, { .x = -16, .y = 8, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 12, .priority = 3 } }; const struct Subsprite gObjectEventSpriteOamTable_32x32_3[] = { { .x = -16, .y = -16, .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .tileOffset = 0, .priority = 2 }, { .x = -16, .y = 0, .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .tileOffset = 8, .priority = 3 } }; const struct Subsprite gObjectEventSpriteOamTable_32x32_4[] = { { .x = -16, .y = -16, .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .tileOffset = 0, .priority = 1 }, { .x = -16, .y = 0, .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .tileOffset = 8, .priority = 3 } }; const struct SubspriteTable gObjectEventSpriteOamTables_32x32[] = { {0, NULL}, {1, gObjectEventSpriteOamTable_32x32_0}, {1, gObjectEventSpriteOamTable_32x32_1}, {3, gObjectEventSpriteOamTable_32x32_2}, {2, gObjectEventSpriteOamTable_32x32_3}, {2, gObjectEventSpriteOamTable_32x32_4}, }; const struct Subsprite gObjectEventSpriteOamTable_48x48[] = { { .x = -24, .y = -24, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 2 }, { .x = 8, .y = -24, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 4, .priority = 2 }, { .x = -24, .y = -16, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 6, .priority = 2 }, { .x = 8, .y = -16, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 10, .priority = 2 }, { .x = -24, .y = -8, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 12, .priority = 2 }, { .x = 8, .y = -8, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 16, .priority = 2 }, { .x = -24, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 18, .priority = 2 }, { .x = 8, .y = 0, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 22, .priority = 2 }, { .x = -24, .y = 8, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 24, .priority = 2 }, { .x = 8, .y = 8, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 28, .priority = 2 }, { .x = -24, .y = 16, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 30, .priority = 2 }, { .x = 8, .y = 16, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 34, .priority = 2 } }; // Unused. Used by the moving truck in RS const struct SubspriteTable gObjectEventSpriteOamTables_48x48[] = { {12, gObjectEventSpriteOamTable_48x48}, {12, gObjectEventSpriteOamTable_48x48}, {12, gObjectEventSpriteOamTable_48x48}, {12, gObjectEventSpriteOamTable_48x48}, {12, gObjectEventSpriteOamTable_48x48}, {12, gObjectEventSpriteOamTable_48x48}, }; const struct Subsprite gObjectEventSpriteOamTable_64x32_0[] = { { .x = -32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 0, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_64x32_1[] = { { .x = -32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 0, .priority = 1 } }; const struct Subsprite gObjectEventSpriteOamTable_64x32_2[] = { { .x = -32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 0, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_64x32_3[] = { { .x = -32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 0, .priority = 2 } }; // Unused const struct SubspriteTable gObjectEventSpriteOamTables_64x32[] = { {0, NULL}, {1, gObjectEventSpriteOamTable_64x32_0}, {1, gObjectEventSpriteOamTable_64x32_1}, {1, gObjectEventSpriteOamTable_64x32_2}, {1, gObjectEventSpriteOamTable_64x32_3}, {1, gObjectEventSpriteOamTable_64x32_3}, }; const struct Subsprite gObjectEventSpriteOamTable_64x64_0[] = { { .x = -32, .y = -32, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .tileOffset = 0, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_64x64_1[] = { { .x = -32, .y = -32, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .tileOffset = 0, .priority = 1 } }; const struct Subsprite gObjectEventSpriteOamTable_64x64_2[] = { { .x = -32, .y = -32, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .tileOffset = 0, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_64x64_3[] = { { .x = -32, .y = -32, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .tileOffset = 0, .priority = 2 } }; const struct SubspriteTable gObjectEventSpriteOamTables_64x64[] = { {0, NULL}, {1, gObjectEventSpriteOamTable_64x64_0}, {1, gObjectEventSpriteOamTable_64x64_1}, {1, gObjectEventSpriteOamTable_64x64_2}, {1, gObjectEventSpriteOamTable_64x64_3}, {1, gObjectEventSpriteOamTable_64x64_3}, }; const struct Subsprite gObjectEventSpriteOamTable_96x40_0[] = { { .x = -48, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 2 }, { .x = -16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 2 }, { .x = 16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 2 }, { .x = -48, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 12, .priority = 2 }, { .x = -16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 16, .priority = 2 }, { .x = 16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 20, .priority = 2 }, { .x = -48, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 24, .priority = 2 }, { .x = -16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 28, .priority = 2 }, { .x = 16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 32, .priority = 2 }, { .x = -48, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 36, .priority = 2 }, { .x = -16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 40, .priority = 2 }, { .x = 16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 44, .priority = 2 }, { .x = -48, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 48, .priority = 2 }, { .x = -16, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 52, .priority = 2 }, { .x = 16, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 56, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_96x40_1[] = { { .x = -48, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = -16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 1 }, { .x = 16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 1 }, { .x = -48, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 12, .priority = 1 }, { .x = -16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 16, .priority = 1 }, { .x = 16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 20, .priority = 1 }, { .x = -48, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 24, .priority = 1 }, { .x = -16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 28, .priority = 1 }, { .x = 16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 32, .priority = 1 }, { .x = -48, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 36, .priority = 1 }, { .x = -16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 40, .priority = 1 }, { .x = 16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 44, .priority = 1 }, { .x = -48, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 48, .priority = 1 }, { .x = -16, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 52, .priority = 1 }, { .x = 16, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 56, .priority = 1 } }; const struct Subsprite gObjectEventSpriteOamTable_96x40_2[] = { { .x = -48, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 2 }, { .x = -16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 2 }, { .x = 16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 2 }, { .x = -48, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 12, .priority = 2 }, { .x = -16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 16, .priority = 2 }, { .x = 16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 20, .priority = 2 }, { .x = -48, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 24, .priority = 2 }, { .x = -16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 28, .priority = 2 }, { .x = 16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 32, .priority = 2 }, { .x = -48, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 36, .priority = 2 }, { .x = -16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 40, .priority = 2 }, { .x = 16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 44, .priority = 2 }, { .x = -48, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 48, .priority = 2 }, { .x = -16, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 52, .priority = 2 }, { .x = 16, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 56, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_96x40_3[] = { { .x = -48, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = -16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 1 }, { .x = 16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 1 }, { .x = -48, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 12, .priority = 1 }, { .x = -16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 16, .priority = 1 }, { .x = 16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 20, .priority = 1 }, { .x = -48, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 24, .priority = 2 }, { .x = -16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 28, .priority = 2 }, { .x = 16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 32, .priority = 2 }, { .x = -48, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 36, .priority = 2 }, { .x = -16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 40, .priority = 2 }, { .x = 16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 44, .priority = 2 }, { .x = -48, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 48, .priority = 2 }, { .x = -16, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 52, .priority = 2 }, { .x = 16, .y = 12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 56, .priority = 2 } }; // Unused. Used by the SS Tidal in RS const struct SubspriteTable gObjectEventSpriteOamTables_96x40[] = { {15, gObjectEventSpriteOamTable_96x40_0}, {15, gObjectEventSpriteOamTable_96x40_0}, {15, gObjectEventSpriteOamTable_96x40_1}, {15, gObjectEventSpriteOamTable_96x40_2}, {15, gObjectEventSpriteOamTable_96x40_3}, {15, gObjectEventSpriteOamTable_96x40_3}, }; const struct Subsprite gObjectEventSpriteOamTable_128x64_0[] = { { .x = -32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 0, .priority = 2 }, { .x = 32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 32, .priority = 2 }, { .x = -32, .y = 16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 64, .priority = 2 }, { .x = 32, .y = 16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 96, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_128x64_1[] = { { .x = -32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 0, .priority = 1 }, { .x = 32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 32, .priority = 1 }, { .x = -32, .y = 16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 64, .priority = 1 }, { .x = 32, .y = 16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 96, .priority = 1 } }; const struct Subsprite gObjectEventSpriteOamTable_128x64_2[] = { { .x = -32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 0, .priority = 1 }, { .x = 32, .y = -16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 32, .priority = 1 }, { .x = -32, .y = 16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 64, .priority = 2 }, { .x = 32, .y = 16, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 96, .priority = 2 } }; const struct SubspriteTable gObjectEventSpriteOamTables_128x64[] = { {4, gObjectEventSpriteOamTable_128x64_0}, {4, gObjectEventSpriteOamTable_128x64_0}, {4, gObjectEventSpriteOamTable_128x64_1}, {4, gObjectEventSpriteOamTable_128x64_2}, {4, gObjectEventSpriteOamTable_128x64_2}, {4, gObjectEventSpriteOamTable_128x64_2}, }; const struct Subsprite gObjectEventSpriteOamTable_88x32_0[] = { { .x = -48, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 2 }, { .x = -16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 2 }, { .x = 16, .y = -20, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 8, .priority = 2 }, { .x = 32, .y = -20, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 10, .priority = 2 }, { .x = -48, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 11, .priority = 2 }, { .x = -16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 15, .priority = 2 }, { .x = 16, .y = -12, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 19, .priority = 2 }, { .x = 32, .y = -12, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 21, .priority = 2 }, { .x = -48, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 22, .priority = 2 }, { .x = -16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 26, .priority = 2 }, { .x = 16, .y = -4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 30, .priority = 2 }, { .x = 32, .y = -4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 32, .priority = 2 }, { .x = -48, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 33, .priority = 2 }, { .x = -16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 37, .priority = 2 }, { .x = 16, .y = 4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 41, .priority = 2 }, { .x = 32, .y = 4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 43, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_88x32_1[] = { { .x = -48, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = -16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 1 }, { .x = 16, .y = -20, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 8, .priority = 1 }, { .x = 32, .y = -20, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 10, .priority = 1 }, { .x = -48, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 11, .priority = 1 }, { .x = -16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 15, .priority = 1 }, { .x = 16, .y = -12, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 19, .priority = 1 }, { .x = 32, .y = -12, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 21, .priority = 1 }, { .x = -48, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 22, .priority = 1 }, { .x = -16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 26, .priority = 1 }, { .x = 16, .y = -4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 30, .priority = 1 }, { .x = 32, .y = -4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 32, .priority = 1 }, { .x = -48, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 33, .priority = 1 }, { .x = -16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 37, .priority = 1 }, { .x = 16, .y = 4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 41, .priority = 1 }, { .x = 32, .y = 4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 43, .priority = 1 } }; const struct Subsprite gObjectEventSpriteOamTable_88x32_2[] = { { .x = -48, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 2 }, { .x = -16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 2 }, { .x = 16, .y = -20, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 8, .priority = 2 }, { .x = 32, .y = -20, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 10, .priority = 2 }, { .x = -48, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 11, .priority = 2 }, { .x = -16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 15, .priority = 2 }, { .x = 16, .y = -12, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 19, .priority = 2 }, { .x = 32, .y = -12, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 21, .priority = 2 }, { .x = -48, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 22, .priority = 2 }, { .x = -16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 26, .priority = 2 }, { .x = 16, .y = -4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 30, .priority = 2 }, { .x = 32, .y = -4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 32, .priority = 2 }, { .x = -48, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 33, .priority = 2 }, { .x = -16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 37, .priority = 2 }, { .x = 16, .y = 4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 41, .priority = 2 }, { .x = 32, .y = 4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 43, .priority = 2 } }; const struct Subsprite gObjectEventSpriteOamTable_88x32_3[] = { { .x = -48, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = -16, .y = -20, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 1 }, { .x = 16, .y = -20, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 8, .priority = 1 }, { .x = 32, .y = -20, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 10, .priority = 1 }, { .x = -48, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 11, .priority = 1 }, { .x = -16, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 15, .priority = 1 }, { .x = 16, .y = -12, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 19, .priority = 1 }, { .x = 32, .y = -12, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 21, .priority = 1 }, { .x = -48, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 22, .priority = 2 }, { .x = -16, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 26, .priority = 2 }, { .x = 16, .y = -4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 30, .priority = 2 }, { .x = 32, .y = -4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 32, .priority = 2 }, { .x = -48, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 33, .priority = 2 }, { .x = -16, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 37, .priority = 2 }, { .x = 16, .y = 4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 41, .priority = 2 }, { .x = 32, .y = 4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 43, .priority = 2 } }; // Unused. Used by the submarine shadow in RS const struct SubspriteTable gObjectEventSpriteOamTables_88x32[] = { {16, gObjectEventSpriteOamTable_88x32_0}, {16, gObjectEventSpriteOamTable_88x32_0}, {16, gObjectEventSpriteOamTable_88x32_1}, {16, gObjectEventSpriteOamTable_88x32_2}, {16, gObjectEventSpriteOamTable_88x32_3}, {16, gObjectEventSpriteOamTable_88x32_3}, }; ================================================ FILE: src/data/party_menu.h ================================================ static const struct BgTemplate sPartyMenuBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 1, .paletteMode = 0, .priority = 0, .baseTile = 0 }, }; enum { PARTY_BOX_LEFT_COLUMN, PARTY_BOX_RIGHT_COLUMN, }; static const struct PartyMenuBoxInfoRects sPartyBoxInfoRects[] = { [PARTY_BOX_LEFT_COLUMN] = { BlitBitmapToPartyWindow_LeftColumn, { // The below are the x, y, width, and height for each of the following info 24, 11, 40, 13, // Nickname 32, 20, 32, 8, // Level 64, 20, 8, 8, // Gender 38, 36, 24, 8, // HP 53, 36, 24, 8, // Max HP 24, 35, 48, 3 // HP bar }, 12, 34, 64, 16 // Description text (e.g. NO USE) }, [PARTY_BOX_RIGHT_COLUMN] = { BlitBitmapToPartyWindow_RightColumn, { // The below are the x, y, width, and height for each of the following info 22, 3, 40, 13, // Nickname 32, 12, 32, 8, // Level 64, 12, 8, 8, // Gender 102, 12, 24, 8, // HP 117, 12, 24, 8, // Max HP 88, 10, 48, 3 // HP bar }, 77, 4, 64, 16 // Description text }, }; static const u8 sPartyMenuSpriteCoords[PARTY_LAYOUT_COUNT][PARTY_SIZE][4 * 2] = { [PARTY_LAYOUT_SINGLE] = { // pokemon coords, held item coords, status coords, pokeball coords { 16, 40, 20, 50, 56, 52, 16, 34}, {104, 18, 108, 28, 144, 27, 102, 25}, {104, 42, 108, 52, 144, 51, 102, 49}, {104, 66, 108, 76, 144, 75, 102, 73}, {104, 90, 108, 100, 144, 99, 102, 97}, {104, 114, 108, 124, 144, 123, 102, 121}, }, [PARTY_LAYOUT_DOUBLE] = { { 16, 24, 20, 34, 56, 36, 16, 18}, { 16, 80, 20, 90, 56, 92, 16, 74}, {104, 18, 108, 28, 144, 27, 102, 25}, {104, 50, 108, 60, 144, 59, 102, 57}, {104, 82, 108, 92, 144, 91, 102, 89}, {104, 114, 108, 124, 144, 123, 102, 121}, }, [PARTY_LAYOUT_MULTI] = { { 16, 24, 20, 34, 56, 36, 16, 18}, { 16, 80, 20, 90, 56, 92, 16, 74}, {104, 26, 106, 36, 144, 35, 102, 33}, {104, 50, 106, 60, 144, 59, 102, 57}, {104, 82, 106, 92, 144, 91, 102, 89}, {104, 106, 106, 116, 144, 115, 102, 113}, }, [PARTY_LAYOUT_MULTI_SHOWCASE] = { { 16, 32, 20, 42, 56, 44, 16, 26}, {104, 34, 106, 44, 144, 43, 102, 41}, {104, 58, 106, 68, 144, 67, 102, 65}, { 16, 104, 20, 114, 56, 116, 16, 98}, {104, 106, 106, 116, 144, 115, 102, 113}, {104, 130, 106, 140, 144, 139, 102, 137}, }, }; static const u32 sConfirmButton_Tilemap[] = INCBIN_U32("graphics/party_menu/confirm_button.bin"); static const u32 sCancelButton_Tilemap[] = INCBIN_U32("graphics/party_menu/cancel_button.bin"); static const u8 sFontColorTable[][3] = { {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY}, // Default {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_GREEN}, // Unused {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_2, TEXT_DYNAMIC_COLOR_3}, // Gender symbol {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, // Selection actions {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, // Field moves {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, // Unused }; static const struct WindowTemplate sSinglePartyMenuWindowTemplate[] = { { .bg = 0, .tilemapLeft = 1, .tilemapTop = 3, .width = 10, .height = 7, .paletteNum = 3, .baseBlock = 0x63, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 1, .width = 18, .height = 3, .paletteNum = 4, .baseBlock = 0xA9, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 4, .width = 18, .height = 3, .paletteNum = 5, .baseBlock = 0xDF, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 7, .width = 18, .height = 3, .paletteNum = 6, .baseBlock = 0x115, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 10, .width = 18, .height = 3, .paletteNum = 7, .baseBlock = 0x14B, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 13, .width = 18, .height = 3, .paletteNum = 8, .baseBlock = 0x181, }, { .bg = 2, .tilemapLeft = 1, .tilemapTop = 15, .width = 28, .height = 4, .paletteNum = 14, .baseBlock = 0x1DF, }, DUMMY_WIN_TEMPLATE, }; static const struct WindowTemplate sDoublePartyMenuWindowTemplate[] = { { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 10, .height = 7, .paletteNum = 3, .baseBlock = 0x63, }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 8, .width = 10, .height = 7, .paletteNum = 4, .baseBlock = 0xA9, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 1, .width = 18, .height = 3, .paletteNum = 5, .baseBlock = 0xEF, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 5, .width = 18, .height = 3, .paletteNum = 6, .baseBlock = 0x125, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 9, .width = 18, .height = 3, .paletteNum = 7, .baseBlock = 0x15B, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 13, .width = 18, .height = 3, .paletteNum = 8, .baseBlock = 0x191, }, { .bg = 2, .tilemapLeft = 1, .tilemapTop = 15, .width = 28, .height = 4, .paletteNum = 14, .baseBlock = 0x1DF, }, DUMMY_WIN_TEMPLATE, }; static const struct WindowTemplate sMultiPartyMenuWindowTemplate[] = { { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 10, .height = 7, .paletteNum = 3, .baseBlock = 0x63, }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 8, .width = 10, .height = 7, .paletteNum = 4, .baseBlock = 0xA9, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 2, .width = 18, .height = 3, .paletteNum = 5, .baseBlock = 0xEF, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 5, .width = 18, .height = 3, .paletteNum = 6, .baseBlock = 0x125, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 9, .width = 18, .height = 3, .paletteNum = 7, .baseBlock = 0x15B, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 12, .width = 18, .height = 3, .paletteNum = 8, .baseBlock = 0x191, }, { .bg = 2, .tilemapLeft = 1, .tilemapTop = 15, .width = 28, .height = 4, .paletteNum = 14, .baseBlock = 0x1DF, }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sShowcaseMultiPartyMenuWindowTemplate[] = { { .bg = 0, .tilemapLeft = 1, .tilemapTop = 2, .width = 10, .height = 7, .paletteNum = 3, .baseBlock = 0x63, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 3, .width = 18, .height = 3, .paletteNum = 5, .baseBlock = 0xA9, }, { .bg = 0, .tilemapLeft = 12, .tilemapTop = 6, .width = 18, .height = 3, .paletteNum = 6, .baseBlock = 0xDF, }, { .bg = 2, .tilemapLeft = 1, .tilemapTop = 11, .width = 10, .height = 7, .paletteNum = 4, .baseBlock = 0x115, }, { .bg = 2, .tilemapLeft = 12, .tilemapTop = 12, .width = 18, .height = 3, .paletteNum = 7, .baseBlock = 0x16B, }, { .bg = 2, .tilemapLeft = 12, .tilemapTop = 15, .width = 18, .height = 3, .paletteNum = 8, .baseBlock = 0x1A1, }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sCancelButtonWindowTemplate = { .bg = 0, .tilemapLeft = 24, .tilemapTop = 17, .width = 6, .height = 2, .paletteNum = 3, .baseBlock = 0x1C7, }; static const struct WindowTemplate sMultiCancelButtonWindowTemplate = { .bg = 0, .tilemapLeft = 24, .tilemapTop = 18, .width = 6, .height = 2, .paletteNum = 3, .baseBlock = 0x1C7, }; static const struct WindowTemplate sConfirmButtonWindowTemplate = { .bg = 0, .tilemapLeft = 24, .tilemapTop = 16, .width = 6, .height = 2, .paletteNum = 3, .baseBlock = 0x1D3, }; static const struct WindowTemplate sDefaultPartyMsgWindowTemplate = { .bg = 2, .tilemapLeft = 1, .tilemapTop = 17, .width = 21, .height = 2, .paletteNum = 15, .baseBlock = 0x24F, }; static const struct WindowTemplate sDoWhatWithMonMsgWindowTemplate = { .bg = 2, .tilemapLeft = 1, .tilemapTop = 17, .width = 16, .height = 2, .paletteNum = 15, .baseBlock = 0x279, }; static const struct WindowTemplate sDoWhatWithItemMsgWindowTemplate = { .bg = 2, .tilemapLeft = 1, .tilemapTop = 17, .width = 19, .height = 2, .paletteNum = 15, .baseBlock = 0x299, }; static const struct WindowTemplate sDoWhatWithMailMsgWindowTemplate = { .bg = 2, .tilemapLeft = 1, .tilemapTop = 17, .width = 16, .height = 2, .paletteNum = 15, .baseBlock = 0x299, }; static const struct WindowTemplate sWhichMoveMsgWindowTemplate = { .bg = 2, .tilemapLeft = 1, .tilemapTop = 17, .width = 15, .height = 2, .paletteNum = 15, .baseBlock = 0x299, }; static const struct WindowTemplate sItemGiveTakeWindowTemplate = { .bg = 2, .tilemapLeft = 22, .tilemapTop = 13, .width = 7, .height = 6, .paletteNum = 14, .baseBlock = 0x373, }; static const struct WindowTemplate sMailReadTakeWindowTemplate = { .bg = 2, .tilemapLeft = 19, .tilemapTop = 13, .width = 10, .height = 6, .paletteNum = 14, .baseBlock = 0x373, }; static const struct WindowTemplate sMoveSelectWindowTemplate = { .bg = 2, .tilemapLeft = 18, .tilemapTop = 11, .width = 11, .height = 8, .paletteNum = 14, .baseBlock = 0x2BF, }; static const struct WindowTemplate sPartyMenuYesNoWindowTemplate = { .bg = 2, .tilemapLeft = 21, .tilemapTop = 9, .width = 6, .height = 4, .paletteNum = 14, .baseBlock = 0x2BF, }; static const struct WindowTemplate sLevelUpStatsWindowTemplate = { .bg = 2, .tilemapLeft = 19, .tilemapTop = 1, .width = 10, .height = 11, .paletteNum = 14, .baseBlock = 0x2BF, }; static const struct WindowTemplate sWindowTemplate_FirstBattleOakVoiceover = { .bg = 2, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 14, .baseBlock = 0x1DF, }; static const struct WindowTemplate sFieldMoveDescriptionWindowTemplate = { .bg = 2, .tilemapLeft = 0, .tilemapTop = 13, .width = 18, .height = 3, .paletteNum = 12, .baseBlock = 0x373, }; // Plain tilemaps for party menu slots. // The versions with no HP bar are used by eggs, and in certain displays like registering at a battle facility. // There is no empty version of the main slot because it shouldn't ever be empty. static const u8 sSlotTilemap_Main[] = INCBIN_U8("graphics/party_menu/slot_main.bin"); static const u8 sSlotTilemap_MainNoHP[] = INCBIN_U8("graphics/party_menu/slot_main_no_hp.bin"); static const u8 sSlotTilemap_Wide[] = INCBIN_U8("graphics/party_menu/slot_wide.bin"); static const u8 sSlotTilemap_WideNoHP[] = INCBIN_U8("graphics/party_menu/slot_wide_no_hp.bin"); static const u8 sSlotTilemap_WideEmpty[] = INCBIN_U8("graphics/party_menu/slot_wide_empty.bin"); static const u8 sGenderPalOffsets[] = {11, 12}; static const u8 sHPBarPalOffsets[] = {9, 10}; static const u8 sPartyBoxPalOffsets1[] = {4, 5, 6}; static const u8 sPartyBoxPalOffsets2[] = {1, 7, 8}; static const u8 sGenderMalePalIds[] = {59, 60}; static const u8 sGenderFemalePalIds[] = {75, 76}; static const u8 sHPBarGreenPalIds[] = {57, 58}; static const u8 sHPBarYellowPalIds[] = {73, 74}; static const u8 sHPBarRedPalIds[] = {89, 90}; static const u8 sPartyBoxEmptySlotPalIds1[] = {52, 53, 54}; static const u8 sPartyBoxMultiPalIds1[] = {68, 69, 70}; static const u8 sPartyBoxFaintedPalIds1[] = {84, 85, 86}; static const u8 sPartyBoxCurrSelectionPalIds1[] = {116, 117, 118}; static const u8 sPartyBoxCurrSelectionMultiPalIds[] = {132, 133, 134}; static const u8 sPartyBoxCurrSelectionFaintedPalIds[] = {148, 149, 150}; static const u8 sPartyBoxSelectedForActionPalIds1[] = {100, 101, 102}; static const u8 sPartyBoxEmptySlotPalIds2[] = {49, 55, 56}; static const u8 sPartyBoxMultiPalIds2[] = {65, 71, 72}; static const u8 sPartyBoxFaintedPalIds2[] = {81, 87, 88}; static const u8 sPartyBoxCurrSelectionPalIds2[] = {97, 103, 104}; static const u8 sPartyBoxSelectedForActionPalIds2[] = {161, 167, 168}; static const u8 *const sActionStringTable[] = { [PARTY_MSG_CHOOSE_MON] = gText_ChoosePokemon, [PARTY_MSG_CHOOSE_MON_OR_CANCEL] = gText_ChoosePokemonCancel, [PARTY_MSG_CHOOSE_MON_AND_CONFIRM] = gText_ChoosePokemonConfirm, [PARTY_MSG_MOVE_TO_WHERE] = gText_MoveToWhere, [PARTY_MSG_TEACH_WHICH_MON] = gText_TeachWhichPokemon, [PARTY_MSG_USE_ON_WHICH_MON] = gText_UseOnWhichPokemon, [PARTY_MSG_GIVE_TO_WHICH_MON] = gText_GiveToWhichPokemon, [PARTY_MSG_NOTHING_TO_CUT] = gText_NothingToCut, [PARTY_MSG_CANT_SURF_HERE] = gText_CantSurfHere, [PARTY_MSG_ALREADY_SURFING] = gText_AlreadySurfing, [PARTY_MSG_CURRENT_TOO_FAST] = gText_CurrentIsTooFast, [PARTY_MSG_ENJOY_CYCLING] = gText_EnjoyCycling, [PARTY_MSG_ALREADY_IN_USE] = gText_InUseAlready_PM, [PARTY_MSG_CANT_USE_HERE] = gText_CantUseHere, [PARTY_MSG_NO_MON_FOR_BATTLE] = gText_NoPokemonForBattle, [PARTY_MSG_CHOOSE_MON_2] = gText_ChoosePokemon2, [PARTY_MSG_NOT_ENOUGH_HP] = gText_NotEnoughHp, [PARTY_MSG_THREE_MONS_ARE_NEEDED] = gText_ThreePkmnAreNeeded, [PARTY_MSG_TWO_MONS_ARE_NEEDED] = gText_TwoPokemonAreNeeded, [PARTY_MSG_MONS_CANT_BE_SAME] = gText_PokemonCantBeSame, [PARTY_MSG_NO_SAME_HOLD_ITEMS] = gText_NoIdenticalHoldItems, [PARTY_MSG_UNUSED] = gString_Dummy, [PARTY_MSG_DO_WHAT_WITH_MON] = gText_DoWhatWithPokemon, [PARTY_MSG_RESTORE_WHICH_MOVE] = gText_RestoreWhichMove, [PARTY_MSG_BOOST_PP_WHICH_MOVE] = gText_BoostPp, [PARTY_MSG_DO_WHAT_WITH_ITEM] = gText_DoWhatWithItem, [PARTY_MSG_DO_WHAT_WITH_MAIL] = gText_DoWhatWithMail, }; static const u8 *const sDescriptionStringTable[] = { [PARTYBOX_DESC_NO_USE] = gText_NoUse, [PARTYBOX_DESC_ABLE_3] = gText_Able, [PARTYBOX_DESC_FIRST] = gText_First_PM, [PARTYBOX_DESC_SECOND] = gText_Second_PM, [PARTYBOX_DESC_THIRD] = gText_Third_PM, [PARTYBOX_DESC_ABLE] = gText_Able2, [PARTYBOX_DESC_NOT_ABLE] = gText_NotAble, [PARTYBOX_DESC_ABLE_2] = gText_Able3, [PARTYBOX_DESC_NOT_ABLE_2] = gText_NotAble2, [PARTYBOX_DESC_LEARNED] = gText_Learned, }; static const u8 *const sFieldMoveDescriptionTable[] = { [FIELD_MOVE_FLASH] = gText_LightUpDarkness, [FIELD_MOVE_CUT] = gText_CutATreeOrGrass, [FIELD_MOVE_FLY] = gText_FlyToAKnownTown, [FIELD_MOVE_STRENGTH] = gText_MoveHeavyBoulders, [FIELD_MOVE_SURF] = gText_TravelOnWater, [FIELD_MOVE_ROCK_SMASH] = gText_ShatterACrackedRock, [FIELD_MOVE_WATERFALL] = gText_ClimbAWaterfall, [FIELD_MOVE_TELEPORT] = gText_ReturnToAHealingSpot, [FIELD_MOVE_DIG] = gText_EscapeFromHere, [FIELD_MOVE_MILK_DRINK] = gText_ShareHp, [FIELD_MOVE_SOFT_BOILED] = gText_ShareHp, [FIELD_MOVE_SWEET_SCENT] = gText_LureWildPokemon, [FIELD_MOVE_DIVE] = gText_DiveUnderwater, }; static const u32 sHeldItemGfx[] = INCBIN_U32("graphics/party_menu/hold_icons.4bpp"); static const u16 sHeldItemPalette[] = INCBIN_U16("graphics/party_menu/hold_icons.gbapal"); static const struct OamData sOamData_HeldItem = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sSpriteAnim_HeldItem[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_HeldMail[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_HeldItem[] = { sSpriteAnim_HeldItem, sSpriteAnim_HeldMail, }; static const struct SpriteSheet sSpriteSheet_HeldItem = { sHeldItemGfx, sizeof(sHeldItemGfx), 0xD750 }; static const struct SpritePalette sSpritePalette_HeldItem = { sHeldItemPalette, 0xD750 }; static const struct SpriteTemplate sSpriteTemplate_HeldItem = { 0xD750, 0xD750, &sOamData_HeldItem, sSpriteAnimTable_HeldItem, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy, }; static const struct OamData sOamData_MenuPokeball = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(32x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sPokeballAnim_Closed[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sPokeballAnim_Open[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_MenuPokeball[] = { sPokeballAnim_Closed, sPokeballAnim_Open, }; static const struct CompressedSpriteSheet sSpriteSheet_MenuPokeball = { gPartyMenuPokeball_Gfx, 0x400, 0x04b0 }; static const struct CompressedSpritePalette sSpritePalette_MenuPokeball = { gPartyMenuPokeball_Pal, 0x04b0 }; // Used for the pokeball sprite on each party slot / Cancel button static const struct SpriteTemplate sSpriteTemplate_MenuPokeball = { .tileTag = 0x04b0, .paletteTag = 0x04b0, .oam = &sOamData_MenuPokeball, .anims = sSpriteAnimTable_MenuPokeball, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct OamData sOamData_MenuPokeballSmall = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sSmallPokeballAnim_Closed[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sSmallPokeballAnim_Open[] = { ANIMCMD_FRAME(4, 0), ANIMCMD_END }; static const union AnimCmd sSmallPokeballAnim_Blank1[] = { ANIMCMD_FRAME(8, 0), ANIMCMD_END }; static const union AnimCmd sSmallPokeballAnim_Blank2[] = { ANIMCMD_FRAME(12, 0), ANIMCMD_END }; static const union AnimCmd sSmallPokeballAnim_Blank3[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END }; static const union AnimCmd sSmallPokeballAnim_Blank4[] = { ANIMCMD_FRAME(20, 0), ANIMCMD_END }; // The blanks below are never used. See SpriteCB_BounceConfirmCancelButton, where they were intended to be used static const union AnimCmd *const sSpriteAnimTable_MenuPokeballSmall[] = { sSmallPokeballAnim_Closed, sSmallPokeballAnim_Open, sSmallPokeballAnim_Blank1, sSmallPokeballAnim_Blank2, sSmallPokeballAnim_Blank3, sSmallPokeballAnim_Blank4, }; static const struct CompressedSpriteSheet sSpriteSheet_MenuPokeballSmall = { gPartyMenuPokeballSmall_Gfx, 0x0300, 0x04b1 }; // Used for the pokeball sprite next to Cancel and Confirm when both are present, otherwise sSpriteTemplate_MenuPokeball is used static const struct SpriteTemplate sSpriteTemplate_MenuPokeballSmall = { .tileTag = 1201, .paletteTag = 1200, .oam = &sOamData_MenuPokeballSmall, .anims = sSpriteAnimTable_MenuPokeballSmall, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct OamData sOamData_StatusCondition = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(32x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sSpriteAnim_StatusPoison[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_StatusParalyzed[] = { ANIMCMD_FRAME(4, 0), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_StatusSleep[] = { ANIMCMD_FRAME(8, 0), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_StatusFrozen[] = { ANIMCMD_FRAME(12, 0), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_StatusBurn[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_StatusPokerus[] = { ANIMCMD_FRAME(20, 0), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_StatusFaint[] = { ANIMCMD_FRAME(24, 0), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Blank[] = { ANIMCMD_FRAME(28, 0), ANIMCMD_END }; static const union AnimCmd *const sSpriteTemplate_StatusCondition[] = { sSpriteAnim_StatusPoison, sSpriteAnim_StatusParalyzed, sSpriteAnim_StatusSleep, sSpriteAnim_StatusFrozen, sSpriteAnim_StatusBurn, sSpriteAnim_StatusPokerus, sSpriteAnim_StatusFaint, sSpriteAnim_Blank, }; static const struct CompressedSpriteSheet sSpriteSheet_StatusIcons = { gStatusGfx_Icons, 0x400, 1202 }; static const struct CompressedSpritePalette sSpritePalette_StatusIcons = { gStatusPal_Icons, 1202 }; static const struct SpriteTemplate sSpriteTemplate_StatusIcons = { .tileTag = 1202, .paletteTag = 1202, .oam = &sOamData_StatusCondition, .anims = sSpriteTemplate_StatusCondition, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const bool8 sMultiBattlePartnersPartyMask[PARTY_SIZE + 2] = { FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, }; enum { CURSOR_OPTION_SUMMARY, CURSOR_OPTION_SWITCH, CURSOR_OPTION_CANCEL1, CURSOR_OPTION_ITEM, CURSOR_OPTION_GIVE, CURSOR_OPTION_TAKE_ITEM, CURSOR_OPTION_MAIL, CURSOR_OPTION_TAKE_MAIL, CURSOR_OPTION_READ, CURSOR_OPTION_CANCEL2, CURSOR_OPTION_SHIFT, CURSOR_OPTION_SEND_OUT, CURSOR_OPTION_ENTER, CURSOR_OPTION_NO_ENTRY, CURSOR_OPTION_STORE, CURSOR_OPTION_REGISTER, CURSOR_OPTION_TRADE1, CURSOR_OPTION_TRADE2, CURSOR_OPTION_FIELD_MOVES, }; static struct { const u8 *text; TaskFunc func; } const sCursorOptions[] = { [CURSOR_OPTION_SUMMARY] = {gText_Summary5, CursorCB_Summary }, [CURSOR_OPTION_SWITCH] = {gText_Switch2, CursorCB_Switch }, [CURSOR_OPTION_CANCEL1] = {gFameCheckerText_Cancel, CursorCB_Cancel1 }, [CURSOR_OPTION_ITEM] = {gText_Item, CursorCB_Item }, [CURSOR_OPTION_GIVE] = {gOtherText_Give, CursorCB_Give }, [CURSOR_OPTION_TAKE_ITEM] = {gText_Take, CursorCB_TakeItem }, [CURSOR_OPTION_MAIL] = {gText_Mail, CursorCB_Mail }, [CURSOR_OPTION_TAKE_MAIL] = {gText_Take2, CursorCB_TakeMail }, [CURSOR_OPTION_READ] = {gText_Read2, CursorCB_Read }, [CURSOR_OPTION_CANCEL2] = {gFameCheckerText_Cancel, CursorCB_Cancel2 }, [CURSOR_OPTION_SHIFT] = {gText_Shift, CursorCB_SendMon }, [CURSOR_OPTION_SEND_OUT] = {gText_SendOut, CursorCB_SendMon }, [CURSOR_OPTION_ENTER] = {gText_Enter, CursorCB_Enter }, [CURSOR_OPTION_NO_ENTRY] = {gText_NoEntry, CursorCB_NoEntry }, [CURSOR_OPTION_STORE] = {gText_Store, CursorCB_Store }, [CURSOR_OPTION_REGISTER] = {gText_Register, CursorCB_Register }, [CURSOR_OPTION_TRADE1] = {gText_Trade4, CursorCB_Trade1 }, [CURSOR_OPTION_TRADE2] = {gText_Trade4, CursorCB_Trade2 }, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_FLASH] = {gMoveNames[MOVE_FLASH], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_CUT] = {gMoveNames[MOVE_CUT], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_FLY] = {gMoveNames[MOVE_FLY], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_STRENGTH] = {gMoveNames[MOVE_STRENGTH], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_SURF] = {gMoveNames[MOVE_SURF], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_ROCK_SMASH] = {gMoveNames[MOVE_ROCK_SMASH], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_WATERFALL] = {gMoveNames[MOVE_WATERFALL], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_TELEPORT] = {gMoveNames[MOVE_TELEPORT], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_DIG] = {gMoveNames[MOVE_DIG], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_MILK_DRINK] = {gMoveNames[MOVE_MILK_DRINK], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_SOFT_BOILED] = {gMoveNames[MOVE_SOFT_BOILED], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_SWEET_SCENT] = {gMoveNames[MOVE_SWEET_SCENT], CursorCB_FieldMove}, [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_DIVE] = {gMoveNames[MOVE_DIVE], CursorCB_FieldMove}, }; static const u8 sPartyMenuAction_SummarySwitchCancel[] = {CURSOR_OPTION_SUMMARY, CURSOR_OPTION_SWITCH, CURSOR_OPTION_CANCEL1}; static const u8 sPartyMenuAction_ShiftSummaryCancel[] = {CURSOR_OPTION_SHIFT, CURSOR_OPTION_SUMMARY, CURSOR_OPTION_CANCEL1}; static const u8 sPartyMenuAction_SendOutSummaryCancel[] = {CURSOR_OPTION_SEND_OUT, CURSOR_OPTION_SUMMARY, CURSOR_OPTION_CANCEL1}; static const u8 sPartyMenuAction_SummaryCancel[] = {CURSOR_OPTION_SUMMARY, CURSOR_OPTION_CANCEL1}; static const u8 sPartyMenuAction_EnterSummaryCancel[] = {CURSOR_OPTION_ENTER, CURSOR_OPTION_SUMMARY, CURSOR_OPTION_CANCEL1}; static const u8 sPartyMenuAction_NoEntrySummaryCancel[] = {CURSOR_OPTION_NO_ENTRY, CURSOR_OPTION_SUMMARY, CURSOR_OPTION_CANCEL1}; static const u8 sPartyMenuAction_StoreSummaryCancel[] = {CURSOR_OPTION_STORE, CURSOR_OPTION_SUMMARY, CURSOR_OPTION_CANCEL1}; static const u8 sPartyMenuAction_GiveTakeItemCancel[] = {CURSOR_OPTION_GIVE, CURSOR_OPTION_TAKE_ITEM, CURSOR_OPTION_CANCEL2}; static const u8 sPartyMenuAction_ReadTakeMailCancel[] = {CURSOR_OPTION_READ, CURSOR_OPTION_TAKE_MAIL, CURSOR_OPTION_CANCEL2}; static const u8 sPartyMenuAction_RegisterSummaryCancel[] = {CURSOR_OPTION_REGISTER, CURSOR_OPTION_SUMMARY, CURSOR_OPTION_CANCEL1}; static const u8 sPartyMenuAction_TradeSummaryCancel1[] = {CURSOR_OPTION_TRADE1, CURSOR_OPTION_SUMMARY, CURSOR_OPTION_CANCEL1}; static const u8 sPartyMenuAction_TradeSummaryCancel2[] = {CURSOR_OPTION_TRADE2, CURSOR_OPTION_SUMMARY, CURSOR_OPTION_CANCEL1}; // IDs for the action lists that appear when a party mon is selected enum { ACTIONS_NONE, ACTIONS_SWITCH, ACTIONS_SHIFT, ACTIONS_SEND_OUT, ACTIONS_ENTER, ACTIONS_NO_ENTRY, ACTIONS_STORE, ACTIONS_SUMMARY_ONLY, ACTIONS_ITEM, ACTIONS_MAIL, ACTIONS_REGISTER, ACTIONS_TRADE, ACTIONS_SPIN_TRADE, }; static const u8 *const sPartyMenuActions[] = { [ACTIONS_NONE] = NULL, [ACTIONS_SWITCH] = sPartyMenuAction_SummarySwitchCancel, [ACTIONS_SHIFT] = sPartyMenuAction_ShiftSummaryCancel, [ACTIONS_SEND_OUT] = sPartyMenuAction_SendOutSummaryCancel, [ACTIONS_ENTER] = sPartyMenuAction_EnterSummaryCancel, [ACTIONS_NO_ENTRY] = sPartyMenuAction_NoEntrySummaryCancel, [ACTIONS_STORE] = sPartyMenuAction_StoreSummaryCancel, [ACTIONS_SUMMARY_ONLY] = sPartyMenuAction_SummaryCancel, [ACTIONS_ITEM] = sPartyMenuAction_GiveTakeItemCancel, [ACTIONS_MAIL] = sPartyMenuAction_ReadTakeMailCancel, [ACTIONS_REGISTER] = sPartyMenuAction_RegisterSummaryCancel, [ACTIONS_TRADE] = sPartyMenuAction_TradeSummaryCancel1, [ACTIONS_SPIN_TRADE] = sPartyMenuAction_TradeSummaryCancel2, }; static const u8 sPartyMenuActionCounts[] = { [ACTIONS_NONE] = 0, [ACTIONS_SWITCH] = NELEMS(sPartyMenuAction_SummarySwitchCancel), [ACTIONS_SHIFT] = NELEMS(sPartyMenuAction_ShiftSummaryCancel), [ACTIONS_SEND_OUT] = NELEMS(sPartyMenuAction_SendOutSummaryCancel), [ACTIONS_ENTER] = NELEMS(sPartyMenuAction_EnterSummaryCancel), [ACTIONS_NO_ENTRY] = NELEMS(sPartyMenuAction_NoEntrySummaryCancel), [ACTIONS_STORE] = NELEMS(sPartyMenuAction_StoreSummaryCancel), [ACTIONS_SUMMARY_ONLY] = NELEMS(sPartyMenuAction_SummaryCancel), [ACTIONS_ITEM] = NELEMS(sPartyMenuAction_GiveTakeItemCancel), [ACTIONS_MAIL] = NELEMS(sPartyMenuAction_ReadTakeMailCancel), [ACTIONS_REGISTER] = NELEMS(sPartyMenuAction_RegisterSummaryCancel), [ACTIONS_TRADE] = NELEMS(sPartyMenuAction_TradeSummaryCancel1), [ACTIONS_SPIN_TRADE] = NELEMS(sPartyMenuAction_TradeSummaryCancel2), }; static const u16 sFieldMoves[] = { MOVE_FLASH, MOVE_CUT, MOVE_FLY, MOVE_STRENGTH, MOVE_SURF, MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_TELEPORT, MOVE_DIG, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, MOVE_DIVE, FIELD_MOVE_END // this may be misuse of enum. same in emerald }; static struct { bool8 (*fieldMoveFunc)(void); u8 msgId; } const sFieldMoveCursorCallbacks[] = { [FIELD_MOVE_FLASH] = {SetUpFieldMove_Flash, PARTY_MSG_CANT_USE_HERE}, [FIELD_MOVE_CUT] = {SetUpFieldMove_Cut, PARTY_MSG_NOTHING_TO_CUT}, [FIELD_MOVE_FLY] = {SetUpFieldMove_Fly, PARTY_MSG_CANT_USE_HERE}, [FIELD_MOVE_STRENGTH] = {SetUpFieldMove_Strength, PARTY_MSG_CANT_USE_HERE}, [FIELD_MOVE_SURF] = {SetUpFieldMove_Surf, PARTY_MSG_CANT_SURF_HERE}, [FIELD_MOVE_ROCK_SMASH] = {SetUpFieldMove_RockSmash, PARTY_MSG_CANT_USE_HERE}, [FIELD_MOVE_WATERFALL] = {SetUpFieldMove_Waterfall, PARTY_MSG_CANT_USE_HERE}, [FIELD_MOVE_TELEPORT] = {SetUpFieldMove_Teleport, PARTY_MSG_CANT_USE_HERE}, [FIELD_MOVE_DIG] = {SetUpFieldMove_Dig, PARTY_MSG_CANT_USE_HERE}, [FIELD_MOVE_MILK_DRINK] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, [FIELD_MOVE_SOFT_BOILED] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, [FIELD_MOVE_SWEET_SCENT] = {SetUpFieldMove_SweetScent, PARTY_MSG_CANT_USE_HERE}, [FIELD_MOVE_DIVE] = {SetUpFieldMove_Dive, PARTY_MSG_CANT_USE_HERE}, }; static const u8 *const sUnionRoomTradeMessages[] = { [UR_TRADE_MSG_NOT_MON_PARTNER_WANTS - 1] = gText_NotPkmnOtherTrainerWants, [UR_TRADE_MSG_NOT_EGG - 1] = gText_ThatIsntAnEgg, [UR_TRADE_MSG_MON_CANT_BE_TRADED_1 - 1] = gText_PkmnCantBeTradedNow, [UR_TRADE_MSG_MON_CANT_BE_TRADED_2 - 1] = gText_PkmnCantBeTradedNow, [UR_TRADE_MSG_PARTNERS_MON_CANT_BE_TRADED - 1] = gText_OtherTrainersPkmnCantBeTraded, [UR_TRADE_MSG_EGG_CANT_BE_TRADED -1] = gText_EggCantBeTradedNow, [UR_TRADE_MSG_PARTNER_CANT_ACCEPT_MON - 1] = gText_OtherTrainerCantAcceptPkmn, [UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_1 - 1] = gText_CantTradeWithTrainer, [UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2 - 1] = gText_CantTradeWithTrainer, }; const u16 sTMHMMoves[TMHM_COUNT] = { MOVE_FOCUS_PUNCH, MOVE_DRAGON_CLAW, MOVE_WATER_PULSE, MOVE_CALM_MIND, MOVE_ROAR, MOVE_TOXIC, MOVE_HAIL, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_HIDDEN_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_ICE_BEAM, MOVE_BLIZZARD, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_GIGA_DRAIN, MOVE_SAFEGUARD, MOVE_FRUSTRATION, MOVE_SOLAR_BEAM, MOVE_IRON_TAIL, MOVE_THUNDERBOLT, MOVE_THUNDER, MOVE_EARTHQUAKE, MOVE_RETURN, MOVE_DIG, MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_BRICK_BREAK, MOVE_DOUBLE_TEAM, MOVE_REFLECT, MOVE_SHOCK_WAVE, MOVE_FLAMETHROWER, MOVE_SLUDGE_BOMB, MOVE_SANDSTORM, MOVE_FIRE_BLAST, MOVE_ROCK_TOMB, MOVE_AERIAL_ACE, MOVE_TORMENT, MOVE_FACADE, MOVE_SECRET_POWER, MOVE_REST, MOVE_ATTRACT, MOVE_THIEF, MOVE_STEEL_WING, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_OVERHEAT, MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, }; ================================================ FILE: src/data/pokemon/cry_ids.h ================================================ #define HOENN_MON_SPECIES_START 277 static const u16 sHoennSpeciesIdToCryId[] = { [SPECIES_TREECKO - HOENN_MON_SPECIES_START] = CRY_TREECKO, [SPECIES_GROVYLE - HOENN_MON_SPECIES_START] = CRY_GROVYLE, [SPECIES_SCEPTILE - HOENN_MON_SPECIES_START] = CRY_SCEPTILE, [SPECIES_TORCHIC - HOENN_MON_SPECIES_START] = CRY_TORCHIC, [SPECIES_COMBUSKEN - HOENN_MON_SPECIES_START] = CRY_COMBUSKEN, [SPECIES_BLAZIKEN - HOENN_MON_SPECIES_START] = CRY_BLAZIKEN, [SPECIES_MUDKIP - HOENN_MON_SPECIES_START] = CRY_MUDKIP, [SPECIES_MARSHTOMP - HOENN_MON_SPECIES_START] = CRY_MARSHTOMP, [SPECIES_SWAMPERT - HOENN_MON_SPECIES_START] = CRY_SWAMPERT, [SPECIES_POOCHYENA - HOENN_MON_SPECIES_START] = CRY_POOCHYENA, [SPECIES_MIGHTYENA - HOENN_MON_SPECIES_START] = CRY_MIGHTYENA, [SPECIES_ZIGZAGOON - HOENN_MON_SPECIES_START] = CRY_ZIGZAGOON, [SPECIES_LINOONE - HOENN_MON_SPECIES_START] = CRY_LINOONE, [SPECIES_WURMPLE - HOENN_MON_SPECIES_START] = CRY_WURMPLE, [SPECIES_SILCOON - HOENN_MON_SPECIES_START] = CRY_SILCOON, [SPECIES_BEAUTIFLY - HOENN_MON_SPECIES_START] = CRY_BEAUTIFLY, [SPECIES_CASCOON - HOENN_MON_SPECIES_START] = CRY_CASCOON, [SPECIES_DUSTOX - HOENN_MON_SPECIES_START] = CRY_DUSTOX, [SPECIES_LOTAD - HOENN_MON_SPECIES_START] = CRY_LOTAD, [SPECIES_LOMBRE - HOENN_MON_SPECIES_START] = CRY_LOMBRE, [SPECIES_LUDICOLO - HOENN_MON_SPECIES_START] = CRY_LUDICOLO, [SPECIES_SEEDOT - HOENN_MON_SPECIES_START] = CRY_SEEDOT, [SPECIES_NUZLEAF - HOENN_MON_SPECIES_START] = CRY_NUZLEAF, [SPECIES_SHIFTRY - HOENN_MON_SPECIES_START] = CRY_SHIFTRY, [SPECIES_NINCADA - HOENN_MON_SPECIES_START] = CRY_NINCADA, [SPECIES_NINJASK - HOENN_MON_SPECIES_START] = CRY_NINJASK, [SPECIES_SHEDINJA - HOENN_MON_SPECIES_START] = CRY_SHEDINJA, [SPECIES_TAILLOW - HOENN_MON_SPECIES_START] = CRY_TAILLOW, [SPECIES_SWELLOW - HOENN_MON_SPECIES_START] = CRY_SWELLOW, [SPECIES_SHROOMISH - HOENN_MON_SPECIES_START] = CRY_SHROOMISH, [SPECIES_BRELOOM - HOENN_MON_SPECIES_START] = CRY_BRELOOM, [SPECIES_SPINDA - HOENN_MON_SPECIES_START] = CRY_SPINDA, [SPECIES_WINGULL - HOENN_MON_SPECIES_START] = CRY_WINGULL, [SPECIES_PELIPPER - HOENN_MON_SPECIES_START] = CRY_PELIPPER, [SPECIES_SURSKIT - HOENN_MON_SPECIES_START] = CRY_SURSKIT, [SPECIES_MASQUERAIN - HOENN_MON_SPECIES_START] = CRY_MASQUERAIN, [SPECIES_WAILMER - HOENN_MON_SPECIES_START] = CRY_WAILMER, [SPECIES_WAILORD - HOENN_MON_SPECIES_START] = CRY_WAILORD, [SPECIES_SKITTY - HOENN_MON_SPECIES_START] = CRY_SKITTY, [SPECIES_DELCATTY - HOENN_MON_SPECIES_START] = CRY_DELCATTY, [SPECIES_KECLEON - HOENN_MON_SPECIES_START] = CRY_KECLEON, [SPECIES_BALTOY - HOENN_MON_SPECIES_START] = CRY_BALTOY, [SPECIES_CLAYDOL - HOENN_MON_SPECIES_START] = CRY_CLAYDOL, [SPECIES_NOSEPASS - HOENN_MON_SPECIES_START] = CRY_NOSEPASS, [SPECIES_TORKOAL - HOENN_MON_SPECIES_START] = CRY_TORKOAL, [SPECIES_SABLEYE - HOENN_MON_SPECIES_START] = CRY_SABLEYE, [SPECIES_BARBOACH - HOENN_MON_SPECIES_START] = CRY_BARBOACH, [SPECIES_WHISCASH - HOENN_MON_SPECIES_START] = CRY_WHISCASH, [SPECIES_LUVDISC - HOENN_MON_SPECIES_START] = CRY_LUVDISC, [SPECIES_CORPHISH - HOENN_MON_SPECIES_START] = CRY_CORPHISH, [SPECIES_CRAWDAUNT - HOENN_MON_SPECIES_START] = CRY_CRAWDAUNT, [SPECIES_FEEBAS - HOENN_MON_SPECIES_START] = CRY_FEEBAS, [SPECIES_MILOTIC - HOENN_MON_SPECIES_START] = CRY_MILOTIC, [SPECIES_CARVANHA - HOENN_MON_SPECIES_START] = CRY_CARVANHA, [SPECIES_SHARPEDO - HOENN_MON_SPECIES_START] = CRY_SHARPEDO, [SPECIES_TRAPINCH - HOENN_MON_SPECIES_START] = CRY_TRAPINCH, [SPECIES_VIBRAVA - HOENN_MON_SPECIES_START] = CRY_VIBRAVA, [SPECIES_FLYGON - HOENN_MON_SPECIES_START] = CRY_FLYGON, [SPECIES_MAKUHITA - HOENN_MON_SPECIES_START] = CRY_MAKUHITA, [SPECIES_HARIYAMA - HOENN_MON_SPECIES_START] = CRY_HARIYAMA, [SPECIES_ELECTRIKE - HOENN_MON_SPECIES_START] = CRY_ELECTRIKE, [SPECIES_MANECTRIC - HOENN_MON_SPECIES_START] = CRY_MANECTRIC, [SPECIES_NUMEL - HOENN_MON_SPECIES_START] = CRY_NUMEL, [SPECIES_CAMERUPT - HOENN_MON_SPECIES_START] = CRY_CAMERUPT, [SPECIES_SPHEAL - HOENN_MON_SPECIES_START] = CRY_SPHEAL, [SPECIES_SEALEO - HOENN_MON_SPECIES_START] = CRY_SEALEO, [SPECIES_WALREIN - HOENN_MON_SPECIES_START] = CRY_WALREIN, [SPECIES_CACNEA - HOENN_MON_SPECIES_START] = CRY_CACNEA, [SPECIES_CACTURNE - HOENN_MON_SPECIES_START] = CRY_CACTURNE, [SPECIES_SNORUNT - HOENN_MON_SPECIES_START] = CRY_SNORUNT, [SPECIES_GLALIE - HOENN_MON_SPECIES_START] = CRY_GLALIE, [SPECIES_LUNATONE - HOENN_MON_SPECIES_START] = CRY_LUNATONE, [SPECIES_SOLROCK - HOENN_MON_SPECIES_START] = CRY_SOLROCK, [SPECIES_AZURILL - HOENN_MON_SPECIES_START] = CRY_AZURILL, [SPECIES_SPOINK - HOENN_MON_SPECIES_START] = CRY_SPOINK, [SPECIES_GRUMPIG - HOENN_MON_SPECIES_START] = CRY_GRUMPIG, [SPECIES_PLUSLE - HOENN_MON_SPECIES_START] = CRY_PLUSLE, [SPECIES_MINUN - HOENN_MON_SPECIES_START] = CRY_MINUN, [SPECIES_MAWILE - HOENN_MON_SPECIES_START] = CRY_MAWILE, [SPECIES_MEDITITE - HOENN_MON_SPECIES_START] = CRY_MEDITITE, [SPECIES_MEDICHAM - HOENN_MON_SPECIES_START] = CRY_MEDICHAM, [SPECIES_SWABLU - HOENN_MON_SPECIES_START] = CRY_SWABLU, [SPECIES_ALTARIA - HOENN_MON_SPECIES_START] = CRY_ALTARIA, [SPECIES_WYNAUT - HOENN_MON_SPECIES_START] = CRY_WYNAUT, [SPECIES_DUSKULL - HOENN_MON_SPECIES_START] = CRY_DUSKULL, [SPECIES_DUSCLOPS - HOENN_MON_SPECIES_START] = CRY_DUSCLOPS, [SPECIES_ROSELIA - HOENN_MON_SPECIES_START] = CRY_ROSELIA, [SPECIES_SLAKOTH - HOENN_MON_SPECIES_START] = CRY_SLAKOTH, [SPECIES_VIGOROTH - HOENN_MON_SPECIES_START] = CRY_VIGOROTH, [SPECIES_SLAKING - HOENN_MON_SPECIES_START] = CRY_SLAKING, [SPECIES_GULPIN - HOENN_MON_SPECIES_START] = CRY_GULPIN, [SPECIES_SWALOT - HOENN_MON_SPECIES_START] = CRY_SWALOT, [SPECIES_TROPIUS - HOENN_MON_SPECIES_START] = CRY_TROPIUS, [SPECIES_WHISMUR - HOENN_MON_SPECIES_START] = CRY_WHISMUR, [SPECIES_LOUDRED - HOENN_MON_SPECIES_START] = CRY_LOUDRED, [SPECIES_EXPLOUD - HOENN_MON_SPECIES_START] = CRY_EXPLOUD, [SPECIES_CLAMPERL - HOENN_MON_SPECIES_START] = CRY_CLAMPERL, [SPECIES_HUNTAIL - HOENN_MON_SPECIES_START] = CRY_HUNTAIL, [SPECIES_GOREBYSS - HOENN_MON_SPECIES_START] = CRY_GOREBYSS, [SPECIES_ABSOL - HOENN_MON_SPECIES_START] = CRY_ABSOL, [SPECIES_SHUPPET - HOENN_MON_SPECIES_START] = CRY_SHUPPET, [SPECIES_BANETTE - HOENN_MON_SPECIES_START] = CRY_BANETTE, [SPECIES_SEVIPER - HOENN_MON_SPECIES_START] = CRY_SEVIPER, [SPECIES_ZANGOOSE - HOENN_MON_SPECIES_START] = CRY_ZANGOOSE, [SPECIES_RELICANTH - HOENN_MON_SPECIES_START] = CRY_RELICANTH, [SPECIES_ARON - HOENN_MON_SPECIES_START] = CRY_ARON, [SPECIES_LAIRON - HOENN_MON_SPECIES_START] = CRY_LAIRON, [SPECIES_AGGRON - HOENN_MON_SPECIES_START] = CRY_AGGRON, [SPECIES_CASTFORM - HOENN_MON_SPECIES_START] = CRY_CASTFORM, [SPECIES_VOLBEAT - HOENN_MON_SPECIES_START] = CRY_VOLBEAT, [SPECIES_ILLUMISE - HOENN_MON_SPECIES_START] = CRY_ILLUMISE, [SPECIES_LILEEP - HOENN_MON_SPECIES_START] = CRY_LILEEP, [SPECIES_CRADILY - HOENN_MON_SPECIES_START] = CRY_CRADILY, [SPECIES_ANORITH - HOENN_MON_SPECIES_START] = CRY_ANORITH, [SPECIES_ARMALDO - HOENN_MON_SPECIES_START] = CRY_ARMALDO, [SPECIES_RALTS - HOENN_MON_SPECIES_START] = CRY_RALTS, [SPECIES_KIRLIA - HOENN_MON_SPECIES_START] = CRY_KIRLIA, [SPECIES_GARDEVOIR - HOENN_MON_SPECIES_START] = CRY_GARDEVOIR, [SPECIES_BAGON - HOENN_MON_SPECIES_START] = CRY_BAGON, [SPECIES_SHELGON - HOENN_MON_SPECIES_START] = CRY_SHELGON, [SPECIES_SALAMENCE - HOENN_MON_SPECIES_START] = CRY_SALAMENCE, [SPECIES_BELDUM - HOENN_MON_SPECIES_START] = CRY_BELDUM, [SPECIES_METANG - HOENN_MON_SPECIES_START] = CRY_METANG, [SPECIES_METAGROSS - HOENN_MON_SPECIES_START] = CRY_METAGROSS, [SPECIES_REGIROCK - HOENN_MON_SPECIES_START] = CRY_REGIROCK, [SPECIES_REGICE - HOENN_MON_SPECIES_START] = CRY_REGICE, [SPECIES_REGISTEEL - HOENN_MON_SPECIES_START] = CRY_REGISTEEL, [SPECIES_KYOGRE - HOENN_MON_SPECIES_START] = CRY_KYOGRE, [SPECIES_GROUDON - HOENN_MON_SPECIES_START] = CRY_GROUDON, [SPECIES_RAYQUAZA - HOENN_MON_SPECIES_START] = CRY_RAYQUAZA, [SPECIES_LATIAS - HOENN_MON_SPECIES_START] = CRY_LATIAS, [SPECIES_LATIOS - HOENN_MON_SPECIES_START] = CRY_LATIOS, [SPECIES_JIRACHI - HOENN_MON_SPECIES_START] = CRY_JIRACHI, [SPECIES_DEOXYS - HOENN_MON_SPECIES_START] = CRY_DEOXYS, [SPECIES_CHIMECHO - HOENN_MON_SPECIES_START] = CRY_CHIMECHO, }; ================================================ FILE: src/data/pokemon/egg_moves.h ================================================ #define EGG_MOVES_SPECIES_OFFSET 20000 #define EGG_MOVES_TERMINATOR 0xFFFF #define egg_moves(species, moves...) (SPECIES_##species + EGG_MOVES_SPECIES_OFFSET), moves const u16 gEggMoves[] = { egg_moves(BULBASAUR, MOVE_LIGHT_SCREEN, MOVE_SKULL_BASH, MOVE_SAFEGUARD, MOVE_CHARM, MOVE_PETAL_DANCE, MOVE_MAGICAL_LEAF, MOVE_GRASS_WHISTLE, MOVE_CURSE), egg_moves(CHARMANDER, MOVE_BELLY_DRUM, MOVE_ANCIENT_POWER, MOVE_ROCK_SLIDE, MOVE_BITE, MOVE_OUTRAGE, MOVE_BEAT_UP, MOVE_SWORDS_DANCE, MOVE_DRAGON_DANCE), egg_moves(SQUIRTLE, MOVE_MIRROR_COAT, MOVE_HAZE, MOVE_MIST, MOVE_FORESIGHT, MOVE_FLAIL, MOVE_REFRESH, MOVE_MUD_SPORT, MOVE_YAWN), egg_moves(PIDGEY, MOVE_PURSUIT, MOVE_FAINT_ATTACK, MOVE_FORESIGHT, MOVE_STEEL_WING, MOVE_AIR_CUTTER), egg_moves(RATTATA, MOVE_SCREECH, MOVE_FLAME_WHEEL, MOVE_FURY_SWIPES, MOVE_BITE, MOVE_COUNTER, MOVE_REVERSAL, MOVE_UPROAR, MOVE_SWAGGER), egg_moves(SPEAROW, MOVE_FAINT_ATTACK, MOVE_FALSE_SWIPE, MOVE_SCARY_FACE, MOVE_QUICK_ATTACK, MOVE_TRI_ATTACK, MOVE_ASTONISH, MOVE_SKY_ATTACK), egg_moves(EKANS, MOVE_PURSUIT, MOVE_SLAM, MOVE_SPITE, MOVE_BEAT_UP, MOVE_POISON_FANG), egg_moves(SANDSHREW, MOVE_FLAIL, MOVE_SAFEGUARD, MOVE_COUNTER, MOVE_RAPID_SPIN, MOVE_ROCK_SLIDE, MOVE_METAL_CLAW, MOVE_SWORDS_DANCE, MOVE_CRUSH_CLAW), egg_moves(NIDORAN_F, MOVE_SUPERSONIC, MOVE_DISABLE, MOVE_TAKE_DOWN, MOVE_FOCUS_ENERGY, MOVE_CHARM, MOVE_COUNTER, MOVE_BEAT_UP), egg_moves(NIDORAN_M, MOVE_COUNTER, MOVE_DISABLE, MOVE_SUPERSONIC, MOVE_TAKE_DOWN, MOVE_AMNESIA, MOVE_CONFUSION, MOVE_BEAT_UP), egg_moves(VULPIX, MOVE_FAINT_ATTACK, MOVE_HYPNOSIS, MOVE_FLAIL, MOVE_SPITE, MOVE_DISABLE, MOVE_HOWL, MOVE_PSYCH_UP, MOVE_HEAT_WAVE), egg_moves(ZUBAT, MOVE_QUICK_ATTACK, MOVE_PURSUIT, MOVE_FAINT_ATTACK, MOVE_GUST, MOVE_WHIRLWIND, MOVE_CURSE), egg_moves(ODDISH, MOVE_SWORDS_DANCE, MOVE_RAZOR_LEAF, MOVE_FLAIL, MOVE_SYNTHESIS, MOVE_CHARM, MOVE_INGRAIN), egg_moves(PARAS, MOVE_FALSE_SWIPE, MOVE_SCREECH, MOVE_COUNTER, MOVE_PSYBEAM, MOVE_FLAIL, MOVE_SWEET_SCENT, MOVE_LIGHT_SCREEN, MOVE_PURSUIT), egg_moves(VENONAT, MOVE_BATON_PASS, MOVE_SCREECH, MOVE_GIGA_DRAIN, MOVE_SIGNAL_BEAM), egg_moves(DIGLETT, MOVE_FAINT_ATTACK, MOVE_SCREECH, MOVE_ANCIENT_POWER, MOVE_PURSUIT, MOVE_BEAT_UP, MOVE_UPROAR, MOVE_ROCK_SLIDE), egg_moves(MEOWTH, MOVE_SPITE, MOVE_CHARM, MOVE_HYPNOSIS, MOVE_AMNESIA, MOVE_PSYCH_UP, MOVE_ASSIST), egg_moves(PSYDUCK, MOVE_HYPNOSIS, MOVE_PSYBEAM, MOVE_FORESIGHT, MOVE_LIGHT_SCREEN, MOVE_FUTURE_SIGHT, MOVE_PSYCHIC, MOVE_CROSS_CHOP, MOVE_REFRESH), egg_moves(MANKEY, MOVE_ROCK_SLIDE, MOVE_FORESIGHT, MOVE_MEDITATE, MOVE_COUNTER, MOVE_REVERSAL, MOVE_BEAT_UP, MOVE_REVENGE, MOVE_SMELLING_SALT), egg_moves(GROWLITHE, MOVE_BODY_SLAM, MOVE_SAFEGUARD, MOVE_CRUNCH, MOVE_THRASH, MOVE_FIRE_SPIN, MOVE_HOWL, MOVE_HEAT_WAVE), egg_moves(POLIWAG, MOVE_MIST, MOVE_SPLASH, MOVE_BUBBLE_BEAM, MOVE_HAZE, MOVE_MIND_READER, MOVE_WATER_SPORT, MOVE_ICE_BALL), egg_moves(ABRA, MOVE_ENCORE, MOVE_BARRIER, MOVE_KNOCK_OFF, MOVE_FIRE_PUNCH, MOVE_THUNDER_PUNCH, MOVE_ICE_PUNCH), egg_moves(MACHOP, MOVE_LIGHT_SCREEN, MOVE_MEDITATE, MOVE_ROLLING_KICK, MOVE_ENCORE, MOVE_SMELLING_SALT, MOVE_COUNTER, MOVE_ROCK_SLIDE), egg_moves(BELLSPROUT, MOVE_SWORDS_DANCE, MOVE_ENCORE, MOVE_REFLECT, MOVE_SYNTHESIS, MOVE_LEECH_LIFE, MOVE_INGRAIN, MOVE_MAGICAL_LEAF), egg_moves(TENTACOOL, MOVE_AURORA_BEAM, MOVE_MIRROR_COAT, MOVE_RAPID_SPIN, MOVE_HAZE, MOVE_SAFEGUARD, MOVE_CONFUSE_RAY), egg_moves(GEODUDE, MOVE_MEGA_PUNCH, MOVE_ROCK_SLIDE, MOVE_BLOCK), egg_moves(PONYTA, MOVE_FLAME_WHEEL, MOVE_THRASH, MOVE_DOUBLE_KICK, MOVE_HYPNOSIS, MOVE_CHARM, MOVE_DOUBLE_EDGE), egg_moves(SLOWPOKE, MOVE_SAFEGUARD, MOVE_BELLY_DRUM, MOVE_FUTURE_SIGHT, MOVE_STOMP, MOVE_MUD_SPORT, MOVE_SLEEP_TALK, MOVE_SNORE), egg_moves(FARFETCHD, MOVE_STEEL_WING, MOVE_FORESIGHT, MOVE_MIRROR_MOVE, MOVE_GUST, MOVE_QUICK_ATTACK, MOVE_FLAIL, MOVE_FEATHER_DANCE, MOVE_CURSE), egg_moves(DODUO, MOVE_QUICK_ATTACK, MOVE_SUPERSONIC, MOVE_HAZE, MOVE_FAINT_ATTACK, MOVE_FLAIL, MOVE_ENDEAVOR), egg_moves(SEEL, MOVE_LICK, MOVE_PERISH_SONG, MOVE_DISABLE, MOVE_HORN_DRILL, MOVE_SLAM, MOVE_ENCORE, MOVE_FAKE_OUT, MOVE_ICICLE_SPEAR), egg_moves(GRIMER, MOVE_HAZE, MOVE_MEAN_LOOK, MOVE_LICK, MOVE_IMPRISON, MOVE_CURSE, MOVE_SHADOW_PUNCH, MOVE_EXPLOSION), egg_moves(SHELLDER, MOVE_BUBBLE_BEAM, MOVE_TAKE_DOWN, MOVE_BARRIER, MOVE_RAPID_SPIN, MOVE_SCREECH, MOVE_ICICLE_SPEAR), egg_moves(GASTLY, MOVE_PSYWAVE, MOVE_PERISH_SONG, MOVE_HAZE, MOVE_ASTONISH, MOVE_WILL_O_WISP, MOVE_GRUDGE, MOVE_EXPLOSION), egg_moves(ONIX, MOVE_ROCK_SLIDE, MOVE_FLAIL, MOVE_EXPLOSION, MOVE_BLOCK), egg_moves(DROWZEE, MOVE_BARRIER, MOVE_ASSIST, MOVE_ROLE_PLAY, MOVE_FIRE_PUNCH, MOVE_THUNDER_PUNCH, MOVE_ICE_PUNCH), egg_moves(KRABBY, MOVE_DIG, MOVE_HAZE, MOVE_AMNESIA, MOVE_FLAIL, MOVE_SLAM, MOVE_KNOCK_OFF, MOVE_SWORDS_DANCE), egg_moves(EXEGGCUTE, MOVE_SYNTHESIS, MOVE_MOONLIGHT, MOVE_REFLECT, MOVE_ANCIENT_POWER, MOVE_PSYCH_UP, MOVE_INGRAIN, MOVE_CURSE), egg_moves(CUBONE, MOVE_ROCK_SLIDE, MOVE_ANCIENT_POWER, MOVE_BELLY_DRUM, MOVE_SCREECH, MOVE_SKULL_BASH, MOVE_PERISH_SONG, MOVE_SWORDS_DANCE), egg_moves(LICKITUNG, MOVE_BELLY_DRUM, MOVE_MAGNITUDE, MOVE_BODY_SLAM, MOVE_CURSE, MOVE_SMELLING_SALT, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SUBSTITUTE), egg_moves(KOFFING, MOVE_SCREECH, MOVE_PSYWAVE, MOVE_PSYBEAM, MOVE_DESTINY_BOND, MOVE_PAIN_SPLIT, MOVE_WILL_O_WISP), egg_moves(RHYHORN, MOVE_CRUNCH, MOVE_REVERSAL, MOVE_ROCK_SLIDE, MOVE_COUNTER, MOVE_MAGNITUDE, MOVE_SWORDS_DANCE, MOVE_CURSE, MOVE_CRUSH_CLAW), egg_moves(CHANSEY, MOVE_PRESENT, MOVE_METRONOME, MOVE_HEAL_BELL, MOVE_AROMATHERAPY, MOVE_SUBSTITUTE), egg_moves(TANGELA, MOVE_FLAIL, MOVE_CONFUSION, MOVE_MEGA_DRAIN, MOVE_REFLECT, MOVE_AMNESIA, MOVE_LEECH_SEED, MOVE_NATURE_POWER), egg_moves(KANGASKHAN, MOVE_STOMP, MOVE_FORESIGHT, MOVE_FOCUS_ENERGY, MOVE_SAFEGUARD, MOVE_DISABLE, MOVE_COUNTER, MOVE_CRUSH_CLAW, MOVE_SUBSTITUTE), egg_moves(HORSEA, MOVE_FLAIL, MOVE_AURORA_BEAM, MOVE_OCTAZOOKA, MOVE_DISABLE, MOVE_SPLASH, MOVE_DRAGON_RAGE, MOVE_DRAGON_BREATH), egg_moves(GOLDEEN, MOVE_PSYBEAM, MOVE_HAZE, MOVE_HYDRO_PUMP, MOVE_SLEEP_TALK, MOVE_MUD_SPORT), egg_moves(MR_MIME, MOVE_FUTURE_SIGHT, MOVE_HYPNOSIS, MOVE_MIMIC, MOVE_PSYCH_UP, MOVE_FAKE_OUT, MOVE_TRICK), egg_moves(SCYTHER, MOVE_COUNTER, MOVE_SAFEGUARD, MOVE_BATON_PASS, MOVE_RAZOR_WIND, MOVE_REVERSAL, MOVE_LIGHT_SCREEN, MOVE_ENDURE, MOVE_SILVER_WIND), egg_moves(PINSIR, MOVE_FURY_ATTACK, MOVE_FLAIL, MOVE_FALSE_SWIPE, MOVE_FAINT_ATTACK), egg_moves(LAPRAS, MOVE_FORESIGHT, MOVE_SUBSTITUTE, MOVE_TICKLE, MOVE_REFRESH, MOVE_DRAGON_DANCE, MOVE_CURSE, MOVE_SLEEP_TALK, MOVE_HORN_DRILL), egg_moves(EEVEE, MOVE_CHARM, MOVE_FLAIL, MOVE_ENDURE, MOVE_CURSE, MOVE_TICKLE, MOVE_WISH), egg_moves(OMANYTE, MOVE_BUBBLE_BEAM, MOVE_AURORA_BEAM, MOVE_SLAM, MOVE_SUPERSONIC, MOVE_HAZE, MOVE_ROCK_SLIDE, MOVE_SPIKES), egg_moves(KABUTO, MOVE_BUBBLE_BEAM, MOVE_AURORA_BEAM, MOVE_RAPID_SPIN, MOVE_DIG, MOVE_FLAIL, MOVE_KNOCK_OFF, MOVE_CONFUSE_RAY), egg_moves(AERODACTYL, MOVE_WHIRLWIND, MOVE_PURSUIT, MOVE_FORESIGHT, MOVE_STEEL_WING, MOVE_DRAGON_BREATH, MOVE_CURSE), egg_moves(SNORLAX, MOVE_LICK, MOVE_CHARM, MOVE_DOUBLE_EDGE, MOVE_CURSE, MOVE_FISSURE, MOVE_SUBSTITUTE), egg_moves(DRATINI, MOVE_LIGHT_SCREEN, MOVE_MIST, MOVE_HAZE, MOVE_SUPERSONIC, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE), egg_moves(CHIKORITA, MOVE_VINE_WHIP, MOVE_LEECH_SEED, MOVE_COUNTER, MOVE_ANCIENT_POWER, MOVE_FLAIL, MOVE_NATURE_POWER, MOVE_INGRAIN, MOVE_GRASS_WHISTLE), egg_moves(CYNDAQUIL, MOVE_FURY_SWIPES, MOVE_QUICK_ATTACK, MOVE_REVERSAL, MOVE_THRASH, MOVE_FORESIGHT, MOVE_COVET, MOVE_HOWL, MOVE_CRUSH_CLAW), egg_moves(TOTODILE, MOVE_CRUNCH, MOVE_THRASH, MOVE_HYDRO_PUMP, MOVE_ANCIENT_POWER, MOVE_ROCK_SLIDE, MOVE_MUD_SPORT, MOVE_WATER_SPORT, MOVE_DRAGON_CLAW), egg_moves(SENTRET, MOVE_DOUBLE_EDGE, MOVE_PURSUIT, MOVE_SLASH, MOVE_FOCUS_ENERGY, MOVE_REVERSAL, MOVE_SUBSTITUTE, MOVE_TRICK, MOVE_ASSIST), egg_moves(HOOTHOOT, MOVE_MIRROR_MOVE, MOVE_SUPERSONIC, MOVE_FAINT_ATTACK, MOVE_WING_ATTACK, MOVE_WHIRLWIND, MOVE_SKY_ATTACK, MOVE_FEATHER_DANCE), egg_moves(LEDYBA, MOVE_PSYBEAM, MOVE_BIDE, MOVE_SILVER_WIND), egg_moves(SPINARAK, MOVE_PSYBEAM, MOVE_DISABLE, MOVE_SONIC_BOOM, MOVE_BATON_PASS, MOVE_PURSUIT, MOVE_SIGNAL_BEAM), egg_moves(CHINCHOU, MOVE_FLAIL, MOVE_SCREECH, MOVE_AMNESIA), egg_moves(PICHU, MOVE_REVERSAL, MOVE_BIDE, MOVE_PRESENT, MOVE_ENCORE, MOVE_DOUBLE_SLAP, MOVE_WISH, MOVE_CHARGE), egg_moves(CLEFFA, MOVE_PRESENT, MOVE_METRONOME, MOVE_AMNESIA, MOVE_BELLY_DRUM, MOVE_SPLASH, MOVE_MIMIC, MOVE_WISH, MOVE_SUBSTITUTE), egg_moves(IGGLYBUFF, MOVE_PERISH_SONG, MOVE_PRESENT, MOVE_FAINT_ATTACK, MOVE_WISH, MOVE_FAKE_TEARS), egg_moves(TOGEPI, MOVE_PRESENT, MOVE_MIRROR_MOVE, MOVE_PECK, MOVE_FORESIGHT, MOVE_FUTURE_SIGHT, MOVE_SUBSTITUTE, MOVE_PSYCH_UP), egg_moves(NATU, MOVE_HAZE, MOVE_DRILL_PECK, MOVE_QUICK_ATTACK, MOVE_FAINT_ATTACK, MOVE_STEEL_WING, MOVE_PSYCH_UP, MOVE_FEATHER_DANCE, MOVE_REFRESH), egg_moves(MAREEP, MOVE_TAKE_DOWN, MOVE_BODY_SLAM, MOVE_SAFEGUARD, MOVE_SCREECH, MOVE_REFLECT, MOVE_ODOR_SLEUTH, MOVE_CHARGE), egg_moves(MARILL, MOVE_LIGHT_SCREEN, MOVE_PRESENT, MOVE_AMNESIA, MOVE_FUTURE_SIGHT, MOVE_BELLY_DRUM, MOVE_PERISH_SONG, MOVE_SUPERSONIC, MOVE_SUBSTITUTE), egg_moves(SUDOWOODO, MOVE_SELF_DESTRUCT), egg_moves(HOPPIP, MOVE_CONFUSION, MOVE_ENCORE, MOVE_DOUBLE_EDGE, MOVE_REFLECT, MOVE_AMNESIA, MOVE_HELPING_HAND, MOVE_PSYCH_UP), egg_moves(AIPOM, MOVE_COUNTER, MOVE_SCREECH, MOVE_PURSUIT, MOVE_AGILITY, MOVE_SPITE, MOVE_SLAM, MOVE_DOUBLE_SLAP, MOVE_BEAT_UP), egg_moves(SUNKERN, MOVE_GRASS_WHISTLE, MOVE_ENCORE, MOVE_LEECH_SEED, MOVE_NATURE_POWER, MOVE_CURSE, MOVE_HELPING_HAND), egg_moves(YANMA, MOVE_WHIRLWIND, MOVE_REVERSAL, MOVE_LEECH_LIFE, MOVE_SIGNAL_BEAM, MOVE_SILVER_WIND), egg_moves(WOOPER, MOVE_BODY_SLAM, MOVE_ANCIENT_POWER, MOVE_SAFEGUARD, MOVE_CURSE, MOVE_MUD_SPORT, MOVE_STOCKPILE, MOVE_SWALLOW, MOVE_SPIT_UP), egg_moves(MURKROW, MOVE_WHIRLWIND, MOVE_DRILL_PECK, MOVE_MIRROR_MOVE, MOVE_WING_ATTACK, MOVE_SKY_ATTACK, MOVE_CONFUSE_RAY, MOVE_FEATHER_DANCE, MOVE_PERISH_SONG), egg_moves(MISDREAVUS, MOVE_SCREECH, MOVE_DESTINY_BOND, MOVE_PSYCH_UP, MOVE_IMPRISON), egg_moves(GIRAFARIG, MOVE_TAKE_DOWN, MOVE_AMNESIA, MOVE_FORESIGHT, MOVE_FUTURE_SIGHT, MOVE_BEAT_UP, MOVE_PSYCH_UP, MOVE_WISH, MOVE_MAGIC_COAT), egg_moves(PINECO, MOVE_REFLECT, MOVE_PIN_MISSILE, MOVE_FLAIL, MOVE_SWIFT, MOVE_COUNTER, MOVE_SAND_TOMB), egg_moves(DUNSPARCE, MOVE_BIDE, MOVE_ANCIENT_POWER, MOVE_ROCK_SLIDE, MOVE_BITE, MOVE_HEADBUTT, MOVE_ASTONISH, MOVE_CURSE), egg_moves(GLIGAR, MOVE_METAL_CLAW, MOVE_WING_ATTACK, MOVE_RAZOR_WIND, MOVE_COUNTER, MOVE_SAND_TOMB), egg_moves(SNUBBULL, MOVE_METRONOME, MOVE_FAINT_ATTACK, MOVE_REFLECT, MOVE_PRESENT, MOVE_CRUNCH, MOVE_HEAL_BELL, MOVE_SNORE, MOVE_SMELLING_SALT), egg_moves(QWILFISH, MOVE_FLAIL, MOVE_HAZE, MOVE_BUBBLE_BEAM, MOVE_SUPERSONIC, MOVE_ASTONISH), egg_moves(SHUCKLE, MOVE_SWEET_SCENT), egg_moves(HERACROSS, MOVE_HARDEN, MOVE_BIDE, MOVE_FLAIL, MOVE_FALSE_SWIPE), egg_moves(SNEASEL, MOVE_COUNTER, MOVE_SPITE, MOVE_FORESIGHT, MOVE_REFLECT, MOVE_BITE, MOVE_CRUSH_CLAW, MOVE_FAKE_OUT), egg_moves(TEDDIURSA, MOVE_CRUNCH, MOVE_TAKE_DOWN, MOVE_SEISMIC_TOSS, MOVE_COUNTER, MOVE_METAL_CLAW, MOVE_FAKE_TEARS, MOVE_YAWN, MOVE_SLEEP_TALK), egg_moves(SLUGMA, MOVE_ACID_ARMOR, MOVE_HEAT_WAVE), egg_moves(SWINUB, MOVE_TAKE_DOWN, MOVE_BITE, MOVE_BODY_SLAM, MOVE_ROCK_SLIDE, MOVE_ANCIENT_POWER, MOVE_MUD_SHOT, MOVE_ICICLE_SPEAR, MOVE_DOUBLE_EDGE), egg_moves(CORSOLA, MOVE_ROCK_SLIDE, MOVE_SCREECH, MOVE_MIST, MOVE_AMNESIA, MOVE_BARRIER, MOVE_INGRAIN, MOVE_CONFUSE_RAY, MOVE_ICICLE_SPEAR), egg_moves(REMORAID, MOVE_AURORA_BEAM, MOVE_OCTAZOOKA, MOVE_SUPERSONIC, MOVE_HAZE, MOVE_SCREECH, MOVE_THUNDER_WAVE, MOVE_ROCK_BLAST), egg_moves(DELIBIRD, MOVE_AURORA_BEAM, MOVE_QUICK_ATTACK, MOVE_FUTURE_SIGHT, MOVE_SPLASH, MOVE_RAPID_SPIN, MOVE_ICE_BALL), egg_moves(MANTINE, MOVE_TWISTER, MOVE_HYDRO_PUMP, MOVE_HAZE, MOVE_SLAM, MOVE_MUD_SPORT, MOVE_ROCK_SLIDE), egg_moves(SKARMORY, MOVE_DRILL_PECK, MOVE_PURSUIT, MOVE_WHIRLWIND, MOVE_SKY_ATTACK, MOVE_CURSE), egg_moves(HOUNDOUR, MOVE_FIRE_SPIN, MOVE_RAGE, MOVE_PURSUIT, MOVE_COUNTER, MOVE_SPITE, MOVE_REVERSAL, MOVE_BEAT_UP, MOVE_WILL_O_WISP), egg_moves(PHANPY, MOVE_FOCUS_ENERGY, MOVE_BODY_SLAM, MOVE_ANCIENT_POWER, MOVE_SNORE, MOVE_COUNTER, MOVE_FISSURE), egg_moves(STANTLER, MOVE_SPITE, MOVE_DISABLE, MOVE_BITE, MOVE_SWAGGER, MOVE_PSYCH_UP, MOVE_EXTRASENSORY), egg_moves(TYROGUE, MOVE_RAPID_SPIN, MOVE_HI_JUMP_KICK, MOVE_MACH_PUNCH, MOVE_MIND_READER, MOVE_HELPING_HAND), egg_moves(SMOOCHUM, MOVE_MEDITATE, MOVE_PSYCH_UP, MOVE_FAKE_OUT, MOVE_WISH, MOVE_ICE_PUNCH), egg_moves(ELEKID, MOVE_KARATE_CHOP, MOVE_BARRIER, MOVE_ROLLING_KICK, MOVE_MEDITATE, MOVE_CROSS_CHOP, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH), egg_moves(MAGBY, MOVE_KARATE_CHOP, MOVE_MEGA_PUNCH, MOVE_BARRIER, MOVE_SCREECH, MOVE_CROSS_CHOP, MOVE_THUNDER_PUNCH), egg_moves(MILTANK, MOVE_PRESENT, MOVE_REVERSAL, MOVE_SEISMIC_TOSS, MOVE_ENDURE, MOVE_PSYCH_UP, MOVE_CURSE, MOVE_HELPING_HAND, MOVE_SLEEP_TALK), egg_moves(LARVITAR, MOVE_PURSUIT, MOVE_STOMP, MOVE_OUTRAGE, MOVE_FOCUS_ENERGY, MOVE_ANCIENT_POWER, MOVE_DRAGON_DANCE, MOVE_CURSE), egg_moves(TREECKO, MOVE_CRUNCH, MOVE_MUD_SPORT, MOVE_ENDEAVOR, MOVE_LEECH_SEED, MOVE_DRAGON_BREATH, MOVE_CRUSH_CLAW), egg_moves(TORCHIC, MOVE_COUNTER, MOVE_REVERSAL, MOVE_ENDURE, MOVE_SWAGGER, MOVE_ROCK_SLIDE, MOVE_SMELLING_SALT), egg_moves(MUDKIP, MOVE_REFRESH, MOVE_UPROAR, MOVE_CURSE, MOVE_STOMP, MOVE_ICE_BALL, MOVE_MIRROR_COAT), egg_moves(POOCHYENA, MOVE_ASTONISH, MOVE_POISON_FANG, MOVE_COVET, MOVE_LEER, MOVE_YAWN), egg_moves(ZIGZAGOON, MOVE_CHARM, MOVE_PURSUIT, MOVE_SUBSTITUTE, MOVE_TICKLE, MOVE_TRICK), egg_moves(LOTAD, MOVE_SYNTHESIS, MOVE_RAZOR_LEAF, MOVE_SWEET_SCENT, MOVE_LEECH_SEED, MOVE_FLAIL, MOVE_WATER_GUN), egg_moves(SEEDOT, MOVE_LEECH_SEED, MOVE_AMNESIA, MOVE_QUICK_ATTACK, MOVE_RAZOR_WIND, MOVE_TAKE_DOWN, MOVE_FALSE_SWIPE), egg_moves(NINCADA, MOVE_ENDURE, MOVE_FAINT_ATTACK, MOVE_GUST, MOVE_SILVER_WIND), egg_moves(TAILLOW, MOVE_PURSUIT, MOVE_SUPERSONIC, MOVE_REFRESH, MOVE_MIRROR_MOVE, MOVE_RAGE, MOVE_SKY_ATTACK), egg_moves(SHROOMISH, MOVE_FAKE_TEARS, MOVE_SWAGGER, MOVE_CHARM, MOVE_FALSE_SWIPE, MOVE_HELPING_HAND), egg_moves(SPINDA, MOVE_ENCORE, MOVE_ROCK_SLIDE, MOVE_ASSIST, MOVE_DISABLE, MOVE_BATON_PASS, MOVE_WISH, MOVE_TRICK, MOVE_SMELLING_SALT), egg_moves(WINGULL, MOVE_MIST, MOVE_TWISTER, MOVE_AGILITY, MOVE_GUST, MOVE_WATER_SPORT), egg_moves(SURSKIT, MOVE_FORESIGHT, MOVE_MUD_SHOT, MOVE_PSYBEAM, MOVE_HYDRO_PUMP, MOVE_MIND_READER), egg_moves(WAILMER, MOVE_DOUBLE_EDGE, MOVE_THRASH, MOVE_SWAGGER, MOVE_SNORE, MOVE_SLEEP_TALK, MOVE_CURSE, MOVE_FISSURE, MOVE_TICKLE), egg_moves(SKITTY, MOVE_HELPING_HAND, MOVE_PSYCH_UP, MOVE_UPROAR, MOVE_FAKE_TEARS, MOVE_WISH, MOVE_BATON_PASS, MOVE_SUBSTITUTE, MOVE_TICKLE), egg_moves(KECLEON, MOVE_DISABLE, MOVE_MAGIC_COAT, MOVE_TRICK), egg_moves(NOSEPASS, MOVE_MAGNITUDE, MOVE_ROLLOUT, MOVE_EXPLOSION), egg_moves(TORKOAL, MOVE_ERUPTION, MOVE_ENDURE, MOVE_SLEEP_TALK, MOVE_YAWN), egg_moves(SABLEYE, MOVE_PSYCH_UP, MOVE_RECOVER, MOVE_MOONLIGHT), egg_moves(BARBOACH, MOVE_THRASH, MOVE_WHIRLPOOL, MOVE_SPARK), egg_moves(LUVDISC, MOVE_SPLASH, MOVE_SUPERSONIC, MOVE_WATER_SPORT, MOVE_MUD_SPORT), egg_moves(CORPHISH, MOVE_MUD_SPORT, MOVE_ENDEAVOR, MOVE_BODY_SLAM, MOVE_ANCIENT_POWER), egg_moves(FEEBAS, MOVE_MIRROR_COAT, MOVE_DRAGON_BREATH, MOVE_MUD_SPORT, MOVE_HYPNOSIS, MOVE_LIGHT_SCREEN, MOVE_CONFUSE_RAY), egg_moves(CARVANHA, MOVE_HYDRO_PUMP, MOVE_DOUBLE_EDGE, MOVE_THRASH), egg_moves(TRAPINCH, MOVE_FOCUS_ENERGY, MOVE_QUICK_ATTACK, MOVE_GUST), egg_moves(MAKUHITA, MOVE_FAINT_ATTACK, MOVE_DETECT, MOVE_FORESIGHT, MOVE_HELPING_HAND, MOVE_CROSS_CHOP, MOVE_REVENGE, MOVE_DYNAMIC_PUNCH, MOVE_COUNTER), egg_moves(ELECTRIKE, MOVE_CRUNCH, MOVE_HEADBUTT, MOVE_UPROAR, MOVE_CURSE, MOVE_SWIFT), egg_moves(NUMEL, MOVE_HOWL, MOVE_SCARY_FACE, MOVE_BODY_SLAM, MOVE_ROLLOUT, MOVE_DEFENSE_CURL, MOVE_STOMP), egg_moves(SPHEAL, MOVE_WATER_SPORT, MOVE_STOCKPILE, MOVE_SWALLOW, MOVE_SPIT_UP, MOVE_YAWN, MOVE_ROCK_SLIDE, MOVE_CURSE, MOVE_FISSURE), egg_moves(CACNEA, MOVE_GRASS_WHISTLE, MOVE_ACID, MOVE_TEETER_DANCE, MOVE_DYNAMIC_PUNCH, MOVE_COUNTER), egg_moves(SNORUNT, MOVE_BLOCK, MOVE_SPIKES), egg_moves(AZURILL, MOVE_ENCORE, MOVE_SING, MOVE_REFRESH, MOVE_SLAM, MOVE_TICKLE), egg_moves(SPOINK, MOVE_FUTURE_SIGHT, MOVE_EXTRASENSORY, MOVE_SUBSTITUTE, MOVE_TRICK), egg_moves(PLUSLE, MOVE_SUBSTITUTE, MOVE_WISH), egg_moves(MINUN, MOVE_SUBSTITUTE, MOVE_WISH), egg_moves(MAWILE, MOVE_SWORDS_DANCE, MOVE_FALSE_SWIPE, MOVE_POISON_FANG, MOVE_PSYCH_UP, MOVE_ANCIENT_POWER, MOVE_TICKLE), egg_moves(MEDITITE, MOVE_FIRE_PUNCH, MOVE_THUNDER_PUNCH, MOVE_ICE_PUNCH, MOVE_FORESIGHT, MOVE_FAKE_OUT, MOVE_BATON_PASS, MOVE_DYNAMIC_PUNCH), egg_moves(SWABLU, MOVE_AGILITY, MOVE_HAZE, MOVE_PURSUIT, MOVE_RAGE), egg_moves(DUSKULL, MOVE_IMPRISON, MOVE_DESTINY_BOND, MOVE_PAIN_SPLIT, MOVE_GRUDGE, MOVE_MEMENTO, MOVE_FAINT_ATTACK), egg_moves(ROSELIA, MOVE_SPIKES, MOVE_SYNTHESIS, MOVE_PIN_MISSILE, MOVE_COTTON_SPORE), egg_moves(SLAKOTH, MOVE_PURSUIT, MOVE_SLASH, MOVE_BODY_SLAM, MOVE_SNORE, MOVE_CRUSH_CLAW, MOVE_CURSE, MOVE_SLEEP_TALK), egg_moves(GULPIN, MOVE_DREAM_EATER, MOVE_ACID_ARMOR, MOVE_SMOG, MOVE_PAIN_SPLIT), egg_moves(TROPIUS, MOVE_HEADBUTT, MOVE_SLAM, MOVE_RAZOR_WIND, MOVE_LEECH_SEED, MOVE_NATURE_POWER), egg_moves(WHISMUR, MOVE_TAKE_DOWN, MOVE_SNORE, MOVE_SWAGGER, MOVE_EXTRASENSORY, MOVE_SMELLING_SALT), egg_moves(CLAMPERL, MOVE_REFRESH, MOVE_MUD_SPORT, MOVE_BODY_SLAM, MOVE_SUPERSONIC, MOVE_BARRIER, MOVE_CONFUSE_RAY), egg_moves(ABSOL, MOVE_BATON_PASS, MOVE_FAINT_ATTACK, MOVE_DOUBLE_EDGE, MOVE_MAGIC_COAT, MOVE_CURSE, MOVE_SUBSTITUTE), egg_moves(SHUPPET, MOVE_DISABLE, MOVE_DESTINY_BOND, MOVE_FORESIGHT, MOVE_ASTONISH, MOVE_IMPRISON), egg_moves(SEVIPER, MOVE_STOCKPILE, MOVE_SWALLOW, MOVE_SPIT_UP, MOVE_BODY_SLAM), egg_moves(ZANGOOSE, MOVE_FLAIL, MOVE_DOUBLE_KICK, MOVE_RAZOR_WIND, MOVE_COUNTER, MOVE_ROAR, MOVE_CURSE), egg_moves(RELICANTH, MOVE_MAGNITUDE, MOVE_SKULL_BASH, MOVE_WATER_SPORT, MOVE_AMNESIA, MOVE_SLEEP_TALK, MOVE_ROCK_SLIDE), egg_moves(ARON, MOVE_ENDEAVOR, MOVE_BODY_SLAM, MOVE_STOMP, MOVE_SMELLING_SALT), egg_moves(CASTFORM, MOVE_FUTURE_SIGHT, MOVE_PSYCH_UP), egg_moves(VOLBEAT, MOVE_BATON_PASS, MOVE_SILVER_WIND, MOVE_TRICK), egg_moves(ILLUMISE, MOVE_BATON_PASS, MOVE_SILVER_WIND, MOVE_GROWTH), egg_moves(LILEEP, MOVE_BARRIER, MOVE_RECOVER, MOVE_MIRROR_COAT, MOVE_ROCK_SLIDE), egg_moves(ANORITH, MOVE_RAPID_SPIN, MOVE_KNOCK_OFF, MOVE_SWORDS_DANCE, MOVE_ROCK_SLIDE), egg_moves(RALTS, MOVE_DISABLE, MOVE_WILL_O_WISP, MOVE_MEAN_LOOK, MOVE_MEMENTO, MOVE_DESTINY_BOND), egg_moves(BAGON, MOVE_HYDRO_PUMP, MOVE_THRASH, MOVE_DRAGON_RAGE, MOVE_TWISTER, MOVE_DRAGON_DANCE), egg_moves(CHIMECHO, MOVE_DISABLE, MOVE_CURSE, MOVE_HYPNOSIS, MOVE_DREAM_EATER), EGG_MOVES_TERMINATOR }; ================================================ FILE: src/data/pokemon/evolution.h ================================================ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] = { [SPECIES_BULBASAUR] = {{EVO_LEVEL, 16, SPECIES_IVYSAUR, 0}}, [SPECIES_IVYSAUR] = {{EVO_LEVEL, 32, SPECIES_VENUSAUR, 0}}, [SPECIES_CHARMANDER] = {{EVO_LEVEL, 16, SPECIES_CHARMELEON, 0}}, [SPECIES_CHARMELEON] = {{EVO_LEVEL, 36, SPECIES_CHARIZARD, 0}}, [SPECIES_SQUIRTLE] = {{EVO_LEVEL, 16, SPECIES_WARTORTLE, 0}}, [SPECIES_WARTORTLE] = {{EVO_LEVEL, 36, SPECIES_BLASTOISE, 0}}, [SPECIES_CATERPIE] = {{EVO_LEVEL, 7, SPECIES_METAPOD, 0}}, [SPECIES_METAPOD] = {{EVO_LEVEL, 10, SPECIES_BUTTERFREE, 0}}, [SPECIES_WEEDLE] = {{EVO_LEVEL, 7, SPECIES_KAKUNA, 0}}, [SPECIES_KAKUNA] = {{EVO_LEVEL, 10, SPECIES_BEEDRILL, 0}}, [SPECIES_PIDGEY] = {{EVO_LEVEL, 18, SPECIES_PIDGEOTTO, 0}}, [SPECIES_PIDGEOTTO] = {{EVO_LEVEL, 36, SPECIES_PIDGEOT, 0}}, [SPECIES_RATTATA] = {{EVO_LEVEL, 20, SPECIES_RATICATE, 0}}, [SPECIES_SPEAROW] = {{EVO_LEVEL, 20, SPECIES_FEAROW, 0}}, [SPECIES_EKANS] = {{EVO_LEVEL, 22, SPECIES_ARBOK, 0}}, [SPECIES_PIKACHU] = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU, 0}}, [SPECIES_SANDSHREW] = {{EVO_LEVEL, 22, SPECIES_SANDSLASH, 0}}, [SPECIES_NIDORAN_F] = {{EVO_LEVEL, 16, SPECIES_NIDORINA, 0}}, [SPECIES_NIDORINA] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOQUEEN, 0}}, [SPECIES_NIDORAN_M] = {{EVO_LEVEL, 16, SPECIES_NIDORINO, 0}}, [SPECIES_NIDORINO] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOKING, 0}}, [SPECIES_CLEFAIRY] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_CLEFABLE, 0}}, [SPECIES_VULPIX] = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_NINETALES, 0}}, [SPECIES_JIGGLYPUFF] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_WIGGLYTUFF, 0}}, [SPECIES_ZUBAT] = {{EVO_LEVEL, 22, SPECIES_GOLBAT, 0}}, [SPECIES_GOLBAT] = {{EVO_FRIENDSHIP, 0, SPECIES_CROBAT, 0}}, [SPECIES_ODDISH] = {{EVO_LEVEL, 21, SPECIES_GLOOM, 0}}, [SPECIES_GLOOM] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME, 0}, {EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM, 0}}, [SPECIES_PARAS] = {{EVO_LEVEL, 24, SPECIES_PARASECT, 0}}, [SPECIES_VENONAT] = {{EVO_LEVEL, 31, SPECIES_VENOMOTH, 0}}, [SPECIES_DIGLETT] = {{EVO_LEVEL, 26, SPECIES_DUGTRIO, 0}}, [SPECIES_MEOWTH] = {{EVO_LEVEL, 28, SPECIES_PERSIAN, 0}}, [SPECIES_PSYDUCK] = {{EVO_LEVEL, 33, SPECIES_GOLDUCK, 0}}, [SPECIES_MANKEY] = {{EVO_LEVEL, 28, SPECIES_PRIMEAPE, 0}}, [SPECIES_GROWLITHE] = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_ARCANINE, 0}}, [SPECIES_POLIWAG] = {{EVO_LEVEL, 25, SPECIES_POLIWHIRL, 0}}, [SPECIES_POLIWHIRL] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH, 0}, {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED, 0}, {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_POLITOED, ITEM_KINGS_ROCK}}, [SPECIES_ABRA] = {{EVO_LEVEL, 16, SPECIES_KADABRA, 0}}, [SPECIES_KADABRA] = {{EVO_TRADE, 0, SPECIES_ALAKAZAM, 0}, {EVO_ITEM, ITEM_LINK_BRACELET, SPECIES_ALAKAZAM, 0}}, [SPECIES_MACHOP] = {{EVO_LEVEL, 28, SPECIES_MACHOKE, 0}}, [SPECIES_MACHOKE] = {{EVO_TRADE, 0, SPECIES_MACHAMP, 0}, {EVO_ITEM, ITEM_LINK_BRACELET, SPECIES_MACHAMP, 0}}, [SPECIES_BELLSPROUT] = {{EVO_LEVEL, 21, SPECIES_WEEPINBELL, 0}}, [SPECIES_WEEPINBELL] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VICTREEBEL, 0}}, [SPECIES_TENTACOOL] = {{EVO_LEVEL, 30, SPECIES_TENTACRUEL, 0}}, [SPECIES_GEODUDE] = {{EVO_LEVEL, 25, SPECIES_GRAVELER, 0}}, [SPECIES_GRAVELER] = {{EVO_TRADE, 0, SPECIES_GOLEM, 0}, {EVO_ITEM, ITEM_LINK_BRACELET, SPECIES_GOLEM, 0}}, [SPECIES_PONYTA] = {{EVO_LEVEL, 40, SPECIES_RAPIDASH, 0}}, [SPECIES_SLOWPOKE] = {{EVO_LEVEL, 37, SPECIES_SLOWBRO, 0}, {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING, 0}, {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_SLOWKING, ITEM_KINGS_ROCK}}, [SPECIES_MAGNEMITE] = {{EVO_LEVEL, 30, SPECIES_MAGNETON, 0}}, [SPECIES_DODUO] = {{EVO_LEVEL, 31, SPECIES_DODRIO, 0}}, [SPECIES_SEEL] = {{EVO_LEVEL, 34, SPECIES_DEWGONG, 0}}, [SPECIES_GRIMER] = {{EVO_LEVEL, 38, SPECIES_MUK, 0}}, [SPECIES_SHELLDER] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_CLOYSTER, 0}}, [SPECIES_GASTLY] = {{EVO_LEVEL, 25, SPECIES_HAUNTER, 0}}, [SPECIES_HAUNTER] = {{EVO_TRADE, 0, SPECIES_GENGAR, 0}, {EVO_ITEM, ITEM_LINK_BRACELET, SPECIES_GENGAR, 0}}, [SPECIES_ONIX] = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX, 0}, {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_STEELIX, ITEM_METAL_COAT}}, [SPECIES_DROWZEE] = {{EVO_LEVEL, 26, SPECIES_HYPNO, 0}}, [SPECIES_KRABBY] = {{EVO_LEVEL, 28, SPECIES_KINGLER, 0}}, [SPECIES_VOLTORB] = {{EVO_LEVEL, 30, SPECIES_ELECTRODE, 0}}, [SPECIES_EXEGGCUTE] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR, 0}}, [SPECIES_CUBONE] = {{EVO_LEVEL, 28, SPECIES_MAROWAK, 0}}, [SPECIES_KOFFING] = {{EVO_LEVEL, 35, SPECIES_WEEZING, 0}}, [SPECIES_RHYHORN] = {{EVO_LEVEL, 42, SPECIES_RHYDON, 0}}, [SPECIES_CHANSEY] = {{EVO_FRIENDSHIP, 0, SPECIES_BLISSEY, 0}}, [SPECIES_HORSEA] = {{EVO_LEVEL, 32, SPECIES_SEADRA, 0}}, [SPECIES_SEADRA] = {{EVO_TRADE_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA, 0}, {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_KINGDRA, ITEM_DRAGON_SCALE}}, [SPECIES_GOLDEEN] = {{EVO_LEVEL, 33, SPECIES_SEAKING, 0}}, [SPECIES_STARYU] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_STARMIE, 0}}, [SPECIES_SCYTHER] = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR, 0}, {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_SCIZOR, ITEM_METAL_COAT}}, [SPECIES_MAGIKARP] = {{EVO_LEVEL, 20, SPECIES_GYARADOS, 0}}, [SPECIES_EEVEE] = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON, 0}, {EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON, 0}, {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON, 0}, {EVO_FRIENDSHIP_DAY, 0, SPECIES_ESPEON, 0}, {EVO_FRIENDSHIP_NIGHT, 0, SPECIES_UMBREON, 0}}, [SPECIES_PORYGON] = {{EVO_TRADE_ITEM, ITEM_UP_GRADE, SPECIES_PORYGON2, 0}, {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_PORYGON2, ITEM_UP_GRADE}}, [SPECIES_OMANYTE] = {{EVO_LEVEL, 40, SPECIES_OMASTAR, 0}}, [SPECIES_KABUTO] = {{EVO_LEVEL, 40, SPECIES_KABUTOPS, 0}}, [SPECIES_DRATINI] = {{EVO_LEVEL, 30, SPECIES_DRAGONAIR, 0}}, [SPECIES_DRAGONAIR] = {{EVO_LEVEL, 55, SPECIES_DRAGONITE, 0}}, [SPECIES_CHIKORITA] = {{EVO_LEVEL, 16, SPECIES_BAYLEEF, 0}}, [SPECIES_BAYLEEF] = {{EVO_LEVEL, 32, SPECIES_MEGANIUM, 0}}, [SPECIES_CYNDAQUIL] = {{EVO_LEVEL, 14, SPECIES_QUILAVA, 0}}, [SPECIES_QUILAVA] = {{EVO_LEVEL, 36, SPECIES_TYPHLOSION, 0}}, [SPECIES_TOTODILE] = {{EVO_LEVEL, 18, SPECIES_CROCONAW, 0}}, [SPECIES_CROCONAW] = {{EVO_LEVEL, 30, SPECIES_FERALIGATR, 0}}, [SPECIES_SENTRET] = {{EVO_LEVEL, 15, SPECIES_FURRET, 0}}, [SPECIES_HOOTHOOT] = {{EVO_LEVEL, 20, SPECIES_NOCTOWL, 0}}, [SPECIES_LEDYBA] = {{EVO_LEVEL, 18, SPECIES_LEDIAN, 0}}, [SPECIES_SPINARAK] = {{EVO_LEVEL, 22, SPECIES_ARIADOS, 0}}, [SPECIES_CHINCHOU] = {{EVO_LEVEL, 27, SPECIES_LANTURN, 0}}, [SPECIES_PICHU] = {{EVO_FRIENDSHIP, 0, SPECIES_PIKACHU, 0}}, [SPECIES_CLEFFA] = {{EVO_FRIENDSHIP, 0, SPECIES_CLEFAIRY, 0}}, [SPECIES_IGGLYBUFF] = {{EVO_FRIENDSHIP, 0, SPECIES_JIGGLYPUFF, 0}}, [SPECIES_TOGEPI] = {{EVO_FRIENDSHIP, 0, SPECIES_TOGETIC, 0}}, [SPECIES_NATU] = {{EVO_LEVEL, 25, SPECIES_XATU, 0}}, [SPECIES_MAREEP] = {{EVO_LEVEL, 15, SPECIES_FLAAFFY, 0}}, [SPECIES_FLAAFFY] = {{EVO_LEVEL, 30, SPECIES_AMPHAROS, 0}}, [SPECIES_MARILL] = {{EVO_LEVEL, 18, SPECIES_AZUMARILL, 0}}, [SPECIES_HOPPIP] = {{EVO_LEVEL, 18, SPECIES_SKIPLOOM, 0}}, [SPECIES_SKIPLOOM] = {{EVO_LEVEL, 27, SPECIES_JUMPLUFF, 0}}, [SPECIES_SUNKERN] = {{EVO_ITEM, ITEM_SUN_STONE, SPECIES_SUNFLORA, 0}}, [SPECIES_WOOPER] = {{EVO_LEVEL, 20, SPECIES_QUAGSIRE, 0}}, [SPECIES_PINECO] = {{EVO_LEVEL, 31, SPECIES_FORRETRESS, 0}}, [SPECIES_SNUBBULL] = {{EVO_LEVEL, 23, SPECIES_GRANBULL, 0}}, [SPECIES_TEDDIURSA] = {{EVO_LEVEL, 30, SPECIES_URSARING, 0}}, [SPECIES_SLUGMA] = {{EVO_LEVEL, 38, SPECIES_MAGCARGO, 0}}, [SPECIES_SWINUB] = {{EVO_LEVEL, 33, SPECIES_PILOSWINE, 0}}, [SPECIES_REMORAID] = {{EVO_LEVEL, 25, SPECIES_OCTILLERY, 0}}, [SPECIES_HOUNDOUR] = {{EVO_LEVEL, 24, SPECIES_HOUNDOOM, 0}}, [SPECIES_PHANPY] = {{EVO_LEVEL, 25, SPECIES_DONPHAN, 0}}, [SPECIES_TYROGUE] = {{EVO_LEVEL_ATK_LT_DEF, 20, SPECIES_HITMONCHAN, 0}, {EVO_LEVEL_ATK_GT_DEF, 20, SPECIES_HITMONLEE, 0}, {EVO_LEVEL_ATK_EQ_DEF, 20, SPECIES_HITMONTOP, 0}}, [SPECIES_SMOOCHUM] = {{EVO_LEVEL, 30, SPECIES_JYNX, 0}}, [SPECIES_ELEKID] = {{EVO_LEVEL, 30, SPECIES_ELECTABUZZ, 0}}, [SPECIES_MAGBY] = {{EVO_LEVEL, 30, SPECIES_MAGMAR, 0}}, [SPECIES_LARVITAR] = {{EVO_LEVEL, 30, SPECIES_PUPITAR, 0}}, [SPECIES_PUPITAR] = {{EVO_LEVEL, 55, SPECIES_TYRANITAR, 0}}, [SPECIES_TREECKO] = {{EVO_LEVEL, 16, SPECIES_GROVYLE, 0}}, [SPECIES_GROVYLE] = {{EVO_LEVEL, 36, SPECIES_SCEPTILE, 0}}, [SPECIES_TORCHIC] = {{EVO_LEVEL, 16, SPECIES_COMBUSKEN, 0}}, [SPECIES_COMBUSKEN] = {{EVO_LEVEL, 36, SPECIES_BLAZIKEN, 0}}, [SPECIES_MUDKIP] = {{EVO_LEVEL, 16, SPECIES_MARSHTOMP, 0}}, [SPECIES_MARSHTOMP] = {{EVO_LEVEL, 36, SPECIES_SWAMPERT, 0}}, [SPECIES_POOCHYENA] = {{EVO_LEVEL, 18, SPECIES_MIGHTYENA, 0}}, [SPECIES_ZIGZAGOON] = {{EVO_LEVEL, 20, SPECIES_LINOONE, 0}}, [SPECIES_WURMPLE] = {{EVO_LEVEL_SILCOON, 7, SPECIES_SILCOON, 0}, {EVO_LEVEL_CASCOON, 7, SPECIES_CASCOON, 0}}, [SPECIES_SILCOON] = {{EVO_LEVEL, 10, SPECIES_BEAUTIFLY, 0}}, [SPECIES_CASCOON] = {{EVO_LEVEL, 10, SPECIES_DUSTOX, 0}}, [SPECIES_LOTAD] = {{EVO_LEVEL, 14, SPECIES_LOMBRE, 0}}, [SPECIES_LOMBRE] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_LUDICOLO, 0}}, [SPECIES_SEEDOT] = {{EVO_LEVEL, 14, SPECIES_NUZLEAF, 0}}, [SPECIES_NUZLEAF] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_SHIFTRY, 0}}, [SPECIES_NINCADA] = {{EVO_LEVEL_NINJASK, 20, SPECIES_NINJASK, 0}, {EVO_LEVEL_SHEDINJA, 20, SPECIES_SHEDINJA, 0}}, [SPECIES_TAILLOW] = {{EVO_LEVEL, 22, SPECIES_SWELLOW, 0}}, [SPECIES_SHROOMISH] = {{EVO_LEVEL, 23, SPECIES_BRELOOM, 0}}, [SPECIES_WINGULL] = {{EVO_LEVEL, 25, SPECIES_PELIPPER, 0}}, [SPECIES_SURSKIT] = {{EVO_LEVEL, 22, SPECIES_MASQUERAIN, 0}}, [SPECIES_WAILMER] = {{EVO_LEVEL, 40, SPECIES_WAILORD, 0}}, [SPECIES_SKITTY] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_DELCATTY, 0}}, [SPECIES_BALTOY] = {{EVO_LEVEL, 36, SPECIES_CLAYDOL, 0}}, [SPECIES_BARBOACH] = {{EVO_LEVEL, 30, SPECIES_WHISCASH, 0}}, [SPECIES_CORPHISH] = {{EVO_LEVEL, 30, SPECIES_CRAWDAUNT, 0}}, [SPECIES_FEEBAS] = {{EVO_BEAUTY, 170, SPECIES_MILOTIC, 0}}, [SPECIES_CARVANHA] = {{EVO_LEVEL, 30, SPECIES_SHARPEDO, 0}}, [SPECIES_TRAPINCH] = {{EVO_LEVEL, 35, SPECIES_VIBRAVA, 0}}, [SPECIES_VIBRAVA] = {{EVO_LEVEL, 45, SPECIES_FLYGON, 0}}, [SPECIES_MAKUHITA] = {{EVO_LEVEL, 24, SPECIES_HARIYAMA, 0}}, [SPECIES_ELECTRIKE] = {{EVO_LEVEL, 26, SPECIES_MANECTRIC, 0}}, [SPECIES_NUMEL] = {{EVO_LEVEL, 33, SPECIES_CAMERUPT, 0}}, [SPECIES_SPHEAL] = {{EVO_LEVEL, 32, SPECIES_SEALEO, 0}}, [SPECIES_SEALEO] = {{EVO_LEVEL, 44, SPECIES_WALREIN, 0}}, [SPECIES_CACNEA] = {{EVO_LEVEL, 32, SPECIES_CACTURNE, 0}}, [SPECIES_SNORUNT] = {{EVO_LEVEL, 42, SPECIES_GLALIE, 0}}, [SPECIES_AZURILL] = {{EVO_FRIENDSHIP, 0, SPECIES_MARILL, 0}}, [SPECIES_SPOINK] = {{EVO_LEVEL, 32, SPECIES_GRUMPIG, 0}}, [SPECIES_MEDITITE] = {{EVO_LEVEL, 37, SPECIES_MEDICHAM, 0}}, [SPECIES_SWABLU] = {{EVO_LEVEL, 35, SPECIES_ALTARIA, 0}}, [SPECIES_WYNAUT] = {{EVO_LEVEL, 15, SPECIES_WOBBUFFET, 0}}, [SPECIES_DUSKULL] = {{EVO_LEVEL, 37, SPECIES_DUSCLOPS, 0}}, [SPECIES_SLAKOTH] = {{EVO_LEVEL, 18, SPECIES_VIGOROTH, 0}}, [SPECIES_VIGOROTH] = {{EVO_LEVEL, 36, SPECIES_SLAKING, 0}}, [SPECIES_GULPIN] = {{EVO_LEVEL, 26, SPECIES_SWALOT, 0}}, [SPECIES_WHISMUR] = {{EVO_LEVEL, 20, SPECIES_LOUDRED, 0}}, [SPECIES_LOUDRED] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD, 0}}, [SPECIES_CLAMPERL] = {{EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL, 0}, {EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS, 0}, {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_HUNTAIL, ITEM_DEEP_SEA_TOOTH}, {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_GOREBYSS, ITEM_DEEP_SEA_SCALE}}, [SPECIES_SHUPPET] = {{EVO_LEVEL, 37, SPECIES_BANETTE, 0}}, [SPECIES_ARON] = {{EVO_LEVEL, 32, SPECIES_LAIRON, 0}}, [SPECIES_LAIRON] = {{EVO_LEVEL, 42, SPECIES_AGGRON, 0}}, [SPECIES_LILEEP] = {{EVO_LEVEL, 40, SPECIES_CRADILY, 0}}, [SPECIES_ANORITH] = {{EVO_LEVEL, 40, SPECIES_ARMALDO, 0}}, [SPECIES_RALTS] = {{EVO_LEVEL, 20, SPECIES_KIRLIA, 0}}, [SPECIES_KIRLIA] = {{EVO_LEVEL, 30, SPECIES_GARDEVOIR, 0}}, [SPECIES_BAGON] = {{EVO_LEVEL, 30, SPECIES_SHELGON, 0}}, [SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE, 0}}, [SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG, 0}}, [SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS, 0}}, }; ================================================ FILE: src/data/pokemon/experience_tables.h ================================================ #define SQUARE(n)((n) * (n)) #define CUBE(n)((n) * (n) * (n)) #define EXP_SLOW(n)((5 * CUBE(n)) / 4) // (5 * (n)^3) / 4 #define EXP_FAST(n)((4 * CUBE(n)) / 5) // (4 * (n)^3) / 5 #define EXP_MEDIUM_FAST(n)(CUBE(n)) // (n)^3 #define EXP_MEDIUM_SLOW(n)((6 * CUBE(n)) / 5 - (15 * SQUARE(n)) + (100 * n) - 140) // (6 * (n)^3) / 5 - (15 * (n)^2) + (100 * n) - 140 #define EXP_ERRATIC(n) \ (n <= 50) ? ((100 - n) * CUBE(n) / 50) \ :(n <= 68) ? ((150 - n) * CUBE(n) / 100) \ :(n <= 98) ? (((1911 - 10 * n) / 3) * CUBE(n) / 500) \ : ((160 - n) * CUBE(n) / 100) #define EXP_FLUCTUATING(n) \ (n <= 15) ? (((n + 1) / 3 + 24) * CUBE(n) / 50) \ :(n <= 36) ? ((n + 14) * CUBE(n) / 50) \ : (((n / 2) + 32) * CUBE(n) / 50) const u32 gExperienceTables[][MAX_LEVEL + 1] = { { // Medium Fast 0, // 0 1, // 1 EXP_MEDIUM_FAST(2), EXP_MEDIUM_FAST(3), EXP_MEDIUM_FAST(4), EXP_MEDIUM_FAST(5), EXP_MEDIUM_FAST(6), EXP_MEDIUM_FAST(7), EXP_MEDIUM_FAST(8), EXP_MEDIUM_FAST(9), EXP_MEDIUM_FAST(10), EXP_MEDIUM_FAST(11), EXP_MEDIUM_FAST(12), EXP_MEDIUM_FAST(13), EXP_MEDIUM_FAST(14), EXP_MEDIUM_FAST(15), EXP_MEDIUM_FAST(16), EXP_MEDIUM_FAST(17), EXP_MEDIUM_FAST(18), EXP_MEDIUM_FAST(19), EXP_MEDIUM_FAST(20), EXP_MEDIUM_FAST(21), EXP_MEDIUM_FAST(22), EXP_MEDIUM_FAST(23), EXP_MEDIUM_FAST(24), EXP_MEDIUM_FAST(25), EXP_MEDIUM_FAST(26), EXP_MEDIUM_FAST(27), EXP_MEDIUM_FAST(28), EXP_MEDIUM_FAST(29), EXP_MEDIUM_FAST(30), EXP_MEDIUM_FAST(31), EXP_MEDIUM_FAST(32), EXP_MEDIUM_FAST(33), EXP_MEDIUM_FAST(34), EXP_MEDIUM_FAST(35), EXP_MEDIUM_FAST(36), EXP_MEDIUM_FAST(37), EXP_MEDIUM_FAST(38), EXP_MEDIUM_FAST(39), EXP_MEDIUM_FAST(40), EXP_MEDIUM_FAST(41), EXP_MEDIUM_FAST(42), EXP_MEDIUM_FAST(43), EXP_MEDIUM_FAST(44), EXP_MEDIUM_FAST(45), EXP_MEDIUM_FAST(46), EXP_MEDIUM_FAST(47), EXP_MEDIUM_FAST(48), EXP_MEDIUM_FAST(49), EXP_MEDIUM_FAST(50), EXP_MEDIUM_FAST(51), EXP_MEDIUM_FAST(52), EXP_MEDIUM_FAST(53), EXP_MEDIUM_FAST(54), EXP_MEDIUM_FAST(55), EXP_MEDIUM_FAST(56), EXP_MEDIUM_FAST(57), EXP_MEDIUM_FAST(58), EXP_MEDIUM_FAST(59), EXP_MEDIUM_FAST(60), EXP_MEDIUM_FAST(61), EXP_MEDIUM_FAST(62), EXP_MEDIUM_FAST(63), EXP_MEDIUM_FAST(64), EXP_MEDIUM_FAST(65), EXP_MEDIUM_FAST(66), EXP_MEDIUM_FAST(67), EXP_MEDIUM_FAST(68), EXP_MEDIUM_FAST(69), EXP_MEDIUM_FAST(70), EXP_MEDIUM_FAST(71), EXP_MEDIUM_FAST(72), EXP_MEDIUM_FAST(73), EXP_MEDIUM_FAST(74), EXP_MEDIUM_FAST(75), EXP_MEDIUM_FAST(76), EXP_MEDIUM_FAST(77), EXP_MEDIUM_FAST(78), EXP_MEDIUM_FAST(79), EXP_MEDIUM_FAST(80), EXP_MEDIUM_FAST(81), EXP_MEDIUM_FAST(82), EXP_MEDIUM_FAST(83), EXP_MEDIUM_FAST(84), EXP_MEDIUM_FAST(85), EXP_MEDIUM_FAST(86), EXP_MEDIUM_FAST(87), EXP_MEDIUM_FAST(88), EXP_MEDIUM_FAST(89), EXP_MEDIUM_FAST(90), EXP_MEDIUM_FAST(91), EXP_MEDIUM_FAST(92), EXP_MEDIUM_FAST(93), EXP_MEDIUM_FAST(94), EXP_MEDIUM_FAST(95), EXP_MEDIUM_FAST(96), EXP_MEDIUM_FAST(97), EXP_MEDIUM_FAST(98), EXP_MEDIUM_FAST(99), EXP_MEDIUM_FAST(100), }, { // Erratic 0, // 0 1, // 1 EXP_ERRATIC(2), EXP_ERRATIC(3), EXP_ERRATIC(4), EXP_ERRATIC(5), EXP_ERRATIC(6), EXP_ERRATIC(7), EXP_ERRATIC(8), EXP_ERRATIC(9), EXP_ERRATIC(10), EXP_ERRATIC(11), EXP_ERRATIC(12), EXP_ERRATIC(13), EXP_ERRATIC(14), EXP_ERRATIC(15), EXP_ERRATIC(16), EXP_ERRATIC(17), EXP_ERRATIC(18), EXP_ERRATIC(19), EXP_ERRATIC(20), EXP_ERRATIC(21), EXP_ERRATIC(22), EXP_ERRATIC(23), EXP_ERRATIC(24), EXP_ERRATIC(25), EXP_ERRATIC(26), EXP_ERRATIC(27), EXP_ERRATIC(28), EXP_ERRATIC(29), EXP_ERRATIC(30), EXP_ERRATIC(31), EXP_ERRATIC(32), EXP_ERRATIC(33), EXP_ERRATIC(34), EXP_ERRATIC(35), EXP_ERRATIC(36), EXP_ERRATIC(37), EXP_ERRATIC(38), EXP_ERRATIC(39), EXP_ERRATIC(40), EXP_ERRATIC(41), EXP_ERRATIC(42), EXP_ERRATIC(43), EXP_ERRATIC(44), EXP_ERRATIC(45), EXP_ERRATIC(46), EXP_ERRATIC(47), EXP_ERRATIC(48), EXP_ERRATIC(49), EXP_ERRATIC(50), EXP_ERRATIC(51), EXP_ERRATIC(52), EXP_ERRATIC(53), EXP_ERRATIC(54), EXP_ERRATIC(55), EXP_ERRATIC(56), EXP_ERRATIC(57), EXP_ERRATIC(58), EXP_ERRATIC(59), EXP_ERRATIC(60), EXP_ERRATIC(61), EXP_ERRATIC(62), EXP_ERRATIC(63), EXP_ERRATIC(64), EXP_ERRATIC(65), EXP_ERRATIC(66), EXP_ERRATIC(67), EXP_ERRATIC(68), EXP_ERRATIC(69), EXP_ERRATIC(70), EXP_ERRATIC(71), EXP_ERRATIC(72), EXP_ERRATIC(73), EXP_ERRATIC(74), EXP_ERRATIC(75), EXP_ERRATIC(76), EXP_ERRATIC(77), EXP_ERRATIC(78), EXP_ERRATIC(79), EXP_ERRATIC(80), EXP_ERRATIC(81), EXP_ERRATIC(82), EXP_ERRATIC(83), EXP_ERRATIC(84), EXP_ERRATIC(85), EXP_ERRATIC(86), EXP_ERRATIC(87), EXP_ERRATIC(88), EXP_ERRATIC(89), EXP_ERRATIC(90), EXP_ERRATIC(91), EXP_ERRATIC(92), EXP_ERRATIC(93), EXP_ERRATIC(94), EXP_ERRATIC(95), EXP_ERRATIC(96), EXP_ERRATIC(97), EXP_ERRATIC(98), EXP_ERRATIC(99), EXP_ERRATIC(100), }, { // Fluctuating 0, // 0 1, // 1 EXP_FLUCTUATING(2), EXP_FLUCTUATING(3), EXP_FLUCTUATING(4), EXP_FLUCTUATING(5), EXP_FLUCTUATING(6), EXP_FLUCTUATING(7), EXP_FLUCTUATING(8), EXP_FLUCTUATING(9), EXP_FLUCTUATING(10), EXP_FLUCTUATING(11), EXP_FLUCTUATING(12), EXP_FLUCTUATING(13), EXP_FLUCTUATING(14), EXP_FLUCTUATING(15), EXP_FLUCTUATING(16), EXP_FLUCTUATING(17), EXP_FLUCTUATING(18), EXP_FLUCTUATING(19), EXP_FLUCTUATING(20), EXP_FLUCTUATING(21), EXP_FLUCTUATING(22), EXP_FLUCTUATING(23), EXP_FLUCTUATING(24), EXP_FLUCTUATING(25), EXP_FLUCTUATING(26), EXP_FLUCTUATING(27), EXP_FLUCTUATING(28), EXP_FLUCTUATING(29), EXP_FLUCTUATING(30), EXP_FLUCTUATING(31), EXP_FLUCTUATING(32), EXP_FLUCTUATING(33), EXP_FLUCTUATING(34), EXP_FLUCTUATING(35), EXP_FLUCTUATING(36), EXP_FLUCTUATING(37), EXP_FLUCTUATING(38), EXP_FLUCTUATING(39), EXP_FLUCTUATING(40), EXP_FLUCTUATING(41), EXP_FLUCTUATING(42), EXP_FLUCTUATING(43), EXP_FLUCTUATING(44), EXP_FLUCTUATING(45), EXP_FLUCTUATING(46), EXP_FLUCTUATING(47), EXP_FLUCTUATING(48), EXP_FLUCTUATING(49), EXP_FLUCTUATING(50), EXP_FLUCTUATING(51), EXP_FLUCTUATING(52), EXP_FLUCTUATING(53), EXP_FLUCTUATING(54), EXP_FLUCTUATING(55), EXP_FLUCTUATING(56), EXP_FLUCTUATING(57), EXP_FLUCTUATING(58), EXP_FLUCTUATING(59), EXP_FLUCTUATING(60), EXP_FLUCTUATING(61), EXP_FLUCTUATING(62), EXP_FLUCTUATING(63), EXP_FLUCTUATING(64), EXP_FLUCTUATING(65), EXP_FLUCTUATING(66), EXP_FLUCTUATING(67), EXP_FLUCTUATING(68), EXP_FLUCTUATING(69), EXP_FLUCTUATING(70), EXP_FLUCTUATING(71), EXP_FLUCTUATING(72), EXP_FLUCTUATING(73), EXP_FLUCTUATING(74), EXP_FLUCTUATING(75), EXP_FLUCTUATING(76), EXP_FLUCTUATING(77), EXP_FLUCTUATING(78), EXP_FLUCTUATING(79), EXP_FLUCTUATING(80), EXP_FLUCTUATING(81), EXP_FLUCTUATING(82), EXP_FLUCTUATING(83), EXP_FLUCTUATING(84), EXP_FLUCTUATING(85), EXP_FLUCTUATING(86), EXP_FLUCTUATING(87), EXP_FLUCTUATING(88), EXP_FLUCTUATING(89), EXP_FLUCTUATING(90), EXP_FLUCTUATING(91), EXP_FLUCTUATING(92), EXP_FLUCTUATING(93), EXP_FLUCTUATING(94), EXP_FLUCTUATING(95), EXP_FLUCTUATING(96), EXP_FLUCTUATING(97), EXP_FLUCTUATING(98), EXP_FLUCTUATING(99), EXP_FLUCTUATING(100), }, { // Medium Slow 0, // 0 1, // 1 EXP_MEDIUM_SLOW(2), EXP_MEDIUM_SLOW(3), EXP_MEDIUM_SLOW(4), EXP_MEDIUM_SLOW(5), EXP_MEDIUM_SLOW(6), EXP_MEDIUM_SLOW(7), EXP_MEDIUM_SLOW(8), EXP_MEDIUM_SLOW(9), EXP_MEDIUM_SLOW(10), EXP_MEDIUM_SLOW(11), EXP_MEDIUM_SLOW(12), EXP_MEDIUM_SLOW(13), EXP_MEDIUM_SLOW(14), EXP_MEDIUM_SLOW(15), EXP_MEDIUM_SLOW(16), EXP_MEDIUM_SLOW(17), EXP_MEDIUM_SLOW(18), EXP_MEDIUM_SLOW(19), EXP_MEDIUM_SLOW(20), EXP_MEDIUM_SLOW(21), EXP_MEDIUM_SLOW(22), EXP_MEDIUM_SLOW(23), EXP_MEDIUM_SLOW(24), EXP_MEDIUM_SLOW(25), EXP_MEDIUM_SLOW(26), EXP_MEDIUM_SLOW(27), EXP_MEDIUM_SLOW(28), EXP_MEDIUM_SLOW(29), EXP_MEDIUM_SLOW(30), EXP_MEDIUM_SLOW(31), EXP_MEDIUM_SLOW(32), EXP_MEDIUM_SLOW(33), EXP_MEDIUM_SLOW(34), EXP_MEDIUM_SLOW(35), EXP_MEDIUM_SLOW(36), EXP_MEDIUM_SLOW(37), EXP_MEDIUM_SLOW(38), EXP_MEDIUM_SLOW(39), EXP_MEDIUM_SLOW(40), EXP_MEDIUM_SLOW(41), EXP_MEDIUM_SLOW(42), EXP_MEDIUM_SLOW(43), EXP_MEDIUM_SLOW(44), EXP_MEDIUM_SLOW(45), EXP_MEDIUM_SLOW(46), EXP_MEDIUM_SLOW(47), EXP_MEDIUM_SLOW(48), EXP_MEDIUM_SLOW(49), EXP_MEDIUM_SLOW(50), EXP_MEDIUM_SLOW(51), EXP_MEDIUM_SLOW(52), EXP_MEDIUM_SLOW(53), EXP_MEDIUM_SLOW(54), EXP_MEDIUM_SLOW(55), EXP_MEDIUM_SLOW(56), EXP_MEDIUM_SLOW(57), EXP_MEDIUM_SLOW(58), EXP_MEDIUM_SLOW(59), EXP_MEDIUM_SLOW(60), EXP_MEDIUM_SLOW(61), EXP_MEDIUM_SLOW(62), EXP_MEDIUM_SLOW(63), EXP_MEDIUM_SLOW(64), EXP_MEDIUM_SLOW(65), EXP_MEDIUM_SLOW(66), EXP_MEDIUM_SLOW(67), EXP_MEDIUM_SLOW(68), EXP_MEDIUM_SLOW(69), EXP_MEDIUM_SLOW(70), EXP_MEDIUM_SLOW(71), EXP_MEDIUM_SLOW(72), EXP_MEDIUM_SLOW(73), EXP_MEDIUM_SLOW(74), EXP_MEDIUM_SLOW(75), EXP_MEDIUM_SLOW(76), EXP_MEDIUM_SLOW(77), EXP_MEDIUM_SLOW(78), EXP_MEDIUM_SLOW(79), EXP_MEDIUM_SLOW(80), EXP_MEDIUM_SLOW(81), EXP_MEDIUM_SLOW(82), EXP_MEDIUM_SLOW(83), EXP_MEDIUM_SLOW(84), EXP_MEDIUM_SLOW(85), EXP_MEDIUM_SLOW(86), EXP_MEDIUM_SLOW(87), EXP_MEDIUM_SLOW(88), EXP_MEDIUM_SLOW(89), EXP_MEDIUM_SLOW(90), EXP_MEDIUM_SLOW(91), EXP_MEDIUM_SLOW(92), EXP_MEDIUM_SLOW(93), EXP_MEDIUM_SLOW(94), EXP_MEDIUM_SLOW(95), EXP_MEDIUM_SLOW(96), EXP_MEDIUM_SLOW(97), EXP_MEDIUM_SLOW(98), EXP_MEDIUM_SLOW(99), EXP_MEDIUM_SLOW(100), }, { // Fast 0, // 0 1, // 1 EXP_FAST(2), EXP_FAST(3), EXP_FAST(4), EXP_FAST(5), EXP_FAST(6), EXP_FAST(7), EXP_FAST(8), EXP_FAST(9), EXP_FAST(10), EXP_FAST(11), EXP_FAST(12), EXP_FAST(13), EXP_FAST(14), EXP_FAST(15), EXP_FAST(16), EXP_FAST(17), EXP_FAST(18), EXP_FAST(19), EXP_FAST(20), EXP_FAST(21), EXP_FAST(22), EXP_FAST(23), EXP_FAST(24), EXP_FAST(25), EXP_FAST(26), EXP_FAST(27), EXP_FAST(28), EXP_FAST(29), EXP_FAST(30), EXP_FAST(31), EXP_FAST(32), EXP_FAST(33), EXP_FAST(34), EXP_FAST(35), EXP_FAST(36), EXP_FAST(37), EXP_FAST(38), EXP_FAST(39), EXP_FAST(40), EXP_FAST(41), EXP_FAST(42), EXP_FAST(43), EXP_FAST(44), EXP_FAST(45), EXP_FAST(46), EXP_FAST(47), EXP_FAST(48), EXP_FAST(49), EXP_FAST(50), EXP_FAST(51), EXP_FAST(52), EXP_FAST(53), EXP_FAST(54), EXP_FAST(55), EXP_FAST(56), EXP_FAST(57), EXP_FAST(58), EXP_FAST(59), EXP_FAST(60), EXP_FAST(61), EXP_FAST(62), EXP_FAST(63), EXP_FAST(64), EXP_FAST(65), EXP_FAST(66), EXP_FAST(67), EXP_FAST(68), EXP_FAST(69), EXP_FAST(70), EXP_FAST(71), EXP_FAST(72), EXP_FAST(73), EXP_FAST(74), EXP_FAST(75), EXP_FAST(76), EXP_FAST(77), EXP_FAST(78), EXP_FAST(79), EXP_FAST(80), EXP_FAST(81), EXP_FAST(82), EXP_FAST(83), EXP_FAST(84), EXP_FAST(85), EXP_FAST(86), EXP_FAST(87), EXP_FAST(88), EXP_FAST(89), EXP_FAST(90), EXP_FAST(91), EXP_FAST(92), EXP_FAST(93), EXP_FAST(94), EXP_FAST(95), EXP_FAST(96), EXP_FAST(97), EXP_FAST(98), EXP_FAST(99), EXP_FAST(100), }, { // Slow 0, // 0 1, // 1 EXP_SLOW(2), EXP_SLOW(3), EXP_SLOW(4), EXP_SLOW(5), EXP_SLOW(6), EXP_SLOW(7), EXP_SLOW(8), EXP_SLOW(9), EXP_SLOW(10), EXP_SLOW(11), EXP_SLOW(12), EXP_SLOW(13), EXP_SLOW(14), EXP_SLOW(15), EXP_SLOW(16), EXP_SLOW(17), EXP_SLOW(18), EXP_SLOW(19), EXP_SLOW(20), EXP_SLOW(21), EXP_SLOW(22), EXP_SLOW(23), EXP_SLOW(24), EXP_SLOW(25), EXP_SLOW(26), EXP_SLOW(27), EXP_SLOW(28), EXP_SLOW(29), EXP_SLOW(30), EXP_SLOW(31), EXP_SLOW(32), EXP_SLOW(33), EXP_SLOW(34), EXP_SLOW(35), EXP_SLOW(36), EXP_SLOW(37), EXP_SLOW(38), EXP_SLOW(39), EXP_SLOW(40), EXP_SLOW(41), EXP_SLOW(42), EXP_SLOW(43), EXP_SLOW(44), EXP_SLOW(45), EXP_SLOW(46), EXP_SLOW(47), EXP_SLOW(48), EXP_SLOW(49), EXP_SLOW(50), EXP_SLOW(51), EXP_SLOW(52), EXP_SLOW(53), EXP_SLOW(54), EXP_SLOW(55), EXP_SLOW(56), EXP_SLOW(57), EXP_SLOW(58), EXP_SLOW(59), EXP_SLOW(60), EXP_SLOW(61), EXP_SLOW(62), EXP_SLOW(63), EXP_SLOW(64), EXP_SLOW(65), EXP_SLOW(66), EXP_SLOW(67), EXP_SLOW(68), EXP_SLOW(69), EXP_SLOW(70), EXP_SLOW(71), EXP_SLOW(72), EXP_SLOW(73), EXP_SLOW(74), EXP_SLOW(75), EXP_SLOW(76), EXP_SLOW(77), EXP_SLOW(78), EXP_SLOW(79), EXP_SLOW(80), EXP_SLOW(81), EXP_SLOW(82), EXP_SLOW(83), EXP_SLOW(84), EXP_SLOW(85), EXP_SLOW(86), EXP_SLOW(87), EXP_SLOW(88), EXP_SLOW(89), EXP_SLOW(90), EXP_SLOW(91), EXP_SLOW(92), EXP_SLOW(93), EXP_SLOW(94), EXP_SLOW(95), EXP_SLOW(96), EXP_SLOW(97), EXP_SLOW(98), EXP_SLOW(99), EXP_SLOW(100), }, { // Medium Fast copy 2 (unused? to-do: investigate) 0, // 0 1, // 1 EXP_MEDIUM_FAST(2), EXP_MEDIUM_FAST(3), EXP_MEDIUM_FAST(4), EXP_MEDIUM_FAST(5), EXP_MEDIUM_FAST(6), EXP_MEDIUM_FAST(7), EXP_MEDIUM_FAST(8), EXP_MEDIUM_FAST(9), EXP_MEDIUM_FAST(10), EXP_MEDIUM_FAST(11), EXP_MEDIUM_FAST(12), EXP_MEDIUM_FAST(13), EXP_MEDIUM_FAST(14), EXP_MEDIUM_FAST(15), EXP_MEDIUM_FAST(16), EXP_MEDIUM_FAST(17), EXP_MEDIUM_FAST(18), EXP_MEDIUM_FAST(19), EXP_MEDIUM_FAST(20), EXP_MEDIUM_FAST(21), EXP_MEDIUM_FAST(22), EXP_MEDIUM_FAST(23), EXP_MEDIUM_FAST(24), EXP_MEDIUM_FAST(25), EXP_MEDIUM_FAST(26), EXP_MEDIUM_FAST(27), EXP_MEDIUM_FAST(28), EXP_MEDIUM_FAST(29), EXP_MEDIUM_FAST(30), EXP_MEDIUM_FAST(31), EXP_MEDIUM_FAST(32), EXP_MEDIUM_FAST(33), EXP_MEDIUM_FAST(34), EXP_MEDIUM_FAST(35), EXP_MEDIUM_FAST(36), EXP_MEDIUM_FAST(37), EXP_MEDIUM_FAST(38), EXP_MEDIUM_FAST(39), EXP_MEDIUM_FAST(40), EXP_MEDIUM_FAST(41), EXP_MEDIUM_FAST(42), EXP_MEDIUM_FAST(43), EXP_MEDIUM_FAST(44), EXP_MEDIUM_FAST(45), EXP_MEDIUM_FAST(46), EXP_MEDIUM_FAST(47), EXP_MEDIUM_FAST(48), EXP_MEDIUM_FAST(49), EXP_MEDIUM_FAST(50), EXP_MEDIUM_FAST(51), EXP_MEDIUM_FAST(52), EXP_MEDIUM_FAST(53), EXP_MEDIUM_FAST(54), EXP_MEDIUM_FAST(55), EXP_MEDIUM_FAST(56), EXP_MEDIUM_FAST(57), EXP_MEDIUM_FAST(58), EXP_MEDIUM_FAST(59), EXP_MEDIUM_FAST(60), EXP_MEDIUM_FAST(61), EXP_MEDIUM_FAST(62), EXP_MEDIUM_FAST(63), EXP_MEDIUM_FAST(64), EXP_MEDIUM_FAST(65), EXP_MEDIUM_FAST(66), EXP_MEDIUM_FAST(67), EXP_MEDIUM_FAST(68), EXP_MEDIUM_FAST(69), EXP_MEDIUM_FAST(70), EXP_MEDIUM_FAST(71), EXP_MEDIUM_FAST(72), EXP_MEDIUM_FAST(73), EXP_MEDIUM_FAST(74), EXP_MEDIUM_FAST(75), EXP_MEDIUM_FAST(76), EXP_MEDIUM_FAST(77), EXP_MEDIUM_FAST(78), EXP_MEDIUM_FAST(79), EXP_MEDIUM_FAST(80), EXP_MEDIUM_FAST(81), EXP_MEDIUM_FAST(82), EXP_MEDIUM_FAST(83), EXP_MEDIUM_FAST(84), EXP_MEDIUM_FAST(85), EXP_MEDIUM_FAST(86), EXP_MEDIUM_FAST(87), EXP_MEDIUM_FAST(88), EXP_MEDIUM_FAST(89), EXP_MEDIUM_FAST(90), EXP_MEDIUM_FAST(91), EXP_MEDIUM_FAST(92), EXP_MEDIUM_FAST(93), EXP_MEDIUM_FAST(94), EXP_MEDIUM_FAST(95), EXP_MEDIUM_FAST(96), EXP_MEDIUM_FAST(97), EXP_MEDIUM_FAST(98), EXP_MEDIUM_FAST(99), EXP_MEDIUM_FAST(100), }, { // Medium Fast copy 3 (unused? to-do: investigate) 0, // 0 1, // 1 EXP_MEDIUM_FAST(2), EXP_MEDIUM_FAST(3), EXP_MEDIUM_FAST(4), EXP_MEDIUM_FAST(5), EXP_MEDIUM_FAST(6), EXP_MEDIUM_FAST(7), EXP_MEDIUM_FAST(8), EXP_MEDIUM_FAST(9), EXP_MEDIUM_FAST(10), EXP_MEDIUM_FAST(11), EXP_MEDIUM_FAST(12), EXP_MEDIUM_FAST(13), EXP_MEDIUM_FAST(14), EXP_MEDIUM_FAST(15), EXP_MEDIUM_FAST(16), EXP_MEDIUM_FAST(17), EXP_MEDIUM_FAST(18), EXP_MEDIUM_FAST(19), EXP_MEDIUM_FAST(20), EXP_MEDIUM_FAST(21), EXP_MEDIUM_FAST(22), EXP_MEDIUM_FAST(23), EXP_MEDIUM_FAST(24), EXP_MEDIUM_FAST(25), EXP_MEDIUM_FAST(26), EXP_MEDIUM_FAST(27), EXP_MEDIUM_FAST(28), EXP_MEDIUM_FAST(29), EXP_MEDIUM_FAST(30), EXP_MEDIUM_FAST(31), EXP_MEDIUM_FAST(32), EXP_MEDIUM_FAST(33), EXP_MEDIUM_FAST(34), EXP_MEDIUM_FAST(35), EXP_MEDIUM_FAST(36), EXP_MEDIUM_FAST(37), EXP_MEDIUM_FAST(38), EXP_MEDIUM_FAST(39), EXP_MEDIUM_FAST(40), EXP_MEDIUM_FAST(41), EXP_MEDIUM_FAST(42), EXP_MEDIUM_FAST(43), EXP_MEDIUM_FAST(44), EXP_MEDIUM_FAST(45), EXP_MEDIUM_FAST(46), EXP_MEDIUM_FAST(47), EXP_MEDIUM_FAST(48), EXP_MEDIUM_FAST(49), EXP_MEDIUM_FAST(50), EXP_MEDIUM_FAST(51), EXP_MEDIUM_FAST(52), EXP_MEDIUM_FAST(53), EXP_MEDIUM_FAST(54), EXP_MEDIUM_FAST(55), EXP_MEDIUM_FAST(56), EXP_MEDIUM_FAST(57), EXP_MEDIUM_FAST(58), EXP_MEDIUM_FAST(59), EXP_MEDIUM_FAST(60), EXP_MEDIUM_FAST(61), EXP_MEDIUM_FAST(62), EXP_MEDIUM_FAST(63), EXP_MEDIUM_FAST(64), EXP_MEDIUM_FAST(65), EXP_MEDIUM_FAST(66), EXP_MEDIUM_FAST(67), EXP_MEDIUM_FAST(68), EXP_MEDIUM_FAST(69), EXP_MEDIUM_FAST(70), EXP_MEDIUM_FAST(71), EXP_MEDIUM_FAST(72), EXP_MEDIUM_FAST(73), EXP_MEDIUM_FAST(74), EXP_MEDIUM_FAST(75), EXP_MEDIUM_FAST(76), EXP_MEDIUM_FAST(77), EXP_MEDIUM_FAST(78), EXP_MEDIUM_FAST(79), EXP_MEDIUM_FAST(80), EXP_MEDIUM_FAST(81), EXP_MEDIUM_FAST(82), EXP_MEDIUM_FAST(83), EXP_MEDIUM_FAST(84), EXP_MEDIUM_FAST(85), EXP_MEDIUM_FAST(86), EXP_MEDIUM_FAST(87), EXP_MEDIUM_FAST(88), EXP_MEDIUM_FAST(89), EXP_MEDIUM_FAST(90), EXP_MEDIUM_FAST(91), EXP_MEDIUM_FAST(92), EXP_MEDIUM_FAST(93), EXP_MEDIUM_FAST(94), EXP_MEDIUM_FAST(95), EXP_MEDIUM_FAST(96), EXP_MEDIUM_FAST(97), EXP_MEDIUM_FAST(98), EXP_MEDIUM_FAST(99), EXP_MEDIUM_FAST(100), } }; ================================================ FILE: src/data/pokemon/item_effects.h ================================================ static const u8 sItemEffect_Potion[7] = { [4] = ITEM4_HEAL_HP, [6] = 20, // Amount of HP to recover }; static const u8 sItemEffect_Antidote[6] = { [3] = ITEM3_POISON, }; static const u8 sItemEffect_BurnHeal[6] = { [3] = ITEM3_BURN, }; static const u8 sItemEffect_IceHeal[6] = { [3] = ITEM3_FREEZE, }; static const u8 sItemEffect_Awakening[6] = { [3] = ITEM3_SLEEP, }; static const u8 sItemEffect_ParalyzeHeal[6] = { [3] = ITEM3_PARALYSIS, }; static const u8 sItemEffect_FullRestore[7] = { [3] = ITEM3_STATUS_ALL, [4] = ITEM4_HEAL_HP, [6] = ITEM6_HEAL_HP_FULL, }; static const u8 sItemEffect_MaxPotion[7] = { [4] = ITEM4_HEAL_HP, [6] = ITEM6_HEAL_HP_FULL, }; static const u8 sItemEffect_HyperPotion[7] = { [4] = ITEM4_HEAL_HP, [6] = 200, // Amount of HP to recover }; static const u8 sItemEffect_SuperPotion[7] = { [4] = ITEM4_HEAL_HP, [6] = 50, // Amount of HP to recover }; static const u8 sItemEffect_FullHeal[6] = { [3] = ITEM3_STATUS_ALL, }; static const u8 sItemEffect_Revive[7] = { [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, [6] = ITEM6_HEAL_HP_HALF, }; static const u8 sItemEffect_MaxRevive[7] = { [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, [6] = ITEM6_HEAL_HP_FULL, }; static const u8 sItemEffect_FreshWater[7] = { [4] = ITEM4_HEAL_HP, [6] = 50, // Amount of HP to recover }; static const u8 sItemEffect_SodaPop[7] = { [4] = ITEM4_HEAL_HP, [6] = 60, // Amount of HP to recover }; static const u8 sItemEffect_Lemonade[7] = { [4] = ITEM4_HEAL_HP, [6] = 80, // Amount of HP to recover }; static const u8 sItemEffect_MoomooMilk[7] = { [4] = ITEM4_HEAL_HP, [6] = 100, // Amount of HP to recover }; static const u8 sItemEffect_EnergyPowder[10] = { [4] = ITEM4_HEAL_HP, [5] = ITEM5_FRIENDSHIP_ALL, [6] = 50, // Amount of HP to recover [7] = -5, // Friendship change, low [8] = -5, // Friendship change, mid [9] = -10, // Friendship change, high }; static const u8 sItemEffect_EnergyRoot[10] = { [4] = ITEM4_HEAL_HP, [5] = ITEM5_FRIENDSHIP_ALL, [6] = 200, // Amount of HP to recover [7] = -10, // Friendship change, low [8] = -10, // Friendship change, mid [9] = -15, // Friendship change, high }; static const u8 sItemEffect_HealPowder[9] = { [3] = ITEM3_STATUS_ALL, [5] = ITEM5_FRIENDSHIP_ALL, [6] = -5, // Friendship change, low [7] = -5, // Friendship change, mid [8] = -10, // Friendship change, high }; static const u8 sItemEffect_RevivalHerb[10] = { [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, [5] = ITEM5_FRIENDSHIP_ALL, [6] = ITEM6_HEAL_HP_FULL, [7] = -15, // Friendship change, low [8] = -15, // Friendship change, mid [9] = -20, // Friendship change, high }; static const u8 sItemEffect_Ether[7] = { [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL, [6] = 10, // Amount of PP to recover }; static const u8 sItemEffect_MaxEther[7] = { [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL, [6] = ITEM6_HEAL_PP_FULL, }; static const u8 sItemEffect_Elixir[7] = { [4] = ITEM4_HEAL_PP_ALL, [6] = 10, // Amount of PP to recover }; static const u8 sItemEffect_MaxElixir[7] = { [4] = ITEM4_HEAL_PP_ALL, [6] = ITEM6_HEAL_PP_FULL, }; static const u8 sItemEffect_LavaCookie[6] = { [3] = ITEM3_STATUS_ALL, }; static const u8 sItemEffect_BlueFlute[6] = { [3] = ITEM3_SLEEP, }; static const u8 sItemEffect_YellowFlute[6] = { [3] = ITEM3_CONFUSION, }; static const u8 sItemEffect_RedFlute[6] = { [0] = ITEM0_INFATUATION, }; static const u8 sItemEffect_BerryJuice[7] = { [4] = ITEM4_HEAL_HP, [6] = 20, // Amount of HP to recover }; static const u8 sItemEffect_SacredAsh[7] = { [0] = ITEM0_SACRED_ASH, [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, [6] = ITEM6_HEAL_HP_FULL, }; #define VITAMIN_FRIENDSHIP_CHANGE(i) \ [(i) + 0] = 5, /* Friendship change, low */ \ [(i) + 1] = 3, /* Friendship change, mid */ \ [(i) + 2] = 2 /* Friendship change, high */ static const u8 sItemEffect_HPUp[10] = { [4] = ITEM4_EV_HP, [5] = ITEM5_FRIENDSHIP_ALL, [6] = ITEM6_ADD_EV, VITAMIN_FRIENDSHIP_CHANGE(7), }; static const u8 sItemEffect_Protein[10] = { [4] = ITEM4_EV_ATK, [5] = ITEM5_FRIENDSHIP_ALL, [6] = ITEM6_ADD_EV, VITAMIN_FRIENDSHIP_CHANGE(7), }; static const u8 sItemEffect_Iron[10] = { [5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL, [6] = ITEM6_ADD_EV, VITAMIN_FRIENDSHIP_CHANGE(7), }; static const u8 sItemEffect_Carbos[10] = { [5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL, [6] = ITEM6_ADD_EV, VITAMIN_FRIENDSHIP_CHANGE(7), }; static const u8 sItemEffect_Calcium[10] = { [5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL, [6] = ITEM6_ADD_EV, VITAMIN_FRIENDSHIP_CHANGE(7), }; static const u8 sItemEffect_RareCandy[10] = { [3] = ITEM3_LEVEL_UP, [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, [5] = ITEM5_FRIENDSHIP_ALL, [6] = ITEM6_HEAL_HP_LVL_UP, VITAMIN_FRIENDSHIP_CHANGE(7), }; static const u8 sItemEffect_PPUp[9] = { [4] = ITEM4_PP_UP, [5] = ITEM5_FRIENDSHIP_ALL, VITAMIN_FRIENDSHIP_CHANGE(6), }; static const u8 sItemEffect_Zinc[10] = { [5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL, [6] = ITEM6_ADD_EV, VITAMIN_FRIENDSHIP_CHANGE(7), }; static const u8 sItemEffect_PPMax[9] = { [5] = ITEM5_PP_MAX | ITEM5_FRIENDSHIP_ALL, VITAMIN_FRIENDSHIP_CHANGE(6), }; #define STAT_BOOST_FRIENDSHIP_CHANGE \ [6] = 1, /* Friendship change, low */ \ [7] = 1 /* Friendship change, mid */ static const u8 sItemEffect_GuardSpec[8] = { [3] = ITEM3_GUARD_SPEC, [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, STAT_BOOST_FRIENDSHIP_CHANGE }; static const u8 sItemEffect_DireHit[8] = { [0] = 2 << 4, // ITEM0_DIRE_HIT [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, STAT_BOOST_FRIENDSHIP_CHANGE }; static const u8 sItemEffect_XAttack[8] = { [0] = 1, // ITEM0_X_ATTACK [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, STAT_BOOST_FRIENDSHIP_CHANGE }; static const u8 sItemEffect_XDefend[8] = { [1] = 1 << 4, /// ITEM1_X_DEFEND [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, STAT_BOOST_FRIENDSHIP_CHANGE, }; static const u8 sItemEffect_XSpeed[8] = { [1] = 1, // ITEM1_X_SPEED [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, STAT_BOOST_FRIENDSHIP_CHANGE, }; static const u8 sItemEffect_XAccuracy[8] = { [2] = 1 << 4, // ITEM2_X_ACCURACY [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, STAT_BOOST_FRIENDSHIP_CHANGE, }; static const u8 sItemEffect_XSpecial[8] = { [2] = 1, // ITEM2_X_SPATK [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, STAT_BOOST_FRIENDSHIP_CHANGE, }; static const u8 sItemEffect_SunStone[6] = { [4] = ITEM4_EVO_STONE, }; static const u8 sItemEffect_MoonStone[6] = { [4] = ITEM4_EVO_STONE, }; static const u8 sItemEffect_FireStone[6] = { [4] = ITEM4_EVO_STONE, }; static const u8 sItemEffect_ThunderStone[6] = { [4] = ITEM4_EVO_STONE, }; static const u8 sItemEffect_WaterStone[6] = { [4] = ITEM4_EVO_STONE, }; static const u8 sItemEffect_LeafStone[6] = { [4] = ITEM4_EVO_STONE, }; static const u8 sItemEffect_CheriBerry[6] = { [3] = ITEM3_PARALYSIS, }; static const u8 sItemEffect_ChestoBerry[6] = { [3] = ITEM3_SLEEP, }; static const u8 sItemEffect_PechaBerry[6] = { [3] = ITEM3_POISON, }; static const u8 sItemEffect_RawstBerry[6] = { [3] = ITEM3_BURN, }; static const u8 sItemEffect_AspearBerry[6] = { [3] = ITEM3_FREEZE, }; static const u8 sItemEffect_LeppaBerry[7] = { [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL, [6] = 10, // Amount of PP to recover }; static const u8 sItemEffect_OranBerry[7] = { [4] = ITEM4_HEAL_HP, [6] = 10, // Amount of HP to recover }; static const u8 sItemEffect_PersimBerry[6] = { [3] = ITEM3_CONFUSION, }; static const u8 sItemEffect_LumBerry[6] = { [3] = ITEM3_STATUS_ALL, }; static const u8 sItemEffect_SitrusBerry[7] = { [4] = ITEM4_HEAL_HP, [6] = 30, // Amount of HP to recover }; const u8 gItemEffect_PomegBerry[10] = { [4] = ITEM4_EV_HP, [5] = ITEM5_FRIENDSHIP_ALL, [6] = 201, [7] = 10, [8] = 5, [9] = 2, }; const u8 gItemEffect_KelpsyBerry[10] = { [4] = ITEM4_EV_ATK, [5] = ITEM5_FRIENDSHIP_ALL, [6] = 201, [7] = 10, [8] = 5, [9] = 2, }; const u8 gItemEffect_QualotBerry[10] = { [5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL, [6] = 201, [7] = 10, [8] = 5, [9] = 2, }; const u8 gItemEffect_HondewBerry[10] = { [5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL, [6] = 201, [7] = 10, [8] = 5, [9] = 2, }; const u8 gItemEffect_GrepaBerry[10] = { [5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL, [6] = 201, [7] = 10, [8] = 5, [9] = 2, }; const u8 gItemEffect_TamatoBerry[10] = { [5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL, [6] = 201, [7] = 10, [8] = 5, [9] = 2, }; static const u8 sItemEffect_LinkBracelet[6] = { [4] = ITEM4_EVO_STONE, }; const u8 *const gItemEffectTable[] = { [ITEM_POTION - ITEM_POTION] = sItemEffect_Potion, [ITEM_ANTIDOTE - ITEM_POTION] = sItemEffect_Antidote, [ITEM_BURN_HEAL - ITEM_POTION] = sItemEffect_BurnHeal, [ITEM_ICE_HEAL - ITEM_POTION] = sItemEffect_IceHeal, [ITEM_AWAKENING - ITEM_POTION] = sItemEffect_Awakening, [ITEM_PARALYZE_HEAL - ITEM_POTION] = sItemEffect_ParalyzeHeal, [ITEM_FULL_RESTORE - ITEM_POTION] = sItemEffect_FullRestore, [ITEM_MAX_POTION - ITEM_POTION] = sItemEffect_MaxPotion, [ITEM_HYPER_POTION - ITEM_POTION] = sItemEffect_HyperPotion, [ITEM_SUPER_POTION - ITEM_POTION] = sItemEffect_SuperPotion, [ITEM_FULL_HEAL - ITEM_POTION] = sItemEffect_FullHeal, [ITEM_REVIVE - ITEM_POTION] = sItemEffect_Revive, [ITEM_MAX_REVIVE - ITEM_POTION] = sItemEffect_MaxRevive, [ITEM_FRESH_WATER - ITEM_POTION] = sItemEffect_FreshWater, [ITEM_SODA_POP - ITEM_POTION] = sItemEffect_SodaPop, [ITEM_LEMONADE - ITEM_POTION] = sItemEffect_Lemonade, [ITEM_MOOMOO_MILK - ITEM_POTION] = sItemEffect_MoomooMilk, [ITEM_ENERGY_POWDER - ITEM_POTION] = sItemEffect_EnergyPowder, [ITEM_ENERGY_ROOT - ITEM_POTION] = sItemEffect_EnergyRoot, [ITEM_HEAL_POWDER - ITEM_POTION] = sItemEffect_HealPowder, [ITEM_REVIVAL_HERB - ITEM_POTION] = sItemEffect_RevivalHerb, [ITEM_ETHER - ITEM_POTION] = sItemEffect_Ether, [ITEM_MAX_ETHER - ITEM_POTION] = sItemEffect_MaxEther, [ITEM_ELIXIR - ITEM_POTION] = sItemEffect_Elixir, [ITEM_MAX_ELIXIR - ITEM_POTION] = sItemEffect_MaxElixir, [ITEM_LAVA_COOKIE - ITEM_POTION] = sItemEffect_LavaCookie, [ITEM_BLUE_FLUTE - ITEM_POTION] = sItemEffect_BlueFlute, [ITEM_YELLOW_FLUTE - ITEM_POTION] = sItemEffect_YellowFlute, [ITEM_RED_FLUTE - ITEM_POTION] = sItemEffect_RedFlute, [ITEM_BERRY_JUICE - ITEM_POTION] = sItemEffect_BerryJuice, [ITEM_SACRED_ASH - ITEM_POTION] = sItemEffect_SacredAsh, [ITEM_HP_UP - ITEM_POTION] = sItemEffect_HPUp, [ITEM_PROTEIN - ITEM_POTION] = sItemEffect_Protein, [ITEM_IRON - ITEM_POTION] = sItemEffect_Iron, [ITEM_CARBOS - ITEM_POTION] = sItemEffect_Carbos, [ITEM_CALCIUM - ITEM_POTION] = sItemEffect_Calcium, [ITEM_RARE_CANDY - ITEM_POTION] = sItemEffect_RareCandy, [ITEM_PP_UP - ITEM_POTION] = sItemEffect_PPUp, [ITEM_ZINC - ITEM_POTION] = sItemEffect_Zinc, [ITEM_PP_MAX - ITEM_POTION] = sItemEffect_PPMax, [ITEM_GUARD_SPEC - ITEM_POTION] = sItemEffect_GuardSpec, [ITEM_DIRE_HIT - ITEM_POTION] = sItemEffect_DireHit, [ITEM_X_ATTACK - ITEM_POTION] = sItemEffect_XAttack, [ITEM_X_DEFEND - ITEM_POTION] = sItemEffect_XDefend, [ITEM_X_SPEED - ITEM_POTION] = sItemEffect_XSpeed, [ITEM_X_ACCURACY - ITEM_POTION] = sItemEffect_XAccuracy, [ITEM_X_SPECIAL - ITEM_POTION] = sItemEffect_XSpecial, [ITEM_SUN_STONE - ITEM_POTION] = sItemEffect_SunStone, [ITEM_MOON_STONE - ITEM_POTION] = sItemEffect_MoonStone, [ITEM_FIRE_STONE - ITEM_POTION] = sItemEffect_FireStone, [ITEM_THUNDER_STONE - ITEM_POTION] = sItemEffect_ThunderStone, [ITEM_WATER_STONE - ITEM_POTION] = sItemEffect_WaterStone, [ITEM_LEAF_STONE - ITEM_POTION] = sItemEffect_LeafStone, [ITEM_CHERI_BERRY - ITEM_POTION] = sItemEffect_CheriBerry, [ITEM_CHESTO_BERRY - ITEM_POTION] = sItemEffect_ChestoBerry, [ITEM_PECHA_BERRY - ITEM_POTION] = sItemEffect_PechaBerry, [ITEM_RAWST_BERRY - ITEM_POTION] = sItemEffect_RawstBerry, [ITEM_ASPEAR_BERRY - ITEM_POTION] = sItemEffect_AspearBerry, [ITEM_LEPPA_BERRY - ITEM_POTION] = sItemEffect_LeppaBerry, [ITEM_ORAN_BERRY - ITEM_POTION] = sItemEffect_OranBerry, [ITEM_PERSIM_BERRY - ITEM_POTION] = sItemEffect_PersimBerry, [ITEM_LUM_BERRY - ITEM_POTION] = sItemEffect_LumBerry, [ITEM_SITRUS_BERRY - ITEM_POTION] = sItemEffect_SitrusBerry, [ITEM_POMEG_BERRY - ITEM_POTION] = gItemEffect_PomegBerry, [ITEM_KELPSY_BERRY - ITEM_POTION] = gItemEffect_KelpsyBerry, [ITEM_QUALOT_BERRY - ITEM_POTION] = gItemEffect_QualotBerry, [ITEM_HONDEW_BERRY - ITEM_POTION] = gItemEffect_HondewBerry, [ITEM_GREPA_BERRY - ITEM_POTION] = gItemEffect_GrepaBerry, [ITEM_TAMATO_BERRY - ITEM_POTION] = gItemEffect_TamatoBerry, [ITEM_LINK_BRACELET - ITEM_POTION] = sItemEffect_LinkBracelet, [LAST_BERRY_INDEX - ITEM_POTION] = NULL, }; ================================================ FILE: src/data/pokemon/level_up_learnset_pointers.h ================================================ const u16 *const gLevelUpLearnsets[NUM_SPECIES] = { [SPECIES_NONE] = sBulbasaurLevelUpLearnset, [SPECIES_BULBASAUR] = sBulbasaurLevelUpLearnset, [SPECIES_IVYSAUR] = sIvysaurLevelUpLearnset, [SPECIES_VENUSAUR] = sVenusaurLevelUpLearnset, [SPECIES_CHARMANDER] = sCharmanderLevelUpLearnset, [SPECIES_CHARMELEON] = sCharmeleonLevelUpLearnset, [SPECIES_CHARIZARD] = sCharizardLevelUpLearnset, [SPECIES_SQUIRTLE] = sSquirtleLevelUpLearnset, [SPECIES_WARTORTLE] = sWartortleLevelUpLearnset, [SPECIES_BLASTOISE] = sBlastoiseLevelUpLearnset, [SPECIES_CATERPIE] = sCaterpieLevelUpLearnset, [SPECIES_METAPOD] = sMetapodLevelUpLearnset, [SPECIES_BUTTERFREE] = sButterfreeLevelUpLearnset, [SPECIES_WEEDLE] = sWeedleLevelUpLearnset, [SPECIES_KAKUNA] = sKakunaLevelUpLearnset, [SPECIES_BEEDRILL] = sBeedrillLevelUpLearnset, [SPECIES_PIDGEY] = sPidgeyLevelUpLearnset, [SPECIES_PIDGEOTTO] = sPidgeottoLevelUpLearnset, [SPECIES_PIDGEOT] = sPidgeotLevelUpLearnset, [SPECIES_RATTATA] = sRattataLevelUpLearnset, [SPECIES_RATICATE] = sRaticateLevelUpLearnset, [SPECIES_SPEAROW] = sSpearowLevelUpLearnset, [SPECIES_FEAROW] = sFearowLevelUpLearnset, [SPECIES_EKANS] = sEkansLevelUpLearnset, [SPECIES_ARBOK] = sArbokLevelUpLearnset, [SPECIES_PIKACHU] = sPikachuLevelUpLearnset, [SPECIES_RAICHU] = sRaichuLevelUpLearnset, [SPECIES_SANDSHREW] = sSandshrewLevelUpLearnset, [SPECIES_SANDSLASH] = sSandslashLevelUpLearnset, [SPECIES_NIDORAN_F] = sNidoranFLevelUpLearnset, [SPECIES_NIDORINA] = sNidorinaLevelUpLearnset, [SPECIES_NIDOQUEEN] = sNidoqueenLevelUpLearnset, [SPECIES_NIDORAN_M] = sNidoranMLevelUpLearnset, [SPECIES_NIDORINO] = sNidorinoLevelUpLearnset, [SPECIES_NIDOKING] = sNidokingLevelUpLearnset, [SPECIES_CLEFAIRY] = sClefairyLevelUpLearnset, [SPECIES_CLEFABLE] = sClefableLevelUpLearnset, [SPECIES_VULPIX] = sVulpixLevelUpLearnset, [SPECIES_NINETALES] = sNinetalesLevelUpLearnset, [SPECIES_JIGGLYPUFF] = sJigglypuffLevelUpLearnset, [SPECIES_WIGGLYTUFF] = sWigglytuffLevelUpLearnset, [SPECIES_ZUBAT] = sZubatLevelUpLearnset, [SPECIES_GOLBAT] = sGolbatLevelUpLearnset, [SPECIES_ODDISH] = sOddishLevelUpLearnset, [SPECIES_GLOOM] = sGloomLevelUpLearnset, [SPECIES_VILEPLUME] = sVileplumeLevelUpLearnset, [SPECIES_PARAS] = sParasLevelUpLearnset, [SPECIES_PARASECT] = sParasectLevelUpLearnset, [SPECIES_VENONAT] = sVenonatLevelUpLearnset, [SPECIES_VENOMOTH] = sVenomothLevelUpLearnset, [SPECIES_DIGLETT] = sDiglettLevelUpLearnset, [SPECIES_DUGTRIO] = sDugtrioLevelUpLearnset, [SPECIES_MEOWTH] = sMeowthLevelUpLearnset, [SPECIES_PERSIAN] = sPersianLevelUpLearnset, [SPECIES_PSYDUCK] = sPsyduckLevelUpLearnset, [SPECIES_GOLDUCK] = sGolduckLevelUpLearnset, [SPECIES_MANKEY] = sMankeyLevelUpLearnset, [SPECIES_PRIMEAPE] = sPrimeapeLevelUpLearnset, [SPECIES_GROWLITHE] = sGrowlitheLevelUpLearnset, [SPECIES_ARCANINE] = sArcanineLevelUpLearnset, [SPECIES_POLIWAG] = sPoliwagLevelUpLearnset, [SPECIES_POLIWHIRL] = sPoliwhirlLevelUpLearnset, [SPECIES_POLIWRATH] = sPoliwrathLevelUpLearnset, [SPECIES_ABRA] = sAbraLevelUpLearnset, [SPECIES_KADABRA] = sKadabraLevelUpLearnset, [SPECIES_ALAKAZAM] = sAlakazamLevelUpLearnset, [SPECIES_MACHOP] = sMachopLevelUpLearnset, [SPECIES_MACHOKE] = sMachokeLevelUpLearnset, [SPECIES_MACHAMP] = sMachampLevelUpLearnset, [SPECIES_BELLSPROUT] = sBellsproutLevelUpLearnset, [SPECIES_WEEPINBELL] = sWeepinbellLevelUpLearnset, [SPECIES_VICTREEBEL] = sVictreebelLevelUpLearnset, [SPECIES_TENTACOOL] = sTentacoolLevelUpLearnset, [SPECIES_TENTACRUEL] = sTentacruelLevelUpLearnset, [SPECIES_GEODUDE] = sGeodudeLevelUpLearnset, [SPECIES_GRAVELER] = sGravelerLevelUpLearnset, [SPECIES_GOLEM] = sGolemLevelUpLearnset, [SPECIES_PONYTA] = sPonytaLevelUpLearnset, [SPECIES_RAPIDASH] = sRapidashLevelUpLearnset, [SPECIES_SLOWPOKE] = sSlowpokeLevelUpLearnset, [SPECIES_SLOWBRO] = sSlowbroLevelUpLearnset, [SPECIES_MAGNEMITE] = sMagnemiteLevelUpLearnset, [SPECIES_MAGNETON] = sMagnetonLevelUpLearnset, [SPECIES_FARFETCHD] = sFarfetchdLevelUpLearnset, [SPECIES_DODUO] = sDoduoLevelUpLearnset, [SPECIES_DODRIO] = sDodrioLevelUpLearnset, [SPECIES_SEEL] = sSeelLevelUpLearnset, [SPECIES_DEWGONG] = sDewgongLevelUpLearnset, [SPECIES_GRIMER] = sGrimerLevelUpLearnset, [SPECIES_MUK] = sMukLevelUpLearnset, [SPECIES_SHELLDER] = sShellderLevelUpLearnset, [SPECIES_CLOYSTER] = sCloysterLevelUpLearnset, [SPECIES_GASTLY] = sGastlyLevelUpLearnset, [SPECIES_HAUNTER] = sHaunterLevelUpLearnset, [SPECIES_GENGAR] = sGengarLevelUpLearnset, [SPECIES_ONIX] = sOnixLevelUpLearnset, [SPECIES_DROWZEE] = sDrowzeeLevelUpLearnset, [SPECIES_HYPNO] = sHypnoLevelUpLearnset, [SPECIES_KRABBY] = sKrabbyLevelUpLearnset, [SPECIES_KINGLER] = sKinglerLevelUpLearnset, [SPECIES_VOLTORB] = sVoltorbLevelUpLearnset, [SPECIES_ELECTRODE] = sElectrodeLevelUpLearnset, [SPECIES_EXEGGCUTE] = sExeggcuteLevelUpLearnset, [SPECIES_EXEGGUTOR] = sExeggutorLevelUpLearnset, [SPECIES_CUBONE] = sCuboneLevelUpLearnset, [SPECIES_MAROWAK] = sMarowakLevelUpLearnset, [SPECIES_HITMONLEE] = sHitmonleeLevelUpLearnset, [SPECIES_HITMONCHAN] = sHitmonchanLevelUpLearnset, [SPECIES_LICKITUNG] = sLickitungLevelUpLearnset, [SPECIES_KOFFING] = sKoffingLevelUpLearnset, [SPECIES_WEEZING] = sWeezingLevelUpLearnset, [SPECIES_RHYHORN] = sRhyhornLevelUpLearnset, [SPECIES_RHYDON] = sRhydonLevelUpLearnset, [SPECIES_CHANSEY] = sChanseyLevelUpLearnset, [SPECIES_TANGELA] = sTangelaLevelUpLearnset, [SPECIES_KANGASKHAN] = sKangaskhanLevelUpLearnset, [SPECIES_HORSEA] = sHorseaLevelUpLearnset, [SPECIES_SEADRA] = sSeadraLevelUpLearnset, [SPECIES_GOLDEEN] = sGoldeenLevelUpLearnset, [SPECIES_SEAKING] = sSeakingLevelUpLearnset, [SPECIES_STARYU] = sStaryuLevelUpLearnset, [SPECIES_STARMIE] = sStarmieLevelUpLearnset, [SPECIES_MR_MIME] = sMrMimeLevelUpLearnset, [SPECIES_SCYTHER] = sScytherLevelUpLearnset, [SPECIES_JYNX] = sJynxLevelUpLearnset, [SPECIES_ELECTABUZZ] = sElectabuzzLevelUpLearnset, [SPECIES_MAGMAR] = sMagmarLevelUpLearnset, [SPECIES_PINSIR] = sPinsirLevelUpLearnset, [SPECIES_TAUROS] = sTaurosLevelUpLearnset, [SPECIES_MAGIKARP] = sMagikarpLevelUpLearnset, [SPECIES_GYARADOS] = sGyaradosLevelUpLearnset, [SPECIES_LAPRAS] = sLaprasLevelUpLearnset, [SPECIES_DITTO] = sDittoLevelUpLearnset, [SPECIES_EEVEE] = sEeveeLevelUpLearnset, [SPECIES_VAPOREON] = sVaporeonLevelUpLearnset, [SPECIES_JOLTEON] = sJolteonLevelUpLearnset, [SPECIES_FLAREON] = sFlareonLevelUpLearnset, [SPECIES_PORYGON] = sPorygonLevelUpLearnset, [SPECIES_OMANYTE] = sOmanyteLevelUpLearnset, [SPECIES_OMASTAR] = sOmastarLevelUpLearnset, [SPECIES_KABUTO] = sKabutoLevelUpLearnset, [SPECIES_KABUTOPS] = sKabutopsLevelUpLearnset, [SPECIES_AERODACTYL] = sAerodactylLevelUpLearnset, [SPECIES_SNORLAX] = sSnorlaxLevelUpLearnset, [SPECIES_ARTICUNO] = sArticunoLevelUpLearnset, [SPECIES_ZAPDOS] = sZapdosLevelUpLearnset, [SPECIES_MOLTRES] = sMoltresLevelUpLearnset, [SPECIES_DRATINI] = sDratiniLevelUpLearnset, [SPECIES_DRAGONAIR] = sDragonairLevelUpLearnset, [SPECIES_DRAGONITE] = sDragoniteLevelUpLearnset, [SPECIES_MEWTWO] = sMewtwoLevelUpLearnset, [SPECIES_MEW] = sMewLevelUpLearnset, [SPECIES_CHIKORITA] = sChikoritaLevelUpLearnset, [SPECIES_BAYLEEF] = sBayleefLevelUpLearnset, [SPECIES_MEGANIUM] = sMeganiumLevelUpLearnset, [SPECIES_CYNDAQUIL] = sCyndaquilLevelUpLearnset, [SPECIES_QUILAVA] = sQuilavaLevelUpLearnset, [SPECIES_TYPHLOSION] = sTyphlosionLevelUpLearnset, [SPECIES_TOTODILE] = sTotodileLevelUpLearnset, [SPECIES_CROCONAW] = sCroconawLevelUpLearnset, [SPECIES_FERALIGATR] = sFeraligatrLevelUpLearnset, [SPECIES_SENTRET] = sSentretLevelUpLearnset, [SPECIES_FURRET] = sFurretLevelUpLearnset, [SPECIES_HOOTHOOT] = sHoothootLevelUpLearnset, [SPECIES_NOCTOWL] = sNoctowlLevelUpLearnset, [SPECIES_LEDYBA] = sLedybaLevelUpLearnset, [SPECIES_LEDIAN] = sLedianLevelUpLearnset, [SPECIES_SPINARAK] = sSpinarakLevelUpLearnset, [SPECIES_ARIADOS] = sAriadosLevelUpLearnset, [SPECIES_CROBAT] = sCrobatLevelUpLearnset, [SPECIES_CHINCHOU] = sChinchouLevelUpLearnset, [SPECIES_LANTURN] = sLanturnLevelUpLearnset, [SPECIES_PICHU] = sPichuLevelUpLearnset, [SPECIES_CLEFFA] = sCleffaLevelUpLearnset, [SPECIES_IGGLYBUFF] = sIgglybuffLevelUpLearnset, [SPECIES_TOGEPI] = sTogepiLevelUpLearnset, [SPECIES_TOGETIC] = sTogeticLevelUpLearnset, [SPECIES_NATU] = sNatuLevelUpLearnset, [SPECIES_XATU] = sXatuLevelUpLearnset, [SPECIES_MAREEP] = sMareepLevelUpLearnset, [SPECIES_FLAAFFY] = sFlaaffyLevelUpLearnset, [SPECIES_AMPHAROS] = sAmpharosLevelUpLearnset, [SPECIES_BELLOSSOM] = sBellossomLevelUpLearnset, [SPECIES_MARILL] = sMarillLevelUpLearnset, [SPECIES_AZUMARILL] = sAzumarillLevelUpLearnset, [SPECIES_SUDOWOODO] = sSudowoodoLevelUpLearnset, [SPECIES_POLITOED] = sPolitoedLevelUpLearnset, [SPECIES_HOPPIP] = sHoppipLevelUpLearnset, [SPECIES_SKIPLOOM] = sSkiploomLevelUpLearnset, [SPECIES_JUMPLUFF] = sJumpluffLevelUpLearnset, [SPECIES_AIPOM] = sAipomLevelUpLearnset, [SPECIES_SUNKERN] = sSunkernLevelUpLearnset, [SPECIES_SUNFLORA] = sSunfloraLevelUpLearnset, [SPECIES_YANMA] = sYanmaLevelUpLearnset, [SPECIES_WOOPER] = sWooperLevelUpLearnset, [SPECIES_QUAGSIRE] = sQuagsireLevelUpLearnset, [SPECIES_ESPEON] = sEspeonLevelUpLearnset, [SPECIES_UMBREON] = sUmbreonLevelUpLearnset, [SPECIES_MURKROW] = sMurkrowLevelUpLearnset, [SPECIES_SLOWKING] = sSlowkingLevelUpLearnset, [SPECIES_MISDREAVUS] = sMisdreavusLevelUpLearnset, [SPECIES_UNOWN] = sUnownLevelUpLearnset, [SPECIES_WOBBUFFET] = sWobbuffetLevelUpLearnset, [SPECIES_GIRAFARIG] = sGirafarigLevelUpLearnset, [SPECIES_PINECO] = sPinecoLevelUpLearnset, [SPECIES_FORRETRESS] = sForretressLevelUpLearnset, [SPECIES_DUNSPARCE] = sDunsparceLevelUpLearnset, [SPECIES_GLIGAR] = sGligarLevelUpLearnset, [SPECIES_STEELIX] = sSteelixLevelUpLearnset, [SPECIES_SNUBBULL] = sSnubbullLevelUpLearnset, [SPECIES_GRANBULL] = sGranbullLevelUpLearnset, [SPECIES_QWILFISH] = sQwilfishLevelUpLearnset, [SPECIES_SCIZOR] = sScizorLevelUpLearnset, [SPECIES_SHUCKLE] = sShuckleLevelUpLearnset, [SPECIES_HERACROSS] = sHeracrossLevelUpLearnset, [SPECIES_SNEASEL] = sSneaselLevelUpLearnset, [SPECIES_TEDDIURSA] = sTeddiursaLevelUpLearnset, [SPECIES_URSARING] = sUrsaringLevelUpLearnset, [SPECIES_SLUGMA] = sSlugmaLevelUpLearnset, [SPECIES_MAGCARGO] = sMagcargoLevelUpLearnset, [SPECIES_SWINUB] = sSwinubLevelUpLearnset, [SPECIES_PILOSWINE] = sPiloswineLevelUpLearnset, [SPECIES_CORSOLA] = sCorsolaLevelUpLearnset, [SPECIES_REMORAID] = sRemoraidLevelUpLearnset, [SPECIES_OCTILLERY] = sOctilleryLevelUpLearnset, [SPECIES_DELIBIRD] = sDelibirdLevelUpLearnset, [SPECIES_MANTINE] = sMantineLevelUpLearnset, [SPECIES_SKARMORY] = sSkarmoryLevelUpLearnset, [SPECIES_HOUNDOUR] = sHoundourLevelUpLearnset, [SPECIES_HOUNDOOM] = sHoundoomLevelUpLearnset, [SPECIES_KINGDRA] = sKingdraLevelUpLearnset, [SPECIES_PHANPY] = sPhanpyLevelUpLearnset, [SPECIES_DONPHAN] = sDonphanLevelUpLearnset, [SPECIES_PORYGON2] = sPorygon2LevelUpLearnset, [SPECIES_STANTLER] = sStantlerLevelUpLearnset, [SPECIES_SMEARGLE] = sSmeargleLevelUpLearnset, [SPECIES_TYROGUE] = sTyrogueLevelUpLearnset, [SPECIES_HITMONTOP] = sHitmontopLevelUpLearnset, [SPECIES_SMOOCHUM] = sSmoochumLevelUpLearnset, [SPECIES_ELEKID] = sElekidLevelUpLearnset, [SPECIES_MAGBY] = sMagbyLevelUpLearnset, [SPECIES_MILTANK] = sMiltankLevelUpLearnset, [SPECIES_BLISSEY] = sBlisseyLevelUpLearnset, [SPECIES_RAIKOU] = sRaikouLevelUpLearnset, [SPECIES_ENTEI] = sEnteiLevelUpLearnset, [SPECIES_SUICUNE] = sSuicuneLevelUpLearnset, [SPECIES_LARVITAR] = sLarvitarLevelUpLearnset, [SPECIES_PUPITAR] = sPupitarLevelUpLearnset, [SPECIES_TYRANITAR] = sTyranitarLevelUpLearnset, [SPECIES_LUGIA] = sLugiaLevelUpLearnset, [SPECIES_HO_OH] = sHoOhLevelUpLearnset, [SPECIES_CELEBI] = sCelebiLevelUpLearnset, [SPECIES_OLD_UNOWN_B] = sSpecies252LevelUpLearnset, [SPECIES_OLD_UNOWN_C] = sSpecies253LevelUpLearnset, [SPECIES_OLD_UNOWN_D] = sSpecies254LevelUpLearnset, [SPECIES_OLD_UNOWN_E] = sSpecies255LevelUpLearnset, [SPECIES_OLD_UNOWN_F] = sSpecies256LevelUpLearnset, [SPECIES_OLD_UNOWN_G] = sSpecies257LevelUpLearnset, [SPECIES_OLD_UNOWN_H] = sSpecies258LevelUpLearnset, [SPECIES_OLD_UNOWN_I] = sSpecies259LevelUpLearnset, [SPECIES_OLD_UNOWN_J] = sSpecies260LevelUpLearnset, [SPECIES_OLD_UNOWN_K] = sSpecies261LevelUpLearnset, [SPECIES_OLD_UNOWN_L] = sSpecies262LevelUpLearnset, [SPECIES_OLD_UNOWN_M] = sSpecies263LevelUpLearnset, [SPECIES_OLD_UNOWN_N] = sSpecies264LevelUpLearnset, [SPECIES_OLD_UNOWN_O] = sSpecies265LevelUpLearnset, [SPECIES_OLD_UNOWN_P] = sSpecies266LevelUpLearnset, [SPECIES_OLD_UNOWN_Q] = sSpecies267LevelUpLearnset, [SPECIES_OLD_UNOWN_R] = sSpecies268LevelUpLearnset, [SPECIES_OLD_UNOWN_S] = sSpecies269LevelUpLearnset, [SPECIES_OLD_UNOWN_T] = sSpecies270LevelUpLearnset, [SPECIES_OLD_UNOWN_U] = sSpecies271LevelUpLearnset, [SPECIES_OLD_UNOWN_V] = sSpecies272LevelUpLearnset, [SPECIES_OLD_UNOWN_W] = sSpecies273LevelUpLearnset, [SPECIES_OLD_UNOWN_X] = sSpecies274LevelUpLearnset, [SPECIES_OLD_UNOWN_Y] = sSpecies275LevelUpLearnset, [SPECIES_OLD_UNOWN_Z] = sSpecies276LevelUpLearnset, [SPECIES_TREECKO] = sTreeckoLevelUpLearnset, [SPECIES_GROVYLE] = sGrovyleLevelUpLearnset, [SPECIES_SCEPTILE] = sSceptileLevelUpLearnset, [SPECIES_TORCHIC] = sTorchicLevelUpLearnset, [SPECIES_COMBUSKEN] = sCombuskenLevelUpLearnset, [SPECIES_BLAZIKEN] = sBlazikenLevelUpLearnset, [SPECIES_MUDKIP] = sMudkipLevelUpLearnset, [SPECIES_MARSHTOMP] = sMarshtompLevelUpLearnset, [SPECIES_SWAMPERT] = sSwampertLevelUpLearnset, [SPECIES_POOCHYENA] = sPoochyenaLevelUpLearnset, [SPECIES_MIGHTYENA] = sMightyenaLevelUpLearnset, [SPECIES_ZIGZAGOON] = sZigzagoonLevelUpLearnset, [SPECIES_LINOONE] = sLinooneLevelUpLearnset, [SPECIES_WURMPLE] = sWurmpleLevelUpLearnset, [SPECIES_SILCOON] = sSilcoonLevelUpLearnset, [SPECIES_BEAUTIFLY] = sBeautiflyLevelUpLearnset, [SPECIES_CASCOON] = sCascoonLevelUpLearnset, [SPECIES_DUSTOX] = sDustoxLevelUpLearnset, [SPECIES_LOTAD] = sLotadLevelUpLearnset, [SPECIES_LOMBRE] = sLombreLevelUpLearnset, [SPECIES_LUDICOLO] = sLudicoloLevelUpLearnset, [SPECIES_SEEDOT] = sSeedotLevelUpLearnset, [SPECIES_NUZLEAF] = sNuzleafLevelUpLearnset, [SPECIES_SHIFTRY] = sShiftryLevelUpLearnset, [SPECIES_NINCADA] = sNincadaLevelUpLearnset, [SPECIES_NINJASK] = sNinjaskLevelUpLearnset, [SPECIES_SHEDINJA] = sShedinjaLevelUpLearnset, [SPECIES_TAILLOW] = sTaillowLevelUpLearnset, [SPECIES_SWELLOW] = sSwellowLevelUpLearnset, [SPECIES_SHROOMISH] = sShroomishLevelUpLearnset, [SPECIES_BRELOOM] = sBreloomLevelUpLearnset, [SPECIES_SPINDA] = sSpindaLevelUpLearnset, [SPECIES_WINGULL] = sWingullLevelUpLearnset, [SPECIES_PELIPPER] = sPelipperLevelUpLearnset, [SPECIES_SURSKIT] = sSurskitLevelUpLearnset, [SPECIES_MASQUERAIN] = sMasquerainLevelUpLearnset, [SPECIES_WAILMER] = sWailmerLevelUpLearnset, [SPECIES_WAILORD] = sWailordLevelUpLearnset, [SPECIES_SKITTY] = sSkittyLevelUpLearnset, [SPECIES_DELCATTY] = sDelcattyLevelUpLearnset, [SPECIES_KECLEON] = sKecleonLevelUpLearnset, [SPECIES_BALTOY] = sBaltoyLevelUpLearnset, [SPECIES_CLAYDOL] = sClaydolLevelUpLearnset, [SPECIES_NOSEPASS] = sNosepassLevelUpLearnset, [SPECIES_TORKOAL] = sTorkoalLevelUpLearnset, [SPECIES_SABLEYE] = sSableyeLevelUpLearnset, [SPECIES_BARBOACH] = sBarboachLevelUpLearnset, [SPECIES_WHISCASH] = sWhiscashLevelUpLearnset, [SPECIES_LUVDISC] = sLuvdiscLevelUpLearnset, [SPECIES_CORPHISH] = sCorphishLevelUpLearnset, [SPECIES_CRAWDAUNT] = sCrawdauntLevelUpLearnset, [SPECIES_FEEBAS] = sFeebasLevelUpLearnset, [SPECIES_MILOTIC] = sMiloticLevelUpLearnset, [SPECIES_CARVANHA] = sCarvanhaLevelUpLearnset, [SPECIES_SHARPEDO] = sSharpedoLevelUpLearnset, [SPECIES_TRAPINCH] = sTrapinchLevelUpLearnset, [SPECIES_VIBRAVA] = sVibravaLevelUpLearnset, [SPECIES_FLYGON] = sFlygonLevelUpLearnset, [SPECIES_MAKUHITA] = sMakuhitaLevelUpLearnset, [SPECIES_HARIYAMA] = sHariyamaLevelUpLearnset, [SPECIES_ELECTRIKE] = sElectrikeLevelUpLearnset, [SPECIES_MANECTRIC] = sManectricLevelUpLearnset, [SPECIES_NUMEL] = sNumelLevelUpLearnset, [SPECIES_CAMERUPT] = sCameruptLevelUpLearnset, [SPECIES_SPHEAL] = sSphealLevelUpLearnset, [SPECIES_SEALEO] = sSealeoLevelUpLearnset, [SPECIES_WALREIN] = sWalreinLevelUpLearnset, [SPECIES_CACNEA] = sCacneaLevelUpLearnset, [SPECIES_CACTURNE] = sCacturneLevelUpLearnset, [SPECIES_SNORUNT] = sSnoruntLevelUpLearnset, [SPECIES_GLALIE] = sGlalieLevelUpLearnset, [SPECIES_LUNATONE] = sLunatoneLevelUpLearnset, [SPECIES_SOLROCK] = sSolrockLevelUpLearnset, [SPECIES_AZURILL] = sAzurillLevelUpLearnset, [SPECIES_SPOINK] = sSpoinkLevelUpLearnset, [SPECIES_GRUMPIG] = sGrumpigLevelUpLearnset, [SPECIES_PLUSLE] = sPlusleLevelUpLearnset, [SPECIES_MINUN] = sMinunLevelUpLearnset, [SPECIES_MAWILE] = sMawileLevelUpLearnset, [SPECIES_MEDITITE] = sMedititeLevelUpLearnset, [SPECIES_MEDICHAM] = sMedichamLevelUpLearnset, [SPECIES_SWABLU] = sSwabluLevelUpLearnset, [SPECIES_ALTARIA] = sAltariaLevelUpLearnset, [SPECIES_WYNAUT] = sWynautLevelUpLearnset, [SPECIES_DUSKULL] = sDuskullLevelUpLearnset, [SPECIES_DUSCLOPS] = sDusclopsLevelUpLearnset, [SPECIES_ROSELIA] = sRoseliaLevelUpLearnset, [SPECIES_SLAKOTH] = sSlakothLevelUpLearnset, [SPECIES_VIGOROTH] = sVigorothLevelUpLearnset, [SPECIES_SLAKING] = sSlakingLevelUpLearnset, [SPECIES_GULPIN] = sGulpinLevelUpLearnset, [SPECIES_SWALOT] = sSwalotLevelUpLearnset, [SPECIES_TROPIUS] = sTropiusLevelUpLearnset, [SPECIES_WHISMUR] = sWhismurLevelUpLearnset, [SPECIES_LOUDRED] = sLoudredLevelUpLearnset, [SPECIES_EXPLOUD] = sExploudLevelUpLearnset, [SPECIES_CLAMPERL] = sClamperlLevelUpLearnset, [SPECIES_HUNTAIL] = sHuntailLevelUpLearnset, [SPECIES_GOREBYSS] = sGorebyssLevelUpLearnset, [SPECIES_ABSOL] = sAbsolLevelUpLearnset, [SPECIES_SHUPPET] = sShuppetLevelUpLearnset, [SPECIES_BANETTE] = sBanetteLevelUpLearnset, [SPECIES_SEVIPER] = sSeviperLevelUpLearnset, [SPECIES_ZANGOOSE] = sZangooseLevelUpLearnset, [SPECIES_RELICANTH] = sRelicanthLevelUpLearnset, [SPECIES_ARON] = sAronLevelUpLearnset, [SPECIES_LAIRON] = sLaironLevelUpLearnset, [SPECIES_AGGRON] = sAggronLevelUpLearnset, [SPECIES_CASTFORM] = sCastformLevelUpLearnset, [SPECIES_VOLBEAT] = sVolbeatLevelUpLearnset, [SPECIES_ILLUMISE] = sIllumiseLevelUpLearnset, [SPECIES_LILEEP] = sLileepLevelUpLearnset, [SPECIES_CRADILY] = sCradilyLevelUpLearnset, [SPECIES_ANORITH] = sAnorithLevelUpLearnset, [SPECIES_ARMALDO] = sArmaldoLevelUpLearnset, [SPECIES_RALTS] = sRaltsLevelUpLearnset, [SPECIES_KIRLIA] = sKirliaLevelUpLearnset, [SPECIES_GARDEVOIR] = sGardevoirLevelUpLearnset, [SPECIES_BAGON] = sBagonLevelUpLearnset, [SPECIES_SHELGON] = sShelgonLevelUpLearnset, [SPECIES_SALAMENCE] = sSalamenceLevelUpLearnset, [SPECIES_BELDUM] = sBeldumLevelUpLearnset, [SPECIES_METANG] = sMetangLevelUpLearnset, [SPECIES_METAGROSS] = sMetagrossLevelUpLearnset, [SPECIES_REGIROCK] = sRegirockLevelUpLearnset, [SPECIES_REGICE] = sRegiceLevelUpLearnset, [SPECIES_REGISTEEL] = sRegisteelLevelUpLearnset, [SPECIES_KYOGRE] = sKyogreLevelUpLearnset, [SPECIES_GROUDON] = sGroudonLevelUpLearnset, [SPECIES_RAYQUAZA] = sRayquazaLevelUpLearnset, [SPECIES_LATIAS] = sLatiasLevelUpLearnset, [SPECIES_LATIOS] = sLatiosLevelUpLearnset, [SPECIES_JIRACHI] = sJirachiLevelUpLearnset, [SPECIES_DEOXYS] = sDeoxysLevelUpLearnset, [SPECIES_CHIMECHO] = sChimechoLevelUpLearnset, }; ================================================ FILE: src/data/pokemon/level_up_learnsets.h ================================================ #define LEVEL_UP_MOVE(lvl, move) ((lvl << 9) | move) #define LEVEL_UP_END 0xFFFF static const u16 sBulbasaurLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(4, MOVE_GROWL), LEVEL_UP_MOVE(7, MOVE_LEECH_SEED), LEVEL_UP_MOVE(10, MOVE_VINE_WHIP), LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(20, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(25, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(32, MOVE_GROWTH), LEVEL_UP_MOVE(39, MOVE_SYNTHESIS), LEVEL_UP_MOVE(46, MOVE_SOLAR_BEAM), LEVEL_UP_END }; static const u16 sIvysaurLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_LEECH_SEED), LEVEL_UP_MOVE(4, MOVE_GROWL), LEVEL_UP_MOVE(7, MOVE_LEECH_SEED), LEVEL_UP_MOVE(10, MOVE_VINE_WHIP), LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(38, MOVE_GROWTH), LEVEL_UP_MOVE(47, MOVE_SYNTHESIS), LEVEL_UP_MOVE(56, MOVE_SOLAR_BEAM), LEVEL_UP_END }; static const u16 sVenusaurLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_LEECH_SEED), LEVEL_UP_MOVE(1, MOVE_VINE_WHIP), LEVEL_UP_MOVE(4, MOVE_GROWL), LEVEL_UP_MOVE(7, MOVE_LEECH_SEED), LEVEL_UP_MOVE(10, MOVE_VINE_WHIP), LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(41, MOVE_GROWTH), LEVEL_UP_MOVE(53, MOVE_SYNTHESIS), LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM), LEVEL_UP_END }; static const u16 sCharmanderLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(7, MOVE_EMBER), LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), LEVEL_UP_MOVE(19, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(25, MOVE_SCARY_FACE), LEVEL_UP_MOVE(31, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(37, MOVE_SLASH), LEVEL_UP_MOVE(43, MOVE_DRAGON_RAGE), LEVEL_UP_MOVE(49, MOVE_FIRE_SPIN), LEVEL_UP_END }; static const u16 sCharmeleonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(7, MOVE_EMBER), LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), LEVEL_UP_MOVE(20, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(27, MOVE_SCARY_FACE), LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(41, MOVE_SLASH), LEVEL_UP_MOVE(48, MOVE_DRAGON_RAGE), LEVEL_UP_MOVE(55, MOVE_FIRE_SPIN), LEVEL_UP_END }; static const u16 sCharizardLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HEAT_WAVE), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(1, MOVE_METAL_CLAW), LEVEL_UP_MOVE(7, MOVE_EMBER), LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), LEVEL_UP_MOVE(20, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(27, MOVE_SCARY_FACE), LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(36, MOVE_WING_ATTACK), LEVEL_UP_MOVE(44, MOVE_SLASH), LEVEL_UP_MOVE(54, MOVE_DRAGON_RAGE), LEVEL_UP_MOVE(64, MOVE_FIRE_SPIN), LEVEL_UP_END }; static const u16 sSquirtleLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(7, MOVE_BUBBLE), LEVEL_UP_MOVE(10, MOVE_WITHDRAW), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(18, MOVE_BITE), LEVEL_UP_MOVE(23, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(28, MOVE_PROTECT), LEVEL_UP_MOVE(33, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(40, MOVE_SKULL_BASH), LEVEL_UP_MOVE(47, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sWartortleLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(7, MOVE_BUBBLE), LEVEL_UP_MOVE(10, MOVE_WITHDRAW), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(19, MOVE_BITE), LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(31, MOVE_PROTECT), LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(45, MOVE_SKULL_BASH), LEVEL_UP_MOVE(53, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sBlastoiseLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(1, MOVE_WITHDRAW), LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(7, MOVE_BUBBLE), LEVEL_UP_MOVE(10, MOVE_WITHDRAW), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(19, MOVE_BITE), LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(31, MOVE_PROTECT), LEVEL_UP_MOVE(42, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(55, MOVE_SKULL_BASH), LEVEL_UP_MOVE(68, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sCaterpieLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_STRING_SHOT), LEVEL_UP_END }; static const u16 sMetapodLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_HARDEN), LEVEL_UP_END }; static const u16 sButterfreeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(10, MOVE_CONFUSION), LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), LEVEL_UP_MOVE(14, MOVE_STUN_SPORE), LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(18, MOVE_SUPERSONIC), LEVEL_UP_MOVE(23, MOVE_WHIRLWIND), LEVEL_UP_MOVE(28, MOVE_GUST), LEVEL_UP_MOVE(34, MOVE_PSYBEAM), LEVEL_UP_MOVE(40, MOVE_SAFEGUARD), LEVEL_UP_MOVE(47, MOVE_SILVER_WIND), LEVEL_UP_END }; static const u16 sWeedleLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(1, MOVE_STRING_SHOT), LEVEL_UP_END }; static const u16 sKakunaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_HARDEN), LEVEL_UP_END }; static const u16 sBeedrillLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(10, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(15, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(20, MOVE_TWINEEDLE), LEVEL_UP_MOVE(25, MOVE_RAGE), LEVEL_UP_MOVE(30, MOVE_PURSUIT), LEVEL_UP_MOVE(35, MOVE_PIN_MISSILE), LEVEL_UP_MOVE(40, MOVE_AGILITY), LEVEL_UP_MOVE(45, MOVE_ENDEAVOR), LEVEL_UP_END }; static const u16 sPidgeyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(5, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(9, MOVE_GUST), LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(19, MOVE_WHIRLWIND), LEVEL_UP_MOVE(25, MOVE_WING_ATTACK), LEVEL_UP_MOVE(31, MOVE_FEATHER_DANCE), LEVEL_UP_MOVE(39, MOVE_AGILITY), LEVEL_UP_MOVE(47, MOVE_MIRROR_MOVE), LEVEL_UP_END }; static const u16 sPidgeottoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(1, MOVE_GUST), LEVEL_UP_MOVE(5, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(9, MOVE_GUST), LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(20, MOVE_WHIRLWIND), LEVEL_UP_MOVE(27, MOVE_WING_ATTACK), LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE), LEVEL_UP_MOVE(43, MOVE_AGILITY), LEVEL_UP_MOVE(52, MOVE_MIRROR_MOVE), LEVEL_UP_END }; static const u16 sPidgeotLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(1, MOVE_GUST), LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(5, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(9, MOVE_GUST), LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(20, MOVE_WHIRLWIND), LEVEL_UP_MOVE(27, MOVE_WING_ATTACK), LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE), LEVEL_UP_MOVE(48, MOVE_AGILITY), LEVEL_UP_MOVE(62, MOVE_MIRROR_MOVE), LEVEL_UP_END }; static const u16 sRattataLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_HYPER_FANG), LEVEL_UP_MOVE(20, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(27, MOVE_PURSUIT), LEVEL_UP_MOVE(34, MOVE_SUPER_FANG), LEVEL_UP_MOVE(41, MOVE_ENDEAVOR), LEVEL_UP_END }; static const u16 sRaticateLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_HYPER_FANG), LEVEL_UP_MOVE(20, MOVE_SCARY_FACE), LEVEL_UP_MOVE(30, MOVE_PURSUIT), LEVEL_UP_MOVE(40, MOVE_SUPER_FANG), LEVEL_UP_MOVE(50, MOVE_ENDEAVOR), LEVEL_UP_END }; static const u16 sSpearowLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(7, MOVE_LEER), LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(19, MOVE_PURSUIT), LEVEL_UP_MOVE(25, MOVE_AERIAL_ACE), LEVEL_UP_MOVE(31, MOVE_MIRROR_MOVE), LEVEL_UP_MOVE(37, MOVE_DRILL_PECK), LEVEL_UP_MOVE(43, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sFearowLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(7, MOVE_LEER), LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(26, MOVE_PURSUIT), LEVEL_UP_MOVE(32, MOVE_MIRROR_MOVE), LEVEL_UP_MOVE(40, MOVE_DRILL_PECK), LEVEL_UP_MOVE(47, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sEkansLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WRAP), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(8, MOVE_POISON_STING), LEVEL_UP_MOVE(13, MOVE_BITE), LEVEL_UP_MOVE(20, MOVE_GLARE), LEVEL_UP_MOVE(25, MOVE_SCREECH), LEVEL_UP_MOVE(32, MOVE_ACID), LEVEL_UP_MOVE(37, MOVE_STOCKPILE), LEVEL_UP_MOVE(37, MOVE_SWALLOW), LEVEL_UP_MOVE(37, MOVE_SPIT_UP), LEVEL_UP_MOVE(44, MOVE_HAZE), LEVEL_UP_END }; static const u16 sArbokLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WRAP), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(8, MOVE_POISON_STING), LEVEL_UP_MOVE(13, MOVE_BITE), LEVEL_UP_MOVE(20, MOVE_GLARE), LEVEL_UP_MOVE(28, MOVE_SCREECH), LEVEL_UP_MOVE(38, MOVE_ACID), LEVEL_UP_MOVE(46, MOVE_STOCKPILE), LEVEL_UP_MOVE(46, MOVE_SWALLOW), LEVEL_UP_MOVE(46, MOVE_SPIT_UP), LEVEL_UP_MOVE(56, MOVE_HAZE), LEVEL_UP_END }; static const u16 sPikachuLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(15, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(20, MOVE_SLAM), LEVEL_UP_MOVE(26, MOVE_THUNDERBOLT), LEVEL_UP_MOVE(33, MOVE_AGILITY), LEVEL_UP_MOVE(41, MOVE_THUNDER), LEVEL_UP_MOVE(50, MOVE_LIGHT_SCREEN), LEVEL_UP_END }; static const u16 sRaichuLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(1, MOVE_THUNDERBOLT), LEVEL_UP_END }; static const u16 sSandshrewLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(6, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(17, MOVE_POISON_STING), LEVEL_UP_MOVE(23, MOVE_SLASH), LEVEL_UP_MOVE(30, MOVE_SWIFT), LEVEL_UP_MOVE(37, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(45, MOVE_SAND_TOMB), LEVEL_UP_MOVE(53, MOVE_SANDSTORM), LEVEL_UP_END }; static const u16 sSandslashLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(6, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(17, MOVE_POISON_STING), LEVEL_UP_MOVE(24, MOVE_SLASH), LEVEL_UP_MOVE(33, MOVE_SWIFT), LEVEL_UP_MOVE(42, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(52, MOVE_SAND_TOMB), LEVEL_UP_MOVE(62, MOVE_SANDSTORM), LEVEL_UP_END }; static const u16 sNidoranFLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(8, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(17, MOVE_POISON_STING), LEVEL_UP_MOVE(20, MOVE_BITE), LEVEL_UP_MOVE(23, MOVE_HELPING_HAND), LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(38, MOVE_FLATTER), LEVEL_UP_MOVE(47, MOVE_CRUNCH), LEVEL_UP_END }; static const u16 sNidorinaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(8, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(18, MOVE_POISON_STING), LEVEL_UP_MOVE(22, MOVE_BITE), LEVEL_UP_MOVE(26, MOVE_HELPING_HAND), LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(43, MOVE_FLATTER), LEVEL_UP_MOVE(53, MOVE_CRUNCH), LEVEL_UP_END }; static const u16 sNidoqueenLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(22, MOVE_BODY_SLAM), LEVEL_UP_MOVE(43, MOVE_SUPERPOWER), LEVEL_UP_END }; static const u16 sNidoranMLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(8, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(17, MOVE_POISON_STING), LEVEL_UP_MOVE(20, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(23, MOVE_HELPING_HAND), LEVEL_UP_MOVE(30, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(38, MOVE_FLATTER), LEVEL_UP_MOVE(47, MOVE_HORN_DRILL), LEVEL_UP_END }; static const u16 sNidorinoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(8, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(18, MOVE_POISON_STING), LEVEL_UP_MOVE(22, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(26, MOVE_HELPING_HAND), LEVEL_UP_MOVE(34, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(43, MOVE_FLATTER), LEVEL_UP_MOVE(53, MOVE_HORN_DRILL), LEVEL_UP_END }; static const u16 sNidokingLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(1, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(22, MOVE_THRASH), LEVEL_UP_MOVE(43, MOVE_MEGAHORN), LEVEL_UP_END }; static const u16 sClefairyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(5, MOVE_ENCORE), LEVEL_UP_MOVE(9, MOVE_SING), LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(17, MOVE_FOLLOW_ME), LEVEL_UP_MOVE(21, MOVE_MINIMIZE), LEVEL_UP_MOVE(25, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(29, MOVE_METRONOME), LEVEL_UP_MOVE(33, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(37, MOVE_MOONLIGHT), LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(45, MOVE_METEOR_MASH), LEVEL_UP_END }; static const u16 sClefableLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SING), LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(1, MOVE_MINIMIZE), LEVEL_UP_MOVE(1, MOVE_METRONOME), LEVEL_UP_END }; static const u16 sVulpixLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(9, MOVE_ROAR), LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(17, MOVE_WILL_O_WISP), LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(25, MOVE_IMPRISON), LEVEL_UP_MOVE(29, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(33, MOVE_SAFEGUARD), LEVEL_UP_MOVE(37, MOVE_GRUDGE), LEVEL_UP_MOVE(41, MOVE_FIRE_SPIN), LEVEL_UP_END }; static const u16 sNinetalesLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(1, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(1, MOVE_SAFEGUARD), LEVEL_UP_MOVE(45, MOVE_FIRE_SPIN), LEVEL_UP_END }; static const u16 sJigglypuffLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SING), LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(9, MOVE_POUND), LEVEL_UP_MOVE(14, MOVE_DISABLE), LEVEL_UP_MOVE(19, MOVE_ROLLOUT), LEVEL_UP_MOVE(24, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(29, MOVE_REST), LEVEL_UP_MOVE(34, MOVE_BODY_SLAM), LEVEL_UP_MOVE(39, MOVE_MIMIC), LEVEL_UP_MOVE(44, MOVE_HYPER_VOICE), LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sWigglytuffLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SING), LEVEL_UP_MOVE(1, MOVE_DISABLE), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP), LEVEL_UP_END }; static const u16 sZubatLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(6, MOVE_ASTONISH), LEVEL_UP_MOVE(11, MOVE_SUPERSONIC), LEVEL_UP_MOVE(16, MOVE_BITE), LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), LEVEL_UP_MOVE(26, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(31, MOVE_AIR_CUTTER), LEVEL_UP_MOVE(36, MOVE_MEAN_LOOK), LEVEL_UP_MOVE(41, MOVE_POISON_FANG), LEVEL_UP_MOVE(46, MOVE_HAZE), LEVEL_UP_END }; static const u16 sGolbatLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCREECH), LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(1, MOVE_SUPERSONIC), LEVEL_UP_MOVE(6, MOVE_ASTONISH), LEVEL_UP_MOVE(11, MOVE_SUPERSONIC), LEVEL_UP_MOVE(16, MOVE_BITE), LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER), LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK), LEVEL_UP_MOVE(49, MOVE_POISON_FANG), LEVEL_UP_MOVE(56, MOVE_HAZE), LEVEL_UP_END }; static const u16 sOddishLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(7, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(14, MOVE_POISON_POWDER), LEVEL_UP_MOVE(16, MOVE_STUN_SPORE), LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(23, MOVE_ACID), LEVEL_UP_MOVE(32, MOVE_MOONLIGHT), LEVEL_UP_MOVE(39, MOVE_PETAL_DANCE), LEVEL_UP_END }; static const u16 sGloomLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(1, MOVE_POISON_POWDER), LEVEL_UP_MOVE(7, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(14, MOVE_POISON_POWDER), LEVEL_UP_MOVE(16, MOVE_STUN_SPORE), LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(24, MOVE_ACID), LEVEL_UP_MOVE(35, MOVE_MOONLIGHT), LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE), LEVEL_UP_END }; static const u16 sVileplumeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_AROMATHERAPY), LEVEL_UP_MOVE(1, MOVE_STUN_SPORE), LEVEL_UP_MOVE(1, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE), LEVEL_UP_END }; static const u16 sParasLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(7, MOVE_STUN_SPORE), LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(25, MOVE_SPORE), LEVEL_UP_MOVE(31, MOVE_SLASH), LEVEL_UP_MOVE(37, MOVE_GROWTH), LEVEL_UP_MOVE(43, MOVE_GIGA_DRAIN), LEVEL_UP_MOVE(49, MOVE_AROMATHERAPY), LEVEL_UP_END }; static const u16 sParasectLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_STUN_SPORE), LEVEL_UP_MOVE(1, MOVE_POISON_POWDER), LEVEL_UP_MOVE(7, MOVE_STUN_SPORE), LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(27, MOVE_SPORE), LEVEL_UP_MOVE(35, MOVE_SLASH), LEVEL_UP_MOVE(43, MOVE_GROWTH), LEVEL_UP_MOVE(51, MOVE_GIGA_DRAIN), LEVEL_UP_MOVE(59, MOVE_AROMATHERAPY), LEVEL_UP_END }; static const u16 sVenonatLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_DISABLE), LEVEL_UP_MOVE(1, MOVE_FORESIGHT), LEVEL_UP_MOVE(9, MOVE_SUPERSONIC), LEVEL_UP_MOVE(17, MOVE_CONFUSION), LEVEL_UP_MOVE(20, MOVE_POISON_POWDER), LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(28, MOVE_STUN_SPORE), LEVEL_UP_MOVE(33, MOVE_PSYBEAM), LEVEL_UP_MOVE(36, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(41, MOVE_PSYCHIC), LEVEL_UP_END }; static const u16 sVenomothLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SILVER_WIND), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_DISABLE), LEVEL_UP_MOVE(1, MOVE_FORESIGHT), LEVEL_UP_MOVE(1, MOVE_SUPERSONIC), LEVEL_UP_MOVE(9, MOVE_SUPERSONIC), LEVEL_UP_MOVE(17, MOVE_CONFUSION), LEVEL_UP_MOVE(20, MOVE_POISON_POWDER), LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(28, MOVE_STUN_SPORE), LEVEL_UP_MOVE(31, MOVE_GUST), LEVEL_UP_MOVE(36, MOVE_PSYBEAM), LEVEL_UP_MOVE(42, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(52, MOVE_PSYCHIC), LEVEL_UP_END }; static const u16 sDiglettLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(5, MOVE_GROWL), LEVEL_UP_MOVE(9, MOVE_MAGNITUDE), LEVEL_UP_MOVE(17, MOVE_DIG), LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(25, MOVE_MUD_SLAP), LEVEL_UP_MOVE(33, MOVE_SLASH), LEVEL_UP_MOVE(41, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(49, MOVE_FISSURE), LEVEL_UP_END }; static const u16 sDugtrioLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TRI_ATTACK), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(5, MOVE_GROWL), LEVEL_UP_MOVE(9, MOVE_MAGNITUDE), LEVEL_UP_MOVE(17, MOVE_DIG), LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(25, MOVE_MUD_SLAP), LEVEL_UP_MOVE(26, MOVE_SAND_TOMB), LEVEL_UP_MOVE(38, MOVE_SLASH), LEVEL_UP_MOVE(51, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(64, MOVE_FISSURE), LEVEL_UP_END }; static const u16 sMeowthLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(10, MOVE_BITE), LEVEL_UP_MOVE(18, MOVE_PAY_DAY), LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(31, MOVE_SCREECH), LEVEL_UP_MOVE(36, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(40, MOVE_SLASH), LEVEL_UP_MOVE(43, MOVE_FAKE_OUT), LEVEL_UP_MOVE(45, MOVE_SWAGGER), LEVEL_UP_END }; static const u16 sPersianLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(10, MOVE_BITE), LEVEL_UP_MOVE(18, MOVE_PAY_DAY), LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(34, MOVE_SCREECH), LEVEL_UP_MOVE(42, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(49, MOVE_SLASH), LEVEL_UP_MOVE(55, MOVE_FAKE_OUT), LEVEL_UP_MOVE(61, MOVE_SWAGGER), LEVEL_UP_END }; static const u16 sPsyduckLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_SPORT), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(10, MOVE_DISABLE), LEVEL_UP_MOVE(16, MOVE_CONFUSION), LEVEL_UP_MOVE(23, MOVE_SCREECH), LEVEL_UP_MOVE(31, MOVE_PSYCH_UP), LEVEL_UP_MOVE(40, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sGolduckLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_SPORT), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_DISABLE), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(10, MOVE_DISABLE), LEVEL_UP_MOVE(16, MOVE_CONFUSION), LEVEL_UP_MOVE(23, MOVE_SCREECH), LEVEL_UP_MOVE(31, MOVE_PSYCH_UP), LEVEL_UP_MOVE(44, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sMankeyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(6, MOVE_LOW_KICK), LEVEL_UP_MOVE(11, MOVE_KARATE_CHOP), LEVEL_UP_MOVE(16, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(26, MOVE_SEISMIC_TOSS), LEVEL_UP_MOVE(31, MOVE_CROSS_CHOP), LEVEL_UP_MOVE(36, MOVE_SWAGGER), LEVEL_UP_MOVE(41, MOVE_SCREECH), LEVEL_UP_MOVE(46, MOVE_THRASH), LEVEL_UP_END }; static const u16 sPrimeapeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_LOW_KICK), LEVEL_UP_MOVE(1, MOVE_RAGE), LEVEL_UP_MOVE(6, MOVE_LOW_KICK), LEVEL_UP_MOVE(11, MOVE_KARATE_CHOP), LEVEL_UP_MOVE(16, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(26, MOVE_SEISMIC_TOSS), LEVEL_UP_MOVE(28, MOVE_RAGE), LEVEL_UP_MOVE(35, MOVE_CROSS_CHOP), LEVEL_UP_MOVE(44, MOVE_SWAGGER), LEVEL_UP_MOVE(53, MOVE_SCREECH), LEVEL_UP_MOVE(62, MOVE_THRASH), LEVEL_UP_END }; static const u16 sGrowlitheLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_ROAR), LEVEL_UP_MOVE(7, MOVE_EMBER), LEVEL_UP_MOVE(13, MOVE_LEER), LEVEL_UP_MOVE(19, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL), LEVEL_UP_MOVE(37, MOVE_HELPING_HAND), LEVEL_UP_MOVE(43, MOVE_AGILITY), LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER), LEVEL_UP_END }; static const u16 sArcanineLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_ROAR), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(49, MOVE_EXTREME_SPEED), LEVEL_UP_END }; static const u16 sPoliwagLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(7, MOVE_HYPNOSIS), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(25, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(31, MOVE_BODY_SLAM), LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM), LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sPoliwhirlLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(7, MOVE_HYPNOSIS), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(27, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(35, MOVE_BODY_SLAM), LEVEL_UP_MOVE(43, MOVE_BELLY_DRUM), LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sPoliwrathLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(1, MOVE_SUBMISSION), LEVEL_UP_MOVE(35, MOVE_SUBMISSION), LEVEL_UP_MOVE(51, MOVE_MIND_READER), LEVEL_UP_END }; static const u16 sAbraLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TELEPORT), LEVEL_UP_END }; static const u16 sKadabraLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TELEPORT), LEVEL_UP_MOVE(1, MOVE_KINESIS), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(16, MOVE_CONFUSION), LEVEL_UP_MOVE(18, MOVE_DISABLE), LEVEL_UP_MOVE(21, MOVE_PSYBEAM), LEVEL_UP_MOVE(23, MOVE_REFLECT), LEVEL_UP_MOVE(25, MOVE_RECOVER), LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(33, MOVE_ROLE_PLAY), LEVEL_UP_MOVE(36, MOVE_PSYCHIC), LEVEL_UP_MOVE(43, MOVE_TRICK), LEVEL_UP_END }; static const u16 sAlakazamLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TELEPORT), LEVEL_UP_MOVE(1, MOVE_KINESIS), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(16, MOVE_CONFUSION), LEVEL_UP_MOVE(18, MOVE_DISABLE), LEVEL_UP_MOVE(21, MOVE_PSYBEAM), LEVEL_UP_MOVE(23, MOVE_REFLECT), LEVEL_UP_MOVE(25, MOVE_RECOVER), LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(33, MOVE_CALM_MIND), LEVEL_UP_MOVE(36, MOVE_PSYCHIC), LEVEL_UP_MOVE(43, MOVE_TRICK), LEVEL_UP_END }; static const u16 sMachopLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LOW_KICK), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP), LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS), LEVEL_UP_MOVE(22, MOVE_FORESIGHT), LEVEL_UP_MOVE(25, MOVE_REVENGE), LEVEL_UP_MOVE(31, MOVE_VITAL_THROW), LEVEL_UP_MOVE(37, MOVE_SUBMISSION), LEVEL_UP_MOVE(40, MOVE_CROSS_CHOP), LEVEL_UP_MOVE(43, MOVE_SCARY_FACE), LEVEL_UP_MOVE(49, MOVE_DYNAMIC_PUNCH), LEVEL_UP_END }; static const u16 sMachokeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LOW_KICK), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP), LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS), LEVEL_UP_MOVE(22, MOVE_FORESIGHT), LEVEL_UP_MOVE(25, MOVE_REVENGE), LEVEL_UP_MOVE(33, MOVE_VITAL_THROW), LEVEL_UP_MOVE(41, MOVE_SUBMISSION), LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP), LEVEL_UP_MOVE(51, MOVE_SCARY_FACE), LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH), LEVEL_UP_END }; static const u16 sMachampLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LOW_KICK), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP), LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS), LEVEL_UP_MOVE(22, MOVE_FORESIGHT), LEVEL_UP_MOVE(25, MOVE_REVENGE), LEVEL_UP_MOVE(33, MOVE_VITAL_THROW), LEVEL_UP_MOVE(41, MOVE_SUBMISSION), LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP), LEVEL_UP_MOVE(51, MOVE_SCARY_FACE), LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH), LEVEL_UP_END }; static const u16 sBellsproutLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_VINE_WHIP), LEVEL_UP_MOVE(6, MOVE_GROWTH), LEVEL_UP_MOVE(11, MOVE_WRAP), LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(17, MOVE_POISON_POWDER), LEVEL_UP_MOVE(19, MOVE_STUN_SPORE), LEVEL_UP_MOVE(23, MOVE_ACID), LEVEL_UP_MOVE(30, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(37, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(45, MOVE_SLAM), LEVEL_UP_END }; static const u16 sWeepinbellLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_VINE_WHIP), LEVEL_UP_MOVE(1, MOVE_GROWTH), LEVEL_UP_MOVE(1, MOVE_WRAP), LEVEL_UP_MOVE(6, MOVE_GROWTH), LEVEL_UP_MOVE(11, MOVE_WRAP), LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(17, MOVE_POISON_POWDER), LEVEL_UP_MOVE(19, MOVE_STUN_SPORE), LEVEL_UP_MOVE(24, MOVE_ACID), LEVEL_UP_MOVE(33, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(42, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(54, MOVE_SLAM), LEVEL_UP_END }; static const u16 sVictreebelLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_STOCKPILE), LEVEL_UP_MOVE(1, MOVE_SPIT_UP), LEVEL_UP_MOVE(1, MOVE_SWALLOW), LEVEL_UP_MOVE(1, MOVE_VINE_WHIP), LEVEL_UP_MOVE(1, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(1, MOVE_RAZOR_LEAF), LEVEL_UP_END }; static const u16 sTentacoolLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(6, MOVE_SUPERSONIC), LEVEL_UP_MOVE(12, MOVE_CONSTRICT), LEVEL_UP_MOVE(19, MOVE_ACID), LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(30, MOVE_WRAP), LEVEL_UP_MOVE(36, MOVE_BARRIER), LEVEL_UP_MOVE(43, MOVE_SCREECH), LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sTentacruelLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(1, MOVE_SUPERSONIC), LEVEL_UP_MOVE(1, MOVE_CONSTRICT), LEVEL_UP_MOVE(6, MOVE_SUPERSONIC), LEVEL_UP_MOVE(12, MOVE_CONSTRICT), LEVEL_UP_MOVE(19, MOVE_ACID), LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(30, MOVE_WRAP), LEVEL_UP_MOVE(38, MOVE_BARRIER), LEVEL_UP_MOVE(47, MOVE_SCREECH), LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sGeodudeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(6, MOVE_MUD_SPORT), LEVEL_UP_MOVE(11, MOVE_ROCK_THROW), LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(26, MOVE_ROLLOUT), LEVEL_UP_MOVE(31, MOVE_ROCK_BLAST), LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(41, MOVE_EXPLOSION), LEVEL_UP_MOVE(46, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sGravelerLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(1, MOVE_MUD_SPORT), LEVEL_UP_MOVE(1, MOVE_ROCK_THROW), LEVEL_UP_MOVE(6, MOVE_MUD_SPORT), LEVEL_UP_MOVE(11, MOVE_ROCK_THROW), LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(29, MOVE_ROLLOUT), LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST), LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(53, MOVE_EXPLOSION), LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sGolemLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(1, MOVE_MUD_SPORT), LEVEL_UP_MOVE(1, MOVE_ROCK_THROW), LEVEL_UP_MOVE(6, MOVE_MUD_SPORT), LEVEL_UP_MOVE(11, MOVE_ROCK_THROW), LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(29, MOVE_ROLLOUT), LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST), LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(53, MOVE_EXPLOSION), LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sPonytaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(5, MOVE_GROWL), LEVEL_UP_MOVE(9, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(14, MOVE_EMBER), LEVEL_UP_MOVE(19, MOVE_STOMP), LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(38, MOVE_AGILITY), LEVEL_UP_MOVE(45, MOVE_BOUNCE), LEVEL_UP_MOVE(53, MOVE_FIRE_BLAST), LEVEL_UP_END }; static const u16 sRapidashLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(5, MOVE_GROWL), LEVEL_UP_MOVE(9, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(14, MOVE_EMBER), LEVEL_UP_MOVE(19, MOVE_STOMP), LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(38, MOVE_AGILITY), LEVEL_UP_MOVE(40, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(50, MOVE_BOUNCE), LEVEL_UP_MOVE(63, MOVE_FIRE_BLAST), LEVEL_UP_END }; static const u16 sSlowpokeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CURSE), LEVEL_UP_MOVE(1, MOVE_YAWN), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(6, MOVE_GROWL), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(17, MOVE_CONFUSION), LEVEL_UP_MOVE(24, MOVE_DISABLE), LEVEL_UP_MOVE(29, MOVE_HEADBUTT), LEVEL_UP_MOVE(36, MOVE_AMNESIA), LEVEL_UP_MOVE(40, MOVE_PSYCHIC), LEVEL_UP_MOVE(47, MOVE_PSYCH_UP), LEVEL_UP_END }; static const u16 sSlowbroLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CURSE), LEVEL_UP_MOVE(1, MOVE_YAWN), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(6, MOVE_GROWL), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(17, MOVE_CONFUSION), LEVEL_UP_MOVE(24, MOVE_DISABLE), LEVEL_UP_MOVE(29, MOVE_HEADBUTT), LEVEL_UP_MOVE(36, MOVE_AMNESIA), LEVEL_UP_MOVE(37, MOVE_WITHDRAW), LEVEL_UP_MOVE(44, MOVE_PSYCHIC), LEVEL_UP_MOVE(55, MOVE_PSYCH_UP), LEVEL_UP_END }; static const u16 sMagnemiteLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_METAL_SOUND), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(6, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(11, MOVE_SUPERSONIC), LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM), LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(26, MOVE_SPARK), LEVEL_UP_MOVE(32, MOVE_LOCK_ON), LEVEL_UP_MOVE(38, MOVE_SWIFT), LEVEL_UP_MOVE(44, MOVE_SCREECH), LEVEL_UP_MOVE(50, MOVE_ZAP_CANNON), LEVEL_UP_END }; static const u16 sMagnetonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_METAL_SOUND), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(1, MOVE_SUPERSONIC), LEVEL_UP_MOVE(6, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(11, MOVE_SUPERSONIC), LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM), LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(26, MOVE_SPARK), LEVEL_UP_MOVE(35, MOVE_LOCK_ON), LEVEL_UP_MOVE(44, MOVE_TRI_ATTACK), LEVEL_UP_MOVE(53, MOVE_SCREECH), LEVEL_UP_MOVE(62, MOVE_ZAP_CANNON), LEVEL_UP_END }; static const u16 sFarfetchdLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(6, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(11, MOVE_LEER), LEVEL_UP_MOVE(16, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(21, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(26, MOVE_FURY_CUTTER), LEVEL_UP_MOVE(31, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE(36, MOVE_AGILITY), LEVEL_UP_MOVE(41, MOVE_SLASH), LEVEL_UP_MOVE(46, MOVE_FALSE_SWIPE), LEVEL_UP_END }; static const u16 sDoduoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(9, MOVE_PURSUIT), LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK), LEVEL_UP_MOVE(25, MOVE_RAGE), LEVEL_UP_MOVE(33, MOVE_UPROAR), LEVEL_UP_MOVE(37, MOVE_DRILL_PECK), LEVEL_UP_MOVE(45, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sDodrioLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_PURSUIT), LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(9, MOVE_PURSUIT), LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK), LEVEL_UP_MOVE(25, MOVE_RAGE), LEVEL_UP_MOVE(38, MOVE_UPROAR), LEVEL_UP_MOVE(47, MOVE_DRILL_PECK), LEVEL_UP_MOVE(60, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sSeelLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HEADBUTT), LEVEL_UP_MOVE(9, MOVE_GROWL), LEVEL_UP_MOVE(17, MOVE_ICY_WIND), LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(29, MOVE_REST), LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(41, MOVE_ICE_BEAM), LEVEL_UP_MOVE(49, MOVE_SAFEGUARD), LEVEL_UP_END }; static const u16 sDewgongLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SIGNAL_BEAM), LEVEL_UP_MOVE(1, MOVE_HEADBUTT), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_ICY_WIND), LEVEL_UP_MOVE(1, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(9, MOVE_GROWL), LEVEL_UP_MOVE(17, MOVE_ICY_WIND), LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(29, MOVE_REST), LEVEL_UP_MOVE(34, MOVE_SHEER_COLD), LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(51, MOVE_ICE_BEAM), LEVEL_UP_MOVE(64, MOVE_SAFEGUARD), LEVEL_UP_END }; static const u16 sGrimerLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_GAS), LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(4, MOVE_HARDEN), LEVEL_UP_MOVE(8, MOVE_DISABLE), LEVEL_UP_MOVE(13, MOVE_SLUDGE), LEVEL_UP_MOVE(19, MOVE_MINIMIZE), LEVEL_UP_MOVE(26, MOVE_SCREECH), LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR), LEVEL_UP_MOVE(43, MOVE_SLUDGE_BOMB), LEVEL_UP_MOVE(53, MOVE_MEMENTO), LEVEL_UP_END }; static const u16 sMukLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_GAS), LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(4, MOVE_HARDEN), LEVEL_UP_MOVE(8, MOVE_DISABLE), LEVEL_UP_MOVE(13, MOVE_SLUDGE), LEVEL_UP_MOVE(19, MOVE_MINIMIZE), LEVEL_UP_MOVE(26, MOVE_SCREECH), LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR), LEVEL_UP_MOVE(47, MOVE_SLUDGE_BOMB), LEVEL_UP_MOVE(61, MOVE_MEMENTO), LEVEL_UP_END }; static const u16 sShellderLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_WITHDRAW), LEVEL_UP_MOVE(8, MOVE_ICICLE_SPEAR), LEVEL_UP_MOVE(15, MOVE_SUPERSONIC), LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(29, MOVE_PROTECT), LEVEL_UP_MOVE(36, MOVE_LEER), LEVEL_UP_MOVE(43, MOVE_CLAMP), LEVEL_UP_MOVE(50, MOVE_ICE_BEAM), LEVEL_UP_END }; static const u16 sCloysterLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WITHDRAW), LEVEL_UP_MOVE(1, MOVE_SUPERSONIC), LEVEL_UP_MOVE(1, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(1, MOVE_PROTECT), LEVEL_UP_MOVE(36, MOVE_SPIKES), LEVEL_UP_MOVE(43, MOVE_SPIKE_CANNON), LEVEL_UP_END }; static const u16 sGastlyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(1, MOVE_LICK), LEVEL_UP_MOVE(8, MOVE_SPITE), LEVEL_UP_MOVE(13, MOVE_CURSE), LEVEL_UP_MOVE(16, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(28, MOVE_DREAM_EATER), LEVEL_UP_MOVE(33, MOVE_DESTINY_BOND), LEVEL_UP_MOVE(36, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(41, MOVE_NIGHTMARE), LEVEL_UP_MOVE(48, MOVE_MEAN_LOOK), LEVEL_UP_END }; static const u16 sHaunterLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(1, MOVE_LICK), LEVEL_UP_MOVE(1, MOVE_SPITE), LEVEL_UP_MOVE(8, MOVE_SPITE), LEVEL_UP_MOVE(13, MOVE_CURSE), LEVEL_UP_MOVE(16, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH), LEVEL_UP_MOVE(31, MOVE_DREAM_EATER), LEVEL_UP_MOVE(39, MOVE_DESTINY_BOND), LEVEL_UP_MOVE(45, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(53, MOVE_NIGHTMARE), LEVEL_UP_MOVE(64, MOVE_MEAN_LOOK), LEVEL_UP_END }; static const u16 sGengarLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(1, MOVE_LICK), LEVEL_UP_MOVE(1, MOVE_SPITE), LEVEL_UP_MOVE(8, MOVE_SPITE), LEVEL_UP_MOVE(13, MOVE_CURSE), LEVEL_UP_MOVE(16, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH), LEVEL_UP_MOVE(31, MOVE_DREAM_EATER), LEVEL_UP_MOVE(39, MOVE_DESTINY_BOND), LEVEL_UP_MOVE(45, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(53, MOVE_NIGHTMARE), LEVEL_UP_MOVE(64, MOVE_MEAN_LOOK), LEVEL_UP_END }; static const u16 sOnixLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_SCREECH), LEVEL_UP_MOVE(8, MOVE_BIND), LEVEL_UP_MOVE(12, MOVE_ROCK_THROW), LEVEL_UP_MOVE(19, MOVE_HARDEN), LEVEL_UP_MOVE(23, MOVE_RAGE), LEVEL_UP_MOVE(30, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(34, MOVE_SANDSTORM), LEVEL_UP_MOVE(41, MOVE_SLAM), LEVEL_UP_MOVE(45, MOVE_IRON_TAIL), LEVEL_UP_MOVE(52, MOVE_SAND_TOMB), LEVEL_UP_MOVE(56, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sDrowzeeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(7, MOVE_DISABLE), LEVEL_UP_MOVE(11, MOVE_CONFUSION), LEVEL_UP_MOVE(17, MOVE_HEADBUTT), LEVEL_UP_MOVE(21, MOVE_POISON_GAS), LEVEL_UP_MOVE(27, MOVE_MEDITATE), LEVEL_UP_MOVE(31, MOVE_PSYCHIC), LEVEL_UP_MOVE(37, MOVE_PSYCH_UP), LEVEL_UP_MOVE(41, MOVE_SWAGGER), LEVEL_UP_MOVE(47, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; static const u16 sHypnoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_NIGHTMARE), LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(1, MOVE_DISABLE), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(7, MOVE_DISABLE), LEVEL_UP_MOVE(11, MOVE_CONFUSION), LEVEL_UP_MOVE(17, MOVE_HEADBUTT), LEVEL_UP_MOVE(21, MOVE_POISON_GAS), LEVEL_UP_MOVE(29, MOVE_MEDITATE), LEVEL_UP_MOVE(35, MOVE_PSYCHIC), LEVEL_UP_MOVE(43, MOVE_PSYCH_UP), LEVEL_UP_MOVE(49, MOVE_SWAGGER), LEVEL_UP_MOVE(57, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; static const u16 sKrabbyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(5, MOVE_LEER), LEVEL_UP_MOVE(12, MOVE_VICE_GRIP), LEVEL_UP_MOVE(16, MOVE_HARDEN), LEVEL_UP_MOVE(23, MOVE_MUD_SHOT), LEVEL_UP_MOVE(27, MOVE_STOMP), LEVEL_UP_MOVE(34, MOVE_GUILLOTINE), LEVEL_UP_MOVE(38, MOVE_PROTECT), LEVEL_UP_MOVE(45, MOVE_CRABHAMMER), LEVEL_UP_MOVE(49, MOVE_FLAIL), LEVEL_UP_END }; static const u16 sKinglerLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_METAL_CLAW), LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_VICE_GRIP), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(5, MOVE_LEER), LEVEL_UP_MOVE(12, MOVE_VICE_GRIP), LEVEL_UP_MOVE(16, MOVE_HARDEN), LEVEL_UP_MOVE(23, MOVE_MUD_SHOT), LEVEL_UP_MOVE(27, MOVE_STOMP), LEVEL_UP_MOVE(38, MOVE_GUILLOTINE), LEVEL_UP_MOVE(42, MOVE_PROTECT), LEVEL_UP_MOVE(57, MOVE_CRABHAMMER), LEVEL_UP_MOVE(65, MOVE_FLAIL), LEVEL_UP_END }; static const u16 sVoltorbLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CHARGE), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(8, MOVE_SCREECH), LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM), LEVEL_UP_MOVE(21, MOVE_SPARK), LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(32, MOVE_ROLLOUT), LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(42, MOVE_SWIFT), LEVEL_UP_MOVE(46, MOVE_EXPLOSION), LEVEL_UP_MOVE(49, MOVE_MIRROR_COAT), LEVEL_UP_END }; static const u16 sElectrodeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CHARGE), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_SCREECH), LEVEL_UP_MOVE(1, MOVE_SONIC_BOOM), LEVEL_UP_MOVE(8, MOVE_SCREECH), LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM), LEVEL_UP_MOVE(21, MOVE_SPARK), LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(34, MOVE_ROLLOUT), LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(48, MOVE_SWIFT), LEVEL_UP_MOVE(54, MOVE_EXPLOSION), LEVEL_UP_MOVE(59, MOVE_MIRROR_COAT), LEVEL_UP_END }; static const u16 sExeggcuteLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BARRAGE), LEVEL_UP_MOVE(1, MOVE_UPROAR), LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(7, MOVE_REFLECT), LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), LEVEL_UP_MOVE(19, MOVE_CONFUSION), LEVEL_UP_MOVE(25, MOVE_STUN_SPORE), LEVEL_UP_MOVE(31, MOVE_POISON_POWDER), LEVEL_UP_MOVE(37, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM), LEVEL_UP_END }; static const u16 sExeggutorLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BARRAGE), LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(19, MOVE_STOMP), LEVEL_UP_MOVE(31, MOVE_EGG_BOMB), LEVEL_UP_END }; static const u16 sCuboneLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(9, MOVE_BONE_CLUB), LEVEL_UP_MOVE(13, MOVE_HEADBUTT), LEVEL_UP_MOVE(17, MOVE_LEER), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(25, MOVE_BONEMERANG), LEVEL_UP_MOVE(29, MOVE_RAGE), LEVEL_UP_MOVE(33, MOVE_FALSE_SWIPE), LEVEL_UP_MOVE(37, MOVE_THRASH), LEVEL_UP_MOVE(41, MOVE_BONE_RUSH), LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sMarowakLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_BONE_CLUB), LEVEL_UP_MOVE(1, MOVE_HEADBUTT), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(9, MOVE_BONE_CLUB), LEVEL_UP_MOVE(13, MOVE_HEADBUTT), LEVEL_UP_MOVE(17, MOVE_LEER), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(25, MOVE_BONEMERANG), LEVEL_UP_MOVE(32, MOVE_RAGE), LEVEL_UP_MOVE(39, MOVE_FALSE_SWIPE), LEVEL_UP_MOVE(46, MOVE_THRASH), LEVEL_UP_MOVE(53, MOVE_BONE_RUSH), LEVEL_UP_MOVE(61, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sHitmonleeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_REVENGE), LEVEL_UP_MOVE(1, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(6, MOVE_MEDITATE), LEVEL_UP_MOVE(11, MOVE_ROLLING_KICK), LEVEL_UP_MOVE(16, MOVE_JUMP_KICK), LEVEL_UP_MOVE(20, MOVE_BRICK_BREAK), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(26, MOVE_HI_JUMP_KICK), LEVEL_UP_MOVE(31, MOVE_MIND_READER), LEVEL_UP_MOVE(36, MOVE_FORESIGHT), LEVEL_UP_MOVE(41, MOVE_ENDURE), LEVEL_UP_MOVE(46, MOVE_MEGA_KICK), LEVEL_UP_MOVE(51, MOVE_REVERSAL), LEVEL_UP_END }; static const u16 sHitmonchanLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_REVENGE), LEVEL_UP_MOVE(1, MOVE_COMET_PUNCH), LEVEL_UP_MOVE(7, MOVE_AGILITY), LEVEL_UP_MOVE(13, MOVE_PURSUIT), LEVEL_UP_MOVE(20, MOVE_MACH_PUNCH), LEVEL_UP_MOVE(26, MOVE_THUNDER_PUNCH), LEVEL_UP_MOVE(26, MOVE_ICE_PUNCH), LEVEL_UP_MOVE(26, MOVE_FIRE_PUNCH), LEVEL_UP_MOVE(32, MOVE_SKY_UPPERCUT), LEVEL_UP_MOVE(38, MOVE_MEGA_PUNCH), LEVEL_UP_MOVE(44, MOVE_DETECT), LEVEL_UP_MOVE(50, MOVE_COUNTER), LEVEL_UP_END }; static const u16 sLickitungLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LICK), LEVEL_UP_MOVE(7, MOVE_SUPERSONIC), LEVEL_UP_MOVE(12, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(18, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(23, MOVE_STOMP), LEVEL_UP_MOVE(29, MOVE_WRAP), LEVEL_UP_MOVE(34, MOVE_DISABLE), LEVEL_UP_MOVE(40, MOVE_SLAM), LEVEL_UP_MOVE(45, MOVE_SCREECH), LEVEL_UP_MOVE(51, MOVE_REFRESH), LEVEL_UP_END }; static const u16 sKoffingLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_GAS), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(9, MOVE_SMOG), LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(21, MOVE_SLUDGE), LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(33, MOVE_HAZE), LEVEL_UP_MOVE(41, MOVE_EXPLOSION), LEVEL_UP_MOVE(45, MOVE_DESTINY_BOND), LEVEL_UP_MOVE(49, MOVE_MEMENTO), LEVEL_UP_END }; static const u16 sWeezingLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_GAS), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_SMOG), LEVEL_UP_MOVE(1, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(9, MOVE_SMOG), LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(21, MOVE_SLUDGE), LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(33, MOVE_HAZE), LEVEL_UP_MOVE(44, MOVE_EXPLOSION), LEVEL_UP_MOVE(51, MOVE_DESTINY_BOND), LEVEL_UP_MOVE(58, MOVE_MEMENTO), LEVEL_UP_END }; static const u16 sRhyhornLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(10, MOVE_STOMP), LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(24, MOVE_SCARY_FACE), LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST), LEVEL_UP_MOVE(38, MOVE_HORN_DRILL), LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(57, MOVE_MEGAHORN), LEVEL_UP_END }; static const u16 sRhydonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_STOMP), LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(10, MOVE_STOMP), LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(24, MOVE_SCARY_FACE), LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST), LEVEL_UP_MOVE(38, MOVE_HORN_DRILL), LEVEL_UP_MOVE(46, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(58, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(66, MOVE_MEGAHORN), LEVEL_UP_END }; static const u16 sChanseyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(9, MOVE_REFRESH), LEVEL_UP_MOVE(13, MOVE_SOFT_BOILED), LEVEL_UP_MOVE(17, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(23, MOVE_MINIMIZE), LEVEL_UP_MOVE(29, MOVE_SING), LEVEL_UP_MOVE(35, MOVE_EGG_BOMB), LEVEL_UP_MOVE(41, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(49, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sTangelaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_INGRAIN), LEVEL_UP_MOVE(1, MOVE_CONSTRICT), LEVEL_UP_MOVE(4, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(10, MOVE_ABSORB), LEVEL_UP_MOVE(13, MOVE_GROWTH), LEVEL_UP_MOVE(19, MOVE_POISON_POWDER), LEVEL_UP_MOVE(22, MOVE_VINE_WHIP), LEVEL_UP_MOVE(28, MOVE_BIND), LEVEL_UP_MOVE(31, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(37, MOVE_STUN_SPORE), LEVEL_UP_MOVE(40, MOVE_SLAM), LEVEL_UP_MOVE(46, MOVE_TICKLE), LEVEL_UP_END }; static const u16 sKangaskhanLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_COMET_PUNCH), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(7, MOVE_BITE), LEVEL_UP_MOVE(13, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), LEVEL_UP_MOVE(25, MOVE_MEGA_PUNCH), LEVEL_UP_MOVE(31, MOVE_RAGE), LEVEL_UP_MOVE(37, MOVE_ENDURE), LEVEL_UP_MOVE(43, MOVE_DIZZY_PUNCH), LEVEL_UP_MOVE(49, MOVE_REVERSAL), LEVEL_UP_END }; static const u16 sHorseaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(8, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(15, MOVE_LEER), LEVEL_UP_MOVE(22, MOVE_WATER_GUN), LEVEL_UP_MOVE(29, MOVE_TWISTER), LEVEL_UP_MOVE(36, MOVE_AGILITY), LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE), LEVEL_UP_END }; static const u16 sSeadraLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(8, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(15, MOVE_LEER), LEVEL_UP_MOVE(22, MOVE_WATER_GUN), LEVEL_UP_MOVE(29, MOVE_TWISTER), LEVEL_UP_MOVE(40, MOVE_AGILITY), LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE), LEVEL_UP_END }; static const u16 sGoldeenLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_WATER_SPORT), LEVEL_UP_MOVE(10, MOVE_SUPERSONIC), LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(24, MOVE_FLAIL), LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(38, MOVE_WATERFALL), LEVEL_UP_MOVE(43, MOVE_HORN_DRILL), LEVEL_UP_MOVE(52, MOVE_AGILITY), LEVEL_UP_MOVE(57, MOVE_MEGAHORN), LEVEL_UP_END }; static const u16 sSeakingLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_WATER_SPORT), LEVEL_UP_MOVE(1, MOVE_SUPERSONIC), LEVEL_UP_MOVE(10, MOVE_SUPERSONIC), LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(24, MOVE_FLAIL), LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(41, MOVE_WATERFALL), LEVEL_UP_MOVE(49, MOVE_HORN_DRILL), LEVEL_UP_MOVE(61, MOVE_AGILITY), LEVEL_UP_MOVE(69, MOVE_MEGAHORN), LEVEL_UP_END }; static const u16 sStaryuLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(6, MOVE_WATER_GUN), LEVEL_UP_MOVE(10, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(15, MOVE_RECOVER), LEVEL_UP_MOVE(19, MOVE_CAMOUFLAGE), LEVEL_UP_MOVE(24, MOVE_SWIFT), LEVEL_UP_MOVE(28, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(33, MOVE_MINIMIZE), LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sStarmieLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(1, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(1, MOVE_RECOVER), LEVEL_UP_MOVE(1, MOVE_SWIFT), LEVEL_UP_MOVE(33, MOVE_CONFUSE_RAY), LEVEL_UP_END }; static const u16 sMrMimeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BARRIER), LEVEL_UP_MOVE(5, MOVE_CONFUSION), LEVEL_UP_MOVE(8, MOVE_SUBSTITUTE), LEVEL_UP_MOVE(12, MOVE_MEDITATE), LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(19, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(19, MOVE_REFLECT), LEVEL_UP_MOVE(22, MOVE_MAGICAL_LEAF), LEVEL_UP_MOVE(26, MOVE_ENCORE), LEVEL_UP_MOVE(29, MOVE_PSYBEAM), LEVEL_UP_MOVE(33, MOVE_RECYCLE), LEVEL_UP_MOVE(36, MOVE_TRICK), LEVEL_UP_MOVE(40, MOVE_ROLE_PLAY), LEVEL_UP_MOVE(43, MOVE_PSYCHIC), LEVEL_UP_MOVE(47, MOVE_BATON_PASS), LEVEL_UP_MOVE(50, MOVE_SAFEGUARD), LEVEL_UP_END }; static const u16 sScytherLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(6, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(11, MOVE_PURSUIT), LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE), LEVEL_UP_MOVE(21, MOVE_AGILITY), LEVEL_UP_MOVE(26, MOVE_WING_ATTACK), LEVEL_UP_MOVE(31, MOVE_SLASH), LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE(41, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER), LEVEL_UP_END }; static const u16 sJynxLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_LICK), LEVEL_UP_MOVE(1, MOVE_LOVELY_KISS), LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(9, MOVE_LOVELY_KISS), LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(21, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(25, MOVE_ICE_PUNCH), LEVEL_UP_MOVE(35, MOVE_MEAN_LOOK), LEVEL_UP_MOVE(41, MOVE_FAKE_TEARS), LEVEL_UP_MOVE(51, MOVE_BODY_SLAM), LEVEL_UP_MOVE(57, MOVE_PERISH_SONG), LEVEL_UP_MOVE(67, MOVE_BLIZZARD), LEVEL_UP_END }; static const u16 sElectabuzzLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_THUNDER_PUNCH), LEVEL_UP_MOVE(9, MOVE_THUNDER_PUNCH), LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(25, MOVE_SWIFT), LEVEL_UP_MOVE(36, MOVE_SCREECH), LEVEL_UP_MOVE(47, MOVE_THUNDERBOLT), LEVEL_UP_MOVE(58, MOVE_THUNDER), LEVEL_UP_END }; static const u16 sMagmarLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_SMOG), LEVEL_UP_MOVE(1, MOVE_FIRE_PUNCH), LEVEL_UP_MOVE(7, MOVE_LEER), LEVEL_UP_MOVE(13, MOVE_SMOG), LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH), LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(33, MOVE_SUNNY_DAY), LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(49, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(57, MOVE_FIRE_BLAST), LEVEL_UP_END }; static const u16 sPinsirLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_VICE_GRIP), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(7, MOVE_BIND), LEVEL_UP_MOVE(13, MOVE_SEISMIC_TOSS), LEVEL_UP_MOVE(19, MOVE_HARDEN), LEVEL_UP_MOVE(25, MOVE_REVENGE), LEVEL_UP_MOVE(31, MOVE_BRICK_BREAK), LEVEL_UP_MOVE(37, MOVE_GUILLOTINE), LEVEL_UP_MOVE(43, MOVE_SUBMISSION), LEVEL_UP_MOVE(49, MOVE_SWORDS_DANCE), LEVEL_UP_END }; static const u16 sTaurosLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(4, MOVE_RAGE), LEVEL_UP_MOVE(8, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(13, MOVE_SCARY_FACE), LEVEL_UP_MOVE(19, MOVE_PURSUIT), LEVEL_UP_MOVE(26, MOVE_SWAGGER), LEVEL_UP_MOVE(34, MOVE_REST), LEVEL_UP_MOVE(43, MOVE_THRASH), LEVEL_UP_MOVE(53, MOVE_TAKE_DOWN), LEVEL_UP_END }; static const u16 sMagikarpLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(15, MOVE_TACKLE), LEVEL_UP_MOVE(30, MOVE_FLAIL), LEVEL_UP_END }; static const u16 sGyaradosLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_THRASH), LEVEL_UP_MOVE(20, MOVE_BITE), LEVEL_UP_MOVE(25, MOVE_DRAGON_RAGE), LEVEL_UP_MOVE(30, MOVE_LEER), LEVEL_UP_MOVE(35, MOVE_TWISTER), LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE), LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sLaprasLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_SING), LEVEL_UP_MOVE(7, MOVE_MIST), LEVEL_UP_MOVE(13, MOVE_BODY_SLAM), LEVEL_UP_MOVE(19, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(25, MOVE_PERISH_SONG), LEVEL_UP_MOVE(31, MOVE_ICE_BEAM), LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(55, MOVE_SHEER_COLD), LEVEL_UP_END }; static const u16 sDittoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TRANSFORM), LEVEL_UP_END }; static const u16 sEeveeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_HELPING_HAND), LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(16, MOVE_GROWL), LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(30, MOVE_BITE), LEVEL_UP_MOVE(36, MOVE_BATON_PASS), LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN), LEVEL_UP_END }; static const u16 sVaporeonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_HELPING_HAND), LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(16, MOVE_WATER_GUN), LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(30, MOVE_BITE), LEVEL_UP_MOVE(36, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(42, MOVE_HAZE), LEVEL_UP_MOVE(47, MOVE_ACID_ARMOR), LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sJolteonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_HELPING_HAND), LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(16, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(30, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(36, MOVE_PIN_MISSILE), LEVEL_UP_MOVE(42, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(47, MOVE_AGILITY), LEVEL_UP_MOVE(52, MOVE_THUNDER), LEVEL_UP_END }; static const u16 sFlareonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_HELPING_HAND), LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(16, MOVE_EMBER), LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(30, MOVE_BITE), LEVEL_UP_MOVE(36, MOVE_FIRE_SPIN), LEVEL_UP_MOVE(42, MOVE_SMOG), LEVEL_UP_MOVE(47, MOVE_LEER), LEVEL_UP_MOVE(52, MOVE_FLAMETHROWER), LEVEL_UP_END }; static const u16 sPorygonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CONVERSION_2), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_CONVERSION), LEVEL_UP_MOVE(9, MOVE_AGILITY), LEVEL_UP_MOVE(12, MOVE_PSYBEAM), LEVEL_UP_MOVE(20, MOVE_RECOVER), LEVEL_UP_MOVE(24, MOVE_SHARPEN), LEVEL_UP_MOVE(32, MOVE_LOCK_ON), LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK), LEVEL_UP_MOVE(44, MOVE_RECYCLE), LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON), LEVEL_UP_END }; static const u16 sOmanyteLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CONSTRICT), LEVEL_UP_MOVE(1, MOVE_WITHDRAW), LEVEL_UP_MOVE(13, MOVE_BITE), LEVEL_UP_MOVE(19, MOVE_WATER_GUN), LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), LEVEL_UP_MOVE(31, MOVE_LEER), LEVEL_UP_MOVE(37, MOVE_PROTECT), LEVEL_UP_MOVE(43, MOVE_TICKLE), LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sOmastarLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CONSTRICT), LEVEL_UP_MOVE(1, MOVE_WITHDRAW), LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(13, MOVE_BITE), LEVEL_UP_MOVE(19, MOVE_WATER_GUN), LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), LEVEL_UP_MOVE(31, MOVE_LEER), LEVEL_UP_MOVE(37, MOVE_PROTECT), LEVEL_UP_MOVE(40, MOVE_SPIKE_CANNON), LEVEL_UP_MOVE(46, MOVE_TICKLE), LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(65, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sKabutoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(13, MOVE_ABSORB), LEVEL_UP_MOVE(19, MOVE_LEER), LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(37, MOVE_ENDURE), LEVEL_UP_MOVE(43, MOVE_METAL_SOUND), LEVEL_UP_MOVE(49, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER), LEVEL_UP_END }; static const u16 sKabutopsLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_FURY_CUTTER), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(13, MOVE_ABSORB), LEVEL_UP_MOVE(19, MOVE_LEER), LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(37, MOVE_ENDURE), LEVEL_UP_MOVE(40, MOVE_SLASH), LEVEL_UP_MOVE(46, MOVE_METAL_SOUND), LEVEL_UP_MOVE(55, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(65, MOVE_ANCIENT_POWER), LEVEL_UP_END }; static const u16 sAerodactylLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WING_ATTACK), LEVEL_UP_MOVE(8, MOVE_AGILITY), LEVEL_UP_MOVE(15, MOVE_BITE), LEVEL_UP_MOVE(22, MOVE_SUPERSONIC), LEVEL_UP_MOVE(29, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(36, MOVE_SCARY_FACE), LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sSnorlaxLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(5, MOVE_AMNESIA), LEVEL_UP_MOVE(9, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(13, MOVE_BELLY_DRUM), LEVEL_UP_MOVE(17, MOVE_HEADBUTT), LEVEL_UP_MOVE(21, MOVE_YAWN), LEVEL_UP_MOVE(25, MOVE_REST), LEVEL_UP_MOVE(29, MOVE_SNORE), LEVEL_UP_MOVE(33, MOVE_BODY_SLAM), LEVEL_UP_MOVE(37, MOVE_SLEEP_TALK), LEVEL_UP_MOVE(41, MOVE_BLOCK), LEVEL_UP_MOVE(45, MOVE_COVET), LEVEL_UP_MOVE(49, MOVE_ROLLOUT), LEVEL_UP_MOVE(53, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sArticunoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GUST), LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(13, MOVE_MIST), LEVEL_UP_MOVE(25, MOVE_AGILITY), LEVEL_UP_MOVE(37, MOVE_MIND_READER), LEVEL_UP_MOVE(49, MOVE_ICE_BEAM), LEVEL_UP_MOVE(61, MOVE_REFLECT), LEVEL_UP_MOVE(73, MOVE_BLIZZARD), LEVEL_UP_MOVE(85, MOVE_SHEER_COLD), LEVEL_UP_END }; static const u16 sZapdosLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(13, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(25, MOVE_AGILITY), LEVEL_UP_MOVE(37, MOVE_DETECT), LEVEL_UP_MOVE(49, MOVE_DRILL_PECK), LEVEL_UP_MOVE(61, MOVE_CHARGE), LEVEL_UP_MOVE(73, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(85, MOVE_THUNDER), LEVEL_UP_END }; static const u16 sMoltresLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WING_ATTACK), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(13, MOVE_FIRE_SPIN), LEVEL_UP_MOVE(25, MOVE_AGILITY), LEVEL_UP_MOVE(37, MOVE_ENDURE), LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(61, MOVE_SAFEGUARD), LEVEL_UP_MOVE(73, MOVE_HEAT_WAVE), LEVEL_UP_MOVE(85, MOVE_SKY_ATTACK), LEVEL_UP_END }; static const u16 sDratiniLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WRAP), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(15, MOVE_TWISTER), LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE), LEVEL_UP_MOVE(29, MOVE_SLAM), LEVEL_UP_MOVE(36, MOVE_AGILITY), LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), LEVEL_UP_MOVE(50, MOVE_OUTRAGE), LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sDragonairLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WRAP), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(1, MOVE_TWISTER), LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(15, MOVE_TWISTER), LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE), LEVEL_UP_MOVE(29, MOVE_SLAM), LEVEL_UP_MOVE(38, MOVE_AGILITY), LEVEL_UP_MOVE(47, MOVE_SAFEGUARD), LEVEL_UP_MOVE(56, MOVE_OUTRAGE), LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sDragoniteLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WRAP), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(1, MOVE_TWISTER), LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(15, MOVE_TWISTER), LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE), LEVEL_UP_MOVE(29, MOVE_SLAM), LEVEL_UP_MOVE(38, MOVE_AGILITY), LEVEL_UP_MOVE(47, MOVE_SAFEGUARD), LEVEL_UP_MOVE(55, MOVE_WING_ATTACK), LEVEL_UP_MOVE(61, MOVE_OUTRAGE), LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sMewtwoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(1, MOVE_DISABLE), LEVEL_UP_MOVE(11, MOVE_BARRIER), LEVEL_UP_MOVE(22, MOVE_MIST), LEVEL_UP_MOVE(33, MOVE_SWIFT), LEVEL_UP_MOVE(44, MOVE_RECOVER), LEVEL_UP_MOVE(55, MOVE_SAFEGUARD), LEVEL_UP_MOVE(66, MOVE_PSYCHIC), LEVEL_UP_MOVE(77, MOVE_PSYCH_UP), LEVEL_UP_MOVE(88, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(99, MOVE_AMNESIA), LEVEL_UP_END }; static const u16 sMewLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(10, MOVE_TRANSFORM), LEVEL_UP_MOVE(20, MOVE_MEGA_PUNCH), LEVEL_UP_MOVE(30, MOVE_METRONOME), LEVEL_UP_MOVE(40, MOVE_PSYCHIC), LEVEL_UP_MOVE(50, MOVE_ANCIENT_POWER), LEVEL_UP_END }; static const u16 sChikoritaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(8, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(12, MOVE_REFLECT), LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), LEVEL_UP_MOVE(22, MOVE_SYNTHESIS), LEVEL_UP_MOVE(29, MOVE_BODY_SLAM), LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), LEVEL_UP_MOVE(50, MOVE_SOLAR_BEAM), LEVEL_UP_END }; static const u16 sBayleefLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(1, MOVE_REFLECT), LEVEL_UP_MOVE(8, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(12, MOVE_REFLECT), LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), LEVEL_UP_MOVE(23, MOVE_SYNTHESIS), LEVEL_UP_MOVE(31, MOVE_BODY_SLAM), LEVEL_UP_MOVE(39, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(47, MOVE_SAFEGUARD), LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM), LEVEL_UP_END }; static const u16 sMeganiumLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(1, MOVE_REFLECT), LEVEL_UP_MOVE(8, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(12, MOVE_REFLECT), LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), LEVEL_UP_MOVE(23, MOVE_SYNTHESIS), LEVEL_UP_MOVE(31, MOVE_BODY_SLAM), LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(51, MOVE_SAFEGUARD), LEVEL_UP_MOVE(61, MOVE_SOLAR_BEAM), LEVEL_UP_END }; static const u16 sCyndaquilLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(6, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(12, MOVE_EMBER), LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(27, MOVE_FLAME_WHEEL), LEVEL_UP_MOVE(36, MOVE_SWIFT), LEVEL_UP_MOVE(46, MOVE_FLAMETHROWER), LEVEL_UP_END }; static const u16 sQuilavaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(6, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(12, MOVE_EMBER), LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL), LEVEL_UP_MOVE(42, MOVE_SWIFT), LEVEL_UP_MOVE(54, MOVE_FLAMETHROWER), LEVEL_UP_END }; static const u16 sTyphlosionLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(6, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(12, MOVE_EMBER), LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL), LEVEL_UP_MOVE(45, MOVE_SWIFT), LEVEL_UP_MOVE(60, MOVE_FLAMETHROWER), LEVEL_UP_END }; static const u16 sTotodileLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(7, MOVE_RAGE), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(20, MOVE_BITE), LEVEL_UP_MOVE(27, MOVE_SCARY_FACE), LEVEL_UP_MOVE(35, MOVE_SLASH), LEVEL_UP_MOVE(43, MOVE_SCREECH), LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sCroconawLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_RAGE), LEVEL_UP_MOVE(7, MOVE_RAGE), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(21, MOVE_BITE), LEVEL_UP_MOVE(28, MOVE_SCARY_FACE), LEVEL_UP_MOVE(37, MOVE_SLASH), LEVEL_UP_MOVE(45, MOVE_SCREECH), LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sFeraligatrLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_RAGE), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(7, MOVE_RAGE), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(21, MOVE_BITE), LEVEL_UP_MOVE(28, MOVE_SCARY_FACE), LEVEL_UP_MOVE(38, MOVE_SLASH), LEVEL_UP_MOVE(47, MOVE_SCREECH), LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sSentretLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(17, MOVE_HELPING_HAND), LEVEL_UP_MOVE(24, MOVE_SLAM), LEVEL_UP_MOVE(31, MOVE_FOLLOW_ME), LEVEL_UP_MOVE(40, MOVE_REST), LEVEL_UP_MOVE(49, MOVE_AMNESIA), LEVEL_UP_END }; static const u16 sFurretLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(19, MOVE_HELPING_HAND), LEVEL_UP_MOVE(28, MOVE_SLAM), LEVEL_UP_MOVE(37, MOVE_FOLLOW_ME), LEVEL_UP_MOVE(48, MOVE_REST), LEVEL_UP_MOVE(59, MOVE_AMNESIA), LEVEL_UP_END }; static const u16 sHoothootLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(6, MOVE_FORESIGHT), LEVEL_UP_MOVE(11, MOVE_PECK), LEVEL_UP_MOVE(16, MOVE_HYPNOSIS), LEVEL_UP_MOVE(22, MOVE_REFLECT), LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(34, MOVE_CONFUSION), LEVEL_UP_MOVE(48, MOVE_DREAM_EATER), LEVEL_UP_END }; static const u16 sNoctowlLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_FORESIGHT), LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(6, MOVE_FORESIGHT), LEVEL_UP_MOVE(11, MOVE_PECK), LEVEL_UP_MOVE(16, MOVE_HYPNOSIS), LEVEL_UP_MOVE(25, MOVE_REFLECT), LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(41, MOVE_CONFUSION), LEVEL_UP_MOVE(57, MOVE_DREAM_EATER), LEVEL_UP_END }; static const u16 sLedybaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(8, MOVE_SUPERSONIC), LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH), LEVEL_UP_MOVE(22, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(22, MOVE_REFLECT), LEVEL_UP_MOVE(22, MOVE_SAFEGUARD), LEVEL_UP_MOVE(29, MOVE_BATON_PASS), LEVEL_UP_MOVE(36, MOVE_SWIFT), LEVEL_UP_MOVE(43, MOVE_AGILITY), LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sLedianLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_SUPERSONIC), LEVEL_UP_MOVE(8, MOVE_SUPERSONIC), LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH), LEVEL_UP_MOVE(24, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(24, MOVE_REFLECT), LEVEL_UP_MOVE(24, MOVE_SAFEGUARD), LEVEL_UP_MOVE(33, MOVE_BATON_PASS), LEVEL_UP_MOVE(42, MOVE_SWIFT), LEVEL_UP_MOVE(51, MOVE_AGILITY), LEVEL_UP_MOVE(60, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sSpinarakLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(1, MOVE_STRING_SHOT), LEVEL_UP_MOVE(6, MOVE_SCARY_FACE), LEVEL_UP_MOVE(11, MOVE_CONSTRICT), LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(23, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(37, MOVE_SPIDER_WEB), LEVEL_UP_MOVE(45, MOVE_AGILITY), LEVEL_UP_MOVE(53, MOVE_PSYCHIC), LEVEL_UP_END }; static const u16 sAriadosLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(1, MOVE_STRING_SHOT), LEVEL_UP_MOVE(1, MOVE_SCARY_FACE), LEVEL_UP_MOVE(1, MOVE_CONSTRICT), LEVEL_UP_MOVE(6, MOVE_SCARY_FACE), LEVEL_UP_MOVE(11, MOVE_CONSTRICT), LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(43, MOVE_SPIDER_WEB), LEVEL_UP_MOVE(53, MOVE_AGILITY), LEVEL_UP_MOVE(63, MOVE_PSYCHIC), LEVEL_UP_END }; static const u16 sCrobatLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCREECH), LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(1, MOVE_SUPERSONIC), LEVEL_UP_MOVE(6, MOVE_ASTONISH), LEVEL_UP_MOVE(11, MOVE_SUPERSONIC), LEVEL_UP_MOVE(16, MOVE_BITE), LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER), LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK), LEVEL_UP_MOVE(49, MOVE_POISON_FANG), LEVEL_UP_MOVE(56, MOVE_HAZE), LEVEL_UP_END }; static const u16 sChinchouLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(5, MOVE_SUPERSONIC), LEVEL_UP_MOVE(13, MOVE_FLAIL), LEVEL_UP_MOVE(17, MOVE_WATER_GUN), LEVEL_UP_MOVE(25, MOVE_SPARK), LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(41, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(49, MOVE_CHARGE), LEVEL_UP_END }; static const u16 sLanturnLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(1, MOVE_SUPERSONIC), LEVEL_UP_MOVE(5, MOVE_SUPERSONIC), LEVEL_UP_MOVE(13, MOVE_FLAIL), LEVEL_UP_MOVE(17, MOVE_WATER_GUN), LEVEL_UP_MOVE(25, MOVE_SPARK), LEVEL_UP_MOVE(32, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(61, MOVE_CHARGE), LEVEL_UP_END }; static const u16 sPichuLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(1, MOVE_CHARM), LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(11, MOVE_SWEET_KISS), LEVEL_UP_END }; static const u16 sCleffaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_CHARM), LEVEL_UP_MOVE(4, MOVE_ENCORE), LEVEL_UP_MOVE(8, MOVE_SING), LEVEL_UP_MOVE(13, MOVE_SWEET_KISS), LEVEL_UP_MOVE(17, MOVE_MAGICAL_LEAF), LEVEL_UP_END }; static const u16 sIgglybuffLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SING), LEVEL_UP_MOVE(1, MOVE_CHARM), LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(9, MOVE_POUND), LEVEL_UP_MOVE(14, MOVE_SWEET_KISS), LEVEL_UP_END }; static const u16 sTogepiLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_CHARM), LEVEL_UP_MOVE(4, MOVE_METRONOME), LEVEL_UP_MOVE(9, MOVE_SWEET_KISS), LEVEL_UP_MOVE(13, MOVE_YAWN), LEVEL_UP_MOVE(17, MOVE_ENCORE), LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(25, MOVE_FOLLOW_ME), LEVEL_UP_MOVE(29, MOVE_WISH), LEVEL_UP_MOVE(33, MOVE_SAFEGUARD), LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(41, MOVE_BATON_PASS), LEVEL_UP_END }; static const u16 sTogeticLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_MAGICAL_LEAF), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_CHARM), LEVEL_UP_MOVE(1, MOVE_METRONOME), LEVEL_UP_MOVE(1, MOVE_SWEET_KISS), LEVEL_UP_MOVE(4, MOVE_METRONOME), LEVEL_UP_MOVE(9, MOVE_SWEET_KISS), LEVEL_UP_MOVE(13, MOVE_YAWN), LEVEL_UP_MOVE(17, MOVE_ENCORE), LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(25, MOVE_FOLLOW_ME), LEVEL_UP_MOVE(29, MOVE_WISH), LEVEL_UP_MOVE(33, MOVE_SAFEGUARD), LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(41, MOVE_BATON_PASS), LEVEL_UP_END }; static const u16 sNatuLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(20, MOVE_TELEPORT), LEVEL_UP_MOVE(30, MOVE_WISH), LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(40, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(50, MOVE_PSYCHIC), LEVEL_UP_END }; static const u16 sXatuLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(20, MOVE_TELEPORT), LEVEL_UP_MOVE(35, MOVE_WISH), LEVEL_UP_MOVE(35, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(65, MOVE_PSYCHIC), LEVEL_UP_END }; static const u16 sMareepLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(9, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(16, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(23, MOVE_COTTON_SPORE), LEVEL_UP_MOVE(30, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(37, MOVE_THUNDER), LEVEL_UP_END }; static const u16 sFlaaffyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(9, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE), LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(45, MOVE_THUNDER), LEVEL_UP_END }; static const u16 sAmpharosLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(9, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE), LEVEL_UP_MOVE(30, MOVE_THUNDER_PUNCH), LEVEL_UP_MOVE(42, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(57, MOVE_THUNDER), LEVEL_UP_END }; static const u16 sBellossomLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(1, MOVE_STUN_SPORE), LEVEL_UP_MOVE(1, MOVE_MAGICAL_LEAF), LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE), LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM), LEVEL_UP_END }; static const u16 sMarillLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(3, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(15, MOVE_ROLLOUT), LEVEL_UP_MOVE(21, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(28, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(36, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sAzumarillLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(3, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(15, MOVE_ROLLOUT), LEVEL_UP_MOVE(24, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(34, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(57, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sSudowoodoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ROCK_THROW), LEVEL_UP_MOVE(1, MOVE_MIMIC), LEVEL_UP_MOVE(9, MOVE_FLAIL), LEVEL_UP_MOVE(17, MOVE_LOW_KICK), LEVEL_UP_MOVE(25, MOVE_ROCK_SLIDE), LEVEL_UP_MOVE(33, MOVE_BLOCK), LEVEL_UP_MOVE(41, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(49, MOVE_SLAM), LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sPolitoedLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(1, MOVE_HYPNOSIS), LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(1, MOVE_PERISH_SONG), LEVEL_UP_MOVE(35, MOVE_PERISH_SONG), LEVEL_UP_MOVE(51, MOVE_SWAGGER), LEVEL_UP_END }; static const u16 sHoppipLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(5, MOVE_SYNTHESIS), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(10, MOVE_TACKLE), LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(20, MOVE_LEECH_SEED), LEVEL_UP_MOVE(25, MOVE_COTTON_SPORE), LEVEL_UP_MOVE(30, MOVE_MEGA_DRAIN), LEVEL_UP_END }; static const u16 sSkiploomLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(1, MOVE_SYNTHESIS), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(5, MOVE_SYNTHESIS), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(10, MOVE_TACKLE), LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(22, MOVE_LEECH_SEED), LEVEL_UP_MOVE(29, MOVE_COTTON_SPORE), LEVEL_UP_MOVE(36, MOVE_MEGA_DRAIN), LEVEL_UP_END }; static const u16 sJumpluffLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(1, MOVE_SYNTHESIS), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(5, MOVE_SYNTHESIS), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(10, MOVE_TACKLE), LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE(22, MOVE_LEECH_SEED), LEVEL_UP_MOVE(33, MOVE_COTTON_SPORE), LEVEL_UP_MOVE(44, MOVE_MEGA_DRAIN), LEVEL_UP_END }; static const u16 sAipomLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(6, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(13, MOVE_ASTONISH), LEVEL_UP_MOVE(18, MOVE_BATON_PASS), LEVEL_UP_MOVE(25, MOVE_TICKLE), LEVEL_UP_MOVE(31, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(38, MOVE_SWIFT), LEVEL_UP_MOVE(43, MOVE_SCREECH), LEVEL_UP_MOVE(50, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sSunkernLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(6, MOVE_GROWTH), LEVEL_UP_MOVE(13, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(18, MOVE_INGRAIN), LEVEL_UP_MOVE(25, MOVE_ENDEAVOR), LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY), LEVEL_UP_MOVE(37, MOVE_SYNTHESIS), LEVEL_UP_MOVE(42, MOVE_GIGA_DRAIN), LEVEL_UP_END }; static const u16 sSunfloraLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(6, MOVE_GROWTH), LEVEL_UP_MOVE(13, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(18, MOVE_INGRAIN), LEVEL_UP_MOVE(25, MOVE_BULLET_SEED), LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY), LEVEL_UP_MOVE(37, MOVE_PETAL_DANCE), LEVEL_UP_MOVE(42, MOVE_SOLAR_BEAM), LEVEL_UP_END }; static const u16 sYanmaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_FORESIGHT), LEVEL_UP_MOVE(6, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(12, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(17, MOVE_SONIC_BOOM), LEVEL_UP_MOVE(23, MOVE_HYPNOSIS), LEVEL_UP_MOVE(28, MOVE_DETECT), LEVEL_UP_MOVE(34, MOVE_UPROAR), LEVEL_UP_MOVE(39, MOVE_WING_ATTACK), LEVEL_UP_MOVE(45, MOVE_SUPERSONIC), LEVEL_UP_MOVE(50, MOVE_SCREECH), LEVEL_UP_END }; static const u16 sWooperLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(11, MOVE_SLAM), LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), LEVEL_UP_MOVE(21, MOVE_AMNESIA), LEVEL_UP_MOVE(31, MOVE_YAWN), LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(41, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(51, MOVE_MIST), LEVEL_UP_MOVE(51, MOVE_HAZE), LEVEL_UP_END }; static const u16 sQuagsireLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(11, MOVE_SLAM), LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), LEVEL_UP_MOVE(23, MOVE_AMNESIA), LEVEL_UP_MOVE(35, MOVE_YAWN), LEVEL_UP_MOVE(42, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(49, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(61, MOVE_MIST), LEVEL_UP_MOVE(61, MOVE_HAZE), LEVEL_UP_END }; static const u16 sEspeonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_HELPING_HAND), LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(16, MOVE_CONFUSION), LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(30, MOVE_SWIFT), LEVEL_UP_MOVE(36, MOVE_PSYBEAM), LEVEL_UP_MOVE(42, MOVE_PSYCH_UP), LEVEL_UP_MOVE(47, MOVE_PSYCHIC), LEVEL_UP_MOVE(52, MOVE_MORNING_SUN), LEVEL_UP_END }; static const u16 sUmbreonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_HELPING_HAND), LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(16, MOVE_PURSUIT), LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(30, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(36, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK), LEVEL_UP_MOVE(47, MOVE_SCREECH), LEVEL_UP_MOVE(52, MOVE_MOONLIGHT), LEVEL_UP_END }; static const u16 sMurkrowLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(9, MOVE_ASTONISH), LEVEL_UP_MOVE(14, MOVE_PURSUIT), LEVEL_UP_MOVE(22, MOVE_HAZE), LEVEL_UP_MOVE(27, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(35, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(40, MOVE_TAUNT), LEVEL_UP_MOVE(48, MOVE_MEAN_LOOK), LEVEL_UP_END }; static const u16 sSlowkingLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CURSE), LEVEL_UP_MOVE(1, MOVE_YAWN), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(6, MOVE_GROWL), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(17, MOVE_CONFUSION), LEVEL_UP_MOVE(24, MOVE_DISABLE), LEVEL_UP_MOVE(29, MOVE_HEADBUTT), LEVEL_UP_MOVE(36, MOVE_SWAGGER), LEVEL_UP_MOVE(40, MOVE_PSYCHIC), LEVEL_UP_MOVE(47, MOVE_PSYCH_UP), LEVEL_UP_END }; static const u16 sMisdreavusLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_PSYWAVE), LEVEL_UP_MOVE(6, MOVE_SPITE), LEVEL_UP_MOVE(11, MOVE_ASTONISH), LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(23, MOVE_MEAN_LOOK), LEVEL_UP_MOVE(30, MOVE_PSYBEAM), LEVEL_UP_MOVE(37, MOVE_PAIN_SPLIT), LEVEL_UP_MOVE(45, MOVE_PERISH_SONG), LEVEL_UP_MOVE(53, MOVE_GRUDGE), LEVEL_UP_END }; static const u16 sUnownLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HIDDEN_POWER), LEVEL_UP_END }; static const u16 sWobbuffetLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_COUNTER), LEVEL_UP_MOVE(1, MOVE_MIRROR_COAT), LEVEL_UP_MOVE(1, MOVE_SAFEGUARD), LEVEL_UP_MOVE(1, MOVE_DESTINY_BOND), LEVEL_UP_END }; static const u16 sGirafarigLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(7, MOVE_ASTONISH), LEVEL_UP_MOVE(13, MOVE_CONFUSION), LEVEL_UP_MOVE(19, MOVE_STOMP), LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(31, MOVE_AGILITY), LEVEL_UP_MOVE(37, MOVE_BATON_PASS), LEVEL_UP_MOVE(43, MOVE_PSYBEAM), LEVEL_UP_MOVE(49, MOVE_CRUNCH), LEVEL_UP_END }; static const u16 sPinecoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_PROTECT), LEVEL_UP_MOVE(8, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(29, MOVE_BIDE), LEVEL_UP_MOVE(36, MOVE_EXPLOSION), LEVEL_UP_MOVE(43, MOVE_SPIKES), LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sForretressLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_PROTECT), LEVEL_UP_MOVE(1, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(8, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(29, MOVE_BIDE), LEVEL_UP_MOVE(31, MOVE_ZAP_CANNON), LEVEL_UP_MOVE(39, MOVE_EXPLOSION), LEVEL_UP_MOVE(49, MOVE_SPIKES), LEVEL_UP_MOVE(59, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sDunsparceLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_RAGE), LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(11, MOVE_YAWN), LEVEL_UP_MOVE(14, MOVE_GLARE), LEVEL_UP_MOVE(21, MOVE_ROLLOUT), LEVEL_UP_MOVE(24, MOVE_SPITE), LEVEL_UP_MOVE(31, MOVE_PURSUIT), LEVEL_UP_MOVE(34, MOVE_SCREECH), LEVEL_UP_MOVE(41, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(44, MOVE_FLAIL), LEVEL_UP_MOVE(51, MOVE_ENDEAVOR), LEVEL_UP_END }; static const u16 sGligarLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(6, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(13, MOVE_HARDEN), LEVEL_UP_MOVE(20, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(28, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(36, MOVE_SLASH), LEVEL_UP_MOVE(44, MOVE_SCREECH), LEVEL_UP_MOVE(52, MOVE_GUILLOTINE), LEVEL_UP_END }; static const u16 sSteelixLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_SCREECH), LEVEL_UP_MOVE(8, MOVE_BIND), LEVEL_UP_MOVE(12, MOVE_ROCK_THROW), LEVEL_UP_MOVE(19, MOVE_HARDEN), LEVEL_UP_MOVE(23, MOVE_RAGE), LEVEL_UP_MOVE(30, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(34, MOVE_SANDSTORM), LEVEL_UP_MOVE(41, MOVE_SLAM), LEVEL_UP_MOVE(45, MOVE_IRON_TAIL), LEVEL_UP_MOVE(52, MOVE_CRUNCH), LEVEL_UP_MOVE(56, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sSnubbullLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_SCARY_FACE), LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(8, MOVE_CHARM), LEVEL_UP_MOVE(13, MOVE_BITE), LEVEL_UP_MOVE(19, MOVE_LICK), LEVEL_UP_MOVE(26, MOVE_ROAR), LEVEL_UP_MOVE(34, MOVE_RAGE), LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(53, MOVE_CRUNCH), LEVEL_UP_END }; static const u16 sGranbullLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_SCARY_FACE), LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(8, MOVE_CHARM), LEVEL_UP_MOVE(13, MOVE_BITE), LEVEL_UP_MOVE(19, MOVE_LICK), LEVEL_UP_MOVE(28, MOVE_ROAR), LEVEL_UP_MOVE(38, MOVE_RAGE), LEVEL_UP_MOVE(49, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(61, MOVE_CRUNCH), LEVEL_UP_END }; static const u16 sQwilfishLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPIKES), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(9, MOVE_HARDEN), LEVEL_UP_MOVE(9, MOVE_MINIMIZE), LEVEL_UP_MOVE(13, MOVE_WATER_GUN), LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE), LEVEL_UP_MOVE(25, MOVE_REVENGE), LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(37, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(45, MOVE_DESTINY_BOND), LEVEL_UP_END }; static const u16 sScizorLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(6, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(11, MOVE_PURSUIT), LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE), LEVEL_UP_MOVE(21, MOVE_AGILITY), LEVEL_UP_MOVE(26, MOVE_METAL_CLAW), LEVEL_UP_MOVE(31, MOVE_SLASH), LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER), LEVEL_UP_END }; static const u16 sShuckleLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CONSTRICT), LEVEL_UP_MOVE(1, MOVE_WITHDRAW), LEVEL_UP_MOVE(9, MOVE_WRAP), LEVEL_UP_MOVE(14, MOVE_ENCORE), LEVEL_UP_MOVE(23, MOVE_SAFEGUARD), LEVEL_UP_MOVE(28, MOVE_BIDE), LEVEL_UP_MOVE(37, MOVE_REST), LEVEL_UP_END }; static const u16 sHeracrossLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(6, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(11, MOVE_ENDURE), LEVEL_UP_MOVE(17, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(23, MOVE_BRICK_BREAK), LEVEL_UP_MOVE(30, MOVE_COUNTER), LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(45, MOVE_REVERSAL), LEVEL_UP_MOVE(53, MOVE_MEGAHORN), LEVEL_UP_END }; static const u16 sSneaselLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_TAUNT), LEVEL_UP_MOVE(8, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(15, MOVE_SCREECH), LEVEL_UP_MOVE(22, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(36, MOVE_AGILITY), LEVEL_UP_MOVE(43, MOVE_ICY_WIND), LEVEL_UP_MOVE(50, MOVE_SLASH), LEVEL_UP_MOVE(57, MOVE_BEAT_UP), LEVEL_UP_MOVE(64, MOVE_METAL_CLAW), LEVEL_UP_END }; static const u16 sTeddiursaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(7, MOVE_LICK), LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS), LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(31, MOVE_REST), LEVEL_UP_MOVE(37, MOVE_SLASH), LEVEL_UP_MOVE(43, MOVE_SNORE), LEVEL_UP_MOVE(49, MOVE_THRASH), LEVEL_UP_END }; static const u16 sUrsaringLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_LICK), LEVEL_UP_MOVE(1, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(7, MOVE_LICK), LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS), LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(31, MOVE_REST), LEVEL_UP_MOVE(37, MOVE_SLASH), LEVEL_UP_MOVE(43, MOVE_SNORE), LEVEL_UP_MOVE(49, MOVE_THRASH), LEVEL_UP_END }; static const u16 sSlugmaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_YAWN), LEVEL_UP_MOVE(1, MOVE_SMOG), LEVEL_UP_MOVE(8, MOVE_EMBER), LEVEL_UP_MOVE(15, MOVE_ROCK_THROW), LEVEL_UP_MOVE(22, MOVE_HARDEN), LEVEL_UP_MOVE(29, MOVE_AMNESIA), LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(43, MOVE_ROCK_SLIDE), LEVEL_UP_MOVE(50, MOVE_BODY_SLAM), LEVEL_UP_END }; static const u16 sMagcargoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_YAWN), LEVEL_UP_MOVE(1, MOVE_SMOG), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(1, MOVE_ROCK_THROW), LEVEL_UP_MOVE(8, MOVE_EMBER), LEVEL_UP_MOVE(15, MOVE_ROCK_THROW), LEVEL_UP_MOVE(22, MOVE_HARDEN), LEVEL_UP_MOVE(29, MOVE_AMNESIA), LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(48, MOVE_ROCK_SLIDE), LEVEL_UP_MOVE(60, MOVE_BODY_SLAM), LEVEL_UP_END }; static const u16 sSwinubLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(19, MOVE_ENDURE), LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(37, MOVE_MIST), LEVEL_UP_MOVE(46, MOVE_BLIZZARD), LEVEL_UP_MOVE(55, MOVE_AMNESIA), LEVEL_UP_END }; static const u16 sPiloswineLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(1, MOVE_ENDURE), LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(19, MOVE_ENDURE), LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(33, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(42, MOVE_MIST), LEVEL_UP_MOVE(56, MOVE_BLIZZARD), LEVEL_UP_MOVE(70, MOVE_AMNESIA), LEVEL_UP_END }; static const u16 sCorsolaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(6, MOVE_HARDEN), LEVEL_UP_MOVE(12, MOVE_BUBBLE), LEVEL_UP_MOVE(17, MOVE_RECOVER), LEVEL_UP_MOVE(17, MOVE_REFRESH), LEVEL_UP_MOVE(23, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(28, MOVE_SPIKE_CANNON), LEVEL_UP_MOVE(34, MOVE_ROCK_BLAST), LEVEL_UP_MOVE(39, MOVE_MIRROR_COAT), LEVEL_UP_MOVE(45, MOVE_ANCIENT_POWER), LEVEL_UP_END }; static const u16 sRemoraidLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(11, MOVE_LOCK_ON), LEVEL_UP_MOVE(22, MOVE_PSYBEAM), LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(33, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(44, MOVE_ICE_BEAM), LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sOctilleryLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(11, MOVE_CONSTRICT), LEVEL_UP_MOVE(22, MOVE_PSYBEAM), LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(25, MOVE_OCTAZOOKA), LEVEL_UP_MOVE(38, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(54, MOVE_ICE_BEAM), LEVEL_UP_MOVE(70, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sDelibirdLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PRESENT), LEVEL_UP_END }; static const u16 sMantineLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(8, MOVE_SUPERSONIC), LEVEL_UP_MOVE(15, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(22, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(29, MOVE_AGILITY), LEVEL_UP_MOVE(36, MOVE_WING_ATTACK), LEVEL_UP_MOVE(43, MOVE_WATER_PULSE), LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY), LEVEL_UP_END }; static const u16 sSkarmoryLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(10, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(13, MOVE_SWIFT), LEVEL_UP_MOVE(16, MOVE_AGILITY), LEVEL_UP_MOVE(26, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(29, MOVE_AIR_CUTTER), LEVEL_UP_MOVE(32, MOVE_STEEL_WING), LEVEL_UP_MOVE(42, MOVE_SPIKES), LEVEL_UP_MOVE(45, MOVE_METAL_SOUND), LEVEL_UP_END }; static const u16 sHoundourLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(7, MOVE_HOWL), LEVEL_UP_MOVE(13, MOVE_SMOG), LEVEL_UP_MOVE(19, MOVE_ROAR), LEVEL_UP_MOVE(25, MOVE_BITE), LEVEL_UP_MOVE(31, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(49, MOVE_CRUNCH), LEVEL_UP_END }; static const u16 sHoundoomLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(1, MOVE_HOWL), LEVEL_UP_MOVE(7, MOVE_HOWL), LEVEL_UP_MOVE(13, MOVE_SMOG), LEVEL_UP_MOVE(19, MOVE_ROAR), LEVEL_UP_MOVE(27, MOVE_BITE), LEVEL_UP_MOVE(35, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(43, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(59, MOVE_CRUNCH), LEVEL_UP_END }; static const u16 sKingdraLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(8, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(15, MOVE_LEER), LEVEL_UP_MOVE(22, MOVE_WATER_GUN), LEVEL_UP_MOVE(29, MOVE_TWISTER), LEVEL_UP_MOVE(40, MOVE_AGILITY), LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE), LEVEL_UP_END }; static const u16 sPhanpyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(9, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(17, MOVE_FLAIL), LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(33, MOVE_ROLLOUT), LEVEL_UP_MOVE(41, MOVE_ENDURE), LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sDonphanLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(9, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(17, MOVE_FLAIL), LEVEL_UP_MOVE(25, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(33, MOVE_ROLLOUT), LEVEL_UP_MOVE(41, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(49, MOVE_EARTHQUAKE), LEVEL_UP_END }; static const u16 sPorygon2LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CONVERSION_2), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_CONVERSION), LEVEL_UP_MOVE(9, MOVE_AGILITY), LEVEL_UP_MOVE(12, MOVE_PSYBEAM), LEVEL_UP_MOVE(20, MOVE_RECOVER), LEVEL_UP_MOVE(24, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(32, MOVE_LOCK_ON), LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK), LEVEL_UP_MOVE(44, MOVE_RECYCLE), LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON), LEVEL_UP_END }; static const u16 sStantlerLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(7, MOVE_LEER), LEVEL_UP_MOVE(11, MOVE_ASTONISH), LEVEL_UP_MOVE(17, MOVE_HYPNOSIS), LEVEL_UP_MOVE(21, MOVE_STOMP), LEVEL_UP_MOVE(27, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(31, MOVE_ROLE_PLAY), LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(41, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(47, MOVE_CALM_MIND), LEVEL_UP_END }; static const u16 sSmeargleLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SKETCH), LEVEL_UP_MOVE(11, MOVE_SKETCH), LEVEL_UP_MOVE(21, MOVE_SKETCH), LEVEL_UP_MOVE(31, MOVE_SKETCH), LEVEL_UP_MOVE(41, MOVE_SKETCH), LEVEL_UP_MOVE(51, MOVE_SKETCH), LEVEL_UP_MOVE(61, MOVE_SKETCH), LEVEL_UP_MOVE(71, MOVE_SKETCH), LEVEL_UP_MOVE(81, MOVE_SKETCH), LEVEL_UP_MOVE(91, MOVE_SKETCH), LEVEL_UP_END }; static const u16 sTyrogueLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sHitmontopLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_REVENGE), LEVEL_UP_MOVE(1, MOVE_ROLLING_KICK), LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(13, MOVE_PURSUIT), LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(20, MOVE_TRIPLE_KICK), LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(31, MOVE_COUNTER), LEVEL_UP_MOVE(37, MOVE_AGILITY), LEVEL_UP_MOVE(43, MOVE_DETECT), LEVEL_UP_MOVE(49, MOVE_ENDEAVOR), LEVEL_UP_END }; static const u16 sSmoochumLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_LICK), LEVEL_UP_MOVE(9, MOVE_SWEET_KISS), LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(21, MOVE_CONFUSION), LEVEL_UP_MOVE(25, MOVE_SING), LEVEL_UP_MOVE(33, MOVE_MEAN_LOOK), LEVEL_UP_MOVE(37, MOVE_FAKE_TEARS), LEVEL_UP_MOVE(45, MOVE_PSYCHIC), LEVEL_UP_MOVE(49, MOVE_PERISH_SONG), LEVEL_UP_MOVE(57, MOVE_BLIZZARD), LEVEL_UP_END }; static const u16 sElekidLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(9, MOVE_THUNDER_PUNCH), LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(25, MOVE_SWIFT), LEVEL_UP_MOVE(33, MOVE_SCREECH), LEVEL_UP_MOVE(41, MOVE_THUNDERBOLT), LEVEL_UP_MOVE(49, MOVE_THUNDER), LEVEL_UP_END }; static const u16 sMagbyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(7, MOVE_LEER), LEVEL_UP_MOVE(13, MOVE_SMOG), LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH), LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY), LEVEL_UP_MOVE(37, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(43, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(49, MOVE_FIRE_BLAST), LEVEL_UP_END }; static const u16 sMiltankLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(4, MOVE_GROWL), LEVEL_UP_MOVE(8, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(13, MOVE_STOMP), LEVEL_UP_MOVE(19, MOVE_MILK_DRINK), LEVEL_UP_MOVE(26, MOVE_BIDE), LEVEL_UP_MOVE(34, MOVE_ROLLOUT), LEVEL_UP_MOVE(43, MOVE_BODY_SLAM), LEVEL_UP_MOVE(53, MOVE_HEAL_BELL), LEVEL_UP_END }; static const u16 sBlisseyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(7, MOVE_REFRESH), LEVEL_UP_MOVE(10, MOVE_SOFT_BOILED), LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(18, MOVE_MINIMIZE), LEVEL_UP_MOVE(23, MOVE_SING), LEVEL_UP_MOVE(28, MOVE_EGG_BOMB), LEVEL_UP_MOVE(33, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(40, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(47, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sRaikouLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(11, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE(21, MOVE_ROAR), LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(41, MOVE_SPARK), LEVEL_UP_MOVE(51, MOVE_REFLECT), LEVEL_UP_MOVE(61, MOVE_CRUNCH), LEVEL_UP_MOVE(71, MOVE_THUNDER), LEVEL_UP_MOVE(81, MOVE_CALM_MIND), LEVEL_UP_END }; static const u16 sEnteiLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(11, MOVE_EMBER), LEVEL_UP_MOVE(21, MOVE_ROAR), LEVEL_UP_MOVE(31, MOVE_FIRE_SPIN), LEVEL_UP_MOVE(41, MOVE_STOMP), LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(61, MOVE_SWAGGER), LEVEL_UP_MOVE(71, MOVE_FIRE_BLAST), LEVEL_UP_MOVE(81, MOVE_CALM_MIND), LEVEL_UP_END }; static const u16 sSuicuneLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(11, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(21, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(31, MOVE_GUST), LEVEL_UP_MOVE(41, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(51, MOVE_MIST), LEVEL_UP_MOVE(61, MOVE_MIRROR_COAT), LEVEL_UP_MOVE(71, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(81, MOVE_CALM_MIND), LEVEL_UP_END }; static const u16 sLarvitarLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(8, MOVE_SANDSTORM), LEVEL_UP_MOVE(15, MOVE_SCREECH), LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), LEVEL_UP_MOVE(29, MOVE_THRASH), LEVEL_UP_MOVE(36, MOVE_SCARY_FACE), LEVEL_UP_MOVE(43, MOVE_CRUNCH), LEVEL_UP_MOVE(50, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sPupitarLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_SANDSTORM), LEVEL_UP_MOVE(1, MOVE_SCREECH), LEVEL_UP_MOVE(8, MOVE_SANDSTORM), LEVEL_UP_MOVE(15, MOVE_SCREECH), LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), LEVEL_UP_MOVE(29, MOVE_THRASH), LEVEL_UP_MOVE(38, MOVE_SCARY_FACE), LEVEL_UP_MOVE(47, MOVE_CRUNCH), LEVEL_UP_MOVE(56, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sTyranitarLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_SANDSTORM), LEVEL_UP_MOVE(1, MOVE_SCREECH), LEVEL_UP_MOVE(8, MOVE_SANDSTORM), LEVEL_UP_MOVE(15, MOVE_SCREECH), LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), LEVEL_UP_MOVE(29, MOVE_THRASH), LEVEL_UP_MOVE(38, MOVE_SCARY_FACE), LEVEL_UP_MOVE(47, MOVE_CRUNCH), LEVEL_UP_MOVE(61, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sLugiaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WHIRLWIND), LEVEL_UP_MOVE(11, MOVE_SAFEGUARD), LEVEL_UP_MOVE(22, MOVE_GUST), LEVEL_UP_MOVE(33, MOVE_RECOVER), LEVEL_UP_MOVE(44, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(55, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(66, MOVE_SWIFT), LEVEL_UP_MOVE(77, MOVE_AEROBLAST), LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; static const u16 sHoOhLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WHIRLWIND), LEVEL_UP_MOVE(11, MOVE_SAFEGUARD), LEVEL_UP_MOVE(22, MOVE_GUST), LEVEL_UP_MOVE(33, MOVE_RECOVER), LEVEL_UP_MOVE(44, MOVE_FIRE_BLAST), LEVEL_UP_MOVE(55, MOVE_SUNNY_DAY), LEVEL_UP_MOVE(66, MOVE_SWIFT), LEVEL_UP_MOVE(77, MOVE_SACRED_FIRE), LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; static const u16 sCelebiLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEECH_SEED), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(1, MOVE_RECOVER), LEVEL_UP_MOVE(1, MOVE_HEAL_BELL), LEVEL_UP_MOVE(10, MOVE_SAFEGUARD), LEVEL_UP_MOVE(20, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(40, MOVE_BATON_PASS), LEVEL_UP_MOVE(50, MOVE_PERISH_SONG), LEVEL_UP_END }; static const u16 sSpecies252LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies253LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies254LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies255LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies256LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies257LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies258LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies259LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies260LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies261LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies262LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies263LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies264LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies265LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies266LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies267LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies268LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies269LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies270LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies271LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies272LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies273LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies274LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies275LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sSpecies276LevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_END }; static const u16 sTreeckoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(6, MOVE_ABSORB), LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(16, MOVE_PURSUIT), LEVEL_UP_MOVE(21, MOVE_SCREECH), LEVEL_UP_MOVE(26, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(31, MOVE_AGILITY), LEVEL_UP_MOVE(36, MOVE_SLAM), LEVEL_UP_MOVE(41, MOVE_DETECT), LEVEL_UP_MOVE(46, MOVE_GIGA_DRAIN), LEVEL_UP_END }; static const u16 sGrovyleLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(6, MOVE_ABSORB), LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER), LEVEL_UP_MOVE(17, MOVE_PURSUIT), LEVEL_UP_MOVE(23, MOVE_SCREECH), LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE), LEVEL_UP_MOVE(35, MOVE_AGILITY), LEVEL_UP_MOVE(41, MOVE_SLAM), LEVEL_UP_MOVE(47, MOVE_DETECT), LEVEL_UP_MOVE(53, MOVE_FALSE_SWIPE), LEVEL_UP_END }; static const u16 sSceptileLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(6, MOVE_ABSORB), LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER), LEVEL_UP_MOVE(17, MOVE_PURSUIT), LEVEL_UP_MOVE(23, MOVE_SCREECH), LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE), LEVEL_UP_MOVE(35, MOVE_AGILITY), LEVEL_UP_MOVE(43, MOVE_SLAM), LEVEL_UP_MOVE(51, MOVE_DETECT), LEVEL_UP_MOVE(59, MOVE_FALSE_SWIPE), LEVEL_UP_END }; static const u16 sTorchicLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(10, MOVE_EMBER), LEVEL_UP_MOVE(16, MOVE_PECK), LEVEL_UP_MOVE(19, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), LEVEL_UP_MOVE(28, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(34, MOVE_SLASH), LEVEL_UP_MOVE(37, MOVE_MIRROR_MOVE), LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER), LEVEL_UP_END }; static const u16 sCombuskenLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(13, MOVE_EMBER), LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(17, MOVE_PECK), LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(28, MOVE_BULK_UP), LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(39, MOVE_SLASH), LEVEL_UP_MOVE(43, MOVE_MIRROR_MOVE), LEVEL_UP_MOVE(50, MOVE_SKY_UPPERCUT), LEVEL_UP_END }; static const u16 sBlazikenLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_FIRE_PUNCH), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(13, MOVE_EMBER), LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE(17, MOVE_PECK), LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(28, MOVE_BULK_UP), LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(36, MOVE_BLAZE_KICK), LEVEL_UP_MOVE(42, MOVE_SLASH), LEVEL_UP_MOVE(49, MOVE_MIRROR_MOVE), LEVEL_UP_MOVE(59, MOVE_SKY_UPPERCUT), LEVEL_UP_END }; static const u16 sMudkipLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(6, MOVE_MUD_SLAP), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(15, MOVE_BIDE), LEVEL_UP_MOVE(19, MOVE_FORESIGHT), LEVEL_UP_MOVE(24, MOVE_MUD_SPORT), LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(33, MOVE_WHIRLPOOL), LEVEL_UP_MOVE(37, MOVE_PROTECT), LEVEL_UP_MOVE(42, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(46, MOVE_ENDEAVOR), LEVEL_UP_END }; static const u16 sMarshtompLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_MUD_SLAP), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(6, MOVE_MUD_SLAP), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(15, MOVE_BIDE), LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), LEVEL_UP_MOVE(20, MOVE_FORESIGHT), LEVEL_UP_MOVE(25, MOVE_MUD_SPORT), LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(37, MOVE_MUDDY_WATER), LEVEL_UP_MOVE(42, MOVE_PROTECT), LEVEL_UP_MOVE(46, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(53, MOVE_ENDEAVOR), LEVEL_UP_END }; static const u16 sSwampertLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_MUD_SLAP), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(6, MOVE_MUD_SLAP), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(15, MOVE_BIDE), LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), LEVEL_UP_MOVE(20, MOVE_FORESIGHT), LEVEL_UP_MOVE(25, MOVE_MUD_SPORT), LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(39, MOVE_MUDDY_WATER), LEVEL_UP_MOVE(46, MOVE_PROTECT), LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(61, MOVE_ENDEAVOR), LEVEL_UP_END }; static const u16 sPoochyenaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(5, MOVE_HOWL), LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(13, MOVE_BITE), LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(21, MOVE_ROAR), LEVEL_UP_MOVE(25, MOVE_SWAGGER), LEVEL_UP_MOVE(29, MOVE_SCARY_FACE), LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(37, MOVE_TAUNT), LEVEL_UP_MOVE(41, MOVE_CRUNCH), LEVEL_UP_MOVE(45, MOVE_THIEF), LEVEL_UP_END }; static const u16 sMightyenaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_HOWL), LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(5, MOVE_HOWL), LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(13, MOVE_BITE), LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(22, MOVE_ROAR), LEVEL_UP_MOVE(27, MOVE_SWAGGER), LEVEL_UP_MOVE(32, MOVE_SCARY_FACE), LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(42, MOVE_TAUNT), LEVEL_UP_MOVE(47, MOVE_CRUNCH), LEVEL_UP_MOVE(52, MOVE_THIEF), LEVEL_UP_END }; static const u16 sZigzagoonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(9, MOVE_HEADBUTT), LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(21, MOVE_MUD_SPORT), LEVEL_UP_MOVE(25, MOVE_PIN_MISSILE), LEVEL_UP_MOVE(29, MOVE_COVET), LEVEL_UP_MOVE(33, MOVE_FLAIL), LEVEL_UP_MOVE(37, MOVE_REST), LEVEL_UP_MOVE(41, MOVE_BELLY_DRUM), LEVEL_UP_END }; static const u16 sLinooneLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_HEADBUTT), LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(9, MOVE_HEADBUTT), LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(23, MOVE_MUD_SPORT), LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(35, MOVE_COVET), LEVEL_UP_MOVE(41, MOVE_SLASH), LEVEL_UP_MOVE(47, MOVE_REST), LEVEL_UP_MOVE(53, MOVE_BELLY_DRUM), LEVEL_UP_END }; static const u16 sWurmpleLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_STRING_SHOT), LEVEL_UP_MOVE(5, MOVE_POISON_STING), LEVEL_UP_END }; static const u16 sSilcoonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_HARDEN), LEVEL_UP_END }; static const u16 sBeautiflyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(10, MOVE_ABSORB), LEVEL_UP_MOVE(13, MOVE_GUST), LEVEL_UP_MOVE(17, MOVE_STUN_SPORE), LEVEL_UP_MOVE(20, MOVE_MORNING_SUN), LEVEL_UP_MOVE(24, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(27, MOVE_WHIRLWIND), LEVEL_UP_MOVE(31, MOVE_ATTRACT), LEVEL_UP_MOVE(34, MOVE_SILVER_WIND), LEVEL_UP_MOVE(38, MOVE_GIGA_DRAIN), LEVEL_UP_END }; static const u16 sCascoonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_HARDEN), LEVEL_UP_END }; static const u16 sDustoxLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(10, MOVE_CONFUSION), LEVEL_UP_MOVE(13, MOVE_GUST), LEVEL_UP_MOVE(17, MOVE_PROTECT), LEVEL_UP_MOVE(20, MOVE_MOONLIGHT), LEVEL_UP_MOVE(24, MOVE_PSYBEAM), LEVEL_UP_MOVE(27, MOVE_WHIRLWIND), LEVEL_UP_MOVE(31, MOVE_LIGHT_SCREEN), LEVEL_UP_MOVE(34, MOVE_SILVER_WIND), LEVEL_UP_MOVE(38, MOVE_TOXIC), LEVEL_UP_END }; static const u16 sLotadLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(3, MOVE_GROWL), LEVEL_UP_MOVE(7, MOVE_ABSORB), LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), LEVEL_UP_MOVE(21, MOVE_MIST), LEVEL_UP_MOVE(31, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(43, MOVE_MEGA_DRAIN), LEVEL_UP_END }; static const u16 sLombreLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(3, MOVE_GROWL), LEVEL_UP_MOVE(7, MOVE_ABSORB), LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), LEVEL_UP_MOVE(25, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(31, MOVE_WATER_SPORT), LEVEL_UP_MOVE(37, MOVE_THIEF), LEVEL_UP_MOVE(43, MOVE_UPROAR), LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sLudicoloLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_NATURE_POWER), LEVEL_UP_END }; static const u16 sSeedotLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BIDE), LEVEL_UP_MOVE(3, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_GROWTH), LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), LEVEL_UP_MOVE(21, MOVE_SYNTHESIS), LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY), LEVEL_UP_MOVE(43, MOVE_EXPLOSION), LEVEL_UP_END }; static const u16 sNuzleafLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(3, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_GROWTH), LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), LEVEL_UP_MOVE(25, MOVE_TORMENT), LEVEL_UP_MOVE(31, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(37, MOVE_RAZOR_WIND), LEVEL_UP_MOVE(43, MOVE_SWAGGER), LEVEL_UP_MOVE(49, MOVE_EXTRASENSORY), LEVEL_UP_END }; static const u16 sShiftryLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(1, MOVE_GROWTH), LEVEL_UP_MOVE(1, MOVE_NATURE_POWER), LEVEL_UP_END }; static const u16 sNincadaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(5, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(19, MOVE_MIND_READER), LEVEL_UP_MOVE(25, MOVE_FALSE_SWIPE), LEVEL_UP_MOVE(31, MOVE_MUD_SLAP), LEVEL_UP_MOVE(38, MOVE_METAL_CLAW), LEVEL_UP_MOVE(45, MOVE_DIG), LEVEL_UP_END }; static const u16 sNinjaskLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(5, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(19, MOVE_MIND_READER), LEVEL_UP_MOVE(20, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(20, MOVE_FURY_CUTTER), LEVEL_UP_MOVE(20, MOVE_SCREECH), LEVEL_UP_MOVE(25, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE(31, MOVE_SLASH), LEVEL_UP_MOVE(38, MOVE_AGILITY), LEVEL_UP_MOVE(45, MOVE_BATON_PASS), LEVEL_UP_END }; static const u16 sShedinjaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(5, MOVE_LEECH_LIFE), LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(19, MOVE_MIND_READER), LEVEL_UP_MOVE(25, MOVE_SPITE), LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(38, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(45, MOVE_GRUDGE), LEVEL_UP_END }; static const u16 sTaillowLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(4, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(8, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(26, MOVE_ENDEAVOR), LEVEL_UP_MOVE(34, MOVE_AERIAL_ACE), LEVEL_UP_MOVE(43, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sSwellowLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(4, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(8, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(28, MOVE_ENDEAVOR), LEVEL_UP_MOVE(38, MOVE_AERIAL_ACE), LEVEL_UP_MOVE(49, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sShroomishLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(4, MOVE_TACKLE), LEVEL_UP_MOVE(7, MOVE_STUN_SPORE), LEVEL_UP_MOVE(10, MOVE_LEECH_SEED), LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(22, MOVE_HEADBUTT), LEVEL_UP_MOVE(28, MOVE_POISON_POWDER), LEVEL_UP_MOVE(36, MOVE_GROWTH), LEVEL_UP_MOVE(45, MOVE_GIGA_DRAIN), LEVEL_UP_MOVE(54, MOVE_SPORE), LEVEL_UP_END }; static const u16 sBreloomLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_STUN_SPORE), LEVEL_UP_MOVE(1, MOVE_LEECH_SEED), LEVEL_UP_MOVE(4, MOVE_TACKLE), LEVEL_UP_MOVE(7, MOVE_STUN_SPORE), LEVEL_UP_MOVE(10, MOVE_LEECH_SEED), LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(22, MOVE_HEADBUTT), LEVEL_UP_MOVE(23, MOVE_MACH_PUNCH), LEVEL_UP_MOVE(28, MOVE_COUNTER), LEVEL_UP_MOVE(36, MOVE_SKY_UPPERCUT), LEVEL_UP_MOVE(45, MOVE_MIND_READER), LEVEL_UP_MOVE(54, MOVE_DYNAMIC_PUNCH), LEVEL_UP_END }; static const u16 sSpindaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(5, MOVE_UPROAR), LEVEL_UP_MOVE(12, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(16, MOVE_PSYBEAM), LEVEL_UP_MOVE(23, MOVE_HYPNOSIS), LEVEL_UP_MOVE(27, MOVE_DIZZY_PUNCH), LEVEL_UP_MOVE(34, MOVE_TEETER_DANCE), LEVEL_UP_MOVE(38, MOVE_PSYCH_UP), LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(49, MOVE_FLAIL), LEVEL_UP_MOVE(56, MOVE_THRASH), LEVEL_UP_END }; static const u16 sWingullLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(7, MOVE_SUPERSONIC), LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), LEVEL_UP_MOVE(21, MOVE_MIST), LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(43, MOVE_PURSUIT), LEVEL_UP_MOVE(55, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sPelipperLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(1, MOVE_WATER_SPORT), LEVEL_UP_MOVE(1, MOVE_WING_ATTACK), LEVEL_UP_MOVE(3, MOVE_WATER_GUN), LEVEL_UP_MOVE(7, MOVE_SUPERSONIC), LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), LEVEL_UP_MOVE(21, MOVE_MIST), LEVEL_UP_MOVE(25, MOVE_PROTECT), LEVEL_UP_MOVE(33, MOVE_STOCKPILE), LEVEL_UP_MOVE(33, MOVE_SWALLOW), LEVEL_UP_MOVE(47, MOVE_SPIT_UP), LEVEL_UP_MOVE(61, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sSurskitLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(19, MOVE_WATER_SPORT), LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(31, MOVE_AGILITY), LEVEL_UP_MOVE(37, MOVE_MIST), LEVEL_UP_MOVE(37, MOVE_HAZE), LEVEL_UP_END }; static const u16 sMasquerainLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(1, MOVE_WATER_SPORT), LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(19, MOVE_WATER_SPORT), LEVEL_UP_MOVE(26, MOVE_GUST), LEVEL_UP_MOVE(33, MOVE_SCARY_FACE), LEVEL_UP_MOVE(40, MOVE_STUN_SPORE), LEVEL_UP_MOVE(47, MOVE_SILVER_WIND), LEVEL_UP_MOVE(53, MOVE_WHIRLWIND), LEVEL_UP_END }; static const u16 sWailmerLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(5, MOVE_GROWL), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(14, MOVE_ROLLOUT), LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL), LEVEL_UP_MOVE(23, MOVE_ASTONISH), LEVEL_UP_MOVE(28, MOVE_WATER_PULSE), LEVEL_UP_MOVE(32, MOVE_MIST), LEVEL_UP_MOVE(37, MOVE_REST), LEVEL_UP_MOVE(41, MOVE_WATER_SPOUT), LEVEL_UP_MOVE(46, MOVE_AMNESIA), LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sWailordLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(1, MOVE_ROLLOUT), LEVEL_UP_MOVE(5, MOVE_GROWL), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(14, MOVE_ROLLOUT), LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL), LEVEL_UP_MOVE(23, MOVE_ASTONISH), LEVEL_UP_MOVE(28, MOVE_WATER_PULSE), LEVEL_UP_MOVE(32, MOVE_MIST), LEVEL_UP_MOVE(37, MOVE_REST), LEVEL_UP_MOVE(44, MOVE_WATER_SPOUT), LEVEL_UP_MOVE(52, MOVE_AMNESIA), LEVEL_UP_MOVE(59, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sSkittyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(3, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(7, MOVE_ATTRACT), LEVEL_UP_MOVE(13, MOVE_SING), LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE(19, MOVE_ASSIST), LEVEL_UP_MOVE(25, MOVE_CHARM), LEVEL_UP_MOVE(27, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(31, MOVE_COVET), LEVEL_UP_MOVE(37, MOVE_HEAL_BELL), LEVEL_UP_MOVE(39, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sDelcattyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_ATTRACT), LEVEL_UP_MOVE(1, MOVE_SING), LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP), LEVEL_UP_END }; static const u16 sKecleonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_THIEF), LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(1, MOVE_LICK), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(4, MOVE_BIND), LEVEL_UP_MOVE(7, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(17, MOVE_PSYBEAM), LEVEL_UP_MOVE(24, MOVE_SCREECH), LEVEL_UP_MOVE(31, MOVE_SLASH), LEVEL_UP_MOVE(40, MOVE_SUBSTITUTE), LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER), LEVEL_UP_END }; static const u16 sBaltoyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(3, MOVE_HARDEN), LEVEL_UP_MOVE(5, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(7, MOVE_MUD_SLAP), LEVEL_UP_MOVE(11, MOVE_PSYBEAM), LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB), LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(31, MOVE_SANDSTORM), LEVEL_UP_MOVE(37, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(45, MOVE_EXPLOSION), LEVEL_UP_END }; static const u16 sClaydolLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TELEPORT), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(1, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(3, MOVE_HARDEN), LEVEL_UP_MOVE(5, MOVE_RAPID_SPIN), LEVEL_UP_MOVE(7, MOVE_MUD_SLAP), LEVEL_UP_MOVE(11, MOVE_PSYBEAM), LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB), LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT), LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(31, MOVE_SANDSTORM), LEVEL_UP_MOVE(36, MOVE_HYPER_BEAM), LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(55, MOVE_EXPLOSION), LEVEL_UP_END }; static const u16 sNosepassLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(7, MOVE_HARDEN), LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), LEVEL_UP_MOVE(16, MOVE_BLOCK), LEVEL_UP_MOVE(22, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(28, MOVE_ROCK_SLIDE), LEVEL_UP_MOVE(31, MOVE_SANDSTORM), LEVEL_UP_MOVE(37, MOVE_REST), LEVEL_UP_MOVE(43, MOVE_ZAP_CANNON), LEVEL_UP_MOVE(46, MOVE_LOCK_ON), LEVEL_UP_END }; static const u16 sTorkoalLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(4, MOVE_SMOG), LEVEL_UP_MOVE(7, MOVE_CURSE), LEVEL_UP_MOVE(14, MOVE_SMOKESCREEN), LEVEL_UP_MOVE(17, MOVE_FIRE_SPIN), LEVEL_UP_MOVE(20, MOVE_BODY_SLAM), LEVEL_UP_MOVE(27, MOVE_PROTECT), LEVEL_UP_MOVE(30, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(33, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(40, MOVE_AMNESIA), LEVEL_UP_MOVE(43, MOVE_FLAIL), LEVEL_UP_MOVE(46, MOVE_HEAT_WAVE), LEVEL_UP_END }; static const u16 sSableyeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(5, MOVE_FORESIGHT), LEVEL_UP_MOVE(9, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(13, MOVE_ASTONISH), LEVEL_UP_MOVE(17, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(21, MOVE_FAKE_OUT), LEVEL_UP_MOVE(25, MOVE_DETECT), LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(33, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(37, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(41, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK), LEVEL_UP_END }; static const u16 sBarboachLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_MUD_SLAP), LEVEL_UP_MOVE(6, MOVE_MUD_SPORT), LEVEL_UP_MOVE(6, MOVE_WATER_SPORT), LEVEL_UP_MOVE(11, MOVE_WATER_GUN), LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), LEVEL_UP_MOVE(21, MOVE_AMNESIA), LEVEL_UP_MOVE(26, MOVE_REST), LEVEL_UP_MOVE(26, MOVE_SNORE), LEVEL_UP_MOVE(31, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(41, MOVE_FISSURE), LEVEL_UP_END }; static const u16 sWhiscashLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TICKLE), LEVEL_UP_MOVE(1, MOVE_MUD_SLAP), LEVEL_UP_MOVE(1, MOVE_MUD_SPORT), LEVEL_UP_MOVE(1, MOVE_WATER_SPORT), LEVEL_UP_MOVE(6, MOVE_MUD_SPORT), LEVEL_UP_MOVE(6, MOVE_WATER_SPORT), LEVEL_UP_MOVE(11, MOVE_WATER_GUN), LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), LEVEL_UP_MOVE(21, MOVE_AMNESIA), LEVEL_UP_MOVE(26, MOVE_REST), LEVEL_UP_MOVE(26, MOVE_SNORE), LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(46, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(56, MOVE_FISSURE), LEVEL_UP_END }; static const u16 sLuvdiscLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(4, MOVE_CHARM), LEVEL_UP_MOVE(12, MOVE_WATER_GUN), LEVEL_UP_MOVE(16, MOVE_AGILITY), LEVEL_UP_MOVE(24, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(28, MOVE_ATTRACT), LEVEL_UP_MOVE(36, MOVE_SWEET_KISS), LEVEL_UP_MOVE(40, MOVE_FLAIL), LEVEL_UP_MOVE(48, MOVE_SAFEGUARD), LEVEL_UP_END }; static const u16 sCorphishLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(7, MOVE_HARDEN), LEVEL_UP_MOVE(10, MOVE_VICE_GRIP), LEVEL_UP_MOVE(13, MOVE_LEER), LEVEL_UP_MOVE(19, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(22, MOVE_PROTECT), LEVEL_UP_MOVE(25, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(31, MOVE_TAUNT), LEVEL_UP_MOVE(34, MOVE_CRABHAMMER), LEVEL_UP_MOVE(37, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE(43, MOVE_CRUNCH), LEVEL_UP_MOVE(46, MOVE_GUILLOTINE), LEVEL_UP_END }; static const u16 sCrawdauntLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BUBBLE), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(1, MOVE_VICE_GRIP), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(7, MOVE_HARDEN), LEVEL_UP_MOVE(10, MOVE_VICE_GRIP), LEVEL_UP_MOVE(13, MOVE_LEER), LEVEL_UP_MOVE(19, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE(22, MOVE_PROTECT), LEVEL_UP_MOVE(25, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(33, MOVE_TAUNT), LEVEL_UP_MOVE(38, MOVE_CRABHAMMER), LEVEL_UP_MOVE(43, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE(51, MOVE_CRUNCH), LEVEL_UP_MOVE(56, MOVE_GUILLOTINE), LEVEL_UP_END }; static const u16 sFeebasLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(15, MOVE_TACKLE), LEVEL_UP_MOVE(30, MOVE_FLAIL), LEVEL_UP_END }; static const u16 sMiloticLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(5, MOVE_WRAP), LEVEL_UP_MOVE(10, MOVE_WATER_SPORT), LEVEL_UP_MOVE(15, MOVE_REFRESH), LEVEL_UP_MOVE(20, MOVE_WATER_PULSE), LEVEL_UP_MOVE(25, MOVE_TWISTER), LEVEL_UP_MOVE(30, MOVE_RECOVER), LEVEL_UP_MOVE(35, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(45, MOVE_ATTRACT), LEVEL_UP_MOVE(50, MOVE_SAFEGUARD), LEVEL_UP_END }; static const u16 sCarvanhaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(7, MOVE_RAGE), LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(16, MOVE_SCARY_FACE), LEVEL_UP_MOVE(22, MOVE_CRUNCH), LEVEL_UP_MOVE(28, MOVE_SCREECH), LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(37, MOVE_SWAGGER), LEVEL_UP_MOVE(43, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sSharpedoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_RAGE), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(7, MOVE_RAGE), LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(16, MOVE_SCARY_FACE), LEVEL_UP_MOVE(22, MOVE_CRUNCH), LEVEL_UP_MOVE(28, MOVE_SCREECH), LEVEL_UP_MOVE(33, MOVE_SLASH), LEVEL_UP_MOVE(38, MOVE_TAUNT), LEVEL_UP_MOVE(43, MOVE_SWAGGER), LEVEL_UP_MOVE(48, MOVE_SKULL_BASH), LEVEL_UP_MOVE(53, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sTrapinchLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(25, MOVE_SAND_TOMB), LEVEL_UP_MOVE(33, MOVE_CRUNCH), LEVEL_UP_MOVE(41, MOVE_DIG), LEVEL_UP_MOVE(49, MOVE_SANDSTORM), LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sVibravaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(1, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(1, MOVE_SAND_TOMB), LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(25, MOVE_SAND_TOMB), LEVEL_UP_MOVE(33, MOVE_CRUNCH), LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(41, MOVE_SCREECH), LEVEL_UP_MOVE(49, MOVE_SANDSTORM), LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sFlygonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(1, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(1, MOVE_SAND_TOMB), LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(25, MOVE_SAND_TOMB), LEVEL_UP_MOVE(33, MOVE_CRUNCH), LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(41, MOVE_SCREECH), LEVEL_UP_MOVE(53, MOVE_SANDSTORM), LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sMakuhitaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(4, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(10, MOVE_ARM_THRUST), LEVEL_UP_MOVE(13, MOVE_VITAL_THROW), LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), LEVEL_UP_MOVE(22, MOVE_WHIRLWIND), LEVEL_UP_MOVE(28, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(31, MOVE_SMELLING_SALT), LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM), LEVEL_UP_MOVE(40, MOVE_ENDURE), LEVEL_UP_MOVE(46, MOVE_SEISMIC_TOSS), LEVEL_UP_MOVE(49, MOVE_REVERSAL), LEVEL_UP_END }; static const u16 sHariyamaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(1, MOVE_ARM_THRUST), LEVEL_UP_MOVE(4, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(10, MOVE_ARM_THRUST), LEVEL_UP_MOVE(13, MOVE_VITAL_THROW), LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), LEVEL_UP_MOVE(22, MOVE_WHIRLWIND), LEVEL_UP_MOVE(29, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(33, MOVE_SMELLING_SALT), LEVEL_UP_MOVE(40, MOVE_BELLY_DRUM), LEVEL_UP_MOVE(44, MOVE_ENDURE), LEVEL_UP_MOVE(51, MOVE_SEISMIC_TOSS), LEVEL_UP_MOVE(55, MOVE_REVERSAL), LEVEL_UP_END }; static const u16 sElectrikeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(9, MOVE_LEER), LEVEL_UP_MOVE(12, MOVE_HOWL), LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(20, MOVE_SPARK), LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(28, MOVE_ROAR), LEVEL_UP_MOVE(33, MOVE_BITE), LEVEL_UP_MOVE(36, MOVE_THUNDER), LEVEL_UP_MOVE(41, MOVE_CHARGE), LEVEL_UP_END }; static const u16 sManectricLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_HOWL), LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(9, MOVE_LEER), LEVEL_UP_MOVE(12, MOVE_HOWL), LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(20, MOVE_SPARK), LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(31, MOVE_ROAR), LEVEL_UP_MOVE(39, MOVE_BITE), LEVEL_UP_MOVE(45, MOVE_THUNDER), LEVEL_UP_MOVE(53, MOVE_CHARGE), LEVEL_UP_END }; static const u16 sNumelLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(11, MOVE_EMBER), LEVEL_UP_MOVE(19, MOVE_MAGNITUDE), LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(31, MOVE_AMNESIA), LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sCameruptLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_EMBER), LEVEL_UP_MOVE(1, MOVE_MAGNITUDE), LEVEL_UP_MOVE(11, MOVE_EMBER), LEVEL_UP_MOVE(19, MOVE_MAGNITUDE), LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(31, MOVE_AMNESIA), LEVEL_UP_MOVE(33, MOVE_ROCK_SLIDE), LEVEL_UP_MOVE(37, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(45, MOVE_ERUPTION), LEVEL_UP_MOVE(55, MOVE_FISSURE), LEVEL_UP_END }; static const u16 sSphealLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(7, MOVE_ENCORE), LEVEL_UP_MOVE(13, MOVE_ICE_BALL), LEVEL_UP_MOVE(19, MOVE_BODY_SLAM), LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(31, MOVE_HAIL), LEVEL_UP_MOVE(37, MOVE_REST), LEVEL_UP_MOVE(37, MOVE_SNORE), LEVEL_UP_MOVE(43, MOVE_BLIZZARD), LEVEL_UP_MOVE(49, MOVE_SHEER_COLD), LEVEL_UP_END }; static const u16 sSealeoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(7, MOVE_ENCORE), LEVEL_UP_MOVE(13, MOVE_ICE_BALL), LEVEL_UP_MOVE(19, MOVE_BODY_SLAM), LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(31, MOVE_HAIL), LEVEL_UP_MOVE(39, MOVE_REST), LEVEL_UP_MOVE(39, MOVE_SNORE), LEVEL_UP_MOVE(47, MOVE_BLIZZARD), LEVEL_UP_MOVE(55, MOVE_SHEER_COLD), LEVEL_UP_END }; static const u16 sWalreinLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(7, MOVE_ENCORE), LEVEL_UP_MOVE(13, MOVE_ICE_BALL), LEVEL_UP_MOVE(19, MOVE_BODY_SLAM), LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM), LEVEL_UP_MOVE(31, MOVE_HAIL), LEVEL_UP_MOVE(39, MOVE_REST), LEVEL_UP_MOVE(39, MOVE_SNORE), LEVEL_UP_MOVE(50, MOVE_BLIZZARD), LEVEL_UP_MOVE(61, MOVE_SHEER_COLD), LEVEL_UP_END }; static const u16 sCacneaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(5, MOVE_ABSORB), LEVEL_UP_MOVE(9, MOVE_GROWTH), LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE), LEVEL_UP_MOVE(25, MOVE_INGRAIN), LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(33, MOVE_SPIKES), LEVEL_UP_MOVE(37, MOVE_NEEDLE_ARM), LEVEL_UP_MOVE(41, MOVE_COTTON_SPORE), LEVEL_UP_MOVE(45, MOVE_SANDSTORM), LEVEL_UP_MOVE(49, MOVE_DESTINY_BOND), LEVEL_UP_END }; static const u16 sCacturneLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_REVENGE), LEVEL_UP_MOVE(1, MOVE_POISON_STING), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(1, MOVE_GROWTH), LEVEL_UP_MOVE(5, MOVE_ABSORB), LEVEL_UP_MOVE(9, MOVE_GROWTH), LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK), LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE), LEVEL_UP_MOVE(25, MOVE_INGRAIN), LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(35, MOVE_SPIKES), LEVEL_UP_MOVE(41, MOVE_NEEDLE_ARM), LEVEL_UP_MOVE(47, MOVE_COTTON_SPORE), LEVEL_UP_MOVE(53, MOVE_SANDSTORM), LEVEL_UP_MOVE(59, MOVE_DESTINY_BOND), LEVEL_UP_END }; static const u16 sSnoruntLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(7, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(10, MOVE_BITE), LEVEL_UP_MOVE(16, MOVE_ICY_WIND), LEVEL_UP_MOVE(19, MOVE_HEADBUTT), LEVEL_UP_MOVE(25, MOVE_PROTECT), LEVEL_UP_MOVE(28, MOVE_CRUNCH), LEVEL_UP_MOVE(34, MOVE_ICE_BEAM), LEVEL_UP_MOVE(37, MOVE_HAIL), LEVEL_UP_MOVE(43, MOVE_BLIZZARD), LEVEL_UP_END }; static const u16 sGlalieLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(7, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(10, MOVE_BITE), LEVEL_UP_MOVE(16, MOVE_ICY_WIND), LEVEL_UP_MOVE(19, MOVE_HEADBUTT), LEVEL_UP_MOVE(25, MOVE_PROTECT), LEVEL_UP_MOVE(28, MOVE_CRUNCH), LEVEL_UP_MOVE(34, MOVE_ICE_BEAM), LEVEL_UP_MOVE(42, MOVE_HAIL), LEVEL_UP_MOVE(53, MOVE_BLIZZARD), LEVEL_UP_MOVE(61, MOVE_SHEER_COLD), LEVEL_UP_END }; static const u16 sLunatoneLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_CONFUSION), LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), LEVEL_UP_MOVE(19, MOVE_HYPNOSIS), LEVEL_UP_MOVE(25, MOVE_PSYWAVE), LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(37, MOVE_PSYCHIC), LEVEL_UP_MOVE(43, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(49, MOVE_EXPLOSION), LEVEL_UP_END }; static const u16 sSolrockLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_CONFUSION), LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), LEVEL_UP_MOVE(19, MOVE_FIRE_SPIN), LEVEL_UP_MOVE(25, MOVE_PSYWAVE), LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(37, MOVE_ROCK_SLIDE), LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM), LEVEL_UP_MOVE(49, MOVE_EXPLOSION), LEVEL_UP_END }; static const u16 sAzurillLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(3, MOVE_CHARM), LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP), LEVEL_UP_MOVE(10, MOVE_BUBBLE), LEVEL_UP_MOVE(15, MOVE_SLAM), LEVEL_UP_MOVE(21, MOVE_WATER_GUN), LEVEL_UP_END }; static const u16 sSpoinkLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(7, MOVE_PSYWAVE), LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(16, MOVE_PSYBEAM), LEVEL_UP_MOVE(19, MOVE_PSYCH_UP), LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT), LEVEL_UP_MOVE(34, MOVE_PSYCHIC), LEVEL_UP_MOVE(37, MOVE_REST), LEVEL_UP_MOVE(37, MOVE_SNORE), LEVEL_UP_MOVE(43, MOVE_BOUNCE), LEVEL_UP_END }; static const u16 sGrumpigLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(1, MOVE_PSYWAVE), LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(1, MOVE_PSYBEAM), LEVEL_UP_MOVE(7, MOVE_PSYWAVE), LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE(16, MOVE_PSYBEAM), LEVEL_UP_MOVE(19, MOVE_PSYCH_UP), LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT), LEVEL_UP_MOVE(37, MOVE_PSYCHIC), LEVEL_UP_MOVE(43, MOVE_REST), LEVEL_UP_MOVE(43, MOVE_SNORE), LEVEL_UP_MOVE(55, MOVE_BOUNCE), LEVEL_UP_END }; static const u16 sPlusleLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_HELPING_HAND), LEVEL_UP_MOVE(19, MOVE_SPARK), LEVEL_UP_MOVE(22, MOVE_ENCORE), LEVEL_UP_MOVE(28, MOVE_FAKE_TEARS), LEVEL_UP_MOVE(31, MOVE_CHARGE), LEVEL_UP_MOVE(37, MOVE_THUNDER), LEVEL_UP_MOVE(40, MOVE_BATON_PASS), LEVEL_UP_MOVE(47, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sMinunLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_HELPING_HAND), LEVEL_UP_MOVE(19, MOVE_SPARK), LEVEL_UP_MOVE(22, MOVE_ENCORE), LEVEL_UP_MOVE(28, MOVE_CHARM), LEVEL_UP_MOVE(31, MOVE_CHARGE), LEVEL_UP_MOVE(37, MOVE_THUNDER), LEVEL_UP_MOVE(40, MOVE_BATON_PASS), LEVEL_UP_MOVE(47, MOVE_AGILITY), LEVEL_UP_END }; static const u16 sMawileLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(6, MOVE_FAKE_TEARS), LEVEL_UP_MOVE(11, MOVE_BITE), LEVEL_UP_MOVE(16, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(21, MOVE_VICE_GRIP), LEVEL_UP_MOVE(26, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(31, MOVE_BATON_PASS), LEVEL_UP_MOVE(36, MOVE_CRUNCH), LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(46, MOVE_STOCKPILE), LEVEL_UP_MOVE(46, MOVE_SWALLOW), LEVEL_UP_MOVE(46, MOVE_SPIT_UP), LEVEL_UP_END }; static const u16 sMedititeLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BIDE), LEVEL_UP_MOVE(4, MOVE_MEDITATE), LEVEL_UP_MOVE(9, MOVE_CONFUSION), LEVEL_UP_MOVE(12, MOVE_DETECT), LEVEL_UP_MOVE(17, MOVE_HIDDEN_POWER), LEVEL_UP_MOVE(20, MOVE_SWAGGER), LEVEL_UP_MOVE(25, MOVE_MIND_READER), LEVEL_UP_MOVE(28, MOVE_CALM_MIND), LEVEL_UP_MOVE(33, MOVE_HI_JUMP_KICK), LEVEL_UP_MOVE(36, MOVE_PSYCH_UP), LEVEL_UP_MOVE(41, MOVE_REVERSAL), LEVEL_UP_MOVE(44, MOVE_RECOVER), LEVEL_UP_END }; static const u16 sMedichamLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_FIRE_PUNCH), LEVEL_UP_MOVE(1, MOVE_THUNDER_PUNCH), LEVEL_UP_MOVE(1, MOVE_ICE_PUNCH), LEVEL_UP_MOVE(1, MOVE_BIDE), LEVEL_UP_MOVE(1, MOVE_MEDITATE), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(1, MOVE_DETECT), LEVEL_UP_MOVE(4, MOVE_MEDITATE), LEVEL_UP_MOVE(9, MOVE_CONFUSION), LEVEL_UP_MOVE(12, MOVE_DETECT), LEVEL_UP_MOVE(17, MOVE_HIDDEN_POWER), LEVEL_UP_MOVE(20, MOVE_SWAGGER), LEVEL_UP_MOVE(25, MOVE_MIND_READER), LEVEL_UP_MOVE(28, MOVE_CALM_MIND), LEVEL_UP_MOVE(33, MOVE_HI_JUMP_KICK), LEVEL_UP_MOVE(36, MOVE_PSYCH_UP), LEVEL_UP_MOVE(47, MOVE_REVERSAL), LEVEL_UP_MOVE(56, MOVE_RECOVER), LEVEL_UP_END }; static const u16 sSwabluLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(8, MOVE_ASTONISH), LEVEL_UP_MOVE(11, MOVE_SING), LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(21, MOVE_SAFEGUARD), LEVEL_UP_MOVE(28, MOVE_MIST), LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(38, MOVE_MIRROR_MOVE), LEVEL_UP_MOVE(41, MOVE_REFRESH), LEVEL_UP_MOVE(48, MOVE_PERISH_SONG), LEVEL_UP_END }; static const u16 sAltariaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PECK), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(1, MOVE_SING), LEVEL_UP_MOVE(8, MOVE_ASTONISH), LEVEL_UP_MOVE(11, MOVE_SING), LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK), LEVEL_UP_MOVE(21, MOVE_SAFEGUARD), LEVEL_UP_MOVE(28, MOVE_MIST), LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(40, MOVE_DRAGON_DANCE), LEVEL_UP_MOVE(45, MOVE_REFRESH), LEVEL_UP_MOVE(54, MOVE_PERISH_SONG), LEVEL_UP_MOVE(59, MOVE_SKY_ATTACK), LEVEL_UP_END }; static const u16 sWynautLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SPLASH), LEVEL_UP_MOVE(1, MOVE_CHARM), LEVEL_UP_MOVE(1, MOVE_ENCORE), LEVEL_UP_MOVE(15, MOVE_COUNTER), LEVEL_UP_MOVE(15, MOVE_MIRROR_COAT), LEVEL_UP_MOVE(15, MOVE_SAFEGUARD), LEVEL_UP_MOVE(15, MOVE_DESTINY_BOND), LEVEL_UP_END }; static const u16 sDuskullLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(5, MOVE_DISABLE), LEVEL_UP_MOVE(12, MOVE_FORESIGHT), LEVEL_UP_MOVE(16, MOVE_ASTONISH), LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(27, MOVE_PURSUIT), LEVEL_UP_MOVE(34, MOVE_CURSE), LEVEL_UP_MOVE(38, MOVE_WILL_O_WISP), LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK), LEVEL_UP_MOVE(49, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; static const u16 sDusclopsLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_BIND), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(1, MOVE_DISABLE), LEVEL_UP_MOVE(5, MOVE_DISABLE), LEVEL_UP_MOVE(12, MOVE_FORESIGHT), LEVEL_UP_MOVE(16, MOVE_ASTONISH), LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(27, MOVE_PURSUIT), LEVEL_UP_MOVE(34, MOVE_CURSE), LEVEL_UP_MOVE(37, MOVE_SHADOW_PUNCH), LEVEL_UP_MOVE(41, MOVE_WILL_O_WISP), LEVEL_UP_MOVE(51, MOVE_MEAN_LOOK), LEVEL_UP_MOVE(58, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; static const u16 sRoseliaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ABSORB), LEVEL_UP_MOVE(5, MOVE_GROWTH), LEVEL_UP_MOVE(9, MOVE_POISON_STING), LEVEL_UP_MOVE(13, MOVE_STUN_SPORE), LEVEL_UP_MOVE(17, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE(21, MOVE_LEECH_SEED), LEVEL_UP_MOVE(25, MOVE_MAGICAL_LEAF), LEVEL_UP_MOVE(29, MOVE_GRASS_WHISTLE), LEVEL_UP_MOVE(33, MOVE_GIGA_DRAIN), LEVEL_UP_MOVE(37, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(41, MOVE_INGRAIN), LEVEL_UP_MOVE(45, MOVE_TOXIC), LEVEL_UP_MOVE(49, MOVE_PETAL_DANCE), LEVEL_UP_MOVE(53, MOVE_AROMATHERAPY), LEVEL_UP_MOVE(57, MOVE_SYNTHESIS), LEVEL_UP_END }; static const u16 sSlakothLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_YAWN), LEVEL_UP_MOVE(7, MOVE_ENCORE), LEVEL_UP_MOVE(13, MOVE_SLACK_OFF), LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(25, MOVE_AMNESIA), LEVEL_UP_MOVE(31, MOVE_COVET), LEVEL_UP_MOVE(37, MOVE_COUNTER), LEVEL_UP_MOVE(43, MOVE_FLAIL), LEVEL_UP_END }; static const u16 sVigorothLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(1, MOVE_ENCORE), LEVEL_UP_MOVE(1, MOVE_UPROAR), LEVEL_UP_MOVE(7, MOVE_ENCORE), LEVEL_UP_MOVE(13, MOVE_UPROAR), LEVEL_UP_MOVE(19, MOVE_FURY_SWIPES), LEVEL_UP_MOVE(25, MOVE_ENDURE), LEVEL_UP_MOVE(31, MOVE_SLASH), LEVEL_UP_MOVE(37, MOVE_COUNTER), LEVEL_UP_MOVE(43, MOVE_FOCUS_PUNCH), LEVEL_UP_MOVE(49, MOVE_REVERSAL), LEVEL_UP_END }; static const u16 sSlakingLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_YAWN), LEVEL_UP_MOVE(1, MOVE_ENCORE), LEVEL_UP_MOVE(1, MOVE_SLACK_OFF), LEVEL_UP_MOVE(7, MOVE_ENCORE), LEVEL_UP_MOVE(13, MOVE_SLACK_OFF), LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(25, MOVE_AMNESIA), LEVEL_UP_MOVE(31, MOVE_COVET), LEVEL_UP_MOVE(36, MOVE_SWAGGER), LEVEL_UP_MOVE(37, MOVE_COUNTER), LEVEL_UP_MOVE(43, MOVE_FLAIL), LEVEL_UP_END }; static const u16 sGulpinLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(6, MOVE_YAWN), LEVEL_UP_MOVE(9, MOVE_POISON_GAS), LEVEL_UP_MOVE(14, MOVE_SLUDGE), LEVEL_UP_MOVE(17, MOVE_AMNESIA), LEVEL_UP_MOVE(23, MOVE_ENCORE), LEVEL_UP_MOVE(28, MOVE_TOXIC), LEVEL_UP_MOVE(34, MOVE_STOCKPILE), LEVEL_UP_MOVE(34, MOVE_SPIT_UP), LEVEL_UP_MOVE(34, MOVE_SWALLOW), LEVEL_UP_MOVE(39, MOVE_SLUDGE_BOMB), LEVEL_UP_END }; static const u16 sSwalotLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_YAWN), LEVEL_UP_MOVE(1, MOVE_POISON_GAS), LEVEL_UP_MOVE(1, MOVE_SLUDGE), LEVEL_UP_MOVE(6, MOVE_YAWN), LEVEL_UP_MOVE(9, MOVE_POISON_GAS), LEVEL_UP_MOVE(14, MOVE_SLUDGE), LEVEL_UP_MOVE(17, MOVE_AMNESIA), LEVEL_UP_MOVE(23, MOVE_ENCORE), LEVEL_UP_MOVE(26, MOVE_BODY_SLAM), LEVEL_UP_MOVE(31, MOVE_TOXIC), LEVEL_UP_MOVE(40, MOVE_STOCKPILE), LEVEL_UP_MOVE(40, MOVE_SPIT_UP), LEVEL_UP_MOVE(40, MOVE_SWALLOW), LEVEL_UP_MOVE(48, MOVE_SLUDGE_BOMB), LEVEL_UP_END }; static const u16 sTropiusLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_GUST), LEVEL_UP_MOVE(7, MOVE_GROWTH), LEVEL_UP_MOVE(11, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE(17, MOVE_STOMP), LEVEL_UP_MOVE(21, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(27, MOVE_WHIRLWIND), LEVEL_UP_MOVE(31, MOVE_MAGICAL_LEAF), LEVEL_UP_MOVE(37, MOVE_BODY_SLAM), LEVEL_UP_MOVE(41, MOVE_SOLAR_BEAM), LEVEL_UP_MOVE(47, MOVE_SYNTHESIS), LEVEL_UP_END }; static const u16 sWhismurLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(5, MOVE_UPROAR), LEVEL_UP_MOVE(11, MOVE_ASTONISH), LEVEL_UP_MOVE(15, MOVE_HOWL), LEVEL_UP_MOVE(21, MOVE_SUPERSONIC), LEVEL_UP_MOVE(25, MOVE_STOMP), LEVEL_UP_MOVE(31, MOVE_SCREECH), LEVEL_UP_MOVE(35, MOVE_ROAR), LEVEL_UP_MOVE(41, MOVE_REST), LEVEL_UP_MOVE(41, MOVE_SLEEP_TALK), LEVEL_UP_MOVE(45, MOVE_HYPER_VOICE), LEVEL_UP_END }; static const u16 sLoudredLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_UPROAR), LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(1, MOVE_HOWL), LEVEL_UP_MOVE(5, MOVE_UPROAR), LEVEL_UP_MOVE(11, MOVE_ASTONISH), LEVEL_UP_MOVE(15, MOVE_HOWL), LEVEL_UP_MOVE(23, MOVE_SUPERSONIC), LEVEL_UP_MOVE(29, MOVE_STOMP), LEVEL_UP_MOVE(37, MOVE_SCREECH), LEVEL_UP_MOVE(43, MOVE_ROAR), LEVEL_UP_MOVE(51, MOVE_REST), LEVEL_UP_MOVE(51, MOVE_SLEEP_TALK), LEVEL_UP_MOVE(57, MOVE_HYPER_VOICE), LEVEL_UP_END }; static const u16 sExploudLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_POUND), LEVEL_UP_MOVE(1, MOVE_UPROAR), LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(1, MOVE_HOWL), LEVEL_UP_MOVE(5, MOVE_UPROAR), LEVEL_UP_MOVE(11, MOVE_ASTONISH), LEVEL_UP_MOVE(15, MOVE_HOWL), LEVEL_UP_MOVE(23, MOVE_SUPERSONIC), LEVEL_UP_MOVE(29, MOVE_STOMP), LEVEL_UP_MOVE(37, MOVE_SCREECH), LEVEL_UP_MOVE(40, MOVE_HYPER_BEAM), LEVEL_UP_MOVE(45, MOVE_ROAR), LEVEL_UP_MOVE(55, MOVE_REST), LEVEL_UP_MOVE(55, MOVE_SLEEP_TALK), LEVEL_UP_MOVE(63, MOVE_HYPER_VOICE), LEVEL_UP_END }; static const u16 sClamperlLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_CLAMP), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(1, MOVE_WHIRLPOOL), LEVEL_UP_MOVE(1, MOVE_IRON_DEFENSE), LEVEL_UP_END }; static const u16 sHuntailLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WHIRLPOOL), LEVEL_UP_MOVE(8, MOVE_BITE), LEVEL_UP_MOVE(15, MOVE_SCREECH), LEVEL_UP_MOVE(22, MOVE_WATER_PULSE), LEVEL_UP_MOVE(29, MOVE_SCARY_FACE), LEVEL_UP_MOVE(36, MOVE_CRUNCH), LEVEL_UP_MOVE(43, MOVE_BATON_PASS), LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sGorebyssLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WHIRLPOOL), LEVEL_UP_MOVE(8, MOVE_CONFUSION), LEVEL_UP_MOVE(15, MOVE_AGILITY), LEVEL_UP_MOVE(22, MOVE_WATER_PULSE), LEVEL_UP_MOVE(29, MOVE_AMNESIA), LEVEL_UP_MOVE(36, MOVE_PSYCHIC), LEVEL_UP_MOVE(43, MOVE_BATON_PASS), LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sAbsolLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(5, MOVE_LEER), LEVEL_UP_MOVE(9, MOVE_TAUNT), LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(17, MOVE_RAZOR_WIND), LEVEL_UP_MOVE(21, MOVE_BITE), LEVEL_UP_MOVE(26, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE(31, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(36, MOVE_SLASH), LEVEL_UP_MOVE(41, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(46, MOVE_PERISH_SONG), LEVEL_UP_END }; static const u16 sShuppetLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(8, MOVE_SCREECH), LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(20, MOVE_CURSE), LEVEL_UP_MOVE(25, MOVE_SPITE), LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP), LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(44, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(49, MOVE_SNATCH), LEVEL_UP_MOVE(56, MOVE_GRUDGE), LEVEL_UP_END }; static const u16 sBanetteLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(1, MOVE_SCREECH), LEVEL_UP_MOVE(1, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(1, MOVE_CURSE), LEVEL_UP_MOVE(8, MOVE_SCREECH), LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(20, MOVE_CURSE), LEVEL_UP_MOVE(25, MOVE_SPITE), LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP), LEVEL_UP_MOVE(39, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(48, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(55, MOVE_SNATCH), LEVEL_UP_MOVE(64, MOVE_GRUDGE), LEVEL_UP_END }; static const u16 sSeviperLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WRAP), LEVEL_UP_MOVE(7, MOVE_LICK), LEVEL_UP_MOVE(10, MOVE_BITE), LEVEL_UP_MOVE(16, MOVE_POISON_TAIL), LEVEL_UP_MOVE(19, MOVE_SCREECH), LEVEL_UP_MOVE(25, MOVE_GLARE), LEVEL_UP_MOVE(28, MOVE_CRUNCH), LEVEL_UP_MOVE(34, MOVE_POISON_FANG), LEVEL_UP_MOVE(37, MOVE_SWAGGER), LEVEL_UP_MOVE(43, MOVE_HAZE), LEVEL_UP_END }; static const u16 sZangooseLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(4, MOVE_LEER), LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(10, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE(13, MOVE_FURY_CUTTER), LEVEL_UP_MOVE(19, MOVE_SLASH), LEVEL_UP_MOVE(25, MOVE_PURSUIT), LEVEL_UP_MOVE(31, MOVE_CRUSH_CLAW), LEVEL_UP_MOVE(37, MOVE_TAUNT), LEVEL_UP_MOVE(46, MOVE_DETECT), LEVEL_UP_MOVE(55, MOVE_FALSE_SWIPE), LEVEL_UP_END }; static const u16 sRelicanthLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(8, MOVE_WATER_GUN), LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB), LEVEL_UP_MOVE(22, MOVE_YAWN), LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(36, MOVE_MUD_SPORT), LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(50, MOVE_REST), LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(64, MOVE_HYDRO_PUMP), LEVEL_UP_END }; static const u16 sAronLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(4, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_MUD_SLAP), LEVEL_UP_MOVE(10, MOVE_HEADBUTT), LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(21, MOVE_ROAR), LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(29, MOVE_IRON_TAIL), LEVEL_UP_MOVE(34, MOVE_PROTECT), LEVEL_UP_MOVE(39, MOVE_METAL_SOUND), LEVEL_UP_MOVE(44, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sLaironLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(1, MOVE_MUD_SLAP), LEVEL_UP_MOVE(1, MOVE_HEADBUTT), LEVEL_UP_MOVE(4, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_MUD_SLAP), LEVEL_UP_MOVE(10, MOVE_HEADBUTT), LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(21, MOVE_ROAR), LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(29, MOVE_IRON_TAIL), LEVEL_UP_MOVE(37, MOVE_PROTECT), LEVEL_UP_MOVE(45, MOVE_METAL_SOUND), LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sAggronLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(1, MOVE_MUD_SLAP), LEVEL_UP_MOVE(1, MOVE_HEADBUTT), LEVEL_UP_MOVE(4, MOVE_HARDEN), LEVEL_UP_MOVE(7, MOVE_MUD_SLAP), LEVEL_UP_MOVE(10, MOVE_HEADBUTT), LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(21, MOVE_ROAR), LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(29, MOVE_IRON_TAIL), LEVEL_UP_MOVE(37, MOVE_PROTECT), LEVEL_UP_MOVE(50, MOVE_METAL_SOUND), LEVEL_UP_MOVE(63, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sCastformLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(10, MOVE_EMBER), LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW), LEVEL_UP_MOVE(20, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(20, MOVE_SUNNY_DAY), LEVEL_UP_MOVE(20, MOVE_HAIL), LEVEL_UP_MOVE(30, MOVE_WEATHER_BALL), LEVEL_UP_END }; static const u16 sVolbeatLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(5, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(9, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(13, MOVE_MOONLIGHT), LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(21, MOVE_TAIL_GLOW), LEVEL_UP_MOVE(25, MOVE_SIGNAL_BEAM), LEVEL_UP_MOVE(29, MOVE_PROTECT), LEVEL_UP_MOVE(33, MOVE_HELPING_HAND), LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sIllumiseLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TACKLE), LEVEL_UP_MOVE(5, MOVE_SWEET_SCENT), LEVEL_UP_MOVE(9, MOVE_CHARM), LEVEL_UP_MOVE(13, MOVE_MOONLIGHT), LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(21, MOVE_WISH), LEVEL_UP_MOVE(25, MOVE_ENCORE), LEVEL_UP_MOVE(29, MOVE_FLATTER), LEVEL_UP_MOVE(33, MOVE_HELPING_HAND), LEVEL_UP_MOVE(37, MOVE_COVET), LEVEL_UP_END }; static const u16 sLileepLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(8, MOVE_CONSTRICT), LEVEL_UP_MOVE(15, MOVE_ACID), LEVEL_UP_MOVE(22, MOVE_INGRAIN), LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(36, MOVE_AMNESIA), LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(50, MOVE_STOCKPILE), LEVEL_UP_MOVE(50, MOVE_SPIT_UP), LEVEL_UP_MOVE(50, MOVE_SWALLOW), LEVEL_UP_END }; static const u16 sCradilyLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_ASTONISH), LEVEL_UP_MOVE(1, MOVE_CONSTRICT), LEVEL_UP_MOVE(1, MOVE_ACID), LEVEL_UP_MOVE(1, MOVE_INGRAIN), LEVEL_UP_MOVE(8, MOVE_CONSTRICT), LEVEL_UP_MOVE(15, MOVE_ACID), LEVEL_UP_MOVE(22, MOVE_INGRAIN), LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE(36, MOVE_AMNESIA), LEVEL_UP_MOVE(48, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(60, MOVE_STOCKPILE), LEVEL_UP_MOVE(60, MOVE_SPIT_UP), LEVEL_UP_MOVE(60, MOVE_SWALLOW), LEVEL_UP_END }; static const u16 sAnorithLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(7, MOVE_HARDEN), LEVEL_UP_MOVE(13, MOVE_MUD_SPORT), LEVEL_UP_MOVE(19, MOVE_WATER_GUN), LEVEL_UP_MOVE(25, MOVE_METAL_CLAW), LEVEL_UP_MOVE(31, MOVE_PROTECT), LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(43, MOVE_FURY_CUTTER), LEVEL_UP_MOVE(49, MOVE_SLASH), LEVEL_UP_MOVE(55, MOVE_ROCK_BLAST), LEVEL_UP_END }; static const u16 sArmaldoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_SCRATCH), LEVEL_UP_MOVE(1, MOVE_HARDEN), LEVEL_UP_MOVE(1, MOVE_MUD_SPORT), LEVEL_UP_MOVE(1, MOVE_WATER_GUN), LEVEL_UP_MOVE(7, MOVE_HARDEN), LEVEL_UP_MOVE(13, MOVE_MUD_SPORT), LEVEL_UP_MOVE(19, MOVE_WATER_GUN), LEVEL_UP_MOVE(25, MOVE_METAL_CLAW), LEVEL_UP_MOVE(31, MOVE_PROTECT), LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER), LEVEL_UP_MOVE(55, MOVE_SLASH), LEVEL_UP_MOVE(64, MOVE_ROCK_BLAST), LEVEL_UP_END }; static const u16 sRaltsLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(6, MOVE_CONFUSION), LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(16, MOVE_TELEPORT), LEVEL_UP_MOVE(21, MOVE_CALM_MIND), LEVEL_UP_MOVE(26, MOVE_PSYCHIC), LEVEL_UP_MOVE(31, MOVE_IMPRISON), LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(41, MOVE_HYPNOSIS), LEVEL_UP_MOVE(46, MOVE_DREAM_EATER), LEVEL_UP_END }; static const u16 sKirliaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_MAGICAL_LEAF), LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(1, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(1, MOVE_TELEPORT), LEVEL_UP_MOVE(6, MOVE_CONFUSION), LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(16, MOVE_TELEPORT), LEVEL_UP_MOVE(21, MOVE_CALM_MIND), LEVEL_UP_MOVE(26, MOVE_PSYCHIC), LEVEL_UP_MOVE(33, MOVE_IMPRISON), LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(47, MOVE_HYPNOSIS), LEVEL_UP_MOVE(54, MOVE_DREAM_EATER), LEVEL_UP_END }; static const u16 sGardevoirLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_GROWL), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(1, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(1, MOVE_TELEPORT), LEVEL_UP_MOVE(6, MOVE_CONFUSION), LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(16, MOVE_TELEPORT), LEVEL_UP_MOVE(21, MOVE_CALM_MIND), LEVEL_UP_MOVE(26, MOVE_PSYCHIC), LEVEL_UP_MOVE(33, MOVE_IMPRISON), LEVEL_UP_MOVE(42, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(51, MOVE_HYPNOSIS), LEVEL_UP_MOVE(60, MOVE_DREAM_EATER), LEVEL_UP_END }; static const u16 sBagonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_RAGE), LEVEL_UP_MOVE(5, MOVE_BITE), LEVEL_UP_MOVE(9, MOVE_LEER), LEVEL_UP_MOVE(17, MOVE_HEADBUTT), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(25, MOVE_EMBER), LEVEL_UP_MOVE(33, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(37, MOVE_SCARY_FACE), LEVEL_UP_MOVE(41, MOVE_CRUNCH), LEVEL_UP_MOVE(49, MOVE_DRAGON_CLAW), LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sShelgonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_RAGE), LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_HEADBUTT), LEVEL_UP_MOVE(5, MOVE_BITE), LEVEL_UP_MOVE(9, MOVE_LEER), LEVEL_UP_MOVE(17, MOVE_HEADBUTT), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(25, MOVE_EMBER), LEVEL_UP_MOVE(30, MOVE_PROTECT), LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(47, MOVE_SCARY_FACE), LEVEL_UP_MOVE(56, MOVE_CRUNCH), LEVEL_UP_MOVE(69, MOVE_DRAGON_CLAW), LEVEL_UP_MOVE(78, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sSalamenceLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_RAGE), LEVEL_UP_MOVE(1, MOVE_BITE), LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_HEADBUTT), LEVEL_UP_MOVE(5, MOVE_BITE), LEVEL_UP_MOVE(9, MOVE_LEER), LEVEL_UP_MOVE(17, MOVE_HEADBUTT), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(25, MOVE_EMBER), LEVEL_UP_MOVE(30, MOVE_PROTECT), LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(47, MOVE_SCARY_FACE), LEVEL_UP_MOVE(50, MOVE_FLY), LEVEL_UP_MOVE(61, MOVE_CRUNCH), LEVEL_UP_MOVE(79, MOVE_DRAGON_CLAW), LEVEL_UP_MOVE(93, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; static const u16 sBeldumLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TAKE_DOWN), LEVEL_UP_END }; static const u16 sMetangLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(20, MOVE_CONFUSION), LEVEL_UP_MOVE(20, MOVE_METAL_CLAW), LEVEL_UP_MOVE(26, MOVE_SCARY_FACE), LEVEL_UP_MOVE(32, MOVE_PURSUIT), LEVEL_UP_MOVE(38, MOVE_PSYCHIC), LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(50, MOVE_METEOR_MASH), LEVEL_UP_MOVE(56, MOVE_AGILITY), LEVEL_UP_MOVE(62, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sMetagrossLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(1, MOVE_METAL_CLAW), LEVEL_UP_MOVE(1, MOVE_SCARY_FACE), LEVEL_UP_MOVE(20, MOVE_CONFUSION), LEVEL_UP_MOVE(20, MOVE_METAL_CLAW), LEVEL_UP_MOVE(26, MOVE_SCARY_FACE), LEVEL_UP_MOVE(32, MOVE_PURSUIT), LEVEL_UP_MOVE(38, MOVE_PSYCHIC), LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(55, MOVE_METEOR_MASH), LEVEL_UP_MOVE(66, MOVE_AGILITY), LEVEL_UP_MOVE(77, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sRegirockLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_EXPLOSION), LEVEL_UP_MOVE(9, MOVE_ROCK_THROW), LEVEL_UP_MOVE(17, MOVE_CURSE), LEVEL_UP_MOVE(25, MOVE_SUPERPOWER), LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), LEVEL_UP_MOVE(57, MOVE_LOCK_ON), LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sRegiceLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_EXPLOSION), LEVEL_UP_MOVE(9, MOVE_ICY_WIND), LEVEL_UP_MOVE(17, MOVE_CURSE), LEVEL_UP_MOVE(25, MOVE_SUPERPOWER), LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(41, MOVE_AMNESIA), LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), LEVEL_UP_MOVE(57, MOVE_LOCK_ON), LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sRegisteelLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_EXPLOSION), LEVEL_UP_MOVE(9, MOVE_METAL_CLAW), LEVEL_UP_MOVE(17, MOVE_CURSE), LEVEL_UP_MOVE(25, MOVE_SUPERPOWER), LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(41, MOVE_AMNESIA), LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), LEVEL_UP_MOVE(57, MOVE_LOCK_ON), LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sKyogreLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WATER_PULSE), LEVEL_UP_MOVE(5, MOVE_SCARY_FACE), LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(20, MOVE_BODY_SLAM), LEVEL_UP_MOVE(30, MOVE_CALM_MIND), LEVEL_UP_MOVE(35, MOVE_ICE_BEAM), LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE(50, MOVE_REST), LEVEL_UP_MOVE(60, MOVE_SHEER_COLD), LEVEL_UP_MOVE(65, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(75, MOVE_WATER_SPOUT), LEVEL_UP_END }; static const u16 sGroudonLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_MUD_SHOT), LEVEL_UP_MOVE(5, MOVE_SCARY_FACE), LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(20, MOVE_SLASH), LEVEL_UP_MOVE(30, MOVE_BULK_UP), LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(45, MOVE_FIRE_BLAST), LEVEL_UP_MOVE(50, MOVE_REST), LEVEL_UP_MOVE(60, MOVE_FISSURE), LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM), LEVEL_UP_MOVE(75, MOVE_ERUPTION), LEVEL_UP_END }; static const u16 sRayquazaLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_TWISTER), LEVEL_UP_MOVE(5, MOVE_SCARY_FACE), LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE(20, MOVE_DRAGON_CLAW), LEVEL_UP_MOVE(30, MOVE_DRAGON_DANCE), LEVEL_UP_MOVE(35, MOVE_CRUNCH), LEVEL_UP_MOVE(45, MOVE_FLY), LEVEL_UP_MOVE(50, MOVE_REST), LEVEL_UP_MOVE(60, MOVE_EXTREME_SPEED), LEVEL_UP_MOVE(65, MOVE_OUTRAGE), LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sLatiasLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PSYWAVE), LEVEL_UP_MOVE(5, MOVE_WISH), LEVEL_UP_MOVE(10, MOVE_HELPING_HAND), LEVEL_UP_MOVE(15, MOVE_SAFEGUARD), LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(25, MOVE_WATER_SPORT), LEVEL_UP_MOVE(30, MOVE_REFRESH), LEVEL_UP_MOVE(35, MOVE_MIST_BALL), LEVEL_UP_MOVE(40, MOVE_PSYCHIC), LEVEL_UP_MOVE(45, MOVE_RECOVER), LEVEL_UP_MOVE(50, MOVE_CHARM), LEVEL_UP_END }; static const u16 sLatiosLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_PSYWAVE), LEVEL_UP_MOVE(5, MOVE_MEMENTO), LEVEL_UP_MOVE(10, MOVE_HELPING_HAND), LEVEL_UP_MOVE(15, MOVE_SAFEGUARD), LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(25, MOVE_PROTECT), LEVEL_UP_MOVE(30, MOVE_REFRESH), LEVEL_UP_MOVE(35, MOVE_LUSTER_PURGE), LEVEL_UP_MOVE(40, MOVE_PSYCHIC), LEVEL_UP_MOVE(45, MOVE_RECOVER), LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE), LEVEL_UP_END }; static const u16 sJirachiLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WISH), LEVEL_UP_MOVE(1, MOVE_CONFUSION), LEVEL_UP_MOVE(5, MOVE_REST), LEVEL_UP_MOVE(10, MOVE_SWIFT), LEVEL_UP_MOVE(15, MOVE_HELPING_HAND), LEVEL_UP_MOVE(20, MOVE_PSYCHIC), LEVEL_UP_MOVE(25, MOVE_REFRESH), LEVEL_UP_MOVE(30, MOVE_REST), LEVEL_UP_MOVE(35, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE(45, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(50, MOVE_DOOM_DESIRE), LEVEL_UP_END }; // overwritten in pokemon.c where formes are handled. static const u16 sDeoxysLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_LEER), LEVEL_UP_MOVE(1, MOVE_WRAP), LEVEL_UP_MOVE(5, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(10, MOVE_TELEPORT), LEVEL_UP_MOVE(15, MOVE_TAUNT), LEVEL_UP_MOVE(20, MOVE_PURSUIT), LEVEL_UP_MOVE(25, MOVE_PSYCHIC), LEVEL_UP_MOVE(30, MOVE_SUPERPOWER), LEVEL_UP_MOVE(35, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(40, MOVE_ZAP_CANNON), LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST), LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM), LEVEL_UP_END }; static const u16 sChimechoLevelUpLearnset[] = { LEVEL_UP_MOVE(1, MOVE_WRAP), LEVEL_UP_MOVE(6, MOVE_GROWL), LEVEL_UP_MOVE(9, MOVE_ASTONISH), LEVEL_UP_MOVE(14, MOVE_CONFUSION), LEVEL_UP_MOVE(17, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(22, MOVE_UPROAR), LEVEL_UP_MOVE(25, MOVE_YAWN), LEVEL_UP_MOVE(30, MOVE_PSYWAVE), LEVEL_UP_MOVE(33, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(38, MOVE_HEAL_BELL), LEVEL_UP_MOVE(41, MOVE_SAFEGUARD), LEVEL_UP_MOVE(46, MOVE_PSYCHIC), LEVEL_UP_END }; ================================================ FILE: src/data/pokemon/pokedex_categories.h ================================================ static const u16 sDexCategory_GrasslandPkmn_Page1[] = { SPECIES_RATTATA, SPECIES_RATICATE, SPECIES_SENTRET, SPECIES_FURRET, }; static const u16 sDexCategory_GrasslandPkmn_Page2[] = { SPECIES_ZIGZAGOON, SPECIES_LINOONE, SPECIES_POOCHYENA, SPECIES_MIGHTYENA, }; static const u16 sDexCategory_GrasslandPkmn_Page3[] = { SPECIES_NIDORAN_F, SPECIES_NIDORINA, SPECIES_NIDOQUEEN, }; static const u16 sDexCategory_GrasslandPkmn_Page4[] = { SPECIES_NIDORAN_M, SPECIES_NIDORINO, SPECIES_NIDOKING, }; static const u16 sDexCategory_GrasslandPkmn_Page5[] = { SPECIES_DODUO, SPECIES_DODRIO, SPECIES_TAILLOW, SPECIES_SWELLOW, }; static const u16 sDexCategory_GrasslandPkmn_Page6[] = { SPECIES_TANGELA, SPECIES_ROSELIA, SPECIES_SUNKERN, SPECIES_SUNFLORA, }; static const u16 sDexCategory_GrasslandPkmn_Page7[] = { SPECIES_HOPPIP, SPECIES_SKIPLOOM, SPECIES_JUMPLUFF, }; static const u16 sDexCategory_GrasslandPkmn_Page8[] = { SPECIES_ODDISH, SPECIES_GLOOM, SPECIES_VILEPLUME, SPECIES_BELLOSSOM, }; static const u16 sDexCategory_GrasslandPkmn_Page9[] = { SPECIES_EKANS, SPECIES_ARBOK, }; static const u16 sDexCategory_GrasslandPkmn_Page10[] = { SPECIES_IGGLYBUFF, SPECIES_JIGGLYPUFF, SPECIES_WIGGLYTUFF, }; static const u16 sDexCategory_GrasslandPkmn_Page11[] = { SPECIES_MAREEP, SPECIES_FLAAFFY, SPECIES_AMPHAROS, }; static const u16 sDexCategory_GrasslandPkmn_Page12[] = { SPECIES_FARFETCHD, SPECIES_LICKITUNG, }; static const u16 sDexCategory_GrasslandPkmn_Page13[] = { SPECIES_SCYTHER, SPECIES_SCIZOR, }; static const u16 sDexCategory_GrasslandPkmn_Page14[] = { SPECIES_DROWZEE, SPECIES_HYPNO, SPECIES_GULPIN, SPECIES_SWALOT, }; static const u16 sDexCategory_GrasslandPkmn_Page15[] = { SPECIES_KANGASKHAN, SPECIES_GIRAFARIG, }; static const u16 sDexCategory_GrasslandPkmn_Page16[] = { SPECIES_TAUROS, SPECIES_MILTANK, }; static const u16 sDexCategory_GrasslandPkmn_Page17[] = { SPECIES_VULPIX, SPECIES_NINETALES, SPECIES_PONYTA, SPECIES_RAPIDASH, }; static const u16 sDexCategory_GrasslandPkmn_Page18[] = { SPECIES_ELEKID, SPECIES_ELECTABUZZ, SPECIES_ELECTRIKE, SPECIES_MANECTRIC, }; static const u16 sDexCategory_GrasslandPkmn_Page19[] = { SPECIES_ZANGOOSE, SPECIES_SEVIPER, }; static const u16 sDexCategory_GrasslandPkmn_Page20[] = { SPECIES_PLUSLE, SPECIES_MINUN, }; static const u16 sDexCategory_GrasslandPkmn_Page21[] = { SPECIES_GROWLITHE, SPECIES_ARCANINE, }; static const u16 sDexCategory_GrasslandPkmn_Page22[] = { SPECIES_CASTFORM, SPECIES_CHIMECHO, }; static const u16 sDexCategory_GrasslandPkmn_Page23[] = { SPECIES_BULBASAUR, SPECIES_IVYSAUR, SPECIES_VENUSAUR, }; static const u16 sDexCategory_GrasslandPkmn_Page24[] = { SPECIES_CHIKORITA, SPECIES_BAYLEEF, SPECIES_MEGANIUM, }; static const u16 sDexCategory_GrasslandPkmn_Page25[] = { SPECIES_CYNDAQUIL, SPECIES_QUILAVA, SPECIES_TYPHLOSION, }; static const u16 sDexCategory_GrasslandPkmn_Page26[] = { SPECIES_TORCHIC, SPECIES_COMBUSKEN, SPECIES_BLAZIKEN, }; static const u16 sDexCategory_GrasslandPkmn_Page27[] = { SPECIES_RAIKOU, SPECIES_ENTEI, SPECIES_SUICUNE, }; static const u16 sDexCategory_ForestPkmn_Page1[] = { SPECIES_CATERPIE, SPECIES_METAPOD, SPECIES_BUTTERFREE, }; static const u16 sDexCategory_ForestPkmn_Page2[] = { SPECIES_WEEDLE, SPECIES_KAKUNA, SPECIES_BEEDRILL, }; static const u16 sDexCategory_ForestPkmn_Page3[] = { SPECIES_WURMPLE, SPECIES_SILCOON, SPECIES_BEAUTIFLY, }; static const u16 sDexCategory_ForestPkmn_Page4[] = { SPECIES_CASCOON, SPECIES_DUSTOX, }; static const u16 sDexCategory_ForestPkmn_Page5[] = { SPECIES_PIDGEY, SPECIES_PIDGEOTTO, SPECIES_PIDGEOT, }; static const u16 sDexCategory_ForestPkmn_Page6[] = { SPECIES_HOOTHOOT, SPECIES_NOCTOWL, SPECIES_NATU, SPECIES_XATU, }; static const u16 sDexCategory_ForestPkmn_Page7[] = { SPECIES_PICHU, SPECIES_PIKACHU, SPECIES_RAICHU, }; static const u16 sDexCategory_ForestPkmn_Page8[] = { SPECIES_BELLSPROUT, SPECIES_WEEPINBELL, SPECIES_VICTREEBEL, }; static const u16 sDexCategory_ForestPkmn_Page9[] = { SPECIES_PARAS, SPECIES_PARASECT, SPECIES_SHROOMISH, SPECIES_BRELOOM, }; static const u16 sDexCategory_ForestPkmn_Page10[] = { SPECIES_SEEDOT, SPECIES_NUZLEAF, SPECIES_SHIFTRY, }; static const u16 sDexCategory_ForestPkmn_Page11[] = { SPECIES_VENONAT, SPECIES_VENOMOTH, SPECIES_YANMA, }; static const u16 sDexCategory_ForestPkmn_Page12[] = { SPECIES_LEDYBA, SPECIES_LEDIAN, SPECIES_SPINARAK, SPECIES_ARIADOS, }; static const u16 sDexCategory_ForestPkmn_Page13[] = { SPECIES_NINCADA, SPECIES_NINJASK, SPECIES_SHEDINJA, }; static const u16 sDexCategory_ForestPkmn_Page14[] = { SPECIES_VOLBEAT, SPECIES_ILLUMISE, }; static const u16 sDexCategory_ForestPkmn_Page15[] = { SPECIES_PINECO, SPECIES_FORRETRESS, }; static const u16 sDexCategory_ForestPkmn_Page16[] = { SPECIES_SLAKOTH, SPECIES_VIGOROTH, SPECIES_SLAKING, }; static const u16 sDexCategory_ForestPkmn_Page17[] = { SPECIES_SKITTY, SPECIES_DELCATTY, }; static const u16 sDexCategory_ForestPkmn_Page18[] = { SPECIES_MURKROW, SPECIES_SNEASEL, }; static const u16 sDexCategory_ForestPkmn_Page19[] = { SPECIES_EXEGGCUTE, SPECIES_EXEGGUTOR, SPECIES_SUDOWOODO, }; static const u16 sDexCategory_ForestPkmn_Page20[] = { SPECIES_AIPOM, SPECIES_STANTLER, SPECIES_KECLEON, }; static const u16 sDexCategory_ForestPkmn_Page21[] = { SPECIES_PINSIR, SPECIES_HERACROSS, }; static const u16 sDexCategory_ForestPkmn_Page22[] = { SPECIES_SWABLU, SPECIES_ALTARIA, SPECIES_TROPIUS, }; static const u16 sDexCategory_ForestPkmn_Page23[] = { SPECIES_DUSKULL, SPECIES_DUSCLOPS, }; static const u16 sDexCategory_ForestPkmn_Page24[] = { SPECIES_TOGEPI, SPECIES_TOGETIC, }; static const u16 sDexCategory_ForestPkmn_Page25[] = { SPECIES_TREECKO, SPECIES_GROVYLE, SPECIES_SCEPTILE, }; static const u16 sDexCategory_ForestPkmn_Page26[] = { SPECIES_CELEBI, }; static const u16 sDexCategory_WatersEdgePkmn_Page1[] = { SPECIES_GOLDEEN, SPECIES_SEAKING, }; static const u16 sDexCategory_WatersEdgePkmn_Page2[] = { SPECIES_MAGIKARP, SPECIES_GYARADOS, SPECIES_KRABBY, SPECIES_KINGLER, }; static const u16 sDexCategory_WatersEdgePkmn_Page3[] = { SPECIES_CORPHISH, SPECIES_CRAWDAUNT, SPECIES_BARBOACH, SPECIES_WHISCASH, }; static const u16 sDexCategory_WatersEdgePkmn_Page4[] = { SPECIES_LOTAD, SPECIES_LOMBRE, SPECIES_LUDICOLO, }; static const u16 sDexCategory_WatersEdgePkmn_Page5[] = { SPECIES_SURSKIT, SPECIES_MASQUERAIN, }; static const u16 sDexCategory_WatersEdgePkmn_Page6[] = { SPECIES_PSYDUCK, SPECIES_GOLDUCK, SPECIES_WOOPER, SPECIES_QUAGSIRE, }; static const u16 sDexCategory_WatersEdgePkmn_Page7[] = { SPECIES_POLIWAG, SPECIES_POLIWHIRL, SPECIES_POLIWRATH, SPECIES_POLITOED, }; static const u16 sDexCategory_WatersEdgePkmn_Page8[] = { SPECIES_AZURILL, SPECIES_MARILL, SPECIES_AZUMARILL, }; static const u16 sDexCategory_WatersEdgePkmn_Page9[] = { SPECIES_SLOWPOKE, SPECIES_SLOWBRO, SPECIES_SLOWKING, }; static const u16 sDexCategory_WatersEdgePkmn_Page10[] = { SPECIES_FEEBAS, SPECIES_MILOTIC, }; static const u16 sDexCategory_WatersEdgePkmn_Page11[] = { SPECIES_ANORITH, SPECIES_ARMALDO, }; static const u16 sDexCategory_WatersEdgePkmn_Page12[] = { SPECIES_DRATINI, SPECIES_DRAGONAIR, SPECIES_DRAGONITE, }; static const u16 sDexCategory_WatersEdgePkmn_Page13[] = { SPECIES_SQUIRTLE, SPECIES_WARTORTLE, SPECIES_BLASTOISE, }; static const u16 sDexCategory_WatersEdgePkmn_Page14[] = { SPECIES_TOTODILE, SPECIES_CROCONAW, SPECIES_FERALIGATR, }; static const u16 sDexCategory_WatersEdgePkmn_Page15[] = { SPECIES_MUDKIP, SPECIES_MARSHTOMP, SPECIES_SWAMPERT, }; static const u16 sDexCategory_WatersEdgePkmn_Page16[] = { SPECIES_LATIAS, SPECIES_LATIOS, }; static const u16 sDexCategory_SeaPkmn_Page1[] = { SPECIES_TENTACOOL, SPECIES_TENTACRUEL, }; static const u16 sDexCategory_SeaPkmn_Page2[] = { SPECIES_WINGULL, SPECIES_PELIPPER, }; static const u16 sDexCategory_SeaPkmn_Page3[] = { SPECIES_STARYU, SPECIES_STARMIE, }; static const u16 sDexCategory_SeaPkmn_Page4[] = { SPECIES_CHINCHOU, SPECIES_LANTURN, SPECIES_REMORAID, SPECIES_OCTILLERY, }; static const u16 sDexCategory_SeaPkmn_Page5[] = { SPECIES_SHELLDER, SPECIES_CLOYSTER, }; static const u16 sDexCategory_SeaPkmn_Page6[] = { SPECIES_CLAMPERL, SPECIES_HUNTAIL, SPECIES_GOREBYSS, }; static const u16 sDexCategory_SeaPkmn_Page7[] = { SPECIES_QWILFISH, SPECIES_CORSOLA, SPECIES_MANTINE, SPECIES_LUVDISC, }; static const u16 sDexCategory_SeaPkmn_Page8[] = { SPECIES_SEEL, SPECIES_DEWGONG, }; static const u16 sDexCategory_SeaPkmn_Page9[] = { SPECIES_SPHEAL, SPECIES_SEALEO, SPECIES_WALREIN, }; static const u16 sDexCategory_SeaPkmn_Page10[] = { SPECIES_CARVANHA, SPECIES_SHARPEDO, SPECIES_WAILMER, SPECIES_WAILORD, }; static const u16 sDexCategory_SeaPkmn_Page11[] = { SPECIES_HORSEA, SPECIES_SEADRA, SPECIES_KINGDRA, }; static const u16 sDexCategory_SeaPkmn_Page12[] = { SPECIES_RELICANTH, }; static const u16 sDexCategory_SeaPkmn_Page13[] = { SPECIES_LAPRAS, }; static const u16 sDexCategory_SeaPkmn_Page14[] = { SPECIES_OMANYTE, SPECIES_OMASTAR, SPECIES_KABUTO, SPECIES_KABUTOPS, }; static const u16 sDexCategory_SeaPkmn_Page15[] = { SPECIES_LILEEP, SPECIES_CRADILY, }; static const u16 sDexCategory_SeaPkmn_Page16[] = { SPECIES_KYOGRE, }; static const u16 sDexCategory_CavePkmn_Page1[] = { SPECIES_ZUBAT, SPECIES_GOLBAT, SPECIES_CROBAT, }; static const u16 sDexCategory_CavePkmn_Page2[] = { SPECIES_DIGLETT, SPECIES_DUGTRIO, SPECIES_ONIX, SPECIES_STEELIX, }; static const u16 sDexCategory_CavePkmn_Page3[] = { SPECIES_SWINUB, SPECIES_PILOSWINE, SPECIES_SNORUNT, SPECIES_GLALIE, }; static const u16 sDexCategory_CavePkmn_Page4[] = { SPECIES_WHISMUR, SPECIES_LOUDRED, SPECIES_EXPLOUD, }; static const u16 sDexCategory_CavePkmn_Page5[] = { SPECIES_MISDREAVUS, SPECIES_DUNSPARCE, SPECIES_NOSEPASS, }; static const u16 sDexCategory_CavePkmn_Page6[] = { SPECIES_SABLEYE, SPECIES_MAWILE, }; static const u16 sDexCategory_CavePkmn_Page7[] = { SPECIES_GASTLY, SPECIES_HAUNTER, SPECIES_GENGAR, }; static const u16 sDexCategory_CavePkmn_Page8[] = { SPECIES_WYNAUT, SPECIES_WOBBUFFET, }; static const u16 sDexCategory_CavePkmn_Page9[] = { SPECIES_LUNATONE, SPECIES_SOLROCK, }; static const u16 sDexCategory_CavePkmn_Page10[] = { SPECIES_REGIROCK, SPECIES_REGICE, SPECIES_REGISTEEL, }; static const u16 sDexCategory_MountainPkmn_Page1[] = { SPECIES_GEODUDE, SPECIES_GRAVELER, SPECIES_GOLEM, }; static const u16 sDexCategory_MountainPkmn_Page2[] = { SPECIES_MANKEY, SPECIES_PRIMEAPE, SPECIES_SPOINK, SPECIES_GRUMPIG, }; static const u16 sDexCategory_MountainPkmn_Page3[] = { SPECIES_MACHOP, SPECIES_MACHOKE, SPECIES_MACHAMP, }; static const u16 sDexCategory_MountainPkmn_Page4[] = { SPECIES_CLEFFA, SPECIES_CLEFAIRY, SPECIES_CLEFABLE, }; static const u16 sDexCategory_MountainPkmn_Page5[] = { SPECIES_CUBONE, SPECIES_MAROWAK, }; static const u16 sDexCategory_MountainPkmn_Page6[] = { SPECIES_SLUGMA, SPECIES_MAGCARGO, SPECIES_NUMEL, SPECIES_CAMERUPT, }; static const u16 sDexCategory_MountainPkmn_Page7[] = { SPECIES_MAKUHITA, SPECIES_HARIYAMA, SPECIES_MEDITITE, SPECIES_MEDICHAM, }; static const u16 sDexCategory_MountainPkmn_Page8[] = { SPECIES_SHUCKLE, SPECIES_TEDDIURSA, SPECIES_URSARING, SPECIES_DELIBIRD, }; static const u16 sDexCategory_MountainPkmn_Page9[] = { SPECIES_GLIGAR, SPECIES_SPINDA, }; static const u16 sDexCategory_MountainPkmn_Page10[] = { SPECIES_MAGBY, SPECIES_MAGMAR, SPECIES_TORKOAL, }; static const u16 sDexCategory_MountainPkmn_Page11[] = { SPECIES_ARON, SPECIES_LAIRON, SPECIES_AGGRON, }; static const u16 sDexCategory_MountainPkmn_Page12[] = { SPECIES_LARVITAR, SPECIES_PUPITAR, SPECIES_TYRANITAR, }; static const u16 sDexCategory_MountainPkmn_Page13[] = { SPECIES_SNORLAX, }; static const u16 sDexCategory_MountainPkmn_Page14[] = { SPECIES_ABSOL, }; static const u16 sDexCategory_MountainPkmn_Page15[] = { SPECIES_AERODACTYL, }; static const u16 sDexCategory_MountainPkmn_Page16[] = { SPECIES_CHARMANDER, SPECIES_CHARMELEON, SPECIES_CHARIZARD, }; static const u16 sDexCategory_MountainPkmn_Page17[] = { SPECIES_JIRACHI, }; static const u16 sDexCategory_RoughTerrainPkmn_Page1[] = { SPECIES_SPEAROW, SPECIES_FEAROW, }; static const u16 sDexCategory_RoughTerrainPkmn_Page2[] = { SPECIES_SANDSHREW, SPECIES_SANDSLASH, SPECIES_RHYHORN, SPECIES_RHYDON, }; static const u16 sDexCategory_RoughTerrainPkmn_Page3[] = { SPECIES_MAGNEMITE, SPECIES_MAGNETON, }; static const u16 sDexCategory_RoughTerrainPkmn_Page4[] = { SPECIES_HOUNDOUR, SPECIES_HOUNDOOM, SPECIES_PHANPY, SPECIES_DONPHAN, }; static const u16 sDexCategory_RoughTerrainPkmn_Page5[] = { SPECIES_CACNEA, SPECIES_CACTURNE, }; static const u16 sDexCategory_RoughTerrainPkmn_Page6[] = { SPECIES_TRAPINCH, SPECIES_VIBRAVA, SPECIES_FLYGON, }; static const u16 sDexCategory_RoughTerrainPkmn_Page7[] = { SPECIES_SKARMORY, }; static const u16 sDexCategory_RoughTerrainPkmn_Page8[] = { SPECIES_BALTOY, SPECIES_CLAYDOL, }; static const u16 sDexCategory_RoughTerrainPkmn_Page9[] = { SPECIES_BAGON, SPECIES_SHELGON, SPECIES_SALAMENCE, }; static const u16 sDexCategory_RoughTerrainPkmn_Page10[] = { SPECIES_BELDUM, SPECIES_METANG, SPECIES_METAGROSS, }; static const u16 sDexCategory_RoughTerrainPkmn_Page11[] = { SPECIES_GROUDON, }; static const u16 sDexCategory_UrbanPkmn_Page1[] = { SPECIES_MEOWTH, SPECIES_PERSIAN, SPECIES_SNUBBULL, SPECIES_GRANBULL, }; static const u16 sDexCategory_UrbanPkmn_Page2[] = { SPECIES_GRIMER, SPECIES_MUK, SPECIES_KOFFING, SPECIES_WEEZING, }; static const u16 sDexCategory_UrbanPkmn_Page3[] = { SPECIES_SHUPPET, SPECIES_BANETTE, }; static const u16 sDexCategory_UrbanPkmn_Page4[] = { SPECIES_ABRA, SPECIES_KADABRA, SPECIES_ALAKAZAM, }; static const u16 sDexCategory_UrbanPkmn_Page5[] = { SPECIES_RALTS, SPECIES_KIRLIA, SPECIES_GARDEVOIR, }; static const u16 sDexCategory_UrbanPkmn_Page6[] = { SPECIES_SMOOCHUM, SPECIES_JYNX, SPECIES_MR_MIME, SPECIES_SMEARGLE, }; static const u16 sDexCategory_UrbanPkmn_Page7[] = { SPECIES_TYROGUE, SPECIES_HITMONLEE, SPECIES_HITMONCHAN, SPECIES_HITMONTOP, }; static const u16 sDexCategory_UrbanPkmn_Page8[] = { SPECIES_CHANSEY, SPECIES_BLISSEY, }; static const u16 sDexCategory_UrbanPkmn_Page9[] = { SPECIES_VOLTORB, SPECIES_ELECTRODE, SPECIES_PORYGON, SPECIES_PORYGON2, }; static const u16 sDexCategory_UrbanPkmn_Page10[] = { SPECIES_DITTO, }; static const u16 sDexCategory_UrbanPkmn_Page11[] = { SPECIES_EEVEE, SPECIES_VAPOREON, SPECIES_JOLTEON, SPECIES_FLAREON, }; static const u16 sDexCategory_UrbanPkmn_Page12[] = { SPECIES_ESPEON, SPECIES_UMBREON, }; static const u16 sDexCategory_RarePkmn_Page1[] = { SPECIES_UNOWN, }; static const u16 sDexCategory_RarePkmn_Page2[] = { SPECIES_ARTICUNO, SPECIES_ZAPDOS, SPECIES_MOLTRES, }; static const u16 sDexCategory_RarePkmn_Page3[] = { SPECIES_LUGIA, }; static const u16 sDexCategory_RarePkmn_Page4[] = { SPECIES_HO_OH, }; static const u16 sDexCategory_RarePkmn_Page5[] = { SPECIES_RAYQUAZA, }; static const u16 sDexCategory_RarePkmn_Page6[] = { SPECIES_DEOXYS, }; static const u16 sDexCategory_RarePkmn_Page7[] = { SPECIES_MEWTWO, }; static const u16 sDexCategory_RarePkmn_Page8[] = { SPECIES_MEW, }; #define DEX_CATEGORY(name){sDexCategory_##name, NELEMS(sDexCategory_##name)} static const struct PokedexCategoryPage sDexCategory_GrasslandPkmn[] = { DEX_CATEGORY(GrasslandPkmn_Page1), DEX_CATEGORY(GrasslandPkmn_Page2), DEX_CATEGORY(GrasslandPkmn_Page3), DEX_CATEGORY(GrasslandPkmn_Page4), DEX_CATEGORY(GrasslandPkmn_Page5), DEX_CATEGORY(GrasslandPkmn_Page6), DEX_CATEGORY(GrasslandPkmn_Page7), DEX_CATEGORY(GrasslandPkmn_Page8), DEX_CATEGORY(GrasslandPkmn_Page9), DEX_CATEGORY(GrasslandPkmn_Page10), DEX_CATEGORY(GrasslandPkmn_Page11), DEX_CATEGORY(GrasslandPkmn_Page12), DEX_CATEGORY(GrasslandPkmn_Page13), DEX_CATEGORY(GrasslandPkmn_Page14), DEX_CATEGORY(GrasslandPkmn_Page15), DEX_CATEGORY(GrasslandPkmn_Page16), DEX_CATEGORY(GrasslandPkmn_Page17), DEX_CATEGORY(GrasslandPkmn_Page18), DEX_CATEGORY(GrasslandPkmn_Page19), DEX_CATEGORY(GrasslandPkmn_Page20), DEX_CATEGORY(GrasslandPkmn_Page21), DEX_CATEGORY(GrasslandPkmn_Page22), DEX_CATEGORY(GrasslandPkmn_Page23), DEX_CATEGORY(GrasslandPkmn_Page24), DEX_CATEGORY(GrasslandPkmn_Page25), DEX_CATEGORY(GrasslandPkmn_Page26), DEX_CATEGORY(GrasslandPkmn_Page27), }; static const struct PokedexCategoryPage sDexCategory_ForestPkmn[] = { DEX_CATEGORY(ForestPkmn_Page1), DEX_CATEGORY(ForestPkmn_Page2), DEX_CATEGORY(ForestPkmn_Page3), DEX_CATEGORY(ForestPkmn_Page4), DEX_CATEGORY(ForestPkmn_Page5), DEX_CATEGORY(ForestPkmn_Page6), DEX_CATEGORY(ForestPkmn_Page7), DEX_CATEGORY(ForestPkmn_Page8), DEX_CATEGORY(ForestPkmn_Page9), DEX_CATEGORY(ForestPkmn_Page10), DEX_CATEGORY(ForestPkmn_Page11), DEX_CATEGORY(ForestPkmn_Page12), DEX_CATEGORY(ForestPkmn_Page13), DEX_CATEGORY(ForestPkmn_Page14), DEX_CATEGORY(ForestPkmn_Page15), DEX_CATEGORY(ForestPkmn_Page16), DEX_CATEGORY(ForestPkmn_Page17), DEX_CATEGORY(ForestPkmn_Page18), DEX_CATEGORY(ForestPkmn_Page19), DEX_CATEGORY(ForestPkmn_Page20), DEX_CATEGORY(ForestPkmn_Page21), DEX_CATEGORY(ForestPkmn_Page22), DEX_CATEGORY(ForestPkmn_Page23), DEX_CATEGORY(ForestPkmn_Page24), DEX_CATEGORY(ForestPkmn_Page25), DEX_CATEGORY(ForestPkmn_Page26), }; static const struct PokedexCategoryPage sDexCategory_WatersEdgePkmn[] = { DEX_CATEGORY(WatersEdgePkmn_Page1), DEX_CATEGORY(WatersEdgePkmn_Page2), DEX_CATEGORY(WatersEdgePkmn_Page3), DEX_CATEGORY(WatersEdgePkmn_Page4), DEX_CATEGORY(WatersEdgePkmn_Page5), DEX_CATEGORY(WatersEdgePkmn_Page6), DEX_CATEGORY(WatersEdgePkmn_Page7), DEX_CATEGORY(WatersEdgePkmn_Page8), DEX_CATEGORY(WatersEdgePkmn_Page9), DEX_CATEGORY(WatersEdgePkmn_Page10), DEX_CATEGORY(WatersEdgePkmn_Page11), DEX_CATEGORY(WatersEdgePkmn_Page12), DEX_CATEGORY(WatersEdgePkmn_Page13), DEX_CATEGORY(WatersEdgePkmn_Page14), DEX_CATEGORY(WatersEdgePkmn_Page15), DEX_CATEGORY(WatersEdgePkmn_Page16), }; static const struct PokedexCategoryPage sDexCategory_SeaPkmn[] = { DEX_CATEGORY(SeaPkmn_Page1), DEX_CATEGORY(SeaPkmn_Page2), DEX_CATEGORY(SeaPkmn_Page3), DEX_CATEGORY(SeaPkmn_Page4), DEX_CATEGORY(SeaPkmn_Page5), DEX_CATEGORY(SeaPkmn_Page6), DEX_CATEGORY(SeaPkmn_Page7), DEX_CATEGORY(SeaPkmn_Page8), DEX_CATEGORY(SeaPkmn_Page9), DEX_CATEGORY(SeaPkmn_Page10), DEX_CATEGORY(SeaPkmn_Page11), DEX_CATEGORY(SeaPkmn_Page12), DEX_CATEGORY(SeaPkmn_Page13), DEX_CATEGORY(SeaPkmn_Page14), DEX_CATEGORY(SeaPkmn_Page15), DEX_CATEGORY(SeaPkmn_Page16), }; static const struct PokedexCategoryPage sDexCategory_CavePkmn[] = { DEX_CATEGORY(CavePkmn_Page1), DEX_CATEGORY(CavePkmn_Page2), DEX_CATEGORY(CavePkmn_Page3), DEX_CATEGORY(CavePkmn_Page4), DEX_CATEGORY(CavePkmn_Page5), DEX_CATEGORY(CavePkmn_Page6), DEX_CATEGORY(CavePkmn_Page7), DEX_CATEGORY(CavePkmn_Page8), DEX_CATEGORY(CavePkmn_Page9), DEX_CATEGORY(CavePkmn_Page10), }; static const struct PokedexCategoryPage sDexCategory_MountainPkmn[] = { DEX_CATEGORY(MountainPkmn_Page1), DEX_CATEGORY(MountainPkmn_Page2), DEX_CATEGORY(MountainPkmn_Page3), DEX_CATEGORY(MountainPkmn_Page4), DEX_CATEGORY(MountainPkmn_Page5), DEX_CATEGORY(MountainPkmn_Page6), DEX_CATEGORY(MountainPkmn_Page7), DEX_CATEGORY(MountainPkmn_Page8), DEX_CATEGORY(MountainPkmn_Page9), DEX_CATEGORY(MountainPkmn_Page10), DEX_CATEGORY(MountainPkmn_Page11), DEX_CATEGORY(MountainPkmn_Page12), DEX_CATEGORY(MountainPkmn_Page13), DEX_CATEGORY(MountainPkmn_Page14), DEX_CATEGORY(MountainPkmn_Page15), DEX_CATEGORY(MountainPkmn_Page16), DEX_CATEGORY(MountainPkmn_Page17), }; static const struct PokedexCategoryPage sDexCategory_RoughTerrainPkmn[] = { DEX_CATEGORY(RoughTerrainPkmn_Page1), DEX_CATEGORY(RoughTerrainPkmn_Page2), DEX_CATEGORY(RoughTerrainPkmn_Page3), DEX_CATEGORY(RoughTerrainPkmn_Page4), DEX_CATEGORY(RoughTerrainPkmn_Page5), DEX_CATEGORY(RoughTerrainPkmn_Page6), DEX_CATEGORY(RoughTerrainPkmn_Page7), DEX_CATEGORY(RoughTerrainPkmn_Page8), DEX_CATEGORY(RoughTerrainPkmn_Page9), DEX_CATEGORY(RoughTerrainPkmn_Page10), DEX_CATEGORY(RoughTerrainPkmn_Page11), }; static const struct PokedexCategoryPage sDexCategory_UrbanPkmn[] = { DEX_CATEGORY(UrbanPkmn_Page1), DEX_CATEGORY(UrbanPkmn_Page2), DEX_CATEGORY(UrbanPkmn_Page3), DEX_CATEGORY(UrbanPkmn_Page4), DEX_CATEGORY(UrbanPkmn_Page5), DEX_CATEGORY(UrbanPkmn_Page6), DEX_CATEGORY(UrbanPkmn_Page7), DEX_CATEGORY(UrbanPkmn_Page8), DEX_CATEGORY(UrbanPkmn_Page9), DEX_CATEGORY(UrbanPkmn_Page10), DEX_CATEGORY(UrbanPkmn_Page11), DEX_CATEGORY(UrbanPkmn_Page12), }; static const struct PokedexCategoryPage sDexCategory_RarePkmn[] = { DEX_CATEGORY(RarePkmn_Page1), DEX_CATEGORY(RarePkmn_Page2), DEX_CATEGORY(RarePkmn_Page3), DEX_CATEGORY(RarePkmn_Page4), DEX_CATEGORY(RarePkmn_Page5), DEX_CATEGORY(RarePkmn_Page6), DEX_CATEGORY(RarePkmn_Page7), DEX_CATEGORY(RarePkmn_Page8), }; struct { const struct PokedexCategoryPage * page; u8 count; } const gDexCategories[] = { DEX_CATEGORY(GrasslandPkmn), DEX_CATEGORY(ForestPkmn), DEX_CATEGORY(WatersEdgePkmn), DEX_CATEGORY(SeaPkmn), DEX_CATEGORY(CavePkmn), DEX_CATEGORY(MountainPkmn), DEX_CATEGORY(RoughTerrainPkmn), DEX_CATEGORY(UrbanPkmn), DEX_CATEGORY(RarePkmn), }; ================================================ FILE: src/data/pokemon/pokedex_entries.h ================================================ const struct PokedexEntry gPokedexEntries[] = { [NATIONAL_DEX_NONE] = { .categoryName = _("UNKNOWN"), .height = 0, .weight = 0, .description_FR = gDummyPokedexText_FR, .description_LG = gDummyPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 256, .trainerOffset = 0, }, [NATIONAL_DEX_BULBASAUR] = { .categoryName = _("SEED"), .height = 7, .weight = 69, .description_FR = gBulbasaurPokedexText_FR, .description_LG = gBulbasaurPokedexText_LG, .pokemonScale = 356, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_IVYSAUR] = { .categoryName = _("SEED"), .height = 10, .weight = 130, .description_FR = gIvysaurPokedexText_FR, .description_LG = gIvysaurPokedexText_LG, .pokemonScale = 332, .pokemonOffset = 11, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_VENUSAUR] = { .categoryName = _("SEED"), .height = 20, .weight = 1000, .description_FR = gVenusaurPokedexText_FR, .description_LG = gVenusaurPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 1, .trainerScale = 375, .trainerOffset = 6, }, [NATIONAL_DEX_CHARMANDER] = { .categoryName = _("LIZARD"), .height = 6, .weight = 85, .description_FR = gCharmanderPokedexText_FR, .description_LG = gCharmanderPokedexText_LG, .pokemonScale = 410, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CHARMELEON] = { .categoryName = _("FLAME"), .height = 11, .weight = 190, .description_FR = gCharmeleonPokedexText_FR, .description_LG = gCharmeleonPokedexText_LG, .pokemonScale = 294, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CHARIZARD] = { .categoryName = _("FLAME"), .height = 17, .weight = 905, .description_FR = gCharizardPokedexText_FR, .description_LG = gCharizardPokedexText_LG, .pokemonScale = 271, .pokemonOffset = 0, .trainerScale = 317, .trainerOffset = 3, }, [NATIONAL_DEX_SQUIRTLE] = { .categoryName = _("TINY TURTLE"), .height = 5, .weight = 90, .description_FR = gSquirtlePokedexText_FR, .description_LG = gSquirtlePokedexText_LG, .pokemonScale = 412, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WARTORTLE] = { .categoryName = _("TURTLE"), .height = 10, .weight = 225, .description_FR = gWartortlePokedexText_FR, .description_LG = gWartortlePokedexText_LG, .pokemonScale = 334, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BLASTOISE] = { .categoryName = _("SHELLFISH"), .height = 16, .weight = 855, .description_FR = gBlastoisePokedexText_FR, .description_LG = gBlastoisePokedexText_LG, .pokemonScale = 256, .pokemonOffset = 1, .trainerScale = 329, .trainerOffset = 3, }, [NATIONAL_DEX_CATERPIE] = { .categoryName = _("WORM"), .height = 3, .weight = 29, .description_FR = gCaterpiePokedexText_FR, .description_LG = gCaterpiePokedexText_LG, .pokemonScale = 549, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_METAPOD] = { .categoryName = _("COCOON"), .height = 7, .weight = 99, .description_FR = gMetapodPokedexText_FR, .description_LG = gMetapodPokedexText_LG, .pokemonScale = 350, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BUTTERFREE] = { .categoryName = _("BUTTERFLY"), .height = 11, .weight = 320, .description_FR = gButterfreePokedexText_FR, .description_LG = gButterfreePokedexText_LG, .pokemonScale = 312, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WEEDLE] = { .categoryName = _("HAIRY BUG"), .height = 3, .weight = 32, .description_FR = gWeedlePokedexText_FR, .description_LG = gWeedlePokedexText_LG, .pokemonScale = 455, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_KAKUNA] = { .categoryName = _("COCOON"), .height = 6, .weight = 100, .description_FR = gKakunaPokedexText_FR, .description_LG = gKakunaPokedexText_LG, .pokemonScale = 424, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BEEDRILL] = { .categoryName = _("POISON BEE"), .height = 10, .weight = 295, .description_FR = gBeedrillPokedexText_FR, .description_LG = gBeedrillPokedexText_LG, .pokemonScale = 366, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PIDGEY] = { .categoryName = _("TINY BIRD"), .height = 3, .weight = 18, .description_FR = gPidgeyPokedexText_FR, .description_LG = gPidgeyPokedexText_LG, .pokemonScale = 492, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PIDGEOTTO] = { .categoryName = _("BIRD"), .height = 11, .weight = 300, .description_FR = gPidgeottoPokedexText_FR, .description_LG = gPidgeottoPokedexText_LG, .pokemonScale = 334, .pokemonOffset = 11, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PIDGEOT] = { .categoryName = _("BIRD"), .height = 15, .weight = 395, .description_FR = gPidgeotPokedexText_FR, .description_LG = gPidgeotPokedexText_LG, .pokemonScale = 269, .pokemonOffset = -2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_RATTATA] = { .categoryName = _("MOUSE"), .height = 3, .weight = 35, .description_FR = gRattataPokedexText_FR, .description_LG = gRattataPokedexText_LG, .pokemonScale = 481, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_RATICATE] = { .categoryName = _("MOUSE"), .height = 7, .weight = 185, .description_FR = gRaticatePokedexText_FR, .description_LG = gRaticatePokedexText_LG, .pokemonScale = 401, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SPEAROW] = { .categoryName = _("TINY BIRD"), .height = 3, .weight = 20, .description_FR = gSpearowPokedexText_FR, .description_LG = gSpearowPokedexText_LG, .pokemonScale = 571, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_FEAROW] = { .categoryName = _("BEAK"), .height = 12, .weight = 380, .description_FR = gFearowPokedexText_FR, .description_LG = gFearowPokedexText_LG, .pokemonScale = 282, .pokemonOffset = -1, .trainerScale = 272, .trainerOffset = -2, }, [NATIONAL_DEX_EKANS] = { .categoryName = _("SNAKE"), .height = 20, .weight = 69, .description_FR = gEkansPokedexText_FR, .description_LG = gEkansPokedexText_LG, .pokemonScale = 298, .pokemonOffset = 13, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ARBOK] = { .categoryName = _("COBRA"), .height = 35, .weight = 650, .description_FR = gArbokPokedexText_FR, .description_LG = gArbokPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 296, .trainerOffset = 1, }, [NATIONAL_DEX_PIKACHU] = { .categoryName = _("MOUSE"), .height = 4, .weight = 60, .description_FR = gPikachuPokedexText_FR, .description_LG = gPikachuPokedexText_LG, .pokemonScale = 479, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_RAICHU] = { .categoryName = _("MOUSE"), .height = 8, .weight = 300, .description_FR = gRaichuPokedexText_FR, .description_LG = gRaichuPokedexText_LG, .pokemonScale = 426, .pokemonOffset = 10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SANDSHREW] = { .categoryName = _("MOUSE"), .height = 6, .weight = 120, .description_FR = gSandshrewPokedexText_FR, .description_LG = gSandshrewPokedexText_LG, .pokemonScale = 370, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SANDSLASH] = { .categoryName = _("MOUSE"), .height = 10, .weight = 295, .description_FR = gSandslashPokedexText_FR, .description_LG = gSandslashPokedexText_LG, .pokemonScale = 341, .pokemonOffset = 10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NIDORAN_F] = { .categoryName = _("POISON PIN"), .height = 4, .weight = 70, .description_FR = gNidoranFPokedexText_FR, .description_LG = gNidoranFPokedexText_LG, .pokemonScale = 488, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NIDORINA] = { .categoryName = _("POISON PIN"), .height = 8, .weight = 200, .description_FR = gNidorinaPokedexText_FR, .description_LG = gNidorinaPokedexText_LG, .pokemonScale = 381, .pokemonOffset = 13, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NIDOQUEEN] = { .categoryName = _("DRILL"), .height = 13, .weight = 600, .description_FR = gNidoqueenPokedexText_FR, .description_LG = gNidoqueenPokedexText_LG, .pokemonScale = 283, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NIDORAN_M] = { .categoryName = _("POISON PIN"), .height = 5, .weight = 90, .description_FR = gNidoranMPokedexText_FR, .description_LG = gNidoranMPokedexText_LG, .pokemonScale = 480, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NIDORINO] = { .categoryName = _("POISON PIN"), .height = 9, .weight = 195, .description_FR = gNidorinoPokedexText_FR, .description_LG = gNidorinoPokedexText_LG, .pokemonScale = 408, .pokemonOffset = 13, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NIDOKING] = { .categoryName = _("DRILL"), .height = 14, .weight = 620, .description_FR = gNidokingPokedexText_FR, .description_LG = gNidokingPokedexText_LG, .pokemonScale = 304, .pokemonOffset = 3, .trainerScale = 323, .trainerOffset = 2, }, [NATIONAL_DEX_CLEFAIRY] = { .categoryName = _("FAIRY"), .height = 6, .weight = 75, .description_FR = gClefairyPokedexText_FR, .description_LG = gClefairyPokedexText_LG, .pokemonScale = 425, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CLEFABLE] = { .categoryName = _("FAIRY"), .height = 13, .weight = 400, .description_FR = gClefablePokedexText_FR, .description_LG = gClefablePokedexText_LG, .pokemonScale = 256, .pokemonOffset = 3, .trainerScale = 272, .trainerOffset = -1, }, [NATIONAL_DEX_VULPIX] = { .categoryName = _("FOX"), .height = 6, .weight = 99, .description_FR = gVulpixPokedexText_FR, .description_LG = gVulpixPokedexText_LG, .pokemonScale = 497, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NINETALES] = { .categoryName = _("FOX"), .height = 11, .weight = 199, .description_FR = gNinetalesPokedexText_FR, .description_LG = gNinetalesPokedexText_LG, .pokemonScale = 339, .pokemonOffset = 6, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_JIGGLYPUFF] = { .categoryName = _("BALLOON"), .height = 5, .weight = 55, .description_FR = gJigglypuffPokedexText_FR, .description_LG = gJigglypuffPokedexText_LG, .pokemonScale = 419, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WIGGLYTUFF] = { .categoryName = _("BALLOON"), .height = 10, .weight = 120, .description_FR = gWigglytuffPokedexText_FR, .description_LG = gWigglytuffPokedexText_LG, .pokemonScale = 328, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ZUBAT] = { .categoryName = _("BAT"), .height = 8, .weight = 75, .description_FR = gZubatPokedexText_FR, .description_LG = gZubatPokedexText_LG, .pokemonScale = 355, .pokemonOffset = -4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GOLBAT] = { .categoryName = _("BAT"), .height = 16, .weight = 550, .description_FR = gGolbatPokedexText_FR, .description_LG = gGolbatPokedexText_LG, .pokemonScale = 291, .pokemonOffset = 0, .trainerScale = 296, .trainerOffset = 2, }, [NATIONAL_DEX_ODDISH] = { .categoryName = _("WEED"), .height = 5, .weight = 54, .description_FR = gOddishPokedexText_FR, .description_LG = gOddishPokedexText_LG, .pokemonScale = 423, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GLOOM] = { .categoryName = _("WEED"), .height = 8, .weight = 86, .description_FR = gGloomPokedexText_FR, .description_LG = gGloomPokedexText_LG, .pokemonScale = 329, .pokemonOffset = 10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_VILEPLUME] = { .categoryName = _("FLOWER"), .height = 12, .weight = 186, .description_FR = gVileplumePokedexText_FR, .description_LG = gVileplumePokedexText_LG, .pokemonScale = 256, .pokemonOffset = 4, .trainerScale = 272, .trainerOffset = -2, }, [NATIONAL_DEX_PARAS] = { .categoryName = _("MUSHROOM"), .height = 3, .weight = 54, .description_FR = gParasPokedexText_FR, .description_LG = gParasPokedexText_LG, .pokemonScale = 546, .pokemonOffset = 21, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PARASECT] = { .categoryName = _("MUSHROOM"), .height = 10, .weight = 295, .description_FR = gParasectPokedexText_FR, .description_LG = gParasectPokedexText_LG, .pokemonScale = 307, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_VENONAT] = { .categoryName = _("INSECT"), .height = 10, .weight = 300, .description_FR = gVenonatPokedexText_FR, .description_LG = gVenonatPokedexText_LG, .pokemonScale = 360, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_VENOMOTH] = { .categoryName = _("POISON MOTH"), .height = 15, .weight = 125, .description_FR = gVenomothPokedexText_FR, .description_LG = gVenomothPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 3, .trainerScale = 293, .trainerOffset = 1, }, [NATIONAL_DEX_DIGLETT] = { .categoryName = _("MOLE"), .height = 2, .weight = 8, .description_FR = gDiglettPokedexText_FR, .description_LG = gDiglettPokedexText_LG, .pokemonScale = 706, .pokemonOffset = 22, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DUGTRIO] = { .categoryName = _("MOLE"), .height = 7, .weight = 333, .description_FR = gDugtrioPokedexText_FR, .description_LG = gDugtrioPokedexText_LG, .pokemonScale = 384, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MEOWTH] = { .categoryName = _("SCRATCH CAT"), .height = 4, .weight = 42, .description_FR = gMeowthPokedexText_FR, .description_LG = gMeowthPokedexText_LG, .pokemonScale = 480, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PERSIAN] = { .categoryName = _("CLASSY CAT"), .height = 10, .weight = 320, .description_FR = gPersianPokedexText_FR, .description_LG = gPersianPokedexText_LG, .pokemonScale = 320, .pokemonOffset = 10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PSYDUCK] = { .categoryName = _("DUCK"), .height = 8, .weight = 196, .description_FR = gPsyduckPokedexText_FR, .description_LG = gPsyduckPokedexText_LG, .pokemonScale = 347, .pokemonOffset = 11, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GOLDUCK] = { .categoryName = _("DUCK"), .height = 17, .weight = 766, .description_FR = gGolduckPokedexText_FR, .description_LG = gGolduckPokedexText_LG, .pokemonScale = 272, .pokemonOffset = 4, .trainerScale = 287, .trainerOffset = 1, }, [NATIONAL_DEX_MANKEY] = { .categoryName = _("PIG MONKEY"), .height = 5, .weight = 280, .description_FR = gMankeyPokedexText_FR, .description_LG = gMankeyPokedexText_LG, .pokemonScale = 388, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PRIMEAPE] = { .categoryName = _("PIG MONKEY"), .height = 10, .weight = 320, .description_FR = gPrimeapePokedexText_FR, .description_LG = gPrimeapePokedexText_LG, .pokemonScale = 326, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GROWLITHE] = { .categoryName = _("PUPPY"), .height = 7, .weight = 190, .description_FR = gGrowlithePokedexText_FR, .description_LG = gGrowlithePokedexText_LG, .pokemonScale = 346, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ARCANINE] = { .categoryName = _("LEGENDARY"), .height = 19, .weight = 1550, .description_FR = gArcaninePokedexText_FR, .description_LG = gArcaninePokedexText_LG, .pokemonScale = 256, .pokemonOffset = -1, .trainerScale = 312, .trainerOffset = 2, }, [NATIONAL_DEX_POLIWAG] = { .categoryName = _("TADPOLE"), .height = 6, .weight = 124, .description_FR = gPoliwagPokedexText_FR, .description_LG = gPoliwagPokedexText_LG, .pokemonScale = 353, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_POLIWHIRL] = { .categoryName = _("TADPOLE"), .height = 10, .weight = 200, .description_FR = gPoliwhirlPokedexText_FR, .description_LG = gPoliwhirlPokedexText_LG, .pokemonScale = 288, .pokemonOffset = 10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_POLIWRATH] = { .categoryName = _("TADPOLE"), .height = 13, .weight = 540, .description_FR = gPoliwrathPokedexText_FR, .description_LG = gPoliwrathPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ABRA] = { .categoryName = _("PSI"), .height = 9, .weight = 195, .description_FR = gAbraPokedexText_FR, .description_LG = gAbraPokedexText_LG, .pokemonScale = 374, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_KADABRA] = { .categoryName = _("PSI"), .height = 13, .weight = 565, .description_FR = gKadabraPokedexText_FR, .description_LG = gKadabraPokedexText_LG, .pokemonScale = 272, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ALAKAZAM] = { .categoryName = _("PSI"), .height = 15, .weight = 480, .description_FR = gAlakazamPokedexText_FR, .description_LG = gAlakazamPokedexText_LG, .pokemonScale = 272, .pokemonOffset = -1, .trainerScale = 271, .trainerOffset = -1, }, [NATIONAL_DEX_MACHOP] = { .categoryName = _("SUPERPOWER"), .height = 8, .weight = 195, .description_FR = gMachopPokedexText_FR, .description_LG = gMachopPokedexText_LG, .pokemonScale = 320, .pokemonOffset = 12, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MACHOKE] = { .categoryName = _("SUPERPOWER"), .height = 15, .weight = 705, .description_FR = gMachokePokedexText_FR, .description_LG = gMachokePokedexText_LG, .pokemonScale = 304, .pokemonOffset = 6, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MACHAMP] = { .categoryName = _("SUPERPOWER"), .height = 16, .weight = 1300, .description_FR = gMachampPokedexText_FR, .description_LG = gMachampPokedexText_LG, .pokemonScale = 278, .pokemonOffset = 2, .trainerScale = 283, .trainerOffset = 0, }, [NATIONAL_DEX_BELLSPROUT] = { .categoryName = _("FLOWER"), .height = 7, .weight = 40, .description_FR = gBellsproutPokedexText_FR, .description_LG = gBellsproutPokedexText_LG, .pokemonScale = 354, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WEEPINBELL] = { .categoryName = _("FLYCATCHER"), .height = 10, .weight = 64, .description_FR = gWeepinbellPokedexText_FR, .description_LG = gWeepinbellPokedexText_LG, .pokemonScale = 256, .pokemonOffset = -1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_VICTREEBEL] = { .categoryName = _("FLYCATCHER"), .height = 17, .weight = 155, .description_FR = gVictreebelPokedexText_FR, .description_LG = gVictreebelPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 2, .trainerScale = 302, .trainerOffset = 2, }, [NATIONAL_DEX_TENTACOOL] = { .categoryName = _("JELLYFISH"), .height = 9, .weight = 455, .description_FR = gTentacoolPokedexText_FR, .description_LG = gTentacoolPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TENTACRUEL] = { .categoryName = _("JELLYFISH"), .height = 16, .weight = 550, .description_FR = gTentacruelPokedexText_FR, .description_LG = gTentacruelPokedexText_LG, .pokemonScale = 272, .pokemonOffset = -1, .trainerScale = 312, .trainerOffset = 0, }, [NATIONAL_DEX_GEODUDE] = { .categoryName = _("ROCK"), .height = 4, .weight = 200, .description_FR = gGeodudePokedexText_FR, .description_LG = gGeodudePokedexText_LG, .pokemonScale = 330, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GRAVELER] = { .categoryName = _("ROCK"), .height = 10, .weight = 1050, .description_FR = gGravelerPokedexText_FR, .description_LG = gGravelerPokedexText_LG, .pokemonScale = 272, .pokemonOffset = 8, .trainerScale = 305, .trainerOffset = 1, }, [NATIONAL_DEX_GOLEM] = { .categoryName = _("MEGATON"), .height = 14, .weight = 3000, .description_FR = gGolemPokedexText_FR, .description_LG = gGolemPokedexText_LG, .pokemonScale = 266, .pokemonOffset = 3, .trainerScale = 298, .trainerOffset = 1, }, [NATIONAL_DEX_PONYTA] = { .categoryName = _("FIRE HORSE"), .height = 10, .weight = 300, .description_FR = gPonytaPokedexText_FR, .description_LG = gPonytaPokedexText_LG, .pokemonScale = 288, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_RAPIDASH] = { .categoryName = _("FIRE HORSE"), .height = 17, .weight = 950, .description_FR = gRapidashPokedexText_FR, .description_LG = gRapidashPokedexText_LG, .pokemonScale = 282, .pokemonOffset = -1, .trainerScale = 312, .trainerOffset = 1, }, [NATIONAL_DEX_SLOWPOKE] = { .categoryName = _("DOPEY"), .height = 12, .weight = 360, .description_FR = gSlowpokePokedexText_FR, .description_LG = gSlowpokePokedexText_LG, .pokemonScale = 271, .pokemonOffset = 10, .trainerScale = 272, .trainerOffset = -2, }, [NATIONAL_DEX_SLOWBRO] = { .categoryName = _("HERMIT CRAB"), .height = 16, .weight = 785, .description_FR = gSlowbroPokedexText_FR, .description_LG = gSlowbroPokedexText_LG, .pokemonScale = 257, .pokemonOffset = -2, .trainerScale = 312, .trainerOffset = 0, }, [NATIONAL_DEX_MAGNEMITE] = { .categoryName = _("MAGNET"), .height = 3, .weight = 60, .description_FR = gMagnemitePokedexText_FR, .description_LG = gMagnemitePokedexText_LG, .pokemonScale = 294, .pokemonOffset = -8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MAGNETON] = { .categoryName = _("MAGNET"), .height = 10, .weight = 600, .description_FR = gMagnetonPokedexText_FR, .description_LG = gMagnetonPokedexText_LG, .pokemonScale = 293, .pokemonOffset = -4, .trainerScale = 273, .trainerOffset = -2, }, [NATIONAL_DEX_FARFETCHD] = { .categoryName = _("WILD DUCK"), .height = 8, .weight = 150, .description_FR = gFarfetchdPokedexText_FR, .description_LG = gFarfetchdPokedexText_LG, .pokemonScale = 317, .pokemonOffset = -2, .trainerScale = 256, .trainerOffset = -3, }, [NATIONAL_DEX_DODUO] = { .categoryName = _("TWIN BIRD"), .height = 14, .weight = 392, .description_FR = gDoduoPokedexText_FR, .description_LG = gDoduoPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 3, .trainerScale = 287, .trainerOffset = 0, }, [NATIONAL_DEX_DODRIO] = { .categoryName = _("TRIPLE BIRD"), .height = 18, .weight = 852, .description_FR = gDodrioPokedexText_FR, .description_LG = gDodrioPokedexText_LG, .pokemonScale = 272, .pokemonOffset = -2, .trainerScale = 296, .trainerOffset = 1, }, [NATIONAL_DEX_SEEL] = { .categoryName = _("SEA LION"), .height = 11, .weight = 900, .description_FR = gSeelPokedexText_FR, .description_LG = gSeelPokedexText_LG, .pokemonScale = 298, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DEWGONG] = { .categoryName = _("SEA LION"), .height = 17, .weight = 1200, .description_FR = gDewgongPokedexText_FR, .description_LG = gDewgongPokedexText_LG, .pokemonScale = 288, .pokemonOffset = 1, .trainerScale = 306, .trainerOffset = -1, }, [NATIONAL_DEX_GRIMER] = { .categoryName = _("SLUDGE"), .height = 9, .weight = 300, .description_FR = gGrimerPokedexText_FR, .description_LG = gGrimerPokedexText_LG, .pokemonScale = 258, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MUK] = { .categoryName = _("SLUDGE"), .height = 12, .weight = 300, .description_FR = gMukPokedexText_FR, .description_LG = gMukPokedexText_LG, .pokemonScale = 288, .pokemonOffset = 7, .trainerScale = 288, .trainerOffset = -1, }, [NATIONAL_DEX_SHELLDER] = { .categoryName = _("BIVALVE"), .height = 3, .weight = 40, .description_FR = gShellderPokedexText_FR, .description_LG = gShellderPokedexText_LG, .pokemonScale = 643, .pokemonOffset = 21, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CLOYSTER] = { .categoryName = _("BIVALVE"), .height = 15, .weight = 1325, .description_FR = gCloysterPokedexText_FR, .description_LG = gCloysterPokedexText_LG, .pokemonScale = 264, .pokemonOffset = 0, .trainerScale = 288, .trainerOffset = -1, }, [NATIONAL_DEX_GASTLY] = { .categoryName = _("GAS"), .height = 13, .weight = 1, .description_FR = gGastlyPokedexText_FR, .description_LG = gGastlyPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HAUNTER] = { .categoryName = _("GAS"), .height = 16, .weight = 1, .description_FR = gHaunterPokedexText_FR, .description_LG = gHaunterPokedexText_LG, .pokemonScale = 269, .pokemonOffset = 2, .trainerScale = 308, .trainerOffset = 1, }, [NATIONAL_DEX_GENGAR] = { .categoryName = _("SHADOW"), .height = 15, .weight = 405, .description_FR = gGengarPokedexText_FR, .description_LG = gGengarPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 4, .trainerScale = 317, .trainerOffset = 1, }, [NATIONAL_DEX_ONIX] = { .categoryName = _("ROCK SNAKE"), .height = 88, .weight = 2100, .description_FR = gOnixPokedexText_FR, .description_LG = gOnixPokedexText_LG, .pokemonScale = 257, .pokemonOffset = 0, .trainerScale = 515, .trainerOffset = 12, }, [NATIONAL_DEX_DROWZEE] = { .categoryName = _("HYPNOSIS"), .height = 10, .weight = 324, .description_FR = gDrowzeePokedexText_FR, .description_LG = gDrowzeePokedexText_LG, .pokemonScale = 274, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HYPNO] = { .categoryName = _("HYPNOSIS"), .height = 16, .weight = 756, .description_FR = gHypnoPokedexText_FR, .description_LG = gHypnoPokedexText_LG, .pokemonScale = 298, .pokemonOffset = 3, .trainerScale = 310, .trainerOffset = 2, }, [NATIONAL_DEX_KRABBY] = { .categoryName = _("RIVER CRAB"), .height = 4, .weight = 65, .description_FR = gKrabbyPokedexText_FR, .description_LG = gKrabbyPokedexText_LG, .pokemonScale = 469, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_KINGLER] = { .categoryName = _("PINCER"), .height = 13, .weight = 600, .description_FR = gKinglerPokedexText_FR, .description_LG = gKinglerPokedexText_LG, .pokemonScale = 287, .pokemonOffset = 3, .trainerScale = 308, .trainerOffset = 1, }, [NATIONAL_DEX_VOLTORB] = { .categoryName = _("BALL"), .height = 5, .weight = 104, .description_FR = gVoltorbPokedexText_FR, .description_LG = gVoltorbPokedexText_LG, .pokemonScale = 364, .pokemonOffset = -8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ELECTRODE] = { .categoryName = _("BALL"), .height = 12, .weight = 666, .description_FR = gElectrodePokedexText_FR, .description_LG = gElectrodePokedexText_LG, .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_EXEGGCUTE] = { .categoryName = _("EGG"), .height = 4, .weight = 25, .description_FR = gExeggcutePokedexText_FR, .description_LG = gExeggcutePokedexText_LG, .pokemonScale = 495, .pokemonOffset = -4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_EXEGGUTOR] = { .categoryName = _("COCONUT"), .height = 20, .weight = 1200, .description_FR = gExeggutorPokedexText_FR, .description_LG = gExeggutorPokedexText_LG, .pokemonScale = 283, .pokemonOffset = 0, .trainerScale = 376, .trainerOffset = 7, }, [NATIONAL_DEX_CUBONE] = { .categoryName = _("LONELY"), .height = 4, .weight = 65, .description_FR = gCubonePokedexText_FR, .description_LG = gCubonePokedexText_LG, .pokemonScale = 545, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MAROWAK] = { .categoryName = _("BONE KEEPER"), .height = 10, .weight = 450, .description_FR = gMarowakPokedexText_FR, .description_LG = gMarowakPokedexText_LG, .pokemonScale = 293, .pokemonOffset = 12, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HITMONLEE] = { .categoryName = _("KICKING"), .height = 15, .weight = 498, .description_FR = gHitmonleePokedexText_FR, .description_LG = gHitmonleePokedexText_LG, .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 273, .trainerOffset = -2, }, [NATIONAL_DEX_HITMONCHAN] = { .categoryName = _("PUNCHING"), .height = 14, .weight = 502, .description_FR = gHitmonchanPokedexText_FR, .description_LG = gHitmonchanPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 1, .trainerScale = 264, .trainerOffset = -2, }, [NATIONAL_DEX_LICKITUNG] = { .categoryName = _("LICKING"), .height = 12, .weight = 655, .description_FR = gLickitungPokedexText_FR, .description_LG = gLickitungPokedexText_LG, .pokemonScale = 272, .pokemonOffset = 3, .trainerScale = 272, .trainerOffset = -3, }, [NATIONAL_DEX_KOFFING] = { .categoryName = _("POISON GAS"), .height = 6, .weight = 10, .description_FR = gKoffingPokedexText_FR, .description_LG = gKoffingPokedexText_LG, .pokemonScale = 369, .pokemonOffset = -1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WEEZING] = { .categoryName = _("POISON GAS"), .height = 12, .weight = 95, .description_FR = gWeezingPokedexText_FR, .description_LG = gWeezingPokedexText_LG, .pokemonScale = 321, .pokemonOffset = -1, .trainerScale = 276, .trainerOffset = -1, }, [NATIONAL_DEX_RHYHORN] = { .categoryName = _("SPIKES"), .height = 10, .weight = 1150, .description_FR = gRhyhornPokedexText_FR, .description_LG = gRhyhornPokedexText_LG, .pokemonScale = 291, .pokemonOffset = 7, .trainerScale = 276, .trainerOffset = -2, }, [NATIONAL_DEX_RHYDON] = { .categoryName = _("DRILL"), .height = 19, .weight = 1200, .description_FR = gRhydonPokedexText_FR, .description_LG = gRhydonPokedexText_LG, .pokemonScale = 272, .pokemonOffset = -1, .trainerScale = 344, .trainerOffset = 3, }, [NATIONAL_DEX_CHANSEY] = { .categoryName = _("EGG"), .height = 11, .weight = 346, .description_FR = gChanseyPokedexText_FR, .description_LG = gChanseyPokedexText_LG, .pokemonScale = 257, .pokemonOffset = 6, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TANGELA] = { .categoryName = _("VINE"), .height = 10, .weight = 350, .description_FR = gTangelaPokedexText_FR, .description_LG = gTangelaPokedexText_LG, .pokemonScale = 320, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_KANGASKHAN] = { .categoryName = _("PARENT"), .height = 22, .weight = 800, .description_FR = gKangaskhanPokedexText_FR, .description_LG = gKangaskhanPokedexText_LG, .pokemonScale = 257, .pokemonOffset = -3, .trainerScale = 349, .trainerOffset = 5, }, [NATIONAL_DEX_HORSEA] = { .categoryName = _("DRAGON"), .height = 4, .weight = 80, .description_FR = gHorseaPokedexText_FR, .description_LG = gHorseaPokedexText_LG, .pokemonScale = 399, .pokemonOffset = -1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SEADRA] = { .categoryName = _("DRAGON"), .height = 12, .weight = 250, .description_FR = gSeadraPokedexText_FR, .description_LG = gSeadraPokedexText_LG, .pokemonScale = 296, .pokemonOffset = 3, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GOLDEEN] = { .categoryName = _("GOLDFISH"), .height = 6, .weight = 150, .description_FR = gGoldeenPokedexText_FR, .description_LG = gGoldeenPokedexText_LG, .pokemonScale = 379, .pokemonOffset = 4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SEAKING] = { .categoryName = _("GOLDFISH"), .height = 13, .weight = 390, .description_FR = gSeakingPokedexText_FR, .description_LG = gSeakingPokedexText_LG, .pokemonScale = 304, .pokemonOffset = 1, .trainerScale = 288, .trainerOffset = -2, }, [NATIONAL_DEX_STARYU] = { .categoryName = _("STAR SHAPE"), .height = 8, .weight = 345, .description_FR = gStaryuPokedexText_FR, .description_LG = gStaryuPokedexText_LG, .pokemonScale = 326, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_STARMIE] = { .categoryName = _("MYSTERIOUS"), .height = 11, .weight = 800, .description_FR = gStarmiePokedexText_FR, .description_LG = gStarmiePokedexText_LG, .pokemonScale = 301, .pokemonOffset = 3, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MR_MIME] = { .categoryName = _("BARRIER"), .height = 13, .weight = 545, .description_FR = gMrmimePokedexText_FR, .description_LG = gMrmimePokedexText_LG, .pokemonScale = 258, .pokemonOffset = 4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SCYTHER] = { .categoryName = _("MANTIS"), .height = 15, .weight = 560, .description_FR = gScytherPokedexText_FR, .description_LG = gScytherPokedexText_LG, .pokemonScale = 272, .pokemonOffset = 0, .trainerScale = 293, .trainerOffset = 1, }, [NATIONAL_DEX_JYNX] = { .categoryName = _("HUMAN SHAPE"), .height = 14, .weight = 406, .description_FR = gJynxPokedexText_FR, .description_LG = gJynxPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 3, .trainerScale = 300, .trainerOffset = 1, }, [NATIONAL_DEX_ELECTABUZZ] = { .categoryName = _("ELECTRIC"), .height = 11, .weight = 300, .description_FR = gElectabuzzPokedexText_FR, .description_LG = gElectabuzzPokedexText_LG, .pokemonScale = 330, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MAGMAR] = { .categoryName = _("SPITFIRE"), .height = 13, .weight = 445, .description_FR = gMagmarPokedexText_FR, .description_LG = gMagmarPokedexText_LG, .pokemonScale = 293, .pokemonOffset = 4, .trainerScale = 272, .trainerOffset = -2, }, [NATIONAL_DEX_PINSIR] = { .categoryName = _("STAG BEETLE"), .height = 15, .weight = 550, .description_FR = gPinsirPokedexText_FR, .description_LG = gPinsirPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 1, .trainerScale = 257, .trainerOffset = -2, }, [NATIONAL_DEX_TAUROS] = { .categoryName = _("WILD BULL"), .height = 14, .weight = 884, .description_FR = gTaurosPokedexText_FR, .description_LG = gTaurosPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 2, .trainerScale = 312, .trainerOffset = 3, }, [NATIONAL_DEX_MAGIKARP] = { .categoryName = _("FISH"), .height = 9, .weight = 100, .description_FR = gMagikarpPokedexText_FR, .description_LG = gMagikarpPokedexText_LG, .pokemonScale = 317, .pokemonOffset = 4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GYARADOS] = { .categoryName = _("ATROCIOUS"), .height = 65, .weight = 2350, .description_FR = gGyaradosPokedexText_FR, .description_LG = gGyaradosPokedexText_LG, .pokemonScale = 288, .pokemonOffset = -1, .trainerScale = 512, .trainerOffset = 11, }, [NATIONAL_DEX_LAPRAS] = { .categoryName = _("TRANSPORT"), .height = 25, .weight = 2200, .description_FR = gLaprasPokedexText_FR, .description_LG = gLaprasPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 425, .trainerOffset = 8, }, [NATIONAL_DEX_DITTO] = { .categoryName = _("TRANSFORM"), .height = 3, .weight = 40, .description_FR = gDittoPokedexText_FR, .description_LG = gDittoPokedexText_LG, .pokemonScale = 602, .pokemonOffset = 21, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_EEVEE] = { .categoryName = _("EVOLUTION"), .height = 3, .weight = 65, .description_FR = gEeveePokedexText_FR, .description_LG = gEeveePokedexText_LG, .pokemonScale = 476, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_VAPOREON] = { .categoryName = _("BUBBLE JET"), .height = 10, .weight = 290, .description_FR = gVaporeonPokedexText_FR, .description_LG = gVaporeonPokedexText_LG, .pokemonScale = 316, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_JOLTEON] = { .categoryName = _("LIGHTNING"), .height = 8, .weight = 245, .description_FR = gJolteonPokedexText_FR, .description_LG = gJolteonPokedexText_LG, .pokemonScale = 283, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_FLAREON] = { .categoryName = _("FLAME"), .height = 9, .weight = 250, .description_FR = gFlareonPokedexText_FR, .description_LG = gFlareonPokedexText_LG, .pokemonScale = 302, .pokemonOffset = 11, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PORYGON] = { .categoryName = _("VIRTUAL"), .height = 8, .weight = 365, .description_FR = gPorygonPokedexText_FR, .description_LG = gPorygonPokedexText_LG, .pokemonScale = 328, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_OMANYTE] = { .categoryName = _("SPIRAL"), .height = 4, .weight = 75, .description_FR = gOmanytePokedexText_FR, .description_LG = gOmanytePokedexText_LG, .pokemonScale = 521, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_OMASTAR] = { .categoryName = _("SPIRAL"), .height = 10, .weight = 350, .description_FR = gOmastarPokedexText_FR, .description_LG = gOmastarPokedexText_LG, .pokemonScale = 307, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_KABUTO] = { .categoryName = _("SHELLFISH"), .height = 5, .weight = 115, .description_FR = gKabutoPokedexText_FR, .description_LG = gKabutoPokedexText_LG, .pokemonScale = 438, .pokemonOffset = 21, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_KABUTOPS] = { .categoryName = _("SHELLFISH"), .height = 13, .weight = 405, .description_FR = gKabutopsPokedexText_FR, .description_LG = gKabutopsPokedexText_LG, .pokemonScale = 271, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_AERODACTYL] = { .categoryName = _("FOSSIL"), .height = 18, .weight = 590, .description_FR = gAerodactylPokedexText_FR, .description_LG = gAerodactylPokedexText_LG, .pokemonScale = 275, .pokemonOffset = -1, .trainerScale = 317, .trainerOffset = 2, }, [NATIONAL_DEX_SNORLAX] = { .categoryName = _("SLEEPING"), .height = 21, .weight = 4600, .description_FR = gSnorlaxPokedexText_FR, .description_LG = gSnorlaxPokedexText_LG, .pokemonScale = 275, .pokemonOffset = 1, .trainerScale = 408, .trainerOffset = 7, }, [NATIONAL_DEX_ARTICUNO] = { .categoryName = _("FREEZE"), .height = 17, .weight = 554, .description_FR = gArticunoPokedexText_FR, .description_LG = gArticunoPokedexText_LG, .pokemonScale = 278, .pokemonOffset = 0, .trainerScale = 308, .trainerOffset = 1, }, [NATIONAL_DEX_ZAPDOS] = { .categoryName = _("ELECTRIC"), .height = 16, .weight = 526, .description_FR = gZapdosPokedexText_FR, .description_LG = gZapdosPokedexText_LG, .pokemonScale = 275, .pokemonOffset = 1, .trainerScale = 330, .trainerOffset = 3, }, [NATIONAL_DEX_MOLTRES] = { .categoryName = _("FLAME"), .height = 20, .weight = 600, .description_FR = gMoltresPokedexText_FR, .description_LG = gMoltresPokedexText_LG, .pokemonScale = 270, .pokemonOffset = 1, .trainerScale = 379, .trainerOffset = 6, }, [NATIONAL_DEX_DRATINI] = { .categoryName = _("DRAGON"), .height = 18, .weight = 33, .description_FR = gDratiniPokedexText_FR, .description_LG = gDratiniPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 8, .trainerScale = 386, .trainerOffset = 6, }, [NATIONAL_DEX_DRAGONAIR] = { .categoryName = _("DRAGON"), .height = 40, .weight = 165, .description_FR = gDragonairPokedexText_FR, .description_LG = gDragonairPokedexText_LG, .pokemonScale = 274, .pokemonOffset = 0, .trainerScale = 423, .trainerOffset = 6, }, [NATIONAL_DEX_DRAGONITE] = { .categoryName = _("DRAGON"), .height = 22, .weight = 2100, .description_FR = gDragonitePokedexText_FR, .description_LG = gDragonitePokedexText_LG, .pokemonScale = 283, .pokemonOffset = -1, .trainerScale = 342, .trainerOffset = 4, }, [NATIONAL_DEX_MEWTWO] = { .categoryName = _("GENETIC"), .height = 20, .weight = 1220, .description_FR = gMewtwoPokedexText_FR, .description_LG = gMewtwoPokedexText_LG, .pokemonScale = 276, .pokemonOffset = -1, .trainerScale = 342, .trainerOffset = 5, }, [NATIONAL_DEX_MEW] = { .categoryName = _("NEW SPECIES"), .height = 4, .weight = 40, .description_FR = gMewPokedexText_FR, .description_LG = gMewPokedexText_LG, .pokemonScale = 460, .pokemonOffset = -2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CHIKORITA] = { .categoryName = _("LEAF"), .height = 9, .weight = 64, .description_FR = gChikoritaPokedexText_FR, .description_LG = gChikoritaPokedexText_LG, .pokemonScale = 512, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BAYLEEF] = { .categoryName = _("LEAF"), .height = 12, .weight = 158, .description_FR = gBayleefPokedexText_FR, .description_LG = gBayleefPokedexText_LG, .pokemonScale = 296, .pokemonOffset = 4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MEGANIUM] = { .categoryName = _("HERB"), .height = 18, .weight = 1005, .description_FR = gMeganiumPokedexText_FR, .description_LG = gMeganiumPokedexText_LG, .pokemonScale = 286, .pokemonOffset = 0, .trainerScale = 317, .trainerOffset = 2, }, [NATIONAL_DEX_CYNDAQUIL] = { .categoryName = _("FIRE MOUSE"), .height = 5, .weight = 79, .description_FR = gCyndaquilPokedexText_FR, .description_LG = gCyndaquilPokedexText_LG, .pokemonScale = 539, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_QUILAVA] = { .categoryName = _("VOLCANO"), .height = 9, .weight = 190, .description_FR = gQuilavaPokedexText_FR, .description_LG = gQuilavaPokedexText_LG, .pokemonScale = 329, .pokemonOffset = 10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TYPHLOSION] = { .categoryName = _("VOLCANO"), .height = 17, .weight = 795, .description_FR = gTyphlosionPokedexText_FR, .description_LG = gTyphlosionPokedexText_LG, .pokemonScale = 284, .pokemonOffset = -1, .trainerScale = 287, .trainerOffset = 0, }, [NATIONAL_DEX_TOTODILE] = { .categoryName = _("BIG JAW"), .height = 6, .weight = 95, .description_FR = gTotodilePokedexText_FR, .description_LG = gTotodilePokedexText_LG, .pokemonScale = 487, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CROCONAW] = { .categoryName = _("BIG JAW"), .height = 11, .weight = 250, .description_FR = gCroconawPokedexText_FR, .description_LG = gCroconawPokedexText_LG, .pokemonScale = 378, .pokemonOffset = 11, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_FERALIGATR] = { .categoryName = _("BIG JAW"), .height = 23, .weight = 888, .description_FR = gFeraligatrPokedexText_FR, .description_LG = gFeraligatrPokedexText_LG, .pokemonScale = 282, .pokemonOffset = -1, .trainerScale = 375, .trainerOffset = 6, }, [NATIONAL_DEX_SENTRET] = { .categoryName = _("SCOUT"), .height = 8, .weight = 60, .description_FR = gSentretPokedexText_FR, .description_LG = gSentretPokedexText_LG, .pokemonScale = 439, .pokemonOffset = 12, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_FURRET] = { .categoryName = _("LONG BODY"), .height = 18, .weight = 325, .description_FR = gFurretPokedexText_FR, .description_LG = gFurretPokedexText_LG, .pokemonScale = 346, .pokemonOffset = 10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HOOTHOOT] = { .categoryName = _("OWL"), .height = 7, .weight = 212, .description_FR = gHoothootPokedexText_FR, .description_LG = gHoothootPokedexText_LG, .pokemonScale = 380, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NOCTOWL] = { .categoryName = _("OWL"), .height = 16, .weight = 408, .description_FR = gNoctowlPokedexText_FR, .description_LG = gNoctowlPokedexText_LG, .pokemonScale = 278, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LEDYBA] = { .categoryName = _("FIVE STAR"), .height = 10, .weight = 108, .description_FR = gLedybaPokedexText_FR, .description_LG = gLedybaPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LEDIAN] = { .categoryName = _("FIVE STAR"), .height = 14, .weight = 356, .description_FR = gLedianPokedexText_FR, .description_LG = gLedianPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SPINARAK] = { .categoryName = _("STRING SPIT"), .height = 5, .weight = 85, .description_FR = gSpinarakPokedexText_FR, .description_LG = gSpinarakPokedexText_LG, .pokemonScale = 414, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ARIADOS] = { .categoryName = _("LONG LEG"), .height = 11, .weight = 335, .description_FR = gAriadosPokedexText_FR, .description_LG = gAriadosPokedexText_LG, .pokemonScale = 316, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CROBAT] = { .categoryName = _("BAT"), .height = 18, .weight = 750, .description_FR = gCrobatPokedexText_FR, .description_LG = gCrobatPokedexText_LG, .pokemonScale = 279, .pokemonOffset = -1, .trainerScale = 313, .trainerOffset = 2, }, [NATIONAL_DEX_CHINCHOU] = { .categoryName = _("ANGLER"), .height = 5, .weight = 120, .description_FR = gChinchouPokedexText_FR, .description_LG = gChinchouPokedexText_LG, .pokemonScale = 424, .pokemonOffset = -2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LANTURN] = { .categoryName = _("LIGHT"), .height = 12, .weight = 225, .description_FR = gLanturnPokedexText_FR, .description_LG = gLanturnPokedexText_LG, .pokemonScale = 269, .pokemonOffset = 6, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PICHU] = { .categoryName = _("TINY MOUSE"), .height = 3, .weight = 20, .description_FR = gPichuPokedexText_FR, .description_LG = gPichuPokedexText_LG, .pokemonScale = 508, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CLEFFA] = { .categoryName = _("STAR SHAPE"), .height = 3, .weight = 30, .description_FR = gCleffaPokedexText_FR, .description_LG = gCleffaPokedexText_LG, .pokemonScale = 462, .pokemonOffset = 22, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_IGGLYBUFF] = { .categoryName = _("BALLOON"), .height = 3, .weight = 10, .description_FR = gIgglybuffPokedexText_FR, .description_LG = gIgglybuffPokedexText_LG, .pokemonScale = 457, .pokemonOffset = -1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TOGEPI] = { .categoryName = _("SPIKE BALL"), .height = 3, .weight = 15, .description_FR = gTogepiPokedexText_FR, .description_LG = gTogepiPokedexText_LG, .pokemonScale = 507, .pokemonOffset = 21, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TOGETIC] = { .categoryName = _("HAPPINESS"), .height = 6, .weight = 32, .description_FR = gTogeticPokedexText_FR, .description_LG = gTogeticPokedexText_LG, .pokemonScale = 424, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NATU] = { .categoryName = _("TINY BIRD"), .height = 2, .weight = 20, .description_FR = gNatuPokedexText_FR, .description_LG = gNatuPokedexText_LG, .pokemonScale = 610, .pokemonOffset = 23, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_XATU] = { .categoryName = _("MYSTIC"), .height = 15, .weight = 150, .description_FR = gXatuPokedexText_FR, .description_LG = gXatuPokedexText_LG, .pokemonScale = 258, .pokemonOffset = 4, .trainerScale = 317, .trainerOffset = 3, }, [NATIONAL_DEX_MAREEP] = { .categoryName = _("WOOL"), .height = 6, .weight = 78, .description_FR = gMareepPokedexText_FR, .description_LG = gMareepPokedexText_LG, .pokemonScale = 379, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_FLAAFFY] = { .categoryName = _("WOOL"), .height = 8, .weight = 133, .description_FR = gFlaaffyPokedexText_FR, .description_LG = gFlaaffyPokedexText_LG, .pokemonScale = 372, .pokemonOffset = 13, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_AMPHAROS] = { .categoryName = _("LIGHT"), .height = 14, .weight = 615, .description_FR = gAmpharosPokedexText_FR, .description_LG = gAmpharosPokedexText_LG, .pokemonScale = 275, .pokemonOffset = 2, .trainerScale = 283, .trainerOffset = -1, }, [NATIONAL_DEX_BELLOSSOM] = { .categoryName = _("FLOWER"), .height = 4, .weight = 58, .description_FR = gBellossomPokedexText_FR, .description_LG = gBellossomPokedexText_LG, .pokemonScale = 472, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MARILL] = { .categoryName = _("AQUA MOUSE"), .height = 4, .weight = 85, .description_FR = gMarillPokedexText_FR, .description_LG = gMarillPokedexText_LG, .pokemonScale = 476, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_AZUMARILL] = { .categoryName = _("AQUA RABBIT"), .height = 8, .weight = 285, .description_FR = gAzumarillPokedexText_FR, .description_LG = gAzumarillPokedexText_LG, .pokemonScale = 448, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SUDOWOODO] = { .categoryName = _("IMITATION"), .height = 12, .weight = 380, .description_FR = gSudowoodoPokedexText_FR, .description_LG = gSudowoodoPokedexText_LG, .pokemonScale = 305, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_POLITOED] = { .categoryName = _("FROG"), .height = 11, .weight = 339, .description_FR = gPolitoedPokedexText_FR, .description_LG = gPolitoedPokedexText_LG, .pokemonScale = 289, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HOPPIP] = { .categoryName = _("COTTONWEED"), .height = 4, .weight = 5, .description_FR = gHoppipPokedexText_FR, .description_LG = gHoppipPokedexText_LG, .pokemonScale = 562, .pokemonOffset = -7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SKIPLOOM] = { .categoryName = _("COTTONWEED"), .height = 6, .weight = 10, .description_FR = gSkiploomPokedexText_FR, .description_LG = gSkiploomPokedexText_LG, .pokemonScale = 387, .pokemonOffset = 0, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_JUMPLUFF] = { .categoryName = _("COTTONWEED"), .height = 8, .weight = 30, .description_FR = gJumpluffPokedexText_FR, .description_LG = gJumpluffPokedexText_LG, .pokemonScale = 418, .pokemonOffset = -4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_AIPOM] = { .categoryName = _("LONG TAIL"), .height = 8, .weight = 115, .description_FR = gAipomPokedexText_FR, .description_LG = gAipomPokedexText_LG, .pokemonScale = 363, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SUNKERN] = { .categoryName = _("SEED"), .height = 3, .weight = 18, .description_FR = gSunkernPokedexText_FR, .description_LG = gSunkernPokedexText_LG, .pokemonScale = 541, .pokemonOffset = 0, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SUNFLORA] = { .categoryName = _("SUN"), .height = 8, .weight = 85, .description_FR = gSunfloraPokedexText_FR, .description_LG = gSunfloraPokedexText_LG, .pokemonScale = 374, .pokemonOffset = 12, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_YANMA] = { .categoryName = _("CLEAR WING"), .height = 12, .weight = 380, .description_FR = gYanmaPokedexText_FR, .description_LG = gYanmaPokedexText_LG, .pokemonScale = 274, .pokemonOffset = -4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WOOPER] = { .categoryName = _("WATER FISH"), .height = 4, .weight = 85, .description_FR = gWooperPokedexText_FR, .description_LG = gWooperPokedexText_LG, .pokemonScale = 479, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_QUAGSIRE] = { .categoryName = _("WATER FISH"), .height = 14, .weight = 750, .description_FR = gQuagsirePokedexText_FR, .description_LG = gQuagsirePokedexText_LG, .pokemonScale = 273, .pokemonOffset = 4, .trainerScale = 273, .trainerOffset = -2, }, [NATIONAL_DEX_ESPEON] = { .categoryName = _("SUN"), .height = 9, .weight = 265, .description_FR = gEspeonPokedexText_FR, .description_LG = gEspeonPokedexText_LG, .pokemonScale = 363, .pokemonOffset = 12, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_UMBREON] = { .categoryName = _("MOONLIGHT"), .height = 10, .weight = 270, .description_FR = gUmbreonPokedexText_FR, .description_LG = gUmbreonPokedexText_LG, .pokemonScale = 317, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MURKROW] = { .categoryName = _("DARKNESS"), .height = 5, .weight = 21, .description_FR = gMurkrowPokedexText_FR, .description_LG = gMurkrowPokedexText_LG, .pokemonScale = 401, .pokemonOffset = -8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SLOWKING] = { .categoryName = _("ROYAL"), .height = 20, .weight = 795, .description_FR = gSlowkingPokedexText_FR, .description_LG = gSlowkingPokedexText_LG, .pokemonScale = 265, .pokemonOffset = -1, .trainerScale = 330, .trainerOffset = 4, }, [NATIONAL_DEX_MISDREAVUS] = { .categoryName = _("SCREECH"), .height = 7, .weight = 10, .description_FR = gMisdreavusPokedexText_FR, .description_LG = gMisdreavusPokedexText_LG, .pokemonScale = 407, .pokemonOffset = -8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_UNOWN] = { .categoryName = _("SYMBOL"), .height = 5, .weight = 50, .description_FR = gUnownPokedexText_FR, .description_LG = gUnownPokedexText_LG, .pokemonScale = 411, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WOBBUFFET] = { .categoryName = _("PATIENT"), .height = 13, .weight = 285, .description_FR = gWobbuffetPokedexText_FR, .description_LG = gWobbuffetPokedexText_LG, .pokemonScale = 274, .pokemonOffset = 4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GIRAFARIG] = { .categoryName = _("LONG NECK"), .height = 15, .weight = 415, .description_FR = gGirafarigPokedexText_FR, .description_LG = gGirafarigPokedexText_LG, .pokemonScale = 281, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PINECO] = { .categoryName = _("BAGWORM"), .height = 6, .weight = 72, .description_FR = gPinecoPokedexText_FR, .description_LG = gPinecoPokedexText_LG, .pokemonScale = 445, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_FORRETRESS] = { .categoryName = _("BAGWORM"), .height = 12, .weight = 1258, .description_FR = gForretressPokedexText_FR, .description_LG = gForretressPokedexText_LG, .pokemonScale = 293, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DUNSPARCE] = { .categoryName = _("LAND SNAKE"), .height = 15, .weight = 140, .description_FR = gDunsparcePokedexText_FR, .description_LG = gDunsparcePokedexText_LG, .pokemonScale = 284, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GLIGAR] = { .categoryName = _("FLYSCORPION"), .height = 11, .weight = 648, .description_FR = gGligarPokedexText_FR, .description_LG = gGligarPokedexText_LG, .pokemonScale = 350, .pokemonOffset = -1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_STEELIX] = { .categoryName = _("IRON SNAKE"), .height = 92, .weight = 4000, .description_FR = gSteelixPokedexText_FR, .description_LG = gSteelixPokedexText_LG, .pokemonScale = 278, .pokemonOffset = -1, .trainerScale = 557, .trainerOffset = 13, }, [NATIONAL_DEX_SNUBBULL] = { .categoryName = _("FAIRY"), .height = 6, .weight = 78, .description_FR = gSnubbullPokedexText_FR, .description_LG = gSnubbullPokedexText_LG, .pokemonScale = 465, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GRANBULL] = { .categoryName = _("FAIRY"), .height = 14, .weight = 487, .description_FR = gGranbullPokedexText_FR, .description_LG = gGranbullPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 3, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_QWILFISH] = { .categoryName = _("BALLOON"), .height = 5, .weight = 39, .description_FR = gQwilfishPokedexText_FR, .description_LG = gQwilfishPokedexText_LG, .pokemonScale = 430, .pokemonOffset = 0, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SCIZOR] = { .categoryName = _("PINCER"), .height = 18, .weight = 1180, .description_FR = gScizorPokedexText_FR, .description_LG = gScizorPokedexText_LG, .pokemonScale = 282, .pokemonOffset = 0, .trainerScale = 282, .trainerOffset = 0, }, [NATIONAL_DEX_SHUCKLE] = { .categoryName = _("MOLD"), .height = 6, .weight = 205, .description_FR = gShucklePokedexText_FR, .description_LG = gShucklePokedexText_LG, .pokemonScale = 485, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HERACROSS] = { .categoryName = _("SINGLE HORN"), .height = 15, .weight = 540, .description_FR = gHeracrossPokedexText_FR, .description_LG = gHeracrossPokedexText_LG, .pokemonScale = 285, .pokemonOffset = 0, .trainerScale = 283, .trainerOffset = -2, }, [NATIONAL_DEX_SNEASEL] = { .categoryName = _("SHARP CLAW"), .height = 9, .weight = 280, .description_FR = gSneaselPokedexText_FR, .description_LG = gSneaselPokedexText_LG, .pokemonScale = 413, .pokemonOffset = -3, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TEDDIURSA] = { .categoryName = _("LITTLE BEAR"), .height = 6, .weight = 88, .description_FR = gTeddiursaPokedexText_FR, .description_LG = gTeddiursaPokedexText_LG, .pokemonScale = 455, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_URSARING] = { .categoryName = _("HIBERNATOR"), .height = 18, .weight = 1258, .description_FR = gUrsaringPokedexText_FR, .description_LG = gUrsaringPokedexText_LG, .pokemonScale = 275, .pokemonOffset = 0, .trainerScale = 280, .trainerOffset = 0, }, [NATIONAL_DEX_SLUGMA] = { .categoryName = _("LAVA"), .height = 7, .weight = 350, .description_FR = gSlugmaPokedexText_FR, .description_LG = gSlugmaPokedexText_LG, .pokemonScale = 329, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MAGCARGO] = { .categoryName = _("LAVA"), .height = 8, .weight = 550, .description_FR = gMagcargoPokedexText_FR, .description_LG = gMagcargoPokedexText_LG, .pokemonScale = 332, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SWINUB] = { .categoryName = _("PIG"), .height = 4, .weight = 65, .description_FR = gSwinubPokedexText_FR, .description_LG = gSwinubPokedexText_LG, .pokemonScale = 324, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PILOSWINE] = { .categoryName = _("SWINE"), .height = 11, .weight = 558, .description_FR = gPiloswinePokedexText_FR, .description_LG = gPiloswinePokedexText_LG, .pokemonScale = 306, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CORSOLA] = { .categoryName = _("CORAL"), .height = 6, .weight = 50, .description_FR = gCorsolaPokedexText_FR, .description_LG = gCorsolaPokedexText_LG, .pokemonScale = 410, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_REMORAID] = { .categoryName = _("JET"), .height = 6, .weight = 120, .description_FR = gRemoraidPokedexText_FR, .description_LG = gRemoraidPokedexText_LG, .pokemonScale = 316, .pokemonOffset = 4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_OCTILLERY] = { .categoryName = _("JET"), .height = 9, .weight = 285, .description_FR = gOctilleryPokedexText_FR, .description_LG = gOctilleryPokedexText_LG, .pokemonScale = 296, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DELIBIRD] = { .categoryName = _("DELIVERY"), .height = 9, .weight = 160, .description_FR = gDelibirdPokedexText_FR, .description_LG = gDelibirdPokedexText_LG, .pokemonScale = 293, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MANTINE] = { .categoryName = _("KITE"), .height = 21, .weight = 2200, .description_FR = gMantinePokedexText_FR, .description_LG = gMantinePokedexText_LG, .pokemonScale = 275, .pokemonOffset = 0, .trainerScale = 360, .trainerOffset = 6, }, [NATIONAL_DEX_SKARMORY] = { .categoryName = _("ARMOR BIRD"), .height = 17, .weight = 505, .description_FR = gSkarmoryPokedexText_FR, .description_LG = gSkarmoryPokedexText_LG, .pokemonScale = 285, .pokemonOffset = 0, .trainerScale = 276, .trainerOffset = 0, }, [NATIONAL_DEX_HOUNDOUR] = { .categoryName = _("DARK"), .height = 6, .weight = 108, .description_FR = gHoundourPokedexText_FR, .description_LG = gHoundourPokedexText_LG, .pokemonScale = 393, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HOUNDOOM] = { .categoryName = _("DARK"), .height = 14, .weight = 350, .description_FR = gHoundoomPokedexText_FR, .description_LG = gHoundoomPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_KINGDRA] = { .categoryName = _("DRAGON"), .height = 18, .weight = 1520, .description_FR = gKingdraPokedexText_FR, .description_LG = gKingdraPokedexText_LG, .pokemonScale = 257, .pokemonOffset = 1, .trainerScale = 293, .trainerOffset = 1, }, [NATIONAL_DEX_PHANPY] = { .categoryName = _("LONG NOSE"), .height = 5, .weight = 335, .description_FR = gPhanpyPokedexText_FR, .description_LG = gPhanpyPokedexText_LG, .pokemonScale = 465, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DONPHAN] = { .categoryName = _("ARMOR"), .height = 11, .weight = 1200, .description_FR = gDonphanPokedexText_FR, .description_LG = gDonphanPokedexText_LG, .pokemonScale = 313, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PORYGON2] = { .categoryName = _("VIRTUAL"), .height = 6, .weight = 325, .description_FR = gPorygon2PokedexText_FR, .description_LG = gPorygon2PokedexText_LG, .pokemonScale = 320, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_STANTLER] = { .categoryName = _("BIG HORN"), .height = 14, .weight = 712, .description_FR = gStantlerPokedexText_FR, .description_LG = gStantlerPokedexText_LG, .pokemonScale = 277, .pokemonOffset = -1, .trainerScale = 277, .trainerOffset = 0, }, [NATIONAL_DEX_SMEARGLE] = { .categoryName = _("PAINTER"), .height = 12, .weight = 580, .description_FR = gSmearglePokedexText_FR, .description_LG = gSmearglePokedexText_LG, .pokemonScale = 287, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TYROGUE] = { .categoryName = _("SCUFFLE"), .height = 7, .weight = 210, .description_FR = gTyroguePokedexText_FR, .description_LG = gTyroguePokedexText_LG, .pokemonScale = 292, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HITMONTOP] = { .categoryName = _("HANDSTAND"), .height = 14, .weight = 480, .description_FR = gHitmontopPokedexText_FR, .description_LG = gHitmontopPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 2, .trainerScale = 257, .trainerOffset = -2, }, [NATIONAL_DEX_SMOOCHUM] = { .categoryName = _("KISS"), .height = 4, .weight = 60, .description_FR = gSmoochumPokedexText_FR, .description_LG = gSmoochumPokedexText_LG, .pokemonScale = 440, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ELEKID] = { .categoryName = _("ELECTRIC"), .height = 6, .weight = 235, .description_FR = gElekidPokedexText_FR, .description_LG = gElekidPokedexText_LG, .pokemonScale = 363, .pokemonOffset = 13, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MAGBY] = { .categoryName = _("LIVE COAL"), .height = 7, .weight = 214, .description_FR = gMagbyPokedexText_FR, .description_LG = gMagbyPokedexText_LG, .pokemonScale = 284, .pokemonOffset = 11, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MILTANK] = { .categoryName = _("MILK COW"), .height = 12, .weight = 755, .description_FR = gMiltankPokedexText_FR, .description_LG = gMiltankPokedexText_LG, .pokemonScale = 280, .pokemonOffset = 3, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BLISSEY] = { .categoryName = _("HAPPINESS"), .height = 15, .weight = 468, .description_FR = gBlisseyPokedexText_FR, .description_LG = gBlisseyPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 3, .trainerScale = 310, .trainerOffset = 3, }, [NATIONAL_DEX_RAIKOU] = { .categoryName = _("THUNDER"), .height = 19, .weight = 1780, .description_FR = gRaikouPokedexText_FR, .description_LG = gRaikouPokedexText_LG, .pokemonScale = 283, .pokemonOffset = 0, .trainerScale = 359, .trainerOffset = 6, }, [NATIONAL_DEX_ENTEI] = { .categoryName = _("VOLCANO"), .height = 21, .weight = 1980, .description_FR = gEnteiPokedexText_FR, .description_LG = gEnteiPokedexText_LG, .pokemonScale = 283, .pokemonOffset = 0, .trainerScale = 370, .trainerOffset = 7, }, [NATIONAL_DEX_SUICUNE] = { .categoryName = _("AURORA"), .height = 20, .weight = 1870, .description_FR = gSuicunePokedexText_FR, .description_LG = gSuicunePokedexText_LG, .pokemonScale = 286, .pokemonOffset = 0, .trainerScale = 371, .trainerOffset = 7, }, [NATIONAL_DEX_LARVITAR] = { .categoryName = _("ROCK SKIN"), .height = 6, .weight = 720, .description_FR = gLarvitarPokedexText_FR, .description_LG = gLarvitarPokedexText_LG, .pokemonScale = 472, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PUPITAR] = { .categoryName = _("HARD SHELL"), .height = 12, .weight = 1520, .description_FR = gPupitarPokedexText_FR, .description_LG = gPupitarPokedexText_LG, .pokemonScale = 292, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TYRANITAR] = { .categoryName = _("ARMOR"), .height = 20, .weight = 2020, .description_FR = gTyranitarPokedexText_FR, .description_LG = gTyranitarPokedexText_LG, .pokemonScale = 285, .pokemonOffset = 0, .trainerScale = 383, .trainerOffset = 7, }, [NATIONAL_DEX_LUGIA] = { .categoryName = _("DIVING"), .height = 52, .weight = 2160, .description_FR = gLugiaPokedexText_FR, .description_LG = gLugiaPokedexText_LG, .pokemonScale = 283, .pokemonOffset = 0, .trainerScale = 742, .trainerOffset = 18, }, [NATIONAL_DEX_HO_OH] = { .categoryName = _("RAINBOW"), .height = 38, .weight = 1990, .description_FR = gHoOhPokedexText_FR, .description_LG = gHoOhPokedexText_LG, .pokemonScale = 283, .pokemonOffset = 0, .trainerScale = 620, .trainerOffset = 16, }, [NATIONAL_DEX_CELEBI] = { .categoryName = _("TIME TRAVEL"), .height = 6, .weight = 50, .description_FR = gCelebiPokedexText_FR, .description_LG = gCelebiPokedexText_LG, .pokemonScale = 393, .pokemonOffset = -10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TREECKO] = { .categoryName = _("WOOD GECKO"), .height = 5, .weight = 50, .description_FR = gTreeckoPokedexText_FR, .description_LG = gTreeckoPokedexText_LG, .pokemonScale = 541, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GROVYLE] = { .categoryName = _("WOOD GECKO"), .height = 9, .weight = 216, .description_FR = gGrovylePokedexText_FR, .description_LG = gGrovylePokedexText_LG, .pokemonScale = 360, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SCEPTILE] = { .categoryName = _("FOREST"), .height = 17, .weight = 522, .description_FR = gSceptilePokedexText_FR, .description_LG = gSceptilePokedexText_LG, .pokemonScale = 282, .pokemonOffset = -1, .trainerScale = 313, .trainerOffset = 3, }, [NATIONAL_DEX_TORCHIC] = { .categoryName = _("CHICK"), .height = 4, .weight = 25, .description_FR = gTorchicPokedexText_FR, .description_LG = gTorchicPokedexText_LG, .pokemonScale = 566, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_COMBUSKEN] = { .categoryName = _("YOUNG FOWL"), .height = 9, .weight = 195, .description_FR = gCombuskenPokedexText_FR, .description_LG = gCombuskenPokedexText_LG, .pokemonScale = 343, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BLAZIKEN] = { .categoryName = _("BLAZE"), .height = 19, .weight = 520, .description_FR = gBlazikenPokedexText_FR, .description_LG = gBlazikenPokedexText_LG, .pokemonScale = 275, .pokemonOffset = -1, .trainerScale = 314, .trainerOffset = 3, }, [NATIONAL_DEX_MUDKIP] = { .categoryName = _("MUD FISH"), .height = 4, .weight = 76, .description_FR = gMudkipPokedexText_FR, .description_LG = gMudkipPokedexText_LG, .pokemonScale = 535, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MARSHTOMP] = { .categoryName = _("MUD FISH"), .height = 7, .weight = 280, .description_FR = gMarshtompPokedexText_FR, .description_LG = gMarshtompPokedexText_LG, .pokemonScale = 340, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SWAMPERT] = { .categoryName = _("MUD FISH"), .height = 15, .weight = 819, .description_FR = gSwampertPokedexText_FR, .description_LG = gSwampertPokedexText_LG, .pokemonScale = 276, .pokemonOffset = -1, .trainerScale = 282, .trainerOffset = -2, }, [NATIONAL_DEX_POOCHYENA] = { .categoryName = _("BITE"), .height = 5, .weight = 136, .description_FR = gPoochyenaPokedexText_FR, .description_LG = gPoochyenaPokedexText_LG, .pokemonScale = 481, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MIGHTYENA] = { .categoryName = _("BITE"), .height = 10, .weight = 370, .description_FR = gMightyenaPokedexText_FR, .description_LG = gMightyenaPokedexText_LG, .pokemonScale = 359, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ZIGZAGOON] = { .categoryName = _("TINYRACCOON"), .height = 4, .weight = 175, .description_FR = gZigzagoonPokedexText_FR, .description_LG = gZigzagoonPokedexText_LG, .pokemonScale = 560, .pokemonOffset = 21, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LINOONE] = { .categoryName = _("RUSHING"), .height = 5, .weight = 325, .description_FR = gLinoonePokedexText_FR, .description_LG = gLinoonePokedexText_LG, .pokemonScale = 321, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WURMPLE] = { .categoryName = _("WORM"), .height = 3, .weight = 36, .description_FR = gWurmplePokedexText_FR, .description_LG = gWurmplePokedexText_LG, .pokemonScale = 711, .pokemonOffset = 22, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SILCOON] = { .categoryName = _("COCOON"), .height = 6, .weight = 100, .description_FR = gSilcoonPokedexText_FR, .description_LG = gSilcoonPokedexText_LG, .pokemonScale = 431, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BEAUTIFLY] = { .categoryName = _("BUTTERFLY"), .height = 10, .weight = 284, .description_FR = gBeautiflyPokedexText_FR, .description_LG = gBeautiflyPokedexText_LG, .pokemonScale = 298, .pokemonOffset = -1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CASCOON] = { .categoryName = _("COCOON"), .height = 7, .weight = 115, .description_FR = gCascoonPokedexText_FR, .description_LG = gCascoonPokedexText_LG, .pokemonScale = 391, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DUSTOX] = { .categoryName = _("POISON MOTH"), .height = 12, .weight = 316, .description_FR = gDustoxPokedexText_FR, .description_LG = gDustoxPokedexText_LG, .pokemonScale = 269, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LOTAD] = { .categoryName = _("WATER WEED"), .height = 5, .weight = 26, .description_FR = gLotadPokedexText_FR, .description_LG = gLotadPokedexText_LG, .pokemonScale = 406, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LOMBRE] = { .categoryName = _("JOLLY"), .height = 12, .weight = 325, .description_FR = gLombrePokedexText_FR, .description_LG = gLombrePokedexText_LG, .pokemonScale = 277, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LUDICOLO] = { .categoryName = _("CAREFREE"), .height = 15, .weight = 550, .description_FR = gLudicoloPokedexText_FR, .description_LG = gLudicoloPokedexText_LG, .pokemonScale = 283, .pokemonOffset = 0, .trainerScale = 282, .trainerOffset = 0, }, [NATIONAL_DEX_SEEDOT] = { .categoryName = _("ACORN"), .height = 5, .weight = 40, .description_FR = gSeedotPokedexText_FR, .description_LG = gSeedotPokedexText_LG, .pokemonScale = 472, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NUZLEAF] = { .categoryName = _("WILY"), .height = 10, .weight = 280, .description_FR = gNuzleafPokedexText_FR, .description_LG = gNuzleafPokedexText_LG, .pokemonScale = 299, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SHIFTRY] = { .categoryName = _("WICKED"), .height = 13, .weight = 596, .description_FR = gShiftryPokedexText_FR, .description_LG = gShiftryPokedexText_LG, .pokemonScale = 290, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TAILLOW] = { .categoryName = _("TINYSWALLOW"), .height = 3, .weight = 23, .description_FR = gTaillowPokedexText_FR, .description_LG = gTaillowPokedexText_LG, .pokemonScale = 465, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SWELLOW] = { .categoryName = _("SWALLOW"), .height = 7, .weight = 198, .description_FR = gSwellowPokedexText_FR, .description_LG = gSwellowPokedexText_LG, .pokemonScale = 428, .pokemonOffset = 13, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WINGULL] = { .categoryName = _("SEAGULL"), .height = 6, .weight = 95, .description_FR = gWingullPokedexText_FR, .description_LG = gWingullPokedexText_LG, .pokemonScale = 295, .pokemonOffset = -2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_PELIPPER] = { .categoryName = _("WATER BIRD"), .height = 12, .weight = 280, .description_FR = gPelipperPokedexText_FR, .description_LG = gPelipperPokedexText_LG, .pokemonScale = 288, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_RALTS] = { .categoryName = _("FEELING"), .height = 4, .weight = 66, .description_FR = gRaltsPokedexText_FR, .description_LG = gRaltsPokedexText_LG, .pokemonScale = 457, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_KIRLIA] = { .categoryName = _("EMOTION"), .height = 8, .weight = 202, .description_FR = gKirliaPokedexText_FR, .description_LG = gKirliaPokedexText_LG, .pokemonScale = 354, .pokemonOffset = 10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GARDEVOIR] = { .categoryName = _("EMBRACE"), .height = 16, .weight = 484, .description_FR = gGardevoirPokedexText_FR, .description_LG = gGardevoirPokedexText_LG, .pokemonScale = 277, .pokemonOffset = 0, .trainerScale = 276, .trainerOffset = -1, }, [NATIONAL_DEX_SURSKIT] = { .categoryName = _("POND SKATER"), .height = 5, .weight = 17, .description_FR = gSurskitPokedexText_FR, .description_LG = gSurskitPokedexText_LG, .pokemonScale = 375, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MASQUERAIN] = { .categoryName = _("EYEBALL"), .height = 8, .weight = 36, .description_FR = gMasquerainPokedexText_FR, .description_LG = gMasquerainPokedexText_LG, .pokemonScale = 378, .pokemonOffset = -1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SHROOMISH] = { .categoryName = _("MUSHROOM"), .height = 4, .weight = 45, .description_FR = gShroomishPokedexText_FR, .description_LG = gShroomishPokedexText_LG, .pokemonScale = 513, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BRELOOM] = { .categoryName = _("MUSHROOM"), .height = 12, .weight = 392, .description_FR = gBreloomPokedexText_FR, .description_LG = gBreloomPokedexText_LG, .pokemonScale = 324, .pokemonOffset = 6, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SLAKOTH] = { .categoryName = _("SLACKER"), .height = 8, .weight = 240, .description_FR = gSlakothPokedexText_FR, .description_LG = gSlakothPokedexText_LG, .pokemonScale = 291, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_VIGOROTH] = { .categoryName = _("WILD MONKEY"), .height = 14, .weight = 465, .description_FR = gVigorothPokedexText_FR, .description_LG = gVigorothPokedexText_LG, .pokemonScale = 301, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SLAKING] = { .categoryName = _("LAZY"), .height = 20, .weight = 1305, .description_FR = gSlakingPokedexText_FR, .description_LG = gSlakingPokedexText_LG, .pokemonScale = 277, .pokemonOffset = 5, .trainerScale = 326, .trainerOffset = 3, }, [NATIONAL_DEX_NINCADA] = { .categoryName = _("TRAINEE"), .height = 5, .weight = 55, .description_FR = gNincadaPokedexText_FR, .description_LG = gNincadaPokedexText_LG, .pokemonScale = 405, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NINJASK] = { .categoryName = _("NINJA"), .height = 8, .weight = 120, .description_FR = gNinjaskPokedexText_FR, .description_LG = gNinjaskPokedexText_LG, .pokemonScale = 383, .pokemonOffset = -9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SHEDINJA] = { .categoryName = _("SHED"), .height = 8, .weight = 12, .description_FR = gShedinjaPokedexText_FR, .description_LG = gShedinjaPokedexText_LG, .pokemonScale = 372, .pokemonOffset = -8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WHISMUR] = { .categoryName = _("WHISPER"), .height = 6, .weight = 163, .description_FR = gWhismurPokedexText_FR, .description_LG = gWhismurPokedexText_LG, .pokemonScale = 373, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LOUDRED] = { .categoryName = _("BIG VOICE"), .height = 10, .weight = 405, .description_FR = gLoudredPokedexText_FR, .description_LG = gLoudredPokedexText_LG, .pokemonScale = 356, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_EXPLOUD] = { .categoryName = _("LOUD NOISE"), .height = 15, .weight = 840, .description_FR = gExploudPokedexText_FR, .description_LG = gExploudPokedexText_LG, .pokemonScale = 284, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MAKUHITA] = { .categoryName = _("GUTS"), .height = 10, .weight = 864, .description_FR = gMakuhitaPokedexText_FR, .description_LG = gMakuhitaPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HARIYAMA] = { .categoryName = _("ARM THRUST"), .height = 23, .weight = 2538, .description_FR = gHariyamaPokedexText_FR, .description_LG = gHariyamaPokedexText_LG, .pokemonScale = 268, .pokemonOffset = -1, .trainerScale = 375, .trainerOffset = 6, }, [NATIONAL_DEX_AZURILL] = { .categoryName = _("POLKA DOT"), .height = 2, .weight = 20, .description_FR = gAzurillPokedexText_FR, .description_LG = gAzurillPokedexText_LG, .pokemonScale = 603, .pokemonOffset = 21, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_NOSEPASS] = { .categoryName = _("COMPASS"), .height = 10, .weight = 970, .description_FR = gNosepassPokedexText_FR, .description_LG = gNosepassPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 9, .trainerScale = 289, .trainerOffset = 1, }, [NATIONAL_DEX_SKITTY] = { .categoryName = _("KITTEN"), .height = 6, .weight = 110, .description_FR = gSkittyPokedexText_FR, .description_LG = gSkittyPokedexText_LG, .pokemonScale = 492, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DELCATTY] = { .categoryName = _("PRIM"), .height = 11, .weight = 326, .description_FR = gDelcattyPokedexText_FR, .description_LG = gDelcattyPokedexText_LG, .pokemonScale = 322, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SABLEYE] = { .categoryName = _("DARKNESS"), .height = 5, .weight = 110, .description_FR = gSableyePokedexText_FR, .description_LG = gSableyePokedexText_LG, .pokemonScale = 451, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MAWILE] = { .categoryName = _("DECEIVER"), .height = 6, .weight = 115, .description_FR = gMawilePokedexText_FR, .description_LG = gMawilePokedexText_LG, .pokemonScale = 466, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -3, }, [NATIONAL_DEX_ARON] = { .categoryName = _("IRON ARMOR"), .height = 4, .weight = 600, .description_FR = gAronPokedexText_FR, .description_LG = gAronPokedexText_LG, .pokemonScale = 419, .pokemonOffset = 21, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LAIRON] = { .categoryName = _("IRON ARMOR"), .height = 9, .weight = 1200, .description_FR = gLaironPokedexText_FR, .description_LG = gLaironPokedexText_LG, .pokemonScale = 275, .pokemonOffset = 11, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_AGGRON] = { .categoryName = _("IRON ARMOR"), .height = 21, .weight = 3600, .description_FR = gAggronPokedexText_FR, .description_LG = gAggronPokedexText_LG, .pokemonScale = 274, .pokemonOffset = -1, .trainerScale = 374, .trainerOffset = 7, }, [NATIONAL_DEX_MEDITITE] = { .categoryName = _("MEDITATE"), .height = 6, .weight = 112, .description_FR = gMedititePokedexText_FR, .description_LG = gMedititePokedexText_LG, .pokemonScale = 465, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MEDICHAM] = { .categoryName = _("MEDITATE"), .height = 13, .weight = 315, .description_FR = gMedichamPokedexText_FR, .description_LG = gMedichamPokedexText_LG, .pokemonScale = 298, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ELECTRIKE] = { .categoryName = _("LIGHTNING"), .height = 6, .weight = 152, .description_FR = gElectrikePokedexText_FR, .description_LG = gElectrikePokedexText_LG, .pokemonScale = 290, .pokemonOffset = 16, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MANECTRIC] = { .categoryName = _("DISCHARGE"), .height = 15, .weight = 402, .description_FR = gManectricPokedexText_FR, .description_LG = gManectricPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 1, .trainerScale = 257, .trainerOffset = -2, }, [NATIONAL_DEX_PLUSLE] = { .categoryName = _("CHEERING"), .height = 4, .weight = 42, .description_FR = gPluslePokedexText_FR, .description_LG = gPluslePokedexText_LG, .pokemonScale = 515, .pokemonOffset = -9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MINUN] = { .categoryName = _("CHEERING"), .height = 4, .weight = 42, .description_FR = gMinunPokedexText_FR, .description_LG = gMinunPokedexText_LG, .pokemonScale = 512, .pokemonOffset = -7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_VOLBEAT] = { .categoryName = _("FIREFLY"), .height = 7, .weight = 177, .description_FR = gVolbeatPokedexText_FR, .description_LG = gVolbeatPokedexText_LG, .pokemonScale = 442, .pokemonOffset = -4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ILLUMISE] = { .categoryName = _("FIREFLY"), .height = 6, .weight = 177, .description_FR = gIllumisePokedexText_FR, .description_LG = gIllumisePokedexText_LG, .pokemonScale = 572, .pokemonOffset = -4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ROSELIA] = { .categoryName = _("THORN"), .height = 3, .weight = 20, .description_FR = gRoseliaPokedexText_FR, .description_LG = gRoseliaPokedexText_LG, .pokemonScale = 677, .pokemonOffset = 20, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GULPIN] = { .categoryName = _("STOMACH"), .height = 4, .weight = 103, .description_FR = gGulpinPokedexText_FR, .description_LG = gGulpinPokedexText_LG, .pokemonScale = 593, .pokemonOffset = 22, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SWALOT] = { .categoryName = _("POISON BAG"), .height = 17, .weight = 800, .description_FR = gSwalotPokedexText_FR, .description_LG = gSwalotPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 5, .trainerScale = 345, .trainerOffset = 4, }, [NATIONAL_DEX_CARVANHA] = { .categoryName = _("SAVAGE"), .height = 8, .weight = 208, .description_FR = gCarvanhaPokedexText_FR, .description_LG = gCarvanhaPokedexText_LG, .pokemonScale = 362, .pokemonOffset = 0, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SHARPEDO] = { .categoryName = _("BRUTAL"), .height = 18, .weight = 888, .description_FR = gSharpedoPokedexText_FR, .description_LG = gSharpedoPokedexText_LG, .pokemonScale = 265, .pokemonOffset = 0, .trainerScale = 342, .trainerOffset = 4, }, [NATIONAL_DEX_WAILMER] = { .categoryName = _("BALL WHALE"), .height = 20, .weight = 1300, .description_FR = gWailmerPokedexText_FR, .description_LG = gWailmerPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 10, .trainerScale = 493, .trainerOffset = 10, }, [NATIONAL_DEX_WAILORD] = { .categoryName = _("FLOAT WHALE"), .height = 145, .weight = 3980, .description_FR = gWailordPokedexText_FR, .description_LG = gWailordPokedexText_LG, .pokemonScale = 276, .pokemonOffset = -1, .trainerScale = 1428, .trainerOffset = 20, }, [NATIONAL_DEX_NUMEL] = { .categoryName = _("NUMB"), .height = 7, .weight = 240, .description_FR = gNumelPokedexText_FR, .description_LG = gNumelPokedexText_LG, .pokemonScale = 310, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CAMERUPT] = { .categoryName = _("ERUPTION"), .height = 19, .weight = 2200, .description_FR = gCameruptPokedexText_FR, .description_LG = gCameruptPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 6, .trainerScale = 345, .trainerOffset = 4, }, [NATIONAL_DEX_TORKOAL] = { .categoryName = _("COAL"), .height = 5, .weight = 804, .description_FR = gTorkoalPokedexText_FR, .description_LG = gTorkoalPokedexText_LG, .pokemonScale = 392, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SPOINK] = { .categoryName = _("BOUNCE"), .height = 7, .weight = 306, .description_FR = gSpoinkPokedexText_FR, .description_LG = gSpoinkPokedexText_LG, .pokemonScale = 423, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GRUMPIG] = { .categoryName = _("MANIPULATE"), .height = 9, .weight = 715, .description_FR = gGrumpigPokedexText_FR, .description_LG = gGrumpigPokedexText_LG, .pokemonScale = 358, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SPINDA] = { .categoryName = _("SPOT PANDA"), .height = 11, .weight = 50, .description_FR = gSpindaPokedexText_FR, .description_LG = gSpindaPokedexText_LG, .pokemonScale = 321, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_TRAPINCH] = { .categoryName = _("ANT PIT"), .height = 7, .weight = 150, .description_FR = gTrapinchPokedexText_FR, .description_LG = gTrapinchPokedexText_LG, .pokemonScale = 298, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_VIBRAVA] = { .categoryName = _("VIBRATION"), .height = 11, .weight = 153, .description_FR = gVibravaPokedexText_FR, .description_LG = gVibravaPokedexText_LG, .pokemonScale = 370, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_FLYGON] = { .categoryName = _("MYSTIC"), .height = 20, .weight = 820, .description_FR = gFlygonPokedexText_FR, .description_LG = gFlygonPokedexText_LG, .pokemonScale = 280, .pokemonOffset = 0, .trainerScale = 299, .trainerOffset = 2, }, [NATIONAL_DEX_CACNEA] = { .categoryName = _("CACTUS"), .height = 4, .weight = 513, .description_FR = gCacneaPokedexText_FR, .description_LG = gCacneaPokedexText_LG, .pokemonScale = 455, .pokemonOffset = 19, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CACTURNE] = { .categoryName = _("SCARECROW"), .height = 13, .weight = 774, .description_FR = gCacturnePokedexText_FR, .description_LG = gCacturnePokedexText_LG, .pokemonScale = 327, .pokemonOffset = 3, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SWABLU] = { .categoryName = _("COTTON BIRD"), .height = 4, .weight = 12, .description_FR = gSwabluPokedexText_FR, .description_LG = gSwabluPokedexText_LG, .pokemonScale = 422, .pokemonOffset = -8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ALTARIA] = { .categoryName = _("HUMMING"), .height = 11, .weight = 206, .description_FR = gAltariaPokedexText_FR, .description_LG = gAltariaPokedexText_LG, .pokemonScale = 327, .pokemonOffset = 0, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ZANGOOSE] = { .categoryName = _("CAT FERRET"), .height = 13, .weight = 403, .description_FR = gZangoosePokedexText_FR, .description_LG = gZangoosePokedexText_LG, .pokemonScale = 256, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SEVIPER] = { .categoryName = _("FANG SNAKE"), .height = 27, .weight = 525, .description_FR = gSeviperPokedexText_FR, .description_LG = gSeviperPokedexText_LG, .pokemonScale = 275, .pokemonOffset = 6, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LUNATONE] = { .categoryName = _("METEORITE"), .height = 10, .weight = 1680, .description_FR = gLunatonePokedexText_FR, .description_LG = gLunatonePokedexText_LG, .pokemonScale = 300, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SOLROCK] = { .categoryName = _("METEORITE"), .height = 12, .weight = 1540, .description_FR = gSolrockPokedexText_FR, .description_LG = gSolrockPokedexText_LG, .pokemonScale = 328, .pokemonOffset = -3, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BARBOACH] = { .categoryName = _("WHISKERS"), .height = 4, .weight = 19, .description_FR = gBarboachPokedexText_FR, .description_LG = gBarboachPokedexText_LG, .pokemonScale = 581, .pokemonOffset = -2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WHISCASH] = { .categoryName = _("WHISKERS"), .height = 9, .weight = 236, .description_FR = gWhiscashPokedexText_FR, .description_LG = gWhiscashPokedexText_LG, .pokemonScale = 317, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CORPHISH] = { .categoryName = _("RUFFIAN"), .height = 6, .weight = 115, .description_FR = gCorphishPokedexText_FR, .description_LG = gCorphishPokedexText_LG, .pokemonScale = 484, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CRAWDAUNT] = { .categoryName = _("ROGUE"), .height = 11, .weight = 328, .description_FR = gCrawdauntPokedexText_FR, .description_LG = gCrawdauntPokedexText_LG, .pokemonScale = 365, .pokemonOffset = 7, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BALTOY] = { .categoryName = _("CLAY DOLL"), .height = 5, .weight = 215, .description_FR = gBaltoyPokedexText_FR, .description_LG = gBaltoyPokedexText_LG, .pokemonScale = 384, .pokemonOffset = 18, .trainerScale = 256, .trainerOffset = -3, }, [NATIONAL_DEX_CLAYDOL] = { .categoryName = _("CLAY DOLL"), .height = 15, .weight = 1080, .description_FR = gClaydolPokedexText_FR, .description_LG = gClaydolPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 3, .trainerScale = 280, .trainerOffset = 0, }, [NATIONAL_DEX_LILEEP] = { .categoryName = _("SEA LILY"), .height = 10, .weight = 238, .description_FR = gLileepPokedexText_FR, .description_LG = gLileepPokedexText_LG, .pokemonScale = 305, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_CRADILY] = { .categoryName = _("BARNACLE"), .height = 15, .weight = 604, .description_FR = gCradilyPokedexText_FR, .description_LG = gCradilyPokedexText_LG, .pokemonScale = 275, .pokemonOffset = -1, .trainerScale = 269, .trainerOffset = -1, }, [NATIONAL_DEX_ANORITH] = { .categoryName = _("OLD SHRIMP"), .height = 7, .weight = 125, .description_FR = gAnorithPokedexText_FR, .description_LG = gAnorithPokedexText_LG, .pokemonScale = 296, .pokemonOffset = 4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ARMALDO] = { .categoryName = _("PLATE"), .height = 15, .weight = 682, .description_FR = gArmaldoPokedexText_FR, .description_LG = gArmaldoPokedexText_LG, .pokemonScale = 312, .pokemonOffset = 2, .trainerScale = 271, .trainerOffset = -1, }, [NATIONAL_DEX_FEEBAS] = { .categoryName = _("FISH"), .height = 6, .weight = 74, .description_FR = gFeebasPokedexText_FR, .description_LG = gFeebasPokedexText_LG, .pokemonScale = 423, .pokemonOffset = 3, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_MILOTIC] = { .categoryName = _("TENDER"), .height = 62, .weight = 1620, .description_FR = gMiloticPokedexText_FR, .description_LG = gMiloticPokedexText_LG, .pokemonScale = 282, .pokemonOffset = -1, .trainerScale = 382, .trainerOffset = 7, }, [NATIONAL_DEX_CASTFORM] = { .categoryName = _("WEATHER"), .height = 3, .weight = 8, .description_FR = gCastformPokedexText_FR, .description_LG = gCastformPokedexText_LG, .pokemonScale = 435, .pokemonOffset = -5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_KECLEON] = { .categoryName = _("COLOR SWAP"), .height = 10, .weight = 220, .description_FR = gKecleonPokedexText_FR, .description_LG = gKecleonPokedexText_LG, .pokemonScale = 316, .pokemonOffset = 8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SHUPPET] = { .categoryName = _("PUPPET"), .height = 6, .weight = 23, .description_FR = gShuppetPokedexText_FR, .description_LG = gShuppetPokedexText_LG, .pokemonScale = 440, .pokemonOffset = -3, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BANETTE] = { .categoryName = _("MARIONETTE"), .height = 11, .weight = 125, .description_FR = gBanettePokedexText_FR, .description_LG = gBanettePokedexText_LG, .pokemonScale = 262, .pokemonOffset = 9, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DUSKULL] = { .categoryName = _("REQUIEM"), .height = 8, .weight = 150, .description_FR = gDuskullPokedexText_FR, .description_LG = gDuskullPokedexText_LG, .pokemonScale = 376, .pokemonOffset = 13, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DUSCLOPS] = { .categoryName = _("BECKON"), .height = 16, .weight = 306, .description_FR = gDusclopsPokedexText_FR, .description_LG = gDusclopsPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 2, .trainerScale = 299, .trainerOffset = 2, }, [NATIONAL_DEX_TROPIUS] = { .categoryName = _("FRUIT"), .height = 20, .weight = 1000, .description_FR = gTropiusPokedexText_FR, .description_LG = gTropiusPokedexText_LG, .pokemonScale = 283, .pokemonOffset = -1, .trainerScale = 371, .trainerOffset = 6, }, [NATIONAL_DEX_CHIMECHO] = { .categoryName = _("WIND CHIME"), .height = 6, .weight = 10, .description_FR = gChimechoPokedexText_FR, .description_LG = gChimechoPokedexText_LG, .pokemonScale = 505, .pokemonOffset = -4, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_ABSOL] = { .categoryName = _("DISASTER"), .height = 12, .weight = 470, .description_FR = gAbsolPokedexText_FR, .description_LG = gAbsolPokedexText_LG, .pokemonScale = 301, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WYNAUT] = { .categoryName = _("BRIGHT"), .height = 6, .weight = 140, .description_FR = gWynautPokedexText_FR, .description_LG = gWynautPokedexText_LG, .pokemonScale = 453, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SNORUNT] = { .categoryName = _("SNOW HAT"), .height = 7, .weight = 168, .description_FR = gSnoruntPokedexText_FR, .description_LG = gSnoruntPokedexText_LG, .pokemonScale = 380, .pokemonOffset = 14, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GLALIE] = { .categoryName = _("FACE"), .height = 15, .weight = 2565, .description_FR = gGlaliePokedexText_FR, .description_LG = gGlaliePokedexText_LG, .pokemonScale = 256, .pokemonOffset = 3, .trainerScale = 344, .trainerOffset = 2, }, [NATIONAL_DEX_SPHEAL] = { .categoryName = _("CLAP"), .height = 8, .weight = 395, .description_FR = gSphealPokedexText_FR, .description_LG = gSphealPokedexText_LG, .pokemonScale = 315, .pokemonOffset = 15, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SEALEO] = { .categoryName = _("BALL ROLL"), .height = 11, .weight = 876, .description_FR = gSealeoPokedexText_FR, .description_LG = gSealeoPokedexText_LG, .pokemonScale = 338, .pokemonOffset = 12, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_WALREIN] = { .categoryName = _("ICE BREAK"), .height = 14, .weight = 1506, .description_FR = gWalreinPokedexText_FR, .description_LG = gWalreinPokedexText_LG, .pokemonScale = 305, .pokemonOffset = 2, .trainerScale = 277, .trainerOffset = 0, }, [NATIONAL_DEX_CLAMPERL] = { .categoryName = _("BIVALVE"), .height = 4, .weight = 525, .description_FR = gClamperlPokedexText_FR, .description_LG = gClamperlPokedexText_LG, .pokemonScale = 691, .pokemonOffset = 22, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_HUNTAIL] = { .categoryName = _("DEEP SEA"), .height = 17, .weight = 270, .description_FR = gHuntailPokedexText_FR, .description_LG = gHuntailPokedexText_LG, .pokemonScale = 307, .pokemonOffset = 1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_GOREBYSS] = { .categoryName = _("SOUTH SEA"), .height = 18, .weight = 226, .description_FR = gGorebyssPokedexText_FR, .description_LG = gGorebyssPokedexText_LG, .pokemonScale = 278, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_RELICANTH] = { .categoryName = _("LONGEVITY"), .height = 10, .weight = 234, .description_FR = gRelicanthPokedexText_FR, .description_LG = gRelicanthPokedexText_LG, .pokemonScale = 316, .pokemonOffset = 5, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LUVDISC] = { .categoryName = _("RENDEZVOUS"), .height = 6, .weight = 87, .description_FR = gLuvdiscPokedexText_FR, .description_LG = gLuvdiscPokedexText_LG, .pokemonScale = 371, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_BAGON] = { .categoryName = _("ROCK HEAD"), .height = 6, .weight = 421, .description_FR = gBagonPokedexText_FR, .description_LG = gBagonPokedexText_LG, .pokemonScale = 448, .pokemonOffset = 17, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SHELGON] = { .categoryName = _("ENDURANCE"), .height = 11, .weight = 1105, .description_FR = gShelgonPokedexText_FR, .description_LG = gShelgonPokedexText_LG, .pokemonScale = 311, .pokemonOffset = 10, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_SALAMENCE] = { .categoryName = _("DRAGON"), .height = 15, .weight = 1026, .description_FR = gSalamencePokedexText_FR, .description_LG = gSalamencePokedexText_LG, .pokemonScale = 272, .pokemonOffset = 2, .trainerScale = 307, .trainerOffset = 0, }, [NATIONAL_DEX_BELDUM] = { .categoryName = _("IRON BALL"), .height = 6, .weight = 952, .description_FR = gBeldumPokedexText_FR, .description_LG = gBeldumPokedexText_LG, .pokemonScale = 414, .pokemonOffset = -1, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_METANG] = { .categoryName = _("IRON CLAW"), .height = 12, .weight = 2025, .description_FR = gMetangPokedexText_FR, .description_LG = gMetangPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 3, .trainerScale = 272, .trainerOffset = -2, }, [NATIONAL_DEX_METAGROSS] = { .categoryName = _("IRON LEG"), .height = 16, .weight = 5500, .description_FR = gMetagrossPokedexText_FR, .description_LG = gMetagrossPokedexText_LG, .pokemonScale = 272, .pokemonOffset = 3, .trainerScale = 461, .trainerOffset = 4, }, [NATIONAL_DEX_REGIROCK] = { .categoryName = _("ROCK PEAK"), .height = 17, .weight = 2300, .description_FR = gRegirockPokedexText_FR, .description_LG = gRegirockPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 1, .trainerScale = 309, .trainerOffset = 1, }, [NATIONAL_DEX_REGICE] = { .categoryName = _("ICEBERG"), .height = 18, .weight = 1750, .description_FR = gRegicePokedexText_FR, .description_LG = gRegicePokedexText_LG, .pokemonScale = 265, .pokemonOffset = 0, .trainerScale = 317, .trainerOffset = 3, }, [NATIONAL_DEX_REGISTEEL] = { .categoryName = _("IRON"), .height = 19, .weight = 2050, .description_FR = gRegisteelPokedexText_FR, .description_LG = gRegisteelPokedexText_LG, .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 359, .trainerOffset = 6, }, [NATIONAL_DEX_LATIAS] = { .categoryName = _("EON"), .height = 14, .weight = 400, .description_FR = gLatiasPokedexText_FR, .description_LG = gLatiasPokedexText_LG, .pokemonScale = 291, .pokemonOffset = 2, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_LATIOS] = { .categoryName = _("EON"), .height = 20, .weight = 600, .description_FR = gLatiosPokedexText_FR, .description_LG = gLatiosPokedexText_LG, .pokemonScale = 273, .pokemonOffset = 0, .trainerScale = 313, .trainerOffset = 3, }, [NATIONAL_DEX_KYOGRE] = { .categoryName = _("SEA BASIN"), .height = 45, .weight = 3520, .description_FR = gKyogrePokedexText_FR, .description_LG = gKyogrePokedexText_LG, .pokemonScale = 272, .pokemonOffset = 1, .trainerScale = 639, .trainerOffset = 13, }, [NATIONAL_DEX_GROUDON] = { .categoryName = _("CONTINENT"), .height = 35, .weight = 9500, .description_FR = gGroudonPokedexText_FR, .description_LG = gGroudonPokedexText_LG, .pokemonScale = 276, .pokemonOffset = 0, .trainerScale = 530, .trainerOffset = 12, }, [NATIONAL_DEX_RAYQUAZA] = { .categoryName = _("SKY HIGH"), .height = 70, .weight = 2065, .description_FR = gRayquazaPokedexText_FR, .description_LG = gRayquazaPokedexText_LG, .pokemonScale = 286, .pokemonOffset = -1, .trainerScale = 483, .trainerOffset = 9, }, [NATIONAL_DEX_JIRACHI] = { .categoryName = _("WISH"), .height = 3, .weight = 11, .description_FR = gJirachiPokedexText_FR, .description_LG = gJirachiPokedexText_LG, .pokemonScale = 608, .pokemonOffset = -8, .trainerScale = 256, .trainerOffset = -2, }, [NATIONAL_DEX_DEOXYS] = { .categoryName = _("DNA"), .height = 17, .weight = 608, .description_FR = gDeoxysPokedexText_FR, .description_LG = gDeoxysPokedexText_LG, .pokemonScale = 293, .pokemonOffset = 0, .trainerScale = 337, .trainerOffset = 2, }, }; ================================================ FILE: src/data/pokemon/pokedex_orders.h ================================================ const u16 gPokedexOrder_Alphabetical[] = { NATIONAL_DEX_OLD_UNOWN_B, NATIONAL_DEX_OLD_UNOWN_C, NATIONAL_DEX_OLD_UNOWN_D, NATIONAL_DEX_OLD_UNOWN_E, NATIONAL_DEX_OLD_UNOWN_F, NATIONAL_DEX_OLD_UNOWN_G, NATIONAL_DEX_OLD_UNOWN_H, NATIONAL_DEX_OLD_UNOWN_I, NATIONAL_DEX_OLD_UNOWN_J, NATIONAL_DEX_OLD_UNOWN_K, NATIONAL_DEX_OLD_UNOWN_L, NATIONAL_DEX_OLD_UNOWN_M, NATIONAL_DEX_OLD_UNOWN_N, NATIONAL_DEX_OLD_UNOWN_O, NATIONAL_DEX_OLD_UNOWN_P, NATIONAL_DEX_OLD_UNOWN_Q, NATIONAL_DEX_OLD_UNOWN_R, NATIONAL_DEX_OLD_UNOWN_S, NATIONAL_DEX_OLD_UNOWN_T, NATIONAL_DEX_OLD_UNOWN_U, NATIONAL_DEX_OLD_UNOWN_V, NATIONAL_DEX_OLD_UNOWN_W, NATIONAL_DEX_OLD_UNOWN_X, NATIONAL_DEX_OLD_UNOWN_Y, NATIONAL_DEX_OLD_UNOWN_Z, // Actual pokemon start here. NATIONAL_DEX_ABRA, NATIONAL_DEX_ABSOL, NATIONAL_DEX_AERODACTYL, NATIONAL_DEX_AGGRON, NATIONAL_DEX_AIPOM, NATIONAL_DEX_ALAKAZAM, NATIONAL_DEX_ALTARIA, NATIONAL_DEX_AMPHAROS, NATIONAL_DEX_ANORITH, NATIONAL_DEX_ARBOK, NATIONAL_DEX_ARCANINE, NATIONAL_DEX_ARIADOS, NATIONAL_DEX_ARMALDO, NATIONAL_DEX_ARON, NATIONAL_DEX_ARTICUNO, NATIONAL_DEX_AZUMARILL, NATIONAL_DEX_AZURILL, NATIONAL_DEX_BAGON, NATIONAL_DEX_BALTOY, NATIONAL_DEX_BANETTE, NATIONAL_DEX_BARBOACH, NATIONAL_DEX_BAYLEEF, NATIONAL_DEX_BEAUTIFLY, NATIONAL_DEX_BEEDRILL, NATIONAL_DEX_BELDUM, NATIONAL_DEX_BELLOSSOM, NATIONAL_DEX_BELLSPROUT, NATIONAL_DEX_BLASTOISE, NATIONAL_DEX_BLAZIKEN, NATIONAL_DEX_BLISSEY, NATIONAL_DEX_BRELOOM, NATIONAL_DEX_BULBASAUR, NATIONAL_DEX_BUTTERFREE, NATIONAL_DEX_CACNEA, NATIONAL_DEX_CACTURNE, NATIONAL_DEX_CAMERUPT, NATIONAL_DEX_CARVANHA, NATIONAL_DEX_CASCOON, NATIONAL_DEX_CASTFORM, NATIONAL_DEX_CATERPIE, NATIONAL_DEX_CELEBI, NATIONAL_DEX_CHANSEY, NATIONAL_DEX_CHARIZARD, NATIONAL_DEX_CHARMANDER, NATIONAL_DEX_CHARMELEON, NATIONAL_DEX_CHIKORITA, NATIONAL_DEX_CHIMECHO, NATIONAL_DEX_CHINCHOU, NATIONAL_DEX_CLAMPERL, NATIONAL_DEX_CLAYDOL, NATIONAL_DEX_CLEFABLE, NATIONAL_DEX_CLEFAIRY, NATIONAL_DEX_CLEFFA, NATIONAL_DEX_CLOYSTER, NATIONAL_DEX_COMBUSKEN, NATIONAL_DEX_CORPHISH, NATIONAL_DEX_CORSOLA, NATIONAL_DEX_CRADILY, NATIONAL_DEX_CRAWDAUNT, NATIONAL_DEX_CROBAT, NATIONAL_DEX_CROCONAW, NATIONAL_DEX_CUBONE, NATIONAL_DEX_CYNDAQUIL, NATIONAL_DEX_DELCATTY, NATIONAL_DEX_DELIBIRD, NATIONAL_DEX_DEOXYS, NATIONAL_DEX_DEWGONG, NATIONAL_DEX_DIGLETT, NATIONAL_DEX_DITTO, NATIONAL_DEX_DODRIO, NATIONAL_DEX_DODUO, NATIONAL_DEX_DONPHAN, NATIONAL_DEX_DRAGONAIR, NATIONAL_DEX_DRAGONITE, NATIONAL_DEX_DRATINI, NATIONAL_DEX_DROWZEE, NATIONAL_DEX_DUGTRIO, NATIONAL_DEX_DUNSPARCE, NATIONAL_DEX_DUSCLOPS, NATIONAL_DEX_DUSKULL, NATIONAL_DEX_DUSTOX, NATIONAL_DEX_EEVEE, NATIONAL_DEX_EKANS, NATIONAL_DEX_ELECTABUZZ, NATIONAL_DEX_ELECTRIKE, NATIONAL_DEX_ELECTRODE, NATIONAL_DEX_ELEKID, NATIONAL_DEX_ENTEI, NATIONAL_DEX_ESPEON, NATIONAL_DEX_EXEGGCUTE, NATIONAL_DEX_EXEGGUTOR, NATIONAL_DEX_EXPLOUD, NATIONAL_DEX_FARFETCHD, NATIONAL_DEX_FEAROW, NATIONAL_DEX_FEEBAS, NATIONAL_DEX_FERALIGATR, NATIONAL_DEX_FLAAFFY, NATIONAL_DEX_FLAREON, NATIONAL_DEX_FLYGON, NATIONAL_DEX_FORRETRESS, NATIONAL_DEX_FURRET, NATIONAL_DEX_GARDEVOIR, NATIONAL_DEX_GASTLY, NATIONAL_DEX_GENGAR, NATIONAL_DEX_GEODUDE, NATIONAL_DEX_GIRAFARIG, NATIONAL_DEX_GLALIE, NATIONAL_DEX_GLIGAR, NATIONAL_DEX_GLOOM, NATIONAL_DEX_GOLBAT, NATIONAL_DEX_GOLDEEN, NATIONAL_DEX_GOLDUCK, NATIONAL_DEX_GOLEM, NATIONAL_DEX_GOREBYSS, NATIONAL_DEX_GRANBULL, NATIONAL_DEX_GRAVELER, NATIONAL_DEX_GRIMER, NATIONAL_DEX_GROUDON, NATIONAL_DEX_GROVYLE, NATIONAL_DEX_GROWLITHE, NATIONAL_DEX_GRUMPIG, NATIONAL_DEX_GULPIN, NATIONAL_DEX_GYARADOS, NATIONAL_DEX_HARIYAMA, NATIONAL_DEX_HAUNTER, NATIONAL_DEX_HERACROSS, NATIONAL_DEX_HITMONCHAN, NATIONAL_DEX_HITMONLEE, NATIONAL_DEX_HITMONTOP, NATIONAL_DEX_HO_OH, NATIONAL_DEX_HOOTHOOT, NATIONAL_DEX_HOPPIP, NATIONAL_DEX_HORSEA, NATIONAL_DEX_HOUNDOOM, NATIONAL_DEX_HOUNDOUR, NATIONAL_DEX_HUNTAIL, NATIONAL_DEX_HYPNO, NATIONAL_DEX_IGGLYBUFF, NATIONAL_DEX_ILLUMISE, NATIONAL_DEX_IVYSAUR, NATIONAL_DEX_JIGGLYPUFF, NATIONAL_DEX_JIRACHI, NATIONAL_DEX_JOLTEON, NATIONAL_DEX_JUMPLUFF, NATIONAL_DEX_JYNX, NATIONAL_DEX_KABUTO, NATIONAL_DEX_KABUTOPS, NATIONAL_DEX_KADABRA, NATIONAL_DEX_KAKUNA, NATIONAL_DEX_KANGASKHAN, NATIONAL_DEX_KECLEON, NATIONAL_DEX_KINGDRA, NATIONAL_DEX_KINGLER, NATIONAL_DEX_KIRLIA, NATIONAL_DEX_KOFFING, NATIONAL_DEX_KRABBY, NATIONAL_DEX_KYOGRE, NATIONAL_DEX_LAIRON, NATIONAL_DEX_LANTURN, NATIONAL_DEX_LAPRAS, NATIONAL_DEX_LARVITAR, NATIONAL_DEX_LATIAS, NATIONAL_DEX_LATIOS, NATIONAL_DEX_LEDIAN, NATIONAL_DEX_LEDYBA, NATIONAL_DEX_LICKITUNG, NATIONAL_DEX_LILEEP, NATIONAL_DEX_LINOONE, NATIONAL_DEX_LOMBRE, NATIONAL_DEX_LOTAD, NATIONAL_DEX_LOUDRED, NATIONAL_DEX_LUDICOLO, NATIONAL_DEX_LUGIA, NATIONAL_DEX_LUNATONE, NATIONAL_DEX_LUVDISC, NATIONAL_DEX_MACHAMP, NATIONAL_DEX_MACHOKE, NATIONAL_DEX_MACHOP, NATIONAL_DEX_MAGBY, NATIONAL_DEX_MAGCARGO, NATIONAL_DEX_MAGIKARP, NATIONAL_DEX_MAGMAR, NATIONAL_DEX_MAGNEMITE, NATIONAL_DEX_MAGNETON, NATIONAL_DEX_MAKUHITA, NATIONAL_DEX_MANECTRIC, NATIONAL_DEX_MANKEY, NATIONAL_DEX_MANTINE, NATIONAL_DEX_MAREEP, NATIONAL_DEX_MARILL, NATIONAL_DEX_MAROWAK, NATIONAL_DEX_MARSHTOMP, NATIONAL_DEX_MASQUERAIN, NATIONAL_DEX_MAWILE, NATIONAL_DEX_MEDICHAM, NATIONAL_DEX_MEDITITE, NATIONAL_DEX_MEGANIUM, NATIONAL_DEX_MEOWTH, NATIONAL_DEX_METAGROSS, NATIONAL_DEX_METANG, NATIONAL_DEX_METAPOD, NATIONAL_DEX_MEW, NATIONAL_DEX_MEWTWO, NATIONAL_DEX_MIGHTYENA, NATIONAL_DEX_MILOTIC, NATIONAL_DEX_MILTANK, NATIONAL_DEX_MINUN, NATIONAL_DEX_MISDREAVUS, NATIONAL_DEX_MOLTRES, NATIONAL_DEX_MR_MIME, NATIONAL_DEX_MUDKIP, NATIONAL_DEX_MUK, NATIONAL_DEX_MURKROW, NATIONAL_DEX_NATU, NATIONAL_DEX_NIDOKING, NATIONAL_DEX_NIDOQUEEN, NATIONAL_DEX_NIDORAN_F, NATIONAL_DEX_NIDORAN_M, NATIONAL_DEX_NIDORINA, NATIONAL_DEX_NIDORINO, NATIONAL_DEX_NINCADA, NATIONAL_DEX_NINETALES, NATIONAL_DEX_NINJASK, NATIONAL_DEX_NOCTOWL, NATIONAL_DEX_NOSEPASS, NATIONAL_DEX_NUMEL, NATIONAL_DEX_NUZLEAF, NATIONAL_DEX_OCTILLERY, NATIONAL_DEX_ODDISH, NATIONAL_DEX_OMANYTE, NATIONAL_DEX_OMASTAR, NATIONAL_DEX_ONIX, NATIONAL_DEX_PARAS, NATIONAL_DEX_PARASECT, NATIONAL_DEX_PELIPPER, NATIONAL_DEX_PERSIAN, NATIONAL_DEX_PHANPY, NATIONAL_DEX_PICHU, NATIONAL_DEX_PIDGEOT, NATIONAL_DEX_PIDGEOTTO, NATIONAL_DEX_PIDGEY, NATIONAL_DEX_PIKACHU, NATIONAL_DEX_PILOSWINE, NATIONAL_DEX_PINECO, NATIONAL_DEX_PINSIR, NATIONAL_DEX_PLUSLE, NATIONAL_DEX_POLITOED, NATIONAL_DEX_POLIWAG, NATIONAL_DEX_POLIWHIRL, NATIONAL_DEX_POLIWRATH, NATIONAL_DEX_PONYTA, NATIONAL_DEX_POOCHYENA, NATIONAL_DEX_PORYGON, NATIONAL_DEX_PORYGON2, NATIONAL_DEX_PRIMEAPE, NATIONAL_DEX_PSYDUCK, NATIONAL_DEX_PUPITAR, NATIONAL_DEX_QUAGSIRE, NATIONAL_DEX_QUILAVA, NATIONAL_DEX_QWILFISH, NATIONAL_DEX_RAICHU, NATIONAL_DEX_RAIKOU, NATIONAL_DEX_RALTS, NATIONAL_DEX_RAPIDASH, NATIONAL_DEX_RATICATE, NATIONAL_DEX_RATTATA, NATIONAL_DEX_RAYQUAZA, NATIONAL_DEX_REGICE, NATIONAL_DEX_REGIROCK, NATIONAL_DEX_REGISTEEL, NATIONAL_DEX_RELICANTH, NATIONAL_DEX_REMORAID, NATIONAL_DEX_RHYDON, NATIONAL_DEX_RHYHORN, NATIONAL_DEX_ROSELIA, NATIONAL_DEX_SABLEYE, NATIONAL_DEX_SALAMENCE, NATIONAL_DEX_SANDSHREW, NATIONAL_DEX_SANDSLASH, NATIONAL_DEX_SCEPTILE, NATIONAL_DEX_SCIZOR, NATIONAL_DEX_SCYTHER, NATIONAL_DEX_SEADRA, NATIONAL_DEX_SEAKING, NATIONAL_DEX_SEALEO, NATIONAL_DEX_SEEDOT, NATIONAL_DEX_SEEL, NATIONAL_DEX_SENTRET, NATIONAL_DEX_SEVIPER, NATIONAL_DEX_SHARPEDO, NATIONAL_DEX_SHEDINJA, NATIONAL_DEX_SHELGON, NATIONAL_DEX_SHELLDER, NATIONAL_DEX_SHIFTRY, NATIONAL_DEX_SHROOMISH, NATIONAL_DEX_SHUCKLE, NATIONAL_DEX_SHUPPET, NATIONAL_DEX_SILCOON, NATIONAL_DEX_SKARMORY, NATIONAL_DEX_SKIPLOOM, NATIONAL_DEX_SKITTY, NATIONAL_DEX_SLAKING, NATIONAL_DEX_SLAKOTH, NATIONAL_DEX_SLOWBRO, NATIONAL_DEX_SLOWKING, NATIONAL_DEX_SLOWPOKE, NATIONAL_DEX_SLUGMA, NATIONAL_DEX_SMEARGLE, NATIONAL_DEX_SMOOCHUM, NATIONAL_DEX_SNEASEL, NATIONAL_DEX_SNORLAX, NATIONAL_DEX_SNORUNT, NATIONAL_DEX_SNUBBULL, NATIONAL_DEX_SOLROCK, NATIONAL_DEX_SPEAROW, NATIONAL_DEX_SPHEAL, NATIONAL_DEX_SPINARAK, NATIONAL_DEX_SPINDA, NATIONAL_DEX_SPOINK, NATIONAL_DEX_SQUIRTLE, NATIONAL_DEX_STANTLER, NATIONAL_DEX_STARMIE, NATIONAL_DEX_STARYU, NATIONAL_DEX_STEELIX, NATIONAL_DEX_SUDOWOODO, NATIONAL_DEX_SUICUNE, NATIONAL_DEX_SUNFLORA, NATIONAL_DEX_SUNKERN, NATIONAL_DEX_SURSKIT, NATIONAL_DEX_SWABLU, NATIONAL_DEX_SWALOT, NATIONAL_DEX_SWAMPERT, NATIONAL_DEX_SWELLOW, NATIONAL_DEX_SWINUB, NATIONAL_DEX_TAILLOW, NATIONAL_DEX_TANGELA, NATIONAL_DEX_TAUROS, NATIONAL_DEX_TEDDIURSA, NATIONAL_DEX_TENTACOOL, NATIONAL_DEX_TENTACRUEL, NATIONAL_DEX_TOGEPI, NATIONAL_DEX_TOGETIC, NATIONAL_DEX_TORCHIC, NATIONAL_DEX_TORKOAL, NATIONAL_DEX_TOTODILE, NATIONAL_DEX_TRAPINCH, NATIONAL_DEX_TREECKO, NATIONAL_DEX_TROPIUS, NATIONAL_DEX_TYPHLOSION, NATIONAL_DEX_TYRANITAR, NATIONAL_DEX_TYROGUE, NATIONAL_DEX_UMBREON, NATIONAL_DEX_UNOWN, NATIONAL_DEX_URSARING, NATIONAL_DEX_VAPOREON, NATIONAL_DEX_VENOMOTH, NATIONAL_DEX_VENONAT, NATIONAL_DEX_VENUSAUR, NATIONAL_DEX_VIBRAVA, NATIONAL_DEX_VICTREEBEL, NATIONAL_DEX_VIGOROTH, NATIONAL_DEX_VILEPLUME, NATIONAL_DEX_VOLBEAT, NATIONAL_DEX_VOLTORB, NATIONAL_DEX_VULPIX, NATIONAL_DEX_WAILMER, NATIONAL_DEX_WAILORD, NATIONAL_DEX_WALREIN, NATIONAL_DEX_WARTORTLE, NATIONAL_DEX_WEEDLE, NATIONAL_DEX_WEEPINBELL, NATIONAL_DEX_WEEZING, NATIONAL_DEX_WHISCASH, NATIONAL_DEX_WHISMUR, NATIONAL_DEX_WIGGLYTUFF, NATIONAL_DEX_WINGULL, NATIONAL_DEX_WOBBUFFET, NATIONAL_DEX_WOOPER, NATIONAL_DEX_WURMPLE, NATIONAL_DEX_WYNAUT, NATIONAL_DEX_XATU, NATIONAL_DEX_YANMA, NATIONAL_DEX_ZANGOOSE, NATIONAL_DEX_ZAPDOS, NATIONAL_DEX_ZIGZAGOON, NATIONAL_DEX_ZUBAT }; const u16 gPokedexOrder_Weight[] = { NATIONAL_DEX_GASTLY, NATIONAL_DEX_HAUNTER, NATIONAL_DEX_HOPPIP, NATIONAL_DEX_DIGLETT, NATIONAL_DEX_CASTFORM, NATIONAL_DEX_KOFFING, NATIONAL_DEX_IGGLYBUFF, NATIONAL_DEX_MISDREAVUS, NATIONAL_DEX_CHIMECHO, NATIONAL_DEX_SKIPLOOM, NATIONAL_DEX_JIRACHI, NATIONAL_DEX_SWABLU, NATIONAL_DEX_SHEDINJA, NATIONAL_DEX_TOGEPI, NATIONAL_DEX_SURSKIT, NATIONAL_DEX_PIDGEY, NATIONAL_DEX_SUNKERN, NATIONAL_DEX_BARBOACH, NATIONAL_DEX_PICHU, NATIONAL_DEX_AZURILL, NATIONAL_DEX_ROSELIA, NATIONAL_DEX_NATU, NATIONAL_DEX_SPEAROW, NATIONAL_DEX_MURKROW, NATIONAL_DEX_SHUPPET, NATIONAL_DEX_TAILLOW, NATIONAL_DEX_EXEGGCUTE, NATIONAL_DEX_TORCHIC, NATIONAL_DEX_LOTAD, NATIONAL_DEX_CATERPIE, NATIONAL_DEX_JUMPLUFF, NATIONAL_DEX_CLEFFA, NATIONAL_DEX_WEEDLE, NATIONAL_DEX_TOGETIC, NATIONAL_DEX_DRATINI, NATIONAL_DEX_RATTATA, NATIONAL_DEX_MASQUERAIN, NATIONAL_DEX_WURMPLE, NATIONAL_DEX_QWILFISH, NATIONAL_DEX_MEW, NATIONAL_DEX_SHELLDER, NATIONAL_DEX_SEEDOT, NATIONAL_DEX_DITTO, NATIONAL_DEX_BELLSPROUT, NATIONAL_DEX_PLUSLE, NATIONAL_DEX_MEOWTH, NATIONAL_DEX_MINUN, NATIONAL_DEX_SHROOMISH, NATIONAL_DEX_CELEBI, NATIONAL_DEX_CORSOLA, NATIONAL_DEX_TREECKO, NATIONAL_DEX_SPINDA, NATIONAL_DEX_UNOWN, NATIONAL_DEX_PARAS, NATIONAL_DEX_ODDISH, NATIONAL_DEX_JIGGLYPUFF, NATIONAL_DEX_NINCADA, NATIONAL_DEX_BELLOSSOM, NATIONAL_DEX_MAGNEMITE, NATIONAL_DEX_PIKACHU, NATIONAL_DEX_SMOOCHUM, NATIONAL_DEX_SENTRET, NATIONAL_DEX_WEEPINBELL, NATIONAL_DEX_CHIKORITA, NATIONAL_DEX_SWINUB, NATIONAL_DEX_EEVEE, NATIONAL_DEX_KRABBY, NATIONAL_DEX_CUBONE, NATIONAL_DEX_RALTS, NATIONAL_DEX_BULBASAUR, NATIONAL_DEX_EKANS, NATIONAL_DEX_NIDORAN_F, NATIONAL_DEX_PINECO, NATIONAL_DEX_FEEBAS, NATIONAL_DEX_OMANYTE, NATIONAL_DEX_ZUBAT, NATIONAL_DEX_CLEFAIRY, NATIONAL_DEX_MUDKIP, NATIONAL_DEX_SNUBBULL, NATIONAL_DEX_MAREEP, NATIONAL_DEX_CYNDAQUIL, NATIONAL_DEX_HORSEA, NATIONAL_DEX_CHARMANDER, NATIONAL_DEX_SUNFLORA, NATIONAL_DEX_MARILL, NATIONAL_DEX_WOOPER, NATIONAL_DEX_SPINARAK, NATIONAL_DEX_GLOOM, NATIONAL_DEX_LUVDISC, NATIONAL_DEX_TEDDIURSA, NATIONAL_DEX_NIDORAN_M, NATIONAL_DEX_SQUIRTLE, NATIONAL_DEX_WINGULL, NATIONAL_DEX_TOTODILE, NATIONAL_DEX_WEEZING, NATIONAL_DEX_VULPIX, NATIONAL_DEX_METAPOD, NATIONAL_DEX_SILCOON, NATIONAL_DEX_MAGIKARP, NATIONAL_DEX_KAKUNA, NATIONAL_DEX_GULPIN, NATIONAL_DEX_VOLTORB, NATIONAL_DEX_LEDYBA, NATIONAL_DEX_HOUNDOUR, NATIONAL_DEX_SKITTY, NATIONAL_DEX_SABLEYE, NATIONAL_DEX_MEDITITE, NATIONAL_DEX_CORPHISH, NATIONAL_DEX_AIPOM, NATIONAL_DEX_CASCOON, NATIONAL_DEX_MAWILE, NATIONAL_DEX_KABUTO, NATIONAL_DEX_WIGGLYTUFF, NATIONAL_DEX_SANDSHREW, NATIONAL_DEX_REMORAID, NATIONAL_DEX_NINJASK, NATIONAL_DEX_CHINCHOU, NATIONAL_DEX_POLIWAG, NATIONAL_DEX_ANORITH, NATIONAL_DEX_VENOMOTH, NATIONAL_DEX_BANETTE, NATIONAL_DEX_IVYSAUR, NATIONAL_DEX_FLAAFFY, NATIONAL_DEX_POOCHYENA, NATIONAL_DEX_WYNAUT, NATIONAL_DEX_DUNSPARCE, NATIONAL_DEX_XATU, NATIONAL_DEX_DUSKULL, NATIONAL_DEX_FARFETCHD, NATIONAL_DEX_TRAPINCH, NATIONAL_DEX_GOLDEEN, NATIONAL_DEX_ELECTRIKE, NATIONAL_DEX_VIBRAVA, NATIONAL_DEX_VICTREEBEL, NATIONAL_DEX_BAYLEEF, NATIONAL_DEX_DELIBIRD, NATIONAL_DEX_WHISMUR, NATIONAL_DEX_DRAGONAIR, NATIONAL_DEX_SNORUNT, NATIONAL_DEX_ZIGZAGOON, NATIONAL_DEX_ILLUMISE, NATIONAL_DEX_VOLBEAT, NATIONAL_DEX_RATICATE, NATIONAL_DEX_VILEPLUME, NATIONAL_DEX_QUILAVA, NATIONAL_DEX_CHARMELEON, NATIONAL_DEX_GROWLITHE, NATIONAL_DEX_COMBUSKEN, NATIONAL_DEX_MACHOP, NATIONAL_DEX_ABRA, NATIONAL_DEX_NIDORINO, NATIONAL_DEX_PSYDUCK, NATIONAL_DEX_SWELLOW, NATIONAL_DEX_NINETALES, NATIONAL_DEX_NIDORINA, NATIONAL_DEX_POLIWHIRL, NATIONAL_DEX_GEODUDE, NATIONAL_DEX_KIRLIA, NATIONAL_DEX_SHUCKLE, NATIONAL_DEX_ALTARIA, NATIONAL_DEX_CARVANHA, NATIONAL_DEX_TYROGUE, NATIONAL_DEX_HOOTHOOT, NATIONAL_DEX_MAGBY, NATIONAL_DEX_BALTOY, NATIONAL_DEX_GROVYLE, NATIONAL_DEX_KECLEON, NATIONAL_DEX_LANTURN, NATIONAL_DEX_WARTORTLE, NATIONAL_DEX_GOREBYSS, NATIONAL_DEX_RELICANTH, NATIONAL_DEX_ELEKID, NATIONAL_DEX_WHISCASH, NATIONAL_DEX_LILEEP, NATIONAL_DEX_NUMEL, NATIONAL_DEX_SLAKOTH, NATIONAL_DEX_JOLTEON, NATIONAL_DEX_CROCONAW, NATIONAL_DEX_FLAREON, NATIONAL_DEX_SEADRA, NATIONAL_DEX_ESPEON, NATIONAL_DEX_HUNTAIL, NATIONAL_DEX_UMBREON, NATIONAL_DEX_MARSHTOMP, NATIONAL_DEX_NUZLEAF, NATIONAL_DEX_SNEASEL, NATIONAL_DEX_MANKEY, NATIONAL_DEX_PELIPPER, NATIONAL_DEX_BEAUTIFLY, NATIONAL_DEX_OCTILLERY, NATIONAL_DEX_AZUMARILL, NATIONAL_DEX_WOBBUFFET, NATIONAL_DEX_VAPOREON, NATIONAL_DEX_SANDSLASH, NATIONAL_DEX_PARASECT, NATIONAL_DEX_BEEDRILL, NATIONAL_DEX_MUK, NATIONAL_DEX_PIDGEOTTO, NATIONAL_DEX_GRIMER, NATIONAL_DEX_RAICHU, NATIONAL_DEX_PONYTA, NATIONAL_DEX_ELECTABUZZ, NATIONAL_DEX_VENONAT, NATIONAL_DEX_SPOINK, NATIONAL_DEX_DUSCLOPS, NATIONAL_DEX_MEDICHAM, NATIONAL_DEX_DUSTOX, NATIONAL_DEX_PERSIAN, NATIONAL_DEX_BUTTERFREE, NATIONAL_DEX_PRIMEAPE, NATIONAL_DEX_DROWZEE, NATIONAL_DEX_FURRET, NATIONAL_DEX_PORYGON2, NATIONAL_DEX_LOMBRE, NATIONAL_DEX_LINOONE, NATIONAL_DEX_DELCATTY, NATIONAL_DEX_CRAWDAUNT, NATIONAL_DEX_DUGTRIO, NATIONAL_DEX_ARIADOS, NATIONAL_DEX_PHANPY, NATIONAL_DEX_POLITOED, NATIONAL_DEX_STARYU, NATIONAL_DEX_CHANSEY, NATIONAL_DEX_OMASTAR, NATIONAL_DEX_TANGELA, NATIONAL_DEX_SLUGMA, NATIONAL_DEX_HOUNDOOM, NATIONAL_DEX_LEDIAN, NATIONAL_DEX_SLOWPOKE, NATIONAL_DEX_PORYGON, NATIONAL_DEX_MIGHTYENA, NATIONAL_DEX_YANMA, NATIONAL_DEX_FEAROW, NATIONAL_DEX_SUDOWOODO, NATIONAL_DEX_SEAKING, NATIONAL_DEX_BRELOOM, NATIONAL_DEX_DODUO, NATIONAL_DEX_PIDGEOT, NATIONAL_DEX_SPHEAL, NATIONAL_DEX_CLEFABLE, NATIONAL_DEX_LATIAS, NATIONAL_DEX_MANECTRIC, NATIONAL_DEX_ZANGOOSE, NATIONAL_DEX_KABUTOPS, NATIONAL_DEX_GENGAR, NATIONAL_DEX_LOUDRED, NATIONAL_DEX_JYNX, NATIONAL_DEX_NOCTOWL, NATIONAL_DEX_GIRAFARIG, NATIONAL_DEX_BAGON, NATIONAL_DEX_MAGMAR, NATIONAL_DEX_MAROWAK, NATIONAL_DEX_TENTACOOL, NATIONAL_DEX_VIGOROTH, NATIONAL_DEX_BLISSEY, NATIONAL_DEX_ABSOL, NATIONAL_DEX_ALAKAZAM, NATIONAL_DEX_HITMONTOP, NATIONAL_DEX_GARDEVOIR, NATIONAL_DEX_GRANBULL, NATIONAL_DEX_HITMONLEE, NATIONAL_DEX_HITMONCHAN, NATIONAL_DEX_SKARMORY, NATIONAL_DEX_CACNEA, NATIONAL_DEX_BLAZIKEN, NATIONAL_DEX_SCEPTILE, NATIONAL_DEX_SEVIPER, NATIONAL_DEX_CLAMPERL, NATIONAL_DEX_ZAPDOS, NATIONAL_DEX_HERACROSS, NATIONAL_DEX_POLIWRATH, NATIONAL_DEX_MR_MIME, NATIONAL_DEX_PINSIR, NATIONAL_DEX_LUDICOLO, NATIONAL_DEX_TENTACRUEL, NATIONAL_DEX_GOLBAT, NATIONAL_DEX_MAGCARGO, NATIONAL_DEX_ARTICUNO, NATIONAL_DEX_PILOSWINE, NATIONAL_DEX_SCYTHER, NATIONAL_DEX_KADABRA, NATIONAL_DEX_SMEARGLE, NATIONAL_DEX_AERODACTYL, NATIONAL_DEX_SHIFTRY, NATIONAL_DEX_KINGLER, NATIONAL_DEX_NIDOQUEEN, NATIONAL_DEX_MAGNETON, NATIONAL_DEX_ARON, NATIONAL_DEX_LATIOS, NATIONAL_DEX_MOLTRES, NATIONAL_DEX_CRADILY, NATIONAL_DEX_DEOXYS, NATIONAL_DEX_AMPHAROS, NATIONAL_DEX_NIDOKING, NATIONAL_DEX_GLIGAR, NATIONAL_DEX_ARBOK, NATIONAL_DEX_LICKITUNG, NATIONAL_DEX_ELECTRODE, NATIONAL_DEX_ARMALDO, NATIONAL_DEX_MACHOKE, NATIONAL_DEX_STANTLER, NATIONAL_DEX_GRUMPIG, NATIONAL_DEX_LARVITAR, NATIONAL_DEX_CROBAT, NATIONAL_DEX_QUAGSIRE, NATIONAL_DEX_MILTANK, NATIONAL_DEX_HYPNO, NATIONAL_DEX_GOLDUCK, NATIONAL_DEX_CACTURNE, NATIONAL_DEX_SLOWBRO, NATIONAL_DEX_TYPHLOSION, NATIONAL_DEX_SLOWKING, NATIONAL_DEX_KANGASKHAN, NATIONAL_DEX_STARMIE, NATIONAL_DEX_SWALOT, NATIONAL_DEX_TORKOAL, NATIONAL_DEX_SWAMPERT, NATIONAL_DEX_FLYGON, NATIONAL_DEX_EXPLOUD, NATIONAL_DEX_DODRIO, NATIONAL_DEX_BLASTOISE, NATIONAL_DEX_MAKUHITA, NATIONAL_DEX_SEALEO, NATIONAL_DEX_TAUROS, NATIONAL_DEX_SHARPEDO, NATIONAL_DEX_FERALIGATR, NATIONAL_DEX_SEEL, NATIONAL_DEX_CHARIZARD, NATIONAL_DEX_RAPIDASH, NATIONAL_DEX_BELDUM, NATIONAL_DEX_NOSEPASS, NATIONAL_DEX_VENUSAUR, NATIONAL_DEX_TROPIUS, NATIONAL_DEX_MEGANIUM, NATIONAL_DEX_SALAMENCE, NATIONAL_DEX_GRAVELER, NATIONAL_DEX_CLAYDOL, NATIONAL_DEX_SHELGON, NATIONAL_DEX_RHYHORN, NATIONAL_DEX_SCIZOR, NATIONAL_DEX_DEWGONG, NATIONAL_DEX_RHYDON, NATIONAL_DEX_DONPHAN, NATIONAL_DEX_EXEGGUTOR, NATIONAL_DEX_LAIRON, NATIONAL_DEX_MEWTWO, NATIONAL_DEX_URSARING, NATIONAL_DEX_FORRETRESS, NATIONAL_DEX_MACHAMP, NATIONAL_DEX_WAILMER, NATIONAL_DEX_SLAKING, NATIONAL_DEX_CLOYSTER, NATIONAL_DEX_WALREIN, NATIONAL_DEX_PUPITAR, NATIONAL_DEX_KINGDRA, NATIONAL_DEX_SOLROCK, NATIONAL_DEX_ARCANINE, NATIONAL_DEX_MILOTIC, NATIONAL_DEX_LUNATONE, NATIONAL_DEX_REGICE, NATIONAL_DEX_RAIKOU, NATIONAL_DEX_SUICUNE, NATIONAL_DEX_ENTEI, NATIONAL_DEX_HO_OH, NATIONAL_DEX_TYRANITAR, NATIONAL_DEX_METANG, NATIONAL_DEX_REGISTEEL, NATIONAL_DEX_RAYQUAZA, NATIONAL_DEX_ONIX, NATIONAL_DEX_DRAGONITE, NATIONAL_DEX_LUGIA, NATIONAL_DEX_LAPRAS, NATIONAL_DEX_CAMERUPT, NATIONAL_DEX_MANTINE, NATIONAL_DEX_REGIROCK, NATIONAL_DEX_GYARADOS, NATIONAL_DEX_HARIYAMA, NATIONAL_DEX_GLALIE, NATIONAL_DEX_GOLEM, NATIONAL_DEX_KYOGRE, NATIONAL_DEX_AGGRON, NATIONAL_DEX_WAILORD, NATIONAL_DEX_STEELIX, NATIONAL_DEX_SNORLAX, NATIONAL_DEX_METAGROSS, NATIONAL_DEX_GROUDON }; const u16 gPokedexOrder_Height[] = { NATIONAL_DEX_DIGLETT, NATIONAL_DEX_AZURILL, NATIONAL_DEX_NATU, NATIONAL_DEX_WEEDLE, NATIONAL_DEX_PICHU, NATIONAL_DEX_CLEFFA, NATIONAL_DEX_TOGEPI, NATIONAL_DEX_CASTFORM, NATIONAL_DEX_IGGLYBUFF, NATIONAL_DEX_CATERPIE, NATIONAL_DEX_TAILLOW, NATIONAL_DEX_DITTO, NATIONAL_DEX_EEVEE, NATIONAL_DEX_ROSELIA, NATIONAL_DEX_SPEAROW, NATIONAL_DEX_PIDGEY, NATIONAL_DEX_SUNKERN, NATIONAL_DEX_SHELLDER, NATIONAL_DEX_RATTATA, NATIONAL_DEX_MAGNEMITE, NATIONAL_DEX_PARAS, NATIONAL_DEX_WURMPLE, NATIONAL_DEX_JIRACHI, NATIONAL_DEX_CUBONE, NATIONAL_DEX_MUDKIP, NATIONAL_DEX_WOOPER, NATIONAL_DEX_HORSEA, NATIONAL_DEX_MEOWTH, NATIONAL_DEX_NIDORAN_F, NATIONAL_DEX_SWINUB, NATIONAL_DEX_MEW, NATIONAL_DEX_SWABLU, NATIONAL_DEX_ARON, NATIONAL_DEX_PLUSLE, NATIONAL_DEX_MINUN, NATIONAL_DEX_EXEGGCUTE, NATIONAL_DEX_PIKACHU, NATIONAL_DEX_BELLOSSOM, NATIONAL_DEX_GULPIN, NATIONAL_DEX_ZIGZAGOON, NATIONAL_DEX_SHROOMISH, NATIONAL_DEX_OMANYTE, NATIONAL_DEX_CACNEA, NATIONAL_DEX_KRABBY, NATIONAL_DEX_RALTS, NATIONAL_DEX_HOPPIP, NATIONAL_DEX_TORCHIC, NATIONAL_DEX_CLAMPERL, NATIONAL_DEX_GEODUDE, NATIONAL_DEX_MARILL, NATIONAL_DEX_BARBOACH, NATIONAL_DEX_SMOOCHUM, NATIONAL_DEX_VOLTORB, NATIONAL_DEX_NINCADA, NATIONAL_DEX_SABLEYE, NATIONAL_DEX_MURKROW, NATIONAL_DEX_QWILFISH, NATIONAL_DEX_SQUIRTLE, NATIONAL_DEX_TREECKO, NATIONAL_DEX_BALTOY, NATIONAL_DEX_ODDISH, NATIONAL_DEX_LOTAD, NATIONAL_DEX_JIGGLYPUFF, NATIONAL_DEX_SURSKIT, NATIONAL_DEX_CYNDAQUIL, NATIONAL_DEX_KABUTO, NATIONAL_DEX_LINOONE, NATIONAL_DEX_TORKOAL, NATIONAL_DEX_NIDORAN_M, NATIONAL_DEX_SPINARAK, NATIONAL_DEX_MANKEY, NATIONAL_DEX_SEEDOT, NATIONAL_DEX_POOCHYENA, NATIONAL_DEX_PHANPY, NATIONAL_DEX_UNOWN, NATIONAL_DEX_CHINCHOU, NATIONAL_DEX_PORYGON2, NATIONAL_DEX_POLIWAG, NATIONAL_DEX_BAGON, NATIONAL_DEX_FEEBAS, NATIONAL_DEX_SHUPPET, NATIONAL_DEX_TOTODILE, NATIONAL_DEX_CELEBI, NATIONAL_DEX_WYNAUT, NATIONAL_DEX_SANDSHREW, NATIONAL_DEX_CHIMECHO, NATIONAL_DEX_LUVDISC, NATIONAL_DEX_HOUNDOUR, NATIONAL_DEX_SILCOON, NATIONAL_DEX_ELECTRIKE, NATIONAL_DEX_CHARMANDER, NATIONAL_DEX_MEDITITE, NATIONAL_DEX_WINGULL, NATIONAL_DEX_REMORAID, NATIONAL_DEX_CORPHISH, NATIONAL_DEX_CORSOLA, NATIONAL_DEX_ILLUMISE, NATIONAL_DEX_SNUBBULL, NATIONAL_DEX_VULPIX, NATIONAL_DEX_LARVITAR, NATIONAL_DEX_BELDUM, NATIONAL_DEX_WHISMUR, NATIONAL_DEX_PINECO, NATIONAL_DEX_ELEKID, NATIONAL_DEX_CLEFAIRY, NATIONAL_DEX_SHUCKLE, NATIONAL_DEX_TEDDIURSA, NATIONAL_DEX_KAKUNA, NATIONAL_DEX_SKITTY, NATIONAL_DEX_TOGETIC, NATIONAL_DEX_GOLDEEN, NATIONAL_DEX_MAWILE, NATIONAL_DEX_MAREEP, NATIONAL_DEX_SKIPLOOM, NATIONAL_DEX_KOFFING, NATIONAL_DEX_DUGTRIO, NATIONAL_DEX_CASCOON, NATIONAL_DEX_NUMEL, NATIONAL_DEX_ANORITH, NATIONAL_DEX_VOLBEAT, NATIONAL_DEX_HOOTHOOT, NATIONAL_DEX_TRAPINCH, NATIONAL_DEX_SPOINK, NATIONAL_DEX_METAPOD, NATIONAL_DEX_BELLSPROUT, NATIONAL_DEX_SNORUNT, NATIONAL_DEX_RATICATE, NATIONAL_DEX_MARSHTOMP, NATIONAL_DEX_SWELLOW, NATIONAL_DEX_MAGBY, NATIONAL_DEX_GROWLITHE, NATIONAL_DEX_MISDREAVUS, NATIONAL_DEX_BULBASAUR, NATIONAL_DEX_TYROGUE, NATIONAL_DEX_SLUGMA, NATIONAL_DEX_SLAKOTH, NATIONAL_DEX_KIRLIA, NATIONAL_DEX_AIPOM, NATIONAL_DEX_JOLTEON, NATIONAL_DEX_NIDORINA, NATIONAL_DEX_AZUMARILL, NATIONAL_DEX_SHEDINJA, NATIONAL_DEX_MACHOP, NATIONAL_DEX_NINJASK, NATIONAL_DEX_MASQUERAIN, NATIONAL_DEX_DUSKULL, NATIONAL_DEX_SUNFLORA, NATIONAL_DEX_JUMPLUFF, NATIONAL_DEX_STARYU, NATIONAL_DEX_FLAAFFY, NATIONAL_DEX_SPHEAL, NATIONAL_DEX_PSYDUCK, NATIONAL_DEX_MAGCARGO, NATIONAL_DEX_FARFETCHD, NATIONAL_DEX_ZUBAT, NATIONAL_DEX_PORYGON, NATIONAL_DEX_SENTRET, NATIONAL_DEX_CARVANHA, NATIONAL_DEX_GLOOM, NATIONAL_DEX_RAICHU, NATIONAL_DEX_MAGIKARP, NATIONAL_DEX_SNEASEL, NATIONAL_DEX_LAIRON, NATIONAL_DEX_COMBUSKEN, NATIONAL_DEX_OCTILLERY, NATIONAL_DEX_NIDORINO, NATIONAL_DEX_FLAREON, NATIONAL_DEX_DELIBIRD, NATIONAL_DEX_TENTACOOL, NATIONAL_DEX_ABRA, NATIONAL_DEX_GROVYLE, NATIONAL_DEX_WHISCASH, NATIONAL_DEX_QUILAVA, NATIONAL_DEX_ESPEON, NATIONAL_DEX_GRIMER, NATIONAL_DEX_CHIKORITA, NATIONAL_DEX_GRUMPIG, NATIONAL_DEX_NOSEPASS, NATIONAL_DEX_PERSIAN, NATIONAL_DEX_MIGHTYENA, NATIONAL_DEX_VENONAT, NATIONAL_DEX_MAGNETON, NATIONAL_DEX_PONYTA, NATIONAL_DEX_MAKUHITA, NATIONAL_DEX_LUNATONE, NATIONAL_DEX_SANDSLASH, NATIONAL_DEX_DROWZEE, NATIONAL_DEX_TANGELA, NATIONAL_DEX_PRIMEAPE, NATIONAL_DEX_LEDYBA, NATIONAL_DEX_WIGGLYTUFF, NATIONAL_DEX_PARASECT, NATIONAL_DEX_OMASTAR, NATIONAL_DEX_LOUDRED, NATIONAL_DEX_WARTORTLE, NATIONAL_DEX_GRAVELER, NATIONAL_DEX_UMBREON, NATIONAL_DEX_LILEEP, NATIONAL_DEX_POLIWHIRL, NATIONAL_DEX_VAPOREON, NATIONAL_DEX_BEEDRILL, NATIONAL_DEX_MAROWAK, NATIONAL_DEX_WEEPINBELL, NATIONAL_DEX_RELICANTH, NATIONAL_DEX_RHYHORN, NATIONAL_DEX_IVYSAUR, NATIONAL_DEX_KECLEON, NATIONAL_DEX_NUZLEAF, NATIONAL_DEX_BEAUTIFLY, NATIONAL_DEX_PIDGEOTTO, NATIONAL_DEX_ARIADOS, NATIONAL_DEX_SEEL, NATIONAL_DEX_POLITOED, NATIONAL_DEX_CROCONAW, NATIONAL_DEX_CHANSEY, NATIONAL_DEX_BANETTE, NATIONAL_DEX_DONPHAN, NATIONAL_DEX_STARMIE, NATIONAL_DEX_CHARMELEON, NATIONAL_DEX_PILOSWINE, NATIONAL_DEX_BUTTERFREE, NATIONAL_DEX_VIBRAVA, NATIONAL_DEX_ELECTABUZZ, NATIONAL_DEX_CRAWDAUNT, NATIONAL_DEX_DELCATTY, NATIONAL_DEX_ALTARIA, NATIONAL_DEX_SHELGON, NATIONAL_DEX_NINETALES, NATIONAL_DEX_GLIGAR, NATIONAL_DEX_SEALEO, NATIONAL_DEX_SPINDA, NATIONAL_DEX_PUPITAR, NATIONAL_DEX_SLOWPOKE, NATIONAL_DEX_SOLROCK, NATIONAL_DEX_MILTANK, NATIONAL_DEX_FEAROW, NATIONAL_DEX_VILEPLUME, NATIONAL_DEX_MUK, NATIONAL_DEX_FORRETRESS, NATIONAL_DEX_SUDOWOODO, NATIONAL_DEX_ABSOL, NATIONAL_DEX_YANMA, NATIONAL_DEX_DUSTOX, NATIONAL_DEX_LICKITUNG, NATIONAL_DEX_SMEARGLE, NATIONAL_DEX_LANTURN, NATIONAL_DEX_ELECTRODE, NATIONAL_DEX_LOMBRE, NATIONAL_DEX_BRELOOM, NATIONAL_DEX_BAYLEEF, NATIONAL_DEX_SEADRA, NATIONAL_DEX_WEEZING, NATIONAL_DEX_PELIPPER, NATIONAL_DEX_METANG, NATIONAL_DEX_NIDOQUEEN, NATIONAL_DEX_CACTURNE, NATIONAL_DEX_SHIFTRY, NATIONAL_DEX_MEDICHAM, NATIONAL_DEX_ZANGOOSE, NATIONAL_DEX_KABUTOPS, NATIONAL_DEX_KINGLER, NATIONAL_DEX_KADABRA, NATIONAL_DEX_SEAKING, NATIONAL_DEX_CLEFABLE, NATIONAL_DEX_MAGMAR, NATIONAL_DEX_WOBBUFFET, NATIONAL_DEX_GASTLY, NATIONAL_DEX_MR_MIME, NATIONAL_DEX_POLIWRATH, NATIONAL_DEX_TAUROS, NATIONAL_DEX_LATIAS, NATIONAL_DEX_AMPHAROS, NATIONAL_DEX_VIGOROTH, NATIONAL_DEX_LEDIAN, NATIONAL_DEX_GOLEM, NATIONAL_DEX_WALREIN, NATIONAL_DEX_DODUO, NATIONAL_DEX_HOUNDOOM, NATIONAL_DEX_NIDOKING, NATIONAL_DEX_JYNX, NATIONAL_DEX_HITMONCHAN, NATIONAL_DEX_STANTLER, NATIONAL_DEX_GRANBULL, NATIONAL_DEX_HITMONTOP, NATIONAL_DEX_QUAGSIRE, NATIONAL_DEX_CLAYDOL, NATIONAL_DEX_SWAMPERT, NATIONAL_DEX_BLISSEY, NATIONAL_DEX_LUDICOLO, NATIONAL_DEX_EXPLOUD, NATIONAL_DEX_DUNSPARCE, NATIONAL_DEX_PINSIR, NATIONAL_DEX_CLOYSTER, NATIONAL_DEX_MACHOKE, NATIONAL_DEX_GIRAFARIG, NATIONAL_DEX_PIDGEOT, NATIONAL_DEX_XATU, NATIONAL_DEX_CRADILY, NATIONAL_DEX_HITMONLEE, NATIONAL_DEX_VENOMOTH, NATIONAL_DEX_GENGAR, NATIONAL_DEX_HERACROSS, NATIONAL_DEX_GLALIE, NATIONAL_DEX_SCYTHER, NATIONAL_DEX_SALAMENCE, NATIONAL_DEX_MANECTRIC, NATIONAL_DEX_ARMALDO, NATIONAL_DEX_ALAKAZAM, NATIONAL_DEX_HYPNO, NATIONAL_DEX_NOCTOWL, NATIONAL_DEX_TENTACRUEL, NATIONAL_DEX_DUSCLOPS, NATIONAL_DEX_ZAPDOS, NATIONAL_DEX_GOLBAT, NATIONAL_DEX_METAGROSS, NATIONAL_DEX_GARDEVOIR, NATIONAL_DEX_BLASTOISE, NATIONAL_DEX_SLOWBRO, NATIONAL_DEX_HAUNTER, NATIONAL_DEX_MACHAMP, NATIONAL_DEX_REGIROCK, NATIONAL_DEX_SWALOT, NATIONAL_DEX_SCEPTILE, NATIONAL_DEX_SKARMORY, NATIONAL_DEX_GOLDUCK, NATIONAL_DEX_DEOXYS, NATIONAL_DEX_VICTREEBEL, NATIONAL_DEX_RAPIDASH, NATIONAL_DEX_CHARIZARD, NATIONAL_DEX_HUNTAIL, NATIONAL_DEX_DEWGONG, NATIONAL_DEX_ARTICUNO, NATIONAL_DEX_TYPHLOSION, NATIONAL_DEX_AERODACTYL, NATIONAL_DEX_GOREBYSS, NATIONAL_DEX_URSARING, NATIONAL_DEX_MEGANIUM, NATIONAL_DEX_REGICE, NATIONAL_DEX_SCIZOR, NATIONAL_DEX_KINGDRA, NATIONAL_DEX_DRATINI, NATIONAL_DEX_DODRIO, NATIONAL_DEX_SHARPEDO, NATIONAL_DEX_CROBAT, NATIONAL_DEX_FURRET, NATIONAL_DEX_ARCANINE, NATIONAL_DEX_RAIKOU, NATIONAL_DEX_BLAZIKEN, NATIONAL_DEX_CAMERUPT, NATIONAL_DEX_RHYDON, NATIONAL_DEX_REGISTEEL, NATIONAL_DEX_EKANS, NATIONAL_DEX_FLYGON, NATIONAL_DEX_TROPIUS, NATIONAL_DEX_LATIOS, NATIONAL_DEX_SUICUNE, NATIONAL_DEX_MOLTRES, NATIONAL_DEX_VENUSAUR, NATIONAL_DEX_EXEGGUTOR, NATIONAL_DEX_SLOWKING, NATIONAL_DEX_TYRANITAR, NATIONAL_DEX_SLAKING, NATIONAL_DEX_WAILMER, NATIONAL_DEX_MEWTWO, NATIONAL_DEX_AGGRON, NATIONAL_DEX_SNORLAX, NATIONAL_DEX_MANTINE, NATIONAL_DEX_ENTEI, NATIONAL_DEX_DRAGONITE, NATIONAL_DEX_KANGASKHAN, NATIONAL_DEX_HARIYAMA, NATIONAL_DEX_FERALIGATR, NATIONAL_DEX_LAPRAS, NATIONAL_DEX_SEVIPER, NATIONAL_DEX_ARBOK, NATIONAL_DEX_GROUDON, NATIONAL_DEX_HO_OH, NATIONAL_DEX_DRAGONAIR, NATIONAL_DEX_KYOGRE, NATIONAL_DEX_LUGIA, NATIONAL_DEX_MILOTIC, NATIONAL_DEX_GYARADOS, NATIONAL_DEX_RAYQUAZA, NATIONAL_DEX_ONIX, NATIONAL_DEX_STEELIX, NATIONAL_DEX_WAILORD }; const u16 gPokedexOrder_Type[] = { SPECIES_RATTATA, SPECIES_RATICATE, SPECIES_CLEFAIRY, SPECIES_CLEFABLE, SPECIES_JIGGLYPUFF, SPECIES_WIGGLYTUFF, SPECIES_MEOWTH, SPECIES_PERSIAN, SPECIES_LICKITUNG, SPECIES_CHANSEY, SPECIES_KANGASKHAN, SPECIES_TAUROS, SPECIES_DITTO, SPECIES_EEVEE, SPECIES_PORYGON, SPECIES_SNORLAX, SPECIES_SENTRET, SPECIES_FURRET, SPECIES_CLEFFA, SPECIES_IGGLYBUFF, SPECIES_TOGEPI, SPECIES_AIPOM, SPECIES_DUNSPARCE, SPECIES_SNUBBULL, SPECIES_GRANBULL, SPECIES_TEDDIURSA, SPECIES_URSARING, SPECIES_PORYGON2, SPECIES_STANTLER, SPECIES_SMEARGLE, SPECIES_MILTANK, SPECIES_BLISSEY, SPECIES_ZIGZAGOON, SPECIES_LINOONE, SPECIES_SLAKOTH, SPECIES_VIGOROTH, SPECIES_SLAKING, SPECIES_WHISMUR, SPECIES_LOUDRED, SPECIES_EXPLOUD, SPECIES_AZURILL, SPECIES_SKITTY, SPECIES_DELCATTY, SPECIES_SPINDA, SPECIES_ZANGOOSE, SPECIES_CASTFORM, SPECIES_KECLEON, SPECIES_OLD_UNOWN_B, SPECIES_OLD_UNOWN_C, SPECIES_OLD_UNOWN_D, SPECIES_OLD_UNOWN_E, SPECIES_OLD_UNOWN_F, SPECIES_OLD_UNOWN_G, SPECIES_OLD_UNOWN_H, SPECIES_OLD_UNOWN_I, SPECIES_OLD_UNOWN_J, SPECIES_OLD_UNOWN_K, SPECIES_OLD_UNOWN_L, SPECIES_OLD_UNOWN_M, SPECIES_OLD_UNOWN_N, SPECIES_OLD_UNOWN_O, SPECIES_OLD_UNOWN_P, SPECIES_OLD_UNOWN_Q, SPECIES_OLD_UNOWN_R, SPECIES_OLD_UNOWN_S, SPECIES_OLD_UNOWN_T, SPECIES_OLD_UNOWN_U, SPECIES_OLD_UNOWN_V, SPECIES_OLD_UNOWN_W, SPECIES_OLD_UNOWN_X, SPECIES_OLD_UNOWN_Y, SPECIES_OLD_UNOWN_Z, SPECIES_PIDGEY, SPECIES_PIDGEOTTO, SPECIES_PIDGEOT, SPECIES_SPEAROW, SPECIES_FEAROW, SPECIES_FARFETCHD, SPECIES_DODUO, SPECIES_DODRIO, SPECIES_HOOTHOOT, SPECIES_NOCTOWL, SPECIES_TOGETIC, SPECIES_TAILLOW, SPECIES_SWELLOW, SPECIES_SWABLU, SPECIES_GIRAFARIG, SPECIES_MANKEY, SPECIES_PRIMEAPE, SPECIES_MACHOP, SPECIES_MACHOKE, SPECIES_MACHAMP, SPECIES_HITMONLEE, SPECIES_HITMONCHAN, SPECIES_TYROGUE, SPECIES_HITMONTOP, SPECIES_MAKUHITA, SPECIES_HARIYAMA, SPECIES_MEDITITE, SPECIES_MEDICHAM, SPECIES_EKANS, SPECIES_ARBOK, SPECIES_NIDORAN_F, SPECIES_NIDORINA, SPECIES_NIDORAN_M, SPECIES_NIDORINO, SPECIES_GRIMER, SPECIES_MUK, SPECIES_KOFFING, SPECIES_WEEZING, SPECIES_GULPIN, SPECIES_SWALOT, SPECIES_SEVIPER, SPECIES_ZUBAT, SPECIES_GOLBAT, SPECIES_CROBAT, SPECIES_NIDOQUEEN, SPECIES_NIDOKING, SPECIES_SANDSHREW, SPECIES_SANDSLASH, SPECIES_DIGLETT, SPECIES_DUGTRIO, SPECIES_CUBONE, SPECIES_MAROWAK, SPECIES_PHANPY, SPECIES_DONPHAN, SPECIES_TRAPINCH, SPECIES_GROUDON, SPECIES_GLIGAR, SPECIES_RHYHORN, SPECIES_RHYDON, SPECIES_BALTOY, SPECIES_CLAYDOL, SPECIES_VIBRAVA, SPECIES_FLYGON, SPECIES_SUDOWOODO, SPECIES_NOSEPASS, SPECIES_REGIROCK, SPECIES_AERODACTYL, SPECIES_GEODUDE, SPECIES_GRAVELER, SPECIES_GOLEM, SPECIES_ONIX, SPECIES_LARVITAR, SPECIES_PUPITAR, SPECIES_ANORITH, SPECIES_ARMALDO, SPECIES_OMANYTE, SPECIES_OMASTAR, SPECIES_KABUTO, SPECIES_KABUTOPS, SPECIES_LILEEP, SPECIES_CRADILY, SPECIES_LUNATONE, SPECIES_SOLROCK, SPECIES_TYRANITAR, SPECIES_CATERPIE, SPECIES_METAPOD, SPECIES_PINSIR, SPECIES_PINECO, SPECIES_WURMPLE, SPECIES_SILCOON, SPECIES_CASCOON, SPECIES_VOLBEAT, SPECIES_ILLUMISE, SPECIES_HERACROSS, SPECIES_BUTTERFREE, SPECIES_SCYTHER, SPECIES_LEDYBA, SPECIES_LEDIAN, SPECIES_YANMA, SPECIES_BEAUTIFLY, SPECIES_MASQUERAIN, SPECIES_NINJASK, SPECIES_WEEDLE, SPECIES_KAKUNA, SPECIES_BEEDRILL, SPECIES_VENONAT, SPECIES_VENOMOTH, SPECIES_SPINARAK, SPECIES_ARIADOS, SPECIES_DUSTOX, SPECIES_NINCADA, SPECIES_SHUCKLE, SPECIES_SHEDINJA, SPECIES_FORRETRESS, SPECIES_SCIZOR, SPECIES_SURSKIT, SPECIES_PARAS, SPECIES_PARASECT, SPECIES_MISDREAVUS, SPECIES_SHUPPET, SPECIES_BANETTE, SPECIES_DUSKULL, SPECIES_DUSCLOPS, SPECIES_GASTLY, SPECIES_HAUNTER, SPECIES_GENGAR, SPECIES_MAWILE, SPECIES_REGISTEEL, SPECIES_SKARMORY, SPECIES_STEELIX, SPECIES_ARON, SPECIES_LAIRON, SPECIES_AGGRON, SPECIES_BELDUM, SPECIES_METANG, SPECIES_METAGROSS, SPECIES_JIRACHI, SPECIES_CHARMANDER, SPECIES_CHARMELEON, SPECIES_VULPIX, SPECIES_NINETALES, SPECIES_GROWLITHE, SPECIES_ARCANINE, SPECIES_PONYTA, SPECIES_RAPIDASH, SPECIES_MAGMAR, SPECIES_FLAREON, SPECIES_CYNDAQUIL, SPECIES_QUILAVA, SPECIES_TYPHLOSION, SPECIES_SLUGMA, SPECIES_MAGBY, SPECIES_ENTEI, SPECIES_TORCHIC, SPECIES_TORKOAL, SPECIES_COMBUSKEN, SPECIES_BLAZIKEN, SPECIES_CHARIZARD, SPECIES_MOLTRES, SPECIES_HO_OH, SPECIES_NUMEL, SPECIES_CAMERUPT, SPECIES_MAGCARGO, SPECIES_SQUIRTLE, SPECIES_WARTORTLE, SPECIES_BLASTOISE, SPECIES_PSYDUCK, SPECIES_GOLDUCK, SPECIES_POLIWAG, SPECIES_POLIWHIRL, SPECIES_SEEL, SPECIES_SHELLDER, SPECIES_KRABBY, SPECIES_KINGLER, SPECIES_HORSEA, SPECIES_SEADRA, SPECIES_GOLDEEN, SPECIES_SEAKING, SPECIES_STARYU, SPECIES_MAGIKARP, SPECIES_VAPOREON, SPECIES_TOTODILE, SPECIES_CROCONAW, SPECIES_FERALIGATR, SPECIES_MARILL, SPECIES_AZUMARILL, SPECIES_POLITOED, SPECIES_REMORAID, SPECIES_OCTILLERY, SPECIES_SUICUNE, SPECIES_MUDKIP, SPECIES_WAILMER, SPECIES_WAILORD, SPECIES_CORPHISH, SPECIES_FEEBAS, SPECIES_MILOTIC, SPECIES_CLAMPERL, SPECIES_HUNTAIL, SPECIES_GOREBYSS, SPECIES_LUVDISC, SPECIES_KYOGRE, SPECIES_POLIWRATH, SPECIES_GYARADOS, SPECIES_MANTINE, SPECIES_WINGULL, SPECIES_PELIPPER, SPECIES_TENTACOOL, SPECIES_TENTACRUEL, SPECIES_QWILFISH, SPECIES_WOOPER, SPECIES_QUAGSIRE, SPECIES_MARSHTOMP, SPECIES_SWAMPERT, SPECIES_BARBOACH, SPECIES_WHISCASH, SPECIES_CORSOLA, SPECIES_RELICANTH, SPECIES_LOTAD, SPECIES_LOMBRE, SPECIES_LUDICOLO, SPECIES_CHINCHOU, SPECIES_LANTURN, SPECIES_SLOWPOKE, SPECIES_SLOWBRO, SPECIES_STARMIE, SPECIES_SLOWKING, SPECIES_DEWGONG, SPECIES_CLOYSTER, SPECIES_LAPRAS, SPECIES_KINGDRA, SPECIES_CARVANHA, SPECIES_SHARPEDO, SPECIES_CRAWDAUNT, SPECIES_TANGELA, SPECIES_CHIKORITA, SPECIES_BAYLEEF, SPECIES_MEGANIUM, SPECIES_BELLOSSOM, SPECIES_SUNKERN, SPECIES_SUNFLORA, SPECIES_TREECKO, SPECIES_GROVYLE, SPECIES_SCEPTILE, SPECIES_SEEDOT, SPECIES_SHROOMISH, SPECIES_CACNEA, SPECIES_BRELOOM, SPECIES_HOPPIP, SPECIES_SKIPLOOM, SPECIES_JUMPLUFF, SPECIES_TROPIUS, SPECIES_BULBASAUR, SPECIES_IVYSAUR, SPECIES_VENUSAUR, SPECIES_ODDISH, SPECIES_GLOOM, SPECIES_VILEPLUME, SPECIES_BELLSPROUT, SPECIES_WEEPINBELL, SPECIES_VICTREEBEL, SPECIES_ROSELIA, SPECIES_EXEGGCUTE, SPECIES_EXEGGUTOR, SPECIES_NUZLEAF, SPECIES_SHIFTRY, SPECIES_CACTURNE, SPECIES_PIKACHU, SPECIES_RAICHU, SPECIES_VOLTORB, SPECIES_ELECTRODE, SPECIES_ELECTABUZZ, SPECIES_JOLTEON, SPECIES_PICHU, SPECIES_MAREEP, SPECIES_FLAAFFY, SPECIES_AMPHAROS, SPECIES_ELEKID, SPECIES_RAIKOU, SPECIES_ELECTRIKE, SPECIES_MANECTRIC, SPECIES_PLUSLE, SPECIES_MINUN, SPECIES_ZAPDOS, SPECIES_MAGNEMITE, SPECIES_MAGNETON, SPECIES_ABRA, SPECIES_KADABRA, SPECIES_ALAKAZAM, SPECIES_DROWZEE, SPECIES_HYPNO, SPECIES_MR_MIME, SPECIES_MEWTWO, SPECIES_MEW, SPECIES_ESPEON, SPECIES_UNOWN, SPECIES_WOBBUFFET, SPECIES_RALTS, SPECIES_KIRLIA, SPECIES_GARDEVOIR, SPECIES_SPOINK, SPECIES_GRUMPIG, SPECIES_CHIMECHO, SPECIES_WYNAUT, SPECIES_DEOXYS, SPECIES_NATU, SPECIES_XATU, SPECIES_LUGIA, SPECIES_CELEBI, SPECIES_SNORUNT, SPECIES_GLALIE, SPECIES_REGICE, SPECIES_ARTICUNO, SPECIES_DELIBIRD, SPECIES_SWINUB, SPECIES_PILOSWINE, SPECIES_SPHEAL, SPECIES_SEALEO, SPECIES_WALREIN, SPECIES_JYNX, SPECIES_SMOOCHUM, SPECIES_DRATINI, SPECIES_DRAGONAIR, SPECIES_BAGON, SPECIES_SHELGON, SPECIES_DRAGONITE, SPECIES_ALTARIA, SPECIES_SALAMENCE, SPECIES_RAYQUAZA, SPECIES_LATIAS, SPECIES_LATIOS, SPECIES_UMBREON, SPECIES_POOCHYENA, SPECIES_MIGHTYENA, SPECIES_ABSOL, SPECIES_MURKROW, SPECIES_SABLEYE, SPECIES_HOUNDOUR, SPECIES_HOUNDOOM, SPECIES_SNEASEL }; const u16 gPokedexOrder_TypeExtended[] = { SPECIES_RATTATA, SPECIES_RATICATE, SPECIES_CLEFFA, SPECIES_CLEFAIRY, SPECIES_CLEFABLE, SPECIES_IGGLYBUFF, SPECIES_JIGGLYPUFF, SPECIES_WIGGLYTUFF, SPECIES_MEOWTH, SPECIES_PERSIAN, SPECIES_LICKITUNG, SPECIES_CHANSEY, SPECIES_BLISSEY, SPECIES_KANGASKHAN, SPECIES_TAUROS, SPECIES_DITTO, SPECIES_EEVEE, SPECIES_PORYGON, SPECIES_PORYGON2, SPECIES_SNORLAX, SPECIES_SENTRET, SPECIES_FURRET, SPECIES_TOGEPI, SPECIES_AZURILL, SPECIES_AIPOM, SPECIES_DUNSPARCE, SPECIES_SNUBBULL, SPECIES_GRANBULL, SPECIES_TEDDIURSA, SPECIES_URSARING, SPECIES_STANTLER, SPECIES_SMEARGLE, SPECIES_MILTANK, SPECIES_ZIGZAGOON, SPECIES_LINOONE, SPECIES_SLAKOTH, SPECIES_VIGOROTH, SPECIES_SLAKING, SPECIES_WHISMUR, SPECIES_LOUDRED, SPECIES_EXPLOUD, SPECIES_SKITTY, SPECIES_DELCATTY, SPECIES_SPINDA, SPECIES_ZANGOOSE, SPECIES_CASTFORM, SPECIES_KECLEON, SPECIES_OLD_UNOWN_B, SPECIES_OLD_UNOWN_C, SPECIES_OLD_UNOWN_D, SPECIES_OLD_UNOWN_E, SPECIES_OLD_UNOWN_F, SPECIES_OLD_UNOWN_G, SPECIES_OLD_UNOWN_H, SPECIES_OLD_UNOWN_I, SPECIES_OLD_UNOWN_J, SPECIES_OLD_UNOWN_K, SPECIES_OLD_UNOWN_L, SPECIES_OLD_UNOWN_M, SPECIES_OLD_UNOWN_N, SPECIES_OLD_UNOWN_O, SPECIES_OLD_UNOWN_P, SPECIES_OLD_UNOWN_Q, SPECIES_OLD_UNOWN_R, SPECIES_OLD_UNOWN_S, SPECIES_OLD_UNOWN_T, SPECIES_OLD_UNOWN_U, SPECIES_OLD_UNOWN_V, SPECIES_OLD_UNOWN_W, SPECIES_OLD_UNOWN_X, SPECIES_OLD_UNOWN_Y, SPECIES_OLD_UNOWN_Z, SPECIES_PIDGEY, SPECIES_PIDGEOTTO, SPECIES_PIDGEOT, SPECIES_SPEAROW, SPECIES_FEAROW, SPECIES_FARFETCHD, SPECIES_DODUO, SPECIES_DODRIO, SPECIES_HOOTHOOT, SPECIES_NOCTOWL, SPECIES_TOGETIC, SPECIES_TAILLOW, SPECIES_SWELLOW, SPECIES_SWABLU, SPECIES_GIRAFARIG, SPECIES_MANKEY, SPECIES_PRIMEAPE, SPECIES_MACHOP, SPECIES_MACHOKE, SPECIES_MACHAMP, SPECIES_TYROGUE, SPECIES_HITMONLEE, SPECIES_HITMONCHAN, SPECIES_HITMONTOP, SPECIES_MAKUHITA, SPECIES_HARIYAMA, SPECIES_MEDITITE, SPECIES_MEDICHAM, SPECIES_EKANS, SPECIES_ARBOK, SPECIES_NIDORAN_F, SPECIES_NIDORINA, SPECIES_NIDORAN_M, SPECIES_NIDORINO, SPECIES_GRIMER, SPECIES_MUK, SPECIES_KOFFING, SPECIES_WEEZING, SPECIES_GULPIN, SPECIES_SWALOT, SPECIES_SEVIPER, SPECIES_ZUBAT, SPECIES_GOLBAT, SPECIES_CROBAT, SPECIES_NIDOQUEEN, SPECIES_NIDOKING, SPECIES_SANDSHREW, SPECIES_SANDSLASH, SPECIES_DIGLETT, SPECIES_DUGTRIO, SPECIES_CUBONE, SPECIES_MAROWAK, SPECIES_PHANPY, SPECIES_DONPHAN, SPECIES_TRAPINCH, SPECIES_GROUDON, SPECIES_GLIGAR, SPECIES_RHYHORN, SPECIES_RHYDON, SPECIES_BALTOY, SPECIES_CLAYDOL, SPECIES_VIBRAVA, SPECIES_FLYGON, SPECIES_SUDOWOODO, SPECIES_NOSEPASS, SPECIES_REGIROCK, SPECIES_AERODACTYL, SPECIES_GEODUDE, SPECIES_GRAVELER, SPECIES_GOLEM, SPECIES_ONIX, SPECIES_LARVITAR, SPECIES_PUPITAR, SPECIES_ANORITH, SPECIES_ARMALDO, SPECIES_OMANYTE, SPECIES_OMASTAR, SPECIES_KABUTO, SPECIES_KABUTOPS, SPECIES_LILEEP, SPECIES_CRADILY, SPECIES_LUNATONE, SPECIES_SOLROCK, SPECIES_TYRANITAR, SPECIES_CATERPIE, SPECIES_METAPOD, SPECIES_PINSIR, SPECIES_PINECO, SPECIES_WURMPLE, SPECIES_SILCOON, SPECIES_CASCOON, SPECIES_VOLBEAT, SPECIES_ILLUMISE, SPECIES_HERACROSS, SPECIES_BUTTERFREE, SPECIES_SCYTHER, SPECIES_LEDYBA, SPECIES_LEDIAN, SPECIES_YANMA, SPECIES_BEAUTIFLY, SPECIES_MASQUERAIN, SPECIES_NINJASK, SPECIES_WEEDLE, SPECIES_KAKUNA, SPECIES_BEEDRILL, SPECIES_VENONAT, SPECIES_VENOMOTH, SPECIES_SPINARAK, SPECIES_ARIADOS, SPECIES_DUSTOX, SPECIES_NINCADA, SPECIES_SHUCKLE, SPECIES_SHEDINJA, SPECIES_SCIZOR, SPECIES_FORRETRESS, SPECIES_SURSKIT, SPECIES_PARAS, SPECIES_PARASECT, SPECIES_MISDREAVUS, SPECIES_SHUPPET, SPECIES_BANETTE, SPECIES_DUSKULL, SPECIES_DUSCLOPS, SPECIES_GASTLY, SPECIES_HAUNTER, SPECIES_GENGAR, SPECIES_MAWILE, SPECIES_REGISTEEL, SPECIES_SKARMORY, SPECIES_STEELIX, SPECIES_ARON, SPECIES_LAIRON, SPECIES_AGGRON, SPECIES_BELDUM, SPECIES_METANG, SPECIES_METAGROSS, SPECIES_JIRACHI, SPECIES_CHARMANDER, SPECIES_CHARMELEON, SPECIES_VULPIX, SPECIES_NINETALES, SPECIES_GROWLITHE, SPECIES_ARCANINE, SPECIES_PONYTA, SPECIES_RAPIDASH, SPECIES_MAGBY, SPECIES_MAGMAR, SPECIES_FLAREON, SPECIES_CYNDAQUIL, SPECIES_QUILAVA, SPECIES_TYPHLOSION, SPECIES_SLUGMA, SPECIES_ENTEI, SPECIES_TORCHIC, SPECIES_TORKOAL, SPECIES_COMBUSKEN, SPECIES_BLAZIKEN, SPECIES_CHARIZARD, SPECIES_MOLTRES, SPECIES_HO_OH, SPECIES_NUMEL, SPECIES_CAMERUPT, SPECIES_MAGCARGO, SPECIES_SQUIRTLE, SPECIES_WARTORTLE, SPECIES_BLASTOISE, SPECIES_PSYDUCK, SPECIES_GOLDUCK, SPECIES_POLIWAG, SPECIES_POLIWHIRL, SPECIES_POLITOED, SPECIES_SEEL, SPECIES_SHELLDER, SPECIES_KRABBY, SPECIES_KINGLER, SPECIES_HORSEA, SPECIES_SEADRA, SPECIES_GOLDEEN, SPECIES_SEAKING, SPECIES_STARYU, SPECIES_MAGIKARP, SPECIES_VAPOREON, SPECIES_TOTODILE, SPECIES_CROCONAW, SPECIES_FERALIGATR, SPECIES_MARILL, SPECIES_AZUMARILL, SPECIES_REMORAID, SPECIES_OCTILLERY, SPECIES_SUICUNE, SPECIES_MUDKIP, SPECIES_WAILMER, SPECIES_WAILORD, SPECIES_CORPHISH, SPECIES_FEEBAS, SPECIES_MILOTIC, SPECIES_CLAMPERL, SPECIES_HUNTAIL, SPECIES_GOREBYSS, SPECIES_LUVDISC, SPECIES_KYOGRE, SPECIES_POLIWRATH, SPECIES_GYARADOS, SPECIES_MANTINE, SPECIES_WINGULL, SPECIES_PELIPPER, SPECIES_TENTACOOL, SPECIES_TENTACRUEL, SPECIES_QWILFISH, SPECIES_WOOPER, SPECIES_QUAGSIRE, SPECIES_MARSHTOMP, SPECIES_SWAMPERT, SPECIES_BARBOACH, SPECIES_WHISCASH, SPECIES_CORSOLA, SPECIES_RELICANTH, SPECIES_LOTAD, SPECIES_LOMBRE, SPECIES_LUDICOLO, SPECIES_CHINCHOU, SPECIES_LANTURN, SPECIES_SLOWPOKE, SPECIES_SLOWBRO, SPECIES_SLOWKING, SPECIES_STARMIE, SPECIES_DEWGONG, SPECIES_CLOYSTER, SPECIES_LAPRAS, SPECIES_KINGDRA, SPECIES_CARVANHA, SPECIES_SHARPEDO, SPECIES_CRAWDAUNT, SPECIES_BELLOSSOM, SPECIES_TANGELA, SPECIES_CHIKORITA, SPECIES_BAYLEEF, SPECIES_MEGANIUM, SPECIES_SUNKERN, SPECIES_SUNFLORA, SPECIES_TREECKO, SPECIES_GROVYLE, SPECIES_SCEPTILE, SPECIES_SEEDOT, SPECIES_SHROOMISH, SPECIES_CACNEA, SPECIES_BRELOOM, SPECIES_HOPPIP, SPECIES_SKIPLOOM, SPECIES_JUMPLUFF, SPECIES_TROPIUS, SPECIES_BULBASAUR, SPECIES_IVYSAUR, SPECIES_VENUSAUR, SPECIES_ODDISH, SPECIES_GLOOM, SPECIES_VILEPLUME, SPECIES_BELLSPROUT, SPECIES_WEEPINBELL, SPECIES_VICTREEBEL, SPECIES_ROSELIA, SPECIES_EXEGGCUTE, SPECIES_EXEGGUTOR, SPECIES_NUZLEAF, SPECIES_SHIFTRY, SPECIES_CACTURNE, SPECIES_PICHU, SPECIES_PIKACHU, SPECIES_RAICHU, SPECIES_VOLTORB, SPECIES_ELECTRODE, SPECIES_ELEKID, SPECIES_ELECTABUZZ, SPECIES_JOLTEON, SPECIES_MAREEP, SPECIES_FLAAFFY, SPECIES_AMPHAROS, SPECIES_RAIKOU, SPECIES_ELECTRIKE, SPECIES_MANECTRIC, SPECIES_PLUSLE, SPECIES_MINUN, SPECIES_ZAPDOS, SPECIES_MAGNEMITE, SPECIES_MAGNETON, SPECIES_ABRA, SPECIES_KADABRA, SPECIES_ALAKAZAM, SPECIES_DROWZEE, SPECIES_HYPNO, SPECIES_MR_MIME, SPECIES_ESPEON, SPECIES_MEWTWO, SPECIES_MEW, SPECIES_UNOWN, SPECIES_WYNAUT, SPECIES_WOBBUFFET, SPECIES_RALTS, SPECIES_KIRLIA, SPECIES_GARDEVOIR, SPECIES_SPOINK, SPECIES_GRUMPIG, SPECIES_CHIMECHO, SPECIES_DEOXYS, SPECIES_NATU, SPECIES_XATU, SPECIES_LUGIA, SPECIES_CELEBI, SPECIES_SNORUNT, SPECIES_GLALIE, SPECIES_REGICE, SPECIES_ARTICUNO, SPECIES_DELIBIRD, SPECIES_SWINUB, SPECIES_PILOSWINE, SPECIES_SPHEAL, SPECIES_SEALEO, SPECIES_WALREIN, SPECIES_SMOOCHUM, SPECIES_JYNX, SPECIES_DRATINI, SPECIES_DRAGONAIR, SPECIES_BAGON, SPECIES_SHELGON, SPECIES_DRAGONITE, SPECIES_ALTARIA, SPECIES_SALAMENCE, SPECIES_RAYQUAZA, SPECIES_LATIAS, SPECIES_LATIOS, SPECIES_UMBREON, SPECIES_POOCHYENA, SPECIES_MIGHTYENA, SPECIES_ABSOL, SPECIES_MURKROW, SPECIES_SABLEYE, SPECIES_HOUNDOUR, SPECIES_HOUNDOOM, SPECIES_SNEASEL }; ================================================ FILE: src/data/pokemon/pokedex_text_fr.h ================================================ const u8 gDummyPokedexText_FR[] = _( "This is a newly discovered POKéMON. It is\n" "currently under investigation. No detailed\n" "information is available at this time."); const u8 gDummyPokedexTextUnused_FR[] = _(""); const u8 gBulbasaurPokedexText_FR[] = _( "There is a plant seed on its back right\n" "from the day this POKéMON is born.\n" "The seed slowly grows larger."); const u8 gBulbasaurPokedexTextUnused_FR[] = _(""); const u8 gIvysaurPokedexText_FR[] = _( "There is a plant bulb on its back.\n" "When it absorbs nutrients, the bulb is said\n" "to blossom into a large flower."); const u8 gIvysaurPokedexTextUnused_FR[] = _(""); const u8 gVenusaurPokedexText_FR[] = _( "A bewitching aroma wafts from its flower.\n" "The fragrance becalms those engaged in\n" "a battle."); const u8 gVenusaurPokedexTextUnused_FR[] = _(""); const u8 gCharmanderPokedexText_FR[] = _( "From the time it is born, a flame burns\n" "at the tip of its tail. Its life would end\n" "if the flame were to go out."); const u8 gCharmanderPokedexTextUnused_FR[] = _(""); const u8 gCharmeleonPokedexText_FR[] = _( "It lashes about with its tail to knock\n" "down its foe. It then tears up the fallen\n" "opponent with sharp claws."); const u8 gCharmeleonPokedexTextUnused_FR[] = _(""); const u8 gCharizardPokedexText_FR[] = _( "Its wings can carry this POKéMON close to\n" "an altitude of 4,600 feet. It blows out\n" "fire at very high temperatures."); const u8 gCharizardPokedexTextUnused_FR[] = _(""); const u8 gSquirtlePokedexText_FR[] = _( "When it retracts its long neck into its\n" "shell, it squirts out water with vigorous\n" "force."); const u8 gSquirtlePokedexTextUnused_FR[] = _(""); const u8 gWartortlePokedexText_FR[] = _( "This POKéMON is very popular as a pet.\n" "Its fur-covered tail is a symbol of its\n" "longevity."); const u8 gWartortlePokedexTextUnused_FR[] = _(""); const u8 gBlastoisePokedexText_FR[] = _( "It crushes its foe under its heavy body\n" "to cause fainting. In a pinch, it will\n" "withdraw inside its shell."); const u8 gBlastoisePokedexTextUnused_FR[] = _(""); const u8 gCaterpiePokedexText_FR[] = _( "It is covered with a green skin. When it\n" "grows, it sheds the skin, covers itself\n" "with silk, and becomes a cocoon."); const u8 gCaterpiePokedexTextUnused_FR[] = _(""); const u8 gMetapodPokedexText_FR[] = _( "Even though it is encased in a sturdy\n" "shell, the body inside is tender.\n" "It can't withstand a harsh attack."); const u8 gMetapodPokedexTextUnused_FR[] = _(""); const u8 gButterfreePokedexText_FR[] = _( "The wings are protected by rain-repellent\n" "dust. As a result, this POKéMON can fly\n" "about even in rain."); const u8 gButterfreePokedexTextUnused_FR[] = _(""); const u8 gWeedlePokedexText_FR[] = _( "Often found in forests and grasslands.\n" "It has a sharp, toxic barb of around two\n" "inches on top of its head."); const u8 gWeedlePokedexTextUnused_FR[] = _(""); const u8 gKakunaPokedexText_FR[] = _( "This POKéMON is in a temporary stage\n" "while making its body. It is almost\n" "completely unable to move on its own."); const u8 gKakunaPokedexTextUnused_FR[] = _(""); const u8 gBeedrillPokedexText_FR[] = _( "May appear in a swarm. Flies at violent\n" "speeds, all the while stabbing with the\n" "toxic stinger on its rear."); const u8 gBeedrillPokedexTextUnused_FR[] = _(""); const u8 gPidgeyPokedexText_FR[] = _( "Does not like to fight. It hides in\n" "tall grass and so on, foraging for food\n" "such as small bugs."); const u8 gPidgeyPokedexTextUnused_FR[] = _(""); const u8 gPidgeottoPokedexText_FR[] = _( "The claws on its feet are well developed.\n" "It can carry prey such as an EXEGGCUTE\n" "to its nest over 60 miles away."); const u8 gPidgeottoPokedexTextUnused_FR[] = _(""); const u8 gPidgeotPokedexText_FR[] = _( "It spreads its gorgeous wings widely to\n" "intimidate enemies. It races through the\n" "skies at Mach-2 speed."); const u8 gPidgeotPokedexTextUnused_FR[] = _(""); const u8 gRattataPokedexText_FR[] = _( "Its fangs are long and very sharp.\n" "They grow continuously, so it gnaws on\n" "hard things to whittle them down."); const u8 gRattataPokedexTextUnused_FR[] = _(""); const u8 gRaticatePokedexText_FR[] = _( "Its rear feet have three toes each.\n" "They are webbed, enabling it to swim\n" "across rivers."); const u8 gRaticatePokedexTextUnused_FR[] = _(""); const u8 gSpearowPokedexText_FR[] = _( "It busily flits around here and there.\n" "Even if it is frail, it can be a tough\n" "foe that uses MIRROR MOVE."); const u8 gSpearowPokedexTextUnused_FR[] = _(""); const u8 gFearowPokedexText_FR[] = _( "Its huge and magnificent wings can keep it\n" "aloft in the sky. It can remain flying a\n" "whole day without landing."); const u8 gFearowPokedexTextUnused_FR[] = _(""); const u8 gEkansPokedexText_FR[] = _( "A very common sight in grassland, etc.\n" "It flicks its tongue in and out to sense\n" "danger in its surroundings."); const u8 gEkansPokedexTextUnused_FR[] = _(""); const u8 gArbokPokedexText_FR[] = _( "The pattern on its belly appears to be a\n" "frightening face. Weak foes will flee just\n" "at the sight of the pattern."); const u8 gArbokPokedexTextUnused_FR[] = _(""); const u8 gPikachuPokedexText_FR[] = _( "It has small electric sacs on both its\n" "cheeks. If threatened, it looses electric\n" "charges from the sacs."); const u8 gPikachuPokedexTextUnused_FR[] = _(""); const u8 gRaichuPokedexText_FR[] = _( "Its electric charges can reach even\n" "100,000 volts. Careless contact can cause\n" "even an Indian elephant to faint."); const u8 gRaichuPokedexTextUnused_FR[] = _(""); const u8 gSandshrewPokedexText_FR[] = _( "It burrows and lives underground.\n" "If threatened, it curls itself up into a\n" "ball for protection."); const u8 gSandshrewPokedexTextUnused_FR[] = _(""); const u8 gSandslashPokedexText_FR[] = _( "It is adept at attacking with the spines\n" "on its back and its sharp claws while\n" "quickly scurrying about."); const u8 gSandslashPokedexTextUnused_FR[] = _(""); const u8 gNidoranFPokedexText_FR[] = _( "Though small, it must be treated with\n" "caution because of its powerfully toxic\n" "barbs. The female has smaller horns."); const u8 gNidoranFPokedexTextUnused_FR[] = _(""); const u8 gNidorinaPokedexText_FR[] = _( "The female has a gentle temperament.\n" "It emits ultrasonic cries that have the\n" "power to befuddle foes."); const u8 gNidorinaPokedexTextUnused_FR[] = _(""); const u8 gNidoqueenPokedexText_FR[] = _( "The body is covered by stiff, needle-\n" "like scales. If it becomes excited,\n" "the needles bristle outwards."); const u8 gNidoqueenPokedexTextUnused_FR[] = _(""); const u8 gNidoranMPokedexText_FR[] = _( "Its large ears are flapped like wings\n" "when it is listening to distant sounds.\n" "It extends toxic barbs when angered."); const u8 gNidoranMPokedexTextUnused_FR[] = _(""); const u8 gNidorinoPokedexText_FR[] = _( "It is easily angered. By swinging its well-\n" "developed horn wildly, it can even punch\n" "through diamond."); const u8 gNidorinoPokedexTextUnused_FR[] = _(""); const u8 gNidokingPokedexText_FR[] = _( "It is recognized by its rock-hard hide\n" "and its extended horn. Be careful with\n" "the horn as it contains venom."); const u8 gNidokingPokedexTextUnused_FR[] = _(""); const u8 gClefairyPokedexText_FR[] = _( "Its adorable appearance makes it popular\n" "as a pet. However, it is rare and\n" "difficult to find."); const u8 gClefairyPokedexTextUnused_FR[] = _(""); const u8 gClefablePokedexText_FR[] = _( "It has an acute sense of hearing. It can\n" "easily hear a pin being dropped nearly\n" "1,100 yards away."); const u8 gClefablePokedexTextUnused_FR[] = _(""); const u8 gVulpixPokedexText_FR[] = _( "While young, it has six gorgeous tails.\n" "When it grows, several new tails are\n" "sprouted."); const u8 gVulpixPokedexTextUnused_FR[] = _(""); const u8 gNinetalesPokedexText_FR[] = _( "It has nine long tails and fur that \n" "gleams gold. It is said to live for \n" "1,000 years."); const u8 gNinetalesPokedexTextUnused_FR[] = _(""); const u8 gJigglypuffPokedexText_FR[] = _( "It captivates foes with its huge, round\n" "eyes, then lulls them to sleep by singing\n" "a soothing melody."); const u8 gJigglypuffPokedexTextUnused_FR[] = _(""); const u8 gWigglytuffPokedexText_FR[] = _( "Its fur is extremely fine, dense, and\n" "supple. The exquisitely pleasant fur\n" "conveys an image of luxury."); const u8 gWigglytuffPokedexTextUnused_FR[] = _(""); const u8 gZubatPokedexText_FR[] = _( "It has no eyes. Instead, it relies on\n" "its ultrasonic cries for echo location to\n" "flit about in darkness."); const u8 gZubatPokedexTextUnused_FR[] = _(""); const u8 gGolbatPokedexText_FR[] = _( "It clamps down on its prey with needle-\n" "sharp fangs and drains over 10 ounces of\n" "blood in one gulp."); const u8 gGolbatPokedexTextUnused_FR[] = _(""); const u8 gOddishPokedexText_FR[] = _( "Its scientific name is “Oddium Wanderus.”\n" "At night, it is said to walk nearly 1,000\n" "feet on its two roots."); const u8 gOddishPokedexTextUnused_FR[] = _(""); const u8 gGloomPokedexText_FR[] = _( "Its pistils exude an incredibly foul odor.\n" "The horrid stench can cause fainting at a\n" "distance of 1.25 miles."); const u8 gGloomPokedexTextUnused_FR[] = _(""); const u8 gVileplumePokedexText_FR[] = _( "Its petals are the largest in the world.\n" "It fiendishly scatters allergy-causing\n" "pollen from its petals."); const u8 gVileplumePokedexTextUnused_FR[] = _(""); const u8 gParasPokedexText_FR[] = _( "Growing out of the bug's back are\n" "mushrooms called tochukaso. The mushrooms\n" "grow with the bug host."); const u8 gParasPokedexTextUnused_FR[] = _(""); const u8 gParasectPokedexText_FR[] = _( "It scatters toxic spores from the\n" "mushroom cap. In China, the spores are\n" "used as herbal medicine."); const u8 gParasectPokedexTextUnused_FR[] = _(""); const u8 gVenonatPokedexText_FR[] = _( "Its eyes act as radar, enabling it to be\n" "active in darkness. The eyes can also\n" "shoot powerful beams."); const u8 gVenonatPokedexTextUnused_FR[] = _(""); const u8 gVenomothPokedexText_FR[] = _( "The wings are covered with dustlike\n" "scales. Every time it flaps its wings, it\n" "looses highly toxic dust."); const u8 gVenomothPokedexTextUnused_FR[] = _(""); const u8 gDiglettPokedexText_FR[] = _( "It burrows through the ground at a\n" "shallow depth. It leaves raised earth in\n" "its wake, making it easy to spot."); const u8 gDiglettPokedexTextUnused_FR[] = _(""); const u8 gDugtrioPokedexText_FR[] = _( "In battle, it digs through the ground and\n" "strikes the unsuspecting foe from an\n" "unexpected direction."); const u8 gDugtrioPokedexTextUnused_FR[] = _(""); const u8 gMeowthPokedexText_FR[] = _( "All it does is sleep during the daytime.\n" "At night, it patrols its territory with its\n" "eyes aglow."); const u8 gMeowthPokedexTextUnused_FR[] = _(""); const u8 gPersianPokedexText_FR[] = _( "Has a vicious temperament. Beware if it\n" "raises its tail straight up. It is a signal\n" "that it is about to pounce and bite."); const u8 gPersianPokedexTextUnused_FR[] = _(""); const u8 gPsyduckPokedexText_FR[] = _( "It is constantly wracked by a headache.\n" "When the headache turns intense, it begins\n" "using mysterious powers."); const u8 gPsyduckPokedexTextUnused_FR[] = _(""); const u8 gGolduckPokedexText_FR[] = _( "The forelegs are webbed, helping to make\n" "it an adept swimmer. It can be seen\n" "swimming elegantly in lakes, etc."); const u8 gGolduckPokedexTextUnused_FR[] = _(""); const u8 gMankeyPokedexText_FR[] = _( "Light and agile on its feet, and ferocious\n" "in temperament. When angered, it flies into\n" "an uncontrollable frenzy."); const u8 gMankeyPokedexTextUnused_FR[] = _(""); const u8 gPrimeapePokedexText_FR[] = _( "It is always outrageously furious. If it\n" "gives chase, it will tenaciously track the\n" "target no matter how far."); const u8 gPrimeapePokedexTextUnused_FR[] = _(""); const u8 gGrowlithePokedexText_FR[] = _( "Very friendly and faithful to people.\n" "It will try to repel enemies by barking\n" "and biting."); const u8 gGrowlithePokedexTextUnused_FR[] = _(""); const u8 gArcaninePokedexText_FR[] = _( "A POKéMON that is described in Chinese\n" "legends. It is said to race at an\n" "unbelievable speed."); const u8 gArcaninePokedexTextUnused_FR[] = _(""); const u8 gPoliwagPokedexText_FR[] = _( "Its slick black skin is thin and damp.\n" "A part of its internal organs can be seen\n" "through the skin as a spiral pattern."); const u8 gPoliwagPokedexTextUnused_FR[] = _(""); const u8 gPoliwhirlPokedexText_FR[] = _( "Its two legs are well developed.\n" "Even though it can live on the ground,\n" "it prefers living in water."); const u8 gPoliwhirlPokedexTextUnused_FR[] = _(""); const u8 gPoliwrathPokedexText_FR[] = _( "An adept swimmer, it knows the front\n" "crawl, butterfly, and more. It is faster\n" "than the best human swimmers."); const u8 gPoliwrathPokedexTextUnused_FR[] = _(""); const u8 gAbraPokedexText_FR[] = _( "It sleeps for 18 hours a day. It uses a\n" "variety of extrasensory powers even\n" "while asleep."); const u8 gAbraPokedexTextUnused_FR[] = _(""); const u8 gKadabraPokedexText_FR[] = _( "It happened one morning - a boy with\n" "extrasensory powers awoke in bed\n" "transformed into KADABRA."); const u8 gKadabraPokedexTextUnused_FR[] = _(""); const u8 gAlakazamPokedexText_FR[] = _( "It does not like physical attacks very \n" "much. Instead, it freely uses extra-\n" "sensory powers to defeat foes."); const u8 gAlakazamPokedexTextUnused_FR[] = _(""); const u8 gMachopPokedexText_FR[] = _( "Its whole body is composed of muscles.\n" "Even though it's the size of a human\n" "child, it can hurl 100 grown-ups."); const u8 gMachopPokedexTextUnused_FR[] = _(""); const u8 gMachokePokedexText_FR[] = _( "Its formidable body never gets tired.\n" "It helps people by doing work such as\n" "the moving of heavy goods."); const u8 gMachokePokedexTextUnused_FR[] = _(""); const u8 gMachampPokedexText_FR[] = _( "Its four ruggedly developed arms can\n" "launch a flurry of 1,000 punches in just\n" "two seconds."); const u8 gMachampPokedexTextUnused_FR[] = _(""); const u8 gBellsproutPokedexText_FR[] = _( "Its bud looks like a human face. Because\n" "of the bud, it is rumored to be a type of\n" "legendary mandrake plant."); const u8 gBellsproutPokedexTextUnused_FR[] = _(""); const u8 gWeepinbellPokedexText_FR[] = _( "The leafy parts act as cutters for\n" "slashing foes. It spits a fluid that\n" "dissolves everything."); const u8 gWeepinbellPokedexTextUnused_FR[] = _(""); const u8 gVictreebelPokedexText_FR[] = _( "Lures prey into its mouth with a honeylike\n" "aroma. The helpless prey is melted with\n" "a dissolving fluid."); const u8 gVictreebelPokedexTextUnused_FR[] = _(""); const u8 gTentacoolPokedexText_FR[] = _( "Its eyes are as transparent as crystals.\n" "From them, it shoots mysterious\n" "beams of light."); const u8 gTentacoolPokedexTextUnused_FR[] = _(""); const u8 gTentacruelPokedexText_FR[] = _( "It has 80 tentacles that move about\n" "freely. They can sting, causing poisoning\n" "and sharp, stabbing pain."); const u8 gTentacruelPokedexTextUnused_FR[] = _(""); const u8 gGeodudePokedexText_FR[] = _( "Its round form makes it easy to pick up.\n" "Some people have used them to hurl\n" "at each other in a snowball fight."); const u8 gGeodudePokedexTextUnused_FR[] = _(""); const u8 gGravelerPokedexText_FR[] = _( "Be careful while hiking on mountain trails.\n" "GRAVELER may come rolling down the path\n" "without slowing."); const u8 gGravelerPokedexTextUnused_FR[] = _(""); const u8 gGolemPokedexText_FR[] = _( "It is enclosed in a hard shell that is as\n" "rugged as slabs of rock. It sheds skin\n" "once a year to grow larger."); const u8 gGolemPokedexTextUnused_FR[] = _(""); const u8 gPonytaPokedexText_FR[] = _( "Its body is light, and its legs are\n" "incredibly powerful. It can clear\n" "Ayers Rock in one leap."); const u8 gPonytaPokedexTextUnused_FR[] = _(""); const u8 gRapidashPokedexText_FR[] = _( "It can gallop at a top speed of 150\n" "miles per hour. It can race as fast as a\n" "bullet train while ablaze."); const u8 gRapidashPokedexTextUnused_FR[] = _(""); const u8 gSlowpokePokedexText_FR[] = _( "It is always vacantly lost in thought, but\n" "no one knows what it is thinking about.\n" "It is good at fishing with its tail."); const u8 gSlowpokePokedexTextUnused_FR[] = _(""); const u8 gSlowbroPokedexText_FR[] = _( "When a SLOWPOKE went hunting in the sea,\n" "its tail was bitten by a SHELLDER. That\n" "made it evolve into SLOWBRO."); const u8 gSlowbroPokedexTextUnused_FR[] = _(""); const u8 gMagnemitePokedexText_FR[] = _( "It moves while constantly hovering.\n" "It discharges THUNDER WAVE and so on\n" "from the units at its sides."); const u8 gMagnemitePokedexTextUnused_FR[] = _(""); const u8 gMagnetonPokedexText_FR[] = _( "A linked cluster formed of several\n" "MAGNEMITE. It discharges powerful\n" "magnetic waves at high voltage."); const u8 gMagnetonPokedexTextUnused_FR[] = _(""); const u8 gFarfetchdPokedexText_FR[] = _( "It always walks about with a plant stalk\n" "clamped in its beak. The stalk is used for\n" "building its nest."); const u8 gFarfetchdPokedexTextUnused_FR[] = _(""); const u8 gDoduoPokedexText_FR[] = _( "A two-headed POKéMON that was discovered\n" "as a sudden mutation. It runs at a pace\n" "of over 60 miles per hour."); const u8 gDoduoPokedexTextUnused_FR[] = _(""); const u8 gDodrioPokedexText_FR[] = _( "An odd species that is rarely found.\n" "The three heads respectively represent\n" "joy, sadness, and anger."); const u8 gDodrioPokedexTextUnused_FR[] = _(""); const u8 gSeelPokedexText_FR[] = _( "Covered with light blue fur, its hide is\n" "thick and tough. It is active in bitter\n" "cold of minus 40 degrees Fahrenheit."); const u8 gSeelPokedexTextUnused_FR[] = _(""); const u8 gDewgongPokedexText_FR[] = _( "Its body is covered with a pure white\n" "fur. The colder the weather, the more\n" "active it becomes."); const u8 gDewgongPokedexTextUnused_FR[] = _(""); const u8 gGrimerPokedexText_FR[] = _( "Sludge exposed to X rays from the moon\n" "transformed into GRIMER. It loves feeding\n" "on filthy things."); const u8 gGrimerPokedexTextUnused_FR[] = _(""); const u8 gMukPokedexText_FR[] = _( "It is usually undetectable because it\n" "blends in with the ground. Touching it can\n" "cause terrible poisoning."); const u8 gMukPokedexTextUnused_FR[] = _(""); const u8 gShellderPokedexText_FR[] = _( "It is encased in a shell that is harder\n" "than diamond. Inside, however, it is\n" "surprisingly tender."); const u8 gShellderPokedexTextUnused_FR[] = _(""); const u8 gCloysterPokedexText_FR[] = _( "Its shell is extremely hard. It cannot be\n" "shattered, even with a bomb. The shell\n" "opens only when it is attacking."); const u8 gCloysterPokedexTextUnused_FR[] = _(""); const u8 gGastlyPokedexText_FR[] = _( "A being that exists as a thin gas. It can\n" "topple an Indian elephant by enveloping\n" "the prey in two seconds."); const u8 gGastlyPokedexTextUnused_FR[] = _(""); const u8 gHaunterPokedexText_FR[] = _( "If you get the feeling of being watched\n" "in darkness when nobody is around,\n" "HAUNTER is there."); const u8 gHaunterPokedexTextUnused_FR[] = _(""); const u8 gGengarPokedexText_FR[] = _( "It is said to emerge from darkness to\n" "steal the lives of those who become lost\n" "in mountains."); const u8 gGengarPokedexTextUnused_FR[] = _(""); const u8 gOnixPokedexText_FR[] = _( "It usually lives underground. It searches\n" "for food while boring its way through the\n" "ground at 50 miles per hour."); const u8 gOnixPokedexTextUnused_FR[] = _(""); const u8 gDrowzeePokedexText_FR[] = _( "A descendent of the legendary animal\n" "baku, which is said to eat dreams. It is\n" "skilled at hypnotism."); const u8 gDrowzeePokedexTextUnused_FR[] = _(""); const u8 gHypnoPokedexText_FR[] = _( "It carries a pendulum-like device. There\n" "once was an incident in which it took \n" "away a child it hypnotized."); const u8 gHypnoPokedexTextUnused_FR[] = _(""); const u8 gKrabbyPokedexText_FR[] = _( "It can be found near the sea. The large\n" "pincers grow back if they are torn out of\n" "their sockets."); const u8 gKrabbyPokedexTextUnused_FR[] = _(""); const u8 gKinglerPokedexText_FR[] = _( "Its large and hard pincer has 10,000-\n" "horsepower strength. However, being so\n" "big, it is unwieldy to move."); const u8 gKinglerPokedexTextUnused_FR[] = _(""); const u8 gVoltorbPokedexText_FR[] = _( "A life-form whose identity is unknown.\n" "It is said to SCREECH or suddenly\n" "SELFDESTRUCT."); const u8 gVoltorbPokedexTextUnused_FR[] = _(""); const u8 gElectrodePokedexText_FR[] = _( "It explodes in response to even minor\n" "stimuli. It is feared, with the nickname\n" "of “The Bomb Ball.”"); const u8 gElectrodePokedexTextUnused_FR[] = _(""); const u8 gExeggcutePokedexText_FR[] = _( "Even though it appears to be eggs of\n" "some sort, it was discovered to be a life-\n" "form more like plant seeds."); const u8 gExeggcutePokedexTextUnused_FR[] = _(""); const u8 gExeggutorPokedexText_FR[] = _( "It is called “The Walking Tropical\n" "Rainforest.” Each of the nuts has\n" "a face and a will of its own."); const u8 gExeggutorPokedexTextUnused_FR[] = _(""); const u8 gCubonePokedexText_FR[] = _( "It wears the skull of its dead mother on\n" "its head. When it becomes lonesome, it is\n" "said to cry loudly."); const u8 gCubonePokedexTextUnused_FR[] = _(""); const u8 gMarowakPokedexText_FR[] = _( "It is small and was originally very weak.\n" "Its temperament turned ferocious when it\n" "began using bones."); const u8 gMarowakPokedexTextUnused_FR[] = _(""); const u8 gHitmonleePokedexText_FR[] = _( "The legs freely contract and stretch.\n" "The stretchy legs allow it to hit a\n" "distant foe with a rising kick."); const u8 gHitmonleePokedexTextUnused_FR[] = _(""); const u8 gHitmonchanPokedexText_FR[] = _( "The spirit of a pro boxer has infused this\n" "POKéMON. It throws punches that are\n" "faster than a bullet train."); const u8 gHitmonchanPokedexTextUnused_FR[] = _(""); const u8 gLickitungPokedexText_FR[] = _( "Its tongue is twice the length of its\n" "body. It can be moved like an arm for\n" "grabbing food and attacking."); const u8 gLickitungPokedexTextUnused_FR[] = _(""); const u8 gKoffingPokedexText_FR[] = _( "Its thin, balloon-like body is inflated by\n" "horribly toxic gases. It reeks when it is\n" "nearby."); const u8 gKoffingPokedexTextUnused_FR[] = _(""); const u8 gWeezingPokedexText_FR[] = _( "Very rarely, a sudden mutation can result\n" "in two small KOFFING twins becoming\n" "conjoined as a WEEZING."); const u8 gWeezingPokedexTextUnused_FR[] = _(""); const u8 gRhyhornPokedexText_FR[] = _( "Strong, but not too bright, this POKéMON\n" "can shatter even a skyscraper with its\n" "charging TACKLES."); const u8 gRhyhornPokedexTextUnused_FR[] = _(""); const u8 gRhydonPokedexText_FR[] = _( "It begins walking on its hind legs after\n" "evolution. It can punch holes through\n" "boulders with its horn."); const u8 gRhydonPokedexTextUnused_FR[] = _(""); const u8 gChanseyPokedexText_FR[] = _( "It lays several eggs a day. The eggs are\n" "apparently rich in nutrients and extremely\n" "delicious."); const u8 gChanseyPokedexTextUnused_FR[] = _(""); const u8 gTangelaPokedexText_FR[] = _( "Blue plant vines cloak the POKéMON's\n" "identity in a tangled mass. It entangles\n" "anything that gets close."); const u8 gTangelaPokedexTextUnused_FR[] = _(""); const u8 gKangaskhanPokedexText_FR[] = _( "The female raises its offspring in a pouch\n" "on its belly. It is skilled at attacking\n" "using COMET PUNCH."); const u8 gKangaskhanPokedexTextUnused_FR[] = _(""); const u8 gHorseaPokedexText_FR[] = _( "It maintains balance using its tail, which\n" "is wound up like a coil. It may spray ink\n" "from its mouth."); const u8 gHorseaPokedexTextUnused_FR[] = _(""); const u8 gSeadraPokedexText_FR[] = _( "Its body bristles with sharp spikes.\n" "Carelessly trying to touch it could cause\n" "fainting from the spikes."); const u8 gSeadraPokedexTextUnused_FR[] = _(""); const u8 gGoldeenPokedexText_FR[] = _( "Its dorsal and pectoral fins are strongly\n" "developed like muscles. It can swim at a\n" "speed of five knots."); const u8 gGoldeenPokedexTextUnused_FR[] = _(""); const u8 gSeakingPokedexText_FR[] = _( "The horn on its head is sharp like a\n" "drill. It bores a hole in a boulder to\n" "make its nest."); const u8 gSeakingPokedexTextUnused_FR[] = _(""); const u8 gStaryuPokedexText_FR[] = _( "It appears in large numbers by seashores.\n" "At night, its central core flashes with a\n" "red light."); const u8 gStaryuPokedexTextUnused_FR[] = _(""); const u8 gStarmiePokedexText_FR[] = _( "This POKéMON has a geometric body.\n" "Because of its body, the locals suspect\n" "that it is an alien creature."); const u8 gStarmiePokedexTextUnused_FR[] = _(""); const u8 gMrmimePokedexText_FR[] = _( "It is adept at conning people. It is said\n" "to be able to create walls out of thin\n" "air by miming."); const u8 gMrmimePokedexTextUnused_FR[] = _(""); const u8 gScytherPokedexText_FR[] = _( "It tears and shreds prey with its wickedly\n" "sharp scythes. It very rarely spreads its\n" "wings to fly."); const u8 gScytherPokedexTextUnused_FR[] = _(""); const u8 gJynxPokedexText_FR[] = _( "It speaks using a language that sounds\n" "human. Research is under way to determine\n" "what is being said."); const u8 gJynxPokedexTextUnused_FR[] = _(""); const u8 gElectabuzzPokedexText_FR[] = _( "It loves to feed on strong electricity.\n" "It occasionally appears around large\n" "power plants and so on."); const u8 gElectabuzzPokedexTextUnused_FR[] = _(""); const u8 gMagmarPokedexText_FR[] = _( "Found near the mouth of a volcano.\n" "This fire-breather's body temperature is\n" "nearly 2,200 degrees Fahrenheit."); const u8 gMagmarPokedexTextUnused_FR[] = _(""); const u8 gPinsirPokedexText_FR[] = _( "Its two long pincer horns are powerful.\n" "Once they grip an enemy, they won't\n" "release until the foe is torn."); const u8 gPinsirPokedexTextUnused_FR[] = _(""); const u8 gTaurosPokedexText_FR[] = _( "When it is about to TACKLE, it whips\n" "its body repeatedly with its three\n" "long tails."); const u8 gTaurosPokedexTextUnused_FR[] = _(""); const u8 gMagikarpPokedexText_FR[] = _( "It is virtually worthless in terms of both\n" "power and speed. It is the most weak and\n" "pathetic POKéMON in the world."); const u8 gMagikarpPokedexTextUnused_FR[] = _(""); const u8 gGyaradosPokedexText_FR[] = _( "It has an extremely aggressive nature.\n" "The HYPER BEAM it shoots from its mouth\n" "totally incinerates all targets."); const u8 gGyaradosPokedexTextUnused_FR[] = _(""); const u8 gLaprasPokedexText_FR[] = _( "Its high intelligence enables it to\n" "understand human speech. It likes to ferry\n" "people on its back."); const u8 gLaprasPokedexTextUnused_FR[] = _(""); const u8 gDittoPokedexText_FR[] = _( "It can freely recombine its own cellular\n" "structure to transform into other life-\n" "forms."); const u8 gDittoPokedexTextUnused_FR[] = _(""); const u8 gEeveePokedexText_FR[] = _( "An extremely rare POKéMON that may\n" "evolve in a number of different ways\n" "depending on stimuli."); const u8 gEeveePokedexTextUnused_FR[] = _(""); const u8 gVaporeonPokedexText_FR[] = _( "Its body's cellular structure is similar to\n" "the molecular composition of water.\n" "It can melt invisibly in water."); const u8 gVaporeonPokedexTextUnused_FR[] = _(""); const u8 gJolteonPokedexText_FR[] = _( "If it is angered or startled, the fur all\n" "over its body bristles like sharp needles\n" "that pierce foes."); const u8 gJolteonPokedexTextUnused_FR[] = _(""); const u8 gFlareonPokedexText_FR[] = _( "It has a flame bag inside its body. After\n" "inhaling deeply, it blows out flames of\n" "nearly 3,100 degrees Fahrenheit."); const u8 gFlareonPokedexTextUnused_FR[] = _(""); const u8 gPorygonPokedexText_FR[] = _( "Using the most advanced technologies,\n" "scientists finally succeeded in making the\n" "first artificial POKéMON."); const u8 gPorygonPokedexTextUnused_FR[] = _(""); const u8 gOmanytePokedexText_FR[] = _( "A prehistoric POKéMON that lived in the\n" "primordial sea, it swims by twisting its\n" "10 tentacles about."); const u8 gOmanytePokedexTextUnused_FR[] = _(""); const u8 gOmastarPokedexText_FR[] = _( "Its tentacles are highly developed as if\n" "they are hands and feet. As soon as it\n" "ensnares prey, it bites."); const u8 gOmastarPokedexTextUnused_FR[] = _(""); const u8 gKabutoPokedexText_FR[] = _( "This POKéMON was regenerated from the\n" "fossil of an ancient creature. It protects\n" "itself with a hard shell."); const u8 gKabutoPokedexTextUnused_FR[] = _(""); const u8 gKabutopsPokedexText_FR[] = _( "It swims freely through water. It catches\n" "prey with its scythe-like arms and drains\n" "the victim's fluids."); const u8 gKabutopsPokedexTextUnused_FR[] = _(""); const u8 gAerodactylPokedexText_FR[] = _( "It was regenerated from a dinosaur's\n" "genetic matter that was found in amber.\n" "It flies with high-pitched cries."); const u8 gAerodactylPokedexTextUnused_FR[] = _(""); const u8 gSnorlaxPokedexText_FR[] = _( "It is not satisfied unless it eats over 880\n" "pounds of food every day. When it is done\n" "eating, it goes promptly to sleep."); const u8 gSnorlaxPokedexTextUnused_FR[] = _(""); const u8 gArticunoPokedexText_FR[] = _( "One of the legendary bird POKéMON.\n" "With its long tail trailing behind, its\n" "flying form is magnificent."); const u8 gArticunoPokedexTextUnused_FR[] = _(""); const u8 gZapdosPokedexText_FR[] = _( "One of the legendary bird POKéMON.\n" "While it is flying, it makes crackling and\n" "snapping sounds."); const u8 gZapdosPokedexTextUnused_FR[] = _(""); const u8 gMoltresPokedexText_FR[] = _( "One of the legendary bird POKéMON.\n" "Those seeing it are overwhelmed by its\n" "orange wings that seem to be on fire."); const u8 gMoltresPokedexTextUnused_FR[] = _(""); const u8 gDratiniPokedexText_FR[] = _( "Even the young can exceed 6.5 feet in\n" "length. It grows larger by repeatedly\n" "shedding skin."); const u8 gDratiniPokedexTextUnused_FR[] = _(""); const u8 gDragonairPokedexText_FR[] = _( "It is said to live in seas and lakes.\n" "Even though it has no wings, it has been\n" "seen flying occasionally."); const u8 gDragonairPokedexTextUnused_FR[] = _(""); const u8 gDragonitePokedexText_FR[] = _( "It can fly in spite of its big and bulky\n" "physique. It circles the globe in just\n" "16 hours."); const u8 gDragonitePokedexTextUnused_FR[] = _(""); const u8 gMewtwoPokedexText_FR[] = _( "A POKéMON whose genetic code was\n" "repeatedly recombined for research.\n" "It turned vicious as a result."); const u8 gMewtwoPokedexTextUnused_FR[] = _(""); const u8 gMewPokedexText_FR[] = _( "A POKéMON of South America that was\n" "thought to have been extinct. It is very\n" "intelligent and learns any move."); const u8 gMewPokedexTextUnused_FR[] = _(""); const u8 gChikoritaPokedexText_FR[] = _( "Its pleasantly aromatic leaf has the\n" "ability to check the humidity and\n" "temperature." ); const u8 gChikoritaPokedexTextUnused_FR[] = _(""); const u8 gBayleefPokedexText_FR[] = _( "A spicy aroma emanates from around its\n" "neck. The aroma acts as a stimulant to\n" "restore health."); const u8 gBayleefPokedexTextUnused_FR[] = _(""); const u8 gMeganiumPokedexText_FR[] = _( "MEGANIUM's breath has the power to revive\n" "dead grass and plants. It can make them\n" "healthy again."); const u8 gMeganiumPokedexTextUnused_FR[] = _(""); const u8 gCyndaquilPokedexText_FR[] = _( "It usually stays hunched over. If it is\n" "angry or surprised, it shoots flames out\n" "of its back."); const u8 gCyndaquilPokedexTextUnused_FR[] = _(""); const u8 gQuilavaPokedexText_FR[] = _( "This POKéMON is fully covered by\n" "nonflammable fur. It can withstand any\n" "kind of fire attack."); const u8 gQuilavaPokedexTextUnused_FR[] = _(""); const u8 gTyphlosionPokedexText_FR[] = _( "It has a secret, devastating move. It\n" "rubs its blazing fur together to cause\n" "huge explosions."); const u8 gTyphlosionPokedexTextUnused_FR[] = _(""); const u8 gTotodilePokedexText_FR[] = _( "It is small but rough and tough. It won't\n" "hesitate to take a bite out of anything\n" "that moves."); const u8 gTotodilePokedexTextUnused_FR[] = _(""); const u8 gCroconawPokedexText_FR[] = _( "It opens its huge jaws wide when\n" "attacking. If it loses any fangs while\n" "biting, they grow back in."); const u8 gCroconawPokedexTextUnused_FR[] = _(""); const u8 gFeraligatrPokedexText_FR[] = _( "It is hard for it to support its own\n" "weight out of water, so it gets down on\n" "all fours. But it moves fast."); const u8 gFeraligatrPokedexTextUnused_FR[] = _(""); const u8 gSentretPokedexText_FR[] = _( "It stands on its tail so it can see a long\n" "way. If it spots an enemy, it cries loudly\n" "to warn its kind."); const u8 gSentretPokedexTextUnused_FR[] = _(""); const u8 gFurretPokedexText_FR[] = _( "There is no telling where its tail begins.\n" "Despite its short legs, it is quick at\n" "hunting RATTATA."); const u8 gFurretPokedexTextUnused_FR[] = _(""); const u8 gHoothootPokedexText_FR[] = _( "It has a perfect sense of time. Whatever\n" "happens, it keeps rhythm by precisely\n" "tilting its head in time."); const u8 gHoothootPokedexTextUnused_FR[] = _(""); const u8 gNoctowlPokedexText_FR[] = _( "When it needs to think, it rotates its head\n" "180 degrees to sharpen its intellectual\n" "power."); const u8 gNoctowlPokedexTextUnused_FR[] = _(""); const u8 gLedybaPokedexText_FR[] = _( "When the weather turns cold, numerous\n" "LEDYBA gather from everywhere to cluster\n" "and keep each other warm."); const u8 gLedybaPokedexTextUnused_FR[] = _(""); const u8 gLedianPokedexText_FR[] = _( "The star patterns on its back grow larger\n" "or smaller depending on the number of\n" "stars in the night sky."); const u8 gLedianPokedexTextUnused_FR[] = _(""); const u8 gSpinarakPokedexText_FR[] = _( "It spins a web using fine--but durable--\n" "thread. It then waits patiently for prey\n" "to be trapped."); const u8 gSpinarakPokedexTextUnused_FR[] = _(""); const u8 gAriadosPokedexText_FR[] = _( "A single strand of a special string is\n" "endlessly spun out of its rear. The string\n" "leads back to its nest."); const u8 gAriadosPokedexTextUnused_FR[] = _(""); const u8 gCrobatPokedexText_FR[] = _( "The development of wings on its legs\n" "enables it to fly fast but also makes it\n" "tough to stop and rest."); const u8 gCrobatPokedexTextUnused_FR[] = _(""); const u8 gChinchouPokedexText_FR[] = _( "On the dark ocean floor, its only means\n" "of communication is its constantly\n" "flashing lights."); const u8 gChinchouPokedexTextUnused_FR[] = _(""); const u8 gLanturnPokedexText_FR[] = _( "It blinds prey with an intense burst of\n" "light, then swallows the immobilized prey\n" "in a single gulp."); const u8 gLanturnPokedexTextUnused_FR[] = _(""); const u8 gPichuPokedexText_FR[] = _( "Despite its small size, it can zap even\n" "adult humans. However, if it does so, it\n" "also surprises itself."); const u8 gPichuPokedexTextUnused_FR[] = _(""); const u8 gCleffaPokedexText_FR[] = _( "When numerous meteors illuminate the\n" "night sky, sightings of CLEFFA strangely\n" "increase."); const u8 gCleffaPokedexTextUnused_FR[] = _(""); const u8 gIgglybuffPokedexText_FR[] = _( "Its extremely flexible and elastic body\n" "makes it bounce continuously--anytime,\n" "anywhere."); const u8 gIgglybuffPokedexTextUnused_FR[] = _(""); const u8 gTogepiPokedexText_FR[] = _( "A proverb claims that happiness will come\n" "to anyone who can make a sleeping TOGEPI\n" "stand up."); const u8 gTogepiPokedexTextUnused_FR[] = _(""); const u8 gTogeticPokedexText_FR[] = _( "It grows dispirited if it is not with kind\n" "people. It can float in midair without\n" "moving its wings."); const u8 gTogeticPokedexTextUnused_FR[] = _(""); const u8 gNatuPokedexText_FR[] = _( "It usually forages for food on the ground\n" "but may, on rare occasions, hop onto\n" "branches to peck at shoots."); const u8 gNatuPokedexTextUnused_FR[] = _(""); const u8 gXatuPokedexText_FR[] = _( "In South America, it is said that its right\n" "eye sees the future and its left eye\n" "views the past."); const u8 gXatuPokedexTextUnused_FR[] = _(""); const u8 gMareepPokedexText_FR[] = _( "Its fleece grows continually. In the\n" "summer, the fleece is fully shed, but it\n" "grows back in a week."); const u8 gMareepPokedexTextUnused_FR[] = _(""); const u8 gFlaaffyPokedexText_FR[] = _( "Its fluffy fleece easily stores\n" "electricity. Its rubbery hide keeps it\n" "from being electrocuted."); const u8 gFlaaffyPokedexTextUnused_FR[] = _(""); const u8 gAmpharosPokedexText_FR[] = _( "The bright light on its tail can be seen\n" "far away. It has been treasured since\n" "ancient times as a beacon."); const u8 gAmpharosPokedexTextUnused_FR[] = _(""); const u8 gBellossomPokedexText_FR[] = _( "Plentiful in the tropics. When it dances,\n" "its petals rub together and make a\n" "pleasant ringing sound."); const u8 gBellossomPokedexTextUnused_FR[] = _(""); const u8 gMarillPokedexText_FR[] = _( "The end of its tail serves as a buoy that\n" "keeps it from drowning, even in a vicious\n" "current."); const u8 gMarillPokedexTextUnused_FR[] = _(""); const u8 gAzumarillPokedexText_FR[] = _( "When it plays in water, it rolls up its\n" "elongated ears to prevent their insides\n" "from getting wet."); const u8 gAzumarillPokedexTextUnused_FR[] = _(""); const u8 gSudowoodoPokedexText_FR[] = _( "It disguises itself as a tree to avoid\n" "attack. It hates water, so it will\n" "disappear if it starts raining."); const u8 gSudowoodoPokedexTextUnused_FR[] = _(""); const u8 gPolitoedPokedexText_FR[] = _( "Whenever three or more of these get\n" "together, they sing in a loud voice that\n" "sounds like bellowing."); const u8 gPolitoedPokedexTextUnused_FR[] = _(""); const u8 gHoppipPokedexText_FR[] = _( "Its body is so light, it must grip the\n" "ground firmly with its feet to keep from\n" "being blown away."); const u8 gHoppipPokedexTextUnused_FR[] = _(""); const u8 gSkiploomPokedexText_FR[] = _( "It spreads its petals to absorb sunlight.\n" "It also floats in the air to get closer to\n" "the sun."); const u8 gSkiploomPokedexTextUnused_FR[] = _(""); const u8 gJumpluffPokedexText_FR[] = _( "It drifts on seasonal winds and spreads\n" "its cotton-like spores all over the world \n" "to make more offspring."); const u8 gJumpluffPokedexTextUnused_FR[] = _(""); const u8 gAipomPokedexText_FR[] = _( "It lives atop tall trees. When leaping\n" "from branch to branch, it deftly uses its\n" "tail for balance."); const u8 gAipomPokedexTextUnused_FR[] = _(""); const u8 gSunkernPokedexText_FR[] = _( "It lives by drinking only dewdrops from\n" "under the leaves of plants. It is said\n" "that it eats nothing else."); const u8 gSunkernPokedexTextUnused_FR[] = _(""); const u8 gSunfloraPokedexText_FR[] = _( "In the daytime, it rushes about in a\n" "hectic manner, but it comes to a complete\n" "stop when the sun sets."); const u8 gSunfloraPokedexTextUnused_FR[] = _(""); const u8 gYanmaPokedexText_FR[] = _( "Its large eyes can scan 360 degrees.\n" "It looks in all directions to seek out\n" "insects as its prey."); const u8 gYanmaPokedexTextUnused_FR[] = _(""); const u8 gWooperPokedexText_FR[] = _( "When it walks around on the ground,\n" "it coats its body with a slimy, poisonous\n" "film."); const u8 gWooperPokedexTextUnused_FR[] = _(""); const u8 gQuagsirePokedexText_FR[] = _( "Due to its relaxed and carefree attitude,\n" "it often bumps its head on boulders and\n" "boat hulls as it swims."); const u8 gQuagsirePokedexTextUnused_FR[] = _(""); const u8 gEspeonPokedexText_FR[] = _( "By reading air currents, it can predict\n" "things such as the weather or its foe's\n" "next move."); const u8 gEspeonPokedexTextUnused_FR[] = _(""); const u8 gUmbreonPokedexText_FR[] = _( "When darkness falls, the rings on its body\n" "begin to glow, striking fear in the hearts\n" "of anyone nearby."); const u8 gUmbreonPokedexTextUnused_FR[] = _(""); const u8 gMurkrowPokedexText_FR[] = _( "It is said that when chased, it lures its\n" "attacker onto dark mountain trails where\n" "the foe will get lost."); const u8 gMurkrowPokedexTextUnused_FR[] = _(""); const u8 gSlowkingPokedexText_FR[] = _( "When its head was bitten, toxins entered\n" "SLOWPOKE's head and unlocked an\n" "extraordinary power."); const u8 gSlowkingPokedexTextUnused_FR[] = _(""); const u8 gMisdreavusPokedexText_FR[] = _( "It loves to bite and yank people's hair\n" "from behind without warning, just to see\n" "their shocked reactions."); const u8 gMisdreavusPokedexTextUnused_FR[] = _(""); const u8 gUnownPokedexText_FR[] = _( "Its flat, thin body is always stuck on\n" "walls. Its shape appears to have some\n" "meaning."); const u8 gUnownPokedexTextUnused_FR[] = _(""); const u8 gWobbuffetPokedexText_FR[] = _( "To keep its pitch-black tail hidden, it\n" "lives quietly in the darkness. It is never\n" "first to attack."); const u8 gWobbuffetPokedexTextUnused_FR[] = _(""); const u8 gGirafarigPokedexText_FR[] = _( "Its tail, which also contains a small\n" "brain, may bite on its own if it notices an\n" "alluring smell."); const u8 gGirafarigPokedexTextUnused_FR[] = _(""); const u8 gPinecoPokedexText_FR[] = _( "It hangs and waits for flying-insect prey\n" "to come near. It does not move about\n" "much on its own."); const u8 gPinecoPokedexTextUnused_FR[] = _(""); const u8 gForretressPokedexText_FR[] = _( "It remains immovably rooted to its tree.\n" "It scatters pieces of its hard shell to\n" "drive its enemies away."); const u8 gForretressPokedexTextUnused_FR[] = _(""); const u8 gDunsparcePokedexText_FR[] = _( "If spotted, it escapes by burrowing with\n" "its tail. It can hover just slightly using\n" "its wings."); const u8 gDunsparcePokedexTextUnused_FR[] = _(""); const u8 gGligarPokedexText_FR[] = _( "It usually clings to cliffs. When it spots\n" "its prey, it spreads its wings and glides\n" "down to attack."); const u8 gGligarPokedexTextUnused_FR[] = _(""); const u8 gSteelixPokedexText_FR[] = _( "It is said that if an ONIX lives for over\n" "100 years, its composition changes to\n" "become diamond-like."); const u8 gSteelixPokedexTextUnused_FR[] = _(""); const u8 gSnubbullPokedexText_FR[] = _( "It has an active, playful nature. Many\n" "women like to frolic with it because of\n" "its affectionate ways."); const u8 gSnubbullPokedexTextUnused_FR[] = _(""); const u8 gGranbullPokedexText_FR[] = _( "Because its fangs are too heavy, it\n" "always keeps its head tilted down.\n" "However, its BITE is powerful."); const u8 gGranbullPokedexTextUnused_FR[] = _(""); const u8 gQwilfishPokedexText_FR[] = _( "The small spikes covering its body\n" "developed from scales. They inject a\n" "toxin that causes fainting."); const u8 gQwilfishPokedexTextUnused_FR[] = _(""); const u8 gScizorPokedexText_FR[] = _( "Its wings are not used for flying.\n" "They are flapped at high speed to adjust\n" "its body temperature."); const u8 gScizorPokedexTextUnused_FR[] = _(""); const u8 gShucklePokedexText_FR[] = _( "It stores BERRIES inside its shell.\n" "To avoid attacks, it hides beneath rocks\n" "and remains completely still."); const u8 gShucklePokedexTextUnused_FR[] = _(""); const u8 gHeracrossPokedexText_FR[] = _( "Usually docile, but if disturbed while\n" "sipping honey, it chases off the intruder\n" "with its horn."); const u8 gHeracrossPokedexTextUnused_FR[] = _(""); const u8 gSneaselPokedexText_FR[] = _( "Vicious in nature, it drives PIDGEY from\n" "their nests and feasts on the eggs that\n" "are left behind."); const u8 gSneaselPokedexTextUnused_FR[] = _(""); const u8 gTeddiursaPokedexText_FR[] = _( "Before food becomes scarce in wintertime,\n" "its habit is to hoard food in many hidden\n" "locations."); const u8 gTeddiursaPokedexTextUnused_FR[] = _(""); const u8 gUrsaringPokedexText_FR[] = _( "With its ability to distinguish any smell,\n" "it unfailingly finds all food buried deep\n" "underground."); const u8 gUrsaringPokedexTextUnused_FR[] = _(""); const u8 gSlugmaPokedexText_FR[] = _( "A common sight in volcanic areas, it\n" "slowly slithers around in a constant\n" "search for warm places."); const u8 gSlugmaPokedexTextUnused_FR[] = _(""); const u8 gMagcargoPokedexText_FR[] = _( "Its brittle shell occasionally spouts\n" "intense flames that circulate throughout\n" "its body."); const u8 gMagcargoPokedexTextUnused_FR[] = _(""); const u8 gSwinubPokedexText_FR[] = _( "If it smells something enticing, it dashes\n" "off headlong to find the source of the\n" "aroma."); const u8 gSwinubPokedexTextUnused_FR[] = _(""); const u8 gPiloswinePokedexText_FR[] = _( "If it charges at an enemy, the hairs on\n" "its back stand up straight. It is very\n" "sensitive to sound."); const u8 gPiloswinePokedexTextUnused_FR[] = _(""); const u8 gCorsolaPokedexText_FR[] = _( "In a south sea nation, the people live in\n" "communities that are built on groups of\n" "these POKéMON."); const u8 gCorsolaPokedexTextUnused_FR[] = _(""); const u8 gRemoraidPokedexText_FR[] = _( "Using its dorsal fin as a suction pad, it\n" "clings to a MANTINE's underside to\n" "scavenge for leftovers."); const u8 gRemoraidPokedexTextUnused_FR[] = _(""); const u8 gOctilleryPokedexText_FR[] = _( "It instinctively sneaks into rocky holes.\n" "If it gets sleepy, it steals the nest of a\n" "fellow OCTILLERY."); const u8 gOctilleryPokedexTextUnused_FR[] = _(""); const u8 gDelibirdPokedexText_FR[] = _( "It nests at the edge of sharp cliffs.\n" "It spends all day carrying food to its\n" "awaiting chicks."); const u8 gDelibirdPokedexTextUnused_FR[] = _(""); const u8 gMantinePokedexText_FR[] = _( "Swimming freely in open seas, it may fly\n" "out of the water and over the waves if it\n" "builds up enough speed."); const u8 gMantinePokedexTextUnused_FR[] = _(""); const u8 gSkarmoryPokedexText_FR[] = _( "After nesting in bramble bushes, the wings\n" "of its chicks grow hard from scratches by\n" "thorns."); const u8 gSkarmoryPokedexTextUnused_FR[] = _(""); const u8 gHoundourPokedexText_FR[] = _( "To corner prey, they check each other's\n" "location using barks that only they can\n" "understand."); const u8 gHoundourPokedexTextUnused_FR[] = _(""); const u8 gHoundoomPokedexText_FR[] = _( "Upon hearing its eerie howls, other\n" "POKéMON get the shivers and head straight\n" "back to their nests."); const u8 gHoundoomPokedexTextUnused_FR[] = _(""); const u8 gKingdraPokedexText_FR[] = _( "It sleeps deep on the ocean floor to\n" "build its energy. It is said to cause\n" "tornadoes as it wakes."); const u8 gKingdraPokedexTextUnused_FR[] = _(""); const u8 gPhanpyPokedexText_FR[] = _( "As a sign of affection, it bumps with its\n" "snout. However, it is so strong, it may\n" "send you flying."); const u8 gPhanpyPokedexTextUnused_FR[] = _(""); const u8 gDonphanPokedexText_FR[] = _( "The longer and bigger its tusks, the\n" "higher its rank in its herd. The tusks take\n" "a long time to grow."); const u8 gDonphanPokedexTextUnused_FR[] = _(""); const u8 gPorygon2PokedexText_FR[] = _( "Further research enhanced its abilities.\n" "Sometimes, it may exhibit motions that\n" "were not programmed."); const u8 gPorygon2PokedexTextUnused_FR[] = _(""); const u8 gStantlerPokedexText_FR[] = _( "Those who stare at its antlers will\n" "gradually lose control of their senses\n" "and be unable to stand."); const u8 gStantlerPokedexTextUnused_FR[] = _(""); const u8 gSmearglePokedexText_FR[] = _( "Once it becomes an adult, it has a\n" "tendency to let its comrades plant\n" "footprints on its back."); const u8 gSmearglePokedexTextUnused_FR[] = _(""); const u8 gTyroguePokedexText_FR[] = _( "Even though it is small, it can't be\n" "ignored because it will slug any handy\n" "target without warning."); const u8 gTyroguePokedexTextUnused_FR[] = _(""); const u8 gHitmontopPokedexText_FR[] = _( "It launches kicks while spinning. If it\n" "spins at high speed, it may bore its way\n" "into the ground."); const u8 gHitmontopPokedexTextUnused_FR[] = _(""); const u8 gSmoochumPokedexText_FR[] = _( "It always rocks its head slowly backwards\n" "and forwards as if it is trying to kiss\n" "someone."); const u8 gSmoochumPokedexTextUnused_FR[] = _(""); const u8 gElekidPokedexText_FR[] = _( "Even in the most vicious storm, this\n" "POKéMON plays happily if thunder rumbles\n" "in the sky."); const u8 gElekidPokedexTextUnused_FR[] = _(""); const u8 gMagbyPokedexText_FR[] = _( "It is found in volcanic craters. Its body\n" "heat exceeds 1,100 degrees Fahrenheit,\n" "so don't underestimate it."); const u8 gMagbyPokedexTextUnused_FR[] = _(""); const u8 gMiltankPokedexText_FR[] = _( "If it has just had a baby, the milk it\n" "produces contains much more nutrition than\n" "usual."); const u8 gMiltankPokedexTextUnused_FR[] = _(""); const u8 gBlisseyPokedexText_FR[] = _( "It has a very compassionate nature. If it\n" "sees a sick POKéMON, it will nurse the\n" "sufferer back to health."); const u8 gBlisseyPokedexTextUnused_FR[] = _(""); const u8 gRaikouPokedexText_FR[] = _( "This POKéMON races across the\n" "land while barking a cry that sounds\n" "like crashing thunder."); const u8 gRaikouPokedexTextUnused_FR[] = _(""); const u8 gEnteiPokedexText_FR[] = _( "A POKéMON that races across the land.\n" "It is said that one is born every time a\n" "new volcano appears."); const u8 gEnteiPokedexTextUnused_FR[] = _(""); const u8 gSuicunePokedexText_FR[] = _( "This POKéMON races across the land.\n" "It is said that north winds will somehow\n" "blow whenever it appears."); const u8 gSuicunePokedexTextUnused_FR[] = _(""); const u8 gLarvitarPokedexText_FR[] = _( "It is born deep underground. It can't\n" "emerge until it has entirely consumed the\n" "soil around it."); const u8 gLarvitarPokedexTextUnused_FR[] = _(""); const u8 gPupitarPokedexText_FR[] = _( "Even sealed in its shell, it can move\n" "freely. Hard and fast, it has outstanding\n" "destructive power."); const u8 gPupitarPokedexTextUnused_FR[] = _(""); const u8 gTyranitarPokedexText_FR[] = _( "It has an impudent nature. Having great\n" "strength, it can even change surrounding\n" "landforms." ); const u8 gTyranitarPokedexTextUnused_FR[] = _(""); const u8 gLugiaPokedexText_FR[] = _( "It is said to be the guardian of the seas.\n" "It is rumored to have been seen on the\n" "night of a storm."); const u8 gLugiaPokedexTextUnused_FR[] = _(""); const u8 gHoOhPokedexText_FR[] = _( "A legend says that its body glows in\n" "seven colors. A rainbow is said to form\n" "behind it when it flies."); const u8 gHoOhPokedexTextUnused_FR[] = _(""); const u8 gCelebiPokedexText_FR[] = _( "When CELEBI disappears deep in a forest,\n" "it is said to leave behind an egg it\n" "brought from the future."); const u8 gCelebiPokedexTextUnused_FR[] = _(""); const u8 gTreeckoPokedexText_FR[] = _( "It quickly scales even vertical walls.\n" "It senses humidity with its tail to predict\n" "the next day's weather."); const u8 gTreeckoPokedexTextUnused_FR[] = _(""); const u8 gGrovylePokedexText_FR[] = _( "Its strongly developed thigh muscles\n" "give it astounding agility and jumping\n" "performance."); const u8 gGrovylePokedexTextUnused_FR[] = _(""); const u8 gSceptilePokedexText_FR[] = _( "The leaves on its forelegs are as sharp\n" "as swords. It agilely leaps about the\n" "branches of trees to strike."); const u8 gSceptilePokedexTextUnused_FR[] = _(""); const u8 gTorchicPokedexText_FR[] = _( "It has a flame sac inside its belly that\n" "perpetually burns. It feels warm if it is\n" "hugged."); const u8 gTorchicPokedexTextUnused_FR[] = _(""); const u8 gCombuskenPokedexText_FR[] = _( "It boosts its concentration by emitting\n" "harsh cries. Its kicks have outstanding\n" "destructive power."); const u8 gCombuskenPokedexTextUnused_FR[] = _(""); const u8 gBlazikenPokedexText_FR[] = _( "When facing a tough foe, it looses flames\n" "from its wrists. Its powerful legs let it\n" "jump clear over buildings."); const u8 gBlazikenPokedexTextUnused_FR[] = _(""); const u8 gMudkipPokedexText_FR[] = _( "Its large tail fin propels it through\n" "water with powerful acceleration. It is\n" "strong in spite of its size."); const u8 gMudkipPokedexTextUnused_FR[] = _(""); const u8 gMarshtompPokedexText_FR[] = _( "It is at its best when on muddy ground\n" "with poor footing. It quickly overwhelms\n" "foes struggling in mud."); const u8 gMarshtompPokedexTextUnused_FR[] = _(""); const u8 gSwampertPokedexText_FR[] = _( "Its arms are rock-hard. With one swing,\n" "they can batter down its foe. It makes its\n" "nest on beautiful beaches."); const u8 gSwampertPokedexTextUnused_FR[] = _(""); const u8 gPoochyenaPokedexText_FR[] = _( "It has a very tenacious nature. Its acute\n" "sense of smell lets it chase a chosen\n" "prey without ever losing track."); const u8 gPoochyenaPokedexTextUnused_FR[] = _(""); const u8 gMightyenaPokedexText_FR[] = _( "It will always obey the commands of a\n" "skilled TRAINER. Its behavior arises from\n" "its living in packs in ancient times."); const u8 gMightyenaPokedexTextUnused_FR[] = _(""); const u8 gZigzagoonPokedexText_FR[] = _( "A POKéMON with abundant curiosity.\n" "It shows an interest in everything, so it\n" "always zigs and zags."); const u8 gZigzagoonPokedexTextUnused_FR[] = _(""); const u8 gLinoonePokedexText_FR[] = _( "When running in a straight line, it can top\n" "60 miles per hour. However, it has a\n" "tough time with curved roads."); const u8 gLinoonePokedexTextUnused_FR[] = _(""); const u8 gWurmplePokedexText_FR[] = _( "It lives amidst tall grass and in forests.\n" "When attacked, it resists by pointing its\n" "venomous spikes at the foe."); const u8 gWurmplePokedexTextUnused_FR[] = _(""); const u8 gSilcoonPokedexText_FR[] = _( "It conserves its energy by moving as\n" "little as possible. It awaits evolution\n" "while drinking only a little rainwater."); const u8 gSilcoonPokedexTextUnused_FR[] = _(""); const u8 gBeautiflyPokedexText_FR[] = _( "Despite its appearance, it has an\n" "aggressive nature. It attacks by jabbing\n" "with its long, thin mouth."); const u8 gBeautiflyPokedexTextUnused_FR[] = _(""); const u8 gCascoonPokedexText_FR[] = _( "Its body, which is made of soft silk,\n" "hardens over time. When cracks appear,\n" "evolution is near."); const u8 gCascoonPokedexTextUnused_FR[] = _(""); const u8 gDustoxPokedexText_FR[] = _( "It scatters horribly toxic dust when it\n" "senses danger. They tend to gather in the\n" "glow of streetlamps at night."); const u8 gDustoxPokedexTextUnused_FR[] = _(""); const u8 gLotadPokedexText_FR[] = _( "It searches about for clean water. If it\n" "does not drink water for too long, the\n" "leaf on its head wilts."); const u8 gLotadPokedexTextUnused_FR[] = _(""); const u8 gLombrePokedexText_FR[] = _( "It lives at the water's edge where it is\n" "sunny. It sleeps on a bed of water grass\n" "by day and becomes active at night."); const u8 gLombrePokedexTextUnused_FR[] = _(""); const u8 gLudicoloPokedexText_FR[] = _( "The rhythm of bright, festive music\n" "activates LUDICOLO's cells, making it more\n" "powerful."); const u8 gLudicoloPokedexTextUnused_FR[] = _(""); const u8 gSeedotPokedexText_FR[] = _( "If it remains still, it becomes impossible\n" "to distinguish from real nuts. It delights\n" "in surprising foraging PIDGEY."); const u8 gSeedotPokedexTextUnused_FR[] = _(""); const u8 gNuzleafPokedexText_FR[] = _( "They live in holes bored in large trees.\n" "The sound of NUZLEAF's grass flute fills\n" "listeners with dread."); const u8 gNuzleafPokedexTextUnused_FR[] = _(""); const u8 gShiftryPokedexText_FR[] = _( "A POKéMON that was feared as a forest\n" "guardian. It can read the foe's mind and\n" "take preemptive action."); const u8 gShiftryPokedexTextUnused_FR[] = _(""); const u8 gTaillowPokedexText_FR[] = _( "It dislikes cold seasons. They migrate to\n" "other lands in search of warmth, flying\n" "over 180 miles a day."); const u8 gTaillowPokedexTextUnused_FR[] = _(""); const u8 gSwellowPokedexText_FR[] = _( "If its two tail feathers are standing at\n" "attention, it is proof of good health.\n" "It soars elegantly in the sky."); const u8 gSwellowPokedexTextUnused_FR[] = _(""); const u8 gWingullPokedexText_FR[] = _( "It rides upon ocean winds as if it were\n" "a glider. In the winter, it hides food\n" "around its nest."); const u8 gWingullPokedexTextUnused_FR[] = _(""); const u8 gPelipperPokedexText_FR[] = _( "It is a flying transporter that carries\n" "small POKéMON in its beak. It bobs on the\n" "waves to rest its wings."); const u8 gPelipperPokedexTextUnused_FR[] = _(""); const u8 gRaltsPokedexText_FR[] = _( "It is highly attuned to the emotions of\n" "people and POKéMON. It hides if it senses\n" "hostility."); const u8 gRaltsPokedexTextUnused_FR[] = _(""); const u8 gKirliaPokedexText_FR[] = _( "The cheerful spirit of its TRAINER gives\n" "it energy for its psychokinetic power.\n" "It spins and dances when happy."); const u8 gKirliaPokedexTextUnused_FR[] = _(""); const u8 gGardevoirPokedexText_FR[] = _( "It has the power to predict the future.\n" "Its power peaks when it is protecting its\n" "TRAINER."); const u8 gGardevoirPokedexTextUnused_FR[] = _(""); const u8 gSurskitPokedexText_FR[] = _( "They usually live on ponds, but after an\n" "evening shower, they may appear on\n" "puddles in towns."); const u8 gSurskitPokedexTextUnused_FR[] = _(""); const u8 gMasquerainPokedexText_FR[] = _( "The antennae have distinctive patterns\n" "that look like eyes. When it rains, they\n" "grow heavy, making flight impossible."); const u8 gMasquerainPokedexTextUnused_FR[] = _(""); const u8 gShroomishPokedexText_FR[] = _( "It prefers damp places. By day it remains\n" "still in the forest shade. It releases\n" "toxic powder from its head."); const u8 gShroomishPokedexTextUnused_FR[] = _(""); const u8 gBreloomPokedexText_FR[] = _( "The seeds on its tail are made of toxic\n" "spores. It knocks out foes with quick,\n" "virtually invisible punches."); const u8 gBreloomPokedexTextUnused_FR[] = _(""); const u8 gSlakothPokedexText_FR[] = _( "It sleeps for 20 hours every day. Making\n" "drowsy those that see it is one of\n" "its abilities."); const u8 gSlakothPokedexTextUnused_FR[] = _(""); const u8 gVigorothPokedexText_FR[] = _( "It is always hungry because it won't stop\n" "rampaging. Even while it is eating, it\n" "can't keep still."); const u8 gVigorothPokedexTextUnused_FR[] = _(""); const u8 gSlakingPokedexText_FR[] = _( "It is the world's most slothful POKéMON.\n" "However, it can exert horrifying power by\n" "releasing pent-up energy all at once."); const u8 gSlakingPokedexTextUnused_FR[] = _(""); const u8 gNincadaPokedexText_FR[] = _( "Because it lived almost entirely\n" "underground, it is nearly blind.\n" "It uses its antennae instead."); const u8 gNincadaPokedexTextUnused_FR[] = _(""); const u8 gNinjaskPokedexText_FR[] = _( "This POKéMON is so quick, it is said to\n" "be able to avoid any attack. It loves to\n" "feed on tree sap."); const u8 gNinjaskPokedexTextUnused_FR[] = _(""); const u8 gShedinjaPokedexText_FR[] = _( "A most peculiar POKéMON that somehow\n" "appears in a POKé BALL when a NINCADA\n" "evolves."); const u8 gShedinjaPokedexTextUnused_FR[] = _(""); const u8 gWhismurPokedexText_FR[] = _( "It usually murmurs, but starts crying\n" "loudly if it senses danger. It stops when\n" "its ear covers are shut."); const u8 gWhismurPokedexTextUnused_FR[] = _(""); const u8 gLoudredPokedexText_FR[] = _( "When it stamps its feet and bellows, it\n" "generates ultrasonic waves that can blow\n" "apart a house."); const u8 gLoudredPokedexTextUnused_FR[] = _(""); const u8 gExploudPokedexText_FR[] = _( "It emits a variety of sounds from the \n" "holes all over its body. Its loud cries\n" "can be heard from over six miles away."); const u8 gExploudPokedexTextUnused_FR[] = _(""); const u8 gMakuhitaPokedexText_FR[] = _( "It grows stronger by enduring harsh\n" "training. It is a gutsy POKéMON that can\n" "withstand any attack."); const u8 gMakuhitaPokedexTextUnused_FR[] = _(""); const u8 gHariyamaPokedexText_FR[] = _( "It stomps on the ground to build power.\n" "It can send a 10-ton truck flying with a\n" "straight-arm punch."); const u8 gHariyamaPokedexTextUnused_FR[] = _(""); const u8 gAzurillPokedexText_FR[] = _( "It battles by flinging around its tail,\n" "which is bigger than its body. The\n" "tail is a flotation device in water."); const u8 gAzurillPokedexTextUnused_FR[] = _(""); const u8 gNosepassPokedexText_FR[] = _( "Its magnetic nose consistently faces\n" "north. Travelers check NOSEPASS to get\n" "their bearings."); const u8 gNosepassPokedexTextUnused_FR[] = _(""); const u8 gSkittyPokedexText_FR[] = _( "It is said to be difficult to earn its\n" "trust. However, it is extremely popular\n" "for its cute looks and behavior."); const u8 gSkittyPokedexTextUnused_FR[] = _(""); const u8 gDelcattyPokedexText_FR[] = _( "The favorite of trend-conscious\n" "female TRAINERS, they are used in\n" "competition for their style and fur."); const u8 gDelcattyPokedexTextUnused_FR[] = _(""); const u8 gSableyePokedexText_FR[] = _( "It feeds on gemstone crystals.\n" "In darkness, its eyes sparkle with the\n" "glitter of jewels."); const u8 gSableyePokedexTextUnused_FR[] = _(""); const u8 gMawilePokedexText_FR[] = _( "It uses its docile-looking face to lull\n" "foes into complacency, then bites with its\n" "huge, relentless jaws."); const u8 gMawilePokedexTextUnused_FR[] = _(""); const u8 gAronPokedexText_FR[] = _( "It eats iron to build its steel body.\n" "It is a pest that descends from mountains\n" "to eat bridges and train tracks."); const u8 gAronPokedexTextUnused_FR[] = _(""); const u8 gLaironPokedexText_FR[] = _( "It habitually shows off its strength with\n" "the size of sparks it creates by ramming\n" "its steel body into boulders."); const u8 gLaironPokedexTextUnused_FR[] = _(""); const u8 gAggronPokedexText_FR[] = _( "It claims a large mountain as its sole\n" "territory. It mercilessly thrashes those\n" "that violate its space."); const u8 gAggronPokedexTextUnused_FR[] = _(""); const u8 gMedititePokedexText_FR[] = _( "It never skips its daily yoga training.\n" "It heightens its inner strength through\n" "meditation."); const u8 gMedititePokedexTextUnused_FR[] = _(""); const u8 gMedichamPokedexText_FR[] = _( "It elegantly avoids attacks with dance-\n" "like steps, then launches a devastating\n" "blow in the same motion."); const u8 gMedichamPokedexTextUnused_FR[] = _(""); const u8 gElectrikePokedexText_FR[] = _( "It stores static electricity in its fur\n" "for discharging. It gives off sparks if a\n" "storm approaches."); const u8 gElectrikePokedexTextUnused_FR[] = _(""); const u8 gManectricPokedexText_FR[] = _( "It rarely appears before people.\n" "It is said to nest where lightning has\n" "fallen."); const u8 gManectricPokedexTextUnused_FR[] = _(""); const u8 gPluslePokedexText_FR[] = _( "It cheers on partners while scattering\n" "sparks from its body. It climbs telephone\n" "poles to absorb electricity."); const u8 gPluslePokedexTextUnused_FR[] = _(""); const u8 gMinunPokedexText_FR[] = _( "Its dislike of water makes it take shelter\n" "under the eaves of houses in rain. It uses\n" "pom-poms made of sparks for cheering."); const u8 gMinunPokedexTextUnused_FR[] = _(""); const u8 gVolbeatPokedexText_FR[] = _( "It lives around clean ponds. At night,\n" "its rear lights up. It converses with\n" "others by flashing its light."); const u8 gVolbeatPokedexTextUnused_FR[] = _(""); const u8 gIllumisePokedexText_FR[] = _( "It guides VOLBEAT to draw signs in night\n" "skies. There are scientists that study the\n" "patterns it creates."); const u8 gIllumisePokedexTextUnused_FR[] = _(""); const u8 gRoseliaPokedexText_FR[] = _( "Its flowers give off a relaxing fragrance.\n" "The stronger its aroma, the healthier\n" "the ROSELIA is."); const u8 gRoseliaPokedexTextUnused_FR[] = _(""); const u8 gGulpinPokedexText_FR[] = _( "There is nothing its stomach can't digest.\n" "While it is digesting, vile, overpowering\n" "gases are expelled."); const u8 gGulpinPokedexTextUnused_FR[] = _(""); const u8 gSwalotPokedexText_FR[] = _( "It can swallow a tire whole in one gulp.\n" "It secretes a horribly toxic fluid from\n" "the pores on its body."); const u8 gSwalotPokedexTextUnused_FR[] = _(""); const u8 gCarvanhaPokedexText_FR[] = _( "It lives in massive rivers that course\n" "through jungles. It swarms prey that\n" "enter its territory."); const u8 gCarvanhaPokedexTextUnused_FR[] = _(""); const u8 gSharpedoPokedexText_FR[] = _( "The ruffian of the seas, it has fangs that\n" "crunch through iron. It swims by jetting\n" "water from its rear."); const u8 gSharpedoPokedexTextUnused_FR[] = _(""); const u8 gWailmerPokedexText_FR[] = _( "When it sucks in a large volume of\n" "seawater, it becomes like a big, bouncy\n" "ball. It eats a ton of food daily."); const u8 gWailmerPokedexTextUnused_FR[] = _(""); const u8 gWailordPokedexText_FR[] = _( "It is among the largest of all POKéMON.\n" "It herds prey in a pack then swallows the\n" "massed prey in one gulp."); const u8 gWailordPokedexTextUnused_FR[] = _(""); const u8 gNumelPokedexText_FR[] = _( "Magma of almost 2,200 degrees Fahrenheit\n" "courses through its body. When it grows\n" "cold, the magma hardens and slows it."); const u8 gNumelPokedexTextUnused_FR[] = _(""); const u8 gCameruptPokedexText_FR[] = _( "If angered, the humps on its back erupt\n" "in a shower of molten lava. It lives in\n" "the craters of volcanoes."); const u8 gCameruptPokedexTextUnused_FR[] = _(""); const u8 gTorkoalPokedexText_FR[] = _( "It burns coal inside its shell. If it is\n" "attacked, it belches thick, black smoke\n" "and flees."); const u8 gTorkoalPokedexTextUnused_FR[] = _(""); const u8 gSpoinkPokedexText_FR[] = _( "It apparently dies if it stops bouncing\n" "about. It carries a pearl from CLAMPERL\n" "on its head."); const u8 gSpoinkPokedexTextUnused_FR[] = _(""); const u8 gGrumpigPokedexText_FR[] = _( "It can gain control over foes by doing\n" "odd dance steps. The black pearls on its\n" "forehead are precious gems."); const u8 gGrumpigPokedexTextUnused_FR[] = _(""); const u8 gSpindaPokedexText_FR[] = _( "No two SPINDA are said to have identical\n" "patterns. It confuses foes with its\n" "stumbling motions."); const u8 gSpindaPokedexTextUnused_FR[] = _(""); const u8 gTrapinchPokedexText_FR[] = _( "It lives in arid deserts. It makes a\n" "sloping pit trap in sand where it\n" "patiently awaits prey."); const u8 gTrapinchPokedexTextUnused_FR[] = _(""); const u8 gVibravaPokedexText_FR[] = _( "It generates ultrasonic waves by violently\n" "flapping its wings. After making its prey\n" "faint, it melts the prey with acid."); const u8 gVibravaPokedexTextUnused_FR[] = _(""); const u8 gFlygonPokedexText_FR[] = _( "It hides itself by kicking up desert sand\n" "with its wings. Red covers shield its eyes\n" "from sand."); const u8 gFlygonPokedexTextUnused_FR[] = _(""); const u8 gCacneaPokedexText_FR[] = _( "It prefers harsh environments such as\n" "deserts. It can survive for 30 days on\n" "water stored in its body."); const u8 gCacneaPokedexTextUnused_FR[] = _(""); const u8 gCacturnePokedexText_FR[] = _( "It lives in deserts. It becomes active at\n" "night when it hunts for prey exhausted\n" "from the desert's heat."); const u8 gCacturnePokedexTextUnused_FR[] = _(""); const u8 gSwabluPokedexText_FR[] = _( "It constantly grooms its cotton-like\n" "wings. It takes a shower to clean\n" "itself if it becomes dirty."); const u8 gSwabluPokedexTextUnused_FR[] = _(""); const u8 gAltariaPokedexText_FR[] = _( "If you hear a beautiful melody trilling\n" "deep among mountains far from people,\n" "it is ALTARIA's humming."); const u8 gAltariaPokedexTextUnused_FR[] = _(""); const u8 gZangoosePokedexText_FR[] = _( "If it comes across a SEVIPER, its fur\n" "bristles and it assumes its battle pose.\n" "Its sharp claws are its best weapon."); const u8 gZangoosePokedexTextUnused_FR[] = _(""); const u8 gSeviperPokedexText_FR[] = _( "It sharpens its swordlike tail on hard\n" "rocks. It hides in tall grass and strikes\n" "unwary prey with venomous fangs."); const u8 gSeviperPokedexTextUnused_FR[] = _(""); const u8 gLunatonePokedexText_FR[] = _( "Its health ebbs and flows with the lunar\n" "cycle. It brims with power when exposed\n" "to the light of the full moon."); const u8 gLunatonePokedexTextUnused_FR[] = _(""); const u8 gSolrockPokedexText_FR[] = _( "It absorbs solar energy during the day.\n" "Always expressionless, it can sense what\n" "its foe is thinking."); const u8 gSolrockPokedexTextUnused_FR[] = _(""); const u8 gBarboachPokedexText_FR[] = _( "It probes muddy riverbeds with its two\n" "long whiskers. A slimy film protects its\n" "body."); const u8 gBarboachPokedexTextUnused_FR[] = _(""); const u8 gWhiscashPokedexText_FR[] = _( "It makes its nest at the bottom of \n" "swamps. It will eat anything - if it is\n" "alive, WHISCASH will eat it."); const u8 gWhiscashPokedexTextUnused_FR[] = _(""); const u8 gCorphishPokedexText_FR[] = _( "It came from overseas. It is a very hardy\n" "creature that will quickly proliferate,\n" "even in polluted streams."); const u8 gCorphishPokedexTextUnused_FR[] = _(""); const u8 gCrawdauntPokedexText_FR[] = _( "A rough customer that wildly flails its\n" "giant claws. It is said to be extremely\n" "hard to raise."); const u8 gCrawdauntPokedexTextUnused_FR[] = _(""); const u8 gBaltoyPokedexText_FR[] = _( "It was discovered in ancient ruins.\n" "While moving, it constantly spins. It\n" "stands on one foot even when asleep."); const u8 gBaltoyPokedexTextUnused_FR[] = _(""); const u8 gClaydolPokedexText_FR[] = _( "It appears to have been born from clay\n" "dolls made by ancient people. It uses\n" "telekinesis to float and move."); const u8 gClaydolPokedexTextUnused_FR[] = _(""); const u8 gLileepPokedexText_FR[] = _( "It became extinct roughly 100 million\n" "years ago. It was regenerated from a\n" "fossil using advanced techniques."); const u8 gLileepPokedexTextUnused_FR[] = _(""); const u8 gCradilyPokedexText_FR[] = _( "It ensnares prey with its eight tentacles.\n" "It then melts the prey with a strong acid\n" "before feeding."); const u8 gCradilyPokedexTextUnused_FR[] = _(""); const u8 gAnorithPokedexText_FR[] = _( "It is a kind of POKéMON progenitor.\n" "It uses its extending claws to catch prey\n" "hiding among rocks on the seafloor."); const u8 gAnorithPokedexTextUnused_FR[] = _(""); const u8 gArmaldoPokedexText_FR[] = _( "Protected by a hard shell, its body is\n" "very sturdy. It skewers prey with its\n" "claws to feed."); const u8 gArmaldoPokedexTextUnused_FR[] = _(""); const u8 gFeebasPokedexText_FR[] = _( "Ridiculed for its shabby appearance,\n" "it is ignored by researchers. It lives in\n" "ponds choked with weeds."); const u8 gFeebasPokedexTextUnused_FR[] = _(""); const u8 gMiloticPokedexText_FR[] = _( "MILOTIC is breathtakingly beautiful.\n" "Those that see it are said to forget their\n" "combative spirits."); const u8 gMiloticPokedexTextUnused_FR[] = _(""); const u8 gCastformPokedexText_FR[] = _( "It has the ability to change its form into\n" "the sun, the rain, or a snow cloud, \n" "depending on the weather."); const u8 gCastformPokedexTextUnused_FR[] = _(""); const u8 gKecleonPokedexText_FR[] = _( "It changes body color to blend in with\n" "its surroundings. It also changes color if\n" "it is happy or sad."); const u8 gKecleonPokedexTextUnused_FR[] = _(""); const u8 gShuppetPokedexText_FR[] = _( "It loves to feed on feelings like envy and\n" "malice. Its upright horn catches the\n" "emotions of people."); const u8 gShuppetPokedexTextUnused_FR[] = _(""); const u8 gBanettePokedexText_FR[] = _( "Strong feelings of hatred turned a puppet\n" "into a POKéMON. If it opens its mouth,\n" "its cursed energy escapes."); const u8 gBanettePokedexTextUnused_FR[] = _(""); const u8 gDuskullPokedexText_FR[] = _( "Making itself invisible, it silently sneaks\n" "up to prey. It has the ability to slip\n" "through thick walls."); const u8 gDuskullPokedexTextUnused_FR[] = _(""); const u8 gDusclopsPokedexText_FR[] = _( "Its body is entirely hollow. When it opens\n" "its mouth, it sucks everything in as if it\n" "were a black hole."); const u8 gDusclopsPokedexTextUnused_FR[] = _(""); const u8 gTropiusPokedexText_FR[] = _( "It lives in tropical jungles. The bunch of\n" "fruit around its neck is delicious.\n" "The fruit grows twice a year."); const u8 gTropiusPokedexTextUnused_FR[] = _(""); const u8 gChimechoPokedexText_FR[] = _( "It travels by riding on winds. It cleverly\n" "uses its long tail to pluck nuts and\n" "berries, which it loves to eat."); const u8 gChimechoPokedexTextUnused_FR[] = _(""); const u8 gAbsolPokedexText_FR[] = _( "It appears when it senses an impending\n" "natural disaster. As a result, it was\n" "mistaken as a doom-bringer."); const u8 gAbsolPokedexTextUnused_FR[] = _(""); const u8 gWynautPokedexText_FR[] = _( "It tends to move in a pack with others.\n" "They cluster in a tight group to sleep in\n" "a cave."); const u8 gWynautPokedexTextUnused_FR[] = _(""); const u8 gSnoruntPokedexText_FR[] = _( "It is said that a home visited by a\n" "SNORUNT will prosper. It can withstand\n" "cold of minus 150 degrees Fahrenheit."); const u8 gSnoruntPokedexTextUnused_FR[] = _(""); const u8 gGlaliePokedexText_FR[] = _( "It has a body of ice that won't melt,\n" "even with fire. It can instantly freeze\n" "moisture in the atmosphere."); const u8 gGlaliePokedexTextUnused_FR[] = _(""); const u8 gSphealPokedexText_FR[] = _( "Its body is covered in fluffy fur. The\n" "fur keeps it from feeling cold while\n" "it is rolling on ice."); const u8 gSphealPokedexTextUnused_FR[] = _(""); const u8 gSealeoPokedexText_FR[] = _( "It touches new things with its nose to\n" "test for smell and feel. It plays by\n" "spinning SPHEAL on its nose."); const u8 gSealeoPokedexTextUnused_FR[] = _(""); const u8 gWalreinPokedexText_FR[] = _( "It swims through icy seas while shattering\n" "ice floes with its large tusks. It is\n" "protected by its thick blubber."); const u8 gWalreinPokedexTextUnused_FR[] = _(""); const u8 gClamperlPokedexText_FR[] = _( "It is protected by a sturdy shell.\n" "Once in a lifetime, it makes a magnificent\n" "pearl."); const u8 gClamperlPokedexTextUnused_FR[] = _(""); const u8 gHuntailPokedexText_FR[] = _( "It lives deep in the sea where no light\n" "ever filters down. It lights up its small\n" "fishlike tail to attract prey."); const u8 gHuntailPokedexTextUnused_FR[] = _(""); const u8 gGorebyssPokedexText_FR[] = _( "Its swimming form is exquisitely elegant.\n" "With its thin mouth, it feeds on seaweed\n" "that grows between rocks."); const u8 gGorebyssPokedexTextUnused_FR[] = _(""); const u8 gRelicanthPokedexText_FR[] = _( "It has remained unchanged for 100\n" "million years. It was discovered\n" "during a deep-sea exploration."); const u8 gRelicanthPokedexTextUnused_FR[] = _(""); const u8 gLuvdiscPokedexText_FR[] = _( "During the spawning season, countless\n" "LUVDISC congregate at coral reefs,\n" "turning the waters pink."); const u8 gLuvdiscPokedexTextUnused_FR[] = _(""); const u8 gBagonPokedexText_FR[] = _( "Its steel-hard head can shatter boulders.\n" "It longingly hopes for wings to grow so it\n" "can fly."); const u8 gBagonPokedexTextUnused_FR[] = _(""); const u8 gShelgonPokedexText_FR[] = _( "Its armored body makes all attacks bounce\n" "off. The armor is too tough, however,\n" "making it heavy and somewhat sluggish."); const u8 gShelgonPokedexTextUnused_FR[] = _(""); const u8 gSalamencePokedexText_FR[] = _( "It becomes uncontrollable if it is\n" "enraged. It destroys everything with\n" "shredding claws and fire."); const u8 gSalamencePokedexTextUnused_FR[] = _(""); const u8 gBeldumPokedexText_FR[] = _( "It uses magnetic waves to converse with\n" "its kind. All the cells in its body are\n" "magnetic."); const u8 gBeldumPokedexTextUnused_FR[] = _(""); const u8 gMetangPokedexText_FR[] = _( "It floats midair using magnetism. Its body\n" "is so tough, even a crash with a jet\n" "plane won't leave a scratch."); const u8 gMetangPokedexTextUnused_FR[] = _(""); const u8 gMetagrossPokedexText_FR[] = _( "It is formed by two METANG fusing.\n" "Its four brains are said to be superior\n" "to a supercomputer."); const u8 gMetagrossPokedexTextUnused_FR[] = _(""); const u8 gRegirockPokedexText_FR[] = _( "It is entirely composed of rocks with no\n" "sign of a brain or heart. It is a mystery\n" "even to modern scientists."); const u8 gRegirockPokedexTextUnused_FR[] = _(""); const u8 gRegicePokedexText_FR[] = _( "Research revealed that its body is made\n" "of the same kind of ice that is found at\n" "the South Pole."); const u8 gRegicePokedexTextUnused_FR[] = _(""); const u8 gRegisteelPokedexText_FR[] = _( "It is sturdier than any kind of metal.\n" "It hardened due to pressure underground\n" "over tens of thousands of years."); const u8 gRegisteelPokedexTextUnused_FR[] = _(""); const u8 gLatiasPokedexText_FR[] = _( "It can telepathically communicate with\n" "people. It changes its appearance using\n" "its down that refracts light."); const u8 gLatiasPokedexTextUnused_FR[] = _(""); const u8 gLatiosPokedexText_FR[] = _( "It has a docile temperament and dislikes\n" "fighting. Tucking in its forelegs, it can\n" "fly faster than a jet plane."); const u8 gLatiosPokedexTextUnused_FR[] = _(""); const u8 gKyogrePokedexText_FR[] = _( "This POKéMON is said to have\n" "expanded the sea by bringing heavy rains.\n" "It has the power to control water."); const u8 gKyogrePokedexTextUnused_FR[] = _(""); const u8 gGroudonPokedexText_FR[] = _( "This legendary POKéMON is said to\n" "represent the land. It went to sleep after\n" "dueling KYOGRE."); const u8 gGroudonPokedexTextUnused_FR[] = _(""); const u8 gRayquazaPokedexText_FR[] = _( "It has lived for hundreds of millions of\n" "years in the ozone layer. Its flying form\n" "looks like a meteor."); const u8 gRayquazaPokedexTextUnused_FR[] = _(""); const u8 gJirachiPokedexText_FR[] = _( "It is said to make any wish come true.\n" "It is awake for only seven days out of\n" "a thousand years."); const u8 gJirachiPokedexTextUnused_FR[] = _(""); const u8 gDeoxysPokedexText_FR[] = _( "This DEOXYS has transformed into its\n" "aggressive guise. It can fool enemies by\n" "altering its appearance."); const u8 gDeoxysPokedexTextUnused_FR[] = _(""); ================================================ FILE: src/data/pokemon/pokedex_text_lg.h ================================================ const u8 gDummyPokedexText_LG[] = _( "This is a newly discovered POKéMON. It is\n" "currently under investigation. No detailed\n" "information is available at this time."); const u8 gDummyPokedexTextUnused_LG[] = _(""); const u8 gBulbasaurPokedexText_LG[] = _( "A strange seed was planted on its back at\n" "birth. The plant sprouts and grows with\n" "this POKéMON."); const u8 gBulbasaurPokedexTextUnused_LG[] = _(""); const u8 gIvysaurPokedexText_LG[] = _( "When the bulb on its back grows large, it\n" "appears to lose the ability to stand on\n" "its hind legs."); const u8 gIvysaurPokedexTextUnused_LG[] = _(""); const u8 gVenusaurPokedexText_LG[] = _( "Its plant blooms when it is absorbing\n" "solar energy. It stays on the move to\n" "seek sunlight."); const u8 gVenusaurPokedexTextUnused_LG[] = _( " "); const u8 gCharmanderPokedexText_LG[] = _( "It has a preference for hot things.\n" "When it rains, steam is said to spout from\n" "the tip of its tail."); const u8 gCharmanderPokedexTextUnused_LG[] = _(""); const u8 gCharmeleonPokedexText_LG[] = _( "When it swings its burning tail, it\n" "elevates the air temperature to \n" "unbearably high levels."); const u8 gCharmeleonPokedexTextUnused_LG[] = _(""); const u8 gCharizardPokedexText_LG[] = _( "It spits fire that is hot enough to melt\n" "boulders. It may cause forest fires by\n" "blowing flames."); const u8 gCharizardPokedexTextUnused_LG[] = _(""); const u8 gSquirtlePokedexText_LG[] = _( "After birth, its back swells and hardens\n" "into a shell. It powerfully sprays foam \n" "from its mouth."); const u8 gSquirtlePokedexTextUnused_LG[] = _(""); const u8 gWartortlePokedexText_LG[] = _( "It often hides in water to stalk unwary\n" "prey. For fast swimming, it moves its\n" "ears to maintain balance."); const u8 gWartortlePokedexTextUnused_LG[] = _(""); const u8 gBlastoisePokedexText_LG[] = _( "The pressurized water jets on this brutal\n" "POKéMON's shell are used for high-\n" "speed tackles."); const u8 gBlastoisePokedexTextUnused_LG[] = _(""); const u8 gCaterpiePokedexText_LG[] = _( "Its short feet are tipped with suction\n" "pads that enable it to tirelessly climb\n" "slopes and walls."); const u8 gCaterpiePokedexTextUnused_LG[] = _(""); const u8 gMetapodPokedexText_LG[] = _( "This POKéMON is vulnerable to attack\n" "while its shell is soft, exposing its weak\n" "and tender body."); const u8 gMetapodPokedexTextUnused_LG[] = _( " "); const u8 gButterfreePokedexText_LG[] = _( "In battle, it flaps its wings at great\n" "speed to release highly toxic dust into\n" "the air."); const u8 gButterfreePokedexTextUnused_LG[] = _( " "); const u8 gWeedlePokedexText_LG[] = _( "Often found in forests, eating leaves.\n" "It has a sharp stinger on its head that\n" "injects poison."); const u8 gWeedlePokedexTextUnused_LG[] = _(""); const u8 gKakunaPokedexText_LG[] = _( "Almost incapable of moving, this POKéMON\n" "can only harden its shell to protect\n" "itself when it is in danger."); const u8 gKakunaPokedexTextUnused_LG[] = _(""); const u8 gBeedrillPokedexText_LG[] = _( "It flies at high speed and attacks using \n" "the large venomous stingers on its\n" "forelegs and tail."); const u8 gBeedrillPokedexTextUnused_LG[] = _(""); const u8 gPidgeyPokedexText_LG[] = _( "A common sight in forests and woods.\n" "It flaps its wings at ground level to kick\n" "up blinding sand."); const u8 gPidgeyPokedexTextUnused_LG[] = _(""); const u8 gPidgeottoPokedexText_LG[] = _( "Very protective of its sprawling\n" "territorial area, this POKéMON will\n" "fiercely peck at any intruder."); const u8 gPidgeottoPokedexTextUnused_LG[] = _(""); const u8 gPidgeotPokedexText_LG[] = _( "When hunting, it skims the surface of\n" "water at high speed to pick off unwary\n" "prey such as MAGIKARP."); const u8 gPidgeotPokedexTextUnused_LG[] = _(""); const u8 gRattataPokedexText_LG[] = _( "Bites anything when it attacks. Small and\n" "very quick, it is a common sight in many\n" "places."); const u8 gRattataPokedexTextUnused_LG[] = _(""); const u8 gRaticatePokedexText_LG[] = _( "It uses its whiskers to maintain its\n" "balance. It apparently slows down if\n" "they are cut off."); const u8 gRaticatePokedexTextUnused_LG[] = _(""); const u8 gSpearowPokedexText_LG[] = _( "Eats bugs in grassy areas. It has to flap\n" "its short wings at high speed to stay\n" "airborne."); const u8 gSpearowPokedexTextUnused_LG[] = _(""); const u8 gFearowPokedexText_LG[] = _( "With its huge and magnificent wings, it can\n" "keep aloft without ever having to land\n" "for rest."); const u8 gFearowPokedexTextUnused_LG[] = _(""); const u8 gEkansPokedexText_LG[] = _( "Moving silently and stealthily, it eats\n" "the eggs of birds, such as PIDGEY\n" "and SPEAROW, whole."); const u8 gEkansPokedexTextUnused_LG[] = _(""); const u8 gArbokPokedexText_LG[] = _( "It is rumored that the ferocious warning\n" "markings on its belly differ from area to\n" "area."); const u8 gArbokPokedexTextUnused_LG[] = _(""); const u8 gPikachuPokedexText_LG[] = _( "When several of these POKéMON gather,\n" "their electricity can build and cause\n" "lightning storms."); const u8 gPikachuPokedexTextUnused_LG[] = _(""); const u8 gRaichuPokedexText_LG[] = _( "Its long tail serves as a ground to\n" "protect itself from its own high-voltage\n" "power."); const u8 gRaichuPokedexTextUnused_LG[] = _(""); const u8 gSandshrewPokedexText_LG[] = _( "Burrows deep underground in arid locations\n" "far from water. It only emerges to hunt\n" "for prey."); const u8 gSandshrewPokedexTextUnused_LG[] = _(""); const u8 gSandslashPokedexText_LG[] = _( "Curls up into a spiny ball when\n" "threatened. It can roll while curled up\n" "to attack or escape."); const u8 gSandslashPokedexTextUnused_LG[] = _(""); const u8 gNidoranFPokedexText_LG[] = _( "Although small, its venomous barbs render\n" "this POKéMON dangerous. The female has\n" "smaller horns."); const u8 gNidoranFPokedexTextUnused_LG[] = _(""); const u8 gNidorinaPokedexText_LG[] = _( "The female's horns develop slowly.\n" "Prefers physical attacks such as clawing\n" "and biting."); const u8 gNidorinaPokedexTextUnused_LG[] = _(""); const u8 gNidoqueenPokedexText_LG[] = _( "Its hard scales provide strong protection.\n" "It uses its hefty bulk to execute\n" "powerful moves."); const u8 gNidoqueenPokedexTextUnused_LG[] = _(""); const u8 gNidoranMPokedexText_LG[] = _( "It stiffens its ears to sense danger.\n" "The larger its horns, the more \n" "powerful its secreted venom."); const u8 gNidoranMPokedexTextUnused_LG[] = _(""); const u8 gNidorinoPokedexText_LG[] = _( "An aggressive POKéMON that is quick to\n" "attack. The horn on its head secretes a\n" "powerful venom."); const u8 gNidorinoPokedexTextUnused_LG[] = _(""); const u8 gNidokingPokedexText_LG[] = _( "It uses its powerful tail in battle to\n" "smash, constrict, then break the prey's\n" "bones."); const u8 gNidokingPokedexTextUnused_LG[] = _(""); const u8 gClefairyPokedexText_LG[] = _( "With its magical and cute appeal, it has \n" "many admirers. It is rare and found only\n" "in certain areas."); const u8 gClefairyPokedexTextUnused_LG[] = _(""); const u8 gClefablePokedexText_LG[] = _( "A timid fairy POKéMON that is rarely seen,\n" "it will run and hide the moment it senses\n" "people."); const u8 gClefablePokedexTextUnused_LG[] = _(""); const u8 gVulpixPokedexText_LG[] = _( "When it is born, it has just one snow-\n" "white tail. The tail splits from its tip as\n" "it grows older."); const u8 gVulpixPokedexTextUnused_LG[] = _(""); const u8 gNinetalesPokedexText_LG[] = _( "Very smart and very vengeful. Grabbing\n" "one of its many tails could result in a\n" "1,000-year curse."); const u8 gNinetalesPokedexTextUnused_LG[] = _(""); const u8 gJigglypuffPokedexText_LG[] = _( "When its huge eyes waver, it sings a\n" "mysteriously soothing melody that lulls\n" "its enemies to sleep."); const u8 gJigglypuffPokedexTextUnused_LG[] = _(""); const u8 gWigglytuffPokedexText_LG[] = _( "The body is soft and rubbery. When\n" "angered, it will suck in air and inflate\n" "itself to an enormous size."); const u8 gWigglytuffPokedexTextUnused_LG[] = _(""); const u8 gZubatPokedexText_LG[] = _( "It forms colonies in perpetually dark \n" "places and uses ultrasonic waves to \n" "identify and approach targets."); const u8 gZubatPokedexTextUnused_LG[] = _(""); const u8 gGolbatPokedexText_LG[] = _( "Once it bites, it will not stop draining\n" "energy from the victim even if it gets too\n" "heavy to fly."); const u8 gGolbatPokedexTextUnused_LG[] = _(""); const u8 gOddishPokedexText_LG[] = _( "During the day, it keeps its face buried\n" "in the ground. At night, it wanders around\n" "sowing its seeds."); const u8 gOddishPokedexTextUnused_LG[] = _(""); const u8 gGloomPokedexText_LG[] = _( "The fluid that oozes from its mouth isn't\n" "drool. It is a nectar that is used to\n" "attract prey."); const u8 gGloomPokedexTextUnused_LG[] = _(""); const u8 gVileplumePokedexText_LG[] = _( "The larger its petals, the more toxic\n" "pollen it contains. Its big head is heavy\n" "and hard to hold up."); const u8 gVileplumePokedexTextUnused_LG[] = _(""); const u8 gParasPokedexText_LG[] = _( "Burrows to suck tree roots. The mushrooms\n" "on its back grow by drawing nutrients from\n" "the bug host."); const u8 gParasPokedexTextUnused_LG[] = _(""); const u8 gParasectPokedexText_LG[] = _( "A host-parasite pair in which the parasite\n" "mushroom has taken over the host bug.\n" "Prefers damp places. "); const u8 gParasectPokedexTextUnused_LG[] = _(""); const u8 gVenonatPokedexText_LG[] = _( "Lives in the shadows of tall trees where\n" "it eats bugs. It is attracted by light\n" "at night."); const u8 gVenonatPokedexTextUnused_LG[] = _(""); const u8 gVenomothPokedexText_LG[] = _( "The dustlike scales covering its wings\n" "are color-coded to indicate the kinds of\n" "poison it has."); const u8 gVenomothPokedexTextUnused_LG[] = _(""); const u8 gDiglettPokedexText_LG[] = _( "Lives about one yard underground where it\n" "feeds on plant roots. It sometimes appears\n" "aboveground."); const u8 gDiglettPokedexTextUnused_LG[] = _(""); const u8 gDugtrioPokedexText_LG[] = _( "A team of DIGLETT triplets. It triggers\n" "huge earthquakes by burrowing 60 miles\n" "underground."); const u8 gDugtrioPokedexTextUnused_LG[] = _(""); const u8 gMeowthPokedexText_LG[] = _( "Adores round objects. It wanders the\n" "streets on a nightly basis to look for\n" "dropped loose change."); const u8 gMeowthPokedexTextUnused_LG[] = _(""); const u8 gPersianPokedexText_LG[] = _( "Although its fur has many admirers, it is\n" "tough to raise as a pet because of its\n" "fickle meanness."); const u8 gPersianPokedexTextUnused_LG[] = _(""); const u8 gPsyduckPokedexText_LG[] = _( "While lulling its enemies with its vacant\n" "look, this wily POKéMON will use\n" "psychokinetic powers."); const u8 gPsyduckPokedexTextUnused_LG[] = _(""); const u8 gGolduckPokedexText_LG[] = _( "Often seen swimming elegantly by\n" "lakeshores. It is often mistaken for the\n" "Japanese monster Kappa."); const u8 gGolduckPokedexTextUnused_LG[] = _(""); const u8 gMankeyPokedexText_LG[] = _( "Extremely quick to anger. It could be\n" "docile one moment, then thrashing away \n" "the next instant."); const u8 gMankeyPokedexTextUnused_LG[] = _(""); const u8 gPrimeapePokedexText_LG[] = _( "Always furious and tenacious to boot.\n" "It will not abandon chasing its quarry\n" "until it catches up."); const u8 gPrimeapePokedexTextUnused_LG[] = _(""); const u8 gGrowlithePokedexText_LG[] = _( "It is very protective of its territory.\n" "It will bark and bite to repel intruders\n" "from its space."); const u8 gGrowlithePokedexTextUnused_LG[] = _(""); const u8 gArcaninePokedexText_LG[] = _( "A POKéMON that has long been admired\n" "for its beauty. It runs agilely as if\n" "on wings."); const u8 gArcaninePokedexTextUnused_LG[] = _(""); const u8 gPoliwagPokedexText_LG[] = _( "Its newly grown legs prevent it from\n" "walking well. It appears to prefer\n" "swimming over walking."); const u8 gPoliwagPokedexTextUnused_LG[] = _(""); const u8 gPoliwhirlPokedexText_LG[] = _( "It can live in or out of water. When out\n" "of water, it constantly sweats to keep its\n" "body slimy."); const u8 gPoliwhirlPokedexTextUnused_LG[] = _(""); const u8 gPoliwrathPokedexText_LG[] = _( "A swimmer adept at both the front crawl\n" "and breaststroke. Easily overtakes the\n" "best human swimmers."); const u8 gPoliwrathPokedexTextUnused_LG[] = _(""); const u8 gAbraPokedexText_LG[] = _( "Using its ability to read minds, it will\n" "sense impending danger and TELEPORT to\n" "safety."); const u8 gAbraPokedexTextUnused_LG[] = _(""); const u8 gKadabraPokedexText_LG[] = _( "It emits special alpha waves from its\n" "body that induce headaches just by being\n" "close."); const u8 gKadabraPokedexTextUnused_LG[] = _(""); const u8 gAlakazamPokedexText_LG[] = _( "Its brain can outperform a supercomputer.\n" "Its IQ (intelligence quotient) is said to\n" "be around 5,000."); const u8 gAlakazamPokedexTextUnused_LG[] = _(""); const u8 gMachopPokedexText_LG[] = _( "Loves to build its muscles. It trains in\n" "all styles of martial arts to become even\n" "stronger."); const u8 gMachopPokedexTextUnused_LG[] = _(""); const u8 gMachokePokedexText_LG[] = _( "Its muscular body is so powerful, it must\n" "wear a power-save belt to be able to\n" "regulate its motions."); const u8 gMachokePokedexTextUnused_LG[] = _(""); const u8 gMachampPokedexText_LG[] = _( "Its superpowerful punches are said to\n" "knock the victim flying clear over the\n" "horizon."); const u8 gMachampPokedexTextUnused_LG[] = _(""); const u8 gBellsproutPokedexText_LG[] = _( "A carnivorous POKéMON that traps and eats\n" "bugs. It appears to use its root feet to\n" "replenish moisture."); const u8 gBellsproutPokedexTextUnused_LG[] = _(""); const u8 gWeepinbellPokedexText_LG[] = _( "It spits out POISONPOWDER to immobilize\n" "the enemy and then finishes it with a\n" "spray of ACID."); const u8 gWeepinbellPokedexTextUnused_LG[] = _(""); const u8 gVictreebelPokedexText_LG[] = _( "Said to live in huge colonies deep in\n" "jungles, although no one has ever\n" "returned from there."); const u8 gVictreebelPokedexTextUnused_LG[] = _(""); const u8 gTentacoolPokedexText_LG[] = _( "Drifts in shallow seas. Anglers who hook\n" "them by accident are often punished by\n" "their stingers."); const u8 gTentacoolPokedexTextUnused_LG[] = _(""); const u8 gTentacruelPokedexText_LG[] = _( "The tentacles are normally kept short.\n" "On hunts, they are extended to ensnare\n" "and immobilize prey."); const u8 gTentacruelPokedexTextUnused_LG[] = _(""); const u8 gGeodudePokedexText_LG[] = _( "Found in fields and mountains. Mistaking\n" "them for boulders, people often step or\n" "trip on them."); const u8 gGeodudePokedexTextUnused_LG[] = _(""); const u8 gGravelerPokedexText_LG[] = _( "Rolls down slopes to move. It rolls over\n" "any obstacle without slowing or changing\n" "its direction."); const u8 gGravelerPokedexTextUnused_LG[] = _(""); const u8 gGolemPokedexText_LG[] = _( "Its boulder-like body is extremely hard.\n" "It can easily withstand dynamite blasts\n" "without taking damage."); const u8 gGolemPokedexTextUnused_LG[] = _(""); const u8 gPonytaPokedexText_LG[] = _( "Its hooves are ten times harder than\n" "diamond. It can trample anything\n" "completely flat in little time."); const u8 gPonytaPokedexTextUnused_LG[] = _(""); const u8 gRapidashPokedexText_LG[] = _( "Very competitive, this POKéMON will chase\n" "anything that moves fast in the hopes of\n" "racing it."); const u8 gRapidashPokedexTextUnused_LG[] = _(""); const u8 gSlowpokePokedexText_LG[] = _( "Incredibly slow and dopey. It takes five\n" "seconds for it to feel pain when under\n" "attack."); const u8 gSlowpokePokedexTextUnused_LG[] = _(""); const u8 gSlowbroPokedexText_LG[] = _( "The SHELLDER that latches onto\n" "SLOWPOKE's tail is said to feed on the\n" "host's leftover scraps."); const u8 gSlowbroPokedexTextUnused_LG[] = _(""); const u8 gMagnemitePokedexText_LG[] = _( "Uses antigravity to stay suspended.\n" "Appears without warning and uses THUNDER\n" "WAVE and similar moves."); const u8 gMagnemitePokedexTextUnused_LG[] = _(""); const u8 gMagnetonPokedexText_LG[] = _( "Formed by several MAGNEMITE linked\n" "together. They frequently appear when\n" "sunspots flare up."); const u8 gMagnetonPokedexTextUnused_LG[] = _(""); const u8 gFarfetchdPokedexText_LG[] = _( "The plant stalk it holds is its weapon.\n" "The stalk is used like a sword to cut all\n" "sorts of things."); const u8 gFarfetchdPokedexTextUnused_LG[] = _(""); const u8 gDoduoPokedexText_LG[] = _( "A bird that makes up for its poor flying\n" "with its fast foot speed. Leaves giant\n" "footprints."); const u8 gDoduoPokedexTextUnused_LG[] = _(""); const u8 gDodrioPokedexText_LG[] = _( "Uses its three brains to execute complex\n" "plans. While two heads sleep, one head is\n" "said to stay awake."); const u8 gDodrioPokedexTextUnused_LG[] = _(""); const u8 gSeelPokedexText_LG[] = _( "The protruding horn on its head is very\n" "hard. It is used for bashing through thick\n" "icebergs."); const u8 gSeelPokedexTextUnused_LG[] = _(""); const u8 gDewgongPokedexText_LG[] = _( "It stores thermal energy in the body.\n" "It swims at a steady eight knots even in\n" "intensely cold waters."); const u8 gDewgongPokedexTextUnused_LG[] = _(""); const u8 gGrimerPokedexText_LG[] = _( "Appears in filthy areas. It thrives by\n" "sucking up polluted sludge that is pumped\n" "out of factories."); const u8 gGrimerPokedexTextUnused_LG[] = _(""); const u8 gMukPokedexText_LG[] = _( "Thickly covered with a filthy, vile\n" "sludge. It is so toxic, even its footprints\n" "contain poison."); const u8 gMukPokedexTextUnused_LG[] = _(""); const u8 gShellderPokedexText_LG[] = _( "Its hard shell repels any kind of attack.\n" "It is vulnerable only when its shell is\n" "open."); const u8 gShellderPokedexTextUnused_LG[] = _(""); const u8 gCloysterPokedexText_LG[] = _( "When attacked, it launches its horns in\n" "quick volleys. Its innards have never been\n" "seen."); const u8 gCloysterPokedexTextUnused_LG[] = _(""); const u8 gGastlyPokedexText_LG[] = _( "Almost invisible, this gaseous POKéMON\n" "cloaks the target and puts it to sleep\n" "without notice."); const u8 gGastlyPokedexTextUnused_LG[] = _(""); const u8 gHaunterPokedexText_LG[] = _( "Because of its ability to slip through\n" "block walls, it is said to be from another\n" "dimension."); const u8 gHaunterPokedexTextUnused_LG[] = _(""); const u8 gGengarPokedexText_LG[] = _( "On the night of a full moon, if shadows\n" "move on their own and laugh, it must be\n" "GENGAR's doing."); const u8 gGengarPokedexTextUnused_LG[] = _(""); const u8 gOnixPokedexText_LG[] = _( "As it grows, the stone portions of its\n" "body harden to become similar to\n" "black-colored diamonds."); const u8 gOnixPokedexTextUnused_LG[] = _(""); const u8 gDrowzeePokedexText_LG[] = _( "Puts enemies to sleep, then eats their\n" "dreams. Occasionally gets sick from eating\n" "only bad dreams."); const u8 gDrowzeePokedexTextUnused_LG[] = _(""); const u8 gHypnoPokedexText_LG[] = _( "When it locks eyes with an enemy, it will\n" "use a mix of PSI moves such as HYPNOSIS\n" "and CONFUSION."); const u8 gHypnoPokedexTextUnused_LG[] = _(""); const u8 gKrabbyPokedexText_LG[] = _( "Its pincers are not only powerful weapons,\n" "they are used for balance when walking\n" "sideways."); const u8 gKrabbyPokedexTextUnused_LG[] = _(""); const u8 gKinglerPokedexText_LG[] = _( "The large pincer has 10,000-horsepower\n" "crushing force. However, its huge size\n" "makes it unwieldy to use."); const u8 gKinglerPokedexTextUnused_LG[] = _(""); const u8 gVoltorbPokedexText_LG[] = _( "Usually found in power plants. Easily\n" "mistaken for a POKé BALL, it has\n" "zapped many people."); const u8 gVoltorbPokedexTextUnused_LG[] = _(""); const u8 gElectrodePokedexText_LG[] = _( "It stores electric energy under very high\n" "pressure. It often explodes with little or\n" "no provocation."); const u8 gElectrodePokedexTextUnused_LG[] = _(""); const u8 gExeggcutePokedexText_LG[] = _( "It is often mistaken for eggs. When\n" "disturbed, they quickly gather and attack\n" "in swarms."); const u8 gExeggcutePokedexTextUnused_LG[] = _(""); const u8 gExeggutorPokedexText_LG[] = _( "It is said that on rare occasions, one\n" "of its heads will drop off and continue on\n" "as an EXEGGCUTE."); const u8 gExeggutorPokedexTextUnused_LG[] = _(""); const u8 gCubonePokedexText_LG[] = _( "Because it never removes its skull helmet,\n" "no one has ever seen this POKéMON's real\n" "face."); const u8 gCubonePokedexTextUnused_LG[] = _(""); const u8 gMarowakPokedexText_LG[] = _( "The bone it holds is its key weapon.\n" "It throws the bone skillfully like a\n" "boomerang to KO targets."); const u8 gMarowakPokedexTextUnused_LG[] = _(""); const u8 gHitmonleePokedexText_LG[] = _( "When in a hurry, its legs lengthen\n" "progressively. It runs smoothly with\n" "extra-long, loping strides."); const u8 gHitmonleePokedexTextUnused_LG[] = _(""); const u8 gHitmonchanPokedexText_LG[] = _( "While apparently doing nothing, it fires\n" "punches in lightning-fast volleys that are\n" "impossible to see."); const u8 gHitmonchanPokedexTextUnused_LG[] = _(""); const u8 gLickitungPokedexText_LG[] = _( "Its tongue can be extended like a\n" "chameleon's. It leaves a tingling\n" "sensation when it licks enemies."); const u8 gLickitungPokedexTextUnused_LG[] = _(""); const u8 gKoffingPokedexText_LG[] = _( "Because it stores several kinds of toxic\n" "gases in its body, it is prone to\n" "exploding without warning."); const u8 gKoffingPokedexTextUnused_LG[] = _(""); const u8 gWeezingPokedexText_LG[] = _( "Where two kinds of poison gases meet, two\n" "KOFFING can fuse into a WEEZING over\n" "many years."); const u8 gWeezingPokedexTextUnused_LG[] = _(""); const u8 gRhyhornPokedexText_LG[] = _( "Its massive bones are 1,000 times harder\n" "than human bones. Its TACKLE can knock a\n" "semitrailer flying."); const u8 gRhyhornPokedexTextUnused_LG[] = _(""); const u8 gRhydonPokedexText_LG[] = _( "Protected by an armor-like hide, it is\n" "capable of living in molten lava of 3,600\n" "degrees Fahrenheit."); const u8 gRhydonPokedexTextUnused_LG[] = _(""); const u8 gChanseyPokedexText_LG[] = _( "A rare and elusive POKéMON that is said\n" "to bring happiness to those who manage to\n" "catch one."); const u8 gChanseyPokedexTextUnused_LG[] = _(""); const u8 gTangelaPokedexText_LG[] = _( "The whole body is swathed with wide vines\n" "that are similar to seaweed. The vines\n" "sway as it walks."); const u8 gTangelaPokedexTextUnused_LG[] = _(""); const u8 gKangaskhanPokedexText_LG[] = _( "The infant rarely ventures out of its\n" "mother's protective pouch until it is\n" "three years old."); const u8 gKangaskhanPokedexTextUnused_LG[] = _(""); const u8 gHorseaPokedexText_LG[] = _( "Known to shoot down flying bugs with\n" "precision blasts of ink from the surface\n" "of the water."); const u8 gHorseaPokedexTextUnused_LG[] = _(""); const u8 gSeadraPokedexText_LG[] = _( "It is capable of swimming backwards by\n" "rapidly flapping its winglike pectoral fins\n" "and stout tail."); const u8 gSeadraPokedexTextUnused_LG[] = _(""); const u8 gGoldeenPokedexText_LG[] = _( "Its tail fin billows like an elegant\n" "ballroom dress, giving it the nickname of\n" "“The Water Queen.”"); const u8 gGoldeenPokedexTextUnused_LG[] = _(""); const u8 gSeakingPokedexText_LG[] = _( "In the autumn spawning season, they can\n" "be seen swimming powerfully up rivers and\n" "creeks."); const u8 gSeakingPokedexTextUnused_LG[] = _(""); const u8 gStaryuPokedexText_LG[] = _( "An enigmatic POKéMON that can effortlessly\n" "regenerate any appendage it loses in\n" "battle."); const u8 gStaryuPokedexTextUnused_LG[] = _(""); const u8 gStarmiePokedexText_LG[] = _( "Its central core glows with the seven\n" "colors of the rainbow. Some people value\n" "the core as a gem."); const u8 gStarmiePokedexTextUnused_LG[] = _(""); const u8 gMrmimePokedexText_LG[] = _( "If interrupted while it is miming, it will\n" "suddenly DOUBLESLAP the offender with its\n" "broad hands."); const u8 gMrmimePokedexTextUnused_LG[] = _(""); const u8 gScytherPokedexText_LG[] = _( "With ninja-like agility and speed, it can\n" "create the illusion that there is more\n" "than one of itself."); const u8 gScytherPokedexTextUnused_LG[] = _(""); const u8 gJynxPokedexText_LG[] = _( "It seductively wiggles its hips as it\n" "walks. It can cause people to dance in\n" "unison with it."); const u8 gJynxPokedexTextUnused_LG[] = _(""); const u8 gElectabuzzPokedexText_LG[] = _( "Normally found near power plants, they\n" "can wander away and cause major\n" "blackouts in cities."); const u8 gElectabuzzPokedexTextUnused_LG[] = _(""); const u8 gMagmarPokedexText_LG[] = _( "Its body always burns with an orange glow\n" "that enables it to hide perfectly amidst\n" "flames."); const u8 gMagmarPokedexTextUnused_LG[] = _(""); const u8 gPinsirPokedexText_LG[] = _( "If it fails to crush the foe in its\n" "pincers, it will swing around and toss\n" "the opponent."); const u8 gPinsirPokedexTextUnused_LG[] = _(""); const u8 gTaurosPokedexText_LG[] = _( "When it targets an enemy, it charges\n" "furiously while whipping its body with its\n" "long tails."); const u8 gTaurosPokedexTextUnused_LG[] = _(""); const u8 gMagikarpPokedexText_LG[] = _( "In the distant past, it was somewhat\n" "stronger than the horribly weak\n" "descendants that exist today."); const u8 gMagikarpPokedexTextUnused_LG[] = _(""); const u8 gGyaradosPokedexText_LG[] = _( "Rarely seen in the wild. Huge and vicious,\n" "it is capable of destroying entire cities\n" "in a rage."); const u8 gGyaradosPokedexTextUnused_LG[] = _(""); const u8 gLaprasPokedexText_LG[] = _( "A POKéMON that has been overhunted\n" "almost to extinction. It can ferry people\n" "on its back."); const u8 gLaprasPokedexTextUnused_LG[] = _(""); const u8 gDittoPokedexText_LG[] = _( "Capable of copying an opponent's genetic\n" "code to instantly transform itself into a\n" "duplicate of the enemy."); const u8 gDittoPokedexTextUnused_LG[] = _(""); const u8 gEeveePokedexText_LG[] = _( "Its genetic code is irregular. It may\n" "mutate if it is exposed to radiation from\n" "element STONES."); const u8 gEeveePokedexTextUnused_LG[] = _(""); const u8 gVaporeonPokedexText_LG[] = _( "Lives close to water. Its long tail is\n" "ridged with a fin which is often mistaken\n" "for a mermaid's."); const u8 gVaporeonPokedexTextUnused_LG[] = _(""); const u8 gJolteonPokedexText_LG[] = _( "It accumulates negative ions in the\n" "atmosphere to blast out 10,000-volt\n" "lightning bolts."); const u8 gJolteonPokedexTextUnused_LG[] = _(""); const u8 gFlareonPokedexText_LG[] = _( "When storing thermal energy in its body,\n" "its temperature can soar to over 1,600\n" "degrees Fahrenheit."); const u8 gFlareonPokedexTextUnused_LG[] = _(""); const u8 gPorygonPokedexText_LG[] = _( "A POKéMON that consists entirely of\n" "programming code. It is capable of moving\n" "freely in cyberspace."); const u8 gPorygonPokedexTextUnused_LG[] = _(""); const u8 gOmanytePokedexText_LG[] = _( "Although long extinct, in rare cases, it\n" "can be genetically regenerated from\n" "fossils."); const u8 gOmanytePokedexTextUnused_LG[] = _(""); const u8 gOmastarPokedexText_LG[] = _( "Despite having strong fangs and tentacles,\n" "it went extinct when its heavy shell made\n" "it unable to catch prey."); const u8 gOmastarPokedexTextUnused_LG[] = _(""); const u8 gKabutoPokedexText_LG[] = _( "A POKéMON that was regenerated from a\n" "fossil found in what was once the ocean\n" "floor long ago."); const u8 gKabutoPokedexTextUnused_LG[] = _(""); const u8 gKabutopsPokedexText_LG[] = _( "Its sleek shape is perfect for swimming.\n" "It slashes prey with its claws and drains\n" "their fluids."); const u8 gKabutopsPokedexTextUnused_LG[] = _(""); const u8 gAerodactylPokedexText_LG[] = _( "A ferocious, prehistoric POKéMON that\n" "goes for the enemy's throat with its\n" "serrated, sawlike fangs."); const u8 gAerodactylPokedexTextUnused_LG[] = _(""); const u8 gSnorlaxPokedexText_LG[] = _( "Very lazy. Just eats and sleeps. As its\n" "rotund bulk builds, it becomes steadily\n" "more slothful."); const u8 gSnorlaxPokedexTextUnused_LG[] = _(""); const u8 gArticunoPokedexText_LG[] = _( "A legendary bird POKéMON that is said to\n" "appear to doomed people who are lost in\n" "icy mountains."); const u8 gArticunoPokedexTextUnused_LG[] = _(""); const u8 gZapdosPokedexText_LG[] = _( "A legendary bird POKéMON that is said to\n" "appear from clouds while dropping\n" "enormous lightning bolts."); const u8 gZapdosPokedexTextUnused_LG[] = _(""); const u8 gMoltresPokedexText_LG[] = _( "It is said to be the legendary bird\n" "POKéMON of fire. Every flap of its wings\n" "creates a dazzling flare of flames."); const u8 gMoltresPokedexTextUnused_LG[] = _(""); const u8 gDratiniPokedexText_LG[] = _( "Long considered a mythical POKéMON until\n" "recently, when a small colony was found\n" "living underwater."); const u8 gDratiniPokedexTextUnused_LG[] = _(""); const u8 gDragonairPokedexText_LG[] = _( "A mystical POKéMON that exudes a gentle\n" "aura. It is said to have the ability to\n" "change the weather."); const u8 gDragonairPokedexTextUnused_LG[] = _(""); const u8 gDragonitePokedexText_LG[] = _( "Only a very few people ever see this\n" "POKéMON. Its intelligence is said to\n" "match that of humans."); const u8 gDragonitePokedexTextUnused_LG[] = _(""); const u8 gMewtwoPokedexText_LG[] = _( "It was created by a scientist after years\n" "of horrific gene-splicing and DNA-\n" "engineering experiments."); const u8 gMewtwoPokedexTextUnused_LG[] = _(""); const u8 gMewPokedexText_LG[] = _( "So rare that it is still said to be a\n" "mirage by many experts. Only a few people\n" "have seen it worldwide."); const u8 gMewPokedexTextUnused_LG[] = _(""); const u8 gChikoritaPokedexText_LG[] = _( "A sweet aroma gently wafts from the leaf\n" "on its head. It is docile and loves to\n" "soak up the sun's rays."); const u8 gChikoritaPokedexTextUnused_LG[] = _(""); const u8 gBayleefPokedexText_LG[] = _( "The scent of spices comes from around\n" "its neck. Somehow, sniffing it makes you\n" "want to fight."); const u8 gBayleefPokedexTextUnused_LG[] = _(""); const u8 gMeganiumPokedexText_LG[] = _( "The aroma that rises from its petals\n" "contains a substance that calms aggressive\n" "feelings."); const u8 gMeganiumPokedexTextUnused_LG[] = _(""); const u8 gCyndaquilPokedexText_LG[] = _( "It is timid and always curls itself up in\n" "a ball. If attacked, it flares up its back\n" "for protection."); const u8 gCyndaquilPokedexTextUnused_LG[] = _(""); const u8 gQuilavaPokedexText_LG[] = _( "Be careful if it turns its back during\n" "battle. It means that it will attack with\n" "the fire on its back."); const u8 gQuilavaPokedexTextUnused_LG[] = _(""); const u8 gTyphlosionPokedexText_LG[] = _( "If its rage peaks, it becomes so hot that\n" "anything that touches it will instantly go\n" "up in flames."); const u8 gTyphlosionPokedexTextUnused_LG[] = _(""); const u8 gTotodilePokedexText_LG[] = _( "Its well-developed jaws are powerful and\n" "capable of crushing anything. Even its\n" "TRAINER must be careful."); const u8 gTotodilePokedexTextUnused_LG[] = _(""); const u8 gCroconawPokedexText_LG[] = _( "If it loses a fang, a new one grows back\n" "in its place. There are always 48 fangs\n" "lining its mouth."); const u8 gCroconawPokedexTextUnused_LG[] = _(""); const u8 gFeraligatrPokedexText_LG[] = _( "When it bites with its massive and\n" "powerful jaws, it shakes its head and\n" "savagely tears up its victim."); const u8 gFeraligatrPokedexTextUnused_LG[] = _(""); const u8 gSentretPokedexText_LG[] = _( "A very cautious POKéMON, it raises itself\n" "up using its tail to get a better view of\n" "its surroundings."); const u8 gSentretPokedexTextUnused_LG[] = _(""); const u8 gFurretPokedexText_LG[] = _( "It makes a nest to suit its long and skinny\n" "body. The nest is impossible for other\n" "POKéMON to enter."); const u8 gFurretPokedexTextUnused_LG[] = _(""); const u8 gHoothootPokedexText_LG[] = _( "It always stands on one foot. It changes\n" "feet so fast, the movement can rarely be\n" "seen."); const u8 gHoothootPokedexTextUnused_LG[] = _(""); const u8 gNoctowlPokedexText_LG[] = _( "Its eyes are specially adapted. They\n" "concentrate even faint light and enable it\n" "to see in the dark."); const u8 gNoctowlPokedexTextUnused_LG[] = _(""); const u8 gLedybaPokedexText_LG[] = _( "It is very timid. It will be afraid to\n" "move if it is alone. But it will be active\n" "if it is in a group."); const u8 gLedybaPokedexTextUnused_LG[] = _(""); const u8 gLedianPokedexText_LG[] = _( "When the stars flicker in the night sky, it\n" "flutters about, scattering a glowing\n" "powder."); const u8 gLedianPokedexTextUnused_LG[] = _(""); const u8 gSpinarakPokedexText_LG[] = _( "It lies still in the same pose for days\n" "in its web, waiting for its unsuspecting\n" "prey to wander close."); const u8 gSpinarakPokedexTextUnused_LG[] = _(""); const u8 gAriadosPokedexText_LG[] = _( "It spins string not only from its rear but\n" "also from its mouth. It is hard to tell\n" "which end is which."); const u8 gAriadosPokedexTextUnused_LG[] = _(""); const u8 gCrobatPokedexText_LG[] = _( "It flies so silently through the dark on\n" "its four wings that it may not be noticed\n" "even when nearby."); const u8 gCrobatPokedexTextUnused_LG[] = _(""); const u8 gChinchouPokedexText_LG[] = _( "It shoots positive and negative\n" "electricity between the tips of its two\n" "antennae and zaps its enemies."); const u8 gChinchouPokedexTextUnused_LG[] = _(""); const u8 gLanturnPokedexText_LG[] = _( "The light it emits is so bright that it can\n" "illuminate the sea's surface from a depth\n" "of over three miles."); const u8 gLanturnPokedexTextUnused_LG[] = _(""); const u8 gPichuPokedexText_LG[] = _( "It is not yet skilled at storing\n" "electricity. It may send out a jolt if\n" "amused or startled."); const u8 gPichuPokedexTextUnused_LG[] = _(""); const u8 gCleffaPokedexText_LG[] = _( "Because of its unusual, starlike\n" "silhouette, people believe that it came\n" "here on a meteor."); const u8 gCleffaPokedexTextUnused_LG[] = _(""); const u8 gIgglybuffPokedexText_LG[] = _( "It has a very soft body. If it starts to\n" "roll, it will bounce all over and be\n" "impossible to stop."); const u8 gIgglybuffPokedexTextUnused_LG[] = _(""); const u8 gTogepiPokedexText_LG[] = _( "The shell seems to be filled with joy.\n" "It is said that it will share good luck\n" "when treated kindly."); const u8 gTogepiPokedexTextUnused_LG[] = _(""); const u8 gTogeticPokedexText_LG[] = _( "They say that it will appear before\n" "kindhearted, caring people and shower\n" "them with happiness."); const u8 gTogeticPokedexTextUnused_LG[] = _(""); const u8 gNatuPokedexText_LG[] = _( "Because its wings aren't yet fully grown,\n" "it has to hop to get around. It is always\n" "staring at something."); const u8 gNatuPokedexTextUnused_LG[] = _(""); const u8 gXatuPokedexText_LG[] = _( "They say that it stays still and quiet\n" "because it is seeing both the past and\n" "future at the same time."); const u8 gXatuPokedexTextUnused_LG[] = _(""); const u8 gMareepPokedexText_LG[] = _( "If static electricity builds in its body,\n" "its fleece doubles in volume. Touching\n" "it will shock you."); const u8 gMareepPokedexTextUnused_LG[] = _(""); const u8 gFlaaffyPokedexText_LG[] = _( "As a result of storing too much\n" "electricity, it developed patches where\n" "even downy wool won't grow."); const u8 gFlaaffyPokedexTextUnused_LG[] = _(""); const u8 gAmpharosPokedexText_LG[] = _( "The tail's tip shines brightly and can be\n" "seen from far away. It acts as a beacon\n" "for lost people."); const u8 gAmpharosPokedexTextUnused_LG[] = _(""); const u8 gBellossomPokedexText_LG[] = _( "BELLOSSOM gather at times and appear to\n" "dance. They say that the dance is a\n" "ritual to summon the sun."); const u8 gBellossomPokedexTextUnused_LG[] = _(""); const u8 gMarillPokedexText_LG[] = _( "The tip of its tail, which contains oil\n" "that is lighter than water, lets it swim\n" "without drowning."); const u8 gMarillPokedexTextUnused_LG[] = _(""); const u8 gAzumarillPokedexText_LG[] = _( "By keeping still and listening intently, it\n" "can even tell what is in wild, fast-moving\n" "rivers."); const u8 gAzumarillPokedexTextUnused_LG[] = _(""); const u8 gSudowoodoPokedexText_LG[] = _( "Although it always pretends to be a tree,\n" "its composition appears to be closer to a\n" "rock than a plant."); const u8 gSudowoodoPokedexTextUnused_LG[] = _(""); const u8 gPolitoedPokedexText_LG[] = _( "If POLIWAG and POLIWHIRL hear its\n" "echoing cry, they respond by gathering\n" "from far and wide."); const u8 gPolitoedPokedexTextUnused_LG[] = _(""); const u8 gHoppipPokedexText_LG[] = _( "To keep from being blown away by the\n" "wind, they gather in clusters. They do\n" "enjoy gentle breezes, though."); const u8 gHoppipPokedexTextUnused_LG[] = _(""); const u8 gSkiploomPokedexText_LG[] = _( "The bloom on top of its head opens and\n" "closes as the temperature fluctuates up\n" "and down."); const u8 gSkiploomPokedexTextUnused_LG[] = _(""); const u8 gJumpluffPokedexText_LG[] = _( "Once it catches the wind, it deftly\n" "controls its cotton-puff spores to float,\n" "even around the world."); const u8 gJumpluffPokedexTextUnused_LG[] = _(""); const u8 gAipomPokedexText_LG[] = _( "Its tail is so powerful that it can use it\n" "to grab a tree branch and hold itself up\n" "in the air."); const u8 gAipomPokedexTextUnused_LG[] = _(""); const u8 gSunkernPokedexText_LG[] = _( "It may drop out of the sky suddenly.\n" "If attacked by a SPEAROW, it will\n" "violently shake its leaves."); const u8 gSunkernPokedexTextUnused_LG[] = _(""); const u8 gSunfloraPokedexText_LG[] = _( "It converts sunlight into energy. In the\n" "darkness after sunset, it closes its petals\n" "and becomes still."); const u8 gSunfloraPokedexTextUnused_LG[] = _(""); const u8 gYanmaPokedexText_LG[] = _( "If it flaps its wings really fast, it can\n" "generate shock waves that will shatter\n" "windows in the area."); const u8 gYanmaPokedexTextUnused_LG[] = _(""); const u8 gWooperPokedexText_LG[] = _( "This POKéMON lives in cold water. It will\n" "leave the water to search for food when\n" "it gets cold outside."); const u8 gWooperPokedexTextUnused_LG[] = _(""); const u8 gQuagsirePokedexText_LG[] = _( "This carefree POKéMON has an easygoing\n" "nature. While swimming, it always bumps\n" "into boat hulls."); const u8 gQuagsirePokedexTextUnused_LG[] = _(""); const u8 gEspeonPokedexText_LG[] = _( "It uses the fine hair that covers its body\n" "to sense air currents and predict its\n" "enemy's actions."); const u8 gEspeonPokedexTextUnused_LG[] = _(""); const u8 gUmbreonPokedexText_LG[] = _( "When agitated, this POKéMON protects\n" "itself by spraying poisonous sweat from its\n" "pores."); const u8 gUmbreonPokedexTextUnused_LG[] = _(""); const u8 gMurkrowPokedexText_LG[] = _( "Feared and loathed by many, it is\n" "believed to bring misfortune to all those\n" "who see it at night."); const u8 gMurkrowPokedexTextUnused_LG[] = _(""); const u8 gSlowkingPokedexText_LG[] = _( "It has incredible intellect and intuition.\n" "Whatever the situation, it remains calm\n" "and collected."); const u8 gSlowkingPokedexTextUnused_LG[] = _(""); const u8 gMisdreavusPokedexText_LG[] = _( "It likes playing mischievous tricks such as\n" "screaming and wailing to startle people at\n" "night. "); const u8 gMisdreavusPokedexTextUnused_LG[] = _(""); const u8 gUnownPokedexText_LG[] = _( "Their shapes look like hieroglyphs on\n" "ancient tablets. It is said that the two\n" "are somehow related."); const u8 gUnownPokedexTextUnused_LG[] = _(""); const u8 gWobbuffetPokedexText_LG[] = _( "It hates light and shock. If attacked,\n" "it inflates its body to pump up its\n" "counterstrike."); const u8 gWobbuffetPokedexTextUnused_LG[] = _(""); const u8 gGirafarigPokedexText_LG[] = _( "Its tail has a small brain of its own.\n" "Beware! If you get close, it may react\n" "to your scent and bite."); const u8 gGirafarigPokedexTextUnused_LG[] = _(""); const u8 gPinecoPokedexText_LG[] = _( "It likes to make its shell thicker by\n" "adding layers of tree bark. The extra\n" "weight doesn't bother it."); const u8 gPinecoPokedexTextUnused_LG[] = _(""); const u8 gForretressPokedexText_LG[] = _( "Its entire body is shielded by a steel-\n" "hard shell. What lurks inside the armor is\n" "a total mystery."); const u8 gForretressPokedexTextUnused_LG[] = _(""); const u8 gDunsparcePokedexText_LG[] = _( "When spotted, this POKéMON escapes\n" "backward by furiously boring into the\n" "ground with its tail."); const u8 gDunsparcePokedexTextUnused_LG[] = _(""); const u8 gGligarPokedexText_LG[] = _( "It flies straight at its target's face,\n" "then clamps down on the startled\n" "victim to inject poison."); const u8 gGligarPokedexTextUnused_LG[] = _(""); const u8 gSteelixPokedexText_LG[] = _( "Its body has been compressed deep under\n" "the ground. As a result, it is even harder\n" "than diamond."); const u8 gSteelixPokedexTextUnused_LG[] = _(""); const u8 gSnubbullPokedexText_LG[] = _( "Although it looks frightening, it is\n" "actually kind and affectionate. It is very\n" "popular among women."); const u8 gSnubbullPokedexTextUnused_LG[] = _(""); const u8 gGranbullPokedexText_LG[] = _( "It is actually timid and easily spooked.\n" "If attacked, it flails about to fend off\n" "its attacker."); const u8 gGranbullPokedexTextUnused_LG[] = _(""); const u8 gQwilfishPokedexText_LG[] = _( "To fire its poison spikes, it must inflate\n" "its body by drinking over 2.6 gallons of \n" "water all at once."); const u8 gQwilfishPokedexTextUnused_LG[] = _(""); const u8 gScizorPokedexText_LG[] = _( "It swings its eye-patterned pincers up to\n" "scare its foes. This makes it look like it\n" "has three heads."); const u8 gScizorPokedexTextUnused_LG[] = _(""); const u8 gShucklePokedexText_LG[] = _( "The BERRIES it stores in its vaselike\n" "shell decompose and become a gooey\n" "liquid."); const u8 gShucklePokedexTextUnused_LG[] = _(""); const u8 gHeracrossPokedexText_LG[] = _( "This powerful POKéMON thrusts its prized\n" "horn under its enemies' bellies, then lifts\n" "and throws them."); const u8 gHeracrossPokedexTextUnused_LG[] = _(""); const u8 gSneaselPokedexText_LG[] = _( "Its paws conceal sharp claws.\n" "If attacked, it suddenly extends the\n" "claws and startles its enemy."); const u8 gSneaselPokedexTextUnused_LG[] = _(""); const u8 gTeddiursaPokedexText_LG[] = _( "If it finds honey, its crescent mark glows.\n" "It always licks its paws because they are\n" "soaked with honey."); const u8 gTeddiursaPokedexTextUnused_LG[] = _(""); const u8 gUrsaringPokedexText_LG[] = _( "Although it is a good climber, it prefers\n" "to snap stout trees with its forelegs and\n" "eat fallen BERRIES."); const u8 gUrsaringPokedexTextUnused_LG[] = _(""); const u8 gSlugmaPokedexText_LG[] = _( "It never sleeps. It has to keep moving\n" "because if it stopped, its magma body\n" "would cool and harden."); const u8 gSlugmaPokedexTextUnused_LG[] = _(""); const u8 gMagcargoPokedexText_LG[] = _( "The shell on its back is just skin that\n" "has cooled and hardened. It breaks easily\n" "with a slight touch."); const u8 gMagcargoPokedexTextUnused_LG[] = _(""); const u8 gSwinubPokedexText_LG[] = _( "It rubs its snout on the ground to find\n" "and dig up food. It sometimes discovers\n" "hot springs."); const u8 gSwinubPokedexTextUnused_LG[] = _(""); const u8 gPiloswinePokedexText_LG[] = _( "Because the long hair all over its body\n" "obscures its sight, it just keeps charging\n" "repeatedly."); const u8 gPiloswinePokedexTextUnused_LG[] = _(""); const u8 gCorsolaPokedexText_LG[] = _( "It continuously sheds and grows. The tip\n" "of its head is prized as a treasure for\n" "its beauty."); const u8 gCorsolaPokedexTextUnused_LG[] = _(""); const u8 gRemoraidPokedexText_LG[] = _( "It has superb accuracy. The water it\n" "shoots out can strike even moving prey\n" "from more than 100 yards."); const u8 gRemoraidPokedexTextUnused_LG[] = _(""); const u8 gOctilleryPokedexText_LG[] = _( "It traps enemies with its suction-cupped\n" "tentacles, then smashes them with its\n" "rock-hard head."); const u8 gOctilleryPokedexTextUnused_LG[] = _(""); const u8 gDelibirdPokedexText_LG[] = _( "It carries food all day long. There are\n" "tales about lost people who were saved\n" "by the food it had."); const u8 gDelibirdPokedexTextUnused_LG[] = _(""); const u8 gMantinePokedexText_LG[] = _( "As it majestically swims, it doesn't care\n" "if REMORAID attach to it to scavenge\n" "for its leftovers."); const u8 gMantinePokedexTextUnused_LG[] = _(""); const u8 gSkarmoryPokedexText_LG[] = _( "Its sturdy wings look heavy, but its bones\n" "are hollow and light, allowing it to fly\n" "freely in the sky."); const u8 gSkarmoryPokedexTextUnused_LG[] = _(""); const u8 gHoundourPokedexText_LG[] = _( "It uses different kinds of cries for\n" "communicating with others of its kind and\n" "for pursuing prey."); const u8 gHoundourPokedexTextUnused_LG[] = _(""); const u8 gHoundoomPokedexText_LG[] = _( "If you are burned by the flames it shoots\n" "from its mouth, the pain will never go\n" "away."); const u8 gHoundoomPokedexTextUnused_LG[] = _(""); const u8 gKingdraPokedexText_LG[] = _( "It is said that it usually hides in\n" "underwater caves. It can create\n" "whirlpools by yawning."); const u8 gKingdraPokedexTextUnused_LG[] = _(""); const u8 gPhanpyPokedexText_LG[] = _( "It swings its long snout around playfully,\n" "but because it is so strong, this can be\n" "dangerous."); const u8 gPhanpyPokedexTextUnused_LG[] = _(""); const u8 gDonphanPokedexText_LG[] = _( "It has sharp, hard tusks and a rugged\n" "hide. Its TACKLE is strong enough to\n" "knock down a house."); const u8 gDonphanPokedexTextUnused_LG[] = _(""); const u8 gPorygon2PokedexText_LG[] = _( "This upgraded version of PORYGON is\n" "designed for space exploration. However,\n" "it can't even fly."); const u8 gPorygon2PokedexTextUnused_LG[] = _(""); const u8 gStantlerPokedexText_LG[] = _( "Its curved antlers subtly change the flow\n" "of air to create a strange space where\n" "reality is distorted."); const u8 gStantlerPokedexTextUnused_LG[] = _(""); const u8 gSmearglePokedexText_LG[] = _( "A special fluid oozes from the tip of its\n" "tail. It paints the fluid everywhere to\n" "mark its territory."); const u8 gSmearglePokedexTextUnused_LG[] = _(""); const u8 gTyroguePokedexText_LG[] = _( "It is always bursting with energy. To make\n" "itself stronger, it keeps on fighting even\n" "if it loses."); const u8 gTyroguePokedexTextUnused_LG[] = _(""); const u8 gHitmontopPokedexText_LG[] = _( "If you become enchanted by its smooth,\n" "elegant, dance-like kicks, you may get\n" "drilled hard."); const u8 gHitmontopPokedexTextUnused_LG[] = _(""); const u8 gSmoochumPokedexText_LG[] = _( "Its lips are the most sensitive parts on\n" "its body. It always uses its lips first to\n" "examine things."); const u8 gSmoochumPokedexTextUnused_LG[] = _(""); const u8 gElekidPokedexText_LG[] = _( "It rotates its arms to generate\n" "electricity, but it tires easily, so it\n" "charges up only a little bit."); const u8 gElekidPokedexTextUnused_LG[] = _(""); const u8 gMagbyPokedexText_LG[] = _( "Each and every time it inhales and\n" "exhales, hot embers dribble out of its\n" "mouth and nostrils."); const u8 gMagbyPokedexTextUnused_LG[] = _(""); const u8 gMiltankPokedexText_LG[] = _( "Its milk is packed with nutrition, making\n" "it the ultimate beverage for the sick or\n" "weary."); const u8 gMiltankPokedexTextUnused_LG[] = _(""); const u8 gBlisseyPokedexText_LG[] = _( "Anyone who takes even one bite of\n" "BLISSEY's egg becomes unfailingly caring\n" "and pleasant to everyone."); const u8 gBlisseyPokedexTextUnused_LG[] = _(""); const u8 gRaikouPokedexText_LG[] = _( "The rain clouds it carries let it fire\n" "thunderbolts at will. They say that it\n" "descended with lightning."); const u8 gRaikouPokedexTextUnused_LG[] = _(""); const u8 gEnteiPokedexText_LG[] = _( "Volcanoes erupt when it barks. Unable to\n" "restrain its extreme power, it races\n" "headlong around the land."); const u8 gEnteiPokedexTextUnused_LG[] = _(""); const u8 gSuicunePokedexText_LG[] = _( "Said to be the reincarnation of north\n" "winds, it can instantly purify filthy,\n" "murky water."); const u8 gSuicunePokedexTextUnused_LG[] = _(""); const u8 gLarvitarPokedexText_LG[] = _( "It feeds on soil. After it has eaten a\n" "large mountain, it will fall asleep so it\n" "can grow."); const u8 gLarvitarPokedexTextUnused_LG[] = _(""); const u8 gPupitarPokedexText_LG[] = _( "Its shell is as hard as sheet rock, and it\n" "is also very strong. Its THRASHING can\n" "topple a mountain."); const u8 gPupitarPokedexTextUnused_LG[] = _(""); const u8 gTyranitarPokedexText_LG[] = _( "Its body can't be harmed by any sort of\n" "attack, so it is very eager to make\n" "challenges against enemies."); const u8 gTyranitarPokedexTextUnused_LG[] = _(""); const u8 gLugiaPokedexText_LG[] = _( "It is said that it quietly spends its time\n" "deep at the bottom of the sea because\n" "its powers are too strong."); const u8 gLugiaPokedexTextUnused_LG[] = _(""); const u8 gHoOhPokedexText_LG[] = _( "Legends claim this POKéMON flies the\n" "world's skies continuously on its\n" "magnificent seven-colored wings."); const u8 gHoOhPokedexTextUnused_LG[] = _(""); const u8 gCelebiPokedexText_LG[] = _( "This POKéMON wanders across time.\n" "Grass and trees flourish in the forests in\n" "which it has appeared."); const u8 gCelebiPokedexTextUnused_LG[] = _(""); const u8 gTreeckoPokedexText_LG[] = _( "It quickly scales even vertical walls.\n" "It senses humidity with its tail to predict\n" "the next day's weather."); const u8 gTreeckoPokedexTextUnused_LG[] = _(""); const u8 gGrovylePokedexText_LG[] = _( "Its strongly developed thigh muscles\n" "give it astounding agility and jumping\n" "performance."); const u8 gGrovylePokedexTextUnused_LG[] = _(""); const u8 gSceptilePokedexText_LG[] = _( "The leaves on its forelegs are as sharp\n" "as swords. It agilely leaps about the\n" "branches of trees to strike."); const u8 gSceptilePokedexTextUnused_LG[] = _(""); const u8 gTorchicPokedexText_LG[] = _( "It has a flame sac inside its belly that\n" "perpetually burns. It feels warm if it is\n" "hugged."); const u8 gTorchicPokedexTextUnused_LG[] = _(""); const u8 gCombuskenPokedexText_LG[] = _( "It boosts its concentration by emitting\n" "harsh cries. Its kicks have outstanding\n" "destructive power."); const u8 gCombuskenPokedexTextUnused_LG[] = _(""); const u8 gBlazikenPokedexText_LG[] = _( "When facing a tough foe, it looses flames\n" "from its wrists. Its powerful legs let it\n" "jump clear over buildings."); const u8 gBlazikenPokedexTextUnused_LG[] = _(""); const u8 gMudkipPokedexText_LG[] = _( "Its large tail fin propels it through\n" "water with powerful acceleration. It is\n" "strong in spite of its size."); const u8 gMudkipPokedexTextUnused_LG[] = _(""); const u8 gMarshtompPokedexText_LG[] = _( "It is at its best when on muddy ground\n" "with poor footing. It quickly overwhelms\n" "foes struggling in mud."); const u8 gMarshtompPokedexTextUnused_LG[] = _(""); const u8 gSwampertPokedexText_LG[] = _( "Its arms are rock-hard. With one swing,\n" "they can batter down its foe. It makes its\n" "nest on beautiful beaches."); const u8 gSwampertPokedexTextUnused_LG[] = _(""); const u8 gPoochyenaPokedexText_LG[] = _( "It has a very tenacious nature. Its acute\n" "sense of smell lets it chase a chosen\n" "prey without ever losing track."); const u8 gPoochyenaPokedexTextUnused_LG[] = _(""); const u8 gMightyenaPokedexText_LG[] = _( "It will always obey the commands of a\n" "skilled TRAINER. Its behavior arises from\n" "its living in packs in ancient times."); const u8 gMightyenaPokedexTextUnused_LG[] = _(""); const u8 gZigzagoonPokedexText_LG[] = _( "A POKéMON with abundant curiosity.\n" "It shows an interest in everything, so it\n" "always zigs and zags."); const u8 gZigzagoonPokedexTextUnused_LG[] = _(""); const u8 gLinoonePokedexText_LG[] = _( "When running in a straight line, it can top\n" "60 miles per hour. However, it has a\n" "tough time with curved roads."); const u8 gLinoonePokedexTextUnused_LG[] = _(""); const u8 gWurmplePokedexText_LG[] = _( "It lives amidst tall grass and in forests.\n" "When attacked, it resists by pointing its\n" "venomous spikes at the foe."); const u8 gWurmplePokedexTextUnused_LG[] = _(""); const u8 gSilcoonPokedexText_LG[] = _( "It conserves its energy by moving as\n" "little as possible. It awaits evolution\n" "while drinking only a little rainwater."); const u8 gSilcoonPokedexTextUnused_LG[] = _(""); const u8 gBeautiflyPokedexText_LG[] = _( "Despite its appearance, it has an\n" "aggressive nature. It attacks by jabbing\n" "with its long, thin mouth."); const u8 gBeautiflyPokedexTextUnused_LG[] = _(""); const u8 gCascoonPokedexText_LG[] = _( "Its body, which is made of soft silk,\n" "hardens over time. When cracks appear,\n" "evolution is near."); const u8 gCascoonPokedexTextUnused_LG[] = _(""); const u8 gDustoxPokedexText_LG[] = _( "It scatters horribly toxic dust when it\n" "senses danger. They tend to gather in the\n" "glow of streetlamps at night."); const u8 gDustoxPokedexTextUnused_LG[] = _(""); const u8 gLotadPokedexText_LG[] = _( "It searches about for clean water. If it\n" "does not drink water for too long, the\n" "leaf on its head wilts."); const u8 gLotadPokedexTextUnused_LG[] = _(""); const u8 gLombrePokedexText_LG[] = _( "It lives at the water's edge where it is\n" "sunny. It sleeps on a bed of water grass\n" "by day and becomes active at night."); const u8 gLombrePokedexTextUnused_LG[] = _(""); const u8 gLudicoloPokedexText_LG[] = _( "The rhythm of bright, festive music\n" "activates LUDICOLO's cells, making it more\n" "powerful."); const u8 gLudicoloPokedexTextUnused_LG[] = _(""); const u8 gSeedotPokedexText_LG[] = _( "If it remains still, it becomes impossible\n" "to distinguish from real nuts. It delights\n" "in surprising foraging PIDGEY."); const u8 gSeedotPokedexTextUnused_LG[] = _(""); const u8 gNuzleafPokedexText_LG[] = _( "They live in holes bored in large trees.\n" "The sound of NUZLEAF's grass flute fills\n" "listeners with dread."); const u8 gNuzleafPokedexTextUnused_LG[] = _(""); const u8 gShiftryPokedexText_LG[] = _( "A POKéMON that was feared as a forest\n" "guardian. It can read the foe's mind and\n" "take preemptive action."); const u8 gShiftryPokedexTextUnused_LG[] = _(""); const u8 gTaillowPokedexText_LG[] = _( "It dislikes cold seasons. They migrate to\n" "other lands in search of warmth, flying\n" "over 180 miles a day."); const u8 gTaillowPokedexTextUnused_LG[] = _(""); const u8 gSwellowPokedexText_LG[] = _( "If its two tail feathers are standing at\n" "attention, it is proof of good health.\n" "It soars elegantly in the sky."); const u8 gSwellowPokedexTextUnused_LG[] = _(""); const u8 gWingullPokedexText_LG[] = _( "It rides upon ocean winds as if it were\n" "a glider. In the winter, it hides food\n" "around its nest."); const u8 gWingullPokedexTextUnused_LG[] = _(""); const u8 gPelipperPokedexText_LG[] = _( "It is a flying transporter that carries\n" "small POKéMON in its beak. It bobs on the\n" "waves to rest its wings."); const u8 gPelipperPokedexTextUnused_LG[] = _(""); const u8 gRaltsPokedexText_LG[] = _( "It is highly attuned to the emotions of\n" "people and POKéMON. It hides if it senses\n" "hostility."); const u8 gRaltsPokedexTextUnused_LG[] = _(""); const u8 gKirliaPokedexText_LG[] = _( "The cheerful spirit of its TRAINER gives\n" "it energy for its psychokinetic power.\n" "It spins and dances when happy."); const u8 gKirliaPokedexTextUnused_LG[] = _(""); const u8 gGardevoirPokedexText_LG[] = _( "It has the power to predict the future.\n" "Its power peaks when it is protecting its\n" "TRAINER."); const u8 gGardevoirPokedexTextUnused_LG[] = _(""); const u8 gSurskitPokedexText_LG[] = _( "They usually live on ponds, but after an\n" "evening shower, they may appear on\n" "puddles in towns."); const u8 gSurskitPokedexTextUnused_LG[] = _(""); const u8 gMasquerainPokedexText_LG[] = _( "The antennae have distinctive patterns\n" "that look like eyes. When it rains, they\n" "grow heavy, making flight impossible."); const u8 gMasquerainPokedexTextUnused_LG[] = _(""); const u8 gShroomishPokedexText_LG[] = _( "It prefers damp places. By day it remains\n" "still in the forest shade. It releases\n" "toxic powder from its head."); const u8 gShroomishPokedexTextUnused_LG[] = _(""); const u8 gBreloomPokedexText_LG[] = _( "The seeds on its tail are made of toxic\n" "spores. It knocks out foes with quick,\n" "virtually invisible punches."); const u8 gBreloomPokedexTextUnused_LG[] = _(""); const u8 gSlakothPokedexText_LG[] = _( "It sleeps for 20 hours every day. Making\n" "drowsy those that see it is one of\n" "its abilities."); const u8 gSlakothPokedexTextUnused_LG[] = _(""); const u8 gVigorothPokedexText_LG[] = _( "It is always hungry because it won't stop\n" "rampaging. Even while it is eating, it\n" "can't keep still."); const u8 gVigorothPokedexTextUnused_LG[] = _(""); const u8 gSlakingPokedexText_LG[] = _( "It is the world's most slothful POKéMON.\n" "However, it can exert horrifying power by\n" "releasing pent-up energy all at once."); const u8 gSlakingPokedexTextUnused_LG[] = _(""); const u8 gNincadaPokedexText_LG[] = _( "Because it lived almost entirely\n" "underground, it is nearly blind.\n" "It uses its antennae instead."); const u8 gNincadaPokedexTextUnused_LG[] = _(""); const u8 gNinjaskPokedexText_LG[] = _( "This POKéMON is so quick, it is said to\n" "be able to avoid any attack. It loves to\n" "feed on tree sap."); const u8 gNinjaskPokedexTextUnused_LG[] = _(""); const u8 gShedinjaPokedexText_LG[] = _( "A most peculiar POKéMON that somehow\n" "appears in a POKé BALL when a NINCADA\n" "evolves."); const u8 gShedinjaPokedexTextUnused_LG[] = _(""); const u8 gWhismurPokedexText_LG[] = _( "It usually murmurs, but starts crying\n" "loudly if it senses danger. It stops when\n" "its ear covers are shut."); const u8 gWhismurPokedexTextUnused_LG[] = _(""); const u8 gLoudredPokedexText_LG[] = _( "When it stamps its feet and bellows, it\n" "generates ultrasonic waves that can blow\n" "apart a house."); const u8 gLoudredPokedexTextUnused_LG[] = _(""); const u8 gExploudPokedexText_LG[] = _( "It emits a variety of sounds from the \n" "holes all over its body. Its loud cries\n" "can be heard from over six miles away."); const u8 gExploudPokedexTextUnused_LG[] = _(""); const u8 gMakuhitaPokedexText_LG[] = _( "It grows stronger by enduring harsh\n" "training. It is a gutsy POKéMON that can\n" "withstand any attack."); const u8 gMakuhitaPokedexTextUnused_LG[] = _(""); const u8 gHariyamaPokedexText_LG[] = _( "It stomps on the ground to build power.\n" "It can send a 10-ton truck flying with a\n" "straight-arm punch."); const u8 gHariyamaPokedexTextUnused_LG[] = _(""); const u8 gAzurillPokedexText_LG[] = _( "It battles by flinging around its tail,\n" "which is bigger than its body. The\n" "tail is a flotation device in water."); const u8 gAzurillPokedexTextUnused_LG[] = _(""); const u8 gNosepassPokedexText_LG[] = _( "Its magnetic nose consistently faces\n" "north. Travelers check NOSEPASS to get\n" "their bearings."); const u8 gNosepassPokedexTextUnused_LG[] = _(""); const u8 gSkittyPokedexText_LG[] = _( "It is said to be difficult to earn its\n" "trust. However, it is extremely popular\n" "for its cute looks and behavior."); const u8 gSkittyPokedexTextUnused_LG[] = _(""); const u8 gDelcattyPokedexText_LG[] = _( "The favorite of trend-conscious\n" "female TRAINERS, they are used in\n" "competition for their style and fur."); const u8 gDelcattyPokedexTextUnused_LG[] = _(""); const u8 gSableyePokedexText_LG[] = _( "It feeds on gemstone crystals.\n" "In darkness, its eyes sparkle with the\n" "glitter of jewels."); const u8 gSableyePokedexTextUnused_LG[] = _(""); const u8 gMawilePokedexText_LG[] = _( "It uses its docile-looking face to lull\n" "foes into complacency, then bites with its\n" "huge, relentless jaws."); const u8 gMawilePokedexTextUnused_LG[] = _(""); const u8 gAronPokedexText_LG[] = _( "It eats iron to build its steel body.\n" "It is a pest that descends from mountains\n" "to eat bridges and train tracks."); const u8 gAronPokedexTextUnused_LG[] = _(""); const u8 gLaironPokedexText_LG[] = _( "It habitually shows off its strength with\n" "the size of sparks it creates by ramming\n" "its steel body into boulders."); const u8 gLaironPokedexTextUnused_LG[] = _(""); const u8 gAggronPokedexText_LG[] = _( "It claims a large mountain as its sole\n" "territory. It mercilessly thrashes those\n" "that violate its space."); const u8 gAggronPokedexTextUnused_LG[] = _(""); const u8 gMedititePokedexText_LG[] = _( "It never skips its daily yoga training.\n" "It heightens its inner strength through\n" "meditation."); const u8 gMedititePokedexTextUnused_LG[] = _(""); const u8 gMedichamPokedexText_LG[] = _( "It elegantly avoids attacks with dance-\n" "like steps, then launches a devastating\n" "blow in the same motion."); const u8 gMedichamPokedexTextUnused_LG[] = _(""); const u8 gElectrikePokedexText_LG[] = _( "It stores static electricity in its fur\n" "for discharging. It gives off sparks if a\n" "storm approaches."); const u8 gElectrikePokedexTextUnused_LG[] = _(""); const u8 gManectricPokedexText_LG[] = _( "It rarely appears before people.\n" "It is said to nest where lightning has\n" "fallen."); const u8 gManectricPokedexTextUnused_LG[] = _(""); const u8 gPluslePokedexText_LG[] = _( "It cheers on partners while scattering\n" "sparks from its body. It climbs telephone\n" "poles to absorb electricity."); const u8 gPluslePokedexTextUnused_LG[] = _(""); const u8 gMinunPokedexText_LG[] = _( "Its dislike of water makes it take shelter\n" "under the eaves of houses in rain. It uses\n" "pom-poms made of sparks for cheering."); const u8 gMinunPokedexTextUnused_LG[] = _(""); const u8 gVolbeatPokedexText_LG[] = _( "It lives around clean ponds. At night,\n" "its rear lights up. It converses with\n" "others by flashing its light."); const u8 gVolbeatPokedexTextUnused_LG[] = _(""); const u8 gIllumisePokedexText_LG[] = _( "It guides VOLBEAT to draw signs in night\n" "skies. There are scientists that study the\n" "patterns it creates."); const u8 gIllumisePokedexTextUnused_LG[] = _(""); const u8 gRoseliaPokedexText_LG[] = _( "Its flowers give off a relaxing fragrance.\n" "The stronger its aroma, the healthier\n" "the ROSELIA is."); const u8 gRoseliaPokedexTextUnused_LG[] = _(""); const u8 gGulpinPokedexText_LG[] = _( "There is nothing its stomach can't digest.\n" "While it is digesting, vile, overpowering\n" "gases are expelled."); const u8 gGulpinPokedexTextUnused_LG[] = _(""); const u8 gSwalotPokedexText_LG[] = _( "It can swallow a tire whole in one gulp.\n" "It secretes a horribly toxic fluid from\n" "the pores on its body."); const u8 gSwalotPokedexTextUnused_LG[] = _(""); const u8 gCarvanhaPokedexText_LG[] = _( "It lives in massive rivers that course\n" "through jungles. It swarms prey that\n" "enter its territory."); const u8 gCarvanhaPokedexTextUnused_LG[] = _(""); const u8 gSharpedoPokedexText_LG[] = _( "The ruffian of the seas, it has fangs that\n" "crunch through iron. It swims by jetting\n" "water from its rear."); const u8 gSharpedoPokedexTextUnused_LG[] = _(""); const u8 gWailmerPokedexText_LG[] = _( "When it sucks in a large volume of\n" "seawater, it becomes like a big, bouncy\n" "ball. It eats a ton of food daily."); const u8 gWailmerPokedexTextUnused_LG[] = _(""); const u8 gWailordPokedexText_LG[] = _( "It is among the largest of all POKéMON.\n" "It herds prey in a pack then swallows the\n" "massed prey in one gulp."); const u8 gWailordPokedexTextUnused_LG[] = _(""); const u8 gNumelPokedexText_LG[] = _( "Magma of almost 2,200 degrees Fahrenheit\n" "courses through its body. When it grows\n" "cold, the magma hardens and slows it."); const u8 gNumelPokedexTextUnused_LG[] = _(""); const u8 gCameruptPokedexText_LG[] = _( "If angered, the humps on its back erupt\n" "in a shower of molten lava. It lives in\n" "the craters of volcanoes."); const u8 gCameruptPokedexTextUnused_LG[] = _(""); const u8 gTorkoalPokedexText_LG[] = _( "It burns coal inside its shell. If it is\n" "attacked, it belches thick, black smoke\n" "and flees."); const u8 gTorkoalPokedexTextUnused_LG[] = _(""); const u8 gSpoinkPokedexText_LG[] = _( "It apparently dies if it stops bouncing\n" "about. It carries a pearl from CLAMPERL\n" "on its head."); const u8 gSpoinkPokedexTextUnused_LG[] = _(""); const u8 gGrumpigPokedexText_LG[] = _( "It can gain control over foes by doing\n" "odd dance steps. The black pearls on its\n" "forehead are precious gems."); const u8 gGrumpigPokedexTextUnused_LG[] = _(""); const u8 gSpindaPokedexText_LG[] = _( "No two SPINDA are said to have identical\n" "patterns. It confuses foes with its\n" "stumbling motions."); const u8 gSpindaPokedexTextUnused_LG[] = _(""); const u8 gTrapinchPokedexText_LG[] = _( "It lives in arid deserts. It makes a\n" "sloping pit trap in sand where it\n" "patiently awaits prey."); const u8 gTrapinchPokedexTextUnused_LG[] = _(""); const u8 gVibravaPokedexText_LG[] = _( "It generates ultrasonic waves by violently\n" "flapping its wings. After making its prey\n" "faint, it melts the prey with acid."); const u8 gVibravaPokedexTextUnused_LG[] = _(""); const u8 gFlygonPokedexText_LG[] = _( "It hides itself by kicking up desert sand\n" "with its wings. Red covers shield its eyes\n" "from sand."); const u8 gFlygonPokedexTextUnused_LG[] = _(""); const u8 gCacneaPokedexText_LG[] = _( "It prefers harsh environments such as\n" "deserts. It can survive for 30 days on\n" "water stored in its body."); const u8 gCacneaPokedexTextUnused_LG[] = _(""); const u8 gCacturnePokedexText_LG[] = _( "It lives in deserts. It becomes active at\n" "night when it hunts for prey exhausted\n" "from the desert's heat."); const u8 gCacturnePokedexTextUnused_LG[] = _(""); const u8 gSwabluPokedexText_LG[] = _( "It constantly grooms its cotton-like\n" "wings. It takes a shower to clean\n" "itself if it becomes dirty."); const u8 gSwabluPokedexTextUnused_LG[] = _(""); const u8 gAltariaPokedexText_LG[] = _( "If you hear a beautiful melody trilling\n" "deep among mountains far from people,\n" "it is ALTARIA's humming."); const u8 gAltariaPokedexTextUnused_LG[] = _(""); const u8 gZangoosePokedexText_LG[] = _( "If it comes across a SEVIPER, its fur\n" "bristles and it assumes its battle pose.\n" "Its sharp claws are its best weapon."); const u8 gZangoosePokedexTextUnused_LG[] = _(""); const u8 gSeviperPokedexText_LG[] = _( "It sharpens its swordlike tail on hard\n" "rocks. It hides in tall grass and strikes\n" "unwary prey with venomous fangs."); const u8 gSeviperPokedexTextUnused_LG[] = _(""); const u8 gLunatonePokedexText_LG[] = _( "Its health ebbs and flows with the lunar\n" "cycle. It brims with power when exposed\n" "to the light of the full moon."); const u8 gLunatonePokedexTextUnused_LG[] = _(""); const u8 gSolrockPokedexText_LG[] = _( "It absorbs solar energy during the day.\n" "Always expressionless, it can sense what\n" "its foe is thinking."); const u8 gSolrockPokedexTextUnused_LG[] = _(""); const u8 gBarboachPokedexText_LG[] = _( "It probes muddy riverbeds with its two\n" "long whiskers. A slimy film protects its\n" "body."); const u8 gBarboachPokedexTextUnused_LG[] = _(""); const u8 gWhiscashPokedexText_LG[] = _( "It makes its nest at the bottom of \n" "swamps. It will eat anything - if it is\n" "alive, WHISCASH will eat it."); const u8 gWhiscashPokedexTextUnused_LG[] = _(""); const u8 gCorphishPokedexText_LG[] = _( "It came from overseas. It is a very hardy\n" "creature that will quickly proliferate,\n" "even in polluted streams."); const u8 gCorphishPokedexTextUnused_LG[] = _(""); const u8 gCrawdauntPokedexText_LG[] = _( "A rough customer that wildly flails its\n" "giant claws. It is said to be extremely\n" "hard to raise."); const u8 gCrawdauntPokedexTextUnused_LG[] = _(""); const u8 gBaltoyPokedexText_LG[] = _( "It was discovered in ancient ruins.\n" "While moving, it constantly spins. It\n" "stands on one foot even when asleep."); const u8 gBaltoyPokedexTextUnused_LG[] = _(""); const u8 gClaydolPokedexText_LG[] = _( "It appears to have been born from clay\n" "dolls made by ancient people. It uses\n" "telekinesis to float and move."); const u8 gClaydolPokedexTextUnused_LG[] = _(""); const u8 gLileepPokedexText_LG[] = _( "It became extinct roughly 100 million\n" "years ago. It was regenerated from a\n" "fossil using advanced techniques."); const u8 gLileepPokedexTextUnused_LG[] = _(""); const u8 gCradilyPokedexText_LG[] = _( "It ensnares prey with its eight tentacles.\n" "It then melts the prey with a strong acid\n" "before feeding."); const u8 gCradilyPokedexTextUnused_LG[] = _(""); const u8 gAnorithPokedexText_LG[] = _( "It is a kind of POKéMON progenitor.\n" "It uses its extending claws to catch prey\n" "hiding among rocks on the seafloor."); const u8 gAnorithPokedexTextUnused_LG[] = _(""); const u8 gArmaldoPokedexText_LG[] = _( "Protected by a hard shell, its body is\n" "very sturdy. It skewers prey with its\n" "claws to feed."); const u8 gArmaldoPokedexTextUnused_LG[] = _(""); const u8 gFeebasPokedexText_LG[] = _( "Ridiculed for its shabby appearance,\n" "it is ignored by researchers. It lives in\n" "ponds choked with weeds."); const u8 gFeebasPokedexTextUnused_LG[] = _(""); const u8 gMiloticPokedexText_LG[] = _( "MILOTIC is breathtakingly beautiful.\n" "Those that see it are said to forget their\n" "combative spirits."); const u8 gMiloticPokedexTextUnused_LG[] = _(""); const u8 gCastformPokedexText_LG[] = _( "It has the ability to change its form into\n" "the sun, the rain, or a snow cloud, \n" "depending on the weather."); const u8 gCastformPokedexTextUnused_LG[] = _(""); const u8 gKecleonPokedexText_LG[] = _( "It changes body color to blend in with\n" "its surroundings. It also changes color if\n" "it is happy or sad."); const u8 gKecleonPokedexTextUnused_LG[] = _(""); const u8 gShuppetPokedexText_LG[] = _( "It loves to feed on feelings like envy and\n" "malice. Its upright horn catches the\n" "emotions of people."); const u8 gShuppetPokedexTextUnused_LG[] = _(""); const u8 gBanettePokedexText_LG[] = _( "Strong feelings of hatred turned a puppet\n" "into a POKéMON. If it opens its mouth,\n" "its cursed energy escapes."); const u8 gBanettePokedexTextUnused_LG[] = _(""); const u8 gDuskullPokedexText_LG[] = _( "Making itself invisible, it silently sneaks\n" "up to prey. It has the ability to slip\n" "through thick walls."); const u8 gDuskullPokedexTextUnused_LG[] = _(""); const u8 gDusclopsPokedexText_LG[] = _( "Its body is entirely hollow. When it opens\n" "its mouth, it sucks everything in as if it\n" "were a black hole."); const u8 gDusclopsPokedexTextUnused_LG[] = _(""); const u8 gTropiusPokedexText_LG[] = _( "It lives in tropical jungles. The bunch of\n" "fruit around its neck is delicious.\n" "The fruit grows twice a year."); const u8 gTropiusPokedexTextUnused_LG[] = _(""); const u8 gChimechoPokedexText_LG[] = _( "It travels by riding on winds. It cleverly\n" "uses its long tail to pluck nuts and\n" "berries, which it loves to eat."); const u8 gChimechoPokedexTextUnused_LG[] = _(""); const u8 gAbsolPokedexText_LG[] = _( "It appears when it senses an impending\n" "natural disaster. As a result, it was\n" "mistaken as a doom-bringer."); const u8 gAbsolPokedexTextUnused_LG[] = _(""); const u8 gWynautPokedexText_LG[] = _( "It tends to move in a pack with others.\n" "They cluster in a tight group to sleep in\n" "a cave."); const u8 gWynautPokedexTextUnused_LG[] = _(""); const u8 gSnoruntPokedexText_LG[] = _( "It is said that a home visited by a\n" "SNORUNT will prosper. It can withstand\n" "cold of minus 150 degrees Fahrenheit."); const u8 gSnoruntPokedexTextUnused_LG[] = _(""); const u8 gGlaliePokedexText_LG[] = _( "It has a body of ice that won't melt,\n" "even with fire. It can instantly freeze\n" "moisture in the atmosphere."); const u8 gGlaliePokedexTextUnused_LG[] = _(""); const u8 gSphealPokedexText_LG[] = _( "Its body is covered in fluffy fur.\n" "The fur keeps it from feeling cold while\n" "it is rolling on ice."); const u8 gSphealPokedexTextUnused_LG[] = _(""); const u8 gSealeoPokedexText_LG[] = _( "It touches new things with its nose to\n" "test for smell and feel. It plays by\n" "spinning SPHEAL on its nose."); const u8 gSealeoPokedexTextUnused_LG[] = _(""); const u8 gWalreinPokedexText_LG[] = _( "It swims through icy seas while shattering\n" "ice floes with its large tusks. It is\n" "protected by its thick blubber."); const u8 gWalreinPokedexTextUnused_LG[] = _(""); const u8 gClamperlPokedexText_LG[] = _( "It is protected by a sturdy shell.\n" "Once in a lifetime, it makes a magnificent\n" "pearl."); const u8 gClamperlPokedexTextUnused_LG[] = _(""); const u8 gHuntailPokedexText_LG[] = _( "It lives deep in the sea where no light\n" "ever filters down. It lights up its small\n" "fishlike tail to attract prey."); const u8 gHuntailPokedexTextUnused_LG[] = _(""); const u8 gGorebyssPokedexText_LG[] = _( "Its swimming form is exquisitely elegant.\n" "With its thin mouth, it feeds on seaweed\n" "that grows between rocks."); const u8 gGorebyssPokedexTextUnused_LG[] = _(""); const u8 gRelicanthPokedexText_LG[] = _( "It has remained unchanged for 100\n" "million years. It was discovered\n" "during a deep-sea exploration."); const u8 gRelicanthPokedexTextUnused_LG[] = _(""); const u8 gLuvdiscPokedexText_LG[] = _( "During the spawning season, countless\n" "LUVDISC congregate at coral reefs,\n" "turning the waters pink."); const u8 gLuvdiscPokedexTextUnused_LG[] = _(""); const u8 gBagonPokedexText_LG[] = _( "Its steel-hard head can shatter boulders.\n" "It longingly hopes for wings to grow so it\n" "can fly."); const u8 gBagonPokedexTextUnused_LG[] = _(""); const u8 gShelgonPokedexText_LG[] = _( "Its armored body makes all attacks bounce\n" "off. The armor is too tough, however,\n" "making it heavy and somewhat sluggish."); const u8 gShelgonPokedexTextUnused_LG[] = _(""); const u8 gSalamencePokedexText_LG[] = _( "It becomes uncontrollable if it is\n" "enraged. It destroys everything with\n" "shredding claws and fire."); const u8 gSalamencePokedexTextUnused_LG[] = _(""); const u8 gBeldumPokedexText_LG[] = _( "It uses magnetic waves to converse with\n" "its kind. All the cells in its body are\n" "magnetic."); const u8 gBeldumPokedexTextUnused_LG[] = _(""); const u8 gMetangPokedexText_LG[] = _( "It floats midair using magnetism. Its body\n" "is so tough, even a crash with a jet\n" "plane won't leave a scratch."); const u8 gMetangPokedexTextUnused_LG[] = _(""); const u8 gMetagrossPokedexText_LG[] = _( "It is formed by two METANG fusing.\n" "Its four brains are said to be superior\n" "to a supercomputer."); const u8 gMetagrossPokedexTextUnused_LG[] = _(""); const u8 gRegirockPokedexText_LG[] = _( "It is entirely composed of rocks with no\n" "sign of a brain or heart. It is a mystery\n" "even to modern scientists."); const u8 gRegirockPokedexTextUnused_LG[] = _(""); const u8 gRegicePokedexText_LG[] = _( "Research revealed that its body is made\n" "of the same kind of ice that is found at\n" "the South Pole."); const u8 gRegicePokedexTextUnused_LG[] = _(""); const u8 gRegisteelPokedexText_LG[] = _( "It is sturdier than any kind of metal.\n" "It hardened due to pressure underground\n" "over tens of thousands of years."); const u8 gRegisteelPokedexTextUnused_LG[] = _(""); const u8 gLatiasPokedexText_LG[] = _( "It can telepathically communicate with\n" "people. It changes its appearance using\n" "its down that refracts light."); const u8 gLatiasPokedexTextUnused_LG[] = _(""); const u8 gLatiosPokedexText_LG[] = _( "It has a docile temperament and dislikes\n" "fighting. Tucking in its forelegs, it can\n" "fly faster than a jet plane."); const u8 gLatiosPokedexTextUnused_LG[] = _(""); const u8 gKyogrePokedexText_LG[] = _( "This POKéMON is said to have expanded\n" "the sea by bringing heavy rains.\n" "It has the power to control water."); const u8 gKyogrePokedexTextUnused_LG[] = _(""); const u8 gGroudonPokedexText_LG[] = _( "This legendary POKéMON is said to\n" "represent the land. It went to sleep after\n" "dueling KYOGRE."); const u8 gGroudonPokedexTextUnused_LG[] = _(""); const u8 gRayquazaPokedexText_LG[] = _( "It has lived for hundreds of millions of\n" "years in the ozone layer. Its flying form\n" "looks like a meteor."); const u8 gRayquazaPokedexTextUnused_LG[] = _(""); const u8 gJirachiPokedexText_LG[] = _( "It is said to make any wish come true.\n" "It is awake for only seven days out of\n" "a thousand years."); const u8 gJirachiPokedexTextUnused_LG[] = _(""); const u8 gDeoxysPokedexText_LG[] = _( "When it changes form, an aurora appears.\n" "It absorbs attacks by altering its\n" "cellular structure."); const u8 gDeoxysPokedexTextUnused_LG[] = _(""); ================================================ FILE: src/data/pokemon/species_info.h ================================================ // Maximum value for a female Pokémon is 254 (MON_FEMALE) which is 100% female. // 255 (MON_GENDERLESS) is reserved for genderless Pokémon. #define PERCENT_FEMALE(percent) min(254, ((percent * 255) / 100)) #define OLD_UNOWN_SPECIES_INFO \ { \ .baseHP = 50, \ .baseAttack = 150, \ .baseDefense = 50, \ .baseSpAttack = 150, \ .baseSpDefense = 50, \ .baseSpeed = 150, \ .types = {TYPE_NORMAL, TYPE_NORMAL}, \ .catchRate = 3, \ .expYield = 1, \ .evYield_HP = 2, \ .evYield_Attack = 2, \ .evYield_Defense = 2, \ .evYield_Speed = 2, \ .evYield_SpAttack = 2, \ .evYield_SpDefense = 2, \ .itemCommon = ITEM_NONE, \ .itemRare = ITEM_NONE, \ .genderRatio = MON_GENDERLESS, \ .eggCycles = 120, \ .friendship = 0, \ .growthRate = GROWTH_MEDIUM_FAST, \ .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, \ .abilities = {ABILITY_NONE, ABILITY_NONE}, \ .safariZoneFleeRate = 0, \ .bodyColor = BODY_COLOR_BLACK, \ .noFlip = FALSE, \ } const struct SpeciesInfo gSpeciesInfo[] = { [SPECIES_NONE] = {0}, [SPECIES_BULBASAUR] = { .baseHP = 45, .baseAttack = 49, .baseDefense = 49, .baseSpeed = 45, .baseSpAttack = 65, .baseSpDefense = 65, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 45, .expYield = 64, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS}, .abilities = {ABILITY_OVERGROW, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_IVYSAUR] = { .baseHP = 60, .baseAttack = 62, .baseDefense = 63, .baseSpeed = 60, .baseSpAttack = 80, .baseSpDefense = 80, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 45, .expYield = 141, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS}, .abilities = {ABILITY_OVERGROW, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_VENUSAUR] = { .baseHP = 80, .baseAttack = 82, .baseDefense = 83, .baseSpeed = 80, .baseSpAttack = 100, .baseSpDefense = 100, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 45, .expYield = 208, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS}, .abilities = {ABILITY_OVERGROW, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_CHARMANDER] = { .baseHP = 39, .baseAttack = 52, .baseDefense = 43, .baseSpeed = 65, .baseSpAttack = 60, .baseSpDefense = 50, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 45, .expYield = 65, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON}, .abilities = {ABILITY_BLAZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_CHARMELEON] = { .baseHP = 58, .baseAttack = 64, .baseDefense = 58, .baseSpeed = 80, .baseSpAttack = 80, .baseSpDefense = 65, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 45, .expYield = 142, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON}, .abilities = {ABILITY_BLAZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_CHARIZARD] = { .baseHP = 78, .baseAttack = 84, .baseDefense = 78, .baseSpeed = 100, .baseSpAttack = 109, .baseSpDefense = 85, .types = {TYPE_FIRE, TYPE_FLYING}, .catchRate = 45, .expYield = 209, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON}, .abilities = {ABILITY_BLAZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_SQUIRTLE] = { .baseHP = 44, .baseAttack = 48, .baseDefense = 65, .baseSpeed = 43, .baseSpAttack = 50, .baseSpDefense = 64, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 45, .expYield = 66, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_TORRENT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_WARTORTLE] = { .baseHP = 59, .baseAttack = 63, .baseDefense = 80, .baseSpeed = 58, .baseSpAttack = 65, .baseSpDefense = 80, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 45, .expYield = 143, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_TORRENT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_BLASTOISE] = { .baseHP = 79, .baseAttack = 83, .baseDefense = 100, .baseSpeed = 78, .baseSpAttack = 85, .baseSpDefense = 105, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 45, .expYield = 210, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_TORRENT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_CATERPIE] = { .baseHP = 45, .baseAttack = 30, .baseDefense = 35, .baseSpeed = 45, .baseSpAttack = 20, .baseSpDefense = 20, .types = {TYPE_BUG, TYPE_BUG}, .catchRate = 255, .expYield = 53, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_METAPOD] = { .baseHP = 50, .baseAttack = 20, .baseDefense = 55, .baseSpeed = 30, .baseSpAttack = 25, .baseSpDefense = 25, .types = {TYPE_BUG, TYPE_BUG}, .catchRate = 120, .expYield = 72, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_BUTTERFREE] = { .baseHP = 60, .baseAttack = 45, .baseDefense = 50, .baseSpeed = 70, .baseSpAttack = 80, .baseSpDefense = 80, .types = {TYPE_BUG, TYPE_FLYING}, .catchRate = 45, .expYield = 160, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_SILVER_POWDER, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_COMPOUND_EYES, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_WEEDLE] = { .baseHP = 40, .baseAttack = 35, .baseDefense = 30, .baseSpeed = 50, .baseSpAttack = 20, .baseSpDefense = 20, .types = {TYPE_BUG, TYPE_POISON}, .catchRate = 255, .expYield = 52, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_KAKUNA] = { .baseHP = 45, .baseAttack = 25, .baseDefense = 50, .baseSpeed = 35, .baseSpAttack = 25, .baseSpDefense = 25, .types = {TYPE_BUG, TYPE_POISON}, .catchRate = 120, .expYield = 71, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_BEEDRILL] = { .baseHP = 65, .baseAttack = 80, .baseDefense = 40, .baseSpeed = 75, .baseSpAttack = 45, .baseSpDefense = 80, .types = {TYPE_BUG, TYPE_POISON}, .catchRate = 45, .expYield = 159, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_POISON_BARB, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SWARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_PIDGEY] = { .baseHP = 40, .baseAttack = 45, .baseDefense = 40, .baseSpeed = 56, .baseSpAttack = 35, .baseSpDefense = 35, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 255, .expYield = 55, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_PIDGEOTTO] = { .baseHP = 63, .baseAttack = 60, .baseDefense = 55, .baseSpeed = 71, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 120, .expYield = 113, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_PIDGEOT] = { .baseHP = 83, .baseAttack = 80, .baseDefense = 75, .baseSpeed = 91, .baseSpAttack = 70, .baseSpDefense = 70, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 45, .expYield = 172, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 3, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_RATTATA] = { .baseHP = 30, .baseAttack = 56, .baseDefense = 35, .baseSpeed = 72, .baseSpAttack = 25, .baseSpDefense = 35, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 255, .expYield = 57, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_RUN_AWAY, ABILITY_GUTS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_RATICATE] = { .baseHP = 55, .baseAttack = 81, .baseDefense = 60, .baseSpeed = 97, .baseSpAttack = 50, .baseSpDefense = 70, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 127, .expYield = 116, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ORAN_BERRY, .itemRare = ITEM_SITRUS_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_RUN_AWAY, ABILITY_GUTS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_SPEAROW] = { .baseHP = 40, .baseAttack = 60, .baseDefense = 30, .baseSpeed = 70, .baseSpAttack = 31, .baseSpDefense = 31, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 255, .expYield = 58, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_FEAROW] = { .baseHP = 65, .baseAttack = 90, .baseDefense = 65, .baseSpeed = 100, .baseSpAttack = 61, .baseSpDefense = 61, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 90, .expYield = 162, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SHARP_BEAK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_EKANS] = { .baseHP = 35, .baseAttack = 60, .baseDefense = 44, .baseSpeed = 55, .baseSpAttack = 40, .baseSpDefense = 54, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 255, .expYield = 62, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_DRAGON}, .abilities = {ABILITY_INTIMIDATE, ABILITY_SHED_SKIN}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_ARBOK] = { .baseHP = 60, .baseAttack = 85, .baseDefense = 69, .baseSpeed = 80, .baseSpAttack = 65, .baseSpDefense = 79, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 90, .expYield = 147, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_POISON_BARB, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_DRAGON}, .abilities = {ABILITY_INTIMIDATE, ABILITY_SHED_SKIN}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_PIKACHU] = { .baseHP = 35, .baseAttack = 55, .baseDefense = 30, .baseSpeed = 90, .baseSpAttack = 50, .baseSpDefense = 40, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 190, .expYield = 82, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_RAICHU] = { .baseHP = 60, .baseAttack = 90, .baseDefense = 55, .baseSpeed = 100, .baseSpAttack = 90, .baseSpDefense = 80, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 75, .expYield = 122, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 3, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_SANDSHREW] = { .baseHP = 50, .baseAttack = 75, .baseDefense = 85, .baseSpeed = 40, .baseSpAttack = 20, .baseSpDefense = 30, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 255, .expYield = 93, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_SANDSLASH] = { .baseHP = 75, .baseAttack = 100, .baseDefense = 110, .baseSpeed = 65, .baseSpAttack = 45, .baseSpDefense = 55, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 90, .expYield = 163, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SOFT_SAND, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_NIDORAN_F] = { .baseHP = 55, .baseAttack = 47, .baseDefense = 52, .baseSpeed = 41, .baseSpAttack = 40, .baseSpDefense = 40, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 235, .expYield = 59, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_FEMALE, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_POISON_POINT, ABILITY_NONE}, .safariZoneFleeRate = 50, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_NIDORINA] = { .baseHP = 70, .baseAttack = 62, .baseDefense = 67, .baseSpeed = 56, .baseSpAttack = 55, .baseSpDefense = 55, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 120, .expYield = 117, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_FEMALE, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_POISON_POINT, ABILITY_NONE}, .safariZoneFleeRate = 75, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_NIDOQUEEN] = { .baseHP = 90, .baseAttack = 82, .baseDefense = 87, .baseSpeed = 76, .baseSpAttack = 75, .baseSpDefense = 85, .types = {TYPE_POISON, TYPE_GROUND}, .catchRate = 45, .expYield = 194, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_FEMALE, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_POISON_POINT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_NIDORAN_M] = { .baseHP = 46, .baseAttack = 57, .baseDefense = 40, .baseSpeed = 50, .baseSpAttack = 40, .baseSpDefense = 40, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 235, .expYield = 60, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_POISON_POINT, ABILITY_NONE}, .safariZoneFleeRate = 50, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_NIDORINO] = { .baseHP = 61, .baseAttack = 72, .baseDefense = 57, .baseSpeed = 65, .baseSpAttack = 55, .baseSpDefense = 55, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 120, .expYield = 118, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_POISON_POINT, ABILITY_NONE}, .safariZoneFleeRate = 75, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_NIDOKING] = { .baseHP = 81, .baseAttack = 92, .baseDefense = 77, .baseSpeed = 85, .baseSpAttack = 85, .baseSpDefense = 75, .types = {TYPE_POISON, TYPE_GROUND}, .catchRate = 45, .expYield = 195, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_POISON_POINT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_CLEFAIRY] = { .baseHP = 70, .baseAttack = 45, .baseDefense = 48, .baseSpeed = 35, .baseSpAttack = 60, .baseSpDefense = 65, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 150, .expYield = 68, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_MOON_STONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 10, .friendship = 140, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_CLEFABLE] = { .baseHP = 95, .baseAttack = 70, .baseDefense = 73, .baseSpeed = 60, .baseSpAttack = 85, .baseSpDefense = 90, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 25, .expYield = 129, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_MOON_STONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 10, .friendship = 140, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_VULPIX] = { .baseHP = 38, .baseAttack = 41, .baseDefense = 40, .baseSpeed = 65, .baseSpAttack = 50, .baseSpDefense = 65, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 190, .expYield = 63, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_RAWST_BERRY, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_FLASH_FIRE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_NINETALES] = { .baseHP = 73, .baseAttack = 76, .baseDefense = 75, .baseSpeed = 100, .baseSpAttack = 81, .baseSpDefense = 100, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 75, .expYield = 178, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_RAWST_BERRY, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_FLASH_FIRE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_JIGGLYPUFF] = { .baseHP = 115, .baseAttack = 45, .baseDefense = 20, .baseSpeed = 20, .baseSpAttack = 45, .baseSpDefense = 25, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 170, .expYield = 76, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ORAN_BERRY, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_WIGGLYTUFF] = { .baseHP = 140, .baseAttack = 70, .baseDefense = 45, .baseSpeed = 45, .baseSpAttack = 75, .baseSpDefense = 50, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 50, .expYield = 109, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ORAN_BERRY, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_ZUBAT] = { .baseHP = 40, .baseAttack = 45, .baseDefense = 35, .baseSpeed = 55, .baseSpAttack = 30, .baseSpDefense = 40, .types = {TYPE_POISON, TYPE_FLYING}, .catchRate = 255, .expYield = 54, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_GOLBAT] = { .baseHP = 75, .baseAttack = 80, .baseDefense = 70, .baseSpeed = 90, .baseSpAttack = 65, .baseSpDefense = 75, .types = {TYPE_POISON, TYPE_FLYING}, .catchRate = 90, .expYield = 171, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_ODDISH] = { .baseHP = 45, .baseAttack = 50, .baseDefense = 55, .baseSpeed = 30, .baseSpAttack = 75, .baseSpDefense = 65, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 255, .expYield = 78, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_GLOOM] = { .baseHP = 60, .baseAttack = 65, .baseDefense = 70, .baseSpeed = 40, .baseSpAttack = 85, .baseSpDefense = 75, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 120, .expYield = 132, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_VILEPLUME] = { .baseHP = 75, .baseAttack = 80, .baseDefense = 85, .baseSpeed = 50, .baseSpAttack = 100, .baseSpDefense = 90, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 45, .expYield = 184, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_PARAS] = { .baseHP = 35, .baseAttack = 70, .baseDefense = 55, .baseSpeed = 25, .baseSpAttack = 45, .baseSpDefense = 55, .types = {TYPE_BUG, TYPE_GRASS}, .catchRate = 190, .expYield = 70, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_TINY_MUSHROOM, .itemRare = ITEM_BIG_MUSHROOM, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_GRASS}, .abilities = {ABILITY_EFFECT_SPORE, ABILITY_NONE}, .safariZoneFleeRate = 50, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_PARASECT] = { .baseHP = 60, .baseAttack = 95, .baseDefense = 80, .baseSpeed = 30, .baseSpAttack = 60, .baseSpDefense = 80, .types = {TYPE_BUG, TYPE_GRASS}, .catchRate = 75, .expYield = 128, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_TINY_MUSHROOM, .itemRare = ITEM_BIG_MUSHROOM, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_GRASS}, .abilities = {ABILITY_EFFECT_SPORE, ABILITY_NONE}, .safariZoneFleeRate = 75, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_VENONAT] = { .baseHP = 60, .baseAttack = 55, .baseDefense = 50, .baseSpeed = 45, .baseSpAttack = 40, .baseSpDefense = 55, .types = {TYPE_BUG, TYPE_POISON}, .catchRate = 190, .expYield = 75, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_COMPOUND_EYES, ABILITY_NONE}, .safariZoneFleeRate = 50, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_VENOMOTH] = { .baseHP = 70, .baseAttack = 65, .baseDefense = 60, .baseSpeed = 90, .baseSpAttack = 90, .baseSpDefense = 75, .types = {TYPE_BUG, TYPE_POISON}, .catchRate = 75, .expYield = 138, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SILVER_POWDER, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE}, .safariZoneFleeRate = 75, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_DIGLETT] = { .baseHP = 10, .baseAttack = 55, .baseDefense = 25, .baseSpeed = 95, .baseSpAttack = 35, .baseSpDefense = 45, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 255, .expYield = 81, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_SAND_VEIL, ABILITY_ARENA_TRAP}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_DUGTRIO] = { .baseHP = 35, .baseAttack = 80, .baseDefense = 50, .baseSpeed = 120, .baseSpAttack = 50, .baseSpDefense = 70, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 50, .expYield = 153, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_SAND_VEIL, ABILITY_ARENA_TRAP}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_MEOWTH] = { .baseHP = 40, .baseAttack = 45, .baseDefense = 35, .baseSpeed = 90, .baseSpAttack = 40, .baseSpDefense = 40, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 255, .expYield = 69, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NUGGET, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_PICKUP, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_PERSIAN] = { .baseHP = 65, .baseAttack = 70, .baseDefense = 60, .baseSpeed = 115, .baseSpAttack = 65, .baseSpDefense = 65, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 90, .expYield = 148, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_LIMBER, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_PSYDUCK] = { .baseHP = 50, .baseAttack = 52, .baseDefense = 48, .baseSpeed = 55, .baseSpAttack = 65, .baseSpDefense = 50, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 190, .expYield = 80, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_DAMP, ABILITY_CLOUD_NINE}, .safariZoneFleeRate = 50, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_GOLDUCK] = { .baseHP = 80, .baseAttack = 82, .baseDefense = 78, .baseSpeed = 85, .baseSpAttack = 95, .baseSpDefense = 80, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 75, .expYield = 174, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_DAMP, ABILITY_CLOUD_NINE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_MANKEY] = { .baseHP = 40, .baseAttack = 80, .baseDefense = 35, .baseSpeed = 70, .baseSpAttack = 35, .baseSpDefense = 45, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 190, .expYield = 74, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_VITAL_SPIRIT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_PRIMEAPE] = { .baseHP = 65, .baseAttack = 105, .baseDefense = 60, .baseSpeed = 95, .baseSpAttack = 60, .baseSpDefense = 70, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 75, .expYield = 149, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_VITAL_SPIRIT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_GROWLITHE] = { .baseHP = 55, .baseAttack = 70, .baseDefense = 45, .baseSpeed = 60, .baseSpAttack = 70, .baseSpDefense = 50, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 190, .expYield = 91, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_RAWST_BERRY, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_INTIMIDATE, ABILITY_FLASH_FIRE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_ARCANINE] = { .baseHP = 90, .baseAttack = 110, .baseDefense = 80, .baseSpeed = 95, .baseSpAttack = 100, .baseSpDefense = 80, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 75, .expYield = 213, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_RAWST_BERRY, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_INTIMIDATE, ABILITY_FLASH_FIRE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_POLIWAG] = { .baseHP = 40, .baseAttack = 50, .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 40, .baseSpDefense = 40, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 255, .expYield = 77, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1}, .abilities = {ABILITY_WATER_ABSORB, ABILITY_DAMP}, .safariZoneFleeRate = 50, .bodyColor = BODY_COLOR_BLUE, .noFlip = TRUE, }, [SPECIES_POLIWHIRL] = { .baseHP = 65, .baseAttack = 65, .baseDefense = 65, .baseSpeed = 90, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 120, .expYield = 131, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_KINGS_ROCK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1}, .abilities = {ABILITY_WATER_ABSORB, ABILITY_DAMP}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = TRUE, }, [SPECIES_POLIWRATH] = { .baseHP = 90, .baseAttack = 85, .baseDefense = 95, .baseSpeed = 70, .baseSpAttack = 70, .baseSpDefense = 90, .types = {TYPE_WATER, TYPE_FIGHTING}, .catchRate = 45, .expYield = 185, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 3, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1}, .abilities = {ABILITY_WATER_ABSORB, ABILITY_DAMP}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = TRUE, }, [SPECIES_ABRA] = { .baseHP = 25, .baseAttack = 20, .baseDefense = 15, .baseSpeed = 90, .baseSpAttack = 105, .baseSpDefense = 55, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 200, .expYield = 73, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_TWISTED_SPOON, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_KADABRA] = { .baseHP = 40, .baseAttack = 35, .baseDefense = 30, .baseSpeed = 105, .baseSpAttack = 120, .baseSpDefense = 70, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 100, .expYield = 145, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_TWISTED_SPOON, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_ALAKAZAM] = { .baseHP = 55, .baseAttack = 50, .baseDefense = 45, .baseSpeed = 120, .baseSpAttack = 135, .baseSpDefense = 85, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 50, .expYield = 186, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_TWISTED_SPOON, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_MACHOP] = { .baseHP = 70, .baseAttack = 80, .baseDefense = 50, .baseSpeed = 35, .baseSpAttack = 35, .baseSpDefense = 35, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 180, .expYield = 88, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_GUTS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_MACHOKE] = { .baseHP = 80, .baseAttack = 100, .baseDefense = 70, .baseSpeed = 45, .baseSpAttack = 50, .baseSpDefense = 60, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 90, .expYield = 146, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_FOCUS_BAND, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_GUTS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_MACHAMP] = { .baseHP = 90, .baseAttack = 130, .baseDefense = 80, .baseSpeed = 55, .baseSpAttack = 65, .baseSpDefense = 85, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 45, .expYield = 193, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_FOCUS_BAND, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_GUTS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_BELLSPROUT] = { .baseHP = 50, .baseAttack = 75, .baseDefense = 35, .baseSpeed = 40, .baseSpAttack = 70, .baseSpDefense = 30, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 255, .expYield = 84, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_WEEPINBELL] = { .baseHP = 65, .baseAttack = 90, .baseDefense = 50, .baseSpeed = 55, .baseSpAttack = 85, .baseSpDefense = 45, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 120, .expYield = 151, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_VICTREEBEL] = { .baseHP = 80, .baseAttack = 105, .baseDefense = 65, .baseSpeed = 70, .baseSpAttack = 100, .baseSpDefense = 60, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 45, .expYield = 191, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_TENTACOOL] = { .baseHP = 40, .baseAttack = 40, .baseDefense = 35, .baseSpeed = 70, .baseSpAttack = 50, .baseSpDefense = 100, .types = {TYPE_WATER, TYPE_POISON}, .catchRate = 190, .expYield = 105, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_CLEAR_BODY, ABILITY_LIQUID_OOZE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_TENTACRUEL] = { .baseHP = 80, .baseAttack = 70, .baseDefense = 65, .baseSpeed = 100, .baseSpAttack = 80, .baseSpDefense = 120, .types = {TYPE_WATER, TYPE_POISON}, .catchRate = 60, .expYield = 205, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_CLEAR_BODY, ABILITY_LIQUID_OOZE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_GEODUDE] = { .baseHP = 40, .baseAttack = 80, .baseDefense = 100, .baseSpeed = 20, .baseSpAttack = 30, .baseSpDefense = 30, .types = {TYPE_ROCK, TYPE_GROUND}, .catchRate = 255, .expYield = 86, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_GRAVELER] = { .baseHP = 55, .baseAttack = 95, .baseDefense = 115, .baseSpeed = 35, .baseSpAttack = 45, .baseSpDefense = 45, .types = {TYPE_ROCK, TYPE_GROUND}, .catchRate = 120, .expYield = 134, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_HARD_STONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_GOLEM] = { .baseHP = 80, .baseAttack = 110, .baseDefense = 130, .baseSpeed = 45, .baseSpAttack = 55, .baseSpDefense = 65, .types = {TYPE_ROCK, TYPE_GROUND}, .catchRate = 45, .expYield = 177, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 3, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_HARD_STONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_PONYTA] = { .baseHP = 50, .baseAttack = 85, .baseDefense = 55, .baseSpeed = 90, .baseSpAttack = 65, .baseSpDefense = 65, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 190, .expYield = 152, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_RUN_AWAY, ABILITY_FLASH_FIRE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_RAPIDASH] = { .baseHP = 65, .baseAttack = 100, .baseDefense = 70, .baseSpeed = 105, .baseSpAttack = 80, .baseSpDefense = 80, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 60, .expYield = 192, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_RUN_AWAY, ABILITY_FLASH_FIRE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_SLOWPOKE] = { .baseHP = 90, .baseAttack = 65, .baseDefense = 65, .baseSpeed = 15, .baseSpAttack = 40, .baseSpDefense = 40, .types = {TYPE_WATER, TYPE_PSYCHIC}, .catchRate = 190, .expYield = 99, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_OWN_TEMPO}, .safariZoneFleeRate = 50, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_SLOWBRO] = { .baseHP = 95, .baseAttack = 75, .baseDefense = 110, .baseSpeed = 30, .baseSpAttack = 100, .baseSpDefense = 80, .types = {TYPE_WATER, TYPE_PSYCHIC}, .catchRate = 75, .expYield = 164, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_KINGS_ROCK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_OWN_TEMPO}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_MAGNEMITE] = { .baseHP = 25, .baseAttack = 35, .baseDefense = 70, .baseSpeed = 45, .baseSpAttack = 95, .baseSpDefense = 55, .types = {TYPE_ELECTRIC, TYPE_STEEL}, .catchRate = 190, .expYield = 89, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_METAL_COAT, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_MAGNET_PULL, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_MAGNETON] = { .baseHP = 50, .baseAttack = 60, .baseDefense = 95, .baseSpeed = 70, .baseSpAttack = 120, .baseSpDefense = 70, .types = {TYPE_ELECTRIC, TYPE_STEEL}, .catchRate = 60, .expYield = 161, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_MAGNET, .itemRare = ITEM_METAL_COAT, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_MAGNET_PULL, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_FARFETCHD] = { .baseHP = 52, .baseAttack = 65, .baseDefense = 55, .baseSpeed = 60, .baseSpAttack = 58, .baseSpDefense = 62, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 45, .expYield = 94, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_STICK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FIELD}, .abilities = {ABILITY_KEEN_EYE, ABILITY_INNER_FOCUS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_DODUO] = { .baseHP = 35, .baseAttack = 85, .baseDefense = 45, .baseSpeed = 75, .baseSpAttack = 35, .baseSpDefense = 35, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 190, .expYield = 96, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_RUN_AWAY, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 50, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_DODRIO] = { .baseHP = 60, .baseAttack = 110, .baseDefense = 70, .baseSpeed = 100, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 45, .expYield = 158, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SHARP_BEAK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_RUN_AWAY, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_SEEL] = { .baseHP = 65, .baseAttack = 45, .baseDefense = 55, .baseSpeed = 45, .baseSpAttack = 45, .baseSpDefense = 70, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 190, .expYield = 100, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_ASPEAR_BERRY, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_THICK_FAT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_DEWGONG] = { .baseHP = 90, .baseAttack = 70, .baseDefense = 80, .baseSpeed = 70, .baseSpAttack = 70, .baseSpDefense = 95, .types = {TYPE_WATER, TYPE_ICE}, .catchRate = 75, .expYield = 176, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_ASPEAR_BERRY, .itemRare = ITEM_NEVER_MELT_ICE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_THICK_FAT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_GRIMER] = { .baseHP = 80, .baseAttack = 80, .baseDefense = 50, .baseSpeed = 25, .baseSpAttack = 40, .baseSpDefense = 50, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 190, .expYield = 90, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_STENCH, ABILITY_STICKY_HOLD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_MUK] = { .baseHP = 105, .baseAttack = 105, .baseDefense = 75, .baseSpeed = 50, .baseSpAttack = 65, .baseSpDefense = 100, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 75, .expYield = 157, .evYield_HP = 1, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_STENCH, ABILITY_STICKY_HOLD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_SHELLDER] = { .baseHP = 30, .baseAttack = 65, .baseDefense = 100, .baseSpeed = 40, .baseSpAttack = 45, .baseSpDefense = 25, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 190, .expYield = 97, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_PEARL, .itemRare = ITEM_BIG_PEARL, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_SHELL_ARMOR, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_CLOYSTER] = { .baseHP = 50, .baseAttack = 95, .baseDefense = 180, .baseSpeed = 70, .baseSpAttack = 85, .baseSpDefense = 45, .types = {TYPE_WATER, TYPE_ICE}, .catchRate = 60, .expYield = 203, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_PEARL, .itemRare = ITEM_BIG_PEARL, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_SHELL_ARMOR, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_GASTLY] = { .baseHP = 30, .baseAttack = 35, .baseDefense = 30, .baseSpeed = 80, .baseSpAttack = 100, .baseSpDefense = 35, .types = {TYPE_GHOST, TYPE_POISON}, .catchRate = 190, .expYield = 95, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_HAUNTER] = { .baseHP = 45, .baseAttack = 50, .baseDefense = 45, .baseSpeed = 95, .baseSpAttack = 115, .baseSpDefense = 55, .types = {TYPE_GHOST, TYPE_POISON}, .catchRate = 90, .expYield = 126, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SPELL_TAG, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_GENGAR] = { .baseHP = 60, .baseAttack = 65, .baseDefense = 60, .baseSpeed = 110, .baseSpAttack = 130, .baseSpDefense = 75, .types = {TYPE_GHOST, TYPE_POISON}, .catchRate = 45, .expYield = 190, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SPELL_TAG, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_ONIX] = { .baseHP = 35, .baseAttack = 45, .baseDefense = 160, .baseSpeed = 70, .baseSpAttack = 30, .baseSpDefense = 45, .types = {TYPE_ROCK, TYPE_GROUND}, .catchRate = 45, .expYield = 108, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_HARD_STONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_DROWZEE] = { .baseHP = 60, .baseAttack = 48, .baseDefense = 45, .baseSpeed = 42, .baseSpAttack = 43, .baseSpDefense = 90, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 190, .expYield = 102, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_INSOMNIA, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_HYPNO] = { .baseHP = 85, .baseAttack = 73, .baseDefense = 70, .baseSpeed = 67, .baseSpAttack = 73, .baseSpDefense = 115, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 75, .expYield = 165, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_INSOMNIA, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_KRABBY] = { .baseHP = 30, .baseAttack = 105, .baseDefense = 90, .baseSpeed = 50, .baseSpAttack = 25, .baseSpDefense = 25, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 225, .expYield = 115, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_KINGLER] = { .baseHP = 55, .baseAttack = 130, .baseDefense = 115, .baseSpeed = 75, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 60, .expYield = 206, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = TRUE, }, [SPECIES_VOLTORB] = { .baseHP = 40, .baseAttack = 30, .baseDefense = 50, .baseSpeed = 100, .baseSpAttack = 55, .baseSpDefense = 55, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 190, .expYield = 103, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_SOUNDPROOF, ABILITY_STATIC}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_ELECTRODE] = { .baseHP = 60, .baseAttack = 50, .baseDefense = 70, .baseSpeed = 140, .baseSpAttack = 80, .baseSpDefense = 80, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 60, .expYield = 150, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_SOUNDPROOF, ABILITY_STATIC}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_EXEGGCUTE] = { .baseHP = 60, .baseAttack = 40, .baseDefense = 80, .baseSpeed = 40, .baseSpAttack = 60, .baseSpDefense = 45, .types = {TYPE_GRASS, TYPE_PSYCHIC}, .catchRate = 90, .expYield = 98, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 75, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_EXEGGUTOR] = { .baseHP = 95, .baseAttack = 95, .baseDefense = 85, .baseSpeed = 55, .baseSpAttack = 125, .baseSpDefense = 65, .types = {TYPE_GRASS, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 212, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_CUBONE] = { .baseHP = 50, .baseAttack = 50, .baseDefense = 95, .baseSpeed = 35, .baseSpAttack = 40, .baseSpDefense = 50, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 190, .expYield = 87, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_THICK_CLUB, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_LIGHTNING_ROD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_MAROWAK] = { .baseHP = 60, .baseAttack = 80, .baseDefense = 110, .baseSpeed = 45, .baseSpAttack = 50, .baseSpDefense = 80, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 75, .expYield = 124, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_THICK_CLUB, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_LIGHTNING_ROD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_HITMONLEE] = { .baseHP = 50, .baseAttack = 120, .baseDefense = 53, .baseSpeed = 87, .baseSpAttack = 35, .baseSpDefense = 110, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 45, .expYield = 139, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_LIMBER, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_HITMONCHAN] = { .baseHP = 50, .baseAttack = 105, .baseDefense = 79, .baseSpeed = 76, .baseSpAttack = 35, .baseSpDefense = 110, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 45, .expYield = 140, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_LICKITUNG] = { .baseHP = 90, .baseAttack = 55, .baseDefense = 75, .baseSpeed = 30, .baseSpAttack = 60, .baseSpDefense = 75, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 127, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_OWN_TEMPO, ABILITY_OBLIVIOUS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_KOFFING] = { .baseHP = 40, .baseAttack = 65, .baseDefense = 95, .baseSpeed = 35, .baseSpAttack = 60, .baseSpDefense = 45, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 190, .expYield = 114, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_WEEZING] = { .baseHP = 65, .baseAttack = 90, .baseDefense = 120, .baseSpeed = 60, .baseSpAttack = 85, .baseSpDefense = 70, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 60, .expYield = 173, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_RHYHORN] = { .baseHP = 80, .baseAttack = 85, .baseDefense = 95, .baseSpeed = 25, .baseSpAttack = 30, .baseSpDefense = 30, .types = {TYPE_GROUND, TYPE_ROCK}, .catchRate = 120, .expYield = 135, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_LIGHTNING_ROD, ABILITY_ROCK_HEAD}, .safariZoneFleeRate = 75, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_RHYDON] = { .baseHP = 105, .baseAttack = 130, .baseDefense = 120, .baseSpeed = 40, .baseSpAttack = 45, .baseSpDefense = 45, .types = {TYPE_GROUND, TYPE_ROCK}, .catchRate = 60, .expYield = 204, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_LIGHTNING_ROD, ABILITY_ROCK_HEAD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_CHANSEY] = { .baseHP = 250, .baseAttack = 5, .baseDefense = 5, .baseSpeed = 50, .baseSpAttack = 35, .baseSpDefense = 105, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 30, .expYield = 255, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_LUCKY_EGG, .genderRatio = MON_FEMALE, .eggCycles = 40, .friendship = 140, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, .abilities = {ABILITY_NATURAL_CURE, ABILITY_SERENE_GRACE}, .safariZoneFleeRate = 125, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_TANGELA] = { .baseHP = 65, .baseAttack = 55, .baseDefense = 115, .baseSpeed = 60, .baseSpAttack = 100, .baseSpDefense = 40, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 45, .expYield = 166, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_KANGASKHAN] = { .baseHP = 105, .baseAttack = 95, .baseDefense = 80, .baseSpeed = 90, .baseSpAttack = 40, .baseSpDefense = 80, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 175, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_FEMALE, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_EARLY_BIRD, ABILITY_NONE}, .safariZoneFleeRate = 125, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_HORSEA] = { .baseHP = 30, .baseAttack = 40, .baseDefense = 70, .baseSpeed = 60, .baseSpAttack = 70, .baseSpDefense = 25, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 225, .expYield = 83, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SEADRA] = { .baseHP = 55, .baseAttack = 65, .baseDefense = 95, .baseSpeed = 85, .baseSpAttack = 95, .baseSpDefense = 45, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 75, .expYield = 155, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON}, .abilities = {ABILITY_POISON_POINT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_GOLDEEN] = { .baseHP = 45, .baseAttack = 67, .baseDefense = 60, .baseSpeed = 63, .baseSpAttack = 35, .baseSpDefense = 50, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 225, .expYield = 111, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_WATER_VEIL}, .safariZoneFleeRate = 50, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_SEAKING] = { .baseHP = 80, .baseAttack = 92, .baseDefense = 65, .baseSpeed = 68, .baseSpAttack = 65, .baseSpDefense = 80, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 60, .expYield = 170, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_WATER_VEIL}, .safariZoneFleeRate = 75, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_STARYU] = { .baseHP = 30, .baseAttack = 45, .baseDefense = 55, .baseSpeed = 85, .baseSpAttack = 70, .baseSpDefense = 55, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 225, .expYield = 106, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_STARDUST, .itemRare = ITEM_STAR_PIECE, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_ILLUMINATE, ABILITY_NATURAL_CURE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_STARMIE] = { .baseHP = 60, .baseAttack = 75, .baseDefense = 85, .baseSpeed = 115, .baseSpAttack = 100, .baseSpDefense = 85, .types = {TYPE_WATER, TYPE_PSYCHIC}, .catchRate = 60, .expYield = 207, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_STARDUST, .itemRare = ITEM_STAR_PIECE, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_ILLUMINATE, ABILITY_NATURAL_CURE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_MR_MIME] = { .baseHP = 40, .baseAttack = 45, .baseDefense = 65, .baseSpeed = 90, .baseSpAttack = 100, .baseSpDefense = 120, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 136, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_SOUNDPROOF, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_SCYTHER] = { .baseHP = 70, .baseAttack = 110, .baseDefense = 80, .baseSpeed = 105, .baseSpAttack = 55, .baseSpDefense = 80, .types = {TYPE_BUG, TYPE_FLYING}, .catchRate = 45, .expYield = 187, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SWARM, ABILITY_NONE}, .safariZoneFleeRate = 125, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_JYNX] = { .baseHP = 65, .baseAttack = 50, .baseDefense = 35, .baseSpeed = 95, .baseSpAttack = 115, .baseSpDefense = 95, .types = {TYPE_ICE, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 137, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_FEMALE, .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_ELECTABUZZ] = { .baseHP = 65, .baseAttack = 83, .baseDefense = 57, .baseSpeed = 105, .baseSpAttack = 95, .baseSpDefense = 85, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 45, .expYield = 156, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = TRUE, }, [SPECIES_MAGMAR] = { .baseHP = 65, .baseAttack = 95, .baseDefense = 57, .baseSpeed = 93, .baseSpAttack = 100, .baseSpDefense = 85, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 45, .expYield = 167, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_FLAME_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_PINSIR] = { .baseHP = 65, .baseAttack = 125, .baseDefense = 100, .baseSpeed = 85, .baseSpAttack = 55, .baseSpDefense = 70, .types = {TYPE_BUG, TYPE_BUG}, .catchRate = 45, .expYield = 200, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_HYPER_CUTTER, ABILITY_NONE}, .safariZoneFleeRate = 125, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_TAUROS] = { .baseHP = 75, .baseAttack = 100, .baseDefense = 95, .baseSpeed = 110, .baseSpAttack = 40, .baseSpDefense = 70, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 211, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE}, .safariZoneFleeRate = 125, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_MAGIKARP] = { .baseHP = 20, .baseAttack = 10, .baseDefense = 55, .baseSpeed = 80, .baseSpAttack = 15, .baseSpDefense = 20, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 255, .expYield = 20, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 5, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_DRAGON}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE}, .safariZoneFleeRate = 25, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_GYARADOS] = { .baseHP = 95, .baseAttack = 125, .baseDefense = 79, .baseSpeed = 81, .baseSpAttack = 60, .baseSpDefense = 100, .types = {TYPE_WATER, TYPE_FLYING}, .catchRate = 45, .expYield = 214, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_DEEP_SEA_TOOTH, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 5, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_DRAGON}, .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_LAPRAS] = { .baseHP = 130, .baseAttack = 85, .baseDefense = 80, .baseSpeed = 60, .baseSpAttack = 85, .baseSpDefense = 95, .types = {TYPE_WATER, TYPE_ICE}, .catchRate = 45, .expYield = 219, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_WATER_ABSORB, ABILITY_SHELL_ARMOR}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_DITTO] = { .baseHP = 48, .baseAttack = 48, .baseDefense = 48, .baseSpeed = 48, .baseSpAttack = 48, .baseSpDefense = 48, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 35, .expYield = 61, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_METAL_POWDER, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_DITTO, EGG_GROUP_DITTO}, .abilities = {ABILITY_LIMBER, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_EEVEE] = { .baseHP = 55, .baseAttack = 55, .baseDefense = 50, .baseSpeed = 55, .baseSpAttack = 45, .baseSpDefense = 65, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 92, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 35, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_RUN_AWAY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_VAPOREON] = { .baseHP = 130, .baseAttack = 65, .baseDefense = 60, .baseSpeed = 65, .baseSpAttack = 110, .baseSpDefense = 95, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 45, .expYield = 196, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 35, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_WATER_ABSORB, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_JOLTEON] = { .baseHP = 65, .baseAttack = 65, .baseDefense = 60, .baseSpeed = 130, .baseSpAttack = 110, .baseSpDefense = 95, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 45, .expYield = 197, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 35, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_VOLT_ABSORB, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_FLAREON] = { .baseHP = 65, .baseAttack = 130, .baseDefense = 60, .baseSpeed = 65, .baseSpAttack = 95, .baseSpDefense = 110, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 45, .expYield = 198, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 35, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_FLASH_FIRE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_PORYGON] = { .baseHP = 65, .baseAttack = 60, .baseDefense = 70, .baseSpeed = 40, .baseSpAttack = 85, .baseSpDefense = 75, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 130, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_TRACE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_OMANYTE] = { .baseHP = 35, .baseAttack = 40, .baseDefense = 100, .baseSpeed = 35, .baseSpAttack = 90, .baseSpDefense = 55, .types = {TYPE_ROCK, TYPE_WATER}, .catchRate = 45, .expYield = 120, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 30, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_SHELL_ARMOR}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_OMASTAR] = { .baseHP = 70, .baseAttack = 60, .baseDefense = 125, .baseSpeed = 55, .baseSpAttack = 115, .baseSpDefense = 70, .types = {TYPE_ROCK, TYPE_WATER}, .catchRate = 45, .expYield = 199, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 30, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_SHELL_ARMOR}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_KABUTO] = { .baseHP = 30, .baseAttack = 80, .baseDefense = 90, .baseSpeed = 55, .baseSpAttack = 55, .baseSpDefense = 45, .types = {TYPE_ROCK, TYPE_WATER}, .catchRate = 45, .expYield = 119, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 30, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_BATTLE_ARMOR}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_KABUTOPS] = { .baseHP = 60, .baseAttack = 115, .baseDefense = 105, .baseSpeed = 80, .baseSpAttack = 65, .baseSpDefense = 70, .types = {TYPE_ROCK, TYPE_WATER}, .catchRate = 45, .expYield = 201, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 30, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_BATTLE_ARMOR}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_AERODACTYL] = { .baseHP = 80, .baseAttack = 105, .baseDefense = 65, .baseSpeed = 130, .baseSpAttack = 60, .baseSpDefense = 75, .types = {TYPE_ROCK, TYPE_FLYING}, .catchRate = 45, .expYield = 202, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 35, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_PRESSURE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_SNORLAX] = { .baseHP = 160, .baseAttack = 110, .baseDefense = 65, .baseSpeed = 30, .baseSpAttack = 65, .baseSpDefense = 110, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 25, .expYield = 154, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_CHESTO_BERRY, .itemRare = ITEM_CHESTO_BERRY, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 40, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_IMMUNITY, ABILITY_THICK_FAT}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_ARTICUNO] = { .baseHP = 90, .baseAttack = 85, .baseDefense = 100, .baseSpeed = 85, .baseSpAttack = 95, .baseSpDefense = 125, .types = {TYPE_ICE, TYPE_FLYING}, .catchRate = 3, .expYield = 215, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_ZAPDOS] = { .baseHP = 90, .baseAttack = 90, .baseDefense = 85, .baseSpeed = 100, .baseSpAttack = 125, .baseSpDefense = 90, .types = {TYPE_ELECTRIC, TYPE_FLYING}, .catchRate = 3, .expYield = 216, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_MOLTRES] = { .baseHP = 90, .baseAttack = 100, .baseDefense = 90, .baseSpeed = 90, .baseSpAttack = 125, .baseSpDefense = 85, .types = {TYPE_FIRE, TYPE_FLYING}, .catchRate = 3, .expYield = 217, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_DRATINI] = { .baseHP = 41, .baseAttack = 64, .baseDefense = 45, .baseSpeed = 50, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_DRAGON, TYPE_DRAGON}, .catchRate = 45, .expYield = 67, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_DRAGON_SCALE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON}, .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 100, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_DRAGONAIR] = { .baseHP = 61, .baseAttack = 84, .baseDefense = 65, .baseSpeed = 70, .baseSpAttack = 70, .baseSpDefense = 70, .types = {TYPE_DRAGON, TYPE_DRAGON}, .catchRate = 45, .expYield = 144, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_DRAGON_FANG, .itemRare = ITEM_DRAGON_SCALE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON}, .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 125, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_DRAGONITE] = { .baseHP = 91, .baseAttack = 134, .baseDefense = 95, .baseSpeed = 80, .baseSpAttack = 100, .baseSpDefense = 100, .types = {TYPE_DRAGON, TYPE_FLYING}, .catchRate = 45, .expYield = 218, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_DRAGON_FANG, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON}, .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_MEWTWO] = { .baseHP = 106, .baseAttack = 110, .baseDefense = 90, .baseSpeed = 130, .baseSpAttack = 154, .baseSpDefense = 90, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 3, .expYield = 220, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_MEW] = { .baseHP = 100, .baseAttack = 100, .baseDefense = 100, .baseSpeed = 100, .baseSpAttack = 100, .baseSpDefense = 100, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 64, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 100, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_CHIKORITA] = { .baseHP = 45, .baseAttack = 49, .baseDefense = 65, .baseSpeed = 45, .baseSpAttack = 49, .baseSpDefense = 65, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 45, .expYield = 64, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_LUM_BERRY, .itemRare = ITEM_LUM_BERRY, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS}, .abilities = {ABILITY_OVERGROW, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_BAYLEEF] = { .baseHP = 60, .baseAttack = 62, .baseDefense = 80, .baseSpeed = 60, .baseSpAttack = 63, .baseSpDefense = 80, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 45, .expYield = 141, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS}, .abilities = {ABILITY_OVERGROW, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_MEGANIUM] = { .baseHP = 80, .baseAttack = 82, .baseDefense = 100, .baseSpeed = 80, .baseSpAttack = 83, .baseSpDefense = 100, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 45, .expYield = 208, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS}, .abilities = {ABILITY_OVERGROW, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_CYNDAQUIL] = { .baseHP = 39, .baseAttack = 52, .baseDefense = 43, .baseSpeed = 65, .baseSpAttack = 60, .baseSpDefense = 50, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 45, .expYield = 65, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_BLAZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_QUILAVA] = { .baseHP = 58, .baseAttack = 64, .baseDefense = 58, .baseSpeed = 80, .baseSpAttack = 80, .baseSpDefense = 65, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 45, .expYield = 142, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_BLAZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_TYPHLOSION] = { .baseHP = 78, .baseAttack = 84, .baseDefense = 78, .baseSpeed = 100, .baseSpAttack = 109, .baseSpDefense = 85, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 45, .expYield = 209, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_BLAZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_TOTODILE] = { .baseHP = 50, .baseAttack = 65, .baseDefense = 64, .baseSpeed = 43, .baseSpAttack = 44, .baseSpDefense = 48, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 45, .expYield = 66, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_TORRENT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_CROCONAW] = { .baseHP = 65, .baseAttack = 80, .baseDefense = 80, .baseSpeed = 58, .baseSpAttack = 59, .baseSpDefense = 63, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 45, .expYield = 143, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_TORRENT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = TRUE, }, [SPECIES_FERALIGATR] = { .baseHP = 85, .baseAttack = 105, .baseDefense = 100, .baseSpeed = 78, .baseSpAttack = 79, .baseSpDefense = 83, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 45, .expYield = 210, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_TORRENT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SENTRET] = { .baseHP = 35, .baseAttack = 46, .baseDefense = 34, .baseSpeed = 20, .baseSpAttack = 35, .baseSpDefense = 45, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 255, .expYield = 57, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_ORAN_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_RUN_AWAY, ABILITY_KEEN_EYE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_FURRET] = { .baseHP = 85, .baseAttack = 76, .baseDefense = 64, .baseSpeed = 90, .baseSpAttack = 45, .baseSpDefense = 55, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 90, .expYield = 116, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ORAN_BERRY, .itemRare = ITEM_SITRUS_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_RUN_AWAY, ABILITY_KEEN_EYE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_HOOTHOOT] = { .baseHP = 60, .baseAttack = 30, .baseDefense = 30, .baseSpeed = 50, .baseSpAttack = 36, .baseSpDefense = 56, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 255, .expYield = 58, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_INSOMNIA, ABILITY_KEEN_EYE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_NOCTOWL] = { .baseHP = 100, .baseAttack = 50, .baseDefense = 50, .baseSpeed = 70, .baseSpAttack = 76, .baseSpDefense = 96, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 90, .expYield = 162, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_INSOMNIA, ABILITY_KEEN_EYE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_LEDYBA] = { .baseHP = 40, .baseAttack = 20, .baseDefense = 30, .baseSpeed = 55, .baseSpAttack = 40, .baseSpDefense = 80, .types = {TYPE_BUG, TYPE_FLYING}, .catchRate = 255, .expYield = 54, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SWARM, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_LEDIAN] = { .baseHP = 55, .baseAttack = 35, .baseDefense = 50, .baseSpeed = 85, .baseSpAttack = 55, .baseSpDefense = 110, .types = {TYPE_BUG, TYPE_FLYING}, .catchRate = 90, .expYield = 134, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SWARM, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_SPINARAK] = { .baseHP = 40, .baseAttack = 60, .baseDefense = 40, .baseSpeed = 30, .baseSpAttack = 40, .baseSpDefense = 40, .types = {TYPE_BUG, TYPE_POISON}, .catchRate = 255, .expYield = 54, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SWARM, ABILITY_INSOMNIA}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_ARIADOS] = { .baseHP = 70, .baseAttack = 90, .baseDefense = 70, .baseSpeed = 40, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_BUG, TYPE_POISON}, .catchRate = 90, .expYield = 134, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SWARM, ABILITY_INSOMNIA}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_CROBAT] = { .baseHP = 85, .baseAttack = 90, .baseDefense = 80, .baseSpeed = 130, .baseSpAttack = 70, .baseSpDefense = 80, .types = {TYPE_POISON, TYPE_FLYING}, .catchRate = 90, .expYield = 204, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 3, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_CHINCHOU] = { .baseHP = 75, .baseAttack = 38, .baseDefense = 38, .baseSpeed = 67, .baseSpAttack = 56, .baseSpDefense = 56, .types = {TYPE_WATER, TYPE_ELECTRIC}, .catchRate = 190, .expYield = 90, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_DEEP_SEA_SCALE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_VOLT_ABSORB, ABILITY_ILLUMINATE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_LANTURN] = { .baseHP = 125, .baseAttack = 58, .baseDefense = 58, .baseSpeed = 67, .baseSpAttack = 76, .baseSpDefense = 76, .types = {TYPE_WATER, TYPE_ELECTRIC}, .catchRate = 75, .expYield = 156, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_YELLOW_SHARD, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_VOLT_ABSORB, ABILITY_ILLUMINATE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_PICHU] = { .baseHP = 20, .baseAttack = 40, .baseDefense = 15, .baseSpeed = 60, .baseSpAttack = 35, .baseSpDefense = 35, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 190, .expYield = 42, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_CLEFFA] = { .baseHP = 50, .baseAttack = 25, .baseDefense = 28, .baseSpeed = 15, .baseSpAttack = 45, .baseSpDefense = 55, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 150, .expYield = 37, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_MOON_STONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 10, .friendship = 140, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_IGGLYBUFF] = { .baseHP = 90, .baseAttack = 30, .baseDefense = 15, .baseSpeed = 15, .baseSpAttack = 40, .baseSpDefense = 20, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 170, .expYield = 39, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ORAN_BERRY, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = TRUE, }, [SPECIES_TOGEPI] = { .baseHP = 35, .baseAttack = 20, .baseDefense = 65, .baseSpeed = 20, .baseSpAttack = 40, .baseSpDefense = 65, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 190, .expYield = 74, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_HUSTLE, ABILITY_SERENE_GRACE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_TOGETIC] = { .baseHP = 55, .baseAttack = 40, .baseDefense = 85, .baseSpeed = 40, .baseSpAttack = 80, .baseSpDefense = 105, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 75, .expYield = 114, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FAIRY}, .abilities = {ABILITY_HUSTLE, ABILITY_SERENE_GRACE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_NATU] = { .baseHP = 40, .baseAttack = 50, .baseDefense = 45, .baseSpeed = 70, .baseSpAttack = 70, .baseSpDefense = 45, .types = {TYPE_PSYCHIC, TYPE_FLYING}, .catchRate = 190, .expYield = 73, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_XATU] = { .baseHP = 65, .baseAttack = 75, .baseDefense = 70, .baseSpeed = 95, .baseSpAttack = 95, .baseSpDefense = 70, .types = {TYPE_PSYCHIC, TYPE_FLYING}, .catchRate = 75, .expYield = 171, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_MAREEP] = { .baseHP = 55, .baseAttack = 40, .baseDefense = 40, .baseSpeed = 35, .baseSpAttack = 65, .baseSpDefense = 45, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 235, .expYield = 59, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_FLAAFFY] = { .baseHP = 70, .baseAttack = 55, .baseDefense = 55, .baseSpeed = 45, .baseSpAttack = 80, .baseSpDefense = 60, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 120, .expYield = 117, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_AMPHAROS] = { .baseHP = 90, .baseAttack = 75, .baseDefense = 75, .baseSpeed = 55, .baseSpAttack = 115, .baseSpDefense = 90, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 45, .expYield = 194, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_BELLOSSOM] = { .baseHP = 75, .baseAttack = 80, .baseDefense = 85, .baseSpeed = 50, .baseSpAttack = 90, .baseSpDefense = 100, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 45, .expYield = 184, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_MARILL] = { .baseHP = 70, .baseAttack = 20, .baseDefense = 50, .baseSpeed = 40, .baseSpAttack = 20, .baseSpDefense = 50, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 190, .expYield = 58, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FAIRY}, .abilities = {ABILITY_THICK_FAT, ABILITY_HUGE_POWER}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_AZUMARILL] = { .baseHP = 100, .baseAttack = 50, .baseDefense = 80, .baseSpeed = 50, .baseSpAttack = 50, .baseSpDefense = 80, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 75, .expYield = 153, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FAIRY}, .abilities = {ABILITY_THICK_FAT, ABILITY_HUGE_POWER}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SUDOWOODO] = { .baseHP = 70, .baseAttack = 100, .baseDefense = 115, .baseSpeed = 30, .baseSpAttack = 30, .baseSpDefense = 65, .types = {TYPE_ROCK, TYPE_ROCK}, .catchRate = 65, .expYield = 135, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_STURDY, ABILITY_ROCK_HEAD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_POLITOED] = { .baseHP = 90, .baseAttack = 75, .baseDefense = 75, .baseSpeed = 70, .baseSpAttack = 90, .baseSpDefense = 100, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 45, .expYield = 185, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_KINGS_ROCK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1}, .abilities = {ABILITY_WATER_ABSORB, ABILITY_DAMP}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = TRUE, }, [SPECIES_HOPPIP] = { .baseHP = 35, .baseAttack = 35, .baseDefense = 40, .baseSpeed = 50, .baseSpAttack = 35, .baseSpDefense = 55, .types = {TYPE_GRASS, TYPE_FLYING}, .catchRate = 255, .expYield = 74, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_SKIPLOOM] = { .baseHP = 55, .baseAttack = 45, .baseDefense = 50, .baseSpeed = 80, .baseSpAttack = 45, .baseSpDefense = 65, .types = {TYPE_GRASS, TYPE_FLYING}, .catchRate = 120, .expYield = 136, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_JUMPLUFF] = { .baseHP = 75, .baseAttack = 55, .baseDefense = 70, .baseSpeed = 110, .baseSpAttack = 55, .baseSpDefense = 85, .types = {TYPE_GRASS, TYPE_FLYING}, .catchRate = 45, .expYield = 176, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 3, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_AIPOM] = { .baseHP = 55, .baseAttack = 70, .baseDefense = 55, .baseSpeed = 85, .baseSpAttack = 40, .baseSpDefense = 55, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 94, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_RUN_AWAY, ABILITY_PICKUP}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_SUNKERN] = { .baseHP = 30, .baseAttack = 30, .baseDefense = 30, .baseSpeed = 30, .baseSpAttack = 30, .baseSpDefense = 30, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 235, .expYield = 52, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_SUNFLORA] = { .baseHP = 75, .baseAttack = 75, .baseDefense = 55, .baseSpeed = 30, .baseSpAttack = 105, .baseSpDefense = 85, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 120, .expYield = 146, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_YANMA] = { .baseHP = 65, .baseAttack = 65, .baseDefense = 45, .baseSpeed = 95, .baseSpAttack = 75, .baseSpDefense = 45, .types = {TYPE_BUG, TYPE_FLYING}, .catchRate = 75, .expYield = 147, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SPEED_BOOST, ABILITY_COMPOUND_EYES}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_WOOPER] = { .baseHP = 55, .baseAttack = 45, .baseDefense = 45, .baseSpeed = 15, .baseSpAttack = 25, .baseSpDefense = 25, .types = {TYPE_WATER, TYPE_GROUND}, .catchRate = 255, .expYield = 52, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_DAMP, ABILITY_WATER_ABSORB}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_QUAGSIRE] = { .baseHP = 95, .baseAttack = 85, .baseDefense = 85, .baseSpeed = 35, .baseSpAttack = 65, .baseSpDefense = 65, .types = {TYPE_WATER, TYPE_GROUND}, .catchRate = 90, .expYield = 137, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_DAMP, ABILITY_WATER_ABSORB}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_ESPEON] = { .baseHP = 65, .baseAttack = 65, .baseDefense = 60, .baseSpeed = 110, .baseSpAttack = 130, .baseSpDefense = 95, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 197, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 35, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_UMBREON] = { .baseHP = 95, .baseAttack = 65, .baseDefense = 110, .baseSpeed = 65, .baseSpAttack = 60, .baseSpDefense = 130, .types = {TYPE_DARK, TYPE_DARK}, .catchRate = 45, .expYield = 197, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 35, .friendship = 35, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_MURKROW] = { .baseHP = 60, .baseAttack = 85, .baseDefense = 42, .baseSpeed = 91, .baseSpAttack = 85, .baseSpDefense = 42, .types = {TYPE_DARK, TYPE_FLYING}, .catchRate = 30, .expYield = 107, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_INSOMNIA, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_SLOWKING] = { .baseHP = 95, .baseAttack = 75, .baseDefense = 80, .baseSpeed = 30, .baseSpAttack = 100, .baseSpDefense = 110, .types = {TYPE_WATER, TYPE_PSYCHIC}, .catchRate = 70, .expYield = 164, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_KINGS_ROCK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_OWN_TEMPO}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_MISDREAVUS] = { .baseHP = 60, .baseAttack = 60, .baseDefense = 60, .baseSpeed = 85, .baseSpAttack = 85, .baseSpDefense = 85, .types = {TYPE_GHOST, TYPE_GHOST}, .catchRate = 45, .expYield = 147, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_SPELL_TAG, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 35, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_UNOWN] = { .baseHP = 48, .baseAttack = 72, .baseDefense = 48, .baseSpeed = 48, .baseSpAttack = 72, .baseSpDefense = 48, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 225, .expYield = 61, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 40, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = TRUE, }, [SPECIES_WOBBUFFET] = { .baseHP = 190, .baseAttack = 33, .baseDefense = 58, .baseSpeed = 33, .baseSpAttack = 33, .baseSpDefense = 58, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 177, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_SHADOW_TAG, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_GIRAFARIG] = { .baseHP = 70, .baseAttack = 80, .baseDefense = 65, .baseSpeed = 85, .baseSpAttack = 90, .baseSpDefense = 65, .types = {TYPE_NORMAL, TYPE_PSYCHIC}, .catchRate = 60, .expYield = 149, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_PERSIM_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_INNER_FOCUS, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 4, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_PINECO] = { .baseHP = 50, .baseAttack = 65, .baseDefense = 90, .baseSpeed = 15, .baseSpAttack = 35, .baseSpDefense = 35, .types = {TYPE_BUG, TYPE_BUG}, .catchRate = 190, .expYield = 60, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_STURDY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_FORRETRESS] = { .baseHP = 75, .baseAttack = 90, .baseDefense = 140, .baseSpeed = 40, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_BUG, TYPE_STEEL}, .catchRate = 75, .expYield = 118, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_STURDY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_DUNSPARCE] = { .baseHP = 100, .baseAttack = 70, .baseDefense = 70, .baseSpeed = 45, .baseSpAttack = 65, .baseSpDefense = 65, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 190, .expYield = 75, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_SERENE_GRACE, ABILITY_RUN_AWAY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_GLIGAR] = { .baseHP = 65, .baseAttack = 75, .baseDefense = 105, .baseSpeed = 85, .baseSpAttack = 35, .baseSpDefense = 65, .types = {TYPE_GROUND, TYPE_FLYING}, .catchRate = 60, .expYield = 108, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SAND_VEIL}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_STEELIX] = { .baseHP = 75, .baseAttack = 85, .baseDefense = 200, .baseSpeed = 30, .baseSpAttack = 55, .baseSpDefense = 65, .types = {TYPE_STEEL, TYPE_GROUND}, .catchRate = 25, .expYield = 196, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_METAL_COAT, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_SNUBBULL] = { .baseHP = 60, .baseAttack = 80, .baseDefense = 50, .baseSpeed = 30, .baseSpAttack = 40, .baseSpDefense = 40, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 190, .expYield = 63, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, .abilities = {ABILITY_INTIMIDATE, ABILITY_RUN_AWAY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_GRANBULL] = { .baseHP = 90, .baseAttack = 120, .baseDefense = 75, .baseSpeed = 45, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 75, .expYield = 178, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, .abilities = {ABILITY_INTIMIDATE, ABILITY_INTIMIDATE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_QWILFISH] = { .baseHP = 65, .baseAttack = 95, .baseDefense = 75, .baseSpeed = 85, .baseSpAttack = 55, .baseSpDefense = 55, .types = {TYPE_WATER, TYPE_POISON}, .catchRate = 45, .expYield = 100, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_POISON_POINT, ABILITY_SWIFT_SWIM}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_SCIZOR] = { .baseHP = 70, .baseAttack = 130, .baseDefense = 100, .baseSpeed = 65, .baseSpAttack = 55, .baseSpDefense = 80, .types = {TYPE_BUG, TYPE_STEEL}, .catchRate = 25, .expYield = 200, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SWARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_SHUCKLE] = { .baseHP = 20, .baseAttack = 10, .baseDefense = 230, .baseSpeed = 5, .baseSpAttack = 10, .baseSpDefense = 230, .types = {TYPE_BUG, TYPE_ROCK}, .catchRate = 190, .expYield = 80, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_ORAN_BERRY, .itemRare = ITEM_SITRUS_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_STURDY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_HERACROSS] = { .baseHP = 80, .baseAttack = 125, .baseDefense = 75, .baseSpeed = 85, .baseSpAttack = 40, .baseSpDefense = 95, .types = {TYPE_BUG, TYPE_FIGHTING}, .catchRate = 45, .expYield = 200, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SWARM, ABILITY_GUTS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SNEASEL] = { .baseHP = 55, .baseAttack = 95, .baseDefense = 55, .baseSpeed = 115, .baseSpAttack = 35, .baseSpDefense = 75, .types = {TYPE_DARK, TYPE_ICE}, .catchRate = 60, .expYield = 132, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_INNER_FOCUS, ABILITY_KEEN_EYE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = TRUE, }, [SPECIES_TEDDIURSA] = { .baseHP = 60, .baseAttack = 80, .baseDefense = 50, .baseSpeed = 40, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 120, .expYield = 124, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ORAN_BERRY, .itemRare = ITEM_SITRUS_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_PICKUP, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = TRUE, }, [SPECIES_URSARING] = { .baseHP = 90, .baseAttack = 130, .baseDefense = 75, .baseSpeed = 55, .baseSpAttack = 75, .baseSpDefense = 75, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 60, .expYield = 189, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ORAN_BERRY, .itemRare = ITEM_SITRUS_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_GUTS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_SLUGMA] = { .baseHP = 40, .baseAttack = 40, .baseDefense = 40, .baseSpeed = 20, .baseSpAttack = 70, .baseSpDefense = 40, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 190, .expYield = 78, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_MAGMA_ARMOR, ABILITY_FLAME_BODY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_MAGCARGO] = { .baseHP = 50, .baseAttack = 50, .baseDefense = 120, .baseSpeed = 30, .baseSpAttack = 80, .baseSpDefense = 80, .types = {TYPE_FIRE, TYPE_ROCK}, .catchRate = 75, .expYield = 154, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_MAGMA_ARMOR, ABILITY_FLAME_BODY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_SWINUB] = { .baseHP = 50, .baseAttack = 50, .baseDefense = 40, .baseSpeed = 50, .baseSpAttack = 30, .baseSpDefense = 30, .types = {TYPE_ICE, TYPE_GROUND}, .catchRate = 225, .expYield = 78, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ASPEAR_BERRY, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_PILOSWINE] = { .baseHP = 100, .baseAttack = 100, .baseDefense = 80, .baseSpeed = 50, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_ICE, TYPE_GROUND}, .catchRate = 75, .expYield = 160, .evYield_HP = 1, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ASPEAR_BERRY, .itemRare = ITEM_NEVER_MELT_ICE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_CORSOLA] = { .baseHP = 55, .baseAttack = 55, .baseDefense = 85, .baseSpeed = 35, .baseSpAttack = 65, .baseSpDefense = 85, .types = {TYPE_WATER, TYPE_ROCK}, .catchRate = 60, .expYield = 113, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_RED_SHARD, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3}, .abilities = {ABILITY_HUSTLE, ABILITY_NATURAL_CURE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_REMORAID] = { .baseHP = 35, .baseAttack = 65, .baseDefense = 35, .baseSpeed = 65, .baseSpAttack = 65, .baseSpDefense = 35, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 190, .expYield = 78, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_2}, .abilities = {ABILITY_HUSTLE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_OCTILLERY] = { .baseHP = 75, .baseAttack = 105, .baseDefense = 75, .baseSpeed = 45, .baseSpAttack = 105, .baseSpDefense = 75, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 75, .expYield = 164, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_2}, .abilities = {ABILITY_SUCTION_CUPS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_DELIBIRD] = { .baseHP = 45, .baseAttack = 55, .baseDefense = 45, .baseSpeed = 75, .baseSpAttack = 65, .baseSpDefense = 45, .types = {TYPE_ICE, TYPE_FLYING}, .catchRate = 45, .expYield = 183, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_VITAL_SPIRIT, ABILITY_HUSTLE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_MANTINE] = { .baseHP = 65, .baseAttack = 40, .baseDefense = 70, .baseSpeed = 70, .baseSpAttack = 80, .baseSpDefense = 140, .types = {TYPE_WATER, TYPE_FLYING}, .catchRate = 25, .expYield = 168, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_WATER_ABSORB}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_SKARMORY] = { .baseHP = 65, .baseAttack = 80, .baseDefense = 140, .baseSpeed = 70, .baseSpAttack = 40, .baseSpDefense = 70, .types = {TYPE_STEEL, TYPE_FLYING}, .catchRate = 25, .expYield = 168, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SHARP_BEAK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_KEEN_EYE, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_HOUNDOUR] = { .baseHP = 45, .baseAttack = 60, .baseDefense = 30, .baseSpeed = 65, .baseSpAttack = 80, .baseSpDefense = 50, .types = {TYPE_DARK, TYPE_FIRE}, .catchRate = 120, .expYield = 114, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_EARLY_BIRD, ABILITY_FLASH_FIRE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_HOUNDOOM] = { .baseHP = 75, .baseAttack = 90, .baseDefense = 50, .baseSpeed = 95, .baseSpAttack = 110, .baseSpDefense = 80, .types = {TYPE_DARK, TYPE_FIRE}, .catchRate = 45, .expYield = 204, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_EARLY_BIRD, ABILITY_FLASH_FIRE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_KINGDRA] = { .baseHP = 75, .baseAttack = 95, .baseDefense = 95, .baseSpeed = 85, .baseSpAttack = 95, .baseSpDefense = 95, .types = {TYPE_WATER, TYPE_DRAGON}, .catchRate = 45, .expYield = 207, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_DRAGON_SCALE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_PHANPY] = { .baseHP = 90, .baseAttack = 60, .baseDefense = 60, .baseSpeed = 40, .baseSpAttack = 40, .baseSpDefense = 40, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 120, .expYield = 124, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_PICKUP, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_DONPHAN] = { .baseHP = 90, .baseAttack = 120, .baseDefense = 120, .baseSpeed = 50, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 60, .expYield = 189, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_STURDY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_PORYGON2] = { .baseHP = 85, .baseAttack = 80, .baseDefense = 90, .baseSpeed = 60, .baseSpAttack = 105, .baseSpDefense = 95, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 180, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_UP_GRADE, .itemRare = ITEM_UP_GRADE, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_TRACE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_STANTLER] = { .baseHP = 73, .baseAttack = 95, .baseDefense = 62, .baseSpeed = 85, .baseSpAttack = 85, .baseSpDefense = 65, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 165, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_SMEARGLE] = { .baseHP = 55, .baseAttack = 20, .baseDefense = 35, .baseSpeed = 75, .baseSpAttack = 20, .baseSpDefense = 45, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 106, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_OWN_TEMPO, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_TYROGUE] = { .baseHP = 35, .baseAttack = 35, .baseDefense = 35, .baseSpeed = 35, .baseSpAttack = 35, .baseSpDefense = 35, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 75, .expYield = 91, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_GUTS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_HITMONTOP] = { .baseHP = 50, .baseAttack = 95, .baseDefense = 95, .baseSpeed = 70, .baseSpAttack = 35, .baseSpDefense = 110, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 45, .expYield = 138, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_SMOOCHUM] = { .baseHP = 45, .baseAttack = 30, .baseDefense = 15, .baseSpeed = 65, .baseSpAttack = 85, .baseSpDefense = 65, .types = {TYPE_ICE, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 87, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_FEMALE, .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_ELEKID] = { .baseHP = 45, .baseAttack = 63, .baseDefense = 37, .baseSpeed = 95, .baseSpAttack = 65, .baseSpDefense = 55, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 45, .expYield = 106, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = TRUE, }, [SPECIES_MAGBY] = { .baseHP = 45, .baseAttack = 75, .baseDefense = 37, .baseSpeed = 83, .baseSpAttack = 70, .baseSpDefense = 55, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 45, .expYield = 117, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_FLAME_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_MILTANK] = { .baseHP = 95, .baseAttack = 80, .baseDefense = 105, .baseSpeed = 100, .baseSpAttack = 40, .baseSpDefense = 70, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 200, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_MOOMOO_MILK, .itemRare = ITEM_MOOMOO_MILK, .genderRatio = MON_FEMALE, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_THICK_FAT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_BLISSEY] = { .baseHP = 255, .baseAttack = 10, .baseDefense = 10, .baseSpeed = 55, .baseSpAttack = 75, .baseSpDefense = 135, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 30, .expYield = 255, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_LUCKY_EGG, .genderRatio = MON_FEMALE, .eggCycles = 40, .friendship = 140, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, .abilities = {ABILITY_NATURAL_CURE, ABILITY_SERENE_GRACE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_RAIKOU] = { .baseHP = 90, .baseAttack = 85, .baseDefense = 75, .baseSpeed = 115, .baseSpAttack = 115, .baseSpDefense = 100, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 3, .expYield = 216, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_ENTEI] = { .baseHP = 115, .baseAttack = 115, .baseDefense = 85, .baseSpeed = 100, .baseSpAttack = 90, .baseSpDefense = 75, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 3, .expYield = 217, .evYield_HP = 1, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_SUICUNE] = { .baseHP = 100, .baseAttack = 75, .baseDefense = 115, .baseSpeed = 85, .baseSpAttack = 90, .baseSpDefense = 115, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 3, .expYield = 215, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_LARVITAR] = { .baseHP = 50, .baseAttack = 64, .baseDefense = 50, .baseSpeed = 41, .baseSpAttack = 45, .baseSpDefense = 50, .types = {TYPE_ROCK, TYPE_GROUND}, .catchRate = 45, .expYield = 67, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_GUTS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_PUPITAR] = { .baseHP = 70, .baseAttack = 84, .baseDefense = 70, .baseSpeed = 51, .baseSpAttack = 65, .baseSpDefense = 70, .types = {TYPE_ROCK, TYPE_GROUND}, .catchRate = 45, .expYield = 144, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_TYRANITAR] = { .baseHP = 100, .baseAttack = 134, .baseDefense = 110, .baseSpeed = 61, .baseSpAttack = 95, .baseSpDefense = 100, .types = {TYPE_ROCK, TYPE_DARK}, .catchRate = 45, .expYield = 218, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_SAND_STREAM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_LUGIA] = { .baseHP = 106, .baseAttack = 90, .baseDefense = 130, .baseSpeed = 110, .baseSpAttack = 90, .baseSpDefense = 154, .types = {TYPE_PSYCHIC, TYPE_FLYING}, .catchRate = 3, .expYield = 220, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_HO_OH] = { .baseHP = 106, .baseAttack = 130, .baseDefense = 90, .baseSpeed = 90, .baseSpAttack = 110, .baseSpDefense = 154, .types = {TYPE_FIRE, TYPE_FLYING}, .catchRate = 3, .expYield = 220, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_CELEBI] = { .baseHP = 100, .baseAttack = 100, .baseDefense = 100, .baseSpeed = 100, .baseSpAttack = 100, .baseSpDefense = 100, .types = {TYPE_PSYCHIC, TYPE_GRASS}, .catchRate = 45, .expYield = 64, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_LUM_BERRY, .itemRare = ITEM_LUM_BERRY, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 100, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_NATURAL_CURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_OLD_UNOWN_B] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_C] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_D] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_E] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_F] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_G] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_H] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_I] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_J] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_K] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_L] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_M] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_N] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_O] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_P] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_Q] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_R] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_S] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_T] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_U] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_V] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_W] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_X] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_Y] = OLD_UNOWN_SPECIES_INFO, [SPECIES_OLD_UNOWN_Z] = OLD_UNOWN_SPECIES_INFO, [SPECIES_TREECKO] = { .baseHP = 40, .baseAttack = 45, .baseDefense = 35, .baseSpeed = 70, .baseSpAttack = 65, .baseSpDefense = 55, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 45, .expYield = 65, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON}, .abilities = {ABILITY_OVERGROW, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_GROVYLE] = { .baseHP = 50, .baseAttack = 65, .baseDefense = 45, .baseSpeed = 95, .baseSpAttack = 85, .baseSpDefense = 65, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 45, .expYield = 141, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON}, .abilities = {ABILITY_OVERGROW, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_SCEPTILE] = { .baseHP = 70, .baseAttack = 85, .baseDefense = 65, .baseSpeed = 120, .baseSpAttack = 105, .baseSpDefense = 85, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 45, .expYield = 208, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 3, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON}, .abilities = {ABILITY_OVERGROW, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_TORCHIC] = { .baseHP = 45, .baseAttack = 60, .baseDefense = 40, .baseSpeed = 45, .baseSpAttack = 70, .baseSpDefense = 50, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 45, .expYield = 65, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_BLAZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_COMBUSKEN] = { .baseHP = 60, .baseAttack = 85, .baseDefense = 60, .baseSpeed = 55, .baseSpAttack = 85, .baseSpDefense = 60, .types = {TYPE_FIRE, TYPE_FIGHTING}, .catchRate = 45, .expYield = 142, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_BLAZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_BLAZIKEN] = { .baseHP = 80, .baseAttack = 120, .baseDefense = 70, .baseSpeed = 80, .baseSpAttack = 110, .baseSpDefense = 70, .types = {TYPE_FIRE, TYPE_FIGHTING}, .catchRate = 45, .expYield = 209, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_BLAZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_MUDKIP] = { .baseHP = 50, .baseAttack = 70, .baseDefense = 50, .baseSpeed = 40, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 45, .expYield = 65, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_TORRENT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_MARSHTOMP] = { .baseHP = 70, .baseAttack = 85, .baseDefense = 70, .baseSpeed = 50, .baseSpAttack = 60, .baseSpDefense = 70, .types = {TYPE_WATER, TYPE_GROUND}, .catchRate = 45, .expYield = 143, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_TORRENT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SWAMPERT] = { .baseHP = 100, .baseAttack = 110, .baseDefense = 90, .baseSpeed = 60, .baseSpAttack = 85, .baseSpDefense = 90, .types = {TYPE_WATER, TYPE_GROUND}, .catchRate = 45, .expYield = 210, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1}, .abilities = {ABILITY_TORRENT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_POOCHYENA] = { .baseHP = 35, .baseAttack = 55, .baseDefense = 35, .baseSpeed = 35, .baseSpAttack = 30, .baseSpDefense = 30, .types = {TYPE_DARK, TYPE_DARK}, .catchRate = 255, .expYield = 55, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_PECHA_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_RUN_AWAY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_MIGHTYENA] = { .baseHP = 70, .baseAttack = 90, .baseDefense = 70, .baseSpeed = 70, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_DARK, TYPE_DARK}, .catchRate = 127, .expYield = 128, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_PECHA_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_ZIGZAGOON] = { .baseHP = 38, .baseAttack = 30, .baseDefense = 41, .baseSpeed = 60, .baseSpAttack = 30, .baseSpDefense = 41, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 255, .expYield = 60, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_ORAN_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_PICKUP, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_LINOONE] = { .baseHP = 78, .baseAttack = 70, .baseDefense = 61, .baseSpeed = 100, .baseSpAttack = 50, .baseSpDefense = 61, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 90, .expYield = 128, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_ORAN_BERRY, .itemRare = ITEM_SITRUS_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_PICKUP, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_WURMPLE] = { .baseHP = 45, .baseAttack = 45, .baseDefense = 35, .baseSpeed = 20, .baseSpAttack = 20, .baseSpDefense = 30, .types = {TYPE_BUG, TYPE_BUG}, .catchRate = 255, .expYield = 54, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_SILCOON] = { .baseHP = 50, .baseAttack = 35, .baseDefense = 55, .baseSpeed = 15, .baseSpAttack = 25, .baseSpDefense = 25, .types = {TYPE_BUG, TYPE_BUG}, .catchRate = 120, .expYield = 71, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_BEAUTIFLY] = { .baseHP = 60, .baseAttack = 70, .baseDefense = 50, .baseSpeed = 65, .baseSpAttack = 90, .baseSpDefense = 50, .types = {TYPE_BUG, TYPE_FLYING}, .catchRate = 45, .expYield = 161, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SILVER_POWDER, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SWARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_CASCOON] = { .baseHP = 50, .baseAttack = 35, .baseDefense = 55, .baseSpeed = 15, .baseSpAttack = 25, .baseSpDefense = 25, .types = {TYPE_BUG, TYPE_BUG}, .catchRate = 120, .expYield = 72, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_DUSTOX] = { .baseHP = 60, .baseAttack = 50, .baseDefense = 70, .baseSpeed = 65, .baseSpAttack = 50, .baseSpDefense = 90, .types = {TYPE_BUG, TYPE_POISON}, .catchRate = 45, .expYield = 160, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_SILVER_POWDER, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_LOTAD] = { .baseHP = 40, .baseAttack = 30, .baseDefense = 30, .baseSpeed = 30, .baseSpAttack = 40, .baseSpDefense = 50, .types = {TYPE_WATER, TYPE_GRASS}, .catchRate = 255, .expYield = 74, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_GRASS}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_LOMBRE] = { .baseHP = 60, .baseAttack = 50, .baseDefense = 50, .baseSpeed = 50, .baseSpAttack = 60, .baseSpDefense = 70, .types = {TYPE_WATER, TYPE_GRASS}, .catchRate = 120, .expYield = 141, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_GRASS}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_LUDICOLO] = { .baseHP = 80, .baseAttack = 70, .baseDefense = 70, .baseSpeed = 70, .baseSpAttack = 90, .baseSpDefense = 100, .types = {TYPE_WATER, TYPE_GRASS}, .catchRate = 45, .expYield = 181, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_GRASS}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_SEEDOT] = { .baseHP = 40, .baseAttack = 40, .baseDefense = 50, .baseSpeed = 30, .baseSpAttack = 30, .baseSpDefense = 30, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 255, .expYield = 74, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_NUZLEAF] = { .baseHP = 70, .baseAttack = 70, .baseDefense = 40, .baseSpeed = 60, .baseSpAttack = 60, .baseSpDefense = 40, .types = {TYPE_GRASS, TYPE_DARK}, .catchRate = 120, .expYield = 141, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_SHIFTRY] = { .baseHP = 90, .baseAttack = 100, .baseDefense = 60, .baseSpeed = 80, .baseSpAttack = 90, .baseSpDefense = 60, .types = {TYPE_GRASS, TYPE_DARK}, .catchRate = 45, .expYield = 181, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_NINCADA] = { .baseHP = 31, .baseAttack = 45, .baseDefense = 90, .baseSpeed = 40, .baseSpAttack = 30, .baseSpDefense = 30, .types = {TYPE_BUG, TYPE_GROUND}, .catchRate = 255, .expYield = 65, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_COMPOUND_EYES, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_NINJASK] = { .baseHP = 61, .baseAttack = 90, .baseDefense = 45, .baseSpeed = 160, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_BUG, TYPE_FLYING}, .catchRate = 120, .expYield = 155, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_SPEED_BOOST, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_SHEDINJA] = { .baseHP = 1, .baseAttack = 90, .baseDefense = 45, .baseSpeed = 40, .baseSpAttack = 30, .baseSpDefense = 30, .types = {TYPE_BUG, TYPE_GHOST}, .catchRate = 45, .expYield = 95, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_WONDER_GUARD, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_TAILLOW] = { .baseHP = 40, .baseAttack = 55, .baseDefense = 30, .baseSpeed = 85, .baseSpAttack = 30, .baseSpDefense = 30, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 200, .expYield = 59, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_GUTS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SWELLOW] = { .baseHP = 60, .baseAttack = 85, .baseDefense = 60, .baseSpeed = 125, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 45, .expYield = 162, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING}, .abilities = {ABILITY_GUTS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SHROOMISH] = { .baseHP = 60, .baseAttack = 40, .baseDefense = 60, .baseSpeed = 35, .baseSpAttack = 40, .baseSpDefense = 60, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 255, .expYield = 65, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS}, .abilities = {ABILITY_EFFECT_SPORE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_BRELOOM] = { .baseHP = 60, .baseAttack = 130, .baseDefense = 80, .baseSpeed = 70, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_GRASS, TYPE_FIGHTING}, .catchRate = 90, .expYield = 165, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS}, .abilities = {ABILITY_EFFECT_SPORE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_SPINDA] = { .baseHP = 60, .baseAttack = 60, .baseDefense = 60, .baseSpeed = 60, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 255, .expYield = 85, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_CHESTO_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_OWN_TEMPO, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = TRUE, }, [SPECIES_WINGULL] = { .baseHP = 40, .baseAttack = 30, .baseDefense = 30, .baseSpeed = 85, .baseSpAttack = 55, .baseSpDefense = 30, .types = {TYPE_WATER, TYPE_FLYING}, .catchRate = 190, .expYield = 64, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FLYING}, .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_PELIPPER] = { .baseHP = 60, .baseAttack = 50, .baseDefense = 100, .baseSpeed = 65, .baseSpAttack = 85, .baseSpDefense = 70, .types = {TYPE_WATER, TYPE_FLYING}, .catchRate = 45, .expYield = 164, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FLYING}, .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_SURSKIT] = { .baseHP = 40, .baseAttack = 30, .baseDefense = 32, .baseSpeed = 65, .baseSpAttack = 50, .baseSpDefense = 52, .types = {TYPE_BUG, TYPE_WATER}, .catchRate = 200, .expYield = 63, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_BUG}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_MASQUERAIN] = { .baseHP = 70, .baseAttack = 60, .baseDefense = 62, .baseSpeed = 60, .baseSpAttack = 80, .baseSpDefense = 82, .types = {TYPE_BUG, TYPE_FLYING}, .catchRate = 75, .expYield = 128, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_SILVER_POWDER, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_BUG}, .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_WAILMER] = { .baseHP = 130, .baseAttack = 70, .baseDefense = 35, .baseSpeed = 60, .baseSpAttack = 70, .baseSpDefense = 35, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 125, .expYield = 137, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_WATER_2}, .abilities = {ABILITY_WATER_VEIL, ABILITY_OBLIVIOUS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_WAILORD] = { .baseHP = 170, .baseAttack = 90, .baseDefense = 45, .baseSpeed = 60, .baseSpAttack = 90, .baseSpDefense = 45, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 60, .expYield = 206, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_WATER_2}, .abilities = {ABILITY_WATER_VEIL, ABILITY_OBLIVIOUS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SKITTY] = { .baseHP = 50, .baseAttack = 45, .baseDefense = 45, .baseSpeed = 50, .baseSpAttack = 35, .baseSpDefense = 35, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 255, .expYield = 65, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_LEPPA_BERRY, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_DELCATTY] = { .baseHP = 70, .baseAttack = 65, .baseDefense = 65, .baseSpeed = 70, .baseSpAttack = 55, .baseSpDefense = 55, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 60, .expYield = 138, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_LEPPA_BERRY, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_KECLEON] = { .baseHP = 60, .baseAttack = 90, .baseDefense = 70, .baseSpeed = 40, .baseSpAttack = 60, .baseSpDefense = 120, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 200, .expYield = 132, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_PERSIM_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_COLOR_CHANGE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_BALTOY] = { .baseHP = 40, .baseAttack = 40, .baseDefense = 55, .baseSpeed = 55, .baseSpAttack = 40, .baseSpDefense = 70, .types = {TYPE_GROUND, TYPE_PSYCHIC}, .catchRate = 255, .expYield = 58, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_CLAYDOL] = { .baseHP = 60, .baseAttack = 70, .baseDefense = 105, .baseSpeed = 75, .baseSpAttack = 70, .baseSpDefense = 120, .types = {TYPE_GROUND, TYPE_PSYCHIC}, .catchRate = 90, .expYield = 189, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_NOSEPASS] = { .baseHP = 30, .baseAttack = 45, .baseDefense = 135, .baseSpeed = 30, .baseSpAttack = 45, .baseSpDefense = 90, .types = {TYPE_ROCK, TYPE_ROCK}, .catchRate = 255, .expYield = 108, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_STURDY, ABILITY_MAGNET_PULL}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_TORKOAL] = { .baseHP = 70, .baseAttack = 85, .baseDefense = 140, .baseSpeed = 20, .baseSpAttack = 85, .baseSpDefense = 70, .types = {TYPE_FIRE, TYPE_FIRE}, .catchRate = 90, .expYield = 161, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_WHITE_SMOKE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_SABLEYE] = { .baseHP = 50, .baseAttack = 75, .baseDefense = 75, .baseSpeed = 50, .baseSpAttack = 65, .baseSpDefense = 65, .types = {TYPE_DARK, TYPE_GHOST}, .catchRate = 45, .expYield = 98, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 35, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_BARBOACH] = { .baseHP = 50, .baseAttack = 48, .baseDefense = 43, .baseSpeed = 60, .baseSpAttack = 46, .baseSpDefense = 41, .types = {TYPE_WATER, TYPE_GROUND}, .catchRate = 190, .expYield = 92, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_WHISCASH] = { .baseHP = 110, .baseAttack = 78, .baseDefense = 73, .baseSpeed = 60, .baseSpAttack = 76, .baseSpDefense = 71, .types = {TYPE_WATER, TYPE_GROUND}, .catchRate = 75, .expYield = 158, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_LUVDISC] = { .baseHP = 43, .baseAttack = 30, .baseDefense = 55, .baseSpeed = 97, .baseSpAttack = 40, .baseSpDefense = 65, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 225, .expYield = 110, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_HEART_SCALE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_CORPHISH] = { .baseHP = 43, .baseAttack = 80, .baseDefense = 65, .baseSpeed = 35, .baseSpAttack = 50, .baseSpDefense = 35, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 205, .expYield = 111, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3}, .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_CRAWDAUNT] = { .baseHP = 63, .baseAttack = 120, .baseDefense = 85, .baseSpeed = 55, .baseSpAttack = 90, .baseSpDefense = 55, .types = {TYPE_WATER, TYPE_DARK}, .catchRate = 155, .expYield = 161, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3}, .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_FEEBAS] = { .baseHP = 20, .baseAttack = 15, .baseDefense = 20, .baseSpeed = 80, .baseSpAttack = 10, .baseSpDefense = 55, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 255, .expYield = 61, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_MILOTIC] = { .baseHP = 95, .baseAttack = 60, .baseDefense = 79, .baseSpeed = 81, .baseSpAttack = 100, .baseSpDefense = 125, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 60, .expYield = 213, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON}, .abilities = {ABILITY_MARVEL_SCALE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_CARVANHA] = { .baseHP = 45, .baseAttack = 90, .baseDefense = 20, .baseSpeed = 65, .baseSpAttack = 65, .baseSpDefense = 20, .types = {TYPE_WATER, TYPE_DARK}, .catchRate = 225, .expYield = 88, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_ROUGH_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_SHARPEDO] = { .baseHP = 70, .baseAttack = 120, .baseDefense = 40, .baseSpeed = 95, .baseSpAttack = 95, .baseSpDefense = 40, .types = {TYPE_WATER, TYPE_DARK}, .catchRate = 60, .expYield = 175, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2}, .abilities = {ABILITY_ROUGH_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_TRAPINCH] = { .baseHP = 45, .baseAttack = 100, .baseDefense = 45, .baseSpeed = 10, .baseSpAttack = 45, .baseSpDefense = 45, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 255, .expYield = 73, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SOFT_SAND, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_HYPER_CUTTER, ABILITY_ARENA_TRAP}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_VIBRAVA] = { .baseHP = 50, .baseAttack = 70, .baseDefense = 50, .baseSpeed = 70, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_GROUND, TYPE_DRAGON}, .catchRate = 120, .expYield = 126, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_LEVITATE, ABILITY_LEVITATE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_FLYGON] = { .baseHP = 80, .baseAttack = 100, .baseDefense = 80, .baseSpeed = 100, .baseSpAttack = 80, .baseSpDefense = 80, .types = {TYPE_GROUND, TYPE_DRAGON}, .catchRate = 45, .expYield = 197, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG}, .abilities = {ABILITY_LEVITATE, ABILITY_LEVITATE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_MAKUHITA] = { .baseHP = 72, .baseAttack = 60, .baseDefense = 30, .baseSpeed = 25, .baseSpAttack = 20, .baseSpDefense = 30, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 180, .expYield = 87, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_THICK_FAT, ABILITY_GUTS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_HARIYAMA] = { .baseHP = 144, .baseAttack = 120, .baseDefense = 60, .baseSpeed = 50, .baseSpAttack = 40, .baseSpDefense = 60, .types = {TYPE_FIGHTING, TYPE_FIGHTING}, .catchRate = 200, .expYield = 184, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_KINGS_ROCK, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_THICK_FAT, ABILITY_GUTS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_ELECTRIKE] = { .baseHP = 40, .baseAttack = 45, .baseDefense = 40, .baseSpeed = 65, .baseSpAttack = 65, .baseSpDefense = 40, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 120, .expYield = 104, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_STATIC, ABILITY_LIGHTNING_ROD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_MANECTRIC] = { .baseHP = 70, .baseAttack = 75, .baseDefense = 60, .baseSpeed = 105, .baseSpAttack = 105, .baseSpDefense = 60, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 45, .expYield = 168, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_STATIC, ABILITY_LIGHTNING_ROD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_NUMEL] = { .baseHP = 60, .baseAttack = 60, .baseDefense = 40, .baseSpeed = 35, .baseSpAttack = 65, .baseSpDefense = 45, .types = {TYPE_FIRE, TYPE_GROUND}, .catchRate = 255, .expYield = 88, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_RAWST_BERRY, .itemRare = ITEM_RAWST_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_CAMERUPT] = { .baseHP = 70, .baseAttack = 100, .baseDefense = 70, .baseSpeed = 40, .baseSpAttack = 105, .baseSpDefense = 75, .types = {TYPE_FIRE, TYPE_GROUND}, .catchRate = 150, .expYield = 175, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_RAWST_BERRY, .itemRare = ITEM_RAWST_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_MAGMA_ARMOR, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_SPHEAL] = { .baseHP = 70, .baseAttack = 40, .baseDefense = 50, .baseSpeed = 25, .baseSpAttack = 55, .baseSpDefense = 50, .types = {TYPE_ICE, TYPE_WATER}, .catchRate = 255, .expYield = 75, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_THICK_FAT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SEALEO] = { .baseHP = 90, .baseAttack = 60, .baseDefense = 70, .baseSpeed = 45, .baseSpAttack = 75, .baseSpDefense = 70, .types = {TYPE_ICE, TYPE_WATER}, .catchRate = 120, .expYield = 128, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_THICK_FAT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_WALREIN] = { .baseHP = 110, .baseAttack = 80, .baseDefense = 90, .baseSpeed = 65, .baseSpAttack = 95, .baseSpDefense = 90, .types = {TYPE_ICE, TYPE_WATER}, .catchRate = 45, .expYield = 192, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD}, .abilities = {ABILITY_THICK_FAT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_CACNEA] = { .baseHP = 50, .baseAttack = 85, .baseDefense = 40, .baseSpeed = 35, .baseSpAttack = 85, .baseSpDefense = 40, .types = {TYPE_GRASS, TYPE_GRASS}, .catchRate = 190, .expYield = 97, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_POISON_BARB, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_CACTURNE] = { .baseHP = 70, .baseAttack = 115, .baseDefense = 60, .baseSpeed = 55, .baseSpAttack = 115, .baseSpDefense = 60, .types = {TYPE_GRASS, TYPE_DARK}, .catchRate = 60, .expYield = 177, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_POISON_BARB, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_SNORUNT] = { .baseHP = 50, .baseAttack = 50, .baseDefense = 50, .baseSpeed = 50, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_ICE, TYPE_ICE}, .catchRate = 190, .expYield = 74, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_MINERAL}, .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_GLALIE] = { .baseHP = 80, .baseAttack = 80, .baseDefense = 80, .baseSpeed = 80, .baseSpAttack = 80, .baseSpDefense = 80, .types = {TYPE_ICE, TYPE_ICE}, .catchRate = 75, .expYield = 187, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NEVER_MELT_ICE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_MINERAL}, .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_LUNATONE] = { .baseHP = 70, .baseAttack = 55, .baseDefense = 65, .baseSpeed = 70, .baseSpAttack = 95, .baseSpDefense = 85, .types = {TYPE_ROCK, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 150, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_MOON_STONE, .genderRatio = MON_GENDERLESS, .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_SOLROCK] = { .baseHP = 70, .baseAttack = 95, .baseDefense = 85, .baseSpeed = 70, .baseSpAttack = 55, .baseSpDefense = 65, .types = {TYPE_ROCK, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 150, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SUN_STONE, .genderRatio = MON_GENDERLESS, .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_AZURILL] = { .baseHP = 50, .baseAttack = 20, .baseDefense = 40, .baseSpeed = 20, .baseSpAttack = 20, .baseSpDefense = 40, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 150, .expYield = 33, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 10, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_THICK_FAT, ABILITY_HUGE_POWER}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SPOINK] = { .baseHP = 60, .baseAttack = 25, .baseDefense = 35, .baseSpeed = 60, .baseSpAttack = 70, .baseSpDefense = 80, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 255, .expYield = 89, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_THICK_FAT, ABILITY_OWN_TEMPO}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_GRUMPIG] = { .baseHP = 80, .baseAttack = 45, .baseDefense = 65, .baseSpeed = 80, .baseSpAttack = 90, .baseSpDefense = 110, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 60, .expYield = 164, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_THICK_FAT, ABILITY_OWN_TEMPO}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_PLUSLE] = { .baseHP = 60, .baseAttack = 50, .baseDefense = 40, .baseSpeed = 95, .baseSpAttack = 85, .baseSpDefense = 75, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 200, .expYield = 120, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, .abilities = {ABILITY_PLUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_MINUN] = { .baseHP = 60, .baseAttack = 40, .baseDefense = 50, .baseSpeed = 95, .baseSpAttack = 75, .baseSpDefense = 85, .types = {TYPE_ELECTRIC, TYPE_ELECTRIC}, .catchRate = 200, .expYield = 120, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY}, .abilities = {ABILITY_MINUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_MAWILE] = { .baseHP = 50, .baseAttack = 85, .baseDefense = 85, .baseSpeed = 50, .baseSpAttack = 55, .baseSpDefense = 55, .types = {TYPE_STEEL, TYPE_STEEL}, .catchRate = 45, .expYield = 98, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY}, .abilities = {ABILITY_HYPER_CUTTER, ABILITY_INTIMIDATE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_MEDITITE] = { .baseHP = 30, .baseAttack = 40, .baseDefense = 55, .baseSpeed = 60, .baseSpAttack = 40, .baseSpDefense = 55, .types = {TYPE_FIGHTING, TYPE_PSYCHIC}, .catchRate = 180, .expYield = 91, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_PURE_POWER, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_MEDICHAM] = { .baseHP = 60, .baseAttack = 60, .baseDefense = 75, .baseSpeed = 80, .baseSpAttack = 60, .baseSpDefense = 75, .types = {TYPE_FIGHTING, TYPE_PSYCHIC}, .catchRate = 90, .expYield = 153, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_PURE_POWER, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_SWABLU] = { .baseHP = 45, .baseAttack = 40, .baseDefense = 60, .baseSpeed = 50, .baseSpAttack = 40, .baseSpDefense = 75, .types = {TYPE_NORMAL, TYPE_FLYING}, .catchRate = 255, .expYield = 74, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_DRAGON}, .abilities = {ABILITY_NATURAL_CURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_ALTARIA] = { .baseHP = 75, .baseAttack = 70, .baseDefense = 90, .baseSpeed = 80, .baseSpAttack = 70, .baseSpDefense = 105, .types = {TYPE_DRAGON, TYPE_FLYING}, .catchRate = 45, .expYield = 188, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_DRAGON}, .abilities = {ABILITY_NATURAL_CURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_WYNAUT] = { .baseHP = 95, .baseAttack = 23, .baseDefense = 48, .baseSpeed = 23, .baseSpAttack = 23, .baseSpDefense = 48, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 125, .expYield = 44, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_SHADOW_TAG, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_DUSKULL] = { .baseHP = 20, .baseAttack = 40, .baseDefense = 90, .baseSpeed = 25, .baseSpAttack = 30, .baseSpDefense = 90, .types = {TYPE_GHOST, TYPE_GHOST}, .catchRate = 190, .expYield = 97, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_SPELL_TAG, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 35, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_DUSCLOPS] = { .baseHP = 40, .baseAttack = 70, .baseDefense = 130, .baseSpeed = 25, .baseSpAttack = 60, .baseSpDefense = 130, .types = {TYPE_GHOST, TYPE_GHOST}, .catchRate = 90, .expYield = 179, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_SPELL_TAG, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 35, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_ROSELIA] = { .baseHP = 50, .baseAttack = 60, .baseDefense = 45, .baseSpeed = 65, .baseSpAttack = 100, .baseSpDefense = 80, .types = {TYPE_GRASS, TYPE_POISON}, .catchRate = 150, .expYield = 152, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_POISON_BARB, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS}, .abilities = {ABILITY_NATURAL_CURE, ABILITY_POISON_POINT}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = TRUE, }, [SPECIES_SLAKOTH] = { .baseHP = 60, .baseAttack = 60, .baseDefense = 60, .baseSpeed = 30, .baseSpAttack = 35, .baseSpDefense = 35, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 255, .expYield = 83, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_TRUANT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_VIGOROTH] = { .baseHP = 80, .baseAttack = 80, .baseDefense = 80, .baseSpeed = 90, .baseSpAttack = 55, .baseSpDefense = 55, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 120, .expYield = 126, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 2, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_VITAL_SPIRIT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_SLAKING] = { .baseHP = 150, .baseAttack = 160, .baseDefense = 100, .baseSpeed = 100, .baseSpAttack = 95, .baseSpDefense = 65, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 210, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_TRUANT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_GULPIN] = { .baseHP = 70, .baseAttack = 43, .baseDefense = 53, .baseSpeed = 40, .baseSpAttack = 43, .baseSpDefense = 53, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 225, .expYield = 75, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_BIG_PEARL, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LIQUID_OOZE, ABILITY_STICKY_HOLD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_SWALOT] = { .baseHP = 100, .baseAttack = 73, .baseDefense = 83, .baseSpeed = 55, .baseSpAttack = 73, .baseSpDefense = 83, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 75, .expYield = 168, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_BIG_PEARL, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LIQUID_OOZE, ABILITY_STICKY_HOLD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_TROPIUS] = { .baseHP = 99, .baseAttack = 68, .baseDefense = 83, .baseSpeed = 51, .baseSpAttack = 72, .baseSpDefense = 87, .types = {TYPE_GRASS, TYPE_FLYING}, .catchRate = 200, .expYield = 169, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS}, .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_WHISMUR] = { .baseHP = 64, .baseAttack = 51, .baseDefense = 23, .baseSpeed = 28, .baseSpAttack = 51, .baseSpDefense = 23, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 190, .expYield = 68, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_CHESTO_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_SOUNDPROOF, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_LOUDRED] = { .baseHP = 84, .baseAttack = 71, .baseDefense = 43, .baseSpeed = 48, .baseSpAttack = 71, .baseSpDefense = 43, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 120, .expYield = 126, .evYield_HP = 2, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_CHESTO_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_SOUNDPROOF, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_EXPLOUD] = { .baseHP = 104, .baseAttack = 91, .baseDefense = 63, .baseSpeed = 68, .baseSpAttack = 91, .baseSpDefense = 63, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 184, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_CHESTO_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD}, .abilities = {ABILITY_SOUNDPROOF, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_CLAMPERL] = { .baseHP = 35, .baseAttack = 64, .baseDefense = 85, .baseSpeed = 32, .baseSpAttack = 74, .baseSpDefense = 55, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 255, .expYield = 142, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_BLUE_SHARD, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1}, .abilities = {ABILITY_SHELL_ARMOR, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_HUNTAIL] = { .baseHP = 55, .baseAttack = 104, .baseDefense = 105, .baseSpeed = 52, .baseSpAttack = 94, .baseSpDefense = 75, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 60, .expYield = 178, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_GOREBYSS] = { .baseHP = 55, .baseAttack = 84, .baseDefense = 105, .baseSpeed = 52, .baseSpAttack = 114, .baseSpDefense = 75, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 60, .expYield = 178, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, .noFlip = FALSE, }, [SPECIES_ABSOL] = { .baseHP = 65, .baseAttack = 130, .baseDefense = 60, .baseSpeed = 75, .baseSpAttack = 75, .baseSpDefense = 60, .types = {TYPE_DARK, TYPE_DARK}, .catchRate = 30, .expYield = 174, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 35, .growthRate = GROWTH_MEDIUM_SLOW, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = TRUE, }, [SPECIES_SHUPPET] = { .baseHP = 44, .baseAttack = 75, .baseDefense = 35, .baseSpeed = 45, .baseSpAttack = 63, .baseSpDefense = 33, .types = {TYPE_GHOST, TYPE_GHOST}, .catchRate = 225, .expYield = 97, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SPELL_TAG, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 35, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_INSOMNIA, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_BANETTE] = { .baseHP = 64, .baseAttack = 115, .baseDefense = 65, .baseSpeed = 65, .baseSpAttack = 83, .baseSpDefense = 63, .types = {TYPE_GHOST, TYPE_GHOST}, .catchRate = 45, .expYield = 179, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_SPELL_TAG, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 35, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_INSOMNIA, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = FALSE, }, [SPECIES_SEVIPER] = { .baseHP = 73, .baseAttack = 100, .baseDefense = 60, .baseSpeed = 65, .baseSpAttack = 100, .baseSpDefense = 60, .types = {TYPE_POISON, TYPE_POISON}, .catchRate = 90, .expYield = 165, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_DRAGON}, .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, .noFlip = TRUE, }, [SPECIES_ZANGOOSE] = { .baseHP = 73, .baseAttack = 115, .baseDefense = 60, .baseSpeed = 90, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 90, .expYield = 165, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD}, .abilities = {ABILITY_IMMUNITY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = TRUE, }, [SPECIES_RELICANTH] = { .baseHP = 100, .baseAttack = 90, .baseDefense = 130, .baseSpeed = 55, .baseSpAttack = 45, .baseSpDefense = 65, .types = {TYPE_WATER, TYPE_ROCK}, .catchRate = 25, .expYield = 198, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_GREEN_SHARD, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 40, .friendship = 70, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_2}, .abilities = {ABILITY_SWIFT_SWIM, ABILITY_ROCK_HEAD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_ARON] = { .baseHP = 50, .baseAttack = 70, .baseDefense = 100, .baseSpeed = 30, .baseSpAttack = 40, .baseSpDefense = 40, .types = {TYPE_STEEL, TYPE_ROCK}, .catchRate = 180, .expYield = 96, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_HARD_STONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 35, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_STURDY, ABILITY_ROCK_HEAD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_LAIRON] = { .baseHP = 60, .baseAttack = 90, .baseDefense = 140, .baseSpeed = 40, .baseSpAttack = 50, .baseSpDefense = 50, .types = {TYPE_STEEL, TYPE_ROCK}, .catchRate = 90, .expYield = 152, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_HARD_STONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 35, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_STURDY, ABILITY_ROCK_HEAD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_AGGRON] = { .baseHP = 70, .baseAttack = 110, .baseDefense = 180, .baseSpeed = 50, .baseSpAttack = 60, .baseSpDefense = 60, .types = {TYPE_STEEL, TYPE_ROCK}, .catchRate = 45, .expYield = 205, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 3, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_HARD_STONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 35, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER}, .abilities = {ABILITY_STURDY, ABILITY_ROCK_HEAD}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_CASTFORM] = { .baseHP = 70, .baseAttack = 70, .baseDefense = 70, .baseSpeed = 70, .baseSpAttack = 70, .baseSpDefense = 70, .types = {TYPE_NORMAL, TYPE_NORMAL}, .catchRate = 45, .expYield = 145, .evYield_HP = 1, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_MYSTIC_WATER, .itemRare = ITEM_MYSTIC_WATER, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_FORECAST, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_VOLBEAT] = { .baseHP = 65, .baseAttack = 73, .baseDefense = 55, .baseSpeed = 85, .baseSpAttack = 47, .baseSpDefense = 75, .types = {TYPE_BUG, TYPE_BUG}, .catchRate = 150, .expYield = 146, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_ILLUMINATE, ABILITY_SWARM}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_ILLUMISE] = { .baseHP = 65, .baseAttack = 47, .baseDefense = 55, .baseSpeed = 85, .baseSpAttack = 73, .baseSpDefense = 75, .types = {TYPE_BUG, TYPE_BUG}, .catchRate = 150, .expYield = 146, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_FEMALE, .eggCycles = 15, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_HUMAN_LIKE}, .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_LILEEP] = { .baseHP = 66, .baseAttack = 41, .baseDefense = 77, .baseSpeed = 23, .baseSpAttack = 61, .baseSpDefense = 87, .types = {TYPE_ROCK, TYPE_GRASS}, .catchRate = 45, .expYield = 121, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 30, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_SUCTION_CUPS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, .noFlip = FALSE, }, [SPECIES_CRADILY] = { .baseHP = 86, .baseAttack = 81, .baseDefense = 97, .baseSpeed = 43, .baseSpAttack = 81, .baseSpDefense = 107, .types = {TYPE_ROCK, TYPE_GRASS}, .catchRate = 45, .expYield = 201, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 2, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 30, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_SUCTION_CUPS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_ANORITH] = { .baseHP = 45, .baseAttack = 95, .baseDefense = 50, .baseSpeed = 75, .baseSpAttack = 40, .baseSpDefense = 50, .types = {TYPE_ROCK, TYPE_BUG}, .catchRate = 45, .expYield = 119, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 30, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_BATTLE_ARMOR, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_ARMALDO] = { .baseHP = 75, .baseAttack = 125, .baseDefense = 100, .baseSpeed = 45, .baseSpAttack = 70, .baseSpDefense = 80, .types = {TYPE_ROCK, TYPE_BUG}, .catchRate = 45, .expYield = 200, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 30, .friendship = 70, .growthRate = GROWTH_ERRATIC, .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3}, .abilities = {ABILITY_BATTLE_ARMOR, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_RALTS] = { .baseHP = 28, .baseAttack = 25, .baseDefense = 25, .baseSpeed = 40, .baseSpAttack = 45, .baseSpDefense = 35, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 235, .expYield = 70, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_TRACE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_KIRLIA] = { .baseHP = 38, .baseAttack = 35, .baseDefense = 35, .baseSpeed = 50, .baseSpAttack = 65, .baseSpDefense = 55, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 120, .expYield = 140, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 2, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_TRACE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_GARDEVOIR] = { .baseHP = 68, .baseAttack = 65, .baseDefense = 65, .baseSpeed = 80, .baseSpAttack = 125, .baseSpDefense = 115, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 208, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_TRACE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_BAGON] = { .baseHP = 45, .baseAttack = 75, .baseDefense = 60, .baseSpeed = 50, .baseSpAttack = 40, .baseSpDefense = 30, .types = {TYPE_DRAGON, TYPE_DRAGON}, .catchRate = 45, .expYield = 89, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_DRAGON_SCALE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_DRAGON, EGG_GROUP_DRAGON}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_SHELGON] = { .baseHP = 65, .baseAttack = 95, .baseDefense = 100, .baseSpeed = 50, .baseSpAttack = 60, .baseSpDefense = 50, .types = {TYPE_DRAGON, TYPE_DRAGON}, .catchRate = 45, .expYield = 144, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_DRAGON_SCALE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_DRAGON, EGG_GROUP_DRAGON}, .abilities = {ABILITY_ROCK_HEAD, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, .noFlip = FALSE, }, [SPECIES_SALAMENCE] = { .baseHP = 95, .baseAttack = 135, .baseDefense = 80, .baseSpeed = 100, .baseSpAttack = 110, .baseSpDefense = 80, .types = {TYPE_DRAGON, TYPE_FLYING}, .catchRate = 45, .expYield = 218, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_DRAGON_SCALE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_DRAGON, EGG_GROUP_DRAGON}, .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_BELDUM] = { .baseHP = 40, .baseAttack = 55, .baseDefense = 80, .baseSpeed = 30, .baseSpAttack = 35, .baseSpDefense = 60, .types = {TYPE_STEEL, TYPE_PSYCHIC}, .catchRate = 3, .expYield = 103, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 1, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_METAL_COAT, .genderRatio = MON_GENDERLESS, .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_METANG] = { .baseHP = 60, .baseAttack = 75, .baseDefense = 100, .baseSpeed = 50, .baseSpAttack = 55, .baseSpDefense = 80, .types = {TYPE_STEEL, TYPE_PSYCHIC}, .catchRate = 3, .expYield = 153, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_METAL_COAT, .genderRatio = MON_GENDERLESS, .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_METAGROSS] = { .baseHP = 80, .baseAttack = 135, .baseDefense = 130, .baseSpeed = 70, .baseSpAttack = 95, .baseSpDefense = 90, .types = {TYPE_STEEL, TYPE_PSYCHIC}, .catchRate = 3, .expYield = 210, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 3, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_METAL_COAT, .genderRatio = MON_GENDERLESS, .eggCycles = 40, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL}, .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_REGIROCK] = { .baseHP = 80, .baseAttack = 100, .baseDefense = 200, .baseSpeed = 50, .baseSpAttack = 50, .baseSpDefense = 100, .types = {TYPE_ROCK, TYPE_ROCK}, .catchRate = 3, .expYield = 217, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 3, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, }, [SPECIES_REGICE] = { .baseHP = 80, .baseAttack = 50, .baseDefense = 100, .baseSpeed = 50, .baseSpAttack = 100, .baseSpDefense = 200, .types = {TYPE_ICE, TYPE_ICE}, .catchRate = 3, .expYield = 216, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_REGISTEEL] = { .baseHP = 80, .baseAttack = 75, .baseDefense = 150, .baseSpeed = 50, .baseSpAttack = 75, .baseSpDefense = 150, .types = {TYPE_STEEL, TYPE_STEEL}, .catchRate = 3, .expYield = 215, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 2, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, }, [SPECIES_KYOGRE] = { .baseHP = 100, .baseAttack = 100, .baseDefense = 90, .baseSpeed = 90, .baseSpAttack = 150, .baseSpDefense = 140, .types = {TYPE_WATER, TYPE_WATER}, .catchRate = 5, .expYield = 218, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_DRIZZLE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_GROUDON] = { .baseHP = 100, .baseAttack = 150, .baseDefense = 140, .baseSpeed = 90, .baseSpAttack = 100, .baseSpDefense = 90, .types = {TYPE_GROUND, TYPE_GROUND}, .catchRate = 5, .expYield = 218, .evYield_HP = 0, .evYield_Attack = 3, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_DROUGHT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_RAYQUAZA] = { .baseHP = 105, .baseAttack = 150, .baseDefense = 90, .baseSpeed = 95, .baseSpAttack = 150, .baseSpDefense = 90, .types = {TYPE_DRAGON, TYPE_FLYING}, .catchRate = 3, .expYield = 220, .evYield_HP = 0, .evYield_Attack = 2, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_AIR_LOCK, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, .noFlip = FALSE, }, [SPECIES_LATIAS] = { .baseHP = 80, .baseAttack = 80, .baseDefense = 90, .baseSpeed = 110, .baseSpAttack = 110, .baseSpDefense = 130, .types = {TYPE_DRAGON, TYPE_PSYCHIC}, .catchRate = 3, .expYield = 211, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 3, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_FEMALE, .eggCycles = 120, .friendship = 90, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = FALSE, }, [SPECIES_LATIOS] = { .baseHP = 80, .baseAttack = 90, .baseDefense = 80, .baseSpeed = 110, .baseSpAttack = 130, .baseSpDefense = 110, .types = {TYPE_DRAGON, TYPE_PSYCHIC}, .catchRate = 3, .expYield = 211, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 3, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_MALE, .eggCycles = 120, .friendship = 90, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, [SPECIES_JIRACHI] = { .baseHP = 100, .baseAttack = 100, .baseDefense = 100, .baseSpeed = 100, .baseSpAttack = 100, .baseSpDefense = 100, .types = {TYPE_STEEL, TYPE_PSYCHIC}, .catchRate = 3, .expYield = 215, .evYield_HP = 3, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, .itemCommon = ITEM_STAR_PIECE, .itemRare = ITEM_STAR_PIECE, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 100, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_SERENE_GRACE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, }, [SPECIES_DEOXYS] = { .baseHP = 50, .baseAttack = 150, .baseDefense = 50, .baseSpeed = 150, .baseSpAttack = 150, .baseSpDefense = 50, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 3, .expYield = 215, .evYield_HP = 0, .evYield_Attack = 1, .evYield_Defense = 0, .evYield_Speed = 1, .evYield_SpAttack = 1, .evYield_SpDefense = 0, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = MON_GENDERLESS, .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, .noFlip = TRUE, }, [SPECIES_CHIMECHO] = { .baseHP = 65, .baseAttack = 50, .baseDefense = 70, .baseSpeed = 65, .baseSpAttack = 95, .baseSpDefense = 80, .types = {TYPE_PSYCHIC, TYPE_PSYCHIC}, .catchRate = 45, .expYield = 147, .evYield_HP = 0, .evYield_Attack = 0, .evYield_Defense = 0, .evYield_Speed = 0, .evYield_SpAttack = 1, .evYield_SpDefense = 1, .itemCommon = ITEM_NONE, .itemRare = ITEM_NONE, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, .friendship = 70, .growthRate = GROWTH_FAST, .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS}, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, .noFlip = FALSE, }, }; ================================================ FILE: src/data/pokemon/tmhm_learnsets.h ================================================ //#define TMHM(moves) {(u32)(moves), ((u64)(moves) >> 32)} //#define TMHM) ((u64)1 << (ITEM_##tmhm - ITEM_TM01_FOCUS_PUNCH)) #define TMHM(tmhm) ((u8) ((ITEM_##tmhm) - ITEM_TM01_FOCUS_PUNCH)) // This table determines which TMs and HMs a species is capable of learning. // Each entry is a 64-bit bit array spread across two 32-bit values, with // each bit corresponding to a machine. static const u8 sNoneTMHMLearnset[] = { 0xFF }; static const u8 sBulbasaurTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sIvysaurTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sVenusaurTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sCharmanderTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM02_DRAGON_CLAW), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sCharmeleonTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM02_DRAGON_CLAW), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sCharizardTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM02_DRAGON_CLAW), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM47_STEEL_WING), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM02_FLY), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSquirtleTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sWartortleTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sBlastoiseTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sCaterpieTMHMLearnset[] = { 0xFF }; static const u8 sMetapodTMHMLearnset[] = { 0xFF }; static const u8 sButterfreeTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sWeedleTMHMLearnset[] = { 0xFF }; static const u8 sKakunaTMHMLearnset[] = { 0xFF }; static const u8 sBeedrillTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPidgeyTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sPidgeottoTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sPidgeotTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sRattataTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRaticateTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSpearowTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sFearowTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sEkansTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), 0xFF, }; static const u8 sArbokTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), 0xFF, }; static const u8 sPikachuTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRaichuTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSandshrewTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSandslashTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNidoranFTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNidorinaTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNidoqueenTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNidoranMTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNidorinoTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNidokingTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sClefairyTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sClefableTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sVulpixTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), 0xFF, }; static const u8 sNinetalesTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), 0xFF, }; static const u8 sJigglypuffTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sWigglytuffTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sZubatTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(TM49_SNATCH), 0xFF, }; static const u8 sGolbatTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(TM49_SNATCH), 0xFF, }; static const u8 sOddishTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sGloomTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sVileplumeTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sParasTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sParasectTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sVenonatTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sVenomothTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sDiglettTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sDugtrioTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMeowthTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sPersianTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sPsyduckTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sGolduckTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sMankeyTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPrimeapeTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sGrowlitheTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sArcanineTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPoliwagTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sPoliwhirlTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sPoliwrathTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sAbraTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sKadabraTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sAlakazamTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sMachopTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMachokeTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMachampTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sBellsproutTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sWeepinbellTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sVictreebelTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sTentacoolTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sTentacruelTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sGeodudeTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sGravelerTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sGolemTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPonytaTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), 0xFF, }; static const u8 sRapidashTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), 0xFF, }; static const u8 sSlowpokeTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM48_SKILL_SWAP), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSlowbroTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM48_SKILL_SWAP), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), TMHM(HM08_DIVE), 0xFF, }; static const u8 sMagnemiteTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM05_FLASH), 0xFF, }; static const u8 sMagnetonTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM05_FLASH), 0xFF, }; static const u8 sFarfetchdTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM02_FLY), 0xFF, }; static const u8 sDoduoTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sDodrioTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sSeelTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sDewgongTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sGrimerTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), 0xFF, }; static const u8 sMukTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sShellderTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM08_DIVE), 0xFF, }; static const u8 sCloysterTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM08_DIVE), 0xFF, }; static const u8 sGastlyTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), 0xFF, }; static const u8 sHaunterTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), 0xFF, }; static const u8 sGengarTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sOnixTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sDrowzeeTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sHypnoTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sKrabbyTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM08_DIVE), 0xFF, }; static const u8 sKinglerTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM08_DIVE), 0xFF, }; static const u8 sVoltorbTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM12_TAUNT), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sElectrodeTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sExeggcuteTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sExeggutorTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sCuboneTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMarowakTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sHitmonleeTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sHitmonchanTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sLickitungTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sKoffingTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sWeezingTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sRhyhornTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRhydonTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sChanseyTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTangelaTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sKangaskhanTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sHorseaTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSeadraTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sGoldeenTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSeakingTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sStaryuTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM03_SURF), TMHM(HM05_FLASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sStarmieTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM48_SKILL_SWAP), TMHM(HM03_SURF), TMHM(HM05_FLASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sMrmimeTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sScytherTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sJynxTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sElectabuzzTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMagmarTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPinsirTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTaurosTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMagikarpTMHMLearnset[] = { 0xFF }; static const u8 sGyaradosTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sLaprasTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sDittoTMHMLearnset[] = { 0xFF }; static const u8 sEeveeTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), 0xFF, }; static const u8 sVaporeonTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sJolteonTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sFlareonTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), 0xFF, }; static const u8 sPorygonTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sOmanyteTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sOmastarTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sKabutoTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), 0xFF, }; static const u8 sKabutopsTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sAerodactylTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSnorlaxTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), 0xFF, }; static const u8 sArticunoTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sZapdosTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMoltresTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM47_STEEL_WING), TMHM(TM50_OVERHEAT), TMHM(HM02_FLY), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sDratiniTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), 0xFF, }; static const u8 sDragonairTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), 0xFF, }; static const u8 sDragoniteTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM02_DRAGON_CLAW), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM02_FLY), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sMewtwoTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMewTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM02_DRAGON_CLAW), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM08_BULK_UP), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM02_FLY), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sChikoritaTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sBayleefTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMeganiumTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sCyndaquilTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), 0xFF, }; static const u8 sQuilavaTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTyphlosionTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTotodileTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sCroconawTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sFeraligatrTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM02_DRAGON_CLAW), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSentretTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), 0xFF, }; static const u8 sFurretTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sHoothootTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM05_FLASH), 0xFF, }; static const u8 sNoctowlTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM05_FLASH), 0xFF, }; static const u8 sLedybaTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sLedianTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sSpinarakTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sAriadosTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sCrobatTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(TM49_SNATCH), TMHM(HM02_FLY), 0xFF, }; static const u8 sChinchouTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM05_FLASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sLanturnTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM05_FLASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sPichuTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sCleffaTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sIgglybuffTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sTogepiTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTogeticTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNatuTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sXatuTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(TM48_SKILL_SWAP), TMHM(HM02_FLY), TMHM(HM05_FLASH), 0xFF, }; static const u8 sMareepTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sFlaaffyTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sAmpharosTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sBellossomTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sMarillTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sAzumarillTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSudowoodoTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPolitoedTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sHoppipTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sSkiploomTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sJumpluffTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sAipomTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSunkernTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sSunfloraTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sYanmaTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM05_FLASH), 0xFF, }; static const u8 sWooperTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sQuagsireTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sEspeonTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM48_SKILL_SWAP), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sUmbreonTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sMurkrowTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(TM49_SNATCH), TMHM(HM02_FLY), 0xFF, }; static const u8 sSlowkingTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM48_SKILL_SWAP), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), TMHM(HM08_DIVE), 0xFF, }; static const u8 sMisdreavusTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sUnownTMHMLearnset[] = { 0xFF, }; static const u8 sWobbuffetTMHMLearnset[] = { 0xFF, }; static const u8 sGirafarigTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPinecoTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sForretressTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sDunsparceTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sGligarTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSteelixTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSnubbullTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sGranbullTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sQwilfishTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sScizorTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sShuckleTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sHeracrossTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSneaselTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTeddiursaTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sUrsaringTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSlugmaTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMagcargoTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSwinubTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPiloswineTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sCorsolaTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRemoraidTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sOctilleryTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sDelibirdTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM02_FLY), 0xFF, }; static const u8 sMantineTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSkarmoryTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM02_FLY), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sHoundourTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(TM50_OVERHEAT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sHoundoomTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sKingdraTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sPhanpyTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sDonphanTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPorygon2TMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sStantlerTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sSmeargleTMHMLearnset[] = { 0xFF }; static const u8 sTyrogueTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sHitmontopTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSmoochumTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sElekidTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMagbyTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMiltankTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sBlisseyTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRaikouTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sEnteiTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSuicuneTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sLarvitarTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sPupitarTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTyranitarTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM02_DRAGON_CLAW), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sLugiaTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM47_STEEL_WING), TMHM(TM48_SKILL_SWAP), TMHM(HM02_FLY), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sHoOhTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM47_STEEL_WING), TMHM(TM50_OVERHEAT), TMHM(HM02_FLY), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sCelebiTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM48_SKILL_SWAP), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sTreeckoTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sGrovyleTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSceptileTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM02_DRAGON_CLAW), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTorchicTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sCombuskenTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sBlazikenTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMudkipTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sMarshtompTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSwampertTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sPoochyenaTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMightyenaTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sZigzagoonTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sLinooneTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sWurmpleTMHMLearnset[] = { 0xFF }; static const u8 sSilcoonTMHMLearnset[] = { 0xFF }; static const u8 sBeautiflyTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sCascoonTMHMLearnset[] = { 0xFF }; static const u8 sDustoxTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sLotadTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sLombreTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sLudicoloTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSeedotTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNuzleafTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sShiftryTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNincadaTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sNinjaskTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sShedinjaTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM46_THIEF), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sTaillowTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sSwellowTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sShroomishTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sBreloomTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSpindaTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sWingullTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sPelipperTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM03_SURF), 0xFF, }; static const u8 sSurskitTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sMasquerainTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sWailmerTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sWailordTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSkittyTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sDelcattyTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sKecleonTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sBaltoyTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sClaydolTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM48_SKILL_SWAP), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sNosepassTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTorkoalTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSableyeTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sBarboachTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sWhiscashTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sLuvdiscTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sCorphishTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), 0xFF, }; static const u8 sCrawdauntTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sFeebasTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sMiloticTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sCarvanhaTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSharpedoTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sTrapinchTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sVibravaTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sFlygonTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMakuhitaTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sHariyamaTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sElectrikeTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sManectricTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sNumelTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sCameruptTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSphealTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sSealeoTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sWalreinTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sCacneaTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sCacturneTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sSnoruntTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sGlalieTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sLunatoneTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sSolrockTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM48_SKILL_SWAP), TMHM(TM50_OVERHEAT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sAzurillTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), 0xFF, }; static const u8 sSpoinkTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sGrumpigTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sPlusleTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sMinunTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sMawileTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMedititeTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMedichamTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSwabluTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), 0xFF, }; static const u8 sAltariaTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM47_STEEL_WING), TMHM(HM02_FLY), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sWynautTMHMLearnset[] = { 0xFF }; static const u8 sDuskullTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sDusclopsTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRoseliaTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM05_FLASH), 0xFF, }; static const u8 sSlakothTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sVigorothTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSlakingTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sGulpinTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSwalotTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sTropiusTMHMLearnset[] = { TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM02_FLY), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sWhismurTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), 0xFF, }; static const u8 sLoudredTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sExploudTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM50_OVERHEAT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sClamperlTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sHuntailTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM49_SNATCH), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sGorebyssTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sAbsolTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sShuppetTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sBanetteTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sSeviperTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM36_SLUDGE_BOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM49_SNATCH), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sZangooseTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRelicanthTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM03_SURF), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sAronTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sLaironTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sAggronTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM02_DRAGON_CLAW), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sCastformTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sVolbeatTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sIllumiseTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(HM05_FLASH), 0xFF, }; static const u8 sLileepTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), 0xFF, }; static const u8 sCradilyTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM09_BULLET_SEED), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM19_GIGA_DRAIN), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM32_DOUBLE_TEAM), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sAnorithTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sArmaldoTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRaltsTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sKirliaTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sGardevoirTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM46_THIEF), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; static const u8 sBagonTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sShelgonTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sSalamenceTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM23_IRON_TAIL), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM35_FLAMETHROWER), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM02_FLY), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sBeldumTMHMLearnset[] = { 0xFF }; static const u8 sMetangTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sMetagrossTMHMLearnset[] = { TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM36_SLUDGE_BOMB), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRegirockTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRegiceTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRegisteelTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sKyogreTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM07_HAIL), TMHM(TM10_HIDDEN_POWER), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM39_ROCK_TOMB), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sGroudonTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM28_DIG), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM50_OVERHEAT), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sRayquazaTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM03_WATER_PULSE), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM08_BULK_UP), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM14_BLIZZARD), TMHM(TM15_HYPER_BEAM), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM23_IRON_TAIL), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM34_SHOCK_WAVE), TMHM(TM35_FLAMETHROWER), TMHM(TM37_SANDSTORM), TMHM(TM38_FIRE_BLAST), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM50_OVERHEAT), TMHM(HM02_FLY), TMHM(HM03_SURF), TMHM(HM04_STRENGTH), TMHM(HM06_ROCK_SMASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sLatiasTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM02_FLY), TMHM(HM03_SURF), TMHM(HM05_FLASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sLatiosTMHMLearnset[] = { TMHM(TM02_DRAGON_CLAW), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM05_ROAR), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM13_ICE_BEAM), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM26_EARTHQUAKE), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM47_STEEL_WING), TMHM(HM01_CUT), TMHM(HM02_FLY), TMHM(HM03_SURF), TMHM(HM05_FLASH), TMHM(HM07_WATERFALL), TMHM(HM08_DIVE), 0xFF, }; static const u8 sJirachiTMHMLearnset[] = { TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM37_SANDSTORM), TMHM(TM40_AERIAL_ACE), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM48_SKILL_SWAP), TMHM(HM05_FLASH), 0xFF, }; static const u8 sDeoxysTMHMLearnset[] = { TMHM(TM01_FOCUS_PUNCH), TMHM(TM03_WATER_PULSE), TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM13_ICE_BEAM), TMHM(TM15_HYPER_BEAM), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM22_SOLAR_BEAM), TMHM(TM24_THUNDERBOLT), TMHM(TM25_THUNDER), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM31_BRICK_BREAK), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM39_ROCK_TOMB), TMHM(TM40_AERIAL_ACE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM01_CUT), TMHM(HM04_STRENGTH), TMHM(HM05_FLASH), TMHM(HM06_ROCK_SMASH), 0xFF, }; static const u8 sChimechoTMHMLearnset[] = { TMHM(TM04_CALM_MIND), TMHM(TM06_TOXIC), TMHM(TM10_HIDDEN_POWER), TMHM(TM11_SUNNY_DAY), TMHM(TM12_TAUNT), TMHM(TM16_LIGHT_SCREEN), TMHM(TM17_PROTECT), TMHM(TM18_RAIN_DANCE), TMHM(TM20_SAFEGUARD), TMHM(TM21_FRUSTRATION), TMHM(TM27_RETURN), TMHM(TM29_PSYCHIC), TMHM(TM30_SHADOW_BALL), TMHM(TM32_DOUBLE_TEAM), TMHM(TM33_REFLECT), TMHM(TM34_SHOCK_WAVE), TMHM(TM41_TORMENT), TMHM(TM42_FACADE), TMHM(TM43_SECRET_POWER), TMHM(TM44_REST), TMHM(TM45_ATTRACT), TMHM(TM48_SKILL_SWAP), TMHM(TM49_SNATCH), TMHM(HM05_FLASH), 0xFF, }; const u8 *const gTMHMLearnsets[] = { [SPECIES_NONE] = sBulbasaurTMHMLearnset, [SPECIES_BULBASAUR] = sBulbasaurTMHMLearnset, [SPECIES_IVYSAUR] = sIvysaurTMHMLearnset, [SPECIES_VENUSAUR] = sVenusaurTMHMLearnset, [SPECIES_CHARMANDER] = sCharmanderTMHMLearnset, [SPECIES_CHARMELEON] = sCharmeleonTMHMLearnset, [SPECIES_CHARIZARD] = sCharizardTMHMLearnset, [SPECIES_SQUIRTLE] = sSquirtleTMHMLearnset, [SPECIES_WARTORTLE] = sWartortleTMHMLearnset, [SPECIES_BLASTOISE] = sBlastoiseTMHMLearnset, [SPECIES_CATERPIE] = sCaterpieTMHMLearnset, [SPECIES_METAPOD] = sMetapodTMHMLearnset, [SPECIES_BUTTERFREE] = sButterfreeTMHMLearnset, [SPECIES_WEEDLE] = sWeedleTMHMLearnset, [SPECIES_KAKUNA] = sKakunaTMHMLearnset, [SPECIES_BEEDRILL] = sBeedrillTMHMLearnset, [SPECIES_PIDGEY] = sPidgeyTMHMLearnset, [SPECIES_PIDGEOTTO] = sPidgeottoTMHMLearnset, [SPECIES_PIDGEOT] = sPidgeotTMHMLearnset, [SPECIES_RATTATA] = sRattataTMHMLearnset, [SPECIES_RATICATE] = sRaticateTMHMLearnset, [SPECIES_SPEAROW] = sSpearowTMHMLearnset, [SPECIES_FEAROW] = sFearowTMHMLearnset, [SPECIES_EKANS] = sEkansTMHMLearnset, [SPECIES_ARBOK] = sArbokTMHMLearnset, [SPECIES_PIKACHU] = sPikachuTMHMLearnset, [SPECIES_RAICHU] = sRaichuTMHMLearnset, [SPECIES_SANDSHREW] = sSandshrewTMHMLearnset, [SPECIES_SANDSLASH] = sSandslashTMHMLearnset, [SPECIES_NIDORAN_F] = sNidoranFTMHMLearnset, [SPECIES_NIDORINA] = sNidorinaTMHMLearnset, [SPECIES_NIDOQUEEN] = sNidoqueenTMHMLearnset, [SPECIES_NIDORAN_M] = sNidoranMTMHMLearnset, [SPECIES_NIDORINO] = sNidorinoTMHMLearnset, [SPECIES_NIDOKING] = sNidokingTMHMLearnset, [SPECIES_CLEFAIRY] = sClefairyTMHMLearnset, [SPECIES_CLEFABLE] = sClefableTMHMLearnset, [SPECIES_VULPIX] = sVulpixTMHMLearnset, [SPECIES_NINETALES] = sNinetalesTMHMLearnset, [SPECIES_JIGGLYPUFF] = sJigglypuffTMHMLearnset, [SPECIES_WIGGLYTUFF] = sWigglytuffTMHMLearnset, [SPECIES_ZUBAT] = sZubatTMHMLearnset, [SPECIES_GOLBAT] = sGolbatTMHMLearnset, [SPECIES_ODDISH] = sOddishTMHMLearnset, [SPECIES_GLOOM] = sGloomTMHMLearnset, [SPECIES_VILEPLUME] = sVileplumeTMHMLearnset, [SPECIES_PARAS] = sParasTMHMLearnset, [SPECIES_PARASECT] = sParasectTMHMLearnset, [SPECIES_VENONAT] = sVenonatTMHMLearnset, [SPECIES_VENOMOTH] = sVenomothTMHMLearnset, [SPECIES_DIGLETT] = sDiglettTMHMLearnset, [SPECIES_DUGTRIO] = sDugtrioTMHMLearnset, [SPECIES_MEOWTH] = sMeowthTMHMLearnset, [SPECIES_PERSIAN] = sPersianTMHMLearnset, [SPECIES_PSYDUCK] = sPsyduckTMHMLearnset, [SPECIES_GOLDUCK] = sGolduckTMHMLearnset, [SPECIES_MANKEY] = sMankeyTMHMLearnset, [SPECIES_PRIMEAPE] = sPrimeapeTMHMLearnset, [SPECIES_GROWLITHE] = sGrowlitheTMHMLearnset, [SPECIES_ARCANINE] = sArcanineTMHMLearnset, [SPECIES_POLIWAG] = sPoliwagTMHMLearnset, [SPECIES_POLIWHIRL] = sPoliwhirlTMHMLearnset, [SPECIES_POLIWRATH] = sPoliwrathTMHMLearnset, [SPECIES_ABRA] = sAbraTMHMLearnset, [SPECIES_KADABRA] = sKadabraTMHMLearnset, [SPECIES_ALAKAZAM] = sAlakazamTMHMLearnset, [SPECIES_MACHOP] = sMachopTMHMLearnset, [SPECIES_MACHOKE] = sMachokeTMHMLearnset, [SPECIES_MACHAMP] = sMachampTMHMLearnset, [SPECIES_BELLSPROUT] = sBellsproutTMHMLearnset, [SPECIES_WEEPINBELL] = sWeepinbellTMHMLearnset, [SPECIES_VICTREEBEL] = sVictreebelTMHMLearnset, [SPECIES_TENTACOOL] = sTentacoolTMHMLearnset, [SPECIES_TENTACRUEL] = sTentacruelTMHMLearnset, [SPECIES_GEODUDE] = sGeodudeTMHMLearnset, [SPECIES_GRAVELER] = sGravelerTMHMLearnset, [SPECIES_GOLEM] = sGolemTMHMLearnset, [SPECIES_PONYTA] = sPonytaTMHMLearnset, [SPECIES_RAPIDASH] = sRapidashTMHMLearnset, [SPECIES_SLOWPOKE] = sSlowpokeTMHMLearnset, [SPECIES_SLOWBRO] = sSlowbroTMHMLearnset, [SPECIES_MAGNEMITE] = sMagnemiteTMHMLearnset, [SPECIES_MAGNETON] = sMagnetonTMHMLearnset, [SPECIES_FARFETCHD] = sFarfetchdTMHMLearnset, [SPECIES_DODUO] = sDoduoTMHMLearnset, [SPECIES_DODRIO] = sDodrioTMHMLearnset, [SPECIES_SEEL] = sSeelTMHMLearnset, [SPECIES_DEWGONG] = sDewgongTMHMLearnset, [SPECIES_GRIMER] = sGrimerTMHMLearnset, [SPECIES_MUK] = sMukTMHMLearnset, [SPECIES_SHELLDER] = sShellderTMHMLearnset, [SPECIES_CLOYSTER] = sCloysterTMHMLearnset, [SPECIES_GASTLY] = sGastlyTMHMLearnset, [SPECIES_HAUNTER] = sHaunterTMHMLearnset, [SPECIES_GENGAR] = sGengarTMHMLearnset, [SPECIES_ONIX] = sOnixTMHMLearnset, [SPECIES_DROWZEE] = sDrowzeeTMHMLearnset, [SPECIES_HYPNO] = sHypnoTMHMLearnset, [SPECIES_KRABBY] = sKrabbyTMHMLearnset, [SPECIES_KINGLER] = sKinglerTMHMLearnset, [SPECIES_VOLTORB] = sVoltorbTMHMLearnset, [SPECIES_ELECTRODE] = sElectrodeTMHMLearnset, [SPECIES_EXEGGCUTE] = sExeggcuteTMHMLearnset, [SPECIES_EXEGGUTOR] = sExeggutorTMHMLearnset, [SPECIES_CUBONE] = sCuboneTMHMLearnset, [SPECIES_MAROWAK] = sMarowakTMHMLearnset, [SPECIES_HITMONLEE] = sHitmonleeTMHMLearnset, [SPECIES_HITMONCHAN] = sHitmonchanTMHMLearnset, [SPECIES_LICKITUNG] = sLickitungTMHMLearnset, [SPECIES_KOFFING] = sKoffingTMHMLearnset, [SPECIES_WEEZING] = sWeezingTMHMLearnset, [SPECIES_RHYHORN] = sRhyhornTMHMLearnset, [SPECIES_RHYDON] = sRhydonTMHMLearnset, [SPECIES_CHANSEY] = sChanseyTMHMLearnset, [SPECIES_TANGELA] = sTangelaTMHMLearnset, [SPECIES_KANGASKHAN] = sKangaskhanTMHMLearnset, [SPECIES_HORSEA] = sHorseaTMHMLearnset, [SPECIES_SEADRA] = sSeadraTMHMLearnset, [SPECIES_GOLDEEN] = sGoldeenTMHMLearnset, [SPECIES_SEAKING] = sSeakingTMHMLearnset, [SPECIES_STARYU] = sStaryuTMHMLearnset, [SPECIES_STARMIE] = sStarmieTMHMLearnset, [SPECIES_MR_MIME] = sMrmimeTMHMLearnset, [SPECIES_SCYTHER] = sScytherTMHMLearnset, [SPECIES_JYNX] = sJynxTMHMLearnset, [SPECIES_ELECTABUZZ] = sElectabuzzTMHMLearnset, [SPECIES_MAGMAR] = sMagmarTMHMLearnset, [SPECIES_PINSIR] = sPinsirTMHMLearnset, [SPECIES_TAUROS] = sTaurosTMHMLearnset, [SPECIES_MAGIKARP] = sMagikarpTMHMLearnset, [SPECIES_GYARADOS] = sGyaradosTMHMLearnset, [SPECIES_LAPRAS] = sLaprasTMHMLearnset, [SPECIES_DITTO] = sDittoTMHMLearnset, [SPECIES_EEVEE] = sEeveeTMHMLearnset, [SPECIES_VAPOREON] = sVaporeonTMHMLearnset, [SPECIES_JOLTEON] = sJolteonTMHMLearnset, [SPECIES_FLAREON] = sFlareonTMHMLearnset, [SPECIES_PORYGON] = sPorygonTMHMLearnset, [SPECIES_OMANYTE] = sOmanyteTMHMLearnset, [SPECIES_OMASTAR] = sOmastarTMHMLearnset, [SPECIES_KABUTO] = sKabutoTMHMLearnset, [SPECIES_KABUTOPS] = sKabutopsTMHMLearnset, [SPECIES_AERODACTYL] = sAerodactylTMHMLearnset, [SPECIES_SNORLAX] = sSnorlaxTMHMLearnset, [SPECIES_ARTICUNO] = sArticunoTMHMLearnset, [SPECIES_ZAPDOS] = sZapdosTMHMLearnset, [SPECIES_MOLTRES] = sMoltresTMHMLearnset, [SPECIES_DRATINI] = sDratiniTMHMLearnset, [SPECIES_DRAGONAIR] = sDragonairTMHMLearnset, [SPECIES_DRAGONITE] = sDragoniteTMHMLearnset, [SPECIES_MEWTWO] = sMewtwoTMHMLearnset, [SPECIES_MEW] = sMewTMHMLearnset, [SPECIES_CHIKORITA] = sChikoritaTMHMLearnset, [SPECIES_BAYLEEF] = sBayleefTMHMLearnset, [SPECIES_MEGANIUM] = sMeganiumTMHMLearnset, [SPECIES_CYNDAQUIL] = sCyndaquilTMHMLearnset, [SPECIES_QUILAVA] = sQuilavaTMHMLearnset, [SPECIES_TYPHLOSION] = sTyphlosionTMHMLearnset, [SPECIES_TOTODILE] = sTotodileTMHMLearnset, [SPECIES_CROCONAW] = sCroconawTMHMLearnset, [SPECIES_FERALIGATR] = sFeraligatrTMHMLearnset, [SPECIES_SENTRET] = sSentretTMHMLearnset, [SPECIES_FURRET] = sFurretTMHMLearnset, [SPECIES_HOOTHOOT] = sHoothootTMHMLearnset, [SPECIES_NOCTOWL] = sNoctowlTMHMLearnset, [SPECIES_LEDYBA] = sLedybaTMHMLearnset, [SPECIES_LEDIAN] = sLedianTMHMLearnset, [SPECIES_SPINARAK] = sSpinarakTMHMLearnset, [SPECIES_ARIADOS] = sAriadosTMHMLearnset, [SPECIES_CROBAT] = sCrobatTMHMLearnset, [SPECIES_CHINCHOU] = sChinchouTMHMLearnset, [SPECIES_LANTURN] = sLanturnTMHMLearnset, [SPECIES_PICHU] = sPichuTMHMLearnset, [SPECIES_CLEFFA] = sCleffaTMHMLearnset, [SPECIES_IGGLYBUFF] = sIgglybuffTMHMLearnset, [SPECIES_TOGEPI] = sTogepiTMHMLearnset, [SPECIES_TOGETIC] = sTogeticTMHMLearnset, [SPECIES_NATU] = sNatuTMHMLearnset, [SPECIES_XATU] = sXatuTMHMLearnset, [SPECIES_MAREEP] = sMareepTMHMLearnset, [SPECIES_FLAAFFY] = sFlaaffyTMHMLearnset, [SPECIES_AMPHAROS] = sAmpharosTMHMLearnset, [SPECIES_BELLOSSOM] = sBellossomTMHMLearnset, [SPECIES_MARILL] = sMarillTMHMLearnset, [SPECIES_AZUMARILL] = sAzumarillTMHMLearnset, [SPECIES_SUDOWOODO] = sSudowoodoTMHMLearnset, [SPECIES_POLITOED] = sPolitoedTMHMLearnset, [SPECIES_HOPPIP] = sHoppipTMHMLearnset, [SPECIES_SKIPLOOM] = sSkiploomTMHMLearnset, [SPECIES_JUMPLUFF] = sJumpluffTMHMLearnset, [SPECIES_AIPOM] = sAipomTMHMLearnset, [SPECIES_SUNKERN] = sSunkernTMHMLearnset, [SPECIES_SUNFLORA] = sSunfloraTMHMLearnset, [SPECIES_YANMA] = sYanmaTMHMLearnset, [SPECIES_WOOPER] = sWooperTMHMLearnset, [SPECIES_QUAGSIRE] = sQuagsireTMHMLearnset, [SPECIES_ESPEON] = sEspeonTMHMLearnset, [SPECIES_UMBREON] = sUmbreonTMHMLearnset, [SPECIES_MURKROW] = sMurkrowTMHMLearnset, [SPECIES_SLOWKING] = sSlowkingTMHMLearnset, [SPECIES_MISDREAVUS] = sMisdreavusTMHMLearnset, [SPECIES_UNOWN] = sUnownTMHMLearnset, [SPECIES_WOBBUFFET] = sWobbuffetTMHMLearnset, [SPECIES_GIRAFARIG] = sGirafarigTMHMLearnset, [SPECIES_PINECO] = sPinecoTMHMLearnset, [SPECIES_FORRETRESS] = sForretressTMHMLearnset, [SPECIES_DUNSPARCE] = sDunsparceTMHMLearnset, [SPECIES_GLIGAR] = sGligarTMHMLearnset, [SPECIES_STEELIX] = sSteelixTMHMLearnset, [SPECIES_SNUBBULL] = sSnubbullTMHMLearnset, [SPECIES_GRANBULL] = sGranbullTMHMLearnset, [SPECIES_QWILFISH] = sQwilfishTMHMLearnset, [SPECIES_SCIZOR] = sScizorTMHMLearnset, [SPECIES_SHUCKLE] = sShuckleTMHMLearnset, [SPECIES_HERACROSS] = sHeracrossTMHMLearnset, [SPECIES_SNEASEL] = sSneaselTMHMLearnset, [SPECIES_TEDDIURSA] = sTeddiursaTMHMLearnset, [SPECIES_URSARING] = sUrsaringTMHMLearnset, [SPECIES_SLUGMA] = sSlugmaTMHMLearnset, [SPECIES_MAGCARGO] = sMagcargoTMHMLearnset, [SPECIES_SWINUB] = sSwinubTMHMLearnset, [SPECIES_PILOSWINE] = sPiloswineTMHMLearnset, [SPECIES_CORSOLA] = sCorsolaTMHMLearnset, [SPECIES_REMORAID] = sRemoraidTMHMLearnset, [SPECIES_OCTILLERY] = sOctilleryTMHMLearnset, [SPECIES_DELIBIRD] = sDelibirdTMHMLearnset, [SPECIES_MANTINE] = sMantineTMHMLearnset, [SPECIES_SKARMORY] = sSkarmoryTMHMLearnset, [SPECIES_HOUNDOUR] = sHoundourTMHMLearnset, [SPECIES_HOUNDOOM] = sHoundoomTMHMLearnset, [SPECIES_KINGDRA] = sKingdraTMHMLearnset, [SPECIES_PHANPY] = sPhanpyTMHMLearnset, [SPECIES_DONPHAN] = sDonphanTMHMLearnset, [SPECIES_PORYGON2] = sPorygon2TMHMLearnset, [SPECIES_STANTLER] = sStantlerTMHMLearnset, [SPECIES_SMEARGLE] = sSmeargleTMHMLearnset, [SPECIES_TYROGUE] = sTyrogueTMHMLearnset, [SPECIES_HITMONTOP] = sHitmontopTMHMLearnset, [SPECIES_SMOOCHUM] = sSmoochumTMHMLearnset, [SPECIES_ELEKID] = sElekidTMHMLearnset, [SPECIES_MAGBY] = sMagbyTMHMLearnset, [SPECIES_MILTANK] = sMiltankTMHMLearnset, [SPECIES_BLISSEY] = sBlisseyTMHMLearnset, [SPECIES_RAIKOU] = sRaikouTMHMLearnset, [SPECIES_ENTEI] = sEnteiTMHMLearnset, [SPECIES_SUICUNE] = sSuicuneTMHMLearnset, [SPECIES_LARVITAR] = sLarvitarTMHMLearnset, [SPECIES_PUPITAR] = sPupitarTMHMLearnset, [SPECIES_TYRANITAR] = sTyranitarTMHMLearnset, [SPECIES_LUGIA] = sLugiaTMHMLearnset, [SPECIES_HO_OH] = sHoOhTMHMLearnset, [SPECIES_CELEBI] = sCelebiTMHMLearnset, [SPECIES_OLD_UNOWN_B] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_C] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_D] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_E] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_F] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_G] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_H] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_I] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_J] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_K] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_L] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_M] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_N] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_O] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_P] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_Q] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_R] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_S] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_T] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_U] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_V] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_W] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_X] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_Y] = sNoneTMHMLearnset, [SPECIES_OLD_UNOWN_Z] = sNoneTMHMLearnset, [SPECIES_TREECKO] = sTreeckoTMHMLearnset, [SPECIES_GROVYLE] = sGrovyleTMHMLearnset, [SPECIES_SCEPTILE] = sSceptileTMHMLearnset, [SPECIES_TORCHIC] = sTorchicTMHMLearnset, [SPECIES_COMBUSKEN] = sCombuskenTMHMLearnset, [SPECIES_BLAZIKEN] = sBlazikenTMHMLearnset, [SPECIES_MUDKIP] = sMudkipTMHMLearnset, [SPECIES_MARSHTOMP] = sMarshtompTMHMLearnset, [SPECIES_SWAMPERT] = sSwampertTMHMLearnset, [SPECIES_POOCHYENA] = sPoochyenaTMHMLearnset, [SPECIES_MIGHTYENA] = sMightyenaTMHMLearnset, [SPECIES_ZIGZAGOON] = sZigzagoonTMHMLearnset, [SPECIES_LINOONE] = sLinooneTMHMLearnset, [SPECIES_WURMPLE] = sWurmpleTMHMLearnset, [SPECIES_SILCOON] = sSilcoonTMHMLearnset, [SPECIES_BEAUTIFLY] = sBeautiflyTMHMLearnset, [SPECIES_CASCOON] = sCascoonTMHMLearnset, [SPECIES_DUSTOX] = sDustoxTMHMLearnset, [SPECIES_LOTAD] = sLotadTMHMLearnset, [SPECIES_LOMBRE] = sLombreTMHMLearnset, [SPECIES_LUDICOLO] = sLudicoloTMHMLearnset, [SPECIES_SEEDOT] = sSeedotTMHMLearnset, [SPECIES_NUZLEAF] = sNuzleafTMHMLearnset, [SPECIES_SHIFTRY] = sShiftryTMHMLearnset, [SPECIES_NINCADA] = sNincadaTMHMLearnset, [SPECIES_NINJASK] = sNinjaskTMHMLearnset, [SPECIES_SHEDINJA] = sShedinjaTMHMLearnset, [SPECIES_TAILLOW] = sTaillowTMHMLearnset, [SPECIES_SWELLOW] = sSwellowTMHMLearnset, [SPECIES_SHROOMISH] = sShroomishTMHMLearnset, [SPECIES_BRELOOM] = sBreloomTMHMLearnset, [SPECIES_SPINDA] = sSpindaTMHMLearnset, [SPECIES_WINGULL] = sWingullTMHMLearnset, [SPECIES_PELIPPER] = sPelipperTMHMLearnset, [SPECIES_SURSKIT] = sSurskitTMHMLearnset, [SPECIES_MASQUERAIN] = sMasquerainTMHMLearnset, [SPECIES_WAILMER] = sWailmerTMHMLearnset, [SPECIES_WAILORD] = sWailordTMHMLearnset, [SPECIES_SKITTY] = sSkittyTMHMLearnset, [SPECIES_DELCATTY] = sDelcattyTMHMLearnset, [SPECIES_KECLEON] = sKecleonTMHMLearnset, [SPECIES_BALTOY] = sBaltoyTMHMLearnset, [SPECIES_CLAYDOL] = sClaydolTMHMLearnset, [SPECIES_NOSEPASS] = sNosepassTMHMLearnset, [SPECIES_TORKOAL] = sTorkoalTMHMLearnset, [SPECIES_SABLEYE] = sSableyeTMHMLearnset, [SPECIES_BARBOACH] = sBarboachTMHMLearnset, [SPECIES_WHISCASH] = sWhiscashTMHMLearnset, [SPECIES_LUVDISC] = sLuvdiscTMHMLearnset, [SPECIES_CORPHISH] = sCorphishTMHMLearnset, [SPECIES_CRAWDAUNT] = sCrawdauntTMHMLearnset, [SPECIES_FEEBAS] = sFeebasTMHMLearnset, [SPECIES_MILOTIC] = sMiloticTMHMLearnset, [SPECIES_CARVANHA] = sCarvanhaTMHMLearnset, [SPECIES_SHARPEDO] = sSharpedoTMHMLearnset, [SPECIES_TRAPINCH] = sTrapinchTMHMLearnset, [SPECIES_VIBRAVA] = sVibravaTMHMLearnset, [SPECIES_FLYGON] = sFlygonTMHMLearnset, [SPECIES_MAKUHITA] = sMakuhitaTMHMLearnset, [SPECIES_HARIYAMA] = sHariyamaTMHMLearnset, [SPECIES_ELECTRIKE] = sElectrikeTMHMLearnset, [SPECIES_MANECTRIC] = sManectricTMHMLearnset, [SPECIES_NUMEL] = sNumelTMHMLearnset, [SPECIES_CAMERUPT] = sCameruptTMHMLearnset, [SPECIES_SPHEAL] = sSphealTMHMLearnset, [SPECIES_SEALEO] = sSealeoTMHMLearnset, [SPECIES_WALREIN] = sWalreinTMHMLearnset, [SPECIES_CACNEA] = sCacneaTMHMLearnset, [SPECIES_CACTURNE] = sCacturneTMHMLearnset, [SPECIES_SNORUNT] = sSnoruntTMHMLearnset, [SPECIES_GLALIE] = sGlalieTMHMLearnset, [SPECIES_LUNATONE] = sLunatoneTMHMLearnset, [SPECIES_SOLROCK] = sSolrockTMHMLearnset, [SPECIES_AZURILL] = sAzurillTMHMLearnset, [SPECIES_SPOINK] = sSpoinkTMHMLearnset, [SPECIES_GRUMPIG] = sGrumpigTMHMLearnset, [SPECIES_PLUSLE] = sPlusleTMHMLearnset, [SPECIES_MINUN] = sMinunTMHMLearnset, [SPECIES_MAWILE] = sMawileTMHMLearnset, [SPECIES_MEDITITE] = sMedititeTMHMLearnset, [SPECIES_MEDICHAM] = sMedichamTMHMLearnset, [SPECIES_SWABLU] = sSwabluTMHMLearnset, [SPECIES_ALTARIA] = sAltariaTMHMLearnset, [SPECIES_WYNAUT] = sWynautTMHMLearnset, [SPECIES_DUSKULL] = sDuskullTMHMLearnset, [SPECIES_DUSCLOPS] = sDusclopsTMHMLearnset, [SPECIES_ROSELIA] = sRoseliaTMHMLearnset, [SPECIES_SLAKOTH] = sSlakothTMHMLearnset, [SPECIES_VIGOROTH] = sVigorothTMHMLearnset, [SPECIES_SLAKING] = sSlakingTMHMLearnset, [SPECIES_GULPIN] = sGulpinTMHMLearnset, [SPECIES_SWALOT] = sSwalotTMHMLearnset, [SPECIES_TROPIUS] = sTropiusTMHMLearnset, [SPECIES_WHISMUR] = sWhismurTMHMLearnset, [SPECIES_LOUDRED] = sLoudredTMHMLearnset, [SPECIES_EXPLOUD] = sExploudTMHMLearnset, [SPECIES_CLAMPERL] = sClamperlTMHMLearnset, [SPECIES_HUNTAIL] = sHuntailTMHMLearnset, [SPECIES_GOREBYSS] = sGorebyssTMHMLearnset, [SPECIES_ABSOL] = sAbsolTMHMLearnset, [SPECIES_SHUPPET] = sShuppetTMHMLearnset, [SPECIES_BANETTE] = sBanetteTMHMLearnset, [SPECIES_SEVIPER] = sSeviperTMHMLearnset, [SPECIES_ZANGOOSE] = sZangooseTMHMLearnset, [SPECIES_RELICANTH] = sRelicanthTMHMLearnset, [SPECIES_ARON] = sAronTMHMLearnset, [SPECIES_LAIRON] = sLaironTMHMLearnset, [SPECIES_AGGRON] = sAggronTMHMLearnset, [SPECIES_CASTFORM] = sCastformTMHMLearnset, [SPECIES_VOLBEAT] = sVolbeatTMHMLearnset, [SPECIES_ILLUMISE] = sIllumiseTMHMLearnset, [SPECIES_LILEEP] = sLileepTMHMLearnset, [SPECIES_CRADILY] = sCradilyTMHMLearnset, [SPECIES_ANORITH] = sAnorithTMHMLearnset, [SPECIES_ARMALDO] = sArmaldoTMHMLearnset, [SPECIES_RALTS] = sRaltsTMHMLearnset, [SPECIES_KIRLIA] = sKirliaTMHMLearnset, [SPECIES_GARDEVOIR] = sGardevoirTMHMLearnset, [SPECIES_BAGON] = sBagonTMHMLearnset, [SPECIES_SHELGON] = sShelgonTMHMLearnset, [SPECIES_SALAMENCE] = sSalamenceTMHMLearnset, [SPECIES_BELDUM] = sBeldumTMHMLearnset, [SPECIES_METANG] = sMetangTMHMLearnset, [SPECIES_METAGROSS] = sMetagrossTMHMLearnset, [SPECIES_REGIROCK] = sRegirockTMHMLearnset, [SPECIES_REGICE] = sRegiceTMHMLearnset, [SPECIES_REGISTEEL] = sRegisteelTMHMLearnset, [SPECIES_KYOGRE] = sKyogreTMHMLearnset, [SPECIES_GROUDON] = sGroudonTMHMLearnset, [SPECIES_RAYQUAZA] = sRayquazaTMHMLearnset, [SPECIES_LATIAS] = sLatiasTMHMLearnset, [SPECIES_LATIOS] = sLatiosTMHMLearnset, [SPECIES_JIRACHI] = sJirachiTMHMLearnset, [SPECIES_DEOXYS] = sDeoxysTMHMLearnset, [SPECIES_CHIMECHO] = sChimechoTMHMLearnset }; ================================================ FILE: src/data/pokemon/trainer_class_lookups.h ================================================ const u8 gFacilityClassToPicIndex[] = { [FACILITY_CLASS_AQUA_LEADER_ARCHIE] = TRAINER_PIC_AQUA_LEADER_ARCHIE, [FACILITY_CLASS_AQUA_GRUNT_M] = TRAINER_PIC_AQUA_GRUNT_M, [FACILITY_CLASS_AQUA_GRUNT_F] = TRAINER_PIC_AQUA_GRUNT_F, [FACILITY_CLASS_RS_AROMA_LADY] = TRAINER_PIC_RS_AROMA_LADY, [FACILITY_CLASS_RS_RUIN_MANIAC] = TRAINER_PIC_RS_RUIN_MANIAC, [FACILITY_CLASS_INTERVIEWER] = TRAINER_PIC_INTERVIEWER, [FACILITY_CLASS_RS_TUBER_F] = TRAINER_PIC_RS_TUBER_F, [FACILITY_CLASS_RS_TUBER_M] = TRAINER_PIC_RS_TUBER_M, [FACILITY_CLASS_RS_COOLTRAINER_M] = TRAINER_PIC_RS_COOLTRAINER_M, [FACILITY_CLASS_RS_COOLTRAINER_F] = TRAINER_PIC_RS_COOLTRAINER_F, [FACILITY_CLASS_HEX_MANIAC] = TRAINER_PIC_HEX_MANIAC, [FACILITY_CLASS_RS_LADY] = TRAINER_PIC_RS_LADY, [FACILITY_CLASS_RS_BEAUTY] = TRAINER_PIC_RS_BEAUTY, [FACILITY_CLASS_RICH_BOY] = TRAINER_PIC_RICH_BOY, [FACILITY_CLASS_RS_POKEMANIAC] = TRAINER_PIC_RS_POKEMANIAC, [FACILITY_CLASS_RS_SWIMMER_M] = TRAINER_PIC_RS_SWIMMER_M, [FACILITY_CLASS_RS_BLACK_BELT] = TRAINER_PIC_RS_BLACK_BELT, [FACILITY_CLASS_GUITARIST] = TRAINER_PIC_GUITARIST, [FACILITY_CLASS_KINDLER] = TRAINER_PIC_KINDLER, [FACILITY_CLASS_RS_CAMPER] = TRAINER_PIC_RS_CAMPER, [FACILITY_CLASS_BUG_MANIAC] = TRAINER_PIC_BUG_MANIAC, [FACILITY_CLASS_RS_PSYCHIC_M] = TRAINER_PIC_RS_PSYCHIC_M, [FACILITY_CLASS_RS_PSYCHIC_F] = TRAINER_PIC_RS_PSYCHIC_F, [FACILITY_CLASS_RS_GENTLEMAN] = TRAINER_PIC_RS_GENTLEMAN, [FACILITY_CLASS_ELITE_FOUR_SIDNEY] = TRAINER_PIC_ELITE_FOUR_SIDNEY, [FACILITY_CLASS_ELITE_FOUR_PHOEBE] = TRAINER_PIC_ELITE_FOUR_PHOEBE, [FACILITY_CLASS_LEADER_ROXANNE] = TRAINER_PIC_LEADER_ROXANNE, [FACILITY_CLASS_LEADER_BRAWLY] = TRAINER_PIC_LEADER_BRAWLY, [FACILITY_CLASS_LEADER_TATE_AND_LIZA] = TRAINER_PIC_LEADER_TATE_AND_LIZA, [FACILITY_CLASS_SCHOOL_KID_M] = TRAINER_PIC_SCHOOL_KID_M, [FACILITY_CLASS_SCHOOL_KID_F] = TRAINER_PIC_SCHOOL_KID_F, [FACILITY_CLASS_SR_AND_JR] = TRAINER_PIC_SR_AND_JR, [FACILITY_CLASS_POKEFAN_M] = TRAINER_PIC_POKEFAN_M, [FACILITY_CLASS_POKEFAN_F] = TRAINER_PIC_POKEFAN_F, [FACILITY_CLASS_EXPERT_M] = TRAINER_PIC_EXPERT_M, [FACILITY_CLASS_EXPERT_F] = TRAINER_PIC_EXPERT_F, [FACILITY_CLASS_RS_YOUNGSTER] = TRAINER_PIC_RS_YOUNGSTER, [FACILITY_CLASS_CHAMPION_STEVEN] = TRAINER_PIC_CHAMPION_STEVEN, [FACILITY_CLASS_RS_FISHERMAN] = TRAINER_PIC_RS_FISHERMAN, [FACILITY_CLASS_CYCLING_TRIATHLETE_M] = TRAINER_PIC_CYCLING_TRIATHLETE_M, [FACILITY_CLASS_CYCLING_TRIATHLETE_F] = TRAINER_PIC_CYCLING_TRIATHLETE_F, [FACILITY_CLASS_RUNNING_TRIATHLETE_M] = TRAINER_PIC_RUNNING_TRIATHLETE_M, [FACILITY_CLASS_RUNNING_TRIATHLETE_F] = TRAINER_PIC_RUNNING_TRIATHLETE_F, [FACILITY_CLASS_SWIMMING_TRIATHLETE_M] = TRAINER_PIC_SWIMMING_TRIATHLETE_M, [FACILITY_CLASS_SWIMMING_TRIATHLETE_F] = TRAINER_PIC_SWIMMING_TRIATHLETE_F, [FACILITY_CLASS_DRAGON_TAMER] = TRAINER_PIC_DRAGON_TAMER, [FACILITY_CLASS_RS_BIRD_KEEPER] = TRAINER_PIC_RS_BIRD_KEEPER, [FACILITY_CLASS_NINJA_BOY] = TRAINER_PIC_NINJA_BOY, [FACILITY_CLASS_BATTLE_GIRL] = TRAINER_PIC_BATTLE_GIRL, [FACILITY_CLASS_PARASOL_LADY] = TRAINER_PIC_PARASOL_LADY, [FACILITY_CLASS_RS_SWIMMER_F] = TRAINER_PIC_RS_SWIMMER_F, [FACILITY_CLASS_RS_PICNICKER] = TRAINER_PIC_RS_PICNICKER, [FACILITY_CLASS_RS_TWINS] = TRAINER_PIC_RS_TWINS, [FACILITY_CLASS_RS_SAILOR] = TRAINER_PIC_RS_SAILOR, [FACILITY_CLASS_BOARDER_M] = TRAINER_PIC_RS_YOUNGSTER, [FACILITY_CLASS_BOARDER_F] = TRAINER_PIC_RS_YOUNGSTER, [FACILITY_CLASS_COLLECTOR] = TRAINER_PIC_COLLECTOR, [FACILITY_CLASS_PKMN_TRAINER_WALLY] = TRAINER_PIC_WALLY, [FACILITY_CLASS_PKMN_TRAINER_BRENDAN] = TRAINER_PIC_RS_BRENDAN_1, [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2] = TRAINER_PIC_RS_BRENDAN_1, [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3] = TRAINER_PIC_RS_BRENDAN_1, [FACILITY_CLASS_PKMN_TRAINER_MAY] = TRAINER_PIC_RS_MAY_1, [FACILITY_CLASS_PKMN_TRAINER_MAY_2] = TRAINER_PIC_RS_MAY_1, [FACILITY_CLASS_PKMN_TRAINER_MAY_3] = TRAINER_PIC_RS_MAY_1, [FACILITY_CLASS_RS_PKMN_BREEDER_M] = TRAINER_PIC_RS_POKEMON_BREEDER_M, [FACILITY_CLASS_RS_PKMN_BREEDER_F] = TRAINER_PIC_RS_POKEMON_BREEDER_F, [FACILITY_CLASS_RS_PKMN_RANGER_M] = TRAINER_PIC_RS_POKEMON_RANGER_M, [FACILITY_CLASS_RS_PKMN_RANGER_F] = TRAINER_PIC_RS_POKEMON_RANGER_F, [FACILITY_CLASS_MAGMA_LEADER_MAXIE] = TRAINER_PIC_MAGMA_LEADER_MAXIE, [FACILITY_CLASS_MAGMA_GRUNT_M] = TRAINER_PIC_MAGMA_GRUNT_M, [FACILITY_CLASS_MAGMA_GRUNT_F] = TRAINER_PIC_MAGMA_GRUNT_F, [FACILITY_CLASS_RS_LASS] = TRAINER_PIC_RS_LASS, [FACILITY_CLASS_RS_BUG_CATCHER] = TRAINER_PIC_RS_BUG_CATCHER, [FACILITY_CLASS_RS_HIKER] = TRAINER_PIC_RS_HIKER, [FACILITY_CLASS_RS_YOUNG_COUPLE] = TRAINER_PIC_RS_YOUNG_COUPLE, [FACILITY_CLASS_OLD_COUPLE] = TRAINER_PIC_OLD_COUPLE, [FACILITY_CLASS_RS_SIS_AND_BRO] = TRAINER_PIC_RS_SIS_AND_BRO, [FACILITY_CLASS_AQUA_ADMIN_M] = TRAINER_PIC_AQUA_ADMIN_M, [FACILITY_CLASS_AQUA_ADMIN_F] = TRAINER_PIC_AQUA_ADMIN_F, [FACILITY_CLASS_MAGMA_ADMIN_M] = TRAINER_PIC_MAGMA_ADMIN_M, [FACILITY_CLASS_MAGMA_ADMIN_F] = TRAINER_PIC_MAGMA_ADMIN_F, [FACILITY_CLASS_LEADER_WATTSON] = TRAINER_PIC_LEADER_WATTSON, [FACILITY_CLASS_LEADER_FLANNERY] = TRAINER_PIC_LEADER_FLANNERY, [FACILITY_CLASS_LEADER_NORMAN] = TRAINER_PIC_LEADER_NORMAN, [FACILITY_CLASS_LEADER_WINONA] = TRAINER_PIC_LEADER_WINONA, [FACILITY_CLASS_LEADER_WALLACE] = TRAINER_PIC_LEADER_WALLACE, [FACILITY_CLASS_ELITE_FOUR_GLACIA] = TRAINER_PIC_ELITE_FOUR_GLACIA, [FACILITY_CLASS_ELITE_FOUR_DRAKE] = TRAINER_PIC_ELITE_FOUR_DRAKE, [FACILITY_CLASS_YOUNGSTER] = TRAINER_PIC_YOUNGSTER, [FACILITY_CLASS_BUG_CATCHER] = TRAINER_PIC_BUG_CATCHER, [FACILITY_CLASS_LASS] = TRAINER_PIC_LASS, [FACILITY_CLASS_SAILOR] = TRAINER_PIC_SAILOR, [FACILITY_CLASS_CAMPER] = TRAINER_PIC_CAMPER, [FACILITY_CLASS_PICNICKER] = TRAINER_PIC_PICNICKER, [FACILITY_CLASS_POKEMANIAC] = TRAINER_PIC_POKEMANIAC, [FACILITY_CLASS_SUPER_NERD] = TRAINER_PIC_SUPER_NERD, [FACILITY_CLASS_HIKER] = TRAINER_PIC_HIKER, [FACILITY_CLASS_BIKER] = TRAINER_PIC_BIKER, [FACILITY_CLASS_BURGLAR] = TRAINER_PIC_BURGLAR, [FACILITY_CLASS_ENGINEER] = TRAINER_PIC_ENGINEER, [FACILITY_CLASS_FISHERMAN] = TRAINER_PIC_FISHERMAN, [FACILITY_CLASS_SWIMMER_M] = TRAINER_PIC_SWIMMER_M, [FACILITY_CLASS_CUE_BALL] = TRAINER_PIC_CUE_BALL, [FACILITY_CLASS_GAMER] = TRAINER_PIC_GAMER, [FACILITY_CLASS_BEAUTY] = TRAINER_PIC_BEAUTY, [FACILITY_CLASS_SWIMMER_F] = TRAINER_PIC_SWIMMER_F, [FACILITY_CLASS_PSYCHIC_M] = TRAINER_PIC_PSYCHIC_M, [FACILITY_CLASS_ROCKER] = TRAINER_PIC_ROCKER, [FACILITY_CLASS_JUGGLER] = TRAINER_PIC_JUGGLER, [FACILITY_CLASS_TAMER] = TRAINER_PIC_TAMER, [FACILITY_CLASS_BIRD_KEEPER] = TRAINER_PIC_BIRD_KEEPER, [FACILITY_CLASS_BLACK_BELT] = TRAINER_PIC_BLACK_BELT, [FACILITY_CLASS_RIVAL_EARLY] = TRAINER_PIC_RIVAL_EARLY, [FACILITY_CLASS_SCIENTIST] = TRAINER_PIC_SCIENTIST, [FACILITY_CLASS_BOSS] = TRAINER_PIC_LEADER_GIOVANNI, [FACILITY_CLASS_ROCKET_GRUNT_M] = TRAINER_PIC_ROCKET_GRUNT_M, [FACILITY_CLASS_COOLTRAINER_M] = TRAINER_PIC_COOLTRAINER_M, [FACILITY_CLASS_COOLTRAINER_F] = TRAINER_PIC_COOLTRAINER_F, [FACILITY_CLASS_ELITE_FOUR_LORELEI] = TRAINER_PIC_ELITE_FOUR_LORELEI, [FACILITY_CLASS_ELITE_FOUR_BRUNO] = TRAINER_PIC_ELITE_FOUR_BRUNO, [FACILITY_CLASS_LEADER_M] = TRAINER_PIC_LEADER_BROCK, [FACILITY_CLASS_LEADER_F] = TRAINER_PIC_LEADER_MISTY, [FACILITY_CLASS_GENTLEMAN] = TRAINER_PIC_GENTLEMAN, [FACILITY_CLASS_RIVAL_LATE] = TRAINER_PIC_RIVAL_LATE, [FACILITY_CLASS_CHAMPION_RIVAL] = TRAINER_PIC_CHAMPION_RIVAL, [FACILITY_CLASS_CHANNELER] = TRAINER_PIC_CHANNELER, [FACILITY_CLASS_TWINS] = TRAINER_PIC_TWINS, [FACILITY_CLASS_COOL_COUPLE] = TRAINER_PIC_COOL_COUPLE, [FACILITY_CLASS_YOUNG_COUPLE] = TRAINER_PIC_YOUNG_COUPLE, [FACILITY_CLASS_CRUSH_KIN] = TRAINER_PIC_CRUSH_KIN, [FACILITY_CLASS_SIS_AND_BRO] = TRAINER_PIC_SIS_AND_BRO, [FACILITY_CLASS_PKMN_PROF] = TRAINER_PIC_PROFESSOR_OAK, [FACILITY_CLASS_BRENDAN] = TRAINER_PIC_RS_BRENDAN_2, [FACILITY_CLASS_MAY] = TRAINER_PIC_RS_MAY_2, [FACILITY_CLASS_RED] = TRAINER_PIC_RED, [FACILITY_CLASS_LEAF] = TRAINER_PIC_LEAF, [FACILITY_CLASS_ROCKET_GRUNT_F] = TRAINER_PIC_ROCKET_GRUNT_F, [FACILITY_CLASS_PSYCHIC_F] = TRAINER_PIC_PSYCHIC_F, [FACILITY_CLASS_CRUSH_GIRL] = TRAINER_PIC_CRUSH_GIRL, [FACILITY_CLASS_TUBER] = TRAINER_PIC_TUBER_F, [FACILITY_CLASS_PKMN_BREEDER] = TRAINER_PIC_POKEMON_BREEDER, [FACILITY_CLASS_PKMN_RANGER_M] = TRAINER_PIC_POKEMON_RANGER_M, [FACILITY_CLASS_PKMN_RANGER_F] = TRAINER_PIC_POKEMON_RANGER_F, [FACILITY_CLASS_AROMA_LADY] = TRAINER_PIC_AROMA_LADY, [FACILITY_CLASS_RUIN_MANIAC] = TRAINER_PIC_RUIN_MANIAC, [FACILITY_CLASS_LADY] = TRAINER_PIC_LADY, [FACILITY_CLASS_PAINTER] = TRAINER_PIC_PAINTER, [FACILITY_CLASS_ELITE_FOUR_AGATHA] = TRAINER_PIC_ELITE_FOUR_AGATHA, [FACILITY_CLASS_ELITE_FOUR_LANCE] = TRAINER_PIC_ELITE_FOUR_LANCE, [FACILITY_CLASS_CHAMPION_RIVAL_2] = TRAINER_PIC_CHAMPION_RIVAL, [FACILITY_CLASS_EM_BRENDAN] = TRAINER_PIC_EM_BRENDAN, [FACILITY_CLASS_EM_MAY] = TRAINER_PIC_EM_MAY, }; const u8 gFacilityClassToTrainerClass[] = { [FACILITY_CLASS_AQUA_LEADER_ARCHIE] = TRAINER_CLASS_AQUA_LEADER, [FACILITY_CLASS_AQUA_GRUNT_M] = TRAINER_CLASS_TEAM_AQUA, [FACILITY_CLASS_AQUA_GRUNT_F] = TRAINER_CLASS_TEAM_AQUA, [FACILITY_CLASS_RS_AROMA_LADY] = TRAINER_CLASS_RS_AROMA_LADY, [FACILITY_CLASS_RS_RUIN_MANIAC] = TRAINER_CLASS_RS_RUIN_MANIAC, [FACILITY_CLASS_INTERVIEWER] = TRAINER_CLASS_INTERVIEWER, [FACILITY_CLASS_RS_TUBER_F] = TRAINER_CLASS_RS_TUBER_F, [FACILITY_CLASS_RS_TUBER_M] = TRAINER_CLASS_RS_TUBER_M, [FACILITY_CLASS_RS_COOLTRAINER_M] = TRAINER_CLASS_RS_COOLTRAINER, [FACILITY_CLASS_RS_COOLTRAINER_F] = TRAINER_CLASS_RS_COOLTRAINER, [FACILITY_CLASS_HEX_MANIAC] = TRAINER_CLASS_HEX_MANIAC, [FACILITY_CLASS_RS_LADY] = TRAINER_CLASS_RS_LADY, [FACILITY_CLASS_RS_BEAUTY] = TRAINER_CLASS_RS_BEAUTY, [FACILITY_CLASS_RICH_BOY] = TRAINER_CLASS_RICH_BOY, [FACILITY_CLASS_RS_POKEMANIAC] = TRAINER_CLASS_RS_POKEMANIAC, [FACILITY_CLASS_RS_SWIMMER_M] = TRAINER_CLASS_RS_SWIMMER_M, [FACILITY_CLASS_RS_BLACK_BELT] = TRAINER_CLASS_RS_BLACK_BELT, [FACILITY_CLASS_GUITARIST] = TRAINER_CLASS_GUITARIST, [FACILITY_CLASS_KINDLER] = TRAINER_CLASS_KINDLER, [FACILITY_CLASS_RS_CAMPER] = TRAINER_CLASS_RS_CAMPER, [FACILITY_CLASS_BUG_MANIAC] = TRAINER_CLASS_BUG_MANIAC, [FACILITY_CLASS_RS_PSYCHIC_M] = TRAINER_CLASS_RS_PSYCHIC, [FACILITY_CLASS_RS_PSYCHIC_F] = TRAINER_CLASS_RS_PSYCHIC, [FACILITY_CLASS_RS_GENTLEMAN] = TRAINER_CLASS_RS_GENTLEMAN, [FACILITY_CLASS_ELITE_FOUR_SIDNEY] = TRAINER_CLASS_RS_ELITE_FOUR, [FACILITY_CLASS_ELITE_FOUR_PHOEBE] = TRAINER_CLASS_RS_ELITE_FOUR, [FACILITY_CLASS_LEADER_ROXANNE] = TRAINER_CLASS_RS_LEADER, [FACILITY_CLASS_LEADER_BRAWLY] = TRAINER_CLASS_RS_LEADER, [FACILITY_CLASS_LEADER_TATE_AND_LIZA] = TRAINER_CLASS_RS_LEADER, [FACILITY_CLASS_SCHOOL_KID_M] = TRAINER_CLASS_SCHOOL_KID, [FACILITY_CLASS_SCHOOL_KID_F] = TRAINER_CLASS_SCHOOL_KID, [FACILITY_CLASS_SR_AND_JR] = TRAINER_CLASS_SR_AND_JR, [FACILITY_CLASS_POKEFAN_M] = TRAINER_CLASS_POKEFAN, [FACILITY_CLASS_POKEFAN_F] = TRAINER_CLASS_POKEFAN, [FACILITY_CLASS_EXPERT_M] = TRAINER_CLASS_EXPERT, [FACILITY_CLASS_EXPERT_F] = TRAINER_CLASS_EXPERT, [FACILITY_CLASS_RS_YOUNGSTER] = TRAINER_CLASS_RS_YOUNGSTER, [FACILITY_CLASS_CHAMPION_STEVEN] = TRAINER_CLASS_RS_CHAMPION, [FACILITY_CLASS_RS_FISHERMAN] = TRAINER_CLASS_RS_FISHERMAN, [FACILITY_CLASS_CYCLING_TRIATHLETE_M] = TRAINER_CLASS_TRIATHLETE, [FACILITY_CLASS_CYCLING_TRIATHLETE_F] = TRAINER_CLASS_TRIATHLETE, [FACILITY_CLASS_RUNNING_TRIATHLETE_M] = TRAINER_CLASS_TRIATHLETE, [FACILITY_CLASS_RUNNING_TRIATHLETE_F] = TRAINER_CLASS_TRIATHLETE, [FACILITY_CLASS_SWIMMING_TRIATHLETE_M] = TRAINER_CLASS_TRIATHLETE, [FACILITY_CLASS_SWIMMING_TRIATHLETE_F] = TRAINER_CLASS_TRIATHLETE, [FACILITY_CLASS_DRAGON_TAMER] = TRAINER_CLASS_DRAGON_TAMER, [FACILITY_CLASS_RS_BIRD_KEEPER] = TRAINER_CLASS_RS_BIRD_KEEPER, [FACILITY_CLASS_NINJA_BOY] = TRAINER_CLASS_NINJA_BOY, [FACILITY_CLASS_BATTLE_GIRL] = TRAINER_CLASS_BATTLE_GIRL, [FACILITY_CLASS_PARASOL_LADY] = TRAINER_CLASS_PARASOL_LADY, [FACILITY_CLASS_RS_SWIMMER_F] = TRAINER_CLASS_RS_SWIMMER_F, [FACILITY_CLASS_RS_PICNICKER] = TRAINER_CLASS_RS_PICNICKER, [FACILITY_CLASS_RS_TWINS] = TRAINER_CLASS_RS_TWINS, [FACILITY_CLASS_RS_SAILOR] = TRAINER_CLASS_RS_SAILOR, [FACILITY_CLASS_BOARDER_M] = TRAINER_CLASS_BOARDER, [FACILITY_CLASS_BOARDER_F] = TRAINER_CLASS_BOARDER, [FACILITY_CLASS_COLLECTOR] = TRAINER_CLASS_COLLECTOR, [FACILITY_CLASS_PKMN_TRAINER_WALLY] = TRAINER_CLASS_PKMN_TRAINER, [FACILITY_CLASS_PKMN_TRAINER_BRENDAN] = TRAINER_CLASS_PKMN_TRAINER, [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2] = TRAINER_CLASS_PKMN_TRAINER, [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3] = TRAINER_CLASS_PKMN_TRAINER, [FACILITY_CLASS_PKMN_TRAINER_MAY] = TRAINER_CLASS_PKMN_TRAINER, [FACILITY_CLASS_PKMN_TRAINER_MAY_2] = TRAINER_CLASS_PKMN_TRAINER, [FACILITY_CLASS_PKMN_TRAINER_MAY_3] = TRAINER_CLASS_PKMN_TRAINER, [FACILITY_CLASS_RS_PKMN_BREEDER_M] = TRAINER_CLASS_RS_PKMN_BREEDER, [FACILITY_CLASS_RS_PKMN_BREEDER_F] = TRAINER_CLASS_RS_PKMN_BREEDER, [FACILITY_CLASS_RS_PKMN_RANGER_M] = TRAINER_CLASS_RS_PKMN_RANGER, [FACILITY_CLASS_RS_PKMN_RANGER_F] = TRAINER_CLASS_RS_PKMN_RANGER, [FACILITY_CLASS_MAGMA_LEADER_MAXIE] = TRAINER_CLASS_MAGMA_LEADER, [FACILITY_CLASS_MAGMA_GRUNT_M] = TRAINER_CLASS_TEAM_MAGMA, [FACILITY_CLASS_MAGMA_GRUNT_F] = TRAINER_CLASS_TEAM_MAGMA, [FACILITY_CLASS_RS_LASS] = TRAINER_CLASS_RS_LASS, [FACILITY_CLASS_RS_BUG_CATCHER] = TRAINER_CLASS_RS_BUG_CATCHER, [FACILITY_CLASS_RS_HIKER] = TRAINER_CLASS_RS_HIKER, [FACILITY_CLASS_RS_YOUNG_COUPLE] = TRAINER_CLASS_RS_YOUNG_COUPLE, [FACILITY_CLASS_OLD_COUPLE] = TRAINER_CLASS_OLD_COUPLE, [FACILITY_CLASS_RS_SIS_AND_BRO] = TRAINER_CLASS_RS_SIS_AND_BRO, [FACILITY_CLASS_AQUA_ADMIN_M] = TRAINER_CLASS_AQUA_ADMIN, [FACILITY_CLASS_AQUA_ADMIN_F] = TRAINER_CLASS_AQUA_ADMIN, [FACILITY_CLASS_MAGMA_ADMIN_M] = TRAINER_CLASS_MAGMA_ADMIN, [FACILITY_CLASS_MAGMA_ADMIN_F] = TRAINER_CLASS_MAGMA_ADMIN, [FACILITY_CLASS_LEADER_WATTSON] = TRAINER_CLASS_RS_LEADER, [FACILITY_CLASS_LEADER_FLANNERY] = TRAINER_CLASS_RS_LEADER, [FACILITY_CLASS_LEADER_NORMAN] = TRAINER_CLASS_RS_LEADER, [FACILITY_CLASS_LEADER_WINONA] = TRAINER_CLASS_RS_LEADER, [FACILITY_CLASS_LEADER_WALLACE] = TRAINER_CLASS_RS_LEADER, [FACILITY_CLASS_ELITE_FOUR_GLACIA] = TRAINER_CLASS_RS_ELITE_FOUR, [FACILITY_CLASS_ELITE_FOUR_DRAKE] = TRAINER_CLASS_RS_ELITE_FOUR, [FACILITY_CLASS_YOUNGSTER] = TRAINER_CLASS_YOUNGSTER, [FACILITY_CLASS_BUG_CATCHER] = TRAINER_CLASS_BUG_CATCHER, [FACILITY_CLASS_LASS] = TRAINER_CLASS_LASS, [FACILITY_CLASS_SAILOR] = TRAINER_CLASS_SAILOR, [FACILITY_CLASS_CAMPER] = TRAINER_CLASS_CAMPER, [FACILITY_CLASS_PICNICKER] = TRAINER_CLASS_PICNICKER, [FACILITY_CLASS_POKEMANIAC] = TRAINER_CLASS_POKEMANIAC, [FACILITY_CLASS_SUPER_NERD] = TRAINER_CLASS_SUPER_NERD, [FACILITY_CLASS_HIKER] = TRAINER_CLASS_HIKER, [FACILITY_CLASS_BIKER] = TRAINER_CLASS_BIKER, [FACILITY_CLASS_BURGLAR] = TRAINER_CLASS_BURGLAR, [FACILITY_CLASS_ENGINEER] = TRAINER_CLASS_ENGINEER, [FACILITY_CLASS_FISHERMAN] = TRAINER_CLASS_FISHERMAN, [FACILITY_CLASS_SWIMMER_M] = TRAINER_CLASS_SWIMMER_M, [FACILITY_CLASS_CUE_BALL] = TRAINER_CLASS_CUE_BALL, [FACILITY_CLASS_GAMER] = TRAINER_CLASS_GAMER, [FACILITY_CLASS_BEAUTY] = TRAINER_CLASS_BEAUTY, [FACILITY_CLASS_SWIMMER_F] = TRAINER_CLASS_SWIMMER_F, [FACILITY_CLASS_PSYCHIC_M] = TRAINER_CLASS_PSYCHIC, [FACILITY_CLASS_ROCKER] = TRAINER_CLASS_ROCKER, [FACILITY_CLASS_JUGGLER] = TRAINER_CLASS_JUGGLER, [FACILITY_CLASS_TAMER] = TRAINER_CLASS_TAMER, [FACILITY_CLASS_BIRD_KEEPER] = TRAINER_CLASS_BIRD_KEEPER, [FACILITY_CLASS_BLACK_BELT] = TRAINER_CLASS_BLACK_BELT, [FACILITY_CLASS_RIVAL_EARLY] = TRAINER_CLASS_RIVAL_EARLY, [FACILITY_CLASS_SCIENTIST] = TRAINER_CLASS_SCIENTIST, [FACILITY_CLASS_BOSS] = TRAINER_CLASS_BOSS, [FACILITY_CLASS_ROCKET_GRUNT_M] = TRAINER_CLASS_TEAM_ROCKET, [FACILITY_CLASS_COOLTRAINER_M] = TRAINER_CLASS_COOLTRAINER, [FACILITY_CLASS_COOLTRAINER_F] = TRAINER_CLASS_COOLTRAINER, [FACILITY_CLASS_ELITE_FOUR_LORELEI] = TRAINER_CLASS_ELITE_FOUR, [FACILITY_CLASS_ELITE_FOUR_BRUNO] = TRAINER_CLASS_ELITE_FOUR, [FACILITY_CLASS_LEADER_M] = TRAINER_CLASS_LEADER, [FACILITY_CLASS_LEADER_F] = TRAINER_CLASS_LEADER, [FACILITY_CLASS_GENTLEMAN] = TRAINER_CLASS_GENTLEMAN, [FACILITY_CLASS_RIVAL_LATE] = TRAINER_CLASS_RIVAL_LATE, [FACILITY_CLASS_CHAMPION_RIVAL] = TRAINER_CLASS_CHAMPION, [FACILITY_CLASS_CHANNELER] = TRAINER_CLASS_CHANNELER, [FACILITY_CLASS_TWINS] = TRAINER_CLASS_TWINS, [FACILITY_CLASS_COOL_COUPLE] = TRAINER_CLASS_COOL_COUPLE, [FACILITY_CLASS_YOUNG_COUPLE] = TRAINER_CLASS_YOUNG_COUPLE, [FACILITY_CLASS_CRUSH_KIN] = TRAINER_CLASS_CRUSH_KIN, [FACILITY_CLASS_SIS_AND_BRO] = TRAINER_CLASS_SIS_AND_BRO, [FACILITY_CLASS_PKMN_PROF] = TRAINER_CLASS_PKMN_PROF, [FACILITY_CLASS_BRENDAN] = TRAINER_CLASS_PLAYER, [FACILITY_CLASS_MAY] = TRAINER_CLASS_PLAYER, [FACILITY_CLASS_RED] = TRAINER_CLASS_PLAYER, [FACILITY_CLASS_LEAF] = TRAINER_CLASS_PLAYER, [FACILITY_CLASS_ROCKET_GRUNT_F] = TRAINER_CLASS_TEAM_ROCKET, [FACILITY_CLASS_PSYCHIC_F] = TRAINER_CLASS_PSYCHIC, [FACILITY_CLASS_CRUSH_GIRL] = TRAINER_CLASS_CRUSH_GIRL, [FACILITY_CLASS_TUBER] = TRAINER_CLASS_TUBER, [FACILITY_CLASS_PKMN_BREEDER] = TRAINER_CLASS_PKMN_BREEDER, [FACILITY_CLASS_PKMN_RANGER_M] = TRAINER_CLASS_PKMN_RANGER, [FACILITY_CLASS_PKMN_RANGER_F] = TRAINER_CLASS_PKMN_RANGER, [FACILITY_CLASS_AROMA_LADY] = TRAINER_CLASS_AROMA_LADY, [FACILITY_CLASS_RUIN_MANIAC] = TRAINER_CLASS_RUIN_MANIAC, [FACILITY_CLASS_LADY] = TRAINER_CLASS_LADY, [FACILITY_CLASS_PAINTER] = TRAINER_CLASS_PAINTER, [FACILITY_CLASS_ELITE_FOUR_AGATHA] = TRAINER_CLASS_ELITE_FOUR, [FACILITY_CLASS_ELITE_FOUR_LANCE] = TRAINER_CLASS_ELITE_FOUR, [FACILITY_CLASS_CHAMPION_RIVAL_2] = TRAINER_CLASS_CHAMPION, [FACILITY_CLASS_EM_BRENDAN] = TRAINER_CLASS_PKMN_TRAINER, [FACILITY_CLASS_EM_MAY] = TRAINER_CLASS_PKMN_TRAINER, }; ================================================ FILE: src/data/pokemon/tutor_learnsets.h ================================================ const u16 sTutorMoves[TUTOR_MOVE_COUNT] = { [TUTOR_MOVE_MEGA_PUNCH] = MOVE_MEGA_PUNCH, [TUTOR_MOVE_SWORDS_DANCE] = MOVE_SWORDS_DANCE, [TUTOR_MOVE_MEGA_KICK] = MOVE_MEGA_KICK, [TUTOR_MOVE_BODY_SLAM] = MOVE_BODY_SLAM, [TUTOR_MOVE_DOUBLE_EDGE] = MOVE_DOUBLE_EDGE, [TUTOR_MOVE_COUNTER] = MOVE_COUNTER, [TUTOR_MOVE_SEISMIC_TOSS] = MOVE_SEISMIC_TOSS, [TUTOR_MOVE_MIMIC] = MOVE_MIMIC, [TUTOR_MOVE_METRONOME] = MOVE_METRONOME, [TUTOR_MOVE_SOFT_BOILED] = MOVE_SOFT_BOILED, [TUTOR_MOVE_DREAM_EATER] = MOVE_DREAM_EATER, [TUTOR_MOVE_THUNDER_WAVE] = MOVE_THUNDER_WAVE, [TUTOR_MOVE_EXPLOSION] = MOVE_EXPLOSION, [TUTOR_MOVE_ROCK_SLIDE] = MOVE_ROCK_SLIDE, [TUTOR_MOVE_SUBSTITUTE] = MOVE_SUBSTITUTE, [TUTOR_MOVE_DYNAMIC_PUNCH] = MOVE_DYNAMIC_PUNCH, [TUTOR_MOVE_ROLLOUT] = MOVE_ROLLOUT, [TUTOR_MOVE_PSYCH_UP] = MOVE_PSYCH_UP, [TUTOR_MOVE_SNORE] = MOVE_SNORE, [TUTOR_MOVE_ICY_WIND] = MOVE_ICY_WIND, [TUTOR_MOVE_ENDURE] = MOVE_ENDURE, [TUTOR_MOVE_MUD_SLAP] = MOVE_MUD_SLAP, [TUTOR_MOVE_ICE_PUNCH] = MOVE_ICE_PUNCH, [TUTOR_MOVE_SWAGGER] = MOVE_SWAGGER, [TUTOR_MOVE_SLEEP_TALK] = MOVE_SLEEP_TALK, [TUTOR_MOVE_SWIFT] = MOVE_SWIFT, [TUTOR_MOVE_DEFENSE_CURL] = MOVE_DEFENSE_CURL, [TUTOR_MOVE_THUNDER_PUNCH] = MOVE_THUNDER_PUNCH, [TUTOR_MOVE_FIRE_PUNCH] = MOVE_FIRE_PUNCH, [TUTOR_MOVE_FURY_CUTTER] = MOVE_FURY_CUTTER, [TUTOR_MOVE_NIGHTMARE] = MOVE_NIGHTMARE, [TUTOR_MOVE_SELF_DESTRUCT] = MOVE_SELF_DESTRUCT, [TUTOR_MOVE_SKY_ATTACK] = MOVE_SKY_ATTACK, }; #define TUTOR(move) ((u64)1 << (TUTOR_##move)) static const u64 sTutorLearnsets[] = { [SPECIES_NONE] = (0), [SPECIES_BULBASAUR] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_IVYSAUR] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_VENUSAUR] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_CHARMANDER] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_CHARMELEON] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_CHARIZARD] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SQUIRTLE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_WARTORTLE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_BLASTOISE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_CATERPIE] = (0), [SPECIES_METAPOD] = (0), [SPECIES_BUTTERFREE] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_WEEDLE] = (0), [SPECIES_KAKUNA] = (0), [SPECIES_BEEDRILL] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_PIDGEY] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_PIDGEOTTO] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_PIDGEOT] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_RATTATA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_RATICATE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_SPEAROW] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_FEAROW] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_EKANS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_ARBOK] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_PIKACHU] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH)), [SPECIES_RAICHU] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH)), [SPECIES_SANDSHREW] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SANDSLASH] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_NIDORAN_F] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_NIDORINA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_NIDOQUEEN] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_NIDORAN_M] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_NIDORINO] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_NIDOKING] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_CLEFAIRY] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SOFT_BOILED) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_CLEFABLE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SOFT_BOILED) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_VULPIX] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_NINETALES] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_JIGGLYPUFF] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_WIGGLYTUFF] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_ZUBAT] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_GOLBAT] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_ODDISH] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_GLOOM] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_VILEPLUME] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_PARAS] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_PARASECT] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_VENONAT] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_VENOMOTH] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_DIGLETT] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_DUGTRIO] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_MEOWTH] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_PERSIAN] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_PSYDUCK] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_GOLDUCK] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_MANKEY] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_PRIMEAPE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_GROWLITHE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_ARCANINE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_POLIWAG] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_POLIWHIRL] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_POLIWRATH] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_ABRA] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_KADABRA] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_ALAKAZAM] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_MACHOP] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_MACHOKE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_MACHAMP] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_BELLSPROUT] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_WEEPINBELL] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_VICTREEBEL] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_TENTACOOL] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_TENTACRUEL] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_GEODUDE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_GRAVELER] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_GOLEM] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_PONYTA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_RAPIDASH] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_SLOWPOKE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_SLOWBRO] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_MAGNEMITE] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_MAGNETON] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_FARFETCHD] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_DODUO] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_DODRIO] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_SEEL] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_DEWGONG] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_GRIMER] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_MUK] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SHELLDER] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_CLOYSTER] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_GASTLY] = (TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_HAUNTER] = (TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_GENGAR] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_ONIX] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_DROWZEE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_HYPNO] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_KRABBY] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_KINGLER] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_VOLTORB] = (TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_ELECTRODE] = (TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_EXEGGCUTE] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_EXEGGUTOR] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_CUBONE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_MAROWAK] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_HITMONLEE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_HITMONCHAN] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_LICKITUNG] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_KOFFING] = (TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_WEEZING] = (TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_RHYHORN] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_RHYDON] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_CHANSEY] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SOFT_BOILED) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_TANGELA] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_KANGASKHAN] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_HORSEA] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_SEADRA] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_GOLDEEN] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_SEAKING] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_STARYU] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_STARMIE] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_MR_MIME] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_SCYTHER] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_JYNX] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_ELECTABUZZ] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_MAGMAR] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_PINSIR] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_TAUROS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_MAGIKARP] = (0), [SPECIES_GYARADOS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_LAPRAS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_DITTO] = (0), [SPECIES_EEVEE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_VAPOREON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_JOLTEON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_FLAREON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_PORYGON] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_OMANYTE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_OMASTAR] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_KABUTO] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_KABUTOPS] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_AERODACTYL] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_SNORLAX] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_ARTICUNO] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_ZAPDOS] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_MOLTRES] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_DRATINI] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_DRAGONAIR] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_DRAGONITE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_MEWTWO] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_MEW] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SOFT_BOILED) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SELF_DESTRUCT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_CHIKORITA] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_BAYLEEF] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_MEGANIUM] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_CYNDAQUIL] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_QUILAVA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_TYPHLOSION] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_TOTODILE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_CROCONAW] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_FERALIGATR] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SENTRET] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_FURRET] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_HOOTHOOT] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_NOCTOWL] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_LEDYBA] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH)), [SPECIES_LEDIAN] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH)), [SPECIES_SPINARAK] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_ARIADOS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_CROBAT] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_CHINCHOU] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_LANTURN] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_PICHU] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_CLEFFA] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SOFT_BOILED) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_IGGLYBUFF] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_TOGEPI] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SOFT_BOILED) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_TOGETIC] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SOFT_BOILED) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_NATU] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_XATU] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_MAREEP] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_FLAAFFY] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_AMPHAROS] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_BELLOSSOM] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_MARILL] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_AZUMARILL] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_SUDOWOODO] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_POLITOED] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_HOPPIP] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_SKIPLOOM] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_JUMPLUFF] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_AIPOM] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_SUNKERN] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_SUNFLORA] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_YANMA] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_WOOPER] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_QUAGSIRE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_ESPEON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_UMBREON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_MURKROW] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_SLOWKING] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_MISDREAVUS] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_UNOWN] = (0), [SPECIES_WOBBUFFET] = (0), [SPECIES_GIRAFARIG] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_PINECO] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_FORRETRESS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_DUNSPARCE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_GLIGAR] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_STEELIX] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SNUBBULL] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_GRANBULL] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_QWILFISH] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SCIZOR] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SHUCKLE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_HERACROSS] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SNEASEL] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_TEDDIURSA] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_URSARING] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SLUGMA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_MAGCARGO] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SWINUB] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_PILOSWINE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_CORSOLA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_REMORAID] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_OCTILLERY] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_DELIBIRD] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_MANTINE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_SKARMORY] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_HOUNDOUR] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_HOUNDOOM] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_KINGDRA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_PHANPY] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_DONPHAN] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_PORYGON2] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_STANTLER] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_SMEARGLE] = (0), [SPECIES_TYROGUE] = (TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_HITMONTOP] = (TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_SMOOCHUM] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_ELEKID] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_MAGBY] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_MILTANK] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_BLISSEY] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SOFT_BOILED) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_RAIKOU] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_ENTEI] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_SUICUNE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_LARVITAR] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_PUPITAR] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_TYRANITAR] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_LUGIA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_HO_OH] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_CELEBI] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_TREECKO] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_GROVYLE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SCEPTILE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_TORCHIC] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_COMBUSKEN] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_BLAZIKEN] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_MUDKIP] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_MARSHTOMP] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_SWAMPERT] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_POOCHYENA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_MIGHTYENA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_ZIGZAGOON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_LINOONE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_WURMPLE] = (0), [SPECIES_SILCOON] = (0), [SPECIES_BEAUTIFLY] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_CASCOON] = (0), [SPECIES_DUSTOX] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_LOTAD] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_LOMBRE] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_LUDICOLO] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_SEEDOT] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_NUZLEAF] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SHIFTRY] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_NINCADA] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_NINJASK] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SHEDINJA] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_TAILLOW] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_SWELLOW] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_SHROOMISH] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_BRELOOM] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SPINDA] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_WINGULL] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_PELIPPER] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_SURSKIT] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_MASQUERAIN] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_WAILMER] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_WAILORD] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SKITTY] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_DELCATTY] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_KECLEON] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_BALTOY] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_CLAYDOL] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_NOSEPASS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_TORKOAL] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SABLEYE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_BARBOACH] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_WHISCASH] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_LUVDISC] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_CORPHISH] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_CRAWDAUNT] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_FEEBAS] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_MILOTIC] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_CARVANHA] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SHARPEDO] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_TRAPINCH] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_VIBRAVA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_FLYGON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_MAKUHITA] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_HARIYAMA] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_ELECTRIKE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_MANECTRIC] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_NUMEL] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_CAMERUPT] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SPHEAL] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_SEALEO] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_WALREIN] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_CACNEA] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_CACTURNE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SNORUNT] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_GLALIE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_LUNATONE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SOLROCK] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_AZURILL] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_SPOINK] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_GRUMPIG] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_PLUSLE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH)), [SPECIES_MINUN] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH)), [SPECIES_MAWILE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH)), [SPECIES_MEDITITE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_MEDICHAM] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_SWABLU] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_ALTARIA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_SKY_ATTACK)), [SPECIES_WYNAUT] = (0), [SPECIES_DUSKULL] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_DUSCLOPS] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_ROSELIA] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_SLAKOTH] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_VIGOROTH] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SLAKING] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_GULPIN] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_SWALOT] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_TROPIUS] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_WHISMUR] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_LOUDRED] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_EXPLOUD] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH)), [SPECIES_CLAMPERL] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_HUNTAIL] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_GOREBYSS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT)), [SPECIES_ABSOL] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_SHUPPET] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_BANETTE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_SEVIPER] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_ZANGOOSE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_RELICANTH] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_ARON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_LAIRON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_AGGRON] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_CASTFORM] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_VOLBEAT] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH)), [SPECIES_ILLUMISE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH)), [SPECIES_LILEEP] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_CRADILY] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK)), [SPECIES_ANORITH] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_ARMALDO] = (TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_RALTS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_KIRLIA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_GARDEVOIR] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_BAGON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SHELGON] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_SALAMENCE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_BELDUM] = (0), [SPECIES_METANG] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_METAGROSS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FURY_CUTTER) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_REGIROCK] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_REGICE] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_REGISTEEL] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_EXPLOSION) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_SELF_DESTRUCT)), [SPECIES_KYOGRE] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL)), [SPECIES_GROUDON] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_SWORDS_DANCE) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_RAYQUAZA] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_LATIAS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_LATIOS] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_FURY_CUTTER)), [SPECIES_JIRACHI] = (TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_METRONOME) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_DEOXYS] = (TUTOR(MOVE_MEGA_PUNCH) | TUTOR(MOVE_MEGA_KICK) | TUTOR(MOVE_BODY_SLAM) | TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_COUNTER) | TUTOR(MOVE_SEISMIC_TOSS) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_THUNDER_WAVE) | TUTOR(MOVE_ROCK_SLIDE) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_DYNAMIC_PUNCH) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_MUD_SLAP) | TUTOR(MOVE_ICE_PUNCH) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_SWIFT) | TUTOR(MOVE_THUNDER_PUNCH) | TUTOR(MOVE_FIRE_PUNCH) | TUTOR(MOVE_NIGHTMARE)), [SPECIES_CHIMECHO] = (TUTOR(MOVE_DOUBLE_EDGE) | TUTOR(MOVE_MIMIC) | TUTOR(MOVE_DREAM_EATER) | TUTOR(MOVE_SUBSTITUTE) | TUTOR(MOVE_ROLLOUT) | TUTOR(MOVE_PSYCH_UP) | TUTOR(MOVE_SNORE) | TUTOR(MOVE_ICY_WIND) | TUTOR(MOVE_ENDURE) | TUTOR(MOVE_SWAGGER) | TUTOR(MOVE_SLEEP_TALK) | TUTOR(MOVE_DEFENSE_CURL) | TUTOR(MOVE_NIGHTMARE)), }; ================================================ FILE: src/data/pokemon_graphics/back_pic_coordinates.h ================================================ const struct MonCoords gMonBackPicCoords[] = { [SPECIES_NONE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_BULBASAUR] = { .size = MON_COORDS_SIZE(48, 32), .y_offset = 16, }, [SPECIES_IVYSAUR] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_VENUSAUR] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_CHARMANDER] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_CHARMELEON] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_CHARIZARD] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_SQUIRTLE] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 15, }, [SPECIES_WARTORTLE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_BLASTOISE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_CATERPIE] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 15, }, [SPECIES_METAPOD] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_BUTTERFREE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_WEEDLE] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11, }, [SPECIES_KAKUNA] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 10, }, [SPECIES_BEEDRILL] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_PIDGEY] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_PIDGEOTTO] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 12, }, [SPECIES_PIDGEOT] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_RATTATA] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13, }, [SPECIES_RATICATE] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13, }, [SPECIES_SPEAROW] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_FEAROW] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_EKANS] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_ARBOK] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_PIKACHU] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_RAICHU] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_SANDSHREW] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_SANDSLASH] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_NIDORAN_F] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_NIDORINA] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_NIDOQUEEN] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_NIDORAN_M] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 8, }, [SPECIES_NIDORINO] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_NIDOKING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_CLEFAIRY] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_CLEFABLE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_VULPIX] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_NINETALES] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_JIGGLYPUFF] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_WIGGLYTUFF] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_ZUBAT] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_GOLBAT] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_ODDISH] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_GLOOM] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_VILEPLUME] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_PARAS] = { .size = MON_COORDS_SIZE(48, 24), .y_offset = 20, }, [SPECIES_PARASECT] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_VENONAT] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_VENOMOTH] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_DIGLETT] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16, }, [SPECIES_DUGTRIO] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_MEOWTH] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_PERSIAN] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_PSYDUCK] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_GOLDUCK] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_MANKEY] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_PRIMEAPE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_GROWLITHE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_ARCANINE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_POLIWAG] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 16, }, [SPECIES_POLIWHIRL] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_POLIWRATH] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_ABRA] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_KADABRA] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_ALAKAZAM] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_MACHOP] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_MACHOKE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_MACHAMP] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 4, }, [SPECIES_BELLSPROUT] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_WEEPINBELL] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_VICTREEBEL] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_TENTACOOL] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10, }, [SPECIES_TENTACRUEL] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 11, }, [SPECIES_GEODUDE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_GRAVELER] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 12, }, [SPECIES_GOLEM] = { .size = MON_COORDS_SIZE(64, 32), .y_offset = 16, }, [SPECIES_PONYTA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_RAPIDASH] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_SLOWPOKE] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14, }, [SPECIES_SLOWBRO] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_MAGNEMITE] = { .size = MON_COORDS_SIZE(32, 24), .y_offset = 20, }, [SPECIES_MAGNETON] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_FARFETCHD] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_DODUO] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_DODRIO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_SEEL] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_DEWGONG] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_GRIMER] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13, }, [SPECIES_MUK] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_SHELLDER] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_CLOYSTER] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_GASTLY] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14, }, [SPECIES_HAUNTER] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_GENGAR] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_ONIX] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0, }, [SPECIES_DROWZEE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_HYPNO] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_KRABBY] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_KINGLER] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_VOLTORB] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14, }, [SPECIES_ELECTRODE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_EXEGGCUTE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_EXEGGUTOR] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_CUBONE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_MAROWAK] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_HITMONLEE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_HITMONCHAN] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_LICKITUNG] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14, }, [SPECIES_KOFFING] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_WEEZING] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 12, }, [SPECIES_RHYHORN] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 12, }, [SPECIES_RHYDON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_CHANSEY] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14, }, [SPECIES_TANGELA] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14, }, [SPECIES_KANGASKHAN] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_HORSEA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_SEADRA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_GOLDEEN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_SEAKING] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_STARYU] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13, }, [SPECIES_STARMIE] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14, }, [SPECIES_MR_MIME] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_SCYTHER] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_JYNX] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_ELECTABUZZ] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_MAGMAR] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_PINSIR] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_TAUROS] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_MAGIKARP] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_GYARADOS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_LAPRAS] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_DITTO] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 17, }, [SPECIES_EEVEE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_VAPOREON] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_JOLTEON] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_FLAREON] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 5, }, [SPECIES_PORYGON] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_OMANYTE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_OMASTAR] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_KABUTO] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_KABUTOPS] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_AERODACTYL] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_SNORLAX] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 11, }, [SPECIES_ARTICUNO] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_ZAPDOS] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_MOLTRES] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_DRATINI] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_DRAGONAIR] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0, }, [SPECIES_DRAGONITE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_MEWTWO] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 1, }, [SPECIES_MEW] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_CHIKORITA] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10, }, [SPECIES_BAYLEEF] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_MEGANIUM] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0, }, [SPECIES_CYNDAQUIL] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_QUILAVA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_TYPHLOSION] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_TOTODILE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_CROCONAW] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_FERALIGATR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_SENTRET] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 5, }, [SPECIES_FURRET] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_HOOTHOOT] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_NOCTOWL] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 3, }, [SPECIES_LEDYBA] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_LEDIAN] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_SPINARAK] = { .size = MON_COORDS_SIZE(56, 24), .y_offset = 21, }, [SPECIES_ARIADOS] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 11, }, [SPECIES_CROBAT] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_CHINCHOU] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_LANTURN] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_PICHU] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_CLEFFA] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 15, }, [SPECIES_IGGLYBUFF] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_TOGEPI] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16, }, [SPECIES_TOGETIC] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_NATU] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 17, }, [SPECIES_XATU] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_MAREEP] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_FLAAFFY] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_AMPHAROS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_BELLOSSOM] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_MARILL] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 12, }, [SPECIES_AZUMARILL] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_SUDOWOODO] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_POLITOED] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_HOPPIP] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_SKIPLOOM] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_JUMPLUFF] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_AIPOM] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_SUNKERN] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10, }, [SPECIES_SUNFLORA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_YANMA] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_WOOPER] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 15, }, [SPECIES_QUAGSIRE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_ESPEON] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_UMBREON] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_MURKROW] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_SLOWKING] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_MISDREAVUS] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_UNOWN] = { .size = MON_COORDS_SIZE(24, 48), .y_offset = 8, }, [SPECIES_WOBBUFFET] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 12, }, [SPECIES_GIRAFARIG] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_PINECO] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 15, }, [SPECIES_FORRETRESS] = { .size = MON_COORDS_SIZE(64, 32), .y_offset = 16, }, [SPECIES_DUNSPARCE] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 15, }, [SPECIES_GLIGAR] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_STEELIX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SNUBBULL] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_GRANBULL] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_QWILFISH] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_SCIZOR] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_SHUCKLE] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11, }, [SPECIES_HERACROSS] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_SNEASEL] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_TEDDIURSA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_URSARING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_SLUGMA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_MAGCARGO] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_SWINUB] = { .size = MON_COORDS_SIZE(48, 24), .y_offset = 21, }, [SPECIES_PILOSWINE] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13, }, [SPECIES_CORSOLA] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_REMORAID] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13, }, [SPECIES_OCTILLERY] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_DELIBIRD] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6, }, [SPECIES_MANTINE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_SKARMORY] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_HOUNDOUR] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_HOUNDOOM] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_KINGDRA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_PHANPY] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14, }, [SPECIES_DONPHAN] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_PORYGON2] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_STANTLER] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3, }, [SPECIES_SMEARGLE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_TYROGUE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_HITMONTOP] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_SMOOCHUM] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 9, }, [SPECIES_ELEKID] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_MAGBY] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_MILTANK] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_BLISSEY] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_RAIKOU] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_ENTEI] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_SUICUNE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_LARVITAR] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_PUPITAR] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 5, }, [SPECIES_TYRANITAR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_LUGIA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_HO_OH] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_CELEBI] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_OLD_UNOWN_B] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_C] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_D] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_E] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_F] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_G] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_H] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_I] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_J] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_K] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_L] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_M] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_N] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_O] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_P] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_Q] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_R] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_S] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_T] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_U] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_V] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_W] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_X] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_Y] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_OLD_UNOWN_Z] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_TREECKO] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_GROVYLE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_SCEPTILE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_TORCHIC] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 5, }, [SPECIES_COMBUSKEN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_BLAZIKEN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_MUDKIP] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_MARSHTOMP] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_SWAMPERT] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_POOCHYENA] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_MIGHTYENA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_ZIGZAGOON] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_LINOONE] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 15, }, [SPECIES_WURMPLE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_SILCOON] = { .size = MON_COORDS_SIZE(64, 24), .y_offset = 21, }, [SPECIES_BEAUTIFLY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_CASCOON] = { .size = MON_COORDS_SIZE(56, 24), .y_offset = 20, }, [SPECIES_DUSTOX] = { .size = MON_COORDS_SIZE(64, 24), .y_offset = 20, }, [SPECIES_LOTAD] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 15, }, [SPECIES_LOMBRE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_LUDICOLO] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_SEEDOT] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_NUZLEAF] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_SHIFTRY] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_NINCADA] = { .size = MON_COORDS_SIZE(64, 24), .y_offset = 20, }, [SPECIES_NINJASK] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_SHEDINJA] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_TAILLOW] = { .size = MON_COORDS_SIZE(48, 32), .y_offset = 17, }, [SPECIES_SWELLOW] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_SHROOMISH] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_BRELOOM] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_SPINDA] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_WINGULL] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14, }, [SPECIES_PELIPPER] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_SURSKIT] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 11, }, [SPECIES_MASQUERAIN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_WAILMER] = { .size = MON_COORDS_SIZE(64, 24), .y_offset = 21, }, [SPECIES_WAILORD] = { .size = MON_COORDS_SIZE(64, 24), .y_offset = 22, }, [SPECIES_SKITTY] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_DELCATTY] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_KECLEON] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_BALTOY] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_CLAYDOL] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_NOSEPASS] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 12, }, [SPECIES_TORKOAL] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_SABLEYE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_BARBOACH] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_WHISCASH] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_LUVDISC] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 10, }, [SPECIES_CORPHISH] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_CRAWDAUNT] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_FEEBAS] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_MILOTIC] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 2, }, [SPECIES_CARVANHA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_SHARPEDO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_TRAPINCH] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 14, }, [SPECIES_VIBRAVA] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 17, }, [SPECIES_FLYGON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_MAKUHITA] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_HARIYAMA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_ELECTRIKE] = { .size = MON_COORDS_SIZE(64, 32), .y_offset = 16, }, [SPECIES_MANECTRIC] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_NUMEL] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 11, }, [SPECIES_CAMERUPT] = { .size = MON_COORDS_SIZE(64, 32), .y_offset = 19, }, [SPECIES_SPHEAL] = { .size = MON_COORDS_SIZE(48, 32), .y_offset = 18, }, [SPECIES_SEALEO] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_WALREIN] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_CACNEA] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 15, }, [SPECIES_CACTURNE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_SNORUNT] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_GLALIE] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 12, }, [SPECIES_LUNATONE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_SOLROCK] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_AZURILL] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_SPOINK] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11, }, [SPECIES_GRUMPIG] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_PLUSLE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_MINUN] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_MAWILE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_MEDITITE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_MEDICHAM] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 3, }, [SPECIES_SWABLU] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_ALTARIA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_WYNAUT] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_DUSKULL] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_DUSCLOPS] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_ROSELIA] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_SLAKOTH] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 15, }, [SPECIES_VIGOROTH] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_SLAKING] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_GULPIN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_SWALOT] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_TROPIUS] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_WHISMUR] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_LOUDRED] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_EXPLOUD] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_CLAMPERL] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_HUNTAIL] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 2, }, [SPECIES_GOREBYSS] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_ABSOL] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3, }, [SPECIES_SHUPPET] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_BANETTE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_SEVIPER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_ZANGOOSE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_RELICANTH] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_ARON] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 17, }, [SPECIES_LAIRON] = { .size = MON_COORDS_SIZE(64, 32), .y_offset = 17, }, [SPECIES_AGGRON] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_CASTFORM] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 13, }, [SPECIES_VOLBEAT] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_ILLUMISE] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6, }, [SPECIES_LILEEP] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_CRADILY] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_ANORITH] = { .size = MON_COORDS_SIZE(64, 24), .y_offset = 23, }, [SPECIES_ARMALDO] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_RALTS] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 13, }, [SPECIES_KIRLIA] = { .size = MON_COORDS_SIZE(40, 56), .y_offset = 6, }, [SPECIES_GARDEVOIR] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_BAGON] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_SHELGON] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 13, }, [SPECIES_SALAMENCE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_BELDUM] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_METANG] = { .size = MON_COORDS_SIZE(64, 32), .y_offset = 16, }, [SPECIES_METAGROSS] = { .size = MON_COORDS_SIZE(64, 24), .y_offset = 20, }, [SPECIES_REGIROCK] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_REGICE] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14, }, [SPECIES_REGISTEEL] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 14, }, [SPECIES_KYOGRE] = { .size = MON_COORDS_SIZE(64, 32), .y_offset = 19, }, [SPECIES_GROUDON] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_RAYQUAZA] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0, }, [SPECIES_LATIAS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_LATIOS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_JIRACHI] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_DEOXYS] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_CHIMECHO] = { .size = MON_COORDS_SIZE(32, 56), .y_offset = 7, }, [SPECIES_EGG] = { .size = MON_COORDS_SIZE(24, 48), .y_offset = 10, }, [SPECIES_UNOWN_B] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 9, }, [SPECIES_UNOWN_C] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6, }, [SPECIES_UNOWN_D] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 8, }, [SPECIES_UNOWN_E] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10, }, [SPECIES_UNOWN_F] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_UNOWN_G] = { .size = MON_COORDS_SIZE(40, 56), .y_offset = 5, }, [SPECIES_UNOWN_H] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_UNOWN_I] = { .size = MON_COORDS_SIZE(24, 56), .y_offset = 7, }, [SPECIES_UNOWN_J] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 9, }, [SPECIES_UNOWN_K] = { .size = MON_COORDS_SIZE(40, 56), .y_offset = 7, }, [SPECIES_UNOWN_L] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 10, }, [SPECIES_UNOWN_M] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_UNOWN_N] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_UNOWN_O] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_UNOWN_P] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 10, }, [SPECIES_UNOWN_Q] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 15, }, [SPECIES_UNOWN_R] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 12, }, [SPECIES_UNOWN_S] = { .size = MON_COORDS_SIZE(40, 56), .y_offset = 4, }, [SPECIES_UNOWN_T] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 13, }, [SPECIES_UNOWN_U] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_UNOWN_V] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11, }, [SPECIES_UNOWN_W] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 13, }, [SPECIES_UNOWN_X] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 15, }, [SPECIES_UNOWN_Y] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 10, }, [SPECIES_UNOWN_Z] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 10, }, [SPECIES_UNOWN_EMARK] = { .size = MON_COORDS_SIZE(24, 56), .y_offset = 6, }, [SPECIES_UNOWN_QMARK] = { .size = MON_COORDS_SIZE(32, 56), .y_offset = 6, }, }; ================================================ FILE: src/data/pokemon_graphics/back_pic_table.h ================================================ const struct CompressedSpriteSheet gMonBackPicTable[] = { SPECIES_SPRITE(NONE, gMonBackPic_CircledQuestionMark), SPECIES_SPRITE(BULBASAUR, gMonBackPic_Bulbasaur), SPECIES_SPRITE(IVYSAUR, gMonBackPic_Ivysaur), SPECIES_SPRITE(VENUSAUR, gMonBackPic_Venusaur), SPECIES_SPRITE(CHARMANDER, gMonBackPic_Charmander), SPECIES_SPRITE(CHARMELEON, gMonBackPic_Charmeleon), SPECIES_SPRITE(CHARIZARD, gMonBackPic_Charizard), SPECIES_SPRITE(SQUIRTLE, gMonBackPic_Squirtle), SPECIES_SPRITE(WARTORTLE, gMonBackPic_Wartortle), SPECIES_SPRITE(BLASTOISE, gMonBackPic_Blastoise), SPECIES_SPRITE(CATERPIE, gMonBackPic_Caterpie), SPECIES_SPRITE(METAPOD, gMonBackPic_Metapod), SPECIES_SPRITE(BUTTERFREE, gMonBackPic_Butterfree), SPECIES_SPRITE(WEEDLE, gMonBackPic_Weedle), SPECIES_SPRITE(KAKUNA, gMonBackPic_Kakuna), SPECIES_SPRITE(BEEDRILL, gMonBackPic_Beedrill), SPECIES_SPRITE(PIDGEY, gMonBackPic_Pidgey), SPECIES_SPRITE(PIDGEOTTO, gMonBackPic_Pidgeotto), SPECIES_SPRITE(PIDGEOT, gMonBackPic_Pidgeot), SPECIES_SPRITE(RATTATA, gMonBackPic_Rattata), SPECIES_SPRITE(RATICATE, gMonBackPic_Raticate), SPECIES_SPRITE(SPEAROW, gMonBackPic_Spearow), SPECIES_SPRITE(FEAROW, gMonBackPic_Fearow), SPECIES_SPRITE(EKANS, gMonBackPic_Ekans), SPECIES_SPRITE(ARBOK, gMonBackPic_Arbok), SPECIES_SPRITE(PIKACHU, gMonBackPic_Pikachu), SPECIES_SPRITE(RAICHU, gMonBackPic_Raichu), SPECIES_SPRITE(SANDSHREW, gMonBackPic_Sandshrew), SPECIES_SPRITE(SANDSLASH, gMonBackPic_Sandslash), SPECIES_SPRITE(NIDORAN_F, gMonBackPic_NidoranF), SPECIES_SPRITE(NIDORINA, gMonBackPic_Nidorina), SPECIES_SPRITE(NIDOQUEEN, gMonBackPic_Nidoqueen), SPECIES_SPRITE(NIDORAN_M, gMonBackPic_NidoranM), SPECIES_SPRITE(NIDORINO, gMonBackPic_Nidorino), SPECIES_SPRITE(NIDOKING, gMonBackPic_Nidoking), SPECIES_SPRITE(CLEFAIRY, gMonBackPic_Clefairy), SPECIES_SPRITE(CLEFABLE, gMonBackPic_Clefable), SPECIES_SPRITE(VULPIX, gMonBackPic_Vulpix), SPECIES_SPRITE(NINETALES, gMonBackPic_Ninetales), SPECIES_SPRITE(JIGGLYPUFF, gMonBackPic_Jigglypuff), SPECIES_SPRITE(WIGGLYTUFF, gMonBackPic_Wigglytuff), SPECIES_SPRITE(ZUBAT, gMonBackPic_Zubat), SPECIES_SPRITE(GOLBAT, gMonBackPic_Golbat), SPECIES_SPRITE(ODDISH, gMonBackPic_Oddish), SPECIES_SPRITE(GLOOM, gMonBackPic_Gloom), SPECIES_SPRITE(VILEPLUME, gMonBackPic_Vileplume), SPECIES_SPRITE(PARAS, gMonBackPic_Paras), SPECIES_SPRITE(PARASECT, gMonBackPic_Parasect), SPECIES_SPRITE(VENONAT, gMonBackPic_Venonat), SPECIES_SPRITE(VENOMOTH, gMonBackPic_Venomoth), SPECIES_SPRITE(DIGLETT, gMonBackPic_Diglett), SPECIES_SPRITE(DUGTRIO, gMonBackPic_Dugtrio), SPECIES_SPRITE(MEOWTH, gMonBackPic_Meowth), SPECIES_SPRITE(PERSIAN, gMonBackPic_Persian), SPECIES_SPRITE(PSYDUCK, gMonBackPic_Psyduck), SPECIES_SPRITE(GOLDUCK, gMonBackPic_Golduck), SPECIES_SPRITE(MANKEY, gMonBackPic_Mankey), SPECIES_SPRITE(PRIMEAPE, gMonBackPic_Primeape), SPECIES_SPRITE(GROWLITHE, gMonBackPic_Growlithe), SPECIES_SPRITE(ARCANINE, gMonBackPic_Arcanine), SPECIES_SPRITE(POLIWAG, gMonBackPic_Poliwag), SPECIES_SPRITE(POLIWHIRL, gMonBackPic_Poliwhirl), SPECIES_SPRITE(POLIWRATH, gMonBackPic_Poliwrath), SPECIES_SPRITE(ABRA, gMonBackPic_Abra), SPECIES_SPRITE(KADABRA, gMonBackPic_Kadabra), SPECIES_SPRITE(ALAKAZAM, gMonBackPic_Alakazam), SPECIES_SPRITE(MACHOP, gMonBackPic_Machop), SPECIES_SPRITE(MACHOKE, gMonBackPic_Machoke), SPECIES_SPRITE(MACHAMP, gMonBackPic_Machamp), SPECIES_SPRITE(BELLSPROUT, gMonBackPic_Bellsprout), SPECIES_SPRITE(WEEPINBELL, gMonBackPic_Weepinbell), SPECIES_SPRITE(VICTREEBEL, gMonBackPic_Victreebel), SPECIES_SPRITE(TENTACOOL, gMonBackPic_Tentacool), SPECIES_SPRITE(TENTACRUEL, gMonBackPic_Tentacruel), SPECIES_SPRITE(GEODUDE, gMonBackPic_Geodude), SPECIES_SPRITE(GRAVELER, gMonBackPic_Graveler), SPECIES_SPRITE(GOLEM, gMonBackPic_Golem), SPECIES_SPRITE(PONYTA, gMonBackPic_Ponyta), SPECIES_SPRITE(RAPIDASH, gMonBackPic_Rapidash), SPECIES_SPRITE(SLOWPOKE, gMonBackPic_Slowpoke), SPECIES_SPRITE(SLOWBRO, gMonBackPic_Slowbro), SPECIES_SPRITE(MAGNEMITE, gMonBackPic_Magnemite), SPECIES_SPRITE(MAGNETON, gMonBackPic_Magneton), SPECIES_SPRITE(FARFETCHD, gMonBackPic_Farfetchd), SPECIES_SPRITE(DODUO, gMonBackPic_Doduo), SPECIES_SPRITE(DODRIO, gMonBackPic_Dodrio), SPECIES_SPRITE(SEEL, gMonBackPic_Seel), SPECIES_SPRITE(DEWGONG, gMonBackPic_Dewgong), SPECIES_SPRITE(GRIMER, gMonBackPic_Grimer), SPECIES_SPRITE(MUK, gMonBackPic_Muk), SPECIES_SPRITE(SHELLDER, gMonBackPic_Shellder), SPECIES_SPRITE(CLOYSTER, gMonBackPic_Cloyster), SPECIES_SPRITE(GASTLY, gMonBackPic_Gastly), SPECIES_SPRITE(HAUNTER, gMonBackPic_Haunter), SPECIES_SPRITE(GENGAR, gMonBackPic_Gengar), SPECIES_SPRITE(ONIX, gMonBackPic_Onix), SPECIES_SPRITE(DROWZEE, gMonBackPic_Drowzee), SPECIES_SPRITE(HYPNO, gMonBackPic_Hypno), SPECIES_SPRITE(KRABBY, gMonBackPic_Krabby), SPECIES_SPRITE(KINGLER, gMonBackPic_Kingler), SPECIES_SPRITE(VOLTORB, gMonBackPic_Voltorb), SPECIES_SPRITE(ELECTRODE, gMonBackPic_Electrode), SPECIES_SPRITE(EXEGGCUTE, gMonBackPic_Exeggcute), SPECIES_SPRITE(EXEGGUTOR, gMonBackPic_Exeggutor), SPECIES_SPRITE(CUBONE, gMonBackPic_Cubone), SPECIES_SPRITE(MAROWAK, gMonBackPic_Marowak), SPECIES_SPRITE(HITMONLEE, gMonBackPic_Hitmonlee), SPECIES_SPRITE(HITMONCHAN, gMonBackPic_Hitmonchan), SPECIES_SPRITE(LICKITUNG, gMonBackPic_Lickitung), SPECIES_SPRITE(KOFFING, gMonBackPic_Koffing), SPECIES_SPRITE(WEEZING, gMonBackPic_Weezing), SPECIES_SPRITE(RHYHORN, gMonBackPic_Rhyhorn), SPECIES_SPRITE(RHYDON, gMonBackPic_Rhydon), SPECIES_SPRITE(CHANSEY, gMonBackPic_Chansey), SPECIES_SPRITE(TANGELA, gMonBackPic_Tangela), SPECIES_SPRITE(KANGASKHAN, gMonBackPic_Kangaskhan), SPECIES_SPRITE(HORSEA, gMonBackPic_Horsea), SPECIES_SPRITE(SEADRA, gMonBackPic_Seadra), SPECIES_SPRITE(GOLDEEN, gMonBackPic_Goldeen), SPECIES_SPRITE(SEAKING, gMonBackPic_Seaking), SPECIES_SPRITE(STARYU, gMonBackPic_Staryu), SPECIES_SPRITE(STARMIE, gMonBackPic_Starmie), SPECIES_SPRITE(MR_MIME, gMonBackPic_Mrmime), SPECIES_SPRITE(SCYTHER, gMonBackPic_Scyther), SPECIES_SPRITE(JYNX, gMonBackPic_Jynx), SPECIES_SPRITE(ELECTABUZZ, gMonBackPic_Electabuzz), SPECIES_SPRITE(MAGMAR, gMonBackPic_Magmar), SPECIES_SPRITE(PINSIR, gMonBackPic_Pinsir), SPECIES_SPRITE(TAUROS, gMonBackPic_Tauros), SPECIES_SPRITE(MAGIKARP, gMonBackPic_Magikarp), SPECIES_SPRITE(GYARADOS, gMonBackPic_Gyarados), SPECIES_SPRITE(LAPRAS, gMonBackPic_Lapras), SPECIES_SPRITE(DITTO, gMonBackPic_Ditto), SPECIES_SPRITE(EEVEE, gMonBackPic_Eevee), SPECIES_SPRITE(VAPOREON, gMonBackPic_Vaporeon), SPECIES_SPRITE(JOLTEON, gMonBackPic_Jolteon), SPECIES_SPRITE(FLAREON, gMonBackPic_Flareon), SPECIES_SPRITE(PORYGON, gMonBackPic_Porygon), SPECIES_SPRITE(OMANYTE, gMonBackPic_Omanyte), SPECIES_SPRITE(OMASTAR, gMonBackPic_Omastar), SPECIES_SPRITE(KABUTO, gMonBackPic_Kabuto), SPECIES_SPRITE(KABUTOPS, gMonBackPic_Kabutops), SPECIES_SPRITE(AERODACTYL, gMonBackPic_Aerodactyl), SPECIES_SPRITE(SNORLAX, gMonBackPic_Snorlax), SPECIES_SPRITE(ARTICUNO, gMonBackPic_Articuno), SPECIES_SPRITE(ZAPDOS, gMonBackPic_Zapdos), SPECIES_SPRITE(MOLTRES, gMonBackPic_Moltres), SPECIES_SPRITE(DRATINI, gMonBackPic_Dratini), SPECIES_SPRITE(DRAGONAIR, gMonBackPic_Dragonair), SPECIES_SPRITE(DRAGONITE, gMonBackPic_Dragonite), SPECIES_SPRITE(MEWTWO, gMonBackPic_Mewtwo), SPECIES_SPRITE(MEW, gMonBackPic_Mew), SPECIES_SPRITE(CHIKORITA, gMonBackPic_Chikorita), SPECIES_SPRITE(BAYLEEF, gMonBackPic_Bayleef), SPECIES_SPRITE(MEGANIUM, gMonBackPic_Meganium), SPECIES_SPRITE(CYNDAQUIL, gMonBackPic_Cyndaquil), SPECIES_SPRITE(QUILAVA, gMonBackPic_Quilava), SPECIES_SPRITE(TYPHLOSION, gMonBackPic_Typhlosion), SPECIES_SPRITE(TOTODILE, gMonBackPic_Totodile), SPECIES_SPRITE(CROCONAW, gMonBackPic_Croconaw), SPECIES_SPRITE(FERALIGATR, gMonBackPic_Feraligatr), SPECIES_SPRITE(SENTRET, gMonBackPic_Sentret), SPECIES_SPRITE(FURRET, gMonBackPic_Furret), SPECIES_SPRITE(HOOTHOOT, gMonBackPic_Hoothoot), SPECIES_SPRITE(NOCTOWL, gMonBackPic_Noctowl), SPECIES_SPRITE(LEDYBA, gMonBackPic_Ledyba), SPECIES_SPRITE(LEDIAN, gMonBackPic_Ledian), SPECIES_SPRITE(SPINARAK, gMonBackPic_Spinarak), SPECIES_SPRITE(ARIADOS, gMonBackPic_Ariados), SPECIES_SPRITE(CROBAT, gMonBackPic_Crobat), SPECIES_SPRITE(CHINCHOU, gMonBackPic_Chinchou), SPECIES_SPRITE(LANTURN, gMonBackPic_Lanturn), SPECIES_SPRITE(PICHU, gMonBackPic_Pichu), SPECIES_SPRITE(CLEFFA, gMonBackPic_Cleffa), SPECIES_SPRITE(IGGLYBUFF, gMonBackPic_Igglybuff), SPECIES_SPRITE(TOGEPI, gMonBackPic_Togepi), SPECIES_SPRITE(TOGETIC, gMonBackPic_Togetic), SPECIES_SPRITE(NATU, gMonBackPic_Natu), SPECIES_SPRITE(XATU, gMonBackPic_Xatu), SPECIES_SPRITE(MAREEP, gMonBackPic_Mareep), SPECIES_SPRITE(FLAAFFY, gMonBackPic_Flaaffy), SPECIES_SPRITE(AMPHAROS, gMonBackPic_Ampharos), SPECIES_SPRITE(BELLOSSOM, gMonBackPic_Bellossom), SPECIES_SPRITE(MARILL, gMonBackPic_Marill), SPECIES_SPRITE(AZUMARILL, gMonBackPic_Azumarill), SPECIES_SPRITE(SUDOWOODO, gMonBackPic_Sudowoodo), SPECIES_SPRITE(POLITOED, gMonBackPic_Politoed), SPECIES_SPRITE(HOPPIP, gMonBackPic_Hoppip), SPECIES_SPRITE(SKIPLOOM, gMonBackPic_Skiploom), SPECIES_SPRITE(JUMPLUFF, gMonBackPic_Jumpluff), SPECIES_SPRITE(AIPOM, gMonBackPic_Aipom), SPECIES_SPRITE(SUNKERN, gMonBackPic_Sunkern), SPECIES_SPRITE(SUNFLORA, gMonBackPic_Sunflora), SPECIES_SPRITE(YANMA, gMonBackPic_Yanma), SPECIES_SPRITE(WOOPER, gMonBackPic_Wooper), SPECIES_SPRITE(QUAGSIRE, gMonBackPic_Quagsire), SPECIES_SPRITE(ESPEON, gMonBackPic_Espeon), SPECIES_SPRITE(UMBREON, gMonBackPic_Umbreon), SPECIES_SPRITE(MURKROW, gMonBackPic_Murkrow), SPECIES_SPRITE(SLOWKING, gMonBackPic_Slowking), SPECIES_SPRITE(MISDREAVUS, gMonBackPic_Misdreavus), SPECIES_SPRITE(UNOWN, gMonBackPic_UnownA), SPECIES_SPRITE(WOBBUFFET, gMonBackPic_Wobbuffet), SPECIES_SPRITE(GIRAFARIG, gMonBackPic_Girafarig), SPECIES_SPRITE(PINECO, gMonBackPic_Pineco), SPECIES_SPRITE(FORRETRESS, gMonBackPic_Forretress), SPECIES_SPRITE(DUNSPARCE, gMonBackPic_Dunsparce), SPECIES_SPRITE(GLIGAR, gMonBackPic_Gligar), SPECIES_SPRITE(STEELIX, gMonBackPic_Steelix), SPECIES_SPRITE(SNUBBULL, gMonBackPic_Snubbull), SPECIES_SPRITE(GRANBULL, gMonBackPic_Granbull), SPECIES_SPRITE(QWILFISH, gMonBackPic_Qwilfish), SPECIES_SPRITE(SCIZOR, gMonBackPic_Scizor), SPECIES_SPRITE(SHUCKLE, gMonBackPic_Shuckle), SPECIES_SPRITE(HERACROSS, gMonBackPic_Heracross), SPECIES_SPRITE(SNEASEL, gMonBackPic_Sneasel), SPECIES_SPRITE(TEDDIURSA, gMonBackPic_Teddiursa), SPECIES_SPRITE(URSARING, gMonBackPic_Ursaring), SPECIES_SPRITE(SLUGMA, gMonBackPic_Slugma), SPECIES_SPRITE(MAGCARGO, gMonBackPic_Magcargo), SPECIES_SPRITE(SWINUB, gMonBackPic_Swinub), SPECIES_SPRITE(PILOSWINE, gMonBackPic_Piloswine), SPECIES_SPRITE(CORSOLA, gMonBackPic_Corsola), SPECIES_SPRITE(REMORAID, gMonBackPic_Remoraid), SPECIES_SPRITE(OCTILLERY, gMonBackPic_Octillery), SPECIES_SPRITE(DELIBIRD, gMonBackPic_Delibird), SPECIES_SPRITE(MANTINE, gMonBackPic_Mantine), SPECIES_SPRITE(SKARMORY, gMonBackPic_Skarmory), SPECIES_SPRITE(HOUNDOUR, gMonBackPic_Houndour), SPECIES_SPRITE(HOUNDOOM, gMonBackPic_Houndoom), SPECIES_SPRITE(KINGDRA, gMonBackPic_Kingdra), SPECIES_SPRITE(PHANPY, gMonBackPic_Phanpy), SPECIES_SPRITE(DONPHAN, gMonBackPic_Donphan), SPECIES_SPRITE(PORYGON2, gMonBackPic_Porygon2), SPECIES_SPRITE(STANTLER, gMonBackPic_Stantler), SPECIES_SPRITE(SMEARGLE, gMonBackPic_Smeargle), SPECIES_SPRITE(TYROGUE, gMonBackPic_Tyrogue), SPECIES_SPRITE(HITMONTOP, gMonBackPic_Hitmontop), SPECIES_SPRITE(SMOOCHUM, gMonBackPic_Smoochum), SPECIES_SPRITE(ELEKID, gMonBackPic_Elekid), SPECIES_SPRITE(MAGBY, gMonBackPic_Magby), SPECIES_SPRITE(MILTANK, gMonBackPic_Miltank), SPECIES_SPRITE(BLISSEY, gMonBackPic_Blissey), SPECIES_SPRITE(RAIKOU, gMonBackPic_Raikou), SPECIES_SPRITE(ENTEI, gMonBackPic_Entei), SPECIES_SPRITE(SUICUNE, gMonBackPic_Suicune), SPECIES_SPRITE(LARVITAR, gMonBackPic_Larvitar), SPECIES_SPRITE(PUPITAR, gMonBackPic_Pupitar), SPECIES_SPRITE(TYRANITAR, gMonBackPic_Tyranitar), SPECIES_SPRITE(LUGIA, gMonBackPic_Lugia), SPECIES_SPRITE(HO_OH, gMonBackPic_HoOh), SPECIES_SPRITE(CELEBI, gMonBackPic_Celebi), SPECIES_SPRITE(OLD_UNOWN_B, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_C, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_D, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_E, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_F, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_G, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_H, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_I, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_J, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_K, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_L, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_M, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_N, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_O, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_P, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_Q, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_R, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_S, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_T, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_U, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_V, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_W, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_X, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_Y, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_Z, gMonBackPic_DoubleQuestionMark), SPECIES_SPRITE(TREECKO, gMonBackPic_Treecko), SPECIES_SPRITE(GROVYLE, gMonBackPic_Grovyle), SPECIES_SPRITE(SCEPTILE, gMonBackPic_Sceptile), SPECIES_SPRITE(TORCHIC, gMonBackPic_Torchic), SPECIES_SPRITE(COMBUSKEN, gMonBackPic_Combusken), SPECIES_SPRITE(BLAZIKEN, gMonBackPic_Blaziken), SPECIES_SPRITE(MUDKIP, gMonBackPic_Mudkip), SPECIES_SPRITE(MARSHTOMP, gMonBackPic_Marshtomp), SPECIES_SPRITE(SWAMPERT, gMonBackPic_Swampert), SPECIES_SPRITE(POOCHYENA, gMonBackPic_Poochyena), SPECIES_SPRITE(MIGHTYENA, gMonBackPic_Mightyena), SPECIES_SPRITE(ZIGZAGOON, gMonBackPic_Zigzagoon), SPECIES_SPRITE(LINOONE, gMonBackPic_Linoone), SPECIES_SPRITE(WURMPLE, gMonBackPic_Wurmple), SPECIES_SPRITE(SILCOON, gMonBackPic_Silcoon), SPECIES_SPRITE(BEAUTIFLY, gMonBackPic_Beautifly), SPECIES_SPRITE(CASCOON, gMonBackPic_Cascoon), SPECIES_SPRITE(DUSTOX, gMonBackPic_Dustox), SPECIES_SPRITE(LOTAD, gMonBackPic_Lotad), SPECIES_SPRITE(LOMBRE, gMonBackPic_Lombre), SPECIES_SPRITE(LUDICOLO, gMonBackPic_Ludicolo), SPECIES_SPRITE(SEEDOT, gMonBackPic_Seedot), SPECIES_SPRITE(NUZLEAF, gMonBackPic_Nuzleaf), SPECIES_SPRITE(SHIFTRY, gMonBackPic_Shiftry), SPECIES_SPRITE(NINCADA, gMonBackPic_Nincada), SPECIES_SPRITE(NINJASK, gMonBackPic_Ninjask), SPECIES_SPRITE(SHEDINJA, gMonBackPic_Shedinja), SPECIES_SPRITE(TAILLOW, gMonBackPic_Taillow), SPECIES_SPRITE(SWELLOW, gMonBackPic_Swellow), SPECIES_SPRITE(SHROOMISH, gMonBackPic_Shroomish), SPECIES_SPRITE(BRELOOM, gMonBackPic_Breloom), SPECIES_SPRITE(SPINDA, gMonBackPic_Spinda), SPECIES_SPRITE(WINGULL, gMonBackPic_Wingull), SPECIES_SPRITE(PELIPPER, gMonBackPic_Pelipper), SPECIES_SPRITE(SURSKIT, gMonBackPic_Surskit), SPECIES_SPRITE(MASQUERAIN, gMonBackPic_Masquerain), SPECIES_SPRITE(WAILMER, gMonBackPic_Wailmer), SPECIES_SPRITE(WAILORD, gMonBackPic_Wailord), SPECIES_SPRITE(SKITTY, gMonBackPic_Skitty), SPECIES_SPRITE(DELCATTY, gMonBackPic_Delcatty), SPECIES_SPRITE(KECLEON, gMonBackPic_Kecleon), SPECIES_SPRITE(BALTOY, gMonBackPic_Baltoy), SPECIES_SPRITE(CLAYDOL, gMonBackPic_Claydol), SPECIES_SPRITE(NOSEPASS, gMonBackPic_Nosepass), SPECIES_SPRITE(TORKOAL, gMonBackPic_Torkoal), SPECIES_SPRITE(SABLEYE, gMonBackPic_Sableye), SPECIES_SPRITE(BARBOACH, gMonBackPic_Barboach), SPECIES_SPRITE(WHISCASH, gMonBackPic_Whiscash), SPECIES_SPRITE(LUVDISC, gMonBackPic_Luvdisc), SPECIES_SPRITE(CORPHISH, gMonBackPic_Corphish), SPECIES_SPRITE(CRAWDAUNT, gMonBackPic_Crawdaunt), SPECIES_SPRITE(FEEBAS, gMonBackPic_Feebas), SPECIES_SPRITE(MILOTIC, gMonBackPic_Milotic), SPECIES_SPRITE(CARVANHA, gMonBackPic_Carvanha), SPECIES_SPRITE(SHARPEDO, gMonBackPic_Sharpedo), SPECIES_SPRITE(TRAPINCH, gMonBackPic_Trapinch), SPECIES_SPRITE(VIBRAVA, gMonBackPic_Vibrava), SPECIES_SPRITE(FLYGON, gMonBackPic_Flygon), SPECIES_SPRITE(MAKUHITA, gMonBackPic_Makuhita), SPECIES_SPRITE(HARIYAMA, gMonBackPic_Hariyama), SPECIES_SPRITE(ELECTRIKE, gMonBackPic_Electrike), SPECIES_SPRITE(MANECTRIC, gMonBackPic_Manectric), SPECIES_SPRITE(NUMEL, gMonBackPic_Numel), SPECIES_SPRITE(CAMERUPT, gMonBackPic_Camerupt), SPECIES_SPRITE(SPHEAL, gMonBackPic_Spheal), SPECIES_SPRITE(SEALEO, gMonBackPic_Sealeo), SPECIES_SPRITE(WALREIN, gMonBackPic_Walrein), SPECIES_SPRITE(CACNEA, gMonBackPic_Cacnea), SPECIES_SPRITE(CACTURNE, gMonBackPic_Cacturne), SPECIES_SPRITE(SNORUNT, gMonBackPic_Snorunt), SPECIES_SPRITE(GLALIE, gMonBackPic_Glalie), SPECIES_SPRITE(LUNATONE, gMonBackPic_Lunatone), SPECIES_SPRITE(SOLROCK, gMonBackPic_Solrock), SPECIES_SPRITE(AZURILL, gMonBackPic_Azurill), SPECIES_SPRITE(SPOINK, gMonBackPic_Spoink), SPECIES_SPRITE(GRUMPIG, gMonBackPic_Grumpig), SPECIES_SPRITE(PLUSLE, gMonBackPic_Plusle), SPECIES_SPRITE(MINUN, gMonBackPic_Minun), SPECIES_SPRITE(MAWILE, gMonBackPic_Mawile), SPECIES_SPRITE(MEDITITE, gMonBackPic_Meditite), SPECIES_SPRITE(MEDICHAM, gMonBackPic_Medicham), SPECIES_SPRITE(SWABLU, gMonBackPic_Swablu), SPECIES_SPRITE(ALTARIA, gMonBackPic_Altaria), SPECIES_SPRITE(WYNAUT, gMonBackPic_Wynaut), SPECIES_SPRITE(DUSKULL, gMonBackPic_Duskull), SPECIES_SPRITE(DUSCLOPS, gMonBackPic_Dusclops), SPECIES_SPRITE(ROSELIA, gMonBackPic_Roselia), SPECIES_SPRITE(SLAKOTH, gMonBackPic_Slakoth), SPECIES_SPRITE(VIGOROTH, gMonBackPic_Vigoroth), SPECIES_SPRITE(SLAKING, gMonBackPic_Slaking), SPECIES_SPRITE(GULPIN, gMonBackPic_Gulpin), SPECIES_SPRITE(SWALOT, gMonBackPic_Swalot), SPECIES_SPRITE(TROPIUS, gMonBackPic_Tropius), SPECIES_SPRITE(WHISMUR, gMonBackPic_Whismur), SPECIES_SPRITE(LOUDRED, gMonBackPic_Loudred), SPECIES_SPRITE(EXPLOUD, gMonBackPic_Exploud), SPECIES_SPRITE(CLAMPERL, gMonBackPic_Clamperl), SPECIES_SPRITE(HUNTAIL, gMonBackPic_Huntail), SPECIES_SPRITE(GOREBYSS, gMonBackPic_Gorebyss), SPECIES_SPRITE(ABSOL, gMonBackPic_Absol), SPECIES_SPRITE(SHUPPET, gMonBackPic_Shuppet), SPECIES_SPRITE(BANETTE, gMonBackPic_Banette), SPECIES_SPRITE(SEVIPER, gMonBackPic_Seviper), SPECIES_SPRITE(ZANGOOSE, gMonBackPic_Zangoose), SPECIES_SPRITE(RELICANTH, gMonBackPic_Relicanth), SPECIES_SPRITE(ARON, gMonBackPic_Aron), SPECIES_SPRITE(LAIRON, gMonBackPic_Lairon), SPECIES_SPRITE(AGGRON, gMonBackPic_Aggron), SPECIES_SPRITE(CASTFORM, gMonBackPic_Castform), SPECIES_SPRITE(VOLBEAT, gMonBackPic_Volbeat), SPECIES_SPRITE(ILLUMISE, gMonBackPic_Illumise), SPECIES_SPRITE(LILEEP, gMonBackPic_Lileep), SPECIES_SPRITE(CRADILY, gMonBackPic_Cradily), SPECIES_SPRITE(ANORITH, gMonBackPic_Anorith), SPECIES_SPRITE(ARMALDO, gMonBackPic_Armaldo), SPECIES_SPRITE(RALTS, gMonBackPic_Ralts), SPECIES_SPRITE(KIRLIA, gMonBackPic_Kirlia), SPECIES_SPRITE(GARDEVOIR, gMonBackPic_Gardevoir), SPECIES_SPRITE(BAGON, gMonBackPic_Bagon), SPECIES_SPRITE(SHELGON, gMonBackPic_Shelgon), SPECIES_SPRITE(SALAMENCE, gMonBackPic_Salamence), SPECIES_SPRITE(BELDUM, gMonBackPic_Beldum), SPECIES_SPRITE(METANG, gMonBackPic_Metang), SPECIES_SPRITE(METAGROSS, gMonBackPic_Metagross), SPECIES_SPRITE(REGIROCK, gMonBackPic_Regirock), SPECIES_SPRITE(REGICE, gMonBackPic_Regice), SPECIES_SPRITE(REGISTEEL, gMonBackPic_Registeel), SPECIES_SPRITE(KYOGRE, gMonBackPic_Kyogre), SPECIES_SPRITE(GROUDON, gMonBackPic_Groudon), SPECIES_SPRITE(RAYQUAZA, gMonBackPic_Rayquaza), SPECIES_SPRITE(LATIAS, gMonBackPic_Latias), SPECIES_SPRITE(LATIOS, gMonBackPic_Latios), SPECIES_SPRITE(JIRACHI, gMonBackPic_Jirachi), SPECIES_SPRITE(DEOXYS, gMonBackPic_Deoxys), SPECIES_SPRITE(CHIMECHO, gMonBackPic_Chimecho), SPECIES_SPRITE(EGG, gMonFrontPic_Egg), SPECIES_SPRITE(UNOWN_B, gMonBackPic_UnownB), SPECIES_SPRITE(UNOWN_C, gMonBackPic_UnownC), SPECIES_SPRITE(UNOWN_D, gMonBackPic_UnownD), SPECIES_SPRITE(UNOWN_E, gMonBackPic_UnownE), SPECIES_SPRITE(UNOWN_F, gMonBackPic_UnownF), SPECIES_SPRITE(UNOWN_G, gMonBackPic_UnownG), SPECIES_SPRITE(UNOWN_H, gMonBackPic_UnownH), SPECIES_SPRITE(UNOWN_I, gMonBackPic_UnownI), SPECIES_SPRITE(UNOWN_J, gMonBackPic_UnownJ), SPECIES_SPRITE(UNOWN_K, gMonBackPic_UnownK), SPECIES_SPRITE(UNOWN_L, gMonBackPic_UnownL), SPECIES_SPRITE(UNOWN_M, gMonBackPic_UnownM), SPECIES_SPRITE(UNOWN_N, gMonBackPic_UnownN), SPECIES_SPRITE(UNOWN_O, gMonBackPic_UnownO), SPECIES_SPRITE(UNOWN_P, gMonBackPic_UnownP), SPECIES_SPRITE(UNOWN_Q, gMonBackPic_UnownQ), SPECIES_SPRITE(UNOWN_R, gMonBackPic_UnownR), SPECIES_SPRITE(UNOWN_S, gMonBackPic_UnownS), SPECIES_SPRITE(UNOWN_T, gMonBackPic_UnownT), SPECIES_SPRITE(UNOWN_U, gMonBackPic_UnownU), SPECIES_SPRITE(UNOWN_V, gMonBackPic_UnownV), SPECIES_SPRITE(UNOWN_W, gMonBackPic_UnownW), SPECIES_SPRITE(UNOWN_X, gMonBackPic_UnownX), SPECIES_SPRITE(UNOWN_Y, gMonBackPic_UnownY), SPECIES_SPRITE(UNOWN_Z, gMonBackPic_UnownZ), SPECIES_SPRITE(UNOWN_EMARK, gMonBackPic_UnownExclamationMark), SPECIES_SPRITE(UNOWN_QMARK, gMonBackPic_UnownQuestionMark), }; ================================================ FILE: src/data/pokemon_graphics/enemy_mon_elevation.h ================================================ // This determines how much higher above the usual position the enemy Pokémon // is during battle. Species that float or fly have nonzero values. const u8 gEnemyMonElevation[NUM_SPECIES] = { [SPECIES_BUTTERFREE] = 8, [SPECIES_BEEDRILL] = 8, [SPECIES_PIDGEOT] = 4, [SPECIES_FEAROW] = 6, [SPECIES_ZUBAT] = 8, [SPECIES_GOLBAT] = 8, [SPECIES_VENOMOTH] = 8, [SPECIES_GEODUDE] = 16, [SPECIES_MAGNEMITE] = 16, [SPECIES_MAGNETON] = 8, [SPECIES_GASTLY] = 4, [SPECIES_HAUNTER] = 4, [SPECIES_VOLTORB] = 10, [SPECIES_ELECTRODE] = 12, [SPECIES_KOFFING] = 8, [SPECIES_WEEZING] = 6, [SPECIES_AERODACTYL] = 7, [SPECIES_ARTICUNO] = 6, [SPECIES_ZAPDOS] = 8, [SPECIES_MOLTRES] = 5, [SPECIES_DRAGONITE] = 6, [SPECIES_MEW] = 8, [SPECIES_LEDIAN] = 8, [SPECIES_CROBAT] = 6, [SPECIES_HOPPIP] = 11, [SPECIES_SKIPLOOM] = 12, [SPECIES_JUMPLUFF] = 9, [SPECIES_YANMA] = 8, [SPECIES_MISDREAVUS] = 8, [SPECIES_UNOWN] = 8, [SPECIES_GLIGAR] = 6, [SPECIES_LUGIA] = 6, [SPECIES_HO_OH] = 6, [SPECIES_CELEBI] = 15, [SPECIES_BEAUTIFLY] = 8, [SPECIES_DUSTOX] = 10, [SPECIES_NINJASK] = 10, [SPECIES_SHEDINJA] = 8, [SPECIES_WINGULL] = 16, [SPECIES_PELIPPER] = 8, [SPECIES_MASQUERAIN] = 10, [SPECIES_BALTOY] = 4, [SPECIES_CLAYDOL] = 10, [SPECIES_FLYGON] = 7, [SPECIES_GLALIE] = 12, [SPECIES_LUNATONE] = 13, [SPECIES_SOLROCK] = 4, [SPECIES_SWABLU] = 12, [SPECIES_ALTARIA] = 8, [SPECIES_DUSKULL] = 9, [SPECIES_SHUPPET] = 12, [SPECIES_BANETTE] = 8, [SPECIES_CASTFORM] = 16, [SPECIES_BELDUM] = 8, [SPECIES_RAYQUAZA] = 6, [SPECIES_LATIAS] = 6, [SPECIES_LATIOS] = 6, [SPECIES_JIRACHI] = 12, [SPECIES_DEOXYS] = 8, [SPECIES_CHIMECHO] = 12, }; ================================================ FILE: src/data/pokemon_graphics/footprint_table.h ================================================ const u8 *const gMonFootprintTable[] = { [SPECIES_NONE] = gMonFootprint_Bulbasaur, [SPECIES_BULBASAUR] = gMonFootprint_Bulbasaur, [SPECIES_IVYSAUR] = gMonFootprint_Ivysaur, [SPECIES_VENUSAUR] = gMonFootprint_Venusaur, [SPECIES_CHARMANDER] = gMonFootprint_Charmander, [SPECIES_CHARMELEON] = gMonFootprint_Charmeleon, [SPECIES_CHARIZARD] = gMonFootprint_Charizard, [SPECIES_SQUIRTLE] = gMonFootprint_Squirtle, [SPECIES_WARTORTLE] = gMonFootprint_Wartortle, [SPECIES_BLASTOISE] = gMonFootprint_Blastoise, [SPECIES_CATERPIE] = gMonFootprint_Caterpie, [SPECIES_METAPOD] = gMonFootprint_Metapod, [SPECIES_BUTTERFREE] = gMonFootprint_Butterfree, [SPECIES_WEEDLE] = gMonFootprint_Weedle, [SPECIES_KAKUNA] = gMonFootprint_Kakuna, [SPECIES_BEEDRILL] = gMonFootprint_Beedrill, [SPECIES_PIDGEY] = gMonFootprint_Pidgey, [SPECIES_PIDGEOTTO] = gMonFootprint_Pidgeotto, [SPECIES_PIDGEOT] = gMonFootprint_Pidgeot, [SPECIES_RATTATA] = gMonFootprint_Rattata, [SPECIES_RATICATE] = gMonFootprint_Raticate, [SPECIES_SPEAROW] = gMonFootprint_Spearow, [SPECIES_FEAROW] = gMonFootprint_Fearow, [SPECIES_EKANS] = gMonFootprint_Ekans, [SPECIES_ARBOK] = gMonFootprint_Arbok, [SPECIES_PIKACHU] = gMonFootprint_Pikachu, [SPECIES_RAICHU] = gMonFootprint_Raichu, [SPECIES_SANDSHREW] = gMonFootprint_Sandshrew, [SPECIES_SANDSLASH] = gMonFootprint_Sandslash, [SPECIES_NIDORAN_F] = gMonFootprint_NidoranF, [SPECIES_NIDORINA] = gMonFootprint_Nidorina, [SPECIES_NIDOQUEEN] = gMonFootprint_Nidoqueen, [SPECIES_NIDORAN_M] = gMonFootprint_NidoranM, [SPECIES_NIDORINO] = gMonFootprint_Nidorino, [SPECIES_NIDOKING] = gMonFootprint_Nidoking, [SPECIES_CLEFAIRY] = gMonFootprint_Clefairy, [SPECIES_CLEFABLE] = gMonFootprint_Clefable, [SPECIES_VULPIX] = gMonFootprint_Vulpix, [SPECIES_NINETALES] = gMonFootprint_Ninetales, [SPECIES_JIGGLYPUFF] = gMonFootprint_Jigglypuff, [SPECIES_WIGGLYTUFF] = gMonFootprint_Wigglytuff, [SPECIES_ZUBAT] = gMonFootprint_Zubat, [SPECIES_GOLBAT] = gMonFootprint_Golbat, [SPECIES_ODDISH] = gMonFootprint_Oddish, [SPECIES_GLOOM] = gMonFootprint_Gloom, [SPECIES_VILEPLUME] = gMonFootprint_Vileplume, [SPECIES_PARAS] = gMonFootprint_Paras, [SPECIES_PARASECT] = gMonFootprint_Parasect, [SPECIES_VENONAT] = gMonFootprint_Venonat, [SPECIES_VENOMOTH] = gMonFootprint_Venomoth, [SPECIES_DIGLETT] = gMonFootprint_Diglett, [SPECIES_DUGTRIO] = gMonFootprint_Dugtrio, [SPECIES_MEOWTH] = gMonFootprint_Meowth, [SPECIES_PERSIAN] = gMonFootprint_Persian, [SPECIES_PSYDUCK] = gMonFootprint_Psyduck, [SPECIES_GOLDUCK] = gMonFootprint_Golduck, [SPECIES_MANKEY] = gMonFootprint_Mankey, [SPECIES_PRIMEAPE] = gMonFootprint_Primeape, [SPECIES_GROWLITHE] = gMonFootprint_Growlithe, [SPECIES_ARCANINE] = gMonFootprint_Arcanine, [SPECIES_POLIWAG] = gMonFootprint_Poliwag, [SPECIES_POLIWHIRL] = gMonFootprint_Poliwhirl, [SPECIES_POLIWRATH] = gMonFootprint_Poliwrath, [SPECIES_ABRA] = gMonFootprint_Abra, [SPECIES_KADABRA] = gMonFootprint_Kadabra, [SPECIES_ALAKAZAM] = gMonFootprint_Alakazam, [SPECIES_MACHOP] = gMonFootprint_Machop, [SPECIES_MACHOKE] = gMonFootprint_Machoke, [SPECIES_MACHAMP] = gMonFootprint_Machamp, [SPECIES_BELLSPROUT] = gMonFootprint_Bellsprout, [SPECIES_WEEPINBELL] = gMonFootprint_Weepinbell, [SPECIES_VICTREEBEL] = gMonFootprint_Victreebel, [SPECIES_TENTACOOL] = gMonFootprint_Tentacool, [SPECIES_TENTACRUEL] = gMonFootprint_Tentacruel, [SPECIES_GEODUDE] = gMonFootprint_Geodude, [SPECIES_GRAVELER] = gMonFootprint_Graveler, [SPECIES_GOLEM] = gMonFootprint_Golem, [SPECIES_PONYTA] = gMonFootprint_Ponyta, [SPECIES_RAPIDASH] = gMonFootprint_Rapidash, [SPECIES_SLOWPOKE] = gMonFootprint_Slowpoke, [SPECIES_SLOWBRO] = gMonFootprint_Slowbro, [SPECIES_MAGNEMITE] = gMonFootprint_Magnemite, [SPECIES_MAGNETON] = gMonFootprint_Magneton, [SPECIES_FARFETCHD] = gMonFootprint_Farfetchd, [SPECIES_DODUO] = gMonFootprint_Doduo, [SPECIES_DODRIO] = gMonFootprint_Dodrio, [SPECIES_SEEL] = gMonFootprint_Seel, [SPECIES_DEWGONG] = gMonFootprint_Dewgong, [SPECIES_GRIMER] = gMonFootprint_Grimer, [SPECIES_MUK] = gMonFootprint_Muk, [SPECIES_SHELLDER] = gMonFootprint_Shellder, [SPECIES_CLOYSTER] = gMonFootprint_Cloyster, [SPECIES_GASTLY] = gMonFootprint_Gastly, [SPECIES_HAUNTER] = gMonFootprint_Haunter, [SPECIES_GENGAR] = gMonFootprint_Gengar, [SPECIES_ONIX] = gMonFootprint_Onix, [SPECIES_DROWZEE] = gMonFootprint_Drowzee, [SPECIES_HYPNO] = gMonFootprint_Hypno, [SPECIES_KRABBY] = gMonFootprint_Krabby, [SPECIES_KINGLER] = gMonFootprint_Kingler, [SPECIES_VOLTORB] = gMonFootprint_Voltorb, [SPECIES_ELECTRODE] = gMonFootprint_Electrode, [SPECIES_EXEGGCUTE] = gMonFootprint_Exeggcute, [SPECIES_EXEGGUTOR] = gMonFootprint_Exeggutor, [SPECIES_CUBONE] = gMonFootprint_Cubone, [SPECIES_MAROWAK] = gMonFootprint_Marowak, [SPECIES_HITMONLEE] = gMonFootprint_Hitmonlee, [SPECIES_HITMONCHAN] = gMonFootprint_Hitmonchan, [SPECIES_LICKITUNG] = gMonFootprint_Lickitung, [SPECIES_KOFFING] = gMonFootprint_Koffing, [SPECIES_WEEZING] = gMonFootprint_Weezing, [SPECIES_RHYHORN] = gMonFootprint_Rhyhorn, [SPECIES_RHYDON] = gMonFootprint_Rhydon, [SPECIES_CHANSEY] = gMonFootprint_Chansey, [SPECIES_TANGELA] = gMonFootprint_Tangela, [SPECIES_KANGASKHAN] = gMonFootprint_Kangaskhan, [SPECIES_HORSEA] = gMonFootprint_Horsea, [SPECIES_SEADRA] = gMonFootprint_Seadra, [SPECIES_GOLDEEN] = gMonFootprint_Goldeen, [SPECIES_SEAKING] = gMonFootprint_Seaking, [SPECIES_STARYU] = gMonFootprint_Staryu, [SPECIES_STARMIE] = gMonFootprint_Starmie, [SPECIES_MR_MIME] = gMonFootprint_Mrmime, [SPECIES_SCYTHER] = gMonFootprint_Scyther, [SPECIES_JYNX] = gMonFootprint_Jynx, [SPECIES_ELECTABUZZ] = gMonFootprint_Electabuzz, [SPECIES_MAGMAR] = gMonFootprint_Magmar, [SPECIES_PINSIR] = gMonFootprint_Pinsir, [SPECIES_TAUROS] = gMonFootprint_Tauros, [SPECIES_MAGIKARP] = gMonFootprint_Magikarp, [SPECIES_GYARADOS] = gMonFootprint_Gyarados, [SPECIES_LAPRAS] = gMonFootprint_Lapras, [SPECIES_DITTO] = gMonFootprint_Ditto, [SPECIES_EEVEE] = gMonFootprint_Eevee, [SPECIES_VAPOREON] = gMonFootprint_Vaporeon, [SPECIES_JOLTEON] = gMonFootprint_Jolteon, [SPECIES_FLAREON] = gMonFootprint_Flareon, [SPECIES_PORYGON] = gMonFootprint_Porygon, [SPECIES_OMANYTE] = gMonFootprint_Omanyte, [SPECIES_OMASTAR] = gMonFootprint_Omastar, [SPECIES_KABUTO] = gMonFootprint_Kabuto, [SPECIES_KABUTOPS] = gMonFootprint_Kabutops, [SPECIES_AERODACTYL] = gMonFootprint_Aerodactyl, [SPECIES_SNORLAX] = gMonFootprint_Snorlax, [SPECIES_ARTICUNO] = gMonFootprint_Articuno, [SPECIES_ZAPDOS] = gMonFootprint_Zapdos, [SPECIES_MOLTRES] = gMonFootprint_Moltres, [SPECIES_DRATINI] = gMonFootprint_Dratini, [SPECIES_DRAGONAIR] = gMonFootprint_Dragonair, [SPECIES_DRAGONITE] = gMonFootprint_Dragonite, [SPECIES_MEWTWO] = gMonFootprint_Mewtwo, [SPECIES_MEW] = gMonFootprint_Mew, [SPECIES_CHIKORITA] = gMonFootprint_Chikorita, [SPECIES_BAYLEEF] = gMonFootprint_Bayleef, [SPECIES_MEGANIUM] = gMonFootprint_Meganium, [SPECIES_CYNDAQUIL] = gMonFootprint_Cyndaquil, [SPECIES_QUILAVA] = gMonFootprint_Quilava, [SPECIES_TYPHLOSION] = gMonFootprint_Typhlosion, [SPECIES_TOTODILE] = gMonFootprint_Totodile, [SPECIES_CROCONAW] = gMonFootprint_Croconaw, [SPECIES_FERALIGATR] = gMonFootprint_Feraligatr, [SPECIES_SENTRET] = gMonFootprint_Sentret, [SPECIES_FURRET] = gMonFootprint_Furret, [SPECIES_HOOTHOOT] = gMonFootprint_Hoothoot, [SPECIES_NOCTOWL] = gMonFootprint_Noctowl, [SPECIES_LEDYBA] = gMonFootprint_Ledyba, [SPECIES_LEDIAN] = gMonFootprint_Ledian, [SPECIES_SPINARAK] = gMonFootprint_Spinarak, [SPECIES_ARIADOS] = gMonFootprint_Ariados, [SPECIES_CROBAT] = gMonFootprint_Crobat, [SPECIES_CHINCHOU] = gMonFootprint_Chinchou, [SPECIES_LANTURN] = gMonFootprint_Lanturn, [SPECIES_PICHU] = gMonFootprint_Pichu, [SPECIES_CLEFFA] = gMonFootprint_Cleffa, [SPECIES_IGGLYBUFF] = gMonFootprint_Igglybuff, [SPECIES_TOGEPI] = gMonFootprint_Togepi, [SPECIES_TOGETIC] = gMonFootprint_Togetic, [SPECIES_NATU] = gMonFootprint_Natu, [SPECIES_XATU] = gMonFootprint_Xatu, [SPECIES_MAREEP] = gMonFootprint_Mareep, [SPECIES_FLAAFFY] = gMonFootprint_Flaaffy, [SPECIES_AMPHAROS] = gMonFootprint_Ampharos, [SPECIES_BELLOSSOM] = gMonFootprint_Bellossom, [SPECIES_MARILL] = gMonFootprint_Marill, [SPECIES_AZUMARILL] = gMonFootprint_Azumarill, [SPECIES_SUDOWOODO] = gMonFootprint_Sudowoodo, [SPECIES_POLITOED] = gMonFootprint_Politoed, [SPECIES_HOPPIP] = gMonFootprint_Hoppip, [SPECIES_SKIPLOOM] = gMonFootprint_Skiploom, [SPECIES_JUMPLUFF] = gMonFootprint_Jumpluff, [SPECIES_AIPOM] = gMonFootprint_Aipom, [SPECIES_SUNKERN] = gMonFootprint_Sunkern, [SPECIES_SUNFLORA] = gMonFootprint_Sunflora, [SPECIES_YANMA] = gMonFootprint_Yanma, [SPECIES_WOOPER] = gMonFootprint_Wooper, [SPECIES_QUAGSIRE] = gMonFootprint_Quagsire, [SPECIES_ESPEON] = gMonFootprint_Espeon, [SPECIES_UMBREON] = gMonFootprint_Umbreon, [SPECIES_MURKROW] = gMonFootprint_Murkrow, [SPECIES_SLOWKING] = gMonFootprint_Slowking, [SPECIES_MISDREAVUS] = gMonFootprint_Misdreavus, [SPECIES_UNOWN] = gMonFootprint_Unown, [SPECIES_WOBBUFFET] = gMonFootprint_Wobbuffet, [SPECIES_GIRAFARIG] = gMonFootprint_Girafarig, [SPECIES_PINECO] = gMonFootprint_Pineco, [SPECIES_FORRETRESS] = gMonFootprint_Forretress, [SPECIES_DUNSPARCE] = gMonFootprint_Dunsparce, [SPECIES_GLIGAR] = gMonFootprint_Gligar, [SPECIES_STEELIX] = gMonFootprint_Steelix, [SPECIES_SNUBBULL] = gMonFootprint_Snubbull, [SPECIES_GRANBULL] = gMonFootprint_Granbull, [SPECIES_QWILFISH] = gMonFootprint_Qwilfish, [SPECIES_SCIZOR] = gMonFootprint_Scizor, [SPECIES_SHUCKLE] = gMonFootprint_Shuckle, [SPECIES_HERACROSS] = gMonFootprint_Heracross, [SPECIES_SNEASEL] = gMonFootprint_Sneasel, [SPECIES_TEDDIURSA] = gMonFootprint_Teddiursa, [SPECIES_URSARING] = gMonFootprint_Ursaring, [SPECIES_SLUGMA] = gMonFootprint_Slugma, [SPECIES_MAGCARGO] = gMonFootprint_Magcargo, [SPECIES_SWINUB] = gMonFootprint_Swinub, [SPECIES_PILOSWINE] = gMonFootprint_Piloswine, [SPECIES_CORSOLA] = gMonFootprint_Corsola, [SPECIES_REMORAID] = gMonFootprint_Remoraid, [SPECIES_OCTILLERY] = gMonFootprint_Octillery, [SPECIES_DELIBIRD] = gMonFootprint_Delibird, [SPECIES_MANTINE] = gMonFootprint_Mantine, [SPECIES_SKARMORY] = gMonFootprint_Skarmory, [SPECIES_HOUNDOUR] = gMonFootprint_Houndour, [SPECIES_HOUNDOOM] = gMonFootprint_Houndoom, [SPECIES_KINGDRA] = gMonFootprint_Kingdra, [SPECIES_PHANPY] = gMonFootprint_Phanpy, [SPECIES_DONPHAN] = gMonFootprint_Donphan, [SPECIES_PORYGON2] = gMonFootprint_Porygon2, [SPECIES_STANTLER] = gMonFootprint_Stantler, [SPECIES_SMEARGLE] = gMonFootprint_Smeargle, [SPECIES_TYROGUE] = gMonFootprint_Tyrogue, [SPECIES_HITMONTOP] = gMonFootprint_Hitmontop, [SPECIES_SMOOCHUM] = gMonFootprint_Smoochum, [SPECIES_ELEKID] = gMonFootprint_Elekid, [SPECIES_MAGBY] = gMonFootprint_Magby, [SPECIES_MILTANK] = gMonFootprint_Miltank, [SPECIES_BLISSEY] = gMonFootprint_Blissey, [SPECIES_RAIKOU] = gMonFootprint_Raikou, [SPECIES_ENTEI] = gMonFootprint_Entei, [SPECIES_SUICUNE] = gMonFootprint_Suicune, [SPECIES_LARVITAR] = gMonFootprint_Larvitar, [SPECIES_PUPITAR] = gMonFootprint_Pupitar, [SPECIES_TYRANITAR] = gMonFootprint_Tyranitar, [SPECIES_LUGIA] = gMonFootprint_Lugia, [SPECIES_HO_OH] = gMonFootprint_HoOh, [SPECIES_CELEBI] = gMonFootprint_Celebi, [SPECIES_OLD_UNOWN_B] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_C] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_D] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_E] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_F] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_G] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_H] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_I] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_J] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_K] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_L] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_M] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_N] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_O] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_P] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_Q] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_R] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_S] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_T] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_U] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_V] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_W] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_X] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_Y] = gMonFootprint_QuestionMark, [SPECIES_OLD_UNOWN_Z] = gMonFootprint_QuestionMark, [SPECIES_TREECKO] = gMonFootprint_Treecko, [SPECIES_GROVYLE] = gMonFootprint_Grovyle, [SPECIES_SCEPTILE] = gMonFootprint_Sceptile, [SPECIES_TORCHIC] = gMonFootprint_Torchic, [SPECIES_COMBUSKEN] = gMonFootprint_Combusken, [SPECIES_BLAZIKEN] = gMonFootprint_Blaziken, [SPECIES_MUDKIP] = gMonFootprint_Mudkip, [SPECIES_MARSHTOMP] = gMonFootprint_Marshtomp, [SPECIES_SWAMPERT] = gMonFootprint_Swampert, [SPECIES_POOCHYENA] = gMonFootprint_Poochyena, [SPECIES_MIGHTYENA] = gMonFootprint_Mightyena, [SPECIES_ZIGZAGOON] = gMonFootprint_Zigzagoon, [SPECIES_LINOONE] = gMonFootprint_Linoone, [SPECIES_WURMPLE] = gMonFootprint_Wurmple, [SPECIES_SILCOON] = gMonFootprint_Silcoon, [SPECIES_BEAUTIFLY] = gMonFootprint_Beautifly, [SPECIES_CASCOON] = gMonFootprint_Cascoon, [SPECIES_DUSTOX] = gMonFootprint_Dustox, [SPECIES_LOTAD] = gMonFootprint_Lotad, [SPECIES_LOMBRE] = gMonFootprint_Lombre, [SPECIES_LUDICOLO] = gMonFootprint_Ludicolo, [SPECIES_SEEDOT] = gMonFootprint_Seedot, [SPECIES_NUZLEAF] = gMonFootprint_Nuzleaf, [SPECIES_SHIFTRY] = gMonFootprint_Shiftry, [SPECIES_NINCADA] = gMonFootprint_Nincada, [SPECIES_NINJASK] = gMonFootprint_Ninjask, [SPECIES_SHEDINJA] = gMonFootprint_Shedinja, [SPECIES_TAILLOW] = gMonFootprint_Taillow, [SPECIES_SWELLOW] = gMonFootprint_Swellow, [SPECIES_SHROOMISH] = gMonFootprint_Shroomish, [SPECIES_BRELOOM] = gMonFootprint_Breloom, [SPECIES_SPINDA] = gMonFootprint_Spinda, [SPECIES_WINGULL] = gMonFootprint_Wingull, [SPECIES_PELIPPER] = gMonFootprint_Pelipper, [SPECIES_SURSKIT] = gMonFootprint_Surskit, [SPECIES_MASQUERAIN] = gMonFootprint_Masquerain, [SPECIES_WAILMER] = gMonFootprint_Wailmer, [SPECIES_WAILORD] = gMonFootprint_Wailord, [SPECIES_SKITTY] = gMonFootprint_Skitty, [SPECIES_DELCATTY] = gMonFootprint_Delcatty, [SPECIES_KECLEON] = gMonFootprint_Kecleon, [SPECIES_BALTOY] = gMonFootprint_Baltoy, [SPECIES_CLAYDOL] = gMonFootprint_Claydol, [SPECIES_NOSEPASS] = gMonFootprint_Nosepass, [SPECIES_TORKOAL] = gMonFootprint_Torkoal, [SPECIES_SABLEYE] = gMonFootprint_Sableye, [SPECIES_BARBOACH] = gMonFootprint_Barboach, [SPECIES_WHISCASH] = gMonFootprint_Whiscash, [SPECIES_LUVDISC] = gMonFootprint_Luvdisc, [SPECIES_CORPHISH] = gMonFootprint_Corphish, [SPECIES_CRAWDAUNT] = gMonFootprint_Crawdaunt, [SPECIES_FEEBAS] = gMonFootprint_Feebas, [SPECIES_MILOTIC] = gMonFootprint_Milotic, [SPECIES_CARVANHA] = gMonFootprint_Carvanha, [SPECIES_SHARPEDO] = gMonFootprint_Sharpedo, [SPECIES_TRAPINCH] = gMonFootprint_Trapinch, [SPECIES_VIBRAVA] = gMonFootprint_Vibrava, [SPECIES_FLYGON] = gMonFootprint_Flygon, [SPECIES_MAKUHITA] = gMonFootprint_Makuhita, [SPECIES_HARIYAMA] = gMonFootprint_Hariyama, [SPECIES_ELECTRIKE] = gMonFootprint_Electrike, [SPECIES_MANECTRIC] = gMonFootprint_Manectric, [SPECIES_NUMEL] = gMonFootprint_Numel, [SPECIES_CAMERUPT] = gMonFootprint_Camerupt, [SPECIES_SPHEAL] = gMonFootprint_Spheal, [SPECIES_SEALEO] = gMonFootprint_Sealeo, [SPECIES_WALREIN] = gMonFootprint_Walrein, [SPECIES_CACNEA] = gMonFootprint_Cacnea, [SPECIES_CACTURNE] = gMonFootprint_Cacturne, [SPECIES_SNORUNT] = gMonFootprint_Snorunt, [SPECIES_GLALIE] = gMonFootprint_Glalie, [SPECIES_LUNATONE] = gMonFootprint_Lunatone, [SPECIES_SOLROCK] = gMonFootprint_Solrock, [SPECIES_AZURILL] = gMonFootprint_Azurill, [SPECIES_SPOINK] = gMonFootprint_Spoink, [SPECIES_GRUMPIG] = gMonFootprint_Grumpig, [SPECIES_PLUSLE] = gMonFootprint_Plusle, [SPECIES_MINUN] = gMonFootprint_Minun, [SPECIES_MAWILE] = gMonFootprint_Mawile, [SPECIES_MEDITITE] = gMonFootprint_Meditite, [SPECIES_MEDICHAM] = gMonFootprint_Medicham, [SPECIES_SWABLU] = gMonFootprint_Swablu, [SPECIES_ALTARIA] = gMonFootprint_Altaria, [SPECIES_WYNAUT] = gMonFootprint_Wynaut, [SPECIES_DUSKULL] = gMonFootprint_Duskull, [SPECIES_DUSCLOPS] = gMonFootprint_Dusclops, [SPECIES_ROSELIA] = gMonFootprint_Roselia, [SPECIES_SLAKOTH] = gMonFootprint_Slakoth, [SPECIES_VIGOROTH] = gMonFootprint_Vigoroth, [SPECIES_SLAKING] = gMonFootprint_Slaking, [SPECIES_GULPIN] = gMonFootprint_Gulpin, [SPECIES_SWALOT] = gMonFootprint_Swalot, [SPECIES_TROPIUS] = gMonFootprint_Tropius, [SPECIES_WHISMUR] = gMonFootprint_Whismur, [SPECIES_LOUDRED] = gMonFootprint_Loudred, [SPECIES_EXPLOUD] = gMonFootprint_Exploud, [SPECIES_CLAMPERL] = gMonFootprint_Clamperl, [SPECIES_HUNTAIL] = gMonFootprint_Huntail, [SPECIES_GOREBYSS] = gMonFootprint_Gorebyss, [SPECIES_ABSOL] = gMonFootprint_Absol, [SPECIES_SHUPPET] = gMonFootprint_Shuppet, [SPECIES_BANETTE] = gMonFootprint_Banette, [SPECIES_SEVIPER] = gMonFootprint_Seviper, [SPECIES_ZANGOOSE] = gMonFootprint_Zangoose, [SPECIES_RELICANTH] = gMonFootprint_Relicanth, [SPECIES_ARON] = gMonFootprint_Aron, [SPECIES_LAIRON] = gMonFootprint_Lairon, [SPECIES_AGGRON] = gMonFootprint_Aggron, [SPECIES_CASTFORM] = gMonFootprint_Castform, [SPECIES_VOLBEAT] = gMonFootprint_Volbeat, [SPECIES_ILLUMISE] = gMonFootprint_Illumise, [SPECIES_LILEEP] = gMonFootprint_Lileep, [SPECIES_CRADILY] = gMonFootprint_Cradily, [SPECIES_ANORITH] = gMonFootprint_Anorith, [SPECIES_ARMALDO] = gMonFootprint_Armaldo, [SPECIES_RALTS] = gMonFootprint_Ralts, [SPECIES_KIRLIA] = gMonFootprint_Kirlia, [SPECIES_GARDEVOIR] = gMonFootprint_Gardevoir, [SPECIES_BAGON] = gMonFootprint_Bagon, [SPECIES_SHELGON] = gMonFootprint_Shelgon, [SPECIES_SALAMENCE] = gMonFootprint_Salamence, [SPECIES_BELDUM] = gMonFootprint_Beldum, [SPECIES_METANG] = gMonFootprint_Metang, [SPECIES_METAGROSS] = gMonFootprint_Metagross, [SPECIES_REGIROCK] = gMonFootprint_Regirock, [SPECIES_REGICE] = gMonFootprint_Regice, [SPECIES_REGISTEEL] = gMonFootprint_Registeel, [SPECIES_KYOGRE] = gMonFootprint_Kyogre, [SPECIES_GROUDON] = gMonFootprint_Groudon, [SPECIES_RAYQUAZA] = gMonFootprint_Rayquaza, [SPECIES_LATIAS] = gMonFootprint_Latias, [SPECIES_LATIOS] = gMonFootprint_Latios, [SPECIES_JIRACHI] = gMonFootprint_Jirachi, [SPECIES_DEOXYS] = gMonFootprint_Deoxys, [SPECIES_CHIMECHO] = gMonFootprint_Chimecho, [SPECIES_EGG] = gMonFootprint_Bulbasaur, }; ================================================ FILE: src/data/pokemon_graphics/front_pic_coordinates.h ================================================ const struct MonCoords gMonFrontPicCoords[] = { [SPECIES_NONE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_BULBASAUR] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 16, }, [SPECIES_IVYSAUR] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_VENUSAUR] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_CHARMANDER] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 13, }, [SPECIES_CHARMELEON] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_CHARIZARD] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_SQUIRTLE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_WARTORTLE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_BLASTOISE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_CATERPIE] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16, }, [SPECIES_METAPOD] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 20, }, [SPECIES_BUTTERFREE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_WEEDLE] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 17, }, [SPECIES_KAKUNA] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 14, }, [SPECIES_BEEDRILL] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_PIDGEY] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 13, }, [SPECIES_PIDGEOTTO] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_PIDGEOT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_RATTATA] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14, }, [SPECIES_RATICATE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_SPEAROW] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_FEAROW] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_EKANS] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 15, }, [SPECIES_ARBOK] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3, }, [SPECIES_PIKACHU] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 9, }, [SPECIES_RAICHU] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SANDSHREW] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11, }, [SPECIES_SANDSLASH] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_NIDORAN_F] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16, }, [SPECIES_NIDORINA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_NIDOQUEEN] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 2, }, [SPECIES_NIDORAN_M] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_NIDORINO] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_NIDOKING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_CLEFAIRY] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 16, }, [SPECIES_CLEFABLE] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_VULPIX] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_NINETALES] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_JIGGLYPUFF] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 16, }, [SPECIES_WIGGLYTUFF] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 8, }, [SPECIES_ZUBAT] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 13, }, [SPECIES_GOLBAT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_ODDISH] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 12, }, [SPECIES_GLOOM] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_VILEPLUME] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_PARAS] = { .size = MON_COORDS_SIZE(48, 32), .y_offset = 18, }, [SPECIES_PARASECT] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_VENONAT] = { .size = MON_COORDS_SIZE(40, 56), .y_offset = 11, }, [SPECIES_VENOMOTH] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 8, }, [SPECIES_DIGLETT] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 17, }, [SPECIES_DUGTRIO] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 12, }, [SPECIES_MEOWTH] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_PERSIAN] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_PSYDUCK] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 9, }, [SPECIES_GOLDUCK] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_MANKEY] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 14, }, [SPECIES_PRIMEAPE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_GROWLITHE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_ARCANINE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_POLIWAG] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 16, }, [SPECIES_POLIWHIRL] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_POLIWRATH] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_ABRA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_KADABRA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_ALAKAZAM] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_MACHOP] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 11, }, [SPECIES_MACHOKE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_MACHAMP] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_BELLSPROUT] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 15, }, [SPECIES_WEEPINBELL] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_VICTREEBEL] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_TENTACOOL] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_TENTACRUEL] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 1, }, [SPECIES_GEODUDE] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 18, }, [SPECIES_GRAVELER] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 11, }, [SPECIES_GOLEM] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_PONYTA] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_RAPIDASH] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SLOWPOKE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_SLOWBRO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_MAGNEMITE] = { .size = MON_COORDS_SIZE(40, 24), .y_offset = 22, }, [SPECIES_MAGNETON] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 16, }, [SPECIES_FARFETCHD] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_DODUO] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_DODRIO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_SEEL] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_DEWGONG] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_GRIMER] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_MUK] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_SHELLDER] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 16, }, [SPECIES_CLOYSTER] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_GASTLY] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_HAUNTER] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_GENGAR] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_ONIX] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3, }, [SPECIES_DROWZEE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_HYPNO] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_KRABBY] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 14, }, [SPECIES_KINGLER] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_VOLTORB] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 19, }, [SPECIES_ELECTRODE] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14, }, [SPECIES_EXEGGCUTE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_EXEGGUTOR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_CUBONE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 13, }, [SPECIES_MAROWAK] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 13, }, [SPECIES_HITMONLEE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_HITMONCHAN] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 4, }, [SPECIES_LICKITUNG] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_KOFFING] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_WEEZING] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 7, }, [SPECIES_RHYHORN] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_RHYDON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_CHANSEY] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_TANGELA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_KANGASKHAN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_HORSEA] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 16, }, [SPECIES_SEADRA] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_GOLDEEN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_SEAKING] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_STARYU] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 13, }, [SPECIES_STARMIE] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 10, }, [SPECIES_MR_MIME] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_SCYTHER] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 2, }, [SPECIES_JYNX] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_ELECTABUZZ] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4, }, [SPECIES_MAGMAR] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_PINSIR] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_TAUROS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 5, }, [SPECIES_MAGIKARP] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 11, }, [SPECIES_GYARADOS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_LAPRAS] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_DITTO] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 17, }, [SPECIES_EEVEE] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 13, }, [SPECIES_VAPOREON] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6, }, [SPECIES_JOLTEON] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_FLAREON] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 11, }, [SPECIES_PORYGON] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11, }, [SPECIES_OMANYTE] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 15, }, [SPECIES_OMASTAR] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_KABUTO] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 20, }, [SPECIES_KABUTOPS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_AERODACTYL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_SNORLAX] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_ARTICUNO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_ZAPDOS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 4, }, [SPECIES_MOLTRES] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_DRATINI] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 15, }, [SPECIES_DRAGONAIR] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_DRAGONITE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_MEWTWO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_MEW] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 13, }, [SPECIES_CHIKORITA] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13, }, [SPECIES_BAYLEEF] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_MEGANIUM] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_CYNDAQUIL] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14, }, [SPECIES_QUILAVA] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_TYPHLOSION] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0, }, [SPECIES_TOTODILE] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 15, }, [SPECIES_CROCONAW] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6, }, [SPECIES_FERALIGATR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SENTRET] = { .size = MON_COORDS_SIZE(32, 56), .y_offset = 4, }, [SPECIES_FURRET] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_HOOTHOOT] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 13, }, [SPECIES_NOCTOWL] = { .size = MON_COORDS_SIZE(40, 64), .y_offset = 3, }, [SPECIES_LEDYBA] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 12, }, [SPECIES_LEDIAN] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 4, }, [SPECIES_SPINARAK] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 19, }, [SPECIES_ARIADOS] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_CROBAT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_CHINCHOU] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 16, }, [SPECIES_LANTURN] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 11, }, [SPECIES_PICHU] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 12, }, [SPECIES_CLEFFA] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 20, }, [SPECIES_IGGLYBUFF] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 18, }, [SPECIES_TOGEPI] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 20, }, [SPECIES_TOGETIC] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 9, }, [SPECIES_NATU] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 20, }, [SPECIES_XATU] = { .size = MON_COORDS_SIZE(32, 56), .y_offset = 7, }, [SPECIES_MAREEP] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 16, }, [SPECIES_FLAAFFY] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10, }, [SPECIES_AMPHAROS] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_BELLOSSOM] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 14, }, [SPECIES_MARILL] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14, }, [SPECIES_AZUMARILL] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_SUDOWOODO] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6, }, [SPECIES_POLITOED] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6, }, [SPECIES_HOPPIP] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_SKIPLOOM] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 15, }, [SPECIES_JUMPLUFF] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_AIPOM] = { .size = MON_COORDS_SIZE(40, 64), .y_offset = 3, }, [SPECIES_SUNKERN] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 16, }, [SPECIES_SUNFLORA] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 8, }, [SPECIES_YANMA] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_WOOPER] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16, }, [SPECIES_QUAGSIRE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 7, }, [SPECIES_ESPEON] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_UMBREON] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 8, }, [SPECIES_MURKROW] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_SLOWKING] = { .size = MON_COORDS_SIZE(40, 64), .y_offset = 1, }, [SPECIES_MISDREAVUS] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_UNOWN] = { .size = MON_COORDS_SIZE(24, 40), .y_offset = 15, }, [SPECIES_WOBBUFFET] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_GIRAFARIG] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_PINECO] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10, }, [SPECIES_FORRETRESS] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_DUNSPARCE] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 17, }, [SPECIES_GLIGAR] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3, }, [SPECIES_STEELIX] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SNUBBULL] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 13, }, [SPECIES_GRANBULL] = { .size = MON_COORDS_SIZE(40, 56), .y_offset = 6, }, [SPECIES_QWILFISH] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 10, }, [SPECIES_SCIZOR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SHUCKLE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_HERACROSS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_SNEASEL] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 5, }, [SPECIES_TEDDIURSA] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 11, }, [SPECIES_URSARING] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 1, }, [SPECIES_SLUGMA] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 13, }, [SPECIES_MAGCARGO] = { .size = MON_COORDS_SIZE(40, 56), .y_offset = 13, }, [SPECIES_SWINUB] = { .size = MON_COORDS_SIZE(32, 24), .y_offset = 20, }, [SPECIES_PILOSWINE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_CORSOLA] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_REMORAID] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14, }, [SPECIES_OCTILLERY] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_DELIBIRD] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 8, }, [SPECIES_MANTINE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_SKARMORY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_HOUNDOUR] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11, }, [SPECIES_HOUNDOOM] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_KINGDRA] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 4, }, [SPECIES_PHANPY] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16, }, [SPECIES_DONPHAN] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_PORYGON2] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 15, }, [SPECIES_STANTLER] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SMEARGLE] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_TYROGUE] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 9, }, [SPECIES_HITMONTOP] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 5, }, [SPECIES_SMOOCHUM] = { .size = MON_COORDS_SIZE(24, 40), .y_offset = 15, }, [SPECIES_ELEKID] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_MAGBY] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 13, }, [SPECIES_MILTANK] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_BLISSEY] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 6, }, [SPECIES_RAIKOU] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_ENTEI] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SUICUNE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_LARVITAR] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 9, }, [SPECIES_PUPITAR] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 9, }, [SPECIES_TYRANITAR] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_LUGIA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_HO_OH] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_CELEBI] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14, }, [SPECIES_OLD_UNOWN_B] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_C] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_D] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_E] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_F] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_G] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_H] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_I] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_J] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_K] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_L] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_M] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_N] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_O] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_P] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_Q] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_R] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_S] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_T] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_U] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_V] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_W] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_X] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_Y] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_OLD_UNOWN_Z] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 6, }, [SPECIES_TREECKO] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_GROVYLE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_SCEPTILE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_TORCHIC] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 8, }, [SPECIES_COMBUSKEN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_BLAZIKEN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_MUDKIP] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 12, }, [SPECIES_MARSHTOMP] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6, }, [SPECIES_SWAMPERT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_POOCHYENA] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_MIGHTYENA] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_ZIGZAGOON] = { .size = MON_COORDS_SIZE(64, 40), .y_offset = 15, }, [SPECIES_LINOONE] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3, }, [SPECIES_WURMPLE] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 14, }, [SPECIES_SILCOON] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 17, }, [SPECIES_BEAUTIFLY] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 9, }, [SPECIES_CASCOON] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 16, }, [SPECIES_DUSTOX] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 15, }, [SPECIES_LOTAD] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 14, }, [SPECIES_LOMBRE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_LUDICOLO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SEEDOT] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 16, }, [SPECIES_NUZLEAF] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 8, }, [SPECIES_SHIFTRY] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_NINCADA] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 18, }, [SPECIES_NINJASK] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_SHEDINJA] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_TAILLOW] = { .size = MON_COORDS_SIZE(48, 32), .y_offset = 16, }, [SPECIES_SWELLOW] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_SHROOMISH] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16, }, [SPECIES_BRELOOM] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_SPINDA] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 8, }, [SPECIES_WINGULL] = { .size = MON_COORDS_SIZE(64, 32), .y_offset = 24, }, [SPECIES_PELIPPER] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 4, }, [SPECIES_SURSKIT] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 15, }, [SPECIES_MASQUERAIN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_WAILMER] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 15, }, [SPECIES_WAILORD] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 10, }, [SPECIES_SKITTY] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 11, }, [SPECIES_DELCATTY] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_KECLEON] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_BALTOY] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 16, }, [SPECIES_CLAYDOL] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 6, }, [SPECIES_NOSEPASS] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 12, }, [SPECIES_TORKOAL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_SABLEYE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_BARBOACH] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 11, }, [SPECIES_WHISCASH] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 9, }, [SPECIES_LUVDISC] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 24, }, [SPECIES_CORPHISH] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 12, }, [SPECIES_CRAWDAUNT] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_FEEBAS] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 13, }, [SPECIES_MILOTIC] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_CARVANHA] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 6, }, [SPECIES_SHARPEDO] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3, }, [SPECIES_TRAPINCH] = { .size = MON_COORDS_SIZE(40, 32), .y_offset = 16, }, [SPECIES_VIBRAVA] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 12, }, [SPECIES_FLYGON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_MAKUHITA] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_HARIYAMA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_ELECTRIKE] = { .size = MON_COORDS_SIZE(48, 32), .y_offset = 18, }, [SPECIES_MANECTRIC] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 4, }, [SPECIES_NUMEL] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 15, }, [SPECIES_CAMERUPT] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 9, }, [SPECIES_SPHEAL] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 16, }, [SPECIES_SEALEO] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 10, }, [SPECIES_WALREIN] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_CACNEA] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 16, }, [SPECIES_CACTURNE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_SNORUNT] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11, }, [SPECIES_GLALIE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 10, }, [SPECIES_LUNATONE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_SOLROCK] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_AZURILL] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 15, }, [SPECIES_SPOINK] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 9, }, [SPECIES_GRUMPIG] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_PLUSLE] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 14, }, [SPECIES_MINUN] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 12, }, [SPECIES_MAWILE] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_MEDITITE] = { .size = MON_COORDS_SIZE(48, 40), .y_offset = 12, }, [SPECIES_MEDICHAM] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 1, }, [SPECIES_SWABLU] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 17, }, [SPECIES_ALTARIA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_WYNAUT] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_DUSKULL] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 10, }, [SPECIES_DUSCLOPS] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 5, }, [SPECIES_ROSELIA] = { .size = MON_COORDS_SIZE(56, 48), .y_offset = 8, }, [SPECIES_SLAKOTH] = { .size = MON_COORDS_SIZE(56, 32), .y_offset = 18, }, [SPECIES_VIGOROTH] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0, }, [SPECIES_SLAKING] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8, }, [SPECIES_GULPIN] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 18, }, [SPECIES_SWALOT] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_TROPIUS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_WHISMUR] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14, }, [SPECIES_LOUDRED] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3, }, [SPECIES_EXPLOUD] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_CLAMPERL] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 14, }, [SPECIES_HUNTAIL] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 3, }, [SPECIES_GOREBYSS] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 11, }, [SPECIES_ABSOL] = { .size = MON_COORDS_SIZE(48, 64), .y_offset = 0, }, [SPECIES_SHUPPET] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 14, }, [SPECIES_BANETTE] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 12, }, [SPECIES_SEVIPER] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 8, }, [SPECIES_ZANGOOSE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 5, }, [SPECIES_RELICANTH] = { .size = MON_COORDS_SIZE(56, 56), .y_offset = 11, }, [SPECIES_ARON] = { .size = MON_COORDS_SIZE(32, 24), .y_offset = 20, }, [SPECIES_LAIRON] = { .size = MON_COORDS_SIZE(56, 40), .y_offset = 13, }, [SPECIES_AGGRON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_CASTFORM] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 17, }, [SPECIES_VOLBEAT] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_ILLUMISE] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 8, }, [SPECIES_LILEEP] = { .size = MON_COORDS_SIZE(48, 56), .y_offset = 7, }, [SPECIES_CRADILY] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 0, }, [SPECIES_ANORITH] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 8, }, [SPECIES_ARMALDO] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_RALTS] = { .size = MON_COORDS_SIZE(24, 40), .y_offset = 15, }, [SPECIES_KIRLIA] = { .size = MON_COORDS_SIZE(32, 56), .y_offset = 6, }, [SPECIES_GARDEVOIR] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 1, }, [SPECIES_BAGON] = { .size = MON_COORDS_SIZE(40, 48), .y_offset = 11, }, [SPECIES_SHELGON] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9, }, [SPECIES_SALAMENCE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_BELDUM] = { .size = MON_COORDS_SIZE(40, 40), .y_offset = 15, }, [SPECIES_METANG] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 7, }, [SPECIES_METAGROSS] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 6, }, [SPECIES_REGIROCK] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 4, }, [SPECIES_REGICE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_REGISTEEL] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 3, }, [SPECIES_KYOGRE] = { .size = MON_COORDS_SIZE(64, 56), .y_offset = 4, }, [SPECIES_GROUDON] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_RAYQUAZA] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0, }, [SPECIES_LATIAS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_LATIOS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 2, }, [SPECIES_JIRACHI] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 13, }, [SPECIES_DEOXYS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 1, }, [SPECIES_CHIMECHO] = { .size = MON_COORDS_SIZE(24, 56), .y_offset = 6, }, [SPECIES_EGG] = { .size = MON_COORDS_SIZE(24, 24), .y_offset = 20, }, [SPECIES_UNOWN_B] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 16, }, [SPECIES_UNOWN_C] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 16, }, [SPECIES_UNOWN_D] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 16, }, [SPECIES_UNOWN_E] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 17, }, [SPECIES_UNOWN_F] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 17, }, [SPECIES_UNOWN_G] = { .size = MON_COORDS_SIZE(24, 40), .y_offset = 14, }, [SPECIES_UNOWN_H] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 16, }, [SPECIES_UNOWN_I] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 16, }, [SPECIES_UNOWN_J] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 17, }, [SPECIES_UNOWN_K] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 17, }, [SPECIES_UNOWN_L] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 19, }, [SPECIES_UNOWN_M] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 19, }, [SPECIES_UNOWN_N] = { .size = MON_COORDS_SIZE(32, 24), .y_offset = 20, }, [SPECIES_UNOWN_O] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 16, }, [SPECIES_UNOWN_P] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 19, }, [SPECIES_UNOWN_Q] = { .size = MON_COORDS_SIZE(32, 24), .y_offset = 21, }, [SPECIES_UNOWN_R] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 19, }, [SPECIES_UNOWN_S] = { .size = MON_COORDS_SIZE(32, 40), .y_offset = 12, }, [SPECIES_UNOWN_T] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 18, }, [SPECIES_UNOWN_U] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 18, }, [SPECIES_UNOWN_V] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 18, }, [SPECIES_UNOWN_W] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 19, }, [SPECIES_UNOWN_X] = { .size = MON_COORDS_SIZE(24, 24), .y_offset = 21, }, [SPECIES_UNOWN_Y] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 17, }, [SPECIES_UNOWN_Z] = { .size = MON_COORDS_SIZE(24, 32), .y_offset = 16, }, [SPECIES_UNOWN_EMARK] = { .size = MON_COORDS_SIZE(24, 40), .y_offset = 15, }, [SPECIES_UNOWN_QMARK] = { .size = MON_COORDS_SIZE(24, 40), .y_offset = 13, }, }; ================================================ FILE: src/data/pokemon_graphics/front_pic_table.h ================================================ const struct CompressedSpriteSheet gMonFrontPicTable[] = { SPECIES_SPRITE(NONE, gMonFrontPic_CircledQuestionMark), SPECIES_SPRITE(BULBASAUR, gMonFrontPic_Bulbasaur), SPECIES_SPRITE(IVYSAUR, gMonFrontPic_Ivysaur), SPECIES_SPRITE(VENUSAUR, gMonFrontPic_Venusaur), SPECIES_SPRITE(CHARMANDER, gMonFrontPic_Charmander), SPECIES_SPRITE(CHARMELEON, gMonFrontPic_Charmeleon), SPECIES_SPRITE(CHARIZARD, gMonFrontPic_Charizard), SPECIES_SPRITE(SQUIRTLE, gMonFrontPic_Squirtle), SPECIES_SPRITE(WARTORTLE, gMonFrontPic_Wartortle), SPECIES_SPRITE(BLASTOISE, gMonFrontPic_Blastoise), SPECIES_SPRITE(CATERPIE, gMonFrontPic_Caterpie), SPECIES_SPRITE(METAPOD, gMonFrontPic_Metapod), SPECIES_SPRITE(BUTTERFREE, gMonFrontPic_Butterfree), SPECIES_SPRITE(WEEDLE, gMonFrontPic_Weedle), SPECIES_SPRITE(KAKUNA, gMonFrontPic_Kakuna), SPECIES_SPRITE(BEEDRILL, gMonFrontPic_Beedrill), SPECIES_SPRITE(PIDGEY, gMonFrontPic_Pidgey), SPECIES_SPRITE(PIDGEOTTO, gMonFrontPic_Pidgeotto), SPECIES_SPRITE(PIDGEOT, gMonFrontPic_Pidgeot), SPECIES_SPRITE(RATTATA, gMonFrontPic_Rattata), SPECIES_SPRITE(RATICATE, gMonFrontPic_Raticate), SPECIES_SPRITE(SPEAROW, gMonFrontPic_Spearow), SPECIES_SPRITE(FEAROW, gMonFrontPic_Fearow), SPECIES_SPRITE(EKANS, gMonFrontPic_Ekans), SPECIES_SPRITE(ARBOK, gMonFrontPic_Arbok), SPECIES_SPRITE(PIKACHU, gMonFrontPic_Pikachu), SPECIES_SPRITE(RAICHU, gMonFrontPic_Raichu), SPECIES_SPRITE(SANDSHREW, gMonFrontPic_Sandshrew), SPECIES_SPRITE(SANDSLASH, gMonFrontPic_Sandslash), SPECIES_SPRITE(NIDORAN_F, gMonFrontPic_NidoranF), SPECIES_SPRITE(NIDORINA, gMonFrontPic_Nidorina), SPECIES_SPRITE(NIDOQUEEN, gMonFrontPic_Nidoqueen), SPECIES_SPRITE(NIDORAN_M, gMonFrontPic_NidoranM), SPECIES_SPRITE(NIDORINO, gMonFrontPic_Nidorino), SPECIES_SPRITE(NIDOKING, gMonFrontPic_Nidoking), SPECIES_SPRITE(CLEFAIRY, gMonFrontPic_Clefairy), SPECIES_SPRITE(CLEFABLE, gMonFrontPic_Clefable), SPECIES_SPRITE(VULPIX, gMonFrontPic_Vulpix), SPECIES_SPRITE(NINETALES, gMonFrontPic_Ninetales), SPECIES_SPRITE(JIGGLYPUFF, gMonFrontPic_Jigglypuff), SPECIES_SPRITE(WIGGLYTUFF, gMonFrontPic_Wigglytuff), SPECIES_SPRITE(ZUBAT, gMonFrontPic_Zubat), SPECIES_SPRITE(GOLBAT, gMonFrontPic_Golbat), SPECIES_SPRITE(ODDISH, gMonFrontPic_Oddish), SPECIES_SPRITE(GLOOM, gMonFrontPic_Gloom), SPECIES_SPRITE(VILEPLUME, gMonFrontPic_Vileplume), SPECIES_SPRITE(PARAS, gMonFrontPic_Paras), SPECIES_SPRITE(PARASECT, gMonFrontPic_Parasect), SPECIES_SPRITE(VENONAT, gMonFrontPic_Venonat), SPECIES_SPRITE(VENOMOTH, gMonFrontPic_Venomoth), SPECIES_SPRITE(DIGLETT, gMonFrontPic_Diglett), SPECIES_SPRITE(DUGTRIO, gMonFrontPic_Dugtrio), SPECIES_SPRITE(MEOWTH, gMonFrontPic_Meowth), SPECIES_SPRITE(PERSIAN, gMonFrontPic_Persian), SPECIES_SPRITE(PSYDUCK, gMonFrontPic_Psyduck), SPECIES_SPRITE(GOLDUCK, gMonFrontPic_Golduck), SPECIES_SPRITE(MANKEY, gMonFrontPic_Mankey), SPECIES_SPRITE(PRIMEAPE, gMonFrontPic_Primeape), SPECIES_SPRITE(GROWLITHE, gMonFrontPic_Growlithe), SPECIES_SPRITE(ARCANINE, gMonFrontPic_Arcanine), SPECIES_SPRITE(POLIWAG, gMonFrontPic_Poliwag), SPECIES_SPRITE(POLIWHIRL, gMonFrontPic_Poliwhirl), SPECIES_SPRITE(POLIWRATH, gMonFrontPic_Poliwrath), SPECIES_SPRITE(ABRA, gMonFrontPic_Abra), SPECIES_SPRITE(KADABRA, gMonFrontPic_Kadabra), SPECIES_SPRITE(ALAKAZAM, gMonFrontPic_Alakazam), SPECIES_SPRITE(MACHOP, gMonFrontPic_Machop), SPECIES_SPRITE(MACHOKE, gMonFrontPic_Machoke), SPECIES_SPRITE(MACHAMP, gMonFrontPic_Machamp), SPECIES_SPRITE(BELLSPROUT, gMonFrontPic_Bellsprout), SPECIES_SPRITE(WEEPINBELL, gMonFrontPic_Weepinbell), SPECIES_SPRITE(VICTREEBEL, gMonFrontPic_Victreebel), SPECIES_SPRITE(TENTACOOL, gMonFrontPic_Tentacool), SPECIES_SPRITE(TENTACRUEL, gMonFrontPic_Tentacruel), SPECIES_SPRITE(GEODUDE, gMonFrontPic_Geodude), SPECIES_SPRITE(GRAVELER, gMonFrontPic_Graveler), SPECIES_SPRITE(GOLEM, gMonFrontPic_Golem), SPECIES_SPRITE(PONYTA, gMonFrontPic_Ponyta), SPECIES_SPRITE(RAPIDASH, gMonFrontPic_Rapidash), SPECIES_SPRITE(SLOWPOKE, gMonFrontPic_Slowpoke), SPECIES_SPRITE(SLOWBRO, gMonFrontPic_Slowbro), SPECIES_SPRITE(MAGNEMITE, gMonFrontPic_Magnemite), SPECIES_SPRITE(MAGNETON, gMonFrontPic_Magneton), SPECIES_SPRITE(FARFETCHD, gMonFrontPic_Farfetchd), SPECIES_SPRITE(DODUO, gMonFrontPic_Doduo), SPECIES_SPRITE(DODRIO, gMonFrontPic_Dodrio), SPECIES_SPRITE(SEEL, gMonFrontPic_Seel), SPECIES_SPRITE(DEWGONG, gMonFrontPic_Dewgong), SPECIES_SPRITE(GRIMER, gMonFrontPic_Grimer), SPECIES_SPRITE(MUK, gMonFrontPic_Muk), SPECIES_SPRITE(SHELLDER, gMonFrontPic_Shellder), SPECIES_SPRITE(CLOYSTER, gMonFrontPic_Cloyster), SPECIES_SPRITE(GASTLY, gMonFrontPic_Gastly), SPECIES_SPRITE(HAUNTER, gMonFrontPic_Haunter), SPECIES_SPRITE(GENGAR, gMonFrontPic_Gengar), SPECIES_SPRITE(ONIX, gMonFrontPic_Onix), SPECIES_SPRITE(DROWZEE, gMonFrontPic_Drowzee), SPECIES_SPRITE(HYPNO, gMonFrontPic_Hypno), SPECIES_SPRITE(KRABBY, gMonFrontPic_Krabby), SPECIES_SPRITE(KINGLER, gMonFrontPic_Kingler), SPECIES_SPRITE(VOLTORB, gMonFrontPic_Voltorb), SPECIES_SPRITE(ELECTRODE, gMonFrontPic_Electrode), SPECIES_SPRITE(EXEGGCUTE, gMonFrontPic_Exeggcute), SPECIES_SPRITE(EXEGGUTOR, gMonFrontPic_Exeggutor), SPECIES_SPRITE(CUBONE, gMonFrontPic_Cubone), SPECIES_SPRITE(MAROWAK, gMonFrontPic_Marowak), SPECIES_SPRITE(HITMONLEE, gMonFrontPic_Hitmonlee), SPECIES_SPRITE(HITMONCHAN, gMonFrontPic_Hitmonchan), SPECIES_SPRITE(LICKITUNG, gMonFrontPic_Lickitung), SPECIES_SPRITE(KOFFING, gMonFrontPic_Koffing), SPECIES_SPRITE(WEEZING, gMonFrontPic_Weezing), SPECIES_SPRITE(RHYHORN, gMonFrontPic_Rhyhorn), SPECIES_SPRITE(RHYDON, gMonFrontPic_Rhydon), SPECIES_SPRITE(CHANSEY, gMonFrontPic_Chansey), SPECIES_SPRITE(TANGELA, gMonFrontPic_Tangela), SPECIES_SPRITE(KANGASKHAN, gMonFrontPic_Kangaskhan), SPECIES_SPRITE(HORSEA, gMonFrontPic_Horsea), SPECIES_SPRITE(SEADRA, gMonFrontPic_Seadra), SPECIES_SPRITE(GOLDEEN, gMonFrontPic_Goldeen), SPECIES_SPRITE(SEAKING, gMonFrontPic_Seaking), SPECIES_SPRITE(STARYU, gMonFrontPic_Staryu), SPECIES_SPRITE(STARMIE, gMonFrontPic_Starmie), SPECIES_SPRITE(MR_MIME, gMonFrontPic_Mrmime), SPECIES_SPRITE(SCYTHER, gMonFrontPic_Scyther), SPECIES_SPRITE(JYNX, gMonFrontPic_Jynx), SPECIES_SPRITE(ELECTABUZZ, gMonFrontPic_Electabuzz), SPECIES_SPRITE(MAGMAR, gMonFrontPic_Magmar), SPECIES_SPRITE(PINSIR, gMonFrontPic_Pinsir), SPECIES_SPRITE(TAUROS, gMonFrontPic_Tauros), SPECIES_SPRITE(MAGIKARP, gMonFrontPic_Magikarp), SPECIES_SPRITE(GYARADOS, gMonFrontPic_Gyarados), SPECIES_SPRITE(LAPRAS, gMonFrontPic_Lapras), SPECIES_SPRITE(DITTO, gMonFrontPic_Ditto), SPECIES_SPRITE(EEVEE, gMonFrontPic_Eevee), SPECIES_SPRITE(VAPOREON, gMonFrontPic_Vaporeon), SPECIES_SPRITE(JOLTEON, gMonFrontPic_Jolteon), SPECIES_SPRITE(FLAREON, gMonFrontPic_Flareon), SPECIES_SPRITE(PORYGON, gMonFrontPic_Porygon), SPECIES_SPRITE(OMANYTE, gMonFrontPic_Omanyte), SPECIES_SPRITE(OMASTAR, gMonFrontPic_Omastar), SPECIES_SPRITE(KABUTO, gMonFrontPic_Kabuto), SPECIES_SPRITE(KABUTOPS, gMonFrontPic_Kabutops), SPECIES_SPRITE(AERODACTYL, gMonFrontPic_Aerodactyl), SPECIES_SPRITE(SNORLAX, gMonFrontPic_Snorlax), SPECIES_SPRITE(ARTICUNO, gMonFrontPic_Articuno), SPECIES_SPRITE(ZAPDOS, gMonFrontPic_Zapdos), SPECIES_SPRITE(MOLTRES, gMonFrontPic_Moltres), SPECIES_SPRITE(DRATINI, gMonFrontPic_Dratini), SPECIES_SPRITE(DRAGONAIR, gMonFrontPic_Dragonair), SPECIES_SPRITE(DRAGONITE, gMonFrontPic_Dragonite), SPECIES_SPRITE(MEWTWO, gMonFrontPic_Mewtwo), SPECIES_SPRITE(MEW, gMonFrontPic_Mew), SPECIES_SPRITE(CHIKORITA, gMonFrontPic_Chikorita), SPECIES_SPRITE(BAYLEEF, gMonFrontPic_Bayleef), SPECIES_SPRITE(MEGANIUM, gMonFrontPic_Meganium), SPECIES_SPRITE(CYNDAQUIL, gMonFrontPic_Cyndaquil), SPECIES_SPRITE(QUILAVA, gMonFrontPic_Quilava), SPECIES_SPRITE(TYPHLOSION, gMonFrontPic_Typhlosion), SPECIES_SPRITE(TOTODILE, gMonFrontPic_Totodile), SPECIES_SPRITE(CROCONAW, gMonFrontPic_Croconaw), SPECIES_SPRITE(FERALIGATR, gMonFrontPic_Feraligatr), SPECIES_SPRITE(SENTRET, gMonFrontPic_Sentret), SPECIES_SPRITE(FURRET, gMonFrontPic_Furret), SPECIES_SPRITE(HOOTHOOT, gMonFrontPic_Hoothoot), SPECIES_SPRITE(NOCTOWL, gMonFrontPic_Noctowl), SPECIES_SPRITE(LEDYBA, gMonFrontPic_Ledyba), SPECIES_SPRITE(LEDIAN, gMonFrontPic_Ledian), SPECIES_SPRITE(SPINARAK, gMonFrontPic_Spinarak), SPECIES_SPRITE(ARIADOS, gMonFrontPic_Ariados), SPECIES_SPRITE(CROBAT, gMonFrontPic_Crobat), SPECIES_SPRITE(CHINCHOU, gMonFrontPic_Chinchou), SPECIES_SPRITE(LANTURN, gMonFrontPic_Lanturn), SPECIES_SPRITE(PICHU, gMonFrontPic_Pichu), SPECIES_SPRITE(CLEFFA, gMonFrontPic_Cleffa), SPECIES_SPRITE(IGGLYBUFF, gMonFrontPic_Igglybuff), SPECIES_SPRITE(TOGEPI, gMonFrontPic_Togepi), SPECIES_SPRITE(TOGETIC, gMonFrontPic_Togetic), SPECIES_SPRITE(NATU, gMonFrontPic_Natu), SPECIES_SPRITE(XATU, gMonFrontPic_Xatu), SPECIES_SPRITE(MAREEP, gMonFrontPic_Mareep), SPECIES_SPRITE(FLAAFFY, gMonFrontPic_Flaaffy), SPECIES_SPRITE(AMPHAROS, gMonFrontPic_Ampharos), SPECIES_SPRITE(BELLOSSOM, gMonFrontPic_Bellossom), SPECIES_SPRITE(MARILL, gMonFrontPic_Marill), SPECIES_SPRITE(AZUMARILL, gMonFrontPic_Azumarill), SPECIES_SPRITE(SUDOWOODO, gMonFrontPic_Sudowoodo), SPECIES_SPRITE(POLITOED, gMonFrontPic_Politoed), SPECIES_SPRITE(HOPPIP, gMonFrontPic_Hoppip), SPECIES_SPRITE(SKIPLOOM, gMonFrontPic_Skiploom), SPECIES_SPRITE(JUMPLUFF, gMonFrontPic_Jumpluff), SPECIES_SPRITE(AIPOM, gMonFrontPic_Aipom), SPECIES_SPRITE(SUNKERN, gMonFrontPic_Sunkern), SPECIES_SPRITE(SUNFLORA, gMonFrontPic_Sunflora), SPECIES_SPRITE(YANMA, gMonFrontPic_Yanma), SPECIES_SPRITE(WOOPER, gMonFrontPic_Wooper), SPECIES_SPRITE(QUAGSIRE, gMonFrontPic_Quagsire), SPECIES_SPRITE(ESPEON, gMonFrontPic_Espeon), SPECIES_SPRITE(UMBREON, gMonFrontPic_Umbreon), SPECIES_SPRITE(MURKROW, gMonFrontPic_Murkrow), SPECIES_SPRITE(SLOWKING, gMonFrontPic_Slowking), SPECIES_SPRITE(MISDREAVUS, gMonFrontPic_Misdreavus), SPECIES_SPRITE(UNOWN, gMonFrontPic_UnownA), SPECIES_SPRITE(WOBBUFFET, gMonFrontPic_Wobbuffet), SPECIES_SPRITE(GIRAFARIG, gMonFrontPic_Girafarig), SPECIES_SPRITE(PINECO, gMonFrontPic_Pineco), SPECIES_SPRITE(FORRETRESS, gMonFrontPic_Forretress), SPECIES_SPRITE(DUNSPARCE, gMonFrontPic_Dunsparce), SPECIES_SPRITE(GLIGAR, gMonFrontPic_Gligar), SPECIES_SPRITE(STEELIX, gMonFrontPic_Steelix), SPECIES_SPRITE(SNUBBULL, gMonFrontPic_Snubbull), SPECIES_SPRITE(GRANBULL, gMonFrontPic_Granbull), SPECIES_SPRITE(QWILFISH, gMonFrontPic_Qwilfish), SPECIES_SPRITE(SCIZOR, gMonFrontPic_Scizor), SPECIES_SPRITE(SHUCKLE, gMonFrontPic_Shuckle), SPECIES_SPRITE(HERACROSS, gMonFrontPic_Heracross), SPECIES_SPRITE(SNEASEL, gMonFrontPic_Sneasel), SPECIES_SPRITE(TEDDIURSA, gMonFrontPic_Teddiursa), SPECIES_SPRITE(URSARING, gMonFrontPic_Ursaring), SPECIES_SPRITE(SLUGMA, gMonFrontPic_Slugma), SPECIES_SPRITE(MAGCARGO, gMonFrontPic_Magcargo), SPECIES_SPRITE(SWINUB, gMonFrontPic_Swinub), SPECIES_SPRITE(PILOSWINE, gMonFrontPic_Piloswine), SPECIES_SPRITE(CORSOLA, gMonFrontPic_Corsola), SPECIES_SPRITE(REMORAID, gMonFrontPic_Remoraid), SPECIES_SPRITE(OCTILLERY, gMonFrontPic_Octillery), SPECIES_SPRITE(DELIBIRD, gMonFrontPic_Delibird), SPECIES_SPRITE(MANTINE, gMonFrontPic_Mantine), SPECIES_SPRITE(SKARMORY, gMonFrontPic_Skarmory), SPECIES_SPRITE(HOUNDOUR, gMonFrontPic_Houndour), SPECIES_SPRITE(HOUNDOOM, gMonFrontPic_Houndoom), SPECIES_SPRITE(KINGDRA, gMonFrontPic_Kingdra), SPECIES_SPRITE(PHANPY, gMonFrontPic_Phanpy), SPECIES_SPRITE(DONPHAN, gMonFrontPic_Donphan), SPECIES_SPRITE(PORYGON2, gMonFrontPic_Porygon2), SPECIES_SPRITE(STANTLER, gMonFrontPic_Stantler), SPECIES_SPRITE(SMEARGLE, gMonFrontPic_Smeargle), SPECIES_SPRITE(TYROGUE, gMonFrontPic_Tyrogue), SPECIES_SPRITE(HITMONTOP, gMonFrontPic_Hitmontop), SPECIES_SPRITE(SMOOCHUM, gMonFrontPic_Smoochum), SPECIES_SPRITE(ELEKID, gMonFrontPic_Elekid), SPECIES_SPRITE(MAGBY, gMonFrontPic_Magby), SPECIES_SPRITE(MILTANK, gMonFrontPic_Miltank), SPECIES_SPRITE(BLISSEY, gMonFrontPic_Blissey), SPECIES_SPRITE(RAIKOU, gMonFrontPic_Raikou), SPECIES_SPRITE(ENTEI, gMonFrontPic_Entei), SPECIES_SPRITE(SUICUNE, gMonFrontPic_Suicune), SPECIES_SPRITE(LARVITAR, gMonFrontPic_Larvitar), SPECIES_SPRITE(PUPITAR, gMonFrontPic_Pupitar), SPECIES_SPRITE(TYRANITAR, gMonFrontPic_Tyranitar), SPECIES_SPRITE(LUGIA, gMonFrontPic_Lugia), SPECIES_SPRITE(HO_OH, gMonFrontPic_HoOh), SPECIES_SPRITE(CELEBI, gMonFrontPic_Celebi), SPECIES_SPRITE(OLD_UNOWN_B, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_C, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_D, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_E, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_F, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_G, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_H, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_I, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_J, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_K, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_L, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_M, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_N, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_O, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_P, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_Q, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_R, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_S, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_T, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_U, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_V, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_W, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_X, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_Y, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(OLD_UNOWN_Z, gMonFrontPic_DoubleQuestionMark), SPECIES_SPRITE(TREECKO, gMonFrontPic_Treecko), SPECIES_SPRITE(GROVYLE, gMonFrontPic_Grovyle), SPECIES_SPRITE(SCEPTILE, gMonFrontPic_Sceptile), SPECIES_SPRITE(TORCHIC, gMonFrontPic_Torchic), SPECIES_SPRITE(COMBUSKEN, gMonFrontPic_Combusken), SPECIES_SPRITE(BLAZIKEN, gMonFrontPic_Blaziken), SPECIES_SPRITE(MUDKIP, gMonFrontPic_Mudkip), SPECIES_SPRITE(MARSHTOMP, gMonFrontPic_Marshtomp), SPECIES_SPRITE(SWAMPERT, gMonFrontPic_Swampert), SPECIES_SPRITE(POOCHYENA, gMonFrontPic_Poochyena), SPECIES_SPRITE(MIGHTYENA, gMonFrontPic_Mightyena), SPECIES_SPRITE(ZIGZAGOON, gMonFrontPic_Zigzagoon), SPECIES_SPRITE(LINOONE, gMonFrontPic_Linoone), SPECIES_SPRITE(WURMPLE, gMonFrontPic_Wurmple), SPECIES_SPRITE(SILCOON, gMonFrontPic_Silcoon), SPECIES_SPRITE(BEAUTIFLY, gMonFrontPic_Beautifly), SPECIES_SPRITE(CASCOON, gMonFrontPic_Cascoon), SPECIES_SPRITE(DUSTOX, gMonFrontPic_Dustox), SPECIES_SPRITE(LOTAD, gMonFrontPic_Lotad), SPECIES_SPRITE(LOMBRE, gMonFrontPic_Lombre), SPECIES_SPRITE(LUDICOLO, gMonFrontPic_Ludicolo), SPECIES_SPRITE(SEEDOT, gMonFrontPic_Seedot), SPECIES_SPRITE(NUZLEAF, gMonFrontPic_Nuzleaf), SPECIES_SPRITE(SHIFTRY, gMonFrontPic_Shiftry), SPECIES_SPRITE(NINCADA, gMonFrontPic_Nincada), SPECIES_SPRITE(NINJASK, gMonFrontPic_Ninjask), SPECIES_SPRITE(SHEDINJA, gMonFrontPic_Shedinja), SPECIES_SPRITE(TAILLOW, gMonFrontPic_Taillow), SPECIES_SPRITE(SWELLOW, gMonFrontPic_Swellow), SPECIES_SPRITE(SHROOMISH, gMonFrontPic_Shroomish), SPECIES_SPRITE(BRELOOM, gMonFrontPic_Breloom), SPECIES_SPRITE(SPINDA, gMonFrontPic_Spinda), SPECIES_SPRITE(WINGULL, gMonFrontPic_Wingull), SPECIES_SPRITE(PELIPPER, gMonFrontPic_Pelipper), SPECIES_SPRITE(SURSKIT, gMonFrontPic_Surskit), SPECIES_SPRITE(MASQUERAIN, gMonFrontPic_Masquerain), SPECIES_SPRITE(WAILMER, gMonFrontPic_Wailmer), SPECIES_SPRITE(WAILORD, gMonFrontPic_Wailord), SPECIES_SPRITE(SKITTY, gMonFrontPic_Skitty), SPECIES_SPRITE(DELCATTY, gMonFrontPic_Delcatty), SPECIES_SPRITE(KECLEON, gMonFrontPic_Kecleon), SPECIES_SPRITE(BALTOY, gMonFrontPic_Baltoy), SPECIES_SPRITE(CLAYDOL, gMonFrontPic_Claydol), SPECIES_SPRITE(NOSEPASS, gMonFrontPic_Nosepass), SPECIES_SPRITE(TORKOAL, gMonFrontPic_Torkoal), SPECIES_SPRITE(SABLEYE, gMonFrontPic_Sableye), SPECIES_SPRITE(BARBOACH, gMonFrontPic_Barboach), SPECIES_SPRITE(WHISCASH, gMonFrontPic_Whiscash), SPECIES_SPRITE(LUVDISC, gMonFrontPic_Luvdisc), SPECIES_SPRITE(CORPHISH, gMonFrontPic_Corphish), SPECIES_SPRITE(CRAWDAUNT, gMonFrontPic_Crawdaunt), SPECIES_SPRITE(FEEBAS, gMonFrontPic_Feebas), SPECIES_SPRITE(MILOTIC, gMonFrontPic_Milotic), SPECIES_SPRITE(CARVANHA, gMonFrontPic_Carvanha), SPECIES_SPRITE(SHARPEDO, gMonFrontPic_Sharpedo), SPECIES_SPRITE(TRAPINCH, gMonFrontPic_Trapinch), SPECIES_SPRITE(VIBRAVA, gMonFrontPic_Vibrava), SPECIES_SPRITE(FLYGON, gMonFrontPic_Flygon), SPECIES_SPRITE(MAKUHITA, gMonFrontPic_Makuhita), SPECIES_SPRITE(HARIYAMA, gMonFrontPic_Hariyama), SPECIES_SPRITE(ELECTRIKE, gMonFrontPic_Electrike), SPECIES_SPRITE(MANECTRIC, gMonFrontPic_Manectric), SPECIES_SPRITE(NUMEL, gMonFrontPic_Numel), SPECIES_SPRITE(CAMERUPT, gMonFrontPic_Camerupt), SPECIES_SPRITE(SPHEAL, gMonFrontPic_Spheal), SPECIES_SPRITE(SEALEO, gMonFrontPic_Sealeo), SPECIES_SPRITE(WALREIN, gMonFrontPic_Walrein), SPECIES_SPRITE(CACNEA, gMonFrontPic_Cacnea), SPECIES_SPRITE(CACTURNE, gMonFrontPic_Cacturne), SPECIES_SPRITE(SNORUNT, gMonFrontPic_Snorunt), SPECIES_SPRITE(GLALIE, gMonFrontPic_Glalie), SPECIES_SPRITE(LUNATONE, gMonFrontPic_Lunatone), SPECIES_SPRITE(SOLROCK, gMonFrontPic_Solrock), SPECIES_SPRITE(AZURILL, gMonFrontPic_Azurill), SPECIES_SPRITE(SPOINK, gMonFrontPic_Spoink), SPECIES_SPRITE(GRUMPIG, gMonFrontPic_Grumpig), SPECIES_SPRITE(PLUSLE, gMonFrontPic_Plusle), SPECIES_SPRITE(MINUN, gMonFrontPic_Minun), SPECIES_SPRITE(MAWILE, gMonFrontPic_Mawile), SPECIES_SPRITE(MEDITITE, gMonFrontPic_Meditite), SPECIES_SPRITE(MEDICHAM, gMonFrontPic_Medicham), SPECIES_SPRITE(SWABLU, gMonFrontPic_Swablu), SPECIES_SPRITE(ALTARIA, gMonFrontPic_Altaria), SPECIES_SPRITE(WYNAUT, gMonFrontPic_Wynaut), SPECIES_SPRITE(DUSKULL, gMonFrontPic_Duskull), SPECIES_SPRITE(DUSCLOPS, gMonFrontPic_Dusclops), SPECIES_SPRITE(ROSELIA, gMonFrontPic_Roselia), SPECIES_SPRITE(SLAKOTH, gMonFrontPic_Slakoth), SPECIES_SPRITE(VIGOROTH, gMonFrontPic_Vigoroth), SPECIES_SPRITE(SLAKING, gMonFrontPic_Slaking), SPECIES_SPRITE(GULPIN, gMonFrontPic_Gulpin), SPECIES_SPRITE(SWALOT, gMonFrontPic_Swalot), SPECIES_SPRITE(TROPIUS, gMonFrontPic_Tropius), SPECIES_SPRITE(WHISMUR, gMonFrontPic_Whismur), SPECIES_SPRITE(LOUDRED, gMonFrontPic_Loudred), SPECIES_SPRITE(EXPLOUD, gMonFrontPic_Exploud), SPECIES_SPRITE(CLAMPERL, gMonFrontPic_Clamperl), SPECIES_SPRITE(HUNTAIL, gMonFrontPic_Huntail), SPECIES_SPRITE(GOREBYSS, gMonFrontPic_Gorebyss), SPECIES_SPRITE(ABSOL, gMonFrontPic_Absol), SPECIES_SPRITE(SHUPPET, gMonFrontPic_Shuppet), SPECIES_SPRITE(BANETTE, gMonFrontPic_Banette), SPECIES_SPRITE(SEVIPER, gMonFrontPic_Seviper), SPECIES_SPRITE(ZANGOOSE, gMonFrontPic_Zangoose), SPECIES_SPRITE(RELICANTH, gMonFrontPic_Relicanth), SPECIES_SPRITE(ARON, gMonFrontPic_Aron), SPECIES_SPRITE(LAIRON, gMonFrontPic_Lairon), SPECIES_SPRITE(AGGRON, gMonFrontPic_Aggron), SPECIES_SPRITE(CASTFORM, gMonFrontPic_Castform), SPECIES_SPRITE(VOLBEAT, gMonFrontPic_Volbeat), SPECIES_SPRITE(ILLUMISE, gMonFrontPic_Illumise), SPECIES_SPRITE(LILEEP, gMonFrontPic_Lileep), SPECIES_SPRITE(CRADILY, gMonFrontPic_Cradily), SPECIES_SPRITE(ANORITH, gMonFrontPic_Anorith), SPECIES_SPRITE(ARMALDO, gMonFrontPic_Armaldo), SPECIES_SPRITE(RALTS, gMonFrontPic_Ralts), SPECIES_SPRITE(KIRLIA, gMonFrontPic_Kirlia), SPECIES_SPRITE(GARDEVOIR, gMonFrontPic_Gardevoir), SPECIES_SPRITE(BAGON, gMonFrontPic_Bagon), SPECIES_SPRITE(SHELGON, gMonFrontPic_Shelgon), SPECIES_SPRITE(SALAMENCE, gMonFrontPic_Salamence), SPECIES_SPRITE(BELDUM, gMonFrontPic_Beldum), SPECIES_SPRITE(METANG, gMonFrontPic_Metang), SPECIES_SPRITE(METAGROSS, gMonFrontPic_Metagross), SPECIES_SPRITE(REGIROCK, gMonFrontPic_Regirock), SPECIES_SPRITE(REGICE, gMonFrontPic_Regice), SPECIES_SPRITE(REGISTEEL, gMonFrontPic_Registeel), SPECIES_SPRITE(KYOGRE, gMonFrontPic_Kyogre), SPECIES_SPRITE(GROUDON, gMonFrontPic_Groudon), SPECIES_SPRITE(RAYQUAZA, gMonFrontPic_Rayquaza), SPECIES_SPRITE(LATIAS, gMonFrontPic_Latias), SPECIES_SPRITE(LATIOS, gMonFrontPic_Latios), SPECIES_SPRITE(JIRACHI, gMonFrontPic_Jirachi), SPECIES_SPRITE(DEOXYS, gMonFrontPic_Deoxys), SPECIES_SPRITE(CHIMECHO, gMonFrontPic_Chimecho), SPECIES_SPRITE(EGG, gMonFrontPic_Egg), SPECIES_SPRITE(UNOWN_B, gMonFrontPic_UnownB), SPECIES_SPRITE(UNOWN_C, gMonFrontPic_UnownC), SPECIES_SPRITE(UNOWN_D, gMonFrontPic_UnownD), SPECIES_SPRITE(UNOWN_E, gMonFrontPic_UnownE), SPECIES_SPRITE(UNOWN_F, gMonFrontPic_UnownF), SPECIES_SPRITE(UNOWN_G, gMonFrontPic_UnownG), SPECIES_SPRITE(UNOWN_H, gMonFrontPic_UnownH), SPECIES_SPRITE(UNOWN_I, gMonFrontPic_UnownI), SPECIES_SPRITE(UNOWN_J, gMonFrontPic_UnownJ), SPECIES_SPRITE(UNOWN_K, gMonFrontPic_UnownK), SPECIES_SPRITE(UNOWN_L, gMonFrontPic_UnownL), SPECIES_SPRITE(UNOWN_M, gMonFrontPic_UnownM), SPECIES_SPRITE(UNOWN_N, gMonFrontPic_UnownN), SPECIES_SPRITE(UNOWN_O, gMonFrontPic_UnownO), SPECIES_SPRITE(UNOWN_P, gMonFrontPic_UnownP), SPECIES_SPRITE(UNOWN_Q, gMonFrontPic_UnownQ), SPECIES_SPRITE(UNOWN_R, gMonFrontPic_UnownR), SPECIES_SPRITE(UNOWN_S, gMonFrontPic_UnownS), SPECIES_SPRITE(UNOWN_T, gMonFrontPic_UnownT), SPECIES_SPRITE(UNOWN_U, gMonFrontPic_UnownU), SPECIES_SPRITE(UNOWN_V, gMonFrontPic_UnownV), SPECIES_SPRITE(UNOWN_W, gMonFrontPic_UnownW), SPECIES_SPRITE(UNOWN_X, gMonFrontPic_UnownX), SPECIES_SPRITE(UNOWN_Y, gMonFrontPic_UnownY), SPECIES_SPRITE(UNOWN_Z, gMonFrontPic_UnownZ), SPECIES_SPRITE(UNOWN_EMARK, gMonFrontPic_UnownExclamationMark), SPECIES_SPRITE(UNOWN_QMARK, gMonFrontPic_UnownQuestionMark), }; ================================================ FILE: src/data/pokemon_graphics/palette_table.h ================================================ const struct CompressedSpritePalette gMonPaletteTable[] = { SPECIES_PAL(NONE, gMonPalette_CircledQuestionMark), SPECIES_PAL(BULBASAUR, gMonPalette_Bulbasaur), SPECIES_PAL(IVYSAUR, gMonPalette_Ivysaur), SPECIES_PAL(VENUSAUR, gMonPalette_Venusaur), SPECIES_PAL(CHARMANDER, gMonPalette_Charmander), SPECIES_PAL(CHARMELEON, gMonPalette_Charmeleon), SPECIES_PAL(CHARIZARD, gMonPalette_Charizard), SPECIES_PAL(SQUIRTLE, gMonPalette_Squirtle), SPECIES_PAL(WARTORTLE, gMonPalette_Wartortle), SPECIES_PAL(BLASTOISE, gMonPalette_Blastoise), SPECIES_PAL(CATERPIE, gMonPalette_Caterpie), SPECIES_PAL(METAPOD, gMonPalette_Metapod), SPECIES_PAL(BUTTERFREE, gMonPalette_Butterfree), SPECIES_PAL(WEEDLE, gMonPalette_Weedle), SPECIES_PAL(KAKUNA, gMonPalette_Kakuna), SPECIES_PAL(BEEDRILL, gMonPalette_Beedrill), SPECIES_PAL(PIDGEY, gMonPalette_Pidgey), SPECIES_PAL(PIDGEOTTO, gMonPalette_Pidgeotto), SPECIES_PAL(PIDGEOT, gMonPalette_Pidgeot), SPECIES_PAL(RATTATA, gMonPalette_Rattata), SPECIES_PAL(RATICATE, gMonPalette_Raticate), SPECIES_PAL(SPEAROW, gMonPalette_Spearow), SPECIES_PAL(FEAROW, gMonPalette_Fearow), SPECIES_PAL(EKANS, gMonPalette_Ekans), SPECIES_PAL(ARBOK, gMonPalette_Arbok), SPECIES_PAL(PIKACHU, gMonPalette_Pikachu), SPECIES_PAL(RAICHU, gMonPalette_Raichu), SPECIES_PAL(SANDSHREW, gMonPalette_Sandshrew), SPECIES_PAL(SANDSLASH, gMonPalette_Sandslash), SPECIES_PAL(NIDORAN_F, gMonPalette_NidoranF), SPECIES_PAL(NIDORINA, gMonPalette_Nidorina), SPECIES_PAL(NIDOQUEEN, gMonPalette_Nidoqueen), SPECIES_PAL(NIDORAN_M, gMonPalette_NidoranM), SPECIES_PAL(NIDORINO, gMonPalette_Nidorino), SPECIES_PAL(NIDOKING, gMonPalette_Nidoking), SPECIES_PAL(CLEFAIRY, gMonPalette_Clefairy), SPECIES_PAL(CLEFABLE, gMonPalette_Clefable), SPECIES_PAL(VULPIX, gMonPalette_Vulpix), SPECIES_PAL(NINETALES, gMonPalette_Ninetales), SPECIES_PAL(JIGGLYPUFF, gMonPalette_Jigglypuff), SPECIES_PAL(WIGGLYTUFF, gMonPalette_Wigglytuff), SPECIES_PAL(ZUBAT, gMonPalette_Zubat), SPECIES_PAL(GOLBAT, gMonPalette_Golbat), SPECIES_PAL(ODDISH, gMonPalette_Oddish), SPECIES_PAL(GLOOM, gMonPalette_Gloom), SPECIES_PAL(VILEPLUME, gMonPalette_Vileplume), SPECIES_PAL(PARAS, gMonPalette_Paras), SPECIES_PAL(PARASECT, gMonPalette_Parasect), SPECIES_PAL(VENONAT, gMonPalette_Venonat), SPECIES_PAL(VENOMOTH, gMonPalette_Venomoth), SPECIES_PAL(DIGLETT, gMonPalette_Diglett), SPECIES_PAL(DUGTRIO, gMonPalette_Dugtrio), SPECIES_PAL(MEOWTH, gMonPalette_Meowth), SPECIES_PAL(PERSIAN, gMonPalette_Persian), SPECIES_PAL(PSYDUCK, gMonPalette_Psyduck), SPECIES_PAL(GOLDUCK, gMonPalette_Golduck), SPECIES_PAL(MANKEY, gMonPalette_Mankey), SPECIES_PAL(PRIMEAPE, gMonPalette_Primeape), SPECIES_PAL(GROWLITHE, gMonPalette_Growlithe), SPECIES_PAL(ARCANINE, gMonPalette_Arcanine), SPECIES_PAL(POLIWAG, gMonPalette_Poliwag), SPECIES_PAL(POLIWHIRL, gMonPalette_Poliwhirl), SPECIES_PAL(POLIWRATH, gMonPalette_Poliwrath), SPECIES_PAL(ABRA, gMonPalette_Abra), SPECIES_PAL(KADABRA, gMonPalette_Kadabra), SPECIES_PAL(ALAKAZAM, gMonPalette_Alakazam), SPECIES_PAL(MACHOP, gMonPalette_Machop), SPECIES_PAL(MACHOKE, gMonPalette_Machoke), SPECIES_PAL(MACHAMP, gMonPalette_Machamp), SPECIES_PAL(BELLSPROUT, gMonPalette_Bellsprout), SPECIES_PAL(WEEPINBELL, gMonPalette_Weepinbell), SPECIES_PAL(VICTREEBEL, gMonPalette_Victreebel), SPECIES_PAL(TENTACOOL, gMonPalette_Tentacool), SPECIES_PAL(TENTACRUEL, gMonPalette_Tentacruel), SPECIES_PAL(GEODUDE, gMonPalette_Geodude), SPECIES_PAL(GRAVELER, gMonPalette_Graveler), SPECIES_PAL(GOLEM, gMonPalette_Golem), SPECIES_PAL(PONYTA, gMonPalette_Ponyta), SPECIES_PAL(RAPIDASH, gMonPalette_Rapidash), SPECIES_PAL(SLOWPOKE, gMonPalette_Slowpoke), SPECIES_PAL(SLOWBRO, gMonPalette_Slowbro), SPECIES_PAL(MAGNEMITE, gMonPalette_Magnemite), SPECIES_PAL(MAGNETON, gMonPalette_Magneton), SPECIES_PAL(FARFETCHD, gMonPalette_Farfetchd), SPECIES_PAL(DODUO, gMonPalette_Doduo), SPECIES_PAL(DODRIO, gMonPalette_Dodrio), SPECIES_PAL(SEEL, gMonPalette_Seel), SPECIES_PAL(DEWGONG, gMonPalette_Dewgong), SPECIES_PAL(GRIMER, gMonPalette_Grimer), SPECIES_PAL(MUK, gMonPalette_Muk), SPECIES_PAL(SHELLDER, gMonPalette_Shellder), SPECIES_PAL(CLOYSTER, gMonPalette_Cloyster), SPECIES_PAL(GASTLY, gMonPalette_Gastly), SPECIES_PAL(HAUNTER, gMonPalette_Haunter), SPECIES_PAL(GENGAR, gMonPalette_Gengar), SPECIES_PAL(ONIX, gMonPalette_Onix), SPECIES_PAL(DROWZEE, gMonPalette_Drowzee), SPECIES_PAL(HYPNO, gMonPalette_Hypno), SPECIES_PAL(KRABBY, gMonPalette_Krabby), SPECIES_PAL(KINGLER, gMonPalette_Kingler), SPECIES_PAL(VOLTORB, gMonPalette_Voltorb), SPECIES_PAL(ELECTRODE, gMonPalette_Electrode), SPECIES_PAL(EXEGGCUTE, gMonPalette_Exeggcute), SPECIES_PAL(EXEGGUTOR, gMonPalette_Exeggutor), SPECIES_PAL(CUBONE, gMonPalette_Cubone), SPECIES_PAL(MAROWAK, gMonPalette_Marowak), SPECIES_PAL(HITMONLEE, gMonPalette_Hitmonlee), SPECIES_PAL(HITMONCHAN, gMonPalette_Hitmonchan), SPECIES_PAL(LICKITUNG, gMonPalette_Lickitung), SPECIES_PAL(KOFFING, gMonPalette_Koffing), SPECIES_PAL(WEEZING, gMonPalette_Weezing), SPECIES_PAL(RHYHORN, gMonPalette_Rhyhorn), SPECIES_PAL(RHYDON, gMonPalette_Rhydon), SPECIES_PAL(CHANSEY, gMonPalette_Chansey), SPECIES_PAL(TANGELA, gMonPalette_Tangela), SPECIES_PAL(KANGASKHAN, gMonPalette_Kangaskhan), SPECIES_PAL(HORSEA, gMonPalette_Horsea), SPECIES_PAL(SEADRA, gMonPalette_Seadra), SPECIES_PAL(GOLDEEN, gMonPalette_Goldeen), SPECIES_PAL(SEAKING, gMonPalette_Seaking), SPECIES_PAL(STARYU, gMonPalette_Staryu), SPECIES_PAL(STARMIE, gMonPalette_Starmie), SPECIES_PAL(MR_MIME, gMonPalette_Mrmime), SPECIES_PAL(SCYTHER, gMonPalette_Scyther), SPECIES_PAL(JYNX, gMonPalette_Jynx), SPECIES_PAL(ELECTABUZZ, gMonPalette_Electabuzz), SPECIES_PAL(MAGMAR, gMonPalette_Magmar), SPECIES_PAL(PINSIR, gMonPalette_Pinsir), SPECIES_PAL(TAUROS, gMonPalette_Tauros), SPECIES_PAL(MAGIKARP, gMonPalette_Magikarp), SPECIES_PAL(GYARADOS, gMonPalette_Gyarados), SPECIES_PAL(LAPRAS, gMonPalette_Lapras), SPECIES_PAL(DITTO, gMonPalette_Ditto), SPECIES_PAL(EEVEE, gMonPalette_Eevee), SPECIES_PAL(VAPOREON, gMonPalette_Vaporeon), SPECIES_PAL(JOLTEON, gMonPalette_Jolteon), SPECIES_PAL(FLAREON, gMonPalette_Flareon), SPECIES_PAL(PORYGON, gMonPalette_Porygon), SPECIES_PAL(OMANYTE, gMonPalette_Omanyte), SPECIES_PAL(OMASTAR, gMonPalette_Omastar), SPECIES_PAL(KABUTO, gMonPalette_Kabuto), SPECIES_PAL(KABUTOPS, gMonPalette_Kabutops), SPECIES_PAL(AERODACTYL, gMonPalette_Aerodactyl), SPECIES_PAL(SNORLAX, gMonPalette_Snorlax), SPECIES_PAL(ARTICUNO, gMonPalette_Articuno), SPECIES_PAL(ZAPDOS, gMonPalette_Zapdos), SPECIES_PAL(MOLTRES, gMonPalette_Moltres), SPECIES_PAL(DRATINI, gMonPalette_Dratini), SPECIES_PAL(DRAGONAIR, gMonPalette_Dragonair), SPECIES_PAL(DRAGONITE, gMonPalette_Dragonite), SPECIES_PAL(MEWTWO, gMonPalette_Mewtwo), SPECIES_PAL(MEW, gMonPalette_Mew), SPECIES_PAL(CHIKORITA, gMonPalette_Chikorita), SPECIES_PAL(BAYLEEF, gMonPalette_Bayleef), SPECIES_PAL(MEGANIUM, gMonPalette_Meganium), SPECIES_PAL(CYNDAQUIL, gMonPalette_Cyndaquil), SPECIES_PAL(QUILAVA, gMonPalette_Quilava), SPECIES_PAL(TYPHLOSION, gMonPalette_Typhlosion), SPECIES_PAL(TOTODILE, gMonPalette_Totodile), SPECIES_PAL(CROCONAW, gMonPalette_Croconaw), SPECIES_PAL(FERALIGATR, gMonPalette_Feraligatr), SPECIES_PAL(SENTRET, gMonPalette_Sentret), SPECIES_PAL(FURRET, gMonPalette_Furret), SPECIES_PAL(HOOTHOOT, gMonPalette_Hoothoot), SPECIES_PAL(NOCTOWL, gMonPalette_Noctowl), SPECIES_PAL(LEDYBA, gMonPalette_Ledyba), SPECIES_PAL(LEDIAN, gMonPalette_Ledian), SPECIES_PAL(SPINARAK, gMonPalette_Spinarak), SPECIES_PAL(ARIADOS, gMonPalette_Ariados), SPECIES_PAL(CROBAT, gMonPalette_Crobat), SPECIES_PAL(CHINCHOU, gMonPalette_Chinchou), SPECIES_PAL(LANTURN, gMonPalette_Lanturn), SPECIES_PAL(PICHU, gMonPalette_Pichu), SPECIES_PAL(CLEFFA, gMonPalette_Cleffa), SPECIES_PAL(IGGLYBUFF, gMonPalette_Igglybuff), SPECIES_PAL(TOGEPI, gMonPalette_Togepi), SPECIES_PAL(TOGETIC, gMonPalette_Togetic), SPECIES_PAL(NATU, gMonPalette_Natu), SPECIES_PAL(XATU, gMonPalette_Xatu), SPECIES_PAL(MAREEP, gMonPalette_Mareep), SPECIES_PAL(FLAAFFY, gMonPalette_Flaaffy), SPECIES_PAL(AMPHAROS, gMonPalette_Ampharos), SPECIES_PAL(BELLOSSOM, gMonPalette_Bellossom), SPECIES_PAL(MARILL, gMonPalette_Marill), SPECIES_PAL(AZUMARILL, gMonPalette_Azumarill), SPECIES_PAL(SUDOWOODO, gMonPalette_Sudowoodo), SPECIES_PAL(POLITOED, gMonPalette_Politoed), SPECIES_PAL(HOPPIP, gMonPalette_Hoppip), SPECIES_PAL(SKIPLOOM, gMonPalette_Skiploom), SPECIES_PAL(JUMPLUFF, gMonPalette_Jumpluff), SPECIES_PAL(AIPOM, gMonPalette_Aipom), SPECIES_PAL(SUNKERN, gMonPalette_Sunkern), SPECIES_PAL(SUNFLORA, gMonPalette_Sunflora), SPECIES_PAL(YANMA, gMonPalette_Yanma), SPECIES_PAL(WOOPER, gMonPalette_Wooper), SPECIES_PAL(QUAGSIRE, gMonPalette_Quagsire), SPECIES_PAL(ESPEON, gMonPalette_Espeon), SPECIES_PAL(UMBREON, gMonPalette_Umbreon), SPECIES_PAL(MURKROW, gMonPalette_Murkrow), SPECIES_PAL(SLOWKING, gMonPalette_Slowking), SPECIES_PAL(MISDREAVUS, gMonPalette_Misdreavus), SPECIES_PAL(UNOWN, gMonPalette_Unown), SPECIES_PAL(WOBBUFFET, gMonPalette_Wobbuffet), SPECIES_PAL(GIRAFARIG, gMonPalette_Girafarig), SPECIES_PAL(PINECO, gMonPalette_Pineco), SPECIES_PAL(FORRETRESS, gMonPalette_Forretress), SPECIES_PAL(DUNSPARCE, gMonPalette_Dunsparce), SPECIES_PAL(GLIGAR, gMonPalette_Gligar), SPECIES_PAL(STEELIX, gMonPalette_Steelix), SPECIES_PAL(SNUBBULL, gMonPalette_Snubbull), SPECIES_PAL(GRANBULL, gMonPalette_Granbull), SPECIES_PAL(QWILFISH, gMonPalette_Qwilfish), SPECIES_PAL(SCIZOR, gMonPalette_Scizor), SPECIES_PAL(SHUCKLE, gMonPalette_Shuckle), SPECIES_PAL(HERACROSS, gMonPalette_Heracross), SPECIES_PAL(SNEASEL, gMonPalette_Sneasel), SPECIES_PAL(TEDDIURSA, gMonPalette_Teddiursa), SPECIES_PAL(URSARING, gMonPalette_Ursaring), SPECIES_PAL(SLUGMA, gMonPalette_Slugma), SPECIES_PAL(MAGCARGO, gMonPalette_Magcargo), SPECIES_PAL(SWINUB, gMonPalette_Swinub), SPECIES_PAL(PILOSWINE, gMonPalette_Piloswine), SPECIES_PAL(CORSOLA, gMonPalette_Corsola), SPECIES_PAL(REMORAID, gMonPalette_Remoraid), SPECIES_PAL(OCTILLERY, gMonPalette_Octillery), SPECIES_PAL(DELIBIRD, gMonPalette_Delibird), SPECIES_PAL(MANTINE, gMonPalette_Mantine), SPECIES_PAL(SKARMORY, gMonPalette_Skarmory), SPECIES_PAL(HOUNDOUR, gMonPalette_Houndour), SPECIES_PAL(HOUNDOOM, gMonPalette_Houndoom), SPECIES_PAL(KINGDRA, gMonPalette_Kingdra), SPECIES_PAL(PHANPY, gMonPalette_Phanpy), SPECIES_PAL(DONPHAN, gMonPalette_Donphan), SPECIES_PAL(PORYGON2, gMonPalette_Porygon2), SPECIES_PAL(STANTLER, gMonPalette_Stantler), SPECIES_PAL(SMEARGLE, gMonPalette_Smeargle), SPECIES_PAL(TYROGUE, gMonPalette_Tyrogue), SPECIES_PAL(HITMONTOP, gMonPalette_Hitmontop), SPECIES_PAL(SMOOCHUM, gMonPalette_Smoochum), SPECIES_PAL(ELEKID, gMonPalette_Elekid), SPECIES_PAL(MAGBY, gMonPalette_Magby), SPECIES_PAL(MILTANK, gMonPalette_Miltank), SPECIES_PAL(BLISSEY, gMonPalette_Blissey), SPECIES_PAL(RAIKOU, gMonPalette_Raikou), SPECIES_PAL(ENTEI, gMonPalette_Entei), SPECIES_PAL(SUICUNE, gMonPalette_Suicune), SPECIES_PAL(LARVITAR, gMonPalette_Larvitar), SPECIES_PAL(PUPITAR, gMonPalette_Pupitar), SPECIES_PAL(TYRANITAR, gMonPalette_Tyranitar), SPECIES_PAL(LUGIA, gMonPalette_Lugia), SPECIES_PAL(HO_OH, gMonPalette_HoOh), SPECIES_PAL(CELEBI, gMonPalette_Celebi), SPECIES_PAL(OLD_UNOWN_B, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_C, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_D, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_E, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_F, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_G, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_H, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_I, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_J, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_K, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_L, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_M, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_N, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_O, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_P, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_Q, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_R, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_S, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_T, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_U, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_V, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_W, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_X, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_Y, gMonPalette_DoubleQuestionMark), SPECIES_PAL(OLD_UNOWN_Z, gMonPalette_DoubleQuestionMark), SPECIES_PAL(TREECKO, gMonPalette_Treecko), SPECIES_PAL(GROVYLE, gMonPalette_Grovyle), SPECIES_PAL(SCEPTILE, gMonPalette_Sceptile), SPECIES_PAL(TORCHIC, gMonPalette_Torchic), SPECIES_PAL(COMBUSKEN, gMonPalette_Combusken), SPECIES_PAL(BLAZIKEN, gMonPalette_Blaziken), SPECIES_PAL(MUDKIP, gMonPalette_Mudkip), SPECIES_PAL(MARSHTOMP, gMonPalette_Marshtomp), SPECIES_PAL(SWAMPERT, gMonPalette_Swampert), SPECIES_PAL(POOCHYENA, gMonPalette_Poochyena), SPECIES_PAL(MIGHTYENA, gMonPalette_Mightyena), SPECIES_PAL(ZIGZAGOON, gMonPalette_Zigzagoon), SPECIES_PAL(LINOONE, gMonPalette_Linoone), SPECIES_PAL(WURMPLE, gMonPalette_Wurmple), SPECIES_PAL(SILCOON, gMonPalette_Silcoon), SPECIES_PAL(BEAUTIFLY, gMonPalette_Beautifly), SPECIES_PAL(CASCOON, gMonPalette_Cascoon), SPECIES_PAL(DUSTOX, gMonPalette_Dustox), SPECIES_PAL(LOTAD, gMonPalette_Lotad), SPECIES_PAL(LOMBRE, gMonPalette_Lombre), SPECIES_PAL(LUDICOLO, gMonPalette_Ludicolo), SPECIES_PAL(SEEDOT, gMonPalette_Seedot), SPECIES_PAL(NUZLEAF, gMonPalette_Nuzleaf), SPECIES_PAL(SHIFTRY, gMonPalette_Shiftry), SPECIES_PAL(NINCADA, gMonPalette_Nincada), SPECIES_PAL(NINJASK, gMonPalette_Ninjask), SPECIES_PAL(SHEDINJA, gMonPalette_Shedinja), SPECIES_PAL(TAILLOW, gMonPalette_Taillow), SPECIES_PAL(SWELLOW, gMonPalette_Swellow), SPECIES_PAL(SHROOMISH, gMonPalette_Shroomish), SPECIES_PAL(BRELOOM, gMonPalette_Breloom), SPECIES_PAL(SPINDA, gMonPalette_Spinda), SPECIES_PAL(WINGULL, gMonPalette_Wingull), SPECIES_PAL(PELIPPER, gMonPalette_Pelipper), SPECIES_PAL(SURSKIT, gMonPalette_Surskit), SPECIES_PAL(MASQUERAIN, gMonPalette_Masquerain), SPECIES_PAL(WAILMER, gMonPalette_Wailmer), SPECIES_PAL(WAILORD, gMonPalette_Wailord), SPECIES_PAL(SKITTY, gMonPalette_Skitty), SPECIES_PAL(DELCATTY, gMonPalette_Delcatty), SPECIES_PAL(KECLEON, gMonPalette_Kecleon), SPECIES_PAL(BALTOY, gMonPalette_Baltoy), SPECIES_PAL(CLAYDOL, gMonPalette_Claydol), SPECIES_PAL(NOSEPASS, gMonPalette_Nosepass), SPECIES_PAL(TORKOAL, gMonPalette_Torkoal), SPECIES_PAL(SABLEYE, gMonPalette_Sableye), SPECIES_PAL(BARBOACH, gMonPalette_Barboach), SPECIES_PAL(WHISCASH, gMonPalette_Whiscash), SPECIES_PAL(LUVDISC, gMonPalette_Luvdisc), SPECIES_PAL(CORPHISH, gMonPalette_Corphish), SPECIES_PAL(CRAWDAUNT, gMonPalette_Crawdaunt), SPECIES_PAL(FEEBAS, gMonPalette_Feebas), SPECIES_PAL(MILOTIC, gMonPalette_Milotic), SPECIES_PAL(CARVANHA, gMonPalette_Carvanha), SPECIES_PAL(SHARPEDO, gMonPalette_Sharpedo), SPECIES_PAL(TRAPINCH, gMonPalette_Trapinch), SPECIES_PAL(VIBRAVA, gMonPalette_Vibrava), SPECIES_PAL(FLYGON, gMonPalette_Flygon), SPECIES_PAL(MAKUHITA, gMonPalette_Makuhita), SPECIES_PAL(HARIYAMA, gMonPalette_Hariyama), SPECIES_PAL(ELECTRIKE, gMonPalette_Electrike), SPECIES_PAL(MANECTRIC, gMonPalette_Manectric), SPECIES_PAL(NUMEL, gMonPalette_Numel), SPECIES_PAL(CAMERUPT, gMonPalette_Camerupt), SPECIES_PAL(SPHEAL, gMonPalette_Spheal), SPECIES_PAL(SEALEO, gMonPalette_Sealeo), SPECIES_PAL(WALREIN, gMonPalette_Walrein), SPECIES_PAL(CACNEA, gMonPalette_Cacnea), SPECIES_PAL(CACTURNE, gMonPalette_Cacturne), SPECIES_PAL(SNORUNT, gMonPalette_Snorunt), SPECIES_PAL(GLALIE, gMonPalette_Glalie), SPECIES_PAL(LUNATONE, gMonPalette_Lunatone), SPECIES_PAL(SOLROCK, gMonPalette_Solrock), SPECIES_PAL(AZURILL, gMonPalette_Azurill), SPECIES_PAL(SPOINK, gMonPalette_Spoink), SPECIES_PAL(GRUMPIG, gMonPalette_Grumpig), SPECIES_PAL(PLUSLE, gMonPalette_Plusle), SPECIES_PAL(MINUN, gMonPalette_Minun), SPECIES_PAL(MAWILE, gMonPalette_Mawile), SPECIES_PAL(MEDITITE, gMonPalette_Meditite), SPECIES_PAL(MEDICHAM, gMonPalette_Medicham), SPECIES_PAL(SWABLU, gMonPalette_Swablu), SPECIES_PAL(ALTARIA, gMonPalette_Altaria), SPECIES_PAL(WYNAUT, gMonPalette_Wynaut), SPECIES_PAL(DUSKULL, gMonPalette_Duskull), SPECIES_PAL(DUSCLOPS, gMonPalette_Dusclops), SPECIES_PAL(ROSELIA, gMonPalette_Roselia), SPECIES_PAL(SLAKOTH, gMonPalette_Slakoth), SPECIES_PAL(VIGOROTH, gMonPalette_Vigoroth), SPECIES_PAL(SLAKING, gMonPalette_Slaking), SPECIES_PAL(GULPIN, gMonPalette_Gulpin), SPECIES_PAL(SWALOT, gMonPalette_Swalot), SPECIES_PAL(TROPIUS, gMonPalette_Tropius), SPECIES_PAL(WHISMUR, gMonPalette_Whismur), SPECIES_PAL(LOUDRED, gMonPalette_Loudred), SPECIES_PAL(EXPLOUD, gMonPalette_Exploud), SPECIES_PAL(CLAMPERL, gMonPalette_Clamperl), SPECIES_PAL(HUNTAIL, gMonPalette_Huntail), SPECIES_PAL(GOREBYSS, gMonPalette_Gorebyss), SPECIES_PAL(ABSOL, gMonPalette_Absol), SPECIES_PAL(SHUPPET, gMonPalette_Shuppet), SPECIES_PAL(BANETTE, gMonPalette_Banette), SPECIES_PAL(SEVIPER, gMonPalette_Seviper), SPECIES_PAL(ZANGOOSE, gMonPalette_Zangoose), SPECIES_PAL(RELICANTH, gMonPalette_Relicanth), SPECIES_PAL(ARON, gMonPalette_Aron), SPECIES_PAL(LAIRON, gMonPalette_Lairon), SPECIES_PAL(AGGRON, gMonPalette_Aggron), SPECIES_PAL(CASTFORM, gMonPalette_Castform), SPECIES_PAL(VOLBEAT, gMonPalette_Volbeat), SPECIES_PAL(ILLUMISE, gMonPalette_Illumise), SPECIES_PAL(LILEEP, gMonPalette_Lileep), SPECIES_PAL(CRADILY, gMonPalette_Cradily), SPECIES_PAL(ANORITH, gMonPalette_Anorith), SPECIES_PAL(ARMALDO, gMonPalette_Armaldo), SPECIES_PAL(RALTS, gMonPalette_Ralts), SPECIES_PAL(KIRLIA, gMonPalette_Kirlia), SPECIES_PAL(GARDEVOIR, gMonPalette_Gardevoir), SPECIES_PAL(BAGON, gMonPalette_Bagon), SPECIES_PAL(SHELGON, gMonPalette_Shelgon), SPECIES_PAL(SALAMENCE, gMonPalette_Salamence), SPECIES_PAL(BELDUM, gMonPalette_Beldum), SPECIES_PAL(METANG, gMonPalette_Metang), SPECIES_PAL(METAGROSS, gMonPalette_Metagross), SPECIES_PAL(REGIROCK, gMonPalette_Regirock), SPECIES_PAL(REGICE, gMonPalette_Regice), SPECIES_PAL(REGISTEEL, gMonPalette_Registeel), SPECIES_PAL(KYOGRE, gMonPalette_Kyogre), SPECIES_PAL(GROUDON, gMonPalette_Groudon), SPECIES_PAL(RAYQUAZA, gMonPalette_Rayquaza), SPECIES_PAL(LATIAS, gMonPalette_Latias), SPECIES_PAL(LATIOS, gMonPalette_Latios), SPECIES_PAL(JIRACHI, gMonPalette_Jirachi), SPECIES_PAL(DEOXYS, gMonPalette_Deoxys), SPECIES_PAL(CHIMECHO, gMonPalette_Chimecho), SPECIES_PAL(EGG, gMonPalette_Egg), SPECIES_PAL(UNOWN_B, gMonPalette_Unown), SPECIES_PAL(UNOWN_C, gMonPalette_Unown), SPECIES_PAL(UNOWN_D, gMonPalette_Unown), SPECIES_PAL(UNOWN_E, gMonPalette_Unown), SPECIES_PAL(UNOWN_F, gMonPalette_Unown), SPECIES_PAL(UNOWN_G, gMonPalette_Unown), SPECIES_PAL(UNOWN_H, gMonPalette_Unown), SPECIES_PAL(UNOWN_I, gMonPalette_Unown), SPECIES_PAL(UNOWN_J, gMonPalette_Unown), SPECIES_PAL(UNOWN_K, gMonPalette_Unown), SPECIES_PAL(UNOWN_L, gMonPalette_Unown), SPECIES_PAL(UNOWN_M, gMonPalette_Unown), SPECIES_PAL(UNOWN_N, gMonPalette_Unown), SPECIES_PAL(UNOWN_O, gMonPalette_Unown), SPECIES_PAL(UNOWN_P, gMonPalette_Unown), SPECIES_PAL(UNOWN_Q, gMonPalette_Unown), SPECIES_PAL(UNOWN_R, gMonPalette_Unown), SPECIES_PAL(UNOWN_S, gMonPalette_Unown), SPECIES_PAL(UNOWN_T, gMonPalette_Unown), SPECIES_PAL(UNOWN_U, gMonPalette_Unown), SPECIES_PAL(UNOWN_V, gMonPalette_Unown), SPECIES_PAL(UNOWN_W, gMonPalette_Unown), SPECIES_PAL(UNOWN_X, gMonPalette_Unown), SPECIES_PAL(UNOWN_Y, gMonPalette_Unown), SPECIES_PAL(UNOWN_Z, gMonPalette_Unown), SPECIES_PAL(UNOWN_EMARK, gMonPalette_Unown), SPECIES_PAL(UNOWN_QMARK, gMonPalette_Unown), }; ================================================ FILE: src/data/pokemon_graphics/shiny_palette_table.h ================================================ const struct CompressedSpritePalette gMonShinyPaletteTable[] = { SPECIES_SHINY_PAL(NONE, gMonShinyPalette_CircledQuestionMark), SPECIES_SHINY_PAL(BULBASAUR, gMonShinyPalette_Bulbasaur), SPECIES_SHINY_PAL(IVYSAUR, gMonShinyPalette_Ivysaur), SPECIES_SHINY_PAL(VENUSAUR, gMonShinyPalette_Venusaur), SPECIES_SHINY_PAL(CHARMANDER, gMonShinyPalette_Charmander), SPECIES_SHINY_PAL(CHARMELEON, gMonShinyPalette_Charmeleon), SPECIES_SHINY_PAL(CHARIZARD, gMonShinyPalette_Charizard), SPECIES_SHINY_PAL(SQUIRTLE, gMonShinyPalette_Squirtle), SPECIES_SHINY_PAL(WARTORTLE, gMonShinyPalette_Wartortle), SPECIES_SHINY_PAL(BLASTOISE, gMonShinyPalette_Blastoise), SPECIES_SHINY_PAL(CATERPIE, gMonShinyPalette_Caterpie), SPECIES_SHINY_PAL(METAPOD, gMonShinyPalette_Metapod), SPECIES_SHINY_PAL(BUTTERFREE, gMonShinyPalette_Butterfree), SPECIES_SHINY_PAL(WEEDLE, gMonShinyPalette_Weedle), SPECIES_SHINY_PAL(KAKUNA, gMonShinyPalette_Kakuna), SPECIES_SHINY_PAL(BEEDRILL, gMonShinyPalette_Beedrill), SPECIES_SHINY_PAL(PIDGEY, gMonShinyPalette_Pidgey), SPECIES_SHINY_PAL(PIDGEOTTO, gMonShinyPalette_Pidgeotto), SPECIES_SHINY_PAL(PIDGEOT, gMonShinyPalette_Pidgeot), SPECIES_SHINY_PAL(RATTATA, gMonShinyPalette_Rattata), SPECIES_SHINY_PAL(RATICATE, gMonShinyPalette_Raticate), SPECIES_SHINY_PAL(SPEAROW, gMonShinyPalette_Spearow), SPECIES_SHINY_PAL(FEAROW, gMonShinyPalette_Fearow), SPECIES_SHINY_PAL(EKANS, gMonShinyPalette_Ekans), SPECIES_SHINY_PAL(ARBOK, gMonShinyPalette_Arbok), SPECIES_SHINY_PAL(PIKACHU, gMonShinyPalette_Pikachu), SPECIES_SHINY_PAL(RAICHU, gMonShinyPalette_Raichu), SPECIES_SHINY_PAL(SANDSHREW, gMonShinyPalette_Sandshrew), SPECIES_SHINY_PAL(SANDSLASH, gMonShinyPalette_Sandslash), SPECIES_SHINY_PAL(NIDORAN_F, gMonShinyPalette_NidoranF), SPECIES_SHINY_PAL(NIDORINA, gMonShinyPalette_Nidorina), SPECIES_SHINY_PAL(NIDOQUEEN, gMonShinyPalette_Nidoqueen), SPECIES_SHINY_PAL(NIDORAN_M, gMonShinyPalette_NidoranM), SPECIES_SHINY_PAL(NIDORINO, gMonShinyPalette_Nidorino), SPECIES_SHINY_PAL(NIDOKING, gMonShinyPalette_Nidoking), SPECIES_SHINY_PAL(CLEFAIRY, gMonShinyPalette_Clefairy), SPECIES_SHINY_PAL(CLEFABLE, gMonShinyPalette_Clefable), SPECIES_SHINY_PAL(VULPIX, gMonShinyPalette_Vulpix), SPECIES_SHINY_PAL(NINETALES, gMonShinyPalette_Ninetales), SPECIES_SHINY_PAL(JIGGLYPUFF, gMonShinyPalette_Jigglypuff), SPECIES_SHINY_PAL(WIGGLYTUFF, gMonShinyPalette_Wigglytuff), SPECIES_SHINY_PAL(ZUBAT, gMonShinyPalette_Zubat), SPECIES_SHINY_PAL(GOLBAT, gMonShinyPalette_Golbat), SPECIES_SHINY_PAL(ODDISH, gMonShinyPalette_Oddish), SPECIES_SHINY_PAL(GLOOM, gMonShinyPalette_Gloom), SPECIES_SHINY_PAL(VILEPLUME, gMonShinyPalette_Vileplume), SPECIES_SHINY_PAL(PARAS, gMonShinyPalette_Paras), SPECIES_SHINY_PAL(PARASECT, gMonShinyPalette_Parasect), SPECIES_SHINY_PAL(VENONAT, gMonShinyPalette_Venonat), SPECIES_SHINY_PAL(VENOMOTH, gMonShinyPalette_Venomoth), SPECIES_SHINY_PAL(DIGLETT, gMonShinyPalette_Diglett), SPECIES_SHINY_PAL(DUGTRIO, gMonShinyPalette_Dugtrio), SPECIES_SHINY_PAL(MEOWTH, gMonShinyPalette_Meowth), SPECIES_SHINY_PAL(PERSIAN, gMonShinyPalette_Persian), SPECIES_SHINY_PAL(PSYDUCK, gMonShinyPalette_Psyduck), SPECIES_SHINY_PAL(GOLDUCK, gMonShinyPalette_Golduck), SPECIES_SHINY_PAL(MANKEY, gMonShinyPalette_Mankey), SPECIES_SHINY_PAL(PRIMEAPE, gMonShinyPalette_Primeape), SPECIES_SHINY_PAL(GROWLITHE, gMonShinyPalette_Growlithe), SPECIES_SHINY_PAL(ARCANINE, gMonShinyPalette_Arcanine), SPECIES_SHINY_PAL(POLIWAG, gMonShinyPalette_Poliwag), SPECIES_SHINY_PAL(POLIWHIRL, gMonShinyPalette_Poliwhirl), SPECIES_SHINY_PAL(POLIWRATH, gMonShinyPalette_Poliwrath), SPECIES_SHINY_PAL(ABRA, gMonShinyPalette_Abra), SPECIES_SHINY_PAL(KADABRA, gMonShinyPalette_Kadabra), SPECIES_SHINY_PAL(ALAKAZAM, gMonShinyPalette_Alakazam), SPECIES_SHINY_PAL(MACHOP, gMonShinyPalette_Machop), SPECIES_SHINY_PAL(MACHOKE, gMonShinyPalette_Machoke), SPECIES_SHINY_PAL(MACHAMP, gMonShinyPalette_Machamp), SPECIES_SHINY_PAL(BELLSPROUT, gMonShinyPalette_Bellsprout), SPECIES_SHINY_PAL(WEEPINBELL, gMonShinyPalette_Weepinbell), SPECIES_SHINY_PAL(VICTREEBEL, gMonShinyPalette_Victreebel), SPECIES_SHINY_PAL(TENTACOOL, gMonShinyPalette_Tentacool), SPECIES_SHINY_PAL(TENTACRUEL, gMonShinyPalette_Tentacruel), SPECIES_SHINY_PAL(GEODUDE, gMonShinyPalette_Geodude), SPECIES_SHINY_PAL(GRAVELER, gMonShinyPalette_Graveler), SPECIES_SHINY_PAL(GOLEM, gMonShinyPalette_Golem), SPECIES_SHINY_PAL(PONYTA, gMonShinyPalette_Ponyta), SPECIES_SHINY_PAL(RAPIDASH, gMonShinyPalette_Rapidash), SPECIES_SHINY_PAL(SLOWPOKE, gMonShinyPalette_Slowpoke), SPECIES_SHINY_PAL(SLOWBRO, gMonShinyPalette_Slowbro), SPECIES_SHINY_PAL(MAGNEMITE, gMonShinyPalette_Magnemite), SPECIES_SHINY_PAL(MAGNETON, gMonShinyPalette_Magneton), SPECIES_SHINY_PAL(FARFETCHD, gMonShinyPalette_Farfetchd), SPECIES_SHINY_PAL(DODUO, gMonShinyPalette_Doduo), SPECIES_SHINY_PAL(DODRIO, gMonShinyPalette_Dodrio), SPECIES_SHINY_PAL(SEEL, gMonShinyPalette_Seel), SPECIES_SHINY_PAL(DEWGONG, gMonShinyPalette_Dewgong), SPECIES_SHINY_PAL(GRIMER, gMonShinyPalette_Grimer), SPECIES_SHINY_PAL(MUK, gMonShinyPalette_Muk), SPECIES_SHINY_PAL(SHELLDER, gMonShinyPalette_Shellder), SPECIES_SHINY_PAL(CLOYSTER, gMonShinyPalette_Cloyster), SPECIES_SHINY_PAL(GASTLY, gMonShinyPalette_Gastly), SPECIES_SHINY_PAL(HAUNTER, gMonShinyPalette_Haunter), SPECIES_SHINY_PAL(GENGAR, gMonShinyPalette_Gengar), SPECIES_SHINY_PAL(ONIX, gMonShinyPalette_Onix), SPECIES_SHINY_PAL(DROWZEE, gMonShinyPalette_Drowzee), SPECIES_SHINY_PAL(HYPNO, gMonShinyPalette_Hypno), SPECIES_SHINY_PAL(KRABBY, gMonShinyPalette_Krabby), SPECIES_SHINY_PAL(KINGLER, gMonShinyPalette_Kingler), SPECIES_SHINY_PAL(VOLTORB, gMonShinyPalette_Voltorb), SPECIES_SHINY_PAL(ELECTRODE, gMonShinyPalette_Electrode), SPECIES_SHINY_PAL(EXEGGCUTE, gMonShinyPalette_Exeggcute), SPECIES_SHINY_PAL(EXEGGUTOR, gMonShinyPalette_Exeggutor), SPECIES_SHINY_PAL(CUBONE, gMonShinyPalette_Cubone), SPECIES_SHINY_PAL(MAROWAK, gMonShinyPalette_Marowak), SPECIES_SHINY_PAL(HITMONLEE, gMonShinyPalette_Hitmonlee), SPECIES_SHINY_PAL(HITMONCHAN, gMonShinyPalette_Hitmonchan), SPECIES_SHINY_PAL(LICKITUNG, gMonShinyPalette_Lickitung), SPECIES_SHINY_PAL(KOFFING, gMonShinyPalette_Koffing), SPECIES_SHINY_PAL(WEEZING, gMonShinyPalette_Weezing), SPECIES_SHINY_PAL(RHYHORN, gMonShinyPalette_Rhyhorn), SPECIES_SHINY_PAL(RHYDON, gMonShinyPalette_Rhydon), SPECIES_SHINY_PAL(CHANSEY, gMonShinyPalette_Chansey), SPECIES_SHINY_PAL(TANGELA, gMonShinyPalette_Tangela), SPECIES_SHINY_PAL(KANGASKHAN, gMonShinyPalette_Kangaskhan), SPECIES_SHINY_PAL(HORSEA, gMonShinyPalette_Horsea), SPECIES_SHINY_PAL(SEADRA, gMonShinyPalette_Seadra), SPECIES_SHINY_PAL(GOLDEEN, gMonShinyPalette_Goldeen), SPECIES_SHINY_PAL(SEAKING, gMonShinyPalette_Seaking), SPECIES_SHINY_PAL(STARYU, gMonShinyPalette_Staryu), SPECIES_SHINY_PAL(STARMIE, gMonShinyPalette_Starmie), SPECIES_SHINY_PAL(MR_MIME, gMonShinyPalette_Mrmime), SPECIES_SHINY_PAL(SCYTHER, gMonShinyPalette_Scyther), SPECIES_SHINY_PAL(JYNX, gMonShinyPalette_Jynx), SPECIES_SHINY_PAL(ELECTABUZZ, gMonShinyPalette_Electabuzz), SPECIES_SHINY_PAL(MAGMAR, gMonShinyPalette_Magmar), SPECIES_SHINY_PAL(PINSIR, gMonShinyPalette_Pinsir), SPECIES_SHINY_PAL(TAUROS, gMonShinyPalette_Tauros), SPECIES_SHINY_PAL(MAGIKARP, gMonShinyPalette_Magikarp), SPECIES_SHINY_PAL(GYARADOS, gMonShinyPalette_Gyarados), SPECIES_SHINY_PAL(LAPRAS, gMonShinyPalette_Lapras), SPECIES_SHINY_PAL(DITTO, gMonShinyPalette_Ditto), SPECIES_SHINY_PAL(EEVEE, gMonShinyPalette_Eevee), SPECIES_SHINY_PAL(VAPOREON, gMonShinyPalette_Vaporeon), SPECIES_SHINY_PAL(JOLTEON, gMonShinyPalette_Jolteon), SPECIES_SHINY_PAL(FLAREON, gMonShinyPalette_Flareon), SPECIES_SHINY_PAL(PORYGON, gMonShinyPalette_Porygon), SPECIES_SHINY_PAL(OMANYTE, gMonShinyPalette_Omanyte), SPECIES_SHINY_PAL(OMASTAR, gMonShinyPalette_Omastar), SPECIES_SHINY_PAL(KABUTO, gMonShinyPalette_Kabuto), SPECIES_SHINY_PAL(KABUTOPS, gMonShinyPalette_Kabutops), SPECIES_SHINY_PAL(AERODACTYL, gMonShinyPalette_Aerodactyl), SPECIES_SHINY_PAL(SNORLAX, gMonShinyPalette_Snorlax), SPECIES_SHINY_PAL(ARTICUNO, gMonShinyPalette_Articuno), SPECIES_SHINY_PAL(ZAPDOS, gMonShinyPalette_Zapdos), SPECIES_SHINY_PAL(MOLTRES, gMonShinyPalette_Moltres), SPECIES_SHINY_PAL(DRATINI, gMonShinyPalette_Dratini), SPECIES_SHINY_PAL(DRAGONAIR, gMonShinyPalette_Dragonair), SPECIES_SHINY_PAL(DRAGONITE, gMonShinyPalette_Dragonite), SPECIES_SHINY_PAL(MEWTWO, gMonShinyPalette_Mewtwo), SPECIES_SHINY_PAL(MEW, gMonShinyPalette_Mew), SPECIES_SHINY_PAL(CHIKORITA, gMonShinyPalette_Chikorita), SPECIES_SHINY_PAL(BAYLEEF, gMonShinyPalette_Bayleef), SPECIES_SHINY_PAL(MEGANIUM, gMonShinyPalette_Meganium), SPECIES_SHINY_PAL(CYNDAQUIL, gMonShinyPalette_Cyndaquil), SPECIES_SHINY_PAL(QUILAVA, gMonShinyPalette_Quilava), SPECIES_SHINY_PAL(TYPHLOSION, gMonShinyPalette_Typhlosion), SPECIES_SHINY_PAL(TOTODILE, gMonShinyPalette_Totodile), SPECIES_SHINY_PAL(CROCONAW, gMonShinyPalette_Croconaw), SPECIES_SHINY_PAL(FERALIGATR, gMonShinyPalette_Feraligatr), SPECIES_SHINY_PAL(SENTRET, gMonShinyPalette_Sentret), SPECIES_SHINY_PAL(FURRET, gMonShinyPalette_Furret), SPECIES_SHINY_PAL(HOOTHOOT, gMonShinyPalette_Hoothoot), SPECIES_SHINY_PAL(NOCTOWL, gMonShinyPalette_Noctowl), SPECIES_SHINY_PAL(LEDYBA, gMonShinyPalette_Ledyba), SPECIES_SHINY_PAL(LEDIAN, gMonShinyPalette_Ledian), SPECIES_SHINY_PAL(SPINARAK, gMonShinyPalette_Spinarak), SPECIES_SHINY_PAL(ARIADOS, gMonShinyPalette_Ariados), SPECIES_SHINY_PAL(CROBAT, gMonShinyPalette_Crobat), SPECIES_SHINY_PAL(CHINCHOU, gMonShinyPalette_Chinchou), SPECIES_SHINY_PAL(LANTURN, gMonShinyPalette_Lanturn), SPECIES_SHINY_PAL(PICHU, gMonShinyPalette_Pichu), SPECIES_SHINY_PAL(CLEFFA, gMonShinyPalette_Cleffa), SPECIES_SHINY_PAL(IGGLYBUFF, gMonShinyPalette_Igglybuff), SPECIES_SHINY_PAL(TOGEPI, gMonShinyPalette_Togepi), SPECIES_SHINY_PAL(TOGETIC, gMonShinyPalette_Togetic), SPECIES_SHINY_PAL(NATU, gMonShinyPalette_Natu), SPECIES_SHINY_PAL(XATU, gMonShinyPalette_Xatu), SPECIES_SHINY_PAL(MAREEP, gMonShinyPalette_Mareep), SPECIES_SHINY_PAL(FLAAFFY, gMonShinyPalette_Flaaffy), SPECIES_SHINY_PAL(AMPHAROS, gMonShinyPalette_Ampharos), SPECIES_SHINY_PAL(BELLOSSOM, gMonShinyPalette_Bellossom), SPECIES_SHINY_PAL(MARILL, gMonShinyPalette_Marill), SPECIES_SHINY_PAL(AZUMARILL, gMonShinyPalette_Azumarill), SPECIES_SHINY_PAL(SUDOWOODO, gMonShinyPalette_Sudowoodo), SPECIES_SHINY_PAL(POLITOED, gMonShinyPalette_Politoed), SPECIES_SHINY_PAL(HOPPIP, gMonShinyPalette_Hoppip), SPECIES_SHINY_PAL(SKIPLOOM, gMonShinyPalette_Skiploom), SPECIES_SHINY_PAL(JUMPLUFF, gMonShinyPalette_Jumpluff), SPECIES_SHINY_PAL(AIPOM, gMonShinyPalette_Aipom), SPECIES_SHINY_PAL(SUNKERN, gMonShinyPalette_Sunkern), SPECIES_SHINY_PAL(SUNFLORA, gMonShinyPalette_Sunflora), SPECIES_SHINY_PAL(YANMA, gMonShinyPalette_Yanma), SPECIES_SHINY_PAL(WOOPER, gMonShinyPalette_Wooper), SPECIES_SHINY_PAL(QUAGSIRE, gMonShinyPalette_Quagsire), SPECIES_SHINY_PAL(ESPEON, gMonShinyPalette_Espeon), SPECIES_SHINY_PAL(UMBREON, gMonShinyPalette_Umbreon), SPECIES_SHINY_PAL(MURKROW, gMonShinyPalette_Murkrow), SPECIES_SHINY_PAL(SLOWKING, gMonShinyPalette_Slowking), SPECIES_SHINY_PAL(MISDREAVUS, gMonShinyPalette_Misdreavus), SPECIES_SHINY_PAL(UNOWN, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(WOBBUFFET, gMonShinyPalette_Wobbuffet), SPECIES_SHINY_PAL(GIRAFARIG, gMonShinyPalette_Girafarig), SPECIES_SHINY_PAL(PINECO, gMonShinyPalette_Pineco), SPECIES_SHINY_PAL(FORRETRESS, gMonShinyPalette_Forretress), SPECIES_SHINY_PAL(DUNSPARCE, gMonShinyPalette_Dunsparce), SPECIES_SHINY_PAL(GLIGAR, gMonShinyPalette_Gligar), SPECIES_SHINY_PAL(STEELIX, gMonShinyPalette_Steelix), SPECIES_SHINY_PAL(SNUBBULL, gMonShinyPalette_Snubbull), SPECIES_SHINY_PAL(GRANBULL, gMonShinyPalette_Granbull), SPECIES_SHINY_PAL(QWILFISH, gMonShinyPalette_Qwilfish), SPECIES_SHINY_PAL(SCIZOR, gMonShinyPalette_Scizor), SPECIES_SHINY_PAL(SHUCKLE, gMonShinyPalette_Shuckle), SPECIES_SHINY_PAL(HERACROSS, gMonShinyPalette_Heracross), SPECIES_SHINY_PAL(SNEASEL, gMonShinyPalette_Sneasel), SPECIES_SHINY_PAL(TEDDIURSA, gMonShinyPalette_Teddiursa), SPECIES_SHINY_PAL(URSARING, gMonShinyPalette_Ursaring), SPECIES_SHINY_PAL(SLUGMA, gMonShinyPalette_Slugma), SPECIES_SHINY_PAL(MAGCARGO, gMonShinyPalette_Magcargo), SPECIES_SHINY_PAL(SWINUB, gMonShinyPalette_Swinub), SPECIES_SHINY_PAL(PILOSWINE, gMonShinyPalette_Piloswine), SPECIES_SHINY_PAL(CORSOLA, gMonShinyPalette_Corsola), SPECIES_SHINY_PAL(REMORAID, gMonShinyPalette_Remoraid), SPECIES_SHINY_PAL(OCTILLERY, gMonShinyPalette_Octillery), SPECIES_SHINY_PAL(DELIBIRD, gMonShinyPalette_Delibird), SPECIES_SHINY_PAL(MANTINE, gMonShinyPalette_Mantine), SPECIES_SHINY_PAL(SKARMORY, gMonShinyPalette_Skarmory), SPECIES_SHINY_PAL(HOUNDOUR, gMonShinyPalette_Houndour), SPECIES_SHINY_PAL(HOUNDOOM, gMonShinyPalette_Houndoom), SPECIES_SHINY_PAL(KINGDRA, gMonShinyPalette_Kingdra), SPECIES_SHINY_PAL(PHANPY, gMonShinyPalette_Phanpy), SPECIES_SHINY_PAL(DONPHAN, gMonShinyPalette_Donphan), SPECIES_SHINY_PAL(PORYGON2, gMonShinyPalette_Porygon2), SPECIES_SHINY_PAL(STANTLER, gMonShinyPalette_Stantler), SPECIES_SHINY_PAL(SMEARGLE, gMonShinyPalette_Smeargle), SPECIES_SHINY_PAL(TYROGUE, gMonShinyPalette_Tyrogue), SPECIES_SHINY_PAL(HITMONTOP, gMonShinyPalette_Hitmontop), SPECIES_SHINY_PAL(SMOOCHUM, gMonShinyPalette_Smoochum), SPECIES_SHINY_PAL(ELEKID, gMonShinyPalette_Elekid), SPECIES_SHINY_PAL(MAGBY, gMonShinyPalette_Magby), SPECIES_SHINY_PAL(MILTANK, gMonShinyPalette_Miltank), SPECIES_SHINY_PAL(BLISSEY, gMonShinyPalette_Blissey), SPECIES_SHINY_PAL(RAIKOU, gMonShinyPalette_Raikou), SPECIES_SHINY_PAL(ENTEI, gMonShinyPalette_Entei), SPECIES_SHINY_PAL(SUICUNE, gMonShinyPalette_Suicune), SPECIES_SHINY_PAL(LARVITAR, gMonShinyPalette_Larvitar), SPECIES_SHINY_PAL(PUPITAR, gMonShinyPalette_Pupitar), SPECIES_SHINY_PAL(TYRANITAR, gMonShinyPalette_Tyranitar), SPECIES_SHINY_PAL(LUGIA, gMonShinyPalette_Lugia), SPECIES_SHINY_PAL(HO_OH, gMonShinyPalette_HoOh), SPECIES_SHINY_PAL(CELEBI, gMonShinyPalette_Celebi), SPECIES_SHINY_PAL(OLD_UNOWN_B, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_C, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_D, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_E, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_F, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_G, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_H, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_I, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_J, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_K, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_L, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_M, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_N, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_O, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_P, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_Q, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_R, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_S, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_T, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_U, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_V, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_W, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_X, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_Y, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(OLD_UNOWN_Z, gMonShinyPalette_DoubleQuestionMark), SPECIES_SHINY_PAL(TREECKO, gMonShinyPalette_Treecko), SPECIES_SHINY_PAL(GROVYLE, gMonShinyPalette_Grovyle), SPECIES_SHINY_PAL(SCEPTILE, gMonShinyPalette_Sceptile), SPECIES_SHINY_PAL(TORCHIC, gMonShinyPalette_Torchic), SPECIES_SHINY_PAL(COMBUSKEN, gMonShinyPalette_Combusken), SPECIES_SHINY_PAL(BLAZIKEN, gMonShinyPalette_Blaziken), SPECIES_SHINY_PAL(MUDKIP, gMonShinyPalette_Mudkip), SPECIES_SHINY_PAL(MARSHTOMP, gMonShinyPalette_Marshtomp), SPECIES_SHINY_PAL(SWAMPERT, gMonShinyPalette_Swampert), SPECIES_SHINY_PAL(POOCHYENA, gMonShinyPalette_Poochyena), SPECIES_SHINY_PAL(MIGHTYENA, gMonShinyPalette_Mightyena), SPECIES_SHINY_PAL(ZIGZAGOON, gMonShinyPalette_Zigzagoon), SPECIES_SHINY_PAL(LINOONE, gMonShinyPalette_Linoone), SPECIES_SHINY_PAL(WURMPLE, gMonShinyPalette_Wurmple), SPECIES_SHINY_PAL(SILCOON, gMonShinyPalette_Silcoon), SPECIES_SHINY_PAL(BEAUTIFLY, gMonShinyPalette_Beautifly), SPECIES_SHINY_PAL(CASCOON, gMonShinyPalette_Cascoon), SPECIES_SHINY_PAL(DUSTOX, gMonShinyPalette_Dustox), SPECIES_SHINY_PAL(LOTAD, gMonShinyPalette_Lotad), SPECIES_SHINY_PAL(LOMBRE, gMonShinyPalette_Lombre), SPECIES_SHINY_PAL(LUDICOLO, gMonShinyPalette_Ludicolo), SPECIES_SHINY_PAL(SEEDOT, gMonShinyPalette_Seedot), SPECIES_SHINY_PAL(NUZLEAF, gMonShinyPalette_Nuzleaf), SPECIES_SHINY_PAL(SHIFTRY, gMonShinyPalette_Shiftry), SPECIES_SHINY_PAL(NINCADA, gMonShinyPalette_Nincada), SPECIES_SHINY_PAL(NINJASK, gMonShinyPalette_Ninjask), SPECIES_SHINY_PAL(SHEDINJA, gMonShinyPalette_Shedinja), SPECIES_SHINY_PAL(TAILLOW, gMonShinyPalette_Taillow), SPECIES_SHINY_PAL(SWELLOW, gMonShinyPalette_Swellow), SPECIES_SHINY_PAL(SHROOMISH, gMonShinyPalette_Shroomish), SPECIES_SHINY_PAL(BRELOOM, gMonShinyPalette_Breloom), SPECIES_SHINY_PAL(SPINDA, gMonShinyPalette_Spinda), SPECIES_SHINY_PAL(WINGULL, gMonShinyPalette_Wingull), SPECIES_SHINY_PAL(PELIPPER, gMonShinyPalette_Pelipper), SPECIES_SHINY_PAL(SURSKIT, gMonShinyPalette_Surskit), SPECIES_SHINY_PAL(MASQUERAIN, gMonShinyPalette_Masquerain), SPECIES_SHINY_PAL(WAILMER, gMonShinyPalette_Wailmer), SPECIES_SHINY_PAL(WAILORD, gMonShinyPalette_Wailord), SPECIES_SHINY_PAL(SKITTY, gMonShinyPalette_Skitty), SPECIES_SHINY_PAL(DELCATTY, gMonShinyPalette_Delcatty), SPECIES_SHINY_PAL(KECLEON, gMonShinyPalette_Kecleon), SPECIES_SHINY_PAL(BALTOY, gMonShinyPalette_Baltoy), SPECIES_SHINY_PAL(CLAYDOL, gMonShinyPalette_Claydol), SPECIES_SHINY_PAL(NOSEPASS, gMonShinyPalette_Nosepass), SPECIES_SHINY_PAL(TORKOAL, gMonShinyPalette_Torkoal), SPECIES_SHINY_PAL(SABLEYE, gMonShinyPalette_Sableye), SPECIES_SHINY_PAL(BARBOACH, gMonShinyPalette_Barboach), SPECIES_SHINY_PAL(WHISCASH, gMonShinyPalette_Whiscash), SPECIES_SHINY_PAL(LUVDISC, gMonShinyPalette_Luvdisc), SPECIES_SHINY_PAL(CORPHISH, gMonShinyPalette_Corphish), SPECIES_SHINY_PAL(CRAWDAUNT, gMonShinyPalette_Crawdaunt), SPECIES_SHINY_PAL(FEEBAS, gMonShinyPalette_Feebas), SPECIES_SHINY_PAL(MILOTIC, gMonShinyPalette_Milotic), SPECIES_SHINY_PAL(CARVANHA, gMonShinyPalette_Carvanha), SPECIES_SHINY_PAL(SHARPEDO, gMonShinyPalette_Sharpedo), SPECIES_SHINY_PAL(TRAPINCH, gMonShinyPalette_Trapinch), SPECIES_SHINY_PAL(VIBRAVA, gMonShinyPalette_Vibrava), SPECIES_SHINY_PAL(FLYGON, gMonShinyPalette_Flygon), SPECIES_SHINY_PAL(MAKUHITA, gMonShinyPalette_Makuhita), SPECIES_SHINY_PAL(HARIYAMA, gMonShinyPalette_Hariyama), SPECIES_SHINY_PAL(ELECTRIKE, gMonShinyPalette_Electrike), SPECIES_SHINY_PAL(MANECTRIC, gMonShinyPalette_Manectric), SPECIES_SHINY_PAL(NUMEL, gMonShinyPalette_Numel), SPECIES_SHINY_PAL(CAMERUPT, gMonShinyPalette_Camerupt), SPECIES_SHINY_PAL(SPHEAL, gMonShinyPalette_Spheal), SPECIES_SHINY_PAL(SEALEO, gMonShinyPalette_Sealeo), SPECIES_SHINY_PAL(WALREIN, gMonShinyPalette_Walrein), SPECIES_SHINY_PAL(CACNEA, gMonShinyPalette_Cacnea), SPECIES_SHINY_PAL(CACTURNE, gMonShinyPalette_Cacturne), SPECIES_SHINY_PAL(SNORUNT, gMonShinyPalette_Snorunt), SPECIES_SHINY_PAL(GLALIE, gMonShinyPalette_Glalie), SPECIES_SHINY_PAL(LUNATONE, gMonShinyPalette_Lunatone), SPECIES_SHINY_PAL(SOLROCK, gMonShinyPalette_Solrock), SPECIES_SHINY_PAL(AZURILL, gMonShinyPalette_Azurill), SPECIES_SHINY_PAL(SPOINK, gMonShinyPalette_Spoink), SPECIES_SHINY_PAL(GRUMPIG, gMonShinyPalette_Grumpig), SPECIES_SHINY_PAL(PLUSLE, gMonShinyPalette_Plusle), SPECIES_SHINY_PAL(MINUN, gMonShinyPalette_Minun), SPECIES_SHINY_PAL(MAWILE, gMonShinyPalette_Mawile), SPECIES_SHINY_PAL(MEDITITE, gMonShinyPalette_Meditite), SPECIES_SHINY_PAL(MEDICHAM, gMonShinyPalette_Medicham), SPECIES_SHINY_PAL(SWABLU, gMonShinyPalette_Swablu), SPECIES_SHINY_PAL(ALTARIA, gMonShinyPalette_Altaria), SPECIES_SHINY_PAL(WYNAUT, gMonShinyPalette_Wynaut), SPECIES_SHINY_PAL(DUSKULL, gMonShinyPalette_Duskull), SPECIES_SHINY_PAL(DUSCLOPS, gMonShinyPalette_Dusclops), SPECIES_SHINY_PAL(ROSELIA, gMonShinyPalette_Roselia), SPECIES_SHINY_PAL(SLAKOTH, gMonShinyPalette_Slakoth), SPECIES_SHINY_PAL(VIGOROTH, gMonShinyPalette_Vigoroth), SPECIES_SHINY_PAL(SLAKING, gMonShinyPalette_Slaking), SPECIES_SHINY_PAL(GULPIN, gMonShinyPalette_Gulpin), SPECIES_SHINY_PAL(SWALOT, gMonShinyPalette_Swalot), SPECIES_SHINY_PAL(TROPIUS, gMonShinyPalette_Tropius), SPECIES_SHINY_PAL(WHISMUR, gMonShinyPalette_Whismur), SPECIES_SHINY_PAL(LOUDRED, gMonShinyPalette_Loudred), SPECIES_SHINY_PAL(EXPLOUD, gMonShinyPalette_Exploud), SPECIES_SHINY_PAL(CLAMPERL, gMonShinyPalette_Clamperl), SPECIES_SHINY_PAL(HUNTAIL, gMonShinyPalette_Huntail), SPECIES_SHINY_PAL(GOREBYSS, gMonShinyPalette_Gorebyss), SPECIES_SHINY_PAL(ABSOL, gMonShinyPalette_Absol), SPECIES_SHINY_PAL(SHUPPET, gMonShinyPalette_Shuppet), SPECIES_SHINY_PAL(BANETTE, gMonShinyPalette_Banette), SPECIES_SHINY_PAL(SEVIPER, gMonShinyPalette_Seviper), SPECIES_SHINY_PAL(ZANGOOSE, gMonShinyPalette_Zangoose), SPECIES_SHINY_PAL(RELICANTH, gMonShinyPalette_Relicanth), SPECIES_SHINY_PAL(ARON, gMonShinyPalette_Aron), SPECIES_SHINY_PAL(LAIRON, gMonShinyPalette_Lairon), SPECIES_SHINY_PAL(AGGRON, gMonShinyPalette_Aggron), SPECIES_SHINY_PAL(CASTFORM, gMonShinyPalette_Castform), SPECIES_SHINY_PAL(VOLBEAT, gMonShinyPalette_Volbeat), SPECIES_SHINY_PAL(ILLUMISE, gMonShinyPalette_Illumise), SPECIES_SHINY_PAL(LILEEP, gMonShinyPalette_Lileep), SPECIES_SHINY_PAL(CRADILY, gMonShinyPalette_Cradily), SPECIES_SHINY_PAL(ANORITH, gMonShinyPalette_Anorith), SPECIES_SHINY_PAL(ARMALDO, gMonShinyPalette_Armaldo), SPECIES_SHINY_PAL(RALTS, gMonShinyPalette_Ralts), SPECIES_SHINY_PAL(KIRLIA, gMonShinyPalette_Kirlia), SPECIES_SHINY_PAL(GARDEVOIR, gMonShinyPalette_Gardevoir), SPECIES_SHINY_PAL(BAGON, gMonShinyPalette_Bagon), SPECIES_SHINY_PAL(SHELGON, gMonShinyPalette_Shelgon), SPECIES_SHINY_PAL(SALAMENCE, gMonShinyPalette_Salamence), SPECIES_SHINY_PAL(BELDUM, gMonShinyPalette_Beldum), SPECIES_SHINY_PAL(METANG, gMonShinyPalette_Metang), SPECIES_SHINY_PAL(METAGROSS, gMonShinyPalette_Metagross), SPECIES_SHINY_PAL(REGIROCK, gMonShinyPalette_Regirock), SPECIES_SHINY_PAL(REGICE, gMonShinyPalette_Regice), SPECIES_SHINY_PAL(REGISTEEL, gMonShinyPalette_Registeel), SPECIES_SHINY_PAL(KYOGRE, gMonShinyPalette_Kyogre), SPECIES_SHINY_PAL(GROUDON, gMonShinyPalette_Groudon), SPECIES_SHINY_PAL(RAYQUAZA, gMonShinyPalette_Rayquaza), SPECIES_SHINY_PAL(LATIAS, gMonShinyPalette_Latias), SPECIES_SHINY_PAL(LATIOS, gMonShinyPalette_Latios), SPECIES_SHINY_PAL(JIRACHI, gMonShinyPalette_Jirachi), SPECIES_SHINY_PAL(DEOXYS, gMonShinyPalette_Deoxys), SPECIES_SHINY_PAL(CHIMECHO, gMonShinyPalette_Chimecho), SPECIES_SHINY_PAL(EGG, gMonPalette_Egg), SPECIES_SHINY_PAL(UNOWN_B, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_C, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_D, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_E, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_F, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_G, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_H, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_I, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_J, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_K, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_L, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_M, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_N, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_O, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_P, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_Q, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_R, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_S, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_T, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_U, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_V, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_W, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_X, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_Y, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_Z, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_EMARK, gMonShinyPalette_Unown), SPECIES_SHINY_PAL(UNOWN_QMARK, gMonShinyPalette_Unown), }; ================================================ FILE: src/data/region_map/region_map_layout_kanto.h ================================================ static const u8 sRegionMapSections_Kanto[LAYER_COUNT][MAP_HEIGHT][MAP_WIDTH] = { [LAYER_MAP] = { {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_24, MAPSEC_ROUTE_25, MAPSEC_ROUTE_25, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_24, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_INDIGO_PLATEAU, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_4_POKECENTER, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_CERULEAN_CITY, MAPSEC_ROUTE_9, MAPSEC_ROUTE_9, MAPSEC_ROUTE_9, MAPSEC_ROUTE_10_POKECENTER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_PEWTER_CITY, MAPSEC_ROUTE_3, MAPSEC_ROUTE_3, MAPSEC_ROUTE_3, MAPSEC_ROUTE_3, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_5, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_10, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_ROUTE_2, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_5, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_10, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_ROUTE_2, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_16, MAPSEC_ROUTE_16, MAPSEC_ROUTE_16, MAPSEC_ROUTE_16, MAPSEC_CELADON_CITY, MAPSEC_ROUTE_7, MAPSEC_ROUTE_7, MAPSEC_SAFFRON_CITY, MAPSEC_ROUTE_8, MAPSEC_ROUTE_8, MAPSEC_ROUTE_8, MAPSEC_LAVENDER_TOWN, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_ROUTE_2, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_6, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_22, MAPSEC_ROUTE_22, MAPSEC_VIRIDIAN_CITY, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_6, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_1, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_VERMILION_CITY, MAPSEC_ROUTE_11, MAPSEC_ROUTE_11, MAPSEC_ROUTE_11, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_1, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_PALLET_TOWN, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_14, MAPSEC_ROUTE_13, MAPSEC_ROUTE_13, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_21, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_FUCHSIA_CITY, MAPSEC_ROUTE_15, MAPSEC_ROUTE_15, MAPSEC_ROUTE_14, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_21, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_19, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CINNABAR_ISLAND, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_19, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, }, [LAYER_DUNGEON] = { {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_MOON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CERULEAN_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROCK_TUNNEL, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KANTO_VICTORY_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_POWER_PLANT, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_DIGLETTS_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_VIRIDIAN_FOREST, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_POKEMON_TOWER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_DIGLETTS_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KANTO_SAFARI_ZONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_POKEMON_MANSION, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEAFOAM_ISLANDS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, } }; ================================================ FILE: src/data/region_map/region_map_layout_sevii_123.h ================================================ static const u8 sRegionMapSections_Sevii123[LAYER_COUNT][MAP_HEIGHT][MAP_WIDTH] = { [LAYER_MAP] = { {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CAPE_BRINK, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_ONE_ISLAND, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CAPE_BRINK, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_TREASURE_BEACH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TWO_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_TREASURE_BEACH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_BOND_BRIDGE, MAPSEC_BOND_BRIDGE, MAPSEC_BOND_BRIDGE, MAPSEC_BOND_BRIDGE, MAPSEC_THREE_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_THREE_ISLE_PORT, MAPSEC_THREE_ISLE_PORT, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} }, [LAYER_DUNGEON] = { {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_EMBER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_BERRY_FOREST, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} } }; ================================================ FILE: src/data/region_map/region_map_layout_sevii_45.h ================================================ static const u8 sRegionMapSections_Sevii45[LAYER_COUNT][MAP_HEIGHT][MAP_WIDTH] = { [LAYER_MAP] = { {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_FOUR_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NAVEL_ROCK, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_RESORT_GORGEOUS, MAPSEC_RESORT_GORGEOUS, MAPSEC_RESORT_GORGEOUS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_WATER_LABYRINTH, MAPSEC_WATER_LABYRINTH, MAPSEC_WATER_LABYRINTH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_FIVE_ISLAND, MAPSEC_FIVE_ISLE_MEADOW, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_FIVE_ISLE_MEADOW, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} }, [LAYER_DUNGEON] = { {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ICEFALL_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_LOST_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} } }; ================================================ FILE: src/data/region_map/region_map_layout_sevii_67.h ================================================ static const u8 sRegionMapSections_Sevii67[LAYER_COUNT][MAP_HEIGHT][MAP_WIDTH] = { [LAYER_MAP] = { {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_OUTCAST_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_OUTCAST_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_OUTCAST_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_GREEN_PATH, MAPSEC_GREEN_PATH, MAPSEC_GREEN_PATH, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SIX_ISLAND, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TRAINER_TOWER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TRAINER_TOWER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_RUIN_VALLEY, MAPSEC_RUIN_VALLEY, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEVEN_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_RUIN_VALLEY, MAPSEC_RUIN_VALLEY, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CANYON_ENTRANCE, MAPSEC_SEVAULT_CANYON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEVAULT_CANYON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEVAULT_CANYON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_BIRTH_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} }, [LAYER_DUNGEON] = { {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ALTERING_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_PATTERN_BUSH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_DOTTED_HOLE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TANOBY_CHAMBERS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} } }; ================================================ FILE: src/data/region_map/region_map_sections.entries.json.txt ================================================ {{ doNotModifyHeader }} #ifndef GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H #define GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H ## for map_section in map_sections {% if isEmptyString(getVar(map_section.name)) and not existsIn(map_section, "name_clone") %}{{ setVar(map_section.name, map_section.map_section) }}{% endif %} ## endfor static const u8 *const sMapNames[] = { ## for map_section in map_sections [{{ map_section.map_section }}] = sMapsecName_{{ cleanString(map_section.name) }}{% if existsIn(map_section, "name_clone") %}_Clone{% endif %}, ## endfor }; static const u16 sMapSectionTopLeftCorners[MAPSEC_COUNT][2] = { ## for map_section in map_sections [{{ map_section.map_section }}] = { {{ map_section.x }}, {{ map_section.y }} }, ## endfor }; static const u16 sMapSectionDimensions[MAPSEC_COUNT][2] = { ## for map_section in map_sections [{{ map_section.map_section }}] = { {{ map_section.width }}, {{ map_section.height }} }, ## endfor }; #endif // GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H ================================================ FILE: src/data/region_map/region_map_sections.json ================================================ { "map_sections": [ { "map_section": "MAPSEC_LITTLEROOT_TOWN", "name": "LITTLEROOT TOWN", "x": 4, "y": 11, "width": 1, "height": 1 }, { "map_section": "MAPSEC_OLDALE_TOWN", "name": "OLDALE TOWN", "x": 4, "y": 9, "width": 1, "height": 1 }, { "map_section": "MAPSEC_DEWFORD_TOWN", "name": "DEWFORD TOWN", "x": 2, "y": 14, "width": 1, "height": 1 }, { "map_section": "MAPSEC_LAVARIDGE_TOWN", "name": "LAVARIDGE TOWN", "x": 5, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_FALLARBOR_TOWN", "name": "FALLARBOR TOWN", "x": 3, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_VERDANTURF_TOWN", "name": "VERDANTURF TOWN", "x": 4, "y": 6, "width": 1, "height": 1 }, { "map_section": "MAPSEC_PACIFIDLOG_TOWN", "name": "PACIFIDLOG TOWN", "x": 17, "y": 10, "width": 1, "height": 1 }, { "map_section": "MAPSEC_PETALBURG_CITY", "name": "PETALBURG CITY", "x": 1, "y": 9, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SLATEPORT_CITY", "name": "SLATEPORT CITY", "x": 8, "y": 10, "width": 1, "height": 2 }, { "map_section": "MAPSEC_MAUVILLE_CITY", "name": "MAUVILLE CITY", "x": 8, "y": 6, "width": 2, "height": 1 }, { "map_section": "MAPSEC_RUSTBORO_CITY", "name": "RUSTBORO CITY", "x": 0, "y": 5, "width": 1, "height": 2 }, { "map_section": "MAPSEC_FORTREE_CITY", "name": "FORTREE CITY", "x": 12, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_LILYCOVE_CITY", "name": "LILYCOVE CITY", "x": 18, "y": 3, "width": 2, "height": 1 }, { "map_section": "MAPSEC_MOSSDEEP_CITY", "name": "MOSSDEEP CITY", "x": 24, "y": 5, "width": 2, "height": 1 }, { "map_section": "MAPSEC_SOOTOPOLIS_CITY", "name": "SOOTOPOLIS CITY", "x": 21, "y": 7, "width": 1, "height": 1 }, { "map_section": "MAPSEC_EVER_GRANDE_CITY", "name": "EVER GRANDE CITY", "x": 27, "y": 8, "width": 1, "height": 2 }, { "map_section": "MAPSEC_ROUTE_101", "name": "ROUTE 101", "x": 4, "y": 10, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ROUTE_102", "name": "ROUTE 102", "x": 2, "y": 9, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_103", "name": "ROUTE 103", "x": 4, "y": 8, "width": 4, "height": 1 }, { "map_section": "MAPSEC_ROUTE_104", "name": "ROUTE 104", "x": 0, "y": 7, "width": 1, "height": 3 }, { "map_section": "MAPSEC_ROUTE_105", "name": "ROUTE 105", "x": 0, "y": 10, "width": 1, "height": 3 }, { "map_section": "MAPSEC_ROUTE_106", "name": "ROUTE 106", "x": 0, "y": 13, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_107", "name": "ROUTE 107", "x": 3, "y": 14, "width": 3, "height": 1 }, { "map_section": "MAPSEC_ROUTE_108", "name": "ROUTE 108", "x": 6, "y": 14, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_109", "name": "ROUTE 109", "x": 8, "y": 12, "width": 1, "height": 3 }, { "map_section": "MAPSEC_ROUTE_110", "name": "ROUTE 110", "x": 8, "y": 7, "width": 1, "height": 3 }, { "map_section": "MAPSEC_ROUTE_111", "name": "ROUTE 111", "x": 8, "y": 0, "width": 1, "height": 6 }, { "map_section": "MAPSEC_ROUTE_112", "name": "ROUTE 112", "x": 6, "y": 3, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_113", "name": "ROUTE 113", "x": 4, "y": 0, "width": 4, "height": 1 }, { "map_section": "MAPSEC_ROUTE_114", "name": "ROUTE 114", "x": 1, "y": 0, "width": 2, "height": 3 }, { "map_section": "MAPSEC_ROUTE_115", "name": "ROUTE 115", "x": 0, "y": 2, "width": 1, "height": 3 }, { "map_section": "MAPSEC_ROUTE_116", "name": "ROUTE 116", "x": 1, "y": 5, "width": 4, "height": 1 }, { "map_section": "MAPSEC_ROUTE_117", "name": "ROUTE 117", "x": 5, "y": 6, "width": 3, "height": 1 }, { "map_section": "MAPSEC_ROUTE_118", "name": "ROUTE 118", "x": 10, "y": 6, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_119", "name": "ROUTE 119", "x": 11, "y": 0, "width": 1, "height": 6 }, { "map_section": "MAPSEC_ROUTE_120", "name": "ROUTE 120", "x": 13, "y": 0, "width": 1, "height": 4 }, { "map_section": "MAPSEC_ROUTE_121", "name": "ROUTE 121", "x": 14, "y": 3, "width": 4, "height": 1 }, { "map_section": "MAPSEC_ROUTE_122", "name": "ROUTE 122", "x": 16, "y": 4, "width": 1, "height": 2 }, { "map_section": "MAPSEC_ROUTE_123", "name": "ROUTE 123", "x": 12, "y": 6, "width": 5, "height": 1 }, { "map_section": "MAPSEC_ROUTE_124", "name": "ROUTE 124", "x": 20, "y": 3, "width": 4, "height": 3 }, { "map_section": "MAPSEC_ROUTE_125", "name": "ROUTE 125", "x": 24, "y": 3, "width": 2, "height": 2 }, { "map_section": "MAPSEC_ROUTE_126", "name": "ROUTE 126", "x": 20, "y": 6, "width": 3, "height": 3 }, { "map_section": "MAPSEC_ROUTE_127", "name": "ROUTE 127", "x": 23, "y": 6, "width": 3, "height": 3 }, { "map_section": "MAPSEC_ROUTE_128", "name": "ROUTE 128", "x": 23, "y": 9, "width": 4, "height": 1 }, { "map_section": "MAPSEC_ROUTE_129", "name": "ROUTE 129", "x": 24, "y": 10, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_130", "name": "ROUTE 130", "x": 21, "y": 10, "width": 3, "height": 1 }, { "map_section": "MAPSEC_ROUTE_131", "name": "ROUTE 131", "x": 18, "y": 10, "width": 3, "height": 1 }, { "map_section": "MAPSEC_ROUTE_132", "name": "ROUTE 132", "x": 15, "y": 10, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_133", "name": "ROUTE 133", "x": 12, "y": 10, "width": 3, "height": 1 }, { "map_section": "MAPSEC_ROUTE_134", "name": "ROUTE 134", "x": 9, "y": 10, "width": 3, "height": 1 }, { "map_section": "MAPSEC_UNDERWATER_124", "name": "UNDERWATER", "x": 13, "y": 12, "width": 4, "height": 1 }, { "map_section": "MAPSEC_UNDERWATER_126", "name": "UNDERWATER", "x": 20, "y": 6, "width": 3, "height": 3 }, { "map_section": "MAPSEC_UNDERWATER_127", "name": "UNDERWATER", "x": 23, "y": 6, "width": 3, "height": 3 }, { "map_section": "MAPSEC_UNDERWATER_128", "name": "UNDERWATER", "x": 23, "y": 9, "width": 4, "height": 1 }, { "map_section": "MAPSEC_UNDERWATER_SOOTOPOLIS", "name": "UNDERWATER", "x": 21, "y": 7, "width": 1, "height": 1 }, { "map_section": "MAPSEC_GRANITE_CAVE", "name": "GRANITE CAVE", "x": 1, "y": 13, "width": 1, "height": 1 }, { "map_section": "MAPSEC_MT_CHIMNEY", "name": "MT. CHIMNEY", "x": 6, "y": 2, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SAFARI_ZONE", "name": "SAFARI ZONE", "x": 16, "y": 2, "width": 1, "height": 1 }, { "map_section": "MAPSEC_BATTLE_FRONTIER", "name": "BATTLE FRONTIER", "x": 22, "y": 12, "width": 1, "height": 1 }, { "map_section": "MAPSEC_PETALBURG_WOODS", "name": "PETALBURG WOODS", "x": 0, "y": 8, "width": 1, "height": 1 }, { "map_section": "MAPSEC_RUSTURF_TUNNEL", "name": "RUSTURF TUNNEL", "x": 2, "y": 5, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ABANDONED_SHIP", "name": "ABANDONED SHIP", "x": 6, "y": 14, "width": 1, "height": 1 }, { "map_section": "MAPSEC_NEW_MAUVILLE", "name": "NEW MAUVILLE", "x": 8, "y": 7, "width": 1, "height": 1 }, { "map_section": "MAPSEC_METEOR_FALLS", "name": "METEOR FALLS", "x": 0, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_METEOR_FALLS2", "name": "METEOR FALLS", "x": 1, "y": 2, "width": 1, "height": 1 }, { "map_section": "MAPSEC_MT_PYRE", "name": "MT. PYRE", "x": 16, "y": 4, "width": 1, "height": 1 }, { "map_section": "MAPSEC_AQUA_HIDEOUT_OLD", "name": "HIDEOUT", "name_clone": true, "x": 19, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SHOAL_CAVE", "name": "SHOAL CAVE", "x": 24, "y": 4, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SEAFLOOR_CAVERN", "name": "SEAFLOOR CAVERN", "x": 24, "y": 9, "width": 1, "height": 1 }, { "map_section": "MAPSEC_UNDERWATER_SEAFLOOR_CAVERN", "name": "UNDERWATER", "x": 24, "y": 9, "width": 1, "height": 1 }, { "map_section": "MAPSEC_VICTORY_ROAD", "name": "VICTORY ROAD", "x": 27, "y": 9, "width": 1, "height": 1 }, { "map_section": "MAPSEC_MIRAGE_ISLAND", "name": "MIRAGE ISLAND", "x": 17, "y": 10, "width": 1, "height": 1 }, { "map_section": "MAPSEC_CAVE_OF_ORIGIN", "name": "CAVE OF ORIGIN", "x": 21, "y": 7, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SOUTHERN_ISLAND", "name": "SOUTHERN ISLAND", "x": 12, "y": 14, "width": 1, "height": 1 }, { "map_section": "MAPSEC_FIERY_PATH", "name": "FIERY PATH", "x": 6, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_FIERY_PATH2", "name": "FIERY PATH", "x": 7, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_JAGGED_PASS", "name": "JAGGED PASS", "x": 6, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_JAGGED_PASS2", "name": "JAGGED PASS", "x": 7, "y": 2, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SEALED_CHAMBER", "name": "SEALED CHAMBER", "x": 11, "y": 10, "width": 1, "height": 1 }, { "map_section": "MAPSEC_UNDERWATER_SEALED_CHAMBER", "name": "UNDERWATER", "x": 11, "y": 10, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SCORCHED_SLAB", "name": "SCORCHED SLAB", "x": 13, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ISLAND_CAVE", "name": "ISLAND CAVE", "x": 0, "y": 10, "width": 1, "height": 1 }, { "map_section": "MAPSEC_DESERT_RUINS", "name": "DESERT RUINS", "x": 8, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ANCIENT_TOMB", "name": "ANCIENT TOMB", "x": 13, "y": 2, "width": 1, "height": 1 }, { "map_section": "MAPSEC_INSIDE_OF_TRUCK", "name": "INSIDE OF TRUCK", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SKY_PILLAR", "name": "SKY PILLAR", "x": 19, "y": 10, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SECRET_BASE", "name": "SECRET BASE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_DYNAMIC", "name": "FERRY", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_PALLET_TOWN", "name": "PALLET TOWN", "x": 4, "y": 11, "width": 1, "height": 1 }, { "map_section": "MAPSEC_VIRIDIAN_CITY", "name": "VIRIDIAN CITY", "x": 4, "y": 8, "width": 1, "height": 1 }, { "map_section": "MAPSEC_PEWTER_CITY", "name": "PEWTER CITY", "x": 4, "y": 4, "width": 1, "height": 1 }, { "map_section": "MAPSEC_CERULEAN_CITY", "name": "CERULEAN CITY", "x": 14, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_LAVENDER_TOWN", "name": "LAVENDER TOWN", "x": 18, "y": 6, "width": 1, "height": 1 }, { "map_section": "MAPSEC_VERMILION_CITY", "name": "VERMILION CITY", "x": 14, "y": 9, "width": 1, "height": 1 }, { "map_section": "MAPSEC_CELADON_CITY", "name": "CELADON CITY", "x": 11, "y": 6, "width": 1, "height": 1 }, { "map_section": "MAPSEC_FUCHSIA_CITY", "name": "FUCHSIA CITY", "x": 12, "y": 12, "width": 1, "height": 1 }, { "map_section": "MAPSEC_CINNABAR_ISLAND", "name": "CINNABAR ISLAND", "x": 4, "y": 14, "width": 1, "height": 1 }, { "map_section": "MAPSEC_INDIGO_PLATEAU", "name": "INDIGO PLATEAU", "x": 2, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SAFFRON_CITY", "name": "SAFFRON CITY", "x": 14, "y": 6, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ROUTE_4_POKECENTER", "name": "ROUTE 4", "name_clone": true, "x": 8, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ROUTE_10_POKECENTER", "name": "ROUTE 10", "name_clone": true, "x": 18, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ROUTE_1", "name": "ROUTE 1", "x": 4, "y": 9, "width": 1, "height": 2 }, { "map_section": "MAPSEC_ROUTE_2", "name": "ROUTE 2", "x": 4, "y": 5, "width": 1, "height": 3 }, { "map_section": "MAPSEC_ROUTE_3", "name": "ROUTE 3", "x": 5, "y": 4, "width": 4, "height": 1 }, { "map_section": "MAPSEC_ROUTE_4", "name": "ROUTE 4", "x": 8, "y": 3, "width": 6, "height": 1 }, { "map_section": "MAPSEC_ROUTE_5", "name": "ROUTE 5", "x": 14, "y": 4, "width": 1, "height": 2 }, { "map_section": "MAPSEC_ROUTE_6", "name": "ROUTE 6", "x": 14, "y": 7, "width": 1, "height": 2 }, { "map_section": "MAPSEC_ROUTE_7", "name": "ROUTE 7", "x": 12, "y": 6, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_8", "name": "ROUTE 8", "x": 15, "y": 6, "width": 3, "height": 1 }, { "map_section": "MAPSEC_ROUTE_9", "name": "ROUTE 9", "x": 15, "y": 3, "width": 3, "height": 1 }, { "map_section": "MAPSEC_ROUTE_10", "name": "ROUTE 10", "x": 18, "y": 3, "width": 1, "height": 3 }, { "map_section": "MAPSEC_ROUTE_11", "name": "ROUTE 11", "x": 15, "y": 9, "width": 3, "height": 1 }, { "map_section": "MAPSEC_ROUTE_12", "name": "ROUTE 12", "x": 18, "y": 7, "width": 1, "height": 5 }, { "map_section": "MAPSEC_ROUTE_13", "name": "ROUTE 13", "x": 16, "y": 11, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_14", "name": "ROUTE 14", "x": 15, "y": 11, "width": 1, "height": 2 }, { "map_section": "MAPSEC_ROUTE_15", "name": "ROUTE 15", "x": 13, "y": 12, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_16", "name": "ROUTE 16", "x": 7, "y": 6, "width": 4, "height": 1 }, { "map_section": "MAPSEC_ROUTE_17", "name": "ROUTE 17", "x": 7, "y": 7, "width": 1, "height": 5 }, { "map_section": "MAPSEC_ROUTE_18", "name": "ROUTE 18", "x": 7, "y": 12, "width": 5, "height": 1 }, { "map_section": "MAPSEC_ROUTE_19", "name": "ROUTE 19", "x": 12, "y": 13, "width": 1, "height": 2 }, { "map_section": "MAPSEC_ROUTE_20", "name": "ROUTE 20", "x": 5, "y": 14, "width": 7, "height": 1 }, { "map_section": "MAPSEC_ROUTE_21", "name": "ROUTE 21", "x": 4, "y": 12, "width": 1, "height": 2 }, { "map_section": "MAPSEC_ROUTE_22", "name": "ROUTE 22", "x": 2, "y": 8, "width": 2, "height": 1 }, { "map_section": "MAPSEC_ROUTE_23", "name": "ROUTE 23", "x": 2, "y": 4, "width": 1, "height": 4 }, { "map_section": "MAPSEC_ROUTE_24", "name": "ROUTE 24", "x": 14, "y": 1, "width": 1, "height": 2 }, { "map_section": "MAPSEC_ROUTE_25", "name": "ROUTE 25", "x": 15, "y": 1, "width": 2, "height": 1 }, { "map_section": "MAPSEC_VIRIDIAN_FOREST", "name": "VIRIDIAN FOREST", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_MT_MOON", "name": "MT. MOON", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_S_S_ANNE", "name": "S.S. ANNE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_UNDERGROUND_PATH", "name": "UNDERGROUND PATH", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_UNDERGROUND_PATH_2", "name": "UNDERGROUND PATH", "name_clone": true, "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_DIGLETTS_CAVE", "name": "DIGLETT'S CAVE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_KANTO_VICTORY_ROAD", "name": "VICTORY ROAD", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ROCKET_HIDEOUT", "name": "ROCKET HIDEOUT", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SILPH_CO", "name": "SILPH CO.", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_POKEMON_MANSION", "name": "POKéMON MANSION", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_KANTO_SAFARI_ZONE", "name": "SAFARI ZONE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_POKEMON_LEAGUE", "name": "POKéMON LEAGUE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ROCK_TUNNEL", "name": "ROCK TUNNEL", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SEAFOAM_ISLANDS", "name": "SEAFOAM ISLANDS", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_POKEMON_TOWER", "name": "POKéMON TOWER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_CERULEAN_CAVE", "name": "CERULEAN CAVE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_POWER_PLANT", "name": "POWER PLANT", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ONE_ISLAND", "name": "ONE ISLAND", "x": 1, "y": 8, "width": 1, "height": 1 }, { "map_section": "MAPSEC_TWO_ISLAND", "name": "TWO ISLAND", "x": 9, "y": 9, "width": 1, "height": 1 }, { "map_section": "MAPSEC_THREE_ISLAND", "name": "THREE ISLAND", "x": 18, "y": 12, "width": 1, "height": 1 }, { "map_section": "MAPSEC_FOUR_ISLAND", "name": "FOUR ISLAND", "x": 3, "y": 4, "width": 1, "height": 1 }, { "map_section": "MAPSEC_FIVE_ISLAND", "name": "FIVE ISLAND", "x": 16, "y": 11, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SEVEN_ISLAND", "name": "SEVEN ISLAND", "x": 5, "y": 8, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SIX_ISLAND", "name": "SIX ISLAND", "x": 17, "y": 5, "width": 1, "height": 1 }, { "map_section": "MAPSEC_KINDLE_ROAD", "name": "KINDLE ROAD", "x": 2, "y": 3, "width": 1, "height": 6 }, { "map_section": "MAPSEC_TREASURE_BEACH", "name": "TREASURE BEACH", "x": 1, "y": 9, "width": 1, "height": 2 }, { "map_section": "MAPSEC_CAPE_BRINK", "name": "CAPE BRINK", "x": 9, "y": 7, "width": 1, "height": 2 }, { "map_section": "MAPSEC_BOND_BRIDGE", "name": "BOND BRIDGE", "x": 13, "y": 12, "width": 4, "height": 1 }, { "map_section": "MAPSEC_THREE_ISLE_PORT", "name": "THREE ISLE PORT", "x": 18, "y": 13, "width": 2, "height": 1 }, { "map_section": "MAPSEC_SEVII_ISLE_6", "name": "SEVII ISLE 6", "x": 4, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SEVII_ISLE_7", "name": "SEVII ISLE 7", "x": 5, "y": 4, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SEVII_ISLE_8", "name": "SEVII ISLE 8", "x": 1, "y": 4, "width": 3, "height": 1 }, { "map_section": "MAPSEC_SEVII_ISLE_9", "name": "SEVII ISLE 9", "x": 4, "y": 5, "width": 1, "height": 2 }, { "map_section": "MAPSEC_RESORT_GORGEOUS", "name": "RESORT GORGEOUS", "x": 16, "y": 9, "width": 3, "height": 1 }, { "map_section": "MAPSEC_WATER_LABYRINTH", "name": "WATER LABYRINTH", "x": 14, "y": 10, "width": 3, "height": 1 }, { "map_section": "MAPSEC_FIVE_ISLE_MEADOW", "name": "FIVE ISLE MEADOW", "x": 17, "y": 10, "width": 1, "height": 3 }, { "map_section": "MAPSEC_MEMORIAL_PILLAR", "name": "MEMORIAL PILLAR", "x": 18, "y": 12, "width": 1, "height": 3 }, { "map_section": "MAPSEC_OUTCAST_ISLAND", "name": "OUTCAST ISLAND", "x": 15, "y": 0, "width": 1, "height": 3 }, { "map_section": "MAPSEC_GREEN_PATH", "name": "GREEN PATH", "x": 15, "y": 3, "width": 3, "height": 1 }, { "map_section": "MAPSEC_WATER_PATH", "name": "WATER PATH", "x": 18, "y": 3, "width": 1, "height": 5 }, { "map_section": "MAPSEC_RUIN_VALLEY", "name": "RUIN VALLEY", "x": 16, "y": 7, "width": 2, "height": 2 }, { "map_section": "MAPSEC_TRAINER_TOWER", "name": "TRAINER TOWER", "x": 5, "y": 6, "width": 1, "height": 2 }, { "map_section": "MAPSEC_CANYON_ENTRANCE", "name": "CANYON ENTRANCE", "x": 5, "y": 9, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SEVAULT_CANYON", "name": "SEVAULT CANYON", "x": 6, "y": 9, "width": 1, "height": 3 }, { "map_section": "MAPSEC_TANOBY_RUINS", "name": "TANOBY RUINS", "x": 3, "y": 12, "width": 7, "height": 1 }, { "map_section": "MAPSEC_SEVII_ISLE_22", "name": "SEVII ISLE 22", "x": 9, "y": 12, "width": 1, "height": 3 }, { "map_section": "MAPSEC_SEVII_ISLE_23", "name": "SEVII ISLE 23", "x": 3, "y": 14, "width": 6, "height": 1 }, { "map_section": "MAPSEC_SEVII_ISLE_24", "name": "SEVII ISLE 24", "x": 2, "y": 12, "width": 1, "height": 3 }, { "map_section": "MAPSEC_NAVEL_ROCK", "name": "NAVEL ROCK", "x": 10, "y": 8, "width": 1, "height": 1 }, { "map_section": "MAPSEC_MT_EMBER", "name": "MT. EMBER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_BERRY_FOREST", "name": "BERRY FOREST", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ICEFALL_CAVE", "name": "ICEFALL CAVE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ROCKET_WAREHOUSE", "name": "ROCKET WAREHOUSE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_TRAINER_TOWER_2", "name": "TRAINER TOWER", "name_clone": true, "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_DOTTED_HOLE", "name": "DOTTED HOLE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_LOST_CAVE", "name": "LOST CAVE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_PATTERN_BUSH", "name": "PATTERN BUSH", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ALTERING_CAVE", "name": "ALTERING CAVE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_TANOBY_CHAMBERS", "name": "TANOBY CHAMBERS", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_THREE_ISLE_PATH", "name": "THREE ISLE PATH", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_TANOBY_KEY", "name": "TANOBY KEY", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_BIRTH_ISLAND", "name": "BIRTH ISLAND", "x": 18, "y": 13, "width": 1, "height": 1 }, { "map_section": "MAPSEC_MONEAN_CHAMBER", "name": "MONEAN CHAMBER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_LIPTOO_CHAMBER", "name": "LIPTOO CHAMBER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_WEEPTH_CHAMBER", "name": "WEEPTH CHAMBER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_DILFORD_CHAMBER", "name": "DILFORD CHAMBER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SCUFIB_CHAMBER", "name": "SCUFIB CHAMBER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_RIXY_CHAMBER", "name": "RIXY CHAMBER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_VIAPOIS_CHAMBER", "name": "VIAPOIS CHAMBER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_EMBER_SPA", "name": "EMBER SPA", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_SPECIAL_AREA", "name": "CELADON DEPT.", "x": 0, "y": 0, "width": 0, "height": 0 }, { "map_section": "MAPSEC_AQUA_HIDEOUT", "name": "AQUA HIDEOUT", "x": 19, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_MAGMA_HIDEOUT", "name": "MAGMA HIDEOUT", "x": 6, "y": 3, "width": 1, "height": 1 }, { "map_section": "MAPSEC_MIRAGE_TOWER", "name": "MIRAGE TOWER", "x": 8, "y": 2, "width": 1, "height": 1 }, { "map_section": "MAPSEC_BIRTH_ISLAND_E", "name": "BIRTH ISLAND", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_FARAWAY_ISLAND", "name": "FARAWAY ISLAND", "x": 0, "y": 17, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ARTISAN_CAVE", "name": "ARTISAN CAVE", "x": 22, "y": 12, "width": 1, "height": 1 }, { "map_section": "MAPSEC_MARINE_CAVE", "name": "MARINE CAVE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_UNDERWATER_MARINE_CAVE", "name": "UNDERWATER", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_TERRA_CAVE", "name": "TERRA CAVE", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_UNDERWATER_105", "name": "UNDERWATER", "x": 0, "y": 10, "width": 1, "height": 3 }, { "map_section": "MAPSEC_UNDERWATER_125", "name": "UNDERWATER", "x": 24, "y": 3, "width": 2, "height": 2 }, { "map_section": "MAPSEC_UNDERWATER_129", "name": "UNDERWATER", "x": 24, "y": 10, "width": 2, "height": 1 }, { "map_section": "MAPSEC_DESERT_UNDERPASS", "name": "DESERT UNDERPASS", "x": 2, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_ALTERING_CAVE_E", "name": "ALTERING CAVE", "x": 6, "y": 8, "width": 1, "height": 1 }, { "map_section": "MAPSEC_NAVEL_ROCK_E", "name": "NAVEL ROCK", "x": 0, "y": 0, "width": 1, "height": 1 }, { "map_section": "MAPSEC_TRAINER_HILL", "name": "TRAINER HILL", "x": 8, "y": 4, "width": 1, "height": 1 } ] } ================================================ FILE: src/data/region_map/region_map_sections.strings.json.txt ================================================ {{ doNotModifyHeader }} #ifndef GUARD_DATA_REGION_MAP_REGION_MAP_ENTRY_STRINGS_H #define GUARD_DATA_REGION_MAP_REGION_MAP_ENTRY_STRINGS_H ## for map_section in map_sections {% if isEmptyString(getVar(map_section.name)) and not existsIn(map_section, "name_clone") %}{{ setVar(map_section.name, map_section.map_section) }}{% endif %} ## endfor ## for map_section in map_sections {% if getVar(map_section.name) == map_section.map_section %} static const u8 sMapsecName_{{ cleanString(map_section.name) }}[] = _("{{ map_section.name }}"); {% endif %} {% if existsIn(map_section, "name_clone") %} static const u8 sMapsecName_{{ cleanString(map_section.name) }}_Clone[] = _("{{ map_section.name }}"); {% endif %} ## endfor #endif // GUARD_DATA_REGION_MAP_REGION_MAP_ENTRY_STRINGS_H ================================================ FILE: src/data/text/abilities.h ================================================ static const u8 sNoneDescription[] = _("No special ability."); static const u8 sStenchDescription[] = _("Helps repel wild POKéMON."); static const u8 sDrizzleDescription[] = _("Summons rain in battle."); static const u8 sSpeedBoostDescription[] = _("Gradually boosts SPEED."); static const u8 sBattleArmorDescription[] = _("Blocks critical hits."); static const u8 sSturdyDescription[] = _("Negates 1-hit KO attacks."); static const u8 sDampDescription[] = _("Prevents self-destruction."); static const u8 sLimberDescription[] = _("Prevents paralysis."); static const u8 sSandVeilDescription[] = _("Ups evasion in a sandstorm."); static const u8 sStaticDescription[] = _("Paralyzes on contact."); static const u8 sVoltAbsorbDescription[] = _("Turns electricity into HP."); static const u8 sWaterAbsorbDescription[] = _("Changes water into HP."); static const u8 sObliviousDescription[] = _("Prevents attraction."); static const u8 sCloudNineDescription[] = _("Negates weather effects."); static const u8 sCompoundEyesDescription[] = _("Raises accuracy."); static const u8 sInsomniaDescription[] = _("Prevents sleep."); static const u8 sColorChangeDescription[] = _("Changes type to foe's move."); static const u8 sImmunityDescription[] = _("Prevents poisoning."); static const u8 sFlashFireDescription[] = _("Powers up if hit by fire."); static const u8 sShieldDustDescription[] = _("Prevents added effects."); static const u8 sOwnTempoDescription[] = _("Prevents confusion."); static const u8 sSuctionCupsDescription[] = _("Firmly anchors the body."); static const u8 sIntimidateDescription[] = _("Lowers the foe's ATTACK."); static const u8 sShadowTagDescription[] = _("Prevents the foe's escape."); static const u8 sRoughSkinDescription[] = _("Hurts to touch."); static const u8 sWonderGuardDescription[] = _("“Super effective” hits."); static const u8 sLevitateDescription[] = _("Not hit by GROUND attacks."); static const u8 sEffectSporeDescription[] = _("Leaves spores on contact."); static const u8 sSynchronizeDescription[] = _("Passes on status problems."); static const u8 sClearBodyDescription[] = _("Prevents ability reduction."); static const u8 sNaturalCureDescription[] = _("Heals upon switching out."); static const u8 sLightningRodDescription[] = _("Draws electrical moves."); static const u8 sSereneGraceDescription[] = _("Promotes added effects."); static const u8 sSwiftSwimDescription[] = _("Raises SPEED in rain."); static const u8 sChlorophyllDescription[] = _("Raises SPEED in sunshine."); static const u8 sIlluminateDescription[] = _("Encounter rate increases."); static const u8 sTraceDescription[] = _("Copies special ability."); static const u8 sHugePowerDescription[] = _("Raises ATTACK."); static const u8 sPoisonPointDescription[] = _("Poisons foe on contact."); static const u8 sInnerFocusDescription[] = _("Prevents flinching."); static const u8 sMagmaArmorDescription[] = _("Prevents freezing."); static const u8 sWaterVeilDescription[] = _("Prevents burns."); static const u8 sMagnetPullDescription[] = _("Traps STEEL-type POKéMON."); static const u8 sSoundproofDescription[] = _("Avoids sound-based moves."); static const u8 sRainDishDescription[] = _("Slight HP recovery in rain."); static const u8 sSandStreamDescription[] = _("Summons a sandstorm."); static const u8 sPressureDescription[] = _("Raises foe's PP usage."); static const u8 sThickFatDescription[] = _("Heat-and-cold protection."); static const u8 sEarlyBirdDescription[] = _("Awakens quickly from sleep."); static const u8 sFlameBodyDescription[] = _("Burns the foe on contact."); static const u8 sRunAwayDescription[] = _("Makes escaping easier."); static const u8 sKeenEyeDescription[] = _("Prevents loss of accuracy."); static const u8 sHyperCutterDescription[] = _("Prevents ATTACK reduction."); static const u8 sPickupDescription[] = _("May pick up items."); static const u8 sTruantDescription[] = _("Moves only every two turns."); static const u8 sHustleDescription[] = _("Trades accuracy for power."); static const u8 sCuteCharmDescription[] = _("Infatuates on contact."); static const u8 sPlusDescription[] = _("Powers up with MINUS."); static const u8 sMinusDescription[] = _("Powers up with PLUS."); static const u8 sForecastDescription[] = _("Changes with the weather."); static const u8 sStickyHoldDescription[] = _("Prevents item theft."); static const u8 sShedSkinDescription[] = _("Heals the body by shedding."); static const u8 sGutsDescription[] = _("Ups ATTACK if suffering."); static const u8 sMarvelScaleDescription[] = _("Ups DEFENSE if suffering."); static const u8 sLiquidOozeDescription[] = _("Draining causes injury."); static const u8 sOvergrowDescription[] = _("Ups GRASS moves in a pinch."); static const u8 sBlazeDescription[] = _("Ups FIRE moves in a pinch."); static const u8 sTorrentDescription[] = _("Ups WATER moves in a pinch."); static const u8 sSwarmDescription[] = _("Ups BUG moves in a pinch."); static const u8 sRockHeadDescription[] = _("Prevents recoil damage."); static const u8 sDroughtDescription[] = _("Summons sunlight in battle."); static const u8 sArenaTrapDescription[] = _("Prevents fleeing."); static const u8 sVitalSpiritDescription[] = _("Prevents sleep."); static const u8 sWhiteSmokeDescription[] = _("Prevents ability reduction."); static const u8 sPurePowerDescription[] = _("Raises ATTACK."); static const u8 sShellArmorDescription[] = _("Blocks critical hits."); static const u8 sCacophonyDescription[] = _("Avoids sound-based moves."); static const u8 sAirLockDescription[] = _("Negates weather effects."); const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] = { [ABILITY_NONE] = sNoneDescription, [ABILITY_STENCH] = sStenchDescription, [ABILITY_DRIZZLE] = sDrizzleDescription, [ABILITY_SPEED_BOOST] = sSpeedBoostDescription, [ABILITY_BATTLE_ARMOR] = sBattleArmorDescription, [ABILITY_STURDY] = sSturdyDescription, [ABILITY_DAMP] = sDampDescription, [ABILITY_LIMBER] = sLimberDescription, [ABILITY_SAND_VEIL] = sSandVeilDescription, [ABILITY_STATIC] = sStaticDescription, [ABILITY_VOLT_ABSORB] = sVoltAbsorbDescription, [ABILITY_WATER_ABSORB] = sWaterAbsorbDescription, [ABILITY_OBLIVIOUS] = sObliviousDescription, [ABILITY_CLOUD_NINE] = sCloudNineDescription, [ABILITY_COMPOUND_EYES] = sCompoundEyesDescription, [ABILITY_INSOMNIA] = sInsomniaDescription, [ABILITY_COLOR_CHANGE] = sColorChangeDescription, [ABILITY_IMMUNITY] = sImmunityDescription, [ABILITY_FLASH_FIRE] = sFlashFireDescription, [ABILITY_SHIELD_DUST] = sShieldDustDescription, [ABILITY_OWN_TEMPO] = sOwnTempoDescription, [ABILITY_SUCTION_CUPS] = sSuctionCupsDescription, [ABILITY_INTIMIDATE] = sIntimidateDescription, [ABILITY_SHADOW_TAG] = sShadowTagDescription, [ABILITY_ROUGH_SKIN] = sRoughSkinDescription, [ABILITY_WONDER_GUARD] = sWonderGuardDescription, [ABILITY_LEVITATE] = sLevitateDescription, [ABILITY_EFFECT_SPORE] = sEffectSporeDescription, [ABILITY_SYNCHRONIZE] = sSynchronizeDescription, [ABILITY_CLEAR_BODY] = sClearBodyDescription, [ABILITY_NATURAL_CURE] = sNaturalCureDescription, [ABILITY_LIGHTNING_ROD] = sLightningRodDescription, [ABILITY_SERENE_GRACE] = sSereneGraceDescription, [ABILITY_SWIFT_SWIM] = sSwiftSwimDescription, [ABILITY_CHLOROPHYLL] = sChlorophyllDescription, [ABILITY_ILLUMINATE] = sIlluminateDescription, [ABILITY_TRACE] = sTraceDescription, [ABILITY_HUGE_POWER] = sHugePowerDescription, [ABILITY_POISON_POINT] = sPoisonPointDescription, [ABILITY_INNER_FOCUS] = sInnerFocusDescription, [ABILITY_MAGMA_ARMOR] = sMagmaArmorDescription, [ABILITY_WATER_VEIL] = sWaterVeilDescription, [ABILITY_MAGNET_PULL] = sMagnetPullDescription, [ABILITY_SOUNDPROOF] = sSoundproofDescription, [ABILITY_RAIN_DISH] = sRainDishDescription, [ABILITY_SAND_STREAM] = sSandStreamDescription, [ABILITY_PRESSURE] = sPressureDescription, [ABILITY_THICK_FAT] = sThickFatDescription, [ABILITY_EARLY_BIRD] = sEarlyBirdDescription, [ABILITY_FLAME_BODY] = sFlameBodyDescription, [ABILITY_RUN_AWAY] = sRunAwayDescription, [ABILITY_KEEN_EYE] = sKeenEyeDescription, [ABILITY_HYPER_CUTTER] = sHyperCutterDescription, [ABILITY_PICKUP] = sPickupDescription, [ABILITY_TRUANT] = sTruantDescription, [ABILITY_HUSTLE] = sHustleDescription, [ABILITY_CUTE_CHARM] = sCuteCharmDescription, [ABILITY_PLUS] = sPlusDescription, [ABILITY_MINUS] = sMinusDescription, [ABILITY_FORECAST] = sForecastDescription, [ABILITY_STICKY_HOLD] = sStickyHoldDescription, [ABILITY_SHED_SKIN] = sShedSkinDescription, [ABILITY_GUTS] = sGutsDescription, [ABILITY_MARVEL_SCALE] = sMarvelScaleDescription, [ABILITY_LIQUID_OOZE] = sLiquidOozeDescription, [ABILITY_OVERGROW] = sOvergrowDescription, [ABILITY_BLAZE] = sBlazeDescription, [ABILITY_TORRENT] = sTorrentDescription, [ABILITY_SWARM] = sSwarmDescription, [ABILITY_ROCK_HEAD] = sRockHeadDescription, [ABILITY_DROUGHT] = sDroughtDescription, [ABILITY_ARENA_TRAP] = sArenaTrapDescription, [ABILITY_VITAL_SPIRIT] = sVitalSpiritDescription, [ABILITY_WHITE_SMOKE] = sWhiteSmokeDescription, [ABILITY_PURE_POWER] = sPurePowerDescription, [ABILITY_SHELL_ARMOR] = sShellArmorDescription, [ABILITY_CACOPHONY] = sCacophonyDescription, [ABILITY_AIR_LOCK] = sAirLockDescription, }; const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = { [ABILITY_NONE] = _("-------"), [ABILITY_STENCH] = _("STENCH"), [ABILITY_DRIZZLE] = _("DRIZZLE"), [ABILITY_SPEED_BOOST] = _("SPEED BOOST"), [ABILITY_BATTLE_ARMOR] = _("BATTLE ARMOR"), [ABILITY_STURDY] = _("STURDY"), [ABILITY_DAMP] = _("DAMP"), [ABILITY_LIMBER] = _("LIMBER"), [ABILITY_SAND_VEIL] = _("SAND VEIL"), [ABILITY_STATIC] = _("STATIC"), [ABILITY_VOLT_ABSORB] = _("VOLT ABSORB"), [ABILITY_WATER_ABSORB] = _("WATER ABSORB"), [ABILITY_OBLIVIOUS] = _("OBLIVIOUS"), [ABILITY_CLOUD_NINE] = _("CLOUD NINE"), [ABILITY_COMPOUND_EYES] = _("COMPOUNDEYES"), [ABILITY_INSOMNIA] = _("INSOMNIA"), [ABILITY_COLOR_CHANGE] = _("COLOR CHANGE"), [ABILITY_IMMUNITY] = _("IMMUNITY"), [ABILITY_FLASH_FIRE] = _("FLASH FIRE"), [ABILITY_SHIELD_DUST] = _("SHIELD DUST"), [ABILITY_OWN_TEMPO] = _("OWN TEMPO"), [ABILITY_SUCTION_CUPS] = _("SUCTION CUPS"), [ABILITY_INTIMIDATE] = _("INTIMIDATE"), [ABILITY_SHADOW_TAG] = _("SHADOW TAG"), [ABILITY_ROUGH_SKIN] = _("ROUGH SKIN"), [ABILITY_WONDER_GUARD] = _("WONDER GUARD"), [ABILITY_LEVITATE] = _("LEVITATE"), [ABILITY_EFFECT_SPORE] = _("EFFECT SPORE"), [ABILITY_SYNCHRONIZE] = _("SYNCHRONIZE"), [ABILITY_CLEAR_BODY] = _("CLEAR BODY"), [ABILITY_NATURAL_CURE] = _("NATURAL CURE"), [ABILITY_LIGHTNING_ROD] = _("LIGHTNINGROD"), [ABILITY_SERENE_GRACE] = _("SERENE GRACE"), [ABILITY_SWIFT_SWIM] = _("SWIFT SWIM"), [ABILITY_CHLOROPHYLL] = _("CHLOROPHYLL"), [ABILITY_ILLUMINATE] = _("ILLUMINATE"), [ABILITY_TRACE] = _("TRACE"), [ABILITY_HUGE_POWER] = _("HUGE POWER"), [ABILITY_POISON_POINT] = _("POISON POINT"), [ABILITY_INNER_FOCUS] = _("INNER FOCUS"), [ABILITY_MAGMA_ARMOR] = _("MAGMA ARMOR"), [ABILITY_WATER_VEIL] = _("WATER VEIL"), [ABILITY_MAGNET_PULL] = _("MAGNET PULL"), [ABILITY_SOUNDPROOF] = _("SOUNDPROOF"), [ABILITY_RAIN_DISH] = _("RAIN DISH"), [ABILITY_SAND_STREAM] = _("SAND STREAM"), [ABILITY_PRESSURE] = _("PRESSURE"), [ABILITY_THICK_FAT] = _("THICK FAT"), [ABILITY_EARLY_BIRD] = _("EARLY BIRD"), [ABILITY_FLAME_BODY] = _("FLAME BODY"), [ABILITY_RUN_AWAY] = _("RUN AWAY"), [ABILITY_KEEN_EYE] = _("KEEN EYE"), [ABILITY_HYPER_CUTTER] = _("HYPER CUTTER"), [ABILITY_PICKUP] = _("PICKUP"), [ABILITY_TRUANT] = _("TRUANT"), [ABILITY_HUSTLE] = _("HUSTLE"), [ABILITY_CUTE_CHARM] = _("CUTE CHARM"), [ABILITY_PLUS] = _("PLUS"), [ABILITY_MINUS] = _("MINUS"), [ABILITY_FORECAST] = _("FORECAST"), [ABILITY_STICKY_HOLD] = _("STICKY HOLD"), [ABILITY_SHED_SKIN] = _("SHED SKIN"), [ABILITY_GUTS] = _("GUTS"), [ABILITY_MARVEL_SCALE] = _("MARVEL SCALE"), [ABILITY_LIQUID_OOZE] = _("LIQUID OOZE"), [ABILITY_OVERGROW] = _("OVERGROW"), [ABILITY_BLAZE] = _("BLAZE"), [ABILITY_TORRENT] = _("TORRENT"), [ABILITY_SWARM] = _("SWARM"), [ABILITY_ROCK_HEAD] = _("ROCK HEAD"), [ABILITY_DROUGHT] = _("DROUGHT"), [ABILITY_ARENA_TRAP] = _("ARENA TRAP"), [ABILITY_VITAL_SPIRIT] = _("VITAL SPIRIT"), [ABILITY_WHITE_SMOKE] = _("WHITE SMOKE"), [ABILITY_PURE_POWER] = _("PURE POWER"), [ABILITY_SHELL_ARMOR] = _("SHELL ARMOR"), [ABILITY_CACOPHONY] = _("CACOPHONY"), [ABILITY_AIR_LOCK] = _("AIR LOCK"), }; ================================================ FILE: src/data/text/move_names.h ================================================ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = { [MOVE_NONE] = _("-$$$$$$"), [MOVE_POUND] = _("POUND"), [MOVE_KARATE_CHOP] = _("KARATE CHOP"), [MOVE_DOUBLE_SLAP] = _("DOUBLESLAP"), [MOVE_COMET_PUNCH] = _("COMET PUNCH"), [MOVE_MEGA_PUNCH] = _("MEGA PUNCH"), [MOVE_PAY_DAY] = _("PAY DAY"), [MOVE_FIRE_PUNCH] = _("FIRE PUNCH"), [MOVE_ICE_PUNCH] = _("ICE PUNCH"), [MOVE_THUNDER_PUNCH] = _("THUNDERPUNCH"), [MOVE_SCRATCH] = _("SCRATCH"), [MOVE_VICE_GRIP] = _("VICEGRIP"), [MOVE_GUILLOTINE] = _("GUILLOTINE"), [MOVE_RAZOR_WIND] = _("RAZOR WIND"), [MOVE_SWORDS_DANCE] = _("SWORDS DANCE"), [MOVE_CUT] = _("CUT"), [MOVE_GUST] = _("GUST"), [MOVE_WING_ATTACK] = _("WING ATTACK"), [MOVE_WHIRLWIND] = _("WHIRLWIND"), [MOVE_FLY] = _("FLY"), [MOVE_BIND] = _("BIND"), [MOVE_SLAM] = _("SLAM"), [MOVE_VINE_WHIP] = _("VINE WHIP"), [MOVE_STOMP] = _("STOMP"), [MOVE_DOUBLE_KICK] = _("DOUBLE KICK"), [MOVE_MEGA_KICK] = _("MEGA KICK"), [MOVE_JUMP_KICK] = _("JUMP KICK"), [MOVE_ROLLING_KICK] = _("ROLLING KICK"), [MOVE_SAND_ATTACK] = _("SAND-ATTACK"), [MOVE_HEADBUTT] = _("HEADBUTT"), [MOVE_HORN_ATTACK] = _("HORN ATTACK"), [MOVE_FURY_ATTACK] = _("FURY ATTACK"), [MOVE_HORN_DRILL] = _("HORN DRILL"), [MOVE_TACKLE] = _("TACKLE"), [MOVE_BODY_SLAM] = _("BODY SLAM"), [MOVE_WRAP] = _("WRAP"), [MOVE_TAKE_DOWN] = _("TAKE DOWN"), [MOVE_THRASH] = _("THRASH"), [MOVE_DOUBLE_EDGE] = _("DOUBLE-EDGE"), [MOVE_TAIL_WHIP] = _("TAIL WHIP"), [MOVE_POISON_STING] = _("POISON STING"), [MOVE_TWINEEDLE] = _("TWINEEDLE"), [MOVE_PIN_MISSILE] = _("PIN MISSILE"), [MOVE_LEER] = _("LEER"), [MOVE_BITE] = _("BITE"), [MOVE_GROWL] = _("GROWL"), [MOVE_ROAR] = _("ROAR"), [MOVE_SING] = _("SING"), [MOVE_SUPERSONIC] = _("SUPERSONIC"), [MOVE_SONIC_BOOM] = _("SONICBOOM"), [MOVE_DISABLE] = _("DISABLE"), [MOVE_ACID] = _("ACID"), [MOVE_EMBER] = _("EMBER"), [MOVE_FLAMETHROWER] = _("FLAMETHROWER"), [MOVE_MIST] = _("MIST"), [MOVE_WATER_GUN] = _("WATER GUN"), [MOVE_HYDRO_PUMP] = _("HYDRO PUMP"), [MOVE_SURF] = _("SURF"), [MOVE_ICE_BEAM] = _("ICE BEAM"), [MOVE_BLIZZARD] = _("BLIZZARD"), [MOVE_PSYBEAM] = _("PSYBEAM"), [MOVE_BUBBLE_BEAM] = _("BUBBLEBEAM"), [MOVE_AURORA_BEAM] = _("AURORA BEAM"), [MOVE_HYPER_BEAM] = _("HYPER BEAM"), [MOVE_PECK] = _("PECK"), [MOVE_DRILL_PECK] = _("DRILL PECK"), [MOVE_SUBMISSION] = _("SUBMISSION"), [MOVE_LOW_KICK] = _("LOW KICK"), [MOVE_COUNTER] = _("COUNTER"), [MOVE_SEISMIC_TOSS] = _("SEISMIC TOSS"), [MOVE_STRENGTH] = _("STRENGTH"), [MOVE_ABSORB] = _("ABSORB"), [MOVE_MEGA_DRAIN] = _("MEGA DRAIN"), [MOVE_LEECH_SEED] = _("LEECH SEED"), [MOVE_GROWTH] = _("GROWTH"), [MOVE_RAZOR_LEAF] = _("RAZOR LEAF"), [MOVE_SOLAR_BEAM] = _("SOLARBEAM"), [MOVE_POISON_POWDER] = _("POISONPOWDER"), [MOVE_STUN_SPORE] = _("STUN SPORE"), [MOVE_SLEEP_POWDER] = _("SLEEP POWDER"), [MOVE_PETAL_DANCE] = _("PETAL DANCE"), [MOVE_STRING_SHOT] = _("STRING SHOT"), [MOVE_DRAGON_RAGE] = _("DRAGON RAGE"), [MOVE_FIRE_SPIN] = _("FIRE SPIN"), [MOVE_THUNDER_SHOCK] = _("THUNDERSHOCK"), [MOVE_THUNDERBOLT] = _("THUNDERBOLT"), [MOVE_THUNDER_WAVE] = _("THUNDER WAVE"), [MOVE_THUNDER] = _("THUNDER"), [MOVE_ROCK_THROW] = _("ROCK THROW"), [MOVE_EARTHQUAKE] = _("EARTHQUAKE"), [MOVE_FISSURE] = _("FISSURE"), [MOVE_DIG] = _("DIG"), [MOVE_TOXIC] = _("TOXIC"), [MOVE_CONFUSION] = _("CONFUSION"), [MOVE_PSYCHIC] = _("PSYCHIC"), [MOVE_HYPNOSIS] = _("HYPNOSIS"), [MOVE_MEDITATE] = _("MEDITATE"), [MOVE_AGILITY] = _("AGILITY"), [MOVE_QUICK_ATTACK] = _("QUICK ATTACK"), [MOVE_RAGE] = _("RAGE"), [MOVE_TELEPORT] = _("TELEPORT"), [MOVE_NIGHT_SHADE] = _("NIGHT SHADE"), [MOVE_MIMIC] = _("MIMIC"), [MOVE_SCREECH] = _("SCREECH"), [MOVE_DOUBLE_TEAM] = _("DOUBLE TEAM"), [MOVE_RECOVER] = _("RECOVER"), [MOVE_HARDEN] = _("HARDEN"), [MOVE_MINIMIZE] = _("MINIMIZE"), [MOVE_SMOKESCREEN] = _("SMOKESCREEN"), [MOVE_CONFUSE_RAY] = _("CONFUSE RAY"), [MOVE_WITHDRAW] = _("WITHDRAW"), [MOVE_DEFENSE_CURL] = _("DEFENSE CURL"), [MOVE_BARRIER] = _("BARRIER"), [MOVE_LIGHT_SCREEN] = _("LIGHT SCREEN"), [MOVE_HAZE] = _("HAZE"), [MOVE_REFLECT] = _("REFLECT"), [MOVE_FOCUS_ENERGY] = _("FOCUS ENERGY"), [MOVE_BIDE] = _("BIDE"), [MOVE_METRONOME] = _("METRONOME"), [MOVE_MIRROR_MOVE] = _("MIRROR MOVE"), [MOVE_SELF_DESTRUCT] = _("SELFDESTRUCT"), [MOVE_EGG_BOMB] = _("EGG BOMB"), [MOVE_LICK] = _("LICK"), [MOVE_SMOG] = _("SMOG"), [MOVE_SLUDGE] = _("SLUDGE"), [MOVE_BONE_CLUB] = _("BONE CLUB"), [MOVE_FIRE_BLAST] = _("FIRE BLAST"), [MOVE_WATERFALL] = _("WATERFALL"), [MOVE_CLAMP] = _("CLAMP"), [MOVE_SWIFT] = _("SWIFT"), [MOVE_SKULL_BASH] = _("SKULL BASH"), [MOVE_SPIKE_CANNON] = _("SPIKE CANNON"), [MOVE_CONSTRICT] = _("CONSTRICT"), [MOVE_AMNESIA] = _("AMNESIA"), [MOVE_KINESIS] = _("KINESIS"), [MOVE_SOFT_BOILED] = _("SOFTBOILED"), [MOVE_HI_JUMP_KICK] = _("HI JUMP KICK"), [MOVE_GLARE] = _("GLARE"), [MOVE_DREAM_EATER] = _("DREAM EATER"), [MOVE_POISON_GAS] = _("POISON GAS"), [MOVE_BARRAGE] = _("BARRAGE"), [MOVE_LEECH_LIFE] = _("LEECH LIFE"), [MOVE_LOVELY_KISS] = _("LOVELY KISS"), [MOVE_SKY_ATTACK] = _("SKY ATTACK"), [MOVE_TRANSFORM] = _("TRANSFORM"), [MOVE_BUBBLE] = _("BUBBLE"), [MOVE_DIZZY_PUNCH] = _("DIZZY PUNCH"), [MOVE_SPORE] = _("SPORE"), [MOVE_FLASH] = _("FLASH"), [MOVE_PSYWAVE] = _("PSYWAVE"), [MOVE_SPLASH] = _("SPLASH"), [MOVE_ACID_ARMOR] = _("ACID ARMOR"), [MOVE_CRABHAMMER] = _("CRABHAMMER"), [MOVE_EXPLOSION] = _("EXPLOSION"), [MOVE_FURY_SWIPES] = _("FURY SWIPES"), [MOVE_BONEMERANG] = _("BONEMERANG"), [MOVE_REST] = _("REST"), [MOVE_ROCK_SLIDE] = _("ROCK SLIDE"), [MOVE_HYPER_FANG] = _("HYPER FANG"), [MOVE_SHARPEN] = _("SHARPEN"), [MOVE_CONVERSION] = _("CONVERSION"), [MOVE_TRI_ATTACK] = _("TRI ATTACK"), [MOVE_SUPER_FANG] = _("SUPER FANG"), [MOVE_SLASH] = _("SLASH"), [MOVE_SUBSTITUTE] = _("SUBSTITUTE"), [MOVE_STRUGGLE] = _("STRUGGLE"), [MOVE_SKETCH] = _("SKETCH"), [MOVE_TRIPLE_KICK] = _("TRIPLE KICK"), [MOVE_THIEF] = _("THIEF"), [MOVE_SPIDER_WEB] = _("SPIDER WEB"), [MOVE_MIND_READER] = _("MIND READER"), [MOVE_NIGHTMARE] = _("NIGHTMARE"), [MOVE_FLAME_WHEEL] = _("FLAME WHEEL"), [MOVE_SNORE] = _("SNORE"), [MOVE_CURSE] = _("CURSE"), [MOVE_FLAIL] = _("FLAIL"), [MOVE_CONVERSION_2] = _("CONVERSION 2"), [MOVE_AEROBLAST] = _("AEROBLAST"), [MOVE_COTTON_SPORE] = _("COTTON SPORE"), [MOVE_REVERSAL] = _("REVERSAL"), [MOVE_SPITE] = _("SPITE"), [MOVE_POWDER_SNOW] = _("POWDER SNOW"), [MOVE_PROTECT] = _("PROTECT"), [MOVE_MACH_PUNCH] = _("MACH PUNCH"), [MOVE_SCARY_FACE] = _("SCARY FACE"), [MOVE_FAINT_ATTACK] = _("FAINT ATTACK"), [MOVE_SWEET_KISS] = _("SWEET KISS"), [MOVE_BELLY_DRUM] = _("BELLY DRUM"), [MOVE_SLUDGE_BOMB] = _("SLUDGE BOMB"), [MOVE_MUD_SLAP] = _("MUD-SLAP"), [MOVE_OCTAZOOKA] = _("OCTAZOOKA"), [MOVE_SPIKES] = _("SPIKES"), [MOVE_ZAP_CANNON] = _("ZAP CANNON"), [MOVE_FORESIGHT] = _("FORESIGHT"), [MOVE_DESTINY_BOND] = _("DESTINY BOND"), [MOVE_PERISH_SONG] = _("PERISH SONG"), [MOVE_ICY_WIND] = _("ICY WIND"), [MOVE_DETECT] = _("DETECT"), [MOVE_BONE_RUSH] = _("BONE RUSH"), [MOVE_LOCK_ON] = _("LOCK-ON"), [MOVE_OUTRAGE] = _("OUTRAGE"), [MOVE_SANDSTORM] = _("SANDSTORM"), [MOVE_GIGA_DRAIN] = _("GIGA DRAIN"), [MOVE_ENDURE] = _("ENDURE"), [MOVE_CHARM] = _("CHARM"), [MOVE_ROLLOUT] = _("ROLLOUT"), [MOVE_FALSE_SWIPE] = _("FALSE SWIPE"), [MOVE_SWAGGER] = _("SWAGGER"), [MOVE_MILK_DRINK] = _("MILK DRINK"), [MOVE_SPARK] = _("SPARK"), [MOVE_FURY_CUTTER] = _("FURY CUTTER"), [MOVE_STEEL_WING] = _("STEEL WING"), [MOVE_MEAN_LOOK] = _("MEAN LOOK"), [MOVE_ATTRACT] = _("ATTRACT"), [MOVE_SLEEP_TALK] = _("SLEEP TALK"), [MOVE_HEAL_BELL] = _("HEAL BELL"), [MOVE_RETURN] = _("RETURN"), [MOVE_PRESENT] = _("PRESENT"), [MOVE_FRUSTRATION] = _("FRUSTRATION"), [MOVE_SAFEGUARD] = _("SAFEGUARD"), [MOVE_PAIN_SPLIT] = _("PAIN SPLIT"), [MOVE_SACRED_FIRE] = _("SACRED FIRE"), [MOVE_MAGNITUDE] = _("MAGNITUDE"), [MOVE_DYNAMIC_PUNCH] = _("DYNAMICPUNCH"), [MOVE_MEGAHORN] = _("MEGAHORN"), [MOVE_DRAGON_BREATH] = _("DRAGONBREATH"), [MOVE_BATON_PASS] = _("BATON PASS"), [MOVE_ENCORE] = _("ENCORE"), [MOVE_PURSUIT] = _("PURSUIT"), [MOVE_RAPID_SPIN] = _("RAPID SPIN"), [MOVE_SWEET_SCENT] = _("SWEET SCENT"), [MOVE_IRON_TAIL] = _("IRON TAIL"), [MOVE_METAL_CLAW] = _("METAL CLAW"), [MOVE_VITAL_THROW] = _("VITAL THROW"), [MOVE_MORNING_SUN] = _("MORNING SUN"), [MOVE_SYNTHESIS] = _("SYNTHESIS"), [MOVE_MOONLIGHT] = _("MOONLIGHT"), [MOVE_HIDDEN_POWER] = _("HIDDEN POWER"), [MOVE_CROSS_CHOP] = _("CROSS CHOP"), [MOVE_TWISTER] = _("TWISTER"), [MOVE_RAIN_DANCE] = _("RAIN DANCE"), [MOVE_SUNNY_DAY] = _("SUNNY DAY"), [MOVE_CRUNCH] = _("CRUNCH"), [MOVE_MIRROR_COAT] = _("MIRROR COAT"), [MOVE_PSYCH_UP] = _("PSYCH UP"), [MOVE_EXTREME_SPEED] = _("EXTREMESPEED"), [MOVE_ANCIENT_POWER] = _("ANCIENTPOWER"), [MOVE_SHADOW_BALL] = _("SHADOW BALL"), [MOVE_FUTURE_SIGHT] = _("FUTURE SIGHT"), [MOVE_ROCK_SMASH] = _("ROCK SMASH"), [MOVE_WHIRLPOOL] = _("WHIRLPOOL"), [MOVE_BEAT_UP] = _("BEAT UP"), [MOVE_FAKE_OUT] = _("FAKE OUT"), [MOVE_UPROAR] = _("UPROAR"), [MOVE_STOCKPILE] = _("STOCKPILE"), [MOVE_SPIT_UP] = _("SPIT UP"), [MOVE_SWALLOW] = _("SWALLOW"), [MOVE_HEAT_WAVE] = _("HEAT WAVE"), [MOVE_HAIL] = _("HAIL"), [MOVE_TORMENT] = _("TORMENT"), [MOVE_FLATTER] = _("FLATTER"), [MOVE_WILL_O_WISP] = _("WILL-O-WISP"), [MOVE_MEMENTO] = _("MEMENTO"), [MOVE_FACADE] = _("FACADE"), [MOVE_FOCUS_PUNCH] = _("FOCUS PUNCH"), [MOVE_SMELLING_SALT] = _("SMELLINGSALT"), [MOVE_FOLLOW_ME] = _("FOLLOW ME"), [MOVE_NATURE_POWER] = _("NATURE POWER"), [MOVE_CHARGE] = _("CHARGE"), [MOVE_TAUNT] = _("TAUNT"), [MOVE_HELPING_HAND] = _("HELPING HAND"), [MOVE_TRICK] = _("TRICK"), [MOVE_ROLE_PLAY] = _("ROLE PLAY"), [MOVE_WISH] = _("WISH"), [MOVE_ASSIST] = _("ASSIST"), [MOVE_INGRAIN] = _("INGRAIN"), [MOVE_SUPERPOWER] = _("SUPERPOWER"), [MOVE_MAGIC_COAT] = _("MAGIC COAT"), [MOVE_RECYCLE] = _("RECYCLE"), [MOVE_REVENGE] = _("REVENGE"), [MOVE_BRICK_BREAK] = _("BRICK BREAK"), [MOVE_YAWN] = _("YAWN"), [MOVE_KNOCK_OFF] = _("KNOCK OFF"), [MOVE_ENDEAVOR] = _("ENDEAVOR"), [MOVE_ERUPTION] = _("ERUPTION"), [MOVE_SKILL_SWAP] = _("SKILL SWAP"), [MOVE_IMPRISON] = _("IMPRISON"), [MOVE_REFRESH] = _("REFRESH"), [MOVE_GRUDGE] = _("GRUDGE"), [MOVE_SNATCH] = _("SNATCH"), [MOVE_SECRET_POWER] = _("SECRET POWER"), [MOVE_DIVE] = _("DIVE"), [MOVE_ARM_THRUST] = _("ARM THRUST"), [MOVE_CAMOUFLAGE] = _("CAMOUFLAGE"), [MOVE_TAIL_GLOW] = _("TAIL GLOW"), [MOVE_LUSTER_PURGE] = _("LUSTER PURGE"), [MOVE_MIST_BALL] = _("MIST BALL"), [MOVE_FEATHER_DANCE] = _("FEATHERDANCE"), [MOVE_TEETER_DANCE] = _("TEETER DANCE"), [MOVE_BLAZE_KICK] = _("BLAZE KICK"), [MOVE_MUD_SPORT] = _("MUD SPORT"), [MOVE_ICE_BALL] = _("ICE BALL"), [MOVE_NEEDLE_ARM] = _("NEEDLE ARM"), [MOVE_SLACK_OFF] = _("SLACK OFF"), [MOVE_HYPER_VOICE] = _("HYPER VOICE"), [MOVE_POISON_FANG] = _("POISON FANG"), [MOVE_CRUSH_CLAW] = _("CRUSH CLAW"), [MOVE_BLAST_BURN] = _("BLAST BURN"), [MOVE_HYDRO_CANNON] = _("HYDRO CANNON"), [MOVE_METEOR_MASH] = _("METEOR MASH"), [MOVE_ASTONISH] = _("ASTONISH"), [MOVE_WEATHER_BALL] = _("WEATHER BALL"), [MOVE_AROMATHERAPY] = _("AROMATHERAPY"), [MOVE_FAKE_TEARS] = _("FAKE TEARS"), [MOVE_AIR_CUTTER] = _("AIR CUTTER"), [MOVE_OVERHEAT] = _("OVERHEAT"), [MOVE_ODOR_SLEUTH] = _("ODOR SLEUTH"), [MOVE_ROCK_TOMB] = _("ROCK TOMB"), [MOVE_SILVER_WIND] = _("SILVER WIND"), [MOVE_METAL_SOUND] = _("METAL SOUND"), [MOVE_GRASS_WHISTLE] = _("GRASSWHISTLE"), [MOVE_TICKLE] = _("TICKLE"), [MOVE_COSMIC_POWER] = _("COSMIC POWER"), [MOVE_WATER_SPOUT] = _("WATER SPOUT"), [MOVE_SIGNAL_BEAM] = _("SIGNAL BEAM"), [MOVE_SHADOW_PUNCH] = _("SHADOW PUNCH"), [MOVE_EXTRASENSORY] = _("EXTRASENSORY"), [MOVE_SKY_UPPERCUT] = _("SKY UPPERCUT"), [MOVE_SAND_TOMB] = _("SAND TOMB"), [MOVE_SHEER_COLD] = _("SHEER COLD"), [MOVE_MUDDY_WATER] = _("MUDDY WATER"), [MOVE_BULLET_SEED] = _("BULLET SEED"), [MOVE_AERIAL_ACE] = _("AERIAL ACE"), [MOVE_ICICLE_SPEAR] = _("ICICLE SPEAR"), [MOVE_IRON_DEFENSE] = _("IRON DEFENSE"), [MOVE_BLOCK] = _("BLOCK"), [MOVE_HOWL] = _("HOWL"), [MOVE_DRAGON_CLAW] = _("DRAGON CLAW"), [MOVE_FRENZY_PLANT] = _("FRENZY PLANT"), [MOVE_BULK_UP] = _("BULK UP"), [MOVE_BOUNCE] = _("BOUNCE"), [MOVE_MUD_SHOT] = _("MUD SHOT"), [MOVE_POISON_TAIL] = _("POISON TAIL"), [MOVE_COVET] = _("COVET"), [MOVE_VOLT_TACKLE] = _("VOLT TACKLE"), [MOVE_MAGICAL_LEAF] = _("MAGICAL LEAF"), [MOVE_WATER_SPORT] = _("WATER SPORT"), [MOVE_CALM_MIND] = _("CALM MIND"), [MOVE_LEAF_BLADE] = _("LEAF BLADE"), [MOVE_DRAGON_DANCE] = _("DRAGON DANCE"), [MOVE_ROCK_BLAST] = _("ROCK BLAST"), [MOVE_SHOCK_WAVE] = _("SHOCK WAVE"), [MOVE_WATER_PULSE] = _("WATER PULSE"), [MOVE_DOOM_DESIRE] = _("DOOM DESIRE"), [MOVE_PSYCHO_BOOST] = _("PSYCHO BOOST") }; ================================================ FILE: src/data/text/nature_names.h ================================================ static const u8 sHardyNatureName[] = _("HARDY"); static const u8 sLonelyNatureName[] = _("LONELY"); static const u8 sBraveNatureName[] = _("BRAVE"); static const u8 sAdamantNatureName[] = _("ADAMANT"); static const u8 sNaughtyNatureName[] = _("NAUGHTY"); static const u8 sBoldNatureName[] = _("BOLD"); static const u8 sDocileNatureName[] = _("DOCILE"); static const u8 sRelaxedNatureName[] = _("RELAXED"); static const u8 sImpishNatureName[] = _("IMPISH"); static const u8 sLaxNatureName[] = _("LAX"); static const u8 sTimidNatureName[] = _("TIMID"); static const u8 sHastyNatureName[] = _("HASTY"); static const u8 sSeriousNatureName[] = _("SERIOUS"); static const u8 sJollyNatureName[] = _("JOLLY"); static const u8 sNaiveNatureName[] = _("NAIVE"); static const u8 sModestNatureName[] = _("MODEST"); static const u8 sMildNatureName[] = _("MILD"); static const u8 sQuietNatureName[] = _("QUIET"); static const u8 sBashfulNatureName[] = _("BASHFUL"); static const u8 sRashNatureName[] = _("RASH"); static const u8 sCalmNatureName[] = _("CALM"); static const u8 sGentleNatureName[] = _("GENTLE"); static const u8 sSassyNatureName[] = _("SASSY"); static const u8 sCarefulNatureName[] = _("CAREFUL"); static const u8 sQuirkyNatureName[] = _("QUIRKY"); const u8 *const gNatureNamePointers[NUM_NATURES] = { [NATURE_HARDY] = sHardyNatureName, [NATURE_LONELY] = sLonelyNatureName, [NATURE_BRAVE] = sBraveNatureName, [NATURE_ADAMANT] = sAdamantNatureName, [NATURE_NAUGHTY] = sNaughtyNatureName, [NATURE_BOLD] = sBoldNatureName, [NATURE_DOCILE] = sDocileNatureName, [NATURE_RELAXED] = sRelaxedNatureName, [NATURE_IMPISH] = sImpishNatureName, [NATURE_LAX] = sLaxNatureName, [NATURE_TIMID] = sTimidNatureName, [NATURE_HASTY] = sHastyNatureName, [NATURE_SERIOUS] = sSeriousNatureName, [NATURE_JOLLY] = sJollyNatureName, [NATURE_NAIVE] = sNaiveNatureName, [NATURE_MODEST] = sModestNatureName, [NATURE_MILD] = sMildNatureName, [NATURE_QUIET] = sQuietNatureName, [NATURE_BASHFUL] = sBashfulNatureName, [NATURE_RASH] = sRashNatureName, [NATURE_CALM] = sCalmNatureName, [NATURE_GENTLE] = sGentleNatureName, [NATURE_SASSY] = sSassyNatureName, [NATURE_CAREFUL] = sCarefulNatureName, [NATURE_QUIRKY] = sQuirkyNatureName, }; ================================================ FILE: src/data/text/quest_log.h ================================================ const u8 gText_QuestLog_PreviouslyOnYourQuest[] = _("Previously on your quest…"); const u8 gText_QuestLog_SwitchMon1WithMon2[] = _("{PLAYER} switched the POKéMON\n{STR_VAR_1} with {STR_VAR_2}."); const u8 gText_QuestLog_SwappedHeldItemsOnMon[] = _("Took the item {STR_VAR_2} from\n{STR_VAR_1} and gave it the item\n{STR_VAR_3} to hold."); const u8 gText_QuestLog_TookHeldItemFromMon[] = _("Took the item {STR_VAR_2} from\n{STR_VAR_1}."); const u8 gText_QuestLog_UsedItemOnMonAtThisLocation[] = _("Used the item {STR_VAR_1} on {STR_VAR_2}\nat this location."); const u8 gText_QuestLog_UsedTheItem[] = _("{PLAYER} used the\n{STR_VAR_1}."); const u8 gText_QuestLog_UsedTheKeyItem[] = _("Used the item {STR_VAR_1}, which was\nin the KEY ITEMS POCKET."); const u8 gText_QuestLog_MonLearnedMoveFromTM[] = _("{STR_VAR_1} learned the move\n{STR_VAR_2} from a TM."); const u8 gText_QuestLog_MonReplacedMoveWithTM[] = _("{STR_VAR_1} learned the move\n{STR_VAR_2} from a TM and forgot\nthe move {STR_VAR_3}."); const u8 gText_QuestLog_MonsWereFullyRestoredAtCenter[] = _("POKéMON were fully restored\nat a POKéMON CENTER."); const u8 gText_QuestLog_PlayerBattledChampionRival[] = _("{DYNAMIC 0x00} had a marvelous battle\nwith the CHAMPION, {DYNAMIC 0x01}."); const u8 gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2[] = _("In the end, {DYNAMIC 0x00} sent out {DYNAMIC 0x01}\nwhile {DYNAMIC 0x02} countered with\n{DYNAMIC 0x03}."); const u8 gText_QuestLog_WonTheMatchAsAResult[] = _("And, as a result of battling with every\nbit of power, {DYNAMIC 0x00} won\nthe match."); const u8 gText_QuestLog_StoredItemInPC[] = _("Removed the item {STR_VAR_1} from\nthe BAG's ITEMS POCKET and stored it\non the PC."); const u8 gText_QuestLog_WithdrewItemFromPC[] = _("{PLAYER} withdrew the item {STR_VAR_1}\nfrom the PC."); const u8 gText_QuestLog_TradedMon1ForPersonsMon2[] = _("Traded {STR_VAR_3} in exchange for\n{STR_VAR_1}'s {STR_VAR_2}."); const u8 gText_QuestLog_SingleBattleWithPersonResultedInOutcome[] = _("Took on {DYNAMIC 0x00} in a SINGLE BATTLE.\nIt was a hotly contested match that\nresulted in a {DYNAMIC 0x01}."); const u8 gText_QuestLog_DoubleBattleWithPersonResultedInOutcome[] = _("Took on {DYNAMIC 0x00} in a DOUBLE BATTLE.\nIt was an extended match that resulted\nin a {DYNAMIC 0x01}."); const u8 gText_QuestLog_MultiBattleWithPeopleResultedInOutcome[] = _("{DYNAMIC 0x00} and {DYNAMIC 0x01} took on\n{DYNAMIC 0x02} and {DYNAMIC 0x03} in a\nMULTI BATTLE and got a {DYNAMIC 0x04}."); const u8 gText_QuestLog_Win[] = _("win"); const u8 gText_QuestLog_Loss[] = _("loss"); const u8 gText_QuestLog_MingledInUnionRoom[] = _("Mingled with other TRAINERS in\nthe UNION ROOM."); const u8 gText_QuestLog_DepartedPlaceInTownForNextDestination[] = _("Departed {STR_VAR_2}\nin {STR_VAR_1} for the next\ndestination."); const u8 gText_QuestLog_SwitchedMonsBetweenBoxes[] = _("After consideration, switched\n{DYNAMIC 0x01} in {DYNAMIC 0x00} with\n{DYNAMIC 0x03} in {DYNAMIC 0x02}."); const u8 gText_QuestLog_MovedMonToNewBox[] = _("After deep thought, switched\n{DYNAMIC 0x01} in BOX “{DYNAMIC 0x00}” to\nthe BOX “{DYNAMIC 0x02}.”"); const u8 gText_QuestLog_SwitchedMonsWithinBox[] = _("Switched around {DYNAMIC 0x01} and\n{DYNAMIC 0x02} in {DYNAMIC 0x00}."); const u8 gText_QuestLog_MovedMonWithinBox[] = _("Moved {DYNAMIC 0x01} in {DYNAMIC 0x00}."); const u8 gText_QuestLog_SwitchedPartyMonForPCMon[] = _("Switched {DYNAMIC 0x01} in {DYNAMIC 0x00}\nwith {DYNAMIC 0x02} in the party."); const u8 gText_QuestLog_WithdrewMonFromPC[] = _("Added {DYNAMIC 0x01} in {DYNAMIC 0x00}\nto the party."); const u8 gText_QuestLog_DepositedMonInPC[] = _("Moved {DYNAMIC 0x00} from the party\nto {DYNAMIC 0x01}."); const u8 gText_QuestLog_SwitchedMultipleMons[] = _("Moved a group of POKéMON in\n{DYNAMIC 0x00} to {DYNAMIC 0x01}."); const u8 gText_QuestLog_ADifferentSpot[] = _("a different spot"); const u8 gText_QuestLog_GaveMonHeldItemFromPC[] = _("Removed the item {STR_VAR_1} from\n{PLAYER}'s PC and gave it to {STR_VAR_2}\nto hold."); const u8 gText_QuestLog_SwappedHeldItemFromPC[] = _("Removed the item {STR_VAR_1} from\na PC, gave it to {STR_VAR_2}, and put\nthe {STR_VAR_3} it held in the BAG."); const u8 gText_QuestLog_ChattedWithManyTrainers[] = _("Chatted with many TRAINERS."); const u8 gText_QuestLog_Handily[] = _("handily"); const u8 gText_QuestLog_Tenaciously[] = _("tenaciously"); const u8 gText_QuestLog_Somehow[] = _("somehow"); const u8 gText_QuestLog_TradedMon1ForTrainersMon2[] = _("Met and traded with {STR_VAR_1}.\nObtained the TRAINER's {STR_VAR_2} in\nexchange for {STR_VAR_3}."); const u8 gText_QuestLog_BattledTrainerEndedInOutcome[] = _("Met and battled {STR_VAR_1}.\nThe match ended in a {STR_VAR_2}."); const u8 gText_QuestLog_BoughtItem[] = _("Went to the POKéMON MART in\n{DYNAMIC 0x00} and bought one \n{DYNAMIC 0x01}."); const u8 gText_QuestLog_BoughtItemsIncludingItem[] = _("Went to the POKéMON MART in\n{DYNAMIC 0x00} and spent ¥{DYNAMIC 0x02} for\nitems including {DYNAMIC 0x01}(s)."); const u8 gText_QuestLog_SoldNumOfItem[] = _("{DYNAMIC 0x00} went to the POKéMON MART in\n{DYNAMIC 0x01} and sold {DYNAMIC 0x03} of\nthe item {DYNAMIC 0x02}."); const u8 gText_QuestLog_SoldItemsIncludingItem[] = _("Sold items including {DYNAMIC 0x01} at\nthe POKéMON MART in {DYNAMIC 0x00},\nworth ¥{DYNAMIC 0x02}."); const u8 gText_QuestLog_JustOne[] = _("just one"); const u8 gText_QuestLog_Num[] = _("{DYNAMIC 0x04}"); const u8 gText_QuestLog_UsedSoftboiled[] = _("{STR_VAR_1} shared its HP using the move\nSOFTBOILED."); const u8 gText_QuestLog_UsedMilkDrink[] = _("{STR_VAR_1} shared its HP using the move\nMILK DRINK."); const u8 gText_QuestLog_MonLearnedMoveFromHM[] = _("{STR_VAR_1} securely learned the move\n{STR_VAR_2} using an HM."); const u8 gText_QuestLog_MonReplacedMoveWithHM[] = _("{STR_VAR_1} securely learned the move\n{STR_VAR_2} using an HM and forgot\nthe move {STR_VAR_3}."); const u8 gText_QuestLog_DefeatedWildMon[] = _("{DYNAMIC 0x05} managed to defeat the POKéMON\n{DYNAMIC 0x01} in {DYNAMIC 0x00}."); const u8 gText_QuestLog_DefeatedWildMons[] = _("Defeated {DYNAMIC 0x02} wild POKéMON including\n{DYNAMIC 0x01} in {DYNAMIC 0x00}."); const u8 gText_QuestLog_CaughtWildMon[] = _("{DYNAMIC 0x05} managed to catch the POKéMON\n{DYNAMIC 0x03} in {DYNAMIC 0x00}."); const u8 gText_QuestLog_CaughtWildMons[] = _("Threw POKé BALLS in a frenzy, catching\n{DYNAMIC 0x04} POKéMON including {DYNAMIC 0x03} here\nin {DYNAMIC 0x00}."); const u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMon[] = _("{DYNAMIC 0x05} defeated the POKéMON\n{DYNAMIC 0x01} and caught one {DYNAMIC 0x03}\nin {DYNAMIC 0x00}."); const u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMons[] = _("Defeated the POKéMON {DYNAMIC 0x01}\nand caught {DYNAMIC 0x04} POKéMON including\n{DYNAMIC 0x03} in {DYNAMIC 0x00}."); const u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMon[] = _("{DYNAMIC 0x05} defeated {DYNAMIC 0x02} POKéMON including\n{DYNAMIC 0x01} and caught one {DYNAMIC 0x03}\nin {DYNAMIC 0x00}."); const u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMons[] = _("Defeated {DYNAMIC 0x02} POKéMON including\n{DYNAMIC 0x01} and caught {DYNAMIC 0x04} POKéMON\nincluding {DYNAMIC 0x03} in {DYNAMIC 0x00}."); const u8 gText_QuestLog_GaveMonHeldItem[] = _("Made {STR_VAR_1} hold the item\n{STR_VAR_2}."); const u8 gText_QuestLog_GaveMonHeldItem2[] = _("{PLAYER} made {STR_VAR_1} hold the item\n{STR_VAR_2}."); const u8 gText_QuestLog_UsedCut[] = _("{STR_VAR_1} used the Hidden Move\nCUT here."); const u8 gText_QuestLog_UsedFly[] = _("{STR_VAR_1} used the Hidden Move\nFLY and flew to {STR_VAR_2}."); const u8 gText_QuestLog_UsedSurf[] = _("{STR_VAR_1} used the Hidden Move\nSURF and rode the waves."); const u8 gText_QuestLog_UsedStrength[] = _("{STR_VAR_1} used the Hidden Move\nSTRENGTH here."); const u8 gText_QuestLog_UsedFlash[] = _("{STR_VAR_1} used the Hidden Move\nFLASH and illuminated a pitch-black\ncave."); const u8 gText_QuestLog_UsedRockSmash[] = _("{STR_VAR_1} used the Hidden Move\nROCK SMASH here."); const u8 gText_QuestLog_UsedWaterfall[] = _("{STR_VAR_1} used the Hidden Move\nWATERFALL to scale a raging torrent."); // Unused const u8 gText_QuestLog_UsedDigInLocation[] = _("{STR_VAR_1} used DIG to escape from\n{STR_VAR_2}."); const u8 gText_QuestLog_UsedSweetScent[] = _("{STR_VAR_1} used SWEET SCENT to attract\nwild POKéMON."); const u8 gText_QuestLog_UsedTeleportToLocation[] = _("{STR_VAR_1} used TELEPORT, transporting\nthe party to {STR_VAR_2}'s\n{STR_VAR_3}."); const u8 gText_QuestLog_LeftTownsLocationForNextDestination[] = _("{PLAYER} left {STR_VAR_1}'s\n{STR_VAR_2} for the next\ndestination."); const u8 gText_QuestLog_PlayedGamesAtGameCorner[] = _("Played a lot of games at the ROCKET\nGAME CORNER in {STR_VAR_1}."); const u8 gText_QuestLog_RestedAtHome[] = _("{PLAYER} rested comfortably at home."); const u8 gText_QuestLog_LeftOaksLab[] = _("{PLAYER} left PROF. OAK's POKéMON\nRESEARCH LAB."); const u8 gText_QuestLog_GymWasFullOfToughTrainers[] = _("The GYM in {STR_VAR_1} was full of\ntough TRAINERS…\nPreparations had to be made."); const u8 gText_QuestLog_DepartedGym[] = _("Departed the GYM in {STR_VAR_1}."); const u8 gText_QuestLog_HadGreatTimeInSafariZone[] = _("{PLAYER} had a great time with POKéMON\nin the SAFARI ZONE."); const u8 gText_QuestLog_ManagedToGetOutOfLocation[] = _("Managed to get out of {STR_VAR_2}\nafter wandering about."); const u8 gText_QuestLog_TookOnGymLeadersMonWithMonAndWon[] = _("Took on {DYNAMIC 0x00} GYM LEADER\n{DYNAMIC 0x01}'s {DYNAMIC 0x02} with {DYNAMIC 0x03}\nand won {DYNAMIC 0x04}!"); const u8 gText_QuestLog_TookOnEliteFoursMonWithMonAndWon[] = _("Took on ELITE FOUR {DYNAMIC 0x00}'s\n{DYNAMIC 0x01} with {DYNAMIC 0x02} and\nwon {DYNAMIC 0x03}!"); const u8 gText_QuestLog_TookOnTrainersMonWithMonAndWon[] = _("In {DYNAMIC 0x00}, took on\n{DYNAMIC 0x01}'s {DYNAMIC 0x02} with {DYNAMIC 0x03}\nand won {DYNAMIC 0x04}!"); const u8 gText_QuestLog_Coolly[] = _("coolly"); const u8 gText_QuestLog_Barely[] = _("barely"); const u8 gText_QuestLog_UsedEscapeRope[] = _("{PLAYER} used an ESCAPE ROPE to get\nout from {STR_VAR_2}."); const u8 gText_QuestLog_Draw[] = _("draw"); const u8 gText_QuestLog_DepartedTheLocationForNextDestination[] = _("Departed from the {STR_VAR_2}\nfor the next destination."); const u8 gText_QuestLog_DepartedFromLocationToNextDestination[] = _("{PLAYER} departed from\n{STR_VAR_2} and made way\nto the next destination."); const u8 gText_QuestLog_ObtainedItemInLocation[] = _("Here in {STR_VAR_1}, {PLAYER}\nobtained the item {STR_VAR_2}."); const u8 gText_QuestLog_ArrivedInLocation[] = _("Arrived in {STR_VAR_1}."); const u8 gText_QuestLog_SavedGameAtLocation[] = _("And {PLAYER} saved the game at this\nlocation: {STR_VAR_1}."); const u8 gText_QuestLog_Home[] = _("HOME"); const u8 gText_QuestLog_OakResearchLab[] = _("OAK RESEARCH LAB"); const u8 gText_QuestLog_Gym[] = _("GYM"); const u8 gText_QuestLog_PokemonLeagueGate[] = _("POKéMON LEAGUE GATE"); const u8 gText_QuestLog_ViridianForest[] = _("VIRIDIAN FOREST"); const u8 gText_QuestLog_PewterMuseumOfScience[] = _("PEWTER MUSEUM OF SCIENCE"); const u8 gText_QuestLog_MtMoon[] = _("MT. MOON"); const u8 gText_QuestLog_BikeShop[] = _("BIKE SHOP"); const u8 gText_QuestLog_BillsHouse[] = _("BILL'S HOUSE"); const u8 gText_QuestLog_DayCare[] = _("DAY CARE"); const u8 gText_QuestLog_UndergroundPath[] = _("UNDERGROUND PATH"); const u8 gText_QuestLog_PokemonFanClub[] = _("POKéMON FAN CLUB"); const u8 gText_QuestLog_SSAnne[] = _("S.S. ANNE"); const u8 gText_QuestLog_DiglettsCave[] = _("DIGLETT'S CAVE"); const u8 gText_QuestLog_RockTunnel[] = _("ROCK TUNNEL"); const u8 gText_QuestLog_PowerPlant[] = _("POWER PLANT"); const u8 gText_QuestLog_PokemonTower[] = _("POKéMON TOWER"); const u8 gText_QuestLog_VolunteerHouse[] = _("VOLUNTEER HOUSE"); const u8 gText_QuestLog_NameRatersHouse[] = _("NAME RATER'S HOUSE"); const u8 gText_QuestLog_CeladonDeptStore[] = _("CELADON DEPT. STORE"); const u8 gText_QuestLog_CeladonMansion[] = _("CELADON MANSION"); const u8 gText_QuestLog_RocketGameCorner[] = _("ROCKET GAME CORNER"); const u8 gText_QuestLog_Restaurant[] = _("RESTAURANT"); const u8 gText_QuestLog_RocketHideout[] = _("ROCKET HIDEOUT"); const u8 gText_QuestLog_SafariZone[] = _("SAFARI ZONE"); const u8 gText_QuestLog_WardensHome[] = _("WARDEN'S HOME"); const u8 gText_QuestLog_FightingDojo[] = _("FIGHTING DOJO"); const u8 gText_QuestLog_SilphCo[] = _("SILPH CO."); const u8 gText_QuestLog_SeafoamIslands[] = _("SEAFOAM ISLANDS"); const u8 gText_QuestLog_PokemonMansion[] = _("POKéMON MANSION"); const u8 gText_QuestLog_PokemonResearchLab[] = _("POKéMON RESEARCH LAB"); const u8 gText_QuestLog_VictoryRoad[] = _("VICTORY ROAD"); const u8 gText_QuestLog_PokemonLeague[] = _("POKéMON LEAGUE"); const u8 gText_QuestLog_CeruleanCave[] = _("CERULEAN CAVE"); ================================================ FILE: src/data/text/species_names.h ================================================ const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1] = { [SPECIES_NONE] = _("??????????"), [SPECIES_BULBASAUR] = _("BULBASAUR"), [SPECIES_IVYSAUR] = _("IVYSAUR"), [SPECIES_VENUSAUR] = _("VENUSAUR"), [SPECIES_CHARMANDER] = _("CHARMANDER"), [SPECIES_CHARMELEON] = _("CHARMELEON"), [SPECIES_CHARIZARD] = _("CHARIZARD"), [SPECIES_SQUIRTLE] = _("SQUIRTLE"), [SPECIES_WARTORTLE] = _("WARTORTLE"), [SPECIES_BLASTOISE] = _("BLASTOISE"), [SPECIES_CATERPIE] = _("CATERPIE"), [SPECIES_METAPOD] = _("METAPOD"), [SPECIES_BUTTERFREE] = _("BUTTERFREE"), [SPECIES_WEEDLE] = _("WEEDLE"), [SPECIES_KAKUNA] = _("KAKUNA"), [SPECIES_BEEDRILL] = _("BEEDRILL"), [SPECIES_PIDGEY] = _("PIDGEY"), [SPECIES_PIDGEOTTO] = _("PIDGEOTTO"), [SPECIES_PIDGEOT] = _("PIDGEOT"), [SPECIES_RATTATA] = _("RATTATA"), [SPECIES_RATICATE] = _("RATICATE"), [SPECIES_SPEAROW] = _("SPEAROW"), [SPECIES_FEAROW] = _("FEAROW"), [SPECIES_EKANS] = _("EKANS"), [SPECIES_ARBOK] = _("ARBOK"), [SPECIES_PIKACHU] = _("PIKACHU"), [SPECIES_RAICHU] = _("RAICHU"), [SPECIES_SANDSHREW] = _("SANDSHREW"), [SPECIES_SANDSLASH] = _("SANDSLASH"), [SPECIES_NIDORAN_F] = _("NIDORAN♀"), [SPECIES_NIDORINA] = _("NIDORINA"), [SPECIES_NIDOQUEEN] = _("NIDOQUEEN"), [SPECIES_NIDORAN_M] = _("NIDORAN♂"), [SPECIES_NIDORINO] = _("NIDORINO"), [SPECIES_NIDOKING] = _("NIDOKING"), [SPECIES_CLEFAIRY] = _("CLEFAIRY"), [SPECIES_CLEFABLE] = _("CLEFABLE"), [SPECIES_VULPIX] = _("VULPIX"), [SPECIES_NINETALES] = _("NINETALES"), [SPECIES_JIGGLYPUFF] = _("JIGGLYPUFF"), [SPECIES_WIGGLYTUFF] = _("WIGGLYTUFF"), [SPECIES_ZUBAT] = _("ZUBAT"), [SPECIES_GOLBAT] = _("GOLBAT"), [SPECIES_ODDISH] = _("ODDISH"), [SPECIES_GLOOM] = _("GLOOM"), [SPECIES_VILEPLUME] = _("VILEPLUME"), [SPECIES_PARAS] = _("PARAS"), [SPECIES_PARASECT] = _("PARASECT"), [SPECIES_VENONAT] = _("VENONAT"), [SPECIES_VENOMOTH] = _("VENOMOTH"), [SPECIES_DIGLETT] = _("DIGLETT"), [SPECIES_DUGTRIO] = _("DUGTRIO"), [SPECIES_MEOWTH] = _("MEOWTH"), [SPECIES_PERSIAN] = _("PERSIAN"), [SPECIES_PSYDUCK] = _("PSYDUCK"), [SPECIES_GOLDUCK] = _("GOLDUCK"), [SPECIES_MANKEY] = _("MANKEY"), [SPECIES_PRIMEAPE] = _("PRIMEAPE"), [SPECIES_GROWLITHE] = _("GROWLITHE"), [SPECIES_ARCANINE] = _("ARCANINE"), [SPECIES_POLIWAG] = _("POLIWAG"), [SPECIES_POLIWHIRL] = _("POLIWHIRL"), [SPECIES_POLIWRATH] = _("POLIWRATH"), [SPECIES_ABRA] = _("ABRA"), [SPECIES_KADABRA] = _("KADABRA"), [SPECIES_ALAKAZAM] = _("ALAKAZAM"), [SPECIES_MACHOP] = _("MACHOP"), [SPECIES_MACHOKE] = _("MACHOKE"), [SPECIES_MACHAMP] = _("MACHAMP"), [SPECIES_BELLSPROUT] = _("BELLSPROUT"), [SPECIES_WEEPINBELL] = _("WEEPINBELL"), [SPECIES_VICTREEBEL] = _("VICTREEBEL"), [SPECIES_TENTACOOL] = _("TENTACOOL"), [SPECIES_TENTACRUEL] = _("TENTACRUEL"), [SPECIES_GEODUDE] = _("GEODUDE"), [SPECIES_GRAVELER] = _("GRAVELER"), [SPECIES_GOLEM] = _("GOLEM"), [SPECIES_PONYTA] = _("PONYTA"), [SPECIES_RAPIDASH] = _("RAPIDASH"), [SPECIES_SLOWPOKE] = _("SLOWPOKE"), [SPECIES_SLOWBRO] = _("SLOWBRO"), [SPECIES_MAGNEMITE] = _("MAGNEMITE"), [SPECIES_MAGNETON] = _("MAGNETON"), [SPECIES_FARFETCHD] = _("FARFETCH'D"), [SPECIES_DODUO] = _("DODUO"), [SPECIES_DODRIO] = _("DODRIO"), [SPECIES_SEEL] = _("SEEL"), [SPECIES_DEWGONG] = _("DEWGONG"), [SPECIES_GRIMER] = _("GRIMER"), [SPECIES_MUK] = _("MUK"), [SPECIES_SHELLDER] = _("SHELLDER"), [SPECIES_CLOYSTER] = _("CLOYSTER"), [SPECIES_GASTLY] = _("GASTLY"), [SPECIES_HAUNTER] = _("HAUNTER"), [SPECIES_GENGAR] = _("GENGAR"), [SPECIES_ONIX] = _("ONIX"), [SPECIES_DROWZEE] = _("DROWZEE"), [SPECIES_HYPNO] = _("HYPNO"), [SPECIES_KRABBY] = _("KRABBY"), [SPECIES_KINGLER] = _("KINGLER"), [SPECIES_VOLTORB] = _("VOLTORB"), [SPECIES_ELECTRODE] = _("ELECTRODE"), [SPECIES_EXEGGCUTE] = _("EXEGGCUTE"), [SPECIES_EXEGGUTOR] = _("EXEGGUTOR"), [SPECIES_CUBONE] = _("CUBONE"), [SPECIES_MAROWAK] = _("MAROWAK"), [SPECIES_HITMONLEE] = _("HITMONLEE"), [SPECIES_HITMONCHAN] = _("HITMONCHAN"), [SPECIES_LICKITUNG] = _("LICKITUNG"), [SPECIES_KOFFING] = _("KOFFING"), [SPECIES_WEEZING] = _("WEEZING"), [SPECIES_RHYHORN] = _("RHYHORN"), [SPECIES_RHYDON] = _("RHYDON"), [SPECIES_CHANSEY] = _("CHANSEY"), [SPECIES_TANGELA] = _("TANGELA"), [SPECIES_KANGASKHAN] = _("KANGASKHAN"), [SPECIES_HORSEA] = _("HORSEA"), [SPECIES_SEADRA] = _("SEADRA"), [SPECIES_GOLDEEN] = _("GOLDEEN"), [SPECIES_SEAKING] = _("SEAKING"), [SPECIES_STARYU] = _("STARYU"), [SPECIES_STARMIE] = _("STARMIE"), [SPECIES_MR_MIME] = _("MR. MIME"), [SPECIES_SCYTHER] = _("SCYTHER"), [SPECIES_JYNX] = _("JYNX"), [SPECIES_ELECTABUZZ] = _("ELECTABUZZ"), [SPECIES_MAGMAR] = _("MAGMAR"), [SPECIES_PINSIR] = _("PINSIR"), [SPECIES_TAUROS] = _("TAUROS"), [SPECIES_MAGIKARP] = _("MAGIKARP"), [SPECIES_GYARADOS] = _("GYARADOS"), [SPECIES_LAPRAS] = _("LAPRAS"), [SPECIES_DITTO] = _("DITTO"), [SPECIES_EEVEE] = _("EEVEE"), [SPECIES_VAPOREON] = _("VAPOREON"), [SPECIES_JOLTEON] = _("JOLTEON"), [SPECIES_FLAREON] = _("FLAREON"), [SPECIES_PORYGON] = _("PORYGON"), [SPECIES_OMANYTE] = _("OMANYTE"), [SPECIES_OMASTAR] = _("OMASTAR"), [SPECIES_KABUTO] = _("KABUTO"), [SPECIES_KABUTOPS] = _("KABUTOPS"), [SPECIES_AERODACTYL] = _("AERODACTYL"), [SPECIES_SNORLAX] = _("SNORLAX"), [SPECIES_ARTICUNO] = _("ARTICUNO"), [SPECIES_ZAPDOS] = _("ZAPDOS"), [SPECIES_MOLTRES] = _("MOLTRES"), [SPECIES_DRATINI] = _("DRATINI"), [SPECIES_DRAGONAIR] = _("DRAGONAIR"), [SPECIES_DRAGONITE] = _("DRAGONITE"), [SPECIES_MEWTWO] = _("MEWTWO"), [SPECIES_MEW] = _("MEW"), [SPECIES_CHIKORITA] = _("CHIKORITA"), [SPECIES_BAYLEEF] = _("BAYLEEF"), [SPECIES_MEGANIUM] = _("MEGANIUM"), [SPECIES_CYNDAQUIL] = _("CYNDAQUIL"), [SPECIES_QUILAVA] = _("QUILAVA"), [SPECIES_TYPHLOSION] = _("TYPHLOSION"), [SPECIES_TOTODILE] = _("TOTODILE"), [SPECIES_CROCONAW] = _("CROCONAW"), [SPECIES_FERALIGATR] = _("FERALIGATR"), [SPECIES_SENTRET] = _("SENTRET"), [SPECIES_FURRET] = _("FURRET"), [SPECIES_HOOTHOOT] = _("HOOTHOOT"), [SPECIES_NOCTOWL] = _("NOCTOWL"), [SPECIES_LEDYBA] = _("LEDYBA"), [SPECIES_LEDIAN] = _("LEDIAN"), [SPECIES_SPINARAK] = _("SPINARAK"), [SPECIES_ARIADOS] = _("ARIADOS"), [SPECIES_CROBAT] = _("CROBAT"), [SPECIES_CHINCHOU] = _("CHINCHOU"), [SPECIES_LANTURN] = _("LANTURN"), [SPECIES_PICHU] = _("PICHU"), [SPECIES_CLEFFA] = _("CLEFFA"), [SPECIES_IGGLYBUFF] = _("IGGLYBUFF"), [SPECIES_TOGEPI] = _("TOGEPI"), [SPECIES_TOGETIC] = _("TOGETIC"), [SPECIES_NATU] = _("NATU"), [SPECIES_XATU] = _("XATU"), [SPECIES_MAREEP] = _("MAREEP"), [SPECIES_FLAAFFY] = _("FLAAFFY"), [SPECIES_AMPHAROS] = _("AMPHAROS"), [SPECIES_BELLOSSOM] = _("BELLOSSOM"), [SPECIES_MARILL] = _("MARILL"), [SPECIES_AZUMARILL] = _("AZUMARILL"), [SPECIES_SUDOWOODO] = _("SUDOWOODO"), [SPECIES_POLITOED] = _("POLITOED"), [SPECIES_HOPPIP] = _("HOPPIP"), [SPECIES_SKIPLOOM] = _("SKIPLOOM"), [SPECIES_JUMPLUFF] = _("JUMPLUFF"), [SPECIES_AIPOM] = _("AIPOM"), [SPECIES_SUNKERN] = _("SUNKERN"), [SPECIES_SUNFLORA] = _("SUNFLORA"), [SPECIES_YANMA] = _("YANMA"), [SPECIES_WOOPER] = _("WOOPER"), [SPECIES_QUAGSIRE] = _("QUAGSIRE"), [SPECIES_ESPEON] = _("ESPEON"), [SPECIES_UMBREON] = _("UMBREON"), [SPECIES_MURKROW] = _("MURKROW"), [SPECIES_SLOWKING] = _("SLOWKING"), [SPECIES_MISDREAVUS] = _("MISDREAVUS"), [SPECIES_UNOWN] = _("UNOWN"), [SPECIES_WOBBUFFET] = _("WOBBUFFET"), [SPECIES_GIRAFARIG] = _("GIRAFARIG"), [SPECIES_PINECO] = _("PINECO"), [SPECIES_FORRETRESS] = _("FORRETRESS"), [SPECIES_DUNSPARCE] = _("DUNSPARCE"), [SPECIES_GLIGAR] = _("GLIGAR"), [SPECIES_STEELIX] = _("STEELIX"), [SPECIES_SNUBBULL] = _("SNUBBULL"), [SPECIES_GRANBULL] = _("GRANBULL"), [SPECIES_QWILFISH] = _("QWILFISH"), [SPECIES_SCIZOR] = _("SCIZOR"), [SPECIES_SHUCKLE] = _("SHUCKLE"), [SPECIES_HERACROSS] = _("HERACROSS"), [SPECIES_SNEASEL] = _("SNEASEL"), [SPECIES_TEDDIURSA] = _("TEDDIURSA"), [SPECIES_URSARING] = _("URSARING"), [SPECIES_SLUGMA] = _("SLUGMA"), [SPECIES_MAGCARGO] = _("MAGCARGO"), [SPECIES_SWINUB] = _("SWINUB"), [SPECIES_PILOSWINE] = _("PILOSWINE"), [SPECIES_CORSOLA] = _("CORSOLA"), [SPECIES_REMORAID] = _("REMORAID"), [SPECIES_OCTILLERY] = _("OCTILLERY"), [SPECIES_DELIBIRD] = _("DELIBIRD"), [SPECIES_MANTINE] = _("MANTINE"), [SPECIES_SKARMORY] = _("SKARMORY"), [SPECIES_HOUNDOUR] = _("HOUNDOUR"), [SPECIES_HOUNDOOM] = _("HOUNDOOM"), [SPECIES_KINGDRA] = _("KINGDRA"), [SPECIES_PHANPY] = _("PHANPY"), [SPECIES_DONPHAN] = _("DONPHAN"), [SPECIES_PORYGON2] = _("PORYGON2"), [SPECIES_STANTLER] = _("STANTLER"), [SPECIES_SMEARGLE] = _("SMEARGLE"), [SPECIES_TYROGUE] = _("TYROGUE"), [SPECIES_HITMONTOP] = _("HITMONTOP"), [SPECIES_SMOOCHUM] = _("SMOOCHUM"), [SPECIES_ELEKID] = _("ELEKID"), [SPECIES_MAGBY] = _("MAGBY"), [SPECIES_MILTANK] = _("MILTANK"), [SPECIES_BLISSEY] = _("BLISSEY"), [SPECIES_RAIKOU] = _("RAIKOU"), [SPECIES_ENTEI] = _("ENTEI"), [SPECIES_SUICUNE] = _("SUICUNE"), [SPECIES_LARVITAR] = _("LARVITAR"), [SPECIES_PUPITAR] = _("PUPITAR"), [SPECIES_TYRANITAR] = _("TYRANITAR"), [SPECIES_LUGIA] = _("LUGIA"), [SPECIES_HO_OH] = _("HO-OH"), [SPECIES_CELEBI] = _("CELEBI"), [SPECIES_OLD_UNOWN_B] = _("?"), [SPECIES_OLD_UNOWN_C] = _("?"), [SPECIES_OLD_UNOWN_D] = _("?"), [SPECIES_OLD_UNOWN_E] = _("?"), [SPECIES_OLD_UNOWN_F] = _("?"), [SPECIES_OLD_UNOWN_G] = _("?"), [SPECIES_OLD_UNOWN_H] = _("?"), [SPECIES_OLD_UNOWN_I] = _("?"), [SPECIES_OLD_UNOWN_J] = _("?"), [SPECIES_OLD_UNOWN_K] = _("?"), [SPECIES_OLD_UNOWN_L] = _("?"), [SPECIES_OLD_UNOWN_M] = _("?"), [SPECIES_OLD_UNOWN_N] = _("?"), [SPECIES_OLD_UNOWN_O] = _("?"), [SPECIES_OLD_UNOWN_P] = _("?"), [SPECIES_OLD_UNOWN_Q] = _("?"), [SPECIES_OLD_UNOWN_R] = _("?"), [SPECIES_OLD_UNOWN_S] = _("?"), [SPECIES_OLD_UNOWN_T] = _("?"), [SPECIES_OLD_UNOWN_U] = _("?"), [SPECIES_OLD_UNOWN_V] = _("?"), [SPECIES_OLD_UNOWN_W] = _("?"), [SPECIES_OLD_UNOWN_X] = _("?"), [SPECIES_OLD_UNOWN_Y] = _("?"), [SPECIES_OLD_UNOWN_Z] = _("?"), [SPECIES_TREECKO] = _("TREECKO"), [SPECIES_GROVYLE] = _("GROVYLE"), [SPECIES_SCEPTILE] = _("SCEPTILE"), [SPECIES_TORCHIC] = _("TORCHIC"), [SPECIES_COMBUSKEN] = _("COMBUSKEN"), [SPECIES_BLAZIKEN] = _("BLAZIKEN"), [SPECIES_MUDKIP] = _("MUDKIP"), [SPECIES_MARSHTOMP] = _("MARSHTOMP"), [SPECIES_SWAMPERT] = _("SWAMPERT"), [SPECIES_POOCHYENA] = _("POOCHYENA"), [SPECIES_MIGHTYENA] = _("MIGHTYENA"), [SPECIES_ZIGZAGOON] = _("ZIGZAGOON"), [SPECIES_LINOONE] = _("LINOONE"), [SPECIES_WURMPLE] = _("WURMPLE"), [SPECIES_SILCOON] = _("SILCOON"), [SPECIES_BEAUTIFLY] = _("BEAUTIFLY"), [SPECIES_CASCOON] = _("CASCOON"), [SPECIES_DUSTOX] = _("DUSTOX"), [SPECIES_LOTAD] = _("LOTAD"), [SPECIES_LOMBRE] = _("LOMBRE"), [SPECIES_LUDICOLO] = _("LUDICOLO"), [SPECIES_SEEDOT] = _("SEEDOT"), [SPECIES_NUZLEAF] = _("NUZLEAF"), [SPECIES_SHIFTRY] = _("SHIFTRY"), [SPECIES_NINCADA] = _("NINCADA"), [SPECIES_NINJASK] = _("NINJASK"), [SPECIES_SHEDINJA] = _("SHEDINJA"), [SPECIES_TAILLOW] = _("TAILLOW"), [SPECIES_SWELLOW] = _("SWELLOW"), [SPECIES_SHROOMISH] = _("SHROOMISH"), [SPECIES_BRELOOM] = _("BRELOOM"), [SPECIES_SPINDA] = _("SPINDA"), [SPECIES_WINGULL] = _("WINGULL"), [SPECIES_PELIPPER] = _("PELIPPER"), [SPECIES_SURSKIT] = _("SURSKIT"), [SPECIES_MASQUERAIN] = _("MASQUERAIN"), [SPECIES_WAILMER] = _("WAILMER"), [SPECIES_WAILORD] = _("WAILORD"), [SPECIES_SKITTY] = _("SKITTY"), [SPECIES_DELCATTY] = _("DELCATTY"), [SPECIES_KECLEON] = _("KECLEON"), [SPECIES_BALTOY] = _("BALTOY"), [SPECIES_CLAYDOL] = _("CLAYDOL"), [SPECIES_NOSEPASS] = _("NOSEPASS"), [SPECIES_TORKOAL] = _("TORKOAL"), [SPECIES_SABLEYE] = _("SABLEYE"), [SPECIES_BARBOACH] = _("BARBOACH"), [SPECIES_WHISCASH] = _("WHISCASH"), [SPECIES_LUVDISC] = _("LUVDISC"), [SPECIES_CORPHISH] = _("CORPHISH"), [SPECIES_CRAWDAUNT] = _("CRAWDAUNT"), [SPECIES_FEEBAS] = _("FEEBAS"), [SPECIES_MILOTIC] = _("MILOTIC"), [SPECIES_CARVANHA] = _("CARVANHA"), [SPECIES_SHARPEDO] = _("SHARPEDO"), [SPECIES_TRAPINCH] = _("TRAPINCH"), [SPECIES_VIBRAVA] = _("VIBRAVA"), [SPECIES_FLYGON] = _("FLYGON"), [SPECIES_MAKUHITA] = _("MAKUHITA"), [SPECIES_HARIYAMA] = _("HARIYAMA"), [SPECIES_ELECTRIKE] = _("ELECTRIKE"), [SPECIES_MANECTRIC] = _("MANECTRIC"), [SPECIES_NUMEL] = _("NUMEL"), [SPECIES_CAMERUPT] = _("CAMERUPT"), [SPECIES_SPHEAL] = _("SPHEAL"), [SPECIES_SEALEO] = _("SEALEO"), [SPECIES_WALREIN] = _("WALREIN"), [SPECIES_CACNEA] = _("CACNEA"), [SPECIES_CACTURNE] = _("CACTURNE"), [SPECIES_SNORUNT] = _("SNORUNT"), [SPECIES_GLALIE] = _("GLALIE"), [SPECIES_LUNATONE] = _("LUNATONE"), [SPECIES_SOLROCK] = _("SOLROCK"), [SPECIES_AZURILL] = _("AZURILL"), [SPECIES_SPOINK] = _("SPOINK"), [SPECIES_GRUMPIG] = _("GRUMPIG"), [SPECIES_PLUSLE] = _("PLUSLE"), [SPECIES_MINUN] = _("MINUN"), [SPECIES_MAWILE] = _("MAWILE"), [SPECIES_MEDITITE] = _("MEDITITE"), [SPECIES_MEDICHAM] = _("MEDICHAM"), [SPECIES_SWABLU] = _("SWABLU"), [SPECIES_ALTARIA] = _("ALTARIA"), [SPECIES_WYNAUT] = _("WYNAUT"), [SPECIES_DUSKULL] = _("DUSKULL"), [SPECIES_DUSCLOPS] = _("DUSCLOPS"), [SPECIES_ROSELIA] = _("ROSELIA"), [SPECIES_SLAKOTH] = _("SLAKOTH"), [SPECIES_VIGOROTH] = _("VIGOROTH"), [SPECIES_SLAKING] = _("SLAKING"), [SPECIES_GULPIN] = _("GULPIN"), [SPECIES_SWALOT] = _("SWALOT"), [SPECIES_TROPIUS] = _("TROPIUS"), [SPECIES_WHISMUR] = _("WHISMUR"), [SPECIES_LOUDRED] = _("LOUDRED"), [SPECIES_EXPLOUD] = _("EXPLOUD"), [SPECIES_CLAMPERL] = _("CLAMPERL"), [SPECIES_HUNTAIL] = _("HUNTAIL"), [SPECIES_GOREBYSS] = _("GOREBYSS"), [SPECIES_ABSOL] = _("ABSOL"), [SPECIES_SHUPPET] = _("SHUPPET"), [SPECIES_BANETTE] = _("BANETTE"), [SPECIES_SEVIPER] = _("SEVIPER"), [SPECIES_ZANGOOSE] = _("ZANGOOSE"), [SPECIES_RELICANTH] = _("RELICANTH"), [SPECIES_ARON] = _("ARON"), [SPECIES_LAIRON] = _("LAIRON"), [SPECIES_AGGRON] = _("AGGRON"), [SPECIES_CASTFORM] = _("CASTFORM"), [SPECIES_VOLBEAT] = _("VOLBEAT"), [SPECIES_ILLUMISE] = _("ILLUMISE"), [SPECIES_LILEEP] = _("LILEEP"), [SPECIES_CRADILY] = _("CRADILY"), [SPECIES_ANORITH] = _("ANORITH"), [SPECIES_ARMALDO] = _("ARMALDO"), [SPECIES_RALTS] = _("RALTS"), [SPECIES_KIRLIA] = _("KIRLIA"), [SPECIES_GARDEVOIR] = _("GARDEVOIR"), [SPECIES_BAGON] = _("BAGON"), [SPECIES_SHELGON] = _("SHELGON"), [SPECIES_SALAMENCE] = _("SALAMENCE"), [SPECIES_BELDUM] = _("BELDUM"), [SPECIES_METANG] = _("METANG"), [SPECIES_METAGROSS] = _("METAGROSS"), [SPECIES_REGIROCK] = _("REGIROCK"), [SPECIES_REGICE] = _("REGICE"), [SPECIES_REGISTEEL] = _("REGISTEEL"), [SPECIES_KYOGRE] = _("KYOGRE"), [SPECIES_GROUDON] = _("GROUDON"), [SPECIES_RAYQUAZA] = _("RAYQUAZA"), [SPECIES_LATIAS] = _("LATIAS"), [SPECIES_LATIOS] = _("LATIOS"), [SPECIES_JIRACHI] = _("JIRACHI"), [SPECIES_DEOXYS] = _("DEOXYS"), [SPECIES_CHIMECHO] = _("CHIMECHO"), }; ================================================ FILE: src/data/text/teachy_tv.h ================================================ const u8 gTeachyTvString_TeachBattle[] = _("Teach me how to battle."); const u8 gTeachyTvString_StatusProblems[] = _("What are status problems?"); const u8 gTeachyTvString_TypeMatchups[] = _("What are type matchups?"); const u8 gTeachyTvString_CatchPkmn[] = _("I want to catch POKéMON."); const u8 gTeachyTvString_AboutTMs[] = _("Teach me about TMs."); const u8 gTeachyTvString_RegisterItem[] = _("How do I register an item?"); const u8 gTeachyTvString_Cancel[] = _("CANCEL"); const u8 gTeachyTvText_PokedudeSaysHello[] = _( "Hey, all you TRAINERS out there!\n" "HELLO, TRAINERS!\p" "……… ……… ………\p" "Come on, let me hear you!\n" "HELLO, TRAINERS!\l" "It's me, the POKé DUDE!\p"); const u8 gTeachyTvText_BattleScript1[] = _( "Today, the POKé DUDE's here to\n" "tell you about how you can battle\l" "POKéMON!\p" "Say you're out for a stroll when,\n" "suddenly, a wild POKéMON appears!\p" "It's up to you to smartly use your\n" "POKéMON and their moves to reduce\l" "the opponent's HP to nothing, and\l" "claim victory!\p" "I'll show you how to do that in\n" "person and for sure!\p" "All righty, here goes!\p" "Keep your eyes glued to the super\n" "POKé DUDE SHOW!"); const u8 gTeachyTvText_BattleScript2[] = _( "Well, did you get that?\p" "Even if your own POKéMON's HP\n" "falls to zero, and it becomes\l" "unable to battle, not to worry!\p" "Just take it to any POKéMON\n" "CENTER and heal it!\p" "All righty, be seeing you!\p" "Remember, TRAINERS, a good deed\n" "a day brings happiness to stay!"); const u8 gTeachyTvText_StatusScript1[] = _( "Today, the POKé DUDE's here to\n" "tell you about status problems!\p" "Status problems include poisoning,\n" "paralysis, sleep, burn…\p" "There are a couple others, but\n" "they really are trouble.\p" "Get any one, and your POKéMON\n" "may become useless in battle.\p" "You know, it hurts the POKé DUDE\n" "to see a POKéMON suffer…\p" "So, what should you do if your\n" "POKéMON gets a status problem?\p" "Well, you've got me to show you!\p" "All righty, here goes!\p" "Keep your eyes glued to the super\n" "POKé DUDE SHOW!"); const u8 gTeachyTvText_StatusScript2[] = _( "Poisoning or paralysis don't go\n" "away after a battle.\p" "If a POKéMON is poisoned, it loses\n" "HP even while you're walking.\p" "You should heal POKéMON of these\n" "kinds of problems right away.\p" "Use an item, or try to get to a\n" "POKéMON CENTER for healing.\p" "That wasn't hard, was it?\n" "All righty, be seeing you!\p" "Remember, TRAINERS, a good deed\n" "a day brings happiness to stay!"); const u8 gTeachyTvText_MatchupsScript1[] = _( "Does everyone know about type\n" "matchups?\p" "POKéMON and their moves all\n" "belong to certain types.\p" "For example, there are such types\n" "as GRASS and WATER.\p" "You need to consider the type of\n" "the move used to attack…\p" "And, the type of the POKéMON that\n" "is hit by that attack.\p" "Depending on how those two types\n" "match up, the damage can change.\p" "You see, it depends on whether\n" "the type matchup is good or bad.\p" "If you don't know how matchups\n" "work, battles will be tough.\p" "So, let me demonstrate exactly\n" "what I mean.\p" "All righty, here goes!\p" "Keep your eyes glued to the super\n" "POKé DUDE SHOW!"); const u8 gTeachyTvText_MatchupsScript2[] = _( "Is it possible to launch an attack\n" "that will inflict heavy damage?\p" "Does the opposing POKéMON pose\n" "a threat to your POKéMON?\p" "Is there any chance that it may\n" "have disastrously tough moves?\p" "Watch the type matchups to gain\n" "the upper hand!\p" "All righty, be seeing you!\p" "Oh, for the COOL-type POKé DUDE,\n" "AWESOME-type kids like you match\l" "up perfectly!\p" "Remember, a good deed a day\n" "brings happiness to stay!"); const u8 gTeachyTvText_CatchingScript1[] = _( "Today, the POKé DUDE's going to\n" "show you how to catch POKéMON!\p" "Just imagine… A groovy POKéMON\n" "suddenly appearing in the wild!\p" "Oh, you want it!\n" "You just can't help it!\p" "Oh, you have to catch it!\n" "You gotta have it!\p" "Let me show you how you can make\n" "it happen!\p" "All righty, here goes!\p" "Keep your eyes glued to the super\n" "POKé DUDE SHOW!"); const u8 gTeachyTvText_CatchingScript2[] = _( "If your first POKé BALL fails to\n" "catch the POKéMON, don't give up!\p" "Keep throwing POKé BALLS…\n" "It's bound to work sometime!\p" "All righty, be seeing you!\p" "Remember, TRAINERS, a good deed\n" "a day brings happiness to stay!"); const u8 gTeachyTvText_TMsScript1[] = _( "Hey, everyone!\n" "Do you all have TMs?\p" "A TM, Technical Machine, is an\n" "amazingly great item!\p" "It teaches POKéMON a move that\n" "it may not learn when leveling up!\p" "Isn't that just great? What a\n" "convenient world we live in!\p" "Open the TM CASE and check out\n" "the TMs you have.\p" "You can check them out in detail,\n" "too."); const u8 gPokedudeText_TMTypes[] = _( "POKé DUDE: NORMAL, WATER, GRASS…\n" "TMs also come in types.\p" "Check the type and teach it to\n" "a POKéMON that matches up well.\p" "For example, WATER PULSE is\n" "suitable for WATER-type POKéMON.\p" "BULLET SEED is a move that most\n" "GRASS-type POKéMON can learn.\p" "There's one other thing!"); const u8 gPokedudeText_ReadTMDescription[] = _( "Don't just look at the type, read\n" "the description, too.\p" "It will contain hints about what\n" "POKéMON might learn the move.\p" "For example, take a move like\n" "FOCUS PUNCH.\p" "It doesn't sound like anything a\n" "bird or fish POKéMON can learn.\p" "So, try using it on POKéMON with\n" "arms that can throw punches!"); const u8 gTeachyTvText_TMsScript2[] = _( "Wow, I talked a lot today!\n" "All righty, be seeing you!\p" "Remember, TRAINERS, a good deed\n" "a day brings happiness to stay!"); const u8 gTeachyTvText_RegisterScript1[] = _( "A TRAINER's BAG has a bunch of\n" "nifty, convenient features!\p" "Take stuff in the KEY ITEMS\n" "POCKET, for instance.\p" "You can use a key item without\n" "opening the BAG every time.\p" "For example, let's pretend I have\n" "a TEACHY TV in my BAG.\p" "I can register it for instant use,\n" "and I'll show you how!\p" "All righty, here goes!\p" "Keep your eyes glued to the sorta\n" "super POKé DUDE SHOW!"); const u8 gTeachyTvText_RegisterScript2[] = _( "And now, your TEACHY TV is\n" "registered.\p" "How do you use it?\n" "Well, here's how it works.\p" "Once an item in the KEY ITEMS\n" "POCKET is registered, you can use\l" "it by pressing SELECT.\p" "So, you've given yourself\n" "one-touch access to TEACHY TV.\p" "All it takes for you to see me is\n" "pressing one button!\p" "That kind of attention is a little\n" "embarrassing!\p" "All righty, be seeing you!\p" "Remember, TRAINERS, a good deed\n" "a day brings happiness to stay!"); ================================================ FILE: src/data/text/trainer_class_names.h ================================================ const u8 gTrainerClassNames[][13] = { [TRAINER_CLASS_NONE] = _("{PKMN} TRAINER"), [TRAINER_CLASS_PKMN_TRAINER_UNUSED] = _("{PKMN} TRAINER"), [TRAINER_CLASS_AQUA_LEADER] = _("AQUA LEADER"), [TRAINER_CLASS_TEAM_AQUA] = _("TEAM AQUA"), [TRAINER_CLASS_RS_AROMA_LADY] = _("AROMA LADY"), [TRAINER_CLASS_RS_RUIN_MANIAC] = _("RUIN MANIAC"), [TRAINER_CLASS_INTERVIEWER] = _("INTERVIEWER"), [TRAINER_CLASS_RS_TUBER_F] = _("TUBER"), [TRAINER_CLASS_RS_TUBER_M] = _("TUBER"), [TRAINER_CLASS_RS_COOLTRAINER] = _("COOLTRAINER"), [TRAINER_CLASS_HEX_MANIAC] = _("HEX MANIAC"), [TRAINER_CLASS_RS_LADY] = _("LADY"), [TRAINER_CLASS_RS_BEAUTY] = _("BEAUTY"), [TRAINER_CLASS_RICH_BOY] = _("RICH BOY"), [TRAINER_CLASS_RS_POKEMANIAC] = _("POKéMANIAC"), [TRAINER_CLASS_RS_SWIMMER_M] = _("SWIMMER♂"), [TRAINER_CLASS_RS_BLACK_BELT] = _("BLACK BELT"), [TRAINER_CLASS_GUITARIST] = _("GUITARIST"), [TRAINER_CLASS_KINDLER] = _("KINDLER"), [TRAINER_CLASS_RS_CAMPER] = _("CAMPER"), [TRAINER_CLASS_BUG_MANIAC] = _("BUG MANIAC"), [TRAINER_CLASS_RS_PSYCHIC] = _("PSYCHIC"), [TRAINER_CLASS_RS_GENTLEMAN] = _("GENTLEMAN"), [TRAINER_CLASS_RS_ELITE_FOUR] = _("ELITE FOUR"), [TRAINER_CLASS_RS_LEADER] = _("LEADER"), [TRAINER_CLASS_SCHOOL_KID] = _("SCHOOL KID"), [TRAINER_CLASS_SR_AND_JR] = _("SR. AND JR."), [TRAINER_CLASS_POKEFAN] = _("POKéFAN"), [TRAINER_CLASS_EXPERT] = _("EXPERT"), [TRAINER_CLASS_RS_YOUNGSTER] = _("YOUNGSTER"), [TRAINER_CLASS_RS_CHAMPION] = _("CHAMPION"), [TRAINER_CLASS_RS_FISHERMAN] = _("FISHERMAN"), [TRAINER_CLASS_TRIATHLETE] = _("TRIATHLETE"), [TRAINER_CLASS_DRAGON_TAMER] = _("DRAGON TAMER"), [TRAINER_CLASS_RS_BIRD_KEEPER] = _("BIRD KEEPER"), [TRAINER_CLASS_NINJA_BOY] = _("NINJA BOY"), [TRAINER_CLASS_BATTLE_GIRL] = _("BATTLE GIRL"), [TRAINER_CLASS_PARASOL_LADY] = _("PARASOL LADY"), [TRAINER_CLASS_RS_SWIMMER_F] = _("SWIMMER♀"), [TRAINER_CLASS_RS_PICNICKER] = _("PICNICKER"), [TRAINER_CLASS_RS_TWINS] = _("TWINS"), [TRAINER_CLASS_RS_SAILOR] = _("SAILOR"), [TRAINER_CLASS_BOARDER] = _("BOARDER"), [TRAINER_CLASS_COLLECTOR] = _("COLLECTOR"), [TRAINER_CLASS_PKMN_TRAINER] = _("{PKMN} TRAINER"), [TRAINER_CLASS_RS_PKMN_BREEDER] = _("{PKMN} BREEDER"), [TRAINER_CLASS_RS_PKMN_RANGER] = _("{PKMN} RANGER"), [TRAINER_CLASS_MAGMA_LEADER] = _("MAGMA LEADER"), [TRAINER_CLASS_TEAM_MAGMA] = _("TEAM MAGMA"), [TRAINER_CLASS_RS_LASS] = _("LASS"), [TRAINER_CLASS_RS_BUG_CATCHER] = _("BUG CATCHER"), [TRAINER_CLASS_RS_HIKER] = _("HIKER"), [TRAINER_CLASS_RS_YOUNG_COUPLE] = _("YOUNG COUPLE"), [TRAINER_CLASS_OLD_COUPLE] = _("OLD COUPLE"), [TRAINER_CLASS_RS_SIS_AND_BRO] = _("SIS AND BRO"), [TRAINER_CLASS_AQUA_ADMIN] = _("AQUA ADMIN"), [TRAINER_CLASS_MAGMA_ADMIN] = _("MAGMA ADMIN"), [TRAINER_CLASS_YOUNGSTER] = _("YOUNGSTER"), [TRAINER_CLASS_BUG_CATCHER] = _("BUG CATCHER"), [TRAINER_CLASS_LASS] = _("LASS"), [TRAINER_CLASS_SAILOR] = _("SAILOR"), [TRAINER_CLASS_CAMPER] = _("CAMPER"), [TRAINER_CLASS_PICNICKER] = _("PICNICKER"), [TRAINER_CLASS_POKEMANIAC] = _("POKéMANIAC"), [TRAINER_CLASS_SUPER_NERD] = _("SUPER NERD"), [TRAINER_CLASS_HIKER] = _("HIKER"), [TRAINER_CLASS_BIKER] = _("BIKER"), [TRAINER_CLASS_BURGLAR] = _("BURGLAR"), [TRAINER_CLASS_ENGINEER] = _("ENGINEER"), [TRAINER_CLASS_FISHERMAN] = _("FISHERMAN"), [TRAINER_CLASS_SWIMMER_M] = _("SWIMMER♂"), [TRAINER_CLASS_CUE_BALL] = _("CUE BALL"), [TRAINER_CLASS_GAMER] = _("GAMER"), [TRAINER_CLASS_BEAUTY] = _("BEAUTY"), [TRAINER_CLASS_SWIMMER_F] = _("SWIMMER♀"), [TRAINER_CLASS_PSYCHIC] = _("PSYCHIC"), [TRAINER_CLASS_ROCKER] = _("ROCKER"), [TRAINER_CLASS_JUGGLER] = _("JUGGLER"), [TRAINER_CLASS_TAMER] = _("TAMER"), [TRAINER_CLASS_BIRD_KEEPER] = _("BIRD KEEPER"), [TRAINER_CLASS_BLACK_BELT] = _("BLACK BELT"), [TRAINER_CLASS_RIVAL_EARLY] = _("RIVAL"), [TRAINER_CLASS_SCIENTIST] = _("SCIENTIST"), [TRAINER_CLASS_BOSS] = _("BOSS"), [TRAINER_CLASS_LEADER] = _("LEADER"), [TRAINER_CLASS_TEAM_ROCKET] = _("TEAM ROCKET"), [TRAINER_CLASS_COOLTRAINER] = _("COOLTRAINER"), [TRAINER_CLASS_ELITE_FOUR] = _("ELITE FOUR"), [TRAINER_CLASS_GENTLEMAN] = _("GENTLEMAN"), [TRAINER_CLASS_RIVAL_LATE] = _("RIVAL"), [TRAINER_CLASS_CHAMPION] = _("CHAMPION"), [TRAINER_CLASS_CHANNELER] = _("CHANNELER"), [TRAINER_CLASS_TWINS] = _("TWINS"), [TRAINER_CLASS_COOL_COUPLE] = _("COOL COUPLE"), [TRAINER_CLASS_YOUNG_COUPLE] = _("YOUNG COUPLE"), [TRAINER_CLASS_CRUSH_KIN] = _("CRUSH KIN"), [TRAINER_CLASS_SIS_AND_BRO] = _("SIS AND BRO"), [TRAINER_CLASS_PKMN_PROF] = _("{PKMN} PROF."), [TRAINER_CLASS_PLAYER] = _("PLAYER"), [TRAINER_CLASS_CRUSH_GIRL] = _("CRUSH GIRL"), [TRAINER_CLASS_TUBER] = _("TUBER"), [TRAINER_CLASS_PKMN_BREEDER] = _("{PKMN} BREEDER"), [TRAINER_CLASS_PKMN_RANGER] = _("{PKMN} RANGER"), [TRAINER_CLASS_AROMA_LADY] = _("AROMA LADY"), [TRAINER_CLASS_RUIN_MANIAC] = _("RUIN MANIAC"), [TRAINER_CLASS_LADY] = _("LADY"), [TRAINER_CLASS_PAINTER] = _("PAINTER"), }; ================================================ FILE: src/data/tilesets/graphics.h ================================================ const u32 gTilesetTiles_PalletTown[] = INCBIN_U32("data/tilesets/secondary/pallet_town/tiles.4bpp.lz"); const u16 gTilesetPalettes_PalletTown[][16] = { INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/pallet_town/palettes/15.gbapal"), }; const u32 gTilesetTiles_ViridianCity[] = INCBIN_U32("data/tilesets/secondary/viridian_city/tiles.4bpp.lz"); const u16 gTilesetPalettes_ViridianCity[][16] = { INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_city/palettes/15.gbapal"), }; const u32 gTilesetTiles_PewterCity[] = INCBIN_U32("data/tilesets/secondary/pewter_city/tiles.4bpp.lz"); const u16 gTilesetPalettes_PewterCity[][16] = { INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_city/palettes/15.gbapal"), }; const u32 gTilesetTiles_CeruleanCity[] = INCBIN_U32("data/tilesets/secondary/cerulean_city/tiles.4bpp.lz"); const u16 gTilesetPalettes_CeruleanCity[][16] = { INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_city/palettes/15.gbapal"), }; const u32 gTilesetTiles_LavenderTown[] = INCBIN_U32("data/tilesets/secondary/lavender_town/tiles.4bpp.lz"); const u16 gTilesetPalettes_LavenderTown[][16] = { INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/lavender_town/palettes/15.gbapal"), }; const u32 gTilesetTiles_VermilionCity[] = INCBIN_U32("data/tilesets/secondary/vermilion_city/tiles.4bpp.lz"); const u16 gTilesetPalettes_VermilionCity[][16] = { INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_city/palettes/15.gbapal"), }; const u32 gTilesetTiles_CeladonCity[] = INCBIN_U32("data/tilesets/secondary/celadon_city/tiles.4bpp.lz"); const u16 gTilesetPalettes_CeladonCity[][16] = { INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_city/palettes/15.gbapal"), }; const u32 gTilesetTiles_FuchsiaCity[] = INCBIN_U32("data/tilesets/secondary/fuchsia_city/tiles.4bpp.lz"); const u16 gTilesetPalettes_FuchsiaCity[][16] = { INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_city/palettes/15.gbapal"), }; const u32 gTilesetTiles_CinnabarIsland[] = INCBIN_U32("data/tilesets/secondary/cinnabar_island/tiles.4bpp.lz"); const u16 gTilesetPalettes_CinnabarIsland[][16] = { INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_island/palettes/15.gbapal"), }; const u32 gTilesetTiles_IndigoPlateau[] = INCBIN_U32("data/tilesets/secondary/indigo_plateau/tiles.4bpp.lz"); const u16 gTilesetPalettes_IndigoPlateau[][16] = { INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/indigo_plateau/palettes/15.gbapal"), }; const u32 gTilesetTiles_SaffronCity[] = INCBIN_U32("data/tilesets/secondary/saffron_city/tiles.4bpp.lz"); const u16 gTilesetPalettes_SaffronCity[][16] = { INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_city/palettes/15.gbapal"), }; const u32 gTilesetTiles_Building[] = INCBIN_U32("data/tilesets/primary/building/tiles.4bpp.lz"); const u16 gTilesetPalettes_Building[][16] = { INCBIN_U16("data/tilesets/primary/building/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/01.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/02.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/03.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/04.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/05.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/06.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/07.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/08.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/09.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/10.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/11.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/12.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/13.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/14.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/15.gbapal"), }; const u32 gTilesetTiles_Mart[] = INCBIN_U32("data/tilesets/secondary/mart/tiles.4bpp.lz"); const u16 gTilesetPalettes_Mart[][16] = { INCBIN_U16("data/tilesets/secondary/mart/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/mart/palettes/15.gbapal"), }; const u32 gTilesetTiles_PokemonCenter[] = INCBIN_U32("data/tilesets/secondary/pokemon_center/tiles.4bpp.lz"); const u16 gTilesetPalettes_PokemonCenter[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/15.gbapal"), }; const u32 gTilesetTiles_Cave[] = INCBIN_U32("data/tilesets/secondary/cave/tiles.4bpp.lz"); const u16 gTilesetPalettes_Cave[][16] = { INCBIN_U16("data/tilesets/secondary/cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/15.gbapal"), }; const u32 gTilesetTiles_Dummy1[] = INCBIN_U32("data/tilesets/secondary/dummy_1/tiles.4bpp.lz"); const u16 gTilesetPalettes_Dummy1[][16] = { INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_1/palettes/15.gbapal"), }; const u32 gTilesetTiles_Museum[] = INCBIN_U32("data/tilesets/secondary/museum/tiles.4bpp.lz"); const u16 gTilesetPalettes_Museum[][16] = { INCBIN_U16("data/tilesets/secondary/museum/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/museum/palettes/15.gbapal"), }; const u32 gTilesetTiles_CableClub[] = INCBIN_U32("data/tilesets/secondary/cable_club/tiles.4bpp"); const u16 gTilesetPalettes_CableClub[][16] = { INCBIN_U16("data/tilesets/secondary/cable_club/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/15.gbapal"), }; const u32 gTilesetTiles_BikeShop[] = INCBIN_U32("data/tilesets/secondary/bike_shop/tiles.4bpp.lz"); const u16 gTilesetPalettes_BikeShop[][16] = { INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/15.gbapal"), }; const u32 gTilesetTiles_Lab[] = INCBIN_U32("data/tilesets/secondary/lab/tiles.4bpp.lz"); const u16 gTilesetPalettes_Lab[][16] = { INCBIN_U16("data/tilesets/secondary/lab/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/15.gbapal"), }; const u32 gTilesetTiles_HoennBuilding[] = INCBIN_U32("data/tilesets/secondary/hoenn_building/tiles.4bpp.lz"); const u16 gTilesetPalettes_HoennBuilding[][16] = { INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/hoenn_building/palettes/15.gbapal"), }; const u32 gTilesetTiles_GameCorner[] = INCBIN_U32("data/tilesets/secondary/game_corner/tiles.4bpp.lz"); const u16 gTilesetPalettes_GameCorner[][16] = { INCBIN_U16("data/tilesets/secondary/game_corner/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/game_corner/palettes/15.gbapal"), }; const u32 gTilesetTiles_PewterGym[] = INCBIN_U32("data/tilesets/secondary/pewter_gym/tiles.4bpp.lz"); const u16 gTilesetPalettes_PewterGym[][16] = { INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/pewter_gym/palettes/15.gbapal"), }; const u32 gTilesetTiles_CeruleanGym[] = INCBIN_U32("data/tilesets/secondary/cerulean_gym/tiles.4bpp.lz"); const u16 gTilesetPalettes_CeruleanGym[][16] = { INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_gym/palettes/15.gbapal"), }; const u32 gTilesetTiles_VermilionGym[] = INCBIN_U32("data/tilesets/secondary/vermilion_gym/tiles.4bpp.lz"); const u16 gTilesetPalettes_VermilionGym[][16] = { INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/vermilion_gym/palettes/15.gbapal"), }; const u32 gTilesetTiles_CeladonGym[] = INCBIN_U32("data/tilesets/secondary/celadon_gym/tiles.4bpp.lz"); const u16 gTilesetPalettes_CeladonGym[][16] = { INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/celadon_gym/palettes/15.gbapal"), }; const u32 gTilesetTiles_FuchsiaGym[] = INCBIN_U32("data/tilesets/secondary/fuchsia_gym/tiles.4bpp.lz"); const u16 gTilesetPalettes_FuchsiaGym[][16] = { INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/fuchsia_gym/palettes/15.gbapal"), }; const u32 gTilesetTiles_SaffronGym[] = INCBIN_U32("data/tilesets/secondary/saffron_gym/tiles.4bpp.lz"); const u16 gTilesetPalettes_SaffronGym[][16] = { INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/saffron_gym/palettes/15.gbapal"), }; const u32 gTilesetTiles_CinnabarGym[] = INCBIN_U32("data/tilesets/secondary/cinnabar_gym/tiles.4bpp.lz"); const u16 gTilesetPalettes_CinnabarGym[][16] = { INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/cinnabar_gym/palettes/15.gbapal"), }; const u32 gTilesetTiles_ViridianGym[] = INCBIN_U32("data/tilesets/secondary/viridian_gym/tiles.4bpp.lz"); const u16 gTilesetPalettes_ViridianGym[][16] = { INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_gym/palettes/15.gbapal"), }; const u32 gTilesetTiles_SSAnne[] = INCBIN_U32("data/tilesets/secondary/ss_anne/tiles.4bpp.lz"); const u16 gTilesetPalettes_SSAnne[][16] = { INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/ss_anne/palettes/15.gbapal"), }; const u32 gTilesetTiles_Dummy2[] = INCBIN_U32("data/tilesets/secondary/dummy_2/tiles.4bpp.lz"); const u16 gTilesetPalettes_Dummy2[][16] = { INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_2/palettes/15.gbapal"), }; const u32 gTilesetTiles_ViridianForest[] = INCBIN_U32("data/tilesets/secondary/viridian_forest/tiles.4bpp.lz"); const u16 gTilesetPalettes_ViridianForest[][16] = { INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/viridian_forest/palettes/15.gbapal"), }; const u32 gTilesetTiles_UnusedGatehouse1[] = INCBIN_U32("data/tilesets/secondary/unused_gatehouse_1/tiles.4bpp.lz"); const u16 gTilesetPalettes_UnusedGatehouse1[][16] = { INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/palettes/15.gbapal"), }; const u32 gTilesetTiles_RockTunnel[] = INCBIN_U32("data/tilesets/secondary/rock_tunnel/tiles.4bpp.lz"); const u16 gTilesetPalettes_RockTunnel[][16] = { INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/rock_tunnel/palettes/15.gbapal"), }; const u32 gTilesetTiles_DiglettsCave[] = INCBIN_U32("data/tilesets/secondary/digletts_cave/tiles.4bpp.lz"); const u16 gTilesetPalettes_DiglettsCave[][16] = { INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/digletts_cave/palettes/15.gbapal"), }; const u32 gTilesetTiles_SeafoamIslands[] = INCBIN_U32("data/tilesets/secondary/seafoam_islands/tiles.4bpp.lz"); const u16 gTilesetPalettes_SeafoamIslands[][16] = { INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/seafoam_islands/palettes/15.gbapal"), }; const u32 gTilesetTiles_UnusedGatehouse2[] = INCBIN_U32("data/tilesets/secondary/unused_gatehouse_2/tiles.4bpp.lz"); const u16 gTilesetPalettes_UnusedGatehouse2[][16] = { INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/palettes/15.gbapal"), }; const u32 gTilesetTiles_CeruleanCave[] = INCBIN_U32("data/tilesets/secondary/cerulean_cave/tiles.4bpp.lz"); const u16 gTilesetPalettes_CeruleanCave[][16] = { INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/cerulean_cave/palettes/15.gbapal"), }; const u32 gTilesetTiles_GenericBuilding2[] = INCBIN_U32("data/tilesets/secondary/generic_building_2/tiles.4bpp.lz"); const u16 gTilesetPalettes_GenericBuilding2[][16] = { INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_2/palettes/15.gbapal"), }; const u32 gTilesetTiles_PowerPlant[] = INCBIN_U32("data/tilesets/secondary/power_plant/tiles.4bpp.lz"); const u16 gTilesetPalettes_PowerPlant[][16] = { INCBIN_U16("data/tilesets/secondary/power_plant/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/power_plant/palettes/15.gbapal"), }; const u32 gTilesetTiles_SeaCottage[] = INCBIN_U32("data/tilesets/secondary/sea_cottage/tiles.4bpp.lz"); const u16 gTilesetPalettes_SeaCottage[][16] = { INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/15.gbapal"), }; // Shared by SilphCo const u32 gTilesetTiles_Condominiums[] = INCBIN_U32("data/tilesets/secondary/condominiums/tiles.4bpp.lz"); // Shared by SilphCo const u16 gTilesetPalettes_Condominiums[][16] = { INCBIN_U16("data/tilesets/secondary/condominiums/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/15.gbapal"), }; const u32 gTilesetTiles_UndergroundPath[] = INCBIN_U32("data/tilesets/secondary/underground_path/tiles.4bpp.lz"); const u16 gTilesetPalettes_UndergroundPath[][16] = { INCBIN_U16("data/tilesets/secondary/underground_path/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/underground_path/palettes/15.gbapal"), }; const u32 gTilesetTiles_PokemonTower[] = INCBIN_U32("data/tilesets/secondary/pokemon_tower/tiles.4bpp.lz"); const u16 gTilesetPalettes_PokemonTower[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_tower/palettes/15.gbapal"), }; const u32 gTilesetTiles_SafariZoneBuilding[] = INCBIN_U32("data/tilesets/secondary/safari_zone_building/tiles.4bpp.lz"); const u16 gTilesetPalettes_SafariZoneBuilding[][16] = { INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/safari_zone_building/palettes/15.gbapal"), }; const u32 gTilesetTiles_PokemonMansion[] = INCBIN_U32("data/tilesets/secondary/pokemon_mansion/tiles.4bpp.lz"); const u16 gTilesetPalettes_PokemonMansion[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_mansion/palettes/15.gbapal"), }; const u32 gTilesetTiles_RestaurantHotel[] = INCBIN_U32("data/tilesets/secondary/restaurant_hotel/tiles.4bpp.lz"); const u16 gTilesetPalettes_RestaurantHotel[][16] = { INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/restaurant_hotel/palettes/15.gbapal"), }; const u32 gTilesetTiles_School[] = INCBIN_U32("data/tilesets/secondary/school/tiles.4bpp.lz"); const u16 gTilesetPalettes_School[][16] = { INCBIN_U16("data/tilesets/secondary/school/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/school/palettes/15.gbapal"), }; const u32 gTilesetTiles_FanClubDaycare[] = INCBIN_U32("data/tilesets/secondary/fan_club_daycare/tiles.4bpp.lz"); const u16 gTilesetPalettes_FanClubDaycare[][16] = { INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/fan_club_daycare/palettes/15.gbapal"), }; const u32 gTilesetTiles_BurgledHouse[] = INCBIN_U32("data/tilesets/secondary/burgled_house/tiles.4bpp.lz"); const u16 gTilesetPalettes_BurgledHouse[][16] = { INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/burgled_house/palettes/15.gbapal"), }; const u32 gTilesetTiles_Dummy3[] = INCBIN_U32("data/tilesets/secondary/dummy_3/tiles.4bpp.lz"); const u16 gTilesetPalettes_Dummy3[][16] = { INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_3/palettes/15.gbapal"), }; const u32 gTilesetTiles_Dummy4[] = INCBIN_U32("data/tilesets/secondary/dummy_4/tiles.4bpp.lz"); const u16 gTilesetPalettes_Dummy4[][16] = { INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/dummy_4/palettes/15.gbapal"), }; const u32 gTilesetTiles_MtEmber[] = INCBIN_U32("data/tilesets/secondary/mt_ember/tiles.4bpp.lz"); const u16 gTilesetPalettes_MtEmber[][16] = { INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/mt_ember/palettes/15.gbapal"), }; const u32 gTilesetTiles_BerryForest[] = INCBIN_U32("data/tilesets/secondary/berry_forest/tiles.4bpp.lz"); const u16 gTilesetPalettes_BerryForest[][16] = { INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/berry_forest/palettes/15.gbapal"), }; const u32 gTilesetTiles_NavelRock[] = INCBIN_U32("data/tilesets/secondary/navel_rock/tiles.4bpp.lz"); const u16 gTilesetPalettes_NavelRock[][16] = { INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/15.gbapal"), }; const u32 gTilesetTiles_TanobyRuins[] = INCBIN_U32("data/tilesets/secondary/tanoby_ruins/tiles.4bpp.lz"); const u16 gTilesetPalettes_TanobyRuins[][16] = { INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/tanoby_ruins/palettes/15.gbapal"), }; const u32 gTilesetTiles_SeviiIslands123[] = INCBIN_U32("data/tilesets/secondary/sevii_islands_123/tiles.4bpp.lz"); const u16 gTilesetPalettes_SeviiIslands123[][16] = { INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_123/palettes/15.gbapal"), }; const u32 gTilesetTiles_SeviiIslands45[] = INCBIN_U32("data/tilesets/secondary/sevii_islands_45/tiles.4bpp.lz"); const u16 gTilesetPalettes_SeviiIslands45[][16] = { INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_45/palettes/15.gbapal"), }; const u32 gTilesetTiles_SeviiIslands67[] = INCBIN_U32("data/tilesets/secondary/sevii_islands_67/tiles.4bpp.lz"); const u16 gTilesetPalettes_SeviiIslands67[][16] = { INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/sevii_islands_67/palettes/15.gbapal"), }; const u32 gTilesetTiles_TrainerTower[] = INCBIN_U32("data/tilesets/secondary/trainer_tower/tiles.4bpp.lz"); const u16 gTilesetPalettes_TrainerTower[][16] = { INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_tower/palettes/15.gbapal"), }; const u32 gTilesetTiles_IslandHarbor[] = INCBIN_U32("data/tilesets/secondary/island_harbor/tiles.4bpp.lz"); const u16 gTilesetPalettes_IslandHarbor[][16] = { INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/15.gbapal"), }; const u32 gTilesetTiles_PokemonLeague[] = INCBIN_U32("data/tilesets/secondary/pokemon_league/tiles.4bpp.lz"); const u16 gTilesetPalettes_PokemonLeague[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_league/palettes/15.gbapal"), }; const u32 gTilesetTiles_HallOfFame[] = INCBIN_U32("data/tilesets/secondary/hall_of_fame/tiles.4bpp.lz"); const u16 gTilesetPalettes_HallOfFame[][16] = { INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/hall_of_fame/palettes/15.gbapal"), }; const u32 gTilesetTiles_Underwater[] = INCBIN_U32("data/tilesets/secondary/underwater/tiles.4bpp.lz"); const u16 gTilesetPalettes_Underwater[][16] = { INCBIN_U16("data/tilesets/secondary/underwater/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/12.gbapal"), }; const u32 gTilesetTiles_BattleFrontierOutsideWest[] = INCBIN_U32("data/tilesets/secondary/battlefrontieroutsidewest/tiles.4bpp.lz"); const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = { INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/palettes/12.gbapal"), }; const u32 gTilesetTiles_BattleFrontierOutsideEast[] = INCBIN_U32("data/tilesets/secondary/battlefrontieroutsideeast/tiles.4bpp.lz"); const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = { INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/palettes/12.gbapal"), }; const u32 gTilesetTiles_BattleFrontier[] = INCBIN_U32("data/tilesets/secondary/battlefrontier/tiles.4bpp.lz"); const u16 gTilesetPalettes_BattleFrontier[][16] = { INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontier/palettes/12.gbapal"), }; const u32 gTilesetTiles_SeviiIslands5[] = INCBIN_U32("data/tilesets/secondary/seviiislands5/tiles.4bpp.lz"); const u16 gTilesetPalettes_SeviiIslands5[][16] = { INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands5/palettes/12.gbapal"), }; const u32 gTilesetTiles_SeviiIslands6[] = INCBIN_U32("data/tilesets/secondary/seviiislands6/tiles.4bpp.lz"); const u16 gTilesetPalettes_SeviiIslands6[][16] = { INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/seviiislands6/palettes/12.gbapal"), }; const u32 gTilesetTiles_BattleFrontierRankingHall[] = INCBIN_U32("data/tilesets/secondary/battlefrontierrankinghall/tiles.4bpp.lz"); const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = { INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/palettes/12.gbapal"), }; ================================================ FILE: src/data/tilesets/headers.h ================================================ const struct Tileset gTileset_General = { .isCompressed = TRUE, .isSecondary = FALSE, .tiles = gTilesetTiles_General, .palettes = gTilesetPalettes_General, .metatiles = gMetatiles_General, .metatileAttributes = gMetatileAttributes_General, .callback = InitTilesetAnim_General }; const struct Tileset gTileset_PalletTown = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_PalletTown, .palettes = gTilesetPalettes_PalletTown, .metatiles = gMetatiles_PalletTown, .metatileAttributes = gMetatileAttributes_PalletTown, .callback = 0x0 }; const struct Tileset gTileset_ViridianCity = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_ViridianCity, .palettes = gTilesetPalettes_ViridianCity, .metatiles = gMetatiles_ViridianCity, .metatileAttributes = gMetatileAttributes_ViridianCity, .callback = 0x0 }; const struct Tileset gTileset_PewterCity = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_PewterCity, .palettes = gTilesetPalettes_PewterCity, .metatiles = gMetatiles_PewterCity, .metatileAttributes = gMetatileAttributes_PewterCity, .callback = 0x0 }; const struct Tileset gTileset_CeruleanCity = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_CeruleanCity, .palettes = gTilesetPalettes_CeruleanCity, .metatiles = gMetatiles_CeruleanCity, .metatileAttributes = gMetatileAttributes_CeruleanCity, .callback = 0x0 }; const struct Tileset gTileset_LavenderTown = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_LavenderTown, .palettes = gTilesetPalettes_LavenderTown, .metatiles = gMetatiles_LavenderTown, .metatileAttributes = gMetatileAttributes_LavenderTown, .callback = 0x0 }; const struct Tileset gTileset_VermilionCity = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_VermilionCity, .palettes = gTilesetPalettes_VermilionCity, .metatiles = gMetatiles_VermilionCity, .metatileAttributes = gMetatileAttributes_VermilionCity, .callback = 0x0 }; const struct Tileset gTileset_CeladonCity = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_CeladonCity, .palettes = gTilesetPalettes_CeladonCity, .metatiles = gMetatiles_CeladonCity, .metatileAttributes = gMetatileAttributes_CeladonCity, .callback = InitTilesetAnim_CeladonCity }; const struct Tileset gTileset_FuchsiaCity = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_FuchsiaCity, .palettes = gTilesetPalettes_FuchsiaCity, .metatiles = gMetatiles_FuchsiaCity, .metatileAttributes = gMetatileAttributes_FuchsiaCity, .callback = 0x0 }; const struct Tileset gTileset_CinnabarIsland = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_CinnabarIsland, .palettes = gTilesetPalettes_CinnabarIsland, .metatiles = gMetatiles_CinnabarIsland, .metatileAttributes = gMetatileAttributes_CinnabarIsland, .callback = 0x0 }; const struct Tileset gTileset_IndigoPlateau = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_IndigoPlateau, .palettes = gTilesetPalettes_IndigoPlateau, .metatiles = gMetatiles_IndigoPlateau, .metatileAttributes = gMetatileAttributes_IndigoPlateau, .callback = 0x0 }; const struct Tileset gTileset_SaffronCity = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SaffronCity, .palettes = gTilesetPalettes_SaffronCity, .metatiles = gMetatiles_SaffronCity, .metatileAttributes = gMetatileAttributes_SaffronCity, .callback = 0x0 }; const struct Tileset gTileset_Building = { .isCompressed = TRUE, .isSecondary = FALSE, .tiles = gTilesetTiles_Building, .palettes = gTilesetPalettes_Building, .metatiles = gMetatiles_Building, .metatileAttributes = gMetatileAttributes_Building, .callback = 0x0 }; const struct Tileset gTileset_Mart = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Mart, .palettes = gTilesetPalettes_Mart, .metatiles = gMetatiles_Mart, .metatileAttributes = gMetatileAttributes_Mart, .callback = 0x0 }; const struct Tileset gTileset_PokemonCenter = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_PokemonCenter, .palettes = gTilesetPalettes_PokemonCenter, .metatiles = gMetatiles_PokemonCenter, .metatileAttributes = gMetatileAttributes_PokemonCenter, .callback = 0x0 }; const struct Tileset gTileset_Cave = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Cave, .palettes = gTilesetPalettes_Cave, .metatiles = gMetatiles_Cave, .metatileAttributes = gMetatileAttributes_Cave, .callback = 0x0 }; const struct Tileset gTileset_Dummy1 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Dummy1, .palettes = gTilesetPalettes_Dummy1, .metatiles = gMetatiles_Dummy1, .metatileAttributes = gMetatileAttributes_Dummy1, .callback = 0x0 }; const struct Tileset gTileset_Museum = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Museum, .palettes = gTilesetPalettes_Museum, .metatiles = gMetatiles_Museum, .metatileAttributes = gMetatileAttributes_Museum, .callback = 0x0 }; const struct Tileset gTileset_CableClub = { .isCompressed = FALSE, .isSecondary = TRUE, .tiles = gTilesetTiles_CableClub, .palettes = gTilesetPalettes_CableClub, .metatiles = gMetatiles_CableClub, .metatileAttributes = gMetatileAttributes_CableClub, .callback = 0x0 }; const struct Tileset gTileset_BikeShop = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_BikeShop, .palettes = gTilesetPalettes_BikeShop, .metatiles = gMetatiles_BikeShop, .metatileAttributes = gMetatileAttributes_BikeShop, .callback = 0x0 }; const struct Tileset gTileset_GenericBuilding1 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_GenericBuilding1, .palettes = gTilesetPalettes_GenericBuilding1, .metatiles = gMetatiles_GenericBuilding1, .metatileAttributes = gMetatileAttributes_GenericBuilding1, .callback = 0x0 }; const struct Tileset gTileset_Lab = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Lab, .palettes = gTilesetPalettes_Lab, .metatiles = gMetatiles_Lab, .metatileAttributes = gMetatileAttributes_Lab, .callback = 0x0 }; const struct Tileset gTileset_FuchsiaGym = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_FuchsiaGym, .palettes = gTilesetPalettes_FuchsiaGym, .metatiles = gMetatiles_FuchsiaGym, .metatileAttributes = gMetatileAttributes_FuchsiaGym, .callback = 0x0 }; const struct Tileset gTileset_ViridianGym = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_ViridianGym, .palettes = gTilesetPalettes_ViridianGym, .metatiles = gMetatiles_ViridianGym, .metatileAttributes = gMetatileAttributes_ViridianGym, .callback = 0x0 }; const struct Tileset gTileset_HoennBuilding = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_HoennBuilding, .palettes = gTilesetPalettes_HoennBuilding, .metatiles = gMetatiles_HoennBuilding, .metatileAttributes = gMetatileAttributes_HoennBuilding, .callback = 0x0 }; const struct Tileset gTileset_GameCorner = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_GameCorner, .palettes = gTilesetPalettes_GameCorner, .metatiles = gMetatiles_GameCorner, .metatileAttributes = gMetatileAttributes_GameCorner, .callback = 0x0 }; const struct Tileset gTileset_PewterGym = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_PewterGym, .palettes = gTilesetPalettes_PewterGym, .metatiles = gMetatiles_PewterGym, .metatileAttributes = gMetatileAttributes_PewterGym, .callback = 0x0 }; const struct Tileset gTileset_CeruleanGym = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_CeruleanGym, .palettes = gTilesetPalettes_CeruleanGym, .metatiles = gMetatiles_CeruleanGym, .metatileAttributes = gMetatileAttributes_CeruleanGym, .callback = 0x0 }; const struct Tileset gTileset_VermilionGym = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_VermilionGym, .palettes = gTilesetPalettes_VermilionGym, .metatiles = gMetatiles_VermilionGym, .metatileAttributes = gMetatileAttributes_VermilionGym, .callback = InitTilesetAnim_VermilionGym }; const struct Tileset gTileset_CeladonGym = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_CeladonGym, .palettes = gTilesetPalettes_CeladonGym, .metatiles = gMetatiles_CeladonGym, .metatileAttributes = gMetatileAttributes_CeladonGym, .callback = InitTilesetAnim_CeladonGym }; const struct Tileset gTileset_SaffronGym = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SaffronGym, .palettes = gTilesetPalettes_SaffronGym, .metatiles = gMetatiles_SaffronGym, .metatileAttributes = gMetatileAttributes_SaffronGym, .callback = 0x0 }; const struct Tileset gTileset_CinnabarGym = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_CinnabarGym, .palettes = gTilesetPalettes_CinnabarGym, .metatiles = gMetatiles_CinnabarGym, .metatileAttributes = gMetatileAttributes_CinnabarGym, .callback = 0x0 }; const struct Tileset gTileset_SSAnne = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SSAnne, .palettes = gTilesetPalettes_SSAnne, .metatiles = gMetatiles_SSAnne, .metatileAttributes = gMetatileAttributes_SSAnne, .callback = 0x0 }; const struct Tileset gTileset_Dummy2 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Dummy2, .palettes = gTilesetPalettes_Dummy2, .metatiles = gMetatiles_Dummy2, .metatileAttributes = gMetatileAttributes_Dummy2, .callback = 0x0 }; const struct Tileset gTileset_ViridianForest = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_ViridianForest, .palettes = gTilesetPalettes_ViridianForest, .metatiles = gMetatiles_ViridianForest, .metatileAttributes = gMetatileAttributes_ViridianForest, .callback = 0x0 }; const struct Tileset gTileset_UnusedGatehouse1 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_UnusedGatehouse1, .palettes = gTilesetPalettes_UnusedGatehouse1, .metatiles = gMetatiles_UnusedGatehouse1, .metatileAttributes = gMetatileAttributes_UnusedGatehouse1, .callback = 0x0 }; const struct Tileset gTileset_RockTunnel = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_RockTunnel, .palettes = gTilesetPalettes_RockTunnel, .metatiles = gMetatiles_RockTunnel, .metatileAttributes = gMetatileAttributes_RockTunnel, .callback = 0x0 }; const struct Tileset gTileset_DiglettsCave = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_DiglettsCave, .palettes = gTilesetPalettes_DiglettsCave, .metatiles = gMetatiles_DiglettsCave, .metatileAttributes = gMetatileAttributes_DiglettsCave, .callback = 0x0 }; const struct Tileset gTileset_SeafoamIslands = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SeafoamIslands, .palettes = gTilesetPalettes_SeafoamIslands, .metatiles = gMetatiles_SeafoamIslands, .metatileAttributes = gMetatileAttributes_SeafoamIslands, .callback = 0x0 }; const struct Tileset gTileset_UnusedGatehouse2 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_UnusedGatehouse2, .palettes = gTilesetPalettes_UnusedGatehouse2, .metatiles = gMetatiles_UnusedGatehouse2, .metatileAttributes = gMetatileAttributes_UnusedGatehouse2, .callback = 0x0 }; const struct Tileset gTileset_CeruleanCave = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_CeruleanCave, .palettes = gTilesetPalettes_CeruleanCave, .metatiles = gMetatiles_CeruleanCave, .metatileAttributes = gMetatileAttributes_CeruleanCave, .callback = 0x0 }; const struct Tileset gTileset_DepartmentStore = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_DepartmentStore, .palettes = gTilesetPalettes_DepartmentStore, .metatiles = gMetatiles_DepartmentStore, .metatileAttributes = gMetatileAttributes_DepartmentStore, .callback = 0x0 }; const struct Tileset gTileset_GenericBuilding2 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_GenericBuilding2, .palettes = gTilesetPalettes_GenericBuilding2, .metatiles = gMetatiles_GenericBuilding2, .metatileAttributes = gMetatileAttributes_GenericBuilding2, .callback = 0x0 }; const struct Tileset gTileset_PowerPlant = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_PowerPlant, .palettes = gTilesetPalettes_PowerPlant, .metatiles = gMetatiles_PowerPlant, .metatileAttributes = gMetatileAttributes_PowerPlant, .callback = 0x0 }; const struct Tileset gTileset_SeaCottage = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SeaCottage, .palettes = gTilesetPalettes_SeaCottage, .metatiles = gMetatiles_SeaCottage, .metatileAttributes = gMetatileAttributes_SeaCottage, .callback = 0x0 }; const struct Tileset gTileset_SilphCo = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Condominiums, .palettes = gTilesetPalettes_Condominiums, .metatiles = gMetatiles_SilphCo, .metatileAttributes = gMetatileAttributes_SilphCo, .callback = InitTilesetAnim_SilphCo }; const struct Tileset gTileset_UndergroundPath = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_UndergroundPath, .palettes = gTilesetPalettes_UndergroundPath, .metatiles = gMetatiles_UndergroundPath, .metatileAttributes = gMetatileAttributes_UndergroundPath, .callback = 0x0 }; const struct Tileset gTileset_PokemonTower = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_PokemonTower, .palettes = gTilesetPalettes_PokemonTower, .metatiles = gMetatiles_PokemonTower, .metatileAttributes = gMetatileAttributes_PokemonTower, .callback = 0x0 }; const struct Tileset gTileset_SafariZoneBuilding = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SafariZoneBuilding, .palettes = gTilesetPalettes_SafariZoneBuilding, .metatiles = gMetatiles_SafariZoneBuilding, .metatileAttributes = gMetatileAttributes_SafariZoneBuilding, .callback = 0x0 }; const struct Tileset gTileset_PokemonMansion = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_PokemonMansion, .palettes = gTilesetPalettes_PokemonMansion, .metatiles = gMetatiles_PokemonMansion, .metatileAttributes = gMetatileAttributes_PokemonMansion, .callback = 0x0 }; const struct Tileset gTileset_RestaurantHotel = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_RestaurantHotel, .palettes = gTilesetPalettes_RestaurantHotel, .metatiles = gMetatiles_RestaurantHotel, .metatileAttributes = gMetatileAttributes_RestaurantHotel, .callback = 0x0 }; const struct Tileset gTileset_School = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_School, .palettes = gTilesetPalettes_School, .metatiles = gMetatiles_School, .metatileAttributes = gMetatileAttributes_School, .callback = 0x0 }; const struct Tileset gTileset_FanClubDaycare = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_FanClubDaycare, .palettes = gTilesetPalettes_FanClubDaycare, .metatiles = gMetatiles_FanClubDaycare, .metatileAttributes = gMetatileAttributes_FanClubDaycare, .callback = 0x0 }; const struct Tileset gTileset_Condominiums = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Condominiums, .palettes = gTilesetPalettes_Condominiums, .metatiles = gMetatiles_Condominiums, .metatileAttributes = gMetatileAttributes_Condominiums, .callback = 0x0 }; const struct Tileset gTileset_BurgledHouse = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_BurgledHouse, .palettes = gTilesetPalettes_BurgledHouse, .metatiles = gMetatiles_BurgledHouse, .metatileAttributes = gMetatileAttributes_BurgledHouse, .callback = 0x0 }; const struct Tileset gTileset_Dummy3 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Dummy3, .palettes = gTilesetPalettes_Dummy3, .metatiles = gMetatiles_Dummy3, .metatileAttributes = gMetatileAttributes_Dummy3, .callback = 0x0 }; const struct Tileset gTileset_Dummy4 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Dummy4, .palettes = gTilesetPalettes_Dummy4, .metatiles = gMetatiles_Dummy4, .metatileAttributes = gMetatileAttributes_Dummy4, .callback = 0x0 }; const struct Tileset gTileset_MtEmber = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_MtEmber, .palettes = gTilesetPalettes_MtEmber, .metatiles = gMetatiles_MtEmber, .metatileAttributes = gMetatileAttributes_MtEmber, .callback = InitTilesetAnim_MtEmber }; const struct Tileset gTileset_BerryForest = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_BerryForest, .palettes = gTilesetPalettes_BerryForest, .metatiles = gMetatiles_BerryForest, .metatileAttributes = gMetatileAttributes_BerryForest, .callback = 0x0 }; const struct Tileset gTileset_NavelRock = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_NavelRock, .palettes = gTilesetPalettes_NavelRock, .metatiles = gMetatiles_NavelRock, .metatileAttributes = gMetatileAttributes_NavelRock, .callback = 0x0 }; const struct Tileset gTileset_TanobyRuins = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_TanobyRuins, .palettes = gTilesetPalettes_TanobyRuins, .metatiles = gMetatiles_TanobyRuins, .metatileAttributes = gMetatileAttributes_TanobyRuins, .callback = 0x0 }; const struct Tileset gTileset_SeviiIslands123 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SeviiIslands123, .palettes = gTilesetPalettes_SeviiIslands123, .metatiles = gMetatiles_SeviiIslands123, .metatileAttributes = gMetatileAttributes_SeviiIslands123, .callback = 0x0 }; const struct Tileset gTileset_SeviiIslands45 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SeviiIslands45, .palettes = gTilesetPalettes_SeviiIslands45, .metatiles = gMetatiles_SeviiIslands45, .metatileAttributes = gMetatileAttributes_SeviiIslands45, .callback = 0x0 }; const struct Tileset gTileset_SeviiIslands67 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SeviiIslands67, .palettes = gTilesetPalettes_SeviiIslands67, .metatiles = gMetatiles_SeviiIslands67, .metatileAttributes = gMetatileAttributes_SeviiIslands67, .callback = InitTilesetAnim_SeviiIslands67 }; const struct Tileset gTileset_TrainerTower = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_TrainerTower, .palettes = gTilesetPalettes_TrainerTower, .metatiles = gMetatiles_TrainerTower, .metatileAttributes = gMetatileAttributes_TrainerTower, .callback = 0x0 }; const struct Tileset gTileset_IslandHarbor = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_IslandHarbor, .palettes = gTilesetPalettes_IslandHarbor, .metatiles = gMetatiles_IslandHarbor, .metatileAttributes = gMetatileAttributes_IslandHarbor, .callback = 0x0 }; const struct Tileset gTileset_PokemonLeague = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_PokemonLeague, .palettes = gTilesetPalettes_PokemonLeague, .metatiles = gMetatiles_PokemonLeague, .metatileAttributes = gMetatileAttributes_PokemonLeague, .callback = 0x0 }; const struct Tileset gTileset_HallOfFame = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_HallOfFame, .palettes = gTilesetPalettes_HallOfFame, .metatiles = gMetatiles_HallOfFame, .metatileAttributes = gMetatileAttributes_HallOfFame, .callback = 0x0 }; const struct Tileset gTileset_Underwater = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_Underwater, .palettes = gTilesetPalettes_Underwater, .metatiles = gMetatiles_Underwater, .metatileAttributes = gMetatileAttributes_Underwater, .callback = InitTilesetAnim_Underwater }; const struct Tileset gTileset_BattleFrontierOutsideWest = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_BattleFrontierOutsideWest, .palettes = gTilesetPalettes_BattleFrontierOutsideWest, .metatiles = gMetatiles_BattleFrontierOutsideWest, .metatileAttributes = gMetatileAttributes_BattleFrontierOutsideWest, .callback = InitTilesetAnim_BattleFrontierOutsideWest }; const struct Tileset gTileset_BattleFrontierOutsideEast = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_BattleFrontierOutsideEast, .palettes = gTilesetPalettes_BattleFrontierOutsideEast, .metatiles = gMetatiles_BattleFrontierOutsideEast, .metatileAttributes = gMetatileAttributes_BattleFrontierOutsideEast, .callback = InitTilesetAnim_BattleFrontierOutsideEast }; const struct Tileset gTileset_BattleFrontier = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_BattleFrontier, .palettes = gTilesetPalettes_BattleFrontier, .metatiles = gMetatiles_BattleFrontier, .metatileAttributes = gMetatileAttributes_BattleFrontier, .callback = NULL }; const struct Tileset gTileset_SeviiIslands5 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SeviiIslands5, .palettes = gTilesetPalettes_SeviiIslands5, .metatiles = gMetatiles_SeviiIslands5, .metatileAttributes = gMetatileAttributes_SeviiIslands5, .callback = InitTilesetAnim_SeviiIslands5 }; const struct Tileset gTileset_SeviiIslands6 = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_SeviiIslands6, .palettes = gTilesetPalettes_SeviiIslands6, .metatiles = gMetatiles_SeviiIslands6, .metatileAttributes = gMetatileAttributes_SeviiIslands6, .callback = NULL }; const struct Tileset gTileset_BattleFrontierRankingHall = { .isCompressed = TRUE, .isSecondary = TRUE, .tiles = gTilesetTiles_BattleFrontierRankingHall, .palettes = gTilesetPalettes_BattleFrontierRankingHall, .metatiles = gMetatiles_BattleFrontierRankingHall, .metatileAttributes = gMetatileAttributes_BattleFrontierRankingHall, .callback = NULL }; ================================================ FILE: src/data/tilesets/metatiles.h ================================================ const u16 gMetatiles_General[] = INCBIN_U16("data/tilesets/primary/general/metatiles.bin"); const u32 gMetatileAttributes_General[] = INCBIN_U32("data/tilesets/primary/general/metatile_attributes.bin"); const u16 gMetatiles_PalletTown[] = INCBIN_U16("data/tilesets/secondary/pallet_town/metatiles.bin"); const u32 gMetatileAttributes_PalletTown[] = INCBIN_U32("data/tilesets/secondary/pallet_town/metatile_attributes.bin"); const u16 gMetatiles_ViridianCity[] = INCBIN_U16("data/tilesets/secondary/viridian_city/metatiles.bin"); const u32 gMetatileAttributes_ViridianCity[] = INCBIN_U32("data/tilesets/secondary/viridian_city/metatile_attributes.bin"); const u16 gMetatiles_PewterCity[] = INCBIN_U16("data/tilesets/secondary/pewter_city/metatiles.bin"); const u32 gMetatileAttributes_PewterCity[] = INCBIN_U32("data/tilesets/secondary/pewter_city/metatile_attributes.bin"); const u16 gMetatiles_CeruleanCity[] = INCBIN_U16("data/tilesets/secondary/cerulean_city/metatiles.bin"); const u32 gMetatileAttributes_CeruleanCity[] = INCBIN_U32("data/tilesets/secondary/cerulean_city/metatile_attributes.bin"); const u16 gMetatiles_LavenderTown[] = INCBIN_U16("data/tilesets/secondary/lavender_town/metatiles.bin"); const u32 gMetatileAttributes_LavenderTown[] = INCBIN_U32("data/tilesets/secondary/lavender_town/metatile_attributes.bin"); const u16 gMetatiles_VermilionCity[] = INCBIN_U16("data/tilesets/secondary/vermilion_city/metatiles.bin"); const u32 gMetatileAttributes_VermilionCity[] = INCBIN_U32("data/tilesets/secondary/vermilion_city/metatile_attributes.bin"); const u16 gMetatiles_CeladonCity[] = INCBIN_U16("data/tilesets/secondary/celadon_city/metatiles.bin"); const u32 gMetatileAttributes_CeladonCity[] = INCBIN_U32("data/tilesets/secondary/celadon_city/metatile_attributes.bin"); const u16 gMetatiles_FuchsiaCity[] = INCBIN_U16("data/tilesets/secondary/fuchsia_city/metatiles.bin"); const u32 gMetatileAttributes_FuchsiaCity[] = INCBIN_U32("data/tilesets/secondary/fuchsia_city/metatile_attributes.bin"); const u16 gMetatiles_CinnabarIsland[] = INCBIN_U16("data/tilesets/secondary/cinnabar_island/metatiles.bin"); const u32 gMetatileAttributes_CinnabarIsland[] = INCBIN_U32("data/tilesets/secondary/cinnabar_island/metatile_attributes.bin"); const u16 gMetatiles_IndigoPlateau[] = INCBIN_U16("data/tilesets/secondary/indigo_plateau/metatiles.bin"); const u32 gMetatileAttributes_IndigoPlateau[] = INCBIN_U32("data/tilesets/secondary/indigo_plateau/metatile_attributes.bin"); const u16 gMetatiles_SaffronCity[] = INCBIN_U16("data/tilesets/secondary/saffron_city/metatiles.bin"); const u32 gMetatileAttributes_SaffronCity[] = INCBIN_U32("data/tilesets/secondary/saffron_city/metatile_attributes.bin"); const u16 gMetatiles_PewterGym[] = INCBIN_U16("data/tilesets/secondary/pewter_gym/metatiles.bin"); const u32 gMetatileAttributes_PewterGym[] = INCBIN_U32("data/tilesets/secondary/pewter_gym/metatile_attributes.bin"); const u16 gMetatiles_CeruleanGym[] = INCBIN_U16("data/tilesets/secondary/cerulean_gym/metatiles.bin"); const u32 gMetatileAttributes_CeruleanGym[] = INCBIN_U32("data/tilesets/secondary/cerulean_gym/metatile_attributes.bin"); const u16 gMetatiles_VermilionGym[] = INCBIN_U16("data/tilesets/secondary/vermilion_gym/metatiles.bin"); const u32 gMetatileAttributes_VermilionGym[] = INCBIN_U32("data/tilesets/secondary/vermilion_gym/metatile_attributes.bin"); const u16 gMetatiles_CeladonGym[] = INCBIN_U16("data/tilesets/secondary/celadon_gym/metatiles.bin"); const u32 gMetatileAttributes_CeladonGym[] = INCBIN_U32("data/tilesets/secondary/celadon_gym/metatile_attributes.bin"); const u16 gMetatiles_FuchsiaGym[] = INCBIN_U16("data/tilesets/secondary/fuchsia_gym/metatiles.bin"); const u32 gMetatileAttributes_FuchsiaGym[] = INCBIN_U32("data/tilesets/secondary/fuchsia_gym/metatile_attributes.bin"); const u16 gMetatiles_SaffronGym[] = INCBIN_U16("data/tilesets/secondary/saffron_gym/metatiles.bin"); const u32 gMetatileAttributes_SaffronGym[] = INCBIN_U32("data/tilesets/secondary/saffron_gym/metatile_attributes.bin"); const u16 gMetatiles_CinnabarGym[] = INCBIN_U16("data/tilesets/secondary/cinnabar_gym/metatiles.bin"); const u32 gMetatileAttributes_CinnabarGym[] = INCBIN_U32("data/tilesets/secondary/cinnabar_gym/metatile_attributes.bin"); const u16 gMetatiles_ViridianGym[] = INCBIN_U16("data/tilesets/secondary/viridian_gym/metatiles.bin"); const u32 gMetatileAttributes_ViridianGym[] = INCBIN_U32("data/tilesets/secondary/viridian_gym/metatile_attributes.bin"); const u16 gMetatiles_Building[] = INCBIN_U16("data/tilesets/primary/building/metatiles.bin"); const u32 gMetatileAttributes_Building[] = INCBIN_U32("data/tilesets/primary/building/metatile_attributes.bin"); const u16 gMetatiles_Dummy1[] = INCBIN_U16("data/tilesets/secondary/dummy_1/metatiles.bin"); const u32 gMetatileAttributes_Dummy1[] = INCBIN_U32("data/tilesets/secondary/dummy_1/metatile_attributes.bin"); const u16 gMetatiles_HoennBuilding[] = INCBIN_U16("data/tilesets/secondary/hoenn_building/metatiles.bin"); const u32 gMetatileAttributes_HoennBuilding[] = INCBIN_U32("data/tilesets/secondary/hoenn_building/metatile_attributes.bin"); const u16 gMetatiles_BikeShop[] = INCBIN_U16("data/tilesets/secondary/bike_shop/metatiles.bin"); const u32 gMetatileAttributes_BikeShop[] = INCBIN_U32("data/tilesets/secondary/bike_shop/metatile_attributes.bin"); const u16 gMetatiles_Mart[] = INCBIN_U16("data/tilesets/secondary/mart/metatiles.bin"); const u32 gMetatileAttributes_Mart[] = INCBIN_U32("data/tilesets/secondary/mart/metatile_attributes.bin"); const u16 gMetatiles_PokemonCenter[] = INCBIN_U16("data/tilesets/secondary/pokemon_center/metatiles.bin"); const u32 gMetatileAttributes_PokemonCenter[] = INCBIN_U32("data/tilesets/secondary/pokemon_center/metatile_attributes.bin"); const u16 gMetatiles_GenericBuilding1[] = INCBIN_U16("data/tilesets/secondary/generic_building_1/metatiles.bin"); const u32 gMetatileAttributes_GenericBuilding1[] = INCBIN_U32("data/tilesets/secondary/generic_building_1/metatile_attributes.bin"); const u16 gMetatiles_Cave[] = INCBIN_U16("data/tilesets/secondary/cave/metatiles.bin"); const u32 gMetatileAttributes_Cave[] = INCBIN_U32("data/tilesets/secondary/cave/metatile_attributes.bin"); const u16 gMetatiles_GameCorner[] = INCBIN_U16("data/tilesets/secondary/game_corner/metatiles.bin"); const u32 gMetatileAttributes_GameCorner[] = INCBIN_U32("data/tilesets/secondary/game_corner/metatile_attributes.bin"); const u16 gMetatiles_Lab[] = INCBIN_U16("data/tilesets/secondary/lab/metatiles.bin"); const u32 gMetatileAttributes_Lab[] = INCBIN_U32("data/tilesets/secondary/lab/metatile_attributes.bin"); const u16 gMetatiles_SSAnne[] = INCBIN_U16("data/tilesets/secondary/ss_anne/metatiles.bin"); const u32 gMetatileAttributes_SSAnne[] = INCBIN_U32("data/tilesets/secondary/ss_anne/metatile_attributes.bin"); const u16 gMetatiles_Dummy2[] = INCBIN_U16("data/tilesets/secondary/dummy_2/metatiles.bin"); const u32 gMetatileAttributes_Dummy2[] = INCBIN_U32("data/tilesets/secondary/dummy_2/metatile_attributes.bin"); const u16 gMetatiles_ViridianForest[] = INCBIN_U16("data/tilesets/secondary/viridian_forest/metatiles.bin"); const u32 gMetatileAttributes_ViridianForest[] = INCBIN_U32("data/tilesets/secondary/viridian_forest/metatile_attributes.bin"); const u16 gMetatiles_UnusedGatehouse1[] = INCBIN_U16("data/tilesets/secondary/unused_gatehouse_1/metatiles.bin"); const u32 gMetatileAttributes_UnusedGatehouse1[] = INCBIN_U32("data/tilesets/secondary/unused_gatehouse_1/metatile_attributes.bin"); const u16 gMetatiles_RockTunnel[] = INCBIN_U16("data/tilesets/secondary/rock_tunnel/metatiles.bin"); const u32 gMetatileAttributes_RockTunnel[] = INCBIN_U32("data/tilesets/secondary/rock_tunnel/metatile_attributes.bin"); const u16 gMetatiles_DiglettsCave[] = INCBIN_U16("data/tilesets/secondary/digletts_cave/metatiles.bin"); const u32 gMetatileAttributes_DiglettsCave[] = INCBIN_U32("data/tilesets/secondary/digletts_cave/metatile_attributes.bin"); const u16 gMetatiles_SeafoamIslands[] = INCBIN_U16("data/tilesets/secondary/seafoam_islands/metatiles.bin"); const u32 gMetatileAttributes_SeafoamIslands[] = INCBIN_U32("data/tilesets/secondary/seafoam_islands/metatile_attributes.bin"); const u16 gMetatiles_UnusedGatehouse2[] = INCBIN_U16("data/tilesets/secondary/unused_gatehouse_2/metatiles.bin"); const u32 gMetatileAttributes_UnusedGatehouse2[] = INCBIN_U32("data/tilesets/secondary/unused_gatehouse_2/metatile_attributes.bin"); const u16 gMetatiles_CeruleanCave[] = INCBIN_U16("data/tilesets/secondary/cerulean_cave/metatiles.bin"); const u32 gMetatileAttributes_CeruleanCave[] = INCBIN_U32("data/tilesets/secondary/cerulean_cave/metatile_attributes.bin"); const u16 gMetatiles_DepartmentStore[] = INCBIN_U16("data/tilesets/secondary/department_store/metatiles.bin"); const u32 gMetatileAttributes_DepartmentStore[] = INCBIN_U32("data/tilesets/secondary/department_store/metatile_attributes.bin"); const u16 gMetatiles_GenericBuilding2[] = INCBIN_U16("data/tilesets/secondary/generic_building_2/metatiles.bin"); const u32 gMetatileAttributes_GenericBuilding2[] = INCBIN_U32("data/tilesets/secondary/generic_building_2/metatile_attributes.bin"); const u16 gMetatiles_PowerPlant[] = INCBIN_U16("data/tilesets/secondary/power_plant/metatiles.bin"); const u32 gMetatileAttributes_PowerPlant[] = INCBIN_U32("data/tilesets/secondary/power_plant/metatile_attributes.bin"); const u16 gMetatiles_SeaCottage[] = INCBIN_U16("data/tilesets/secondary/sea_cottage/metatiles.bin"); const u32 gMetatileAttributes_SeaCottage[] = INCBIN_U32("data/tilesets/secondary/sea_cottage/metatile_attributes.bin"); const u16 gMetatiles_SilphCo[] = INCBIN_U16("data/tilesets/secondary/silph_co/metatiles.bin"); const u32 gMetatileAttributes_SilphCo[] = INCBIN_U32("data/tilesets/secondary/silph_co/metatile_attributes.bin"); const u16 gMetatiles_UndergroundPath[] = INCBIN_U16("data/tilesets/secondary/underground_path/metatiles.bin"); const u32 gMetatileAttributes_UndergroundPath[] = INCBIN_U32("data/tilesets/secondary/underground_path/metatile_attributes.bin"); const u16 gMetatiles_PokemonTower[] = INCBIN_U16("data/tilesets/secondary/pokemon_tower/metatiles.bin"); const u32 gMetatileAttributes_PokemonTower[] = INCBIN_U32("data/tilesets/secondary/pokemon_tower/metatile_attributes.bin"); const u16 gMetatiles_SafariZoneBuilding[] = INCBIN_U16("data/tilesets/secondary/safari_zone_building/metatiles.bin"); const u32 gMetatileAttributes_SafariZoneBuilding[] = INCBIN_U32("data/tilesets/secondary/safari_zone_building/metatile_attributes.bin"); const u16 gMetatiles_PokemonMansion[] = INCBIN_U16("data/tilesets/secondary/pokemon_mansion/metatiles.bin"); const u32 gMetatileAttributes_PokemonMansion[] = INCBIN_U32("data/tilesets/secondary/pokemon_mansion/metatile_attributes.bin"); const u16 gMetatiles_Museum[] = INCBIN_U16("data/tilesets/secondary/museum/metatiles.bin"); const u32 gMetatileAttributes_Museum[] = INCBIN_U32("data/tilesets/secondary/museum/metatile_attributes.bin"); const u16 gMetatiles_CableClub[] = INCBIN_U16("data/tilesets/secondary/cable_club/metatiles.bin"); const u32 gMetatileAttributes_CableClub[] = INCBIN_U32("data/tilesets/secondary/cable_club/metatile_attributes.bin"); const u16 gMetatiles_RestaurantHotel[] = INCBIN_U16("data/tilesets/secondary/restaurant_hotel/metatiles.bin"); const u32 gMetatileAttributes_RestaurantHotel[] = INCBIN_U32("data/tilesets/secondary/restaurant_hotel/metatile_attributes.bin"); const u16 gMetatiles_School[] = INCBIN_U16("data/tilesets/secondary/school/metatiles.bin"); const u32 gMetatileAttributes_School[] = INCBIN_U32("data/tilesets/secondary/school/metatile_attributes.bin"); const u16 gMetatiles_FanClubDaycare[] = INCBIN_U16("data/tilesets/secondary/fan_club_daycare/metatiles.bin"); const u32 gMetatileAttributes_FanClubDaycare[] = INCBIN_U32("data/tilesets/secondary/fan_club_daycare/metatile_attributes.bin"); const u16 gMetatiles_Condominiums[] = INCBIN_U16("data/tilesets/secondary/condominiums/metatiles.bin"); const u32 gMetatileAttributes_Condominiums[] = INCBIN_U32("data/tilesets/secondary/condominiums/metatile_attributes.bin"); const u16 gMetatiles_BurgledHouse[] = INCBIN_U16("data/tilesets/secondary/burgled_house/metatiles.bin"); const u32 gMetatileAttributes_BurgledHouse[] = INCBIN_U32("data/tilesets/secondary/burgled_house/metatile_attributes.bin"); const u16 gMetatiles_Dummy3[] = INCBIN_U16("data/tilesets/secondary/dummy_3/metatiles.bin"); const u32 gMetatileAttributes_Dummy3[] = INCBIN_U32("data/tilesets/secondary/dummy_3/metatile_attributes.bin"); const u16 gMetatiles_Dummy4[] = INCBIN_U16("data/tilesets/secondary/dummy_4/metatiles.bin"); const u32 gMetatileAttributes_Dummy4[] = INCBIN_U32("data/tilesets/secondary/dummy_4/metatile_attributes.bin"); const u16 gMetatiles_MtEmber[] = INCBIN_U16("data/tilesets/secondary/mt_ember/metatiles.bin"); const u32 gMetatileAttributes_MtEmber[] = INCBIN_U32("data/tilesets/secondary/mt_ember/metatile_attributes.bin"); const u16 gMetatiles_BerryForest[] = INCBIN_U16("data/tilesets/secondary/berry_forest/metatiles.bin"); const u32 gMetatileAttributes_BerryForest[] = INCBIN_U32("data/tilesets/secondary/berry_forest/metatile_attributes.bin"); const u16 gMetatiles_NavelRock[] = INCBIN_U16("data/tilesets/secondary/navel_rock/metatiles.bin"); const u32 gMetatileAttributes_NavelRock[] = INCBIN_U32("data/tilesets/secondary/navel_rock/metatile_attributes.bin"); const u16 gMetatiles_TanobyRuins[] = INCBIN_U16("data/tilesets/secondary/tanoby_ruins/metatiles.bin"); const u32 gMetatileAttributes_TanobyRuins[] = INCBIN_U32("data/tilesets/secondary/tanoby_ruins/metatile_attributes.bin"); const u16 gMetatiles_SeviiIslands123[] = INCBIN_U16("data/tilesets/secondary/sevii_islands_123/metatiles.bin"); const u32 gMetatileAttributes_SeviiIslands123[] = INCBIN_U32("data/tilesets/secondary/sevii_islands_123/metatile_attributes.bin"); const u16 gMetatiles_SeviiIslands45[] = INCBIN_U16("data/tilesets/secondary/sevii_islands_45/metatiles.bin"); const u32 gMetatileAttributes_SeviiIslands45[] = INCBIN_U32("data/tilesets/secondary/sevii_islands_45/metatile_attributes.bin"); const u16 gMetatiles_SeviiIslands67[] = INCBIN_U16("data/tilesets/secondary/sevii_islands_67/metatiles.bin"); const u32 gMetatileAttributes_SeviiIslands67[] = INCBIN_U32("data/tilesets/secondary/sevii_islands_67/metatile_attributes.bin"); const u16 gMetatiles_TrainerTower[] = INCBIN_U16("data/tilesets/secondary/trainer_tower/metatiles.bin"); const u32 gMetatileAttributes_TrainerTower[] = INCBIN_U32("data/tilesets/secondary/trainer_tower/metatile_attributes.bin"); const u16 gMetatiles_IslandHarbor[] = INCBIN_U16("data/tilesets/secondary/island_harbor/metatiles.bin"); const u32 gMetatileAttributes_IslandHarbor[] = INCBIN_U32("data/tilesets/secondary/island_harbor/metatile_attributes.bin"); const u16 gMetatiles_PokemonLeague[] = INCBIN_U16("data/tilesets/secondary/pokemon_league/metatiles.bin"); const u32 gMetatileAttributes_PokemonLeague[] = INCBIN_U32("data/tilesets/secondary/pokemon_league/metatile_attributes.bin"); const u16 gMetatiles_HallOfFame[] = INCBIN_U16("data/tilesets/secondary/hall_of_fame/metatiles.bin"); const u32 gMetatileAttributes_HallOfFame[] = INCBIN_U32("data/tilesets/secondary/hall_of_fame/metatile_attributes.bin"); const u16 gMetatiles_Underwater[] = INCBIN_U16("data/tilesets/secondary/underwater/metatiles.bin"); const u32 gMetatileAttributes_Underwater[] = INCBIN_U32("data/tilesets/secondary/underwater/metatile_attributes.bin"); const u16 gMetatiles_BattleFrontierOutsideWest[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/metatiles.bin"); const u32 gMetatileAttributes_BattleFrontierOutsideWest[] = INCBIN_U32("data/tilesets/secondary/battlefrontieroutsidewest/metatile_attributes.bin"); const u16 gMetatiles_BattleFrontierOutsideEast[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/metatiles.bin"); const u32 gMetatileAttributes_BattleFrontierOutsideEast[] = INCBIN_U32("data/tilesets/secondary/battlefrontieroutsideeast/metatile_attributes.bin"); const u16 gMetatiles_BattleFrontier[] = INCBIN_U16("data/tilesets/secondary/battlefrontier/metatiles.bin"); const u32 gMetatileAttributes_BattleFrontier[] = INCBIN_U32("data/tilesets/secondary/battlefrontier/metatile_attributes.bin"); const u16 gMetatiles_SeviiIslands5[] = INCBIN_U16("data/tilesets/secondary/seviiislands5/metatiles.bin"); const u32 gMetatileAttributes_SeviiIslands5[] = INCBIN_U32("data/tilesets/secondary/seviiislands5/metatile_attributes.bin"); const u16 gMetatiles_SeviiIslands6[] = INCBIN_U16("data/tilesets/secondary/seviiislands6/metatiles.bin"); const u32 gMetatileAttributes_SeviiIslands6[] = INCBIN_U32("data/tilesets/secondary/seviiislands6/metatile_attributes.bin"); const u16 gMetatiles_BattleFrontierRankingHall[] = INCBIN_U16("data/tilesets/secondary/battlefrontierrankinghall/metatiles.bin"); const u32 gMetatileAttributes_BattleFrontierRankingHall[] = INCBIN_U32("data/tilesets/secondary/battlefrontierrankinghall/metatile_attributes.bin"); ================================================ FILE: src/data/trainer_graphics/back_pic_anims.h ================================================ static const union AnimCmd sAnimCmd_Red_1[] = { ANIMCMD_FRAME(1, 20), ANIMCMD_FRAME(2, 6), ANIMCMD_FRAME(3, 6), ANIMCMD_FRAME(4, 24), ANIMCMD_FRAME(0, 1), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Leaf_1[] = { ANIMCMD_FRAME(1, 20), ANIMCMD_FRAME(2, 6), ANIMCMD_FRAME(3, 6), ANIMCMD_FRAME(4, 24), ANIMCMD_FRAME(0, 1), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Pokedude_1[] = { ANIMCMD_FRAME(1, 24), ANIMCMD_FRAME(2, 9), ANIMCMD_FRAME(3, 24), ANIMCMD_FRAME(0, 9), ANIMCMD_END }; static const union AnimCmd sAnimCmd_OldMan_1[] = { ANIMCMD_FRAME(1, 24), ANIMCMD_FRAME(2, 9), ANIMCMD_FRAME(3, 24), ANIMCMD_FRAME(0, 9), ANIMCMD_END }; static const union AnimCmd sAnimCmd_RSBrendan_1[] = { ANIMCMD_FRAME(0, 24), ANIMCMD_FRAME(1, 9), ANIMCMD_FRAME(2, 24), ANIMCMD_FRAME(0, 9), ANIMCMD_FRAME(3, 50), ANIMCMD_END }; static const union AnimCmd sAnimCmd_RSMay_1[] = { ANIMCMD_FRAME(0, 24), ANIMCMD_FRAME(1, 9), ANIMCMD_FRAME(2, 24), ANIMCMD_FRAME(0, 9), ANIMCMD_FRAME(3, 50), ANIMCMD_END }; static const union AnimCmd gAnimCmd_EmBrendan_1[] = { ANIMCMD_FRAME(0, 24), ANIMCMD_FRAME(1, 9), ANIMCMD_FRAME(2, 24), ANIMCMD_FRAME(0, 9), ANIMCMD_FRAME(3, 50), ANIMCMD_END, }; static const union AnimCmd gAnimCmd_EmMay_Steven_1[] = { ANIMCMD_FRAME(0, 24), ANIMCMD_FRAME(1, 9), ANIMCMD_FRAME(2, 24), ANIMCMD_FRAME(0, 9), ANIMCMD_FRAME(3, 50), ANIMCMD_END, }; const union AnimCmd *const sBackAnims_Red[] = { sAnim_GeneralFrame0, sAnimCmd_Red_1 }; const union AnimCmd *const sBackAnims_Leaf[] = { sAnim_GeneralFrame0, sAnimCmd_Leaf_1 }; const union AnimCmd *const sBackAnims_Pokedude[] = { sAnim_GeneralFrame0, sAnimCmd_Pokedude_1 }; const union AnimCmd *const sBackAnims_OldMan[] = { sAnim_GeneralFrame0, sAnimCmd_OldMan_1 }; const union AnimCmd *const sBackAnims_RSBrendan[] = { sAnim_GeneralFrame3, sAnimCmd_RSBrendan_1 }; const union AnimCmd *const sBackAnims_RSMay[] = { sAnim_GeneralFrame3, sAnimCmd_RSMay_1 }; static const union AnimCmd *const sBackAnims_EmBrendan[] = { sAnim_GeneralFrame3, gAnimCmd_EmBrendan_1, }; static const union AnimCmd *const sBackAnims_EmMay[] = { sAnim_GeneralFrame3, gAnimCmd_EmMay_Steven_1, }; const union AnimCmd *const *const gTrainerBackAnimsPtrTable[] = { sBackAnims_Red, sBackAnims_Leaf, sBackAnims_RSBrendan, sBackAnims_RSMay, sBackAnims_Pokedude, sBackAnims_OldMan, sBackAnims_EmBrendan, sBackAnims_EmMay }; ================================================ FILE: src/data/trainer_graphics/back_pic_tables.h ================================================ const struct MonCoords gTrainerBackPicCoords[] = { [TRAINER_BACK_PIC_RED] = {.size = 8, .y_offset = 5}, [TRAINER_BACK_PIC_LEAF] = {.size = 8, .y_offset = 5}, [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = {.size = 8, .y_offset = 4}, [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = {.size = 8, .y_offset = 4}, [TRAINER_BACK_PIC_POKEDUDE] = {.size = 8, .y_offset = 4}, [TRAINER_BACK_PIC_OLD_MAN] = {.size = 8, .y_offset = 4}, [TRAINER_BACK_PIC_EMERALD_BRENDAN] = {.size = 8, .y_offset = 4}, [TRAINER_BACK_PIC_EMERALD_MAY] = {.size = 8, .y_offset = 4}, }; const struct CompressedSpriteSheet gTrainerBackPicTable[] = { { (const u32 *)gTrainerBackPic_Red, 0x2800, 0 }, { (const u32 *)gTrainerBackPic_Leaf, 0x2800, 1 }, { (const u32 *)gTrainerBackPic_RSBrendan, 0x2000, 2 }, { (const u32 *)gTrainerBackPic_RSMay, 0x2000, 3 }, { (const u32 *)gTrainerBackPic_Pokedude, 0x2000, 4 }, { (const u32 *)gTrainerBackPic_OldMan, 0x2000, 5 }, { (const u32 *)gTrainerBackPic_EmBrendan, 0x2000, 6 }, { (const u32 *)gTrainerBackPic_EmMay, 0x2000, 7 } }; const struct CompressedSpritePalette gTrainerBackPicPaletteTable[] = { { gTrainerPalette_RedBackPic, 0 }, { gTrainerPalette_LeafBackPic, 1 }, { gTrainerPalette_RSBrendan1, 2 }, { gTrainerPalette_RSMay1, 3 }, { gTrainerPalette_PokedudeBackPic, 4 }, { gTrainerPalette_OldManBackPic, 5 }, { gTrainerPalette_EmBrendan, 6 }, { gTrainerPalette_EmMay, 7 } }; ================================================ FILE: src/data/trainer_graphics/front_pic_anims.h ================================================ static const union AnimCmd *const sAnims_AquaLeaderArchie[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_AquaGruntM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_AquaGruntF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSAromaLady[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSRuinManiac[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Interviewer[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSTuberF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSTuberM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSCooltrainerM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSCooltrainerF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_HexManiac[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSLady[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSBeauty[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RichBoy[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSPokemaniac[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSSwimmerM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSBlackBelt[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Guitarist[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Kindler[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSCamper[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_BugManiac[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSPsychicM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSPsychicF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSGentleman[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_EliteFourSidney[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_EliteFourPhoebe[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderRoxanne[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderBrawly[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderTateAndLiza[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_SchoolKidM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_SchoolKidF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_SrAndJr[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_PokefanM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_PokefanF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_ExpertM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_ExpertF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSYoungster[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_ChampionSteven[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSFisherman[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_CyclingTriathleteM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_CyclingTriathleteF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RunningTriathleteM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RunningTriathleteF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_SwimmingTriathleteM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_SwimmingTriathleteF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_DragonTamer[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSBirdKeeper[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_NinjaBoy[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_BattleGirl[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_ParasolLady[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSSwimmerF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSPicnicker[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSTwins[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSSailor[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Collector[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Wally[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSBrendan1[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSMay1[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSPokemonBreederM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSPokemonBreederF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSPokemonRangerM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSPokemonRangerF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_MagmaLeaderMaxie[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_MagmaGruntM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_MagmaGruntF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSLass[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSBugCatcher[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSHiker[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSYoungCouple[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_OldCouple[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSSisAndBro[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_AquaAdminM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_AquaAdminF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_MagmaAdminM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_MagmaAdminF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderWattson[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderFlannery[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderNorman[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderWinona[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderWallace[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_EliteFourGlacia[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_EliteFourDrake[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Youngster[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_BugCatcher[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Lass[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Sailor[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Camper[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Picnicker[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Pokemaniac[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_SuperNerd[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Hiker[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Biker[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Burglar[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Engineer[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Fisherman[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_SwimmerM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_CueBall[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Gamer[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Beauty[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_SwimmerF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_PsychicM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Rocker[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Juggler[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Tamer[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_BirdKeeper[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_BlackBelt[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RivalEarly[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Scientist[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderGiovanni[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RocketGruntM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_CooltrainerM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_CooltrainerF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_EliteFourLorelei[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_EliteFourBruno[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_EliteFourAgatha[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_EliteFourLance[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderBrock[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderMisty[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderLtSurge[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderErika[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderKoga[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderBlaine[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_LeaderSabrina[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Gentleman[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RivalLate[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_ChampionRival[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Channeler[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Twins[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_CoolCouple[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_YoungCouple[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_CrushKin[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_SisAndBro[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_ProfessorOak[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSBrendan2[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RSMay2[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Red[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Leaf[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RocketGruntF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_PsychicF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_CrushGirl[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_TuberF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_PokemonBreeder[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_PokemonRangerM[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_PokemonRangerF[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_AromaLady[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_RuinManiac[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Lady[] = { sAnim_GeneralFrame0, }; static const union AnimCmd *const sAnims_Painter[] = { sAnim_GeneralFrame0, }; const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[] = { [TRAINER_PIC_AQUA_LEADER_ARCHIE] = sAnims_AquaLeaderArchie, [TRAINER_PIC_AQUA_GRUNT_M] = sAnims_AquaGruntM, [TRAINER_PIC_AQUA_GRUNT_F] = sAnims_AquaGruntF, [TRAINER_PIC_RS_AROMA_LADY] = sAnims_RSAromaLady, [TRAINER_PIC_RS_RUIN_MANIAC] = sAnims_RSRuinManiac, [TRAINER_PIC_INTERVIEWER] = sAnims_Interviewer, [TRAINER_PIC_RS_TUBER_F] = sAnims_RSTuberF, [TRAINER_PIC_RS_TUBER_M] = sAnims_RSTuberM, [TRAINER_PIC_RS_COOLTRAINER_M] = sAnims_RSCooltrainerM, [TRAINER_PIC_RS_COOLTRAINER_F] = sAnims_RSCooltrainerF, [TRAINER_PIC_HEX_MANIAC] = sAnims_HexManiac, [TRAINER_PIC_RS_LADY] = sAnims_RSLady, [TRAINER_PIC_RS_BEAUTY] = sAnims_RSBeauty, [TRAINER_PIC_RICH_BOY] = sAnims_RichBoy, [TRAINER_PIC_RS_POKEMANIAC] = sAnims_RSPokemaniac, [TRAINER_PIC_RS_SWIMMER_M] = sAnims_RSSwimmerM, [TRAINER_PIC_RS_BLACK_BELT] = sAnims_RSBlackBelt, [TRAINER_PIC_GUITARIST] = sAnims_Guitarist, [TRAINER_PIC_KINDLER] = sAnims_Kindler, [TRAINER_PIC_RS_CAMPER] = sAnims_RSCamper, [TRAINER_PIC_BUG_MANIAC] = sAnims_BugManiac, [TRAINER_PIC_RS_PSYCHIC_M] = sAnims_RSPsychicM, [TRAINER_PIC_RS_PSYCHIC_F] = sAnims_RSPsychicF, [TRAINER_PIC_RS_GENTLEMAN] = sAnims_RSGentleman, [TRAINER_PIC_ELITE_FOUR_SIDNEY] = sAnims_EliteFourSidney, [TRAINER_PIC_ELITE_FOUR_PHOEBE] = sAnims_EliteFourPhoebe, [TRAINER_PIC_LEADER_ROXANNE] = sAnims_LeaderRoxanne, [TRAINER_PIC_LEADER_BRAWLY] = sAnims_LeaderBrawly, [TRAINER_PIC_LEADER_TATE_AND_LIZA] = sAnims_LeaderTateAndLiza, [TRAINER_PIC_SCHOOL_KID_M] = sAnims_SchoolKidM, [TRAINER_PIC_SCHOOL_KID_F] = sAnims_SchoolKidF, [TRAINER_PIC_SR_AND_JR] = sAnims_SrAndJr, [TRAINER_PIC_POKEFAN_M] = sAnims_PokefanM, [TRAINER_PIC_POKEFAN_F] = sAnims_PokefanF, [TRAINER_PIC_EXPERT_M] = sAnims_ExpertM, [TRAINER_PIC_EXPERT_F] = sAnims_ExpertF, [TRAINER_PIC_RS_YOUNGSTER] = sAnims_RSYoungster, [TRAINER_PIC_CHAMPION_STEVEN] = sAnims_ChampionSteven, [TRAINER_PIC_RS_FISHERMAN] = sAnims_RSFisherman, [TRAINER_PIC_CYCLING_TRIATHLETE_M] = sAnims_CyclingTriathleteM, [TRAINER_PIC_CYCLING_TRIATHLETE_F] = sAnims_CyclingTriathleteF, [TRAINER_PIC_RUNNING_TRIATHLETE_M] = sAnims_RunningTriathleteM, [TRAINER_PIC_RUNNING_TRIATHLETE_F] = sAnims_RunningTriathleteF, [TRAINER_PIC_SWIMMING_TRIATHLETE_M] = sAnims_SwimmingTriathleteM, [TRAINER_PIC_SWIMMING_TRIATHLETE_F] = sAnims_SwimmingTriathleteF, [TRAINER_PIC_DRAGON_TAMER] = sAnims_DragonTamer, [TRAINER_PIC_RS_BIRD_KEEPER] = sAnims_RSBirdKeeper, [TRAINER_PIC_NINJA_BOY] = sAnims_NinjaBoy, [TRAINER_PIC_BATTLE_GIRL] = sAnims_BattleGirl, [TRAINER_PIC_PARASOL_LADY] = sAnims_ParasolLady, [TRAINER_PIC_RS_SWIMMER_F] = sAnims_RSSwimmerF, [TRAINER_PIC_RS_PICNICKER] = sAnims_RSPicnicker, [TRAINER_PIC_RS_TWINS] = sAnims_RSTwins, [TRAINER_PIC_RS_SAILOR] = sAnims_RSSailor, [TRAINER_PIC_COLLECTOR] = sAnims_Collector, [TRAINER_PIC_WALLY] = sAnims_Wally, [TRAINER_PIC_RS_BRENDAN_1] = sAnims_RSBrendan1, [TRAINER_PIC_RS_MAY_1] = sAnims_RSMay1, [TRAINER_PIC_RS_POKEMON_BREEDER_M] = sAnims_RSPokemonBreederM, [TRAINER_PIC_RS_POKEMON_BREEDER_F] = sAnims_RSPokemonBreederF, [TRAINER_PIC_RS_POKEMON_RANGER_M] = sAnims_RSPokemonRangerM, [TRAINER_PIC_RS_POKEMON_RANGER_F] = sAnims_RSPokemonRangerF, [TRAINER_PIC_MAGMA_LEADER_MAXIE] = sAnims_MagmaLeaderMaxie, [TRAINER_PIC_MAGMA_GRUNT_M] = sAnims_MagmaGruntM, [TRAINER_PIC_MAGMA_GRUNT_F] = sAnims_MagmaGruntF, [TRAINER_PIC_RS_LASS] = sAnims_RSLass, [TRAINER_PIC_RS_BUG_CATCHER] = sAnims_RSBugCatcher, [TRAINER_PIC_RS_HIKER] = sAnims_RSHiker, [TRAINER_PIC_RS_YOUNG_COUPLE] = sAnims_RSYoungCouple, [TRAINER_PIC_OLD_COUPLE] = sAnims_OldCouple, [TRAINER_PIC_RS_SIS_AND_BRO] = sAnims_RSSisAndBro, [TRAINER_PIC_AQUA_ADMIN_M] = sAnims_AquaAdminM, [TRAINER_PIC_AQUA_ADMIN_F] = sAnims_AquaAdminF, [TRAINER_PIC_MAGMA_ADMIN_M] = sAnims_MagmaAdminM, [TRAINER_PIC_MAGMA_ADMIN_F] = sAnims_MagmaAdminF, [TRAINER_PIC_LEADER_WATTSON] = sAnims_LeaderWattson, [TRAINER_PIC_LEADER_FLANNERY] = sAnims_LeaderFlannery, [TRAINER_PIC_LEADER_NORMAN] = sAnims_LeaderNorman, [TRAINER_PIC_LEADER_WINONA] = sAnims_LeaderWinona, [TRAINER_PIC_LEADER_WALLACE] = sAnims_LeaderWallace, [TRAINER_PIC_ELITE_FOUR_GLACIA] = sAnims_EliteFourGlacia, [TRAINER_PIC_ELITE_FOUR_DRAKE] = sAnims_EliteFourDrake, [TRAINER_PIC_YOUNGSTER] = sAnims_Youngster, [TRAINER_PIC_BUG_CATCHER] = sAnims_BugCatcher, [TRAINER_PIC_LASS] = sAnims_Lass, [TRAINER_PIC_SAILOR] = sAnims_Sailor, [TRAINER_PIC_CAMPER] = sAnims_Camper, [TRAINER_PIC_PICNICKER] = sAnims_Picnicker, [TRAINER_PIC_POKEMANIAC] = sAnims_Pokemaniac, [TRAINER_PIC_SUPER_NERD] = sAnims_SuperNerd, [TRAINER_PIC_HIKER] = sAnims_Hiker, [TRAINER_PIC_BIKER] = sAnims_Biker, [TRAINER_PIC_BURGLAR] = sAnims_Burglar, [TRAINER_PIC_ENGINEER] = sAnims_Engineer, [TRAINER_PIC_FISHERMAN] = sAnims_Fisherman, [TRAINER_PIC_SWIMMER_M] = sAnims_SwimmerM, [TRAINER_PIC_CUE_BALL] = sAnims_CueBall, [TRAINER_PIC_GAMER] = sAnims_Gamer, [TRAINER_PIC_BEAUTY] = sAnims_Beauty, [TRAINER_PIC_SWIMMER_F] = sAnims_SwimmerF, [TRAINER_PIC_PSYCHIC_M] = sAnims_PsychicM, [TRAINER_PIC_ROCKER] = sAnims_Rocker, [TRAINER_PIC_JUGGLER] = sAnims_Juggler, [TRAINER_PIC_TAMER] = sAnims_Tamer, [TRAINER_PIC_BIRD_KEEPER] = sAnims_BirdKeeper, [TRAINER_PIC_BLACK_BELT] = sAnims_BlackBelt, [TRAINER_PIC_RIVAL_EARLY] = sAnims_RivalEarly, [TRAINER_PIC_SCIENTIST] = sAnims_Scientist, [TRAINER_PIC_LEADER_GIOVANNI] = sAnims_LeaderGiovanni, [TRAINER_PIC_ROCKET_GRUNT_M] = sAnims_RocketGruntM, [TRAINER_PIC_COOLTRAINER_M] = sAnims_CooltrainerM, [TRAINER_PIC_COOLTRAINER_F] = sAnims_CooltrainerF, [TRAINER_PIC_ELITE_FOUR_LORELEI] = sAnims_EliteFourLorelei, [TRAINER_PIC_ELITE_FOUR_BRUNO] = sAnims_EliteFourBruno, [TRAINER_PIC_ELITE_FOUR_AGATHA] = sAnims_EliteFourAgatha, [TRAINER_PIC_ELITE_FOUR_LANCE] = sAnims_EliteFourLance, [TRAINER_PIC_LEADER_BROCK] = sAnims_LeaderBrock, [TRAINER_PIC_LEADER_MISTY] = sAnims_LeaderMisty, [TRAINER_PIC_LEADER_LT_SURGE] = sAnims_LeaderLtSurge, [TRAINER_PIC_LEADER_ERIKA] = sAnims_LeaderErika, [TRAINER_PIC_LEADER_KOGA] = sAnims_LeaderKoga, [TRAINER_PIC_LEADER_BLAINE] = sAnims_LeaderBlaine, [TRAINER_PIC_LEADER_SABRINA] = sAnims_LeaderSabrina, [TRAINER_PIC_GENTLEMAN] = sAnims_Gentleman, [TRAINER_PIC_RIVAL_LATE] = sAnims_RivalLate, [TRAINER_PIC_CHAMPION_RIVAL] = sAnims_ChampionRival, [TRAINER_PIC_CHANNELER] = sAnims_Channeler, [TRAINER_PIC_TWINS] = sAnims_Twins, [TRAINER_PIC_COOL_COUPLE] = sAnims_CoolCouple, [TRAINER_PIC_YOUNG_COUPLE] = sAnims_YoungCouple, [TRAINER_PIC_CRUSH_KIN] = sAnims_CrushKin, [TRAINER_PIC_SIS_AND_BRO] = sAnims_SisAndBro, [TRAINER_PIC_PROFESSOR_OAK] = sAnims_ProfessorOak, [TRAINER_PIC_RS_BRENDAN_2] = sAnims_RSBrendan2, [TRAINER_PIC_RS_MAY_2] = sAnims_RSMay2, [TRAINER_PIC_RED] = sAnims_Red, [TRAINER_PIC_LEAF] = sAnims_Leaf, [TRAINER_PIC_ROCKET_GRUNT_F] = sAnims_RocketGruntF, [TRAINER_PIC_PSYCHIC_F] = sAnims_PsychicF, [TRAINER_PIC_CRUSH_GIRL] = sAnims_CrushGirl, [TRAINER_PIC_TUBER_F] = sAnims_TuberF, [TRAINER_PIC_POKEMON_BREEDER] = sAnims_PokemonBreeder, [TRAINER_PIC_POKEMON_RANGER_M] = sAnims_PokemonRangerM, [TRAINER_PIC_POKEMON_RANGER_F] = sAnims_PokemonRangerF, [TRAINER_PIC_AROMA_LADY] = sAnims_AromaLady, [TRAINER_PIC_RUIN_MANIAC] = sAnims_RuinManiac, [TRAINER_PIC_LADY] = sAnims_Lady, [TRAINER_PIC_PAINTER] = sAnims_Painter, [TRAINER_PIC_EM_BRENDAN] = sAnims_Painter, [TRAINER_PIC_EM_MAY] = sAnims_Painter, [TRAINER_PIC_MASTER_BEAUTY] = sAnims_Painter, [TRAINER_PIC_MASTER_BIRD_KEEPER] = sAnims_Painter, [TRAINER_PIC_MASTER_BLACK_BELT] = sAnims_Painter, [TRAINER_PIC_MASTER_BUG_CATCHER] = sAnims_Painter, [TRAINER_PIC_MASTER_COOLTRAINER_M] = sAnims_Painter, [TRAINER_PIC_MASTER_HIKER] = sAnims_Painter, [TRAINER_PIC_MASTER_LASS] = sAnims_Painter, [TRAINER_PIC_MASTER_PSYCHIC_M] = sAnims_Painter, [TRAINER_PIC_MASTER_SCIENTIST] = sAnims_Painter, [TRAINER_PIC_MASTER_YOUNGSTER] = sAnims_Painter, [TRAINER_PIC_MASTER_SWIMMER] = sAnims_Painter, }; ================================================ FILE: src/data/trainer_graphics/front_pic_tables.h ================================================ const struct MonCoords gTrainerFrontPicCoords[] = { {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 2}, {.size = 8, .y_offset = 2}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 2}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 2}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, {.size = 8, .y_offset = 1}, }; const struct CompressedSpriteSheet gTrainerFrontPicTable[] = { TRAINER_SPRITE(AQUA_LEADER_ARCHIE, gTrainerFrontPic_AquaLeaderArchie, 0x800), TRAINER_SPRITE(AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, 0x800), TRAINER_SPRITE(AQUA_GRUNT_F, gTrainerFrontPic_AquaGruntF, 0x800), TRAINER_SPRITE(RS_AROMA_LADY, gTrainerFrontPic_RSAromaLady, 0x800), TRAINER_SPRITE(RS_RUIN_MANIAC, gTrainerFrontPic_RSRuinManiac, 0x800), TRAINER_SPRITE(INTERVIEWER, gTrainerFrontPic_Interviewer, 0x800), TRAINER_SPRITE(RS_TUBER_F, gTrainerFrontPic_RSTuberF, 0x800), TRAINER_SPRITE(RS_TUBER_M, gTrainerFrontPic_TuberM, 0x800), TRAINER_SPRITE(RS_COOLTRAINER_M, gTrainerFrontPic_RSCooltrainerM, 0x800), TRAINER_SPRITE(RS_COOLTRAINER_F, gTrainerFrontPic_RSCooltrainerF, 0x800), TRAINER_SPRITE(HEX_MANIAC, gTrainerFrontPic_HexManiac, 0x800), TRAINER_SPRITE(RS_LADY, gTrainerFrontPic_RSLady, 0x800), TRAINER_SPRITE(RS_BEAUTY, gTrainerFrontPic_RSBeauty, 0x800), TRAINER_SPRITE(RICH_BOY, gTrainerFrontPic_RichBoy, 0x800), TRAINER_SPRITE(RS_POKEMANIAC, gTrainerFrontPic_RSPokeManiac, 0x800), TRAINER_SPRITE(RS_SWIMMER_M, gTrainerFrontPic_RSSwimmerM, 0x800), TRAINER_SPRITE(RS_BLACK_BELT, gTrainerFrontPic_RSBlackBelt, 0x800), TRAINER_SPRITE(GUITARIST, gTrainerFrontPic_Guitarist, 0x800), TRAINER_SPRITE(KINDLER, gTrainerFrontPic_Kindler, 0x800), TRAINER_SPRITE(RS_CAMPER, gTrainerFrontPic_RSCamper, 0x800), TRAINER_SPRITE(BUG_MANIAC, gTrainerFrontPic_BugManiac, 0x800), TRAINER_SPRITE(RS_PSYCHIC_M, gTrainerFrontPic_RSPsychicM, 0x800), TRAINER_SPRITE(RS_PSYCHIC_F, gTrainerFrontPic_RSPsychicF, 0x800), TRAINER_SPRITE(RS_GENTLEMAN, gTrainerFrontPic_RSGentleman, 0x800), TRAINER_SPRITE(ELITE_FOUR_SIDNEY, gTrainerFrontPic_EliteFourSidney, 0x800), TRAINER_SPRITE(ELITE_FOUR_PHOEBE, gTrainerFrontPic_EliteFourPhoebe, 0x800), TRAINER_SPRITE(LEADER_ROXANNE, gTrainerFrontPic_LeaderRoxanne, 0x800), TRAINER_SPRITE(LEADER_BRAWLY, gTrainerFrontPic_LeaderBrawly, 0x800), TRAINER_SPRITE(LEADER_TATE_AND_LIZA, gTrainerFrontPic_LeaderTateAndLiza, 0x800), TRAINER_SPRITE(SCHOOL_KID_M, gTrainerFrontPic_SchoolKidM, 0x800), TRAINER_SPRITE(SCHOOL_KID_F, gTrainerFrontPic_SchoolKidF, 0x800), TRAINER_SPRITE(SR_AND_JR, gTrainerFrontPic_SrAndJr, 0x1000), TRAINER_SPRITE(POKEFAN_M, gTrainerFrontPic_PokefanM, 0x1000), TRAINER_SPRITE(POKEFAN_F, gTrainerFrontPic_PokefanF, 0x800), TRAINER_SPRITE(EXPERT_M, gTrainerFrontPic_ExpertM, 0x800), TRAINER_SPRITE(EXPERT_F, gTrainerFrontPic_ExpertF, 0x800), TRAINER_SPRITE(RS_YOUNGSTER, gTrainerFrontPic_RSYoungster, 0x800), TRAINER_SPRITE(CHAMPION_STEVEN, gTrainerFrontPic_ChampionSteven, 0x800), TRAINER_SPRITE(RS_FISHERMAN, gTrainerFrontPic_RSFisherman, 0x800), TRAINER_SPRITE(CYCLING_TRIATHLETE_M, gTrainerFrontPic_CyclingTriathleteM, 0x1000), TRAINER_SPRITE(CYCLING_TRIATHLETE_F, gTrainerFrontPic_CyclingTriathleteF, 0x800), TRAINER_SPRITE(RUNNING_TRIATHLETE_M, gTrainerFrontPic_RunningTriathleteM, 0x800), TRAINER_SPRITE(RUNNING_TRIATHLETE_F, gTrainerFrontPic_RunningTriathleteF, 0x800), TRAINER_SPRITE(SWIMMING_TRIATHLETE_M, gTrainerFrontPic_SwimmingTriathleteM, 0x800), TRAINER_SPRITE(SWIMMING_TRIATHLETE_F, gTrainerFrontPic_SwimmingTriathleteF, 0x800), TRAINER_SPRITE(DRAGON_TAMER, gTrainerFrontPic_DragonTamer, 0x800), TRAINER_SPRITE(RS_BIRD_KEEPER, gTrainerFrontPic_RSBirdKeeper, 0x800), TRAINER_SPRITE(NINJA_BOY, gTrainerFrontPic_NinjaBoy, 0x800), TRAINER_SPRITE(BATTLE_GIRL, gTrainerFrontPic_BattleGirl, 0x1000), TRAINER_SPRITE(PARASOL_LADY, gTrainerFrontPic_ParasolLady, 0x800), TRAINER_SPRITE(RS_SWIMMER_F, gTrainerFrontPic_RSSwimmerF, 0x800), TRAINER_SPRITE(RS_PICNICKER, gTrainerFrontPic_RSPicnicker, 0x800), TRAINER_SPRITE(RS_TWINS, gTrainerFrontPic_RSTwins, 0x800), TRAINER_SPRITE(RS_SAILOR, gTrainerFrontPic_RSSailor, 0x800), TRAINER_SPRITE(COLLECTOR, gTrainerFrontPic_Collector, 0x800), TRAINER_SPRITE(WALLY, gTrainerFrontPic_Wally, 0x800), TRAINER_SPRITE(RS_BRENDAN_1, gTrainerFrontPic_RSBrendan1, 0x800), TRAINER_SPRITE(RS_MAY_1, gTrainerFrontPic_RSMay1, 0x800), TRAINER_SPRITE(RS_POKEMON_BREEDER_M, gTrainerFrontPic_RSPokemonBreederM, 0x800), TRAINER_SPRITE(RS_POKEMON_BREEDER_F, gTrainerFrontPic_RSPokemonBreederF, 0x800), TRAINER_SPRITE(RS_POKEMON_RANGER_M, gTrainerFrontPic_RSPokemonRangerM, 0x800), TRAINER_SPRITE(RS_POKEMON_RANGER_F, gTrainerFrontPic_RSPokemonRangerF, 0x800), TRAINER_SPRITE(MAGMA_LEADER_MAXIE, gTrainerFrontPic_MagmaLeaderMaxie, 0x800), TRAINER_SPRITE(MAGMA_GRUNT_M, gTrainerFrontPic_MagmaGruntM, 0x800), TRAINER_SPRITE(MAGMA_GRUNT_F, gTrainerFrontPic_MagmaGruntF, 0x800), TRAINER_SPRITE(RS_LASS, gTrainerFrontPic_RSLass, 0x800), TRAINER_SPRITE(RS_BUG_CATCHER, gTrainerFrontPic_RSBugCatcher, 0x800), TRAINER_SPRITE(RS_HIKER, gTrainerFrontPic_RSHiker, 0x800), TRAINER_SPRITE(RS_YOUNG_COUPLE, gTrainerFrontPic_RSYoungCouple, 0x800), TRAINER_SPRITE(OLD_COUPLE, gTrainerFrontPic_OldCouple, 0x800), TRAINER_SPRITE(RS_SIS_AND_BRO, gTrainerFrontPic_RSSisAndBro, 0x800), TRAINER_SPRITE(AQUA_ADMIN_M, gTrainerFrontPic_AquaAdminM, 0x800), TRAINER_SPRITE(AQUA_ADMIN_F, gTrainerFrontPic_AquaAdminF, 0x800), TRAINER_SPRITE(MAGMA_ADMIN_M, gTrainerFrontPic_MagmaAdminM, 0x800), TRAINER_SPRITE(MAGMA_ADMIN_F, gTrainerFrontPic_MagmaAdminF, 0x800), TRAINER_SPRITE(LEADER_WATTSON, gTrainerFrontPic_LeaderWattson, 0x800), TRAINER_SPRITE(LEADER_FLANNERY, gTrainerFrontPic_LeaderFlannery, 0x800), TRAINER_SPRITE(LEADER_NORMAN, gTrainerFrontPic_LeaderNorman, 0x800), TRAINER_SPRITE(LEADER_WINONA, gTrainerFrontPic_LeaderWinona, 0x800), TRAINER_SPRITE(LEADER_WALLACE, gTrainerFrontPic_LeaderWallace, 0x800), TRAINER_SPRITE(ELITE_FOUR_GLACIA, gTrainerFrontPic_EliteFourGlacia, 0x800), TRAINER_SPRITE(ELITE_FOUR_DRAKE, gTrainerFrontPic_EliteFourDrake, 0x800), TRAINER_SPRITE(YOUNGSTER, gTrainerFrontPic_Youngster, 0x800), TRAINER_SPRITE(BUG_CATCHER, gTrainerFrontPic_BugCatcher, 0x800), TRAINER_SPRITE(LASS, gTrainerFrontPic_Lass, 0x800), TRAINER_SPRITE(SAILOR, gTrainerFrontPic_Sailor, 0x800), TRAINER_SPRITE(CAMPER, gTrainerFrontPic_Camper, 0x800), TRAINER_SPRITE(PICNICKER, gTrainerFrontPic_Picnicker, 0x800), TRAINER_SPRITE(POKEMANIAC, gTrainerFrontPic_PokeManiac, 0x800), TRAINER_SPRITE(SUPER_NERD, gTrainerFrontPic_SuperNerd, 0x800), TRAINER_SPRITE(HIKER, gTrainerFrontPic_Hiker, 0x800), TRAINER_SPRITE(BIKER, gTrainerFrontPic_Biker, 0x800), TRAINER_SPRITE(BURGLAR, gTrainerFrontPic_Burglar, 0x800), TRAINER_SPRITE(ENGINEER, gTrainerFrontPic_Engineer, 0x800), TRAINER_SPRITE(FISHERMAN, gTrainerFrontPic_Fisherman, 0x800), TRAINER_SPRITE(SWIMMER_M, gTrainerFrontPic_SwimmerM, 0x800), TRAINER_SPRITE(CUE_BALL, gTrainerFrontPic_CueBall, 0x800), TRAINER_SPRITE(GAMER, gTrainerFrontPic_Gamer, 0x800), TRAINER_SPRITE(BEAUTY, gTrainerFrontPic_Beauty, 0x800), TRAINER_SPRITE(SWIMMER_F, gTrainerFrontPic_SwimmerF, 0x800), TRAINER_SPRITE(PSYCHIC_M, gTrainerFrontPic_PsychicM, 0x800), TRAINER_SPRITE(ROCKER, gTrainerFrontPic_Rocker, 0x800), TRAINER_SPRITE(JUGGLER, gTrainerFrontPic_Juggler, 0x800), TRAINER_SPRITE(TAMER, gTrainerFrontPic_Tamer, 0x800), TRAINER_SPRITE(BIRD_KEEPER, gTrainerFrontPic_BirdKeeper, 0x800), TRAINER_SPRITE(BLACK_BELT, gTrainerFrontPic_BlackBelt, 0x800), TRAINER_SPRITE(RIVAL_EARLY, gTrainerFrontPic_RivalEarly, 0x800), TRAINER_SPRITE(SCIENTIST, gTrainerFrontPic_Scientist, 0x800), TRAINER_SPRITE(LEADER_GIOVANNI, gTrainerFrontPic_LeaderGiovanni, 0x800), TRAINER_SPRITE(ROCKET_GRUNT_M, gTrainerFrontPic_RocketGruntM, 0x800), TRAINER_SPRITE(COOLTRAINER_M, gTrainerFrontPic_CooltrainerM, 0x800), TRAINER_SPRITE(COOLTRAINER_F, gTrainerFrontPic_CooltrainerF, 0x800), TRAINER_SPRITE(ELITE_FOUR_LORELEI, gTrainerFrontPic_EliteFourLorelei, 0x800), TRAINER_SPRITE(ELITE_FOUR_BRUNO, gTrainerFrontPic_EliteFourBruno, 0x800), TRAINER_SPRITE(ELITE_FOUR_AGATHA, gTrainerFrontPic_EliteFourAgatha, 0x800), TRAINER_SPRITE(ELITE_FOUR_LANCE, gTrainerFrontPic_EliteFourLance, 0x800), TRAINER_SPRITE(LEADER_BROCK, gTrainerFrontPic_LeaderBrock, 0x800), TRAINER_SPRITE(LEADER_MISTY, gTrainerFrontPic_LeaderMisty, 0x800), TRAINER_SPRITE(LEADER_LT_SURGE, gTrainerFrontPic_LeaderLtSurge, 0x800), TRAINER_SPRITE(LEADER_ERIKA, gTrainerFrontPic_LeaderErika, 0x800), TRAINER_SPRITE(LEADER_KOGA, gTrainerFrontPic_LeaderKoga, 0x800), TRAINER_SPRITE(LEADER_BLAINE, gTrainerFrontPic_LeaderBlaine, 0x800), TRAINER_SPRITE(LEADER_SABRINA, gTrainerFrontPic_LeaderSabrina, 0x800), TRAINER_SPRITE(GENTLEMAN, gTrainerFrontPic_Gentleman, 0x800), TRAINER_SPRITE(RIVAL_LATE, gTrainerFrontPic_RivalLate, 0x800), TRAINER_SPRITE(CHAMPION_RIVAL, gTrainerFrontPic_ChampionRival, 0x800), TRAINER_SPRITE(CHANNELER, gTrainerFrontPic_Channeler, 0x800), TRAINER_SPRITE(TWINS, gTrainerFrontPic_Twins, 0x800), TRAINER_SPRITE(COOL_COUPLE, gTrainerFrontPic_CoolCouple, 0x800), TRAINER_SPRITE(YOUNG_COUPLE, gTrainerFrontPic_YoungCouple, 0x800), TRAINER_SPRITE(CRUSH_KIN, gTrainerFrontPic_CrushKin, 0x800), TRAINER_SPRITE(SIS_AND_BRO, gTrainerFrontPic_SisAndBro, 0x800), TRAINER_SPRITE(PROFESSOR_OAK, gTrainerFrontPic_ProfessorOak, 0x800), TRAINER_SPRITE(RS_BRENDAN_2, gTrainerFrontPic_RSBrendan2, 0x800), TRAINER_SPRITE(RS_MAY_2, gTrainerFrontPic_RSMay2, 0x800), TRAINER_SPRITE(RED, gTrainerFrontPic_Red, 0x800), TRAINER_SPRITE(LEAF, gTrainerFrontPic_Leaf, 0x800), TRAINER_SPRITE(ROCKET_GRUNT_F, gTrainerFrontPic_RocketGruntF, 0x800), TRAINER_SPRITE(PSYCHIC_F, gTrainerFrontPic_PsychicF, 0x800), TRAINER_SPRITE(CRUSH_GIRL, gTrainerFrontPic_CrushGirl, 0x800), TRAINER_SPRITE(TUBER_F, gTrainerFrontPic_TuberF, 0x800), TRAINER_SPRITE(POKEMON_BREEDER, gTrainerFrontPic_PokemonBreeder, 0x800), TRAINER_SPRITE(POKEMON_RANGER_M, gTrainerFrontPic_PokemonRangerM, 0x800), TRAINER_SPRITE(POKEMON_RANGER_F, gTrainerFrontPic_PokemonRangerF, 0x800), TRAINER_SPRITE(AROMA_LADY, gTrainerFrontPic_AromaLady, 0x800), TRAINER_SPRITE(RUIN_MANIAC, gTrainerFrontPic_RuinManiac, 0x800), TRAINER_SPRITE(LADY, gTrainerFrontPic_Lady, 0x800), TRAINER_SPRITE(PAINTER, gTrainerFrontPic_Painter, 0x800), TRAINER_SPRITE(EM_BRENDAN, gTrainerFrontPic_EmBrendan, 0x800), TRAINER_SPRITE(EM_MAY, gTrainerFrontPic_EmMay, 0x800), TRAINER_SPRITE(MASTER_BEAUTY, gTrainerFrontPic_MasterBeauty, 0x800), TRAINER_SPRITE(MASTER_BIRD_KEEPER, gTrainerFrontPic_MasterBirdKeeper, 0x800), TRAINER_SPRITE(MASTER_COOLTRAINER_M, gTrainerFrontPic_MasterCooltrainerM, 0x800), TRAINER_SPRITE(MASTER_BLACK_BELT, gTrainerFrontPic_MasterBlackBelt, 0x800), TRAINER_SPRITE(MASTER_BUG_CATCHER, gTrainerFrontPic_MasterBugCatcher, 0x800), TRAINER_SPRITE(MASTER_HIKER, gTrainerFrontPic_MasterHiker, 0x800), TRAINER_SPRITE(MASTER_LASS, gTrainerFrontPic_MasterLass, 0x800), TRAINER_SPRITE(MASTER_PSYCHIC_M, gTrainerFrontPic_MasterPsychicM, 0x800), TRAINER_SPRITE(MASTER_SCIENTIST, gTrainerFrontPic_MasterScientist, 0x800), TRAINER_SPRITE(MASTER_YOUNGSTER, gTrainerFrontPic_MasterYoungster, 0x800), TRAINER_SPRITE(MASTER_SWIMMER, gTrainerFrontPic_MasterSwimmer, 0x800), }; const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[] = { TRAINER_PAL(AQUA_LEADER_ARCHIE, gTrainerPalette_AquaLeaderArchie), TRAINER_PAL(AQUA_GRUNT_M, gTrainerPalette_AquaGruntM), TRAINER_PAL(AQUA_GRUNT_F, gTrainerPalette_AquaGruntF), TRAINER_PAL(RS_AROMA_LADY, gTrainerPalette_RSAromaLady), TRAINER_PAL(RS_RUIN_MANIAC, gTrainerPalette_RSRuinManiac), TRAINER_PAL(INTERVIEWER, gTrainerPalette_Interviewer), TRAINER_PAL(RS_TUBER_F, gTrainerPalette_RSTuberF), TRAINER_PAL(RS_TUBER_M, gTrainerPalette_TuberM), TRAINER_PAL(RS_COOLTRAINER_M, gTrainerPalette_RSCooltrainerM), TRAINER_PAL(RS_COOLTRAINER_F, gTrainerPalette_RSCooltrainerF), TRAINER_PAL(HEX_MANIAC, gTrainerPalette_HexManiac), TRAINER_PAL(RS_LADY, gTrainerPalette_RSLady), TRAINER_PAL(RS_BEAUTY, gTrainerPalette_RSBeauty), TRAINER_PAL(RICH_BOY, gTrainerPalette_RichBoy), TRAINER_PAL(RS_POKEMANIAC, gTrainerPalette_RSPokeManiac), TRAINER_PAL(RS_SWIMMER_M, gTrainerPalette_RSSwimmerM), TRAINER_PAL(RS_BLACK_BELT, gTrainerPalette_RSBlackBelt), TRAINER_PAL(GUITARIST, gTrainerPalette_Guitarist), TRAINER_PAL(KINDLER, gTrainerPalette_Kindler), TRAINER_PAL(RS_CAMPER, gTrainerPalette_RSCamper), TRAINER_PAL(BUG_MANIAC, gTrainerPalette_BugManiac), TRAINER_PAL(RS_PSYCHIC_M, gTrainerPalette_RSPsychicM), TRAINER_PAL(RS_PSYCHIC_F, gTrainerPalette_RSPsychicF), TRAINER_PAL(RS_GENTLEMAN, gTrainerPalette_RSGentleman), TRAINER_PAL(ELITE_FOUR_SIDNEY, gTrainerPalette_EliteFourSidney), TRAINER_PAL(ELITE_FOUR_PHOEBE, gTrainerPalette_EliteFourPhoebe), TRAINER_PAL(LEADER_ROXANNE, gTrainerPalette_LeaderRoxanne), TRAINER_PAL(LEADER_BRAWLY, gTrainerPalette_LeaderBrawly), TRAINER_PAL(LEADER_TATE_AND_LIZA, gTrainerPalette_LeaderTateAndLiza), TRAINER_PAL(SCHOOL_KID_M, gTrainerPalette_SchoolKidM), TRAINER_PAL(SCHOOL_KID_F, gTrainerPalette_SchoolKidF), TRAINER_PAL(SR_AND_JR, gTrainerPalette_SrAndJr), TRAINER_PAL(POKEFAN_M, gTrainerPalette_PokefanM), TRAINER_PAL(POKEFAN_F, gTrainerPalette_PokefanF), TRAINER_PAL(EXPERT_M, gTrainerPalette_ExpertM), TRAINER_PAL(EXPERT_F, gTrainerPalette_ExpertF), TRAINER_PAL(RS_YOUNGSTER, gTrainerPalette_RSYoungster), TRAINER_PAL(CHAMPION_STEVEN, gTrainerPalette_ChampionSteven), TRAINER_PAL(RS_FISHERMAN, gTrainerPalette_RSFisherman), TRAINER_PAL(CYCLING_TRIATHLETE_M, gTrainerPalette_CyclingTriathleteM), TRAINER_PAL(CYCLING_TRIATHLETE_F, gTrainerPalette_CyclingTriathleteF), TRAINER_PAL(RUNNING_TRIATHLETE_M, gTrainerPalette_RunningTriathleteM), TRAINER_PAL(RUNNING_TRIATHLETE_F, gTrainerPalette_RunningTriathleteF), TRAINER_PAL(SWIMMING_TRIATHLETE_M, gTrainerPalette_SwimmingTriathleteM), TRAINER_PAL(SWIMMING_TRIATHLETE_F, gTrainerPalette_SwimmingTriathleteF), TRAINER_PAL(DRAGON_TAMER, gTrainerPalette_DragonTamer), TRAINER_PAL(RS_BIRD_KEEPER, gTrainerPalette_RSBirdKeeper), TRAINER_PAL(NINJA_BOY, gTrainerPalette_NinjaBoy), TRAINER_PAL(BATTLE_GIRL, gTrainerPalette_BattleGirl), TRAINER_PAL(PARASOL_LADY, gTrainerPalette_ParasolLady), TRAINER_PAL(RS_SWIMMER_F, gTrainerPalette_RSSwimmerF), TRAINER_PAL(RS_PICNICKER, gTrainerPalette_RSPicnicker), TRAINER_PAL(RS_TWINS, gTrainerPalette_RSTwins), TRAINER_PAL(RS_SAILOR, gTrainerPalette_RSSailor), TRAINER_PAL(COLLECTOR, gTrainerPalette_Collector), TRAINER_PAL(WALLY, gTrainerPalette_Wally), TRAINER_PAL(RS_BRENDAN_1, gTrainerPalette_RSBrendan1), TRAINER_PAL(RS_MAY_1, gTrainerPalette_RSMay1), TRAINER_PAL(RS_POKEMON_BREEDER_M, gTrainerPalette_RSPokemonBreederM), TRAINER_PAL(RS_POKEMON_BREEDER_F, gTrainerPalette_RSPokemonBreederF), TRAINER_PAL(RS_POKEMON_RANGER_M, gTrainerPalette_RSPokemonRangerM), TRAINER_PAL(RS_POKEMON_RANGER_F, gTrainerPalette_RSPokemonRangerF), TRAINER_PAL(MAGMA_LEADER_MAXIE, gTrainerPalette_MagmaLeaderMaxie), TRAINER_PAL(MAGMA_GRUNT_M, gTrainerPalette_MagmaGruntM), TRAINER_PAL(MAGMA_GRUNT_F, gTrainerPalette_MagmaGruntF), TRAINER_PAL(RS_LASS, gTrainerPalette_RSLass), TRAINER_PAL(RS_BUG_CATCHER, gTrainerPalette_RSBugCatcher), TRAINER_PAL(RS_HIKER, gTrainerPalette_RSHiker), TRAINER_PAL(RS_YOUNG_COUPLE, gTrainerPalette_RSYoungCouple), TRAINER_PAL(OLD_COUPLE, gTrainerPalette_OldCouple), TRAINER_PAL(RS_SIS_AND_BRO, gTrainerPalette_RSSisAndBro), TRAINER_PAL(AQUA_ADMIN_M, gTrainerPalette_AquaAdminM), TRAINER_PAL(AQUA_ADMIN_F, gTrainerPalette_AquaAdminF), TRAINER_PAL(MAGMA_ADMIN_M, gTrainerPalette_MagmaAdminM), TRAINER_PAL(MAGMA_ADMIN_F, gTrainerPalette_MagmaAdminF), TRAINER_PAL(LEADER_WATTSON, gTrainerPalette_LeaderWattson), TRAINER_PAL(LEADER_FLANNERY, gTrainerPalette_LeaderFlannery), TRAINER_PAL(LEADER_NORMAN, gTrainerPalette_LeaderNorman), TRAINER_PAL(LEADER_WINONA, gTrainerPalette_LeaderWinona), TRAINER_PAL(LEADER_WALLACE, gTrainerPalette_LeaderWallace), TRAINER_PAL(ELITE_FOUR_GLACIA, gTrainerPalette_EliteFourGlacia), TRAINER_PAL(ELITE_FOUR_DRAKE, gTrainerPalette_EliteFourDrake), TRAINER_PAL(YOUNGSTER, gTrainerPalette_Youngster), TRAINER_PAL(BUG_CATCHER, gTrainerPalette_BugCatcher), TRAINER_PAL(LASS, gTrainerPalette_Lass), TRAINER_PAL(SAILOR, gTrainerPalette_Sailor), TRAINER_PAL(CAMPER, gTrainerPalette_Camper), TRAINER_PAL(PICNICKER, gTrainerPalette_Picnicker), TRAINER_PAL(POKEMANIAC, gTrainerPalette_PokeManiac), TRAINER_PAL(SUPER_NERD, gTrainerPalette_SuperNerd), TRAINER_PAL(HIKER, gTrainerPalette_Hiker), TRAINER_PAL(BIKER, gTrainerPalette_Biker), TRAINER_PAL(BURGLAR, gTrainerPalette_Burglar), TRAINER_PAL(ENGINEER, gTrainerPalette_Engineer), TRAINER_PAL(FISHERMAN, gTrainerPalette_Fisherman), TRAINER_PAL(SWIMMER_M, gTrainerPalette_SwimmerM), TRAINER_PAL(CUE_BALL, gTrainerPalette_CueBall), TRAINER_PAL(GAMER, gTrainerPalette_Gamer), TRAINER_PAL(BEAUTY, gTrainerPalette_Beauty), TRAINER_PAL(SWIMMER_F, gTrainerPalette_SwimmerF), TRAINER_PAL(PSYCHIC_M, gTrainerPalette_PsychicM), TRAINER_PAL(ROCKER, gTrainerPalette_Rocker), TRAINER_PAL(JUGGLER, gTrainerPalette_Juggler), TRAINER_PAL(TAMER, gTrainerPalette_Tamer), TRAINER_PAL(BIRD_KEEPER, gTrainerPalette_BirdKeeper), TRAINER_PAL(BLACK_BELT, gTrainerPalette_BlackBelt), TRAINER_PAL(RIVAL_EARLY, gTrainerPalette_RivalEarly), TRAINER_PAL(SCIENTIST, gTrainerPalette_Scientist), TRAINER_PAL(LEADER_GIOVANNI, gTrainerPalette_LeaderGiovanni), TRAINER_PAL(ROCKET_GRUNT_M, gTrainerPalette_RocketGruntM), TRAINER_PAL(COOLTRAINER_M, gTrainerPalette_CooltrainerM), TRAINER_PAL(COOLTRAINER_F, gTrainerPalette_CooltrainerF), TRAINER_PAL(ELITE_FOUR_LORELEI, gTrainerPalette_EliteFourLorelei), TRAINER_PAL(ELITE_FOUR_BRUNO, gTrainerPalette_EliteFourBruno), TRAINER_PAL(ELITE_FOUR_AGATHA, gTrainerPalette_EliteFourAgatha), TRAINER_PAL(ELITE_FOUR_LANCE, gTrainerPalette_EliteFourLance), TRAINER_PAL(LEADER_BROCK, gTrainerPalette_LeaderBrock), TRAINER_PAL(LEADER_MISTY, gTrainerPalette_LeaderMisty), TRAINER_PAL(LEADER_LT_SURGE, gTrainerPalette_LeaderLtSurge), TRAINER_PAL(LEADER_ERIKA, gTrainerPalette_LeaderErika), TRAINER_PAL(LEADER_KOGA, gTrainerPalette_LeaderKoga), TRAINER_PAL(LEADER_BLAINE, gTrainerPalette_LeaderBlaine), TRAINER_PAL(LEADER_SABRINA, gTrainerPalette_LeaderSabrina), TRAINER_PAL(GENTLEMAN, gTrainerPalette_Gentleman), TRAINER_PAL(RIVAL_LATE, gTrainerPalette_RivalLate), TRAINER_PAL(CHAMPION_RIVAL, gTrainerPalette_ChampionRival), TRAINER_PAL(CHANNELER, gTrainerPalette_Channeler), TRAINER_PAL(TWINS, gTrainerPalette_Twins), TRAINER_PAL(COOL_COUPLE, gTrainerPalette_CoolCouple), TRAINER_PAL(YOUNG_COUPLE, gTrainerPalette_YoungCouple), TRAINER_PAL(CRUSH_KIN, gTrainerPalette_CrushKin), TRAINER_PAL(SIS_AND_BRO, gTrainerPalette_SisAndBro), TRAINER_PAL(PROFESSOR_OAK, gTrainerPalette_ProfessorOak), TRAINER_PAL(RS_BRENDAN_2, gTrainerPalette_RSBrendan2), TRAINER_PAL(RS_MAY_2, gTrainerPalette_RSMay2), TRAINER_PAL(RED, gTrainerPalette_Red), TRAINER_PAL(LEAF, gTrainerPalette_Leaf), TRAINER_PAL(ROCKET_GRUNT_F, gTrainerPalette_RocketGruntF), TRAINER_PAL(PSYCHIC_F, gTrainerPalette_PsychicF), TRAINER_PAL(CRUSH_GIRL, gTrainerPalette_CrushGirl), TRAINER_PAL(TUBER_F, gTrainerPalette_TuberF), TRAINER_PAL(POKEMON_BREEDER, gTrainerPalette_PokemonBreeder), TRAINER_PAL(POKEMON_RANGER_M, gTrainerPalette_PokemonRangerM), TRAINER_PAL(POKEMON_RANGER_F, gTrainerPalette_PokemonRangerF), TRAINER_PAL(AROMA_LADY, gTrainerPalette_AromaLady), TRAINER_PAL(RUIN_MANIAC, gTrainerPalette_RuinManiac), TRAINER_PAL(LADY, gTrainerPalette_Lady), TRAINER_PAL(PAINTER, gTrainerPalette_Painter), TRAINER_PAL(EM_BRENDAN, gTrainerPalette_EmBrendan), TRAINER_PAL(EM_MAY, gTrainerPalette_EmMay), TRAINER_PAL(MASTER_BEAUTY, gTrainerPalette_MasterBeauty), TRAINER_PAL(MASTER_BIRD_KEEPER, gTrainerPalette_MasterBirdKeeper), TRAINER_PAL(MASTER_COOLTRAINER_M, gTrainerPalette_MasterCooltrainerM), TRAINER_PAL(MASTER_BLACK_BELT, gTrainerPalette_MasterBlackBelt), TRAINER_PAL(MASTER_BUG_CATCHER, gTrainerPalette_MasterBugCatcher), TRAINER_PAL(MASTER_HIKER, gTrainerPalette_MasterHiker), TRAINER_PAL(MASTER_LASS, gTrainerPalette_MasterLass), TRAINER_PAL(MASTER_PSYCHIC_M, gTrainerPalette_MasterPsychicM), TRAINER_PAL(MASTER_SCIENTIST, gTrainerPalette_MasterScientist), TRAINER_PAL(MASTER_YOUNGSTER, gTrainerPalette_MasterYoungster), TRAINER_PAL(MASTER_SWIMMER, gTrainerPalette_MasterSwimmer), }; ================================================ FILE: src/data/trainer_parties.h ================================================ static const struct TrainerMonItemCustomMoves sParty_LeaderLtSurgeRematch[] = { { .iv = 255, .lvl = 63, .species = SPECIES_ELECTRODE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_EXPLOSION, MOVE_THUNDER_WAVE}, }, { .iv = 255, .lvl = 64, .species = SPECIES_JOLTEON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_BATON_PASS, MOVE_WISH}, }, { .iv = 255, .lvl = 64, .species = SPECIES_ELECTABUZZ, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_ICE_PUNCH, MOVE_TOXIC, MOVE_CROSS_CHOP}, }, { .iv = 255, .lvl = 63, .species = SPECIES_AMPHAROS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_FIRE_PUNCH, MOVE_REFLECT, MOVE_THUNDER_WAVE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_MAGNETON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_METAL_SOUND, MOVE_SUBSTITUTE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_RAICHU, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_FOCUS_PUNCH}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_LeaderLtSurgeRematchChallenge[] = { { .iv = 7, //grass .lvl = 63, .evs = { 0, 164, 0, 176, 168, 0}, .nature = NATURE_HASTY, .species = SPECIES_ELECTRODE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_EXPLOSION, MOVE_HIDDEN_POWER}, }, { .iv = 8, //ice .lvl = 64, .evs = { 76, 0, 0, 252, 180, 0}, .nature = NATURE_TIMID, .species = SPECIES_JOLTEON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_HIDDEN_POWER, MOVE_BATON_PASS, MOVE_WISH}, }, { .iv = 7, //grass .lvl = 64, .evs = { 0, 84, 0, 216, 208, 0}, .nature = NATURE_MILD, .species = SPECIES_ELECTABUZZ, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_ICE_PUNCH, MOVE_HIDDEN_POWER, MOVE_CROSS_CHOP}, }, { .iv = 8, //ice .lvl = 63, .evs = { 252, 0, 0, 4, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_AMPHAROS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_HIDDEN_POWER, MOVE_REFLECT, MOVE_THUNDER_WAVE}, }, { .iv = 7, //grass .lvl = 66, .evs = { 68, 0, 0, 188, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_MAGNETON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_HIDDEN_POWER, MOVE_METAL_SOUND, MOVE_SUBSTITUTE}, }, { .iv = 8, //ice .lvl = 66, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_RAICHU, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_HIDDEN_POWER}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderErikaRematch[] = { { .iv = 255, .lvl = 63, .species = SPECIES_JUMPLUFF, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ATTRACT, MOVE_SLEEP_POWDER, MOVE_SUBSTITUTE, MOVE_LEECH_SEED}, }, { .iv = 255, .lvl = 64, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_SLEEP_POWDER, MOVE_LEECH_SEED, MOVE_EXPLOSION}, }, { .iv = 255, .lvl = 64, .species = SPECIES_TANGELA, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUNNY_DAY, MOVE_SLEEP_POWDER, MOVE_SOLAR_BEAM, MOVE_TOXIC}, }, { .iv = 255, .lvl = 63, .species = SPECIES_PARASECT, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SPORE, MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_VICTREEBEL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB, MOVE_SLEEP_POWDER, MOVE_GIGA_DRAIN}, }, { .iv = 255, .lvl = 66, .species = SPECIES_VILEPLUME, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUNNY_DAY, MOVE_MOONLIGHT, MOVE_SOLAR_BEAM, MOVE_SLEEP_POWDER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_LeaderErikaRematchChallenge[] = { { .iv = 3, //flying .lvl = 63, .evs = { 148, 140, 0, 220, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_JUMPLUFF, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_SLEEP_POWDER, MOVE_SUBSTITUTE, MOVE_LEECH_SEED}, }, { .iv = 255, .lvl = 64, .evs = { 96, 0, 0, 60, 252, 96}, .nature = NATURE_MODEST, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_SLEEP_POWDER, MOVE_LEECH_SEED, MOVE_EXPLOSION}, }, { .iv = 9, //fire .lvl = 64, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_TANGELA, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUNNY_DAY, MOVE_SLEEP_POWDER, MOVE_SOLAR_BEAM, MOVE_HIDDEN_POWER}, }, { .iv = 2, //ground .lvl = 63, .evs = { 252, 252, 0, 4, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_PARASECT, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SPORE, MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB, MOVE_HIDDEN_POWER}, }, { .iv = 255, .lvl = 66, .evs = { 128, 252, 0, 128, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_VICTREEBEL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB, MOVE_SLEEP_POWDER, MOVE_GIGA_DRAIN}, }, { .iv = 9, //fire .lvl = 66, .evs = { 120, 0, 0, 126, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_VILEPLUME, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_SOLAR_BEAM, MOVE_SLEEP_POWDER}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderKogaRematch[] = { { .iv = 255, .lvl = 63, .species = SPECIES_QWILFISH, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_SLUDGE_BOMB, MOVE_DESTINY_BOND, MOVE_SPIKES}, }, { .iv = 255, .lvl = 64, .species = SPECIES_ARIADOS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_SIGNAL_BEAM, MOVE_AGILITY, MOVE_BATON_PASS}, }, { .iv = 255, .lvl = 64, .species = SPECIES_CROBAT, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE, MOVE_DOUBLE_EDGE, MOVE_TOXIC}, }, { .iv = 255, .lvl = 63, .species = SPECIES_MUK, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SLUDGE_BOMB, MOVE_FIRE_BLAST, MOVE_CURSE, MOVE_EXPLOSION}, }, { .iv = 255, .lvl = 66, .species = SPECIES_TENTACRUEL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_GIGA_DRAIN, MOVE_SUBSTITUTE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_WEEZING, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_PAIN_SPLIT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_LeaderKogaRematchChallenge[] = { { .iv = 255, .lvl = 63, .evs = { 252, 0, 232, 0, 0, 24}, .nature = NATURE_JOLLY, .species = SPECIES_QWILFISH, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_SLUDGE_BOMB, MOVE_DESTINY_BOND, MOVE_SPIKES}, }, { .iv = 255, .lvl = 64, .evs = { 252, 40, 108, 0, 0, 108}, .nature = NATURE_IMPISH, .species = SPECIES_ARIADOS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_SIGNAL_BEAM, MOVE_AGILITY, MOVE_BATON_PASS}, }, { .iv = 4, //fighting .lvl = 64, .evs = { 80, 252, 0, 176, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_CROBAT, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE, MOVE_HIDDEN_POWER, MOVE_SHADOW_BALL}, }, { .iv = 1, //ghost .lvl = 63, .evs = { 252, 156, 0, 0, 0, 100}, .nature = NATURE_SASSY, .species = SPECIES_MUK, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SLUDGE_BOMB, MOVE_HIDDEN_POWER, MOVE_CURSE, MOVE_EXPLOSION}, }, { .iv = 10, //electric .lvl = 66, .evs = { 72, 0, 0, 184, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_TENTACRUEL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_GIGA_DRAIN, MOVE_HIDDEN_POWER}, }, { .iv = 255, .lvl = 66, .evs = { 252, 178, 0, 12, 68, 0}, .nature = NATURE_BRAVE, .species = SPECIES_WEEZING, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_PAIN_SPLIT}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderSabrinaRematch[] = { { .iv = 255, .lvl = 63, .species = SPECIES_MR_MIME, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_BATON_PASS, MOVE_SUBSTITUTE}, }, { .iv = 255, .lvl = 64, .species = SPECIES_HYPNO, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SEISMIC_TOSS, MOVE_REFLECT, MOVE_HYPNOSIS, MOVE_PSYCHIC}, }, { .iv = 255, .lvl = 64, .species = SPECIES_ESPEON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_BATON_PASS, MOVE_SUBSTITUTE}, }, { .iv = 255, .lvl = 63, .species = SPECIES_SLOWBRO, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_EARTHQUAKE, MOVE_CURSE, MOVE_SHADOW_BALL, MOVE_REST}, }, { .iv = 255, .lvl = 66, .species = SPECIES_JYNX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_FAKE_OUT, MOVE_PSYCHIC, MOVE_LOVELY_KISS, MOVE_ICE_BEAM}, }, { .iv = 255, .lvl = 66, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_ICE_PUNCH, MOVE_FIRE_PUNCH, MOVE_RECOVER}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_LeaderSabrinaRematchChallenge[] = { { .iv = 255, .lvl = 63, .evs = { 252, 0, 0, 0, 60, 196}, .nature = NATURE_CALM, .species = SPECIES_MR_MIME, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_BATON_PASS, MOVE_SUBSTITUTE}, }, { .iv = 255, .lvl = 64, .evs = { 252, 0, 192, 64, 0, 0}, .nature = NATURE_BOLD, .species = SPECIES_HYPNO, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SEISMIC_TOSS, MOVE_REFLECT, MOVE_HYPNOSIS, MOVE_PSYCHIC}, }, { .iv = 255, .lvl = 64, .evs = { 200, 0, 0, 72, 0, 236}, .nature = NATURE_TIMID, .species = SPECIES_ESPEON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_BATON_PASS, MOVE_SUBSTITUTE}, }, { .iv = 255, .lvl = 63, .evs = { 252, 176, 0, 0, 0, 80}, .nature = NATURE_BRAVE, .species = SPECIES_SLOWBRO, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_EARTHQUAKE, MOVE_CURSE, MOVE_SHADOW_BALL, MOVE_SURF}, }, { .iv = 255, .lvl = 66, .evs = { 0, 0, 4, 252, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_JYNX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_FAKE_OUT, MOVE_PSYCHIC, MOVE_LOVELY_KISS, MOVE_ICE_BEAM}, }, { .iv = 255, .lvl = 66, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_ICE_PUNCH, MOVE_FIRE_PUNCH, MOVE_RECOVER}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderBlaineRematch[] = { { .iv = 255, .lvl = 63, .species = SPECIES_NINETALES, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUNNY_DAY, MOVE_WILL_O_WISP, MOVE_SUBSTITUTE, MOVE_FIRE_BLAST}, }, { .iv = 255, .lvl = 64, .species = SPECIES_MAGMAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDER_PUNCH, MOVE_CROSS_CHOP, MOVE_FLAMETHROWER, MOVE_FIRE_BLAST}, }, { .iv = 255, .lvl = 64, .species = SPECIES_RAPIDASH, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SUNNY_DAY, MOVE_HYPNOSIS, MOVE_SOLAR_BEAM, MOVE_FIRE_BLAST}, }, { .iv = 255, .lvl = 63, .species = SPECIES_HOUNDOOM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CRUNCH, MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_REST}, }, { .iv = 255, .lvl = 66, .species = SPECIES_FLAREON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_WISH, MOVE_FLAMETHROWER, MOVE_PROTECT, MOVE_BATON_PASS}, }, { .iv = 255, .lvl = 66, .species = SPECIES_ARCANINE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HOWL, MOVE_EXTREME_SPEED, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_LeaderBlaineRematchChallenge[] = { { .iv = 7, //grass .lvl = 63, .evs = { 100, 0, 0, 156, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_NINETALES, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUNNY_DAY, MOVE_WILL_O_WISP, MOVE_HIDDEN_POWER, MOVE_FIRE_BLAST}, }, { .iv = 7, //grass .lvl = 64, .evs = { 0, 64, 0, 192, 252, 0}, .nature = NATURE_MILD, .species = SPECIES_MAGMAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDER_PUNCH, MOVE_CROSS_CHOP, MOVE_FLAMETHROWER, MOVE_HIDDEN_POWER}, }, { .iv = 8, //ice .lvl = 64, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_RAPIDASH, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_SOLAR_BEAM, MOVE_FIRE_BLAST}, }, { .iv = 7, //grass .lvl = 63, .evs = { 56, 0, 0, 188, 252, 12}, .nature = NATURE_TIMID, .species = SPECIES_HOUNDOOM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CRUNCH, MOVE_FLAMETHROWER, MOVE_HIDDEN_POWER, MOVE_REST}, }, { .iv = 255, .lvl = 66, .evs = { 252, 0, 0, 0, 4, 252}, .nature = NATURE_CALM, .species = SPECIES_FLAREON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_WISH, MOVE_FLAMETHROWER, MOVE_PROTECT, MOVE_BATON_PASS}, }, { .iv = 1, //ghost .lvl = 66, .evs = {184, 252, 0, 72, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_ARCANINE, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_IRON_TAIL, MOVE_DOUBLE_EDGE, MOVE_HIDDEN_POWER}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PkmnRangerHelena[] = { { .iv = 0, .lvl = 35, .species = SPECIES_NIDOQUEEN, }, { .iv = 0, .lvl = 35, .species = SPECIES_CLEFABLE, }, { .iv = 0, .lvl = 36, .species = SPECIES_WIGGLYTUFF, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PkmnRangerHelena2[] = { { .iv = 0, .lvl = 47, .species = SPECIES_NIDOQUEEN, }, { .iv = 0, .lvl = 47, .species = SPECIES_CLEFABLE, }, { .iv = 0, .lvl = 48, .species = SPECIES_WIGGLYTUFF, }, { .iv = 0, .lvl = 48, .species = SPECIES_AZUMARILL, }, { .iv = 0, .lvl = 50, .species = SPECIES_CHANSEY, }, { .iv = 0, .lvl = 50, .species = SPECIES_DUNSPARCE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CooltrainerAtticus[] = { { .iv = 0, .lvl = 35, .species = SPECIES_NIDOKING, }, { .iv = 0, .lvl = 35, .species = SPECIES_MACHAMP, }, { .iv = 0, .lvl = 36, .species = SPECIES_VICTREEBEL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CooltrainerAtticus2[] = { { .iv = 0, .lvl = 47, .species = SPECIES_NIDOKING, }, { .iv = 0, .lvl = 47, .species = SPECIES_MACHAMP, }, { .iv = 0, .lvl = 48, .species = SPECIES_VICTREEBEL, }, { .iv = 0, .lvl = 48, .species = SPECIES_KABUTOPS, }, { .iv = 0, .lvl = 50, .species = SPECIES_STANTLER, }, { .iv = 0, .lvl = 50, .species = SPECIES_DRAGONITE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanDeforest[] = { { .iv = 0, .lvl = 34, .species = SPECIES_POLIWRATH, }, { .iv = 0, .lvl = 34, .species = SPECIES_SLOWBRO, }, { .iv = 0, .lvl = 35, .species = SPECIES_CLOYSTER, }, { .iv = 0, .lvl = 35, .species = SPECIES_OMASTAR, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanDeforest2[] = { { .iv = 0, .lvl = 47, .species = SPECIES_POLIWRATH, }, { .iv = 0, .lvl = 47, .species = SPECIES_SLOWBRO, }, { .iv = 0, .lvl = 48, .species = SPECIES_POLIWRATH, }, { .iv = 0, .lvl = 48, .species = SPECIES_CLOYSTER, }, { .iv = 0, .lvl = 50, .species = SPECIES_OMASTAR, }, { .iv = 0, .lvl = 50, .species = SPECIES_POLIWRATH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperSpedo[] = { { .iv = 0, .lvl = 36, .species = SPECIES_PIDGEOT, }, { .iv = 0, .lvl = 34, .species = SPECIES_FEAROW, }, { .iv = 0, .lvl = 34, .species = SPECIES_GOLBAT, }, { .iv = 0, .lvl = 34, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperSpedo2[] = { { .iv = 0, .lvl = 47, .species = SPECIES_PIDGEOT, }, { .iv = 0, .lvl = 47, .species = SPECIES_FEAROW, }, { .iv = 0, .lvl = 48, .species = SPECIES_CROBAT, }, { .iv = 0, .lvl = 48, .species = SPECIES_PIDGEOT, }, { .iv = 0, .lvl = 50, .species = SPECIES_PIDGEOTTO, }, { .iv = 0, .lvl = 50, .species = SPECIES_AERODACTYL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CooltrainerCaspara[] = { { .iv = 0, .lvl = 35, .species = SPECIES_VILEPLUME, }, { .iv = 0, .lvl = 36, .species = SPECIES_CHARIZARD, }, { .iv = 0, .lvl = 35, .species = SPECIES_GENGAR, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerCaspara2[] = { { .iv = 0, .lvl = 47, .species = SPECIES_VILEPLUME, .moves = {MOVE_AROMATHERAPY, MOVE_MEGA_DRAIN, MOVE_STUN_SPORE, MOVE_PETAL_DANCE}, }, { .iv = 0, .lvl = 47, .species = SPECIES_CHARIZARD, .moves = {MOVE_WING_ATTACK, MOVE_SLASH, MOVE_DRAGON_RAGE, MOVE_FIRE_SPIN}, }, { .iv = 0, .lvl = 48, .species = SPECIES_GENGAR, .moves = {MOVE_SHADOW_BALL, MOVE_CURSE, MOVE_CONFUSE_RAY, MOVE_NIGHT_SHADE}, }, { .iv = 0, .lvl = 48, .species = SPECIES_AMPHAROS, .moves = {MOVE_COTTON_SPORE, MOVE_THUNDER_PUNCH, MOVE_LIGHT_SCREEN, MOVE_THUNDER}, }, { .iv = 0, .lvl = 50, .species = SPECIES_SUNFLORA, .moves = {MOVE_INGRAIN, MOVE_SUNNY_DAY, MOVE_PETAL_DANCE, MOVE_SOLAR_BEAM}, }, { .iv = 0, .lvl = 50, .species = SPECIES_PORYGON, .moves = {MOVE_LOCK_ON, MOVE_TRI_ATTACK, MOVE_RECYCLE, MOVE_ZAP_CANNON}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleSedef[] = { { .iv = 0, .lvl = 34, .species = SPECIES_DEWGONG, }, { .iv = 0, .lvl = 34, .species = SPECIES_TENTACRUEL, }, { .iv = 0, .lvl = 36, .species = SPECIES_BLASTOISE, }, { .iv = 0, .lvl = 35, .species = SPECIES_DEWGONG, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleSedef2[] = { { .iv = 0, .lvl = 47, .species = SPECIES_BLASTOISE, }, { .iv = 0, .lvl = 47, .species = SPECIES_POLITOED, }, { .iv = 0, .lvl = 48, .species = SPECIES_SLOWKING, }, { .iv = 0, .lvl = 48, .species = SPECIES_DEWGONG, }, { .iv = 0, .lvl = 50, .species = SPECIES_TENTACRUEL, }, { .iv = 0, .lvl = 50, .species = SPECIES_MANTINE, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_MasterOak[] = { { .iv = 1, //ghost .lvl = 80, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_TAUROS, .heldItem = ITEM_SILK_SCARF, .abilityNum = 0, .moves = {MOVE_RETURN, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM}, }, { .iv = 255, //dark .lvl = 81, .evs = { 124, 0, 0, 96, 188, 96}, .nature = NATURE_MODEST, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_LEECH_SEED, MOVE_HIDDEN_POWER, MOVE_PSYCHIC}, }, { .iv = 4, //fighting .lvl = 81, .evs = { 252, 252, 0, 4, 0, 0}, .nature = NATURE_BRAVE, .species = SPECIES_ARCANINE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HOWL, MOVE_EXTREME_SPEED, MOVE_HIDDEN_POWER, MOVE_OVERHEAT}, }, { .iv = 6, //rock .lvl = 80, .evs = { 68, 252, 0, 188, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_GYARADOS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_DOUBLE_EDGE}, }, { .iv = 8, //ice .lvl = 80, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_RAICHU, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_THUNDERBOLT, MOVE_HIDDEN_POWER, MOVE_SURF}, }, { .iv = 255, .lvl = 82, .evs = { 144, 96, 132, 0, 0, 136}, .nature = NATURE_CAREFUL, .species = SPECIES_SNORLAX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CURSE, MOVE_SHADOW_BALL, MOVE_REST, MOVE_RETURN}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_LeaderMistyRematchChallenge[] = { { .iv = 255, .lvl = 63, .evs = { 72, 0, 0, 184, 244, 184}, .nature = NATURE_TIMID, .species = SPECIES_CLOYSTER, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_PROTECT, MOVE_ICE_BEAM}, }, { .iv = 255, .lvl = 64, .evs = { 40, 0, 0, 0, 252, 216}, .nature = NATURE_MODEST, .species = SPECIES_LANTURN, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_SURF, MOVE_REST, MOVE_SLEEP_TALK}, }, { .iv = 1, //ghost .lvl = 64, .evs = { 252, 252, 0, 4, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_AZUMARILL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_HIDDEN_POWER, MOVE_ATTRACT}, }, { .iv = 6, //rock .lvl = 63, .evs = { 252, 64, 0, 0, 0, 192}, .nature = NATURE_SASSY, .species = SPECIES_QUAGSIRE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_CURSE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_REST}, }, { .iv = 3, //flying .lvl = 66, .evs = { 68, 252, 0, 188, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_GYARADOS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_THUNDER_WAVE}, }, { .iv = 255, .lvl = 66, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_STARMIE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_HYDRO_PUMP, MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_PSYCHIC}, }, }; // Trainer party data exists for all of the RS trainer classes, but // are only filled with one of the following placeholder pokemon. // The actual FRLG trainer party data starts after these. #define DUMMY_TRAINER_MON \ { \ .lvl = 5, \ .species = SPECIES_EKANS, \ } #define DUMMY_TRAINER_MON_IV \ { \ .iv = 100, \ .lvl = 5, \ .species = SPECIES_EKANS, \ } static const struct TrainerMonNoItemDefaultMoves sParty_EliteFourSidney[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_EliteFourPhoebe[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_LeaderRoxanne[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_LeaderBrawly[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_LeaderTateLiza[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_SchoolKidM[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_SchoolKidF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_SrAndJr[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_PokefanM[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_PokefanF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_ExpertM[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_ExpertF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSYoungster[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSChampion[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSFisherman[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_CyclingTriathleteM[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_CyclingTriathleteF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RunningTriathleteM[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RunningTriathleteF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmingTriathleteM[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmingTriathleteF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_DragonTamer[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSBirdKeeper[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_NinjaBoy[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_BattleGirl[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_ParasolLady[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSSwimmerF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSPicnicker[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSTwins[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSSailor[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_BoarderM[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_BoarderF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_Collector[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_Wally[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_Brendan[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_Brendan2[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_Brendan3[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_May[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_May2[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_May3[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSPkmnBreederM[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSPkmnBreederF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSPkmnRangerM[] = {DUMMY_TRAINER_MON_IV}; static const struct TrainerMonNoItemDefaultMoves sParty_RSPkmnRangerF[] = {DUMMY_TRAINER_MON_IV}; static const struct TrainerMonNoItemDefaultMoves sParty_MagmaLeader[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_MagmaGruntM[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_MagmaGruntF[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSLass[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSBugCatcher[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSHiker[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSYoungCouple[] = {DUMMY_TRAINER_MON, DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_OldCouple[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_RSSisAndBro[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_AquaAdminMatt[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_AquaAdminShelly[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_MagmaAdminTabitha[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_MagmaAdminCourtney[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_LeaderWattson[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_LeaderFlannery[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_LeaderNorman[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_LeaderWinona[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_LeaderWallace[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_EliteFourGlacia[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_EliteFourDrake[] = {DUMMY_TRAINER_MON}; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterBen[] = { { .iv = 0, .lvl = 11, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 11, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterCalvin[] = { { .iv = 0, .lvl = 14, .species = SPECIES_SPEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterJosh[] = { { .iv = 0, .lvl = 10, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 10, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 10, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTimmy[] = { { .iv = 0, .lvl = 14, .species = SPECIES_SANDSHREW, }, { .iv = 0, .lvl = 14, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterJoey[] = { { .iv = 0, .lvl = 15, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 15, .species = SPECIES_SPEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDan[] = { { .iv = 0, .lvl = 17, .species = SPECIES_SLOWPOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterChad[] = { { .iv = 0, .lvl = 14, .species = SPECIES_EKANS, }, { .iv = 0, .lvl = 14, .species = SPECIES_SANDSHREW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTyler[] = { { .iv = 0, .lvl = 21, .species = SPECIES_NIDORAN_M, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterEddie[] = { { .iv = 0, .lvl = 21, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDillon[] = { { .iv = 0, .lvl = 19, .species = SPECIES_SANDSHREW, }, { .iv = 0, .lvl = 19, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterYasu[] = { { .iv = 0, .lvl = 17, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 17, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 17, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDave[] = { { .iv = 0, .lvl = 18, .species = SPECIES_NIDORAN_M, }, { .iv = 0, .lvl = 18, .species = SPECIES_NIDORINO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterBen2[] = { { .iv = 20, .lvl = 17, .species = SPECIES_RATTATA, }, { .iv = 20, .lvl = 17, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherRick[] = { { .iv = 0, .lvl = 6, .species = SPECIES_WEEDLE, }, { .iv = 0, .lvl = 6, .species = SPECIES_CATERPIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherDoug[] = { { .iv = 0, .lvl = 7, .species = SPECIES_WEEDLE, }, { .iv = 0, .lvl = 7, .species = SPECIES_KAKUNA, }, { .iv = 0, .lvl = 7, .species = SPECIES_WEEDLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherSammy[] = { { .iv = 0, .lvl = 9, .species = SPECIES_WEEDLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherColton[] = { { .iv = 0, .lvl = 10, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 10, .species = SPECIES_WEEDLE, }, { .iv = 0, .lvl = 10, .species = SPECIES_CATERPIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherGreg[] = { { .iv = 0, .lvl = 9, .species = SPECIES_WEEDLE, }, { .iv = 0, .lvl = 9, .species = SPECIES_KAKUNA, }, { .iv = 0, .lvl = 9, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 9, .species = SPECIES_METAPOD, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherJames[] = { { .iv = 0, .lvl = 11, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 11, .species = SPECIES_METAPOD, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherKent[] = { { .iv = 0, .lvl = 11, .species = SPECIES_WEEDLE, }, { .iv = 0, .lvl = 11, .species = SPECIES_KAKUNA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherRobby[] = { { .iv = 0, .lvl = 10, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 10, .species = SPECIES_METAPOD, }, { .iv = 0, .lvl = 10, .species = SPECIES_CATERPIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherCale[] = { { .iv = 0, .lvl = 10, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 10, .species = SPECIES_WEEDLE, }, { .iv = 0, .lvl = 10, .species = SPECIES_METAPOD, }, { .iv = 0, .lvl = 10, .species = SPECIES_KAKUNA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherKeigo[] = { { .iv = 0, .lvl = 16, .species = SPECIES_WEEDLE, }, { .iv = 0, .lvl = 16, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 16, .species = SPECIES_WEEDLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherElijah[] = { { .iv = 0, .lvl = 20, .species = SPECIES_BUTTERFREE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher2[] = { { .iv = 0, .lvl = 18, .species = SPECIES_METAPOD, }, { .iv = 0, .lvl = 18, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 18, .species = SPECIES_VENONAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherBrent[] = { { .iv = 0, .lvl = 19, .species = SPECIES_BEEDRILL, }, { .iv = 0, .lvl = 19, .species = SPECIES_BEEDRILL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherConner[] = { { .iv = 0, .lvl = 20, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 20, .species = SPECIES_WEEDLE, }, { .iv = 0, .lvl = 20, .species = SPECIES_VENONAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassJanice[] = { { .iv = 0, .lvl = 9, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 9, .species = SPECIES_PIDGEY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassSally[] = { { .iv = 0, .lvl = 10, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 10, .species = SPECIES_NIDORAN_F, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassRobin[] = { { .iv = 0, .lvl = 14, .species = SPECIES_JIGGLYPUFF, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassCrissy[] = { { .iv = 0, .lvl = 31, .species = SPECIES_PARAS, }, { .iv = 0, .lvl = 31, .species = SPECIES_PARAS, }, { .iv = 0, .lvl = 31, .species = SPECIES_PARASECT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassMiriam[] = { { .iv = 0, .lvl = 11, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 11, .species = SPECIES_BELLSPROUT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassIris[] = { { .iv = 0, .lvl = 14, .species = SPECIES_CLEFAIRY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassReli[] = { { .iv = 0, .lvl = 16, .species = SPECIES_NIDORAN_M, }, { .iv = 0, .lvl = 16, .species = SPECIES_NIDORAN_F, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassAli[] = { { .iv = 0, .lvl = 12, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 12, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 12, .species = SPECIES_BELLSPROUT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Lass2[] = { { .iv = 0, .lvl = 15, .species = SPECIES_NIDORAN_M, }, { .iv = 0, .lvl = 15, .species = SPECIES_NIDORAN_F, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassHaley[] = { { .iv = 0, .lvl = 13, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 13, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 13, .species = SPECIES_ODDISH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassAnn[] = { { .iv = 0, .lvl = 18, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 18, .species = SPECIES_NIDORAN_F, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassDawn[] = { { .iv = 0, .lvl = 18, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 18, .species = SPECIES_PIKACHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassPaige[] = { { .iv = 0, .lvl = 23, .species = SPECIES_NIDORAN_F, }, { .iv = 0, .lvl = 23, .species = SPECIES_NIDORINA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassAndrea[] = { { .iv = 0, .lvl = 24, .species = SPECIES_MEOWTH, }, { .iv = 0, .lvl = 24, .species = SPECIES_MEOWTH, }, { .iv = 0, .lvl = 24, .species = SPECIES_MEOWTH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassMegan[] = { { .iv = 0, .lvl = 19, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 19, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 19, .species = SPECIES_NIDORAN_M, }, { .iv = 0, .lvl = 19, .species = SPECIES_MEOWTH, }, { .iv = 0, .lvl = 19, .species = SPECIES_PIKACHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassJulia[] = { { .iv = 0, .lvl = 22, .species = SPECIES_CLEFAIRY, }, { .iv = 0, .lvl = 22, .species = SPECIES_CLEFAIRY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassKay[] = { { .iv = 0, .lvl = 23, .species = SPECIES_BELLSPROUT, }, { .iv = 0, .lvl = 23, .species = SPECIES_WEEPINBELL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassLisa[] = { { .iv = 0, .lvl = 23, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 23, .species = SPECIES_GLOOM, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SailorEdmond[] = { { .iv = 0, .lvl = 18, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 18, .species = SPECIES_SHELLDER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SailorTrevor[] = { { .iv = 0, .lvl = 17, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 17, .species = SPECIES_TENTACOOL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SailorLeonard[] = { { .iv = 0, .lvl = 21, .species = SPECIES_SHELLDER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SailorDuncan[] = { { .iv = 0, .lvl = 17, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 17, .species = SPECIES_SHELLDER, }, { .iv = 0, .lvl = 17, .species = SPECIES_TENTACOOL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SailorHuey[] = { { .iv = 0, .lvl = 18, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 18, .species = SPECIES_STARYU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SailorDylan[] = { { .iv = 0, .lvl = 17, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 17, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 17, .species = SPECIES_HORSEA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SailorPhillip[] = { { .iv = 0, .lvl = 20, .species = SPECIES_MACHOP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SailorDwayne[] = { { .iv = 0, .lvl = 21, .species = SPECIES_PIKACHU, }, { .iv = 0, .lvl = 21, .species = SPECIES_PIKACHU, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CamperLiam[] = { { .iv = 0, .lvl = 10, .species = SPECIES_GEODUDE, .moves = {MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_NONE, MOVE_NONE}, }, { .iv = 0, .lvl = 11, .species = SPECIES_SANDSHREW, .moves = {MOVE_SCRATCH, MOVE_DEFENSE_CURL, MOVE_SAND_ATTACK, MOVE_NONE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperShane[] = { { .iv = 0, .lvl = 14, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 14, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperEthan[] = { { .iv = 0, .lvl = 18, .species = SPECIES_MANKEY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperRicky[] = { { .iv = 0, .lvl = 20, .species = SPECIES_SQUIRTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperJeff[] = { { .iv = 0, .lvl = 16, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 16, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Camper2[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperChris[] = { { .iv = 0, .lvl = 21, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 21, .species = SPECIES_CHARMANDER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperDrew[] = { { .iv = 0, .lvl = 19, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 19, .species = SPECIES_SANDSHREW, }, { .iv = 0, .lvl = 19, .species = SPECIES_EKANS, }, { .iv = 0, .lvl = 19, .species = SPECIES_SANDSHREW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerDiana[] = { { .iv = 0, .lvl = 19, .species = SPECIES_GOLDEEN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerNancy[] = { { .iv = 0, .lvl = 16, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 16, .species = SPECIES_PIKACHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIsabelle[] = { { .iv = 0, .lvl = 16, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 16, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 16, .species = SPECIES_PIDGEY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKelsey[] = { { .iv = 0, .lvl = 15, .species = SPECIES_NIDORAN_M, }, { .iv = 0, .lvl = 15, .species = SPECIES_NIDORAN_F, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlicia[] = { { .iv = 0, .lvl = 18, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 18, .species = SPECIES_BELLSPROUT, }, { .iv = 0, .lvl = 18, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 18, .species = SPECIES_BELLSPROUT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerCaitlin[] = { { .iv = 0, .lvl = 23, .species = SPECIES_MEOWTH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerHeidi[] = { { .iv = 0, .lvl = 20, .species = SPECIES_PIKACHU, }, { .iv = 0, .lvl = 20, .species = SPECIES_CLEFAIRY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerCarol[] = { { .iv = 0, .lvl = 21, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 21, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSofia[] = { { .iv = 0, .lvl = 21, .species = SPECIES_JIGGLYPUFF, }, { .iv = 0, .lvl = 21, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 21, .species = SPECIES_MEOWTH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMartha[] = { { .iv = 0, .lvl = 22, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 22, .species = SPECIES_BULBASAUR, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerTina[] = { { .iv = 0, .lvl = 24, .species = SPECIES_BULBASAUR, }, { .iv = 0, .lvl = 24, .species = SPECIES_IVYSAUR, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerHannah[] = { { .iv = 0, .lvl = 24, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 24, .species = SPECIES_MEOWTH, }, { .iv = 0, .lvl = 24, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 24, .species = SPECIES_PIKACHU, }, { .iv = 0, .lvl = 24, .species = SPECIES_MEOWTH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacMark[] = { { .iv = 30, .lvl = 29, .species = SPECIES_RHYHORN, }, { .iv = 30, .lvl = 29, .species = SPECIES_LICKITUNG, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHerman[] = { { .iv = 30, .lvl = 20, .species = SPECIES_CUBONE, }, { .iv = 30, .lvl = 20, .species = SPECIES_SLOWPOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacCooper[] = { { .iv = 30, .lvl = 20, .species = SPECIES_SLOWPOKE, }, { .iv = 30, .lvl = 20, .species = SPECIES_SLOWPOKE, }, { .iv = 30, .lvl = 20, .species = SPECIES_SLOWPOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacSteve[] = { { .iv = 30, .lvl = 22, .species = SPECIES_CHARMANDER, }, { .iv = 30, .lvl = 22, .species = SPECIES_CUBONE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacWinston[] = { { .iv = 30, .lvl = 25, .species = SPECIES_SLOWPOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacDawson[] = { { .iv = 30, .lvl = 40, .species = SPECIES_CHARMELEON, }, { .iv = 30, .lvl = 40, .species = SPECIES_LAPRAS, }, { .iv = 30, .lvl = 40, .species = SPECIES_LICKITUNG, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacAshton[] = { { .iv = 30, .lvl = 23, .species = SPECIES_CUBONE, }, { .iv = 30, .lvl = 23, .species = SPECIES_SLOWPOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdJovan[] = { { .iv = 0, .lvl = 11, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 11, .species = SPECIES_VOLTORB, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdMiguel[] = { { .iv = 0, .lvl = 12, .species = SPECIES_GRIMER, }, { .iv = 0, .lvl = 12, .species = SPECIES_VOLTORB, }, { .iv = 0, .lvl = 12, .species = SPECIES_KOFFING, }, }; static const struct TrainerMonNoItemCustomMoves sParty_SuperNerdAidan[] = { { .iv = 0, .lvl = 20, .species = SPECIES_VOLTORB, .moves = {MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE, MOVE_CHARGE}, }, { .iv = 0, .lvl = 20, .species = SPECIES_KOFFING, .moves = {MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS}, }, { .iv = 0, .lvl = 20, .species = SPECIES_VOLTORB, .moves = {MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE, MOVE_CHARGE}, }, { .iv = 0, .lvl = 20, .species = SPECIES_MAGNEMITE, .moves = {MOVE_SONIC_BOOM, MOVE_SUPERSONIC, MOVE_THUNDER_SHOCK, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdGlenn[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GRIMER, }, { .iv = 0, .lvl = 22, .species = SPECIES_MUK, }, { .iv = 0, .lvl = 22, .species = SPECIES_GRIMER, }, }; static const struct TrainerMonNoItemCustomMoves sParty_SuperNerdLeslie[] = { { .iv = 0, .lvl = 26, .species = SPECIES_KOFFING, .moves = {MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_SMOG, MOVE_SELF_DESTRUCT}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerd1[] = { { .iv = 0, .lvl = 22, .species = SPECIES_KOFFING, }, { .iv = 0, .lvl = 22, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 22, .species = SPECIES_WEEZING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerd2[] = { { .iv = 0, .lvl = 20, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 20, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 20, .species = SPECIES_KOFFING, }, { .iv = 0, .lvl = 20, .species = SPECIES_MAGNEMITE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerd3[] = { { .iv = 0, .lvl = 24, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 24, .species = SPECIES_VOLTORB, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdErik[] = { { .iv = 0, .lvl = 36, .species = SPECIES_VULPIX, }, { .iv = 0, .lvl = 36, .species = SPECIES_VULPIX, }, { .iv = 0, .lvl = 36, .species = SPECIES_NINETALES, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdAvery[] = { { .iv = 0, .lvl = 34, .species = SPECIES_PONYTA, }, { .iv = 0, .lvl = 34, .species = SPECIES_CHARMANDER, }, { .iv = 0, .lvl = 34, .species = SPECIES_VULPIX, }, { .iv = 0, .lvl = 34, .species = SPECIES_GROWLITHE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdDerek[] = { { .iv = 0, .lvl = 41, .species = SPECIES_RAPIDASH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdZac[] = { { .iv = 0, .lvl = 37, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 37, .species = SPECIES_VULPIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerMarcos[] = { { .iv = 0, .lvl = 10, .species = SPECIES_GEODUDE, }, { .iv = 0, .lvl = 10, .species = SPECIES_GEODUDE, }, { .iv = 0, .lvl = 10, .species = SPECIES_ONIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerFranklin[] = { { .iv = 0, .lvl = 15, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 15, .species = SPECIES_GEODUDE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerNob[] = { { .iv = 0, .lvl = 13, .species = SPECIES_GEODUDE, }, { .iv = 0, .lvl = 13, .species = SPECIES_GEODUDE, }, { .iv = 0, .lvl = 13, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 13, .species = SPECIES_GEODUDE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerWayne[] = { { .iv = 0, .lvl = 17, .species = SPECIES_ONIX, }, }; static const struct TrainerMonNoItemCustomMoves sParty_HikerAlan[] = { { .iv = 0, .lvl = 21, .species = SPECIES_GEODUDE, .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL}, }, { .iv = 0, .lvl = 21, .species = SPECIES_ONIX, .moves = {MOVE_HARDEN, MOVE_ROCK_THROW, MOVE_BIND, MOVE_SCREECH}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerBrice[] = { { .iv = 0, .lvl = 20, .species = SPECIES_GEODUDE, }, { .iv = 0, .lvl = 20, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 20, .species = SPECIES_GEODUDE, }, }; static const struct TrainerMonNoItemCustomMoves sParty_HikerClark[] = { { .iv = 0, .lvl = 21, .species = SPECIES_GEODUDE, .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL}, }, { .iv = 0, .lvl = 21, .species = SPECIES_ONIX, .moves = {MOVE_HARDEN, MOVE_ROCK_THROW, MOVE_BIND, MOVE_SCREECH}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerTrent[] = { { .iv = 0, .lvl = 19, .species = SPECIES_ONIX, }, { .iv = 0, .lvl = 19, .species = SPECIES_GRAVELER, }, }; static const struct TrainerMonNoItemCustomMoves sParty_HikerDudley[] = { { .iv = 0, .lvl = 21, .species = SPECIES_GEODUDE, .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL}, }, { .iv = 0, .lvl = 21, .species = SPECIES_GEODUDE, .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL}, }, { .iv = 0, .lvl = 21, .species = SPECIES_GRAVELER, .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_HikerAllen[] = { { .iv = 0, .lvl = 25, .species = SPECIES_GEODUDE, .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerEric[] = { { .iv = 0, .lvl = 20, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 20, .species = SPECIES_ONIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerLenny[] = { { .iv = 0, .lvl = 19, .species = SPECIES_GEODUDE, }, { .iv = 0, .lvl = 19, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 19, .species = SPECIES_GEODUDE, }, { .iv = 0, .lvl = 19, .species = SPECIES_GEODUDE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerOliver[] = { { .iv = 0, .lvl = 20, .species = SPECIES_ONIX, }, { .iv = 0, .lvl = 20, .species = SPECIES_ONIX, }, { .iv = 0, .lvl = 20, .species = SPECIES_GEODUDE, }, }; static const struct TrainerMonNoItemCustomMoves sParty_HikerLucas[] = { { .iv = 0, .lvl = 21, .species = SPECIES_GEODUDE, .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL}, }, { .iv = 0, .lvl = 21, .species = SPECIES_GRAVELER, .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerJared[] = { { .iv = 0, .lvl = 28, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_POISON_GAS}, }, { .iv = 0, .lvl = 28, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerMalik[] = { { .iv = 0, .lvl = 29, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 29, .species = SPECIES_GRIMER, .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerErnest[] = { { .iv = 0, .lvl = 25, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_GRIMER, .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE, MOVE_POUND}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerAlex[] = { { .iv = 0, .lvl = 28, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_GRIMER, .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerLao[] = { { .iv = 0, .lvl = 29, .species = SPECIES_GRIMER, .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE}, }, { .iv = 0, .lvl = 29, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Biker1[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BikerHideo[] = { { .iv = 0, .lvl = 33, .species = SPECIES_WEEZING, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerRuben[] = { { .iv = 0, .lvl = 28, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BikerBilly[] = { { .iv = 0, .lvl = 33, .species = SPECIES_MUK, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerNikolas[] = { { .iv = 0, .lvl = 29, .species = SPECIES_VOLTORB, .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_CHARGE}, }, { .iv = 0, .lvl = 29, .species = SPECIES_VOLTORB, .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_CHARGE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerJaxon[] = { { .iv = 0, .lvl = 29, .species = SPECIES_WEEZING, .moves = {MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 29, .species = SPECIES_MUK, .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerWilliam[] = { { .iv = 0, .lvl = 25, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SELF_DESTRUCT, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerLukas[] = { { .iv = 0, .lvl = 26, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 26, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 26, .species = SPECIES_GRIMER, .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE}, }, { .iv = 0, .lvl = 26, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerIsaac[] = { { .iv = 0, .lvl = 28, .species = SPECIES_GRIMER, .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_GRIMER, .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerGerald[] = { { .iv = 0, .lvl = 29, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 29, .species = SPECIES_MUK, .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Burglar1[] = { { .iv = 0, .lvl = 29, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 29, .species = SPECIES_VULPIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Burglar2[] = { { .iv = 0, .lvl = 33, .species = SPECIES_GROWLITHE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Burglar3[] = { { .iv = 0, .lvl = 28, .species = SPECIES_VULPIX, }, { .iv = 0, .lvl = 28, .species = SPECIES_CHARMANDER, }, { .iv = 0, .lvl = 28, .species = SPECIES_PONYTA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BurglarQuinn[] = { { .iv = 0, .lvl = 36, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 36, .species = SPECIES_VULPIX, }, { .iv = 0, .lvl = 36, .species = SPECIES_NINETALES, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BurglarRamon[] = { { .iv = 0, .lvl = 41, .species = SPECIES_PONYTA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BurglarDusty[] = { { .iv = 0, .lvl = 37, .species = SPECIES_VULPIX, }, { .iv = 0, .lvl = 37, .species = SPECIES_GROWLITHE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BurglarArnie[] = { { .iv = 0, .lvl = 34, .species = SPECIES_CHARMANDER, }, { .iv = 0, .lvl = 34, .species = SPECIES_CHARMELEON, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Burglar4[] = { { .iv = 0, .lvl = 34, .species = SPECIES_CHARMANDER, }, { .iv = 0, .lvl = 34, .species = SPECIES_CHARMELEON, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BurglarSimon[] = { { .iv = 0, .lvl = 38, .species = SPECIES_NINETALES, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BurglarLewis[] = { { .iv = 0, .lvl = 34, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 34, .species = SPECIES_PONYTA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_EngineerBaily[] = { { .iv = 0, .lvl = 21, .species = SPECIES_VOLTORB, }, { .iv = 0, .lvl = 21, .species = SPECIES_MAGNEMITE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_EngineerBraxton[] = { { .iv = 0, .lvl = 21, .species = SPECIES_MAGNEMITE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_EngineerBernie[] = { { .iv = 0, .lvl = 18, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 18, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 18, .species = SPECIES_MAGNETON, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanDale[] = { { .iv = 0, .lvl = 17, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 17, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 17, .species = SPECIES_GOLDEEN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanBarny[] = { { .iv = 0, .lvl = 17, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 17, .species = SPECIES_STARYU, }, { .iv = 0, .lvl = 17, .species = SPECIES_SHELLDER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanNed[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 22, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 22, .species = SPECIES_GOLDEEN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanChip[] = { { .iv = 0, .lvl = 24, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 24, .species = SPECIES_GOLDEEN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanHank[] = { { .iv = 0, .lvl = 27, .species = SPECIES_GOLDEEN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanElliot[] = { { .iv = 0, .lvl = 21, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 21, .species = SPECIES_SHELLDER, }, { .iv = 0, .lvl = 21, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 21, .species = SPECIES_HORSEA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanRonald[] = { { .iv = 0, .lvl = 28, .species = SPECIES_SEAKING, }, { .iv = 0, .lvl = 28, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 28, .species = SPECIES_SEAKING, }, { .iv = 0, .lvl = 28, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanClaude[] = { { .iv = 0, .lvl = 31, .species = SPECIES_SHELLDER, }, { .iv = 0, .lvl = 31, .species = SPECIES_CLOYSTER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanWade[] = { { .iv = 0, .lvl = 27, .species = SPECIES_MAGIKARP, }, { .iv = 0, .lvl = 27, .species = SPECIES_MAGIKARP, }, { .iv = 0, .lvl = 27, .species = SPECIES_MAGIKARP, }, { .iv = 0, .lvl = 27, .species = SPECIES_MAGIKARP, }, { .iv = 0, .lvl = 27, .species = SPECIES_MAGIKARP, }, { .iv = 0, .lvl = 27, .species = SPECIES_MAGIKARP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanNolan[] = { { .iv = 0, .lvl = 33, .species = SPECIES_SEAKING, }, { .iv = 0, .lvl = 33, .species = SPECIES_GOLDEEN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanAndrew[] = { { .iv = 0, .lvl = 24, .species = SPECIES_MAGIKARP, }, { .iv = 0, .lvl = 24, .species = SPECIES_MAGIKARP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleLuis[] = { { .iv = 0, .lvl = 16, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 16, .species = SPECIES_SHELLDER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleRichard[] = { { .iv = 0, .lvl = 30, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 30, .species = SPECIES_SHELLDER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleReece[] = { { .iv = 0, .lvl = 29, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 29, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 29, .species = SPECIES_STARYU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleMatthew[] = { { .iv = 0, .lvl = 30, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 30, .species = SPECIES_POLIWHIRL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDouglas[] = { { .iv = 0, .lvl = 27, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 27, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 27, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 27, .species = SPECIES_GOLDEEN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDavid[] = { { .iv = 0, .lvl = 29, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 29, .species = SPECIES_SHELLDER, }, { .iv = 0, .lvl = 29, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleTony[] = { { .iv = 0, .lvl = 30, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 30, .species = SPECIES_HORSEA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleAxle[] = { { .iv = 0, .lvl = 27, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 27, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 27, .species = SPECIES_STARYU, }, { .iv = 0, .lvl = 27, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 27, .species = SPECIES_TENTACRUEL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleBarry[] = { { .iv = 0, .lvl = 31, .species = SPECIES_SHELLDER, }, { .iv = 0, .lvl = 31, .species = SPECIES_CLOYSTER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDean[] = { { .iv = 0, .lvl = 35, .species = SPECIES_STARYU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDarrin[] = { { .iv = 0, .lvl = 28, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 28, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 28, .species = SPECIES_SEADRA, }, { .iv = 0, .lvl = 28, .species = SPECIES_HORSEA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleSpencer[] = { { .iv = 0, .lvl = 33, .species = SPECIES_SEADRA, }, { .iv = 0, .lvl = 33, .species = SPECIES_TENTACRUEL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleJack[] = { { .iv = 0, .lvl = 37, .species = SPECIES_STARMIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleJerome[] = { { .iv = 0, .lvl = 33, .species = SPECIES_STARYU, }, { .iv = 0, .lvl = 33, .species = SPECIES_WARTORTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleRoland[] = { { .iv = 0, .lvl = 32, .species = SPECIES_POLIWHIRL, }, { .iv = 0, .lvl = 32, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 32, .species = SPECIES_SEADRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallKoji[] = { { .iv = 0, .lvl = 28, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 28, .species = SPECIES_MANKEY, }, { .iv = 0, .lvl = 28, .species = SPECIES_MACHOP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallLuke[] = { { .iv = 0, .lvl = 29, .species = SPECIES_MANKEY, }, { .iv = 0, .lvl = 29, .species = SPECIES_MACHOP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallCamron[] = { { .iv = 0, .lvl = 29, .species = SPECIES_MANKEY, }, { .iv = 0, .lvl = 29, .species = SPECIES_MACHOP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallRaul[] = { { .iv = 0, .lvl = 29, .species = SPECIES_MANKEY, }, { .iv = 0, .lvl = 29, .species = SPECIES_PRIMEAPE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallIsaiah[] = { { .iv = 0, .lvl = 29, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 29, .species = SPECIES_MACHAMP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallZeek[] = { { .iv = 0, .lvl = 33, .species = SPECIES_MACHOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallJamal[] = { { .iv = 0, .lvl = 26, .species = SPECIES_MANKEY, }, { .iv = 0, .lvl = 26, .species = SPECIES_MANKEY, }, { .iv = 0, .lvl = 26, .species = SPECIES_MACHAMP, }, { .iv = 0, .lvl = 26, .species = SPECIES_MACHOP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallCorey[] = { { .iv = 0, .lvl = 29, .species = SPECIES_PRIMEAPE, }, { .iv = 0, .lvl = 29, .species = SPECIES_MACHOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallChase[] = { { .iv = 0, .lvl = 31, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 31, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 31, .species = SPECIES_TENTACRUEL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GamerHugo[] = { { .iv = 0, .lvl = 18, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 18, .species = SPECIES_HORSEA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GamerJasper[] = { { .iv = 0, .lvl = 18, .species = SPECIES_BELLSPROUT, }, { .iv = 0, .lvl = 18, .species = SPECIES_ODDISH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GamerDirk[] = { { .iv = 0, .lvl = 18, .species = SPECIES_VOLTORB, }, { .iv = 0, .lvl = 18, .species = SPECIES_MAGNEMITE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GamerDarian[] = { { .iv = 0, .lvl = 18, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 18, .species = SPECIES_VULPIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GamerStan[] = { { .iv = 0, .lvl = 22, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 22, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 22, .species = SPECIES_POLIWHIRL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Gamer1[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GamerRich[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 24, .species = SPECIES_VULPIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautyBridget[] = { { .iv = 0, .lvl = 21, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 21, .species = SPECIES_BELLSPROUT, }, { .iv = 0, .lvl = 21, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 21, .species = SPECIES_BELLSPROUT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautyTamia[] = { { .iv = 0, .lvl = 24, .species = SPECIES_BELLSPROUT, }, { .iv = 0, .lvl = 24, .species = SPECIES_BELLSPROUT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautyLori[] = { { .iv = 0, .lvl = 24, .species = SPECIES_EXEGGCUTE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautyLola[] = { { .iv = 0, .lvl = 27, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 27, .species = SPECIES_PIKACHU, }, { .iv = 0, .lvl = 27, .species = SPECIES_RATTATA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautySheila[] = { { .iv = 0, .lvl = 29, .species = SPECIES_CLEFAIRY, }, { .iv = 0, .lvl = 29, .species = SPECIES_MEOWTH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleTiffany[] = { { .iv = 0, .lvl = 35, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleNora[] = { { .iv = 0, .lvl = 30, .species = SPECIES_SHELLDER, }, { .iv = 0, .lvl = 30, .species = SPECIES_SHELLDER, }, { .iv = 0, .lvl = 30, .species = SPECIES_CLOYSTER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleMelissa[] = { { .iv = 0, .lvl = 31, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 31, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautyGrace[] = { { .iv = 0, .lvl = 29, .species = SPECIES_PIDGEOTTO, }, { .iv = 0, .lvl = 29, .species = SPECIES_WIGGLYTUFF, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautyOlivia[] = { { .iv = 0, .lvl = 29, .species = SPECIES_BULBASAUR, }, { .iv = 0, .lvl = 29, .species = SPECIES_IVYSAUR, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautyLauren[] = { { .iv = 0, .lvl = 33, .species = SPECIES_WEEPINBELL, }, { .iv = 0, .lvl = 33, .species = SPECIES_BELLSPROUT, }, { .iv = 0, .lvl = 33, .species = SPECIES_WEEPINBELL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAnya[] = { { .iv = 0, .lvl = 27, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 27, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 27, .species = SPECIES_SEAKING, }, { .iv = 0, .lvl = 27, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 27, .species = SPECIES_POLIWAG, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAlice[] = { { .iv = 0, .lvl = 30, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 30, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleConnie[] = { { .iv = 0, .lvl = 29, .species = SPECIES_STARYU, }, { .iv = 0, .lvl = 29, .species = SPECIES_STARYU, }, { .iv = 0, .lvl = 29, .species = SPECIES_STARYU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleShirley[] = { { .iv = 0, .lvl = 30, .species = SPECIES_SEADRA, }, { .iv = 0, .lvl = 30, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 30, .species = SPECIES_SEADRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PsychicJohan[] = { { .iv = 50, .lvl = 31, .species = SPECIES_KADABRA, }, { .iv = 50, .lvl = 31, .species = SPECIES_SLOWPOKE, }, { .iv = 50, .lvl = 31, .species = SPECIES_MR_MIME, }, { .iv = 50, .lvl = 31, .species = SPECIES_KADABRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PsychicTyron[] = { { .iv = 50, .lvl = 34, .species = SPECIES_MR_MIME, }, { .iv = 50, .lvl = 34, .species = SPECIES_KADABRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PsychicCameron[] = { { .iv = 50, .lvl = 33, .species = SPECIES_SLOWPOKE, }, { .iv = 50, .lvl = 33, .species = SPECIES_SLOWPOKE, }, { .iv = 50, .lvl = 33, .species = SPECIES_SLOWBRO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PsychicPreston[] = { { .iv = 50, .lvl = 38, .species = SPECIES_SLOWBRO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RockerRandall[] = { { .iv = 0, .lvl = 20, .species = SPECIES_VOLTORB, }, { .iv = 0, .lvl = 20, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 20, .species = SPECIES_VOLTORB, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RockerLuca[] = { { .iv = 0, .lvl = 29, .species = SPECIES_VOLTORB, }, { .iv = 0, .lvl = 29, .species = SPECIES_ELECTRODE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_JugglerDalton[] = { { .iv = 0, .lvl = 29, .species = SPECIES_KADABRA, }, { .iv = 0, .lvl = 29, .species = SPECIES_MR_MIME, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_JugglerNelson[] = { { .iv = 0, .lvl = 41, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 41, .species = SPECIES_HYPNO, }, { .iv = 0, .lvl = 41, .species = SPECIES_KADABRA, }, { .iv = 0, .lvl = 41, .species = SPECIES_KADABRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_JugglerKirk[] = { { .iv = 0, .lvl = 31, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 31, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 31, .species = SPECIES_KADABRA, }, { .iv = 0, .lvl = 31, .species = SPECIES_DROWZEE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_JugglerShawn[] = { { .iv = 0, .lvl = 34, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 34, .species = SPECIES_HYPNO, }, }; static const struct TrainerMonNoItemCustomMoves sParty_JugglerGregory[] = { { .iv = 0, .lvl = 48, .species = SPECIES_MR_MIME, .moves = {MOVE_PSYCHIC, MOVE_ROLE_PLAY, MOVE_DOUBLE_SLAP, MOVE_ENCORE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_JugglerEdward[] = { { .iv = 0, .lvl = 46, .species = SPECIES_VOLTORB, .moves = {MOVE_SWIFT, MOVE_LIGHT_SCREEN, MOVE_SPARK, MOVE_SONIC_BOOM}, }, { .iv = 0, .lvl = 46, .species = SPECIES_VOLTORB, .moves = {MOVE_SWIFT, MOVE_LIGHT_SCREEN, MOVE_SPARK, MOVE_SONIC_BOOM}, }, { .iv = 0, .lvl = 47, .species = SPECIES_ELECTRODE, .moves = {MOVE_SWIFT, MOVE_SPARK, MOVE_SELF_DESTRUCT, MOVE_SONIC_BOOM}, }, { .iv = 0, .lvl = 48, .species = SPECIES_MR_MIME, .moves = {MOVE_PSYCHIC, MOVE_ROLE_PLAY, MOVE_REFLECT, MOVE_ENCORE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_JugglerKayden[] = { { .iv = 0, .lvl = 38, .species = SPECIES_HYPNO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_JugglerNate[] = { { .iv = 0, .lvl = 34, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 34, .species = SPECIES_KADABRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TamerPhil[] = { { .iv = 40, .lvl = 34, .species = SPECIES_SANDSLASH, }, { .iv = 40, .lvl = 34, .species = SPECIES_ARBOK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TamerEdgar[] = { { .iv = 40, .lvl = 33, .species = SPECIES_ARBOK, }, { .iv = 40, .lvl = 33, .species = SPECIES_SANDSLASH, }, { .iv = 40, .lvl = 33, .species = SPECIES_ARBOK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TamerJason[] = { { .iv = 40, .lvl = 43, .species = SPECIES_RHYHORN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TamerCole[] = { { .iv = 40, .lvl = 39, .species = SPECIES_ARBOK, }, { .iv = 40, .lvl = 39, .species = SPECIES_TAUROS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TamerVincent[] = { { .iv = 40, .lvl = 44, .species = SPECIES_PERSIAN, }, { .iv = 40, .lvl = 44, .species = SPECIES_GOLDUCK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TamerJohn[] = { { .iv = 40, .lvl = 42, .species = SPECIES_RHYHORN, }, { .iv = 40, .lvl = 42, .species = SPECIES_PRIMEAPE, }, { .iv = 40, .lvl = 42, .species = SPECIES_ARBOK, }, { .iv = 40, .lvl = 42, .species = SPECIES_TAUROS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperSebastian[] = { { .iv = 0, .lvl = 29, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 29, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperPerry[] = { { .iv = 0, .lvl = 25, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 25, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 25, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 25, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 25, .species = SPECIES_SPEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRobert[] = { { .iv = 0, .lvl = 26, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 26, .species = SPECIES_PIDGEOTTO, }, { .iv = 0, .lvl = 26, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 26, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperDonald[] = { { .iv = 0, .lvl = 33, .species = SPECIES_FARFETCHD, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperBenny[] = { { .iv = 0, .lvl = 29, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 29, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperEdwin[] = { { .iv = 0, .lvl = 26, .species = SPECIES_PIDGEOTTO, }, { .iv = 0, .lvl = 26, .species = SPECIES_FARFETCHD, }, { .iv = 0, .lvl = 26, .species = SPECIES_DODUO, }, { .iv = 0, .lvl = 26, .species = SPECIES_PIDGEY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChester[] = { { .iv = 0, .lvl = 28, .species = SPECIES_DODRIO, }, { .iv = 0, .lvl = 28, .species = SPECIES_DODUO, }, { .iv = 0, .lvl = 28, .species = SPECIES_DODUO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperWilton[] = { { .iv = 0, .lvl = 29, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 29, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRamiro[] = { { .iv = 0, .lvl = 34, .species = SPECIES_DODRIO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperJacob[] = { { .iv = 0, .lvl = 26, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 26, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 26, .species = SPECIES_FEAROW, }, { .iv = 0, .lvl = 26, .species = SPECIES_SPEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRoger[] = { { .iv = 0, .lvl = 30, .species = SPECIES_FEAROW, }, { .iv = 0, .lvl = 30, .species = SPECIES_FEAROW, }, { .iv = 0, .lvl = 30, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperReed[] = { { .iv = 0, .lvl = 39, .species = SPECIES_PIDGEOTTO, }, { .iv = 0, .lvl = 39, .species = SPECIES_PIDGEOTTO, }, { .iv = 0, .lvl = 39, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 39, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperKeith[] = { { .iv = 0, .lvl = 39, .species = SPECIES_FARFETCHD, }, { .iv = 0, .lvl = 39, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperCarter[] = { { .iv = 0, .lvl = 28, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 28, .species = SPECIES_DODUO, }, { .iv = 0, .lvl = 28, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMitch[] = { { .iv = 0, .lvl = 26, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 26, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 26, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 26, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperBeck[] = { { .iv = 0, .lvl = 29, .species = SPECIES_PIDGEOTTO, }, { .iv = 0, .lvl = 29, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMarlon[] = { { .iv = 0, .lvl = 28, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 28, .species = SPECIES_DODUO, }, { .iv = 0, .lvl = 28, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltKoichi[] = { { .iv = 100, .lvl = 37, .species = SPECIES_HITMONLEE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 37, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltMike[] = { { .iv = 100, .lvl = 31, .species = SPECIES_MANKEY, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 31, .species = SPECIES_MANKEY, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 31, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltHideki[] = { { .iv = 100, .lvl = 32, .species = SPECIES_MACHOP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 32, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltAaron[] = { { .iv = 100, .lvl = 36, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltHitoshi[] = { { .iv = 100, .lvl = 31, .species = SPECIES_MACHOP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 31, .species = SPECIES_MANKEY, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 31, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltAtsushi[] = { { .iv = 100, .lvl = 40, .species = SPECIES_MACHOP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 40, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltKiyo[] = { { .iv = 100, .lvl = 43, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltTakashi[] = { { .iv = 100, .lvl = 38, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 38, .species = SPECIES_MACHOP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 38, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltDaisuke[] = { { .iv = 100, .lvl = 43, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 43, .species = SPECIES_MACHOP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 43, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalOaksLabSquirtle[] = { { .iv = 0, .lvl = 5, .species = SPECIES_SQUIRTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalOaksLabBulbasaur[] = { { .iv = 0, .lvl = 5, .species = SPECIES_BULBASAUR, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalOaksLabCharmander[] = { { .iv = 0, .lvl = 5, .species = SPECIES_CHARMANDER, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22EarlySquirtle[] = { { .iv = 50, .lvl = 9, .species = SPECIES_PIDGEY, .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_NONE, MOVE_NONE}, }, { .iv = 50, .lvl = 9, .species = SPECIES_SQUIRTLE, .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_NONE, MOVE_NONE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22EarlyBulbasaur[] = { { .iv = 50, .lvl = 9, .species = SPECIES_PIDGEY, .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_NONE, MOVE_NONE}, }, { .iv = 50, .lvl = 9, .species = SPECIES_BULBASAUR, .moves = {MOVE_TACKLE, MOVE_GROWL, MOVE_NONE, MOVE_NONE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22EarlyCharmander[] = { { .iv = 50, .lvl = 9, .species = SPECIES_PIDGEY, .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_NONE, MOVE_NONE}, }, { .iv = 50, .lvl = 9, .species = SPECIES_CHARMANDER, .moves = {MOVE_SCRATCH, MOVE_GROWL, MOVE_NONE, MOVE_NONE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RivalCeruleanSquirtle[] = { { .iv = 50, .lvl = 17, .species = SPECIES_PIDGEOTTO, .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK}, }, { .iv = 50, .lvl = 16, .species = SPECIES_ABRA, .moves = {MOVE_TELEPORT, MOVE_NONE, MOVE_NONE, MOVE_NONE}, }, { .iv = 50, .lvl = 15, .species = SPECIES_RATTATA, .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_QUICK_ATTACK, MOVE_NONE}, }, { .iv = 100, .lvl = 18, .species = SPECIES_SQUIRTLE, .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_WITHDRAW, MOVE_WATER_GUN}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RivalCeruleanBulbasaur[] = { { .iv = 50, .lvl = 17, .species = SPECIES_PIDGEOTTO, .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK}, }, { .iv = 50, .lvl = 16, .species = SPECIES_ABRA, .moves = {MOVE_TELEPORT, MOVE_NONE, MOVE_NONE, MOVE_NONE}, }, { .iv = 50, .lvl = 15, .species = SPECIES_RATTATA, .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_QUICK_ATTACK, MOVE_NONE}, }, { .iv = 100, .lvl = 18, .species = SPECIES_BULBASAUR, .moves = {MOVE_SLEEP_POWDER, MOVE_POISON_POWDER, MOVE_VINE_WHIP, MOVE_LEECH_SEED}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RivalCeruleanCharmander[] = { { .iv = 50, .lvl = 17, .species = SPECIES_PIDGEOTTO, .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK}, }, { .iv = 50, .lvl = 16, .species = SPECIES_ABRA, .moves = {MOVE_TELEPORT, MOVE_NONE, MOVE_NONE, MOVE_NONE}, }, { .iv = 50, .lvl = 15, .species = SPECIES_RATTATA, .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_QUICK_ATTACK, MOVE_NONE}, }, { .iv = 100, .lvl = 18, .species = SPECIES_CHARMANDER, .moves = {MOVE_METAL_CLAW, MOVE_EMBER, MOVE_GROWL, MOVE_SCRATCH}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ScientistTed[] = { { .iv = 0, .lvl = 29, .species = SPECIES_ELECTRODE, }, { .iv = 0, .lvl = 29, .species = SPECIES_WEEZING, }, }; static const struct TrainerMonNoItemCustomMoves sParty_ScientistConnor[] = { { .iv = 0, .lvl = 26, .species = SPECIES_GRIMER, .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE}, }, { .iv = 0, .lvl = 26, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 26, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_SELF_DESTRUCT}, }, { .iv = 0, .lvl = 26, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ScientistJerry[] = { { .iv = 0, .lvl = 28, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 28, .species = SPECIES_VOLTORB, }, { .iv = 0, .lvl = 28, .species = SPECIES_MAGNETON, }, }; static const struct TrainerMonNoItemCustomMoves sParty_ScientistJose[] = { { .iv = 0, .lvl = 29, .species = SPECIES_ELECTRODE, .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE}, }, { .iv = 0, .lvl = 29, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ScientistRodney[] = { { .iv = 0, .lvl = 33, .species = SPECIES_ELECTRODE, }, }; static const struct TrainerMonNoItemCustomMoves sParty_ScientistBeau[] = { { .iv = 0, .lvl = 26, .species = SPECIES_MAGNETON, .moves = {MOVE_SPARK, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC}, }, { .iv = 0, .lvl = 26, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 26, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 26, .species = SPECIES_MAGNEMITE, .moves = {MOVE_SPARK, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_ScientistTaylor[] = { { .iv = 0, .lvl = 25, .species = SPECIES_VOLTORB, .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 25, .species = SPECIES_MAGNETON, .moves = {MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC, MOVE_THUNDER_SHOCK}, }, { .iv = 0, .lvl = 25, .species = SPECIES_MAGNEMITE, .moves = {MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC, MOVE_THUNDER_SHOCK}, }, { .iv = 0, .lvl = 25, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_SELF_DESTRUCT}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ScientistJoshua[] = { { .iv = 0, .lvl = 29, .species = SPECIES_ELECTRODE, }, { .iv = 0, .lvl = 29, .species = SPECIES_MUK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ScientistParker[] = { { .iv = 0, .lvl = 29, .species = SPECIES_GRIMER, }, { .iv = 0, .lvl = 29, .species = SPECIES_ELECTRODE, }, }; static const struct TrainerMonNoItemCustomMoves sParty_ScientistEd[] = { { .iv = 0, .lvl = 28, .species = SPECIES_VOLTORB, .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_TACKLE, MOVE_SMOG}, }, { .iv = 0, .lvl = 28, .species = SPECIES_MAGNETON, .moves = {MOVE_SPARK, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ScientistTravis[] = { { .iv = 0, .lvl = 29, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 29, .species = SPECIES_KOFFING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ScientistBraydon[] = { { .iv = 0, .lvl = 33, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 33, .species = SPECIES_MAGNETON, }, { .iv = 0, .lvl = 33, .species = SPECIES_VOLTORB, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ScientistIvan[] = { { .iv = 0, .lvl = 34, .species = SPECIES_MAGNEMITE, }, { .iv = 0, .lvl = 34, .species = SPECIES_ELECTRODE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BossGiovanni[] = { { .iv = 250, .lvl = 25, .species = SPECIES_ONIX, }, { .iv = 250, .lvl = 24, .species = SPECIES_RHYHORN, }, { .iv = 250, .lvl = 29, .species = SPECIES_KANGASKHAN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BossGiovanni2[] = { { .iv = 250, .lvl = 37, .species = SPECIES_NIDORINO, }, { .iv = 250, .lvl = 35, .species = SPECIES_KANGASKHAN, }, { .iv = 250, .lvl = 37, .species = SPECIES_RHYHORN, }, { .iv = 250, .lvl = 41, .species = SPECIES_NIDOQUEEN, }, }; static const struct TrainerMonNoItemCustomMoves sParty_LeaderGiovanni[] = { { .iv = 0, .lvl = 45, .species = SPECIES_RHYHORN, .moves = {MOVE_TAKE_DOWN, MOVE_ROCK_BLAST, MOVE_SCARY_FACE, MOVE_EARTHQUAKE}, }, { .iv = 0, .lvl = 42, .species = SPECIES_DUGTRIO, .moves = {MOVE_SLASH, MOVE_SAND_TOMB, MOVE_MUD_SLAP, MOVE_EARTHQUAKE}, }, { .iv = 0, .lvl = 44, .species = SPECIES_NIDOQUEEN, .moves = {MOVE_BODY_SLAM, MOVE_DOUBLE_KICK, MOVE_POISON_STING, MOVE_EARTHQUAKE}, }, { .iv = 0, .lvl = 45, .species = SPECIES_NIDOKING, .moves = {MOVE_THRASH, MOVE_DOUBLE_KICK, MOVE_POISON_STING, MOVE_EARTHQUAKE}, }, { .iv = 0, .lvl = 50, .species = SPECIES_RHYHORN, .moves = {MOVE_TAKE_DOWN, MOVE_ROCK_BLAST, MOVE_SCARY_FACE, MOVE_EARTHQUAKE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt[] = { { .iv = 0, .lvl = 13, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 13, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt2[] = { { .iv = 0, .lvl = 11, .species = SPECIES_SANDSHREW, }, { .iv = 0, .lvl = 11, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 11, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt3[] = { { .iv = 0, .lvl = 11, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 11, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt4[] = { { .iv = 0, .lvl = 13, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 13, .species = SPECIES_SANDSHREW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt5[] = { { .iv = 0, .lvl = 17, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 17, .species = SPECIES_DROWZEE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt6[] = { { .iv = 0, .lvl = 15, .species = SPECIES_EKANS, }, { .iv = 0, .lvl = 15, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt7[] = { { .iv = 0, .lvl = 20, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 20, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt8[] = { { .iv = 0, .lvl = 21, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 21, .species = SPECIES_MACHOP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt9[] = { { .iv = 0, .lvl = 21, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 21, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt10[] = { { .iv = 0, .lvl = 20, .species = SPECIES_GRIMER, .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE, MOVE_HARDEN}, }, { .iv = 0, .lvl = 20, .species = SPECIES_KOFFING, .moves = {MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS, MOVE_NONE}, }, { .iv = 0, .lvl = 20, .species = SPECIES_KOFFING, .moves = {MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS, MOVE_NONE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt11[] = { { .iv = 0, .lvl = 19, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 19, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 19, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 19, .species = SPECIES_RATTATA, }, }; static const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt12[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GRIMER, .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE, MOVE_HARDEN}, }, { .iv = 0, .lvl = 22, .species = SPECIES_KOFFING, .moves = {MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt13[] = { { .iv = 0, .lvl = 17, .species = SPECIES_ZUBAT, .moves = {MOVE_BITE, MOVE_ASTONISH, MOVE_SUPERSONIC, MOVE_LEECH_LIFE}, }, { .iv = 0, .lvl = 17, .species = SPECIES_KOFFING, .moves = {MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS, MOVE_NONE}, }, { .iv = 0, .lvl = 17, .species = SPECIES_GRIMER, .moves = {MOVE_SLUDGE, MOVE_DISABLE, MOVE_HARDEN, MOVE_POUND}, }, { .iv = 0, .lvl = 17, .species = SPECIES_ZUBAT, .moves = {MOVE_BITE, MOVE_ASTONISH, MOVE_SUPERSONIC, MOVE_LEECH_LIFE}, }, { .iv = 0, .lvl = 17, .species = SPECIES_RATICATE, .moves = {MOVE_HYPER_FANG, MOVE_QUICK_ATTACK, MOVE_TAIL_WHIP, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt14[] = { { .iv = 0, .lvl = 20, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 20, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 20, .species = SPECIES_DROWZEE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt15[] = { { .iv = 0, .lvl = 21, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 21, .species = SPECIES_MACHOP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt16[] = { { .iv = 0, .lvl = 23, .species = SPECIES_SANDSHREW, }, { .iv = 0, .lvl = 23, .species = SPECIES_EKANS, }, { .iv = 0, .lvl = 23, .species = SPECIES_SANDSLASH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt17[] = { { .iv = 0, .lvl = 23, .species = SPECIES_EKANS, }, { .iv = 0, .lvl = 23, .species = SPECIES_SANDSHREW, }, { .iv = 0, .lvl = 23, .species = SPECIES_ARBOK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt18[] = { { .iv = 0, .lvl = 21, .species = SPECIES_KOFFING, }, { .iv = 0, .lvl = 21, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt19[] = { { .iv = 0, .lvl = 25, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 25, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 25, .species = SPECIES_GOLBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt20[] = { { .iv = 0, .lvl = 26, .species = SPECIES_KOFFING, }, { .iv = 0, .lvl = 26, .species = SPECIES_DROWZEE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt21[] = { { .iv = 0, .lvl = 23, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 23, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 23, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 23, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt22[] = { { .iv = 0, .lvl = 26, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 26, .species = SPECIES_KOFFING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt23[] = { { .iv = 0, .lvl = 29, .species = SPECIES_CUBONE, }, { .iv = 0, .lvl = 29, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt24[] = { { .iv = 0, .lvl = 25, .species = SPECIES_GOLBAT, }, { .iv = 0, .lvl = 25, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 25, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 25, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 25, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt25[] = { { .iv = 0, .lvl = 28, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 28, .species = SPECIES_HYPNO, }, { .iv = 0, .lvl = 28, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt26[] = { { .iv = 0, .lvl = 29, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 29, .species = SPECIES_DROWZEE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt27[] = { { .iv = 0, .lvl = 28, .species = SPECIES_EKANS, }, { .iv = 0, .lvl = 28, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 28, .species = SPECIES_CUBONE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt28[] = { { .iv = 0, .lvl = 33, .species = SPECIES_ARBOK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt29[] = { { .iv = 0, .lvl = 33, .species = SPECIES_HYPNO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt30[] = { { .iv = 0, .lvl = 29, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 29, .species = SPECIES_MACHOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt31[] = { { .iv = 0, .lvl = 28, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 28, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 28, .species = SPECIES_GOLBAT, }, }; static const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt32[] = { { .iv = 0, .lvl = 26, .species = SPECIES_RATICATE, .moves = {MOVE_SCARY_FACE, MOVE_HYPER_FANG, MOVE_QUICK_ATTACK, MOVE_TAIL_WHIP}, }, { .iv = 0, .lvl = 26, .species = SPECIES_ARBOK, .moves = {MOVE_GLARE, MOVE_BITE, MOVE_POISON_STING, MOVE_LEER}, }, { .iv = 0, .lvl = 26, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 26, .species = SPECIES_GOLBAT, .moves = {MOVE_WING_ATTACK, MOVE_BITE, MOVE_ASTONISH, MOVE_SUPERSONIC}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt33[] = { { .iv = 0, .lvl = 29, .species = SPECIES_CUBONE, }, { .iv = 0, .lvl = 29, .species = SPECIES_CUBONE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt34[] = { { .iv = 0, .lvl = 29, .species = SPECIES_SANDSHREW, }, { .iv = 0, .lvl = 29, .species = SPECIES_SANDSLASH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt35[] = { { .iv = 0, .lvl = 26, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 26, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 26, .species = SPECIES_GOLBAT, }, { .iv = 0, .lvl = 26, .species = SPECIES_RATTATA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt36[] = { { .iv = 0, .lvl = 28, .species = SPECIES_WEEZING, }, { .iv = 0, .lvl = 28, .species = SPECIES_GOLBAT, }, { .iv = 0, .lvl = 28, .species = SPECIES_KOFFING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt37[] = { { .iv = 0, .lvl = 28, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 28, .species = SPECIES_GRIMER, }, { .iv = 0, .lvl = 28, .species = SPECIES_MACHOP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt38[] = { { .iv = 0, .lvl = 28, .species = SPECIES_GOLBAT, }, { .iv = 0, .lvl = 28, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 28, .species = SPECIES_HYPNO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt39[] = { { .iv = 0, .lvl = 33, .species = SPECIES_MACHOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt40[] = { { .iv = 0, .lvl = 25, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 25, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 25, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 25, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 25, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt41[] = { { .iv = 0, .lvl = 32, .species = SPECIES_CUBONE, }, { .iv = 0, .lvl = 32, .species = SPECIES_DROWZEE, }, { .iv = 0, .lvl = 32, .species = SPECIES_MAROWAK, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerSamuel[] = { { .iv = 100, .lvl = 37, .species = SPECIES_SANDSLASH, .moves = {MOVE_SLASH, MOVE_SWIFT, MOVE_SAND_ATTACK, MOVE_POISON_STING}, }, { .iv = 100, .lvl = 37, .species = SPECIES_SANDSLASH, .moves = {MOVE_SLASH, MOVE_SWIFT, MOVE_SAND_ATTACK, MOVE_POISON_STING}, }, { .iv = 100, .lvl = 38, .species = SPECIES_RHYHORN, .moves = {MOVE_TAKE_DOWN, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK, MOVE_SCARY_FACE}, }, { .iv = 100, .lvl = 39, .species = SPECIES_NIDORINO, .moves = {MOVE_FURY_ATTACK, MOVE_HORN_ATTACK, MOVE_POISON_STING, MOVE_DOUBLE_KICK}, }, { .iv = 100, .lvl = 39, .species = SPECIES_NIDOKING, .moves = {MOVE_THRASH, MOVE_DOUBLE_KICK, MOVE_POISON_STING, MOVE_FOCUS_ENERGY}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerGeorge[] = { { .iv = 100, .lvl = 42, .species = SPECIES_EXEGGUTOR, .moves = {MOVE_EGG_BOMB, MOVE_CONFUSION, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER}, }, { .iv = 100, .lvl = 42, .species = SPECIES_SANDSLASH, .moves = {MOVE_FURY_SWIPES, MOVE_SWIFT, MOVE_POISON_STING, MOVE_SAND_ATTACK}, }, { .iv = 100, .lvl = 42, .species = SPECIES_CLOYSTER, .moves = {MOVE_SPIKE_CANNON, MOVE_SPIKES, MOVE_AURORA_BEAM, MOVE_SUPERSONIC}, }, { .iv = 100, .lvl = 42, .species = SPECIES_ELECTRODE, .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_LIGHT_SCREEN}, }, { .iv = 100, .lvl = 42, .species = SPECIES_ARCANINE, .moves = {MOVE_FLAME_WHEEL, MOVE_ROAR, MOVE_BITE, MOVE_TAKE_DOWN}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerColby[] = { { .iv = 100, .lvl = 41, .species = SPECIES_KINGLER, .moves = {MOVE_GUILLOTINE, MOVE_STOMP, MOVE_MUD_SHOT, MOVE_BUBBLE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_POLIWHIRL, .moves = {MOVE_BODY_SLAM, MOVE_DOUBLE_SLAP, MOVE_WATER_GUN, MOVE_HYPNOSIS}, }, { .iv = 100, .lvl = 42, .species = SPECIES_TENTACRUEL, .moves = {MOVE_BARRIER, MOVE_WRAP, MOVE_BUBBLE_BEAM, MOVE_ACID}, }, { .iv = 100, .lvl = 42, .species = SPECIES_SEADRA, .moves = {MOVE_WATER_GUN, MOVE_SMOKESCREEN, MOVE_TWISTER, MOVE_LEER}, }, { .iv = 100, .lvl = 43, .species = SPECIES_BLASTOISE, .moves = {MOVE_WATER_GUN, MOVE_BITE, MOVE_RAPID_SPIN, MOVE_RAIN_DANCE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerPaul[] = { { .iv = 100, .lvl = 42, .species = SPECIES_SLOWPOKE, .moves = {MOVE_HEADBUTT, MOVE_CONFUSION, MOVE_WATER_GUN, MOVE_DISABLE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_SHELLDER, .moves = {MOVE_AURORA_BEAM, MOVE_CLAMP, MOVE_SUPERSONIC, MOVE_LEER}, }, { .iv = 100, .lvl = 42, .species = SPECIES_KINGLER, .moves = {MOVE_GUILLOTINE, MOVE_STOMP, MOVE_MUD_SHOT, MOVE_BUBBLE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_STARMIE, .moves = {MOVE_BUBBLE_BEAM, MOVE_SWIFT, MOVE_RECOVER, MOVE_RAPID_SPIN}, }, { .iv = 100, .lvl = 42, .species = SPECIES_GOLDUCK, .moves = {MOVE_CONFUSION, MOVE_SCRATCH, MOVE_SCREECH, MOVE_DISABLE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerRolando[] = { { .iv = 100, .lvl = 42, .species = SPECIES_RATICATE, .moves = {MOVE_SUPER_FANG, MOVE_PURSUIT, MOVE_SCARY_FACE, MOVE_QUICK_ATTACK}, }, { .iv = 100, .lvl = 42, .species = SPECIES_IVYSAUR, .moves = {MOVE_RAZOR_LEAF, MOVE_SLEEP_POWDER, MOVE_SWEET_SCENT, MOVE_SYNTHESIS}, }, { .iv = 100, .lvl = 42, .species = SPECIES_WARTORTLE, .moves = {MOVE_WATER_GUN, MOVE_BITE, MOVE_RAPID_SPIN, MOVE_TAIL_WHIP}, }, { .iv = 100, .lvl = 42, .species = SPECIES_CHARMELEON, .moves = {MOVE_FLAMETHROWER, MOVE_SLASH, MOVE_SMOKESCREEN, MOVE_SCARY_FACE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_CHARIZARD, .moves = {MOVE_FLAMETHROWER, MOVE_WING_ATTACK, MOVE_SMOKESCREEN, MOVE_SCARY_FACE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerGilbert[] = { { .iv = 100, .lvl = 42, .species = SPECIES_PIDGEOTTO, .moves = {MOVE_WING_ATTACK, MOVE_FEATHER_DANCE, MOVE_WHIRLWIND, MOVE_QUICK_ATTACK}, }, { .iv = 100, .lvl = 42, .species = SPECIES_FEAROW, .moves = {MOVE_DRILL_PECK, MOVE_MIRROR_MOVE, MOVE_PURSUIT, MOVE_LEER}, }, { .iv = 100, .lvl = 42, .species = SPECIES_PERSIAN, .moves = {MOVE_PAY_DAY, MOVE_FAINT_ATTACK, MOVE_SCREECH, MOVE_BITE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_LICKITUNG, .moves = {MOVE_SLAM, MOVE_DISABLE, MOVE_WRAP, MOVE_SUPERSONIC}, }, { .iv = 100, .lvl = 42, .species = SPECIES_TAUROS, .moves = {MOVE_HORN_ATTACK, MOVE_SCARY_FACE, MOVE_SWAGGER, MOVE_TAIL_WHIP}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerOwen[] = { { .iv = 100, .lvl = 42, .species = SPECIES_NIDORINO, .moves = {MOVE_SCRATCH, MOVE_POISON_STING, MOVE_DOUBLE_KICK, MOVE_BITE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_NIDORINA, .moves = {MOVE_HORN_ATTACK, MOVE_POISON_STING, MOVE_DOUBLE_KICK, MOVE_LEER}, }, { .iv = 100, .lvl = 42, .species = SPECIES_RATICATE, .moves = {MOVE_SUPER_FANG, MOVE_PURSUIT, MOVE_SCARY_FACE, MOVE_QUICK_ATTACK}, }, { .iv = 100, .lvl = 42, .species = SPECIES_SANDSLASH, .moves = {MOVE_FURY_SWIPES, MOVE_SWIFT, MOVE_SLASH, MOVE_POISON_STING}, }, { .iv = 100, .lvl = 42, .species = SPECIES_RHYHORN, .moves = {MOVE_ROCK_BLAST, MOVE_SCARY_FACE, MOVE_STOMP, MOVE_TAIL_WHIP}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerBerke[] = { { .iv = 100, .lvl = 42, .species = SPECIES_SEEL, .moves = {MOVE_TAKE_DOWN, MOVE_AURORA_BEAM, MOVE_ICY_WIND, MOVE_GROWL}, }, { .iv = 100, .lvl = 42, .species = SPECIES_GRAVELER, .moves = {MOVE_ROCK_BLAST, MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT}, }, { .iv = 100, .lvl = 42, .species = SPECIES_KINGLER, .moves = {MOVE_GUILLOTINE, MOVE_STOMP, MOVE_MUD_SHOT, MOVE_BUBBLE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_ONIX, .moves = {MOVE_SLAM, MOVE_SANDSTORM, MOVE_DRAGON_BREATH, MOVE_ROCK_THROW}, }, { .iv = 100, .lvl = 42, .species = SPECIES_CLOYSTER, .moves = {MOVE_SPIKE_CANNON, MOVE_AURORA_BEAM, MOVE_SUPERSONIC, MOVE_PROTECT}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerYuji[] = { { .iv = 100, .lvl = 38, .species = SPECIES_SANDSLASH, .moves = {MOVE_SLASH, MOVE_SWIFT, MOVE_SAND_ATTACK, MOVE_POISON_STING}, }, { .iv = 100, .lvl = 38, .species = SPECIES_GRAVELER, .moves = {MOVE_ROCK_BLAST, MOVE_MAGNITUDE, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL}, }, { .iv = 100, .lvl = 38, .species = SPECIES_ONIX, .moves = {MOVE_DRAGON_BREATH, MOVE_SANDSTORM, MOVE_ROCK_THROW, MOVE_BIND}, }, { .iv = 100, .lvl = 38, .species = SPECIES_GRAVELER, .moves = {MOVE_ROCK_BLAST, MOVE_MAGNITUDE, MOVE_ROLLOUT, MOVE_DEFENSE_CURL}, }, { .iv = 100, .lvl = 38, .species = SPECIES_MAROWAK, .moves = {MOVE_BONEMERANG, MOVE_HEADBUTT, MOVE_LEER, MOVE_GROWL}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerWarren[] = { { .iv = 100, .lvl = 37, .species = SPECIES_MAROWAK, .moves = {MOVE_BONEMERANG, MOVE_HEADBUTT, MOVE_LEER, MOVE_GROWL}, }, { .iv = 100, .lvl = 37, .species = SPECIES_MAROWAK, .moves = {MOVE_BONEMERANG, MOVE_HEADBUTT, MOVE_LEER, MOVE_GROWL}, }, { .iv = 100, .lvl = 38, .species = SPECIES_RHYHORN, .moves = {MOVE_TAKE_DOWN, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK, MOVE_SCARY_FACE}, }, { .iv = 100, .lvl = 39, .species = SPECIES_NIDORINA, .moves = {MOVE_FURY_SWIPES, MOVE_BITE, MOVE_POISON_STING, MOVE_DOUBLE_KICK}, }, { .iv = 100, .lvl = 39, .species = SPECIES_NIDOQUEEN, .moves = {MOVE_BODY_SLAM, MOVE_BITE, MOVE_POISON_STING, MOVE_DOUBLE_KICK}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerMary[] = { { .iv = 100, .lvl = 22, .species = SPECIES_BELLSPROUT, .moves = {MOVE_WRAP, MOVE_STUN_SPORE, MOVE_POISON_POWDER, MOVE_GROWTH}, }, { .iv = 100, .lvl = 22, .species = SPECIES_ODDISH, .moves = {MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_ABSORB, MOVE_SWEET_SCENT}, }, { .iv = 100, .lvl = 22, .species = SPECIES_WEEPINBELL, .moves = {MOVE_VINE_WHIP, MOVE_STUN_SPORE, MOVE_POISON_POWDER, MOVE_GROWTH}, }, { .iv = 100, .lvl = 22, .species = SPECIES_GLOOM, .moves = {MOVE_ABSORB, MOVE_STUN_SPORE, MOVE_POISON_POWDER, MOVE_SWEET_SCENT}, }, { .iv = 100, .lvl = 22, .species = SPECIES_IVYSAUR, .moves = {MOVE_RAZOR_LEAF, MOVE_SLEEP_POWDER, MOVE_VINE_WHIP, MOVE_LEECH_SEED}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerCaroline[] = { { .iv = 100, .lvl = 42, .species = SPECIES_BELLSPROUT, .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_STUN_SPORE, MOVE_POISON_POWDER}, }, { .iv = 100, .lvl = 42, .species = SPECIES_WEEPINBELL, .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_SLEEP_POWDER, MOVE_POISON_POWDER}, }, { .iv = 100, .lvl = 42, .species = SPECIES_VICTREEBEL, .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER}, }, { .iv = 100, .lvl = 42, .species = SPECIES_PARAS, .moves = {MOVE_GROWTH, MOVE_SLASH, MOVE_LEECH_LIFE, MOVE_STUN_SPORE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_PARASECT, .moves = {MOVE_SPORE, MOVE_SLASH, MOVE_LEECH_LIFE, MOVE_POISON_POWDER}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerAlexa[] = { { .iv = 100, .lvl = 42, .species = SPECIES_CLEFAIRY, .moves = {MOVE_LIGHT_SCREEN, MOVE_COSMIC_POWER, MOVE_DOUBLE_SLAP, MOVE_ENCORE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_JIGGLYPUFF, .moves = {MOVE_SING, MOVE_BODY_SLAM, MOVE_ROLLOUT, MOVE_DISABLE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_PERSIAN, .moves = {MOVE_PAY_DAY, MOVE_FAINT_ATTACK, MOVE_BITE, MOVE_SCREECH}, }, { .iv = 100, .lvl = 42, .species = SPECIES_DEWGONG, .moves = {MOVE_SHEER_COLD, MOVE_TAKE_DOWN, MOVE_REST, MOVE_AURORA_BEAM}, }, { .iv = 100, .lvl = 42, .species = SPECIES_CHANSEY, .moves = {MOVE_SING, MOVE_EGG_BOMB, MOVE_SOFT_BOILED, MOVE_MINIMIZE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerShannon[] = { { .iv = 100, .lvl = 42, .species = SPECIES_BEEDRILL, .moves = {MOVE_PIN_MISSILE, MOVE_TWINEEDLE, MOVE_AGILITY, MOVE_PURSUIT}, }, { .iv = 100, .lvl = 42, .species = SPECIES_BUTTERFREE, .moves = {MOVE_SAFEGUARD, MOVE_PSYBEAM, MOVE_GUST, MOVE_SUPERSONIC}, }, { .iv = 100, .lvl = 42, .species = SPECIES_PARASECT, .moves = {MOVE_SPORE, MOVE_LEECH_LIFE, MOVE_SLASH, MOVE_GROWTH}, }, { .iv = 100, .lvl = 42, .species = SPECIES_VENONAT, .moves = {MOVE_PSYBEAM, MOVE_STUN_SPORE, MOVE_LEECH_LIFE, MOVE_DISABLE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_VENOMOTH, .moves = {MOVE_PSYBEAM, MOVE_GUST, MOVE_SUPERSONIC, MOVE_LEECH_LIFE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerNaomi[] = { { .iv = 100, .lvl = 42, .species = SPECIES_PERSIAN, .moves = {MOVE_FURY_SWIPES, MOVE_SCREECH, MOVE_FAINT_ATTACK, MOVE_PAY_DAY}, }, { .iv = 100, .lvl = 42, .species = SPECIES_PONYTA, .moves = {MOVE_AGILITY, MOVE_TAKE_DOWN, MOVE_FIRE_SPIN, MOVE_STOMP}, }, { .iv = 100, .lvl = 42, .species = SPECIES_RAPIDASH, .moves = {MOVE_FURY_ATTACK, MOVE_FIRE_SPIN, MOVE_STOMP, MOVE_GROWL}, }, { .iv = 100, .lvl = 42, .species = SPECIES_VULPIX, .moves = {MOVE_FLAMETHROWER, MOVE_CONFUSE_RAY, MOVE_QUICK_ATTACK, MOVE_IMPRISON}, }, { .iv = 100, .lvl = 42, .species = SPECIES_NINETALES, .moves = {MOVE_SAFEGUARD, MOVE_WILL_O_WISP, MOVE_CONFUSE_RAY, MOVE_FIRE_SPIN}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerBrooke[] = { { .iv = 100, .lvl = 42, .species = SPECIES_TANGELA, .moves = {MOVE_SLAM, MOVE_BIND, MOVE_MEGA_DRAIN, MOVE_INGRAIN}, }, { .iv = 100, .lvl = 42, .species = SPECIES_GLOOM, .moves = {MOVE_ACID, MOVE_MOONLIGHT, MOVE_SLEEP_POWDER, MOVE_STUN_SPORE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_VILEPLUME, .moves = {MOVE_MEGA_DRAIN, MOVE_ACID, MOVE_STUN_SPORE, MOVE_AROMATHERAPY}, }, { .iv = 100, .lvl = 42, .species = SPECIES_IVYSAUR, .moves = {MOVE_RAZOR_LEAF, MOVE_SWEET_SCENT, MOVE_GROWL, MOVE_LEECH_SEED}, }, { .iv = 100, .lvl = 42, .species = SPECIES_VENUSAUR, .moves = {MOVE_RAZOR_LEAF, MOVE_GROWTH, MOVE_SLEEP_POWDER, MOVE_POISON_POWDER}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerAustina[] = { { .iv = 100, .lvl = 42, .species = SPECIES_RHYHORN, .moves = {MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_SCARY_FACE, MOVE_STOMP}, }, { .iv = 100, .lvl = 42, .species = SPECIES_NIDORINA, .moves = {MOVE_DOUBLE_KICK, MOVE_FURY_SWIPES, MOVE_BITE, MOVE_FLATTER}, }, { .iv = 100, .lvl = 42, .species = SPECIES_NIDOQUEEN, .moves = {MOVE_BODY_SLAM, MOVE_DOUBLE_KICK, MOVE_BITE, MOVE_GROWL}, }, { .iv = 100, .lvl = 42, .species = SPECIES_NIDORINO, .moves = {MOVE_HORN_ATTACK, MOVE_POISON_STING, MOVE_FOCUS_ENERGY, MOVE_LEER}, }, { .iv = 100, .lvl = 42, .species = SPECIES_NIDOKING, .moves = {MOVE_THRASH, MOVE_DOUBLE_KICK, MOVE_POISON_STING, MOVE_PECK}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerJulie[] = { { .iv = 100, .lvl = 42, .species = SPECIES_PERSIAN, .moves = {MOVE_FURY_SWIPES, MOVE_BITE, MOVE_SCREECH, MOVE_FAINT_ATTACK}, }, { .iv = 100, .lvl = 42, .species = SPECIES_NINETALES, .moves = {MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_CONFUSE_RAY, MOVE_GRUDGE}, }, { .iv = 100, .lvl = 42, .species = SPECIES_RAPIDASH, .moves = {MOVE_FURY_ATTACK, MOVE_FIRE_SPIN, MOVE_TAKE_DOWN, MOVE_AGILITY}, }, { .iv = 100, .lvl = 42, .species = SPECIES_PIKACHU, .moves = {MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_DOUBLE_TEAM, MOVE_QUICK_ATTACK}, }, { .iv = 100, .lvl = 42, .species = SPECIES_RAICHU, .moves = {MOVE_THUNDER, MOVE_THUNDER_WAVE, MOVE_SLAM, MOVE_DOUBLE_TEAM}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourLorelei[] = { { .iv = 250, .lvl = 52, .species = SPECIES_DEWGONG, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_HAIL, MOVE_SAFEGUARD}, }, { .iv = 250, .lvl = 51, .species = SPECIES_CLOYSTER, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SPIKES, MOVE_PROTECT, MOVE_HAIL, MOVE_DIVE}, }, { .iv = 250, .lvl = 52, .species = SPECIES_SLOWBRO, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_AMNESIA, MOVE_YAWN}, }, { .iv = 250, .lvl = 54, .species = SPECIES_JYNX, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_ICE_PUNCH, MOVE_DOUBLE_SLAP, MOVE_LOVELY_KISS, MOVE_ATTRACT}, }, { .iv = 250, .lvl = 54, .species = SPECIES_LAPRAS, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_CONFUSE_RAY, MOVE_ICE_BEAM, MOVE_SURF, MOVE_BODY_SLAM}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourBruno[] = { { .iv = 250, .lvl = 51, .species = SPECIES_ONIX, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_IRON_TAIL, MOVE_ROAR}, }, { .iv = 250, .lvl = 53, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SKY_UPPERCUT, MOVE_MACH_PUNCH, MOVE_ROCK_TOMB, MOVE_COUNTER}, }, { .iv = 250, .lvl = 53, .species = SPECIES_HITMONLEE, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_MEGA_KICK, MOVE_FORESIGHT, MOVE_BRICK_BREAK, MOVE_FACADE}, }, { .iv = 250, .lvl = 54, .species = SPECIES_ONIX, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_SAND_TOMB}, }, { .iv = 250, .lvl = 56, .species = SPECIES_MACHAMP, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_CROSS_CHOP, MOVE_BULK_UP, MOVE_SCARY_FACE, MOVE_ROCK_TOMB}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourAgatha[] = { { .iv = 250, .lvl = 54, .species = SPECIES_GENGAR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SHADOW_PUNCH, MOVE_CONFUSE_RAY, MOVE_TOXIC, MOVE_DOUBLE_TEAM}, }, { .iv = 250, .lvl = 54, .species = SPECIES_GOLBAT, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_CONFUSE_RAY, MOVE_POISON_FANG, MOVE_AIR_CUTTER, MOVE_BITE}, }, { .iv = 250, .lvl = 53, .species = SPECIES_HAUNTER, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_CURSE, MOVE_MEAN_LOOK}, }, { .iv = 250, .lvl = 56, .species = SPECIES_ARBOK, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_SCREECH, MOVE_IRON_TAIL, MOVE_BITE}, }, { .iv = 250, .lvl = 58, .species = SPECIES_GENGAR, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_HYPNOSIS, MOVE_NIGHTMARE}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourLance[] = { { .iv = 250, .lvl = 56, .species = SPECIES_GYARADOS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_DRAGON_RAGE, MOVE_TWISTER, MOVE_BITE}, }, { .iv = 250, .lvl = 54, .species = SPECIES_DRAGONAIR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_SAFEGUARD, MOVE_DRAGON_RAGE, MOVE_OUTRAGE}, }, { .iv = 250, .lvl = 54, .species = SPECIES_DRAGONAIR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_SAFEGUARD, MOVE_THUNDER_WAVE, MOVE_OUTRAGE}, }, { .iv = 250, .lvl = 58, .species = SPECIES_AERODACTYL, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_ANCIENT_POWER, MOVE_WING_ATTACK, MOVE_SCARY_FACE}, }, { .iv = 250, .lvl = 60, .species = SPECIES_DRAGONITE, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_SAFEGUARD, MOVE_OUTRAGE, MOVE_WING_ATTACK}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_LeaderBrock[] = { { .iv = 0, .lvl = 12, .species = SPECIES_GEODUDE, .moves = {MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_NONE, MOVE_NONE}, }, { .iv = 0, .lvl = 14, .species = SPECIES_ONIX, .moves = {MOVE_TACKLE, MOVE_BIND, MOVE_ROCK_TOMB, MOVE_NONE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_LeaderMisty[] = { { .iv = 0, .lvl = 18, .species = SPECIES_STARYU, .moves = {MOVE_TACKLE, MOVE_HARDEN, MOVE_RECOVER, MOVE_WATER_PULSE}, }, { .iv = 0, .lvl = 21, .species = SPECIES_STARMIE, .moves = {MOVE_SWIFT, MOVE_RECOVER, MOVE_RAPID_SPIN, MOVE_WATER_PULSE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_LeaderLtSurge[] = { { .iv = 0, .lvl = 21, .species = SPECIES_VOLTORB, .moves = {MOVE_SONIC_BOOM, MOVE_TACKLE, MOVE_SCREECH, MOVE_SHOCK_WAVE}, }, { .iv = 0, .lvl = 18, .species = SPECIES_PIKACHU, .moves = {MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_DOUBLE_TEAM, MOVE_SHOCK_WAVE}, }, { .iv = 0, .lvl = 24, .species = SPECIES_RAICHU, .moves = {MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_DOUBLE_TEAM, MOVE_SHOCK_WAVE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_LeaderErika[] = { { .iv = 0, .lvl = 29, .species = SPECIES_VICTREEBEL, .moves = {MOVE_STUN_SPORE, MOVE_ACID, MOVE_POISON_POWDER, MOVE_GIGA_DRAIN}, }, { .iv = 0, .lvl = 24, .species = SPECIES_TANGELA, .moves = {MOVE_POISON_POWDER, MOVE_CONSTRICT, MOVE_INGRAIN, MOVE_GIGA_DRAIN}, }, { .iv = 0, .lvl = 29, .species = SPECIES_VILEPLUME, .moves = {MOVE_SLEEP_POWDER, MOVE_ACID, MOVE_STUN_SPORE, MOVE_GIGA_DRAIN}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_LeaderKoga[] = { { .iv = 0, .lvl = 37, .species = SPECIES_KOFFING, .moves = {MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_TOXIC}, }, { .iv = 0, .lvl = 39, .species = SPECIES_MUK, .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_ACID_ARMOR, MOVE_TOXIC}, }, { .iv = 0, .lvl = 37, .species = SPECIES_KOFFING, .moves = {MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_TOXIC}, }, { .iv = 0, .lvl = 43, .species = SPECIES_WEEZING, .moves = {MOVE_TACKLE, MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_TOXIC}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_LeaderBlaine[] = { { .iv = 0, .lvl = 42, .species = SPECIES_GROWLITHE, .moves = {MOVE_BITE, MOVE_ROAR, MOVE_TAKE_DOWN, MOVE_FIRE_BLAST}, }, { .iv = 0, .lvl = 40, .species = SPECIES_PONYTA, .moves = {MOVE_STOMP, MOVE_BOUNCE, MOVE_FIRE_SPIN, MOVE_FIRE_BLAST}, }, { .iv = 0, .lvl = 42, .species = SPECIES_RAPIDASH, .moves = {MOVE_STOMP, MOVE_BOUNCE, MOVE_FIRE_SPIN, MOVE_FIRE_BLAST}, }, { .iv = 0, .lvl = 47, .species = SPECIES_ARCANINE, .moves = {MOVE_BITE, MOVE_ROAR, MOVE_TAKE_DOWN, MOVE_FIRE_BLAST}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_LeaderSabrina[] = { { .iv = 0, .lvl = 38, .species = SPECIES_KADABRA, .moves = {MOVE_PSYBEAM, MOVE_REFLECT, MOVE_FUTURE_SIGHT, MOVE_CALM_MIND}, }, { .iv = 0, .lvl = 37, .species = SPECIES_MR_MIME, .moves = {MOVE_BARRIER, MOVE_PSYBEAM, MOVE_BATON_PASS, MOVE_CALM_MIND}, }, { .iv = 0, .lvl = 38, .species = SPECIES_VENOMOTH, .moves = {MOVE_PSYBEAM, MOVE_GUST, MOVE_LEECH_LIFE, MOVE_SUPERSONIC}, }, { .iv = 0, .lvl = 43, .species = SPECIES_ALAKAZAM, .moves = {MOVE_PSYCHIC, MOVE_RECOVER, MOVE_FUTURE_SIGHT, MOVE_CALM_MIND}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GentlemanThomas[] = { { .iv = 0, .lvl = 18, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 18, .species = SPECIES_GROWLITHE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GentlemanArthur[] = { { .iv = 0, .lvl = 19, .species = SPECIES_NIDORAN_M, }, { .iv = 0, .lvl = 19, .species = SPECIES_NIDORAN_F, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GentlemanTucker[] = { { .iv = 0, .lvl = 23, .species = SPECIES_PIKACHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GentlemanNorton[] = { { .iv = 0, .lvl = 48, .species = SPECIES_PERSIAN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GentlemanWalter[] = { { .iv = 0, .lvl = 17, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 17, .species = SPECIES_PONYTA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalSsAnneSquirtle[] = { { .iv = 50, .lvl = 19, .species = SPECIES_PIDGEOTTO, }, { .iv = 50, .lvl = 16, .species = SPECIES_RATICATE, }, { .iv = 50, .lvl = 18, .species = SPECIES_KADABRA, }, { .iv = 100, .lvl = 20, .species = SPECIES_WARTORTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalSsAnneBulbasaur[] = { { .iv = 50, .lvl = 19, .species = SPECIES_PIDGEOTTO, }, { .iv = 50, .lvl = 16, .species = SPECIES_RATICATE, }, { .iv = 50, .lvl = 18, .species = SPECIES_KADABRA, }, { .iv = 100, .lvl = 20, .species = SPECIES_IVYSAUR, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalSsAnneCharmander[] = { { .iv = 50, .lvl = 19, .species = SPECIES_PIDGEOTTO, }, { .iv = 50, .lvl = 16, .species = SPECIES_RATICATE, }, { .iv = 50, .lvl = 18, .species = SPECIES_KADABRA, }, { .iv = 100, .lvl = 20, .species = SPECIES_CHARMELEON, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalPokemonTowerSquirtle[] = { { .iv = 100, .lvl = 25, .species = SPECIES_PIDGEOTTO, }, { .iv = 100, .lvl = 23, .species = SPECIES_GROWLITHE, }, { .iv = 100, .lvl = 22, .species = SPECIES_EXEGGCUTE, }, { .iv = 100, .lvl = 20, .species = SPECIES_KADABRA, }, { .iv = 100, .lvl = 25, .species = SPECIES_WARTORTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalPokemonTowerBulbasaur[] = { { .iv = 100, .lvl = 25, .species = SPECIES_PIDGEOTTO, }, { .iv = 100, .lvl = 23, .species = SPECIES_GYARADOS, }, { .iv = 100, .lvl = 22, .species = SPECIES_GROWLITHE, }, { .iv = 100, .lvl = 20, .species = SPECIES_KADABRA, }, { .iv = 100, .lvl = 25, .species = SPECIES_IVYSAUR, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalPokemonTowerCharmander[] = { { .iv = 100, .lvl = 25, .species = SPECIES_PIDGEOTTO, }, { .iv = 100, .lvl = 23, .species = SPECIES_EXEGGCUTE, }, { .iv = 100, .lvl = 22, .species = SPECIES_GYARADOS, }, { .iv = 100, .lvl = 20, .species = SPECIES_KADABRA, }, { .iv = 100, .lvl = 25, .species = SPECIES_CHARMELEON, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalSilphSquirtle[] = { { .iv = 100, .lvl = 37, .species = SPECIES_PIDGEOT, }, { .iv = 100, .lvl = 38, .species = SPECIES_GROWLITHE, }, { .iv = 100, .lvl = 35, .species = SPECIES_EXEGGCUTE, }, { .iv = 100, .lvl = 35, .species = SPECIES_ALAKAZAM, }, { .iv = 150, .lvl = 40, .species = SPECIES_BLASTOISE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalSilphBulbasaur[] = { { .iv = 100, .lvl = 37, .species = SPECIES_PIDGEOT, }, { .iv = 100, .lvl = 38, .species = SPECIES_GYARADOS, }, { .iv = 100, .lvl = 35, .species = SPECIES_GROWLITHE, }, { .iv = 100, .lvl = 35, .species = SPECIES_ALAKAZAM, }, { .iv = 150, .lvl = 40, .species = SPECIES_VENUSAUR, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RivalSilphCharmander[] = { { .iv = 100, .lvl = 37, .species = SPECIES_PIDGEOT, }, { .iv = 100, .lvl = 38, .species = SPECIES_EXEGGCUTE, }, { .iv = 100, .lvl = 35, .species = SPECIES_GYARADOS, }, { .iv = 100, .lvl = 35, .species = SPECIES_ALAKAZAM, }, { .iv = 150, .lvl = 40, .species = SPECIES_CHARIZARD, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22LateSquirtle[] = { { .iv = 150, .lvl = 47, .species = SPECIES_PIDGEOT, .moves = {MOVE_FEATHER_DANCE, MOVE_WING_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK}, }, { .iv = 150, .lvl = 45, .species = SPECIES_RHYHORN, .moves = {MOVE_TAKE_DOWN, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK}, }, { .iv = 150, .lvl = 45, .species = SPECIES_GROWLITHE, .moves = {MOVE_FLAME_WHEEL, MOVE_TAKE_DOWN, MOVE_LEER, MOVE_AGILITY}, }, { .iv = 150, .lvl = 45, .species = SPECIES_EXEGGCUTE, .moves = {MOVE_SOLAR_BEAM, MOVE_SLEEP_POWDER, MOVE_POISON_POWDER, MOVE_STUN_SPORE}, }, { .iv = 150, .lvl = 47, .species = SPECIES_ALAKAZAM, .moves = {MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_FUTURE_SIGHT, MOVE_DISABLE}, }, { .iv = 250, .lvl = 53, .species = SPECIES_BLASTOISE, .moves = {MOVE_WATER_GUN, MOVE_RAIN_DANCE, MOVE_BITE, MOVE_RAPID_SPIN}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22LateBulbasaur[] = { { .iv = 150, .lvl = 47, .species = SPECIES_PIDGEOT, .moves = {MOVE_FEATHER_DANCE, MOVE_WING_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK}, }, { .iv = 150, .lvl = 45, .species = SPECIES_RHYHORN, .moves = {MOVE_TAKE_DOWN, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK}, }, { .iv = 150, .lvl = 45, .species = SPECIES_GYARADOS, .moves = {MOVE_HYDRO_PUMP, MOVE_TWISTER, MOVE_LEER, MOVE_RAIN_DANCE}, }, { .iv = 150, .lvl = 45, .species = SPECIES_GROWLITHE, .moves = {MOVE_FLAME_WHEEL, MOVE_TAKE_DOWN, MOVE_LEER, MOVE_AGILITY}, }, { .iv = 150, .lvl = 47, .species = SPECIES_ALAKAZAM, .moves = {MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_FUTURE_SIGHT, MOVE_DISABLE}, }, { .iv = 250, .lvl = 53, .species = SPECIES_VENUSAUR, .moves = {MOVE_RAZOR_LEAF, MOVE_SWEET_SCENT, MOVE_GROWTH, MOVE_SYNTHESIS}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22LateCharmander[] = { { .iv = 150, .lvl = 47, .species = SPECIES_PIDGEOT, .moves = {MOVE_FEATHER_DANCE, MOVE_WING_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK}, }, { .iv = 150, .lvl = 45, .species = SPECIES_RHYHORN, .moves = {MOVE_TAKE_DOWN, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK}, }, { .iv = 150, .lvl = 45, .species = SPECIES_EXEGGCUTE, .moves = {MOVE_SOLAR_BEAM, MOVE_SLEEP_POWDER, MOVE_POISON_POWDER, MOVE_STUN_SPORE}, }, { .iv = 150, .lvl = 45, .species = SPECIES_GYARADOS, .moves = {MOVE_HYDRO_PUMP, MOVE_TWISTER, MOVE_LEER, MOVE_RAIN_DANCE}, }, { .iv = 150, .lvl = 47, .species = SPECIES_ALAKAZAM, .moves = {MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_FUTURE_SIGHT, MOVE_DISABLE}, }, { .iv = 250, .lvl = 53, .species = SPECIES_CHARIZARD, .moves = {MOVE_FLAMETHROWER, MOVE_WING_ATTACK, MOVE_SLASH, MOVE_SCARY_FACE}, }, }; static const struct TrainerMonItemCustomMoves sParty_ChampionFirstSquirtle[] = { { .iv = 255, .lvl = 59, .species = SPECIES_PIDGEOT, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_SAND_ATTACK, MOVE_WHIRLWIND}, }, { .iv = 255, .lvl = 57, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT}, }, { .iv = 255, .lvl = 59, .species = SPECIES_RHYDON, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_TAKE_DOWN, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_SCARY_FACE}, }, { .iv = 255, .lvl = 59, .species = SPECIES_ARCANINE, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_ROAR, MOVE_BITE}, }, { .iv = 255, .lvl = 61, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_GIGA_DRAIN, MOVE_EGG_BOMB, MOVE_SLEEP_POWDER, MOVE_LIGHT_SCREEN}, }, { .iv = 255, .lvl = 63, .species = SPECIES_BLASTOISE, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_HYDRO_PUMP, MOVE_RAIN_DANCE, MOVE_SKULL_BASH, MOVE_BITE}, }, }; static const struct TrainerMonItemCustomMoves sParty_ChampionFirstBulbasaur[] = { { .iv = 255, .lvl = 59, .species = SPECIES_PIDGEOT, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_SAND_ATTACK, MOVE_WHIRLWIND}, }, { .iv = 255, .lvl = 57, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT}, }, { .iv = 255, .lvl = 59, .species = SPECIES_RHYDON, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_TAKE_DOWN, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_SCARY_FACE}, }, { .iv = 255, .lvl = 59, .species = SPECIES_GYARADOS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYDRO_PUMP, MOVE_DRAGON_RAGE, MOVE_BITE, MOVE_THRASH}, }, { .iv = 255, .lvl = 61, .species = SPECIES_ARCANINE, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_ROAR, MOVE_BITE}, }, { .iv = 255, .lvl = 63, .species = SPECIES_VENUSAUR, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_SOLAR_BEAM, MOVE_SYNTHESIS, MOVE_SUNNY_DAY, MOVE_GROWTH}, }, }; static const struct TrainerMonItemCustomMoves sParty_ChampionFirstCharmander[] = { { .iv = 255, .lvl = 59, .species = SPECIES_PIDGEOT, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_SAND_ATTACK, MOVE_WHIRLWIND}, }, { .iv = 255, .lvl = 57, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT}, }, { .iv = 255, .lvl = 59, .species = SPECIES_RHYDON, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_TAKE_DOWN, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_SCARY_FACE}, }, { .iv = 255, .lvl = 59, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_GIGA_DRAIN, MOVE_EGG_BOMB, MOVE_SLEEP_POWDER, MOVE_LIGHT_SCREEN}, }, { .iv = 255, .lvl = 61, .species = SPECIES_GYARADOS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYDRO_PUMP, MOVE_DRAGON_RAGE, MOVE_BITE, MOVE_THRASH}, }, { .iv = 255, .lvl = 63, .species = SPECIES_CHARIZARD, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_FIRE_BLAST, MOVE_AERIAL_ACE, MOVE_SLASH, MOVE_FIRE_SPIN}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerPatricia[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerCarly[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerHope[] = { { .iv = 0, .lvl = 23, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerPaula[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerLaurel[] = { { .iv = 0, .lvl = 23, .species = SPECIES_GASTLY, }, { .iv = 0, .lvl = 23, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerJody[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerTammy[] = { { .iv = 0, .lvl = 23, .species = SPECIES_HAUNTER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerRuth[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerKarina[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerJanae[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerAngelica[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerEmilia[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerJennifer[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Channeler1[] = { { .iv = 0, .lvl = 23, .species = SPECIES_HAUNTER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Channeler2[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Channeler3[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Channeler4[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Channeler5[] = { { .iv = 0, .lvl = 22, .species = SPECIES_HAUNTER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Channeler6[] = { { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, { .iv = 0, .lvl = 22, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Channeler7[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Channeler8[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GASTLY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerAmanda[] = { { .iv = 0, .lvl = 34, .species = SPECIES_GASTLY, }, { .iv = 0, .lvl = 34, .species = SPECIES_HAUNTER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerStacy[] = { { .iv = 0, .lvl = 38, .species = SPECIES_HAUNTER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_ChannelerTasha[] = { { .iv = 0, .lvl = 33, .species = SPECIES_GASTLY, }, { .iv = 0, .lvl = 33, .species = SPECIES_GASTLY, }, { .iv = 0, .lvl = 33, .species = SPECIES_HAUNTER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerJeremy[] = { { .iv = 0, .lvl = 20, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 20, .species = SPECIES_ONIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlma[] = { { .iv = 0, .lvl = 28, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 28, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 28, .species = SPECIES_HORSEA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSusie[] = { { .iv = 0, .lvl = 24, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 24, .species = SPECIES_MEOWTH, }, { .iv = 0, .lvl = 24, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 24, .species = SPECIES_PIKACHU, }, { .iv = 0, .lvl = 24, .species = SPECIES_MEOWTH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerValerie[] = { { .iv = 0, .lvl = 30, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 30, .species = SPECIES_POLIWAG, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerGwen[] = { { .iv = 0, .lvl = 27, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 27, .species = SPECIES_MEOWTH, }, { .iv = 0, .lvl = 27, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 27, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerVirgil[] = { { .iv = 0, .lvl = 28, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_KOFFING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, { .iv = 0, .lvl = 28, .species = SPECIES_WEEZING, .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperFlint[] = { { .iv = 0, .lvl = 14, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 14, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMissy[] = { { .iv = 0, .lvl = 31, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 31, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIrene[] = { { .iv = 0, .lvl = 30, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 30, .species = SPECIES_HORSEA, }, { .iv = 0, .lvl = 30, .species = SPECIES_SEEL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerDana[] = { { .iv = 0, .lvl = 20, .species = SPECIES_MEOWTH, }, { .iv = 0, .lvl = 20, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 20, .species = SPECIES_PIDGEY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAriana[] = { { .iv = 0, .lvl = 19, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 19, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 19, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 19, .species = SPECIES_BELLSPROUT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerLeah[] = { { .iv = 0, .lvl = 22, .species = SPECIES_BELLSPROUT, }, { .iv = 0, .lvl = 22, .species = SPECIES_CLEFAIRY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperJustin[] = { { .iv = 0, .lvl = 29, .species = SPECIES_NIDORAN_M, }, { .iv = 0, .lvl = 29, .species = SPECIES_NIDORINO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerYazmin[] = { { .iv = 0, .lvl = 29, .species = SPECIES_BELLSPROUT, }, { .iv = 0, .lvl = 29, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 29, .species = SPECIES_TANGELA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKindra[] = { { .iv = 0, .lvl = 28, .species = SPECIES_GLOOM, }, { .iv = 0, .lvl = 28, .species = SPECIES_ODDISH, }, { .iv = 0, .lvl = 28, .species = SPECIES_ODDISH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerBecky[] = { { .iv = 0, .lvl = 29, .species = SPECIES_PIKACHU, }, { .iv = 0, .lvl = 29, .species = SPECIES_RAICHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerCelia[] = { { .iv = 0, .lvl = 33, .species = SPECIES_CLEFAIRY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GentlemanBrooks[] = { { .iv = 0, .lvl = 23, .species = SPECIES_PIKACHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GentlemanLamar[] = { { .iv = 0, .lvl = 17, .species = SPECIES_GROWLITHE, }, { .iv = 0, .lvl = 17, .species = SPECIES_PONYTA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TwinsEliAnne[] = { { .iv = 0, .lvl = 22, .species = SPECIES_CLEFAIRY, }, { .iv = 0, .lvl = 22, .species = SPECIES_JIGGLYPUFF, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CoolCoupleRayTyra[] = { { .iv = 100, .lvl = 45, .species = SPECIES_NIDOQUEEN, .moves = {MOVE_SUPERPOWER, MOVE_BODY_SLAM, MOVE_DOUBLE_KICK, MOVE_POISON_STING}, }, { .iv = 100, .lvl = 45, .species = SPECIES_NIDOKING, .moves = {MOVE_MEGAHORN, MOVE_THRASH, MOVE_DOUBLE_KICK, MOVE_POISON_STING}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleGiaJes[] = { { .iv = 0, .lvl = 24, .species = SPECIES_NIDORAN_M, }, { .iv = 0, .lvl = 24, .species = SPECIES_NIDORAN_F, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TwinsKiriJan[] = { { .iv = 0, .lvl = 29, .species = SPECIES_CHARMANDER, }, { .iv = 0, .lvl = 29, .species = SPECIES_SQUIRTLE, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushKinRonMya[] = { { .iv = 50, .lvl = 29, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, { .iv = 50, .lvl = 29, .species = SPECIES_HITMONLEE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleLeaJed[] = { { .iv = 0, .lvl = 29, .species = SPECIES_RAPIDASH, }, { .iv = 0, .lvl = 29, .species = SPECIES_NINETALES, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroLiaLuc[] = { { .iv = 0, .lvl = 30, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 30, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroLilIan[] = { { .iv = 0, .lvl = 33, .species = SPECIES_SEADRA, }, { .iv = 0, .lvl = 33, .species = SPECIES_STARMIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher3[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher4[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher5[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher6[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher7[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher8[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterBen3[] = { { .iv = 60, .lvl = 28, .species = SPECIES_RATICATE, }, { .iv = 60, .lvl = 28, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterBen4[] = { { .iv = 120, .lvl = 48, .species = SPECIES_RATICATE, }, { .iv = 120, .lvl = 48, .species = SPECIES_ARBOK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterChad2[] = { { .iv = 20, .lvl = 20, .species = SPECIES_EKANS, }, { .iv = 20, .lvl = 20, .species = SPECIES_SANDSHREW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassReli2[] = { { .iv = 20, .lvl = 20, .species = SPECIES_PIDGEY, }, { .iv = 20, .lvl = 20, .species = SPECIES_NIDORAN_F, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassReli3[] = { { .iv = 60, .lvl = 28, .species = SPECIES_PIDGEOTTO, }, { .iv = 60, .lvl = 28, .species = SPECIES_NIDORINA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTimmy2[] = { { .iv = 20, .lvl = 19, .species = SPECIES_RATICATE, }, { .iv = 20, .lvl = 19, .species = SPECIES_EKANS, }, { .iv = 20, .lvl = 19, .species = SPECIES_ZUBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTimmy3[] = { { .iv = 60, .lvl = 27, .species = SPECIES_RATICATE, }, { .iv = 60, .lvl = 27, .species = SPECIES_EKANS, }, { .iv = 60, .lvl = 27, .species = SPECIES_GOLBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTimmy4[] = { { .iv = 120, .lvl = 52, .species = SPECIES_RATICATE, }, { .iv = 120, .lvl = 52, .species = SPECIES_ARBOK, }, { .iv = 120, .lvl = 52, .species = SPECIES_GOLBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterChad3[] = { { .iv = 60, .lvl = 28, .species = SPECIES_ARBOK, }, { .iv = 60, .lvl = 28, .species = SPECIES_SANDSHREW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassJanice2[] = { { .iv = 20, .lvl = 20, .species = SPECIES_PIDGEOTTO, }, { .iv = 20, .lvl = 20, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassJanice3[] = { { .iv = 60, .lvl = 28, .species = SPECIES_PIDGEOTTO, }, { .iv = 60, .lvl = 28, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterChad4[] = { { .iv = 80, .lvl = 48, .species = SPECIES_ARBOK, }, { .iv = 80, .lvl = 48, .species = SPECIES_SANDSLASH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerFranklin2[] = { { .iv = 40, .lvl = 25, .species = SPECIES_MACHOKE, }, { .iv = 40, .lvl = 25, .species = SPECIES_GRAVELER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PkmnProfProfOak[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PlayerBrendan[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PlayerMay[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PlayerRed[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PlayerLeaf[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt42[] = { { .iv = 0, .lvl = 49, .species = SPECIES_HOUNDOUR, }, { .iv = 0, .lvl = 49, .species = SPECIES_HOUNDOUR, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PsychicJaclyn[] = { { .iv = 100, .lvl = 48, .species = SPECIES_NATU, .moves = {MOVE_NIGHT_SHADE, MOVE_CONFUSE_RAY, MOVE_FUTURE_SIGHT, MOVE_WISH}, }, { .iv = 100, .lvl = 48, .species = SPECIES_SLOWBRO, .moves = {MOVE_PSYCHIC, MOVE_HEADBUTT, MOVE_AMNESIA, MOVE_YAWN}, }, { .iv = 100, .lvl = 49, .species = SPECIES_KADABRA, .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT}, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushGirlSharon[] = { { .iv = 50, .lvl = 37, .species = SPECIES_MANKEY, .heldItem = ITEM_BLACK_BELT, }, { .iv = 50, .lvl = 37, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TuberAmira[] = { { .iv = 0, .lvl = 34, .species = SPECIES_POLIWAG, }, { .iv = 0, .lvl = 35, .species = SPECIES_POLIWHIRL, }, { .iv = 0, .lvl = 34, .species = SPECIES_POLIWAG, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PkmnBreederAlize[] = { { .iv = 30, .lvl = 48, .species = SPECIES_PIKACHU, }, { .iv = 30, .lvl = 48, .species = SPECIES_CLEFAIRY, }, { .iv = 30, .lvl = 48, .species = SPECIES_MARILL, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerNicolas[] = { { .iv = 100, .lvl = 51, .species = SPECIES_WEEPINBELL, .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_SWEET_SCENT, MOVE_WRAP}, }, { .iv = 100, .lvl = 51, .species = SPECIES_VICTREEBEL, .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_SLEEP_POWDER, MOVE_STUN_SPORE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerMadeline[] = { { .iv = 100, .lvl = 51, .species = SPECIES_GLOOM, .moves = {MOVE_PETAL_DANCE, MOVE_ACID, MOVE_SWEET_SCENT, MOVE_POISON_POWDER}, }, { .iv = 100, .lvl = 51, .species = SPECIES_VILEPLUME, .moves = {MOVE_PETAL_DANCE, MOVE_MOONLIGHT, MOVE_ACID, MOVE_STUN_SPORE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_AromaLadyNikki[] = { { .iv = 0, .lvl = 37, .species = SPECIES_BELLSPROUT, }, { .iv = 0, .lvl = 37, .species = SPECIES_WEEPINBELL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacStanly[] = { { .iv = 0, .lvl = 48, .species = SPECIES_GRAVELER, }, { .iv = 0, .lvl = 48, .species = SPECIES_ONIX, }, { .iv = 0, .lvl = 48, .species = SPECIES_GRAVELER, }, }; static const struct TrainerMonItemDefaultMoves sParty_LadyJacki[] = { { .iv = 0, .lvl = 48, .species = SPECIES_HOPPIP, .heldItem = ITEM_STARDUST, }, { .iv = 0, .lvl = 50, .species = SPECIES_SKIPLOOM, .heldItem = ITEM_STARDUST, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PainterDaisy[] = { { .iv = 50, .lvl = 50, .species = SPECIES_SMEARGLE, .moves = {MOVE_DYNAMIC_PUNCH, MOVE_DIZZY_PUNCH, MOVE_FOCUS_PUNCH, MOVE_MEGA_PUNCH}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerGoon[] = { { .iv = 0, .lvl = 37, .species = SPECIES_KOFFING, .moves = {MOVE_HAZE, MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_TACKLE}, }, { .iv = 0, .lvl = 37, .species = SPECIES_GRIMER, .moves = {MOVE_ACID_ARMOR, MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerGoon2[] = { { .iv = 0, .lvl = 38, .species = SPECIES_KOFFING, .moves = {MOVE_HAZE, MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_TACKLE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BikerGoon3[] = { { .iv = 0, .lvl = 38, .species = SPECIES_GRIMER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_Biker2[] = { { .iv = 0, .lvl = 5, .species = SPECIES_EKANS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherAnthony[] = { { .iv = 0, .lvl = 7, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 8, .species = SPECIES_CATERPIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherCharlie[] = { { .iv = 0, .lvl = 7, .species = SPECIES_METAPOD, }, { .iv = 0, .lvl = 7, .species = SPECIES_CATERPIE, }, { .iv = 0, .lvl = 7, .species = SPECIES_METAPOD, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TwinsEliAnne2[] = { { .iv = 60, .lvl = 28, .species = SPECIES_CLEFAIRY, }, { .iv = 60, .lvl = 28, .species = SPECIES_JIGGLYPUFF, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterJohnson[] = { { .iv = 0, .lvl = 33, .species = SPECIES_EKANS, }, { .iv = 0, .lvl = 33, .species = SPECIES_EKANS, }, { .iv = 0, .lvl = 34, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemCustomMoves sParty_BikerRicardo[] = { { .iv = 0, .lvl = 22, .species = SPECIES_KOFFING, .moves = {MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS}, }, { .iv = 0, .lvl = 22, .species = SPECIES_KOFFING, .moves = {MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS}, }, { .iv = 0, .lvl = 23, .species = SPECIES_GRIMER, .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE, MOVE_POUND}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BikerJaren[] = { { .iv = 0, .lvl = 24, .species = SPECIES_GRIMER, }, { .iv = 0, .lvl = 24, .species = SPECIES_GRIMER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt43[] = { { .iv = 0, .lvl = 37, .species = SPECIES_CUBONE, }, { .iv = 0, .lvl = 37, .species = SPECIES_MAROWAK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt44[] = { { .iv = 0, .lvl = 35, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 35, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 35, .species = SPECIES_SANDSHREW, }, { .iv = 0, .lvl = 35, .species = SPECIES_SANDSLASH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt45[] = { { .iv = 0, .lvl = 38, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 38, .species = SPECIES_ZUBAT, }, { .iv = 0, .lvl = 38, .species = SPECIES_GOLBAT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt46[] = { { .iv = 0, .lvl = 48, .species = SPECIES_MUK, }, { .iv = 0, .lvl = 48, .species = SPECIES_GOLBAT, }, { .iv = 0, .lvl = 48, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt47[] = { { .iv = 0, .lvl = 48, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 48, .species = SPECIES_MACHOP, }, { .iv = 0, .lvl = 48, .species = SPECIES_MACHOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt48[] = { { .iv = 0, .lvl = 49, .species = SPECIES_HYPNO, }, { .iv = 0, .lvl = 49, .species = SPECIES_HYPNO, }, }; static const struct TrainerMonNoItemCustomMoves sParty_TeamRocketAdmin[] = { { .iv = 150, .lvl = 52, .species = SPECIES_MUK, .moves = {MOVE_SLUDGE_BOMB, MOVE_SCREECH, MOVE_MINIMIZE, MOVE_ROCK_TOMB}, }, { .iv = 150, .lvl = 53, .species = SPECIES_ARBOK, .moves = {MOVE_SLUDGE_BOMB, MOVE_BITE, MOVE_EARTHQUAKE, MOVE_IRON_TAIL}, }, { .iv = 150, .lvl = 54, .species = SPECIES_VILEPLUME, .moves = {MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN, MOVE_SLEEP_POWDER, MOVE_STUN_SPORE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_TeamRocketAdmin2[] = { { .iv = 200, .lvl = 53, .species = SPECIES_GOLBAT, .moves = {MOVE_CONFUSE_RAY, MOVE_SLUDGE_BOMB, MOVE_AIR_CUTTER, MOVE_SHADOW_BALL}, }, { .iv = 200, .lvl = 54, .species = SPECIES_WEEZING, .moves = {MOVE_SLUDGE_BOMB, MOVE_THUNDERBOLT, MOVE_EXPLOSION, MOVE_SHADOW_BALL}, }, { .iv = 200, .lvl = 55, .species = SPECIES_HOUNDOOM, .moves = {MOVE_FLAMETHROWER, MOVE_CRUNCH, MOVE_IRON_TAIL, MOVE_SHADOW_BALL}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_ScientistGideon[] = { { .iv = 0, .lvl = 46, .species = SPECIES_VOLTORB, .moves = {MOVE_SWIFT, MOVE_SCREECH, MOVE_SPARK, MOVE_SONIC_BOOM}, }, { .iv = 0, .lvl = 46, .species = SPECIES_ELECTRODE, .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_CHARGE}, }, { .iv = 0, .lvl = 46, .species = SPECIES_MAGNEMITE, .moves = {MOVE_SCREECH, MOVE_SWIFT, MOVE_SPARK, MOVE_THUNDER_WAVE}, }, { .iv = 0, .lvl = 46, .species = SPECIES_MAGNETON, .moves = {MOVE_TRI_ATTACK, MOVE_SPARK, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM}, }, { .iv = 0, .lvl = 46, .species = SPECIES_PORYGON, .moves = {MOVE_TRI_ATTACK, MOVE_CONVERSION, MOVE_RECOVER, MOVE_PSYBEAM}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAmara[] = { { .iv = 0, .lvl = 36, .species = SPECIES_SEEL, }, { .iv = 0, .lvl = 36, .species = SPECIES_SEEL, }, { .iv = 0, .lvl = 36, .species = SPECIES_DEWGONG, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleMaria[] = { { .iv = 0, .lvl = 37, .species = SPECIES_SEADRA, }, { .iv = 0, .lvl = 37, .species = SPECIES_SEADRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAbigail[] = { { .iv = 0, .lvl = 35, .species = SPECIES_PSYDUCK, }, { .iv = 0, .lvl = 36, .species = SPECIES_PSYDUCK, }, { .iv = 0, .lvl = 37, .species = SPECIES_GOLDUCK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleFinn[] = { { .iv = 0, .lvl = 38, .species = SPECIES_STARMIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleGarrett[] = { { .iv = 0, .lvl = 35, .species = SPECIES_SHELLDER, }, { .iv = 0, .lvl = 35, .species = SPECIES_CLOYSTER, }, { .iv = 0, .lvl = 38, .species = SPECIES_WARTORTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanTommy[] = { { .iv = 0, .lvl = 33, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 33, .species = SPECIES_GOLDEEN, }, { .iv = 0, .lvl = 35, .species = SPECIES_SEAKING, }, { .iv = 0, .lvl = 35, .species = SPECIES_SEAKING, }, { .iv = 0, .lvl = 35, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushGirlTanya[] = { { .iv = 50, .lvl = 38, .species = SPECIES_HITMONLEE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 50, .lvl = 38, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltShea[] = { { .iv = 100, .lvl = 38, .species = SPECIES_MACHOP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 38, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltHugh[] = { { .iv = 100, .lvl = 37, .species = SPECIES_MACHOP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 100, .lvl = 37, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperBryce[] = { { .iv = 0, .lvl = 36, .species = SPECIES_NIDORINO, }, { .iv = 0, .lvl = 36, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 36, .species = SPECIES_SANDSLASH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerClaire[] = { { .iv = 0, .lvl = 35, .species = SPECIES_MEOWTH, }, { .iv = 0, .lvl = 35, .species = SPECIES_MEOWTH, }, { .iv = 0, .lvl = 35, .species = SPECIES_PIKACHU, }, { .iv = 0, .lvl = 35, .species = SPECIES_CLEFAIRY, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushKinMikKia[] = { { .iv = 50, .lvl = 39, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 50, .lvl = 39, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_AromaLadyViolet[] = { { .iv = 0, .lvl = 36, .species = SPECIES_BULBASAUR, }, { .iv = 0, .lvl = 36, .species = SPECIES_IVYSAUR, }, { .iv = 0, .lvl = 36, .species = SPECIES_IVYSAUR, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TuberAlexis[] = { { .iv = 0, .lvl = 34, .species = SPECIES_STARYU, }, { .iv = 0, .lvl = 34, .species = SPECIES_STARYU, }, { .iv = 0, .lvl = 34, .species = SPECIES_KRABBY, }, { .iv = 0, .lvl = 34, .species = SPECIES_KRABBY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TwinsJoyMeg[] = { { .iv = 0, .lvl = 37, .species = SPECIES_CLEFAIRY, }, { .iv = 0, .lvl = 37, .species = SPECIES_CLEFAIRY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleTisha[] = { { .iv = 0, .lvl = 38, .species = SPECIES_KINGLER, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PainterCelina[] = { { .iv = 50, .lvl = 50, .species = SPECIES_SMEARGLE, .moves = {MOVE_FLY, MOVE_DIG, MOVE_DIVE, MOVE_BOUNCE}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PainterRayna[] = { { .iv = 50, .lvl = 50, .species = SPECIES_SMEARGLE, .moves = {MOVE_CROSS_CHOP, MOVE_MEGAHORN, MOVE_DOUBLE_EDGE, MOVE_SELF_DESTRUCT}, }, }; static const struct TrainerMonItemDefaultMoves sParty_LadyGillian[] = { { .iv = 0, .lvl = 47, .species = SPECIES_MAREEP, .heldItem = ITEM_STARDUST, }, { .iv = 0, .lvl = 48, .species = SPECIES_MAREEP, .heldItem = ITEM_STARDUST, }, { .iv = 0, .lvl = 49, .species = SPECIES_FLAAFFY, .heldItem = ITEM_NUGGET, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDestin[] = { { .iv = 0, .lvl = 48, .species = SPECIES_RATICATE, }, { .iv = 0, .lvl = 48, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleToby[] = { { .iv = 0, .lvl = 48, .species = SPECIES_POLIWHIRL, }, { .iv = 0, .lvl = 48, .species = SPECIES_TENTACOOL, }, { .iv = 0, .lvl = 48, .species = SPECIES_TENTACRUEL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt49[] = { { .iv = 0, .lvl = 48, .species = SPECIES_RATTATA, }, { .iv = 0, .lvl = 48, .species = SPECIES_GRIMER, }, { .iv = 0, .lvl = 48, .species = SPECIES_MUK, }, }; static const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt50[] = { { .iv = 0, .lvl = 49, .species = SPECIES_KOFFING, .moves = {MOVE_MEMENTO, MOVE_HAZE, MOVE_SMOKESCREEN, MOVE_SLUDGE}, }, { .iv = 0, .lvl = 49, .species = SPECIES_WEEZING, .moves = {MOVE_HAZE, MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SELF_DESTRUCT}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt51[] = { { .iv = 50, .lvl = 48, .species = SPECIES_EKANS, }, { .iv = 50, .lvl = 48, .species = SPECIES_GLOOM, }, { .iv = 50, .lvl = 48, .species = SPECIES_GLOOM, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMilo[] = { { .iv = 0, .lvl = 47, .species = SPECIES_PIDGEY, }, { .iv = 0, .lvl = 49, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChaz[] = { { .iv = 0, .lvl = 47, .species = SPECIES_SPEAROW, }, { .iv = 0, .lvl = 49, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperHarold[] = { { .iv = 0, .lvl = 47, .species = SPECIES_HOOTHOOT, }, { .iv = 0, .lvl = 49, .species = SPECIES_NOCTOWL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanTylor[] = { { .iv = 0, .lvl = 49, .species = SPECIES_QWILFISH, }, { .iv = 0, .lvl = 49, .species = SPECIES_QWILFISH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleMymo[] = { { .iv = 0, .lvl = 49, .species = SPECIES_KINGLER, }, { .iv = 0, .lvl = 49, .species = SPECIES_WARTORTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleNicole[] = { { .iv = 0, .lvl = 50, .species = SPECIES_MARILL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroAvaGeb[] = { { .iv = 0, .lvl = 50, .species = SPECIES_POLIWHIRL, }, { .iv = 0, .lvl = 50, .species = SPECIES_STARMIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_AromaLadyRose[] = { { .iv = 0, .lvl = 49, .species = SPECIES_SUNKERN, }, { .iv = 0, .lvl = 49, .species = SPECIES_SUNFLORA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleSamir[] = { { .iv = 0, .lvl = 50, .species = SPECIES_GYARADOS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleDenise[] = { { .iv = 0, .lvl = 49, .species = SPECIES_CHINCHOU, }, { .iv = 0, .lvl = 49, .species = SPECIES_LANTURN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TwinsMiuMia[] = { { .iv = 0, .lvl = 50, .species = SPECIES_PIKACHU, }, { .iv = 0, .lvl = 50, .species = SPECIES_PIKACHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerEarl[] = { { .iv = 0, .lvl = 49, .species = SPECIES_ONIX, }, { .iv = 0, .lvl = 49, .species = SPECIES_MACHOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacFoster[] = { { .iv = 0, .lvl = 50, .species = SPECIES_GOLEM, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacLarry[] = { { .iv = 0, .lvl = 49, .species = SPECIES_MACHOKE, }, { .iv = 0, .lvl = 49, .species = SPECIES_MACHOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerDaryl[] = { { .iv = 0, .lvl = 50, .species = SPECIES_SUDOWOODO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHector[] = { { .iv = 30, .lvl = 49, .species = SPECIES_RHYHORN, }, { .iv = 30, .lvl = 49, .species = SPECIES_KANGASKHAN, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PsychicDario[] = { { .iv = 100, .lvl = 52, .species = SPECIES_GIRAFARIG, .moves = {MOVE_CRUNCH, MOVE_PSYBEAM, MOVE_ODOR_SLEUTH, MOVE_AGILITY}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PsychicRodette[] = { { .iv = 100, .lvl = 48, .species = SPECIES_NATU, .moves = {MOVE_NIGHT_SHADE, MOVE_CONFUSE_RAY, MOVE_WISH, MOVE_FUTURE_SIGHT}, }, { .iv = 100, .lvl = 48, .species = SPECIES_DROWZEE, .moves = {MOVE_PSYCHIC, MOVE_DISABLE, MOVE_PSYCH_UP, MOVE_FUTURE_SIGHT}, }, { .iv = 100, .lvl = 50, .species = SPECIES_HYPNO, .moves = {MOVE_PSYCHIC, MOVE_HYPNOSIS, MOVE_PSYCH_UP, MOVE_FUTURE_SIGHT}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_AromaLadyMiah[] = { { .iv = 0, .lvl = 50, .species = SPECIES_BELLOSSOM, }, { .iv = 0, .lvl = 50, .species = SPECIES_BELLOSSOM, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleEveJon[] = { { .iv = 0, .lvl = 50, .species = SPECIES_GOLDUCK, }, { .iv = 0, .lvl = 50, .species = SPECIES_PSYDUCK, }, }; static const struct TrainerMonNoItemCustomMoves sParty_JugglerMason[] = { { .iv = 0, .lvl = 47, .species = SPECIES_VOLTORB, .moves = {MOVE_SWIFT, MOVE_LIGHT_SCREEN, MOVE_SPARK, MOVE_SONIC_BOOM}, }, { .iv = 0, .lvl = 47, .species = SPECIES_PINECO, .moves = {MOVE_SPIKES, MOVE_BIDE, MOVE_RAPID_SPIN, MOVE_TAKE_DOWN}, }, { .iv = 0, .lvl = 47, .species = SPECIES_VOLTORB, .moves = {MOVE_SWIFT, MOVE_LIGHT_SCREEN, MOVE_SPARK, MOVE_SONIC_BOOM}, }, { .iv = 0, .lvl = 47, .species = SPECIES_PINECO, .moves = {MOVE_SPIKES, MOVE_BIDE, MOVE_RAPID_SPIN, MOVE_EXPLOSION}, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushGirlCyndy[] = { { .iv = 50, .lvl = 48, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 50, .lvl = 48, .species = SPECIES_HITMONTOP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 50, .lvl = 48, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushGirlJocelyn[] = { { .iv = 50, .lvl = 38, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, { .iv = 50, .lvl = 38, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TamerEvan[] = { { .iv = 40, .lvl = 48, .species = SPECIES_SANDSLASH, }, { .iv = 40, .lvl = 48, .species = SPECIES_LICKITUNG, }, { .iv = 40, .lvl = 49, .species = SPECIES_URSARING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacMark2[] = { { .iv = 90, .lvl = 33, .species = SPECIES_RHYHORN, }, { .iv = 90, .lvl = 33, .species = SPECIES_LICKITUNG, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerLogan[] = { { .iv = 100, .lvl = 37, .species = SPECIES_EXEGGCUTE, .moves = {MOVE_SLEEP_POWDER, MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_CONFUSION}, }, { .iv = 100, .lvl = 40, .species = SPECIES_EXEGGUTOR, .moves = {MOVE_EGG_BOMB, MOVE_STOMP, MOVE_CONFUSION, MOVE_HYPNOSIS}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerJackson[] = { { .iv = 100, .lvl = 49, .species = SPECIES_TANGELA, .moves = {MOVE_SLAM, MOVE_MEGA_DRAIN, MOVE_BIND, MOVE_INGRAIN}, }, { .iv = 100, .lvl = 49, .species = SPECIES_EXEGGCUTE, .moves = {MOVE_CONFUSION, MOVE_POISON_POWDER, MOVE_BARRAGE, MOVE_REFLECT}, }, { .iv = 100, .lvl = 49, .species = SPECIES_EXEGGUTOR, .moves = {MOVE_CONFUSION, MOVE_EGG_BOMB, MOVE_SLEEP_POWDER, MOVE_STOMP}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PkmnRangerBeth[] = { { .iv = 100, .lvl = 38, .species = SPECIES_BELLSPROUT, }, { .iv = 100, .lvl = 38, .species = SPECIES_GLOOM, }, { .iv = 100, .lvl = 38, .species = SPECIES_GLOOM, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerKatelyn[] = { { .iv = 100, .lvl = 52, .species = SPECIES_CHANSEY, .moves = {MOVE_EGG_BOMB, MOVE_DEFENSE_CURL, MOVE_MINIMIZE, MOVE_SOFT_BOILED}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerLeroy[] = { { .iv = 100, .lvl = 47, .species = SPECIES_RHYDON, .moves = {MOVE_TAKE_DOWN, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_SCARY_FACE}, }, { .iv = 100, .lvl = 48, .species = SPECIES_SLOWBRO, .moves = {MOVE_PSYCHIC, MOVE_HEADBUTT, MOVE_AMNESIA, MOVE_DISABLE}, }, { .iv = 100, .lvl = 47, .species = SPECIES_KANGASKHAN, .moves = {MOVE_DIZZY_PUNCH, MOVE_BITE, MOVE_ENDURE, MOVE_REVERSAL}, }, { .iv = 100, .lvl = 48, .species = SPECIES_MACHOKE, .moves = {MOVE_CROSS_CHOP, MOVE_VITAL_THROW, MOVE_REVENGE, MOVE_SEISMIC_TOSS}, }, { .iv = 100, .lvl = 50, .species = SPECIES_URSARING, .moves = {MOVE_SLASH, MOVE_FAINT_ATTACK, MOVE_SNORE, MOVE_REST}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerMichelle[] = { { .iv = 100, .lvl = 47, .species = SPECIES_PERSIAN, .moves = {MOVE_SLASH, MOVE_SCREECH, MOVE_FAINT_ATTACK, MOVE_BITE}, }, { .iv = 100, .lvl = 47, .species = SPECIES_DEWGONG, .moves = {MOVE_ICE_BEAM, MOVE_TAKE_DOWN, MOVE_ICY_WIND, MOVE_GROWL}, }, { .iv = 100, .lvl = 48, .species = SPECIES_NINETALES, .moves = {MOVE_FLAMETHROWER, MOVE_CONFUSE_RAY, MOVE_WILL_O_WISP, MOVE_GRUDGE}, }, { .iv = 100, .lvl = 48, .species = SPECIES_RAPIDASH, .moves = {MOVE_BOUNCE, MOVE_AGILITY, MOVE_FIRE_SPIN, MOVE_TAKE_DOWN}, }, { .iv = 100, .lvl = 50, .species = SPECIES_GIRAFARIG, .moves = {MOVE_CRUNCH, MOVE_PSYBEAM, MOVE_STOMP, MOVE_ODOR_SLEUTH}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CoolCoupleLexNya[] = { { .iv = 100, .lvl = 52, .species = SPECIES_MILTANK, .moves = {MOVE_BODY_SLAM, MOVE_MILK_DRINK, MOVE_GROWL, MOVE_DEFENSE_CURL}, }, { .iv = 100, .lvl = 52, .species = SPECIES_TAUROS, .moves = {MOVE_THRASH, MOVE_HORN_ATTACK, MOVE_PURSUIT, MOVE_SWAGGER}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacBrandon[] = { { .iv = 0, .lvl = 50, .species = SPECIES_ONIX, }, }; static const struct TrainerMonNoItemCustomMoves sParty_RuinManiacBenjamin[] = { { .iv = 0, .lvl = 48, .species = SPECIES_GEODUDE, .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_BLAST, MOVE_ROLLOUT, MOVE_SELF_DESTRUCT}, }, { .iv = 0, .lvl = 48, .species = SPECIES_GRAVELER, .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_BLAST, MOVE_ROCK_THROW, MOVE_SELF_DESTRUCT}, }, { .iv = 0, .lvl = 48, .species = SPECIES_GRAVELER, .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_BLAST, MOVE_ROCK_THROW, MOVE_SELF_DESTRUCT}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PainterEdna[] = { { .iv = 50, .lvl = 50, .species = SPECIES_SMEARGLE, .moves = {MOVE_FAKE_OUT, MOVE_EXTREME_SPEED, MOVE_PROTECT, MOVE_QUICK_ATTACK}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GentlemanClifford[] = { { .iv = 0, .lvl = 49, .species = SPECIES_MAROWAK, }, { .iv = 0, .lvl = 49, .species = SPECIES_GOLDUCK, }, }; static const struct TrainerMonItemCustomMoves sParty_LadySelphy[] = { { .iv = 0, .lvl = 49, .species = SPECIES_PERSIAN, .heldItem = ITEM_NUGGET, .abilityNum = 0, .moves = {MOVE_PAY_DAY, MOVE_BITE, MOVE_TAUNT, MOVE_TORMENT}, }, { .iv = 0, .lvl = 49, .species = SPECIES_CORSOLA, .heldItem = ITEM_NUGGET, .abilityNum = 0, .moves = {MOVE_RECOVER, MOVE_SURF, MOVE_BARRIER, MOVE_INGRAIN}, }, { .iv = 0, .lvl = 49, .species = SPECIES_PERSIAN, .heldItem = ITEM_NUGGET, .abilityNum = 0, .moves = {MOVE_PAY_DAY, MOVE_SCRATCH, MOVE_TORMENT, MOVE_TAUNT}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacLawson[] = { { .iv = 0, .lvl = 47, .species = SPECIES_ONIX, }, { .iv = 0, .lvl = 48, .species = SPECIES_GRAVELER, }, { .iv = 0, .lvl = 49, .species = SPECIES_MAROWAK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PsychicLaura[] = { { .iv = 100, .lvl = 48, .species = SPECIES_NATU, }, { .iv = 100, .lvl = 48, .species = SPECIES_NATU, }, { .iv = 100, .lvl = 49, .species = SPECIES_XATU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PkmnBreederBethany[] = { { .iv = 30, .lvl = 50, .species = SPECIES_CHANSEY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PkmnBreederAllison[] = { { .iv = 30, .lvl = 48, .species = SPECIES_CLEFAIRY, }, { .iv = 30, .lvl = 48, .species = SPECIES_CLEFAIRY, }, { .iv = 30, .lvl = 48, .species = SPECIES_CLEFABLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherGarret[] = { { .iv = 0, .lvl = 49, .species = SPECIES_HERACROSS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherJonah[] = { { .iv = 0, .lvl = 45, .species = SPECIES_YANMA, }, { .iv = 0, .lvl = 45, .species = SPECIES_BEEDRILL, }, { .iv = 0, .lvl = 46, .species = SPECIES_YANMA, }, { .iv = 0, .lvl = 47, .species = SPECIES_BEEDRILL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherVance[] = { { .iv = 0, .lvl = 48, .species = SPECIES_VENONAT, }, { .iv = 0, .lvl = 48, .species = SPECIES_VENOMOTH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterNash[] = { { .iv = 0, .lvl = 47, .species = SPECIES_WEEPINBELL, }, { .iv = 0, .lvl = 47, .species = SPECIES_WEEPINBELL, }, { .iv = 0, .lvl = 49, .species = SPECIES_VICTREEBEL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterCordell[] = { { .iv = 0, .lvl = 48, .species = SPECIES_FARFETCHD, }, { .iv = 0, .lvl = 48, .species = SPECIES_FARFETCHD, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassDalia[] = { { .iv = 0, .lvl = 46, .species = SPECIES_HOPPIP, }, { .iv = 0, .lvl = 47, .species = SPECIES_HOPPIP, }, { .iv = 0, .lvl = 47, .species = SPECIES_SKIPLOOM, }, { .iv = 0, .lvl = 48, .species = SPECIES_SKIPLOOM, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassJoana[] = { { .iv = 0, .lvl = 49, .species = SPECIES_SNUBBULL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperRiley[] = { { .iv = 0, .lvl = 49, .species = SPECIES_PINSIR, }, { .iv = 0, .lvl = 50, .species = SPECIES_HERACROSS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMarcy[] = { { .iv = 0, .lvl = 48, .species = SPECIES_PARAS, }, { .iv = 0, .lvl = 48, .species = SPECIES_PARAS, }, { .iv = 0, .lvl = 49, .species = SPECIES_PARASECT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacLayton[] = { { .iv = 0, .lvl = 48, .species = SPECIES_SANDSLASH, }, { .iv = 0, .lvl = 48, .species = SPECIES_ONIX, }, { .iv = 0, .lvl = 48, .species = SPECIES_SANDSLASH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKelsey2[] = { { .iv = 20, .lvl = 21, .species = SPECIES_NIDORAN_M, }, { .iv = 20, .lvl = 21, .species = SPECIES_NIDORAN_F, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKelsey3[] = { { .iv = 60, .lvl = 29, .species = SPECIES_NIDORINO, }, { .iv = 60, .lvl = 29, .species = SPECIES_NIDORINA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKelsey4[] = { { .iv = 80, .lvl = 49, .species = SPECIES_NIDORINO, }, { .iv = 80, .lvl = 49, .species = SPECIES_NIDORINA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperRicky2[] = { { .iv = 20, .lvl = 22, .species = SPECIES_SQUIRTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperRicky3[] = { { .iv = 60, .lvl = 30, .species = SPECIES_WARTORTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperRicky4[] = { { .iv = 120, .lvl = 55, .species = SPECIES_WARTORTLE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperJeff2[] = { { .iv = 20, .lvl = 21, .species = SPECIES_SPEAROW, }, { .iv = 20, .lvl = 21, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperJeff3[] = { { .iv = 60, .lvl = 29, .species = SPECIES_FEAROW, }, { .iv = 60, .lvl = 29, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperJeff4[] = { { .iv = 120, .lvl = 54, .species = SPECIES_FEAROW, }, { .iv = 120, .lvl = 54, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIsabelle2[] = { { .iv = 20, .lvl = 21, .species = SPECIES_PIDGEOTTO, }, { .iv = 20, .lvl = 21, .species = SPECIES_PIDGEOTTO, }, { .iv = 20, .lvl = 18, .species = SPECIES_PIDGEY, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIsabelle3[] = { { .iv = 60, .lvl = 29, .species = SPECIES_PIDGEOTTO, }, { .iv = 60, .lvl = 29, .species = SPECIES_PIDGEOTTO, }, { .iv = 60, .lvl = 26, .species = SPECIES_PIDGEOTTO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIsabelle4[] = { { .iv = 80, .lvl = 47, .species = SPECIES_PIDGEOTTO, }, { .iv = 80, .lvl = 47, .species = SPECIES_PIDGEOTTO, }, { .iv = 80, .lvl = 50, .species = SPECIES_PIDGEOT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterYasu2[] = { { .iv = 40, .lvl = 22, .species = SPECIES_RATTATA, }, { .iv = 40, .lvl = 22, .species = SPECIES_RATICATE, }, { .iv = 40, .lvl = 22, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterYasu3[] = { { .iv = 80, .lvl = 47, .species = SPECIES_RATICATE, }, { .iv = 80, .lvl = 47, .species = SPECIES_RATICATE, }, { .iv = 80, .lvl = 47, .species = SPECIES_RATICATE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_EngineerBernie2[] = { { .iv = 60, .lvl = 28, .species = SPECIES_MAGNETON, }, { .iv = 60, .lvl = 28, .species = SPECIES_MAGNETON, }, { .iv = 60, .lvl = 28, .species = SPECIES_MAGNETON, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GamerDarian2[] = { { .iv = 60, .lvl = 29, .species = SPECIES_GROWLITHE, }, { .iv = 60, .lvl = 29, .species = SPECIES_VULPIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperChris2[] = { { .iv = 40, .lvl = 24, .species = SPECIES_GROWLITHE, }, { .iv = 40, .lvl = 24, .species = SPECIES_CHARMANDER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperChris3[] = { { .iv = 60, .lvl = 29, .species = SPECIES_GROWLITHE, }, { .iv = 60, .lvl = 29, .species = SPECIES_CHARMELEON, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CamperChris4[] = { { .iv = 120, .lvl = 54, .species = SPECIES_ARCANINE, }, { .iv = 120, .lvl = 54, .species = SPECIES_CHARMELEON, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlicia2[] = { { .iv = 40, .lvl = 25, .species = SPECIES_MEOWTH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlicia3[] = { { .iv = 60, .lvl = 30, .species = SPECIES_PERSIAN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlicia4[] = { { .iv = 120, .lvl = 55, .species = SPECIES_PERSIAN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerJeremy2[] = { { .iv = 60, .lvl = 30, .species = SPECIES_MACHOKE, }, { .iv = 60, .lvl = 28, .species = SPECIES_ONIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacMark3[] = { { .iv = 150, .lvl = 54, .species = SPECIES_RHYDON, }, { .iv = 150, .lvl = 54, .species = SPECIES_LICKITUNG, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHerman2[] = { { .iv = 90, .lvl = 29, .species = SPECIES_MAROWAK, }, { .iv = 90, .lvl = 29, .species = SPECIES_SLOWBRO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHerman3[] = { { .iv = 150, .lvl = 54, .species = SPECIES_MAROWAK, }, { .iv = 150, .lvl = 54, .species = SPECIES_SLOWBRO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerTrent2[] = { { .iv = 60, .lvl = 31, .species = SPECIES_ONIX, }, { .iv = 60, .lvl = 31, .species = SPECIES_GRAVELER, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassMegan2[] = { { .iv = 40, .lvl = 22, .species = SPECIES_PIDGEOTTO, }, { .iv = 40, .lvl = 22, .species = SPECIES_RATICATE, }, { .iv = 40, .lvl = 23, .species = SPECIES_NIDORAN_M, }, { .iv = 40, .lvl = 21, .species = SPECIES_MEOWTH, }, { .iv = 40, .lvl = 22, .species = SPECIES_PIKACHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_LassMegan3[] = { { .iv = 80, .lvl = 46, .species = SPECIES_PIDGEOT, }, { .iv = 80, .lvl = 47, .species = SPECIES_RATICATE, }, { .iv = 80, .lvl = 47, .species = SPECIES_NIDORINO, }, { .iv = 80, .lvl = 47, .species = SPECIES_PERSIAN, }, { .iv = 80, .lvl = 48, .species = SPECIES_RAICHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdGlenn2[] = { { .iv = 60, .lvl = 28, .species = SPECIES_MUK, }, { .iv = 60, .lvl = 28, .species = SPECIES_MUK, }, { .iv = 60, .lvl = 28, .species = SPECIES_MUK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_GamerRich2[] = { { .iv = 60, .lvl = 30, .species = SPECIES_GROWLITHE, }, { .iv = 60, .lvl = 30, .species = SPECIES_VULPIX, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BikerJaren2[] = { { .iv = 60, .lvl = 28, .species = SPECIES_MUK, }, { .iv = 60, .lvl = 30, .species = SPECIES_MUK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanElliot2[] = { { .iv = 60, .lvl = 28, .species = SPECIES_POLIWHIRL, }, { .iv = 60, .lvl = 28, .species = SPECIES_CLOYSTER, }, { .iv = 60, .lvl = 28, .species = SPECIES_SEAKING, }, { .iv = 60, .lvl = 28, .species = SPECIES_SEADRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RockerLuca2[] = { { .iv = 60, .lvl = 33, .species = SPECIES_ELECTRODE, }, { .iv = 60, .lvl = 33, .species = SPECIES_ELECTRODE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautySheila2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_CLEFAIRY, }, { .iv = 80, .lvl = 49, .species = SPECIES_PERSIAN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRobert2[] = { { .iv = 60, .lvl = 28, .species = SPECIES_PIDGEOTTO, }, { .iv = 60, .lvl = 28, .species = SPECIES_PIDGEOTTO, }, { .iv = 60, .lvl = 28, .species = SPECIES_FEAROW, }, { .iv = 60, .lvl = 28, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRobert3[] = { { .iv = 80, .lvl = 47, .species = SPECIES_PIDGEOT, }, { .iv = 80, .lvl = 47, .species = SPECIES_PIDGEOT, }, { .iv = 80, .lvl = 47, .species = SPECIES_FEAROW, }, { .iv = 80, .lvl = 47, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSusie2[] = { { .iv = 60, .lvl = 27, .species = SPECIES_PIDGEOTTO, }, { .iv = 60, .lvl = 27, .species = SPECIES_MEOWTH, }, { .iv = 60, .lvl = 27, .species = SPECIES_RATICATE, }, { .iv = 60, .lvl = 27, .species = SPECIES_PIKACHU, }, { .iv = 60, .lvl = 27, .species = SPECIES_MEOWTH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSusie3[] = { { .iv = 80, .lvl = 47, .species = SPECIES_PIDGEOTTO, }, { .iv = 80, .lvl = 47, .species = SPECIES_PERSIAN, }, { .iv = 80, .lvl = 47, .species = SPECIES_RATICATE, }, { .iv = 80, .lvl = 47, .species = SPECIES_PIKACHU, }, { .iv = 80, .lvl = 47, .species = SPECIES_PERSIAN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSusie4[] = { { .iv = 120, .lvl = 52, .species = SPECIES_PIDGEOT, }, { .iv = 120, .lvl = 52, .species = SPECIES_PERSIAN, }, { .iv = 120, .lvl = 52, .species = SPECIES_RATICATE, }, { .iv = 120, .lvl = 52, .species = SPECIES_RAICHU, }, { .iv = 120, .lvl = 52, .species = SPECIES_PERSIAN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BikerLukas2[] = { { .iv = 80, .lvl = 47, .species = SPECIES_KOFFING, }, { .iv = 80, .lvl = 47, .species = SPECIES_KOFFING, }, { .iv = 80, .lvl = 47, .species = SPECIES_MUK, }, { .iv = 80, .lvl = 47, .species = SPECIES_WEEZING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperBenny2[] = { { .iv = 60, .lvl = 32, .species = SPECIES_FEAROW, }, { .iv = 60, .lvl = 32, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperBenny3[] = { { .iv = 80, .lvl = 49, .species = SPECIES_FEAROW, }, { .iv = 80, .lvl = 49, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMarlon2[] = { { .iv = 60, .lvl = 30, .species = SPECIES_FEAROW, }, { .iv = 60, .lvl = 30, .species = SPECIES_DODUO, }, { .iv = 60, .lvl = 30, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMarlon3[] = { { .iv = 80, .lvl = 48, .species = SPECIES_FEAROW, }, { .iv = 80, .lvl = 48, .species = SPECIES_DODRIO, }, { .iv = 80, .lvl = 48, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BeautyGrace2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_PIDGEOT, }, { .iv = 80, .lvl = 49, .species = SPECIES_WIGGLYTUFF, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChester2[] = { { .iv = 60, .lvl = 30, .species = SPECIES_DODRIO, }, { .iv = 60, .lvl = 30, .species = SPECIES_DODRIO, }, { .iv = 60, .lvl = 30, .species = SPECIES_DODUO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChester3[] = { { .iv = 80, .lvl = 48, .species = SPECIES_DODRIO, }, { .iv = 80, .lvl = 48, .species = SPECIES_DODRIO, }, { .iv = 80, .lvl = 48, .species = SPECIES_DODRIO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerBecky2[] = { { .iv = 60, .lvl = 32, .species = SPECIES_PIKACHU, }, { .iv = 60, .lvl = 32, .species = SPECIES_RAICHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerBecky3[] = { { .iv = 80, .lvl = 49, .species = SPECIES_PIKACHU, }, { .iv = 80, .lvl = 49, .species = SPECIES_RAICHU, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerBecky4[] = { { .iv = 120, .lvl = 54, .species = SPECIES_RAICHU, }, { .iv = 120, .lvl = 54, .species = SPECIES_RAICHU, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushKinRonMya2[] = { { .iv = 110, .lvl = 33, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, { .iv = 110, .lvl = 33, .species = SPECIES_HITMONLEE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushKinRonMya3[] = { { .iv = 130, .lvl = 51, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, { .iv = 130, .lvl = 51, .species = SPECIES_HITMONLEE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushKinRonMya4[] = { { .iv = 170, .lvl = 56, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, { .iv = 170, .lvl = 56, .species = SPECIES_HITMONLEE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BikerRuben2[] = { { .iv = 80, .lvl = 48, .species = SPECIES_WEEZING, }, { .iv = 80, .lvl = 48, .species = SPECIES_WEEZING, }, { .iv = 80, .lvl = 48, .species = SPECIES_WEEZING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallCamron2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_PRIMEAPE, }, { .iv = 80, .lvl = 49, .species = SPECIES_MACHOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BikerJaxon2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_WEEZING, }, { .iv = 80, .lvl = 49, .species = SPECIES_MUK, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallIsaiah2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_MACHOKE, }, { .iv = 80, .lvl = 49, .species = SPECIES_MACHAMP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallCorey2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_PRIMEAPE, }, { .iv = 80, .lvl = 49, .species = SPECIES_MACHAMP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperJacob2[] = { { .iv = 60, .lvl = 28, .species = SPECIES_FEAROW, }, { .iv = 60, .lvl = 28, .species = SPECIES_SPEAROW, }, { .iv = 60, .lvl = 28, .species = SPECIES_FEAROW, }, { .iv = 60, .lvl = 28, .species = SPECIES_SPEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperJacob3[] = { { .iv = 80, .lvl = 47, .species = SPECIES_FEAROW, }, { .iv = 80, .lvl = 47, .species = SPECIES_FEAROW, }, { .iv = 80, .lvl = 47, .species = SPECIES_FEAROW, }, { .iv = 80, .lvl = 47, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAlice2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_SEAKING, }, { .iv = 80, .lvl = 49, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDarrin2[] = { { .iv = 120, .lvl = 52, .species = SPECIES_SEADRA, }, { .iv = 120, .lvl = 52, .species = SPECIES_SEADRA, }, { .iv = 120, .lvl = 52, .species = SPECIES_SEADRA, }, { .iv = 120, .lvl = 52, .species = SPECIES_SEADRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMissy2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_SEAKING, }, { .iv = 80, .lvl = 49, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMissy3[] = { { .iv = 120, .lvl = 54, .species = SPECIES_SEAKING, }, { .iv = 120, .lvl = 54, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_FishermanWade2[] = { { .iv = 80, .lvl = 47, .species = SPECIES_MAGIKARP, }, { .iv = 80, .lvl = 47, .species = SPECIES_MAGIKARP, }, { .iv = 80, .lvl = 47, .species = SPECIES_MAGIKARP, }, { .iv = 80, .lvl = 47, .species = SPECIES_MAGIKARP, }, { .iv = 80, .lvl = 47, .species = SPECIES_MAGIKARP, }, { .iv = 80, .lvl = 47, .species = SPECIES_MAGIKARP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleJack2[] = { { .iv = 80, .lvl = 50, .species = SPECIES_STARMIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroLilIan2[] = { { .iv = 80, .lvl = 50, .species = SPECIES_SEADRA, }, { .iv = 80, .lvl = 50, .species = SPECIES_STARMIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroLilIan3[] = { { .iv = 120, .lvl = 55, .species = SPECIES_SEADRA, }, { .iv = 120, .lvl = 55, .species = SPECIES_STARMIE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleFinn2[] = { { .iv = 80, .lvl = 50, .species = SPECIES_STARMIE, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushGirlSharon2[] = { { .iv = 130, .lvl = 50, .species = SPECIES_MANKEY, .heldItem = ITEM_BLACK_BELT, }, { .iv = 130, .lvl = 50, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushGirlSharon3[] = { { .iv = 170, .lvl = 55, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 170, .lvl = 55, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushGirlTanya2[] = { { .iv = 130, .lvl = 50, .species = SPECIES_HITMONLEE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 130, .lvl = 50, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushGirlTanya3[] = { { .iv = 170, .lvl = 55, .species = SPECIES_HITMONLEE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 170, .lvl = 55, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltShea2[] = { { .iv = 180, .lvl = 50, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 180, .lvl = 50, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltShea3[] = { { .iv = 220, .lvl = 55, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 220, .lvl = 55, .species = SPECIES_MACHAMP, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltHugh2[] = { { .iv = 180, .lvl = 50, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 180, .lvl = 50, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_BlackBeltHugh3[] = { { .iv = 220, .lvl = 55, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 220, .lvl = 55, .species = SPECIES_MACHAMP, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushKinMikKia2[] = { { .iv = 130, .lvl = 51, .species = SPECIES_MACHOKE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 130, .lvl = 51, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushKinMikKia3[] = { { .iv = 170, .lvl = 56, .species = SPECIES_MACHAMP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 170, .lvl = 56, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TuberAmira2[] = { { .iv = 80, .lvl = 47, .species = SPECIES_POLIWHIRL, }, { .iv = 80, .lvl = 47, .species = SPECIES_POLIWHIRL, }, { .iv = 80, .lvl = 47, .species = SPECIES_POLIWHIRL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TwinsJoyMeg2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_CLEFAIRY, }, { .iv = 80, .lvl = 49, .species = SPECIES_CLEFAIRY, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PainterRayna2[] = { { .iv = 120, .lvl = 54, .species = SPECIES_SMEARGLE, .moves = {MOVE_CROSS_CHOP, MOVE_MEGAHORN, MOVE_DOUBLE_EDGE, MOVE_SELF_DESTRUCT}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDestin2[] = { { .iv = 120, .lvl = 53, .species = SPECIES_RATICATE, }, { .iv = 120, .lvl = 53, .species = SPECIES_PIDGEOT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PkmnBreederAlize2[] = { { .iv = 150, .lvl = 53, .species = SPECIES_PIKACHU, }, { .iv = 150, .lvl = 53, .species = SPECIES_CLEFAIRY, }, { .iv = 150, .lvl = 53, .species = SPECIES_MARILL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleGiaJes2[] = { { .iv = 60, .lvl = 30, .species = SPECIES_NIDORINA, }, { .iv = 60, .lvl = 30, .species = SPECIES_NIDORINO, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleGiaJes3[] = { { .iv = 120, .lvl = 55, .species = SPECIES_NIDOKING, }, { .iv = 120, .lvl = 55, .species = SPECIES_NIDOQUEEN, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMilo2[] = { { .iv = 120, .lvl = 53, .species = SPECIES_PIDGEOTTO, }, { .iv = 120, .lvl = 55, .species = SPECIES_PIDGEOT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChaz2[] = { { .iv = 120, .lvl = 53, .species = SPECIES_FEAROW, }, { .iv = 120, .lvl = 55, .species = SPECIES_FEAROW, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperHarold2[] = { { .iv = 120, .lvl = 53, .species = SPECIES_NOCTOWL, }, { .iv = 120, .lvl = 55, .species = SPECIES_NOCTOWL, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleNicole2[] = { { .iv = 120, .lvl = 54, .species = SPECIES_MARILL, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PsychicJaclyn2[] = { { .iv = 220, .lvl = 52, .species = SPECIES_NATU, .moves = {MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_FUTURE_SIGHT, MOVE_WISH}, }, { .iv = 220, .lvl = 52, .species = SPECIES_SLOWBRO, .moves = {MOVE_PSYCHIC, MOVE_HEADBUTT, MOVE_AMNESIA, MOVE_YAWN}, }, { .iv = 220, .lvl = 54, .species = SPECIES_KADABRA, .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleSamir2[] = { { .iv = 120, .lvl = 55, .species = SPECIES_GYARADOS, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_HikerEarl2[] = { { .iv = 120, .lvl = 54, .species = SPECIES_ONIX, }, { .iv = 120, .lvl = 54, .species = SPECIES_MACHAMP, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacLarry2[] = { { .iv = 120, .lvl = 54, .species = SPECIES_MACHOKE, }, { .iv = 120, .lvl = 54, .species = SPECIES_MACHOKE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHector2[] = { { .iv = 150, .lvl = 55, .species = SPECIES_RHYDON, }, { .iv = 150, .lvl = 55, .species = SPECIES_KANGASKHAN, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PsychicDario2[] = { { .iv = 220, .lvl = 56, .species = SPECIES_GIRAFARIG, .moves = {MOVE_CRUNCH, MOVE_PSYBEAM, MOVE_ODOR_SLEUTH, MOVE_AGILITY}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PsychicRodette2[] = { { .iv = 220, .lvl = 53, .species = SPECIES_NATU, .moves = {MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_WISH, MOVE_FUTURE_SIGHT}, }, { .iv = 220, .lvl = 53, .species = SPECIES_HYPNO, .moves = {MOVE_PSYCHIC, MOVE_DISABLE, MOVE_PSYCH_UP, MOVE_FUTURE_SIGHT}, }, { .iv = 220, .lvl = 53, .species = SPECIES_HYPNO, .moves = {MOVE_PSYCHIC, MOVE_HYPNOSIS, MOVE_PSYCH_UP, MOVE_FUTURE_SIGHT}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_JugglerMason2[] = { { .iv = 120, .lvl = 52, .species = SPECIES_ELECTRODE, }, { .iv = 120, .lvl = 52, .species = SPECIES_PINECO, }, { .iv = 120, .lvl = 52, .species = SPECIES_ELECTRODE, }, { .iv = 120, .lvl = 52, .species = SPECIES_PINECO, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerNicolas2[] = { { .iv = 220, .lvl = 55, .species = SPECIES_VICTREEBEL, .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_STUN_SPORE, MOVE_WRAP}, }, { .iv = 220, .lvl = 55, .species = SPECIES_VICTREEBEL, .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_SLEEP_POWDER, MOVE_SLAM}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerMadeline2[] = { { .iv = 220, .lvl = 55, .species = SPECIES_VILEPLUME, .moves = {MOVE_PETAL_DANCE, MOVE_MOONLIGHT, MOVE_ACID, MOVE_SLEEP_POWDER}, }, { .iv = 220, .lvl = 55, .species = SPECIES_VILEPLUME, .moves = {MOVE_PETAL_DANCE, MOVE_MOONLIGHT, MOVE_ACID, MOVE_STUN_SPORE}, }, }; static const struct TrainerMonItemDefaultMoves sParty_CrushGirlCyndy2[] = { { .iv = 170, .lvl = 54, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_BLACK_BELT, }, { .iv = 170, .lvl = 54, .species = SPECIES_HITMONTOP, .heldItem = ITEM_BLACK_BELT, }, { .iv = 170, .lvl = 54, .species = SPECIES_MACHAMP, .heldItem = ITEM_BLACK_BELT, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_TamerEvan2[] = { { .iv = 160, .lvl = 52, .species = SPECIES_SANDSLASH, }, { .iv = 160, .lvl = 52, .species = SPECIES_LICKITUNG, }, { .iv = 160, .lvl = 55, .species = SPECIES_URSARING, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerJackson2[] = { { .iv = 220, .lvl = 53, .species = SPECIES_TANGELA, .moves = {MOVE_SLAM, MOVE_MEGA_DRAIN, MOVE_BIND, MOVE_INGRAIN}, }, { .iv = 220, .lvl = 54, .species = SPECIES_EXEGGUTOR, .moves = {MOVE_CONFUSION, MOVE_EGG_BOMB, MOVE_STUN_SPORE, MOVE_REFLECT}, }, { .iv = 220, .lvl = 55, .species = SPECIES_EXEGGUTOR, .moves = {MOVE_CONFUSION, MOVE_EGG_BOMB, MOVE_SLEEP_POWDER, MOVE_STOMP}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerKatelyn2[] = { { .iv = 220, .lvl = 56, .species = SPECIES_CHANSEY, .moves = {MOVE_EGG_BOMB, MOVE_DEFENSE_CURL, MOVE_MINIMIZE, MOVE_SOFT_BOILED}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerLeroy2[] = { { .iv = 220, .lvl = 52, .species = SPECIES_RHYDON, .moves = {MOVE_EARTHQUAKE, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_SCARY_FACE}, }, { .iv = 220, .lvl = 54, .species = SPECIES_SLOWBRO, .moves = {MOVE_PSYCHIC, MOVE_HEADBUTT, MOVE_AMNESIA, MOVE_DISABLE}, }, { .iv = 220, .lvl = 52, .species = SPECIES_KANGASKHAN, .moves = {MOVE_DIZZY_PUNCH, MOVE_BITE, MOVE_ENDURE, MOVE_REVERSAL}, }, { .iv = 220, .lvl = 52, .species = SPECIES_MACHAMP, .moves = {MOVE_CROSS_CHOP, MOVE_VITAL_THROW, MOVE_REVENGE, MOVE_SEISMIC_TOSS}, }, { .iv = 220, .lvl = 55, .species = SPECIES_URSARING, .moves = {MOVE_SLASH, MOVE_FAINT_ATTACK, MOVE_SNORE, MOVE_REST}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CooltrainerMichelle2[] = { { .iv = 220, .lvl = 53, .species = SPECIES_PERSIAN, .moves = {MOVE_SLASH, MOVE_SCREECH, MOVE_FAINT_ATTACK, MOVE_BITE}, }, { .iv = 220, .lvl = 53, .species = SPECIES_DEWGONG, .moves = {MOVE_ICE_BEAM, MOVE_TAKE_DOWN, MOVE_ICY_WIND, MOVE_SHEER_COLD}, }, { .iv = 220, .lvl = 54, .species = SPECIES_NINETALES, .moves = {MOVE_FLAMETHROWER, MOVE_CONFUSE_RAY, MOVE_WILL_O_WISP, MOVE_GRUDGE}, }, { .iv = 220, .lvl = 54, .species = SPECIES_RAPIDASH, .moves = {MOVE_BOUNCE, MOVE_AGILITY, MOVE_FIRE_SPIN, MOVE_TAKE_DOWN}, }, { .iv = 220, .lvl = 56, .species = SPECIES_GIRAFARIG, .moves = {MOVE_CRUNCH, MOVE_PSYBEAM, MOVE_STOMP, MOVE_ODOR_SLEUTH}, }, }; static const struct TrainerMonNoItemCustomMoves sParty_CoolCoupleLexNya2[] = { { .iv = 220, .lvl = 57, .species = SPECIES_MILTANK, .moves = {MOVE_BODY_SLAM, MOVE_MILK_DRINK, MOVE_GROWL, MOVE_DEFENSE_CURL}, }, { .iv = 220, .lvl = 57, .species = SPECIES_TAUROS, .moves = {MOVE_TAKE_DOWN, MOVE_SCARY_FACE, MOVE_PURSUIT, MOVE_SWAGGER}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherColton2[] = { { .iv = 20, .lvl = 19, .species = SPECIES_METAPOD, }, { .iv = 20, .lvl = 19, .species = SPECIES_WEEDLE, }, { .iv = 20, .lvl = 19, .species = SPECIES_METAPOD, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherColton3[] = { { .iv = 60, .lvl = 27, .species = SPECIES_BUTTERFREE, }, { .iv = 60, .lvl = 27, .species = SPECIES_KAKUNA, }, { .iv = 60, .lvl = 27, .species = SPECIES_BUTTERFREE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherColton4[] = { { .iv = 120, .lvl = 51, .species = SPECIES_BUTTERFREE, }, { .iv = 120, .lvl = 54, .species = SPECIES_BEEDRILL, }, { .iv = 120, .lvl = 51, .species = SPECIES_BUTTERFREE, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleMatthew2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_POLIWHIRL, }, { .iv = 80, .lvl = 49, .species = SPECIES_POLIWRATH, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleTony2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_SEADRA, }, { .iv = 80, .lvl = 49, .species = SPECIES_SEADRA, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleMelissa2[] = { { .iv = 80, .lvl = 49, .species = SPECIES_POLIWHIRL, }, { .iv = 80, .lvl = 49, .species = SPECIES_SEAKING, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourLorelei2[] = { { .iv = 255, .lvl = 64, .species = SPECIES_DEWGONG, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_SIGNAL_BEAM, MOVE_DOUBLE_TEAM}, }, { .iv = 255, .lvl = 63, .species = SPECIES_CLOYSTER, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_SUPERSONIC, MOVE_RAIN_DANCE}, }, { .iv = 255, .lvl = 63, .species = SPECIES_PILOSWINE, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_BLIZZARD, MOVE_EARTHQUAKE, MOVE_DOUBLE_EDGE, MOVE_ROCK_SLIDE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_JYNX, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_PSYCHIC, MOVE_LOVELY_KISS, MOVE_ATTRACT}, }, { .iv = 255, .lvl = 66, .species = SPECIES_LAPRAS, .heldItem = ITEM_CHERI_BERRY, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_PSYCHIC, MOVE_THUNDER}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourBruno2[] = { { .iv = 255, .lvl = 65, .species = SPECIES_STEELIX, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_CRUNCH, MOVE_ROCK_TOMB}, }, { .iv = 255, .lvl = 65, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SKY_UPPERCUT, MOVE_MACH_PUNCH, MOVE_ROCK_SLIDE, MOVE_COUNTER}, }, { .iv = 255, .lvl = 65, .species = SPECIES_HITMONLEE, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_MEGA_KICK, MOVE_FORESIGHT, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_STEELIX, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_CRUNCH, MOVE_DRAGON_BREATH}, }, { .iv = 255, .lvl = 68, .species = SPECIES_MACHAMP, .heldItem = ITEM_PERSIM_BERRY, .abilityNum = 0, .moves = {MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_BRICK_BREAK, MOVE_ROCK_SLIDE}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourAgatha2[] = { { .iv = 255, .lvl = 66, .species = SPECIES_GENGAR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_HYPNOSIS}, }, { .iv = 255, .lvl = 66, .species = SPECIES_CROBAT, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_AIR_CUTTER, MOVE_SHADOW_BALL, MOVE_CONFUSE_RAY}, }, { .iv = 255, .lvl = 65, .species = SPECIES_MISDREAVUS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_ATTRACT}, }, { .iv = 255, .lvl = 68, .species = SPECIES_ARBOK, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_EARTHQUAKE, MOVE_GIGA_DRAIN, MOVE_DOUBLE_TEAM}, }, { .iv = 255, .lvl = 70, .species = SPECIES_GENGAR, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourLance2[] = { { .iv = 255, .lvl = 68, .species = SPECIES_GYARADOS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_THUNDER_WAVE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_DRAGONITE, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_EARTHQUAKE, MOVE_DRAGON_CLAW, MOVE_FLAMETHROWER}, }, { .iv = 255, .lvl = 66, .species = SPECIES_KINGDRA, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_DRAGON_DANCE, MOVE_SURF, MOVE_ICE_BEAM}, }, { .iv = 255, .lvl = 70, .species = SPECIES_AERODACTYL, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_ANCIENT_POWER, MOVE_AERIAL_ACE, MOVE_EARTHQUAKE}, }, { .iv = 255, .lvl = 72, .species = SPECIES_DRAGONITE, .heldItem = ITEM_PERSIM_BERRY, .abilityNum = 0, .moves = {MOVE_HYPER_BEAM, MOVE_OUTRAGE, MOVE_THUNDERBOLT, MOVE_ICE_BEAM}, }, }; static const struct TrainerMonItemCustomMoves sParty_ChampionRematchSquirtle[] = { { .iv = 255, .lvl = 72, .species = SPECIES_HERACROSS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_ROCK_TOMB}, }, { .iv = 255, .lvl = 73, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_CALM_MIND, MOVE_REFLECT}, }, { .iv = 255, .lvl = 72, .species = SPECIES_TYRANITAR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_AERIAL_ACE}, }, { .iv = 255, .lvl = 73, .species = SPECIES_ARCANINE, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_OVERHEAT, MOVE_AERIAL_ACE, MOVE_IRON_TAIL}, }, { .iv = 255, .lvl = 73, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_GIGA_DRAIN, MOVE_PSYCHIC, MOVE_SLEEP_POWDER, MOVE_LIGHT_SCREEN}, }, { .iv = 255, .lvl = 75, .species = SPECIES_BLASTOISE, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_HYDRO_PUMP, MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_RAIN_DANCE}, }, }; static const struct TrainerMonItemCustomMoves sParty_ChampionRematchBulbasaur[] = { { .iv = 255, .lvl = 72, .species = SPECIES_HERACROSS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_ROCK_TOMB}, }, { .iv = 255, .lvl = 73, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_CALM_MIND, MOVE_REFLECT}, }, { .iv = 255, .lvl = 72, .species = SPECIES_TYRANITAR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_AERIAL_ACE}, }, { .iv = 255, .lvl = 73, .species = SPECIES_GYARADOS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYDRO_PUMP, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM}, }, { .iv = 255, .lvl = 73, .species = SPECIES_ARCANINE, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_OVERHEAT, MOVE_AERIAL_ACE, MOVE_IRON_TAIL}, }, { .iv = 255, .lvl = 75, .species = SPECIES_VENUSAUR, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_SOLAR_BEAM, MOVE_SLUDGE_BOMB, MOVE_EARTHQUAKE, MOVE_SUNNY_DAY}, }, }; static const struct TrainerMonItemCustomMoves sParty_ChampionRematchCharmander[] = { { .iv = 255, .lvl = 72, .species = SPECIES_HERACROSS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_ROCK_TOMB}, }, { .iv = 255, .lvl = 73, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_CALM_MIND, MOVE_REFLECT}, }, { .iv = 255, .lvl = 72, .species = SPECIES_TYRANITAR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_AERIAL_ACE}, }, { .iv = 255, .lvl = 73, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_GIGA_DRAIN, MOVE_PSYCHIC, MOVE_SLEEP_POWDER, MOVE_LIGHT_SCREEN}, }, { .iv = 255, .lvl = 73, .species = SPECIES_GYARADOS, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_HYDRO_PUMP, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM}, }, { .iv = 255, .lvl = 75, .species = SPECIES_CHARIZARD, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_FIRE_BLAST, MOVE_DRAGON_CLAW, MOVE_AERIAL_ACE, MOVE_EARTHQUAKE}, }, }; static const struct TrainerMonNoItemDefaultMoves sParty_CueBallPaxton[] = { { .iv = 50, .lvl = 39, .species = SPECIES_WEEZING, }, { .iv = 50, .lvl = 39, .species = SPECIES_MUK, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderBrockChallenge[] = { { .iv = 250, .lvl = 12, .species = SPECIES_GEODUDE, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_TOMB, MOVE_SANDSTORM}, }, { .iv = 250, .lvl = 12, .species = SPECIES_RHYHORN, .heldItem = ITEM_NONE, .abilityNum = 1, .moves = {MOVE_FURY_ATTACK, MOVE_ROCK_TOMB, MOVE_TAIL_WHIP, MOVE_SANDSTORM}, }, { .iv = 250, .lvl = 14, .species = SPECIES_ONIX, .heldItem = ITEM_ORAN_BERRY, .abilityNum = 0, .moves = {MOVE_TACKLE, MOVE_ROAR, MOVE_ROCK_TOMB, MOVE_SAND_TOMB}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderMistyChallenge[] = { { .iv = 250, .lvl = 18, .species = SPECIES_STARYU, .heldItem = ITEM_ORAN_BERRY, .abilityNum = 1, .moves = {MOVE_TACKLE, MOVE_RECOVER, MOVE_WATER_PULSE, MOVE_CAMOUFLAGE}, }, { .iv = 250, .lvl = 18, .species = SPECIES_SHELLDER, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_ICY_WIND, MOVE_DIVE, MOVE_PROTECT, MOVE_SUPERSONIC}, }, { .iv = 250, .lvl = 21, .species = SPECIES_STARMIE, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 1, .moves = {MOVE_SWIFT, MOVE_RECOVER, MOVE_COSMIC_POWER, MOVE_WATER_PULSE}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderLtSurgeChallenge[] = { { .iv = 250, .lvl = 21, .species = SPECIES_VOLTORB, .heldItem = ITEM_NONE, .abilityNum = 1, .moves = {MOVE_SONIC_BOOM, MOVE_SELF_DESTRUCT, MOVE_PROTECT, MOVE_SHOCK_WAVE}, }, { .iv = 250, .lvl = 18, .species = SPECIES_JOLTEON, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_SHOCK_WAVE, MOVE_CHARM, MOVE_MUD_SLAP, MOVE_BITE}, }, { .iv = 250, .lvl = 18, .species = SPECIES_ELECTABUZZ, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SHOCK_WAVE, MOVE_ICE_PUNCH, MOVE_QUICK_ATTACK, MOVE_KARATE_CHOP}, }, { .iv = 250, .lvl = 24, .species = SPECIES_RAICHU, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_COUNTER, MOVE_THUNDER_WAVE, MOVE_HIDDEN_POWER, MOVE_SHOCK_WAVE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_LeaderErikaChallenge[] = { { .iv = 12, //Challenge Erika's Victreebel, 0 Atk, 9 SpAtk & 30 others. This nerfs Victreebel's attacking stats to be in line with Vileplume. .lvl = 29, .evs = { 0, 0, 0, 0, 0, 0}, .nature = NATURE_MODEST, .species = SPECIES_VICTREEBEL, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_SLEEP_POWDER, MOVE_INGRAIN, MOVE_GIGA_DRAIN}, }, { .iv = 13, // all 30 .lvl = 24, .evs = { 0, 0, 0, 0, 0, 0}, .nature = NATURE_HARDY, .species = SPECIES_TANGELA, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SLEEP_POWDER, MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_GIGA_DRAIN}, }, { .iv = 13, // all 30 .lvl = 29, .evs = { 0, 0, 0, 0, 0, 0}, .nature = NATURE_HARDY, .species = SPECIES_PARASECT, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_SPORE, MOVE_AERIAL_ACE, MOVE_DIG, MOVE_SLASH}, }, { .iv = 13, // all 30 .lvl = 29, .evs = { 0, 0, 0, 0, 0, 0}, .nature = NATURE_HARDY, .species = SPECIES_VILEPLUME, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_SLEEP_POWDER, MOVE_MOONLIGHT, MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderKogaChallenge[] = { { .iv = 250, .lvl = 37, .species = SPECIES_KOFFING, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_EXPLOSION, MOVE_SLUDGE_BOMB, MOVE_TORMENT, MOVE_TOXIC}, }, { .iv = 250, .lvl = 39, .species = SPECIES_MUK, .heldItem = ITEM_NONE, .abilityNum = 1, .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_CURSE, MOVE_TOXIC}, }, { .iv = 250, .lvl = 37, .species = SPECIES_VENOMOTH, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_SIGNAL_BEAM, MOVE_PSYCHIC, MOVE_TOXIC}, }, { .iv = 250, .lvl = 37, .species = SPECIES_TENTACRUEL, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_BARRIER, MOVE_TOXIC}, }, { .iv = 250, .lvl = 43, .species = SPECIES_WEEZING, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_PAIN_SPLIT, MOVE_SLUDGE, MOVE_SHADOW_BALL, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderSabrinaChallenge[] = { { .iv = 250, .lvl = 38, .species = SPECIES_HYPNO, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_PSYBEAM, MOVE_REFLECT, MOVE_BATON_PASS, MOVE_CALM_MIND}, }, { .iv = 250, .lvl = 37, .species = SPECIES_MR_MIME, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_BARRIER, MOVE_PSYBEAM, MOVE_BATON_PASS, MOVE_SUBSTITUTE}, }, { .iv = 250, .lvl = 37, .species = SPECIES_SLOWBRO, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 1, .moves = {MOVE_FACADE, MOVE_CURSE, MOVE_SHADOW_BALL, MOVE_REST}, }, { .iv = 250, .lvl = 38, .species = SPECIES_JYNX, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_CALM_MIND, MOVE_LOVELY_KISS, MOVE_ICE_PUNCH}, }, { .iv = 250, .lvl = 43, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_RECOVER, MOVE_FIRE_PUNCH, MOVE_CALM_MIND}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderBlaineChallenge[] = { { .iv = 250, .lvl = 42, .species = SPECIES_NINETALES, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_SUNNY_DAY, MOVE_WILL_O_WISP, MOVE_DISABLE, MOVE_FIRE_BLAST}, }, { .iv = 250, .lvl = 40, .species = SPECIES_MAGMAR, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_THUNDER_PUNCH, MOVE_BRICK_BREAK, MOVE_SEISMIC_TOSS, MOVE_FIRE_BLAST}, }, { .iv = 250, .lvl = 42, .species = SPECIES_RAPIDASH, .heldItem = ITEM_NONE, .abilityNum = 1, .moves = {MOVE_SUNNY_DAY, MOVE_BOUNCE, MOVE_SOLAR_BEAM, MOVE_FIRE_BLAST}, }, { .iv = 250, .lvl = 42, .species = SPECIES_FLAREON, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_DOUBLE_EDGE, MOVE_SHADOW_BALL, MOVE_OVERHEAT, MOVE_WISH}, }, { .iv = 250, .lvl = 47, .species = SPECIES_ARCANINE, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_HOWL, MOVE_EXTREME_SPEED, MOVE_IRON_TAIL, MOVE_FIRE_BLAST}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderGiovanniChallenge[] = { { .iv = 250, .lvl = 45, .species = SPECIES_MAROWAK, .heldItem = ITEM_THICK_CLUB, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_BONEMERANG, MOVE_THRASH, MOVE_ROCK_SLIDE}, }, { .iv = 250, .lvl = 42, .species = SPECIES_DUGTRIO, .heldItem = ITEM_NONE, .abilityNum = 1, .moves = {MOVE_FISSURE, MOVE_AERIAL_ACE, MOVE_TRI_ATTACK, MOVE_EARTHQUAKE}, }, { .iv = 250, .lvl = 44, .species = SPECIES_KANGASKHAN, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_DOUBLE_EDGE, MOVE_SHADOW_BALL, MOVE_FAKE_OUT, MOVE_EARTHQUAKE}, }, { .iv = 250, .lvl = 44, .species = SPECIES_NIDOQUEEN, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_COUNTER, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_EARTHQUAKE}, }, { .iv = 250, .lvl = 45, .species = SPECIES_NIDOKING, .heldItem = ITEM_NONE, .abilityNum = 0, .moves = {MOVE_MEGAHORN, MOVE_SHADOW_BALL, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE}, }, { .iv = 250, .lvl = 50, .species = SPECIES_RHYDON, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 1, .moves = {MOVE_DOUBLE_EDGE, MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_EARTHQUAKE}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourLoreleiChallenge[] = { { .iv = 250, .lvl = 51, .species = SPECIES_CLOYSTER, .heldItem = ITEM_MYSTIC_WATER, .abilityNum = 0, .moves = {MOVE_SPIKES, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_SURF}, }, { .iv = 250, .lvl = 52, .species = SPECIES_DEWGONG, .heldItem = ITEM_NEVER_MELT_ICE, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_REST, MOVE_SLEEP_TALK}, }, { .iv = 250, .lvl = 52, .species = SPECIES_VAPOREON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_WISH, MOVE_PROTECT}, }, { .iv = 250, .lvl = 52, .species = SPECIES_PILOSWINE, .heldItem = ITEM_QUICK_CLAW, .abilityNum = 0, .moves = {MOVE_EARTHQUAKE, MOVE_BLIZZARD, MOVE_ROCK_SLIDE, MOVE_ROAR}, }, { .iv = 250, .lvl = 54, .species = SPECIES_JYNX, .heldItem = ITEM_TWISTED_SPOON, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_PSYCHIC, MOVE_LOVELY_KISS, MOVE_ATTRACT}, }, { .iv = 250, .lvl = 54, .species = SPECIES_LAPRAS, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_REST, MOVE_SLEEP_TALK}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourBrunoChallenge[] = { { .iv = 250, .lvl = 51, .species = SPECIES_POLIWRATH, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP, MOVE_HYPNOSIS}, }, { .iv = 250, .lvl = 53, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_BLACK_BELT, .abilityNum = 0, .moves = {MOVE_SKY_UPPERCUT, MOVE_MACH_PUNCH, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE}, }, { .iv = 250, .lvl = 53, .species = SPECIES_HITMONLEE, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_HI_JUMP_KICK, MOVE_EARTHQUAKE, MOVE_SUBSTITUTE, MOVE_BULK_UP}, }, { .iv = 250, .lvl = 54, .species = SPECIES_PRIMEAPE, .heldItem = ITEM_SCOPE_LENS, .abilityNum = 0, .moves = {MOVE_CROSS_CHOP, MOVE_COUNTER, MOVE_ROCK_SLIDE, MOVE_BULK_UP}, }, { .iv = 250, .lvl = 53, .species = SPECIES_HERACROSS, .heldItem = ITEM_SILVER_POWDER, .abilityNum = 1, .moves = {MOVE_MEGAHORN, MOVE_SWORDS_DANCE, MOVE_SUBSTITUTE, MOVE_BRICK_BREAK}, }, { .iv = 250, .lvl = 56, .species = SPECIES_MACHAMP, .heldItem = ITEM_SHELL_BELL, .abilityNum = 0, .moves = {MOVE_CROSS_CHOP, MOVE_BULK_UP, MOVE_FACADE, MOVE_ROCK_SLIDE}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourAgathaChallenge[] = { { .iv = 250, .lvl = 54, .species = SPECIES_GENGAR, .heldItem = ITEM_BRIGHT_POWDER, .abilityNum = 0, .moves = {MOVE_WILL_O_WISP, MOVE_TORMENT, MOVE_ICE_PUNCH, MOVE_DOUBLE_TEAM}, }, { .iv = 250, .lvl = 54, .species = SPECIES_GOLBAT, .heldItem = ITEM_SHARP_BEAK, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE, MOVE_GIGA_DRAIN, MOVE_TOXIC}, }, { .iv = 250, .lvl = 53, .species = SPECIES_MISDREAVUS, .heldItem = ITEM_SITRUS_BERRY, .abilityNum = 0, .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_SUBSTITUTE}, }, { .iv = 250, .lvl = 54, .species = SPECIES_WEEZING, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_WILL_O_WISP, MOVE_PAIN_SPLIT, MOVE_FLAMETHROWER}, }, { .iv = 250, .lvl = 56, .species = SPECIES_ARBOK, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_SCREECH, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE}, }, { .iv = 250, .lvl = 58, .species = SPECIES_GENGAR, .heldItem = ITEM_PETAYA_BERRY, .abilityNum = 0, .moves = {MOVE_WILL_O_WISP, MOVE_PSYCHIC, MOVE_ICE_PUNCH, MOVE_THUNDERBOLT}, }, }; static const struct TrainerMonItemCustomMoves sParty_EliteFourLanceChallenge[] = { { .iv = 250, .lvl = 56, .species = SPECIES_GYARADOS, .heldItem = ITEM_FOCUS_BAND, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_DOUBLE_EDGE, MOVE_FLAIL}, }, { .iv = 250, .lvl = 54, .species = SPECIES_DRAGONITE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE}, }, { .iv = 250, .lvl = 54, .species = SPECIES_KINGDRA, .heldItem = ITEM_PETAYA_BERRY, .abilityNum = 0, .moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_AGILITY, MOVE_DRAGON_BREATH}, }, { .iv = 250, .lvl = 54, .species = SPECIES_DRAGONITE, .heldItem = ITEM_CHARCOAL, .abilityNum = 0, .moves = {MOVE_FLAMETHROWER, MOVE_LIGHT_SCREEN, MOVE_EARTHQUAKE, MOVE_DRAGON_CLAW}, }, { .iv = 250, .lvl = 58, .species = SPECIES_AERODACTYL, .heldItem = ITEM_KINGS_ROCK, .abilityNum = 0, .moves = {MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_AERIAL_ACE}, }, { .iv = 250, .lvl = 60, .species = SPECIES_DRAGONITE, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_DOUBLE_EDGE, MOVE_STEEL_WING, MOVE_AERIAL_ACE}, }, }; static const struct TrainerMonItemCustomMoves sParty_ChampionFirstSquirtleChallenge[] = { { .iv = 255, .lvl = 59, .species = SPECIES_PIDGEOT, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_DOUBLE_EDGE}, }, { .iv = 255, .lvl = 57, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_BRIGHT_POWDER, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_RECOVER, MOVE_ICE_PUNCH}, }, { .iv = 255, .lvl = 59, .species = SPECIES_RHYDON, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 1, .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE}, }, { .iv = 250, //need all 30 EVs for Fighting HP 70BP .lvl = 59, .species = SPECIES_ARCANINE, .heldItem = ITEM_KINGS_ROCK, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_HIDDEN_POWER, MOVE_HOWL}, }, { .iv = 255, .lvl = 61, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_PSYCHIC}, }, { .iv = 255, .lvl = 63, .species = SPECIES_BLASTOISE, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 0, .moves = {MOVE_SURF, MOVE_TOXIC, MOVE_ICE_BEAM, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMoves sParty_ChampionFirstBulbasaurChallenge[] = { { .iv = 255, .lvl = 59, .species = SPECIES_PIDGEOT, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_DOUBLE_EDGE}, }, { .iv = 255, .lvl = 57, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_BRIGHT_POWDER, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_RECOVER, MOVE_ICE_PUNCH}, }, { .iv = 255, .lvl = 59, .species = SPECIES_RHYDON, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 1, .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE}, }, { .iv = 255, .lvl = 59, .species = SPECIES_GYARADOS, .heldItem = ITEM_FOCUS_BAND, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_THUNDER_WAVE, MOVE_DOUBLE_EDGE}, }, { .iv = 250, //need all 30 EVs for Fighting HP 70BP .lvl = 61, .species = SPECIES_ARCANINE, .heldItem = ITEM_KINGS_ROCK, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_HIDDEN_POWER, MOVE_HOWL}, }, { .iv = 255, .lvl = 63, .species = SPECIES_VENUSAUR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLEEP_POWDER, MOVE_SYNTHESIS, MOVE_LEECH_SEED, MOVE_RAZOR_LEAF}, }, }; static const struct TrainerMonItemCustomMoves sParty_ChampionFirstCharmanderChallenge[] = { { .iv = 255, .lvl = 59, .species = SPECIES_PIDGEOT, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_DOUBLE_EDGE}, }, { .iv = 255, .lvl = 57, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_BRIGHT_POWDER, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_RECOVER, MOVE_ICE_PUNCH}, }, { .iv = 255, .lvl = 59, .species = SPECIES_RHYDON, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 1, .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE}, }, { .iv = 255, .lvl = 59, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_PSYCHIC}, }, { .iv = 255, .lvl = 61, .species = SPECIES_GYARADOS, .heldItem = ITEM_FOCUS_BAND, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_THUNDER_WAVE, MOVE_DOUBLE_EDGE}, }, { .iv = 255, .lvl = 63, .species = SPECIES_CHARIZARD, .heldItem = ITEM_WHITE_HERB, .abilityNum = 0, .moves = {MOVE_OVERHEAT, MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_SUNNY_DAY}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_EliteFourLoreleiChallenge2[] = { { .iv = 255, .lvl = 63, .evs = { 72, 0, 0, 184, 8, 244}, .nature = NATURE_TIMID, .species = SPECIES_CLOYSTER, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_EXPLOSION, MOVE_ICE_BEAM}, }, { .iv = 255, .lvl = 64, .evs = { 252, 0, 0, 4, 0, 252}, .nature = NATURE_CALM, .species = SPECIES_DEWGONG, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_REST, MOVE_SLEEP_TALK}, }, { .iv = 255, .lvl = 64, .evs = { 252, 0, 228, 0, 0, 28}, .nature = NATURE_BOLD, .species = SPECIES_VAPOREON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_WISH, MOVE_TOXIC}, }, { .iv = 255, .lvl = 63, .evs = { 248, 16, 152, 0, 92, 0}, .nature = NATURE_BRAVE, .species = SPECIES_PILOSWINE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_BLIZZARD, MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_PROTECT}, }, { .iv = 255, .lvl = 66, .evs = { 0, 0, 0, 252, 252, 4}, .nature = NATURE_TIMID, .species = SPECIES_JYNX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SUBSTITUTE, MOVE_LOVELY_KISS, MOVE_CALM_MIND}, }, { .iv = 255, .lvl = 66, .evs = { 252, 0, 164, 0, 92, 0}, .nature = NATURE_BOLD, .species = SPECIES_LAPRAS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_THUNDERBOLT, MOVE_TOXIC}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_EliteFourBrunoChallenge2[] = { { .iv = 1, // 31/31/30/31/31/30 for 70 Ghost .lvl = 65, .evs = { 252, 136, 112, 8, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_HITMONTOP, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_HIDDEN_POWER, MOVE_PROTECT}, }, { .iv = 1, // 31/31/30/31/31/30 for 70 Ghost .lvl = 65, .evs = { 252, 252, 0, 0, 0, 4}, .nature = NATURE_ADAMANT, .species = SPECIES_POLIWRATH, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_HIDDEN_POWER, MOVE_HYPNOSIS}, }, { .iv = 255, .lvl = 65, .evs = { 0, 252, 0, 252, 0, 252}, .nature = NATURE_JOLLY, .species = SPECIES_HITMONCHAN, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_SKY_UPPERCUT, MOVE_RETURN, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE}, }, { .iv = 255, .lvl = 65, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_HITMONLEE, .heldItem = ITEM_SALAC_BERRY, .abilityNum = 0, .moves = {MOVE_HI_JUMP_KICK, MOVE_EARTHQUAKE, MOVE_SUBSTITUTE, MOVE_BULK_UP}, }, { .iv = 255, .lvl = 66, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_HERACROSS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_MEGAHORN, MOVE_SWORDS_DANCE, MOVE_SUBSTITUTE, MOVE_BRICK_BREAK}, }, { .iv = 255, .lvl = 68, .evs = { 252, 96, 156, 4, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_MACHAMP, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CROSS_CHOP, MOVE_REST, MOVE_SLEEP_TALK, MOVE_ROCK_SLIDE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_EliteFourAgathaChallenge2[] = { { .iv = 255, .lvl = 66, .evs = { 248, 0, 44, 96, 8, 112}, .nature = NATURE_TIMID, .species = SPECIES_GENGAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_WILL_O_WISP, MOVE_EXPLOSION, MOVE_THUNDERBOLT, MOVE_ICE_PUNCH}, }, { .iv = 2, // 31/31/31/31/30/30 for 70 Ground .lvl = 66, .evs = { 80, 252, 0, 176, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_CROBAT, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE, MOVE_SHADOW_BALL, MOVE_HIDDEN_POWER}, }, { .iv = 255, .lvl = 65, .evs = { 252, 0, 176, 64, 0, 16}, .nature = NATURE_CALM, .species = SPECIES_MISDREAVUS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_MEAN_LOOK, MOVE_PERISH_SONG, MOVE_DESTINY_BOND, MOVE_PROTECT}, }, { .iv = 255, .lvl = 66, .evs = { 252, 178, 0, 12, 68, 0}, .nature = NATURE_BRAVE, .species = SPECIES_WEEZING, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_WILL_O_WISP, MOVE_EXPLOSION, MOVE_FLAMETHROWER}, }, { .iv = 255, .lvl = 68, .evs = { 0, 252, 8, 252, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_ARBOK, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_SLUDGE_BOMB, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE}, }, { .iv = 255, .lvl = 70, .evs = { 0, 0, 0, 252, 252, 4}, .nature = NATURE_TIMID, .species = SPECIES_GENGAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_ICE_PUNCH, MOVE_HYPNOSIS, MOVE_TAUNT}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_EliteFourLanceChallenge2[] = { { .iv = 255, .lvl = 68, .evs = { 68, 252, 0, 188, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_GYARADOS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_THUNDER_WAVE}, }, { .iv = 255, .lvl = 66, .evs = { 0, 178, 0, 24, 252, 56}, .nature = NATURE_BRAVE, .species = SPECIES_DRAGONITE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_FLAMETHROWER}, }, { .iv = 255, .lvl = 66, .evs = { 240, 0, 0, 16, 252, 0}, .nature = NATURE_MODEST, .species = SPECIES_KINGDRA, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_ICE_BEAM, MOVE_TOXIC}, }, { .iv = 255, .lvl = 66, .evs = { 144, 228, 0, 0, 0, 136}, .nature = NATURE_IMPISH, .species = SPECIES_STEELIX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_DOUBLE_EDGE, MOVE_EXPLOSION}, }, { .iv = 3, // 31/31/31/30/30/30 for 70 Flying .lvl = 70, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_AERODACTYL, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER}, }, { .iv = 3, // 31/31/31/30/30/30 for 70 Flying .lvl = 72, .evs = { 52, 204, 0, 184, 68, 0}, .nature = NATURE_LONELY, .species = SPECIES_DRAGONITE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_HIDDEN_POWER, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_DRAGON_DANCE}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_ChampionRematchSquirtleChallenge[] = { { .iv = 255, .lvl = 72, .evs = { 252, 0, 0, 4, 0, 252}, .nature = NATURE_CAREFUL, .species = SPECIES_SKARMORY, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SPIKES, MOVE_WHIRLWIND, MOVE_DRILL_PECK, MOVE_TOXIC}, }, { .iv = 255, .lvl = 73, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_RECOVER}, }, { .iv = 255, .lvl = 72, .evs = { 0, 4, 0, 252, 252, 0}, .nature = NATURE_HASTY, .species = SPECIES_TYRANITAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CRUNCH, MOVE_FIRE_BLAST, MOVE_BRICK_BREAK, MOVE_ICE_BEAM}, }, { .iv = 4, // 31/31/30/30/30/30 for 70 Fighting .lvl = 73, .evs = { 252, 252, 0, 4, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_ARCANINE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_OVERHEAT, MOVE_HIDDEN_POWER, MOVE_HOWL}, }, { .iv = 255, .lvl = 73, .evs = { 124, 0, 0, 96, 188, 96}, .nature = NATURE_MODEST, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_PSYCHIC}, }, { .iv = 255, .lvl = 75, .evs = { 252, 0, 148, 40, 68, 0}, .nature = NATURE_BOLD, .species = SPECIES_BLASTOISE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SURF, MOVE_TOXIC, MOVE_ICE_BEAM, MOVE_REST}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_ChampionRematchBulbasaurChallenge[] = { { .iv = 255, .lvl = 72, .evs = { 252, 0, 0, 4, 0, 252}, .nature = NATURE_CAREFUL, .species = SPECIES_SKARMORY, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SPIKES, MOVE_WHIRLWIND, MOVE_DRILL_PECK, MOVE_TOXIC}, }, { .iv = 255, .lvl = 73, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_RECOVER}, }, { .iv = 255, .lvl = 72, .evs = { 0, 4, 0, 252, 252, 0}, .nature = NATURE_HASTY, .species = SPECIES_TYRANITAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CRUNCH, MOVE_FIRE_BLAST, MOVE_BRICK_BREAK, MOVE_ICE_BEAM}, }, { .iv = 255, .lvl = 73, .evs = { 216, 16, 0, 188, 0, 88}, .nature = NATURE_JOLLY, .species = SPECIES_GYARADOS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_REST}, }, { .iv = 4, // 31/31/30/30/30/30 for 70 Fighting .lvl = 73, .evs = { 252, 252, 0, 4, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_ARCANINE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_EXTREME_SPEED, MOVE_OVERHEAT, MOVE_HIDDEN_POWER, MOVE_HOWL}, }, { .iv = 255, .lvl = 75, .evs = { 252, 0, 84, 24, 0, 148}, .nature = NATURE_CAREFUL, .species = SPECIES_VENUSAUR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SLEEP_POWDER, MOVE_SYNTHESIS, MOVE_LEECH_SEED, MOVE_SLUDGE_BOMB}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_ChampionRematchCharmanderChallenge[] = { { .iv = 255, .lvl = 72, .evs = { 252, 0, 0, 4, 0, 252}, .nature = NATURE_CAREFUL, .species = SPECIES_SKARMORY, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SPIKES, MOVE_WHIRLWIND, MOVE_DRILL_PECK, MOVE_TOXIC}, }, { .iv = 255, .lvl = 73, .evs = { 4, 0, 0, 252, 252, 0}, .nature = NATURE_TIMID, .species = SPECIES_ALAKAZAM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_PSYCHIC, MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_RECOVER}, }, { .iv = 255, .lvl = 72, .evs = { 0, 4, 0, 252, 252, 0}, .nature = NATURE_HASTY, .species = SPECIES_TYRANITAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_CRUNCH, MOVE_FIRE_BLAST, MOVE_BRICK_BREAK, MOVE_ICE_BEAM}, }, { .iv = 255, .lvl = 73, .evs = { 124, 0, 0, 96, 188, 96}, .nature = NATURE_MODEST, .species = SPECIES_EXEGGUTOR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_PSYCHIC}, }, { .iv = 255, .lvl = 73, .evs = { 216, 16, 0, 188, 0, 88}, .nature = NATURE_JOLLY, .species = SPECIES_GYARADOS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_REST}, }, { .iv = 255, .lvl = 75, .evs = { 140, 252, 0, 116, 0, 0}, .nature = NATURE_LONELY, .species = SPECIES_CHARIZARD, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SWORDS_DANCE, MOVE_AERIAL_ACE, MOVE_OVERHEAT, MOVE_EARTHQUAKE}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderBrockRematch[] = { { .iv = 255, .lvl = 63, .species = SPECIES_TYRANITAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE, MOVE_TAUNT}, }, { .iv = 255, .lvl = 64, .species = SPECIES_OMASTAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_TOXIC, MOVE_ICE_BEAM}, }, { .iv = 255, .lvl = 64, .species = SPECIES_STEELIX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_ROAR, MOVE_EXPLOSION}, }, { .iv = 255, .lvl = 63, .species = SPECIES_AERODACTYL, .heldItem = ITEM_LIECHI_BERRY, .abilityNum = 0, .moves = {MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_AERIAL_ACE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_RHYDON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_ROCK_BLAST, MOVE_SUBSTITUTE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_GOLEM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_REST, MOVE_SLEEP_TALK}, }, }; static const struct TrainerMonItemCustomMovesEVs sParty_LeaderBrockRematchChallenge[] = { { .iv = 5, //bug 31/31/31/30/31/30 .lvl = 63, .evs = { 248, 80, 0, 180, 0, 0}, .nature = NATURE_ADAMANT, .species = SPECIES_TYRANITAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER}, }, { .iv = 255, .lvl = 64, .evs = { 252, 0, 252, 4, 0, 0}, .nature = NATURE_BOLD, .species = SPECIES_OMASTAR, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_PROTECT, MOVE_ICE_BEAM}, }, { .iv = 6, //rock .lvl = 64, .evs = { 252, 36, 0, 0, 0, 220}, .nature = NATURE_IMPISH, .species = SPECIES_STEELIX, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_HIDDEN_POWER, MOVE_REST}, }, { .iv = 3, //flying .lvl = 63, .evs = { 4, 252, 0, 252, 0, 0}, .nature = NATURE_JOLLY, .species = SPECIES_AERODACTYL, .heldItem = ITEM_CHOICE_BAND, .abilityNum = 0, .moves = {MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER}, }, { .iv = 255, .lvl = 66, .evs = { 212, 122, 0, 0, 0, 176}, .nature = NATURE_ADAMANT, .species = SPECIES_RHYDON, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_ROCK_SLIDE, MOVE_SUBSTITUTE}, }, { .iv = 6, //rock .lvl = 66, .evs = { 252, 240, 16, 0, 0, 0}, .nature = NATURE_IMPISH, .species = SPECIES_GOLEM, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_REST, MOVE_SLEEP_TALK}, }, }; static const struct TrainerMonItemCustomMoves sParty_LeaderMistyRematch[] = { { .iv = 255, .lvl = 63, .species = SPECIES_CLOYSTER, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_TOXIC, MOVE_ICE_BEAM}, }, { .iv = 255, .lvl = 64, .species = SPECIES_LANTURN, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_THUNDERBOLT, MOVE_SURF, MOVE_REST, MOVE_SLEEP_TALK}, }, { .iv = 255, .lvl = 64, .species = SPECIES_AZUMARILL, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_SING, MOVE_ATTRACT}, }, { .iv = 255, .lvl = 63, .species = SPECIES_QUAGSIRE, .heldItem = ITEM_CHESTO_BERRY, .abilityNum = 1, .moves = {MOVE_CURSE, MOVE_EARTHQUAKE, MOVE_SURF, MOVE_REST}, }, { .iv = 255, .lvl = 66, .species = SPECIES_GYARADOS, .heldItem = ITEM_LEFTOVERS, .abilityNum = 0, .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM, MOVE_THUNDER_WAVE}, }, { .iv = 255, .lvl = 66, .species = SPECIES_STARMIE, .heldItem = ITEM_LEFTOVERS, .abilityNum = 1, .moves = {MOVE_HYDRO_PUMP, MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_PSYCHIC}, }, }; ================================================ FILE: src/data/trainers.h ================================================ const struct Trainer gTrainers[] = { [TRAINER_NONE] = { .trainerName = _(""), }, [TRAINER_LT_SURGE_REMATCH] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_LT_SURGE, .trainerName = _("LT. SURGE"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderLtSurgeRematch), }, [TRAINER_LT_SURGE_REMATCH_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_LT_SURGE, .trainerName = _("LT. SURGE"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_LeaderLtSurgeRematchChallenge), }, [TRAINER_ERIKA_REMATCH] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_ERIKA, .trainerName = _("ERIKA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderErikaRematch), }, [TRAINER_ERIKA_REMATCH_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_ERIKA, .trainerName = _("ERIKA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_LeaderErikaRematchChallenge), }, [TRAINER_KOGA_REMATCH] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_KOGA, .trainerName = _("KOGA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderKogaRematch), }, [TRAINER_KOGA_REMATCH_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_KOGA, .trainerName = _("KOGA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_LeaderKogaRematchChallenge), }, [TRAINER_SABRINA_REMATCH] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_SABRINA, .trainerName = _("SABRINA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderSabrinaRematch), }, [TRAINER_SABRINA_REMATCH_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_SABRINA, .trainerName = _("SABRINA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_LeaderSabrinaRematchChallenge), }, [TRAINER_BLAINE_REMATCH] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_BLAINE, .trainerName = _("BLAINE"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderBlaineRematch), }, [TRAINER_BLAINE_REMATCH_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_BLAINE, .trainerName = _("BLAINE"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_LeaderBlaineRematchChallenge), }, [TRAINER_PKMN_RANGER_HELENA] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .trainerName = _("HELENA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnRangerHelena), }, [TRAINER_PKMN_RANGER_HELENA_2] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .trainerName = _("HELENA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnRangerHelena2), }, [TRAINER_COOLTRAINER_ATTICUS] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("ATTICUS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CooltrainerAtticus), }, [TRAINER_COOLTRAINER_ATTICUS_2] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("ATTICUS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CooltrainerAtticus2), }, [TRAINER_FISHERMAN_DEFOREST] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("DEFOREST"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanDeforest), }, [TRAINER_FISHERMAN_DEFOREST_2] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("DEFOREST"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanDeforest2), }, [TRAINER_BIRD_KEEPER_SPEDO] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("SPEDO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperSpedo), }, [TRAINER_BIRD_KEEPER_SPEDO_2] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("SPEDO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperSpedo2), }, [TRAINER_COOLTRAINER_CASPARA] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("CASPARA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CooltrainerCaspara), }, [TRAINER_COOLTRAINER_CASPARA_2] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("CASPARA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerCaspara2), }, [TRAINER_SWIMMER_FEMALE_SEDEF] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("SEDEF"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleSedef), }, [TRAINER_SWIMMER_FEMALE_SEDEF_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("SEDEF"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleSedef2), }, [TRAINER_MASTER_OAK] = { .trainerClass = TRAINER_CLASS_PKMN_PROF, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_PROFESSOR_OAK, .trainerName = _("OAK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_HP_AWARE, .party = CUSTOM_MOVES_EVS(sParty_MasterOak), }, [TRAINER_MISTY_REMATCH_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_MISTY, .trainerName = _("MISTY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_LeaderMistyRematchChallenge), }, [TRAINER_ELITE_FOUR_SIDNEY] = { .trainerClass = TRAINER_CLASS_RS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_SIDNEY, .trainerName = _("SIDNEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_EliteFourSidney), }, [TRAINER_ELITE_FOUR_PHOEBE] = { .trainerClass = TRAINER_CLASS_RS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_PHOEBE, .trainerName = _("PHOEBE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_EliteFourPhoebe), }, [TRAINER_LEADER_ROXANNE] = { .trainerClass = TRAINER_CLASS_RS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .trainerName = _("ROXANNE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderRoxanne), }, [TRAINER_LEADER_BRAWLY] = { .trainerClass = TRAINER_CLASS_RS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_BRAWLY, .trainerName = _("BRAWLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderBrawly), }, [TRAINER_LEADER_TATE_LIZA] = { .trainerClass = TRAINER_CLASS_RS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, .trainerName = _("TATE&LIZA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderTateLiza), }, [TRAINER_SCHOOL_KID_M] = { .trainerClass = TRAINER_CLASS_SCHOOL_KID, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SCHOOL_KID_M, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SchoolKidM), }, [TRAINER_SCHOOL_KID_F] = { .trainerClass = TRAINER_CLASS_SCHOOL_KID, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SchoolKidF), }, [TRAINER_SR_AND_JR] = { .trainerClass = TRAINER_CLASS_SR_AND_JR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_SR_AND_JR, .trainerName = _(""), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SrAndJr), }, [TRAINER_POKEFAN_M] = { .trainerClass = TRAINER_CLASS_POKEFAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_POKEFAN_M, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokefanM), }, [TRAINER_POKEFAN_F] = { .trainerClass = TRAINER_CLASS_POKEFAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_POKEFAN_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokefanF), }, [TRAINER_EXPERT_M] = { .trainerClass = TRAINER_CLASS_EXPERT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_EXPERT_M, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ExpertM), }, [TRAINER_EXPERT_F] = { .trainerClass = TRAINER_CLASS_EXPERT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_EXPERT_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ExpertF), }, [TRAINER_RS_YOUNGSTER] = { .trainerClass = TRAINER_CLASS_RS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_YOUNGSTER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSYoungster), }, [TRAINER_RS_CHAMPION] = { .trainerClass = TRAINER_CLASS_RS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_STEVEN, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSChampion), }, [TRAINER_RS_FISHERMAN] = { .trainerClass = TRAINER_CLASS_RS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RS_FISHERMAN, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSFisherman), }, [TRAINER_CYCLING_TRIATHLETE_M] = { .trainerClass = TRAINER_CLASS_TRIATHLETE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CyclingTriathleteM), }, [TRAINER_CYCLING_TRIATHLETE_F] = { .trainerClass = TRAINER_CLASS_TRIATHLETE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CyclingTriathleteF), }, [TRAINER_RUNNING_TRIATHLETE_M] = { .trainerClass = TRAINER_CLASS_TRIATHLETE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RunningTriathleteM), }, [TRAINER_RUNNING_TRIATHLETE_F] = { .trainerClass = TRAINER_CLASS_TRIATHLETE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RunningTriathleteF), }, [TRAINER_SWIMMING_TRIATHLETE_M] = { .trainerClass = TRAINER_CLASS_TRIATHLETE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmingTriathleteM), }, [TRAINER_SWIMMING_TRIATHLETE_F] = { .trainerClass = TRAINER_CLASS_TRIATHLETE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmingTriathleteF), }, [TRAINER_DRAGON_TAMER] = { .trainerClass = TRAINER_CLASS_DRAGON_TAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_DRAGON_TAMER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_DragonTamer), }, [TRAINER_RS_BIRD_KEEPER] = { .trainerClass = TRAINER_CLASS_RS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_RS_BIRD_KEEPER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSBirdKeeper), }, [TRAINER_NINJA_BOY] = { .trainerClass = TRAINER_CLASS_NINJA_BOY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_NINJA_BOY, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_NinjaBoy), }, [TRAINER_BATTLE_GIRL] = { .trainerClass = TRAINER_CLASS_BATTLE_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BATTLE_GIRL, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BattleGirl), }, [TRAINER_PARASOL_LADY] = { .trainerClass = TRAINER_CLASS_PARASOL_LADY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_PARASOL_LADY, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ParasolLady), }, [TRAINER_RS_SWIMMER_F] = { .trainerClass = TRAINER_CLASS_RS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_RS_SWIMMER_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSSwimmerF), }, [TRAINER_RS_PICNICKER] = { .trainerClass = TRAINER_CLASS_RS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_RS_PICNICKER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPicnicker), }, [TRAINER_RS_TWINS] = { .trainerClass = TRAINER_CLASS_RS_TWINS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_RS_TWINS, .trainerName = _(""), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSTwins), }, [TRAINER_RS_SAILOR] = { .trainerClass = TRAINER_CLASS_RS_SAILOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_SAILOR, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSSailor), }, [TRAINER_BOARDER_M] = { .trainerClass = TRAINER_CLASS_BOARDER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_YOUNGSTER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BoarderM), }, [TRAINER_BOARDER_F] = { .trainerClass = TRAINER_CLASS_BOARDER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_YOUNGSTER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BoarderF), }, [TRAINER_COLLECTOR] = { .trainerClass = TRAINER_CLASS_COLLECTOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_COLLECTOR, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Collector), }, [TRAINER_WALLY] = { .trainerClass = TRAINER_CLASS_PKMN_TRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_WALLY, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Wally), }, [TRAINER_BRENDAN] = { .trainerClass = TRAINER_CLASS_PKMN_TRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_BRENDAN_1, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Brendan), }, [TRAINER_BRENDAN_2] = { .trainerClass = TRAINER_CLASS_PKMN_TRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_BRENDAN_1, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Brendan2), }, [TRAINER_BRENDAN_3] = { .trainerClass = TRAINER_CLASS_PKMN_TRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_BRENDAN_1, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Brendan3), }, [TRAINER_MAY] = { .trainerClass = TRAINER_CLASS_PKMN_TRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_RS_MAY_1, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_May), }, [TRAINER_MAY_2] = { .trainerClass = TRAINER_CLASS_PKMN_TRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_RS_MAY_1, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_May2), }, [TRAINER_MAY_3] = { .trainerClass = TRAINER_CLASS_PKMN_TRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_RS_MAY_1, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_May3), }, [TRAINER_RS_PKMN_BREEDER_M] = { .trainerClass = TRAINER_CLASS_RS_PKMN_BREEDER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_POKEMON_BREEDER_M, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPkmnBreederM), }, [TRAINER_RS_PKMN_BREEDER_F] = { .trainerClass = TRAINER_CLASS_RS_PKMN_BREEDER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_RS_POKEMON_BREEDER_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPkmnBreederF), }, [TRAINER_RS_PKMN_RANGER_M] = { .trainerClass = TRAINER_CLASS_RS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_RS_POKEMON_RANGER_M, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPkmnRangerM), }, [TRAINER_RS_PKMN_RANGER_F] = { .trainerClass = TRAINER_CLASS_RS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_RS_POKEMON_RANGER_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPkmnRangerF), }, [TRAINER_MAGMA_LEADER] = { .trainerClass = TRAINER_CLASS_MAGMA_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaLeader), }, [TRAINER_MAGMA_GRUNT_M] = { .trainerClass = TRAINER_CLASS_TEAM_MAGMA, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaGruntM), }, [TRAINER_MAMGA_GRUNT_F] = { .trainerClass = TRAINER_CLASS_TEAM_MAGMA, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaGruntF), }, [TRAINER_RS_LASS] = { .trainerClass = TRAINER_CLASS_RS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_RS_LASS, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSLass), }, [TRAINER_RS_BUG_CATCHER] = { .trainerClass = TRAINER_CLASS_RS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_BUG_CATCHER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSBugCatcher), }, [TRAINER_RS_HIKER] = { .trainerClass = TRAINER_CLASS_RS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RS_HIKER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSHiker), }, [TRAINER_RS_YOUNG_COUPLE] = { .trainerClass = TRAINER_CLASS_RS_YOUNG_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_RS_YOUNG_COUPLE, .trainerName = _(""), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSYoungCouple), }, [TRAINER_OLD_COUPLE] = { .trainerClass = TRAINER_CLASS_OLD_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_OLD_COUPLE, .trainerName = _(""), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_OldCouple), }, [TRAINER_RS_SIS_AND_BRO] = { .trainerClass = TRAINER_CLASS_RS_SIS_AND_BRO, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_RS_SIS_AND_BRO, .trainerName = _(""), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RSSisAndBro), }, [TRAINER_AQUA_ADMIN_MATT] = { .trainerClass = TRAINER_CLASS_AQUA_ADMIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_AQUA_ADMIN_M, .trainerName = _("MATT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_AquaAdminMatt), }, [TRAINER_AQUA_ADMIN_SHELLY] = { .trainerClass = TRAINER_CLASS_AQUA_ADMIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, .trainerName = _("SHELLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_AquaAdminShelly), }, [TRAINER_MAGMA_ADMIN_TABITHA] = { .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, .trainerPic = TRAINER_PIC_MAGMA_ADMIN_M, .trainerName = _("TABITHA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaAdminTabitha), }, [TRAINER_MAGMA_ADMIN_COURTNEY] = { .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, .trainerPic = TRAINER_PIC_MAGMA_ADMIN_F, .trainerName = _("COURTNEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaAdminCourtney), }, [TRAINER_LEADER_WATTSON] = { .trainerClass = TRAINER_CLASS_RS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_WATTSON, .trainerName = _("WATTSON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderWattson), }, [TRAINER_LEADER_FLANNERY] = { .trainerClass = TRAINER_CLASS_RS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .trainerName = _("FLANNERY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderFlannery), }, [TRAINER_LEADER_NORMAN] = { .trainerClass = TRAINER_CLASS_RS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_NORMAN, .trainerName = _("NORMAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderNorman), }, [TRAINER_LEADER_WINONA] = { .trainerClass = TRAINER_CLASS_RS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_LEADER_WINONA, .trainerName = _("WINONA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderWinona), }, [TRAINER_LEADER_WALLACE] = { .trainerClass = TRAINER_CLASS_RS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_WALLACE, .trainerName = _("WALLACE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderWallace), }, [TRAINER_ELITE_FOUR_GLACIA] = { .trainerClass = TRAINER_CLASS_RS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_GLACIA, .trainerName = _("GLACIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_EliteFourGlacia), }, [TRAINER_ELITE_FOUR_DRAKE] = { .trainerClass = TRAINER_CLASS_RS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_DRAKE, .trainerName = _("DRAKE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_EliteFourDrake), }, [TRAINER_YOUNGSTER_BEN] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("BEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterBen), }, [TRAINER_YOUNGSTER_CALVIN] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("CALVIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterCalvin), }, [TRAINER_YOUNGSTER_JOSH] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("JOSH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterJosh), }, [TRAINER_YOUNGSTER_TIMMY] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("TIMMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTimmy), }, [TRAINER_YOUNGSTER_JOEY] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("JOEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterJoey), }, [TRAINER_YOUNGSTER_DAN] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("DAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDan), }, [TRAINER_YOUNGSTER_CHAD] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("CHAD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterChad), }, [TRAINER_YOUNGSTER_TYLER] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("TYLER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTyler), }, [TRAINER_YOUNGSTER_EDDIE] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("EDDIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterEddie), }, [TRAINER_YOUNGSTER_DILLON] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("DILLON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDillon), }, [TRAINER_YOUNGSTER_YASU] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("YASU"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterYasu), }, [TRAINER_YOUNGSTER_DAVE] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("DAVE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDave), }, [TRAINER_YOUNGSTER_BEN_2] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("BEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterBen2), }, [TRAINER_BUG_CATCHER_RICK] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("RICK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherRick), }, [TRAINER_BUG_CATCHER_DOUG] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("DOUG"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherDoug), }, [TRAINER_BUG_CATCHER_SAMMY] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("SAMMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherSammy), }, [TRAINER_BUG_CATCHER_COLTON] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("COLTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherColton), }, [TRAINER_BUG_CATCHER_GREG] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("GREG"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherGreg), }, [TRAINER_BUG_CATCHER_JAMES] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("JAMES"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherJames), }, [TRAINER_BUG_CATCHER_KENT] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("KENT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherKent), }, [TRAINER_BUG_CATCHER_ROBBY] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("ROBBY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherRobby), }, [TRAINER_BUG_CATCHER_CALE] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("CALE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherCale), }, [TRAINER_BUG_CATCHER_KEIGO] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("KEIGO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherKeigo), }, [TRAINER_BUG_CATCHER_ELIJAH] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("ELIJAH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherElijah), }, [TRAINER_BUG_CATCHER_2] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher2), }, [TRAINER_BUG_CATCHER_BRENT] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("BRENT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherBrent), }, [TRAINER_BUG_CATCHER_CONNER] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("CONNER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherConner), }, [TRAINER_LASS_JANICE] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("JANICE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJanice), }, [TRAINER_LASS_SALLY] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("SALLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassSally), }, [TRAINER_LASS_ROBIN] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("ROBIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassRobin), }, [TRAINER_LASS_CRISSY] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("CRISSY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassCrissy), }, [TRAINER_LASS_MIRIAM] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("MIRIAM"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassMiriam), }, [TRAINER_LASS_IRIS] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("IRIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassIris), }, [TRAINER_LASS_RELI] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("RELI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassReli), }, [TRAINER_LASS_ALI] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("ALI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassAli), }, [TRAINER_LASS_2] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Lass2), }, [TRAINER_LASS_HALEY] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("HALEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassHaley), }, [TRAINER_LASS_ANN] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("ANN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassAnn), }, [TRAINER_LASS_DAWN] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("DAWN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassDawn), }, [TRAINER_LASS_PAIGE] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("PAIGE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassPaige), }, [TRAINER_LASS_ANDREA] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("ANDREA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassAndrea), }, [TRAINER_LASS_MEGAN] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("MEGAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassMegan), }, [TRAINER_LASS_JULIA] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("JULIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJulia), }, [TRAINER_LASS_KAY] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("KAY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassKay), }, [TRAINER_LASS_LISA] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("LISA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassLisa), }, [TRAINER_SAILOR_EDMOND] = { .trainerClass = TRAINER_CLASS_SAILOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SAILOR, .trainerName = _("EDMOND"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorEdmond), }, [TRAINER_SAILOR_TREVOR] = { .trainerClass = TRAINER_CLASS_SAILOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SAILOR, .trainerName = _("TREVOR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorTrevor), }, [TRAINER_SAILOR_LEONARD] = { .trainerClass = TRAINER_CLASS_SAILOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SAILOR, .trainerName = _("LEONARD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorLeonard), }, [TRAINER_SAILOR_DUNCAN] = { .trainerClass = TRAINER_CLASS_SAILOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SAILOR, .trainerName = _("DUNCAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorDuncan), }, [TRAINER_SAILOR_HUEY] = { .trainerClass = TRAINER_CLASS_SAILOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SAILOR, .trainerName = _("HUEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorHuey), }, [TRAINER_SAILOR_DYLAN] = { .trainerClass = TRAINER_CLASS_SAILOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SAILOR, .trainerName = _("DYLAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorDylan), }, [TRAINER_SAILOR_PHILLIP] = { .trainerClass = TRAINER_CLASS_SAILOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SAILOR, .trainerName = _("PHILLIP"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorPhillip), }, [TRAINER_SAILOR_DWAYNE] = { .trainerClass = TRAINER_CLASS_SAILOR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_SAILOR, .trainerName = _("DWAYNE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorDwayne), }, [TRAINER_CAMPER_LIAM] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("LIAM"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_CamperLiam), }, [TRAINER_CAMPER_SHANE] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("SHANE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperShane), }, [TRAINER_CAMPER_ETHAN] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("ETHAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperEthan), }, [TRAINER_CAMPER_RICKY] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("RICKY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRicky), }, [TRAINER_CAMPER_JEFF] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("JEFF"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJeff), }, [TRAINER_CAMPER_2] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Camper2), }, [TRAINER_CAMPER_CHRIS] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("CHRIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperChris), }, [TRAINER_CAMPER_DREW] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("DREW"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperDrew), }, [TRAINER_PICNICKER_DIANA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("DIANA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerDiana), }, [TRAINER_PICNICKER_NANCY] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("NANCY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerNancy), }, [TRAINER_PICNICKER_ISABELLE] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ISABELLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIsabelle), }, [TRAINER_PICNICKER_KELSEY] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("KELSEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKelsey), }, [TRAINER_PICNICKER_ALICIA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ALICIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlicia), }, [TRAINER_PICNICKER_CAITLIN] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("CAITLIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerCaitlin), }, [TRAINER_PICNICKER_HEIDI] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("HEIDI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerHeidi), }, [TRAINER_PICNICKER_CAROL] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("CAROL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerCarol), }, [TRAINER_PICNICKER_SOFIA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("SOFIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSofia), }, [TRAINER_PICNICKER_MARTHA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("MARTHA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMartha), }, [TRAINER_PICNICKER_TINA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("TINA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerTina), }, [TRAINER_PICNICKER_HANNAH] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("HANNAH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerHannah), }, [TRAINER_POKEMANIAC_MARK] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("MARK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacMark), }, [TRAINER_POKEMANIAC_HERMAN] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("HERMAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHerman), }, [TRAINER_POKEMANIAC_COOPER] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("COOPER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacCooper), }, [TRAINER_POKEMANIAC_STEVE] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("STEVE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacSteve), }, [TRAINER_POKEMANIAC_WINSTON] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("WINSTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacWinston), }, [TRAINER_POKEMANIAC_DAWSON] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("DAWSON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacDawson), }, [TRAINER_POKEMANIAC_ASHTON] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("ASHTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacAshton), }, [TRAINER_SUPER_NERD_JOVAN] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("JOVAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdJovan), }, [TRAINER_SUPER_NERD_MIGUEL] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("MIGUEL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdMiguel), }, [TRAINER_SUPER_NERD_AIDAN] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("AIDAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_SuperNerdAidan), }, [TRAINER_SUPER_NERD_GLENN] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("GLENN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdGlenn), }, [TRAINER_SUPER_NERD_LESLIE] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("LESLIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_SuperNerdLeslie), }, [TRAINER_SUPER_NERD_1] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerd1), }, [TRAINER_SUPER_NERD_2] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerd2), }, [TRAINER_SUPER_NERD_3] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerd3), }, [TRAINER_SUPER_NERD_ERIK] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("ERIK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdErik), }, [TRAINER_SUPER_NERD_AVERY] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("AVERY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdAvery), }, [TRAINER_SUPER_NERD_DEREK] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("DEREK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdDerek), }, [TRAINER_SUPER_NERD_ZAC] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("ZAC"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdZac), }, [TRAINER_HIKER_MARCOS] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("MARCOS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerMarcos), }, [TRAINER_HIKER_FRANKLIN] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("FRANKLIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerFranklin), }, [TRAINER_HIKER_NOB] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("NOB"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerNob), }, [TRAINER_HIKER_WAYNE] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("WAYNE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerWayne), }, [TRAINER_HIKER_ALAN] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("ALAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerAlan), }, [TRAINER_HIKER_BRICE] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("BRICE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerBrice), }, [TRAINER_HIKER_CLARK] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("CLARK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerClark), }, [TRAINER_HIKER_TRENT] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("TRENT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerTrent), }, [TRAINER_HIKER_DUDLEY] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("DUDLEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerDudley), }, [TRAINER_HIKER_ALLEN] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("ALLEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerAllen), }, [TRAINER_HIKER_ERIC] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("ERIC"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerEric), }, [TRAINER_HIKER_LENNY] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("LENNY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerLenny), }, [TRAINER_HIKER_OLIVER] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("OLIVER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerOliver), }, [TRAINER_HIKER_LUCAS] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("LUCAS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerLucas), }, [TRAINER_BIKER_JARED] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("JARED"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerJared), }, [TRAINER_BIKER_MALIK] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("MALIK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerMalik), }, [TRAINER_BIKER_ERNEST] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("ERNEST"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerErnest), }, [TRAINER_BIKER_ALEX] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("ALEX"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerAlex), }, [TRAINER_BIKER_LAO] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("LAO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerLao), }, [TRAINER_BIKER_1] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Biker1), }, [TRAINER_BIKER_HIDEO] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("HIDEO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerHideo), }, [TRAINER_BIKER_RUBEN] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("RUBEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerRuben), }, [TRAINER_BIKER_BILLY] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("BILLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerBilly), }, [TRAINER_BIKER_NIKOLAS] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("NIKOLAS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerNikolas), }, [TRAINER_BIKER_JAXON] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("JAXON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerJaxon), }, [TRAINER_BIKER_WILLIAM] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("WILLIAM"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerWilliam), }, [TRAINER_BIKER_LUKAS] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("LUKAS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerLukas), }, [TRAINER_BIKER_ISAAC] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("ISAAC"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerIsaac), }, [TRAINER_BIKER_GERALD] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("GERALD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerGerald), }, [TRAINER_BURGLAR_1] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Burglar1), }, [TRAINER_BURGLAR_2] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Burglar2), }, [TRAINER_BURGLAR_3] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Burglar3), }, [TRAINER_BURGLAR_QUINN] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _("QUINN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarQuinn), }, [TRAINER_BURGLAR_RAMON] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _("RAMON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarRamon), }, [TRAINER_BURGLAR_DUSTY] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _("DUSTY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarDusty), }, [TRAINER_BURGLAR_ARNIE] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _("ARNIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarArnie), }, [TRAINER_BURGLAR_4] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Burglar4), }, [TRAINER_BURGLAR_SIMON] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _("SIMON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarSimon), }, [TRAINER_BURGLAR_LEWIS] = { .trainerClass = TRAINER_CLASS_BURGLAR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_BURGLAR, .trainerName = _("LEWIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarLewis), }, [TRAINER_ENGINEER_BAILY] = { .trainerClass = TRAINER_CLASS_ENGINEER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_ENGINEER, .trainerName = _("BAILY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_EngineerBaily), }, [TRAINER_ENGINEER_BRAXTON] = { .trainerClass = TRAINER_CLASS_ENGINEER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_ENGINEER, .trainerName = _("BRAXTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_EngineerBraxton), }, [TRAINER_ENGINEER_BERNIE] = { .trainerClass = TRAINER_CLASS_ENGINEER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_ENGINEER, .trainerName = _("BERNIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_EngineerBernie), }, [TRAINER_FISHERMAN_DALE] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("DALE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanDale), }, [TRAINER_FISHERMAN_BARNY] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("BARNY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanBarny), }, [TRAINER_FISHERMAN_NED] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("NED"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanNed), }, [TRAINER_FISHERMAN_CHIP] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("CHIP"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanChip), }, [TRAINER_FISHERMAN_HANK] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("HANK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanHank), }, [TRAINER_FISHERMAN_ELLIOT] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("ELLIOT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanElliot), }, [TRAINER_FISHERMAN_RONALD] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("RONALD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanRonald), }, [TRAINER_FISHERMAN_CLAUDE] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("CLAUDE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanClaude), }, [TRAINER_FISHERMAN_WADE] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("WADE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanWade), }, [TRAINER_FISHERMAN_NOLAN] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("NOLAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanNolan), }, [TRAINER_FISHERMAN_ANDREW] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("ANDREW"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanAndrew), }, [TRAINER_SWIMMER_MALE_LUIS] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("LUIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleLuis), }, [TRAINER_SWIMMER_MALE_RICHARD] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("RICHARD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleRichard), }, [TRAINER_SWIMMER_MALE_REECE] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("REECE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleReece), }, [TRAINER_SWIMMER_MALE_MATTHEW] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("MATTHEW"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleMatthew), }, [TRAINER_SWIMMER_MALE_DOUGLAS] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("DOUGLAS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDouglas), }, [TRAINER_SWIMMER_MALE_DAVID] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("DAVID"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDavid), }, [TRAINER_SWIMMER_MALE_TONY] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("TONY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleTony), }, [TRAINER_SWIMMER_MALE_AXLE] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("AXLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleAxle), }, [TRAINER_SWIMMER_MALE_BARRY] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("BARRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleBarry), }, [TRAINER_SWIMMER_MALE_DEAN] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("DEAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDean), }, [TRAINER_SWIMMER_MALE_DARRIN] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("DARRIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDarrin), }, [TRAINER_SWIMMER_MALE_SPENCER] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("SPENCER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleSpencer), }, [TRAINER_SWIMMER_MALE_JACK] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("JACK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleJack), }, [TRAINER_SWIMMER_MALE_JEROME] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("JEROME"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleJerome), }, [TRAINER_SWIMMER_MALE_ROLAND] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("ROLAND"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleRoland), }, [TRAINER_CUE_BALL_KOJI] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("KOJI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallKoji), }, [TRAINER_CUE_BALL_LUKE] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("LUKE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallLuke), }, [TRAINER_CUE_BALL_CAMRON] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("CAMRON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallCamron), }, [TRAINER_CUE_BALL_RAUL] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("RAUL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallRaul), }, [TRAINER_CUE_BALL_ISAIAH] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("ISAIAH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallIsaiah), }, [TRAINER_CUE_BALL_ZEEK] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("ZEEK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallZeek), }, [TRAINER_CUE_BALL_JAMAL] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("JAMAL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallJamal), }, [TRAINER_CUE_BALL_COREY] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("COREY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallCorey), }, [TRAINER_CUE_BALL_CHASE] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("CHASE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallChase), }, [TRAINER_GAMER_HUGO] = { .trainerClass = TRAINER_CLASS_GAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_GAMER, .trainerName = _("HUGO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerHugo), }, [TRAINER_GAMER_JASPER] = { .trainerClass = TRAINER_CLASS_GAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_GAMER, .trainerName = _("JASPER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerJasper), }, [TRAINER_GAMER_DIRK] = { .trainerClass = TRAINER_CLASS_GAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_GAMER, .trainerName = _("DIRK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerDirk), }, [TRAINER_GAMER_DARIAN] = { .trainerClass = TRAINER_CLASS_GAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_GAMER, .trainerName = _("DARIAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerDarian), }, [TRAINER_GAMER_STAN] = { .trainerClass = TRAINER_CLASS_GAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_GAMER, .trainerName = _("STAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerStan), }, [TRAINER_GAMER_1] = { .trainerClass = TRAINER_CLASS_GAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_GAMER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Gamer1), }, [TRAINER_GAMER_RICH] = { .trainerClass = TRAINER_CLASS_GAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_GAMER, .trainerName = _("RICH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerRich), }, [TRAINER_BEAUTY_BRIDGET] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_BEAUTY, .trainerName = _("BRIDGET"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyBridget), }, [TRAINER_BEAUTY_TAMIA] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_BEAUTY, .trainerName = _("TAMIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyTamia), }, [TRAINER_BEAUTY_LORI] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_BEAUTY, .trainerName = _("LORI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyLori), }, [TRAINER_BEAUTY_LOLA] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_BEAUTY, .trainerName = _("LOLA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyLola), }, [TRAINER_BEAUTY_SHEILA] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_BEAUTY, .trainerName = _("SHEILA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautySheila), }, [TRAINER_SWIMMER_FEMALE_TIFFANY] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("TIFFANY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleTiffany), }, [TRAINER_SWIMMER_FEMALE_NORA] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("NORA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleNora), }, [TRAINER_SWIMMER_FEMALE_MELISSA] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("MELISSA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleMelissa), }, [TRAINER_BEAUTY_GRACE] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_BEAUTY, .trainerName = _("GRACE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyGrace), }, [TRAINER_BEAUTY_OLIVIA] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_BEAUTY, .trainerName = _("OLIVIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyOlivia), }, [TRAINER_BEAUTY_LAUREN] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("LAUREN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyLauren), }, [TRAINER_SWIMMER_FEMALE_ANYA] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("ANYA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAnya), }, [TRAINER_SWIMMER_FEMALE_ALICE] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("ALICE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAlice), }, [TRAINER_SWIMMER_FEMALE_CONNIE] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("CONNIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleConnie), }, [TRAINER_SWIMMER_FEMALE_SHIRLEY] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("SHIRLEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleShirley), }, [TRAINER_PSYCHIC_JOHAN] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_PSYCHIC_M, .trainerName = _("JOHAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicJohan), }, [TRAINER_PSYCHIC_TYRON] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_PSYCHIC_M, .trainerName = _("TYRON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicTyron), }, [TRAINER_PSYCHIC_CAMERON] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_PSYCHIC_M, .trainerName = _("CAMERON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicCameron), }, [TRAINER_PSYCHIC_PRESTON] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_PSYCHIC_M, .trainerName = _("PRESTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicPreston), }, [TRAINER_ROCKER_RANDALL] = { .trainerClass = TRAINER_CLASS_ROCKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_ROCKER, .trainerName = _("RANDALL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RockerRandall), }, [TRAINER_ROCKER_LUCA] = { .trainerClass = TRAINER_CLASS_ROCKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_ROCKER, .trainerName = _("LUCA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RockerLuca), }, [TRAINER_JUGGLER_DALTON] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("DALTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerDalton), }, [TRAINER_JUGGLER_NELSON] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("NELSON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerNelson), }, [TRAINER_JUGGLER_KIRK] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("KIRK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerKirk), }, [TRAINER_JUGGLER_SHAWN] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("SHAWN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerShawn), }, [TRAINER_JUGGLER_GREGORY] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("GREGORY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_JugglerGregory), }, [TRAINER_JUGGLER_EDWARD] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("EDWARD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_JugglerEdward), }, [TRAINER_JUGGLER_KAYDEN] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("KAYDEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerKayden), }, [TRAINER_JUGGLER_NATE] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("NATE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerNate), }, [TRAINER_TAMER_PHIL] = { .trainerClass = TRAINER_CLASS_TAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_TAMER, .trainerName = _("PHIL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerPhil), }, [TRAINER_TAMER_EDGAR] = { .trainerClass = TRAINER_CLASS_TAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_TAMER, .trainerName = _("EDGAR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerEdgar), }, [TRAINER_TAMER_JASON] = { .trainerClass = TRAINER_CLASS_TAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_TAMER, .trainerName = _("JASON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerJason), }, [TRAINER_TAMER_COLE] = { .trainerClass = TRAINER_CLASS_TAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_TAMER, .trainerName = _("COLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerCole), }, [TRAINER_TAMER_VINCENT] = { .trainerClass = TRAINER_CLASS_TAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_TAMER, .trainerName = _("VINCENT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerVincent), }, [TRAINER_TAMER_JOHN] = { .trainerClass = TRAINER_CLASS_TAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_TAMER, .trainerName = _("JOHN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerJohn), }, [TRAINER_BIRD_KEEPER_SEBASTIAN] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("SEBASTIAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperSebastian), }, [TRAINER_BIRD_KEEPER_PERRY] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("PERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperPerry), }, [TRAINER_BIRD_KEEPER_ROBERT] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("ROBERT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRobert), }, [TRAINER_BIRD_KEEPER_DONALD] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("DONALD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperDonald), }, [TRAINER_BIRD_KEEPER_BENNY] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("BENNY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperBenny), }, [TRAINER_BIRD_KEEPER_EDWIN] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("EDWIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperEdwin), }, [TRAINER_BIRD_KEEPER_CHESTER] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("CHESTER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChester), }, [TRAINER_BIRD_KEEPER_WILTON] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("WILTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperWilton), }, [TRAINER_BIRD_KEEPER_RAMIRO] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("RAMIRO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRamiro), }, [TRAINER_BIRD_KEEPER_JACOB] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("JACOB"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperJacob), }, [TRAINER_BIRD_KEEPER_ROGER] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("ROGER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRoger), }, [TRAINER_BIRD_KEEPER_REED] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("REED"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperReed), }, [TRAINER_BIRD_KEEPER_KEITH] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("KEITH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperKeith), }, [TRAINER_BIRD_KEEPER_CARTER] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("CARTER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperCarter), }, [TRAINER_BIRD_KEEPER_MITCH] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("MITCH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMitch), }, [TRAINER_BIRD_KEEPER_BECK] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("BECK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperBeck), }, [TRAINER_BIRD_KEEPER_MARLON] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("MARLON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMarlon), }, [TRAINER_BLACK_BELT_KOICHI] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("KIYO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltKoichi), }, [TRAINER_BLACK_BELT_MIKE] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("MIKE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltMike), }, [TRAINER_BLACK_BELT_HIDEKI] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("HIDEKI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHideki), }, [TRAINER_BLACK_BELT_AARON] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("AARON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltAaron), }, [TRAINER_BLACK_BELT_HITOSHI] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("HITOSHI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHitoshi), }, [TRAINER_BLACK_BELT_ATSUSHI] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("ATSUSHI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltAtsushi), }, [TRAINER_BLACK_BELT_KIYO] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("KOICHI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltKiyo), }, [TRAINER_BLACK_BELT_TAKASHI] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("TAKASHI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltTakashi), }, [TRAINER_BLACK_BELT_DAISUKE] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("DAISUKE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltDaisuke), }, [TRAINER_RIVAL_OAKS_LAB_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_RIVAL_EARLY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_EARLY, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalOaksLabSquirtle), }, [TRAINER_RIVAL_OAKS_LAB_BULBASAUR] = { .trainerClass = TRAINER_CLASS_RIVAL_EARLY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_EARLY, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalOaksLabBulbasaur), }, [TRAINER_RIVAL_OAKS_LAB_CHARMANDER] = { .trainerClass = TRAINER_CLASS_RIVAL_EARLY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_EARLY, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalOaksLabCharmander), }, [TRAINER_RIVAL_ROUTE22_EARLY_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_RIVAL_EARLY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_EARLY, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22EarlySquirtle), }, [TRAINER_RIVAL_ROUTE22_EARLY_BULBASAUR] = { .trainerClass = TRAINER_CLASS_RIVAL_EARLY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_EARLY, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22EarlyBulbasaur), }, [TRAINER_RIVAL_ROUTE22_EARLY_CHARMANDER] = { .trainerClass = TRAINER_CLASS_RIVAL_EARLY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_EARLY, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22EarlyCharmander), }, [TRAINER_RIVAL_CERULEAN_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_RIVAL_EARLY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_EARLY, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalCeruleanSquirtle), }, [TRAINER_RIVAL_CERULEAN_BULBASAUR] = { .trainerClass = TRAINER_CLASS_RIVAL_EARLY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_EARLY, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalCeruleanBulbasaur), }, [TRAINER_RIVAL_CERULEAN_CHARMANDER] = { .trainerClass = TRAINER_CLASS_RIVAL_EARLY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_EARLY, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalCeruleanCharmander), }, [TRAINER_SCIENTIST_TED] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("TED"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistTed), }, [TRAINER_SCIENTIST_CONNOR] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("CONNOR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistConnor), }, [TRAINER_SCIENTIST_JERRY] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("JERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistJerry), }, [TRAINER_SCIENTIST_JOSE] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("JOSE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistJose), }, [TRAINER_SCIENTIST_RODNEY] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("RODNEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistRodney), }, [TRAINER_SCIENTIST_BEAU] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("BEAU"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistBeau), }, [TRAINER_SCIENTIST_TAYLOR] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("TAYLOR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistTaylor), }, [TRAINER_SCIENTIST_JOSHUA] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("JOSHUA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistJoshua), }, [TRAINER_SCIENTIST_PARKER] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("PARKER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistParker), }, [TRAINER_SCIENTIST_ED] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("ED"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistEd), }, [TRAINER_SCIENTIST_TRAVIS] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("TRAVIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistTravis), }, [TRAINER_SCIENTIST_BRAYDON] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("BRAYDON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistBraydon), }, [TRAINER_SCIENTIST_IVAN] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("IVAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistIvan), }, [TRAINER_BOSS_GIOVANNI] = { .trainerClass = TRAINER_CLASS_BOSS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_LEADER_GIOVANNI, .trainerName = _("GIOVANNI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BossGiovanni), }, [TRAINER_BOSS_GIOVANNI_2] = { .trainerClass = TRAINER_CLASS_BOSS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_LEADER_GIOVANNI, .trainerName = _("GIOVANNI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BossGiovanni2), }, [TRAINER_LEADER_GIOVANNI] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_LEADER_GIOVANNI, .trainerName = _("GIOVANNI"), .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderGiovanni), }, [TRAINER_TEAM_ROCKET_GRUNT] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt), }, [TRAINER_TEAM_ROCKET_GRUNT_2] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt2), }, [TRAINER_TEAM_ROCKET_GRUNT_3] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt3), }, [TRAINER_TEAM_ROCKET_GRUNT_4] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt4), }, [TRAINER_TEAM_ROCKET_GRUNT_5] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt5), }, [TRAINER_TEAM_ROCKET_GRUNT_6] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt6), }, [TRAINER_TEAM_ROCKET_GRUNT_7] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt7), }, [TRAINER_TEAM_ROCKET_GRUNT_8] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt8), }, [TRAINER_TEAM_ROCKET_GRUNT_9] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt9), }, [TRAINER_TEAM_ROCKET_GRUNT_10] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt10), }, [TRAINER_TEAM_ROCKET_GRUNT_11] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt11), }, [TRAINER_TEAM_ROCKET_GRUNT_12] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt12), }, [TRAINER_TEAM_ROCKET_GRUNT_13] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt13), }, [TRAINER_TEAM_ROCKET_GRUNT_14] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt14), }, [TRAINER_TEAM_ROCKET_GRUNT_15] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt15), }, [TRAINER_TEAM_ROCKET_GRUNT_16] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt16), }, [TRAINER_TEAM_ROCKET_GRUNT_17] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt17), }, [TRAINER_TEAM_ROCKET_GRUNT_18] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt18), }, [TRAINER_TEAM_ROCKET_GRUNT_19] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt19), }, [TRAINER_TEAM_ROCKET_GRUNT_20] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt20), }, [TRAINER_TEAM_ROCKET_GRUNT_21] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt21), }, [TRAINER_TEAM_ROCKET_GRUNT_22] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt22), }, [TRAINER_TEAM_ROCKET_GRUNT_23] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt23), }, [TRAINER_TEAM_ROCKET_GRUNT_24] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt24), }, [TRAINER_TEAM_ROCKET_GRUNT_25] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt25), }, [TRAINER_TEAM_ROCKET_GRUNT_26] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt26), }, [TRAINER_TEAM_ROCKET_GRUNT_27] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt27), }, [TRAINER_TEAM_ROCKET_GRUNT_28] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt28), }, [TRAINER_TEAM_ROCKET_GRUNT_29] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt29), }, [TRAINER_TEAM_ROCKET_GRUNT_30] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt30), }, [TRAINER_TEAM_ROCKET_GRUNT_31] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt31), }, [TRAINER_TEAM_ROCKET_GRUNT_32] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt32), }, [TRAINER_TEAM_ROCKET_GRUNT_33] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt33), }, [TRAINER_TEAM_ROCKET_GRUNT_34] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt34), }, [TRAINER_TEAM_ROCKET_GRUNT_35] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt35), }, [TRAINER_TEAM_ROCKET_GRUNT_36] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt36), }, [TRAINER_TEAM_ROCKET_GRUNT_37] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt37), }, [TRAINER_TEAM_ROCKET_GRUNT_38] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt38), }, [TRAINER_TEAM_ROCKET_GRUNT_39] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt39), }, [TRAINER_TEAM_ROCKET_GRUNT_40] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt40), }, [TRAINER_TEAM_ROCKET_GRUNT_41] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt41), }, [TRAINER_COOLTRAINER_SAMUEL] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("SAMUEL"), .items = {ITEM_SUPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerSamuel), }, [TRAINER_COOLTRAINER_GEORGE] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("GEORGE"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerGeorge), }, [TRAINER_COOLTRAINER_COLBY] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("COLBY"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerColby), }, [TRAINER_COOLTRAINER_PAUL] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("PAUL"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerPaul), }, [TRAINER_COOLTRAINER_ROLANDO] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("ROLANDO"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerRolando), }, [TRAINER_COOLTRAINER_GILBERT] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("GILBERT"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerGilbert), }, [TRAINER_COOLTRAINER_OWEN] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("OWEN"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerOwen), }, [TRAINER_COOLTRAINER_BERKE] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("BERKE"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerBerke), }, [TRAINER_COOLTRAINER_YUJI] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("YUJI"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerYuji), }, [TRAINER_COOLTRAINER_WARREN] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("WARREN"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerWarren), }, [TRAINER_COOLTRAINER_MARY] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("MARY"), .items = {ITEM_SUPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerMary), }, [TRAINER_COOLTRAINER_CAROLINE] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("CAROLINE"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerCaroline), }, [TRAINER_COOLTRAINER_ALEXA] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("ALEXA"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerAlexa), }, [TRAINER_COOLTRAINER_SHANNON] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("SHANNON"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerShannon), }, [TRAINER_COOLTRAINER_NAOMI] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("NAOMI"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerNaomi), }, [TRAINER_COOLTRAINER_BROOKE] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("BROOKE"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerBrooke), }, [TRAINER_COOLTRAINER_AUSTINA] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("AUSTINA"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerAustina), }, [TRAINER_COOLTRAINER_JULIE] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("JULIE"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerJulie), }, [TRAINER_ELITE_FOUR_LORELEI] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_ELITE_FOUR_LORELEI, .trainerName = _("LORELEI"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLorelei), }, [TRAINER_ELITE_FOUR_BRUNO] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_BRUNO, .trainerName = _("BRUNO"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourBruno), }, [TRAINER_ELITE_FOUR_AGATHA] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_ELITE_FOUR_AGATHA, .trainerName = _("AGATHA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourAgatha), }, [TRAINER_ELITE_FOUR_LANCE] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_LANCE, .trainerName = _("LANCE"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLance), }, [TRAINER_LEADER_BROCK] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_BROCK, .trainerName = _("BROCK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderBrock), }, [TRAINER_LEADER_MISTY] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_MISTY, .trainerName = _("MISTY"), .items = {ITEM_SUPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderMisty), }, [TRAINER_LEADER_LT_SURGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_LT_SURGE, .trainerName = _("LT. SURGE"), .items = {ITEM_SUPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderLtSurge), }, [TRAINER_LEADER_ERIKA] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_ERIKA, .trainerName = _("ERIKA"), .items = {ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderErika), }, [TRAINER_LEADER_KOGA] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_KOGA, .trainerName = _("KOGA"), .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderKoga), }, [TRAINER_LEADER_BLAINE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_BLAINE, .trainerName = _("BLAINE"), .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderBlaine), }, [TRAINER_LEADER_SABRINA] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_SABRINA, .trainerName = _("SABRINA"), .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderSabrina), }, [TRAINER_GENTLEMAN_THOMAS] = { .trainerClass = TRAINER_CLASS_GENTLEMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, .trainerPic = TRAINER_PIC_GENTLEMAN, .trainerName = _("THOMAS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanThomas), }, [TRAINER_GENTLEMAN_ARTHUR] = { .trainerClass = TRAINER_CLASS_GENTLEMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, .trainerPic = TRAINER_PIC_GENTLEMAN, .trainerName = _("ARTHUR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanArthur), }, [TRAINER_GENTLEMAN_TUCKER] = { .trainerClass = TRAINER_CLASS_GENTLEMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, .trainerPic = TRAINER_PIC_GENTLEMAN, .trainerName = _("TUCKER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanTucker), }, [TRAINER_GENTLEMAN_NORTON] = { .trainerClass = TRAINER_CLASS_GENTLEMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, .trainerPic = TRAINER_PIC_GENTLEMAN, .trainerName = _("NORTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanNorton), }, [TRAINER_GENTLEMAN_WALTER] = { .trainerClass = TRAINER_CLASS_GENTLEMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, .trainerPic = TRAINER_PIC_GENTLEMAN, .trainerName = _("WALTER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanWalter), }, [TRAINER_RIVAL_SS_ANNE_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSsAnneSquirtle), }, [TRAINER_RIVAL_SS_ANNE_BULBASAUR] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSsAnneBulbasaur), }, [TRAINER_RIVAL_SS_ANNE_CHARMANDER] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSsAnneCharmander), }, [TRAINER_RIVAL_POKEMON_TOWER_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalPokemonTowerSquirtle), }, [TRAINER_RIVAL_POKEMON_TOWER_BULBASAUR] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalPokemonTowerBulbasaur), }, [TRAINER_RIVAL_POKEMON_TOWER_CHARMANDER] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalPokemonTowerCharmander), }, [TRAINER_RIVAL_SILPH_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSilphSquirtle), }, [TRAINER_RIVAL_SILPH_BULBASAUR] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSilphBulbasaur), }, [TRAINER_RIVAL_SILPH_CHARMANDER] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSilphCharmander), }, [TRAINER_RIVAL_ROUTE22_LATE_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22LateSquirtle), }, [TRAINER_RIVAL_ROUTE22_LATE_BULBASAUR] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22LateBulbasaur), }, [TRAINER_RIVAL_ROUTE22_LATE_CHARMANDER] = { .trainerClass = TRAINER_CLASS_RIVAL_LATE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RIVAL_LATE, .trainerName = _("TERRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22LateCharmander), }, [TRAINER_CHAMPION_FIRST_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstSquirtle), }, [TRAINER_CHAMPION_FIRST_BULBASAUR] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstBulbasaur), }, [TRAINER_CHAMPION_FIRST_CHARMANDER] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstCharmander), }, [TRAINER_CHANNELER_PATRICIA] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("PATRICIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerPatricia), }, [TRAINER_CHANNELER_CARLY] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("CARLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerCarly), }, [TRAINER_CHANNELER_HOPE] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("HOPE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerHope), }, [TRAINER_CHANNELER_PAULA] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("PAULA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerPaula), }, [TRAINER_CHANNELER_LAUREL] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("LAUREL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerLaurel), }, [TRAINER_CHANNELER_JODY] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("JODY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerJody), }, [TRAINER_CHANNELER_TAMMY] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("TAMMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerTammy), }, [TRAINER_CHANNELER_RUTH] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("RUTH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerRuth), }, [TRAINER_CHANNELER_KARINA] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("KARINA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerKarina), }, [TRAINER_CHANNELER_JANAE] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("JANAE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerJanae), }, [TRAINER_CHANNELER_ANGELICA] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("ANGELICA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerAngelica), }, [TRAINER_CHANNELER_EMILIA] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("EMILIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerEmilia), }, [TRAINER_CHANNELER_JENNIFER] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("JENNIFER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerJennifer), }, [TRAINER_CHANNELER_1] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler1), }, [TRAINER_CHANNELER_2] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler2), }, [TRAINER_CHANNELER_3] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler3), }, [TRAINER_CHANNELER_4] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler4), }, [TRAINER_CHANNELER_5] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler5), }, [TRAINER_CHANNELER_6] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler6), }, [TRAINER_CHANNELER_7] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler7), }, [TRAINER_CHANNELER_8] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler8), }, [TRAINER_CHANNELER_AMANDA] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("AMANDA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerAmanda), }, [TRAINER_CHANNELER_STACY] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("STACY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerStacy), }, [TRAINER_CHANNELER_TASHA] = { .trainerClass = TRAINER_CLASS_CHANNELER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_CHANNELER, .trainerName = _("TASHA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerTasha), }, [TRAINER_HIKER_JEREMY] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("JEREMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerJeremy), }, [TRAINER_PICNICKER_ALMA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ALMA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlma), }, [TRAINER_PICNICKER_SUSIE] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("SUSIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSusie), }, [TRAINER_PICNICKER_VALERIE] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("VALERIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerValerie), }, [TRAINER_PICNICKER_GWEN] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("GWEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerGwen), }, [TRAINER_BIKER_VIRGIL] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("VIRGIL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerVirgil), }, [TRAINER_CAMPER_FLINT] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("FLINT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperFlint), }, [TRAINER_PICNICKER_MISSY] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("MISSY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMissy), }, [TRAINER_PICNICKER_IRENE] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("IRENE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIrene), }, [TRAINER_PICNICKER_DANA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("DANA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerDana), }, [TRAINER_PICNICKER_ARIANA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ARIANA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAriana), }, [TRAINER_PICNICKER_LEAH] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("LEAH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerLeah), }, [TRAINER_CAMPER_JUSTIN] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("JUSTIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJustin), }, [TRAINER_PICNICKER_YAZMIN] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("YAZMIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerYazmin), }, [TRAINER_PICNICKER_KINDRA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("KINDRA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKindra), }, [TRAINER_PICNICKER_BECKY] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("BECKY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerBecky), }, [TRAINER_PICNICKER_CELIA] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("CELIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerCelia), }, [TRAINER_GENTLEMAN_BROOKS] = { .trainerClass = TRAINER_CLASS_GENTLEMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, .trainerPic = TRAINER_PIC_GENTLEMAN, .trainerName = _("BROOKS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanBrooks), }, [TRAINER_GENTLEMAN_LAMAR] = { .trainerClass = TRAINER_CLASS_GENTLEMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, .trainerPic = TRAINER_PIC_GENTLEMAN, .trainerName = _("LAMAR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanLamar), }, [TRAINER_TWINS_ELI_ANNE] = { .trainerClass = TRAINER_CLASS_TWINS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_TWINS, .trainerName = _("ELI & ANNE"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsEliAnne), }, [TRAINER_COOL_COUPLE_RAY_TYRA] = { .trainerClass = TRAINER_CLASS_COOL_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOL_COUPLE, .trainerName = _("RAY & TYRA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CoolCoupleRayTyra), }, [TRAINER_YOUNG_COUPLE_GIA_JES] = { .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .trainerName = _("GIA & JES"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleGiaJes), }, [TRAINER_TWINS_KIRI_JAN] = { .trainerClass = TRAINER_CLASS_TWINS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_TWINS, .trainerName = _("KIRI & JAN"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsKiriJan), }, [TRAINER_CRUSH_KIN_RON_MYA] = { .trainerClass = TRAINER_CLASS_CRUSH_KIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_KIN, .trainerName = _("RON & MYA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushKinRonMya), }, [TRAINER_YOUNG_COUPLE_LEA_JED] = { .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .trainerName = _("LEA & JED"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleLeaJed), }, [TRAINER_SIS_AND_BRO_LIA_LUC] = { .trainerClass = TRAINER_CLASS_SIS_AND_BRO, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SIS_AND_BRO, .trainerName = _("LIA & LUC"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroLiaLuc), }, [TRAINER_SIS_AND_BRO_LIL_IAN] = { .trainerClass = TRAINER_CLASS_SIS_AND_BRO, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SIS_AND_BRO, .trainerName = _("LIL & IAN"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroLilIan), }, [TRAINER_BUG_CATCHER_3] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher3), }, [TRAINER_BUG_CATCHER_4] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher4), }, [TRAINER_BUG_CATCHER_5] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher5), }, [TRAINER_BUG_CATCHER_6] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher6), }, [TRAINER_BUG_CATCHER_7] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher7), }, [TRAINER_BUG_CATCHER_8] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher8), }, [TRAINER_YOUNGSTER_BEN_3] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("BEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterBen3), }, [TRAINER_YOUNGSTER_BEN_4] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("BEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterBen4), }, [TRAINER_YOUNGSTER_CHAD_2] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("CHAD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterChad2), }, [TRAINER_LASS_RELI_2] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("RELI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassReli2), }, [TRAINER_LASS_RELI_3] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("RELI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassReli3), }, [TRAINER_YOUNGSTER_TIMMY_2] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("TIMMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTimmy2), }, [TRAINER_YOUNGSTER_TIMMY_3] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("TIMMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTimmy3), }, [TRAINER_YOUNGSTER_TIMMY_4] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("TIMMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTimmy4), }, [TRAINER_YOUNGSTER_CHAD_3] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("CHAD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterChad3), }, [TRAINER_LASS_JANICE_2] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("JANICE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJanice2), }, [TRAINER_LASS_JANICE_3] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("JANICE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJanice3), }, [TRAINER_YOUNGSTER_CHAD_4] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("CHAD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterChad4), }, [TRAINER_HIKER_FRANKLIN_2] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("FRANKLIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerFranklin2), }, [TRAINER_PKMN_PROF_PROF_OAK] = { .trainerClass = TRAINER_CLASS_PKMN_PROF, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_PROFESSOR_OAK, .trainerName = _("PROF. OAK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnProfProfOak), }, [TRAINER_PLAYER_BRENDAN] = { .trainerClass = TRAINER_CLASS_PLAYER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RS_BRENDAN_2, .trainerName = _("BRENDAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PlayerBrendan), }, [TRAINER_PLAYER_MAY] = { .trainerClass = TRAINER_CLASS_PLAYER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_RS_MAY_2, .trainerName = _("MAY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PlayerMay), }, [TRAINER_PLAYER_RED] = { .trainerClass = TRAINER_CLASS_PLAYER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_RED, .trainerName = _("RED"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PlayerRed), }, [TRAINER_PLAYER_LEAF] = { .trainerClass = TRAINER_CLASS_PLAYER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_LEAF, .trainerName = _("LEAF"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PlayerLeaf), }, [TRAINER_TEAM_ROCKET_GRUNT_42] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_F, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt42), }, [TRAINER_PSYCHIC_JACLYN] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PSYCHIC_F, .trainerName = _("JACLYN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicJaclyn), }, [TRAINER_CRUSH_GIRL_SHARON] = { .trainerClass = TRAINER_CLASS_CRUSH_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_GIRL, .trainerName = _("SHARON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlSharon), }, [TRAINER_TUBER_AMIRA] = { .trainerClass = TRAINER_CLASS_TUBER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_TUBER_F, .trainerName = _("AMIRA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TuberAmira), }, [TRAINER_PKMN_BREEDER_ALIZE] = { .trainerClass = TRAINER_CLASS_PKMN_BREEDER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_BREEDER, .trainerName = _("ALIZE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnBreederAlize), }, [TRAINER_PKMN_RANGER_NICOLAS] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, .trainerName = _("NICOLAS"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerNicolas), }, [TRAINER_PKMN_RANGER_MADELINE] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .trainerName = _("MADELINE"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerMadeline), }, [TRAINER_AROMA_LADY_NIKKI] = { .trainerClass = TRAINER_CLASS_AROMA_LADY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_AROMA_LADY, .trainerName = _("NIKKI"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_AromaLadyNikki), }, [TRAINER_RUIN_MANIAC_STANLY] = { .trainerClass = TRAINER_CLASS_RUIN_MANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RUIN_MANIAC, .trainerName = _("STANLY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacStanly), }, [TRAINER_LADY_JACKI] = { .trainerClass = TRAINER_CLASS_LADY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_LADY, .trainerName = _("JACKI"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_LadyJacki), }, [TRAINER_PAINTER_DAISY] = { .trainerClass = TRAINER_CLASS_PAINTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_PAINTER, .trainerName = _("DAISY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterDaisy), }, [TRAINER_BIKER_GOON] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("GOON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerGoon), }, [TRAINER_BIKER_GOON_2] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("GOON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerGoon2), }, [TRAINER_BIKER_GOON_3] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("GOON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerGoon3), }, [TRAINER_BIKER_2] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _(""), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_Biker2), }, [TRAINER_BUG_CATCHER_ANTHONY] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("ANTHONY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherAnthony), }, [TRAINER_BUG_CATCHER_CHARLIE] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("CHARLIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherCharlie), }, [TRAINER_TWINS_ELI_ANNE_2] = { .trainerClass = TRAINER_CLASS_TWINS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_TWINS, .trainerName = _("ELI & ANNE"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsEliAnne2), }, [TRAINER_YOUNGSTER_JOHNSON] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("JOHNSON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterJohnson), }, [TRAINER_BIKER_RICARDO] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("RICARDO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerRicardo), }, [TRAINER_BIKER_JAREN] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("JAREN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerJaren), }, [TRAINER_TEAM_ROCKET_GRUNT_43] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt43), }, [TRAINER_TEAM_ROCKET_GRUNT_44] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt44), }, [TRAINER_TEAM_ROCKET_GRUNT_45] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt45), }, [TRAINER_TEAM_ROCKET_GRUNT_46] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt46), }, [TRAINER_TEAM_ROCKET_GRUNT_47] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt47), }, [TRAINER_TEAM_ROCKET_GRUNT_48] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt48), }, [TRAINER_TEAM_ROCKET_ADMIN] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_F, .trainerName = _("ADMIN"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketAdmin), }, [TRAINER_TEAM_ROCKET_ADMIN_2] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("ADMIN"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketAdmin2), }, [TRAINER_SCIENTIST_GIDEON] = { .trainerClass = TRAINER_CLASS_SCIENTIST, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SCIENTIST, .trainerName = _("GIDEON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistGideon), }, [TRAINER_SWIMMER_FEMALE_AMARA] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("AMARA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAmara), }, [TRAINER_SWIMMER_FEMALE_MARIA] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("MARIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleMaria), }, [TRAINER_SWIMMER_FEMALE_ABIGAIL] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("ABIGAIL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAbigail), }, [TRAINER_SWIMMER_MALE_FINN] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("FINN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleFinn), }, [TRAINER_SWIMMER_MALE_GARRETT] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("GARRETT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleGarrett), }, [TRAINER_FISHERMAN_TOMMY] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("TOMMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanTommy), }, [TRAINER_CRUSH_GIRL_TANYA] = { .trainerClass = TRAINER_CLASS_CRUSH_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_GIRL, .trainerName = _("TANYA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlTanya), }, [TRAINER_BLACK_BELT_SHEA] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("SHEA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltShea), }, [TRAINER_BLACK_BELT_HUGH] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("HUGH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHugh), }, [TRAINER_CAMPER_BRYCE] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("BRYCE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperBryce), }, [TRAINER_PICNICKER_CLAIRE] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("CLAIRE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerClaire), }, [TRAINER_CRUSH_KIN_MIK_KIA] = { .trainerClass = TRAINER_CLASS_CRUSH_KIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_KIN, .trainerName = _("MIK & KIA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushKinMikKia), }, [TRAINER_AROMA_LADY_VIOLET] = { .trainerClass = TRAINER_CLASS_AROMA_LADY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_AROMA_LADY, .trainerName = _("VIOLET"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_AromaLadyViolet), }, [TRAINER_TUBER_ALEXIS] = { .trainerClass = TRAINER_CLASS_TUBER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_TUBER_F, .trainerName = _("ALEXIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TuberAlexis), }, [TRAINER_TWINS_JOY_MEG] = { .trainerClass = TRAINER_CLASS_TWINS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_TWINS, .trainerName = _("JOY & MEG"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsJoyMeg), }, [TRAINER_SWIMMER_FEMALE_TISHA] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("TISHA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleTisha), }, [TRAINER_PAINTER_CELINA] = { .trainerClass = TRAINER_CLASS_PAINTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_PAINTER, .trainerName = _("CELINA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterCelina), }, [TRAINER_PAINTER_RAYNA] = { .trainerClass = TRAINER_CLASS_PAINTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_PAINTER, .trainerName = _("RAYNA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterRayna), }, [TRAINER_LADY_GILLIAN] = { .trainerClass = TRAINER_CLASS_LADY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_LADY, .trainerName = _("GILLIAN"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_LadyGillian), }, [TRAINER_YOUNGSTER_DESTIN] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("DESTIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDestin), }, [TRAINER_SWIMMER_MALE_TOBY] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("TOBY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleToby), }, [TRAINER_TEAM_ROCKET_GRUNT_49] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt49), }, [TRAINER_TEAM_ROCKET_GRUNT_50] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt50), }, [TRAINER_TEAM_ROCKET_GRUNT_51] = { .trainerClass = TRAINER_CLASS_TEAM_ROCKET, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_ROCKET_GRUNT_F, .trainerName = _("GRUNT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt51), }, [TRAINER_BIRD_KEEPER_MILO] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("MILO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMilo), }, [TRAINER_BIRD_KEEPER_CHAZ] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("CHAZ"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChaz), }, [TRAINER_BIRD_KEEPER_HAROLD] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("HAROLD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperHarold), }, [TRAINER_FISHERMAN_TYLOR] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("TYLOR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanTylor), }, [TRAINER_SWIMMER_MALE_MYMO] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("MYMO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleMymo), }, [TRAINER_SWIMMER_FEMALE_NICOLE] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("NICOLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleNicole), }, [TRAINER_SIS_AND_BRO_AVA_GEB] = { .trainerClass = TRAINER_CLASS_SIS_AND_BRO, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SIS_AND_BRO, .trainerName = _("AVA & GEB"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroAvaGeb), }, [TRAINER_AROMA_LADY_ROSE] = { .trainerClass = TRAINER_CLASS_AROMA_LADY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_AROMA_LADY, .trainerName = _("ROSE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_AromaLadyRose), }, [TRAINER_SWIMMER_MALE_SAMIR] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("SAMIR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleSamir), }, [TRAINER_SWIMMER_FEMALE_DENISE] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("DENISE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleDenise), }, [TRAINER_TWINS_MIU_MIA] = { .trainerClass = TRAINER_CLASS_TWINS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_TWINS, .trainerName = _("MIU & MIA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsMiuMia), }, [TRAINER_HIKER_EARL] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("EARL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerEarl), }, [TRAINER_RUIN_MANIAC_FOSTER] = { .trainerClass = TRAINER_CLASS_RUIN_MANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RUIN_MANIAC, .trainerName = _("FOSTER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacFoster), }, [TRAINER_RUIN_MANIAC_LARRY] = { .trainerClass = TRAINER_CLASS_RUIN_MANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RUIN_MANIAC, .trainerName = _("LARRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacLarry), }, [TRAINER_HIKER_DARYL] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("DARYL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerDaryl), }, [TRAINER_POKEMANIAC_HECTOR] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("HECTOR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHector), }, [TRAINER_PSYCHIC_DARIO] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_PSYCHIC_M, .trainerName = _("DARIO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicDario), }, [TRAINER_PSYCHIC_RODETTE] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PSYCHIC_F, .trainerName = _("RODETTE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicRodette), }, [TRAINER_AROMA_LADY_MIAH] = { .trainerClass = TRAINER_CLASS_AROMA_LADY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_AROMA_LADY, .trainerName = _("MIAH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_AromaLadyMiah), }, [TRAINER_YOUNG_COUPLE_EVE_JON] = { .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .trainerName = _("EVE & JON"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleEveJon), }, [TRAINER_JUGGLER_MASON] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("MASON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_JugglerMason), }, [TRAINER_CRUSH_GIRL_CYNDY] = { .trainerClass = TRAINER_CLASS_CRUSH_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_GIRL, .trainerName = _("CYNDY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlCyndy), }, [TRAINER_CRUSH_GIRL_JOCELYN] = { .trainerClass = TRAINER_CLASS_CRUSH_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_GIRL, .trainerName = _("JOCELYN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlJocelyn), }, [TRAINER_TAMER_EVAN] = { .trainerClass = TRAINER_CLASS_TAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_TAMER, .trainerName = _("EVAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerEvan), }, [TRAINER_POKEMANIAC_MARK_2] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("MARK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacMark2), }, [TRAINER_PKMN_RANGER_LOGAN] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, .trainerName = _("LOGAN"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerLogan), }, [TRAINER_PKMN_RANGER_JACKSON] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, .trainerName = _("JACKSON"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerJackson), }, [TRAINER_PKMN_RANGER_BETH] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .trainerName = _("BETH"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnRangerBeth), }, [TRAINER_PKMN_RANGER_KATELYN] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .trainerName = _("KATELYN"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerKatelyn), }, [TRAINER_COOLTRAINER_LEROY] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("LEROY"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerLeroy), }, [TRAINER_COOLTRAINER_MICHELLE] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("MICHELLE"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerMichelle), }, [TRAINER_COOL_COUPLE_LEX_NYA] = { .trainerClass = TRAINER_CLASS_COOL_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOL_COUPLE, .trainerName = _("LEX & NYA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CoolCoupleLexNya), }, [TRAINER_RUIN_MANIAC_BRANDON] = { .trainerClass = TRAINER_CLASS_RUIN_MANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RUIN_MANIAC, .trainerName = _("BRANDON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacBrandon), }, [TRAINER_RUIN_MANIAC_BENJAMIN] = { .trainerClass = TRAINER_CLASS_RUIN_MANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RUIN_MANIAC, .trainerName = _("BENJAMIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_RuinManiacBenjamin), }, [TRAINER_PAINTER_EDNA] = { .trainerClass = TRAINER_CLASS_PAINTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_PAINTER, .trainerName = _("EDNA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterEdna), }, [TRAINER_GENTLEMAN_CLIFFORD] = { .trainerClass = TRAINER_CLASS_GENTLEMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, .trainerPic = TRAINER_PIC_GENTLEMAN, .trainerName = _("CLIFFORD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanClifford), }, [TRAINER_LADY_SELPHY] = { .trainerClass = TRAINER_CLASS_LADY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_LADY, .trainerName = _("SELPHY"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_CUSTOM_MOVES(sParty_LadySelphy), }, [TRAINER_RUIN_MANIAC_LAWSON] = { .trainerClass = TRAINER_CLASS_RUIN_MANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RUIN_MANIAC, .trainerName = _("LAWSON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacLawson), }, [TRAINER_PSYCHIC_LAURA] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PSYCHIC_F, .trainerName = _("LAURA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicLaura), }, [TRAINER_PKMN_BREEDER_BETHANY] = { .trainerClass = TRAINER_CLASS_PKMN_BREEDER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_BREEDER, .trainerName = _("BETHANY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnBreederBethany), }, [TRAINER_PKMN_BREEDER_ALLISON] = { .trainerClass = TRAINER_CLASS_PKMN_BREEDER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_BREEDER, .trainerName = _("ALLISON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnBreederAllison), }, [TRAINER_BUG_CATCHER_GARRET] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("GARRET"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherGarret), }, [TRAINER_BUG_CATCHER_JONAH] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("JONAH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherJonah), }, [TRAINER_BUG_CATCHER_VANCE] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("VANCE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherVance), }, [TRAINER_YOUNGSTER_NASH] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("NASH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterNash), }, [TRAINER_YOUNGSTER_CORDELL] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("CORDELL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterCordell), }, [TRAINER_LASS_DALIA] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("DALIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassDalia), }, [TRAINER_LASS_JOANA] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("JOANA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJoana), }, [TRAINER_CAMPER_RILEY] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("RILEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRiley), }, [TRAINER_PICNICKER_MARCY] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("MARCY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMarcy), }, [TRAINER_RUIN_MANIAC_LAYTON] = { .trainerClass = TRAINER_CLASS_RUIN_MANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RUIN_MANIAC, .trainerName = _("LAYTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacLayton), }, [TRAINER_PICNICKER_KELSEY_2] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("KELSEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKelsey2), }, [TRAINER_PICNICKER_KELSEY_3] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("KELSEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKelsey3), }, [TRAINER_PICNICKER_KELSEY_4] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("KELSEY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKelsey4), }, [TRAINER_CAMPER_RICKY_2] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("RICKY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRicky2), }, [TRAINER_CAMPER_RICKY_3] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("RICKY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRicky3), }, [TRAINER_CAMPER_RICKY_4] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("RICKY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRicky4), }, [TRAINER_CAMPER_JEFF_2] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("JEFF"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJeff2), }, [TRAINER_CAMPER_JEFF_3] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("JEFF"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJeff3), }, [TRAINER_CAMPER_JEFF_4] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("JEFF"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJeff4), }, [TRAINER_PICNICKER_ISABELLE_2] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ISABELLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIsabelle2), }, [TRAINER_PICNICKER_ISABELLE_3] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ISABELLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIsabelle3), }, [TRAINER_PICNICKER_ISABELLE_4] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ISABELLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIsabelle4), }, [TRAINER_YOUNGSTER_YASU_2] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("YASU"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterYasu2), }, [TRAINER_YOUNGSTER_YASU_3] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("YASU"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterYasu3), }, [TRAINER_ENGINEER_BERNIE_2] = { .trainerClass = TRAINER_CLASS_ENGINEER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_ENGINEER, .trainerName = _("BERNIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_EngineerBernie2), }, [TRAINER_GAMER_DARIAN_2] = { .trainerClass = TRAINER_CLASS_GAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_GAMER, .trainerName = _("DARIAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerDarian2), }, [TRAINER_CAMPER_CHRIS_2] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("CHRIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperChris2), }, [TRAINER_CAMPER_CHRIS_3] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("CHRIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperChris3), }, [TRAINER_CAMPER_CHRIS_4] = { .trainerClass = TRAINER_CLASS_CAMPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CAMPER, .trainerName = _("CHRIS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperChris4), }, [TRAINER_PICNICKER_ALICIA_2] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ALICIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlicia2), }, [TRAINER_PICNICKER_ALICIA_3] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ALICIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlicia3), }, [TRAINER_PICNICKER_ALICIA_4] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("ALICIA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlicia4), }, [TRAINER_HIKER_JEREMY_2] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("JEREMY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerJeremy2), }, [TRAINER_POKEMANIAC_MARK_3] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("MARK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacMark3), }, [TRAINER_POKEMANIAC_HERMAN_2] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("HERMAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHerman2), }, [TRAINER_POKEMANIAC_HERMAN_3] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("HERMAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHerman3), }, [TRAINER_HIKER_TRENT_2] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("TRENT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerTrent2), }, [TRAINER_LASS_MEGAN_2] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("MEGAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassMegan2), }, [TRAINER_LASS_MEGAN_3] = { .trainerClass = TRAINER_CLASS_LASS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LASS, .trainerName = _("MEGAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_LassMegan3), }, [TRAINER_SUPER_NERD_GLENN_2] = { .trainerClass = TRAINER_CLASS_SUPER_NERD, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_SUPER_NERD, .trainerName = _("GLENN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdGlenn2), }, [TRAINER_GAMER_RICH_2] = { .trainerClass = TRAINER_CLASS_GAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_GAMER, .trainerName = _("RICH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerRich2), }, [TRAINER_BIKER_JAREN_2] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("JAREN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerJaren2), }, [TRAINER_FISHERMAN_ELLIOT_2] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("ELLIOT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanElliot2), }, [TRAINER_ROCKER_LUCA_2] = { .trainerClass = TRAINER_CLASS_ROCKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_ROCKER, .trainerName = _("LUCA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RockerLuca2), }, [TRAINER_BEAUTY_SHEILA_2] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_BEAUTY, .trainerName = _("SHEILA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautySheila2), }, [TRAINER_BIRD_KEEPER_ROBERT_2] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("ROBERT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRobert2), }, [TRAINER_BIRD_KEEPER_ROBERT_3] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("ROBERT"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRobert3), }, [TRAINER_PICNICKER_SUSIE_2] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("SUSIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSusie2), }, [TRAINER_PICNICKER_SUSIE_3] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("SUSIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSusie3), }, [TRAINER_PICNICKER_SUSIE_4] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("SUSIE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSusie4), }, [TRAINER_BIKER_LUKAS_2] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("LUKAS"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerLukas2), }, [TRAINER_BIRD_KEEPER_BENNY_2] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("BENNY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperBenny2), }, [TRAINER_BIRD_KEEPER_BENNY_3] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("BENNY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperBenny3), }, [TRAINER_BIRD_KEEPER_MARLON_2] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("MARLON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMarlon2), }, [TRAINER_BIRD_KEEPER_MARLON_3] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("MARLON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMarlon3), }, [TRAINER_BEAUTY_GRACE_2] = { .trainerClass = TRAINER_CLASS_BEAUTY, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_BEAUTY, .trainerName = _("GRACE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyGrace2), }, [TRAINER_BIRD_KEEPER_CHESTER_2] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("CHESTER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChester2), }, [TRAINER_BIRD_KEEPER_CHESTER_3] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("CHESTER"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChester3), }, [TRAINER_PICNICKER_BECKY_2] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("BECKY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerBecky2), }, [TRAINER_PICNICKER_BECKY_3] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("BECKY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerBecky3), }, [TRAINER_PICNICKER_BECKY_4] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("BECKY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerBecky4), }, [TRAINER_CRUSH_KIN_RON_MYA_2] = { .trainerClass = TRAINER_CLASS_CRUSH_KIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_KIN, .trainerName = _("RON & MYA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushKinRonMya2), }, [TRAINER_CRUSH_KIN_RON_MYA_3] = { .trainerClass = TRAINER_CLASS_CRUSH_KIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_KIN, .trainerName = _("RON & MYA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushKinRonMya3), }, [TRAINER_CRUSH_KIN_RON_MYA_4] = { .trainerClass = TRAINER_CLASS_CRUSH_KIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_KIN, .trainerName = _("RON & MYA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushKinRonMya4), }, [TRAINER_BIKER_RUBEN_2] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("RUBEN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerRuben2), }, [TRAINER_CUE_BALL_CAMRON_2] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("CAMRON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallCamron2), }, [TRAINER_BIKER_JAXON_2] = { .trainerClass = TRAINER_CLASS_BIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BIKER, .trainerName = _("JAXON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerJaxon2), }, [TRAINER_CUE_BALL_ISAIAH_2] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("ISAIAH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallIsaiah2), }, [TRAINER_CUE_BALL_COREY_2] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("COREY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallCorey2), }, [TRAINER_BIRD_KEEPER_JACOB_2] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("JACOB"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperJacob2), }, [TRAINER_BIRD_KEEPER_JACOB_3] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("JACOB"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperJacob3), }, [TRAINER_SWIMMER_FEMALE_ALICE_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("ALICE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAlice2), }, [TRAINER_SWIMMER_MALE_DARRIN_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("DARRIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDarrin2), }, [TRAINER_PICNICKER_MISSY_2] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("MISSY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMissy2), }, [TRAINER_PICNICKER_MISSY_3] = { .trainerClass = TRAINER_CLASS_PICNICKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PICNICKER, .trainerName = _("MISSY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMissy3), }, [TRAINER_FISHERMAN_WADE_2] = { .trainerClass = TRAINER_CLASS_FISHERMAN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_FISHERMAN, .trainerName = _("WADE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanWade2), }, [TRAINER_SWIMMER_MALE_JACK_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("JACK"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleJack2), }, [TRAINER_SIS_AND_BRO_LIL_IAN_2] = { .trainerClass = TRAINER_CLASS_SIS_AND_BRO, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SIS_AND_BRO, .trainerName = _("LIL & IAN"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroLilIan2), }, [TRAINER_SIS_AND_BRO_LIL_IAN_3] = { .trainerClass = TRAINER_CLASS_SIS_AND_BRO, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SIS_AND_BRO, .trainerName = _("LIL & IAN"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroLilIan3), }, [TRAINER_SWIMMER_MALE_FINN_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("FINN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleFinn2), }, [TRAINER_CRUSH_GIRL_SHARON_2] = { .trainerClass = TRAINER_CLASS_CRUSH_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_GIRL, .trainerName = _("SHARON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlSharon2), }, [TRAINER_CRUSH_GIRL_SHARON_3] = { .trainerClass = TRAINER_CLASS_CRUSH_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_GIRL, .trainerName = _("SHARON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlSharon3), }, [TRAINER_CRUSH_GIRL_TANYA_2] = { .trainerClass = TRAINER_CLASS_CRUSH_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_GIRL, .trainerName = _("TANYA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlTanya2), }, [TRAINER_CRUSH_GIRL_TANYA_3] = { .trainerClass = TRAINER_CLASS_CRUSH_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_GIRL, .trainerName = _("TANYA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlTanya3), }, [TRAINER_BLACK_BELT_SHEA_2] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("SHEA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltShea2), }, [TRAINER_BLACK_BELT_SHEA_3] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("SHEA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltShea3), }, [TRAINER_BLACK_BELT_HUGH_2] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("HUGH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHugh2), }, [TRAINER_BLACK_BELT_HUGH_3] = { .trainerClass = TRAINER_CLASS_BLACK_BELT, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_BLACK_BELT, .trainerName = _("HUGH"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHugh3), }, [TRAINER_CRUSH_KIN_MIK_KIA_2] = { .trainerClass = TRAINER_CLASS_CRUSH_KIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_KIN, .trainerName = _("MIK & KIA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushKinMikKia2), }, [TRAINER_CRUSH_KIN_MIK_KIA_3] = { .trainerClass = TRAINER_CLASS_CRUSH_KIN, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_KIN, .trainerName = _("MIK & KIA"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushKinMikKia3), }, [TRAINER_TUBER_AMIRA_2] = { .trainerClass = TRAINER_CLASS_TUBER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_TUBER_F, .trainerName = _("AMIRA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TuberAmira2), }, [TRAINER_TWINS_JOY_MEG_2] = { .trainerClass = TRAINER_CLASS_TWINS, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, .trainerPic = TRAINER_PIC_TWINS, .trainerName = _("JOY & MEG"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsJoyMeg2), }, [TRAINER_PAINTER_RAYNA_2] = { .trainerClass = TRAINER_CLASS_PAINTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_PAINTER, .trainerName = _("RAYNA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterRayna2), }, [TRAINER_YOUNGSTER_DESTIN_2] = { .trainerClass = TRAINER_CLASS_YOUNGSTER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_YOUNGSTER, .trainerName = _("DESTIN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDestin2), }, [TRAINER_PKMN_BREEDER_ALIZE_2] = { .trainerClass = TRAINER_CLASS_PKMN_BREEDER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_BREEDER, .trainerName = _("ALIZE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnBreederAlize2), }, [TRAINER_YOUNG_COUPLE_GIA_JES_2] = { .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .trainerName = _("GIA & JES"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleGiaJes2), }, [TRAINER_YOUNG_COUPLE_GIA_JES_3] = { .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .trainerName = _("GIA & JES"), .items = {}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleGiaJes3), }, [TRAINER_BIRD_KEEPER_MILO_2] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("MILO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMilo2), }, [TRAINER_BIRD_KEEPER_CHAZ_2] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("CHAZ"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChaz2), }, [TRAINER_BIRD_KEEPER_HAROLD_2] = { .trainerClass = TRAINER_CLASS_BIRD_KEEPER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_BIRD_KEEPER, .trainerName = _("HAROLD"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperHarold2), }, [TRAINER_SWIMMER_FEMALE_NICOLE_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("NICOLE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleNicole2), }, [TRAINER_PSYCHIC_JACLYN_2] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PSYCHIC_F, .trainerName = _("JACLYN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicJaclyn2), }, [TRAINER_SWIMMER_MALE_SAMIR_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("SAMIR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleSamir2), }, [TRAINER_HIKER_EARL_2] = { .trainerClass = TRAINER_CLASS_HIKER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_HIKER, .trainerName = _("EARL"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerEarl2), }, [TRAINER_RUIN_MANIAC_LARRY_2] = { .trainerClass = TRAINER_CLASS_RUIN_MANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_RUIN_MANIAC, .trainerName = _("LARRY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacLarry2), }, [TRAINER_POKEMANIAC_HECTOR_2] = { .trainerClass = TRAINER_CLASS_POKEMANIAC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, .trainerPic = TRAINER_PIC_POKEMANIAC, .trainerName = _("HECTOR"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHector2), }, [TRAINER_PSYCHIC_DARIO_2] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_PSYCHIC_M, .trainerName = _("DARIO"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicDario2), }, [TRAINER_PSYCHIC_RODETTE_2] = { .trainerClass = TRAINER_CLASS_PSYCHIC, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_PSYCHIC_F, .trainerName = _("RODETTE"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicRodette2), }, [TRAINER_JUGGLER_MASON_2] = { .trainerClass = TRAINER_CLASS_JUGGLER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_JUGGLER, .trainerName = _("MASON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerMason2), }, [TRAINER_PKMN_RANGER_NICOLAS_2] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, .trainerName = _("NICOLAS"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerNicolas2), }, [TRAINER_PKMN_RANGER_MADELINE_2] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .trainerName = _("MADELINE"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerMadeline2), }, [TRAINER_CRUSH_GIRL_CYNDY_2] = { .trainerClass = TRAINER_CLASS_CRUSH_GIRL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, .trainerPic = TRAINER_PIC_CRUSH_GIRL, .trainerName = _("CYNDY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlCyndy2), }, [TRAINER_TAMER_EVAN_2] = { .trainerClass = TRAINER_CLASS_TAMER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, .trainerPic = TRAINER_PIC_TAMER, .trainerName = _("EVAN"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerEvan2), }, [TRAINER_PKMN_RANGER_JACKSON_2] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, .trainerName = _("JACKSON"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerJackson2), }, [TRAINER_PKMN_RANGER_KATELYN_2] = { .trainerClass = TRAINER_CLASS_PKMN_RANGER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .trainerName = _("KATELYN"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerKatelyn2), }, [TRAINER_COOLTRAINER_LEROY_2] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOLTRAINER_M, .trainerName = _("LEROY"), .items = {ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerLeroy2), }, [TRAINER_COOLTRAINER_MICHELLE_2] = { .trainerClass = TRAINER_CLASS_COOLTRAINER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_COOLTRAINER_F, .trainerName = _("MICHELLE"), .items = {ITEM_HYPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerMichelle2), }, [TRAINER_COOL_COUPLE_LEX_NYA_2] = { .trainerClass = TRAINER_CLASS_COOL_COUPLE, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, .trainerPic = TRAINER_PIC_COOL_COUPLE, .trainerName = _("LEX & NYA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = TRUE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = NO_ITEM_CUSTOM_MOVES(sParty_CoolCoupleLexNya2), }, [TRAINER_BUG_CATCHER_COLTON_2] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("COLTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherColton2), }, [TRAINER_BUG_CATCHER_COLTON_3] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("COLTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherColton3), }, [TRAINER_BUG_CATCHER_COLTON_4] = { .trainerClass = TRAINER_CLASS_BUG_CATCHER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_BUG_CATCHER, .trainerName = _("COLTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherColton4), }, [TRAINER_SWIMMER_MALE_MATTHEW_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("MATTHEW"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleMatthew2), }, [TRAINER_SWIMMER_MALE_TONY_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_M, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, .trainerPic = TRAINER_PIC_SWIMMER_M, .trainerName = _("TONY"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleTony2), }, [TRAINER_SWIMMER_FEMALE_MELISSA_2] = { .trainerClass = TRAINER_CLASS_SWIMMER_F, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_SWIMMER_F, .trainerName = _("MELISSA"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleMelissa2), }, [TRAINER_ELITE_FOUR_LORELEI_2] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_LORELEI, .trainerName = _("LORELEI"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLorelei2), }, [TRAINER_ELITE_FOUR_BRUNO_2] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_BRUNO, .trainerName = _("BRUNO"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourBruno2), }, [TRAINER_ELITE_FOUR_AGATHA_2] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_AGATHA, .trainerName = _("AGATHA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourAgatha2), }, [TRAINER_ELITE_FOUR_LANCE_2] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_LANCE, .trainerName = _("LANCE"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLance2), }, [TRAINER_CHAMPION_REMATCH_SQUIRTLE] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_ChampionRematchSquirtle), }, [TRAINER_CHAMPION_REMATCH_BULBASAUR] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_ChampionRematchBulbasaur), }, [TRAINER_CHAMPION_REMATCH_CHARMANDER] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_ChampionRematchCharmander), }, [TRAINER_CUE_BALL_PAXTON] = { .trainerClass = TRAINER_CLASS_CUE_BALL, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CUE_BALL, .trainerName = _("PAXTON"), .items = {}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE, .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallPaxton), }, [TRAINER_LEADER_BROCK_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_BROCK, .trainerName = _("BROCK"), .items = {ITEM_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderBrockChallenge), }, [TRAINER_LEADER_MISTY_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_MISTY, .trainerName = _("MISTY"), .items = {ITEM_SUPER_POTION}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderMistyChallenge), }, [TRAINER_LEADER_LT_SURGE_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_LT_SURGE, .trainerName = _("LT. SURGE"), .items = {ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderLtSurgeChallenge), }, [TRAINER_LEADER_ERIKA_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_ERIKA, .trainerName = _("ERIKA"), .items = {ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_LeaderErikaChallenge), }, [TRAINER_LEADER_KOGA_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_KOGA, .trainerName = _("KOGA"), .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderKogaChallenge), }, [TRAINER_LEADER_SABRINA_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_SABRINA, .trainerName = _("SABRINA"), .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderSabrinaChallenge), }, [TRAINER_LEADER_BLAINE_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_BLAINE, .trainerName = _("BLAINE"), .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderBlaineChallenge), }, [TRAINER_LEADER_GIOVANNI_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, .trainerPic = TRAINER_PIC_LEADER_GIOVANNI, .trainerName = _("GIOVANNI"), .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderGiovanniChallenge), }, [TRAINER_ELITE_FOUR_LORELEI_CHALLENGE] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_ELITE_FOUR_LORELEI, .trainerName = _("LORELEI"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLoreleiChallenge), }, [TRAINER_ELITE_FOUR_BRUNO_CHALLENGE] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_BRUNO, .trainerName = _("BRUNO"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourBrunoChallenge), }, [TRAINER_ELITE_FOUR_AGATHA_CHALLENGE] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_ELITE_FOUR_AGATHA, .trainerName = _("AGATHA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourAgathaChallenge), }, [TRAINER_ELITE_FOUR_LANCE_CHALLENGE] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_LANCE, .trainerName = _("LANCE"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLanceChallenge), }, [TRAINER_CHAMPION_FIRST_SQUIRTLE_CHALLENGE] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstSquirtleChallenge), }, [TRAINER_CHAMPION_FIRST_BULBASAUR_CHALLENGE] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstBulbasaurChallenge), }, [TRAINER_CHAMPION_FIRST_CHARMANDER_CHALLENGE] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstCharmanderChallenge), }, [TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_ELITE_FOUR_LORELEI, .trainerName = _("LORELEI"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_EliteFourLoreleiChallenge2), }, [TRAINER_ELITE_FOUR_BRUNO_CHALLENGE_2] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_BRUNO, .trainerName = _("BRUNO"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_EliteFourBrunoChallenge2), }, [TRAINER_ELITE_FOUR_AGATHA_CHALLENGE_2] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_ELITE_FOUR_AGATHA, .trainerName = _("AGATHA"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_EliteFourAgathaChallenge2), }, [TRAINER_ELITE_FOUR_LANCE_CHALLENGE_2] = { .trainerClass = TRAINER_CLASS_ELITE_FOUR, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, .trainerPic = TRAINER_PIC_ELITE_FOUR_LANCE, .trainerName = _("LANCE"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_EliteFourLanceChallenge2), }, [TRAINER_CHAMPION_REMATCH_SQUIRTLE_CHALLENGE] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_ChampionRematchSquirtleChallenge), }, [TRAINER_CHAMPION_REMATCH_BULBASAUR_CHALLENGE] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_ChampionRematchBulbasaurChallenge), }, [TRAINER_CHAMPION_REMATCH_CHARMANDER_CHALLENGE] = { .trainerClass = TRAINER_CLASS_CHAMPION, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_CHAMPION_RIVAL, .trainerName = _("TERRY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_ChampionRematchCharmanderChallenge), }, [TRAINER_BROCK_REMATCH] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_BROCK, .trainerName = _("BROCK"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderBrockRematch), }, [TRAINER_BROCK_REMATCH_CHALLENGE] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, .trainerPic = TRAINER_PIC_LEADER_BROCK, .trainerName = _("BROCK"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = CUSTOM_MOVES_EVS(sParty_LeaderBrockRematchChallenge), }, [TRAINER_MISTY_REMATCH] = { .trainerClass = TRAINER_CLASS_LEADER, .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE, .trainerPic = TRAINER_PIC_LEADER_MISTY, .trainerName = _("MISTY"), .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, .doubleBattle = FALSE, .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY, .party = ITEM_CUSTOM_MOVES(sParty_LeaderMistyRematch), }, }; ================================================ FILE: src/data/union_room.h ================================================ static const u8 *const sLinkGroupActivityNameTexts[] = { [ACTIVITY_NONE] = gText_UR_EmptyString, [ACTIVITY_BATTLE_SINGLE] = gText_UR_SingleBattle, [ACTIVITY_BATTLE_DOUBLE] = gText_UR_DoubleBattle, [ACTIVITY_BATTLE_MULTI] = gText_UR_MultiBattle, [ACTIVITY_TRADE] = gText_UR_PokemonTrades, [ACTIVITY_CHAT] = gText_UR_Chat, [ACTIVITY_WONDER_CARD_DUP] = gText_UR_WonderCards, [ACTIVITY_WONDER_NEWS_DUP] = gText_UR_WonderNews, [ACTIVITY_CARD] = gText_UR_Cards, [ACTIVITY_POKEMON_JUMP] = gText_UR_PokemonJump, [ACTIVITY_BERRY_CRUSH] = gText_UR_BerryCrush, [ACTIVITY_BERRY_PICK] = gText_UR_BerryPicking, [ACTIVITY_SEARCH] = gText_UR_Search, [ACTIVITY_SPIN_TRADE] = gText_UR_SpinTrade, [ACTIVITY_ITEM_TRADE] = gText_UR_ItemTrade, [ACTIVITY_RECORD_CORNER] = gText_UR_EmptyString, [ACTIVITY_BERRY_BLENDER] = gText_UR_EmptyString, [ACTIVITY_ACCEPT] = gText_UR_EmptyString, [ACTIVITY_DECLINE] = gText_UR_EmptyString, [ACTIVITY_NPCTALK] = gText_UR_EmptyString, [ACTIVITY_PLYRTALK] = gText_UR_EmptyString, [ACTIVITY_WONDER_CARD] = gText_UR_WonderCards, [ACTIVITY_WONDER_NEWS] = gText_UR_WonderNews }; static const struct WindowTemplate sWindowTemplate_BButtonCancel = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 2, .paletteNum = 15, .baseBlock = 0x008 }; // Minimum and maximum number of players for a link group // A minimum of 0 means the min and max are equal #define LINK_GROUP_CAPACITY(min, max)(((min) << 12) | ((max) << 8)) #define GROUP_MAX(capacity)(capacity & 0x0F) #define GROUP_MIN(capacity)(capacity >> 4) #define GROUP_MIN2(capacity)(capacity & 0xF0) // Unnecessary to have both, but needed to match static const u32 sLinkGroupToActivityAndCapacity[] = { [LINK_GROUP_SINGLE_BATTLE] = ACTIVITY_BATTLE_SINGLE | LINK_GROUP_CAPACITY(0, 2), [LINK_GROUP_DOUBLE_BATTLE] = ACTIVITY_BATTLE_DOUBLE | LINK_GROUP_CAPACITY(0, 2), [LINK_GROUP_MULTI_BATTLE] = ACTIVITY_BATTLE_MULTI | LINK_GROUP_CAPACITY(0, 4), [LINK_GROUP_TRADE] = ACTIVITY_TRADE | LINK_GROUP_CAPACITY(0, 2), [LINK_GROUP_POKEMON_JUMP] = ACTIVITY_POKEMON_JUMP | LINK_GROUP_CAPACITY(2, 5), [LINK_GROUP_BERRY_CRUSH] = ACTIVITY_BERRY_CRUSH | LINK_GROUP_CAPACITY(2, 5), [LINK_GROUP_BERRY_PICKING] = ACTIVITY_BERRY_PICK | LINK_GROUP_CAPACITY(3, 5), [LINK_GROUP_WONDER_CARD] = ACTIVITY_SPIN_TRADE | LINK_GROUP_CAPACITY(3, 5), [LINK_GROUP_WONDER_NEWS] = ACTIVITY_ITEM_TRADE | LINK_GROUP_CAPACITY(3, 5) }; static const struct WindowTemplate sWindowTemplate_List_PossibleGroupMembers = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 3, .width = 13, .height = 10, .paletteNum = 15, .baseBlock = 0x044 }; static const struct WindowTemplate sWindowTemplate_NumPlayerMode = { .bg = 0, .tilemapLeft = 16, .tilemapTop = 3, .width = 7, .height = 4, .paletteNum = 15, .baseBlock = 0x0C6 }; const struct ListMenuItem sListMenuItems_PossibleGroupMembers[] = { {gText_UR_EmptyString, 0}, {gText_UR_EmptyString, 1}, {gText_UR_EmptyString, 2}, {gText_UR_EmptyString, 3}, {gText_UR_EmptyString, 4} }; static const struct ListMenuTemplate sListMenuTemplate_PossibleGroupMembers = { .items = sListMenuItems_PossibleGroupMembers, .moveCursorFunc = NULL, .itemPrintFunc = ItemPrintFunc_PossibleGroupMembers, .totalItems = ARRAY_COUNT(sListMenuItems_PossibleGroupMembers), .maxShowed = 5, .windowId = 0, .header_X = 0, .item_X = 1, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 0, .itemVerticalPadding = 2, .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, .fontId = FONT_NORMAL, .cursorKind = 1 }; static const struct WindowTemplate sWindowTemplate_GroupList = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 3, .width = 17, .height = 10, .paletteNum = 15, .baseBlock = 0x044 }; static const struct WindowTemplate sWindowTemplate_PlayerNameAndId = { .bg = 0, .tilemapLeft = 20, .tilemapTop = 3, .width = 7, .height = 4, .paletteNum = 15, .baseBlock = 0x0EE }; static const struct ListMenuItem sListMenuItems_UnionRoomGroups[] = { {gText_UR_EmptyString, 0}, {gText_UR_EmptyString, 1}, {gText_UR_EmptyString, 2}, {gText_UR_EmptyString, 3}, {gText_UR_EmptyString, 4}, {gText_UR_EmptyString, 5}, {gText_UR_EmptyString, 6}, {gText_UR_EmptyString, 7}, {gText_UR_EmptyString, 8}, {gText_UR_EmptyString, 9}, {gText_UR_EmptyString, 10}, {gText_UR_EmptyString, 11}, {gText_UR_EmptyString, 12}, {gText_UR_EmptyString, 13}, {gText_UR_EmptyString, 14}, {gText_UR_EmptyString, 15} }; static const struct ListMenuTemplate sListMenuTemplate_UnionRoomGroups = { .items = sListMenuItems_UnionRoomGroups, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = ListMenuItemPrintFunc_UnionRoomGroups, .totalItems = ARRAY_COUNT(sListMenuItems_UnionRoomGroups), .maxShowed = 5, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 0, .itemVerticalPadding = 2, .scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct WindowTemplate sWindowTemplate_InviteToActivity = { .bg = 0, .tilemapLeft = 20, .tilemapTop = 6, .width = 8, .height = 7, .paletteNum = 15, .baseBlock = 0x001 }; static const struct ListMenuItem sListMenuItems_InviteToActivity[] = { {gText_UR_Greetings, ACTIVITY_CARD | LINK_GROUP_CAPACITY(0, 2)}, {gText_UR_Battle, ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM | LINK_GROUP_CAPACITY(0, 2)}, {gText_UR_Chat2, ACTIVITY_CHAT | IN_UNION_ROOM | LINK_GROUP_CAPACITY(0, 2)}, {gText_UR_Exit, ACTIVITY_NONE | IN_UNION_ROOM } }; static const struct ListMenuTemplate sListMenuTemplate_InviteToActivity = { .items = sListMenuItems_InviteToActivity, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, .totalItems = ARRAY_COUNT(sListMenuItems_InviteToActivity), .maxShowed = 4, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct WindowTemplate sWindowTemplate_RegisterForTrade = { .bg = 0, .tilemapLeft = 18, .tilemapTop = 8, .width = 11, .height = 5, .paletteNum = 15, .baseBlock = 0x001 }; static const struct ListMenuItem sListMenuItems_RegisterForTrade[] = { {gText_Register, 1}, {gText_UR_Info, 2}, {gText_UR_Exit, 3} }; static const struct ListMenuTemplate sListMenuTemplate_RegisterForTrade = { .items = sListMenuItems_RegisterForTrade, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, .totalItems = ARRAY_COUNT(sListMenuItems_RegisterForTrade), .maxShowed = 3, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct WindowTemplate sWindowTemplate_TypeNames = { .bg = 0, .tilemapLeft = 20, .tilemapTop = 2, .width = 9, .height = 11, .paletteNum = 15, .baseBlock = 0x001 }; static const struct ListMenuItem sListMenuItems_TypeNames[NUMBER_OF_MON_TYPES] = { { gTypeNames[TYPE_NORMAL], TYPE_NORMAL }, { gTypeNames[TYPE_FIRE], TYPE_FIRE }, { gTypeNames[TYPE_WATER], TYPE_WATER }, { gTypeNames[TYPE_ELECTRIC], TYPE_ELECTRIC }, { gTypeNames[TYPE_GRASS], TYPE_GRASS }, { gTypeNames[TYPE_ICE], TYPE_ICE }, { gTypeNames[TYPE_GROUND], TYPE_GROUND }, { gTypeNames[TYPE_ROCK], TYPE_ROCK }, { gTypeNames[TYPE_FLYING], TYPE_FLYING }, { gTypeNames[TYPE_PSYCHIC], TYPE_PSYCHIC }, { gTypeNames[TYPE_FIGHTING], TYPE_FIGHTING }, { gTypeNames[TYPE_POISON], TYPE_POISON }, { gTypeNames[TYPE_BUG], TYPE_BUG }, { gTypeNames[TYPE_GHOST], TYPE_GHOST }, { gTypeNames[TYPE_DRAGON], TYPE_DRAGON }, { gTypeNames[TYPE_STEEL], TYPE_STEEL }, { gTypeNames[TYPE_DARK], TYPE_DARK }, { gText_UR_Exit, NUMBER_OF_MON_TYPES } }; static const struct ListMenuTemplate sListMenuTemplate_TypeNames = { .items = sListMenuItems_TypeNames, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, .totalItems = NUMBER_OF_MON_TYPES, .maxShowed = 6, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 2, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct WindowTemplate sWindowTemplate_TradingBoardHeader = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 28, .height = 2, .paletteNum = 13, .baseBlock = 0x001 }; static const struct WindowTemplate sWindowTemplate_TradingBoardMain = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 5, .width = 28, .height = 10, .paletteNum = 13, .baseBlock = 0x039 }; static const struct ListMenuItem sListMenuItems_TradeBoard[] = { {gText_UR_EmptyString, -3}, {gText_UR_EmptyString, 0}, {gText_UR_EmptyString, 1}, {gText_UR_EmptyString, 2}, {gText_UR_EmptyString, 3}, {gText_UR_EmptyString, 4}, {gText_UR_EmptyString, 5}, {gText_UR_EmptyString, 6}, {gText_UR_EmptyString, 7}, {gText_UR_Exit2, 8} }; static const struct ListMenuTemplate sListMenuTemplate_TradeBoard = { .items = sListMenuItems_TradeBoard, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = TradeBoardListMenuItemPrintFunc, .totalItems = ARRAY_COUNT(sListMenuItems_TradeBoard), .maxShowed = 5, .windowId = 0, .header_X = 0, .item_X = 12, .cursor_X = 0, .upText_Y = 2, .cursorPal = 14, .fillValue = 15, .cursorShadowPal = 13, .lettersSpacing = 1, .itemVerticalPadding = 1, .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct WindowTemplate sWindowTemplate_Unused = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 5, .width = 28, .height = 10, .paletteNum = 13, .baseBlock = 0x039 }; static const struct ListMenuItem sListMenuItems_Unused[] = { {gText_UR_EmptyString, 0}, {gText_UR_EmptyString, 1}, {gText_UR_EmptyString, 2}, {gText_UR_EmptyString, 3}, {gText_UR_EmptyString, 4}, {gText_UR_EmptyString, 5}, {gText_UR_EmptyString, 6}, {gText_UR_EmptyString, 7}, {gText_UR_EmptyString, 8}, {gText_UR_EmptyString, 9}, {gText_UR_EmptyString, 10}, {gText_UR_EmptyString, 11}, {gText_UR_EmptyString, 12}, {gText_UR_EmptyString, 13}, {gText_UR_EmptyString, 14}, {gText_UR_EmptyString, 15} }; static const struct ListMenuTemplate sListMenuTemplate_Unused = { .items = sListMenuItems_Unused, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = ItemPrintFunc_Unused, .totalItems = ARRAY_COUNT(sListMenuItems_Unused), .maxShowed = 4, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 1, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct RfuPlayerData sRfuPlayerData_Dummy = {}; ALIGNED(4) static const u8 sAcceptedActivityIds_SingleBattle[] = {ACTIVITY_BATTLE_SINGLE, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_DoubleBattle[] = {ACTIVITY_BATTLE_DOUBLE, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_MultiBattle[] = {ACTIVITY_BATTLE_MULTI, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_Trade[] = {ACTIVITY_TRADE, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_PokemonJump[] = {ACTIVITY_POKEMON_JUMP, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_BerryCrush[] = {ACTIVITY_BERRY_CRUSH, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_BerryPicking[] = {ACTIVITY_BERRY_PICK, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_WonderCard[] = {ACTIVITY_WONDER_CARD, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_WonderNews[] = {ACTIVITY_WONDER_NEWS, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_Resume[] = { IN_UNION_ROOM | ACTIVITY_NONE, IN_UNION_ROOM | ACTIVITY_BATTLE_SINGLE, IN_UNION_ROOM | ACTIVITY_TRADE, IN_UNION_ROOM | ACTIVITY_CHAT, IN_UNION_ROOM | ACTIVITY_CARD, IN_UNION_ROOM | ACTIVITY_ACCEPT, IN_UNION_ROOM | ACTIVITY_DECLINE, IN_UNION_ROOM | ACTIVITY_NPCTALK, IN_UNION_ROOM | ACTIVITY_PLYRTALK, 0xFF }; ALIGNED(4) static const u8 sAcceptedActivityIds_Init[] = {ACTIVITY_SEARCH, 0xFF}; ALIGNED(4) static const u8 sAcceptedActivityIds_Unk11[] = { ACTIVITY_BATTLE_SINGLE, ACTIVITY_BATTLE_DOUBLE, ACTIVITY_BATTLE_MULTI, ACTIVITY_TRADE, ACTIVITY_POKEMON_JUMP, ACTIVITY_BERRY_CRUSH, ACTIVITY_BERRY_PICK, ACTIVITY_WONDER_CARD, ACTIVITY_WONDER_NEWS, ACTIVITY_SPIN_TRADE, 0xFF }; ALIGNED(4) static const u8 sAcceptedActivityIds_Unk12[] = { ACTIVITY_BATTLE_SINGLE, ACTIVITY_BATTLE_DOUBLE, ACTIVITY_BATTLE_MULTI, ACTIVITY_TRADE, ACTIVITY_BERRY_CRUSH, 0xFF }; static const u8 *const sAcceptedActivityIds[NUM_LINK_GROUP_TYPES] = { [LINK_GROUP_SINGLE_BATTLE] = sAcceptedActivityIds_SingleBattle, [LINK_GROUP_DOUBLE_BATTLE] = sAcceptedActivityIds_DoubleBattle, [LINK_GROUP_MULTI_BATTLE] = sAcceptedActivityIds_MultiBattle, [LINK_GROUP_TRADE] = sAcceptedActivityIds_Trade, [LINK_GROUP_POKEMON_JUMP] = sAcceptedActivityIds_PokemonJump, [LINK_GROUP_BERRY_CRUSH] = sAcceptedActivityIds_BerryCrush, [LINK_GROUP_BERRY_PICKING] = sAcceptedActivityIds_BerryPicking, [LINK_GROUP_WONDER_CARD] = sAcceptedActivityIds_WonderCard, [LINK_GROUP_WONDER_NEWS] = sAcceptedActivityIds_WonderNews, [LINK_GROUP_UNION_ROOM_RESUME] = sAcceptedActivityIds_Resume, [LINK_GROUP_UNION_ROOM_INIT] = sAcceptedActivityIds_Init, [LINK_GROUP_UNK_11] = sAcceptedActivityIds_Unk11, [LINK_GROUP_UNK_12] = sAcceptedActivityIds_Unk12, }; static const u8 sLinkGroupToURoomActivity[] = { [LINK_GROUP_SINGLE_BATTLE] = ACTIVITY_BATTLE_SINGLE, [LINK_GROUP_DOUBLE_BATTLE] = ACTIVITY_BATTLE_DOUBLE, [LINK_GROUP_MULTI_BATTLE] = ACTIVITY_BATTLE_MULTI, [LINK_GROUP_TRADE] = ACTIVITY_TRADE, [LINK_GROUP_POKEMON_JUMP] = ACTIVITY_POKEMON_JUMP, [LINK_GROUP_BERRY_CRUSH] = ACTIVITY_BERRY_CRUSH, [LINK_GROUP_BERRY_PICKING] = ACTIVITY_BERRY_PICK, [LINK_GROUP_WONDER_CARD] = ACTIVITY_WONDER_CARD, [LINK_GROUP_WONDER_NEWS] = ACTIVITY_WONDER_NEWS }; // Unused static const u8 sDotSeparatedValues[] = _("{DYNAMIC 00}·{DYNAMIC 01}"); ================================================ FILE: src/data/wild_encounters.h ================================================ #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 20 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 + 20 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 + 10 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 + 10 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 + 10 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 + 10 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 + 5 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 + 5 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 + 4 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 + 4 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_10 ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 + 1 #define ENCOUNTER_CHANCE_LAND_MONS_SLOT_11 ENCOUNTER_CHANCE_LAND_MONS_SLOT_10 + 1 #define ENCOUNTER_CHANCE_LAND_MONS_TOTAL (ENCOUNTER_CHANCE_LAND_MONS_SLOT_11) #define ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 60 #define ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 + 30 #define ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 + 5 #define ENCOUNTER_CHANCE_WATER_MONS_SLOT_3 ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 + 4 #define ENCOUNTER_CHANCE_WATER_MONS_SLOT_4 ENCOUNTER_CHANCE_WATER_MONS_SLOT_3 + 1 #define ENCOUNTER_CHANCE_WATER_MONS_TOTAL (ENCOUNTER_CHANCE_WATER_MONS_SLOT_4) #define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0 60 #define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0 + 30 #define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1 + 5 #define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_3 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2 + 4 #define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_4 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_3 + 1 #define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_TOTAL (ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_4) #define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 60 #define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 + 20 #define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4 ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 + 20 #define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_TOTAL (ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4) #define ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0 70 #define ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_1 ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0 + 30 #define ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_TOTAL (ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_1) #define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 40 #define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 + 40 #define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 + 15 #define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 + 4 #define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 + 1 #define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_TOTAL (ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9) const struct WildPokemon sSevenIslandTanobyRuinsMoneanChamber_FireRed_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsMoneanChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsMoneanChamber_FireRed_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsLiptooChamber_FireRed_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsLiptooChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsLiptooChamber_FireRed_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsWeepthChamber_FireRed_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsWeepthChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsWeepthChamber_FireRed_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsDilfordChamber_FireRed_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsDilfordChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsDilfordChamber_FireRed_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsScufibChamber_FireRed_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsScufibChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsScufibChamber_FireRed_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsRixyChamber_FireRed_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsRixyChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsRixyChamber_FireRed_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsViapoisChamber_FireRed_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsViapoisChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsViapoisChamber_FireRed_LandMons }; const struct WildPokemon sViridianForest_FireRed_LandMons[] = { { 4, 4, SPECIES_CATERPIE }, { 4, 4, SPECIES_WEEDLE }, { 5, 5, SPECIES_CATERPIE }, { 5, 5, SPECIES_WEEDLE }, { 3, 3, SPECIES_CATERPIE }, { 3, 3, SPECIES_WEEDLE }, { 5, 5, SPECIES_METAPOD }, { 5, 5, SPECIES_KAKUNA }, { 4, 4, SPECIES_KAKUNA }, { 3, 3, SPECIES_PIKACHU }, { 6, 6, SPECIES_KAKUNA }, { 5, 5, SPECIES_PIKACHU }, }; const struct WildPokemonInfo sViridianForest_FireRed_LandMonsInfo = { 14, sViridianForest_FireRed_LandMons }; const struct WildPokemon sMtMoon1F_FireRed_LandMons[] = { { 7, 7, SPECIES_ZUBAT }, { 8, 8, SPECIES_ZUBAT }, { 7, 7, SPECIES_GEODUDE }, { 9, 9, SPECIES_ZUBAT }, { 10, 10, SPECIES_ZUBAT }, { 8, 8, SPECIES_GEODUDE }, { 9, 9, SPECIES_GEODUDE }, { 8, 8, SPECIES_PARAS }, { 7, 7, SPECIES_ZUBAT }, { 7, 7, SPECIES_ZUBAT }, { 7, 7, SPECIES_ZUBAT }, { 8, 8, SPECIES_CLEFAIRY }, }; const struct WildPokemonInfo sMtMoon1F_FireRed_LandMonsInfo = { 7, sMtMoon1F_FireRed_LandMons }; const struct WildPokemon sMtMoonB1F_FireRed_LandMons[] = { { 7, 7, SPECIES_PARAS }, { 8, 8, SPECIES_PARAS }, { 5, 5, SPECIES_PARAS }, { 6, 6, SPECIES_PARAS }, { 9, 9, SPECIES_PARAS }, { 10, 10, SPECIES_PARAS }, { 7, 7, SPECIES_PARAS }, { 8, 8, SPECIES_PARAS }, { 5, 5, SPECIES_PARAS }, { 6, 6, SPECIES_PARAS }, { 9, 9, SPECIES_PARAS }, { 10, 10, SPECIES_PARAS }, }; const struct WildPokemonInfo sMtMoonB1F_FireRed_LandMonsInfo = { 5, sMtMoonB1F_FireRed_LandMons }; const struct WildPokemon sMtMoonB2F_FireRed_LandMons[] = { { 8, 8, SPECIES_ZUBAT }, { 9, 9, SPECIES_GEODUDE }, { 9, 9, SPECIES_ZUBAT }, { 10, 10, SPECIES_ZUBAT }, { 10, 10, SPECIES_GEODUDE }, { 10, 10, SPECIES_PARAS }, { 12, 12, SPECIES_PARAS }, { 10, 10, SPECIES_CLEFAIRY }, { 11, 11, SPECIES_ZUBAT }, { 11, 11, SPECIES_ZUBAT }, { 11, 11, SPECIES_ZUBAT }, { 12, 12, SPECIES_CLEFAIRY }, }; const struct WildPokemonInfo sMtMoonB2F_FireRed_LandMonsInfo = { 7, sMtMoonB2F_FireRed_LandMons }; const struct WildPokemon sSSAnneExterior_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sSSAnneExterior_FireRed_WaterMonsInfo = { 1, sSSAnneExterior_FireRed_WaterMons }; const struct WildPokemon sSSAnneExterior_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_SHELLDER }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSSAnneExterior_FireRed_FishingMonsInfo = { 10, sSSAnneExterior_FireRed_FishingMons }; const struct WildPokemon sDiglettsCaveB1F_FireRed_LandMons[] = { { 18, 18, SPECIES_DIGLETT }, { 19, 19, SPECIES_DIGLETT }, { 17, 17, SPECIES_DIGLETT }, { 15, 15, SPECIES_DIGLETT }, { 16, 16, SPECIES_DIGLETT }, { 20, 20, SPECIES_DIGLETT }, { 21, 21, SPECIES_DIGLETT }, { 22, 22, SPECIES_DIGLETT }, { 17, 17, SPECIES_DIGLETT }, { 29, 29, SPECIES_DUGTRIO }, { 17, 17, SPECIES_DIGLETT }, { 31, 31, SPECIES_DUGTRIO }, }; const struct WildPokemonInfo sDiglettsCaveB1F_FireRed_LandMonsInfo = { 5, sDiglettsCaveB1F_FireRed_LandMons }; const struct WildPokemon sVictoryRoad1F_FireRed_LandMons[] = { { 32, 32, SPECIES_MACHOP }, { 32, 32, SPECIES_GEODUDE }, { 40, 40, SPECIES_ONIX }, { 43, 43, SPECIES_ONIX }, { 46, 46, SPECIES_ONIX }, { 32, 32, SPECIES_ZUBAT }, { 44, 44, SPECIES_ARBOK }, { 44, 44, SPECIES_GOLBAT }, { 44, 44, SPECIES_MAROWAK }, { 44, 44, SPECIES_MACHOKE }, { 46, 46, SPECIES_MACHOKE }, { 46, 46, SPECIES_MAROWAK }, }; const struct WildPokemonInfo sVictoryRoad1F_FireRed_LandMonsInfo = { 7, sVictoryRoad1F_FireRed_LandMons }; const struct WildPokemon sVictoryRoad2F_FireRed_LandMons[] = { { 34, 34, SPECIES_MACHOP }, { 34, 34, SPECIES_GEODUDE }, { 42, 42, SPECIES_PRIMEAPE }, { 45, 45, SPECIES_ONIX }, { 48, 48, SPECIES_ONIX }, { 34, 34, SPECIES_ZUBAT }, { 46, 46, SPECIES_ARBOK }, { 46, 46, SPECIES_GOLBAT }, { 46, 46, SPECIES_MAROWAK }, { 46, 46, SPECIES_MACHOKE }, { 48, 48, SPECIES_MACHOKE }, { 48, 48, SPECIES_MAROWAK }, }; const struct WildPokemonInfo sVictoryRoad2F_FireRed_LandMonsInfo = { 7, sVictoryRoad2F_FireRed_LandMons }; const struct WildPokemon sVictoryRoad3F_FireRed_LandMons[] = { { 32, 32, SPECIES_MACHOP }, { 32, 32, SPECIES_GEODUDE }, { 40, 40, SPECIES_ONIX }, { 43, 43, SPECIES_ONIX }, { 46, 46, SPECIES_ONIX }, { 32, 32, SPECIES_ZUBAT }, { 44, 44, SPECIES_ARBOK }, { 44, 44, SPECIES_GOLBAT }, { 44, 44, SPECIES_MAROWAK }, { 44, 44, SPECIES_MACHOKE }, { 46, 46, SPECIES_MACHOKE }, { 46, 46, SPECIES_MAROWAK }, }; const struct WildPokemonInfo sVictoryRoad3F_FireRed_LandMonsInfo = { 7, sVictoryRoad3F_FireRed_LandMons }; const struct WildPokemon sPokemonMansion1F_FireRed_LandMons[] = { { 28, 28, SPECIES_KOFFING }, { 32, 32, SPECIES_RATICATE }, { 30, 30, SPECIES_KOFFING }, { 36, 36, SPECIES_RATICATE }, { 30, 30, SPECIES_GROWLITHE }, { 28, 28, SPECIES_RATTATA }, { 28, 28, SPECIES_GRIMER }, { 32, 32, SPECIES_WEEZING }, { 32, 32, SPECIES_GROWLITHE }, { 26, 26, SPECIES_RATTATA }, { 32, 32, SPECIES_GROWLITHE }, { 26, 26, SPECIES_RATTATA }, }; const struct WildPokemonInfo sPokemonMansion1F_FireRed_LandMonsInfo = { 7, sPokemonMansion1F_FireRed_LandMons }; const struct WildPokemon sPokemonMansion2F_FireRed_LandMons[] = { { 28, 28, SPECIES_KOFFING }, { 32, 32, SPECIES_RATICATE }, { 30, 30, SPECIES_KOFFING }, { 36, 36, SPECIES_RATICATE }, { 30, 30, SPECIES_GROWLITHE }, { 28, 28, SPECIES_RATTATA }, { 28, 28, SPECIES_GRIMER }, { 32, 32, SPECIES_WEEZING }, { 32, 32, SPECIES_GROWLITHE }, { 26, 26, SPECIES_RATTATA }, { 32, 32, SPECIES_GROWLITHE }, { 26, 26, SPECIES_RATTATA }, }; const struct WildPokemonInfo sPokemonMansion2F_FireRed_LandMonsInfo = { 7, sPokemonMansion2F_FireRed_LandMons }; const struct WildPokemon sPokemonMansion3F_FireRed_LandMons[] = { { 28, 28, SPECIES_KOFFING }, { 32, 32, SPECIES_RATICATE }, { 30, 30, SPECIES_KOFFING }, { 36, 36, SPECIES_RATICATE }, { 30, 30, SPECIES_GROWLITHE }, { 28, 28, SPECIES_RATTATA }, { 28, 28, SPECIES_GRIMER }, { 32, 32, SPECIES_WEEZING }, { 32, 32, SPECIES_GROWLITHE }, { 26, 26, SPECIES_RATTATA }, { 32, 32, SPECIES_GROWLITHE }, { 26, 26, SPECIES_RATTATA }, }; const struct WildPokemonInfo sPokemonMansion3F_FireRed_LandMonsInfo = { 7, sPokemonMansion3F_FireRed_LandMons }; const struct WildPokemon sPokemonMansionB1F_FireRed_LandMons[] = { { 28, 28, SPECIES_KOFFING }, { 34, 34, SPECIES_RATICATE }, { 30, 30, SPECIES_KOFFING }, { 30, 30, SPECIES_DITTO }, { 30, 30, SPECIES_GROWLITHE }, { 38, 38, SPECIES_RATICATE }, { 28, 28, SPECIES_GRIMER }, { 34, 34, SPECIES_WEEZING }, { 32, 32, SPECIES_GROWLITHE }, { 26, 26, SPECIES_RATTATA }, { 32, 32, SPECIES_GROWLITHE }, { 26, 26, SPECIES_RATTATA }, }; const struct WildPokemonInfo sPokemonMansionB1F_FireRed_LandMonsInfo = { 5, sPokemonMansionB1F_FireRed_LandMons }; const struct WildPokemon sSafariZoneCenter_FireRed_LandMons[] = { { 25, 25, SPECIES_RHYHORN }, { 22, 22, SPECIES_NIDORAN_M }, { 24, 24, SPECIES_EXEGGCUTE }, { 25, 25, SPECIES_EXEGGCUTE }, { 22, 22, SPECIES_VENONAT }, { 31, 31, SPECIES_NIDORINO }, { 31, 31, SPECIES_NIDORINA }, { 30, 30, SPECIES_PARASECT }, { 22, 22, SPECIES_VENONAT }, { 23, 23, SPECIES_SCYTHER }, { 22, 22, SPECIES_VENONAT }, { 23, 23, SPECIES_CHANSEY }, }; const struct WildPokemonInfo sSafariZoneCenter_FireRed_LandMonsInfo = { 21, sSafariZoneCenter_FireRed_LandMons }; const struct WildPokemon sSafariZoneCenter_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSafariZoneCenter_FireRed_WaterMonsInfo = { 2, sSafariZoneCenter_FireRed_WaterMons }; const struct WildPokemon sSafariZoneCenter_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_DRATINI }, { 15, 35, SPECIES_PSYDUCK }, { 25, 35, SPECIES_DRAGONAIR }, }; const struct WildPokemonInfo sSafariZoneCenter_FireRed_FishingMonsInfo = { 20, sSafariZoneCenter_FireRed_FishingMons }; const struct WildPokemon sSafariZoneEast_FireRed_LandMons[] = { { 24, 24, SPECIES_NIDORAN_M }, { 26, 26, SPECIES_DODUO }, { 23, 23, SPECIES_EXEGGCUTE }, { 25, 25, SPECIES_EXEGGCUTE }, { 22, 22, SPECIES_PARAS }, { 33, 33, SPECIES_NIDORINO }, { 24, 24, SPECIES_NIDORAN_F }, { 25, 25, SPECIES_PARASECT }, { 22, 22, SPECIES_PARAS }, { 25, 25, SPECIES_KANGASKHAN }, { 22, 22, SPECIES_PARAS }, { 28, 28, SPECIES_SCYTHER }, }; const struct WildPokemonInfo sSafariZoneEast_FireRed_LandMonsInfo = { 21, sSafariZoneEast_FireRed_LandMons }; const struct WildPokemon sSafariZoneEast_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSafariZoneEast_FireRed_WaterMonsInfo = { 2, sSafariZoneEast_FireRed_WaterMons }; const struct WildPokemon sSafariZoneEast_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_DRATINI }, { 15, 35, SPECIES_PSYDUCK }, { 25, 35, SPECIES_DRAGONAIR }, }; const struct WildPokemonInfo sSafariZoneEast_FireRed_FishingMonsInfo = { 20, sSafariZoneEast_FireRed_FishingMons }; const struct WildPokemon sSafariZoneNorth_FireRed_LandMons[] = { { 26, 26, SPECIES_RHYHORN }, { 30, 30, SPECIES_NIDORAN_M }, { 25, 25, SPECIES_EXEGGCUTE }, { 27, 27, SPECIES_EXEGGCUTE }, { 23, 23, SPECIES_PARAS }, { 30, 30, SPECIES_NIDORINO }, { 30, 30, SPECIES_NIDORINA }, { 32, 32, SPECIES_VENOMOTH }, { 23, 23, SPECIES_PARAS }, { 26, 26, SPECIES_CHANSEY }, { 23, 23, SPECIES_PARAS }, { 28, 28, SPECIES_TAUROS }, }; const struct WildPokemonInfo sSafariZoneNorth_FireRed_LandMonsInfo = { 21, sSafariZoneNorth_FireRed_LandMons }; const struct WildPokemon sSafariZoneNorth_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSafariZoneNorth_FireRed_WaterMonsInfo = { 2, sSafariZoneNorth_FireRed_WaterMons }; const struct WildPokemon sSafariZoneNorth_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_DRATINI }, { 15, 35, SPECIES_PSYDUCK }, { 25, 35, SPECIES_DRAGONAIR }, }; const struct WildPokemonInfo sSafariZoneNorth_FireRed_FishingMonsInfo = { 20, sSafariZoneNorth_FireRed_FishingMons }; const struct WildPokemon sSafariZoneWest_FireRed_LandMons[] = { { 26, 26, SPECIES_DODUO }, { 22, 22, SPECIES_NIDORAN_M }, { 25, 25, SPECIES_EXEGGCUTE }, { 27, 27, SPECIES_EXEGGCUTE }, { 23, 23, SPECIES_VENONAT }, { 30, 30, SPECIES_NIDORINO }, { 30, 30, SPECIES_NIDORAN_F }, { 32, 32, SPECIES_VENOMOTH }, { 23, 23, SPECIES_VENONAT }, { 25, 25, SPECIES_TAUROS }, { 23, 23, SPECIES_VENONAT }, { 28, 28, SPECIES_KANGASKHAN }, }; const struct WildPokemonInfo sSafariZoneWest_FireRed_LandMonsInfo = { 21, sSafariZoneWest_FireRed_LandMons }; const struct WildPokemon sSafariZoneWest_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSafariZoneWest_FireRed_WaterMonsInfo = { 2, sSafariZoneWest_FireRed_WaterMons }; const struct WildPokemon sSafariZoneWest_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_DRATINI }, { 15, 35, SPECIES_PSYDUCK }, { 25, 35, SPECIES_DRAGONAIR }, }; const struct WildPokemonInfo sSafariZoneWest_FireRed_FishingMonsInfo = { 20, sSafariZoneWest_FireRed_FishingMons }; const struct WildPokemon sCeruleanCave1F_FireRed_LandMons[] = { { 49, 49, SPECIES_MAGNETON }, { 49, 49, SPECIES_PARASECT }, { 46, 46, SPECIES_GOLBAT }, { 46, 46, SPECIES_MACHOKE }, { 52, 52, SPECIES_PRIMEAPE }, { 52, 52, SPECIES_DITTO }, { 58, 58, SPECIES_ELECTRODE }, { 58, 58, SPECIES_PARASECT }, { 55, 55, SPECIES_GOLBAT }, { 55, 55, SPECIES_WOBBUFFET }, { 61, 61, SPECIES_PRIMEAPE }, { 61, 61, SPECIES_DITTO }, }; const struct WildPokemonInfo sCeruleanCave1F_FireRed_LandMonsInfo = { 7, sCeruleanCave1F_FireRed_LandMons }; const struct WildPokemon sCeruleanCave1F_FireRed_WaterMons[] = { { 30, 40, SPECIES_PSYDUCK }, { 40, 50, SPECIES_GOLDUCK }, { 45, 55, SPECIES_GOLDUCK }, { 40, 50, SPECIES_PSYDUCK }, { 40, 50, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sCeruleanCave1F_FireRed_WaterMonsInfo = { 2, sCeruleanCave1F_FireRed_WaterMons }; const struct WildPokemon sCeruleanCave1F_FireRed_RockSmashMons[] = { { 30, 40, SPECIES_GEODUDE }, { 40, 50, SPECIES_GRAVELER }, { 45, 55, SPECIES_GRAVELER }, { 40, 50, SPECIES_GEODUDE }, { 40, 50, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sCeruleanCave1F_FireRed_RockSmashMonsInfo = { 50, sCeruleanCave1F_FireRed_RockSmashMons }; const struct WildPokemon sCeruleanCave1F_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sCeruleanCave1F_FireRed_FishingMonsInfo = { 20, sCeruleanCave1F_FireRed_FishingMons }; const struct WildPokemon sCeruleanCave2F_FireRed_LandMons[] = { { 49, 49, SPECIES_GOLBAT }, { 49, 49, SPECIES_MACHOKE }, { 52, 52, SPECIES_MAGNETON }, { 52, 52, SPECIES_PARASECT }, { 55, 55, SPECIES_KADABRA }, { 55, 55, SPECIES_DITTO }, { 58, 58, SPECIES_GOLBAT }, { 58, 58, SPECIES_WOBBUFFET }, { 61, 61, SPECIES_ELECTRODE }, { 61, 61, SPECIES_PARASECT }, { 64, 64, SPECIES_KADABRA }, { 64, 64, SPECIES_DITTO }, }; const struct WildPokemonInfo sCeruleanCave2F_FireRed_LandMonsInfo = { 7, sCeruleanCave2F_FireRed_LandMons }; const struct WildPokemon sCeruleanCave2F_FireRed_RockSmashMons[] = { { 35, 45, SPECIES_GEODUDE }, { 45, 55, SPECIES_GRAVELER }, { 50, 60, SPECIES_GRAVELER }, { 45, 55, SPECIES_GEODUDE }, { 45, 55, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sCeruleanCave2F_FireRed_RockSmashMonsInfo = { 50, sCeruleanCave2F_FireRed_RockSmashMons }; const struct WildPokemon sCeruleanCaveB1F_FireRed_LandMons[] = { { 58, 58, SPECIES_KADABRA }, { 58, 58, SPECIES_DITTO }, { 55, 55, SPECIES_MAGNETON }, { 55, 55, SPECIES_PARASECT }, { 52, 52, SPECIES_GOLBAT }, { 52, 52, SPECIES_MACHOKE }, { 67, 67, SPECIES_KADABRA }, { 67, 67, SPECIES_DITTO }, { 64, 64, SPECIES_ELECTRODE }, { 64, 64, SPECIES_PARASECT }, { 61, 61, SPECIES_GOLBAT }, { 61, 61, SPECIES_WOBBUFFET }, }; const struct WildPokemonInfo sCeruleanCaveB1F_FireRed_LandMonsInfo = { 7, sCeruleanCaveB1F_FireRed_LandMons }; const struct WildPokemon sCeruleanCaveB1F_FireRed_WaterMons[] = { { 40, 50, SPECIES_PSYDUCK }, { 50, 60, SPECIES_GOLDUCK }, { 55, 65, SPECIES_GOLDUCK }, { 50, 60, SPECIES_PSYDUCK }, { 50, 60, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sCeruleanCaveB1F_FireRed_WaterMonsInfo = { 2, sCeruleanCaveB1F_FireRed_WaterMons }; const struct WildPokemon sCeruleanCaveB1F_FireRed_RockSmashMons[] = { { 40, 50, SPECIES_GEODUDE }, { 50, 60, SPECIES_GRAVELER }, { 55, 65, SPECIES_GRAVELER }, { 50, 60, SPECIES_GEODUDE }, { 50, 60, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sCeruleanCaveB1F_FireRed_RockSmashMonsInfo = { 50, sCeruleanCaveB1F_FireRed_RockSmashMons }; const struct WildPokemon sCeruleanCaveB1F_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_GYARADOS }, }; const struct WildPokemonInfo sCeruleanCaveB1F_FireRed_FishingMonsInfo = { 20, sCeruleanCaveB1F_FireRed_FishingMons }; const struct WildPokemon sRockTunnel1F_FireRed_LandMons[] = { { 15, 15, SPECIES_ZUBAT }, { 16, 16, SPECIES_GEODUDE }, { 16, 16, SPECIES_MANKEY }, { 17, 17, SPECIES_GEODUDE }, { 16, 16, SPECIES_ZUBAT }, { 16, 16, SPECIES_MACHOP }, { 17, 17, SPECIES_MANKEY }, { 17, 17, SPECIES_MACHOP }, { 15, 15, SPECIES_GEODUDE }, { 13, 13, SPECIES_ONIX }, { 15, 15, SPECIES_GEODUDE }, { 15, 15, SPECIES_ONIX }, }; const struct WildPokemonInfo sRockTunnel1F_FireRed_LandMonsInfo = { 7, sRockTunnel1F_FireRed_LandMons }; const struct WildPokemon sRockTunnelB1F_FireRed_LandMons[] = { { 16, 16, SPECIES_ZUBAT }, { 17, 17, SPECIES_GEODUDE }, { 17, 17, SPECIES_MANKEY }, { 16, 16, SPECIES_GEODUDE }, { 15, 15, SPECIES_ZUBAT }, { 17, 17, SPECIES_MACHOP }, { 16, 16, SPECIES_MANKEY }, { 13, 13, SPECIES_ONIX }, { 15, 15, SPECIES_GEODUDE }, { 15, 15, SPECIES_ONIX }, { 15, 15, SPECIES_GEODUDE }, { 17, 17, SPECIES_ONIX }, }; const struct WildPokemonInfo sRockTunnelB1F_FireRed_LandMonsInfo = { 7, sRockTunnelB1F_FireRed_LandMons }; const struct WildPokemon sRockTunnelB1F_FireRed_RockSmashMons[] = { { 5, 20, SPECIES_GEODUDE }, { 10, 20, SPECIES_GEODUDE }, { 15, 30, SPECIES_GEODUDE }, { 25, 40, SPECIES_GRAVELER }, { 30, 40, SPECIES_GRAVELER }, }; const struct WildPokemonInfo sRockTunnelB1F_FireRed_RockSmashMonsInfo = { 50, sRockTunnelB1F_FireRed_RockSmashMons }; const struct WildPokemon sSeafoamIslands1F_FireRed_LandMons[] = { { 27, 27, SPECIES_PSYDUCK }, { 29, 29, SPECIES_PSYDUCK }, { 31, 31, SPECIES_PSYDUCK }, { 22, 22, SPECIES_ZUBAT }, { 22, 22, SPECIES_ZUBAT }, { 24, 24, SPECIES_ZUBAT }, { 26, 26, SPECIES_GOLBAT }, { 28, 28, SPECIES_GOLBAT }, { 33, 33, SPECIES_PSYDUCK }, { 26, 26, SPECIES_ZUBAT }, { 26, 26, SPECIES_PSYDUCK }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslands1F_FireRed_LandMonsInfo = { 7, sSeafoamIslands1F_FireRed_LandMons }; const struct WildPokemon sSeafoamIslandsB1F_FireRed_LandMons[] = { { 29, 29, SPECIES_PSYDUCK }, { 31, 31, SPECIES_PSYDUCK }, { 28, 28, SPECIES_SEEL }, { 22, 22, SPECIES_ZUBAT }, { 22, 22, SPECIES_ZUBAT }, { 24, 24, SPECIES_ZUBAT }, { 26, 26, SPECIES_GOLBAT }, { 28, 28, SPECIES_GOLBAT }, { 33, 33, SPECIES_GOLDUCK }, { 26, 26, SPECIES_ZUBAT }, { 35, 35, SPECIES_GOLDUCK }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslandsB1F_FireRed_LandMonsInfo = { 7, sSeafoamIslandsB1F_FireRed_LandMons }; const struct WildPokemon sSeafoamIslandsB2F_FireRed_LandMons[] = { { 30, 30, SPECIES_PSYDUCK }, { 32, 32, SPECIES_PSYDUCK }, { 30, 30, SPECIES_SEEL }, { 32, 32, SPECIES_SEEL }, { 22, 22, SPECIES_ZUBAT }, { 24, 24, SPECIES_ZUBAT }, { 26, 26, SPECIES_GOLBAT }, { 34, 34, SPECIES_GOLDUCK }, { 32, 32, SPECIES_GOLDUCK }, { 28, 28, SPECIES_GOLBAT }, { 32, 32, SPECIES_GOLDUCK }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslandsB2F_FireRed_LandMonsInfo = { 7, sSeafoamIslandsB2F_FireRed_LandMons }; const struct WildPokemon sSeafoamIslandsB3F_FireRed_LandMons[] = { { 30, 30, SPECIES_SEEL }, { 32, 32, SPECIES_SEEL }, { 32, 32, SPECIES_PSYDUCK }, { 30, 30, SPECIES_PSYDUCK }, { 32, 32, SPECIES_GOLDUCK }, { 24, 24, SPECIES_ZUBAT }, { 26, 26, SPECIES_GOLBAT }, { 34, 34, SPECIES_GOLDUCK }, { 32, 32, SPECIES_DEWGONG }, { 28, 28, SPECIES_GOLBAT }, { 34, 34, SPECIES_DEWGONG }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslandsB3F_FireRed_LandMonsInfo = { 7, sSeafoamIslandsB3F_FireRed_LandMons }; const struct WildPokemon sSeafoamIslandsB3F_FireRed_WaterMons[] = { { 25, 35, SPECIES_SEEL }, { 25, 30, SPECIES_HORSEA }, { 35, 40, SPECIES_DEWGONG }, { 30, 40, SPECIES_PSYDUCK }, { 35, 40, SPECIES_GOLDUCK }, }; const struct WildPokemonInfo sSeafoamIslandsB3F_FireRed_WaterMonsInfo = { 2, sSeafoamIslandsB3F_FireRed_WaterMons }; const struct WildPokemon sSeafoamIslandsB3F_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 20, 30, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_GYARADOS }, }; const struct WildPokemonInfo sSeafoamIslandsB3F_FireRed_FishingMonsInfo = { 20, sSeafoamIslandsB3F_FireRed_FishingMons }; const struct WildPokemon sSeafoamIslandsB4F_FireRed_LandMons[] = { { 30, 30, SPECIES_SEEL }, { 32, 32, SPECIES_SEEL }, { 32, 32, SPECIES_PSYDUCK }, { 34, 34, SPECIES_SEEL }, { 32, 32, SPECIES_GOLDUCK }, { 26, 26, SPECIES_GOLBAT }, { 34, 34, SPECIES_DEWGONG }, { 34, 34, SPECIES_GOLDUCK }, { 36, 36, SPECIES_DEWGONG }, { 28, 28, SPECIES_GOLBAT }, { 36, 36, SPECIES_DEWGONG }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslandsB4F_FireRed_LandMonsInfo = { 7, sSeafoamIslandsB4F_FireRed_LandMons }; const struct WildPokemon sSeafoamIslandsB4F_FireRed_WaterMons[] = { { 25, 35, SPECIES_SEEL }, { 25, 30, SPECIES_HORSEA }, { 35, 40, SPECIES_DEWGONG }, { 30, 40, SPECIES_PSYDUCK }, { 35, 40, SPECIES_GOLDUCK }, }; const struct WildPokemonInfo sSeafoamIslandsB4F_FireRed_WaterMonsInfo = { 2, sSeafoamIslandsB4F_FireRed_WaterMons }; const struct WildPokemon sSeafoamIslandsB4F_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 20, 30, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_GYARADOS }, }; const struct WildPokemonInfo sSeafoamIslandsB4F_FireRed_FishingMonsInfo = { 20, sSeafoamIslandsB4F_FireRed_FishingMons }; const struct WildPokemon sPokemonTower3F_FireRed_LandMons[] = { { 15, 15, SPECIES_GASTLY }, { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 13, 13, SPECIES_GASTLY }, { 14, 14, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, { 15, 15, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 17, 17, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 20, 20, SPECIES_HAUNTER }, }; const struct WildPokemonInfo sPokemonTower3F_FireRed_LandMonsInfo = { 2, sPokemonTower3F_FireRed_LandMons }; const struct WildPokemon sPokemonTower4F_FireRed_LandMons[] = { { 15, 15, SPECIES_GASTLY }, { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 13, 13, SPECIES_GASTLY }, { 14, 14, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 20, 20, SPECIES_HAUNTER }, { 15, 15, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 17, 17, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, }; const struct WildPokemonInfo sPokemonTower4F_FireRed_LandMonsInfo = { 4, sPokemonTower4F_FireRed_LandMons }; const struct WildPokemon sPokemonTower5F_FireRed_LandMons[] = { { 15, 15, SPECIES_GASTLY }, { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 13, 13, SPECIES_GASTLY }, { 14, 14, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 20, 20, SPECIES_HAUNTER }, { 15, 15, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 17, 17, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, }; const struct WildPokemonInfo sPokemonTower5F_FireRed_LandMonsInfo = { 6, sPokemonTower5F_FireRed_LandMons }; const struct WildPokemon sPokemonTower6F_FireRed_LandMons[] = { { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 14, 14, SPECIES_GASTLY }, { 15, 15, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, { 21, 21, SPECIES_HAUNTER }, { 17, 17, SPECIES_CUBONE }, { 18, 18, SPECIES_GASTLY }, { 19, 19, SPECIES_CUBONE }, { 18, 18, SPECIES_GASTLY }, { 23, 23, SPECIES_HAUNTER }, }; const struct WildPokemonInfo sPokemonTower6F_FireRed_LandMonsInfo = { 8, sPokemonTower6F_FireRed_LandMons }; const struct WildPokemon sPokemonTower7F_FireRed_LandMons[] = { { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 15, 15, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, { 23, 23, SPECIES_HAUNTER }, { 17, 17, SPECIES_CUBONE }, { 19, 19, SPECIES_CUBONE }, { 18, 18, SPECIES_GASTLY }, { 23, 23, SPECIES_HAUNTER }, { 18, 18, SPECIES_GASTLY }, { 25, 25, SPECIES_HAUNTER }, }; const struct WildPokemonInfo sPokemonTower7F_FireRed_LandMonsInfo = { 10, sPokemonTower7F_FireRed_LandMons }; const struct WildPokemon sPowerPlant_FireRed_LandMons[] = { { 22, 22, SPECIES_VOLTORB }, { 22, 22, SPECIES_MAGNEMITE }, { 25, 25, SPECIES_VOLTORB }, { 25, 25, SPECIES_MAGNEMITE }, { 22, 22, SPECIES_PIKACHU }, { 24, 24, SPECIES_PIKACHU }, { 31, 31, SPECIES_MAGNETON }, { 34, 34, SPECIES_MAGNETON }, { 26, 26, SPECIES_PIKACHU }, { 32, 32, SPECIES_ELECTABUZZ }, { 26, 26, SPECIES_PIKACHU }, { 35, 35, SPECIES_ELECTABUZZ }, }; const struct WildPokemonInfo sPowerPlant_FireRed_LandMonsInfo = { 7, sPowerPlant_FireRed_LandMons }; const struct WildPokemon sMtEmberExterior_FireRed_LandMons[] = { { 30, 30, SPECIES_PONYTA }, { 38, 38, SPECIES_FEAROW }, { 33, 33, SPECIES_PONYTA }, { 32, 32, SPECIES_SPEAROW }, { 35, 35, SPECIES_MACHOP }, { 33, 33, SPECIES_GEODUDE }, { 36, 36, SPECIES_PONYTA }, { 40, 40, SPECIES_FEAROW }, { 30, 30, SPECIES_SPEAROW }, { 39, 39, SPECIES_RAPIDASH }, { 30, 30, SPECIES_SPEAROW }, { 42, 42, SPECIES_RAPIDASH }, }; const struct WildPokemonInfo sMtEmberExterior_FireRed_LandMonsInfo = { 21, sMtEmberExterior_FireRed_LandMons }; const struct WildPokemon sMtEmberExterior_FireRed_RockSmashMons[] = { { 5, 20, SPECIES_GEODUDE }, { 10, 20, SPECIES_GEODUDE }, { 15, 30, SPECIES_GEODUDE }, { 25, 40, SPECIES_GRAVELER }, { 30, 40, SPECIES_GRAVELER }, }; const struct WildPokemonInfo sMtEmberExterior_FireRed_RockSmashMonsInfo = { 50, sMtEmberExterior_FireRed_RockSmashMons }; const struct WildPokemon sMtEmberSummitPath1F_FireRed_LandMons[] = { { 33, 33, SPECIES_GEODUDE }, { 35, 35, SPECIES_MACHOP }, { 29, 29, SPECIES_GEODUDE }, { 31, 31, SPECIES_GEODUDE }, { 31, 31, SPECIES_MACHOP }, { 33, 33, SPECIES_MACHOP }, { 35, 35, SPECIES_GEODUDE }, { 37, 37, SPECIES_MACHOP }, { 37, 37, SPECIES_GEODUDE }, { 39, 39, SPECIES_MACHOP }, { 37, 37, SPECIES_GEODUDE }, { 39, 39, SPECIES_MACHOP }, }; const struct WildPokemonInfo sMtEmberSummitPath1F_FireRed_LandMonsInfo = { 7, sMtEmberSummitPath1F_FireRed_LandMons }; const struct WildPokemon sMtEmberSummitPath2F_FireRed_LandMons[] = { { 34, 34, SPECIES_GEODUDE }, { 36, 36, SPECIES_MACHOP }, { 30, 30, SPECIES_GEODUDE }, { 32, 32, SPECIES_GEODUDE }, { 32, 32, SPECIES_MACHOP }, { 34, 34, SPECIES_MACHOP }, { 38, 38, SPECIES_MACHOKE }, { 38, 38, SPECIES_MACHOKE }, { 40, 40, SPECIES_MACHOKE }, { 40, 40, SPECIES_MACHOKE }, { 40, 40, SPECIES_MACHOKE }, { 40, 40, SPECIES_MACHOKE }, }; const struct WildPokemonInfo sMtEmberSummitPath2F_FireRed_LandMonsInfo = { 7, sMtEmberSummitPath2F_FireRed_LandMons }; const struct WildPokemon sMtEmberSummitPath2F_FireRed_RockSmashMons[] = { { 5, 20, SPECIES_GEODUDE }, { 10, 20, SPECIES_GEODUDE }, { 15, 30, SPECIES_GEODUDE }, { 25, 40, SPECIES_GRAVELER }, { 30, 40, SPECIES_GRAVELER }, }; const struct WildPokemonInfo sMtEmberSummitPath2F_FireRed_RockSmashMonsInfo = { 50, sMtEmberSummitPath2F_FireRed_RockSmashMons }; const struct WildPokemon sMtEmberSummitPath3F_FireRed_LandMons[] = { { 33, 33, SPECIES_GEODUDE }, { 35, 35, SPECIES_MACHOP }, { 29, 29, SPECIES_GEODUDE }, { 31, 31, SPECIES_GEODUDE }, { 31, 31, SPECIES_MACHOP }, { 33, 33, SPECIES_MACHOP }, { 35, 35, SPECIES_GEODUDE }, { 37, 37, SPECIES_MACHOP }, { 37, 37, SPECIES_GEODUDE }, { 39, 39, SPECIES_MACHOP }, { 37, 37, SPECIES_GEODUDE }, { 39, 39, SPECIES_MACHOP }, }; const struct WildPokemonInfo sMtEmberSummitPath3F_FireRed_LandMonsInfo = { 7, sMtEmberSummitPath3F_FireRed_LandMons }; const struct WildPokemon sMtEmberRubyPath1F_FireRed_LandMons[] = { { 36, 36, SPECIES_GEODUDE }, { 38, 38, SPECIES_MACHOP }, { 32, 32, SPECIES_GEODUDE }, { 34, 34, SPECIES_GEODUDE }, { 34, 34, SPECIES_MACHOP }, { 36, 36, SPECIES_MACHOP }, { 38, 38, SPECIES_GEODUDE }, { 40, 40, SPECIES_MACHOKE }, { 40, 40, SPECIES_GEODUDE }, { 42, 42, SPECIES_MACHOKE }, { 40, 40, SPECIES_GEODUDE }, { 42, 42, SPECIES_MACHOKE }, }; const struct WildPokemonInfo sMtEmberRubyPath1F_FireRed_LandMonsInfo = { 7, sMtEmberRubyPath1F_FireRed_LandMons }; const struct WildPokemon sMtEmberRubyPath1F_FireRed_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPath1F_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPath1F_FireRed_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB1F_FireRed_LandMons[] = { { 38, 38, SPECIES_GEODUDE }, { 36, 36, SPECIES_GEODUDE }, { 34, 34, SPECIES_GEODUDE }, { 40, 40, SPECIES_GEODUDE }, { 24, 24, SPECIES_SLUGMA }, { 26, 26, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 28, 28, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 30, 30, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 30, 30, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB1F_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB1F_FireRed_LandMons }; const struct WildPokemon sMtEmberRubyPathB1F_FireRed_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPathB1F_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB1F_FireRed_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB2F_FireRed_LandMons[] = { { 40, 40, SPECIES_GEODUDE }, { 26, 26, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 24, 24, SPECIES_SLUGMA }, { 28, 28, SPECIES_SLUGMA }, { 30, 30, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 32, 32, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 22, 22, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 22, 22, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB2F_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB2F_FireRed_LandMons }; const struct WildPokemon sMtEmberRubyPathB2F_FireRed_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPathB2F_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB2F_FireRed_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB3F_FireRed_LandMons[] = { { 26, 26, SPECIES_SLUGMA }, { 28, 28, SPECIES_SLUGMA }, { 30, 30, SPECIES_SLUGMA }, { 32, 32, SPECIES_SLUGMA }, { 24, 24, SPECIES_SLUGMA }, { 22, 22, SPECIES_SLUGMA }, { 20, 20, SPECIES_SLUGMA }, { 34, 34, SPECIES_SLUGMA }, { 36, 36, SPECIES_SLUGMA }, { 18, 18, SPECIES_SLUGMA }, { 36, 36, SPECIES_SLUGMA }, { 18, 18, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB3F_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB3F_FireRed_LandMons }; const struct WildPokemon sMtEmberRubyPathB3F_FireRed_RockSmashMons[] = { { 15, 25, SPECIES_SLUGMA }, { 25, 35, SPECIES_SLUGMA }, { 40, 45, SPECIES_MAGCARGO }, { 35, 45, SPECIES_MAGCARGO }, { 25, 35, SPECIES_MAGCARGO }, }; const struct WildPokemonInfo sMtEmberRubyPathB3F_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB3F_FireRed_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB1FStairs_FireRed_LandMons[] = { { 40, 40, SPECIES_GEODUDE }, { 26, 26, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 24, 24, SPECIES_SLUGMA }, { 28, 28, SPECIES_SLUGMA }, { 30, 30, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 32, 32, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 22, 22, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 22, 22, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB1FStairs_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB1FStairs_FireRed_LandMons }; const struct WildPokemon sMtEmberRubyPathB1FStairs_FireRed_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPathB1FStairs_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB1FStairs_FireRed_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB2FStairs_FireRed_LandMons[] = { { 38, 38, SPECIES_GEODUDE }, { 36, 36, SPECIES_GEODUDE }, { 34, 34, SPECIES_GEODUDE }, { 40, 40, SPECIES_GEODUDE }, { 24, 24, SPECIES_SLUGMA }, { 26, 26, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 28, 28, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 30, 30, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 30, 30, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB2FStairs_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB2FStairs_FireRed_LandMons }; const struct WildPokemon sMtEmberRubyPathB2FStairs_FireRed_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPathB2FStairs_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB2FStairs_FireRed_RockSmashMons }; const struct WildPokemon sThreeIslandBerryForest_FireRed_LandMons[] = { { 37, 37, SPECIES_PIDGEOTTO }, { 35, 35, SPECIES_GLOOM }, { 32, 32, SPECIES_PIDGEY }, { 30, 30, SPECIES_ODDISH }, { 34, 34, SPECIES_VENONAT }, { 34, 34, SPECIES_DROWZEE }, { 35, 35, SPECIES_EXEGGCUTE }, { 31, 31, SPECIES_PSYDUCK }, { 37, 37, SPECIES_VENOMOTH }, { 37, 37, SPECIES_HYPNO }, { 40, 40, SPECIES_VENOMOTH }, { 40, 40, SPECIES_HYPNO }, }; const struct WildPokemonInfo sThreeIslandBerryForest_FireRed_LandMonsInfo = { 21, sThreeIslandBerryForest_FireRed_LandMons }; const struct WildPokemon sThreeIslandBerryForest_FireRed_WaterMons[] = { { 5, 20, SPECIES_PSYDUCK }, { 20, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, { 35, 40, SPECIES_GOLDUCK }, { 35, 40, SPECIES_GOLDUCK }, }; const struct WildPokemonInfo sThreeIslandBerryForest_FireRed_WaterMonsInfo = { 2, sThreeIslandBerryForest_FireRed_WaterMons }; const struct WildPokemon sThreeIslandBerryForest_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sThreeIslandBerryForest_FireRed_FishingMonsInfo = { 20, sThreeIslandBerryForest_FireRed_FishingMons }; const struct WildPokemon sFourIslandIcefallCaveEntrance_FireRed_LandMons[] = { { 43, 43, SPECIES_SEEL }, { 45, 45, SPECIES_GOLBAT }, { 45, 45, SPECIES_SEEL }, { 47, 47, SPECIES_SEEL }, { 40, 40, SPECIES_ZUBAT }, { 49, 49, SPECIES_DEWGONG }, { 51, 51, SPECIES_DEWGONG }, { 41, 41, SPECIES_PSYDUCK }, { 48, 48, SPECIES_GOLBAT }, { 53, 53, SPECIES_DEWGONG }, { 48, 48, SPECIES_GOLBAT }, { 53, 53, SPECIES_DEWGONG }, }; const struct WildPokemonInfo sFourIslandIcefallCaveEntrance_FireRed_LandMonsInfo = { 7, sFourIslandIcefallCaveEntrance_FireRed_LandMons }; const struct WildPokemon sFourIslandIcefallCaveEntrance_FireRed_WaterMons[] = { { 5, 35, SPECIES_SEEL }, { 5, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_DEWGONG }, { 5, 15, SPECIES_WOOPER }, { 5, 15, SPECIES_WOOPER }, }; const struct WildPokemonInfo sFourIslandIcefallCaveEntrance_FireRed_WaterMonsInfo = { 2, sFourIslandIcefallCaveEntrance_FireRed_WaterMons }; const struct WildPokemon sFourIslandIcefallCaveEntrance_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFourIslandIcefallCaveEntrance_FireRed_FishingMonsInfo = { 20, sFourIslandIcefallCaveEntrance_FireRed_FishingMons }; const struct WildPokemon sFourIslandIcefallCave1F_FireRed_LandMons[] = { { 25, 25, SPECIES_SWINUB }, { 45, 45, SPECIES_GOLBAT }, { 45, 45, SPECIES_SEEL }, { 27, 27, SPECIES_SWINUB }, { 40, 40, SPECIES_ZUBAT }, { 29, 29, SPECIES_SWINUB }, { 30, 30, SPECIES_DELIBIRD }, { 31, 31, SPECIES_SWINUB }, { 48, 48, SPECIES_GOLBAT }, { 23, 23, SPECIES_SWINUB }, { 48, 48, SPECIES_GOLBAT }, { 23, 23, SPECIES_SWINUB }, }; const struct WildPokemonInfo sFourIslandIcefallCave1F_FireRed_LandMonsInfo = { 7, sFourIslandIcefallCave1F_FireRed_LandMons }; const struct WildPokemon sFourIslandIcefallCaveB1F_FireRed_LandMons[] = { { 25, 25, SPECIES_SWINUB }, { 45, 45, SPECIES_GOLBAT }, { 45, 45, SPECIES_SEEL }, { 27, 27, SPECIES_SWINUB }, { 40, 40, SPECIES_ZUBAT }, { 29, 29, SPECIES_SWINUB }, { 30, 30, SPECIES_DELIBIRD }, { 31, 31, SPECIES_SWINUB }, { 48, 48, SPECIES_GOLBAT }, { 23, 23, SPECIES_SWINUB }, { 48, 48, SPECIES_GOLBAT }, { 23, 23, SPECIES_SWINUB }, }; const struct WildPokemonInfo sFourIslandIcefallCaveB1F_FireRed_LandMonsInfo = { 7, sFourIslandIcefallCaveB1F_FireRed_LandMons }; const struct WildPokemon sFourIslandIcefallCaveBack_FireRed_LandMons[] = { { 43, 43, SPECIES_SEEL }, { 45, 45, SPECIES_GOLBAT }, { 45, 45, SPECIES_SEEL }, { 47, 47, SPECIES_SEEL }, { 40, 40, SPECIES_ZUBAT }, { 49, 49, SPECIES_DEWGONG }, { 51, 51, SPECIES_DEWGONG }, { 41, 41, SPECIES_PSYDUCK }, { 48, 48, SPECIES_GOLBAT }, { 53, 53, SPECIES_DEWGONG }, { 48, 48, SPECIES_GOLBAT }, { 53, 53, SPECIES_DEWGONG }, }; const struct WildPokemonInfo sFourIslandIcefallCaveBack_FireRed_LandMonsInfo = { 7, sFourIslandIcefallCaveBack_FireRed_LandMons }; const struct WildPokemon sFourIslandIcefallCaveBack_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 45, SPECIES_TENTACOOL }, { 35, 45, SPECIES_TENTACRUEL }, { 30, 45, SPECIES_LAPRAS }, }; const struct WildPokemonInfo sFourIslandIcefallCaveBack_FireRed_WaterMonsInfo = { 2, sFourIslandIcefallCaveBack_FireRed_WaterMons }; const struct WildPokemon sFourIslandIcefallCaveBack_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_SHELLDER }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFourIslandIcefallCaveBack_FireRed_FishingMonsInfo = { 20, sFourIslandIcefallCaveBack_FireRed_FishingMons }; const struct WildPokemon sSixIslandPatternBush_FireRed_LandMons[] = { { 9, 9, SPECIES_SPINARAK }, { 9, 9, SPECIES_KAKUNA }, { 14, 14, SPECIES_SPINARAK }, { 6, 6, SPECIES_CATERPIE }, { 6, 6, SPECIES_WEEDLE }, { 15, 15, SPECIES_HERACROSS }, { 9, 9, SPECIES_METAPOD }, { 20, 20, SPECIES_HERACROSS }, { 9, 9, SPECIES_LEDYBA }, { 25, 25, SPECIES_HERACROSS }, { 14, 14, SPECIES_LEDYBA }, { 30, 30, SPECIES_HERACROSS }, }; const struct WildPokemonInfo sSixIslandPatternBush_FireRed_LandMonsInfo = { 21, sSixIslandPatternBush_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom1_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom1_FireRed_LandMonsInfo = { 1, sFiveIslandLostCaveRoom1_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom2_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom2_FireRed_LandMonsInfo = { 2, sFiveIslandLostCaveRoom2_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom3_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom3_FireRed_LandMonsInfo = { 3, sFiveIslandLostCaveRoom3_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom4_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom4_FireRed_LandMonsInfo = { 4, sFiveIslandLostCaveRoom4_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom5_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom5_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom5_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom6_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom6_FireRed_LandMonsInfo = { 6, sFiveIslandLostCaveRoom6_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom7_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom7_FireRed_LandMonsInfo = { 7, sFiveIslandLostCaveRoom7_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom8_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom8_FireRed_LandMonsInfo = { 8, sFiveIslandLostCaveRoom8_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom9_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom9_FireRed_LandMonsInfo = { 9, sFiveIslandLostCaveRoom9_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom10_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom10_FireRed_LandMonsInfo = { 10, sFiveIslandLostCaveRoom10_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom11_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 15, 15, SPECIES_MURKROW }, { 20, 20, SPECIES_MURKROW }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom11_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom11_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom12_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 15, 15, SPECIES_MURKROW }, { 20, 20, SPECIES_MURKROW }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom12_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom12_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom13_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 15, 15, SPECIES_MURKROW }, { 20, 20, SPECIES_MURKROW }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom13_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom13_FireRed_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom14_FireRed_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 15, 15, SPECIES_MURKROW }, { 20, 20, SPECIES_MURKROW }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MURKROW }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom14_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom14_FireRed_LandMons }; const struct WildPokemon sOneIslandKindleRoad_FireRed_LandMons[] = { { 32, 32, SPECIES_SPEAROW }, { 34, 34, SPECIES_PONYTA }, { 36, 36, SPECIES_FEAROW }, { 31, 31, SPECIES_PONYTA }, { 31, 31, SPECIES_GEODUDE }, { 31, 31, SPECIES_MEOWTH }, { 30, 30, SPECIES_SPEAROW }, { 34, 34, SPECIES_PSYDUCK }, { 37, 37, SPECIES_RAPIDASH }, { 37, 37, SPECIES_PERSIAN }, { 40, 40, SPECIES_RAPIDASH }, { 40, 40, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sOneIslandKindleRoad_FireRed_LandMonsInfo = { 21, sOneIslandKindleRoad_FireRed_LandMons }; const struct WildPokemon sOneIslandKindleRoad_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sOneIslandKindleRoad_FireRed_WaterMonsInfo = { 2, sOneIslandKindleRoad_FireRed_WaterMons }; const struct WildPokemon sOneIslandKindleRoad_FireRed_RockSmashMons[] = { { 5, 20, SPECIES_GEODUDE }, { 10, 20, SPECIES_GEODUDE }, { 15, 30, SPECIES_GEODUDE }, { 25, 40, SPECIES_GRAVELER }, { 30, 40, SPECIES_GRAVELER }, }; const struct WildPokemonInfo sOneIslandKindleRoad_FireRed_RockSmashMonsInfo = { 25, sOneIslandKindleRoad_FireRed_RockSmashMons }; const struct WildPokemon sOneIslandKindleRoad_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sOneIslandKindleRoad_FireRed_FishingMonsInfo = { 20, sOneIslandKindleRoad_FireRed_FishingMons }; const struct WildPokemon sOneIslandTreasureBeach_FireRed_LandMons[] = { { 32, 32, SPECIES_SPEAROW }, { 33, 33, SPECIES_TANGELA }, { 31, 31, SPECIES_SPEAROW }, { 35, 35, SPECIES_TANGELA }, { 36, 36, SPECIES_FEAROW }, { 31, 31, SPECIES_MEOWTH }, { 38, 38, SPECIES_FEAROW }, { 31, 31, SPECIES_PSYDUCK }, { 40, 40, SPECIES_FEAROW }, { 37, 37, SPECIES_PERSIAN }, { 40, 40, SPECIES_FEAROW }, { 40, 40, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sOneIslandTreasureBeach_FireRed_LandMonsInfo = { 21, sOneIslandTreasureBeach_FireRed_LandMons }; const struct WildPokemon sOneIslandTreasureBeach_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sOneIslandTreasureBeach_FireRed_WaterMonsInfo = { 2, sOneIslandTreasureBeach_FireRed_WaterMons }; const struct WildPokemon sOneIslandTreasureBeach_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sOneIslandTreasureBeach_FireRed_FishingMonsInfo = { 20, sOneIslandTreasureBeach_FireRed_FishingMons }; const struct WildPokemon sTwoIslandCapeBrink_FireRed_LandMons[] = { { 31, 31, SPECIES_SPEAROW }, { 30, 30, SPECIES_ODDISH }, { 32, 32, SPECIES_ODDISH }, { 36, 36, SPECIES_GLOOM }, { 36, 36, SPECIES_FEAROW }, { 31, 31, SPECIES_MEOWTH }, { 38, 38, SPECIES_GLOOM }, { 31, 31, SPECIES_PSYDUCK }, { 37, 37, SPECIES_GOLDUCK }, { 37, 37, SPECIES_PERSIAN }, { 40, 40, SPECIES_GOLDUCK }, { 40, 40, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sTwoIslandCapeBrink_FireRed_LandMonsInfo = { 21, sTwoIslandCapeBrink_FireRed_LandMons }; const struct WildPokemon sTwoIslandCapeBrink_FireRed_WaterMons[] = { { 5, 20, SPECIES_PSYDUCK }, { 20, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, { 35, 40, SPECIES_GOLDUCK }, { 35, 40, SPECIES_GOLDUCK }, }; const struct WildPokemonInfo sTwoIslandCapeBrink_FireRed_WaterMonsInfo = { 2, sTwoIslandCapeBrink_FireRed_WaterMons }; const struct WildPokemon sTwoIslandCapeBrink_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sTwoIslandCapeBrink_FireRed_FishingMonsInfo = { 20, sTwoIslandCapeBrink_FireRed_FishingMons }; const struct WildPokemon sThreeIslandBondBridge_FireRed_LandMons[] = { { 32, 32, SPECIES_PIDGEY }, { 31, 31, SPECIES_ODDISH }, { 29, 29, SPECIES_PIDGEY }, { 36, 36, SPECIES_GLOOM }, { 34, 34, SPECIES_PIDGEOTTO }, { 31, 31, SPECIES_MEOWTH }, { 34, 34, SPECIES_VENONAT }, { 31, 31, SPECIES_PSYDUCK }, { 37, 37, SPECIES_PIDGEOTTO }, { 37, 37, SPECIES_PERSIAN }, { 40, 40, SPECIES_PIDGEOTTO }, { 40, 40, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sThreeIslandBondBridge_FireRed_LandMonsInfo = { 21, sThreeIslandBondBridge_FireRed_LandMons }; const struct WildPokemon sThreeIslandBondBridge_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sThreeIslandBondBridge_FireRed_WaterMonsInfo = { 2, sThreeIslandBondBridge_FireRed_WaterMons }; const struct WildPokemon sThreeIslandBondBridge_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sThreeIslandBondBridge_FireRed_FishingMonsInfo = { 20, sThreeIslandBondBridge_FireRed_FishingMons }; const struct WildPokemon sThreeIslandPort_FireRed_LandMons[] = { { 15, 15, SPECIES_DUNSPARCE }, { 15, 15, SPECIES_DUNSPARCE }, { 10, 10, SPECIES_DUNSPARCE }, { 10, 10, SPECIES_DUNSPARCE }, { 20, 20, SPECIES_DUNSPARCE }, { 20, 20, SPECIES_DUNSPARCE }, { 25, 25, SPECIES_DUNSPARCE }, { 30, 30, SPECIES_DUNSPARCE }, { 25, 25, SPECIES_DUNSPARCE }, { 30, 30, SPECIES_DUNSPARCE }, { 5, 5, SPECIES_DUNSPARCE }, { 35, 35, SPECIES_DUNSPARCE }, }; const struct WildPokemonInfo sThreeIslandPort_FireRed_LandMonsInfo = { 1, sThreeIslandPort_FireRed_LandMons }; const struct WildPokemon sFiveIslandResortGorgeous_FireRed_WaterMons[] = { { 5, 35, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIslandResortGorgeous_FireRed_WaterMonsInfo = { 2, sFiveIslandResortGorgeous_FireRed_WaterMons }; const struct WildPokemon sFiveIslandResortGorgeous_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_QWILFISH }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFiveIslandResortGorgeous_FireRed_FishingMonsInfo = { 20, sFiveIslandResortGorgeous_FireRed_FishingMons }; const struct WildPokemon sFiveIslandWaterLabyrinth_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIslandWaterLabyrinth_FireRed_WaterMonsInfo = { 2, sFiveIslandWaterLabyrinth_FireRed_WaterMons }; const struct WildPokemon sFiveIslandWaterLabyrinth_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_QWILFISH }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFiveIslandWaterLabyrinth_FireRed_FishingMonsInfo = { 20, sFiveIslandWaterLabyrinth_FireRed_FishingMons }; const struct WildPokemon sFiveIslandMeadow_FireRed_LandMons[] = { { 44, 44, SPECIES_PIDGEY }, { 10, 10, SPECIES_SENTRET }, { 48, 48, SPECIES_PIDGEOTTO }, { 10, 10, SPECIES_HOPPIP }, { 15, 15, SPECIES_SENTRET }, { 41, 41, SPECIES_MEOWTH }, { 15, 15, SPECIES_HOPPIP }, { 41, 41, SPECIES_PSYDUCK }, { 50, 50, SPECIES_PIDGEOTTO }, { 47, 47, SPECIES_PERSIAN }, { 50, 50, SPECIES_PIDGEOTTO }, { 50, 50, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sFiveIslandMeadow_FireRed_LandMonsInfo = { 21, sFiveIslandMeadow_FireRed_LandMons }; const struct WildPokemon sFiveIslandMeadow_FireRed_WaterMons[] = { { 5, 35, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIslandMeadow_FireRed_WaterMonsInfo = { 2, sFiveIslandMeadow_FireRed_WaterMons }; const struct WildPokemon sFiveIslandMeadow_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_QWILFISH }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFiveIslandMeadow_FireRed_FishingMonsInfo = { 20, sFiveIslandMeadow_FireRed_FishingMons }; const struct WildPokemon sFiveIslandMemorialPillar_FireRed_LandMons[] = { { 10, 10, SPECIES_HOPPIP }, { 12, 12, SPECIES_HOPPIP }, { 8, 8, SPECIES_HOPPIP }, { 14, 14, SPECIES_HOPPIP }, { 10, 10, SPECIES_HOPPIP }, { 12, 12, SPECIES_HOPPIP }, { 16, 16, SPECIES_HOPPIP }, { 6, 6, SPECIES_HOPPIP }, { 8, 8, SPECIES_HOPPIP }, { 14, 14, SPECIES_HOPPIP }, { 8, 8, SPECIES_HOPPIP }, { 14, 14, SPECIES_HOPPIP }, }; const struct WildPokemonInfo sFiveIslandMemorialPillar_FireRed_LandMonsInfo = { 21, sFiveIslandMemorialPillar_FireRed_LandMons }; const struct WildPokemon sFiveIslandMemorialPillar_FireRed_WaterMons[] = { { 5, 35, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIslandMemorialPillar_FireRed_WaterMonsInfo = { 2, sFiveIslandMemorialPillar_FireRed_WaterMons }; const struct WildPokemon sFiveIslandMemorialPillar_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_QWILFISH }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFiveIslandMemorialPillar_FireRed_FishingMonsInfo = { 20, sFiveIslandMemorialPillar_FireRed_FishingMons }; const struct WildPokemon sSixIslandOutcastIsland_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSixIslandOutcastIsland_FireRed_WaterMonsInfo = { 2, sSixIslandOutcastIsland_FireRed_WaterMons }; const struct WildPokemon sSixIslandOutcastIsland_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_QWILFISH }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSixIslandOutcastIsland_FireRed_FishingMonsInfo = { 20, sSixIslandOutcastIsland_FireRed_FishingMons }; const struct WildPokemon sSixIslandGreenPath_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSixIslandGreenPath_FireRed_WaterMonsInfo = { 2, sSixIslandGreenPath_FireRed_WaterMons }; const struct WildPokemon sSixIslandGreenPath_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_QWILFISH }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSixIslandGreenPath_FireRed_FishingMonsInfo = { 20, sSixIslandGreenPath_FireRed_FishingMons }; const struct WildPokemon sSixIslandWaterPath_FireRed_LandMons[] = { { 44, 44, SPECIES_SPEAROW }, { 10, 10, SPECIES_SENTRET }, { 44, 44, SPECIES_ODDISH }, { 48, 48, SPECIES_FEAROW }, { 15, 15, SPECIES_SENTRET }, { 41, 41, SPECIES_MEOWTH }, { 48, 48, SPECIES_GLOOM }, { 41, 41, SPECIES_PSYDUCK }, { 50, 50, SPECIES_FEAROW }, { 47, 47, SPECIES_PERSIAN }, { 50, 50, SPECIES_FEAROW }, { 50, 50, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sSixIslandWaterPath_FireRed_LandMonsInfo = { 21, sSixIslandWaterPath_FireRed_LandMons }; const struct WildPokemon sSixIslandWaterPath_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSixIslandWaterPath_FireRed_WaterMonsInfo = { 2, sSixIslandWaterPath_FireRed_WaterMons }; const struct WildPokemon sSixIslandWaterPath_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_QWILFISH }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSixIslandWaterPath_FireRed_FishingMonsInfo = { 20, sSixIslandWaterPath_FireRed_FishingMons }; const struct WildPokemon sSixIslandRuinValley_FireRed_LandMons[] = { { 15, 15, SPECIES_NATU }, { 44, 44, SPECIES_SPEAROW }, { 18, 18, SPECIES_YANMA }, { 15, 15, SPECIES_WOOPER }, { 49, 49, SPECIES_FEAROW }, { 43, 43, SPECIES_MEOWTH }, { 25, 25, SPECIES_WOBBUFFET }, { 41, 41, SPECIES_PSYDUCK }, { 20, 20, SPECIES_NATU }, { 49, 49, SPECIES_PERSIAN }, { 20, 20, SPECIES_NATU }, { 52, 52, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sSixIslandRuinValley_FireRed_LandMonsInfo = { 21, sSixIslandRuinValley_FireRed_LandMons }; const struct WildPokemon sSixIslandRuinValley_FireRed_WaterMons[] = { { 5, 20, SPECIES_WOOPER }, { 10, 20, SPECIES_WOOPER }, { 15, 25, SPECIES_WOOPER }, { 20, 25, SPECIES_WOOPER }, { 20, 25, SPECIES_WOOPER }, }; const struct WildPokemonInfo sSixIslandRuinValley_FireRed_WaterMonsInfo = { 2, sSixIslandRuinValley_FireRed_WaterMons }; const struct WildPokemon sSixIslandRuinValley_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSixIslandRuinValley_FireRed_FishingMonsInfo = { 20, sSixIslandRuinValley_FireRed_FishingMons }; const struct WildPokemon sSevenIslandTrainerTower_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSevenIslandTrainerTower_FireRed_WaterMonsInfo = { 2, sSevenIslandTrainerTower_FireRed_WaterMons }; const struct WildPokemon sSevenIslandTrainerTower_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_QWILFISH }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSevenIslandTrainerTower_FireRed_FishingMonsInfo = { 20, sSevenIslandTrainerTower_FireRed_FishingMons }; const struct WildPokemon sSevenIslandSevaultCanyonEntrance_FireRed_LandMons[] = { { 44, 44, SPECIES_SPEAROW }, { 10, 10, SPECIES_SENTRET }, { 10, 10, SPECIES_PHANPY }, { 48, 48, SPECIES_FEAROW }, { 15, 15, SPECIES_SENTRET }, { 41, 41, SPECIES_MEOWTH }, { 50, 50, SPECIES_FEAROW }, { 41, 41, SPECIES_PSYDUCK }, { 15, 15, SPECIES_PHANPY }, { 47, 47, SPECIES_PERSIAN }, { 15, 15, SPECIES_PHANPY }, { 50, 50, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sSevenIslandSevaultCanyonEntrance_FireRed_LandMonsInfo = { 21, sSevenIslandSevaultCanyonEntrance_FireRed_LandMons }; const struct WildPokemon sSevenIslandSevaultCanyon_FireRed_LandMons[] = { { 46, 46, SPECIES_GEODUDE }, { 15, 15, SPECIES_PHANPY }, { 46, 46, SPECIES_CUBONE }, { 50, 50, SPECIES_FEAROW }, { 52, 52, SPECIES_MAROWAK }, { 43, 43, SPECIES_MEOWTH }, { 54, 54, SPECIES_ONIX }, { 30, 30, SPECIES_SKARMORY }, { 15, 15, SPECIES_LARVITAR }, { 49, 49, SPECIES_PERSIAN }, { 20, 20, SPECIES_LARVITAR }, { 52, 52, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sSevenIslandSevaultCanyon_FireRed_LandMonsInfo = { 21, sSevenIslandSevaultCanyon_FireRed_LandMons }; const struct WildPokemon sSevenIslandSevaultCanyon_FireRed_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sSevenIslandSevaultCanyon_FireRed_RockSmashMonsInfo = { 25, sSevenIslandSevaultCanyon_FireRed_RockSmashMons }; const struct WildPokemon sSevenIslandTanobyRuins_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSevenIslandTanobyRuins_FireRed_WaterMonsInfo = { 2, sSevenIslandTanobyRuins_FireRed_WaterMons }; const struct WildPokemon sSevenIslandTanobyRuins_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_QWILFISH }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sSevenIslandTanobyRuins_FireRed_FishingMonsInfo = { 20, sSevenIslandTanobyRuins_FireRed_FishingMons }; const struct WildPokemon sRoute1_FireRed_LandMons[] = { { 3, 3, SPECIES_PIDGEY }, { 3, 3, SPECIES_RATTATA }, { 3, 3, SPECIES_PIDGEY }, { 3, 3, SPECIES_RATTATA }, { 2, 2, SPECIES_PIDGEY }, { 2, 2, SPECIES_RATTATA }, { 3, 3, SPECIES_PIDGEY }, { 3, 3, SPECIES_RATTATA }, { 4, 4, SPECIES_PIDGEY }, { 4, 4, SPECIES_RATTATA }, { 5, 5, SPECIES_PIDGEY }, { 4, 4, SPECIES_RATTATA }, }; const struct WildPokemonInfo sRoute1_FireRed_LandMonsInfo = { 21, sRoute1_FireRed_LandMons }; const struct WildPokemon sRoute2_FireRed_LandMons[] = { { 3, 3, SPECIES_RATTATA }, { 3, 3, SPECIES_PIDGEY }, { 4, 4, SPECIES_RATTATA }, { 4, 4, SPECIES_PIDGEY }, { 2, 2, SPECIES_RATTATA }, { 2, 2, SPECIES_PIDGEY }, { 5, 5, SPECIES_RATTATA }, { 5, 5, SPECIES_PIDGEY }, { 4, 4, SPECIES_CATERPIE }, { 4, 4, SPECIES_WEEDLE }, { 5, 5, SPECIES_CATERPIE }, { 5, 5, SPECIES_WEEDLE }, }; const struct WildPokemonInfo sRoute2_FireRed_LandMonsInfo = { 21, sRoute2_FireRed_LandMons }; const struct WildPokemon sRoute3_FireRed_LandMons[] = { { 6, 6, SPECIES_SPEAROW }, { 6, 6, SPECIES_PIDGEY }, { 7, 7, SPECIES_SPEAROW }, { 7, 7, SPECIES_MANKEY }, { 6, 6, SPECIES_NIDORAN_M }, { 7, 7, SPECIES_PIDGEY }, { 8, 8, SPECIES_SPEAROW }, { 3, 3, SPECIES_JIGGLYPUFF }, { 7, 7, SPECIES_NIDORAN_M }, { 5, 5, SPECIES_JIGGLYPUFF }, { 6, 6, SPECIES_NIDORAN_F }, { 7, 7, SPECIES_JIGGLYPUFF }, }; const struct WildPokemonInfo sRoute3_FireRed_LandMonsInfo = { 21, sRoute3_FireRed_LandMons }; const struct WildPokemon sRoute4_FireRed_LandMons[] = { { 10, 10, SPECIES_SPEAROW }, { 10, 10, SPECIES_RATTATA }, { 6, 6, SPECIES_EKANS }, { 10, 10, SPECIES_EKANS }, { 8, 8, SPECIES_SPEAROW }, { 8, 8, SPECIES_RATTATA }, { 12, 12, SPECIES_SPEAROW }, { 12, 12, SPECIES_RATTATA }, { 10, 10, SPECIES_MANKEY }, { 8, 8, SPECIES_EKANS }, { 12, 12, SPECIES_MANKEY }, { 12, 12, SPECIES_EKANS }, }; const struct WildPokemonInfo sRoute4_FireRed_LandMonsInfo = { 21, sRoute4_FireRed_LandMons }; const struct WildPokemon sRoute4_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute4_FireRed_WaterMonsInfo = { 2, sRoute4_FireRed_WaterMons }; const struct WildPokemon sRoute4_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute4_FireRed_FishingMonsInfo = { 20, sRoute4_FireRed_FishingMons }; const struct WildPokemon sRoute5_FireRed_LandMons[] = { { 10, 10, SPECIES_MEOWTH }, { 13, 13, SPECIES_PIDGEY }, { 13, 13, SPECIES_ODDISH }, { 12, 12, SPECIES_MEOWTH }, { 15, 15, SPECIES_ODDISH }, { 15, 15, SPECIES_PIDGEY }, { 16, 16, SPECIES_ODDISH }, { 16, 16, SPECIES_PIDGEY }, { 15, 15, SPECIES_PIDGEY }, { 14, 14, SPECIES_MEOWTH }, { 15, 15, SPECIES_PIDGEY }, { 16, 16, SPECIES_MEOWTH }, }; const struct WildPokemonInfo sRoute5_FireRed_LandMonsInfo = { 21, sRoute5_FireRed_LandMons }; const struct WildPokemon sRoute6_FireRed_LandMons[] = { { 10, 10, SPECIES_MEOWTH }, { 13, 13, SPECIES_PIDGEY }, { 13, 13, SPECIES_ODDISH }, { 12, 12, SPECIES_MEOWTH }, { 15, 15, SPECIES_ODDISH }, { 15, 15, SPECIES_PIDGEY }, { 16, 16, SPECIES_ODDISH }, { 16, 16, SPECIES_PIDGEY }, { 15, 15, SPECIES_PIDGEY }, { 14, 14, SPECIES_MEOWTH }, { 15, 15, SPECIES_PIDGEY }, { 16, 16, SPECIES_MEOWTH }, }; const struct WildPokemonInfo sRoute6_FireRed_LandMonsInfo = { 21, sRoute6_FireRed_LandMons }; const struct WildPokemon sRoute6_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute6_FireRed_WaterMonsInfo = { 2, sRoute6_FireRed_WaterMons }; const struct WildPokemon sRoute6_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute6_FireRed_FishingMonsInfo = { 20, sRoute6_FireRed_FishingMons }; const struct WildPokemon sRoute7_FireRed_LandMons[] = { { 19, 19, SPECIES_PIDGEY }, { 17, 17, SPECIES_MEOWTH }, { 19, 19, SPECIES_ODDISH }, { 18, 18, SPECIES_MEOWTH }, { 22, 22, SPECIES_PIDGEY }, { 22, 22, SPECIES_ODDISH }, { 18, 18, SPECIES_GROWLITHE }, { 20, 20, SPECIES_GROWLITHE }, { 17, 17, SPECIES_MEOWTH }, { 19, 19, SPECIES_MEOWTH }, { 17, 17, SPECIES_MEOWTH }, { 20, 20, SPECIES_MEOWTH }, }; const struct WildPokemonInfo sRoute7_FireRed_LandMonsInfo = { 21, sRoute7_FireRed_LandMons }; const struct WildPokemon sRoute8_FireRed_LandMons[] = { { 18, 18, SPECIES_PIDGEY }, { 18, 18, SPECIES_MEOWTH }, { 16, 16, SPECIES_GROWLITHE }, { 20, 20, SPECIES_PIDGEY }, { 20, 20, SPECIES_MEOWTH }, { 17, 17, SPECIES_EKANS }, { 17, 17, SPECIES_GROWLITHE }, { 19, 19, SPECIES_EKANS }, { 17, 17, SPECIES_EKANS }, { 15, 15, SPECIES_GROWLITHE }, { 17, 17, SPECIES_EKANS }, { 18, 18, SPECIES_GROWLITHE }, }; const struct WildPokemonInfo sRoute8_FireRed_LandMonsInfo = { 21, sRoute8_FireRed_LandMons }; const struct WildPokemon sRoute9_FireRed_LandMons[] = { { 16, 16, SPECIES_SPEAROW }, { 16, 16, SPECIES_RATTATA }, { 11, 11, SPECIES_EKANS }, { 15, 15, SPECIES_EKANS }, { 13, 13, SPECIES_SPEAROW }, { 14, 14, SPECIES_RATTATA }, { 17, 17, SPECIES_SPEAROW }, { 17, 17, SPECIES_RATTATA }, { 14, 14, SPECIES_RATTATA }, { 13, 13, SPECIES_EKANS }, { 14, 14, SPECIES_RATTATA }, { 17, 17, SPECIES_EKANS }, }; const struct WildPokemonInfo sRoute9_FireRed_LandMonsInfo = { 21, sRoute9_FireRed_LandMons }; const struct WildPokemon sRoute10_FireRed_LandMons[] = { { 16, 16, SPECIES_SPEAROW }, { 16, 16, SPECIES_VOLTORB }, { 11, 11, SPECIES_EKANS }, { 15, 15, SPECIES_EKANS }, { 13, 13, SPECIES_SPEAROW }, { 14, 14, SPECIES_VOLTORB }, { 17, 17, SPECIES_SPEAROW }, { 17, 17, SPECIES_VOLTORB }, { 14, 14, SPECIES_VOLTORB }, { 13, 13, SPECIES_EKANS }, { 14, 14, SPECIES_VOLTORB }, { 17, 17, SPECIES_EKANS }, }; const struct WildPokemonInfo sRoute10_FireRed_LandMonsInfo = { 21, sRoute10_FireRed_LandMons }; const struct WildPokemon sRoute10_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute10_FireRed_WaterMonsInfo = { 2, sRoute10_FireRed_WaterMons }; const struct WildPokemon sRoute10_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute10_FireRed_FishingMonsInfo = { 20, sRoute10_FireRed_FishingMons }; const struct WildPokemon sRoute11_FireRed_LandMons[] = { { 14, 14, SPECIES_EKANS }, { 15, 15, SPECIES_SPEAROW }, { 12, 12, SPECIES_EKANS }, { 13, 13, SPECIES_SPEAROW }, { 11, 11, SPECIES_DROWZEE }, { 13, 13, SPECIES_DROWZEE }, { 15, 15, SPECIES_EKANS }, { 17, 17, SPECIES_SPEAROW }, { 12, 12, SPECIES_EKANS }, { 15, 15, SPECIES_DROWZEE }, { 12, 12, SPECIES_EKANS }, { 15, 15, SPECIES_DROWZEE }, }; const struct WildPokemonInfo sRoute11_FireRed_LandMonsInfo = { 21, sRoute11_FireRed_LandMons }; const struct WildPokemon sRoute11_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute11_FireRed_WaterMonsInfo = { 2, sRoute11_FireRed_WaterMons }; const struct WildPokemon sRoute11_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute11_FireRed_FishingMonsInfo = { 20, sRoute11_FireRed_FishingMons }; const struct WildPokemon sRoute12_FireRed_LandMons[] = { { 24, 24, SPECIES_ODDISH }, { 24, 24, SPECIES_VENONAT }, { 22, 22, SPECIES_ODDISH }, { 23, 23, SPECIES_PIDGEY }, { 25, 25, SPECIES_PIDGEY }, { 26, 26, SPECIES_VENONAT }, { 26, 26, SPECIES_ODDISH }, { 27, 27, SPECIES_PIDGEY }, { 23, 23, SPECIES_PIDGEY }, { 28, 28, SPECIES_GLOOM }, { 23, 23, SPECIES_PIDGEY }, { 30, 30, SPECIES_GLOOM }, }; const struct WildPokemonInfo sRoute12_FireRed_LandMonsInfo = { 21, sRoute12_FireRed_LandMons }; const struct WildPokemon sRoute12_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute12_FireRed_WaterMonsInfo = { 2, sRoute12_FireRed_WaterMons }; const struct WildPokemon sRoute12_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute12_FireRed_FishingMonsInfo = { 60, sRoute12_FireRed_FishingMons }; const struct WildPokemon sRoute13_FireRed_LandMons[] = { { 24, 24, SPECIES_ODDISH }, { 24, 24, SPECIES_VENONAT }, { 22, 22, SPECIES_ODDISH }, { 27, 27, SPECIES_PIDGEY }, { 25, 25, SPECIES_PIDGEY }, { 26, 26, SPECIES_VENONAT }, { 26, 26, SPECIES_ODDISH }, { 25, 25, SPECIES_DITTO }, { 29, 29, SPECIES_PIDGEOTTO }, { 28, 28, SPECIES_GLOOM }, { 29, 29, SPECIES_PIDGEOTTO }, { 30, 30, SPECIES_GLOOM }, }; const struct WildPokemonInfo sRoute13_FireRed_LandMonsInfo = { 21, sRoute13_FireRed_LandMons }; const struct WildPokemon sRoute13_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute13_FireRed_WaterMonsInfo = { 2, sRoute13_FireRed_WaterMons }; const struct WildPokemon sRoute13_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute13_FireRed_FishingMonsInfo = { 20, sRoute13_FireRed_FishingMons }; const struct WildPokemon sRoute14_FireRed_LandMons[] = { { 24, 24, SPECIES_ODDISH }, { 24, 24, SPECIES_VENONAT }, { 22, 22, SPECIES_ODDISH }, { 23, 23, SPECIES_DITTO }, { 27, 27, SPECIES_PIDGEY }, { 26, 26, SPECIES_VENONAT }, { 26, 26, SPECIES_ODDISH }, { 30, 30, SPECIES_GLOOM }, { 23, 23, SPECIES_DITTO }, { 29, 29, SPECIES_PIDGEOTTO }, { 23, 23, SPECIES_DITTO }, { 29, 29, SPECIES_PIDGEOTTO }, }; const struct WildPokemonInfo sRoute14_FireRed_LandMonsInfo = { 21, sRoute14_FireRed_LandMons }; const struct WildPokemon sRoute15_FireRed_LandMons[] = { { 24, 24, SPECIES_ODDISH }, { 24, 24, SPECIES_VENONAT }, { 22, 22, SPECIES_ODDISH }, { 27, 27, SPECIES_PIDGEY }, { 25, 25, SPECIES_PIDGEY }, { 26, 26, SPECIES_VENONAT }, { 26, 26, SPECIES_ODDISH }, { 25, 25, SPECIES_DITTO }, { 29, 29, SPECIES_PIDGEOTTO }, { 28, 28, SPECIES_GLOOM }, { 29, 29, SPECIES_PIDGEOTTO }, { 30, 30, SPECIES_GLOOM }, }; const struct WildPokemonInfo sRoute15_FireRed_LandMonsInfo = { 21, sRoute15_FireRed_LandMons }; const struct WildPokemon sRoute16_FireRed_LandMons[] = { { 20, 20, SPECIES_SPEAROW }, { 18, 18, SPECIES_DODUO }, { 18, 18, SPECIES_RATTATA }, { 20, 20, SPECIES_RATTATA }, { 22, 22, SPECIES_SPEAROW }, { 20, 20, SPECIES_DODUO }, { 22, 22, SPECIES_RATTATA }, { 22, 22, SPECIES_DODUO }, { 18, 18, SPECIES_RATTATA }, { 23, 23, SPECIES_RATICATE }, { 18, 18, SPECIES_RATTATA }, { 25, 25, SPECIES_RATICATE }, }; const struct WildPokemonInfo sRoute16_FireRed_LandMonsInfo = { 21, sRoute16_FireRed_LandMons }; const struct WildPokemon sRoute17_FireRed_LandMons[] = { { 20, 20, SPECIES_SPEAROW }, { 24, 24, SPECIES_DODUO }, { 22, 22, SPECIES_SPEAROW }, { 26, 26, SPECIES_DODUO }, { 25, 25, SPECIES_RATICATE }, { 27, 27, SPECIES_RATICATE }, { 28, 28, SPECIES_DODUO }, { 29, 29, SPECIES_RATICATE }, { 22, 22, SPECIES_RATTATA }, { 25, 25, SPECIES_FEAROW }, { 22, 22, SPECIES_RATTATA }, { 27, 27, SPECIES_FEAROW }, }; const struct WildPokemonInfo sRoute17_FireRed_LandMonsInfo = { 21, sRoute17_FireRed_LandMons }; const struct WildPokemon sRoute18_FireRed_LandMons[] = { { 20, 20, SPECIES_SPEAROW }, { 24, 24, SPECIES_DODUO }, { 22, 22, SPECIES_SPEAROW }, { 26, 26, SPECIES_DODUO }, { 25, 25, SPECIES_RATICATE }, { 25, 25, SPECIES_FEAROW }, { 28, 28, SPECIES_DODUO }, { 29, 29, SPECIES_RATICATE }, { 22, 22, SPECIES_RATTATA }, { 27, 27, SPECIES_FEAROW }, { 22, 22, SPECIES_RATTATA }, { 29, 29, SPECIES_FEAROW }, }; const struct WildPokemonInfo sRoute18_FireRed_LandMonsInfo = { 21, sRoute18_FireRed_LandMons }; const struct WildPokemon sRoute19_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute19_FireRed_WaterMonsInfo = { 2, sRoute19_FireRed_WaterMons }; const struct WildPokemon sRoute19_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute19_FireRed_FishingMonsInfo = { 20, sRoute19_FireRed_FishingMons }; const struct WildPokemon sRoute20_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute20_FireRed_WaterMonsInfo = { 2, sRoute20_FireRed_WaterMons }; const struct WildPokemon sRoute20_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute20_FireRed_FishingMonsInfo = { 20, sRoute20_FireRed_FishingMons }; const struct WildPokemon sRoute21North_FireRed_LandMons[] = { { 22, 22, SPECIES_TANGELA }, { 23, 23, SPECIES_TANGELA }, { 24, 24, SPECIES_TANGELA }, { 21, 21, SPECIES_TANGELA }, { 25, 25, SPECIES_TANGELA }, { 20, 20, SPECIES_TANGELA }, { 19, 19, SPECIES_TANGELA }, { 26, 26, SPECIES_TANGELA }, { 18, 18, SPECIES_TANGELA }, { 27, 27, SPECIES_TANGELA }, { 17, 17, SPECIES_TANGELA }, { 28, 28, SPECIES_TANGELA }, }; const struct WildPokemonInfo sRoute21North_FireRed_LandMonsInfo = { 14, sRoute21North_FireRed_LandMons }; const struct WildPokemon sRoute21North_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute21North_FireRed_WaterMonsInfo = { 2, sRoute21North_FireRed_WaterMons }; const struct WildPokemon sRoute21North_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute21North_FireRed_FishingMonsInfo = { 20, sRoute21North_FireRed_FishingMons }; const struct WildPokemon sRoute21South_FireRed_LandMons[] = { { 22, 22, SPECIES_TANGELA }, { 23, 23, SPECIES_TANGELA }, { 24, 24, SPECIES_TANGELA }, { 21, 21, SPECIES_TANGELA }, { 25, 25, SPECIES_TANGELA }, { 20, 20, SPECIES_TANGELA }, { 19, 19, SPECIES_TANGELA }, { 26, 26, SPECIES_TANGELA }, { 18, 18, SPECIES_TANGELA }, { 27, 27, SPECIES_TANGELA }, { 17, 17, SPECIES_TANGELA }, { 28, 28, SPECIES_TANGELA }, }; const struct WildPokemonInfo sRoute21South_FireRed_LandMonsInfo = { 14, sRoute21South_FireRed_LandMons }; const struct WildPokemon sRoute21South_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute21South_FireRed_WaterMonsInfo = { 2, sRoute21South_FireRed_WaterMons }; const struct WildPokemon sRoute21South_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute21South_FireRed_FishingMonsInfo = { 20, sRoute21South_FireRed_FishingMons }; const struct WildPokemon sRoute22_FireRed_LandMons[] = { { 3, 3, SPECIES_RATTATA }, { 3, 3, SPECIES_MANKEY }, { 4, 4, SPECIES_RATTATA }, { 4, 4, SPECIES_MANKEY }, { 2, 2, SPECIES_RATTATA }, { 2, 2, SPECIES_MANKEY }, { 3, 3, SPECIES_SPEAROW }, { 5, 5, SPECIES_SPEAROW }, { 5, 5, SPECIES_RATTATA }, { 5, 5, SPECIES_MANKEY }, { 5, 5, SPECIES_RATTATA }, { 5, 5, SPECIES_MANKEY }, }; const struct WildPokemonInfo sRoute22_FireRed_LandMonsInfo = { 21, sRoute22_FireRed_LandMons }; const struct WildPokemon sRoute22_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute22_FireRed_WaterMonsInfo = { 2, sRoute22_FireRed_WaterMons }; const struct WildPokemon sRoute22_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute22_FireRed_FishingMonsInfo = { 20, sRoute22_FireRed_FishingMons }; const struct WildPokemon sRoute23_FireRed_LandMons[] = { { 32, 32, SPECIES_MANKEY }, { 40, 40, SPECIES_FEAROW }, { 34, 34, SPECIES_MANKEY }, { 34, 34, SPECIES_SPEAROW }, { 32, 32, SPECIES_EKANS }, { 34, 34, SPECIES_EKANS }, { 42, 42, SPECIES_PRIMEAPE }, { 44, 44, SPECIES_ARBOK }, { 32, 32, SPECIES_SPEAROW }, { 42, 42, SPECIES_FEAROW }, { 32, 32, SPECIES_SPEAROW }, { 44, 44, SPECIES_FEAROW }, }; const struct WildPokemonInfo sRoute23_FireRed_LandMonsInfo = { 21, sRoute23_FireRed_LandMons }; const struct WildPokemon sRoute23_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute23_FireRed_WaterMonsInfo = { 2, sRoute23_FireRed_WaterMons }; const struct WildPokemon sRoute23_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute23_FireRed_FishingMonsInfo = { 20, sRoute23_FireRed_FishingMons }; const struct WildPokemon sRoute24_FireRed_LandMons[] = { { 7, 7, SPECIES_WEEDLE }, { 7, 7, SPECIES_CATERPIE }, { 11, 11, SPECIES_PIDGEY }, { 12, 12, SPECIES_ODDISH }, { 13, 13, SPECIES_ODDISH }, { 10, 10, SPECIES_ABRA }, { 13, 13, SPECIES_PIDGEY }, { 14, 14, SPECIES_ODDISH }, { 8, 8, SPECIES_KAKUNA }, { 8, 8, SPECIES_ABRA }, { 8, 8, SPECIES_METAPOD }, { 12, 12, SPECIES_ABRA }, }; const struct WildPokemonInfo sRoute24_FireRed_LandMonsInfo = { 21, sRoute24_FireRed_LandMons }; const struct WildPokemon sRoute24_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute24_FireRed_WaterMonsInfo = { 2, sRoute24_FireRed_WaterMons }; const struct WildPokemon sRoute24_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute24_FireRed_FishingMonsInfo = { 20, sRoute24_FireRed_FishingMons }; const struct WildPokemon sRoute25_FireRed_LandMons[] = { { 8, 8, SPECIES_WEEDLE }, { 8, 8, SPECIES_CATERPIE }, { 13, 13, SPECIES_PIDGEY }, { 14, 14, SPECIES_ODDISH }, { 13, 13, SPECIES_ODDISH }, { 11, 11, SPECIES_ABRA }, { 11, 11, SPECIES_PIDGEY }, { 12, 12, SPECIES_ODDISH }, { 9, 9, SPECIES_KAKUNA }, { 9, 9, SPECIES_ABRA }, { 9, 9, SPECIES_METAPOD }, { 13, 13, SPECIES_ABRA }, }; const struct WildPokemonInfo sRoute25_FireRed_LandMonsInfo = { 21, sRoute25_FireRed_LandMons }; const struct WildPokemon sRoute25_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute25_FireRed_WaterMonsInfo = { 2, sRoute25_FireRed_WaterMons }; const struct WildPokemon sRoute25_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute25_FireRed_FishingMonsInfo = { 20, sRoute25_FireRed_FishingMons }; const struct WildPokemon sPalletTown_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sPalletTown_FireRed_WaterMonsInfo = { 1, sPalletTown_FireRed_WaterMons }; const struct WildPokemon sPalletTown_FireRed_FishingMons[] = { { 5, 10, SPECIES_MAGIKARP }, { 5, 10, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_SHELLDER }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sPalletTown_FireRed_FishingMonsInfo = { 10, sPalletTown_FireRed_FishingMons }; const struct WildPokemon sViridianCity_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sViridianCity_FireRed_WaterMonsInfo = { 1, sViridianCity_FireRed_WaterMons }; const struct WildPokemon sViridianCity_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sViridianCity_FireRed_FishingMonsInfo = { 10, sViridianCity_FireRed_FishingMons }; const struct WildPokemon sCeruleanCity_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sCeruleanCity_FireRed_WaterMonsInfo = { 1, sCeruleanCity_FireRed_WaterMons }; const struct WildPokemon sCeruleanCity_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sCeruleanCity_FireRed_FishingMonsInfo = { 10, sCeruleanCity_FireRed_FishingMons }; const struct WildPokemon sVermilionCity_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sVermilionCity_FireRed_WaterMonsInfo = { 1, sVermilionCity_FireRed_WaterMons }; const struct WildPokemon sVermilionCity_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_SHELLDER }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sVermilionCity_FireRed_FishingMonsInfo = { 10, sVermilionCity_FireRed_FishingMons }; const struct WildPokemon sCeladonCity_FireRed_WaterMons[] = { { 5, 10, SPECIES_PSYDUCK }, { 10, 20, SPECIES_PSYDUCK }, { 20, 30, SPECIES_PSYDUCK }, { 30, 40, SPECIES_PSYDUCK }, { 30, 40, SPECIES_KOFFING }, }; const struct WildPokemonInfo sCeladonCity_FireRed_WaterMonsInfo = { 1, sCeladonCity_FireRed_WaterMons }; const struct WildPokemon sCeladonCity_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_MAGIKARP }, { 15, 25, SPECIES_MAGIKARP }, { 15, 25, SPECIES_MAGIKARP }, { 15, 25, SPECIES_MAGIKARP }, { 25, 35, SPECIES_MAGIKARP }, { 30, 40, SPECIES_GRIMER }, }; const struct WildPokemonInfo sCeladonCity_FireRed_FishingMonsInfo = { 10, sCeladonCity_FireRed_FishingMons }; const struct WildPokemon sFuchsiaCity_FireRed_WaterMons[] = { { 20, 25, SPECIES_PSYDUCK }, { 20, 25, SPECIES_PSYDUCK }, { 25, 30, SPECIES_PSYDUCK }, { 30, 35, SPECIES_PSYDUCK }, { 35, 40, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFuchsiaCity_FireRed_WaterMonsInfo = { 1, sFuchsiaCity_FireRed_WaterMons }; const struct WildPokemon sFuchsiaCity_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFuchsiaCity_FireRed_FishingMonsInfo = { 10, sFuchsiaCity_FireRed_FishingMons }; const struct WildPokemon sCinnabarIsland_FireRed_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sCinnabarIsland_FireRed_WaterMonsInfo = { 1, sCinnabarIsland_FireRed_WaterMons }; const struct WildPokemon sCinnabarIsland_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_SHELLDER }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sCinnabarIsland_FireRed_FishingMonsInfo = { 10, sCinnabarIsland_FireRed_FishingMons }; const struct WildPokemon sOneIsland_FireRed_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sOneIsland_FireRed_WaterMonsInfo = { 1, sOneIsland_FireRed_WaterMons }; const struct WildPokemon sOneIsland_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_SHELLDER }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sOneIsland_FireRed_FishingMonsInfo = { 10, sOneIsland_FireRed_FishingMons }; const struct WildPokemon sFourIsland_FireRed_WaterMons[] = { { 5, 15, SPECIES_WOOPER }, { 5, 35, SPECIES_PSYDUCK }, { 15, 25, SPECIES_WOOPER }, { 15, 25, SPECIES_WOOPER }, { 15, 25, SPECIES_WOOPER }, }; const struct WildPokemonInfo sFourIsland_FireRed_WaterMonsInfo = { 2, sFourIsland_FireRed_WaterMons }; const struct WildPokemon sFourIsland_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_PSYDUCK }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFourIsland_FireRed_FishingMonsInfo = { 20, sFourIsland_FireRed_FishingMons }; const struct WildPokemon sFiveIsland_FireRed_WaterMons[] = { { 5, 35, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIsland_FireRed_WaterMonsInfo = { 1, sFiveIsland_FireRed_WaterMons }; const struct WildPokemon sFiveIsland_FireRed_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_HORSEA }, { 15, 25, SPECIES_SHELLDER }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SEADRA }, { 25, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sFiveIsland_FireRed_FishingMonsInfo = { 10, sFiveIsland_FireRed_FishingMons }; const struct WildPokemon sSixIslandAlteringCave_FireRed_LandMons[] = { { 10, 10, SPECIES_ZUBAT }, { 12, 12, SPECIES_ZUBAT }, { 8, 8, SPECIES_ZUBAT }, { 14, 14, SPECIES_ZUBAT }, { 10, 10, SPECIES_ZUBAT }, { 12, 12, SPECIES_ZUBAT }, { 16, 16, SPECIES_ZUBAT }, { 6, 6, SPECIES_ZUBAT }, { 8, 8, SPECIES_ZUBAT }, { 14, 14, SPECIES_ZUBAT }, { 8, 8, SPECIES_ZUBAT }, { 14, 14, SPECIES_ZUBAT }, }; const struct WildPokemonInfo sSixIslandAlteringCave_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_FireRed_LandMons }; const struct WildPokemon sSixIslandAlteringCave_2_FireRed_LandMons[] = { { 7, 7, SPECIES_MAREEP }, { 9, 9, SPECIES_MAREEP }, { 5, 5, SPECIES_MAREEP }, { 11, 11, SPECIES_MAREEP }, { 7, 7, SPECIES_MAREEP }, { 9, 9, SPECIES_MAREEP }, { 13, 13, SPECIES_MAREEP }, { 3, 3, SPECIES_MAREEP }, { 5, 5, SPECIES_MAREEP }, { 11, 11, SPECIES_MAREEP }, { 5, 5, SPECIES_MAREEP }, { 11, 11, SPECIES_MAREEP }, }; const struct WildPokemonInfo sSixIslandAlteringCave_2_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_2_FireRed_LandMons }; const struct WildPokemon sSixIslandAlteringCave_3_FireRed_LandMons[] = { { 23, 23, SPECIES_PINECO }, { 25, 25, SPECIES_PINECO }, { 22, 22, SPECIES_PINECO }, { 27, 27, SPECIES_PINECO }, { 23, 23, SPECIES_PINECO }, { 25, 25, SPECIES_PINECO }, { 29, 29, SPECIES_PINECO }, { 19, 19, SPECIES_PINECO }, { 21, 21, SPECIES_PINECO }, { 27, 27, SPECIES_PINECO }, { 21, 21, SPECIES_PINECO }, { 27, 27, SPECIES_PINECO }, }; const struct WildPokemonInfo sSixIslandAlteringCave_3_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_3_FireRed_LandMons }; const struct WildPokemon sSixIslandAlteringCave_4_FireRed_LandMons[] = { { 16, 16, SPECIES_HOUNDOUR }, { 18, 18, SPECIES_HOUNDOUR }, { 14, 14, SPECIES_HOUNDOUR }, { 20, 20, SPECIES_HOUNDOUR }, { 16, 16, SPECIES_HOUNDOUR }, { 18, 18, SPECIES_HOUNDOUR }, { 22, 22, SPECIES_HOUNDOUR }, { 12, 12, SPECIES_HOUNDOUR }, { 14, 14, SPECIES_HOUNDOUR }, { 20, 20, SPECIES_HOUNDOUR }, { 14, 14, SPECIES_HOUNDOUR }, { 20, 20, SPECIES_HOUNDOUR }, }; const struct WildPokemonInfo sSixIslandAlteringCave_4_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_4_FireRed_LandMons }; const struct WildPokemon sSixIslandAlteringCave_5_FireRed_LandMons[] = { { 22, 22, SPECIES_TEDDIURSA }, { 24, 24, SPECIES_TEDDIURSA }, { 20, 20, SPECIES_TEDDIURSA }, { 26, 26, SPECIES_TEDDIURSA }, { 22, 22, SPECIES_TEDDIURSA }, { 24, 24, SPECIES_TEDDIURSA }, { 28, 28, SPECIES_TEDDIURSA }, { 18, 18, SPECIES_TEDDIURSA }, { 20, 20, SPECIES_TEDDIURSA }, { 26, 26, SPECIES_TEDDIURSA }, { 20, 20, SPECIES_TEDDIURSA }, { 26, 26, SPECIES_TEDDIURSA }, }; const struct WildPokemonInfo sSixIslandAlteringCave_5_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_5_FireRed_LandMons }; const struct WildPokemon sSixIslandAlteringCave_6_FireRed_LandMons[] = { { 22, 22, SPECIES_AIPOM }, { 24, 24, SPECIES_AIPOM }, { 20, 20, SPECIES_AIPOM }, { 26, 26, SPECIES_AIPOM }, { 22, 22, SPECIES_AIPOM }, { 24, 24, SPECIES_AIPOM }, { 28, 28, SPECIES_AIPOM }, { 18, 18, SPECIES_AIPOM }, { 20, 20, SPECIES_AIPOM }, { 26, 26, SPECIES_AIPOM }, { 20, 20, SPECIES_AIPOM }, { 26, 26, SPECIES_AIPOM }, }; const struct WildPokemonInfo sSixIslandAlteringCave_6_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_6_FireRed_LandMons }; const struct WildPokemon sSixIslandAlteringCave_7_FireRed_LandMons[] = { { 22, 22, SPECIES_SHUCKLE }, { 24, 24, SPECIES_SHUCKLE }, { 20, 20, SPECIES_SHUCKLE }, { 26, 26, SPECIES_SHUCKLE }, { 22, 22, SPECIES_SHUCKLE }, { 24, 24, SPECIES_SHUCKLE }, { 28, 28, SPECIES_SHUCKLE }, { 18, 18, SPECIES_SHUCKLE }, { 20, 20, SPECIES_SHUCKLE }, { 26, 26, SPECIES_SHUCKLE }, { 20, 20, SPECIES_SHUCKLE }, { 26, 26, SPECIES_SHUCKLE }, }; const struct WildPokemonInfo sSixIslandAlteringCave_7_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_7_FireRed_LandMons }; const struct WildPokemon sSixIslandAlteringCave_8_FireRed_LandMons[] = { { 22, 22, SPECIES_STANTLER }, { 24, 24, SPECIES_STANTLER }, { 20, 20, SPECIES_STANTLER }, { 26, 26, SPECIES_STANTLER }, { 22, 22, SPECIES_STANTLER }, { 24, 24, SPECIES_STANTLER }, { 28, 28, SPECIES_STANTLER }, { 18, 18, SPECIES_STANTLER }, { 20, 20, SPECIES_STANTLER }, { 26, 26, SPECIES_STANTLER }, { 20, 20, SPECIES_STANTLER }, { 26, 26, SPECIES_STANTLER }, }; const struct WildPokemonInfo sSixIslandAlteringCave_8_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_8_FireRed_LandMons }; const struct WildPokemon sSixIslandAlteringCave_9_FireRed_LandMons[] = { { 22, 22, SPECIES_SMEARGLE }, { 24, 24, SPECIES_SMEARGLE }, { 20, 20, SPECIES_SMEARGLE }, { 26, 26, SPECIES_SMEARGLE }, { 22, 22, SPECIES_SMEARGLE }, { 24, 24, SPECIES_SMEARGLE }, { 28, 28, SPECIES_SMEARGLE }, { 18, 18, SPECIES_SMEARGLE }, { 20, 20, SPECIES_SMEARGLE }, { 26, 26, SPECIES_SMEARGLE }, { 20, 20, SPECIES_SMEARGLE }, { 26, 26, SPECIES_SMEARGLE }, }; const struct WildPokemonInfo sSixIslandAlteringCave_9_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_9_FireRed_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsMoneanChamber_LeafGreen_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsMoneanChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsMoneanChamber_LeafGreen_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsLiptooChamber_LeafGreen_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsLiptooChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsLiptooChamber_LeafGreen_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsWeepthChamber_LeafGreen_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsWeepthChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsWeepthChamber_LeafGreen_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsDilfordChamber_LeafGreen_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsDilfordChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsDilfordChamber_LeafGreen_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsScufibChamber_LeafGreen_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsScufibChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsScufibChamber_LeafGreen_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsRixyChamber_LeafGreen_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsRixyChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsRixyChamber_LeafGreen_LandMons }; const struct WildPokemon sSevenIslandTanobyRuinsViapoisChamber_LeafGreen_LandMons[] = { { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, { 25, 25, SPECIES_UNOWN }, }; const struct WildPokemonInfo sSevenIslandTanobyRuinsViapoisChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsViapoisChamber_LeafGreen_LandMons }; const struct WildPokemon sViridianForest_LeafGreen_LandMons[] = { { 4, 4, SPECIES_CATERPIE }, { 4, 4, SPECIES_WEEDLE }, { 5, 5, SPECIES_CATERPIE }, { 5, 5, SPECIES_WEEDLE }, { 3, 3, SPECIES_CATERPIE }, { 3, 3, SPECIES_WEEDLE }, { 5, 5, SPECIES_KAKUNA }, { 5, 5, SPECIES_METAPOD }, { 4, 4, SPECIES_METAPOD }, { 3, 3, SPECIES_PIKACHU }, { 6, 6, SPECIES_METAPOD }, { 5, 5, SPECIES_PIKACHU }, }; const struct WildPokemonInfo sViridianForest_LeafGreen_LandMonsInfo = { 14, sViridianForest_LeafGreen_LandMons }; const struct WildPokemon sMtMoon1F_LeafGreen_LandMons[] = { { 7, 7, SPECIES_ZUBAT }, { 8, 8, SPECIES_ZUBAT }, { 7, 7, SPECIES_GEODUDE }, { 9, 9, SPECIES_ZUBAT }, { 10, 10, SPECIES_ZUBAT }, { 8, 8, SPECIES_GEODUDE }, { 9, 9, SPECIES_GEODUDE }, { 8, 8, SPECIES_PARAS }, { 7, 7, SPECIES_ZUBAT }, { 7, 7, SPECIES_ZUBAT }, { 7, 7, SPECIES_ZUBAT }, { 8, 8, SPECIES_CLEFAIRY }, }; const struct WildPokemonInfo sMtMoon1F_LeafGreen_LandMonsInfo = { 7, sMtMoon1F_LeafGreen_LandMons }; const struct WildPokemon sMtMoonB1F_LeafGreen_LandMons[] = { { 7, 7, SPECIES_PARAS }, { 8, 8, SPECIES_PARAS }, { 5, 5, SPECIES_PARAS }, { 6, 6, SPECIES_PARAS }, { 9, 9, SPECIES_PARAS }, { 10, 10, SPECIES_PARAS }, { 7, 7, SPECIES_PARAS }, { 8, 8, SPECIES_PARAS }, { 5, 5, SPECIES_PARAS }, { 6, 6, SPECIES_PARAS }, { 9, 9, SPECIES_PARAS }, { 10, 10, SPECIES_PARAS }, }; const struct WildPokemonInfo sMtMoonB1F_LeafGreen_LandMonsInfo = { 5, sMtMoonB1F_LeafGreen_LandMons }; const struct WildPokemon sMtMoonB2F_LeafGreen_LandMons[] = { { 8, 8, SPECIES_ZUBAT }, { 9, 9, SPECIES_GEODUDE }, { 9, 9, SPECIES_ZUBAT }, { 10, 10, SPECIES_ZUBAT }, { 10, 10, SPECIES_GEODUDE }, { 10, 10, SPECIES_PARAS }, { 12, 12, SPECIES_PARAS }, { 10, 10, SPECIES_CLEFAIRY }, { 11, 11, SPECIES_ZUBAT }, { 11, 11, SPECIES_ZUBAT }, { 11, 11, SPECIES_ZUBAT }, { 12, 12, SPECIES_CLEFAIRY }, }; const struct WildPokemonInfo sMtMoonB2F_LeafGreen_LandMonsInfo = { 7, sMtMoonB2F_LeafGreen_LandMons }; const struct WildPokemon sSSAnneExterior_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sSSAnneExterior_LeafGreen_WaterMonsInfo = { 1, sSSAnneExterior_LeafGreen_WaterMons }; const struct WildPokemon sSSAnneExterior_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_STARYU }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KRABBY }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSSAnneExterior_LeafGreen_FishingMonsInfo = { 10, sSSAnneExterior_LeafGreen_FishingMons }; const struct WildPokemon sDiglettsCaveB1F_LeafGreen_LandMons[] = { { 18, 18, SPECIES_DIGLETT }, { 19, 19, SPECIES_DIGLETT }, { 17, 17, SPECIES_DIGLETT }, { 15, 15, SPECIES_DIGLETT }, { 16, 16, SPECIES_DIGLETT }, { 20, 20, SPECIES_DIGLETT }, { 21, 21, SPECIES_DIGLETT }, { 22, 22, SPECIES_DIGLETT }, { 17, 17, SPECIES_DIGLETT }, { 29, 29, SPECIES_DUGTRIO }, { 17, 17, SPECIES_DIGLETT }, { 31, 31, SPECIES_DUGTRIO }, }; const struct WildPokemonInfo sDiglettsCaveB1F_LeafGreen_LandMonsInfo = { 5, sDiglettsCaveB1F_LeafGreen_LandMons }; const struct WildPokemon sVictoryRoad1F_LeafGreen_LandMons[] = { { 32, 32, SPECIES_MACHOP }, { 32, 32, SPECIES_GEODUDE }, { 40, 40, SPECIES_ONIX }, { 43, 43, SPECIES_ONIX }, { 46, 46, SPECIES_ONIX }, { 32, 32, SPECIES_ZUBAT }, { 44, 44, SPECIES_SANDSLASH }, { 44, 44, SPECIES_GOLBAT }, { 44, 44, SPECIES_MAROWAK }, { 44, 44, SPECIES_MACHOKE }, { 46, 46, SPECIES_MACHOKE }, { 46, 46, SPECIES_MAROWAK }, }; const struct WildPokemonInfo sVictoryRoad1F_LeafGreen_LandMonsInfo = { 7, sVictoryRoad1F_LeafGreen_LandMons }; const struct WildPokemon sVictoryRoad2F_LeafGreen_LandMons[] = { { 34, 34, SPECIES_MACHOP }, { 34, 34, SPECIES_GEODUDE }, { 42, 42, SPECIES_PRIMEAPE }, { 45, 45, SPECIES_ONIX }, { 48, 48, SPECIES_ONIX }, { 34, 34, SPECIES_ZUBAT }, { 46, 46, SPECIES_SANDSLASH }, { 46, 46, SPECIES_GOLBAT }, { 46, 46, SPECIES_MAROWAK }, { 46, 46, SPECIES_MACHOKE }, { 48, 48, SPECIES_MACHOKE }, { 48, 48, SPECIES_MAROWAK }, }; const struct WildPokemonInfo sVictoryRoad2F_LeafGreen_LandMonsInfo = { 7, sVictoryRoad2F_LeafGreen_LandMons }; const struct WildPokemon sVictoryRoad3F_LeafGreen_LandMons[] = { { 32, 32, SPECIES_MACHOP }, { 32, 32, SPECIES_GEODUDE }, { 40, 40, SPECIES_ONIX }, { 43, 43, SPECIES_ONIX }, { 46, 46, SPECIES_ONIX }, { 32, 32, SPECIES_ZUBAT }, { 44, 44, SPECIES_SANDSLASH }, { 44, 44, SPECIES_GOLBAT }, { 44, 44, SPECIES_MAROWAK }, { 44, 44, SPECIES_MACHOKE }, { 46, 46, SPECIES_MACHOKE }, { 46, 46, SPECIES_MAROWAK }, }; const struct WildPokemonInfo sVictoryRoad3F_LeafGreen_LandMonsInfo = { 7, sVictoryRoad3F_LeafGreen_LandMons }; const struct WildPokemon sPokemonMansion1F_LeafGreen_LandMons[] = { { 28, 28, SPECIES_GRIMER }, { 32, 32, SPECIES_RATICATE }, { 30, 30, SPECIES_GRIMER }, { 36, 36, SPECIES_RATICATE }, { 30, 30, SPECIES_VULPIX }, { 28, 28, SPECIES_RATTATA }, { 28, 28, SPECIES_KOFFING }, { 32, 32, SPECIES_MUK }, { 32, 32, SPECIES_VULPIX }, { 26, 26, SPECIES_RATTATA }, { 32, 32, SPECIES_VULPIX }, { 26, 26, SPECIES_RATTATA }, }; const struct WildPokemonInfo sPokemonMansion1F_LeafGreen_LandMonsInfo = { 7, sPokemonMansion1F_LeafGreen_LandMons }; const struct WildPokemon sPokemonMansion2F_LeafGreen_LandMons[] = { { 28, 28, SPECIES_GRIMER }, { 32, 32, SPECIES_RATICATE }, { 30, 30, SPECIES_GRIMER }, { 36, 36, SPECIES_RATICATE }, { 30, 30, SPECIES_VULPIX }, { 28, 28, SPECIES_RATTATA }, { 28, 28, SPECIES_KOFFING }, { 32, 32, SPECIES_MUK }, { 32, 32, SPECIES_VULPIX }, { 26, 26, SPECIES_RATTATA }, { 32, 32, SPECIES_VULPIX }, { 26, 26, SPECIES_RATTATA }, }; const struct WildPokemonInfo sPokemonMansion2F_LeafGreen_LandMonsInfo = { 7, sPokemonMansion2F_LeafGreen_LandMons }; const struct WildPokemon sPokemonMansion3F_LeafGreen_LandMons[] = { { 28, 28, SPECIES_GRIMER }, { 32, 32, SPECIES_RATICATE }, { 30, 30, SPECIES_GRIMER }, { 36, 36, SPECIES_RATICATE }, { 30, 30, SPECIES_VULPIX }, { 28, 28, SPECIES_RATTATA }, { 28, 28, SPECIES_KOFFING }, { 32, 32, SPECIES_MUK }, { 32, 32, SPECIES_VULPIX }, { 26, 26, SPECIES_RATTATA }, { 32, 32, SPECIES_VULPIX }, { 26, 26, SPECIES_RATTATA }, }; const struct WildPokemonInfo sPokemonMansion3F_LeafGreen_LandMonsInfo = { 7, sPokemonMansion3F_LeafGreen_LandMons }; const struct WildPokemon sPokemonMansionB1F_LeafGreen_LandMons[] = { { 28, 28, SPECIES_GRIMER }, { 34, 34, SPECIES_RATICATE }, { 30, 30, SPECIES_GRIMER }, { 30, 30, SPECIES_DITTO }, { 30, 30, SPECIES_VULPIX }, { 38, 38, SPECIES_RATICATE }, { 28, 28, SPECIES_KOFFING }, { 34, 34, SPECIES_MUK }, { 32, 32, SPECIES_VULPIX }, { 26, 26, SPECIES_RATTATA }, { 32, 32, SPECIES_VULPIX }, { 26, 26, SPECIES_RATTATA }, }; const struct WildPokemonInfo sPokemonMansionB1F_LeafGreen_LandMonsInfo = { 5, sPokemonMansionB1F_LeafGreen_LandMons }; const struct WildPokemon sSafariZoneCenter_LeafGreen_LandMons[] = { { 25, 25, SPECIES_RHYHORN }, { 22, 22, SPECIES_NIDORAN_F }, { 24, 24, SPECIES_EXEGGCUTE }, { 25, 25, SPECIES_EXEGGCUTE }, { 22, 22, SPECIES_VENONAT }, { 31, 31, SPECIES_NIDORINA }, { 31, 31, SPECIES_NIDORINO }, { 30, 30, SPECIES_PARASECT }, { 22, 22, SPECIES_VENONAT }, { 23, 23, SPECIES_PINSIR }, { 22, 22, SPECIES_VENONAT }, { 23, 23, SPECIES_CHANSEY }, }; const struct WildPokemonInfo sSafariZoneCenter_LeafGreen_LandMonsInfo = { 21, sSafariZoneCenter_LeafGreen_LandMons }; const struct WildPokemon sSafariZoneCenter_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSafariZoneCenter_LeafGreen_WaterMonsInfo = { 2, sSafariZoneCenter_LeafGreen_WaterMons }; const struct WildPokemon sSafariZoneCenter_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_DRATINI }, { 15, 35, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_DRAGONAIR }, }; const struct WildPokemonInfo sSafariZoneCenter_LeafGreen_FishingMonsInfo = { 20, sSafariZoneCenter_LeafGreen_FishingMons }; const struct WildPokemon sSafariZoneEast_LeafGreen_LandMons[] = { { 24, 24, SPECIES_NIDORAN_F }, { 26, 26, SPECIES_DODUO }, { 23, 23, SPECIES_EXEGGCUTE }, { 25, 25, SPECIES_EXEGGCUTE }, { 22, 22, SPECIES_PARAS }, { 33, 33, SPECIES_NIDORINA }, { 24, 24, SPECIES_NIDORAN_M }, { 25, 25, SPECIES_PARASECT }, { 22, 22, SPECIES_PARAS }, { 25, 25, SPECIES_KANGASKHAN }, { 22, 22, SPECIES_PARAS }, { 28, 28, SPECIES_PINSIR }, }; const struct WildPokemonInfo sSafariZoneEast_LeafGreen_LandMonsInfo = { 21, sSafariZoneEast_LeafGreen_LandMons }; const struct WildPokemon sSafariZoneEast_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSafariZoneEast_LeafGreen_WaterMonsInfo = { 2, sSafariZoneEast_LeafGreen_WaterMons }; const struct WildPokemon sSafariZoneEast_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_DRATINI }, { 15, 35, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_DRAGONAIR }, }; const struct WildPokemonInfo sSafariZoneEast_LeafGreen_FishingMonsInfo = { 20, sSafariZoneEast_LeafGreen_FishingMons }; const struct WildPokemon sSafariZoneNorth_LeafGreen_LandMons[] = { { 26, 26, SPECIES_RHYHORN }, { 30, 30, SPECIES_NIDORAN_F }, { 25, 25, SPECIES_EXEGGCUTE }, { 27, 27, SPECIES_EXEGGCUTE }, { 23, 23, SPECIES_PARAS }, { 30, 30, SPECIES_NIDORINA }, { 30, 30, SPECIES_NIDORINO }, { 32, 32, SPECIES_VENOMOTH }, { 23, 23, SPECIES_PARAS }, { 26, 26, SPECIES_CHANSEY }, { 23, 23, SPECIES_PARAS }, { 28, 28, SPECIES_TAUROS }, }; const struct WildPokemonInfo sSafariZoneNorth_LeafGreen_LandMonsInfo = { 21, sSafariZoneNorth_LeafGreen_LandMons }; const struct WildPokemon sSafariZoneNorth_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSafariZoneNorth_LeafGreen_WaterMonsInfo = { 2, sSafariZoneNorth_LeafGreen_WaterMons }; const struct WildPokemon sSafariZoneNorth_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_DRATINI }, { 15, 35, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_DRAGONAIR }, }; const struct WildPokemonInfo sSafariZoneNorth_LeafGreen_FishingMonsInfo = { 20, sSafariZoneNorth_LeafGreen_FishingMons }; const struct WildPokemon sSafariZoneWest_LeafGreen_LandMons[] = { { 26, 26, SPECIES_DODUO }, { 22, 22, SPECIES_NIDORAN_F }, { 25, 25, SPECIES_EXEGGCUTE }, { 27, 27, SPECIES_EXEGGCUTE }, { 23, 23, SPECIES_VENONAT }, { 30, 30, SPECIES_NIDORINA }, { 30, 30, SPECIES_NIDORAN_M }, { 32, 32, SPECIES_VENOMOTH }, { 23, 23, SPECIES_VENONAT }, { 25, 25, SPECIES_TAUROS }, { 23, 23, SPECIES_VENONAT }, { 28, 28, SPECIES_KANGASKHAN }, }; const struct WildPokemonInfo sSafariZoneWest_LeafGreen_LandMonsInfo = { 21, sSafariZoneWest_LeafGreen_LandMons }; const struct WildPokemon sSafariZoneWest_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSafariZoneWest_LeafGreen_WaterMonsInfo = { 2, sSafariZoneWest_LeafGreen_WaterMons }; const struct WildPokemon sSafariZoneWest_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_DRATINI }, { 15, 35, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_DRAGONAIR }, }; const struct WildPokemonInfo sSafariZoneWest_LeafGreen_FishingMonsInfo = { 20, sSafariZoneWest_LeafGreen_FishingMons }; const struct WildPokemon sCeruleanCave1F_LeafGreen_LandMons[] = { { 49, 49, SPECIES_MAGNETON }, { 49, 49, SPECIES_PARASECT }, { 46, 46, SPECIES_GOLBAT }, { 46, 46, SPECIES_MACHOKE }, { 52, 52, SPECIES_PRIMEAPE }, { 52, 52, SPECIES_DITTO }, { 58, 58, SPECIES_ELECTRODE }, { 58, 58, SPECIES_PARASECT }, { 55, 55, SPECIES_GOLBAT }, { 55, 55, SPECIES_WOBBUFFET }, { 61, 61, SPECIES_PRIMEAPE }, { 61, 61, SPECIES_DITTO }, }; const struct WildPokemonInfo sCeruleanCave1F_LeafGreen_LandMonsInfo = { 7, sCeruleanCave1F_LeafGreen_LandMons }; const struct WildPokemon sCeruleanCave1F_LeafGreen_WaterMons[] = { { 30, 40, SPECIES_SLOWPOKE }, { 40, 50, SPECIES_SLOWBRO }, { 45, 55, SPECIES_SLOWBRO }, { 40, 50, SPECIES_SLOWPOKE }, { 40, 50, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sCeruleanCave1F_LeafGreen_WaterMonsInfo = { 2, sCeruleanCave1F_LeafGreen_WaterMons }; const struct WildPokemon sCeruleanCave1F_LeafGreen_RockSmashMons[] = { { 30, 40, SPECIES_GEODUDE }, { 40, 50, SPECIES_GRAVELER }, { 45, 55, SPECIES_GRAVELER }, { 40, 50, SPECIES_GEODUDE }, { 40, 50, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sCeruleanCave1F_LeafGreen_RockSmashMonsInfo = { 50, sCeruleanCave1F_LeafGreen_RockSmashMons }; const struct WildPokemon sCeruleanCave1F_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sCeruleanCave1F_LeafGreen_FishingMonsInfo = { 20, sCeruleanCave1F_LeafGreen_FishingMons }; const struct WildPokemon sCeruleanCave2F_LeafGreen_LandMons[] = { { 49, 49, SPECIES_GOLBAT }, { 49, 49, SPECIES_MACHOKE }, { 52, 52, SPECIES_MAGNETON }, { 52, 52, SPECIES_PARASECT }, { 55, 55, SPECIES_KADABRA }, { 55, 55, SPECIES_DITTO }, { 58, 58, SPECIES_GOLBAT }, { 58, 58, SPECIES_WOBBUFFET }, { 61, 61, SPECIES_ELECTRODE }, { 61, 61, SPECIES_PARASECT }, { 64, 64, SPECIES_KADABRA }, { 64, 64, SPECIES_DITTO }, }; const struct WildPokemonInfo sCeruleanCave2F_LeafGreen_LandMonsInfo = { 7, sCeruleanCave2F_LeafGreen_LandMons }; const struct WildPokemon sCeruleanCave2F_LeafGreen_RockSmashMons[] = { { 35, 45, SPECIES_GEODUDE }, { 45, 55, SPECIES_GRAVELER }, { 50, 60, SPECIES_GRAVELER }, { 45, 55, SPECIES_GEODUDE }, { 45, 55, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sCeruleanCave2F_LeafGreen_RockSmashMonsInfo = { 50, sCeruleanCave2F_LeafGreen_RockSmashMons }; const struct WildPokemon sCeruleanCaveB1F_LeafGreen_LandMons[] = { { 58, 58, SPECIES_KADABRA }, { 58, 58, SPECIES_DITTO }, { 55, 55, SPECIES_MAGNETON }, { 55, 55, SPECIES_PARASECT }, { 52, 52, SPECIES_GOLBAT }, { 52, 52, SPECIES_MACHOKE }, { 67, 67, SPECIES_KADABRA }, { 67, 67, SPECIES_DITTO }, { 64, 64, SPECIES_ELECTRODE }, { 64, 64, SPECIES_PARASECT }, { 61, 61, SPECIES_GOLBAT }, { 61, 61, SPECIES_WOBBUFFET }, }; const struct WildPokemonInfo sCeruleanCaveB1F_LeafGreen_LandMonsInfo = { 7, sCeruleanCaveB1F_LeafGreen_LandMons }; const struct WildPokemon sCeruleanCaveB1F_LeafGreen_WaterMons[] = { { 40, 50, SPECIES_SLOWPOKE }, { 50, 60, SPECIES_SLOWBRO }, { 55, 65, SPECIES_SLOWBRO }, { 50, 60, SPECIES_SLOWPOKE }, { 50, 60, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sCeruleanCaveB1F_LeafGreen_WaterMonsInfo = { 2, sCeruleanCaveB1F_LeafGreen_WaterMons }; const struct WildPokemon sCeruleanCaveB1F_LeafGreen_RockSmashMons[] = { { 40, 50, SPECIES_GEODUDE }, { 50, 60, SPECIES_GRAVELER }, { 55, 65, SPECIES_GRAVELER }, { 50, 60, SPECIES_GEODUDE }, { 50, 60, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sCeruleanCaveB1F_LeafGreen_RockSmashMonsInfo = { 50, sCeruleanCaveB1F_LeafGreen_RockSmashMons }; const struct WildPokemon sCeruleanCaveB1F_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_GYARADOS }, }; const struct WildPokemonInfo sCeruleanCaveB1F_LeafGreen_FishingMonsInfo = { 20, sCeruleanCaveB1F_LeafGreen_FishingMons }; const struct WildPokemon sRockTunnel1F_LeafGreen_LandMons[] = { { 15, 15, SPECIES_ZUBAT }, { 16, 16, SPECIES_GEODUDE }, { 16, 16, SPECIES_MANKEY }, { 17, 17, SPECIES_GEODUDE }, { 16, 16, SPECIES_ZUBAT }, { 16, 16, SPECIES_MACHOP }, { 17, 17, SPECIES_MANKEY }, { 17, 17, SPECIES_MACHOP }, { 15, 15, SPECIES_GEODUDE }, { 13, 13, SPECIES_ONIX }, { 15, 15, SPECIES_GEODUDE }, { 15, 15, SPECIES_ONIX }, }; const struct WildPokemonInfo sRockTunnel1F_LeafGreen_LandMonsInfo = { 7, sRockTunnel1F_LeafGreen_LandMons }; const struct WildPokemon sRockTunnelB1F_LeafGreen_LandMons[] = { { 16, 16, SPECIES_ZUBAT }, { 17, 17, SPECIES_GEODUDE }, { 17, 17, SPECIES_MANKEY }, { 16, 16, SPECIES_GEODUDE }, { 15, 15, SPECIES_ZUBAT }, { 17, 17, SPECIES_MACHOP }, { 16, 16, SPECIES_MANKEY }, { 13, 13, SPECIES_ONIX }, { 15, 15, SPECIES_GEODUDE }, { 15, 15, SPECIES_ONIX }, { 15, 15, SPECIES_GEODUDE }, { 17, 17, SPECIES_ONIX }, }; const struct WildPokemonInfo sRockTunnelB1F_LeafGreen_LandMonsInfo = { 7, sRockTunnelB1F_LeafGreen_LandMons }; const struct WildPokemon sRockTunnelB1F_LeafGreen_RockSmashMons[] = { { 5, 20, SPECIES_GEODUDE }, { 10, 20, SPECIES_GEODUDE }, { 15, 30, SPECIES_GEODUDE }, { 25, 40, SPECIES_GRAVELER }, { 30, 40, SPECIES_GRAVELER }, }; const struct WildPokemonInfo sRockTunnelB1F_LeafGreen_RockSmashMonsInfo = { 50, sRockTunnelB1F_LeafGreen_RockSmashMons }; const struct WildPokemon sSeafoamIslands1F_LeafGreen_LandMons[] = { { 27, 27, SPECIES_SLOWPOKE }, { 29, 29, SPECIES_SLOWPOKE }, { 31, 31, SPECIES_SLOWPOKE }, { 22, 22, SPECIES_ZUBAT }, { 22, 22, SPECIES_ZUBAT }, { 24, 24, SPECIES_ZUBAT }, { 26, 26, SPECIES_GOLBAT }, { 28, 28, SPECIES_GOLBAT }, { 33, 33, SPECIES_SLOWPOKE }, { 26, 26, SPECIES_ZUBAT }, { 26, 26, SPECIES_SLOWPOKE }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslands1F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslands1F_LeafGreen_LandMons }; const struct WildPokemon sSeafoamIslandsB1F_LeafGreen_LandMons[] = { { 29, 29, SPECIES_SLOWPOKE }, { 31, 31, SPECIES_SLOWPOKE }, { 28, 28, SPECIES_SEEL }, { 22, 22, SPECIES_ZUBAT }, { 22, 22, SPECIES_ZUBAT }, { 24, 24, SPECIES_ZUBAT }, { 26, 26, SPECIES_GOLBAT }, { 28, 28, SPECIES_GOLBAT }, { 33, 33, SPECIES_SLOWBRO }, { 26, 26, SPECIES_ZUBAT }, { 35, 35, SPECIES_SLOWBRO }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslandsB1F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslandsB1F_LeafGreen_LandMons }; const struct WildPokemon sSeafoamIslandsB2F_LeafGreen_LandMons[] = { { 30, 30, SPECIES_SLOWPOKE }, { 32, 32, SPECIES_SLOWPOKE }, { 30, 30, SPECIES_SEEL }, { 32, 32, SPECIES_SEEL }, { 22, 22, SPECIES_ZUBAT }, { 24, 24, SPECIES_ZUBAT }, { 26, 26, SPECIES_GOLBAT }, { 34, 34, SPECIES_SLOWBRO }, { 32, 32, SPECIES_SLOWBRO }, { 28, 28, SPECIES_GOLBAT }, { 32, 32, SPECIES_SLOWBRO }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslandsB2F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslandsB2F_LeafGreen_LandMons }; const struct WildPokemon sSeafoamIslandsB3F_LeafGreen_LandMons[] = { { 30, 30, SPECIES_SEEL }, { 32, 32, SPECIES_SEEL }, { 32, 32, SPECIES_SLOWPOKE }, { 30, 30, SPECIES_SLOWPOKE }, { 32, 32, SPECIES_SLOWBRO }, { 24, 24, SPECIES_ZUBAT }, { 26, 26, SPECIES_GOLBAT }, { 34, 34, SPECIES_SLOWBRO }, { 32, 32, SPECIES_DEWGONG }, { 28, 28, SPECIES_GOLBAT }, { 34, 34, SPECIES_DEWGONG }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslandsB3F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslandsB3F_LeafGreen_LandMons }; const struct WildPokemon sSeafoamIslandsB3F_LeafGreen_WaterMons[] = { { 25, 35, SPECIES_SEEL }, { 25, 30, SPECIES_KRABBY }, { 35, 40, SPECIES_DEWGONG }, { 30, 40, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWBRO }, }; const struct WildPokemonInfo sSeafoamIslandsB3F_LeafGreen_WaterMonsInfo = { 2, sSeafoamIslandsB3F_LeafGreen_WaterMons }; const struct WildPokemon sSeafoamIslandsB3F_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 20, 30, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_GYARADOS }, }; const struct WildPokemonInfo sSeafoamIslandsB3F_LeafGreen_FishingMonsInfo = { 20, sSeafoamIslandsB3F_LeafGreen_FishingMons }; const struct WildPokemon sSeafoamIslandsB4F_LeafGreen_LandMons[] = { { 30, 30, SPECIES_SEEL }, { 32, 32, SPECIES_SEEL }, { 32, 32, SPECIES_SLOWPOKE }, { 34, 34, SPECIES_SEEL }, { 32, 32, SPECIES_SLOWBRO }, { 26, 26, SPECIES_GOLBAT }, { 34, 34, SPECIES_DEWGONG }, { 34, 34, SPECIES_SLOWBRO }, { 36, 36, SPECIES_DEWGONG }, { 28, 28, SPECIES_GOLBAT }, { 36, 36, SPECIES_DEWGONG }, { 30, 30, SPECIES_GOLBAT }, }; const struct WildPokemonInfo sSeafoamIslandsB4F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslandsB4F_LeafGreen_LandMons }; const struct WildPokemon sSeafoamIslandsB4F_LeafGreen_WaterMons[] = { { 25, 35, SPECIES_SEEL }, { 25, 30, SPECIES_KRABBY }, { 35, 40, SPECIES_DEWGONG }, { 30, 40, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWBRO }, }; const struct WildPokemonInfo sSeafoamIslandsB4F_LeafGreen_WaterMonsInfo = { 2, sSeafoamIslandsB4F_LeafGreen_WaterMons }; const struct WildPokemon sSeafoamIslandsB4F_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 20, 30, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_GYARADOS }, }; const struct WildPokemonInfo sSeafoamIslandsB4F_LeafGreen_FishingMonsInfo = { 20, sSeafoamIslandsB4F_LeafGreen_FishingMons }; const struct WildPokemon sPokemonTower3F_LeafGreen_LandMons[] = { { 15, 15, SPECIES_GASTLY }, { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 13, 13, SPECIES_GASTLY }, { 14, 14, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, { 15, 15, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 17, 17, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 20, 20, SPECIES_HAUNTER }, }; const struct WildPokemonInfo sPokemonTower3F_LeafGreen_LandMonsInfo = { 2, sPokemonTower3F_LeafGreen_LandMons }; const struct WildPokemon sPokemonTower4F_LeafGreen_LandMons[] = { { 15, 15, SPECIES_GASTLY }, { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 13, 13, SPECIES_GASTLY }, { 14, 14, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 20, 20, SPECIES_HAUNTER }, { 15, 15, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 17, 17, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, }; const struct WildPokemonInfo sPokemonTower4F_LeafGreen_LandMonsInfo = { 4, sPokemonTower4F_LeafGreen_LandMons }; const struct WildPokemon sPokemonTower5F_LeafGreen_LandMons[] = { { 15, 15, SPECIES_GASTLY }, { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 13, 13, SPECIES_GASTLY }, { 14, 14, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 20, 20, SPECIES_HAUNTER }, { 15, 15, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 17, 17, SPECIES_CUBONE }, { 17, 17, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, }; const struct WildPokemonInfo sPokemonTower5F_LeafGreen_LandMonsInfo = { 6, sPokemonTower5F_LeafGreen_LandMons }; const struct WildPokemon sPokemonTower6F_LeafGreen_LandMons[] = { { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 14, 14, SPECIES_GASTLY }, { 15, 15, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, { 21, 21, SPECIES_HAUNTER }, { 17, 17, SPECIES_CUBONE }, { 18, 18, SPECIES_GASTLY }, { 19, 19, SPECIES_CUBONE }, { 18, 18, SPECIES_GASTLY }, { 23, 23, SPECIES_HAUNTER }, }; const struct WildPokemonInfo sPokemonTower6F_LeafGreen_LandMonsInfo = { 8, sPokemonTower6F_LeafGreen_LandMons }; const struct WildPokemon sPokemonTower7F_LeafGreen_LandMons[] = { { 16, 16, SPECIES_GASTLY }, { 17, 17, SPECIES_GASTLY }, { 18, 18, SPECIES_GASTLY }, { 15, 15, SPECIES_GASTLY }, { 19, 19, SPECIES_GASTLY }, { 23, 23, SPECIES_HAUNTER }, { 17, 17, SPECIES_CUBONE }, { 19, 19, SPECIES_CUBONE }, { 18, 18, SPECIES_GASTLY }, { 23, 23, SPECIES_HAUNTER }, { 18, 18, SPECIES_GASTLY }, { 25, 25, SPECIES_HAUNTER }, }; const struct WildPokemonInfo sPokemonTower7F_LeafGreen_LandMonsInfo = { 10, sPokemonTower7F_LeafGreen_LandMons }; const struct WildPokemon sPowerPlant_LeafGreen_LandMons[] = { { 22, 22, SPECIES_VOLTORB }, { 22, 22, SPECIES_MAGNEMITE }, { 25, 25, SPECIES_VOLTORB }, { 25, 25, SPECIES_MAGNEMITE }, { 22, 22, SPECIES_PIKACHU }, { 24, 24, SPECIES_PIKACHU }, { 31, 31, SPECIES_MAGNETON }, { 34, 34, SPECIES_MAGNETON }, { 26, 26, SPECIES_PIKACHU }, { 31, 31, SPECIES_MAGNETON }, { 26, 26, SPECIES_PIKACHU }, { 34, 34, SPECIES_MAGNETON }, }; const struct WildPokemonInfo sPowerPlant_LeafGreen_LandMonsInfo = { 7, sPowerPlant_LeafGreen_LandMons }; const struct WildPokemon sMtEmberExterior_LeafGreen_LandMons[] = { { 30, 30, SPECIES_PONYTA }, { 38, 38, SPECIES_FEAROW }, { 33, 33, SPECIES_PONYTA }, { 32, 32, SPECIES_SPEAROW }, { 35, 35, SPECIES_MACHOP }, { 33, 33, SPECIES_GEODUDE }, { 36, 36, SPECIES_PONYTA }, { 40, 40, SPECIES_FEAROW }, { 38, 38, SPECIES_MAGMAR }, { 39, 39, SPECIES_RAPIDASH }, { 40, 40, SPECIES_MAGMAR }, { 42, 42, SPECIES_RAPIDASH }, }; const struct WildPokemonInfo sMtEmberExterior_LeafGreen_LandMonsInfo = { 21, sMtEmberExterior_LeafGreen_LandMons }; const struct WildPokemon sMtEmberExterior_LeafGreen_RockSmashMons[] = { { 5, 20, SPECIES_GEODUDE }, { 10, 20, SPECIES_GEODUDE }, { 15, 30, SPECIES_GEODUDE }, { 25, 40, SPECIES_GRAVELER }, { 30, 40, SPECIES_GRAVELER }, }; const struct WildPokemonInfo sMtEmberExterior_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberExterior_LeafGreen_RockSmashMons }; const struct WildPokemon sMtEmberSummitPath1F_LeafGreen_LandMons[] = { { 33, 33, SPECIES_GEODUDE }, { 35, 35, SPECIES_MACHOP }, { 29, 29, SPECIES_GEODUDE }, { 31, 31, SPECIES_GEODUDE }, { 31, 31, SPECIES_MACHOP }, { 33, 33, SPECIES_MACHOP }, { 35, 35, SPECIES_GEODUDE }, { 37, 37, SPECIES_MACHOP }, { 37, 37, SPECIES_GEODUDE }, { 39, 39, SPECIES_MACHOP }, { 37, 37, SPECIES_GEODUDE }, { 39, 39, SPECIES_MACHOP }, }; const struct WildPokemonInfo sMtEmberSummitPath1F_LeafGreen_LandMonsInfo = { 7, sMtEmberSummitPath1F_LeafGreen_LandMons }; const struct WildPokemon sMtEmberSummitPath2F_LeafGreen_LandMons[] = { { 34, 34, SPECIES_GEODUDE }, { 36, 36, SPECIES_MACHOP }, { 30, 30, SPECIES_GEODUDE }, { 32, 32, SPECIES_GEODUDE }, { 32, 32, SPECIES_MACHOP }, { 34, 34, SPECIES_MACHOP }, { 38, 38, SPECIES_MACHOKE }, { 38, 38, SPECIES_MACHOKE }, { 40, 40, SPECIES_MACHOKE }, { 40, 40, SPECIES_MACHOKE }, { 40, 40, SPECIES_MACHOKE }, { 40, 40, SPECIES_MACHOKE }, }; const struct WildPokemonInfo sMtEmberSummitPath2F_LeafGreen_LandMonsInfo = { 7, sMtEmberSummitPath2F_LeafGreen_LandMons }; const struct WildPokemon sMtEmberSummitPath2F_LeafGreen_RockSmashMons[] = { { 5, 20, SPECIES_GEODUDE }, { 10, 20, SPECIES_GEODUDE }, { 15, 30, SPECIES_GEODUDE }, { 25, 40, SPECIES_GRAVELER }, { 30, 40, SPECIES_GRAVELER }, }; const struct WildPokemonInfo sMtEmberSummitPath2F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberSummitPath2F_LeafGreen_RockSmashMons }; const struct WildPokemon sMtEmberSummitPath3F_LeafGreen_LandMons[] = { { 33, 33, SPECIES_GEODUDE }, { 35, 35, SPECIES_MACHOP }, { 29, 29, SPECIES_GEODUDE }, { 31, 31, SPECIES_GEODUDE }, { 31, 31, SPECIES_MACHOP }, { 33, 33, SPECIES_MACHOP }, { 35, 35, SPECIES_GEODUDE }, { 37, 37, SPECIES_MACHOP }, { 37, 37, SPECIES_GEODUDE }, { 39, 39, SPECIES_MACHOP }, { 37, 37, SPECIES_GEODUDE }, { 39, 39, SPECIES_MACHOP }, }; const struct WildPokemonInfo sMtEmberSummitPath3F_LeafGreen_LandMonsInfo = { 7, sMtEmberSummitPath3F_LeafGreen_LandMons }; const struct WildPokemon sMtEmberRubyPath1F_LeafGreen_LandMons[] = { { 36, 36, SPECIES_GEODUDE }, { 38, 38, SPECIES_MACHOP }, { 32, 32, SPECIES_GEODUDE }, { 34, 34, SPECIES_GEODUDE }, { 34, 34, SPECIES_MACHOP }, { 36, 36, SPECIES_MACHOP }, { 38, 38, SPECIES_GEODUDE }, { 40, 40, SPECIES_MACHOKE }, { 40, 40, SPECIES_GEODUDE }, { 42, 42, SPECIES_MACHOKE }, { 40, 40, SPECIES_GEODUDE }, { 42, 42, SPECIES_MACHOKE }, }; const struct WildPokemonInfo sMtEmberRubyPath1F_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPath1F_LeafGreen_LandMons }; const struct WildPokemon sMtEmberRubyPath1F_LeafGreen_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPath1F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPath1F_LeafGreen_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB1F_LeafGreen_LandMons[] = { { 38, 38, SPECIES_GEODUDE }, { 36, 36, SPECIES_GEODUDE }, { 34, 34, SPECIES_GEODUDE }, { 40, 40, SPECIES_GEODUDE }, { 24, 24, SPECIES_SLUGMA }, { 26, 26, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 28, 28, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 30, 30, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 30, 30, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB1F_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB1F_LeafGreen_LandMons }; const struct WildPokemon sMtEmberRubyPathB1F_LeafGreen_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPathB1F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB1F_LeafGreen_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB2F_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GEODUDE }, { 26, 26, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 24, 24, SPECIES_SLUGMA }, { 28, 28, SPECIES_SLUGMA }, { 30, 30, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 32, 32, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 22, 22, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 22, 22, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB2F_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB2F_LeafGreen_LandMons }; const struct WildPokemon sMtEmberRubyPathB2F_LeafGreen_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPathB2F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB2F_LeafGreen_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB3F_LeafGreen_LandMons[] = { { 26, 26, SPECIES_SLUGMA }, { 28, 28, SPECIES_SLUGMA }, { 30, 30, SPECIES_SLUGMA }, { 32, 32, SPECIES_SLUGMA }, { 24, 24, SPECIES_SLUGMA }, { 22, 22, SPECIES_SLUGMA }, { 20, 20, SPECIES_SLUGMA }, { 34, 34, SPECIES_SLUGMA }, { 36, 36, SPECIES_SLUGMA }, { 18, 18, SPECIES_SLUGMA }, { 36, 36, SPECIES_SLUGMA }, { 18, 18, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB3F_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB3F_LeafGreen_LandMons }; const struct WildPokemon sMtEmberRubyPathB3F_LeafGreen_RockSmashMons[] = { { 15, 25, SPECIES_SLUGMA }, { 25, 35, SPECIES_SLUGMA }, { 40, 45, SPECIES_MAGCARGO }, { 35, 45, SPECIES_MAGCARGO }, { 25, 35, SPECIES_MAGCARGO }, }; const struct WildPokemonInfo sMtEmberRubyPathB3F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB3F_LeafGreen_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB1FStairs_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GEODUDE }, { 26, 26, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 24, 24, SPECIES_SLUGMA }, { 28, 28, SPECIES_SLUGMA }, { 30, 30, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 32, 32, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 22, 22, SPECIES_SLUGMA }, { 44, 44, SPECIES_GEODUDE }, { 22, 22, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB1FStairs_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB1FStairs_LeafGreen_LandMons }; const struct WildPokemon sMtEmberRubyPathB1FStairs_LeafGreen_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPathB1FStairs_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB1FStairs_LeafGreen_RockSmashMons }; const struct WildPokemon sMtEmberRubyPathB2FStairs_LeafGreen_LandMons[] = { { 38, 38, SPECIES_GEODUDE }, { 36, 36, SPECIES_GEODUDE }, { 34, 34, SPECIES_GEODUDE }, { 40, 40, SPECIES_GEODUDE }, { 24, 24, SPECIES_SLUGMA }, { 26, 26, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 28, 28, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 30, 30, SPECIES_SLUGMA }, { 42, 42, SPECIES_GEODUDE }, { 30, 30, SPECIES_SLUGMA }, }; const struct WildPokemonInfo sMtEmberRubyPathB2FStairs_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB2FStairs_LeafGreen_LandMons }; const struct WildPokemon sMtEmberRubyPathB2FStairs_LeafGreen_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sMtEmberRubyPathB2FStairs_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB2FStairs_LeafGreen_RockSmashMons }; const struct WildPokemon sThreeIslandBerryForest_LeafGreen_LandMons[] = { { 37, 37, SPECIES_PIDGEOTTO }, { 35, 35, SPECIES_WEEPINBELL }, { 32, 32, SPECIES_PIDGEY }, { 30, 30, SPECIES_BELLSPROUT }, { 34, 34, SPECIES_VENONAT }, { 34, 34, SPECIES_DROWZEE }, { 35, 35, SPECIES_EXEGGCUTE }, { 31, 31, SPECIES_SLOWPOKE }, { 37, 37, SPECIES_VENOMOTH }, { 37, 37, SPECIES_HYPNO }, { 40, 40, SPECIES_VENOMOTH }, { 40, 40, SPECIES_HYPNO }, }; const struct WildPokemonInfo sThreeIslandBerryForest_LeafGreen_LandMonsInfo = { 21, sThreeIslandBerryForest_LeafGreen_LandMons }; const struct WildPokemon sThreeIslandBerryForest_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_SLOWPOKE }, { 20, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWBRO }, { 35, 40, SPECIES_SLOWBRO }, }; const struct WildPokemonInfo sThreeIslandBerryForest_LeafGreen_WaterMonsInfo = { 2, sThreeIslandBerryForest_LeafGreen_WaterMons }; const struct WildPokemon sThreeIslandBerryForest_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sThreeIslandBerryForest_LeafGreen_FishingMonsInfo = { 20, sThreeIslandBerryForest_LeafGreen_FishingMons }; const struct WildPokemon sFourIslandIcefallCaveEntrance_LeafGreen_LandMons[] = { { 43, 43, SPECIES_SEEL }, { 45, 45, SPECIES_GOLBAT }, { 45, 45, SPECIES_SEEL }, { 47, 47, SPECIES_SEEL }, { 40, 40, SPECIES_ZUBAT }, { 49, 49, SPECIES_DEWGONG }, { 51, 51, SPECIES_DEWGONG }, { 41, 41, SPECIES_SLOWPOKE }, { 48, 48, SPECIES_GOLBAT }, { 53, 53, SPECIES_DEWGONG }, { 48, 48, SPECIES_GOLBAT }, { 53, 53, SPECIES_DEWGONG }, }; const struct WildPokemonInfo sFourIslandIcefallCaveEntrance_LeafGreen_LandMonsInfo = { 7, sFourIslandIcefallCaveEntrance_LeafGreen_LandMons }; const struct WildPokemon sFourIslandIcefallCaveEntrance_LeafGreen_WaterMons[] = { { 5, 35, SPECIES_SEEL }, { 5, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_DEWGONG }, { 5, 15, SPECIES_MARILL }, { 5, 15, SPECIES_MARILL }, }; const struct WildPokemonInfo sFourIslandIcefallCaveEntrance_LeafGreen_WaterMonsInfo = { 2, sFourIslandIcefallCaveEntrance_LeafGreen_WaterMons }; const struct WildPokemon sFourIslandIcefallCaveEntrance_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFourIslandIcefallCaveEntrance_LeafGreen_FishingMonsInfo = { 20, sFourIslandIcefallCaveEntrance_LeafGreen_FishingMons }; const struct WildPokemon sFourIslandIcefallCave1F_LeafGreen_LandMons[] = { { 25, 25, SPECIES_SWINUB }, { 45, 45, SPECIES_GOLBAT }, { 45, 45, SPECIES_SEEL }, { 27, 27, SPECIES_SWINUB }, { 40, 40, SPECIES_ZUBAT }, { 29, 29, SPECIES_SWINUB }, { 30, 30, SPECIES_SNEASEL }, { 31, 31, SPECIES_SWINUB }, { 48, 48, SPECIES_GOLBAT }, { 23, 23, SPECIES_SWINUB }, { 48, 48, SPECIES_GOLBAT }, { 23, 23, SPECIES_SWINUB }, }; const struct WildPokemonInfo sFourIslandIcefallCave1F_LeafGreen_LandMonsInfo = { 7, sFourIslandIcefallCave1F_LeafGreen_LandMons }; const struct WildPokemon sFourIslandIcefallCaveB1F_LeafGreen_LandMons[] = { { 25, 25, SPECIES_SWINUB }, { 45, 45, SPECIES_GOLBAT }, { 45, 45, SPECIES_SEEL }, { 27, 27, SPECIES_SWINUB }, { 40, 40, SPECIES_ZUBAT }, { 29, 29, SPECIES_SWINUB }, { 30, 30, SPECIES_SNEASEL }, { 31, 31, SPECIES_SWINUB }, { 48, 48, SPECIES_GOLBAT }, { 23, 23, SPECIES_SWINUB }, { 48, 48, SPECIES_GOLBAT }, { 23, 23, SPECIES_SWINUB }, }; const struct WildPokemonInfo sFourIslandIcefallCaveB1F_LeafGreen_LandMonsInfo = { 7, sFourIslandIcefallCaveB1F_LeafGreen_LandMons }; const struct WildPokemon sFourIslandIcefallCaveBack_LeafGreen_LandMons[] = { { 43, 43, SPECIES_SEEL }, { 45, 45, SPECIES_GOLBAT }, { 45, 45, SPECIES_SEEL }, { 47, 47, SPECIES_SEEL }, { 40, 40, SPECIES_ZUBAT }, { 49, 49, SPECIES_DEWGONG }, { 51, 51, SPECIES_DEWGONG }, { 41, 41, SPECIES_SLOWPOKE }, { 48, 48, SPECIES_GOLBAT }, { 53, 53, SPECIES_DEWGONG }, { 48, 48, SPECIES_GOLBAT }, { 53, 53, SPECIES_DEWGONG }, }; const struct WildPokemonInfo sFourIslandIcefallCaveBack_LeafGreen_LandMonsInfo = { 7, sFourIslandIcefallCaveBack_LeafGreen_LandMons }; const struct WildPokemon sFourIslandIcefallCaveBack_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 45, SPECIES_TENTACOOL }, { 35, 45, SPECIES_TENTACRUEL }, { 30, 45, SPECIES_LAPRAS }, }; const struct WildPokemonInfo sFourIslandIcefallCaveBack_LeafGreen_WaterMonsInfo = { 2, sFourIslandIcefallCaveBack_LeafGreen_WaterMons }; const struct WildPokemon sFourIslandIcefallCaveBack_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_STARYU }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFourIslandIcefallCaveBack_LeafGreen_FishingMonsInfo = { 20, sFourIslandIcefallCaveBack_LeafGreen_FishingMons }; const struct WildPokemon sSixIslandPatternBush_LeafGreen_LandMons[] = { { 9, 9, SPECIES_LEDYBA }, { 9, 9, SPECIES_KAKUNA }, { 14, 14, SPECIES_LEDYBA }, { 6, 6, SPECIES_CATERPIE }, { 6, 6, SPECIES_WEEDLE }, { 15, 15, SPECIES_HERACROSS }, { 9, 9, SPECIES_METAPOD }, { 20, 20, SPECIES_HERACROSS }, { 9, 9, SPECIES_SPINARAK }, { 25, 25, SPECIES_HERACROSS }, { 14, 14, SPECIES_SPINARAK }, { 30, 30, SPECIES_HERACROSS }, }; const struct WildPokemonInfo sSixIslandPatternBush_LeafGreen_LandMonsInfo = { 21, sSixIslandPatternBush_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom1_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom1_LeafGreen_LandMonsInfo = { 1, sFiveIslandLostCaveRoom1_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom2_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom2_LeafGreen_LandMonsInfo = { 2, sFiveIslandLostCaveRoom2_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom3_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom3_LeafGreen_LandMonsInfo = { 3, sFiveIslandLostCaveRoom3_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom4_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom4_LeafGreen_LandMonsInfo = { 4, sFiveIslandLostCaveRoom4_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom5_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom5_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom5_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom6_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom6_LeafGreen_LandMonsInfo = { 6, sFiveIslandLostCaveRoom6_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom7_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom7_LeafGreen_LandMonsInfo = { 7, sFiveIslandLostCaveRoom7_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom8_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom8_LeafGreen_LandMonsInfo = { 8, sFiveIslandLostCaveRoom8_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom9_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom9_LeafGreen_LandMonsInfo = { 9, sFiveIslandLostCaveRoom9_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom10_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 43, 43, SPECIES_GOLBAT }, { 38, 38, SPECIES_GASTLY }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom10_LeafGreen_LandMonsInfo = { 10, sFiveIslandLostCaveRoom10_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom11_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 15, 15, SPECIES_MISDREAVUS }, { 20, 20, SPECIES_MISDREAVUS }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom11_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom11_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom12_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 15, 15, SPECIES_MISDREAVUS }, { 20, 20, SPECIES_MISDREAVUS }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom12_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom12_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom13_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 15, 15, SPECIES_MISDREAVUS }, { 20, 20, SPECIES_MISDREAVUS }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom13_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom13_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandLostCaveRoom14_LeafGreen_LandMons[] = { { 40, 40, SPECIES_GASTLY }, { 37, 37, SPECIES_ZUBAT }, { 44, 44, SPECIES_HAUNTER }, { 46, 46, SPECIES_HAUNTER }, { 41, 41, SPECIES_GOLBAT }, { 15, 15, SPECIES_MISDREAVUS }, { 20, 20, SPECIES_MISDREAVUS }, { 48, 48, SPECIES_HAUNTER }, { 50, 50, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, { 52, 52, SPECIES_HAUNTER }, { 22, 22, SPECIES_MISDREAVUS }, }; const struct WildPokemonInfo sFiveIslandLostCaveRoom14_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom14_LeafGreen_LandMons }; const struct WildPokemon sOneIslandKindleRoad_LeafGreen_LandMons[] = { { 32, 32, SPECIES_SPEAROW }, { 34, 34, SPECIES_PONYTA }, { 36, 36, SPECIES_FEAROW }, { 31, 31, SPECIES_PONYTA }, { 31, 31, SPECIES_GEODUDE }, { 31, 31, SPECIES_MEOWTH }, { 30, 30, SPECIES_SPEAROW }, { 34, 34, SPECIES_SLOWPOKE }, { 37, 37, SPECIES_RAPIDASH }, { 37, 37, SPECIES_PERSIAN }, { 40, 40, SPECIES_RAPIDASH }, { 40, 40, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sOneIslandKindleRoad_LeafGreen_LandMonsInfo = { 21, sOneIslandKindleRoad_LeafGreen_LandMons }; const struct WildPokemon sOneIslandKindleRoad_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sOneIslandKindleRoad_LeafGreen_WaterMonsInfo = { 2, sOneIslandKindleRoad_LeafGreen_WaterMons }; const struct WildPokemon sOneIslandKindleRoad_LeafGreen_RockSmashMons[] = { { 5, 20, SPECIES_GEODUDE }, { 10, 20, SPECIES_GEODUDE }, { 15, 30, SPECIES_GEODUDE }, { 25, 40, SPECIES_GRAVELER }, { 30, 40, SPECIES_GRAVELER }, }; const struct WildPokemonInfo sOneIslandKindleRoad_LeafGreen_RockSmashMonsInfo = { 25, sOneIslandKindleRoad_LeafGreen_RockSmashMons }; const struct WildPokemon sOneIslandKindleRoad_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sOneIslandKindleRoad_LeafGreen_FishingMonsInfo = { 20, sOneIslandKindleRoad_LeafGreen_FishingMons }; const struct WildPokemon sOneIslandTreasureBeach_LeafGreen_LandMons[] = { { 32, 32, SPECIES_SPEAROW }, { 33, 33, SPECIES_TANGELA }, { 31, 31, SPECIES_SPEAROW }, { 35, 35, SPECIES_TANGELA }, { 36, 36, SPECIES_FEAROW }, { 31, 31, SPECIES_MEOWTH }, { 38, 38, SPECIES_FEAROW }, { 31, 31, SPECIES_SLOWPOKE }, { 40, 40, SPECIES_FEAROW }, { 37, 37, SPECIES_PERSIAN }, { 40, 40, SPECIES_FEAROW }, { 40, 40, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sOneIslandTreasureBeach_LeafGreen_LandMonsInfo = { 21, sOneIslandTreasureBeach_LeafGreen_LandMons }; const struct WildPokemon sOneIslandTreasureBeach_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sOneIslandTreasureBeach_LeafGreen_WaterMonsInfo = { 2, sOneIslandTreasureBeach_LeafGreen_WaterMons }; const struct WildPokemon sOneIslandTreasureBeach_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sOneIslandTreasureBeach_LeafGreen_FishingMonsInfo = { 20, sOneIslandTreasureBeach_LeafGreen_FishingMons }; const struct WildPokemon sTwoIslandCapeBrink_LeafGreen_LandMons[] = { { 31, 31, SPECIES_SPEAROW }, { 30, 30, SPECIES_BELLSPROUT }, { 32, 32, SPECIES_BELLSPROUT }, { 36, 36, SPECIES_WEEPINBELL }, { 36, 36, SPECIES_FEAROW }, { 31, 31, SPECIES_MEOWTH }, { 38, 38, SPECIES_WEEPINBELL }, { 31, 31, SPECIES_SLOWPOKE }, { 37, 37, SPECIES_SLOWBRO }, { 37, 37, SPECIES_PERSIAN }, { 40, 40, SPECIES_SLOWBRO }, { 40, 40, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sTwoIslandCapeBrink_LeafGreen_LandMonsInfo = { 21, sTwoIslandCapeBrink_LeafGreen_LandMons }; const struct WildPokemon sTwoIslandCapeBrink_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_SLOWPOKE }, { 20, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWBRO }, { 35, 40, SPECIES_SLOWBRO }, }; const struct WildPokemonInfo sTwoIslandCapeBrink_LeafGreen_WaterMonsInfo = { 2, sTwoIslandCapeBrink_LeafGreen_WaterMons }; const struct WildPokemon sTwoIslandCapeBrink_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sTwoIslandCapeBrink_LeafGreen_FishingMonsInfo = { 20, sTwoIslandCapeBrink_LeafGreen_FishingMons }; const struct WildPokemon sThreeIslandBondBridge_LeafGreen_LandMons[] = { { 32, 32, SPECIES_PIDGEY }, { 31, 31, SPECIES_BELLSPROUT }, { 29, 29, SPECIES_PIDGEY }, { 36, 36, SPECIES_WEEPINBELL }, { 34, 34, SPECIES_PIDGEOTTO }, { 31, 31, SPECIES_MEOWTH }, { 34, 34, SPECIES_VENONAT }, { 31, 31, SPECIES_SLOWPOKE }, { 37, 37, SPECIES_PIDGEOTTO }, { 37, 37, SPECIES_PERSIAN }, { 40, 40, SPECIES_PIDGEOTTO }, { 40, 40, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sThreeIslandBondBridge_LeafGreen_LandMonsInfo = { 21, sThreeIslandBondBridge_LeafGreen_LandMons }; const struct WildPokemon sThreeIslandBondBridge_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sThreeIslandBondBridge_LeafGreen_WaterMonsInfo = { 2, sThreeIslandBondBridge_LeafGreen_WaterMons }; const struct WildPokemon sThreeIslandBondBridge_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sThreeIslandBondBridge_LeafGreen_FishingMonsInfo = { 20, sThreeIslandBondBridge_LeafGreen_FishingMons }; const struct WildPokemon sThreeIslandPort_LeafGreen_LandMons[] = { { 15, 15, SPECIES_DUNSPARCE }, { 15, 15, SPECIES_DUNSPARCE }, { 10, 10, SPECIES_DUNSPARCE }, { 10, 10, SPECIES_DUNSPARCE }, { 20, 20, SPECIES_DUNSPARCE }, { 20, 20, SPECIES_DUNSPARCE }, { 25, 25, SPECIES_DUNSPARCE }, { 30, 30, SPECIES_DUNSPARCE }, { 25, 25, SPECIES_DUNSPARCE }, { 30, 30, SPECIES_DUNSPARCE }, { 5, 5, SPECIES_DUNSPARCE }, { 35, 35, SPECIES_DUNSPARCE }, }; const struct WildPokemonInfo sThreeIslandPort_LeafGreen_LandMonsInfo = { 1, sThreeIslandPort_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandResortGorgeous_LeafGreen_WaterMons[] = { { 5, 35, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIslandResortGorgeous_LeafGreen_WaterMonsInfo = { 2, sFiveIslandResortGorgeous_LeafGreen_WaterMons }; const struct WildPokemon sFiveIslandResortGorgeous_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_REMORAID }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFiveIslandResortGorgeous_LeafGreen_FishingMonsInfo = { 20, sFiveIslandResortGorgeous_LeafGreen_FishingMons }; const struct WildPokemon sFiveIslandWaterLabyrinth_LeafGreen_WaterMons[] = { { 5, 35, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIslandWaterLabyrinth_LeafGreen_WaterMonsInfo = { 2, sFiveIslandWaterLabyrinth_LeafGreen_WaterMons }; const struct WildPokemon sFiveIslandWaterLabyrinth_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_REMORAID }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFiveIslandWaterLabyrinth_LeafGreen_FishingMonsInfo = { 20, sFiveIslandWaterLabyrinth_LeafGreen_FishingMons }; const struct WildPokemon sFiveIslandMeadow_LeafGreen_LandMons[] = { { 44, 44, SPECIES_PIDGEY }, { 10, 10, SPECIES_SENTRET }, { 48, 48, SPECIES_PIDGEOTTO }, { 10, 10, SPECIES_HOPPIP }, { 15, 15, SPECIES_SENTRET }, { 41, 41, SPECIES_MEOWTH }, { 15, 15, SPECIES_HOPPIP }, { 41, 41, SPECIES_SLOWPOKE }, { 50, 50, SPECIES_PIDGEOTTO }, { 47, 47, SPECIES_PERSIAN }, { 50, 50, SPECIES_PIDGEOTTO }, { 50, 50, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sFiveIslandMeadow_LeafGreen_LandMonsInfo = { 21, sFiveIslandMeadow_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandMeadow_LeafGreen_WaterMons[] = { { 5, 35, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIslandMeadow_LeafGreen_WaterMonsInfo = { 2, sFiveIslandMeadow_LeafGreen_WaterMons }; const struct WildPokemon sFiveIslandMeadow_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_REMORAID }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFiveIslandMeadow_LeafGreen_FishingMonsInfo = { 20, sFiveIslandMeadow_LeafGreen_FishingMons }; const struct WildPokemon sFiveIslandMemorialPillar_LeafGreen_LandMons[] = { { 10, 10, SPECIES_HOPPIP }, { 12, 12, SPECIES_HOPPIP }, { 8, 8, SPECIES_HOPPIP }, { 14, 14, SPECIES_HOPPIP }, { 10, 10, SPECIES_HOPPIP }, { 12, 12, SPECIES_HOPPIP }, { 16, 16, SPECIES_HOPPIP }, { 6, 6, SPECIES_HOPPIP }, { 8, 8, SPECIES_HOPPIP }, { 14, 14, SPECIES_HOPPIP }, { 8, 8, SPECIES_HOPPIP }, { 14, 14, SPECIES_HOPPIP }, }; const struct WildPokemonInfo sFiveIslandMemorialPillar_LeafGreen_LandMonsInfo = { 21, sFiveIslandMemorialPillar_LeafGreen_LandMons }; const struct WildPokemon sFiveIslandMemorialPillar_LeafGreen_WaterMons[] = { { 5, 35, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIslandMemorialPillar_LeafGreen_WaterMonsInfo = { 2, sFiveIslandMemorialPillar_LeafGreen_WaterMons }; const struct WildPokemon sFiveIslandMemorialPillar_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_REMORAID }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFiveIslandMemorialPillar_LeafGreen_FishingMonsInfo = { 20, sFiveIslandMemorialPillar_LeafGreen_FishingMons }; const struct WildPokemon sSixIslandOutcastIsland_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSixIslandOutcastIsland_LeafGreen_WaterMonsInfo = { 2, sSixIslandOutcastIsland_LeafGreen_WaterMons }; const struct WildPokemon sSixIslandOutcastIsland_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_REMORAID }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSixIslandOutcastIsland_LeafGreen_FishingMonsInfo = { 20, sSixIslandOutcastIsland_LeafGreen_FishingMons }; const struct WildPokemon sSixIslandGreenPath_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSixIslandGreenPath_LeafGreen_WaterMonsInfo = { 2, sSixIslandGreenPath_LeafGreen_WaterMons }; const struct WildPokemon sSixIslandGreenPath_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_REMORAID }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSixIslandGreenPath_LeafGreen_FishingMonsInfo = { 20, sSixIslandGreenPath_LeafGreen_FishingMons }; const struct WildPokemon sSixIslandWaterPath_LeafGreen_LandMons[] = { { 44, 44, SPECIES_SPEAROW }, { 10, 10, SPECIES_SENTRET }, { 44, 44, SPECIES_BELLSPROUT }, { 48, 48, SPECIES_FEAROW }, { 15, 15, SPECIES_SENTRET }, { 41, 41, SPECIES_MEOWTH }, { 48, 48, SPECIES_WEEPINBELL }, { 41, 41, SPECIES_SLOWPOKE }, { 50, 50, SPECIES_FEAROW }, { 47, 47, SPECIES_PERSIAN }, { 50, 50, SPECIES_FEAROW }, { 50, 50, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sSixIslandWaterPath_LeafGreen_LandMonsInfo = { 21, sSixIslandWaterPath_LeafGreen_LandMons }; const struct WildPokemon sSixIslandWaterPath_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSixIslandWaterPath_LeafGreen_WaterMonsInfo = { 2, sSixIslandWaterPath_LeafGreen_WaterMons }; const struct WildPokemon sSixIslandWaterPath_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_REMORAID }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSixIslandWaterPath_LeafGreen_FishingMonsInfo = { 20, sSixIslandWaterPath_LeafGreen_FishingMons }; const struct WildPokemon sSixIslandRuinValley_LeafGreen_LandMons[] = { { 15, 15, SPECIES_NATU }, { 44, 44, SPECIES_SPEAROW }, { 18, 18, SPECIES_YANMA }, { 15, 15, SPECIES_MARILL }, { 49, 49, SPECIES_FEAROW }, { 43, 43, SPECIES_MEOWTH }, { 25, 25, SPECIES_WOBBUFFET }, { 41, 41, SPECIES_SLOWPOKE }, { 20, 20, SPECIES_NATU }, { 49, 49, SPECIES_PERSIAN }, { 20, 20, SPECIES_NATU }, { 52, 52, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sSixIslandRuinValley_LeafGreen_LandMonsInfo = { 21, sSixIslandRuinValley_LeafGreen_LandMons }; const struct WildPokemon sSixIslandRuinValley_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_MARILL }, { 10, 20, SPECIES_MARILL }, { 15, 25, SPECIES_MARILL }, { 20, 25, SPECIES_MARILL }, { 20, 25, SPECIES_MARILL }, }; const struct WildPokemonInfo sSixIslandRuinValley_LeafGreen_WaterMonsInfo = { 2, sSixIslandRuinValley_LeafGreen_WaterMons }; const struct WildPokemon sSixIslandRuinValley_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSixIslandRuinValley_LeafGreen_FishingMonsInfo = { 20, sSixIslandRuinValley_LeafGreen_FishingMons }; const struct WildPokemon sSevenIslandTrainerTower_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_MANTINE }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSevenIslandTrainerTower_LeafGreen_WaterMonsInfo = { 2, sSevenIslandTrainerTower_LeafGreen_WaterMons }; const struct WildPokemon sSevenIslandTrainerTower_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_REMORAID }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSevenIslandTrainerTower_LeafGreen_FishingMonsInfo = { 20, sSevenIslandTrainerTower_LeafGreen_FishingMons }; const struct WildPokemon sSevenIslandSevaultCanyonEntrance_LeafGreen_LandMons[] = { { 44, 44, SPECIES_SPEAROW }, { 10, 10, SPECIES_SENTRET }, { 10, 10, SPECIES_PHANPY }, { 48, 48, SPECIES_FEAROW }, { 15, 15, SPECIES_SENTRET }, { 41, 41, SPECIES_MEOWTH }, { 50, 50, SPECIES_FEAROW }, { 41, 41, SPECIES_SLOWPOKE }, { 15, 15, SPECIES_PHANPY }, { 47, 47, SPECIES_PERSIAN }, { 15, 15, SPECIES_PHANPY }, { 50, 50, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sSevenIslandSevaultCanyonEntrance_LeafGreen_LandMonsInfo = { 21, sSevenIslandSevaultCanyonEntrance_LeafGreen_LandMons }; const struct WildPokemon sSevenIslandSevaultCanyon_LeafGreen_LandMons[] = { { 46, 46, SPECIES_GEODUDE }, { 15, 15, SPECIES_PHANPY }, { 46, 46, SPECIES_CUBONE }, { 50, 50, SPECIES_FEAROW }, { 52, 52, SPECIES_MAROWAK }, { 43, 43, SPECIES_MEOWTH }, { 54, 54, SPECIES_ONIX }, { 50, 50, SPECIES_FEAROW }, { 15, 15, SPECIES_LARVITAR }, { 49, 49, SPECIES_PERSIAN }, { 20, 20, SPECIES_LARVITAR }, { 52, 52, SPECIES_PERSIAN }, }; const struct WildPokemonInfo sSevenIslandSevaultCanyon_LeafGreen_LandMonsInfo = { 21, sSevenIslandSevaultCanyon_LeafGreen_LandMons }; const struct WildPokemon sSevenIslandSevaultCanyon_LeafGreen_RockSmashMons[] = { { 25, 35, SPECIES_GEODUDE }, { 30, 45, SPECIES_GRAVELER }, { 35, 50, SPECIES_GRAVELER }, { 30, 40, SPECIES_GEODUDE }, { 30, 40, SPECIES_GEODUDE }, }; const struct WildPokemonInfo sSevenIslandSevaultCanyon_LeafGreen_RockSmashMonsInfo = { 25, sSevenIslandSevaultCanyon_LeafGreen_RockSmashMons }; const struct WildPokemon sSevenIslandTanobyRuins_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_MANTINE }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sSevenIslandTanobyRuins_LeafGreen_WaterMonsInfo = { 2, sSevenIslandTanobyRuins_LeafGreen_WaterMons }; const struct WildPokemon sSevenIslandTanobyRuins_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_REMORAID }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sSevenIslandTanobyRuins_LeafGreen_FishingMonsInfo = { 20, sSevenIslandTanobyRuins_LeafGreen_FishingMons }; const struct WildPokemon sRoute1_LeafGreen_LandMons[] = { { 3, 3, SPECIES_PIDGEY }, { 3, 3, SPECIES_RATTATA }, { 3, 3, SPECIES_PIDGEY }, { 3, 3, SPECIES_RATTATA }, { 2, 2, SPECIES_PIDGEY }, { 2, 2, SPECIES_RATTATA }, { 3, 3, SPECIES_PIDGEY }, { 3, 3, SPECIES_RATTATA }, { 4, 4, SPECIES_PIDGEY }, { 4, 4, SPECIES_RATTATA }, { 5, 5, SPECIES_PIDGEY }, { 4, 4, SPECIES_RATTATA }, }; const struct WildPokemonInfo sRoute1_LeafGreen_LandMonsInfo = { 21, sRoute1_LeafGreen_LandMons }; const struct WildPokemon sRoute2_LeafGreen_LandMons[] = { { 3, 3, SPECIES_RATTATA }, { 3, 3, SPECIES_PIDGEY }, { 4, 4, SPECIES_RATTATA }, { 4, 4, SPECIES_PIDGEY }, { 2, 2, SPECIES_RATTATA }, { 2, 2, SPECIES_PIDGEY }, { 5, 5, SPECIES_RATTATA }, { 5, 5, SPECIES_PIDGEY }, { 4, 4, SPECIES_CATERPIE }, { 4, 4, SPECIES_WEEDLE }, { 5, 5, SPECIES_CATERPIE }, { 5, 5, SPECIES_WEEDLE }, }; const struct WildPokemonInfo sRoute2_LeafGreen_LandMonsInfo = { 21, sRoute2_LeafGreen_LandMons }; const struct WildPokemon sRoute3_LeafGreen_LandMons[] = { { 6, 6, SPECIES_SPEAROW }, { 6, 6, SPECIES_PIDGEY }, { 7, 7, SPECIES_SPEAROW }, { 7, 7, SPECIES_MANKEY }, { 6, 6, SPECIES_NIDORAN_F }, { 7, 7, SPECIES_PIDGEY }, { 8, 8, SPECIES_SPEAROW }, { 3, 3, SPECIES_JIGGLYPUFF }, { 7, 7, SPECIES_NIDORAN_F }, { 5, 5, SPECIES_JIGGLYPUFF }, { 6, 6, SPECIES_NIDORAN_M }, { 7, 7, SPECIES_JIGGLYPUFF }, }; const struct WildPokemonInfo sRoute3_LeafGreen_LandMonsInfo = { 21, sRoute3_LeafGreen_LandMons }; const struct WildPokemon sRoute4_LeafGreen_LandMons[] = { { 10, 10, SPECIES_SPEAROW }, { 10, 10, SPECIES_RATTATA }, { 6, 6, SPECIES_SANDSHREW }, { 10, 10, SPECIES_SANDSHREW }, { 8, 8, SPECIES_SPEAROW }, { 8, 8, SPECIES_RATTATA }, { 12, 12, SPECIES_SPEAROW }, { 12, 12, SPECIES_RATTATA }, { 10, 10, SPECIES_MANKEY }, { 8, 8, SPECIES_SANDSHREW }, { 12, 12, SPECIES_MANKEY }, { 12, 12, SPECIES_SANDSHREW }, }; const struct WildPokemonInfo sRoute4_LeafGreen_LandMonsInfo = { 21, sRoute4_LeafGreen_LandMons }; const struct WildPokemon sRoute4_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute4_LeafGreen_WaterMonsInfo = { 2, sRoute4_LeafGreen_WaterMons }; const struct WildPokemon sRoute4_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KRABBY }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute4_LeafGreen_FishingMonsInfo = { 20, sRoute4_LeafGreen_FishingMons }; const struct WildPokemon sRoute5_LeafGreen_LandMons[] = { { 10, 10, SPECIES_MEOWTH }, { 13, 13, SPECIES_PIDGEY }, { 13, 13, SPECIES_BELLSPROUT }, { 12, 12, SPECIES_MEOWTH }, { 15, 15, SPECIES_BELLSPROUT }, { 15, 15, SPECIES_PIDGEY }, { 16, 16, SPECIES_BELLSPROUT }, { 16, 16, SPECIES_PIDGEY }, { 15, 15, SPECIES_PIDGEY }, { 14, 14, SPECIES_MEOWTH }, { 15, 15, SPECIES_PIDGEY }, { 16, 16, SPECIES_MEOWTH }, }; const struct WildPokemonInfo sRoute5_LeafGreen_LandMonsInfo = { 21, sRoute5_LeafGreen_LandMons }; const struct WildPokemon sRoute6_LeafGreen_LandMons[] = { { 10, 10, SPECIES_MEOWTH }, { 13, 13, SPECIES_PIDGEY }, { 13, 13, SPECIES_BELLSPROUT }, { 12, 12, SPECIES_MEOWTH }, { 15, 15, SPECIES_BELLSPROUT }, { 15, 15, SPECIES_PIDGEY }, { 16, 16, SPECIES_BELLSPROUT }, { 16, 16, SPECIES_PIDGEY }, { 15, 15, SPECIES_PIDGEY }, { 14, 14, SPECIES_MEOWTH }, { 15, 15, SPECIES_PIDGEY }, { 16, 16, SPECIES_MEOWTH }, }; const struct WildPokemonInfo sRoute6_LeafGreen_LandMonsInfo = { 21, sRoute6_LeafGreen_LandMons }; const struct WildPokemon sRoute6_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute6_LeafGreen_WaterMonsInfo = { 2, sRoute6_LeafGreen_WaterMons }; const struct WildPokemon sRoute6_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute6_LeafGreen_FishingMonsInfo = { 20, sRoute6_LeafGreen_FishingMons }; const struct WildPokemon sRoute7_LeafGreen_LandMons[] = { { 19, 19, SPECIES_PIDGEY }, { 17, 17, SPECIES_MEOWTH }, { 19, 19, SPECIES_BELLSPROUT }, { 18, 18, SPECIES_MEOWTH }, { 22, 22, SPECIES_PIDGEY }, { 22, 22, SPECIES_BELLSPROUT }, { 18, 18, SPECIES_VULPIX }, { 20, 20, SPECIES_VULPIX }, { 17, 17, SPECIES_MEOWTH }, { 19, 19, SPECIES_MEOWTH }, { 17, 17, SPECIES_MEOWTH }, { 20, 20, SPECIES_MEOWTH }, }; const struct WildPokemonInfo sRoute7_LeafGreen_LandMonsInfo = { 21, sRoute7_LeafGreen_LandMons }; const struct WildPokemon sRoute8_LeafGreen_LandMons[] = { { 18, 18, SPECIES_PIDGEY }, { 18, 18, SPECIES_MEOWTH }, { 16, 16, SPECIES_VULPIX }, { 20, 20, SPECIES_PIDGEY }, { 20, 20, SPECIES_MEOWTH }, { 17, 17, SPECIES_SANDSHREW }, { 17, 17, SPECIES_VULPIX }, { 19, 19, SPECIES_SANDSHREW }, { 17, 17, SPECIES_SANDSHREW }, { 15, 15, SPECIES_VULPIX }, { 17, 17, SPECIES_SANDSHREW }, { 18, 18, SPECIES_VULPIX }, }; const struct WildPokemonInfo sRoute8_LeafGreen_LandMonsInfo = { 21, sRoute8_LeafGreen_LandMons }; const struct WildPokemon sRoute9_LeafGreen_LandMons[] = { { 16, 16, SPECIES_SPEAROW }, { 16, 16, SPECIES_RATTATA }, { 11, 11, SPECIES_SANDSHREW }, { 15, 15, SPECIES_SANDSHREW }, { 13, 13, SPECIES_SPEAROW }, { 14, 14, SPECIES_RATTATA }, { 17, 17, SPECIES_SPEAROW }, { 17, 17, SPECIES_RATTATA }, { 14, 14, SPECIES_RATTATA }, { 13, 13, SPECIES_SANDSHREW }, { 14, 14, SPECIES_RATTATA }, { 17, 17, SPECIES_SANDSHREW }, }; const struct WildPokemonInfo sRoute9_LeafGreen_LandMonsInfo = { 21, sRoute9_LeafGreen_LandMons }; const struct WildPokemon sRoute10_LeafGreen_LandMons[] = { { 16, 16, SPECIES_SPEAROW }, { 16, 16, SPECIES_VOLTORB }, { 11, 11, SPECIES_SANDSHREW }, { 15, 15, SPECIES_SANDSHREW }, { 13, 13, SPECIES_SPEAROW }, { 14, 14, SPECIES_VOLTORB }, { 17, 17, SPECIES_SPEAROW }, { 17, 17, SPECIES_VOLTORB }, { 14, 14, SPECIES_VOLTORB }, { 13, 13, SPECIES_SANDSHREW }, { 14, 14, SPECIES_VOLTORB }, { 17, 17, SPECIES_SANDSHREW }, }; const struct WildPokemonInfo sRoute10_LeafGreen_LandMonsInfo = { 21, sRoute10_LeafGreen_LandMons }; const struct WildPokemon sRoute10_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute10_LeafGreen_WaterMonsInfo = { 2, sRoute10_LeafGreen_WaterMons }; const struct WildPokemon sRoute10_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KRABBY }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute10_LeafGreen_FishingMonsInfo = { 20, sRoute10_LeafGreen_FishingMons }; const struct WildPokemon sRoute11_LeafGreen_LandMons[] = { { 14, 14, SPECIES_SANDSHREW }, { 15, 15, SPECIES_SPEAROW }, { 12, 12, SPECIES_SANDSHREW }, { 13, 13, SPECIES_SPEAROW }, { 11, 11, SPECIES_DROWZEE }, { 13, 13, SPECIES_DROWZEE }, { 15, 15, SPECIES_SANDSHREW }, { 17, 17, SPECIES_SPEAROW }, { 12, 12, SPECIES_SANDSHREW }, { 15, 15, SPECIES_DROWZEE }, { 12, 12, SPECIES_SANDSHREW }, { 15, 15, SPECIES_DROWZEE }, }; const struct WildPokemonInfo sRoute11_LeafGreen_LandMonsInfo = { 21, sRoute11_LeafGreen_LandMons }; const struct WildPokemon sRoute11_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute11_LeafGreen_WaterMonsInfo = { 2, sRoute11_LeafGreen_WaterMons }; const struct WildPokemon sRoute11_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KRABBY }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute11_LeafGreen_FishingMonsInfo = { 20, sRoute11_LeafGreen_FishingMons }; const struct WildPokemon sRoute12_LeafGreen_LandMons[] = { { 24, 24, SPECIES_BELLSPROUT }, { 24, 24, SPECIES_VENONAT }, { 22, 22, SPECIES_BELLSPROUT }, { 23, 23, SPECIES_PIDGEY }, { 25, 25, SPECIES_PIDGEY }, { 26, 26, SPECIES_VENONAT }, { 26, 26, SPECIES_BELLSPROUT }, { 27, 27, SPECIES_PIDGEY }, { 23, 23, SPECIES_PIDGEY }, { 28, 28, SPECIES_WEEPINBELL }, { 23, 23, SPECIES_PIDGEY }, { 30, 30, SPECIES_WEEPINBELL }, }; const struct WildPokemonInfo sRoute12_LeafGreen_LandMonsInfo = { 21, sRoute12_LeafGreen_LandMons }; const struct WildPokemon sRoute12_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute12_LeafGreen_WaterMonsInfo = { 2, sRoute12_LeafGreen_WaterMons }; const struct WildPokemon sRoute12_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KRABBY }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute12_LeafGreen_FishingMonsInfo = { 60, sRoute12_LeafGreen_FishingMons }; const struct WildPokemon sRoute13_LeafGreen_LandMons[] = { { 24, 24, SPECIES_BELLSPROUT }, { 24, 24, SPECIES_VENONAT }, { 22, 22, SPECIES_BELLSPROUT }, { 27, 27, SPECIES_PIDGEY }, { 25, 25, SPECIES_PIDGEY }, { 26, 26, SPECIES_VENONAT }, { 26, 26, SPECIES_BELLSPROUT }, { 25, 25, SPECIES_DITTO }, { 29, 29, SPECIES_PIDGEOTTO }, { 28, 28, SPECIES_WEEPINBELL }, { 29, 29, SPECIES_PIDGEOTTO }, { 30, 30, SPECIES_WEEPINBELL }, }; const struct WildPokemonInfo sRoute13_LeafGreen_LandMonsInfo = { 21, sRoute13_LeafGreen_LandMons }; const struct WildPokemon sRoute13_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute13_LeafGreen_WaterMonsInfo = { 2, sRoute13_LeafGreen_WaterMons }; const struct WildPokemon sRoute13_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KRABBY }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute13_LeafGreen_FishingMonsInfo = { 20, sRoute13_LeafGreen_FishingMons }; const struct WildPokemon sRoute14_LeafGreen_LandMons[] = { { 24, 24, SPECIES_BELLSPROUT }, { 24, 24, SPECIES_VENONAT }, { 22, 22, SPECIES_BELLSPROUT }, { 23, 23, SPECIES_DITTO }, { 27, 27, SPECIES_PIDGEY }, { 26, 26, SPECIES_VENONAT }, { 26, 26, SPECIES_BELLSPROUT }, { 30, 30, SPECIES_WEEPINBELL }, { 23, 23, SPECIES_DITTO }, { 29, 29, SPECIES_PIDGEOTTO }, { 23, 23, SPECIES_DITTO }, { 29, 29, SPECIES_PIDGEOTTO }, }; const struct WildPokemonInfo sRoute14_LeafGreen_LandMonsInfo = { 21, sRoute14_LeafGreen_LandMons }; const struct WildPokemon sRoute15_LeafGreen_LandMons[] = { { 24, 24, SPECIES_BELLSPROUT }, { 24, 24, SPECIES_VENONAT }, { 22, 22, SPECIES_BELLSPROUT }, { 27, 27, SPECIES_PIDGEY }, { 25, 25, SPECIES_PIDGEY }, { 26, 26, SPECIES_VENONAT }, { 26, 26, SPECIES_BELLSPROUT }, { 25, 25, SPECIES_DITTO }, { 29, 29, SPECIES_PIDGEOTTO }, { 28, 28, SPECIES_WEEPINBELL }, { 29, 29, SPECIES_PIDGEOTTO }, { 30, 30, SPECIES_WEEPINBELL }, }; const struct WildPokemonInfo sRoute15_LeafGreen_LandMonsInfo = { 21, sRoute15_LeafGreen_LandMons }; const struct WildPokemon sRoute16_LeafGreen_LandMons[] = { { 20, 20, SPECIES_SPEAROW }, { 18, 18, SPECIES_DODUO }, { 18, 18, SPECIES_RATTATA }, { 20, 20, SPECIES_RATTATA }, { 22, 22, SPECIES_SPEAROW }, { 20, 20, SPECIES_DODUO }, { 22, 22, SPECIES_RATTATA }, { 22, 22, SPECIES_DODUO }, { 18, 18, SPECIES_RATTATA }, { 23, 23, SPECIES_RATICATE }, { 18, 18, SPECIES_RATTATA }, { 25, 25, SPECIES_RATICATE }, }; const struct WildPokemonInfo sRoute16_LeafGreen_LandMonsInfo = { 21, sRoute16_LeafGreen_LandMons }; const struct WildPokemon sRoute17_LeafGreen_LandMons[] = { { 20, 20, SPECIES_SPEAROW }, { 24, 24, SPECIES_DODUO }, { 22, 22, SPECIES_SPEAROW }, { 26, 26, SPECIES_DODUO }, { 25, 25, SPECIES_RATICATE }, { 27, 27, SPECIES_RATICATE }, { 28, 28, SPECIES_DODUO }, { 29, 29, SPECIES_RATICATE }, { 22, 22, SPECIES_RATTATA }, { 25, 25, SPECIES_FEAROW }, { 22, 22, SPECIES_RATTATA }, { 27, 27, SPECIES_FEAROW }, }; const struct WildPokemonInfo sRoute17_LeafGreen_LandMonsInfo = { 21, sRoute17_LeafGreen_LandMons }; const struct WildPokemon sRoute18_LeafGreen_LandMons[] = { { 20, 20, SPECIES_SPEAROW }, { 24, 24, SPECIES_DODUO }, { 22, 22, SPECIES_SPEAROW }, { 26, 26, SPECIES_DODUO }, { 25, 25, SPECIES_RATICATE }, { 25, 25, SPECIES_FEAROW }, { 28, 28, SPECIES_DODUO }, { 29, 29, SPECIES_RATICATE }, { 22, 22, SPECIES_RATTATA }, { 27, 27, SPECIES_FEAROW }, { 22, 22, SPECIES_RATTATA }, { 29, 29, SPECIES_FEAROW }, }; const struct WildPokemonInfo sRoute18_LeafGreen_LandMonsInfo = { 21, sRoute18_LeafGreen_LandMons }; const struct WildPokemon sRoute19_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute19_LeafGreen_WaterMonsInfo = { 2, sRoute19_LeafGreen_WaterMons }; const struct WildPokemon sRoute19_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute19_LeafGreen_FishingMonsInfo = { 20, sRoute19_LeafGreen_FishingMons }; const struct WildPokemon sRoute20_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute20_LeafGreen_WaterMonsInfo = { 2, sRoute20_LeafGreen_WaterMons }; const struct WildPokemon sRoute20_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute20_LeafGreen_FishingMonsInfo = { 20, sRoute20_LeafGreen_FishingMons }; const struct WildPokemon sRoute21North_LeafGreen_LandMons[] = { { 22, 22, SPECIES_TANGELA }, { 23, 23, SPECIES_TANGELA }, { 24, 24, SPECIES_TANGELA }, { 21, 21, SPECIES_TANGELA }, { 25, 25, SPECIES_TANGELA }, { 20, 20, SPECIES_TANGELA }, { 19, 19, SPECIES_TANGELA }, { 26, 26, SPECIES_TANGELA }, { 18, 18, SPECIES_TANGELA }, { 27, 27, SPECIES_TANGELA }, { 17, 17, SPECIES_TANGELA }, { 28, 28, SPECIES_TANGELA }, }; const struct WildPokemonInfo sRoute21North_LeafGreen_LandMonsInfo = { 14, sRoute21North_LeafGreen_LandMons }; const struct WildPokemon sRoute21North_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute21North_LeafGreen_WaterMonsInfo = { 2, sRoute21North_LeafGreen_WaterMons }; const struct WildPokemon sRoute21North_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute21North_LeafGreen_FishingMonsInfo = { 20, sRoute21North_LeafGreen_FishingMons }; const struct WildPokemon sRoute21South_LeafGreen_LandMons[] = { { 22, 22, SPECIES_TANGELA }, { 23, 23, SPECIES_TANGELA }, { 24, 24, SPECIES_TANGELA }, { 21, 21, SPECIES_TANGELA }, { 25, 25, SPECIES_TANGELA }, { 20, 20, SPECIES_TANGELA }, { 19, 19, SPECIES_TANGELA }, { 26, 26, SPECIES_TANGELA }, { 18, 18, SPECIES_TANGELA }, { 27, 27, SPECIES_TANGELA }, { 17, 17, SPECIES_TANGELA }, { 28, 28, SPECIES_TANGELA }, }; const struct WildPokemonInfo sRoute21South_LeafGreen_LandMonsInfo = { 14, sRoute21South_LeafGreen_LandMons }; const struct WildPokemon sRoute21South_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute21South_LeafGreen_WaterMonsInfo = { 2, sRoute21South_LeafGreen_WaterMons }; const struct WildPokemon sRoute21South_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute21South_LeafGreen_FishingMonsInfo = { 20, sRoute21South_LeafGreen_FishingMons }; const struct WildPokemon sRoute22_LeafGreen_LandMons[] = { { 3, 3, SPECIES_RATTATA }, { 3, 3, SPECIES_MANKEY }, { 4, 4, SPECIES_RATTATA }, { 4, 4, SPECIES_MANKEY }, { 2, 2, SPECIES_RATTATA }, { 2, 2, SPECIES_MANKEY }, { 3, 3, SPECIES_SPEAROW }, { 5, 5, SPECIES_SPEAROW }, { 5, 5, SPECIES_RATTATA }, { 5, 5, SPECIES_MANKEY }, { 5, 5, SPECIES_RATTATA }, { 5, 5, SPECIES_MANKEY }, }; const struct WildPokemonInfo sRoute22_LeafGreen_LandMonsInfo = { 21, sRoute22_LeafGreen_LandMons }; const struct WildPokemon sRoute22_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute22_LeafGreen_WaterMonsInfo = { 2, sRoute22_LeafGreen_WaterMons }; const struct WildPokemon sRoute22_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute22_LeafGreen_FishingMonsInfo = { 20, sRoute22_LeafGreen_FishingMons }; const struct WildPokemon sRoute23_LeafGreen_LandMons[] = { { 32, 32, SPECIES_MANKEY }, { 40, 40, SPECIES_FEAROW }, { 34, 34, SPECIES_MANKEY }, { 34, 34, SPECIES_SPEAROW }, { 32, 32, SPECIES_SANDSHREW }, { 34, 34, SPECIES_SANDSHREW }, { 42, 42, SPECIES_PRIMEAPE }, { 44, 44, SPECIES_SANDSLASH }, { 32, 32, SPECIES_SPEAROW }, { 42, 42, SPECIES_FEAROW }, { 32, 32, SPECIES_SPEAROW }, { 44, 44, SPECIES_FEAROW }, }; const struct WildPokemonInfo sRoute23_LeafGreen_LandMonsInfo = { 21, sRoute23_LeafGreen_LandMons }; const struct WildPokemon sRoute23_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute23_LeafGreen_WaterMonsInfo = { 2, sRoute23_LeafGreen_WaterMons }; const struct WildPokemon sRoute23_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute23_LeafGreen_FishingMonsInfo = { 20, sRoute23_LeafGreen_FishingMons }; const struct WildPokemon sRoute24_LeafGreen_LandMons[] = { { 7, 7, SPECIES_WEEDLE }, { 7, 7, SPECIES_CATERPIE }, { 11, 11, SPECIES_PIDGEY }, { 12, 12, SPECIES_BELLSPROUT }, { 13, 13, SPECIES_BELLSPROUT }, { 10, 10, SPECIES_ABRA }, { 13, 13, SPECIES_PIDGEY }, { 14, 14, SPECIES_BELLSPROUT }, { 8, 8, SPECIES_METAPOD }, { 8, 8, SPECIES_ABRA }, { 8, 8, SPECIES_KAKUNA }, { 12, 12, SPECIES_ABRA }, }; const struct WildPokemonInfo sRoute24_LeafGreen_LandMonsInfo = { 21, sRoute24_LeafGreen_LandMons }; const struct WildPokemon sRoute24_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sRoute24_LeafGreen_WaterMonsInfo = { 2, sRoute24_LeafGreen_WaterMons }; const struct WildPokemon sRoute24_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KRABBY }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute24_LeafGreen_FishingMonsInfo = { 20, sRoute24_LeafGreen_FishingMons }; const struct WildPokemon sRoute25_LeafGreen_LandMons[] = { { 8, 8, SPECIES_WEEDLE }, { 8, 8, SPECIES_CATERPIE }, { 13, 13, SPECIES_PIDGEY }, { 14, 14, SPECIES_BELLSPROUT }, { 13, 13, SPECIES_BELLSPROUT }, { 11, 11, SPECIES_ABRA }, { 11, 11, SPECIES_PIDGEY }, { 12, 12, SPECIES_BELLSPROUT }, { 9, 9, SPECIES_METAPOD }, { 9, 9, SPECIES_ABRA }, { 9, 9, SPECIES_KAKUNA }, { 13, 13, SPECIES_ABRA }, }; const struct WildPokemonInfo sRoute25_LeafGreen_LandMonsInfo = { 21, sRoute25_LeafGreen_LandMons }; const struct WildPokemon sRoute25_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute25_LeafGreen_WaterMonsInfo = { 2, sRoute25_LeafGreen_WaterMons }; const struct WildPokemon sRoute25_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute25_LeafGreen_FishingMonsInfo = { 20, sRoute25_LeafGreen_FishingMons }; const struct WildPokemon sPalletTown_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sPalletTown_LeafGreen_WaterMonsInfo = { 1, sPalletTown_LeafGreen_WaterMons }; const struct WildPokemon sPalletTown_LeafGreen_FishingMons[] = { { 5, 10, SPECIES_MAGIKARP }, { 5, 10, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_STARYU }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sPalletTown_LeafGreen_FishingMonsInfo = { 10, sPalletTown_LeafGreen_FishingMons }; const struct WildPokemon sViridianCity_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sViridianCity_LeafGreen_WaterMonsInfo = { 1, sViridianCity_LeafGreen_WaterMons }; const struct WildPokemon sViridianCity_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sViridianCity_LeafGreen_FishingMonsInfo = { 10, sViridianCity_LeafGreen_FishingMons }; const struct WildPokemon sCeruleanCity_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sCeruleanCity_LeafGreen_WaterMonsInfo = { 1, sCeruleanCity_LeafGreen_WaterMons }; const struct WildPokemon sCeruleanCity_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KRABBY }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sCeruleanCity_LeafGreen_FishingMonsInfo = { 10, sCeruleanCity_LeafGreen_FishingMons }; const struct WildPokemon sVermilionCity_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sVermilionCity_LeafGreen_WaterMonsInfo = { 1, sVermilionCity_LeafGreen_WaterMons }; const struct WildPokemon sVermilionCity_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_STARYU }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_HORSEA }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sVermilionCity_LeafGreen_FishingMonsInfo = { 10, sVermilionCity_LeafGreen_FishingMons }; const struct WildPokemon sCeladonCity_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_SLOWPOKE }, { 10, 20, SPECIES_SLOWPOKE }, { 20, 30, SPECIES_SLOWPOKE }, { 30, 40, SPECIES_SLOWPOKE }, { 30, 40, SPECIES_KOFFING }, }; const struct WildPokemonInfo sCeladonCity_LeafGreen_WaterMonsInfo = { 1, sCeladonCity_LeafGreen_WaterMons }; const struct WildPokemon sCeladonCity_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_MAGIKARP }, { 15, 25, SPECIES_MAGIKARP }, { 15, 25, SPECIES_MAGIKARP }, { 15, 25, SPECIES_MAGIKARP }, { 25, 35, SPECIES_MAGIKARP }, { 30, 40, SPECIES_GRIMER }, }; const struct WildPokemonInfo sCeladonCity_LeafGreen_FishingMonsInfo = { 10, sCeladonCity_LeafGreen_FishingMons }; const struct WildPokemon sFuchsiaCity_LeafGreen_WaterMons[] = { { 20, 25, SPECIES_SLOWPOKE }, { 20, 25, SPECIES_SLOWPOKE }, { 25, 30, SPECIES_SLOWPOKE }, { 30, 35, SPECIES_SLOWPOKE }, { 35, 40, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFuchsiaCity_LeafGreen_WaterMonsInfo = { 1, sFuchsiaCity_LeafGreen_WaterMons }; const struct WildPokemon sFuchsiaCity_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 15, 25, SPECIES_GOLDEEN }, { 20, 30, SPECIES_SEAKING }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFuchsiaCity_LeafGreen_FishingMonsInfo = { 10, sFuchsiaCity_LeafGreen_FishingMons }; const struct WildPokemon sCinnabarIsland_LeafGreen_WaterMons[] = { { 5, 10, SPECIES_TENTACOOL }, { 10, 20, SPECIES_TENTACOOL }, { 20, 30, SPECIES_TENTACOOL }, { 30, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, }; const struct WildPokemonInfo sCinnabarIsland_LeafGreen_WaterMonsInfo = { 1, sCinnabarIsland_LeafGreen_WaterMons }; const struct WildPokemon sCinnabarIsland_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_HORSEA }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_STARYU }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_SLOWBRO }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sCinnabarIsland_LeafGreen_FishingMonsInfo = { 10, sCinnabarIsland_LeafGreen_FishingMons }; const struct WildPokemon sOneIsland_LeafGreen_WaterMons[] = { { 5, 20, SPECIES_TENTACOOL }, { 20, 35, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sOneIsland_LeafGreen_WaterMonsInfo = { 1, sOneIsland_LeafGreen_WaterMons }; const struct WildPokemon sOneIsland_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_STARYU }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sOneIsland_LeafGreen_FishingMonsInfo = { 10, sOneIsland_LeafGreen_FishingMons }; const struct WildPokemon sFourIsland_LeafGreen_WaterMons[] = { { 5, 15, SPECIES_MARILL }, { 5, 35, SPECIES_SLOWPOKE }, { 15, 25, SPECIES_MARILL }, { 15, 25, SPECIES_MARILL }, { 15, 25, SPECIES_MARILL }, }; const struct WildPokemonInfo sFourIsland_LeafGreen_WaterMonsInfo = { 2, sFourIsland_LeafGreen_WaterMons }; const struct WildPokemon sFourIsland_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_POLIWAG }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_GOLDEEN }, { 15, 25, SPECIES_POLIWAG }, { 20, 30, SPECIES_POLIWHIRL }, { 15, 25, SPECIES_GYARADOS }, { 15, 25, SPECIES_SLOWPOKE }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFourIsland_LeafGreen_FishingMonsInfo = { 20, sFourIsland_LeafGreen_FishingMons }; const struct WildPokemon sFiveIsland_LeafGreen_WaterMons[] = { { 5, 35, SPECIES_TENTACOOL }, { 5, 15, SPECIES_HOPPIP }, { 35, 40, SPECIES_TENTACOOL }, { 35, 40, SPECIES_TENTACRUEL }, { 35, 40, SPECIES_TENTACRUEL }, }; const struct WildPokemonInfo sFiveIsland_LeafGreen_WaterMonsInfo = { 1, sFiveIsland_LeafGreen_WaterMons }; const struct WildPokemon sFiveIsland_LeafGreen_FishingMons[] = { { 5, 5, SPECIES_MAGIKARP }, { 5, 5, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 5, 15, SPECIES_MAGIKARP }, { 5, 15, SPECIES_KRABBY }, { 15, 25, SPECIES_KRABBY }, { 15, 25, SPECIES_STARYU }, { 15, 25, SPECIES_GYARADOS }, { 25, 35, SPECIES_KINGLER }, { 25, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sFiveIsland_LeafGreen_FishingMonsInfo = { 10, sFiveIsland_LeafGreen_FishingMons }; const struct WildPokemon sSixIslandAlteringCave_LeafGreen_LandMons[] = { { 10, 10, SPECIES_ZUBAT }, { 12, 12, SPECIES_ZUBAT }, { 8, 8, SPECIES_ZUBAT }, { 14, 14, SPECIES_ZUBAT }, { 10, 10, SPECIES_ZUBAT }, { 12, 12, SPECIES_ZUBAT }, { 16, 16, SPECIES_ZUBAT }, { 6, 6, SPECIES_ZUBAT }, { 8, 8, SPECIES_ZUBAT }, { 14, 14, SPECIES_ZUBAT }, { 8, 8, SPECIES_ZUBAT }, { 14, 14, SPECIES_ZUBAT }, }; const struct WildPokemonInfo sSixIslandAlteringCave_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_LeafGreen_LandMons }; const struct WildPokemon sSixIslandAlteringCave_2_LeafGreen_LandMons[] = { { 7, 7, SPECIES_MAREEP }, { 9, 9, SPECIES_MAREEP }, { 5, 5, SPECIES_MAREEP }, { 11, 11, SPECIES_MAREEP }, { 7, 7, SPECIES_MAREEP }, { 9, 9, SPECIES_MAREEP }, { 13, 13, SPECIES_MAREEP }, { 3, 3, SPECIES_MAREEP }, { 5, 5, SPECIES_MAREEP }, { 11, 11, SPECIES_MAREEP }, { 5, 5, SPECIES_MAREEP }, { 11, 11, SPECIES_MAREEP }, }; const struct WildPokemonInfo sSixIslandAlteringCave_2_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_2_LeafGreen_LandMons }; const struct WildPokemon sSixIslandAlteringCave_3_LeafGreen_LandMons[] = { { 23, 23, SPECIES_PINECO }, { 25, 25, SPECIES_PINECO }, { 22, 22, SPECIES_PINECO }, { 27, 27, SPECIES_PINECO }, { 23, 23, SPECIES_PINECO }, { 25, 25, SPECIES_PINECO }, { 29, 29, SPECIES_PINECO }, { 19, 19, SPECIES_PINECO }, { 21, 21, SPECIES_PINECO }, { 27, 27, SPECIES_PINECO }, { 21, 21, SPECIES_PINECO }, { 27, 27, SPECIES_PINECO }, }; const struct WildPokemonInfo sSixIslandAlteringCave_3_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_3_LeafGreen_LandMons }; const struct WildPokemon sSixIslandAlteringCave_4_LeafGreen_LandMons[] = { { 16, 16, SPECIES_HOUNDOUR }, { 18, 18, SPECIES_HOUNDOUR }, { 14, 14, SPECIES_HOUNDOUR }, { 20, 20, SPECIES_HOUNDOUR }, { 16, 16, SPECIES_HOUNDOUR }, { 18, 18, SPECIES_HOUNDOUR }, { 22, 22, SPECIES_HOUNDOUR }, { 12, 12, SPECIES_HOUNDOUR }, { 14, 14, SPECIES_HOUNDOUR }, { 20, 20, SPECIES_HOUNDOUR }, { 14, 14, SPECIES_HOUNDOUR }, { 20, 20, SPECIES_HOUNDOUR }, }; const struct WildPokemonInfo sSixIslandAlteringCave_4_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_4_LeafGreen_LandMons }; const struct WildPokemon sSixIslandAlteringCave_5_LeafGreen_LandMons[] = { { 22, 22, SPECIES_TEDDIURSA }, { 24, 24, SPECIES_TEDDIURSA }, { 20, 20, SPECIES_TEDDIURSA }, { 26, 26, SPECIES_TEDDIURSA }, { 22, 22, SPECIES_TEDDIURSA }, { 24, 24, SPECIES_TEDDIURSA }, { 28, 28, SPECIES_TEDDIURSA }, { 18, 18, SPECIES_TEDDIURSA }, { 20, 20, SPECIES_TEDDIURSA }, { 26, 26, SPECIES_TEDDIURSA }, { 20, 20, SPECIES_TEDDIURSA }, { 26, 26, SPECIES_TEDDIURSA }, }; const struct WildPokemonInfo sSixIslandAlteringCave_5_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_5_LeafGreen_LandMons }; const struct WildPokemon sSixIslandAlteringCave_6_LeafGreen_LandMons[] = { { 22, 22, SPECIES_AIPOM }, { 24, 24, SPECIES_AIPOM }, { 20, 20, SPECIES_AIPOM }, { 26, 26, SPECIES_AIPOM }, { 22, 22, SPECIES_AIPOM }, { 24, 24, SPECIES_AIPOM }, { 28, 28, SPECIES_AIPOM }, { 18, 18, SPECIES_AIPOM }, { 20, 20, SPECIES_AIPOM }, { 26, 26, SPECIES_AIPOM }, { 20, 20, SPECIES_AIPOM }, { 26, 26, SPECIES_AIPOM }, }; const struct WildPokemonInfo sSixIslandAlteringCave_6_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_6_LeafGreen_LandMons }; const struct WildPokemon sSixIslandAlteringCave_7_LeafGreen_LandMons[] = { { 22, 22, SPECIES_SHUCKLE }, { 24, 24, SPECIES_SHUCKLE }, { 20, 20, SPECIES_SHUCKLE }, { 26, 26, SPECIES_SHUCKLE }, { 22, 22, SPECIES_SHUCKLE }, { 24, 24, SPECIES_SHUCKLE }, { 28, 28, SPECIES_SHUCKLE }, { 18, 18, SPECIES_SHUCKLE }, { 20, 20, SPECIES_SHUCKLE }, { 26, 26, SPECIES_SHUCKLE }, { 20, 20, SPECIES_SHUCKLE }, { 26, 26, SPECIES_SHUCKLE }, }; const struct WildPokemonInfo sSixIslandAlteringCave_7_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_7_LeafGreen_LandMons }; const struct WildPokemon sSixIslandAlteringCave_8_LeafGreen_LandMons[] = { { 22, 22, SPECIES_STANTLER }, { 24, 24, SPECIES_STANTLER }, { 20, 20, SPECIES_STANTLER }, { 26, 26, SPECIES_STANTLER }, { 22, 22, SPECIES_STANTLER }, { 24, 24, SPECIES_STANTLER }, { 28, 28, SPECIES_STANTLER }, { 18, 18, SPECIES_STANTLER }, { 20, 20, SPECIES_STANTLER }, { 26, 26, SPECIES_STANTLER }, { 20, 20, SPECIES_STANTLER }, { 26, 26, SPECIES_STANTLER }, }; const struct WildPokemonInfo sSixIslandAlteringCave_8_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_8_LeafGreen_LandMons }; const struct WildPokemon sSixIslandAlteringCave_9_LeafGreen_LandMons[] = { { 22, 22, SPECIES_SMEARGLE }, { 24, 24, SPECIES_SMEARGLE }, { 20, 20, SPECIES_SMEARGLE }, { 26, 26, SPECIES_SMEARGLE }, { 22, 22, SPECIES_SMEARGLE }, { 24, 24, SPECIES_SMEARGLE }, { 28, 28, SPECIES_SMEARGLE }, { 18, 18, SPECIES_SMEARGLE }, { 20, 20, SPECIES_SMEARGLE }, { 26, 26, SPECIES_SMEARGLE }, { 20, 20, SPECIES_SMEARGLE }, { 26, 26, SPECIES_SMEARGLE }, }; const struct WildPokemonInfo sSixIslandAlteringCave_9_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_9_LeafGreen_LandMons }; const struct WildPokemon sRoute20_Underwater_FireRed_LandMons[] = { { 33, 36, SPECIES_TENTACOOL }, { 25, 25, SPECIES_HORSEA }, { 12, 14, SPECIES_KRABBY }, { 15, 15, SPECIES_KRABBY }, { 22, 23, SPECIES_HORSEA }, { 36, 40, SPECIES_TENTACOOL }, { 25, 25, SPECIES_GYARADOS }, { 38, 40, SPECIES_TENTACOOL }, { 33, 35, SPECIES_SEADRA }, { 28, 30, SPECIES_SEADRA }, { 31, 33, SPECIES_SEADRA }, { 33, 35, SPECIES_PSYDUCK }, }; const struct WildPokemonInfo sRoute20_Underwater_FireRed_LandMonsInfo = { 7, sRoute20_Underwater_FireRed_LandMons }; const struct WildPokemon sRoute20_Underwater_LeafGreen_LandMons[] = { { 33, 36, SPECIES_TENTACOOL }, { 25, 25, SPECIES_KRABBY }, { 12, 14, SPECIES_HORSEA }, { 15, 15, SPECIES_HORSEA }, { 22, 23, SPECIES_KRABBY }, { 36, 40, SPECIES_TENTACOOL }, { 25, 25, SPECIES_GYARADOS }, { 38, 40, SPECIES_TENTACOOL }, { 33, 35, SPECIES_KINGLER }, { 28, 30, SPECIES_KINGLER }, { 31, 33, SPECIES_KINGLER }, { 33, 35, SPECIES_SLOWPOKE }, }; const struct WildPokemonInfo sRoute20_Underwater_LeafGreen_LandMonsInfo = { 7, sRoute20_Underwater_LeafGreen_LandMons }; const struct WildPokemon sSafariZone_NorthWest_LandMons[] = { { 33, 33, SPECIES_SUNKERN }, { 34, 34, SPECIES_MAREEP }, { 35, 35, SPECIES_SUNKERN }, { 36, 36, SPECIES_MAREEP }, { 34, 34, SPECIES_AIPOM }, { 27, 27, SPECIES_GIRAFARIG }, { 35, 35, SPECIES_HOOTHOOT }, { 34, 34, SPECIES_SNUBBULL }, { 36, 36, SPECIES_STANTLER }, { 37, 37, SPECIES_MILTANK }, { 39, 39, SPECIES_STANTLER }, { 40, 40, SPECIES_MILTANK }, }; const struct WildPokemonInfo sSafariZone_NorthWest_LandMonsInfo = { 25, sSafariZone_NorthWest_LandMons }; const struct WildPokemon sSafariZone_NorthWest_FireRed_WaterMons[] = // Wooper/Marill are FR/LG exclusive { { 25, 30, SPECIES_WOOPER }, { 25, 30, SPECIES_WOOPER }, { 25, 30, SPECIES_WOOPER }, { 25, 30, SPECIES_WOOPER }, { 35, 40, SPECIES_QUAGSIRE }, }; const struct WildPokemonInfo sSafariZone_NorthWest_FireRed_WaterMonsInfo = { 9, sSafariZone_NorthWest_FireRed_WaterMons }; const struct WildPokemon sSafariZone_NorthWest_LeafGreen_WaterMons[] = // Wooper/Marill are FR/LG exclusive { { 25, 30, SPECIES_MARILL }, { 25, 30, SPECIES_MARILL }, { 25, 30, SPECIES_MARILL }, { 30, 35, SPECIES_MARILL }, { 33, 35, SPECIES_MARILL }, }; const struct WildPokemonInfo sSafariZone_NorthWest_LeafGreen_WaterMonsInfo = { 9, sSafariZone_NorthWest_LeafGreen_WaterMons }; const struct WildPokemon sSafariZone_NorthWest_FireRed_FishingMons[] = // Qwilfish/Remoraid are FR/LG exclusive, but Qwilfish isn't obtainable at Hoenn Safari Zone { { 25, 30, SPECIES_MAGIKARP }, { 25, 30, SPECIES_GOLDEEN }, { 25, 30, SPECIES_MAGIKARP }, { 25, 30, SPECIES_GOLDEEN }, { 30, 35, SPECIES_GOLDEEN }, { 25, 30, SPECIES_GOLDEEN }, { 25, 30, SPECIES_SEAKING }, { 30, 35, SPECIES_SEAKING }, { 30, 35, SPECIES_SEAKING }, { 35, 40, SPECIES_SEAKING }, }; const struct WildPokemonInfo sSafariZone_NorthWest_FireRed_FishingMonsInfo = { 35, sSafariZone_NorthWest_FireRed_FishingMons }; const struct WildPokemon sSafariZone_NorthWest_LeafGreen_FishingMons[] = // Qwilfish/Remoraid are FR/LG exclusive, but Qwilfish isn't obtainable at Hoenn Safari Zone { { 25, 30, SPECIES_MAGIKARP }, { 25, 30, SPECIES_GOLDEEN }, { 25, 30, SPECIES_MAGIKARP }, { 25, 30, SPECIES_GOLDEEN }, { 30, 35, SPECIES_REMORAID }, { 25, 30, SPECIES_GOLDEEN }, { 25, 30, SPECIES_REMORAID }, { 30, 35, SPECIES_REMORAID }, { 30, 35, SPECIES_REMORAID }, { 35, 40, SPECIES_OCTILLERY }, }; const struct WildPokemonInfo sSafariZone_NorthWest_LeafGreen_FishingMonsInfo = { 35, sSafariZone_NorthWest_LeafGreen_FishingMons }; const struct WildPokemon sSafariZone_NorthWest_RockSmashMons[] = { { 25, 30, SPECIES_SHUCKLE }, { 20, 25, SPECIES_SHUCKLE }, { 30, 35, SPECIES_SHUCKLE }, { 30, 35, SPECIES_SHUCKLE }, { 35, 40, SPECIES_SHUCKLE }, }; const struct WildPokemonInfo sSafariZone_NorthWest_RockSmashMonsInfo = { 25, sSafariZone_NorthWest_RockSmashMons }; const struct WildPokemon sSafariZone_NorthEast_LandMons[] = { { 33, 33, SPECIES_AIPOM }, { 34, 34, SPECIES_TEDDIURSA }, { 35, 35, SPECIES_AIPOM }, { 36, 36, SPECIES_TEDDIURSA }, { 34, 34, SPECIES_SUNKERN }, { 27, 27, SPECIES_GIRAFARIG }, { 35, 35, SPECIES_HOOTHOOT }, { 34, 34, SPECIES_PINECO }, { 36, 36, SPECIES_HOUNDOUR }, { 37, 37, SPECIES_GLIGAR }, { 39, 39, SPECIES_HOUNDOUR }, { 40, 40, SPECIES_GLIGAR }, }; const struct WildPokemonInfo sSafariZone_NorthEast_LandMonsInfo = { 25, sSafariZone_NorthEast_LandMons }; const struct WildPokemon sThreeIslandBondBridge_Underwater_LandMons[] = { { 20, 20, SPECIES_CHINCHOU }, { 20, 20, SPECIES_CHINCHOU }, { 21, 21, SPECIES_CHINCHOU }, { 22, 22, SPECIES_CHINCHOU }, { 23, 23, SPECIES_CHINCHOU }, { 24, 24, SPECIES_CHINCHOU }, { 25, 25, SPECIES_CHINCHOU }, { 26, 26, SPECIES_CHINCHOU }, { 27, 27, SPECIES_CHINCHOU }, { 28, 28, SPECIES_CHINCHOU }, { 29, 29, SPECIES_CHINCHOU }, { 30, 30, SPECIES_CHINCHOU }, }; const struct WildPokemonInfo sThreeIslandBondBridge_Underwater_LandMonsInfo = { 7, sThreeIslandBondBridge_Underwater_LandMons }; const struct WildPokemon sArtisanCave_LandMons[] = { { 40, 40, SPECIES_SMEARGLE }, { 41, 41, SPECIES_SMEARGLE }, { 42, 42, SPECIES_SMEARGLE }, { 43, 43, SPECIES_SMEARGLE }, { 44, 44, SPECIES_SMEARGLE }, { 45, 45, SPECIES_SMEARGLE }, { 46, 46, SPECIES_SMEARGLE }, { 47, 47, SPECIES_SMEARGLE }, { 48, 48, SPECIES_SMEARGLE }, { 49, 49, SPECIES_SMEARGLE }, { 50, 50, SPECIES_SMEARGLE }, { 50, 50, SPECIES_SMEARGLE }, }; const struct WildPokemonInfo sArtisanCave_LandMonsInfo = { 10, sArtisanCave_LandMons }; const struct WildPokemonHeader gWildMonHeaders[] = { { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), .landMonsInfo_FR = &sSevenIslandTanobyRuinsMoneanChamber_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSevenIslandTanobyRuinsMoneanChamber_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER), .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER), .landMonsInfo_FR = &sSevenIslandTanobyRuinsLiptooChamber_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSevenIslandTanobyRuinsLiptooChamber_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER), .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER), .landMonsInfo_FR = &sSevenIslandTanobyRuinsWeepthChamber_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSevenIslandTanobyRuinsWeepthChamber_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER), .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER), .landMonsInfo_FR = &sSevenIslandTanobyRuinsDilfordChamber_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSevenIslandTanobyRuinsDilfordChamber_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER), .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER), .landMonsInfo_FR = &sSevenIslandTanobyRuinsScufibChamber_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSevenIslandTanobyRuinsScufibChamber_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER), .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER), .landMonsInfo_FR = &sSevenIslandTanobyRuinsRixyChamber_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSevenIslandTanobyRuinsRixyChamber_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER), .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER), .landMonsInfo_FR = &sSevenIslandTanobyRuinsViapoisChamber_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSevenIslandTanobyRuinsViapoisChamber_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(VIRIDIAN_FOREST), .mapNum = MAP_NUM(VIRIDIAN_FOREST), .landMonsInfo_FR = &sViridianForest_FireRed_LandMonsInfo, .landMonsInfo_LG = &sViridianForest_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_MOON_1F), .mapNum = MAP_NUM(MT_MOON_1F), .landMonsInfo_FR = &sMtMoon1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtMoon1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_MOON_B1F), .mapNum = MAP_NUM(MT_MOON_B1F), .landMonsInfo_FR = &sMtMoonB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtMoonB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_MOON_B2F), .mapNum = MAP_NUM(MT_MOON_B2F), .landMonsInfo_FR = &sMtMoonB2F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtMoonB2F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SSANNE_EXTERIOR), .mapNum = MAP_NUM(SSANNE_EXTERIOR), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sSSAnneExterior_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSSAnneExterior_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSSAnneExterior_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSSAnneExterior_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(DIGLETTS_CAVE_B1F), .mapNum = MAP_NUM(DIGLETTS_CAVE_B1F), .landMonsInfo_FR = &sDiglettsCaveB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sDiglettsCaveB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(VICTORY_ROAD_1F), .mapNum = MAP_NUM(VICTORY_ROAD_1F), .landMonsInfo_FR = &sVictoryRoad1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sVictoryRoad1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(VICTORY_ROAD_2F), .mapNum = MAP_NUM(VICTORY_ROAD_2F), .landMonsInfo_FR = &sVictoryRoad2F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sVictoryRoad2F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(VICTORY_ROAD_3F), .mapNum = MAP_NUM(VICTORY_ROAD_3F), .landMonsInfo_FR = &sVictoryRoad3F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sVictoryRoad3F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(POKEMON_MANSION_1F), .mapNum = MAP_NUM(POKEMON_MANSION_1F), .landMonsInfo_FR = &sPokemonMansion1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPokemonMansion1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(POKEMON_MANSION_2F), .mapNum = MAP_NUM(POKEMON_MANSION_2F), .landMonsInfo_FR = &sPokemonMansion2F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPokemonMansion2F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(POKEMON_MANSION_3F), .mapNum = MAP_NUM(POKEMON_MANSION_3F), .landMonsInfo_FR = &sPokemonMansion3F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPokemonMansion3F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(POKEMON_MANSION_B1F), .mapNum = MAP_NUM(POKEMON_MANSION_B1F), .landMonsInfo_FR = &sPokemonMansionB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPokemonMansionB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SAFARI_ZONE_CENTER), .mapNum = MAP_NUM(SAFARI_ZONE_CENTER), .landMonsInfo_FR = &sSafariZoneCenter_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSafariZoneCenter_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sSafariZoneCenter_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSafariZoneCenter_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSafariZoneCenter_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSafariZoneCenter_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SAFARI_ZONE_EAST), .mapNum = MAP_NUM(SAFARI_ZONE_EAST), .landMonsInfo_FR = &sSafariZoneEast_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSafariZoneEast_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sSafariZoneEast_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSafariZoneEast_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSafariZoneEast_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSafariZoneEast_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTH), .mapNum = MAP_NUM(SAFARI_ZONE_NORTH), .landMonsInfo_FR = &sSafariZoneNorth_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSafariZoneNorth_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sSafariZoneNorth_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSafariZoneNorth_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSafariZoneNorth_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSafariZoneNorth_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SAFARI_ZONE_WEST), .mapNum = MAP_NUM(SAFARI_ZONE_WEST), .landMonsInfo_FR = &sSafariZoneWest_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSafariZoneWest_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sSafariZoneWest_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSafariZoneWest_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSafariZoneWest_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSafariZoneWest_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(CERULEAN_CAVE_1F), .mapNum = MAP_NUM(CERULEAN_CAVE_1F), .landMonsInfo_FR = &sCeruleanCave1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sCeruleanCave1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sCeruleanCave1F_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sCeruleanCave1F_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = &sCeruleanCave1F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sCeruleanCave1F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = &sCeruleanCave1F_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sCeruleanCave1F_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(CERULEAN_CAVE_2F), .mapNum = MAP_NUM(CERULEAN_CAVE_2F), .landMonsInfo_FR = &sCeruleanCave2F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sCeruleanCave2F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sCeruleanCave2F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sCeruleanCave2F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(CERULEAN_CAVE_B1F), .mapNum = MAP_NUM(CERULEAN_CAVE_B1F), .landMonsInfo_FR = &sCeruleanCaveB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sCeruleanCaveB1F_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = &sCeruleanCaveB1F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = &sCeruleanCaveB1F_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROCK_TUNNEL_1F), .mapNum = MAP_NUM(ROCK_TUNNEL_1F), .landMonsInfo_FR = &sRockTunnel1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRockTunnel1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROCK_TUNNEL_B1F), .mapNum = MAP_NUM(ROCK_TUNNEL_B1F), .landMonsInfo_FR = &sRockTunnelB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRockTunnelB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sRockTunnelB1F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sRockTunnelB1F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_1F), .mapNum = MAP_NUM(SEAFOAM_ISLANDS_1F), .landMonsInfo_FR = &sSeafoamIslands1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSeafoamIslands1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_B1F), .mapNum = MAP_NUM(SEAFOAM_ISLANDS_B1F), .landMonsInfo_FR = &sSeafoamIslandsB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSeafoamIslandsB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_B2F), .mapNum = MAP_NUM(SEAFOAM_ISLANDS_B2F), .landMonsInfo_FR = &sSeafoamIslandsB2F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSeafoamIslandsB2F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_B3F), .mapNum = MAP_NUM(SEAFOAM_ISLANDS_B3F), .landMonsInfo_FR = &sSeafoamIslandsB3F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSeafoamIslandsB3F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sSeafoamIslandsB3F_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSeafoamIslandsB3F_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSeafoamIslandsB3F_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSeafoamIslandsB3F_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_B4F), .mapNum = MAP_NUM(SEAFOAM_ISLANDS_B4F), .landMonsInfo_FR = &sSeafoamIslandsB4F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSeafoamIslandsB4F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sSeafoamIslandsB4F_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSeafoamIslandsB4F_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSeafoamIslandsB4F_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSeafoamIslandsB4F_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(POKEMON_TOWER_3F), .mapNum = MAP_NUM(POKEMON_TOWER_3F), .landMonsInfo_FR = &sPokemonTower3F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPokemonTower3F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(POKEMON_TOWER_4F), .mapNum = MAP_NUM(POKEMON_TOWER_4F), .landMonsInfo_FR = &sPokemonTower4F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPokemonTower4F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(POKEMON_TOWER_5F), .mapNum = MAP_NUM(POKEMON_TOWER_5F), .landMonsInfo_FR = &sPokemonTower5F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPokemonTower5F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(POKEMON_TOWER_6F), .mapNum = MAP_NUM(POKEMON_TOWER_6F), .landMonsInfo_FR = &sPokemonTower6F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPokemonTower6F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(POKEMON_TOWER_7F), .mapNum = MAP_NUM(POKEMON_TOWER_7F), .landMonsInfo_FR = &sPokemonTower7F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPokemonTower7F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(POWER_PLANT), .mapNum = MAP_NUM(POWER_PLANT), .landMonsInfo_FR = &sPowerPlant_FireRed_LandMonsInfo, .landMonsInfo_LG = &sPowerPlant_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_EXTERIOR), .mapNum = MAP_NUM(MT_EMBER_EXTERIOR), .landMonsInfo_FR = &sMtEmberExterior_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberExterior_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sMtEmberExterior_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sMtEmberExterior_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_SUMMIT_PATH_1F), .mapNum = MAP_NUM(MT_EMBER_SUMMIT_PATH_1F), .landMonsInfo_FR = &sMtEmberSummitPath1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberSummitPath1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_SUMMIT_PATH_2F), .mapNum = MAP_NUM(MT_EMBER_SUMMIT_PATH_2F), .landMonsInfo_FR = &sMtEmberSummitPath2F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberSummitPath2F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sMtEmberSummitPath2F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sMtEmberSummitPath2F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_SUMMIT_PATH_3F), .mapNum = MAP_NUM(MT_EMBER_SUMMIT_PATH_3F), .landMonsInfo_FR = &sMtEmberSummitPath3F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberSummitPath3F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_1F), .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_1F), .landMonsInfo_FR = &sMtEmberRubyPath1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberRubyPath1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sMtEmberRubyPath1F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sMtEmberRubyPath1F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B1F), .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B1F), .landMonsInfo_FR = &sMtEmberRubyPathB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberRubyPathB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sMtEmberRubyPathB1F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sMtEmberRubyPathB1F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B2F), .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B2F), .landMonsInfo_FR = &sMtEmberRubyPathB2F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberRubyPathB2F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sMtEmberRubyPathB2F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sMtEmberRubyPathB2F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B3F), .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B3F), .landMonsInfo_FR = &sMtEmberRubyPathB3F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberRubyPathB3F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sMtEmberRubyPathB3F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sMtEmberRubyPathB3F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B1F_STAIRS), .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B1F_STAIRS), .landMonsInfo_FR = &sMtEmberRubyPathB1FStairs_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberRubyPathB1FStairs_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sMtEmberRubyPathB1FStairs_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sMtEmberRubyPathB1FStairs_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B2F_STAIRS), .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B2F_STAIRS), .landMonsInfo_FR = &sMtEmberRubyPathB2FStairs_FireRed_LandMonsInfo, .landMonsInfo_LG = &sMtEmberRubyPathB2FStairs_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sMtEmberRubyPathB2FStairs_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sMtEmberRubyPathB2FStairs_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(THREE_ISLAND_BERRY_FOREST), .mapNum = MAP_NUM(THREE_ISLAND_BERRY_FOREST), .landMonsInfo_FR = &sThreeIslandBerryForest_FireRed_LandMonsInfo, .landMonsInfo_LG = &sThreeIslandBerryForest_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sThreeIslandBerryForest_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sThreeIslandBerryForest_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sThreeIslandBerryForest_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sThreeIslandBerryForest_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), .mapNum = MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), .landMonsInfo_FR = &sFourIslandIcefallCaveEntrance_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFourIslandIcefallCaveEntrance_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sFourIslandIcefallCaveEntrance_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sFourIslandIcefallCaveEntrance_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sFourIslandIcefallCaveEntrance_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sFourIslandIcefallCaveEntrance_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_1F), .mapNum = MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_1F), .landMonsInfo_FR = &sFourIslandIcefallCave1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFourIslandIcefallCave1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_B1F), .mapNum = MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_B1F), .landMonsInfo_FR = &sFourIslandIcefallCaveB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFourIslandIcefallCaveB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_BACK), .mapNum = MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_BACK), .landMonsInfo_FR = &sFourIslandIcefallCaveBack_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFourIslandIcefallCaveBack_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sFourIslandIcefallCaveBack_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sFourIslandIcefallCaveBack_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sFourIslandIcefallCaveBack_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sFourIslandIcefallCaveBack_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_PATTERN_BUSH), .mapNum = MAP_NUM(SIX_ISLAND_PATTERN_BUSH), .landMonsInfo_FR = &sSixIslandPatternBush_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandPatternBush_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM1), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM1), .landMonsInfo_FR = &sFiveIslandLostCaveRoom1_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom1_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM2), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM2), .landMonsInfo_FR = &sFiveIslandLostCaveRoom2_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom2_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM3), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM3), .landMonsInfo_FR = &sFiveIslandLostCaveRoom3_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom3_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM4), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM4), .landMonsInfo_FR = &sFiveIslandLostCaveRoom4_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom4_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM5), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM5), .landMonsInfo_FR = &sFiveIslandLostCaveRoom5_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom5_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM6), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM6), .landMonsInfo_FR = &sFiveIslandLostCaveRoom6_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom6_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM7), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM7), .landMonsInfo_FR = &sFiveIslandLostCaveRoom7_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom7_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM8), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM8), .landMonsInfo_FR = &sFiveIslandLostCaveRoom8_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom8_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM9), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM9), .landMonsInfo_FR = &sFiveIslandLostCaveRoom9_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom9_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM10), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM10), .landMonsInfo_FR = &sFiveIslandLostCaveRoom10_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom10_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM11), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM11), .landMonsInfo_FR = &sFiveIslandLostCaveRoom11_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom11_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM12), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM12), .landMonsInfo_FR = &sFiveIslandLostCaveRoom12_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom12_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM13), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM13), .landMonsInfo_FR = &sFiveIslandLostCaveRoom13_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom13_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM14), .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM14), .landMonsInfo_FR = &sFiveIslandLostCaveRoom14_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandLostCaveRoom14_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), .mapNum = MAP_NUM(ONE_ISLAND_KINDLE_ROAD), .landMonsInfo_FR = &sOneIslandKindleRoad_FireRed_LandMonsInfo, .landMonsInfo_LG = &sOneIslandKindleRoad_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sOneIslandKindleRoad_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sOneIslandKindleRoad_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = &sOneIslandKindleRoad_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sOneIslandKindleRoad_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = &sOneIslandKindleRoad_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sOneIslandKindleRoad_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ONE_ISLAND_TREASURE_BEACH), .mapNum = MAP_NUM(ONE_ISLAND_TREASURE_BEACH), .landMonsInfo_FR = &sOneIslandTreasureBeach_FireRed_LandMonsInfo, .landMonsInfo_LG = &sOneIslandTreasureBeach_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sOneIslandTreasureBeach_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sOneIslandTreasureBeach_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sOneIslandTreasureBeach_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sOneIslandTreasureBeach_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(TWO_ISLAND_CAPE_BRINK), .mapNum = MAP_NUM(TWO_ISLAND_CAPE_BRINK), .landMonsInfo_FR = &sTwoIslandCapeBrink_FireRed_LandMonsInfo, .landMonsInfo_LG = &sTwoIslandCapeBrink_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sTwoIslandCapeBrink_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sTwoIslandCapeBrink_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sTwoIslandCapeBrink_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sTwoIslandCapeBrink_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), .mapNum = MAP_NUM(THREE_ISLAND_BOND_BRIDGE), .landMonsInfo_FR = &sThreeIslandBondBridge_FireRed_LandMonsInfo, .landMonsInfo_LG = &sThreeIslandBondBridge_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sThreeIslandBondBridge_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sThreeIslandBondBridge_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sThreeIslandBondBridge_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sThreeIslandBondBridge_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(THREE_ISLAND_PORT), .mapNum = MAP_NUM(THREE_ISLAND_PORT), .landMonsInfo_FR = &sThreeIslandPort_FireRed_LandMonsInfo, .landMonsInfo_LG = &sThreeIslandPort_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), .mapNum = MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sFiveIslandResortGorgeous_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sFiveIslandResortGorgeous_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sFiveIslandResortGorgeous_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sFiveIslandResortGorgeous_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_WATER_LABYRINTH), .mapNum = MAP_NUM(FIVE_ISLAND_WATER_LABYRINTH), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sFiveIslandWaterLabyrinth_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sFiveIslandWaterLabyrinth_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sFiveIslandWaterLabyrinth_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sFiveIslandWaterLabyrinth_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_MEADOW), .mapNum = MAP_NUM(FIVE_ISLAND_MEADOW), .landMonsInfo_FR = &sFiveIslandMeadow_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandMeadow_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sFiveIslandMeadow_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sFiveIslandMeadow_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sFiveIslandMeadow_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sFiveIslandMeadow_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_MEMORIAL_PILLAR), .mapNum = MAP_NUM(FIVE_ISLAND_MEMORIAL_PILLAR), .landMonsInfo_FR = &sFiveIslandMemorialPillar_FireRed_LandMonsInfo, .landMonsInfo_LG = &sFiveIslandMemorialPillar_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sFiveIslandMemorialPillar_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sFiveIslandMemorialPillar_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sFiveIslandMemorialPillar_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sFiveIslandMemorialPillar_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_OUTCAST_ISLAND), .mapNum = MAP_NUM(SIX_ISLAND_OUTCAST_ISLAND), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sSixIslandOutcastIsland_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSixIslandOutcastIsland_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSixIslandOutcastIsland_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSixIslandOutcastIsland_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_GREEN_PATH), .mapNum = MAP_NUM(SIX_ISLAND_GREEN_PATH), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sSixIslandGreenPath_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSixIslandGreenPath_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSixIslandGreenPath_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSixIslandGreenPath_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_WATER_PATH), .mapNum = MAP_NUM(SIX_ISLAND_WATER_PATH), .landMonsInfo_FR = &sSixIslandWaterPath_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandWaterPath_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sSixIslandWaterPath_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSixIslandWaterPath_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSixIslandWaterPath_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSixIslandWaterPath_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_RUIN_VALLEY), .mapNum = MAP_NUM(SIX_ISLAND_RUIN_VALLEY), .landMonsInfo_FR = &sSixIslandRuinValley_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandRuinValley_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sSixIslandRuinValley_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSixIslandRuinValley_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSixIslandRuinValley_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSixIslandRuinValley_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER), .mapNum = MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sSevenIslandTrainerTower_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSevenIslandTrainerTower_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSevenIslandTrainerTower_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSevenIslandTrainerTower_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), .mapNum = MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), .landMonsInfo_FR = &sSevenIslandSevaultCanyonEntrance_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSevenIslandSevaultCanyonEntrance_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON), .mapNum = MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON), .landMonsInfo_FR = &sSevenIslandSevaultCanyon_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSevenIslandSevaultCanyon_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sSevenIslandSevaultCanyon_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sSevenIslandSevaultCanyon_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS), .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sSevenIslandTanobyRuins_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSevenIslandTanobyRuins_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sSevenIslandTanobyRuins_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSevenIslandTanobyRuins_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE1), .mapNum = MAP_NUM(ROUTE1), .landMonsInfo_FR = &sRoute1_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute1_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE2), .mapNum = MAP_NUM(ROUTE2), .landMonsInfo_FR = &sRoute2_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute2_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE3), .mapNum = MAP_NUM(ROUTE3), .landMonsInfo_FR = &sRoute3_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute3_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE4), .mapNum = MAP_NUM(ROUTE4), .landMonsInfo_FR = &sRoute4_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute4_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute4_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute4_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute4_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute4_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE5), .mapNum = MAP_NUM(ROUTE5), .landMonsInfo_FR = &sRoute5_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute5_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE6), .mapNum = MAP_NUM(ROUTE6), .landMonsInfo_FR = &sRoute6_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute6_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute6_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute6_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute6_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute6_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE7), .mapNum = MAP_NUM(ROUTE7), .landMonsInfo_FR = &sRoute7_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute7_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE8), .mapNum = MAP_NUM(ROUTE8), .landMonsInfo_FR = &sRoute8_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute8_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE9), .mapNum = MAP_NUM(ROUTE9), .landMonsInfo_FR = &sRoute9_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute9_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE10), .mapNum = MAP_NUM(ROUTE10), .landMonsInfo_FR = &sRoute10_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute10_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute10_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute10_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute10_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute10_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE11), .mapNum = MAP_NUM(ROUTE11), .landMonsInfo_FR = &sRoute11_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute11_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute11_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute11_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute11_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute11_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE12), .mapNum = MAP_NUM(ROUTE12), .landMonsInfo_FR = &sRoute12_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute12_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute12_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute12_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute12_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute12_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE13), .mapNum = MAP_NUM(ROUTE13), .landMonsInfo_FR = &sRoute13_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute13_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute13_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute13_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute13_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute13_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE14), .mapNum = MAP_NUM(ROUTE14), .landMonsInfo_FR = &sRoute14_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute14_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE15), .mapNum = MAP_NUM(ROUTE15), .landMonsInfo_FR = &sRoute15_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute15_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE16), .mapNum = MAP_NUM(ROUTE16), .landMonsInfo_FR = &sRoute16_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute16_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE17), .mapNum = MAP_NUM(ROUTE17), .landMonsInfo_FR = &sRoute17_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute17_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE18), .mapNum = MAP_NUM(ROUTE18), .landMonsInfo_FR = &sRoute18_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute18_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE19), .mapNum = MAP_NUM(ROUTE19), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sRoute19_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute19_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute19_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute19_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE20), .mapNum = MAP_NUM(ROUTE20), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sRoute20_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute20_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute20_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute20_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE21_NORTH), .mapNum = MAP_NUM(ROUTE21_NORTH), .landMonsInfo_FR = &sRoute21North_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute21North_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute21North_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute21North_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute21North_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute21North_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE21_SOUTH), .mapNum = MAP_NUM(ROUTE21_SOUTH), .landMonsInfo_FR = &sRoute21South_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute21South_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute21South_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute21South_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute21South_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute21South_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE22), .mapNum = MAP_NUM(ROUTE22), .landMonsInfo_FR = &sRoute22_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute22_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute22_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute22_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute22_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute22_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE23), .mapNum = MAP_NUM(ROUTE23), .landMonsInfo_FR = &sRoute23_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute23_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute23_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute23_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute23_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute23_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE24), .mapNum = MAP_NUM(ROUTE24), .landMonsInfo_FR = &sRoute24_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute24_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute24_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute24_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute24_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute24_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ROUTE25), .mapNum = MAP_NUM(ROUTE25), .landMonsInfo_FR = &sRoute25_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute25_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sRoute25_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sRoute25_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sRoute25_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sRoute25_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(PALLET_TOWN), .mapNum = MAP_NUM(PALLET_TOWN), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sPalletTown_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sPalletTown_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sPalletTown_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sPalletTown_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(VIRIDIAN_CITY), .mapNum = MAP_NUM(VIRIDIAN_CITY), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sViridianCity_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sViridianCity_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sViridianCity_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sViridianCity_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(CERULEAN_CITY), .mapNum = MAP_NUM(CERULEAN_CITY), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sCeruleanCity_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sCeruleanCity_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sCeruleanCity_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sCeruleanCity_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(VERMILION_CITY), .mapNum = MAP_NUM(VERMILION_CITY), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sVermilionCity_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sVermilionCity_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sVermilionCity_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sVermilionCity_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(CELADON_CITY), .mapNum = MAP_NUM(CELADON_CITY), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sCeladonCity_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sCeladonCity_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sCeladonCity_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sCeladonCity_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(FUCHSIA_CITY), .mapNum = MAP_NUM(FUCHSIA_CITY), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sFuchsiaCity_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sFuchsiaCity_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sFuchsiaCity_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sFuchsiaCity_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(CINNABAR_ISLAND), .mapNum = MAP_NUM(CINNABAR_ISLAND), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sCinnabarIsland_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sCinnabarIsland_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sCinnabarIsland_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sCinnabarIsland_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(ONE_ISLAND), .mapNum = MAP_NUM(ONE_ISLAND), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sOneIsland_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sOneIsland_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sOneIsland_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sOneIsland_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(FOUR_ISLAND), .mapNum = MAP_NUM(FOUR_ISLAND), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sFourIsland_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sFourIsland_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sFourIsland_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sFourIsland_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(FIVE_ISLAND), .mapNum = MAP_NUM(FIVE_ISLAND), .landMonsInfo_FR = NULL, .landMonsInfo_LG = NULL, .waterMonsInfo_FR = &sFiveIsland_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sFiveIsland_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = &sFiveIsland_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sFiveIsland_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE), .landMonsInfo_FR = &sSixIslandAlteringCave_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandAlteringCave_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE), .landMonsInfo_FR = &sSixIslandAlteringCave_2_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandAlteringCave_2_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE), .landMonsInfo_FR = &sSixIslandAlteringCave_3_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandAlteringCave_3_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE), .landMonsInfo_FR = &sSixIslandAlteringCave_4_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandAlteringCave_4_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE), .landMonsInfo_FR = &sSixIslandAlteringCave_5_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandAlteringCave_5_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE), .landMonsInfo_FR = &sSixIslandAlteringCave_6_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandAlteringCave_6_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE), .landMonsInfo_FR = &sSixIslandAlteringCave_7_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandAlteringCave_7_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE), .landMonsInfo_FR = &sSixIslandAlteringCave_8_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandAlteringCave_8_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE), .landMonsInfo_FR = &sSixIslandAlteringCave_9_FireRed_LandMonsInfo, .landMonsInfo_LG = &sSixIslandAlteringCave_9_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ROUTE20_UNDERWATER), .mapNum = MAP_NUM(ROUTE20_UNDERWATER), .landMonsInfo_FR = &sRoute20_Underwater_FireRed_LandMonsInfo, .landMonsInfo_LG = &sRoute20_Underwater_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTH_WEST), .mapNum = MAP_NUM(SAFARI_ZONE_NORTH_WEST), .landMonsInfo_FR = &sSafariZone_NorthWest_LandMonsInfo, .landMonsInfo_LG = &sSafariZone_NorthWest_LandMonsInfo, .waterMonsInfo_FR = &sSafariZone_NorthWest_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sSafariZone_NorthWest_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = &sSafariZone_NorthWest_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sSafariZone_NorthWest_RockSmashMonsInfo, .fishingMonsInfo_FR = &sSafariZone_NorthWest_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sSafariZone_NorthWest_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTH_EAST), .mapNum = MAP_NUM(SAFARI_ZONE_NORTH_EAST), .landMonsInfo_FR = &sSafariZone_NorthEast_LandMonsInfo, .landMonsInfo_LG = &sSafariZone_NorthEast_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sSafariZone_NorthWest_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sSafariZone_NorthWest_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(THREE_ISLAND_BOND_BRIDGE_UNDERWATER), .mapNum = MAP_NUM(THREE_ISLAND_BOND_BRIDGE_UNDERWATER), .landMonsInfo_FR = &sThreeIslandBondBridge_Underwater_LandMonsInfo, .landMonsInfo_LG = &sThreeIslandBondBridge_Underwater_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ARTISAN_CAVE_B1F), .mapNum = MAP_NUM(ARTISAN_CAVE_B1F), .landMonsInfo_FR = &sArtisanCave_LandMonsInfo, .landMonsInfo_LG = &sArtisanCave_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(ARTISAN_CAVE_1F), .mapNum = MAP_NUM(ARTISAN_CAVE_1F), .landMonsInfo_FR = &sArtisanCave_LandMonsInfo, .landMonsInfo_LG = &sArtisanCave_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = NULL, .rockSmashMonsInfo_LG = NULL, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(CERULEAN_CAVE_1F_BLUE), .mapNum = MAP_NUM(CERULEAN_CAVE_1F_BLUE), .landMonsInfo_FR = &sCeruleanCave1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sCeruleanCave1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sCeruleanCave1F_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sCeruleanCave1F_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = &sCeruleanCave1F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sCeruleanCave1F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = &sCeruleanCave1F_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sCeruleanCave1F_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(CERULEAN_CAVE_2F_BLUE), .mapNum = MAP_NUM(CERULEAN_CAVE_2F_BLUE), .landMonsInfo_FR = &sCeruleanCave2F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sCeruleanCave2F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sCeruleanCave2F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sCeruleanCave2F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(CERULEAN_CAVE_B1F_BLUE), .mapNum = MAP_NUM(CERULEAN_CAVE_B1F_BLUE), .landMonsInfo_FR = &sCeruleanCaveB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sCeruleanCaveB1F_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = &sCeruleanCaveB1F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = &sCeruleanCaveB1F_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(CERULEAN_CAVE_1F_YELLOW), .mapNum = MAP_NUM(CERULEAN_CAVE_1F_YELLOW), .landMonsInfo_FR = &sCeruleanCave1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sCeruleanCave1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sCeruleanCave1F_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sCeruleanCave1F_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = &sCeruleanCave1F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sCeruleanCave1F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = &sCeruleanCave1F_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sCeruleanCave1F_LeafGreen_FishingMonsInfo, }, { .mapGroup = MAP_GROUP(CERULEAN_CAVE_2F_YELLOW), .mapNum = MAP_NUM(CERULEAN_CAVE_2F_YELLOW), .landMonsInfo_FR = &sCeruleanCave2F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sCeruleanCave2F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = NULL, .waterMonsInfo_LG = NULL, .rockSmashMonsInfo_FR = &sCeruleanCave2F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sCeruleanCave2F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = NULL, .fishingMonsInfo_LG = NULL, }, { .mapGroup = MAP_GROUP(CERULEAN_CAVE_B1F_YELLOW), .mapNum = MAP_NUM(CERULEAN_CAVE_B1F_YELLOW), .landMonsInfo_FR = &sCeruleanCaveB1F_FireRed_LandMonsInfo, .landMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_LandMonsInfo, .waterMonsInfo_FR = &sCeruleanCaveB1F_FireRed_WaterMonsInfo, .waterMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_WaterMonsInfo, .rockSmashMonsInfo_FR = &sCeruleanCaveB1F_FireRed_RockSmashMonsInfo, .rockSmashMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_RockSmashMonsInfo, .fishingMonsInfo_FR = &sCeruleanCaveB1F_FireRed_FishingMonsInfo, .fishingMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_FishingMonsInfo, }, }; ================================================ FILE: src/data.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "data.h" #include "graphics.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/battle_ai.h" #include "constants/trainers.h" #define BATTLER_OFFSET(i) (gHeap + 0x8000 + MON_PIC_SIZE * (i)) const struct SpriteFrameImage gBattlerPicTable_PlayerLeft[] = { BATTLER_OFFSET(0), MON_PIC_SIZE, BATTLER_OFFSET(1), MON_PIC_SIZE, BATTLER_OFFSET(2), MON_PIC_SIZE, BATTLER_OFFSET(3), MON_PIC_SIZE, }; const struct SpriteFrameImage gBattlerPicTable_OpponentLeft[] = { BATTLER_OFFSET(4), MON_PIC_SIZE, BATTLER_OFFSET(5), MON_PIC_SIZE, BATTLER_OFFSET(6), MON_PIC_SIZE, BATTLER_OFFSET(7), MON_PIC_SIZE, }; const struct SpriteFrameImage gBattlerPicTable_PlayerRight[] = { BATTLER_OFFSET(8), MON_PIC_SIZE, BATTLER_OFFSET(9), MON_PIC_SIZE, BATTLER_OFFSET(10), MON_PIC_SIZE, BATTLER_OFFSET(11), MON_PIC_SIZE, }; const struct SpriteFrameImage gBattlerPicTable_OpponentRight[] = { BATTLER_OFFSET(12), MON_PIC_SIZE, BATTLER_OFFSET(13), MON_PIC_SIZE, BATTLER_OFFSET(14), MON_PIC_SIZE, BATTLER_OFFSET(15), MON_PIC_SIZE, }; const struct SpriteFrameImage gTrainerBackPicTable_Red[] = { gTrainerBackPic_Red, 0x0800, gTrainerBackPic_Red + 0x0800, 0x0800, gTrainerBackPic_Red + 0x1000, 0x0800, gTrainerBackPic_Red + 0x1800, 0x0800, gTrainerBackPic_Red + 0x2000, 0x0800, }; const struct SpriteFrameImage gTrainerBackPicTable_Leaf[] = { gTrainerBackPic_Leaf, 0x0800, gTrainerBackPic_Leaf + 0x0800, 0x0800, gTrainerBackPic_Leaf + 0x1000, 0x0800, gTrainerBackPic_Leaf + 0x1800, 0x0800, gTrainerBackPic_Leaf + 0x2000, 0x0800, }; const struct SpriteFrameImage gTrainerBackPicTable_Pokedude[] = { gTrainerBackPic_Pokedude, 0x0800, gTrainerBackPic_Pokedude + 0x0800, 0x0800, gTrainerBackPic_Pokedude + 0x1000, 0x0800, gTrainerBackPic_Pokedude + 0x1800, 0x0800, }; const struct SpriteFrameImage gTrainerBackPicTable_OldMan[] = { gTrainerBackPic_OldMan, 0x0800, gTrainerBackPic_OldMan + 0x0800, 0x0800, gTrainerBackPic_OldMan + 0x1000, 0x0800, gTrainerBackPic_OldMan + 0x1800, 0x0800, }; const struct SpriteFrameImage gTrainerBackPicTable_RSBrendan[] = { gTrainerBackPic_RSBrendan, 0x0800, gTrainerBackPic_RSBrendan + 0x0800, 0x0800, gTrainerBackPic_RSBrendan + 0x1000, 0x0800, gTrainerBackPic_RSBrendan + 0x1800, 0x0800, }; const struct SpriteFrameImage gTrainerBackPicTable_RSMay[] = { gTrainerBackPic_RSMay, 0x0800, gTrainerBackPic_RSMay + 0x0800, 0x0800, gTrainerBackPic_RSMay + 0x1000, 0x0800, gTrainerBackPic_RSMay + 0x1800, 0x0800, }; const struct SpriteFrameImage gTrainerBackPicTable_EmBrendan[] = { gTrainerBackPic_EmBrendan, 0x0800, gTrainerBackPic_EmBrendan + 0x0800, 0x0800, gTrainerBackPic_EmBrendan + 0x1000, 0x0800, gTrainerBackPic_EmBrendan + 0x1800, 0x0800, }; const struct SpriteFrameImage gTrainerBackPicTable_EmMay[] = { gTrainerBackPic_EmMay, 0x0800, gTrainerBackPic_EmMay + 0x0800, 0x0800, gTrainerBackPic_EmMay + 0x1000, 0x0800, gTrainerBackPic_EmMay + 0x1800, 0x0800, }; static const union AnimCmd sAnim_GeneralFrame0[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, }; static const union AnimCmd sAnim_GeneralFrame3[] = { ANIMCMD_FRAME(3, 0), ANIMCMD_END, }; // Many of these affine anims seem to go unused, and // instead SetSpriteRotScale is used to manipulate // the battler sprites directly (for instance, in AnimTask_SwitchOutShrinkMon). // Those with explicit indexes are referenced elsewhere. static const union AffineAnimCmd sAffineAnim_Battler_Normal[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_Flipped[] = { AFFINEANIMCMD_FRAME(-0x100, 0x0100, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_Emerge[] = { AFFINEANIMCMD_FRAME(0x28, 0x28, 0, 0), AFFINEANIMCMD_FRAME(0x12, 0x12, 0, 12), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_Return[] = { AFFINEANIMCMD_FRAME(-0x2, -0x2, 0, 18), AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 15), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_HorizontalSquishLoop[] = { AFFINEANIMCMD_FRAME(0xA0, 0x100, 0, 0), AFFINEANIMCMD_FRAME( 0x4, 0x0, 0, 8), AFFINEANIMCMD_FRAME(-0x4, 0x0, 0, 8), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd sAffineAnim_Battler_Grow[] = { AFFINEANIMCMD_FRAME(0x2, 0x2, 0, 20), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_Shrink[] = { AFFINEANIMCMD_FRAME(-0x2, -0x2, 0, 20), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_BigToSmall[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 9), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_GrowLarge[] = { AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 63), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_TipRight[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -3, 5), AFFINEANIMCMD_FRAME(0x0, 0x0, 3, 5), AFFINEANIMCMD_END, }; const union AffineAnimCmd *const gAffineAnims_BattleSpritePlayerSide[] = { [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Normal, [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge, [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return, sAffineAnim_Battler_HorizontalSquishLoop, sAffineAnim_Battler_Grow, sAffineAnim_Battler_Shrink, sAffineAnim_Battler_GrowLarge, sAffineAnim_Battler_TipRight, sAffineAnim_Battler_BigToSmall, }; static const union AffineAnimCmd sAffineAnim_Battler_SpinShrink[] = { AFFINEANIMCMD_FRAME(-0x4, -0x4, 4, 63), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_TipLeft[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 3, 5), AFFINEANIMCMD_FRAME(0x0, 0x0, -3, 5), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_RotateUpAndBack[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 20), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 20), AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 20), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_Battler_Spin[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 9, 110), AFFINEANIMCMD_END, }; const union AffineAnimCmd *const gAffineAnims_BattleSpriteOpponentSide[] = { [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Normal, [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge, [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return, sAffineAnim_Battler_HorizontalSquishLoop, sAffineAnim_Battler_Grow, sAffineAnim_Battler_Shrink, sAffineAnim_Battler_SpinShrink, sAffineAnim_Battler_TipLeft, sAffineAnim_Battler_RotateUpAndBack, sAffineAnim_Battler_BigToSmall, sAffineAnim_Battler_Spin, }; const union AffineAnimCmd *const gAffineAnims_BattleSpriteContest[] = { [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Flipped, [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge, [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return, sAffineAnim_Battler_HorizontalSquishLoop, sAffineAnim_Battler_Grow, sAffineAnim_Battler_Shrink, sAffineAnim_Battler_SpinShrink, sAffineAnim_Battler_TipLeft, sAffineAnim_Battler_RotateUpAndBack, sAffineAnim_Battler_BigToSmall, sAffineAnim_Battler_Spin, }; static const union AnimCmd sAnim_MonPic_0[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, }; static const union AnimCmd sAnim_MonPic_1[] = { ANIMCMD_FRAME(1, 0), ANIMCMD_END, }; static const union AnimCmd sAnim_MonPic_2[] = { ANIMCMD_FRAME(2, 0), ANIMCMD_END, }; static const union AnimCmd sAnim_MonPic_3[] = { ANIMCMD_FRAME(3, 0), ANIMCMD_END, }; const union AnimCmd *const gAnims_MonPic[] = { sAnim_MonPic_0, sAnim_MonPic_1, sAnim_MonPic_2, sAnim_MonPic_3, }; #define SPECIES_SPRITE(species, sprite) [SPECIES_##species] = {sprite, 0x800, SPECIES_##species} #define SPECIES_PAL(species, pal) [SPECIES_##species] = {pal, SPECIES_##species} #define SPECIES_SHINY_PAL(species, pal) [SPECIES_##species] = {pal, SPECIES_##species + SPECIES_SHINY_TAG} #define TRAINER_SPRITE(trainerPic, sprite, size) [TRAINER_PIC_##trainerPic] = {sprite, size, TRAINER_PIC_##trainerPic} #define TRAINER_PAL(trainerPic, pal) [TRAINER_PIC_##trainerPic] = {pal, TRAINER_PIC_##trainerPic} #include "data/pokemon_graphics/front_pic_coordinates.h" #include "data/pokemon_graphics/front_pic_table.h" #include "data/pokemon_graphics/back_pic_coordinates.h" #include "data/pokemon_graphics/back_pic_table.h" #include "data/pokemon_graphics/palette_table.h" #include "data/pokemon_graphics/shiny_palette_table.h" #include "data/trainer_graphics/front_pic_anims.h" #include "data/trainer_graphics/front_pic_tables.h" #include "data/trainer_graphics/back_pic_anims.h" #include "data/trainer_graphics/back_pic_tables.h" #include "data/pokemon_graphics/enemy_mon_elevation.h" #include "data/trainer_parties.h" #include "data/master_trainer_parties.h" #include "data/text/trainer_class_names.h" #include "data/trainers.h" #include "data/master_trainers.h" #include "data/text/species_names.h" #include "data/text/move_names.h" ================================================ FILE: src/daycare.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "battle.h" #include "battle_setup.h" #include "constants/items.h" #include "mail_data.h" #include "pokemon_storage_system.h" #include "event_data.h" #include "random.h" #include "constants/moves.h" #include "menu.h" #include "new_menu_helpers.h" #include "script.h" #include "strings.h" #include "party_menu.h" #include "list_menu.h" #include "overworld.h" #include "pokedex.h" #include "decompress.h" #include "constants/songs.h" #include "text_window.h" #include "trig.h" #include "m4a.h" #include "graphics.h" #include "scanline_effect.h" #include "naming_screen.h" #include "help_system.h" #include "field_fadetransition.h" #include "trade.h" #include "constants/daycare.h" #include "constants/region_map_sections.h" // Combination of RSE's Day-Care (re-used on Four Island), FRLG's Day-Care, and egg_hatch.c extern const struct Evolution gEvolutionTable[][EVOS_PER_MON]; struct EggHatchData { u8 eggSpriteID; u8 pokeSpriteID; u8 CB2_state; u8 CB2_PalCounter; u8 eggPartyID; u8 unused_5; u8 unused_6; u8 eggShardVelocityID; u8 windowId; u8 unused_9; u8 unused_A; u16 species; u8 textColor[3]; }; // this file's functions static void ClearDaycareMonMail(struct DayCareMail *mail); static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare); static u8 GetDaycareCompatibilityScore(struct DayCare *daycare); static void DaycarePrintMonInfo(u8 windowId, u32 daycareSlotId, u8 y); static void Task_EggHatch(u8 taskID); static void CB2_EggHatch_0(void); static void CB2_EggHatch_1(void); static void SpriteCB_Egg_0(struct Sprite* sprite); static void SpriteCB_Egg_1(struct Sprite* sprite); static void SpriteCB_Egg_2(struct Sprite* sprite); static void SpriteCB_Egg_3(struct Sprite* sprite); static void SpriteCB_Egg_4(struct Sprite* sprite); static void SpriteCB_Egg_5(struct Sprite* sprite); static void SpriteCB_EggShard(struct Sprite* sprite); static void EggHatchPrintMessage(u8 windowId, u8 *string, u8 x, u8 y, u8 speed); static void CreateRandomEggShardSprite(void); static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex); static u8 GetEggCyclesToSubtract(void); // IWRAM bss static struct EggHatchData *sEggHatchData; // RAM buffers used to assist with BuildEggMoveset() EWRAM_DATA static u16 sHatchedEggLevelUpMoves[EGG_LVL_UP_MOVES_ARRAY_COUNT] = {0}; EWRAM_DATA static u16 sHatchedEggFatherMoves[4] = {0}; EWRAM_DATA static u16 sHatchedEggFinalMoves[4] = {0}; EWRAM_DATA static u16 sHatchedEggEggMoves[EGG_MOVES_ARRAY_COUNT] = {0}; EWRAM_DATA static u16 sHatchedEggMotherMoves[4] = {0}; #include "data/pokemon/egg_moves.h" static const struct WindowTemplate sDaycareLevelMenuWindowTemplate = { .bg = 0, .tilemapLeft = 12, .tilemapTop = 1, .width = 17, .height = 5, .paletteNum = 15, .baseBlock = 8 }; static const struct ListMenuItem sLevelMenuItems[] = { {gExpandedPlaceholder_Empty, 0}, {gExpandedPlaceholder_Empty, 1}, {gOtherText_Exit, DAYCARE_LEVEL_MENU_EXIT} }; static const struct ListMenuTemplate sDaycareListMenuLevelTemplate = { .items = sLevelMenuItems, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = DaycarePrintMonInfo, .totalItems = 3, .maxShowed = 3, .windowId = 0, .header_X = 2, .item_X = 8, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = FONT_NORMAL_COPY_2, .cursorKind = 0 }; static const u8 *const sCompatibilityMessages[] = { gDaycareText_GetAlongVeryWell, gDaycareText_GetAlong, gDaycareText_DontLikeOther, gDaycareText_PlayOther }; static const u8 sNewLineText[] = _("\n"); static const u8 sJapaneseEggNickname[] = _("タマゴ"); // "tamago" ("egg" in Japanese) static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/egg/normal.gbapal"); static const u8 sEggHatchTiles[] = INCBIN_U8("graphics/misc/egg_hatch.4bpp"); static const u8 sEggShardTiles[] = INCBIN_U8("graphics/misc/egg_shard.4bpp"); static const struct OamData sOamData_EggHatch = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(32x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sSpriteAnim_EggHatch0[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_EggHatch1[] = { ANIMCMD_FRAME(16, 5), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_EggHatch2[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_EggHatch3[] = { ANIMCMD_FRAME(48, 5), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_EggHatch[] = { sSpriteAnim_EggHatch0, sSpriteAnim_EggHatch1, sSpriteAnim_EggHatch2, sSpriteAnim_EggHatch3, }; static const struct SpriteSheet sEggHatch_Sheet = { .data = sEggHatchTiles, .size = 2048, .tag = 12345, }; static const struct SpriteSheet sEggShards_Sheet = { .data = sEggShardTiles, .size = 128, .tag = 23456, }; static const struct SpritePalette sEgg_SpritePalette = { .data = sEggPalette, .tag = 54321 }; static const struct SpriteTemplate sSpriteTemplate_EggHatch = { .tileTag = 12345, .paletteTag = 54321, .oam = &sOamData_EggHatch, .anims = sSpriteAnimTable_EggHatch, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_EggShard = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sSpriteAnim_EggShard0[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_EggShard1[] = { ANIMCMD_FRAME(1, 5), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_EggShard2[] = { ANIMCMD_FRAME(2, 5), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_EggShard3[] = { ANIMCMD_FRAME(3, 5), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_EggShard[] = { sSpriteAnim_EggShard0, sSpriteAnim_EggShard1, sSpriteAnim_EggShard2, sSpriteAnim_EggShard3, }; static const struct SpriteTemplate sSpriteTemplate_EggShard = { .tileTag = 23456, .paletteTag = 54321, .oam = &sOamData_EggShard, .anims = sSpriteAnimTable_EggShard, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_EggShard }; static const struct BgTemplate sBgTemplates_EggHatch[2] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 24, .screenSize = 3, .paletteMode = 0, .priority = 0, .baseTile = 0 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 8, .screenSize = 1, .paletteMode = 0, .priority = 2, .baseTile = 0 }, }; static const struct WindowTemplate sWinTemplates_EggHatch[2] = { { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 0, .baseBlock = 64 }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sYesNoWinTemplate = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 9, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 424 }; static const s16 sEggShardVelocities[][2] = { {Q_8_8(-1.5), Q_8_8(-3.75)}, {Q_8_8(-5), Q_8_8(-3)}, {Q_8_8(3.5), Q_8_8(-3)}, {Q_8_8(-4), Q_8_8(-3.75)}, {Q_8_8(2), Q_8_8(-1.5)}, {Q_8_8(-0.5), Q_8_8(-6.75)}, {Q_8_8(5), Q_8_8(-2.25)}, {Q_8_8(-1.5), Q_8_8(-3.75)}, {Q_8_8(4.5), Q_8_8(-1.5)}, {Q_8_8(-1), Q_8_8(-6.75)}, {Q_8_8(4), Q_8_8(-2.25)}, {Q_8_8(-3.5), Q_8_8(-3.75)}, {Q_8_8(1), Q_8_8(-1.5)}, {Q_8_8(-3.515625), Q_8_8(-6.75)}, {Q_8_8(4.5), Q_8_8(-2.25)}, {Q_8_8(-0.5), Q_8_8(-7.5)}, {Q_8_8(1), Q_8_8(-4.5)}, {Q_8_8(-2.5), Q_8_8(-2.25)}, {Q_8_8(2.5), Q_8_8(-7.5)}, }; // code static u8 *DayCare_GetMonNickname(struct Pokemon *mon, u8 *dest) { u8 nickname[POKEMON_NAME_LENGTH * 2]; GetMonData(mon, MON_DATA_NICKNAME, nickname); return StringCopy_Nickname(dest, nickname); } static u8 *DayCare_GetBoxMonNickname(struct BoxPokemon *mon, u8 *dest) { u8 nickname[POKEMON_NAME_LENGTH * 2]; GetBoxMonData(mon, MON_DATA_NICKNAME, nickname); return StringCopy_Nickname(dest, nickname); } u8 CountPokemonInDaycare(struct DayCare *daycare) { u8 i, count; count = 0; for (i = 0; i < DAYCARE_MON_COUNT; i++) { if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) != 0) count++; } return count; } void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDayCareMail *daycareMail) { u32 i; u8 numDaycareMons = 0; for (i = 0; i < DAYCARE_MON_COUNT; i++) { if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) != SPECIES_NONE) { numDaycareMons++; if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_HELD_ITEM) == ITEM_NONE) { daycareMail->holdsItem[i] = FALSE; } else { daycareMail->holdsItem[i] = TRUE; } } else { daycareMail->holdsItem[i] = TRUE; } } daycareMail->numDaycareMons = numDaycareMons; } static s8 Daycare_FindEmptySpot(struct DayCare *daycare) { u32 i; for (i = 0; i < DAYCARE_MON_COUNT; i++) { if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) == 0) return i; } return -1; } static void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycareMon) { if (MonHasMail(mon)) { u8 mailId; StringCopy(daycareMon->mail.OT_name, gSaveBlock2Ptr->playerName); DayCare_GetMonNickname(mon, daycareMon->mail.monName); // StripExtCtrlCodes(daycareMon->mail.monName); // daycareMon->mail.gameLanguage = LANGUAGE_ENGLISH; // daycareMon->mail.monLanguage = GetMonData(mon, MON_DATA_LANGUAGE); mailId = GetMonData(mon, MON_DATA_MAIL); daycareMon->mail.message = gSaveBlock1Ptr->mail[mailId]; TakeMailFromMon(mon); } StoreHPAndStatusInBoxMon(mon); daycareMon->mon = mon->box; if(gSaveBlock1Ptr->keyFlags.noPMC != 1) BoxMonRestorePP(&daycareMon->mon); daycareMon->steps = 0; ZeroMonData(mon); CompactPartySlots(); CalculatePlayerPartyCount(); } static void StorePokemonInEmptyDaycareSlot(struct Pokemon *mon, struct DayCare *daycare) { s8 slotId = Daycare_FindEmptySpot(daycare); StorePokemonInDaycare(mon, &daycare->mons[slotId]); } void StoreSelectedPokemonInDaycare(void) { u8 monId = GetCursorSelectionMonId(); StorePokemonInEmptyDaycareSlot(&gPlayerParty[monId], &gSaveBlock1Ptr->daycare); } // Shifts the second daycare pokemon slot into the first slot. static void ShiftDaycareSlots(struct DayCare *daycare) { // This condition is only satisfied when the player takes out the first pokemon from the daycare. if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != SPECIES_NONE && GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) == SPECIES_NONE) { daycare->mons[0].mon = daycare->mons[1].mon; ZeroBoxMonData(&daycare->mons[1].mon); daycare->mons[0].mail = daycare->mons[1].mail; daycare->mons[0].steps = daycare->mons[1].steps; daycare->mons[1].steps = 0; ClearDaycareMonMail(&daycare->mons[1].mail); } } static void ApplyDaycareExperience(struct Pokemon *mon) { s32 i; bool8 firstMove; u16 learnedMove; for (i = 0; i < MAX_LEVEL; i++) { // Add the mon's gained daycare experience level by level until it can't level up anymore. if (TryIncrementMonLevel(mon)) { // Teach the mon new moves it learned while in the daycare. firstMove = TRUE; while ((learnedMove = MonTryLearningNewMove(mon, firstMove)) != 0) { firstMove = FALSE; if (learnedMove == MON_HAS_MAX_MOVES) DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn); } } else { break; } } // Re-calculate the mons stats at its new level. CalculateMonStats(mon, FALSE); } static u16 TakeSelectedPokemonFromDaycare(struct DaycareMon *daycareMon) { u16 species; u32 experience; struct Pokemon pokemon; u8 sentPC; DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar1); species = GetBoxMonData(&daycareMon->mon, MON_DATA_SPECIES); BoxMonToMon(&daycareMon->mon, &pokemon); PopulateBoxHpAndStatusToPartyMon(&pokemon); if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL) { experience = GetMonData(&pokemon, MON_DATA_EXP) + daycareMon->steps; SetMonData(&pokemon, MON_DATA_EXP, &experience); ApplyDaycareExperience(&pokemon); } if(CalculatePlayerPartyCount() != 6) { gSpecialVar_MonBoxId = 9999; gSpecialVar_MonBoxPos = 9999; gPlayerParty[PARTY_SIZE - 1] = pokemon; } else //convert back to boxmon and send to box { sentPC = SendMonToPC(&pokemon); if(sentPC == MON_CANT_GIVE) { return 9999; //error! Can't retrieve! } } if (daycareMon->mail.message.itemId) //should never trigger for mons sent to box { GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycareMon->mail.message); ClearDaycareMonMail(&daycareMon->mail); } DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar2); ZeroBoxMonData(&daycareMon->mon); daycareMon->steps = 0; CompactPartySlots(); CalculatePlayerPartyCount(); return species; } static u16 TakeSelectedPokemonMonFromDaycareShiftSlots(struct DayCare *daycare, u8 slotId) { u16 species = TakeSelectedPokemonFromDaycare(&daycare->mons[slotId]); ShiftDaycareSlots(daycare); return species; } u16 TakePokemonFromDaycare(void) { return TakeSelectedPokemonMonFromDaycareShiftSlots(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004); } static u8 GetLevelAfterDaycareSteps(struct BoxPokemon *mon, u32 steps) { struct BoxPokemon tempMon = *mon; u32 experience = GetBoxMonData(mon, MON_DATA_EXP) + steps; SetBoxMonData(&tempMon, MON_DATA_EXP, &experience); return GetLevelFromBoxMonExp(&tempMon); } static u8 GetNumLevelsGainedFromSteps(struct DaycareMon *daycareMon) { u8 levelBefore; u8 levelAfter; levelBefore = GetLevelFromBoxMonExp(&daycareMon->mon); levelAfter = GetLevelAfterDaycareSteps(&daycareMon->mon, daycareMon->steps); return levelAfter - levelBefore; } static u8 GetNumLevelsGainedForDaycareMon(struct DaycareMon *daycareMon) { u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycareMon); ConvertIntToDecimalStringN(gStringVar2, numLevelsGained, STR_CONV_MODE_LEFT_ALIGN, 2); DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar1); return numLevelsGained; } static u32 GetDaycareCostForSelectedMon(struct DaycareMon *daycareMon) { u32 cost; u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycareMon); DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar1); cost = 100 + 100 * numLevelsGained; ConvertIntToDecimalStringN(gStringVar2, cost, STR_CONV_MODE_LEFT_ALIGN, 5); return cost; } static u16 GetDaycareCostForMon(struct DayCare *daycare, u8 slotId) { return GetDaycareCostForSelectedMon(&daycare->mons[slotId]); } void GetDaycareCost(void) { gSpecialVar_0x8005 = GetDaycareCostForMon(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004); } static void Debug_AddDaycareSteps(u16 numSteps) { gSaveBlock1Ptr->daycare.mons[0].steps += numSteps; gSaveBlock1Ptr->daycare.mons[1].steps += numSteps; gSaveBlock1Ptr->route5DayCareMon.steps += numSteps; } u8 GetNumLevelsGainedFromDaycare(void) { if (GetBoxMonData(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004], MON_DATA_SPECIES) != 0) return GetNumLevelsGainedForDaycareMon(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004]); return 0; } static void ClearDaycareMonMail(struct DayCareMail *mail) { s32 i; for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) mail->OT_name[i] = 0; for (i = 0; i < POKEMON_NAME_LENGTH + 1; i++) mail->monName[i] = 0; ClearMailStruct(&mail->message); } static void ClearDaycareMon(struct DaycareMon *daycareMon) { ZeroBoxMonData(&daycareMon->mon); daycareMon->steps = 0; ClearDaycareMonMail(&daycareMon->mail); } static void ClearAllDaycareData(struct DayCare *daycare) { u32 i; for (i = 0; i < DAYCARE_MON_COUNT; i++) ClearDaycareMon(&daycare->mons[i]); daycare->offspringPersonality = 0; daycare->stepCounter = 0; } // Determines what the species of an Egg would be based on the given species. // It determines this by working backwards through the evolution chain of the // given species. static u16 GetEggSpecies(u16 species) { int i, j, k; bool8 found; // Working backwards up to 5 times seems arbitrary, since the maximum number // of times would only be 3 for 3-stage evolutions. for (i = 0; i < EVOS_PER_MON; i++) { found = FALSE; for (j = 1; j < NUM_SPECIES; j++) { for (k = 0; k < EVOS_PER_MON; k++) { if (gEvolutionTable[j][k].targetSpecies == species) { species = j; found = TRUE; break; } } if (found) break; } if (j == NUM_SPECIES) break; } return species; } static s32 GetParentToInheritNature(struct DayCare *daycare) { u32 species[DAYCARE_MON_COUNT]; s32 i; s32 dittoCount; s32 parent = -1; // search for female gender for (i = 0; i < DAYCARE_MON_COUNT; i++) { if (GetBoxMonGender(&daycare->mons[i].mon) == MON_FEMALE) parent = i; } // search for ditto for (dittoCount = 0, i = 0; i < DAYCARE_MON_COUNT; i++) { species[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES); if (species[i] == SPECIES_DITTO) dittoCount++, parent = i; } // coin flip on ...two Dittos if (dittoCount == DAYCARE_MON_COUNT) { if (Random() >= USHRT_MAX / 2) parent = 0; else parent = 1; } // Don't inherit nature if not holding Everstone if (GetBoxMonData(&daycare->mons[parent].mon, MON_DATA_HELD_ITEM) != ITEM_EVERSTONE || Random() >= USHRT_MAX / 2) { return -1; } return parent; } static void _TriggerPendingDaycareEgg(struct DayCare *daycare) { s32 parent; s32 natureTries = 0; SeedRng2(gMain.vblankCounter2); parent = GetParentToInheritNature(daycare); // don't inherit nature if (parent < 0) { daycare->offspringPersonality = (Random2() << 16) | ((Random() % 0xfffe) + 1); } // inherit nature else { u8 wantedNature = GetNatureFromPersonality(GetBoxMonData(&daycare->mons[parent].mon, MON_DATA_PERSONALITY, NULL)); u32 personality; do { personality = (Random2() << 16) | (Random()); if (wantedNature == GetNatureFromPersonality(personality) && personality != 0) break; // found a personality with the same nature natureTries++; } while (natureTries <= 2400); daycare->offspringPersonality = personality; } VarSet(VAR_DAYCARE_MAN_TRIGGERS, 0); FlagSet(FLAG_PENDING_DAYCARE_EGG); } static void _TriggerPendingDaycareMaleEgg(struct DayCare *daycare) { daycare->offspringPersonality = (Random()) | (EGG_GENDER_MALE); VarSet(VAR_DAYCARE_MAN_TRIGGERS, 0); FlagSet(FLAG_PENDING_DAYCARE_EGG); } void TriggerPendingDaycareEgg(void) { _TriggerPendingDaycareEgg(&gSaveBlock1Ptr->daycare); } static void TriggerPendingDaycareMaleEgg(void) { _TriggerPendingDaycareMaleEgg(&gSaveBlock1Ptr->daycare); } // Removes the selected index from the given IV list and shifts the remaining // elements to the left. static void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv) { s32 i, j; u8 temp[NUM_STATS]; ivs[selectedIv] = 0xFF; for (i = 0; i < NUM_STATS; i++) { temp[i] = ivs[i]; } j = 0; for (i = 0; i < NUM_STATS; i++) { if (temp[i] != 0xFF) ivs[j++] = temp[i]; } } static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare) { u32 i; u8 selectedIvs[INHERITED_IV_COUNT]; u8 availableIVs[NUM_STATS]; u8 whichParent[NELEMS(selectedIvs)]; u8 iv; // Initialize a list of IV indices. for (i = 0; i < NUM_STATS; i++) { availableIVs[i] = i; } // Select the 3 IVs that will be inherited. for (i = 0; i < NELEMS(selectedIvs); i++) { // Randomly pick an IV from the available list and stop from being chosen again. selectedIvs[i] = availableIVs[Random() % (NUM_STATS - i)]; RemoveIVIndexFromList(availableIVs, selectedIvs[i]); } // Determine which parent each of the selected IVs should inherit from. for (i = 0; i < NELEMS(selectedIvs); i++) { whichParent[i] = Random() % DAYCARE_MON_COUNT; } // Set each of inherited IVs on the egg mon. for (i = 0; i < NELEMS(selectedIvs); i++) { switch (selectedIvs[i]) { case 0: iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_HP_IV); SetMonData(egg, MON_DATA_HP_IV, &iv); break; case 1: iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_ATK_IV); SetMonData(egg, MON_DATA_ATK_IV, &iv); break; case 2: iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_DEF_IV); SetMonData(egg, MON_DATA_DEF_IV, &iv); break; case 3: iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_SPEED_IV); SetMonData(egg, MON_DATA_SPEED_IV, &iv); break; case 4: iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_SPATK_IV); SetMonData(egg, MON_DATA_SPATK_IV, &iv); break; case 5: iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_SPDEF_IV); SetMonData(egg, MON_DATA_SPDEF_IV, &iv); break; } } } // Counts the number of egg moves a pokemon learns and stores the moves in // the given array. static u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves) { u16 eggMoveIdx; u16 numEggMoves; u16 species; u32 i; numEggMoves = 0; eggMoveIdx = 0; species = GetMonData(pokemon, MON_DATA_SPECIES); for (i = 0; i < NELEMS(gEggMoves) - 1; i++) { if (gEggMoves[i] == species + EGG_MOVES_SPECIES_OFFSET) { eggMoveIdx = i + 1; break; } } for (i = 0; i < EGG_MOVES_ARRAY_COUNT; i++) { if (gEggMoves[eggMoveIdx + i] > EGG_MOVES_SPECIES_OFFSET) { // TODO: the curly braces around this if statement are required for a matching build. break; } eggMoves[i] = gEggMoves[eggMoveIdx + i]; numEggMoves++; } return numEggMoves; } static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother) { u16 numSharedParentMoves; u32 numLevelUpMoves; u16 numEggMoves; u16 i, j; numSharedParentMoves = 0; for (i = 0; i < MAX_MON_MOVES; i++) { sHatchedEggMotherMoves[i] = MOVE_NONE; sHatchedEggFatherMoves[i] = MOVE_NONE; sHatchedEggFinalMoves[i] = MOVE_NONE; } for (i = 0; i < EGG_MOVES_ARRAY_COUNT; i++) sHatchedEggEggMoves[i] = MOVE_NONE; for (i = 0; i < EGG_LVL_UP_MOVES_ARRAY_COUNT; i++) sHatchedEggLevelUpMoves[i] = MOVE_NONE; numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), sHatchedEggLevelUpMoves); for (i = 0; i < MAX_MON_MOVES; i++) { sHatchedEggFatherMoves[i] = GetBoxMonData(father, MON_DATA_MOVE1 + i); sHatchedEggMotherMoves[i] = GetBoxMonData(mother, MON_DATA_MOVE1 + i); } numEggMoves = GetEggMoves(egg, sHatchedEggEggMoves); for (i = 0; i < MAX_MON_MOVES; i++) { if (sHatchedEggFatherMoves[i] != MOVE_NONE) { for (j = 0; j < numEggMoves; j++) { if (sHatchedEggFatherMoves[i] == sHatchedEggEggMoves[j]) { if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES) DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFatherMoves[i]); break; } } } else { break; } } for (i = 0; i < MAX_MON_MOVES; i++) { if (sHatchedEggFatherMoves[i] != MOVE_NONE) { for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) { if (sHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01/*_FOCUS_PUNCH*/ + j) && CanMonLearnTMHM(egg, j)) { if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES) DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFatherMoves[i]); } } } } for (i = 0; i < MAX_MON_MOVES; i++) { if (sHatchedEggFatherMoves[i] == MOVE_NONE) break; for (j = 0; j < MAX_MON_MOVES; j++) { if (sHatchedEggFatherMoves[i] == sHatchedEggMotherMoves[j] && sHatchedEggFatherMoves[i] != MOVE_NONE) sHatchedEggFinalMoves[numSharedParentMoves++] = sHatchedEggFatherMoves[i]; } } for (i = 0; i < MAX_MON_MOVES; i++) { if (sHatchedEggFinalMoves[i] == MOVE_NONE) break; for (j = 0; j < numLevelUpMoves; j++) { if (sHatchedEggLevelUpMoves[j] != MOVE_NONE && sHatchedEggFinalMoves[i] == sHatchedEggLevelUpMoves[j]) { if (GiveMoveToMon(egg, sHatchedEggFinalMoves[i]) == MON_HAS_MAX_MOVES) DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFinalMoves[i]); break; } } } } static void RemoveEggFromDayCare(struct DayCare *daycare) { daycare->offspringPersonality = 0; daycare->stepCounter = 0; } void RejectEggFromDayCare(void) { RemoveEggFromDayCare(&gSaveBlock1Ptr->daycare); } static void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare) { u16 motherItem, fatherItem; if (*species == SPECIES_WYNAUT || *species == SPECIES_AZURILL) { motherItem = GetBoxMonData(&daycare->mons[0].mon, MON_DATA_HELD_ITEM); fatherItem = GetBoxMonData(&daycare->mons[1].mon, MON_DATA_HELD_ITEM); if (*species == SPECIES_WYNAUT && motherItem != ITEM_LAX_INCENSE && fatherItem != ITEM_LAX_INCENSE) { *species = SPECIES_WOBBUFFET; } if (*species == SPECIES_AZURILL && motherItem != ITEM_SEA_INCENSE && fatherItem != ITEM_SEA_INCENSE) { *species = SPECIES_MARILL; } } } static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parentSlots) { u32 i; u16 species[DAYCARE_MON_COUNT]; u16 eggSpecies; // Determine which of the daycare mons is the mother and father of the egg. // The 0th index of the parentSlots array is considered the mother slot, and the // 1st index is the father slot. for (i = 0; i < DAYCARE_MON_COUNT; i++) { species[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES); if (species[i] == SPECIES_DITTO) { parentSlots[0] = i ^ 1; parentSlots[1] = i; } else if (GetBoxMonGender(&daycare->mons[i].mon) == MON_FEMALE) { parentSlots[0] = i; parentSlots[1] = i ^ 1; } } eggSpecies = GetEggSpecies(species[parentSlots[0]]); if (eggSpecies == SPECIES_NIDORAN_F && daycare->offspringPersonality & EGG_GENDER_MALE) { eggSpecies = SPECIES_NIDORAN_M; } if (eggSpecies == SPECIES_ILLUMISE && daycare->offspringPersonality & EGG_GENDER_MALE) { eggSpecies = SPECIES_VOLBEAT; } // Make Ditto the "mother" slot if the other daycare mon is male. if (species[parentSlots[1]] == SPECIES_DITTO && GetBoxMonGender(&daycare->mons[parentSlots[0]].mon) != MON_FEMALE) { u8 ditto = parentSlots[1]; parentSlots[1] = parentSlots[0]; parentSlots[0] = ditto; } return eggSpecies; } static void _GiveEggFromDaycare(struct DayCare *daycare) { struct Pokemon egg; u16 species; u8 parentSlots[DAYCARE_MON_COUNT]; bool8 isEgg; species = DetermineEggSpeciesAndParentSlots(daycare, parentSlots); AlterEggSpeciesWithIncenseItem(&species, daycare); SetInitialEggData(&egg, species, daycare); InheritIVs(&egg, daycare); BuildEggMoveset(&egg, &daycare->mons[parentSlots[1]].mon, &daycare->mons[parentSlots[0]].mon); isEgg = TRUE; SetMonData(&egg, MON_DATA_IS_EGG, &isEgg); gPlayerParty[PARTY_SIZE - 1] = egg; CompactPartySlots(); CalculatePlayerPartyCount(); RemoveEggFromDayCare(daycare); } static void RivalStarterEggIVs(struct Pokemon *egg) { u32 i; u8 selectedIvs[INHERITED_IV_COUNT]; u8 availableIVs[NUM_STATS]; u8 whichParent[NELEMS(selectedIvs)]; u8 iv; // Initialize a list of IV indices. for (i = 0; i < NUM_STATS; i++) { availableIVs[i] = i; } // Select the 3 IVs that will be inherited. for (i = 0; i < NELEMS(selectedIvs); i++) { // Randomly pick an IV from the available list and stop from being chosen again. selectedIvs[i] = availableIVs[Random() % (NUM_STATS - i)]; RemoveIVIndexFromList(availableIVs, selectedIvs[i]); } // Set each of inherited IVs on the egg mon. for (i = 0; i < NELEMS(selectedIvs); i++) { switch (selectedIvs[i]) { case 0: iv = 31; SetMonData(egg, MON_DATA_HP_IV, &iv); break; case 1: iv = 31; SetMonData(egg, MON_DATA_ATK_IV, &iv); break; case 2: iv = 31; SetMonData(egg, MON_DATA_DEF_IV, &iv); break; case 3: iv = 31; SetMonData(egg, MON_DATA_SPEED_IV, &iv); break; case 4: iv = 31; SetMonData(egg, MON_DATA_SPATK_IV, &iv); break; case 5: iv = 31; SetMonData(egg, MON_DATA_SPDEF_IV, &iv); break; } } } void GiveRivalStarterEgg(void) { struct Pokemon egg; u16 species; u8 parentSlots[DAYCARE_MON_COUNT]; bool8 isEgg; u16 ball; u8 metLevel; u8 language; u16 *playerStarter = GetVarPointer(VAR_STARTER_MON); switch(*playerStarter) { case 0: species = SPECIES_CHARMANDER; break; case 1: species = SPECIES_BULBASAUR; break; case 2: species = SPECIES_SQUIRTLE; break; } //SetInitialEggData CreateMon(&egg, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, ((((Random()) % 0xFFFE) + 1) | (Random() << 16)), OT_ID_PLAYER_ID, 0); switch(species) { case SPECIES_CHARMANDER: GiveMoveToMon(&egg, MOVE_EMBER); GiveMoveToMon(&egg, MOVE_BELLY_DRUM); break; case SPECIES_BULBASAUR: GiveMoveToMon(&egg, MOVE_LEECH_SEED); GiveMoveToMon(&egg, MOVE_CURSE); break; case SPECIES_SQUIRTLE: GiveMoveToMon(&egg, MOVE_BUBBLE); GiveMoveToMon(&egg, MOVE_MIRROR_COAT); break; } metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; SetMonData(&egg, MON_DATA_POKEBALL, &ball); SetMonData(&egg, MON_DATA_NICKNAME, sJapaneseEggNickname); SetMonData(&egg, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].eggCycles); SetMonData(&egg, MON_DATA_MET_LEVEL, &metLevel); SetMonData(&egg, MON_DATA_LANGUAGE, &language); RivalStarterEggIVs(&egg); // 3 31s, rest random. isEgg = TRUE; SetMonData(&egg, MON_DATA_IS_EGG, &isEgg); gPlayerParty[PARTY_SIZE - 1] = egg; CompactPartySlots(); CalculatePlayerPartyCount(); } void GiveSelphyCorsolaEgg(void) { struct Pokemon egg; u16 species = SPECIES_CORSOLA; u8 parentSlots[DAYCARE_MON_COUNT]; bool8 isEgg; u16 ball; u8 metLevel; u8 otGender = FEMALE; u8 language; //SetInitialEggData CreateMon(&egg, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, ((((Random()) % 0xFFFE) + 1) | (Random() << 16)), OT_ID_PLAYER_ID, 0); GiveMoveToMon(&egg, MOVE_BARRIER); GiveMoveToMon(&egg, MOVE_INGRAIN); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; SetMonData(&egg, MON_DATA_POKEBALL, &ball); SetMonData(&egg, MON_DATA_NICKNAME, sJapaneseEggNickname); SetMonData(&egg, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].eggCycles); SetMonData(&egg, MON_DATA_MET_LEVEL, &metLevel); SetMonData(&egg, MON_DATA_LANGUAGE, &language); RivalStarterEggIVs(&egg); // 3 31s, rest random. isEgg = TRUE; SetMonData(&egg, MON_DATA_IS_EGG, &isEgg); StringCopy(gStringVar1, gTrainers[TRAINER_LADY_SELPHY].trainerName); StringCopy(gStringVar2, gSaveBlock2Ptr->playerName); if(StringCompare(gStringVar1, gStringVar2) == 0) { //If the player's name is SELPHY, make the Egg OT SEBASTIAN instead to keep it an outsider Egg. StringCopy(gStringVar1, gTrainers[TRAINER_BIRD_KEEPER_SEBASTIAN].trainerName); otGender = MALE; } SetMonData(&egg, MON_DATA_OT_NAME, &gStringVar1); SetMonData(&egg, MON_DATA_OT_GENDER, &otGender); gPlayerParty[PARTY_SIZE - 1] = egg; CompactPartySlots(); CalculatePlayerPartyCount(); } void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation) { u8 metLevel; u16 ball; u8 language; u8 metLocation; u8 isEgg; CreateMon(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; SetMonData(mon, MON_DATA_POKEBALL, &ball); SetMonData(mon, MON_DATA_NICKNAME, sJapaneseEggNickname); SetMonData(mon, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].eggCycles); SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); SetMonData(mon, MON_DATA_LANGUAGE, &language); if (setHotSpringsLocation) { metLocation = METLOC_SPECIAL_EGG; SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation); } isEgg = TRUE; SetMonData(mon, MON_DATA_IS_EGG, &isEgg); } static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare) { u32 personality; u16 ball; u8 metLevel; u8 language; personality = daycare->offspringPersonality;// | (Random() << 16); CreateMon(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, personality, OT_ID_PLAYER_ID, 0); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; SetMonData(mon, MON_DATA_POKEBALL, &ball); SetMonData(mon, MON_DATA_NICKNAME, sJapaneseEggNickname); SetMonData(mon, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].eggCycles); SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); SetMonData(mon, MON_DATA_LANGUAGE, &language); } void GiveEggFromDaycare(void) { _GiveEggFromDaycare(&gSaveBlock1Ptr->daycare); } static bool8 TryProduceOrHatchEgg(struct DayCare *daycare) { u32 i, validEggs = 0; for (i = 0; i < DAYCARE_MON_COUNT; i++) { if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SANITY_HAS_SPECIES)) daycare->mons[i].steps++, validEggs++; } // Check if an egg should be produced if (daycare->offspringPersonality == 0 && validEggs == DAYCARE_MON_COUNT && (daycare->mons[1].steps & 0xFF) == 0xFF) { u8 compatibility = GetDaycareCompatibilityScore(daycare); if (compatibility > (Random() * 100u) / USHRT_MAX) TriggerPendingDaycareEgg(); } // Hatch Egg if (++daycare->stepCounter == 255) { u32 steps; u8 toSub = GetEggCyclesToSubtract(); for (i = 0; i < gPlayerPartyCount; i++) { if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) continue; if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_BAD_EGG)) continue; steps = GetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP); if (steps != 0) { if(steps >= toSub) steps -= toSub; else steps -= 1; SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &steps); } else // hatch the egg { gSpecialVar_0x8004 = i; return TRUE; } } } return FALSE; // no hatching } bool8 ShouldEggHatch(void) { if (GetBoxMonData(&gSaveBlock1Ptr->route5DayCareMon.mon, MON_DATA_SANITY_HAS_SPECIES)) gSaveBlock1Ptr->route5DayCareMon.steps++; return TryProduceOrHatchEgg(&gSaveBlock1Ptr->daycare); } static bool8 IsEggPending(struct DayCare *daycare) { return (daycare->offspringPersonality != 0); } // gStringVar1 = first mon's nickname // gStringVar2 = second mon's nickname // gStringVar3 = first mon trainer's name static void _GetDaycareMonNicknames(struct DayCare *daycare) { u8 text[12]; if (GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) != SPECIES_NONE) { DayCare_GetBoxMonNickname(&daycare->mons[0].mon, gStringVar1); GetBoxMonData(&daycare->mons[0].mon, MON_DATA_OT_NAME, text); StringCopy(gStringVar3, text); } if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != SPECIES_NONE) { DayCare_GetBoxMonNickname(&daycare->mons[1].mon, gStringVar2); } } u16 GetSelectedMonNicknameAndSpecies(void) { DayCare_GetBoxMonNickname(&gPlayerParty[GetCursorSelectionMonId()].box, gStringVar1); return GetBoxMonData(&gPlayerParty[GetCursorSelectionMonId()].box, MON_DATA_SPECIES); } void GetDaycareMonNicknames(void) { _GetDaycareMonNicknames(&gSaveBlock1Ptr->daycare); } u8 GetDaycareState(void) { u8 numMons; if (IsEggPending(&gSaveBlock1Ptr->daycare)) { return DAYCARE_EGG_WAITING; } numMons = CountPokemonInDaycare(&gSaveBlock1Ptr->daycare); if (numMons != 0) { return numMons + 1; // DAYCARE_ONE_MON or DAYCARE_TWO_MONS } return DAYCARE_NO_MONS; } u8 GetDaycarePokemonCount(void) { u8 ret = CountPokemonInDaycare(&gSaveBlock1Ptr->daycare); if (ret) return ret; return 0; } // Determine if the two given egg group lists contain any of the // same egg groups. static bool8 EggGroupsOverlap(u16 *eggGroups1, u16 *eggGroups2) { s32 i, j; for (i = 0; i < EGG_GROUPS_PER_MON; i++) { for (j = 0; j < EGG_GROUPS_PER_MON; j++) { if (eggGroups1[i] == eggGroups2[j]) return TRUE; } } return FALSE; } static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) { u32 i; u16 eggGroups[DAYCARE_MON_COUNT][EGG_GROUPS_PER_MON]; u16 species[DAYCARE_MON_COUNT]; u32 trainerIds[DAYCARE_MON_COUNT]; u32 genders[DAYCARE_MON_COUNT]; for (i = 0; i < DAYCARE_MON_COUNT; i++) { u32 personality; species[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES); trainerIds[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_OT_ID); personality = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_PERSONALITY); genders[i] = GetGenderFromSpeciesAndPersonality(species[i], personality); eggGroups[i][0] = gSpeciesInfo[species[i]].eggGroups[0]; eggGroups[i][1] = gSpeciesInfo[species[i]].eggGroups[1]; } // check unbreedable egg group if (eggGroups[0][0] == EGG_GROUP_UNDISCOVERED || eggGroups[1][0] == EGG_GROUP_UNDISCOVERED) return PARENTS_INCOMPATIBLE; // two Ditto can't breed if (eggGroups[0][0] == EGG_GROUP_DITTO && eggGroups[1][0] == EGG_GROUP_DITTO) return PARENTS_INCOMPATIBLE; // one parent is Ditto if (eggGroups[0][0] == EGG_GROUP_DITTO || eggGroups[1][0] == EGG_GROUP_DITTO) { if (trainerIds[0] == trainerIds[1]) return PARENTS_LOW_COMPATIBILITY; return PARENTS_MED_COMPATIBILITY; } // neither parent is Ditto else { if (genders[0] == genders[1]) return PARENTS_INCOMPATIBLE; if (genders[0] == MON_GENDERLESS || genders[1] == MON_GENDERLESS) return PARENTS_INCOMPATIBLE; if (!EggGroupsOverlap(eggGroups[0], eggGroups[1])) return PARENTS_INCOMPATIBLE; if (species[0] == species[1]) { if (trainerIds[0] == trainerIds[1]) return PARENTS_MED_COMPATIBILITY; // same species, same trainer return PARENTS_MAX_COMPATIBILITY; // same species, different trainers } else { if (trainerIds[0] != trainerIds[1]) return PARENTS_MED_COMPATIBILITY; // different species, different trainers return PARENTS_LOW_COMPATIBILITY; // different species, same trainer } } } static u8 GetDaycareCompatibilityScoreFromSave(void) { return GetDaycareCompatibilityScore(&gSaveBlock1Ptr->daycare); } void SetDaycareCompatibilityString(void) { u8 whichString; u8 relationshipScore; relationshipScore = GetDaycareCompatibilityScoreFromSave(); whichString = 0; if (relationshipScore == PARENTS_INCOMPATIBLE) whichString = 3; if (relationshipScore == PARENTS_LOW_COMPATIBILITY) whichString = 2; if (relationshipScore == PARENTS_MED_COMPATIBILITY) whichString = 1; if (relationshipScore == PARENTS_MAX_COMPATIBILITY) whichString = 0; StringCopy(gStringVar4, sCompatibilityMessages[whichString]); } bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) { u32 i; u8 symbolsCount[GENDER_COUNT]; symbolsCount[MALE] = symbolsCount[FEMALE] = 0; for (i = 0; name[i] != EOS; i++) { if (name[i] == CHAR_MALE) symbolsCount[MALE]++; if (name[i] == CHAR_FEMALE) symbolsCount[FEMALE]++; } if (genderRatio == MON_MALE && symbolsCount[MALE] != 0 && symbolsCount[FEMALE] == 0) return TRUE; if (genderRatio == MON_FEMALE && symbolsCount[FEMALE] != 0 && symbolsCount[MALE] == 0) return TRUE; return FALSE; } static u8 *AppendGenderSymbol(u8 *name, u8 gender) { if (gender == MON_MALE) { if (!NameHasGenderSymbol(name, MON_MALE)) return StringAppend(name, gText_MaleSymbol4); } else if (gender == MON_FEMALE) { if (!NameHasGenderSymbol(name, MON_FEMALE)) return StringAppend(name, gText_FemaleSymbol4); } return StringAppend(name, gText_GenderlessSymbol); } static u8 *AppendMonGenderSymbol(u8 *name, struct BoxPokemon *boxMon) { return AppendGenderSymbol(name, GetBoxMonGender(boxMon)); } static void GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest) { u8 monNames[DAYCARE_MON_COUNT][20]; u32 i; *dest = EOS; for (i = 0; i < DAYCARE_MON_COUNT; i++) { DayCare_GetBoxMonNickname(&daycare->mons[i].mon, monNames[i]); AppendMonGenderSymbol(monNames[i], &daycare->mons[i].mon); } StringCopy(dest, monNames[0]); StringAppend(dest, sNewLineText); StringAppend(dest, monNames[1]); StringAppend(dest, sNewLineText); StringAppend(dest, gOtherText_Exit); } static void GetDaycareLevelMenuLevelText(struct DayCare *daycare, u8 *dest) { u32 i; u8 level; u8 text[20]; *dest = EOS; for (i = 0; i < DAYCARE_MON_COUNT; i++) { StringAppend(dest, gText_Lv); level = GetLevelAfterDaycareSteps(&daycare->mons[i].mon, daycare->mons[i].steps); ConvertIntToDecimalStringN(text, level, STR_CONV_MODE_LEFT_ALIGN, 3); StringAppend(dest, text); StringAppend(dest, sNewLineText); } } static void DaycareAddTextPrinter(u8 windowId, const u8 *text, u32 x, u32 y) { struct TextPrinterTemplate printer; printer.currentChar = text; printer.windowId = windowId; printer.fontId = FONT_NORMAL_COPY_2; printer.x = x; printer.y = y; printer.currentX = x; printer.currentY = y; printer.unk = 0; gTextFlags.useAlternateDownArrow = 0; printer.letterSpacing = 1; printer.lineSpacing = 1; printer.fgColor = 2; printer.bgColor = 1; printer.shadowColor = 3; AddTextPrinter(&printer, 0xFF, NULL); } static void DaycarePrintMonNickname(struct DayCare *daycare, u8 windowId, u32 daycareSlotId, u32 y) { u8 nickname[POKEMON_NAME_LENGTH * 2]; DayCare_GetBoxMonNickname(&daycare->mons[daycareSlotId].mon, nickname); AppendMonGenderSymbol(nickname, &daycare->mons[daycareSlotId].mon); DaycareAddTextPrinter(windowId, nickname, 8, y); } static void DaycarePrintMonLvl(struct DayCare *daycare, u8 windowId, u32 daycareSlotId, u32 y) { u8 level; u32 x; u8 lvlText[12]; u8 intText[8]; StringCopy(lvlText, gText_Lv); level = GetLevelAfterDaycareSteps(&daycare->mons[daycareSlotId].mon, daycare->mons[daycareSlotId].steps); ConvertIntToDecimalStringN(intText, level, STR_CONV_MODE_LEFT_ALIGN, 3); StringAppend(lvlText, intText); x = 132 - GetStringWidth(FONT_NORMAL_COPY_2, lvlText, 0); DaycareAddTextPrinter(windowId, lvlText, x, y); } static void DaycarePrintMonInfo(u8 windowId, u32 daycareSlotId, u8 y) { if (daycareSlotId < (unsigned) DAYCARE_MON_COUNT) { DaycarePrintMonNickname(&gSaveBlock1Ptr->daycare, windowId, daycareSlotId, y); DaycarePrintMonLvl(&gSaveBlock1Ptr->daycare, windowId, daycareSlotId, y); } } #define tMenuListTaskId data[0] #define tWindowId data[1] static void Task_HandleDaycareLevelMenuInput(u8 taskId) { u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuListTaskId); if (gMain.newKeys & A_BUTTON) { switch (input) { case 0: case 1: gSpecialVar_Result = input; break; case DAYCARE_LEVEL_MENU_EXIT: gSpecialVar_Result = DAYCARE_EXITED_LEVEL_MENU; break; } DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL); ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE); RemoveWindow(gTasks[taskId].tWindowId); DestroyTask(taskId); ScriptContext_Enable(); } else if (gMain.newKeys & B_BUTTON) { gSpecialVar_Result = DAYCARE_EXITED_LEVEL_MENU; DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL); ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE); RemoveWindow(gTasks[taskId].tWindowId); DestroyTask(taskId); ScriptContext_Enable(); } } void ShowDaycareLevelMenu(void) { struct ListMenuTemplate menuTemplate; u8 windowId; u8 listMenuTaskId; u8 daycareMenuTaskId; windowId = AddWindow(&sDaycareLevelMenuWindowTemplate); DrawStdWindowFrame(windowId, FALSE); menuTemplate = sDaycareListMenuLevelTemplate; menuTemplate.windowId = windowId; listMenuTaskId = ListMenuInit(&menuTemplate, 0, 0); CopyWindowToVram(windowId, COPYWIN_FULL); daycareMenuTaskId = CreateTask(Task_HandleDaycareLevelMenuInput, 3); gTasks[daycareMenuTaskId].tMenuListTaskId = listMenuTaskId; gTasks[daycareMenuTaskId].tWindowId = windowId; } #undef tMenuListTaskId #undef tWindowId void ChooseSendDaycareMon(void) { ChooseMonForDaycare(); gMain.savedCallback = CB2_ReturnToField; } // Route 5 Daycare void PutMonInRoute5Daycare(void) { u8 monIdx = GetCursorSelectionMonId(); StorePokemonInDaycare(&gPlayerParty[monIdx], &gSaveBlock1Ptr->route5DayCareMon); } void GetCostToWithdrawRoute5DaycareMon(void) { u16 cost = GetDaycareCostForSelectedMon(&gSaveBlock1Ptr->route5DayCareMon); gSpecialVar_0x8005 = cost; } bool8 IsThereMonInRoute5Daycare(void) { if (GetBoxMonData(&gSaveBlock1Ptr->route5DayCareMon.mon, MON_DATA_SPECIES) != SPECIES_NONE) return TRUE; return FALSE; } u8 GetNumLevelsGainedForRoute5DaycareMon(void) { return GetNumLevelsGainedForDaycareMon(&gSaveBlock1Ptr->route5DayCareMon); } u16 TakePokemonFromRoute5Daycare(void) { return TakeSelectedPokemonFromDaycare(&gSaveBlock1Ptr->route5DayCareMon); } static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp) { u16 species; u32 personality, pokerus; u8 i, friendship, language, gameMet, markings, isModernFatefulEncounter; u16 moves[MAX_MON_MOVES]; u32 ivs[NUM_STATS]; species = GetMonData(egg, MON_DATA_SPECIES); for (i = 0; i < MAX_MON_MOVES; i++) moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i); personality = GetMonData(egg, MON_DATA_PERSONALITY); for (i = 0; i < NUM_STATS; i++) ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i); // language = GetMonData(egg, MON_DATA_LANGUAGE); gameMet = GetMonData(egg, MON_DATA_MET_GAME); markings = GetMonData(egg, MON_DATA_MARKINGS); pokerus = GetMonData(egg, MON_DATA_POKERUS); isModernFatefulEncounter = GetMonData(egg, MON_DATA_MODERN_FATEFUL_ENCOUNTER); CreateMon(temp, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, personality, OT_ID_PLAYER_ID, 0); for (i = 0; i < MAX_MON_MOVES; i++) SetMonData(temp, MON_DATA_MOVE1 + i, &moves[i]); for (i = 0; i < NUM_STATS; i++) SetMonData(temp, MON_DATA_HP_IV + i, &ivs[i]); language = GAME_LANGUAGE; SetMonData(temp, MON_DATA_LANGUAGE, &language); SetMonData(temp, MON_DATA_MET_GAME, &gameMet); SetMonData(temp, MON_DATA_MARKINGS, &markings); friendship = 120; SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship); SetMonData(temp, MON_DATA_POKERUS, &pokerus); SetMonData(temp, MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter); *egg = *temp; } static void AddHatchedMonToParty(u8 id) { u8 isEgg = 0x46; // ? u16 pokeNum; u8 name[12]; u16 ball; u16 caughtLvl; u8 mapNameID; u32 eggOTID; u8 mapsecid; u8 otName[PLAYER_NAME_LENGTH]; bool32 wasFirstCatch = FALSE; struct Pokemon* mon = &gPlayerParty[id]; eggOTID = GetMonData(&gPlayerParty[id], MON_DATA_OT_ID); GetMonData(&gPlayerParty[id], MON_DATA_OT_NAME, otName); mapsecid = GetMonData(&gPlayerParty[id], MON_DATA_MET_LOCATION); CreatedHatchedMon(mon, &gEnemyParty[0]); SetMonData(mon, MON_DATA_IS_EGG, &isEgg); pokeNum = GetMonData(mon, MON_DATA_SPECIES); bufferspeciesname(name, pokeNum); SetMonData(mon, MON_DATA_NICKNAME, name); pokeNum = SpeciesToNationalPokedexNum(pokeNum); GetSetPokedexFlag(pokeNum, FLAG_SET_SEEN); GetSetPokedexFlag(pokeNum, FLAG_SET_CAUGHT); DayCare_GetMonNickname(mon, gStringVar1); ball = ITEM_POKE_BALL; SetMonData(mon, MON_DATA_POKEBALL, &ball); caughtLvl = 0; SetMonData(mon, MON_DATA_MET_LEVEL, &caughtLvl); //faint egg if Nuzlocke && not outsider && already gotten mon where it was received if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(eggOTID == GetMonData(mon, MON_DATA_OT_ID)) { // If not an outsider Egg if(GetMonData(mon, MON_DATA_SPECIES) == SPECIES_CORSOLA) { // Gift Corsola Egg handling StringCopy(gStringVar1, gTrainers[TRAINER_LADY_SELPHY].trainerName); if(StringCompare(gStringVar1, otName) == 0) { // Egg's OT Name is SELPHY StringCopy(gStringVar2, gSaveBlock2Ptr->playerName); if(StringCompare(gStringVar1, gStringVar2) != 0) { // Player's name is NOT SELPHY; this is the Corsola gift Egg mapsecid = MAPSEC_RESORT_GORGEOUS; } } StringCopy_PlayerName(gStringVar1, gTrainers[TRAINER_BIRD_KEEPER_SEBASTIAN].trainerName); if(StringCompare(gStringVar1, otName) == 0) { // Egg's OT Name is SEBASTI StringCopy(gStringVar2, gSaveBlock2Ptr->playerName); if(StringCompare(gStringVar1, gStringVar2) != 0) { // Player's name is NOT SEBASTI; this is the Corsola gift Egg mapsecid = MAPSEC_RESORT_GORGEOUS; } } } if(mapsecid == METLOC_SPECIAL_EGG) mapsecid = MAPSEC_WATER_LABYRINTH; } } mapNameID = GetCurrentRegionMapSectionId(); SetMonData(mon, MON_DATA_MET_LOCATION, &mapNameID); MonRestorePP(mon); CalculateMonStats(mon, FALSE); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(NuzlockeFlagGet(mapsecid)) { // Already had an encounter where Egg was encountered u16 zeroHP = 0; SetMonData(mon, MON_DATA_HP, &zeroHP); } if(!IsWildMonNuzlockeDupe(GetMonData(mon, MON_DATA_SPECIES))) { // Set encounter flag where Egg was received if not a dupe NuzlockeFlagSet(mapsecid); if(GetMonData(mon, MON_DATA_HP) > 0) wasFirstCatch = TRUE; // only set dupe flag if not fainted } if(wasFirstCatch) { // set dupe flag if hatched mon is first of its species SetNuzlockeDupeFlags(SpeciesToNationalPokedexNum(GetMonData(mon, MON_DATA_SPECIES))); } } CheckNationalDexEligibilityOnSaveLoad(); } void ScriptHatchMon(void) { AddHatchedMonToParty(gSpecialVar_0x8004); } static bool8 BufferDayCareMonReceivedMail(struct DayCare *daycare, u8 daycareId) { u8 nick[0x20]; struct DaycareMon *daycareMon = &daycare->mons[daycareId]; DayCare_GetBoxMonNickname(&daycareMon->mon, nick); if (daycareMon->mail.message.itemId != ITEM_NONE && (StringCompare(nick, daycareMon->mail.monName) != 0 || StringCompare(gSaveBlock2Ptr->playerName, daycareMon->mail.OT_name) != 0)) { StringCopy(gStringVar1, nick); StringCopy(gStringVar2, daycareMon->mail.OT_name); StringCopy(gStringVar3, daycareMon->mail.monName); return TRUE; } return FALSE; } bool8 DaycareMonReceivedMail(void) { return BufferDayCareMonReceivedMail(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004); } extern const struct CompressedSpriteSheet gMonFrontPicTable[]; static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16 *speciesLoc) { u8 r4 = 0; u8 spriteID = 0; // r7 struct Pokemon* mon = NULL; // r5 if (a0 == 0) { mon = &gPlayerParty[pokeID]; r4 = 1; } if (a0 == 1) { mon = &gPlayerParty[pokeID]; r4 = 3; } switch (switchID) { case 0: { u16 species = GetMonData(mon, MON_DATA_SPECIES); u32 pid = GetMonData(mon, MON_DATA_PERSONALITY); HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid); LoadCompressedSpritePalette(GetMonSpritePalStruct(mon)); *speciesLoc = species; } break; case 1: SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, r4); spriteID = CreateSprite(&gMultiuseSpriteTemplate, 120, 70, 6); gSprites[spriteID].invisible = TRUE; gSprites[spriteID].callback = SpriteCallbackDummy; break; } return spriteID; } static void VBlankCB_EggHatch(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void EggHatch(void) { LockPlayerFieldControls(); CreateTask(Task_EggHatch, 10); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); HelpSystem_Disable(); } static void Task_EggHatch(u8 taskID) { if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_EggHatch_0); gFieldCallback = FieldCB_ContinueScriptHandleMusic; DestroyTask(taskID); } } static void CB2_EggHatch_0(void) { switch (gMain.state) { case 0: SetGpuReg(REG_OFFSET_DISPCNT, 0); sEggHatchData = Alloc(sizeof(struct EggHatchData)); AllocateMonSpritesGfx(); sEggHatchData->eggPartyID = gSpecialVar_0x8004; sEggHatchData->eggShardVelocityID = 0; SetVBlankCallback(VBlankCB_EggHatch); gSpecialVar_0x8005 = GetCurrentMapMusic(); ResetTempTileDataBuffers(); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates_EggHatch, NELEMS(sBgTemplates_EggHatch)); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); SetBgAttribute(1, 7, 2); SetBgTilemapBuffer(1, Alloc(0x1000)); SetBgTilemapBuffer(0, Alloc(0x2000)); DeactivateAllTextPrinters(); ResetPaletteFade(); FreeAllSpritePalettes(); ResetSpriteData(); ResetTasks(); ScanlineEffect_Stop(); m4aSoundVSyncOn(); gMain.state++; break; case 1: InitWindows(sWinTemplates_EggHatch); sEggHatchData->windowId = 0; gMain.state++; break; case 2: DecompressAndLoadBgGfxUsingHeap(0, gBattleInterface_Textbox_Gfx, 0, 0, 0); CopyToBgTilemapBuffer(0, gBattleInterface_Textbox_Tilemap, 0, 0); LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); gMain.state++; break; case 3: LoadSpriteSheet(&sEggHatch_Sheet); LoadSpriteSheet(&sEggShards_Sheet); LoadSpritePalette(&sEgg_SpritePalette); gMain.state++; break; case 4: CopyBgTilemapBufferToVram(0); AddHatchedMonToParty(sEggHatchData->eggPartyID); gMain.state++; break; case 5: EggHatchCreateMonSprite(0, 0, sEggHatchData->eggPartyID, &sEggHatchData->species); gMain.state++; break; case 6: sEggHatchData->pokeSpriteID = EggHatchCreateMonSprite(0, 1, sEggHatchData->eggPartyID, &sEggHatchData->species); gMain.state++; break; case 7: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); LoadPalette(gTradeGba2_Pal, BG_PLTT_ID(1), 5 * PLTT_SIZE_4BPP); LoadBgTiles(1, gTradeGba_Gfx, 0x1420, 0); CopyToBgTilemapBuffer(1, gTradeOrHatchMonShadowTilemap, 0x1000, 0); CopyBgTilemapBufferToVram(1); gMain.state++; break; case 8: SetMainCallback2(CB2_EggHatch_1); sEggHatchData->CB2_state = 0; break; } RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void EggHatchSetMonNickname(void) { SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3); FreeMonSpritesGfx(); Free(sEggHatchData); HelpSystem_Enable(); SetMainCallback2(CB2_ReturnToField); } static void Task_EggHatchPlayBGM(u8 taskID) { if (gTasks[taskID].data[0] == 0) { StopMapMusic(); } if (gTasks[taskID].data[0] == 1) PlayBGM(MUS_EVOLUTION_INTRO); if (gTasks[taskID].data[0] > 60) { PlayBGM(MUS_EVOLUTION); DestroyTask(taskID); // UB: task is destroyed, yet the value is incremented } gTasks[taskID].data[0]++; } static void CB2_EggHatch_1(void) { u16 species; u8 gender; u32 personality; switch (sEggHatchData->CB2_state) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); sEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_EggHatch, 120, 75, 5); ShowBg(0); ShowBg(1); sEggHatchData->CB2_state++; CreateTask(Task_EggHatchPlayBGM, 5); break; case 1: if (!gPaletteFade.active) { FillWindowPixelBuffer(sEggHatchData->windowId, 0x00); sEggHatchData->CB2_PalCounter = 0; sEggHatchData->CB2_state++; } break; case 2: if (++sEggHatchData->CB2_PalCounter > 30) { sEggHatchData->CB2_state++; gSprites[sEggHatchData->eggSpriteID].callback = SpriteCB_Egg_0; } break; case 3: if (gSprites[sEggHatchData->eggSpriteID].callback == SpriteCallbackDummy) { PlayCry_Normal(sEggHatchData->species, 0); sEggHatchData->CB2_state++; } break; case 4: if (IsCryFinished()) { sEggHatchData->CB2_state++; } break; case 5: DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_HatchedFromEgg); EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 3, 0xFF); PlayFanfare(MUS_EVOLVED); sEggHatchData->CB2_state++; PutWindowTilemap(sEggHatchData->windowId); CopyWindowToVram(sEggHatchData->windowId, COPYWIN_FULL); break; case 6: if (IsFanfareTaskInactive()) sEggHatchData->CB2_state++; break; case 7: if (IsFanfareTaskInactive()) sEggHatchData->CB2_state++; break; case 8: DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3); species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES); gender = GetMonGender(&gPlayerParty[sEggHatchData->eggPartyID]); personality = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0); DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar3, species, gender, personality, EggHatchSetMonNickname); break; } else { StringExpandPlaceholders(gStringVar4, gText_NickHatchPrompt); EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 2, 1); sEggHatchData->CB2_state++; } break; case 9: if (!IsTextPrinterActive(sEggHatchData->windowId)) { LoadUserWindowGfx2(sEggHatchData->windowId, 0x140, BG_PLTT_ID(14)); CreateYesNoMenu(&sYesNoWinTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x140, 14, 0); sEggHatchData->CB2_state++; } break; case 10: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3); species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES); gender = GetMonGender(&gPlayerParty[sEggHatchData->eggPartyID]); personality = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0); DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar3, species, gender, personality, EggHatchSetMonNickname); break; case 1: case -1: sEggHatchData->CB2_state++; } break; case 11: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); sEggHatchData->CB2_state++; break; case 12: if (!gPaletteFade.active) { RemoveWindow(sEggHatchData->windowId); UnsetBgTilemapBuffer(0); UnsetBgTilemapBuffer(1); Free(sEggHatchData); SetMainCallback2(CB2_ReturnToField); HelpSystem_Enable(); } break; } RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void SpriteCB_Egg_0(struct Sprite* sprite) { if (++sprite->data[0] > 20) { sprite->callback = SpriteCB_Egg_1; sprite->data[0] = 0; } else { sprite->data[1] = (sprite->data[1] + 20) & 0xFF; sprite->x2 = Sin(sprite->data[1], 1); if (sprite->data[0] == 15) { PlaySE(SE_BALL); StartSpriteAnim(sprite, 1); CreateRandomEggShardSprite(); } } } static void SpriteCB_Egg_1(struct Sprite* sprite) { if (++sprite->data[2] > 30) { if (++sprite->data[0] > 20) { sprite->callback = SpriteCB_Egg_2; sprite->data[0] = 0; sprite->data[2] = 0; } else { sprite->data[1] = (sprite->data[1] + 20) & 0xFF; sprite->x2 = Sin(sprite->data[1], 2); if (sprite->data[0] == 15) { PlaySE(SE_BALL); StartSpriteAnim(sprite, 2); } } } } static void SpriteCB_Egg_2(struct Sprite* sprite) { if (++sprite->data[2] > 30) { if (++sprite->data[0] > 38) { u16 species; sprite->callback = SpriteCB_Egg_3; sprite->data[0] = 0; species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES); gSprites[sEggHatchData->pokeSpriteID].x2 = 0; gSprites[sEggHatchData->pokeSpriteID].y2 = gMonFrontPicCoords[species].y_offset; } else { sprite->data[1] = (sprite->data[1] + 20) & 0xFF; sprite->x2 = Sin(sprite->data[1], 2); if (sprite->data[0] == 15) { PlaySE(SE_BALL); StartSpriteAnim(sprite, 2); CreateRandomEggShardSprite(); CreateRandomEggShardSprite(); } if (sprite->data[0] == 30) PlaySE(SE_BALL); } } } static void SpriteCB_Egg_3(struct Sprite* sprite) { if (++sprite->data[0] > 50) { sprite->callback = SpriteCB_Egg_4; sprite->data[0] = 0; } } static void SpriteCB_Egg_4(struct Sprite* sprite) { s32 i; if (sprite->data[0] == 0) BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 0x10, 0xFFFF); if (sprite->data[0] < 4u) { for (i = 0; i <= 3; i++) CreateRandomEggShardSprite(); } sprite->data[0]++; if (!gPaletteFade.active) { PlaySE(SE_EGG_HATCH); sprite->invisible = TRUE; sprite->callback = SpriteCB_Egg_5; sprite->data[0] = 0; } } static void SpriteCB_Egg_5(struct Sprite* sprite) { if (sprite->data[0] == 0) { gSprites[sEggHatchData->pokeSpriteID].invisible = FALSE; StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1); } if (sprite->data[0] == 8) BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, 0xFFFF); if (sprite->data[0] <= 9) gSprites[sEggHatchData->pokeSpriteID].y -= 1; if (sprite->data[0] > 40) sprite->callback = SpriteCallbackDummy; sprite->data[0]++; } static void SpriteCB_EggShard(struct Sprite* sprite) { sprite->data[4] += sprite->data[1]; sprite->data[5] += sprite->data[2]; sprite->x2 = sprite->data[4] / 256; sprite->y2 = sprite->data[5] / 256; sprite->data[2] += sprite->data[3]; if (sprite->y + sprite->y2 > sprite->y + 20 && sprite->data[2] > 0) DestroySprite(sprite); } static void CreateRandomEggShardSprite(void) { u16 spriteAnimIndex; s16 velocity1 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][0]; s16 velocity2 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][1]; sEggHatchData->eggShardVelocityID++; spriteAnimIndex = Random() % 4; CreateEggShardSprite(120, 60, velocity1, velocity2, 100, spriteAnimIndex); } static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex) { u8 spriteID = CreateSprite(&sSpriteTemplate_EggShard, x, y, 4); gSprites[spriteID].data[1] = data1; gSprites[spriteID].data[2] = data2; gSprites[spriteID].data[3] = data3; StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex); } static void EggHatchPrintMessage(u8 windowId, u8 *string, u8 x, u8 y, u8 speed) { FillWindowPixelBuffer(windowId, 0xFF); sEggHatchData->textColor[0] = 0; sEggHatchData->textColor[1] = 5; sEggHatchData->textColor[2] = 6; AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_2, x, y, 1, 1, sEggHatchData->textColor, speed, string); } //Magma Armor/Flame Body ability static u8 GetEggCyclesToSubtract(void) { u8 count, i; for (count = CalculatePlayerPartyCount(), i = 0; i < count; i++) { if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG)) { u8 ability = GetMonAbility(&gPlayerParty[i]); if (ability == ABILITY_MAGMA_ARMOR || ability == ABILITY_FLAME_BODY) return 2; } } return 1; } void CheckDaycareMonsHaveMail(void) { if (gSaveBlock1Ptr->route5DayCareMon.mail.message.itemId) { if(gMapHeader.regionMapSectionId == MAPSEC_ROUTE_5) { gSpecialVar_Result = TRUE; //setting Route 5 return; } } switch(gSpecialVar_0x8004) { case 0: if (gSaveBlock1Ptr->daycare.mons[0].mail.message.itemId) { gSpecialVar_Result = TRUE; //setting Four Island mon 0 return; } break; case 1: if (gSaveBlock1Ptr->daycare.mons[1].mail.message.itemId) { gSpecialVar_Result = TRUE; //setting Four Island mon 1 return; } break; } } void IsPartyAndBoxesFull(void) { gSpecialVar_Result = IsPlayerPartyAndPokemonStorageFull(); } ================================================ FILE: src/decompress.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "pokemon.h" extern const struct CompressedSpriteSheet gMonFrontPicTable[]; extern const struct CompressedSpriteSheet gMonBackPicTable[]; static void DuplicateDeoxysTiles(void *pointer, s32 species); void LZDecompressWram(const void *src, void *dest) { LZ77UnCompWram(src, dest); } void LZDecompressVram(const void *src, void *dest) { LZ77UnCompVram(src, dest); } u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src) { struct SpriteSheet dest; LZ77UnCompWram(src->data, gDecompressionBuffer); dest.data = gDecompressionBuffer; dest.size = src->size; dest.tag = src->tag; return LoadSpriteSheet(&dest); } void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) { struct SpriteSheet dest; LZ77UnCompWram(src->data, buffer); dest.data = buffer; dest.size = src->size; dest.tag = src->tag; LoadSpriteSheet(&dest); } void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src) { struct SpritePalette dest; LZ77UnCompWram(src->data, gDecompressionBuffer); dest.data = (void *) gDecompressionBuffer; dest.tag = src->tag; LoadSpritePalette(&dest); } void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer) { struct SpritePalette dest; LZ77UnCompWram(a->data, buffer); dest.data = buffer; dest.tag = a->tag; LoadSpritePalette(&dest); } void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void *buffer, s32 species) { if (species > NUM_SPECIES) LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); else LZ77UnCompWram(src->data, buffer); DuplicateDeoxysTiles(buffer, species); } void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality) { bool8 isFrontPic; if (src == &gMonFrontPicTable[species]) isFrontPic = TRUE; // frontPic else isFrontPic = FALSE; // backPic LoadSpecialPokePic(src, dest, species, personality, isFrontPic); } void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic) { if (species == SPECIES_UNOWN) { u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C; // The other Unowns are separate from Unown A. if (i == 0) i = SPECIES_UNOWN; else i += SPECIES_UNOWN_B - 1; if (!isFrontPic) LZ77UnCompWram(gMonBackPicTable[i].data, dest); else LZ77UnCompWram(gMonFrontPicTable[i].data, dest); } else if(species == SPECIES_DEOXYS || (species >= 65530 && species <= 65533)) { if (!isFrontPic) LZ77UnCompWram(gMonBackPicTable[SPECIES_DEOXYS].data, dest); else LZ77UnCompWram(gMonFrontPicTable[SPECIES_DEOXYS].data, dest); if(!(species >= 65530 && species <= 65533)) { switch(personality) //pid was hijacked to hold Deoxys forms { //setting result to arbitrarily high numbers //picked highest ones to not interfere with //Pokemon expansion. case 1: //Attack Forme species = 65531; break; case 2: species = 65532; break; case 3: species = 65533; break; default: //Normal Forme species = 65530; } } } else if (species > NUM_SPECIES) // is species unknown? draw the ? icon LZ77UnCompWram(gMonFrontPicTable[0].data, dest); else LZ77UnCompWram(src->data, dest); DuplicateDeoxysTiles(dest, species); DrawSpindaSpots(species, personality, dest, isFrontPic); } static void DuplicateDeoxysTiles(void *pointer, s32 species) { u8 skipImage; switch(species) { case 65531: //Attack skipImage = 1; break; case 65532: //Defense skipImage = 2; break; case 65533: //Speed skipImage = 3; break; default: //Normal and all other Pokemon skipImage = 0; break; } CpuCopy32(pointer + (0x800 * skipImage), pointer, 0x800); } static void Unused_LZDecompressWramIndirect(const void **src, void *dest) { LZ77UnCompWram(*src, dest); } static void StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_tiles, u8 *dest_tiles) { /* This function appears to emulate behaviour found in the GB(C) versions regarding how the Pokemon images are stitched together to be displayed on the battle screen. Given "compacted" tiles, an object count and a bounding box/object size, place the tiles in such a way that the result will have each object centered in a 8x8 tile canvas. */ s32 i, j, k, l; u8 *src = src_tiles, *dest = dest_tiles; u8 bottom_off; if (object_size & 1) { // Object size is odd bottom_off = (object_size >> 1) + 4; for (l = 0; l < object_count; l++) { // Clear all unused rows of tiles plus the half-tile required due to centering for (j = 0; j < 8-object_size; j++) { for (k = 0; k < 8; k++) { for (i = 0; i < 16; i++) { if (j % 2 == 0) { // Clear top half of top tile and bottom half of bottom tile when on even j ((dest+i) + (k << 5))[((j >> 1) << 8)] = 0; ((bottom_off << 8) + (dest+i) + (k << 5) + 16)[((j >> 1) << 8)] = 0; } else { // Clear bottom half of top tile and top half of tile following bottom tile when on odd j ((dest+i) + (k << 5) + 16)[((j >> 1) << 8)] = 0; ((bottom_off << 8) + (dest+i) + (k << 5) + 256)[((j >> 1) << 8)] = 0; } } } } // Clear the columns to the left and right that wont be used completely // Unlike the previous loops, this will clear the later used space as well for (j = 0; j < 2; j++) { for (i = 0; i < 8; i++) { for (k = 0; k < 32; k++) { // Left side ((dest+k) + (i << 8))[(j << 5)] = 0; // Right side ((dest+k) + (i << 8))[(j << 5)+192] = 0; } } } // Skip the top row and first tile on the second row for objects of size 5 if (object_size == 5) dest += 0x120; // Copy tile data for (j = 0; j < object_size; j++) { for (k = 0; k < object_size; k++) { for (i = 0; i < 4; i++) { // Offset the tile by +4px in both x and y directions (dest + (i << 2))[18] = (src + (i << 2))[0]; (dest + (i << 2))[19] = (src + (i << 2))[1]; (dest + (i << 2))[48] = (src + (i << 2))[2]; (dest + (i << 2))[49] = (src + (i << 2))[3]; (dest + (i << 2))[258] = (src + (i << 2))[16]; (dest + (i << 2))[259] = (src + (i << 2))[17]; (dest + (i << 2))[288] = (src + (i << 2))[18]; (dest + (i << 2))[289] = (src + (i << 2))[19]; } src += 32; dest += 32; } // At the end of a row, skip enough tiles to get to the beginning of the next row if (object_size == 7) dest += 0x20; else if (object_size == 5) dest += 0x60; } // Skip remaining unused space to go to the beginning of the next object if (object_size == 7) dest += 0x100; else if (object_size == 5) dest += 0x1e0; } } else { // Object size is even for (i = 0; i < object_count; i++) { // For objects of size 6, the first and last row and column will be cleared // While the remaining space will be filled with actual data if (object_size == 6) { for (k = 0; k < 256; k++) { *dest = 0; dest++; } } for (j = 0; j < object_size; j++) { if (object_size == 6) { for (k = 0; k < 32; k++) { *dest = 0; dest++; } } // Copy tile data for (k = 0; k < 32 * object_size; k++) { *dest = *src; src++; dest++; } if (object_size == 6) { for (k = 0; k < 32; k++) { *dest = 0; dest++; } } } if (object_size == 6) { for (k = 0; k < 256; k++) { *dest = 0; dest++; } } } } } bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src) { struct SpriteSheet dest; void *buffer; buffer = AllocZeroed(*((u32 *)src->data) >> 8); if (!buffer) return TRUE; LZ77UnCompWram(src->data, buffer); dest.data = buffer; dest.size = src->size; dest.tag = src->tag; LoadSpriteSheet(&dest); Free(buffer); return FALSE; } bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src) { struct SpritePalette dest; void *buffer; buffer = AllocZeroed(*((u32 *)src->data) >> 8); if (!buffer) return TRUE; LZ77UnCompWram(src->data, buffer); dest.data = buffer; dest.tag = src->tag; LoadSpritePalette(&dest); Free(buffer); return FALSE; } u32 GetDecompressedDataSize(const u8 *ptr) { u32 ptr32[1]; u8 *ptr8 = (u8 *)ptr32; ptr8[0] = ptr[1]; ptr8[1] = ptr[2]; ptr8[2] = ptr[3]; ptr8[3] = 0; return ptr32[0]; } void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *buffer, s32 species) { if (species > NUM_SPECIES) LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); else LZ77UnCompWram(src->data, buffer); } void HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality) { bool8 isFrontPic; if (src == &gMonFrontPicTable[species]) isFrontPic = TRUE; // frontPic else isFrontPic = FALSE; // backPic LoadSpecialPokePic_DontHandleDeoxys(src, dest, species, personality, isFrontPic); } void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic) { if (species == SPECIES_UNOWN) { u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C; // The other Unowns are separate from Unown A. if (i == 0) i = SPECIES_UNOWN; else i += SPECIES_UNOWN_B - 1; if (!isFrontPic) LZ77UnCompWram(gMonBackPicTable[i].data, dest); else LZ77UnCompWram(gMonFrontPicTable[i].data, dest); } else if (species > NUM_SPECIES) // is species unknown? draw the ? icon { LZ77UnCompWram(gMonFrontPicTable[0].data, dest); } else { LZ77UnCompWram(src->data, dest); } DrawSpindaSpots(species, personality, dest, isFrontPic); } ================================================ FILE: src/decoration.c ================================================ #include "global.h" #include "decoration.h" #include "constants/decorations.h" #include "data/decoration/tiles.h" #include "data/decoration/description.h" #include "data/decoration/header.h" ================================================ FILE: src/digit_obj_util.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "digit_obj_util.h" struct DigitPrinterAlloc { u32 count; struct DigitPrinter { bool8 isActive; u8 firstOamId; u8 strConvMode; u8 oamCount; u8 palTagIndex; u8 size; u8 shape; u8 priority; u8 xDelta; u8 tilesPerImage; u16 tileStart; s16 x; s16 y; u16 tileTag; u16 palTag; u32 pow10; s32 lastPrinted; } *array; }; // this file's functions static u8 GetFirstOamId(u8 oamCount); static void CopyWorkToOam(struct DigitPrinter *objWork); static void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign); static void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign); static void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign); static bool32 SharesTileWithAnyActive(u32 id); static bool32 SharesPalWithAnyActive(u32 id); static u8 GetTilesPerImage(u32 shape, u32 size); // ewram static EWRAM_DATA struct DigitPrinterAlloc *sOamWork = {0}; // const rom data static const u8 sTilesPerImage[4][4] = { [ST_OAM_SQUARE] = { [ST_OAM_SIZE_0] = 0x01, // SPRITE_SIZE_8x8 [ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_16x16 [ST_OAM_SIZE_2] = 0x10, // SPRITE_SIZE_32x32 [ST_OAM_SIZE_3] = 0x40 // SPRITE_SIZE_64x64 }, [ST_OAM_H_RECTANGLE] = { [ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_16x8 [ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_32x8 [ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_32x16 [ST_OAM_SIZE_3] = 0x20 // SPRITE_SIZE_64x32 }, [ST_OAM_V_RECTANGLE] = { [ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_8x16 [ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_8x32 [ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_16x32 [ST_OAM_SIZE_3] = 0x20 // SPRITE_SIZE_32x64 } }; const u16 gMinigameDigits_Pal[] = INCBIN_U16("graphics/misc/minigame_digits.gbapal"); const u32 gMinigameDigits_Gfx[] = INCBIN_U32("graphics/misc/minigame_digits.4bpp.lz"); static const u32 sUnusedMinigameDigits_Gfx[] = INCBIN_U32("graphics/misc/minigame_digits_unused.4bpp.lz"); // code bool32 DigitObjUtil_Init(u32 count) { u32 i; if (sOamWork != NULL) DigitObjUtil_Free(); sOamWork = Alloc(sizeof(*sOamWork)); if (sOamWork == NULL) return FALSE; sOamWork->array = Alloc(sizeof(struct DigitPrinter) * count); if (sOamWork->array == NULL) { Free(sOamWork); return FALSE; } sOamWork->count = count; for (i = 0; i < count; i++) { sOamWork->array[i].isActive = FALSE; sOamWork->array[i].firstOamId = 0xFF; } return TRUE; } void DigitObjUtil_Free(void) { if (sOamWork != NULL) { if (sOamWork->array != NULL) { u32 i; for (i = 0; i < sOamWork->count; i++) DigitObjUtil_DeletePrinter(i); Free(sOamWork->array); } FREE_AND_SET_NULL(sOamWork); } } bool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemplate *template) { u32 i; if (sOamWork == NULL) return FALSE; if (sOamWork->array[id].isActive) return FALSE; sOamWork->array[id].firstOamId = GetFirstOamId(template->oamCount); if (sOamWork->array[id].firstOamId == 0xFF) return FALSE; sOamWork->array[id].tileStart = GetSpriteTileStartByTag(template->spriteSheet.uncompressed->tag); if (sOamWork->array[id].tileStart == 0xFFFF) { if (template->spriteSheet.uncompressed->size != 0) { sOamWork->array[id].tileStart = LoadSpriteSheet(template->spriteSheet.uncompressed); } else { struct CompressedSpriteSheet compObjectPic; compObjectPic = *template->spriteSheet.compressed; compObjectPic.size = GetDecompressedDataSize((const void *)template->spriteSheet.compressed->data); sOamWork->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic); } if (sOamWork->array[id].tileStart == 0xFFFF) return FALSE; } sOamWork->array[id].palTagIndex = IndexOfSpritePaletteTag(template->spritePal->tag); if (sOamWork->array[id].palTagIndex == 0xFF) sOamWork->array[id].palTagIndex = LoadSpritePalette(template->spritePal); sOamWork->array[id].strConvMode = template->strConvMode; sOamWork->array[id].oamCount = template->oamCount; sOamWork->array[id].x = template->x; sOamWork->array[id].y = template->y; sOamWork->array[id].shape = template->shape; sOamWork->array[id].size = template->size; sOamWork->array[id].priority = template->priority; sOamWork->array[id].xDelta = template->xDelta; sOamWork->array[id].tilesPerImage = GetTilesPerImage(template->shape, template->size); sOamWork->array[id].tileTag = template->spriteSheet.uncompressed->tag; sOamWork->array[id].palTag = template->spritePal->tag; sOamWork->array[id].isActive = TRUE; // Decimal left shift sOamWork->array[id].pow10 = 1; for (i = 1; i < template->oamCount; i++) sOamWork->array[id].pow10 *= 10; CopyWorkToOam(&sOamWork->array[id]); DigitObjUtil_PrintNumOn(id, num); return TRUE; } static void CopyWorkToOam(struct DigitPrinter *objWork) { u32 i; u32 oamId = objWork->firstOamId; u32 x = objWork->x; u32 oamCount = objWork->oamCount + 1; CpuFill16(0, &gMain.oamBuffer[oamId], sizeof(struct OamData) * oamCount); for (i = 0, oamId = objWork->firstOamId; i < oamCount; i++, oamId++) { gMain.oamBuffer[oamId].y = objWork->y; gMain.oamBuffer[oamId].x = x; gMain.oamBuffer[oamId].shape = objWork->shape; gMain.oamBuffer[oamId].size = objWork->size; gMain.oamBuffer[oamId].tileNum = objWork->tileStart; gMain.oamBuffer[oamId].priority = objWork->priority; gMain.oamBuffer[oamId].paletteNum = objWork->palTagIndex; x += objWork->xDelta; } oamId--; gMain.oamBuffer[oamId].x = objWork->x - objWork->xDelta; gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE; gMain.oamBuffer[oamId].tileNum = objWork->tileStart + (objWork->tilesPerImage * 10); } void DigitObjUtil_PrintNumOn(u32 id, s32 num) { bool32 sign; if (sOamWork == NULL) return; if (!sOamWork->array[id].isActive) return; sOamWork->array[id].lastPrinted = num; if (num < 0) { sign = TRUE; num *= -1; } else { sign = FALSE; } switch (sOamWork->array[id].strConvMode) { case 0: default: DrawNumObjsLeadingZeros(&sOamWork->array[id], num, sign); break; case 1: DrawNumObjsMinusInFront(&sOamWork->array[id], num, sign); break; case 2: DrawNumObjsMinusInBack(&sOamWork->array[id], num, sign); break; } } static void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign) { u32 pow10 = objWork->pow10; u32 oamId = objWork->firstOamId; while (pow10 != 0) { u32 digit = num / pow10; num -= (digit * pow10); pow10 /= 10; gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart; oamId++; } if (sign) gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF; else gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE; } static void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign) { u32 pow10 = objWork->pow10; static int oamId; static int curDigit; static int firstDigit; oamId = objWork->firstOamId; curDigit = 0; firstDigit = -1; while (pow10 != 0) { u32 digit = num / pow10; num -= (digit * pow10); pow10 /= 10; if (digit != 0 || firstDigit != -1 || pow10 == 0) { gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart; gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF; if (firstDigit == -1) firstDigit = curDigit; } else { gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE; } oamId++; curDigit++; } if (sign) { gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF; gMain.oamBuffer[oamId].x = objWork->x + ((firstDigit - 1) * objWork->xDelta); } else { gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE; } } static void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign) { u32 pow10 = objWork->pow10; u32 oamId = objWork->firstOamId; u32 printingDigits = 0; s32 nsprites = 0; while (pow10 != 0) { u32 digit = num / pow10; num -= (digit * pow10); pow10 /= 10; if (digit != 0 || printingDigits != 0 || pow10 == 0) { printingDigits = 1; gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart; gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF; oamId++; nsprites++; } } while (nsprites < objWork->oamCount) { gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE; oamId++; nsprites++; } if (sign) gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF; else gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE; } void DigitObjUtil_DeletePrinter(u32 id) { s32 oamId, oamCount, i; if (sOamWork == NULL) return; if (!sOamWork->array[id].isActive) return; oamCount = sOamWork->array[id].oamCount + 1; oamId = sOamWork->array[id].firstOamId; for (i = 0; i < oamCount; i++, oamId++) gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE; if (!SharesTileWithAnyActive(id)) FreeSpriteTilesByTag(sOamWork->array[id].tileTag); if (!SharesPalWithAnyActive(id)) FreeSpritePaletteByTag(sOamWork->array[id].palTag); sOamWork->array[id].isActive = FALSE; } void DigitObjUtil_HideOrShow(u32 id, bool32 hide) { s32 oamId, oamCount, i; if (sOamWork == NULL) return; if (!sOamWork->array[id].isActive) return; oamCount = sOamWork->array[id].oamCount + 1; oamId = sOamWork->array[id].firstOamId; if (hide) { for (i = 0; i < oamCount; i++, oamId++) gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE; } else { for (i = 0; i < oamCount; i++, oamId++) gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF; DigitObjUtil_PrintNumOn(id, sOamWork->array[id].lastPrinted); } } static u8 GetFirstOamId(u8 oamCount) { u32 i; u16 firstOamId = 64; for (i = 0; i < sOamWork->count; i++) { if (!sOamWork->array[i].isActive) { if (sOamWork->array[i].firstOamId != 0xFF && sOamWork->array[i].oamCount <= oamCount) return sOamWork->array[i].firstOamId; } else { firstOamId += 1 + sOamWork->array[i].oamCount; } } if (firstOamId + oamCount + 1 > 128) return 0xFF; else return firstOamId; } static bool32 SharesTileWithAnyActive(u32 id) { u32 i; for (i = 0; i < sOamWork->count; i++) { if (sOamWork->array[i].isActive && i != id && sOamWork->array[i].tileTag == sOamWork->array[id].tileTag) { return TRUE; } } return FALSE; } static bool32 SharesPalWithAnyActive(u32 id) { u32 i; for (i = 0; i < sOamWork->count; i++) { if (sOamWork->array[i].isActive && i != id && sOamWork->array[i].palTag == sOamWork->array[id].palTag) { return TRUE; } } return FALSE; } static u8 GetTilesPerImage(u32 shape, u32 size) { return sTilesPerImage[shape][size]; } ================================================ FILE: src/diploma.c ================================================ #include "global.h" #include "gflib.h" #include "dynamic_placeholder_text_util.h" #include "menu.h" #include "new_menu_helpers.h" #include "overworld.h" #include "pokedex.h" #include "scanline_effect.h" #include "strings.h" #include "task.h" #include "constants/sound.h" struct Diploma { u8 mainState; u8 gfxState; u8 initState; u16 tilemapBuffer[0x800]; }; enum { WIN_TEXT, WIN_COUNT }; enum { BG_TEXT, BG_DIPLOMA, }; static EWRAM_DATA struct Diploma *sDiploma = NULL; static void DiplomaReset(void); static void DiplomaPrintText(void); static bool8 DiplomaLoadGfx(void); static void DiplomaInitScreen(void); static void CB2_Diploma(void); static void Task_HandleDiplomaInput(u8); static void Task_DiplomaInit(u8); static void Task_DiplomaExit(u8); static const u32 sDiplomaGfx[] = INCBIN_U32("graphics/diploma/diploma.4bpp.lz"); static const u32 sDiplomaTilemap[] = INCBIN_U32("graphics/diploma/diploma.bin.lz"); static const u16 sDiplomaPal[] = INCBIN_U16("graphics/diploma/diploma.gbapal"); static const u8 sText_Empty[] = _("{COLOR DARK_GRAY}{HIGHLIGHT TRANSPARENT}"); static const ALIGNED(4) u8 sTextColors[3] = {0, 2, 3}; static const struct BgTemplate sBgTemplates[] = { { .bg = BG_TEXT, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 1, }, { .bg = BG_DIPLOMA, .charBaseIndex = 1, .mapBaseIndex = 29, .screenSize = 1, .paletteMode = 0, .priority = 1, .baseTile = 0, } }; static const struct WindowTemplate sWindowTemplates[WIN_COUNT + 1] = { [WIN_TEXT] = { .bg = BG_TEXT, .tilemapLeft = 0, .tilemapTop = 2, .width = 29, .height = 16, .paletteNum = 15, .baseBlock = 0x000 }, [WIN_COUNT] = DUMMY_WIN_TEMPLATE }; static void VBlankCB_Diploma(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void CB2_ShowDiploma(void) { sDiploma = AllocZeroed(sizeof(*sDiploma)); sDiploma->mainState = 0; sDiploma->gfxState = 0; sDiploma->initState = 0; DiplomaReset(); CreateTask(Task_DiplomaInit, 0); SetMainCallback2(CB2_Diploma); } static void CB2_Diploma(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void Task_DiplomaInit(u8 taskId) { switch (sDiploma->initState) { case 0: SetVBlankCallback(NULL); break; case 1: DiplomaInitScreen(); break; case 2: if (!DiplomaLoadGfx()) return; break; case 3: CopyToBgTilemapBuffer(BG_DIPLOMA, sDiplomaTilemap, 0, 0); break; case 4: if (HasAllMonsNew()) SetGpuReg(REG_OFFSET_BG1HOFS, 0x100); else SetGpuReg(REG_OFFSET_BG1HOFS, 0); break; case 5: DiplomaPrintText(); break; case 6: CopyBgTilemapBufferToVram(BG_TEXT); CopyBgTilemapBufferToVram(BG_DIPLOMA); break; case 7: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; case 8: SetVBlankCallback(VBlankCB_Diploma); break; default: if (gPaletteFade.active) break; PlayFanfareByFanfareNum(FANFARE_OBTAIN_BADGE); gTasks[taskId].func = Task_HandleDiplomaInput; } sDiploma->initState++; } static void Task_HandleDiplomaInput(u8 taskId) { switch (sDiploma->mainState) { case 0: if (WaitFanfare(FALSE)) sDiploma->mainState++; break; case 1: if (JOY_NEW(A_BUTTON)) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sDiploma->mainState++; } break; case 2: Task_DiplomaExit(taskId); break; } } static void Task_DiplomaExit(u8 taskId) { if (gPaletteFade.active) return; DestroyTask(taskId); FreeAllWindowBuffers(); FREE_AND_SET_NULL(sDiploma); SetMainCallback2(CB2_ReturnToFieldFromDiploma); } static void DiplomaReset(void) { ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); ResetTasks(); ScanlineEffect_Stop(); } static void DiplomaInitScreen(void) { void *vram = (void *)VRAM; DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); ChangeBgX(0, 0, BG_COORD_SET); ChangeBgY(0, 0, BG_COORD_SET); ChangeBgX(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); ChangeBgX(2, 0, BG_COORD_SET); ChangeBgY(2, 0, BG_COORD_SET); ChangeBgX(3, 0, BG_COORD_SET); ChangeBgY(3, 0, BG_COORD_SET); InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); SetBgTilemapBuffer(BG_DIPLOMA, sDiploma->tilemapBuffer); ShowBg(BG_TEXT); ShowBg(BG_DIPLOMA); FillBgTilemapBufferRect_Palette0(BG_TEXT, 0, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(BG_DIPLOMA, 0, 0, 0, 30, 20); } static bool8 DiplomaLoadGfx(void) { switch (sDiploma->gfxState) { case 0: ResetTempTileDataBuffers(); break; case 1: DecompressAndCopyTileDataToVram(BG_DIPLOMA, sDiplomaGfx, 0, 0, 0); break; case 2: if (FreeTempTileDataBuffersIfPossible() == TRUE) return FALSE; break; case 3: LoadPalette(sDiplomaPal, BG_PLTT_ID(0), sizeof(sDiplomaPal)); // fallthrough default: // Finished return TRUE; } sDiploma->gfxState++; return FALSE; } static void DiplomaPrintText(void) { u8 str[160]; u32 width; DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); if (HasAllMonsNew()) DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gText_Diploma_National); else DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gText_Diploma_Kanto); FillWindowPixelBuffer(WIN_TEXT, PIXEL_FILL(0)); DynamicPlaceholderTextUtil_ExpandPlaceholders(str, gText_Diploma_Player); width = GetStringWidth(FONT_NORMAL, str, -1); AddTextPrinterParameterized3(WIN_TEXT, FONT_NORMAL, 120 - (width / 2), 4, sTextColors, TEXT_SKIP_DRAW, str); DynamicPlaceholderTextUtil_ExpandPlaceholders(str, gText_Diploma_ThisDocument); width = GetStringWidth(FONT_NORMAL, str, -1); AddTextPrinterParameterized3(WIN_TEXT, FONT_NORMAL, 120 - (width / 2), 30, sTextColors, TEXT_SKIP_DRAW, str); AddTextPrinterParameterized3(WIN_TEXT, FONT_NORMAL, 120, 105, sTextColors, 0, gText_Diploma_GameFreak); PutWindowTilemap(WIN_TEXT); } ================================================ FILE: src/dma3_manager.c ================================================ #include "global.h" #include "dma3.h" #define MAX_DMA_REQUESTS 128 static struct { /* 0x00 */ const u8 *src; /* 0x04 */ u8 *dest; /* 0x08 */ u16 size; /* 0x0A */ u16 mode; /* 0x0C */ u32 value; } gDma3Requests[128]; static volatile bool8 gDma3ManagerLocked; static u8 gDma3RequestCursor; void ClearDma3Requests(void) { int i; gDma3ManagerLocked = TRUE; gDma3RequestCursor = 0; for(i = 0; i < (u8)NELEMS(gDma3Requests); i++) { gDma3Requests[i].size = 0; gDma3Requests[i].src = 0; gDma3Requests[i].dest = 0; } gDma3ManagerLocked = FALSE; } void ProcessDma3Requests(void) { u16 bytesTransferred; if (gDma3ManagerLocked) return; bytesTransferred = 0; // as long as there are DMA requests to process (unless size or vblank is an issue), do not exit while (gDma3Requests[gDma3RequestCursor].size != 0) { bytesTransferred += gDma3Requests[gDma3RequestCursor].size; if (bytesTransferred > 40 * 1024) return; // don't transfer more than 40 KiB if (*(u8 *)REG_ADDR_VCOUNT > 224) return; // we're about to leave vblank, stop switch (gDma3Requests[gDma3RequestCursor].mode) { case DMA_REQUEST_COPY32: // regular 32-bit copy Dma3CopyLarge32_(gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); break; case DMA_REQUEST_FILL32: // repeat a single 32-bit value across RAM Dma3FillLarge32_(gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); break; case DMA_REQUEST_COPY16: // regular 16-bit copy Dma3CopyLarge16_(gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); break; case DMA_REQUEST_FILL16: // repeat a single 16-bit value across RAM Dma3FillLarge16_(gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); break; } // Free the request gDma3Requests[gDma3RequestCursor].src = NULL; gDma3Requests[gDma3RequestCursor].dest = NULL; gDma3Requests[gDma3RequestCursor].size = 0; gDma3Requests[gDma3RequestCursor].mode = 0; gDma3Requests[gDma3RequestCursor].value = 0; gDma3RequestCursor++; if (gDma3RequestCursor >= MAX_DMA_REQUESTS) // loop back to the first DMA request gDma3RequestCursor = 0; } } s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode) { int cursor; int var = 0; gDma3ManagerLocked = 1; cursor = gDma3RequestCursor; while(1) { if(!gDma3Requests[cursor].size) // an empty copy was found and the current cursor will be returned. { gDma3Requests[cursor].src = src; gDma3Requests[cursor].dest = dest; gDma3Requests[cursor].size = size; if(mode == DMA3_32BIT) gDma3Requests[cursor].mode = DMA_REQUEST_COPY32; else gDma3Requests[cursor].mode = DMA_REQUEST_COPY16; gDma3ManagerLocked = FALSE; return (s16)cursor; } if(++cursor >= 0x80) // loop back to start. { cursor = 0; } if(++var >= 0x80) // max checks were made. all resulted in failure. { break; } } gDma3ManagerLocked = FALSE; return -1; } s16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode) { int cursor; int var = 0; cursor = gDma3RequestCursor; gDma3ManagerLocked = 1; while(1) { if(!gDma3Requests[cursor].size) { gDma3Requests[cursor].dest = dest; gDma3Requests[cursor].size = size; gDma3Requests[cursor].mode = mode; gDma3Requests[cursor].value = value; if(mode == DMA3_32BIT) gDma3Requests[cursor].mode = DMA_REQUEST_FILL32; else gDma3Requests[cursor].mode = DMA_REQUEST_FILL16; gDma3ManagerLocked = FALSE; return (s16)cursor; } if(++cursor >= 0x80) // loop back to start. { cursor = 0; } if(++var >= 0x80) // max checks were made. all resulted in failure. { break; } } gDma3ManagerLocked = FALSE; return -1; } s16 WaitDma3Request(s16 index) { int current = 0; if (index == -1) { for (; current < 0x80; current ++) if (gDma3Requests[current].size) return -1; return 0; } if (gDma3Requests[index].size) return -1; return 0; } ================================================ FILE: src/dodrio_berry_picking.c ================================================ #include "global.h" #include "gflib.h" #include "dodrio_berry_picking.h" #include "dynamic_placeholder_text_util.h" #include "event_data.h" #include "item.h" #include "link.h" #include "link_rfu.h" #include "m4a.h" #include "menu.h" #include "minigame_countdown.h" #include "new_menu_helpers.h" #include "random.h" #include "save.h" #include "script.h" #include "strings.h" #include "task.h" #include "text_window.h" #include "text_window_graphics.h" #include "constants/songs.h" #include "constants/sound.h" #include "constants/items.h" // Note that in this file 'Dodrio Berry Picking' is often // shortened to DodrioGame or just Game for convenience #define MAX_SCORE 999990 #define MAX_BERRIES 9999 // The minimum score needed to receive a prize #define PRIZE_SCORE 3000 // Difficulty increases as berries are eaten. The rate of new berries increases and the types of berries changes // When the max difficulty is reached it starts again from the beginning #define NUM_DIFFICULTIES 7 #define MAX_FALL_DIST 10 // The number of times a berry needs to fall before hitting the ground #define EAT_FALL_DIST 7 // The number of times a berry needs to fall to be available to eat enum { BG_INTERFACE, BG_TREE_LEFT, BG_TREE_RIGHT, BG_SCENERY }; enum { FUNC_INTRO, FUNC_INIT_COUNTDOWN, FUNC_COUNTDOWN, FUNC_WAIT_START, FUNC_PLAY_GAME, FUNC_INIT_RESULTS, FUNC_RESULTS, FUNC_ASK_PLAY_AGAIN, FUNC_END_LINK, FUNC_EXIT, FUNC_RESET_GAME, FUNC_WAIT_END_GAME, }; enum { GFXFUNC_LOAD, GFXFUNC_SHOW_NAMES, GFXFUNC_SHOW_RESULTS, GFXFUNC_MSG_PLAY_AGAIN, GFXFUNC_MSG_SAVING, GFXFUNC_MSG_COMM_STANDBY, GFXFUNC_ERASE_MSG, GFXFUNC_MSG_PLAYER_DROPPED, GFXFUNC_STOP, GFXFUNC_IDLE, }; enum { PLAY_AGAIN_NONE, PLAY_AGAIN_YES, PLAY_AGAIN_NO, PLAY_AGAIN_DROPPED = 5, }; enum { PICK_NONE, // Dodrio standing still PICK_RIGHT, // Dodrio reaching right PICK_MIDDLE, // Dodrio reaching up PICK_LEFT, // Dodrio reaching left PICK_DISABLED, // Dodrio down after game over }; enum { BERRY_BLUE, BERRY_GREEN, BERRY_GOLD, BERRY_MISSED, BERRY_PRIZE, BERRY_IN_ROW, NUM_BERRY_IDS }; #define NUM_BERRY_TYPES 4 // Blue, Green, Gold, and 'missed' // Eaten anim comes after the normal & missed versions of other berries #define ANIM_EATEN (BERRY_MISSED * 2) enum { BERRYSTATE_NONE, BERRYSTATE_PICKED, // Berry has been picked by a Dodrio, replaced with blue hit sprite (still falling) BERRYSTATE_EATEN, // Berry has been eaten (after being picked), berry is gone now BERRYSTATE_SQUISHED, // Berry has hit the ground }; enum { INPUTSTATE_NONE, INPUTSTATE_TRY_PICK, INPUTSTATE_PICKED, INPUTSTATE_ATE_BERRY, INPUTSTATE_BAD_MISS, }; // Colors for status bar squares // Colored gray when a berry is missed // Flash red when few yellow squares remain enum { STATUS_YELLOW, STATUS_GRAY, STATUS_RED, }; #define NUM_STATUS_SQUARES 10 #define GFXTAG_DODRIO 0 #define GFXTAG_STATUS 1 #define GFXTAG_BERRIES 2 #define GFXTAG_CLOUD 5 #define GFXTAG_COUNTDOWN 7 #define PALTAG_DODRIO_NORMAL 0 #define PALTAG_DODRIO_SHINY 1 #define PALTAG_STATUS 2 #define PALTAG_BERRIES 3 #define PALTAG_CLOUD 6 #define PALTAG_COUNTDOWN 8 #define NUM_CLOUDS 2 #define PLAYER_NONE 0xFF struct DodrioGame_Gfx { u16 ALIGNED(4) tilemapBuffers[3][BG_SCREEN_SIZE]; bool32 finished; u8 ALIGNED(4) taskId; u8 ALIGNED(4) windowIds[MAX_RFU_PLAYERS + 5]; // The latter 5 are never used u8 ALIGNED(4) state; u8 ALIGNED(4) loadState; u16 ALIGNED(4) timer; u8 ALIGNED(4) cursorSelection; u8 ALIGNED(4) playAgainState; void (*func)(void); }; // size = 0x302C struct StatusBar { u8 unused[12]; bool8 entered[NUM_STATUS_SQUARES]; s16 yChange[NUM_STATUS_SQUARES]; u16 spriteIds[NUM_STATUS_SQUARES]; u16 flashTimer; }; // size = 0x40 // Because Dodrio is required for this minigame, // the only relevant information about the selected // Pokémon is whether or not it's shiny struct DodrioGame_MonInfo { bool8 isShiny; }; struct DodrioGame_ScoreResults { u8 ranking; u32 score; }; struct DodrioGame { /*0x0000*/ void (*exitCallback)(void); /*0x0004*/ u8 ALIGNED(4) taskId; /*0x0008*/ u8 ALIGNED(4) playersReceived; /*0x000C*/ u8 ALIGNED(4) startState; /*0x0010*/ u8 ALIGNED(4) state; /*0x0014*/ u8 ALIGNED(4) timer; /*0x0018*/ u8 ALIGNED(4) funcId; /*0x001C*/ u8 ALIGNED(4) prevFuncId; // Set, never read /*0x0020*/ bool8 ALIGNED(4) isLeader; /*0x0024*/ u8 ALIGNED(4) numPlayers; /*0x0028*/ u8 ALIGNED(4) multiplayerId; /*0x0030*/ u8 ALIGNED(8) countdownEndDelay; /*0x0034*/ u8 ALIGNED(4) posToPlayerId[MAX_RFU_PLAYERS]; /*0x003C*/ u8 ALIGNED(4) unused2; // Set to 0, never read /*0x0040*/ u8 ALIGNED(4) numGraySquares; /*0x0044*/ u8 ALIGNED(4) berryColStart; /*0x0048*/ u8 ALIGNED(4) berryColEnd; /*0x004A*/ u16 berryResults[MAX_RFU_PLAYERS][NUM_BERRY_IDS]; /*0x0086*/ u16 berriesEaten[MAX_RFU_PLAYERS]; /*0x0090*/ u8 ALIGNED(4) difficulty[MAX_RFU_PLAYERS]; /*0x0098*/ u8 ALIGNED(4) pickStateQueue[4]; /*0x009C*/ u8 ALIGNED(4) eatTimer[NUM_BERRY_COLUMNS]; /*0x00A8*/ u8 ALIGNED(4) inputState[MAX_RFU_PLAYERS]; /*0x00B0*/ u8 ALIGNED(4) inputDelay[MAX_RFU_PLAYERS]; /*0x00B8*/ u8 ALIGNED(4) berryEatenBy[NUM_BERRY_COLUMNS]; /*0x00C4*/ u8 ALIGNED(4) berryState[NUM_BERRY_COLUMNS]; /*0x00D0*/ u8 ALIGNED(4) fallTimer[NUM_BERRY_COLUMNS]; /*0x00DC*/ u8 ALIGNED(4) newBerryTimer[NUM_BERRY_COLUMNS]; /*0x00E8*/ u8 ALIGNED(4) prevBerryIds[NUM_BERRY_COLUMNS]; /*0x00F4*/ u8 ALIGNED(4) playersAttemptingPick[NUM_BERRY_COLUMNS][2]; /*0x010C*/ u8 ALIGNED(4) playAgainStates[MAX_RFU_PLAYERS]; /*0x0112*/ u16 berriesPickedInRow; /*0x0114*/ u16 maxBerriesPickedInRow; /*0x0118*/ bool32 startCountdown; // Never read /*0x011C*/ bool32 startGame; /*0x0120*/ bool32 berriesFalling; /*0x0124*/ u8 ALIGNED(4) clearRecvCmdTimer; /*0x0128*/ u8 ALIGNED(4) clearRecvCmds; /*0x012C*/ bool32 allReadyToEnd; /*0x0130*/ bool32 readyToEnd[MAX_RFU_PLAYERS]; /*0x0144*/ bool8 ALIGNED(4) playingPickSound; /*0x0148*/ bool8 ALIGNED(4) playingSquishSound[NUM_BERRY_COLUMNS]; /*0x0154*/ u8 ALIGNED(4) endSoundState; /*0x0158*/ bool8 ALIGNED(4) readyToStart[MAX_RFU_PLAYERS]; /*0x0160*/ struct DodrioGame_Gfx gfx; /*0x318C*/ struct DodrioGame_MonInfo monInfo[MAX_RFU_PLAYERS]; /*0x31A0*/ struct DodrioGame_Player players[MAX_RFU_PLAYERS]; /*0x32CC*/ struct DodrioGame_Player player; /*0x3308*/ struct DodrioGame_ScoreResults scoreResults[MAX_RFU_PLAYERS]; }; // size = 0x3330 static EWRAM_DATA struct DodrioGame * sGame = NULL; static EWRAM_DATA u16 *sDodrioSpriteIds[MAX_RFU_PLAYERS] = {NULL}; static EWRAM_DATA u16 *sCloudSpriteIds[NUM_CLOUDS] = {NULL}; static EWRAM_DATA u16 *sBerrySpriteIds[NUM_BERRY_COLUMNS] = {NULL}; static EWRAM_DATA u16 *sBerryIconSpriteIds[NUM_BERRY_TYPES] = {NULL}; static EWRAM_DATA struct StatusBar * sStatusBar = NULL; static EWRAM_DATA struct DodrioGame_Gfx * sGfx = NULL; static bool32 sExitingGame; static void ResetTasksAndSprites(void); static void InitDodrioGame(struct DodrioGame *); static void Task_StartDodrioGame(u8); static void DoGameIntro(void); static void InitCountdown(void); static void DoCountdown(void); static void WaitGameStart(void); static void PlayGame_Leader(void); static void PlayGame_Member(void); static void WaitEndGame_Leader(void); static void WaitEndGame_Member(void); static void InitResults_Leader(void); static void InitResults_Member(void); static void DoResults(void); static void AskPlayAgain(void); static void EndLink(void); static void ExitGame(void); static void ResetGame(void); static void Task_NewGameIntro(u8); static void Task_CommunicateMonInfo(u8); static void RecvLinkData_Leader(void); static void SendLinkData_Leader(void); static void RecvLinkData_Member(void); static void SendLinkData_Member(void); static void HandleSound_Leader(void); static void HandleSound_Member(void); static void CB2_DodrioGame(void); static void VBlankCB_DodrioGame(void); static void InitMonInfo(struct DodrioGame_MonInfo *, struct Pokemon *); static void CreateTask_(TaskFunc, u8); static void CreateDodrioGameTask(TaskFunc); static void SetGameFunc(u8); static bool32 SlideTreeBordersOut(void); static void InitFirstWaveOfBerries(void); static bool32 TryPickBerry(u8, u8, u8); static void UpdateFallingBerries(void); static void UpdateGame_Leader(void); static void UpdateGame_Member(void); static bool32 AllPlayersReadyToStart(void); static void ResetReadyToStart(void); static void GetActiveBerryColumns(u8, u8 *, u8 *); static bool32 ReadyToEndGame_Leader(void); static bool32 ReadyToEndGame_Member(void); static void TryIncrementDifficulty(u8); static u8 GetPlayerIdAtColumn(u8); static u8 GetNewBerryId(u8, u8); static u8 GetNewBerryIdByDifficulty(u8, u8); static void IncrementBerryResult(u8, u8, u8); static void UpdateBerriesPickedInRow(bool32); static void SetMaxBerriesPickedInRow(void); static void ResetForPlayAgainPrompt(void); static void SetRandomPrize(void); static void TryUpdateRecords(void); static u8 UpdatePickStateQueue(u8); static void HandleWaitPlayAgainInput(void); static void ResetPickState(void); static u32 GetScore(u8); static void Task_ShowDodrioBerryPickingRecords(u8); static void PrintRecordsText(u8); static void SpriteCB_Dodrio(struct Sprite *); static u32 DoDodrioMissedAnim(struct Sprite *); static u32 DoDodrioIntroAnim(struct Sprite *); static void SetDodrioInvisibility(bool8, u8); static void SpriteCB_Status(struct Sprite *); static void SetBerryIconsInvisibility(bool8); static void SpriteCB_Cloud(struct Sprite *); static s16 GetDodrioXPos(u8, u8); static void Task_TryRunGfxFunc(u8); static void LoadGfx(void); static void ShowNames(void); static void ShowResults(void); static void Msg_WantToPlayAgain(void); static void Msg_SavingDontTurnOff(void); static void Msg_CommunicationStandby(void); static void EraseMessage(void); static void Msg_SomeoneDroppedOut(void); static void StopGfxFuncs(void); static void GfxIdle(void); static void SetGfxFunc(MainCallback); static MainCallback GetGfxFunc(void); static void InitBgs(void); static bool32 LoadBgGfx(void); static void InitGameGfx(struct DodrioGame_Gfx *); static void LoadDodrioGfx(void); static void CreateDodrioSprite(struct DodrioGame_MonInfo *, u8, u8, u8); static void SetAllDodrioInvisibility(bool8, u8); static void LoadBerryGfx(void); static void CreateBerrySprites(void); static void CreateCloudSprites(void); static void CreateStatusBarSprites(void); static void StartDodrioIntroAnim(u8); static void SetGfxFuncById(u8); static void SetStatusBarInvisibility(bool8); static void ResetCloudPos(void); static void SetCloudInvisibility(bool8); static u8 GetPlayAgainState(void); static u32 GetHighestScore(void); static void ResetBerryAndStatusBarSprites(void); static void FreeBerrySprites(void); static void FreeStatusBar(void); static void FreeDodrioSprites(u8); static void FreeCloudSprites(void); static void StartCloudMovement(void); static void ResetGfxState(void); static void InitStatusBarPos(void); static bool32 DoStatusBarIntro(void); static void StartDodrioMissedAnim(u8); static void SetBerryInvisibility(u8, bool8); static void SetBerryAnim(u16, u8); static void SetBerryYPos(u8, u8); static void SetDodrioAnim(u8, u8); static void UpdateStatusBarAnim(u8); static bool32 IsGfxFuncActive(void); static u32 IncrementWithLimit(u32, u32); static u32 Min(u32, u32); // Unused duplicate static const struct BgTemplate sBgTemplates_Duplicate[] = { { .bg = BG_INTERFACE, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0 }, { .bg = BG_TREE_LEFT, .charBaseIndex = 2, .mapBaseIndex = 12, .screenSize = 1, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = BG_TREE_RIGHT, .charBaseIndex = 2, .mapBaseIndex = 14, .screenSize = 1, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = BG_SCENERY, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0 }, }; static const struct WindowTemplate sWindowTemplate_Dummy_Duplicate = DUMMY_WIN_TEMPLATE; static const struct WindowTemplate sWindowTemplates_Results_Duplicate[] = { { .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 1, .width = 28, .height = 3, .paletteNum = 13, .baseBlock = 0x13, }, { .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 6, .width = 28, .height = 13, .paletteNum = 13, .baseBlock = 0x67, } }; static const struct WindowTemplate sWindowTemplate_Prize_Duplicate = { .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 6, .width = 28, .height = 7, .paletteNum = 13, .baseBlock = 0x67, }; static const struct WindowTemplate sWindowTemplates_PlayAgain_Duplicate[] = { { .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 8, .width = 19, .height = 3, .paletteNum = 13, .baseBlock = 0x13, }, { .bg = BG_INTERFACE, .tilemapLeft = 22, .tilemapTop = 7, .width = 6, .height = 4, .paletteNum = 13, .baseBlock = 0x4C, } }; static const struct WindowTemplate sWindowTemplate_DroppedOut_Duplicate = { .bg = BG_INTERFACE, .tilemapLeft = 4, .tilemapTop = 6, .width = 22, .height = 5, .paletteNum = 13, .baseBlock = 0x13, }; static const struct WindowTemplate sWindowTemplate_CommStandby_Duplicate = { .bg = BG_INTERFACE, .tilemapLeft = 5, .tilemapTop = 8, .width = 19, .height = 3, .paletteNum = 13, .baseBlock = 0x13, }; // For each player, the array is a list of all the columns starting with the column to their left // Only the range of active columns is read from the array (dependent on the number of players), // so the arrays are spaced such that the numbers in the center are where the data that's read starts and end. static const u8 sActiveColumnMap[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] = { { // 1 player (never used), columns 4-6. // Sometimes read to get default order regardless of the current number of players {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, }, { // 2 players (never used), columns 3-6 {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0}, {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0}, }, { // 3 players, columns 2-7 {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0}, {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0}, {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0}, }, { // 4 players, columns 1-8 {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0}, {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0}, {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0}, {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0}, }, { // 5 players, all columns (0-9) { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, { 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 }, { 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4 }, { 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 }, { 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8 }, }, }; // A table for which falling berry column corresponds to which Dodrio head for each player // The numbers in each array are the column number for each head, {left, middle, right} // Dependent on the number of players static const u8 sDodrioHeadToColumnMap[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] = { { // 1 player (never used) {4, 5, 6}, }, { // 2 players (never used) {3, 4, 5}, {5, 6, 3}, }, { // 3 players {4, 5, 6}, {6, 7, 2}, {2, 3, 4}, }, { // 4 players {3, 4, 5}, {5, 6, 7}, {7, 8, 1}, {1, 2, 3}, }, { // 5 players {4, 5, 6}, {6, 7, 8}, {8, 9, 0}, {0, 1, 2}, {2, 3, 4}, }, }; // A table of player ids and their neighbor, dependent on the total number of players // {L, M, R}, where M is the player in question, L is their neighbor to the left, and R is their neighbor to the right static const u8 sDodrioNeighborMap[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] = { { // 1 player (never used) {1, 0, 1}, }, { // 2 players (never used) {1, 0, 1}, {0, 1, 0}, }, { // 3 players {2, 0, 1}, {0, 1, 2}, {1, 2, 0}, }, { // 4 players {3, 0, 1}, {0, 1, 2}, {1, 2, 3}, {2, 3, 0}, }, { // 5 players {4, 0, 1}, {0, 1, 2}, {1, 2, 3}, {2, 3, 4}, {3, 4, 0}, }, }; #define x 9 // No player at this column. This may go out of bounds if this is returned // Takes the number of players and a column and returns the player id at that column. // Note that the assignment is somewhat arbitrary as players share neighboring columns. ALIGNED(4) static const u8 sPlayerIdAtColumn[MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] = { {x, x, x, x, 1, 1, 1, x, x, x, x}, // 1 player {x, x, x, 0, 0, 1, 1, 0, x, x, x}, // 2 players {x, x, 2, 2, 0, 0, 1, 1, 1, x, x}, // 3 players {x, 3, 3, 0, 0, 1, 1, 2, 2, 3, x}, // 4 players {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3}, // 5 players }; #undef x // Each array contains the columns that belong solely to one player, dependent on the number of players // When determing how difficult the berries in a column should be, the highest // difficulty of the players sharing that column is used. // This table is used to skip that check, and instead automatically use the // difficulty of the only player who can use the column. static const u8 sUnsharedColumns[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] = { {5}, {4, 6}, {3, 5, 7}, {2, 4, 6, 8}, #ifndef BUGFIX {1, 3, 5, 6, 9}, // BUG: Column 6 is shared, 7 is not. As a result, the player in column 7 will have their difficulty influenced by their neighbors #else {1, 3, 5, 7, 9}, #endif }; // Duplicate and unused gfx. static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.gbapal", "graphics/dodrio_berry_picking/tree_border.gbapal", "graphics/dodrio_berry_picking/dodrio.gbapal", "graphics/dodrio_berry_picking/shiny.gbapal", "graphics/dodrio_berry_picking/status.gbapal", "graphics/dodrio_berry_picking/berries.gbapal", "graphics/dodrio_berry_picking/berries.4bpp.lz", "graphics/dodrio_berry_picking/cloud.gbapal", "graphics/dodrio_berry_picking/bg.4bpp.lz", "graphics/dodrio_berry_picking/tree_border.4bpp.lz", "graphics/dodrio_berry_picking/status.4bpp.lz", "graphics/dodrio_berry_picking/cloud.4bpp.lz", "graphics/dodrio_berry_picking/dodrio.4bpp.lz", "graphics/dodrio_berry_picking/bg.bin.lz", "graphics/dodrio_berry_picking/tree_border_right.bin.lz", "graphics/dodrio_berry_picking/tree_border_left.bin.lz"); static const u8 sBerryFallDelays[][3] = { { [BERRY_BLUE] = 40, [BERRY_GREEN] = 24, [BERRY_GOLD] = 13 }, { [BERRY_BLUE] = 32, [BERRY_GREEN] = 19, [BERRY_GOLD] = 10 }, { [BERRY_BLUE] = 22, [BERRY_GREEN] = 13, [BERRY_GOLD] = 7 }, }; // How far the outer tree borders should slide to reveal the game screen. // Dependent on how many players are playing. // Curiously the 2-player screen is narrower than the 1-player, though neither // gets used as there's a 3 player minimum ALIGNED(4) static const u8 sTreeBorderXPos[MAX_RFU_PLAYERS] = {8, 5, 8, 11, 15}; // The number of berries eaten needed to progress to the next difficulty ALIGNED(4) static const u8 sDifficultyThresholds[NUM_DIFFICULTIES] = {5, 10, 20, 30, 50, 70, 100}; ALIGNED(4) static const u8 sPrizeBerryIds[][10] = { { // Possible prizes with 3 players ITEM_TO_BERRY(ITEM_RAZZ_BERRY) - 1, ITEM_TO_BERRY(ITEM_BLUK_BERRY) - 1, ITEM_TO_BERRY(ITEM_NANAB_BERRY) - 1, ITEM_TO_BERRY(ITEM_WEPEAR_BERRY) - 1, ITEM_TO_BERRY(ITEM_PINAP_BERRY) - 1, ITEM_TO_BERRY(ITEM_PINAP_BERRY) - 1, ITEM_TO_BERRY(ITEM_WEPEAR_BERRY) - 1, ITEM_TO_BERRY(ITEM_NANAB_BERRY) - 1, ITEM_TO_BERRY(ITEM_BLUK_BERRY) - 1, ITEM_TO_BERRY(ITEM_RAZZ_BERRY) - 1 }, { // Possible prizes with 4 players ITEM_TO_BERRY(ITEM_POMEG_BERRY) - 1, ITEM_TO_BERRY(ITEM_KELPSY_BERRY) - 1, ITEM_TO_BERRY(ITEM_QUALOT_BERRY) - 1, ITEM_TO_BERRY(ITEM_HONDEW_BERRY) - 1, ITEM_TO_BERRY(ITEM_GREPA_BERRY) - 1, ITEM_TO_BERRY(ITEM_TAMATO_BERRY) - 1, ITEM_TO_BERRY(ITEM_CORNN_BERRY) - 1, ITEM_TO_BERRY(ITEM_MAGOST_BERRY) - 1, ITEM_TO_BERRY(ITEM_RABUTA_BERRY) - 1, ITEM_TO_BERRY(ITEM_NOMEL_BERRY) - 1 }, { // Possible prizes with 5 players ITEM_TO_BERRY(ITEM_SPELON_BERRY) - 1, ITEM_TO_BERRY(ITEM_PAMTRE_BERRY) - 1, ITEM_TO_BERRY(ITEM_WATMEL_BERRY) - 1, ITEM_TO_BERRY(ITEM_DURIN_BERRY) - 1, ITEM_TO_BERRY(ITEM_BELUE_BERRY) - 1, ITEM_TO_BERRY(ITEM_BELUE_BERRY) - 1, ITEM_TO_BERRY(ITEM_DURIN_BERRY) - 1, ITEM_TO_BERRY(ITEM_WATMEL_BERRY) - 1, ITEM_TO_BERRY(ITEM_PAMTRE_BERRY) - 1, ITEM_TO_BERRY(ITEM_SPELON_BERRY) - 1 }, }; static void (*const sLeaderFuncs[])(void) = { [FUNC_INTRO] = DoGameIntro, [FUNC_INIT_COUNTDOWN] = InitCountdown, [FUNC_COUNTDOWN] = DoCountdown, [FUNC_WAIT_START] = WaitGameStart, [FUNC_PLAY_GAME] = PlayGame_Leader, [FUNC_INIT_RESULTS] = InitResults_Leader, [FUNC_RESULTS] = DoResults, [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain, [FUNC_END_LINK] = EndLink, [FUNC_EXIT] = ExitGame, [FUNC_RESET_GAME] = ResetGame, [FUNC_WAIT_END_GAME] = WaitEndGame_Leader }; static void (*const sMemberFuncs[])(void) = { [FUNC_INTRO] = DoGameIntro, [FUNC_INIT_COUNTDOWN] = InitCountdown, [FUNC_COUNTDOWN] = DoCountdown, [FUNC_WAIT_START] = WaitGameStart, [FUNC_PLAY_GAME] = PlayGame_Member, [FUNC_INIT_RESULTS] = InitResults_Member, [FUNC_RESULTS] = DoResults, [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain, [FUNC_END_LINK] = EndLink, [FUNC_EXIT] = ExitGame, [FUNC_RESET_GAME] = ResetGame, [FUNC_WAIT_END_GAME] = WaitEndGame_Member }; void StartDodrioBerryPicking(u16 partyId, MainCallback exitCallback) { sExitingGame = FALSE; if (gReceivedRemoteLinkPlayers && (sGame = AllocZeroed(sizeof(*sGame)))) { ResetTasksAndSprites(); InitDodrioGame(sGame); sGame->exitCallback = exitCallback; sGame->multiplayerId = GetMultiplayerId(); sGame->player = sGame->players[sGame->multiplayerId]; InitMonInfo(&sGame->monInfo[sGame->multiplayerId], &gPlayerParty[partyId]); CreateTask(Task_StartDodrioGame, 1); SetMainCallback2(CB2_DodrioGame); SetRandomPrize(); GetActiveBerryColumns(sGame->numPlayers, &sGame->berryColStart, &sGame->berryColEnd); StopMapMusic(); PlayNewMapMusic(MUS_BERRY_PICK); } else { // Exit - Alloc failed, or players not connected SetMainCallback2(exitCallback); return; } } static void ResetTasksAndSprites(void) { ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); } static void InitDodrioGame(struct DodrioGame * game) { u8 i; game->startState = 0; game->state = 0; game->timer = 0; game->funcId = FUNC_INTRO; game->prevFuncId = FUNC_INTRO; game->startGame = FALSE; game->berriesFalling = FALSE; game->countdownEndDelay = 0; game->numGraySquares = 0; game->unused2 = 0; game->allReadyToEnd = FALSE; for (i = 0; i < ARRAY_COUNT(game->pickStateQueue); i++) game->pickStateQueue[i] = PICK_NONE; for (i = 0; i < MAX_RFU_PLAYERS; i++) { game->inputState[i] = INPUTSTATE_NONE; game->inputDelay[i] = 0; game->berryResults[i][BERRY_BLUE] = 0; game->berryResults[i][BERRY_GREEN] = 0; game->berryResults[i][BERRY_GOLD] = 0; game->berryResults[i][BERRY_MISSED] = 0; game->berryResults[i][BERRY_IN_ROW] = 0; game->playAgainStates[i] = PLAY_AGAIN_NONE; game->readyToEnd[i] = FALSE; } for (i = 0; i < NUM_BERRY_COLUMNS; i++) { game->fallTimer[i] = 0; game->newBerryTimer[i] = 0; game->berryState[i] = BERRYSTATE_NONE; game->playersAttemptingPick[i][0] = PLAYER_NONE; game->playersAttemptingPick[i][1] = PLAYER_NONE; } game->isLeader = GetMultiplayerId() == 0 ? TRUE : FALSE; game->numPlayers = GetLinkPlayerCount(); game->posToPlayerId[0] = GetMultiplayerId(); for (i = 1; i < game->numPlayers; i++) { game->posToPlayerId[i] = game->posToPlayerId[i - 1] + 1; if (game->posToPlayerId[i] > game->numPlayers - 1) game->posToPlayerId[i] %= game->numPlayers; } } static void Task_StartDodrioGame(u8 taskId) { u8 i, numPlayers; switch (sGame->startState) { case 0: SetVBlankCallback(NULL); CreateTask_(Task_CommunicateMonInfo, 4); sGame->startState++; break; case 1: if (!FuncIsActiveTask(Task_CommunicateMonInfo)) { InitGameGfx(&sGame->gfx); sGame->startState++; } break; case 2: if (!IsGfxFuncActive()) { Rfu_SetLinkStandbyCallback(); sGame->startState++; } break; case 3: if (IsLinkTaskFinished()) { if (gReceivedRemoteLinkPlayers) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } sGame->startState++; } break; case 4: numPlayers = sGame->numPlayers; LoadDodrioGfx(); for (i = 0; i < numPlayers; i++) CreateDodrioSprite(&sGame->monInfo[sGame->posToPlayerId[i]], i, sGame->posToPlayerId[i], sGame->numPlayers); SetAllDodrioInvisibility(FALSE, sGame->numPlayers); sGame->startState++; break; case 5: LoadBerryGfx(); CreateBerrySprites(); CreateCloudSprites(); CreateStatusBarSprites(); sGame->startState++; break; case 6: BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_DodrioGame); sGame->startState++; break; case 7: UpdatePaletteFade(); if (!gPaletteFade.active) sGame->startState++; break; default: DestroyTask(taskId); CreateDodrioGameTask(Task_NewGameIntro); break; } } static void Task_DodrioGame_Leader(u8 taskId) { RecvLinkData_Leader(); sLeaderFuncs[sGame->funcId](); if (!sExitingGame) UpdateGame_Leader(); SendLinkData_Leader(); } static void Task_DodrioGame_Member(u8 taskId) { RecvLinkData_Member(); sMemberFuncs[sGame->funcId](); if (!sExitingGame) UpdateGame_Member(); SendLinkData_Member(); } static void DoGameIntro(void) { switch (sGame->state) { case 0: StartDodrioIntroAnim(1); SetGfxFuncById(GFXFUNC_SHOW_NAMES); sGame->state++; break; case 1: if (!IsGfxFuncActive()) SetGameFunc(FUNC_INIT_COUNTDOWN); break; } } static void InitCountdown(void) { switch (sGame->state) { case 0: InitFirstWaveOfBerries(); sGame->state++; break; default: sGame->startCountdown = TRUE; SetGameFunc(FUNC_COUNTDOWN); break; } } static void DoCountdown(void) { switch (sGame->state) { case 0: StartMinigameCountdown(GFXTAG_COUNTDOWN, PALTAG_COUNTDOWN, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0); sGame->state++; break; case 1: Rfu_SetLinkStandbyCallback(); sGame->state++; break; case 2: if (IsLinkTaskFinished()) sGame->state++; break; case 3: if (!IsMinigameCountdownRunning()) { Rfu_SetLinkStandbyCallback(); sGame->state++; } break; case 4: if (IsLinkTaskFinished()) SetGameFunc(FUNC_WAIT_START); break; } } static void WaitGameStart(void) { switch (sGame->state) { case 0: if (sGame->startGame) SetGameFunc(FUNC_PLAY_GAME); break; } } static void PlayGame_Leader(void) { switch (sGame->state) { case 0: if (sGame->numGraySquares < NUM_STATUS_SQUARES) { if (sGame->inputState[0] == INPUTSTATE_NONE) { if (JOY_NEW(DPAD_UP)) { if (sGame->players[0].comm.pickState == PICK_NONE) { sGame->players[0].comm.ateBerry = FALSE; sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_MIDDLE); } } else if (JOY_NEW(DPAD_RIGHT)) { if (sGame->players[0].comm.pickState == PICK_NONE) { sGame->players[0].comm.ateBerry = FALSE; sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_RIGHT); } } else if (JOY_NEW(DPAD_LEFT)) { if (sGame->players[0].comm.pickState == PICK_NONE) { sGame->players[0].comm.ateBerry = FALSE; sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_LEFT); } } else { sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_NONE); } } } else { SetGameFunc(FUNC_WAIT_END_GAME); } UpdateFallingBerries(); HandleSound_Leader(); break; } } static void PlayGame_Member(void) { if (sGame->numGraySquares < NUM_STATUS_SQUARES) { if (JOY_NEW(DPAD_UP)) { if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) sGame->player.comm.pickState = PICK_MIDDLE; } else if (JOY_NEW(DPAD_RIGHT)) { if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) sGame->player.comm.pickState = PICK_RIGHT; } else if (JOY_NEW(DPAD_LEFT)) { if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) sGame->player.comm.pickState = PICK_LEFT; } else { sGame->player.comm.pickState = PICK_NONE; } } else { SetGameFunc(FUNC_WAIT_END_GAME); } HandleSound_Member(); } static void WaitEndGame_Leader(void) { u8 i; UpdateFallingBerries(); HandleSound_Leader(); if (ReadyToEndGame_Leader() == TRUE) { SetMaxBerriesPickedInRow(); SetGameFunc(FUNC_INIT_RESULTS); } else { sGame->allReadyToEnd = TRUE; for (i = 1; i < sGame->numPlayers; i++) { if (sGame->readyToEnd[i] != TRUE) { sGame->allReadyToEnd = FALSE; break; } } } } static void WaitEndGame_Member(void) { HandleSound_Member(); if (ReadyToEndGame_Member() == TRUE) SetGameFunc(FUNC_INIT_RESULTS); } static void InitResults_Leader(void) { u8 blockReceivedStatus; u8 i; switch (sGame->state) { case 0: SendBlock(0, sGame->berryResults, sizeof(sGame->berryResults)); sGame->playersReceived = 0; sGame->state++; break; case 1: if (IsLinkTaskFinished()) sGame->state++; break; case 2: blockReceivedStatus = GetBlockReceivedStatus(); for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++) { if (blockReceivedStatus & 1) { ResetBlockReceivedFlag(i); sGame->playersReceived++; } } if (sGame->playersReceived >= sGame->numPlayers) { sGame->timer++; sGame->state++; } break; default: if (WaitFanfare(TRUE)) { SetGameFunc(FUNC_RESULTS); FadeOutAndPlayNewMapMusic(MUS_VICTORY_WILD, 4); } break; } } static void InitResults_Member(void) { u8 i; u8 blockReceivedStatus; switch (sGame->state) { case 0: SendBlock(0, sGame->berryResults[sGame->timer], sizeof(sGame->berryResults)); sGame->playersReceived = 0; sGame->state++; break; case 1: if (IsLinkTaskFinished()) sGame->state++; break; case 2: blockReceivedStatus = GetBlockReceivedStatus(); for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++) { if (blockReceivedStatus & 1) { memcpy(sGame->berryResults, gBlockRecvBuffer, sizeof(sGame->berryResults)); ResetBlockReceivedFlag(i); sGame->playersReceived++; } } if (sGame->playersReceived >= sGame->numPlayers) { sGame->timer++; sGame->state++; } break; default: if (WaitFanfare(TRUE)) { sGame->maxBerriesPickedInRow = sGame->berryResults[sGame->multiplayerId][BERRY_IN_ROW]; SetGameFunc(FUNC_RESULTS); FadeOutAndPlayNewMapMusic(MUS_VICTORY_WILD, 4); } break; } } static void DoResults(void) { u8 playAgainState; u8 i; u8 blockReceivedStatus; switch (sGame->state) { case 0: TryUpdateRecords(); SetStatusBarInvisibility(TRUE); ResetCloudPos(); SetCloudInvisibility(TRUE); SetGfxFuncById(2); sGame->state++; break; case 1: if (!IsGfxFuncActive()) { playAgainState = PLAY_AGAIN_YES; SetGfxFuncById(GFXFUNC_MSG_COMM_STANDBY); playAgainState = GetPlayAgainState(); SendBlock(0, &playAgainState, sizeof(playAgainState)); sGame->state++; } break; case 2: if (IsLinkTaskFinished()) { sGame->state++; sGame->playersReceived = 0; } break; case 3: blockReceivedStatus = GetBlockReceivedStatus(); for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++) { if (blockReceivedStatus & 1) { *(sGame->playAgainStates + i) = *(u8 *)gBlockRecvBuffer[i]; ResetBlockReceivedFlag(i); sGame->playersReceived++; } } if (sGame->playersReceived >= sGame->numPlayers) { if (++sGame->timer >= 120) { SetGfxFuncById(GFXFUNC_ERASE_MSG); sGame->state++; } } break; default: if (!IsGfxFuncActive()) SetGameFunc(FUNC_ASK_PLAY_AGAIN); break; } } static void AskPlayAgain(void) { u8 playAgainState; u8 i; u8 blockReceivedStatus; switch (sGame->state) { case 0: if (GetHighestScore() >= PRIZE_SCORE) SetGfxFuncById(GFXFUNC_MSG_SAVING); sGame->state++; break; case 1: if (!IsGfxFuncActive()) { SetGfxFuncById(GFXFUNC_MSG_PLAY_AGAIN); sGame->state++; } break; case 2: ResetBerryAndStatusBarSprites(); ResetForPlayAgainPrompt(); sGame->state++; break; case 3: if ((playAgainState = GetPlayAgainState()) != PLAY_AGAIN_NONE) sGame->state++; break; case 4: if (!IsGfxFuncActive()) { SetGfxFuncById(GFXFUNC_MSG_COMM_STANDBY); playAgainState = GetPlayAgainState(); SendBlock(0, &playAgainState, sizeof(playAgainState)); sGame->state++; } break; case 5: if (IsLinkTaskFinished()) { sGame->state++; sGame->playersReceived = 0; } break; case 6: blockReceivedStatus = GetBlockReceivedStatus(); for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++) { if (blockReceivedStatus & 1) { *(sGame->playAgainStates + i) = *(u8 *)gBlockRecvBuffer[i]; ResetBlockReceivedFlag(i); sGame->playersReceived++; } } if (sGame->playersReceived >= sGame->numPlayers) { if (++sGame->timer >= 120) { ResetPickState(); SetGfxFuncById(GFXFUNC_ERASE_MSG); sGame->state++; } } else { HandleWaitPlayAgainInput(); } break; default: if (!IsGfxFuncActive()) { for (i = 0; i < sGame->numPlayers; i++) { if (sGame->playAgainStates[i] == PLAY_AGAIN_NO) { SetGameFunc(FUNC_END_LINK); return; } } SetGameFunc(FUNC_RESET_GAME); } break; } } static void EndLink(void) { switch (sGame->state) { case 0: SetCloseLinkCallback(); SetGfxFuncById(GFXFUNC_MSG_PLAYER_DROPPED); sGame->state++; break; case 1: if (!IsGfxFuncActive()) sGame->state++; break; case 2: if (GetPlayAgainState() == PLAY_AGAIN_DROPPED) sGame->state++; break; default: if (!gReceivedRemoteLinkPlayers) SetGameFunc(FUNC_EXIT); break; } } static void ExitGame(void) { switch (sGame->state) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sGame->state++; break; case 1: UpdatePaletteFade(); if (!gPaletteFade.active) sGame->state++; break; case 2: FreeBerrySprites(); FreeStatusBar(); FreeDodrioSprites(sGame->numPlayers); FreeCloudSprites(); sExitingGame = TRUE; SetGfxFuncById(GFXFUNC_STOP); sGame->state++; break; default: if (!IsGfxFuncActive()) { SetMainCallback2(sGame->exitCallback); DestroyTask(sGame->taskId); Free(sGame); FreeAllWindowBuffers(); } break; } } static void ResetGame(void) { switch (sGame->state) { case 0: SetGfxFuncById(GFXFUNC_IDLE); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sGame->state++; break; case 1: UpdatePaletteFade(); if (!gPaletteFade.active) sGame->state++; break; case 2: ChangeBgX(0, 0, BG_COORD_SET); ChangeBgY(0, 0, BG_COORD_SET); ChangeBgX(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); ChangeBgX(2, 0, BG_COORD_SET); ChangeBgY(2, 0, BG_COORD_SET); ChangeBgX(3, 0, BG_COORD_SET); ChangeBgY(3, 0, BG_COORD_SET); sGame->state++; break; case 3: StopMapMusic(); sGame->state++; break; case 4: PlayNewMapMusic(MUS_BERRY_PICK); StartCloudMovement(); sGame->state++; break; case 5: BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sGame->state++; break; case 6: UpdatePaletteFade(); if (!gPaletteFade.active) sGame->state++; break; default: DestroyTask(sGame->taskId); CreateDodrioGameTask(Task_NewGameIntro); ResetGfxState(); InitDodrioGame(sGame); if (!gReceivedRemoteLinkPlayers) sGame->numPlayers = 1; SetRandomPrize(); SetCloudInvisibility(FALSE); break; } } static void Task_NewGameIntro(u8 taskId) { switch (sGame->state) { case 0: if (SlideTreeBordersOut() == TRUE) sGame->state++; break; case 1: InitStatusBarPos(); sGame->state++; break; case 2: if (DoStatusBarIntro() == TRUE) sGame->state++; break; default: if (sGame->isLeader) CreateDodrioGameTask(Task_DodrioGame_Leader); else CreateDodrioGameTask(Task_DodrioGame_Member); DestroyTask(taskId); break; } } #define tState data[0] static void Task_CommunicateMonInfo(u8 taskId) { s16 * data = gTasks[taskId].data; u8 i; u8 blockReceivedStatus; switch (tState) { case 0: SendBlock(0, &sGame->monInfo[sGame->multiplayerId].isShiny, sizeof(sGame->monInfo[sGame->multiplayerId].isShiny)); sGame->playersReceived = 0; tState++; break; case 1: if (IsLinkTaskFinished()) tState++; break; case 2: blockReceivedStatus = GetBlockReceivedStatus(); for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++) { if (blockReceivedStatus & 1) { *(u8 *)&sGame->monInfo[i] = *(u8 *)gBlockRecvBuffer[i]; ResetBlockReceivedFlag(i); sGame->playersReceived++; } } if (sGame->playersReceived >= sGame->numPlayers) { DestroyTask(taskId); SetGfxFuncById(GFXFUNC_ERASE_MSG); sGame->state++; } break; } } #undef tState static void RecvLinkData_Gameplay(void) { u8 i; u8 numPlayers = sGame->numPlayers; sGame->players[0].receivedGameStatePacket = RecvPacket_GameState(0, &sGame->players[0], &sGame->players[0].comm, &sGame->players[1].comm, &sGame->players[2].comm, &sGame->players[3].comm, &sGame->players[4].comm, &sGame->numGraySquares, &sGame->berriesFalling, &sGame->allReadyToEnd); sGame->clearRecvCmds = TRUE; for (i = 1; i < numPlayers; i++) { if (sGame->inputState[i] == INPUTSTATE_NONE && !RecvPacket_PickState(i, &sGame->players[i].comm.pickState)) { sGame->players[i].comm.pickState = PICK_NONE; sGame->clearRecvCmds = FALSE; } } if (++sGame->clearRecvCmdTimer >= 60) { if (sGame->clearRecvCmds) { ClearRecvCommands(); sGame->clearRecvCmdTimer = 0; } else if (sGame->clearRecvCmdTimer > 70) { ClearRecvCommands(); sGame->clearRecvCmdTimer = 0; } } for (i = 0; i < numPlayers; i++) { if (sGame->players[i].comm.pickState != PICK_NONE && sGame->inputState[i] == INPUTSTATE_NONE) sGame->inputState[i] = INPUTSTATE_TRY_PICK; switch (sGame->inputState[i]) { case INPUTSTATE_NONE: default: break; case INPUTSTATE_TRY_PICK: case INPUTSTATE_PICKED: case INPUTSTATE_ATE_BERRY: if (++sGame->inputDelay[i] >= 6) { sGame->inputDelay[i] = 0; sGame->inputState[i] = INPUTSTATE_NONE; sGame->players[i].comm.pickState = PICK_NONE; sGame->players[i].comm.ateBerry = FALSE; sGame->players[i].comm.missedBerry = FALSE; } break; case INPUTSTATE_BAD_MISS: // Tried to pick with no berry in range, long delay until next input if (++sGame->inputDelay[i] >= 40) { sGame->inputDelay[i] = 0; sGame->inputState[i] = INPUTSTATE_NONE; sGame->players[i].comm.pickState = PICK_NONE; sGame->players[i].comm.ateBerry = FALSE; sGame->players[i].comm.missedBerry = FALSE; } break; } } } static void RecvLinkData_ReadyToEnd(void) { u8 i; u8 numPlayers = sGame->numPlayers; sGame->players[0].receivedGameStatePacket = RecvPacket_GameState(0, &sGame->players[0], &sGame->players[0].comm, &sGame->players[1].comm, &sGame->players[2].comm, &sGame->players[3].comm, &sGame->players[4].comm, &sGame->numGraySquares, &sGame->berriesFalling, &sGame->allReadyToEnd); sGame->clearRecvCmds = TRUE; for (i = 1; i < numPlayers; i++) { if (RecvPacket_ReadyToEnd(i)) { sGame->readyToEnd[i] = TRUE; sGame->clearRecvCmds = FALSE; } } if (++sGame->clearRecvCmdTimer >= 60) { if (sGame->clearRecvCmds) { ClearRecvCommands(); sGame->clearRecvCmdTimer = 0; } else if (sGame->clearRecvCmdTimer > 70) { ClearRecvCommands(); sGame->clearRecvCmdTimer = 0; } } } static void RecvLinkData_Leader(void) { switch (sGame->funcId) { case FUNC_WAIT_START: if (AllPlayersReadyToStart() == TRUE) { ResetReadyToStart(); sGame->startGame = TRUE; } break; case FUNC_PLAY_GAME: RecvLinkData_Gameplay(); break; case FUNC_WAIT_END_GAME: RecvLinkData_ReadyToEnd(); break; } } static void SendLinkData_Leader(void) { switch (sGame->funcId) { case FUNC_PLAY_GAME: SendPacket_GameState(&sGame->player, &sGame->players[0].comm, &sGame->players[1].comm, &sGame->players[2].comm, &sGame->players[3].comm, &sGame->players[4].comm, sGame->numGraySquares, sGame->berriesFalling, sGame->allReadyToEnd); break; case FUNC_WAIT_END_GAME: SendPacket_GameState(&sGame->player, &sGame->players[0].comm, &sGame->players[1].comm, &sGame->players[2].comm, &sGame->players[3].comm, &sGame->players[4].comm, sGame->numGraySquares, sGame->berriesFalling, sGame->allReadyToEnd); break; } } static void RecvLinkData_Member(void) { switch (sGame->funcId) { case FUNC_PLAY_GAME: RecvPacket_GameState(sGame->multiplayerId, &sGame->players[sGame->multiplayerId], &sGame->players[0].comm, &sGame->players[1].comm, &sGame->players[2].comm, &sGame->players[3].comm, &sGame->players[4].comm, &sGame->numGraySquares, &sGame->berriesFalling, &sGame->allReadyToEnd); break; case FUNC_WAIT_END_GAME: RecvPacket_GameState(sGame->multiplayerId, &sGame->players[sGame->multiplayerId], &sGame->players[0].comm, &sGame->players[1].comm, &sGame->players[2].comm, &sGame->players[3].comm, &sGame->players[4].comm, &sGame->numGraySquares, &sGame->berriesFalling, &sGame->allReadyToEnd); break; } } static void SendLinkData_Member(void) { switch (sGame->funcId) { case FUNC_WAIT_START: SendPacket_ReadyToStart(TRUE); sGame->startGame = TRUE; break; case FUNC_PLAY_GAME: if (sGame->player.comm.pickState != PICK_NONE) SendPacket_PickState(sGame->player.comm.pickState); break; case FUNC_WAIT_END_GAME: if (!sGame->berriesFalling && !sGame->allReadyToEnd) SendPacket_ReadyToEnd(TRUE); break; } } static void HandleSound_Leader(void) { if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) { if (!IsSEPlaying()) sGame->playingPickSound = FALSE; } else if (sGame->players[sGame->multiplayerId].comm.ateBerry == TRUE) { if (!sGame->playingPickSound) { m4aSongNumStop(SE_SUCCESS); PlaySE(SE_SUCCESS); sGame->playingPickSound = TRUE; } } else if (sGame->players[sGame->multiplayerId].comm.missedBerry == TRUE) { if (!sGame->playingPickSound && !IsSEPlaying()) { PlaySE(SE_BOO); StartDodrioMissedAnim(1); sGame->playingPickSound = TRUE; } } if (sGame->endSoundState == 0 && sGame->numGraySquares >= NUM_STATUS_SQUARES) { // Ready to play game over sound StopMapMusic(); sGame->endSoundState = 1; } else if (sGame->endSoundState == 1) { // Play game over sound PlayFanfareByFanfareNum(FANFARE_TOO_BAD); sGame->endSoundState = 2; } } static void HandleSound_Member(void) { u8 berryStart = sGame->berryColStart; u8 berryEnd = sGame->berryColEnd; u8 i; if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) { if (sGame->players[sGame->multiplayerId].comm.ateBerry != TRUE && sGame->players[sGame->multiplayerId].comm.missedBerry != TRUE) sGame->playingPickSound = 0; } else if (sGame->players[sGame->multiplayerId].comm.ateBerry == TRUE) { if (!sGame->playingPickSound) { m4aSongNumStop(SE_SUCCESS); PlaySE(SE_SUCCESS); sGame->playingPickSound = TRUE; } } else if (sGame->players[sGame->multiplayerId].comm.missedBerry == TRUE) { if (!sGame->playingPickSound && !IsSEPlaying()) { PlaySE(SE_BOO); StartDodrioMissedAnim(1); sGame->playingPickSound = TRUE; } } for (i = berryStart; i < berryEnd; i++) { struct DodrioGame_Berries * berries = &sGame->players[sGame->multiplayerId].berries; if (berries->fallDist[i] >= MAX_FALL_DIST) { if (sGame->playingSquishSound[i] == 0) { PlaySE(SE_BALLOON_RED + berries->ids[i]); sGame->playingSquishSound[i] = TRUE; } } else { sGame->playingSquishSound[i] = FALSE; } } if (sGame->endSoundState == 0 && sGame->numGraySquares >= NUM_STATUS_SQUARES) { // Ready to play game over sound StopMapMusic(); sGame->endSoundState = 1; } else if (sGame->endSoundState == 1) { // Play game over sound PlayFanfareByFanfareNum(FANFARE_TOO_BAD); sGame->endSoundState = 2; } } static void CB2_DodrioGame(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCB_DodrioGame(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); } static void InitMonInfo(struct DodrioGame_MonInfo * monInfo, struct Pokemon * mon) { monInfo->isShiny = IsMonShiny(mon); } static void CreateTask_(TaskFunc func, u8 priority) { CreateTask(func, priority); } static void CreateDodrioGameTask(TaskFunc func) { sGame->taskId = CreateTask(func, 1); sGame->state = 0; sGame->startState = 0; sGame->timer = 0; } static void SetGameFunc(u8 funcId) { sGame->prevFuncId = sGame->funcId; sGame->funcId = funcId; sGame->state = 0; sGame->timer = 0; } static bool32 SlideTreeBordersOut(void) { u8 x = sGame->timer / 4; sGame->timer++; if (x != 0 && sGame->timer % 4 == 0) { if (x < sTreeBorderXPos[sGame->numPlayers - 1]) { // Update position SetGpuReg(REG_OFFSET_BG1HOFS, (x * 8)); // BG_TREE_LEFT SetGpuReg(REG_OFFSET_BG2HOFS, -(x * 8)); // BG_TREE_RIGHT return FALSE; } else { // Animation finished return TRUE; } } else { return FALSE; } } static void InitFirstWaveOfBerries(void) { u8 i; u8 berryStart = sGame->berryColStart; u8 berryEnd = sGame->berryColEnd; for (i = berryStart; i < berryEnd; i++) { struct DodrioGame_Berries * berries = &sGame->player.berries; berries->fallDist[i] = (i % 2 == 0) ? 1 : 0; berries->ids[i] = BERRY_BLUE; } } // This function checks every berry and resolves if it should be eaten or not. // It's run in a loop that handles moving each individual berry, which means // that every time any berry moves, every single berry is checked. static void HandlePickBerries(void) { u8 berryStart = sGame->berryColStart; u8 berryEnd = sGame->berryColEnd; u8 numPlayers = sGame->numPlayers; u8 i, j, k, column; // Game is already over if (sGame->numGraySquares >= NUM_STATUS_SQUARES) return; for (i = 0; i < numPlayers; i++) { u8 *pickState = &sGame->players[i].comm.pickState; if (*pickState != PICK_NONE && sGame->inputState[i] == INPUTSTATE_TRY_PICK) { // Player is attempting to pick a berry for (j = berryStart; j < berryEnd; j++) { column = sActiveColumnMap[0][0][j]; // Attempt has already been checked if (sGame->playersAttemptingPick[column][0] == i || sGame->playersAttemptingPick[column][1] == i) break; // Check berry pick attempt if (TryPickBerry(i, *pickState, column) == TRUE) { for (k = 0; k < ARRAY_COUNT(sGame->playersAttemptingPick[0]); k++) { if (sGame->playersAttemptingPick[column][k] == PLAYER_NONE) { sGame->playersAttemptingPick[column][k] = i; sGame->inputState[i] = INPUTSTATE_PICKED; sGame->berryState[column] = BERRYSTATE_PICKED; break; } } break; } if (sGame->players[i].comm.missedBerry == 1) break; } } } for (j = berryStart; j < berryEnd; j++) { u8 playerIdMissed = PLAYER_NONE; column = sActiveColumnMap[0][0][j]; if (sGame->berryState[column] == BERRYSTATE_PICKED) { s32 delayRemaining; u8 playerIdPicked, delayStage = sGame->difficulty[GetPlayerIdAtColumn(column)] / 7; if (delayStage >= ARRAY_COUNT(sBerryFallDelays) - 1) delayStage = ARRAY_COUNT(sBerryFallDelays) - 1; delayRemaining = sBerryFallDelays[delayStage][sGame->players[0].berries.ids[column]] - sGame->fallTimer[column]; if (delayRemaining < 6) sGame->eatTimer[column] += delayRemaining; if (++sGame->eatTimer[column] >= 6) { sGame->eatTimer[column] = 0; if (sGame->playersAttemptingPick[column][0] == PLAYER_NONE && sGame->playersAttemptingPick[column][1] == PLAYER_NONE) { // No players attempting to pick this berry continue; } else if (sGame->playersAttemptingPick[column][0] != PLAYER_NONE && sGame->playersAttemptingPick[column][1] == PLAYER_NONE) { // One player attempting to pick this berry playerIdPicked = sGame->playersAttemptingPick[column][0]; } else { // Two players attempting to pick this berry // Randomly give it to one of them u8 playerId1 = sGame->playersAttemptingPick[column][0]; i = sGame->playersAttemptingPick[column][1]; // playerId2. Have to re-use the variable to match. if (!(Random() & 1)) { playerIdPicked = playerId1; playerIdMissed = i; } else { playerIdPicked = i; playerIdMissed = playerId1; } } // Eat berry sGame->player.berries.fallDist[column] = EAT_FALL_DIST; sGame->berryState[column] = BERRYSTATE_EATEN; sGame->inputState[playerIdPicked] = INPUTSTATE_ATE_BERRY; sGame->berryEatenBy[column] = playerIdPicked; sGame->players[playerIdPicked].comm.ateBerry = TRUE; #ifdef UBFIX if (playerIdMissed != PLAYER_NONE) #endif sGame->players[playerIdMissed].comm.missedBerry = TRUE; // UB: playerIdMissed can be PLAYER_NONE here, which is out of bounds sGame->berriesEaten[playerIdPicked]++; IncrementBerryResult(0, column, playerIdPicked); UpdateBerriesPickedInRow(TRUE); TryIncrementDifficulty(playerIdPicked); sGame->prevBerryIds[column] = sGame->player.berries.ids[column]; sGame->player.berries.ids[column] = BERRY_MISSED; // Just to clear berry id, wasn't actually missed sGame->playersAttemptingPick[column][0] = PLAYER_NONE; sGame->playersAttemptingPick[column][1] = PLAYER_NONE; } } } } static bool32 TryPickBerry(u8 playerId, u8 pickState, u8 column) { s32 pick = 0; u8 numPlayersIdx = sGame->numPlayers - 1; struct DodrioGame_Berries * berries = &sGame->player.berries; switch (pickState) { case PICK_LEFT: default: pick = 0; break; case PICK_MIDDLE: pick = 1; break; case PICK_RIGHT: pick = 2; break; } // Check if berry is within range to be picked if (berries->fallDist[column] == EAT_FALL_DIST - 1 || berries->fallDist[column] == EAT_FALL_DIST) { // Check if this berry is the one the player is trying to pick if (column == sDodrioHeadToColumnMap[numPlayersIdx][playerId][pick]) { // Check if berry has been picked/eaten by another player if (sGame->berryState[column] == BERRYSTATE_PICKED || sGame->berryState[column] == BERRYSTATE_EATEN) { // Missed berry, picked by someone else sGame->players[playerId].comm.missedBerry = TRUE; return FALSE; } else { // Successfully picked berry return TRUE; } } } else { // Check if this berry is the one the player is trying to pick if (column == sDodrioHeadToColumnMap[numPlayersIdx][playerId][pick]) { // Missed berry, out of range sGame->inputState[playerId] = INPUTSTATE_BAD_MISS; sGame->players[playerId].comm.missedBerry = TRUE; } } return FALSE; } static void UpdateFallingBerries(void) { u8 berryStart = sGame->berryColStart; u8 berryEnd = sGame->berryColEnd; u8 delayStage = 0; u8 otherBerryMissed = 0; u8 i; sGame->berriesFalling = FALSE; for (i = berryStart; i < berryEnd - 1; i++) { struct DodrioGame * game = sGame; if (sGame->berryState[i] == BERRYSTATE_NONE || sGame->berryState[i] == BERRYSTATE_PICKED) { sGame->berriesFalling = TRUE; if (game->player.berries.fallDist[i] >= MAX_FALL_DIST) { // Berry hit the ground game->player.berries.fallDist[i] = MAX_FALL_DIST; sGame->berryState[i] = BERRYSTATE_SQUISHED; if (!sGame->playingSquishSound[i]) { sGame->playingSquishSound[i] = TRUE; PlaySE(SE_BALLOON_RED + game->player.berries.ids[i]); } if (sGame->numGraySquares < NUM_STATUS_SQUARES || otherBerryMissed == TRUE) { otherBerryMissed = TRUE; sGame->playingSquishSound[i] = FALSE; if (sGame->numGraySquares < NUM_STATUS_SQUARES) sGame->numGraySquares++; IncrementBerryResult(BERRY_MISSED, i, 0); UpdateBerriesPickedInRow(FALSE); } } else { // Berry is still falling u8 delay; delayStage = sGame->difficulty[GetPlayerIdAtColumn(i)] / NUM_DIFFICULTIES; if (delayStage >= ARRAY_COUNT(sBerryFallDelays) - 1) delayStage = ARRAY_COUNT(sBerryFallDelays) - 1; delay = sBerryFallDelays[delayStage][game->player.berries.ids[i]]; if (++sGame->fallTimer[i] >= delay) { game->player.berries.fallDist[i]++; sGame->fallTimer[i] = 0; } HandlePickBerries(); } } else if (sGame->berryState[i] == BERRYSTATE_EATEN) { // Berry has been eaten, wait and create a new berry if (++sGame->newBerryTimer[i] >= 20) { sGame->players[sGame->berryEatenBy[i]].comm.ateBerry = FALSE; sGame->newBerryTimer[i] = 0; sGame->fallTimer[i] = 0; sGame->berryState[i] = BERRYSTATE_NONE; game->player.berries.fallDist[i] = 1; game->player.berries.ids[i] = GetNewBerryId(GetPlayerIdAtColumn(i), i); } } else if (sGame->berryState[i] == BERRYSTATE_SQUISHED) { // Berry has already hit the ground, wait and create a new berry if (++sGame->newBerryTimer[i] >= 20) { if (sGame->numGraySquares < NUM_STATUS_SQUARES) { sGame->newBerryTimer[i] = 0; sGame->fallTimer[i] = 0; sGame->berryState[i] = BERRYSTATE_NONE; game->player.berries.fallDist[i] = 1; sGame->prevBerryIds[i] = game->player.berries.ids[i]; game->player.berries.ids[i] = GetNewBerryId(GetPlayerIdAtColumn(i), i); } } } } } static void UpdateBerrySprites(void) { u8 i; u8 berryStart = sGame->berryColStart; u8 berryEnd = sGame->berryColEnd; for (i = berryStart; i < berryEnd; i++) { struct DodrioGame_Player * player = &sGame->players[sGame->multiplayerId]; u8 column = sActiveColumnMap[sGame->numPlayers - 1][sGame->multiplayerId][i]; if (player->berries.fallDist[column] != 0) SetBerryInvisibility(i, FALSE); else SetBerryInvisibility(i, TRUE); if (player->berries.fallDist[column] >= MAX_FALL_DIST) { // Berry was missed, set squished anim SetBerryAnim(i, player->berries.ids[column] + BERRY_MISSED); SetBerryYPos(i, player->berries.fallDist[column] * 2 - 1); } else if (player->berries.ids[column] == 3) { // Berry was picked, set eaten anim player->berries.fallDist[column] = EAT_FALL_DIST; SetBerryAnim(i, ANIM_EATEN); SetBerryYPos(i, player->berries.fallDist[column] * 2 - 1); } else { // Berry is still falling SetBerryAnim(i, player->berries.ids[column]); SetBerryYPos(i, player->berries.fallDist[column] * 2); } } } static void UpdateAllDodrioAnims(void) { u8 i; u8 numPlayers = sGame->numPlayers; for (i = 0; i < numPlayers; i++) { struct DodrioGame_Player * player = &sGame->players[i]; SetDodrioAnim(i, player->comm.pickState); } } static void SetAllDodrioDisabled(void) { u8 i; u8 numPlayers = sGame->numPlayers; for (i = 0; i < numPlayers; i++) SetDodrioAnim(i, PICK_DISABLED); } static void UpdateGame_Leader(void) { UpdateBerrySprites(); if (sGame->numGraySquares >= NUM_STATUS_SQUARES) SetAllDodrioDisabled(); else UpdateAllDodrioAnims(); UpdateStatusBarAnim(sGame->numGraySquares); } // Identical to UpdateGame_Leader static void UpdateGame_Member(void) { UpdateBerrySprites(); if (sGame->numGraySquares >= NUM_STATUS_SQUARES) SetAllDodrioDisabled(); else UpdateAllDodrioAnims(); UpdateStatusBarAnim(sGame->numGraySquares); } static void GetActiveBerryColumns(u8 numPlayers, u8 *start, u8 *end) { switch (numPlayers) { case 1: *start = 4, *end = 7; break; case 2: *start = 3, *end = 8; break; case 3: *start = 2, *end = 9; break; case 4: *start = 1, *end = 10; break; case 5: *start = 0, *end = 11; break; } } static bool32 AllPlayersReadyToStart(void) { u8 i; u8 numPlayers = sGame->numPlayers; for (i = 1; i < numPlayers; i++) { if (sGame->readyToStart[i] == FALSE) sGame->readyToStart[i] = RecvPacket_ReadyToStart(i); } numPlayers = numPlayers; // Needed to force compiler to keep loop below #ifdef BUGFIX i = 1; // i isn't reset, loop below never runs. As a result, game can begin before all players ready #endif for (; i < numPlayers; i++) { if (!sGame->readyToStart[i]) return FALSE; } return TRUE; } static void ResetReadyToStart(void) { u8 i; for (i = 0; i < MAX_RFU_PLAYERS; i++) sGame->readyToStart[i] = FALSE; } static bool32 ReadyToEndGame_Leader(void) { if (sGame->numGraySquares >= NUM_STATUS_SQUARES && !sGame->berriesFalling) { sGame->numGraySquares = NUM_STATUS_SQUARES; if (sGame->allReadyToEnd != 0) return TRUE; } return FALSE; } static bool32 ReadyToEndGame_Member(void) { u8 i, berryStart, berryEnd; if (sGame->numGraySquares >= NUM_STATUS_SQUARES) { berryStart = sGame->berryColStart; berryEnd = sGame->berryColEnd; sGame->numGraySquares = NUM_STATUS_SQUARES; if (sGame->allReadyToEnd) { for (i = berryStart; i < berryEnd; i++) { struct DodrioGame_Player * player = &sGame->players[sGame->multiplayerId]; u8 column = sActiveColumnMap[sGame->numPlayers - 1][sGame->multiplayerId][i]; if (player->berries.fallDist[column] != MAX_FALL_DIST) return FALSE; } return TRUE; } } return FALSE; } static void TryIncrementDifficulty(u8 playerId) { u8 threshold = sDifficultyThresholds[sGame->difficulty[playerId] % NUM_DIFFICULTIES] + (sGame->difficulty[playerId] / NUM_DIFFICULTIES) * 100; if (sGame->berriesEaten[playerId] >= threshold) sGame->difficulty[playerId]++; } static u8 GetPlayerIdAtColumn(u8 column) { return sPlayerIdAtColumn[sGame->numPlayers - 1][column]; } // Get a berry id for when a new falling berry is created. // What type of berry it is depends on the current difficulty // level of players who can pick berries from that column. static u8 GetNewBerryId(u8 playerId, u8 column) { u8 i, highestDifficulty; u8 numPlayersIdx = sGame->numPlayers - 1; u8 leftPlayer = sDodrioNeighborMap[numPlayersIdx][playerId][0]; u8 middlePlayer = sDodrioNeighborMap[numPlayersIdx][playerId][1]; u8 rightPlayer = sDodrioNeighborMap[numPlayersIdx][playerId][2]; for (i = 0; sUnsharedColumns[numPlayersIdx][i] != 0; i++) { // If only one player can use this column, just use their difficulty if (column == sUnsharedColumns[numPlayersIdx][i]) return GetNewBerryIdByDifficulty(sGame->difficulty[middlePlayer], column); } // This column is shared, get the highest difficulty of adjacent players if (sGame->difficulty[leftPlayer] > sGame->difficulty[middlePlayer]) highestDifficulty = sGame->difficulty[leftPlayer]; else highestDifficulty = sGame->difficulty[middlePlayer]; if (sGame->difficulty[rightPlayer] > highestDifficulty) highestDifficulty = sGame->difficulty[rightPlayer]; return GetNewBerryIdByDifficulty(highestDifficulty, column); } // The berry types cycle through different distributions depending on the difficulty static u8 GetNewBerryIdByDifficulty(u8 difficulty, u8 column) { u8 prevBerryId = sGame->prevBerryIds[column]; switch (difficulty % NUM_DIFFICULTIES) { default: return BERRY_BLUE; case 0: return BERRY_BLUE; case 1: return BERRY_GREEN; case 2: return BERRY_GOLD; case 3: if (prevBerryId == BERRY_BLUE) return BERRY_GREEN; else return BERRY_BLUE; case 4: if (prevBerryId == BERRY_BLUE) return BERRY_GOLD; else return BERRY_BLUE; case 5: if (prevBerryId == BERRY_GOLD) return BERRY_GREEN; else return BERRY_GOLD; case 6: if (prevBerryId == BERRY_BLUE) return BERRY_GREEN; else if (prevBerryId == BERRY_GREEN) return BERRY_GOLD; else return BERRY_BLUE; } } // Despite being set up to take a berry id as an argument, this // function is only ever given BERRY_BLUE or BERRY_MISSED. // It reads the actual berry id (if necessary) from ids static void IncrementBerryResult(u8 berryIdArg, u8 column, u8 playerId) { u8 berryId; u8 numPlayers = sGame->numPlayers; switch (berryIdArg) { case BERRY_BLUE: case BERRY_GREEN: case BERRY_GOLD: berryId = sGame->players[0].berries.ids[column]; sGame->berryResults[playerId][berryId] = IncrementWithLimit(sGame->berryResults[playerId][berryId], 20000); break; case BERRY_MISSED: switch (numPlayers) { case 5: switch (column) { case 0: sGame->berryResults[2][BERRY_MISSED]++; sGame->berryResults[3][BERRY_MISSED]++; break; case 1: sGame->berryResults[3][BERRY_MISSED]++; break; case 2: sGame->berryResults[3][BERRY_MISSED]++; sGame->berryResults[4][BERRY_MISSED]++; break; case 3: sGame->berryResults[4][BERRY_MISSED]++; break; case 4: sGame->berryResults[4][BERRY_MISSED]++; sGame->berryResults[0][BERRY_MISSED]++; break; case 5: sGame->berryResults[0][BERRY_MISSED]++; break; case 6: sGame->berryResults[0][BERRY_MISSED]++; sGame->berryResults[1][BERRY_MISSED]++; break; case 7: sGame->berryResults[1][BERRY_MISSED]++; break; case 8: sGame->berryResults[1][BERRY_MISSED]++; sGame->berryResults[2][BERRY_MISSED]++; break; case 9: sGame->berryResults[2][BERRY_MISSED]++; break; } break; case 4: switch (column) { case 1: sGame->berryResults[2][BERRY_MISSED]++; sGame->berryResults[3][BERRY_MISSED]++; break; case 2: sGame->berryResults[3][BERRY_MISSED]++; break; case 3: sGame->berryResults[3][BERRY_MISSED]++; sGame->berryResults[0][BERRY_MISSED]++; break; case 4: sGame->berryResults[0][BERRY_MISSED]++; break; case 5: sGame->berryResults[0][BERRY_MISSED]++; sGame->berryResults[1][BERRY_MISSED]++; break; case 6: sGame->berryResults[1][BERRY_MISSED]++; break; case 7: sGame->berryResults[1][BERRY_MISSED]++; sGame->berryResults[2][BERRY_MISSED]++; break; case 8: sGame->berryResults[2][BERRY_MISSED]++; break; } break; case 3: switch (column) { case 2: sGame->berryResults[1][BERRY_MISSED]++; sGame->berryResults[2][BERRY_MISSED]++; break; case 3: sGame->berryResults[2][BERRY_MISSED]++; break; case 4: sGame->berryResults[2][BERRY_MISSED]++; sGame->berryResults[0][BERRY_MISSED]++; break; case 5: sGame->berryResults[0][BERRY_MISSED]++; break; case 6: sGame->berryResults[0][BERRY_MISSED]++; sGame->berryResults[1][BERRY_MISSED]++; break; case 7: sGame->berryResults[1][BERRY_MISSED]++; break; } break; case 2: switch (column) { case 3: sGame->berryResults[0][BERRY_MISSED]++; sGame->berryResults[1][BERRY_MISSED]++; break; case 4: sGame->berryResults[0][BERRY_MISSED]++; break; case 5: sGame->berryResults[0][BERRY_MISSED]++; sGame->berryResults[1][BERRY_MISSED]++; break; case 6: sGame->berryResults[1][BERRY_MISSED]++; break; } break; } break; } } static void UpdateBerriesPickedInRow(bool32 picked) { // The 'berries picked in row' stat is only // counted for games with all 5 players if (sGame->numPlayers != MAX_RFU_PLAYERS) return; if (picked == TRUE) { if (++sGame->berriesPickedInRow > sGame->maxBerriesPickedInRow) sGame->maxBerriesPickedInRow = sGame->berriesPickedInRow; if (sGame->berriesPickedInRow > MAX_BERRIES) sGame->berriesPickedInRow = MAX_BERRIES; } else // missed { if (sGame->berriesPickedInRow > sGame->maxBerriesPickedInRow) sGame->maxBerriesPickedInRow = sGame->berriesPickedInRow; sGame->berriesPickedInRow = 0; } } static void SetMaxBerriesPickedInRow(void) { u8 i; for (i = 0; i < sGame->numPlayers; i++) sGame->berryResults[i][BERRY_IN_ROW] = sGame->maxBerriesPickedInRow; } static void ResetForPlayAgainPrompt(void) { u8 i, j; for (i = 0; i < MAX_RFU_PLAYERS; i++) { for (j = 0; j < NUM_BERRY_COLUMNS; j++) sGame->players[i].berries.fallDist[j] = 0; sGame->players[i].comm.pickState = PICK_NONE; sGame->players[i].comm.ateBerry = FALSE; sGame->difficulty[i] = 0; sGame->berriesEaten[i] = 0; sGame->scoreResults[i].ranking = 0; sGame->scoreResults[i].score = 0; sGame->berryResults[i][BERRY_BLUE] = 0; sGame->berryResults[i][BERRY_GREEN] = 0; sGame->berryResults[i][BERRY_GOLD] = 0; sGame->berryResults[i][BERRY_MISSED] = 0; sGame->berryResults[i][BERRY_PRIZE] = 0; sGame->berryResults[i][BERRY_IN_ROW] = 0; } sGame->endSoundState = 0; sGame->berriesPickedInRow = 0; sGame->numGraySquares = 0; UpdateAllDodrioAnims(); UpdateBerrySprites(); } static const s16 sBerryScoreMultipliers[] = { [BERRY_BLUE] = 10, [BERRY_GREEN] = 30, [BERRY_GOLD] = 50, [BERRY_MISSED] = 50 // Subtracted }; static void SetRandomPrize(void) { u8 i, prizeSet = 0, prizeIdx = 0; switch (sGame->numPlayers) { case 4: prizeSet = 1; break; case 5: prizeSet = 2; break; } prizeIdx = Random() % ARRAY_COUNT(sPrizeBerryIds[0]);; for (i = 0; i < MAX_RFU_PLAYERS; i++) sGame->berryResults[i][BERRY_PRIZE] = sPrizeBerryIds[prizeSet][prizeIdx]; } static u32 GetBerriesPicked(u8 playerId) { u32 sum = sGame->berryResults[playerId][BERRY_BLUE] + sGame->berryResults[playerId][BERRY_GREEN] + sGame->berryResults[playerId][BERRY_GOLD]; return min(sum, MAX_BERRIES); } static void TryUpdateRecords(void) { u32 berriesPicked = Min(GetBerriesPicked(sGame->multiplayerId), MAX_BERRIES); // Min here is redundant u32 score = Min(GetScore(sGame->multiplayerId), MAX_SCORE); if (gSaveBlock2Ptr->berryPick.bestScore < score) gSaveBlock2Ptr->berryPick.bestScore = score; if (gSaveBlock2Ptr->berryPick.berriesPicked < berriesPicked) gSaveBlock2Ptr->berryPick.berriesPicked = berriesPicked; if (gSaveBlock2Ptr->berryPick.berriesPickedInRow < sGame->maxBerriesPickedInRow) gSaveBlock2Ptr->berryPick.berriesPickedInRow = sGame->maxBerriesPickedInRow; } // Enqueue the given state, and dequeue and return // the state that should be used next static u8 UpdatePickStateQueue(u8 pickState) { u8 i, nextState; nextState = sGame->pickStateQueue[ARRAY_COUNT(sGame->pickStateQueue) - 1]; for (i = ARRAY_COUNT(sGame->pickStateQueue) - 1; i != 0; i--) sGame->pickStateQueue[i] = sGame->pickStateQueue[i - 1]; sGame->pickStateQueue[0] = pickState; return nextState; } // The player may extend their Dodrio's heads while they wait for // other players to respond to the "Play again?" prompt static void HandleWaitPlayAgainInput(void) { if (sGame->inputDelay[sGame->multiplayerId] == 0) { if (JOY_NEW(DPAD_UP)) { sGame->players[sGame->multiplayerId].comm.pickState = PICK_MIDDLE; sGame->inputDelay[sGame->multiplayerId] = 6; PlaySE(SE_M_CHARM); } else if (JOY_NEW(DPAD_LEFT)) { sGame->players[sGame->multiplayerId].comm.pickState = PICK_LEFT; sGame->inputDelay[sGame->multiplayerId] = 6; PlaySE(SE_M_CHARM); } else if (JOY_NEW(DPAD_RIGHT)) { sGame->players[sGame->multiplayerId].comm.pickState = PICK_RIGHT; sGame->inputDelay[sGame->multiplayerId] = 6; PlaySE(SE_M_CHARM); } else { sGame->players[sGame->multiplayerId].comm.pickState = PICK_NONE; } } else { sGame->inputDelay[sGame->multiplayerId]--; } } static void ResetPickState(void) { sGame->players[sGame->multiplayerId].comm.pickState = PICK_NONE; } static u16 GetPrizeItemId(void) { return sGame->berryResults[sGame->multiplayerId][BERRY_PRIZE] + FIRST_BERRY_INDEX; } static u8 GetNumPlayers(void) { return sGame->numPlayers; } static u8 *GetPlayerName(u8 id) { if (gReceivedRemoteLinkPlayers) return gLinkPlayers[id].name; else return sGame->players[id].name; } static u16 GetBerryResult(u8 playerId, u8 berryId) { return sGame->berryResults[playerId][berryId]; } static u32 GetScore(u8 playerId) { u8 i; u32 scoreLost, score = 0; // Sum up points for berries picked for (i = 0; i < BERRY_MISSED; i++) score += sGame->berryResults[playerId][i] * sBerryScoreMultipliers[i]; // Get points lost for berries missed scoreLost = sGame->berryResults[playerId][BERRY_MISSED] * sBerryScoreMultipliers[BERRY_MISSED]; if (score <= scoreLost) return 0; else return score - scoreLost; } static u32 GetHighestScore(void) { u8 i, numPlayers = sGame->numPlayers; u32 highestScore = GetScore(0); for (i = 1; i < numPlayers; i++) { u32 score = GetScore(i); if (score > highestScore) highestScore = score; } return Min(highestScore, MAX_SCORE); } static u32 GetHighestBerryResult(u8 berryId) { u8 i, numPlayers = sGame->numPlayers; u16 highestResult = sGame->berryResults[0][berryId]; for (i = 0; i < numPlayers; i++) { u16 result = sGame->berryResults[i][berryId]; if (result > highestResult) highestResult = result; } return highestResult; } static u32 GetScoreByRanking(u8 ranking) { u32 scores[MAX_RFU_PLAYERS], temp; s16 unsorted = TRUE; u8 i, numPlayers = sGame->numPlayers; for (i = 0; i < numPlayers; i++) scores[i] = temp = GetScore(i); // Sort the scores in the array highest to lowest while (unsorted) { unsorted = FALSE; for (i = 0; i < numPlayers - 1; i++) { if (scores[i] < scores[i + 1]) { SWAP(scores[i], scores[i + 1], temp); unsorted = TRUE; } } } return scores[ranking]; } static u32 SetScoreResults(void) { u8 i, ranking = 0, nextRanking = 0, playersRanked = 0; u8 numPlayers = sGame->numPlayers; GetHighestScore(); // Useless call if (GetHighestScore() == 0) { // No one scored any points, put everyone in last place with a score of 0. // Presumably this was supposed to then return, as the assignments in this // loop are then overwritten by the rest of the function for (i = 0; i < numPlayers; i++) { sGame->scoreResults[i].ranking = MAX_RFU_PLAYERS - 1;; sGame->scoreResults[i].score = 0; } } // Set scores for (i = 0; i < numPlayers; i++) sGame->scoreResults[i].score = Min(GetScore(i), MAX_SCORE); // Set rankings do { u32 score = GetScoreByRanking(ranking); u8 curRanking = nextRanking; // Find all players with the score for this ranking. // Increment nextRanking but not curRanking to allow // for ties for (i = 0; i < numPlayers; i++) { if (score == sGame->scoreResults[i].score) { sGame->scoreResults[i].ranking = curRanking; nextRanking++; playersRanked++; } } ranking = nextRanking; } while (playersRanked < numPlayers); return 0; } static void GetScoreResults(struct DodrioGame_ScoreResults * dst, u8 playerId) { *dst = sGame->scoreResults[playerId]; } // Unused // Returns where the specified player's score ranks, 0 being first (highest score) static u8 GetScoreRanking(u8 playerId) { u8 i, ranking = 0; u8 numPlayers = sGame->numPlayers; u32 playersScore, scores[MAX_RFU_PLAYERS] = {0}; for (i = 0; i < numPlayers; i++) scores[i] = GetScore(i); playersScore = scores[playerId]; for (i = 0; i < MAX_RFU_PLAYERS; i++) { if (i != playerId && playersScore < scores[i]) ranking++; } return ranking; } enum { PRIZE_RECEIVED, PRIZE_FILLED_BAG, PRIZE_NO_ROOM, NO_PRIZE, }; static u8 TryGivePrize(void) { u8 multiplayerId = sGame->multiplayerId; u16 itemId = GetPrizeItemId(); if (GetScore(multiplayerId) != GetHighestScore()) return NO_PRIZE; if (!CheckBagHasSpace(itemId, 1)) return PRIZE_NO_ROOM; AddBagItem(itemId, 1); if (!CheckBagHasSpace(itemId, 1)) return PRIZE_FILLED_BAG; return PRIZE_RECEIVED; } static u32 IncrementWithLimit(u32 num, u32 max) { if (num < max) return num + 1; else return max; } static u32 Min(u32 a, u32 b) { if (a < b) return a; else return b; } static u8 GetPlayerIdByPos(u8 id) { return sGame->posToPlayerId[id]; } void IsDodrioInParty(void) { int i; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES) && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_DODRIO) { gSpecialVar_Result = TRUE; return; } } gSpecialVar_Result = FALSE; } #define NUM_RECORD_TYPES 3 void ShowDodrioBerryPickingRecords(void) { u8 taskId = CreateTask(Task_ShowDodrioBerryPickingRecords, 0); Task_ShowDodrioBerryPickingRecords(taskId); } static const struct WindowTemplate sWindowTemplates_Records = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 28, .height = 11, .paletteNum = 15, .baseBlock = 1, }; static const u8 *const sRecordsTexts[NUM_RECORD_TYPES + 1] = {gText_BerryPickingRecords, gText_BerriesPicked, gText_BestScore, gText_BerriesInRowFivePlayers}; static const u8 sRecordNumMaxDigits[NUM_RECORD_TYPES] = {4, 7, 4}; ALIGNED(4) static const u8 sRecordTextYCoords[NUM_RECORD_TYPES][2] = {{24}, {40}, {56}}; static const u8 sRecordNumYCoords[NUM_RECORD_TYPES][2] = {{24}, {40}, {70}}; #define tState data[0] #define tWindowId data[1] static void Task_ShowDodrioBerryPickingRecords(u8 taskId) { struct WindowTemplate window; s32 i, width, widthCurr; s16 *data = gTasks[taskId].data; switch (tState) { case 0: tWindowId = AddWindow(&sWindowTemplates_Records); PrintRecordsText(tWindowId); CopyWindowToVram(tWindowId, COPYWIN_FULL); tState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) tState++; break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON)) { rbox_fill_rectangle(tWindowId); CopyWindowToVram(tWindowId, COPYWIN_MAP); tState++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { RemoveWindow(tWindowId); DestroyTask(taskId); ScriptContext_Enable(); } break; } } #undef tState #undef tWindowId static void PrintRecordsText(u8 windowId) { s32 i, x, numWidth; s32 recordNums[NUM_RECORD_TYPES]; u8 strbuf[20]; recordNums[0] = gSaveBlock2Ptr->berryPick.berriesPicked; recordNums[1] = gSaveBlock2Ptr->berryPick.bestScore; recordNums[2] = gSaveBlock2Ptr->berryPick.berriesPickedInRow; LoadStdWindowGfx(windowId, 0x21D, BG_PLTT_ID(13)); DrawTextBorderOuter(windowId, 0x21D, 13); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); AddTextPrinterParameterized(windowId, FONT_NORMAL, sRecordsTexts[0], 1, 1, TEXT_SKIP_DRAW, NULL); for (i = 0; i < NUM_RECORD_TYPES; i++) { ConvertIntToDecimalStringN(strbuf, recordNums[i], STR_CONV_MODE_LEFT_ALIGN, sRecordNumMaxDigits[i]); numWidth = GetStringWidth(FONT_NORMAL, strbuf, -1); AddTextPrinterParameterized(windowId, FONT_NORMAL, sRecordsTexts[i + 1], 1, sRecordTextYCoords[i][0], TEXT_SKIP_DRAW, NULL); x = DISPLAY_WIDTH - 16 - numWidth; AddTextPrinterParameterized(windowId, FONT_NORMAL, strbuf, x, sRecordNumYCoords[i][0], TEXT_SKIP_DRAW, NULL); } PutWindowTilemap(windowId); } // Debug functions? static const u16 sDebug_BerryResults[MAX_RFU_PLAYERS][4] = { { [BERRY_BLUE] = MAX_BERRIES, [BERRY_GREEN] = 0, [BERRY_GOLD] = 90, [BERRY_MISSED] = MAX_BERRIES }, { [BERRY_BLUE] = MAX_BERRIES, [BERRY_GREEN] = MAX_BERRIES, [BERRY_GOLD] = 70, [BERRY_MISSED] = MAX_BERRIES }, { [BERRY_BLUE] = MAX_BERRIES, [BERRY_GREEN] = 0, [BERRY_GOLD] = MAX_BERRIES, [BERRY_MISSED] = 0 }, { [BERRY_BLUE] = MAX_BERRIES, [BERRY_GREEN] = MAX_BERRIES, [BERRY_GOLD] = 60, [BERRY_MISSED] = 0 }, { [BERRY_BLUE] = MAX_BERRIES, [BERRY_GREEN] = MAX_BERRIES, [BERRY_GOLD] = MAX_BERRIES, [BERRY_MISSED] = 0 }, }; static const u8 sJPText_Vowels[] = _("あいうえおかき"); static const u8 sText_Letters[] = _("ABCDEFG"); static const u8 sText_Digits[] = _("0123456"); static const u8 *const sPlaceholderPlayerNames[] = { sJPText_Vowels, sJPText_Vowels, sJPText_Vowels, sText_Letters, sText_Digits }; static void Debug_UpdateNumPlayers(void) { sGame->numPlayers = GetLinkPlayerCount(); } static void Debug_SetPlayerNamesAndResults(void) { u8 i, playerId; for (playerId = sGame->numPlayers; playerId < ARRAY_COUNT(sPlaceholderPlayerNames); playerId++) StringCopy(gLinkPlayers[playerId].name, sPlaceholderPlayerNames[playerId]); sGame->numPlayers = MAX_RFU_PLAYERS; for (i = 0; i < NUM_BERRY_TYPES; i++) { for (playerId = 0; playerId < sGame->numPlayers; playerId++) sGame->berryResults[playerId][i] = sDebug_BerryResults[playerId][i]; } } static const struct BgTemplate sBgTemplates[] = { { .bg = BG_INTERFACE, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0 }, { .bg = BG_TREE_LEFT, .charBaseIndex = 2, .mapBaseIndex = 12, .screenSize = 1, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = BG_TREE_RIGHT, .charBaseIndex = 2, .mapBaseIndex = 14, .screenSize = 1, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = BG_SCENERY, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0 }, }; static const struct WindowTemplate sWindowTemplate_Dummy = DUMMY_WIN_TEMPLATE; static const struct WindowTemplate sWindowTemplates_Results[] = { { .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 1, .width = 28, .height = 3, .paletteNum = 13, .baseBlock = 0x13, }, { .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 6, .width = 28, .height = 13, .paletteNum = 13, .baseBlock = 0x67, } }; static const struct WindowTemplate sWindowTemplate_Prize = { .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 6, .width = 28, .height = 7, .paletteNum = 13, .baseBlock = 0x67, }; enum { WIN_PLAY_AGAIN, WIN_YES_NO, }; static const struct WindowTemplate sWindowTemplates_PlayAgain[] = { [WIN_PLAY_AGAIN] = { .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 8, .width = 19, .height = 3, .paletteNum = 13, .baseBlock = 0x13, }, [WIN_YES_NO] = { .bg = BG_INTERFACE, .tilemapLeft = 22, .tilemapTop = 7, .width = 6, .height = 4, .paletteNum = 13, .baseBlock = 0x4C, } }; static const struct WindowTemplate sWindowTemplate_DroppedOut = { .bg = BG_INTERFACE, .tilemapLeft = 4, .tilemapTop = 6, .width = 22, .height = 5, .paletteNum = 13, .baseBlock = 0x13, }; static const struct WindowTemplate sWindowTemplate_CommStandby = { .bg = BG_INTERFACE, .tilemapLeft = 5, .tilemapTop = 8, .width = 19, .height = 3, .paletteNum = 13, .baseBlock = 0x13, }; // Unused duplicate of sActiveColumnMap static const u8 sActiveColumnMap_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] = { { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, }, { {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0}, {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0}, }, { {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0}, {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0}, {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0}, }, { {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0}, {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0}, {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0}, {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0}, }, { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2}, {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4}, {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}, {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8}, }, }; // Unused duplicate of sDodrioHeadToColumnMap static const u8 sDodrioHeadToColumnMap_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] = { { {4, 5, 6}, }, { {3, 4, 5}, {5, 6, 3}, }, { {4, 5, 6}, {6, 7, 2}, {2, 3, 4}, }, { {3, 4, 5}, {5, 6, 7}, {7, 8, 1}, {1, 2, 3}, }, { {4, 5, 6}, {6, 7, 8}, {8, 9, 0}, {0, 1, 2}, {2, 3, 4}, }, }; // Unused duplicate of sDodrioNeighborMap static const u8 sDodrioNeighborMap_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] = { { {1, 0, 1}, }, { {1, 0, 1}, {0, 1, 0}, }, { {2, 0, 1}, {0, 1, 2}, {1, 2, 0}, }, { {3, 0, 1}, {0, 1, 2}, {1, 2, 3}, {2, 3, 0}, }, { {4, 0, 1}, {0, 1, 2}, {1, 2, 3}, {2, 3, 4}, {3, 4, 0}, }, }; // Unused duplicate of sPlayerIdAtColumn ALIGNED(4) static const u8 sPlayerIdAtColumn_Duplicate[MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] = { {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9}, {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9}, {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9}, {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9}, {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3}, }; // Unused duplicate of sUnsharedColumns static const u8 sUnsharedColumns_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] = { {5}, {4, 6}, {3, 5, 7}, {2, 4, 6, 8}, {1, 3, 5, 6, 9}, }; static const u16 sBg_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/bg.gbapal", "graphics/dodrio_berry_picking/tree_border.gbapal"); static const u16 sDodrioNormal_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/dodrio.gbapal"); static const u16 sDodrioShiny_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/shiny.gbapal"); static const u16 sStatus_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/status.gbapal"); static const u16 sBerries_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/berries.gbapal"); static const u32 sBerries_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/berries.4bpp.lz"); static const u16 sCloud_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/cloud.gbapal"); static const u32 sBg_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.4bpp.lz"); static const u32 sTreeBorder_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border.4bpp.lz"); static const u32 sStatus_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/status.4bpp.lz"); static const u32 sCloud_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/cloud.4bpp.lz"); static const u32 sDodrio_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/dodrio.4bpp.lz"); static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.bin.lz"); static const u32 sTreeBorderRight_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_right.bin.lz"); static const u32 sTreeBorderLeft_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_left.bin.lz"); static const struct OamData sOamData_Dodrio = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0 }; // Used by the status bar and the results screen berry icons static const struct OamData sOamData_16x16_Priority0 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 0, .paletteNum = 0, .affineParam = 0 }; static const struct OamData sOamData_Berry = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0 }; static const struct OamData sOamData_Cloud = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0, .priority = 3, .paletteNum = 0, .affineParam = 0 }; static const union AnimCmd sAnim_Dodrio_Normal[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Dodrio_PickRight[] = { ANIMCMD_FRAME(64, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Dodrio_PickMiddle[] = { ANIMCMD_FRAME(128, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Dodrio_PickLeft[] = { ANIMCMD_FRAME(192, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Dodrio_Down[] = { ANIMCMD_FRAME(256, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_Dodrio[] = { [PICK_NONE] = sAnim_Dodrio_Normal, [PICK_RIGHT] = sAnim_Dodrio_PickRight, [PICK_MIDDLE] = sAnim_Dodrio_PickMiddle, [PICK_LEFT] = sAnim_Dodrio_PickLeft, [PICK_DISABLED] = sAnim_Dodrio_Down, // There is an unused 6th frame of Dodrio's graphic }; static const union AnimCmd sAnims_StatusBar_Yellow[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnims_StatusBar_Gray[] = { ANIMCMD_FRAME(4, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnims_StatusBar_Red[] = { ANIMCMD_FRAME(8, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_StatusBar[] = { [STATUS_YELLOW] = sAnims_StatusBar_Yellow, [STATUS_GRAY] = sAnims_StatusBar_Gray, [STATUS_RED] = sAnims_StatusBar_Red }; static const union AnimCmd sAnim_Berry_Blue[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Berry_Green[] = { ANIMCMD_FRAME(4, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Berry_Gold[] = { ANIMCMD_FRAME(8, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Berry_BlueSquished[] = { ANIMCMD_FRAME(12, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Berry_GreenSquished[] = { ANIMCMD_FRAME(16, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Berry_GoldSquished[] = { ANIMCMD_FRAME(20, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Berry_Eaten[] = { ANIMCMD_FRAME(24, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Berry_Empty1[] = { ANIMCMD_FRAME(28, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Berry_Empty2[] = { ANIMCMD_FRAME(32, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_Berry[] = { [BERRY_BLUE] = sAnim_Berry_Blue, [BERRY_GREEN] = sAnim_Berry_Green, [BERRY_GOLD] = sAnim_Berry_Gold, [BERRY_BLUE + BERRY_MISSED] = sAnim_Berry_BlueSquished, [BERRY_GREEN + BERRY_MISSED] = sAnim_Berry_GreenSquished, [BERRY_GOLD + BERRY_MISSED] = sAnim_Berry_GoldSquished, [ANIM_EATEN] = sAnim_Berry_Eaten, sAnim_Berry_Empty1, sAnim_Berry_Empty2 }; static const union AnimCmd sAnim_Cloud[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_Cloud[] = { sAnim_Cloud }; static void LoadDodrioGfx(void) { void *ptr = AllocZeroed(0x3000); struct SpritePalette normal = {sDodrioNormal_Pal, PALTAG_DODRIO_NORMAL}; struct SpritePalette shiny = {sDodrioShiny_Pal, PALTAG_DODRIO_SHINY}; LZ77UnCompWram(sDodrio_Gfx, ptr); if (ptr) { struct SpriteSheet sheet = {ptr, 0x3000, GFXTAG_DODRIO}; LoadSpriteSheet(&sheet); Free(ptr); } LoadSpritePalette(&normal); LoadSpritePalette(&shiny); } static void CreateDodrioSprite(struct DodrioGame_MonInfo * monInfo, u8 playerId, u8 id, u8 numPlayers) { struct SpriteTemplate template = { .tileTag = GFXTAG_DODRIO, .paletteTag = monInfo->isShiny, // PALTAG_DODRIO_NORMAL / PALTAG_DODRIO_SHINY .oam = &sOamData_Dodrio, .anims = sAnims_Dodrio, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Dodrio, }; sDodrioSpriteIds[id] = AllocZeroed(4); *sDodrioSpriteIds[id] = CreateSprite(&template, GetDodrioXPos(playerId, numPlayers), 136, 3); SetDodrioInvisibility(TRUE, id); } #define sState data[0] #define sTimer data[1] #define sUnused1 data[2] #define sUnused2 data[3] #define sUnused3 data[4] static void SpriteCB_Dodrio(struct Sprite *sprite) { switch (sprite->sState) { case 0: break; case 1: DoDodrioMissedAnim(sprite); break; case 2: DoDodrioIntroAnim(sprite); break; } } static void StartDodrioMissedAnim(u8 unused) { struct Sprite *sprite = &gSprites[*sDodrioSpriteIds[GetMultiplayerId()]]; sprite->sState = 1; sprite->sTimer = 0; sprite->sUnused1 = 0; sprite->sUnused2 = 0; sprite->sUnused3 = 0; } static void StartDodrioIntroAnim(u8 unused) { struct Sprite *sprite = &gSprites[*sDodrioSpriteIds[GetMultiplayerId()]]; sprite->sState = 2; sprite->sTimer = 0; sprite->sUnused1 = 0; sprite->sUnused2 = 0; sprite->sUnused3 = 0; } // Do animation where Dodrio shakes horizontally after reaching for a berry and missing static u32 DoDodrioMissedAnim(struct Sprite *sprite) { s8 x; u8 state = (++sprite->sTimer / 2) % 4; if (sprite->sTimer >= 3) { switch (state) { default: x = 1; break; case 1: case 2: x = -1; break; } sprite->x += x; if (++sprite->sTimer >= 40) { sprite->sState = 0; sprite->x = GetDodrioXPos(0, GetNumPlayers()); } } return 0; } // Does the intro animation where the player's Dodrio // cycles through extending each head twice #define FRAMES_PER_STATE 13 #define NUM_INTRO_PICK_STATES PICK_DISABLED // Cycle through 'Normal' and each head, but exclude the Disabled state static u32 DoDodrioIntroAnim(struct Sprite *sprite) { u8 pickState = (++sprite->sTimer / FRAMES_PER_STATE) % NUM_INTRO_PICK_STATES; // Play a sound effect at the start of each head extension if (sprite->sTimer % FRAMES_PER_STATE == 0 && pickState != PICK_NONE) PlaySE(SE_M_CHARM); if (sprite->sTimer >= FRAMES_PER_STATE * NUM_INTRO_PICK_STATES * 2) { // End animation sprite->sState = 0; pickState = PICK_NONE; } SetDodrioAnim(GetMultiplayerId(), pickState); return 0; } #undef sState #undef sTimer #undef sUnused1 #undef sUnused2 #undef sUnused3 static void FreeDodrioSprites(u8 numPlayers) { u8 i; for (i = 0; i < numPlayers; i++) { struct Sprite *sprite = &gSprites[*sDodrioSpriteIds[i]]; if (sprite) DestroySpriteAndFreeResources(sprite); #ifdef BUGFIX FREE_AND_SET_NULL(sDodrioSpriteIds[i]); // Memory should be freed here but is not. #endif } } static void SetDodrioInvisibility(bool8 invisible, u8 id) { gSprites[*sDodrioSpriteIds[id]].invisible = invisible; } static void SetAllDodrioInvisibility(bool8 invisible, u8 numPlayers) { u8 i; for (i = 0; i < numPlayers; i++) SetDodrioInvisibility(invisible, i); } static void SetDodrioAnim(u8 id, u8 pickState) { StartSpriteAnim(&gSprites[*sDodrioSpriteIds[id]], pickState); } static void SpriteCB_Status(struct Sprite *sprite) { } static void InitStatusBarPos(void) { u8 i; for (i = 0; i < NUM_STATUS_SQUARES; i++) { struct Sprite *sprite = &gSprites[sStatusBar->spriteIds[i]]; sprite->x = (i * 16) + 48; sprite->y = -8 - (i * 8); sStatusBar->entered[i] = FALSE; } } static void CreateStatusBarSprites(void) { u8 i; void *ptr = AllocZeroed(0x180); struct SpritePalette pal = {sStatus_Pal, PALTAG_STATUS}; LZ77UnCompWram(sStatus_Gfx, ptr); // This check should be one line up. if (ptr) { struct SpriteSheet sheet = {ptr, 0x180, GFXTAG_STATUS}; struct SpriteTemplate template = { .tileTag = GFXTAG_STATUS, .paletteTag = PALTAG_STATUS, .oam = &sOamData_16x16_Priority0, .anims = sAnims_StatusBar, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Status, }; sStatusBar = AllocZeroed(sizeof(*sStatusBar)); LoadSpriteSheet(&sheet); LoadSpritePalette(&pal); for (i = 0; i < NUM_STATUS_SQUARES; i++) sStatusBar->spriteIds[i] = CreateSprite(&template, (i * 16) + 48, -8 - (i * 8), 0); } Free(ptr); } static void FreeStatusBar(void) { u8 i; for (i = 0; i < NUM_STATUS_SQUARES; i++) { struct Sprite *sprite = &gSprites[sStatusBar->spriteIds[i]]; if (sprite) DestroySpriteAndFreeResources(sprite); } FREE_AND_SET_NULL(sStatusBar); } // Progress an animation where each square of the // status bar drops down into view, bounces up, // then settles into position. // Returns TRUE if the animation is complete static bool32 DoStatusBarIntro(void) { u8 i; bool32 animActive = FALSE; for (i = 0; i < NUM_STATUS_SQUARES; i++) { struct Sprite *sprite = &gSprites[sStatusBar->spriteIds[i]]; sStatusBar->yChange[i] = 2; if (sStatusBar->entered[i] != 0 && sprite->y == 8) continue; animActive = TRUE; if (sprite->y == 8) { if (sStatusBar->entered[i]) continue; // Square has entered screen, play click // sound and reverse direction sStatusBar->entered[i] = TRUE; sStatusBar->yChange[i] = -16; PlaySE(SE_CLICK); } sprite->y += sStatusBar->yChange[i]; } if (animActive) return FALSE; else return TRUE; } // The status bar at the top changes color depending on the game performance. // The squares start out yellow. For every berry missed, a square is colored gray. // If there are 4 or fewer yellow squares left they also flash red static void UpdateStatusBarAnim(u8 numEmpty) { u8 i; if (numEmpty > NUM_STATUS_SQUARES) { // All squares gray for (i = 0; i < NUM_STATUS_SQUARES; i++) StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_GRAY); } else { // At least 1 square is yellow for (i = 0; i < NUM_STATUS_SQUARES - numEmpty; i++) { if (numEmpty > 6) { // Flash the yellow squares red // The flash cycles faster the fewer yellow squares remain sStatusBar->flashTimer += numEmpty - 6; if (sStatusBar->flashTimer > 30) sStatusBar->flashTimer = 0; else if (sStatusBar->flashTimer > 10) StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_RED); else StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_YELLOW); } else { StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_YELLOW); } } // Set remaining squares gray for (; i < NUM_STATUS_SQUARES; i++) StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_GRAY); } } static void SetStatusBarInvisibility(bool8 invisible) { u8 i; for (i = 0; i < NUM_STATUS_SQUARES; i++) gSprites[sStatusBar->spriteIds[i]].invisible = invisible; } static const u8 sUnusedSounds[] = { SE_M_CHARM, SE_NOTE_C, SE_NOTE_D, SE_NOTE_E, SE_NOTE_F, SE_NOTE_G, SE_NOTE_A, SE_NOTE_B, SE_NOTE_C_HIGH, SE_CARD_OPEN }; static void LoadBerryGfx(void) { void *ptr = AllocZeroed(0x480); struct SpritePalette pal = {sBerries_Pal, PALTAG_BERRIES}; LZ77UnCompWram(sBerries_Gfx, ptr); if (ptr) { struct SpriteSheet sheet = {ptr, 0x480, GFXTAG_BERRIES}; LoadSpriteSheet(&sheet); } LoadSpritePalette(&pal); Free(ptr); } static const s16 sBerryIconXCoords[] = {88, 128, 168, 208}; static void CreateBerrySprites(void) { u8 i; s16 x; struct SpriteTemplate berry = { .tileTag = GFXTAG_BERRIES, .paletteTag = PALTAG_BERRIES, .oam = &sOamData_Berry, .anims = sAnims_Berry, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; struct SpriteTemplate berryIcon = { .tileTag = GFXTAG_BERRIES, .paletteTag = PALTAG_BERRIES, .oam = &sOamData_16x16_Priority0, .anims = sAnims_Berry, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; // Create berry sprites that fall during gameplay for (i = 0; i < NUM_BERRY_COLUMNS; i++) { sBerrySpriteIds[i] = AllocZeroed(4); x = i * 16; *sBerrySpriteIds[i] = CreateSprite(&berry, x + (i * 8), 8, 1); SetBerryInvisibility(i, TRUE); } // Create berry icon sprites for results screen for (i = 0; i < NUM_BERRY_TYPES; i++) { sBerryIconSpriteIds[i] = AllocZeroed(4); if (i == BERRY_MISSED) *sBerryIconSpriteIds[i] = CreateSprite(&berryIcon, sBerryIconXCoords[i], 57, 0); else *sBerryIconSpriteIds[i] = CreateSprite(&berryIcon, sBerryIconXCoords[i], 60, 0); StartSpriteAnim(&gSprites[*sBerryIconSpriteIds[i]], i); } SetBerryIconsInvisibility(TRUE); } static void FreeBerrySprites(void) { struct Sprite *sprite; u8 i; for (i = 0; i < NUM_BERRY_COLUMNS; i++) { sprite = &gSprites[*sBerrySpriteIds[i]]; if (sprite) DestroySprite(sprite); FREE_AND_SET_NULL(sBerrySpriteIds[i]); } for (i = 0; i < NUM_BERRY_TYPES; i++) { sprite = &gSprites[*sBerryIconSpriteIds[i]]; if (sprite) DestroySprite(sprite); FREE_AND_SET_NULL(sBerryIconSpriteIds[i]); } } static void SetBerryInvisibility(u8 id, bool8 invisible) { gSprites[*sBerrySpriteIds[id]].invisible = invisible; } static void SetBerryIconsInvisibility(bool8 invisible) { u8 i; for (i = 0; i < NUM_BERRY_TYPES; i++) gSprites[*sBerryIconSpriteIds[i]].invisible = invisible; } static void SetBerryYPos(u8 id, u8 y) { gSprites[*sBerrySpriteIds[id]].y = y * 8; } static void SetBerryAnim(u16 id, u8 animNum) { StartSpriteAnim(&gSprites[*sBerrySpriteIds[id]], animNum); } // Unused static void UnusedSetSpritePos(u8 spriteId) { gSprites[spriteId].x = 20 * spriteId + 50; gSprites[spriteId].y = 50; } // Gamefreak made a mistake there and goes out of bounds for the data array as it holds 8 elements // in turn overwriting sprite's subpriority and subsprites fields. #ifdef UBFIX #define sFrozen data[1] #else #define sFrozen data[10] #endif // BUGFIX static void SpriteCB_Cloud(struct Sprite *sprite) { u8 i; static const u8 moveDelays[] = {30, 20}; if (sprite->sFrozen != TRUE) { for (i = 0; i < NUM_CLOUDS; i++) { if (++sCloudSpriteIds[i][1] > moveDelays[i]) { sprite->x--; sCloudSpriteIds[i][1] = 0; } } } } static const s16 sCloudStartCoords[NUM_CLOUDS][2] = { {230, 55}, { 30, 74} }; static void CreateCloudSprites(void) { u8 i; void *ptr = AllocZeroed(0x400); struct SpritePalette pal = {sCloud_Pal, PALTAG_CLOUD}; LZ77UnCompWram(sCloud_Gfx, ptr); if (ptr) { struct SpriteSheet sheet = {ptr, 0x400, GFXTAG_CLOUD}; struct SpriteTemplate template = { .tileTag = GFXTAG_CLOUD, .paletteTag = PALTAG_CLOUD, .oam = &sOamData_Cloud, .anims = sAnims_Cloud, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Cloud, }; LoadSpriteSheet(&sheet); LoadSpritePalette(&pal); for (i = 0; i < NUM_CLOUDS; i++) { sCloudSpriteIds[i] = AllocZeroed(4); *sCloudSpriteIds[i] = CreateSprite(&template, sCloudStartCoords[i][0], sCloudStartCoords[i][1], 4); } } Free(ptr); } static void ResetCloudPos(void) { u8 i; for (i = 0; i < NUM_CLOUDS; i++) { struct Sprite *sprite = &gSprites[*sCloudSpriteIds[i]]; sprite->sFrozen = TRUE; sprite->x = sCloudStartCoords[i][0]; sprite->y = sCloudStartCoords[i][1]; } } static void StartCloudMovement(void) { u8 i; for (i = 0; i < NUM_CLOUDS; i++) { struct Sprite *sprite = &gSprites[*sCloudSpriteIds[i]]; sprite->sFrozen = FALSE; } } static void FreeCloudSprites(void) { u8 i; for (i = 0; i < NUM_CLOUDS; i++) { struct Sprite *sprite = &gSprites[*sCloudSpriteIds[i]]; if (sprite) DestroySprite(sprite); FREE_AND_SET_NULL(sCloudSpriteIds[i]); } } static void SetCloudInvisibility(bool8 invisible) { u8 i; for (i = 0; i < NUM_CLOUDS; i++) gSprites[*sCloudSpriteIds[i]].invisible = invisible; } #undef sFrozen static s16 GetDodrioXPos(u8 playerId, u8 numPlayers) { s16 x = 0; switch (numPlayers) { case 1: x = 15; break; case 2: switch (playerId) { case 0: x = 12; break; case 1: x = 18; break; } break; case 3: switch (playerId) { case 0: x = 15; break; case 1: x = 21; break; case 2: x = 9; break; } break; case 4: switch (playerId) { case 0: x = 12; break; case 1: x = 18; break; case 2: x = 24; break; case 3: x = 6; break; } break; case 5: switch (playerId) { case 0: x = 15; break; case 1: x = 21; break; case 2: x = 27; break; case 3: x = 3; break; case 4: x = 9; break; } break; } return x * 8; } static void ResetBerryAndStatusBarSprites(void) { u8 i; for (i = 0; i < NUM_BERRY_COLUMNS; i++) { SetBerryInvisibility(i, TRUE); SetBerryYPos(i, 1); } SetStatusBarInvisibility(FALSE); } static void LoadWindowFrameGfx(u8 frameId) { LoadBgTiles(BG_INTERFACE, GetUserWindowGraphics(frameId)->tiles, 0x120, 1); LoadPalette(GetUserWindowGraphics(frameId)->palette, BG_PLTT_ID(10), PLTT_SIZE_4BPP); } static void DBP_LoadStdWindowGfx(void) { LoadStdWindowGfx(0, 0xA, BG_PLTT_ID(11)); } static void ResetGfxState(void) { sGfx->finished = FALSE; sGfx->state = 0; sGfx->loadState = 0; sGfx->cursorSelection = 0; sGfx->playAgainState = PLAY_AGAIN_NONE; } static void DrawYesNoMessageWindow(const struct WindowTemplate * template) { u8 pal = 10; FillBgTilemapBufferRect(BG_INTERFACE, 1, template->tilemapLeft - 1, template->tilemapTop - 1, 1, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 2, template->tilemapLeft, template->tilemapTop - 1, template->width, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 3, template->tilemapLeft + template->width, template->tilemapTop - 1, 1, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 4, template->tilemapLeft - 1, template->tilemapTop, 1, template->height, pal); FillBgTilemapBufferRect(BG_INTERFACE, 6, template->tilemapLeft + template->width, template->tilemapTop, 1, template->height, pal); FillBgTilemapBufferRect(BG_INTERFACE, 7, template->tilemapLeft - 1, template->tilemapTop + template->height, 1, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 8, template->tilemapLeft, template->tilemapTop + template->height, template->width, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 9, template->tilemapLeft + template->width, template->tilemapTop + template->height, 1, 1, pal); } static void DrawMessageWindow(const struct WindowTemplate * template) { u8 pal = 11; FillBgTilemapBufferRect(BG_INTERFACE, 10, template->tilemapLeft - 1, template->tilemapTop - 1, 1, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 11, template->tilemapLeft, template->tilemapTop - 1, template->width, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 12, template->tilemapLeft + template->width, template->tilemapTop - 1, 1, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 13, template->tilemapLeft - 1, template->tilemapTop, 1, template->height, pal); FillBgTilemapBufferRect(BG_INTERFACE, 15, template->tilemapLeft + template->width, template->tilemapTop, 1, template->height, pal); FillBgTilemapBufferRect(BG_INTERFACE, 16, template->tilemapLeft - 1, template->tilemapTop + template->height, 1, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 17, template->tilemapLeft, template->tilemapTop + template->height, template->width, 1, pal); FillBgTilemapBufferRect(BG_INTERFACE, 18, template->tilemapLeft + template->width, template->tilemapTop + template->height, 1, 1, pal); } static void InitGameGfx(struct DodrioGame_Gfx * ptr) { sGfx = ptr; sGfx->finished = FALSE; sGfx->state = 0; sGfx->loadState = 0; sGfx->cursorSelection = 0; sGfx->playAgainState = PLAY_AGAIN_NONE; sGfx->taskId = CreateTask(Task_TryRunGfxFunc, 3); SetGfxFunc(LoadGfx); } // Unused static void FreeAllWindowBuffers_(void) { FreeAllWindowBuffers(); } struct WinCoords { u8 left; u8 top; }; enum { COLORID_GRAY, COLORID_RED, COLORID_BLUE, COLORID_GREEN, // Unused }; static const u8 sTextColorTable[][3] = { [COLORID_GRAY] = {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, [COLORID_RED] = {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}, [COLORID_BLUE] = {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, [COLORID_GREEN] = {TEXT_COLOR_WHITE, TEXT_COLOR_GREEN, TEXT_COLOR_LIGHT_GREEN}, }; static const struct WinCoords sNameWindowCoords_1Player[] = {{12, 6}}; static const struct WinCoords sNameWindowCoords_2Players[] = {{9, 10}, {15, 6}}; static const struct WinCoords sNameWindowCoords_3Players[] = {{12, 6}, {18, 10}, {6, 10}}; static const struct WinCoords sNameWindowCoords_4Players[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}}; static const struct WinCoords sNameWindowCoords_5Players[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}}; static const struct WinCoords * const sNameWindowCoords[MAX_RFU_PLAYERS] = { sNameWindowCoords_1Player, sNameWindowCoords_2Players, sNameWindowCoords_3Players, sNameWindowCoords_4Players, sNameWindowCoords_5Players, }; static const u8 *const sRankingTexts[MAX_RFU_PLAYERS] = { gText_1Colon, gText_2Colon, gText_3Colon, gText_4Colon, gText_5Colon, }; static const u16 sResultsXCoords[] = {92, 132, 172, 212}; static const u16 sResultsYCoords[] = {30, 45, 60, 75, 90}; static const u16 sRankingYCoords[] = {12, 28, 44, 60, 76}; struct { u8 id; void (*func)(void); } const sGfxFuncs[] = { {GFXFUNC_LOAD, LoadGfx}, // Element not used, LoadGfx is passed directly to SetGfxFunc {GFXFUNC_SHOW_NAMES, ShowNames}, {GFXFUNC_SHOW_RESULTS, ShowResults}, {GFXFUNC_MSG_PLAY_AGAIN, Msg_WantToPlayAgain}, {GFXFUNC_MSG_SAVING, Msg_SavingDontTurnOff}, {GFXFUNC_MSG_COMM_STANDBY, Msg_CommunicationStandby}, {GFXFUNC_ERASE_MSG, EraseMessage}, {GFXFUNC_MSG_PLAYER_DROPPED, Msg_SomeoneDroppedOut}, {GFXFUNC_STOP, StopGfxFuncs}, {GFXFUNC_IDLE, GfxIdle}, }; static void SetGfxFuncById(u8 funcId) { u8 i; for (i = 0; i < ARRAY_COUNT(sGfxFuncs); i++) { if (sGfxFuncs[i].id == funcId) SetGfxFunc(sGfxFuncs[i].func); } } static void Task_TryRunGfxFunc(u8 taskId) { // Continue calling function until it // has reached its finished state. // Another will not be called until // readied by SetGfxFunc if (!sGfx->finished) GetGfxFunc()(); } static void LoadGfx(void) { switch (sGfx->state) { case 0: InitBgs(); sGfx->state++; break; case 1: if (LoadBgGfx() == TRUE) sGfx->state++; break; case 2: CopyToBgTilemapBuffer(BG_SCENERY, sBg_Tilemap, 0, 0); CopyToBgTilemapBuffer(BG_TREE_LEFT, sTreeBorderLeft_Tilemap, 0, 0); CopyToBgTilemapBuffer(BG_TREE_RIGHT, sTreeBorderRight_Tilemap, 0, 0); CopyBgTilemapBufferToVram(BG_SCENERY); CopyBgTilemapBufferToVram(BG_TREE_LEFT); CopyBgTilemapBufferToVram(BG_TREE_RIGHT); sGfx->state++; break; case 3: ShowBg(BG_INTERFACE); ShowBg(BG_SCENERY); ShowBg(BG_TREE_LEFT); ShowBg(BG_TREE_RIGHT); sGfx->state++; break; case 4: LoadWindowFrameGfx(gSaveBlock2Ptr->optionsWindowFrameType); DBP_LoadStdWindowGfx(); sGfx->state++; break; default: sGfx->finished = TRUE; break; } } static void ShowNames(void) { u8 i, numPlayers, playerId, colorsId, *name; u32 left; struct WindowTemplate window; const struct WinCoords * coords; switch (sGfx->state) { case 0: numPlayers = GetNumPlayers(); coords = sNameWindowCoords[numPlayers - 1]; window.bg = BG_INTERFACE; window.width = 7; window.height = 2; window.paletteNum = 13; window.baseBlock = 0x13; for (i = 0; i < numPlayers; coords++, i++) { colorsId = 0; playerId = GetPlayerIdByPos(i); left = (56 - GetStringWidth(FONT_SMALL, GetPlayerName(playerId), -1)) / 2u; window.tilemapLeft = coords->left; window.tilemapTop = coords->top; sGfx->windowIds[i] = AddWindow(&window); ClearWindowTilemap(sGfx->windowIds[i]); FillWindowPixelBuffer(sGfx->windowIds[i], PIXEL_FILL(1)); if (playerId == GetMultiplayerId()) colorsId = COLORID_BLUE; name = GetPlayerName(playerId); AddTextPrinterParameterized3(sGfx->windowIds[i], FONT_SMALL, left, 1, sTextColorTable[colorsId], TEXT_SKIP_DRAW, name); CopyWindowToVram(sGfx->windowIds[i], COPYWIN_GFX); window.baseBlock += 0xE; DrawMessageWindow(&window); } sGfx->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { numPlayers = GetNumPlayers(); for (i = 0; i < numPlayers; i++) PutWindowTilemap(sGfx->windowIds[i]); CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->state++; } break; default: if (++sGfx->state > 180) { numPlayers = GetNumPlayers(); for (i = 0; i < numPlayers; i++) { ClearWindowTilemap(sGfx->windowIds[i]); RemoveWindow(sGfx->windowIds[i]); } FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->finished = TRUE; } break; } } static void PrintRankedScores(u8 numPlayers_) { u8 i, ranking = 0, rankedPlayers = 0; u8 numPlayers = numPlayers_; // Needed to match u8 *name; u32 x, numWidth; u8 numString[32]; u8 playersByRanking[MAX_RFU_PLAYERS] = {0, 1, 2, 3, 4}; struct DodrioGame_ScoreResults temp, scoreResults[MAX_RFU_PLAYERS]; // Get all players scores and rankings for (i = 0; i < numPlayers; i++) { playersByRanking[i] = i; GetScoreResults(&temp, i); scoreResults[i] = temp; } // Sort player ids by ranking if (GetHighestScore() != 0) { do { for (i = 0; i < numPlayers; i++) { if (scoreResults[i].ranking == ranking) { playersByRanking[rankedPlayers] = i; rankedPlayers++; } } ranking = rankedPlayers; } while (rankedPlayers < numPlayers); } // Put any player with a score of 0 at lowest ranking for (i = 0; i < numPlayers; i++) { if (scoreResults[i].score == 0) scoreResults[i].ranking = numPlayers - 1; } // Print text x = 216 - GetStringWidth(FONT_SMALL, gText_SpacePoints, 0); for (i = 0; i < numPlayers; i++) { u8 colorsId = COLORID_GRAY; u8 playerId = playersByRanking[i]; u32 points = scoreResults[playerId].score; AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, sRankingTexts[scoreResults[playerId].ranking], 8, sRankingYCoords[i], TEXT_SKIP_DRAW, NULL); if (playerId == GetMultiplayerId()) colorsId =COLORID_BLUE; name = GetPlayerName(playerId); AddTextPrinterParameterized3(sGfx->windowIds[1], FONT_SMALL, 28, sRankingYCoords[i], sTextColorTable[colorsId], TEXT_SKIP_DRAW, name); ConvertIntToDecimalStringN(numString, points, STR_CONV_MODE_RIGHT_ALIGN, 7); numWidth = GetStringWidth(FONT_SMALL, numString, -1); AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, numString, x - 35, sRankingYCoords[i], TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, gText_SpacePoints, x, sRankingYCoords[i], TEXT_SKIP_DRAW, NULL); } } static void ShowResults(void) { u8 i, j, prizeState, numPlayers = GetNumPlayers(); u8 *name; u32 strWidth, x; u8 strBuff_Large[100]; u8 strBuff_Small[20]; switch (sGfx->state) { case 0: SetScoreResults(); sGfx->timer = 0; sGfx->state++; break; case 1: sGfx->windowIds[0] = AddWindow(&sWindowTemplates_Results[0]); sGfx->windowIds[1] = AddWindow(&sWindowTemplates_Results[1]); ClearWindowTilemap(sGfx->windowIds[0]); ClearWindowTilemap(sGfx->windowIds[1]); DrawMessageWindow(&sWindowTemplates_Results[0]); DrawMessageWindow(&sWindowTemplates_Results[1]); sGfx->state++; break; case 2: FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); FillWindowPixelBuffer(sGfx->windowIds[1], PIXEL_FILL(1)); strWidth = GetStringWidth(FONT_SMALL, gText_BerryPickingResults, -1); x = (DISPLAY_WIDTH - 16 - strWidth) / 2; AddTextPrinterParameterized(sGfx->windowIds[0], FONT_SMALL, gText_BerryPickingResults, x, 2, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, gText_10P30P50P50P, 68, 16, TEXT_SKIP_DRAW, NULL); for (i = 0; i < numPlayers; i++) { u8 colorsId = COLORID_GRAY; if (i == GetMultiplayerId()) colorsId = COLORID_BLUE; name = GetPlayerName(i); AddTextPrinterParameterized3(sGfx->windowIds[1], FONT_SMALL, 2, sResultsYCoords[i], sTextColorTable[colorsId], TEXT_SKIP_DRAW, name); for (j = 0; j < 4; j++) { u32 width; u16 berriesPicked = Min(GetBerryResult(i, j), MAX_BERRIES); u16 maxBerriesPicked = Min(GetHighestBerryResult(j), MAX_BERRIES); ConvertIntToDecimalStringN(strBuff_Large, berriesPicked, STR_CONV_MODE_LEFT_ALIGN, 4); width = GetStringWidth(FONT_SMALL, strBuff_Large, -1); // If player got the most of a berry type, highlight their number in red if (maxBerriesPicked == berriesPicked && maxBerriesPicked != 0) AddTextPrinterParameterized3(sGfx->windowIds[1], FONT_SMALL, sResultsXCoords[j] - width, sResultsYCoords[i], sTextColorTable[1], TEXT_SKIP_DRAW, strBuff_Large); else AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, strBuff_Large, sResultsXCoords[j] - width, sResultsYCoords[i], TEXT_SKIP_DRAW, NULL); } } CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX); CopyWindowToVram(sGfx->windowIds[1], COPYWIN_GFX); sGfx->state++; break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { PutWindowTilemap(sGfx->windowIds[0]); PutWindowTilemap(sGfx->windowIds[1]); } CopyBgTilemapBufferToVram(BG_INTERFACE); SetBerryIconsInvisibility(FALSE); sGfx->state++; break; case 4: if (++sGfx->timer >= 30 && JOY_NEW(A_BUTTON)) { sGfx->timer = 0; PlaySE(SE_SELECT); SetBerryIconsInvisibility(TRUE); sGfx->state++; } break; case 5: FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); FillWindowPixelBuffer(sGfx->windowIds[1], PIXEL_FILL(1)); strWidth = GetStringWidth(FONT_SMALL, gText_AnnouncingRankings, -1); x = (DISPLAY_WIDTH - 16 - strWidth) / 2; AddTextPrinterParameterized(sGfx->windowIds[0], FONT_SMALL, gText_AnnouncingRankings, x, 2, TEXT_SKIP_DRAW, NULL); sGfx->state++; break; case 6: PrintRankedScores(numPlayers); CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX); CopyWindowToVram(sGfx->windowIds[1], COPYWIN_GFX); sGfx->state++; break; case 7: if (!IsDma3ManagerBusyWithBgCopy()) { PutWindowTilemap(sGfx->windowIds[0]); PutWindowTilemap(sGfx->windowIds[1]); } CopyBgTilemapBufferToVram(0); sGfx->state++; break; case 8: if (++sGfx->timer >= 30 && JOY_NEW(A_BUTTON)) { sGfx->timer = 0; PlaySE(SE_SELECT); if (GetHighestScore() < 3000) { sGfx->state = 127; // Skip to end, past giving prize } else { StopMapMusic(); sGfx->state++; } FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 5, 30, 15); RemoveWindow(sGfx->windowIds[1]); sGfx->windowIds[1] = AddWindow(&sWindowTemplate_Prize); ClearWindowTilemap(sGfx->windowIds[1]); DrawMessageWindow(&sWindowTemplate_Prize); } break; case 9: PlayNewMapMusic(MUS_LEVEL_UP); FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); FillWindowPixelBuffer(sGfx->windowIds[1], PIXEL_FILL(1)); strWidth = GetStringWidth(FONT_SMALL, gText_AnnouncingPrizes, -1); x = (DISPLAY_WIDTH - 16 - strWidth) / 2; AddTextPrinterParameterized(sGfx->windowIds[0], FONT_SMALL, gText_AnnouncingPrizes, x, 2, TEXT_SKIP_DRAW, NULL); DynamicPlaceholderTextUtil_Reset(); CopyItemName(GetPrizeItemId(), strBuff_Small); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, strBuff_Small); DynamicPlaceholderTextUtil_ExpandPlaceholders(strBuff_Large, gText_FirstPlacePrize); AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, strBuff_Large, 8, 2, TEXT_SKIP_DRAW, NULL); prizeState = TryGivePrize(); if (prizeState != PRIZE_RECEIVED && prizeState != NO_PRIZE) { DynamicPlaceholderTextUtil_Reset(); CopyItemName(GetPrizeItemId(), strBuff_Small); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, strBuff_Small); if (prizeState == PRIZE_NO_ROOM) DynamicPlaceholderTextUtil_ExpandPlaceholders(strBuff_Large, gText_CantHoldAnyMore); else if (prizeState == PRIZE_FILLED_BAG) DynamicPlaceholderTextUtil_ExpandPlaceholders(strBuff_Large, gText_FilledStorageSpace); AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, strBuff_Large, 8, 40, TEXT_SKIP_DRAW, NULL); } CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX); CopyWindowToVram(sGfx->windowIds[1], COPYWIN_GFX); sGfx->state++; break; case 10: if (!IsDma3ManagerBusyWithBgCopy()) { PutWindowTilemap(sGfx->windowIds[0]); PutWindowTilemap(sGfx->windowIds[1]); } CopyBgTilemapBufferToVram(BG_INTERFACE); FadeOutAndFadeInNewMapMusic(MUS_VICTORY_WILD, 20, 10); sGfx->state++; break; case 11: if (++sGfx->timer >= 30 && JOY_NEW(A_BUTTON)) { sGfx->timer = 0; PlaySE(SE_SELECT); sGfx->state++; } break; default: ClearWindowTilemap(sGfx->windowIds[0]); ClearWindowTilemap(sGfx->windowIds[1]); RemoveWindow(sGfx->windowIds[0]); RemoveWindow(sGfx->windowIds[1]); FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->finished = TRUE; break; } } static void Msg_WantToPlayAgain(void) { u8 y; switch (sGfx->state) { case 0: // Create windows sGfx->windowIds[WIN_PLAY_AGAIN] = AddWindow(&sWindowTemplates_PlayAgain[0]); sGfx->windowIds[WIN_YES_NO] = AddWindow(&sWindowTemplates_PlayAgain[1]); ClearWindowTilemap(sGfx->windowIds[WIN_PLAY_AGAIN]); ClearWindowTilemap(sGfx->windowIds[WIN_YES_NO]); DrawMessageWindow(&sWindowTemplates_PlayAgain[WIN_PLAY_AGAIN]); DrawYesNoMessageWindow(&sWindowTemplates_PlayAgain[WIN_YES_NO]); sGfx->state++; sGfx->cursorSelection = PLAY_AGAIN_NONE; sGfx->playAgainState = PLAY_AGAIN_NONE; break; case 1: // Print text FillWindowPixelBuffer(sGfx->windowIds[WIN_PLAY_AGAIN], PIXEL_FILL(1)); FillWindowPixelBuffer(sGfx->windowIds[WIN_YES_NO], PIXEL_FILL(1)); AddTextPrinterParameterized(sGfx->windowIds[WIN_PLAY_AGAIN], FONT_NORMAL, gText_WantToPlayAgain, 0, 6, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_Yes, 8, 2, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_No, 8, 16, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_SelectorArrow2, 0, 2, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sGfx->windowIds[WIN_PLAY_AGAIN], COPYWIN_GFX); CopyWindowToVram(sGfx->windowIds[WIN_YES_NO], COPYWIN_GFX); sGfx->state++; break; case 2: // Draw windows if (!IsDma3ManagerBusyWithBgCopy()) { PutWindowTilemap(sGfx->windowIds[WIN_PLAY_AGAIN]); PutWindowTilemap(sGfx->windowIds[WIN_YES_NO]); } CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->state++; break; case 3: // Handle input y = sGfx->cursorSelection; if (y == PLAY_AGAIN_NONE) y = PLAY_AGAIN_YES; FillWindowPixelBuffer(sGfx->windowIds[WIN_YES_NO], PIXEL_FILL(1)); AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_Yes, 8, 2, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_No, 8, 16, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_SelectorArrow2, 0, y == 1 ? 2 : 16, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sGfx->windowIds[WIN_YES_NO], COPYWIN_FULL); // Increment state only if A or B button have been pressed. if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); if (sGfx->cursorSelection == PLAY_AGAIN_NONE) sGfx->cursorSelection = PLAY_AGAIN_YES; sGfx->state++; } else if (JOY_NEW(DPAD_UP | DPAD_DOWN)) { PlaySE(SE_SELECT); switch (sGfx->cursorSelection) { case PLAY_AGAIN_NONE: sGfx->cursorSelection = PLAY_AGAIN_NO; break; case PLAY_AGAIN_YES: sGfx->cursorSelection = PLAY_AGAIN_NO; break; case PLAY_AGAIN_NO: sGfx->cursorSelection = PLAY_AGAIN_YES; break; } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); sGfx->cursorSelection = PLAY_AGAIN_NO; sGfx->state++; } break; default: sGfx->playAgainState = sGfx->cursorSelection; ClearWindowTilemap(sGfx->windowIds[WIN_PLAY_AGAIN]); ClearWindowTilemap(sGfx->windowIds[WIN_YES_NO]); RemoveWindow(sGfx->windowIds[WIN_PLAY_AGAIN]); RemoveWindow(sGfx->windowIds[WIN_YES_NO]); FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->finished = TRUE; break; } } static void Msg_SavingDontTurnOff(void) { switch (sGfx->state) { case 0: DrawDialogueFrame(0, FALSE); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_SavingDontTurnOffThePower2, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); sGfx->state++; break; case 1: CopyWindowToVram(0, COPYWIN_FULL); sGfx->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { CreateTask(Task_LinkFullSave, 0); sGfx->state++; } break; case 3: if (!FuncIsActiveTask(Task_LinkFullSave)) sGfx->state++; break; default: FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->finished = TRUE; break; } } static void Msg_CommunicationStandby(void) { switch (sGfx->state) { case 0: sGfx->windowIds[0] = AddWindow(&sWindowTemplate_CommStandby); ClearWindowTilemap(sGfx->windowIds[0]); DrawMessageWindow(&sWindowTemplate_CommStandby); sGfx->state++; break; case 1: FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); AddTextPrinterParameterized(sGfx->windowIds[0], FONT_NORMAL, gText_CommunicationStandby3, 0, 6, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX); sGfx->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) PutWindowTilemap(sGfx->windowIds[0]); CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->state++; break; default: sGfx->finished = TRUE; break; } } static void EraseMessage(void) { ClearWindowTilemap(sGfx->windowIds[0]); RemoveWindow(sGfx->windowIds[0]); FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->finished = TRUE; } static void Msg_SomeoneDroppedOut(void) { switch (sGfx->state) { case 0: sGfx->windowIds[0] = AddWindow(&sWindowTemplate_DroppedOut); ClearWindowTilemap(sGfx->windowIds[0]); DrawMessageWindow(&sWindowTemplate_DroppedOut); sGfx->state++; sGfx->timer = 0; sGfx->cursorSelection = 0; sGfx->playAgainState = PLAY_AGAIN_NONE; break; case 1: FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); AddTextPrinterParameterized(sGfx->windowIds[0], FONT_NORMAL, gText_SomeoneDroppedOut, 0, 6, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX); sGfx->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) PutWindowTilemap(sGfx->windowIds[0]); CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->state++; break; case 3: if (++sGfx->timer >= 120) sGfx->state++; break; default: sGfx->playAgainState = PLAY_AGAIN_DROPPED; ClearWindowTilemap(sGfx->windowIds[0]); RemoveWindow(sGfx->windowIds[0]); FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(BG_INTERFACE); sGfx->finished = TRUE; break; } } static void StopGfxFuncs(void) { DestroyTask(sGfx->taskId); sGfx->finished = TRUE; } static void GfxIdle(void) { } static void SetGfxFunc(void (*func)(void)) { sGfx->state = 0; sGfx->finished = FALSE; sGfx->func = func; } static void (*GetGfxFunc(void))(void) { return sGfx->func; } static bool32 IsGfxFuncActive(void) { if (sGfx->finished == TRUE) return FALSE; else return TRUE; } static u8 GetPlayAgainState(void) { return sGfx->playAgainState; } static void InitBgs(void) { DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000); DmaClear32(3,(void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); ChangeBgX(BG_INTERFACE, 0, BG_COORD_SET); ChangeBgY(BG_INTERFACE, 0, BG_COORD_SET); ChangeBgX(BG_TREE_LEFT, 0, BG_COORD_SET); ChangeBgY(BG_TREE_LEFT, 0, BG_COORD_SET); ChangeBgX(BG_TREE_RIGHT, 0, BG_COORD_SET); ChangeBgY(BG_TREE_RIGHT, 0, BG_COORD_SET); ChangeBgX(BG_SCENERY, 0, BG_COORD_SET); ChangeBgY(BG_SCENERY, 0, BG_COORD_SET); InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); SetBgTilemapBuffer(BG_SCENERY, sGfx->tilemapBuffers[0]); SetBgTilemapBuffer(BG_TREE_LEFT, sGfx->tilemapBuffers[1]); SetBgTilemapBuffer(BG_TREE_RIGHT, sGfx->tilemapBuffers[2]); } static bool32 LoadBgGfx(void) { switch (sGfx->loadState) { case 0: LoadPalette(sBg_Pal, BG_PLTT_ID(0), sizeof(sBg_Pal)); break; case 1: ResetTempTileDataBuffers(); break; case 2: DecompressAndCopyTileDataToVram(BG_SCENERY, sBg_Gfx, 0, 0, 0); break; case 3: DecompressAndCopyTileDataToVram(BG_TREE_LEFT, sTreeBorder_Gfx, 0, 0, 0); break; case 4: if (FreeTempTileDataBuffersIfPossible() == TRUE) return FALSE; break; case 5: LoadPalette(GetTextWindowPalette(3), BG_PLTT_ID(13), PLTT_SIZE_4BPP); break; default: sGfx->loadState = 0; return TRUE; } sGfx->loadState++; return FALSE; } ================================================ FILE: src/dodrio_berry_picking_comm.c ================================================ #include "global.h" #include "dodrio_berry_picking.h" #include "link.h" #include "link_rfu.h" enum { PACKET_READY_START = 1, PACKET_GAME_STATE, PACKET_PICK_STATE, PACKET_READY_END, }; struct ReadyToStartPacket { u8 id; bool8 ALIGNED(4) ready; }; struct GameStatePacket { u8 id; u8 fallDist_Col0:4; u8 fallDist_Col1:4; u16 fallDist_Col2:4; u16 fallDist_Col3:4; u16 fallDist_Col4:4; u16 fallDist_Col5:4; u16 fallDist_Col6:4; u16 fallDist_Col7:4; u16 fallDist_Col8:4; u16 fallDist_Col9:4; u16 berryId_Col0:2; u16 berryId_Col1:2; u16 berryId_Col2:2; u16 berryId_Col3:2; u16 berryId_Col4:2; u16 berryId_Col5:2; u16 berryId_Col6:2; u16 berryId_Col7:2; u8 berryId_Col8:2; u8 berryId_Col9:2; u8 pickState_Player1:2; u8 pickState_Player2:2; u8 pickState_Player3:2; u8 pickState_Player4:2; u8 pickState_Player5:2; bool8 ateBerry_Player1:1; bool8 ateBerry_Player2:1; bool8 ateBerry_Player3:1; bool8 ateBerry_Player4:1; bool8 ateBerry_Player5:1; u8 numGraySquares:5; bool8 allReadyToEnd:1; bool8 berriesFalling:1; bool8 missedBerry_Player1:1; bool8 missedBerry_Player2:1; bool8 missedBerry_Player3:1; bool8 missedBerry_Player4:1; bool8 missedBerry_Player5:1; }; struct PickStatePacket { u8 id; u8 ALIGNED(4) pickState; }; struct ReadyToEndPacket { u8 id; bool32 ready; }; void SendPacket_ReadyToStart(bool32 ready) { struct ReadyToStartPacket packet; packet.id = PACKET_READY_START; packet.ready = ready; Rfu_SendPacket(&packet); } bool8 RecvPacket_ReadyToStart(s32 playerId) { struct ReadyToStartPacket *packet; if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET) return FALSE; packet = (void *)&gRecvCmds[playerId][1]; if (packet->id == PACKET_READY_START) return packet->ready; return FALSE; } void SendPacket_GameState(struct DodrioGame_Player *player, struct DodrioGame_PlayerCommData *player1, struct DodrioGame_PlayerCommData *player2, struct DodrioGame_PlayerCommData *player3, struct DodrioGame_PlayerCommData *player4, struct DodrioGame_PlayerCommData *player5, u8 numGraySquares, bool32 berriesFalling, bool32 allReadyToEnd) { struct GameStatePacket packet; struct DodrioGame_Berries *berries = &player->berries; packet.id = PACKET_GAME_STATE; packet.fallDist_Col0 = berries->fallDist[0]; packet.fallDist_Col1 = berries->fallDist[1]; packet.fallDist_Col2 = berries->fallDist[2]; packet.fallDist_Col3 = berries->fallDist[3]; packet.fallDist_Col4 = berries->fallDist[4]; packet.fallDist_Col5 = berries->fallDist[5]; packet.fallDist_Col6 = berries->fallDist[6]; packet.fallDist_Col7 = berries->fallDist[7]; packet.fallDist_Col8 = berries->fallDist[8]; packet.fallDist_Col9 = berries->fallDist[9]; packet.berryId_Col0 = berries->ids[0]; packet.berryId_Col1 = berries->ids[1]; packet.berryId_Col2 = berries->ids[2]; packet.berryId_Col3 = berries->ids[3]; packet.berryId_Col4 = berries->ids[4]; packet.berryId_Col5 = berries->ids[5]; packet.berryId_Col6 = berries->ids[6]; packet.berryId_Col7 = berries->ids[7]; packet.berryId_Col8 = berries->ids[8]; packet.berryId_Col9 = berries->ids[9]; packet.pickState_Player1 = player1->pickState; packet.pickState_Player2 = player2->pickState; packet.pickState_Player3 = player3->pickState; packet.pickState_Player4 = player4->pickState; packet.pickState_Player5 = player5->pickState; packet.ateBerry_Player1 = player1->ateBerry; packet.ateBerry_Player2 = player2->ateBerry; packet.ateBerry_Player3 = player3->ateBerry; packet.ateBerry_Player4 = player4->ateBerry; packet.ateBerry_Player5 = player5->ateBerry; packet.missedBerry_Player1 = player1->missedBerry; packet.missedBerry_Player2 = player2->missedBerry; packet.missedBerry_Player3 = player3->missedBerry; packet.missedBerry_Player4 = player4->missedBerry; packet.missedBerry_Player5 = player5->missedBerry; packet.numGraySquares = numGraySquares; packet.berriesFalling = berriesFalling; packet.allReadyToEnd = allReadyToEnd; Rfu_SendPacket(&packet); } bool32 RecvPacket_GameState(u32 playerId, struct DodrioGame_Player *player, struct DodrioGame_PlayerCommData *player1, struct DodrioGame_PlayerCommData *player2, struct DodrioGame_PlayerCommData *player3, struct DodrioGame_PlayerCommData *player4, struct DodrioGame_PlayerCommData *player5, u8 *numGraySquares, bool32 *berriesFalling, bool32 *allReadyToEnd) { struct GameStatePacket *packet; struct DodrioGame_Berries *berries = &player->berries; if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET) return FALSE; packet = (void *)&gRecvCmds[0][1]; if (packet->id == PACKET_GAME_STATE) { berries->fallDist[0] = packet->fallDist_Col0; berries->fallDist[1] = packet->fallDist_Col1; berries->fallDist[2] = packet->fallDist_Col2; berries->fallDist[3] = packet->fallDist_Col3; berries->fallDist[4] = packet->fallDist_Col4; berries->fallDist[5] = packet->fallDist_Col5; berries->fallDist[6] = packet->fallDist_Col6; berries->fallDist[7] = packet->fallDist_Col7; berries->fallDist[8] = packet->fallDist_Col8; berries->fallDist[9] = packet->fallDist_Col9; berries->fallDist[10] = packet->fallDist_Col0; berries->ids[0] = packet->berryId_Col0; berries->ids[1] = packet->berryId_Col1; berries->ids[2] = packet->berryId_Col2; berries->ids[3] = packet->berryId_Col3; berries->ids[4] = packet->berryId_Col4; berries->ids[5] = packet->berryId_Col5; berries->ids[6] = packet->berryId_Col6; berries->ids[7] = packet->berryId_Col7; berries->ids[8] = packet->berryId_Col8; berries->ids[9] = packet->berryId_Col9; berries->ids[10] = packet->berryId_Col0; player1->pickState = packet->pickState_Player1; player1->ateBerry = packet->ateBerry_Player1; player1->missedBerry = packet->missedBerry_Player1; player2->pickState = packet->pickState_Player2; player2->ateBerry = packet->ateBerry_Player2; player2->missedBerry = packet->missedBerry_Player2; player3->pickState = packet->pickState_Player3; player3->ateBerry = packet->ateBerry_Player3; player3->missedBerry = packet->missedBerry_Player3; player4->pickState = packet->pickState_Player4; player4->ateBerry = packet->ateBerry_Player4; player4->missedBerry = packet->missedBerry_Player4; player5->pickState = packet->pickState_Player5; player5->ateBerry = packet->ateBerry_Player5; player5->missedBerry = packet->missedBerry_Player5; *numGraySquares = packet->numGraySquares; *berriesFalling = packet->berriesFalling; *allReadyToEnd = packet->allReadyToEnd; return TRUE; } return FALSE; } void SendPacket_PickState(u8 pickState) { struct PickStatePacket packet; packet.id = PACKET_PICK_STATE; packet.pickState = pickState; Rfu_SendPacket(&packet); } bool32 RecvPacket_PickState(u32 playerId, u8 *pickState) { struct PickStatePacket * packet; if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET) return FALSE; packet = (void *)&gRecvCmds[playerId][1]; if (packet->id == PACKET_PICK_STATE) { *pickState = packet->pickState; return TRUE; } return FALSE; } void SendPacket_ReadyToEnd(bool32 ready) { struct ReadyToEndPacket packet; packet.id = PACKET_READY_END; packet.ready = ready; Rfu_SendPacket(&packet); } bool32 RecvPacket_ReadyToEnd(u32 playerId) { struct ReadyToEndPacket * packet; if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET) return FALSE; packet = (void *)&gRecvCmds[playerId][1]; if (packet->id == PACKET_READY_END) return packet->ready; return FALSE; } ================================================ FILE: src/dynamic_placeholder_text_util.c ================================================ #include "global.h" #include "gflib.h" #include "constants/event_objects.h" static EWRAM_DATA const u8 *sStringPointers[8] = {0}; #define COLORS(a, b)((a) | (b << 4)) static const u8 sTextColorTable[] = { // [LOW_NYBBLE / 2] = 0xXY, // HIGH_NYBBLE [OBJ_EVENT_GFX_RED_NORMAL / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_RED_BIKE [OBJ_EVENT_GFX_RED_SURF / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_RED_FIELD_MOVE [OBJ_EVENT_GFX_RED_FISH / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_RED_VS_SEEKER [OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_NORMAL [OBJ_EVENT_GFX_GREEN_BIKE / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_SURF [OBJ_EVENT_GFX_GREEN_FIELD_MOVE / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_FISH [OBJ_EVENT_GFX_GREEN_VS_SEEKER / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE [OBJ_EVENT_GFX_RS_BRENDAN / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_RS_MAY [OBJ_EVENT_GFX_LITTLE_BOY / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_LITTLE_GIRL [OBJ_EVENT_GFX_YOUNGSTER / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BOY [OBJ_EVENT_GFX_BUG_CATCHER / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SITTING_BOY [OBJ_EVENT_GFX_LASS / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_WOMAN_1 [OBJ_EVENT_GFX_BATTLE_GIRL / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MAN [OBJ_EVENT_GFX_ROCKER / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_FAT_MAN [OBJ_EVENT_GFX_WOMAN_2 / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_BEAUTY [OBJ_EVENT_GFX_BALDING_MAN / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_WOMAN_3 [OBJ_EVENT_GFX_OLD_MAN_1 / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_OLD_MAN_2 [OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_OLD_WOMAN [OBJ_EVENT_GFX_TUBER_M_WATER / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_TUBER_F [OBJ_EVENT_GFX_TUBER_M_LAND / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_CAMPER [OBJ_EVENT_GFX_PICNICKER / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_COOLTRAINER_M [OBJ_EVENT_GFX_COOLTRAINER_F / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SWIMMER_M_WATER [OBJ_EVENT_GFX_SWIMMER_F_WATER / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SWIMMER_M_LAND [OBJ_EVENT_GFX_SWIMMER_F_LAND / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_WORKER_M [OBJ_EVENT_GFX_WORKER_F / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_ROCKET_M [OBJ_EVENT_GFX_ROCKET_F / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_GBA_KID [OBJ_EVENT_GFX_SUPER_NERD / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BIKER [OBJ_EVENT_GFX_BLACKBELT / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SCIENTIST [OBJ_EVENT_GFX_HIKER / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_FISHER [OBJ_EVENT_GFX_CHANNELER / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_CHEF [OBJ_EVENT_GFX_POLICEMAN / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_GENTLEMAN [OBJ_EVENT_GFX_SAILOR / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_CAPTAIN [OBJ_EVENT_GFX_NURSE / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST [OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_UNUSED_MALE_RECEPTIONIST [OBJ_EVENT_GFX_CLERK / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MG_DELIVERYMAN [OBJ_EVENT_GFX_TRAINER_TOWER_DUDE / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_PROF_OAK [OBJ_EVENT_GFX_BLUE / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BILL [OBJ_EVENT_GFX_LANCE / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_AGATHA [OBJ_EVENT_GFX_DAISY / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_LORELEI [OBJ_EVENT_GFX_MR_FUJI / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BRUNO [OBJ_EVENT_GFX_BROCK / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_MISTY [OBJ_EVENT_GFX_LT_SURGE / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_ERIKA [OBJ_EVENT_GFX_KOGA / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_SABRINA [OBJ_EVENT_GFX_BLAINE / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_GIOVANNI [OBJ_EVENT_GFX_MOM / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_CELIO [OBJ_EVENT_GFX_TEACHY_TV_HOST / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_GYM_GUY [OBJ_EVENT_GFX_ITEM_BALL / 2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_TOWN_MAP [OBJ_EVENT_GFX_POKEDEX / 2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_CUT_TREE [OBJ_EVENT_GFX_ROCK_SMASH_ROCK / 2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_PUSHABLE_BOULDER [OBJ_EVENT_GFX_FOSSIL / 2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_RUBY [OBJ_EVENT_GFX_SAPPHIRE / 2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_OLD_AMBER [OBJ_EVENT_GFX_GYM_SIGN / 2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_SIGN [OBJ_EVENT_GFX_TRAINER_TIPS / 2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_CLIPBOARD [OBJ_EVENT_GFX_METEORITE / 2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_LAPRAS_DOLL [OBJ_EVENT_GFX_SEAGALLOP / 2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_SNORLAX [OBJ_EVENT_GFX_SPEAROW / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_CUBONE [OBJ_EVENT_GFX_POLIWRATH / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_CLEFAIRY [OBJ_EVENT_GFX_PIDGEOT / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_JIGGLYPUFF [OBJ_EVENT_GFX_PIDGEY / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_CHANSEY [OBJ_EVENT_GFX_OMANYTE / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_KANGASKHAN [OBJ_EVENT_GFX_PIKACHU / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_PSYDUCK [OBJ_EVENT_GFX_NIDORAN_F / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_NIDORAN_M [OBJ_EVENT_GFX_NIDORINO / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_MEOWTH [OBJ_EVENT_GFX_SEEL / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_VOLTORB [OBJ_EVENT_GFX_SLOWPOKE / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_SLOWBRO [OBJ_EVENT_GFX_MACHOP / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_WIGGLYTUFF [OBJ_EVENT_GFX_DODUO / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_FEAROW [OBJ_EVENT_GFX_MACHOKE / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_LAPRAS [OBJ_EVENT_GFX_ZAPDOS / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_MOLTRES [OBJ_EVENT_GFX_ARTICUNO / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_MEWTWO [OBJ_EVENT_GFX_MEW / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_ENTEI [OBJ_EVENT_GFX_SUICUNE / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_RAIKOU [OBJ_EVENT_GFX_LUGIA / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_HO_OH [OBJ_EVENT_GFX_CELEBI / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_KABUTO [OBJ_EVENT_GFX_DEOXYS_D / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_DEOXYS_A [OBJ_EVENT_GFX_DEOXYS_N / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_SS_ANNE [OBJ_EVENT_GFX_CUE_BALL / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_PAINTER [OBJ_EVENT_GFX_BIRD_KEEPER / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BURGLAR [OBJ_EVENT_GFX_POKEMON_RANGER_F / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_POKEMON_RANGER_M [OBJ_EVENT_GFX_RUIN_MANIAC / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_POKE_MANIAC [OBJ_EVENT_GFX_PSYCHIC_M / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_PSYCHIC_F [OBJ_EVENT_GFX_AROMA_LADY / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_TWIN [OBJ_EVENT_GFX_YOUNG_COUPLE_M / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_YOUNG_COUPLE_F [OBJ_EVENT_GFX_ENGINEER / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_JUGGLER [OBJ_EVENT_GFX_TAMER / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_POKEMON_BREEDER [OBJ_EVENT_GFX_RED_UNDERWATER / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_UNDERWATER [OBJ_EVENT_GFX_SCOTT / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_BULBASAUR [OBJ_EVENT_GFX_CHARMANDER / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_SQUIRTLE [OBJ_EVENT_GFX_LATIAS / 2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_LATIOS [OBJ_EVENT_GFX_EM_BRENDAN /2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVEN_GFX_EM_MAY [OBJ_EVENT_GFX_CABLE_CAR /2] = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_MON), // OBJ_EVEN_GFX_SUDOWOODO [OBJ_EVENT_GFX_ABRA /2] = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_SWIMMER_F_WATER_2 [OBJ_EVENT_GFX_MASTER_BEAUTY / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_BIRD_KEEPER [OBJ_EVENT_GFX_MASTER_BLACK_BELT / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_BUG_CATCHER [OBJ_EVENT_GFX_MASTER_COOLTRAINER_M / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_HIKER [OBJ_EVENT_GFX_MASTER_LASS / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_PSYCHIC_M [OBJ_EVENT_GFX_MASTER_SCIENTIST / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_YOUNGSTER [OBJ_EVENT_GFX_LADY / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_ROCKER_2 [OBJ_EVENT_GFX_ANABEL / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_TUCKER [OBJ_EVENT_GFX_GRETA / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SPENSER [OBJ_EVENT_GFX_NOLAND / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_LUCY [OBJ_EVENT_GFX_BRANDON / 2] = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_ }; void DynamicPlaceholderTextUtil_Reset(void) { const u8 **ptr = sStringPointers; u8 *fillval = NULL; const u8 **ptr2 = ptr + (NELEMS(sStringPointers) - 1); do { *ptr2-- = fillval; } while ((intptr_t)ptr2 >= (intptr_t)ptr); } void DynamicPlaceholderTextUtil_SetPlaceholderPtr(u8 idx, const u8 *ptr) { if (idx < NELEMS(sStringPointers)) sStringPointers[idx] = ptr; } u8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src) { while (*src != EOS) { if (*src != CHAR_DYNAMIC) { *dest++ = *src++; } else { src++; if (sStringPointers[*src] != NULL) dest = StringCopy(dest, sStringPointers[*src]); src++; } } *dest = EOS; return dest; } const u8 *DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 idx) { return sStringPointers[idx]; } u8 GetColorFromTextColorTable(u16 graphicId) { u32 test = graphicId >> 1; u32 shift = (graphicId & 1) << 2; if (test >= NELEMS(sTextColorTable)) return 3; else return (sTextColorTable[graphicId >> 1] >> shift) & 0xF; } ================================================ FILE: src/easy_chat.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "easy_chat.h" #include "event_data.h" #include "field_message_box.h" #include "mystery_gift.h" #include "menu.h" #include "mail.h" #include "pokedex.h" #include "random.h" #include "strings.h" #include "constants/easy_chat.h" struct Unk203A120 { u16 numGroups; u16 groups[EC_NUM_GROUPS]; u16 alphabeticalGroups[27]; u16 alphabeticalWordsByGroup[27][270]; u8 filler3958[0x2C]; u16 allWords[270]; u16 totalWords; }; /*size = 0x3BA4*/ static EWRAM_DATA struct Unk203A120 * sEasyChatSelectionData = NULL; static bool8 EC_IsNationalPokedexEnabled(void); static u16 GetRandomECPokemon(void); static void PopulateECGroups(void); static void PopulateAlphabeticalGroups(void); static u16 GetUnlockedWordsInECGroup(u16); static u16 GetUnlockedWordsInAlphabeticalGroup(u16); static bool8 UnlockedECMonOrMove(u16, u8); static bool32 EC_IsDeoxys(u16 species); static bool8 IsWordUnlocked(u16 word); #include "data/easy_chat/easy_chat_groups.h" #include "data/easy_chat/easy_chat_words_by_letter.h" static const u8 *const sEasyChatGroupNamePointers[] = { [EC_GROUP_POKEMON] = gEasyChatGroupName_Pokemon, [EC_GROUP_TRAINER] = gEasyChatGroupName_Trainer, [EC_GROUP_STATUS] = gEasyChatGroupName_Status, [EC_GROUP_BATTLE] = gEasyChatGroupName_Battle, [EC_GROUP_GREETINGS] = gEasyChatGroupName_Greetings, [EC_GROUP_PEOPLE] = gEasyChatGroupName_People, [EC_GROUP_VOICES] = gEasyChatGroupName_Voices, [EC_GROUP_SPEECH] = gEasyChatGroupName_Speech, [EC_GROUP_ENDINGS] = gEasyChatGroupName_Endings, [EC_GROUP_FEELINGS] = gEasyChatGroupName_Feelings, [EC_GROUP_CONDITIONS] = gEasyChatGroupName_Conditions, [EC_GROUP_ACTIONS] = gEasyChatGroupName_Actions, [EC_GROUP_LIFESTYLE] = gEasyChatGroupName_Lifestyle, [EC_GROUP_HOBBIES] = gEasyChatGroupName_Hobbies, [EC_GROUP_TIME] = gEasyChatGroupName_Time, [EC_GROUP_MISC] = gEasyChatGroupName_Misc, [EC_GROUP_ADJECTIVES] = gEasyChatGroupName_Adjectives, [EC_GROUP_EVENTS] = gEasyChatGroupName_Events, [EC_GROUP_MOVE_1] = gEasyChatGroupName_Move1, [EC_GROUP_MOVE_2] = gEasyChatGroupName_Move2, [EC_GROUP_TRENDY_SAYING] = gEasyChatGroupName_TrendySaying, [EC_GROUP_POKEMON_2] = gEasyChatGroupName_Pokemon2, }; static const u16 sDefaultProfileWords[] = { EC_WORD_I_AM, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_FRIEND, }; static const u16 sDefaultBattleStartWords[] = { EC_WORD_ARE, EC_WORD_YOU, EC_WORD_READY, EC_WORD_QUES, EC_WORD_HERE_I_COME, EC_WORD_EXCL, }; static const u16 sDeoxysValue[] = { SPECIES_DEOXYS, }; static bool8 IsECGroupUnlocked(u8 groupId) { switch (groupId) { case EC_GROUP_TRENDY_SAYING: return FALSE; case EC_GROUP_EVENTS: case EC_GROUP_MOVE_1: case EC_GROUP_MOVE_2: return FlagGet(FLAG_SYS_GAME_CLEAR); case EC_GROUP_POKEMON: return EC_IsNationalPokedexEnabled(); default: return TRUE; } } static u16 EasyChat_GetNumWordsInGroup(u8 groupId) { if (groupId == EC_GROUP_POKEMON) return GetNationalPokedexCount(FLAG_GET_SEEN); if (IsECGroupUnlocked(groupId)) return sEasyChatGroups[groupId].numEnabledWords; return 0; } static bool8 IsECWordInvalid(u16 easyChatWord) { u32 i; u8 groupId; u32 index; u16 numWords; const u16 *list; if (easyChatWord == EC_WORD_UNDEFINED) return FALSE; groupId = EC_GROUP(easyChatWord); index = EC_INDEX(easyChatWord); if (groupId >= EC_NUM_GROUPS) return TRUE; numWords = sEasyChatGroups[groupId].numWords; switch (groupId) { case EC_GROUP_POKEMON: case EC_GROUP_POKEMON_2: case EC_GROUP_MOVE_1: case EC_GROUP_MOVE_2: list = sEasyChatGroups[groupId].wordData.valueList; for (i = 0; i < numWords; i++) { if (index == list[i]) return FALSE; } return TRUE; default: if (index >= numWords) return TRUE; else return FALSE; } } static const u8 *GetEasyChatWord(u8 groupId, u16 index) { switch (groupId) { case EC_GROUP_POKEMON: case EC_GROUP_POKEMON_2: return gSpeciesNames[index]; case EC_GROUP_MOVE_1: case EC_GROUP_MOVE_2: return gMoveNames[index]; default: return sEasyChatGroups[groupId].wordData.words[index].text; } } u8 *CopyEasyChatWord(u8 *dest, u16 easyChatWord) { u8 *resultStr; if (IsECWordInvalid(easyChatWord)) { resultStr = StringCopy(dest, gText_ThreeQuestionMarks); } else if (easyChatWord != EC_WORD_UNDEFINED) { u16 index = EC_INDEX(easyChatWord); u8 groupId = EC_GROUP(easyChatWord); resultStr = StringCopy(dest, GetEasyChatWord(groupId, index)); } else { *dest = EOS; resultStr = dest; } return resultStr; } u8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows) { u16 i, j; u16 numColumns = columns - 1; for (i = 0; i < rows; i++) { for (j = 0; j < numColumns; j++) { dest = CopyEasyChatWord(dest, *src); if (*src != EC_WORD_UNDEFINED) { *dest = CHAR_SPACE; dest++; } src++; } dest = CopyEasyChatWord(dest, *(src++)); *dest = CHAR_NEWLINE; dest++; } dest--; *dest = EOS; return dest; } static u16 GetEasyChatWordStringLength(u16 easyChatWord) { if (easyChatWord == EC_WORD_UNDEFINED) return 0; if (IsECWordInvalid(easyChatWord)) { return StringLength(gText_ThreeQuestionMarks); } else { u16 index = EC_INDEX(easyChatWord); u8 groupId = EC_GROUP(easyChatWord); return StringLength(GetEasyChatWord(groupId, index)); } } bool8 EC_DoesEasyChatStringFitOnLine(const u16 *easyChatWords, u8 columns, u8 rows, u16 maxLength) { u8 i, j; for (i = 0; i < rows; i++) { u16 totalLength = columns - 1; for (j = 0; j < columns; j++) totalLength += GetEasyChatWordStringLength(*(easyChatWords++)); if (totalLength > maxLength) return TRUE; } return FALSE; } static u16 GetRandomWordFromGroup(u16 groupId) { u16 index = Random() % sEasyChatGroups[groupId].numWords; if (groupId == EC_GROUP_POKEMON_2 || groupId == EC_GROUP_POKEMON || groupId == EC_GROUP_MOVE_1 || groupId == EC_GROUP_MOVE_2) { index = sEasyChatGroups[groupId].wordData.valueList[index]; } return EC_WORD(groupId, index); } static u16 GetRandomWordFromAnyGroup(u16 groupId) { if (!IsECGroupUnlocked(groupId)) return EC_WORD_UNDEFINED; if (groupId == EC_GROUP_POKEMON) return GetRandomECPokemon(); return GetRandomWordFromGroup(groupId); } void ShowEasyChatMessage(void) { u16 *easyChatWords; int columns, rows; switch (gSpecialVar_0x8004) { case 0: easyChatWords = gSaveBlock1Ptr->easyChatProfile; columns = 2; rows = 2; break; case 1: easyChatWords = gSaveBlock1Ptr->easyChatBattleStart; if (EC_DoesEasyChatStringFitOnLine(gSaveBlock1Ptr->easyChatBattleStart, 3, 2, 18)) { columns = 2; rows = 3; } else { columns = 3; rows = 2; } break; case 2: easyChatWords = gSaveBlock1Ptr->easyChatBattleWon; columns = 3; rows = 2; break; case 3: easyChatWords = gSaveBlock1Ptr->easyChatBattleLost; columns = 3; rows = 2; break; default: return; } ConvertEasyChatWordsToString(gStringVar4, easyChatWords, columns, rows); ShowFieldAutoScrollMessage(gStringVar4); } void BufferRandomHobbyOrLifestyleString(void) { int groupId = Random() & 1 ? EC_GROUP_HOBBIES : EC_GROUP_LIFESTYLE; u16 easyChatWord = GetRandomWordFromAnyGroup(groupId); CopyEasyChatWord(gStringVar2, easyChatWord); } static bool8 IsTrendySayingUnlocked(u8 additionalPhraseId) { int byteOffset = additionalPhraseId / 8; int shift = additionalPhraseId % 8; return (gSaveBlock1Ptr->additionalPhrases[byteOffset] >> shift) & 1; } void EnableRareWord(u8 additionalPhraseId) { if (additionalPhraseId < 33) { int byteOffset = additionalPhraseId / 8; int shift = additionalPhraseId % 8; gSaveBlock1Ptr->additionalPhrases[byteOffset] |= 1 << shift; } } static u8 GetNumUnlockedTrendySayings(void) { u32 i; u8 numAdditionalPhrasesUnlocked; for (i = 0, numAdditionalPhrasesUnlocked = 0; i < 33; i++) { if (IsTrendySayingUnlocked(i)) numAdditionalPhrasesUnlocked++; } return numAdditionalPhrasesUnlocked; } static u16 UnlockRandomTrendySaying(void) { u32 i; u16 additionalPhraseId; u8 numAdditionalPhrasesUnlocked = GetNumUnlockedTrendySayings(); if (numAdditionalPhrasesUnlocked == 33) return EC_WORD_UNDEFINED; additionalPhraseId = Random() % (33 - numAdditionalPhrasesUnlocked); for (i = 0; i < 33; i++) { if (!IsTrendySayingUnlocked(i)) { if (additionalPhraseId) { additionalPhraseId--; } else { EnableRareWord(i); return EC_WORD(EC_GROUP_TRENDY_SAYING, i); } } } return EC_WORD_UNDEFINED; } static u16 GetRandomUnlockedTrendySaying(void) { u32 i; u16 additionalPhraseId = GetNumUnlockedTrendySayings(); if (additionalPhraseId == 0) return EC_WORD_UNDEFINED; additionalPhraseId = Random() % additionalPhraseId; for (i = 0; i < 33; i++) { if (IsTrendySayingUnlocked(i)) { if (additionalPhraseId) additionalPhraseId--; else return EC_WORD(EC_GROUP_TRENDY_SAYING, i); } } return EC_WORD_UNDEFINED; } static bool8 EC_IsNationalPokedexEnabled(void) { return IsNationalPokedexEnabled(); } static u16 GetRandomECPokemon(void) { u32 i; u16 numWords; const u16 *species; u16 index = EasyChat_GetNumWordsInGroup(EC_GROUP_POKEMON_2); if (index == 0) return EC_WORD_UNDEFINED; index = Random() % index; species = sEasyChatGroups[EC_GROUP_POKEMON_2].wordData.valueList; numWords = sEasyChatGroups[EC_GROUP_POKEMON_2].numWords; for (i = 0; i < numWords; i++) { u16 dexNum = SpeciesToNationalPokedexNum(*species); if (GetSetPokedexFlag(dexNum, FLAG_GET_SEEN)) { if (index) index--; else return EC_WORD(EC_GROUP_POKEMON_2, *species); } species++; } return EC_WORD_UNDEFINED; } void InitEasyChatPhrases(void) { u16 i, j; for (i = 0; i < 4; i++) gSaveBlock1Ptr->easyChatProfile[i] = sDefaultProfileWords[i]; for (i = 0; i < 6; i++) gSaveBlock1Ptr->easyChatBattleStart[i] = sDefaultBattleStartWords[i]; for (i = 0; i < 6; i++) { gSaveBlock1Ptr->easyChatBattleWon[i] = EC_WORD_UNDEFINED; gSaveBlock1Ptr->easyChatBattleLost[i] = EC_WORD_UNDEFINED; } for (i = 0; i < MAIL_COUNT; i++) { for (j = 0; j < MAIL_WORDS_COUNT; j++) gSaveBlock1Ptr->mail[i].words[j] = EC_WORD_UNDEFINED; } #ifndef UBFIX // BUG: This is supposed to clear 64 bits, but this loop is clearing 64 bytes. // However, this bug has no resulting effect on gameplay because only the // Mauville old man data is corrupted, which is initialized directly after // this function is called when starting a new game. for (i = 0; i < 64; i++) gSaveBlock1Ptr->additionalPhrases[i] = 0; #else for (i = 0; i < NELEMS(gSaveBlock1Ptr->additionalPhrases); i++) gSaveBlock1Ptr->additionalPhrases[i] = 0; #endif } void InitQuestionnaireWords(void) { s32 i; u16 *ptr = GetQuestionnaireWordsPtr(); for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) ptr[i] = EC_WORD_UNDEFINED; } bool8 InitEasyChatSelection(void) { sEasyChatSelectionData = Alloc(sizeof(*sEasyChatSelectionData)); if (sEasyChatSelectionData == NULL) return FALSE; PopulateECGroups(); PopulateAlphabeticalGroups(); return TRUE; } void DestroyEasyChatSelectionData(void) { if (sEasyChatSelectionData != NULL) Free(sEasyChatSelectionData); } static void PopulateECGroups(void) { int i; sEasyChatSelectionData->numGroups = 0; if (GetNationalPokedexCount(FLAG_GET_SEEN)) sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_POKEMON; for (i = EC_GROUP_TRAINER; i <= EC_GROUP_ADJECTIVES; i++) sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = i; if (FlagGet(FLAG_SYS_GAME_CLEAR)) { sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_EVENTS; sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_MOVE_1; sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_MOVE_2; } if (IsNationalPokedexEnabled()) sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_POKEMON_2; } u8 GetNumDisplayableGroups(void) { return sEasyChatSelectionData->numGroups; } u8 GetSelectedGroupByIndex(u8 index) { if (index >= sEasyChatSelectionData->numGroups) return EC_NUM_GROUPS; else return sEasyChatSelectionData->groups[index]; } // Unused static u8 *BufferEasyChatWordGroupName(u8 *dest, u8 groupId, u16 totalChars) { u32 i; u8 *str = StringCopy(dest, sEasyChatGroupNamePointers[groupId]); for (i = str - dest; i < totalChars; i++) { *str = CHAR_SPACE; str++; } *str = EOS; return str; } const u8 *GetEasyChatWordGroupName(u8 groupId) { return sEasyChatGroupNamePointers[groupId]; } u8 *CopyEasyChatWordPadded(u8 *dest, u16 easyChatWord, u16 totalChars) { u32 i; u8 *str = CopyEasyChatWord(dest, easyChatWord); for (i = str - dest; i < totalChars; i++) { *str = CHAR_SPACE; str++; } *str = EOS; return str; } static void PopulateAlphabeticalGroups(void) { static int i; static int j; static int k; static int index; static int numWords; static int numToProcess; static const u16 *words; for (i = 0; i < 27; i++) { numWords = sEasyChatWordsByLetterPointers[i].numWords; words = sEasyChatWordsByLetterPointers[i].words; sEasyChatSelectionData->alphabeticalGroups[i] = 0; index = 0; for (j = 0; j < numWords; ) { if (*words == EC_WORD_UNDEFINED) { words++; numToProcess = *words++; j += 2; } else { numToProcess = 1; } for (k = 0; k < numToProcess; k++) { if (IsWordUnlocked(words[k])) { sEasyChatSelectionData->alphabeticalWordsByGroup[i][index++] = words[k]; sEasyChatSelectionData->alphabeticalGroups[i]++; break; } } words += numToProcess; j += numToProcess; } } } void GetUnlockedECWords(bool32 isAlphabetical, u16 groupId) { if (!isAlphabetical) sEasyChatSelectionData->totalWords = GetUnlockedWordsInECGroup(groupId); else sEasyChatSelectionData->totalWords = GetUnlockedWordsInAlphabeticalGroup(groupId); } u16 GetDisplayedWordByIndex(u16 index) { if (index >= sEasyChatSelectionData->totalWords) return EC_WORD_UNDEFINED; else return sEasyChatSelectionData->allWords[index]; } u16 GetNumDisplayedWords(void) { return sEasyChatSelectionData->totalWords; } static u16 GetUnlockedWordsInECGroup(u16 groupId) { u32 i; u16 totalWords; const u16 *list; const struct EasyChatWordInfo * wordInfo; u16 numWords = sEasyChatGroups[groupId].numWords; if (groupId == EC_GROUP_POKEMON_2 || groupId == EC_GROUP_POKEMON || groupId == EC_GROUP_MOVE_1 || groupId == EC_GROUP_MOVE_2) { list = sEasyChatGroups[groupId].wordData.valueList; for (i = 0, totalWords = 0; i < numWords; i++) { if (UnlockedECMonOrMove(list[i], groupId)) sEasyChatSelectionData->allWords[totalWords++] = EC_WORD(groupId, list[i]); } return totalWords; } else { wordInfo = sEasyChatGroups[groupId].wordData.words; for (i = 0, totalWords = 0; i < numWords; i++) { u16 alphabeticalOrder = wordInfo[i].alphabeticalOrder; if (UnlockedECMonOrMove(alphabeticalOrder, groupId)) sEasyChatSelectionData->allWords[totalWords++] = EC_WORD(groupId, alphabeticalOrder); } return totalWords; } } static u16 GetUnlockedWordsInAlphabeticalGroup(u16 alphabeticalGroup) { u32 i; u16 totalWords; for (i = 0, totalWords = 0; i < sEasyChatSelectionData->alphabeticalGroups[alphabeticalGroup]; i++) sEasyChatSelectionData->allWords[totalWords++] = sEasyChatSelectionData->alphabeticalWordsByGroup[alphabeticalGroup][i]; return totalWords; } static bool8 IsGroupSelectable(u8 groupIdx) { int i; for (i = 0; i < sEasyChatSelectionData->numGroups; i++) { if (sEasyChatSelectionData->groups[i] == groupIdx) return TRUE; } return FALSE; } static bool8 UnlockedECMonOrMove(u16 wordIndex, u8 groupId) { switch (groupId) { case EC_GROUP_POKEMON: return GetSetPokedexFlag(SpeciesToNationalPokedexNum(wordIndex), FLAG_GET_SEEN); case EC_GROUP_POKEMON_2: if (EC_IsDeoxys(wordIndex)) return GetSetPokedexFlag(SpeciesToNationalPokedexNum(wordIndex), FLAG_GET_SEEN); return TRUE; case EC_GROUP_MOVE_1: case EC_GROUP_MOVE_2: return TRUE; default: return sEasyChatGroups[groupId].wordData.words[wordIndex].enabled; } } static bool32 EC_IsDeoxys(u16 species) { u32 i; for (i = 0; i < NELEMS(sDeoxysValue); i++) { if (sDeoxysValue[i] == species) return TRUE; } return FALSE; } static bool8 IsWordUnlocked(u16 easyChatWord) { u8 groupId = EC_GROUP(easyChatWord); u32 index = EC_INDEX(easyChatWord); if (!IsGroupSelectable(groupId)) return FALSE; else return UnlockedECMonOrMove(index, groupId); } ================================================ FILE: src/easy_chat_2.c ================================================ #include "global.h" #include "gflib.h" #include "easy_chat.h" #include "event_data.h" #include "menu.h" #include "mystery_gift.h" #include "overworld.h" #include "strings.h" #include "task.h" #include "constants/songs.h" #define EZCHAT_TASK_STATE 0 #define EZCHAT_TASK_TYPE 1 #define EZCHAT_TASK_WORDS 2 #define EZCHAT_TASK_MAINCALLBACK 4 #define EZCHAT_TASK_UNK06 6 #define EZCHAT_TASK_SIZE 7 struct EasyChatScreenTemplate { u8 type; u8 numColumns; u8 numRows; u8 frameId; const u8 *titleText; const u8 *instructionsText1; const u8 *instructionsText2; const u8 *confirmText1; const u8 *confirmText2; }; struct EasyChatScreen { /*0x00*/ u8 type; /*0x01*/ u8 templateId; /*0x02*/ u8 numColumns; /*0x03*/ u8 numRows; /*0x04*/ u8 state; /*0x05*/ s8 mainCursorColumn; /*0x06*/ s8 mainCursorRow; /*0x07*/ u8 numWords; /*0x08*/ u8 stateBackup; /*0x09*/ bool8 isAlphaMode; /*0x0A*/ s8 selectGroupCursorX; /*0x0B*/ s8 selectGroupCursorY; /*0x0C*/ u8 selectGroupRowsAbove; /*0x0D*/ u8 selectGroupNumRows; /*0x0E*/ u8 selectWordRowsAbove; /*0x0F*/ u8 selectWordNumRows; /*0x10*/ s8 selectWordCursorX; /*0x11*/ s8 selectWordCursorY; /*0x14*/ u16 *words; /*0x18*/ u16 ecWordBuffer[9]; }; static EWRAM_DATA struct EasyChatScreen * sEasyChatScreen = NULL; static void CB2_EasyChatScreen(void); static void Task_InitEasyChat(u8 taskId); static void Task_RunEasyChat(u8 taskId); static bool8 Task_InitEasyChatInternal(u8 taskId); static void DismantleEasyChat(MainCallback cb); static void CompareProfileResponseWithPassphrase(void); static void CompareQuestionnaireResponseWithPassphrase(void); static bool8 EasyChat_AllocateResources(u8 type, u16 *words); static void EasyChat_FreeResources(void); static u16 EasyChatScreen_HandleJoypad(void); static u16 HandleJoypad_SelectField(void); static u16 HandleJoypad_SelectFooter(void); static u16 HandleJoypad_SelectGroup(void); static u16 HandleJoypad_SelectWord(void); static u16 Cancel_HandleYesNoMenu(void); static u16 Confirm_HandleYesNoMenu(void); static u16 DelAll_HandleYesNoMenu(void); static u16 Cancel_CreateYesNoMenu(void); static u16 DelAll_CreateYesNoMenu(void); static u16 Confirm_CreateYesNoMenu(void); static u8 GetStateBackup(void); static int OpenSelectedGroup(void); static int BackOutFromGroupToFieldSelect(void); static int ToggleGroupAlphaMode(void); static int DeleteSelectedWord(void); static int PlaceSelectedWord(void); static void CommitECWords(void); static void DeleteAllECFields(void); static void SetEasyChatWordToField(u16 word); static bool8 HasECMessageChanged(void); static u16 SelectGroupCursorAction(u32 action); static int UpdateSelectGroupCursorPos_OutsideBlueBox_GroupMode(u32 action); static int UpdateSelectGroupCursorPos_OutsideBlueBox_AlphaMode(u32 action); static int UpdateSelectGroupCursorPos_InsideBlueBox(u32 action); static void GroupCursorMoveToBlueBox(void); static void GroupCursorWrapAroundLeft(void); static u16 SelectWordCursorAction(u32 action); static u16 GetSelectedFieldIndex(void); static u16 GetSelectedGroupIndex(void); static int GetSelectedLetter(void); static u16 GetSelectWordCursorPos(void); static u8 GetMaxGroupCursorXinAlphaMode(u8 unkB); static void MoveGroupCursorXToMaxCol(void); static void MoveWordCursorXToMaxCol(void); static bool8 GroupSelectCursorXPosTooFarRight(void); static bool8 WordSelectCursorXPosTooFarRight(void); static bool8 IsPhraseDifferentThanPlayerInput(const u16 *wordsToCompare, u8 numWords); static u8 GetEasyChatScreenTemplateId(u8 type); static bool32 IsEcWordBufferUninitialized(void); void DoEasyChatScreen(u8 type, u16 *words, MainCallback callback) { u8 taskId; ResetTasks(); taskId = CreateTask(Task_InitEasyChat, 0); gTasks[taskId].data[EZCHAT_TASK_TYPE] = type; SetWordTaskArg(taskId, EZCHAT_TASK_WORDS, (uintptr_t)words); SetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK, (uintptr_t)callback); SetMainCallback2(CB2_EasyChatScreen); } static void CB2_EasyChatScreen(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCallback_EasyChatScreen(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); } static void SetEasyChatTaskFunc(u8 taskId, TaskFunc func) { gTasks[taskId].func = func; gTasks[taskId].data[EZCHAT_TASK_STATE] = 0; } static void Task_InitEasyChat(u8 taskId) { if (!IsUpdateLinkStateCBActive()) { while (Task_InitEasyChatInternal(taskId)) ; } else { if (Task_InitEasyChatInternal(taskId) == TRUE) return; } SetEasyChatTaskFunc(taskId, Task_RunEasyChat); } static void Task_RunEasyChat(u8 taskId) { u16 action; s16 *data; data = gTasks[taskId].data; switch (data[EZCHAT_TASK_STATE]) { case 0: SetVBlankCallback(VBlankCallback_EasyChatScreen); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); data[EZCHAT_TASK_STATE]++; break; case 1: action = EasyChatScreen_HandleJoypad(); if (action == 23) { BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); data[EZCHAT_TASK_STATE] = 3; } else if (action != 0) { PlaySE(SE_SELECT); EasyChatInterfaceCommand_Setup(action); data[EZCHAT_TASK_STATE]++; } break; case 2: if (!EasyChatInterfaceCommand_Run()) data[EZCHAT_TASK_STATE] = 1; break; case 3: if (!gPaletteFade.active) { if (data[EZCHAT_TASK_TYPE] == EASY_CHAT_TYPE_QUESTIONNAIRE) CompareQuestionnaireResponseWithPassphrase(); if (data[EZCHAT_TASK_TYPE] == EASY_CHAT_TYPE_PROFILE) { FlagSet(FLAG_SYS_SET_TRAINER_CARD_PROFILE); CompareProfileResponseWithPassphrase(); } DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK)); } break; } } static bool8 Task_InitEasyChatInternal(u8 taskId) { s16 *data; data = gTasks[taskId].data; switch (data[EZCHAT_TASK_STATE]) { case 0: SetVBlankCallback(NULL); ResetSpriteData(); FreeAllSpritePalettes(); ResetPaletteFade(); break; case 1: if (!InitEasyChatSelection()) { DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK)); } break; case 2: if (!EasyChat_AllocateResources(data[EZCHAT_TASK_TYPE], (u16 *)GetWordTaskArg(taskId, EZCHAT_TASK_WORDS))) { DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK)); } break; case 3: if (!InitEasyChatGraphicsWork()) { DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK)); } break; case 4: if (LoadEasyChatGraphics()) { return TRUE; } break; default: return FALSE; } data[EZCHAT_TASK_STATE]++; return TRUE; } static void DismantleEasyChat(MainCallback callback) { DestroyEasyChatSelectionData(); EasyChat_FreeResources(); DestroyEasyChatGraphicsResources(); FreeAllWindowBuffers(); SetMainCallback2(callback); } void ShowEasyChatScreen(void) { u16 *words; switch (gSpecialVar_0x8004) { case EASY_CHAT_TYPE_PROFILE: words = gSaveBlock1Ptr->easyChatProfile; break; case EASY_CHAT_TYPE_BATTLE_START: words = gSaveBlock1Ptr->easyChatBattleStart; break; case EASY_CHAT_TYPE_BATTLE_WON: words = gSaveBlock1Ptr->easyChatBattleWon; break; case EASY_CHAT_TYPE_BATTLE_LOST: words = gSaveBlock1Ptr->easyChatBattleLost; break; case EASY_CHAT_TYPE_QUESTIONNAIRE: words = GetQuestionnaireWordsPtr(); break; case EASY_CHAT_TYPE_MAIL: words = gSaveBlock1Ptr->mail[gSpecialVar_0x8005].words; break; default: return; } DoEasyChatScreen(gSpecialVar_0x8004, words, CB2_ReturnToFieldContinueScript); } static const u16 sECPhrase_MysteryEventIsExciting[] = { EC_WORD_MYSTERY, EC_WORD_EVENT, EC_WORD_IS, EC_WORD_EXCITING }; static void CompareProfileResponseWithPassphrase(void) { gSpecialVar_0x8004 = IsPhraseDifferentThanPlayerInput(sECPhrase_MysteryEventIsExciting, NELEMS(sECPhrase_MysteryEventIsExciting)); } static const u16 sECPhrase_LinkTogetherWithAll[] = { EC_WORD_LINK, EC_WORD_TOGETHER, EC_WORD_WITH, EC_WORD_ALL }; static void CompareQuestionnaireResponseWithPassphrase(void) { gSpecialVar_0x8004 = IsPhraseDifferentThanPlayerInput(sECPhrase_LinkTogetherWithAll, NELEMS(sECPhrase_LinkTogetherWithAll)); } static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { { .type = EASY_CHAT_TYPE_PROFILE, .numColumns = 2, .numRows = 2, .frameId = 0, .titleText = gText_Profile, .instructionsText1 = gText_CombineFourWordsOrPhrases, .instructionsText2 = gText_AndMakeYourProfile, .confirmText1 = gText_YourProfile, .confirmText2 = gText_IsAsShownOkay }, { .type = EASY_CHAT_TYPE_BATTLE_START, .numColumns = 2, .numRows = 3, .frameId = 1, .titleText = gText_AtTheBattlesStart, .instructionsText1 = gText_MakeMessageSixPhrases, .instructionsText2 = gText_MaxTwoTwelveLetterPhrases, .confirmText1 = gText_YourFeelingAtTheBattlesStart, .confirmText2 = gText_IsAsShownOkay }, { .type = EASY_CHAT_TYPE_BATTLE_WON, .numColumns = 2, .numRows = 3, .frameId = 1, .titleText = gText_UponWinningABattle, .instructionsText1 = gText_MakeMessageSixPhrases, .instructionsText2 = gText_MaxTwoTwelveLetterPhrases, .confirmText1 = gText_WhatYouSayIfYouWin, .confirmText2 = gText_IsAsShownOkay }, { .type = EASY_CHAT_TYPE_BATTLE_LOST, .numColumns = 2, .numRows = 3, .frameId = 1, .titleText = gText_UponLosingABattle, .instructionsText1 = gText_MakeMessageSixPhrases, .instructionsText2 = gText_MaxTwoTwelveLetterPhrases, .confirmText1 = gText_WhatYouSayIfYouLose, .confirmText2 = gText_IsAsShownOkay }, { .type = EASY_CHAT_TYPE_MAIL, .numColumns = 2, .numRows = 5, .frameId = 2, .titleText = NULL, .instructionsText1 = gText_CombineNineWordsOrPhrases, .instructionsText2 = gText_AndMakeAMessage, .confirmText1 = gText_TheMailMessage, .confirmText2 = gText_IsAsShownOkay }, { .type = EASY_CHAT_TYPE_MAIL_NO_CONFIRM, .numColumns = 2, .numRows = 2, .frameId = 0, .instructionsText1 = gText_CombineNineWordsOrPhrases, .instructionsText2 = gText_AndMakeAMessage, }, { .type = EASY_CHAT_TYPE_BARD_SONG, .numColumns = 2, .numRows = 3, .frameId = 1, .titleText = gText_TheBardsSong, .instructionsText1 = gText_ChangeJustOneWordOrPhrase, .instructionsText2 = gText_AndImproveTheBardsSong, .confirmText1 = gText_TheNewSong, .confirmText2 = gText_IsAsShownOkay }, { .type = EASY_CHAT_TYPE_INTERVIEW, .numColumns = 2, .numRows = 3, .frameId = 1, .titleText = gText_Interview, .instructionsText1 = gText_FindWordsThatDescribeYour, .instructionsText2 = gText_FeelingsRightNow, .confirmText1 = gText_TheAnswer, .confirmText2 = gText_IsAsShownOkay }, { .type = EASY_CHAT_TYPE_TRENDY_PHRASE, .numColumns = 2, .numRows = 1, .frameId = 3, .titleText = gText_WhatsHipAndHappening, .instructionsText1 = gText_CombineTwoWordsOrPhrases, .instructionsText2 = gText_AndMakeATrendySaying, .confirmText1 = gText_TheTrendySaying, .confirmText2 = gText_IsAsShownOkay }, { .type = EASY_CHAT_TYPE_QUESTIONNAIRE, .numColumns = 2, .numRows = 2, .frameId = 0, .titleText = gText_Questionnaire, .instructionsText1 = gText_CombineFourWordsOrPhrases, .instructionsText2 = gText_AndFillOutTheQuestionnaire, .confirmText1 = gText_TheAnswer, .confirmText2 = gText_IsAsShownOkay } }; static bool8 EasyChat_AllocateResources(u8 type, u16 *words) { u8 templateId; int i; sEasyChatScreen = malloc(sizeof(*sEasyChatScreen)); if (sEasyChatScreen == NULL) return FALSE; sEasyChatScreen->type = type; sEasyChatScreen->words = words; sEasyChatScreen->state = 0; sEasyChatScreen->mainCursorColumn = 0; sEasyChatScreen->mainCursorRow = 0; sEasyChatScreen->isAlphaMode = FALSE; templateId = GetEasyChatScreenTemplateId(type); sEasyChatScreen->numColumns = sEasyChatScreenTemplates[templateId].numColumns; sEasyChatScreen->numRows = sEasyChatScreenTemplates[templateId].numRows; sEasyChatScreen->numWords = sEasyChatScreen->numColumns * sEasyChatScreen->numRows; sEasyChatScreen->templateId = templateId; if (sEasyChatScreen->numWords > 9) sEasyChatScreen->numWords = 9; CpuCopy16(words, sEasyChatScreen->ecWordBuffer, sEasyChatScreen->numWords * sizeof(u16)); sEasyChatScreen->selectGroupNumRows = (GetNumDisplayableGroups() - 1) / 2 + 1; return TRUE; } static void EasyChat_FreeResources(void) { if (sEasyChatScreen != NULL) Free(sEasyChatScreen); } static u16 EasyChatScreen_HandleJoypad(void) { switch (sEasyChatScreen->state) { case 0: return HandleJoypad_SelectField(); case 1: return HandleJoypad_SelectFooter(); case 2: return HandleJoypad_SelectGroup(); case 3: return HandleJoypad_SelectWord(); case 4: return Cancel_HandleYesNoMenu(); case 5: return DelAll_HandleYesNoMenu(); case 6: return Confirm_HandleYesNoMenu(); } return 0; } static u16 HandleJoypad_SelectField(void) { do { if (JOY_NEW(A_BUTTON)) { sEasyChatScreen->state = 2; sEasyChatScreen->selectGroupCursorX = 0; sEasyChatScreen->selectGroupCursorY = 0; sEasyChatScreen->selectGroupRowsAbove = 0; return 9; } else if (JOY_NEW(B_BUTTON)) { return Cancel_CreateYesNoMenu(); } else if (JOY_NEW(START_BUTTON)) { return Confirm_CreateYesNoMenu(); } else if (JOY_NEW(DPAD_UP)) { sEasyChatScreen->mainCursorRow--; break; } else if (JOY_NEW(DPAD_LEFT)) { sEasyChatScreen->mainCursorColumn--; break; } else if (JOY_NEW(DPAD_DOWN)) { sEasyChatScreen->mainCursorRow++; break; } else if (JOY_NEW(DPAD_RIGHT)) { sEasyChatScreen->mainCursorColumn++; break; } return 0; } while (0); if (sEasyChatScreen->mainCursorRow < 0) sEasyChatScreen->mainCursorRow = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows; if (sEasyChatScreen->mainCursorRow > sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows) sEasyChatScreen->mainCursorRow = 0; if (sEasyChatScreen->mainCursorRow == sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows) { if (sEasyChatScreen->mainCursorColumn > 2) sEasyChatScreen->mainCursorColumn = 2; sEasyChatScreen->state = 1; return 3; } if (sEasyChatScreen->mainCursorColumn < 0) sEasyChatScreen->mainCursorColumn = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns - 1; if (sEasyChatScreen->mainCursorColumn >= sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns) sEasyChatScreen->mainCursorColumn = 0; if (GetEasyChatScreenFrameId() == 2 && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4) sEasyChatScreen->mainCursorColumn = 0; return 2; } static u16 HandleJoypad_SelectFooter(void) { do { if (JOY_NEW(A_BUTTON)) { switch (sEasyChatScreen->mainCursorColumn) { case 0: return DelAll_CreateYesNoMenu(); case 1: return Cancel_CreateYesNoMenu(); case 2: return Confirm_CreateYesNoMenu(); } } if (JOY_NEW(B_BUTTON)) { return Cancel_CreateYesNoMenu(); } else if (JOY_NEW(START_BUTTON)) { return Confirm_CreateYesNoMenu(); } else if (JOY_NEW(DPAD_UP)) { sEasyChatScreen->mainCursorRow--; break; } else if (JOY_NEW(DPAD_LEFT)) { sEasyChatScreen->mainCursorColumn--; break; } else if (JOY_NEW(DPAD_DOWN)) { sEasyChatScreen->mainCursorRow = 0; break; } else if (JOY_NEW(DPAD_RIGHT)) { sEasyChatScreen->mainCursorColumn++; break; } return 0; } while (0); if (sEasyChatScreen->mainCursorRow == sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows) { if (sEasyChatScreen->mainCursorColumn < 0) sEasyChatScreen->mainCursorColumn = 2; if (sEasyChatScreen->mainCursorColumn >= 3) sEasyChatScreen->mainCursorColumn = 0; return 3; } if (sEasyChatScreen->mainCursorColumn >= sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns) sEasyChatScreen->mainCursorColumn = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns - 1; if (GetEasyChatScreenFrameId() == 2 && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4) sEasyChatScreen->mainCursorColumn = 0; sEasyChatScreen->state = 0; return 2; } static u16 HandleJoypad_SelectGroup(void) { if (JOY_NEW(B_BUTTON)) return BackOutFromGroupToFieldSelect(); if (JOY_NEW(A_BUTTON)) { if (sEasyChatScreen->selectGroupCursorX != -1) return OpenSelectedGroup(); switch (sEasyChatScreen->selectGroupCursorY) { case 0: return ToggleGroupAlphaMode(); case 1: return DeleteSelectedWord(); case 2: return BackOutFromGroupToFieldSelect(); } } if (JOY_NEW(SELECT_BUTTON)) return ToggleGroupAlphaMode(); if (JOY_REPT(DPAD_UP)) return SelectGroupCursorAction(2); if (JOY_REPT(DPAD_DOWN)) return SelectGroupCursorAction(3); if (JOY_REPT(DPAD_LEFT)) return SelectGroupCursorAction(1); if (JOY_REPT(DPAD_RIGHT)) return SelectGroupCursorAction(0); return 0; } static u16 HandleJoypad_SelectWord(void) { if (JOY_NEW(B_BUTTON)) { sEasyChatScreen->state = 2; return 13; } if (JOY_NEW(A_BUTTON)) return PlaceSelectedWord(); if (JOY_NEW(START_BUTTON)) return SelectWordCursorAction(4); if (JOY_NEW(SELECT_BUTTON)) return SelectWordCursorAction(5); if (JOY_REPT(DPAD_UP)) return SelectWordCursorAction(2); if (JOY_REPT(DPAD_DOWN)) return SelectWordCursorAction(3); if (JOY_REPT(DPAD_LEFT)) return SelectWordCursorAction(1); if (JOY_REPT(DPAD_RIGHT)) return SelectWordCursorAction(0); return 0; } static u16 Cancel_HandleYesNoMenu(void) { u8 var0; switch (Menu_ProcessInputNoWrapClearOnChoose()) { case MENU_B_PRESSED: // B Button case 1: // No sEasyChatScreen->state = GetStateBackup(); return 7; case 0: // Yes gSpecialVar_Result = 0; return 23; default: return 0; } } static u16 Confirm_HandleYesNoMenu(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case MENU_B_PRESSED: // B Button case 1: // No sEasyChatScreen->state = GetStateBackup(); return 7; case 0: // Yes gSpecialVar_Result = HasECMessageChanged(); CommitECWords(); return 23; default: return 0; } } static u16 DelAll_HandleYesNoMenu(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case MENU_B_PRESSED: // B Button case 1: // No sEasyChatScreen->state = 1; return 7; case 0: // Yes DeleteAllECFields(); sEasyChatScreen->state = 1; return 8; default: return 0; } } static u16 Cancel_CreateYesNoMenu(void) { sEasyChatScreen->stateBackup = sEasyChatScreen->state; sEasyChatScreen->state = 4; return 5; } static u16 DelAll_CreateYesNoMenu(void) { sEasyChatScreen->stateBackup = sEasyChatScreen->state; sEasyChatScreen->state = 5; return 4; } static u16 Confirm_CreateYesNoMenu(void) { sEasyChatScreen->stateBackup = sEasyChatScreen->state; if (IsEcWordBufferUninitialized()) { sEasyChatScreen->state = 4; return 5; } else { sEasyChatScreen->state = 6; return 6; } } static u8 GetStateBackup(void) { return sEasyChatScreen->stateBackup; } static int OpenSelectedGroup(void) { u16 numDisplayedWords; if (!sEasyChatScreen->isAlphaMode) { u8 groupId = GetSelectedGroupByIndex(GetSelectedGroupIndex()); GetUnlockedECWords(FALSE, groupId); } else { GetUnlockedECWords(TRUE, GetSelectedLetter()); } numDisplayedWords = GetNumDisplayedWords(); if (numDisplayedWords == 0) return 0; sEasyChatScreen->selectWordNumRows = (numDisplayedWords - 1) / 2; sEasyChatScreen->selectWordRowsAbove = 0; sEasyChatScreen->selectWordCursorX = 0; sEasyChatScreen->selectWordCursorY = 0; sEasyChatScreen->state = 3; return 11; } static int BackOutFromGroupToFieldSelect(void) { sEasyChatScreen->state = 0; return 10; } static int ToggleGroupAlphaMode(void) { sEasyChatScreen->selectGroupCursorX = 0; sEasyChatScreen->selectGroupCursorY = 0; sEasyChatScreen->selectGroupRowsAbove = 0; if (!sEasyChatScreen->isAlphaMode) sEasyChatScreen->isAlphaMode = TRUE; else sEasyChatScreen->isAlphaMode = FALSE; return 22; } static int DeleteSelectedWord(void) { SetEasyChatWordToField(0xFFFF); return 1; } static int PlaceSelectedWord(void) { u16 easyChatWord = GetDisplayedWordByIndex(GetSelectWordCursorPos()); SetEasyChatWordToField(easyChatWord); sEasyChatScreen->state = 0; return 12; } static void CommitECWords(void) { u32 i; for (i = 0; i < sEasyChatScreen->numWords; i++) sEasyChatScreen->words[i] = sEasyChatScreen->ecWordBuffer[i]; } static void DeleteAllECFields(void) { u32 i; for (i = 0; i < sEasyChatScreen->numWords; i++) sEasyChatScreen->ecWordBuffer[i] = 0xFFFF; } static void SetEasyChatWordToField(u16 easyChatWord) { u16 index = GetSelectedFieldIndex(); sEasyChatScreen->ecWordBuffer[index] = easyChatWord; } static bool8 HasECMessageChanged(void) { u32 i; for (i = 0; i < sEasyChatScreen->numWords; i++) { if (sEasyChatScreen->ecWordBuffer[i] != sEasyChatScreen->words[i]) return TRUE; } return FALSE; } static u16 SelectGroupCursorAction(u32 action) { if (sEasyChatScreen->selectGroupCursorX != -1) { if (!sEasyChatScreen->isAlphaMode) return UpdateSelectGroupCursorPos_OutsideBlueBox_GroupMode(action); else return UpdateSelectGroupCursorPos_OutsideBlueBox_AlphaMode(action); } else { return UpdateSelectGroupCursorPos_InsideBlueBox(action); } } static int UpdateSelectGroupCursorPos_OutsideBlueBox_GroupMode(u32 arg0) { switch (arg0) { case 2: if (sEasyChatScreen->selectGroupCursorY != -sEasyChatScreen->selectGroupRowsAbove) { if (sEasyChatScreen->selectGroupCursorY) { sEasyChatScreen->selectGroupCursorY--; return 14; } else { sEasyChatScreen->selectGroupRowsAbove--; return 16; } } break; case 3: if (sEasyChatScreen->selectGroupCursorY + sEasyChatScreen->selectGroupRowsAbove < sEasyChatScreen->selectGroupNumRows - 1) { int var0; if (sEasyChatScreen->selectGroupCursorY < 3) { sEasyChatScreen->selectGroupCursorY++; var0 = 14; } else { sEasyChatScreen->selectGroupRowsAbove++; var0 = 15; } MoveGroupCursorXToMaxCol(); return var0; } break; case 1: if (sEasyChatScreen->selectGroupCursorX) sEasyChatScreen->selectGroupCursorX--; else GroupCursorMoveToBlueBox(); return 14; case 0: if (sEasyChatScreen->selectGroupCursorX < 1) { sEasyChatScreen->selectGroupCursorX++; if (GroupSelectCursorXPosTooFarRight()) GroupCursorMoveToBlueBox(); } else { GroupCursorMoveToBlueBox(); } return 14; } return 0; } static int UpdateSelectGroupCursorPos_OutsideBlueBox_AlphaMode(u32 arg0) { switch (arg0) { case 2: if (sEasyChatScreen->selectGroupCursorY > 0) sEasyChatScreen->selectGroupCursorY--; else sEasyChatScreen->selectGroupCursorY = 3; MoveGroupCursorXToMaxCol(); return 14; case 3: if (sEasyChatScreen->selectGroupCursorY < 3) sEasyChatScreen->selectGroupCursorY++; else sEasyChatScreen->selectGroupCursorY = 0; MoveGroupCursorXToMaxCol(); return 14; case 0: sEasyChatScreen->selectGroupCursorX++; if (GroupSelectCursorXPosTooFarRight()) GroupCursorMoveToBlueBox(); return 14; case 1: sEasyChatScreen->selectGroupCursorX--; if (sEasyChatScreen->selectGroupCursorX < 0) GroupCursorMoveToBlueBox(); return 14; } return 0; } static int UpdateSelectGroupCursorPos_InsideBlueBox(u32 arg0) { switch (arg0) { case 2: if (sEasyChatScreen->selectGroupCursorY) sEasyChatScreen->selectGroupCursorY--; else sEasyChatScreen->selectGroupCursorY = 2; return 14; case 3: if (sEasyChatScreen->selectGroupCursorY < 2) sEasyChatScreen->selectGroupCursorY++; else sEasyChatScreen->selectGroupCursorY = 0; return 14; case 1: sEasyChatScreen->selectGroupCursorY++; GroupCursorWrapAroundLeft(); return 14; case 0: sEasyChatScreen->selectGroupCursorX = 0; sEasyChatScreen->selectGroupCursorY++; return 14; } return 0; } static void GroupCursorMoveToBlueBox(void) { sEasyChatScreen->selectGroupCursorX = 0xFF; if (sEasyChatScreen->selectGroupCursorY) sEasyChatScreen->selectGroupCursorY--; } static void GroupCursorWrapAroundLeft(void) { if (!sEasyChatScreen->isAlphaMode) { sEasyChatScreen->selectGroupCursorX = 1; MoveGroupCursorXToMaxCol(); } else { sEasyChatScreen->selectGroupCursorX = GetMaxGroupCursorXinAlphaMode(sEasyChatScreen->selectGroupCursorY); } } static u16 SelectWordCursorAction(u32 arg0) { u16 result; switch (arg0) { case 2: // up if (sEasyChatScreen->selectWordCursorY + sEasyChatScreen->selectWordRowsAbove > 0) { if (sEasyChatScreen->selectWordCursorY > 0) { sEasyChatScreen->selectWordCursorY--; result = 17; } else { sEasyChatScreen->selectWordRowsAbove--; result = 18; } MoveWordCursorXToMaxCol(); return result; } break; case 3: // down if (sEasyChatScreen->selectWordCursorY + sEasyChatScreen->selectWordRowsAbove < sEasyChatScreen->selectWordNumRows) { if (sEasyChatScreen->selectWordCursorY < 3) { sEasyChatScreen->selectWordCursorY++; result = 17; } else { sEasyChatScreen->selectWordRowsAbove++; result = 19; } MoveWordCursorXToMaxCol(); return result; } break; case 1: // left if (sEasyChatScreen->selectWordCursorX > 0) sEasyChatScreen->selectWordCursorX--; else sEasyChatScreen->selectWordCursorX = 1; MoveWordCursorXToMaxCol(); return 17; case 0: // right if (sEasyChatScreen->selectWordCursorX < 1) { sEasyChatScreen->selectWordCursorX++; if (WordSelectCursorXPosTooFarRight()) sEasyChatScreen->selectWordCursorX = 0; } else { sEasyChatScreen->selectWordCursorX = 0; } return 17; case 4: // pg up if (sEasyChatScreen->selectWordRowsAbove) { if (sEasyChatScreen->selectWordRowsAbove > 3) sEasyChatScreen->selectWordRowsAbove -= 4; else sEasyChatScreen->selectWordRowsAbove = 0; return 20; } break; case 5: // pg dn if (sEasyChatScreen->selectWordRowsAbove <= sEasyChatScreen->selectWordNumRows - 4) { sEasyChatScreen->selectWordRowsAbove += 4; if (sEasyChatScreen->selectWordRowsAbove > sEasyChatScreen->selectWordNumRows - 3) sEasyChatScreen->selectWordRowsAbove = sEasyChatScreen->selectWordNumRows + -3u; MoveWordCursorXToMaxCol(); return 21; } break; } return 0; } static u16 GetSelectedFieldIndex(void) { return (sEasyChatScreen->mainCursorRow * sEasyChatScreen->numColumns) + sEasyChatScreen->mainCursorColumn; } static u16 GetSelectedGroupIndex(void) { return 2 * (sEasyChatScreen->selectGroupCursorY + sEasyChatScreen->selectGroupRowsAbove) + sEasyChatScreen->selectGroupCursorX; } static const u8 sAlphabetLayout[][7] = { { 1, 2, 3, 4, 5, 6}, { 7, 8, 9, 10, 11, 12}, {13, 14, 15, 16, 17, 18, 19}, {20, 21, 22, 23, 24, 25, 26} }; static int GetSelectedLetter(void) { int col = sEasyChatScreen->selectGroupCursorX < NELEMS(*sAlphabetLayout) ? sEasyChatScreen->selectGroupCursorX : 0; int row = sEasyChatScreen->selectGroupCursorY < NELEMS(sAlphabetLayout) ? sEasyChatScreen->selectGroupCursorY : 0; return sAlphabetLayout[row][col]; } static u16 GetSelectWordCursorPos(void) { return 2 * (sEasyChatScreen->selectWordCursorY + sEasyChatScreen->selectWordRowsAbove) + sEasyChatScreen->selectWordCursorX; } static u8 GetMaxGroupCursorXinAlphaMode(u8 arg0) { switch (arg0) { case 0: default: return 6; case 1: return 5; } } static void MoveGroupCursorXToMaxCol(void) { while (GroupSelectCursorXPosTooFarRight()) { if (sEasyChatScreen->selectGroupCursorX) sEasyChatScreen->selectGroupCursorX--; else break; } } static void MoveWordCursorXToMaxCol(void) { while (WordSelectCursorXPosTooFarRight()) { if (sEasyChatScreen->selectWordCursorX) sEasyChatScreen->selectWordCursorX--; else break; } } static bool8 GroupSelectCursorXPosTooFarRight(void) { if (!sEasyChatScreen->isAlphaMode) return GetSelectedGroupIndex() >= GetNumDisplayableGroups() ? TRUE : FALSE; else return sEasyChatScreen->selectGroupCursorX > GetMaxGroupCursorXinAlphaMode(sEasyChatScreen->selectGroupCursorY) ? TRUE : FALSE; } static bool8 WordSelectCursorXPosTooFarRight(void) { return GetSelectWordCursorPos() >= GetNumDisplayedWords() ? TRUE : FALSE; } u8 GetEasyChatScreenFrameId(void) { return sEasyChatScreenTemplates[sEasyChatScreen->templateId].frameId; } const u8 *GetTitleText(void) { return sEasyChatScreenTemplates[sEasyChatScreen->templateId].titleText; } u16 *GetEasyChatWordBuffer(void) { return sEasyChatScreen->ecWordBuffer; } u8 GetNumRows(void) { return sEasyChatScreen->numRows; } u8 GetNumColumns(void) { return sEasyChatScreen->numColumns; } u8 GetMainCursorColumn(void) { return sEasyChatScreen->mainCursorColumn; } u8 GetMainCursorRow(void) { return sEasyChatScreen->mainCursorRow; } void GetEasyChatInstructionsText(const u8 **str1, const u8 **str2) { *str1 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].instructionsText1; *str2 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].instructionsText2; } void GetEasyChatConfirmText(const u8 **str1, const u8 **str2) { *str1 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].confirmText1; *str2 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].confirmText2; } void GetEasyChatConfirmCancelText(const u8 **str1, const u8 **str2) { switch (sEasyChatScreen->type) { case EASY_CHAT_TYPE_MAIL: *str1 = gText_StopGivingPkmnMail; *str2 = NULL; break; default: *str1 = gText_QuitEditing; *str2 = NULL; break; } } void GetEasyChatConfirmDeletionText(const u8 **str1, const u8 **str2) { *str1 = gText_AllTextBeingEditedWill; *str2 = gText_BeDeletedThatOkay; } void GetECSelectGroupCursorCoords(u8 *Xp, u8 *Yp) { *Xp = sEasyChatScreen->selectGroupCursorX; *Yp = sEasyChatScreen->selectGroupCursorY; } bool8 IsEasyChatAlphaMode(void) { return sEasyChatScreen->isAlphaMode; } u8 GetECSelectGroupRowsAbove(void) { return sEasyChatScreen->selectGroupRowsAbove; } void GetECSelectWordCursorCoords(s8 *Xp, s8 *Yp) { *Xp = sEasyChatScreen->selectWordCursorX; *Yp = sEasyChatScreen->selectWordCursorY; } u8 GetECSelectWordRowsAbove(void) { return sEasyChatScreen->selectWordRowsAbove; } u8 GetECSelectWordNumRows(void) { return sEasyChatScreen->selectWordNumRows; } static u8 UnusedDummy(void) { return 0; } bool32 ShouldDrawECUpArrow(void) { switch (sEasyChatScreen->state) { case 2: if (!sEasyChatScreen->isAlphaMode && sEasyChatScreen->selectGroupRowsAbove != 0) return TRUE; break; case 3: if (sEasyChatScreen->selectWordRowsAbove != 0) return TRUE; break; } return FALSE; } bool32 ShouldDrawECDownArrow(void) { switch (sEasyChatScreen->state) { case 2: if (!sEasyChatScreen->isAlphaMode && sEasyChatScreen->selectGroupRowsAbove + 4 <= sEasyChatScreen->selectGroupNumRows - 1) return TRUE; break; case 3: if (sEasyChatScreen->selectWordRowsAbove + 4 <= sEasyChatScreen->selectWordNumRows) return TRUE; break; } return FALSE; } static bool8 IsPhraseDifferentThanPlayerInput(const u16 *phrase, u8 phraseLength) { u32 i; for (i = 0; i < phraseLength; i++) { if (phrase[i] != sEasyChatScreen->ecWordBuffer[i]) return TRUE; } return FALSE; } static u8 GetEasyChatScreenTemplateId(u8 type) { u32 i; for (i = 0; i < NELEMS(sEasyChatScreenTemplates); i++) { if (sEasyChatScreenTemplates[i].type == type) return i; } return 0; } static bool32 IsEcWordBufferUninitialized(void) { int i; for (i = 0; i < sEasyChatScreen->numWords; i++) { if (sEasyChatScreen->ecWordBuffer[i] != 0xFFFF) return FALSE; } return TRUE; } ================================================ FILE: src/easy_chat_3.c ================================================ #include "global.h" #include "gflib.h" #include "keyboard_text.h" #include "decompress.h" #include "easy_chat.h" #include "graphics.h" #include "menu.h" #include "new_menu_helpers.h" #include "strings.h" #include "text_window.h" enum { GFXTAG_TRIANGLE_CURSOR, GFXTAG_RECTANGLE_CURSOR, GFXTAG_SCROLL_INDICATOR, GFXTAG_START_SELECT_BUTTONS, GFXTAG_MODE_WINDOW, GFXTAG_RS_INTERVIEW_FRAME, GFXTAG_BUTTON_WINDOW, }; enum { PALTAG_TRIANGLE_CURSOR, PALTAG_RECTANGLE_CURSOR, PALTAG_MISC_UI, PALTAG_RS_INTERVIEW_FRAME, }; struct ECWork { u16 state; u16 windowId; u16 id; u8 frameAnimIdx; u8 frameAnimTarget; s8 frameAnimDelta; u8 modeIconState; u8 ecPrintBuffer[0xC1]; u8 ecPaddedWordBuffer[0x200]; u16 bg2ScrollRow; int tgtBgY; int deltaBgY; struct Sprite *selectDestFieldCursorSprite; struct Sprite *rectCursorSpriteRight; struct Sprite *rectCursorSpriteLeft; struct Sprite *selectWordCursorSprite; struct Sprite *selectGroupHelpSprite; struct Sprite *modeIconsSprite; struct Sprite *upTriangleCursorSprite; struct Sprite *downTriangleCursorSprite; struct Sprite *startPgUpButtonSprite; struct Sprite *selectPgDnButtonSprite; u16 bg1TilemapBuffer[BG_SCREEN_SIZE / 2]; u16 bg3TilemapBuffer[BG_SCREEN_SIZE / 2]; }; struct EasyChatPhraseFrameDimensions { u8 left; u8 top; u8 width; u8 height; }; static EWRAM_DATA struct ECWork * sEasyChatGraphicsResources = NULL; static bool8 ECInterfaceCmd_01(void); static bool8 ECInterfaceCmd_02(void); static bool8 ECInterfaceCmd_03(void); static bool8 ECInterfaceCmd_05(void); static bool8 ECInterfaceCmd_06(void); static bool8 ECInterfaceCmd_04(void); static bool8 ECInterfaceCmd_07(void); static bool8 ECInterfaceCmd_08(void); static bool8 ECInterfaceCmd_09(void); static bool8 ECInterfaceCmd_10(void); static bool8 ECInterfaceCmd_22(void); static bool8 ECInterfaceCmd_14(void); static bool8 ECInterfaceCmd_15(void); static bool8 ECInterfaceCmd_16(void); static bool8 ECInterfaceCmd_11(void); static bool8 ECInterfaceCmd_12(void); static bool8 ECInterfaceCmd_13(void); static bool8 ECInterfaceCmd_17(void); static bool8 ECInterfaceCmd_19(void); static bool8 ECInterfaceCmd_18(void); static bool8 ECInterfaceCmd_21(void); static bool8 ECInterfaceCmd_20(void); static bool8 InitEasyChatGraphicsWork_Internal(void); static void SetGpuRegsForEasyChatInit(void); static void LoadEasyChatPals(void); static void PrintTitleText(void); static void EC_AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, u8 bg, u8 fg, u8 shadow); static void PrintECInstructionsText(void); static void PrintECInterfaceTextById(u8 a0); static void EC_CreateYesNoMenuWithInitialCursorPos(u8 initialCursorPos); static void CreatePhraseFrameWindow(void); static void PrintECFields(void); static void DrawECFrameInTilemapBuffer(u16 *buffer); static void PutWin2TilemapAndCopyToVram(void); static void PrintECMenuById(u32 a0); static void PrintECGroupOrAlphaMenu(void); static void PrintECGroupsMenu(void); static void PrintEasyChatKeyboardText(void); static void PrintECWordsMenu(void); static void UpdateWin2PrintWordsScrollDown(void); static void UpdateWin2PrintWordsScrollUp(void); static void UpdateWin2PrintWordsScrollPageDown(void); static void UpdateWin2PrintWordsScrollPageUp(void); static void PrintECRowsWin2(u8 row, u8 remrow); static void ClearECRowsWin2(u8 row, u8 remrow); static void ClearWin2AndCopyToVram(void); static void StartWin2FrameAnim(int a0); static bool8 AnimateFrameResize(void); static void RedrawFrameByIndex(u8 a0); static void RedrawFrameByRect(int left, int top, int width, int height); static void InitBg2Scroll(void); static void ScheduleBg2VerticalScroll(s16 direction, u8 speed); static bool8 AnimateBg2VerticalScroll(void); static int GetBg2ScrollRow(void); static void SetRegWin0Coords(u8 left, u8 top, u8 right, u8 bottom); static void LoadSpriteGfx(void); static void CreateSelectDestFieldCursorSprite(void); static void SpriteCB_BounceCursor(struct Sprite *sprite); static void SetSelectDestFieldCursorSpritePosAndResetAnim(u8 x, u8 y); static void FreezeSelectDestFieldCursorSprite(void); static void UnfreezeSelectDestFieldCursorSprite(void); static void CreateRedRectangularCursorSpritePair(void); static void DestroyRedRectangularCursor(void); static void EC_MoveCursor(void); static void MoveCursor_Group(s8 a0, s8 a1); static void MoveCursor_Alpha(s8 a0, s8 a1); static void CreateSelectWordCursorSprite(void); static void SpriteCB_SelectWordCursorSprite(struct Sprite *sprite); static void SetSelectWordCursorSpritePos(void); static void SetSelectWordCursorSpritePosExplicit(u8 x, u8 y); static void DestroySelectWordCursorSprite(void); static void CreateSelectGroupHelpSprite(void); static bool8 AnimateSeletGroupModeAndHelpSpriteEnter(void); static void StartModeIconHidingAnimation(void); static bool8 RunModeIconHidingAnimation(void); static void ShrinkModeIconsSprite(void); static void ShowModeIconsSprite(void); static bool8 ModeIconsSpriteAnimIsEnded(void); static void CreateVerticalScrollArrowSprites(void); static void UpdateVerticalScrollArrowVisibility(void); static void HideVerticalScrollArrowSprites(void); static void UpdateVerticalScrollArrowSpriteXPos(int a0); static void CreateStartSelectButtonsSprites(void); static void UpdateStartSelectButtonSpriteVisibility(void); static void HideStartSelectButtonSprites(void); static void CreateFooterWindow(void); static const u16 sTriangleCursor_Pal[] = INCBIN_U16("graphics/easy_chat/triangle_cursor.gbapal"); static const u16 sRectangleCursor_Pal[] = INCBIN_U16("graphics/easy_chat/rectangle_cursor.gbapal"); static const u16 sTriangleCursor_Gfx[] = INCBIN_U16("graphics/easy_chat/triangle_cursor.4bpp"); static const u16 sScrollIndicator_Gfx[] = INCBIN_U16("graphics/easy_chat/scroll_indicator.4bpp"); static const u16 sStartSelectButtons_Gfx[] = INCBIN_U16("graphics/easy_chat/start_select_buttons.4bpp"); // In Ruby/Sapphire Easy Chat screens had a black background, and when the player & interviewer were present // on screen the interview_frame gfx was shown behind them. // In FRLG all Easy Chat screens have a filled background, so these gfx go unused static const u16 sRSInterviewFrame_Pal[] = INCBIN_U16("graphics/easy_chat/interview_frame.gbapal"); static const u32 sRSInterviewFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/interview_frame.4bpp.lz"); static const u16 sTextInputFrameOrange_Pal[] = INCBIN_U16("graphics/easy_chat/text_input_frame_orange.gbapal"); static const u16 sTextInputFrameGreen_Pal[] = INCBIN_U16("graphics/easy_chat/text_input_frame_green.gbapal"); static const u32 sTextInputFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/text_input_frame.4bpp.lz"); static const u16 sTitleText_Pal[] = INCBIN_U16("graphics/easy_chat/title_text.gbapal"); static const u16 sText_Pal[] = INCBIN_U16("graphics/easy_chat/text.gbapal"); static const struct EasyChatPhraseFrameDimensions sPhraseFrameDimensions[] = { { .left = 3, .top = 4, .width = 24, .height = 4 }, { .left = 1, .top = 4, .width = 27, .height = 4 }, { .left = 3, .top = 0, .width = 24, .height = 10 }, { .left = 6, .top = 6, .width = 18, .height = 4 }, { .left = 16, .top = 4, .width = 9, .height = 2 }, { .left = 14, .top = 4, .width = 18, .height = 4 } }; static const struct BgTemplate sEasyChatBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0, }, { .bg = 1, .charBaseIndex = 3, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0, }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x80, }, { .bg = 3, .charBaseIndex = 2, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0, } }; static const struct WindowTemplate sEasyChatWindowTemplates[] = { { .bg = 1, .tilemapLeft = 7, .tilemapTop = 0, .width = 16, .height = 2, .paletteNum = 10, .baseBlock = 0x10, }, { .bg = 0, .tilemapLeft = 4, .tilemapTop = 15, .width = 22, .height = 4, .paletteNum = 15, .baseBlock = 0xA, }, { .bg = 2, .tilemapLeft = 1, .tilemapTop = 0, .width = 28, .height = 32, .paletteNum = 3, .baseBlock = 0, }, DUMMY_WIN_TEMPLATE, }; static const struct WindowTemplate sEasyChatYesNoWindowTemplate = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 9, .width = 5, .height = 4, .paletteNum = 15, .baseBlock = 0x062 }; static const u8 sText_Underscore[] = _("{UNDERSCORE}"); static const u8 sText_Clear17[] = _("{CLEAR 17}"); static const u8 *const sEasyChatKeyboardAlphabet[NUM_ALPHABET_ROWS] = { gText_EasyChatKeyboard_ABCDEFothers, gText_EasyChatKeyboard_GHIJKL, gText_EasyChatKeyboard_MNOPQRS, gText_EasyChatKeyboard_TUVWXYZ }; static const struct SpriteSheet sEasyChatSpriteSheets[] = { {.data = sTriangleCursor_Gfx, .size = 0x0020, .tag = GFXTAG_TRIANGLE_CURSOR}, {.data = sScrollIndicator_Gfx, .size = 0x0100, .tag = GFXTAG_SCROLL_INDICATOR}, {.data = sStartSelectButtons_Gfx, .size = 0x0100, .tag = GFXTAG_START_SELECT_BUTTONS}, {} }; static const struct SpritePalette sEasyChatSpritePalettes[] = { {.data = sTriangleCursor_Pal, .tag = PALTAG_TRIANGLE_CURSOR}, {.data = sRectangleCursor_Pal, .tag = PALTAG_RECTANGLE_CURSOR}, {.data = gEasyChatButtonWindow_Pal, .tag = PALTAG_MISC_UI}, // The palette is generated from the button window but used for various parts of the UI {.data = sRSInterviewFrame_Pal, .tag = PALTAG_RS_INTERVIEW_FRAME}, {} }; static const struct CompressedSpriteSheet sEasyChatCompressedSpriteSheets[] = { {.data = sRSInterviewFrame_Gfx, .size = 0x0800, .tag = GFXTAG_RS_INTERVIEW_FRAME}, {.data = gEasyChatRectangleCursor_Gfx, .size = 0x1000, .tag = GFXTAG_RECTANGLE_CURSOR}, {.data = gEasyChatButtonWindow_Gfx, .size = 0x0800, .tag = GFXTAG_BUTTON_WINDOW}, {.data = gEasyChatMode_Gfx, .size = 0x1000, .tag = GFXTAG_MODE_WINDOW} }; static const u8 sAlphabetKeyboardColumnOffsets[NUM_ALPHABET_COLUMNS] = {0, 12, 24, 56, 68, 80, 92}; static const struct OamData sOamData_TriangleCursor = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .mosaic = FALSE, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0x000, .priority = 3, .paletteNum = 0 }; static const struct SpriteTemplate sSpriteTemplate_TriangleCursor = { .tileTag = GFXTAG_TRIANGLE_CURSOR, .paletteTag = PALTAG_TRIANGLE_CURSOR, .oam = &sOamData_TriangleCursor, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_BounceCursor }; static const struct OamData sOamData_RectangleCursor = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .mosaic = FALSE, .shape = SPRITE_SHAPE(64x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AnimCmd sAnim_RectangleCursor_OnGroup[] = { ANIMCMD_FRAME(0x00, 0), ANIMCMD_END }; static const union AnimCmd sAnim_RectangleCursor_OnButton[] = { ANIMCMD_FRAME(0x20, 0), ANIMCMD_END }; static const union AnimCmd sAnim_RectangleCursor_OnOthers[] = { ANIMCMD_FRAME(0x40, 0), ANIMCMD_END }; static const union AnimCmd sAnim_RectangleCursor_OnLetter[] = { ANIMCMD_FRAME(0x60, 0), ANIMCMD_END }; // Each anim changes the dimensions of the rectangle cursor to fit what it should be selecting enum { RECTCURSOR_ANIM_ON_GROUP, RECTCURSOR_ANIM_ON_BUTTON, RECTCURSOR_ANIM_ON_OTHERS, RECTCURSOR_ANIM_ON_LETTER, }; static const union AnimCmd *const sAnims_RectangleCursor[] = { [RECTCURSOR_ANIM_ON_GROUP] = sAnim_RectangleCursor_OnGroup, [RECTCURSOR_ANIM_ON_BUTTON] = sAnim_RectangleCursor_OnButton, [RECTCURSOR_ANIM_ON_OTHERS] = sAnim_RectangleCursor_OnOthers, [RECTCURSOR_ANIM_ON_LETTER] = sAnim_RectangleCursor_OnLetter, }; static const struct SpriteTemplate sSpriteTemplate_RectangleCursor = { .tileTag = GFXTAG_RECTANGLE_CURSOR, .paletteTag = PALTAG_RECTANGLE_CURSOR, .oam = &sOamData_RectangleCursor, .anims = sAnims_RectangleCursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_BounceCursor }; static const struct OamData sOamData_ModeWindow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .mosaic = FALSE, .shape = SPRITE_SHAPE(64x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AnimCmd sAnim_ModeWindow_Hidden[] = { ANIMCMD_FRAME(0x60, 0), // Hidden frame ANIMCMD_END }; static const union AnimCmd sAnim_ModeWindow_ToGroup[] = { ANIMCMD_FRAME(0x40, 4), // Transition frame ANIMCMD_FRAME(0x20, 4), // 'Group' frame ANIMCMD_END }; static const union AnimCmd sAnim_ModeWindow_ToAlphabet[] = { ANIMCMD_FRAME(0x40, 4), // Transition frame ANIMCMD_FRAME(0x00, 4), // 'A-Z' frame ANIMCMD_END }; static const union AnimCmd sAnim_ModeWindow_ToHidden[] = { ANIMCMD_FRAME(0x40, 4), // Transition frame ANIMCMD_FRAME(0x60, 0), // Hidden frame ANIMCMD_END }; static const union AnimCmd sAnim_ModeWindow_Transition[] = { ANIMCMD_FRAME(0x40, 4), // Transition frame ANIMCMD_END }; enum { MODEWINDOW_ANIM_HIDDEN, MODEWINDOW_ANIM_TO_GROUP, MODEWINDOW_ANIM_TO_ALPHABET, MODEWINDOW_ANIM_TO_HIDDEN, MODEWINDOW_ANIM_TRANSITION, }; static const union AnimCmd *const sAnims_ModeWindow[] = { [MODEWINDOW_ANIM_HIDDEN] = sAnim_ModeWindow_Hidden, [MODEWINDOW_ANIM_TO_GROUP] = sAnim_ModeWindow_ToGroup, [MODEWINDOW_ANIM_TO_ALPHABET] = sAnim_ModeWindow_ToAlphabet, [MODEWINDOW_ANIM_TO_HIDDEN] = sAnim_ModeWindow_ToHidden, [MODEWINDOW_ANIM_TRANSITION] = sAnim_ModeWindow_Transition, }; static const struct SpriteTemplate sSpriteTemplate_ModeWindow = { .tileTag = GFXTAG_MODE_WINDOW, .paletteTag = PALTAG_MISC_UI, .oam = &sOamData_ModeWindow, .anims = sAnims_ModeWindow, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_ButtonWindow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 3, .paletteNum = 0 }; static const struct SpriteTemplate sSpriteTemplate_ButtonWindow = { .tileTag = GFXTAG_BUTTON_WINDOW, .paletteTag = PALTAG_MISC_UI, .oam = &sOamData_ButtonWindow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_StartSelectButton = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const struct OamData sOamData_ScrollIndicator = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AnimCmd sAnim_Frame0[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, }; static const union AnimCmd sAnim_Frame1[] = { ANIMCMD_FRAME(4, 0), ANIMCMD_END, }; // Frame0 is Start button, Frame1 is Select button, both are identical for the scroll indicators static const union AnimCmd *const sAnims_TwoFrame[] = { sAnim_Frame0, sAnim_Frame1, }; static const struct SpriteTemplate sSpriteTemplate_StartSelectButtons = { .tileTag = GFXTAG_START_SELECT_BUTTONS, .paletteTag = PALTAG_MISC_UI, .oam = &sOamData_StartSelectButton, .anims = sAnims_TwoFrame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct SpriteTemplate sSpriteTemplate_ScrollIndicator = { .tileTag = GFXTAG_SCROLL_INDICATOR, .paletteTag = PALTAG_MISC_UI, .oam = &sOamData_ScrollIndicator, .anims = sAnims_TwoFrame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; bool8 InitEasyChatGraphicsWork(void) { if (!InitEasyChatGraphicsWork_Internal()) return FALSE; else return TRUE; } bool8 LoadEasyChatGraphics(void) { switch (sEasyChatGraphicsResources->state) { case 0: ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sEasyChatBgTemplates, NELEMS(sEasyChatBgTemplates)); SetBgTilemapBuffer(3, sEasyChatGraphicsResources->bg3TilemapBuffer); SetBgTilemapBuffer(1, sEasyChatGraphicsResources->bg1TilemapBuffer); InitWindows(sEasyChatWindowTemplates); DeactivateAllTextPrinters(); LoadEasyChatPals(); SetGpuRegsForEasyChatInit(); CpuFastFill(0, (void *)VRAM + 0x1000000, 0x400); break; case 1: DecompressAndLoadBgGfxUsingHeap(3, gEasyChatWindow_Gfx, 0, 0, 0); CopyToBgTilemapBuffer(3, gEasyChatWindow_Tilemap, 0, 0); CreatePhraseFrameWindow(); CreateFooterWindow(); CopyBgTilemapBufferToVram(3); break; case 2: DrawECFrameInTilemapBuffer(sEasyChatGraphicsResources->bg1TilemapBuffer); DecompressAndLoadBgGfxUsingHeap(1, sTextInputFrame_Gfx, 0, 0, 0); CopyBgTilemapBufferToVram(1); break; case 3: PrintTitleText(); PrintECInstructionsText(); PrintECFields(); PutWin2TilemapAndCopyToVram(); break; case 4: LoadSpriteGfx(); CreateSelectDestFieldCursorSprite(); break; case 5: if (IsDma3ManagerBusyWithBgCopy()) { return TRUE; } else { SetRegWin0Coords(0, 0, 0, 0); SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(0, 63)); SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0, 59)); ShowBg(3); ShowBg(1); ShowBg(2); ShowBg(0); CreateVerticalScrollArrowSprites(); CreateStartSelectButtonsSprites(); } break; default: return FALSE; } sEasyChatGraphicsResources->state++; return TRUE; } void DestroyEasyChatGraphicsResources(void) { if (sEasyChatGraphicsResources) Free(sEasyChatGraphicsResources); } void EasyChatInterfaceCommand_Setup(u16 id) { sEasyChatGraphicsResources->id = id; sEasyChatGraphicsResources->state = 0; EasyChatInterfaceCommand_Run(); } bool8 EasyChatInterfaceCommand_Run(void) { switch (sEasyChatGraphicsResources->id) { case 0: return FALSE; case 1: return ECInterfaceCmd_01(); case 2: return ECInterfaceCmd_02(); case 3: return ECInterfaceCmd_03(); case 4: return ECInterfaceCmd_04(); case 5: return ECInterfaceCmd_05(); case 6: return ECInterfaceCmd_06(); case 7: return ECInterfaceCmd_07(); case 8: return ECInterfaceCmd_08(); case 9: return ECInterfaceCmd_09(); case 10: return ECInterfaceCmd_10(); case 11: return ECInterfaceCmd_11(); case 12: return ECInterfaceCmd_12(); case 13: return ECInterfaceCmd_13(); case 14: return ECInterfaceCmd_14(); case 15: return ECInterfaceCmd_15(); case 16: return ECInterfaceCmd_16(); case 17: return ECInterfaceCmd_17(); case 18: return ECInterfaceCmd_18(); case 19: return ECInterfaceCmd_19(); case 20: return ECInterfaceCmd_20(); case 21: return ECInterfaceCmd_21(); case 22: return ECInterfaceCmd_22(); default: return FALSE; } } static bool8 ECInterfaceCmd_01(void) { switch (sEasyChatGraphicsResources->state) { case 0: PrintECFields(); sEasyChatGraphicsResources->state++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool8 ECInterfaceCmd_02(void) { u32 i; u16 *ecWordBuffer; u16 *ecWord; u8 frameId; u8 cursorColumn, cursorRow, numColumns; s16 var1; int stringWidth; int trueStringWidth; int var2; u8 str[64]; ecWordBuffer = GetEasyChatWordBuffer(); frameId = GetEasyChatScreenFrameId(); cursorColumn = GetMainCursorColumn(); cursorRow = GetMainCursorRow(); numColumns = GetNumColumns(); ecWord = &ecWordBuffer[cursorRow * numColumns]; var1 = 8 * sPhraseFrameDimensions[frameId].left + 13; for (i = 0; i < cursorColumn; i++) { if (*ecWord == 0xFFFF) { stringWidth = GetStringWidth(FONT_NORMAL_COPY_1, sText_Underscore, 0) * 7; } else { CopyEasyChatWord(str, *ecWord); stringWidth = GetStringWidth(FONT_NORMAL_COPY_1, str, 0); } trueStringWidth = stringWidth + 17; var1 += trueStringWidth; ecWord++; } var2 = 8 * (sPhraseFrameDimensions[frameId].top + cursorRow * 2 + 1) + 1; SetSelectDestFieldCursorSpritePosAndResetAnim(var1, var2); return FALSE; } static bool8 ECInterfaceCmd_03(void) { u8 xOffset; switch (GetMainCursorColumn()) { case 0: xOffset = 28; break; case 1: xOffset = 115; break; case 2: xOffset = 191; break; default: return FALSE; } SetSelectDestFieldCursorSpritePosAndResetAnim(xOffset, 97); return FALSE; } static bool8 ECInterfaceCmd_05(void) { switch (sEasyChatGraphicsResources->state) { case 0: FreezeSelectDestFieldCursorSprite(); PrintECInterfaceTextById(2); EC_CreateYesNoMenuWithInitialCursorPos(1); sEasyChatGraphicsResources->state++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool8 ECInterfaceCmd_06(void) { switch (sEasyChatGraphicsResources->state) { case 0: FreezeSelectDestFieldCursorSprite(); PrintECInterfaceTextById(3); EC_CreateYesNoMenuWithInitialCursorPos(0); sEasyChatGraphicsResources->state++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool8 ECInterfaceCmd_04(void) { switch (sEasyChatGraphicsResources->state) { case 0: FreezeSelectDestFieldCursorSprite(); PrintECInterfaceTextById(1); EC_CreateYesNoMenuWithInitialCursorPos(1); sEasyChatGraphicsResources->state++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool8 ECInterfaceCmd_07(void) { switch (sEasyChatGraphicsResources->state) { case 0: UnfreezeSelectDestFieldCursorSprite(); PrintECInterfaceTextById(0); ShowBg(0); sEasyChatGraphicsResources->state++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool8 ECInterfaceCmd_08(void) { switch (sEasyChatGraphicsResources->state) { case 0: UnfreezeSelectDestFieldCursorSprite(); PrintECInterfaceTextById(0); PrintECFields(); sEasyChatGraphicsResources->state++; // Fall through case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool8 ECInterfaceCmd_09(void) { switch (sEasyChatGraphicsResources->state) { case 0: FreezeSelectDestFieldCursorSprite(); HideBg(0); SetRegWin0Coords(0, 0, 0, 0); PrintECGroupOrAlphaMenu(); sEasyChatGraphicsResources->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { StartWin2FrameAnim(0); sEasyChatGraphicsResources->state++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy() && !AnimateFrameResize()) sEasyChatGraphicsResources->state++; break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { CreateSelectGroupHelpSprite(); sEasyChatGraphicsResources->state++; } break; case 4: if (!AnimateSeletGroupModeAndHelpSpriteEnter()) { CreateRedRectangularCursorSpritePair(); UpdateVerticalScrollArrowSpriteXPos(0); UpdateVerticalScrollArrowVisibility(); sEasyChatGraphicsResources->state++; return FALSE; } break; default: return FALSE; } return TRUE; } static bool8 ECInterfaceCmd_10(void) { switch (sEasyChatGraphicsResources->state) { case 0: DestroyRedRectangularCursor(); StartModeIconHidingAnimation(); HideVerticalScrollArrowSprites(); sEasyChatGraphicsResources->state++; break; case 1: if (RunModeIconHidingAnimation() == TRUE) break; StartWin2FrameAnim(1); sEasyChatGraphicsResources->state++; // Fall through case 2: if (!AnimateFrameResize()) sEasyChatGraphicsResources->state++; break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { UnfreezeSelectDestFieldCursorSprite(); ShowBg(0); sEasyChatGraphicsResources->state++; } break; case 4: return FALSE; } return TRUE; } static bool8 ECInterfaceCmd_22(void) { switch (sEasyChatGraphicsResources->state) { case 0: DestroyRedRectangularCursor(); HideVerticalScrollArrowSprites(); ShrinkModeIconsSprite(); StartWin2FrameAnim(5); sEasyChatGraphicsResources->state++; break; case 1: if (!AnimateFrameResize() && !ModeIconsSpriteAnimIsEnded()) { PrintECGroupOrAlphaMenu(); sEasyChatGraphicsResources->state++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { StartWin2FrameAnim(6); ShowModeIconsSprite(); sEasyChatGraphicsResources->state++; } break; case 3: if (!AnimateFrameResize() && !ModeIconsSpriteAnimIsEnded()) { UpdateVerticalScrollArrowVisibility(); CreateRedRectangularCursorSpritePair(); sEasyChatGraphicsResources->state++; return FALSE; } break; case 4: return FALSE; } return TRUE; } static bool8 ECInterfaceCmd_14(void) { EC_MoveCursor(); return FALSE; } static bool8 ECInterfaceCmd_15(void) { switch (sEasyChatGraphicsResources->state) { case 0: ScheduleBg2VerticalScroll(1, 2); sEasyChatGraphicsResources->state++; // Fall through case 1: if (!AnimateBg2VerticalScroll()) { EC_MoveCursor(); UpdateVerticalScrollArrowVisibility(); return FALSE; } break; } return TRUE; } static bool8 ECInterfaceCmd_16(void) { switch (sEasyChatGraphicsResources->state) { case 0: ScheduleBg2VerticalScroll(-1, 2); sEasyChatGraphicsResources->state++; // Fall through case 1: if (!AnimateBg2VerticalScroll()) { UpdateVerticalScrollArrowVisibility(); sEasyChatGraphicsResources->state++; return FALSE; } break; case 2: return FALSE; } return TRUE; } static bool8 ECInterfaceCmd_11(void) { switch (sEasyChatGraphicsResources->state) { case 0: DestroyRedRectangularCursor(); StartModeIconHidingAnimation(); HideVerticalScrollArrowSprites(); sEasyChatGraphicsResources->state++; break; case 1: if (!RunModeIconHidingAnimation()) { ClearWin2AndCopyToVram(); sEasyChatGraphicsResources->state++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { StartWin2FrameAnim(2); sEasyChatGraphicsResources->state++; } break; case 3: if (!AnimateFrameResize()) { PrintECMenuById(2); sEasyChatGraphicsResources->state++; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) { CreateSelectWordCursorSprite(); UpdateVerticalScrollArrowSpriteXPos(1); UpdateVerticalScrollArrowVisibility(); UpdateStartSelectButtonSpriteVisibility(); sEasyChatGraphicsResources->state++; return FALSE; } break; case 5: return FALSE; } return TRUE; } static bool8 ECInterfaceCmd_12(void) { switch (sEasyChatGraphicsResources->state) { case 0: PrintECFields(); sEasyChatGraphicsResources->state++; break; case 1: DestroySelectWordCursorSprite(); HideVerticalScrollArrowSprites(); HideStartSelectButtonSprites(); ClearWin2AndCopyToVram(); sEasyChatGraphicsResources->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { StartWin2FrameAnim(3); sEasyChatGraphicsResources->state++; } break; case 3: if (!AnimateFrameResize()) { ShowBg(0); sEasyChatGraphicsResources->state++; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) { UnfreezeSelectDestFieldCursorSprite(); sEasyChatGraphicsResources->state++; return FALSE; } break; case 5: return FALSE; } return TRUE; } static bool8 ECInterfaceCmd_13(void) { switch (sEasyChatGraphicsResources->state) { case 0: DestroySelectWordCursorSprite(); HideVerticalScrollArrowSprites(); HideStartSelectButtonSprites(); ClearWin2AndCopyToVram(); sEasyChatGraphicsResources->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { StartWin2FrameAnim(4); sEasyChatGraphicsResources->state++; } break; case 2: if (!AnimateFrameResize()) { PrintECGroupOrAlphaMenu(); sEasyChatGraphicsResources->state++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { CreateSelectGroupHelpSprite(); sEasyChatGraphicsResources->state++; } break; case 4: if (!AnimateSeletGroupModeAndHelpSpriteEnter()) { CreateRedRectangularCursorSpritePair(); UpdateVerticalScrollArrowSpriteXPos(0); UpdateVerticalScrollArrowVisibility(); sEasyChatGraphicsResources->state++; return FALSE; } break; } return TRUE; } static bool8 ECInterfaceCmd_17(void) { SetSelectWordCursorSpritePos(); return FALSE; } static bool8 ECInterfaceCmd_19(void) { switch (sEasyChatGraphicsResources->state) { case 0: UpdateWin2PrintWordsScrollDown(); sEasyChatGraphicsResources->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { ScheduleBg2VerticalScroll(1, 2); sEasyChatGraphicsResources->state++; } break; case 2: if (!AnimateBg2VerticalScroll()) { SetSelectWordCursorSpritePos(); UpdateVerticalScrollArrowVisibility(); UpdateStartSelectButtonSpriteVisibility(); sEasyChatGraphicsResources->state++; return FALSE; } break; case 3: return FALSE; } return TRUE; } static bool8 ECInterfaceCmd_18(void) { switch (sEasyChatGraphicsResources->state) { case 0: UpdateWin2PrintWordsScrollUp(); sEasyChatGraphicsResources->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { ScheduleBg2VerticalScroll(-1, 2); sEasyChatGraphicsResources->state++; } break; case 2: if (!AnimateBg2VerticalScroll()) { UpdateVerticalScrollArrowVisibility(); UpdateStartSelectButtonSpriteVisibility(); sEasyChatGraphicsResources->state++; return FALSE; } break; case 3: return FALSE; } return TRUE; } static bool8 ECInterfaceCmd_21(void) { switch (sEasyChatGraphicsResources->state) { case 0: UpdateWin2PrintWordsScrollPageDown(); sEasyChatGraphicsResources->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { s16 direction = GetECSelectWordRowsAbove() - GetBg2ScrollRow(); ScheduleBg2VerticalScroll(direction, 4); sEasyChatGraphicsResources->state++; } break; case 2: if (!AnimateBg2VerticalScroll()) { SetSelectWordCursorSpritePos(); UpdateVerticalScrollArrowVisibility(); UpdateStartSelectButtonSpriteVisibility(); sEasyChatGraphicsResources->state++; return FALSE; } break; case 3: return FALSE; } return TRUE; } static bool8 ECInterfaceCmd_20(void) { switch (sEasyChatGraphicsResources->state) { case 0: UpdateWin2PrintWordsScrollPageUp(); sEasyChatGraphicsResources->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { s16 direction = GetECSelectWordRowsAbove() - GetBg2ScrollRow(); ScheduleBg2VerticalScroll(direction, 4); sEasyChatGraphicsResources->state++; } break; case 2: if (!AnimateBg2VerticalScroll()) { UpdateVerticalScrollArrowVisibility(); UpdateStartSelectButtonSpriteVisibility(); sEasyChatGraphicsResources->state++; return FALSE; } break; case 3: return FALSE; } return TRUE; } static bool8 InitEasyChatGraphicsWork_Internal(void) { sEasyChatGraphicsResources = Alloc(sizeof(*sEasyChatGraphicsResources)); if (sEasyChatGraphicsResources == NULL) return FALSE; sEasyChatGraphicsResources->state = 0; sEasyChatGraphicsResources->selectDestFieldCursorSprite = NULL; sEasyChatGraphicsResources->rectCursorSpriteRight = NULL; sEasyChatGraphicsResources->rectCursorSpriteLeft = NULL; sEasyChatGraphicsResources->selectWordCursorSprite = NULL; sEasyChatGraphicsResources->selectGroupHelpSprite = NULL; sEasyChatGraphicsResources->modeIconsSprite = NULL; sEasyChatGraphicsResources->upTriangleCursorSprite = NULL; sEasyChatGraphicsResources->downTriangleCursorSprite = NULL; sEasyChatGraphicsResources->startPgUpButtonSprite = NULL; sEasyChatGraphicsResources->selectPgDnButtonSprite = NULL; return TRUE; } static void SetGpuRegsForEasyChatInit(void) { ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); } static void LoadEasyChatPals(void) { ResetPaletteFade(); LoadPalette(gEasyChatWindow_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); LoadPalette(sTextInputFrameOrange_Pal, BG_PLTT_ID(1), sizeof(sTextInputFrameOrange_Pal)); LoadPalette(sTextInputFrameGreen_Pal, BG_PLTT_ID(4), sizeof(sTextInputFrameGreen_Pal)); LoadPalette(sTitleText_Pal, BG_PLTT_ID(10), sizeof(sTitleText_Pal)); LoadPalette(sText_Pal, BG_PLTT_ID(11), sizeof(sText_Pal)); LoadPalette(sText_Pal, BG_PLTT_ID(15), sizeof(sText_Pal)); LoadPalette(sText_Pal, BG_PLTT_ID(3), sizeof(sText_Pal)); } static void PrintTitleText(void) { int xOffset; const u8 *titleText = GetTitleText(); if (titleText == NULL) return; xOffset = (128 - GetStringWidth(FONT_NORMAL_COPY_1, titleText, 0)) / 2u; FillWindowPixelBuffer(0, PIXEL_FILL(0)); EC_AddTextPrinterParameterized2(0, FONT_NORMAL_COPY_1, titleText, xOffset, 0, TEXT_SKIP_DRAW, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); } static void EC_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)) { if (fontId == FONT_NORMAL_COPY_1) y += 2; AddTextPrinterParameterized(windowId, fontId, str, x, y, speed, callback); } static void EC_AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, u8 bg, u8 fg, u8 shadow) { u8 color[3]; if (fontId == FONT_NORMAL_COPY_1) y += 2; color[0] = bg; color[1] = fg; color[2] = shadow; AddTextPrinterParameterized3(windowId, fontId, x, y, color, speed, str); } static void PrintECInstructionsText(void) { FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17); LoadUserWindowGfx(1, 1, BG_PLTT_ID(14)); DrawTextBorderOuter(1, 1, 14); PrintECInterfaceTextById(0); PutWindowTilemap(1); CopyBgTilemapBufferToVram(0); } static void PrintECInterfaceTextById(u8 direction) { const u8 *text2 = NULL; const u8 *text1 = NULL; switch (direction) { case 0: GetEasyChatInstructionsText(&text1, &text2); break; case 2: GetEasyChatConfirmCancelText(&text1, &text2); break; case 3: GetEasyChatConfirmText(&text1, &text2); break; case 1: GetEasyChatConfirmDeletionText(&text1, &text2); break; } FillWindowPixelBuffer(1, PIXEL_FILL(1)); if (text1) EC_AddTextPrinterParameterized(1, FONT_NORMAL_COPY_1, text1, 0, 0, TEXT_SKIP_DRAW, NULL); if (text2) EC_AddTextPrinterParameterized(1, FONT_NORMAL_COPY_1, text2, 0, 16, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(1, COPYWIN_FULL); } static void EC_CreateYesNoMenuWithInitialCursorPos(u8 initialCursorPos) { CreateYesNoMenu(&sEasyChatYesNoWindowTemplate, FONT_NORMAL_COPY_1, 0, 2, 0x001, 14, initialCursorPos); } static void CreatePhraseFrameWindow(void) { u8 frameId; struct WindowTemplate template; frameId = GetEasyChatScreenFrameId(); template.bg = 3; template.tilemapLeft = sPhraseFrameDimensions[frameId].left; template.tilemapTop = sPhraseFrameDimensions[frameId].top; template.width = sPhraseFrameDimensions[frameId].width; template.height = sPhraseFrameDimensions[frameId].height; template.paletteNum = 11; template.baseBlock = 0x060; sEasyChatGraphicsResources->windowId = AddWindow(&template); PutWindowTilemap(sEasyChatGraphicsResources->windowId); } static void PrintECFields(void) { u16 *ecWord; u8 numColumns, numRows; u8 *str; u8 frameId; int i, j, k; ecWord = GetEasyChatWordBuffer(); numColumns = GetNumColumns(); numRows = GetNumRows(); frameId = GetEasyChatScreenFrameId(); FillWindowPixelBuffer(sEasyChatGraphicsResources->windowId, PIXEL_FILL(1)); for (i = 0; i < numRows; i++) { str = sEasyChatGraphicsResources->ecPrintBuffer; str[0] = EOS; str = StringAppend(str, sText_Clear17); for (j = 0; j < numColumns; j++) { if (*ecWord != 0xFFFF) { str = CopyEasyChatWord(str, *ecWord); ecWord++; } else { str = WriteColorChangeControlCode(str, 0, TEXT_COLOR_RED); ecWord++; for (k = 0; k < 7; k++) { *str++ = CHAR_EXTRA_SYMBOL; *str++ = CHAR_UNDERSCORE; } str = WriteColorChangeControlCode(str, 0, TEXT_COLOR_DARK_GRAY); } str = StringAppend(str, sText_Clear17); if (frameId == 2) { if (j == 0 && i == 4) break; } } *str = EOS; EC_AddTextPrinterParameterized(sEasyChatGraphicsResources->windowId, FONT_NORMAL_COPY_1, sEasyChatGraphicsResources->ecPrintBuffer, 0, i * 16, TEXT_SKIP_DRAW, NULL); } CopyWindowToVram(sEasyChatGraphicsResources->windowId, COPYWIN_FULL); } static void DrawECFrameInTilemapBuffer(u16 *tilemap) { u8 frameId; int right, bottom; int x, y; frameId = GetEasyChatScreenFrameId(); CpuFastFill(0, tilemap, BG_SCREEN_SIZE); if (frameId == 2) { right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width; bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height; for (y = sPhraseFrameDimensions[frameId].top; y < bottom; y++) { x = sPhraseFrameDimensions[frameId].left - 1; tilemap[y * 32 + x] = 0x1005; x++; for (; x < right; x++) tilemap[y * 32 + x] = 0x1000; tilemap[y* 32 + x] = 0x1007; } } else { y = sPhraseFrameDimensions[frameId].top - 1; x = sPhraseFrameDimensions[frameId].left - 1; right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width; bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height; tilemap[y * 32 + x] = 0x1001; x++; for (; x < right; x++) tilemap[y * 32 + x] = 0x1002; tilemap[y * 32 + x] = 0x1003; y++; for (; y < bottom; y++) { x = sPhraseFrameDimensions[frameId].left - 1; tilemap[y * 32 + x] = 0x1005; x++; for (; x < right; x++) tilemap[y * 32 + x] = 0x1000; tilemap[y* 32 + x] = 0x1007; } x = sPhraseFrameDimensions[frameId].left - 1; tilemap[y * 32 + x] = 0x1009; x++; for (; x < right; x++) tilemap[y * 32 + x] = 0x100A; tilemap[y * 32 + x] = 0x100B; } } static void PutWin2TilemapAndCopyToVram(void) { PutWindowTilemap(2); CopyBgTilemapBufferToVram(2); } static void PrintECMenuById(u32 id) { InitBg2Scroll(); FillWindowPixelBuffer(2, PIXEL_FILL(1)); switch (id) { case 0: PrintECGroupsMenu(); break; case 1: PrintEasyChatKeyboardText(); break; case 2: PrintECWordsMenu(); break; } CopyWindowToVram(2, COPYWIN_GFX); } static void PrintECGroupOrAlphaMenu(void) { if (!IsEasyChatAlphaMode()) PrintECMenuById(0); else PrintECMenuById(1); } static void PrintECGroupsMenu(void) { int i; int x, y; i = 0; y = 96; while (1) { for (x = 0; x < 2; x++) { u8 groupId = GetSelectedGroupByIndex(i++); if (groupId == EC_NUM_GROUPS) { ScheduleBg2VerticalScroll(GetECSelectGroupRowsAbove(), 0); return; } EC_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_1, GetEasyChatWordGroupName(groupId), x * 84 + 10, y, TEXT_SKIP_DRAW, NULL); } y += 16; } } static void PrintEasyChatKeyboardText(void) { u32 i; for (i = 0; i < ARRAY_COUNT(sEasyChatKeyboardAlphabet); i++) EC_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_1, sEasyChatKeyboardAlphabet[i], 10, 96 + i * 16, TEXT_SKIP_DRAW, NULL); } static void PrintECWordsMenu(void) { PrintECRowsWin2(0, 4); } static void UpdateWin2PrintWordsScrollDown(void) { u8 rowsAbove = GetECSelectWordRowsAbove() + 3; ClearECRowsWin2(rowsAbove, 1); PrintECRowsWin2(rowsAbove, 1); } static void UpdateWin2PrintWordsScrollUp(void) { u8 rowsAbove = GetECSelectWordRowsAbove(); ClearECRowsWin2(rowsAbove, 1); PrintECRowsWin2(rowsAbove, 1); } static void UpdateWin2PrintWordsScrollPageDown(void) { u8 row = GetECSelectWordRowsAbove(); u8 maxrow = row + 4; u8 numrowsplus1 = GetECSelectWordNumRows() + 1; if (maxrow > numrowsplus1) maxrow = numrowsplus1; if (row < maxrow) { u8 remrow = maxrow - row; ClearECRowsWin2(row, remrow); PrintECRowsWin2(row, remrow); } } static void UpdateWin2PrintWordsScrollPageUp(void) { u8 row = GetECSelectWordRowsAbove(); u8 maxrow = GetBg2ScrollRow(); if (row < maxrow) { u8 remrow = maxrow - row; ClearECRowsWin2(row, remrow); PrintECRowsWin2(row, remrow); } } static void PrintECRowsWin2(u8 row, u8 remrow) { int i, j; u16 easyChatWord; u8 *str; int y; u8 y_; int ecWordIdx; ecWordIdx = row * 2; y = (row * 16 + 96) & 0xFF; for (i = 0; i < remrow; i++) { for (j = 0; j < 2; j++) { // FIXME: Dumb trick needed to match y_ = y << 18 >> 18; easyChatWord = GetDisplayedWordByIndex(ecWordIdx++); if (easyChatWord != 0xFFFF) { CopyEasyChatWordPadded(sEasyChatGraphicsResources->ecPaddedWordBuffer, easyChatWord, 0); EC_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_1, sEasyChatGraphicsResources->ecPaddedWordBuffer, (j * 13 + 3) * 8, y_, TEXT_SKIP_DRAW, NULL); } } y += 16; } CopyWindowToVram(2, COPYWIN_GFX); } static void ClearECRowsWin2(u8 row, u8 remrow) { int y; int totalHeight; int heightWrappedAround; int heightToBottom; y = (row * 16 + 96) & 0xFF; heightToBottom = remrow * 16; totalHeight = y + heightToBottom; if (totalHeight > 255) { heightWrappedAround = totalHeight - 256; heightToBottom = 256 - y; } else { heightWrappedAround = 0; } FillWindowPixelRect(2, PIXEL_FILL(1), 0, y, 224, heightToBottom); if (heightWrappedAround) FillWindowPixelRect(2, PIXEL_FILL(1), 0, 0, 224, heightWrappedAround); } static void ClearWin2AndCopyToVram(void) { FillWindowPixelBuffer(2, PIXEL_FILL(1)); CopyWindowToVram(2, COPYWIN_GFX); } static void StartWin2FrameAnim(int animNo) { switch (animNo) { case 0: sEasyChatGraphicsResources->frameAnimIdx = 0; sEasyChatGraphicsResources->frameAnimTarget = 10; break; case 1: sEasyChatGraphicsResources->frameAnimIdx = 9; sEasyChatGraphicsResources->frameAnimTarget = 0; break; case 2: sEasyChatGraphicsResources->frameAnimIdx = 11; sEasyChatGraphicsResources->frameAnimTarget = 17; break; case 3: sEasyChatGraphicsResources->frameAnimIdx = 17; sEasyChatGraphicsResources->frameAnimTarget = 0; break; case 4: sEasyChatGraphicsResources->frameAnimIdx = 17; sEasyChatGraphicsResources->frameAnimTarget = 10; break; case 5: sEasyChatGraphicsResources->frameAnimIdx = 18; sEasyChatGraphicsResources->frameAnimTarget = 22; break; case 6: sEasyChatGraphicsResources->frameAnimIdx = 22; sEasyChatGraphicsResources->frameAnimTarget = 18; break; } sEasyChatGraphicsResources->frameAnimDelta = sEasyChatGraphicsResources->frameAnimIdx < sEasyChatGraphicsResources->frameAnimTarget ? 1 : -1; } static bool8 AnimateFrameResize(void) { if (sEasyChatGraphicsResources->frameAnimIdx == sEasyChatGraphicsResources->frameAnimTarget) return FALSE; sEasyChatGraphicsResources->frameAnimIdx += sEasyChatGraphicsResources->frameAnimDelta; RedrawFrameByIndex(sEasyChatGraphicsResources->frameAnimIdx); return sEasyChatGraphicsResources->frameAnimIdx != sEasyChatGraphicsResources->frameAnimTarget; } static void RedrawFrameByIndex(u8 direction) { FillBgTilemapBufferRect_Palette0(1, 0, 0, 10, 30, 10); switch (direction) { case 0: break; case 1: RedrawFrameByRect(11, 14, 3, 2); break; case 2: RedrawFrameByRect(9, 14, 7, 2); break; case 3: RedrawFrameByRect(7, 14, 11, 2); break; case 4: RedrawFrameByRect(5, 14, 15, 2); break; case 5: RedrawFrameByRect(3, 14, 19, 2); break; case 6: RedrawFrameByRect(1, 14, 23, 2); break; case 7: RedrawFrameByRect(1, 13, 23, 4); break; case 8: RedrawFrameByRect(1, 12, 23, 6); break; case 9: RedrawFrameByRect(1, 11, 23, 8); break; case 10: RedrawFrameByRect(1, 10, 23, 10); break; case 11: RedrawFrameByRect(1, 10, 24, 10); break; case 12: RedrawFrameByRect(1, 10, 25, 10); break; case 13: RedrawFrameByRect(1, 10, 26, 10); break; case 14: RedrawFrameByRect(1, 10, 27, 10); break; case 15: RedrawFrameByRect(1, 10, 28, 10); break; case 16: RedrawFrameByRect(1, 10, 29, 10); break; case 17: RedrawFrameByRect(0, 10, 30, 10); break; case 18: RedrawFrameByRect(1, 10, 23, 10); break; case 19: RedrawFrameByRect(1, 11, 23, 8); break; case 20: RedrawFrameByRect(1, 12, 23, 6); break; case 21: RedrawFrameByRect(1, 13, 23, 4); break; case 22: RedrawFrameByRect(1, 14, 23, 2); break; } CopyBgTilemapBufferToVram(1); } static void RedrawFrameByRect(int left, int top, int width, int height) { u16 *tilemap; int right; int bottom; int x, y; tilemap = sEasyChatGraphicsResources->bg1TilemapBuffer; right = left + width - 1; bottom = top + height - 1; x = left; y = top; tilemap[y * 32 + x] = 0x4001; x++; for (; x < right; x++) tilemap[y * 32 + x] = 0x4002; tilemap[y * 32 + x] = 0x4003; y++; for (; y < bottom; y++) { tilemap[y * 32 + left] = 0x4005; x = left + 1; for (; x < right; x++) tilemap[y * 32 + x] = 0x4000; tilemap[y * 32 + x] = 0x4007; } tilemap[y * 32 + left] = 0x4009; x = left + 1; for (; x < right; x++) tilemap[y * 32 + x] = 0x400A; tilemap[y * 32 + x] = 0x400B; SetRegWin0Coords((left + 1) * 8, (top + 1) * 8, (width - 2) * 8, (height - 2) * 8); } static void InitBg2Scroll(void) { ChangeBgY(2, 0x800, 0); sEasyChatGraphicsResources->bg2ScrollRow = 0; } static void ScheduleBg2VerticalScroll(s16 direction, u8 speed) { int bgY; s16 totalDelta; bgY = GetBgY(2); sEasyChatGraphicsResources->bg2ScrollRow += direction; totalDelta = direction * 16; bgY += totalDelta << 8; if (speed) { sEasyChatGraphicsResources->tgtBgY = bgY; sEasyChatGraphicsResources->deltaBgY = speed * 256; if (totalDelta < 0) sEasyChatGraphicsResources->deltaBgY = -sEasyChatGraphicsResources->deltaBgY; } else { ChangeBgY(2, bgY, 0); } } static bool8 AnimateBg2VerticalScroll(void) { int bgY; bgY = GetBgY(2); if (bgY == sEasyChatGraphicsResources->tgtBgY) { return FALSE; } else { ChangeBgY(2, sEasyChatGraphicsResources->deltaBgY, 1); return TRUE; } } static int GetBg2ScrollRow(void) { return sEasyChatGraphicsResources->bg2ScrollRow; } static void SetRegWin0Coords(u8 left, u8 top, u8 width, u8 height) { u16 horizontalDimensions = WIN_RANGE(left, left + width); u16 verticalDimensions = WIN_RANGE(top, top + height); SetGpuReg(REG_OFFSET_WIN0H, horizontalDimensions); SetGpuReg(REG_OFFSET_WIN0V, verticalDimensions); } static void LoadSpriteGfx(void) { u32 i; LoadSpriteSheets(sEasyChatSpriteSheets); LoadSpritePalettes(sEasyChatSpritePalettes); for (i = 0; i < NELEMS(sEasyChatCompressedSpriteSheets); i++) LoadCompressedSpriteSheet(&sEasyChatCompressedSpriteSheets[i]); } static void CreateSelectDestFieldCursorSprite(void) { u8 frameId = GetEasyChatScreenFrameId(); s16 x = sPhraseFrameDimensions[frameId].left * 8 + 13; s16 y = (sPhraseFrameDimensions[frameId].top + 1) * 8 + 1; u8 spriteId = CreateSprite(&sSpriteTemplate_TriangleCursor, x, y, 2); sEasyChatGraphicsResources->selectDestFieldCursorSprite = &gSprites[spriteId]; gSprites[spriteId].data[1] = 1; } static void SpriteCB_BounceCursor(struct Sprite *sprite) { if (sprite->data[1]) { if (++sprite->data[0] > 2) { sprite->data[0] = 0; if (++sprite->x2 > 0) sprite->x2 = -6; } } } static void SetSelectDestFieldCursorSpritePosAndResetAnim(u8 x, u8 y) { sEasyChatGraphicsResources->selectDestFieldCursorSprite->x = x; sEasyChatGraphicsResources->selectDestFieldCursorSprite->y = y; sEasyChatGraphicsResources->selectDestFieldCursorSprite->x2 = 0; sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[0] = 0; } static void FreezeSelectDestFieldCursorSprite(void) { sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[0] = 0; sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[1] = 0; sEasyChatGraphicsResources->selectDestFieldCursorSprite->x2 = 0; } static void UnfreezeSelectDestFieldCursorSprite(void) { sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[1] = 1; } static void CreateRedRectangularCursorSpritePair(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_RectangleCursor, 0, 0, 3); sEasyChatGraphicsResources->rectCursorSpriteRight = &gSprites[spriteId]; sEasyChatGraphicsResources->rectCursorSpriteRight->x2 = 32; spriteId = CreateSprite(&sSpriteTemplate_RectangleCursor, 0, 0, 3); sEasyChatGraphicsResources->rectCursorSpriteLeft = &gSprites[spriteId]; sEasyChatGraphicsResources->rectCursorSpriteLeft->x2 = -32; sEasyChatGraphicsResources->rectCursorSpriteRight->hFlip = TRUE; EC_MoveCursor(); } static void DestroyRedRectangularCursor(void) { DestroySprite(sEasyChatGraphicsResources->rectCursorSpriteRight); sEasyChatGraphicsResources->rectCursorSpriteRight = NULL; DestroySprite(sEasyChatGraphicsResources->rectCursorSpriteLeft); sEasyChatGraphicsResources->rectCursorSpriteLeft = NULL; } static void EC_MoveCursor(void) { u8 x; u8 y; if (sEasyChatGraphicsResources->rectCursorSpriteRight && sEasyChatGraphicsResources->rectCursorSpriteLeft) { GetECSelectGroupCursorCoords(&x, &y); if (!IsEasyChatAlphaMode()) MoveCursor_Group(x, y); else MoveCursor_Alpha(x, y); } } static void MoveCursor_Group(s8 x, s8 y) { if (x != -1) { StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, RECTCURSOR_ANIM_ON_GROUP); sEasyChatGraphicsResources->rectCursorSpriteRight->x = x * 84 + 58; sEasyChatGraphicsResources->rectCursorSpriteRight->y = y * 16 + 96; StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, RECTCURSOR_ANIM_ON_GROUP); sEasyChatGraphicsResources->rectCursorSpriteLeft->x = x * 84 + 58; sEasyChatGraphicsResources->rectCursorSpriteLeft->y = y * 16 + 96; } else { StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, RECTCURSOR_ANIM_ON_BUTTON); sEasyChatGraphicsResources->rectCursorSpriteRight->x = 216; sEasyChatGraphicsResources->rectCursorSpriteRight->y = y * 16 + 112; StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, RECTCURSOR_ANIM_ON_BUTTON); sEasyChatGraphicsResources->rectCursorSpriteLeft->x = 216; sEasyChatGraphicsResources->rectCursorSpriteLeft->y = y * 16 + 112; } } static void MoveCursor_Alpha(s8 cursorX, s8 cursorY) { int anim; int x, y; if (cursorX != -1) { y = cursorY * 16 + 96; x = 32; if (cursorX == 6 && cursorY == 0) { x = 157; anim = RECTCURSOR_ANIM_ON_OTHERS; } else { x += sAlphabetKeyboardColumnOffsets[cursorX < ARRAY_COUNT(sAlphabetKeyboardColumnOffsets) ? cursorX : 0]; anim = RECTCURSOR_ANIM_ON_LETTER; } StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, anim); sEasyChatGraphicsResources->rectCursorSpriteRight->x = x; sEasyChatGraphicsResources->rectCursorSpriteRight->y = y; StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, anim); sEasyChatGraphicsResources->rectCursorSpriteLeft->x = x; sEasyChatGraphicsResources->rectCursorSpriteLeft->y = y; } else { StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, RECTCURSOR_ANIM_ON_BUTTON); sEasyChatGraphicsResources->rectCursorSpriteRight->x = 216; sEasyChatGraphicsResources->rectCursorSpriteRight->y = cursorY * 16 + 112; StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, RECTCURSOR_ANIM_ON_BUTTON); sEasyChatGraphicsResources->rectCursorSpriteLeft->x = 216; sEasyChatGraphicsResources->rectCursorSpriteLeft->y = cursorY * 16 + 112; } } static void CreateSelectWordCursorSprite(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_TriangleCursor, 0, 0, 4); sEasyChatGraphicsResources->selectWordCursorSprite = &gSprites[spriteId]; sEasyChatGraphicsResources->selectWordCursorSprite->callback = SpriteCB_SelectWordCursorSprite; sEasyChatGraphicsResources->selectWordCursorSprite->oam.priority = 2; SetSelectWordCursorSpritePos(); } static void SpriteCB_SelectWordCursorSprite(struct Sprite *sprite) { if (++sprite->data[0] > 2) { sprite->data[0] = 0; if (++sprite->x2 > 0) sprite->x2 = -6; } } static void SetSelectWordCursorSpritePos(void) { s8 cursorX, cursorY; u8 x, y; GetECSelectWordCursorCoords(&cursorX, &cursorY); x = cursorX * 13 + 3; y = cursorY * 2 + 11; SetSelectWordCursorSpritePosExplicit(x, y); } static void SetSelectWordCursorSpritePosExplicit(u8 x, u8 y) { if (sEasyChatGraphicsResources->selectWordCursorSprite) { sEasyChatGraphicsResources->selectWordCursorSprite->x = x * 8 + 4; sEasyChatGraphicsResources->selectWordCursorSprite->y = (y + 1) * 8 + 1; sEasyChatGraphicsResources->selectWordCursorSprite->x2 = 0; sEasyChatGraphicsResources->selectWordCursorSprite->data[0] = 0; } } static void DestroySelectWordCursorSprite(void) { if (sEasyChatGraphicsResources->selectWordCursorSprite) { DestroySprite(sEasyChatGraphicsResources->selectWordCursorSprite); sEasyChatGraphicsResources->selectWordCursorSprite = NULL; } } static void CreateSelectGroupHelpSprite(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_ButtonWindow, 208, 128, 6); sEasyChatGraphicsResources->selectGroupHelpSprite = &gSprites[spriteId]; sEasyChatGraphicsResources->selectGroupHelpSprite->x2 = -64; spriteId = CreateSprite(&sSpriteTemplate_ModeWindow, 208, 80, 5); sEasyChatGraphicsResources->modeIconsSprite = &gSprites[spriteId]; sEasyChatGraphicsResources->modeIconState = 0; } static bool8 AnimateSeletGroupModeAndHelpSpriteEnter(void) { switch (sEasyChatGraphicsResources->modeIconState) { default: return FALSE; case 0: sEasyChatGraphicsResources->selectGroupHelpSprite->x2 += 8; if (sEasyChatGraphicsResources->selectGroupHelpSprite->x2 >= 0) { sEasyChatGraphicsResources->selectGroupHelpSprite->x2 = 0; if (!IsEasyChatAlphaMode()) StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_GROUP); else StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_ALPHABET); sEasyChatGraphicsResources->modeIconState++; } break; case 1: if (sEasyChatGraphicsResources->modeIconsSprite->animEnded) { sEasyChatGraphicsResources->modeIconState = 2; return FALSE; } } return TRUE; } static void StartModeIconHidingAnimation(void) { sEasyChatGraphicsResources->modeIconState = 0; StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_HIDDEN); } static bool8 RunModeIconHidingAnimation(void) { switch (sEasyChatGraphicsResources->modeIconState) { default: return FALSE; case 0: if (sEasyChatGraphicsResources->modeIconsSprite->animEnded) sEasyChatGraphicsResources->modeIconState = 1; break; case 1: sEasyChatGraphicsResources->selectGroupHelpSprite->x2 -= 8; if (sEasyChatGraphicsResources->selectGroupHelpSprite->x2 <= -64) { DestroySprite(sEasyChatGraphicsResources->modeIconsSprite); DestroySprite(sEasyChatGraphicsResources->selectGroupHelpSprite); sEasyChatGraphicsResources->modeIconsSprite = NULL; sEasyChatGraphicsResources->selectGroupHelpSprite = NULL; sEasyChatGraphicsResources->modeIconState++; return FALSE; } } return TRUE; } static void ShrinkModeIconsSprite(void) { StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TRANSITION); } static void ShowModeIconsSprite(void) { if (!IsEasyChatAlphaMode()) StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_GROUP); else StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_ALPHABET); } static bool8 ModeIconsSpriteAnimIsEnded(void) { return !sEasyChatGraphicsResources->modeIconsSprite->animEnded; } static void CreateVerticalScrollArrowSprites(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_ScrollIndicator, 96, 80, 0); if (spriteId != MAX_SPRITES) sEasyChatGraphicsResources->upTriangleCursorSprite = &gSprites[spriteId]; spriteId = CreateSprite(&sSpriteTemplate_ScrollIndicator, 96, 156, 0); if (spriteId != MAX_SPRITES) { sEasyChatGraphicsResources->downTriangleCursorSprite = &gSprites[spriteId]; sEasyChatGraphicsResources->downTriangleCursorSprite->vFlip = TRUE; } HideVerticalScrollArrowSprites(); } static void UpdateVerticalScrollArrowVisibility(void) { sEasyChatGraphicsResources->upTriangleCursorSprite->invisible = !ShouldDrawECUpArrow(); sEasyChatGraphicsResources->downTriangleCursorSprite->invisible = !ShouldDrawECDownArrow(); } static void HideVerticalScrollArrowSprites(void) { sEasyChatGraphicsResources->upTriangleCursorSprite->invisible = TRUE; sEasyChatGraphicsResources->downTriangleCursorSprite->invisible = TRUE; } static void UpdateVerticalScrollArrowSpriteXPos(int direction) { if (!direction) { // Group select sEasyChatGraphicsResources->upTriangleCursorSprite->x = 96; sEasyChatGraphicsResources->downTriangleCursorSprite->x = 96; } else { // Word select sEasyChatGraphicsResources->upTriangleCursorSprite->x = 120; sEasyChatGraphicsResources->downTriangleCursorSprite->x = 120; } } static void CreateStartSelectButtonsSprites(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_StartSelectButtons, 220, 84, 1); if (spriteId != MAX_SPRITES) sEasyChatGraphicsResources->startPgUpButtonSprite = &gSprites[spriteId]; spriteId = CreateSprite(&sSpriteTemplate_StartSelectButtons, 220, 156, 1); if (spriteId != MAX_SPRITES) { sEasyChatGraphicsResources->selectPgDnButtonSprite = &gSprites[spriteId]; StartSpriteAnim(sEasyChatGraphicsResources->selectPgDnButtonSprite, 1); } HideStartSelectButtonSprites(); } static void UpdateStartSelectButtonSpriteVisibility(void) { sEasyChatGraphicsResources->startPgUpButtonSprite->invisible = !ShouldDrawECUpArrow(); sEasyChatGraphicsResources->selectPgDnButtonSprite->invisible = !ShouldDrawECDownArrow(); } static void HideStartSelectButtonSprites(void) { sEasyChatGraphicsResources->startPgUpButtonSprite->invisible = TRUE; sEasyChatGraphicsResources->selectPgDnButtonSprite->invisible = TRUE; } static void CreateFooterWindow(void) { u16 windowId; struct WindowTemplate template; template.bg = 3; template.tilemapLeft = 4; template.tilemapTop = 11; template.width = 24; template.height = 2; template.paletteNum = 11; template.baseBlock = 0x030; windowId = AddWindow(&template); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); EC_AddTextPrinterParameterized(windowId, FONT_NORMAL_COPY_1, gText_DelAllCancelOk, 0, 0, 0, NULL); PutWindowTilemap(windowId); } ================================================ FILE: src/ereader_helpers.c ================================================ #include "global.h" #include "link.h" #include "ereader_helpers.h" struct SendRecvMgr { u8 master_slave; // 0: clock slave; 1: clock master u8 state; // EREADER_XFR_STATE_* u8 xferState; // EREADER_XFER_* u8 checksumResult; // EREADER_CHECKSUM_* u8 cancellationReason; // EREADER_CANCEL_* u32 * dataptr; // Payload source or destination int cursor; // Index of the next word int size; // Last word index u32 checksum; // Validation checksum }; static bool16 DetermineSendRecvState(u8); static void SetUpTransferManager(size_t, const void *, void *); static void StartTm3(void); static void EnableSio(void); static void DisableTm3(void); static void GetKeyInput(void); static struct SendRecvMgr sSendRecvMgr; static u16 sJoyNewOrRepeated; static u16 sJoyNew; static u16 sSendRecvStatus; static u16 sCounter1; static u32 sCounter2; static u16 sSavedIme; static u16 sSavedIe; static u16 sSavedTm3Cnt; static u16 sSavedSioCnt; static u16 sSavedRCnt; int EReader_Send(size_t size, const void *src) { int result; EReaderHelper_SaveRegsState(); while (1) { GetKeyInput(); if (TEST_BUTTON(sJoyNew, B_BUTTON)) gShouldAdvanceLinkState = 2; sSendRecvStatus = EReaderHandleTransfer(1, size, src, NULL); if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off { result = 0; break; } else if (sSendRecvStatus & 8) // cancelled by player { result = 1; break; } else if (sSendRecvStatus & 4) // timed out { result = 2; break; } else { gShouldAdvanceLinkState = 0; VBlankIntrWait(); } } CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr)); EReaderHelper_RestoreRegsState(); return result; } int EReader_Recv(void *dest) { int result; EReaderHelper_SaveRegsState(); while (1) { GetKeyInput(); if (TEST_BUTTON(sJoyNew, B_BUTTON)) gShouldAdvanceLinkState = 2; sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, dest); if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off { result = 0; break; } else if (sSendRecvStatus & 8) // cancelled by player { result = 1; break; } else if (sSendRecvStatus & 4) // timed out { result = 2; break; } else { gShouldAdvanceLinkState = 0; VBlankIntrWait(); } } CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr)); EReaderHelper_RestoreRegsState(); return result; } static void CloseSerial(void) { REG_IME = 0; REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); REG_IME = 1; REG_SIOCNT = 0; REG_TM3CNT_H = 0; REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL; } static void OpenSerialMulti(void) { REG_IME = 0; REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); REG_IME = 1; REG_RCNT = 0; REG_SIOCNT = SIO_MULTI_MODE; REG_SIOCNT |= SIO_INTR_ENABLE | SIO_115200_BPS; REG_IME = 0; REG_IE |= INTR_FLAG_SERIAL; REG_IME = 1; if (sSendRecvMgr.state == 0) CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr)); } static void OpenSerial32(void) { REG_RCNT = 0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE; REG_SIOCNT |= SIO_MULTI_SD; gShouldAdvanceLinkState = 0; sCounter1 = 0; sCounter2 = 0; } u16 EReaderHandleTransfer(u8 mode, size_t size, const void *data, void *recvBuffer) { switch (sSendRecvMgr.state) { case EREADER_XFR_STATE_INIT: OpenSerialMulti(); sSendRecvMgr.xferState = EREADER_XFER_EXE; sSendRecvMgr.state = EREADER_XFR_STATE_HANDSHAKE; break; case EREADER_XFR_STATE_HANDSHAKE: if (DetermineSendRecvState(mode)) EnableSio(); if (gShouldAdvanceLinkState == 2) { sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY; sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } // Progression is handled by the serial callback break; case EREADER_XFR_STATE_START: OpenSerial32(); SetUpTransferManager(size, data, recvBuffer); sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER; // fallthrough case EREADER_XFR_STATE_TRANSFER: if (gShouldAdvanceLinkState == 2) { sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY; sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } else { sCounter1++; sCounter2++; if (sSendRecvMgr.master_slave == 0 && sCounter2 > 60) { sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT; sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } if (sSendRecvMgr.xferState != EREADER_XFER_CHK) { if (sSendRecvMgr.master_slave != 0 && sCounter1 > 2) { EnableSio(); sSendRecvMgr.xferState = EREADER_XFER_CHK; } else { EnableSio(); sSendRecvMgr.xferState = EREADER_XFER_CHK; } } } // Progression is handled by the serial callback break; case EREADER_XFR_STATE_TRANSFER_DONE: OpenSerialMulti(); sSendRecvMgr.state = EREADER_XFR_STATE_CHECKSUM; break; case EREADER_XFR_STATE_CHECKSUM: if (sSendRecvMgr.master_slave == 1 && sCounter1 > 2) EnableSio(); if (++sCounter1 > 60) { sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT; sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } break; // Progression is handled by the serial callback case EREADER_XFR_STATE_DONE: if (sSendRecvMgr.xferState != 0) { CloseSerial(); sSendRecvMgr.xferState = 0; } break; } return (sSendRecvMgr.xferState << EREADER_XFER_SHIFT) | (sSendRecvMgr.cancellationReason << EREADER_CANCEL_SHIFT) | (sSendRecvMgr.checksumResult << EREADER_CHECKSUM_SHIFT); } static bool16 DetermineSendRecvState(u8 mode) { bool16 resp; if ((*(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SI | SIO_MULTI_SD)) == SIO_MULTI_SD && mode) resp = sSendRecvMgr.master_slave = TRUE; else resp = sSendRecvMgr.master_slave = FALSE; return resp; } static void SetUpTransferManager(size_t size, const void *data, void *recvBuffer) { if (sSendRecvMgr.master_slave) { REG_SIOCNT |= SIO_38400_BPS; sSendRecvMgr.dataptr = (void *)data; REG_SIODATA32 = size; sSendRecvMgr.size = size / 4 + 1; StartTm3(); } else { REG_SIOCNT |= SIO_9600_BPS; sSendRecvMgr.dataptr = recvBuffer; } } static void StartTm3(void) { REG_TM3CNT_L = -601; REG_TM3CNT_H = TIMER_INTR_ENABLE; REG_IME = 0; REG_IE |= INTR_FLAG_TIMER3; REG_IME = 1; } void EReaderHelper_Timer3Callback(void) { DisableTm3(); EnableSio(); } void EReaderHelper_SerialCallback(void) { u16 recv[4]; u16 i; u16 cnt1; u16 cnt2; u32 recv32; switch (sSendRecvMgr.state) { case EREADER_XFR_STATE_HANDSHAKE: REG_SIOMLT_SEND = 0xCCD0; *(u64 *)recv = REG_SIOMLT_RECV; for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++) { if (recv[i] == 0xCCD0) cnt1++; else if (recv[i] != 0xFFFF) cnt2++; } if (cnt1 == 2 && cnt2 == 0) sSendRecvMgr.state = EREADER_XFR_STATE_START; break; // Progression is handled by software case EREADER_XFR_STATE_TRANSFER: recv32 = REG_SIODATA32; // The first value sent by the EReader is the payload size if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.master_slave == 0) sSendRecvMgr.size = recv32 / 4 + 1; if (sSendRecvMgr.master_slave == 1) { // Send mode if (sSendRecvMgr.cursor < sSendRecvMgr.size) { REG_SIODATA32 = sSendRecvMgr.dataptr[sSendRecvMgr.cursor]; sSendRecvMgr.checksum += sSendRecvMgr.dataptr[sSendRecvMgr.cursor]; } else REG_SIODATA32 = sSendRecvMgr.checksum; } else { // Receive mode if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1) { // Receive next word sSendRecvMgr.dataptr[sSendRecvMgr.cursor - 1] = recv32; sSendRecvMgr.checksum += recv32; } else if (sSendRecvMgr.cursor != 0) { // Reached the end, test the received checksum if (sSendRecvMgr.checksum == recv32) sSendRecvMgr.checksumResult = EREADER_CHECKSUM_OK; else sSendRecvMgr.checksumResult = EREADER_CHECKSUM_ERR; } sCounter2 = 0; } sSendRecvMgr.cursor++; if (sSendRecvMgr.cursor < sSendRecvMgr.size + 2) { if (sSendRecvMgr.master_slave != 0) // Clock master; start timer REG_TM3CNT_H |= TIMER_ENABLE; else // Clock slave; reset EnableSio(); } else { sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER_DONE; sCounter1 = 0; } break; // Progression is handled by the software case EREADER_XFR_STATE_CHECKSUM: if (sSendRecvMgr.master_slave == 0) // Clock slave REG_SIODATA8 = sSendRecvMgr.checksumResult; *(vu64 *)recv = REG_SIOMLT_RECV; if (recv[1] == EREADER_CHECKSUM_OK || recv[1] == EREADER_CHECKSUM_ERR) { if (sSendRecvMgr.master_slave == 1) // EReader has (in)validated the payload sSendRecvMgr.checksumResult = recv[1]; sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } break; } } static void EnableSio(void) { REG_SIOCNT |= SIO_ENABLE; } static void DisableTm3(void) { REG_TM3CNT_H &= ~TIMER_ENABLE; REG_TM3CNT_L = -601; } static void GetKeyInput(void) { u16 rawKeys = REG_KEYINPUT ^ 0x3FF; sJoyNew = rawKeys & ~sJoyNewOrRepeated; sJoyNewOrRepeated = rawKeys; } void EReaderHelper_SaveRegsState(void) { sSavedIme = REG_IME; sSavedIe = REG_IE; sSavedTm3Cnt = REG_TM3CNT_H; sSavedSioCnt = REG_SIOCNT; sSavedRCnt = REG_RCNT; } void EReaderHelper_RestoreRegsState(void) { REG_IME = sSavedIme; REG_IE = sSavedIe; REG_TM3CNT_H = sSavedTm3Cnt; REG_SIOCNT = sSavedSioCnt; REG_RCNT = sSavedRCnt; } void EReaderHelper_ClearsSendRecvMgr(void) { CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr)); } ================================================ FILE: src/ereader_screen.c ================================================ #include "global.h" #include "malloc.h" #include "decompress.h" #include "ereader_helpers.h" #include "link.h" #include "main.h" #include "mystery_gift_menu.h" #include "mystery_gift_client.h" #include "save.h" #include "sound.h" #include "sprite.h" #include "task.h" #include "strings.h" #include "util.h" #include "cereader_tool.h" #include "help_system.h" #include "constants/songs.h" struct EReaderTaskData { u16 timer; u16 unused1; u16 unused2; u16 unused3; u8 state; u8 textState; u8 unused4; u8 unused5; u8 unused6; u8 unused7; u8 status; u8 *unusedBuffer; }; struct EReaderData { u16 status; size_t size; const void *data; }; static void Task_EReader(u8); struct EReaderData gEReaderData; extern const u8 gMultiBootProgram_EReader_Start[]; extern const u8 gMultiBootProgram_EReader_End[]; static void EReader_Load(struct EReaderData *eReader, size_t size, const void *data) { vu16 imeBak = REG_IME; REG_IME = 0; gIntrTable[1] = EReaderHelper_SerialCallback; gIntrTable[2] = EReaderHelper_Timer3Callback; EReaderHelper_SaveRegsState(); EReaderHelper_ClearsSendRecvMgr(); REG_IE |= INTR_FLAG_VCOUNT; REG_IME = imeBak; eReader->status = 0; eReader->size = size; eReader->data = data; } static void EReader_Reset(struct EReaderData *eReader) { vu16 imeBak = REG_IME; REG_IME = 0; EReaderHelper_ClearsSendRecvMgr(); EReaderHelper_RestoreRegsState(); RestoreSerialTimer3IntrHandlers(); REG_IME = imeBak; } // Return values for EReader_Transfer enum { TRANSFER_ACTIVE, TRANSFER_SUCCESS, TRANSFER_CANCELED, TRANSFER_TIMEOUT, }; static u8 EReader_Transfer(struct EReaderData *eReader) { u8 transferStatus = TRANSFER_ACTIVE; eReader->status = EReaderHandleTransfer(TRUE, eReader->size, eReader->data, NULL); if ((eReader->status & EREADER_XFER_MASK) == 0 && eReader->status & EREADER_CHECKSUM_OK_MASK) transferStatus = TRANSFER_SUCCESS; if (eReader->status & EREADER_CANCEL_KEY_MASK) transferStatus = TRANSFER_CANCELED; if (eReader->status & EREADER_CANCEL_TIMEOUT_MASK) transferStatus = TRANSFER_TIMEOUT; gShouldAdvanceLinkState = 0; return transferStatus; } static void OpenEReaderLink(void) { memset(gDecompressionBuffer, 0, 0x2000); gLinkType = LINKTYPE_EREADER_FRLG; OpenLink(); SetSuppressLinkErrorMessage(TRUE); } static bool32 ValidateEReaderConnection(void) { vu16 imeBak = REG_IME; u16 handshakes[MAX_LINK_PLAYERS]; REG_IME = 0; *(u64 *)handshakes = *(u64 *)gLink.tempRecvBuffer; REG_IME = imeBak; // Validate that we are player 1, the EReader is player 2, // and that players 3 and 4 are empty. if (handshakes[0] == SLAVE_HANDSHAKE && handshakes[1] == EREADER_HANDSHAKE && handshakes[2] == 0xFFFF && handshakes[3] == 0xFFFF) return TRUE; return FALSE; } static bool32 IsEReaderConnectionSane(void) { if (IsLinkMaster() && GetLinkPlayerCount_2() == 2) return TRUE; return FALSE; } // States for TryReceiveCard enum { RECV_STATE_INIT, RECV_STATE_WAIT_START, RECV_STATE_START, RECV_STATE_EXCHANGE, RECV_STATE_START_DISCONNECT, RECV_STATE_WAIT_DISCONNECT, }; // Return values for TryReceiveCard enum { RECV_ACTIVE, RECV_CANCELED, RECV_SUCCESS, RECV_ERROR, RECV_DISCONNECTED, RECV_TIMEOUT, }; static u32 TryReceiveCard(u8 * state, u16 * timer) { if ((*state == RECV_STATE_EXCHANGE || *state == RECV_STATE_START_DISCONNECT || *state == RECV_STATE_WAIT_DISCONNECT) && HasLinkErrorOccurred()) { // Return error status if an error occurs // during the link exchange. *state = 0; return RECV_ERROR; } switch (*state) { case RECV_STATE_INIT: if (IsLinkMaster() && GetLinkPlayerCount_2() > 1) { *state = RECV_STATE_WAIT_START; } else if (JOY_NEW(B_BUTTON)) { *state = 0; return RECV_CANCELED; } break; case RECV_STATE_WAIT_START: if (++(*timer) > 5) { *timer = 0; *state = RECV_STATE_START; } break; case RECV_STATE_START: if (GetLinkPlayerCount_2() == 2) { PlaySE(SE_DING_DONG); CheckShouldAdvanceLinkState(); *timer = 0; *state = RECV_STATE_EXCHANGE; } else if (JOY_NEW(B_BUTTON)) { *state = 0; return RECV_CANCELED; } break; case RECV_STATE_EXCHANGE: if (++(*timer) > 30) { *state = 0; return RECV_TIMEOUT; } if (IsLinkConnectionEstablished()) { if (gReceivedRemoteLinkPlayers) { if (IsLinkPlayerDataExchangeComplete()) { *state = 0; return RECV_SUCCESS; } else *state = RECV_STATE_START_DISCONNECT; } else *state = RECV_STATE_EXCHANGE; } break; case RECV_STATE_START_DISCONNECT: SetCloseLinkCallbackAndType(0); *state = RECV_STATE_WAIT_DISCONNECT; break; case RECV_STATE_WAIT_DISCONNECT: if (!gReceivedRemoteLinkPlayers) { *state = 0; return RECV_DISCONNECTED; } break; } return RECV_ACTIVE; } void CreateEReaderTask(void) { u8 taskId = CreateTask(Task_EReader, 0); struct EReaderTaskData *data = (struct EReaderTaskData *)gTasks[taskId].data; data->state = 0; data->textState = 0; data->unused4 = 0; data->unused5 = 0; data->unused6 = 0; data->unused7 = 0; data->timer = 0; data->unused1 = 0; data->unused2 = 0; data->unused3 = 0; data->status = 0; data->unusedBuffer = AllocZeroed(CLIENT_MAX_MSG_SIZE); } static void ResetTimer(u16 *timer) { *timer = 0; } static bool32 UpdateTimer(u16 * timer, u16 time) { if (++(*timer) > time) { // Timer has finished *timer = 0; return TRUE; } return FALSE; } // States for Task_EReader enum { ER_STATE_START, ER_STATE_INIT_LINK, ER_STATE_INIT_LINK_WAIT, ER_STATE_INIT_LINK_CHECK, ER_STATE_MSG_SELECT_CONNECT, ER_STATE_MSG_SELECT_CONNECT_WAIT, ER_STATE_TRY_LINK, ER_STATE_INCORRECT_LINK, ER_STATE_CONNECTING, ER_STATE_TRANSFER, ER_STATE_TRANSFER_END, ER_STATE_TRANSFER_SUCCESS, ER_STATE_LOAD_CARD_START, ER_STATE_LOAD_CARD, ER_STATE_WAIT_RECV_CARD, ER_STATE_VALIDATE_CARD, ER_STATE_WAIT_DISCONNECT, ER_STATE_SAVE, ER_STATE_SUCCESS_MSG, ER_STATE_SUCCESS_END, ER_STATE_LINK_ERROR, ER_STATE_LINK_ERROR_TRY_AGAIN, ER_STATE_SAVE_FAILED, ER_STATE_CANCELED_CARD_READ, ER_STATE_UNUSED_1, ER_STATE_UNUSED_2, ER_STATE_END, }; static void Task_EReader(u8 taskId) { struct EReaderTaskData *data = (struct EReaderTaskData *)gTasks[taskId].data; switch (data->state) { case ER_STATE_START: if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_ReceiveMysteryGiftWithEReader)) data->state = ER_STATE_INIT_LINK; break; case ER_STATE_INIT_LINK: OpenEReaderLink(); ResetTimer(&data->timer); data->state = ER_STATE_INIT_LINK_WAIT; break; case ER_STATE_INIT_LINK_WAIT: if (UpdateTimer(&data->timer, 10)) data->state = ER_STATE_INIT_LINK_CHECK; break; case ER_STATE_INIT_LINK_CHECK: if (!IsEReaderConnectionSane()) { CloseLink(); data->state = ER_STATE_MSG_SELECT_CONNECT; } else data->state = ER_STATE_LOAD_CARD; break; case ER_STATE_MSG_SELECT_CONNECT: if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_SelectConnectFromEReaderMenu)) { AddTextPrinterToWindow1(gJPText_SelectConnectWithGBA); ResetTimer(&data->timer); data->state = ER_STATE_MSG_SELECT_CONNECT_WAIT; } break; case ER_STATE_MSG_SELECT_CONNECT_WAIT: if (UpdateTimer(&data->timer, 90)) { OpenEReaderLink(); data->state = ER_STATE_TRY_LINK; } else if (JOY_NEW(B_BUTTON)) { ResetTimer(&data->timer); PlaySE(SE_SELECT); data->state = ER_STATE_CANCELED_CARD_READ; } break; case ER_STATE_TRY_LINK: if (JOY_NEW(B_BUTTON)) { // Canceled PlaySE(SE_SELECT); CloseLink(); ResetTimer(&data->timer); data->state = ER_STATE_CANCELED_CARD_READ; } else if (GetLinkPlayerCount_2() > 1) { ResetTimer(&data->timer); CloseLink(); data->state = ER_STATE_INCORRECT_LINK; } else if (ValidateEReaderConnection()) { // Successful connection PlaySE(SE_SELECT); CloseLink(); ResetTimer(&data->timer); data->state = ER_STATE_CONNECTING; } else if (UpdateTimer(&data->timer, 10)) { // Retry connection CloseLink(); OpenEReaderLink(); ResetTimer(&data->timer); } break; case ER_STATE_INCORRECT_LINK: if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_LinkIsIncorrect)) data->state = ER_STATE_MSG_SELECT_CONNECT; break; case ER_STATE_CONNECTING: AddTextPrinterToWindow1(gJPText_Connecting); EReader_Load(&gEReaderData, gMultiBootProgram_EReader_End - gMultiBootProgram_EReader_Start, gMultiBootProgram_EReader_Start); data->state = ER_STATE_TRANSFER; break; case ER_STATE_TRANSFER: data->status = EReader_Transfer(&gEReaderData); if (data->status != TRANSFER_ACTIVE) data->state = ER_STATE_TRANSFER_END; break; case ER_STATE_TRANSFER_END: EReader_Reset(&gEReaderData); if (data->status == TRANSFER_TIMEOUT) { data->state = ER_STATE_LINK_ERROR; } else if (data->status == TRANSFER_SUCCESS) { ResetTimer(&data->timer); AddTextPrinterToWindow1(gJPText_PleaseWaitAMoment); data->state = ER_STATE_TRANSFER_SUCCESS; } else // TRANSFER_CANCELED { data->state = ER_STATE_START; } break; case ER_STATE_TRANSFER_SUCCESS: if (UpdateTimer(&data->timer, 840)) data->state = ER_STATE_LOAD_CARD_START; break; case ER_STATE_LOAD_CARD_START: OpenEReaderLink(); AddTextPrinterToWindow1(gJPText_AllowEReaderToLoadCard); data->state = ER_STATE_LOAD_CARD; break; case ER_STATE_LOAD_CARD: switch (TryReceiveCard(&data->textState, &data->timer)) { case RECV_ACTIVE: // Running break; case RECV_SUCCESS: AddTextPrinterToWindow1(gJPText_Connecting); data->state = ER_STATE_WAIT_RECV_CARD; break; case RECV_CANCELED: PlaySE(SE_SELECT); CloseLink(); data->state = ER_STATE_CANCELED_CARD_READ; break; case RECV_TIMEOUT: CloseLink(); data->state = ER_STATE_LINK_ERROR_TRY_AGAIN; break; case RECV_ERROR: case RECV_DISCONNECTED: CloseLink(); data->state = ER_STATE_LINK_ERROR; break; } break; case ER_STATE_WAIT_RECV_CARD: if (HasLinkErrorOccurred()) { CloseLink(); data->state = ER_STATE_LINK_ERROR; } else if (GetBlockReceivedStatus()) { ResetBlockReceivedFlags(); data->state = ER_STATE_VALIDATE_CARD; } break; case ER_STATE_VALIDATE_CARD: data->status = ValidateTrainerTowerData((struct EReaderTrainerTowerSet *)gDecompressionBuffer); SetCloseLinkCallbackAndType(data->status); data->state = ER_STATE_WAIT_DISCONNECT; break; case ER_STATE_WAIT_DISCONNECT: if (!gReceivedRemoteLinkPlayers) { if (data->status == TRUE) // Was data valid? data->state = ER_STATE_SAVE; else data->state = ER_STATE_LINK_ERROR; } break; case ER_STATE_SAVE: if (CEReaderTool_SaveTrainerTower((struct EReaderTrainerTowerSet *)gDecompressionBuffer)) { AddTextPrinterToWindow1(gJPText_ConnectionComplete); ResetTimer(&data->timer); data->state = ER_STATE_SUCCESS_MSG; } else data->state = ER_STATE_SAVE_FAILED; break; case ER_STATE_SUCCESS_MSG: if (UpdateTimer(&data->timer, 120)) { AddTextPrinterToWindow1(gJPText_NewTrainerHasComeToSevii); PlayFanfare(MUS_OBTAIN_ITEM); data->state = ER_STATE_SUCCESS_END; } break; case ER_STATE_SUCCESS_END: if (IsFanfareTaskInactive() && JOY_NEW(A_BUTTON | B_BUTTON)) data->state = ER_STATE_END; break; case ER_STATE_CANCELED_CARD_READ: if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_CardReadingHasBeenHalted)) data->state = ER_STATE_END; break; case ER_STATE_LINK_ERROR: if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_ConnectionErrorCheckLink)) data->state = ER_STATE_START; break; case ER_STATE_LINK_ERROR_TRY_AGAIN: if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_ConnectionErrorTryAgain)) data->state = ER_STATE_START; break; case ER_STATE_SAVE_FAILED: if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_WriteErrorUnableToSaveData)) data->state = ER_STATE_START; break; case ER_STATE_END: HelpSystem_Enable(); Free(data->unusedBuffer); DestroyTask(taskId); SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen); break; } } ================================================ FILE: src/event_data.c ================================================ #include "global.h" #include "event_data.h" #include "item_menu.h" #include "quest_log.h" #include "constants/maps.h" #include "constants/map_groups.h" #include "constants/region_map_sections.h" static bool8 IsFlagOrVarStoredInQuestLog(u16 idx, u8 a1); #define NUM_SPECIAL_FLAGS (SPECIAL_FLAGS_END - SPECIAL_FLAGS_START + 1) #define NUM_TEMP_FLAGS (TEMP_FLAGS_END - TEMP_FLAGS_START + 1) #define NUM_TEMP_VARS (TEMP_VARS_END - TEMP_VARS_START + 1) #define SPECIAL_FLAGS_SIZE (NUM_SPECIAL_FLAGS / 8) // 8 flags per byte #define TEMP_FLAGS_SIZE (NUM_TEMP_FLAGS / 8) #define TEMP_VARS_SIZE (NUM_TEMP_VARS * 2) // 1/2 var per byte EWRAM_DATA u16 gSpecialVar_0x8000 = 0; EWRAM_DATA u16 gSpecialVar_0x8001 = 0; EWRAM_DATA u16 gSpecialVar_0x8002 = 0; EWRAM_DATA u16 gSpecialVar_0x8003 = 0; EWRAM_DATA u16 gSpecialVar_0x8004 = 0; EWRAM_DATA u16 gSpecialVar_0x8005 = 0; EWRAM_DATA u16 gSpecialVar_0x8006 = 0; EWRAM_DATA u16 gSpecialVar_0x8007 = 0; EWRAM_DATA u16 gSpecialVar_0x8008 = 0; EWRAM_DATA u16 gSpecialVar_0x8009 = 0; EWRAM_DATA u16 gSpecialVar_0x800A = 0; EWRAM_DATA u16 gSpecialVar_0x800B = 0; EWRAM_DATA u16 gSpecialVar_Result = 0; EWRAM_DATA u16 gSpecialVar_LastTalked = 0; EWRAM_DATA u16 gSpecialVar_Facing = 0; EWRAM_DATA u16 gSpecialVar_MonBoxId = 0; EWRAM_DATA u16 gSpecialVar_MonBoxPos = 0; EWRAM_DATA u16 gSpecialVar_TextColor = 0; EWRAM_DATA u16 gSpecialVar_PrevTextColor = 0; EWRAM_DATA u16 gSpecialVar_0x8014 = 0; EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_SIZE] = {}; u16 gLastQuestLogStoredFlagOrVarIdx; extern u16 *const gSpecialVars[]; extern u8 NuzlockeLUT[]; void InitEventData(void) { memset(gSaveBlock1Ptr->flags, 0, sizeof(gSaveBlock1Ptr->flags)); memset(gSaveBlock1Ptr->vars, 0, sizeof(gSaveBlock1Ptr->vars)); memset(sSpecialFlags, 0, sizeof(sSpecialFlags)); } void ClearTempFieldEventData(void) { memset(gSaveBlock1Ptr->flags + (TEMP_FLAGS_START / 8), 0, TEMP_FLAGS_SIZE); memset(gSaveBlock1Ptr->vars + ((TEMP_VARS_START - VARS_START) * 2), 0, TEMP_VARS_SIZE); FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE); FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_SPECIAL_WILD_BATTLE); FlagClear(FLAG_SYS_CTRL_OBJ_DELETE); FlagClear(FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER); } // Unused static void DisableNationalPokedex_RSE(void) { u16 *ptr = GetVarPointer(VAR_0x403C); gSaveBlock2Ptr->pokedex.unused = 0; *ptr = 0; FlagClear(FLAG_0x838); } // The magic numbers used here (0xDA and 0x0302) correspond to those // used in RSE for enabling the national Pokedex void EnableNationalPokedex_RSE(void) { // Note: the var, struct member, and flag are never used u16 *ptr = GetVarPointer(VAR_0x403C); gSaveBlock2Ptr->pokedex.unused = 0xDA; *ptr = 0x0302; FlagSet(FLAG_0x838); } // Unused static bool32 IsNationalPokedexEnabled_RSE(void) { if (gSaveBlock2Ptr->pokedex.unused == 0xDA && VarGet(VAR_0x403C) == 0x0302 && FlagGet(FLAG_0x838)) return TRUE; return FALSE; } void DisableNationalPokedex(void) { u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); gSaveBlock2Ptr->pokedex.nationalMagic = 0; *nationalDexVar = 0; FlagClear(FLAG_SYS_NATIONAL_DEX); } void EnableNationalPokedex(void) { u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); gSaveBlock2Ptr->pokedex.nationalMagic = 0xB9; *nationalDexVar = 0x6258; FlagSet(FLAG_SYS_NATIONAL_DEX); } bool32 IsNationalPokedexEnabled(void) { if (!FlagGet(FLAG_SYS_NATIONAL_DEX)) return FALSE; return TRUE; } void DisableMysteryGift(void) { FlagClear(FLAG_SYS_MYSTERY_GIFT_ENABLED); } void EnableMysteryGift(void) { FlagSet(FLAG_SYS_MYSTERY_GIFT_ENABLED); } bool32 IsMysteryGiftEnabled(void) { return FlagGet(FLAG_SYS_MYSTERY_GIFT_ENABLED); } void ClearMysteryGiftFlags(void) { FlagClear(FLAG_MYSTERY_GIFT_DONE); FlagClear(FLAG_MYSTERY_GIFT_1); FlagClear(FLAG_MYSTERY_GIFT_2); FlagClear(FLAG_MYSTERY_GIFT_3); FlagClear(FLAG_MYSTERY_GIFT_4); FlagClear(FLAG_MYSTERY_GIFT_5); FlagClear(FLAG_MYSTERY_GIFT_6); FlagClear(FLAG_MYSTERY_GIFT_7); FlagClear(FLAG_MYSTERY_GIFT_8); FlagClear(FLAG_MYSTERY_GIFT_9); FlagClear(FLAG_MYSTERY_GIFT_10); FlagClear(FLAG_MYSTERY_GIFT_11); FlagClear(FLAG_MYSTERY_GIFT_12); FlagClear(FLAG_MYSTERY_GIFT_13); FlagClear(FLAG_MYSTERY_GIFT_14); FlagClear(FLAG_MYSTERY_GIFT_15); } void ClearMysteryGiftVars(void) { VarSet(VAR_EVENT_PICHU_SLOT, 0); VarSet(VAR_MYSTERY_GIFT_1, 0); VarSet(VAR_MYSTERY_GIFT_2, 0); VarSet(VAR_MYSTERY_GIFT_3, 0); VarSet(VAR_MYSTERY_GIFT_4, 0); VarSet(VAR_MYSTERY_GIFT_5, 0); VarSet(VAR_MYSTERY_GIFT_6, 0); VarSet(VAR_MYSTERY_GIFT_7, 0); VarSet(VAR_ALTERING_CAVE_WILD_SET, 0); } void DisableResetRTC(void) { VarSet(VAR_RESET_RTC_ENABLE, 0); FlagClear(FLAG_SYS_RESET_RTC_ENABLE); } void EnableResetRTC(void) { VarSet(VAR_RESET_RTC_ENABLE, 0x0920); FlagSet(FLAG_SYS_RESET_RTC_ENABLE); } bool32 CanResetRTC(void) { if (!FlagGet(FLAG_SYS_RESET_RTC_ENABLE)) return FALSE; if (VarGet(VAR_RESET_RTC_ENABLE) != 0x0920) return FALSE; return TRUE; } u16 *GetVarPointer(u16 idx) { u16 *ptr; if (idx < VARS_START) return NULL; if (idx < SPECIAL_VARS_START) { switch (gQuestLogPlaybackState) { case QL_PLAYBACK_STATE_STOPPED: default: break; case QL_PLAYBACK_STATE_RUNNING: ptr = QuestLogGetFlagOrVarPtr(FALSE, idx); if (ptr != NULL) gSaveBlock1Ptr->vars[idx - VARS_START] = *ptr; break; case QL_PLAYBACK_STATE_RECORDING: if (IsFlagOrVarStoredInQuestLog(idx - VARS_START, TRUE) == TRUE) { gLastQuestLogStoredFlagOrVarIdx = idx - VARS_START; QuestLogSetFlagOrVar(FALSE, idx, gSaveBlock1Ptr->vars[idx - VARS_START]); } break; } return &gSaveBlock1Ptr->vars[idx - VARS_START]; } return gSpecialVars[idx - SPECIAL_VARS_START]; } static bool8 IsFlagOrVarStoredInQuestLog(u16 idx, bool8 isVar) { if (!isVar) { if (idx < STORY_FLAGS_START) return FALSE; if (idx >= SYS_FLAGS && idx < PERMA_SYS_FLAGS_START) return FALSE; } else { if (idx < VAR_ICE_STEP_COUNT - VARS_START) return FALSE; if (idx >= VAR_MAP_SCENE_PALLET_TOWN_OAK - VARS_START && idx < VAR_PORTHOLE - VARS_START) return FALSE; } return TRUE; } u16 VarGet(u16 idx) { u16 *ptr = GetVarPointer(idx); if (ptr == NULL) return idx; return *ptr; } bool8 VarSet(u16 idx, u16 val) { u16 *ptr = GetVarPointer(idx); if (ptr == NULL) return FALSE; *ptr = val; return TRUE; } u8 VarGetObjectEventGraphicsId(u8 idx) { return VarGet(VAR_OBJ_GFX_ID_0 + idx); } u8 *GetFlagAddr(u16 idx) { u8 *ptr; if (idx == 0) return NULL; if (idx < SPECIAL_FLAGS_START) { switch (gQuestLogPlaybackState) { case QL_PLAYBACK_STATE_STOPPED: default: break; case QL_PLAYBACK_STATE_RUNNING: ptr = QuestLogGetFlagOrVarPtr(TRUE, idx); if (ptr != NULL) gSaveBlock1Ptr->flags[idx / 8] = *ptr; break; case QL_PLAYBACK_STATE_RECORDING: if (IsFlagOrVarStoredInQuestLog(idx, FALSE) == TRUE) { gLastQuestLogStoredFlagOrVarIdx = idx; QuestLogSetFlagOrVar(TRUE, idx, gSaveBlock1Ptr->flags[idx / 8]); } break; } return &gSaveBlock1Ptr->flags[idx / 8]; } return &sSpecialFlags[(idx - SPECIAL_FLAGS_START) / 8]; } bool8 FlagSet(u16 idx) { u8 *ptr = GetFlagAddr(idx); if (ptr != NULL) *ptr |= 1 << (idx & 7); return FALSE; } bool8 FlagClear(u16 idx) { u8 *ptr = GetFlagAddr(idx); if (ptr != NULL) *ptr &= ~(1 << (idx & 7)); return FALSE; } bool8 FlagGet(u16 idx) { u8 *ptr = GetFlagAddr(idx); if (ptr == NULL) return FALSE; if (!(*ptr & 1 << (idx & 7))) return FALSE; return TRUE; } void ResetSpecialVars(void) { gSpecialVar_0x8000 = 0; gSpecialVar_0x8001 = 0; gSpecialVar_0x8002 = 0; gSpecialVar_0x8003 = 0; gSpecialVar_0x8004 = 0; gSpecialVar_0x8005 = 0; gSpecialVar_0x8006 = 0; gSpecialVar_0x8007 = 0; gSpecialVar_0x8008 = 0; gSpecialVar_0x8009 = 0; gSpecialVar_0x800A = 0; gSpecialVar_0x800B = 0; gSpecialVar_Facing = 0; gSpecialVar_Result = 0; gSpecialVar_ItemId = 0; gSpecialVar_LastTalked = 0; gSpecialVar_MonBoxId = 0; gSpecialVar_MonBoxPos = 0; gSpecialVar_TextColor = 0; gSpecialVar_PrevTextColor = 0; gSpecialVar_0x8014 = 0; } u8 NuzlockeFlagSet(u8 mapsec) { u8 id = NuzlockeLUT[mapsec]; if(!FlagGet(FLAG_SYS_POKEDEX_GET)) { //don't start keeping track until has Pokedex return 1; } if(id == 0x27) //Safari Zone { if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_EAST)) { FlagSet(FLAG_NUZLOCKE_SAFARI_EAST); return 0; } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH)) { FlagSet(FLAG_NUZLOCKE_SAFARI_NORTH); return 0; } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_WEST)) { FlagSet(FLAG_NUZLOCKE_SAFARI_WEST); return 0; } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_WEST)) { FlagSet(FLAG_NUZLOCKE_SAFARI_NORTH_WEST); return 0; } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_EAST)) { FlagSet(FLAG_NUZLOCKE_SAFARI_NORTH_EAST); return 0; } else { FlagSet(NUZLOCKE_FLAGS_START + (id - 1)); //base Safari Zone flag return 0; } return 0; } if(id != 0) FlagSet(NUZLOCKE_FLAGS_START + (id - 1)); return 0; } u8 NuzlockeFlagClear(u8 mapsec) { //can't handle additional Safari Zone flags u8 id = NuzlockeLUT[mapsec]; if(id != 0) FlagClear(NUZLOCKE_FLAGS_START + (id - 1)); return 0; } u8 NuzlockeFlagGet(u8 mapsec) { u8 id = NuzlockeLUT[mapsec]; if(id == 0x27) //Safari Zone { if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_EAST)) { return FlagGet(FLAG_NUZLOCKE_SAFARI_EAST); } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH)) { return FlagGet(FLAG_NUZLOCKE_SAFARI_NORTH); } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_WEST)) { return FlagGet(FLAG_NUZLOCKE_SAFARI_WEST); } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_WEST)) { return FlagGet(FLAG_NUZLOCKE_SAFARI_NORTH_WEST); } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_EAST)) { return FlagGet(FLAG_NUZLOCKE_SAFARI_NORTH_EAST); } else { return FlagGet(NUZLOCKE_FLAGS_START + (id - 1)); //base Safari Zone flag } return 0; } if(id != 0) return FlagGet(NUZLOCKE_FLAGS_START + (id - 1)); return FALSE; } bool8 CheckMasterTrainerFlag(u16 flag) { u8 index = flag / 8; //get byte in array u8 bit = flag % 8; //get bit in byte u8 mask = 1 << bit; return (gSaveBlock1Ptr->masterTrainerFlags[index] & mask) != 0; } bool8 SetMasterTrainerFlag(u16 flag) { u8 index = flag / 8; //get byte in array u8 bit = flag % 8; //get bit in byte u8 mask = 1 << bit; gSaveBlock1Ptr->masterTrainerFlags[index] |= mask; } bool8 ClearMasterTrainerFlag(u16 flag) { u8 index = flag / 8; //get byte in array u8 bit = flag % 8; //get bit in byte u8 mask = 1 << bit; gSaveBlock1Ptr->masterTrainerFlags[index] &= ~mask; } ================================================ FILE: src/event_object_lock.c ================================================ #include "global.h" #include "task.h" #include "field_player_avatar.h" #include "event_object_movement.h" #include "script_movement.h" #include "event_data.h" #include "constants/event_objects.h" bool8 walkrun_is_standing_still(void) { if (gPlayerAvatar.tileTransitionState == 1) return FALSE; else return TRUE; } void Task_WaitPlayerStopMoving(u8 taskId) { if (walkrun_is_standing_still()) { HandleEnforcedLookDirectionOnPlayerStopMoving(); DestroyTask(taskId); } } bool8 IsFreezePlayerFinished(void) { if (FuncIsActiveTask(Task_WaitPlayerStopMoving)) return FALSE; else { StopPlayerAvatar(); return TRUE; } } void FreezeObjects_WaitForPlayer(void) { FreezeObjectEvents(); CreateTask(Task_WaitPlayerStopMoving, 80); } void Task_WaitPlayerAndTargetNPCStopMoving(u8 taskId) { struct Task *task = &gTasks[taskId]; if (task->data[0] == 0 && walkrun_is_standing_still() == TRUE) { HandleEnforcedLookDirectionOnPlayerStopMoving(); task->data[0] = 1; } if (task->data[1] == 0 && !gObjectEvents[gSelectedObjectEvent].singleMovementActive) { FreezeObjectEvent(&gObjectEvents[gSelectedObjectEvent]); task->data[1] = 1; } if (task->data[0] && task->data[1]) DestroyTask(taskId); } bool8 IsFreezeSelectedObjectAndPlayerFinished(void) { if (FuncIsActiveTask(Task_WaitPlayerAndTargetNPCStopMoving)) return FALSE; else { StopPlayerAvatar(); return TRUE; } } void FreezeObjects_WaitForPlayerAndSelected(void) { u8 taskId; FreezeObjectEventsExceptOne(gSelectedObjectEvent); taskId = CreateTask(Task_WaitPlayerAndTargetNPCStopMoving, 80); if (!gObjectEvents[gSelectedObjectEvent].singleMovementActive) { FreezeObjectEvent(&gObjectEvents[gSelectedObjectEvent]); gTasks[taskId].data[1] = 1; } } void ClearPlayerHeldMovementAndUnfreezeObjectEvents(void) { u8 objectEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); } void UnionRoom_UnlockPlayerAndChatPartner(void) { u8 objectEventId; if (gObjectEvents[gSelectedObjectEvent].active) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]); objectEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); } void Script_FacePlayer(void) { ObjectEventFaceOppositeDirection(&gObjectEvents[gSelectedObjectEvent], gSpecialVar_Facing); } void Script_ClearHeldMovement(void) { ObjectEventClearHeldMovementIfActive(&gObjectEvents[gSelectedObjectEvent]); } ================================================ FILE: src/event_object_movement.c ================================================ #include "global.h" #include "gflib.h" #include "event_data.h" #include "event_object_movement.h" #include "faraway_island.h" #include "field_camera.h" #include "field_control_avatar.h" #include "field_effect.h" #include "field_effect_helpers.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "metatile_behavior.h" #include "overworld.h" #include "quest_log.h" #include "random.h" #include "script.h" #include "trainer_see.h" #include "trig.h" #include "constants/maps.h" #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/trainer_types.h" #include "constants/union_room.h" static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *); static u8 GetCollisionInDirection(struct ObjectEvent *, u8); static u32 GetCopyDirection(u8, u32, u32); static void TryEnableObjectEventAnim(struct ObjectEvent *, struct Sprite *); static void ObjectEventExecHeldMovementAction(struct ObjectEvent *, struct Sprite *); static void UpdateObjectEventSpriteAnimPause(struct ObjectEvent *, struct Sprite *); static bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *, s16, s16); static bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *, s16, s16, u8); static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *, s16, s16); static void CalcWhetherObjectIsOffscreen(struct ObjectEvent *, struct Sprite *); static void UpdateObjEventSpriteVisibility(struct ObjectEvent *, struct Sprite *); static void ObjectEventUpdateMetatileBehaviors(struct ObjectEvent *); static void GetGroundEffectFlags_Reflection(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_TallGrassOnSpawn(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_LongGrassOnSpawn(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_SandHeap(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_ShallowFlowingWater(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_ShortGrass(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_HotSprings(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_TallGrassOnBeginStep(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_LongGrassOnBeginStep(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_Tracks(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_Puddle(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_Ripple(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_Seaweed(struct ObjectEvent *, u32 *); static void GetGroundEffectFlags_JumpLanding(struct ObjectEvent *, u32 *); static u8 ObjectEventCheckForReflectiveSurface(struct ObjectEvent *); static u8 GetReflectionTypeByMetatileBehavior(u32); static void InitObjectPriorityByElevation(struct Sprite *sprite, u8 elevation); static void ObjectEventUpdateSubpriority(struct ObjectEvent *, struct Sprite *); static void DoTracksGroundEffect_None(struct ObjectEvent *, struct Sprite *, u8); static void DoTracksGroundEffect_Footprints(struct ObjectEvent *, struct Sprite *, u8); static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *, struct Sprite *, u8); static void DoRippleFieldEffect(struct ObjectEvent *, struct Sprite *); static void DoGroundEffects_OnSpawn(struct ObjectEvent *, struct Sprite *); static void DoGroundEffects_OnBeginStep(struct ObjectEvent *, struct Sprite *); static void DoGroundEffects_OnFinishStep(struct ObjectEvent *, struct Sprite *); static void CreateReflectionEffectSprites(void); static u8 GetObjectEventIdByLocalId(u8); static u8 GetObjectEventIdByLocalIdAndMapInternal(u8, u8, u8); static bool8 GetAvailableObjectEventId(u16, u8, u8, u8 *); static void SetObjectEventDynamicGraphicsId(struct ObjectEvent *); static void RemoveObjectEventInternal(struct ObjectEvent *); static u16 GetObjectEventFlagIdByObjectEventId(u8); static void UpdateObjectEventVisibility(struct ObjectEvent *, struct Sprite *); static void MakeObjectTemplateFromObjectEventTemplate(const struct ObjectEventTemplate *, struct SpriteTemplate *, const struct SubspriteTable **); static void GetObjectEventMovingCameraOffset(s16 *, s16 *); static const struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8); static void LoadObjectEventPalette(u16); static void RemoveObjectEventIfOutsideView(struct ObjectEvent *); static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y); static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8); static void ResetObjectEventFldEffData(struct ObjectEvent *); static u8 TryLoadObjectPalette(const struct SpritePalette *spritePalette); static u8 FindObjectEventPaletteIndexByTag(u16); static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8); static bool8 IsElevationMismatchAt(u8 elevation, s16 x, s16 y); static bool8 AreElevationsCompatible(u8 a, u8 b); static void ObjectCB_CameraObject(struct Sprite *); static void CameraObject_0(struct Sprite *); static void CameraObject_1(struct Sprite *); static void CameraObject_2(struct Sprite *); static const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, const struct ObjectEventTemplate *templates, u8 count); static void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *); static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8); static bool8 ShouldInitObjectEventStateFromTemplate(const struct ObjectEventTemplate *, u8, s16, s16); static bool8 TemplateIsObstacleAndWithinView(const struct ObjectEventTemplate *, s16, s16); static bool8 TemplateIsObstacleAndVisibleFromConnectingMap(const struct ObjectEventTemplate *, s16, s16); static void SetHideObstacleFlag(const struct ObjectEventTemplate *); static bool8 MovementType_Disguise_Callback(struct ObjectEvent *, struct Sprite *); static bool8 MovementType_Buried_Callback(struct ObjectEvent *, struct Sprite *); static u8 MovementType_RaiseHandAndStop_Callback(struct ObjectEvent *, struct Sprite *); static u8 MovementType_RaiseHandAndJump_Callback(struct ObjectEvent *, struct Sprite *); static u8 MovementType_RaiseHandAndSwim_Callback(struct ObjectEvent *, struct Sprite *); static void QuestLogObjectEventExecHeldMovementAction(struct ObjectEvent *, struct Sprite *); static void VirtualObject_UpdateAnim(struct Sprite *sprite); static void MovementType_None(struct Sprite *); static void MovementType_LookAround(struct Sprite *); static void MovementType_WanderAround(struct Sprite *); static void MovementType_WanderUpAndDown(struct Sprite *); static void MovementType_WanderLeftAndRight(struct Sprite *); static void MovementType_FaceDirection(struct Sprite *); static void MovementType_FaceDownAndUp(struct Sprite *); static void MovementType_FaceLeftAndRight(struct Sprite *); static void MovementType_FaceUpAndLeft(struct Sprite *); static void MovementType_FaceUpAndRight(struct Sprite *); static void MovementType_FaceDownAndLeft(struct Sprite *); static void MovementType_FaceDownAndRight(struct Sprite *); static void MovementType_FaceDownUpAndLeft(struct Sprite *); static void MovementType_FaceDownUpAndRight(struct Sprite *); static void MovementType_FaceUpRightAndLeft(struct Sprite *); static void MovementType_FaceDownRightAndLeft(struct Sprite *); static void MovementType_RotateCounterclockwise(struct Sprite *); static void MovementType_RotateClockwise(struct Sprite *); static void MovementType_WalkBackAndForth(struct Sprite *); static void MovementType_WalkSequenceUpRightLeftDown(struct Sprite *); static void MovementType_WalkSequenceRightLeftDownUp(struct Sprite *); static void MovementType_WalkSequenceDownUpRightLeft(struct Sprite *); static void MovementType_WalkSequenceLeftDownUpRight(struct Sprite *); static void MovementType_WalkSequenceUpLeftRightDown(struct Sprite *); static void MovementType_WalkSequenceLeftRightDownUp(struct Sprite *); static void MovementType_WalkSequenceDownUpLeftRight(struct Sprite *); static void MovementType_WalkSequenceRightDownUpLeft(struct Sprite *); static void MovementType_WalkSequenceLeftUpDownRight(struct Sprite *); static void MovementType_WalkSequenceUpDownRightLeft(struct Sprite *); static void MovementType_WalkSequenceRightLeftUpDown(struct Sprite *); static void MovementType_WalkSequenceDownRightLeftUp(struct Sprite *); static void MovementType_WalkSequenceRightUpDownLeft(struct Sprite *); static void MovementType_WalkSequenceUpDownLeftRight(struct Sprite *); static void MovementType_WalkSequenceLeftRightUpDown(struct Sprite *); static void MovementType_WalkSequenceDownLeftRightUp(struct Sprite *); static void MovementType_WalkSequenceUpLeftDownRight(struct Sprite *); static void MovementType_WalkSequenceDownRightUpLeft(struct Sprite *); static void MovementType_WalkSequenceLeftDownRightUp(struct Sprite *); static void MovementType_WalkSequenceRightUpLeftDown(struct Sprite *); static void MovementType_WalkSequenceUpRightDownLeft(struct Sprite *); static void MovementType_WalkSequenceDownLeftUpRight(struct Sprite *); static void MovementType_WalkSequenceLeftUpRightDown(struct Sprite *); static void MovementType_WalkSequenceRightDownLeftUp(struct Sprite *); static void MovementType_CopyPlayer(struct Sprite *); static void MovementType_TreeDisguise(struct Sprite *); static void MovementType_MountainDisguise(struct Sprite *); static void MovementType_CopyPlayerInGrass(struct Sprite *); static void MovementType_Buried(struct Sprite *); static void MovementType_WalkInPlace(struct Sprite *); static void MovementType_WalkInPlaceFast(struct Sprite *); static void MovementType_JogInPlace(struct Sprite *); static void MovementType_Invisible(struct Sprite *); static void MovementType_RaiseHandAndStop(struct Sprite *); static void MovementType_RaiseHandAndJump(struct Sprite *); static void MovementType_RaiseHandAndSwim(struct Sprite *); static void MovementType_WanderAroundSlower(struct Sprite *); enum { MOVE_SPEED_NORMAL, // walking MOVE_SPEED_FAST_1, // running / surfing / sliding (ice tile) MOVE_SPEED_FAST_2, // water current / bicycle MOVE_SPEED_FASTER, // going down cycling road on bicycle MOVE_SPEED_FASTEST, }; enum { JUMP_DISTANCE_IN_PLACE, JUMP_DISTANCE_NORMAL, JUMP_DISTANCE_FAR, }; #define movement_type_def(setup, table) \ static u8 setup##_callback(struct ObjectEvent *, struct Sprite *); \ void setup(struct Sprite *sprite) \ { \ UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, setup##_callback); \ } \ static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) \ { \ return table[sprite->data[1]](objectEvent, sprite); \ } #define movement_type_empty_callback(setup) \ static u8 setup##_callback(struct ObjectEvent *, struct Sprite *); \ void setup(struct Sprite *sprite) \ { \ UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, setup##_callback); \ } \ static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) \ { \ return 0; \ } EWRAM_DATA u8 sCurrentReflectionType = 0; EWRAM_DATA u16 sCurrentSpecialObjectPaletteTag = 0; const u8 gReflectionEffectPaletteMap[16] = { [PALSLOT_PLAYER] = PALSLOT_PLAYER_REFLECTION, [PALSLOT_PLAYER_REFLECTION] = PALSLOT_PLAYER_REFLECTION, [PALSLOT_NPC_1] = PALSLOT_NPC_1_REFLECTION, [PALSLOT_NPC_2] = PALSLOT_NPC_2_REFLECTION, [PALSLOT_NPC_3] = PALSLOT_NPC_3_REFLECTION, [PALSLOT_NPC_4] = PALSLOT_NPC_4_REFLECTION, [PALSLOT_NPC_1_REFLECTION] = PALSLOT_NPC_1_REFLECTION, [PALSLOT_NPC_2_REFLECTION] = PALSLOT_NPC_2_REFLECTION, [PALSLOT_NPC_3_REFLECTION] = PALSLOT_NPC_3_REFLECTION, [PALSLOT_NPC_4_REFLECTION] = PALSLOT_NPC_4_REFLECTION, [PALSLOT_NPC_SPECIAL] = PALSLOT_NPC_SPECIAL_REFLECTION, [PALSLOT_NPC_SPECIAL_REFLECTION] = PALSLOT_NPC_SPECIAL_REFLECTION }; static const struct SpriteTemplate gCameraSpriteTemplate = { .tileTag = 0, .paletteTag = TAG_NONE, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = ObjectCB_CameraObject }; void (*const gCameraObjectFuncs[])(struct Sprite *) = { CameraObject_0, CameraObject_1, CameraObject_2, }; #include "data/object_events/object_event_graphics.h" static void (*const sMovementTypeCallbacks[MOVEMENT_TYPES_COUNT])(struct Sprite *) = { [MOVEMENT_TYPE_NONE] = MovementType_None, [MOVEMENT_TYPE_LOOK_AROUND] = MovementType_LookAround, [MOVEMENT_TYPE_WANDER_AROUND] = MovementType_WanderAround, [MOVEMENT_TYPE_WANDER_UP_AND_DOWN] = MovementType_WanderUpAndDown, [MOVEMENT_TYPE_WANDER_DOWN_AND_UP] = MovementType_WanderUpAndDown, [MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT] = MovementType_WanderLeftAndRight, [MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT] = MovementType_WanderLeftAndRight, [MOVEMENT_TYPE_FACE_UP] = MovementType_FaceDirection, [MOVEMENT_TYPE_FACE_DOWN] = MovementType_FaceDirection, [MOVEMENT_TYPE_FACE_LEFT] = MovementType_FaceDirection, [MOVEMENT_TYPE_FACE_RIGHT] = MovementType_FaceDirection, [MOVEMENT_TYPE_PLAYER] = MovementType_Player, [MOVEMENT_TYPE_BERRY_TREE_GROWTH] = NULL, [MOVEMENT_TYPE_FACE_DOWN_AND_UP] = MovementType_FaceDownAndUp, [MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT] = MovementType_FaceLeftAndRight, [MOVEMENT_TYPE_FACE_UP_AND_LEFT] = MovementType_FaceUpAndLeft, [MOVEMENT_TYPE_FACE_UP_AND_RIGHT] = MovementType_FaceUpAndRight, [MOVEMENT_TYPE_FACE_DOWN_AND_LEFT] = MovementType_FaceDownAndLeft, [MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT] = MovementType_FaceDownAndRight, [MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT] = MovementType_FaceDownUpAndLeft, [MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT] = MovementType_FaceDownUpAndRight, [MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT] = MovementType_FaceUpRightAndLeft, [MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT] = MovementType_FaceDownRightAndLeft, [MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE] = MovementType_RotateCounterclockwise, [MOVEMENT_TYPE_ROTATE_CLOCKWISE] = MovementType_RotateClockwise, [MOVEMENT_TYPE_WALK_UP_AND_DOWN] = MovementType_WalkBackAndForth, [MOVEMENT_TYPE_WALK_DOWN_AND_UP] = MovementType_WalkBackAndForth, [MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT] = MovementType_WalkBackAndForth, [MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT] = MovementType_WalkBackAndForth, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN] = MovementType_WalkSequenceUpRightLeftDown, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP] = MovementType_WalkSequenceRightLeftDownUp, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT] = MovementType_WalkSequenceDownUpRightLeft, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT] = MovementType_WalkSequenceLeftDownUpRight, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN] = MovementType_WalkSequenceUpLeftRightDown, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP] = MovementType_WalkSequenceLeftRightDownUp, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT] = MovementType_WalkSequenceDownUpLeftRight, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT] = MovementType_WalkSequenceRightDownUpLeft, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT] = MovementType_WalkSequenceLeftUpDownRight, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT] = MovementType_WalkSequenceUpDownRightLeft, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN] = MovementType_WalkSequenceRightLeftUpDown, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP] = MovementType_WalkSequenceDownRightLeftUp, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT] = MovementType_WalkSequenceRightUpDownLeft, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT] = MovementType_WalkSequenceUpDownLeftRight, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN] = MovementType_WalkSequenceLeftRightUpDown, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP] = MovementType_WalkSequenceDownLeftRightUp, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT] = MovementType_WalkSequenceUpLeftDownRight, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT] = MovementType_WalkSequenceDownRightUpLeft, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP] = MovementType_WalkSequenceLeftDownRightUp, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN] = MovementType_WalkSequenceRightUpLeftDown, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT] = MovementType_WalkSequenceUpRightDownLeft, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT] = MovementType_WalkSequenceDownLeftUpRight, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN] = MovementType_WalkSequenceLeftUpRightDown, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP] = MovementType_WalkSequenceRightDownLeftUp, [MOVEMENT_TYPE_COPY_PLAYER] = MovementType_CopyPlayer, [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE] = MovementType_CopyPlayer, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE] = MovementType_CopyPlayer, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE] = MovementType_CopyPlayer, [MOVEMENT_TYPE_TREE_DISGUISE] = MovementType_TreeDisguise, [MOVEMENT_TYPE_MOUNTAIN_DISGUISE] = MovementType_MountainDisguise, [MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS] = MovementType_CopyPlayerInGrass, [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = MovementType_CopyPlayerInGrass, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = MovementType_CopyPlayerInGrass, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = MovementType_CopyPlayerInGrass, [MOVEMENT_TYPE_BURIED] = MovementType_Buried, [MOVEMENT_TYPE_WALK_IN_PLACE_DOWN] = MovementType_WalkInPlace, [MOVEMENT_TYPE_WALK_IN_PLACE_UP] = MovementType_WalkInPlace, [MOVEMENT_TYPE_WALK_IN_PLACE_LEFT] = MovementType_WalkInPlace, [MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT] = MovementType_WalkInPlace, [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_DOWN] = MovementType_WalkInPlaceFast, [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_UP] = MovementType_WalkInPlaceFast, [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_LEFT] = MovementType_WalkInPlaceFast, [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_RIGHT] = MovementType_WalkInPlaceFast, [MOVEMENT_TYPE_JOG_IN_PLACE_DOWN] = MovementType_JogInPlace, [MOVEMENT_TYPE_JOG_IN_PLACE_UP] = MovementType_JogInPlace, [MOVEMENT_TYPE_JOG_IN_PLACE_LEFT] = MovementType_JogInPlace, [MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT] = MovementType_JogInPlace, [MOVEMENT_TYPE_INVISIBLE] = MovementType_Invisible, [MOVEMENT_TYPE_RAISE_HAND_AND_STOP] = MovementType_RaiseHandAndStop, [MOVEMENT_TYPE_RAISE_HAND_AND_JUMP] = MovementType_RaiseHandAndJump, [MOVEMENT_TYPE_RAISE_HAND_AND_SWIM] = MovementType_RaiseHandAndSwim, [MOVEMENT_TYPE_WANDER_AROUND_SLOWER] = MovementType_WanderAroundSlower, }; static const bool8 gRangedMovementTypes[MOVEMENT_TYPES_COUNT] = { [MOVEMENT_TYPE_WANDER_AROUND] = TRUE, [MOVEMENT_TYPE_WANDER_UP_AND_DOWN] = TRUE, [MOVEMENT_TYPE_WANDER_DOWN_AND_UP] = TRUE, [MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT] = TRUE, [MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT] = TRUE, [MOVEMENT_TYPE_WALK_UP_AND_DOWN] = TRUE, [MOVEMENT_TYPE_WALK_DOWN_AND_UP] = TRUE, [MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT] = TRUE, [MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN] = TRUE, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = TRUE, [MOVEMENT_TYPE_WANDER_AROUND_SLOWER] = TRUE, }; static const u8 gInitialMovementTypeFacingDirections[MOVEMENT_TYPES_COUNT] = { [MOVEMENT_TYPE_NONE] = DIR_SOUTH, [MOVEMENT_TYPE_LOOK_AROUND] = DIR_SOUTH, [MOVEMENT_TYPE_WANDER_AROUND] = DIR_SOUTH, [MOVEMENT_TYPE_WANDER_UP_AND_DOWN] = DIR_NORTH, [MOVEMENT_TYPE_WANDER_DOWN_AND_UP] = DIR_SOUTH, [MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT] = DIR_WEST, [MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT] = DIR_EAST, [MOVEMENT_TYPE_FACE_UP] = DIR_NORTH, [MOVEMENT_TYPE_FACE_DOWN] = DIR_SOUTH, [MOVEMENT_TYPE_FACE_LEFT] = DIR_WEST, [MOVEMENT_TYPE_FACE_RIGHT] = DIR_EAST, [MOVEMENT_TYPE_PLAYER] = DIR_SOUTH, [MOVEMENT_TYPE_BERRY_TREE_GROWTH] = DIR_SOUTH, [MOVEMENT_TYPE_FACE_DOWN_AND_UP] = DIR_SOUTH, [MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT] = DIR_WEST, [MOVEMENT_TYPE_FACE_UP_AND_LEFT] = DIR_NORTH, [MOVEMENT_TYPE_FACE_UP_AND_RIGHT] = DIR_NORTH, [MOVEMENT_TYPE_FACE_DOWN_AND_LEFT] = DIR_SOUTH, [MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT] = DIR_SOUTH, [MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT] = DIR_SOUTH, [MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT] = DIR_SOUTH, [MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT] = DIR_NORTH, [MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT] = DIR_SOUTH, [MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE] = DIR_SOUTH, [MOVEMENT_TYPE_ROTATE_CLOCKWISE] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_UP_AND_DOWN] = DIR_NORTH, [MOVEMENT_TYPE_WALK_DOWN_AND_UP] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT] = DIR_WEST, [MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT] = DIR_EAST, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN] = DIR_NORTH, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP] = DIR_EAST, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT] = DIR_WEST, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN] = DIR_NORTH, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP] = DIR_WEST, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT] = DIR_EAST, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT] = DIR_WEST, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT] = DIR_NORTH, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN] = DIR_EAST, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT] = DIR_EAST, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT] = DIR_NORTH, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN] = DIR_WEST, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT] = DIR_NORTH, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP] = DIR_WEST, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN] = DIR_EAST, [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT] = DIR_NORTH, [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN] = DIR_WEST, [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP] = DIR_EAST, [MOVEMENT_TYPE_COPY_PLAYER] = DIR_NORTH, [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE] = DIR_SOUTH, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE] = DIR_WEST, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE] = DIR_EAST, [MOVEMENT_TYPE_TREE_DISGUISE] = DIR_SOUTH, [MOVEMENT_TYPE_MOUNTAIN_DISGUISE] = DIR_SOUTH, [MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS] = DIR_NORTH, [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = DIR_SOUTH, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = DIR_WEST, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = DIR_EAST, [MOVEMENT_TYPE_BURIED] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_IN_PLACE_DOWN] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_IN_PLACE_UP] = DIR_NORTH, [MOVEMENT_TYPE_WALK_IN_PLACE_LEFT] = DIR_WEST, [MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT] = DIR_EAST, [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_DOWN] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_UP] = DIR_NORTH, [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_LEFT] = DIR_WEST, [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_RIGHT] = DIR_EAST, [MOVEMENT_TYPE_JOG_IN_PLACE_DOWN] = DIR_SOUTH, [MOVEMENT_TYPE_JOG_IN_PLACE_UP] = DIR_NORTH, [MOVEMENT_TYPE_JOG_IN_PLACE_LEFT] = DIR_WEST, [MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT] = DIR_EAST, [MOVEMENT_TYPE_INVISIBLE] = DIR_SOUTH, [MOVEMENT_TYPE_RAISE_HAND_AND_STOP] = DIR_SOUTH, [MOVEMENT_TYPE_RAISE_HAND_AND_JUMP] = DIR_SOUTH, [MOVEMENT_TYPE_RAISE_HAND_AND_SWIM] = DIR_SOUTH, [MOVEMENT_TYPE_WANDER_AROUND_SLOWER] = DIR_SOUTH, }; #define OBJ_EVENT_PAL_TAG_PLAYER_RED 0x1100 #define OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION 0x1101 #define OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION 0x1102 #define OBJ_EVENT_PAL_TAG_NPC_BLUE 0x1103 #define OBJ_EVENT_PAL_TAG_NPC_PINK 0x1104 #define OBJ_EVENT_PAL_TAG_NPC_GREEN 0x1105 #define OBJ_EVENT_PAL_TAG_NPC_WHITE 0x1106 #define OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION 0x1107 #define OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION 0x1108 #define OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION 0x1109 #define OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION 0x110A #define OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP 0x110B #define OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION 0x110C #define OBJ_EVENT_PAL_TAG_RS_TRUCK 0x110D #define OBJ_EVENT_PAL_TAG_RS_MACHOKE 0x110E #define OBJ_EVENT_PAL_TAG_RS_POOCHYENA 0x110F #define OBJ_EVENT_PAL_TAG_PLAYER_GREEN 0x1110 #define OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION 0x1111 #define OBJ_EVENT_PAL_TAG_RS_MOVING_BOX 0x1112 #define OBJ_EVENT_PAL_TAG_METEORITE 0x1113 #define OBJ_EVENT_PAL_TAG_SEAGALLOP 0x1114 #define OBJ_EVENT_PAL_TAG_SS_ANNE 0x1115 #define OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER 0x1116 #define OBJ_EVENT_PAL_TAG_RS_KYOGRE 0x1117 #define OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION 0x1118 #define OBJ_EVENT_PAL_TAG_RS_GROUDON 0x1119 #define OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION 0x111A #define OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW 0x111B #define OBJ_EVENT_PAL_TAG_27 0x111C #define OBJ_EVENT_PAL_TAG_28 0x111D #define OBJ_EVENT_PAL_TAG_29 0x111E #define OBJ_EVENT_PAL_TAG_CABLE_CAR 0x111F #define OBJ_EVENT_PAL_TAG_31 0x1120 #define OBJ_EVENT_PAL_TAG_32 0x1121 #define OBJ_EVENT_PAL_TAG_33 0x1122 #define OBJ_EVENT_PAL_TAG_34 0x1123 #define OBJ_EVENT_PAL_TAG_LADY 0x1124 #define OBJ_EVENT_PAL_TAG_NONE 0x11FF #include "data/object_events/object_event_graphics_info_pointers.h" #include "data/field_effects/field_effect_object_template_pointers.h" #include "data/object_events/object_event_pic_tables.h" #include "data/object_events/object_event_anims.h" #include "data/object_events/base_oam.h" #include "data/object_events/object_event_subsprites.h" #include "data/object_events/object_event_graphics_info.h" static const struct SpritePalette sObjectEventSpritePalettes[] = { {gObjectEventPal_NpcBlue, OBJ_EVENT_PAL_TAG_NPC_BLUE}, {gObjectEventPal_NpcPink, OBJ_EVENT_PAL_TAG_NPC_PINK}, {gObjectEventPal_NpcGreen, OBJ_EVENT_PAL_TAG_NPC_GREEN}, {gObjectEventPal_NpcWhite, OBJ_EVENT_PAL_TAG_NPC_WHITE}, {gObjectEventPal_NpcBlueReflection, OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION}, {gObjectEventPal_NpcPinkReflection, OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION}, {gObjectEventPal_NpcGreenReflection, OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION}, {gObjectEventPal_NpcWhiteReflection, OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION}, {gObjectEventPal_Player, OBJ_EVENT_PAL_TAG_PLAYER_RED}, {gObjectEventPal_PlayerReflection, OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION}, {gObjectEventPal_BridgeReflection, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION}, {gObjectEventPal_RSQuintyPlump, OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP}, {gObjectEventPal_RSQuintyPlumpReflection, OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION}, {gObjectEventPal_Player, OBJ_EVENT_PAL_TAG_PLAYER_GREEN}, {gObjectEventPal_PlayerReflection, OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION}, {gObjectEventPal_Meteorite, OBJ_EVENT_PAL_TAG_METEORITE}, {gObjectEventPal_SSAnne, OBJ_EVENT_PAL_TAG_SS_ANNE}, {gObjectEventPal_Seagallop, OBJ_EVENT_PAL_TAG_SEAGALLOP}, {gUnderwaterEventObjectPalette, OBJ_EVENT_PAL_TAG_27}, {gEmBrendanPalette, OBJ_EVENT_PAL_TAG_28}, {gEmMayPalette, OBJ_EVENT_PAL_TAG_29}, {gObjectEventPal_CableCar, OBJ_EVENT_PAL_TAG_CABLE_CAR}, {gObjectEventPal_Lady, OBJ_EVENT_PAL_TAG_LADY}, {}, }; static const u16 sPlayerReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION, OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION, OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION, OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION, }; static const u16 sUnusedPlayerReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION, }; static const u16 sPlayerUnderwaterReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER, OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER, OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER, OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER, }; static const struct PairedPalettes gPlayerReflectionPaletteSets[] = { {OBJ_EVENT_PAL_TAG_PLAYER_RED, sPlayerReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_PLAYER_GREEN, sPlayerReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER, sPlayerUnderwaterReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_NONE, NULL}, }; static const u16 sRSQuintyPlumpReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION, OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION, OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION, OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION, }; static const u16 sRSTruckReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_RS_TRUCK, OBJ_EVENT_PAL_TAG_RS_TRUCK, OBJ_EVENT_PAL_TAG_RS_TRUCK, OBJ_EVENT_PAL_TAG_RS_TRUCK, }; static const u16 sRSMachokeReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_RS_MACHOKE, OBJ_EVENT_PAL_TAG_RS_MACHOKE, OBJ_EVENT_PAL_TAG_RS_MACHOKE, OBJ_EVENT_PAL_TAG_RS_MACHOKE, }; static const u16 sRSMovingBoxReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_RS_MOVING_BOX, OBJ_EVENT_PAL_TAG_RS_MOVING_BOX, OBJ_EVENT_PAL_TAG_RS_MOVING_BOX, OBJ_EVENT_PAL_TAG_RS_MOVING_BOX, }; static const u16 sMeteoriteReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_METEORITE, OBJ_EVENT_PAL_TAG_METEORITE, OBJ_EVENT_PAL_TAG_METEORITE, OBJ_EVENT_PAL_TAG_METEORITE, }; static const u16 sSeagallopReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_SEAGALLOP, OBJ_EVENT_PAL_TAG_SEAGALLOP, OBJ_EVENT_PAL_TAG_SEAGALLOP, OBJ_EVENT_PAL_TAG_SEAGALLOP, }; static const u16 sRSSubmarineShadowReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW, OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW, OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW, OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW, }; static const u16 sRSKyogreReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION, OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION, OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION, OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION, }; static const u16 sReflectionPaletteTags_CableCar[] = { OBJ_EVENT_PAL_TAG_CABLE_CAR, OBJ_EVENT_PAL_TAG_CABLE_CAR, OBJ_EVENT_PAL_TAG_CABLE_CAR, OBJ_EVENT_PAL_TAG_CABLE_CAR, }; static const u16 sReflectionPaletteTags_Lady[] = { OBJ_EVENT_PAL_TAG_LADY, OBJ_EVENT_PAL_TAG_LADY, OBJ_EVENT_PAL_TAG_LADY, OBJ_EVENT_PAL_TAG_LADY, }; static const u16 sRSGroudonReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION, OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION, OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION, OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION, }; static const u16 sGreenNPCReflectionPaletteTags[] = { OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION, }; const struct PairedPalettes gSpecialObjectReflectionPaletteSets[] = { {OBJ_EVENT_PAL_TAG_PLAYER_RED, sPlayerReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_PLAYER_GREEN, sPlayerReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP, sRSQuintyPlumpReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_RS_TRUCK, sRSTruckReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_RS_MACHOKE, sRSMachokeReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_RS_MOVING_BOX, sRSMovingBoxReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_METEORITE, sMeteoriteReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_SEAGALLOP, sSeagallopReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_RS_KYOGRE, sRSKyogreReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_RS_GROUDON, sRSGroudonReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_NPC_GREEN, sGreenNPCReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW, sRSSubmarineShadowReflectionPaletteTags}, {OBJ_EVENT_PAL_TAG_CABLE_CAR, sReflectionPaletteTags_CableCar}, {OBJ_EVENT_PAL_TAG_LADY, sReflectionPaletteTags_Lady}, {OBJ_EVENT_PAL_TAG_NONE, NULL}, }; static const u16 sObjectPaletteTags0[] = { OBJ_EVENT_PAL_TAG_PLAYER_RED, OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_BLUE, OBJ_EVENT_PAL_TAG_NPC_PINK, OBJ_EVENT_PAL_TAG_NPC_GREEN, OBJ_EVENT_PAL_TAG_NPC_WHITE, OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION, }; static const u16 sObjectPaletteTags1[] = { OBJ_EVENT_PAL_TAG_PLAYER_RED, OBJ_EVENT_PAL_TAG_PLAYER_GREEN, OBJ_EVENT_PAL_TAG_NPC_BLUE, OBJ_EVENT_PAL_TAG_NPC_PINK, OBJ_EVENT_PAL_TAG_NPC_GREEN, OBJ_EVENT_PAL_TAG_NPC_WHITE, OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION, }; static const u16 sObjectPaletteTags2[] = { OBJ_EVENT_PAL_TAG_PLAYER_RED, OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_BLUE, OBJ_EVENT_PAL_TAG_NPC_PINK, OBJ_EVENT_PAL_TAG_NPC_GREEN, OBJ_EVENT_PAL_TAG_NPC_WHITE, OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION, }; static const u16 sObjectPaletteTags3[] = { OBJ_EVENT_PAL_TAG_PLAYER_RED, OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_BLUE, OBJ_EVENT_PAL_TAG_NPC_PINK, OBJ_EVENT_PAL_TAG_NPC_GREEN, OBJ_EVENT_PAL_TAG_NPC_WHITE, OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION, OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION, }; static const u16 *const gObjectPaletteTagSets[] = { sObjectPaletteTags0, sObjectPaletteTags1, sObjectPaletteTags2, sObjectPaletteTags3, }; //#include "data/object_events/berry_tree_graphics_tables.h" #include "data/field_effects/field_effect_objects.h" static const s16 gMovementDelaysMedium[] = {32, 64, 96, 128}; static const s16 gMovementDelaysLong[] = {32, 64, 128, 192}; static const s16 gMovementDelaysShort[] = {32, 48, 64, 80}; #include "data/object_events/movement_type_func_tables.h" static const u8 sFaceDirectionAnimNums[] = { [DIR_NONE] = ANIM_STD_FACE_SOUTH, [DIR_SOUTH] = ANIM_STD_FACE_SOUTH, [DIR_NORTH] = ANIM_STD_FACE_NORTH, [DIR_WEST] = ANIM_STD_FACE_WEST, [DIR_EAST] = ANIM_STD_FACE_EAST, [DIR_SOUTHWEST] = ANIM_STD_FACE_SOUTH, [DIR_SOUTHEAST] = ANIM_STD_FACE_SOUTH, [DIR_NORTHWEST] = ANIM_STD_FACE_NORTH, [DIR_NORTHEAST] = ANIM_STD_FACE_NORTH, }; static const u8 sMoveDirectionAnimNums[] = { [DIR_NONE] = ANIM_STD_GO_SOUTH, [DIR_SOUTH] = ANIM_STD_GO_SOUTH, [DIR_NORTH] = ANIM_STD_GO_NORTH, [DIR_WEST] = ANIM_STD_GO_WEST, [DIR_EAST] = ANIM_STD_GO_EAST, [DIR_SOUTHWEST] = ANIM_STD_GO_SOUTH, [DIR_SOUTHEAST] = ANIM_STD_GO_SOUTH, [DIR_NORTHWEST] = ANIM_STD_GO_NORTH, [DIR_NORTHEAST] = ANIM_STD_GO_NORTH, }; static const u8 sMoveDirectionFastAnimNums[] = { [DIR_NONE] = ANIM_STD_GO_FAST_SOUTH, [DIR_SOUTH] = ANIM_STD_GO_FAST_SOUTH, [DIR_NORTH] = ANIM_STD_GO_FAST_NORTH, [DIR_WEST] = ANIM_STD_GO_FAST_WEST, [DIR_EAST] = ANIM_STD_GO_FAST_EAST, [DIR_SOUTHWEST] = ANIM_STD_GO_FAST_SOUTH, [DIR_SOUTHEAST] = ANIM_STD_GO_FAST_SOUTH, [DIR_NORTHWEST] = ANIM_STD_GO_FAST_NORTH, [DIR_NORTHEAST] = ANIM_STD_GO_FAST_NORTH, }; static const u8 sMoveDirectionFasterAnimNums[] = { [DIR_NONE] = ANIM_STD_GO_FASTER_SOUTH, [DIR_SOUTH] = ANIM_STD_GO_FASTER_SOUTH, [DIR_NORTH] = ANIM_STD_GO_FASTER_NORTH, [DIR_WEST] = ANIM_STD_GO_FASTER_WEST, [DIR_EAST] = ANIM_STD_GO_FASTER_EAST, [DIR_SOUTHWEST] = ANIM_STD_GO_FASTER_SOUTH, [DIR_SOUTHEAST] = ANIM_STD_GO_FASTER_SOUTH, [DIR_NORTHWEST] = ANIM_STD_GO_FASTER_NORTH, [DIR_NORTHEAST] = ANIM_STD_GO_FASTER_NORTH, }; static const u8 sMoveDirectionFastestAnimNums[] = { [DIR_NONE] = ANIM_STD_GO_FASTEST_SOUTH, [DIR_SOUTH] = ANIM_STD_GO_FASTEST_SOUTH, [DIR_NORTH] = ANIM_STD_GO_FASTEST_NORTH, [DIR_WEST] = ANIM_STD_GO_FASTEST_WEST, [DIR_EAST] = ANIM_STD_GO_FASTEST_EAST, [DIR_SOUTHWEST] = ANIM_STD_GO_FASTEST_SOUTH, [DIR_SOUTHEAST] = ANIM_STD_GO_FASTEST_SOUTH, [DIR_NORTHWEST] = ANIM_STD_GO_FASTEST_NORTH, [DIR_NORTHEAST] = ANIM_STD_GO_FASTEST_NORTH, }; static const u8 sJumpSpecialDirectionAnimNums[] = { [DIR_NONE] = ANIM_GET_ON_OFF_POKEMON_SOUTH, [DIR_SOUTH] = ANIM_GET_ON_OFF_POKEMON_SOUTH, [DIR_NORTH] = ANIM_GET_ON_OFF_POKEMON_NORTH, [DIR_WEST] = ANIM_GET_ON_OFF_POKEMON_WEST, [DIR_EAST] = ANIM_GET_ON_OFF_POKEMON_EAST, [DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, [DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, [DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_NORTH, [DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_NORTH, }; static const u8 sAcroBunnyHopBackWheelDirectionAnimNums[] = { [DIR_NONE] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, [DIR_SOUTH] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, [DIR_NORTH] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, [DIR_WEST] = ANIM_BUNNY_HOP_BACK_WHEEL_WEST, [DIR_EAST] = ANIM_BUNNY_HOP_BACK_WHEEL_EAST, [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, [DIR_NORTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, [DIR_NORTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, }; static const u8 sAcroBunnyHopFrontWheelDirectionAnimNums[] = { [DIR_NONE] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, [DIR_SOUTH] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, [DIR_NORTH] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH, [DIR_WEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_WEST, [DIR_EAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_EAST, [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, [DIR_NORTHWEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH, [DIR_NORTHEAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH, }; static const u8 sAcroStandingWheelieBackWheelDirectionAnimNums[] = { [DIR_NONE] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, [DIR_SOUTH] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, [DIR_NORTH] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, [DIR_WEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST, [DIR_EAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST, [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, }; static const u8 sSpinDirectionAnimNums[] = { [DIR_NONE] = ANIM_SPIN_SOUTH, [DIR_SOUTH] = ANIM_SPIN_SOUTH, [DIR_NORTH] = ANIM_SPIN_NORTH, [DIR_WEST] = ANIM_SPIN_WEST, [DIR_EAST] = ANIM_SPIN_EAST, [DIR_SOUTHWEST] = ANIM_SPIN_SOUTH, [DIR_SOUTHEAST] = ANIM_SPIN_NORTH, [DIR_NORTHWEST] = ANIM_SPIN_WEST, [DIR_NORTHEAST] = ANIM_SPIN_EAST, }; static const u8 sAcroStandingWheelieFrontWheelDirectionAnimNums[] = { [DIR_NONE] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, [DIR_SOUTH] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, [DIR_NORTH] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH, [DIR_WEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST, [DIR_EAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST, [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH, [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH, }; static const u8 sAcroMovingWheelieDirectionAnimNums[] = { [DIR_NONE] = ANIM_MOVING_WHEELIE_SOUTH, [DIR_SOUTH] = ANIM_MOVING_WHEELIE_SOUTH, [DIR_NORTH] = ANIM_MOVING_WHEELIE_NORTH, [DIR_WEST] = ANIM_MOVING_WHEELIE_WEST, [DIR_EAST] = ANIM_MOVING_WHEELIE_EAST, [DIR_SOUTHWEST] = ANIM_MOVING_WHEELIE_SOUTH, [DIR_SOUTHEAST] = ANIM_MOVING_WHEELIE_SOUTH, [DIR_NORTHWEST] = ANIM_MOVING_WHEELIE_NORTH, [DIR_NORTHEAST] = ANIM_MOVING_WHEELIE_NORTH, }; static const u8 sFishingDirectionAnimNums[] = { [DIR_NONE] = ANIM_TAKE_OUT_ROD_SOUTH, [DIR_SOUTH] = ANIM_TAKE_OUT_ROD_SOUTH, [DIR_NORTH] = ANIM_TAKE_OUT_ROD_NORTH, [DIR_WEST] = ANIM_TAKE_OUT_ROD_WEST, [DIR_EAST] = ANIM_TAKE_OUT_ROD_EAST, [DIR_SOUTHWEST] = ANIM_TAKE_OUT_ROD_SOUTH, [DIR_SOUTHEAST] = ANIM_TAKE_OUT_ROD_SOUTH, [DIR_NORTHWEST] = ANIM_TAKE_OUT_ROD_NORTH, [DIR_NORTHEAST] = ANIM_TAKE_OUT_ROD_NORTH, }; static const u8 sFishingNoCatchDirectionAnimNums[] = { [DIR_NONE] = ANIM_PUT_AWAY_ROD_SOUTH, [DIR_SOUTH] = ANIM_PUT_AWAY_ROD_SOUTH, [DIR_NORTH] = ANIM_PUT_AWAY_ROD_NORTH, [DIR_WEST] = ANIM_PUT_AWAY_ROD_WEST, [DIR_EAST] = ANIM_PUT_AWAY_ROD_EAST, [DIR_SOUTHWEST] = ANIM_PUT_AWAY_ROD_SOUTH, [DIR_SOUTHEAST] = ANIM_PUT_AWAY_ROD_SOUTH, [DIR_NORTHWEST] = ANIM_PUT_AWAY_ROD_NORTH, [DIR_NORTHEAST] = ANIM_PUT_AWAY_ROD_NORTH, }; static const u8 sFishingBiteDirectionAnimNums[] = { [DIR_NONE] = ANIM_HOOKED_POKEMON_SOUTH, [DIR_SOUTH] = ANIM_HOOKED_POKEMON_SOUTH, [DIR_NORTH] = ANIM_HOOKED_POKEMON_NORTH, [DIR_WEST] = ANIM_HOOKED_POKEMON_WEST, [DIR_EAST] = ANIM_HOOKED_POKEMON_EAST, [DIR_SOUTHWEST] = ANIM_HOOKED_POKEMON_SOUTH, [DIR_SOUTHEAST] = ANIM_HOOKED_POKEMON_SOUTH, [DIR_NORTHWEST] = ANIM_HOOKED_POKEMON_NORTH, [DIR_NORTHEAST] = ANIM_HOOKED_POKEMON_NORTH, }; static const u8 sRunningDirectionAnimNums[] = { [DIR_NONE] = ANIM_RUN_SOUTH, [DIR_SOUTH] = ANIM_RUN_SOUTH, [DIR_NORTH] = ANIM_RUN_NORTH, [DIR_WEST] = ANIM_RUN_WEST, [DIR_EAST] = ANIM_RUN_EAST, [DIR_SOUTHWEST] = ANIM_RUN_SOUTH, [DIR_SOUTHEAST] = ANIM_RUN_SOUTH, [DIR_NORTHWEST] = ANIM_RUN_NORTH, [DIR_NORTHEAST] = ANIM_RUN_NORTH, }; static const u8 sTrainerFacingDirectionMovementTypes[] = { [DIR_NONE] = MOVEMENT_TYPE_FACE_DOWN, [DIR_SOUTH] = MOVEMENT_TYPE_FACE_DOWN, [DIR_NORTH] = MOVEMENT_TYPE_FACE_UP, [DIR_WEST] = MOVEMENT_TYPE_FACE_LEFT, [DIR_EAST] = MOVEMENT_TYPE_FACE_RIGHT, [DIR_SOUTHWEST] = MOVEMENT_TYPE_FACE_DOWN, [DIR_SOUTHEAST] = MOVEMENT_TYPE_FACE_DOWN, [DIR_NORTHWEST] = MOVEMENT_TYPE_FACE_UP, [DIR_NORTHEAST] = MOVEMENT_TYPE_FACE_UP, }; bool8 (*const gOppositeDirectionBlockedMetatileFuncs[])(u8) = { MetatileBehavior_IsSouthBlocked, MetatileBehavior_IsNorthBlocked, MetatileBehavior_IsWestBlocked, MetatileBehavior_IsEastBlocked }; bool8 (*const gDirectionBlockedMetatileFuncs[])(u8) = { MetatileBehavior_IsNorthBlocked, MetatileBehavior_IsSouthBlocked, MetatileBehavior_IsEastBlocked, MetatileBehavior_IsWestBlocked }; static const struct Coords16 sDirectionToVectors[] = { [DIR_NONE] = { 0, 0}, [DIR_SOUTH] = { 0, 1}, [DIR_NORTH] = { 0, -1}, [DIR_WEST] = {-1, 0}, [DIR_EAST] = { 1, 0}, [DIR_SOUTHWEST] = {-1, 1}, [DIR_SOUTHEAST] = { 1, 1}, [DIR_NORTHWEST] = {-1, -1}, [DIR_NORTHEAST] = { 1, -1}, }; static const u8 sFaceDirectionMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_FACE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_FACE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_FACE_UP, [DIR_WEST] = MOVEMENT_ACTION_FACE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_FACE_RIGHT, }; static const u8 sFaceDirectionFastMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_FACE_DOWN_FAST, [DIR_SOUTH] = MOVEMENT_ACTION_FACE_DOWN_FAST, [DIR_NORTH] = MOVEMENT_ACTION_FACE_UP_FAST, [DIR_WEST] = MOVEMENT_ACTION_FACE_LEFT_FAST, [DIR_EAST] = MOVEMENT_ACTION_FACE_RIGHT_FAST, }; static const u8 sWalkSlowestMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_SLOWEST_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_SLOWEST_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_SLOWEST_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_SLOWEST_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_SLOWEST_RIGHT, }; static const u8 sWalkSlowerMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_SLOWER_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_SLOWER_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_SLOWER_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_SLOWER_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_SLOWER_RIGHT, }; static const u8 sWalkSlowMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_SLOW_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_SLOW_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_SLOW_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_SLOW_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_SLOW_RIGHT, }; static const u8 sWalkNormalMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_NORMAL_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_NORMAL_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_NORMAL_RIGHT, }; static const u8 sWalkFastMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_FAST_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_FAST_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_FAST_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_FAST_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_FAST_RIGHT, }; static const u8 sGlideMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_GLIDE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_GLIDE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_GLIDE_UP, [DIR_WEST] = MOVEMENT_ACTION_GLIDE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_GLIDE_RIGHT, }; static const u8 sRideWaterCurrentMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP, [DIR_WEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT, [DIR_EAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT, }; static const u8 sWalkFasterMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_FASTER_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_FASTER_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_FASTER_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_FASTER_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_FASTER_RIGHT, }; static const u8 sSlideMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_SLIDE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_SLIDE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_SLIDE_UP, [DIR_WEST] = MOVEMENT_ACTION_SLIDE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_SLIDE_RIGHT, }; static const u8 sPlayerRunMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_PLAYER_RUN_UP, [DIR_WEST] = MOVEMENT_ACTION_PLAYER_RUN_LEFT, [DIR_EAST] = MOVEMENT_ACTION_PLAYER_RUN_RIGHT, }; static const u8 sPlayerRunSlowMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW, [DIR_SOUTH] = MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW, [DIR_NORTH] = MOVEMENT_ACTION_PLAYER_RUN_UP_SLOW, [DIR_WEST] = MOVEMENT_ACTION_PLAYER_RUN_LEFT_SLOW, [DIR_EAST] = MOVEMENT_ACTION_PLAYER_RUN_RIGHT_SLOW, }; static const u8 sSpinMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_SPIN_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_SPIN_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_SPIN_UP, [DIR_WEST] = MOVEMENT_ACTION_SPIN_LEFT, [DIR_EAST] = MOVEMENT_ACTION_SPIN_RIGHT, }; static const u8 sJump2MovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_JUMP_2_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_2_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_JUMP_2_UP, [DIR_WEST] = MOVEMENT_ACTION_JUMP_2_LEFT, [DIR_EAST] = MOVEMENT_ACTION_JUMP_2_RIGHT, }; static const u8 sJumpInPlaceMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_JUMP_IN_PLACE_UP, [DIR_WEST] = MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT, }; static const u8 sJumpInPlaceTurnAroundMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP, [DIR_WEST] = MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT, [DIR_EAST] = MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT, }; static const u8 sJumpMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_JUMP_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_JUMP_UP, [DIR_WEST] = MOVEMENT_ACTION_JUMP_LEFT, [DIR_EAST] = MOVEMENT_ACTION_JUMP_RIGHT, }; static const u8 sJumpSpecialMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_JUMP_SPECIAL_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_SPECIAL_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_JUMP_SPECIAL_UP, [DIR_WEST] = MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, [DIR_EAST] = MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, }; static const u8 sJumpSpecialWithEffectMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_UP, [DIR_WEST] = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_LEFT, [DIR_EAST] = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_RIGHT, }; static const u8 sWalkInPlaceSlowMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, }; static const u8 sWalkInPlaceNormalMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, }; static const u8 sWalkInPlaceFastMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, }; static const u8 sWalkInPlaceFasterMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT, }; static const u8 sAcroWheelieFaceDirectionMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP, [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT, }; static const u8 sAcroPopWheelieFaceDirectionMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP, [DIR_WEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT, }; static const u8 sAcroEndWheelieFaceDirectionMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP, [DIR_WEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT, }; static const u8 sAcroWheelieHopFaceDirectionMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP, [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT, }; static const u8 sAcroWheelieHopMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP, [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT, [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT, }; static const u8 sAcroWheelieJumpMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP, [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT, [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT, }; static const u8 sAcroWheelieInPlaceMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP, [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT, }; static const u8 sAcroPopWheelieMoveMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP, [DIR_WEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT, }; static const u8 sAcroWheelieMoveMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP, [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT, [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT, }; static const u8 gOppositeDirections[] = { DIR_NORTH, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTHEAST, DIR_NORTHWEST, DIR_SOUTHEAST, DIR_SOUTHWEST, }; static const u8 sPlayerDirectionsForCopy[][4] = { {2, 1, 4, 3}, {1, 2, 3, 4}, {3, 4, 2, 1}, {4, 3, 1, 2} }; static const u8 sPlayerDirectionToCopyDirection[][4] = { {2, 1, 4, 3}, {1, 2, 3, 4}, {4, 3, 1, 2}, {3, 4, 2, 1} }; #include "data/object_events/movement_action_func_tables.h" static void ClearObjectEvent(struct ObjectEvent *objectEvent) { *objectEvent = (struct ObjectEvent){}; objectEvent->localId = 0xFF; objectEvent->mapNum = MAP_NUM(UNDEFINED); objectEvent->mapGroup = MAP_GROUP(UNDEFINED); objectEvent->movementActionId = MOVEMENT_ACTION_NONE; } static void ClearAllObjectEvents(void) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) ClearObjectEvent(&gObjectEvents[i]); } void ResetObjectEvents(void) { ClearLinkPlayerObjectEvents(); ClearAllObjectEvents(); ClearPlayerAvatarInfo(); CreateReflectionEffectSprites(); } static void CreateReflectionEffectSprites(void) { u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_REFLECTION_DISTORTION], 0, 0, 31); gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; InitSpriteAffineAnim(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], 0); gSprites[spriteId].invisible = TRUE; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_REFLECTION_DISTORTION], 0, 0, 31); gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; InitSpriteAffineAnim(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], 1); gSprites[spriteId].invisible = TRUE; } u8 GetFirstInactiveObjectEventId(void) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (!gObjectEvents[i].active) break; } return i; } u8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId) { if (localId < OBJ_EVENT_ID_PLAYER) { return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId); } return GetObjectEventIdByLocalId(localId); } bool8 TryGetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId, u8 *objectEventId) { *objectEventId = GetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroupId); if (*objectEventId == OBJECT_EVENTS_COUNT) return TRUE; else return FALSE; } u8 GetObjectEventIdByXY(s16 x, s16 y) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active && gObjectEvents[i].currentCoords.x == x && gObjectEvents[i].currentCoords.y == y) break; } return i; } static u8 GetObjectEventIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroupId) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active && gObjectEvents[i].localId == localId && gObjectEvents[i].mapNum == mapNum && gObjectEvents[i].mapGroup == mapGroupId) return i; } return OBJECT_EVENTS_COUNT; } static u8 GetObjectEventIdByLocalId(u8 localId) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active && gObjectEvents[i].localId == localId) return i; } return OBJECT_EVENTS_COUNT; } static u8 InitObjectEventStateFromTemplate(const struct ObjectEventTemplate *template, u8 mapNum, u8 mapGroup) { struct ObjectEvent *objectEvent; const struct MapHeader *mapHeader; u8 objectEventId; s16 x; s16 y; bool8 isClone = FALSE; u8 localId = 0; s16 x2 = 0; s16 y2 = 0; s16 x3 = 0; s16 y3 = 0; if (template->kind == OBJ_KIND_CLONE) { isClone = TRUE; localId = template->objUnion.clone.targetLocalId; mapNum = template->objUnion.clone.targetMapNum; mapGroup = template->objUnion.clone.targetMapGroup; x2 = template->x; y2 = template->y; x3 = template->x; y3 = template->y; mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); template = &(mapHeader->events->objectEvents[localId - 1]); } if (GetAvailableObjectEventId(template->localId, mapNum, mapGroup, &objectEventId)) return OBJECT_EVENTS_COUNT; if (!ShouldInitObjectEventStateFromTemplate(template, isClone, x3, y3)) return OBJECT_EVENTS_COUNT; objectEvent = &gObjectEvents[objectEventId]; ClearObjectEvent(objectEvent); if (isClone) { x = x2 + MAP_OFFSET; y = y2 + MAP_OFFSET; } else { x = template->x + MAP_OFFSET; y = template->y + MAP_OFFSET; } objectEvent->active = TRUE; objectEvent->triggerGroundEffectsOnMove = TRUE; objectEvent->graphicsId = template->graphicsId; objectEvent->movementType = template->objUnion.normal.movementType; objectEvent->localId = template->localId; objectEvent->mapNum = mapNum; objectEvent->mapGroup = mapGroup; objectEvent->initialCoords.x = x; objectEvent->initialCoords.y = y; objectEvent->currentCoords.x = x; objectEvent->currentCoords.y = y; objectEvent->previousCoords.x = x; objectEvent->previousCoords.y = y; objectEvent->currentElevation = template->objUnion.normal.elevation; objectEvent->previousElevation = template->objUnion.normal.elevation; objectEvent->rangeX = template->objUnion.normal.movementRangeX; objectEvent->rangeY = template->objUnion.normal.movementRangeY; objectEvent->trainerType = template->objUnion.normal.trainerType; objectEvent->trainerRange_berryTreeId = template->objUnion.normal.trainerRange_berryTreeId; objectEvent->mapNum = mapNum; // oops (yes this is required for matching) objectEvent->previousMovementDirection = gInitialMovementTypeFacingDirections[template->objUnion.normal.movementType]; SetObjectEventDirection(objectEvent, objectEvent->previousMovementDirection); SetObjectEventDynamicGraphicsId(objectEvent); if (gRangedMovementTypes[objectEvent->movementType]) { if (objectEvent->rangeX == 0) objectEvent->rangeX++; if (objectEvent->rangeY == 0) objectEvent->rangeY++; } return objectEventId; } static bool8 ShouldInitObjectEventStateFromTemplate(const struct ObjectEventTemplate *template, bool8 isClone, s16 x, s16 y) { if (isClone && !TemplateIsObstacleAndWithinView(template, x, y)) return FALSE; if (!TemplateIsObstacleAndVisibleFromConnectingMap(template, x, y)) return FALSE; return TRUE; } static bool8 TemplateIsObstacleAndWithinView(const struct ObjectEventTemplate *template, s16 x, s16 y) { if (template->graphicsId == OBJ_EVENT_GFX_CUT_TREE || template->graphicsId == OBJ_EVENT_GFX_ROCK_SMASH_ROCK) { if (gSaveBlock1Ptr->pos.x < x) { if (gSaveBlock1Ptr->pos.x + (MAP_OFFSET + 1) < x) return TRUE; if (gSaveBlock1Ptr->pos.y - (MAP_OFFSET - 1) <= y && gSaveBlock1Ptr->pos.y + (MAP_OFFSET - 1) >= y) return FALSE; } else { if (gSaveBlock1Ptr->pos.x - (MAP_OFFSET + 1) > x) return TRUE; if (gSaveBlock1Ptr->pos.y - (MAP_OFFSET - 1) <= y && gSaveBlock1Ptr->pos.y + (MAP_OFFSET - 1) >= y) return FALSE; } } return TRUE; } static bool8 TemplateIsObstacleAndVisibleFromConnectingMap(const struct ObjectEventTemplate *template, s16 unused1, s16 unused2) { if (IsMapTypeOutdoors(GetCurrentMapType())) { s32 width = VMap.Xsize - MAP_OFFSET_W - 1; s32 height = VMap.Ysize - MAP_OFFSET_H - 1; if (template->graphicsId == OBJ_EVENT_GFX_CUT_TREE || template->graphicsId == OBJ_EVENT_GFX_ROCK_SMASH_ROCK) { if (gSaveBlock1Ptr->pos.x == 0 && template->x <= (MAP_OFFSET + 1)) { SetHideObstacleFlag(template); return FALSE; } if (gSaveBlock1Ptr->pos.x == width && template->x >= width - (MAP_OFFSET + 1)) { SetHideObstacleFlag(template); return FALSE; } if (gSaveBlock1Ptr->pos.y == 0 && template->y <= (MAP_OFFSET - 1)) { SetHideObstacleFlag(template); return FALSE; } if (gSaveBlock1Ptr->pos.y == height && template->y >= height - (MAP_OFFSET - 1)) { SetHideObstacleFlag(template); return FALSE; } } } return TRUE; } static void SetHideObstacleFlag(const struct ObjectEventTemplate *template) { if (template->flagId >= FLAG_TEMP_11 && template->flagId <= FLAG_TEMP_1F) FlagSet(template->flagId); } u8 Unref_TryInitLocalObjectEvent(u8 localId) { u32 i; u8 objectEventCount; struct ObjectEventTemplate *template; if (gMapHeader.events == NULL) return OBJECT_EVENTS_COUNT; objectEventCount = gMapHeader.events->objectEventCount; for (i = 0; i < objectEventCount; i++) { template = &gSaveBlock1Ptr->objectEventTemplates[i]; if (template->localId == localId && !FlagGet(template->flagId)) return InitObjectEventStateFromTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } return OBJECT_EVENTS_COUNT; } static bool8 GetAvailableObjectEventId(u16 localId, u8 mapNum, u8 mapGroup, u8 *objectEventId) // Looks for an empty slot. // Returns FALSE and the location of the available slot // in *objectEventId. // If no slots are available, or if the object is already // loaded, returns TRUE. { u8 i = 0; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (!gObjectEvents[i].active) break; if (gObjectEvents[i].localId == localId && gObjectEvents[i].mapNum == mapNum && gObjectEvents[i].mapGroup == mapGroup) return TRUE; } if (i >= OBJECT_EVENTS_COUNT) return TRUE; *objectEventId = i; do { if (gObjectEvents[i].active && gObjectEvents[i].localId == localId && gObjectEvents[i].mapNum == mapNum && gObjectEvents[i].mapGroup == mapGroup) return TRUE; i++; } while (i < OBJECT_EVENTS_COUNT); return FALSE; } void RemoveObjectEvent(struct ObjectEvent *objectEvent) { objectEvent->active = FALSE; RemoveObjectEventInternal(objectEvent); } void RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { FlagSet(GetObjectEventFlagIdByObjectEventId(objectEventId)); RemoveObjectEvent(&gObjectEvents[objectEventId]); } } static void RemoveObjectEventInternal(struct ObjectEvent *objectEvent) { struct SpriteFrameImage image; image.size = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->size; gSprites[objectEvent->spriteId].images = ℑ DestroySprite(&gSprites[objectEvent->spriteId]); } void Unref_RemoveAllObjectEventsExceptPlayer(void) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (i != gPlayerAvatar.objectEventId) RemoveObjectEvent(&gObjectEvents[i]); } } static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEventTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) { u8 spriteId; u8 objectEventId; struct Sprite *sprite; struct ObjectEvent *objectEvent; const struct ObjectEventGraphicsInfo *graphicsInfo; objectEventId = InitObjectEventStateFromTemplate(objectEventTemplate, mapNum, mapGroup); if (objectEventId == OBJECT_EVENTS_COUNT) return OBJECT_EVENTS_COUNT; objectEvent = &gObjectEvents[objectEventId]; graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); if(graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_28 || graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_29) //em brendan/may LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); if (graphicsInfo->paletteSlot == PALSLOT_PLAYER) LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); else if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE) objectEvent->invisible = TRUE; *(u16 *)&spriteTemplate->paletteTag = TAG_NONE; spriteId = CreateSprite(spriteTemplate, 0, 0, 0); if (spriteId == MAX_SPRITES) { gObjectEvents[objectEventId].active = FALSE; return OBJECT_EVENTS_COUNT; } sprite = &gSprites[spriteId]; GetMapCoordsFromSpritePos(objectEvent->currentCoords.x + cameraX, objectEvent->currentCoords.y + cameraY, &sprite->x, &sprite->y); sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->x += 8; sprite->y += 16 + sprite->centerToCornerVecY; sprite->oam.paletteNum = graphicsInfo->paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->data[0] = objectEventId; objectEvent->spriteId = spriteId; objectEvent->inanimate = graphicsInfo->inanimate; if (!objectEvent->inanimate) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); SetObjectSubpriorityByElevation(objectEvent->previousElevation, sprite, 1); UpdateObjectEventVisibility(objectEvent, sprite); 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; graphicsInfo = GetObjectEventGraphicsInfo(objectEventTemplate->graphicsId); MakeObjectTemplateFromObjectEventTemplate(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); return objectEventId; } u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate) { s16 cameraX; s16 cameraY; GetObjectEventMovingCameraOffset(&cameraX, &cameraY); return TrySpawnObjectEventTemplate(objectEventTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); } int SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation) { struct ObjectEventTemplate objectEventTemplate; x -= MAP_OFFSET; y -= MAP_OFFSET; objectEventTemplate.localId = localId; objectEventTemplate.graphicsId = graphicsId; objectEventTemplate.kind = OBJ_KIND_NORMAL; objectEventTemplate.x = x; objectEventTemplate.y = y; objectEventTemplate.objUnion.normal.elevation = elevation; objectEventTemplate.objUnion.normal.movementType = movementBehavior; objectEventTemplate.objUnion.normal.movementRangeX = 0; objectEventTemplate.objUnion.normal.movementRangeY = 0; objectEventTemplate.objUnion.normal.trainerType = TRAINER_TYPE_NONE; objectEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0; return SpawnSpecialObjectEvent(&objectEventTemplate); } u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup) { const struct ObjectEventTemplate *objectEventTemplate; s16 cameraX, cameraY; objectEventTemplate = GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup); if (!objectEventTemplate) return OBJECT_EVENTS_COUNT; GetObjectEventMovingCameraOffset(&cameraX, &cameraY); return TrySpawnObjectEventTemplate(objectEventTemplate, mapNum, mapGroup, cameraX, cameraY); } void CopyObjectGraphicsInfoToSpriteTemplate(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) { const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); spriteTemplate->tileTag = graphicsInfo->tileTag; spriteTemplate->paletteTag = graphicsInfo->paletteTag; spriteTemplate->oam = graphicsInfo->oam; spriteTemplate->anims = graphicsInfo->anims; spriteTemplate->images = graphicsInfo->images; spriteTemplate->affineAnims = graphicsInfo->affineAnims; do { if (ScriptContext_IsEnabled() != TRUE && QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING) spriteTemplate->callback = QL_UpdateObject; else spriteTemplate->callback = callback; } while (0); *subspriteTables = graphicsInfo->subspriteTables; } static void CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(u16 graphicsId, u16 movementType, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) { CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, sMovementTypeCallbacks[movementType], spriteTemplate, subspriteTables); } static void MakeObjectTemplateFromObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) { CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEventTemplate->graphicsId, objectEventTemplate->objUnion.normal.movementType, spriteTemplate, subspriteTables); } // Used to create a sprite using a graphicsId associated with object events. u8 CreateObjectGraphicsSprite(u16 graphicsId, SpriteCallback callback, s16 x, s16 y, u8 subpriority) { struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables; u8 spriteId; CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, &spriteTemplate, &subspriteTables); if (spriteTemplate.paletteTag != TAG_NONE) LoadObjectEventPalette(spriteTemplate.paletteTag); spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); if (spriteId != MAX_SPRITES && subspriteTables != NULL) { SetSubspriteTables(&gSprites[spriteId], subspriteTables); gSprites[spriteId].subspriteMode = SUBSPRITES_IGNORE_PRIORITY; } return spriteId; } #define sVirtualObjId data[0] #define sVirtualObjElev data[1] u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction) { u8 spriteId; struct Sprite *sprite; struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables; const struct ObjectEventGraphicsInfo *graphicsInfo; graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, SpriteCB_VirtualObject, &spriteTemplate, &subspriteTables); *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; x += MAP_OFFSET; y += MAP_OFFSET; SetSpritePosToOffsetMapCoords(&x, &y, 8, 16); spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->y += sprite->centerToCornerVecY; sprite->oam.paletteNum = graphicsInfo->paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->sVirtualObjId = virtualObjId; sprite->sVirtualObjElev = elevation; if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); if (subspriteTables != NULL) { SetSubspriteTables(sprite, subspriteTables); sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; } InitObjectPriorityByElevation(sprite, elevation); SetObjectSubpriorityByElevation(elevation, sprite, 1); StartSpriteAnim(sprite, GetFaceDirectionAnimNum(direction)); } return spriteId; } u8 CreateFameCheckerObject(u8 graphicsId, u8 localId, s16 x, s16 y) { u8 spriteId; struct Sprite *sprite; struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables; const struct ObjectEventGraphicsInfo *graphicsInfo; graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, SpriteCallbackDummy, &spriteTemplate, &subspriteTables); *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->y += sprite->centerToCornerVecY; sprite->oam.paletteNum = graphicsInfo->paletteSlot; sprite->data[0] = localId; if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); if (subspriteTables != NULL) { SetSubspriteTables(sprite, subspriteTables); sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; } StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_SOUTH)); } return spriteId; } void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) { u32 i; u8 objectCount; if (gMapHeader.events != NULL) { s16 left = gSaveBlock1Ptr->pos.x - 2; s16 right = gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2; s16 top = gSaveBlock1Ptr->pos.y; s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2; objectCount = gMapHeader.events->objectEventCount; for (i = 0; i < objectCount; i++) { struct ObjectEventTemplate *template = &gSaveBlock1Ptr->objectEventTemplates[i]; s16 npcX = template->x + MAP_OFFSET; s16 npcY = template->y + MAP_OFFSET; if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) TrySpawnObjectEventTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); } } } void RemoveObjectEventsOutsideView(void) { u8 i, j; bool8 isActiveLinkPlayer; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { for (j = 0, isActiveLinkPlayer = FALSE; j < NELEMS(gLinkPlayerObjectEvents); j++) { if (gLinkPlayerObjectEvents[j].active && i == gLinkPlayerObjectEvents[j].objEventId) isActiveLinkPlayer = TRUE; } if (!isActiveLinkPlayer) { struct ObjectEvent *objectEvent = &gObjectEvents[i]; if (objectEvent->active && !objectEvent->isPlayer) RemoveObjectEventIfOutsideView(objectEvent); } } } static void RemoveObjectEventIfOutsideView(struct ObjectEvent *objectEvent) { s16 left = gSaveBlock1Ptr->pos.x - 2; s16 right = gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2; s16 top = gSaveBlock1Ptr->pos.y; s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2; if (objectEvent->currentCoords.x >= left && objectEvent->currentCoords.x <= right && objectEvent->currentCoords.y >= top && objectEvent->currentCoords.y <= bottom) return; if (objectEvent->initialCoords.x >= left && objectEvent->initialCoords.x <= right && objectEvent->initialCoords.y >= top && objectEvent->initialCoords.y <= bottom) return; RemoveObjectEvent(objectEvent); } void SpawnObjectEventsOnReturnToField(s16 x, s16 y) { u32 i; ClearPlayerAvatarInfo(); for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active) SpawnObjectEventOnReturnToField(i, x, y); } CreateReflectionEffectSprites(); } static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) { u8 spriteId; struct Sprite *sprite; struct ObjectEvent *objectEvent; struct SpriteTemplate spriteTemplate; struct SpriteFrameImage spriteFrameImage; const struct SubspriteTable *subspriteTables; const struct ObjectEventGraphicsInfo *graphicsInfo; #define i spriteId for (i = 0; i < NELEMS(gLinkPlayerObjectEvents); i++) { if (gLinkPlayerObjectEvents[i].active && objectEventId == gLinkPlayerObjectEvents[i].objEventId) return; } #undef i objectEvent = &gObjectEvents[objectEventId]; objectEvent++;objectEvent--; // fakematch subspriteTables = NULL; graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); spriteFrameImage.size = graphicsInfo->size; CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables); spriteTemplate.images = &spriteFrameImage; *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; if (graphicsInfo->paletteSlot == PALSLOT_PLAYER) LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); if (graphicsInfo->paletteSlot >= PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; spriteId = CreateSprite(&spriteTemplate, 0, 0, 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; GetMapCoordsFromSpritePos(x + objectEvent->currentCoords.x, y + 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; sprite->images = graphicsInfo->images; if (objectEvent->movementType == MOVEMENT_TYPE_PLAYER) { SetPlayerAvatarObjectEventIdAndObjectId(objectEventId, spriteId); objectEvent->warpArrowSpriteId = CreateWarpArrowSprite(); } if (subspriteTables != NULL) SetSubspriteTables(sprite, subspriteTables); sprite->oam.paletteNum = graphicsInfo->paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->data[0] = objectEventId; objectEvent->spriteId = spriteId; if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); ResetObjectEventFldEffData(objectEvent); SetObjectSubpriorityByElevation(objectEvent->previousElevation, sprite, 1); } } static void ResetObjectEventFldEffData(struct ObjectEvent *objectEvent) { objectEvent->singleMovementActive = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; objectEvent->hasShadow = FALSE; objectEvent->hasReflection = FALSE; objectEvent->inShortGrass = FALSE; objectEvent->inShallowFlowingWater = FALSE; objectEvent->inSandPile = FALSE; objectEvent->inHotSprings = FALSE; ObjectEventClearHeldMovement(objectEvent); } static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteId) { gPlayerAvatar.objectEventId = objectEventId; gPlayerAvatar.spriteId = spriteId; gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gObjectEvents[objectEventId].graphicsId); SetPlayerAvatarExtraStateTransition(gObjectEvents[objectEventId].graphicsId, PLAYER_AVATAR_FLAG_CONTROLLABLE); } void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) { const struct ObjectEventGraphicsInfo *graphicsInfo; struct Sprite *sprite; u8 var; u8 var3; graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); sprite = &gSprites[objectEvent->spriteId]; if (graphicsInfo->paletteSlot == PALSLOT_PLAYER) PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); var = sprite->images->size / TILE_SIZE_4BPP; if (!sprite->usingSheet) { FreeSpriteTilesIfNotUsingSheet(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; sprite->oam.paletteNum = graphicsInfo->paletteSlot; if (!sprite->usingSheet) { s32 var2; var3 = sprite->images->size / TILE_SIZE_4BPP; var2 = AllocSpriteTiles(var3); if (var2 == -1) { var2 = AllocSpriteTiles(var); } sprite->oam.tileNum = var2; } 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(); } } void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { ObjectEventSetGraphicsId(&gObjectEvents[objectEventId], graphicsId); } } void ObjectEventTurn(struct ObjectEvent *objectEvent, u8 direction) { SetObjectEventDirection(objectEvent, direction); if (!objectEvent->inanimate) { StartSpriteAnim(&gSprites[objectEvent->spriteId], GetFaceDirectionAnimNum(objectEvent->facingDirection)); SeekSpriteAnim(&gSprites[objectEvent->spriteId], 0); } } void ObjectEventTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { ObjectEventTurn(&gObjectEvents[objectEventId], direction); } } void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction) { ObjectEventTurn(&gObjectEvents[playerAvatar->objectEventId], direction); } const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId) { if (graphicsId >= OBJ_EVENT_GFX_VARS) graphicsId = VarGetObjectEventGraphicsId(graphicsId - OBJ_EVENT_GFX_VARS); if (graphicsId >= NUM_OBJ_EVENT_GFX) graphicsId = OBJ_EVENT_GFX_LITTLE_BOY; return gObjectEventGraphicsInfoPointers[graphicsId]; } static void SetObjectEventDynamicGraphicsId(struct ObjectEvent *objectEvent) { if (objectEvent->graphicsId >= OBJ_EVENT_GFX_VARS) { objectEvent->graphicsId = VarGetObjectEventGraphicsId(objectEvent->graphicsId - OBJ_EVENT_GFX_VARS); } } void SetObjectInvisibility(u8 localId, u8 mapNum, u8 mapGroup, u8 state) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { gObjectEvents[objectEventId].invisible = state; } } void ObjectEventGetLocalIdAndMap(struct ObjectEvent *objectEvent, void *localId, void *mapNum, void *mapGroup) { *(u8 *)(localId) = objectEvent->localId; *(u8 *)(mapNum) = objectEvent->mapNum; *(u8 *)(mapGroup) = objectEvent->mapGroup; } void EnableObjectGroundEffectsByXY(s16 x, s16 y) { u8 objectEventId; struct ObjectEvent *objectEvent; objectEventId = GetObjectEventIdByXY(x, y); if (objectEventId != OBJECT_EVENTS_COUNT) { objectEvent = &gObjectEvents[objectEventId]; objectEvent->triggerGroundEffectsOnMove = TRUE; } } void SetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) { u8 objectEventId; struct ObjectEvent *objectEvent; struct Sprite *sprite; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { objectEvent = &gObjectEvents[objectEventId]; sprite = &gSprites[objectEvent->spriteId]; objectEvent->fixedPriority = TRUE; sprite->subpriority = subpriority; } } void ResetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; struct ObjectEvent *objectEvent; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { objectEvent = &gObjectEvents[objectEventId]; objectEvent->fixedPriority = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; } } void SetObjectPositionByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) { u8 objectEventId; struct Sprite *sprite; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { sprite = &gSprites[gObjectEvents[objectEventId].spriteId]; sprite->x2 = x; sprite->y2 = y; } } void FreeAndReserveObjectSpritePalettes(void) { FreeAllSpritePalettes(); gReservedSpritePaletteCount = OBJ_PALSLOT_COUNT; } static void LoadObjectEventPalette(u16 paletteTag) { u16 i = FindObjectEventPaletteIndexByTag(paletteTag); #ifdef BUGFIX if (sObjectEventSpritePalettes[i].tag != OBJ_EVENT_PAL_TAG_NONE) #else if (i != OBJ_EVENT_PAL_TAG_NONE) // always true #endif { TryLoadObjectPalette(&sObjectEventSpritePalettes[i]); } } // Unused void LoadObjectEventPaletteSet(u16 *paletteTags) { u32 i; for (i = 0; paletteTags[i] != OBJ_EVENT_PAL_TAG_NONE; i++) { LoadObjectEventPalette(paletteTags[i]); } } static u8 TryLoadObjectPalette(const struct SpritePalette *spritePalette) { if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xFF) { // Already loaded return 0xFF; } return LoadSpritePalette(spritePalette); } void PatchObjectPalette(u16 paletteTag, u8 paletteSlot) { u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag); LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, OBJ_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP); ApplyGlobalFieldPaletteTint(paletteSlot); } void PatchObjectPaletteRange(const u16 *paletteTags, u8 minSlot, u8 maxSlot) { while (minSlot < maxSlot) { PatchObjectPalette(*paletteTags, minSlot); paletteTags++; minSlot++; } } static u8 FindObjectEventPaletteIndexByTag(u16 tag) { u32 i; for (i = 0; sObjectEventSpritePalettes[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) { if (sObjectEventSpritePalettes[i].tag == tag) { return i; } } return 0xFF; } void LoadPlayerObjectReflectionPalette(u16 tag, u8 slot) { u32 i; PatchObjectPalette(tag, slot); for (i = 0; gPlayerReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) { if (gPlayerReflectionPaletteSets[i].tag == tag) { PatchObjectPalette(gPlayerReflectionPaletteSets[i].data[sCurrentReflectionType], gReflectionEffectPaletteMap[slot]); return; } } } void LoadSpecialObjectReflectionPalette(u16 tag, u8 slot) { u32 i; sCurrentSpecialObjectPaletteTag = tag; PatchObjectPalette(tag, slot); for (i = 0; gSpecialObjectReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) { if (gSpecialObjectReflectionPaletteSets[i].tag == tag) { PatchObjectPalette(gSpecialObjectReflectionPaletteSets[i].data[sCurrentReflectionType], gReflectionEffectPaletteMap[slot]); return; } } } // Unused static u8 GetReflectionEffectPaletteSlot(u8 slot) { return gReflectionEffectPaletteMap[slot]; } // Unused void IncrementObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) { objectEvent->previousCoords.x = objectEvent->currentCoords.x; objectEvent->previousCoords.y = objectEvent->currentCoords.y; objectEvent->currentCoords.x += x; objectEvent->currentCoords.y += y; } void ShiftObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) { objectEvent->previousCoords.x = objectEvent->currentCoords.x; objectEvent->previousCoords.y = objectEvent->currentCoords.y; objectEvent->currentCoords.x = x; objectEvent->currentCoords.y = y; } static void SetObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) { objectEvent->previousCoords.x = x; objectEvent->previousCoords.y = y; objectEvent->currentCoords.x = x; objectEvent->currentCoords.y = y; } void MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) { struct Sprite *sprite; const struct ObjectEventGraphicsInfo *graphicsInfo; sprite = &gSprites[objectEvent->spriteId]; graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); SetObjectEventCoords(objectEvent, x, y); 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; ResetObjectEventFldEffData(objectEvent); if (objectEvent->trackedByCamera) CameraObjectReset1(); } void TryMoveObjectEventToMapCoords(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { x += MAP_OFFSET; y += MAP_OFFSET; MoveObjectEventToMapCoords(&gObjectEvents[objectEventId], x, y); } } void ShiftStillObjectEventCoords(struct ObjectEvent *objectEvent) { ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x, objectEvent->currentCoords.y); } void UpdateObjectEventCoordsForCameraUpdate(void) { u32 i; s16 dx; s16 dy; if (gCamera.active) { dx = gCamera.x; dy = gCamera.y; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active) { gObjectEvents[i].initialCoords.x -= dx; gObjectEvents[i].initialCoords.y -= dy; gObjectEvents[i].currentCoords.x -= dx; gObjectEvents[i].currentCoords.y -= dy; gObjectEvents[i].previousCoords.x -= dx; gObjectEvents[i].previousCoords.y -= dy; } } } } u8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active) { if (gObjectEvents[i].currentCoords.x == x && gObjectEvents[i].currentCoords.y == y && ObjectEventDoesElevationMatch(&gObjectEvents[i], elevation)) return i; } } return OBJECT_EVENTS_COUNT; } static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *objectEvent, u8 elevation) { if (objectEvent->currentElevation != 0 && elevation != 0 && objectEvent->currentElevation != elevation) return FALSE; return TRUE; } void UpdateObjectEventsForCameraUpdate(s16 x, s16 y) { UpdateObjectEventCoordsForCameraUpdate(); TrySpawnObjectEvents(x, y); RemoveObjectEventsOutsideView(); } u8 AddCameraObject(u8 linkedSpriteId) { u8 spriteId = CreateSprite(&gCameraSpriteTemplate, 0, 0, 4); gSprites[spriteId].invisible = TRUE; gSprites[spriteId].data[0] = linkedSpriteId; return spriteId; } static void ObjectCB_CameraObject(struct Sprite *sprite) { void (*callbacks[NELEMS(gCameraObjectFuncs)])(struct Sprite *); memcpy(callbacks, gCameraObjectFuncs, sizeof gCameraObjectFuncs); callbacks[sprite->data[1]](sprite); } static void CameraObject_0(struct Sprite *sprite) { sprite->x = gSprites[sprite->data[0]].x; sprite->y = gSprites[sprite->data[0]].y; sprite->invisible = TRUE; sprite->data[1] = 1; CameraObject_1(sprite); } static void CameraObject_1(struct Sprite *sprite) { s16 x = gSprites[sprite->data[0]].x; s16 y = gSprites[sprite->data[0]].y; sprite->data[2] = x - sprite->x; sprite->data[3] = y - sprite->y; sprite->x = x; sprite->y = y; } static void CameraObject_2(struct Sprite *sprite) { sprite->x = gSprites[sprite->data[0]].x; sprite->y = gSprites[sprite->data[0]].y; sprite->data[2] = 0; sprite->data[3] = 0; } static struct Sprite *FindCameraObject(void) { u32 i; for (i = 0; i < MAX_SPRITES; i++) { if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) { return &gSprites[i]; } } return NULL; } void CameraObjectReset1(void) { struct Sprite *cameraObject; cameraObject = FindCameraObject(); if (cameraObject != NULL) { cameraObject->data[1] = 0; cameraObject->callback(cameraObject); } } void CameraObjectSetFollowedObjectId(u8 objectId) { struct Sprite *cameraObject; cameraObject = FindCameraObject(); if (cameraObject != NULL) { cameraObject->data[0] = objectId; CameraObjectReset1(); } } u8 CameraObjectGetFollowedObjectId(void) { struct Sprite *cameraObject; cameraObject = FindCameraObject(); if (cameraObject == NULL) { return MAX_SPRITES; } return cameraObject->data[0]; } void CameraObjectReset2(void) { FindCameraObject()->data[1] = 2; } u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) { u32 i; for (i = 0; i < MAX_SPRITES; i++) { if (!gSprites[i].inUse) { gSprites[i] = *sprite; gSprites[i].x = x; gSprites[i].y = y; gSprites[i].subpriority = subpriority; break; } } return i; } u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) { s32 i; for (i = MAX_SPRITES - 1; i > -1; i--) { if (!gSprites[i].inUse) { gSprites[i] = *sprite; gSprites[i].x = x; gSprites[i].y = y; gSprites[i].subpriority = subpriority; return i; } } return MAX_SPRITES; } void SetObjectEventDirection(struct ObjectEvent *objectEvent, u8 direction) { s8 d2; objectEvent->previousMovementDirection = objectEvent->facingDirection; if (!objectEvent->facingDirectionLocked) { d2 = direction; objectEvent->facingDirection = d2; } objectEvent->movementDirection = direction; } static const u8 *GetObjectEventScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script; } const u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId) { return GetObjectEventScriptPointerByLocalIdAndMap(gObjectEvents[objectEventId].localId, gObjectEvents[objectEventId].mapNum, gObjectEvents[objectEventId].mapGroup); } static u16 GetObjectEventFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { const struct ObjectEventTemplate *obj = GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup); #ifdef UBFIX // BUG: The function may return NULL, and attempting to read from NULL may freeze the game using modern compilers. if (obj == NULL) return 0; #endif // UBFIX return obj->flagId; } static u16 GetObjectEventFlagIdByObjectEventId(u8 objectEventId) { return GetObjectEventFlagIdByLocalIdAndMap(gObjectEvents[objectEventId].localId, gObjectEvents[objectEventId].mapNum, gObjectEvents[objectEventId].mapGroup); } // Unused u8 GetObjectTrainerTypeByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) return 0xFF; return gObjectEvents[objectEventId].trainerType; } u16 GetBoulderRevealFlagByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { // Pushable boulder object events store the flag to reveal the boulder // on the floor below in their trainer type field. return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->objUnion.normal.trainerType; } // Unused u8 GetObjectTrainerTypeByObjectEventId(u8 objectEventId) { return gObjectEvents[objectEventId].trainerType; } // Unused u8 GetObjectEventBerryTreeIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) return 0xFF; return gObjectEvents[objectEventId].trainerRange_berryTreeId; } // Unused u8 GetObjectEventBerryTreeId(u8 objectEventId) { return gObjectEvents[objectEventId].trainerRange_berryTreeId; } static const struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { const struct ObjectEventTemplate *templates; const struct MapHeader *mapHeader; u8 count; if (gSaveBlock1Ptr->location.mapNum == mapNum && gSaveBlock1Ptr->location.mapGroup == mapGroup) { templates = gSaveBlock1Ptr->objectEventTemplates; count = gMapHeader.events->objectEventCount; } else { mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); templates = mapHeader->events->objectEvents; count = mapHeader->events->objectEventCount; } return FindObjectEventTemplateByLocalId(localId, templates, count); } static const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, const struct ObjectEventTemplate *templates, u8 count) { u32 i; for (i = 0; i < count; i++) { if (templates[i].localId == localId) { return &templates[i]; } } return NULL; } struct ObjectEventTemplate *GetBaseTemplateForObjectEvent(const struct ObjectEvent *objectEvent) { int i; if (objectEvent->mapNum != gSaveBlock1Ptr->location.mapNum || objectEvent->mapGroup != gSaveBlock1Ptr->location.mapGroup) { return NULL; } for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) { if ((objectEvent->localId == gSaveBlock1Ptr->objectEventTemplates[i].localId) && (objectEvent->mapNum == gSaveBlock1Ptr->location.mapNum) && (objectEvent->mapGroup == gSaveBlock1Ptr->location.mapGroup)) return &gSaveBlock1Ptr->objectEventTemplates[i]; } return NULL; } void OverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent) { struct ObjectEventTemplate *objectEventTemplate; objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent); if (objectEventTemplate != NULL) { objectEventTemplate->x = objectEvent->currentCoords.x - MAP_OFFSET; objectEventTemplate->y = objectEvent->currentCoords.y - MAP_OFFSET; } } void OverrideMovementTypeForObjectEvent(const struct ObjectEvent *objectEvent, u8 movementType) { struct ObjectEventTemplate *objectEventTemplate; objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent); if (objectEventTemplate != NULL) { objectEventTemplate->objUnion.normal.movementType = movementType; } } void TryOverrideObjectEventTemplateCoords(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) OverrideTemplateCoordsForObjectEvent(&gObjectEvents[objectEventId]); } void InitObjectEventPalettes(u8 palSlot) { FreeAndReserveObjectSpritePalettes(); sCurrentSpecialObjectPaletteTag = OBJ_EVENT_PAL_TAG_NONE; sCurrentReflectionType = palSlot; if (palSlot == 1) { PatchObjectPaletteRange(gObjectPaletteTagSets[sCurrentReflectionType], 0, 6); gReservedSpritePaletteCount = 8; } else { PatchObjectPaletteRange(gObjectPaletteTagSets[sCurrentReflectionType], 0, 10); } } u16 GetObjectPaletteTag(u8 palSlot) { u32 i; if (palSlot < 10) { return gObjectPaletteTagSets[sCurrentReflectionType][palSlot]; } for (i = 0; gSpecialObjectReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) { if (gSpecialObjectReflectionPaletteSets[i].tag == sCurrentSpecialObjectPaletteTag) { return gSpecialObjectReflectionPaletteSets[i].data[sCurrentReflectionType]; } } return OBJ_EVENT_PAL_TAG_NONE; } movement_type_empty_callback(MovementType_None) movement_type_def(MovementType_WanderAround, gMovementTypeFuncs_WanderAround) movement_type_def(MovementType_WanderAroundSlower, gMovementTypeFuncs_WanderAroundSlower) static bool8 MovementType_WanderAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_WanderAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!ObjectEventExecSingleMovementAction(objectEvent, sprite)) { return FALSE; } SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); sprite->data[1] = 3; return TRUE; } static bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_WanderAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[4]; u8 chosenDirection; memcpy(directions, gStandardDirections, sizeof directions); chosenDirection = directions[Random() & 3]; SetObjectEventDirection(objectEvent, chosenDirection); sprite->data[1] = 5; if (GetCollisionInDirection(objectEvent, chosenDirection)) sprite->data[1] = 1; return TRUE; } static bool8 MovementType_WanderAround_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection)); objectEvent->singleMovementActive = TRUE; sprite->data[1] = 6; return TRUE; } static bool8 MovementType_WanderAround_Step5Slower(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowerMovementAction(objectEvent->movementDirection)); objectEvent->singleMovementActive = TRUE; sprite->data[1] = 6; return TRUE; } static bool8 MovementType_WanderAround_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { objectEvent->singleMovementActive = FALSE; sprite->data[1] = 1; } return FALSE; } bool8 ObjectEventIsTrainerAndCloseToPlayer(struct ObjectEvent *objectEvent) { s16 playerX; s16 playerY; s16 objX; s16 objY; s16 minX; s16 maxX; s16 minY; s16 maxY; if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) return FALSE; if (objectEvent->trainerType != TRAINER_TYPE_NORMAL && objectEvent->trainerType != TRAINER_TYPE_BURIED) return FALSE; PlayerGetDestCoords(&playerX, &playerY); objX = objectEvent->currentCoords.x; objY = objectEvent->currentCoords.y; minX = objX - objectEvent->trainerRange_berryTreeId; minY = objY - objectEvent->trainerRange_berryTreeId; maxX = objX + objectEvent->trainerRange_berryTreeId; maxY = objY + objectEvent->trainerRange_berryTreeId; if (minX > playerX || maxX < playerX || minY > playerY || maxY < playerY) { return FALSE; } return TRUE; } static u8 GetVectorDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; if (absdx > absdy) { direction = DIR_EAST; if (dx < 0) { direction = DIR_WEST; } } else { direction = DIR_SOUTH; if (dy < 0) { direction = DIR_NORTH; } } return direction; } static u8 GetLimitedVectorDirection_SouthNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = DIR_SOUTH; if (dy < 0) { direction = DIR_NORTH; } return direction; } static u8 GetLimitedVectorDirection_WestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = DIR_EAST; if (dx < 0) { direction = DIR_WEST; } return direction; } static u8 GetLimitedVectorDirection_WestNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_SOUTH) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); if (direction == DIR_EAST) { direction = DIR_NORTH; } } else if (direction == DIR_EAST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); if (direction == DIR_SOUTH) { direction = DIR_NORTH; } } return direction; } static u8 GetLimitedVectorDirection_EastNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_SOUTH) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); if (direction == DIR_WEST) { direction = DIR_NORTH; } } else if (direction == DIR_WEST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); if (direction == DIR_SOUTH) { direction = DIR_NORTH; } } return direction; } static u8 GetLimitedVectorDirection_WestSouth(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_NORTH) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); if (direction == DIR_EAST) { direction = DIR_SOUTH; } } else if (direction == DIR_EAST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); if (direction == DIR_NORTH) { direction = DIR_SOUTH; } } return direction; } static u8 GetLimitedVectorDirection_EastSouth(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_NORTH) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); if (direction == DIR_WEST) { direction = DIR_SOUTH; } } else if (direction == DIR_WEST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); if (direction == DIR_NORTH) { direction = DIR_SOUTH; } } return direction; } static u8 GetLimitedVectorDirection_SouthNorthWest(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_EAST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); } return direction; } static u8 GetLimitedVectorDirection_SouthNorthEast(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_WEST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); } return direction; } static u8 GetLimitedVectorDirection_NorthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_SOUTH) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); } return direction; } static u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) { u8 direction; direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_NORTH) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); } return direction; } u8 TryGetTrainerEncounterDirection(struct ObjectEvent *objectEvent, u8 movementType) { s16 dx, dy; s16 absdx, absdy; if (!ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { return 0; } PlayerGetDestCoords(&dx, &dy); dx -= objectEvent->currentCoords.x; dy -= objectEvent->currentCoords.y; absdx = dx; absdy = dy; if (absdx < 0) { absdx = -absdx; } if (absdy < 0) { absdy = -absdy; } return gGetVectorDirectionFuncs[movementType](dx, dy, absdx, absdy); } movement_type_def(MovementType_LookAround, gMovementTypeFuncs_LookAround) static bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_LookAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_LookAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_LookAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_LookAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[4]; memcpy(directions, gStandardDirections, sizeof directions); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_ANY); if (direction == DIR_NONE) direction = directions[Random() & 3]; SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_WanderUpAndDown, gMovementTypeFuncs_WanderUpAndDown) static bool8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!ObjectEventExecSingleMovementAction(objectEvent, sprite)) { return FALSE; } SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); sprite->data[1] = 3; return TRUE; } static bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[2]; memcpy(directions, gUpAndDownDirections, sizeof directions); direction = directions[Random() & 1]; SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 5; if (GetCollisionInDirection(objectEvent, direction)) sprite->data[1] = 1; return TRUE; } static bool8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection)); objectEvent->singleMovementActive = TRUE; sprite->data[1] = 6; return TRUE; } static bool8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { objectEvent->singleMovementActive = FALSE; sprite->data[1] = 1; } return FALSE; } movement_type_def(MovementType_WanderLeftAndRight, gMovementTypeFuncs_WanderLeftAndRight) static bool8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!ObjectEventExecSingleMovementAction(objectEvent, sprite)) { return FALSE; } SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); sprite->data[1] = 3; return TRUE; } static bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[2]; memcpy(directions, gLeftAndRightDirections, sizeof directions); direction = directions[Random() & 1]; SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 5; if (GetCollisionInDirection(objectEvent, direction)) sprite->data[1] = 1; return TRUE; } static bool8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection)); objectEvent->singleMovementActive = TRUE; sprite->data[1] = 6; return TRUE; } static bool8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { objectEvent->singleMovementActive = FALSE; sprite->data[1] = 1; } return FALSE; } movement_type_def(MovementType_FaceDirection, gMovementTypeFuncs_FaceDirection) static bool8 MovementType_FaceDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceDirection_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { sprite->data[1] = 2; return TRUE; } return FALSE; } static bool8 MovementType_FaceDirection_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->singleMovementActive = FALSE; return FALSE; } movement_type_def(MovementType_FaceDownAndUp, gMovementTypeFuncs_FaceDownAndUp) static bool8 MovementType_FaceDownAndUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceDownAndUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceDownAndUp_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceDownAndUp_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceDownAndUp_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[2]; memcpy(directions, gUpAndDownDirections, sizeof gUpAndDownDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_SOUTH); if (direction == DIR_NONE) { direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_FaceLeftAndRight, gMovementTypeFuncs_FaceLeftAndRight) static bool8 MovementType_FaceLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[2]; memcpy(directions, gLeftAndRightDirections, sizeof gLeftAndRightDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_EAST_WEST); if (direction == DIR_NONE) { direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_FaceUpAndLeft, gMovementTypeFuncs_FaceUpAndLeft) static bool8 MovementType_FaceUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[2]; memcpy(directions, gUpAndLeftDirections, sizeof gUpAndLeftDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_WEST); if (direction == DIR_NONE) { direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_FaceUpAndRight, gMovementTypeFuncs_FaceUpAndRight) static bool8 MovementType_FaceUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[2]; memcpy(directions, gUpAndRightDirections, sizeof gUpAndRightDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_EAST); if (direction == DIR_NONE) { direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_FaceDownAndLeft, gMovementTypeFuncs_FaceDownAndLeft) static bool8 MovementType_FaceDownAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceDownAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceDownAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceDownAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceDownAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[2]; memcpy(directions, gDownAndLeftDirections, sizeof gDownAndLeftDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_SOUTH_WEST); if (direction == DIR_NONE) { direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_FaceDownAndRight, gMovementTypeFuncs_FaceDownAndRight) static bool8 MovementType_FaceDownAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceDownAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceDownAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceDownAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceDownAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[2]; memcpy(directions, gDownAndRightDirections, sizeof gDownAndRightDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_SOUTH_EAST); if (direction == DIR_NONE) { direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_FaceDownUpAndLeft, gMovementTypeFuncs_FaceDownUpAndLeft) static bool8 MovementType_FaceDownUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceDownUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceDownUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceDownUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceDownUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[4]; memcpy(directions, gDownUpAndLeftDirections, sizeof gDownUpAndLeftDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_SOUTH_WEST); if (direction == DIR_NONE) { direction = directions[Random() & 3]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_FaceDownUpAndRight, gMovementTypeFuncs_FaceDownUpAndRight) static bool8 MovementType_FaceDownUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceDownUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceDownUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceDownUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceDownUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[4]; memcpy(directions, gDownUpAndRightDirections, sizeof gDownUpAndRightDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_SOUTH_EAST); if (direction == DIR_NONE) { direction = directions[Random() & 3]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_FaceUpRightAndLeft, gMovementTypeFuncs_FaceUpLeftAndRight) static bool8 MovementType_FaceUpLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceUpLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceUpLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceUpLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceUpLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[4]; memcpy(directions, gUpLeftAndRightDirections, sizeof gUpLeftAndRightDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_EAST_WEST); if (direction == DIR_NONE) { direction = directions[Random() & 3]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_FaceDownRightAndLeft, gMovementTypeFuncs_FaceDownLeftAndRight) static bool8 MovementType_FaceDownLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_FaceDownLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_FaceDownLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); objectEvent->singleMovementActive = FALSE; sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_FaceDownLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 4; return TRUE; } return FALSE; } static bool8 MovementType_FaceDownLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[4]; memcpy(directions, gDownLeftAndRightDirections, sizeof gDownLeftAndRightDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_SOUTH_EAST_WEST); if (direction == DIR_NONE) { direction = directions[Random() & 3]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_RotateCounterclockwise, gMovementTypeFuncs_RotateCounterclockwise) static bool8 MovementType_RotateCounterclockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_RotateCounterclockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, 48); sprite->data[1] = 2; } return FALSE; } static bool8 MovementType_RotateCounterclockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_RotateCounterclockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[5]; memcpy(directions, gCounterclockwiseDirections, sizeof gCounterclockwiseDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_ANY); if (direction == DIR_NONE) { direction = directions[objectEvent->facingDirection]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 0; return TRUE; } movement_type_def(MovementType_RotateClockwise, gMovementTypeFuncs_RotateClockwise) static bool8 MovementType_RotateClockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_RotateClockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, 48); sprite->data[1] = 2; } return FALSE; } static bool8 MovementType_RotateClockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { sprite->data[1] = 3; } return FALSE; } static bool8 MovementType_RotateClockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; u8 directions[5]; memcpy(directions, gClockwiseDirections, sizeof gClockwiseDirections); direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_ANY); if (direction == DIR_NONE) { direction = directions[objectEvent->facingDirection]; } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 0; return TRUE; } movement_type_def(MovementType_WalkBackAndForth, gMovementTypeFuncs_WalkBackAndForth) static bool8 MovementType_WalkBackAndForth_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_WalkBackAndForth_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; direction = gInitialMovementTypeFacingDirections[objectEvent->movementType]; if (objectEvent->directionSequenceIndex) { direction = GetOppositeDirection(direction); } SetObjectEventDirection(objectEvent, direction); sprite->data[1] = 2; return TRUE; } static bool8 MovementType_WalkBackAndForth_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { bool8 collision; u8 movementActionId; if (objectEvent->directionSequenceIndex && objectEvent->initialCoords.x == objectEvent->currentCoords.x && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 0; SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection)); } collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection); movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection); if (collision == COLLISION_OUTSIDE_RANGE) { objectEvent->directionSequenceIndex++; SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection)); movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection); collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection); } if (collision) movementActionId = GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection); ObjectEventSetSingleMovement(objectEvent, sprite, movementActionId); objectEvent->singleMovementActive = TRUE; sprite->data[1] = 3; return TRUE; } static bool8 MovementType_WalkBackAndForth_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { objectEvent->singleMovementActive = FALSE; sprite->data[1] = 1; } return FALSE; } static bool8 MovementType_WalkSequence_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); sprite->data[1] = 1; return TRUE; } bool8 MoveNextDirectionInSequence(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 *route) { u8 collision; u8 movementActionId; if (objectEvent->directionSequenceIndex == 3 && objectEvent->initialCoords.x == objectEvent->currentCoords.x && objectEvent->initialCoords.y == objectEvent->currentCoords.y) objectEvent->directionSequenceIndex = 0; SetObjectEventDirection(objectEvent, route[objectEvent->directionSequenceIndex]); movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection); collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection); if (collision == COLLISION_OUTSIDE_RANGE) { objectEvent->directionSequenceIndex++; SetObjectEventDirection(objectEvent, route[objectEvent->directionSequenceIndex]); movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection); collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection); } if (collision) movementActionId = GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection); ObjectEventSetSingleMovement(objectEvent, sprite, movementActionId); objectEvent->singleMovementActive = TRUE; sprite->data[1] = 2; return TRUE; } static bool8 MovementType_WalkSequence_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { objectEvent->singleMovementActive = FALSE; sprite->data[1] = 1; } return FALSE; } movement_type_def(MovementType_WalkSequenceUpRightLeftDown, gMovementTypeFuncs_WalkSequenceUpRightLeftDown) u8 MovementType_WalkSequenceUpRightLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gUpRightLeftDownDirections)]; memcpy(directions, gUpRightLeftDownDirections, sizeof(gUpRightLeftDownDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceRightLeftDownUp, gMovementTypeFuncs_WalkSequenceRightLeftDownUp) u8 MovementType_WalkSequenceRightLeftDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gRightLeftDownUpDirections)]; memcpy(directions, gRightLeftDownUpDirections, sizeof(gRightLeftDownUpDirections)); if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 2; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceDownUpRightLeft, gMovementTypeFuncs_WalkSequenceDownUpRightLeft) u8 MovementType_WalkSequenceDownUpRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gDownUpRightLeftDirections)]; memcpy(directions, gDownUpRightLeftDirections, sizeof(gDownUpRightLeftDirections)); if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 2; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceLeftDownUpRight, gMovementTypeFuncs_WalkSequenceLeftDownUpRight) u8 MovementType_WalkSequenceLeftDownUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gLeftDownUpRightDirections)]; memcpy(directions, gLeftDownUpRightDirections, sizeof(gLeftDownUpRightDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceUpLeftRightDown, gMovementTypeFuncs_WalkSequenceUpLeftRightDown) u8 MovementType_WalkSequenceUpLeftRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gUpLeftRightDownDirections)]; memcpy(directions, gUpLeftRightDownDirections, sizeof(gUpLeftRightDownDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceLeftRightDownUp, gMovementTypeFuncs_WalkSequenceLeftRightDownUp) u8 MovementType_WalkSequenceLeftRightDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gLeftRightDownUpDirections)]; memcpy(directions, gLeftRightDownUpDirections, sizeof(gLeftRightDownUpDirections)); if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 2; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceDownUpLeftRight, gMovementTypeFuncs_WalkSequenceDownUpLeftRight) u8 MovementType_WalkSequenceDownUpLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gStandardDirections)]; memcpy(directions, gStandardDirections, sizeof(gStandardDirections)); if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 2; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceRightDownUpLeft, gMovementTypeFuncs_WalkSequenceRightDownUpLeft) u8 MovementType_WalkSequenceRightDownUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gRightDownUpLeftDirections)]; memcpy(directions, gRightDownUpLeftDirections, sizeof(gRightDownUpLeftDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceLeftUpDownRight, gMovementTypeFuncs_WalkSequenceLeftUpDownRight) u8 MovementType_WalkSequenceLeftUpDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gLeftUpDownRightDirections)]; memcpy(directions, gLeftUpDownRightDirections, sizeof(gLeftUpDownRightDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceUpDownRightLeft, gMovementTypeFuncs_WalkSequenceUpDownRightLeft) u8 MovementType_WalkSequenceUpDownRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gUpDownRightLeftDirections)]; memcpy(directions, gUpDownRightLeftDirections, sizeof(gUpDownRightLeftDirections)); if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 2; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceRightLeftUpDown, gMovementTypeFuncs_WalkSequenceRightLeftUpDown) u8 MovementType_WalkSequenceRightLeftUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gRightLeftUpDownDirections)]; memcpy(directions, gRightLeftUpDownDirections, sizeof(gRightLeftUpDownDirections)); if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 2; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceDownRightLeftUp, gMovementTypeFuncs_WalkSequenceDownRightLeftUp) u8 MovementType_WalkSequenceDownRightLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gDownRightLeftUpDirections)]; memcpy(directions, gDownRightLeftUpDirections, sizeof(gDownRightLeftUpDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceRightUpDownLeft, gMovementTypeFuncs_WalkSequenceRightUpDownLeft) u8 MovementType_WalkSequenceRightUpDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gRightUpDownLeftDirections)]; memcpy(directions, gRightUpDownLeftDirections, sizeof(gRightUpDownLeftDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceUpDownLeftRight, gMovementTypeFuncs_WalkSequenceUpDownLeftRight) u8 MovementType_WalkSequenceUpDownLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gUpDownLeftRightDirections)]; memcpy(directions, gUpDownLeftRightDirections, sizeof(gUpDownLeftRightDirections)); if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 2; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceLeftRightUpDown, gMovementTypeFuncs_WalkSequenceLeftRightUpDown) u8 MovementType_WalkSequenceLeftRightUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gLeftRightUpDownDirections)]; memcpy(directions, gLeftRightUpDownDirections, sizeof(gLeftRightUpDownDirections)); if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 2; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceDownLeftRightUp, gMovementTypeFuncs_WalkSequenceDownLeftRightUp) u8 MovementType_WalkSequenceDownLeftRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gDownLeftRightUpDirections)]; memcpy(directions, gDownLeftRightUpDirections, sizeof(gDownLeftRightUpDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceUpLeftDownRight, gMovementTypeFuncs_WalkSequenceUpLeftDownRight) u8 MovementType_WalkSequenceUpLeftDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gUpLeftDownRightDirections)]; memcpy(directions, gUpLeftDownRightDirections, sizeof(gUpLeftDownRightDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceDownRightUpLeft, gMovementTypeFuncs_WalkSequenceDownRightUpLeft) u8 MovementType_WalkSequenceDownRightUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gDownRightUpLeftDirections)]; memcpy(directions, gDownRightUpLeftDirections, sizeof(gDownRightUpLeftDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceLeftDownRightUp, gMovementTypeFuncs_WalkSequenceLeftDownRightUp) u8 MovementType_WalkSequenceLeftDownRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gLeftDownRightUpDirections)]; memcpy(directions, gLeftDownRightUpDirections, sizeof(gLeftDownRightUpDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceRightUpLeftDown, gMovementTypeFuncs_WalkSequenceRightUpLeftDown) u8 MovementType_WalkSequenceRightUpLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gRightUpLeftDownDirections)]; memcpy(directions, gRightUpLeftDownDirections, sizeof(gRightUpLeftDownDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceUpRightDownLeft, gMovementTypeFuncs_WalkSequenceUpRightDownLeft) u8 MovementType_WalkSequenceUpRightDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gUpRightDownLeftDirections)]; memcpy(directions, gUpRightDownLeftDirections, sizeof(gUpRightDownLeftDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceDownLeftUpRight, gMovementTypeFuncs_WalkSequenceDownLeftUpRight) u8 MovementType_WalkSequenceDownLeftUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gDownLeftUpRightDirections)]; memcpy(directions, gDownLeftUpRightDirections, sizeof(gDownLeftUpRightDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceLeftUpRightDown, gMovementTypeFuncs_WalkSequenceLeftUpRightDown) u8 MovementType_WalkSequenceLeftUpRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gLeftUpRightDownDirections)]; memcpy(directions, gLeftUpRightDownDirections, sizeof(gLeftUpRightDownDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_WalkSequenceRightDownLeftUp, gMovementTypeFuncs_WalkSequenceRightDownLeftUp) u8 MovementType_WalkSequenceRightDownLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 directions[sizeof(gRightDownLeftUpDirections)]; memcpy(directions, gRightDownLeftUpDirections, sizeof(gRightDownLeftUpDirections)); if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) { objectEvent->directionSequenceIndex = 3; } return MoveNextDirectionInSequence(objectEvent, sprite, directions); } movement_type_def(MovementType_CopyPlayer, gMovementTypeFuncs_CopyPlayer) static bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); if (objectEvent->directionSequenceIndex == 0) { objectEvent->directionSequenceIndex = GetPlayerFacingDirection(); } sprite->data[1] = 1; return TRUE; } static bool8 MovementType_CopyPlayer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) { return FALSE; } return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), NULL); } static bool8 MovementType_CopyPlayer_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { objectEvent->singleMovementActive = FALSE; sprite->data[1] = 1; } return FALSE; } static bool8 CopyablePlayerMovement_None(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { return FALSE; } static bool8 CopyablePlayerMovement_FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, playerDirection))); objectEvent->singleMovementActive = TRUE; sprite->data[1] = 2; return TRUE; } static bool8 CopyablePlayerMovement_GoSpeed0(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { u32 direction; s16 x; s16 y; direction = playerDirection; if (ObjectEventIsFarawayIslandMew(objectEvent)) { direction = GetMewMoveDirection(); if (direction == DIR_NONE) { direction = playerDirection; direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); objectEvent->singleMovementActive = 1; sprite->data[1] = 2; return TRUE; } } else { direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); } ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction)); if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; sprite->data[1] = 2; return TRUE; } static bool8 CopyablePlayerMovement_GoSpeed1(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { u32 direction; s16 x; s16 y; direction = playerDirection; direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFastMovementAction(direction)); if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; sprite->data[1] = 2; return TRUE; } static bool8 CopyablePlayerMovement_GoSpeed2(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { u32 direction; s16 x; s16 y; direction = playerDirection; direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFasterMovementAction(direction)); if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; sprite->data[1] = 2; return TRUE; } static bool8 CopyablePlayerMovement_Slide(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { u32 direction; s16 x; s16 y; direction = playerDirection; direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); ObjectEventSetSingleMovement(objectEvent, sprite, GetSlideMovementAction(direction)); if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; sprite->data[1] = 2; return TRUE; } static bool8 cph_IM_DIFFERENT(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { u32 direction; direction = playerDirection; direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); ObjectEventSetSingleMovement(objectEvent, sprite, GetJumpInPlaceMovementAction(direction)); objectEvent->singleMovementActive = TRUE; sprite->data[1] = 2; return TRUE; } static bool8 CopyablePlayerMovement_GoSpeed4(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { u32 direction; s16 x; s16 y; direction = playerDirection; direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); ObjectEventSetSingleMovement(objectEvent, sprite, GetJumpMovementAction(direction)); if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; sprite->data[1] = 2; return TRUE; } static bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { u32 direction; s16 x; s16 y; direction = playerDirection; direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; MoveCoordsInDirection(direction, &x, &y, 2, 2); ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction)); if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; sprite->data[1] = 2; return TRUE; } movement_type_def(MovementType_CopyPlayerInGrass, gMovementTypeFuncs_CopyPlayerInGrass) static bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) { return FALSE; } return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), MetatileBehavior_IsPokeGrass); } static void MovementType_TreeDisguise(struct Sprite *sprite) { struct ObjectEvent *objectEvent; objectEvent = &gObjectEvents[sprite->data[0]]; if (objectEvent->directionSequenceIndex == 0 || (objectEvent->directionSequenceIndex == 1 && !sprite->data[7])) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); objectEvent->fieldEffectSpriteId = FieldEffectStart(FLDEFF_TREE_DISGUISE); objectEvent->directionSequenceIndex = 1; sprite->data[7]++; } UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_Disguise_Callback); } static bool8 MovementType_Disguise_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); return FALSE; } static void MovementType_MountainDisguise(struct Sprite *sprite) { struct ObjectEvent *objectEvent; objectEvent = &gObjectEvents[sprite->data[0]]; if (objectEvent->directionSequenceIndex == 0 || (objectEvent->directionSequenceIndex == 1 && !sprite->data[7])) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); objectEvent->fieldEffectSpriteId = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); objectEvent->directionSequenceIndex = 1; sprite->data[7]++; } UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_Disguise_Callback); } static void MovementType_Buried(struct Sprite *sprite) { if (!sprite->data[7]) { gObjectEvents[sprite->data[0]].fixedPriority = TRUE; sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; sprite->oam.priority = 3; sprite->data[7]++; } UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_Buried_Callback); } static bool8 MovementType_Buried_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return gMovementTypeFuncs_Buried[sprite->data[1]](objectEvent, sprite); } static bool8 MovementType_Buried_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); return FALSE; } static bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { sprite->data[1] = 0; } return FALSE; } movement_type_def(MovementType_WalkInPlace, gMovementTypeFuncs_WalkInPlace) static bool8 MovementType_WalkInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_WalkInPlaceFast, gMovementTypeFuncs_WalkInPlaceFast) static bool8 MovementType_WalkInPlaceFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceFastMovementAction(objectEvent->facingDirection)); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_JogInPlace, gMovementTypeFuncs_JogInPlace) static bool8 MovementType_JogInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceFasterMovementAction(objectEvent->facingDirection)); sprite->data[1] = 1; return TRUE; } movement_type_def(MovementType_Invisible, gMovementTypeFuncs_Invisible) static bool8 MovementType_Invisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); objectEvent->invisible = TRUE; sprite->data[1] = 1; return TRUE; } static bool8 MovementType_Invisible_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { sprite->data[1] = 2; return TRUE; } return FALSE; } static bool8 MovementType_Invisible_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->singleMovementActive = FALSE; return FALSE; } void MovementType_RaiseHandAndStop(struct Sprite *sprite) { UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_RaiseHandAndStop_Callback); } void MovementType_RaiseHandAndJump(struct Sprite *sprite) { UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_RaiseHandAndJump_Callback); } void MovementType_RaiseHandAndSwim(struct Sprite *sprite) { UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_RaiseHandAndSwim_Callback); } static u8 MovementType_RaiseHandAndStop_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return gMovementTypeFuncs_RaiseHandAndStop[sprite->data[1]](objectEvent, sprite); } static u8 MovementType_RaiseHandAndJump_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return gMovementTypeFuncs_RaiseHandAndJump[sprite->data[1]](objectEvent, sprite); } static u8 MovementType_RaiseHandAndSwim_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return gMovementTypeFuncs_RaiseHandAndSwim[sprite->data[1]](objectEvent, sprite); } static bool8 MovementType_RaiseHandAndStop_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_RAISE_HAND_AND_STOP); sprite->data[1] = 1; return TRUE; } static bool8 MovementType_RaiseHandAndStop_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { sprite->data[1] = 2; return TRUE; } return FALSE; } static bool8 MovementType_RaiseHandAndStop_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->singleMovementActive = FALSE; return FALSE; } static bool8 MovementType_RaiseHandAndJump_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_RAISE_HAND_AND_JUMP); sprite->data[1] = 1; return FALSE; } static bool8 MovementType_RaiseHandAndSwim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_RAISE_HAND_AND_SWIM); sprite->data[1] = 1; return FALSE; } static bool8 MovementType_RaiseHandAndMove_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { sprite->data[1] = 0; } return FALSE; } static void ClearObjectEventMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->singleMovementActive = FALSE; objectEvent->heldMovementActive = FALSE; objectEvent->heldMovementFinished = FALSE; objectEvent->movementActionId = MOVEMENT_ACTION_NONE; sprite->data[1] = 0; } u8 GetFaceDirectionAnimNum(u8 direction) { return sFaceDirectionAnimNums[direction]; } u8 GetMoveDirectionAnimNum(u8 direction) { return sMoveDirectionAnimNums[direction]; } static u8 GetMoveDirectionFastAnimNum(u8 direction) { return sMoveDirectionFastAnimNums[direction]; } static u8 GetMoveDirectionFasterAnimNum(u8 direction) { return sMoveDirectionFasterAnimNums[direction]; } static u8 GetMoveDirectionFastestAnimNum(u8 direction) { return sMoveDirectionFastestAnimNums[direction]; } u8 GetJumpSpecialDirectionAnimNum(u8 direction) { return sJumpSpecialDirectionAnimNums[direction]; } u8 GetAcroWheelieDirectionAnimNum(u8 direction) { return sAcroBunnyHopBackWheelDirectionAnimNums[direction]; } u8 GetAcroBunnyHopFrontWheelDirectionAnimNum(u8 direction) { return sAcroBunnyHopFrontWheelDirectionAnimNums[direction]; } u8 GetAcroEndWheelieDirectionAnimNum(u8 direction) { return sAcroStandingWheelieBackWheelDirectionAnimNums[direction]; } u8 GetSpinDirectionAnimNum(u8 direction) { return sSpinDirectionAnimNums[direction]; } u8 GetAcroUnusedActionDirectionAnimNum(u8 direction) { return sAcroStandingWheelieFrontWheelDirectionAnimNums[direction]; } u8 GetAcroWheeliePedalDirectionAnimNum(u8 direction) { return sAcroMovingWheelieDirectionAnimNums[direction]; } u8 GetFishingDirectionAnimNum(u8 direction) { return sFishingDirectionAnimNums[direction]; } u8 GetFishingNoCatchDirectionAnimNum(u8 direction) { return sFishingNoCatchDirectionAnimNums[direction]; } u8 GetFishingBiteDirectionAnimNum(u8 direction) { return sFishingBiteDirectionAnimNums[direction]; } u8 GetRunningDirectionAnimNum(u8 direction) { return sRunningDirectionAnimNums[direction]; } static const struct StepAnimTable *GetStepAnimTable(const union AnimCmd *const *anims) { const struct StepAnimTable *stepTable; for (stepTable = sStepAnimTables; stepTable->anims != NULL; stepTable++) if (stepTable->anims == anims) return stepTable; return NULL; } void SetStepAnimHandleAlternation(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum) { const struct StepAnimTable *stepTable; if (!objectEvent->inanimate) { sprite->animNum = animNum; stepTable = GetStepAnimTable(sprite->anims); if (stepTable != NULL) { if (sprite->animCmdIndex == stepTable->animPos[0]) sprite->animCmdIndex = stepTable->animPos[3]; else if (sprite->animCmdIndex == stepTable->animPos[1]) sprite->animCmdIndex = stepTable->animPos[2]; } SeekSpriteAnim(sprite, sprite->animCmdIndex); } } void SetStepAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum) { const struct StepAnimTable *stepTable; if (!objectEvent->inanimate) { u8 animPos; sprite->animNum = animNum; stepTable = GetStepAnimTable(sprite->anims); if (stepTable != NULL) { animPos = stepTable->animPos[1]; if (sprite->animCmdIndex <= stepTable->animPos[0]) animPos = stepTable->animPos[0]; SeekSpriteAnim(sprite, animPos); } } } // file boundary? u8 GetDirectionToFace(s16 x1, s16 y1, s16 x2, s16 y2) { if (x1 > x2) { return DIR_WEST; } if (x1 < x2) { return DIR_EAST; } if (y1 > y2) { return DIR_NORTH; } return DIR_SOUTH; } void SetTrainerMovementType(struct ObjectEvent *objectEvent, u8 movementType) { objectEvent->movementType = movementType; objectEvent->directionSequenceIndex = 0; objectEvent->playerCopyableMovement = 0; gSprites[objectEvent->spriteId].callback = sMovementTypeCallbacks[movementType]; gSprites[objectEvent->spriteId].data[1] = 0; } u8 GetTrainerFacingDirectionMovementType(u8 direction) { return sTrainerFacingDirectionMovementTypes[direction]; } static u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction) { s16 x; s16 y; x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; MoveCoords(direction, &x, &y); return GetCollisionAtCoords(objectEvent, x, y, direction); } u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir) { u8 direction = dir; if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y)) return COLLISION_OUTSIDE_RANGE; else if (MapGridGetCollisionAt(x, y) || GetMapBorderIdAt(x, y) == CONNECTION_INVALID || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction)) return COLLISION_IMPASSABLE; else if (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction)) return COLLISION_IMPASSABLE; else if (IsElevationMismatchAt(objectEvent->currentElevation, x, y)) return COLLISION_ELEVATION_MISMATCH; else if (DoesObjectCollideWithObjectAt(objectEvent, x, y)) return COLLISION_OBJECT_EVENT; return COLLISION_NONE; } u8 GetCollisionFlagsAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) { u8 flags = 0; if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y)) flags |= 1; if (MapGridGetCollisionAt(x, y) || GetMapBorderIdAt(x, y) == CONNECTION_INVALID || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction) || (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction))) flags |= 2; if (IsElevationMismatchAt(objectEvent->currentElevation, x, y)) flags |= 4; if (DoesObjectCollideWithObjectAt(objectEvent, x, y)) flags |= 8; return flags; } static bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *objectEvent, s16 x, s16 y) { s16 left; s16 right; s16 top; s16 bottom; if (objectEvent->rangeX != 0) { left = objectEvent->initialCoords.x - objectEvent->rangeX; right = objectEvent->initialCoords.x + objectEvent->rangeX; if (left > x || right < x) { return TRUE; } } if (objectEvent->rangeY != 0) { top = objectEvent->initialCoords.y - objectEvent->rangeY; bottom = objectEvent->initialCoords.y + objectEvent->rangeY; if (top > y || bottom < y) { return TRUE; } } return FALSE; } static bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) { if (gOppositeDirectionBlockedMetatileFuncs[direction - 1](objectEvent->currentMetatileBehavior) || gDirectionBlockedMetatileFuncs[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) { return TRUE; } return FALSE; } static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16 x, s16 y) { u32 i; struct ObjectEvent *curObject; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { curObject = &gObjectEvents[i]; if (curObject->active && curObject != objectEvent) { if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y)) { if (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation)) return TRUE; } } } return FALSE; } bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) && gSprites[gObjectEvents[objectEventId].spriteId].data[7] & 2) { return TRUE; } return FALSE; } static void SetBerryTreeJustPicked(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) gSprites[gObjectEvents[objectEventId].spriteId].data[7] |= 0x04; } void MoveCoords(u8 direction, s16 *x, s16 *y) { *x += sDirectionToVectors[direction].x; *y += sDirectionToVectors[direction].y; } // Unused static void MoveCoordsInMapCoordIncrement(u8 direction, s16 *x, s16 *y) { *x += sDirectionToVectors[direction].x << 4; *y += sDirectionToVectors[direction].y << 4; } static void MoveCoordsInDirection(u32 dir, s16 *x, s16 *y, s16 deltaX, s16 deltaY) { u8 direction = dir; s16 dx2 = (u16)deltaX; s16 dy2 = (u16)deltaY; if (sDirectionToVectors[direction].x > 0) *x += dx2; if (sDirectionToVectors[direction].x < 0) *x -= dx2; if (sDirectionToVectors[direction].y > 0) *y += dy2; if (sDirectionToVectors[direction].y < 0) *y -= dy2; } void GetMapCoordsFromSpritePos(s16 x, s16 y, s16 *destX, s16 *destY) { *destX = (x - gSaveBlock1Ptr->pos.x) << 4; *destY = (y - gSaveBlock1Ptr->pos.y) << 4; *destX -= gTotalCameraPixelOffsetX; *destY -= gTotalCameraPixelOffsetY; } void SetSpritePosToMapCoords(s16 mapX, s16 mapY, s16 *destX, s16 *destY) { s16 dx = -gTotalCameraPixelOffsetX - gFieldCamera.x; s16 dy = -gTotalCameraPixelOffsetY - gFieldCamera.y; if (gFieldCamera.x > 0) dx += 1 << 4; if (gFieldCamera.x < 0) dx -= 1 << 4; if (gFieldCamera.y > 0) dy += 1 << 4; if (gFieldCamera.y < 0) dy -= 1 << 4; *destX = ((mapX - gSaveBlock1Ptr->pos.x) << 4) + dx; *destY = ((mapY - gSaveBlock1Ptr->pos.y) << 4) + dy; } void SetSpritePosToOffsetMapCoords(s16 *x, s16 *y, s16 dx, s16 dy) { SetSpritePosToMapCoords(*x, *y, x, y); *x += dx; *y += dy; } static void GetObjectEventMovingCameraOffset(s16 *x, s16 *y) { *x = 0; *y = 0; if (gFieldCamera.x > 0) { (*x)++; } if (gFieldCamera.x < 0) { (*x)--; } if (gFieldCamera.y > 0) { (*y)++; } if (gFieldCamera.y < 0) { (*y)--; } } void ObjectEventMoveDestCoords(struct ObjectEvent *objectEvent, u32 direction, s16 *x, s16 *y) { u8 newDirn = direction; *x = objectEvent->currentCoords.x; *y = objectEvent->currentCoords.y; MoveCoords(newDirn, x, y); } bool8 ObjectEventIsMovementOverridden(struct ObjectEvent *objectEvent) { if (objectEvent->singleMovementActive || objectEvent->heldMovementActive) return TRUE; return FALSE; } bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *objectEvent) { if (objectEvent->heldMovementActive && objectEvent->movementActionId != MOVEMENT_ACTION_NONE) return TRUE; return FALSE; } bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId) { if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING) ObjectEventClearHeldMovementIfActive(objectEvent); else if (ObjectEventIsMovementOverridden(objectEvent)) return TRUE; UnfreezeObjectEvent(objectEvent); objectEvent->movementActionId = movementActionId; objectEvent->heldMovementActive = TRUE; objectEvent->heldMovementFinished = FALSE; gSprites[objectEvent->spriteId].data[2] = 0; return FALSE; } void ObjectEventForceSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId) { ObjectEventClearHeldMovementIfActive(objectEvent); ObjectEventSetHeldMovement(objectEvent, movementActionId); } void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *objectEvent) { if (objectEvent->heldMovementActive) ObjectEventClearHeldMovement(objectEvent); } void ObjectEventClearHeldMovement(struct ObjectEvent *objectEvent) { objectEvent->movementActionId = MOVEMENT_ACTION_NONE; objectEvent->heldMovementActive = FALSE; objectEvent->heldMovementFinished = FALSE; gSprites[objectEvent->spriteId].data[1] = 0; gSprites[objectEvent->spriteId].data[2] = 0; } u8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent) { if (objectEvent->heldMovementActive) return objectEvent->heldMovementFinished; return 16; } u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *objectEvent) { u8 heldMovementStatus = ObjectEventCheckHeldMovementStatus(objectEvent); if (heldMovementStatus != 0 && heldMovementStatus != 16) ObjectEventClearHeldMovementIfActive(objectEvent); return heldMovementStatus; } u8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent) { if (objectEvent->heldMovementActive) return objectEvent->movementActionId; return MOVEMENT_ACTION_NONE; } void UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 (*callback)(struct ObjectEvent *, struct Sprite *)) { DoGroundEffects_OnSpawn(objectEvent, sprite); TryEnableObjectEventAnim(objectEvent, sprite); if (ObjectEventIsHeldMovementActive(objectEvent)) ObjectEventExecHeldMovementAction(objectEvent, sprite); else if (!objectEvent->frozen) while (callback(objectEvent, sprite)); DoGroundEffects_OnBeginStep(objectEvent, sprite); DoGroundEffects_OnFinishStep(objectEvent, sprite); UpdateObjectEventSpriteAnimPause(objectEvent, sprite); UpdateObjectEventVisibility(objectEvent, sprite); ObjectEventUpdateSubpriority(objectEvent, sprite); } void QL_UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite) { DoGroundEffects_OnSpawn(objectEvent, sprite); TryEnableObjectEventAnim(objectEvent, sprite); if (ObjectEventIsHeldMovementActive(objectEvent) && !sprite->animBeginning) QuestLogObjectEventExecHeldMovementAction(objectEvent, sprite); if (MetatileBehavior_IsIce_2(objectEvent->currentMetatileBehavior) == TRUE || MetatileBehavior_IsTrickHouseSlipperyFloor(objectEvent->currentMetatileBehavior) == TRUE) objectEvent->disableAnim = TRUE; else objectEvent->disableAnim = FALSE; DoGroundEffects_OnBeginStep(objectEvent, sprite); DoGroundEffects_OnFinishStep(objectEvent, sprite); UpdateObjectEventSpriteAnimPause(objectEvent, sprite); UpdateObjectEventVisibility(objectEvent, sprite); ObjectEventUpdateSubpriority(objectEvent, sprite); } #define dirn_to_anim(name, table) \ u8 name(u32 idx) \ { \ u8 direction; \ u8 animIds[sizeof(table)]; \ direction = idx; \ memcpy(animIds, (table), sizeof(table)); \ if (direction > DIR_EAST) direction = DIR_NONE; \ return animIds[direction]; \ } dirn_to_anim(GetFaceDirectionMovementAction, sFaceDirectionMovementActions); dirn_to_anim(GetFaceDirectionFastMovementAction, sFaceDirectionFastMovementActions); u8 GetWalkSlowestMovementAction(u32 idx) { u8 direction = idx; if (direction > DIR_EAST) direction = DIR_NONE; return sWalkSlowestMovementActions[direction]; } dirn_to_anim(GetWalkSlowerMovementAction, sWalkSlowerMovementActions); dirn_to_anim(GetWalkSlowMovementAction, sWalkSlowMovementActions); dirn_to_anim(GetWalkNormalMovementAction, sWalkNormalMovementActions); dirn_to_anim(GetWalkFastMovementAction, sWalkFastMovementActions); dirn_to_anim(GetGlideMovementAction, sGlideMovementActions); dirn_to_anim(GetRideWaterCurrentMovementAction, sRideWaterCurrentMovementActions); dirn_to_anim(GetWalkFasterMovementAction, sWalkFasterMovementActions); dirn_to_anim(GetSlideMovementAction, sSlideMovementActions); dirn_to_anim(GetPlayerRunMovementAction, sPlayerRunMovementActions); dirn_to_anim(GetPlayerRunSlowMovementAction, sPlayerRunSlowMovementActions); dirn_to_anim(GetSpinMovementAction, sSpinMovementActions); dirn_to_anim(GetJump2MovementAction, sJump2MovementActions); dirn_to_anim(GetJumpInPlaceMovementAction, sJumpInPlaceMovementActions); dirn_to_anim(GetJumpInPlaceTurnAroundMovementAction, sJumpInPlaceTurnAroundMovementActions); dirn_to_anim(GetJumpMovementAction, sJumpMovementActions); dirn_to_anim(GetJumpSpecialMovementAction, sJumpSpecialMovementActions); dirn_to_anim(GetJumpSpecialWithEffectMovementAction, sJumpSpecialWithEffectMovementActions); dirn_to_anim(GetWalkInPlaceSlowMovementAction, sWalkInPlaceSlowMovementActions); dirn_to_anim(GetWalkInPlaceNormalMovementAction, sWalkInPlaceNormalMovementActions); dirn_to_anim(GetWalkInPlaceFastMovementAction, sWalkInPlaceFastMovementActions); dirn_to_anim(GetWalkInPlaceFasterMovementAction, sWalkInPlaceFasterMovementActions); bool8 ObjectEventFaceOppositeDirection(struct ObjectEvent *objectEvent, u8 direction) { return ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetOppositeDirection(direction))); } dirn_to_anim(GetAcroWheelieFaceDirectionMovementAction, sAcroWheelieFaceDirectionMovementActions); dirn_to_anim(GetAcroPopWheelieFaceDirectionMovementAction, sAcroPopWheelieFaceDirectionMovementActions); dirn_to_anim(GetAcroEndWheelieFaceDirectionMovementAction, sAcroEndWheelieFaceDirectionMovementActions); dirn_to_anim(GetAcroWheelieHopFaceDirectionMovementAction, sAcroWheelieHopFaceDirectionMovementActions); dirn_to_anim(GetAcroWheelieHopMovementAction, sAcroWheelieHopMovementActions); dirn_to_anim(GetAcroWheelieJumpMovementAction, sAcroWheelieJumpMovementActions); dirn_to_anim(GetAcroWheelieInPlaceMovementAction, sAcroWheelieInPlaceMovementActions); dirn_to_anim(GetAcroPopWheelieMoveMovementAction, sAcroPopWheelieMoveMovementActions); dirn_to_anim(GetAcroWheelieMoveMovementAction, sAcroWheelieMoveMovementActions); u8 GetOppositeDirection(u8 direction) { u8 directions[sizeof gOppositeDirections]; memcpy(directions, gOppositeDirections, sizeof gOppositeDirections); if (direction < 1 || direction > (sizeof gOppositeDirections)) { return direction; } return directions[direction - 1]; } static u32 GetPlayerDirectionForCopy(u8 initDir, u8 moveDir) { return sPlayerDirectionsForCopy[initDir - 1][moveDir - 1]; } static u32 GetCopyDirection(u8 copyInitDir, u32 playerInitDir, u32 playerMoveDir) { u32 dir; u8 _playerInitDir = playerInitDir; u8 _playerMoveDir = playerMoveDir; if (_playerInitDir == DIR_NONE || _playerMoveDir == DIR_NONE || _playerInitDir > DIR_EAST || _playerMoveDir > DIR_EAST) return DIR_NONE; dir = GetPlayerDirectionForCopy(_playerInitDir, playerMoveDir); return sPlayerDirectionToCopyDirection[copyInitDir - 1][dir - 1]; } static void ObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (sMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite)) { objectEvent->heldMovementFinished = TRUE; } } static void QuestLogObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (sMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite)) { objectEvent->heldMovementFinished = TRUE; if (objectEvent->graphicsId == OBJ_EVENT_GFX_PUSHABLE_BOULDER) HandleBoulderFallThroughHole(objectEvent); } } static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (sMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite)) { objectEvent->movementActionId = MOVEMENT_ACTION_NONE; sprite->data[2] = 0; return TRUE; } return FALSE; } static void ObjectEventSetSingleMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 movementActionId) { objectEvent->movementActionId = movementActionId; sprite->data[2] = 0; if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING) QuestLogRecordNPCStep(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, movementActionId); } static void FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { SetObjectEventDirection(objectEvent, direction); ShiftStillObjectEventCoords(objectEvent); SetStepAnim(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); sprite->animPaused = TRUE; sprite->data[2] = 1; } static bool8 MovementAction_FaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { FaceDirection(objectEvent, sprite, DIR_SOUTH); return TRUE; } static bool8 MovementAction_FaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { FaceDirection(objectEvent, sprite, DIR_NORTH); return TRUE; } static bool8 MovementAction_FaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { FaceDirection(objectEvent, sprite, DIR_WEST); return TRUE; } static bool8 MovementAction_FaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { FaceDirection(objectEvent, sprite, DIR_EAST); return TRUE; } void InitNpcForMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { s16 x; s16 y; x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; SetObjectEventDirection(objectEvent, direction); MoveCoords(direction, &x, &y); ShiftObjectEventCoords(objectEvent, x, y); SetSpriteDataForNormalStep(sprite, direction, speed); sprite->animPaused = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; sprite->data[2] = 1; } void InitMovementNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { u8 (*functions[NELEMS(sDirectionAnimFuncsBySpeed)])(u8); memcpy(functions, sDirectionAnimFuncsBySpeed, sizeof sDirectionAnimFuncsBySpeed); InitNpcForMovement(objectEvent, sprite, direction, speed); SetStepAnimHandleAlternation(objectEvent, sprite, functions[speed](objectEvent->facingDirection)); } void StartRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { InitNpcForMovement(objectEvent, sprite, direction, MOVE_SPEED_FAST_1); SetStepAnimHandleAlternation(objectEvent, sprite, GetRunningDirectionAnimNum(objectEvent->facingDirection)); } bool8 UpdateMovementNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (NpcTakeStep(sprite)) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; sprite->animPaused = TRUE; return TRUE; } return FALSE; } void InitNpcForWalkSlower(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { s16 x; s16 y; x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; SetObjectEventDirection(objectEvent, direction); MoveCoords(direction, &x, &y); ShiftObjectEventCoords(objectEvent, x, y); SetWalkSlowerSpriteData(sprite, direction); sprite->animPaused = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; sprite->data[2] = 1; } void InitWalkSlower(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { InitNpcForWalkSlower(objectEvent, sprite, direction); SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); } bool8 UpdateWalkSlower(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlowerAnim(sprite)) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; sprite->animPaused = TRUE; return TRUE; } return FALSE; } void InitNpcForWalkSlowest(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { s16 x; s16 y; x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; SetObjectEventDirection(objectEvent, direction); MoveCoords(direction, &x, &y); ShiftObjectEventCoords(objectEvent, x, y); SetWalkSlowestSpriteData(sprite, direction); sprite->animPaused = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; sprite->data[2] = 1; } void InitWalkSlowest(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { InitNpcForWalkSlowest(objectEvent, sprite, direction); SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); } bool8 UpdateWalkSlowest(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlowestAnim(sprite)) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; sprite->animPaused = TRUE; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowestDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlowest(objectEvent, sprite, DIR_SOUTH); return MovementAction_WalkSlowestDown_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowestDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlowest(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowestUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlowest(objectEvent, sprite, DIR_NORTH); return MovementAction_WalkSlowestUp_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowestUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlowest(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowestLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlowest(objectEvent, sprite, DIR_WEST); return MovementAction_WalkSlowestLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowestLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlowest(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowestRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlowest(objectEvent, sprite, DIR_EAST); return MovementAction_WalkSlowestRight_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowestRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlowest(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowerDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlower(objectEvent, sprite, DIR_SOUTH); return MovementAction_WalkSlowerDown_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowerDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlower(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowerUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlower(objectEvent, sprite, DIR_NORTH); return MovementAction_WalkSlowerUp_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowerUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlower(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowerLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlower(objectEvent, sprite, DIR_WEST); return MovementAction_WalkSlowerLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowerLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlower(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowerRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlower(objectEvent, sprite, DIR_EAST); return MovementAction_WalkSlowerRight_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowerRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlower(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } // InitNpcForWalkSlow, InitNpcForWalkSlower, InitNpcForWalkSlowest, and // InitNpcForRunSlow are functionally equivalent void InitNpcForWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { s16 x; s16 y; x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; SetObjectEventDirection(objectEvent, direction); MoveCoords(direction, &x, &y); ShiftObjectEventCoords(objectEvent, x, y); SetWalkSlowSpriteData(sprite, direction); sprite->animPaused = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; sprite->data[2] = 1; } // InitWalkSlow, InitWalkSlower, InitWalkSlowest, and InitRunSlow are // functionally equivalent void InitWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { InitNpcForWalkSlow(objectEvent, sprite, direction); SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); } bool8 UpdateWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlowAnim(sprite)) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; sprite->animPaused = TRUE; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlow(objectEvent, sprite, DIR_NORTH); return MovementAction_WalkSlowUp_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlow(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlow(objectEvent, sprite, DIR_SOUTH); return MovementAction_WalkSlowDown_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlow(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlow(objectEvent, sprite, DIR_WEST); return MovementAction_WalkSlowLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlow(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlow(objectEvent, sprite, DIR_EAST); return MovementAction_WalkSlowRight_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkSlowRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlow(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_NORMAL); return MovementAction_WalkNormalDown_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_NORMAL); return MovementAction_WalkNormalUp_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_NORMAL); return MovementAction_WalkNormalLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_NORMAL); return MovementAction_WalkNormalRight_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkNormalRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } #define JUMP_HALFWAY 1 #define JUMP_FINISHED ((u8)-1) enum { JUMP_TYPE_HIGH, JUMP_TYPE_LOW, JUMP_TYPE_NORMAL, }; void InitJump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type) { s16 displacements[NELEMS(sJumpInitDisplacements)]; s16 x; s16 y; memcpy(displacements, sJumpInitDisplacements, sizeof sJumpInitDisplacements); x = 0; y = 0; SetObjectEventDirection(objectEvent, direction); MoveCoordsInDirection(direction, &x, &y, displacements[distance], displacements[distance]); ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x + x, objectEvent->currentCoords.y + y); SetJumpSpriteData(sprite, direction, distance, type); sprite->data[2] = 1; sprite->animPaused = 0; objectEvent->triggerGroundEffectsOnMove = 1; objectEvent->disableCoveringGroundEffects = 1; } void InitJumpRegular(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type) { InitJump(objectEvent, sprite, direction, distance, type); SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); DoShadowFieldEffect(objectEvent); } u8 UpdateJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 callback(struct Sprite *)) { s16 displacements[NELEMS(sJumpDisplacements)]; s16 x; s16 y; u8 result; memcpy(displacements, sJumpDisplacements, sizeof sJumpDisplacements); result = callback(sprite); if (result == JUMP_HALFWAY && displacements[sprite->data[4]] != 0) { x = 0; y = 0; MoveCoordsInDirection(objectEvent->movementDirection, &x, &y, displacements[sprite->data[4]], displacements[sprite->data[4]]); ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x + x, objectEvent->currentCoords.y + y); objectEvent->triggerGroundEffectsOnMove = TRUE; objectEvent->disableCoveringGroundEffects = TRUE; } else if (result == JUMP_FINISHED) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; objectEvent->landingJump = TRUE; sprite->animPaused = TRUE; } return result; } u8 DoJumpAnimStep(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return UpdateJumpAnim(objectEvent, sprite, DoJumpSpriteMovement); } u8 DoJumpSpecialAnimStep(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return UpdateJumpAnim(objectEvent, sprite, DoJumpSpecialSpriteMovement); } bool8 DoJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnimStep(objectEvent, sprite) == JUMP_FINISHED) return TRUE; return FALSE; } bool8 DoJumpSpecialAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpSpecialAnimStep(objectEvent, sprite) == JUMP_FINISHED) return TRUE; return FALSE; } bool8 DoJumpInPlaceAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { switch (DoJumpAnimStep(objectEvent, sprite)) { case JUMP_FINISHED: return TRUE; case JUMP_HALFWAY: SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection)); SetStepAnim(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); default: return FALSE; } } static bool8 MovementAction_Jump2Down_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_Jump2Down_Step1(objectEvent, sprite); } static bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_Jump2Up_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_Jump2Up_Step1(objectEvent, sprite); } static bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_Jump2Left_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_Jump2Left_Step1(objectEvent, sprite); } static bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_Jump2Right_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_Jump2Right_Step1(objectEvent, sprite); } static bool8 MovementAction_Jump2Right_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } void InitMovementDelay(struct Sprite *sprite, u16 duration) { sprite->data[2] = 1; sprite->data[3] = duration; } static bool8 MovementAction_Delay_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (--sprite->data[3] == 0) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_Delay1_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementDelay(sprite, 1); return MovementAction_Delay_Step1(objectEvent, sprite); } static bool8 MovementAction_Delay2_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementDelay(sprite, 2); return MovementAction_Delay_Step1(objectEvent, sprite); } static bool8 MovementAction_Delay4_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementDelay(sprite, 4); return MovementAction_Delay_Step1(objectEvent, sprite); } static bool8 MovementAction_Delay8_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementDelay(sprite, 8); return MovementAction_Delay_Step1(objectEvent, sprite); } static bool8 MovementAction_Delay16_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementDelay(sprite, 16); return MovementAction_Delay_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1); return MovementAction_WalkFastDown_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1); return MovementAction_WalkFastUp_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); return MovementAction_WalkFastLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); return MovementAction_WalkFastRight_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkFastRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } bool8 UpdateMovementGlide(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (NpcTakeStep(sprite)) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; return TRUE; } return FALSE; } u8 MovementAction_GlideDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if(objectEvent->facingDirection != DIR_SOUTH) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_SOUTH)); InitNpcForMovement(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1); return MovementAction_GlideDown_Step1(objectEvent, sprite); } static bool8 MovementAction_GlideDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { AnimateSprite(sprite); if (UpdateMovementGlide(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } u8 MovementAction_GlideUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if(objectEvent->facingDirection != DIR_NORTH) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_NORTH)); InitNpcForMovement(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1); return MovementAction_GlideUp_Step1(objectEvent, sprite); } static bool8 MovementAction_GlideUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { AnimateSprite(sprite); if (UpdateMovementGlide(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } u8 MovementAction_GlideLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if(objectEvent->facingDirection != DIR_WEST) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_WEST)); InitNpcForMovement(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); return MovementAction_GlideLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_GlideLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { AnimateSprite(sprite); if (UpdateMovementGlide(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } u8 MovementAction_GlideRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if(objectEvent->facingDirection != DIR_EAST) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_EAST)); InitNpcForMovement(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); return MovementAction_GlideRight_Step1(objectEvent, sprite); } static bool8 MovementAction_GlideRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { AnimateSprite(sprite); if (UpdateMovementGlide(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } void FaceDirectionFast(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { SetObjectEventDirection(objectEvent, direction); ShiftStillObjectEventCoords(objectEvent); sprite->animPaused = FALSE; sprite->data[2] = 1; } u8 MovementAction_FaceDownFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if(objectEvent->facingDirection != DIR_SOUTH) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_SOUTH)); AnimateSprite(sprite); FaceDirectionFast(objectEvent, sprite, DIR_SOUTH); return TRUE; } u8 MovementAction_FaceUpFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if(objectEvent->facingDirection != DIR_NORTH) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_NORTH)); AnimateSprite(sprite); FaceDirectionFast(objectEvent, sprite, DIR_NORTH); return TRUE; } u8 MovementAction_FaceLeftFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if(objectEvent->facingDirection != DIR_WEST) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_WEST)); AnimateSprite(sprite); FaceDirectionFast(objectEvent, sprite, DIR_WEST); return TRUE; } u8 MovementAction_FaceRightFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if(objectEvent->facingDirection != DIR_EAST) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_EAST)); AnimateSprite(sprite); FaceDirectionFast(objectEvent, sprite, DIR_EAST); return TRUE; } void InitMoveInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 animNum, u16 duration) { SetObjectEventDirection(objectEvent, direction); SetStepAnimHandleAlternation(objectEvent, sprite, animNum); sprite->animPaused = FALSE; sprite->data[2] = 1; sprite->data[3] = duration; } static bool8 MovementAction_WalkInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (--sprite->data[3] == 0) { sprite->data[2] = 2; sprite->animPaused = TRUE; return TRUE; } return FALSE; } static bool8 MovementAction_WalkInPlaceSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (sprite->data[3] & 1) sprite->animDelayCounter++; return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 32); return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32); return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 32); return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 32); return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 16); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 16); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 16); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 16); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFastAnimNum(DIR_SOUTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFastAnimNum(DIR_NORTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFastAnimNum(DIR_WEST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFastAnimNum(DIR_EAST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceFasterDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFasterAnimNum(DIR_SOUTH), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceFasterUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFasterAnimNum(DIR_NORTH), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceFasterLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkInPlaceFasterRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_RideWaterCurrentDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_2); return MovementAction_RideWaterCurrentDown_Step1(objectEvent, sprite); } static bool8 MovementAction_RideWaterCurrentDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_RideWaterCurrentUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_2); return MovementAction_RideWaterCurrentUp_Step1(objectEvent, sprite); } static bool8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_RideWaterCurrentLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_2); return MovementAction_RideWaterCurrentLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_RideWaterCurrentRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_2); return MovementAction_RideWaterCurrentRight_Step1(objectEvent, sprite); } static bool8 MovementAction_RideWaterCurrentRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkFasterDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FASTER); return MovementAction_WalkFasterDown_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkFasterDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkFasterUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FASTER); return MovementAction_WalkFasterUp_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkFasterUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkFasterLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTER); return MovementAction_WalkFasterLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkFasterLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkFasterRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTER); return MovementAction_WalkFasterRight_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkFasterRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_SlideDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FASTEST); return MovementAction_SlideDown_Step1(objectEvent, sprite); } static bool8 MovementAction_SlideDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_SlideUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FASTEST); return MovementAction_SlideUp_Step1(objectEvent, sprite); } static bool8 MovementAction_SlideUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_SlideLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTEST); return MovementAction_SlideLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_SlideLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_SlideRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTEST); return MovementAction_SlideRight_Step1(objectEvent, sprite); } static bool8 MovementAction_SlideRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_PlayerRunDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartRunningAnim(objectEvent, sprite, DIR_SOUTH); return MovementAction_PlayerRunDown_Step1(objectEvent, sprite); } static bool8 MovementAction_PlayerRunDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_PlayerRunUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartRunningAnim(objectEvent, sprite, DIR_NORTH); return MovementAction_PlayerRunUp_Step1(objectEvent, sprite); } static bool8 MovementAction_PlayerRunUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_PlayerRunLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartRunningAnim(objectEvent, sprite, DIR_WEST); return MovementAction_PlayerRunLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_PlayerRunLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_PlayerRunRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartRunningAnim(objectEvent, sprite, DIR_EAST); return MovementAction_PlayerRunRight_Step1(objectEvent, sprite); } static bool8 MovementAction_PlayerRunRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } void InitNpcForRunSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { s16 x; s16 y; x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; SetObjectEventDirection(objectEvent, direction); MoveCoords(direction, &x, &y); ShiftObjectEventCoords(objectEvent, x, y); SetRunSlowSpriteData(sprite, direction); sprite->animPaused = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; sprite->data[2] = 1; } void InitRunSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { InitNpcForRunSlow(objectEvent, sprite, direction); SetStepAnimHandleAlternation(objectEvent, sprite, GetRunningDirectionAnimNum(objectEvent->facingDirection)); } bool8 UpdateRunSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateRunSlowAnim(sprite)) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; sprite->animPaused = TRUE; return TRUE; } return FALSE; } static bool8 MovementAction_RunDownSlow_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitRunSlow(objectEvent, sprite, DIR_SOUTH); return MovementAction_RunDownSlow_Step1(objectEvent, sprite); } static bool8 MovementAction_RunDownSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateRunSlow(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_RunUpSlow_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitRunSlow(objectEvent, sprite, DIR_NORTH); return MovementAction_RunUpSlow_Step1(objectEvent, sprite); } static bool8 MovementAction_RunUpSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateRunSlow(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_RunLeftSlow_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitRunSlow(objectEvent, sprite, DIR_WEST); return MovementAction_RunLeftSlow_Step1(objectEvent, sprite); } static bool8 MovementAction_RunLeftSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateRunSlow(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_RunRightSlow_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitRunSlow(objectEvent, sprite, DIR_SOUTH); return MovementAction_RunRightSlow_Step1(objectEvent, sprite); } static bool8 MovementAction_RunRightSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateRunSlow(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } void StartSpriteAnimInDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 animNum) { SetAndStartSpriteAnim(sprite, animNum, 0); SetObjectEventDirection(objectEvent, direction); sprite->data[2] = 1; } static bool8 MovementAction_StartAnimInDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, objectEvent->movementDirection, sprite->animNum); return FALSE; } static bool8 MovementAction_WaitSpriteAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (SpriteAnimEnded(sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } void InitJumpSpecial(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { InitJump(objectEvent, sprite, direction, JUMP_DISTANCE_NORMAL, JUMP_TYPE_HIGH); StartSpriteAnim(sprite, GetJumpSpecialDirectionAnimNum(direction)); } static bool8 MovementAction_JumpSpecialDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpSpecial(objectEvent, sprite, DIR_SOUTH); return MovementAction_JumpSpecialDown_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpSpecialDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpSpecialAnim(objectEvent, sprite)) { sprite->data[2] = 2; objectEvent->landingJump = FALSE; return TRUE; } return FALSE; } static bool8 MovementAction_JumpSpecialUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpSpecial(objectEvent, sprite, DIR_NORTH); return MovementAction_JumpSpecialUp_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpSpecialUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpSpecialAnim(objectEvent, sprite)) { sprite->data[2] = 2; objectEvent->landingJump = FALSE; return TRUE; } return FALSE; } static bool8 MovementAction_JumpSpecialLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpSpecial(objectEvent, sprite, DIR_WEST); return MovementAction_JumpSpecialLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpSpecialLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpSpecialAnim(objectEvent, sprite)) { sprite->data[2] = 2; objectEvent->landingJump = FALSE; return TRUE; } return FALSE; } static bool8 MovementAction_JumpSpecialRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpSpecial(objectEvent, sprite, DIR_EAST); return MovementAction_JumpSpecialRight_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpSpecialRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpSpecialAnim(objectEvent, sprite)) { sprite->data[2] = 2; objectEvent->landingJump = FALSE; return TRUE; } return FALSE; } static bool8 MovementAction_JumpSpecialWithEffectDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpSpecial(objectEvent, sprite, DIR_SOUTH); return MovementAction_JumpSpecialWithEffectDown_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpSpecialWithEffectDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpSpecialAnim(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpSpecialWithEffectUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpSpecial(objectEvent, sprite, DIR_NORTH); return MovementAction_JumpSpecialWithEffectUp_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpSpecialWithEffectUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpSpecialAnim(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpSpecialWithEffectLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpSpecial(objectEvent, sprite, DIR_WEST); return MovementAction_JumpSpecialWithEffectLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpSpecialWithEffectLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpSpecialAnim(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpSpecialWithEffectRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpSpecial(objectEvent, sprite, DIR_EAST); return MovementAction_JumpSpecialWithEffectRight_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpSpecialWithEffectRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpSpecialAnim(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_FacePlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 playerObjectId; if (!TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0, &playerObjectId)) { FaceDirection(objectEvent, sprite, GetDirectionToFace(objectEvent->currentCoords.x, objectEvent->currentCoords.y, gObjectEvents[playerObjectId].currentCoords.x, gObjectEvents[playerObjectId].currentCoords.y)); } sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_FaceAwayPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 playerObjectId; if (!TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0, &playerObjectId)) { FaceDirection(objectEvent, sprite, GetOppositeDirection(GetDirectionToFace(objectEvent->currentCoords.x, objectEvent->currentCoords.y, gObjectEvents[playerObjectId].currentCoords.x, gObjectEvents[playerObjectId].currentCoords.y))); } sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_LockFacingDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->facingDirectionLocked = TRUE; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_UnlockFacingDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->facingDirectionLocked = FALSE; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_JumpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL); return MovementAction_JumpDown_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL); return MovementAction_JumpUp_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL); return MovementAction_JumpLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL); return MovementAction_JumpRight_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpInPlaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH); return MovementAction_JumpInPlaceDown_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpInPlaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH); return MovementAction_JumpInPlaceUp_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH); return MovementAction_JumpInPlaceLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH); return MovementAction_JumpInPlaceRight_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpInPlaceDownUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL); return MovementAction_JumpInPlaceDownUp_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpInPlaceAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpInPlaceUpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL); return MovementAction_JumpInPlaceUpDown_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpInPlaceAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpInPlaceLeftRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL); return MovementAction_JumpInPlaceLeftRight_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpInPlaceAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_JumpInPlaceRightLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL); return MovementAction_JumpInPlaceRightLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpInPlaceAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_FaceOriginalDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { FaceDirection(objectEvent, sprite, gInitialMovementTypeFacingDirections[objectEvent->movementType]); return TRUE; } static bool8 MovementAction_NurseJoyBowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, ANIM_NURSE_BOW); return FALSE; } static bool8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->disableJumpLandingGroundEffect = FALSE; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->disableJumpLandingGroundEffect = TRUE; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_DisableAnimation_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->inanimate = TRUE; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_RestoreAnimation_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->inanimate = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->inanimate; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_SetInvisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->invisible = TRUE; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_SetVisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->invisible = FALSE; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_EmoteExclamationMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_EmoteQuestionMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_QUESTION_MARK_ICON); sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_EmoteX_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_X_ICON); sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_EmoteDoubleExclamationMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_DOUBLE_EXCL_MARK_ICON); sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_EmoteSmile_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_SMILEY_FACE_ICON); sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_RevealTrainer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (objectEvent->movementType == MOVEMENT_TYPE_BURIED) { MovementAction_RevealTrainer_RunTrainerSeeFuncList(objectEvent); return FALSE; } if (objectEvent->movementType != MOVEMENT_TYPE_TREE_DISGUISE && objectEvent->movementType != MOVEMENT_TYPE_MOUNTAIN_DISGUISE) { sprite->data[2] = 2; return TRUE; } StartRevealDisguise(objectEvent); sprite->data[2] = 1; return MovementAction_RevealTrainer_Step1(objectEvent, sprite); } static bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateRevealDisguise(objectEvent)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_RockSmashBreak_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { SetAndStartSpriteAnim(sprite, ANIM_REMOVE_OBSTACLE, 0); sprite->data[2] = 1; return FALSE; } static bool8 MovementAction_RockSmashBreak_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (SpriteAnimEnded(sprite)) { SetMovementDelay(sprite, 32); sprite->data[2] = 2; } return FALSE; } static bool8 MovementAction_RockSmashBreak_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->invisible ^= TRUE; if (WaitForMovementDelay(sprite)) { objectEvent->invisible = TRUE; sprite->data[2] = 3; } return FALSE; } static bool8 MovementAction_CutTree_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { SetAndStartSpriteAnim(sprite, ANIM_REMOVE_OBSTACLE, 0); sprite->data[2] = 1; return FALSE; } static bool8 MovementAction_CutTree_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (SpriteAnimEnded(sprite)) { SetMovementDelay(sprite, 32); sprite->data[2] = 2; } return FALSE; } static bool8 MovementAction_CutTree_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->invisible ^= TRUE; if (WaitForMovementDelay(sprite)) { objectEvent->invisible = TRUE; sprite->data[2] = 3; } return FALSE; } static bool8 MovementAction_SetFixedPriority_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->fixedPriority = TRUE; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_ClearFixedPriority_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->fixedPriority = FALSE; sprite->data[2] = 1; return TRUE; } static bool8 MovementAction_InitAffineAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; InitSpriteAffineAnim(sprite); sprite->affineAnimPaused = TRUE; sprite->subspriteMode = SUBSPRITES_OFF; return TRUE; } static bool8 MovementAction_ClearAffineAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { FreeOamMatrix(sprite->oam.matrixNum); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); return TRUE; } static bool8 MovementAction_WalkDownStartAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlower(objectEvent, sprite, DIR_SOUTH); sprite->affineAnimPaused = FALSE; StartSpriteAffineAnimIfDifferent(sprite, 0); return MovementAction_WalkDownStartAffine_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkDownStartAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlower(objectEvent, sprite)) { sprite->affineAnimPaused = TRUE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_WalkDownAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlower(objectEvent, sprite, DIR_SOUTH); sprite->affineAnimPaused = FALSE; ChangeSpriteAffineAnimIfDifferent(sprite, 1); return MovementAction_WalkDownAffine_Step1(objectEvent, sprite); } static bool8 MovementAction_WalkDownAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateWalkSlower(objectEvent, sprite)) { sprite->affineAnimPaused = TRUE; sprite->data[2] = 2; return TRUE; } return FALSE; } void AcroWheelieFaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { SetObjectEventDirection(objectEvent, direction); ShiftStillObjectEventCoords(objectEvent); SetStepAnim(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(direction)); sprite->animPaused = TRUE; sprite->data[2] = 1; } static bool8 MovementAction_AcroWheelieFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { AcroWheelieFaceDirection(objectEvent, sprite, DIR_SOUTH); return TRUE; } static bool8 MovementAction_AcroWheelieFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { AcroWheelieFaceDirection(objectEvent, sprite, DIR_NORTH); return TRUE; } static bool8 MovementAction_AcroWheelieFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { AcroWheelieFaceDirection(objectEvent, sprite, DIR_WEST); return TRUE; } static bool8 MovementAction_AcroWheelieFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { AcroWheelieFaceDirection(objectEvent, sprite, DIR_EAST); return TRUE; } static bool8 MovementAction_AcroPopWheelieDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, GetAcroWheelieDirectionAnimNum(DIR_SOUTH)); return FALSE; } static bool8 MovementAction_AcroPopWheelieUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_NORTH, GetAcroWheelieDirectionAnimNum(DIR_NORTH)); return FALSE; } static bool8 MovementAction_AcroPopWheelieLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_WEST, GetAcroWheelieDirectionAnimNum(DIR_WEST)); return FALSE; } static bool8 MovementAction_AcroPopWheelieRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_EAST, GetAcroWheelieDirectionAnimNum(DIR_EAST)); return FALSE; } static bool8 MovementAction_AcroEndWheelieFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, GetAcroEndWheelieDirectionAnimNum(DIR_SOUTH)); return FALSE; } static bool8 MovementAction_AcroEndWheelieFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_NORTH, GetAcroEndWheelieDirectionAnimNum(DIR_NORTH)); return FALSE; } static bool8 MovementAction_AcroEndWheelieFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_WEST, GetAcroEndWheelieDirectionAnimNum(DIR_WEST)); return FALSE; } static bool8 MovementAction_AcroEndWheelieFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_EAST, GetAcroEndWheelieDirectionAnimNum(DIR_EAST)); return FALSE; } static bool8 MovementAction_UnusedAcroActionDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, GetAcroUnusedActionDirectionAnimNum(DIR_SOUTH)); return FALSE; } static bool8 MovementAction_UnusedAcroActionUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_NORTH, GetAcroUnusedActionDirectionAnimNum(DIR_NORTH)); return FALSE; } static bool8 MovementAction_UnusedAcroActionLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_WEST, GetAcroUnusedActionDirectionAnimNum(DIR_WEST)); return FALSE; } static bool8 MovementAction_UnusedAcroActionRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnimInDirection(objectEvent, sprite, DIR_EAST, GetAcroUnusedActionDirectionAnimNum(DIR_EAST)); return FALSE; } void InitAcroWheelieJump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type) { InitJump(objectEvent, sprite, direction, distance, type); StartSpriteAnimIfDifferent(sprite, GetAcroWheelieDirectionAnimNum(direction)); DoShadowFieldEffect(objectEvent); } static bool8 MovementAction_AcroWheelieHopFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopFaceDown_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieHopFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopFaceUp_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopFaceLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieHopFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopFaceRight_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieHopDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopDown_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieHopUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopUp_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieHopLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieHopRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopRight_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieJumpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpDown_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieJumpUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpUp_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieJumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpRight_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieInPlaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetAcroWheeliePedalDirectionAnimNum(DIR_SOUTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetAcroWheeliePedalDirectionAnimNum(DIR_NORTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } void InitAcroPopWheelie(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { InitNpcForMovement(objectEvent, sprite, direction, speed); StartSpriteAnim(sprite, GetAcroWheelieDirectionAnimNum(objectEvent->facingDirection)); SeekSpriteAnim(sprite, 0); } static bool8 MovementAction_AcroPopWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroPopWheelie(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1); return MovementAction_AcroPopWheelieMoveDown_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroPopWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroPopWheelie(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1); return MovementAction_AcroPopWheelieMoveUp_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroPopWheelie(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); return MovementAction_AcroPopWheelieMoveLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroPopWheelie(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); return MovementAction_AcroPopWheelieMoveRight_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroPopWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } void InitAcroWheelieMove(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { InitNpcForMovement(objectEvent, sprite, direction, speed); SetStepAnimHandleAlternation(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->facingDirection)); } static bool8 MovementAction_AcroWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieMove(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1); return MovementAction_AcroWheelieMoveDown_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieMove(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1); return MovementAction_AcroWheelieMoveUp_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieMove(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); return MovementAction_AcroWheelieMoveLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_AcroWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitAcroWheelieMove(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); return MovementAction_AcroWheelieMoveRight_Step1(objectEvent, sprite); } static bool8 MovementAction_AcroWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } void InitSpin(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { InitNpcForMovement(objectEvent, sprite, direction, speed); SetStepAnimHandleAlternation(objectEvent, sprite, GetSpinDirectionAnimNum(objectEvent->facingDirection)); SeekSpriteAnim(sprite, 0); } static bool8 MovementAction_SpinDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitSpin(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1); return MovementAction_SpinDown_Step1(objectEvent, sprite); } static bool8 MovementAction_SpinDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_SpinUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitSpin(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1); return MovementAction_SpinUp_Step1(objectEvent, sprite); } static bool8 MovementAction_SpinUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_SpinLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitSpin(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); return MovementAction_SpinLeft_Step1(objectEvent, sprite); } static bool8 MovementAction_SpinLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_SpinRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitSpin(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); return MovementAction_SpinRight_Step1(objectEvent, sprite); } static bool8 MovementAction_SpinRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; } return FALSE; } static bool8 MovementAction_RaiseHand_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnim(sprite, ANIM_RAISE_HAND); sprite->animPaused = FALSE; objectEvent->disableAnim = FALSE; sprite->data[2] = 1; sprite->data[4] = 0; sprite->data[5] = 0; sprite->data[6] = 0; sprite->data[7] = 0; return FALSE; } static bool8 MovementAction_RaiseHandAndStop_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return sprite->animEnded; } static bool8 MovementAction_RaiseHandAndJump_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { switch (sprite->data[7]) { case 0: if((sprite->data[6] += 10) > 127) { sprite->data[6] = 0; sprite->data[5]++; sprite->data[7] = sprite->data[5]; StartSpriteAnim(sprite, ANIM_STD_FACE_SOUTH); sprite->animPaused = FALSE; objectEvent->disableAnim = FALSE; } sprite->y2 = -(3 * gSineTable[sprite->data[6]] >> 7); objectEvent->singleMovementActive = sprite->y2 != 0; return FALSE; case 1: if (++sprite->data[4] > 16) { sprite->data[4] = 0; StartSpriteAnim(sprite, ANIM_RAISE_HAND); sprite->animPaused = FALSE; objectEvent->disableAnim = FALSE; sprite->data[7] = 0; } else { objectEvent->singleMovementActive = FALSE; } return FALSE; case 2: objectEvent->singleMovementActive = FALSE; if (++sprite->data[4] > 80) { sprite->data[4] = 0; return TRUE; } else { return FALSE; } } return FALSE; } static bool8 MovementAction_RaiseHandAndSwim_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { bool8 ret; sprite->data[7] = (sprite->data[7] + 4) & 0xFF; sprite->x2 = gSineTable[sprite->data[7]] >> 7; if (sprite->data[7] == 0) ret = TRUE; else ret = FALSE; return ret; } static bool8 MovementAction_ShakeHeadOrWalkInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { StartSpriteAnim(sprite, ANIM_SHAKE_HEAD_OR_WALK_IN_PLACE); sprite->animPaused = FALSE; objectEvent->disableAnim = FALSE; sprite->data[2] = 1; return FALSE; } static bool8 MovementAction_ShakeHeadOrWalkInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return sprite->animEnded; } u8 MovementAction_Finish(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return TRUE; } static bool8 MovementAction_PauseSpriteAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->animPaused = TRUE; return TRUE; } static bool8 MovementAction_FlyUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->y2 = 0; sprite->data[2]++; return FALSE; } static bool8 MovementAction_FlyUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->y2 -= 8; if (sprite->y2 == -160) sprite->data[2]++; return FALSE; } static bool8 MovementAction_FlyDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->y2 = -160; sprite->data[2]++; return FALSE; } static bool8 MovementAction_FlyDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->y2 += 8; if (sprite->y2 == 0) sprite->data[2]++; return FALSE; } u8 MovementAction_FlyUp_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { return TRUE; } static void UpdateObjectEventSpriteAnimPause(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (objectEvent->disableAnim) { sprite->animPaused = TRUE; } } static void TryEnableObjectEventAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (objectEvent->enableAnim) { sprite->animPaused = FALSE; objectEvent->disableAnim = FALSE; objectEvent->enableAnim = FALSE; } } static void UpdateObjectEventVisibility(struct ObjectEvent *objectEvent, struct Sprite *sprite) { CalcWhetherObjectIsOffscreen(objectEvent, sprite); UpdateObjEventSpriteVisibility(objectEvent, sprite); } static void CalcWhetherObjectIsOffscreen(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u16 x, y; u16 x2, y2; const struct ObjectEventGraphicsInfo *graphicsInfo; s16 var; objectEvent->offScreen = FALSE; graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); if (sprite->coordOffsetEnabled) { x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX; y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY; } else { x = sprite->x + sprite->x2 + sprite->centerToCornerVecX; y = sprite->y + sprite->y2 + sprite->centerToCornerVecY; } x2 = graphicsInfo->width + (s16)x; y2 = graphicsInfo->height + (s16)y; if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SSANNE_EXTERIOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SSANNE_EXTERIOR) && objectEvent->localId == 1) { var = -32; } else { var = -16; } if ((s16)x >= 256 || (s16)x2 < var) { objectEvent->offScreen = TRUE; } if ((s16)y >= 176 || (s16)y2 < -16) { objectEvent->offScreen = TRUE; } } static void UpdateObjEventSpriteVisibility(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->invisible = FALSE; if (objectEvent->invisible || objectEvent->offScreen) { sprite->invisible = TRUE; } } static void GetAllGroundEffectFlags_OnSpawn(struct ObjectEvent *objEvent, u32 *flags) { ObjectEventUpdateMetatileBehaviors(objEvent); GetGroundEffectFlags_Reflection(objEvent, flags); GetGroundEffectFlags_TallGrassOnSpawn(objEvent, flags); GetGroundEffectFlags_LongGrassOnSpawn(objEvent, flags); GetGroundEffectFlags_SandHeap(objEvent, flags); GetGroundEffectFlags_ShallowFlowingWater(objEvent, flags); GetGroundEffectFlags_ShortGrass(objEvent, flags); GetGroundEffectFlags_HotSprings(objEvent, flags); } static void GetAllGroundEffectFlags_OnBeginStep(struct ObjectEvent *objEvent, u32 *flags) { ObjectEventUpdateMetatileBehaviors(objEvent); GetGroundEffectFlags_Reflection(objEvent, flags); GetGroundEffectFlags_TallGrassOnBeginStep(objEvent, flags); GetGroundEffectFlags_LongGrassOnBeginStep(objEvent, flags); GetGroundEffectFlags_Tracks(objEvent, flags); GetGroundEffectFlags_SandHeap(objEvent, flags); GetGroundEffectFlags_ShallowFlowingWater(objEvent, flags); GetGroundEffectFlags_Puddle(objEvent, flags); GetGroundEffectFlags_ShortGrass(objEvent, flags); GetGroundEffectFlags_HotSprings(objEvent, flags); } static void GetAllGroundEffectFlags_OnFinishStep(struct ObjectEvent *objEvent, u32 *flags) { ObjectEventUpdateMetatileBehaviors(objEvent); GetGroundEffectFlags_ShallowFlowingWater(objEvent, flags); GetGroundEffectFlags_SandHeap(objEvent, flags); GetGroundEffectFlags_Puddle(objEvent, flags); GetGroundEffectFlags_Ripple(objEvent, flags); GetGroundEffectFlags_ShortGrass(objEvent, flags); GetGroundEffectFlags_HotSprings(objEvent, flags); GetGroundEffectFlags_Seaweed(objEvent, flags); GetGroundEffectFlags_JumpLanding(objEvent, flags); } static void ObjectEventUpdateMetatileBehaviors(struct ObjectEvent *objEvent) { objEvent->previousMetatileBehavior = MapGridGetMetatileBehaviorAt(objEvent->previousCoords.x, objEvent->previousCoords.y); objEvent->currentMetatileBehavior = MapGridGetMetatileBehaviorAt(objEvent->currentCoords.x, objEvent->currentCoords.y); } static void GetGroundEffectFlags_Reflection(struct ObjectEvent *objEvent, u32 *flags) { u32 reflectionFlags[2] = { GROUND_EFFECT_FLAG_REFLECTION, GROUND_EFFECT_FLAG_ICE_REFLECTION }; u8 type = ObjectEventCheckForReflectiveSurface(objEvent); if (type) { if (!objEvent->hasReflection) { objEvent->hasReflection = 0; objEvent->hasReflection = 1; *flags |= reflectionFlags[type - 1]; } } else { objEvent->hasReflection = 0; } } static void GetGroundEffectFlags_TallGrassOnSpawn(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsTallGrass(objEvent->currentMetatileBehavior)) *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN; } static void GetGroundEffectFlags_TallGrassOnBeginStep(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsTallGrass(objEvent->currentMetatileBehavior)) *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE; } static void GetGroundEffectFlags_LongGrassOnSpawn(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsLongGrass(objEvent->currentMetatileBehavior)) *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN; } static void GetGroundEffectFlags_LongGrassOnBeginStep(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsLongGrass(objEvent->currentMetatileBehavior)) *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE; } static void GetGroundEffectFlags_Tracks(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsDeepSand(objEvent->previousMetatileBehavior)) { *flags |= GROUND_EFFECT_FLAG_DEEP_SAND; } else if (MetatileBehavior_IsSand(objEvent->previousMetatileBehavior) || MetatileBehavior_IsFootprints(objEvent->previousMetatileBehavior)) { *flags |= GROUND_EFFECT_FLAG_SAND; } } static void GetGroundEffectFlags_SandHeap(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsDeepSand(objEvent->currentMetatileBehavior) && MetatileBehavior_IsDeepSand(objEvent->previousMetatileBehavior)) { if (!objEvent->inSandPile) { objEvent->inSandPile = 0; objEvent->inSandPile = 1; *flags |= GROUND_EFFECT_FLAG_SAND_PILE; } } else { objEvent->inSandPile = 0; } } static void GetGroundEffectFlags_ShallowFlowingWater(struct ObjectEvent *objEvent, u32 *flags) { if ((MetatileBehavior_IsShallowFlowingWater(objEvent->currentMetatileBehavior) && MetatileBehavior_IsShallowFlowingWater(objEvent->previousMetatileBehavior)) || (MetatileBehavior_IsPacifidlogLog(objEvent->currentMetatileBehavior) && MetatileBehavior_IsPacifidlogLog(objEvent->previousMetatileBehavior))) { if (!objEvent->inShallowFlowingWater) { objEvent->inShallowFlowingWater = 0; objEvent->inShallowFlowingWater = 1; *flags |= GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER; } } else { objEvent->inShallowFlowingWater = 0; } } static void GetGroundEffectFlags_Puddle(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior) && MetatileBehavior_IsPuddle(objEvent->previousMetatileBehavior)) { *flags |= GROUND_EFFECT_FLAG_PUDDLE; } } static void GetGroundEffectFlags_Ripple(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_HasRipples(objEvent->currentMetatileBehavior)) *flags |= GROUND_EFFECT_FLAG_RIPPLES; } static void GetGroundEffectFlags_ShortGrass(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsShortGrass(objEvent->currentMetatileBehavior) && MetatileBehavior_IsShortGrass(objEvent->previousMetatileBehavior)) { if (!objEvent->inShortGrass) { objEvent->inShortGrass = 0; objEvent->inShortGrass = 1; *flags |= GROUND_EFFECT_FLAG_SHORT_GRASS; } } else { objEvent->inShortGrass = 0; } } static void GetGroundEffectFlags_HotSprings(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsHotSprings(objEvent->currentMetatileBehavior) && MetatileBehavior_IsHotSprings(objEvent->previousMetatileBehavior)) { if (!objEvent->inHotSprings) { objEvent->inHotSprings = 0; objEvent->inHotSprings = 1; *flags |= GROUND_EFFECT_FLAG_HOT_SPRINGS; } } else { objEvent->inHotSprings = 0; } } static void GetGroundEffectFlags_Seaweed(struct ObjectEvent *objEvent, u32 *flags) { if (MetatileBehavior_IsSeaweed(objEvent->currentMetatileBehavior)) *flags |= GROUND_EFFECT_FLAG_SEAWEED; } static void GetGroundEffectFlags_JumpLanding(struct ObjectEvent *objEvent, u32 *flags) { typedef bool8 (*MetatileFunc)(u8); static const MetatileFunc metatileFuncs[] = { MetatileBehavior_IsTallGrass, MetatileBehavior_IsLongGrass, MetatileBehavior_IsPuddle, MetatileBehavior_IsSurfable, MetatileBehavior_IsShallowFlowingWater, MetatileBehavior_IsATile, }; static const u32 jumpLandingFlags[] = { GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS, GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS, GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER, GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER, GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER, GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND, }; if (objEvent->landingJump && !objEvent->disableJumpLandingGroundEffect) { u32 i; for (i = 0; i < NELEMS(metatileFuncs); i++) { if (metatileFuncs[i](objEvent->currentMetatileBehavior)) { *flags |= jumpLandingFlags[i]; return; } } } } static u8 ObjectEventCheckForReflectiveSurface(struct ObjectEvent *objEvent) { const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); // ceil div by tile width? s16 width = 1; s16 height = 2; s32 i; s32 j; u8 result; u8 b; s16 one; #define RETURN_REFLECTION_TYPE_AT(x, y) \ b = MapGridGetMetatileBehaviorAt(x, y); \ result = GetReflectionTypeByMetatileBehavior(b); \ if (result != 0) \ return result; for (i = 0, one = 1; i < height; i++) { RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x, objEvent->currentCoords.y + one + i) RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x, objEvent->previousCoords.y + one + i) for (j = 1; j < width; j++) { RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x + j, objEvent->currentCoords.y + one + i) RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x - j, objEvent->currentCoords.y + one + i) RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x + j, objEvent->previousCoords.y + one + i) RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x - j, objEvent->previousCoords.y + one + i) } } return 0; #undef RETURN_REFLECTION_TYPE_AT } static u8 GetReflectionTypeByMetatileBehavior(u32 behavior) { if (MetatileBehavior_IsIce(behavior)) return 1; else if (MetatileBehavior_IsReflective(behavior)) return 2; else return 0; } u8 GetLedgeJumpDirection(s16 x, s16 y, u8 direction) { static bool8 (*const ledgeBehaviorFuncs[])(u8) = { [DIR_SOUTH - 1] = MetatileBehavior_IsJumpSouth, [DIR_NORTH - 1] = MetatileBehavior_IsJumpNorth, [DIR_WEST - 1] = MetatileBehavior_IsJumpWest, [DIR_EAST - 1] = MetatileBehavior_IsJumpEast, }; u8 behavior; u8 index = direction; if (index == DIR_NONE) return DIR_NONE; else if (index > DIR_EAST) index -= DIR_EAST; index--; behavior = MapGridGetMetatileBehaviorAt(x, y); if (ledgeBehaviorFuncs[index](behavior) == TRUE) return index + 1; return DIR_NONE; } static void SetObjectEventSpriteOamTableForLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) { if (objEvent->disableCoveringGroundEffects) return; if (!MetatileBehavior_IsLongGrass(objEvent->currentMetatileBehavior)) return; if (!MetatileBehavior_IsLongGrass(objEvent->previousMetatileBehavior)) return; sprite->subspriteTableNum = 4; if (ElevationToPriority(objEvent->previousElevation) == 1) sprite->subspriteTableNum = 5; } static bool8 IsElevationMismatchAt(u8 elevation, s16 x, s16 y) { u8 mapElevation; if (elevation == 0) return FALSE; mapElevation = MapGridGetElevationAt(x, y); if (mapElevation == 0 || mapElevation == 15) return FALSE; if (mapElevation != elevation) return TRUE; return FALSE; } static const u8 sElevationToSubpriority[] = { 115, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 0, 0, 115 }; static const u8 sElevationToPriority[] = { 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 }; // 1 = Above player sprite // 2 = Below player sprite static const u8 sElevationToSubspriteTableNum[] = { 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, }; static void UpdateObjectEventElevationAndPriority(struct ObjectEvent *objEvent, struct Sprite *sprite) { if (objEvent->fixedPriority) return; ObjectEventUpdateElevation(objEvent); sprite->subspriteTableNum = sElevationToSubspriteTableNum[objEvent->previousElevation]; sprite->oam.priority = sElevationToPriority[objEvent->previousElevation]; } static void InitObjectPriorityByElevation(struct Sprite *sprite, u8 elevation) { sprite->subspriteTableNum = sElevationToSubspriteTableNum[elevation]; sprite->oam.priority = sElevationToPriority[elevation]; } u8 ElevationToPriority(u8 elevation) { return sElevationToPriority[elevation]; } void ObjectEventUpdateElevation(struct ObjectEvent *objEvent) { u8 curElevation = MapGridGetElevationAt(objEvent->currentCoords.x, objEvent->currentCoords.y); u8 prevElevation = MapGridGetElevationAt(objEvent->previousCoords.x, objEvent->previousCoords.y); if (curElevation == 15 || prevElevation == 15) return; objEvent->currentElevation = curElevation; if (curElevation != 0 && curElevation != 15) objEvent->previousElevation = curElevation; } void SetObjectSubpriorityByElevation(u8 elevation, struct Sprite *sprite, u8 subpriority) { s32 tmp = sprite->centerToCornerVecY; u32 tmpa = *(u16 *)&sprite->y; u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; s32 tmp2 = (tmpa - tmp) + tmpb; u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; sprite->subpriority = tmp3 + sElevationToSubpriority[elevation] + subpriority; } static void ObjectEventUpdateSubpriority(struct ObjectEvent *objEvent, struct Sprite *sprite) { if (objEvent->fixedPriority) return; SetObjectSubpriorityByElevation(objEvent->previousElevation, sprite, 1); } static bool8 AreElevationsCompatible(u8 a, u8 b) { if (a == 0 || b == 0) return TRUE; if (a != b) return FALSE; return TRUE; } void GroundEffect_SpawnOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; gFieldEffectArguments[3] = 2; gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum; gFieldEffectArguments[5] = objEvent->mapGroup; gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; gFieldEffectArguments[7] = 1; FieldEffectStart(FLDEFF_TALL_GRASS); } void GroundEffect_StepOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; gFieldEffectArguments[3] = 2; gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum; gFieldEffectArguments[5] = objEvent->mapGroup; gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; gFieldEffectArguments[7] = 0; FieldEffectStart(FLDEFF_TALL_GRASS); } void GroundEffect_SpawnOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; gFieldEffectArguments[3] = 2; gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum; gFieldEffectArguments[5] = objEvent->mapGroup; gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; gFieldEffectArguments[7] = 1; FieldEffectStart(FLDEFF_LONG_GRASS); } void GroundEffect_StepOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; gFieldEffectArguments[3] = 2; gFieldEffectArguments[4] = (objEvent->localId << 8) | objEvent->mapNum; gFieldEffectArguments[5] = objEvent->mapGroup; gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; gFieldEffectArguments[7] = 0; FieldEffectStart(FLDEFF_LONG_GRASS); } void GroundEffect_WaterReflection(struct ObjectEvent *objEvent, struct Sprite *sprite) { SetUpReflection(objEvent, sprite, 0); } void GroundEffect_IceReflection(struct ObjectEvent *objEvent, struct Sprite *sprite) { SetUpReflection(objEvent, sprite, 1); } void GroundEffect_FlowingWater(struct ObjectEvent *objEvent, struct Sprite *sprite) { StartFieldEffectForObjectEvent(FLDEFF_FEET_IN_FLOWING_WATER, objEvent); } static void (*const sGroundEffectTracksFuncs[])(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a) = { DoTracksGroundEffect_None, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, }; void GroundEffect_SandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite) { const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, 0); } void GroundEffect_DeepSandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite) { const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, 1); } static void DoTracksGroundEffect_None(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a) { } static void DoTracksGroundEffect_Footprints(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a) { // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) u16 sandFootprints_FieldEffectData[2] = { FLDEFF_SAND_FOOTPRINTS, FLDEFF_DEEP_SAND_FOOTPRINTS }; gFieldEffectArguments[0] = objEvent->previousCoords.x; gFieldEffectArguments[1] = objEvent->previousCoords.y; gFieldEffectArguments[2] = 149; gFieldEffectArguments[3] = 2; gFieldEffectArguments[4] = objEvent->facingDirection; FieldEffectStart(sandFootprints_FieldEffectData[a]); } static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a) { // Specifies which bike track shape to show next. // For example, when the bike turns from up to right, it will show // a track that curves to the right. // Each 4-byte row corresponds to the initial direction of the bike, and // each byte in that row is for the next direction of the bike in the order // of down, up, left, right. static const u8 bikeTireTracks_Transitions[4][4] = { 1, 2, 7, 8, 1, 2, 6, 5, 5, 8, 3, 4, 6, 7, 3, 4, }; if (objEvent->currentCoords.x != objEvent->previousCoords.x || objEvent->currentCoords.y != objEvent->previousCoords.y) { gFieldEffectArguments[0] = objEvent->previousCoords.x; gFieldEffectArguments[1] = objEvent->previousCoords.y; gFieldEffectArguments[2] = 149; gFieldEffectArguments[3] = 2; gFieldEffectArguments[4] = bikeTireTracks_Transitions[objEvent->previousMovementDirection][objEvent->facingDirection - 5]; FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); } } void GroundEffect_Ripple(struct ObjectEvent *objEvent, struct Sprite *sprite) { DoRippleFieldEffect(objEvent, sprite); } void GroundEffect_StepOnPuddle(struct ObjectEvent *objEvent, struct Sprite *sprite) { StartFieldEffectForObjectEvent(FLDEFF_SPLASH, objEvent); } void GroundEffect_SandHeap(struct ObjectEvent *objEvent, struct Sprite *sprite) { StartFieldEffectForObjectEvent(FLDEFF_SAND_PILE, objEvent); } void GroundEffect_JumpOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) { u8 spriteId; gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; gFieldEffectArguments[3] = 2; FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); spriteId = FindTallGrassFieldEffectSpriteId( objEvent->localId, objEvent->mapNum, objEvent->mapGroup, objEvent->currentCoords.x, objEvent->currentCoords.y); if (spriteId == MAX_SPRITES) GroundEffect_SpawnOnTallGrass(objEvent, sprite); } void GroundEffect_JumpOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; gFieldEffectArguments[3] = 2; FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); } void GroundEffect_JumpOnShallowWater(struct ObjectEvent *objEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; gFieldEffectArguments[3] = sprite->oam.priority; FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); } void GroundEffect_JumpOnWater(struct ObjectEvent *objEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; gFieldEffectArguments[3] = sprite->oam.priority; FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); } void GroundEffect_JumpLandingDust(struct ObjectEvent *objEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; gFieldEffectArguments[3] = sprite->oam.priority; FieldEffectStart(FLDEFF_DUST); } void GroundEffect_ShortGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) { StartFieldEffectForObjectEvent(FLDEFF_SHORT_GRASS, objEvent); } void GroundEffect_HotSprings(struct ObjectEvent *objEvent, struct Sprite *sprite) { StartFieldEffectForObjectEvent(FLDEFF_HOT_SPRINGS_WATER, objEvent); } void GroundEffect_Seaweed(struct ObjectEvent *objEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; FieldEffectStart(FLDEFF_BUBBLES); } static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct Sprite *sprite) = { GroundEffect_SpawnOnTallGrass, GroundEffect_StepOnTallGrass, GroundEffect_SpawnOnLongGrass, GroundEffect_StepOnLongGrass, GroundEffect_WaterReflection, GroundEffect_IceReflection, GroundEffect_FlowingWater, GroundEffect_SandTracks, GroundEffect_DeepSandTracks, GroundEffect_Ripple, GroundEffect_StepOnPuddle, GroundEffect_SandHeap, GroundEffect_JumpOnTallGrass, GroundEffect_JumpOnLongGrass, GroundEffect_JumpOnShallowWater, GroundEffect_JumpOnWater, GroundEffect_JumpLandingDust, GroundEffect_ShortGrass, GroundEffect_HotSprings, GroundEffect_Seaweed }; static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) { u32 i; if (objEvent->localId == OBJ_EVENT_ID_CAMERA && objEvent->invisible) return; if (ObjectEventIsFarawayIslandMew(objEvent) == TRUE && !ShouldMewShakeGrass(objEvent)) return; for (i = 0; i < NELEMS(sGroundEffectFuncs); i++, flags >>= 1) if (flags & 1) sGroundEffectFuncs[i](objEvent, sprite); } void filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags) { if (objEvent->disableCoveringGroundEffects) { objEvent->inShortGrass = 0; objEvent->inSandPile = 0; objEvent->inShallowFlowingWater = 0; objEvent->inHotSprings = 0; *flags &= ~(GROUND_EFFECT_FLAG_HOT_SPRINGS | GROUND_EFFECT_FLAG_SHORT_GRASS | GROUND_EFFECT_FLAG_SAND_PILE | GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER | GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE); } } void FilterOutStepOnPuddleGroundEffectIfJumping(struct ObjectEvent *objEvent, u32 *flags) { if (objEvent->landingJump) *flags &= ~GROUND_EFFECT_FLAG_PUDDLE; } static void DoGroundEffects_OnSpawn(struct ObjectEvent *objEvent, struct Sprite *sprite) { u32 flags; if (objEvent->triggerGroundEffectsOnMove) { flags = 0; UpdateObjectEventElevationAndPriority(objEvent, sprite); GetAllGroundEffectFlags_OnSpawn(objEvent, &flags); SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite); DoFlaggedGroundEffects(objEvent, sprite, flags); objEvent->triggerGroundEffectsOnMove = 0; objEvent->disableCoveringGroundEffects = 0; } } static void DoGroundEffects_OnBeginStep(struct ObjectEvent *objEvent, struct Sprite *sprite) { u32 flags; if (objEvent->triggerGroundEffectsOnMove) { flags = 0; UpdateObjectEventElevationAndPriority(objEvent, sprite); GetAllGroundEffectFlags_OnBeginStep(objEvent, &flags); SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite); filters_out_some_ground_effects(objEvent, &flags); DoFlaggedGroundEffects(objEvent, sprite, flags); objEvent->triggerGroundEffectsOnMove = 0; objEvent->disableCoveringGroundEffects = 0; } } static void DoGroundEffects_OnFinishStep(struct ObjectEvent *objEvent, struct Sprite *sprite) { u32 flags; if (objEvent->triggerGroundEffectsOnStop) { flags = 0; UpdateObjectEventElevationAndPriority(objEvent, sprite); GetAllGroundEffectFlags_OnFinishStep(objEvent, &flags); SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite); FilterOutStepOnPuddleGroundEffectIfJumping(objEvent, &flags); DoFlaggedGroundEffects(objEvent, sprite, flags); objEvent->triggerGroundEffectsOnStop = 0; objEvent->landingJump = 0; } } bool8 FreezeObjectEvent(struct ObjectEvent *objectEvent) { if (objectEvent->heldMovementActive || objectEvent->frozen) return TRUE; objectEvent->frozen = TRUE; objectEvent->spriteAnimPausedBackup = gSprites[objectEvent->spriteId].animPaused; objectEvent->spriteAffineAnimPausedBackup = gSprites[objectEvent->spriteId].affineAnimPaused; gSprites[objectEvent->spriteId].animPaused = TRUE; gSprites[objectEvent->spriteId].affineAnimPaused = TRUE; return FALSE; } void FreezeObjectEvents(void) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active && i != gPlayerAvatar.objectEventId) FreezeObjectEvent(&gObjectEvents[i]); } } void FreezeObjectEventsExceptOne(u8 noFreeze) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (i != noFreeze && gObjectEvents[i].active && i != gPlayerAvatar.objectEventId) FreezeObjectEvent(&gObjectEvents[i]); } } void UnfreezeObjectEvent(struct ObjectEvent *objectEvent) { if (objectEvent->active && objectEvent->frozen) { objectEvent->frozen = FALSE; gSprites[objectEvent->spriteId].animPaused = objectEvent->spriteAnimPausedBackup; gSprites[objectEvent->spriteId].affineAnimPaused = objectEvent->spriteAffineAnimPausedBackup; } } void UnfreezeObjectEvents(void) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active) UnfreezeObjectEvent(&gObjectEvents[i]); } } #define tDirection data[3] #define tSpeed data[4] #define tStepNo data[5] static void Step1(struct Sprite *sprite, u8 direction) { sprite->x += sDirectionToVectors[direction].x; sprite->y += sDirectionToVectors[direction].y; } static void Step2(struct Sprite *sprite, u8 direction) { sprite->x += 2 * (u16)sDirectionToVectors[direction].x; sprite->y += 2 * (u16)sDirectionToVectors[direction].y; } static void Step3(struct Sprite *sprite, u8 direction) { sprite->x += 2 * (u16)sDirectionToVectors[direction].x + (u16)sDirectionToVectors[direction].x; sprite->y += 2 * (u16)sDirectionToVectors[direction].y + (u16)sDirectionToVectors[direction].y; } static void Step4(struct Sprite *sprite, u8 direction) { sprite->x += 4 * (u16)sDirectionToVectors[direction].x; sprite->y += 4 * (u16)sDirectionToVectors[direction].y; } static void Step8(struct Sprite *sprite, u8 direction) { sprite->x += 8 * (u16)sDirectionToVectors[direction].x; sprite->y += 8 * (u16)sDirectionToVectors[direction].y; } void SetSpriteDataForNormalStep(struct Sprite *sprite, u8 direction, u8 speed) { sprite->tDirection = direction; sprite->tSpeed = speed; sprite->tStepNo = 0; } typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 direction); static const SpriteStepFunc sSpeedNormalStepFuncs[] = { Step1, Step1, Step1, Step1, Step1, Step1, Step1, Step1, Step1, Step1, Step1, Step1, Step1, Step1, Step1, Step1 }; static const SpriteStepFunc sSpeedFast1StepFuncs[] = { Step2, Step2, Step2, Step2, Step2, Step2, Step2, Step2 }; static const SpriteStepFunc sSpeedFast2StepFuncs[] = { Step2, Step3, Step3, Step2, Step3, Step3 }; static const SpriteStepFunc sSpeedFasterStepFuncs[] = { Step4, Step4, Step4, Step4 }; static const SpriteStepFunc sSpeedFastestStepFuncs[] = { Step8, Step8 }; static const SpriteStepFunc *const sNpcStepFuncTables[] = { [MOVE_SPEED_NORMAL] = sSpeedNormalStepFuncs, [MOVE_SPEED_FAST_1] = sSpeedFast1StepFuncs, [MOVE_SPEED_FAST_2] = sSpeedFast2StepFuncs, [MOVE_SPEED_FASTER] = sSpeedFasterStepFuncs, [MOVE_SPEED_FASTEST] = sSpeedFastestStepFuncs, }; static const s16 sStepTimes[] = { [MOVE_SPEED_NORMAL] = NELEMS(sSpeedNormalStepFuncs), [MOVE_SPEED_FAST_1] = NELEMS(sSpeedFast1StepFuncs), [MOVE_SPEED_FAST_2] = NELEMS(sSpeedFast2StepFuncs), [MOVE_SPEED_FASTER] = NELEMS(sSpeedFasterStepFuncs), [MOVE_SPEED_FASTEST] = NELEMS(sSpeedFastestStepFuncs), }; bool8 NpcTakeStep(struct Sprite *sprite) { if (sprite->tStepNo >= sStepTimes[sprite->tSpeed]) return FALSE; sNpcStepFuncTables[sprite->tSpeed][sprite->tStepNo](sprite, sprite->tDirection); sprite->tStepNo++; if (sprite->tStepNo < sStepTimes[sprite->tSpeed]) return FALSE; return TRUE; } #undef tSpeed #define tDelay data[4] void SetWalkSlowerSpriteData(struct Sprite *sprite, u8 direction) { sprite->tDirection = direction; sprite->tDelay = 0; sprite->tStepNo = 0; } bool8 UpdateWalkSlowerAnim(struct Sprite *sprite) { if (!(sprite->tDelay & 1)) { Step1(sprite, sprite->tDirection); sprite->tStepNo++; } sprite->tDelay++; if (sprite->tStepNo > 15) return TRUE; else return FALSE; } // SetWalkSlowSpriteData, SetWalkSlowerSpriteData, SetWalkSlowestSpriteData, // and SetRunSlowSpriteData are functionally equivalent void SetWalkSlowSpriteData(struct Sprite *sprite, u8 direction) { sprite->tDirection = direction; sprite->tDelay = 0; sprite->tStepNo = 0; } bool8 UpdateWalkSlowAnim(struct Sprite *sprite) { if (++sprite->tDelay < 3) { Step1(sprite, sprite->tDirection); sprite->tStepNo++; } else sprite->tDelay = 0; if (sprite->tStepNo > 15) return TRUE; else return FALSE; } void SetWalkSlowestSpriteData(struct Sprite *sprite, u8 direction) { sprite->tDirection = direction; sprite->tDelay = 0; sprite->tStepNo = 0; } bool8 UpdateWalkSlowestAnim(struct Sprite *sprite) { if (++sprite->tDelay > 9) { sprite->tDelay = 0; Step1(sprite, sprite->tDirection); sprite->tStepNo++; } if (sprite->tStepNo > 15) return TRUE; else return FALSE; } void SetRunSlowSpriteData(struct Sprite *sprite, u8 direction) { sprite->tDirection = direction; sprite->tDelay = 0; sprite->tStepNo = 0; } bool8 UpdateRunSlowAnim(struct Sprite *sprite) { if ((++sprite->tDelay) & 1) { Step1(sprite, sprite->tDirection); sprite->tStepNo++; } else { Step2(sprite, sprite->tDirection); sprite->tStepNo += 2; } if (sprite->tStepNo > 15) return TRUE; else return FALSE; } #undef tStepNo #undef tDelay static const s8 sJumpY_High[] = { -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0 }; static const s8 sJumpY_Low[] = { 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0 }; static const s8 sJumpY_Normal[] = { -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0 }; #define sJumpDistance data[4] #define sJumpType data[5] #define sTimer data[6] static const s8 *const sJumpYTable[] = { [JUMP_TYPE_HIGH] = sJumpY_High, [JUMP_TYPE_LOW] = sJumpY_Low, [JUMP_TYPE_NORMAL] = sJumpY_Normal, }; static s16 GetJumpY(s16 i, u8 type) { return sJumpYTable[type][i]; } void SetJumpSpriteData(struct Sprite *sprite, u8 direction, u8 distance, u8 type) { sprite->tDirection = direction; sprite->sJumpDistance = distance; sprite->sJumpType = type; sprite->sTimer = 0; } u8 DoJumpSpriteMovement(struct Sprite *sprite) { s16 distanceToTime[] = { [JUMP_DISTANCE_IN_PLACE] = 16, [JUMP_DISTANCE_NORMAL] = 16, [JUMP_DISTANCE_FAR] = 32, }; u8 distanceToShift[] = { [JUMP_DISTANCE_IN_PLACE] = 0, [JUMP_DISTANCE_NORMAL] = 0, [JUMP_DISTANCE_FAR] = 1, }; u8 jumpPhase = 0; if (sprite->sJumpDistance != JUMP_DISTANCE_IN_PLACE) Step1(sprite, sprite->tDirection); sprite->y2 = GetJumpY(sprite->sTimer >> distanceToShift[sprite->sJumpDistance], sprite->sJumpType); sprite->sTimer++; if (sprite->sTimer == (distanceToTime[sprite->sJumpDistance] >> 1)) jumpPhase = JUMP_HALFWAY; if (sprite->sTimer >= distanceToTime[sprite->sJumpDistance]) { sprite->y2 = 0; jumpPhase = JUMP_FINISHED; } return jumpPhase; } u8 DoJumpSpecialSpriteMovement(struct Sprite *sprite) { s16 duration[3] = {0x20, 0x20, 0x40}; u8 shifts[3] = {1, 1, 2}; u8 jumpPhase = 0; if (sprite->sJumpDistance != JUMP_DISTANCE_IN_PLACE && !(sprite->sTimer & 1)) Step1(sprite, sprite->tDirection); sprite->y2 = GetJumpY(sprite->sTimer >> shifts[sprite->sJumpDistance], sprite->sJumpType); sprite->sTimer++; if (sprite->sTimer == (duration[sprite->sJumpDistance] >> 1)) jumpPhase = JUMP_HALFWAY; if (sprite->sTimer >= duration[sprite->sJumpDistance]) { sprite->y2 = 0; jumpPhase = JUMP_FINISHED; } return jumpPhase; } #undef sTimer #undef sJumpType #undef sJumpDistance #undef tDirection #define tDelay data[3] void SetMovementDelay(struct Sprite *sprite, s16 delay) { sprite->tDelay = delay; } bool8 WaitForMovementDelay(struct Sprite *sprite) { sprite->tDelay--; if (sprite->tDelay == 0) return TRUE; else return FALSE; } #undef tDelay void SetAndStartSpriteAnim(struct Sprite *sprite, u8 animNum, u8 animCmdIndex) { sprite->animNum = animNum; sprite->animPaused = FALSE; SeekSpriteAnim(sprite, animCmdIndex); } bool8 SpriteAnimEnded(struct Sprite *sprite) { if (sprite->animEnded) return TRUE; else return FALSE; } void UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible) { u16 x, y; s16 x2, y2; sprite->invisible = invisible; if (sprite->coordOffsetEnabled) { x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX; y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY; } else { x = sprite->x + sprite->x2 + sprite->centerToCornerVecX; y = sprite->y + sprite->y2 + sprite->centerToCornerVecY; } x2 = x - (sprite->centerToCornerVecX >> 1); y2 = y - (sprite->centerToCornerVecY >> 1); if ((s16)x >= DISPLAY_WIDTH + 16 || x2 < -16) sprite->invisible = TRUE; if ((s16)y >= DISPLAY_HEIGHT + 16 || y2 < -16) sprite->invisible = TRUE; } #define sInvisible data[2] #define sAnimNum data[3] #define sAnimState data[4] void SpriteCB_VirtualObject(struct Sprite *sprite) { VirtualObject_UpdateAnim(sprite); SetObjectSubpriorityByElevation(sprite->sVirtualObjElev, sprite, 1); UpdateObjectEventSpriteInvisibility(sprite, sprite->sInvisible); } // Unused static void DestroyVirtualObjects(void) { s32 i; for (i = 0; i < MAX_SPRITES; i++) { struct Sprite *sprite = &gSprites[i]; if (sprite->inUse && sprite->callback == SpriteCB_VirtualObject) DestroySprite(sprite); } } static int GetVirtualObjectSpriteId(u8 virtualObjId) { int i; for (i = 0; i < MAX_SPRITES; i++) { struct Sprite *sprite = &gSprites[i]; if (sprite->inUse && sprite->callback == SpriteCB_VirtualObject && (u8)sprite->sVirtualObjId == virtualObjId) return i; } return MAX_SPRITES; } void TurnVirtualObject(u8 virtualObjId, u8 direction) { u8 animNum; u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; StartSpriteAnim(sprite, GetFaceDirectionAnimNum(direction)); } } void SetVirtualObjectGraphics(u8 virtualObjId, u8 direction) { int spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(direction); u16 baseBlock = sprite->oam.tileNum; sprite->oam = *info->oam; sprite->oam.tileNum = baseBlock; sprite->oam.paletteNum = info->paletteSlot; sprite->images = info->images; if (info->subspriteTables == NULL) { sprite->subspriteTables = NULL; sprite->subspriteTableNum = 0; sprite->subspriteMode = SUBSPRITES_OFF; } else { SetSubspriteTables(sprite, info->subspriteTables); sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; } StartSpriteAnim(sprite, 0); } } void SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible) { u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId != MAX_SPRITES) { if (invisible) gSprites[spriteId].sInvisible = TRUE; else gSprites[spriteId].sInvisible = FALSE; } } bool32 IsVirtualObjectInvisible(u8 virtualObjId) { u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId == MAX_SPRITES) return FALSE; return gSprites[spriteId].sInvisible == TRUE; } void SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNo) { u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId != MAX_SPRITES) { gSprites[spriteId].sAnimNum = animNo; gSprites[spriteId].sAnimState = 0; } } static void MoveUnionRoomObjectUp(struct Sprite *sprite) { switch (sprite->sAnimState) { case 0: sprite->y2 = 0; sprite->sAnimState++; // fallthrough case 1: if ((sprite->y2 -= 8) == -DISPLAY_HEIGHT) { sprite->y2 = 0; sprite->sInvisible = TRUE; sprite->sAnimNum = 0; sprite->sAnimState = 0; } break; } } static void MoveUnionRoomObjectDown(struct Sprite *sprite) { switch (sprite->sAnimState) { case 0: sprite->y2 = -DISPLAY_HEIGHT; sprite->sAnimState++; // fallthrough case 1: if ((sprite->y2 += 8) == 0) { sprite->sAnimNum = 0; sprite->sAnimState = 0; } break; } } static void VirtualObject_UpdateAnim(struct Sprite *sprite) { switch (sprite->sAnimNum) { case UNION_ROOM_SPAWN_NONE: break; case UNION_ROOM_SPAWN_IN: MoveUnionRoomObjectDown(sprite); break; case UNION_ROOM_SPAWN_OUT: MoveUnionRoomObjectUp(sprite); break; default: sprite->sAnimNum = 0; AGB_ASSERT_EX(0, ABSPATH("evobjmv.c"), 13331); } } bool32 IsVirtualObjectAnimating(u8 virtualObjId) { u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId == MAX_SPRITES) return FALSE; if (gSprites[spriteId].sAnimNum) return TRUE; else return FALSE; } #undef sVirtualObjId #undef sVirtualObjElev #undef sInvisible #undef sAnimNum #undef sAnimState u32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent *objectEvent) { ObjectEventGetLocalIdAndMap(objectEvent, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); return FieldEffectStart(fieldEffectId); } void DoShadowFieldEffect(struct ObjectEvent *objectEvent) { if (!objectEvent->hasShadow) { objectEvent->hasShadow = TRUE; StartFieldEffectForObjectEvent(FLDEFF_SHADOW, objectEvent); } } static void DoRippleFieldEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); gFieldEffectArguments[0] = sprite->x; gFieldEffectArguments[1] = sprite->y + (graphicsInfo->height >> 1) - 2; gFieldEffectArguments[2] = 151; gFieldEffectArguments[3] = 3; FieldEffectStart(FLDEFF_RIPPLE); } void SetObjectMovementType(u16 localId, u8 movementType) { struct ObjectEvent *objectEvent = &gObjectEvents[GetObjectEventIdByLocalId(localId)]; objectEvent->movementType = movementType; objectEvent->directionSequenceIndex = 0; objectEvent->playerCopyableMovement = 0; gSprites[objectEvent->spriteId].callback = sMovementTypeCallbacks[movementType]; gSprites[objectEvent->spriteId].data[1] = 0; } ================================================ FILE: src/evolution_graphics.c ================================================ #include "global.h" #include "gflib.h" #include "trig.h" #include "random.h" #include "decompress.h" #include "task.h" #include "evolution_scene.h" #include "evolution_graphics.h" #include "constants/songs.h" static void SpriteCallbackDummy_EvoSparkles(struct Sprite *sprite); static void EvoTask_PreEvoSparkleSet1Init(u8 taskId); static void EvoTask_CreatePreEvoSparkleSet1(u8 taskId); static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskId); static void EvoTask_PreEvoSparkleSet2Init(u8 taskId); static void EvoTask_CreatePreEvoSparklesSet2(u8 taskId); static void EvoTask_PreEvoSparkleSet2Teardown(u8 taskId); static void EvoTask_PostEvoSparklesSet1Init(u8 taskId); static void EvoTask_CreatePostEvoSparklesSet1(u8 taskId); static void EvoTask_PostEvoSparklesSet1Teardown(u8 taskId); static void EvoTask_PostEvoSparklesSet2Init(u8 taskId); static void EvoTask_CreatePostEvoSparklesSet2(u8 taskId); static void EvoTask_PostEvoSparklesSet2Teardown(u8 taskId); static void EvoTask_PostEvoSparklesSet2TradeInit(u8 taskId); static void EvoTask_CreatePostEvoSparklesSet2Trade(u8 taskId); static void EvoTask_PrePostEvoMonSpritesInit(u8 taskId); static void EvoTask_ChooseNextEvoSpriteAnim(u8 taskId); static void EvoTask_ShrinkOrExpandEvoSprites(u8 taskId); static void PreEvoInvisible_PostEvoVisible_KillTask(u8 taskId); static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskId); static const u16 sEvolutionSparklesPalData[] = INCBIN_U16("graphics/evolution_scene/sparkle.gbapal"); static const u32 sEvolutionSparklesTileData[] = INCBIN_U32("graphics/evolution_scene/sparkle.4bpp.lz"); static const struct CompressedSpriteSheet sSpriteSheet_EvolutionSparkles[] = { { sEvolutionSparklesTileData, 0x20, 1001 }, {} }; static const struct SpritePalette sSpritePalette_EvolutionSparkles[] = { { sEvolutionSparklesPalData, 1001 }, {} }; static const struct OamData sOamData_EvolutionSparkles = { .y = 160, .priority = 1 }; static const union AnimCmd sSpriteAnim_EvolutionSparkles_0[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_EvolutionSparkles[] = { sSpriteAnim_EvolutionSparkles_0 }; static const struct SpriteTemplate sSpriteTemplate_EvolutionSparkles = { .tileTag = 1001, .paletteTag = 1001, .oam = &sOamData_EvolutionSparkles, .anims = sSpriteAnimTable_EvolutionSparkles, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy_EvoSparkles }; static const u16 sEvolutionSparkleMatrixScales[12] = { 0x3C0, 0x380, 0x340, 0x300, 0x2C0, 0x280, 0x240, 0x200, 0x1C0, 0x180, 0x140, 0x100 }; static const s16 sUnused[][2] = { {-4, 0x10}, {-3, 0x30}, {-2, 0x50}, {-1, 0x70}, { 1, 0x70}, { 2, 0x50}, { 3, 0x30}, { 4, 0x10} }; static void SpriteCallbackDummy_EvoSparkles(struct Sprite *sprite) { } static void SetEvoSparklesMatrices(void) { u32 i; for (i = 0; i < NELEMS(sEvolutionSparkleMatrixScales); i++) SetOamMatrix(i + 20, sEvolutionSparkleMatrixScales[i], 0, 0, sEvolutionSparkleMatrixScales[i]); } static void SpriteCB_PreEvoSparkleSet1(struct Sprite *sprite) { u8 mnum; if (sprite->y > 8) { sprite->y = 88 - sprite->data[7] * sprite->data[7] / 80; sprite->y2 = Sin((u8)sprite->data[6], sprite->data[5]) / 4; sprite->x2 = Cos((u8) sprite->data[6], sprite->data[5]); sprite->data[6] += 4; if (sprite->data[7] & 1) sprite->data[5]--; sprite->data[7]++; if (sprite->y2 > 0) sprite->subpriority = 1; else sprite->subpriority = 20; mnum = sprite->data[5] / 4 + 20; if (mnum > 31) mnum = 31; sprite->oam.matrixNum = mnum; } else { DestroySprite(sprite); } } static void CreatePreEvoSparkleSet1(u8 a0) { u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 88, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[5] = 48; gSprites[spriteId].data[6] = a0; gSprites[spriteId].data[7] = 0; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteId].oam.matrixNum = 31; gSprites[spriteId].callback = SpriteCB_PreEvoSparkleSet1; } } static void SpriteCB_PreEvoSparkleSet2(struct Sprite *sprite) { if (sprite->y < 88) { sprite->y = 8 + sprite->data[7] * sprite->data[7] / 5; sprite->y2 = Sin((u8)sprite->data[6], sprite->data[5]) / 4; sprite->x2 = Cos((u8)sprite->data[6], sprite->data[5]); sprite->data[5] = Sin((u8)(sprite->data[7] * 4), 40) + 8; sprite->data[7]++; } else { DestroySprite(sprite); } } static void CreatePreEvoSparkleSet2(u8 a0) { u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 8, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[5] = 8; gSprites[spriteId].data[6] = a0; gSprites[spriteId].data[7] = 0; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteId].oam.matrixNum = 25; gSprites[spriteId].subpriority = 1; gSprites[spriteId].callback = SpriteCB_PreEvoSparkleSet2; } } static void SpriteCB_PostEvoSparkleSet1(struct Sprite *sprite) { if (sprite->data[5] > 8) { sprite->y2 = Sin((u8)sprite->data[6], sprite->data[5]); sprite->x2 = Cos((u8)sprite->data[6], sprite->data[5]); sprite->data[5] -= sprite->data[3]; sprite->data[6] += 4; } else { DestroySprite(sprite); } } static void CreatePostEvoSparkleSet1(u8 a0, u8 a1) { u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 56, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[3] = a1; gSprites[spriteId].data[5] = 120; gSprites[spriteId].data[6] = a0; gSprites[spriteId].data[7] = 0; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteId].oam.matrixNum = 31; gSprites[spriteId].subpriority = 1; gSprites[spriteId].callback = SpriteCB_PostEvoSparkleSet1; } } static void SpriteCB_PostEvoSparkleSet2(struct Sprite *sprite) { u8 mnum; if ((sprite->data[7] & 3) == 0) sprite->y++; if (sprite->data[6] < 128) { sprite->y2 = -Sin((u8)sprite->data[6], sprite->data[5]); sprite->x = 120 + sprite->data[3] * sprite->data[7] / 3; sprite->data[6]++; mnum = 31 - sprite->data[6] * 12 / 128; if (sprite->data[6] > 64) { sprite->subpriority = 1; } else { sprite->invisible = FALSE; sprite->subpriority = 20; if (sprite->data[6] > 112 && (sprite->data[6] & 1)) sprite->invisible = TRUE; } if (mnum < 20) mnum = 20; sprite->oam.matrixNum = mnum; sprite->data[7]++; } else { DestroySprite(sprite); } } static void CreatePostEvoSparkleSet2(u8 unused) { u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 56, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[3] = 3 - (Random() % 7); gSprites[spriteId].data[5] = 48 + (Random() & 63); gSprites[spriteId].data[7] = 0; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteId].oam.matrixNum = 31; gSprites[spriteId].subpriority = 20; gSprites[spriteId].callback = SpriteCB_PostEvoSparkleSet2; } } void LoadEvoSparkleSpriteAndPal(void) { LoadCompressedSpriteSheetUsingHeap(sSpriteSheet_EvolutionSparkles); LoadSpritePalettes(sSpritePalette_EvolutionSparkles); } u8 EvolutionSparkles_SpiralUpward(u16 a0) { u8 taskId = CreateTask(EvoTask_PreEvoSparkleSet1Init, 0); gTasks[taskId].data[1] = a0; return taskId; } static void EvoTask_PreEvoSparkleSet1Init(u8 taskId) { SetEvoSparklesMatrices(); gTasks[taskId].data[15] = 0; BeginNormalPaletteFade(3 << gTasks[taskId].data[1], 10, 0, 16, RGB_WHITE); gTasks[taskId].func = EvoTask_CreatePreEvoSparkleSet1; PlaySE(SE_M_MEGA_KICK); } static void EvoTask_CreatePreEvoSparkleSet1(u8 taskId) { u32 i; if (gTasks[taskId].data[15] < 64) { if ((gTasks[taskId].data[15] & 7) == 0) { for (i = 0; i < 4; i++) CreatePreEvoSparkleSet1(2 * (gTasks[taskId].data[15] & 0x78) + 64 * i); } gTasks[taskId].data[15]++; } else { gTasks[taskId].data[15] = 96; gTasks[taskId].func = EvoTask_WaitForPre1SparklesToGoUp; } } static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskId) { if (gTasks[taskId].data[15] != 0) gTasks[taskId].data[15]--; else DestroyTask(taskId); } u8 EvolutionSparkles_ArcDown(void) { u8 taskId = CreateTask(EvoTask_PreEvoSparkleSet2Init, 0); return taskId; } static void EvoTask_PreEvoSparkleSet2Init(u8 taskId) { SetEvoSparklesMatrices(); gTasks[taskId].data[15] = 0; gTasks[taskId].func = EvoTask_CreatePreEvoSparklesSet2; PlaySE(SE_M_BUBBLE_BEAM2); } static void EvoTask_CreatePreEvoSparklesSet2(u8 taskId) { u32 i; if (gTasks[taskId].data[15] < 96) { if (gTasks[taskId].data[15] < 6) { for (i = 0; i < 9; i++) CreatePreEvoSparkleSet2(16 * i); } gTasks[taskId].data[15]++; } else { gTasks[taskId].func = EvoTask_PreEvoSparkleSet2Teardown; } } static void EvoTask_PreEvoSparkleSet2Teardown(u8 taskId) { DestroyTask(taskId); } u8 EvolutionSparkles_CircleInward(void) { u8 taskId = CreateTask(EvoTask_PostEvoSparklesSet1Init, 0); return taskId; } static void EvoTask_PostEvoSparklesSet1Init(u8 taskId) { SetEvoSparklesMatrices(); gTasks[taskId].data[15] = 0; gTasks[taskId].func = EvoTask_CreatePostEvoSparklesSet1; PlaySE(SE_SHINY); } static void EvoTask_CreatePostEvoSparklesSet1(u8 taskId) { u32 i; if (gTasks[taskId].data[15] < 48) { if (gTasks[taskId].data[15] == 0) { for (i = 0; i < 16; i++) { CreatePostEvoSparkleSet1(i * 16, 4); } } if (gTasks[taskId].data[15] == 32) { for (i = 0; i < 16; i++) { CreatePostEvoSparkleSet1(i * 16, 8); } } gTasks[taskId].data[15]++; } else { gTasks[taskId].func = EvoTask_PostEvoSparklesSet1Teardown; } } static void EvoTask_PostEvoSparklesSet1Teardown(u8 taskId) { DestroyTask(taskId); } u8 EvolutionSparkles_SprayAndFlash(u16 species) { u8 taskId = CreateTask(EvoTask_PostEvoSparklesSet2Init, 0); gTasks[taskId].data[2] = species; return taskId; } static void EvoTask_PostEvoSparklesSet2Init(u8 taskId) { SetEvoSparklesMatrices(); gTasks[taskId].data[15] = 0; IsMovingBackgroundTaskRunning(); CpuCopy16(&gPlttBufferFaded[BG_PLTT_ID(2)], &gPlttBufferUnfaded[BG_PLTT_ID(2)], 3 * PLTT_SIZE_4BPP); BeginNormalPaletteFade(0xFFF90F1C, 0, 0, 16, RGB_WHITE); gTasks[taskId].func = EvoTask_CreatePostEvoSparklesSet2; PlaySE(SE_M_PETAL_DANCE); } static void EvoTask_CreatePostEvoSparklesSet2(u8 taskId) { u32 i; if (gTasks[taskId].data[15] < 128) { switch (gTasks[taskId].data[15]) { default: if (gTasks[taskId].data[15] < 50) CreatePostEvoSparkleSet2(Random() & 7); break; case 0: for (i = 0; i < 8; i++) CreatePostEvoSparkleSet2(i); break; case 32: BeginNormalPaletteFade(0xFFFF0F1C, 16, 16, 0, RGB_WHITE); break; } gTasks[taskId].data[15]++; } else { gTasks[taskId].func = EvoTask_PostEvoSparklesSet2Teardown; } } static void EvoTask_PostEvoSparklesSet2Teardown(u8 taskId) { if (!gPaletteFade.active) DestroyTask(taskId); } u8 EvolutionSparkles_SprayAndFlash_Trade(u16 species) { u8 taskId = CreateTask(EvoTask_PostEvoSparklesSet2TradeInit, 0); gTasks[taskId].data[2] = species; return taskId; } static void EvoTask_PostEvoSparklesSet2TradeInit(u8 taskId) { SetEvoSparklesMatrices(); gTasks[taskId].data[15] = 0; IsMovingBackgroundTaskRunning(); CpuCopy16(&gPlttBufferFaded[BG_PLTT_ID(2)], &gPlttBufferUnfaded[BG_PLTT_ID(2)], 3 * PLTT_SIZE_4BPP); BeginNormalPaletteFade(0xFFF90F00, 0, 0, 16, RGB_WHITE); gTasks[taskId].func = EvoTask_CreatePostEvoSparklesSet2Trade; PlaySE(SE_M_PETAL_DANCE); } static void EvoTask_CreatePostEvoSparklesSet2Trade(u8 taskId) { u32 i; if (gTasks[taskId].data[15] < 128) { switch (gTasks[taskId].data[15]) { default: if (gTasks[taskId].data[15] < 50) CreatePostEvoSparkleSet2(Random() & 7); break; case 0: for (i = 0; i < 8; i++) CreatePostEvoSparkleSet2(i); break; case 32: BeginNormalPaletteFade(0xFFFF0F00, 16, 16, 0, RGB_WHITE); break; } gTasks[taskId].data[15]++; } else { gTasks[taskId].func = EvoTask_PostEvoSparklesSet2Teardown; } } static void SpriteCallbackDummy_MonSprites(struct Sprite *sprite) { } #define tPreEvoSpriteId data[1] #define tPostEvoSpriteId data[2] #define tPreEvoScale data[3] #define tPostEvoScale data[4] #define tDirection data[5] #define tSpeed data[6] u8 CycleEvolutionMonSprite(u8 preEvoSpriteId, u8 postEvoSpriteId) { u32 i; u8 taskId; u16 palette[16]; for (i = 0; i < 16; i++) palette[i] = RGB_WHITE; taskId = CreateTask(EvoTask_PrePostEvoMonSpritesInit, 0); gTasks[taskId].tPreEvoSpriteId = preEvoSpriteId; gTasks[taskId].tPostEvoSpriteId = postEvoSpriteId; gTasks[taskId].tPreEvoScale = 256; gTasks[taskId].tPostEvoScale = 16; SetOamMatrix(30, 0x10000 / gTasks[taskId].tPreEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPreEvoScale); SetOamMatrix(31, 0x10000 / gTasks[taskId].tPostEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPostEvoScale); gSprites[preEvoSpriteId].callback = SpriteCallbackDummy_MonSprites; gSprites[preEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[preEvoSpriteId].oam.matrixNum = 30; gSprites[preEvoSpriteId].invisible = FALSE; CpuCopy16(palette, &gPlttBufferFaded[OBJ_PLTT_ID(gSprites[preEvoSpriteId].oam.paletteNum)], PLTT_SIZE_4BPP); gSprites[postEvoSpriteId].callback = SpriteCallbackDummy_MonSprites; gSprites[postEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[postEvoSpriteId].oam.matrixNum = 31; gSprites[postEvoSpriteId].invisible = FALSE; CpuCopy16(palette, &gPlttBufferFaded[OBJ_PLTT_ID(gSprites[postEvoSpriteId].oam.paletteNum)], PLTT_SIZE_4BPP); gTasks[taskId].EvoGraphicsTaskEvoStop = FALSE; return taskId; } static void EvoTask_PrePostEvoMonSpritesInit(u8 taskId) { gTasks[taskId].tDirection = FALSE; gTasks[taskId].tSpeed = 8; gTasks[taskId].func = EvoTask_ChooseNextEvoSpriteAnim; } static void EvoTask_ChooseNextEvoSpriteAnim(u8 taskId) { if (gTasks[taskId].EvoGraphicsTaskEvoStop) { PreEvoVisible_PostEvoInvisible_KillTask(taskId); } else if (gTasks[taskId].tSpeed == 128) { PreEvoInvisible_PostEvoVisible_KillTask(taskId); } else { gTasks[taskId].tSpeed += 2; gTasks[taskId].tDirection ^= TRUE; gTasks[taskId].func = EvoTask_ShrinkOrExpandEvoSprites; } } static void EvoTask_ShrinkOrExpandEvoSprites(u8 taskId) { u8 r6; if (gTasks[taskId].EvoGraphicsTaskEvoStop) { gTasks[taskId].func = PreEvoVisible_PostEvoInvisible_KillTask; } else { r6 = 0; if (!gTasks[taskId].tDirection) { if (gTasks[taskId].tPreEvoScale < 0x100 - gTasks[taskId].tSpeed) { gTasks[taskId].tPreEvoScale += gTasks[taskId].tSpeed; } else { gTasks[taskId].tPreEvoScale = 0x100; r6 = 1; } if (gTasks[taskId].tPostEvoScale > 0x10 + gTasks[taskId].tSpeed) { gTasks[taskId].tPostEvoScale -= gTasks[taskId].tSpeed; } else { gTasks[taskId].tPostEvoScale = 0x10; r6++; } } else { if (gTasks[taskId].tPostEvoScale < 0x100 - gTasks[taskId].tSpeed) { gTasks[taskId].tPostEvoScale += gTasks[taskId].tSpeed; } else { gTasks[taskId].tPostEvoScale = 0x100; r6 = 1; } if (gTasks[taskId].tPreEvoScale > 0x10 + gTasks[taskId].tSpeed) { gTasks[taskId].tPreEvoScale -= gTasks[taskId].tSpeed; } else { gTasks[taskId].tPreEvoScale = 0x10; r6++; } } SetOamMatrix(30, 0x10000 / gTasks[taskId].tPreEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPreEvoScale); SetOamMatrix(31, 0x10000 / gTasks[taskId].tPostEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPostEvoScale); if (r6 == 2) { gTasks[taskId].func = EvoTask_ChooseNextEvoSpriteAnim; } } } static void PreEvoInvisible_PostEvoVisible_KillTask(u8 taskId) { gSprites[gTasks[taskId].tPreEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; gSprites[gTasks[taskId].tPreEvoSpriteId].oam.matrixNum = 0; gSprites[gTasks[taskId].tPreEvoSpriteId].invisible = TRUE; gSprites[gTasks[taskId].tPostEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; gSprites[gTasks[taskId].tPostEvoSpriteId].oam.matrixNum = 0; gSprites[gTasks[taskId].tPostEvoSpriteId].invisible = FALSE; DestroyTask(taskId); } static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskId) { gSprites[gTasks[taskId].tPreEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; gSprites[gTasks[taskId].tPreEvoSpriteId].oam.matrixNum = 0; gSprites[gTasks[taskId].tPreEvoSpriteId].invisible = FALSE; gSprites[gTasks[taskId].tPostEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; gSprites[gTasks[taskId].tPostEvoSpriteId].oam.matrixNum = 0; gSprites[gTasks[taskId].tPostEvoSpriteId].invisible = TRUE; DestroyTask(taskId); } #undef tPreEvoSpriteId #undef tPostEvoSpriteId #undef tPreEvoScale #undef tPostEvoScale #undef tDirection #undef tSpeed ================================================ FILE: src/evolution_scene.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_message.h" #include "data.h" #include "decompress.h" #include "help_system.h" #include "evolution_scene.h" #include "evolution_graphics.h" #include "link.h" #include "link_rfu.h" #include "m4a.h" #include "event_data.h" #include "trade_scene.h" #include "new_menu_helpers.h" #include "menu.h" #include "overworld.h" #include "pokedex.h" #include "pokemon_summary_screen.h" #include "scanline_effect.h" #include "strings.h" #include "task.h" #include "text_window.h" #include "trig.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/pokemon.h" #include "constants/items.h" extern struct Evolution gEvolutionTable[][EVOS_PER_MON]; struct EvoInfo { u8 preEvoSpriteId; u8 postEvoSpriteId; u8 evoTaskId; u8 delayTimer; u16 savedPalette[48]; }; // EWRAM vars static EWRAM_DATA struct EvoInfo *sEvoStructPtr = NULL; static EWRAM_DATA u16 *sBgAnimPal = NULL; // IWRAM common void (*gCB2_AfterEvolution)(void); #define sEvoCursorPos gBattleCommunication[1] // when learning a new move #define sEvoGraphicsTaskId gBattleCommunication[2] // this file's functions static void Task_EvolutionScene(u8 taskId); static void Task_TradeEvolutionScene(u8 taskId); static void CB2_EvolutionSceneUpdate(void); static void CB2_TradeEvolutionSceneUpdate(void); static void EvoDummyFunc(void); static void VBlankCB_EvolutionScene(void); static void VBlankCB_TradeEvolutionScene(void); static void StartBgAnimation(bool8 isLink); static void StopBgAnimation(void); static void Task_AnimateBg(u8 taskId); static void RestoreBgAfterAnim(void); // const data static const u16 sUnusedPal[] = INCBIN_U16("graphics/evolution_scene/unused.gbapal"); static const u32 sMovingBackgroundTiles[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.lz"); static const u32 sMovingBackgroundMap1[] = INCBIN_U32("graphics/evolution_scene/bg.bin.lz"); static const u32 sMovingBackgroundMap2[] = INCBIN_U32("graphics/evolution_scene/bg2.bin.lz"); static const u16 sBlackPalette[] = INCBIN_U16("graphics/evolution_scene/gray_transition_intro.gbapal"); static const u16 sUnusedTilemap[] = INCBIN_U16("graphics/evolution_scene/unused_tilemap.bin"); static const u16 sBgAnim_Pal[] = INCBIN_U16("graphics/evolution_scene/transition.gbapal"); static const u8 sText_ShedinjaJapaneseName[] = _("ヌケニン"); static const u8 sText_UnusedColors[] = _("{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}"); static const u8 sText_UnusedArrows[][10] = { _("▶\n "), _(" \n▶"), _(" \n ") }; // The below table is used by Task_UpdateBgPalette to control the speed at which the bg color updates. // The first two values are indexes into sBgAnim_PalIndexes (indirectly, via sBgAnimPal), and are // the start and end of the range of colors in sBgAnim_PalIndexes it will move through incrementally // before starting over. It will repeat this cycle x number of times, where x = the 3rd value, // delaying each increment by y, where y = the 4th value. // Once it has cycled x number of times, it will move to the next array in this table. static const u8 sBgAnim_PaletteControl[][4] = { { 0, 12, 1, 6 }, { 13, 36, 5, 2 }, { 13, 24, 1, 2 }, { 37, 49, 1, 6 }, }; // Indexes into sBgAnim_Pal, 0 is black, transitioning to a bright light blue (172, 213, 255) at 13 static const u8 sBgAnim_PalIndexes[][16] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0 }, { 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0 }, { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0 }, { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 0, 0 }, { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0 }, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0 }, { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 0, 0 }, { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 0, 0 }, { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 0, 0 }, { 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 0, 0 }, { 0, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 0, 0 }, { 0, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 0, 0 }, { 0, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 0, 0 }, { 0, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 0, 0 }, { 0, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 0, 0 }, { 0, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 0, 0 }, { 0, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, 0 }, { 0, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 }, { 0, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 0, 0 }, { 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 0, 0 }, { 0, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 0, 0 }, { 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 0, 0 }, { 0, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 0, 0 }, { 0, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 0, 0 }, { 0, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0 }, { 0, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0 }, { 0, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0 }, { 0, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0 }, { 0, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0 }, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0 }, { 0, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0 }, { 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0 }, { 0, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0 }, { 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0 }, { 0, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0 }, { 0, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; static void CB2_BeginEvolutionScene(void) { UpdatePaletteFade(); RunTasks(); } #define tState data[0] #define tPreEvoSpecies data[1] #define tPostEvoSpecies data[2] #define tCanStop data[3] #define tBits data[3] #define tLearnsFirstMove data[4] #define tLearnMoveState data[6] #define tLearnMoveYesState data[7] #define tLearnMoveNoState data[8] #define tEvoWasStopped data[9] #define tPartyId data[10] #define TASK_BIT_CAN_STOP (1 << 0) #define TASK_BIT_LEARN_MOVE (1 << 7) static void Task_BeginEvolutionScene(u8 taskId) { struct Pokemon* mon = NULL; switch (gTasks[taskId].tState) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tState++; break; case 1: if (!gPaletteFade.active) { u16 postEvoSpecies; bool8 canStopEvo; u8 partyId; mon = &gPlayerParty[gTasks[taskId].tPartyId]; postEvoSpecies = gTasks[taskId].tPostEvoSpecies; canStopEvo = gTasks[taskId].tCanStop; partyId = gTasks[taskId].tPartyId; DestroyTask(taskId); EvolutionScene(mon, postEvoSpecies, canStopEvo, partyId); } break; } } void BeginEvolutionScene(struct Pokemon* mon, u16 postEvoSpecies, bool8 canStopEvo, u8 partyId) { u8 taskId = CreateTask(Task_BeginEvolutionScene, 0); gTasks[taskId].tState = 0; gTasks[taskId].tPostEvoSpecies = postEvoSpecies; gTasks[taskId].tCanStop = canStopEvo; gTasks[taskId].tPartyId = partyId; SetMainCallback2(CB2_BeginEvolutionScene); } void EvolutionScene(struct Pokemon* mon, u16 postEvoSpecies, bool8 canStopEvo, u8 partyId) { u8 name[20]; u16 currSpecies; u32 trainerId, personality; const struct CompressedSpritePalette* pokePal; u8 id; SetHBlankCallback(NULL); SetVBlankCallback(NULL); CpuFill32(0, (void *)(VRAM), VRAM_SIZE); SetGpuReg(REG_OFFSET_MOSAIC, 0); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN1H, 0); SetGpuReg(REG_OFFSET_WIN1V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); ResetPaletteFade(); gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; gBattle_BG3_X = 256; gBattle_BG3_Y = 0; gBattleTerrain = BATTLE_TERRAIN_PLAIN; InitBattleBgsVideo(); LoadBattleTextboxAndBackground(); ResetSpriteData(); ScanlineEffect_Stop(); ResetTasks(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; sEvoStructPtr = AllocZeroed(sizeof(struct EvoInfo)); AllocateMonSpritesGfx(); GetMonData(mon, MON_DATA_NICKNAME, name); StringCopy_Nickname(gStringVar1, name); StringCopy(gStringVar2, gSpeciesNames[postEvoSpecies]); // preEvo sprite currSpecies = GetMonData(mon, MON_DATA_SPECIES); trainerId = GetMonData(mon, MON_DATA_OT_ID); personality = GetMonData(mon, MON_DATA_PERSONALITY); DecompressPicFromTable(&gMonFrontPicTable[currSpecies], gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_LEFT], currSpecies); pokePal = GetMonSpritePalStructFromOtIdPersonality(currSpecies, trainerId, personality); LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(1), PLTT_SIZE_4BPP); SetMultiuseSpriteTemplateToPokemon(currSpecies, B_POSITION_OPPONENT_LEFT); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; sEvoStructPtr->preEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[id].callback = SpriteCallbackDummy_2; gSprites[id].oam.paletteNum = 1; gSprites[id].invisible = TRUE; // postEvo sprite DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies], gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT], postEvoSpecies); pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality); LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP); SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, B_POSITION_OPPONENT_RIGHT); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[id].callback = SpriteCallbackDummy_2; gSprites[id].oam.paletteNum = 2; gSprites[id].invisible = TRUE; LoadEvoSparkleSpriteAndPal(); sEvoStructPtr->evoTaskId = id = CreateTask(Task_EvolutionScene, 0); gTasks[id].tState = 0; gTasks[id].tPreEvoSpecies = currSpecies; gTasks[id].tPostEvoSpecies = postEvoSpecies; gTasks[id].tCanStop = canStopEvo; gTasks[id].tLearnsFirstMove = TRUE; gTasks[id].tEvoWasStopped = FALSE; gTasks[id].tPartyId = partyId; memcpy(&sEvoStructPtr->savedPalette, &gPlttBufferUnfaded[BG_PLTT_ID(2)], sizeof(sEvoStructPtr->savedPalette)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP); SetHBlankCallback(EvoDummyFunc); SetVBlankCallback(VBlankCB_EvolutionScene); m4aMPlayAllStop(); HelpSystem_Disable(); SetMainCallback2(CB2_EvolutionSceneUpdate); } static void CB2_EvolutionSceneLoadGraphics(void) { u8 id; const struct CompressedSpritePalette* pokePal; u16 postEvoSpecies; u32 trainerId, personality; struct Pokemon* mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskId].tPartyId]; postEvoSpecies = gTasks[sEvoStructPtr->evoTaskId].tPostEvoSpecies; trainerId = GetMonData(mon, MON_DATA_OT_ID); personality = GetMonData(mon, MON_DATA_PERSONALITY); SetHBlankCallback(NULL); SetVBlankCallback(NULL); CpuFill32(0, (void *)(VRAM), VRAM_SIZE); SetGpuReg(REG_OFFSET_MOSAIC, 0); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN1H, 0); SetGpuReg(REG_OFFSET_WIN1V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); ResetPaletteFade(); gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; gBattle_BG3_X = 256; gBattle_BG3_Y = 0; gBattleTerrain = BATTLE_TERRAIN_PLAIN; InitBattleBgsVideo(); LoadBattleTextboxAndBackground(); ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies], gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT], postEvoSpecies); pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality); LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP); SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, B_POSITION_OPPONENT_RIGHT); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[id].callback = SpriteCallbackDummy_2; gSprites[id].oam.paletteNum = 2; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP); SetHBlankCallback(EvoDummyFunc); SetVBlankCallback(VBlankCB_EvolutionScene); SetMainCallback2(CB2_EvolutionSceneUpdate); BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); } static void CB2_TradeEvolutionSceneLoadGraphics(void) { struct Pokemon* mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskId].tPartyId]; u16 postEvoSpecies = gTasks[sEvoStructPtr->evoTaskId].tPostEvoSpecies; switch (gMain.state) { case 0: SetGpuReg(REG_OFFSET_DISPCNT, 0); SetHBlankCallback(NULL); SetVBlankCallback(NULL); ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; gBattle_BG3_X = 256; gBattle_BG3_Y = 0; gMain.state++; break; case 1: ResetPaletteFade(); SetHBlankCallback(EvoDummyFunc); SetVBlankCallback(VBlankCB_TradeEvolutionScene); gMain.state++; break; case 2: LoadTradeAnimGfx(); gMain.state++; break; case 3: FillBgTilemapBufferRect(1, 0, 0, 0, 0x20, 0x20, 17); CopyBgTilemapBufferToVram(1); gMain.state++; break; case 4: { const struct CompressedSpritePalette* pokePal; u32 trainerId = GetMonData(mon, MON_DATA_OT_ID); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY); DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies], gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT], postEvoSpecies); pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality); LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP); gMain.state++; } break; case 5: { u8 id; SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, B_POSITION_OPPONENT_LEFT); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[id].callback = SpriteCallbackDummy_2; gSprites[id].oam.paletteNum = 2; gMain.state++; LinkTradeDrawWindow(); } break; case 6: if (gWirelessCommType) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK); gMain.state++; break; case 7: BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); InitTradeSequenceBgGpuRegs(); ShowBg(0); ShowBg(1); SetMainCallback2(CB2_TradeEvolutionSceneUpdate); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP); break; } } void TradeEvolutionScene(struct Pokemon* mon, u16 postEvoSpecies, u8 preEvoSpriteId, u8 partyId) { u8 name[20]; u16 currSpecies; u32 trainerId, personality; const struct CompressedSpritePalette* pokePal; u8 id; GetMonData(mon, MON_DATA_NICKNAME, name); StringCopy_Nickname(gStringVar1, name); StringCopy(gStringVar2, gSpeciesNames[postEvoSpecies]); gAffineAnimsDisabled = TRUE; // preEvo sprite currSpecies = GetMonData(mon, MON_DATA_SPECIES); personality = GetMonData(mon, MON_DATA_PERSONALITY); trainerId = GetMonData(mon, MON_DATA_OT_ID); sEvoStructPtr = AllocZeroed(sizeof(struct EvoInfo)); sEvoStructPtr->preEvoSpriteId = preEvoSpriteId; DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies], gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_LEFT], postEvoSpecies); pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality); LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP); SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, B_POSITION_OPPONENT_LEFT); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[id].callback = SpriteCallbackDummy_2; gSprites[id].oam.paletteNum = 2; gSprites[id].invisible = TRUE; LoadEvoSparkleSpriteAndPal(); sEvoStructPtr->evoTaskId = id = CreateTask(Task_TradeEvolutionScene, 0); gTasks[id].tState = 0; gTasks[id].tPreEvoSpecies = currSpecies; gTasks[id].tPostEvoSpecies = postEvoSpecies; gTasks[id].tLearnsFirstMove = TRUE; gTasks[id].tEvoWasStopped = FALSE; gTasks[id].tPartyId = partyId; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; gBattle_BG3_X = 256; gBattle_BG3_Y = 0; gTextFlags.useAlternateDownArrow = TRUE; SetVBlankCallback(VBlankCB_TradeEvolutionScene); SetMainCallback2(CB2_TradeEvolutionSceneUpdate); } static void CB2_EvolutionSceneUpdate(void) { AnimateSprites(); BuildOamBuffer(); RunTextPrinters(); UpdatePaletteFade(); RunTasks(); } static void CB2_TradeEvolutionSceneUpdate(void) { AnimateSprites(); BuildOamBuffer(); RunTextPrinters(); UpdatePaletteFade(); RunTasks(); } static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon) { u32 data = 0; if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE) { s32 i; struct Pokemon* shedinja = &gPlayerParty[gPlayerPartyCount]; CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &gEvolutionTable[preEvoSpecies][1].targetSpecies); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_ENCRYPT_SEPARATOR, &data); for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; i++) SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_UNUSED_RIBBONS; i++) SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, &data); data = MAIL_NONE; SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, &data); CalculateMonStats(&gPlayerParty[gPlayerPartyCount], FALSE); CalculatePlayerPartyCount(); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), FLAG_SET_SEEN); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), FLAG_SET_CAUGHT); if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA && GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK) SetMonData(shedinja, MON_DATA_NICKNAME, sText_ShedinjaJapaneseName); } } // States for the main switch in Task_EvolutionScene enum { EVOSTATE_FADE_IN, EVOSTATE_INTRO_MSG, EVOSTATE_INTRO_MON_ANIM, EVOSTATE_INTRO_SOUND, EVOSTATE_START_MUSIC, EVOSTATE_START_BG_AND_SPARKLE_SPIRAL, EVOSTATE_SPARKLE_ARC, EVOSTATE_CYCLE_MON_SPRITE, EVOSTATE_WAIT_CYCLE_MON_SPRITE, EVOSTATE_SPARKLE_CIRCLE, EVOSTATE_SPARKLE_SPRAY, EVOSTATE_EVO_SOUND, EVOSTATE_RESTORE_SCREEN, EVOSTATE_EVO_MON_ANIM, EVOSTATE_SET_MON_EVOLVED, EVOSTATE_TRY_LEARN_MOVE, EVOSTATE_END, EVOSTATE_CANCEL, EVOSTATE_CANCEL_MON_ANIM, EVOSTATE_CANCEL_MSG, EVOSTATE_LEARNED_MOVE, EVOSTATE_TRY_LEARN_ANOTHER_MOVE, EVOSTATE_REPLACE_MOVE, }; // States for the switch in EVOSTATE_REPLACE_MOVE enum { MVSTATE_INTRO_MSG_1, MVSTATE_INTRO_MSG_2, MVSTATE_INTRO_MSG_3, MVSTATE_PRINT_YES_NO, MVSTATE_HANDLE_YES_NO, MVSTATE_SHOW_MOVE_SELECT, MVSTATE_HANDLE_MOVE_SELECT, MVSTATE_FORGET_MSG_1, MVSTATE_FORGET_MSG_2, MVSTATE_LEARNED_MOVE, MVSTATE_ASK_CANCEL, MVSTATE_CANCEL, MVSTATE_RETRY_AFTER_HM, }; // Task data from CycleEvolutionMonSprite #define tEvoStopped data[8] static void Task_EvolutionScene(u8 taskId) { u32 var; struct Pokemon* mon = &gPlayerParty[gTasks[taskId].tPartyId]; // Automatically cancel if the Pokemon would evolve into a species you have not // yet unlocked, such as Crobat. if (!IsNationalPokedexEnabled() && gTasks[taskId].tState == EVOSTATE_WAIT_CYCLE_MON_SPRITE && gTasks[taskId].tPostEvoSpecies > SPECIES_DEOXYS) { gTasks[taskId].tState = EVOSTATE_CANCEL; gTasks[taskId].tEvoWasStopped = TRUE; gTasks[sEvoGraphicsTaskId].tEvoStopped = TRUE; StopBgAnimation(); return; } // check if B Button was held, so the evolution gets stopped if (gMain.heldKeys == B_BUTTON && gTasks[taskId].tState == EVOSTATE_WAIT_CYCLE_MON_SPRITE && gTasks[sEvoGraphicsTaskId].isActive && gTasks[taskId].tBits & TASK_BIT_CAN_STOP) { gTasks[taskId].tState = EVOSTATE_CANCEL; gTasks[sEvoGraphicsTaskId].tEvoStopped = TRUE; StopBgAnimation(); return; } switch (gTasks[taskId].tState) { case EVOSTATE_FADE_IN: BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gSprites[sEvoStructPtr->preEvoSpriteId].invisible = FALSE; gTasks[taskId].tState++; ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); break; case EVOSTATE_INTRO_MSG: if (!gPaletteFade.active) { StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving); BattlePutTextOnWindow(gStringVar4, B_WIN_MSG); gTasks[taskId].tState++; } break; case EVOSTATE_INTRO_MON_ANIM: if (!IsTextPrinterActive(0)) { PlayCry_Normal(gTasks[taskId].tPreEvoSpecies, 0); gTasks[taskId].tState++; } break; case EVOSTATE_INTRO_SOUND: if (IsCryFinished()) // wait for animation, play tu du SE { PlaySE(MUS_EVOLUTION_INTRO); gTasks[taskId].tState++; } break; case EVOSTATE_START_MUSIC: if (!IsSEPlaying()) { // Start music, fade background to black PlayNewMapMusic(MUS_EVOLUTION); gTasks[taskId].tState++; BeginNormalPaletteFade(0x1C, 4, 0, 0x10, RGB_BLACK); } break; case EVOSTATE_START_BG_AND_SPARKLE_SPIRAL: if (!gPaletteFade.active) { StartBgAnimation(FALSE); sEvoGraphicsTaskId = EvolutionSparkles_SpiralUpward(17); gTasks[taskId].tState++; } break; case EVOSTATE_SPARKLE_ARC: if (!gTasks[sEvoGraphicsTaskId].isActive) { gTasks[taskId].tState++; sEvoStructPtr->delayTimer = 1; sEvoGraphicsTaskId = EvolutionSparkles_ArcDown(); } break; case EVOSTATE_CYCLE_MON_SPRITE: if (!gTasks[sEvoGraphicsTaskId].isActive) { sEvoGraphicsTaskId = CycleEvolutionMonSprite(sEvoStructPtr->preEvoSpriteId, sEvoStructPtr->postEvoSpriteId); gTasks[taskId].tState++; } break; case EVOSTATE_WAIT_CYCLE_MON_SPRITE: if (--sEvoStructPtr->delayTimer == 0) { sEvoStructPtr->delayTimer = 3; if (!gTasks[sEvoGraphicsTaskId].isActive) gTasks[taskId].tState++; } break; case EVOSTATE_SPARKLE_CIRCLE: sEvoGraphicsTaskId = EvolutionSparkles_CircleInward(); gTasks[taskId].tState++; break; case EVOSTATE_SPARKLE_SPRAY: if (!gTasks[sEvoGraphicsTaskId].isActive) { sEvoGraphicsTaskId = EvolutionSparkles_SprayAndFlash(gTasks[taskId].tPostEvoSpecies); gTasks[taskId].tState++; } break; case EVOSTATE_EVO_SOUND: if (!gTasks[sEvoGraphicsTaskId].isActive) { PlaySE(SE_EXP); gTasks[taskId].tState++; } break; case EVOSTATE_RESTORE_SCREEN: if (IsSEPlaying()) { m4aMPlayAllStop(); memcpy(&gPlttBufferUnfaded[BG_PLTT_ID(2)], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette)); RestoreBgAfterAnim(); BeginNormalPaletteFade(0x1C, 0, 0x10, 0, RGB_BLACK); gTasks[taskId].tState++; } break; case EVOSTATE_EVO_MON_ANIM: if (!gPaletteFade.active) { PlayCry_Normal(gTasks[taskId].tPostEvoSpecies, 0); gTasks[taskId].tState++; } break; case EVOSTATE_SET_MON_EVOLVED: if (IsCryFinished()) { StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved); BattlePutTextOnWindow(gStringVar4, B_WIN_MSG); PlayBGM(MUS_EVOLVED); gTasks[taskId].tState++; SetMonData(mon, MON_DATA_SPECIES, (void *)(&gTasks[taskId].tPostEvoSpecies)); CalculateMonStats(mon, FALSE); EvolutionRenameMon(mon, gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_SEEN); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_CAUGHT); IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); } break; case EVOSTATE_TRY_LEARN_MOVE: if (!IsTextPrinterActive(0)) { HelpSystem_Enable(); var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove); if (var != MOVE_NONE && !gTasks[taskId].tEvoWasStopped) { u8 text[20]; StopMapMusic(); Overworld_PlaySpecialMapMusic(); gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE; gTasks[taskId].tLearnsFirstMove = FALSE; gTasks[taskId].tLearnMoveState = MVSTATE_INTRO_MSG_1; GetMonData(mon, MON_DATA_NICKNAME, text); StringCopy_Nickname(gBattleTextBuff1, text); if (var == MON_HAS_MAX_MOVES) gTasks[taskId].tState = EVOSTATE_REPLACE_MOVE; else if (var == MON_ALREADY_KNOWS_MOVE) break; else gTasks[taskId].tState = EVOSTATE_LEARNED_MOVE; } else // no move to learn, or evolution was canceled { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tState++; } } break; case EVOSTATE_END: if (!gPaletteFade.active) { if (!(gTasks[taskId].tBits & TASK_BIT_LEARN_MOVE)) { StopMapMusic(); Overworld_PlaySpecialMapMusic(); } if (!gTasks[taskId].tEvoWasStopped) CreateShedinja(gTasks[taskId].tPreEvoSpecies, mon); DestroyTask(taskId); FreeMonSpritesGfx(); FREE_AND_SET_NULL(sEvoStructPtr); FreeAllWindowBuffers(); SetMainCallback2(gCB2_AfterEvolution); } break; case EVOSTATE_CANCEL: if (!gTasks[sEvoGraphicsTaskId].isActive) { m4aMPlayAllStop(); BeginNormalPaletteFade(0x6001C, 0, 0x10, 0, RGB_WHITE); gTasks[taskId].tState++; } break; case EVOSTATE_CANCEL_MON_ANIM: if (!gPaletteFade.active) { PlayCry_Normal(gTasks[taskId].tPreEvoSpecies, 0); gTasks[taskId].tState++; } break; case EVOSTATE_CANCEL_MSG: if (IsCryFinished()) { if (gTasks[taskId].tEvoWasStopped) StringExpandPlaceholders(gStringVar4, gText_EllipsisQuestionMark); else StringExpandPlaceholders(gStringVar4, gText_PkmnStoppedEvolving); BattlePutTextOnWindow(gStringVar4, B_WIN_MSG); gTasks[taskId].tEvoWasStopped = TRUE; gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE; } break; case EVOSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BufferMoveToLearnIntoBattleTextBuff2(); PlayFanfare(MUS_LEVEL_UP); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskId].tState++; } break; case EVOSTATE_TRY_LEARN_ANOTHER_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying() && --gTasks[taskId].tLearnsFirstMove == 0) gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE; break; case EVOSTATE_REPLACE_MOVE: switch (gTasks[taskId].tLearnMoveState) { case MVSTATE_INTRO_MSG_1: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "{mon} is trying to learn {move}" BufferMoveToLearnIntoBattleTextBuff2(); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState++; } break; case MVSTATE_INTRO_MSG_2: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "But, {mon} can't learn more than four moves" BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState++; } break; case MVSTATE_INTRO_MSG_3: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "Delete a move to make room for {move}?" BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveYesState = MVSTATE_SHOW_MOVE_SELECT; gTasks[taskId].tLearnMoveNoState = MVSTATE_ASK_CANCEL; gTasks[taskId].tLearnMoveState++; } case MVSTATE_PRINT_YES_NO: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { HandleBattleWindow(23, 8, 29, 13, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); gTasks[taskId].tLearnMoveState++; sEvoCursorPos = 0; BattleCreateYesNoCursorAt(); } break; case MVSTATE_HANDLE_YES_NO: // This Yes/No is used for both the initial "delete move?" prompt // and for the "stop learning move?" prompt // What Yes/No do next is determined by tLearnMoveYesState / tLearnMoveNoState if (JOY_NEW(DPAD_UP) && sEvoCursorPos != 0) { // Moved onto YES PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); sEvoCursorPos = 0; BattleCreateYesNoCursorAt(); } if (JOY_NEW(DPAD_DOWN) && sEvoCursorPos == 0) { // Moved onto NO PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(); sEvoCursorPos = 1; BattleCreateYesNoCursorAt(); } if (JOY_NEW(A_BUTTON)) { HandleBattleWindow(0x17, 8, 0x1D, 0xD, WINDOW_CLEAR); PlaySE(SE_SELECT); if (sEvoCursorPos != 0) { // NO gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState; } else { // YES gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveYesState; } } if (JOY_NEW(B_BUTTON)) { // Equivalent to selecting NO HandleBattleWindow(0x17, 8, 0x1D, 0xD, WINDOW_CLEAR); PlaySE(SE_SELECT); gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState; } break; case MVSTATE_SHOW_MOVE_SELECT: if (!gPaletteFade.active) { FreeAllWindowBuffers(); ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskId].tPartyId, gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics, gMoveToLearn); gTasks[taskId].tLearnMoveState++; } break; case MVSTATE_HANDLE_MOVE_SELECT: if (!gPaletteFade.active && gMain.callback2 == CB2_EvolutionSceneUpdate) { var = GetMoveSlotToReplace(); if (var == MAX_MON_MOVES) { // Didn't select move slot gTasks[taskId].tLearnMoveState = MVSTATE_ASK_CANCEL; } else { // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); if (IsHMMove2(move)) { // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState = MVSTATE_RETRY_AFTER_HM; } else { // Forget move PREPARE_MOVE_BUFFER(gBattleTextBuff2, move) RemoveMonPPBonus(mon, var); SetMonMoveSlot(mon, gMoveToLearn, var); gTasks[taskId].tLearnMoveState++; } } } break; case MVSTATE_FORGET_MSG_1: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState++; break; case MVSTATE_FORGET_MSG_2: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveState++; } break; case MVSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tState = EVOSTATE_LEARNED_MOVE; } break; case MVSTATE_ASK_CANCEL: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveYesState = MVSTATE_CANCEL; gTasks[taskId].tLearnMoveNoState = MVSTATE_INTRO_MSG_1; gTasks[taskId].tLearnMoveState = MVSTATE_PRINT_YES_NO; break; case MVSTATE_CANCEL: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_TABLE_START]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE; break; case MVSTATE_RETRY_AFTER_HM: if (!IsTextPrinterActive(0) && !IsSEPlaying()) gTasks[taskId].tLearnMoveState = MVSTATE_SHOW_MOVE_SELECT; break; } break; } } // States for the main switch in Task_TradeEvolutionScene enum { T_EVOSTATE_INTRO_MSG, T_EVOSTATE_INTRO_CRY, T_EVOSTATE_INTRO_SOUND, T_EVOSTATE_START_MUSIC, T_EVOSTATE_START_BG_AND_SPARKLE_SPIRAL, T_EVOSTATE_SPARKLE_ARC, T_EVOSTATE_CYCLE_MON_SPRITE, T_EVOSTATE_WAIT_CYCLE_MON_SPRITE, T_EVOSTATE_SPARKLE_CIRCLE, T_EVOSTATE_SPARKLE_SPRAY, T_EVOSTATE_EVO_SOUND, T_EVOSTATE_EVO_MON_ANIM, T_EVOSTATE_SET_MON_EVOLVED, T_EVOSTATE_TRY_LEARN_MOVE, T_EVOSTATE_END, T_EVOSTATE_CANCEL, T_EVOSTATE_CANCEL_MON_ANIM, T_EVOSTATE_CANCEL_MSG, T_EVOSTATE_LEARNED_MOVE, T_EVOSTATE_TRY_LEARN_ANOTHER_MOVE, T_EVOSTATE_REPLACE_MOVE, }; // States for the switch in T_EVOSTATE_REPLACE_MOVE enum { T_MVSTATE_INTRO_MSG_1, T_MVSTATE_INTRO_MSG_2, T_MVSTATE_INTRO_MSG_3, T_MVSTATE_PRINT_YES_NO, T_MVSTATE_HANDLE_YES_NO, T_MVSTATE_SHOW_MOVE_SELECT, T_MVSTATE_HANDLE_MOVE_SELECT, T_MVSTATE_FORGET_MSG, T_MVSTATE_LEARNED_MOVE, T_MVSTATE_ASK_CANCEL, T_MVSTATE_CANCEL, T_MVSTATE_RETRY_AFTER_HM, }; static void Task_TradeEvolutionScene(u8 taskId) { u32 var = 0; struct Pokemon* mon = &gPlayerParty[gTasks[taskId].tPartyId]; // Automatically cancel if the Pokemon would evolve into a species you have not // yet unlocked, such as Crobat. if (!IsNationalPokedexEnabled() && gTasks[taskId].tState == T_EVOSTATE_WAIT_CYCLE_MON_SPRITE && gTasks[taskId].tPostEvoSpecies > SPECIES_DEOXYS) { gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE; gTasks[taskId].tEvoWasStopped = TRUE; if (gTasks[sEvoGraphicsTaskId].isActive) { gTasks[sEvoGraphicsTaskId].tEvoStopped = TRUE; StopBgAnimation(); } } switch (gTasks[taskId].tState) { case T_EVOSTATE_INTRO_MSG: StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving); DrawTextOnTradeWindow(0, gStringVar4, 1); gTasks[taskId].tState++; break; case T_EVOSTATE_INTRO_CRY: if (!IsTextPrinterActive(0)) { PlayCry_Normal(gTasks[taskId].tPreEvoSpecies, 0); gTasks[taskId].tState++; } break; case T_EVOSTATE_INTRO_SOUND: if (IsCryFinished()) { m4aSongNumStop(MUS_EVOLUTION); PlaySE(MUS_EVOLUTION_INTRO); gTasks[taskId].tState++; } break; case T_EVOSTATE_START_MUSIC: if (!IsSEPlaying()) { PlayBGM(MUS_EVOLUTION); gTasks[taskId].tState++; BeginNormalPaletteFade(0x1C, 4, 0, 0x10, RGB_BLACK); } break; case T_EVOSTATE_START_BG_AND_SPARKLE_SPIRAL: if (!gPaletteFade.active) { StartBgAnimation(TRUE); var = gSprites[sEvoStructPtr->preEvoSpriteId].oam.paletteNum + 16; sEvoGraphicsTaskId = EvolutionSparkles_SpiralUpward(var); gTasks[taskId].tState++; SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6)); } break; case T_EVOSTATE_SPARKLE_ARC: if (!gTasks[sEvoGraphicsTaskId].isActive) { gTasks[taskId].tState++; sEvoStructPtr->delayTimer = 1; sEvoGraphicsTaskId = EvolutionSparkles_ArcDown(); } break; case T_EVOSTATE_CYCLE_MON_SPRITE: if (!gTasks[sEvoGraphicsTaskId].isActive) { sEvoGraphicsTaskId = CycleEvolutionMonSprite(sEvoStructPtr->preEvoSpriteId, sEvoStructPtr->postEvoSpriteId); gTasks[taskId].tState++; } break; case T_EVOSTATE_WAIT_CYCLE_MON_SPRITE: if (--sEvoStructPtr->delayTimer == 0) { sEvoStructPtr->delayTimer = 3; if (!gTasks[sEvoGraphicsTaskId].isActive) gTasks[taskId].tState++; } break; case T_EVOSTATE_SPARKLE_CIRCLE: sEvoGraphicsTaskId = EvolutionSparkles_CircleInward(); gTasks[taskId].tState++; break; case T_EVOSTATE_SPARKLE_SPRAY: if (!gTasks[sEvoGraphicsTaskId].isActive) { sEvoGraphicsTaskId = EvolutionSparkles_SprayAndFlash_Trade(gTasks[taskId].tPostEvoSpecies); gTasks[taskId].tState++; } break; case T_EVOSTATE_EVO_SOUND: if (!gTasks[sEvoGraphicsTaskId].isActive) { PlaySE(SE_EXP); gTasks[taskId].tState++; } break; case T_EVOSTATE_EVO_MON_ANIM: if (!IsSEPlaying()) { // Free(sBgAnimPal); PlayCry_Normal(gTasks[taskId].tPostEvoSpecies, 0); memcpy(&gPlttBufferUnfaded[BG_PLTT_ID(2)], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette)); gTasks[taskId].tState++; } break; case T_EVOSTATE_SET_MON_EVOLVED: if (IsCryFinished()) { StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved); DrawTextOnTradeWindow(0, gStringVar4, 1); PlayFanfare(MUS_EVOLVED); gTasks[taskId].tState++; SetMonData(mon, MON_DATA_SPECIES, (&gTasks[taskId].tPostEvoSpecies)); CalculateMonStats(mon, FALSE); EvolutionRenameMon(mon, gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_SEEN); GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_CAUGHT); IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); } break; case T_EVOSTATE_TRY_LEARN_MOVE: if (!IsTextPrinterActive(0) && IsFanfareTaskInactive() == TRUE) { var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove); if (var != MOVE_NONE && !gTasks[taskId].tEvoWasStopped) { u8 text[20]; gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE; gTasks[taskId].tLearnsFirstMove = FALSE; gTasks[taskId].tLearnMoveState = 0; GetMonData(mon, MON_DATA_NICKNAME, text); StringCopy_Nickname(gBattleTextBuff1, text); if (var == MON_HAS_MAX_MOVES) gTasks[taskId].tState = T_EVOSTATE_REPLACE_MOVE; else if (var == MON_ALREADY_KNOWS_MOVE) break; else gTasks[taskId].tState = T_EVOSTATE_LEARNED_MOVE; } else { PlayBGM(MUS_EVOLUTION); DrawTextOnTradeWindow(0, gText_CommunicationStandby5, 1); gTasks[taskId].tState++; } } break; case T_EVOSTATE_END: if (!IsTextPrinterActive(0)) { DestroyTask(taskId); FREE_AND_SET_NULL(sEvoStructPtr); sEvoStructPtr = NULL; gTextFlags.useAlternateDownArrow = FALSE; SetMainCallback2(gCB2_AfterEvolution); } break; case T_EVOSTATE_CANCEL: if (!gTasks[sEvoGraphicsTaskId].isActive) { m4aMPlayAllStop(); BeginNormalPaletteFade((1 << (gSprites[sEvoStructPtr->preEvoSpriteId].oam.paletteNum + 16)) | (0x4001C), 0, 0x10, 0, RGB_WHITE); gTasks[taskId].tState++; } break; case T_EVOSTATE_CANCEL_MON_ANIM: if (!gPaletteFade.active) { PlayCry_Normal(gTasks[taskId].tPreEvoSpecies, 0); gTasks[taskId].tState++; } break; case T_EVOSTATE_CANCEL_MSG: if (IsCryFinished()) { StringExpandPlaceholders(gStringVar4, gText_EllipsisQuestionMark); DrawTextOnTradeWindow(0, gStringVar4, 1); gTasks[taskId].tEvoWasStopped = TRUE; gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE; } break; case T_EVOSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BufferMoveToLearnIntoBattleTextBuff2(); PlayFanfare(MUS_LEVEL_UP); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskId].tState++; } break; case T_EVOSTATE_TRY_LEARN_ANOTHER_MOVE: if (!IsTextPrinterActive(0) && IsFanfareTaskInactive() == TRUE && --gTasks[taskId].tLearnsFirstMove == 0) gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE; break; case T_EVOSTATE_REPLACE_MOVE: switch (gTasks[taskId].tLearnMoveState) { case T_MVSTATE_INTRO_MSG_1: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "{mon} is trying to learn {move}" BufferMoveToLearnIntoBattleTextBuff2(); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState++; } break; case T_MVSTATE_INTRO_MSG_2: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "But, {mon} can't learn more than four moves" BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState++; } break; case T_MVSTATE_INTRO_MSG_3: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { // "Delete a move to make room for {move}?" BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveYesState = T_MVSTATE_SHOW_MOVE_SELECT; gTasks[taskId].tLearnMoveNoState = T_MVSTATE_ASK_CANCEL; gTasks[taskId].tLearnMoveState++; } case T_MVSTATE_PRINT_YES_NO: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { LoadUserWindowGfx2(0, 0xA8, BG_PLTT_ID(14)); CreateYesNoMenu(&gTradeEvolutionSceneYesNoWindowTemplate, FONT_NORMAL_COPY_2, 0, 2, 0xA8, 14, 0); sEvoCursorPos = 0; gTasks[taskId].tLearnMoveState++; sEvoCursorPos = 0; } break; case T_MVSTATE_HANDLE_YES_NO: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // YES sEvoCursorPos = 0; BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveYesState; if (gTasks[taskId].tLearnMoveState == T_MVSTATE_SHOW_MOVE_SELECT) BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); break; case 1: // NO case MENU_B_PRESSED: sEvoCursorPos = 1; BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState; break; } break; case T_MVSTATE_SHOW_MOVE_SELECT: if (!gPaletteFade.active) { if (gWirelessCommType) DestroyWirelessStatusIndicatorSprite(); Free(GetBgTilemapBuffer(3)); Free(GetBgTilemapBuffer(1)); Free(GetBgTilemapBuffer(0)); FreeAllWindowBuffers(); ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskId].tPartyId, gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics, gMoveToLearn); gTasks[taskId].tLearnMoveState++; } break; case T_MVSTATE_HANDLE_MOVE_SELECT: if (!gPaletteFade.active && gMain.callback2 == CB2_TradeEvolutionSceneUpdate) { var = GetMoveSlotToReplace(); if (var == MAX_MON_MOVES) { // Didn't select move slot gTasks[taskId].tLearnMoveState = T_MVSTATE_ASK_CANCEL; } else { // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); if (IsHMMove2(move)) { // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState = T_MVSTATE_RETRY_AFTER_HM; } else { // Forget move PREPARE_MOVE_BUFFER(gBattleTextBuff2, move) RemoveMonPPBonus(mon, var); SetMonMoveSlot(mon, gMoveToLearn, var); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState++; } } } break; case T_MVSTATE_FORGET_MSG: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveState++; } break; case T_MVSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tState = T_EVOSTATE_LEARNED_MOVE; } break; case T_MVSTATE_ASK_CANCEL: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveYesState = T_MVSTATE_CANCEL; gTasks[taskId].tLearnMoveNoState = T_MVSTATE_INTRO_MSG_1; gTasks[taskId].tLearnMoveState = T_MVSTATE_PRINT_YES_NO; break; case T_MVSTATE_CANCEL: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_TABLE_START]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE; break; case T_MVSTATE_RETRY_AFTER_HM: if (!IsTextPrinterActive(0) && !IsSEPlaying()) gTasks[taskId].tLearnMoveState = T_MVSTATE_SHOW_MOVE_SELECT; break; } break; } } #undef tState #undef tPreEvoSpecies #undef tPostEvoSpecies #undef tCanStop #undef tBits #undef tLearnsFirstMove #undef tLearnMoveState #undef tLearnMoveYesState #undef tLearnMoveNoState #undef tEvoWasStopped #undef tPartyId static void EvoDummyFunc(void) { } static void VBlankCB_EvolutionScene(void) { SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X); SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y); LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); ScanlineEffect_InitHBlankDmaTransfer(); } static void VBlankCB_TradeEvolutionScene(void) { SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X); SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y); LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); ScanlineEffect_InitHBlankDmaTransfer(); } #define tCycleTimer data[0] #define tPalStage data[1] #define tControlStage data[2] #define tNumCycles data[3] #define tStartTimer data[5] #define tPaused data[6] // See comments above sBgAnim_PaletteControl #define START_PAL sBgAnim_PaletteControl[tControlStage][0] #define END_PAL sBgAnim_PaletteControl[tControlStage][1] #define CYCLES sBgAnim_PaletteControl[tControlStage][2] #define DELAY sBgAnim_PaletteControl[tControlStage][3] // Cycles the background through a set range of palettes in a series // of stages, each stage having a different palette range and timing static void Task_UpdateBgPalette(u8 taskId) { s16 *data = gTasks[taskId].data; if (tPaused) return; if (tStartTimer++ < 20) return; if (tCycleTimer++ > DELAY) { if (END_PAL == tPalStage) { // Reached final palette in current stage, completed a 'cycle' // If this is the final cycle for this stage, move to the next stage tNumCycles++; if (tNumCycles == CYCLES) { tNumCycles = 0; tControlStage++; } tPalStage = START_PAL; } else { // Haven't reached final palette in current stage, load the current palette LoadPalette(&sBgAnimPal[tPalStage * 16], BG_PLTT_ID(10), PLTT_SIZE_4BPP); tCycleTimer = 0; tPalStage++; } } if (tControlStage == (int)ARRAY_COUNT(sBgAnim_PaletteControl[0])) DestroyTask(taskId); } #undef tCycleTimer #undef tPalStage #undef tControlStage #undef tNumCycles #undef tStartTimer #undef START_PAL #undef END_PAL #undef CYCLES #undef DELAY #define tIsLink data[2] static void CreateBgAnimTask(bool8 isLink) { u8 taskId = CreateTask(Task_AnimateBg, 7); if (!isLink) gTasks[taskId].data[2] = FALSE; else gTasks[taskId].data[2] = TRUE; } static void Task_AnimateBg(u8 taskId) { u16 *outer_X, *outer_Y; u16 *inner_X = &gBattle_BG1_X; u16 *inner_Y = &gBattle_BG1_Y; if (!gTasks[taskId].data[2]) { outer_X = &gBattle_BG2_X; outer_Y = &gBattle_BG2_Y; } else { outer_X = &gBattle_BG3_X; outer_Y = &gBattle_BG3_Y; } gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 5) & 0xFF; gTasks[taskId].data[1] = (gTasks[taskId].data[0] + 0x80) & 0xFF; *inner_X = Cos(gTasks[taskId].data[0], 4) + 8; *inner_Y = Sin(gTasks[taskId].data[0], 4) + 16; *outer_X = Cos(gTasks[taskId].data[1], 4) + 8; *outer_Y = Sin(gTasks[taskId].data[1], 4) + 16; if (!FuncIsActiveTask(Task_UpdateBgPalette)) { DestroyTask(taskId); *inner_X = 0; *inner_Y = 0; *outer_X = 256; *outer_Y = 0; } } #undef tIsLink static void InitMovingBgPalette(u16 *palette) { s32 i, j; for (i = 0; i < (int)ARRAY_COUNT(sBgAnim_PalIndexes); i++) { for (j = 0; j < 16; j++) { palette[i * 16 + j] = sBgAnim_Pal[sBgAnim_PalIndexes[i][j]]; } } } static void StartBgAnimation(bool8 isLink) { u8 innerBgId, outerBgId; sBgAnimPal = AllocZeroed(0x640); InitMovingBgPalette(sBgAnimPal); if (!isLink) innerBgId = 1, outerBgId = 2; else innerBgId = 1, outerBgId = 3; LoadPalette(sBlackPalette, BG_PLTT_ID(10), sizeof(sBlackPalette)); DecompressAndLoadBgGfxUsingHeap(1, sMovingBackgroundTiles, FALSE, 0, 0); CopyToBgTilemapBuffer(1, sMovingBackgroundMap1, 0, 0); CopyToBgTilemapBuffer(outerBgId, sMovingBackgroundMap2, 0, 0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(outerBgId); if (!isLink) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); SetBgAttribute(innerBgId, BG_ATTR_PRIORITY, 2); SetBgAttribute(outerBgId, BG_ATTR_PRIORITY, 2); ShowBg(1); ShowBg(2); } else { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); } CreateTask(Task_UpdateBgPalette, 5); CreateBgAnimTask(isLink); } void IsMovingBackgroundTaskRunning(void) // unused { u8 taskId = FindTaskIdByFunc(Task_UpdateBgPalette); if (taskId != TASK_NONE) gTasks[taskId].tPaused = TRUE; FillPalette(RGB_BLACK, BG_PLTT_ID(10), PLTT_SIZE_4BPP); } #undef tPaused static void StopBgAnimation(void) { u8 taskId; if ((taskId = FindTaskIdByFunc(Task_UpdateBgPalette)) != TASK_NONE) DestroyTask(taskId); if ((taskId = FindTaskIdByFunc(Task_AnimateBg)) != TASK_NONE) DestroyTask(taskId); FillPalette(RGB_BLACK, BG_PLTT_ID(10), PLTT_SIZE_4BPP); RestoreBgAfterAnim(); } static void RestoreBgAfterAnim(void) { SetGpuReg(REG_OFFSET_BLDCNT, 0); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; SetBgAttribute(1, BG_ATTR_PRIORITY, GetBattleBgTemplateData(1, 5)); SetBgAttribute(2, BG_ATTR_PRIORITY, GetBattleBgTemplateData(2, 5)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); Free(sBgAnimPal); } ================================================ FILE: src/fame_checker.c ================================================ #include "global.h" #include "gflib.h" #include "constants/songs.h" #include "event_data.h" #include "event_scripts.h" #include "graphics.h" #include "battle.h" #include "battle_setup.h" #include "menu.h" #include "trainer_pokemon_sprites.h" #include "scanline_effect.h" #include "new_menu_helpers.h" #include "item_menu.h" #include "list_menu.h" #include "task.h" #include "event_object_movement.h" #include "menu_indicators.h" #include "text_window.h" #include "fame_checker.h" #include "strings.h" #include "constants/event_objects.h" #define SPRITETAG_SELECTOR_CURSOR 1000 #define SPRITETAG_QUESTION_MARK 1001 #define SPRITETAG_SPINNING_POKEBALL 1002 #define SPRITETAG_SCROLL_INDICATORS 1004 #define SPRITETAG_DAISY 1006 // TODO: Investigate, seems to be used for other NPCs (e.g. Fan Club Chairman) #define SPRITETAG_FUJI 1007 #define SPRITETAG_OAK 1008 #define SPRITETAG_BILL 1009 #define FC_NONTRAINER_START 0xFE00 struct FameCheckerData { MainCallback savedCallback; u16 listMenuTopIdx; u8 scrollIndicatorPairTaskId; u8 personHasUnlockedPanels:1; u8 inPickMode:1; u8 numUnlockedPersons:6; u8 listMenuTaskId; u8 listMenuCurIdx; u8 listMenuTopIdx2; u8 listMenuDrawnSelIdx; u8 unlockedPersons[NUM_FAMECHECKER_PERSONS + 1]; u8 spriteIds[6]; u8 viewingFlavorText:1; u8 unk_23_1:1; // unused u8 pickModeOverCancel:1; }; static EWRAM_DATA u16 * sBg3TilemapBuffer = NULL; static EWRAM_DATA u16 * sBg1TilemapBuffer = NULL; static EWRAM_DATA u16 * sBg2TilemapBuffer = NULL; static EWRAM_DATA struct FameCheckerData * sFameCheckerData = NULL; static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL; static EWRAM_DATA s32 sLastMenuIdx = 0; struct ListMenuTemplate gFameChecker_ListMenuTemplate; u8 gIconDescriptionBoxIsOpen; static void MainCB2_LoadFameChecker(void); static void LoadUISpriteSheetsAndPalettes(void); static void Task_WaitFadeOnInit(u8 taskId); static void Task_TopMenuHandleInput(u8 taskId); static bool8 TryExitPickMode(u8 taskId); static void MessageBoxPrintEmptyText(void); static void Task_EnterPickMode(u8 taskId); static void Task_ExitPickMode(u8 taskId); static void Task_FlavorTextDisplayHandleInput(u8 taskId); static void FC_MoveSelectorCursor(u8 taskId, s8 dx, s8 dy); static void GetPickModeText(void); static void PrintSelectedNameInBrightGreen(u8 taskId); static void WipeMsgBoxAndTransfer(void); static void Setup_DrawMsgAndListBoxes(void); static void FC_PutWindowTilemapAndCopyWindowToVramMode3(u8 windowId); static bool8 SetMessageSelectorIconObjMode(u8 taskId, u8 objMode); static void Task_StartToCloseFameChecker(u8 taskId); static void Task_DestroyAssetsAndCloseFameChecker(u8 taskId); static void FC_DestroyWindow(u8 windowId); static void PrintUIHelp(u8 state); static bool8 CreateAllFlavorTextIcons(u8 who); static void FCSetup_ClearVideoRegisters(void); static void FCSetup_ResetTasksAndSpriteResources(void); static void FCSetup_TurnOnDisplay(void); static void FCSetup_ResetBGCoords(void); static bool8 HasUnlockedAllFlavorTextsForCurrentPerson(void); static void FreeSelectionCursorSpriteResources(void); static u8 CreateFlavorTextIconSelectorCursorSprite(s16 where); static void SpriteCB_DestroyFlavorTextIconSelectorCursor(struct Sprite *sprite); static void FreeQuestionMarkSpriteResources(void); static u8 PlaceQuestionMarkTile(u8 x, u8 y); static void FreeSpinningPokeballSpriteResources(void); static u8 CreateSpinningPokeballSprite(void); static void SpriteCB_DestroySpinningPokeball(struct Sprite *sprite); static void FreeNonTrainerPicTiles(void); static u8 CreatePersonPicSprite(u8 fcPersonIdx); static void DestroyPersonPicSprite(u8 taskId, u16 who); static void UpdateIconDescriptionBox(u8 whichText); static void UpdateIconDescriptionBoxOff(void); static void FC_CreateListMenu(void); static void SpriteCB_FCSpinningPokeball(struct Sprite *sprite); static void InitListMenuTemplate(void); static void FC_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list); static void Task_SwitchToPickMode(u8 taskId); static void PrintCancelDescription(void); static void FC_DoMoveCursor(s32 itemIndex, bool8 onInit); static u8 FC_PopulateListMenu(void); static void FC_PutWindowTilemapAndCopyWindowToVramMode3_2(u8 windowId); static void FC_CreateScrollIndicatorArrowPair(void); static void FreeListMenuSelectorArrowPairResources(void); static u16 FameCheckerGetCursorY(void); static void HandleFlavorTextModeSwitch(bool8 state); static void Task_FCOpenOrCloseInfoBox(u8 taskId); static void UpdateInfoBoxTilemap(u8 bg, s16 state); static void PlaceListMenuCursor(bool8 isActive); static const u16 sFameCheckerTilemap[] = INCBIN_U16("graphics/fame_checker/tilemap1.bin"); static const u8 sQuestionMarkSpriteGfx[] = INCBIN_U8("graphics/fame_checker/question_mark.4bpp"); static const u8 sSpinningPokeballSpriteGfx[] = INCBIN_U8("graphics/fame_checker/spinning_pokeball.4bpp"); static const u16 sSpinningPokeballSpritePalette[] = INCBIN_U16("graphics/fame_checker/spinning_pokeball.gbapal"); static const u8 sSelectorCursorSpriteGfx[] = INCBIN_U8("graphics/fame_checker/cursor.4bpp"); static const u16 sSelectorCursorSpritePalette[] = INCBIN_U16("graphics/fame_checker/cursor.gbapal"); static const u8 sFujiSpriteGfx[] = INCBIN_U8("graphics/fame_checker/mr_fuji.4bpp"); static const u16 sFujiSpritePalette[] = INCBIN_U16("graphics/fame_checker/mr_fuji.gbapal"); static const u8 sBillSpriteGfx[] = INCBIN_U8("graphics/fame_checker/bill.4bpp"); static const u16 sBillSpritePalette[] = INCBIN_U16("graphics/fame_checker/bill.gbapal"); static const u8 sDaisySpriteGfx[] = INCBIN_U8("graphics/fame_checker/daisy.4bpp"); static const u16 sDaisySpritePalette[] = INCBIN_U16("graphics/fame_checker/daisy.gbapal"); static const u8 sOakSpriteGfx[] = INCBIN_U8("graphics/fame_checker/prof_oak.4bpp"); static const u16 sOakSpritePalette[] = INCBIN_U16("graphics/fame_checker/prof_oak.gbapal"); static const u16 sUnkPalette[] = INCBIN_U16("graphics/fame_checker/unk.gbapal"); // unused? static const u16 sSilhouettePalette[] = INCBIN_U16("graphics/fame_checker/silhouette.gbapal"); static const u8 sTextColor_White[3] = {0, 1, 2}; static const u8 sTextColor_DkGrey[3] = {0, 2, 3}; static const u8 sTextColor_Green[3] = {0, 6, 7}; #define FAME_CHECKER_PROF_OAK (FC_NONTRAINER_START + 0) #define FAME_CHECKER_DAISY_OAK (FC_NONTRAINER_START + 1) #define FAME_CHECKER_BILL (FC_NONTRAINER_START + 2) #define FAME_CHECKER_MR_FUJI (FC_NONTRAINER_START + 3) static const u16 sTrainerIdxs[] = { [FAMECHECKER_OAK] = FAME_CHECKER_PROF_OAK, [FAMECHECKER_DAISY] = FAME_CHECKER_DAISY_OAK, [FAMECHECKER_BROCK] = TRAINER_LEADER_BROCK, [FAMECHECKER_MISTY] = TRAINER_LEADER_MISTY, [FAMECHECKER_LTSURGE] = TRAINER_LEADER_LT_SURGE, [FAMECHECKER_ERIKA] = TRAINER_LEADER_ERIKA, [FAMECHECKER_KOGA] = TRAINER_LEADER_KOGA, [FAMECHECKER_SABRINA] = TRAINER_LEADER_SABRINA, [FAMECHECKER_BLAINE] = TRAINER_LEADER_BLAINE, [FAMECHECKER_LORELEI] = TRAINER_ELITE_FOUR_LORELEI, [FAMECHECKER_BRUNO] = TRAINER_ELITE_FOUR_BRUNO, [FAMECHECKER_AGATHA] = TRAINER_ELITE_FOUR_AGATHA, [FAMECHECKER_LANCE] = TRAINER_ELITE_FOUR_LANCE, [FAMECHECKER_BILL] = FAME_CHECKER_BILL, [FAMECHECKER_MRFUJI] = FAME_CHECKER_MR_FUJI, [FAMECHECKER_GIOVANNI] = TRAINER_BOSS_GIOVANNI }; static const u8 *const sNonTrainerNamePointers[] = { gFameCheckerOakName, gFameCheckerDaisyName, gFameCheckerBillName, gFameCheckerMrFujiName }; static const u8 sFameCheckerTrainerPicIdxs[] = { [FAMECHECKER_OAK] = TRAINER_PIC_CAMPER, [FAMECHECKER_DAISY] = TRAINER_PIC_LASS, [FAMECHECKER_BROCK] = TRAINER_PIC_LEADER_BROCK, [FAMECHECKER_MISTY] = TRAINER_PIC_LEADER_MISTY, [FAMECHECKER_LTSURGE] = TRAINER_PIC_LEADER_LT_SURGE, [FAMECHECKER_ERIKA] = TRAINER_PIC_LEADER_ERIKA, [FAMECHECKER_KOGA] = TRAINER_PIC_LEADER_KOGA, [FAMECHECKER_SABRINA] = TRAINER_PIC_LEADER_SABRINA, [FAMECHECKER_BLAINE] = TRAINER_PIC_LEADER_BLAINE, [FAMECHECKER_LORELEI] = TRAINER_PIC_ELITE_FOUR_LORELEI, [FAMECHECKER_BRUNO] = TRAINER_PIC_ELITE_FOUR_BRUNO, [FAMECHECKER_AGATHA] = TRAINER_PIC_ELITE_FOUR_AGATHA, [FAMECHECKER_LANCE] = TRAINER_PIC_ELITE_FOUR_LANCE, [FAMECHECKER_BILL] = TRAINER_PIC_PSYCHIC_M, [FAMECHECKER_MRFUJI] = TRAINER_PIC_GENTLEMAN, [FAMECHECKER_GIOVANNI] = TRAINER_PIC_LEADER_GIOVANNI, }; static const u8 sFameCheckerTrainerGenders_Unused[] = { [FAMECHECKER_OAK] = MALE, [FAMECHECKER_DAISY] = FEMALE, [FAMECHECKER_BROCK] = MALE, [FAMECHECKER_MISTY] = FEMALE, [FAMECHECKER_LTSURGE] = MALE, [FAMECHECKER_ERIKA] = FEMALE, [FAMECHECKER_KOGA] = MALE, [FAMECHECKER_SABRINA] = FEMALE, [FAMECHECKER_BLAINE] = MALE, [FAMECHECKER_LORELEI] = FEMALE, [FAMECHECKER_BRUNO] = MALE, [FAMECHECKER_AGATHA] = FEMALE, [FAMECHECKER_LANCE] = MALE, [FAMECHECKER_BILL] = MALE, [FAMECHECKER_MRFUJI] = MALE, [FAMECHECKER_GIOVANNI] = MALE, }; static const u8 *const sFameCheckerNameAndQuotesPointers[2 * NUM_FAMECHECKER_PERSONS] = { gFameCheckerPersonName_ProfOak, gFameCheckerPersonName_Daisy, gFameCheckerPersonName_Brock, gFameCheckerPersonName_Misty, gFameCheckerPersonName_LtSurge, gFameCheckerPersonName_Erika, gFameCheckerPersonName_Koga, gFameCheckerPersonName_Sabrina, gFameCheckerPersonName_Blaine, gFameCheckerPersonName_Lorelei, gFameCheckerPersonName_Bruno, gFameCheckerPersonName_Agatha, gFameCheckerPersonName_Lance, gFameCheckerPersonName_Bill, gFameCheckerPersonName_MrFuji, gFameCheckerPersonName_Giovanni, gFameCheckerPersonQuote_ProfOak, gFameCheckerPersonQuote_Daisy, gFameCheckerPersonQuote_Brock, gFameCheckerPersonQuote_Misty, gFameCheckerPersonQuote_LtSurge, gFameCheckerPersonQuote_Erika, gFameCheckerPersonQuote_Koga, gFameCheckerPersonQuote_Sabrina, gFameCheckerPersonQuote_Blaine, gFameCheckerPersonQuote_Lorelei, gFameCheckerPersonQuote_Bruno, gFameCheckerPersonQuote_Agatha, gFameCheckerPersonQuote_Lance, gFameCheckerPersonQuote_Bill, gFameCheckerPersonQuote_MrFuji, gFameCheckerPersonQuote_Giovanni }; static const u8 *const sFameCheckerFlavorTextPointers[] = { gFameCheckerFlavorText_ProfOak0, gFameCheckerFlavorText_ProfOak1, gFameCheckerFlavorText_ProfOak2, gFameCheckerFlavorText_ProfOak3, gFameCheckerFlavorText_ProfOak4, gFameCheckerFlavorText_ProfOak5, gFameCheckerFlavorText_Daisy0, gFameCheckerFlavorText_Daisy1, gFameCheckerFlavorText_Daisy2, gFameCheckerFlavorText_Daisy3, gFameCheckerFlavorText_Daisy4, gFameCheckerFlavorText_Daisy5, gFameCheckerFlavorText_Brock0, gFameCheckerFlavorText_Brock1, gFameCheckerFlavorText_Brock2, gFameCheckerFlavorText_Brock3, gFameCheckerFlavorText_Brock4, gFameCheckerFlavorText_Brock5, gFameCheckerFlavorText_Misty0, gFameCheckerFlavorText_Misty1, gFameCheckerFlavorText_Misty2, gFameCheckerFlavorText_Misty3, gFameCheckerFlavorText_Misty4, gFameCheckerFlavorText_Misty5, gFameCheckerFlavorText_LtSurge0, gFameCheckerFlavorText_LtSurge1, gFameCheckerFlavorText_LtSurge2, gFameCheckerFlavorText_LtSurge3, gFameCheckerFlavorText_LtSurge4, gFameCheckerFlavorText_LtSurge5, gFameCheckerFlavorText_Erika0, gFameCheckerFlavorText_Erika1, gFameCheckerFlavorText_Erika2, gFameCheckerFlavorText_Erika3, gFameCheckerFlavorText_Erika4, gFameCheckerFlavorText_Erika5, gFameCheckerFlavorText_Koga0, gFameCheckerFlavorText_Koga1, gFameCheckerFlavorText_Koga2, gFameCheckerFlavorText_Koga3, gFameCheckerFlavorText_Koga4, gFameCheckerFlavorText_Koga5, gFameCheckerFlavorText_Sabrina0, gFameCheckerFlavorText_Sabrina1, gFameCheckerFlavorText_Sabrina2, gFameCheckerFlavorText_Sabrina3, gFameCheckerFlavorText_Sabrina4, gFameCheckerFlavorText_Sabrina5, gFameCheckerFlavorText_Blaine0, gFameCheckerFlavorText_Blaine1, gFameCheckerFlavorText_Blaine2, gFameCheckerFlavorText_Blaine3, gFameCheckerFlavorText_Blaine4, gFameCheckerFlavorText_Blaine5, gFameCheckerFlavorText_Lorelei0, gFameCheckerFlavorText_Lorelei1, gFameCheckerFlavorText_Lorelei2, gFameCheckerFlavorText_Lorelei3, gFameCheckerFlavorText_Lorelei4, gFameCheckerFlavorText_Lorelei5, gFameCheckerFlavorText_Bruno0, gFameCheckerFlavorText_Bruno1, gFameCheckerFlavorText_Bruno2, gFameCheckerFlavorText_Bruno3, gFameCheckerFlavorText_Bruno4, gFameCheckerFlavorText_Bruno5, gFameCheckerFlavorText_Agatha0, gFameCheckerFlavorText_Agatha1, gFameCheckerFlavorText_Agatha2, gFameCheckerFlavorText_Agatha3, gFameCheckerFlavorText_Agatha4, gFameCheckerFlavorText_Agatha5, gFameCheckerFlavorText_Lance0, gFameCheckerFlavorText_Lance1, gFameCheckerFlavorText_Lance2, gFameCheckerFlavorText_Lance3, gFameCheckerFlavorText_Lance4, gFameCheckerFlavorText_Lance5, gFameCheckerFlavorText_Bill0, gFameCheckerFlavorText_Bill1, gFameCheckerFlavorText_Bill2, gFameCheckerFlavorText_Bill3, gFameCheckerFlavorText_Bill4, gFameCheckerFlavorText_Bill5, gFameCheckerFlavorText_MrFuji0, gFameCheckerFlavorText_MrFuji1, gFameCheckerFlavorText_MrFuji2, gFameCheckerFlavorText_MrFuji3, gFameCheckerFlavorText_MrFuji4, gFameCheckerFlavorText_MrFuji5, gFameCheckerFlavorText_Giovanni0, gFameCheckerFlavorText_Giovanni1, gFameCheckerFlavorText_Giovanni2, gFameCheckerFlavorText_Giovanni3, gFameCheckerFlavorText_Giovanni4, gFameCheckerFlavorText_Giovanni5 }; static const u8 sFameCheckerArrayNpcGraphicsIds[] = { // OAK OBJ_EVENT_GFX_SIGN, OBJ_EVENT_GFX_PROF_OAK, OBJ_EVENT_GFX_WORKER_F, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_AGATHA, OBJ_EVENT_GFX_SCIENTIST, // DAISY OBJ_EVENT_GFX_SCIENTIST, OBJ_EVENT_GFX_WORKER_F, OBJ_EVENT_GFX_GENTLEMAN, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_OLD_WOMAN, OBJ_EVENT_GFX_CLIPBOARD, // BROCK OBJ_EVENT_GFX_GYM_SIGN, OBJ_EVENT_GFX_BROCK, OBJ_EVENT_GFX_FAT_MAN, OBJ_EVENT_GFX_BOY, OBJ_EVENT_GFX_BALDING_MAN, OBJ_EVENT_GFX_CLIPBOARD, // MISTY OBJ_EVENT_GFX_GYM_SIGN, OBJ_EVENT_GFX_MISTY, OBJ_EVENT_GFX_SWIMMER_M_WATER, OBJ_EVENT_GFX_CAMPER, OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_CLIPBOARD, // LTSURGE OBJ_EVENT_GFX_GYM_SIGN, OBJ_EVENT_GFX_LT_SURGE, OBJ_EVENT_GFX_GENTLEMAN, OBJ_EVENT_GFX_GENTLEMAN, OBJ_EVENT_GFX_SAILOR, OBJ_EVENT_GFX_CLIPBOARD, // ERIKA OBJ_EVENT_GFX_GYM_SIGN, OBJ_EVENT_GFX_ERIKA, OBJ_EVENT_GFX_LASS, OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_ERIKA, OBJ_EVENT_GFX_CLIPBOARD, // KOGA OBJ_EVENT_GFX_GYM_SIGN, OBJ_EVENT_GFX_KOGA, OBJ_EVENT_GFX_ROCKER, OBJ_EVENT_GFX_LASS, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_BALDING_MAN, // SABRINA OBJ_EVENT_GFX_GYM_SIGN, OBJ_EVENT_GFX_MAN, OBJ_EVENT_GFX_SABRINA, OBJ_EVENT_GFX_SABRINA, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_COOLTRAINER_M, // BLAINE OBJ_EVENT_GFX_GYM_SIGN, OBJ_EVENT_GFX_BLAINE, OBJ_EVENT_GFX_SCIENTIST, OBJ_EVENT_GFX_WOMAN_2, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_CLIPBOARD, // LORELEI OBJ_EVENT_GFX_LORELEI, OBJ_EVENT_GFX_LORELEI, OBJ_EVENT_GFX_OLD_MAN_1, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_LITTLE_GIRL, OBJ_EVENT_GFX_OLD_WOMAN, // BRUNO OBJ_EVENT_GFX_BRUNO, OBJ_EVENT_GFX_BRUNO, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_BLACKBELT, OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_BLACKBELT, // AGATHA OBJ_EVENT_GFX_AGATHA, OBJ_EVENT_GFX_BLACKBELT, OBJ_EVENT_GFX_BLACKBELT, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_AGATHA, OBJ_EVENT_GFX_OLD_WOMAN, // LANCE OBJ_EVENT_GFX_LANCE, OBJ_EVENT_GFX_LANCE, OBJ_EVENT_GFX_BATTLE_GIRL, OBJ_EVENT_GFX_WOMAN_1, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_COOLTRAINER_M, // BILL OBJ_EVENT_GFX_BLUE, OBJ_EVENT_GFX_YOUNGSTER, OBJ_EVENT_GFX_OLD_MAN_1, OBJ_EVENT_GFX_CELIO, OBJ_EVENT_GFX_CELIO, OBJ_EVENT_GFX_CELIO, // MRFUJI OBJ_EVENT_GFX_LITTLE_GIRL, OBJ_EVENT_GFX_ROCKET_M, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_BALDING_MAN, OBJ_EVENT_GFX_CLIPBOARD, OBJ_EVENT_GFX_CLIPBOARD, // GIOVANNI OBJ_EVENT_GFX_GIOVANNI, OBJ_EVENT_GFX_SCIENTIST, OBJ_EVENT_GFX_SCIENTIST, OBJ_EVENT_GFX_GIOVANNI, OBJ_EVENT_GFX_GYM_GUY, OBJ_EVENT_GFX_SCIENTIST }; static const u8 *const sFlavorTextOriginLocationTexts[] = { gFameCheckerFlavorTextOriginLocation_ProfOak0, gFameCheckerFlavorTextOriginLocation_ProfOak1, gFameCheckerFlavorTextOriginLocation_ProfOak2, gFameCheckerFlavorTextOriginLocation_ProfOak3, gFameCheckerFlavorTextOriginLocation_ProfOak4, gFameCheckerFlavorTextOriginLocation_ProfOak5, gFameCheckerFlavorTextOriginLocation_Daisy0, gFameCheckerFlavorTextOriginLocation_Daisy1, gFameCheckerFlavorTextOriginLocation_Daisy2, gFameCheckerFlavorTextOriginLocation_Daisy3, gFameCheckerFlavorTextOriginLocation_Daisy4, gFameCheckerFlavorTextOriginLocation_Daisy5, gFameCheckerFlavorTextOriginLocation_Brock0, gFameCheckerFlavorTextOriginLocation_Brock1, gFameCheckerFlavorTextOriginLocation_Brock2, gFameCheckerFlavorTextOriginLocation_Brock3, gFameCheckerFlavorTextOriginLocation_Brock4, gFameCheckerFlavorTextOriginLocation_Brock5, gFameCheckerFlavorTextOriginLocation_Misty0, gFameCheckerFlavorTextOriginLocation_Misty1, gFameCheckerFlavorTextOriginLocation_Misty2, gFameCheckerFlavorTextOriginLocation_Misty3, gFameCheckerFlavorTextOriginLocation_Misty4, gFameCheckerFlavorTextOriginLocation_Misty5, gFameCheckerFlavorTextOriginLocation_LtSurge0, gFameCheckerFlavorTextOriginLocation_LtSurge1, gFameCheckerFlavorTextOriginLocation_LtSurge2, gFameCheckerFlavorTextOriginLocation_LtSurge3, gFameCheckerFlavorTextOriginLocation_LtSurge4, gFameCheckerFlavorTextOriginLocation_LtSurge5, gFameCheckerFlavorTextOriginLocation_Erika0, gFameCheckerFlavorTextOriginLocation_Erika1, gFameCheckerFlavorTextOriginLocation_Erika2, gFameCheckerFlavorTextOriginLocation_Erika3, gFameCheckerFlavorTextOriginLocation_Erika4, gFameCheckerFlavorTextOriginLocation_Erika5, gFameCheckerFlavorTextOriginLocation_Koga0, gFameCheckerFlavorTextOriginLocation_Koga1, gFameCheckerFlavorTextOriginLocation_Koga2, gFameCheckerFlavorTextOriginLocation_Koga3, gFameCheckerFlavorTextOriginLocation_Koga4, gFameCheckerFlavorTextOriginLocation_Koga5, gFameCheckerFlavorTextOriginLocation_Sabrina0, gFameCheckerFlavorTextOriginLocation_Sabrina1, gFameCheckerFlavorTextOriginLocation_Sabrina2, gFameCheckerFlavorTextOriginLocation_Sabrina3, gFameCheckerFlavorTextOriginLocation_Sabrina4, gFameCheckerFlavorTextOriginLocation_Sabrina5, gFameCheckerFlavorTextOriginLocation_Blaine0, gFameCheckerFlavorTextOriginLocation_Blaine1, gFameCheckerFlavorTextOriginLocation_Blaine2, gFameCheckerFlavorTextOriginLocation_Blaine3, gFameCheckerFlavorTextOriginLocation_Blaine4, gFameCheckerFlavorTextOriginLocation_Blaine5, gFameCheckerFlavorTextOriginLocation_Lorelei0, gFameCheckerFlavorTextOriginLocation_Lorelei1, gFameCheckerFlavorTextOriginLocation_Lorelei2, gFameCheckerFlavorTextOriginLocation_Lorelei3, gFameCheckerFlavorTextOriginLocation_Lorelei4, gFameCheckerFlavorTextOriginLocation_Lorelei5, gFameCheckerFlavorTextOriginLocation_Bruno0, gFameCheckerFlavorTextOriginLocation_Bruno1, gFameCheckerFlavorTextOriginLocation_Bruno2, gFameCheckerFlavorTextOriginLocation_Bruno3, gFameCheckerFlavorTextOriginLocation_Bruno4, gFameCheckerFlavorTextOriginLocation_Bruno5, gFameCheckerFlavorTextOriginLocation_Agatha0, gFameCheckerFlavorTextOriginLocation_Agatha1, gFameCheckerFlavorTextOriginLocation_Agatha2, gFameCheckerFlavorTextOriginLocation_Agatha3, gFameCheckerFlavorTextOriginLocation_Agatha4, gFameCheckerFlavorTextOriginLocation_Agatha5, gFameCheckerFlavorTextOriginLocation_Lance0, gFameCheckerFlavorTextOriginLocation_Lance1, gFameCheckerFlavorTextOriginLocation_Lance2, gFameCheckerFlavorTextOriginLocation_Lance3, gFameCheckerFlavorTextOriginLocation_Lance4, gFameCheckerFlavorTextOriginLocation_Lance5, gFameCheckerFlavorTextOriginLocation_Bill0, gFameCheckerFlavorTextOriginLocation_Bill1, gFameCheckerFlavorTextOriginLocation_Bill2, gFameCheckerFlavorTextOriginLocation_Bill3, gFameCheckerFlavorTextOriginLocation_Bill4, gFameCheckerFlavorTextOriginLocation_Bill5, gFameCheckerFlavorTextOriginLocation_MrFuji0, gFameCheckerFlavorTextOriginLocation_MrFuji1, gFameCheckerFlavorTextOriginLocation_MrFuji2, gFameCheckerFlavorTextOriginLocation_MrFuji3, gFameCheckerFlavorTextOriginLocation_MrFuji4, gFameCheckerFlavorTextOriginLocation_MrFuji5, gFameCheckerFlavorTextOriginLocation_Giovanni0, gFameCheckerFlavorTextOriginLocation_Giovanni1, gFameCheckerFlavorTextOriginLocation_Giovanni2, gFameCheckerFlavorTextOriginLocation_Giovanni3, gFameCheckerFlavorTextOriginLocation_Giovanni4, gFameCheckerFlavorTextOriginLocation_Giovanni5 }; static const u8 *const sFlavorTextOriginObjectNameTexts[] = { gFameCheckerFlavorTextOriginObjectName_ProfOak0, gFameCheckerFlavorTextOriginObjectName_ProfOak1, gFameCheckerFlavorTextOriginObjectName_ProfOak2, gFameCheckerFlavorTextOriginObjectName_ProfOak3, gFameCheckerFlavorTextOriginObjectName_ProfOak4, gFameCheckerFlavorTextOriginObjectName_ProfOak5, gFameCheckerFlavorTextOriginObjectName_Daisy0, gFameCheckerFlavorTextOriginObjectName_Daisy1, gFameCheckerFlavorTextOriginObjectName_Daisy2, gFameCheckerFlavorTextOriginObjectName_Daisy3, gFameCheckerFlavorTextOriginObjectName_Daisy4, gFameCheckerFlavorTextOriginObjectName_Daisy5, gFameCheckerFlavorTextOriginObjectName_Brock0, gFameCheckerFlavorTextOriginObjectName_Brock1, gFameCheckerFlavorTextOriginObjectName_Brock2, gFameCheckerFlavorTextOriginObjectName_Brock3, gFameCheckerFlavorTextOriginObjectName_Brock4, gFameCheckerFlavorTextOriginObjectName_Brock5, gFameCheckerFlavorTextOriginObjectName_Misty0, gFameCheckerFlavorTextOriginObjectName_Misty1, gFameCheckerFlavorTextOriginObjectName_Misty2, gFameCheckerFlavorTextOriginObjectName_Misty3, gFameCheckerFlavorTextOriginObjectName_Misty4, gFameCheckerFlavorTextOriginObjectName_Misty5, gFameCheckerFlavorTextOriginObjectName_LtSurge0, gFameCheckerFlavorTextOriginObjectName_LtSurge1, gFameCheckerFlavorTextOriginObjectName_LtSurge2, gFameCheckerFlavorTextOriginObjectName_LtSurge3, gFameCheckerFlavorTextOriginObjectName_LtSurge4, gFameCheckerFlavorTextOriginObjectName_LtSurge5, gFameCheckerFlavorTextOriginObjectName_Erika0, gFameCheckerFlavorTextOriginObjectName_Erika1, gFameCheckerFlavorTextOriginObjectName_Erika2, gFameCheckerFlavorTextOriginObjectName_Erika3, gFameCheckerFlavorTextOriginObjectName_Erika4, gFameCheckerFlavorTextOriginObjectName_Erika5, gFameCheckerFlavorTextOriginObjectName_Koga0, gFameCheckerFlavorTextOriginObjectName_Koga1, gFameCheckerFlavorTextOriginObjectName_Koga2, gFameCheckerFlavorTextOriginObjectName_Koga3, gFameCheckerFlavorTextOriginObjectName_Koga4, gFameCheckerFlavorTextOriginObjectName_Koga5, gFameCheckerFlavorTextOriginObjectName_Sabrina0, gFameCheckerFlavorTextOriginObjectName_Sabrina1, gFameCheckerFlavorTextOriginObjectName_Sabrina2, gFameCheckerFlavorTextOriginObjectName_Sabrina3, gFameCheckerFlavorTextOriginObjectName_Sabrina4, gFameCheckerFlavorTextOriginObjectName_Sabrina5, gFameCheckerFlavorTextOriginObjectName_Blaine0, gFameCheckerFlavorTextOriginObjectName_Blaine1, gFameCheckerFlavorTextOriginObjectName_Blaine2, gFameCheckerFlavorTextOriginObjectName_Blaine3, gFameCheckerFlavorTextOriginObjectName_Blaine4, gFameCheckerFlavorTextOriginObjectName_Blaine5, gFameCheckerFlavorTextOriginObjectName_Lorelei0, gFameCheckerFlavorTextOriginObjectName_Lorelei1, gFameCheckerFlavorTextOriginObjectName_Lorelei2, gFameCheckerFlavorTextOriginObjectName_Lorelei3, gFameCheckerFlavorTextOriginObjectName_Lorelei4, gFameCheckerFlavorTextOriginObjectName_Lorelei5, gFameCheckerFlavorTextOriginObjectName_Bruno0, gFameCheckerFlavorTextOriginObjectName_Bruno1, gFameCheckerFlavorTextOriginObjectName_Bruno2, gFameCheckerFlavorTextOriginObjectName_Bruno3, gFameCheckerFlavorTextOriginObjectName_Bruno4, gFameCheckerFlavorTextOriginObjectName_Bruno5, gFameCheckerFlavorTextOriginObjectName_Agatha0, gFameCheckerFlavorTextOriginObjectName_Agatha1, gFameCheckerFlavorTextOriginObjectName_Agatha2, gFameCheckerFlavorTextOriginObjectName_Agatha3, gFameCheckerFlavorTextOriginObjectName_Agatha4, gFameCheckerFlavorTextOriginObjectName_Agatha5, gFameCheckerFlavorTextOriginObjectName_Lance0, gFameCheckerFlavorTextOriginObjectName_Lance1, gFameCheckerFlavorTextOriginObjectName_Lance2, gFameCheckerFlavorTextOriginObjectName_Lance3, gFameCheckerFlavorTextOriginObjectName_Lance4, gFameCheckerFlavorTextOriginObjectName_Lance5, gFameCheckerFlavorTextOriginObjectName_Bill0, gFameCheckerFlavorTextOriginObjectName_Bill1, gFameCheckerFlavorTextOriginObjectName_Bill2, gFameCheckerFlavorTextOriginObjectName_Bill3, gFameCheckerFlavorTextOriginObjectName_Bill4, gFameCheckerFlavorTextOriginObjectName_Bill5, gFameCheckerFlavorTextOriginObjectName_MrFuji0, gFameCheckerFlavorTextOriginObjectName_MrFuji1, gFameCheckerFlavorTextOriginObjectName_MrFuji2, gFameCheckerFlavorTextOriginObjectName_MrFuji3, gFameCheckerFlavorTextOriginObjectName_MrFuji4, gFameCheckerFlavorTextOriginObjectName_MrFuji5, gFameCheckerFlavorTextOriginObjectName_Giovanni0, gFameCheckerFlavorTextOriginObjectName_Giovanni1, gFameCheckerFlavorTextOriginObjectName_Giovanni2, gFameCheckerFlavorTextOriginObjectName_Giovanni3, gFameCheckerFlavorTextOriginObjectName_Giovanni4, gFameCheckerFlavorTextOriginObjectName_Giovanni5 }; static const struct SpriteSheet sUISpriteSheets[] = { {sSelectorCursorSpriteGfx, 0x400, SPRITETAG_SELECTOR_CURSOR}, {sQuestionMarkSpriteGfx, 0x100, SPRITETAG_QUESTION_MARK}, {sSpinningPokeballSpriteGfx, 0x1e0, SPRITETAG_SPINNING_POKEBALL}, {sDaisySpriteGfx, 0x800, SPRITETAG_DAISY}, {sFujiSpriteGfx, 0x800, SPRITETAG_FUJI}, {sOakSpriteGfx, 0x800, SPRITETAG_OAK}, {sBillSpriteGfx, 0x800, SPRITETAG_BILL}, {} }; static const struct SpritePalette sUISpritePalettes[] = { {sSelectorCursorSpritePalette, SPRITETAG_SELECTOR_CURSOR}, {sSpinningPokeballSpritePalette, SPRITETAG_SPINNING_POKEBALL}, {} }; static const struct BgTemplate sUIBgTemplates[4] = { { .bg = 3, .charBaseIndex = 3, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = FALSE, .priority = 3, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 3, .mapBaseIndex = 27, .screenSize = 0, .paletteMode = FALSE, .priority = 2, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 3, .mapBaseIndex = 28, .screenSize = 1, .paletteMode = FALSE, .priority = 0, .baseTile = 0x000 }, { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = FALSE, .priority = 2, .baseTile = 0x000 }, }; static const struct WindowTemplate sUIWindowTemplates[] = { [FCWINDOWID_LIST] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 3, .width = 8, .height = 10, .paletteNum = 15, .baseBlock = 20 }, [FCWINDOWID_UIHELP] = { .bg = 0, .tilemapLeft = 6, .tilemapTop = 0, .width = 24, .height = 2, .paletteNum = 15, .baseBlock = 20 + 8 * 10 }, [FCWINDOWID_MSGBOX] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 15, .baseBlock = 20 + 8 * 10 + 24 * 2 }, [FCWINDOWID_ICONDESC] = { .bg = 0, .tilemapLeft = 15, .tilemapTop = 10, .width = 11, .height = 4, .paletteNum = 15, .baseBlock = 20 + 8 * 10 + 24 * 2 + 26 * 4 }, DUMMY_WIN_TEMPLATE }; static const union AnimCmd sSelectorCursorAnim0[] = { ANIMCMD_FRAME( 0, 15), ANIMCMD_FRAME(16, 15), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sSelectorCursorAnims[] = { sSelectorCursorAnim0 }; static const struct OamData sSelectorCursorOamData = { .size = 2, .priority = 2 }; static const struct SpriteTemplate sSpriteTemplate_SelectorCursor = { SPRITETAG_SELECTOR_CURSOR, SPRITETAG_SELECTOR_CURSOR, &sSelectorCursorOamData, sSelectorCursorAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; static const u8 sUnused[8] = {}; // ??? static const struct OamData sQuestionMarkTileOamData = { .shape = ST_OAM_V_RECTANGLE, .size = 2, .priority = 2 }; static const union AnimCmd sQuestionMarkTileAnim0[] = { ANIMCMD_FRAME( 0, 10), ANIMCMD_END }; static const union AnimCmd *const sQuestionMarkTileAnims[] = { sQuestionMarkTileAnim0 }; static const struct SpriteTemplate sQuestionMarkTileSpriteTemplate = { SPRITETAG_QUESTION_MARK, 0xffff, &sQuestionMarkTileOamData, sQuestionMarkTileAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; static const union AnimCmd sSpinningPokeballAnim0[] = { ANIMCMD_FRAME( 0, 10), ANIMCMD_END }; static const union AnimCmd *const sSpinningPokeballAnims[] = { sSpinningPokeballAnim0 }; static const struct OamData sSpinningPokeballOamData = { .affineMode = ST_OAM_AFFINE_NORMAL, .size = 2 }; static const union AffineAnimCmd sSpinningPokeballAffineAnim0[] = { AFFINEANIMCMD_FRAME(0, 0, 4, 20), AFFINEANIMCMD_JUMP(0) }; static const union AffineAnimCmd *const sSpinningPokeballAffineAnims[] = { sSpinningPokeballAffineAnim0 }; static const struct SpriteTemplate sSpinningPokeballSpriteTemplate = { SPRITETAG_SPINNING_POKEBALL, SPRITETAG_SPINNING_POKEBALL, &sSpinningPokeballOamData, sSpinningPokeballAnims, NULL, sSpinningPokeballAffineAnims, SpriteCB_FCSpinningPokeball }; static const union AnimCmd sDaisyFujiOakBillAnim0[] = { ANIMCMD_FRAME( 0, 15), ANIMCMD_END }; static const union AnimCmd *const sDaisyFujiOakBillAnims[] = { sDaisyFujiOakBillAnim0 }; static const struct OamData sDaisyFujiOakBillOamData = { .size = 3 }; static const struct SpriteTemplate sDaisySpriteTemplate = { SPRITETAG_DAISY, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; static const struct SpriteTemplate sFujiSpriteTemplate = { SPRITETAG_FUJI, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; static const struct SpriteTemplate sOakSpriteTemplate = { SPRITETAG_OAK, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; static const struct SpriteTemplate sBillSpriteTemplate = { SPRITETAG_BILL, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; static void FC_VBlankCallback(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void MainCB2_FameCheckerMain(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } void UseFameChecker(MainCallback savedCallback) { SetVBlankCallback(NULL); sFameCheckerData = AllocZeroed(sizeof(struct FameCheckerData)); sFameCheckerData->savedCallback = savedCallback; sFameCheckerData->listMenuCurIdx = 0; sFameCheckerData->listMenuTopIdx2 = 0; sFameCheckerData->listMenuDrawnSelIdx = 0; sFameCheckerData->viewingFlavorText = FALSE; PlaySE(SE_M_SWIFT); SetMainCallback2(MainCB2_LoadFameChecker); } static void MainCB2_LoadFameChecker(void) { switch (gMain.state) { case 0: SetVBlankCallback(NULL); FCSetup_ClearVideoRegisters(); gMain.state++; break; case 1: FCSetup_ResetTasksAndSpriteResources(); gMain.state++; break; case 2: sBg3TilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); // 256x256 sBg1TilemapBuffer = AllocZeroed(BG_SCREEN_SIZE * 2); // 512x256 sBg2TilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); // 256x256 ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sUIBgTemplates, NELEMS(sUIBgTemplates)); SetBgTilemapBuffer(3, sBg3TilemapBuffer); SetBgTilemapBuffer(2, sBg2TilemapBuffer); SetBgTilemapBuffer(1, sBg1TilemapBuffer); FCSetup_ResetBGCoords(); gMain.state++; break; case 3: LoadBgTiles(3, gFameCheckerBgTiles, sizeof(gFameCheckerBgTiles), 0); CopyToBgTilemapBufferRect(3, gFameCheckerBg3Tilemap, 0, 0, 32, 32); LoadPalette(&gFameCheckerBgPals[0], BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadPalette(&gFameCheckerBgPals[1], BG_PLTT_ID(1), PLTT_SIZE_4BPP); CopyToBgTilemapBufferRect(2, gFameCheckerBg2Tilemap, 0, 0, 32, 32); CopyToBgTilemapBufferRect_ChangePalette(1, sFameCheckerTilemap, 30, 0, 32, 32, 0x11); LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(15), PLTT_SIZE_4BPP); gMain.state++; break; case 4: if (IsDma3ManagerBusyWithBgCopy() != TRUE) { ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); gMain.state++; } break; case 5: InitWindows(sUIWindowTemplates); DeactivateAllTextPrinters(); Setup_DrawMsgAndListBoxes(); sListMenuItems = AllocZeroed(17 * sizeof(struct ListMenuItem)); FC_CreateListMenu(); gMain.state++; break; case 6: LoadUISpriteSheetsAndPalettes(); CreateAllFlavorTextIcons(FAMECHECKER_OAK); WipeMsgBoxAndTransfer(); BeginNormalPaletteFade(PALETTES_ALL,0, 16, 0, 0); gMain.state++; break; case 7: FCSetup_TurnOnDisplay(); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD); SetGpuReg(REG_OFFSET_BLDALPHA, 0x07); SetGpuReg(REG_OFFSET_BLDY, 0x08); SetVBlankCallback(FC_VBlankCallback); sFameCheckerData->listMenuTopIdx = 0; FC_CreateScrollIndicatorArrowPair(); UpdateInfoBoxTilemap(1, 4); CreateTask(Task_WaitFadeOnInit, 0x08); SetMainCallback2(MainCB2_FameCheckerMain); gMain.state = 0; break; } } static void LoadUISpriteSheetsAndPalettes(void) { LoadSpriteSheets(sUISpriteSheets); LoadSpritePalettes(sUISpritePalettes); } static void Task_WaitFadeOnInit(u8 taskId) { if (!gPaletteFade.active) gTasks[taskId].func = Task_TopMenuHandleInput; } static void Task_TopMenuHandleInput(u8 taskId) { u16 cursorPos; u32 i; struct Task *task = &gTasks[taskId]; s16 * data = gTasks[taskId].data; if (FindTaskIdByFunc(Task_FCOpenOrCloseInfoBox) == 0xFF) { RunTextPrinters(); if ((JOY_NEW(SELECT_BUTTON)) && !sFameCheckerData->inPickMode && sFameCheckerData->savedCallback != CB2_BagMenuFromStartMenu) task->func = Task_StartToCloseFameChecker; else if (JOY_NEW(START_BUTTON)) { cursorPos = FameCheckerGetCursorY(); if (TryExitPickMode(taskId) == TRUE) { PlaySE(SE_M_LOCK_ON); } else if (cursorPos != sFameCheckerData->numUnlockedPersons - 1) // anything but CANCEL { PlaySE(SE_M_LOCK_ON); FillWindowPixelRect(FCWINDOWID_ICONDESC, PIXEL_FILL(0), 0, 0, 88, 32); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_ICONDESC); UpdateInfoBoxTilemap(2, 4); UpdateInfoBoxTilemap(1, 5); PrintUIHelp(1); task->data[2] = CreatePersonPicSprite(sFameCheckerData->unlockedPersons[cursorPos]); gSprites[task->data[2]].x2 = 0xF0; gSprites[task->data[2]].data[0] = 1; task->data[3] = CreateSpinningPokeballSprite(); gSprites[task->data[3]].x2 = 0xF0; gSprites[task->data[3]].data[0] = 1; task->func = Task_EnterPickMode; } } else if (JOY_NEW(A_BUTTON)) { cursorPos = ListMenu_ProcessInput(0); if (cursorPos == sFameCheckerData->numUnlockedPersons - 1) // CANCEL task->func = Task_StartToCloseFameChecker; else if (sFameCheckerData->inPickMode) { if (!IsTextPrinterActive(2) && HasUnlockedAllFlavorTextsForCurrentPerson() == TRUE) GetPickModeText(); } else if (sFameCheckerData->personHasUnlockedPanels) { PlaySE(SE_SELECT); task->data[0] = CreateFlavorTextIconSelectorCursorSprite(task->data[1]); for (i = 0; i < 6; i++) { if (i != task->data[1]) SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[i], ST_OAM_OBJ_BLEND); } gIconDescriptionBoxIsOpen = 0xFF; PlaceListMenuCursor(FALSE); PrintUIHelp(2); if (gSprites[sFameCheckerData->spriteIds[task->data[1]]].data[1] != 0xFF) // not a ? tile { PrintSelectedNameInBrightGreen(taskId); UpdateIconDescriptionBox(data[1]); } FreeListMenuSelectorArrowPairResources(); task->func = Task_FlavorTextDisplayHandleInput; } } else if (JOY_NEW(B_BUTTON)) { if (TryExitPickMode(taskId) != TRUE) task->func = Task_StartToCloseFameChecker; } else ListMenu_ProcessInput(0); } } static bool8 TryExitPickMode(u8 taskId) { struct Task *task = &gTasks[taskId]; if (sFameCheckerData->inPickMode) { gSprites[task->data[2]].data[0] = 2; gSprites[task->data[2]].x2 += 10; gSprites[task->data[3]].data[0] = 2; gSprites[task->data[3]].x2 += 10; WipeMsgBoxAndTransfer(); task->func = Task_ExitPickMode; MessageBoxPrintEmptyText(); sFameCheckerData->pickModeOverCancel = FALSE; return TRUE; } return FALSE; } static void MessageBoxPrintEmptyText(void) { AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, FONT_NORMAL, gFameCheckerText_ClearTextbox, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } static void Task_EnterPickMode(u8 taskId) { struct Task *task = &gTasks[taskId]; if (gSprites[task->data[2]].data[0] == 0) { GetPickModeText(); sFameCheckerData->inPickMode = TRUE; task->func = Task_TopMenuHandleInput; } else ChangeBgX(1, 0xA00, 1); } static void Task_ExitPickMode(u8 taskId) { struct Task *task = &gTasks[taskId]; if (GetBgX(1) != 0) ChangeBgX(1, 0xA00, 2); else ChangeBgX(1, 0x000, 0); if (gSprites[task->data[2]].data[0] == 0) { if (sFameCheckerData->personHasUnlockedPanels) PrintUIHelp(0); UpdateInfoBoxTilemap(1, 4); UpdateInfoBoxTilemap(2, 2); sFameCheckerData->inPickMode = FALSE; DestroyPersonPicSprite(taskId, FameCheckerGetCursorY()); task->func = Task_TopMenuHandleInput; gSprites[task->data[3]].callback = SpriteCB_DestroySpinningPokeball; } } static void Task_FlavorTextDisplayHandleInput(u8 taskId) { struct Task *task = &gTasks[taskId]; s16 *data = gTasks[taskId].data; RunTextPrinters(); if (JOY_NEW(A_BUTTON) && !IsTextPrinterActive(2)) { u8 spriteId = sFameCheckerData->spriteIds[data[1]]; if (gSprites[spriteId].data[1] != 0xFF) PrintSelectedNameInBrightGreen(taskId); } if (JOY_NEW(B_BUTTON)) { u32 i; PlaySE(SE_SELECT); for (i = 0; i < 6; i++) SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[i], ST_OAM_OBJ_NORMAL); WipeMsgBoxAndTransfer(); gSprites[task->data[0]].callback = SpriteCB_DestroyFlavorTextIconSelectorCursor; if (gIconDescriptionBoxIsOpen != 0xFF) UpdateIconDescriptionBoxOff(); PlaceListMenuCursor(TRUE); PrintUIHelp(0); FC_CreateScrollIndicatorArrowPair(); MessageBoxPrintEmptyText(); task->func = Task_TopMenuHandleInput; } else if (JOY_NEW(DPAD_UP) || JOY_NEW(DPAD_DOWN)) { if (task->data[1] >= 3) { task->data[1] -= 3; FC_MoveSelectorCursor(taskId, 0, -0x1b); } else { task->data[1] += 3; FC_MoveSelectorCursor(taskId, 0, +0x1b); } } else if (JOY_NEW(DPAD_LEFT)) { if (task->data[1] == 0 || task->data[1] % 3 == 0) { task->data[1] += 2; FC_MoveSelectorCursor(taskId, +0x5e, 0); } else { task->data[1]--; FC_MoveSelectorCursor(taskId, -0x2f, 0); } } else if (JOY_NEW(DPAD_RIGHT)) { if ((task->data[1] + 1) % 3 == 0) { task->data[1] -= 2; FC_MoveSelectorCursor(taskId, -0x5e, 0); } else { task->data[1]++; FC_MoveSelectorCursor(taskId, +0x2f, 0); } } } static void FC_MoveSelectorCursor(u8 taskId, s8 dx, s8 dy) { u32 i; s16 *data = gTasks[taskId].data; PlaySE(SE_M_SWAGGER2); gSprites[data[0]].x += dx; gSprites[data[0]].y += dy; for (i = 0; i < 6; i++) SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[i], ST_OAM_OBJ_BLEND); FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20); MessageBoxPrintEmptyText(); if (SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[data[1]], ST_OAM_OBJ_NORMAL) == TRUE) { PrintSelectedNameInBrightGreen(taskId); UpdateIconDescriptionBox(data[1]); } else if (gIconDescriptionBoxIsOpen != 0xFF) UpdateIconDescriptionBoxOff(); } static void GetPickModeText(void) { s32 whichText = 0; u16 who = FameCheckerGetCursorY(); if (gSaveBlock1Ptr->fameChecker[sFameCheckerData->unlockedPersons[who]].pickState != FCPICKSTATE_COLORED) { WipeMsgBoxAndTransfer(); MessageBoxPrintEmptyText(); } else { FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20); if (HasUnlockedAllFlavorTextsForCurrentPerson() == TRUE) whichText = NUM_FAMECHECKER_PERSONS; StringExpandPlaceholders(gStringVar4, sFameCheckerNameAndQuotesPointers[sFameCheckerData->unlockedPersons[who] + whichText]); AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX); } } static void PrintSelectedNameInBrightGreen(u8 taskId) { s16 *data = gTasks[taskId].data; u16 cursorPos = FameCheckerGetCursorY(); FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20); StringExpandPlaceholders(gStringVar4, sFameCheckerFlavorTextPointers[sFameCheckerData->unlockedPersons[cursorPos] * 6 + data[1]]); AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX); } static void WipeMsgBoxAndTransfer(void) { FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX); } static void Setup_DrawMsgAndListBoxes(void) { LoadStdWindowFrameGfx(); DrawDialogueFrame(FCWINDOWID_MSGBOX, TRUE); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_LIST); } static void FC_PutWindowTilemapAndCopyWindowToVramMode3(u8 windowId) { PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); } static bool8 SetMessageSelectorIconObjMode(u8 spriteId, u8 objMode) { if (gSprites[spriteId].data[1] != 0xFF) { gSprites[spriteId].oam.objMode = objMode; return TRUE; } return FALSE; } static void Task_StartToCloseFameChecker(u8 taskId) { PlaySE(SE_M_SWIFT); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); gTasks[taskId].func = Task_DestroyAssetsAndCloseFameChecker; } static void Task_DestroyAssetsAndCloseFameChecker(u8 taskId) { u32 i; if (!gPaletteFade.active) { if (sFameCheckerData->inPickMode) { DestroyPersonPicSprite(taskId, FameCheckerGetCursorY()); FreeSpriteOamMatrix(&gSprites[gTasks[taskId].data[3]]); DestroySprite(&gSprites[gTasks[taskId].data[3]]); } for (i = 0; i < 6; i++) { DestroySprite(&gSprites[sFameCheckerData->spriteIds[i]]); } FreeNonTrainerPicTiles(); FreeSpinningPokeballSpriteResources(); FreeSelectionCursorSpriteResources(); FreeQuestionMarkSpriteResources(); FreeListMenuSelectorArrowPairResources(); SetMainCallback2(sFameCheckerData->savedCallback); DestroyListMenuTask(sFameCheckerData->listMenuTaskId, NULL, NULL); Free(sBg3TilemapBuffer); Free(sBg1TilemapBuffer); Free(sBg2TilemapBuffer); Free(sFameCheckerData); Free(sListMenuItems); FC_DestroyWindow(FCWINDOWID_LIST); FC_DestroyWindow(FCWINDOWID_UIHELP); FC_DestroyWindow(FCWINDOWID_MSGBOX); FC_DestroyWindow(FCWINDOWID_ICONDESC); FreeAllWindowBuffers(); DestroyTask(taskId); } } static void FC_DestroyWindow(u8 windowId) { FillWindowPixelBuffer(windowId, 0); ClearWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_GFX); RemoveWindow(windowId); } static u8 AdjustGiovanniIndexIfBeatenInGym(u8 a0) { if (HasTrainerBeenFought(TRAINER_LEADER_GIOVANNI) == TRUE) { if (a0 == 9) return FAMECHECKER_GIOVANNI; if (a0 > 9) return a0 - 1; } return a0; } static void PrintUIHelp(u8 state) { s32 width; const u8 * src = gFameCheckerText_MainScreenUI; if (state != 0) { src = gFameCheckerText_FlavorTextUI; if (state == 1) src = gFameCheckerText_PickScreenUI; } width = GetStringWidth(FONT_SMALL, src, 0); FillWindowPixelRect(FCWINDOWID_UIHELP, PIXEL_FILL(0), 0, 0, 0xc0, 0x10); AddTextPrinterParameterized4(FCWINDOWID_UIHELP, FONT_SMALL, 188 - width, 0, 0, 2, sTextColor_White, -1, src); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_UIHELP); } static void DestroyAllFlavorTextIcons(void) { u32 i; for (i = 0; i < 6; i++) { DestroySprite(&gSprites[sFameCheckerData->spriteIds[i]]); } } static bool8 CreateAllFlavorTextIcons(u8 who) { bool8 result = FALSE; u32 i; for (i = 0; i < 6; i++) { if ((gSaveBlock1Ptr->fameChecker[sFameCheckerData->unlockedPersons[who]].flavorTextFlags >> i) & 1) { sFameCheckerData->spriteIds[i] = CreateFameCheckerObject( sFameCheckerArrayNpcGraphicsIds[sFameCheckerData->unlockedPersons[who] * 6 + i], i, 47 * (i % 3) + 0x72, 27 * (i / 3) + 0x2F ); result = TRUE; } else { sFameCheckerData->spriteIds[i] = PlaceQuestionMarkTile( 47 * (i % 3) + 0x72, 27 * (i / 3) + 0x1F ); gSprites[sFameCheckerData->spriteIds[i]].data[1] = 0xFF; } } if (result == TRUE) { sFameCheckerData->personHasUnlockedPanels = TRUE; if (sFameCheckerData->inPickMode) PrintUIHelp(1); else PrintUIHelp(0); } else { sFameCheckerData->personHasUnlockedPanels = FALSE; PrintUIHelp(1); } return result; } void ResetFameChecker(void) { u32 i; for (i = 0; i < NUM_FAMECHECKER_PERSONS; i++) { gSaveBlock1Ptr->fameChecker[i].pickState = FCPICKSTATE_NO_DRAW; gSaveBlock1Ptr->fameChecker[i].flavorTextFlags = 0; gSaveBlock1Ptr->fameChecker[i].unk_0_E = 0; } gSaveBlock1Ptr->fameChecker[FAMECHECKER_OAK].pickState = FCPICKSTATE_COLORED; } void FullyUnlockFameChecker(void) { u8 i, j; for (i = 0; i < NUM_FAMECHECKER_PERSONS; i++) { gSaveBlock1Ptr->fameChecker[i].pickState = FCPICKSTATE_COLORED; for (j = 0; j < 6; j++) { gSaveBlock1Ptr->fameChecker[i].flavorTextFlags |= (1 << j); } } } static void FCSetup_ClearVideoRegisters(void) { void *vram = (void *)VRAM; DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG0CNT, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1CNT, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2CNT, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3CNT, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); } static void FCSetup_ResetTasksAndSpriteResources(void) { ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetAllPicSprites(); ResetPaletteFade(); InitObjectEventPalettes(0); gReservedSpritePaletteCount = 7; } static void FCSetup_TurnOnDisplay(void) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON); } static void FCSetup_ResetBGCoords(void) { ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); } void SetFlavorTextFlagFromSpecialVars(void) { if (gSpecialVar_0x8004 < NUM_FAMECHECKER_PERSONS && gSpecialVar_0x8005 < 6) { gSaveBlock1Ptr->fameChecker[gSpecialVar_0x8004].flavorTextFlags |= (1 << gSpecialVar_0x8005); gSpecialVar_0x8005 = FCPICKSTATE_SILHOUETTE; UpdatePickStateFromSpecialVar8005(); } } void UpdatePickStateFromSpecialVar8005(void) { if (gSpecialVar_0x8004 < NUM_FAMECHECKER_PERSONS && gSpecialVar_0x8005 < 3) { if (gSpecialVar_0x8005 == FCPICKSTATE_NO_DRAW) return; if ( gSpecialVar_0x8005 == FCPICKSTATE_SILHOUETTE && gSaveBlock1Ptr->fameChecker[gSpecialVar_0x8004].pickState == FCPICKSTATE_COLORED ) return; gSaveBlock1Ptr->fameChecker[gSpecialVar_0x8004].pickState = gSpecialVar_0x8005; } } static bool8 HasUnlockedAllFlavorTextsForCurrentPerson(void) { u32 i; u8 who = sFameCheckerData->unlockedPersons[FameCheckerGetCursorY()]; for (i = 0; i < 6; i++) { if (!((gSaveBlock1Ptr->fameChecker[who].flavorTextFlags >> i) & 1)) return FALSE; } return TRUE; } void CheckFilledFameCheckerFor0x8004(void) { u32 i; u8 who = gSpecialVar_0x8004; if(who < NUM_FAMECHECKER_PERSONS) { for (i = 0; i < 6; i++) { if (!((gSaveBlock1Ptr->fameChecker[who].flavorTextFlags >> i) & 1)) { gSpecialVar_Result = FALSE; return; } } gSpecialVar_Result = TRUE; return; } gSpecialVar_Result = FALSE; return; } static void FreeSelectionCursorSpriteResources(void) { FreeSpriteTilesByTag(SPRITETAG_SELECTOR_CURSOR); FreeSpritePaletteByTag(SPRITETAG_SELECTOR_CURSOR); } static u8 CreateFlavorTextIconSelectorCursorSprite(s16 where) { s16 y = 34 + 27 * (where >= 3); s16 x = 114 + 47 * (where % 3); return CreateSprite(&sSpriteTemplate_SelectorCursor, x, y, 0); } static void SpriteCB_DestroyFlavorTextIconSelectorCursor(struct Sprite *sprite) { DestroySprite(sprite); } static void FreeQuestionMarkSpriteResources(void) { FreeSpriteTilesByTag(SPRITETAG_QUESTION_MARK); } static u8 PlaceQuestionMarkTile(u8 x, u8 y) { u8 spriteId = CreateSprite(&sQuestionMarkTileSpriteTemplate, x, y, 8); gSprites[spriteId].oam.priority = 2; gSprites[spriteId].oam.paletteNum = 2; return spriteId; } static void FreeSpinningPokeballSpriteResources(void) { FreeSpriteTilesByTag(SPRITETAG_SPINNING_POKEBALL); FreeSpritePaletteByTag(SPRITETAG_SPINNING_POKEBALL); } static u8 CreateSpinningPokeballSprite(void) { return CreateSprite(&sSpinningPokeballSpriteTemplate, 0xe2, 0x42, 0); } static void SpriteCB_DestroySpinningPokeball(struct Sprite *sprite) { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } static void FreeNonTrainerPicTiles(void) { FreeSpriteTilesByTag(SPRITETAG_DAISY); FreeSpriteTilesByTag(SPRITETAG_FUJI); FreeSpriteTilesByTag(SPRITETAG_OAK); FreeSpriteTilesByTag(SPRITETAG_BILL); } static void SpriteCB_FCSpinningPokeball(struct Sprite *sprite) { if (sprite->data[0] == 1) { if (sprite->x2 - 10 < 0) { sprite->x2 = 0; sprite->data[0] = 0; } else sprite->x2 -= 10; } else if (sprite->data[0] == 2) { if (sprite->x2 > 240) { sprite->x2 = 240; sprite->data[0] = 0; } else sprite->x2 += 10; } } #define PERSON_PAL_NUM 6 #define PERSON_X 148 #define PERSON_Y 66 static u8 CreatePersonPicSprite(u8 fcPersonIdx) { u8 spriteId; if (fcPersonIdx == FAMECHECKER_DAISY) { spriteId = CreateSprite(&sDaisySpriteTemplate, PERSON_X, PERSON_Y, 0); LoadPalette(sDaisySpritePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sDaisySpritePalette)); gSprites[spriteId].oam.paletteNum = PERSON_PAL_NUM; } else if (fcPersonIdx == FAMECHECKER_MRFUJI) { spriteId = CreateSprite(&sFujiSpriteTemplate, PERSON_X, PERSON_Y, 0); LoadPalette(sFujiSpritePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sFujiSpritePalette)); gSprites[spriteId].oam.paletteNum = PERSON_PAL_NUM; } else if (fcPersonIdx == FAMECHECKER_OAK) { spriteId = CreateSprite(&sOakSpriteTemplate, PERSON_X, PERSON_Y, 0); LoadPalette(sOakSpritePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sOakSpritePalette)); gSprites[spriteId].oam.paletteNum = PERSON_PAL_NUM; } else if (fcPersonIdx == FAMECHECKER_BILL) { spriteId = CreateSprite(&sBillSpriteTemplate, PERSON_X, PERSON_Y, 0); LoadPalette(sBillSpritePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sBillSpritePalette)); gSprites[spriteId].oam.paletteNum = PERSON_PAL_NUM; } else { spriteId = CreateTrainerPicSprite(sFameCheckerTrainerPicIdxs[fcPersonIdx], TRUE, PERSON_X, PERSON_Y, PERSON_PAL_NUM, TAG_NONE); } gSprites[spriteId].callback = SpriteCB_FCSpinningPokeball; if (gSaveBlock1Ptr->fameChecker[fcPersonIdx].pickState == FCPICKSTATE_SILHOUETTE) LoadPalette(sSilhouettePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sSilhouettePalette)); return spriteId; } static void DestroyPersonPicSprite(u8 taskId, u16 who) { s16 * data = gTasks[taskId].data; u16 who_copy = who; if (who == sFameCheckerData->numUnlockedPersons - 1) who_copy = who - 1; if ( sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_DAISY || sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_MRFUJI || sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_OAK || sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_BILL ) DestroySprite(&gSprites[data[2]]); else FreeAndDestroyTrainerPicSprite(data[2]); } static void UpdateIconDescriptionBox(u8 whichText) { s32 width; u32 idx = 6 * sFameCheckerData->unlockedPersons[FameCheckerGetCursorY()] + whichText; HandleFlavorTextModeSwitch(TRUE); gIconDescriptionBoxIsOpen = 1; FillWindowPixelRect(FCWINDOWID_ICONDESC, PIXEL_FILL(0), 0, 0, 0x58, 0x20); width = (0x54 - GetStringWidth(FONT_SMALL, sFlavorTextOriginLocationTexts[idx], 0)) / 2; AddTextPrinterParameterized4(FCWINDOWID_ICONDESC, FONT_SMALL, width, 0, 0, 2, sTextColor_DkGrey, -1, sFlavorTextOriginLocationTexts[idx]); StringExpandPlaceholders(gStringVar1, sFlavorTextOriginObjectNameTexts[idx]); width = (0x54 - GetStringWidth(FONT_SMALL, gStringVar1, 0)) / 2; AddTextPrinterParameterized4(FCWINDOWID_ICONDESC, FONT_SMALL, width, 10, 0, 2, sTextColor_DkGrey, -1, gStringVar1); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_ICONDESC); } static void UpdateIconDescriptionBoxOff(void) { HandleFlavorTextModeSwitch(FALSE); gIconDescriptionBoxIsOpen = 0xFF; } static void FC_CreateListMenu(void) { InitListMenuTemplate(); sFameCheckerData->numUnlockedPersons = FC_PopulateListMenu(); sFameCheckerData->listMenuTaskId = ListMenuInit(&gFameChecker_ListMenuTemplate, 0, 0); FC_PutWindowTilemapAndCopyWindowToVramMode3_2(FCWINDOWID_LIST); } static void InitListMenuTemplate(void) { gFameChecker_ListMenuTemplate.items = sListMenuItems; gFameChecker_ListMenuTemplate.moveCursorFunc = FC_MoveCursorFunc; gFameChecker_ListMenuTemplate.itemPrintFunc = NULL; gFameChecker_ListMenuTemplate.totalItems = 1; gFameChecker_ListMenuTemplate.maxShowed = 1; gFameChecker_ListMenuTemplate.windowId = FCWINDOWID_LIST; gFameChecker_ListMenuTemplate.header_X = 0; gFameChecker_ListMenuTemplate.item_X = 8; gFameChecker_ListMenuTemplate.cursor_X = 0; gFameChecker_ListMenuTemplate.upText_Y = 4; gFameChecker_ListMenuTemplate.cursorPal = 2; gFameChecker_ListMenuTemplate.fillValue = 0; gFameChecker_ListMenuTemplate.cursorShadowPal = 3; gFameChecker_ListMenuTemplate.lettersSpacing = 0; gFameChecker_ListMenuTemplate.itemVerticalPadding = 0; gFameChecker_ListMenuTemplate.scrollMultiple = 0; gFameChecker_ListMenuTemplate.fontId = FONT_NORMAL; gFameChecker_ListMenuTemplate.cursorKind = 0; } static void FC_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) { u16 listMenuTopIdx; u8 taskId; u16 personIdx; sLastMenuIdx = 0; personIdx = sFameCheckerData->listMenuTopIdx2 + sFameCheckerData->listMenuDrawnSelIdx; FC_DoMoveCursor(itemIndex, onInit); taskId = FindTaskIdByFunc(Task_TopMenuHandleInput); if (taskId != 0xFF) { struct Task *task = &gTasks[taskId]; PlaySE(SE_SELECT); task->data[1] = 0; ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listMenuTopIdx, NULL); sFameCheckerData->listMenuTopIdx = listMenuTopIdx; if (itemIndex != sFameCheckerData->numUnlockedPersons - 1) { DestroyAllFlavorTextIcons(); CreateAllFlavorTextIcons(itemIndex); if (sFameCheckerData->inPickMode) { if (!sFameCheckerData->pickModeOverCancel) { DestroyPersonPicSprite(taskId, personIdx); sLastMenuIdx = itemIndex; task->func = Task_SwitchToPickMode; } else { gSprites[task->data[2]].invisible = FALSE; sFameCheckerData->pickModeOverCancel = FALSE; gSprites[task->data[2]].data[0] = 0; GetPickModeText(); } } else { FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX); } } else { PrintCancelDescription(); if (sFameCheckerData->inPickMode) { gSprites[task->data[2]].invisible = TRUE; sFameCheckerData->pickModeOverCancel = TRUE; } else { u32 i; for (i = 0; i < 6; i++) { gSprites[sFameCheckerData->spriteIds[i]].invisible = TRUE; } } } } } static void Task_SwitchToPickMode(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[2] = CreatePersonPicSprite(sFameCheckerData->unlockedPersons[sLastMenuIdx]); gSprites[task->data[2]].data[0] = 0; GetPickModeText(); task->func = Task_TopMenuHandleInput; } static void PrintCancelDescription(void) { FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20); AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, FONT_NORMAL, gFameCheckerText_FameCheckerWillBeClosed, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX); } static void FC_DoMoveCursor(s32 itemIndex, bool8 onInit) { u16 listY; u16 cursorY; u16 who; ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listY, &cursorY); who = listY + cursorY; AddTextPrinterParameterized4(FCWINDOWID_LIST, FONT_NORMAL, 8, 14 * cursorY + 4, 0, 0, sTextColor_Green, 0, sListMenuItems[itemIndex].label); if (!onInit) { if (listY < sFameCheckerData->listMenuTopIdx2) sFameCheckerData->listMenuDrawnSelIdx++; else if (listY > sFameCheckerData->listMenuTopIdx2 && who != sFameCheckerData->numUnlockedPersons - 1) sFameCheckerData->listMenuDrawnSelIdx--; AddTextPrinterParameterized4(FCWINDOWID_LIST, FONT_NORMAL, 8, 14 * sFameCheckerData->listMenuDrawnSelIdx + 4, 0, 0, sTextColor_DkGrey, 0, sListMenuItems[sFameCheckerData->listMenuCurIdx].label); } sFameCheckerData->listMenuCurIdx = itemIndex; sFameCheckerData->listMenuDrawnSelIdx = cursorY; sFameCheckerData->listMenuTopIdx2 = listY; } static u8 FC_PopulateListMenu(void) { u8 nitems = 0; u32 i; for (i = 0; i < NUM_FAMECHECKER_PERSONS; i++) { u8 fameCheckerIdx = AdjustGiovanniIndexIfBeatenInGym(i); if (gSaveBlock1Ptr->fameChecker[fameCheckerIdx].pickState != FCPICKSTATE_NO_DRAW) { if (sTrainerIdxs[fameCheckerIdx] < FC_NONTRAINER_START) { sListMenuItems[nitems].label = gTrainers[sTrainerIdxs[fameCheckerIdx]].trainerName; sListMenuItems[nitems].index = nitems; } else { sListMenuItems[nitems].label = sNonTrainerNamePointers[sTrainerIdxs[fameCheckerIdx] - FC_NONTRAINER_START]; sListMenuItems[nitems].index = nitems; } sFameCheckerData->unlockedPersons[nitems] = fameCheckerIdx; nitems++; } } sListMenuItems[nitems].label = gFameCheckerText_Cancel; sListMenuItems[nitems].index = nitems; sFameCheckerData->unlockedPersons[nitems] = 0xFF; nitems++; gFameChecker_ListMenuTemplate.totalItems = nitems; if (nitems < 5) gFameChecker_ListMenuTemplate.maxShowed = nitems; else gFameChecker_ListMenuTemplate.maxShowed = 5; return nitems; } static void FC_PutWindowTilemapAndCopyWindowToVramMode3_2(u8 windowId) { PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); } static void FC_CreateScrollIndicatorArrowPair(void) { struct ScrollArrowsTemplate template = { 2, 40, 26, 3, 40, 100, 0, 0, SPRITETAG_SCROLL_INDICATORS, 0xFFFF, 1, }; if (sFameCheckerData->numUnlockedPersons > 5) { template.fullyUpThreshold = 0; template.fullyDownThreshold = sFameCheckerData->numUnlockedPersons - 5; sFameCheckerData->scrollIndicatorPairTaskId = AddScrollIndicatorArrowPair(&template, &sFameCheckerData->listMenuTopIdx); } } static void FreeListMenuSelectorArrowPairResources(void) { if (sFameCheckerData->numUnlockedPersons > 5) RemoveScrollIndicatorArrowPair(sFameCheckerData->scrollIndicatorPairTaskId); } static u16 FameCheckerGetCursorY(void) { u16 listY, cursorY; ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listY, &cursorY); return listY + cursorY; } static void HandleFlavorTextModeSwitch(bool8 state) { if (sFameCheckerData->viewingFlavorText != state) { u8 taskId = FindTaskIdByFunc(Task_FCOpenOrCloseInfoBox); if (taskId == 0xFF) taskId = CreateTask(Task_FCOpenOrCloseInfoBox, 8); gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 4; if (state == TRUE) { gTasks[taskId].data[2] = 1; sFameCheckerData->viewingFlavorText = TRUE; } else { gTasks[taskId].data[2] = 4; sFameCheckerData->viewingFlavorText = FALSE; } } } static void Task_FCOpenOrCloseInfoBox(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (--task->data[1] == 0) { UpdateInfoBoxTilemap(1, 0); task->data[1] = 4; task->data[0]++; } break; case 1: if (--task->data[1] == 0) { UpdateInfoBoxTilemap(1, task->data[2]); DestroyTask(taskId); } break; } } static void UpdateInfoBoxTilemap(u8 bg, s16 state) { if (state == 0 || state == 3) { FillBgTilemapBufferRect(bg, 0x8C, 14, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0xA1, 15, 10, 10, 1, 1); FillBgTilemapBufferRect(bg, 0x8D, 25, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x8E, 26, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x8F, 14, 11, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x00, 15, 11, 11, 1, 1); FillBgTilemapBufferRect(bg, 0x90, 26, 11, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x91, 14, 12, 1, 1, 1); FillBgTilemapBufferRect(bg, 0xA3, 15, 12, 10, 1, 1); FillBgTilemapBufferRect(bg, 0x92, 25, 12, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x93, 26, 12, 1, 1, 1); } else if (state == 1) { FillBgTilemapBufferRect(bg, 0x9B, 14, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x9C, 15, 10, 11, 1, 1); FillBgTilemapBufferRect(bg, 0x96, 26, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x9D, 14, 11, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x00, 15, 11, 11, 1, 1); FillBgTilemapBufferRect(bg, 0x90, 26, 11, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x9E, 14, 12, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x9F, 15, 12, 11, 1, 1); FillBgTilemapBufferRect(bg, 0x99, 26, 12, 1, 1, 1); } else if (state == 2) { FillBgTilemapBufferRect(bg, 0x94, 14, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x95, 15, 10, 11, 1, 1); FillBgTilemapBufferRect(bg, 0x96, 26, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x8F, 14, 11, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x9A, 15, 11, 11, 1, 1); FillBgTilemapBufferRect(bg, 0x90, 26, 11, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x97, 14, 12, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x98, 15, 12, 11, 1, 1); FillBgTilemapBufferRect(bg, 0x99, 26, 12, 1, 1, 1); } else if (state == 4) { FillBgTilemapBufferRect(bg, 0x83, 14, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0xA0, 15, 10, 10, 1, 1); FillBgTilemapBufferRect(bg, 0x84, 25, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x85, 26, 10, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x86, 14, 11, 1, 1, 1); FillBgTilemapBufferRect(bg, 0xA2, 15, 11, 10, 1, 1); FillBgTilemapBufferRect(bg, 0x87, 25, 11, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x88, 26, 11, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x83, 14, 12, 1, 1, 1); FillBgTilemapBufferRect(bg, 0xA0, 15, 12, 10, 1, 1); FillBgTilemapBufferRect(bg, 0x84, 25, 12, 1, 1, 1); FillBgTilemapBufferRect(bg, 0x85, 26, 12, 1, 1, 1); } else if (state == 5) { FillBgTilemapBufferRect(bg, 0x00, 14, 10, 13, 3, 1); } CopyBgTilemapBufferToVram(bg); } static void PlaceListMenuCursor(bool8 isActive) { u16 cursorY = ListMenuGetYCoordForPrintingArrowCursor(sFameCheckerData->listMenuTaskId); if (isActive == TRUE) AddTextPrinterParameterized4(FCWINDOWID_LIST, FONT_NORMAL, 0, cursorY, 0, 0, sTextColor_DkGrey, 0, gText_SelectorArrow2); else AddTextPrinterParameterized4(FCWINDOWID_LIST, FONT_NORMAL, 0, cursorY, 0, 0, sTextColor_White, 0, gText_SelectorArrow2); } ================================================ FILE: src/faraway_island.c ================================================ #include "global.h" #include "event_data.h" #include "event_object_movement.h" #include "field_weather.h" #include "fieldmap.h" #include "metatile_behavior.h" #include "sprite.h" #include "constants/event_objects.h" #include "constants/field_effects.h" #include "constants/maps.h" #include "constants/metatile_behaviors.h" static u8 GetValidMewMoveDirection(u8); static bool8 ShouldMewMoveNorth(struct ObjectEvent*, u8); static bool8 ShouldMewMoveSouth(struct ObjectEvent*, u8); static bool8 ShouldMewMoveEast(struct ObjectEvent*, u8); static bool8 ShouldMewMoveWest(struct ObjectEvent*, u8); static u8 GetRandomMewDirectionCandidate(u8); static bool8 CanMewMoveToCoords(s16, s16); static EWRAM_DATA u8 sGrassSpriteId = 0; static s16 sPlayerToMewDeltaX; static s16 sPlayerToMewDeltaY; static u8 sMewDirectionCandidates[4]; extern const struct SpritePalette gSpritePalette_GeneralFieldEffect1; //gSpritePalette_GeneralFieldEffect1 in Emerald? extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[]; static const s16 sFarawayIslandRockCoords[4][2] = { {14 + 7, 9 + 7}, {18 + 7, 9 + 7}, { 9 + 7, 10 + 7}, {13 + 7, 13 + 7}, }; static u8 GetMewObjectEventId(void) { u8 objectEventId; TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); return objectEventId; } // When the player enters Faraway Island interior it begins a "hide and seek" minigame where Mew disappears into the grass // This function returns the direction Mew will take a step, and is run every time the player takes a step u32 GetMewMoveDirection(void) { u32 i; int mewSafeFromTrap; struct ObjectEvent *mew = &gObjectEvents[GetMewObjectEventId()]; sPlayerToMewDeltaX = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x - mew->currentCoords.x; sPlayerToMewDeltaY = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y - mew->currentCoords.y; for (i = 0; i < NELEMS(sMewDirectionCandidates); i++) sMewDirectionCandidates[i] = DIR_NONE; // Player hasn't moved (just facing new direction), don't move if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x == gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x && gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y == gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y) { return DIR_NONE; } // Mew is invisible except for every 8th step if (VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % 8 == 0) mew->invisible = FALSE; else mew->invisible = TRUE; // Mew will stay in place for 1 step after its visible if (VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % 9 == 0) return DIR_NONE; // Below loop is for Mew to try to avoid getting trapped between the player and a rock for (i = 0; i < NELEMS(sFarawayIslandRockCoords); i++) { if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x == sFarawayIslandRockCoords[i][0]) { mewSafeFromTrap = FALSE; if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y < sFarawayIslandRockCoords[i][1]) { if (mew->currentCoords.y <= sFarawayIslandRockCoords[i][1]) mewSafeFromTrap = TRUE; } else { if (mew->currentCoords.y >= sFarawayIslandRockCoords[i][1]) mewSafeFromTrap = TRUE; } if (!mewSafeFromTrap) { if (sPlayerToMewDeltaX > 0) { if (mew->currentCoords.x + 1 == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x) { if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y)) return DIR_EAST; } } else if (sPlayerToMewDeltaX < 0) { if (mew->currentCoords.x - 1 == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x) { if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y)) return DIR_WEST; } } if (mew->currentCoords.x == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x) { if (sPlayerToMewDeltaY > 0) { if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1)) return DIR_NORTH; } else { if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1)) return DIR_SOUTH; } } } } if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y == sFarawayIslandRockCoords[i][1]) { mewSafeFromTrap = FALSE; if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x < sFarawayIslandRockCoords[i][0]) { if (mew->currentCoords.x <= sFarawayIslandRockCoords[i][0]) mewSafeFromTrap = TRUE; } else { if (mew->currentCoords.x >= sFarawayIslandRockCoords[i][0]) mewSafeFromTrap = TRUE; } if (!mewSafeFromTrap) { if (sPlayerToMewDeltaY > 0) { if (mew->currentCoords.y + 1 == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y) { if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1)) return DIR_SOUTH; } } else if (sPlayerToMewDeltaY < 0) { if (mew->currentCoords.y - 1 == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y) { if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1)) return DIR_NORTH; } } if (mew->currentCoords.y == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y) { if (sPlayerToMewDeltaX > 0) { if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y)) return DIR_WEST; } else { if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y)) return DIR_EAST; } } } } } // Check if Mew can move in any direction without getting closer to the player // If so load into sMewDirectionCandidates // If Mew can move in two of the checked directions, choose one randomly if (ShouldMewMoveNorth(mew, 0)) { if (ShouldMewMoveEast(mew, 1)) return GetRandomMewDirectionCandidate(2); else if (ShouldMewMoveWest(mew, 1)) return GetRandomMewDirectionCandidate(2); else return DIR_NORTH; } if (ShouldMewMoveSouth(mew, 0)) { if (ShouldMewMoveEast(mew, 1)) return GetRandomMewDirectionCandidate(2); else if (ShouldMewMoveWest(mew, 1)) return GetRandomMewDirectionCandidate(2); else return DIR_SOUTH; } if (ShouldMewMoveEast(mew, 0)) { if (ShouldMewMoveNorth(mew, 1)) return GetRandomMewDirectionCandidate(2); else if (ShouldMewMoveSouth(mew, 1)) return GetRandomMewDirectionCandidate(2); else return DIR_EAST; } if (ShouldMewMoveWest(mew, 0)) { if (ShouldMewMoveNorth(mew, 1)) return GetRandomMewDirectionCandidate(2); else if (ShouldMewMoveSouth(mew, 1)) return GetRandomMewDirectionCandidate(2); else return DIR_WEST; } // If this point is reached, Mew cannot move without getting closer to the player // Avoid player on same Y, try move North/South if (sPlayerToMewDeltaY == 0) { if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y > mew->currentCoords.y) { if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1)) return DIR_NORTH; } if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y < mew->currentCoords.y) { if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1)) return DIR_SOUTH; } if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1)) return DIR_NORTH; if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1)) return DIR_SOUTH; } // Avoid player on same X, try move West/East if (sPlayerToMewDeltaX == 0) { if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x > mew->currentCoords.x) { if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y)) return DIR_WEST; } if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x < mew->currentCoords.x) { if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y)) return DIR_EAST; } if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y)) return DIR_EAST; if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y)) return DIR_WEST; } // Can't avoid player on axis, move any valid direction return GetValidMewMoveDirection(DIR_NONE); } // Mew can move to any Tall/Long Grass metatile the player isn't currently on static bool8 CanMewMoveToCoords(s16 x, s16 y) { if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x == x && gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y == y) { return FALSE; } return MetatileBehavior_IsPokeGrass(MapGridGetMetatileBehaviorAt(x, y)); } // Last ditch effort to move, clear move candidates and try all directions again static u8 GetValidMewMoveDirection(u8 ignoredDir) { u32 i; u8 count = 0; struct ObjectEvent *mew = &gObjectEvents[GetMewObjectEventId()]; for (i = 0; i < NELEMS(sMewDirectionCandidates); i++) sMewDirectionCandidates[i] = DIR_NONE; if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1) == TRUE && ignoredDir != DIR_NORTH) { sMewDirectionCandidates[count] = DIR_NORTH; count++; } if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y) == TRUE && ignoredDir != DIR_EAST) { sMewDirectionCandidates[count] = DIR_EAST; count++; } if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1) == TRUE && ignoredDir != DIR_SOUTH) { sMewDirectionCandidates[count] = DIR_SOUTH; count++; } if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y) == TRUE && ignoredDir != DIR_WEST) { sMewDirectionCandidates[count] = DIR_WEST; count++; } if (count > 1) return sMewDirectionCandidates[VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % count]; else return sMewDirectionCandidates[0]; } void UpdateFarawayIslandStepCounter(void) { u16 steps = VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER); if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(FARAWAY_ISLAND_INTERIOR) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FARAWAY_ISLAND_INTERIOR)) { steps++; if (steps >= 9999) VarSet(VAR_FARAWAY_ISLAND_STEP_COUNTER, 0); else VarSet(VAR_FARAWAY_ISLAND_STEP_COUNTER, steps); } } bool8 ObjectEventIsFarawayIslandMew(struct ObjectEvent *objectEvent) { if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(FARAWAY_ISLAND_INTERIOR) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FARAWAY_ISLAND_INTERIOR)) { if (objectEvent->graphicsId == OBJ_EVENT_GFX_MEW) return TRUE; } return FALSE; } bool8 IsMewPlayingHideAndSeek(void) { if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(FARAWAY_ISLAND_INTERIOR) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FARAWAY_ISLAND_INTERIOR)) { if (FlagGet(FLAG_FOUGHT_MEW) != TRUE && FlagGet(FLAG_HIDE_MEW) != TRUE) return TRUE; } return FALSE; } // Every 4th step Mew will shake the grass it steps into // Otherwise its movement leaves grass undisturbed bool8 ShouldMewShakeGrass(struct ObjectEvent *objectEvent) { if (VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) != 0xFFFF && VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % 4 == 0) return TRUE; return FALSE; } void SetMewAboveGrass(void) { s16 x; s16 y; u8 spriteId; struct ObjectEvent *mew = &gObjectEvents[GetMewObjectEventId()]; mew->invisible = FALSE; if (gSpecialVar_0x8004 == 1) { // For after battle where Mew should still be present (e.g. if ran from battle) mew->fixedPriority = 1; gSprites[mew->spriteId].subspriteMode = SUBSPRITES_IGNORE_PRIORITY; gSprites[mew->spriteId].subpriority = 1; } else { // Mew emerging from grass when found // Also do field effect for grass shaking as it emerges VarSet(VAR_FARAWAY_ISLAND_STEP_COUNTER, 0xFFFF); mew->fixedPriority = 1; gSprites[mew->spriteId].subspriteMode = SUBSPRITES_IGNORE_PRIORITY; if (gSpecialVar_Facing != DIR_NORTH) gSprites[mew->spriteId].subpriority = 1; LoadSpritePalette(&gSpritePalette_GeneralFieldEffect1); UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(gSpritePalette_GeneralFieldEffect1.tag)); x = mew->currentCoords.x; y = mew->currentCoords.y; SetSpritePosToOffsetMapCoords(&x, &y, 8, 8); sGrassSpriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_LONG_GRASS], x, y, gSprites[mew->spriteId].subpriority - 1); gSpecialVar_Result = sGrassSpriteId; if (sGrassSpriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[sGrassSpriteId]; sprite->coordOffsetEnabled = 1; sprite->oam.priority = 2; sprite->callback = SpriteCallbackDummy; } } } //This doesn't appear to be needed, and calling it as a special //messes with the camera, so I've removed the call. void DestroyMewEmergingGrassSprite(void) { if (sGrassSpriteId != MAX_SPRITES) DestroySprite(&gSprites[sGrassSpriteId]); } static bool8 ShouldMewMoveNorth(struct ObjectEvent *mew, u8 index) { if (sPlayerToMewDeltaY > 0 && CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1)) { sMewDirectionCandidates[index] = DIR_NORTH; return TRUE; } return FALSE; } static bool8 ShouldMewMoveEast(struct ObjectEvent *mew, u8 index) { if (sPlayerToMewDeltaX < 0 && CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y)) { sMewDirectionCandidates[index] = DIR_EAST; return TRUE; } return FALSE; } static bool8 ShouldMewMoveSouth(struct ObjectEvent *mew, u8 index) { if (sPlayerToMewDeltaY < 0 && CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1)) { sMewDirectionCandidates[index] = DIR_SOUTH; return TRUE; } return FALSE; } static bool8 ShouldMewMoveWest(struct ObjectEvent *mew, u8 index) { if (sPlayerToMewDeltaX > 0 && CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y)) { sMewDirectionCandidates[index] = DIR_WEST; return TRUE; } return FALSE; } static u8 GetRandomMewDirectionCandidate(u8 numDirections) { return sMewDirectionCandidates[VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % numDirections]; } ================================================ FILE: src/field_camera.c ================================================ #include "global.h" #include "gflib.h" #include "field_camera.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "event_object_movement.h" #include "new_menu_helpers.h" #include "overworld.h" EWRAM_DATA bool8 gBikeCameraAheadPanback = FALSE; // Static type declarations struct FieldCameraOffset { u8 xPixelOffset; u8 yPixelOffset; u8 xTileOffset; u8 yTileOffset; bool8 copyBGToVRAM; }; // static functions static void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout); static void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout); static void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout); static void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout); static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *a, s32 x, s32 y); static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout); static void DrawMetatileAt(const struct MapLayout *mapLayout, u16, int, int); static void DrawMetatile(s32 a, const u16 *b, u16 c); static void CameraPanningCB_PanAhead(void); // IWRAM bss vars static struct FieldCameraOffset sFieldCameraOffset; static s16 sHorizontalCameraPan; static s16 sVerticalCameraPan; static u8 sBikeCameraPanFlag; static void (*sFieldCameraPanningCallback)(void); struct CameraObject gFieldCamera; u16 gTotalCameraPixelOffsetY; u16 gTotalCameraPixelOffsetX; // text static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraOffset *cameraOffset) { cameraOffset->xTileOffset = 0; cameraOffset->yTileOffset = 0; cameraOffset->xPixelOffset = 0; cameraOffset->yPixelOffset = 0; cameraOffset->copyBGToVRAM = TRUE; } static void tilemap_move_something(struct FieldCameraOffset *cameraOffset, u32 b, u32 c) { cameraOffset->xTileOffset += b; cameraOffset->xTileOffset %= 32; cameraOffset->yTileOffset += c; cameraOffset->yTileOffset %= 32; } static void coords8_add(struct FieldCameraOffset *cameraOffset, u32 b, u32 c) { cameraOffset->xPixelOffset += b; cameraOffset->yPixelOffset += c; } void move_tilemap_camera_to_upper_left_corner(void) { move_tilemap_camera_to_upper_left_corner_(&sFieldCameraOffset); } void FieldUpdateBgTilemapScroll(void) { u32 r4, r5; r5 = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan; r4 = sVerticalCameraPan + sFieldCameraOffset.yPixelOffset + 8; SetGpuReg(REG_OFFSET_BG1HOFS, r5); SetGpuReg(REG_OFFSET_BG1VOFS, r4); SetGpuReg(REG_OFFSET_BG2HOFS, r5); SetGpuReg(REG_OFFSET_BG2VOFS, r4); SetGpuReg(REG_OFFSET_BG3HOFS, r5); SetGpuReg(REG_OFFSET_BG3VOFS, r4); } void FieldCameraGetPixelOffsetAtGround(s16 *hofs_p, s16 *vofs_p) { *hofs_p = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan; *vofs_p = sFieldCameraOffset.yPixelOffset + sVerticalCameraPan + 8; } void DrawWholeMapView(void) { DrawWholeMapViewInternal(gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y, gMapHeader.mapLayout); // sFieldCameraOffset.copyBGToVRAM = TRUE; } static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout) { u32 i; u32 j; u32 r6; u8 temp; for (i = 0; i < 32; i += 2) { temp = sFieldCameraOffset.yTileOffset + i; if (temp >= 32) temp -= 32; r6 = temp * 32; for (j = 0; j < 32; j += 2) { temp = sFieldCameraOffset.xTileOffset + j; if (temp >= 32) temp -= 32; DrawMetatileAt(mapLayout, r6 + temp, x + j / 2, y + i / 2); } } } static void RedrawMapSlicesForCameraUpdate(struct FieldCameraOffset *cameraOffset, int x, int y) { const struct MapLayout *mapLayout = gMapHeader.mapLayout; if (x > 0) RedrawMapSliceWest(cameraOffset, mapLayout); if (x < 0) RedrawMapSliceEast(cameraOffset, mapLayout); if (y > 0) RedrawMapSliceNorth(cameraOffset, mapLayout); if (y < 0) RedrawMapSliceSouth(cameraOffset, mapLayout); cameraOffset->copyBGToVRAM = TRUE; } static void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout) { u32 i; u8 temp; u32 r7; temp = cameraOffset->yTileOffset + 28; if (temp >= 32) temp -= 32; r7 = temp * 32; for (i = 0; i < 32; i += 2) { temp = cameraOffset->xTileOffset + i; if (temp >= 32) temp -= 32; DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y + 14); } } static void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout) { u32 i; u8 temp; u32 r7 = cameraOffset->yTileOffset * 32; for (i = 0; i < 32; i += 2) { temp = cameraOffset->xTileOffset + i; if (temp >= 32) temp -= 32; DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y); } } static void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout) { u32 i; u8 temp; u32 r6 = cameraOffset->xTileOffset; for (i = 0; i < 32; i += 2) { temp = cameraOffset->yTileOffset + i; if (temp >= 32) temp -= 32; DrawMetatileAt(mapLayout, temp * 32 + r6, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y + i / 2); } } static void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout) { u32 i; u8 temp; u8 r5 = cameraOffset->xTileOffset + 28; if (r5 >= 32) r5 -= 32; for (i = 0; i < 32; i += 2) { temp = cameraOffset->yTileOffset + i; if (temp >= 32) temp -= 32; DrawMetatileAt(mapLayout, temp * 32 + r5, gSaveBlock1Ptr->pos.x + 14, gSaveBlock1Ptr->pos.y + i / 2); } } void CurrentMapDrawMetatileAt(int x, int y) { int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y); if (offset >= 0) { DrawMetatileAt(gMapHeader.mapLayout, offset, x, y); // sFieldCameraOffset.copyBGToVRAM = TRUE; } } void DrawDoorMetatileAt(int x, int y, const u16 *tiles) { int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y); if (offset >= 0) { DrawMetatile(1, tiles, offset); // sFieldCameraOffset.copyBGToVRAM = TRUE; } } static void DrawMetatileAt(const struct MapLayout *mapLayout, u16 offset, int x, int y) { u16 metatileId = MapGridGetMetatileIdAt(x, y); const u16 *metatiles; if (metatileId > NUM_METATILES_TOTAL) metatileId = 0; if (metatileId < NUM_METATILES_IN_PRIMARY) metatiles = mapLayout->primaryTileset->metatiles; else { metatiles = mapLayout->secondaryTileset->metatiles; metatileId -= NUM_METATILES_IN_PRIMARY; } DrawMetatile(MapGridGetMetatileLayerTypeAt(x, y), metatiles + metatileId * 8, offset); } static void DrawMetatile(s32 metatileLayerType, const u16 *tiles, u16 offset) { switch (metatileLayerType) { case METATILE_LAYER_TYPE_SPLIT: // Draw metatile's bottom layer to the bottom background layer. gBGTilemapBuffers3[offset] = tiles[0]; gBGTilemapBuffers3[offset + 1] = tiles[1]; gBGTilemapBuffers3[offset + 0x20] = tiles[2]; gBGTilemapBuffers3[offset + 0x21] = tiles[3]; // Draw transparent tiles to the middle background layer. gBGTilemapBuffers1[offset] = 0; gBGTilemapBuffers1[offset + 1] = 0; gBGTilemapBuffers1[offset + 0x20] = 0; gBGTilemapBuffers1[offset + 0x21] = 0; // Draw metatile's top layer to the top background layer. gBGTilemapBuffers2[offset] = tiles[4]; gBGTilemapBuffers2[offset + 1] = tiles[5]; gBGTilemapBuffers2[offset + 0x20] = tiles[6]; gBGTilemapBuffers2[offset + 0x21] = tiles[7]; break; case METATILE_LAYER_TYPE_COVERED: // Draw metatile's bottom layer to the bottom background layer. gBGTilemapBuffers3[offset] = tiles[0]; gBGTilemapBuffers3[offset + 1] = tiles[1]; gBGTilemapBuffers3[offset + 0x20] = tiles[2]; gBGTilemapBuffers3[offset + 0x21] = tiles[3]; // Draw metatile's top layer to the middle background layer. gBGTilemapBuffers1[offset] = tiles[4]; gBGTilemapBuffers1[offset + 1] = tiles[5]; gBGTilemapBuffers1[offset + 0x20] = tiles[6]; gBGTilemapBuffers1[offset + 0x21] = tiles[7]; // Draw transparent tiles to the top background layer. gBGTilemapBuffers2[offset] = 0; gBGTilemapBuffers2[offset + 1] = 0; gBGTilemapBuffers2[offset + 0x20] = 0; gBGTilemapBuffers2[offset + 0x21] = 0; break; case METATILE_LAYER_TYPE_NORMAL: // Draw garbage to the bottom background layer. gBGTilemapBuffers3[offset] = 0x3014; gBGTilemapBuffers3[offset + 1] = 0x3014; gBGTilemapBuffers3[offset + 0x20] = 0x3014; gBGTilemapBuffers3[offset + 0x21] = 0x3014; // Draw metatile's bottom layer to the middle background layer. gBGTilemapBuffers1[offset] = tiles[0]; gBGTilemapBuffers1[offset + 1] = tiles[1]; gBGTilemapBuffers1[offset + 0x20] = tiles[2]; gBGTilemapBuffers1[offset + 0x21] = tiles[3]; // Draw metatile's top layer to the top background layer, which covers object event sprites. gBGTilemapBuffers2[offset] = tiles[4]; gBGTilemapBuffers2[offset + 1] = tiles[5]; gBGTilemapBuffers2[offset + 0x20] = tiles[6]; gBGTilemapBuffers2[offset + 0x21] = tiles[7]; break; } ScheduleBgCopyTilemapToVram(1); ScheduleBgCopyTilemapToVram(2); ScheduleBgCopyTilemapToVram(3); } static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *cameraOffset, s32 x, s32 y) { x -= gSaveBlock1Ptr->pos.x; x *= 2; if (x >= 32 || x < 0) return -1; x = x + cameraOffset->xTileOffset; if (x >= 32) x -= 32; y = (y - gSaveBlock1Ptr->pos.y) * 2; if (y >= 32 || y < 0) return -1; y = y + cameraOffset->yTileOffset; if (y >= 32) y -= 32; return y * 32 + x; } static void CameraUpdateCallback(struct CameraObject *fieldCamera) { if (fieldCamera->spriteId != 0) { fieldCamera->movementSpeedX = gSprites[fieldCamera->spriteId].data[2]; fieldCamera->movementSpeedY = gSprites[fieldCamera->spriteId].data[3]; } } void ResetCameraUpdateInfo(void) { gFieldCamera.movementSpeedX = 0; gFieldCamera.movementSpeedY = 0; gFieldCamera.x = 0; gFieldCamera.y = 0; gFieldCamera.spriteId = 0; gFieldCamera.callback = NULL; } u32 InitCameraUpdateCallback(u8 trackedSpriteId) { if (gFieldCamera.spriteId != 0) DestroySprite(&gSprites[gFieldCamera.spriteId]); gFieldCamera.spriteId = AddCameraObject(trackedSpriteId); gFieldCamera.callback = CameraUpdateCallback; return 0; } void CameraUpdate(void) { int deltaX; int deltaY; int curMovementOffsetY; int curMovementOffsetX; int movementSpeedX; int movementSpeedY; if (gFieldCamera.callback != NULL) gFieldCamera.callback(&gFieldCamera); movementSpeedX = gFieldCamera.movementSpeedX; movementSpeedY = gFieldCamera.movementSpeedY; deltaX = 0; deltaY = 0; curMovementOffsetX = gFieldCamera.x; curMovementOffsetY = gFieldCamera.y; if (curMovementOffsetX == 0 && movementSpeedX != 0) { if (movementSpeedX > 0) deltaX = 1; else deltaX = -1; } if (curMovementOffsetY == 0 && movementSpeedY != 0) { if (movementSpeedY > 0) deltaY = 1; else deltaY = -1; } if (curMovementOffsetX != 0 && curMovementOffsetX == -movementSpeedX) { if (movementSpeedX > 0) deltaX = 1; else deltaX = -1; } if (curMovementOffsetY != 0 && curMovementOffsetY == -movementSpeedY) { if (movementSpeedY > 0) deltaX = 1; else deltaX = -1; } gFieldCamera.x += movementSpeedX; gFieldCamera.x = gFieldCamera.x - 16 * (gFieldCamera.x / 16); gFieldCamera.y += movementSpeedY; gFieldCamera.y = gFieldCamera.y - 16 * (gFieldCamera.y / 16); if (deltaX != 0 || deltaY != 0) { CameraMove(deltaX, deltaY); UpdateObjectEventsForCameraUpdate(deltaX, deltaY); // RotatingGatePuzzleCameraUpdate(deltaX, deltaY); // ResetBerryTreeSparkleFlags(); tilemap_move_something(&sFieldCameraOffset, deltaX * 2, deltaY * 2); RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2); } coords8_add(&sFieldCameraOffset, movementSpeedX, movementSpeedY); gTotalCameraPixelOffsetX -= movementSpeedX; gTotalCameraPixelOffsetY -= movementSpeedY; } void MoveCameraAndRedrawMap(int deltaX, int deltaY) // unused { CameraMove(deltaX, deltaY); UpdateObjectEventsForCameraUpdate(deltaX, deltaY); DrawWholeMapView(); gTotalCameraPixelOffsetX -= deltaX * 16; gTotalCameraPixelOffsetY -= deltaY * 16; } void CameraUpdateNoObjectRefresh(void) { int deltaX; int deltaY; int curMovementOffsetY; int curMovementOffsetX; int movementSpeedX; int movementSpeedY; if (gFieldCamera.callback != NULL) gFieldCamera.callback(&gFieldCamera); movementSpeedX = gFieldCamera.movementSpeedX; movementSpeedY = gFieldCamera.movementSpeedY; deltaX = 0; deltaY = 0; curMovementOffsetX = gFieldCamera.x; curMovementOffsetY = gFieldCamera.y; if (curMovementOffsetX == 0 && movementSpeedX != 0) { if (movementSpeedX > 0) deltaX = 1; else deltaX = -1; } if (curMovementOffsetY == 0 && movementSpeedY != 0) { if (movementSpeedY > 0) deltaY = 1; else deltaY = -1; } if (curMovementOffsetX != 0 && curMovementOffsetX == -movementSpeedX) { if (movementSpeedX > 0) deltaX = 1; else deltaX = -1; } if (curMovementOffsetY != 0 && curMovementOffsetY == -movementSpeedY) { if (movementSpeedY > 0) deltaX = 1; else deltaX = -1; } gFieldCamera.x += movementSpeedX; gFieldCamera.x = gFieldCamera.x - 16 * (gFieldCamera.x / 16); gFieldCamera.y += movementSpeedY; gFieldCamera.y = gFieldCamera.y - 16 * (gFieldCamera.y / 16); if (deltaX != 0 || deltaY != 0) { CameraMove(deltaX, deltaY); // UpdateObjectEventsForCameraUpdate(deltaX, deltaY); // RotatingGatePuzzleCameraUpdate(deltaX, deltaY); // ResetBerryTreeSparkleFlags(); tilemap_move_something(&sFieldCameraOffset, deltaX * 2, deltaY * 2); RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2); } coords8_add(&sFieldCameraOffset, movementSpeedX, movementSpeedY); // gTotalCameraPixelOffsetX -= movementSpeedX; // gTotalCameraPixelOffsetY -= movementSpeedY; } void SetCameraPanningCallback(void (*a)(void)) { sFieldCameraPanningCallback = a; } void SetCameraPanning(s16 a, s16 b) { sHorizontalCameraPan = a; sVerticalCameraPan = b + 32; } void InstallCameraPanAheadCallback(void) { sFieldCameraPanningCallback = CameraPanningCB_PanAhead; sBikeCameraPanFlag = FALSE; sHorizontalCameraPan = 0; sVerticalCameraPan = 32; } void UpdateCameraPanning(void) { if (sFieldCameraPanningCallback != NULL) sFieldCameraPanningCallback(); // Update sprite offset of overworld objects gSpriteCoordOffsetX = gTotalCameraPixelOffsetX - sHorizontalCameraPan; gSpriteCoordOffsetY = gTotalCameraPixelOffsetY - sVerticalCameraPan - 8; } static void CameraPanningCB_PanAhead(void) { u8 var; if (gBikeCameraAheadPanback == FALSE) { InstallCameraPanAheadCallback(); } else { // this code is never reached. if (gPlayerAvatar.tileTransitionState == 1) { sBikeCameraPanFlag ^= 1; if (sBikeCameraPanFlag == FALSE) return; } else { sBikeCameraPanFlag = FALSE; } var = GetPlayerMovementDirection(); if (var == 2) { if (sVerticalCameraPan > -8) sVerticalCameraPan -= 2; } else if (var == 1) { if (sVerticalCameraPan < 72) sVerticalCameraPan += 2; } else if (sVerticalCameraPan < 32) { sVerticalCameraPan += 2; } else if (sVerticalCameraPan > 32) { sVerticalCameraPan -= 2; } } } ================================================ FILE: src/field_control_avatar.c ================================================ #include "global.h" #include "gflib.h" #include "bike.h" #include "coord_event_weather.h" #include "daycare.h" #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" #include "faraway_island.h" #include "fieldmap.h" #include "field_control_avatar.h" #include "field_fadetransition.h" #include "field_player_avatar.h" #include "field_poison.h" #include "field_specials.h" #include "item_menu.h" #include "link.h" #include "map_name_popup.h" #include "wonder_news.h" #include "metatile_behavior.h" #include "overworld.h" #include "renewable_hidden_items.h" #include "quest_log.h" #include "safari_zone.h" #include "script.h" #include "start_menu.h" #include "trainer_see.h" #include "vs_seeker.h" #include "wild_encounter.h" #include "constants/songs.h" #include "constants/event_bg.h" #include "constants/event_objects.h" #include "constants/maps.h" #include "constants/metatile_behaviors.h" #include "constants/region_map_sections.h" #define SIGNPOST_POKECENTER 0 #define SIGNPOST_POKEMART 1 #define SIGNPOST_INDIGO_1 2 #define SIGNPOST_INDIGO_2 3 #define SIGNPOST_SAFARI 4 #define SIGNPOST_SCRIPTED 240 #define SIGNPOST_NA 255 static void QuestLogOverrideJoyVars(struct FieldInput *input, u16 *newKeys, u16 *heldKeys); static void Task_QuestLogPlayback_OpenStartMenu(u8 taskId); static void GetPlayerPosition(struct MapPosition * position); static void GetInFrontOfPlayerPosition(struct MapPosition * position); static u16 GetPlayerCurMetatileBehavior(void); static bool8 TryStartInteractionScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); static const u8 *GetInteractionScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); static const u8 *GetInteractedObjectEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); static const u8 *GetInteractedBackgroundEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); static const struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *, u16, u16, u8); static const u8 *GetInteractedMetatileScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); static const u8 *GetInteractedWaterScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); static bool8 TryStartStepBasedScript(struct MapPosition * position, u16 metatileBehavior, u16 playerDirection); static bool8 TryStartCoordEventScript(struct MapPosition * position); static bool8 TryStartMiscWalkingScripts(u16 metatileBehavior); static bool8 TryStartStepCountScript(u16 metatileBehavior); static void UpdateHappinessStepCounter(void); static bool8 UpdatePoisonStepCounter(void); static bool8 CheckStandardWildEncounter(u32 metatileAttributes); static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection); static u8 GetFacingSignpostType(u16 metatileBehvaior, u8 direction); static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition * position); static bool8 TryArrowWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); static bool8 TryStartWarpEventScript(struct MapPosition * position, u16 metatileBehavior); static bool8 IsWarpMetatileBehavior(u16 metatileBehavior); static void SetupWarp(struct MapHeader * mapHeader, s8 warpId, struct MapPosition * position); static bool8 IsArrowWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection); static s8 GetWarpEventAtMapPosition(struct MapHeader * mapHeader, struct MapPosition * mapPosition); static bool8 TryDoorWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); static s8 GetWarpEventAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z); static const u8 *GetCoordEventScriptAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z); static bool8 EnableAutoRun(void); static bool8 SwitchBikeGears(void); static bool32 TrySetupDiveEmergeScript(void); static bool32 TrySetupDiveDownScript(void); struct FieldInput gFieldInputRecord; void FieldClearPlayerInput(struct FieldInput *input) { input->pressedAButton = FALSE; input->checkStandardWildEncounter = FALSE; input->pressedStartButton = FALSE; input->pressedSelectButton = FALSE; input->heldDirection = FALSE; input->heldDirection2 = FALSE; input->tookStep = FALSE; input->pressedBButton = FALSE; input->pressedRButton = FALSE; input->input_field_1_0 = FALSE; input->input_field_1_1 = FALSE; input->input_field_1_2 = FALSE; input->input_field_1_3 = FALSE; input->dpadDirection = 0; } void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) { u8 runningState = gPlayerAvatar.runningState; u8 tileTransitionState = gPlayerAvatar.tileTransitionState; bool8 forcedMove = MetatileBehavior_IsForcedMovementTile(GetPlayerCurMetatileBehavior()); if (!ScriptContext_IsEnabled() && IsQuestLogInputDpad() == TRUE) { QuestLogOverrideJoyVars(input, &newKeys, &heldKeys); } if ((tileTransitionState == T_TILE_CENTER && forcedMove == FALSE) || tileTransitionState == T_NOT_MOVING) { if (GetPlayerSpeed() != PLAYER_SPEED_FASTEST) { if ((newKeys & START_BUTTON) && !(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED)) input->pressedStartButton = TRUE; if (!QL_IS_PLAYBACK_STATE) { if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED)) { if (newKeys & SELECT_BUTTON) input->pressedSelectButton = TRUE; if (newKeys & A_BUTTON) input->pressedAButton = TRUE; if (newKeys & B_BUTTON) input->pressedBButton = TRUE; if (newKeys & R_BUTTON) input->pressedRButton = TRUE; } } } if (!QL_IS_PLAYBACK_STATE) { if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT)) { input->heldDirection = TRUE; input->heldDirection2 = TRUE; } } } if (forcedMove == FALSE) { if (tileTransitionState == T_TILE_CENTER && runningState == MOVING) input->tookStep = TRUE; if (forcedMove == FALSE && tileTransitionState == T_TILE_CENTER) input->checkStandardWildEncounter = TRUE; } if (!QL_IS_PLAYBACK_STATE) { if (heldKeys & DPAD_UP) input->dpadDirection = DIR_NORTH; else if (heldKeys & DPAD_DOWN) input->dpadDirection = DIR_SOUTH; else if (heldKeys & DPAD_LEFT) input->dpadDirection = DIR_WEST; else if (heldKeys & DPAD_RIGHT) input->dpadDirection = DIR_EAST; } } static void QuestLogOverrideJoyVars(struct FieldInput *input, u16 *newKeys, u16 *heldKeys) { switch (GetRegisteredQuestLogInput()) { case QL_INPUT_OFF: break; case QL_INPUT_UP: *heldKeys = *newKeys = DPAD_UP; break; case QL_INPUT_DOWN: *heldKeys = *newKeys = DPAD_DOWN; break; case QL_INPUT_LEFT: *heldKeys = *newKeys = DPAD_LEFT; break; case QL_INPUT_RIGHT: *heldKeys = *newKeys = DPAD_RIGHT; break; case QL_INPUT_L: *heldKeys = *newKeys = L_BUTTON; break; case QL_INPUT_R: *heldKeys = *newKeys = R_BUTTON; break; case QL_INPUT_START: *heldKeys = *newKeys = START_BUTTON; break; case QL_INPUT_SELECT: *heldKeys = *newKeys = SELECT_BUTTON; break; } ClearQuestLogInputIsDpadFlag(); ClearQuestLogInput(); } int ProcessPlayerFieldInput(struct FieldInput *input) { struct MapPosition position; u8 playerDirection; u16 metatileBehavior; u32 metatileAttributes; ResetFacingNpcOrSignpostVars(); playerDirection = GetPlayerFacingDirection(); GetPlayerPosition(&position); metatileAttributes = MapGridGetMetatileAttributeAt(position.x, position.y, METATILE_ATTRIBUTES_ALL); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); FieldClearPlayerInput(&gFieldInputRecord); gFieldInputRecord.dpadDirection = input->dpadDirection; if (CheckForTrainersWantingBattle() == TRUE) return TRUE; if (TryRunOnFrameMapScript() == TRUE) return TRUE; if (input->pressedBButton && TrySetupDiveEmergeScript() == TRUE) return TRUE; if (input->tookStep) { IncrementGameStat(GAME_STAT_STEPS); WonderNews_IncrementStepCounter(); IncrementRenewableHiddenItemStepCounter(); RunMassageCooldownStepCounter(); IncrementResortGorgeousStepCounter(); IncrementBirthIslandRockStepCount(); UpdateBattleHouseStepCounter(); if (TryStartStepBasedScript(&position, metatileBehavior, playerDirection) == TRUE) { gFieldInputRecord.tookStep = TRUE; return TRUE; } } if (input->checkStandardWildEncounter) { if (input->dpadDirection == 0 || input->dpadDirection == playerDirection) { GetInFrontOfPlayerPosition(&position); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) { gFieldInputRecord.checkStandardWildEncounter = TRUE; return TRUE; } GetPlayerPosition(&position); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); } } if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileAttributes) == TRUE) { gFieldInputRecord.checkStandardWildEncounter = TRUE; return TRUE; } if (input->heldDirection && input->dpadDirection == playerDirection) { if (TryArrowWarp(&position, metatileBehavior, playerDirection) == TRUE) { gFieldInputRecord.heldDirection = TRUE; return TRUE; } } GetInFrontOfPlayerPosition(&position); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); if (input->heldDirection && input->dpadDirection == playerDirection) { if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) { gFieldInputRecord.heldDirection = TRUE; return TRUE; } } if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE) { gFieldInputRecord.pressedAButton = TRUE; return TRUE; } if (input->heldDirection2 && input->dpadDirection == playerDirection) { if (TryDoorWarp(&position, metatileBehavior, playerDirection) == TRUE) { gFieldInputRecord.heldDirection2 = TRUE; return TRUE; } } if (input->pressedAButton && TrySetupDiveDownScript() == TRUE) return TRUE; if (input->pressedStartButton) { gFieldInputRecord.pressedStartButton = TRUE; FlagSet(FLAG_OPENED_START_MENU); PlaySE(SE_WIN_OPEN); ShowStartMenu(); return TRUE; } if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE) { gFieldInputRecord.pressedSelectButton = TRUE; return TRUE; } if (input->pressedRButton && (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_ON_FOOT)) && EnableAutoRun()) return TRUE; //switch bike gears if (input->pressedBButton && (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) && GetCurrentRegionMapSectionId() != MAPSEC_ROUTE_17 && SwitchBikeGears()) return TRUE; return FALSE; } void FieldInput_HandleCancelSignpost(struct FieldInput * input) { if (ScriptContext_IsEnabled() == TRUE) { if (gWalkAwayFromSignInhibitTimer != 0) gWalkAwayFromSignInhibitTimer--; else if (CanWalkAwayToCancelMsgBox() == TRUE) { if (input->dpadDirection != 0 && GetPlayerFacingDirection() != input->dpadDirection) { if (IsMsgBoxWalkawayDisabled() == TRUE) return; if (input->dpadDirection == DIR_NORTH) RegisterQuestLogInput(QL_INPUT_UP); else if (input->dpadDirection == DIR_SOUTH) RegisterQuestLogInput(QL_INPUT_DOWN); else if (input->dpadDirection == DIR_WEST) RegisterQuestLogInput(QL_INPUT_LEFT); else if (input->dpadDirection == DIR_EAST) RegisterQuestLogInput(QL_INPUT_RIGHT); ScriptContext_SetupScript(EventScript_CancelMessageBox); LockPlayerFieldControls(); } else if (input->pressedStartButton) { ScriptContext_SetupScript(EventScript_CancelMessageBox); LockPlayerFieldControls(); if (!FuncIsActiveTask(Task_QuestLogPlayback_OpenStartMenu)) CreateTask(Task_QuestLogPlayback_OpenStartMenu, 8); } } } } static void Task_QuestLogPlayback_OpenStartMenu(u8 taskId) { if (!ArePlayerFieldControlsLocked()) { PlaySE(SE_WIN_OPEN); ShowStartMenu(); DestroyTask(taskId); } } static void GetPlayerPosition(struct MapPosition *position) { PlayerGetDestCoords(&position->x, &position->y); position->elevation = PlayerGetElevation(); } static void GetInFrontOfPlayerPosition(struct MapPosition *position) { s16 x, y; GetXYCoordsOneStepInFrontOfPlayer(&position->x, &position->y); PlayerGetDestCoords(&x, &y); if (MapGridGetElevationAt(x, y) != 0) position->elevation = PlayerGetElevation(); else position->elevation = 0; } static u16 GetPlayerCurMetatileBehavior(void) { s16 x, y; PlayerGetDestCoords(&x, &y); return MapGridGetMetatileBehaviorAt(x, y); } static bool8 TryStartInteractionScript(struct MapPosition *position, u16 metatileBehavior, u8 direction) { const u8 *script = GetInteractionScript(position, metatileBehavior, direction); if (script == NULL) return FALSE; // Don't play interaction sound for certain scripts. if (script != PalletTown_PlayersHouse_2F_EventScript_PC && script != EventScript_PC) PlaySE(SE_SELECT); ScriptContext_SetupScript(script); return TRUE; } static const u8 *GetInteractionScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) { const u8 *script = GetInteractedObjectEventScript(position, metatileBehavior, direction); if (script != NULL) return script; script = GetInteractedBackgroundEventScript(position, metatileBehavior, direction); if (script != NULL) return script; script = GetInteractedMetatileScript(position, metatileBehavior, direction); if (script != NULL) return script; script = GetInteractedWaterScript(position, metatileBehavior, direction); if (script != NULL) return script; return NULL; } const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) { u8 objectEventId; s32 i; if (!MetatileBehavior_IsCounter(MapGridGetMetatileBehaviorAt(position->x, position->y))) objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation); else objectEventId = GetObjectEventIdByPosition(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->elevation); if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER) return NULL; for (i = 0; i < MAX_LINK_PLAYERS; i++) { if (gLinkPlayerObjectEvents[i].active == TRUE && gLinkPlayerObjectEvents[i].objEventId == objectEventId) return NULL; } gSelectedObjectEvent = objectEventId; gSpecialVar_LastTalked = gObjectEvents[objectEventId].localId; gSpecialVar_Facing = direction; return GetObjectEventScriptPointerByObjectEventId(objectEventId); } static const u8 *GetInteractedObjectEventScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) { u8 objectEventId; const u8 *script; objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation); if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER) { if (MetatileBehavior_IsCounter(metatileBehavior) != TRUE) return NULL; // Look for an object event on the other side of the counter. objectEventId = GetObjectEventIdByPosition(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->elevation); if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER) return NULL; } if (InUnionRoom() == TRUE && !ObjectEventCheckHeldMovementStatus(&gObjectEvents[objectEventId])) return NULL; gSelectedObjectEvent = objectEventId; gSpecialVar_LastTalked = gObjectEvents[objectEventId].localId; gSpecialVar_Facing = direction; script = GetObjectEventScriptPointerByObjectEventId(objectEventId); script = GetRamScript(gSpecialVar_LastTalked, script); return script; } static const u8 *GetInteractedBackgroundEventScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) { u8 signpostType; const struct BgEvent *bgEvent = GetBackgroundEventAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation); if (bgEvent == NULL) return NULL; if (bgEvent->bgUnion.script == NULL) return EventScript_ReleaseEnd; signpostType = GetFacingSignpostType(metatileBehavior, direction); switch (bgEvent->kind) { case BG_EVENT_PLAYER_FACING_ANY: default: break; case BG_EVENT_PLAYER_FACING_NORTH: if (direction != DIR_NORTH) return NULL; break; case BG_EVENT_PLAYER_FACING_SOUTH: if (direction != DIR_SOUTH) return NULL; break; case BG_EVENT_PLAYER_FACING_EAST: if (direction != DIR_EAST) return NULL; break; case BG_EVENT_PLAYER_FACING_WEST: if (direction != DIR_WEST) return NULL; break; case 5: case 6: case BG_EVENT_HIDDEN_ITEM: if (GetHiddenItemAttr(bgEvent->bgUnion.hiddenItem, HIDDEN_ITEM_UNDERFOOT) == TRUE) return NULL; gSpecialVar_0x8005 = GetHiddenItemAttr(bgEvent->bgUnion.hiddenItem, HIDDEN_ITEM_ITEM); gSpecialVar_0x8004 = GetHiddenItemAttr(bgEvent->bgUnion.hiddenItem, HIDDEN_ITEM_FLAG); gSpecialVar_0x8006 = GetHiddenItemAttr(bgEvent->bgUnion.hiddenItem, HIDDEN_ITEM_QUANTITY); if (FlagGet(gSpecialVar_0x8004) == TRUE) return NULL; gSpecialVar_Facing = direction; return EventScript_HiddenItemScript; } if (signpostType != SIGNPOST_NA) MsgSetSignpost(); gSpecialVar_Facing = direction; return bgEvent->bgUnion.script; } static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) { gSpecialVar_Facing = direction; if (MetatileBehavior_IsPC(metatileBehavior) == TRUE) return EventScript_PC; if (MetatileBehavior_IsRegionMap(metatileBehavior) == TRUE) return EventScript_WallTownMap; if (MetatileBehavior_IsBookshelf(metatileBehavior) == TRUE) return EventScript_Bookshelf; if (MetatileBehavior_IsPokeMartShelf(metatileBehavior) == TRUE) return EventScript_PokeMartShelf; if (MetatileBehavior_IsFood(metatileBehavior) == TRUE) return EventScript_Food; if (MetatileBehavior_IsImpressiveMachine(metatileBehavior) == TRUE) return EventScript_ImpressiveMachine; if (MetatileBehavior_IsBlueprints(metatileBehavior) == TRUE) return EventScript_Blueprints; if (MetatileBehavior_IsVideoGame(metatileBehavior) == TRUE) return EventScript_VideoGame; if (MetatileBehavior_IsBurglary(metatileBehavior) == TRUE) return EventScript_Burglary; if (MetatileBehavior_IsComputer(metatileBehavior) == TRUE) return EventScript_Computer; if (MetatileBehavior_IsTrainerTowerMonitor(metatileBehavior) == TRUE) return TrainerTower_EventScript_ShowTime; if (MetatileBehavior_IsPlayerFacingTVScreen(metatileBehavior, direction) == TRUE) return EventScript_PlayerFacingTVScreen; if (MetatileBehavior_IsCabinet(metatileBehavior) == TRUE) return EventScript_Cabinet; if (MetatileBehavior_IsKitchen(metatileBehavior) == TRUE) return EventScript_Kitchen; if (MetatileBehavior_IsDresser(metatileBehavior) == TRUE) return EventScript_Dresser; if (MetatileBehavior_IsSnacks(metatileBehavior) == TRUE) return EventScript_Snacks; if (MetatileBehavior_IsPainting(metatileBehavior) == TRUE) return EventScript_Painting; if (MetatileBehavior_IsPowerPlantMachine(metatileBehavior) == TRUE) return EventScript_PowerPlantMachine; if (MetatileBehavior_IsTelephone(metatileBehavior) == TRUE) return EventScript_Telephone; if (MetatileBehavior_IsAdvertisingPoster(metatileBehavior) == TRUE) return EventScript_AdvertisingPoster; if (MetatileBehavior_IsTastyFood(metatileBehavior) == TRUE) return EventScript_TastyFood; if (MetatileBehavior_IsTrashBin(metatileBehavior) == TRUE) return EventScript_TrashBin; if (MetatileBehavior_IsCup(metatileBehavior) == TRUE) return EventScript_Cup; if (MetatileBehavior_IsPolishedWindow(metatileBehavior) == TRUE) return EventScript_PolishedWindow; if (MetatileBehavior_IsBeautifulSkyWindow(metatileBehavior) == TRUE) return EventScript_BeautifulSkyWindow; if (MetatileBehavior_IsBlinkingLights(metatileBehavior) == TRUE) return EventScript_BlinkingLights; if (MetatileBehavior_IsNeatlyLinedUpTools(metatileBehavior) == TRUE) return EventScript_NeatlyLinedUpTools; if (MetatileBehavior_IsSafariExtensionSign(metatileBehavior, direction) == TRUE) { MsgSetSignpost(); return EventScript_SafariZone_ExtensionSign; } if (MetatileBehavior_IsPlayerFacingCableClubWirelessMonitor(metatileBehavior, direction) == TRUE) return CableClub_EventScript_ShowWirelessCommunicationScreen; if (MetatileBehavior_IsQuestionnaire(metatileBehavior) == TRUE) return EventScript_Questionnaire; if (MetatileBehavior_IsPlayerFacingBattleRecords(metatileBehavior, direction) == TRUE) return CableClub_EventScript_ShowBattleRecords; if (MetatileBehavior_IsIndigoPlateauSign1(metatileBehavior) == TRUE) { MsgSetSignpost(); return EventScript_Indigo_UltimateGoal; } if (MetatileBehavior_IsIndigoPlateauSign2(metatileBehavior) == TRUE) { MsgSetSignpost(); return EventScript_Indigo_HighestAuthority; } if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, direction) == TRUE) { MsgSetSignpost(); return EventScript_PokemartSign; } if (MetatileBehavior_IsPlayerFacingPokemonCenterSign(metatileBehavior, direction) == TRUE) { MsgSetSignpost(); return EventScript_PokecenterSign; } return NULL; } static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metatileBehavior, u8 direction) { if (MetatileBehavior_IsFastWater(metatileBehavior) == TRUE && PartyHasMonWithSurf() == TRUE) return EventScript_CurrentTooFast; if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) return EventScript_UseSurf; if (MetatileBehavior_IsWaterfall(metatileBehavior) == TRUE) { if (FlagGet(FLAG_BADGE07_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) return EventScript_Waterfall; else return EventScript_CantUseWaterfall; } return NULL; } static bool8 TryStartStepBasedScript(struct MapPosition *position, u16 metatileBehavior, u16 direction) { if (TryStartCoordEventScript(position) == TRUE) return TRUE; if (TryStartWarpEventScript(position, metatileBehavior) == TRUE) return TRUE; if (TryStartMiscWalkingScripts(metatileBehavior) == TRUE) return TRUE; if (TryStartStepCountScript(metatileBehavior) == TRUE) return TRUE; if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior) && UpdateRepelCounter() == TRUE) return TRUE; return FALSE; } static bool8 TryStartCoordEventScript(struct MapPosition *position) { const u8 *script = GetCoordEventScriptAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation); if (script == NULL) return FALSE; ScriptContext_SetupScript(script); return TRUE; } static bool8 TryStartMiscWalkingScripts(u16 metatileBehavior) { // Dummied return FALSE; } static bool8 TryStartStepCountScript(u16 metatileBehavior) { if (InUnionRoom() == TRUE) return FALSE; if (gQuestLogState == QL_STATE_PLAYBACK) return FALSE; UpdateHappinessStepCounter(); UpdateFarawayIslandStepCounter(); if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior)) { if (UpdateVsSeekerStepCounter() == TRUE) { ScriptContext_SetupScript(EventScript_VsSeekerChargingDone); return TRUE; } else if (UpdatePoisonStepCounter() == TRUE) { ScriptContext_SetupScript(EventScript_FieldPoison); return TRUE; } else if (ShouldEggHatch()) { IncrementGameStat(GAME_STAT_HATCHED_EGGS); ScriptContext_SetupScript(EventScript_EggHatch); return TRUE; } } if (SafariZoneTakeStep() == TRUE) return TRUE; return FALSE; } static void Unref_ClearHappinessStepCounter(void) { VarSet(VAR_HAPPINESS_STEP_COUNTER, 0); } static void UpdateHappinessStepCounter(void) { u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER); int i; (*ptr)++; (*ptr) %= 128; if (*ptr == 0) { struct Pokemon *mon = gPlayerParty; for (i = 0; i < PARTY_SIZE; i++) { AdjustFriendship(mon, FRIENDSHIP_EVENT_WALKING); mon++; } } } void ClearPoisonStepCounter(void) { VarSet(VAR_POISON_STEP_COUNTER, 0); } static bool8 UpdatePoisonStepCounter(void) { u16 *ptr; if (gMapHeader.mapType != MAP_TYPE_SECRET_BASE) { ptr = GetVarPointer(VAR_POISON_STEP_COUNTER); (*ptr)++; (*ptr) %= 5; if (*ptr == 0) { switch (DoPoisonFieldEffect()) { case FLDPSN_NONE: return FALSE; case FLDPSN_PSN: return FALSE; case FLDPSN_FNT: return TRUE; } } } return FALSE; } void RestartWildEncounterImmunitySteps(void) { ResetEncounterRateModifiers(); } static bool8 CheckStandardWildEncounter(u32 metatileAttributes) { return TryStandardWildEncounter(metatileAttributes); } static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection) { u8 signpostType; const u8 * script; if (JOY_HELD(DPAD_LEFT | DPAD_RIGHT)) return FALSE; if (playerDirection == DIR_EAST || playerDirection == DIR_WEST) return FALSE; signpostType = GetFacingSignpostType(metatileBehavior, playerDirection); if (signpostType == SIGNPOST_POKECENTER) { SetUpWalkIntoSignScript(EventScript_PokecenterSign, playerDirection); return TRUE; } else if (signpostType == SIGNPOST_POKEMART) { SetUpWalkIntoSignScript(EventScript_PokemartSign, playerDirection); return TRUE; } else if (signpostType == SIGNPOST_INDIGO_1) { SetUpWalkIntoSignScript(EventScript_Indigo_UltimateGoal, playerDirection); return TRUE; } else if (signpostType == SIGNPOST_INDIGO_2) { SetUpWalkIntoSignScript(EventScript_Indigo_HighestAuthority, playerDirection); return TRUE; } else if(signpostType == SIGNPOST_SAFARI) { SetUpWalkIntoSignScript(EventScript_SafariZone_ExtensionSign, playerDirection); return TRUE; } else { script = GetSignpostScriptAtMapPosition(position); if (script == NULL) return FALSE; if (signpostType != SIGNPOST_SCRIPTED) return FALSE; SetUpWalkIntoSignScript(script, playerDirection); return TRUE; } } static u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection) { if (MetatileBehavior_IsPlayerFacingPokemonCenterSign(metatileBehavior, playerDirection) == TRUE) return SIGNPOST_POKECENTER; if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, playerDirection) == TRUE) return SIGNPOST_POKEMART; if (MetatileBehavior_IsIndigoPlateauSign1(metatileBehavior) == TRUE) return SIGNPOST_INDIGO_1; if (MetatileBehavior_IsIndigoPlateauSign2(metatileBehavior) == TRUE) return SIGNPOST_INDIGO_2; if (MetatileBehavior_IsSafariExtensionSign(metatileBehavior, playerDirection) == TRUE) return SIGNPOST_SAFARI; if (MetatileBehavior_IsSignpost(metatileBehavior) == TRUE) return SIGNPOST_SCRIPTED; return SIGNPOST_NA; } static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection) { gSpecialVar_Facing = playerDirection; ScriptContext_SetupScript(script); SetWalkingIntoSignVars(); MsgSetSignpost(); } static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition * position) { const struct BgEvent * event = GetBackgroundEventAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation); if (event == NULL) return NULL; if (event->bgUnion.script != NULL) return event->bgUnion.script; return EventScript_ReleaseEnd; } static bool8 TryArrowWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction) { s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); u16 delay; if (warpEventId != -1) { if (IsArrowWarpMetatileBehavior(metatileBehavior, direction) == TRUE) { StoreInitialPlayerAvatarState(); SetupWarp(&gMapHeader, warpEventId, position); DoWarp(); return TRUE; } else if (IsDirectionalStairWarpMetatileBehavior(metatileBehavior, direction) == TRUE) { delay = 0; if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) { SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); delay = 12; } StoreInitialPlayerAvatarState(); SetupWarp(&gMapHeader, warpEventId, position); DoStairWarp(metatileBehavior, delay); return TRUE; } } return FALSE; } static bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileBehavior) { s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE) { StoreInitialPlayerAvatarState(); SetupWarp(&gMapHeader, warpEventId, position); if (MetatileBehavior_IsEscalator(metatileBehavior) == TRUE) { DoEscalatorWarp(metatileBehavior); return TRUE; } if (MetatileBehavior_IsLavaridgeB1FWarp(metatileBehavior) == TRUE) { DoLavaridgeGymB1FWarp(); return TRUE; } if (MetatileBehavior_IsLavaridge1FWarp(metatileBehavior) == TRUE) { DoLavaridgeGym1FWarp(); return TRUE; } if (MetatileBehavior_IsWarpPad(metatileBehavior) == TRUE) { DoTeleportWarp(); return TRUE; } if (MetatileBehavior_IsUnionRoomWarp(metatileBehavior) == TRUE) { DoUnionRoomWarp(); return TRUE; } if (MetatileBehavior_IsFallWarp(metatileBehavior) == TRUE) { ResetInitialPlayerAvatarState(); ScriptContext_SetupScript(EventScript_DoFallWarp); return TRUE; } DoWarp(); return TRUE; } return FALSE; } static bool8 IsWarpMetatileBehavior(u16 metatileBehavior) { if (MetatileBehavior_IsWarpDoor(metatileBehavior) == TRUE) return TRUE; if (MetatileBehavior_IsLadder(metatileBehavior) == TRUE) return TRUE; if (MetatileBehavior_IsEscalator(metatileBehavior) == TRUE) return TRUE; if (MetatileBehavior_IsNonAnimDoor(metatileBehavior) == TRUE) return TRUE; if (MetatileBehavior_IsLavaridgeB1FWarp(metatileBehavior) == TRUE) return TRUE; if (MetatileBehavior_IsLavaridge1FWarp(metatileBehavior) == TRUE) return TRUE; if (MetatileBehavior_IsWarpPad(metatileBehavior) == TRUE) return TRUE; if (MetatileBehavior_IsFallWarp(metatileBehavior) == TRUE) return TRUE; if (MetatileBehavior_IsUnionRoomWarp(metatileBehavior) == TRUE) return TRUE; return FALSE; } bool8 IsDirectionalStairWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection) { switch (playerDirection) { case DIR_WEST: if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior)) return TRUE; if (MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior)) return TRUE; break; case DIR_EAST: if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior)) return TRUE; if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior)) return TRUE; break; } return FALSE; } static bool8 IsArrowWarpMetatileBehavior(u16 metatileBehavior, u8 direction) { switch (direction) { case DIR_NORTH: return MetatileBehavior_IsNorthArrowWarp(metatileBehavior); case DIR_SOUTH: return MetatileBehavior_IsSouthArrowWarp(metatileBehavior); case DIR_WEST: return MetatileBehavior_IsWestArrowWarp(metatileBehavior); case DIR_EAST: return MetatileBehavior_IsEastArrowWarp(metatileBehavior); } return FALSE; } static s8 GetWarpEventAtMapPosition(struct MapHeader *mapHeader, struct MapPosition *position) { return GetWarpEventAtPosition(mapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation); } static void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPosition *position) { const struct WarpEvent *warpEvent; warpEvent = &gMapHeader.events->warps[warpEventId]; if (warpEvent->mapNum == MAP_NUM(DYNAMIC)) { SetWarpDestinationToDynamicWarp(warpEvent->warpId); } else { const struct MapHeader *mapHeader; SetWarpDestinationToMapWarp(warpEvent->mapGroup, warpEvent->mapNum, warpEvent->warpId); UpdateEscapeWarp(position->x, position->y); mapHeader = Overworld_GetMapHeaderByGroupAndId(warpEvent->mapGroup, warpEvent->mapNum); if (mapHeader->events->warps[warpEvent->warpId].mapNum == MAP_NUM(DYNAMIC)) SetDynamicWarp(mapHeader->events->warps[warpEventId].warpId, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, warpEventId); } } static bool8 TryDoorWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction) { s8 warpEventId; if (direction == DIR_NORTH) { if (MetatileBehavior_IsWarpDoor(metatileBehavior) == TRUE) { warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE) { StoreInitialPlayerAvatarState(); SetupWarp(&gMapHeader, warpEventId, position); DoDoorWarp(); return TRUE; } } } return FALSE; } static s8 GetWarpEventAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) { s32 i; const struct WarpEvent *warpEvent = mapHeader->events->warps; u8 warpCount = mapHeader->events->warpCount; for (i = 0; i < warpCount; i++, warpEvent++) { if ((u16)warpEvent->x == x && (u16)warpEvent->y == y) { if (warpEvent->elevation == elevation || warpEvent->elevation == 0) return i; } } return -1; } static const u8 *TryRunCoordEventScript(const struct CoordEvent *coordEvent) { if (coordEvent != NULL) { if (coordEvent->script == NULL) { DoCoordEventWeather(coordEvent->trigger); return NULL; } if (coordEvent->trigger == 0) { RunScriptImmediately(coordEvent->script); return NULL; } if (VarGet(coordEvent->trigger) == (u8)coordEvent->index) return coordEvent->script; } return NULL; } static const u8 *GetCoordEventScriptAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) { s32 i; const struct CoordEvent *coordEvents = mapHeader->events->coordEvents; u8 coordEventCount = mapHeader->events->coordEventCount; for (i = 0; i < coordEventCount; i++) { if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y) { if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0) { const u8 *script = TryRunCoordEventScript(&coordEvents[i]); if (script != NULL) return script; } } } return NULL; } void HandleBoulderFallThroughHole(struct ObjectEvent * object) { if (MapGridGetMetatileBehaviorAt(object->currentCoords.x, object->currentCoords.y) == MB_FALL_WARP) { PlaySE(SE_FALL); RemoveObjectEventByLocalIdAndMap(object->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); FlagClear(GetBoulderRevealFlagByLocalIdAndMap(object->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup)); } } void HandleBoulderActivateVictoryRoadSwitch(u16 x, u16 y) { int i; const struct CoordEvent * events = gMapHeader.events->coordEvents; int n = gMapHeader.events->coordEventCount; if (MapGridGetMetatileBehaviorAt(x, y) == MB_STRENGTH_BUTTON) { for (i = 0; i < n; i++) { if (events[i].x + MAP_OFFSET == x && events[i].y + MAP_OFFSET == y) { QuestLog_CutRecording(); ScriptContext_SetupScript(events[i].script); LockPlayerFieldControls(); } } } } const u8 *GetCoordEventScriptAtMapPosition(struct MapPosition *position) { return GetCoordEventScriptAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation); } static const struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) { u32 i; const struct BgEvent *bgEvents = mapHeader->events->bgEvents; u8 bgEventCount = mapHeader->events->bgEventCount; for (i = 0; i < bgEventCount; i++) { if ((u16)bgEvents[i].x == x && (u16)bgEvents[i].y == y) { if (bgEvents[i].elevation == elevation || bgEvents[i].elevation == 0) return &bgEvents[i]; } } return NULL; } bool8 dive_warp(struct MapPosition *position, u16 metatileBehavior) { if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && !MetatileBehavior_IsUnableToEmerge(metatileBehavior)) { if (SetDiveWarpEmerge(position->x - MAP_OFFSET, position->y - MAP_OFFSET)) { StoreInitialPlayerAvatarState(); DoDiveWarp(); PlaySE(SE_M_DIVE); return TRUE; } } else if (MetatileBehavior_IsDiveable(metatileBehavior) == TRUE) { if (SetDiveWarpDive(position->x - MAP_OFFSET, position->y - MAP_OFFSET)) { StoreInitialPlayerAvatarState(); DoDiveWarp(); PlaySE(SE_M_DIVE); return TRUE; } } return FALSE; } u8 TrySetDiveWarp(void) { s16 x, y; u8 metatileBehavior; PlayerGetDestCoords(&x, &y); metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && !MetatileBehavior_IsUnableToEmerge(metatileBehavior)) { if (SetDiveWarpEmerge(x - MAP_OFFSET, y - MAP_OFFSET) == TRUE) return 1; } else if (MetatileBehavior_IsDiveable(metatileBehavior) == TRUE) { if (SetDiveWarpDive(x - MAP_OFFSET, y - MAP_OFFSET) == TRUE) return 2; } return 0; } static const u8 *GetObjectEventScriptPointerPlayerFacing(void) { u8 direction; struct MapPosition position; direction = GetPlayerMovementDirection(); GetInFrontOfPlayerPosition(&position); return GetInteractedObjectEventScript(&position, MapGridGetMetatileBehaviorAt(position.x, position.y), direction); } int SetCableClubWarp(void) { struct MapPosition position; GetPlayerMovementDirection(); // unnecessary GetPlayerPosition(&position); MapGridGetMetatileBehaviorAt(position.x, position.y); // unnecessary SetupWarp(&gMapHeader, GetWarpEventAtMapPosition(&gMapHeader, &position), &position); return 0; } extern const u8 EventScript_EnableAutoRun[]; static bool8 EnableAutoRun(void) { if (!FlagGet(FLAG_AUTO_RUN_TOGGLED)) { FlagSet(FLAG_AUTO_RUN_TOGGLED); if(FlagGet(FLAG_AUTO_RUN_EXPLAINED)) { PlaySE(SE_SELECT); } else { FlagSet(FLAG_AUTO_RUN_EXPLAINED); DismissMapNamePopup(); ScriptContext_SetupScript(EventScript_EnableAutoRun); } return FALSE; } else { FlagClear(FLAG_AUTO_RUN_TOGGLED); PlaySE(SE_SELECT); return FALSE; } return TRUE; } static bool8 SwitchBikeGears(void) { if(!FlagGet(FLAG_BIKE_GEAR)) { FlagSet(FLAG_BIKE_GEAR); PlaySE(SE_BIKE_BELL); return FALSE; } else { FlagClear(FLAG_BIKE_GEAR); PlaySE(SE_BIKE_BELL); return FALSE; } return TRUE; } //dive static bool32 TrySetupDiveDownScript(void) { if (FlagGet(FLAG_SYS_CAN_LINK_WITH_RS) && TrySetDiveWarp() == 2) { ScriptContext_SetupScript(EventScript_DeepWater); return TRUE; } return FALSE; } static bool32 TrySetupDiveEmergeScript(void) { if(GetCurrentRegionMapSectionId() == MAPSEC_UNDERWATER_124) { s16 x, y; PlayerGetDestCoords(&x, &y); if(MapGridGetMetatileIdAt(x, y) == 0x296) //if emergable tile { ScriptContext_SetupScript(EventScript_TrySurface); return TRUE; } return FALSE; } if (FlagGet(FLAG_SYS_CAN_LINK_WITH_RS) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && TrySetDiveWarp() == 1) { ScriptContext_SetupScript(EventScript_TrySurface); return TRUE; } return FALSE; } ================================================ FILE: src/field_door.c ================================================ #include "global.h" #include "field_camera.h" #include "task.h" #include "fieldmap.h" #include "metatile_behavior.h" #include "constants/songs.h" #include "constants/metatile_labels.h" enum { DOOR_SOUND_NORMAL, DOOR_SOUND_SLIDING, }; enum { DOOR_SIZE_1x1, DOOR_SIZE_1x2, }; struct DoorAnimFrame { u8 duration; u16 tileOffset; }; struct DoorGraphics { u16 metatileId; u8 sound; u8 size; const u8 *tiles; const u8 *paletteNums; }; static void DrawClosedDoorTiles(const struct DoorGraphics *gfx, int x, int y); static void CopyDoorTilesToVram(const u8 *tiles); static void DrawCurrentDoorAnimFrame(const struct DoorGraphics *gfx, int x, int y, const u8 *paletteNums); static void BuildDoorTiles(u16 *tiles, u16 tileNum, const u8 *paletteNums); static bool32 AnimateDoorFrame(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, s16 *data); static const struct DoorAnimFrame *GetLastDoorAnimFrame(const struct DoorAnimFrame *frames); static s8 GetDoorSoundType(const struct DoorGraphics *gfx, int x, int y); static const u8 sDoorAnimTiles_General[] = INCBIN_U8("graphics/door_anims/general.4bpp"); static const u16 sDoorNullPalette1[16] = {}; static const u8 sDoorAnimTiles_SlidingSingle[] = INCBIN_U8("graphics/door_anims/sliding_single.4bpp"); static const u16 sDoorNullPalette2[16] = {}; static const u8 sDoorAnimTiles_SlidingDouble[] = INCBIN_U8("graphics/door_anims/sliding_double.4bpp"); static const u16 sDoorNullPalette3[16] = {}; static const u8 sDoorAnimTiles_Pallet[] = INCBIN_U8("graphics/door_anims/pallet.4bpp"); static const u16 sDoorNullPalette4[16] = {}; static const u8 sDoorAnimTiles_OaksLab[] = INCBIN_U8("graphics/door_anims/oaks_lab.4bpp"); static const u16 sDoorNullPalette5[16] = {}; static const u8 sDoorAnimTiles_Viridian[] = INCBIN_U8("graphics/door_anims/viridian.4bpp"); static const u16 sDoorNullPalette6[16] = {}; static const u8 sDoorAnimTiles_Pewter[] = INCBIN_U8("graphics/door_anims/pewter.4bpp"); static const u16 sDoorNullPalette7[16] = {}; static const u8 sDoorAnimTiles_Saffron[] = INCBIN_U8("graphics/door_anims/saffron.4bpp"); static const u16 sDoorNullPalette8[16] = {}; static const u8 sDoorAnimTiles_SilphCo[] = INCBIN_U8("graphics/door_anims/silph_co.4bpp"); static const u16 sDoorNullPalette9[16] = {}; static const u8 sDoorAnimTiles_Cerulean[] = INCBIN_U8("graphics/door_anims/cerulean.4bpp"); static const u16 sDoorNullPalette10[16] = {}; static const u8 sDoorAnimTiles_Lavender[] = INCBIN_U8("graphics/door_anims/lavender.4bpp"); static const u16 sDoorNullPalette11[16] = {}; static const u8 sDoorAnimTiles_Vermilion[] = INCBIN_U8("graphics/door_anims/vermilion.4bpp"); static const u16 sDoorNullPalette12[16] = {}; static const u8 sDoorAnimTiles_PokemonFanClub[] = INCBIN_U8("graphics/door_anims/pokemon_fan_club.4bpp"); static const u16 sDoorNullPalette13[16] = {}; static const u8 sDoorAnimTiles_DeptStore[] = INCBIN_U8("graphics/door_anims/dept_store.4bpp"); static const u16 sDoorNullPalette14[16] = {}; static const u8 sDoorAnimTiles_Fuchsia[] = INCBIN_U8("graphics/door_anims/fuchsia.4bpp"); static const u16 sDoorNullPalette15[16] = {}; static const u8 sDoorAnimTiles_SafariZone[] = INCBIN_U8("graphics/door_anims/safari_zone.4bpp"); static const u16 sDoorNullPalette16[16] = {}; static const u8 sDoorAnimTiles_CinnabarLab[] = INCBIN_U8("graphics/door_anims/cinnabar_lab.4bpp"); static const u16 sDoorNullPalette17[16] = {}; static const u8 sDoorAnimTiles_DeptStoreElevator[] = INCBIN_U8("graphics/door_anims/dept_store_elevator.4bpp"); static const u16 sDoorNullPalette18[16] = {}; static const u8 sDoorAnimTiles_CableClub[] = INCBIN_U8("graphics/door_anims/cable_club.4bpp"); static const u16 sDoorNullPalette19[16] = {}; static const u8 sDoorAnimTiles_HideoutElevator[] = INCBIN_U8("graphics/door_anims/hideout_elevator.4bpp"); static const u16 sDoorNullPalette20[16] = {}; static const u8 sDoorAnimTiles_SSAnne[] = INCBIN_U8("graphics/door_anims/ss_anne.4bpp"); static const u16 sDoorNullPalette21[16] = {}; // Doors from R/S dummied below static const u8 sDoorAnimTiles_Empty1[256 * 3] = {}; static const u16 sDoorNullPalette22[16] = {}; static const u8 sDoorAnimTiles_Empty2[256 * 3] = {}; static const u16 sDoorNullPalette23[16] = {}; static const u8 sDoorAnimTiles_Empty3[256 * 3] = {}; static const u16 sDoorNullPalette24[16] = {}; static const u8 sDoorAnimTiles_Empty4[256 * 3] = {}; static const u16 sDoorNullPalette25[16] = {}; static const u8 sDoorAnimTiles_Empty5[256 * 3] = {}; static const u16 sDoorNullPalette26[16] = {}; static const u8 sDoorAnimTiles_Empty6[256 * 3] = {}; static const u16 sDoorNullPalette27[16] = {}; static const u8 sDoorAnimTiles_Empty7[256 * 3] = {}; static const u16 sDoorNullPalette28[16] = {}; static const u8 sDoorAnimTiles_Empty8[128 * 3] = {}; static const u16 sDoorNullPalette29[16] = {}; static const u8 sDoorAnimTiles_Empty9[128 * 3] = {}; static const u16 sDoorNullPalette30[16] = {}; static const u8 sDoorAnimTiles_Empty10[128 * 3] = {}; static const u16 sDoorNullPalette31[16] = {}; static const u8 sDoorAnimTiles_Empty11[128 * 3] = {}; static const u16 sDoorNullPalette32[16] = {}; static const u8 sDoorAnimTiles_Empty12[128 * 3] = {}; static const u16 sDoorNullPalette33[16] = {}; static const u8 sDoorAnimTiles_Empty13[128 * 3] = {}; static const u16 sDoorNullPalette34[16] = {}; static const u8 sDoorAnimTiles_Empty14[128 * 3] = {}; static const u16 sDoorNullPalette35[16] = {}; static const u8 sDoorAnimTiles_Empty15[128 * 3] = {}; static const u16 sDoorNullPalette36[16] = {}; static const u8 sDoorAnimTiles_Empty16[128 * 3] = {}; static const u16 sDoorNullPalette37[16] = {}; static const u8 sDoorAnimTiles_Empty17[128 * 3] = {}; static const u16 sDoorNullPalette38[16] = {}; static const u8 sDoorAnimTiles_Empty18[128 * 3] = {}; static const u16 sDoorNullPalette39[16] = {}; static const u8 sDoorAnimTiles_Empty19[128 * 3] = {}; static const u16 sDoorNullPalette40[16] = {}; static const u8 sDoorAnimTiles_Empty20[128 * 3] = {}; static const u16 sDoorNullPalette41[16] = {}; static const u8 sDoorAnimTiles_Empty21[128 * 3] = {}; static const u16 sDoorNullPalette42[16] = {}; static const u8 sDoorAnimTiles_Empty22[128 * 3] = {}; static const u16 sDoorNullPalette43[16] = {}; static const u8 sDoorAnimTiles_Empty23[128 * 3] = {}; static const u16 sDoorNullPalette44[16] = {}; static const u8 sDoorAnimTiles_Empty24[128 * 3] = {}; static const u16 sDoorNullPalette45[16] = {}; static const u8 sDoorAnimTiles_Empty25[128 * 3] = {}; static const u16 sDoorNullPalette46[16] = {}; static const u8 sDoorAnimTiles_Empty26[128 * 3] = {}; static const u16 sDoorNullPalette47[16] = {}; static const u8 sDoorAnimTiles_Empty27[128 * 3] = {}; static const u16 sDoorNullPalette48[16] = {}; static const u8 sDoorAnimTiles_Empty28[128 * 3] = {}; static const u16 sDoorNullPalette49[16] = {}; static const u8 sDoorAnimTiles_Empty29[128 * 3] = {}; static const u16 sDoorNullPalette50[16] = {}; static const u8 sDoorAnimTiles_Empty30[128 * 3] = {}; static const u16 sDoorNullPalette51[16] = {}; static const u8 sDoorAnimTiles_Empty31[128 * 3] = {}; static const u16 sDoorNullPalette52[16] = {}; // Unused block of door tiles static const u8 sDoorAnimTiles_UnusedTop[] = INCBIN_U8("graphics/door_anims/unused_top.4bpp"); static const u8 sDoorAnimTiles_Empty32[256] = {}; static const u8 sDoorAnimTiles_UnusedMidTop[] = INCBIN_U8("graphics/door_anims/unused_midtop.4bpp"); static const u8 sDoorAnimTiles_Empty33[256] = {}; static const u8 sDoorAnimTiles_UnusedMidBottom[] = INCBIN_U8("graphics/door_anims/unused_midbottom.4bpp"); static const u8 sDoorAnimTiles_Empty34[256] = {}; static const u8 sDoorAnimTiles_UnusedBottom[] = INCBIN_U8("graphics/door_anims/unused_bottom.4bpp"); static const u16 sDoorNullPalette53[16] = {}; // Used FRLG doors resume static const u8 sDoorAnimTiles_SilphCoElevator[] = INCBIN_U8("graphics/door_anims/silph_co_elevator.4bpp"); static const u16 sDoorNullPalette54[16] = {}; static const u8 sDoorAnimTiles_Sevii123[] = INCBIN_U8("graphics/door_anims/sevii_123.4bpp"); static const u16 sDoorNullPalette55[16] = {}; static const u8 sDoorAnimTiles_JoyfulGameCorner[] = INCBIN_U8("graphics/door_anims/joyful_game_corner.4bpp"); static const u16 sDoorNullPalette56[16] = {}; static const u8 sDoorAnimTiles_OneIslandPokeCenter[] = INCBIN_U8("graphics/door_anims/one_island_poke_center.4bpp"); static const u16 sDoorNullPalette57[16] = {}; static const u8 sDoorAnimTiles_Sevii45[] = INCBIN_U8("graphics/door_anims/sevii_45.4bpp"); static const u16 sDoorNullPalette58[16] = {}; static const u8 sDoorAnimTiles_FourIslandDayCare[] = INCBIN_U8("graphics/door_anims/four_island_day_care.4bpp"); static const u16 sDoorNullPalette59[16] = {}; static const u8 sDoorAnimTiles_RocketWarehouse[] = INCBIN_U8("graphics/door_anims/rocket_warehouse.4bpp"); static const u16 sDoorNullPalette60[16] = {}; static const u8 sDoorAnimTiles_Sevii67[] = INCBIN_U8("graphics/door_anims/sevii_67.4bpp"); static const u16 sDoorNullPalette61[16] = {}; static const u8 sDoorAnimTiles_Teleporter[] = INCBIN_U8("graphics/door_anims/teleporter.4bpp"); static const u16 sDoorNullPalette62[16] = {}; static const u8 sDoorAnimTiles_TrainerTowerLobbyElevator[] = INCBIN_U8("graphics/door_anims/trainer_tower_lobby_elevator.4bpp"); static const u16 sDoorNullPalette63[16] = {}; static const u8 sDoorAnimTiles_TrainerTowerRoofElevator[] = INCBIN_U8("graphics/door_anims/trainer_tower_roof_elevator.4bpp"); static const u16 sDoorNullPalette64[16] = {}; static const u8 sDoorAnimTiles_BattleTower[] = INCBIN_U8("graphics/door_anims/battle_tower.4bpp"); static const u16 sDoorNullPalette65[16] = {}; static const u8 sDoorAnimTiles_BattleTowerElevator[] = INCBIN_U8("graphics/door_anims/battle_tower_elevator.4bpp"); static const u16 sDoorNullPalette66[16] = {}; #define CLOSED_DOOR_TILES_OFFSET 0xFFFF static const struct DoorAnimFrame sDoorAnimFrames_OpenSmall[] = { {4, CLOSED_DOOR_TILES_OFFSET}, {4, 0 * TILE_SIZE_4BPP}, {4, 4 * TILE_SIZE_4BPP}, {4, 8 * TILE_SIZE_4BPP}, {} }; static const struct DoorAnimFrame sDoorAnimFrames_OpenLarge[] = { {4, CLOSED_DOOR_TILES_OFFSET}, {4, 0 * TILE_SIZE_4BPP}, {4, 8 * TILE_SIZE_4BPP}, {4, 16 * TILE_SIZE_4BPP}, {} }; static const struct DoorAnimFrame sDoorAnimFrames_CloseSmall[] = { {4, 8 * TILE_SIZE_4BPP}, {4, 4 * TILE_SIZE_4BPP}, {4, 0 * TILE_SIZE_4BPP}, {4, CLOSED_DOOR_TILES_OFFSET}, {} }; static const struct DoorAnimFrame sDoorAnimFrames_CloseLarge[] = { {4, 16 * TILE_SIZE_4BPP}, {4, 8 * TILE_SIZE_4BPP}, {4, 0 * TILE_SIZE_4BPP}, {4, CLOSED_DOOR_TILES_OFFSET}, {} }; static const u8 sDoorAnimPalettes_General[] = {2, 2, 2, 2, 2, 2, 2, 2}; static const u8 sDoorAnimPalettes_SlidingSingle[] = {3, 3, 3, 3, 3, 3, 3, 3}; static const u8 sDoorAnimPalettes_SlidingDouble[] = {3, 3, 3, 3, 3, 3, 3, 3}; static const u8 sDoorAnimPalettes_Pallet[] = {8, 8, 8, 8, 8, 8, 8, 8}; static const u8 sDoorAnimPalettes_OaksLab[] = {10, 10, 10, 10, 10, 10, 10, 10}; static const u8 sDoorAnimPalettes_Viridian[] = {8, 8, 8, 8, 8, 8, 8, 8}; static const u8 sDoorAnimPalettes_Pewter[] = {8, 8, 8, 8, 8, 8, 8, 8}; static const u8 sDoorAnimPalettes_Saffron[] = {8, 8, 8, 8, 8, 8, 8, 8}; static const u8 sDoorAnimPalettes_SilphCo[] = {3, 3, 3, 3, 3, 3, 3, 3}; static const u8 sDoorAnimPalettes_Cerulean[] = {12, 12, 12, 12, 12, 12, 12, 12}; static const u8 sDoorAnimPalettes_Lavender[] = {9, 9, 9, 9, 9, 9, 9, 9}; static const u8 sDoorAnimPalettes_Vermilion[] = {9, 9, 9, 9, 9, 9, 9, 9}; static const u8 sDoorAnimPalettes_PokemonFanClub[] = {9, 9, 9, 9, 9, 9, 9, 9}; static const u8 sDoorAnimPalettes_DeptStore[] = {3, 3, 3, 3, 3, 3, 3, 3}; static const u8 sDoorAnimPalettes_Fuchsia[] = {8, 8, 8, 8, 8, 8, 8, 8}; static const u8 sDoorAnimPalettes_SafariZone[] = {9, 9, 9, 9, 9, 9, 9, 9}; static const u8 sDoorAnimPalettes_CinnabarLab[] = {3, 3, 3, 3, 3, 3, 3, 3}; static const u8 sDoorAnimPalettes_DeptStoreElevator[] = {8, 8, 8, 8, 8, 8, 8, 8}; static const u8 sDoorAnimPalettes_CableClub[] = {8, 8, 8, 8, 8, 8, 8, 8}; static const u8 sDoorAnimPalettes_HideoutElevator[] = {12, 12, 2, 2, 2, 2, 2, 2}; static const u8 sDoorAnimPalettes_SSAnne[] = {7, 7, 7, 7, 7, 7, 7, 7}; static const u8 sDoorAnimPalettes_SilphCoElevator[] = {8, 8, 2, 2, 2, 2, 2, 2}; static const u8 sDoorAnimPalettes_Sevii123[] = {5, 5, 5, 5, 5, 5, 5, 5}; static const u8 sDoorAnimPalettes_JoyfulGameCorner[] = {3, 3, 3, 3, 3, 3, 3, 3}; static const u8 sDoorAnimPalettes_OneIslandPokeCenter[] = {3, 3, 3, 3, 3, 3, 3, 3}; static const u8 sDoorAnimPalettes_Sevii45[] = {5, 5, 5, 5, 5, 5, 5, 5}; static const u8 sDoorAnimPalettes_FourIslandDayCare[] = {3, 3, 3, 3, 3, 3, 3, 3}; static const u8 sDoorAnimPalettes_RocketWarehouse[] = {10, 10, 10, 10, 10, 10, 10, 10}; static const u8 sDoorAnimPalettes_Sevii67[] = {5, 5, 5, 5, 5, 5, 5, 5}; static const u8 sDoorAnimPalettes_Teleporter[] = {8, 8, 8, 8, 8, 8, 8, 8}; static const u8 sDoorAnimPalettes_TrainerTowerLobbyElevator[] = {8, 8, 2, 2, 2, 2, 2, 2}; static const u8 sDoorAnimPalettes_TrainerTowerRoofElevator[] = {11, 11, 2, 2, 2, 2, 2, 2}; static const struct DoorGraphics sDoorGraphics[] = { {METATILE_General_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_General, sDoorAnimPalettes_General}, {METATILE_General_SlidingSingleDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_SlidingSingle, sDoorAnimPalettes_SlidingSingle}, {METATILE_General_SlidingDoubleDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_SlidingDouble, sDoorAnimPalettes_SlidingDouble}, {METATILE_PalletTown_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Pallet, sDoorAnimPalettes_Pallet}, {METATILE_PalletTown_OaksLabDoor, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_OaksLab, sDoorAnimPalettes_OaksLab}, {METATILE_ViridianCity_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Viridian, sDoorAnimPalettes_Viridian}, {METATILE_PewterCity_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Pewter, sDoorAnimPalettes_Pewter}, {METATILE_SaffronCity_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Saffron, sDoorAnimPalettes_Saffron}, {METATILE_SaffronCity_SilphCoDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_SilphCo, sDoorAnimPalettes_SilphCo}, {METATILE_CeruleanCity_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Cerulean, sDoorAnimPalettes_Cerulean}, {METATILE_LavenderTown_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Lavender, sDoorAnimPalettes_Lavender}, {METATILE_VermilionCity_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Vermilion, sDoorAnimPalettes_Vermilion}, /* Below was presumably intended for the door to the Pokemon Fan Club. The metatile is surrounded by metatiles for the fan club building. Its animation tiles are similar to the Vermilion door above, and the building on the map uses that metatile instead. The unused tiles have the pokeball above the door in view, but on the map the pokeball above the door is too high to be in view. The metatile below was subsequently re-used for the warp to enter the SS Anne from the harbor, which has no door. */ {METATILE_VermilionCity_SSAnneWarp, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_PokemonFanClub, sDoorAnimPalettes_PokemonFanClub}, {METATILE_CeladonCity_DeptStoreDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_DeptStore, sDoorAnimPalettes_DeptStore}, {METATILE_FuchsiaCity_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Fuchsia, sDoorAnimPalettes_Fuchsia}, {METATILE_FuchsiaCity_SafariZoneDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_SafariZone, sDoorAnimPalettes_SafariZone}, {METATILE_CinnabarIsland_LabDoor, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_CinnabarLab, sDoorAnimPalettes_CinnabarLab}, {METATILE_SeviiIslands123_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Sevii123, sDoorAnimPalettes_Sevii123}, {METATILE_SeviiIslands123_GameCornerDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_JoyfulGameCorner, sDoorAnimPalettes_JoyfulGameCorner}, {METATILE_SeviiIslands123_PokeCenterDoor, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_OneIslandPokeCenter, sDoorAnimPalettes_OneIslandPokeCenter}, {METATILE_SeviiIslands45_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Sevii45, sDoorAnimPalettes_Sevii45}, {METATILE_SeviiIslands45_DayCareDoor, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_FourIslandDayCare, sDoorAnimPalettes_FourIslandDayCare}, {METATILE_SeviiIslands45_RocketWarehouseDoor_Unlocked, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_RocketWarehouse, sDoorAnimPalettes_RocketWarehouse}, {METATILE_SeviiIslands67_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Sevii67, sDoorAnimPalettes_Sevii67}, {METATILE_DepartmentStore_ElevatorDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_DeptStoreElevator, sDoorAnimPalettes_DeptStoreElevator}, {METATILE_PokemonCenter_CableClubDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_CableClub, sDoorAnimPalettes_CableClub}, {METATILE_SilphCo_HideoutElevatorDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_HideoutElevator, sDoorAnimPalettes_HideoutElevator}, {METATILE_SSAnne_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x2, sDoorAnimTiles_SSAnne, sDoorAnimPalettes_SSAnne}, {METATILE_SilphCo_ElevatorDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_SilphCoElevator, sDoorAnimPalettes_SilphCoElevator}, {METATILE_SeaCottage_Teleporter_Door, DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_Teleporter, sDoorAnimPalettes_Teleporter}, {METATILE_TrainerTower_LobbyElevatorDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_TrainerTowerLobbyElevator, sDoorAnimPalettes_TrainerTowerLobbyElevator}, {METATILE_TrainerTower_RoofElevatorDoor, DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_TrainerTowerRoofElevator, sDoorAnimPalettes_TrainerTowerRoofElevator}, {METATILE_BerryForest_Door, DOOR_SOUND_NORMAL, DOOR_SIZE_1x1, sDoorAnimTiles_Sevii45, sDoorAnimPalettes_Sevii45}, {METATILE_BattleFrontierOutsideEast_BattleTower, DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_BattleTower, sDoorAnimPalettes_SlidingSingle}, {METATILE_BattleFrontier_BattleTowerElevator, DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_BattleTowerElevator, sDoorAnimPalettes_SSAnne}, {} }; static void DrawDoor(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, int x, int y) { if (frames->tileOffset == CLOSED_DOOR_TILES_OFFSET) DrawClosedDoorTiles(gfx, x, y); else { CopyDoorTilesToVram(&gfx->tiles[frames->tileOffset]); DrawCurrentDoorAnimFrame(gfx, x, y, gfx->paletteNums); } } static void DrawClosedDoorTiles(const struct DoorGraphics *gfx, int x, int y) { if (gfx->size == DOOR_SIZE_1x1) CurrentMapDrawMetatileAt(x, y); else { CurrentMapDrawMetatileAt(x, y); CurrentMapDrawMetatileAt(x, y - 1); } } // NOTE: The tiles of a door's animation must be copied to VRAM because they are // not already part of any given tileset. This means that if there are any // pre-existing tiles in this copied region that are visible when the door // animation is played, they will be overwritten. #define DOOR_TILE_START (NUM_TILES_TOTAL - 8) static void CopyDoorTilesToVram(const u8 *tiles) { CpuFastCopy(tiles, (void *)(VRAM + TILE_OFFSET_4BPP(DOOR_TILE_START)), 8 * TILE_SIZE_4BPP); } static void DrawCurrentDoorAnimFrame(const struct DoorGraphics *gfx, int x, int y, const u8 *paletteNums) { u16 tiles[8]; if (gfx->size == DOOR_SIZE_1x1) BuildDoorTiles(tiles, DOOR_TILE_START, paletteNums); else { BuildDoorTiles(tiles, DOOR_TILE_START, paletteNums); DrawDoorMetatileAt(x, y - 1, tiles); BuildDoorTiles(tiles, DOOR_TILE_START + 4, &paletteNums[4]); } DrawDoorMetatileAt(x, y, tiles); } static void BuildDoorTiles(u16 *tiles, u16 tileNum, const u8 *paletteNums) { int i; u16 tile; // Only the first 4 tiles of each metatile (bottom layer) actually use the door tiles for (i = 0; i < 4; i++) { tile = *(paletteNums++) << 12; tiles[i] = tile | (tileNum + i); } // The remaining tiles (top layer) always use tile 0 (with the same palette) for (; i < 8; i++) { tile = *(paletteNums++) << 12; tiles[i] = tile; } } #define tFramesHi data[0] #define tFramesLo data[1] #define tGfxHi data[2] #define tGfxLo data[3] #define tFrameId data[4] #define tCounter data[5] #define tX data[6] #define tY data[7] static void Task_AnimateDoor(u8 taskId) { s16 *data = gTasks[taskId].data; const struct DoorAnimFrame *frames = (struct DoorAnimFrame *)((u16)tFramesHi << 16 | (u16)tFramesLo); const struct DoorGraphics *gfx = (struct DoorGraphics *)((u16)tGfxHi << 16 | (u16)tGfxLo); if (!AnimateDoorFrame(gfx, frames, data)) DestroyTask(taskId); } static bool32 AnimateDoorFrame(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, s16 *data) { if (tCounter == 0) DrawDoor(gfx, &frames[tFrameId], tX, tY); if (tCounter == frames[tFrameId].duration) { tCounter = 0; tFrameId++; if (frames[tFrameId].duration == 0) // final frame has been reached return FALSE; else return TRUE; } tCounter++; return TRUE; } static const struct DoorGraphics *GetDoorGraphics(const struct DoorGraphics *gfx, u16 id) { while (gfx->tiles != NULL) { if (gfx->metatileId == id) return gfx; gfx++; } return NULL; } static s8 StartDoorAnimationTask(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, int x, int y) { u8 taskId; s16 *data; if (FuncIsActiveTask(Task_AnimateDoor) == TRUE) return -1; taskId = CreateTask(Task_AnimateDoor, 80); data = gTasks[taskId].data; tX = x; tY = y; tFramesLo = (uintptr_t)frames; tFramesHi = (uintptr_t)frames >> 16; tGfxLo = (uintptr_t)gfx; tGfxHi = (uintptr_t)gfx >> 16; return taskId; } #undef tFramesHi #undef tFramesLo #undef tGfxHi #undef tGfxLo #undef tFrameId #undef tCounter #undef tX #undef tY static void DrawClosedDoor(const struct DoorGraphics *gfx, int x, int y) { DrawClosedDoorTiles(gfx, x, y); } static void DrawOpenedDoor(const struct DoorGraphics *gfx, int x, int y) { gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); if (gfx != NULL) { const struct DoorAnimFrame *frames = gfx->size == DOOR_SIZE_1x1 ? sDoorAnimFrames_OpenSmall : sDoorAnimFrames_OpenLarge; DrawDoor(gfx, GetLastDoorAnimFrame(frames), x, y); } } static const struct DoorAnimFrame *GetLastDoorAnimFrame(const struct DoorAnimFrame *frames) { while (frames->duration != 0) frames++; return frames - 1; } static s8 AnimateDoorOpenInternal(const struct DoorGraphics *gfx, int x, int y) { gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); if (gfx == NULL) return -1; else if (gfx->size == DOOR_SIZE_1x1) return StartDoorAnimationTask(gfx, sDoorAnimFrames_OpenSmall, x, y); else return StartDoorAnimationTask(gfx, sDoorAnimFrames_OpenLarge, x, y); } static s8 StartDoorCloseAnimation(const struct DoorGraphics *gfx, int x, int y) { gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); if (gfx == NULL) return -1; else if (gfx->size == DOOR_SIZE_1x1) return StartDoorAnimationTask(gfx, sDoorAnimFrames_CloseSmall, x, y); else return StartDoorAnimationTask(gfx, sDoorAnimFrames_CloseLarge, x, y); } void FieldSetDoorOpened(int x, int y) { if (MetatileBehavior_IsWarpDoor_2(MapGridGetMetatileBehaviorAt((s16)x, (s16)y))) DrawOpenedDoor(sDoorGraphics, x, y); } void FieldSetDoorClosed(int x, int y) { if (MetatileBehavior_IsWarpDoor_2(MapGridGetMetatileBehaviorAt((s16)x, (s16)y))) DrawClosedDoor(sDoorGraphics, x, y); } s8 FieldAnimateDoorClose(int x, int y) { if (!MetatileBehavior_IsWarpDoor_2(MapGridGetMetatileBehaviorAt((s16)x, (s16)y))) return -1; return StartDoorCloseAnimation(sDoorGraphics, x, y); } s8 FieldAnimateDoorOpen(int x, int y) { if (!MetatileBehavior_IsWarpDoor_2(MapGridGetMetatileBehaviorAt((s16)x, (s16)y))) return -1; return AnimateDoorOpenInternal(sDoorGraphics, x, y); } bool8 FieldIsDoorAnimationRunning(void) { return FuncIsActiveTask(Task_AnimateDoor); } u16 GetDoorSoundEffect(int x, int y) { if (GetDoorSoundType(sDoorGraphics, x, y) == DOOR_SOUND_NORMAL) return SE_DOOR; else // DOOR_SOUND_SLIDING return SE_SLIDING_DOOR; } static s8 GetDoorSoundType(const struct DoorGraphics *gfx, int x, int y) { gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); if (gfx == NULL) return -1; return gfx->sound; } ================================================ FILE: src/field_effect.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "event_data.h" #include "event_object_movement.h" #include "field_camera.h" #include "field_control_avatar.h" #include "field_effect.h" #include "field_effect_helpers.h" #include "field_effect_scripts.h" #include "field_fadetransition.h" #include "field_player_avatar.h" #include "field_weather.h" #include "fieldmap.h" #include "help_system.h" #include "metatile_behavior.h" #include "new_menu_helpers.h" #include "overworld.h" #include "party_menu.h" #include "pokemon_storage_system.h" #include "quest_log.h" #include "script.h" #include "special_field_anim.h" #include "task.h" #include "trainer_pokemon_sprites.h" #include "trig.h" #include "util.h" #include "constants/event_object_movement.h" #include "constants/layouts.h" #include "constants/maps.h" #include "constants/map_groups.h" #include "constants/metatile_behaviors.h" #include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/sound.h" extern struct CompressedSpritePalette gMonPaletteTable[]; // Intentionally declared (incorrectly) without const in order to match extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; #define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} #define FIELD_EFFECT_COUNT 32 EWRAM_DATA u32 gFieldEffectArguments[8] = {0}; static u8 sFieldEffectActiveList[FIELD_EFFECT_COUNT]; static void FieldEffectActiveListAdd(u8 fldeff); static bool8 FieldEffectCmd_loadtiles(const u8 **script, u32 *result); static bool8 FieldEffectCmd_loadfadedpal(const u8 **script, u32 *result); static bool8 FieldEffectCmd_loadpal(const u8 **script, u32 *result); static bool8 FieldEffectCmd_callnative(const u8 **script, u32 *result); static bool8 FieldEffectCmd_end(const u8 **script, u32 *result); static bool8 FieldEffectCmd_loadgfx_callnative(const u8 **script, u32 *result); static bool8 FieldEffectCmd_loadtiles_callnative(const u8 **script, u32 *result); static bool8 FieldEffectCmd_loadfadedpal_callnative(const u8 **script, u32 *result); static void FieldEffectScript_LoadTiles(const u8 **script); static void FieldEffectScript_LoadFadedPal(const u8 **script); static void FieldEffectScript_LoadPal(const u8 **script); static void FieldEffectScript_CallNative(const u8 **script, u32 *result); static void FieldEffectFreeTilesIfUnused(u16 tilesTag); static void FieldEffectFreePaletteIfUnused(u8 paletteNum); static void Task_PokecenterHeal(u8 taskId); static void SpriteCB_PokeballGlow(struct Sprite *sprite); static void SpriteCB_PokecenterMonitor(struct Sprite *sprite); static void SpriteCB_HallOfFameMonitor(struct Sprite *sprite); // Unused static const u16 sNewGameOakObject_Gfx[] = INCBIN_U16("graphics/field_effects/pics/new_game_oak.4bpp"); static const u16 sNewGameOakObject_Pal[] = INCBIN_U16("graphics/field_effects/pics/new_game_oak.gbapal"); static const u16 sPokeballGlow_Gfx[] = INCBIN_U16("graphics/field_effects/pics/pokeball_glow.4bpp"); static const u16 sPokeballGlow_Pal[] = INCBIN_U16("graphics/field_effects/pics/pokeball_glow.gbapal"); static const u16 sPokecenterMonitor_Gfx[] = INCBIN_U16("graphics/field_effects/pics/pokemoncenter_monitor.4bpp"); static const u16 sHofMonitor_Pal[] = INCBIN_U16("graphics/field_effects/pics/hof_monitor.gbapal"); static const u16 sHofMonitor_Gfx[] = INCBIN_U16("graphics/field_effects/pics/hof_monitor.4bpp"); static const u16 sFieldMoveStreaksOutdoors_Gfx[] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks_outdoors.4bpp"); static const u16 sFieldMoveStreaksOutdoors_Pal[] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks_outdoors.gbapal"); static const u16 sFieldMoveStreaksOutdoors_Tilemap[] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks_outdoors.bin"); static const u16 sFieldMoveStreaksIndoors_Gfx[] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks_indoors.4bpp"); static const u16 sFieldMoveStreaksIndoors_Pal[] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks_indoors.gbapal"); static const u16 sFieldMoveStreaksIndoors_Tilemap[] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks_indoors.bin"); static const u16 sRockFragment_TopLeft[] = INCBIN_U16("graphics/field_effects/pics/deoxys_rock_fragment_top_left.4bpp"); static const u16 sRockFragment_TopRight[] = INCBIN_U16("graphics/field_effects/pics/deoxys_rock_fragment_top_right.4bpp"); static const u16 sRockFragment_BottomLeft[] = INCBIN_U16("graphics/field_effects/pics/deoxys_rock_fragment_bottom_left.4bpp"); static const u16 sRockFragment_BottomRight[] = INCBIN_U16("graphics/field_effects/pics/deoxys_rock_fragment_bottom_right.4bpp"); static bool8 (*const sFldEffScrcmdTable[])(const u8 **script, u32 *result) = { FieldEffectCmd_loadtiles, FieldEffectCmd_loadfadedpal, FieldEffectCmd_loadpal, FieldEffectCmd_callnative, FieldEffectCmd_end, FieldEffectCmd_loadgfx_callnative, FieldEffectCmd_loadtiles_callnative, FieldEffectCmd_loadfadedpal_callnative }; static const struct OamData sNewGameOakOamAttributes = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 0, .paletteNum = 0, .affineParam = 0 }; static const struct OamData sOamData_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0x000, .priority = 0, .paletteNum = 0, .affineParam = 0 }; static const struct OamData sOamData_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0x000, .priority = 0, .paletteNum = 0, .affineParam = 0 }; static const struct SpriteFrameImage sNewGameOakObjectSpriteFrames[] = { {sNewGameOakObject_Gfx, 0x800} }; static const struct SpritePalette sNewGameOakObjectPaletteInfo = { sNewGameOakObject_Pal, 4102 }; static const union AnimCmd sNewGameOakAnim[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; static const union AnimCmd *const sNewGameOakAnimTable[] = { sNewGameOakAnim }; static const struct SpriteTemplate sNewGameOakObjectTemplate = { .tileTag = TAG_NONE, .paletteTag = 0x1006, .oam = &sNewGameOakOamAttributes, .anims = sNewGameOakAnimTable, .images = sNewGameOakObjectSpriteFrames, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; const struct SpritePalette gSpritePalette_PokeballGlow = { sPokeballGlow_Pal, 4103 }; const struct SpritePalette gSpritePalette_HofMonitor = { sHofMonitor_Pal, 4112 }; static const struct OamData sOamData_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0x000, .priority = 0, .paletteNum = 0, .affineParam = 0 }; static const struct SpriteFrameImage sPicTable_PokeballGlow[] = { {sPokeballGlow_Gfx, 0x20} }; static const struct SpriteFrameImage sPicTable_PokecenterMonitor[] = { {sPokecenterMonitor_Gfx + 0x000, 0x100}, {sPokecenterMonitor_Gfx + 0x080, 0x100}, {sPokecenterMonitor_Gfx + 0x100, 0x100}, {sPokecenterMonitor_Gfx + 0x180, 0x100} }; static const struct SpriteFrameImage sPicTable_HofMonitor[] = { {sHofMonitor_Gfx + 0x00, 0x80}, {sHofMonitor_Gfx + 0x40, 0x80}, {sHofMonitor_Gfx + 0x80, 0x80}, {sHofMonitor_Gfx + 0xC0, 0x80} }; // Unused, leftover from RSE static const struct Subsprite sSubsprites_PokecenterMonitor[] = { { .x = -12, .y = -8, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 0, .priority = 2 }, { .x = 4, .y = -8, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 2, .priority = 2 }, { .x = -12, .y = 0, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 3, .priority = 2 }, { .x = 4, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 5, .priority = 2 } }; // Unused, leftover from RSE static const struct SubspriteTable sSubspriteTable_PokecenterMonitor = subsprite_table(sSubsprites_PokecenterMonitor); // Unused, leftover from RSE static const struct Subsprite sSubsprites_HofMonitorBig[] = { { .x = -32, .y = -8, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 2 }, { .x = 0, .y = -8, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 4, .priority = 2 }, { .x = -32, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 8, .priority = 2 }, { .x = 0, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 12, .priority = 2 } }; // Unused, leftover from RSE static const struct SubspriteTable sSubspriteTable_HofMonitorBig = subsprite_table(sSubsprites_HofMonitorBig); static const union AnimCmd sAnim_Static[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Flicker[] = { ANIMCMD_FRAME(1, 5), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(3, 7), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(1, 5), ANIMCMD_FRAME(0, 5), ANIMCMD_LOOP(3), ANIMCMD_END }; static const union AnimCmd *const sAnims_Flicker[] = { sAnim_Static, sAnim_Flicker }; static const union AnimCmd sAnim_HofMonitor[] = { ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_LOOP(2), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_END }; static const union AnimCmd *const sAnims_HofMonitor[] = { sAnim_HofMonitor }; static const struct SpriteTemplate sSpriteTemplate_PokeballGlow = { .tileTag = TAG_NONE, .paletteTag = 4103, .oam = &sOamData_8x8, .anims = sAnims_Flicker, .images = sPicTable_PokeballGlow, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PokeballGlow }; static const struct SpriteTemplate sSpriteTemplate_PokecenterMonitor = { .tileTag = TAG_NONE, .paletteTag = 4103, .oam = &sOamData_32x16, .anims = sAnims_Flicker, .images = sPicTable_PokecenterMonitor, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PokecenterMonitor }; static const struct SpriteTemplate sSpriteTemplate_HofMonitor = { .tileTag = TAG_NONE, .paletteTag = 4112, .oam = &sOamData_16x16, .anims = sAnims_HofMonitor, .images = sPicTable_HofMonitor, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_HallOfFameMonitor }; u32 FieldEffectStart(u8 fldeff) { const u8 *script; u32 result; FieldEffectActiveListAdd(fldeff); script = gFieldEffectScriptPointers[fldeff]; while (sFldEffScrcmdTable[*script](&script, &result)) ; return result; } static bool8 FieldEffectCmd_loadtiles(const u8 **script, u32 *result) { (*script)++; FieldEffectScript_LoadTiles(script); return TRUE; } static bool8 FieldEffectCmd_loadfadedpal(const u8 **script, u32 *result) { (*script)++; FieldEffectScript_LoadFadedPal(script); return TRUE; } static bool8 FieldEffectCmd_loadpal(const u8 **script, u32 *result) { (*script)++; FieldEffectScript_LoadPal(script); return TRUE; } static bool8 FieldEffectCmd_callnative(const u8 **script, u32 *result) { (*script)++; FieldEffectScript_CallNative(script, result); return TRUE; } static bool8 FieldEffectCmd_end(const u8 **script, u32 *result) { return FALSE; } static bool8 FieldEffectCmd_loadgfx_callnative(const u8 **script, u32 *result) { (*script)++; FieldEffectScript_LoadTiles(script); FieldEffectScript_LoadFadedPal(script); FieldEffectScript_CallNative(script, result); return TRUE; } static bool8 FieldEffectCmd_loadtiles_callnative(const u8 **script, u32 *result) { (*script)++; FieldEffectScript_LoadTiles(script); FieldEffectScript_CallNative(script, result); return TRUE; } extern const struct SpritePalette gSpritePalette_GeneralFieldEffect0; //sand footprints pal extern const struct SpritePalette gBlackSandFootprintsPal; extern const struct SpritePalette gThreeIslandGrassPal; extern const struct SpritePalette gSpritePalette_GeneralFieldEffect1; //tall grass pal extern const struct SpritePalette gSnowFootprintsPal; static bool8 FieldEffectCmd_loadfadedpal_callnative(const u8 **script, u32 *result) { (*script)++; FieldEffectScript_LoadFadedPal(script); FieldEffectScript_CallNative(script, result); return TRUE; } static u32 FieldEffectScript_ReadWord(const u8 **script) { return T2_READ_32(*script); } static void FieldEffectScript_LoadTiles(const u8 **script) { const struct SpriteSheet * spriteSheet = (const struct SpriteSheet * )FieldEffectScript_ReadWord(script); if (GetSpriteTileStartByTag(spriteSheet->tag) == 0xFFFF) LoadSpriteSheet(spriteSheet); *script += sizeof(u32); } void ApplyGlobalFieldPaletteTint(u8 paletteIdx) { switch (gGlobalFieldTintMode) { case 0: return; case 1: TintPalette_GrayScale(&gPlttBufferUnfaded[OBJ_PLTT_ID2(paletteIdx)], 16); break; case 2: TintPalette_SepiaTone(&gPlttBufferUnfaded[OBJ_PLTT_ID2(paletteIdx)], 16); break; case 3: QuestLog_BackUpPalette(OBJ_PLTT_ID2(paletteIdx), 16); TintPalette_GrayScale(&gPlttBufferUnfaded[OBJ_PLTT_ID2(paletteIdx)], 16); break; default: return; } CpuFastCopy(&gPlttBufferUnfaded[OBJ_PLTT_ID2(paletteIdx)], &gPlttBufferFaded[OBJ_PLTT_ID2(paletteIdx)], PLTT_SIZE_4BPP); } static void FieldEffectScript_LoadFadedPal(const u8 **script) { u8 mapsec = GetCurrentRegionMapSectionId(); const struct SpritePalette * spritePalette; u8 idx; if((const struct SpritePalette * )FieldEffectScript_ReadWord(script) == &gSpritePalette_GeneralFieldEffect0) //overwrite sand footprints palette { if(mapsec == MAPSEC_ONE_ISLAND || mapsec == MAPSEC_TREASURE_BEACH || mapsec == MAPSEC_KINDLE_ROAD) //if one island { spritePalette = &gBlackSandFootprintsPal; } else if(gSaveBlock1Ptr->mapLayoutId == LAYOUT_FOUR_ISLAND) //Four Island town's snow footprints { spritePalette = &gSnowFootprintsPal; } else { spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script); } } else if((const struct SpritePalette * )FieldEffectScript_ReadWord(script) == &gSpritePalette_GeneralFieldEffect1) //overwrite tall grass palette { if(mapsec == MAPSEC_BOND_BRIDGE || mapsec == MAPSEC_THREE_ISLE_PORT || mapsec == MAPSEC_BERRY_FOREST) //if three island { spritePalette = &gThreeIslandGrassPal; } else { spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script); } } else { spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script); } idx = IndexOfSpritePaletteTag(spritePalette->tag); LoadSpritePalette(spritePalette); if (idx == 0xFF) ApplyGlobalFieldPaletteTint(IndexOfSpritePaletteTag(spritePalette->tag)); UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(spritePalette->tag)); *script += sizeof(u32); } static void FieldEffectScript_LoadPal(const u8 **script) { const struct SpritePalette * spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script); u8 idx = IndexOfSpritePaletteTag(spritePalette->tag); LoadSpritePalette(spritePalette); if (idx != 0xFF) ApplyGlobalFieldPaletteTint(IndexOfSpritePaletteTag(spritePalette->tag)); *script += sizeof(u32); } static void FieldEffectScript_CallNative(const u8 **script, u32 *result) { u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script); *result = func(); *script += sizeof(u32); } static void FieldEffectFreeGraphicsResources(struct Sprite *sprite) { u16 tileStart = sprite->sheetTileStart; u8 paletteNum = sprite->oam.paletteNum; DestroySprite(sprite); FieldEffectFreeTilesIfUnused(tileStart); FieldEffectFreePaletteIfUnused(paletteNum); } void FieldEffectStop(struct Sprite *sprite, u8 fldeff) { FieldEffectFreeGraphicsResources(sprite); FieldEffectActiveListRemove(fldeff); } static void FieldEffectFreeTilesIfUnused(u16 tileStart) { u32 i; u16 tileTag = GetSpriteTileTagByTileStart(tileStart); if (tileTag == TAG_NONE) return; for (i = 0; i < MAX_SPRITES; i++) { if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart) return; } FreeSpriteTilesByTag(tileTag); } static void FieldEffectFreePaletteIfUnused(u8 paletteNum) { u32 i; u16 paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); if (paletteTag == TAG_NONE) return; for (i = 0; i < MAX_SPRITES; i++) { if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum) return; } FreeSpritePaletteByTag(paletteTag); } void FieldEffectActiveListClear(void) { u32 i; for (i = 0; i < FIELD_EFFECT_COUNT; i++) { sFieldEffectActiveList[i] = 0xFF; } } static void FieldEffectActiveListAdd(u8 fldeff) { u32 i; for (i = 0; i < FIELD_EFFECT_COUNT; i++) { if (sFieldEffectActiveList[i] == 0xFF) { sFieldEffectActiveList[i] = fldeff; return; } } } void FieldEffectActiveListRemove(u8 fldeff) { u32 i; for (i = 0; i < FIELD_EFFECT_COUNT; i++) { if (sFieldEffectActiveList[i] == fldeff) { sFieldEffectActiveList[i] = 0xFF; return; } } } bool8 FieldEffectActiveListContains(u8 fldeff) { u32 i; for (i = 0; i < FIELD_EFFECT_COUNT; i++) { if (sFieldEffectActiveList[i] == fldeff) { return TRUE; } } return FALSE; } u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer) { struct SpriteTemplate spriteTemplate; LoadCompressedSpritePaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer); LoadCompressedSpriteSheetOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer); spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag; spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag; spriteTemplate.oam = &sNewGameOakOamAttributes; spriteTemplate.anims = gDummySpriteAnimTable; spriteTemplate.images = NULL; spriteTemplate.affineAnims = gDummySpriteAffineAnimTable; spriteTemplate.callback = SpriteCallbackDummy; return CreateSprite(&spriteTemplate, x, y, subpriority); } // Unused static void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) { LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, PLTT_SIZE_4BPP); } // Unused static u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority) { LoadSpritePalette(&sNewGameOakObjectPaletteInfo); return CreateSprite(&sNewGameOakObjectTemplate, x, y, subpriority); } u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) { u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, 0, 0x8000, TRUE, x, y, 0, gMonPaletteTable[species].tag); PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[species].tag) + 0x10); if (spriteId == 0xFFFF) return MAX_SPRITES; else return spriteId; } static u8 CreateMonSprite_FieldMove(u16 species, u32 otId, u32 personality, s16 x, s16 y, u8 subpriority) { const struct CompressedSpritePalette * spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, 1, x, y, 0, spritePalette->tag); PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); if (spriteId == 0xFFFF) return MAX_SPRITES; else return spriteId; } void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId) { ResetPreservedPalettesInWeather(); if (sprite->oam.affineMode != ST_OAM_AFFINE_OFF) { FreeOamMatrix(sprite->oam.matrixNum); } FreeAndDestroyMonPicSprite(spriteId); } // r, g, b are between 0 and 16 void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) { int curRed; int curGreen; int curBlue; u16 outPal; outPal = gPlttBufferUnfaded[i]; curRed = outPal & 0x1f; curGreen = (outPal & (0x1f << 5)) >> 5; curBlue = (outPal & (0x1f << 10)) >> 10; curRed += (((0x1f - curRed) * r) >> 4); curGreen += (((0x1f - curGreen) * g) >> 4); curBlue += (((0x1f - curBlue) * b) >> 4); outPal = curRed; outPal |= curGreen << 5; outPal |= curBlue << 10; gPlttBufferFaded[i] = outPal; } // r, g, b are between 0 and 16 static void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) { int curRed; int curGreen; int curBlue; u16 outPal; outPal = gPlttBufferUnfaded[i]; curRed = outPal & 0x1f; curGreen = (outPal & (0x1f << 5)) >> 5; curBlue = (outPal & (0x1f << 10)) >> 10; curRed -= ((curRed * r) >> 4); curGreen -= ((curGreen * g) >> 4); curBlue -= ((curBlue * b) >> 4); outPal = curRed; outPal |= curGreen << 5; outPal |= curBlue << 10; gPlttBufferFaded[i] = outPal; } static void PokecenterHealEffect_Init(struct Task *task); static void PokecenterHealEffect_WaitForBallPlacement(struct Task *task); static void PokecenterHealEffect_WaitForBallFlashing(struct Task *task); static void PokecenterHealEffect_WaitForSoundAndEnd(struct Task *task); static void HallOfFameRecordEffect_Init(struct Task *task); static void HallOfFameRecordEffect_WaitForBallPlacement(struct Task *task); static void HallOfFameRecordEffect_WaitForBallFlashing(struct Task *task); static void HallOfFameRecordEffect_WaitForSoundAndEnd(struct Task *task); static void Task_HallOfFameRecord(u8 taskId); static u8 CreateGlowingPokeballsEffect(s16 duration, s16 x, s16 y, bool16 fanfare); static void SpriteCB_PokeballGlowEffect(struct Sprite *sprite); static void PokeballGlowEffect_PlaceBalls(struct Sprite *sprite); static void PokeballGlowEffect_TryPlaySe(struct Sprite *sprite); static void PokeballGlowEffect_FlashFirstThree(struct Sprite *sprite); static void PokeballGlowEffect_FlashLast(struct Sprite *sprite); static void PokeballGlowEffect_WaitAfterFlash(struct Sprite *sprite); static void PokeballGlowEffect_Dummy(struct Sprite *sprite); static void PokeballGlowEffect_WaitForSound(struct Sprite *sprite); static void PokeballGlowEffect_Idle(struct Sprite *sprite); static u8 CreatePokecenterMonitorSprite(s32 x, s32 y); static void CreateHofMonitorSprite(s32 x, s32 y); static void (*const sPokecenterHealEffectFuncs[])(struct Task *) = { PokecenterHealEffect_Init, PokecenterHealEffect_WaitForBallPlacement, PokecenterHealEffect_WaitForBallFlashing, PokecenterHealEffect_WaitForSoundAndEnd }; static void (*const sHallOfFameRecordEffectFuncs[])(struct Task *) = { HallOfFameRecordEffect_Init, HallOfFameRecordEffect_WaitForBallPlacement, HallOfFameRecordEffect_WaitForBallFlashing, HallOfFameRecordEffect_WaitForSoundAndEnd }; static void (*const sPokeballGlowEffectFuncs[])(struct Sprite *) = { PokeballGlowEffect_PlaceBalls, PokeballGlowEffect_TryPlaySe, PokeballGlowEffect_FlashFirstThree, PokeballGlowEffect_FlashLast, PokeballGlowEffect_WaitAfterFlash, PokeballGlowEffect_Dummy, PokeballGlowEffect_WaitForSound, PokeballGlowEffect_Idle }; static u32 CountAliveMonsInNuzlocke(void) { u32 i, count; for (i = 0, count = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) { if(GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) count++; } } return count; } // Task data for Task_PokecenterHeal and Task_HallOfFameRecord #define tState data[0] #define tNumMons data[1] #define tFirstBallX data[2] #define tFirstBallY data[3] #define tMonitorX data[4] #define tMonitorY data[5] #define tGlowEffectSpriteId data[6] #define tMonitorSpriteId data[7] // Sprite data for SpriteCB_PokeballGlowEffect #define sState data[0] #define sTimer data[1] #define sCounter data[2] #define sNumFlashed data[3] #define sPlayHealSe data[5] #define sNumMons data[6] #define sSpriteId data[7] // Sprite data for SpriteCB_PokeballGlow #define sGlowEffectSpriteId data[0] // Sprite data for SpriteCB_PokecenterMonitor #define sStartFlash data[0] bool8 FldEff_PokecenterHeal(void) { u8 nPokemon; struct Task *task; if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) nPokemon = CountAliveMonsInNuzlocke(); else nPokemon = CountPartyNonEggMons(); task = &gTasks[CreateTask(Task_PokecenterHeal, 0xFF)]; task->tNumMons = nPokemon; task->tFirstBallX = 93; task->tFirstBallY = 36; task->tMonitorX = 128; task->tMonitorY = 24; if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_HOUSE_ROOM2) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM2)) { //for the Battle House healing machine task->tFirstBallY = 68; } return FALSE; } static void Task_PokecenterHeal(u8 taskId) { struct Task *task = &gTasks[taskId]; sPokecenterHealEffectFuncs[task->tState](task); } static void PokecenterHealEffect_Init(struct Task *task) { task->tState++; task->tGlowEffectSpriteId = CreateGlowingPokeballsEffect(task->tNumMons, task->tFirstBallX, task->tFirstBallY, TRUE); task->tMonitorSpriteId = CreatePokecenterMonitorSprite(task->tMonitorX, task->tMonitorY); } static void PokecenterHealEffect_WaitForBallPlacement(struct Task *task) { if (gSprites[task->tGlowEffectSpriteId].sState >= 2) { gSprites[task->tMonitorSpriteId].sStartFlash++; task->tState++; } } static void PokecenterHealEffect_WaitForBallFlashing(struct Task *task) { if (gSprites[task->tGlowEffectSpriteId].sState > 4) task->tState++; } static void PokecenterHealEffect_WaitForSoundAndEnd(struct Task *task) { if (gSprites[task->tGlowEffectSpriteId].sState > 6) { DestroySprite(&gSprites[task->tGlowEffectSpriteId]); FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL); DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal)); } } bool8 FldEff_HallOfFameRecord(void) { u8 nPokemon; struct Task *task; nPokemon = CalculatePlayerPartyCount(); task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xFF)]; task->tNumMons = nPokemon; task->tFirstBallX = 117; task->tFirstBallY = 60; return FALSE; } static void Task_HallOfFameRecord(u8 taskId) { struct Task *task; task = &gTasks[taskId]; sHallOfFameRecordEffectFuncs[task->tState](task); } static void HallOfFameRecordEffect_Init(struct Task *task) { u8 taskId; task->tState++; task->tGlowEffectSpriteId = CreateGlowingPokeballsEffect(task->tNumMons, task->tFirstBallX, task->tFirstBallY, FALSE); } static void HallOfFameRecordEffect_WaitForBallPlacement(struct Task *task) { if (gSprites[task->tGlowEffectSpriteId].sState > 1) { CreateHofMonitorSprite(120, 25); task->data[15]++; // unused, leftover from RSE task->tState++; } } static void HallOfFameRecordEffect_WaitForBallFlashing(struct Task *task) { if (gSprites[task->tGlowEffectSpriteId].sState > 4) task->tState++; } static void HallOfFameRecordEffect_WaitForSoundAndEnd(struct Task *task) { if (gSprites[task->tGlowEffectSpriteId].sState > 6) { DestroySprite(&gSprites[task->tGlowEffectSpriteId]); FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD); DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); } } #undef tState #undef tNumMons #undef tFirstBallX #undef tFirstBallY #undef tMonitorX #undef tMonitorY #undef tGlowEffectSpriteId #undef tMonitorSpriteId static u8 CreateGlowingPokeballsEffect(s16 numMons, s16 x, s16 y, bool16 playHealSe) { u8 spriteId; struct Sprite *sprite; spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect); sprite = &gSprites[spriteId]; sprite->x2 = x; sprite->y2 = y; sprite->subpriority = 0xFF; sprite->sPlayHealSe = playHealSe; sprite->sNumMons = numMons; sprite->sSpriteId = spriteId; return spriteId; } static void SpriteCB_PokeballGlowEffect(struct Sprite *sprite) { sPokeballGlowEffectFuncs[sprite->sState](sprite); } static const struct Coords16 sPokeballCoordOffsets[] = { {0, 0}, {6, 0}, {0, 4}, {6, 4}, {0, 8}, {6, 8} }; static const u8 sPokeballGlowReds[] = {16, 12, 8, 0}; static const u8 sPokeballGlowGreens[] = {16, 12, 8, 0}; static const u8 sPokeballGlowBlues[] = { 0, 0, 0, 0}; static void PokeballGlowEffect_PlaceBalls(struct Sprite *sprite) { u8 spriteId; if (sprite->sTimer == 0 || (--sprite->sTimer) == 0) { sprite->sTimer = 25; spriteId = CreateSpriteAtEnd(&sSpriteTemplate_PokeballGlow, sPokeballCoordOffsets[sprite->sCounter].x + sprite->x2, sPokeballCoordOffsets[sprite->sCounter].y + sprite->y2, 0xFF); gSprites[spriteId].oam.priority = 2; gSprites[spriteId].sGlowEffectSpriteId = sprite->sSpriteId; sprite->sCounter++; sprite->sNumMons--; PlaySE(SE_BALL); } if (sprite->sNumMons == 0) { sprite->sTimer = 32; sprite->sState++; } } static void PokeballGlowEffect_TryPlaySe(struct Sprite *sprite) { if ((--sprite->sTimer) == 0) { sprite->sState++; sprite->sTimer = 8; sprite->sCounter = 0; sprite->sNumFlashed = 0; if (sprite->sPlayHealSe) PlayFanfare(MUS_RS_HEAL); } } static void PokeballGlowEffect_FlashFirstThree(struct Sprite *sprite) { u8 phase; if ((--sprite->sTimer) == 0) { sprite->sTimer = 8; sprite->sCounter++; sprite->sCounter &= 3; if (sprite->sCounter == 0) sprite->sNumFlashed++; } phase = (sprite->sCounter + 3) & 3; MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 8, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); phase = (sprite->sCounter + 2) & 3; MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 6, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); phase = (sprite->sCounter + 1) & 3; MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 2, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); phase = sprite->sCounter; MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 5, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 3, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); if (sprite->sNumFlashed >= 3) { sprite->sState++; sprite->sTimer = 8; sprite->sCounter = 0; } } static void PokeballGlowEffect_FlashLast(struct Sprite *sprite) { u8 phase; if ((--sprite->sTimer) == 0) { sprite->sTimer = 8; sprite->sCounter++; sprite->sCounter &= 3; if (sprite->sCounter == 3) { sprite->sState++; sprite->sTimer = 30; } } phase = sprite->sCounter; MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 8, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 6, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 2, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 5, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 3, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); } static void PokeballGlowEffect_WaitAfterFlash(struct Sprite *sprite) { if ((--sprite->sTimer) == 0) sprite->sState++; } static void PokeballGlowEffect_Dummy(struct Sprite *sprite) { sprite->sState++; } static void PokeballGlowEffect_WaitForSound(struct Sprite *sprite) { if (sprite->sPlayHealSe == FALSE || IsFanfareTaskInactive()) sprite->sState++; } static void PokeballGlowEffect_Idle(struct Sprite *sprite) { } static void SpriteCB_PokeballGlow(struct Sprite *sprite) { if (gSprites[sprite->sGlowEffectSpriteId].sState > 4) FieldEffectFreeGraphicsResources(sprite); } #undef sState #undef sTimer #undef sCounter #undef sNumFlashed #undef sPlayHealSe #undef sNumMons #undef sSpriteId #undef sGlowEffectSpriteId static u8 CreatePokecenterMonitorSprite(s32 x, s32 y) { u8 spriteId; struct Sprite *sprite; spriteId = CreateSpriteAtEnd(&sSpriteTemplate_PokecenterMonitor, x, y, 0); sprite = &gSprites[spriteId]; sprite->oam.priority = 2; sprite->invisible = TRUE; return spriteId; } static void SpriteCB_PokecenterMonitor(struct Sprite *sprite) { if (sprite->sStartFlash != FALSE) { sprite->sStartFlash = FALSE; sprite->invisible = FALSE; StartSpriteAnim(sprite, 1); } if (sprite->animEnded) FieldEffectFreeGraphicsResources(sprite); } #undef sStartFlash static void CreateHofMonitorSprite(s32 x, s32 y) { CreateSpriteAtEnd(&sSpriteTemplate_HofMonitor, x, y, 0); } static void SpriteCB_HallOfFameMonitor(struct Sprite *sprite) { if (sprite->animEnded) FieldEffectFreeGraphicsResources(sprite); } static void FieldCallback_UseFly(void); static void Task_UseFly(u8 taskId); static void FieldCallback_FlyIntoMap(void); static void Task_FlyIntoMap(u8 taskId); void ReturnToFieldFromFlyMapSelect(void) { SetMainCallback2(CB2_ReturnToField); gFieldCallback = FieldCallback_UseFly; } static void FieldCallback_UseFly(void) { FadeInFromBlack(); CreateTask(Task_UseFly, 0); LockPlayerFieldControls(); FreezeObjectEvents(); gFieldCallback = NULL; } static void Task_UseFly(u8 taskId) { struct Task *task; task = &gTasks[taskId]; if (task->data[0] == 0) { if (!IsWeatherNotFadingIn()) return; gFieldEffectArguments[0] = GetCursorSelectionMonId(); if ((int)gFieldEffectArguments[0] >= PARTY_SIZE) gFieldEffectArguments[0] = 0; FieldEffectStart(FLDEFF_FLY_OUT); task->data[0]++; } if (!FieldEffectActiveListContains(FLDEFF_FLY_OUT)) { Overworld_ResetStateAfterFly(); WarpIntoMap(); SetMainCallback2(CB2_LoadMap); gFieldCallback = FieldCallback_FlyIntoMap; DestroyTask(taskId); } } static void FieldCallback_FlyIntoMap(void) { Overworld_PlaySpecialMapMusic(); FadeInFromBlack(); CreateTask(Task_FlyIntoMap, 0); gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE; if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_WEST); LockPlayerFieldControls(); FreezeObjectEvents(); gFieldCallback = NULL; } static void Task_FlyIntoMap(u8 taskId) { struct Task *task; task = &gTasks[taskId]; if (task->data[0] == 0) { if (gPaletteFade.active) return; FieldEffectStart(FLDEFF_FLY_IN); task->data[0]++; } if (!FieldEffectActiveListContains(FLDEFF_FLY_IN)) { UnlockPlayerFieldControls(); UnfreezeObjectEvents(); DestroyTask(taskId); } } static void Task_FallWarpFieldEffect(u8 taskId); static bool8 FallWarpEffect_1(struct Task *task); static bool8 FallWarpEffect_2(struct Task *task); static bool8 FallWarpEffect_3(struct Task *task); static bool8 FallWarpEffect_4(struct Task *task); static bool8 FallWarpEffect_5(struct Task *task); static bool8 FallWarpEffect_6(struct Task *task); static bool8 FallWarpEffect_7(struct Task *task); static bool8 (*const sFallWarpEffectCBPtrs[])(struct Task *task) = { FallWarpEffect_1, FallWarpEffect_2, FallWarpEffect_3, FallWarpEffect_4, FallWarpEffect_5, FallWarpEffect_6, FallWarpEffect_7 }; void FieldCB_FallWarpExit(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); LockPlayerFieldControls(); FreezeObjectEvents(); CreateTask(Task_FallWarpFieldEffect, 0); gFieldCallback = NULL; } static void Task_FallWarpFieldEffect(u8 taskId) { struct Task *task = &gTasks[taskId]; while (sFallWarpEffectCBPtrs[task->data[0]](task)) ; } static bool8 FallWarpEffect_1(struct Task *task) { struct ObjectEvent * playerObject; struct Sprite *playerSprite; playerObject = &gObjectEvents[gPlayerAvatar.objectEventId]; playerSprite = &gSprites[gPlayerAvatar.spriteId]; CameraObjectReset2(); gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE; gPlayerAvatar.preventStep = TRUE; ObjectEventSetHeldMovement(playerObject, GetFaceDirectionMovementAction(GetPlayerFacingDirection())); task->data[4] = playerSprite->subspriteMode; playerObject->fixedPriority = TRUE; playerSprite->oam.priority = 1; playerSprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; task->data[0]++; return TRUE; } static bool8 FallWarpEffect_2(struct Task *task) { if (IsWeatherNotFadingIn()) { task->data[0]++; } return FALSE; } static bool8 FallWarpEffect_3(struct Task *task) { struct Sprite *sprite; s16 centerToCornerVecY; sprite = &gSprites[gPlayerAvatar.spriteId]; centerToCornerVecY = -(sprite->centerToCornerVecY << 1); sprite->y2 = -(sprite->y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); task->data[1] = 1; task->data[2] = 0; gObjectEvents[gPlayerAvatar.objectEventId].invisible = FALSE; PlaySE(SE_FALL); task->data[0]++; return FALSE; } static bool8 FallWarpEffect_4(struct Task *task) { struct ObjectEvent * objectEvent; struct Sprite *sprite; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->y2 += task->data[1]; if (task->data[1] < 8) { task->data[2] += task->data[1]; if (task->data[2] & 0xf) { task->data[1] <<= 1; } } if (task->data[3] == 0 && sprite->y2 >= -16) { task->data[3]++; objectEvent->fixedPriority = FALSE; sprite->subspriteMode = task->data[4]; objectEvent->triggerGroundEffectsOnMove = TRUE; } if (sprite->y2 >= 0) { PlaySE(SE_M_STRENGTH); objectEvent->triggerGroundEffectsOnStop = TRUE; objectEvent->landingJump = TRUE; sprite->y2 = 0; task->data[0]++; } return FALSE; } static bool8 FallWarpEffect_5(struct Task *task) { task->data[0]++; task->data[1] = 4; task->data[2] = 0; SetCameraPanningCallback(NULL); return TRUE; } static bool8 FallWarpEffect_6(struct Task *task) { SetCameraPanning(0, task->data[1]); task->data[1] = -task->data[1]; task->data[2]++; if ((task->data[2] & 3) == 0) { task->data[1] >>= 1; } if (task->data[1] == 0) { task->data[0]++; } return FALSE; } static bool8 FallWarpEffect_7(struct Task *task) { s16 x, y; gPlayerAvatar.preventStep = FALSE; UnlockPlayerFieldControls(); CameraObjectReset1(); UnfreezeObjectEvents(); InstallCameraPanAheadCallback(); PlayerGetDestCoords(&x, &y); if (MetatileBehavior_IsSurfableInSeafoamIslands(MapGridGetMetatileBehaviorAt(x, y)) == TRUE) { VarSet(VAR_TEMP_1, 1); SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_SURFING); SetHelpContext(HELPCONTEXT_SURFING); } DestroyTask(FindTaskIdByFunc(Task_FallWarpFieldEffect)); return FALSE; } static void Task_EscalatorWarpFieldEffect(u8 taskId); static bool8 EscalatorWarpEffect_1(struct Task *task); static bool8 EscalatorWarpEffect_2(struct Task *task); static bool8 EscalatorWarpEffect_3(struct Task *task); static bool8 EscalatorWarpEffect_4(struct Task *task); static bool8 EscalatorWarpEffect_5(struct Task *task); static bool8 EscalatorWarpEffect_6(struct Task *task); static void Escalator_AnimatePlayerGoingDown(struct Task *task); static void Escalator_AnimatePlayerGoingUp(struct Task *task); static void Escalator_BeginFadeOutToNewMap(void); static void Escalator_TransitionToWarpInEffect(void); static void FieldCB_EscalatorWarpIn(void); static void Task_EscalatorWarpInFieldEffect(u8 taskId); static bool8 EscalatorWarpInEffect_1(struct Task *task); static bool8 EscalatorWarpInEffect_2(struct Task *task); static bool8 EscalatorWarpInEffect_3(struct Task *task); static bool8 EscalatorWarpInEffect_4(struct Task *task); static bool8 EscalatorWarpInEffect_5(struct Task *task); static bool8 EscalatorWarpInEffect_6(struct Task *task); static bool8 EscalatorWarpInEffect_7(struct Task *task); static bool8 (*const sEscalatorWarpFieldEffectFuncs[])(struct Task *task) = { EscalatorWarpEffect_1, EscalatorWarpEffect_2, EscalatorWarpEffect_3, EscalatorWarpEffect_4, EscalatorWarpEffect_5, EscalatorWarpEffect_6 }; void StartEscalatorWarp(u8 metatileBehavior, u8 priority) { u8 taskId = CreateTask(Task_EscalatorWarpFieldEffect, priority); gTasks[taskId].data[1] = 0; if (metatileBehavior == MB_UP_ESCALATOR) gTasks[taskId].data[1] = 1; } static void Task_EscalatorWarpFieldEffect(u8 taskId) { struct Task *task = &gTasks[taskId]; while (sEscalatorWarpFieldEffectFuncs[task->data[0]](task)) ; } static bool8 EscalatorWarpEffect_1(struct Task *task) { FreezeObjectEvents(); CameraObjectReset2(); StartEscalator(task->data[1]); QuestLog_OnEscalatorWarp(QL_ESCALATOR_OUT); task->data[0]++; return FALSE; } static bool8 EscalatorWarpEffect_2(struct Task *task) { struct ObjectEvent * objectEvent; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent)) { ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetPlayerFacingDirection())); task->data[0]++; task->data[2] = 0; task->data[3] = 0; if ((u8)task->data[1] == 0) { task->data[0] = 4; } PlaySE(SE_ESCALATOR); } return FALSE; } static bool8 EscalatorWarpEffect_3(struct Task *task) { Escalator_AnimatePlayerGoingDown(task); if (task->data[2] > 3) { Escalator_BeginFadeOutToNewMap(); task->data[0]++; } return FALSE; } static bool8 EscalatorWarpEffect_4(struct Task *task) { Escalator_AnimatePlayerGoingDown(task); Escalator_TransitionToWarpInEffect(); return FALSE; } static bool8 EscalatorWarpEffect_5(struct Task *task) { Escalator_AnimatePlayerGoingUp(task); if (task->data[2] > 3) { Escalator_BeginFadeOutToNewMap(); task->data[0]++; } return FALSE; } static bool8 EscalatorWarpEffect_6(struct Task *task) { Escalator_AnimatePlayerGoingUp(task); Escalator_TransitionToWarpInEffect(); return FALSE; } static void Escalator_AnimatePlayerGoingDown(struct Task *task) { struct Sprite *sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->x2 = Cos(0x84, task->data[2]); sprite->y2 = Sin(0x94, task->data[2]); task->data[3]++; if (task->data[3] & 1) { task->data[2]++; } } static void Escalator_AnimatePlayerGoingUp(struct Task *task) { struct Sprite *sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->x2 = Cos(0x7c, task->data[2]); sprite->y2 = Sin(0x76, task->data[2]); task->data[3]++; if (task->data[3] & 1) { task->data[2]++; } } static void Escalator_BeginFadeOutToNewMap(void) { TryFadeOutOldMapMusic(); WarpFadeOutScreen(); } static void Escalator_TransitionToWarpInEffect(void) { if (!gPaletteFade.active && BGMusicStopped() == TRUE) { StopEscalator(); WarpIntoMap(); gFieldCallback = FieldCB_EscalatorWarpIn; SetMainCallback2(CB2_LoadMap); DestroyTask(FindTaskIdByFunc(Task_EscalatorWarpFieldEffect)); } } static bool8 (*const sEscalatorWarpInFieldEffectFuncs[])(struct Task *task) = { EscalatorWarpInEffect_1, EscalatorWarpInEffect_2, EscalatorWarpInEffect_3, EscalatorWarpInEffect_4, EscalatorWarpInEffect_5, EscalatorWarpInEffect_6, EscalatorWarpInEffect_7 }; static void FieldCB_EscalatorWarpIn(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); LockPlayerFieldControls(); FreezeObjectEvents(); CreateTask(Task_EscalatorWarpInFieldEffect, 0); gFieldCallback = NULL; } static void Task_EscalatorWarpInFieldEffect(u8 taskId) { struct Task *task = &gTasks[taskId]; while (sEscalatorWarpInFieldEffectFuncs[task->data[0]](task)) ; } static bool8 EscalatorWarpInEffect_1(struct Task *task) { struct ObjectEvent * objectEvent; s16 x; s16 y; u8 behavior; CameraObjectReset2(); objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(DIR_EAST)); PlayerGetDestCoords(&x, &y); behavior = MapGridGetMetatileBehaviorAt(x, y); task->data[0]++; task->data[1] = 16; if (behavior == MB_DOWN_ESCALATOR) { behavior = 1; task->data[0] = 3; } else { behavior = 0; } StartEscalator(behavior); return TRUE; } static bool8 EscalatorWarpInEffect_2(struct Task *task) { struct Sprite *sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->x2 = Cos(0x84, task->data[1]); sprite->y2 = Sin(0x94, task->data[1]); task->data[0]++; return FALSE; } static bool8 EscalatorWarpInEffect_3(struct Task *task) { struct Sprite *sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->x2 = Cos(0x84, task->data[1]); sprite->y2 = Sin(0x94, task->data[1]); task->data[2]++; if (task->data[2] & 1) { task->data[1]--; } if (task->data[1] == 0) { sprite->x2 = 0; sprite->y2 = 0; task->data[0] = 5; } return FALSE; } static bool8 EscalatorWarpInEffect_4(struct Task *task) { struct Sprite *sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->x2 = Cos(0x7c, task->data[1]); sprite->y2 = Sin(0x76, task->data[1]); task->data[0]++; return FALSE; } static bool8 EscalatorWarpInEffect_5(struct Task *task) { struct Sprite *sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->x2 = Cos(0x7c, task->data[1]); sprite->y2 = Sin(0x76, task->data[1]); task->data[2]++; if (task->data[2] & 1) { task->data[1]--; } if (task->data[1] == 0) { sprite->x2 = 0; sprite->y2 = 0; task->data[0]++; } return FALSE; } static bool8 EscalatorWarpInEffect_6(struct Task *task) { if (IsEscalatorMoving()) { return FALSE; } StopEscalator(); task->data[0]++; return TRUE; } static bool8 EscalatorWarpInEffect_7(struct Task *task) { struct ObjectEvent * objectEvent; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { CameraObjectReset1(); UnlockPlayerFieldControls(); UnfreezeObjectEvents(); ObjectEventSetHeldMovement(objectEvent, GetWalkNormalMovementAction(DIR_EAST)); DestroyTask(FindTaskIdByFunc(Task_EscalatorWarpInFieldEffect)); QuestLog_OnEscalatorWarp(QL_ESCALATOR_IN); } return FALSE; } static void Task_UseWaterfall(u8 taskId); static bool8 waterfall_0_setup(struct Task *task, struct ObjectEvent * playerObj); static bool8 waterfall_1_do_anim_probably(struct Task *task, struct ObjectEvent * playerObj); static bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct ObjectEvent * playerObj); static bool8 waterfall_3_move_player_probably(struct Task *task, struct ObjectEvent * playerObj); static bool8 waterfall_4_wait_player_move_probably(struct Task *task, struct ObjectEvent * playerObj); static bool8 (*const sUseWaterfallFieldEffectFuncs[])(struct Task *task, struct ObjectEvent * playerObj) = { waterfall_0_setup, waterfall_1_do_anim_probably, waterfall_2_wait_anim_finish_probably, waterfall_3_move_player_probably, waterfall_4_wait_player_move_probably }; u32 FldEff_UseWaterfall(void) { u8 taskId = CreateTask(Task_UseWaterfall, 0xFF); gTasks[taskId].data[1] = gFieldEffectArguments[0]; Task_UseWaterfall(taskId); return 0; } static void Task_UseWaterfall(u8 taskId) { while (sUseWaterfallFieldEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId])) ; } static bool8 waterfall_0_setup(struct Task *task, struct ObjectEvent * playerObj) { LockPlayerFieldControls(); gPlayerAvatar.preventStep = TRUE; task->data[0]++; return FALSE; } static bool8 waterfall_1_do_anim_probably(struct Task *task, struct ObjectEvent * playerObj) { LockPlayerFieldControls(); if (!ObjectEventIsMovementOverridden(playerObj)) { ObjectEventClearHeldMovementIfFinished(playerObj); gFieldEffectArguments[0] = task->data[1]; FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); task->data[0]++; } return FALSE; } static bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct ObjectEvent * playerObj) { if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) return FALSE; task->data[0]++; return TRUE; } static bool8 waterfall_3_move_player_probably(struct Task *task, struct ObjectEvent * playerObj) { ObjectEventSetHeldMovement(playerObj, GetWalkSlowerMovementAction(DIR_NORTH)); task->data[0]++; return FALSE; } static bool8 waterfall_4_wait_player_move_probably(struct Task *task, struct ObjectEvent * playerObj) { if (!ObjectEventClearHeldMovementIfFinished(playerObj)) return FALSE; if (MetatileBehavior_IsWaterfall(playerObj->currentMetatileBehavior)) { task->data[0] = 3; return TRUE; } UnlockPlayerFieldControls(); gPlayerAvatar.preventStep = FALSE; DestroyTask(FindTaskIdByFunc(Task_UseWaterfall)); FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); return FALSE; } static void Task_UseDive(u8 taskId); static bool8 DiveFieldEffect_Init(struct Task *task); static bool8 DiveFieldEffect_ShowMon(struct Task *task); static bool8 DiveFieldEffect_TryWarp(struct Task *task); static bool8 (*const sDiveFieldEffectFuncs[])(struct Task *task) = { DiveFieldEffect_Init, DiveFieldEffect_ShowMon, DiveFieldEffect_TryWarp }; u32 FldEff_UseDive(void) { u8 taskId = CreateTask(Task_UseDive, 0xFF); gTasks[taskId].data[15] = gFieldEffectArguments[0]; // party index of pokemon with dive gTasks[taskId].data[14] = gFieldEffectArguments[1]; // unused Task_UseDive(taskId); return 0; } static void Task_UseDive(u8 taskId) { while (sDiveFieldEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId])); } static bool8 DiveFieldEffect_Init(struct Task *task) { gPlayerAvatar.preventStep = TRUE; task->data[0]++; return FALSE; } static bool8 DiveFieldEffect_ShowMon(struct Task *task) { LockPlayerFieldControls(); gFieldEffectArguments[0] = task->data[15]; FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); task->data[0]++; return FALSE; } static bool8 DiveFieldEffect_TryWarp(struct Task *task) { struct MapPosition pos; PlayerGetDestCoords(&pos.x, &pos.y); if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) { dive_warp(&pos, gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior); DestroyTask(FindTaskIdByFunc(Task_UseDive)); FieldEffectActiveListRemove(FLDEFF_USE_DIVE); } return FALSE; } static void Task_LavaridgeGymB1FWarp(u8 taskId); static bool8 LavaridgeGymB1FWarpEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGymB1FWarpEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGymB1FWarpEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGymB1FWarpEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGymB1FWarpEffect_5(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGymB1FWarpEffect_6(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static void FieldCB_LavaridgeGymB1FWarpExit(void); static void Task_LavaridgeGymB1FWarpExit(u8 taskId); static bool8 LavaridgeGymB1FWarpExitEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGymB1FWarpExitEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGymB1FWarpExitEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGymB1FWarpExitEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 (*const sLavaridgeGymB1FWarpEffectFuncs[])(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) = { LavaridgeGymB1FWarpEffect_1, LavaridgeGymB1FWarpEffect_2, LavaridgeGymB1FWarpEffect_3, LavaridgeGymB1FWarpEffect_4, LavaridgeGymB1FWarpEffect_5, LavaridgeGymB1FWarpEffect_6 }; void StartLavaridgeGymB1FWarp(u8 priority) { CreateTask(Task_LavaridgeGymB1FWarp, priority); } static void Task_LavaridgeGymB1FWarp(u8 taskId) { while (sLavaridgeGymB1FWarpEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId])); } static bool8 LavaridgeGymB1FWarpEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { FreezeObjectEvents(); CameraObjectReset2(); SetCameraPanningCallback(NULL); gPlayerAvatar.preventStep = TRUE; objectEvent->fixedPriority = TRUE; task->data[1] = 1; task->data[0]++; return TRUE; } static bool8 LavaridgeGymB1FWarpEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { SetCameraPanning(0, task->data[1]); task->data[1] = -task->data[1]; task->data[2]++; if (task->data[2] > 7) { task->data[2] = 0; task->data[0]++; } return FALSE; } static bool8 LavaridgeGymB1FWarpEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { sprite->y2 = 0; task->data[3] = 1; gFieldEffectArguments[0] = objectEvent->currentCoords.x; gFieldEffectArguments[1] = objectEvent->currentCoords.y; gFieldEffectArguments[2] = sprite->subpriority - 1; gFieldEffectArguments[3] = sprite->oam.priority; FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP); PlaySE(SE_M_EXPLOSION); task->data[0]++; return TRUE; } static bool8 LavaridgeGymB1FWarpEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { s16 centerToCornerVecY; SetCameraPanning(0, task->data[1]); if (task->data[1] = -task->data[1], ++task->data[2] <= 17) { if (!(task->data[2] & 1) && (task->data[1] <= 3)) { task->data[1] <<= 1; } } else if (!(task->data[2] & 4) && (task->data[1] > 0)) { task->data[1] >>= 1; } if (task->data[2] > 6) { centerToCornerVecY = -(sprite->centerToCornerVecY << 1); if (sprite->y2 > -(sprite->y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY)) { sprite->y2 -= task->data[3]; if (task->data[3] <= 7) { task->data[3]++; } } else { task->data[4] = 1; } } if (task->data[5] == 0 && sprite->y2 < -0x10) { task->data[5]++; objectEvent->fixedPriority = TRUE; sprite->oam.priority = 1; sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; } if (task->data[1] == 0 && task->data[4] != 0) { task->data[0]++; } return FALSE; } static bool8 LavaridgeGymB1FWarpEffect_5(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { TryFadeOutOldMapMusic(); WarpFadeOutScreen(); task->data[0]++; return FALSE; } static bool8 LavaridgeGymB1FWarpEffect_6(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { if (!gPaletteFade.active && BGMusicStopped() == TRUE) { WarpIntoMap(); gFieldCallback = FieldCB_LavaridgeGymB1FWarpExit; SetMainCallback2(CB2_LoadMap); DestroyTask(FindTaskIdByFunc(Task_LavaridgeGymB1FWarp)); } return FALSE; } static bool8 (*const sLavaridgeGymB1FWarpExitEffectFuncs[])(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) = { LavaridgeGymB1FWarpExitEffect_1, LavaridgeGymB1FWarpExitEffect_2, LavaridgeGymB1FWarpExitEffect_3, LavaridgeGymB1FWarpExitEffect_4 }; static void FieldCB_LavaridgeGymB1FWarpExit(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); LockPlayerFieldControls(); gFieldCallback = NULL; CreateTask(Task_LavaridgeGymB1FWarpExit, 0); } static void Task_LavaridgeGymB1FWarpExit(u8 taskId) { while (sLavaridgeGymB1FWarpExitEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId])); } static bool8 LavaridgeGymB1FWarpExitEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { CameraObjectReset2(); FreezeObjectEvents(); gPlayerAvatar.preventStep = TRUE; objectEvent->invisible = TRUE; task->data[0]++; return FALSE; } static bool8 LavaridgeGymB1FWarpExitEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { if (IsWeatherNotFadingIn()) { gFieldEffectArguments[0] = objectEvent->currentCoords.x; gFieldEffectArguments[1] = objectEvent->currentCoords.y; gFieldEffectArguments[2] = sprite->subpriority - 1; gFieldEffectArguments[3] = sprite->oam.priority; task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); task->data[0]++; } return FALSE; } static bool8 LavaridgeGymB1FWarpExitEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { sprite = &gSprites[task->data[1]]; if (sprite->animCmdIndex > 1) { task->data[0]++; objectEvent->invisible = FALSE; CameraObjectReset1(); PlaySE(SE_M_DIG); ObjectEventSetHeldMovement(objectEvent, GetJumpMovementAction(DIR_EAST)); } return FALSE; } static bool8 LavaridgeGymB1FWarpExitEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { gPlayerAvatar.preventStep = FALSE; UnlockPlayerFieldControls(); UnfreezeObjectEvents(); DestroyTask(FindTaskIdByFunc(Task_LavaridgeGymB1FWarpExit)); } return FALSE; } static void Task_LavaridgeGym1FWarp(u8 taskId); static bool8 LavaridgeGym1FWarpEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGym1FWarpEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGym1FWarpEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGym1FWarpEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite); static bool8 (*const sLavaridgeGym1FWarpEffectFuncs[])(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) = { LavaridgeGym1FWarpEffect_1, LavaridgeGym1FWarpEffect_2, LavaridgeGym1FWarpEffect_3, LavaridgeGym1FWarpEffect_4, LavaridgeGym1FWarpEffect_5 }; // For the ash puff effect when warping off the B1F ash tiles u8 FldEff_LavaridgeGymWarp(void) { u8 spriteId; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ASH_LAUNCH], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); gSprites[spriteId].oam.priority = gFieldEffectArguments[3]; gSprites[spriteId].coordOffsetEnabled = TRUE; return spriteId; } void SpriteCB_AshLaunch(struct Sprite *sprite) { if (sprite->animEnded) { FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP); } } void StartLavaridgeGym1FWarp(u8 priority) { CreateTask(Task_LavaridgeGym1FWarp, priority); } static void Task_LavaridgeGym1FWarp(u8 taskId) { while(sLavaridgeGym1FWarpEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId])); } static bool8 LavaridgeGym1FWarpEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { FreezeObjectEvents(); CameraObjectReset2(); gPlayerAvatar.preventStep = TRUE; objectEvent->fixedPriority = TRUE; task->data[0]++; return FALSE; } static bool8 LavaridgeGym1FWarpEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { if (task->data[1] > 3) { gFieldEffectArguments[0] = objectEvent->currentCoords.x; gFieldEffectArguments[1] = objectEvent->currentCoords.y; gFieldEffectArguments[2] = sprite->subpriority - 1; gFieldEffectArguments[3] = sprite->oam.priority; task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); task->data[0]++; } else { task->data[1]++; ObjectEventSetHeldMovement(objectEvent, GetWalkInPlaceFasterMovementAction(objectEvent->facingDirection)); PlaySE(SE_LAVARIDGE_FALL_WARP); } } return FALSE; } static bool8 LavaridgeGym1FWarpEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { if (gSprites[task->data[1]].animCmdIndex == 2) { objectEvent->invisible = TRUE; task->data[0]++; } return FALSE; } static bool8 LavaridgeGym1FWarpEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) { TryFadeOutOldMapMusic(); WarpFadeOutScreen(); task->data[0]++; } return FALSE; } static bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) { if (!gPaletteFade.active && BGMusicStopped() == TRUE) { WarpIntoMap(); gFieldCallback = FieldCB_FallWarpExit; SetMainCallback2(CB2_LoadMap); DestroyTask(FindTaskIdByFunc(Task_LavaridgeGym1FWarp)); } return FALSE; } u8 FldEff_PopOutOfAsh(void) { u8 spriteId; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ASH_PUFF], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); gSprites[spriteId].oam.priority = gFieldEffectArguments[3]; gSprites[spriteId].coordOffsetEnabled = TRUE; return spriteId; } void SpriteCB_PopOutOfAsh(struct Sprite *sprite) { if (sprite->animEnded) { FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH); } } // Task data for Task_EscapeRopeWarpOut #define tState data[0] #define tSpinDelay data[1] #define tNumTurns data[2] #define tTimer data[3] #define tOffscreen data[4] #define tMovingState data[5] #define tOffsetY data[6] #define tDirection data[15] static void Task_EscapeRopeWarpOut(u8 taskId); static void EscapeRopeWarpOutEffect_Init(struct Task *task); static void EscapeRopeWarpOutEffect_Spin(struct Task *task); static u8 SpinObjectEvent(struct ObjectEvent *playerObj, s16 *timer, s16 *numTurns); static bool32 WarpOutObjectEventUpwards(struct ObjectEvent *playerObj, s16 *movingState, s16 *offsetY); static void FieldCallback_EscapeRopeExit(void); static void Task_EscapeRopeWarpIn(u8 taskId); static void EscapeRopeWarpInEffect_Init(struct Task *task); static void EscapeRopeWarpInEffect_Spin(struct Task *task); static void (*const sEscapeRopeWarpOutEffectFuncs[])(struct Task *task) = { EscapeRopeWarpOutEffect_Init, EscapeRopeWarpOutEffect_Spin }; void StartEscapeRopeFieldEffect(void) { LockPlayerFieldControls(); FreezeObjectEvents(); CreateTask(Task_EscapeRopeWarpOut, 80); } static void Task_EscapeRopeWarpOut(u8 taskId) { sEscapeRopeWarpOutEffectFuncs[gTasks[taskId].tState](&gTasks[taskId]); } static void EscapeRopeWarpOutEffect_Init(struct Task *task) { task->tState++; task->data[13] = 64; // unused task->data[14] = GetPlayerFacingDirection(); // unused task->tDirection = DIR_NONE; } static void EscapeRopeWarpOutEffect_Spin(struct Task *task) { struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; s16 *data = task->data; SpinObjectEvent(playerObj, &task->tSpinDelay, &task->tNumTurns); if (tTimer < 60) { tTimer++; if (tTimer == 20) PlaySE(SE_WARP_IN); } else if (tOffscreen == FALSE && !WarpOutObjectEventUpwards(playerObj, &task->tMovingState, &task->tOffsetY)) { TryFadeOutOldMapMusic(); WarpFadeOutScreen(); tOffscreen = TRUE; } if (tOffscreen == TRUE && !gPaletteFade.active && BGMusicStopped() == TRUE) { SetObjectEventDirection(playerObj, task->tDirection); // always DIR_NONE SetWarpDestinationToEscapeWarp(); WarpIntoMap(); gFieldCallback = FieldCallback_EscapeRopeExit; SetMainCallback2(CB2_LoadMap); DestroyTask(FindTaskIdByFunc(Task_EscapeRopeWarpOut)); } } static const u8 sSpinDirections[] = { [DIR_NONE] = DIR_SOUTH, [DIR_SOUTH] = DIR_WEST, [DIR_NORTH] = DIR_EAST, [DIR_WEST] = DIR_NORTH, [DIR_EAST] = DIR_SOUTH, }; static u8 SpinObjectEvent(struct ObjectEvent *playerObj, s16 *spinDelay, s16 *numTurns) { if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj)) { if (*spinDelay != 0 && --(*spinDelay) != 0) return playerObj->facingDirection; ObjectEventSetHeldMovement(playerObj, GetFaceDirectionMovementAction(sSpinDirections[playerObj->facingDirection])); if (*numTurns < 12) (*numTurns)++; *spinDelay = 12 >> (*numTurns); return sSpinDirections[playerObj->facingDirection]; } return playerObj->facingDirection; } static bool32 WarpOutObjectEventUpwards(struct ObjectEvent *playerObj, s16 *movingState, s16 *offsetY) { struct Sprite *sprite = &gSprites[playerObj->spriteId]; switch (*movingState) { case 0: CameraObjectReset2(); (*movingState)++; // fallthrough case 1: sprite->y2 -= 8; (*offsetY) -= 8; if (*offsetY <= -16) { playerObj->fixedPriority = TRUE; sprite->oam.priority = 1; sprite->subpriority = 0; sprite->subspriteMode = SUBSPRITES_OFF; (*movingState)++; } break; case 2: sprite->y2 -= 8; (*offsetY) -= 8; if (*offsetY <= -88) { (*movingState)++; return FALSE; } break; case 3: return FALSE; } return TRUE; } #undef tState #undef tSpinDelay #undef tNumTurns #undef tTimer #undef tOffscreen #undef tMovingState #undef tOffsetY #undef tDirection // Task data for Task_EscapeRopeWarpIn #define tState data[0] #define tMovingState data[1] #define tOffsetY data[2] #define tPriority data[3] #define tSubpriority data[4] #define tSubspriteMode data[5] #define tTimer data[6] #define tSpinEnded data[7] #define tCurrentDir data[8] #define tSpinDelay data[9] #define tNumTurns data[10] #define tOriginalDir data[15] static void (*const sEscapeRopeWarpInEffectFuncs[])(struct Task *task) = { EscapeRopeWarpInEffect_Init, EscapeRopeWarpInEffect_Spin }; static bool32 WarpInObjectEventDownwards(struct ObjectEvent *playerObj, s16 *movingState, s16 *offsetY, s16 *priority, s16 *subpriority, s16 *subspriteMode) { struct Sprite *sprite = &gSprites[playerObj->spriteId]; switch (*movingState) { case 0: CameraObjectReset2(); *offsetY = -88; sprite->y2 -= 88; *priority = sprite->oam.priority; *subpriority = sprite->subpriority; *subspriteMode = sprite->subspriteMode; playerObj->fixedPriority = TRUE; sprite->oam.priority = 1; sprite->subpriority = 0; sprite->subspriteMode = SUBSPRITES_OFF; (*movingState)++; // fallthrough case 1: sprite->y2 += 4; (*offsetY) += 4; if (*offsetY >= -16) { sprite->oam.priority = *priority; sprite->subpriority = *subpriority; sprite->subspriteMode = *subspriteMode; (*movingState)++; } break; case 2: sprite->y2 += 4; (*offsetY) += 4; if (*offsetY >= 0) { PlaySE(SE_CLICK); CameraObjectReset1(); (*movingState)++; return FALSE; } break; case 3: return FALSE; } return TRUE; } static void FieldCallback_EscapeRopeExit(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); LockPlayerFieldControls(); FreezeObjectEvents(); gFieldCallback = NULL; gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE; CreateTask(Task_EscapeRopeWarpIn, 0); } static void Task_EscapeRopeWarpIn(u8 taskId) { sEscapeRopeWarpInEffectFuncs[gTasks[taskId].tState](&gTasks[taskId]); } static void EscapeRopeWarpInEffect_Init(struct Task *task) { if (IsWeatherNotFadingIn()) { PlaySE(SE_WARP_OUT); task->tOriginalDir = GetPlayerFacingDirection(); task->tState++; } } static void EscapeRopeWarpInEffect_Spin(struct Task *task) { s16 *data = task->data; struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; bool32 moving = WarpInObjectEventDownwards(playerObj, &tMovingState, &tOffsetY, &tPriority, &tSubpriority, &tSubspriteMode); playerObj->invisible = FALSE; if (tTimer < 8) tTimer++; else if (tSpinEnded == FALSE) { tTimer++; tCurrentDir = SpinObjectEvent(playerObj, &tSpinDelay, &tNumTurns); if (tTimer >= 50 && tCurrentDir == tOriginalDir) tSpinEnded = TRUE; } if (!moving && tCurrentDir == tOriginalDir && ObjectEventCheckHeldMovementStatus(playerObj) == TRUE) { playerObj->invisible = FALSE; playerObj->fixedPriority = FALSE; UnlockPlayerFieldControls(); UnfreezeObjectEvents(); DestroyTask(FindTaskIdByFunc(Task_EscapeRopeWarpIn)); } } #undef tState #undef tMovingState #undef tOffsetY #undef tPriority #undef tSubpriority #undef tSubspriteMode #undef tTimer #undef tSpinEnded #undef tCurrentDir #undef tSpinDelay #undef tNumTurns #undef tOriginalDir static void Task_DoTeleportFieldEffect(u8 taskId); static void TeleportFieldEffectTask1(struct Task *task); static void TeleportFieldEffectTask2(struct Task *task); static void TeleportFieldEffectTask3(struct Task *task); static void TeleportFieldEffectTask4(struct Task *task); static void FieldCallback_TeleportIn(void); static void Task_DoTeleportInFieldEffect(u8 taskId); static void TeleportInFieldEffectTask1(struct Task *task); static void TeleportInFieldEffectTask2(struct Task *task); static void TeleportInFieldEffectTask3(struct Task *task); static void (*const sTeleportEffectFuncs[])(struct Task *) = { TeleportFieldEffectTask1, TeleportFieldEffectTask2, TeleportFieldEffectTask3, TeleportFieldEffectTask4 }; void CreateTeleportFieldEffectTask(void) { CreateTask(Task_DoTeleportFieldEffect, 0); } static void Task_DoTeleportFieldEffect(u8 taskId) { sTeleportEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); } static void TeleportFieldEffectTask1(struct Task *task) { LockPlayerFieldControls(); FreezeObjectEvents(); CameraObjectReset2(); task->data[15] = GetPlayerFacingDirection(); task->data[0]++; } static void TeleportFieldEffectTask2(struct Task *task) { u8 spinDirections[5] = { [DIR_NONE] = DIR_SOUTH, [DIR_SOUTH] = DIR_WEST, [DIR_WEST] = DIR_NORTH, [DIR_NORTH] = DIR_EAST, [DIR_EAST] = DIR_SOUTH }; struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (task->data[1] == 0 || (--task->data[1]) == 0) { ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]); task->data[1] = 8; task->data[2]++; } if (task->data[2] > 7 && task->data[15] == objectEvent->facingDirection) { task->data[0]++; task->data[1] = 4; task->data[2] = 8; task->data[3] = 1; PlaySE(SE_WARP_IN); } } static void TeleportFieldEffectTask3(struct Task *task) { u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; if ((--task->data[1]) <= 0) { task->data[1] = 4; ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]); } sprite->y -= task->data[3]; task->data[4] += task->data[3]; if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8)) { task->data[3] <<= 1; } if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != SUBSPRITES_OFF)) { sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; } if (task->data[4] >= 0xa8) { task->data[0]++; TryFadeOutOldMapMusic(); WarpFadeOutScreen(); } } static void TeleportFieldEffectTask4(struct Task *task) { if (!gPaletteFade.active) { if (BGMusicStopped() == TRUE) { SetWarpDestinationToLastHealLocation(); WarpIntoMap(); SetMainCallback2(CB2_LoadMap); gFieldCallback = FieldCallback_TeleportIn; DestroyTask(FindTaskIdByFunc(Task_DoTeleportFieldEffect)); } } } static void (*const sTeleportInEffectFuncs[])(struct Task *) = { TeleportInFieldEffectTask1, TeleportInFieldEffectTask2, TeleportInFieldEffectTask3 }; static void FieldCallback_TeleportIn(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); LockPlayerFieldControls(); FreezeObjectEvents(); gFieldCallback = NULL; gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE; CameraObjectReset2(); CreateTask(Task_DoTeleportInFieldEffect, 0); } static void Task_DoTeleportInFieldEffect(u8 taskId) { sTeleportInEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); } static void TeleportInFieldEffectTask1(struct Task *task) { struct Sprite *sprite; s16 centerToCornerVecY; if (IsWeatherNotFadingIn()) { sprite = &gSprites[gPlayerAvatar.spriteId]; centerToCornerVecY = -(sprite->centerToCornerVecY << 1); sprite->y2 = -(sprite->y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); gObjectEvents[gPlayerAvatar.objectEventId].invisible = FALSE; task->data[0]++; task->data[1] = 8; task->data[2] = 1; task->data[14] = sprite->subspriteMode; task->data[15] = GetPlayerFacingDirection(); PlaySE(SE_WARP_IN); } } static void TeleportInFieldEffectTask2(struct Task *task) { u8 spinDirections[5] = {1, 3, 4, 2, 1}; struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; if ((sprite->y2 += task->data[1]) >= -8) { if (task->data[13] == 0) { task->data[13]++; objectEvent->triggerGroundEffectsOnMove = TRUE; sprite->subspriteMode = task->data[14]; } } else { sprite->oam.priority = 1; if (sprite->subspriteMode != SUBSPRITES_OFF) { sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; } } if (sprite->y2 >= -0x30 && task->data[1] > 1 && !(sprite->y2 & 1)) { task->data[1]--; } if ((--task->data[2]) == 0) { task->data[2] = 4; ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]); } if (sprite->y2 >= 0) { sprite->y2 = 0; task->data[0]++; task->data[1] = 1; task->data[2] = 0; } } static void TeleportInFieldEffectTask3(struct Task *task) { u8 spinDirections[5] = {1, 3, 4, 2, 1}; struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if ((--task->data[1]) == 0) { ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]); task->data[1] = 8; if ((++task->data[2]) > 4 && task->data[14] == objectEvent->facingDirection) { UnlockPlayerFieldControls(); CameraObjectReset1(); UnfreezeObjectEvents(); DestroyTask(FindTaskIdByFunc(Task_DoTeleportInFieldEffect)); } } } static void Task_ShowMon_Outdoors(u8 taskId); static void ShowMonEffect_Outdoors_1(struct Task *task); static void ShowMonEffect_Outdoors_2(struct Task *task); static void ShowMonEffect_Outdoors_3(struct Task *task); static void ShowMonEffect_Outdoors_4(struct Task *task); static void ShowMonEffect_Outdoors_5(struct Task *task); static void ShowMonEffect_Outdoors_6(struct Task *task); static void ShowMonEffect_Outdoors_7(struct Task *task); static void VBlankCB_ShowMonEffect_Outdoors(void); static void LoadFieldMoveStreaksTilemapToVram(u16 screenbase); static void Task_ShowMon_Indoors(u8 taskId); static void ShowMonEffect_Indoors_1(struct Task *task); static void ShowMonEffect_Indoors_2(struct Task *task); static void ShowMonEffect_Indoors_3(struct Task *task); static void ShowMonEffect_Indoors_4(struct Task *task); static void ShowMonEffect_Indoors_5(struct Task *task); static void ShowMonEffect_Indoors_6(struct Task *task); static void ShowMonEffect_Indoors_7(struct Task *task); static void VBlankCB_ShowMonEffect_Indoors(void); static void AnimateIndoorShowMonBg(struct Task *task); static bool8 SlideIndoorBannerOnscreen(struct Task *task); static bool8 SlideIndoorBannerOffscreen(struct Task *task); static u8 InitFieldMoveMonSprite(u32 species, u32 otId, u32 personality); static void SpriteCB_FieldMoveMonSlideOnscreen(struct Sprite *sprite); static void SpriteCB_FieldMoveMonWaitAfterCry(struct Sprite *sprite); static void SpriteCB_FieldMoveMonSlideOffscreen(struct Sprite *sprite); static void (*const sShowMonOutdoorsEffectFuncs[])(struct Task *task) = { ShowMonEffect_Outdoors_1, ShowMonEffect_Outdoors_2, ShowMonEffect_Outdoors_3, ShowMonEffect_Outdoors_4, ShowMonEffect_Outdoors_5, ShowMonEffect_Outdoors_6, ShowMonEffect_Outdoors_7 }; u32 FldEff_FieldMoveShowMon(void) { u8 taskId; if (IsMapTypeOutdoors(GetCurrentMapType()) == TRUE) taskId = CreateTask(Task_ShowMon_Outdoors, 0xFF); else taskId = CreateTask(Task_ShowMon_Indoors, 0xFF); gTasks[taskId].data[15] = InitFieldMoveMonSprite(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); return 0; } u32 FldEff_FieldMoveShowMonInit(void) { u32 r6 = gFieldEffectArguments[0] & 0x80000000; u8 partyIdx = gFieldEffectArguments[0]; gFieldEffectArguments[0] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES); if(gFieldEffectArguments[0] == SPECIES_DEOXYS) { switch(GetMonData(&gPlayerParty[partyIdx], MON_DATA_FORME)) { case 1: //Attack Forme gFieldEffectArguments[0] = 65531; break; case 2: //Defense Forme gFieldEffectArguments[0] = 65532; break; case 3: //Speed Forme gFieldEffectArguments[0] = 65533; break; default: //Normal Forme gFieldEffectArguments[0] = 65530; break; } } gFieldEffectArguments[1] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_OT_ID); gFieldEffectArguments[2] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY); gFieldEffectArguments[0] |= r6; FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); return 0; } static void Task_ShowMon_Outdoors(u8 taskId) { sShowMonOutdoorsEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); } static void ShowMonEffect_Outdoors_1(struct Task *task) { task->data[11] = GetGpuReg(REG_OFFSET_WININ); task->data[12] = GetGpuReg(REG_OFFSET_WINOUT); StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); task->data[1] = WIN_RANGE(0xF0, 0xF1); task->data[2] = WIN_RANGE(0x50, 0x51); task->data[3] = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR; task->data[4] = WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR; SetGpuReg(REG_OFFSET_WIN0H, task->data[1]); SetGpuReg(REG_OFFSET_WIN0V, task->data[2]); SetGpuReg(REG_OFFSET_WININ, task->data[3]); SetGpuReg(REG_OFFSET_WINOUT, task->data[4]); SetVBlankCallback(VBlankCB_ShowMonEffect_Outdoors); task->data[0]++; } static void ShowMonEffect_Outdoors_2(struct Task *task) { u16 charbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 2) << 14); u16 screenbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11); CpuCopy16(sFieldMoveStreaksOutdoors_Gfx, (void *)(VRAM + charbase), 0x200); CpuFill32(0, (void *)(VRAM + screenbase), 0x800); LoadPalette(sFieldMoveStreaksOutdoors_Pal, BG_PLTT_ID(15), sizeof(sFieldMoveStreaksOutdoors_Pal)); LoadFieldMoveStreaksTilemapToVram(screenbase); task->data[0]++; } static void ShowMonEffect_Outdoors_3(struct Task *task) { s16 win0h_lo; s16 win0v_lo; s16 win0v_hi; task->data[5] -= 16; win0h_lo = ((u16)task->data[1] >> 8); win0v_lo = ((u16)task->data[2] >> 8); win0v_hi = ((u16)task->data[2] & 0xff); win0h_lo -= 16; win0v_lo -= 2; win0v_hi += 2; if (win0h_lo < 0) { win0h_lo = 0; } if (win0v_lo < 0x28) { win0v_lo = 0x28; } if (win0v_hi > 0x78) { win0v_hi = 0x78; } task->data[1] = WIN_RANGE(win0h_lo, task->data[1] & 0xff); task->data[2] = WIN_RANGE(win0v_lo, win0v_hi); if (win0h_lo == 0 && win0v_lo == 0x28 && win0v_hi == 0x78) { gSprites[task->data[15]].callback = SpriteCB_FieldMoveMonSlideOnscreen; task->data[0]++; } } static void ShowMonEffect_Outdoors_4(struct Task *task) { task->data[5] -= 16; if (gSprites[task->data[15]].data[7]) { task->data[0]++; } } static void ShowMonEffect_Outdoors_5(struct Task *task) { s16 win0v_lo; s16 win0v_hi; task->data[5] -= 16; win0v_lo = (task->data[2] >> 8); win0v_hi = (task->data[2] & 0xff); win0v_lo += 6; win0v_hi -= 6; if (win0v_lo > 0x50) { win0v_lo = 0x50; } if (win0v_hi < 0x51) { win0v_hi = 0x51; } task->data[2] = WIN_RANGE(win0v_lo, win0v_hi); if (win0v_lo == 0x50 && win0v_hi == 0x51) { task->data[0]++; } } static void ShowMonEffect_Outdoors_6(struct Task *task) { u16 bg0cnt = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11; CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); task->data[1] = WIN_RANGE(0x00, 0xf1); task->data[2] = WIN_RANGE(0x00, 0xa1); task->data[3] = task->data[11]; task->data[4] = task->data[12]; task->data[0]++; } static void ShowMonEffect_Outdoors_7(struct Task *task) { IntrCallback callback; LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&callback); SetVBlankCallback(callback); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); Menu_LoadStdPal(); FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]); FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); DestroyTask(FindTaskIdByFunc(Task_ShowMon_Outdoors)); } static void VBlankCB_ShowMonEffect_Outdoors(void) { IntrCallback callback; struct Task *task = &gTasks[FindTaskIdByFunc(Task_ShowMon_Outdoors)]; LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&callback); callback(); SetGpuReg(REG_OFFSET_WIN0H, task->data[1]); SetGpuReg(REG_OFFSET_WIN0V, task->data[2]); SetGpuReg(REG_OFFSET_WININ, task->data[3]); SetGpuReg(REG_OFFSET_WINOUT, task->data[4]); SetGpuReg(REG_OFFSET_BG0HOFS, task->data[5]); SetGpuReg(REG_OFFSET_BG0VOFS, task->data[6]); } static void LoadFieldMoveStreaksTilemapToVram(u16 screenbase) { u32 i; u16 *dest; dest = (u16 *)(VRAM + (10 * 32) + screenbase); for (i = 0; i < (10 * 32); i++, dest++) *dest = sFieldMoveStreaksOutdoors_Tilemap[i] | 0xF000; } static void (*const sShowMonIndoorsEffectFuncs[])(struct Task *) = { ShowMonEffect_Indoors_1, ShowMonEffect_Indoors_2, ShowMonEffect_Indoors_3, ShowMonEffect_Indoors_4, ShowMonEffect_Indoors_5, ShowMonEffect_Indoors_6, ShowMonEffect_Indoors_7 }; static void Task_ShowMon_Indoors(u8 taskId) { sShowMonIndoorsEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); } static void ShowMonEffect_Indoors_1(struct Task *task) { SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]); SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]); StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); SetVBlankCallback(VBlankCB_ShowMonEffect_Indoors); task->data[0]++; } static void ShowMonEffect_Indoors_2(struct Task *task) { u16 charbase; u16 screenbase; charbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 2) << 14); screenbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11); task->data[12] = screenbase; CpuCopy16(sFieldMoveStreaksIndoors_Gfx, (void *)(VRAM + charbase), 0x80); CpuFill32(0, (void *)(VRAM + screenbase), 0x800); LoadPalette(sFieldMoveStreaksIndoors_Pal, BG_PLTT_ID(15), sizeof(sFieldMoveStreaksIndoors_Pal)); task->data[0]++; } static void ShowMonEffect_Indoors_3(struct Task *task) { if (SlideIndoorBannerOnscreen(task)) { task->data[5] = GetGpuReg(REG_OFFSET_WININ); SetGpuReg(REG_OFFSET_WININ, (task->data[5] & 0xFF) | WININ_WIN1_BG0 | WININ_WIN1_OBJ); SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0x00, 0xf0)); SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0x28, 0x78)); gSprites[task->data[15]].callback = SpriteCB_FieldMoveMonSlideOnscreen; task->data[0]++; } AnimateIndoorShowMonBg(task); } static void ShowMonEffect_Indoors_4(struct Task *task) { AnimateIndoorShowMonBg(task); if (gSprites[task->data[15]].data[7]) { task->data[0]++; } } static void ShowMonEffect_Indoors_5(struct Task *task) { AnimateIndoorShowMonBg(task); task->data[3] = task->data[1] & 7; task->data[4] = 0; SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0xff, 0xff)); SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0xff, 0xff)); SetGpuReg(REG_OFFSET_WININ, task->data[5]); task->data[0]++; } static void ShowMonEffect_Indoors_6(struct Task *task) { AnimateIndoorShowMonBg(task); if (SlideIndoorBannerOffscreen(task)) { task->data[0]++; } } static void ShowMonEffect_Indoors_7(struct Task *task) { IntrCallback intrCallback; u16 charbase; charbase = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11; CpuFill32(0, (void *)VRAM + charbase, 0x800); LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&intrCallback); SetVBlankCallback(intrCallback); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); Menu_LoadStdPal(); FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]); FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); DestroyTask(FindTaskIdByFunc(Task_ShowMon_Indoors)); } static void VBlankCB_ShowMonEffect_Indoors(void) { IntrCallback intrCallback; struct Task *task; task = &gTasks[FindTaskIdByFunc(Task_ShowMon_Indoors)]; LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&intrCallback); intrCallback(); SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]); SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]); } static void AnimateIndoorShowMonBg(struct Task *task) { task->data[1] -= 16; task->data[3] += 16; } static bool8 SlideIndoorBannerOnscreen(struct Task *task) { u32 i; u16 srcOffs; u16 dstOffs; u16 *dest; if (task->data[4] >= 32) { return TRUE; } dstOffs = (task->data[3] >> 3) & 0x1f; if (dstOffs >= task->data[4]) { dstOffs = (32 - dstOffs) & 0x1f; srcOffs = (32 - task->data[4]) & 0x1f; dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); for (i = 0; i < 10; i++) { dest[dstOffs + i * 32] = sFieldMoveStreaksIndoors_Tilemap[srcOffs + i * 32]; dest[dstOffs + i * 32] |= 0xf000; dest[((dstOffs + 1) & 0x1f) + i * 32] = sFieldMoveStreaksIndoors_Tilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000; dest[((dstOffs + 1) & 0x1f) + i * 32] |= 0xf000; } task->data[4] += 2; } return FALSE; } static bool8 SlideIndoorBannerOffscreen(struct Task *task) { u32 i; u16 dstOffs; u16 *dest; if (task->data[4] >= 32) { return TRUE; } dstOffs = task->data[3] >> 3; if (dstOffs >= task->data[4]) { dstOffs = (task->data[1] >> 3) & 0x1f; dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); for (i = 0; i < 10; i++) { dest[dstOffs + i * 32] = 0xf000; dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000; } task->data[4] += 2; } return FALSE; } static u8 InitFieldMoveMonSprite(u32 species, u32 otId, u32 personality) { bool16 playCry; u8 monSprite; struct Sprite *sprite; u32 speciesForCry = species; if(species >= 65530 && species <= 65533) speciesForCry = SPECIES_DEOXYS; playCry = (speciesForCry & 0x80000000) >> 16; species &= 0x7fffffff; monSprite = CreateMonSprite_FieldMove(species, otId, personality, 0x140, 0x50, 0); sprite = &gSprites[monSprite]; sprite->callback = SpriteCallbackDummy; sprite->oam.priority = 0; sprite->data[0] = speciesForCry; sprite->data[6] = playCry; return monSprite; } static void SpriteCB_FieldMoveMonSlideOnscreen(struct Sprite *sprite) { if ((sprite->x -= 20) <= 0x78) { sprite->x = 0x78; sprite->data[1] = 30; sprite->callback = SpriteCB_FieldMoveMonWaitAfterCry; if (sprite->data[6]) { PlayCry_NormalNoDucking(sprite->data[0], 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL); } else { PlayCry_Normal(sprite->data[0], 0); } } } static void SpriteCB_FieldMoveMonWaitAfterCry(struct Sprite *sprite) { if ((--sprite->data[1]) == 0) { sprite->callback = SpriteCB_FieldMoveMonSlideOffscreen; } } static void SpriteCB_FieldMoveMonSlideOffscreen(struct Sprite *sprite) { if (sprite->x < -0x40) { sprite->data[7] = 1; } else { sprite->x -= 20; } } static void Task_FldEffUseSurf(u8 taskId); static void UseSurfEffect_1(struct Task *task); static void UseSurfEffect_2(struct Task *task); static void UseSurfEffect_3(struct Task *task); static void UseSurfEffect_4(struct Task *task); static void UseSurfEffect_5(struct Task *task); static void (*const sUseSurfEffectFuncs[])(struct Task *) = { UseSurfEffect_1, UseSurfEffect_2, UseSurfEffect_3, UseSurfEffect_4, UseSurfEffect_5, }; u8 FldEff_UseSurf(void) { u8 taskId = CreateTask(Task_FldEffUseSurf, 0xff); gTasks[taskId].data[15] = gFieldEffectArguments[0]; Overworld_ClearSavedMusic(); if (Overworld_MusicCanOverrideMapMusic(MUS_SURF)) Overworld_ChangeMusicTo(MUS_SURF); return FALSE; } static void Task_FldEffUseSurf(u8 taskId) { sUseSurfEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); } static void UseSurfEffect_1(struct Task *task) { LockPlayerFieldControls(); FreezeObjectEvents(); gPlayerAvatar.preventStep = TRUE; SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING); PlayerGetDestCoords(&task->data[1], &task->data[2]); MoveCoords(gObjectEvents[gPlayerAvatar.objectEventId].movementDirection, &task->data[1], &task->data[2]); task->data[0]++; } static void UseSurfEffect_2(struct Task *task) { struct ObjectEvent * objectEvent; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent)) { StartPlayerAvatarSummonMonForFieldMoveAnim(); ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); task->data[0]++; } } static void UseSurfEffect_3(struct Task *task) { struct ObjectEvent * objectEvent; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventCheckHeldMovementStatus(objectEvent)) { gFieldEffectArguments[0] = task->data[15] | 0x80000000; FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); task->data[0]++; } } static void UseSurfEffect_4(struct Task *task) { struct ObjectEvent * objectEvent; if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) { objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); ObjectEventClearHeldMovementIfFinished(objectEvent); ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(objectEvent->movementDirection)); gFieldEffectArguments[0] = task->data[1]; gFieldEffectArguments[1] = task->data[2]; gFieldEffectArguments[2] = gPlayerAvatar.objectEventId; objectEvent->fieldEffectSpriteId = FieldEffectStart(FLDEFF_SURF_BLOB); task->data[0]++; } } static void UseSurfEffect_5(struct Task *task) { struct ObjectEvent * objectEvent; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { gPlayerAvatar.preventStep = FALSE; gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_CONTROLLABLE; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->movementDirection)); SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON); UnfreezeObjectEvents(); UnlockPlayerFieldControls(); FieldEffectActiveListRemove(FLDEFF_USE_SURF); DestroyTask(FindTaskIdByFunc(Task_FldEffUseSurf)); SetHelpContext(HELPCONTEXT_SURFING); } } static void Task_FldEffUseVsSeeker(u8 taskId); static void UseVsSeekerEffect_1(struct Task *task); static void UseVsSeekerEffect_2(struct Task *task); static void UseVsSeekerEffect_3(struct Task *task); static void UseVsSeekerEffect_4(struct Task *task); static void (*const sUseVsSeekerEffectFuncs[])(struct Task *task) = { UseVsSeekerEffect_1, UseVsSeekerEffect_2, UseVsSeekerEffect_3, UseVsSeekerEffect_4 }; u32 FldEff_UseVsSeeker(void) { if (gQuestLogState == QL_STATE_RECORDING) QuestLogRecordPlayerAvatarGfxTransitionWithDuration(8, 89); CreateTask(Task_FldEffUseVsSeeker, 0xFF); return 0; } static void Task_FldEffUseVsSeeker(u8 taskId) { sUseVsSeekerEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); } static void UseVsSeekerEffect_1(struct Task *task) { LockPlayerFieldControls(); FreezeObjectEvents(); gPlayerAvatar.preventStep = TRUE; task->data[0]++; } static void UseVsSeekerEffect_2(struct Task *task) { struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj)) { StartPlayerAvatarVsSeekerAnim(); ObjectEventSetHeldMovement(playerObj, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); task->data[0]++; } } static void UseVsSeekerEffect_3(struct Task *task) { struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventClearHeldMovementIfFinished(playerObj)) { if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE)) ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_BIKE)); else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); else ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL)); ObjectEventForceSetHeldMovement(playerObj, GetFaceDirectionMovementAction(playerObj->facingDirection)); task->data[0]++; } } static void UseVsSeekerEffect_4(struct Task *task) { struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventClearHeldMovementIfFinished(playerObj)) { gPlayerAvatar.preventStep = FALSE; FieldEffectActiveListRemove(FLDEFF_USE_VS_SEEKER); DestroyTask(FindTaskIdByFunc(Task_FldEffUseVsSeeker)); } } static void SpriteCB_NPCFlyOut(struct Sprite *sprite); u8 FldEff_NpcFlyOut(void) { u8 spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BIRD], 0x78, 0, 1); struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.paletteNum = 0; sprite->oam.priority = 1; sprite->callback = SpriteCB_NPCFlyOut; sprite->data[1] = gFieldEffectArguments[0]; PlaySE(SE_M_FLY); return spriteId; } static void SpriteCB_NPCFlyOut(struct Sprite *sprite) { struct Sprite *npcSprite; sprite->x2 = Cos(sprite->data[2], 0x8c); sprite->y2 = Sin(sprite->data[2], 0x48); sprite->data[2] = (sprite->data[2] + 4) & 0xff; if (sprite->data[0]) { npcSprite = &gSprites[sprite->data[1]]; npcSprite->coordOffsetEnabled = FALSE; npcSprite->x = sprite->x + sprite->x2; npcSprite->y = sprite->y + sprite->y2 - 8; npcSprite->x2 = 0; npcSprite->y2 = 0; } if (sprite->data[2] >= 0x80) { FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT); } } // Task data for Task_FlyOut / Task_FlyIn #define tState data[0] #define tMonPartyId data[1] #define tBirdSpriteId data[1] // re-used #define tTimer data[2] #define tAvatarFlags data[15] static void Task_FlyOut(u8 taskId); static void FlyOutFieldEffect_FieldMovePose(struct Task *task); static void FlyOutFieldEffect_ShowMon(struct Task *task); static void FlyOutFieldEffect_BirdLeaveBall(struct Task *task); static void FlyOutFieldEffect_WaitBirdLeave(struct Task *task); static void FlyOutFieldEffect_BirdSwoopDown(struct Task *task); static void FlyOutFieldEffect_JumpOnBird(struct Task *task); static void FlyOutFieldEffect_FlyOffWithBird(struct Task *task); static void FlyOutFieldEffect_WaitFlyOff(struct Task *task); static void FlyOutFieldEffect_End(struct Task *task); static u8 CreateFlyBirdSprite(void); static bool8 GetFlyBirdAnimCompleted(u8 flyBlobSpriteId); static void StartFlyBirdSwoopDown(u8 flyBlobSpriteId); static void SetFlyBirdPlayerSpriteId(u8 flyBlobSpriteId, u8 playerSpriteId); static void SpriteCB_FlyBirdLeaveBall(struct Sprite *sprite); static void SpriteCB_FlyBirdSwoopDown(struct Sprite *sprite); static void DoBirdSpriteWithPlayerAffineAnim(struct Sprite *sprite, u8 affineAnimId); static void SpriteCB_FlyBirdWithPlayer(struct Sprite *sprite); static void (*const sFlyOutFieldEffectFuncs[])(struct Task *) = { FlyOutFieldEffect_FieldMovePose, FlyOutFieldEffect_ShowMon, FlyOutFieldEffect_BirdLeaveBall, FlyOutFieldEffect_WaitBirdLeave, FlyOutFieldEffect_BirdSwoopDown, FlyOutFieldEffect_JumpOnBird, FlyOutFieldEffect_FlyOffWithBird, FlyOutFieldEffect_WaitFlyOff, FlyOutFieldEffect_End }; u8 FldEff_FlyOut(void) { u8 taskId = CreateTask(Task_FlyOut, 0xFE); gTasks[taskId].tMonPartyId = gFieldEffectArguments[0]; return 0; } static void Task_FlyOut(u8 taskId) { sFlyOutFieldEffectFuncs[gTasks[taskId].tState](&gTasks[taskId]); } static void FlyOutFieldEffect_FieldMovePose(struct Task *task) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent)) { task->tAvatarFlags = gPlayerAvatar.flags; gPlayerAvatar.preventStep = TRUE; SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT); StartPlayerAvatarSummonMonForFieldMoveAnim(); ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); task->tState++; } } static void FlyOutFieldEffect_ShowMon(struct Task *task) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { task->tState++; gFieldEffectArguments[0] = task->tMonPartyId; FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); } } static void FlyOutFieldEffect_BirdLeaveBall(struct Task *task) { if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) { SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_MON_ONLY); SetSurfBlob_DontSyncAnim(objectEvent->fieldEffectSpriteId, FALSE); } task->tBirdSpriteId = CreateFlyBirdSprite(); task->tState++; } } static void FlyOutFieldEffect_WaitBirdLeave(struct Task *task) { if (GetFlyBirdAnimCompleted(task->tBirdSpriteId)) { task->tState++; task->tTimer = 16; SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], MOVEMENT_ACTION_FACE_LEFT); } } static void FlyOutFieldEffect_BirdSwoopDown(struct Task *task) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if ((task->tTimer == 0 || (--task->tTimer) == 0) && ObjectEventClearHeldMovementIfFinished(objectEvent)) { task->tState++; PlaySE(SE_M_FLY); StartFlyBirdSwoopDown(task->tBirdSpriteId); } } static void FlyOutFieldEffect_JumpOnBird(struct Task *task) { if ((++task->tTimer) >= 8) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); StartSpriteAnim(&gSprites[objectEvent->spriteId], ANIM_GET_ON_OFF_POKEMON_WEST); objectEvent->inanimate = TRUE; ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT); task->tState++; task->tTimer = 0; } } static void FlyOutFieldEffect_FlyOffWithBird(struct Task *task) { if ((++task->tTimer) >= 10) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventClearHeldMovementIfActive(objectEvent); objectEvent->inanimate = FALSE; objectEvent->hasShadow = FALSE; SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, objectEvent->spriteId); StartSpriteAnim(&gSprites[task->tBirdSpriteId], gSaveBlock2Ptr->playerGender * 2 + 1); DoBirdSpriteWithPlayerAffineAnim(&gSprites[task->tBirdSpriteId], 0); gSprites[task->tBirdSpriteId].callback = SpriteCB_FlyBirdWithPlayer; CameraObjectReset2(); task->tState++; } } static void FlyOutFieldEffect_WaitFlyOff(struct Task *task) { if (GetFlyBirdAnimCompleted(task->tBirdSpriteId)) { WarpFadeOutScreen(); task->tState++; } } static void FlyOutFieldEffect_End(struct Task *task) { if (!gPaletteFade.active) { FieldEffectActiveListRemove(FLDEFF_FLY_OUT); DestroyTask(FindTaskIdByFunc(Task_FlyOut)); } } static u8 CreateFlyBirdSprite(void) { u8 spriteId; struct Sprite *sprite; spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BIRD], 255, 180, 1); sprite = &gSprites[spriteId]; sprite->oam.paletteNum = 0; sprite->oam.priority = 1; sprite->callback = SpriteCB_FlyBirdLeaveBall; return spriteId; } // Sprite data for the bird sprite #define sInitData data[0] #define sPlayerSpriteId data[6] #define sAnimCompleted data[7] static bool8 GetFlyBirdAnimCompleted(u8 spriteId) { return gSprites[spriteId].sAnimCompleted; } static void StartFlyBirdSwoopDown(u8 spriteId) { struct Sprite *sprite; sprite = &gSprites[spriteId]; sprite->callback = SpriteCB_FlyBirdSwoopDown; sprite->x = 120; sprite->y = 0; sprite->x2 = 0; sprite->y2 = 0; memset(&sprite->data[0], 0, 8 * sizeof(u16) /* zero all data cells */); sprite->data[6] = MAX_SPRITES; } static void SetFlyBirdPlayerSpriteId(u8 flyBlobSpriteId, u8 playerSpriteId) { gSprites[flyBlobSpriteId].sPlayerSpriteId = playerSpriteId; } static const union AffineAnimCmd sAffineAnim_FlyBirdLeaveBall[] = { AFFINEANIMCMD_FRAME( 8, 8, -30, 0), AFFINEANIMCMD_FRAME(28, 28, 0, 30), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_FlyBirdReturnToBall[] = { AFFINEANIMCMD_FRAME(256, 256, 64, 0), AFFINEANIMCMD_FRAME(-10, -10, 0, 22), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnims_FlyBirdBall[] = { sAffineAnim_FlyBirdLeaveBall, sAffineAnim_FlyBirdReturnToBall }; static void SpriteCB_FlyBirdLeaveBall(struct Sprite *sprite) { if (sprite->sAnimCompleted == FALSE) { if (sprite->sInitData == FALSE) { sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; sprite->affineAnims = sAffineAnims_FlyBirdBall; InitSpriteAffineAnim(sprite); StartSpriteAffineAnim(sprite, 0); if (gSaveBlock2Ptr->playerGender == MALE) sprite->x = 128; else sprite->x = 118; sprite->y = -48; sprite->sInitData++; sprite->data[1] = 64; sprite->data[2] = 256; } sprite->data[1] += (sprite->data[2] >> 8); sprite->x2 = Cos(sprite->data[1], 120); sprite->y2 = Sin(sprite->data[1], 120); if (sprite->data[2] < 2048) sprite->data[2] += 96; if (sprite->data[1] > 129) { sprite->sAnimCompleted++; sprite->oam.affineMode = ST_OAM_AFFINE_OFF; FreeOamMatrix(sprite->oam.matrixNum); CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF); } } } static void SpriteCB_FlyBirdSwoopDown(struct Sprite *sprite) { sprite->x2 = Cos(sprite->data[2], 140); sprite->y2 = Sin(sprite->data[2], 72); sprite->data[2] = (sprite->data[2] + 4) & 0xFF; if (sprite->sPlayerSpriteId != MAX_SPRITES) { struct Sprite *playerSprite = &gSprites[sprite->sPlayerSpriteId]; playerSprite->coordOffsetEnabled = FALSE; playerSprite->x = sprite->x + sprite->x2; playerSprite->y = sprite->y + sprite->y2 - 8; playerSprite->x2 = 0; playerSprite->y2 = 0; } if (sprite->data[2] >= 128) sprite->sAnimCompleted = TRUE; } static void SpriteCB_FlyBirdReturnToBall(struct Sprite *sprite) { if (sprite->sAnimCompleted == FALSE) { if (sprite->sInitData == FALSE) { sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; sprite->affineAnims = sAffineAnims_FlyBirdBall; InitSpriteAffineAnim(sprite); StartSpriteAffineAnim(sprite, 1); if (gSaveBlock2Ptr->playerGender == MALE) sprite->x = 112; else sprite->x = 100; sprite->y = -32; sprite->sInitData++; sprite->data[1] = 240; sprite->data[2] = 2048; sprite->data[4] = 128; } sprite->data[1] += sprite->data[2] >> 8; sprite->data[3] += sprite->data[2] >> 8; sprite->data[1] &= 0xFF; sprite->x2 = Cos(sprite->data[1], 32); sprite->y2 = Sin(sprite->data[1], 120); if (sprite->data[2] > 256) sprite->data[2] -= sprite->data[4]; if (sprite->data[4] < 256) sprite->data[4] += 24; if (sprite->data[2] < 256) sprite->data[2] = 256; if (sprite->data[3] >= 60) { sprite->sAnimCompleted++; sprite->oam.affineMode = ST_OAM_AFFINE_OFF; FreeOamMatrix(sprite->oam.matrixNum); sprite->invisible = TRUE; } } } static void StartFlyBirdReturnToBall(u8 spriteId) { StartFlyBirdSwoopDown(spriteId); gSprites[spriteId].callback = SpriteCB_FlyBirdReturnToBall; } static void Task_FlyIn(u8 taskId); static void FlyInFieldEffect_BirdSwoopDown(struct Task *task); static void FlyInFieldEffect_FlyInWithBird(struct Task *task); static void FlyInFieldEffect_JumpOffBird(struct Task *task); static void FlyInFieldEffect_FieldMovePose(struct Task *task); static void FlyInFieldEffect_BirdReturnToBall(struct Task *task); static void FlyInFieldEffect_WaitBirdReturn(struct Task *task); static void FlyInFieldEffect_End(struct Task *task); static void TryChangeBirdSprite(struct Sprite *sprite); static void (*const sFlyInFieldEffectFuncs[])(struct Task *task) = { FlyInFieldEffect_BirdSwoopDown, FlyInFieldEffect_FlyInWithBird, FlyInFieldEffect_JumpOffBird, FlyInFieldEffect_FieldMovePose, FlyInFieldEffect_BirdReturnToBall, FlyInFieldEffect_WaitBirdReturn, FlyInFieldEffect_End }; u32 FldEff_FlyIn(void) { CreateTask(Task_FlyIn, 0xFE); return 0; } static void Task_FlyIn(u8 taskId) { sFlyInFieldEffectFuncs[gTasks[taskId].tState](&gTasks[taskId]); } static void FlyInFieldEffect_BirdSwoopDown(struct Task *task) { struct ObjectEvent *playerObj; playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj)) { task->tState++; task->tTimer = 33; task->tAvatarFlags = gPlayerAvatar.flags; gPlayerAvatar.preventStep = TRUE; SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT); if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) SetSurfBlob_BobState(playerObj->fieldEffectSpriteId, BOB_NONE); ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); CameraObjectReset2(); ObjectEventTurn(playerObj, DIR_WEST); StartSpriteAnim(&gSprites[playerObj->spriteId], ANIM_GET_ON_OFF_POKEMON_WEST); playerObj->invisible = FALSE; task->tBirdSpriteId = CreateFlyBirdSprite(); StartFlyBirdSwoopDown(task->tBirdSpriteId); SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, playerObj->spriteId); StartSpriteAnim(&gSprites[task->tBirdSpriteId], gSaveBlock2Ptr->playerGender * 2 + 2); DoBirdSpriteWithPlayerAffineAnim(&gSprites[task->tBirdSpriteId], 1); gSprites[task->tBirdSpriteId].callback = SpriteCB_FlyBirdWithPlayer; } } static void FlyInFieldEffect_FlyInWithBird(struct Task *task) { struct ObjectEvent *playerObj; struct Sprite *playerSprite; TryChangeBirdSprite(&gSprites[task->tBirdSpriteId]); if (task->tTimer == 0 || (--task->tTimer) == 0) { playerObj= &gObjectEvents[gPlayerAvatar.objectEventId]; playerSprite = &gSprites[playerObj->spriteId]; SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, MAX_SPRITES); playerSprite->x += playerSprite->x2; playerSprite->y += playerSprite->y2; playerSprite->x2 = 0; playerSprite->y2 = 0; task->tState++; task->tTimer = 0; } } static void FlyInFieldEffect_JumpOffBird(struct Task *task) { s16 yOffsets[18] = {-2, -4, -5, -6, -7, -8, -8, -8, -7, -7, -6, -5, -3, -2, 0, 2, 4, 8}; struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->y2 = yOffsets[task->tTimer]; if ((++task->tTimer) >= 18) task->tState++; } static void FlyInFieldEffect_FieldMovePose(struct Task *task) { struct ObjectEvent *playerObj; struct Sprite *playerSprite; if (GetFlyBirdAnimCompleted(task->tBirdSpriteId)) { playerObj= &gObjectEvents[gPlayerAvatar.objectEventId]; playerSprite = &gSprites[playerObj->spriteId]; playerObj->inanimate = FALSE; MoveObjectEventToMapCoords(playerObj, playerObj->currentCoords.x, playerObj->currentCoords.y); playerSprite->x2 = 0; playerSprite->y2 = 0; playerSprite->coordOffsetEnabled = TRUE; StartPlayerAvatarSummonMonForFieldMoveAnim(); ObjectEventSetHeldMovement(playerObj, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); task->tState++; } } static void FlyInFieldEffect_BirdReturnToBall(struct Task *task) { if (ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gPlayerAvatar.objectEventId])) { task->tState++; StartFlyBirdReturnToBall(task->tBirdSpriteId); } } static void FlyInFieldEffect_WaitBirdReturn(struct Task *task) { if (GetFlyBirdAnimCompleted(task->tBirdSpriteId)) { DestroySprite(&gSprites[task->tBirdSpriteId]); task->tState++; task->data[1] = 16; } } static void FlyInFieldEffect_End(struct Task *task) { struct ObjectEvent *playerObj; u8 state; if ((--task->data[1]) == 0) { playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; state = PLAYER_AVATAR_GFX_NORMAL; if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) { state = PLAYER_AVATAR_GFX_RIDE; SetSurfBlob_BobState(playerObj->fieldEffectSpriteId, BOB_PLAYER_AND_MON); } ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(state)); ObjectEventTurn(playerObj, DIR_SOUTH); gPlayerAvatar.flags = task->tAvatarFlags; gPlayerAvatar.preventStep = FALSE; FieldEffectActiveListRemove(FLDEFF_FLY_IN); DestroyTask(FindTaskIdByFunc(Task_FlyIn)); } } #undef tState #undef tMonPartyId #undef tBirdSpriteId #undef tTimer #undef tAvatarFlags static const union AffineAnimCmd sAffineAnim_FlyBirdOutOfMap[] = { AFFINEANIMCMD_FRAME(24, 24, 0, 1), AFFINEANIMCMD_JUMP(0) }; static const union AffineAnimCmd sAffineAnim_FlyBirdIntoMap[] = { AFFINEANIMCMD_FRAME(512, 512, 0, 1), AFFINEANIMCMD_FRAME(-16, -16, 0, 1), AFFINEANIMCMD_JUMP(1) }; static const union AffineAnimCmd *const sAffineAnims_FlyBirdWithPlayer[] = { sAffineAnim_FlyBirdOutOfMap, sAffineAnim_FlyBirdIntoMap }; static void DoBirdSpriteWithPlayerAffineAnim(struct Sprite *sprite, u8 affineAnimId) { sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; sprite->affineAnims = sAffineAnims_FlyBirdWithPlayer; InitSpriteAffineAnim(sprite); StartSpriteAffineAnim(sprite, affineAnimId); } static void SpriteCB_FlyBirdWithPlayer(struct Sprite *sprite) { sprite->x2 = Cos(sprite->data[2], 180); sprite->y2 = Sin(sprite->data[2], 72); sprite->data[2] = (sprite->data[2] + 2) & 0xFF; if (sprite->sPlayerSpriteId != MAX_SPRITES) { struct Sprite *playerSprite; playerSprite = &gSprites[sprite->sPlayerSpriteId]; playerSprite->coordOffsetEnabled = FALSE; playerSprite->x = sprite->x + sprite->x2; playerSprite->y = sprite->y + sprite->y2 - 8; playerSprite->x2 = 0; playerSprite->y2 = 0; } if (sprite->data[2] >= 128) { sprite->sAnimCompleted = TRUE; sprite->oam.affineMode = ST_OAM_AFFINE_OFF; FreeOamMatrix(sprite->oam.matrixNum); CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF); } } #undef sInitData #undef sPlayerSpriteId #undef sAnimCompleted static void TryChangeBirdSprite(struct Sprite *sprite) { if (sprite->oam.affineMode != ST_OAM_AFFINE_OFF) { if (gOamMatrices[sprite->oam.matrixNum].a == 0x100 || gOamMatrices[sprite->oam.matrixNum].d == 0x100) { sprite->oam.affineMode = ST_OAM_AFFINE_OFF; FreeOamMatrix(sprite->oam.matrixNum); CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF); StartSpriteAnim(sprite, 0); sprite->callback = SpriteCB_FlyBirdSwoopDown; } } } static void Task_MoveDeoxysRock_Step(u8 taskId); u32 FldEff_MoveDeoxysRock(void) { u8 taskId; u8 objectEventIdBuffer; s32 x; s32 y; struct ObjectEvent * objectEvent; if (!TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &objectEventIdBuffer)) { objectEvent = &gObjectEvents[objectEventIdBuffer]; x = objectEvent->currentCoords.x - 7; y = objectEvent->currentCoords.y - 7; x = (gFieldEffectArguments[3] - x) * 16; y = (gFieldEffectArguments[4] - y) * 16; ShiftObjectEventCoords(objectEvent, gFieldEffectArguments[3] + 7, gFieldEffectArguments[4] + 7); taskId = CreateTask(Task_MoveDeoxysRock_Step, 0x50); gTasks[taskId].data[1] = objectEvent->spriteId; gTasks[taskId].data[2] = gSprites[objectEvent->spriteId].x + x; gTasks[taskId].data[3] = gSprites[objectEvent->spriteId].y + y; gTasks[taskId].data[8] = gFieldEffectArguments[5]; gTasks[taskId].data[9] = objectEventIdBuffer; } return FALSE; } static void Task_MoveDeoxysRock_Step(u8 taskId) { s16 *data = gTasks[taskId].data; struct Sprite *sprite = &gSprites[data[1]]; struct ObjectEvent * objectEvent; switch (data[0]) { case 0: data[4] = sprite->x << 4; data[5] = sprite->y << 4; // UB: Possible divide by zero data[6] = SAFE_DIV(((data[2] << 4) - data[4]), data[8]); data[7] = SAFE_DIV(((data[3] << 4) - data[5]), data[8]); data[0]++; // fallthrough case 1: if (data[8] != 0) { data[8]--; data[4] += data[6]; data[5] += data[7]; sprite->x = data[4] >> 4; sprite->y = data[5] >> 4; } else { objectEvent = &gObjectEvents[data[9]]; sprite->x = data[2]; sprite->y = data[3]; ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; FieldEffectActiveListRemove(FLDEFF_MOVE_DEOXYS_ROCK); DestroyTask(taskId); } break; } } static void Task_DestroyDeoxysRock(u8 taskId); static void DestroyDeoxysRockEffect_CameraShake(s16 *data, u8 taskId); static void DestroyDeoxysRockEffect_RockFragments(s16 *data, u8 taskId); static void DestroyDeoxysRockEffect_WaitAndEnd(s16 *data, u8 taskId); static void CreateDeoxysRockFragments(struct Sprite *sprite); static void SpriteCB_DeoxysRockFragment(struct Sprite *sprite); static void (*const sDestroyDeoxysRockEffectFuncs[])(s16 *data, u8 taskId) = { DestroyDeoxysRockEffect_CameraShake, DestroyDeoxysRockEffect_RockFragments, DestroyDeoxysRockEffect_WaitAndEnd }; static const struct SpriteFrameImage sImages_DeoxysRockFragment[] = { {sRockFragment_TopLeft, 0x20}, {sRockFragment_TopRight, 0x20}, {sRockFragment_BottomLeft, 0x20}, {sRockFragment_BottomRight, 0x20} }; static const union AnimCmd sAnim_RockFragment_TopLeft[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sAnim_RockFragment_TopRight[] = { ANIMCMD_FRAME(1, 0), ANIMCMD_END }; static const union AnimCmd sAnim_RockFragment_BottomLeft[] = { ANIMCMD_FRAME(2, 0), ANIMCMD_END }; static const union AnimCmd sAnim_RockFragment_BottomRight[] = { ANIMCMD_FRAME(3, 0), ANIMCMD_END }; static const union AnimCmd *const sAnims_DeoxysRockFragment[] = { sAnim_RockFragment_TopLeft, sAnim_RockFragment_TopRight, sAnim_RockFragment_BottomLeft, sAnim_RockFragment_BottomRight }; static const struct SpriteTemplate sSpriteTemplate_DeoxysRockFragment = { .tileTag = TAG_NONE, .paletteTag = 4371, .oam = &sOamData_8x8, .anims = sAnims_DeoxysRockFragment, .images = sImages_DeoxysRockFragment, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_DeoxysRockFragment }; // Task data for Task_DestroyDeoxysRock #define tState data[1] #define tObjectEventId data[2] #define tTimer data[3] #define tCameraTaskId data[5] #define tLocalId data[6] #define tMapNum data[7] #define tMapGroup data[8] u32 FldEff_DestroyDeoxysRock(void) { u8 taskId; u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &objectEventId)) { taskId = CreateTask(Task_DestroyDeoxysRock, 80); gTasks[taskId].data[2] = objectEventId; gTasks[taskId].tLocalId = gFieldEffectArguments[0]; gTasks[taskId].tMapNum = gFieldEffectArguments[1]; gTasks[taskId].tMapGroup = gFieldEffectArguments[2]; } else FieldEffectActiveListRemove(FLDEFF_DESTROY_DEOXYS_ROCK); return FALSE; } // Task data for Task_DeoxysRockCameraShake #define tShakeDelay data[0] #define tShakeUp data[1] #define tShake data[5] #define tEndDelay data[6] #define tEnding data[7] static void Task_DeoxysRockCameraShake(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[7] != 0) { if (++data[6] > 20) { data[6] = 0; if (data[5] != 0) data[5]--; } } else data[5] = 4; if (++data[0] > 1) { data[0] = 0; if (++data[1] & 1) SetCameraPanning(0, -data[5]); else SetCameraPanning(0, data[5]); } UpdateCameraPanning(); if (data[5] == 0) DestroyTask(taskId); } static void StartEndingDeoxysRockCameraShake(u8 taskId) { gTasks[taskId].data[7] = 1; } #undef tShakeDelay #undef tShakeUp #undef tShake #undef tEndDelay #undef tEnding static void Task_DestroyDeoxysRock(u8 taskId) { s16 *data = gTasks[taskId].data; InstallCameraPanAheadCallback(); SetCameraPanningCallback(NULL); sDestroyDeoxysRockEffectFuncs[tState](data, taskId); } static void DestroyDeoxysRockEffect_CameraShake(s16 *data, u8 taskId) { u8 newTaskId = CreateTask(Task_DeoxysRockCameraShake, 90); PlaySE(SE_THUNDER2); tCameraTaskId = newTaskId; tState++; } static void DestroyDeoxysRockEffect_RockFragments(s16 *data, u8 taskId) { if (++tTimer > 120) { struct Sprite *sprite = &gSprites[gObjectEvents[tObjectEventId].spriteId]; gObjectEvents[tObjectEventId].invisible = TRUE; BlendPalettes(PALETTES_BG, 0x10, RGB_WHITE); BeginNormalPaletteFade(PALETTES_BG, 0, 0x10, 0, RGB_WHITE); CreateDeoxysRockFragments(sprite); PlaySE(SE_THUNDER); StartEndingDeoxysRockCameraShake(tCameraTaskId); tTimer = 0; tState++; } } static void DestroyDeoxysRockEffect_WaitAndEnd(s16 *data, u8 taskId) { if (!gPaletteFade.active && !FuncIsActiveTask(Task_DeoxysRockCameraShake)) { InstallCameraPanAheadCallback(); RemoveObjectEventByLocalIdAndMap(tLocalId, tMapNum, tMapGroup); FieldEffectActiveListRemove(FLDEFF_DESTROY_DEOXYS_ROCK); DestroyTask(taskId); } } #undef tState #undef tObjectEventId #undef tTimer #undef tCameraTaskId #undef tLocalId #undef tMapNum #undef tMapGroup static void CreateDeoxysRockFragments(struct Sprite *sprite) { int i; int xPos = (s16)gTotalCameraPixelOffsetX + sprite->x + sprite->x2; int yPos = (s16)gTotalCameraPixelOffsetY + sprite->y + sprite->y2 - 4; for (i = 0; i < 4; i++) { u8 spriteId = CreateSprite(&sSpriteTemplate_DeoxysRockFragment, xPos, yPos, 0); if (spriteId != MAX_SPRITES) { StartSpriteAnim(&gSprites[spriteId], i); gSprites[spriteId].data[0] = i; gSprites[spriteId].oam.paletteNum = sprite->oam.paletteNum; } } } static void SpriteCB_DeoxysRockFragment(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->x -= 16; sprite->y -= 12; break; case 1: sprite->x += 16; sprite->y -= 12; break; case 2: sprite->x -= 16; sprite->y += 12; break; case 3: sprite->x += 16; sprite->y += 12; break; } if (sprite->x < -4 || sprite->x > DISPLAY_WIDTH + 4 || sprite->y < -4 || sprite->y > DISPLAY_HEIGHT + 4) DestroySprite(sprite); } static void Task_PhotoFlash(u8 taskId) { if (!gPaletteFade.active) { FieldEffectActiveListRemove(FLDEFF_PHOTO_FLASH); DestroyTask(taskId); } } // Bug: Return value should be u32, not void void FldEff_PhotoFlash(void) { BlendPalettes(PALETTES_ALL, 0x10, RGB_WHITE); BeginNormalPaletteFade(PALETTES_ALL, -1, 0x0F, 0x00, RGB_WHITE); CreateTask(Task_PhotoFlash, 90); } ================================================ FILE: src/field_effect_helpers.c ================================================ #include "global.h" #include "gflib.h" #include "event_object_movement.h" #include "field_camera.h" #include "field_effect.h" #include "field_effect_helpers.h" #include "field_weather.h" #include "fieldmap.h" #include "metatile_behavior.h" #include "overworld.h" #include "constants/field_effects.h" #include "constants/region_map_sections.h" #include "constants/event_objects.h" #include "constants/songs.h" #define OBJ_EVENT_PAL_TAG_NONE 0x11FF // duplicate of define in event_object_movement.c static void UpdateObjectReflectionSprite(struct Sprite *sprite); static void LoadObjectReflectionPalette(struct ObjectEvent * objectEvent, struct Sprite *sprite); static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteNum); static void LoadObjectRegularReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteNum); static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 z, u8 offset); static void FadeFootprintsTireTracks_Step0(struct Sprite *sprite); static void FadeFootprintsTireTracks_Step1(struct Sprite *sprite); static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite); static void UpdateAshFieldEffect_Step0(struct Sprite *sprite); static void UpdateAshFieldEffect_Step1(struct Sprite *sprite); static void UpdateAshFieldEffect_Step2(struct Sprite *sprite); static void SynchroniseSurfAnim(struct ObjectEvent * objectEvent, struct Sprite *sprite); static void SynchroniseSurfPosition(struct ObjectEvent * objectEvent, struct Sprite *sprite); static void CreateBobbingEffect(struct ObjectEvent * objectEvent, struct Sprite *linkedSprite, struct Sprite *sprite); static void SpriteCB_UnderwaterSurfBlob(struct Sprite *sprite); static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum); void SetUpReflection(struct ObjectEvent * objectEvent, struct Sprite *sprite, bool8 stillReflection) { struct Sprite *reflectionSprite; reflectionSprite = &gSprites[CreateCopySpriteAt(sprite, sprite->x, sprite->y, 0x98)]; reflectionSprite->callback = UpdateObjectReflectionSprite; reflectionSprite->oam.priority = 3; reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[reflectionSprite->oam.paletteNum]; reflectionSprite->usingSheet = TRUE; reflectionSprite->anims = gDummySpriteAnimTable; StartSpriteAnim(reflectionSprite, 0); reflectionSprite->affineAnims = gDummySpriteAffineAnimTable; reflectionSprite->affineAnimBeginning = TRUE; reflectionSprite->subspriteMode = SUBSPRITES_OFF; reflectionSprite->data[0] = sprite->data[0]; reflectionSprite->data[1] = objectEvent->localId; reflectionSprite->data[7] = stillReflection; LoadObjectReflectionPalette(objectEvent, reflectionSprite); if (!stillReflection) reflectionSprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; } static s16 GetReflectionVerticalOffset(struct ObjectEvent * objectEvent) { return GetObjectEventGraphicsInfo(objectEvent->graphicsId)->height - 2; } static void LoadObjectReflectionPalette(struct ObjectEvent * objectEvent, struct Sprite *sprite) { u8 bridgeType; u16 bridgeReflectionVerticalOffsets[] = { 12, 28, 44 }; sprite->data[2] = 0; if (!GetObjectEventGraphicsInfo(objectEvent->graphicsId)->disableReflectionPaletteLoad && ((bridgeType = MetatileBehavior_GetBridgeType(objectEvent->previousMetatileBehavior)) || (bridgeType = MetatileBehavior_GetBridgeType(objectEvent->currentMetatileBehavior)))) { sprite->data[2] = bridgeReflectionVerticalOffsets[bridgeType - 1]; LoadObjectHighBridgeReflectionPalette(objectEvent, sprite->oam.paletteNum); } else { LoadObjectRegularReflectionPalette(objectEvent, sprite->oam.paletteNum); } } static void LoadObjectRegularReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteIndex) { const struct ObjectEventGraphicsInfo * graphicsInfo; graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); if (graphicsInfo->reflectionPaletteTag != OBJ_EVENT_PAL_TAG_NONE) { if (graphicsInfo->paletteSlot == PALSLOT_PLAYER) LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, paletteIndex); else if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, paletteIndex); else PatchObjectPalette(GetObjectPaletteTag(paletteIndex), paletteIndex); UpdateSpritePaletteWithWeather(paletteIndex); } } // When walking on a bridge high above water (Route 120), the reflection is a solid dark blue color. // This is so the sprite blends in with the dark water metatile underneath the bridge. static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteNum) { const struct ObjectEventGraphicsInfo * graphicsInfo; graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); if (graphicsInfo->reflectionPaletteTag != OBJ_EVENT_PAL_TAG_NONE) { PatchObjectPalette(graphicsInfo->reflectionPaletteTag, paletteNum); UpdateSpritePaletteWithWeather(paletteNum); } } static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) { struct ObjectEvent * objectEvent; struct Sprite *mainSprite; objectEvent = &gObjectEvents[reflectionSprite->data[0]]; mainSprite = &gSprites[objectEvent->spriteId]; if (!objectEvent->active || !objectEvent->hasReflection || objectEvent->localId != reflectionSprite->data[1]) { reflectionSprite->inUse = FALSE; } else { reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[mainSprite->oam.paletteNum]; reflectionSprite->oam.shape = mainSprite->oam.shape; reflectionSprite->oam.size = mainSprite->oam.size; reflectionSprite->oam.matrixNum = mainSprite->oam.matrixNum | ST_OAM_VFLIP; reflectionSprite->oam.tileNum = mainSprite->oam.tileNum; reflectionSprite->subspriteTables = mainSprite->subspriteTables; reflectionSprite->subspriteTableNum = mainSprite->subspriteTableNum; reflectionSprite->invisible = mainSprite->invisible; reflectionSprite->x = mainSprite->x; // reflectionSprite->data[2] holds an additional vertical offset, used by the high bridges on Route 120 reflectionSprite->y = mainSprite->y + GetReflectionVerticalOffset(objectEvent) + reflectionSprite->data[2]; reflectionSprite->centerToCornerVecX = mainSprite->centerToCornerVecX; reflectionSprite->centerToCornerVecY = mainSprite->centerToCornerVecY; reflectionSprite->x2 = mainSprite->x2; reflectionSprite->y2 = -mainSprite->y2; reflectionSprite->coordOffsetEnabled = mainSprite->coordOffsetEnabled; /* if (objectEvent->hideReflection == TRUE) reflectionSprite->invisible = TRUE; */ // Check if the reflection is not still. if (reflectionSprite->data[7] == FALSE) { // Sets the reflection sprite's rot/scale matrix to the appropriate // matrix based on whether or not the main sprite is horizontally flipped. // If the sprite is facing to the east, then it is flipped, and its matrixNum is 8. reflectionSprite->oam.matrixNum = 0; if (mainSprite->oam.matrixNum & ST_OAM_HFLIP) reflectionSprite->oam.matrixNum = 1; } } } extern const struct SpriteTemplate * const gFieldEffectObjectTemplatePointers[]; u8 CreateWarpArrowSprite(void) { u8 spriteId; struct Sprite *sprite; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ARROW], 0, 0, 0x52); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->oam.priority = 1; sprite->coordOffsetEnabled = TRUE; sprite->invisible = TRUE; } return spriteId; } void SetSpriteInvisible(u8 spriteId) { gSprites[spriteId].invisible = TRUE; } void ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y) { s16 x2; s16 y2; struct Sprite *sprite; sprite = &gSprites[spriteId]; if (sprite->invisible || sprite->data[0] != x || sprite->data[1] != y) { SetSpritePosToMapCoords(x, y, &x2, &y2); sprite = &gSprites[spriteId]; sprite->x = x2 + 8; sprite->y = y2 + 8; sprite->invisible = FALSE; sprite->data[0] = x; sprite->data[1] = y; StartSpriteAnim(sprite, direction - 1); } } const u8 gShadowEffectTemplateIds[] = { [SHADOW_SIZE_S] = FLDEFFOBJ_SHADOW_S, [SHADOW_SIZE_M] = FLDEFFOBJ_SHADOW_M, [SHADOW_SIZE_L] = FLDEFFOBJ_SHADOW_L, [SHADOW_SIZE_XL] = FLDEFFOBJ_SHADOW_XL }; const u16 gShadowVerticalOffsets[] = { [SHADOW_SIZE_S] = 4, [SHADOW_SIZE_M] = 4, [SHADOW_SIZE_L] = 4, [SHADOW_SIZE_XL] = 16 }; u32 FldEff_Shadow(void) { u8 objectEventId; const struct ObjectEventGraphicsInfo * graphicsInfo; u8 spriteId; objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[gShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94); if (spriteId != MAX_SPRITES) { gSprites[spriteId].coordOffsetEnabled = TRUE; gSprites[spriteId].data[0] = gFieldEffectArguments[0]; gSprites[spriteId].data[1] = gFieldEffectArguments[1]; gSprites[spriteId].data[2] = gFieldEffectArguments[2]; gSprites[spriteId].data[3] = (graphicsInfo->height >> 1) - gShadowVerticalOffsets[graphicsInfo->shadowSize]; } return 0; } void UpdateShadowFieldEffect(struct Sprite *sprite) { u8 objectEventId; struct ObjectEvent * objectEvent; struct Sprite *linkedSprite; if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId)) { FieldEffectStop(sprite, FLDEFF_SHADOW); } else { objectEvent = &gObjectEvents[objectEventId]; linkedSprite = &gSprites[objectEvent->spriteId]; sprite->oam.priority = linkedSprite->oam.priority; sprite->x = linkedSprite->x; sprite->y = linkedSprite->y + sprite->data[3]; if (!objectEvent->active || !objectEvent->hasShadow || MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfable(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfable(objectEvent->previousMetatileBehavior) || MetatileBehavior_IsReflective(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsReflective(objectEvent->previousMetatileBehavior)) { FieldEffectStop(sprite, FLDEFF_SHADOW); } } } u32 FldEff_TallGrass(void) { s16 x; s16 y; u8 spriteId; struct Sprite *sprite; u8 mapsec = GetCurrentRegionMapSectionId(); x = gFieldEffectArguments[0]; y = gFieldEffectArguments[1]; SetSpritePosToOffsetMapCoords(&x, &y, 8, 8); if(mapsec == MAPSEC_TREASURE_BEACH || mapsec == MAPSEC_KINDLE_ROAD || mapsec == MAPSEC_MT_EMBER || mapsec == MAPSEC_THREE_ISLE_PORT || mapsec == MAPSEC_BERRY_FOREST || mapsec == MAPSEC_BOND_BRIDGE) spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[36], x, y, 0); else if(mapsec == MAPSEC_CANYON_ENTRANCE || mapsec == MAPSEC_SEVAULT_CANYON) spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[37], x, y, 0); else spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_TALL_GRASS], x, y, 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = gFieldEffectArguments[2]; sprite->data[1] = gFieldEffectArguments[0]; sprite->data[2] = gFieldEffectArguments[1]; sprite->data[3] = gFieldEffectArguments[4]; sprite->data[4] = gFieldEffectArguments[5]; sprite->data[5] = gFieldEffectArguments[6]; if (gFieldEffectArguments[7]) { SeekSpriteAnim(sprite, 4); } } return 0; } void UpdateTallGrassFieldEffect(struct Sprite *sprite) { u8 mapNum; u8 mapGroup; u8 metatileBehavior; u8 localId; u8 objectEventId; struct ObjectEvent * objectEvent; mapNum = sprite->data[5] >> 8; mapGroup = sprite->data[5]; if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup)) { sprite->data[1] -= gCamera.x; sprite->data[2] -= gCamera.y; sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup; } localId = sprite->data[3] >> 8; mapNum = sprite->data[3]; mapGroup = sprite->data[4]; metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]); if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsTallGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded)) { FieldEffectStop(sprite, FLDEFF_TALL_GRASS); } else { objectEvent = &gObjectEvents[objectEventId]; if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2])) sprite->data[7] = TRUE; // This variable is misused. metatileBehavior = 0; if (sprite->animCmdIndex == 0) metatileBehavior = 4; UpdateObjectEventSpriteInvisibility(sprite, FALSE); UpdateGrassFieldEffectSubpriority(sprite, sprite->data[0], metatileBehavior); } } u32 FldEff_JumpTallGrass(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_TALL_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = gFieldEffectArguments[2]; sprite->data[1] = 12; } return 0; } u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) { struct Sprite *sprite; u32 i; for (i = 0; i < MAX_SPRITES; i++) { if (gSprites[i].inUse) { sprite = &gSprites[i]; if (sprite->callback == UpdateTallGrassFieldEffect && (x == sprite->data[1] && y == sprite->data[2]) && (localId == (sprite->data[3] >> 8) && mapNum == (sprite->data[3] & 0xFF) && mapGroup == sprite->data[4])) return i; } } return MAX_SPRITES; } u32 FldEff_LongGrass(void) { s16 x; s16 y; u8 spriteId; struct Sprite *sprite; x = gFieldEffectArguments[0]; y = gFieldEffectArguments[1]; SetSpritePosToOffsetMapCoords(&x, &y, 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_LONG_GRASS], x, y, 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = ElevationToPriority(gFieldEffectArguments[2]); sprite->data[0] = gFieldEffectArguments[2]; sprite->data[1] = gFieldEffectArguments[0]; sprite->data[2] = gFieldEffectArguments[1]; sprite->data[3] = gFieldEffectArguments[4]; sprite->data[4] = gFieldEffectArguments[5]; sprite->data[5] = gFieldEffectArguments[6]; if (gFieldEffectArguments[7]) { SeekSpriteAnim(sprite, 6); } } return 0; } void UpdateLongGrassFieldEffect(struct Sprite *sprite) { u8 mapNum; u8 mapGroup; u8 metatileBehavior; u8 localId; u8 objectEventId; struct ObjectEvent * objectEvent; mapNum = sprite->data[5] >> 8; mapGroup = sprite->data[5]; if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup)) { sprite->data[1] -= gCamera.x; sprite->data[2] -= gCamera.y; sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup; } localId = sprite->data[3] >> 8; mapNum = sprite->data[3]; mapGroup = sprite->data[4]; metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]); if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded)) { FieldEffectStop(sprite, FLDEFF_LONG_GRASS); } else { objectEvent = &gObjectEvents[objectEventId]; if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2])) { sprite->data[7] = TRUE; } UpdateObjectEventSpriteInvisibility(sprite, FALSE); UpdateGrassFieldEffectSubpriority(sprite, sprite->data[0], 0); } } u32 FldEff_JumpLongGrass(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_LONG_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = gFieldEffectArguments[2]; sprite->data[1] = 18; } return 0; } u32 FldEff_ShortGrass(void) { u8 objectEventId; struct ObjectEvent * objectEvent; u8 spriteId; struct Sprite *sprite; objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); objectEvent = &gObjectEvents[objectEventId]; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SHORT_GRASS], 0, 0, 0); if (spriteId != MAX_SPRITES) { sprite = &(gSprites[spriteId]); sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority; sprite->data[0] = gFieldEffectArguments[0]; sprite->data[1] = gFieldEffectArguments[1]; sprite->data[2] = gFieldEffectArguments[2]; sprite->data[3] = gSprites[objectEvent->spriteId].x; sprite->data[4] = gSprites[objectEvent->spriteId].y; } return 0; } void UpdateShortGrassFieldEffect(struct Sprite *sprite) { u8 objectEventId; s16 x; s16 y; const struct ObjectEventGraphicsInfo * graphicsInfo; struct Sprite *linkedSprite; if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inShortGrass) { FieldEffectStop(sprite, FLDEFF_SHORT_GRASS); } else { graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId]; y = linkedSprite->y; x = linkedSprite->x; if (x != sprite->data[3] || y != sprite->data[4]) { sprite->data[3] = x; sprite->data[4] = y; if (sprite->animEnded) { StartSpriteAnim(sprite, 0); } } sprite->x = x; sprite->y = y; sprite->y2 = (graphicsInfo->height >> 1) - 8; sprite->subpriority = linkedSprite->subpriority - 1; sprite->oam.priority = linkedSprite->oam.priority; UpdateObjectEventSpriteInvisibility(sprite, linkedSprite->invisible); } } u32 FldEff_SandFootprints(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SAND_FOOTPRINTS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[7] = FLDEFF_SAND_FOOTPRINTS; StartSpriteAnim(sprite, gFieldEffectArguments[4]); } return 0; } u32 FldEff_DeepSandFootprints(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_DEEP_SAND_FOOTPRINTS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[7] = FLDEFF_DEEP_SAND_FOOTPRINTS; StartSpriteAnim(sprite, gFieldEffectArguments[4]); } return spriteId; } u32 FldEff_BikeTireTracks(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BIKE_TIRE_TRACKS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[7] = FLDEFF_BIKE_TIRE_TRACKS; StartSpriteAnim(sprite, gFieldEffectArguments[4]); } return spriteId; } void (*const gFadeFootprintsTireTracksFuncs[])(struct Sprite *sprite) = { FadeFootprintsTireTracks_Step0, FadeFootprintsTireTracks_Step1 }; void UpdateFootprintsTireTracksFieldEffect(struct Sprite *sprite) { gFadeFootprintsTireTracksFuncs[sprite->data[0]](sprite); } static void FadeFootprintsTireTracks_Step0(struct Sprite *sprite) { // Wait 40 frames before the flickering starts. if (++sprite->data[1] > 40) sprite->data[0] = 1; UpdateObjectEventSpriteInvisibility(sprite, FALSE); } static void FadeFootprintsTireTracks_Step1(struct Sprite *sprite) { sprite->invisible ^= 1; sprite->data[1]++; UpdateObjectEventSpriteInvisibility(sprite, sprite->invisible); if (sprite->data[1] > 56) { FieldEffectStop(sprite, sprite->data[7]); } } u32 FldEff_Splash(void) { u8 objectEventId; struct ObjectEvent * objectEvent; u8 spriteId; struct Sprite *sprite; const struct ObjectEventGraphicsInfo * graphicsInfo; struct Sprite *linkedSprite; objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); objectEvent = &gObjectEvents[objectEventId]; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPLASH], 0, 0, 0); if (spriteId != MAX_SPRITES) { graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; linkedSprite = &gSprites[objectEvent->spriteId]; sprite->oam.priority = linkedSprite->oam.priority; sprite->data[0] = gFieldEffectArguments[0]; sprite->data[1] = gFieldEffectArguments[1]; sprite->data[2] = gFieldEffectArguments[2]; sprite->y2 = (graphicsInfo->height >> 1) - 4; PlaySE(SE_PUDDLE); } return 0; } void UpdateSplashFieldEffect(struct Sprite *sprite) { u8 objectEventId; if (sprite->animEnded || TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId)) { FieldEffectStop(sprite, FLDEFF_SPLASH); } else { sprite->x = gSprites[gObjectEvents[objectEventId].spriteId].x; sprite->y = gSprites[gObjectEvents[objectEventId].spriteId].y; UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } u32 FldEff_JumpSmallSplash(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_SMALL_SPLASH], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = gFieldEffectArguments[2]; sprite->data[1] = FLDEFF_JUMP_SMALL_SPLASH; } return 0; } u32 FldEff_JumpBigSplash(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_BIG_SPLASH], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = gFieldEffectArguments[2]; sprite->data[1] = FLDEFF_JUMP_BIG_SPLASH; } return 0; } u32 FldEff_FeetInFlowingWater(void) { u8 objectEventId; struct ObjectEvent * objectEvent; u8 spriteId; struct Sprite *sprite; const struct ObjectEventGraphicsInfo * graphicsInfo; objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); objectEvent = &gObjectEvents[objectEventId]; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPLASH], 0, 0, 0); if (spriteId != MAX_SPRITES) { graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); sprite = &gSprites[spriteId]; sprite->callback = UpdateFeetInFlowingWaterFieldEffect; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority; sprite->data[0] = gFieldEffectArguments[0]; sprite->data[1] = gFieldEffectArguments[1]; sprite->data[2] = gFieldEffectArguments[2]; sprite->data[3] = -1; sprite->data[4] = -1; sprite->y2 = (graphicsInfo->height >> 1) - 4; StartSpriteAnim(sprite, 1); } return 0; } static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite) { u8 objectEventId; struct Sprite *linkedSprite; struct ObjectEvent * objectEvent; if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inShallowFlowingWater) { FieldEffectStop(sprite, FLDEFF_FEET_IN_FLOWING_WATER); } else { objectEvent = &gObjectEvents[objectEventId]; linkedSprite = &gSprites[objectEvent->spriteId]; sprite->x = linkedSprite->x; sprite->y = linkedSprite->y; sprite->subpriority = linkedSprite->subpriority; UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (objectEvent->currentCoords.x != sprite->data[3] || objectEvent->currentCoords.y != sprite->data[4]) { sprite->data[3] = objectEvent->currentCoords.x; sprite->data[4] = objectEvent->currentCoords.y; if (!sprite->invisible) { PlaySE(SE_PUDDLE); } } } } u32 FldEff_Ripple(void) { u8 spriteId; struct Sprite *sprite; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_RIPPLE], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = FLDEFF_RIPPLE; } return 0; } u32 FldEff_HotSpringsWater(void) { u8 objectEventId; struct ObjectEvent * objectEvent; u8 spriteId; struct Sprite *sprite; objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); objectEvent = &gObjectEvents[objectEventId]; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_HOT_SPRINGS_WATER], 0, 0, 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority; sprite->data[0] = gFieldEffectArguments[0]; sprite->data[1] = gFieldEffectArguments[1]; sprite->data[2] = gFieldEffectArguments[2]; sprite->data[3] = gSprites[objectEvent->spriteId].x; sprite->data[4] = gSprites[objectEvent->spriteId].y; } return 0; } void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite) { u8 objectEventId; const struct ObjectEventGraphicsInfo * graphicsInfo; struct Sprite *linkedSprite; if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inHotSprings) { FieldEffectStop(sprite, FLDEFF_HOT_SPRINGS_WATER); } else { graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId]; sprite->x = linkedSprite->x; sprite->y = (graphicsInfo->height >> 1) + linkedSprite->y - 8; sprite->subpriority = linkedSprite->subpriority - 1; UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } u32 FldEff_UnusedGrass(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = FLDEFF_UNUSED_GRASS; } return 0; } u32 FldEff_UnusedGrass2(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_GRASS_2], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = FLDEFF_UNUSED_GRASS_2; } return 0; } u32 FldEff_UnusedSand(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_SAND], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = FLDEFF_UNUSED_SAND; } return 0; } u32 FldEff_UnusedWaterSurfacing(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_WATER_SURFACING], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = FLDEFF_UNUSED_WATER_SURFACING; } return 0; } void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 d) { gFieldEffectArguments[0] = x; gFieldEffectArguments[1] = y; gFieldEffectArguments[2] = 0x52; gFieldEffectArguments[3] = 1; gFieldEffectArguments[4] = metatileId; gFieldEffectArguments[5] = d; FieldEffectStart(FLDEFF_ASH); } u32 FldEff_Ash(void) { s16 x; s16 y; u8 spriteId; struct Sprite *sprite; x = gFieldEffectArguments[0]; y = gFieldEffectArguments[1]; SetSpritePosToOffsetMapCoords(&x, &y, 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ASH], x, y, gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[1] = gFieldEffectArguments[0]; sprite->data[2] = gFieldEffectArguments[1]; sprite->data[3] = gFieldEffectArguments[4]; sprite->data[4] = gFieldEffectArguments[5]; } return 0; } void (*const gAshFieldEffectFuncs[])(struct Sprite *sprite) = { UpdateAshFieldEffect_Step0, UpdateAshFieldEffect_Step1, UpdateAshFieldEffect_Step2 }; void UpdateAshFieldEffect(struct Sprite *sprite) { gAshFieldEffectFuncs[sprite->data[0]](sprite); } static void UpdateAshFieldEffect_Step0(struct Sprite *sprite) { sprite->invisible = TRUE; sprite->animPaused = TRUE; if (--sprite->data[4] == 0) sprite->data[0] = 1; } static void UpdateAshFieldEffect_Step1(struct Sprite *sprite) { sprite->invisible = FALSE; sprite->animPaused = FALSE; MapGridSetMetatileIdAt(sprite->data[1], sprite->data[2], sprite->data[3]); CurrentMapDrawMetatileAt(sprite->data[1], sprite->data[2]); gObjectEvents[gPlayerAvatar.objectEventId].triggerGroundEffectsOnMove = TRUE; sprite->data[0] = 2; } static void UpdateAshFieldEffect_Step2(struct Sprite *sprite) { UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (sprite->animEnded) FieldEffectStop(sprite, FLDEFF_ASH); } // Sprite data for surf blob #define sBitfield data[0] #define sPlayerOffset data[1] #define sPlayerObjectId data[2] #define sBobDirection data[3] #define sTimer data[4] u32 FldEff_SurfBlob(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SURF_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.paletteNum = 0; sprite->sPlayerObjectId = gFieldEffectArguments[2]; sprite->sBobDirection = 0; sprite->data[6] = -1; sprite->data[7] = -1; } FieldEffectActiveListRemove(FLDEFF_SURF_BLOB); return spriteId; } void SetSurfBlob_BobState(u8 spriteId, u8 bobState) { gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF) | (bobState & 0xF); } void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 value) { gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF0) | ((value & 0xF) << 4); } void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset) { gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF00) | ((hasOffset & 0xF) << 8); gSprites[spriteId].sPlayerOffset = offset; } static u8 GetSurfBlob_BobState(struct Sprite *sprite) { return sprite->sBitfield & 0xF; } static bool8 GetSurfBlob_DontSyncAnim(struct Sprite *sprite) { return (sprite->sBitfield & 0xF0) >> 4; } static bool8 GetSurfBlob_HasPlayerOffset(struct Sprite *sprite) { return (sprite->sBitfield & 0xF00) >> 8; } void UpdateSurfBlobFieldEffect(struct Sprite *sprite) { struct ObjectEvent *playerObject; struct Sprite *playerSprite; playerObject = &gObjectEvents[sprite->sPlayerObjectId]; playerSprite = &gSprites[playerObject->spriteId]; SynchroniseSurfAnim(playerObject, sprite); SynchroniseSurfPosition(playerObject, sprite); CreateBobbingEffect(playerObject, playerSprite, sprite); sprite->oam.priority = playerSprite->oam.priority; } static void SynchroniseSurfAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 surfBlobDirectionAnims[] = { [DIR_NONE] = 0, [DIR_SOUTH] = 0, [DIR_NORTH] = 1, [DIR_WEST] = 2, [DIR_EAST] = 3 }; if (GetSurfBlob_DontSyncAnim(sprite) == FALSE) StartSpriteAnimIfDifferent(sprite, surfBlobDirectionAnims[objectEvent->movementDirection]); } void SynchroniseSurfPosition(struct ObjectEvent *playerObject, struct Sprite *surfBlobSprite) { u32 i; s16 x = playerObject->currentCoords.x; s16 y = playerObject->currentCoords.y; s32 yOffset = surfBlobSprite->y2; if (yOffset == 0 && (x != surfBlobSprite->data[6] || y != surfBlobSprite->data[7])) { surfBlobSprite->data[5] = yOffset; surfBlobSprite->data[6] = x; surfBlobSprite->data[7] = y; for (i = DIR_SOUTH; i <= DIR_EAST; i++, x = surfBlobSprite->data[6], y = surfBlobSprite->data[7]) { MoveCoords(i, &x, &y); if (MapGridGetElevationAt(x, y) == 3) { surfBlobSprite->data[5]++; break; } } } } static void CreateBobbingEffect(struct ObjectEvent *objectEvent, struct Sprite *playerSprite, struct Sprite *surfBlobSprite) { u16 intervals[] = {7, 15}; u8 bobState = GetSurfBlob_BobState(surfBlobSprite); if (bobState != BOB_NONE) { // the surf blob sprite never bobs since sBobDirection will always be 0 if (((u16)(++surfBlobSprite->sTimer) & intervals[surfBlobSprite->data[5]]) == 0) surfBlobSprite->y2 += surfBlobSprite->sBobDirection; if ((surfBlobSprite->sTimer & 0x1F) == 0) surfBlobSprite->sBobDirection = -surfBlobSprite->sBobDirection; if (bobState != BOB_MON_ONLY) { if (GetSurfBlob_HasPlayerOffset(surfBlobSprite) == FALSE) playerSprite->y2 = surfBlobSprite->y2; else playerSprite->y2 = surfBlobSprite->sPlayerOffset + surfBlobSprite->y2; if (surfBlobSprite->animCmdIndex != 0) playerSprite->y2++; surfBlobSprite->x = playerSprite->x; surfBlobSprite->y = playerSprite->y + 8; } } } #undef sBitfield #undef sPlayerOffset #undef sPlayerObjectId #undef sBobDirection #undef sTimer u8 StartUnderwaterSurfBlobBobbing(u8 oldSpriteId) { u8 spriteId; struct Sprite *sprite; spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1); sprite = &gSprites[spriteId]; sprite->callback = SpriteCB_UnderwaterSurfBlob; sprite->invisible = TRUE; sprite->data[0] = oldSpriteId; sprite->data[1] = 1; return spriteId; } static void SpriteCB_UnderwaterSurfBlob(struct Sprite *sprite) { struct Sprite *oldSprite; oldSprite = &gSprites[sprite->data[0]]; if (((sprite->data[2]++) & 0x03) == 0) { oldSprite->y2 += sprite->data[1]; } if ((sprite->data[2] & 0x0F) == 0) { sprite->data[1] = -sprite->data[1]; } } u32 FldEff_Dust(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_GROUND_IMPACT_DUST], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->data[0] = gFieldEffectArguments[2]; sprite->data[1] = 10; } return 0; } u32 FldEff_SandPile(void) { u8 objectEventId; struct ObjectEvent * objectEvent; u8 spriteId; struct Sprite *sprite; const struct ObjectEventGraphicsInfo * graphicsInfo; objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); objectEvent = &gObjectEvents[objectEventId]; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SAND_PILE], 0, 0, 0); if (spriteId != MAX_SPRITES) { graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority; sprite->data[0] = gFieldEffectArguments[0]; sprite->data[1] = gFieldEffectArguments[1]; sprite->data[2] = gFieldEffectArguments[2]; sprite->data[3] = gSprites[objectEvent->spriteId].x; sprite->data[4] = gSprites[objectEvent->spriteId].y; sprite->y2 = (graphicsInfo->height >> 1) - 2; SeekSpriteAnim(sprite, 2); } return 0; } void UpdateSandPileFieldEffect(struct Sprite *sprite) { u8 objectEventId; s16 x; s16 y; if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inSandPile) { FieldEffectStop(sprite, FLDEFF_SAND_PILE); } else { y = gSprites[gObjectEvents[objectEventId].spriteId].y; x = gSprites[gObjectEvents[objectEventId].spriteId].x; if (x != sprite->data[3] || y != sprite->data[4]) { sprite->data[3] = x; sprite->data[4] = y; if (sprite->animEnded) { StartSpriteAnim(sprite, 0); } } sprite->x = x; sprite->y = y; sprite->subpriority = gSprites[gObjectEvents[objectEventId].spriteId].subpriority; UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } u32 FldEff_Bubbles(void) { u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BUBBLES], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = 1; } return 0; } void UpdateBubblesFieldEffect(struct Sprite *sprite) { sprite->data[0] += 0x80; sprite->data[0] &= 0x100; sprite->y -= sprite->data[0] >> 8; UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (sprite->invisible || sprite->animEnded) { FieldEffectStop(sprite, FLDEFF_BUBBLES); } } u32 FldEff_BerryTreeGrowthSparkle(void) { /*u8 spriteId; struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPARKLE], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->oam.paletteNum = 5; sprite->data[0] = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; }*/ return 0; } u32 ShowTreeDisguiseFieldEffect(void) { return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, FLDEFFOBJ_TREE_DISGUISE, 4); } u32 ShowMountainDisguiseFieldEffect(void) { return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, FLDEFFOBJ_MOUNTAIN_DISGUISE, 3); } u32 ShowSandDisguiseFieldEffect(void) { return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, FLDEFFOBJ_SAND_DISGUISE, 2); } static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum) { u8 spriteId; struct Sprite *sprite; if (TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &spriteId)) { FieldEffectActiveListRemove(fldEff); return MAX_SPRITES; } spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[templateIdx], 0, 0, 0); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled++; sprite->oam.paletteNum = paletteNum; sprite->data[1] = fldEff; sprite->data[2] = gFieldEffectArguments[0]; sprite->data[3] = gFieldEffectArguments[1]; sprite->data[4] = gFieldEffectArguments[2]; } return spriteId; } void UpdateDisguiseFieldEffect(struct Sprite *sprite) { u8 objectEventId; const struct ObjectEventGraphicsInfo * graphicsInfo; struct Sprite *linkedSprite; if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[2], sprite->data[3], sprite->data[4], &objectEventId)) { FieldEffectStop(sprite, sprite->data[1]); } graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId]; sprite->invisible = linkedSprite->invisible; sprite->x = linkedSprite->x; sprite->y = (graphicsInfo->height >> 1) + linkedSprite->y - 16; sprite->subpriority = linkedSprite->subpriority - 1; if (sprite->data[0] == 1) { sprite->data[0]++; StartSpriteAnim(sprite, 1); } if (sprite->data[0] == 2 && sprite->animEnded) { sprite->data[7] = 1; } if (sprite->data[0] == 3) { FieldEffectStop(sprite, sprite->data[1]); } } void StartRevealDisguise(struct ObjectEvent * objectEvent) { if (objectEvent->directionSequenceIndex == 1) { gSprites[objectEvent->fieldEffectSpriteId].data[0]++; } } bool8 UpdateRevealDisguise(struct ObjectEvent * objectEvent) { struct Sprite *sprite; if (objectEvent->directionSequenceIndex == 2) { return TRUE; } if (objectEvent->directionSequenceIndex == 0) { return TRUE; } sprite = &gSprites[objectEvent->fieldEffectSpriteId]; if (sprite->data[7]) { objectEvent->directionSequenceIndex = 2; sprite->data[0]++; return TRUE; } return FALSE; } u32 FldEff_Sparkle(void) { u8 spriteId; gFieldEffectArguments[0] += 7; gFieldEffectArguments[1] += 7; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SMALL_SPARKLE], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = gFieldEffectArguments[2]; gSprites[spriteId].coordOffsetEnabled = TRUE; } return 0; } void UpdateSparkleFieldEffect(struct Sprite *sprite) { if (sprite->data[0] == 0) { if (sprite->animEnded) { sprite->invisible = TRUE; sprite->data[0]++; } if (sprite->data[0] == 0) return; } if (++sprite->data[1] > 34) FieldEffectStop(sprite, FLDEFF_SPARKLE); } void UpdateJumpImpactEffect(struct Sprite *sprite) { if (sprite->animEnded) { FieldEffectStop(sprite, sprite->data[1]); } else { UpdateObjectEventSpriteInvisibility(sprite, FALSE); SetObjectSubpriorityByElevation(sprite->data[0], sprite, 0); } } void WaitFieldEffectSpriteAnim(struct Sprite *sprite) { if (sprite->animEnded) FieldEffectStop(sprite, sprite->data[0]); else UpdateObjectEventSpriteInvisibility(sprite, FALSE); } static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 z, u8 offset) { u32 i; s16 var, xhi, lyhi, yhi, ylo; const struct ObjectEventGraphicsInfo * graphicsInfo; // Unused Variable struct Sprite *linkedSprite; SetObjectSubpriorityByElevation(z, sprite, offset); for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { struct ObjectEvent * objectEvent = &gObjectEvents[i]; if (objectEvent->active) { graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); linkedSprite = &gSprites[objectEvent->spriteId]; xhi = sprite->x + sprite->centerToCornerVecX; var = sprite->x - sprite->centerToCornerVecX; if (xhi < linkedSprite->x && var > linkedSprite->x) { lyhi = linkedSprite->y + linkedSprite->centerToCornerVecY; var = linkedSprite->y; ylo = sprite->y - sprite->centerToCornerVecY; yhi = ylo + linkedSprite->centerToCornerVecY; if ((lyhi < yhi || lyhi < ylo) && var > yhi && sprite->subpriority <= linkedSprite->subpriority) { sprite->subpriority = linkedSprite->subpriority + 2; break; } } } } } ================================================ FILE: src/field_fadetransition.c ================================================ #include "global.h" #include "gflib.h" #include "field_fadetransition.h" #include "overworld.h" #include "fldeff.h" #include "field_weather.h" #include "map_preview_screen.h" #include "field_player_avatar.h" #include "task.h" #include "script.h" #include "cable_club.h" #include "fieldmap.h" #include "metatile_behavior.h" #include "quest_log.h" #include "link.h" #include "event_object_movement.h" #include "field_door.h" #include "field_effect.h" #include "field_screen_effect.h" #include "field_specials.h" #include "event_object_lock.h" #include "start_menu.h" #include "constants/songs.h" #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/field_weather.h" static void ExitWarpFadeInScreen(u8 playerNotMoving); static void Task_ExitDoor(u8 taskId); static void Task_ExitNonAnimDoor(u8 taskId); static void Task_ExitNonDoor(u8 taskId); static void Task_TeleportWarpIn(u8 taskId); static void Task_Teleport2Warp(u8 taskId); static void Task_TeleportWarp(u8 taskId); static void Task_DoorWarp(u8 taskId); static void Task_StairWarp(u8 taskId); static void ForceStairsMovement(u16 metatileBehavior, s16 *x, s16 *y); static void GetStairsMovementDirection(u8 metatileBehavior, s16 *x, s16 *y); static void UpdateStairsMovement(s16 speedX, s16 speedY, s16 *offsetX, s16 *offsetY, s16 *timer); static void Task_ExitStairs(u8 taskId); static void ExitStairsMovement(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer); static bool8 WaitStairExitMovementFinished(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer); void palette_bg_faded_fill_white(void) { CpuFastFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); } void palette_bg_faded_fill_black(void) { CpuFastFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); } void WarpFadeInScreen(void) { switch (MapTransitionIsExit(GetLastUsedWarpMapType(), GetCurrentMapType())) { case FALSE: palette_bg_faded_fill_black(); FadeScreen(FADE_FROM_BLACK, 0); palette_bg_faded_fill_black(); break; case TRUE: palette_bg_faded_fill_white(); FadeScreen(FADE_FROM_WHITE, 0); palette_bg_faded_fill_white(); break; } } static void WarpFadeInScreenWithDelay(void) { switch (MapTransitionIsExit(GetLastUsedWarpMapType(), GetCurrentMapType())) { case FALSE: palette_bg_faded_fill_black(); FadeScreen(FADE_FROM_BLACK, 3); palette_bg_faded_fill_black(); break; case TRUE: palette_bg_faded_fill_white(); FadeScreen(FADE_FROM_WHITE, 3); palette_bg_faded_fill_white(); break; } } void FadeInFromBlack(void) { palette_bg_faded_fill_black(); FadeScreen(FADE_FROM_BLACK, 0); palette_bg_faded_fill_black(); } void WarpFadeOutScreen(void) { const struct MapHeader *header = GetDestinationWarpMapHeader(); if (header->regionMapSectionId != gMapHeader.regionMapSectionId && MapHasPreviewScreen(header->regionMapSectionId, MPS_TYPE_CAVE)) FadeScreen(FADE_TO_BLACK, 0); else { switch (MapTransitionIsEnter(GetCurrentMapType(), header->mapType)) { case FALSE: FadeScreen(FADE_TO_BLACK, 0); break; case TRUE: FadeScreen(FADE_TO_WHITE, 0); break; } } } static void WarpFadeOutScreenWithDelay(void) // Unused { switch (MapTransitionIsEnter(GetCurrentMapType(), GetDestinationWarpMapHeader()->mapType)) { case FALSE: FadeScreen(FADE_TO_BLACK, 3); break; case TRUE: FadeScreen(FADE_TO_WHITE, 3); break; } } static void SetPlayerVisibility(bool8 visible) { SetPlayerInvisibility(!visible); } static void Task_ContinueScriptUnionRoom(u8 taskId) { if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE) DestroyTask(taskId); } void FieldCB_ContinueScriptUnionRoom(void) { LockPlayerFieldControls(); Overworld_PlaySpecialMapMusic(); FadeInFromBlack(); CreateTask(Task_ContinueScriptUnionRoom, 10); } static void Task_ContinueScript(u8 taskId) { if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE) { DestroyTask(taskId); ScriptContext_Enable(); } } void FieldCB_ContinueScriptHandleMusic(void) { LockPlayerFieldControls(); Overworld_PlaySpecialMapMusic(); FadeInFromBlack(); CreateTask(Task_ContinueScript, 10); } void FieldCB_ContinueScript(void) { LockPlayerFieldControls(); FadeInFromBlack(); CreateTask(Task_ContinueScript, 10); } static void Task_ReturnToFieldCableLink(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: task->data[1] = CreateTask_ReestablishCableClubLink(); task->data[0]++; break; case 1: if (gTasks[task->data[1]].isActive != TRUE) { WarpFadeInScreen(); task->data[0]++; } break; case 2: if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE) { UnlockPlayerFieldControls(); DestroyTask(taskId); } break; } } void FieldCB_ReturnToFieldCableLink(void) { LockPlayerFieldControls(); Overworld_PlaySpecialMapMusic(); palette_bg_faded_fill_black(); CreateTask(Task_ReturnToFieldCableLink, 10); } static void Task_ReturnToFieldRecordMixing(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: SetLinkStandbyCallback(); task->data[0]++; break; case 1: if (IsLinkTaskFinished()) { WarpFadeInScreen(); task->data[0]++; } break; case 2: if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE) { StartSendingKeysToLink(); UnlockPlayerFieldControls(); DestroyTask(taskId); } break; } } void FieldCB_ReturnToFieldWirelessLink(void) { LockPlayerFieldControls(); Overworld_PlaySpecialMapMusic(); palette_bg_faded_fill_black(); CreateTask(Task_ReturnToFieldRecordMixing, 10); } static void SetUpWarpExitTask(bool8 playerNotMoving) { s16 x, y; u32 metatileBehavior; TaskFunc func; PlayerGetDestCoords(&x, &y); metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsWarpDoor_2(metatileBehavior) == TRUE) { func = Task_ExitDoor; switch (MapTransitionIsExit(GetLastUsedWarpMapType(), GetCurrentMapType())) { case FALSE: palette_bg_faded_fill_black(); break; case TRUE: palette_bg_faded_fill_white(); break; } } else { ExitWarpFadeInScreen(playerNotMoving); if (MetatileBehavior_IsNonAnimDoor(metatileBehavior) == TRUE) func = Task_ExitNonAnimDoor; else if (MetatileBehavior_IsDirectionalStairWarp(metatileBehavior) == TRUE) { u8 tmp = gExitStairsMovementDisabled; func = Task_ExitNonDoor; if (!tmp) func = Task_ExitStairs; } else func = Task_ExitNonDoor; } gExitStairsMovementDisabled = FALSE; CreateTask(func, 10); } static void ExitWarpFadeInScreen(bool8 playerNotMoving) { if (!playerNotMoving) WarpFadeInScreen(); else FadeInFromBlack(); } void FieldCB_DefaultWarpExit(void) { Overworld_PlaySpecialMapMusic(); QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); SetUpWarpExitTask(FALSE); LockPlayerFieldControls(); } void FieldCB_WarpExitFadeFromBlack(void) { Overworld_PlaySpecialMapMusic(); QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); SetUpWarpExitTask(TRUE); LockPlayerFieldControls(); } static void FieldCB_TeleportWarpIn(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); PlaySE(SE_WARP_OUT); CreateTask(Task_TeleportWarpIn, 10); LockPlayerFieldControls(); } static void Task_ExitDoor(u8 taskId) { struct Task *task = &gTasks[taskId]; s16 *x = &task->data[2]; s16 *y = &task->data[3]; if (task->data[0] == 0) task->data[0] = 5; switch (task->data[0]) { case 0: // Never reached SetPlayerVisibility(0); FreezeObjectEvents(); PlayerGetDestCoords(x, y); FieldSetDoorOpened(*x, *y); task->data[0] = 1; break; case 5: SetPlayerVisibility(0); FreezeObjectEvents(); DoOutwardBarnDoorWipe(); WarpFadeInScreenWithDelay(); task->data[0] = 6; break; case 6: task->data[15]++; if (task->data[15] == 25) { PlayerGetDestCoords(x, y); PlaySE(GetDoorSoundEffect(*x, *y)); FieldAnimateDoorOpen(*x, *y); task->data[0] = 7; } break; case 7: if (!FieldIsDoorAnimationRunning()) { PlayerGetDestCoords(&task->data[12], &task->data[13]); SetPlayerVisibility(TRUE); ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN); task->data[0] = 8; } break; case 8: task->data[14]++; if (task->data[14] == 14) { FieldAnimateDoorClose(task->data[12], task->data[13]); task->data[0] = 9; } break; case 9: if (FieldFadeTransitionBackgroundEffectIsFinished() && walkrun_is_standing_still() && !FieldIsDoorAnimationRunning() && !FuncIsActiveTask(Task_BarnDoorWipe)) { ObjectEventClearHeldMovementIfFinished(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]); task->data[0] = 4; } break; // Legacy RS case 1: if (FieldFadeTransitionBackgroundEffectIsFinished()) { SetPlayerVisibility(TRUE); ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN); task->data[0] = 2; } break; case 2: if (walkrun_is_standing_still()) { task->data[1] = FieldAnimateDoorClose(*x, *y); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]); task->data[0] = 3; } break; case 3: if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) task->data[0] = 4; break; case 4: UnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); break; } } static void Task_ExitNonAnimDoor(u8 taskId) { struct Task *task = &gTasks[taskId]; s16 *x = &task->data[2]; s16 *y = &task->data[3]; switch (task->data[0]) { case 0: SetPlayerVisibility(0); FreezeObjectEvents(); PlayerGetDestCoords(x, y); task->data[0] = 1; break; case 1: if (FieldFadeTransitionBackgroundEffectIsFinished()) { SetPlayerVisibility(TRUE); ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)], GetWalkNormalMovementAction(GetPlayerFacingDirection())); task->data[0] = 2; } break; case 2: if (walkrun_is_standing_still()) { task->data[0] = 3; } break; case 3: UnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); break; } } static void Task_ExitNonDoor(u8 taskId) { switch (gTasks[taskId].data[0]) { case 0: FreezeObjectEvents(); LockPlayerFieldControls(); gTasks[taskId].data[0]++; break; case 1: if (FieldFadeTransitionBackgroundEffectIsFinished()) { UnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); } break; } } static void Task_TeleportWarpIn(u8 taskId) { switch (gTasks[taskId].data[0]) { case 0: FreezeObjectEvents(); LockPlayerFieldControls(); StartTeleportInPlayerAnim(); gTasks[taskId].data[0]++; break; case 1: if (FieldFadeTransitionBackgroundEffectIsFinished() && WaitTeleportInPlayerAnim() != TRUE) { UnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); } break; } } static void Task_WaitFadeAndCreateStartMenuTask(u8 taskId) { if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE) { DestroyTask(taskId); CreateTask(Task_StartMenuHandleInput, 80); } } void FadeTransition_FadeInOnReturnToStartMenu(void) { FadeInFromBlack(); CreateTask(Task_WaitFadeAndCreateStartMenuTask, 80); LockPlayerFieldControls(); } bool8 FieldCB_ReturnToFieldOpenStartMenu(void) { SetUpReturnToStartMenu(); return FALSE; } static void Task_SafariZoneRanOutOfBalls(u8 taskId) { if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE) { UnlockPlayerFieldControls(); DestroyTask(taskId); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); } } void FieldCB_SafariZoneRanOutOfBalls(void) { LockPlayerFieldControls(); Overworld_PlaySpecialMapMusic(); FadeInFromBlack(); CreateTask(Task_SafariZoneRanOutOfBalls, 10); } static bool32 WaitWarpFadeOutScreen(void) { return gPaletteFade.active; } bool32 FieldFadeTransitionBackgroundEffectIsFinished(void) { if (IsWeatherNotFadingIn() == TRUE && ForestMapPreviewScreenIsRunning()) return TRUE; else return FALSE; } void DoWarp(void) { LockPlayerFieldControls(); TryFadeOutOldMapMusic(); WarpFadeOutScreen(); PlayRainStoppingSoundEffect(); PlaySE(SE_EXIT); gFieldCallback = FieldCB_DefaultWarpExit; CreateTask(Task_Teleport2Warp, 10); } void DoDiveWarp(void) { LockPlayerFieldControls(); TryFadeOutOldMapMusic(); WarpFadeOutScreen(); PlayRainStoppingSoundEffect(); gFieldCallback = FieldCB_DefaultWarpExit; CreateTask(Task_Teleport2Warp, 10); } void DoStairWarp(u16 metatileBehavior, u16 delay) { u8 taskId = CreateTask(Task_StairWarp, 10); gTasks[taskId].data[1] = metatileBehavior; gTasks[taskId].data[15] = delay; Task_StairWarp(taskId); } void DoDoorWarp(void) { LockPlayerFieldControls(); gFieldCallback = FieldCB_DefaultWarpExit; CreateTask(Task_DoorWarp, 10); } void DoTeleport2Warp(void) { LockPlayerFieldControls(); CreateTask(Task_Teleport2Warp, 10); gFieldCallback = FieldCB_TeleportWarpIn; } void DoUnionRoomWarp(void) { LockPlayerFieldControls(); gFieldCallback = FieldCB_DefaultWarpExit; CreateTask(Task_TeleportWarp, 10); } void DoFallWarp(void) { DoDiveWarp(); gFieldCallback = FieldCB_FallWarpExit; } void DoEscalatorWarp(u8 metatileBehavior) { LockPlayerFieldControls(); StartEscalatorWarp(metatileBehavior, 10); } void DoLavaridgeGymB1FWarp(void) { LockPlayerFieldControls(); StartLavaridgeGymB1FWarp(10); } void DoLavaridgeGym1FWarp(void) { LockPlayerFieldControls(); StartLavaridgeGym1FWarp(10); } void DoTeleportWarp(void) { LockPlayerFieldControls(); TryFadeOutOldMapMusic(); CreateTask(Task_TeleportWarp, 10); gFieldCallback = FieldCB_TeleportWarpIn; } static void DoPortholeWarp(void) // Unused { LockPlayerFieldControls(); WarpFadeOutScreen(); CreateTask(Task_Teleport2Warp, 10); gFieldCallback = FieldCB_ShowPortholeView; } static void Task_CableClubWarp(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: LockPlayerFieldControls(); task->data[0]++; break; case 1: if (!WaitWarpFadeOutScreen() && BGMusicStopped()) task->data[0]++; break; case 2: WarpIntoMap(); SetMainCallback2(CB2_ReturnToFieldCableClub); DestroyTask(taskId); break; } } void DoCableClubWarp(void) { LockPlayerFieldControls(); TryFadeOutOldMapMusic(); WarpFadeOutScreen(); PlaySE(SE_EXIT); CreateTask(Task_CableClubWarp, 10); } static void Task_ReturnFromLinkRoomWarp(u8 taskId) { s16 *data = gTasks[taskId].data; switch (data[0]) { case 0: ClearLinkCallback_2(); FadeScreen(FADE_TO_BLACK, 0); TryFadeOutOldMapMusic(); PlaySE(SE_EXIT); data[0]++; break; case 1: if (!WaitWarpFadeOutScreen() && BGMusicStopped()) { SetCloseLinkCallback(); data[0]++; } break; case 2: if (!gReceivedRemoteLinkPlayers) { WarpIntoMap(); SetMainCallback2(CB2_LoadMap); DestroyTask(taskId); } break; } } void ReturnFromLinkRoom(void) { CreateTask(Task_ReturnFromLinkRoomWarp, 10); } static void Task_Teleport2Warp(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: FreezeObjectEvents(); LockPlayerFieldControls(); task->data[0]++; break; case 1: if (!WaitWarpFadeOutScreen() && BGMusicStopped()) task->data[0]++; break; case 2: WarpIntoMap(); SetMainCallback2(CB2_LoadMap); DestroyTask(taskId); break; } } static void Task_TeleportWarp(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: FreezeObjectEvents(); LockPlayerFieldControls(); PlaySE(SE_WARP_IN); StartTeleportWarpOutPlayerAnim(); task->data[0]++; break; case 1: if (!WaitTeleportWarpOutPlayerAnim()) { WarpFadeOutScreen(); task->data[0]++; } break; case 2: if (!WaitWarpFadeOutScreen() && BGMusicStopped()) task->data[0]++; break; case 3: WarpIntoMap(); SetMainCallback2(CB2_LoadMap); DestroyTask(taskId); break; } } static void Task_DoorWarp(u8 taskId) { struct Task *task = &gTasks[taskId]; s16 *xp = &task->data[2]; s16 *yp = &task->data[3]; switch (task->data[0]) { case 0: FreezeObjectEvents(); PlayerGetDestCoords(xp, yp); PlaySE(GetDoorSoundEffect(*xp, *yp - 1)); task->data[1] = FieldAnimateDoorOpen(*xp, *yp - 1); task->data[0] = 1; break; case 1: if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) { ObjectEventClearHeldMovementIfActive(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]); ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_UP); task->data[0] = 2; } break; case 2: if (walkrun_is_standing_still()) { task->data[1] = FieldAnimateDoorClose(*xp, *yp - 1); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]); SetPlayerVisibility(FALSE); task->data[0] = 3; } break; case 3: if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) task->data[0] = 4; break; case 4: TryFadeOutOldMapMusic(); WarpFadeOutScreen(); PlayRainStoppingSoundEffect(); task->data[0] = 0; task->func = Task_Teleport2Warp; break; case 5: TryFadeOutOldMapMusic(); PlayRainStoppingSoundEffect(); task->data[0] = 0; task->func = Task_Teleport2Warp; break; } } static void Task_StairWarp(u8 taskId) { s16 *data = gTasks[taskId].data; struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *playerSpr = &gSprites[gPlayerAvatar.spriteId]; switch (data[0]) { case 0: LockPlayerFieldControls(); FreezeObjectEvents(); CameraObjectReset2(); data[0]++; break; case 1: if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj)) { if (data[15] != 0) data[15]--; else { TryFadeOutOldMapMusic(); PlayRainStoppingSoundEffect(); playerSpr->oam.priority = 1; ForceStairsMovement(data[1], &data[2], &data[3]); PlaySE(SE_EXIT); data[0]++; } } break; case 2: UpdateStairsMovement(data[2], data[3], &data[4], &data[5], &data[6]); data[15]++; if (data[15] >= 12) { WarpFadeOutScreen(); data[0]++; } break; case 3: UpdateStairsMovement(data[2], data[3], &data[4], &data[5], &data[6]); if (!WaitWarpFadeOutScreen() && BGMusicStopped()) data[0]++; break; default: gFieldCallback = FieldCB_DefaultWarpExit; WarpIntoMap(); SetMainCallback2(CB2_LoadMap); DestroyTask(taskId); break; } } static void UpdateStairsMovement(s16 speedX, s16 speedY, s16 *offsetX, s16 *offsetY, s16 *timer) { struct Sprite *playerSpr = &gSprites[gPlayerAvatar.spriteId]; struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; if (speedY > 0 || *timer > 6) *offsetY += speedY; *offsetX += speedX; (*timer)++; playerSpr->x2 = *offsetX >> 5; playerSpr->y2 = *offsetY >> 5; if (playerObj->heldMovementFinished) ObjectEventForceSetHeldMovement(playerObj, GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection())); } static void ForceStairsMovement(u16 metatileBehavior, s16 *x, s16 *y) { ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection())); GetStairsMovementDirection(metatileBehavior, x, y); } static void GetStairsMovementDirection(u8 metatileBehavior, s16 *x, s16 *y) { if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior)) { *x = 16; *y = -10; } else if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior)) { *x = -17; *y = -10; } else if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior)) { *x = 17; *y = 3; } else if (MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior)) { *x = -17; *y = 3; } else { *x = 0; *y = 0; } } static void Task_ExitStairs(u8 taskId) { s16 *data = gTasks[taskId].data; switch (data[0]) { default: if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE) { CameraObjectReset1(); UnlockPlayerFieldControls(); DestroyTask(taskId); } break; case 0: Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); LockPlayerFieldControls(); ExitStairsMovement(&data[1], &data[2], &data[3], &data[4], &data[5]); data[0]++; break; case 1: if (!WaitStairExitMovementFinished(&data[1], &data[2], &data[3], &data[4], &data[5])) data[0]++; break; } } static void ExitStairsMovement(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer) { s16 x, y; u8 metatileBehavior; s32 direction; struct Sprite *sprite; PlayerGetDestCoords(&x, &y); metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior) || MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior)) direction = DIR_WEST; else direction = DIR_EAST; ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetWalkInPlaceFastMovementAction(direction)); GetStairsMovementDirection(metatileBehavior, speedX, speedY); *offsetX = *speedX * 16; *offsetY = *speedY * 16; *timer = 16; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->x2 = *offsetX >> 5; sprite->y2 = *offsetY >> 5; *speedX *= -1; *speedY *= -1; } static bool8 WaitStairExitMovementFinished(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer) { struct Sprite *sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; if (*timer != 0) { *offsetX += *speedX; *offsetY += *speedY; sprite->x2 = *offsetX >> 5; sprite->y2 = *offsetY >> 5; (*timer)--; return TRUE; } else { sprite->x2 = 0; sprite->y2 = 0; return FALSE; } } ================================================ FILE: src/field_message_box.c ================================================ #include "global.h" #include "field_message_box.h" #include "gflib.h" #include "new_menu_helpers.h" #include "quest_log.h" #include "script.h" #include "text_window.h" static EWRAM_DATA u8 sMessageBoxType = 0; static void ExpandStringAndStartDrawFieldMessageBox(const u8 *str); static void StartDrawFieldMessageBox(void); void InitFieldMessageBox(void) { sMessageBoxType = FIELD_MESSAGE_BOX_HIDDEN; gTextFlags.canABSpeedUpPrint = FALSE; gTextFlags.useAlternateDownArrow = FALSE; gTextFlags.autoScroll = FALSE; } static void Task_DrawFieldMessageBox(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: if (gQuestLogState == QL_STATE_PLAYBACK) { gTextFlags.autoScroll = TRUE; LoadQuestLogWindowTiles(0, 0x200); } else if (!IsMsgSignpost()) LoadStdWindowFrameGfx(); else LoadSignpostWindowFrameGfx(); task->data[0]++; break; case 1: DrawDialogueFrame(0, TRUE); task->data[0]++; break; case 2: if (RunTextPrinters_CheckPrinter0Active() != TRUE) { sMessageBoxType = FIELD_MESSAGE_BOX_HIDDEN; DestroyTask(taskId); } break; } } static void CreateTask_DrawFieldMessageBox(void) { CreateTask(Task_DrawFieldMessageBox, 80); } static void DestroyTask_DrawFieldMessageBox(void) { u8 taskId = FindTaskIdByFunc(Task_DrawFieldMessageBox); if (taskId != 0xFF) DestroyTask(taskId); } bool8 ShowFieldMessage(const u8 *str) { if (sMessageBoxType != FIELD_MESSAGE_BOX_HIDDEN) return FALSE; ExpandStringAndStartDrawFieldMessageBox(str); sMessageBoxType = FIELD_MESSAGE_BOX_NORMAL; return TRUE; } bool8 ShowFieldAutoScrollMessage(const u8 *str) { if (sMessageBoxType != FIELD_MESSAGE_BOX_HIDDEN) return FALSE; sMessageBoxType = FIELD_MESSAGE_BOX_AUTO_SCROLL; ExpandStringAndStartDrawFieldMessageBox(str); return TRUE; } // Unused static bool8 ForceShowFieldAutoScrollMessage(const u8 *str) { sMessageBoxType = FIELD_MESSAGE_BOX_AUTO_SCROLL; ExpandStringAndStartDrawFieldMessageBox(str); return TRUE; } // Unused // Same as ShowFieldMessage, but instead of accepting a string argument, // it just prints whatever that's already in gStringVar4 static bool8 ShowFieldMessageFromBuffer(void) { if (sMessageBoxType != FIELD_MESSAGE_BOX_HIDDEN) return FALSE; sMessageBoxType = FIELD_MESSAGE_BOX_NORMAL; StartDrawFieldMessageBox(); return TRUE; } static void ExpandStringAndStartDrawFieldMessageBox(const u8 *str) { StringExpandPlaceholders(gStringVar4, str); AddTextPrinterDiffStyle(TRUE); CreateTask_DrawFieldMessageBox(); } static void StartDrawFieldMessageBox(void) { AddTextPrinterDiffStyle(TRUE); CreateTask_DrawFieldMessageBox(); } void HideFieldMessageBox(void) { DestroyTask_DrawFieldMessageBox(); ClearDialogWindowAndFrame(0, TRUE); sMessageBoxType = FIELD_MESSAGE_BOX_HIDDEN; } u8 GetFieldMessageBoxType(void) { return sMessageBoxType; } bool8 IsFieldMessageBoxHidden(void) { if (sMessageBoxType == FIELD_MESSAGE_BOX_HIDDEN) return TRUE; else return FALSE; } // Unused static void ReplaceFieldMessageWithFrame(void) { DestroyTask_DrawFieldMessageBox(); DrawStdWindowFrame(0, TRUE); sMessageBoxType = FIELD_MESSAGE_BOX_HIDDEN; } ================================================ FILE: src/field_player_avatar.c ================================================ #include "global.h" #include "gflib.h" #include "bike.h" #include "event_data.h" #include "event_object_movement.h" #include "fieldmap.h" #include "field_camera.h" #include "field_control_avatar.h" #include "field_effect.h" #include "field_effect_helpers.h" #include "field_player_avatar.h" #include "help_system.h" #include "metatile_behavior.h" #include "new_menu_helpers.h" #include "overworld.h" #include "party_menu.h" #include "quest_log.h" #include "quest_log_player.h" #include "random.h" #include "script.h" #include "strings.h" #include "wild_encounter.h" #include "constants/abilities.h" #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/songs.h" #include "constants/metatile_behaviors.h" #include "constants/moves.h" #include "constants/trainer_types.h" static EWRAM_DATA struct ObjectEvent * sPlayerObjectPtr = NULL; static EWRAM_DATA u8 sTeleportSavedFacingDirection = DIR_NONE; EWRAM_DATA struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT] = {}; EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {}; static u8 ObjectEventCB2_NoMovement2(struct ObjectEvent * object, struct Sprite *sprite); static bool8 TryUpdatePlayerSpinDirection(void); static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent * playerObjEvent, u8 direction); static void npc_clear_strange_bits(struct ObjectEvent * playerObjEvent); static bool8 TryDoMetatileBehaviorForcedMovement(void); static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys); static void PlayerAllowForcedMovementIfMovingSameDirection(void); static bool8 ForcedMovement_None(void); static bool8 ForcedMovement_Slip(void); static bool8 ForcedMovement_WalkSouth(void); static bool8 ForcedMovement_WalkNorth(void); static bool8 ForcedMovement_WalkWest(void); static bool8 ForcedMovement_WalkEast(void); static bool8 ForcedMovement_SpinRight(void); static bool8 ForcedMovement_SpinLeft(void); static bool8 ForcedMovement_SpinUp(void); static bool8 ForcedMovement_SpinDown(void); static void PlaySpinSound(void); static bool8 ForcedMovement_PushedSouthByCurrent(void); static bool8 ForcedMovement_PushedNorthByCurrent(void); static bool8 ForcedMovement_PushedWestByCurrent(void); static bool8 ForcedMovement_PushedEastByCurrent(void); static bool8 ForcedMovement_SlideSouth(void); static bool8 ForcedMovement_SlideNorth(void); static bool8 ForcedMovement_SlideWest(void); static bool8 ForcedMovement_SlideEast(void); static bool8 ForcedMovement_MatJump(void); static bool8 ForcedMovement_MatSpin(void); static u8 CheckMovementInputNotOnBike(u8 direction); static void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys); static void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys); static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys); static u8 CheckForPlayerAvatarCollision(u8 direction); static bool8 CanStopSurfing(s16 x, s16 y, u8 direction); static bool8 ShouldJumpLedge(s16 x, s16 y, u8 direction); static bool8 TryPushBoulder(s16 x, s16 y, u8 direction); static void CheckAcroBikeCollision(s16 x, s16 y, u8 metatileBehavior, u8 *collision); static void DoPlayerAvatarTransition(void); static void PlayerAvatarTransition_Dummy(struct ObjectEvent * playerObject); static void PlayerAvatarTransition_Normal(struct ObjectEvent * playerObject); static void PlayerAvatarTransition_Bike(struct ObjectEvent * playerObject); static void PlayerAvatarTransition_Surfing(struct ObjectEvent * playerObject); static void PlayerAvatarTransition_Underwater(struct ObjectEvent * playerObject); static void PlayerAvatarTransition_ReturnToField(struct ObjectEvent * playerObject); static bool8 PlayerIsAnimActive(void); static bool8 PlayerCheckIfAnimFinishedOrInactive(void); static bool8 PlayerAnimIsMultiFrameStationary(void); static bool8 PlayerAnimIsMultiFrameStationaryAndStateNotTurning(void); static void PlayCollisionSoundIfNotFacingWarp(u8 direction); static void PlayerGoSpin(u8 direction); static void PlayerApplyTileForcedMovement(u8 metatileBehavior); static bool8 MetatileAtCoordsIsWaterTile(s16 x, s16 y); static void HandleWarpArrowSpriteHideShow(struct ObjectEvent * playerObjEvent); static void StartStrengthAnim(u8 objectEventId, u8 direction); static void Task_BumpBoulder(u8 taskId); static bool8 DoBoulderInit(struct Task *task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj); static bool8 DoBoulderDust(struct Task *task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj); static bool8 DoBoulderFinish(struct Task *task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj); static void DoPlayerMatJump(void); static void DoPlayerAvatarSecretBaseMatJump(u8 taskId); static bool8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct ObjectEvent * playerObj); static void DoPlayerMatSpin(void); static void PlayerAvatar_DoSecretBaseMatSpin(u8 taskId); static bool8 PlayerAvatar_SecretBaseMatSpinStep0(struct Task *task, struct ObjectEvent * playerObj); static bool8 PlayerAvatar_SecretBaseMatSpinStep1(struct Task *task, struct ObjectEvent * playerObj); static bool8 PlayerAvatar_SecretBaseMatSpinStep2(struct Task *task, struct ObjectEvent * playerObj); static bool8 PlayerAvatar_SecretBaseMatSpinStep3(struct Task *task, struct ObjectEvent * playerObj); static void CreateStopSurfingTask(u8 direction); static void Task_StopSurfingInit(u8 taskId); static void Task_WaitStopSurfing(u8 taskId); static void Task_Fishing(u8 taskId); static bool8 Fishing1(struct Task *task); static bool8 Fishing2(struct Task *task); static bool8 Fishing3(struct Task *task); static bool8 Fishing4(struct Task *task); static bool8 Fishing5(struct Task *task); static bool8 Fishing6(struct Task *task); static bool8 Fishing7(struct Task *task); static bool8 Fishing8(struct Task *task); static bool8 Fishing9(struct Task *task); static bool8 Fishing10(struct Task *task); static bool8 Fishing11(struct Task *task); static bool8 Fishing12(struct Task *task); static bool8 Fishing13(struct Task *task); static bool8 Fishing14(struct Task *task); static bool8 Fishing15(struct Task *task); static bool8 Fishing16(struct Task *task); static void Task_TeleportWarpOutPlayerAnim(u8 taskId); static void Task_TeleportWarpInPlayerAnim(u8 taskId); static u8 TeleportAnim_RotatePlayer(struct ObjectEvent * object, s16 *timer); void MovementType_Player(struct Sprite *sprite) { UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, ObjectEventCB2_NoMovement2); } static u8 ObjectEventCB2_NoMovement2(struct ObjectEvent * object, struct Sprite *sprite) { return 0; } void player_step(u8 direction, u16 newKeys, u16 heldKeys) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; HandleWarpArrowSpriteHideShow(playerObjEvent); if (!gPlayerAvatar.preventStep && !TryUpdatePlayerSpinDirection()) { if (!TryInterruptObjectEventSpecialAnim(playerObjEvent, direction)) { npc_clear_strange_bits(playerObjEvent); DoPlayerAvatarTransition(); if (!TryDoMetatileBehaviorForcedMovement()) { MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys); PlayerAllowForcedMovementIfMovingSameDirection(); } } } } static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEvent, u8 direction) { if (ObjectEventIsMovementOverridden(playerObjEvent) && !ObjectEventClearHeldMovementIfFinished(playerObjEvent)) { u8 heldMovementActionId = ObjectEventGetHeldMovementActionId(playerObjEvent); if (heldMovementActionId > MOVEMENT_ACTION_WALK_FAST_RIGHT && heldMovementActionId < MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN) { if (direction != DIR_NONE && playerObjEvent->movementDirection != direction) { ObjectEventClearHeldMovement(playerObjEvent); return FALSE; } } return TRUE; } return FALSE; } static void npc_clear_strange_bits(struct ObjectEvent *objEvent) { objEvent->inanimate = FALSE; objEvent->disableAnim = FALSE; objEvent->facingDirectionLocked = FALSE; gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_DASH; } static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys) { if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) || (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)) MovePlayerOnBike(direction, newKeys, heldKeys); else MovePlayerNotOnBike(direction, heldKeys); } static void PlayerAllowForcedMovementIfMovingSameDirection(void) { if (gPlayerAvatar.runningState == MOVING) gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_CONTROLLABLE; } static bool8 TryUpdatePlayerSpinDirection(void) { if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) && MetatileBehavior_IsSpinTile(gPlayerAvatar.lastSpinTile)) { sPlayerObjectPtr = &gObjectEvents[gPlayerAvatar.objectEventId]; if (sPlayerObjectPtr->heldMovementFinished) { if (MetatileBehavior_IsStopSpinning(sPlayerObjectPtr->currentMetatileBehavior)) { return FALSE; } if (MetatileBehavior_IsSpinTile(sPlayerObjectPtr->currentMetatileBehavior)) { gPlayerAvatar.lastSpinTile = sPlayerObjectPtr->currentMetatileBehavior; } ObjectEventClearHeldMovement(sPlayerObjectPtr); PlayerApplyTileForcedMovement(gPlayerAvatar.lastSpinTile); } return TRUE; } return FALSE; } static const struct { bool8 (*check)(u8 metatileBehavior); bool8 (*apply)(void); } sForcedMovementFuncs[] = { {MetatileBehavior_IsTrickHouseSlipperyFloor, ForcedMovement_Slip}, {MetatileBehavior_IsIce_2, ForcedMovement_Slip}, {MetatileBehavior_IsWalkSouth, ForcedMovement_WalkSouth}, {MetatileBehavior_IsWalkNorth, ForcedMovement_WalkNorth}, {MetatileBehavior_IsWalkWest, ForcedMovement_WalkWest}, {MetatileBehavior_IsWalkEast, ForcedMovement_WalkEast}, {MetatileBehavior_IsSouthwardCurrent, ForcedMovement_PushedSouthByCurrent}, {MetatileBehavior_IsNorthwardCurrent, ForcedMovement_PushedNorthByCurrent}, {MetatileBehavior_IsWestwardCurrent, ForcedMovement_PushedWestByCurrent}, {MetatileBehavior_IsEastwardCurrent, ForcedMovement_PushedEastByCurrent}, {MetatileBehavior_IsSpinRight, ForcedMovement_SpinRight}, {MetatileBehavior_IsSpinLeft, ForcedMovement_SpinLeft}, {MetatileBehavior_IsSpinUp, ForcedMovement_SpinUp}, {MetatileBehavior_IsSpinDown, ForcedMovement_SpinDown}, {MetatileBehavior_IsSlideSouth, ForcedMovement_SlideSouth}, {MetatileBehavior_IsSlideNorth, ForcedMovement_SlideNorth}, {MetatileBehavior_IsSlideWest, ForcedMovement_SlideWest}, {MetatileBehavior_IsSlideEast, ForcedMovement_SlideEast}, {MetatileBehavior_IsWaterfall, ForcedMovement_PushedSouthByCurrent}, {MetatileBehavior_IsSecretBaseJumpMat, ForcedMovement_MatJump}, {MetatileBehavior_IsSecretBaseSpinMat, ForcedMovement_MatSpin}, {NULL, ForcedMovement_None}, }; static bool8 TryDoMetatileBehaviorForcedMovement(void) { int i; u8 behavior; if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_CONTROLLABLE)) { behavior = gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior; for (i = 0; sForcedMovementFuncs[i].check != NULL; i++) { if (sForcedMovementFuncs[i].check(behavior)) { gPlayerAvatar.lastSpinTile = behavior; return sForcedMovementFuncs[i].apply(); } } return sForcedMovementFuncs[i].apply(); } else { // Calls ForcedMovement_None but with extra steps for (i = 0; sForcedMovementFuncs[i].check != NULL; i++) ; return sForcedMovementFuncs[i].apply(); } } static bool8 ForcedMovement_None(void) { if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; playerObjEvent->facingDirectionLocked = FALSE; playerObjEvent->enableAnim = TRUE; SetObjectEventDirection(playerObjEvent, playerObjEvent->facingDirection); gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_FORCED; } return FALSE; } static u8 DoForcedMovement(u8 direction, MovementAction movementAction) { struct PlayerAvatar *playerAvatar = &gPlayerAvatar; u8 collision = CheckForPlayerAvatarCollision(direction); playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED; if (collision) { ForcedMovement_None(); if (collision < COLLISION_STOP_SURFING) { return 0; } else { if (collision == COLLISION_LEDGE_JUMP) PlayerJumpLedge(direction); playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED; playerAvatar->runningState = MOVING; return 1; } } else { playerAvatar->runningState = MOVING; movementAction(direction); return 1; } } static u8 DoForcedMovementInCurrentDirection(MovementAction movementAction) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; playerObjEvent->disableAnim = TRUE; return DoForcedMovement(playerObjEvent->movementDirection, movementAction); } static bool8 ForcedMovement_Slip(void) { return DoForcedMovementInCurrentDirection(PlayerWalkFast); } static bool8 ForcedMovement_WalkSouth(void) { return DoForcedMovement(DIR_SOUTH, PlayerWalkNormal); } static bool8 ForcedMovement_WalkNorth(void) { return DoForcedMovement(DIR_NORTH, PlayerWalkNormal); } static bool8 ForcedMovement_WalkWest(void) { return DoForcedMovement(DIR_WEST, PlayerWalkNormal); } static bool8 ForcedMovement_WalkEast(void) { return DoForcedMovement(DIR_EAST, PlayerWalkNormal); } static bool8 ForcedMovement_SpinRight(void) { PlaySpinSound(); return DoForcedMovement(DIR_EAST, PlayerGoSpin); } static bool8 ForcedMovement_SpinLeft(void) { PlaySpinSound(); return DoForcedMovement(DIR_WEST, PlayerGoSpin); } static bool8 ForcedMovement_SpinUp(void) { PlaySpinSound(); return DoForcedMovement(DIR_NORTH, PlayerGoSpin); } static bool8 ForcedMovement_SpinDown(void) { PlaySpinSound(); return DoForcedMovement(DIR_SOUTH, PlayerGoSpin); } static void PlaySpinSound(void) { PlaySE(SE_M_RAZOR_WIND2); } static bool8 ForcedMovement_PushedSouthByCurrent(void) { return DoForcedMovement(DIR_SOUTH, PlayerRideWaterCurrent); } static bool8 ForcedMovement_PushedNorthByCurrent(void) { return DoForcedMovement(DIR_NORTH, PlayerRideWaterCurrent); } static bool8 ForcedMovement_PushedWestByCurrent(void) { return DoForcedMovement(DIR_WEST, PlayerRideWaterCurrent); } static bool8 ForcedMovement_PushedEastByCurrent(void) { return DoForcedMovement(DIR_EAST, PlayerRideWaterCurrent); } static u8 ForcedMovement_Slide(u8 direction, MovementAction movementAction) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; playerObjEvent->disableAnim = TRUE; playerObjEvent->facingDirectionLocked = TRUE; return DoForcedMovement(direction, movementAction); } static bool8 ForcedMovement_SlideSouth(void) { return ForcedMovement_Slide(DIR_SOUTH, PlayerWalkFast); } static bool8 ForcedMovement_SlideNorth(void) { return ForcedMovement_Slide(DIR_NORTH, PlayerWalkFast); } static bool8 ForcedMovement_SlideWest(void) { return ForcedMovement_Slide(DIR_WEST, PlayerWalkFast); } static bool8 ForcedMovement_SlideEast(void) { return ForcedMovement_Slide(DIR_EAST, PlayerWalkFast); } static bool8 ForcedMovement_MatJump(void) { DoPlayerMatJump(); return TRUE; } static bool8 ForcedMovement_MatSpin(void) { DoPlayerMatSpin(); return TRUE; } static void (*const sPlayerNotOnBikeFuncs[])(u8, u16) = { PlayerNotOnBikeNotMoving, PlayerNotOnBikeTurningInPlace, PlayerNotOnBikeMoving }; void MovePlayerNotOnBike(u8 direction, u16 heldKeys) { sPlayerNotOnBikeFuncs[CheckMovementInputNotOnBike(direction)](direction, heldKeys); } static u8 CheckMovementInputNotOnBike(u8 direction) { if (direction == DIR_NONE) { gPlayerAvatar.runningState = NOT_MOVING; return 0; } else if (direction != GetPlayerMovementDirection() && gPlayerAvatar.runningState != MOVING) { gPlayerAvatar.runningState = TURN_DIRECTION; return 1; } else { gPlayerAvatar.runningState = MOVING; return 2; } } static void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys) { PlayerFaceDirection(GetPlayerFacingDirection()); } static void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys) { PlayerTurnInPlace(direction); } static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) { u8 collision = CheckForPlayerAvatarCollision(direction); if (collision != COLLISION_NONE) { if (collision == COLLISION_LEDGE_JUMP) { PlayerJumpLedge(direction); } else if (collision == COLLISION_DIRECTIONAL_STAIR_WARP) { PlayerFaceDirection(direction); } else if (collision != COLLISION_STOP_SURFING && collision != COLLISION_LEDGE_JUMP && collision != COLLISION_PUSHED_BOULDER && collision != COLLISION_DIRECTIONAL_STAIR_WARP) { PlayerNotOnBikeCollide(direction); } return; } if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)) { if(FlagGet(FLAG_AUTO_RUN_TOGGLED)) { if(heldKeys & B_BUTTON) // speed 2 is fast, same speed as running PlayerWalkFast(direction); else PlayerWalkFaster(direction); } else { if(heldKeys & B_BUTTON) PlayerWalkFaster(direction); else // speed 2 is fast, same speed as running PlayerWalkFast(direction); } return; } if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER) { // Same speed as running PlayerWalkFast(direction); return; } if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER) && (heldKeys & B_BUTTON || FlagGet(FLAG_AUTO_RUN_TOGGLED)) && !IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior)) { //if running if (PlayerIsMovingOnRockStairs(direction)) { if(heldKeys & B_BUTTON && FlagGet(FLAG_AUTO_RUN_TOGGLED)) { //autorun toggled but B pressed, walk PlayerWalkSlow(direction); } else { PlayerRunSlow(direction); gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; } } else { if(heldKeys & B_BUTTON && FlagGet(FLAG_AUTO_RUN_TOGGLED)) { //autorun toggled but B pressed, walk PlayerWalkNormal(direction); } else { PlayerRun(direction); gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; } } return; } else { if (PlayerIsMovingOnRockStairs(direction)) PlayerWalkSlow(direction); else PlayerWalkNormal(direction); } } bool32 PlayerIsMovingOnRockStairs(u8 direction) { struct ObjectEvent * objectEvent; s16 x, y; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; switch (direction) { case DIR_NORTH: return MetatileBehavior_IsRockStairs(MapGridGetMetatileBehaviorAt(x, y)); case DIR_SOUTH: MoveCoords(DIR_SOUTH, &x, &y); return MetatileBehavior_IsRockStairs(MapGridGetMetatileBehaviorAt(x, y)); default: return FALSE; } } static u8 CheckForPlayerAvatarCollision(u8 direction) { s16 x, y; struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; x = playerObjEvent->currentCoords.x; y = playerObjEvent->currentCoords.y; if (IsDirectionalStairWarpMetatileBehavior(MapGridGetMetatileBehaviorAt(x, y), direction)) return COLLISION_DIRECTIONAL_STAIR_WARP; MoveCoords(direction, &x, &y); return CheckForObjectEventCollision(playerObjEvent, x, y, direction, MapGridGetMetatileBehaviorAt(x, y)); } u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction, u8 metatileBehavior) { u8 collision = GetCollisionAtCoords(objectEvent, x, y, direction); if (collision == COLLISION_ELEVATION_MISMATCH && CanStopSurfing(x, y, direction)) return COLLISION_STOP_SURFING; if (ShouldJumpLedge(x, y, direction)) { IncrementGameStat(GAME_STAT_JUMPED_DOWN_LEDGES); return COLLISION_LEDGE_JUMP; } if (collision == COLLISION_OBJECT_EVENT && TryPushBoulder(x, y, direction)) return COLLISION_PUSHED_BOULDER; if (collision == COLLISION_NONE) { CheckAcroBikeCollision(x, y, metatileBehavior, &collision); } return collision; } static const u8 sQuestLogSurfDismountActionIds[] = { QL_PLAYER_GFX_STOP_SURF_S, QL_PLAYER_GFX_STOP_SURF_S, QL_PLAYER_GFX_STOP_SURF_N, QL_PLAYER_GFX_STOP_SURF_W, QL_PLAYER_GFX_STOP_SURF_E }; static bool8 CanStopSurfing(s16 x, s16 y, u8 direction) { if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) && MapGridGetElevationAt(x, y) == 3 && GetObjectEventIdByPosition(x, y, 3) == OBJECT_EVENTS_COUNT) { QuestLogRecordPlayerAvatarGfxTransitionWithDuration(sQuestLogSurfDismountActionIds[direction], 16); CreateStopSurfingTask(direction); return TRUE; } else { return FALSE; } } static bool8 ShouldJumpLedge(s16 x, s16 y, u8 direction) { if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) return TRUE; else return FALSE; } static bool8 TryPushBoulder(s16 x, s16 y, u8 direction) { u8 objectEventId; u8 direction_ = direction; if (!FlagGet(FLAG_SYS_USE_STRENGTH)) return FALSE; objectEventId = GetObjectEventIdByXY(x, y); if (objectEventId == OBJECT_EVENTS_COUNT) return FALSE; if (gObjectEvents[objectEventId].graphicsId != OBJ_EVENT_GFX_PUSHABLE_BOULDER) return FALSE; x = gObjectEvents[objectEventId].currentCoords.x; y = gObjectEvents[objectEventId].currentCoords.y; MoveCoords(direction_, &x, &y); if (MapGridGetMetatileBehaviorAt(x, y) == MB_FALL_WARP || (GetCollisionAtCoords(&gObjectEvents[objectEventId], x, y, direction_) == COLLISION_NONE && !MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y)))) { StartStrengthAnim(objectEventId, direction_); return TRUE; } else { return FALSE; } } static bool8 (*const sAcroBikeTrickMetatiles[])(u8) = { MetatileBehavior_IsBumpySlope, MetatileBehavior_IsIsolatedVerticalRail, MetatileBehavior_IsIsolatedHorizontalRail, MetatileBehavior_IsVerticalRail, MetatileBehavior_IsHorizontalRail }; static const u8 sAcroBikeTrickCollisionTypes[] = { COLLISION_WHEELIE_HOP, COLLISION_ISOLATED_VERTICAL_RAIL, COLLISION_ISOLATED_HORIZONTAL_RAIL, COLLISION_VERTICAL_RAIL, COLLISION_HORIZONTAL_RAIL, }; static void CheckAcroBikeCollision(s16 x, s16 y, u8 metatileBehavior, u8 *collision) { u32 i; for (i = 0; i < NELEMS(sAcroBikeTrickMetatiles); i++) { if (sAcroBikeTrickMetatiles[i](metatileBehavior)) { *collision = sAcroBikeTrickCollisionTypes[i]; return; } } } void SetPlayerAvatarTransitionFlags(u16 flags) { gPlayerAvatar.transitionFlags |= flags; DoPlayerAvatarTransition(); } static void (*const sPlayerAvatarTransitionFuncs[])(struct ObjectEvent *) = { [PLAYER_AVATAR_STATE_NORMAL] = PlayerAvatarTransition_Normal, [PLAYER_AVATAR_STATE_MACH_BIKE] = PlayerAvatarTransition_Bike, [PLAYER_AVATAR_STATE_ACRO_BIKE] = PlayerAvatarTransition_Bike, [PLAYER_AVATAR_STATE_SURFING] = PlayerAvatarTransition_Surfing, [PLAYER_AVATAR_STATE_UNDERWATER] = PlayerAvatarTransition_Underwater, [PLAYER_AVATAR_STATE_CONTROLLABLE] = PlayerAvatarTransition_ReturnToField, [PLAYER_AVATAR_STATE_FORCED] = PlayerAvatarTransition_Dummy, [PLAYER_AVATAR_STATE_DASH] = PlayerAvatarTransition_Dummy }; static void DoPlayerAvatarTransition(void) { u32 i; u8 flags = gPlayerAvatar.transitionFlags; if (flags != 0) { for (i = 0; i < NELEMS(sPlayerAvatarTransitionFuncs); i++, flags >>= 1) { if (flags & 1) sPlayerAvatarTransitionFuncs[i](&gObjectEvents[gPlayerAvatar.objectEventId]); } gPlayerAvatar.transitionFlags = 0; } } static void PlayerAvatarTransition_Dummy(struct ObjectEvent * playerObjEvent) { } static void PlayerAvatarTransition_Normal(struct ObjectEvent * playerObjEvent) { QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_NORMAL); QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_NORMAL); } static void PlayerAvatarTransition_Bike(struct ObjectEvent * playerObjEvent) { QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_BIKE); QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_BIKE); BikeClearState(0, 0); } static void PlayerAvatarTransition_Surfing(struct ObjectEvent * playerObjEvent) { QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_SURF); QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_SURF); } static void PlayerAvatarTransition_Underwater(struct ObjectEvent * playerObjEvent) { u8 facingDirection = playerObjEvent->facingDirection; s16 x = playerObjEvent->currentCoords.x; s16 y = playerObjEvent->currentCoords.y; RemoveObjectEvent(playerObjEvent); InitDivingPlayerAvatar(x, y, facingDirection, gSaveBlock2Ptr->playerGender); //ObjectEventSetGraphicsId(playerObjEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_UNDERWATER)); //ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_UNDERWATER); gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId = StartUnderwaterSurfBlobBobbing(gPlayerAvatar.spriteId); } static void PlayerAvatarTransition_ReturnToField(struct ObjectEvent * playerObjEvent) { gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_CONTROLLABLE; } void UpdatePlayerAvatarTransitionState(void) { gPlayerAvatar.tileTransitionState = T_NOT_MOVING; if (PlayerIsAnimActive()) { if (!PlayerCheckIfAnimFinishedOrInactive()) { if (!PlayerAnimIsMultiFrameStationary()) gPlayerAvatar.tileTransitionState = T_TILE_TRANSITION; } else { if (!PlayerAnimIsMultiFrameStationaryAndStateNotTurning()) gPlayerAvatar.tileTransitionState = T_TILE_CENTER; } } } static bool8 PlayerAnimIsMultiFrameStationary(void) { u8 movementActionId = gObjectEvents[gPlayerAvatar.objectEventId].movementActionId; if (movementActionId <= MOVEMENT_ACTION_FACE_RIGHT_FAST || (movementActionId >= MOVEMENT_ACTION_DELAY_1 && movementActionId <= MOVEMENT_ACTION_DELAY_16) || (movementActionId >= MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN && movementActionId <= MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT) || (movementActionId >= MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN && movementActionId <= MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT) || (movementActionId >= MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN && movementActionId <= MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT)) return TRUE; else return FALSE; } static bool8 PlayerAnimIsMultiFrameStationaryAndStateNotTurning(void) { if (PlayerAnimIsMultiFrameStationary() && gPlayerAvatar.runningState != TURN_DIRECTION) return TRUE; else return FALSE; } static bool8 PlayerIsAnimActive(void) { return ObjectEventIsMovementOverridden(&gObjectEvents[gPlayerAvatar.objectEventId]); } static bool8 PlayerCheckIfAnimFinishedOrInactive(void) { return ObjectEventCheckHeldMovementStatus(&gObjectEvents[gPlayerAvatar.objectEventId]); } static void PlayerSetCopyableMovement(u8 a) { gObjectEvents[gPlayerAvatar.objectEventId].playerCopyableMovement = a; } u8 PlayerGetCopyableMovement(void) { return gObjectEvents[gPlayerAvatar.objectEventId].playerCopyableMovement; } static void PlayerForceSetHeldMovement(u8 a) { ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], a); } static void PlayerSetAnimId(u8 movementActionId, u8 copyableMovement) { if (!PlayerIsAnimActive()) { PlayerSetCopyableMovement(copyableMovement); if (!ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], movementActionId)) QuestLogRecordPlayerStep(movementActionId); } } static void QL_TryRecordPlayerStepWithDuration0(struct ObjectEvent * objectEvent, u8 movementAction) { if (!ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], movementAction)) QuestLogRecordPlayerStepWithDuration(movementAction, 0); } static void QL_TryRecordNPCStepWithDuration32(struct ObjectEvent * objectEvent, u8 movementAction) { if (!ObjectEventSetHeldMovement(objectEvent, movementAction)) QuestLogRecordNPCStepWithDuration(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, movementAction, 32); } void PlayerWalkSlower(u8 direction) { PlayerSetAnimId(GetWalkSlowerMovementAction(direction), 2); } void PlayerWalkSlow(u8 direction) { PlayerSetAnimId(GetWalkSlowMovementAction(direction), 2); } void PlayerWalkNormal(u8 direction) { PlayerSetAnimId(GetWalkNormalMovementAction(direction), 2); } void PlayerWalkFast(u8 direction) { PlayerSetAnimId(GetWalkFastMovementAction(direction), 2); } void PlayerGlide(u8 direction) { PlayerSetAnimId(GetGlideMovementAction(direction), 2); } void PlayerRideWaterCurrent(u8 direction) { PlayerSetAnimId(GetRideWaterCurrentMovementAction(direction), 2); } void PlayerWalkFaster(u8 direction) { PlayerSetAnimId(GetWalkFasterMovementAction(direction), 2); } void PlayerRun(u8 direction) { PlayerSetAnimId(GetPlayerRunMovementAction(direction), 2); } void PlayerRunSlow(u8 direction) { PlayerSetAnimId(GetPlayerRunSlowMovementAction(direction), 2); } void PlayerOnBikeCollide(u8 direction) { PlayCollisionSoundIfNotFacingWarp(direction); PlayerSetAnimId(GetWalkInPlaceNormalMovementAction(direction), 2); } void PlayerNotOnBikeCollide(u8 direction) { PlayCollisionSoundIfNotFacingWarp(direction); PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(direction), 2); } void PlayerFaceDirection(u8 direction) { PlayerSetAnimId(GetFaceDirectionMovementAction(direction), 1); } void PlayerFaceDirectionFast(u8 direction) { PlayerSetAnimId(GetFaceDirectionFastMovementAction(direction), 1); } void PlayerTurnInPlace(u8 direction) { PlayerSetAnimId(GetWalkInPlaceFastMovementAction(direction), 1); } void PlayerJumpLedge(u8 direction) { PlaySE(SE_LEDGE); PlayerSetAnimId(GetJump2MovementAction(direction), 8); } // Shakes head for male player character, // walk in place for female player character void PlayerShakeHeadOrWalkInPlace(void) { PlayerSetAnimId(MOVEMENT_ACTION_SHAKE_HEAD_OR_WALK_IN_PLACE, 0); } void HandleEnforcedLookDirectionOnPlayerStopMoving(void) { if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING) { if (IsPlayerNotUsingAcroBikeOnBumpySlope()) PlayerForceSetHeldMovement(GetFaceDirectionMovementAction(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)); } } static void PlayerGoSpin(u8 direction) { PlayerSetAnimId(GetSpinMovementAction(direction), 3); } static void PlayerApplyTileForcedMovement(u8 metatileBehavior) { int i; for (i = 0; sForcedMovementFuncs[i].check != NULL; i++) { if (sForcedMovementFuncs[i].check(metatileBehavior)) sForcedMovementFuncs[i].apply(); } } static void PlayerIdleWheelie(u8 direction) { PlayerSetAnimId(GetAcroWheelieFaceDirectionMovementAction(direction), 1); } static void PlayerStartWheelie(u8 direction) { PlayerSetAnimId(GetAcroPopWheelieFaceDirectionMovementAction(direction), 1); } static void PlayerEndWheelie(u8 direction) { PlayerSetAnimId(GetAcroEndWheelieFaceDirectionMovementAction(direction), 1); } static void PlayerStandingHoppingWheelie(u8 direction) { PlaySE(SE_BIKE_HOP); PlayerSetAnimId(GetAcroWheelieHopFaceDirectionMovementAction(direction), 1); } static void PlayerMovingHoppingWheelie(u8 direction) { PlaySE(SE_BIKE_HOP); PlayerSetAnimId(GetAcroWheelieHopMovementAction(direction), 2); } static void PlayerLedgeHoppingWheelie(u8 direction) { PlaySE(SE_BIKE_HOP); PlayerSetAnimId(GetAcroWheelieJumpMovementAction(direction), 8); } static void PlayerAcroTurnJump(u8 direction) { PlaySE(SE_BIKE_HOP); PlayerSetAnimId(GetJumpInPlaceTurnAroundMovementAction(direction), 1); } static void PlayerAcroWheelieCollide(u8 direction) { PlaySE(SE_WALL_HIT); PlayerSetAnimId(GetAcroWheelieInPlaceMovementAction(direction), 2); } static void PlayerAcroPopWheelie(u8 direction) { PlayerSetAnimId(GetAcroPopWheelieMoveMovementAction(direction), 2); } static void PlayerAcroWheelieMove(u8 direction) { PlayerSetAnimId(GetAcroWheelieMoveMovementAction(direction), 2); } static bool8 (*const sArrowWarpMetatileBehaviorChecks[])(u8) = { MetatileBehavior_IsSouthArrowWarp, MetatileBehavior_IsNorthArrowWarp, MetatileBehavior_IsWestArrowWarp, MetatileBehavior_IsEastArrowWarp }; static void PlayCollisionSoundIfNotFacingWarp(u8 direction) { s16 x, y; u8 metatileBehavior = gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior; if (!sArrowWarpMetatileBehaviorChecks[direction - 1](metatileBehavior)) { if (direction == DIR_WEST) { if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior) || MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior)) return; } if (direction == DIR_EAST) { if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior) || MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior)) return; } if (direction == DIR_NORTH) { PlayerGetDestCoords(&x, &y); MoveCoords(DIR_NORTH, &x, &y); metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsWarpDoor(metatileBehavior)) return; } PlaySE(SE_WALL_HIT); } } void GetXYCoordsOneStepInFrontOfPlayer(s16 *x, s16 *y) { *x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; *y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; MoveCoords(GetPlayerFacingDirection(), x, y); } void PlayerGetDestCoords(s16 *x, s16 *y) { *x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; *y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; } u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y) { struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId]; if (object->heldMovementActive && !object->heldMovementFinished && !gSprites[object->spriteId].data[2]) { *x = object->currentCoords.x; *y = object->currentCoords.y; switch (object->movementActionId) { case MOVEMENT_ACTION_WALK_NORMAL_DOWN: case MOVEMENT_ACTION_PLAYER_RUN_DOWN: (*y)++; return TRUE; case MOVEMENT_ACTION_WALK_NORMAL_UP: case MOVEMENT_ACTION_PLAYER_RUN_UP: (*y)--; return TRUE; case MOVEMENT_ACTION_WALK_NORMAL_LEFT: case MOVEMENT_ACTION_PLAYER_RUN_LEFT: (*x)--; return TRUE; case MOVEMENT_ACTION_WALK_NORMAL_RIGHT: case MOVEMENT_ACTION_PLAYER_RUN_RIGHT: (*x)++; return TRUE; } } *x = -1; *y = -1; return FALSE; } u8 GetPlayerFacingDirection(void) { return gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; } u8 GetPlayerMovementDirection(void) { return gObjectEvents[gPlayerAvatar.objectEventId].movementDirection; } u8 PlayerGetElevation(void) { return gObjectEvents[gPlayerAvatar.objectEventId].previousElevation; } void MovePlayerToMapCoords(s16 x, s16 y) { MoveObjectEventToMapCoords(&gObjectEvents[gPlayerAvatar.objectEventId], x, y); } u8 TestPlayerAvatarFlags(u8 bm) { return gPlayerAvatar.flags & bm; } u8 GetPlayerAvatarFlags(void) { return gPlayerAvatar.flags; } u8 GetPlayerAvatarObjectId(void) { return gPlayerAvatar.spriteId; } void CancelPlayerForcedMovement(void) { ForcedMovement_None(); } void StopPlayerAvatar(void) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; npc_clear_strange_bits(playerObjEvent); SetObjectEventDirection(playerObjEvent, playerObjEvent->facingDirection); if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) { Bike_HandleBumpySlopeJump(); Bike_UpdateBikeCounterSpeed(0); } } // this table originally had NOTHING to do with the player avatar state. It has been updated to be more consistent with the player avatar state flags static const u8 sPlayerAvatarGfxIds[][GENDER_COUNT] = { [PLAYER_AVATAR_GFX_NORMAL] = {OBJ_EVENT_GFX_RED_NORMAL, OBJ_EVENT_GFX_GREEN_NORMAL}, [PLAYER_AVATAR_GFX_BIKE] = {OBJ_EVENT_GFX_RED_BIKE, OBJ_EVENT_GFX_GREEN_BIKE}, [PLAYER_AVATAR_GFX_RIDE] = {OBJ_EVENT_GFX_RED_SURF, OBJ_EVENT_GFX_GREEN_SURF}, [PLAYER_AVATAR_GFX_UNDERWATER] = {OBJ_EVENT_GFX_RED_UNDERWATER, OBJ_EVENT_GFX_GREEN_UNDERWATER}, //change to dive sprite(s) [PLAYER_AVATAR_GFX_FIELD_MOVE] = {OBJ_EVENT_GFX_RED_FIELD_MOVE, OBJ_EVENT_GFX_GREEN_FIELD_MOVE}, [PLAYER_AVATAR_GFX_FISH] = {OBJ_EVENT_GFX_RED_FISH, OBJ_EVENT_GFX_GREEN_FISH}, [PLAYER_AVATAR_GFX_VSSEEKER] = {OBJ_EVENT_GFX_RED_VS_SEEKER, OBJ_EVENT_GFX_GREEN_VS_SEEKER}, //not a real state. same as PLAYER_AVATAR_STATE_WATERING (aka PLAYER_AVATAR_STATE_DASH). }; static const u8 sHoennLinkPartnerGfxIds[] = { OBJ_EVENT_GFX_RS_BRENDAN, OBJ_EVENT_GFX_RS_MAY }; static const u8 sEmeraldLinkPartnerGfxIds[] = { OBJ_EVENT_GFX_EM_BRENDAN, OBJ_EVENT_GFX_EM_MAY }; u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) { return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gender); } // game freak is dumb and decided to make this state-based table not relate to the states defined in global.fieldmap.h u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) { return sPlayerAvatarGfxIds[state][gender]; } u8 GetRSAvatarGraphicsIdByGender(u8 gender) { return sHoennLinkPartnerGfxIds[gender]; } u8 GetEMAvatarGraphicsIdByGender(u8 gender) { return sEmeraldLinkPartnerGfxIds[gender]; } u8 GetPlayerAvatarGraphicsIdByStateId(u8 state) { return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender); } u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId) { switch (gfxId) { case OBJ_EVENT_GFX_GREEN_NORMAL: case OBJ_EVENT_GFX_GREEN_BIKE: case OBJ_EVENT_GFX_GREEN_SURF: case OBJ_EVENT_GFX_GREEN_FIELD_MOVE: case OBJ_EVENT_GFX_GREEN_FISH: case OBJ_EVENT_GFX_GREEN_UNDERWATER: return FEMALE; default: return MALE; } } bool8 PartyHasMonWithSurf(void) { u32 i; if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) { for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE) break; if (MonKnowsMove(&gPlayerParty[i], MOVE_SURF)) return TRUE; } } return FALSE; } bool8 IsPlayerSurfingNorth(void) { if (GetPlayerMovementDirection() == DIR_NORTH && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) return TRUE; else return FALSE; } bool8 IsPlayerFacingSurfableFishableWater(void) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; s16 x = playerObjEvent->currentCoords.x; s16 y = playerObjEvent->currentCoords.y; MoveCoords(playerObjEvent->facingDirection, &x, &y); if (GetCollisionAtCoords(playerObjEvent, x, y, playerObjEvent->facingDirection) == COLLISION_ELEVATION_MISMATCH && PlayerGetElevation() == 3 && MetatileAtCoordsIsWaterTile(x, y) == TRUE) return TRUE; else return FALSE; } bool8 MetatileAtCoordsIsWaterTile(s16 x, s16 y) { return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_TERRAIN), TILE_TERRAIN_WATER); } void ClearPlayerAvatarInfo(void) { gPlayerAvatar = (struct PlayerAvatar){}; } void SetPlayerAvatarStateMask(u8 flags) { gPlayerAvatar.flags &= (PLAYER_AVATAR_FLAG_DASH | PLAYER_AVATAR_FLAG_FORCED | PLAYER_AVATAR_FLAG_CONTROLLABLE); gPlayerAvatar.flags |= flags; } static const u8 sPlayerAvatarGfxToStateFlag[][4][GENDER_COUNT] = { [MALE] = { {OBJ_EVENT_GFX_RED_NORMAL, PLAYER_AVATAR_FLAG_ON_FOOT}, {OBJ_EVENT_GFX_RED_BIKE, PLAYER_AVATAR_FLAG_MACH_BIKE}, {OBJ_EVENT_GFX_RED_SURF, PLAYER_AVATAR_FLAG_SURFING}, {OBJ_EVENT_GFX_RED_UNDERWATER, PLAYER_AVATAR_FLAG_UNDERWATER}, //change to your male dive sprite }, [FEMALE] = { {OBJ_EVENT_GFX_GREEN_NORMAL, PLAYER_AVATAR_FLAG_ON_FOOT}, {OBJ_EVENT_GFX_GREEN_BIKE, PLAYER_AVATAR_FLAG_MACH_BIKE}, {OBJ_EVENT_GFX_GREEN_SURF, PLAYER_AVATAR_FLAG_SURFING}, {OBJ_EVENT_GFX_GREEN_UNDERWATER, PLAYER_AVATAR_FLAG_UNDERWATER}, //change to your female dive sprite } }; u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender) { u32 i; for (i = 0; i < NELEMS(*sPlayerAvatarGfxToStateFlag); i++) { if (sPlayerAvatarGfxToStateFlag[gender][i][0] == graphicsId) return sPlayerAvatarGfxToStateFlag[gender][i][1]; } return 1; } u8 GetPlayerAvatarGraphicsIdByCurrentState(void) { u32 i; u8 flags = gPlayerAvatar.flags; for (i = 0; i < NELEMS(*sPlayerAvatarGfxToStateFlag); i++) { if (sPlayerAvatarGfxToStateFlag[gPlayerAvatar.gender][i][1] & flags) return sPlayerAvatarGfxToStateFlag[gPlayerAvatar.gender][i][0]; } return 0; } void SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 extras) { u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(graphicsId, gPlayerAvatar.gender); gPlayerAvatar.transitionFlags |= unk | extras; DoPlayerAvatarTransition(); } void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) { struct ObjectEventTemplate playerObjEventTemplate; u8 objectEventId; struct ObjectEvent *objectEvent; playerObjEventTemplate.localId = OBJ_EVENT_ID_PLAYER; playerObjEventTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_GFX_NORMAL, gender); playerObjEventTemplate.x = x - 7; playerObjEventTemplate.y = y - 7; playerObjEventTemplate.objUnion.normal.elevation = 0; playerObjEventTemplate.objUnion.normal.movementType = MOVEMENT_TYPE_PLAYER; playerObjEventTemplate.objUnion.normal.movementRangeX = 0; playerObjEventTemplate.objUnion.normal.movementRangeY = 0; playerObjEventTemplate.objUnion.normal.trainerType = TRAINER_TYPE_NONE; playerObjEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0; playerObjEventTemplate.script = NULL; playerObjEventTemplate.flagId = 0; objectEventId = SpawnSpecialObjectEvent(&playerObjEventTemplate); objectEvent = &gObjectEvents[objectEventId]; objectEvent->isPlayer = 1; objectEvent->warpArrowSpriteId = CreateWarpArrowSprite(); ObjectEventTurn(objectEvent, direction); ClearPlayerAvatarInfo(); gPlayerAvatar.runningState = NOT_MOVING; gPlayerAvatar.tileTransitionState = T_NOT_MOVING; gPlayerAvatar.objectEventId = objectEventId; gPlayerAvatar.spriteId = objectEvent->spriteId; gPlayerAvatar.gender = gender; SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_CONTROLLABLE | PLAYER_AVATAR_FLAG_ON_FOOT); } void InitDivingPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) { struct ObjectEventTemplate playerObjEventTemplate; u8 objectEventId; struct ObjectEvent *objectEvent; playerObjEventTemplate.localId = OBJ_EVENT_ID_PLAYER; playerObjEventTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_GFX_UNDERWATER, gender); playerObjEventTemplate.x = x - 7; playerObjEventTemplate.y = y - 7; playerObjEventTemplate.objUnion.normal.elevation = 0; playerObjEventTemplate.objUnion.normal.movementType = MOVEMENT_TYPE_PLAYER; playerObjEventTemplate.objUnion.normal.movementRangeX = 0; playerObjEventTemplate.objUnion.normal.movementRangeY = 0; playerObjEventTemplate.objUnion.normal.trainerType = 0; playerObjEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0; playerObjEventTemplate.script = NULL; playerObjEventTemplate.flagId = 0; objectEventId = SpawnSpecialObjectEvent(&playerObjEventTemplate); objectEvent = &gObjectEvents[objectEventId]; objectEvent->isPlayer = 1; objectEvent->warpArrowSpriteId = CreateWarpArrowSprite(); ObjectEventTurn(objectEvent, direction); ClearPlayerAvatarInfo(); gPlayerAvatar.runningState = NOT_MOVING; gPlayerAvatar.tileTransitionState = T_NOT_MOVING; gPlayerAvatar.objectEventId = objectEventId; gPlayerAvatar.spriteId = objectEvent->spriteId; gPlayerAvatar.gender = gender; SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_CONTROLLABLE | PLAYER_AVATAR_FLAG_UNDERWATER); } void SetPlayerInvisibility(bool8 invisible) { gObjectEvents[gPlayerAvatar.objectEventId].invisible = invisible; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId].invisible = invisible; } void StartPlayerAvatarSummonMonForFieldMoveAnim(void) { ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FIELD_MOVE)); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], ANIM_FIELD_MOVE); } static const u8 sPlayerAvatarVsSeekerBikeGfxIds[] = { OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE, OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE }; u8 GetPlayerAvatarVsSeekerGfxId(void) { if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) return sPlayerAvatarVsSeekerBikeGfxIds[gPlayerAvatar.gender]; else return GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_VSSEEKER); } void StartPlayerAvatarVsSeekerAnim(void) { ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarVsSeekerGfxId()); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], ANIM_VS_SEEKER); } void StartPlayerAvatarFishAnim(u8 direction) { QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_FISH); } // Stubbed from R/S void PlayerUseAcroBikeOnBumpySlope(u8 direction) { } static void SetPlayerAvatarWatering(void) { } static bool8 (*const sArrowWarpMetatileBehaviorChecks2[])(u8) = { MetatileBehavior_IsSouthArrowWarp, MetatileBehavior_IsNorthArrowWarp, MetatileBehavior_IsWestArrowWarp, MetatileBehavior_IsEastArrowWarp }; static void HandleWarpArrowSpriteHideShow(struct ObjectEvent *objectEvent) { s16 x; s16 y; u8 direction; u8 metatileBehavior = objectEvent->currentMetatileBehavior; for (x = 0, direction = DIR_SOUTH; x < 4; x++, direction++) { if (sArrowWarpMetatileBehaviorChecks2[x](metatileBehavior) && direction == objectEvent->movementDirection) { x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; MoveCoords(direction, &x, &y); ShowWarpArrowSprite(objectEvent->warpArrowSpriteId, direction, x, y); return; } } SetSpriteInvisible(objectEvent->warpArrowSpriteId); } static bool8 (*const sBoulderTaskSteps[])(struct Task *task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj) = { DoBoulderInit, DoBoulderDust, DoBoulderFinish }; static void StartStrengthAnim(u8 a, u8 b) { u8 taskId = CreateTask(Task_BumpBoulder, 0xFF); gTasks[taskId].data[1] = a; gTasks[taskId].data[2] = b; Task_BumpBoulder(taskId); } static void Task_BumpBoulder(u8 taskId) { while (sBoulderTaskSteps[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gObjectEvents[gTasks[taskId].data[1]])) ; } static bool8 DoBoulderInit(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject) { LockPlayerFieldControls(); gPlayerAvatar.preventStep = TRUE; task->data[0]++; return FALSE; } static bool8 DoBoulderDust(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject) { if (!ObjectEventIsMovementOverridden(playerObject) && !ObjectEventIsMovementOverridden(strengthObject)) { ObjectEventClearHeldMovementIfFinished(playerObject); ObjectEventClearHeldMovementIfFinished(strengthObject); QL_TryRecordPlayerStepWithDuration0(playerObject, GetWalkInPlaceNormalMovementAction((u8)task->data[2])); QL_TryRecordNPCStepWithDuration32(strengthObject, GetWalkSlowerMovementAction((u8)task->data[2])); gFieldEffectArguments[0] = strengthObject->currentCoords.x; gFieldEffectArguments[1] = strengthObject->currentCoords.y; gFieldEffectArguments[2] = strengthObject->previousElevation; gFieldEffectArguments[3] = gSprites[strengthObject->spriteId].oam.priority; FieldEffectStart(FLDEFF_DUST); PlaySE(SE_M_STRENGTH); task->data[0]++; } return FALSE; } static bool8 DoBoulderFinish(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject) { if (ObjectEventCheckHeldMovementStatus(playerObject) && ObjectEventCheckHeldMovementStatus(strengthObject)) { ObjectEventClearHeldMovementIfFinished(playerObject); ObjectEventClearHeldMovementIfFinished(strengthObject); HandleBoulderFallThroughHole(strengthObject); HandleBoulderActivateVictoryRoadSwitch(strengthObject->currentCoords.x, strengthObject->currentCoords.y); gPlayerAvatar.preventStep = FALSE; UnlockPlayerFieldControls(); DestroyTask(FindTaskIdByFunc(Task_BumpBoulder)); } return FALSE; } static bool8 (*const sPlayerAvatarSecretBaseMatJump[])(struct Task *, struct ObjectEvent *) = { PlayerAvatar_DoSecretBaseMatJump }; static void DoPlayerMatJump(void) { DoPlayerAvatarSecretBaseMatJump(CreateTask(DoPlayerAvatarSecretBaseMatJump, 0xFF)); } static void DoPlayerAvatarSecretBaseMatJump(u8 taskId) { while (sPlayerAvatarSecretBaseMatJump[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId])) ; } // because data[0] is used to call this, it can be inferred that there may have been multiple mat jump functions at one point, so the name for these groups of functions is appropriate in assuming the sole use of mat jump. static bool8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct ObjectEvent *objectEvent) { gPlayerAvatar.preventStep = TRUE; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { PlaySE(SE_LEDGE); QL_TryRecordPlayerStepWithDuration0(objectEvent, GetJumpInPlaceMovementAction(objectEvent->facingDirection)); task->data[1]++; if (task->data[1] > 1) { gPlayerAvatar.preventStep = FALSE; gPlayerAvatar.transitionFlags |= PLAYER_AVATAR_FLAG_CONTROLLABLE; DestroyTask(FindTaskIdByFunc(DoPlayerAvatarSecretBaseMatJump)); } } return FALSE; } static bool8 (*const sPlayerAvatarSecretBaseMatSpin[])(struct Task *task, struct ObjectEvent * playerObj) = { PlayerAvatar_SecretBaseMatSpinStep0, PlayerAvatar_SecretBaseMatSpinStep1, PlayerAvatar_SecretBaseMatSpinStep2, PlayerAvatar_SecretBaseMatSpinStep3, }; static void DoPlayerMatSpin(void) { u8 taskId = CreateTask(PlayerAvatar_DoSecretBaseMatSpin, 0xFF); PlayerAvatar_DoSecretBaseMatSpin(taskId); } static void PlayerAvatar_DoSecretBaseMatSpin(u8 taskId) { while (sPlayerAvatarSecretBaseMatSpin[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId])) ; } static bool8 PlayerAvatar_SecretBaseMatSpinStep0(struct Task *task, struct ObjectEvent *objectEvent) { task->data[0]++; task->data[1] = objectEvent->movementDirection; gPlayerAvatar.preventStep = TRUE; LockPlayerFieldControls(); PlaySE(SE_WARP_IN); return TRUE; } static bool8 PlayerAvatar_SecretBaseMatSpinStep1(struct Task *task, struct ObjectEvent *objectEvent) { u8 directions[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { u8 direction; QL_TryRecordPlayerStepWithDuration0(objectEvent, GetFaceDirectionMovementAction(direction = directions[objectEvent->movementDirection - 1])); if (direction == (u8)task->data[1]) task->data[2]++; task->data[0]++; if (task->data[2] > 3 && direction == GetOppositeDirection(task->data[1])) task->data[0]++; } return FALSE; } static bool8 PlayerAvatar_SecretBaseMatSpinStep2(struct Task *task, struct ObjectEvent *objectEvent) { const u8 actions[] = { MOVEMENT_ACTION_DELAY_1, MOVEMENT_ACTION_DELAY_1, MOVEMENT_ACTION_DELAY_2, MOVEMENT_ACTION_DELAY_4, MOVEMENT_ACTION_DELAY_8, }; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { QL_TryRecordPlayerStepWithDuration0(objectEvent, actions[task->data[2]]); task->data[0] = 1; } return FALSE; } static bool8 PlayerAvatar_SecretBaseMatSpinStep3(struct Task *task, struct ObjectEvent *objectEvent) { if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { QL_TryRecordPlayerStepWithDuration0(objectEvent, GetWalkSlowerMovementAction(GetOppositeDirection(task->data[1]))); UnlockPlayerFieldControls(); gPlayerAvatar.preventStep = FALSE; DestroyTask(FindTaskIdByFunc(PlayerAvatar_DoSecretBaseMatSpin)); } return FALSE; } static void CreateStopSurfingTask(u8 direction) { u8 taskId; LockPlayerFieldControls(); FreezeObjectEvents(); Overworld_ClearSavedMusic(); Overworld_ChangeMusicToDefault(); gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; gPlayerAvatar.preventStep = TRUE; taskId = CreateTask(Task_StopSurfingInit, 0xFF); gTasks[taskId].data[0] = direction; Task_StopSurfingInit(taskId); } void CreateStopSurfingTask_NoMusicChange(u8 direction) { u8 taskId; LockPlayerFieldControls(); FreezeObjectEvents(); gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; gPlayerAvatar.preventStep = TRUE; taskId = CreateTask(Task_StopSurfingInit, 0xFF); gTasks[taskId].data[0] = direction; Task_StopSurfingInit(taskId); } void SeafoamIslandsB4F_CurrentDumpsPlayerOnLand(void) { if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RUNNING || gQuestLogPlaybackState == QL_PLAYBACK_STATE_ACTION_END) return; QuestLogRecordPlayerAvatarGfxTransitionWithDuration(sQuestLogSurfDismountActionIds[DIR_NORTH], 16); CreateStopSurfingTask(DIR_NORTH); } static void Task_StopSurfingInit(u8 taskId) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventIsMovementOverridden(playerObjEvent)) { if (!ObjectEventClearHeldMovementIfFinished(playerObjEvent)) return; } SetSurfBlob_BobState(playerObjEvent->fieldEffectSpriteId, BOB_MON_ONLY); QL_TryRecordPlayerStepWithDuration0(playerObjEvent, GetJumpSpecialWithEffectMovementAction((u8)gTasks[taskId].data[0])); gTasks[taskId].func = Task_WaitStopSurfing; } static void Task_WaitStopSurfing(u8 taskId) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventClearHeldMovementIfFinished(playerObjEvent)) { ObjectEventSetGraphicsId(playerObjEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL)); QL_TryRecordPlayerStepWithDuration0(playerObjEvent, GetFaceDirectionMovementAction(playerObjEvent->facingDirection)); gPlayerAvatar.preventStep = FALSE; UnlockPlayerFieldControls(); UnfreezeObjectEvents(); DestroySprite(&gSprites[playerObjEvent->fieldEffectSpriteId]); DestroyTask(taskId); SetHelpContextForMap(); } } static bool8 (*const sFishingStateFuncs[])(struct Task *) = { Fishing1, Fishing2, Fishing3, Fishing4, Fishing5, Fishing6, Fishing7, Fishing8, Fishing9, Fishing10, Fishing11, Fishing12, Fishing13, Fishing14, Fishing15, Fishing16, }; #define tStep data[0] #define tFrameCounter data[1] #define tNumDots data[2] #define tDotsRequired data[3] #define tRoundsPlayed data[12] #define tMinRoundsRequired data[13] #define tPlayerGfxId data[14] #define tFishingRod data[15] #define FISHING_START_ROUND 3 #define FISHING_GOT_BITE 6 #define FISHING_ON_HOOK 9 #define FISHING_NO_BITE 11 #define FISHING_GOT_AWAY 12 #define FISHING_SHOW_RESULT 13 void StartFishing(u8 rod) { u8 taskId = CreateTask(Task_Fishing, 0xFF); gTasks[taskId].tFishingRod = rod; Task_Fishing(taskId); if (QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_FISH) == TRUE) QL_AfterRecordFishActionSuccessful(); } static void Task_Fishing(u8 taskId) { while (sFishingStateFuncs[gTasks[taskId].tStep](&gTasks[taskId])) ; } static bool8 Fishing1(struct Task *task) { LockPlayerFieldControls(); gPlayerAvatar.preventStep = TRUE; task->tStep++; return FALSE; } static bool8 Fishing2(struct Task *task) { struct ObjectEvent *playerObjEvent; const s16 arr1[] = {1, 1, 1}; const s16 arr2[] = {1, 3, 6}; task->tRoundsPlayed = 0; task->tMinRoundsRequired = arr1[task->tFishingRod] + (Random() % arr2[task->tFishingRod]); task->tPlayerGfxId = gObjectEvents[gPlayerAvatar.objectEventId].graphicsId; playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventClearHeldMovementIfActive(playerObjEvent); playerObjEvent->enableAnim = 1; StartPlayerAvatarFishAnim(playerObjEvent->facingDirection); task->tStep++; return FALSE; } static bool8 Fishing3(struct Task *task) { AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); // Wait one second task->tFrameCounter++; if (task->tFrameCounter >= 60) task->tStep++; return FALSE; } static bool8 Fishing4(struct Task *task) { u32 randVal; LoadMessageBoxAndFrameGfx(0, TRUE); task->tStep++; task->tFrameCounter = 0; task->tNumDots = 0; randVal = Random(); randVal %= 10; task->tDotsRequired = randVal + 1; if (task->tRoundsPlayed == 0) task->tDotsRequired = randVal + 4; if (task->tDotsRequired >= 10) task->tDotsRequired = 10; return TRUE; } // Play a round of the dot game static bool8 Fishing5(struct Task *task) { static const u8 dot[] = _("·"); AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); task->tFrameCounter++; if (task->tFrameCounter >= 20) { task->tFrameCounter = 0; if (task->tNumDots >= task->tDotsRequired) { task->tStep++; if (task->tRoundsPlayed != 0) task->tStep++; task->tRoundsPlayed++; } else { AddTextPrinterParameterized(0, FONT_NORMAL, dot, task->tNumDots * 12, 1, 0, NULL); task->tNumDots++; } } return FALSE; } // Determine if fish bites static bool8 Fishing6(struct Task *task) { bool8 bite; AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); task->tStep++; bite = FALSE; if (!DoesCurrentMapHaveFishingMons()) { task->tStep = FISHING_NO_BITE; } else { if (!GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG)) { u8 ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_SUCTION_CUPS || ability == ABILITY_STICKY_HOLD) { if (Random() % 100 > 14) bite = TRUE; } } if (!bite) { if (Random() & 1) task->tStep = FISHING_NO_BITE; else bite = TRUE; } if (bite == TRUE) StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingBiteDirectionAnimNum(GetPlayerFacingDirection())); } return TRUE; } // Oh! A Bite! static bool8 Fishing7(struct Task *task) { task->tStep += 3; return FALSE; } // We have a bite. Now, wait for the player to press A, or the timer to expire. static bool8 Fishing8(struct Task *task) { const s16 reelTimeouts[3] = {36, 33, 30}; AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); task->tFrameCounter++; if (task->tFrameCounter >= reelTimeouts[task->tFishingRod]) task->tStep = FISHING_GOT_AWAY; else if (gMain.newKeys & A_BUTTON) task->tStep++; return FALSE; } // Determine if we're going to play the dot game again static bool8 Fishing9(struct Task *task) { const s16 arr[][2] = { {0, 0}, {40, 10}, {70, 30} }; AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); task->tStep++; if (task->tRoundsPlayed < task->tMinRoundsRequired) { task->tStep = FISHING_START_ROUND; } else if (task->tRoundsPlayed < 2) { // probability of having to play another round s16 probability = Random() % 100; if (arr[task->tFishingRod][task->tRoundsPlayed] > probability) task->tStep = FISHING_START_ROUND; } return FALSE; } static bool8 Fishing10(struct Task *task) { AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_PokemonOnHook, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); task->tStep++; task->tFrameCounter = 0; return FALSE; } static bool8 Fishing11(struct Task *task) { if (task->tFrameCounter == 0) AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); RunTextPrinters(); if (task->tFrameCounter == 0) { if (!IsTextPrinterActive(0)) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 0, 0); gSprites[gPlayerAvatar.spriteId].x2 = 0; gSprites[gPlayerAvatar.spriteId].y2 = 0; ClearDialogWindowAndFrame(0, TRUE); task->tFrameCounter++; return FALSE; } } if (task->tFrameCounter != 0) { gPlayerAvatar.preventStep = FALSE; UnlockPlayerFieldControls(); FishingWildEncounter(task->tFishingRod); DestroyTask(FindTaskIdByFunc(Task_Fishing)); } return FALSE; } // Not even a nibble static bool8 Fishing12(struct Task *task) { AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_NotEvenANibble, 1, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); task->tStep = FISHING_SHOW_RESULT; return TRUE; } // It got away static bool8 Fishing13(struct Task *task) { AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_ItGotAway, 1, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); task->tStep++; return TRUE; } // Wait one second static bool8 Fishing14(struct Task *task) { AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); task->tStep++; return FALSE; } static bool8 Fishing15(struct Task *task) { AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]); if (gSprites[gPlayerAvatar.spriteId].animEnded) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 0, 0); gSprites[gPlayerAvatar.spriteId].x2 = 0; gSprites[gPlayerAvatar.spriteId].y2 = 0; task->tStep++; } return FALSE; } static bool8 Fishing16(struct Task *task) { RunTextPrinters(); if (!IsTextPrinterActive(0)) { gPlayerAvatar.preventStep = FALSE; UnlockPlayerFieldControls(); UnfreezeObjectEvents(); ClearDialogWindowAndFrame(0, TRUE); DestroyTask(FindTaskIdByFunc(Task_Fishing)); } return FALSE; } #undef tStep #undef tFrameCounter #undef tFishingRod void AlignFishingAnimationFrames(struct Sprite *playerSprite) { u8 animCmdIndex; u8 animType; AnimateSprite(playerSprite); playerSprite->x2 = 0; playerSprite->y2 = 0; animCmdIndex = playerSprite->animCmdIndex; if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) { animCmdIndex--; } else { playerSprite->animDelayCounter++; if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) animCmdIndex--; } animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type; if (animType == 1 || animType == 2 || animType == 3) { playerSprite->x2 = 8; if (GetPlayerFacingDirection() == 3) playerSprite->x2 = -8; } if (animType == 5) playerSprite->y2 = -8; if (animType == 10 || animType == 11) playerSprite->y2 = 8; if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 1, playerSprite->y2); } #define tState data[0] #define tRotationTimer data[1] #define tDeltaY data[2] #define tYdeflection data[3] #define tYpos data[4] #define tFinalFacingDirection data[5] #define tPriority data[6] #define tSubpriority data[7] #define tLandingDelay data[8] static const u8 sTeleportFacingDirectionSequence[] = { [DIR_SOUTH] = DIR_WEST, [DIR_WEST] = DIR_NORTH, [DIR_NORTH] = DIR_EAST, [DIR_EAST] = DIR_SOUTH, [DIR_NONE] = DIR_SOUTH, }; void StartTeleportWarpOutPlayerAnim(void) { u8 taskId = CreateTask(Task_TeleportWarpOutPlayerAnim, 0); Task_TeleportWarpOutPlayerAnim(taskId); } bool32 WaitTeleportWarpOutPlayerAnim(void) { return FuncIsActiveTask(Task_TeleportWarpOutPlayerAnim); } void SavePlayerFacingDirectionForTeleport(u8 direction) { sTeleportSavedFacingDirection = direction; } static u8 GetTeleportSavedFacingDirection(void) { if (sTeleportSavedFacingDirection == DIR_NONE) return DIR_SOUTH; else return sTeleportSavedFacingDirection; } static void Task_TeleportWarpOutPlayerAnim(u8 taskId) { struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[object->spriteId]; s16 *data = gTasks[taskId].data; switch (tState) { case 0: if (!ObjectEventClearHeldMovementIfFinished(object)) { return; } SavePlayerFacingDirectionForTeleport(object->facingDirection); tRotationTimer = 0; tDeltaY = 1; tYdeflection = (u16)(sprite->y + sprite->y2) * 16; sprite->y2 = 0; CameraObjectReset2(); object->fixedPriority = TRUE; sprite->oam.priority = 0; sprite->subpriority = 0; sprite->subspriteMode = SUBSPRITES_OFF; tState++; case 1: TeleportAnim_RotatePlayer(object, &tRotationTimer); tYdeflection -= tDeltaY; tDeltaY += 3; sprite->y = tYdeflection >> 4; if (sprite->y + (s16)gTotalCameraPixelOffsetY < -32) { tState++; } break; case 2: DestroyTask(taskId); break; } } void StartTeleportInPlayerAnim(void) { u8 taskId = CreateTask(Task_TeleportWarpInPlayerAnim, 0); Task_TeleportWarpInPlayerAnim(taskId); } bool32 WaitTeleportInPlayerAnim(void) { return FuncIsActiveTask(Task_TeleportWarpInPlayerAnim); } static void Task_TeleportWarpInPlayerAnim(u8 taskId) { struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[object->spriteId]; s16 *data = gTasks[taskId].data; switch (tState) { case 0: tFinalFacingDirection = GetTeleportSavedFacingDirection(); ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(sTeleportFacingDirectionSequence[tFinalFacingDirection])); tRotationTimer = 0; tDeltaY = 116; tYpos = sprite->y; tPriority = sprite->oam.priority; tSubpriority = sprite->subpriority; tYdeflection = -((u16)sprite->y2 + 32) * 16; sprite->y2 = 0; CameraObjectReset2(); object->fixedPriority = TRUE; sprite->oam.priority = 1; sprite->subpriority = 0; sprite->subspriteMode = SUBSPRITES_OFF; tState++; case 1: TeleportAnim_RotatePlayer(object, &tRotationTimer); tYdeflection += tDeltaY; tDeltaY -= 3; if (tDeltaY < 4) { tDeltaY = 4; } sprite->y = tYdeflection >> 4; if (sprite->y >= tYpos) { sprite->y = tYpos; tLandingDelay = 0; tState++; } break; case 2: TeleportAnim_RotatePlayer(object, &tRotationTimer); tLandingDelay++; if (tLandingDelay > 8) { tState++; } break; case 3: if (tFinalFacingDirection == TeleportAnim_RotatePlayer(object, &tRotationTimer)) { object->fixedPriority = 0; sprite->oam.priority = tPriority; sprite->subpriority = tSubpriority; CameraObjectReset1(); DestroyTask(taskId); } break; } } static u8 TeleportAnim_RotatePlayer(struct ObjectEvent *object, s16 *a1) { if (*a1 < 8 && ++(*a1) < 8) { return object->facingDirection; } if (!ObjectEventCheckHeldMovementStatus(object)) { return object->facingDirection; } ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(sTeleportFacingDirectionSequence[object->facingDirection])); *a1 = 0; return sTeleportFacingDirectionSequence[object->facingDirection]; } #undef tLandingDelay #undef tSubpriority #undef tPriority #undef tFinalFacingDirection #undef tYpos #undef tYdeflection #undef tDeltaY #undef tRotationTimer #undef tState ================================================ FILE: src/field_poison.c ================================================ #include "global.h" #include "gflib.h" #include "strings.h" #include "task.h" #include "field_message_box.h" #include "script.h" #include "event_data.h" #include "fldeff.h" #include "party_menu.h" #include "field_poison.h" #include "constants/battle.h" static bool32 IsMonValidSpecies(struct Pokemon *pokemon) { u16 species = GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG); if (species == SPECIES_NONE || species == SPECIES_EGG) return FALSE; return TRUE; } static bool32 AllMonsFainted(void) { int i; struct Pokemon *pokemon = gPlayerParty; for (i = 0; i < PARTY_SIZE; i++, pokemon++) if (IsMonValidSpecies(pokemon) && GetMonData(pokemon, MON_DATA_HP)) return FALSE; return TRUE; } static void FaintFromFieldPoison(u8 partyIdx) { struct Pokemon *pokemon = gPlayerParty + partyIdx; u32 status = STATUS1_NONE; AdjustFriendship(pokemon, FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE); SetMonData(pokemon, MON_DATA_STATUS, &status); GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); StringGet_Nickname(gStringVar1); } static bool32 MonFaintedFromPoison(u8 partyIdx) { struct Pokemon *pokemon = gPlayerParty + partyIdx; if (IsMonValidSpecies(pokemon) && !GetMonData(pokemon, MON_DATA_HP) && GetAilmentFromStatus(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) return TRUE; return FALSE; } #define tState data[0] #define tPartyId data[1] static void Task_TryFieldPoisonWhiteOut(u8 taskId) { s16 *data = gTasks[taskId].data; switch (tState) { case 0: for (; tPartyId < PARTY_SIZE; tPartyId++) { if (MonFaintedFromPoison(tPartyId)) { FaintFromFieldPoison(tPartyId); ShowFieldMessage(gText_PkmnFainted3); tState++; return; } } tState = 2; break; case 1: if (IsFieldMessageBoxHidden()) tState--; break; case 2: if (AllMonsFainted()) gSpecialVar_Result = TRUE; else gSpecialVar_Result = FALSE; ScriptContext_Enable(); DestroyTask(taskId); break; } } void TryFieldPoisonWhiteOut(void) { CreateTask(Task_TryFieldPoisonWhiteOut, 80); ScriptContext_Stop(); } s32 DoPoisonFieldEffect(void) { int i; u32 hp; struct Pokemon *pokemon = gPlayerParty; u32 numPoisoned = 0; u32 numFainted = 0; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && GetAilmentFromStatus(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) { hp = GetMonData(pokemon, MON_DATA_HP); if (hp == 0 || --hp == 0) numFainted++; SetMonData(pokemon, MON_DATA_HP, &hp); numPoisoned++; } pokemon++; } if (numFainted || numPoisoned) FldEffPoison_Start(); if (numFainted) return FLDPSN_FNT; if (numPoisoned) return FLDPSN_PSN; return FLDPSN_NONE; } ================================================ FILE: src/field_screen_effect.c ================================================ #include "global.h" #include "gflib.h" #include "field_screen_effect.h" #include "overworld.h" #include "pokemon_storage_system.h" #include "scanline_effect.h" #include "script.h" #include "task.h" #include "strings.h" #include "menu.h" #include "heal_location.h" #include "new_menu_helpers.h" #include "event_object_movement.h" #include "field_fadetransition.h" #include "event_scripts.h" #include "constants/heal_locations.h" #include "constants/maps.h" static const u16 sFlashLevelToRadius[] = { 200, 72, 56, 40, 24 }; const s32 gMaxFlashLevel = ARRAY_COUNT(sFlashLevelToRadius) - 1; static const struct WindowTemplate sWindowTemplate_WhiteoutText = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 5, .width = 30, .height = 11, .paletteNum = 15, .baseBlock = 1, }; static const u8 sWhiteoutTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY }; static void Task_EnableScriptAfterMusicFade(u8 taskId); static void Task_BarnDoorWipeChild(u8 taskId); static void SetFlashScanlineEffectWindowBoundary(u16 *dest, u32 y, s32 left, s32 right) { if (y <= 160) { if (left < 0) left = 0; if (left > 255) left = 255; if (right < 0) right = 0; if (right > 255) right = 255; dest[y] = (left << 8) | right; } } /* * Draws a circle by approximating xy² + yx² = radius². * * error is approximately xy² - yx². Negative values mean the circle is * slightly too large, and positive values mean the circle is slightly * too small. By decreasing xy whenever the error becomes negative the * code slightly under-approximates the size of the circle. * * The subtractive terms compute yx² - (yx - 1)², and therefore the sum * is yx² - 1: * yx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 * (yx * 2) - 1 | -1 | 1 | 3 | 5 | 7 | 9 | 11 | 13 * yx² - (yx - 1)² | -1 | 1 | 3 | 5 | 7 | 9 | 11 | 13 * cumulative error | -1 | 0 | 3 | 8 | 15 | 24 | 35 | 48 * yx² | 0 | 1 | 4 | 9 | 16 | 25 | 36 | 49 * * The additive terms compute xy² - (xy - 1)² - 1, and therefore the sum * (badly) approximates Σi² - (i - 1)², i ∈ (xy, r), consider r = 18: * xy | 18 | 17 | 16 | 15 | 14 | 13 | ... | 0 * xy² - (xy - 1)² | 35 | 33 | 31 | 29 | 27 | 25 | ... | -1 * 2 * (xy - 1) | 34 | 32 | 30 | 28 | 26 | 24 | ... | -2 * cumulative error | 34 | 66 | 96 | 124 | 150 | 174 | ... | 304 * Σi² - (i - 1)² | 35 | 68 | 99 | 128 | 155 | 180 | ... | 323 * 18² = 324, so if the iterations ran until xy = 0 the cumulative error * would be xy² - r. * * The error is initialized to r, which corrects for the error in the * additive terms. In practice all r iterations don't occur because we * early-exit when yx > xy, so it's half-way between a fix for that * error and an approximation of the midpoint between r² and (r + 1)². * * The algorithm takes advantage of symmetry to compute boundaries in * both directions out from centerY (using yx for y), and also both * directions *in* from centerY ± radius (using xy for y). Because xy * doesn't change on every iteration, we will frequently overwrite * boundaries set in the previous iteration. */ void SetFlashScanlineEffectWindowBoundaries(u16 *dest, s32 centerX, s32 centerY, s32 radius) { s32 xy = radius; s32 error = radius; s32 yx = 0; while (xy >= yx) { SetFlashScanlineEffectWindowBoundary(dest, centerY - yx, centerX - xy, centerX + xy); SetFlashScanlineEffectWindowBoundary(dest, centerY + yx, centerX - xy, centerX + xy); SetFlashScanlineEffectWindowBoundary(dest, centerY - xy, centerX - yx, centerX + yx); SetFlashScanlineEffectWindowBoundary(dest, centerY + xy, centerX - yx, centerX + yx); error -= (yx * 2) - 1; yx++; if (error < 0) { error += 2 * (xy - 1); xy--; } } } #define tState data[0] #define tFlashCenterX data[1] #define tFlashCenterY data[2] #define tCurFlashRadius data[3] #define tDestFlashRadius data[4] #define tFlashRadiusDelta data[5] #define tClearScanlineEffect data[6] static void UpdateFlashLevelEffect(u8 taskId) { s16 *data = gTasks[taskId].data; switch (tState) { case 0: SetFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius); tState = 1; break; case 1: SetFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius); tState = 0; tCurFlashRadius += tFlashRadiusDelta; if (tCurFlashRadius > tDestFlashRadius) { if (tClearScanlineEffect == TRUE) { ScanlineEffect_Stop(); tState = 2; } else { DestroyTask(taskId); } } break; case 2: ScanlineEffect_Clear(); DestroyTask(taskId); break; } } static void Task_WaitForFlashUpdate(u8 taskId) { if (!FuncIsActiveTask(UpdateFlashLevelEffect)) { ScriptContext_Enable(); DestroyTask(taskId); } } static void StartWaitForFlashUpdate(void) { if (!FuncIsActiveTask(Task_WaitForFlashUpdate)) CreateTask(Task_WaitForFlashUpdate, 80); } static u8 StartUpdateFlashLevelEffect(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, bool32 clearScanlineEffect, u8 delta) { u8 taskId = CreateTask(UpdateFlashLevelEffect, 80); s16 *data = gTasks[taskId].data; tCurFlashRadius = initialFlashRadius; tDestFlashRadius = destFlashRadius; tFlashCenterX = centerX; tFlashCenterY = centerY; tClearScanlineEffect = clearScanlineEffect; if (initialFlashRadius < destFlashRadius) tFlashRadiusDelta = delta; else tFlashRadiusDelta = -delta; return taskId; } #undef tState #undef tCurFlashRadius #undef tDestFlashRadius #undef tFlashRadiusDelta #undef tClearScanlineEffect // A higher flash level is a smaller flash radius (more darkness). 0 is full brightness void AnimateFlash(u8 newFlashLevel) { u8 curFlashLevel = Overworld_GetFlashLevel(); bool32 fullBrightness = FALSE; if (newFlashLevel == 0) fullBrightness = TRUE; StartUpdateFlashLevelEffect(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, sFlashLevelToRadius[curFlashLevel], sFlashLevelToRadius[newFlashLevel], fullBrightness, 2); StartWaitForFlashUpdate(); LockPlayerFieldControls(); } void WriteFlashScanlineEffectBuffer(u8 flashLevel) { if (flashLevel) { SetFlashScanlineEffectWindowBoundaries(&gScanlineEffectRegBuffers[0][0], 120, 80, sFlashLevelToRadius[flashLevel]); CpuFastCopy(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 240 * 8); } } void Script_FadeOutMapMusic(void) { Overworld_FadeOutMapMusic(); CreateTask(Task_EnableScriptAfterMusicFade, 80); } static void Task_EnableScriptAfterMusicFade(u8 taskId) { if (BGMusicStopped() == TRUE) { DestroyTask(taskId); ScriptContext_Enable(); } } #define tState data[9] #define tDirection data[10] #define DIR_WIPE_IN 0 // From edges to center. #define DIR_WIPE_OUT 1 // From center to edges. #define tChildOffset data[0] static void DoInwardBarnDoorFade(void) { u8 taskId = CreateTask(Task_BarnDoorWipe, 80); gTasks[taskId].tDirection = DIR_WIPE_IN; } void DoOutwardBarnDoorWipe(void) { u8 taskId = CreateTask(Task_BarnDoorWipe, 80); gTasks[taskId].tDirection = DIR_WIPE_OUT; } static void BarnDoorWipeSaveGpuRegs(u8 taskId) { s16 *data = gTasks[taskId].data; data[0] = GetGpuReg(REG_OFFSET_DISPCNT); data[1] = GetGpuReg(REG_OFFSET_WININ); data[2] = GetGpuReg(REG_OFFSET_WINOUT); data[3] = GetGpuReg(REG_OFFSET_BLDCNT); data[4] = GetGpuReg(REG_OFFSET_BLDALPHA); data[5] = GetGpuReg(REG_OFFSET_WIN0H); data[6] = GetGpuReg(REG_OFFSET_WIN0V); data[7] = GetGpuReg(REG_OFFSET_WIN1H); data[8] = GetGpuReg(REG_OFFSET_WIN1V); } static void BarnDoorWipeLoadGpuRegs(u8 taskId) { s16 *data = gTasks[taskId].data; SetGpuReg(REG_OFFSET_DISPCNT, data[0]); SetGpuReg(REG_OFFSET_WININ, data[1]); SetGpuReg(REG_OFFSET_WINOUT, data[2]); SetGpuReg(REG_OFFSET_BLDCNT, data[3]); SetGpuReg(REG_OFFSET_BLDALPHA, data[4]); SetGpuReg(REG_OFFSET_WIN0H, data[5]); SetGpuReg(REG_OFFSET_WIN0V, data[6]); SetGpuReg(REG_OFFSET_WIN1H, data[7]); SetGpuReg(REG_OFFSET_WIN1V, data[8]); } void Task_BarnDoorWipe(u8 taskId) { s16 *data = gTasks[taskId].data; switch (tState) { case 0: BarnDoorWipeSaveGpuRegs(taskId); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); if (data[10] == 0) { SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0)); SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(DISPLAY_WIDTH, 255)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255)); SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 255)); } else { SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH / 2)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255)); SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(DISPLAY_WIDTH / 2, 255)); SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 255)); } SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); tState = 1; break; case 1: CreateTask(Task_BarnDoorWipeChild, 80); tState = 2; break; case 2: if (!FuncIsActiveTask(Task_BarnDoorWipeChild)) { tState = 3; } break; case 3: BarnDoorWipeLoadGpuRegs(taskId); DestroyTask(taskId); break; } } static void Task_BarnDoorWipeChild(u8 taskId) { s16 *data = gTasks[taskId].data; u8 parentTaskId = FindTaskIdByFunc(Task_BarnDoorWipe); s16 lhs, rhs; if (gTasks[parentTaskId].tDirection == DIR_WIPE_IN) { lhs = tChildOffset; rhs = DISPLAY_WIDTH - tChildOffset; if (lhs > DISPLAY_WIDTH / 2) { DestroyTask(taskId); return; } } else { lhs = DISPLAY_WIDTH / 2 - tChildOffset; rhs = DISPLAY_WIDTH / 2 + tChildOffset; if (lhs < 0) { DestroyTask(taskId); return; } } SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, lhs)); SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(rhs, DISPLAY_WIDTH)); if (lhs < 90) tChildOffset += 4; else tChildOffset += 2; } #undef tState #undef tDirection #undef DIR_WIPE_IN #undef DIR_WIPE_OUT #undef tChildOffset #define tState data[0] #define tWindowId data[1] #define tPrintState data[2] static bool8 PrintWhiteOutRecoveryMessage(u8 taskId, const u8 *text, u8 x, u8 y) { u8 windowId = gTasks[taskId].tWindowId; switch (gTasks[taskId].tPrintState) { case 0: FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); StringExpandPlaceholders(gStringVar4, text); AddTextPrinterParameterized4(windowId, FONT_NORMAL, x, y, 1, 0, sWhiteoutTextColors, 1, gStringVar4); gTextFlags.canABSpeedUpPrint = FALSE; gTasks[taskId].tPrintState = 1; break; case 1: RunTextPrinters(); if (!IsTextPrinterActive(windowId)) { gTasks[taskId].tPrintState = 0; return TRUE; } break; } return FALSE; } static void Task_RushInjuredPokemonToCenter(u8 taskId) { u8 windowId; const struct HealLocation *loc; switch (gTasks[taskId].tState) { case 0: windowId = AddWindow(&sWindowTemplate_WhiteoutText); gTasks[taskId].tWindowId = windowId; Menu_LoadStdPalAt(BG_PLTT_ID(15)); FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); // Scene changes if last heal location was the player's house loc = GetHealLocation(SPAWN_PALLET_TOWN); if (gSaveBlock1Ptr->lastHealLocation.mapGroup == loc->group && gSaveBlock1Ptr->lastHealLocation.mapNum == loc->map && gSaveBlock1Ptr->lastHealLocation.warpId == WARP_ID_NONE && gSaveBlock1Ptr->lastHealLocation.x == loc->x && gSaveBlock1Ptr->lastHealLocation.y == loc->y) gTasks[taskId].tState = 4; else gTasks[taskId].tState = 1; break; case 1: if (PrintWhiteOutRecoveryMessage(taskId, gText_PlayerScurriedToCenter, 2, 8)) { ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_NORTH); gTasks[taskId].tState++; } break; case 4: if (PrintWhiteOutRecoveryMessage(taskId, gText_PlayerScurriedBackHome, 2, 8)) { ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_NORTH); gTasks[taskId].tState++; } break; case 2: case 5: windowId = gTasks[taskId].tWindowId; ClearWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_MAP); RemoveWindow(windowId); palette_bg_faded_fill_black(); FadeInFromBlack(); gTasks[taskId].tState++; break; case 3: if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE) { DestroyTask(taskId); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || gSaveBlock1Ptr->keyFlags.noPMC == 1) { if(GetFirstAliveBoxMon() == 420) //no usable Pokemon { gGlobalFieldTintMode = 1; //should grayscale palettes? if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && gSaveBlock1Ptr->keyFlags.noPMC == 1) ScriptContext_SetupScript(EventScript_BothGameOver); //both noPMC and Nuzlocke else if(gSaveBlock1Ptr->keyFlags.noPMC == 0) ScriptContext_SetupScript(EventScript_NuzlockeGameOver); //just Nuzlocke else ScriptContext_SetupScript(EventScript_NoPMCGameOver); //just noPMC break; } else { SwapFirstAliveBoxPokemon(); if(gSaveBlock1Ptr->keyFlags.noPMC == 0) ScriptContext_SetupScript(EventScript_NuzlockeHaveMons_Nurse); else ScriptContext_SetupScript(EventScript_NoPMCHaveMons_Nurse); break; } } ScriptContext_SetupScript(EventScript_AfterWhiteOutHeal); } break; case 6: if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE) { DestroyTask(taskId); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || gSaveBlock1Ptr->keyFlags.noPMC == 1) { if(GetFirstAliveBoxMon() == 420) //no usable Pokemon { gGlobalFieldTintMode = 1; //should grayscale palettes? if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && gSaveBlock1Ptr->keyFlags.noPMC == 1) ScriptContext_SetupScript(EventScript_BothGameOver_Mom); //both noPMC and Nuzlocke else if(gSaveBlock1Ptr->keyFlags.noPMC == 0) ScriptContext_SetupScript(EventScript_NuzlockeGameOver_Mom); //just Nuzlocke else ScriptContext_SetupScript(EventScript_NoPMCGameOver_Mom); //just noPMC break; } else { SwapFirstAliveBoxPokemon(); if(gSaveBlock1Ptr->keyFlags.noPMC == 0) ScriptContext_SetupScript(EventScript_NuzlockeHaveMons_Mom); else ScriptContext_SetupScript(EventScript_NoPMCHaveMons_Mom); break; } } ScriptContext_SetupScript(EventScript_AfterWhiteOutMomHeal); } break; } } void FieldCB_RushInjuredPokemonToCenter(void) { u8 taskId; LockPlayerFieldControls(); palette_bg_faded_fill_black(); taskId = CreateTask(Task_RushInjuredPokemonToCenter, 10); gTasks[taskId].tState = 0; } ================================================ FILE: src/field_special_scene.c ================================================ #include "global.h" static u32 FieldSpecialScene_Dummy0(void) { return 0; } static void FieldSpecialScene_Dummy1(void) { } static void FieldSpecialScene_Dummy2(void) { } static void FieldSpecialScene_Dummy3(void) { } void FieldCB_ShowPortholeView(void) { } // From Hoenn's SS Tidal void LookThroughPorthole(void) { } ================================================ FILE: src/field_specials.c ================================================ #include "global.h" #include "gflib.h" #include "quest_log.h" #include "list_menu.h" #include "diploma.h" #include "script.h" #include "field_player_avatar.h" #include "overworld.h" #include "field_message_box.h" #include "event_data.h" #include "strings.h" #include "battle.h" #include "fieldmap.h" #include "field_specials.h" #include "region_map.h" #include "task.h" #include "battle_tower.h" #include "field_camera.h" #include "field_effect.h" #include "event_object_movement.h" #include "menu_indicators.h" #include "random.h" #include "mail_data.h" #include "help_system.h" #include "pokemon_storage_system.h" #include "script_menu.h" #include "data.h" #include "pokedex.h" #include "text_window.h" #include "menu.h" #include "mystery_gift.h" #include "naming_screen.h" #include "party_menu.h" #include "dynamic_placeholder_text_util.h" #include "new_menu_helpers.h" #include "battle_setup.h" #include "constants/songs.h" #include "constants/items.h" #include "constants/maps.h" #include "constants/region_map_sections.h" #include "constants/moves.h" #include "constants/menu.h" #include "constants/event_objects.h" #include "constants/metatile_labels.h" static EWRAM_DATA u8 sElevatorCurrentFloorWindowId = 0; static EWRAM_DATA u16 sElevatorScroll = 0; static EWRAM_DATA u16 sElevatorCursorPos = 0; static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL; static EWRAM_DATA u16 sListMenuLastScrollPosition = 0; static EWRAM_DATA u8 sPCBoxToSendMon = 0; static EWRAM_DATA u8 sBrailleTextCursorSpriteID = 0; struct ListMenuTemplate sFieldSpecialsListMenuTemplate; u16 sFieldSpecialsListMenuScrollBuffer; static const u8 gTitleNames[][18]; static void Task_AnimatePcTurnOn(u8 taskId); static void PcTurnOnUpdateMetatileId(bool16 flag); static void Task_ShakeScreen(u8 taskId); static void Task_EndScreenShake(u8 taskId); static u16 SampleResortGorgeousMon(void); static u16 SampleResortGorgeousReward(void); static void Task_ElevatorShake(u8 taskId); static void AnimateElevatorWindowView(u16 nfloors, bool8 direction); static void Task_AnimateElevatorWindowView(u8 taskId); static void Task_CreateScriptListMenu(u8 taskId); static void CreateScriptListMenu(void); static void ScriptListMenuMoveCursorFunction(s32 nothing, bool8 is, struct ListMenu * used); static void Task_ListMenuHandleInput(u8 taskId); static void Task_DestroyListMenu(u8 taskId); static void Task_SuspendListMenu(u8 taskId); static void Task_RedrawScrollArrowsAndWaitInput(u8 taskId); static void Task_CreateMenuRemoveScrollIndicatorArrowPair(u8 taskId); static void Task_ListMenuRemoveScrollIndicatorArrowPair(u8 taskId); static u16 GetStarterSpeciesById(u16 starterIdx); static void ChangeBoxPokemonNickname_CB(void); static void ChangePokemonNickname_CB(void); static void Task_RunPokemonLeagueLightingEffect(u8 taskId); static void Task_CancelPokemonLeagueLightingEffect(u8 taskId); static void Task_DoDeoxysTriangleInteraction(u8 taskId); static void MoveDeoxysObject(u8 num); static void Task_WaitDeoxysFieldEffect(u8 taskId); static void Task_WingFlapSound(u8 taskId); static u8 *const sStringVarPtrs[] = { gStringVar1, gStringVar2, gStringVar3 }; void ShowDiploma(void) { QuestLog_CutRecording(); SetMainCallback2(CB2_ShowDiploma); LockPlayerFieldControls(); } void ForcePlayerOntoBike(void) { if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ON_FOOT) SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_MACH_BIKE); Overworld_SetSavedMusic(MUS_CYCLING); Overworld_ChangeMusicTo(MUS_CYCLING); } void ResetCyclingRoadChallengeData(void) { } u8 GetPlayerAvatarBike(void) { if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) return 1; else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) return 2; else return 0; } void ShowFieldMessageStringVar4(void) { ShowFieldMessage(gStringVar4); } void GetPlayerXY(void) { gSpecialVar_0x8004 = gSaveBlock1Ptr->pos.x; gSpecialVar_0x8005 = gSaveBlock1Ptr->pos.y; } u8 GetPlayerTrainerIdOnesDigit(void) { u16 playerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]; return playerId % 10; } void BufferBigGuyOrBigGirlString(void) { if (gSaveBlock2Ptr->playerGender == MALE) StringCopy(gStringVar1, gText_BigGuy); else StringCopy(gStringVar1, gText_BigGirl); } void BufferSonOrDaughterString(void) { if (gSaveBlock2Ptr->playerGender == MALE) StringCopy(gStringVar1, gText_Daughter); else StringCopy(gStringVar1, gText_Son); } u8 GetBattleOutcome(void) { return gBattleOutcome; } void SetHiddenItemFlag(void) { FlagSet(gSpecialVar_0x8004); } u8 GetLeadMonFriendship(void) { struct Pokemon * pokemon = &gPlayerParty[GetLeadMonIndex()]; if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255) return 6; else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200) return 5; else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150) return 4; else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100) return 3; else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50) return 2; else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) > 0) return 1; else return 0; } void ShowTownMap(void) { QuestLog_CutRecording(); InitRegionMapWithExitCB(REGIONMAP_TYPE_WALL, CB2_ReturnToFieldContinueScriptPlayMapMusic); } bool8 PlayerHasGrassPokemonInParty(void) { u32 i; struct Pokemon * pokemon; u16 species; for (i = 0; i < PARTY_SIZE; i++) { pokemon = &gPlayerParty[i]; if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG) ) { species = GetMonData(pokemon, MON_DATA_SPECIES); if (gSpeciesInfo[species].types[0] == TYPE_GRASS || gSpeciesInfo[species].types[1] == TYPE_GRASS) return TRUE; } } return FALSE; } #define tState data[0] #define tTimer data[1] void AnimatePcTurnOn(void) { u8 taskId; if (FuncIsActiveTask(Task_AnimatePcTurnOn) != TRUE) { taskId = CreateTask(Task_AnimatePcTurnOn, 8); gTasks[taskId].tState = 0; gTasks[taskId].tTimer = 0; } } // PC flickers on and off while turning on static void Task_AnimatePcTurnOn(u8 taskId) { s16 *data = gTasks[taskId].data; if (tTimer == 6) { PcTurnOnUpdateMetatileId(tState & 1); DrawWholeMapView(); tTimer = 0; tState++; if (tState == 5) DestroyTask(taskId); } tTimer++; } #undef tState #undef tTimer static void PcTurnOnUpdateMetatileId(bool16 flickerOff) { u16 metatileId = 0; s8 deltaX = 0; s8 deltaY = 0; u8 direction = GetPlayerFacingDirection(); switch (direction) { case DIR_NORTH: deltaX = 0; deltaY = -1; break; case DIR_WEST: deltaX = -1; deltaY = -1; break; case DIR_EAST: deltaX = 1; deltaY = -1; break; } if (flickerOff) { if (gSpecialVar_0x8004 == 0) metatileId = METATILE_Building_PCOff; else if (gSpecialVar_0x8004 == 1) metatileId = METATILE_GenericBuilding1_PlayersPCOff; else if (gSpecialVar_0x8004 == 2) metatileId = METATILE_GenericBuilding1_PlayersPCOff; } else { if (gSpecialVar_0x8004 == 0) metatileId = METATILE_Building_PCOn; else if (gSpecialVar_0x8004 == 1) metatileId = METATILE_GenericBuilding1_PlayersPCOn; else if (gSpecialVar_0x8004 == 2) metatileId = METATILE_GenericBuilding1_PlayersPCOn; } MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + MAP_OFFSET, gSaveBlock1Ptr->pos.y + deltaY + MAP_OFFSET, metatileId | MAPGRID_COLLISION_MASK); } void AnimatePcTurnOff() { u16 metatileId = 0; s8 deltaX = 0; s8 deltaY = 0; u8 direction = GetPlayerFacingDirection(); switch (direction) { case DIR_NORTH: deltaX = 0; deltaY = -1; break; case DIR_WEST: deltaX = -1; deltaY = -1; break; case DIR_EAST: deltaX = 1; deltaY = -1; break; } if (gSpecialVar_0x8004 == 0) metatileId = METATILE_Building_PCOff; else if (gSpecialVar_0x8004 == 1) metatileId = METATILE_GenericBuilding1_PlayersPCOff; else if (gSpecialVar_0x8004 == 2) metatileId = METATILE_GenericBuilding1_PlayersPCOff; MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + MAP_OFFSET, gSaveBlock1Ptr->pos.y + deltaY + MAP_OFFSET, metatileId | MAPGRID_COLLISION_MASK); DrawWholeMapView(); } void SpawnCameraObject(void) { u8 objectEventId = SpawnSpecialObjectEventParameterized(OBJ_EVENT_GFX_YOUNGSTER, 8, OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->pos.x + MAP_OFFSET, gSaveBlock1Ptr->pos.y + MAP_OFFSET, 3); gObjectEvents[objectEventId].invisible = TRUE; CameraObjectSetFollowedObjectId(gObjectEvents[objectEventId].spriteId); } void RemoveCameraObject(void) { CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); RemoveObjectEventByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } void BufferEReaderTrainerName(void) { CopyEReaderTrainerName5(gStringVar1); } // Unused static const u8 sSlotMachineRandomSeeds[] = { 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6 }; static const u8 sSlotMachineIndices[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5 }; u8 GetRandomSlotMachineId(void) { u16 rval = Random() % NELEMS(sSlotMachineIndices); return sSlotMachineIndices[rval]; } bool8 LeadMonHasEffortRibbon(void) { u8 leadMonIdx = GetLeadMonIndex(); return GetMonData(&gPlayerParty[leadMonIdx], MON_DATA_EFFORT_RIBBON, NULL); } void GiveLeadMonEffortRibbon(void) { u8 leadMonIdx; bool8 param; IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); FlagSet(FLAG_SYS_RIBBON_GET); param = TRUE; leadMonIdx = GetLeadMonIndex(); SetMonData(&gPlayerParty[leadMonIdx], MON_DATA_EFFORT_RIBBON, ¶m); } bool8 AreLeadMonEVsMaxedOut(void) { u8 leadMonIndex = GetLeadMonIndex(); if (GetMonEVCount(&gPlayerParty[leadMonIndex]) >= 510) return TRUE; else return FALSE; } bool8 IsStarterFirstStageInParty(void) { u16 species = GetStarterSpeciesById(VarGet(VAR_STARTER_MON)); u8 partyCount = CalculatePlayerPartyCount(); u32 i; for (i = 0; i < partyCount; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) == species) return TRUE; } return FALSE; } bool8 IsThereRoomInAnyBoxForMorePokemon(void) { u32 i; u32 j; for (i = 0; i < TOTAL_BOXES_COUNT; i++) { for (j = 0; j < IN_BOX_COUNT; j++) { if (GetBoxMonDataAt(i, j, MON_DATA_SPECIES) == SPECIES_NONE) return TRUE; } } return FALSE; } bool8 IsPokerusInParty(void) { if (!CheckPartyPokerus(gPlayerParty, 0x3F)) return FALSE; else return TRUE; } #define tXtrans data[0] #define tTimer data[1] #define tNremain data[2] #define tDuration data[3] #define tYtrans data[4] void ShakeScreen(void) { /* * 0x8004 = x translation * 0x8005 = y translation * 0x8006 = num interations * 0x8007 = duration of an iteration */ u8 taskId = CreateTask(Task_ShakeScreen, 9); gTasks[taskId].tXtrans = gSpecialVar_0x8005; gTasks[taskId].tTimer = 0; gTasks[taskId].tNremain = gSpecialVar_0x8006; gTasks[taskId].tDuration = gSpecialVar_0x8007; gTasks[taskId].tYtrans = gSpecialVar_0x8004; SetCameraPanningCallback(NULL); PlaySE(SE_M_STRENGTH); } static void Task_ShakeScreen(u8 taskId) { s16 *data = gTasks[taskId].data; tTimer++; if (tTimer % tDuration == 0) { tTimer = 0; tNremain--; tXtrans = -tXtrans; tYtrans = -tYtrans; SetCameraPanning(tXtrans, tYtrans); if (tNremain == 0) { Task_EndScreenShake(taskId); InstallCameraPanAheadCallback(); } } } static void Task_EndScreenShake(u8 taskId) { DestroyTask(taskId); ScriptContext_Enable(); } #undef tYtrans #undef tDuration #undef tNremain #undef tTimer #undef tXtrans u8 GetLeadMonIndex(void) { u8 partyCount = CalculatePlayerPartyCount(); u32 i; struct Pokemon * pokemon; for (i = 0; i < partyCount; i++) { pokemon = &gPlayerParty[i]; if (GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG && GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_NONE) return i; } return 0; } u16 GetPartyMonSpecies(void) { return GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES_OR_EGG, NULL); } bool8 IsMonOTNameNotPlayers(void) { GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1); if (!StringCompare(gSaveBlock2Ptr->playerName, gStringVar1)) return FALSE; else return TRUE; } // Used to nop all the unused specials from RS void NullFieldSpecial(void) { } void DoPicboxCancel(void) { u8 t = EOS; AddTextPrinterParameterized(0, FONT_NORMAL, &t, 0, 1, 0, NULL); PicboxCancel(); } void SetVermilionTrashCans(void) { u16 idx = (Random() % 15) + 1; gSpecialVar_0x8004 = idx; gSpecialVar_0x8005 = idx; switch (gSpecialVar_0x8004) { case 1: idx = Random() % 2; if (idx == 0) gSpecialVar_0x8005 += 1; else gSpecialVar_0x8005 += 5; break; case 2: case 3: case 4: idx = Random() % 3; if (idx == 0) gSpecialVar_0x8005 += 1; else if (idx == 1) gSpecialVar_0x8005 += 5; else gSpecialVar_0x8005 -= 1; break; case 5: idx = Random() % 2; if (idx == 0) gSpecialVar_0x8005 += 5; else gSpecialVar_0x8005 -= 1; break; case 6: idx = Random() % 3; if (idx == 0) gSpecialVar_0x8005 -= 5; else if (idx == 1) gSpecialVar_0x8005 += 1; else gSpecialVar_0x8005 += 5; break; case 7: case 8: case 9: idx = Random() % 4; if (idx == 0) gSpecialVar_0x8005 -= 5; else if (idx == 1) gSpecialVar_0x8005 += 1; else if (idx == 2) gSpecialVar_0x8005 += 5; else gSpecialVar_0x8005 -= 1; break; case 10: idx = Random() % 3; if (idx == 0) gSpecialVar_0x8005 -= 5; else if (idx == 1) gSpecialVar_0x8005 += 5; else gSpecialVar_0x8005 -= 1; break; case 11: idx = Random() % 2; if (idx == 0) gSpecialVar_0x8005 -= 5; else gSpecialVar_0x8005 += 1; break; case 12: case 13: case 14: idx = Random() % 3; if (idx == 0) gSpecialVar_0x8005 -= 5; else if (idx == 1) gSpecialVar_0x8005 += 1; else gSpecialVar_0x8005 -= 1; break; case 15: idx = Random() % 2; if (idx == 0) gSpecialVar_0x8005 -= 5; else gSpecialVar_0x8005 -= 1; break; } if (gSpecialVar_0x8005 > 15) { if (gSpecialVar_0x8004 % 5 == 1) gSpecialVar_0x8005 = gSpecialVar_0x8004 + 1; else if (gSpecialVar_0x8004 % 5 == 0) gSpecialVar_0x8005 = gSpecialVar_0x8004 - 1; else gSpecialVar_0x8005 = gSpecialVar_0x8004 + 1; } } static const u16 sResortGorgeousDeluxeRewards[] = { ITEM_BIG_PEARL, ITEM_PEARL, ITEM_STARDUST, ITEM_STAR_PIECE, ITEM_NUGGET, ITEM_RARE_CANDY }; void IncrementResortGorgeousStepCounter(void) { u16 var4035 = VarGet(VAR_RESORT_GOREGEOUS_STEP_COUNTER); if (VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON) != SPECIES_NONE) { var4035++; if (var4035 >= 250) { VarSet(VAR_RESORT_GORGEOUS_REQUESTED_MON, 0xFFFF); VarSet(VAR_RESORT_GOREGEOUS_STEP_COUNTER, 0); } else { VarSet(VAR_RESORT_GOREGEOUS_STEP_COUNTER, var4035); } } } void SampleResortGorgeousMonAndReward(void) { u16 requestedSpecies = VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON); if (requestedSpecies == SPECIES_NONE || requestedSpecies == 0xFFFF) { VarSet(VAR_RESORT_GORGEOUS_REQUESTED_MON, SampleResortGorgeousMon()); VarSet(VAR_RESORT_GORGEOUS_REWARD, SampleResortGorgeousReward()); VarSet(VAR_RESORT_GOREGEOUS_STEP_COUNTER, 0); } StringCopy(gStringVar1, gSpeciesNames[VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON)]); } static u16 SampleResortGorgeousMon(void) { u32 i; u16 species; for (i = 0; i < 100; i++) { species = (Random() % (NUM_SPECIES - 1)) + 1; if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == TRUE) return species; } while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) != TRUE) { if (species == SPECIES_BULBASAUR) species = NUM_SPECIES - 1; else species--; } return species; } static u16 SampleResortGorgeousReward(void) { if ((Random() % 100) >= 30) return ITEM_LUXURY_BALL; else return sResortGorgeousDeluxeRewards[Random() % NELEMS(sResortGorgeousDeluxeRewards)]; } bool8 CheckAddCoins(void) { if (gSpecialVar_Result + gSpecialVar_0x8006 > 9999) return FALSE; else return TRUE; } static const struct WindowTemplate sElevatorCurrentFloorWindowTemplate = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 1, .width = 7, .height = 4, .paletteNum = 15, .baseBlock = 0x008 }; static const u8 *const sFloorNamePointers[] = { gText_B4F, gText_B3F, gText_B2F, gText_B1F, gText_1F, gText_2F, gText_3F, gText_4F, gText_5F, gText_6F, gText_7F, gText_8F, gText_9F, gText_10F, gText_11F, gText_Rooftop }; // Unused static const u8 sFloorNameWidthPadding[] = { 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 26, 18 }; static const u16 sElevatorWindowMetatilesGoingUp[][3] = { { METATILE_SilphCo_ElevatorWindow_Top0, METATILE_SilphCo_ElevatorWindow_Top1, METATILE_SilphCo_ElevatorWindow_Top2 }, { METATILE_SilphCo_ElevatorWindow_Mid0, METATILE_SilphCo_ElevatorWindow_Mid1, METATILE_SilphCo_ElevatorWindow_Mid2 }, { METATILE_SilphCo_ElevatorWindow_Bottom0, METATILE_SilphCo_ElevatorWindow_Bottom1, METATILE_SilphCo_ElevatorWindow_Bottom2 } }; static const u16 sElevatorWindowMetatilesGoingDown[][3] = { { METATILE_SilphCo_ElevatorWindow_Top0, METATILE_SilphCo_ElevatorWindow_Top2, METATILE_SilphCo_ElevatorWindow_Top1 }, { METATILE_SilphCo_ElevatorWindow_Mid0, METATILE_SilphCo_ElevatorWindow_Mid2, METATILE_SilphCo_ElevatorWindow_Mid1 }, { METATILE_SilphCo_ElevatorWindow_Bottom0, METATILE_SilphCo_ElevatorWindow_Bottom2, METATILE_SilphCo_ElevatorWindow_Bottom1 } }; static const u8 sElevatorAnimationDuration[] = { 8, 16, 24, 32, 38, 46, 53, 56, 57 }; static const u8 sElevatorWindowAnimDuration[] = { 3, 6, 9, 12, 15, 18, 21, 24, 27 }; void GetElevatorFloor(void) { u16 floor = 4; if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_B1F)) { switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(SILPH_CO_1F): floor = 4; break; case MAP_NUM(SILPH_CO_2F): floor = 5; break; case MAP_NUM(SILPH_CO_3F): floor = 6; break; case MAP_NUM(SILPH_CO_4F): floor = 7; break; case MAP_NUM(SILPH_CO_5F): floor = 8; break; case MAP_NUM(SILPH_CO_6F): floor = 9; break; case MAP_NUM(SILPH_CO_7F): floor = 10; break; case MAP_NUM(SILPH_CO_8F): floor = 11; break; case MAP_NUM(SILPH_CO_9F): floor = 12; break; case MAP_NUM(SILPH_CO_10F): floor = 13; break; case MAP_NUM(SILPH_CO_11F): floor = 14; break; case MAP_NUM(ROCKET_HIDEOUT_B1F): floor = 3; break; case MAP_NUM(ROCKET_HIDEOUT_B2F): floor = 2; break; case MAP_NUM(ROCKET_HIDEOUT_B4F): floor = 0; break; } } if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F)) { switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F): floor = 4; break; case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_2F): floor = 5; break; case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_3F): floor = 6; break; case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_4F): floor = 7; break; case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_5F): floor = 8; break; } } if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(TRAINER_TOWER_1F)) { switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(TRAINER_TOWER_1F): case MAP_NUM(TRAINER_TOWER_2F): case MAP_NUM(TRAINER_TOWER_3F): case MAP_NUM(TRAINER_TOWER_4F): case MAP_NUM(TRAINER_TOWER_5F): case MAP_NUM(TRAINER_TOWER_6F): case MAP_NUM(TRAINER_TOWER_7F): case MAP_NUM(TRAINER_TOWER_8F): case MAP_NUM(TRAINER_TOWER_ROOF): floor = 15; break; case MAP_NUM(TRAINER_TOWER_LOBBY): floor = 3; break; } } VarSet(VAR_ELEVATOR_FLOOR, floor); } u16 InitElevatorFloorSelectMenuPos(void) { sElevatorScroll = 0; sElevatorCursorPos = 0; if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_B1F)) { switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(SILPH_CO_11F): sElevatorScroll = 0; sElevatorCursorPos = 0; break; case MAP_NUM(SILPH_CO_10F): sElevatorScroll = 0; sElevatorCursorPos = 1; break; case MAP_NUM(SILPH_CO_9F): sElevatorScroll = 0; sElevatorCursorPos = 2; break; case MAP_NUM(SILPH_CO_8F): sElevatorScroll = 0; sElevatorCursorPos = 3; break; case MAP_NUM(SILPH_CO_7F): sElevatorScroll = 0; sElevatorCursorPos = 4; break; case MAP_NUM(SILPH_CO_6F): sElevatorScroll = 1; sElevatorCursorPos = 4; break; case MAP_NUM(SILPH_CO_5F): sElevatorScroll = 2; sElevatorCursorPos = 4; break; case MAP_NUM(SILPH_CO_4F): sElevatorScroll = 3; sElevatorCursorPos = 4; break; case MAP_NUM(SILPH_CO_3F): sElevatorScroll = 4; sElevatorCursorPos = 4; break; case MAP_NUM(SILPH_CO_2F): sElevatorScroll = 5; sElevatorCursorPos = 4; break; case MAP_NUM(SILPH_CO_1F): sElevatorScroll = 5; sElevatorCursorPos = 5; break; case MAP_NUM(ROCKET_HIDEOUT_B1F): sElevatorScroll = 0; sElevatorCursorPos = 0; break; case MAP_NUM(ROCKET_HIDEOUT_B2F): sElevatorScroll = 0; sElevatorCursorPos = 1; break; case MAP_NUM(ROCKET_HIDEOUT_B4F): sElevatorScroll = 0; sElevatorCursorPos = 2; break; } } if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F)) { switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_5F): sElevatorScroll = 0; sElevatorCursorPos = 0; break; case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_4F): sElevatorScroll = 0; sElevatorCursorPos = 1; break; case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_3F): sElevatorScroll = 0; sElevatorCursorPos = 2; break; case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_2F): sElevatorScroll = 0; sElevatorCursorPos = 3; break; case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F): sElevatorScroll = 0; sElevatorCursorPos = 4; break; } } if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(TRAINER_TOWER_1F)) { switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(TRAINER_TOWER_1F): case MAP_NUM(TRAINER_TOWER_2F): case MAP_NUM(TRAINER_TOWER_3F): case MAP_NUM(TRAINER_TOWER_4F): case MAP_NUM(TRAINER_TOWER_5F): case MAP_NUM(TRAINER_TOWER_6F): case MAP_NUM(TRAINER_TOWER_7F): case MAP_NUM(TRAINER_TOWER_8F): case MAP_NUM(TRAINER_TOWER_ROOF): sElevatorScroll = 0; sElevatorCursorPos = 0; break; case MAP_NUM(TRAINER_TOWER_LOBBY): sElevatorScroll = 0; sElevatorCursorPos = 1; break; } } return sElevatorCursorPos; } void AnimateElevator(void) { u16 nfloors; s16 *data = gTasks[CreateTask(Task_ElevatorShake, 9)].data; data[1] = 0; data[2] = 0; data[4] = 1; if (gSpecialVar_0x8005 > gSpecialVar_0x8006) { nfloors = gSpecialVar_0x8005 - gSpecialVar_0x8006; data[6] = 1; } else { nfloors = gSpecialVar_0x8006 - gSpecialVar_0x8005; data[6] = 0; } if (nfloors > 8) nfloors = 8; data[5] = sElevatorAnimationDuration[nfloors]; SetCameraPanningCallback(NULL); AnimateElevatorWindowView(nfloors, data[6]); PlaySE(SE_ELEVATOR); } static void Task_ElevatorShake(u8 taskId) { s16 *data = gTasks[taskId].data; data[1]++; if ((data[1] % 3) == 0) { data[1] = 0; data[2]++; data[4] = -data[4]; SetCameraPanning(0, data[4]); if (data[2] == data[5]) { PlaySE(SE_DING_DONG); DestroyTask(taskId); ScriptContext_Enable(); InstallCameraPanAheadCallback(); } } } void DrawElevatorCurrentFloorWindow(void) { const u8 *floorname; u32 strwidth; if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE) return; sElevatorCurrentFloorWindowId = AddWindow(&sElevatorCurrentFloorWindowTemplate); LoadStdWindowGfx(sElevatorCurrentFloorWindowId, 0x21D, BG_PLTT_ID(13)); DrawStdFrameWithCustomTileAndPalette(sElevatorCurrentFloorWindowId, FALSE, 0x21D, 13); AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, gText_NowOn, 0, 2, 0xFF, NULL); floorname = sFloorNamePointers[gSpecialVar_0x8005]; strwidth = GetStringWidth(FONT_NORMAL, floorname, 0); AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, floorname, 56 - strwidth, 16, 0xFF, NULL); PutWindowTilemap(sElevatorCurrentFloorWindowId); CopyWindowToVram(sElevatorCurrentFloorWindowId, COPYWIN_FULL); } void CloseElevatorCurrentFloorWindow(void) { ClearStdWindowAndFrameToTransparent(sElevatorCurrentFloorWindowId, TRUE); RemoveWindow(sElevatorCurrentFloorWindowId); } static void AnimateElevatorWindowView(u16 nfloors, u8 direction) { u8 taskId; if (FuncIsActiveTask(Task_AnimateElevatorWindowView) != TRUE) { taskId = CreateTask(Task_AnimateElevatorWindowView, 8); gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = direction; gTasks[taskId].data[3] = sElevatorWindowAnimDuration[nfloors]; } } static void Task_AnimateElevatorWindowView(u8 taskId) { u32 i; u32 j; s16 *data = gTasks[taskId].data; if (data[1] == 6) { data[0]++; if (data[2] == 0) { for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) MapGridSetMetatileIdAt(j + 1 + MAP_OFFSET, i + MAP_OFFSET, sElevatorWindowMetatilesGoingUp[i][data[0] % 3] | MAPGRID_COLLISION_MASK); } } else { for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) MapGridSetMetatileIdAt(j + 1 + MAP_OFFSET, i + MAP_OFFSET, sElevatorWindowMetatilesGoingDown[i][data[0] % 3] | MAPGRID_COLLISION_MASK); } } DrawWholeMapView(); data[1] = 0; if (data[0] == data[3]) DestroyTask(taskId); } data[1]++; } void ListMenu(void) { u8 taskId; struct Task *task; if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE) return; taskId = CreateTask(Task_CreateScriptListMenu, 8); task = &gTasks[taskId]; switch (gSpecialVar_0x8004) { case LISTMENU_BADGES: task->data[0] = 4; task->data[1] = 9; task->data[2] = 1; task->data[3] = 1; task->data[4] = 12; task->data[5] = 7; task->data[6] = 1; task->data[15] = taskId; break; case LISTMENU_SILPHCO_FLOORS: task->data[0] = 7; task->data[1] = 12; task->data[2] = 1; task->data[3] = 1; task->data[4] = 8; task->data[5] = 12; task->data[6] = 0; task->data[15] = taskId; task->data[7] = sElevatorScroll; task->data[8] = sElevatorCursorPos; break; case LISTMENU_ROCKET_HIDEOUT_FLOORS: // Multichoice used instead task->data[0] = 4; task->data[1] = 4; task->data[2] = 1; task->data[3] = 1; task->data[4] = 8; task->data[5] = 8; task->data[6] = 0; task->data[15] = taskId; break; case LISTMENU_DEPT_STORE_FLOORS: // Multichoice used instead task->data[0] = 4; task->data[1] = 6; task->data[2] = 1; task->data[3] = 1; task->data[4] = 8; task->data[5] = 8; task->data[6] = 0; task->data[15] = taskId; break; case LISTMENU_WIRELESS_LECTURE_HEADERS: // Multichoice used instead task->data[0] = 4; task->data[1] = 4; task->data[2] = 1; task->data[3] = 1; task->data[4] = 17; task->data[5] = 8; task->data[6] = 1; task->data[15] = taskId; break; case LISTMENU_BERRY_POWDER: task->data[0] = 7; task->data[1] = 12; task->data[2] = 16; task->data[3] = 1; task->data[4] = 17; task->data[5] = 12; task->data[6] = 0; task->data[15] = taskId; break; case LISTMENU_TRAINER_TOWER_FLOORS: // Mulitchoice used instead task->data[0] = 3; task->data[1] = 3; task->data[2] = 1; task->data[3] = 1; task->data[4] = 8; task->data[5] = 6; task->data[6] = 0; task->data[15] = taskId; break; case LISTMENU_GYM_LEADERS: task->data[0] = 4; task->data[1] = 8; task->data[2] = 1; task->data[3] = 1; task->data[4] = 12; task->data[5] = 7; task->data[6] = 0; task->data[15] = taskId; break; case LISTMENU_MASTER_TRAINER_TITLES: task->data[0] = 7; task->data[1] = 153; task->data[2] = 14; task->data[3] = 1; task->data[4] = 18; task->data[5] = 12; task->data[6] = 0; task->data[15] = taskId; break; case 99: break; default: gSpecialVar_Result = 0x7F; DestroyTask(taskId); break; } } static const u8 *const sListMenuLabels[][12] = { [LISTMENU_BADGES] = { gText_BoulderBadge, gText_CascadeBadge, gText_ThunderBadge, gText_RainbowBadge, gText_SoulBadge, gText_MarshBadge, gText_VolcanoBadge, gText_EarthBadge, gOtherText_Exit, }, [LISTMENU_SILPHCO_FLOORS] = { gText_11F, gText_10F, gText_9F, gText_8F, gText_7F, gText_6F, gText_5F, gText_4F, gText_3F, gText_2F, gText_1F, gOtherText_Exit, }, [LISTMENU_ROCKET_HIDEOUT_FLOORS] = // Unncessary, MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR is used instead { gText_B1F, gText_B2F, gText_B4F, gOtherText_Exit, }, [LISTMENU_DEPT_STORE_FLOORS] = // Unncessary, MULTICHOICE_DEPT_STORE_ELEVATOR is used instead { gText_5F, gText_4F, gText_3F, gText_2F, gText_1F, gOtherText_Exit, }, [LISTMENU_WIRELESS_LECTURE_HEADERS] = // Unnecessary, MULTICHOICE_LINKED_DIRECT_UNION is used instead { gText_LinkedGamePlay, gText_DirectCorner, gText_UnionRoom, gOtherText_Quit, }, [LISTMENU_BERRY_POWDER] = { gText_Energypowder_50, gText_EnergyRoot_80, gText_HealPowder_50, gText_RevivalHerb_300, gText_Protein_1000, gText_Iron_1000, gText_Carbos_1000, gText_Calcium_1000, gText_Zinc_1000, gText_HpUp_1000, gText_PpUp_3000, gOtherText_Exit, }, [LISTMENU_TRAINER_TOWER_FLOORS] = // Unnecessary, MULTICHOICE_ROOFTOP_B1F is used instead { gText_Rooftop, gText_B1F, gOtherText_Exit, }, [LISTMENU_GYM_LEADERS] = { gText_Brock, gText_Misty, gText_LtSurge, gText_Erika, gText_Koga, gText_Sabrina, gText_Blaine, gOtherText_Exit, }, [LISTMENU_MASTER_TRAINER_TITLES] = { gOtherText_Exit, } }; // to figure out how big the title list should be static u32 CountMasterTrainerFlags(void) { u32 i; bool8 flag = TRUE; u32 count = 1; flag = HasTrainerBeenFought(TRAINER_MASTER_OAK); //have all titles if beat Oak if(flag) { count = 153; //max size return count; } for(i = 1; i < 152; i++) //flags start at 1, which is SPECIES_BULBASAUR { flag = CheckMasterTrainerFlag(i); if(flag) { count++; } } return count; } static void Task_CreateScriptListMenu(u8 taskId) { struct WindowTemplate template; u32 i; u32 j; s32 width; s32 mwidth; struct Task *task = &gTasks[taskId]; u8 windowId; u32 listSize; LockPlayerFieldControls(); if (gSpecialVar_0x8004 == LISTMENU_SILPHCO_FLOORS) sListMenuLastScrollPosition = sElevatorScroll; else sListMenuLastScrollPosition = 0; if (gSpecialVar_0x8004 == LISTMENU_MASTER_TRAINER_TITLES) { u32 listSize = CountMasterTrainerFlags(); sListMenuItems = AllocZeroed((listSize + 1) * sizeof(struct ListMenuItem)); task->data[1] = listSize; if(listSize < 7) { task->data[0] = listSize; task->data[5] = (listSize - 1) + listSize; if(listSize == 2) task->data[5]++; } CreateScriptListMenu(); sFieldSpecialsListMenuTemplate.scrollMultiple = 1; mwidth = 0; for (i = 0; i < listSize; i++) { if(i != 0) { for( ; j < 152; j++) //152 because Grand Master is done elsewhere { bool8 flag = TRUE; flag = CheckMasterTrainerFlag(j); if(!flag) continue; else break; } } { // new block because of C90 memes const u8 *text = gTitleNames[j]; sListMenuItems[i].label = text; sListMenuItems[i].index = j; j++; // increment here because the break skips incrementing width = GetStringWidth(2, sListMenuItems[i].label, 0); if (width > mwidth) mwidth = width; } } if(listSize == 153) // Grand Master handling because it doesn't use a regular Master Trainer flag { const u8 *text = gTitleNames[listSize - 1]; sListMenuItems[i].label = text; sListMenuItems[i].index = listSize - 1; width = GetStringWidth(2, sListMenuItems[listSize - 1].label, 0); if (width > mwidth) mwidth = width; } } else { sListMenuItems = AllocZeroed(task->data[1] * sizeof(struct ListMenuItem)); CreateScriptListMenu(); mwidth = 0; for (i = 0; i < task->data[1]; i++) { sListMenuItems[i].label = sListMenuLabels[gSpecialVar_0x8004][i]; sListMenuItems[i].index = i; width = GetStringWidth(FONT_NORMAL, sListMenuItems[i].label, 0); if (width > mwidth) mwidth = width; } } task->data[4] = (mwidth + 9) / 8 + 1; if (task->data[2] + task->data[4] > 29) task->data[2] = 29 - task->data[4]; template = SetWindowTemplateFields(0, task->data[2], task->data[3], task->data[4], task->data[5], 15, 0x038); task->data[13] = windowId = AddWindow(&template); SetStdWindowBorderStyle(task->data[13], 0); sFieldSpecialsListMenuTemplate.totalItems = task->data[1]; sFieldSpecialsListMenuTemplate.maxShowed = task->data[0]; sFieldSpecialsListMenuTemplate.windowId = task->data[13]; Task_CreateMenuRemoveScrollIndicatorArrowPair(taskId); task->data[14] = ListMenuInit(&sFieldSpecialsListMenuTemplate, task->data[7], task->data[8]); PutWindowTilemap(task->data[13]); CopyWindowToVram(task->data[13], COPYWIN_FULL); gTasks[taskId].func = Task_ListMenuHandleInput; } static void CreateScriptListMenu(void) { sFieldSpecialsListMenuTemplate.items = sListMenuItems; sFieldSpecialsListMenuTemplate.moveCursorFunc = ScriptListMenuMoveCursorFunction; sFieldSpecialsListMenuTemplate.itemPrintFunc = NULL; sFieldSpecialsListMenuTemplate.totalItems = 1; sFieldSpecialsListMenuTemplate.maxShowed = 1; sFieldSpecialsListMenuTemplate.windowId = 0; sFieldSpecialsListMenuTemplate.header_X = 0; sFieldSpecialsListMenuTemplate.item_X = 8; sFieldSpecialsListMenuTemplate.cursor_X = 0; sFieldSpecialsListMenuTemplate.upText_Y = 0; sFieldSpecialsListMenuTemplate.cursorPal = 2; sFieldSpecialsListMenuTemplate.fillValue = 1; sFieldSpecialsListMenuTemplate.cursorShadowPal = 3; sFieldSpecialsListMenuTemplate.lettersSpacing = 1; sFieldSpecialsListMenuTemplate.itemVerticalPadding = 0; sFieldSpecialsListMenuTemplate.scrollMultiple = 0; sFieldSpecialsListMenuTemplate.fontId = FONT_NORMAL; sFieldSpecialsListMenuTemplate.cursorKind = 0; } static void ScriptListMenuMoveCursorFunction(s32 nothing, bool8 is, struct ListMenu * used) { u8 taskId; struct Task *task; PlaySE(SE_SELECT); taskId = FindTaskIdByFunc(Task_ListMenuHandleInput); if (taskId != 0xFF) { task = &gTasks[taskId]; ListMenuGetScrollAndRow(task->data[14], &sFieldSpecialsListMenuScrollBuffer, NULL); sListMenuLastScrollPosition = sFieldSpecialsListMenuScrollBuffer; } } static void Task_ListMenuHandleInput(u8 taskId) { s32 input; struct Task *task; task = &gTasks[taskId]; task++;task--; input = ListMenu_ProcessInput(task->data[14]); switch (input) { case -1: break; case -2: if (gSpecialVar_0x8004 == LISTMENU_MASTER_TRAINER_TITLES) gSpecialVar_Result = 153; else gSpecialVar_Result = 0x7F; PlaySE(SE_SELECT); Task_DestroyListMenu(taskId); break; default: gSpecialVar_Result = input; PlaySE(SE_SELECT); if (task->data[6] == 0 || input == task->data[1] - 1) { Task_DestroyListMenu(taskId); } else { Task_ListMenuRemoveScrollIndicatorArrowPair(taskId); task->func = Task_SuspendListMenu; ScriptContext_Enable(); } break; } } static void Task_DestroyListMenu(u8 taskId) { struct Task *task = &gTasks[taskId]; Task_ListMenuRemoveScrollIndicatorArrowPair(taskId); DestroyListMenuTask(task->data[14], NULL, NULL); Free(sListMenuItems); ClearStdWindowAndFrameToTransparent(task->data[13], TRUE); FillWindowPixelBuffer(task->data[13], PIXEL_FILL(0)); ClearWindowTilemap(task->data[13]); CopyWindowToVram(task->data[13], COPYWIN_GFX); RemoveWindow(task->data[13]); DestroyTask(taskId); ScriptContext_Enable(); } static void Task_SuspendListMenu(u8 taskId) { switch (gTasks[taskId].data[6]) { case 1: break; case 2: gTasks[taskId].data[6] = 1; gTasks[taskId].func = Task_RedrawScrollArrowsAndWaitInput; break; } } void ReturnToListMenu(void) { u8 taskId = FindTaskIdByFunc(Task_SuspendListMenu); if (taskId == 0xFF) ScriptContext_Enable(); else gTasks[taskId].data[6]++; } static void Task_RedrawScrollArrowsAndWaitInput(u8 taskId) { LockPlayerFieldControls(); Task_CreateMenuRemoveScrollIndicatorArrowPair(taskId); gTasks[taskId].func = Task_ListMenuHandleInput; } static void Task_CreateMenuRemoveScrollIndicatorArrowPair(u8 taskId) { struct Task *task = &gTasks[taskId]; struct ScrollArrowsTemplate template = { .firstArrowType = 2, .secondArrowType = 3, .tileTag = 2000, .palTag = 100 }; if (task->data[0] != task->data[1]) { template.firstX = 4 * task->data[4] + 8 * task->data[2]; template.firstY = 8; template.secondX = 4 * task->data[4] + 8 * task->data[2]; template.secondY = 8 * task->data[5] + 10; template.fullyUpThreshold = 0; template.fullyDownThreshold = task->data[1] - task->data[0]; task->data[12] = AddScrollIndicatorArrowPair(&template, &sListMenuLastScrollPosition); } } static void Task_ListMenuRemoveScrollIndicatorArrowPair(u8 taskId) { struct Task *task = &gTasks[taskId]; if (task->data[0] != task->data[1]) RemoveScrollIndicatorArrowPair(task->data[12]); } void ForcePlayerToStartSurfing(void) { SetHelpContext(HELPCONTEXT_SURFING); SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_SURFING); } static const u16 sStarterSpecies[] = { SPECIES_BULBASAUR, SPECIES_SQUIRTLE, SPECIES_CHARMANDER }; static u16 GetStarterSpeciesById(u16 idx) { if (idx >= NELEMS(sStarterSpecies)) idx = 0; return sStarterSpecies[idx]; } u16 GetStarterSpecies(void) { return GetStarterSpeciesById(VarGet(VAR_STARTER_MON)); } void SetSeenMon(void) { GetSetPokedexFlag(SpeciesToNationalPokedexNum(gSpecialVar_0x8004), 2); } void ResetContextNpcTextColor(void) { gSelectedObjectEvent = 0; gSpecialVar_TextColor = NPC_TEXT_COLOR_DEFAULT; } u8 ContextNpcGetTextColor(void) { u8 gfxId; if (gSpecialVar_TextColor != NPC_TEXT_COLOR_DEFAULT) { // A text color has been specified, use that return gSpecialVar_TextColor; } else if (gSelectedObjectEvent == 0) { // No text color specified and no object selected, use neutral return NPC_TEXT_COLOR_NEUTRAL; } else { // An object is selected and no color has been specified. // Use the text color normally associated with this object's sprite. gfxId = gObjectEvents[gSelectedObjectEvent].graphicsId; if (gfxId >= OBJ_EVENT_GFX_VAR_0) gfxId = VarGetObjectEventGraphicsId(gfxId - OBJ_EVENT_GFX_VAR_0); return GetColorFromTextColorTable(gfxId); } } static bool8 HasMonBeenRenamed(u8 idx) { struct Pokemon * pokemon = &gPlayerParty[idx]; u8 language; GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); language = GetMonData(pokemon, MON_DATA_LANGUAGE, &language); if (language != LANGUAGE_ENGLISH) return TRUE; else if (StringCompare(gSpeciesNames[GetMonData(pokemon, MON_DATA_SPECIES, NULL)], gStringVar1) != 0) return TRUE; else return FALSE; } bool8 HasLeadMonBeenRenamed(void) { return HasMonBeenRenamed(GetLeadMonIndex()); } void TV_PrintIntToStringVar(u8 varidx, s32 number) { s32 n = CountDigits(number); ConvertIntToDecimalStringN(sStringVarPtrs[varidx], number, STR_CONV_MODE_LEFT_ALIGN, n); } s32 CountDigits(s32 number) { if (number / 10 == 0) return 1; else if (number / 100 == 0) return 2; else if (number / 1000 == 0) return 3; else if (number / 10000 == 0) return 4; else if (number / 100000 == 0) return 5; else if (number / 1000000 == 0) return 6; else if (number / 10000000 == 0) return 7; else if (number / 100000000 == 0) return 8; else return 1; } bool8 NameRaterWasNicknameChanged(void) { struct Pokemon * pokemon = &gPlayerParty[gSpecialVar_0x8004]; GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); if (StringCompare(gStringVar3, gStringVar1) == 0) return FALSE; else return TRUE; } void ChangeBoxPokemonNickname(void) { struct BoxPokemon * pokemon = GetBoxedMonPtr(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos); u16 species; u8 gender; u32 personality; GetBoxMonData(pokemon, MON_DATA_NICKNAME, gStringVar3); GetBoxMonData(pokemon, MON_DATA_NICKNAME, gStringVar2); species = GetBoxMonData(pokemon, MON_DATA_SPECIES, NULL); gender = GetBoxMonGender(pokemon); personality = GetBoxMonData(pokemon, MON_DATA_PERSONALITY, NULL); DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar2, species, gender, personality, ChangeBoxPokemonNickname_CB); } static void ChangeBoxPokemonNickname_CB(void) { SetBoxMonNickAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2); CB2_ReturnToFieldContinueScriptPlayMapMusic(); } void ChangePokemonNickname(void) { u16 species; u8 gender; u32 personality; GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3); GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2); species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL); gender = GetMonGender(&gPlayerParty[gSpecialVar_0x8004]); personality = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_PERSONALITY, NULL); DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar2, species, gender, personality, ChangePokemonNickname_CB); } static void ChangePokemonNickname_CB(void) { SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2); CB2_ReturnToFieldContinueScriptPlayMapMusic(); } void BufferMonNickname(void) { GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1); StringGet_Nickname(gStringVar1); } void IsMonOTIDNotPlayers(void) { if (GetPlayerTrainerId() == GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_ID, NULL)) gSpecialVar_Result = FALSE; else gSpecialVar_Result = TRUE; } u32 GetPlayerTrainerId(void) { return (gSaveBlock2Ptr->playerTrainerId[3] << 24) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]; } u8 GetUnlockedSeviiAreas(void) { u8 result = 0; if (FlagGet(FLAG_WORLD_MAP_ONE_ISLAND) == TRUE) result |= 1 << 0; if (FlagGet(FLAG_WORLD_MAP_TWO_ISLAND) == TRUE) result |= 1 << 1; if (FlagGet(FLAG_WORLD_MAP_THREE_ISLAND) == TRUE) result |= 1 << 2; if (FlagGet(FLAG_WORLD_MAP_FOUR_ISLAND) == TRUE) result |= 1 << 3; if (FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND) == TRUE) result |= 1 << 4; if (FlagGet(FLAG_WORLD_MAP_SIX_ISLAND) == TRUE) result |= 1 << 5; if (FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND) == TRUE) result |= 1 << 6; return result; } void UpdateTrainerCardPhotoIcons(void) { u16 species[PARTY_SIZE]; u32 personality[PARTY_SIZE]; u32 i; u8 partyCount; for (i = 0; i < PARTY_SIZE; i++) species[i] = SPECIES_NONE; partyCount = CalculatePlayerPartyCount(); for (i = 0; i < partyCount; i++) { species[i] = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL); personality[i] = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY, NULL); } VarSet(VAR_TRAINER_CARD_MON_ICON_1, SpeciesToMailSpecies(species[0], personality[0])); VarSet(VAR_TRAINER_CARD_MON_ICON_2, SpeciesToMailSpecies(species[1], personality[1])); VarSet(VAR_TRAINER_CARD_MON_ICON_3, SpeciesToMailSpecies(species[2], personality[2])); VarSet(VAR_TRAINER_CARD_MON_ICON_4, SpeciesToMailSpecies(species[3], personality[3])); VarSet(VAR_TRAINER_CARD_MON_ICON_5, SpeciesToMailSpecies(species[4], personality[4])); VarSet(VAR_TRAINER_CARD_MON_ICON_6, SpeciesToMailSpecies(species[5], personality[5])); VarSet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX, gSpecialVar_0x8004); } u16 StickerManGetBragFlags(void) { u16 result = 0; u32 numEggs; gSpecialVar_0x8004 = GetGameStat(GAME_STAT_ENTERED_HOF); numEggs = GetGameStat(GAME_STAT_HATCHED_EGGS); gSpecialVar_0x8006 = GetGameStat(GAME_STAT_LINK_BATTLE_WINS); if (numEggs > 0xFFFF) gSpecialVar_0x8005 = 0xFFFF; else gSpecialVar_0x8005 = numEggs; if (gSpecialVar_0x8004 != 0) result |= 1 << 0; if (gSpecialVar_0x8005 != 0) result |= 1 << 1; if (gSpecialVar_0x8006 != 0) result |= 1 << 2; return result; } u16 GetHiddenItemAttr(u32 hiddenItem, u8 attr) { if (attr == HIDDEN_ITEM_ITEM) return GET_HIDDEN_ITEM_ITEM(hiddenItem); else if (attr == HIDDEN_ITEM_FLAG) return GET_HIDDEN_ITEM_FLAG(hiddenItem) + FLAG_HIDDEN_ITEMS_START; else if (attr == HIDDEN_ITEM_QUANTITY) return GET_HIDDEN_ITEM_QUANTITY(hiddenItem); else if (attr == HIDDEN_ITEM_UNDERFOOT) return GET_HIDDEN_ITEM_UNDERFOOT(hiddenItem); else // Invalid return 1; } bool8 DoesPlayerPartyContainSpecies(void) { u8 partyCount = CalculatePlayerPartyCount(); u32 i; for (i = 0; i < partyCount; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) == gSpecialVar_0x8004) return TRUE; } return FALSE; } static const u8 sMartMaps[][3] = { {MAP(VIRIDIAN_CITY_MART), 1}, {MAP(PEWTER_CITY_MART), 3}, {MAP(CERULEAN_CITY_MART), 1}, {MAP(LAVENDER_TOWN_MART), 1}, {MAP(VERMILION_CITY_MART), 1}, {MAP(FUCHSIA_CITY_MART), 1}, {MAP(CINNABAR_ISLAND_MART), 1}, {MAP(SAFFRON_CITY_MART), 1}, {MAP(THREE_ISLAND_MART), 1}, {MAP(FOUR_ISLAND_MART), 1}, {MAP(SEVEN_ISLAND_MART), 1}, {MAP(SIX_ISLAND_MART), 1} }; u8 GetMartClerkObjectId(void) { u32 i; for (i = 0; i < NELEMS(sMartMaps); i++) { if (gSaveBlock1Ptr->location.mapGroup == sMartMaps[i][0] && gSaveBlock1Ptr->location.mapNum == sMartMaps[i][1]) return sMartMaps[i][2]; } return 1; } void SetUsedPkmnCenterQuestLogEvent(void) { SetQuestLogEvent(QL_EVENT_USED_PKMN_CENTER, NULL); } static const struct { u16 inside_grp; u16 inside_num; u16 outside_grp; u16 outside_num; } sInsideOutsidePairs[] = { [QL_LOCATION_HOME] = {MAP(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP(PALLET_TOWN)}, [QL_LOCATION_OAKS_LAB] = {MAP(PALLET_TOWN_PROFESSOR_OAKS_LAB), MAP(PALLET_TOWN)}, [QL_LOCATION_VIRIDIAN_GYM] = {MAP(VIRIDIAN_CITY_GYM), MAP(VIRIDIAN_CITY)}, [QL_LOCATION_LEAGUE_GATE_1] = {MAP(ROUTE22_NORTH_ENTRANCE), MAP(ROUTE22)}, [QL_LOCATION_LEAGUE_GATE_2] = {MAP(ROUTE22_NORTH_ENTRANCE), MAP(ROUTE23)}, [QL_LOCATION_VIRIDIAN_FOREST_1] = {MAP(VIRIDIAN_FOREST), MAP(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE)}, [QL_LOCATION_VIRIDIAN_FOREST_2] = {MAP(VIRIDIAN_FOREST), MAP(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE)}, [QL_LOCATION_PEWTER_MUSEUM] = {MAP(PEWTER_CITY_MUSEUM_1F), MAP(PEWTER_CITY)}, [QL_LOCATION_PEWTER_GYM] = {MAP(PEWTER_CITY_GYM), MAP(PEWTER_CITY)}, [QL_LOCATION_MT_MOON_1] = {MAP(MT_MOON_1F), MAP(ROUTE4)}, [QL_LOCATION_MT_MOON_2] = {MAP(MT_MOON_B1F), MAP(ROUTE4)}, [QL_LOCATION_CERULEAN_GYM] = {MAP(CERULEAN_CITY_GYM), MAP(CERULEAN_CITY)}, [QL_LOCATION_BIKE_SHOP] = {MAP(CERULEAN_CITY_BIKE_SHOP), MAP(CERULEAN_CITY)}, [QL_LOCATION_BILLS_HOUSE] = {MAP(ROUTE25_SEA_COTTAGE), MAP(ROUTE25)}, [QL_LOCATION_DAY_CARE] = {MAP(ROUTE5_POKEMON_DAY_CARE), MAP(ROUTE5)}, [QL_LOCATION_UNDERGROUND_PATH_1] = {MAP(UNDERGROUND_PATH_NORTH_ENTRANCE), MAP(ROUTE5)}, [QL_LOCATION_UNDERGROUND_PATH_2] = {MAP(UNDERGROUND_PATH_SOUTH_ENTRANCE), MAP(ROUTE6)}, [QL_LOCATION_PKMN_FAN_CLUB] = {MAP(VERMILION_CITY_POKEMON_FAN_CLUB), MAP(VERMILION_CITY)}, [QL_LOCATION_VERMILION_GYM] = {MAP(VERMILION_CITY_GYM), MAP(VERMILION_CITY)}, [QL_LOCATION_SS_ANNE] = {MAP(SSANNE_1F_CORRIDOR), MAP(VERMILION_CITY)}, [QL_LOCATION_DIGLETTS_CAVE_1] = {MAP(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP(ROUTE2)}, [QL_LOCATION_DIGLETTS_CAVE_2] = {MAP(DIGLETTS_CAVE_SOUTH_ENTRANCE), MAP(ROUTE11)}, [QL_LOCATION_ROCK_TUNNEL_1] = {MAP(ROCK_TUNNEL_1F), MAP(ROUTE10)}, [QL_LOCATION_ROCK_TUNNEL_2] = {MAP(ROCK_TUNNEL_1F), MAP(ROUTE10)}, [QL_LOCATION_POWER_PLANT] = {MAP(POWER_PLANT), MAP(ROUTE10)}, [QL_LOCATION_PKMN_TOWER] = {MAP(POKEMON_TOWER_1F), MAP(LAVENDER_TOWN)}, [QL_LOCATION_VOLUNTEER_HOUSE] = {MAP(LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE), MAP(LAVENDER_TOWN)}, [QL_LOCATION_NAME_RATERS_HOUSE] = {MAP(LAVENDER_TOWN_HOUSE2), MAP(LAVENDER_TOWN)}, [QL_LOCATION_UNDERGROUND_PATH_3] = {MAP(UNDERGROUND_PATH_EAST_ENTRANCE), MAP(ROUTE8)}, [QL_LOCATION_UNDERGROUND_PATH_4] = {MAP(UNDERGROUND_PATH_WEST_ENTRANCE), MAP(ROUTE7)}, [QL_LOCATION_CELADON_DEPT_STORE] = {MAP(CELADON_CITY_DEPARTMENT_STORE_1F), MAP(CELADON_CITY)}, [QL_LOCATION_CELADON_MANSION] = {MAP(CELADON_CITY_CONDOMINIUMS_1F), MAP(CELADON_CITY)}, [QL_LOCATION_GAME_CORNER] = {MAP(CELADON_CITY_GAME_CORNER), MAP(CELADON_CITY)}, [QL_LOCATION_CELADON_GYM] = {MAP(CELADON_CITY_GYM), MAP(CELADON_CITY)}, [QL_LOCATION_CELADON_RESTAURANT] = {MAP(CELADON_CITY_RESTAURANT), MAP(CELADON_CITY)}, [QL_LOCATION_ROCKET_HIDEOUT] = {MAP(ROCKET_HIDEOUT_B1F), MAP(CELADON_CITY_GAME_CORNER)}, [QL_LOCATION_SAFARI_ZONE] = {MAP(SAFARI_ZONE_CENTER), MAP(FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE)}, [QL_LOCATION_FUCHSIA_GYM] = {MAP(FUCHSIA_CITY_GYM), MAP(FUCHSIA_CITY)}, [QL_LOCATION_WARDENS_HOME] = {MAP(FUCHSIA_CITY_WARDENS_HOUSE), MAP(FUCHSIA_CITY)}, [QL_LOCATION_FIGHTING_DOJO] = {MAP(SAFFRON_CITY_DOJO), MAP(SAFFRON_CITY)}, [QL_LOCATION_SAFFRON_GYM] = {MAP(SAFFRON_CITY_GYM), MAP(SAFFRON_CITY)}, [QL_LOCATION_SILPH_CO] = {MAP(SILPH_CO_1F), MAP(SAFFRON_CITY)}, [QL_LOCATION_SEAFOAM_ISLANDS_1] = {MAP(SEAFOAM_ISLANDS_1F), MAP(ROUTE20)}, [QL_LOCATION_SEAFOAM_ISLANDS_2] = {MAP(SEAFOAM_ISLANDS_1F), MAP(ROUTE20)}, [QL_LOCATION_PKMN_MANSION] = {MAP(POKEMON_MANSION_1F), MAP(CINNABAR_ISLAND)}, [QL_LOCATION_CINNABAR_GYM] = {MAP(CINNABAR_ISLAND_GYM), MAP(CINNABAR_ISLAND)}, [QL_LOCATION_CINNABAR_LAB] = {MAP(CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE), MAP(CINNABAR_ISLAND)}, [QL_LOCATION_VICTORY_ROAD_1] = {MAP(VICTORY_ROAD_1F), MAP(ROUTE23)}, [QL_LOCATION_VICTORY_ROAD_2] = {MAP(VICTORY_ROAD_2F), MAP(ROUTE23)}, [QL_LOCATION_PKMN_LEAGUE] = {MAP(INDIGO_PLATEAU_POKEMON_CENTER_1F), MAP(INDIGO_PLATEAU_EXTERIOR)}, [QL_LOCATION_CERULEAN_CAVE] = {MAP(CERULEAN_CAVE_1F), MAP(CERULEAN_CITY)} }; void QuestLog_CheckDepartingIndoorsMap(void) { u32 i; for (i = 0; i < NELEMS(sInsideOutsidePairs); i++) { if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[i].inside_grp && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[i].inside_num) { if (VarGet(VAR_QL_ENTRANCE) != QL_LOCATION_ROCKET_HIDEOUT || i != QL_LOCATION_GAME_CORNER) { VarSet(VAR_QL_ENTRANCE, i); FlagSet(FLAG_SYS_QL_DEPARTED); } break; } } } void QuestLog_TryRecordDepartedLocation(void) { s16 x, y; struct QuestLogEvent_Departed data; u16 locationId = VarGet(VAR_QL_ENTRANCE); data.mapSec = 0; data.locationId = 0; if (FlagGet(FLAG_SYS_QL_DEPARTED)) { if (locationId == QL_LOCATION_VIRIDIAN_FOREST_1) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE))) { data.mapSec = MAPSEC_ROUTE_2; if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE)) data.locationId = locationId; else data.locationId = locationId + 1; SetQuestLogEvent(QL_EVENT_DEPARTED, (const u16 *)&data); FlagClear(FLAG_SYS_QL_DEPARTED); return; } } else if (locationId == QL_LOCATION_LEAGUE_GATE_1) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE22) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE23))) { data.mapSec = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[locationId].inside_grp, sInsideOutsidePairs[locationId].inside_num)->regionMapSectionId; if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22)) data.locationId = locationId; else data.locationId = locationId + 1; SetQuestLogEvent(QL_EVENT_DEPARTED, (const u16 *)&data); FlagClear(FLAG_SYS_QL_DEPARTED); return; } } if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[locationId].outside_grp && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[locationId].outside_num) { data.mapSec = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[locationId].inside_grp, sInsideOutsidePairs[locationId].inside_num)->regionMapSectionId; data.locationId = locationId; if (locationId == QL_LOCATION_ROCK_TUNNEL_1) { PlayerGetDestCoords(&x, &y); if (x != 15 || y != 26) data.locationId++; } else if (locationId == QL_LOCATION_SEAFOAM_ISLANDS_1) { PlayerGetDestCoords(&x, &y); if (x != 67 || y != 15) data.locationId++; } SetQuestLogEvent(QL_EVENT_DEPARTED, (const u16 *)&data); FlagClear(FLAG_SYS_QL_DEPARTED); if (locationId == QL_LOCATION_ROCKET_HIDEOUT) { VarSet(VAR_QL_ENTRANCE, QL_LOCATION_GAME_CORNER); FlagSet(FLAG_SYS_QL_DEPARTED); } } } } u16 GetMysteryGiftCardStat(void) { switch (gSpecialVar_Result) { case GET_NUM_STAMPS: return MysteryGift_GetCardStat(CARD_STAT_NUM_STAMPS); case GET_MAX_STAMPS: return MysteryGift_GetCardStat(CARD_STAT_MAX_STAMPS); case GET_CARD_BATTLES_WON: return MysteryGift_GetCardStat(CARD_STAT_BATTLES_WON); case GET_CARD_BATTLES_LOST: return MysteryGift_GetCardStat(CARD_STAT_BATTLES_LOST); case GET_CARD_NUM_TRADES: return MysteryGift_GetCardStat(CARD_STAT_NUM_TRADES); default: AGB_ASSERT_EX(0, ABSPATH("scr_tool.c"), 3873); return 0; } } void SetPCBoxToSendMon(u8 boxId) { sPCBoxToSendMon = boxId; } u16 GetPCBoxToSendMon(void) { return sPCBoxToSendMon; } bool8 ShouldShowBoxWasFullMessage(void) { if (FlagGet(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE)) return FALSE; if (StorageGetCurrentBox() == VarGet(VAR_PC_BOX_TO_SEND_MON)) return FALSE; FlagSet(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE); return TRUE; } bool8 IsDestinationBoxFull(void) { s32 i; s32 j; SetPCBoxToSendMon(VarGet(VAR_PC_BOX_TO_SEND_MON)); i = StorageGetCurrentBox(); do { for (j = 0; j < IN_BOX_COUNT; j++) { if (GetBoxMonData(GetBoxedMonPtr(i, j), MON_DATA_SPECIES, NULL) == SPECIES_NONE) { if (GetPCBoxToSendMon() != i) FlagClear(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE); VarSet(VAR_PC_BOX_TO_SEND_MON, i); return ShouldShowBoxWasFullMessage(); } } i++; if (i == TOTAL_BOXES_COUNT) i = 0; } while (i != StorageGetCurrentBox()); return FALSE; } const u16 sPokeCenter1FMaps[] = { MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F, MAP_PEWTER_CITY_POKEMON_CENTER_1F, MAP_CERULEAN_CITY_POKEMON_CENTER_1F, MAP_LAVENDER_TOWN_POKEMON_CENTER_1F, MAP_VERMILION_CITY_POKEMON_CENTER_1F, MAP_CELADON_CITY_POKEMON_CENTER_1F, MAP_FUCHSIA_CITY_POKEMON_CENTER_1F, MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F, MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F, MAP_SAFFRON_CITY_POKEMON_CENTER_1F, MAP_ROUTE4_POKEMON_CENTER_1F, MAP_ROUTE10_POKEMON_CENTER_1F, MAP_ONE_ISLAND_POKEMON_CENTER_1F, MAP_TWO_ISLAND_POKEMON_CENTER_1F, MAP_THREE_ISLAND_POKEMON_CENTER_1F, MAP_FOUR_ISLAND_POKEMON_CENTER_1F, MAP_FIVE_ISLAND_POKEMON_CENTER_1F, MAP_SEVEN_ISLAND_POKEMON_CENTER_1F, MAP_SIX_ISLAND_POKEMON_CENTER_1F, MAP_UNION_ROOM, MAP_UNDEFINED }; bool8 UsedPokemonCenterWarp(void) { s32 i; u16 mapno = (gLastUsedWarp.mapGroup << 8) + gLastUsedWarp.mapNum; for (i = 0; sPokeCenter1FMaps[i] != MAP_UNDEFINED; i++) { if (sPokeCenter1FMaps[i] == mapno) return TRUE; } return FALSE; } bool8 BufferTMHMMoveName(void) { // 8004 = item ID if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08) { StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_0x8004)]); return TRUE; } else return FALSE; } void RunMassageCooldownStepCounter(void) { u16 count = VarGet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER); if (count < 500) VarSet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER, count + 1); } void DaisyMassageServices(void) { AdjustFriendship(&gPlayerParty[gSpecialVar_0x8004], FRIENDSHIP_EVENT_MASSAGE); VarSet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER, 0); } static const u16 sEliteFourLightingPalettes[][16] = { INCBIN_U16("graphics/field_specials/elite_four_lighting_0.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_1.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_2.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_3.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_4.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_5.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_6.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_7.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_8.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_9.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_10.gbapal"), INCBIN_U16("graphics/field_specials/elite_four_lighting_11.gbapal") }; static const u16 sChampionRoomLightingPalettes[][16] = { INCBIN_U16("graphics/field_specials/champion_room_lighting_0.gbapal"), INCBIN_U16("graphics/field_specials/champion_room_lighting_1.gbapal"), INCBIN_U16("graphics/field_specials/champion_room_lighting_2.gbapal"), INCBIN_U16("graphics/field_specials/champion_room_lighting_3.gbapal"), INCBIN_U16("graphics/field_specials/champion_room_lighting_4.gbapal"), INCBIN_U16("graphics/field_specials/champion_room_lighting_5.gbapal"), INCBIN_U16("graphics/field_specials/champion_room_lighting_6.gbapal"), INCBIN_U16("graphics/field_specials/champion_room_lighting_7.gbapal"), INCBIN_U16("graphics/field_specials/champion_room_lighting_8.gbapal") }; static const u8 sEliteFourLightingTimers[] = { 40, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static const u8 sChampionRoomLightingTimers[] = { 20, 8, 8, 8, 8, 8, 8, 8 }; void DoPokemonLeagueLightingEffect(void) { u8 taskId = CreateTask(Task_RunPokemonLeagueLightingEffect, 8); s16 *data = gTasks[taskId].data; if (FlagGet(FLAG_TEMP_3) == TRUE) { gTasks[taskId].func = Task_CancelPokemonLeagueLightingEffect; } else { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM)) { data[0] = sChampionRoomLightingTimers[0]; data[2] = 8; LoadPalette(sChampionRoomLightingPalettes[0], BG_PLTT_ID(7), PLTT_SIZE_4BPP); } else { data[0] = sEliteFourLightingTimers[0]; data[2] = 11; LoadPalette(sEliteFourLightingPalettes[0], BG_PLTT_ID(7), PLTT_SIZE_4BPP); } data[1] = 0; ApplyGlobalTintToPaletteSlot(7, 1); } } static void Task_RunPokemonLeagueLightingEffect(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active && FlagGet(FLAG_TEMP_2) != FALSE && FlagGet(FLAG_TEMP_5) != TRUE && gGlobalFieldTintMode != QL_TINT_BACKUP_GRAYSCALE && --data[0] == 0 ) { if (++data[1] == data[2]) data[1] = 0; if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM)) { data[0] = sChampionRoomLightingTimers[data[1]]; LoadPalette(sChampionRoomLightingPalettes[data[1]], BG_PLTT_ID(7), PLTT_SIZE_4BPP); } else { data[0] = sEliteFourLightingTimers[data[1]]; LoadPalette(sEliteFourLightingPalettes[data[1]], BG_PLTT_ID(7), PLTT_SIZE_4BPP); } ApplyGlobalTintToPaletteSlot(7, 1); } } static void Task_CancelPokemonLeagueLightingEffect(u8 taskId) { s16 *data = gTasks[taskId].data; if (FlagGet(FLAG_TEMP_4) != FALSE) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM)) LoadPalette(sChampionRoomLightingPalettes[8], BG_PLTT_ID(7), PLTT_SIZE_4BPP); else LoadPalette(sEliteFourLightingPalettes[11], BG_PLTT_ID(7), PLTT_SIZE_4BPP); ApplyGlobalTintToPaletteSlot(7, 1); if (gPaletteFade.active) { BlendPalettes(0x00000080, 16, RGB_BLACK); } DestroyTask(taskId); } } void StopPokemonLeagueLightingEffectTask(void) { if (FuncIsActiveTask(Task_RunPokemonLeagueLightingEffect) == TRUE) { DestroyTask(FindTaskIdByFunc(Task_RunPokemonLeagueLightingEffect)); } } static const u8 sCapeBrinkCompatibleSpecies[] = { SPECIES_VENUSAUR, SPECIES_CHARIZARD, SPECIES_BLASTOISE }; bool8 CapeBrinkGetMoveToTeachLeadPokemon(void) { // Returns: // 8005 = Move tutor index // 8006 = Num moves known by lead mon // 8007 = Index of lead mon // to specialvar = whether a move can be taught in the first place u8 tutorMonId = 0; u8 numMovesKnown = 0; u8 leadMonSlot = GetLeadMonIndex(); u32 i; gSpecialVar_0x8007 = leadMonSlot; for (i = 0; i < NELEMS(sCapeBrinkCompatibleSpecies); i++) { if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_SPECIES_OR_EGG, NULL) == sCapeBrinkCompatibleSpecies[i]) { tutorMonId = i; break; } } if (i == NELEMS(sCapeBrinkCompatibleSpecies)) return FALSE; if (tutorMonId == 0) { StringCopy(gStringVar2, gMoveNames[MOVE_FRENZY_PLANT]); gSpecialVar_0x8005 = MOVETUTOR_FRENZY_PLANT; } else if (tutorMonId == 1) { StringCopy(gStringVar2, gMoveNames[MOVE_BLAST_BURN]); gSpecialVar_0x8005 = MOVETUTOR_BLAST_BURN; } else { StringCopy(gStringVar2, gMoveNames[MOVE_HYDRO_CANNON]); gSpecialVar_0x8005 = MOVETUTOR_HYDRO_CANNON; } if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE1) != MOVE_NONE) numMovesKnown++; if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE2) != MOVE_NONE) numMovesKnown++; if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE3) != MOVE_NONE) numMovesKnown++; if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE4) != MOVE_NONE) numMovesKnown++; gSpecialVar_0x8006 = numMovesKnown; return TRUE; } bool8 HasLearnedAllMovesFromCapeBrinkTutor(void) { // 8005 is set by CapeBrinkGetMoveToTeachLeadPokemon u8 r4 = 0; if (gSpecialVar_0x8005 == MOVETUTOR_FRENZY_PLANT) FlagSet(FLAG_TUTOR_FRENZY_PLANT); else if (gSpecialVar_0x8005 == MOVETUTOR_BLAST_BURN) FlagSet(FLAG_TUTOR_BLAST_BURN); else FlagSet(FLAG_TUTOR_HYDRO_CANNON); if (FlagGet(FLAG_TUTOR_FRENZY_PLANT) == TRUE) r4++; if (FlagGet(FLAG_TUTOR_BLAST_BURN) == TRUE) r4++; if (FlagGet(FLAG_TUTOR_HYDRO_CANNON) == TRUE) r4++; if (r4 == 3) return TRUE; else return FALSE; } bool8 CutMoveRuinValleyCheck(void) { if (FlagGet(FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE) != TRUE && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SIX_ISLAND_RUIN_VALLEY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_RUIN_VALLEY) && gSaveBlock1Ptr->pos.x == 24 && gSaveBlock1Ptr->pos.y == 25 && GetPlayerFacingDirection() == DIR_NORTH ) return TRUE; else return FALSE; } void CutMoveOpenDottedHoleDoor(void) { MapGridSetMetatileIdAt(31, 31, METATILE_SeviiIslands67_DottedHoleDoor_Open); DrawWholeMapView(); PlaySE(SE_BANG); FlagSet(FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE); UnlockPlayerFieldControls(); } static const u16 sDeoxysObjectPals[][16] = { INCBIN_U16("graphics/field_specials/deoxys_rock_0.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_1.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_2.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_3.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_4.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_5.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_6.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_7.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_8.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_9.gbapal"), INCBIN_U16("graphics/field_specials/deoxys_rock_10.gbapal") }; static const u8 sDeoxysCoords[][2] = { {15, 12}, {11, 14}, {15, 8}, {19, 14}, {12, 11}, {18, 11}, {15, 14}, {11, 14}, {19, 14}, {15, 15}, {15, 10} }; static const u8 sDeoxysStepCaps[] = { 4, 8, 8, 8, 4, 4, 4, 6, 3, 3 }; void DoDeoxysTriangleInteraction(void) { CreateTask(Task_DoDeoxysTriangleInteraction, 8); } static void Task_DoDeoxysTriangleInteraction(u8 taskId) { u16 r5; u16 r6; if (FlagGet(FLAG_SYS_DEOXYS_AWAKENED) == TRUE) { gSpecialVar_Result = 3; ScriptContext_Enable(); DestroyTask(taskId); } else { r5 = VarGet(VAR_DEOXYS_INTERACTION_NUM); r6 = VarGet(VAR_DEOXYS_INTERACTION_STEP_COUNTER); VarSet(VAR_DEOXYS_INTERACTION_STEP_COUNTER, 0); if (r5 != 0 && sDeoxysStepCaps[r5 - 1] < r6) { MoveDeoxysObject(0); VarSet(VAR_DEOXYS_INTERACTION_NUM, 0); gSpecialVar_Result = 0; DestroyTask(taskId); } else if (r5 == 10) { FlagSet(FLAG_SYS_DEOXYS_AWAKENED); gSpecialVar_Result = 2; ScriptContext_Enable(); DestroyTask(taskId); } else { r5++; MoveDeoxysObject(r5); VarSet(VAR_DEOXYS_INTERACTION_NUM, r5); gSpecialVar_Result = 1; DestroyTask(taskId); } } } static void MoveDeoxysObject(u8 num) { u8 mapObjId; LoadPalette(sDeoxysObjectPals[num], OBJ_PLTT_ID(10), PLTT_SIZEOF(4)); ApplyGlobalFieldPaletteTint(10); TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjId); if (num == 0) PlaySE(SE_M_CONFUSE_RAY); else PlaySE(SE_DEOXYS_MOVE); CreateTask(Task_WaitDeoxysFieldEffect, 8); gFieldEffectArguments[0] = 1; gFieldEffectArguments[1] = 56; gFieldEffectArguments[2] = 2; gFieldEffectArguments[3] = sDeoxysCoords[num][0]; gFieldEffectArguments[4] = sDeoxysCoords[num][1]; if (num == 0) gFieldEffectArguments[5] = 60; else gFieldEffectArguments[5] = 5; FieldEffectStart(FLDEFF_MOVE_DEOXYS_ROCK); SetObjEventTemplateCoords(1, sDeoxysCoords[num][0], sDeoxysCoords[num][1]); } static void Task_WaitDeoxysFieldEffect(u8 taskId) { if (!FieldEffectActiveListContains(FLDEFF_MOVE_DEOXYS_ROCK)) { ScriptContext_Enable(); DestroyTask(taskId); } } void IncrementBirthIslandRockStepCount(void) { u16 count = VarGet(VAR_DEOXYS_INTERACTION_STEP_COUNTER); if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BIRTH_ISLAND_EXTERIOR)) { count++; if (count > 99) VarSet(VAR_DEOXYS_INTERACTION_STEP_COUNTER, 0); else VarSet(VAR_DEOXYS_INTERACTION_STEP_COUNTER, count); } } void SetDeoxysTrianglePalette(void) { u8 num = VarGet(VAR_DEOXYS_INTERACTION_NUM); LoadPalette(sDeoxysObjectPals[num], OBJ_PLTT_ID(10), PLTT_SIZEOF(4)); ApplyGlobalFieldPaletteTint(10); } bool8 IsBadEggInParty(void) { u8 partyCount = CalculatePlayerPartyCount(); u32 i; for (i = 0; i < partyCount; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_BAD_EGG) == TRUE) return TRUE; } return FALSE; } bool8 IsPlayerNotInTrainerTowerLobby(void) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_LOBBY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY)) return FALSE; else return TRUE; } void BrailleCursorToggle(void) { // 8004 = x - 27 // 8005 = y // 8006 = action (0 = create, 1 = delete) u16 x; if (gQuestLogState != QL_STATE_PLAYBACK) { x = gSpecialVar_0x8004 + 27; if (gSpecialVar_0x8006 == 0) sBrailleTextCursorSpriteID = CreateTextCursorSprite(0, x, gSpecialVar_0x8005, 0, 0); else DestroyTextCursorSprite(sBrailleTextCursorSpriteID); } } bool8 PlayerPartyContainsSpeciesWithPlayerID(void) { // 8004 = species u8 playerCount = CalculatePlayerPartyCount(); u32 i; for (i = 0; i < playerCount; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) == gSpecialVar_0x8004 && GetPlayerTrainerId() == GetMonData(&gPlayerParty[i], MON_DATA_OT_ID, NULL)) return TRUE; } return FALSE; } /* * Determines which of Lorelei's doll collection to show * based on how many times you've entered the Hall of Fame. */ void UpdateLoreleiDollCollection(void) { u32 numHofClears = GetGameStat(GAME_STAT_ENTERED_HOF); if (numHofClears >= 25) { FlagClear(FLAG_HIDE_LORELEI_HOUSE_MEOWTH_DOLL); if (numHofClears >= 50) FlagClear(FLAG_HIDE_LORELEI_HOUSE_CHANSEY_DOLL); if (numHofClears >= 75) FlagClear(FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_F_DOLL); if (numHofClears >= 100) FlagClear(FLAG_HIDE_LORELEI_HOUSE_JIGGLYPUFF_DOLL); if (numHofClears >= 125) FlagClear(FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_M_DOLL); if (numHofClears >= 150) FlagClear(FLAG_HIDE_LORELEIS_HOUSE_FEAROW_DOLL); if (numHofClears >= 175) FlagClear(FLAG_HIDE_LORELEIS_HOUSE_PIDGEOT_DOLL); if (numHofClears >= 200) FlagClear(FLAG_HIDE_LORELEIS_HOUSE_LAPRAS_DOLL); } } void LoopWingFlapSound(void) { // 8004 = Num flaps // 8005 = Frame delay between flaps CreateTask(Task_WingFlapSound, 8); PlaySE(SE_M_WING_ATTACK); } static void Task_WingFlapSound(u8 taskId) { s16 *data = gTasks[taskId].data; data[1]++; if (data[1] == gSpecialVar_0x8005) { data[0]++; data[1] = 0; PlaySE(SE_M_WING_ATTACK); } if (data[0] == gSpecialVar_0x8004 - 1) DestroyTask(taskId); } void CableCarWarp(void) { if (gSpecialVar_0x8004 != 0) { SetWarpDestination(MAP_GROUP(FOUR_ISLAND_BASE_CABLE_CAR_STATION), MAP_NUM(FOUR_ISLAND_BASE_CABLE_CAR_STATION), -1, 6, 4); } else { SetWarpDestination(MAP_GROUP(FOUR_ISLAND_CABLE_CAR_STATION), MAP_NUM(FOUR_ISLAND_CABLE_CAR_STATION), -1, 6, 10); } } static const u8 gTitleNames[][18] = { _("NO TITLE"), _("BULBASAUR MASTER"), _("IVYSAUR MASTER"), _("VENUSAUR MASTER"), _("CHARMANDER MASTER"), _("CHARMELEON MASTER"), _("CHARIZARD MASTER"), _("SQUIRTLE MASTER"), _("WARTORTLE MASTER"), _("BLASTOISE MASTER"), _("CATERPIE MASTER"), _("METAPOD MASTER"), _("BUTTERFREE MASTER"), _("WEEDLE MASTER"), _("KAKUNA MASTER"), _("BEEDRILL MASTER"), _("PIDGEY MASTER"), _("PIDGEOTTO MASTER"), _("PIDGEOT MASTER"), _("RATTATA MASTER"), _("RATICATE MASTER"), _("SPEAROW MASTER"), _("FEAROW MASTER"), _("EKANS MASTER"), _("ARBOK MASTER"), _("PIKACHU MASTER"), _("RAICHU MASTER"), _("SANDSHREW MASTER"), _("SANDSLASH MASTER"), _("NIDORAN♀ MASTER"), _("NIDORINA MASTER"), _("NIDOQUEEN MASTER"), _("NIDORAN♂ MASTER"), _("NIDORINO MASTER"), _("NIDOKING MASTER"), _("CLEFAIRY MASTER"), _("CLEFABLE MASTER"), _("VULPIX MASTER"), _("NINETALES MASTER"), _("JIGGLYPUFF MASTER"), _("WIGGLYTUFF MASTER"), _("ZUBAT MASTER"), _("GOLBAT MASTER"), _("ODDISH MASTER"), _("GLOOM MASTER"), _("VILEPLUME MASTER"), _("PARAS MASTER"), _("PARASECT MASTER"), _("VENONAT MASTER"), _("VENOMOTH MASTER"), _("DIGLETT MASTER"), _("DUGTRIO MASTER"), _("MEOWTH MASTER"), _("PERSIAN MASTER"), _("PSYDUCK MASTER"), _("GOLDUCK MASTER"), _("MANKEY MASTER"), _("PRIMEAPE MASTER"), _("GROWLITHE MASTER"), _("ARCANINE MASTER"), _("POLIWAG MASTER"), _("POLIWHIRL MASTER"), _("POLIWRATH MASTER"), _("ABRA MASTER"), _("KADABRA MASTER"), _("ALAKAZAM MASTER"), _("MACHOP MASTER"), _("MACHOKE MASTER"), _("MACHAMP MASTER"), _("BELLSPROUT MASTER"), _("WEEPINBELL MASTER"), _("VICTREEBEL MASTER"), _("TENTACOOL MASTER"), _("TENTACRUEL MASTER"), _("GEODUDE MASTER"), _("GRAVELER MASTER"), _("GOLEM MASTER"), _("PONYTA MASTER"), _("RAPIDASH MASTER"), _("SLOWPOKE MASTER"), _("SLOWBRO MASTER"), _("MAGNEMITE MASTER"), _("MAGNETON MASTER"), _("FARFETCH'D MASTER"), _("DODUO MASTER"), _("DODRIO MASTER"), _("SEEL MASTER"), _("DEWGONG MASTER"), _("GRIMER MASTER"), _("MUK MASTER"), _("SHELLDER MASTER"), _("CLOYSTER MASTER"), _("GASTLY MASTER"), _("HAUNTER MASTER"), _("GENGAR MASTER"), _("ONIX MASTER"), _("DROWZEE MASTER"), _("HYPNO MASTER"), _("KRABBY MASTER"), _("KINGLER MASTER"), _("VOLTORB MASTER"), _("ELECTRODE MASTER"), _("EXEGGCUTE MASTER"), _("EXEGGUTOR MASTER"), _("CUBONE MASTER"), _("MAROWAK MASTER"), _("HITMONLEE MASTER"), _("HITMONCHAN MASTER"), _("LICKITUNG MASTER"), _("KOFFING MASTER"), _("WEEZING MASTER"), _("RHYHORN MASTER"), _("RHYDON MASTER"), _("CHANSEY MASTER"), _("TANGELA MASTER"), _("KANGASKHAN MASTER"), _("HORSEA MASTER"), _("SEADRA MASTER"), _("GOLDEEN MASTER"), _("SEAKING MASTER"), _("STARYU MASTER"), _("STARMIE MASTER"), _("MR. MIME MASTER"), _("SCYTHER MASTER"), _("JYNX MASTER"), _("ELECTABUZZ MASTER"), _("MAGMAR MASTER"), _("PINSIR MASTER"), _("TAUROS MASTER"), _("MAGIKARP MASTER"), _("GYARADOS MASTER"), _("LAPRAS MASTER"), _("DITTO MASTER"), _("EEVEE MASTER"), _("VAPOREON MASTER"), _("JOLTEON MASTER"), _("FLAREON MASTER"), _("PORYGON MASTER"), _("OMANYTE MASTER"), _("OMASTAR MASTER"), _("KABUTO MASTER"), _("KABUTOPS MASTER"), _("AERODACTYL MASTER"), _("SNORLAX MASTER"), _("ARTICUNO MASTER"), _("ZAPDOS MASTER"), _("MOLTRES MASTER"), _("DRATINI MASTER"), _("DRAGONAIR MASTER"), _("DRAGONITE MASTER"), _("MEWTWO MASTER"), _("MEW MASTER"), _("GRAND MASTER"), }; ================================================ FILE: src/field_tasks.c ================================================ #include "global.h" #include "gflib.h" #include "bike.h" #include "event_data.h" #include "event_object_lock.h" #include "field_camera.h" #include "field_effect_helpers.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "item.h" #include "metatile_behavior.h" #include "overworld.h" #include "quest_log.h" #include "script.h" #include "task.h" #include "constants/field_tasks.h" #include "constants/flags.h" #include "constants/items.h" #include "constants/metatile_labels.h" #include "constants/songs.h" /* This file handles some persistent tasks that run in the overworld. * - Task_RunTimeBasedEvents: Triggers ambient cries. In RSE, this also periodically updates local time and RTC events. * - Task_RunPerStepCallback: Calls one of the functions in sPerStepCallbacks, listed below... * . DummyPerStepCallback: Default, does nothing. Includes functionality from RS that was removed. * . AshGrassPerStepCallback: Leftover from RS. Removes the ash from ash-covered grass that the player steps on. * . IcefallCaveIcePerStepCallback: Cracks/breaks ice in Icefall Cave that the player steps on. * . CrackedFloorPerStepCallback: Leftover from RS. Breaks cracked floors that the player steps on. * * NOTE: "PerStep" is perhaps misleading. One function in sPerStepCallbacks is called * every frame while in the overworld by Task_RunPerStepCallback regardless of * whether or not steps are being taken. However, nearly all of the functions in * the table check if the player has moved from their previous position before * doing anything else. */ static void DummyPerStepCallback(u8 taskId); static void AshGrassPerStepCallback(u8 taskId); static void IcefallCaveIcePerStepCallback(u8 taskId); static void CrackedFloorPerStepCallback(u8 taskId); static const TaskFunc sPerStepCallbacks[] = { [STEP_CB_DUMMY] = DummyPerStepCallback, [STEP_CB_ASH] = AshGrassPerStepCallback, [STEP_CB_FORTREE_BRIDGE] = DummyPerStepCallback, [STEP_CB_PACIFIDLOG_BRIDGE] = DummyPerStepCallback, [STEP_CB_ICE] = IcefallCaveIcePerStepCallback, [STEP_CB_TRUCK] = DummyPerStepCallback, [STEP_CB_SECRET_BASE] = DummyPerStepCallback, [STEP_CB_CRACKED_FLOOR] = CrackedFloorPerStepCallback }; // The positions of each map space with crackable ice in Icefall Cave. static const u8 sIcefallCaveIceCoords[][2] = { { 8, 3 }, { 10, 5 }, { 15, 5 }, { 8, 9 }, { 9, 9 }, { 16, 9 }, { 8, 10 }, { 9, 10 }, { 8, 14 } }; #define tCallbackId data[0] static void Task_RunPerStepCallback(u8 taskId) { int idx = gTasks[taskId].tCallbackId; sPerStepCallbacks[idx](taskId); } #define tAmbientCryState data[1] #define tAmbientCryDelay data[2] // RTC functionality from RS was removed here. static void Task_RunTimeBasedEvents(u8 taskId) { s16 *data = gTasks[taskId].data; if (!ArePlayerFieldControlsLocked() && !QL_IS_PLAYBACK_STATE) UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay); } void SetUpFieldTasks(void) { if (!FuncIsActiveTask(Task_RunPerStepCallback)) { u8 taskId = CreateTask(Task_RunPerStepCallback, 80); gTasks[taskId].tCallbackId = STEP_CB_DUMMY; } if (!FuncIsActiveTask(Task_RunTimeBasedEvents)) CreateTask(Task_RunTimeBasedEvents, 80); } void ActivatePerStepCallback(u8 callbackId) { u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback); if (taskId != TASK_NONE) { s32 i; s16 *data = gTasks[taskId].data; for (i = 0; i < NUM_TASK_DATA; i++) data[i] = 0; if (callbackId >= ARRAY_COUNT(sPerStepCallbacks)) tCallbackId = STEP_CB_DUMMY; else tCallbackId = callbackId; } } void ResetFieldTasksArgs(void) { u8 taskId; s16 *data; taskId = FindTaskIdByFunc(Task_RunPerStepCallback); if (taskId != TASK_NONE) data = gTasks[taskId].data; taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); if (taskId != TASK_NONE) { data = gTasks[taskId].data; tAmbientCryState = 0; tAmbientCryDelay = 0; } } #undef tAmbientCryState #undef tAmbientCryDelay static void DummyPerStepCallback(u8 taskId) { } static void MarkIcePuzzleCoordVisited(s16 x, s16 y) { u8 i; for (i = 0; i < ARRAY_COUNT(sIcefallCaveIceCoords); i++) { if (sIcefallCaveIceCoords[i][0] + MAP_OFFSET == x && sIcefallCaveIceCoords[i][1] + MAP_OFFSET == y) { FlagSet(i + 1); break; } } } void SetIcefallCaveCrackedIceMetatiles(void) { u8 i; for (i = 0; i < ARRAY_COUNT(sIcefallCaveIceCoords); i++) { if (FlagGet(i + 1) == TRUE) { int x = sIcefallCaveIceCoords[i][0] + MAP_OFFSET; int y = sIcefallCaveIceCoords[i][1] + MAP_OFFSET; MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_CrackedIce); } } } #define tState data[1] #define tPrevX data[2] #define tPrevY data[3] #define tIceX data[4] #define tIceY data[5] #define tDelay data[6] static void IcefallCaveIcePerStepCallback(u8 taskId) { s16 x, y; u8 tileBehavior; u16 *iceStepCount; s16 *data = gTasks[taskId].data; switch (tState) { case 0: PlayerGetDestCoords(&x, &y); tPrevX = x; tPrevY = y; tState = 1; break; case 1: PlayerGetDestCoords(&x, &y); // End if player hasn't moved if (x == tPrevX && y == tPrevY) return; tPrevX = x; tPrevY = y; tileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsThinIce(tileBehavior) == TRUE) { // Thin ice, set it to cracked ice MarkIcePuzzleCoordVisited(x, y); tDelay = 4; tState = 2; tIceX = x; tIceY = y; } else if (MetatileBehavior_IsCrackedIce(tileBehavior) == TRUE) { // Cracked ice, set it to broken ice tDelay = 4; tState = 3; tIceX = x; tIceY = y; } break; case 2: if (tDelay != 0) { tDelay--; } else { // Crack ice x = tIceX; y = tIceY; PlaySE(SE_ICE_CRACK); MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_CrackedIce); CurrentMapDrawMetatileAt(x, y); tState = 1; } break; case 3: FreezeObjects_WaitForPlayer(); if (tDelay != 0) { tDelay--; } else { // Break ice x = tIceX; y = tIceY; PlaySE(SE_ICE_BREAK); MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_IceHole); CurrentMapDrawMetatileAt(x, y); VarSet(VAR_TEMP_1, 1); tState = 1; } break; } } #undef tState #undef tPrevX #undef tPrevY #undef tIceX #undef tIceY #undef tDelay #define tPrevX data[1] #define tPrevY data[2] static void AshGrassPerStepCallback(u8 taskId) { s16 x, y; u16 *ashGatherCount; s16 *data = gTasks[taskId].data; PlayerGetDestCoords(&x, &y); // End if player hasn't moved if (x == tPrevX && y == tPrevY) return; tPrevX = x; tPrevY = y; if (MetatileBehavior_IsAshGrass((u8)MapGridGetMetatileBehaviorAt(x, y))) { if (MapGridGetMetatileIdAt(x, y) == METATILE_SeviiIslands123_OneIsland_AshGrass) StartAshFieldEffect(x, y, METATILE_SeviiIslands123_OneIsland_Grass, 4); if (CheckBagHasItem(ITEM_SOOT_SACK, 1)) { ashGatherCount = GetVarPointer(VAR_ASH_GATHER_COUNT); if (*ashGatherCount < 9999) (*ashGatherCount)++; } } } #undef tPrevX #undef tPrevY // Unused. For some reason these were not dummied out like the other RSE-exclusive step callbacks. static void SetCrackedFloorHoleMetatile(s16 x, s16 y) { MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == METATILE_RSCave_CrackedFloor ? METATILE_RSCave_CrackedFloor_Hole : METATILE_Pacifidlog_SkyPillar_CrackedFloor_Hole); CurrentMapDrawMetatileAt(x, y); } #define tPrevX data[2] #define tPrevY data[3] #define tFloor1Delay data[4] #define tFloor1X data[5] #define tFloor1Y data[6] #define tFloor2Delay data[7] #define tFloor2X data[8] #define tFloor2Y data[9] // Unused. See above. static void CrackedFloorPerStepCallback(u8 taskId) { s16 x, y; u16 behavior; s16 *data = gTasks[taskId].data; PlayerGetDestCoords(&x, &y); behavior = MapGridGetMetatileBehaviorAt(x, y); // Update up to 2 previous cracked floor spaces if (tFloor1Delay != 0 && (--tFloor1Delay) == 0) SetCrackedFloorHoleMetatile(tFloor1X, tFloor1Y); if (tFloor2Delay != 0 && (--tFloor2Delay) == 0) SetCrackedFloorHoleMetatile(tFloor2X, tFloor2Y); // End if player hasn't moved if (x == tPrevX && y == tPrevY) return; tPrevX = x; tPrevY = y; if (MetatileBehavior_IsCrackedFloor(behavior)) { if (GetPlayerSpeed() != PLAYER_SPEED_FASTEST) VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty if (tFloor1Delay == 0) { tFloor1Delay = 3; tFloor1X = x; tFloor1Y = y; } else if (tFloor2Delay == 0) { tFloor2Delay = 3; tFloor2X = x; tFloor2Y = y; } } } #undef tPrevX #undef tPrevY #undef tFloor1Delay #undef tFloor1X #undef tFloor1Y #undef tFloor2Delay #undef tFloor2X #undef tFloor2Y ================================================ FILE: src/field_weather.c ================================================ #include "global.h" #include "gflib.h" #include "blend_palette.h" #include "field_camera.h" #include "field_effect.h" #include "field_weather.h" #include "field_weather_util.h" #include "field_weather_effects.h" #include "task.h" #include "trig.h" #include "constants/field_weather.h" #include "constants/weather.h" #include "constants/songs.h" #define DROUGHT_COLOR_INDEX(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) enum { GAMMA_NONE, GAMMA_NORMAL, GAMMA_ALT, }; struct RGBColor { u16 r:5; u16 g:5; u16 b:5; }; struct WeatherPaletteData { u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes. }; struct WeatherCallbacks { void (*initVars)(void); void (*main)(void); void (*initAll)(void); bool8 (*finish)(void); }; static EWRAM_DATA struct Weather sWeather = {}; static EWRAM_DATA u8 sFieldEffectPaletteGammaTypes[32] = {}; static EWRAM_DATA const u8 *sPaletteGammaTypes = NULL; static EWRAM_DATA u16 sDroughtFrameDelay = 0; static const u8 sDarkenedContrastColorMaps[19][32] = { {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, {0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 26, 27}, {0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25}, {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 24, 24, 25}, {1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 12, 13, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 25}, {1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26}, {1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 15, 15, 16, 16, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 26, 26}, {1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 16, 16, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 19, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 23, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31} }; static const u8 sContrastColorMaps[19][32] = { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 30, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 23, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31} }; static void Task_WeatherMain(u8 taskId); static void Task_WeatherInit(u8 taskId); static void None_Init(void); static void None_Main(void); static bool8 None_Finish(void); static void UpdateWeatherGammaShift(void); static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex); static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor); static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor); static void FadeInScreenWithWeather(void); static bool8 FadeInScreen_RainShowShade(void); static bool8 FadeInScreen_Drought(void); static bool8 FadeInScreen_FogHorizontal(void); static void DoNothing(void); static void ApplyFogBlend(u8 blendCoeff, u16 blendColor); static bool8 LightenSpritePaletteInFog(u8 paletteIndex); struct Weather *const gWeatherPtr = &sWeather; static const struct WeatherCallbacks sWeatherFuncs[] = { {None_Init, None_Main, None_Init, None_Finish}, {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish}, {Sunny_InitVars, Sunny_Main, Sunny_InitAll, Sunny_Finish}, {Rain_InitVars, Rain_Main, Rain_InitAll, Rain_Finish}, {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish}, {Thunderstorm_InitVars, Thunderstorm_Main, Thunderstorm_InitAll, Thunderstorm_Finish}, {FogHorizontal_InitVars, FogHorizontal_Main, FogHorizontal_InitAll, FogHorizontal_Finish}, {Ash_InitVars, Ash_Main, Ash_InitAll, Ash_Finish}, {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish}, {FogDiagonal_InitVars, FogDiagonal_Main, FogDiagonal_InitAll, FogDiagonal_Finish}, {FogHorizontal_InitVars, FogHorizontal_Main, FogHorizontal_InitAll, FogHorizontal_Finish}, {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_Finish}, {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish}, {Downpour_InitVars, Thunderstorm_Main, Downpour_InitAll, Thunderstorm_Finish}, {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish}, }; static void (*const sWeatherPalStateFuncs[])(void) = { UpdateWeatherGammaShift, FadeInScreenWithWeather, DoNothing, DoNothing }; static const u8 sBasePaletteGammaTypes[32] = { // background palettes GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NONE, GAMMA_NONE, GAMMA_NONE, // sprite palettes GAMMA_ALT, GAMMA_NORMAL, GAMMA_ALT, GAMMA_ALT, GAMMA_ALT, GAMMA_ALT, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_ALT, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, GAMMA_NORMAL, }; const u16 sDroughtWeatherColors[][0x1000] = { INCBIN_U16("graphics/weather/drought/colors_0.bin"), INCBIN_U16("graphics/weather/drought/colors_1.bin"), INCBIN_U16("graphics/weather/drought/colors_2.bin"), INCBIN_U16("graphics/weather/drought/colors_3.bin"), INCBIN_U16("graphics/weather/drought/colors_4.bin"), INCBIN_U16("graphics/weather/drought/colors_5.bin"), }; const u16 gDefaultWeatherSpritePalette[] = INCBIN_U16("graphics/weather/default.gbapal"); const u16 gCloudsWeatherPalette[] = INCBIN_U16("graphics/weather/cloud.gbapal"); const u16 gSandstormWeatherPalette[] = INCBIN_U16("graphics/weather/sandstorm.gbapal"); const u8 gWeatherFogDiagonalTiles[] = INCBIN_U8("graphics/weather/fog_diagonal.4bpp"); const u8 gWeatherFogHorizontalTiles[] = INCBIN_U8("graphics/weather/fog_horizontal.4bpp"); const u8 gWeatherCloudTiles[] = INCBIN_U8("graphics/weather/cloud.4bpp"); const u8 gWeatherSnow1Tiles[] = INCBIN_U8("graphics/weather/snow0.4bpp"); const u8 gWeatherSnow2Tiles[] = INCBIN_U8("graphics/weather/snow1.4bpp"); const u8 gWeatherBubbleTiles[] = INCBIN_U8("graphics/weather/bubble.4bpp"); const u8 gWeatherAshTiles[] = INCBIN_U8("graphics/weather/ash.4bpp"); const u8 gWeatherRainTiles[] = INCBIN_U8("graphics/weather/rain.4bpp"); const u8 gWeatherSandstormTiles[] = INCBIN_U8("graphics/weather/sandstorm.4bpp"); // code void StartWeather(void) { if (!FuncIsActiveTask(Task_WeatherMain)) { u8 index = AllocSpritePalette(0x1200); CpuCopy32(gDefaultWeatherSpritePalette, &gPlttBufferUnfaded[OBJ_PLTT_ID(index)], PLTT_SIZE_4BPP); ApplyGlobalFieldPaletteTint(index); sPaletteGammaTypes = sBasePaletteGammaTypes; gWeatherPtr->altGammaSpritePalIndex = index; gWeatherPtr->weatherPicSpritePalIndex = index; gWeatherPtr->rainSpriteCount = 0; gWeatherPtr->curRainSpriteIndex = 0; gWeatherPtr->cloudSpritesCreated = FALSE; gWeatherPtr->snowflakeSpriteCount = 0; gWeatherPtr->ashSpritesCreated = FALSE; gWeatherPtr->fogHSpritesCreated = FALSE; gWeatherPtr->fogDSpritesCreated = FALSE; gWeatherPtr->sandstormSpritesCreated = FALSE; gWeatherPtr->sandstormSwirlSpritesCreated = FALSE; gWeatherPtr->bubblesSpritesCreated = FALSE; gWeatherPtr->lightenedFogSpritePalsCount = 0; Weather_SetBlendCoeffs(16, 0); gWeatherPtr->currWeather = WEATHER_NONE; gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; gWeatherPtr->readyForInit = FALSE; gWeatherPtr->weatherChangeComplete = TRUE; gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80); } } void SetNextWeather(u8 weather) { if (weather != WEATHER_RAIN && weather != WEATHER_RAIN_THUNDERSTORM && weather != WEATHER_DOWNPOUR) { PlayRainStoppingSoundEffect(); } if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather) { sWeatherFuncs[weather].initVars(); } gWeatherPtr->weatherChangeComplete = FALSE; gWeatherPtr->nextWeather = weather; gWeatherPtr->finishStep = 0; } void SetCurrentAndNextWeather(u8 weather) { PlayRainStoppingSoundEffect(); gWeatherPtr->currWeather = weather; gWeatherPtr->nextWeather = weather; } void SetCurrentAndNextWeatherNoDelay(u8 weather) { PlayRainStoppingSoundEffect(); gWeatherPtr->currWeather = weather; gWeatherPtr->nextWeather = weather; // Overrides the normal delay during screen fading. gWeatherPtr->readyForInit = TRUE; } static void Task_WeatherInit(u8 taskId) { // Waits until it's ok to initialize weather. // When the screen fades in, this is set to TRUE. if (gWeatherPtr->readyForInit) { UpdateCameraPanning(); sWeatherFuncs[gWeatherPtr->currWeather].initAll(); gTasks[taskId].func = Task_WeatherMain; } } static void Task_WeatherMain(u8 taskId) { if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather) { if (!sWeatherFuncs[gWeatherPtr->currWeather].finish() && gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) { // Finished cleaning up previous weather. Now transition to next weather. sWeatherFuncs[gWeatherPtr->nextWeather].initVars(); gWeatherPtr->gammaStepFrameCounter = 0; gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; gWeatherPtr->currWeather = gWeatherPtr->nextWeather; gWeatherPtr->weatherChangeComplete = TRUE; } } else { sWeatherFuncs[gWeatherPtr->currWeather].main(); } sWeatherPalStateFuncs[gWeatherPtr->palProcessingState](); } static void None_Init(void) { gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 0; } static void None_Main(void) { } static u8 None_Finish(void) { return 0; } // When the weather is changing, it gradually updates the palettes // towards the desired gamma shift. static void UpdateWeatherGammaShift(void) { if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) { if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex) { gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } else { if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay) { gWeatherPtr->gammaStepFrameCounter = 0; if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex) gWeatherPtr->gammaIndex++; else gWeatherPtr->gammaIndex--; ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex); } } } } static void FadeInScreenWithWeather(void) { if (++gWeatherPtr->fadeInCounter > 1) gWeatherPtr->fadeInActive = 0; switch (gWeatherPtr->currWeather) { case WEATHER_RAIN: case WEATHER_RAIN_THUNDERSTORM: case WEATHER_DOWNPOUR: case WEATHER_SNOW: case WEATHER_SHADE: if (FadeInScreen_RainShowShade() == FALSE) { gWeatherPtr->gammaIndex = 3; gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_DROUGHT: if (FadeInScreen_Drought() == FALSE) { gWeatherPtr->gammaIndex = -6; gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_FOG_HORIZONTAL: if (FadeInScreen_FogHorizontal() == FALSE) { gWeatherPtr->gammaIndex = 0; gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_VOLCANIC_ASH: case WEATHER_SANDSTORM: case WEATHER_FOG_DIAGONAL: case WEATHER_UNDERWATER: default: if (!gPaletteFade.active) { gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex; gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; } } static bool8 FadeInScreen_RainShowShade(void) { if (gWeatherPtr->fadeScreenCounter == 16) return FALSE; if (++gWeatherPtr->fadeScreenCounter >= 16) { ApplyGammaShift(0, 32, 3); gWeatherPtr->fadeScreenCounter = 16; return FALSE; } ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); return TRUE; } static bool8 FadeInScreen_Drought(void) { if (gWeatherPtr->fadeScreenCounter == 16) return FALSE; if (++gWeatherPtr->fadeScreenCounter >= 16) { ApplyGammaShift(0, 32, -6); gWeatherPtr->fadeScreenCounter = 16; return FALSE; } ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); return TRUE; } static bool8 FadeInScreen_FogHorizontal(void) { if (gWeatherPtr->fadeScreenCounter == 16) return FALSE; gWeatherPtr->fadeScreenCounter++; ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); return TRUE; } static void DoNothing(void) { } static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) { u16 curPalIndex; u16 palOffset; const u8 *gammaTable; u32 i; if (gammaIndex > 0) { gammaIndex--; palOffset = PLTT_ID(startPalIndex); numPalettes += startPalIndex; curPalIndex = startPalIndex; // Loop through the speficied palette range and apply necessary gamma shifts to the colors. while (curPalIndex < numPalettes) { if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { // No palette change. CpuFastCopy(&gPlttBufferUnfaded[palOffset], &gPlttBufferFaded[palOffset], PLTT_SIZE_4BPP); palOffset += 16; } else { u8 r, g, b; if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex) gammaTable = sContrastColorMaps[gammaIndex]; else gammaTable = sDarkenedContrastColorMaps[gammaIndex]; for (i = 0; i < 16; i++) { // Apply gamma shift to the original color. struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; r = gammaTable[baseColor.r]; g = gammaTable[baseColor.g]; b = gammaTable[baseColor.b]; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } curPalIndex++; } } else if (gammaIndex < 0) { //A negative gammIndex value means that the blending will come from the special Drought weather's palette tables. gammaIndex = -gammaIndex - 1; palOffset = startPalIndex * 16; numPalettes += startPalIndex; curPalIndex = startPalIndex; CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); while (curPalIndex < numPalettes) { if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { // No palette change. palOffset += 16; } else { for (i = 0; i < 16; i++) { gPlttBufferFaded[palOffset] = sDroughtWeatherColors[gammaIndex][DROUGHT_COLOR_INDEX(gPlttBufferUnfaded[palOffset])]; palOffset++; } } curPalIndex++; } } else { // No palette blending. CpuFastCopy(&gPlttBufferUnfaded[PLTT_ID(startPalIndex)], &gPlttBufferFaded[PLTT_ID(startPalIndex)], numPalettes * PLTT_SIZE_4BPP); } } static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor) { u16 palOffset; u16 curPalIndex; u32 i; struct RGBColor color = *(struct RGBColor *)&blendColor; u8 rBlend = color.r; u8 gBlend = color.g; u8 bBlend = color.b; palOffset = PLTT_ID(startPalIndex); numPalettes += startPalIndex; gammaIndex--; curPalIndex = startPalIndex; while (curPalIndex < numPalettes) { if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { // No gamma shift. Simply blend the colors. BlendPalette(palOffset, 16, blendCoeff, blendColor); palOffset += 16; } else { const u8 *gammaTable; if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL) gammaTable = sDarkenedContrastColorMaps[gammaIndex]; else gammaTable = sContrastColorMaps[gammaIndex]; for (i = 0; i < 16; i++) { struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; u8 r = gammaTable[baseColor.r]; u8 g = gammaTable[baseColor.g]; u8 b = gammaTable[baseColor.b]; // Apply gamma shift and target blend color to the original color. r += ((rBlend - r) * blendCoeff) >> 4; g += ((gBlend - g) * blendCoeff) >> 4; b += ((bBlend - b) * blendCoeff) >> 4; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } curPalIndex++; } } static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor) { struct RGBColor color; u8 rBlend; u8 gBlend; u8 bBlend; u16 curPalIndex; u16 palOffset; u32 i; gammaIndex = -gammaIndex - 1; color = *(struct RGBColor *)&blendColor; rBlend = color.r; gBlend = color.g; bBlend = color.b; palOffset = 0; for (curPalIndex = 0; curPalIndex < 32; curPalIndex++) { if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { // No gamma shift. Simply blend the colors. BlendPalette(palOffset, 16, blendCoeff, blendColor); palOffset += 16; } else { for (i = 0; i < 16; i++) { u32 offset; struct RGBColor color1; struct RGBColor color2; u8 r1, g1, b1; u8 r2, g2, b2; color1 = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; r1 = color1.r; g1 = color1.g; b1 = color1.b; r1 += ((rBlend - r1) * blendCoeff) >> 4; g1 += ((gBlend - g1) * blendCoeff) >> 4; b1 += ((bBlend - b1) * blendCoeff) >> 4; gPlttBufferFaded[palOffset++] = (b1 << 10) | (g1 << 5) | r1; } } } } static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) { struct RGBColor color; u8 rBlend; u8 gBlend; u8 bBlend; u16 curPalIndex; BlendPalette(0, 256, blendCoeff, blendColor); color = *(struct RGBColor *)&blendColor; rBlend = color.r; gBlend = color.g; bBlend = color.b; for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) { if (LightenSpritePaletteInFog(curPalIndex)) { u16 palEnd = PLTT_ID(curPalIndex + 1); u16 palOffset = PLTT_ID(curPalIndex); while (palOffset < palEnd) { struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; u8 r = color.r; u8 g = color.g; u8 b = color.b; r += ((28 - r) * 3) >> 2; g += ((31 - g) * 3) >> 2; b += ((28 - b) * 3) >> 2; r += ((rBlend - r) * blendCoeff) >> 4; g += ((gBlend - g) * blendCoeff) >> 4; b += ((bBlend - b) * blendCoeff) >> 4; gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r; palOffset++; } } else { BlendPalette(PLTT_ID(curPalIndex), 16, blendCoeff, blendColor); } } } static void MarkFogSpritePalToLighten(u8 paletteIndex) { if (gWeatherPtr->lightenedFogSpritePalsCount < 6) { gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex; gWeatherPtr->lightenedFogSpritePalsCount++; } } static bool8 LightenSpritePaletteInFog(u8 paletteIndex) { u32 i; for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) { if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex) return TRUE; } return FALSE; } void WeatherShiftGammaIfPalStateIdle(s8 gammaIndex) { if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { ApplyGammaShift(0, 32, gammaIndex); gWeatherPtr->gammaIndex = gammaIndex; } } void WeatherBeginGammaFade(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) { if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; gWeatherPtr->gammaIndex = gammaIndex; gWeatherPtr->gammaTargetIndex = gammaTargetIndex; gWeatherPtr->gammaStepFrameCounter = 0; gWeatherPtr->gammaStepDelay = gammaStepDelay; WeatherShiftGammaIfPalStateIdle(gammaIndex); } } void FadeScreen(u8 mode, s8 delay) { u32 fadeColor; bool8 fadeOut; bool8 useWeatherPal; switch (mode) { case FADE_FROM_BLACK: fadeColor = RGB_BLACK; fadeOut = FALSE; break; case FADE_FROM_WHITE: fadeColor = RGB_WHITEALPHA; fadeOut = FALSE; break; case FADE_TO_BLACK: fadeColor = RGB_BLACK; fadeOut = TRUE; break; case FADE_TO_WHITE: fadeColor = RGB_WHITEALPHA; fadeOut = TRUE; break; default: return; } switch (gWeatherPtr->currWeather) { case WEATHER_RAIN: case WEATHER_RAIN_THUNDERSTORM: case WEATHER_DOWNPOUR: case WEATHER_SNOW: case WEATHER_FOG_HORIZONTAL: case WEATHER_SHADE: case WEATHER_DROUGHT: useWeatherPal = TRUE; break; default: useWeatherPal = FALSE; break; } if (fadeOut) { if (useWeatherPal) CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(PALETTES_ALL, delay, 0, 16, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } else { gWeatherPtr->fadeDestColor = fadeColor; if (useWeatherPal) gWeatherPtr->fadeScreenCounter = 0; else BeginNormalPaletteFade(PALETTES_ALL, delay, 16, 0, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; gWeatherPtr->fadeInActive = 1; gWeatherPtr->fadeInCounter = 0; Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); gWeatherPtr->readyForInit = TRUE; } } void FadeSelectedPals(u8 mode, s8 delay, u32 selectedPalettes) { u32 fadeColor; bool8 fadeOut; bool8 useWeatherPal; switch (mode) { case FADE_FROM_BLACK: fadeColor = RGB_BLACK; fadeOut = FALSE; break; case FADE_FROM_WHITE: fadeColor = RGB_WHITEALPHA; fadeOut = FALSE; break; case FADE_TO_BLACK: fadeColor = RGB_BLACK; fadeOut = TRUE; break; case FADE_TO_WHITE: fadeColor = RGB_WHITEALPHA; fadeOut = TRUE; break; default: return; } switch (gWeatherPtr->currWeather) { case WEATHER_RAIN: case WEATHER_RAIN_THUNDERSTORM: case WEATHER_DOWNPOUR: case WEATHER_SNOW: case WEATHER_FOG_HORIZONTAL: case WEATHER_SHADE: case WEATHER_DROUGHT: useWeatherPal = TRUE; break; default: useWeatherPal = FALSE; break; } if (fadeOut) { if (useWeatherPal) CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(selectedPalettes, delay, 0, 16, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } else { gWeatherPtr->fadeDestColor = fadeColor; if (useWeatherPal) gWeatherPtr->fadeScreenCounter = 0; else BeginNormalPaletteFade(selectedPalettes, delay, 16, 0, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; gWeatherPtr->fadeInActive = 1; gWeatherPtr->fadeInCounter = 0; Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); gWeatherPtr->readyForInit = TRUE; } } bool8 IsWeatherNotFadingIn(void) { return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); } void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) { u16 paletteIndex = 16 + spritePaletteIndex; u32 i; switch (gWeatherPtr->palProcessingState) { case WEATHER_PAL_STATE_SCREEN_FADING_IN: if (gWeatherPtr->fadeInActive != 0) { if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) MarkFogSpritePalToLighten(paletteIndex); paletteIndex = PLTT_ID(paletteIndex); for (i = 0; i < 16; i++) gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor; } break; case WEATHER_PAL_STATE_SCREEN_FADING_OUT: paletteIndex = PLTT_ID(paletteIndex); CpuFastCopy(&gPlttBufferFaded[paletteIndex], &gPlttBufferUnfaded[paletteIndex], PLTT_SIZE_4BPP); BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor); break; // WEATHER_PAL_STATE_CHANGING_WEATHER // WEATHER_PAL_STATE_CHANGING_IDLE default: if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) { ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } else { paletteIndex = PLTT_ID(paletteIndex); BlendPalette(paletteIndex, 16, 12, RGB(28, 31, 28)); } break; } } void ApplyWeatherGammaShiftToPal(u8 paletteIndex) { ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } static u8 IsWeatherFadingIn(void) { if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) return gWeatherPtr->fadeInActive; else return 0; } void LoadCustomWeatherSpritePalette(const u16 *palette) { LoadPalette(palette, OBJ_PLTT_ID(gWeatherPtr->weatherPicSpritePalIndex), PLTT_SIZE_4BPP); UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); } static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *a1) { // Dummied out in FRLG *gammaIndexPtr = 0x20; *a1 = 0x20; } void ResetDroughtWeatherPaletteLoading(void) { gWeatherPtr->loadDroughtPalsIndex = 1; gWeatherPtr->loadDroughtPalsOffset = 1; } bool8 LoadDroughtWeatherPalettes(void) { if (gWeatherPtr->loadDroughtPalsIndex < 32) { LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset); if (gWeatherPtr->loadDroughtPalsIndex < 32) return TRUE; } return FALSE; } static void SetDroughtGamma(s8 gammaIndex) { WeatherShiftGammaIfPalStateIdle(-gammaIndex - 1); } void DroughtStateInit(void) { gWeatherPtr->droughtBrightnessStage = 0; gWeatherPtr->droughtTimer = 0; gWeatherPtr->droughtState = 0; gWeatherPtr->droughtLastBrightnessStage = 0; sDroughtFrameDelay = 5; } void DroughtStateRun(void) { switch (gWeatherPtr->droughtState) { case 0: // Ramp up if (++gWeatherPtr->droughtTimer > sDroughtFrameDelay) { gWeatherPtr->droughtTimer = 0; SetDroughtGamma(gWeatherPtr->droughtBrightnessStage++); if (gWeatherPtr->droughtBrightnessStage > 5) { gWeatherPtr->droughtLastBrightnessStage = gWeatherPtr->droughtBrightnessStage; gWeatherPtr->droughtState = 1; gWeatherPtr->droughtTimer = 60; } } break; case 1: // Oscillate gWeatherPtr->droughtTimer = (gWeatherPtr->droughtTimer + 3) & 0x7F; gWeatherPtr->droughtBrightnessStage = ((gSineTable[gWeatherPtr->droughtTimer] - 1) >> 6) + 2; if (gWeatherPtr->droughtBrightnessStage != gWeatherPtr->droughtLastBrightnessStage) SetDroughtGamma(gWeatherPtr->droughtBrightnessStage); gWeatherPtr->droughtLastBrightnessStage = gWeatherPtr->droughtBrightnessStage; break; case 2: // Ramp down if (++gWeatherPtr->droughtTimer > sDroughtFrameDelay) { gWeatherPtr->droughtTimer = 0; SetDroughtGamma(--gWeatherPtr->droughtBrightnessStage); if (gWeatherPtr->droughtBrightnessStage == 3) gWeatherPtr->droughtState = 0; } break; } } void Weather_SetBlendCoeffs(u8 eva, u8 evb) { gWeatherPtr->currBlendEVA = eva; gWeatherPtr->currBlendEVB = evb; gWeatherPtr->targetBlendEVA = eva; gWeatherPtr->targetBlendEVB = evb; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(eva, evb)); } void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay) { gWeatherPtr->targetBlendEVA = eva; gWeatherPtr->targetBlendEVB = evb; gWeatherPtr->blendDelay = delay; gWeatherPtr->blendFrameCounter = 0; gWeatherPtr->blendUpdateCounter = 0; } bool8 Weather_UpdateBlend(void) { if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) return TRUE; if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay) { gWeatherPtr->blendFrameCounter = 0; gWeatherPtr->blendUpdateCounter++; // Update currBlendEVA and currBlendEVB on alternate frames if (gWeatherPtr->blendUpdateCounter & 1) { if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA) gWeatherPtr->currBlendEVA++; else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA) gWeatherPtr->currBlendEVA--; } else { if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB) gWeatherPtr->currBlendEVB++; else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB) gWeatherPtr->currBlendEVB--; } } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB)); if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) return TRUE; return FALSE; } // Unused. Uses the same numbering scheme as the coord events static void SetFieldWeather(u8 weather) { switch (weather) { case COORD_EVENT_WEATHER_SUNNY_CLOUDS: SetWeather(WEATHER_SUNNY_CLOUDS); break; case COORD_EVENT_WEATHER_SUNNY: SetWeather(WEATHER_SUNNY); break; case COORD_EVENT_WEATHER_RAIN: SetWeather(WEATHER_RAIN); break; case COORD_EVENT_WEATHER_SNOW: SetWeather(WEATHER_SNOW); break; case COORD_EVENT_WEATHER_RAIN_THUNDERSTORM: SetWeather(WEATHER_RAIN_THUNDERSTORM); break; case COORD_EVENT_WEATHER_FOG_HORIZONTAL: SetWeather(WEATHER_FOG_HORIZONTAL); break; case COORD_EVENT_WEATHER_FOG_DIAGONAL: SetWeather(WEATHER_FOG_DIAGONAL); break; case COORD_EVENT_WEATHER_VOLCANIC_ASH: SetWeather(WEATHER_VOLCANIC_ASH); break; case COORD_EVENT_WEATHER_SANDSTORM: SetWeather(WEATHER_SANDSTORM); break; case COORD_EVENT_WEATHER_SHADE: SetWeather(WEATHER_SHADE); break; } } u8 GetCurrentWeather(void) { return gWeatherPtr->currWeather; } void SetRainStrengthFromSoundEffect(u16 soundEffect) { if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) { switch (soundEffect) { case SE_RAIN: gWeatherPtr->rainStrength = 0; break; case SE_DOWNPOUR: gWeatherPtr->rainStrength = 1; break; case SE_THUNDERSTORM: gWeatherPtr->rainStrength = 2; break; default: return; } PlaySE(soundEffect); } } void PlayRainStoppingSoundEffect(void) { if (IsSpecialSEPlaying()) { switch (gWeatherPtr->rainStrength) { case 0: PlaySE(SE_RAIN_STOP); break; case 1: PlaySE(SE_DOWNPOUR_STOP); break; case 2: default: PlaySE(SE_THUNDERSTORM_STOP); break; } } } u8 IsWeatherChangeComplete(void) { return gWeatherPtr->weatherChangeComplete; } void SetWeatherScreenFadeOut(void) { gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } void WeatherProcessingIdle(void) { gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } void PreservePaletteInWeather(u8 preservedPalIndex) { CpuCopy16(sBasePaletteGammaTypes, sFieldEffectPaletteGammaTypes, 32); sFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE; sPaletteGammaTypes = sFieldEffectPaletteGammaTypes; } void ResetPreservedPalettesInWeather(void) { sPaletteGammaTypes = sBasePaletteGammaTypes; } void SlightlyDarkenPalsInWeather(u16 *palbuf, u16 *unused, u32 size) { switch (gWeatherPtr->currWeather) { case WEATHER_RAIN: case WEATHER_SNOW: case WEATHER_RAIN_THUNDERSTORM: case WEATHER_SHADE: case WEATHER_DOWNPOUR: BlendPalettesAt(palbuf, RGB_BLACK, 3, size); break; } } ================================================ FILE: src/field_weather_effects.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "event_object_movement.h" #include "field_weather.h" #include "field_weather_effects.h" #include "random.h" #include "script.h" #include "constants/weather.h" #include "constants/songs.h" #include "task.h" #include "trig.h" //------------------------------------------------------------------------------ // WEATHER_SUNNY_CLOUDS //------------------------------------------------------------------------------ static void CreateCloudSprites(void); static void DestroyCloudSprites(void); static void UpdateCloudSprite(struct Sprite *); // The clouds are positioned on the map's grid. // These coordinates are for the lower half of Route 120. static const struct Coords16 sCloudSpriteMapCoords[] = { { 0, 66}, { 5, 73}, {10, 78}, }; static const struct SpriteSheet sCloudSpriteSheet = { .data = gWeatherCloudTiles, .size = 0x0800, .tag = GFXTAG_CLOUD }; static const struct OamData sCloudSpriteOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 3, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sCloudSpriteAnimCmd[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_END, }; static const union AnimCmd *const sCloudSpriteAnimCmds[] = { sCloudSpriteAnimCmd, }; static const struct SpriteTemplate sCloudSpriteTemplate = { .tileTag = GFXTAG_CLOUD, .paletteTag = PALTAG_WEATHER, .oam = &sCloudSpriteOamData, .anims = sCloudSpriteAnimCmds, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateCloudSprite, }; void Clouds_InitVars(void) { gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->initStep = 0; if (!gWeatherPtr->cloudSpritesCreated) Weather_SetBlendCoeffs(0, 16); } void Clouds_InitAll(void) { Clouds_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) Clouds_Main(); } void Clouds_Main(void) { switch (gWeatherPtr->initStep) { case 0: CreateCloudSprites(); gWeatherPtr->initStep++; break; case 1: Weather_SetTargetBlendCoeffs(12, 8, 1); gWeatherPtr->initStep++; break; case 2: if (Weather_UpdateBlend()) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; } } bool8 Clouds_Finish(void) { switch (gWeatherPtr->finishStep) { case 0: Weather_SetTargetBlendCoeffs(0, 16, 1); gWeatherPtr->finishStep++; return TRUE; case 1: if (Weather_UpdateBlend()) { DestroyCloudSprites(); gWeatherPtr->finishStep++; } return TRUE; } return FALSE; } void Sunny_InitVars(void) { gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 20; } void Sunny_InitAll(void) { Sunny_InitVars(); } void Sunny_Main(void) { } bool8 Sunny_Finish(void) { return FALSE; } static void CreateCloudSprites(void) { u32 i; u8 spriteId; struct Sprite *sprite; if (gWeatherPtr->cloudSpritesCreated == TRUE) return; LoadSpriteSheet(&sCloudSpriteSheet); LoadCustomWeatherSpritePalette(gCloudsWeatherPalette); for (i = 0; i < NUM_CLOUD_SPRITES; i++) { spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF); if (spriteId != MAX_SPRITES) { gWeatherPtr->sprites.s1.cloudSprites[i] = &gSprites[spriteId]; sprite = gWeatherPtr->sprites.s1.cloudSprites[i]; SetSpritePosToMapCoords(sCloudSpriteMapCoords[i].x + 7, sCloudSpriteMapCoords[i].y + 7, &sprite->x, &sprite->y); sprite->coordOffsetEnabled = TRUE; } else { gWeatherPtr->sprites.s1.cloudSprites[i] = NULL; } } gWeatherPtr->cloudSpritesCreated = TRUE; } static void DestroyCloudSprites(void) { u32 i; if (!gWeatherPtr->cloudSpritesCreated) return; for (i = 0; i < NUM_CLOUD_SPRITES; i++) { if (gWeatherPtr->sprites.s1.cloudSprites[i] != NULL) DestroySprite(gWeatherPtr->sprites.s1.cloudSprites[i]); } FreeSpriteTilesByTag(GFXTAG_CLOUD); gWeatherPtr->cloudSpritesCreated = FALSE; } static void UpdateCloudSprite(struct Sprite *sprite) { // Move 1 pixel left every 2 frames. sprite->data[0] = (sprite->data[0] + 1) & 1; if (sprite->data[0]) sprite->x--; } //------------------------------------------------------------------------------ // WEATHER_DROUGHT //------------------------------------------------------------------------------ static void UpdateDroughtBlend(u8); void Drought_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 0; } void Drought_InitAll(void) { Drought_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) Drought_Main(); } void Drought_Main(void) { switch (gWeatherPtr->initStep) { case 0: if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER) gWeatherPtr->initStep++; break; case 1: ResetDroughtWeatherPaletteLoading(); gWeatherPtr->initStep++; break; case 2: if (!LoadDroughtWeatherPalettes()) gWeatherPtr->initStep++; break; case 3: DroughtStateInit(); gWeatherPtr->initStep++; break; case 4: DroughtStateRun(); if (gWeatherPtr->droughtBrightnessStage == 6) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; default: DroughtStateRun(); break; } } bool8 Drought_Finish(void) { return FALSE; } void StartDroughtWeatherBlend(void) { CreateTask(UpdateDroughtBlend, 0x50); } #define tState data[0] #define tBlendY data[1] #define tBlendDelay data[2] #define tWinRange data[3] static void UpdateDroughtBlend(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: task->tBlendY = 0; task->tBlendDelay = 0; task->tWinRange = GetGpuReg(REG_OFFSET_WININ); SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(63, 63)); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 0); task->tState++; // fall through case 1: task->tBlendY += 3; if (task->tBlendY > 16) task->tBlendY = 16; SetGpuReg(REG_OFFSET_BLDY, task->tBlendY); if (task->tBlendY >= 16) task->tState++; break; case 2: task->tBlendDelay++; if (task->tBlendDelay > 9) { task->tBlendDelay = 0; task->tBlendY--; if (task->tBlendY <= 0) { task->tBlendY = 0; task->tState++; } SetGpuReg(REG_OFFSET_BLDY, task->tBlendY); } break; case 3: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_WININ, task->tWinRange); task->tState++; break; case 4: ScriptContext_Enable(); DestroyTask(taskId); break; } } #undef tState #undef tBlendY #undef tBlendDelay #undef tWinRange //------------------------------------------------------------------------------ // WEATHER_RAIN //------------------------------------------------------------------------------ static void LoadRainSpriteSheet(void); static bool8 CreateRainSprite(void); static void UpdateRainSprite(struct Sprite *sprite); static bool8 UpdateVisibleRainSprites(void); static void DestroyRainSprites(void); static const struct Coords16 sRainSpriteCoords[] = { { 0, 0}, { 0, 160}, { 0, 64}, {144, 224}, {144, 128}, { 32, 32}, { 32, 192}, { 32, 96}, { 72, 128}, { 72, 32}, { 72, 192}, {216, 96}, {216, 0}, {104, 160}, {104, 64}, {104, 224}, {144, 0}, {144, 160}, {144, 64}, { 32, 224}, { 32, 128}, { 72, 32}, { 72, 192}, { 48, 96}, }; static const struct OamData sRainSpriteOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x32), .tileNum = 0, .priority = 1, .paletteNum = 2, .affineParam = 0, }; static const union AnimCmd sRainSpriteFallAnimCmd[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_JUMP(0), }; static const union AnimCmd sRainSpriteSplashAnimCmd[] = { ANIMCMD_FRAME(8, 3), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(40, 2), ANIMCMD_END, }; static const union AnimCmd sRainSpriteHeavySplashAnimCmd[] = { ANIMCMD_FRAME(8, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(24, 4), ANIMCMD_END, }; static const union AnimCmd *const sRainSpriteAnimCmds[] = { sRainSpriteFallAnimCmd, sRainSpriteSplashAnimCmd, sRainSpriteHeavySplashAnimCmd, }; static const struct SpriteTemplate sRainSpriteTemplate = { .tileTag = GFXTAG_RAIN, .paletteTag = PALTAG_WEATHER, .oam = &sRainSpriteOamData, .anims = sRainSpriteAnimCmds, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateRainSprite, }; // Q28.4 fixed-point format values static const s16 sRainSpriteMovement[][2] = { {-0x68, 0xD0}, {-0xA0, 0x140}, }; // First byte is the number of frames a raindrop falls before it splashes. // Second byte is the maximum number of frames a raindrop can "wait" before // it appears and starts falling. (This is only for the initial raindrop spawn.) static const u16 sRainSpriteFallingDurations[][2] = { {18, 7}, {12, 10}, }; static const struct SpriteSheet sRainSpriteSheet = { .data = gWeatherRainTiles, .size = 0x0600, .tag = GFXTAG_RAIN, }; void Rain_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->rainSpriteVisibleCounter = 0; gWeatherPtr->rainSpriteVisibleDelay = 8; gWeatherPtr->isDownpour = FALSE; gWeatherPtr->targetRainSpriteCount = 10; gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; SetRainStrengthFromSoundEffect(SE_RAIN); } void Rain_InitAll(void) { Rain_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) Rain_Main(); } void Rain_Main(void) { switch (gWeatherPtr->initStep) { case 0: LoadRainSpriteSheet(); gWeatherPtr->initStep++; break; case 1: if (!CreateRainSprite()) gWeatherPtr->initStep++; break; case 2: if (!UpdateVisibleRainSprites()) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; } } bool8 Rain_Finish(void) { switch (gWeatherPtr->finishStep) { case 0: if (gWeatherPtr->nextWeather == WEATHER_RAIN || gWeatherPtr->nextWeather == WEATHER_RAIN_THUNDERSTORM || gWeatherPtr->nextWeather == WEATHER_DOWNPOUR) { gWeatherPtr->finishStep = 0xFF; return FALSE; } else { gWeatherPtr->targetRainSpriteCount = 0; gWeatherPtr->finishStep++; } // fall through case 1: if (!UpdateVisibleRainSprites()) { DestroyRainSprites(); gWeatherPtr->finishStep++; return FALSE; } return TRUE; } return FALSE; } #define tCounter data[0] #define tRandom data[1] #define tPosX data[2] #define tPosY data[3] #define tState data[4] #define tActive data[5] #define tWaiting data[6] static void StartRainSpriteFall(struct Sprite *sprite) { u32 rand; u16 numFallingFrames; int tileX; int tileY; if (sprite->tRandom == 0) sprite->tRandom = 361; rand = ISO_RANDOMIZE2(sprite->tRandom); sprite->tRandom = ((rand & 0x7FFF0000) >> 16) % 600; numFallingFrames = sRainSpriteFallingDurations[gWeatherPtr->isDownpour][0]; tileX = sprite->tRandom % 30; sprite->tPosX = tileX * 8; // Useless assignment, leftover from before fixed-point values were used tileY = sprite->tRandom / 30; sprite->tPosY = tileY * 8; // Useless assignment, leftover from before fixed-point values were used sprite->tPosX = tileX; sprite->tPosX <<= 7; // This is tileX * 8, using a fixed-point value with 4 decimal places sprite->tPosY = tileY; sprite->tPosY <<= 7; // This is tileX * 8, using a fixed-point value with 4 decimal places // "Rewind" the rain sprites, from their ending position. sprite->tPosX -= sRainSpriteMovement[gWeatherPtr->isDownpour][0] * numFallingFrames; sprite->tPosY -= sRainSpriteMovement[gWeatherPtr->isDownpour][1] * numFallingFrames; StartSpriteAnim(sprite, 0); sprite->tState = 0; sprite->coordOffsetEnabled = FALSE; sprite->tCounter = numFallingFrames; } static void UpdateRainSprite(struct Sprite *sprite) { if (sprite->tState == 0) { // Raindrop is in its "falling" motion. sprite->tPosX += sRainSpriteMovement[gWeatherPtr->isDownpour][0]; sprite->tPosY += sRainSpriteMovement[gWeatherPtr->isDownpour][1]; sprite->x = sprite->tPosX >> 4; sprite->y = sprite->tPosY >> 4; if (sprite->tActive && (sprite->x >= -8 && sprite->x <= DISPLAY_WIDTH + 8) && sprite->y >= -16 && sprite->y <= DISPLAY_HEIGHT + 16) sprite->invisible = FALSE; else sprite->invisible = TRUE; if (--sprite->tCounter == 0) { // Make raindrop splash on the ground StartSpriteAnim(sprite, gWeatherPtr->isDownpour + 1); sprite->tState = 1; sprite->x -= gSpriteCoordOffsetX; sprite->y -= gSpriteCoordOffsetY; sprite->coordOffsetEnabled = TRUE; } } else if (sprite->animEnded) { // The splashing animation ended. sprite->invisible = TRUE; StartRainSpriteFall(sprite); } } static void WaitRainSprite(struct Sprite *sprite) { if (sprite->tCounter == 0) { StartRainSpriteFall(sprite); sprite->callback = UpdateRainSprite; } else { sprite->tCounter--; } } static void InitRainSpriteMovement(struct Sprite *sprite, u16 val) { u16 numFallingFrames = sRainSpriteFallingDurations[gWeatherPtr->isDownpour][0]; u16 numAdvanceRng = val / (sRainSpriteFallingDurations[gWeatherPtr->isDownpour][1] + numFallingFrames); u16 frameVal = val % (sRainSpriteFallingDurations[gWeatherPtr->isDownpour][1] + numFallingFrames); while (--numAdvanceRng != 0xFFFF) StartRainSpriteFall(sprite); if (frameVal < numFallingFrames) { while (--frameVal != 0xFFFF) UpdateRainSprite(sprite); sprite->tWaiting = FALSE; } else { sprite->tCounter = frameVal - numFallingFrames; sprite->invisible = TRUE; sprite->tWaiting = TRUE; } } static void LoadRainSpriteSheet(void) { LoadSpriteSheet(&sRainSpriteSheet); } static bool8 CreateRainSprite(void) { u8 spriteIndex; u8 spriteId; if (gWeatherPtr->rainSpriteCount == MAX_RAIN_SPRITES) return FALSE; spriteIndex = gWeatherPtr->rainSpriteCount; spriteId = CreateSpriteAtEnd(&sRainSpriteTemplate, sRainSpriteCoords[spriteIndex].x, sRainSpriteCoords[spriteIndex].y, 78); if (spriteId != MAX_SPRITES) { gSprites[spriteId].tActive = FALSE; gSprites[spriteId].tRandom = spriteIndex * 145; while (gSprites[spriteId].tRandom >= 600) gSprites[spriteId].tRandom -= 600; StartRainSpriteFall(&gSprites[spriteId]); InitRainSpriteMovement(&gSprites[spriteId], spriteIndex * 9); gSprites[spriteId].invisible = TRUE; gWeatherPtr->sprites.s1.rainSprites[spriteIndex] = &gSprites[spriteId]; } else { gWeatherPtr->sprites.s1.rainSprites[spriteIndex] = NULL; } if (++gWeatherPtr->rainSpriteCount == MAX_RAIN_SPRITES) { u32 i; for (i = 0; i < MAX_RAIN_SPRITES; i++) { if (gWeatherPtr->sprites.s1.rainSprites[i]) { if (!gWeatherPtr->sprites.s1.rainSprites[i]->tWaiting) gWeatherPtr->sprites.s1.rainSprites[i]->callback = UpdateRainSprite; else gWeatherPtr->sprites.s1.rainSprites[i]->callback = WaitRainSprite; } } return FALSE; } return TRUE; } static bool8 UpdateVisibleRainSprites(void) { if (gWeatherPtr->curRainSpriteIndex == gWeatherPtr->targetRainSpriteCount) return FALSE; if (++gWeatherPtr->rainSpriteVisibleCounter > gWeatherPtr->rainSpriteVisibleDelay) { gWeatherPtr->rainSpriteVisibleCounter = 0; if (gWeatherPtr->curRainSpriteIndex < gWeatherPtr->targetRainSpriteCount) { gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex++]->tActive = 1; } else { gWeatherPtr->curRainSpriteIndex--; gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->tActive = 0; gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->invisible = TRUE; } } return TRUE; } static void DestroyRainSprites(void) { u32 i; for (i = 0; i < gWeatherPtr->rainSpriteCount; i++) { if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL) DestroySprite(gWeatherPtr->sprites.s1.rainSprites[i]); } gWeatherPtr->rainSpriteCount = 0; FreeSpriteTilesByTag(GFXTAG_RAIN); } #undef tCounter #undef tRandom #undef tPosX #undef tPosY #undef tState #undef tActive #undef tWaiting //------------------------------------------------------------------------------ // Snow //------------------------------------------------------------------------------ static void UpdateSnowflakeSprite(struct Sprite *); static bool8 UpdateVisibleSnowflakeSprites(void); static bool8 CreateSnowflakeSprite(void); static bool8 DestroySnowflakeSprite(void); static void InitSnowflakeSpriteMovement(struct Sprite *); void Snow_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->targetSnowflakeSpriteCount = 40; gWeatherPtr->snowflakeVisibleCounter = 0; } void Snow_InitAll(void) { u32 i; Snow_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) { Snow_Main(); for (i = 0; i < gWeatherPtr->snowflakeSpriteCount; i++) UpdateSnowflakeSprite(gWeatherPtr->sprites.s1.snowflakeSprites[i]); } } void Snow_Main(void) { if (gWeatherPtr->initStep == 0 && !UpdateVisibleSnowflakeSprites()) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } } bool8 Snow_Finish(void) { switch (gWeatherPtr->finishStep) { case 0: gWeatherPtr->targetSnowflakeSpriteCount = 0; gWeatherPtr->snowflakeVisibleCounter = 0; gWeatherPtr->finishStep++; // fall through case 1: if (!UpdateVisibleSnowflakeSprites()) { gWeatherPtr->finishStep++; return FALSE; } return TRUE; } return FALSE; } static bool8 UpdateVisibleSnowflakeSprites(void) { if (gWeatherPtr->snowflakeSpriteCount == gWeatherPtr->targetSnowflakeSpriteCount) return FALSE; if (++gWeatherPtr->snowflakeVisibleCounter > 36) { gWeatherPtr->snowflakeVisibleCounter = 0; if (gWeatherPtr->snowflakeSpriteCount < gWeatherPtr->targetSnowflakeSpriteCount) CreateSnowflakeSprite(); else DestroySnowflakeSprite(); } return gWeatherPtr->snowflakeSpriteCount != gWeatherPtr->targetSnowflakeSpriteCount; } static const struct OamData sSnowflakeSpriteOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0, }; static const struct SpriteFrameImage sSnowflakeSpriteImages[] = { {gWeatherSnow1Tiles, 0x20}, {gWeatherSnow2Tiles, 0x20}, }; static const union AnimCmd sSnowflakeAnimCmd0[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_END, }; static const union AnimCmd sSnowflakeAnimCmd1[] = { ANIMCMD_FRAME(1, 16), ANIMCMD_END, }; static const union AnimCmd *const sSnowflakeAnimCmds[] = { sSnowflakeAnimCmd0, sSnowflakeAnimCmd1, }; static const struct SpriteTemplate sSnowflakeSpriteTemplate = { .tileTag = TAG_NONE, .paletteTag = PALTAG_WEATHER, .oam = &sSnowflakeSpriteOamData, .anims = sSnowflakeAnimCmds, .images = sSnowflakeSpriteImages, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateSnowflakeSprite, }; #define tPosY data[0] #define tDeltaY data[1] #define tWaveDelta data[2] #define tWaveIndex data[3] #define tSnowflakeId data[4] #define tFallCounter data[5] #define tFallDuration data[6] #define tDeltaY2 data[7] static bool8 CreateSnowflakeSprite(void) { u8 spriteId = CreateSpriteAtEnd(&sSnowflakeSpriteTemplate, 0, 0, 78); if (spriteId == MAX_SPRITES) return FALSE; gSprites[spriteId].tSnowflakeId = gWeatherPtr->snowflakeSpriteCount; InitSnowflakeSpriteMovement(&gSprites[spriteId]); gSprites[spriteId].coordOffsetEnabled = TRUE; gWeatherPtr->sprites.s1.snowflakeSprites[gWeatherPtr->snowflakeSpriteCount++] = &gSprites[spriteId]; return TRUE; } static bool8 DestroySnowflakeSprite(void) { if (gWeatherPtr->snowflakeSpriteCount) { DestroySprite(gWeatherPtr->sprites.s1.snowflakeSprites[--gWeatherPtr->snowflakeSpriteCount]); return TRUE; } return FALSE; } static void InitSnowflakeSpriteMovement(struct Sprite *sprite) { u16 rand; u16 x = ((sprite->tSnowflakeId * 5) & 7) * 30 + (Random() % 30); sprite->y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY); sprite->x = x - (gSpriteCoordOffsetX + sprite->centerToCornerVecX); sprite->tPosY = sprite->y * 128; sprite->x2 = 0; rand = Random(); sprite->tDeltaY = (rand & 3) * 5 + 64; sprite->tDeltaY2 = sprite->tDeltaY; StartSpriteAnim(sprite, (rand & 1) ? 0 : 1); sprite->tWaveIndex = 0; sprite->tWaveDelta = ((rand & 3) == 0) ? 2 : 1; sprite->tFallDuration = (rand & 0x1F) + 220; sprite->tFallCounter = 0; } static void WaitSnowflakeSprite(struct Sprite *sprite) { if (++gWeatherPtr->snowflakeTimer > 18) { sprite->invisible = FALSE; sprite->callback = UpdateSnowflakeSprite; sprite->y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY); sprite->tPosY = sprite->y * 128; gWeatherPtr->snowflakeTimer = 0; } } static void UpdateSnowflakeSprite(struct Sprite *sprite) { s16 x; s16 y; sprite->tPosY += sprite->tDeltaY; sprite->y = sprite->tPosY >> 7; sprite->tWaveIndex += sprite->tWaveDelta; sprite->tWaveIndex &= 0xFF; sprite->x2 = gSineTable[sprite->tWaveIndex] / 64; x = (sprite->x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF; if (x & 0x100) x |= -0x100; if (x < -3) sprite->x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX); else if (x > 242) sprite->x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX); } #undef tPosY #undef tDeltaY #undef tWaveDelta #undef tWaveIndex #undef tSnowflakeId #undef tFallCounter #undef tFallDuration #undef tDeltaY2 //------------------------------------------------------------------------------ // WEATHER_RAIN_THUNDERSTORM //------------------------------------------------------------------------------ enum { // This block of states is run only once // when first setting up the thunderstorm TSTORM_STATE_LOAD_RAIN, TSTORM_STATE_CREATE_RAIN, TSTORM_STATE_INIT_RAIN, TSTORM_STATE_WAIT_CHANGE, // The thunderstorm loops through these states, // not necessarily in order. TSTORM_STATE_LOOP_START, TSTORM_STATE_LOOP_WAIT, TSTORM_STATE_INIT_THUNDER_SHORT_1, TSTORM_STATE_INIT_THUNDER_SHORT_2, TSTORM_STATE_TRY_THUNDER_SHORT, TSTORM_STATE_TRY_NEW_THUNDER, TSTORM_STATE_WAIT_THUNDER_SHORT, TSTORM_STATE_INIT_THUNDER_LONG, TSTORM_STATE_WAIT_THUNDER_LONG, TSTORM_STATE_FADE_THUNDER_LONG, TSTORM_STATE_END_THUNDER_LONG, }; void Thunderstorm_InitVars(void) { gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->rainSpriteVisibleCounter = 0; gWeatherPtr->rainSpriteVisibleDelay = 4; gWeatherPtr->isDownpour = FALSE; gWeatherPtr->targetRainSpriteCount = 16; gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment gWeatherPtr->thunderTriggered = FALSE; SetRainStrengthFromSoundEffect(SE_THUNDERSTORM); } void Thunderstorm_InitAll(void) { Thunderstorm_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) Thunderstorm_Main(); } //------------------------------------------------------------------------------ // WEATHER_DOWNPOUR //------------------------------------------------------------------------------ static void UpdateThunderSound(void); static void SetThunderCounter(u16); void Downpour_InitVars(void) { gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->rainSpriteVisibleCounter = 0; gWeatherPtr->rainSpriteVisibleDelay = 4; gWeatherPtr->isDownpour = TRUE; gWeatherPtr->targetRainSpriteCount = 24; gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment SetRainStrengthFromSoundEffect(SE_DOWNPOUR); } void Downpour_InitAll(void) { Downpour_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) Thunderstorm_Main(); } void Thunderstorm_Main(void) { UpdateThunderSound(); switch (gWeatherPtr->initStep) { case TSTORM_STATE_LOAD_RAIN: LoadRainSpriteSheet(); gWeatherPtr->initStep++; break; case TSTORM_STATE_CREATE_RAIN: if (!CreateRainSprite()) gWeatherPtr->initStep++; break; case TSTORM_STATE_INIT_RAIN: if (!UpdateVisibleRainSprites()) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; case TSTORM_STATE_WAIT_CHANGE: if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER) gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_SHORT_1; break; case TSTORM_STATE_LOOP_START: gWeatherPtr->thunderAllowEnd = TRUE; gWeatherPtr->thunderDelay = (Random() % 360) + 360; gWeatherPtr->initStep++; // fall through case TSTORM_STATE_LOOP_WAIT: // Wait between 360-720 frames before trying thunder again if (--gWeatherPtr->thunderDelay == 0) gWeatherPtr->initStep++; break; case TSTORM_STATE_INIT_THUNDER_SHORT_1: gWeatherPtr->thunderAllowEnd = TRUE; gWeatherPtr->thunderSkipShort = Random() % 2; gWeatherPtr->initStep++; break; case TSTORM_STATE_INIT_THUNDER_SHORT_2: gWeatherPtr->thunderShortRetries = (Random() & 1) + 1; gWeatherPtr->initStep++; // fall through case TSTORM_STATE_TRY_THUNDER_SHORT: WeatherShiftGammaIfPalStateIdle(19); if (!gWeatherPtr->thunderSkipShort && gWeatherPtr->thunderShortRetries == 1) SetThunderCounter(20); // Do short thunder gWeatherPtr->thunderDelay = (Random() % 3) + 6; gWeatherPtr->initStep++; break; case TSTORM_STATE_TRY_NEW_THUNDER: if (--gWeatherPtr->thunderDelay == 0) { WeatherShiftGammaIfPalStateIdle(3); gWeatherPtr->thunderAllowEnd = TRUE; if (--gWeatherPtr->thunderShortRetries != 0) { // Try a short thunder again gWeatherPtr->thunderDelay = (Random() % 16) + 60; gWeatherPtr->initStep = TSTORM_STATE_WAIT_THUNDER_SHORT; } else if (!gWeatherPtr->thunderSkipShort) { // No more thunder, restart loop gWeatherPtr->initStep = TSTORM_STATE_LOOP_START; } else { // Set up long thunder gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_LONG; } } break; case TSTORM_STATE_WAIT_THUNDER_SHORT: if (--gWeatherPtr->thunderDelay == 0) gWeatherPtr->initStep = TSTORM_STATE_TRY_THUNDER_SHORT; break; case TSTORM_STATE_INIT_THUNDER_LONG: gWeatherPtr->thunderDelay = (Random() % 16) + 60; gWeatherPtr->initStep++; break; case TSTORM_STATE_WAIT_THUNDER_LONG: if (--gWeatherPtr->thunderDelay == 0) { // Do long thunder SetThunderCounter(100); WeatherShiftGammaIfPalStateIdle(19); gWeatherPtr->thunderDelay = (Random() & 0xF) + 30; gWeatherPtr->initStep++; } break; case TSTORM_STATE_FADE_THUNDER_LONG: if (--gWeatherPtr->thunderDelay == 0) { WeatherBeginGammaFade(19, 3, 5); gWeatherPtr->initStep++; } break; case TSTORM_STATE_END_THUNDER_LONG: if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { gWeatherPtr->thunderAllowEnd = TRUE; gWeatherPtr->initStep = TSTORM_STATE_LOOP_START; } break; } } bool8 Thunderstorm_Finish(void) { switch (gWeatherPtr->finishStep) { case 0: gWeatherPtr->thunderAllowEnd = FALSE; gWeatherPtr->finishStep++; // fall through case 1: Thunderstorm_Main(); if (gWeatherPtr->thunderAllowEnd) { if (gWeatherPtr->nextWeather == WEATHER_RAIN || gWeatherPtr->nextWeather == WEATHER_RAIN_THUNDERSTORM || gWeatherPtr->nextWeather == WEATHER_DOWNPOUR) return FALSE; gWeatherPtr->targetRainSpriteCount = 0; gWeatherPtr->finishStep++; } break; case 2: if (!UpdateVisibleRainSprites()) { DestroyRainSprites(); gWeatherPtr->thunderTriggered = FALSE; gWeatherPtr->finishStep++; return FALSE; } break; default: return FALSE; } return TRUE; } static void SetThunderCounter(u16 max) { if (!gWeatherPtr->thunderTriggered) { gWeatherPtr->thunderCounter = Random() % max; gWeatherPtr->thunderTriggered = TRUE; } } static void UpdateThunderSound(void) { if (gWeatherPtr->thunderTriggered == TRUE) { if (gWeatherPtr->thunderCounter == 0) { if (IsSEPlaying()) return; if (Random() & 1) PlaySE(SE_THUNDER); else PlaySE(SE_THUNDER2); gWeatherPtr->thunderTriggered = FALSE; } else { gWeatherPtr->thunderCounter--; } } } //------------------------------------------------------------------------------ // WEATHER_FOG_HORIZONTAL and WEATHER_UNDERWATER //------------------------------------------------------------------------------ static const u16 sUnusedData[] = {0, 6, 6, 12, 18, 42, 300, 300}; static const struct OamData sOamData_FogH = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sAnim_FogH_0[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_END, }; static const union AnimCmd sAnim_FogH_1[] = { ANIMCMD_FRAME(32, 16), ANIMCMD_END, }; static const union AnimCmd sAnim_FogH_2[] = { ANIMCMD_FRAME(64, 16), ANIMCMD_END, }; static const union AnimCmd sAnim_FogH_3[] = { ANIMCMD_FRAME(96, 16), ANIMCMD_END, }; static const union AnimCmd sAnim_FogH_4[] = { ANIMCMD_FRAME(128, 16), ANIMCMD_END, }; static const union AnimCmd sAnim_FogH_5[] = { ANIMCMD_FRAME(160, 16), ANIMCMD_END, }; static const union AnimCmd *const sAnims_FogH[] = { sAnim_FogH_0, sAnim_FogH_1, sAnim_FogH_2, sAnim_FogH_3, sAnim_FogH_4, sAnim_FogH_5, }; static const union AffineAnimCmd sAffineAnim_FogH[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const sAffineAnims_FogH[] = { sAffineAnim_FogH, }; static void FogHorizontalSpriteCallback(struct Sprite *); static const struct SpriteTemplate sFogHorizontalSpriteTemplate = { .tileTag = GFXTAG_FOG_H, .paletteTag = PALTAG_WEATHER, .oam = &sOamData_FogH, .anims = sAnims_FogH, .images = NULL, .affineAnims = sAffineAnims_FogH, .callback = FogHorizontalSpriteCallback, }; static void CreateFogHorizontalSprites(void); static void DestroyFogHorizontalSprites(void); void FogHorizontal_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 20; if (!gWeatherPtr->fogHSpritesCreated) { gWeatherPtr->fogHScrollCounter = 0; gWeatherPtr->fogHScrollOffset = 0; gWeatherPtr->fogHScrollPosX = 0; Weather_SetBlendCoeffs(0, 16); } } void FogHorizontal_InitAll(void) { FogHorizontal_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) FogHorizontal_Main(); } void FogHorizontal_Main(void) { gWeatherPtr->fogHScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->fogHScrollOffset) & 0xFF; if (++gWeatherPtr->fogHScrollCounter > 3) { gWeatherPtr->fogHScrollCounter = 0; gWeatherPtr->fogHScrollOffset++; } switch (gWeatherPtr->initStep) { case 0: CreateFogHorizontalSprites(); if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) Weather_SetTargetBlendCoeffs(12, 8, 3); else Weather_SetTargetBlendCoeffs(4, 16, 0); gWeatherPtr->initStep++; break; case 1: if (Weather_UpdateBlend()) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; } } bool8 FogHorizontal_Finish(void) { gWeatherPtr->fogHScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->fogHScrollOffset) & 0xFF; if (++gWeatherPtr->fogHScrollCounter > 3) { gWeatherPtr->fogHScrollCounter = 0; gWeatherPtr->fogHScrollOffset++; } switch (gWeatherPtr->finishStep) { case 0: Weather_SetTargetBlendCoeffs(0, 16, 3); gWeatherPtr->finishStep++; break; case 1: if (Weather_UpdateBlend()) gWeatherPtr->finishStep++; break; case 2: DestroyFogHorizontalSprites(); gWeatherPtr->finishStep++; break; default: return FALSE; } return TRUE; } #define tSpriteColumn data[0] static void FogHorizontalSpriteCallback(struct Sprite *sprite) { sprite->y2 = (u8)gSpriteCoordOffsetY; sprite->x = gWeatherPtr->fogHScrollPosX + 32 + sprite->tSpriteColumn * 64; if (sprite->x >= DISPLAY_WIDTH + 32) { sprite->x = (DISPLAY_WIDTH * 2) + gWeatherPtr->fogHScrollPosX - (4 - sprite->tSpriteColumn) * 64; sprite->x &= 0x1FF; } } static void CreateFogHorizontalSprites(void) { u32 i; u8 spriteId; struct Sprite *sprite; if (!gWeatherPtr->fogHSpritesCreated) { struct SpriteSheet fogHorizontalSpriteSheet = { .data = gWeatherFogHorizontalTiles, .size = 0x0800, .tag = GFXTAG_FOG_H, }; LoadSpriteSheet(&fogHorizontalSpriteSheet); for (i = 0; i < NUM_FOG_HORIZONTAL_SPRITES; i++) { spriteId = CreateSpriteAtEnd(&sFogHorizontalSpriteTemplate, 0, 0, 0xFF); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->tSpriteColumn = i % 5; sprite->x = (i % 5) * 64 + 32; sprite->y = (i / 5) * 64 + 32; gWeatherPtr->sprites.s2.fogHSprites[i] = sprite; } else { gWeatherPtr->sprites.s2.fogHSprites[i] = NULL; } } gWeatherPtr->fogHSpritesCreated = TRUE; } } static void DestroyFogHorizontalSprites(void) { u32 i; if (gWeatherPtr->fogHSpritesCreated) { for (i = 0; i < NUM_FOG_HORIZONTAL_SPRITES; i++) { if (gWeatherPtr->sprites.s2.fogHSprites[i] != NULL) DestroySprite(gWeatherPtr->sprites.s2.fogHSprites[i]); } FreeSpriteTilesByTag(GFXTAG_FOG_H); gWeatherPtr->fogHSpritesCreated = FALSE; } } #undef tSpriteColumn //------------------------------------------------------------------------------ // WEATHER_VOLCANIC_ASH //------------------------------------------------------------------------------ static void LoadAshSpriteSheet(void); static void CreateAshSprites(void); static void DestroyAshSprites(void); static void UpdateAshSprite(struct Sprite *); void Ash_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->ashUnused = 20; // Never read if (!gWeatherPtr->ashSpritesCreated) { Weather_SetBlendCoeffs(0, 16); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(64, 63)); // These aren't valid blend coefficients! } } void Ash_InitAll(void) { Ash_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) Ash_Main(); } void Ash_Main(void) { gWeatherPtr->ashBaseSpritesX = gSpriteCoordOffsetX & 0x1FF; while (gWeatherPtr->ashBaseSpritesX >= DISPLAY_WIDTH) gWeatherPtr->ashBaseSpritesX -= DISPLAY_WIDTH; switch (gWeatherPtr->initStep) { case 0: LoadAshSpriteSheet(); gWeatherPtr->initStep++; break; case 1: if (!gWeatherPtr->ashSpritesCreated) CreateAshSprites(); Weather_SetTargetBlendCoeffs(16, 0, 1); gWeatherPtr->initStep++; break; case 2: if (Weather_UpdateBlend()) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; default: Weather_UpdateBlend(); break; } } bool8 Ash_Finish(void) { switch (gWeatherPtr->finishStep) { case 0: Weather_SetTargetBlendCoeffs(0, 16, 1); gWeatherPtr->finishStep++; break; case 1: if (Weather_UpdateBlend()) { DestroyAshSprites(); gWeatherPtr->finishStep++; } break; case 2: SetGpuReg(REG_OFFSET_BLDALPHA, 0); gWeatherPtr->finishStep++; return FALSE; default: return FALSE; } return TRUE; } static const struct SpriteSheet sAshSpriteSheet = { .data = gWeatherAshTiles, .size = 0x1000, .tag = GFXTAG_ASH, }; static void LoadAshSpriteSheet(void) { LoadSpriteSheet(&sAshSpriteSheet); } static const struct OamData sAshSpriteOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 1, .paletteNum = 15, }; static const union AnimCmd sAshSpriteAnimCmd0[] = { ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(64, 60), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAshSpriteAnimCmds[] = { sAshSpriteAnimCmd0, }; static const struct SpriteTemplate sAshSpriteTemplate = { .tileTag = GFXTAG_ASH, .paletteTag = PALTAG_WEATHER, .oam = &sAshSpriteOamData, .anims = sAshSpriteAnimCmds, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateAshSprite, }; #define tOffsetY data[0] #define tCounterY data[1] #define tSpriteColumn data[2] #define tSpriteRow data[3] static void CreateAshSprites(void) { u32 i; u8 spriteId; struct Sprite *sprite; if (!gWeatherPtr->ashSpritesCreated) { for (i = 0; i < NUM_ASH_SPRITES; i++) { spriteId = CreateSpriteAtEnd(&sAshSpriteTemplate, 0, 0, 0x4E); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->tCounterY = 0; sprite->tSpriteColumn = (u8)(i % 5); sprite->tSpriteRow = (u8)(i / 5); sprite->tOffsetY = sprite->tSpriteRow * 64 + 32; gWeatherPtr->sprites.s2.ashSprites[i] = sprite; } else { gWeatherPtr->sprites.s2.ashSprites[i] = NULL; } } gWeatherPtr->ashSpritesCreated = TRUE; } } static void DestroyAshSprites(void) { u32 i; if (gWeatherPtr->ashSpritesCreated) { for (i = 0; i < NUM_ASH_SPRITES; i++) { if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) DestroySprite(gWeatherPtr->sprites.s2.ashSprites[i]); } FreeSpriteTilesByTag(GFXTAG_ASH); gWeatherPtr->ashSpritesCreated = FALSE; } } static void UpdateAshSprite(struct Sprite *sprite) { if (++sprite->tCounterY > 5) { sprite->tCounterY = 0; sprite->tOffsetY++; } sprite->y = gSpriteCoordOffsetY + sprite->tOffsetY; sprite->x = gWeatherPtr->ashBaseSpritesX + 32 + sprite->tSpriteColumn * 64; if (sprite->x >= DISPLAY_WIDTH + 32) { sprite->x = gWeatherPtr->ashBaseSpritesX + (DISPLAY_WIDTH * 2) - (4 - sprite->tSpriteColumn) * 64; sprite->x &= 0x1FF; } } #undef tOffsetY #undef tCounterY #undef tSpriteColumn #undef tSpriteRow //------------------------------------------------------------------------------ // WEATHER_FOG_DIAGONAL //------------------------------------------------------------------------------ static void UpdateFogDiagonalMovement(void); static void CreateFogDiagonalSprites(void); static void DestroyFogDiagonalSprites(void); static void UpdateFogDiagonalSprite(struct Sprite *); void FogDiagonal_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = 0; gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->fogHScrollCounter = 0; gWeatherPtr->fogHScrollOffset = 1; if (!gWeatherPtr->fogDSpritesCreated) { gWeatherPtr->fogDScrollXCounter = 0; gWeatherPtr->fogDScrollYCounter = 0; gWeatherPtr->fogDXOffset = 0; gWeatherPtr->fogDYOffset = 0; gWeatherPtr->fogDBaseSpritesX = 0; gWeatherPtr->fogDPosY = 0; Weather_SetBlendCoeffs(0, 16); } } void FogDiagonal_InitAll(void) { FogDiagonal_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) FogDiagonal_Main(); } void FogDiagonal_Main(void) { UpdateFogDiagonalMovement(); switch (gWeatherPtr->initStep) { case 0: CreateFogDiagonalSprites(); gWeatherPtr->initStep++; break; case 1: Weather_SetTargetBlendCoeffs(12, 8, 8); gWeatherPtr->initStep++; break; case 2: if (!Weather_UpdateBlend()) break; gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; break; } } bool8 FogDiagonal_Finish(void) { UpdateFogDiagonalMovement(); switch (gWeatherPtr->finishStep) { case 0: Weather_SetTargetBlendCoeffs(0, 16, 1); gWeatherPtr->finishStep++; break; case 1: if (!Weather_UpdateBlend()) break; gWeatherPtr->finishStep++; break; case 2: DestroyFogDiagonalSprites(); gWeatherPtr->finishStep++; break; default: return FALSE; } return TRUE; } static void UpdateFogDiagonalMovement(void) { if (++gWeatherPtr->fogDScrollXCounter > 2) { gWeatherPtr->fogDXOffset++; gWeatherPtr->fogDScrollXCounter = 0; } if (++gWeatherPtr->fogDScrollYCounter > 4) { gWeatherPtr->fogDYOffset++; gWeatherPtr->fogDScrollYCounter = 0; } gWeatherPtr->fogDBaseSpritesX = (gSpriteCoordOffsetX - gWeatherPtr->fogDXOffset) & 0xFF; gWeatherPtr->fogDPosY = gSpriteCoordOffsetY + gWeatherPtr->fogDYOffset; } static const struct SpriteSheet gFogDiagonalSpriteSheet = { .data = gWeatherFogDiagonalTiles, .size = 0x0800, .tag = GFXTAG_FOG_D, }; static const struct OamData sFogDiagonalSpriteOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, }; static const union AnimCmd sFogDiagonalSpriteAnimCmd0[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_END, }; static const union AnimCmd *const sFogDiagonalSpriteAnimCmds[] = { sFogDiagonalSpriteAnimCmd0, }; static const struct SpriteTemplate sFogDiagonalSpriteTemplate = { .tileTag = GFXTAG_FOG_D, .paletteTag = PALTAG_WEATHER, .oam = &sFogDiagonalSpriteOamData, .anims = sFogDiagonalSpriteAnimCmds, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateFogDiagonalSprite, }; #define tSpriteColumn data[0] #define tSpriteRow data[1] static void CreateFogDiagonalSprites(void) { u32 i; struct SpriteSheet fogDiagonalSpriteSheet; u8 spriteId; struct Sprite *sprite; if (!gWeatherPtr->fogDSpritesCreated) { fogDiagonalSpriteSheet = gFogDiagonalSpriteSheet; LoadSpriteSheet(&fogDiagonalSpriteSheet); for (i = 0; i < NUM_FOG_DIAGONAL_SPRITES; i++) { spriteId = CreateSpriteAtEnd(&sFogDiagonalSpriteTemplate, 0, (i / 5) * 64, 0xFF); if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->tSpriteColumn = i % 5; sprite->tSpriteRow = i / 5; gWeatherPtr->sprites.s2.fogDSprites[i] = sprite; } else { gWeatherPtr->sprites.s2.fogDSprites[i] = NULL; } } gWeatherPtr->fogDSpritesCreated = TRUE; } } static void DestroyFogDiagonalSprites(void) { u32 i; if (gWeatherPtr->fogDSpritesCreated) { for (i = 0; i < NUM_FOG_DIAGONAL_SPRITES; i++) { if (gWeatherPtr->sprites.s2.fogDSprites[i]) DestroySprite(gWeatherPtr->sprites.s2.fogDSprites[i]); } FreeSpriteTilesByTag(GFXTAG_FOG_D); gWeatherPtr->fogDSpritesCreated = FALSE; } } static void UpdateFogDiagonalSprite(struct Sprite *sprite) { sprite->y2 = gWeatherPtr->fogDPosY; sprite->x = gWeatherPtr->fogDBaseSpritesX + 32 + sprite->tSpriteColumn * 64; if (sprite->x >= DISPLAY_WIDTH + 32) { sprite->x = gWeatherPtr->fogDBaseSpritesX + (DISPLAY_WIDTH * 2) - (4 - sprite->tSpriteColumn) * 64; sprite->x &= 0x1FF; } } #undef tSpriteColumn #undef tSpriteRow //------------------------------------------------------------------------------ // WEATHER_SANDSTORM //------------------------------------------------------------------------------ static void UpdateSandstormWaveIndex(void); static void UpdateSandstormMovement(void); static void CreateSandstormSprites(void); static void CreateSwirlSandstormSprites(void); static void DestroySandstormSprites(void); static void UpdateSandstormSprite(struct Sprite *); static void WaitSandSwirlSpriteEntrance(struct Sprite *); static void UpdateSandstormSwirlSprite(struct Sprite *); #define MIN_SANDSTORM_WAVE_INDEX 0x20 void Sandstorm_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = 0; gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 20; if (!gWeatherPtr->sandstormSpritesCreated) { gWeatherPtr->sandstormXOffset = gWeatherPtr->sandstormYOffset = 0; gWeatherPtr->sandstormWaveIndex = 8; gWeatherPtr->sandstormWaveCounter = 0; // Dead code. How does the compiler not optimize this out? if (gWeatherPtr->sandstormWaveIndex >= 0x80 - MIN_SANDSTORM_WAVE_INDEX) gWeatherPtr->sandstormWaveIndex = 0x80 - gWeatherPtr->sandstormWaveIndex; Weather_SetBlendCoeffs(0, 16); } } void Sandstorm_InitAll(void) { Sandstorm_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) Sandstorm_Main(); } void Sandstorm_Main(void) { UpdateSandstormMovement(); UpdateSandstormWaveIndex(); if (gWeatherPtr->sandstormWaveIndex >= 0x80 - MIN_SANDSTORM_WAVE_INDEX) gWeatherPtr->sandstormWaveIndex = MIN_SANDSTORM_WAVE_INDEX; switch (gWeatherPtr->initStep) { case 0: CreateSandstormSprites(); CreateSwirlSandstormSprites(); gWeatherPtr->initStep++; break; case 1: Weather_SetTargetBlendCoeffs(16, 0, 0); gWeatherPtr->initStep++; break; case 2: if (Weather_UpdateBlend()) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; } } bool8 Sandstorm_Finish(void) { UpdateSandstormMovement(); UpdateSandstormWaveIndex(); switch (gWeatherPtr->finishStep) { case 0: Weather_SetTargetBlendCoeffs(0, 16, 0); gWeatherPtr->finishStep++; break; case 1: if (Weather_UpdateBlend()) gWeatherPtr->finishStep++; break; case 2: DestroySandstormSprites(); gWeatherPtr->finishStep++; break; default: return FALSE; } return TRUE; } static void UpdateSandstormWaveIndex(void) { if (gWeatherPtr->sandstormWaveCounter++ > 4) { gWeatherPtr->sandstormWaveIndex++; gWeatherPtr->sandstormWaveCounter = 0; } } static void UpdateSandstormMovement(void) { gWeatherPtr->sandstormXOffset -= gSineTable[gWeatherPtr->sandstormWaveIndex] * 4; gWeatherPtr->sandstormYOffset -= gSineTable[gWeatherPtr->sandstormWaveIndex]; gWeatherPtr->sandstormBaseSpritesX = (gSpriteCoordOffsetX + (gWeatherPtr->sandstormXOffset >> 8)) & 0xFF; gWeatherPtr->sandstormPosY = gSpriteCoordOffsetY + (gWeatherPtr->sandstormYOffset >> 8); } static void DestroySandstormSprites(void) { u32 i; if (gWeatherPtr->sandstormSpritesCreated) { for (i = 0; i < NUM_SANDSTORM_SPRITES; i++) { if (gWeatherPtr->sprites.s2.sandstormSprites1[i]) DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites1[i]); } gWeatherPtr->sandstormSpritesCreated = FALSE; FreeSpriteTilesByTag(GFXTAG_SANDSTORM); } if (gWeatherPtr->sandstormSwirlSpritesCreated) { for (i = 0; i < NUM_SWIRL_SANDSTORM_SPRITES; i++) { if (gWeatherPtr->sprites.s2.sandstormSprites2[i] != NULL) DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites2[i]); } gWeatherPtr->sandstormSwirlSpritesCreated = FALSE; } } static const struct OamData sSandstormSpriteOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 1, .paletteNum = 0, }; static const union AnimCmd sSandstormSpriteAnimCmd0[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_END, }; static const union AnimCmd sSandstormSpriteAnimCmd1[] = { ANIMCMD_FRAME(64, 3), ANIMCMD_END, }; static const union AnimCmd *const sSandstormSpriteAnimCmds[] = { sSandstormSpriteAnimCmd0, sSandstormSpriteAnimCmd1, }; static const struct SpriteTemplate sSandstormSpriteTemplate = { .tileTag = GFXTAG_SANDSTORM, .paletteTag = PALTAG_WEATHER, .oam = &sSandstormSpriteOamData, .anims = sSandstormSpriteAnimCmds, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateSandstormSprite, }; static const struct SpriteSheet sSandstormSpriteSheet = { .data = gWeatherSandstormTiles, .size = 0x0a00, .tag = GFXTAG_SANDSTORM, }; // Regular sandstorm sprites #define tSpriteColumn data[0] #define tSpriteRow data[1] // Swirly sandstorm sprites #define tRadius data[0] #define tWaveIndex data[1] #define tRadiusCounter data[2] #define tEntranceDelay data[3] static void CreateSandstormSprites(void) { u32 i; u8 spriteId; if (!gWeatherPtr->sandstormSpritesCreated) { LoadSpriteSheet(&sSandstormSpriteSheet); LoadCustomWeatherSpritePalette(gSandstormWeatherPalette); for (i = 0; i < NUM_SANDSTORM_SPRITES; i++) { spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1); if (spriteId != MAX_SPRITES) { gWeatherPtr->sprites.s2.sandstormSprites1[i] = &gSprites[spriteId]; gWeatherPtr->sprites.s2.sandstormSprites1[i]->tSpriteColumn = i % 5; gWeatherPtr->sprites.s2.sandstormSprites1[i]->tSpriteRow = i / 5; } else { gWeatherPtr->sprites.s2.sandstormSprites1[i] = NULL; } } gWeatherPtr->sandstormSpritesCreated = TRUE; } } static const u16 sSwirlEntranceDelays[] = {0, 120, 80, 160, 40, 0}; static void CreateSwirlSandstormSprites(void) { u32 i; u8 spriteId; if (!gWeatherPtr->sandstormSwirlSpritesCreated) { for (i = 0; i < NUM_SWIRL_SANDSTORM_SPRITES; i++) { spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, i * 48 + 24, 208, 1); if (spriteId != MAX_SPRITES) { gWeatherPtr->sprites.s2.sandstormSprites2[i] = &gSprites[spriteId]; gWeatherPtr->sprites.s2.sandstormSprites2[i]->oam.size = ST_OAM_SIZE_2; gWeatherPtr->sprites.s2.sandstormSprites2[i]->tSpriteRow = i * 51; gWeatherPtr->sprites.s2.sandstormSprites2[i]->tRadius = 8; gWeatherPtr->sprites.s2.sandstormSprites2[i]->tRadiusCounter = 0; gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[4] = 0x6730; // unused value gWeatherPtr->sprites.s2.sandstormSprites2[i]->tEntranceDelay = sSwirlEntranceDelays[i]; StartSpriteAnim(gWeatherPtr->sprites.s2.sandstormSprites2[i], 1); CalcCenterToCornerVec(gWeatherPtr->sprites.s2.sandstormSprites2[i], SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), ST_OAM_AFFINE_OFF); gWeatherPtr->sprites.s2.sandstormSprites2[i]->callback = WaitSandSwirlSpriteEntrance; } else { gWeatherPtr->sprites.s2.sandstormSprites2[i] = NULL; } gWeatherPtr->sandstormSwirlSpritesCreated = TRUE; } } } static void UpdateSandstormSprite(struct Sprite *sprite) { sprite->y2 = gWeatherPtr->sandstormPosY; sprite->x = gWeatherPtr->sandstormBaseSpritesX + 32 + sprite->tSpriteColumn * 64; if (sprite->x >= DISPLAY_WIDTH + 32) { sprite->x = gWeatherPtr->sandstormBaseSpritesX + (DISPLAY_WIDTH * 2) - (4 - sprite->tSpriteColumn) * 64; sprite->x &= 0x1FF; } } static void WaitSandSwirlSpriteEntrance(struct Sprite *sprite) { if (--sprite->tEntranceDelay == -1) sprite->callback = UpdateSandstormSwirlSprite; } static void UpdateSandstormSwirlSprite(struct Sprite *sprite) { u32 x, y; if (--sprite->y < -48) { sprite->y = DISPLAY_HEIGHT + 48; sprite->tRadius = 4; } x = sprite->tRadius * gSineTable[sprite->tWaveIndex]; y = sprite->tRadius * gSineTable[sprite->tWaveIndex + 0x40]; sprite->x2 = x >> 8; sprite->y2 = y >> 8; sprite->tWaveIndex = (sprite->tWaveIndex + 10) & 0xFF; if (++sprite->tRadiusCounter > 8) { sprite->tRadiusCounter = 0; sprite->tRadius++; } } #undef tSpriteColumn #undef tSpriteRow #undef tRadius #undef tWaveIndex #undef tRadiusCounter #undef tEntranceDelay //------------------------------------------------------------------------------ // WEATHER_SHADE //------------------------------------------------------------------------------ void Shade_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; } void Shade_InitAll(void) { Shade_InitVars(); } void Shade_Main(void) { } bool8 Shade_Finish(void) { return FALSE; } //------------------------------------------------------------------------------ // WEATHER_UNDERWATER_BUBBLES //------------------------------------------------------------------------------ static void CreateBubbleSprite(u16); static void DestroyBubbleSprites(void); static void UpdateBubbleSprite(struct Sprite *); static const u8 sBubbleStartDelays[] = {40, 90, 60, 90, 2, 60, 40, 30}; static const struct SpriteSheet sWeatherBubbleSpriteSheet = { .data = gWeatherBubbleTiles, .size = 0x0040, .tag = GFXTAG_BUBBLE, }; static const s16 sBubbleStartCoords[][2] = { {120, 160}, {376, 160}, { 40, 140}, {296, 140}, {180, 130}, {436, 130}, { 60, 160}, {436, 160}, {220, 180}, {476, 180}, { 10, 90}, {266, 90}, {256, 160}, }; void Bubbles_InitVars(void) { FogHorizontal_InitVars(); if (!gWeatherPtr->bubblesSpritesCreated) { LoadSpriteSheet(&sWeatherBubbleSpriteSheet); gWeatherPtr->bubblesDelayIndex = 0; gWeatherPtr->bubblesDelayCounter = sBubbleStartDelays[0]; gWeatherPtr->bubblesCoordsIndex = 0; gWeatherPtr->bubblesSpriteCount = 0; } } void Bubbles_InitAll(void) { Bubbles_InitVars(); while (!gWeatherPtr->weatherGfxLoaded) Bubbles_Main(); } void Bubbles_Main(void) { FogHorizontal_Main(); if (++gWeatherPtr->bubblesDelayCounter > sBubbleStartDelays[gWeatherPtr->bubblesDelayIndex]) { gWeatherPtr->bubblesDelayCounter = 0; if (++gWeatherPtr->bubblesDelayIndex > NELEMS(sBubbleStartDelays) - 1) gWeatherPtr->bubblesDelayIndex = 0; CreateBubbleSprite(gWeatherPtr->bubblesCoordsIndex); if (++gWeatherPtr->bubblesCoordsIndex > NELEMS(sBubbleStartCoords) - 1) gWeatherPtr->bubblesCoordsIndex = 0; } } bool8 Bubbles_Finish(void) { if (!FogHorizontal_Finish()) { DestroyBubbleSprites(); return FALSE; } return TRUE; } static const union AnimCmd sBubbleSpriteAnimCmd0[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_FRAME(1, 16), ANIMCMD_END, }; static const union AnimCmd *const sBubbleSpriteAnimCmds[] = { sBubbleSpriteAnimCmd0, }; static const struct SpriteTemplate sBubbleSpriteTemplate = { .tileTag = GFXTAG_BUBBLE, .paletteTag = PALTAG_WEATHER, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sBubbleSpriteAnimCmds, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateBubbleSprite, }; #define tScrollXCounter data[0] #define tScrollXDir data[1] #define tCounter data[2] static void CreateBubbleSprite(u16 coordsIndex) { s16 x = sBubbleStartCoords[coordsIndex][0]; s16 y = sBubbleStartCoords[coordsIndex][1] - gSpriteCoordOffsetY; u8 spriteId = CreateSpriteAtEnd(&sBubbleSpriteTemplate, x, y, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = 1; gSprites[spriteId].coordOffsetEnabled = TRUE; gSprites[spriteId].tScrollXCounter = 0; gSprites[spriteId].tScrollXDir = 0; gSprites[spriteId].tCounter = 0; gWeatherPtr->bubblesSpriteCount++; } } static void DestroyBubbleSprites(void) { u32 i; if (gWeatherPtr->bubblesSpriteCount) { for (i = 0; i < MAX_SPRITES; i++) { if (gSprites[i].template == &sBubbleSpriteTemplate) DestroySprite(&gSprites[i]); } FreeSpriteTilesByTag(GFXTAG_BUBBLE); gWeatherPtr->bubblesSpriteCount = 0; } } static void UpdateBubbleSprite(struct Sprite *sprite) { ++sprite->tScrollXCounter; if (++sprite->tScrollXCounter > 8) // double increment { sprite->tScrollXCounter = 0; if (sprite->tScrollXDir == 0) { if (++sprite->x2 > 4) sprite->tScrollXDir = 1; } else { if (--sprite->x2 <= 0) sprite->tScrollXDir = 0; } } sprite->y -= 3; if (++sprite->tCounter >= 120) DestroySprite(sprite); } #undef tScrollXCounter #undef tScrollXDir #undef tCounter ================================================ FILE: src/field_weather_util.c ================================================ #include "global.h" #include "event_data.h" #include "field_weather.h" #include "overworld.h" #include "random.h" #include "constants/weather.h" #include "constants/layouts.h" #include "constants/region_map_sections.h" static u8 TranslateWeatherNum(u8 weather); static void UpdateRainCounter(u8 newWeather, u8 oldWeather); void SetSavedWeather(u32 weather) { u8 oldWeather = gSaveBlock1Ptr->weather; gSaveBlock1Ptr->weather = TranslateWeatherNum(weather); UpdateRainCounter(gSaveBlock1Ptr->weather, oldWeather); } u8 GetSav1Weather(void) { return gSaveBlock1Ptr->weather; } void SetSavedWeatherFromCurrMapHeader(void) { u8 oldWeather = gSaveBlock1Ptr->weather; if(gMapHeader.mapLayoutId != LAYOUT_FOUR_ISLAND || gMapHeader.mapLayoutId != LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION) { gSaveBlock1Ptr->weather = TranslateWeatherNum(gMapHeader.weather); if(gMapHeader.regionMapSectionId != MAPSEC_FOUR_ISLAND && gMapHeader.regionMapSectionId != MAPSEC_ICEFALL_CAVE) { FlagClear(FLAG_FOUR_ISLAND_SNOW); } } if (gMapHeader.mapLayoutId == LAYOUT_FOUR_ISLAND || gMapHeader.mapLayoutId == LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION) { if(!FlagGet(FLAG_FOUR_ISLAND_SNOW)) { u8 rand = Random() % 255; if(rand < 73) { FlagSet(FLAG_FOUR_ISLAND_SNOW); if(gMapHeader.mapLayoutId == LAYOUT_FOUR_ISLAND) gSaveBlock1Ptr->weather = TranslateWeatherNum(WEATHER_SNOW); } } else { if(gMapHeader.mapLayoutId == LAYOUT_FOUR_ISLAND) gSaveBlock1Ptr->weather = TranslateWeatherNum(WEATHER_SNOW); } } UpdateRainCounter(gSaveBlock1Ptr->weather, oldWeather); } void SetWeather(u32 weather) { SetSavedWeather(weather); SetNextWeather(GetSav1Weather()); } void SetWeather_Unused(u32 weather) { SetSavedWeather(weather); SetCurrentAndNextWeather(GetSav1Weather()); } void DoCurrentWeather(void) { u8 weather = GetSav1Weather(); SetNextWeather(weather); } void ResumePausedWeather(void) { u8 weather = GetSav1Weather(); SetCurrentAndNextWeather(weather); } static const u8 sWeatherCycleRoute119[] = { WEATHER_SUNNY, WEATHER_RAIN, WEATHER_RAIN_THUNDERSTORM, WEATHER_RAIN, }; static const u8 sWeatherCycleRoute123[] = { WEATHER_SUNNY, WEATHER_SUNNY, WEATHER_RAIN, WEATHER_SUNNY, }; static u8 TranslateWeatherNum(u8 weather) { switch (weather) { case WEATHER_NONE: return WEATHER_NONE; case WEATHER_SUNNY_CLOUDS: return WEATHER_SUNNY_CLOUDS; case WEATHER_SUNNY: return WEATHER_SUNNY; case WEATHER_RAIN: return WEATHER_RAIN; case WEATHER_SNOW: return WEATHER_SNOW; case WEATHER_RAIN_THUNDERSTORM: return WEATHER_RAIN_THUNDERSTORM; case WEATHER_FOG_HORIZONTAL: return WEATHER_FOG_HORIZONTAL; case WEATHER_VOLCANIC_ASH: return WEATHER_VOLCANIC_ASH; case WEATHER_SANDSTORM: return WEATHER_SANDSTORM; case WEATHER_FOG_DIAGONAL: return WEATHER_FOG_DIAGONAL; case WEATHER_UNDERWATER: return WEATHER_UNDERWATER; case WEATHER_SHADE: return WEATHER_SHADE; case WEATHER_DROUGHT: return WEATHER_DROUGHT; case WEATHER_DOWNPOUR: return WEATHER_DOWNPOUR; case WEATHER_UNDERWATER_BUBBLES: return WEATHER_UNDERWATER_BUBBLES; case WEATHER_ROUTE119_CYCLE: return sWeatherCycleRoute119[gSaveBlock1Ptr->weatherCycleStage]; case WEATHER_ROUTE123_CYCLE: return sWeatherCycleRoute123[gSaveBlock1Ptr->weatherCycleStage]; default: return WEATHER_NONE; } } void UpdateWeatherPerDay(u16 increment) { u16 weatherStage = gSaveBlock1Ptr->weatherCycleStage + increment; weatherStage %= 4; gSaveBlock1Ptr->weatherCycleStage = weatherStage; } static void UpdateRainCounter(u8 newWeather, u8 oldWeather) { if (newWeather != oldWeather && (newWeather == WEATHER_RAIN || newWeather == WEATHER_RAIN_THUNDERSTORM)) IncrementGameStat(GAME_STAT_GOT_RAINED_ON); } ================================================ FILE: src/fieldmap.c ================================================ #include "global.h" #include "gflib.h" #include "overworld.h" #include "script.h" #include "new_menu_helpers.h" #include "quest_log.h" #include "fieldmap.h" struct ConnectionFlags { u8 south:1; u8 north:1; u8 west:1; u8 east:1; }; struct BackupMapLayout VMap; EWRAM_DATA u16 gBackupMapData[VIRTUAL_MAP_SIZE] = {}; EWRAM_DATA struct MapHeader gMapHeader = {}; EWRAM_DATA struct Camera gCamera = {}; static EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {}; EWRAM_DATA u8 gGlobalFieldTintMode = QL_TINT_NONE; static const struct ConnectionFlags sDummyConnectionFlags = {}; static void InitMapLayoutData(struct MapHeader *); static void InitBackupMapLayoutData(const u16 *, u16, u16); static void InitBackupMapLayoutConnections(struct MapHeader *); static void FillSouthConnection(struct MapHeader const *, struct MapHeader const *, s32); static void FillNorthConnection(struct MapHeader const *, struct MapHeader const *, s32); static void FillWestConnection(struct MapHeader const *, struct MapHeader const *, s32); static void FillEastConnection(struct MapHeader const *, struct MapHeader const *, s32); static void LoadSavedMapView(void); static const struct MapConnection *GetIncomingConnection(u8, s32, s32); static bool8 IsPosInIncomingConnectingMap(u8, s32, s32, const struct MapConnection *); static bool8 IsCoordInIncomingConnectingMap(s32, s32, s32, s32); static u32 GetAttributeByMetatileIdAndMapLayout(const struct MapLayout *, u16, u8); #define GetBorderBlockAt(x, y) ({ \ u16 block; \ s32 xprime; \ s32 yprime; \ \ const struct MapLayout *mapLayout = gMapHeader.mapLayout; \ \ xprime = x - MAP_OFFSET; \ xprime += 8 * mapLayout->borderWidth; \ xprime %= mapLayout->borderWidth; \ \ yprime = y - MAP_OFFSET; \ yprime += 8 * mapLayout->borderHeight; \ yprime %= mapLayout->borderHeight; \ \ block = mapLayout->border[xprime + yprime * mapLayout->borderWidth] | MAPGRID_COLLISION_MASK; \ }) #define AreCoordsWithinMapGridBounds(x, y) (x >= 0 && x < VMap.Xsize && y >= 0 && y < VMap.Ysize) #define GetMapGridBlockAt(x, y) (AreCoordsWithinMapGridBounds(x, y) ? VMap.map[x + VMap.Xsize * y] : GetBorderBlockAt(x, y)) // Masks/shifts for metatile attributes // This is the format of the data stored in each data/tilesets/*/*/metatile_attributes.bin file static const u32 sMetatileAttrMasks[METATILE_ATTRIBUTE_COUNT] = { [METATILE_ATTRIBUTE_BEHAVIOR] = 0x000001ff, // Bits 0-8 [METATILE_ATTRIBUTE_TERRAIN] = 0x00003e00, // Bits 9-13 [METATILE_ATTRIBUTE_2] = 0x0003c000, // Bits 14-17 [METATILE_ATTRIBUTE_3] = 0x00fc0000, // Bits 18-23 [METATILE_ATTRIBUTE_ENCOUNTER_TYPE] = 0x07000000, // Bits 24-26 [METATILE_ATTRIBUTE_5] = 0x18000000, // Bits 27-28 [METATILE_ATTRIBUTE_LAYER_TYPE] = 0x60000000, // Bits 29-30 [METATILE_ATTRIBUTE_7] = 0x80000000 // Bit 31 }; static const u8 sMetatileAttrShifts[METATILE_ATTRIBUTE_COUNT] = { [METATILE_ATTRIBUTE_BEHAVIOR] = 0, [METATILE_ATTRIBUTE_TERRAIN] = 9, [METATILE_ATTRIBUTE_2] = 14, [METATILE_ATTRIBUTE_3] = 18, [METATILE_ATTRIBUTE_ENCOUNTER_TYPE] = 24, [METATILE_ATTRIBUTE_5] = 27, [METATILE_ATTRIBUTE_LAYER_TYPE] = 29, [METATILE_ATTRIBUTE_7] = 31 }; const struct MapHeader * GetMapHeaderFromConnection(const struct MapConnection * connection) { return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum); } void InitMap(void) { InitMapLayoutData(&gMapHeader); RunOnLoadMapScript(); } void InitMapFromSavedGame(void) { InitMapLayoutData(&gMapHeader); LoadSavedMapView(); RunOnLoadMapScript(); } static void InitMapLayoutData(struct MapHeader * mapHeader) { const struct MapLayout * mapLayout = mapHeader->mapLayout; CpuFastFill16(MAPGRID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData)); VMap.map = gBackupMapData; VMap.Xsize = mapLayout->width + MAP_OFFSET_W; VMap.Ysize = mapLayout->height + MAP_OFFSET_H; AGB_ASSERT_EX(VMap.Xsize * VMap.Ysize <= VIRTUAL_MAP_SIZE, ABSPATH("fieldmap.c"), 158); InitBackupMapLayoutData(mapLayout->map, mapLayout->width, mapLayout->height); InitBackupMapLayoutConnections(mapHeader); } static void InitBackupMapLayoutData(const u16 *map, u16 width, u16 height) { s32 y; u16 *dest = VMap.map; dest += VMap.Xsize * 7 + MAP_OFFSET; for (y = 0; y < height; y++) { CpuCopy16(map, dest, width * sizeof(u16)); dest += width + MAP_OFFSET_W; map += width; } } static void InitBackupMapLayoutConnections(struct MapHeader *mapHeader) { s32 count; const struct MapConnection *connection; s32 i; gMapConnectionFlags = sDummyConnectionFlags; /* * This null pointer check is new to FireRed. It was kept in * Emerald, with the above struct assignment moved to after * this check. */ if (mapHeader->connections) { count = mapHeader->connections->count; connection = mapHeader->connections->connections; for (i = 0; i < count; i++, connection++) { struct MapHeader const *cMap = GetMapHeaderFromConnection(connection); u32 offset = connection->offset; switch (connection->direction) { case CONNECTION_SOUTH: FillSouthConnection(mapHeader, cMap, offset); gMapConnectionFlags.south = TRUE; break; case CONNECTION_NORTH: FillNorthConnection(mapHeader, cMap, offset); gMapConnectionFlags.north = TRUE; break; case CONNECTION_WEST: FillWestConnection(mapHeader, cMap, offset); gMapConnectionFlags.west = TRUE; break; case CONNECTION_EAST: FillEastConnection(mapHeader, cMap, offset); gMapConnectionFlags.east = TRUE; break; } } } } static void FillConnection(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x2, s32 y2, s32 width, s32 height) { s32 i; const u16 *src; u16 *dest; s32 mapWidth; mapWidth = connectedMapHeader->mapLayout->width; src = &connectedMapHeader->mapLayout->map[mapWidth * y2 + x2]; dest = &VMap.map[VMap.Xsize * y + x]; for (i = 0; i < height; i++) { CpuCopy16(src, dest, width * 2); dest += VMap.Xsize; src += mapWidth; } } static void FillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 x, y; s32 x2; s32 width; s32 cWidth; if (connectedMapHeader) { cWidth = connectedMapHeader->mapLayout->width; x = offset + MAP_OFFSET; y = mapHeader->mapLayout->height + MAP_OFFSET; if (x < 0) { x2 = -x; x += cWidth; if (x < VMap.Xsize) width = x; else width = VMap.Xsize; x = 0; } else { x2 = 0; if (x + cWidth < VMap.Xsize) width = cWidth; else width = VMap.Xsize - x; } FillConnection( x, y, connectedMapHeader, x2, /*y2*/ 0, width, /*height*/ MAP_OFFSET); } } static void FillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 x; s32 x2, y2; s32 width; s32 cWidth, cHeight; if (connectedMapHeader) { cWidth = connectedMapHeader->mapLayout->width; cHeight = connectedMapHeader->mapLayout->height; x = offset + MAP_OFFSET; y2 = cHeight - MAP_OFFSET; if (x < 0) { x2 = -x; x += cWidth; if (x < VMap.Xsize) width = x; else width = VMap.Xsize; x = 0; } else { x2 = 0; if (x + cWidth < VMap.Xsize) width = cWidth; else width = VMap.Xsize - x; } FillConnection( x, /*y*/ 0, connectedMapHeader, x2, y2, width, /*height*/ MAP_OFFSET); } } static void FillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 y; s32 x2, y2; s32 height; s32 cWidth, cHeight; if (connectedMapHeader) { cWidth = connectedMapHeader->mapLayout->width; cHeight = connectedMapHeader->mapLayout->height; y = offset + MAP_OFFSET; x2 = cWidth - MAP_OFFSET; if (y < 0) { y2 = -y; if (y + cHeight < VMap.Ysize) height = y + cHeight; else height = VMap.Ysize; y = 0; } else { y2 = 0; if (y + cHeight < VMap.Ysize) height = cHeight; else height = VMap.Ysize - y; } FillConnection( /*x*/ 0, y, connectedMapHeader, x2, y2, /*width*/ MAP_OFFSET, height); } } static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 x, y; s32 y2; s32 height; s32 cHeight; if (connectedMapHeader) { cHeight = connectedMapHeader->mapLayout->height; x = mapHeader->mapLayout->width + MAP_OFFSET; y = offset + MAP_OFFSET; if (y < 0) { y2 = -y; if (y + cHeight < VMap.Ysize) height = y + cHeight; else height = VMap.Ysize; y = 0; } else { y2 = 0; if (y + cHeight < VMap.Ysize) height = cHeight; else height = VMap.Ysize - y; } FillConnection( x, y, connectedMapHeader, /*x2*/ 0, y2, /*width*/ MAP_OFFSET + 1, height); } } u8 MapGridGetElevationAt(s32 x, s32 y) { u16 block = GetMapGridBlockAt(x, y); if (block == MAPGRID_UNDEFINED) return 0; return block >> MAPGRID_ELEVATION_SHIFT; } u8 MapGridGetCollisionAt(s32 x, s32 y) { u16 block = GetMapGridBlockAt(x, y); if (block == MAPGRID_UNDEFINED) return TRUE; return (block & MAPGRID_COLLISION_MASK) >> MAPGRID_COLLISION_SHIFT; } u32 MapGridGetMetatileIdAt(s32 x, s32 y) { u16 block = GetMapGridBlockAt(x, y); if (block == MAPGRID_UNDEFINED) return GetBorderBlockAt(x, y) & MAPGRID_METATILE_ID_MASK; return block & MAPGRID_METATILE_ID_MASK; } u32 ExtractMetatileAttribute(u32 attributes, u8 attributeType) { if (attributeType >= METATILE_ATTRIBUTE_COUNT) // Check for METATILE_ATTRIBUTES_ALL return attributes; return (attributes & sMetatileAttrMasks[attributeType]) >> sMetatileAttrShifts[attributeType]; } u32 MapGridGetMetatileAttributeAt(s16 x, s16 y, u8 attributeType) { u16 metatileId = MapGridGetMetatileIdAt(x, y); return GetAttributeByMetatileIdAndMapLayout(gMapHeader.mapLayout, metatileId, attributeType); } u32 MapGridGetMetatileBehaviorAt(s16 x, s16 y) { return MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_BEHAVIOR); } u8 MapGridGetMetatileLayerTypeAt(s16 x, s16 y) { return MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_LAYER_TYPE); } void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatile) { s32 i; if (AreCoordsWithinMapGridBounds(x, y)) { i = x + y * VMap.Xsize; VMap.map[i] = (VMap.map[i] & MAPGRID_ELEVATION_MASK) | (metatile & ~MAPGRID_ELEVATION_MASK); } } void MapGridSetMetatileEntryAt(s32 x, s32 y, u16 metatile) { s32 i; if (AreCoordsWithinMapGridBounds(x, y)) { i = x + VMap.Xsize * y; VMap.map[i] = metatile; } } void MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 impassable) { if (AreCoordsWithinMapGridBounds(x, y)) { if (impassable) VMap.map[x + VMap.Xsize * y] |= MAPGRID_COLLISION_MASK; else VMap.map[x + VMap.Xsize * y] &= ~MAPGRID_COLLISION_MASK; } } static u32 GetAttributeByMetatileIdAndMapLayout(const struct MapLayout *mapLayout, u16 metatile, u8 attributeType) { const u32 * attributes; if (metatile < NUM_METATILES_IN_PRIMARY) { attributes = mapLayout->primaryTileset->metatileAttributes; return ExtractMetatileAttribute(attributes[metatile], attributeType); } else if (metatile < NUM_METATILES_TOTAL) { attributes = mapLayout->secondaryTileset->metatileAttributes; return ExtractMetatileAttribute(attributes[metatile - NUM_METATILES_IN_PRIMARY], attributeType); } else { return 0xFF; } } void SaveMapView(void) { s32 i, j; s32 x, y; u16 *mapView; s32 width; mapView = gSaveBlock2Ptr->mapView; width = VMap.Xsize; x = gSaveBlock1Ptr->pos.x; y = gSaveBlock1Ptr->pos.y; for (i = y; i < y + MAP_OFFSET_H; i++) { for (j = x; j < x + MAP_OFFSET_W; j++) *mapView++ = gBackupMapData[width * i + j]; } } static bool32 SavedMapViewIsEmpty(void) { u32 i; u32 marker = 0; #ifndef UBFIX // BUG: This loop extends past the bounds of the mapView array. Its size is only 0x100. for (i = 0; i < 0x100; i++) marker |= gSaveBlock2Ptr->mapView[i]; #else for (i = 0; i < NELEMS(gSaveBlock2Ptr->mapView); i++) marker |= gSaveBlock2Ptr->mapView[i]; #endif if (marker == 0) return TRUE; else return FALSE; } static void ClearSavedMapView(void) { CpuFill16(0, gSaveBlock2Ptr->mapView, sizeof(gSaveBlock2Ptr->mapView)); } static void LoadSavedMapView(void) { s32 i, j; s32 x, y; u16 *mapView; s32 width; mapView = gSaveBlock2Ptr->mapView; if (!SavedMapViewIsEmpty()) { width = VMap.Xsize; x = gSaveBlock1Ptr->pos.x; y = gSaveBlock1Ptr->pos.y; for (i = y; i < y + MAP_OFFSET_H; i++) { for (j = x; j < x + MAP_OFFSET_W; j++) { gBackupMapData[j + width * i] = *mapView; mapView++; } } ClearSavedMapView(); } } static void MoveMapViewToBackup(u8 direction) { s32 width; u16 *mapView; s32 x0, y0; s32 x2, y2; u16 *src, *dest; s32 srci, desti; s32 r9, r8; s32 x, y; s32 i, j; mapView = gSaveBlock2Ptr->mapView; width = VMap.Xsize; r9 = 0; r8 = 0; x0 = gSaveBlock1Ptr->pos.x; y0 = gSaveBlock1Ptr->pos.y; x2 = 15; y2 = 14; switch (direction) { case CONNECTION_NORTH: y0 += 1; y2 = MAP_OFFSET_H - 1; break; case CONNECTION_SOUTH: r8 = 1; y2 = MAP_OFFSET_H - 1; break; case CONNECTION_WEST: x0 += 1; x2 = MAP_OFFSET_W - 1; break; case CONNECTION_EAST: r9 = 1; x2 = MAP_OFFSET_W - 1; break; } for (y = 0; y < y2; y++) { i = 0; j = 0; for (x = 0; x < x2; x++) { desti = width * (y + y0); srci = (y + r8) * MAP_OFFSET_W + r9; src = &mapView[srci + i]; dest = &gBackupMapData[x0 + desti + j]; *dest = *src; i++; j++; } } ClearSavedMapView(); } s32 GetMapBorderIdAt(s32 x, s32 y) { if (GetMapGridBlockAt(x, y) == MAPGRID_UNDEFINED) return CONNECTION_INVALID; if (x >= VMap.Xsize - (MAP_OFFSET + 1)) { if (!gMapConnectionFlags.east) return CONNECTION_INVALID; return CONNECTION_EAST; } if (x < MAP_OFFSET) { if (!gMapConnectionFlags.west) return CONNECTION_INVALID; return CONNECTION_WEST; } if (y >= VMap.Ysize - MAP_OFFSET) { if (!gMapConnectionFlags.south) return CONNECTION_INVALID; return CONNECTION_SOUTH; } if (y < MAP_OFFSET) { if (!gMapConnectionFlags.north) return CONNECTION_INVALID; return CONNECTION_NORTH; } return CONNECTION_NONE; } static s32 GetPostCameraMoveMapBorderId(s32 x, s32 y) { return GetMapBorderIdAt(gSaveBlock1Ptr->pos.x + MAP_OFFSET + x, gSaveBlock1Ptr->pos.y + MAP_OFFSET + y); } bool32 CanCameraMoveInDirection(s32 direction) { s32 x, y; x = gSaveBlock1Ptr->pos.x + MAP_OFFSET + gDirectionToVectors[direction].x; y = gSaveBlock1Ptr->pos.y + MAP_OFFSET + gDirectionToVectors[direction].y; if (GetMapBorderIdAt(x, y) == CONNECTION_INVALID) return FALSE; return TRUE; } static void SetPositionFromConnection(const struct MapConnection *connection, int direction, s32 x, s32 y) { struct MapHeader const *mapHeader; mapHeader = GetMapHeaderFromConnection(connection); switch (direction) { case CONNECTION_EAST: gSaveBlock1Ptr->pos.x = -x; gSaveBlock1Ptr->pos.y -= connection->offset; break; case CONNECTION_WEST: gSaveBlock1Ptr->pos.x = mapHeader->mapLayout->width; gSaveBlock1Ptr->pos.y -= connection->offset; break; case CONNECTION_SOUTH: gSaveBlock1Ptr->pos.x -= connection->offset; gSaveBlock1Ptr->pos.y = -y; break; case CONNECTION_NORTH: gSaveBlock1Ptr->pos.x -= connection->offset; gSaveBlock1Ptr->pos.y = mapHeader->mapLayout->height; break; } } bool8 CameraMove(s32 x, s32 y) { s32 direction; const struct MapConnection *connection; s32 old_x, old_y; gCamera.active = FALSE; direction = GetPostCameraMoveMapBorderId(x, y); if (direction == CONNECTION_NONE || direction == CONNECTION_INVALID) { gSaveBlock1Ptr->pos.x += x; gSaveBlock1Ptr->pos.y += y; } else { SaveMapView(); old_x = gSaveBlock1Ptr->pos.x; old_y = gSaveBlock1Ptr->pos.y; connection = GetIncomingConnection(direction, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y); SetPositionFromConnection(connection, direction, x, y); LoadMapFromCameraTransition(connection->mapGroup, connection->mapNum); gCamera.active = TRUE; gCamera.x = old_x - gSaveBlock1Ptr->pos.x; gCamera.y = old_y - gSaveBlock1Ptr->pos.y; gSaveBlock1Ptr->pos.x += x; gSaveBlock1Ptr->pos.y += y; MoveMapViewToBackup(direction); } return gCamera.active; } const struct MapConnection *GetIncomingConnection(u8 direction, s32 x, s32 y) { s32 count; const struct MapConnection *connection; const struct MapConnections *connections = gMapHeader.connections; s32 i; #ifdef UBFIX // UB: Multiple possible null dereferences if (connections == NULL || connections->connections == NULL) return NULL; #endif count = connections->count; connection = connections->connections; for (i = 0; i < count; i++, connection++) { if (connection->direction == direction && IsPosInIncomingConnectingMap(direction, x, y, connection) == TRUE) return connection; } return NULL; } static bool8 IsPosInIncomingConnectingMap(u8 direction, s32 x, s32 y, const struct MapConnection *connection) { struct MapHeader const *mapHeader; mapHeader = GetMapHeaderFromConnection(connection); switch (direction) { case CONNECTION_SOUTH: case CONNECTION_NORTH: return IsCoordInIncomingConnectingMap(x, gMapHeader.mapLayout->width, mapHeader->mapLayout->width, connection->offset); case CONNECTION_WEST: case CONNECTION_EAST: return IsCoordInIncomingConnectingMap(y, gMapHeader.mapLayout->height, mapHeader->mapLayout->height, connection->offset); } return FALSE; } static bool8 IsCoordInIncomingConnectingMap(s32 coord, s32 srcMax, s32 destMax, s32 offset) { s32 offset2 = max(offset, 0); if (destMax + offset < srcMax) srcMax = destMax + offset; if (offset2 <= coord && coord <= srcMax) return TRUE; return FALSE; } static bool32 IsCoordInConnectingMap(s32 coord, s32 max) { if (coord >= 0 && coord < max) return TRUE; return FALSE; } static s32 IsPosInConnectingMap(const struct MapConnection *connection, s32 x, s32 y) { struct MapHeader const *mapHeader; mapHeader = GetMapHeaderFromConnection(connection); switch (connection->direction) { case CONNECTION_SOUTH: case CONNECTION_NORTH: return IsCoordInConnectingMap(x - connection->offset, mapHeader->mapLayout->width); case CONNECTION_WEST: case CONNECTION_EAST: return IsCoordInConnectingMap(y - connection->offset, mapHeader->mapLayout->height); } return FALSE; } const struct MapConnection *GetMapConnectionAtPos(s16 x, s16 y) { s32 count; const struct MapConnection *connection; s32 i; u8 direction; if (!gMapHeader.connections) { return NULL; } else { count = gMapHeader.connections->count; connection = gMapHeader.connections->connections; for (i = 0; i < count; i++, connection++) { direction = connection->direction; if ((direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE) || (direction == CONNECTION_NORTH && y > MAP_OFFSET - 1) || (direction == CONNECTION_SOUTH && y < gMapHeader.mapLayout->height + MAP_OFFSET) || (direction == CONNECTION_WEST && x > MAP_OFFSET - 1) || (direction == CONNECTION_EAST && x < gMapHeader.mapLayout->width + MAP_OFFSET)) { continue; } if (IsPosInConnectingMap(connection, x - MAP_OFFSET, y - MAP_OFFSET) == TRUE) return connection; } } return NULL; } void SetCameraFocusCoords(u16 x, u16 y) { gSaveBlock1Ptr->pos.x = x - MAP_OFFSET; gSaveBlock1Ptr->pos.y = y - MAP_OFFSET; } void GetCameraFocusCoords(u16 *x, u16 *y) { *x = gSaveBlock1Ptr->pos.x + MAP_OFFSET; *y = gSaveBlock1Ptr->pos.y + MAP_OFFSET; } // Unused static void SetCameraCoords(u16 x, u16 y) { gSaveBlock1Ptr->pos.x = x; gSaveBlock1Ptr->pos.y = y; } void GetCameraCoords(u16 *x, u16 *y) { *x = gSaveBlock1Ptr->pos.x; *y = gSaveBlock1Ptr->pos.y; } static void CopyTilesetToVram(struct Tileset const *tileset, u16 numTiles, u16 offset) { if (tileset) { if (!tileset->isCompressed) LoadBgTiles(2, tileset->tiles, numTiles * 32, offset); else DecompressAndCopyTileDataToVram2(2, tileset->tiles, numTiles * 32, offset, 0); } } static void CopyTilesetToVramUsingHeap(struct Tileset const *tileset, u16 numTiles, u16 offset) { if (tileset) { if (!tileset->isCompressed) LoadBgTiles(2, tileset->tiles, numTiles * 32, offset); else DecompressAndLoadBgGfxUsingHeap2(2, tileset->tiles, numTiles * 32, offset, 0); } } static void ApplyGlobalTintToPaletteEntries(u16 offset, u16 size) { switch (gGlobalFieldTintMode) { case QL_TINT_NONE: return; case QL_TINT_GRAYSCALE: TintPalette_GrayScale(&gPlttBufferUnfaded[offset], size); break; case QL_TINT_SEPIA: TintPalette_SepiaTone(&gPlttBufferUnfaded[offset], size); break; case QL_TINT_BACKUP_GRAYSCALE: QuestLog_BackUpPalette(offset, size); TintPalette_GrayScale(&gPlttBufferUnfaded[offset], size); break; default: return; } CpuCopy16(&gPlttBufferUnfaded[offset], &gPlttBufferFaded[offset], PLTT_SIZEOF(size)); } void ApplyGlobalTintToPaletteSlot(u8 slot, u8 count) { switch (gGlobalFieldTintMode) { case QL_TINT_NONE: return; case QL_TINT_GRAYSCALE: TintPalette_GrayScale(&gPlttBufferUnfaded[BG_PLTT_ID(slot)], count * 16); break; case QL_TINT_SEPIA: TintPalette_SepiaTone(&gPlttBufferUnfaded[BG_PLTT_ID(slot)], count * 16); break; case QL_TINT_BACKUP_GRAYSCALE: QuestLog_BackUpPalette(BG_PLTT_ID(slot), count * 16); TintPalette_GrayScale(&gPlttBufferUnfaded[BG_PLTT_ID(slot)], count * 16); break; default: return; } CpuFastCopy(&gPlttBufferUnfaded[BG_PLTT_ID(slot)], &gPlttBufferFaded[BG_PLTT_ID(slot)], count * PLTT_SIZE_4BPP); } static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) { u16 black = RGB_BLACK; if (tileset) { if (tileset->isSecondary == FALSE) { LoadPalette(&black, destOffset, PLTT_SIZEOF(1)); LoadPalette(tileset->palettes[0] + 1, destOffset + 1, size - PLTT_SIZEOF(1)); ApplyGlobalTintToPaletteEntries(destOffset + 1, (size - 2) >> 1); } else if (tileset->isSecondary == TRUE) { LoadPalette(tileset->palettes[NUM_PALS_IN_PRIMARY], destOffset, size); ApplyGlobalTintToPaletteEntries(destOffset, size >> 1); } else { LoadCompressedPalette((const u32 *)tileset->palettes, destOffset, size); ApplyGlobalTintToPaletteEntries(destOffset, size >> 1); } } } void CopyPrimaryTilesetToVram(const struct MapLayout *mapLayout) { CopyTilesetToVram(mapLayout->primaryTileset, NUM_TILES_IN_PRIMARY, 0); } void CopySecondaryTilesetToVram(const struct MapLayout *mapLayout) { CopyTilesetToVram(mapLayout->secondaryTileset, NUM_TILES_TOTAL - NUM_TILES_IN_PRIMARY, NUM_TILES_IN_PRIMARY); } void CopySecondaryTilesetToVramUsingHeap(const struct MapLayout *mapLayout) { CopyTilesetToVramUsingHeap(mapLayout->secondaryTileset, NUM_TILES_TOTAL - NUM_TILES_IN_PRIMARY, NUM_TILES_IN_PRIMARY); } static void LoadPrimaryTilesetPalette(const struct MapLayout *mapLayout) { LoadTilesetPalette(mapLayout->primaryTileset, BG_PLTT_ID(0), NUM_PALS_IN_PRIMARY * PLTT_SIZE_4BPP); } void LoadSecondaryTilesetPalette(const struct MapLayout *mapLayout) { LoadTilesetPalette(mapLayout->secondaryTileset, BG_PLTT_ID(NUM_PALS_IN_PRIMARY), (NUM_PALS_TOTAL - NUM_PALS_IN_PRIMARY) * PLTT_SIZE_4BPP); } void CopyMapTilesetsToVram(struct MapLayout const *mapLayout) { if (mapLayout) { CopyTilesetToVramUsingHeap(mapLayout->primaryTileset, NUM_TILES_IN_PRIMARY, 0); CopyTilesetToVramUsingHeap(mapLayout->secondaryTileset, NUM_TILES_TOTAL - NUM_TILES_IN_PRIMARY, NUM_TILES_IN_PRIMARY); } } void LoadMapTilesetPalettes(struct MapLayout const *mapLayout) { if (mapLayout) { LoadPrimaryTilesetPalette(mapLayout); LoadSecondaryTilesetPalette(mapLayout); } } ================================================ FILE: src/fldeff_berrytree.c ================================================ // From R/S, removed void DoWateringBerryTreeAnim(void) { } ================================================ FILE: src/fldeff_cut.c ================================================ #include "global.h" #include "gflib.h" #include "event_object_lock.h" #include "event_object_movement.h" #include "event_scripts.h" #include "faraway_island.h" #include "fieldmap.h" #include "field_camera.h" #include "field_specials.h" #include "fldeff.h" #include "field_effect.h" #include "field_player_avatar.h" #include "metatile_behavior.h" #include "overworld.h" #include "party_menu.h" #include "script.h" #include "trig.h" #include "constants/abilities.h" #include "constants/event_objects.h" #include "constants/songs.h" #include "constants/metatile_labels.h" #define CUT_GRASS_SPRITE_COUNT 8 #define CUT_SIDE 3 static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL; static EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE; static void FieldCallback_CutGrass(void); static void FieldCallback_CutTree(void); static void FieldMoveCallback_CutGrass(void); static void SetCutGrassMetatileAt(s16 x, s16 y); static void SpriteCallback_CutGrass_Init(struct Sprite *sprite); static void SpriteCallback_CutGrass_Run(struct Sprite *sprite); static void SpriteCallback_CutGrass_Cleanup(struct Sprite *sprite); static void FieldMoveCallback_CutTree(void); static void CleanupLongGrass(s16 x, s16 y); extern const u8 FarawayIsland_Interior_EventScript_HideMewWhenGrassCut[]; static const u16 sCutGrassMetatileMapping[][2] = { { METATILE_ID(General, Plain_Grass), METATILE_ID(General, Plain_Mowed) }, { METATILE_ID(General, ThinTreeTop_Grass), METATILE_ID(General, ThinTreeTop_Mowed) }, { METATILE_ID(General, WideTreeTopLeft_Grass), METATILE_ID(General, WideTreeTopLeft_Mowed) }, { METATILE_ID(General, WideTreeTopRight_Grass), METATILE_ID(General, WideTreeTopRight_Mowed) }, { METATILE_ID(CeladonCity, CyclingRoad_Grass), METATILE_ID(CeladonCity, CyclingRoad_Mowed) }, { METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Grass), METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Mowed) }, { METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Grass), METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Mowed) }, { METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Grass), METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Mowed) }, { METATILE_ID(ViridianForest, HugeTreeTopMiddle_Grass), METATILE_ID(ViridianForest, HugeTreeTopMiddle_Mowed) }, { METATILE_ID(SeviiIslands67, LongGrass_Top), //long grass top METATILE_ID(SeviiIslands67, EmeraldMowed) //Emerald mowed grass }, { METATILE_ID(SeviiIslands67, LongGrass_Bottom), //long grass bottom METATILE_ID(SeviiIslands67, EmeraldMowed) //Emerald mowed grass }, { METATILE_ID(SeviiIslands123, OneIsland_Grass), //One Island tall grass METATILE_ID(SeviiIslands123, OneIsland_Mowed) //One Island mowed grass }, { METATILE_ID(SeviiIslands123, OneIsland_AshGrass), //One Island tall grass METATILE_ID(SeviiIslands123, OneIsland_Mowed) //One Island mowed grass }, { METATILE_ID(BerryForest, ThreeIsland_Grass), //Three Island yellow grass METATILE_ID(General, Plain_Mowed) //Three Island yellow grass }, { METATILE_ID(SeviiIslands5, Micro_Grass), METATILE_ID(SeviiIslands5, Micro_Mowed) }, { METATILE_ID(SeviiIslands5, MicroWideTreeTopLeft_Grass), METATILE_ID(SeviiIslands5, MicroWideTreeTopLeft_Mowed) }, { METATILE_ID(SeviiIslands5, MicroWideTreeTopRight_Grass), METATILE_ID(SeviiIslands5, MicroWideTreeTopRight_Mowed) }, { // Safari Zone Long Grass METATILE_ID(FuchsiaCity, LongGrassTop_LeftTree), METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Mowed) }, { METATILE_ID(FuchsiaCity, LongGrassTop_MiddleTree), METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Mowed) }, { METATILE_ID(FuchsiaCity, LongGrassTop_RightTree), METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Mowed) }, { METATILE_ID(FuchsiaCity, LongGrassBottom_LeftTree), METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Mowed) }, { METATILE_ID(FuchsiaCity, LongGrassBottom_MiddleTree), METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Mowed) }, { METATILE_ID(FuchsiaCity, LongGrassBottom_RightTree), METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Mowed) }, { METATILE_ID(FuchsiaCity, LongGrassTop_MountainLeft), METATILE_ID(FuchsiaCity, SafariMountainTopLeft_Mowed) }, { METATILE_ID(FuchsiaCity, LongGrassTop_MountainRight), METATILE_ID(FuchsiaCity, SafariMountainTopRight_Mowed) }, { METATILE_ID(FuchsiaCity, LongGrassBottom_MountainLeft), METATILE_ID(General, MountainCornerTopLeft | MAPGRID_COLLISION_MASK) }, { METATILE_ID(FuchsiaCity, LongGrassBottom_MountainRight), METATILE_ID(General, MountainCornerTopRight | MAPGRID_COLLISION_MASK) }, { METATILE_ID(SeviiIslands6, ForestTreeCorner_Left), METATILE_ID(SeviiIslands6, ForestTreeCorner_Left_Mowed | MAPGRID_COLLISION_MASK) // for some reason this calls the wrong tile }, { METATILE_ID(SeviiIslands6, ForestTreeCorner_Right), METATILE_ID(SeviiIslands6, ForestTreeCorner_Right_Mowed | MAPGRID_COLLISION_MASK) }, { METATILE_ID(SeviiIslands6, ForestTreeTop), METATILE_ID(SeviiIslands6, ForestTreeTop_Mowed) }, { METATILE_ID(SeviiIslands67, Grass_BottomLeftCorner), METATILE_ID(SeviiIslands67, BottomLeftCorner) }, { METATILE_ID(SeviiIslands67, Grass_BottomRightCorner), METATILE_ID(SeviiIslands67, BottomRightCorner) }, { METATILE_ID(SeviiIslands67, Grass_Down), METATILE_ID(SeviiIslands67, Down) }, { METATILE_ID(SeviiIslands67, Grass_InnerCornerBottomLeft), METATILE_ID(SeviiIslands67, InnerCornerBottomLeft) }, { METATILE_ID(SeviiIslands67, Grass_InnerCornerBottomRight), METATILE_ID(SeviiIslands67, InnerCornerBottomRight) }, { METATILE_ID(SeviiIslands67, Grass_InnerCornerTopLeft), METATILE_ID(SeviiIslands67, InnerCornerTopLeft) }, { METATILE_ID(SeviiIslands67, Grass_InnerCornerTopRight), METATILE_ID(SeviiIslands67, InnerCornerTopRight) }, { METATILE_ID(SeviiIslands67, Grass_InnerCornersTopRightBottomLeft), METATILE_ID(SeviiIslands67, InnerCornersTopRightBottomLeft) }, { METATILE_ID(SeviiIslands67, Grass_Left), METATILE_ID(SeviiIslands67, Left) }, { METATILE_ID(SeviiIslands67, Grass_Plain), METATILE_ID(SeviiIslands67, Plain) }, { METATILE_ID(SeviiIslands67, Grass_Right), METATILE_ID(SeviiIslands67, Right) }, { METATILE_ID(SeviiIslands67, Grass_RightInnerCornerTopLeft), METATILE_ID(SeviiIslands67, RightInnerCornerTopLeft) }, { METATILE_ID(SeviiIslands67, Grass_TopLeftCorner), METATILE_ID(SeviiIslands67, TopLeftCorner) }, { METATILE_ID(SeviiIslands67, Grass_TopRightCorner), METATILE_ID(SeviiIslands67, TopRightCorner) }, { METATILE_ID(SeviiIslands67, Grass_Up), METATILE_ID(SeviiIslands67, Up) }, { 0xffff, 0xffff } }; static const struct OamData sOamData_FldEff_CutGrass = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0x001, .priority = 1, .paletteNum = 1, .affineParam = 0 }; static const union AnimCmd sSpriteAnim_Fldeff_CutGrass_0[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sSpriteAnimTable_FldEff_CutGrass[] = { sSpriteAnim_Fldeff_CutGrass_0 }; static const struct SpriteFrameImage sSpriteFrameImages_FldEff_CutGrass[] = { {gFieldEffectObjectPic_CutGrass, 0x20} }; const struct SpritePalette gFldEffPalette_CutGrass[] = { gFieldEffectPal_CutGrass, 4096 }; static const struct SpriteTemplate sSpriteTemplate_FldEff_CutGrass = { .tileTag = 0xFFFF, .paletteTag = 4096, .oam = &sOamData_FldEff_CutGrass, .anims = sSpriteAnimTable_FldEff_CutGrass, .images = sSpriteFrameImages_FldEff_CutGrass, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallback_CutGrass_Init }; static u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y) { return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_TERRAIN), TILE_TERRAIN_GRASS); } bool8 SetUpFieldMove_Cut(void) { s16 x, y; u8 i, j; sScheduleOpenDottedHole = FALSE; if (CutMoveRuinValleyCheck() == TRUE) { sScheduleOpenDottedHole = TRUE; gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_CutGrass; return TRUE; } if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_CUT_TREE) == TRUE) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_CutTree; return TRUE; } else { PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); for (i = 0; i < CUT_SIDE; i++) { y = gPlayerFacingPosition.y - 1 + i; for (j = 0; j < CUT_SIDE; j++) { x = gPlayerFacingPosition.x - 1 + j; if (MapGridGetElevationAt(x, y) == gPlayerFacingPosition.elevation) { if (MetatileAtCoordsIsGrassTile(x, y) == TRUE) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_CutGrass; return TRUE; } } } } return FALSE; } } static void FieldCallback_CutGrass(void) { FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS); gFieldEffectArguments[0] = GetCursorSelectionMonId(); } bool8 FldEff_UseCutOnGrass(void) { u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutGrass); IncrementGameStat(GAME_STAT_USED_CUT); return FALSE; } static void FieldCallback_CutTree(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); ScriptContext_SetupScript(EventScript_FldEffCut); } bool8 FldEff_UseCutOnTree(void) { u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutTree); IncrementGameStat(GAME_STAT_USED_CUT); return FALSE; } static void FieldMoveCallback_CutGrass(void) { FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS); if (sScheduleOpenDottedHole == TRUE) CutMoveOpenDottedHoleDoor(); else FieldEffectStart(FLDEFF_CUT_GRASS); } bool8 FldEff_CutGrass(void) { u8 i, j; s16 x, y; u8 cutRange; u8 userAbility; u8 TileCountFromPlayer_X; u8 TileCountFromPlayer_Y; i = 0; PlaySE(SE_M_CUT); PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); userAbility = GetMonAbility(&gPlayerParty[GetCursorSelectionMonId()]); if(userAbility == ABILITY_HYPER_CUTTER) { cutRange = 5; TileCountFromPlayer_X = 2; TileCountFromPlayer_Y = 2; } else { cutRange = 3; TileCountFromPlayer_X = 1; TileCountFromPlayer_Y = 1; } for (i = 0; i < cutRange; i++) { y = gPlayerFacingPosition.y - 1 + i; if(userAbility == ABILITY_HYPER_CUTTER) { y -= 1; } for (j = 0; j < cutRange; j++) { x = gPlayerFacingPosition.x - 1 + j; if(userAbility == ABILITY_HYPER_CUTTER) { x -= 1; } if (MapGridGetElevationAt(x, y) == gPlayerFacingPosition.elevation) { if (MetatileAtCoordsIsGrassTile(x, y) == TRUE) { SetCutGrassMetatileAt(x, y); EnableObjectGroundEffectsByXY(x, y); } } } } CleanupLongGrass(gPlayerFacingPosition.x - TileCountFromPlayer_X, gPlayerFacingPosition.y - (1 + TileCountFromPlayer_Y)); DrawWholeMapView(); sCutGrassSpriteArrayPtr = Alloc(CUT_GRASS_SPRITE_COUNT); for (i = 0; i < 8; i++) { sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_FldEff_CutGrass, gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = i * (0x100 / CUT_GRASS_SPRITE_COUNT); } return FALSE; } static void SetCutGrassMetatileAt(s16 x, s16 y) { u16 i = 0; u16 metatileId = MapGridGetMetatileIdAt(x, y); while (1) { if (sCutGrassMetatileMapping[i][0] == 0xFFFF) return; if (sCutGrassMetatileMapping[i][0] == metatileId) { MapGridSetMetatileIdAt(x, y, sCutGrassMetatileMapping[i][1]); break; } i++; } } static bool8 MetatileIsLongGrass(u32 metatileId, bool8 isTop) { if(isTop) { switch(metatileId) { case METATILE_FuchsiaCity_LongGrassTop_LeftTree: case METATILE_FuchsiaCity_LongGrassTop_MiddleTree: case METATILE_FuchsiaCity_LongGrassTop_RightTree: case METATILE_FuchsiaCity_LongGrassTop_MountainLeft: case METATILE_FuchsiaCity_LongGrassTop_MountainRight: case METATILE_SeviiIslands67_LongGrass_Top: case METATILE_SeviiIslands6_ForestTreeTop: return TRUE; default: return FALSE; } } else { switch(metatileId) { case METATILE_FuchsiaCity_LongGrassBottom_LeftTree: case METATILE_FuchsiaCity_LongGrassBottom_MiddleTree: case METATILE_FuchsiaCity_LongGrassBottom_RightTree: case METATILE_FuchsiaCity_LongGrassBottom_MountainLeft: case METATILE_FuchsiaCity_LongGrassBottom_MountainRight: case METATILE_SeviiIslands67_LongGrass_Bottom: case METATILE_SeviiIslands6_ForestTreeCorner_Left: case METATILE_SeviiIslands6_ForestTreeCorner_Right: return TRUE; default: return FALSE; } } } static bool8 MetatileIsMowedLongGrass(u32 metatileId) { switch(metatileId) { case METATILE_SeviiIslands67_EmeraldMowed: case METATILE_FuchsiaCity_SafariZoneTreeTopLeft_Mowed: case METATILE_FuchsiaCity_SafariZoneTreeTopMiddle_Mowed: case METATILE_FuchsiaCity_SafariZoneTreeTopRight_Mowed: case METATILE_General_MountainCornerTopLeft: case METATILE_General_MountainCornerTopRight: case METATILE_FuchsiaCity_SafariMountainTopLeft_Mowed: case METATILE_FuchsiaCity_SafariMountainTopRight_Mowed: case METATILE_SeviiIslands6_ForestTreeCorner_Left_Mowed: case METATILE_SeviiIslands6_ForestTreeCorner_Right_Mowed: case METATILE_SeviiIslands6_ForestTreeTop_Mowed: return TRUE; default: return FALSE; } } static u32 GetMowedMetatileBasedOnInput(u32 metatileId, bool8 isTop) { u32 i; if(isTop) { for(i = 0; sCutGrassMetatileMapping[i][0] != 0xFFFF; i++) { if(sCutGrassMetatileMapping[i][0] != metatileId) continue; else return sCutGrassMetatileMapping[i][1]; //return bottom } } else { for(i = 0; sCutGrassMetatileMapping[i][0] != 0xFFFF; i++) { if(sCutGrassMetatileMapping[i][1] != metatileId) continue; else return sCutGrassMetatileMapping[i][0]; //return top } } return 0x0; } static void CleanupLongGrass(s16 x, s16 y) { u16 i = 0; s16 lowerY; u8 cutRange; u8 userAbility = GetMonAbility(&gPlayerParty[GetCursorSelectionMonId()]); if(userAbility == ABILITY_HYPER_CUTTER) { cutRange = 5; } else { cutRange = 3; } lowerY = y + cutRange; for (i = 0; i < cutRange; i++) { s16 currentX = x + i; if (MetatileIsLongGrass(MapGridGetMetatileIdAt(currentX, y), TRUE)) { u16 topGrassMetatile = MapGridGetMetatileIdAt(currentX, y); u16 underneathTop = MapGridGetMetatileIdAt(currentX, y + 1); if(MetatileIsMowedLongGrass(underneathTop)) //if underneath a long grass top, set that tile to long grass bottom MapGridSetMetatileIdAt(currentX, y + 1, METATILE_SeviiIslands67_LongGrass_Bottom); //MapGridSetMetatileIdAt(currentX, y + 1, GetMowedMetatileBasedOnInput(topGrassMetatile, TRUE)); //should grab corresponding bottom to topGrassMetatile } if (MetatileIsMowedLongGrass(MapGridGetMetatileIdAt(currentX, lowerY))) //if the lowest range got cut { if (MetatileIsLongGrass(MapGridGetMetatileIdAt(currentX, lowerY + 1), FALSE)) //and the tile under that range is an orphaned bottom MapGridSetMetatileIdAt(currentX, lowerY + 1, GetMowedMetatileBasedOnInput(MapGridGetMetatileIdAt(currentX, lowerY + 1), TRUE)); //MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_SeviiIslands67_EmeraldMowed); //mow it. } } } static void SpriteCallback_CutGrass_Init(struct Sprite *sprite) { sprite->data[0] = 8; sprite->data[1] = 0; sprite->data[3] = 0; sprite->callback = SpriteCallback_CutGrass_Run; } static void SpriteCallback_CutGrass_Run(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[2], sprite->data[0]); sprite->y2 = Cos(sprite->data[2], sprite->data[0]); sprite->data[2] += 8; sprite->data[2] &= 0xFF; sprite->data[0]++; sprite->data[0] += sprite->data[3] >> 2; sprite->data[3]++; if (sprite->data[1] != 28) sprite->data[1]++; else sprite->callback = SpriteCallback_CutGrass_Cleanup; } static void SpriteCallback_CutGrass_Cleanup(struct Sprite *sprite) { u32 i; for (i = 1; i < CUT_GRASS_SPRITE_COUNT; i++) { DestroySprite(&gSprites[sCutGrassSpriteArrayPtr[i]]); } FieldEffectStop(&gSprites[sCutGrassSpriteArrayPtr[0]], FLDEFF_CUT_GRASS); Free(sCutGrassSpriteArrayPtr); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); if (IsMewPlayingHideAndSeek() == TRUE) ScriptContext_SetupScript(FarawayIsland_Interior_EventScript_HideMewWhenGrassCut); } static void FieldMoveCallback_CutTree(void) { PlaySE(SE_M_CUT); FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE); ScriptContext_Enable(); } ================================================ FILE: src/fldeff_dig.c ================================================ #include "global.h" #include "field_effect.h" #include "field_player_avatar.h" #include "fldeff.h" #include "item_use.h" #include "overworld.h" #include "party_menu.h" static void FieldCallback_Dig(void); static void StartDigFieldEffect(void); bool8 SetUpFieldMove_Dig(void) { if (CanUseEscapeRopeOnCurrMap() == TRUE) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_Dig; return TRUE; } return FALSE; } static void FieldCallback_Dig(void) { Overworld_ResetStateAfterDigEscRope(); FieldEffectStart(FLDEFF_USE_DIG); gFieldEffectArguments[0] = GetCursorSelectionMonId(); } bool8 FldEff_UseDig(void) { u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(StartDigFieldEffect); SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); return FALSE; } static void StartDigFieldEffect(void) { u8 taskId; FieldEffectActiveListRemove(FLDEFF_USE_DIG); taskId = CreateTask(Task_UseDigEscapeRopeOnField, 8); gTasks[taskId].data[0] = 0; } ================================================ FILE: src/fldeff_flash.c ================================================ #include "global.h" #include "gflib.h" #include "event_data.h" #include "event_scripts.h" #include "fldeff.h" #include "field_effect.h" #include "map_preview_screen.h" #include "overworld.h" #include "party_menu.h" #include "script.h" #include "constants/songs.h" #include "constants/map_types.h" struct FlashStruct { u8 fromType; u8 toType; bool8 isEnter; bool8 isExit; void (*func1)(void); void (*func2)(u8 mapSecId); }; static void FieldCallback_Flash(void); static void FldEff_UseFlash(void); static bool8 TryDoMapTransition(void); static void FlashTransition_Exit(void); static void Task_FlashTransition_Exit_0(u8 taskId); static void Task_FlashTransition_Exit_1(u8 taskId); static void Task_FlashTransition_Exit_2(u8 taskId); static void Task_FlashTransition_Exit_3(u8 taskId); static void Task_FlashTransition_Exit_4(u8 taskId); static void FlashTransition_Enter(void); static void Task_FlashTransition_Enter_0(u8 taskId); static void Task_FlashTransition_Enter_1(u8 taskId); static void Task_FlashTransition_Enter_2(u8 taskId); static void Task_FlashTransition_Enter_3(u8 taskId); static void RunMapPreviewScreen(u8 mapsecId); static void Task_MapPreviewScreen_0(u8 taskId); static const struct FlashStruct sTransitionTypes[] = { { .fromType = MAP_TYPE_TOWN, .toType = MAP_TYPE_UNDERGROUND, .isEnter = TRUE, .isExit = FALSE, .func1 = FlashTransition_Enter, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_CITY, .toType = MAP_TYPE_UNDERGROUND, .isEnter = TRUE, .isExit = FALSE, .func1 = FlashTransition_Enter, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_ROUTE, .toType = MAP_TYPE_UNDERGROUND, .isEnter = TRUE, .isExit = FALSE, .func1 = FlashTransition_Enter, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNDERWATER, .toType = MAP_TYPE_UNDERGROUND, .isEnter = TRUE, .isExit = FALSE, .func1 = FlashTransition_Enter, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_OCEAN_ROUTE, .toType = MAP_TYPE_UNDERGROUND, .isEnter = TRUE, .isExit = FALSE, .func1 = FlashTransition_Enter, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNKNOWN, .toType = MAP_TYPE_UNDERGROUND, .isEnter = TRUE, .isExit = FALSE, .func1 = FlashTransition_Enter, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_INDOOR, .toType = MAP_TYPE_UNDERGROUND, .isEnter = TRUE, .isExit = FALSE, .func1 = FlashTransition_Enter, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_SECRET_BASE, .toType = MAP_TYPE_UNDERGROUND, .isEnter = TRUE, .isExit = FALSE, .func1 = FlashTransition_Enter, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNDERGROUND, .toType = MAP_TYPE_TOWN, .isEnter = FALSE, .isExit = TRUE, .func1 = FlashTransition_Exit, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNDERGROUND, .toType = MAP_TYPE_CITY, .isEnter = FALSE, .isExit = TRUE, .func1 = FlashTransition_Exit, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNDERGROUND, .toType = MAP_TYPE_ROUTE, .isEnter = FALSE, .isExit = TRUE, .func1 = FlashTransition_Exit, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNDERGROUND, .toType = MAP_TYPE_UNDERWATER, .isEnter = FALSE, .isExit = TRUE, .func1 = FlashTransition_Exit, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNDERGROUND, .toType = MAP_TYPE_OCEAN_ROUTE, .isEnter = FALSE, .isExit = TRUE, .func1 = FlashTransition_Exit, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNDERGROUND, .toType = MAP_TYPE_UNKNOWN, .isEnter = FALSE, .isExit = TRUE, .func1 = FlashTransition_Exit, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNDERGROUND, .toType = MAP_TYPE_INDOOR, .isEnter = FALSE, .isExit = TRUE, .func1 = FlashTransition_Exit, .func2 = RunMapPreviewScreen }, { .fromType = MAP_TYPE_UNDERGROUND, .toType = MAP_TYPE_SECRET_BASE, .isEnter = FALSE, .isExit = TRUE, .func1 = FlashTransition_Exit, .func2 = RunMapPreviewScreen }, {0} }; static const u16 sCaveTransitionPalette_White[] = INCBIN_U16("graphics/cave_transition/white.gbapal"); static const u16 sCaveTransitionPalette_Black[] = INCBIN_U16("graphics/cave_transition/black.gbapal"); static const u16 sCaveTransitionPalette_Enter[] = INCBIN_U16("graphics/cave_transition/enter.gbapal"); static const u16 sCaveTransitionPalette_Exit[] = INCBIN_U16("graphics/cave_transition/exit.gbapal"); static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/cave_transition/tilemap.bin.lz"); static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/cave_transition/tiles.4bpp.lz"); bool8 SetUpFieldMove_Flash(void) { if (gMapHeader.cave != TRUE) return FALSE; if (FlagGet(FLAG_SYS_FLASH_ACTIVE)) return FALSE; gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_Flash; return TRUE; } static void FieldCallback_Flash(void) { u8 taskId = CreateFieldEffectShowMon(); gFieldEffectArguments[0] = GetCursorSelectionMonId(); gTasks[taskId].data[8] = ((uintptr_t)FldEff_UseFlash) >> 16; gTasks[taskId].data[9] = ((uintptr_t)FldEff_UseFlash); } static void FldEff_UseFlash(void) { PlaySE(SE_M_REFLECT); FlagSet(FLAG_SYS_FLASH_ACTIVE); ScriptContext_SetupScript(EventScript_FldEffFlash); } // Map transition animatics static void CB2_ChangeMapMain(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBC_ChangeMapVBlank(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void CB2_DoChangeMap(void) { SetVBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG2CNT, 0); SetGpuReg(REG_OFFSET_BG1CNT, 0); SetGpuReg(REG_OFFSET_BG0CNT, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); DmaFill32(3, 0, (void *)OAM, OAM_SIZE); DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); ResetPaletteFade(); ResetTasks(); ResetSpriteData(); EnableInterrupts(INTR_FLAG_VBLANK); SetVBlankCallback(VBC_ChangeMapVBlank); SetMainCallback2(CB2_ChangeMapMain); if (!TryDoMapTransition()) SetMainCallback2(gMain.savedCallback); } static bool8 TryDoMapTransition(void) { u8 fromType = GetLastUsedWarpMapType(); u8 toType = GetCurrentMapType(); u8 i = 0; if (GetLastUsedWarpMapSectionId() != gMapHeader.regionMapSectionId && MapHasPreviewScreen_HandleQLState2(gMapHeader.regionMapSectionId, MPS_TYPE_CAVE) == TRUE) { RunMapPreviewScreen(gMapHeader.regionMapSectionId); return TRUE; } for (; sTransitionTypes[i].fromType != 0; i++) { if (sTransitionTypes[i].fromType == fromType && sTransitionTypes[i].toType == toType) { sTransitionTypes[i].func1(); return TRUE; } } return FALSE; } bool8 MapTransitionIsEnter(u8 _fromType, u8 _toType) { u8 fromType = _fromType; u8 toType = _toType; u8 i = 0; for (; sTransitionTypes[i].fromType != 0; i++) { if (sTransitionTypes[i].fromType == fromType && sTransitionTypes[i].toType == toType) { return sTransitionTypes[i].isEnter; } } return FALSE; } bool8 MapTransitionIsExit(u8 _fromType, u8 _toType) { u8 fromType = _fromType; u8 toType = _toType; u8 i = 0; for (; sTransitionTypes[i].fromType != 0; i++) { if (sTransitionTypes[i].fromType == fromType && sTransitionTypes[i].toType == toType) { return sTransitionTypes[i].isExit; } } return FALSE; } static void FlashTransition_Exit(void) { CreateTask(Task_FlashTransition_Exit_0, 0); } static void Task_FlashTransition_Exit_0(u8 taskId) { gTasks[taskId].func = Task_FlashTransition_Exit_1; } static void Task_FlashTransition_Exit_1(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, 0); LZ77UnCompVram(sCaveTransitionTiles, (void *)BG_CHAR_ADDR(3)); LZ77UnCompVram(sCaveTransitionTilemap, (void *)BG_SCREEN_ADDR(31)); LoadPalette(sCaveTransitionPalette_White, BG_PLTT_ID(14), sizeof(sCaveTransitionPalette_White)); LoadPalette(sCaveTransitionPalette_Exit, BG_PLTT_ID(14), sizeof(sCaveTransitionPalette_Exit)); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(31)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON); gTasks[taskId].func = Task_FlashTransition_Exit_2; gTasks[taskId].data[0] = 16; gTasks[taskId].data[1] = 0; } static void Task_FlashTransition_Exit_2(u8 taskId) { u16 r4 = gTasks[taskId].data[1]; SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + r4); if (r4 <= 16) { gTasks[taskId].data[1]++; } else { gTasks[taskId].data[2] = 0; gTasks[taskId].func = Task_FlashTransition_Exit_3; } } static void Task_FlashTransition_Exit_3(u8 taskId) { u16 count; SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + 16); count = gTasks[taskId].data[2]; if (count < 8) { gTasks[taskId].data[2]++; LoadPalette(&sCaveTransitionPalette_Exit[count], BG_PLTT_ID(14), sizeof(sCaveTransitionPalette_Exit) - PLTT_SIZEOF(count)); } else { LoadPalette(sCaveTransitionPalette_White, BG_PLTT_ID(0), sizeof(sCaveTransitionPalette_White)); gTasks[taskId].func = Task_FlashTransition_Exit_4; gTasks[taskId].data[2] = 8; } } static void Task_FlashTransition_Exit_4(u8 taskId) { if (gTasks[taskId].data[2] != 0) gTasks[taskId].data[2]--; else SetMainCallback2(gMain.savedCallback); } static void FlashTransition_Enter(void) { CreateTask(Task_FlashTransition_Enter_0, 0); } static void Task_FlashTransition_Enter_0(u8 taskId) { gTasks[taskId].func = Task_FlashTransition_Enter_1; } static void Task_FlashTransition_Enter_1(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, 0); LZ77UnCompVram(sCaveTransitionTiles, (void *)BG_CHAR_ADDR(3)); LZ77UnCompVram(sCaveTransitionTilemap, (void *)BG_SCREEN_ADDR(31)); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(31)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON); LoadPalette(sCaveTransitionPalette_White, BG_PLTT_ID(14), sizeof(sCaveTransitionPalette_White)); LoadPalette(sCaveTransitionPalette_Black, BG_PLTT_ID(0), sizeof(sCaveTransitionPalette_Black)); gTasks[taskId].func = Task_FlashTransition_Enter_2; gTasks[taskId].data[0] = 16; gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = 0; } static void Task_FlashTransition_Enter_2(u8 taskId) { u16 count = gTasks[taskId].data[2]; if (count < 16) { gTasks[taskId].data[2]++; gTasks[taskId].data[2]++; LoadPalette(&sCaveTransitionPalette_Enter[15 - count], BG_PLTT_ID(14), PLTT_SIZEOF(count + 1)); } else { SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + 16); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD); gTasks[taskId].func = Task_FlashTransition_Enter_3; } } static void Task_FlashTransition_Enter_3(u8 taskId) { u16 r4 = 16 - gTasks[taskId].data[1]; SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + r4); if (r4 != 0) { gTasks[taskId].data[1]++; } else { LoadPalette(sCaveTransitionPalette_Black, BG_PLTT_ID(0), sizeof(sCaveTransitionPalette_Black)); SetMainCallback2(gMain.savedCallback); } } static void RunMapPreviewScreen(u8 mapSecId) { u8 taskId = CreateTask(Task_MapPreviewScreen_0, 0); gTasks[taskId].data[3] = mapSecId; } static void Task_MapPreviewScreen_0(u8 taskId) { s16 *data = gTasks[taskId].data; switch (data[0]) { case 0: SetWordTaskArg(taskId, 5, (uintptr_t)gMain.vblankCallback); SetVBlankCallback(NULL); MapPreview_InitBgs(); MapPreview_LoadGfx(data[3]); BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK); data[0]++; break; case 1: if (!MapPreview_IsGfxLoadFinished()) { data[4] = MapPreview_CreateMapNameWindow(data[3]); CopyWindowToVram(data[4], COPYWIN_FULL); data[0]++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); SetVBlankCallback((IntrCallback)GetWordTaskArg(taskId, 5)); data[0]++; } break; case 3: if (!UpdatePaletteFade()) { data[2] = MapPreview_GetDuration(data[3]); data[0]++; } break; case 4: data[1]++; if (data[1] > data[2] || JOY_HELD(B_BUTTON)) { BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_WHITE); data[0]++; } break; case 5: if (!UpdatePaletteFade()) { int i; for (i = 0; i < 16; i++) { data[i] = 0; } MapPreview_Unload(data[4]); gTasks[taskId].func = Task_FlashTransition_Enter_1; } break; } } ================================================ FILE: src/fldeff_poison.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "constants/songs.h" static void Task_FieldPoisonEffect(u8 taskId) { s16 *data = gTasks[taskId].data; switch (data[0]) { case 0: data[1] += 1; if (data[1] > 4) data[0]++; break; case 1: data[1] -= 1; if (data[1] == 0) data[0]++; break; case 2: DestroyTask(taskId); return; } AdjustBgMosaic((u8)(((u8)data[1] << 4) | (u8)data[1]), BG_MOSAIC_SET); } void FldEffPoison_Start(void) { PlaySE(SE_FIELD_POISON); CreateTask(Task_FieldPoisonEffect, 80); } bool32 FldEffPoison_IsActive(void) { return FuncIsActiveTask(Task_FieldPoisonEffect); } ================================================ FILE: src/fldeff_rocksmash.c ================================================ #include "global.h" #include "gflib.h" #include "field_player_avatar.h" #include "field_effect.h" #include "party_menu.h" #include "event_data.h" #include "script.h" #include "fldeff.h" #include "event_scripts.h" #include "overworld.h" #include "event_object_movement.h" #include "constants/songs.h" #include "constants/event_objects.h" #include "constants/event_object_movement.h" #include "constants/maps.h" static void Task_FieldEffectShowMon_Init(u8 taskId); static void Task_FieldEffectShowMon_WaitFldeff(u8 taskId); static void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId); static void Task_FieldEffectShowMon_Cleanup(u8 taskId); static void FieldCallback_UseRockSmash(void); static void StartRockSmashFieldEffect(void); EWRAM_DATA struct MapPosition gPlayerFacingPosition = {}; bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId) { u8 mapObjId; GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); gPlayerFacingPosition.elevation = PlayerGetElevation(); mapObjId = GetObjectEventIdByPosition(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.elevation); if (gObjectEvents[mapObjId].graphicsId != graphicsId) return FALSE; gSpecialVar_LastTalked = gObjectEvents[mapObjId].localId; return TRUE; } u8 CreateFieldEffectShowMon(void) { GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); return CreateTask(Task_FieldEffectShowMon_Init, 8); } static void Task_FieldEffectShowMon_Init(u8 taskId) { u8 mapObjId; LockPlayerFieldControls(); gPlayerAvatar.preventStep = TRUE; mapObjId = gPlayerAvatar.objectEventId; if (!ObjectEventIsMovementOverridden(&gObjectEvents[mapObjId]) || ObjectEventClearHeldMovementIfFinished(&gObjectEvents[mapObjId])) { if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) { // Leftover from RS, inhibits the player anim while underwater. FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff; } else { StartPlayerAvatarSummonMonForFieldMoveAnim(); ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); gTasks[taskId].func = Task_FieldEffectShowMon_WaitPlayerAnim; } } } static void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId) { if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[gPlayerAvatar.objectEventId]) == TRUE) { FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff; } } static void Task_FieldEffectShowMon_WaitFldeff(u8 taskId) { if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) { gFieldEffectArguments[1] = GetPlayerFacingDirection(); if (gFieldEffectArguments[1] == DIR_SOUTH) gFieldEffectArguments[2] = 0; if (gFieldEffectArguments[1] == DIR_NORTH) gFieldEffectArguments[2] = 1; if (gFieldEffectArguments[1] == DIR_WEST) gFieldEffectArguments[2] = 2; if (gFieldEffectArguments[1] == DIR_EAST) gFieldEffectArguments[2] = 3; ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByCurrentState()); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]); FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); gTasks[taskId].func = Task_FieldEffectShowMon_Cleanup; } } static void Task_FieldEffectShowMon_Cleanup(u8 taskId) { FLDEFF_CALL_FUNC_IN_DATA(); gPlayerAvatar.preventStep = FALSE; DestroyTask(taskId); } bool8 SetUpFieldMove_RockSmash(void) { if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_ROCK_SMASH_ROCK) == TRUE) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_UseRockSmash; return TRUE; } return FALSE; } static void FieldCallback_UseRockSmash(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); ScriptContext_SetupScript(EventScript_FldEffRockSmash); } bool8 FldEff_UseRockSmash(void) { u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(StartRockSmashFieldEffect); IncrementGameStat(GAME_STAT_USED_ROCK_SMASH); return FALSE; } static void StartRockSmashFieldEffect(void) { PlaySE(SE_M_ROCK_THROW); FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH); ScriptContext_Enable(); } ================================================ FILE: src/fldeff_softboiled.c ================================================ #include "global.h" #include "gflib.h" #include "party_menu.h" #include "menu.h" #include "new_menu_helpers.h" #include "constants/songs.h" static void Task_SoftboiledRestoreHealth(u8 taskId); static void Task_DisplayHPRestoredMessage(u8 taskId); static void Task_FinishSoftboiled(u8 taskId); static void CantUseSoftboiledOnMon(u8 taskId); extern const u8 gText_CantBeUsedOnPkmn[]; extern const u8 gText_PkmnHPRestoredByVar2[]; bool8 SetUpFieldMove_SoftBoiled(void) { u16 maxHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_MAX_HP); u16 curHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_HP); if (curHp > maxHp / 5) return TRUE; else return FALSE; } void ChooseMonForSoftboiled(u8 taskId) { gPartyMenu.action = PARTY_ACTION_SOFTBOILED; gPartyMenu.slotId2 = gPartyMenu.slotId; AnimatePartySlot(GetCursorSelectionMonId(), 1); DisplayPartyMenuStdMessage(PARTY_MSG_USE_ON_WHICH_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } void Task_TryUseSoftboiledOnPartyMon(u8 taskId) { u8 userPartyId = gPartyMenu.slotId; u8 recipientPartyId = gPartyMenu.slotId2; u16 curHp; if (recipientPartyId > PARTY_SIZE) { gPartyMenu.action = PARTY_ACTION_CHOOSE_MON; DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } else { curHp = GetMonData(&gPlayerParty[recipientPartyId], MON_DATA_HP); if (curHp == 0 || userPartyId == recipientPartyId || GetMonData(&gPlayerParty[recipientPartyId], MON_DATA_MAX_HP) == curHp) CantUseSoftboiledOnMon(taskId); else { PlaySE(SE_USE_ITEM); PartyMenuModifyHP(taskId, userPartyId, -1, GetMonData(&gPlayerParty[userPartyId], MON_DATA_MAX_HP) / 5, Task_SoftboiledRestoreHealth); } } } static void Task_SoftboiledRestoreHealth(u8 taskId) { PlaySE(SE_USE_ITEM); PartyMenuModifyHP(taskId, gPartyMenu.slotId2, 1, GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MAX_HP) / 5, Task_DisplayHPRestoredMessage); } static void Task_DisplayHPRestoredMessage(u8 taskId) { GetMonNickname(&gPlayerParty[gPartyMenu.slotId2], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2); DisplayPartyMenuMessage(gStringVar4, FALSE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_FinishSoftboiled; } static void Task_FinishSoftboiled(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { gPartyMenu.action = PARTY_ACTION_CHOOSE_MON; AnimatePartySlot(gPartyMenu.slotId, 0); gPartyMenu.slotId = gPartyMenu.slotId2; AnimatePartySlot(gPartyMenu.slotId2, 1); ClearStdWindowAndFrameToTransparent(6, 0); ClearWindowTilemap(6); DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } } static void Task_ChooseNewMonForSoftboiled(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { DisplayPartyMenuStdMessage(PARTY_MSG_USE_ON_WHICH_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } } static void CantUseSoftboiledOnMon(u8 taskId) { PlaySE(SE_SELECT); DisplayPartyMenuMessage(gText_CantBeUsedOnPkmn, FALSE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_ChooseNewMonForSoftboiled; } ================================================ FILE: src/fldeff_strength.c ================================================ #include "global.h" #include "field_player_avatar.h" #include "field_effect.h" #include "party_menu.h" #include "event_data.h" #include "script.h" #include "fldeff.h" #include "event_scripts.h" #include "constants/event_objects.h" static void FieldCB_UseStrength(void); static void ShowMonCB_UseStrength(void); bool8 SetUpFieldMove_Strength(void) { if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_PUSHABLE_BOULDER) != TRUE) { return FALSE; } else { gSpecialVar_Result = GetCursorSelectionMonId(); gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCB_UseStrength; return TRUE; } } static void FieldCB_UseStrength(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); ScriptContext_SetupScript(EventScript_FldEffStrength); } bool8 FldEff_UseStrength(void) { u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(ShowMonCB_UseStrength); GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1); return FALSE; } static void ShowMonCB_UseStrength(void) { FieldEffectActiveListRemove(FLDEFF_USE_STRENGTH); ScriptContext_Enable(); } ================================================ FILE: src/fldeff_sweetscent.c ================================================ #include "global.h" #include "gflib.h" #include "field_player_avatar.h" #include "field_effect.h" #include "party_menu.h" #include "script.h" #include "fldeff.h" #include "event_scripts.h" #include "field_weather.h" #include "wild_encounter.h" #include "constants/songs.h" static EWRAM_DATA u8 *sPlttBufferBak = NULL; static void FieldCallback_SweetScent(void); static void StartSweetScentFieldEffect(void); static void TrySweetScentEncounter(u8 taskId); static void FailSweetScentEncounter(u8 taskId); static void Unused_StartSweetscentFldeff(void) { gPartyMenu.slotId = 0; FieldCallback_SweetScent(); } bool8 SetUpFieldMove_SweetScent(void) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_SweetScent; return TRUE; } static void FieldCallback_SweetScent(void) { FieldEffectStart(FLDEFF_SWEET_SCENT); gFieldEffectArguments[0] = GetCursorSelectionMonId(); } bool8 FldEff_SweetScent(void) { u8 taskId; SetWeatherScreenFadeOut(); taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(StartSweetScentFieldEffect); return FALSE; } static void StartSweetScentFieldEffect(void) { u8 taskId; PlaySE(SE_M_SWEET_SCENT); sPlttBufferBak = (u8 *)Alloc(PLTT_SIZE); CpuFastCopy(gPlttBufferUnfaded, sPlttBufferBak, PLTT_SIZE); CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, RGB(31, 0, 0)); taskId = CreateTask(TrySweetScentEncounter, 0); gTasks[taskId].data[0] = 0; FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT); } static void TrySweetScentEncounter(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { if (data[0] == 64) { data[0] = 0; if (SweetScentWildEncounter() == TRUE) { Free(sPlttBufferBak); DestroyTask(taskId); } else { gTasks[taskId].func = FailSweetScentEncounter; BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB(31, 0, 0)); } } else { data[0]++; } } } static void FailSweetScentEncounter(u8 taskId) { if (!gPaletteFade.active) { CpuFastCopy(sPlttBufferBak, gPlttBufferUnfaded, PLTT_SIZE); WeatherProcessingIdle(); Free(sPlttBufferBak); ScriptContext_SetupScript(EventScript_FailSweetScent); DestroyTask(taskId); } } ================================================ FILE: src/fldeff_teleport.c ================================================ #include "global.h" #include "field_effect.h" #include "field_player_avatar.h" #include "fldeff.h" #include "party_menu.h" #include "overworld.h" static void FieldCallback_Teleport(void); static void StartTeleportFieldEffect(void); bool8 SetUpFieldMove_Teleport(void) { if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_Teleport; return TRUE; } return FALSE; } static void FieldCallback_Teleport(void) { Overworld_ResetStateAfterTeleport(); FieldEffectStart(FLDEFF_USE_TELEPORT); gFieldEffectArguments[0] = (u32)GetCursorSelectionMonId(); } bool8 FldEff_UseTeleport(void) { u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(StartTeleportFieldEffect); SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); return FALSE; } static void StartTeleportFieldEffect(void) { FieldEffectActiveListRemove(FLDEFF_USE_TELEPORT); CreateTeleportFieldEffectTask(); } ================================================ FILE: src/gpu_regs.c ================================================ #include "global.h" #define GPU_REG_BUF_SIZE 0x60 #define GPU_REG_BUF(offset) (*(u16 *)(&sGpuRegBuffer[offset])) #define GPU_REG(offset) (*(vu16 *)(REG_BASE + offset)) #define EMPTY_SLOT 0xFF static u8 sGpuRegBuffer[GPU_REG_BUF_SIZE]; static u8 sGpuRegWaitingList[GPU_REG_BUF_SIZE]; static volatile bool8 sGpuRegBufferLocked; static volatile bool8 sShouldSyncRegIE; static vu16 sRegIE; static void CopyBufferedValueToGpuReg(u8 regOffset); static void SyncRegIE(void); static void UpdateRegDispstatIntrBits(u16 regIE); void InitGpuRegManager(void) { s32 i; for (i = 0; i < GPU_REG_BUF_SIZE; i++) { sGpuRegBuffer[i] = 0; sGpuRegWaitingList[i] = EMPTY_SLOT; } sGpuRegBufferLocked = FALSE; sShouldSyncRegIE = FALSE; sRegIE = 0; } static void CopyBufferedValueToGpuReg(u8 regOffset) { if (regOffset == REG_OFFSET_DISPSTAT) { REG_DISPSTAT &= ~(DISPSTAT_HBLANK_INTR | DISPSTAT_VBLANK_INTR); REG_DISPSTAT |= GPU_REG_BUF(REG_OFFSET_DISPSTAT); } else { GPU_REG(regOffset) = GPU_REG_BUF(regOffset); } } void CopyBufferedValuesToGpuRegs(void) { if (!sGpuRegBufferLocked) { s32 i; for (i = 0; i < GPU_REG_BUF_SIZE; i++) { u8 regOffset = sGpuRegWaitingList[i]; if (regOffset == EMPTY_SLOT) return; CopyBufferedValueToGpuReg(regOffset); sGpuRegWaitingList[i] = EMPTY_SLOT; } } } void SetGpuReg(u8 regOffset, u16 value) { if (regOffset < GPU_REG_BUF_SIZE) { u16 vcount; GPU_REG_BUF(regOffset) = value; vcount = REG_VCOUNT & 0xFF; if ((vcount >= 161 && vcount <= 225) || (REG_DISPCNT & DISPCNT_FORCED_BLANK)) { CopyBufferedValueToGpuReg(regOffset); } else { s32 i; sGpuRegBufferLocked = TRUE; for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) { if (sGpuRegWaitingList[i] == regOffset) { sGpuRegBufferLocked = FALSE; return; } } sGpuRegWaitingList[i] = regOffset; sGpuRegBufferLocked = FALSE; } } } u16 GetGpuReg(u8 regOffset) { if (regOffset == REG_OFFSET_DISPSTAT) return REG_DISPSTAT; if (regOffset == REG_OFFSET_VCOUNT) return REG_VCOUNT; return GPU_REG_BUF(regOffset); } void SetGpuRegBits(u8 regOffset, u16 mask) { u16 regValue = GPU_REG_BUF(regOffset); SetGpuReg(regOffset, regValue | mask); } void ClearGpuRegBits(u8 regOffset, u16 mask) { u16 regValue = GPU_REG_BUF(regOffset); SetGpuReg(regOffset, regValue & ~mask); } static void SyncRegIE(void) { if (sShouldSyncRegIE) { u16 temp = REG_IME; REG_IME = 0; REG_IE = sRegIE; REG_IME = temp; sShouldSyncRegIE = FALSE; } } void EnableInterrupts(u16 mask) { sRegIE |= mask; sShouldSyncRegIE = TRUE; SyncRegIE(); UpdateRegDispstatIntrBits(sRegIE); } void DisableInterrupts(u16 mask) { sRegIE &= ~mask; sShouldSyncRegIE = TRUE; SyncRegIE(); UpdateRegDispstatIntrBits(sRegIE); } static void UpdateRegDispstatIntrBits(u16 regIE) { u16 oldValue = GetGpuReg(REG_OFFSET_DISPSTAT) & (DISPSTAT_HBLANK_INTR | DISPSTAT_VBLANK_INTR); u16 newValue = 0; if (regIE & INTR_FLAG_VBLANK) newValue |= DISPSTAT_VBLANK_INTR; if (regIE & INTR_FLAG_HBLANK) newValue |= DISPSTAT_HBLANK_INTR; if (oldValue != newValue) SetGpuReg(REG_OFFSET_DISPSTAT, newValue); } ================================================ FILE: src/graphics.c ================================================ #include "global.h" const u32 gBattleInterface_Textbox_Gfx[] = INCBIN_U32("graphics/battle_interface/textbox.4bpp.lz"); const u32 gBattleInterface_Textbox_Pal[] = INCBIN_U32("graphics/battle_interface/textbox.gbapal.lz"); const u32 gBattleInterface_Textbox_Tilemap[] = INCBIN_U32("graphics/battle_interface/textbox.bin.lz"); const u32 gMonFrontPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/front.4bpp.lz"); const u32 gMonBackPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/back.4bpp.lz"); const u32 gMonPalette_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/normal.gbapal.lz"); const u32 gMonShinyPalette_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/shiny.gbapal.lz"); // From Ruby. const u32 gUnusedGfx_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.4bpp.lz"); const u32 gUnusedTimemap_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.bin.lz"); const u32 gUnusedPal_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.gbapal.lz"); const u32 gSmokescreenImpactTiles[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.4bpp.lz"); const u32 gSmokescreenImpactPalette[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.gbapal.lz"); #include "data/graphics/interface_pokeballs.h" const u32 gBlankGfxCompressed[] = INCBIN_U32("graphics/interface/blank.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.4bpp.lz"); const u32 gBattleAnimSpriteGfx_AirWave[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.4bpp.lz"); const u32 gBattleAnimSpritePal_RainDrops[] = INCBIN_U32("graphics/battle_anims/sprites/rain_drops.gbapal.lz"); const u32 gBattleAnimSpritePal_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.gbapal.lz"); const u32 gBattleAnimSpritePal_AirWave[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave.gbapal.lz"); const u32 gBattleAnimSpritePal_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.gbapal.lz"); const u32 gBattleAnimSpritePal_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.gbapal.lz"); const u32 gBattleAnimSpritePal_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.4bpp.lz"); const u32 gBattleAnimSpritePal_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Explosion6[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_6.4bpp.lz"); const u32 gBattleAnimSpritePal_Explosion6[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_6.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PinkOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pink_orb.4bpp.lz"); const u32 gBattleAnimSpritePal_PinkOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pink_orb.gbapal.lz"); const u32 gBattleAnimSpritePal_IceCube[] = INCBIN_U32("graphics/battle_anims/sprites/ice_cube.gbapal.lz"); const u32 gBattleAnimSpriteGfx_IceCube[] = INCBIN_U32("graphics/battle_anims/sprites/ice_cube.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Gust[] = INCBIN_U32("graphics/battle_anims/sprites/gust.4bpp.lz"); const u32 gBattleAnimSpritePal_Gust[] = INCBIN_U32("graphics/battle_anims/sprites/gust.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Spark2[] = INCBIN_U32("graphics/battle_anims/sprites/spark_2.4bpp.lz"); const u32 gBattleAnimSpritePal_Spark2[] = INCBIN_U32("graphics/battle_anims/sprites/spark_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Orange[] = INCBIN_U32("graphics/battle_anims/sprites/orange.4bpp.lz"); const u32 gBattleAnimSpritePal_Orange[] = INCBIN_U32("graphics/battle_anims/sprites/orange.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Spikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes.4bpp.lz"); const u32 gBattleAnimSpritePal_Spikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes.gbapal.lz"); const u32 gBattleAnimSpriteGfx_YellowBall[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_ball.4bpp.lz"); const u32 gBattleAnimSpritePal_YellowBall[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_ball.gbapal.lz"); const u32 gBattleAnimSpriteGfx_TiedBag[] = INCBIN_U32("graphics/battle_anims/sprites/tied_bag.4bpp.lz"); const u32 gBattleAnimSpritePal_TiedBag[] = INCBIN_U32("graphics/battle_anims/sprites/tied_bag.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BlackSmoke[] = INCBIN_U32("graphics/battle_anims/sprites/black_smoke.4bpp.lz"); const u32 gBattleAnimSpritePal_BlackSmoke[] = INCBIN_U32("graphics/battle_anims/sprites/black_smoke.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BlackBall[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball.4bpp.lz"); const u32 gBattleAnimSpritePal_BlackBall[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball.gbapal.lz"); const u32 gBattleAnimSpritePal_Glass[] = INCBIN_U32("graphics/battle_anims/sprites/glass.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Glass[] = INCBIN_U32("graphics/battle_anims/sprites/glass.4bpp.lz"); const u32 gBattleAnimSpriteGfx_HornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit.4bpp.lz"); const u32 gBattleAnimSpritePal_HornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit.gbapal.lz"); const u32 gBattleAnimSpritePal_BlueShards[] = INCBIN_U32("graphics/battle_anims/sprites/blue_shards.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BlueShards[] = INCBIN_U32("graphics/battle_anims/sprites/blue_shards.4bpp.lz"); const u32 gUnused_BattleSpritePalette_023[] = INCBIN_U32("graphics/unused/battle_anim_023.gbapal.lz"); const u32 gUnusedGfx_MusicNotes[] = INCBIN_U32("graphics/unused/music_notes.4bpp.lz"); const u32 gBattleAnimSpritePal_Hit[] = INCBIN_U32("graphics/battle_anims/sprites/hit.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Hit[] = INCBIN_U32("graphics/battle_anims/sprites/hit.4bpp.lz"); const u32 gBattleAnimSpritePal_Hit2[] = INCBIN_U32("graphics/battle_anims/sprites/hit_2.gbapal.lz"); const u32 gBattleAnimSpritePal_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.4bpp.lz"); const u32 gBattleAnimSpriteGfx_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.4bpp.lz"); const u32 gBattleAnimSpritePal_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BlueStar[] = INCBIN_U32("graphics/battle_anims/sprites/blue_star.4bpp.lz"); const u32 gBattleAnimSpritePal_BlueStar[] = INCBIN_U32("graphics/battle_anims/sprites/blue_star.gbapal.lz"); const u32 gBattleAnimSpritePal_BubbleBurst[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BubbleBurst[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst.4bpp.lz"); const u32 gBattleAnimSpriteGfx_HitDuplicate[] = INCBIN_U32("graphics/battle_anims/sprites/hit_duplicate.4bpp.lz"); const u32 gBattleAnimSpritePal_HitDuplicate[] = INCBIN_U32("graphics/battle_anims/sprites/hit_duplicate.gbapal.lz"); const u32 gBattleAnimSpritePal_Leer[] = INCBIN_U32("graphics/battle_anims/sprites/leer.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Leer[] = INCBIN_U32("graphics/battle_anims/sprites/leer.4bpp.lz"); const u32 gBattleAnimSpritePal_BlueBurst[] = INCBIN_U32("graphics/battle_anims/sprites/blue_burst.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BlueBurst[] = INCBIN_U32("graphics/battle_anims/sprites/blue_burst.4bpp.lz"); const u32 gBattleAnimSpriteGfx_SmallEmber[] = INCBIN_U32("graphics/battle_anims/sprites/small_ember.4bpp.lz"); const u32 gBattleAnimSpritePal_SmallEmber[] = INCBIN_U32("graphics/battle_anims/sprites/small_ember.gbapal.lz"); const u32 gBattleAnimSpriteGfx_GraySmoke[] = INCBIN_U32("graphics/battle_anims/sprites/gray_smoke.4bpp.lz"); const u32 gBattleAnimSpritePal_GraySmoke[] = INCBIN_U32("graphics/battle_anims/sprites/gray_smoke.gbapal.lz"); const u32 gBattleAnimSpritePal_Fire[] = INCBIN_U32("graphics/battle_anims/sprites/fire.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Fire[] = INCBIN_U32("graphics/battle_anims/sprites/fire.4bpp.lz"); const u32 gBattleAnimSpriteGfx_SpinningFire[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_fire.4bpp.lz"); const u32 gBattleAnimSpriteGfx_FirePlume[] = INCBIN_U32("graphics/battle_anims/sprites/fire_plume.4bpp.lz"); const u32 gBattleAnimSpritePal_Lightning2[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Lightning2[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Lightning[] = INCBIN_U32("graphics/battle_anims/sprites/lightning.4bpp.lz"); const u32 gBattleAnimSpriteGfx_SpinningBall[] = INCBIN_U32("graphics/battle_anims/unused/spinning_ball.4bpp.lz"); const u32 gBattleAnimSpritePal_SpinningBall[] = INCBIN_U32("graphics/battle_anims/unused/spinning_ball.gbapal.lz"); const u32 gBattleAnimSpritePal_SpinningBall2[] = INCBIN_U32("graphics/battle_anims/unused/spinning_ball_2.gbapal.lz"); // old battle interface data, unused const u32 gOldBattleInterfaceGfx[] = INCBIN_U32("graphics/unused/obi1.4bpp.lz"); const u32 gOldBattleInterfacePal_1_2_3[] = INCBIN_U32("graphics/unused/obi_palpak1.gbapal.lz"); // palettes 1-3 const u32 gOldBattleInterfacePal4[] = INCBIN_U32("graphics/unused/old_pal4.gbapal.lz"); // 4 is by itself const u32 gOldBattleInterfacePal_5_6_7[] = INCBIN_U32("graphics/unused/obi_palpak3.gbapal.lz"); // palettes 5-7 const u32 gOldBattleInterfaceGfx2[] = INCBIN_U32("graphics/unused/obi2.4bpp.lz"); const u32 gOldBattleInterfaceTilemap[] = INCBIN_U32("graphics/unused/old_battle_interface_tilemap.bin.lz"); const u32 gBattleAnimSpritePal_ClawSlash2[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash_2.gbapal.lz"); const u32 gBattleAnimSpritePal_ClawSlash[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash.gbapal.lz"); const u32 gBattleAnimSpriteGfx_ClawSlash2[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_ClawSlash[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Scratch3[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_3.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Scratch2[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_2.4bpp.lz"); const u32 gUnusedHpBar_Gfx[] = INCBIN_U32("graphics/interface/hpbar_unused.4bpp.lz"); const u32 gBattleAnimSpriteGfx_BubbleBurst2[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst_2.4bpp.lz"); const u32 gBattleAnimSpritePal_BubbleBurst2[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_IceChunk[] = INCBIN_U32("graphics/battle_anims/sprites/ice_chunk.4bpp.lz"); const u32 gBattleAnimSpritePal_IceChunk[] = INCBIN_U32("graphics/battle_anims/sprites/ice_chunk.gbapal.lz"); const u32 gBattleAnimSpritePal_Glass2[] = INCBIN_U32("graphics/battle_anims/sprites/glass_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Glass2[] = INCBIN_U32("graphics/battle_anims/sprites/glass_2.4bpp.lz"); const u32 gBattleAnimSpritePal_PinkHeart2[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PinkHeart2[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart_2.4bpp.lz"); const u32 gInterfaceGfx_UnusedWindow[] = INCBIN_U32("graphics/battle_interface/unused_window.4bpp.lz"); const u32 gInterfacePal_UnusedWindow[] = INCBIN_U32("graphics/battle_interface/unused_window.gbapal.lz"); const u32 gInterfaceGfx_HPNumbers[] = INCBIN_U32("graphics/interface/hp_numbers.4bpp.lz"); const u32 gBattleAnimSpriteGfx_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.4bpp.lz"); const u32 gBattleAnimSpritePal_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.gbapal.lz"); const u32 gBattleAnimSpritePal_SapDrip2[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip_2.gbapal.lz"); const u32 gUnusedGfx_Window2[] = INCBIN_U32("graphics/battle_interface/unused_window2.4bpp.lz"); const u32 gUnusedGfx_Window2Bar[] = INCBIN_U32("graphics/battle_interface/unused_window2bar.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Sparkle1[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_1.4bpp.lz"); const u32 gBattleAnimSpritePal_Sparkle1[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_1.gbapal.lz"); const u32 gBattleAnimSpritePal_Sparkle2[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_2.gbapal.lz"); const u32 gBattleAnimSpritePal_HumanoidFoot[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_foot.gbapal.lz"); const u32 gBattleAnimSpriteGfx_HumanoidFoot[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_foot.4bpp.lz"); const u32 gBattleAnimSpriteGfx_MonsterFoot[] = INCBIN_U32("graphics/battle_anims/sprites/monster_foot.4bpp.lz"); const u32 gBattleAnimSpriteGfx_HumanoidHand[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_hand.4bpp.lz"); const u32 gUnusedGfx_LineSketch[] = INCBIN_U32("graphics/unused/line_sketch.4bpp.lz"); const u32 gUnusedPal_LineSketch[] = INCBIN_U32("graphics/unused/line_sketch.gbapal.lz"); const u32 gBattleAnimSpriteGfx_YellowUnk[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk.4bpp.lz"); const u32 gBattleAnimSpritePal_YellowUnk[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SlamHit[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit.4bpp.lz"); const u32 gBattleAnimSpritePal_SlamHit[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit.gbapal.lz"); const u32 gBattleAnimSpriteGfx_RedFist[] = INCBIN_U32("graphics/battle_anims/sprites/red_fist.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Ring[] = INCBIN_U32("graphics/battle_anims/sprites/ring.4bpp.lz"); const u32 gBattleAnimSpritePal_Ring[] = INCBIN_U32("graphics/battle_anims/sprites/ring.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Rocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks.4bpp.lz"); const u32 gBattleAnimSpritePal_Rocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Z[] = INCBIN_U32("graphics/battle_anims/sprites/z.4bpp.lz"); const u32 gBattleAnimSpritePal_Z[] = INCBIN_U32("graphics/battle_anims/sprites/z.gbapal.lz"); const u32 gBattleAnimSpriteGfx_YellowUnk2[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk_2.4bpp.lz"); const u32 gBattleAnimSpritePal_YellowUnk2[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_AirSlash[] = INCBIN_U32("graphics/battle_anims/sprites/air_slash.4bpp.lz"); const u32 gBattleAnimSpritePal_AirSlash[] = INCBIN_U32("graphics/battle_anims/sprites/air_slash.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SpinningGreenOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_green_orbs.4bpp.lz"); const u32 gBattleAnimSpritePal_SpinningGreenOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_green_orbs.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Leaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaf.4bpp.lz"); const u32 gBattleAnimSpritePal_Leaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaf.gbapal.lz"); const u32 gUnusedGfx_Metronome[] = INCBIN_U32("graphics/unused/metronome_hand_small.4bpp.lz"); // unused, was for metronome at one point const u32 gBattleAnimSpritePal_Clapping[] = INCBIN_U32("graphics/battle_anims/sprites/clapping.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PoisonPowder[] = INCBIN_U32("graphics/battle_anims/sprites/poison_powder.4bpp.lz"); const u32 gBattleAnimSpritePal_PoisonPowder[] = INCBIN_U32("graphics/battle_anims/sprites/poison_powder.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BrownTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/brown_triangle.4bpp.lz"); const u32 gBattleAnimSpritePal_BrownTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/brown_triangle.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Sparkle3[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_3.4bpp.lz"); const u32 gBattleAnimSpritePal_Sparkle3[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_3.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Sparkle4[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_4.4bpp.lz"); const u32 gBattleAnimSpriteGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes.4bpp.lz"); const u32 gBattleAnimSpritePal_MusicNotes[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Duck[] = INCBIN_U32("graphics/battle_anims/sprites/duck.4bpp.lz"); const u32 gBattleAnimSpritePal_Duck[] = INCBIN_U32("graphics/battle_anims/sprites/duck.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Alert[] = INCBIN_U32("graphics/battle_anims/sprites/alert.4bpp.lz"); const u32 gBattleAnimSpritePal_Alert[] = INCBIN_U32("graphics/battle_anims/sprites/alert.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Shock4[] = INCBIN_U32("graphics/battle_anims/sprites/shock_4.4bpp.lz"); const u32 gBattleAnimSpritePal_Shock4[] = INCBIN_U32("graphics/battle_anims/sprites/shock_4.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Shock[] = INCBIN_U32("graphics/battle_anims/sprites/shock.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Bell2[] = INCBIN_U32("graphics/battle_anims/sprites/bell_2.4bpp.lz"); const u32 gBattleAnimSpritePal_Bell2[] = INCBIN_U32("graphics/battle_anims/sprites/bell_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PinkGlove[] = INCBIN_U32("graphics/battle_anims/sprites/pink_glove.4bpp.lz"); const u32 gBattleAnimSpritePal_PinkGlove[] = INCBIN_U32("graphics/battle_anims/sprites/pink_glove.gbapal.lz"); const u16 gBattleAnimUnused_Unknown1[] = INCBIN_U16("graphics/battle_anims/unused/unknown_1.bin"); const u16 gBattleAnimUnused_Unknown2[] = INCBIN_U16("graphics/battle_anims/unused/unknown_2.bin"); const u16 gBattleAnimUnused_Unknown3[] = INCBIN_U16("graphics/battle_anims/unused/unknown_3.bin"); const u32 gBattleAnimUnusedGfx_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.8bpp.lz"); const u16 gBattleAnimUnusedPal_LineSketch2[] = INCBIN_U16("graphics/battle_anims/unused/line_sketch_2.gbapal.lz"); const u32 gBattleAnimUnusedTilemap_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.bin.lz"); const u32 gBattleAnimSpriteGfx_BlueLines[] = INCBIN_U32("graphics/battle_anims/sprites/blue_lines.4bpp.lz"); const u32 gBattleAnimSpritePal_BlueLines[] = INCBIN_U32("graphics/battle_anims/sprites/blue_lines.gbapal.lz"); const u32 gBattleAnimSpritePal_Impact3[] = INCBIN_U32("graphics/battle_anims/sprites/impact_3.gbapal.lz"); const u32 gBattleAnimSpritePal_Impact2[] = INCBIN_U32("graphics/battle_anims/sprites/impact_2.gbapal.lz"); const u32 gBattleAnimSpritePal_Reticle[] = INCBIN_U32("graphics/battle_anims/sprites/reticle.gbapal.lz"); const u32 gBattleAnimSpritePal_Breath[] = INCBIN_U32("graphics/battle_anims/sprites/breath.gbapal.lz"); const u32 gBattleAnimSpritePal_Snowball[] = INCBIN_U32("graphics/battle_anims/sprites/snowball.gbapal.lz"); const u32 gBattleAnimSpritePal_Vine[] = INCBIN_U32("graphics/battle_anims/sprites/vine.gbapal.lz"); const u32 gBattleAnimSpritePal_Sword2[] = INCBIN_U32("graphics/battle_anims/sprites/sword_2.gbapal.lz"); const u32 gBattleAnimSpritePal_RedTube[] = INCBIN_U32("graphics/battle_anims/sprites/red_tube.gbapal.lz"); const u32 gBattleAnimSpritePal_Amnesia[] = INCBIN_U32("graphics/battle_anims/sprites/amnesia.gbapal.lz"); const u32 gBattleAnimSpritePal_String2[] = INCBIN_U32("graphics/battle_anims/sprites/string_2.gbapal.lz"); const u32 gBattleAnimUnused_Unknown4[] = INCBIN_U32("graphics/battle_anims/unused/unknown_4.bin.lz"); const u32 gBattleAnimSpritePal_Pencil2[] = INCBIN_U32("graphics/battle_anims/sprites/pencil_2.gbapal.lz"); const u32 gBattleAnimSpritePal_Petal[] = INCBIN_U32("graphics/battle_anims/sprites/petal.gbapal.lz"); const u32 gBattleAnimSpritePal_BentSpoon[] = INCBIN_U32("graphics/battle_anims/sprites/bent_spoon.gbapal.lz"); const u32 gBattleAnimSpritePal_Coin[] = INCBIN_U32("graphics/battle_anims/sprites/coin.gbapal.lz"); const u32 gBattleAnimSpritePal_CrackedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/cracked_egg.gbapal.lz"); const u32 gBattleAnimSpritePal_FreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/fresh_egg.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Impact3[] = INCBIN_U32("graphics/battle_anims/sprites/impact_3.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Impact2[] = INCBIN_U32("graphics/battle_anims/sprites/impact_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Reticle[] = INCBIN_U32("graphics/battle_anims/sprites/reticle.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Breath[] = INCBIN_U32("graphics/battle_anims/sprites/breath.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Snowball[] = INCBIN_U32("graphics/battle_anims/sprites/snowball.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Vine[] = INCBIN_U32("graphics/battle_anims/sprites/vine.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Sword2[] = INCBIN_U32("graphics/battle_anims/sprites/sword_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Clapping[] = INCBIN_U32("graphics/battle_anims/sprites/clapping.4bpp.lz"); const u32 gBattleAnimSpriteGfx_RedTube[] = INCBIN_U32("graphics/battle_anims/sprites/red_tube.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Amnesia[] = INCBIN_U32("graphics/battle_anims/sprites/amnesia.4bpp.lz"); const u32 gBattleAnimSpriteGfx_String2[] = INCBIN_U32("graphics/battle_anims/sprites/string_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Pencil2[] = INCBIN_U32("graphics/battle_anims/sprites/pencil_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Petal[] = INCBIN_U32("graphics/battle_anims/sprites/petal.4bpp.lz"); const u32 gBattleAnimSpriteGfx_BentSpoon[] = INCBIN_U32("graphics/battle_anims/sprites/bent_spoon.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Web[] = INCBIN_U32("graphics/battle_anims/sprites/web.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Coin[] = INCBIN_U32("graphics/battle_anims/sprites/coin.4bpp.lz"); const u32 gBattleAnimSpriteGfx_CrackedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/cracked_egg.4bpp.lz"); const u32 gBattleAnimSpriteGfx_HatchedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/hatched_egg.4bpp.lz"); const u32 gBattleAnimSpriteGfx_FreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/fresh_egg.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Fangs[] = INCBIN_U32("graphics/battle_anims/sprites/fangs.4bpp.lz"); const u32 gBattleAnimSpritePal_Fangs[] = INCBIN_U32("graphics/battle_anims/sprites/fangs.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Explosion2[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_2.4bpp.lz"); const u32 gBattleAnimSpritePal_Explosion2[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Explosion3[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_3.4bpp.lz"); const u32 gBattleAnimSpriteGfx_WaterDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet.4bpp.lz"); const u32 gBattleAnimSpritePal_WaterDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WaterDroplet2[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Seed2[] = INCBIN_U32("graphics/battle_anims/sprites/seed_2.4bpp.lz"); const u32 gBattleAnimSpritePal_Seed2[] = INCBIN_U32("graphics/battle_anims/sprites/seed_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Sprout[] = INCBIN_U32("graphics/battle_anims/sprites/sprout.4bpp.lz"); const u32 gBattleAnimSpriteGfx_RedWand[] = INCBIN_U32("graphics/battle_anims/sprites/red_wand.4bpp.lz"); const u32 gBattleAnimSpritePal_RedWand[] = INCBIN_U32("graphics/battle_anims/sprites/red_wand.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PurpleGreenUnk[] = INCBIN_U32("graphics/battle_anims/sprites/purple_green_unk.4bpp.lz"); const u32 gBattleAnimSpritePal_PurpleGreenUnk[] = INCBIN_U32("graphics/battle_anims/sprites/purple_green_unk.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WaterColumn[] = INCBIN_U32("graphics/battle_anims/sprites/water_column.4bpp.lz"); const u32 gBattleAnimSpritePal_WaterColumn[] = INCBIN_U32("graphics/battle_anims/sprites/water_column.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MudUnk[] = INCBIN_U32("graphics/battle_anims/sprites/mud_unk.4bpp.lz"); const u32 gBattleAnimSpritePal_MudUnk[] = INCBIN_U32("graphics/battle_anims/sprites/mud_unk.gbapal.lz"); const u32 gUnusedTilemap_BlueFrame[] = INCBIN_U32("graphics/unused/blue_frame.bin.lz"); // P1, P2, P3 and P4 tilemaps? const u32 gUnusedTilemap_RedYellowGreenFrame[] = INCBIN_U32("graphics/unused/redyellowgreen_frame.bin.lz"); const u32 gUnusedGfx_ColorFrames[] = INCBIN_U32("graphics/unused/color_frames.4bpp.lz"); const u32 gUnusedPal_ColorFrames[] = INCBIN_U32("graphics/unused/color_frames.gbapal.lz"); const u32 gBattleAnimSpriteGfx_RainDrops[] = INCBIN_U32("graphics/battle_anims/sprites/rain_drops.4bpp.lz"); const u32 gUnusedGfx8bpp_WaterSplash [] = INCBIN_U32("graphics/unused/water_splash.8bpp.lz"); const u32 gUnusedTilemap_WaterSplash[] = INCBIN_U32("graphics/unused/water_splash.bin.lz"); const u32 gUnusedPalette_WaterSplash[] = INCBIN_U32("graphics/unused/water_splash.gbapal.lz"); const u32 gUnusedGfx_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.4bpp.lz"); const u32 gUnusedPal_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.gbapal.lz"); const u32 gUnusedTilemap_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.bin.lz"); const u16 gBattleInterface_Healthbox_Pal[] = INCBIN_U16("graphics/battle_interface/healthbox.gbapal"); const u16 gBattleInterface_Healthbar_Pal[] = INCBIN_U16("graphics/battle_interface/healthbar.gbapal"); const u8 gBattleInterface_Gfx[] = INCBIN_U8("graphics/battle_interface/healthbox_elements.4bpp"); const u32 gBattleInterfaceGfx_UnusedWindow3[] = INCBIN_U32("graphics/battle_interface/unused_window3.4bpp.lz"); const u32 gBattleInterfaceGfx_UnusedWindow4[] = INCBIN_U32("graphics/battle_interface/unused_window4.4bpp.lz"); const u8 gNuzlockeFirstEncounterIndicator[] = INCBIN_U8("graphics/battle_interface/nuzlocke_indicator.4bpp"); const u32 gBattleAnimSpriteGfx_FurySwipes[] = INCBIN_U32("graphics/battle_anims/sprites/fury_swipes.4bpp.lz"); const u32 gBattleAnimSpritePal_FurySwipes[] = INCBIN_U32("graphics/battle_anims/sprites/fury_swipes.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Vine2[] = INCBIN_U32("graphics/battle_anims/sprites/vine_2.4bpp.lz"); const u32 gBattleAnimSpritePal_Vine2[] = INCBIN_U32("graphics/battle_anims/sprites/vine_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Teeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth.4bpp.lz"); const u32 gBattleAnimSpritePal_Teeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Bone2[] = INCBIN_U32("graphics/battle_anims/sprites/bone_2.4bpp.lz"); const u32 gBattleAnimSpritePal_Bone2[] = INCBIN_U32("graphics/battle_anims/sprites/bone_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WhiteBag[] = INCBIN_U32("graphics/battle_anims/sprites/white_bag.4bpp.lz"); const u32 gBattleAnimSpritePal_WhiteBag[] = INCBIN_U32("graphics/battle_anims/sprites/white_bag.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Unknown[] = INCBIN_U32("graphics/battle_anims/sprites/unknown.4bpp.lz"); const u32 gBattleAnimSpritePal_Unknown[] = INCBIN_U32("graphics/battle_anims/sprites/unknown.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PurpleCoral[] = INCBIN_U32("graphics/battle_anims/sprites/purple_coral.4bpp.lz"); const u32 gBattleAnimSpritePal_PurpleCoral[] = INCBIN_U32("graphics/battle_anims/sprites/purple_coral.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PurpleDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/purple_droplet.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Shock2[] = INCBIN_U32("graphics/battle_anims/sprites/shock_2.4bpp.lz"); const u32 gBattleAnimSpritePal_Shock2[] = INCBIN_U32("graphics/battle_anims/sprites/shock_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_ClosingEye2[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye_2.4bpp.lz"); const u32 gBattleAnimSpritePal_ClosingEye2[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MetalBall[] = INCBIN_U32("graphics/battle_anims/sprites/metal_ball.4bpp.lz"); const u32 gBattleAnimSpritePal_MetalBall[] = INCBIN_U32("graphics/battle_anims/sprites/metal_ball.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MonsterDoll[] = INCBIN_U32("graphics/battle_anims/sprites/monster_doll.4bpp.lz"); const u32 gBattleAnimSpritePal_MonsterDoll[] = INCBIN_U32("graphics/battle_anims/sprites/monster_doll.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Whirlwind[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind.4bpp.lz"); const u32 gBattleAnimSpritePal_Whirlwind[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Whirlwind2[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Explosion4[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_4.4bpp.lz"); const u32 gBattleAnimSpritePal_Explosion4[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_4.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Explosion5[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_5.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Tongue[] = INCBIN_U32("graphics/battle_anims/sprites/tongue.4bpp.lz"); const u32 gBattleAnimSpritePal_Tongue[] = INCBIN_U32("graphics/battle_anims/sprites/tongue.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Smoke[] = INCBIN_U32("graphics/battle_anims/sprites/smoke.4bpp.lz"); const u32 gBattleAnimSpritePal_Smoke[] = INCBIN_U32("graphics/battle_anims/sprites/smoke.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Smoke2[] = INCBIN_U32("graphics/battle_anims/sprites/smoke_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_BlueFlames[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames.4bpp.lz"); const u32 gBattleAnimSpritePal_BlueFlames[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BlueFlames2[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames_2.4bpp.lz"); // Contest (unused) const u32 gJpContest_Gfx1[] = INCBIN_U32("graphics/contest/japanese/composite_1.4bpp.lz"); const u32 gJpContest_Pal[] = INCBIN_U32("graphics/contest/japanese/palette.gbapal.lz"); const u32 gJpContest_Bg_Tilemap[] = INCBIN_U32("graphics/contest/japanese/bg.bin.lz"); const u32 gJpContest_Windows_Tilemap[] = INCBIN_U32("graphics/contest/japanese/windows.bin.lz"); const u32 gJpContest_Numbers_Gfx[] = INCBIN_U32("graphics/contest/japanese/numbers.4bpp.lz"); const u32 gJpContest_Numbers_Pal[] = INCBIN_U32("graphics/contest/japanese/numbers.gbapal.lz"); const u32 gJpContest_Gfx2[] = INCBIN_U32("graphics/contest/japanese/composite_2.4bpp.lz"); const u32 gContest_Interface_Pal[] = INCBIN_U32("graphics/contest/interface.gbapal.lz"); const u32 gContest_Audience_Tilemap[] = INCBIN_U32("graphics/contest/audience.bin.lz"); const u32 gContest_Interface_Tilemap[] = INCBIN_U32("graphics/contest/interface.bin.lz"); const u32 gJpContest_Interface_Tilemap[] = INCBIN_U32("graphics/contest/japanese/interface.bin.lz"); const u32 gJpContest_Audience_Tilemap[] = INCBIN_U32("graphics/contest/japanese/audience.bin.lz"); const u32 gContest_Curtain_Tilemap[] = INCBIN_U32("graphics/contest/curtain.bin.lz"); const u32 gContest_Interface_Gfx[] = INCBIN_U32("graphics/contest/interface.4bpp.lz"); const u32 gContest_Audience_Gfx[] = INCBIN_U32("graphics/contest/audience.4bpp.lz"); const u32 gContest_Faces_Gfx[] = INCBIN_U32("graphics/contest/faces.4bpp.lz"); const u32 gContest_JudgeSymbols_Gfx[] = INCBIN_U32("graphics/contest/judge_symbols.4bpp.lz"); const u32 gContest_JudgeSymbols_Pal[] = INCBIN_U32("graphics/contest/judge_symbols.gbapal.lz"); const u8 gContest_SliderHeart_Gfx[] = INCBIN_U8("graphics/contest/slider_heart.4bpp"); const u32 gJpContest_Voltage_Gfx[] = INCBIN_U32("graphics/contest/japanese/voltage.4bpp.lz"); const u32 gJpContest_Voltage_Pal[] = INCBIN_U32("graphics/contest/japanese/voltage.gbapal.lz"); const u32 gJpContestResults_Gfx[] = INCBIN_U32("graphics/contest/japanese/results.4bpp.lz"); const u32 gContestResults_WinnerBanner_Tilemap[] = INCBIN_U32("graphics/contest/results_winner_banner.bin.lz"); const u32 gContestResults_Interface_Tilemap[] = INCBIN_U32("graphics/contest/results_interface.bin.lz"); const u32 gContestResults_Bg_Tilemap[] = INCBIN_U32("graphics/contest/results_bg.bin.lz"); const u32 gContestResults_Pal[] = INCBIN_U32("graphics/contest/results.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.lz"); const u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32("graphics/battle_anims/sprites/particles.4bpp.lz"); const u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.4bpp.lz"); const u32 gBattleAnimSpritePal_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Scratch[] = INCBIN_U32("graphics/battle_anims/sprites/scratch.4bpp.lz"); const u32 gBattleAnimSpriteGfx_SharpTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/sharp_teeth.4bpp.lz"); const u32 gBattleAnimSpritePal_SharpTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/sharp_teeth.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Clamp[] = INCBIN_U32("graphics/battle_anims/sprites/clamp.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Cut[] = INCBIN_U32("graphics/battle_anims/sprites/cut.4bpp.lz"); const u32 gBattleAnimSpriteGfx_RainbowRings[] = INCBIN_U32("graphics/battle_anims/sprites/rainbow_rings.4bpp.lz"); const u32 gBattleAnimSpritePal_RainbowRings[] = INCBIN_U32("graphics/battle_anims/sprites/rainbow_rings.gbapal.lz"); const u32 gBattleAnimSpriteGfx_IceCrystals[] = INCBIN_U32("graphics/battle_anims/sprites/ice_crystals.4bpp.lz"); const u32 gBattleAnimSpritePal_IceCrystals[] = INCBIN_U32("graphics/battle_anims/sprites/ice_crystals.gbapal.lz"); const u32 gBattleAnimSpriteGfx_IceSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/ice_spikes.4bpp.lz"); const u32 gUnusedGfx_OldBeatUp[] = INCBIN_U32("graphics/unused/old_beatup.4bpp.lz"); const u32 gUnusedPal_OldBeatUp[] = INCBIN_U32("graphics/unused/old_beatup.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Orbs[] = INCBIN_U32("graphics/battle_anims/sprites/orbs.4bpp.lz"); const u32 gBattleAnimSpritePal_Orbs[] = INCBIN_U32("graphics/battle_anims/sprites/orbs.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WaterOrb[] = INCBIN_U32("graphics/battle_anims/sprites/water_orb.4bpp.lz"); const u32 gBattleAnimSpriteGfx_WaterImpact[] = INCBIN_U32("graphics/battle_anims/sprites/water_impact.4bpp.lz"); const u32 gBattleAnimSpritePal_WaterImpact[] = INCBIN_U32("graphics/battle_anims/sprites/water_impact.gbapal.lz"); const u32 gBattleAnimSpritePal_BrownOrb[] = INCBIN_U32("graphics/battle_anims/sprites/brown_orb.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MudSand[] = INCBIN_U32("graphics/battle_anims/sprites/mud_sand.4bpp.lz"); const u32 gBattleAnimSpritePal_MudSand[] = INCBIN_U32("graphics/battle_anims/sprites/mud_sand.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PoisonBubble[] = INCBIN_U32("graphics/battle_anims/sprites/poison_bubble.4bpp.lz"); const u32 gBattleAnimSpritePal_PoisonBubble[] = INCBIN_U32("graphics/battle_anims/sprites/poison_bubble.gbapal.lz"); const u32 gBattleAnimSpriteGfx_ToxicBubble[] = INCBIN_U32("graphics/battle_anims/sprites/toxic_bubble.4bpp.lz"); const u32 gBattleAnimSpriteGfx_HornHit2[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_2.4bpp.lz"); const u32 gBattleAnimSpritePal_HornHit2[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_AirWave2[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave_2.4bpp.lz"); const u32 gBattleAnimSpritePal_AirWave2[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SmallBubbles[] = INCBIN_U32("graphics/battle_anims/sprites/small_bubbles.4bpp.lz"); const u32 gBattleAnimSpritePal_SmallBubbles[] = INCBIN_U32("graphics/battle_anims/sprites/small_bubbles.gbapal.lz"); const u32 gBattleAnimSpriteGfx_RoundShadow[] = INCBIN_U32("graphics/battle_anims/sprites/round_shadow.4bpp.lz"); const u32 gBattleAnimSpritePal_RoundShadow[] = INCBIN_U32("graphics/battle_anims/sprites/round_shadow.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Sunlight[] = INCBIN_U32("graphics/battle_anims/sprites/sunlight.4bpp.lz"); const u32 gBattleAnimSpritePal_Sunlight[] = INCBIN_U32("graphics/battle_anims/sprites/sunlight.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Spore[] = INCBIN_U32("graphics/battle_anims/sprites/spore.4bpp.lz"); const u32 gBattleAnimSpritePal_Spore[] = INCBIN_U32("graphics/battle_anims/sprites/spore.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Flower[] = INCBIN_U32("graphics/battle_anims/sprites/flower.4bpp.lz"); const u32 gBattleAnimSpritePal_Flower[] = INCBIN_U32("graphics/battle_anims/sprites/flower.gbapal.lz"); const u32 gBattleAnimSpriteGfx_RazorLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/razor_leaf.4bpp.lz"); const u32 gBattleAnimSpritePal_RazorLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/razor_leaf.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MistCloud[] = INCBIN_U32("graphics/battle_anims/sprites/mist_cloud.4bpp.lz"); const u32 gBattleAnimSpritePal_MistCloud[] = INCBIN_U32("graphics/battle_anims/sprites/mist_cloud.gbapal.lz"); const u32 gBattleAnimUnusedGfx_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.4bpp.lz"); const u32 gBattleAnimUnusedPal_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.gbapal.lz"); const u32 gBattleAnimUnusedTilemap_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.bin.lz"); const u32 gBattleAnimSpriteGfx_WhirlwindLines[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_lines.4bpp.lz"); const u32 gBattleAnimSpritePal_WhirlwindLines[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_lines.gbapal.lz"); const u32 gBattleAnimSpriteGfx_GoldRing[] = INCBIN_U32("graphics/battle_anims/sprites/gold_ring.4bpp.lz"); const u32 gBattleAnimSpritePal_GoldRing[] = INCBIN_U32("graphics/battle_anims/sprites/gold_ring.gbapal.lz"); const u32 gBattleAnimSpritePal_BlueRing2[] = INCBIN_U32("graphics/battle_anims/sprites/blue_ring_2.gbapal.lz"); const u32 gBattleAnimSpritePal_PurpleRing[] = INCBIN_U32("graphics/battle_anims/sprites/purple_ring.gbapal.lz"); const u32 gBattleAnimSpritePal_BlueRing[] = INCBIN_U32("graphics/battle_anims/sprites/blue_ring.gbapal.lz"); const u32 gBattleAnimSpriteGfx_GreenLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/green_light_wall.4bpp.lz"); const u32 gBattleAnimSpritePal_GreenLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/green_light_wall.gbapal.lz"); const u32 gBattleAnimSpritePal_BlueLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/blue_light_wall.gbapal.lz"); const u32 gBattleAnimSpritePal_RedLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/red_light_wall.gbapal.lz"); const u32 gBattleAnimSpritePal_GrayLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/gray_light_wall.gbapal.lz"); const u32 gBattleAnimSpritePal_OrangeLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/orange_light_wall.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BlackBall2[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball_2.4bpp.lz"); const u32 gBattleAnimSpritePal_BlackBall2[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball_2.gbapal.lz"); const u32 gBattleAnimSpritePal_PurpleGasCloud[] = INCBIN_U32("graphics/battle_anims/sprites/purple_gas_cloud.gbapal.lz"); const u32 gContestJudgeGfx[] = INCBIN_U32("graphics/contest/judge.4bpp.lz"); const u32 gContestJudgePal[] = INCBIN_U32("graphics/contest/judge.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Spark[] = INCBIN_U32("graphics/battle_anims/sprites/spark.4bpp.lz"); const u32 gBattleAnimSpritePal_Spark[] = INCBIN_U32("graphics/battle_anims/sprites/spark.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SparkH[] = INCBIN_U32("graphics/battle_anims/sprites/spark_h.4bpp.lz"); const u32 gBattleAnimBgImage_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.4bpp.lz"); const u32 gBattleAnimBgPalette_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.gbapal.lz"); const u32 gBattleAnimBgTilemap_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.bin.lz"); const u32 gMetalShineGfx[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.4bpp.lz"); const u32 gMetalShinePalette[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.gbapal.lz"); const u32 gMetalShineTilemap[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.bin.lz"); const u32 gUnusedGfx_Goosuto[] = INCBIN_U32("graphics/unused/goosuto.4bpp.lz"); // ghost const u32 gUnusedPal_Goosuto[] = INCBIN_U32("graphics/unused/goosuto.gbapal.lz"); const u32 gUnusedTilemap_Goosuto[] = INCBIN_U32("graphics/unused/goosuto.bin.lz"); const u32 gBattleAnimSpriteGfx_YellowStar[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_star.4bpp.lz"); const u32 gBattleAnimSpritePal_YellowStar[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_star.gbapal.lz"); const u32 gBattleAnimSpriteGfx_LargeFreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/large_fresh_egg.4bpp.lz"); const u32 gBattleAnimSpritePal_LargeFreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/large_fresh_egg.gbapal.lz"); const u32 gBattleAnimSpriteGfx_ShadowBall[] = INCBIN_U32("graphics/battle_anims/sprites/shadow_ball.4bpp.lz"); const u32 gBattleAnimSpritePal_ShadowBall[] = INCBIN_U32("graphics/battle_anims/sprites/shadow_ball.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Lick[] = INCBIN_U32("graphics/battle_anims/sprites/lick.4bpp.lz"); const u32 gBattleAnimSpritePal_Lick[] = INCBIN_U32("graphics/battle_anims/sprites/lick.gbapal.lz"); const u32 gBattleAnimSpriteGfx_VoidLines[] = INCBIN_U32("graphics/battle_anims/sprites/void_lines.4bpp.lz"); const u32 gBattleAnimSpritePal_VoidLines[] = INCBIN_U32("graphics/battle_anims/sprites/void_lines.gbapal.lz"); const u32 gBattleAnimSpritePal_String[] = INCBIN_U32("graphics/battle_anims/sprites/string.gbapal.lz"); const u32 gBattleAnimSpriteGfx_String[] = INCBIN_U32("graphics/battle_anims/sprites/string.4bpp.lz"); const u32 gBattleAnimSpriteGfx_WebThread[] = INCBIN_U32("graphics/battle_anims/sprites/web_thread.4bpp.lz"); const u32 gBattleAnimSpriteGfx_SpiderWeb[] = INCBIN_U32("graphics/battle_anims/sprites/spider_web.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Lightbulb[] = INCBIN_U32("graphics/battle_anims/sprites/lightbulb.4bpp.lz"); const u32 gBattleAnimSpritePal_Lightbulb[] = INCBIN_U32("graphics/battle_anims/sprites/lightbulb.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Slash[] = INCBIN_U32("graphics/battle_anims/sprites/slash.4bpp.lz"); const u32 gBattleAnimSpritePal_Slash[] = INCBIN_U32("graphics/battle_anims/sprites/slash.gbapal.lz"); const u32 gBattleAnimSpriteGfx_FocusEnergy[] = INCBIN_U32("graphics/battle_anims/sprites/focus_energy.4bpp.lz"); const u32 gBattleAnimSpritePal_FocusEnergy[] = INCBIN_U32("graphics/battle_anims/sprites/focus_energy.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SphereToCube[] = INCBIN_U32("graphics/battle_anims/sprites/sphere_to_cube.4bpp.lz"); const u32 gBattleAnimSpritePal_SphereToCube[] = INCBIN_U32("graphics/battle_anims/sprites/sphere_to_cube.gbapal.lz"); const u32 gBattleAnimBgImage_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.4bpp.lz"); const u32 gBattleAnimBgPalette_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.gbapal.lz"); const u32 gBattleAnimBgTilemap_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.bin.lz"); const u32 gBattleAnimSpriteGfx_Eye[] = INCBIN_U32("graphics/battle_anims/sprites/eye.4bpp.lz"); const u32 gBattleAnimSpritePal_Eye[] = INCBIN_U32("graphics/battle_anims/sprites/eye.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Tendrils[] = INCBIN_U32("graphics/battle_anims/sprites/tendrils.4bpp.lz"); const u32 gBattleAnimSpritePal_Tendrils[] = INCBIN_U32("graphics/battle_anims/sprites/tendrils.gbapal.lz"); const u32 gHealthboxSinglesPlayerGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_player.4bpp.lz"); const u32 gHealthboxSinglesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_opponent.4bpp.lz"); const u32 gHealthboxDoublesPlayerGfx[] = INCBIN_U32( "graphics/battle_interface/healthbox_doubles_player.4bpp.lz"); const u32 gHealthboxDoublesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_doubles_opponent.4bpp.lz"); const u32 gHealthboxSafariGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_safari.4bpp.lz"); const u32 gUnusedGfx_Shadow[] = INCBIN_U32("graphics/unused/shadow.4bpp.lz"); const u32 gUnusedPal_Shadow[] = INCBIN_U32("graphics/unused/shadow.gbapal.lz"); const u32 gBattleAnimSpriteGfx_LockOn[] = INCBIN_U32("graphics/battle_anims/sprites/lock_on.4bpp.lz"); const u32 gBattleAnimSpritePal_LockOn[] = INCBIN_U32("graphics/battle_anims/sprites/lock_on.gbapal.lz"); const u32 gBattleAnimSpriteGfx_OpeningEye[] = INCBIN_U32("graphics/battle_anims/sprites/opening_eye.4bpp.lz"); const u32 gBattleAnimSpritePal_OpeningEye[] = INCBIN_U32("graphics/battle_anims/sprites/opening_eye.gbapal.lz"); const u32 gBattleAnimSpriteGfx_RoundWhiteHalo[] = INCBIN_U32("graphics/battle_anims/sprites/round_white_halo.4bpp.lz"); const u32 gBattleAnimSpritePal_RoundWhiteHalo[] = INCBIN_U32("graphics/battle_anims/sprites/round_white_halo.gbapal.lz"); const u32 gBattleAnimSpriteGfx_TealAlert[] = INCBIN_U32("graphics/battle_anims/sprites/teal_alert.4bpp.lz"); const u32 gBattleAnimSpritePal_TealAlert[] = INCBIN_U32("graphics/battle_anims/sprites/teal_alert.gbapal.lz"); const u32 gBattleAnimSpriteGfx_FangAttack[] = INCBIN_U32("graphics/battle_anims/sprites/fang_attack.4bpp.lz"); const u32 gBattleAnimSpritePal_FangAttack[] = INCBIN_U32("graphics/battle_anims/sprites/fang_attack.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.4bpp.lz"); const u32 gBattleAnimSpritePal_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.gbapal.lz"); const u32 gFile_graphics_battle_anims_masks_curse_sheet[] = INCBIN_U32("graphics/battle_anims/masks/curse.4bpp.lz"); const u32 gFile_graphics_battle_anims_masks_curse_tilemap[] = INCBIN_U32("graphics/battle_anims/masks/curse.bin.lz"); const u32 gBattleAnimSpriteGfx_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.4bpp.lz"); const u32 gBattleAnimSpritePal_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Spiral[] = INCBIN_U32("graphics/battle_anims/sprites/spiral.4bpp.lz"); const u32 gBattleAnimSpritePal_Spiral[] = INCBIN_U32("graphics/battle_anims/sprites/spiral.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Moon[] = INCBIN_U32("graphics/battle_anims/sprites/moon.4bpp.lz"); const u32 gBattleAnimSpritePal_Moon[] = INCBIN_U32("graphics/battle_anims/sprites/moon.gbapal.lz"); const u32 gBattleAnimSpriteGfx_GreenSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/green_sparkle.4bpp.lz"); const u32 gBattleAnimSpritePal_GreenSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/green_sparkle.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SnoreZ[] = INCBIN_U32("graphics/battle_anims/sprites/snore_z.4bpp.lz"); const u32 gBattleAnimSpritePal_SnoreZ[] = INCBIN_U32("graphics/battle_anims/sprites/snore_z.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Explosion[] = INCBIN_U32("graphics/battle_anims/sprites/explosion.4bpp.lz"); const u32 gBattleAnimSpritePal_Explosion[] = INCBIN_U32("graphics/battle_anims/sprites/explosion.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Nail[] = INCBIN_U32("graphics/battle_anims/sprites/nail.4bpp.lz"); const u32 gBattleAnimSpritePal_Nail[] = INCBIN_U32("graphics/battle_anims/sprites/nail.gbapal.lz"); const u32 gBattleAnimSpriteGfx_GhostlySpirit[] = INCBIN_U32("graphics/battle_anims/sprites/ghostly_spirit.4bpp.lz"); const u32 gBattleAnimSpritePal_GhostlySpirit[] = INCBIN_U32("graphics/battle_anims/sprites/ghostly_spirit.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WarmRock[] = INCBIN_U32("graphics/battle_anims/sprites/warm_rock.4bpp.lz"); const u32 gBattleAnimSpritePal_WarmRock[] = INCBIN_U32("graphics/battle_anims/sprites/warm_rock.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PunchImpact[] = INCBIN_U32("graphics/battle_anims/sprites/punch_impact.4bpp.lz"); const u32 gBattleAnimSpritePal_PunchImpact[] = INCBIN_U32("graphics/battle_anims/sprites/punch_impact.gbapal.lz"); const u32 gBattleAnimSpriteGfx_BreakingEgg[] = INCBIN_U32("graphics/battle_anims/sprites/breaking_egg.4bpp.lz"); const u32 gBattleAnimSpritePal_BreakingEgg[] = INCBIN_U32("graphics/battle_anims/sprites/breaking_egg.gbapal.lz"); const u32 gBattleAnimSpriteGfx_ThinRing[] = INCBIN_U32("graphics/battle_anims/sprites/thin_ring.4bpp.lz"); const u32 gBattleAnimSpritePal_ThinRing[] = INCBIN_U32("graphics/battle_anims/sprites/thin_ring.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MusicNotes2[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes_2.4bpp.lz"); const u32 gBattleAnimSpritePal_MusicNotes2[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Bell[] = INCBIN_U32("graphics/battle_anims/sprites/bell.4bpp.lz"); const u32 gBattleAnimSpritePal_Bell[] = INCBIN_U32("graphics/battle_anims/sprites/bell.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SpeedDust[] = INCBIN_U32("graphics/battle_anims/sprites/speed_dust.4bpp.lz"); const u32 gBattleAnimSpritePal_SpeedDust[] = INCBIN_U32("graphics/battle_anims/sprites/speed_dust.gbapal.lz"); const u32 gBattleAnimSpriteGfx_TornMetal[] = INCBIN_U32("graphics/battle_anims/sprites/torn_metal.4bpp.lz"); const u32 gBattleAnimSpriteGfx_ThoughtBubble[] = INCBIN_U32("graphics/battle_anims/sprites/thought_bubble.4bpp.lz"); const u32 gBattleAnimSpritePal_ThoughtBubble[] = INCBIN_U32("graphics/battle_anims/sprites/thought_bubble.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Finger[] = INCBIN_U32("graphics/battle_anims/sprites/finger.4bpp.lz"); const u32 gBattleAnimSpritePal_Finger[] = INCBIN_U32("graphics/battle_anims/sprites/finger.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MagentaHeart[] = INCBIN_U32("graphics/battle_anims/sprites/magenta_heart.4bpp.lz"); const u32 gBattleAnimSpritePal_PinkHeart[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart.gbapal.lz"); const u32 gBattleAnimSpritePal_MagentaHeart[] = INCBIN_U32("graphics/battle_anims/sprites/magenta_heart.gbapal.lz"); const u32 gBattleAnimSpritePal_RedHeart[] = INCBIN_U32("graphics/battle_anims/sprites/red_heart.gbapal.lz"); const u32 gBattleAnimBg_AttractGfx[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.4bpp.lz"); const u32 gBattleAnimBg_AttractPal[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.gbapal.lz"); const u32 gBattleAnimBg_AttractTilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.bin.lz"); const u32 gBattleAnimSpriteGfx_RedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb.4bpp.lz"); const u32 gBattleAnimSpritePal_RedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb.gbapal.lz"); const u32 gBattleAnimSpriteGfx_CircleOfLight[] = INCBIN_U32("graphics/battle_anims/sprites/circle_of_light.4bpp.lz"); const u32 gBattleAnimSpriteGfx_ElectricOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/electric_orbs.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Electricity[] = INCBIN_U32("graphics/battle_anims/sprites/electricity.4bpp.lz"); const u32 gBattleAnimSpritePal_ElectricOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/electric_orbs.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Finger2[] = INCBIN_U32("graphics/battle_anims/sprites/finger_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_MovementWaves[] = INCBIN_U32("graphics/battle_anims/sprites/movement_waves.4bpp.lz"); const u32 gBattleAnimSpritePal_MovementWaves[] = INCBIN_U32("graphics/battle_anims/sprites/movement_waves.gbapal.lz"); const u32 gBattleAnim_ScaryFacePal[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face.gbapal.lz"); const u32 gBattleAnim_ScaryFaceGfx[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face.4bpp.lz"); const u32 gBattleAnimSpritePal_EyeSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/eye_sparkle.gbapal.lz"); const u32 gBattleAnimSpriteGfx_EyeSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/eye_sparkle.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Anger[] = INCBIN_U32("graphics/battle_anims/sprites/anger.4bpp.lz"); const u32 gBattleAnimSpritePal_Anger[] = INCBIN_U32("graphics/battle_anims/sprites/anger.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Conversion[] = INCBIN_U32("graphics/battle_anims/sprites/conversion.4bpp.lz"); const u32 gBattleAnimSpritePal_Conversion[] = INCBIN_U32("graphics/battle_anims/sprites/conversion.gbapal.lz"); const u32 gBattleAnimSpritePal_Angel[] = INCBIN_U32("graphics/battle_anims/sprites/angel.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Angel[] = INCBIN_U32("graphics/battle_anims/sprites/angel.4bpp.lz"); const u32 gBattleAnimSpritePal_Devil[] = INCBIN_U32("graphics/battle_anims/sprites/devil.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Devil[] = INCBIN_U32("graphics/battle_anims/sprites/devil.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Swipe[] = INCBIN_U32("graphics/battle_anims/sprites/swipe.4bpp.lz"); const u32 gBattleAnimSpritePal_Swipe[] = INCBIN_U32("graphics/battle_anims/sprites/swipe.gbapal.lz"); const u32 gBattleAnimSpritePal_Roots[] = INCBIN_U32("graphics/battle_anims/sprites/roots.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Roots[] = INCBIN_U32("graphics/battle_anims/sprites/roots.4bpp.lz"); const u32 gBattleAnimSpritePal_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.gbapal.lz"); const u32 gBattleAnimSpriteGfx_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.4bpp.lz"); const u32 gBattleAnimSpritePal_TriAttackTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.gbapal.lz"); const u32 gBattleAnimSpriteGfx_TriAttackTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.4bpp.lz"); const u32 gBattleAnimSpritePal_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.gbapal.lz"); const u32 gBattleAnimSpriteGfx_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.4bpp.lz"); const u32 gBattleAnimBgPalette_Impact[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact.gbapal.lz"); const u32 gBattleAnimBgImage_Impact[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact.4bpp.lz"); const u32 gBattleAnimBgTilemap_ImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_opponent.bin.lz"); const u32 gBattleAnimBgTilemap_ImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_player.bin.lz"); const u32 gBattleAnimBgTilemap_ImpactContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_contests.bin.lz"); const u32 gBattleAnimSpriteGfx_JaggedMusicNote[] = INCBIN_U32("graphics/battle_anims/sprites/jagged_music_note.4bpp.lz"); const u32 gBattleAnimSpritePal_JaggedMusicNote[] = INCBIN_U32("graphics/battle_anims/sprites/jagged_music_note.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Spotlight[] = INCBIN_U32("graphics/battle_anims/sprites/spotlight.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Pokeball[] = INCBIN_U32("graphics/battle_anims/sprites/pokeball.4bpp.lz"); const u32 gBattleAnimSpritePal_Pokeball[] = INCBIN_U32("graphics/battle_anims/sprites/pokeball.gbapal.lz"); const u32 gBattleAnimSpriteGfx_RapidSpin[] = INCBIN_U32("graphics/battle_anims/sprites/rapid_spin.4bpp.lz"); const u32 gBattleAnimSpritePal_RapidSpin[] = INCBIN_U32("graphics/battle_anims/sprites/rapid_spin.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MilkBottle[] = INCBIN_U32("graphics/battle_anims/sprites/milk_bottle.4bpp.lz"); const u32 gBattleAnimSpritePal_MilkBottle[] = INCBIN_U32("graphics/battle_anims/sprites/milk_bottle.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WispFire[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_fire.4bpp.lz"); const u32 gBattleAnimSpritePal_WispOrb[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_orb.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WispOrb[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_orb.4bpp.lz"); const u32 gBattleAnimSpriteGfx_GoldStars[] = INCBIN_U32("graphics/battle_anims/sprites/gold_stars.4bpp.lz"); const u32 gBattleAnimSpritePal_GoldStars[] = INCBIN_U32("graphics/battle_anims/sprites/gold_stars.gbapal.lz"); const u32 gBattleAnimSpriteGfx_EclipsingOrb[] = INCBIN_U32("graphics/battle_anims/sprites/eclipsing_orb.4bpp.lz"); const u32 gBattleAnimSpritePal_EclipsingOrb[] = INCBIN_U32("graphics/battle_anims/sprites/eclipsing_orb.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PinkPetal[] = INCBIN_U32("graphics/battle_anims/sprites/pink_petal.4bpp.lz"); const u32 gBattleAnimSpritePal_PinkPetal[] = INCBIN_U32("graphics/battle_anims/sprites/pink_petal.gbapal.lz"); const u32 gBattleAnimSpriteGfx_GrayOrb[] = INCBIN_U32("graphics/battle_anims/sprites/gray_orb.4bpp.lz"); const u32 gBattleAnimSpritePal_GrayOrb[] = INCBIN_U32("graphics/battle_anims/sprites/gray_orb.gbapal.lz"); const u32 gBattleAnimSpritePal_BlueOrb[] = INCBIN_U32("graphics/battle_anims/sprites/blue_orb.gbapal.lz"); const u32 gBattleAnimSpritePal_RedOrb2[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb_2.gbapal.lz"); const u32 gBattleAnimBgImage_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.4bpp.lz"); const u32 gBattleAnimBgPalette_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.gbapal.lz"); const u32 gBattleAnimBgPalette_Sky[] = INCBIN_U32("graphics/battle_anims/backgrounds/sky.gbapal.lz"); const u32 gBattleAnimBgTilemap_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.bin.lz"); const u32 gBattleAnimBgTilemap_DrillContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill_contests.bin.lz"); const u32 gBattleAnimBgImage_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.4bpp.lz"); const u32 gBattleAnimBgPalette_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.gbapal.lz"); const u32 gBattleAnimBgTilemap_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.bin.lz"); const u32 gBattleAnimBgTilemap_HighspeedOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_opponent.bin.lz"); const u32 gBattleAnimBgPalette_Highspeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed.gbapal.lz"); const u32 gBattleAnimBgPalette_Bug[] = INCBIN_U32("graphics/battle_anims/backgrounds/bug.gbapal.lz"); const u32 gBattleAnimBgImage_Highspeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed.4bpp.lz"); const u32 gBattleAnimBgTilemap_HighspeedPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_player.bin.lz"); const u32 gBattleAnim_MorningSunGfx[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.4bpp.lz"); const u32 gBattleAnim_MorningSunPal[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.gbapal.lz"); const u32 gBattleAnim_MorningSunTilemap[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.bin.lz"); const u32 gBattleAnimBgTilemap_GuillotineOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_opponent.bin.lz"); const u32 gBattleAnimBgTilemap_GuillotinePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_player.bin.lz"); const u32 gBattleAnimBgTilemap_GuillotineContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_contests.bin.lz"); const u32 gBattleAnimBgImage_Guillotine[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine.4bpp.lz"); const u32 gBattleAnimBgPalette_Guillotine[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine.gbapal.lz"); const u32 gBattleAnimBgImage_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.4bpp.lz"); const u32 gBattleAnimBgPalette_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.gbapal.lz"); const u32 gBattleAnimBgTilemap_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.bin.lz"); const u32 gBattleAnimSpriteGfx_PainSplit[] = INCBIN_U32("graphics/battle_anims/sprites/pain_split.4bpp.lz"); const u32 gBattleAnimSpritePal_PainSplit[] = INCBIN_U32("graphics/battle_anims/sprites/pain_split.gbapal.lz"); const u32 gBattleAnimSpriteGfx_HandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet.4bpp.lz"); const u32 gBattleAnimSpritePal_HandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Confetti[] = INCBIN_U32("graphics/battle_anims/sprites/confetti.4bpp.lz"); const u32 gBattleAnimSpritePal_Confetti[] = INCBIN_U32("graphics/battle_anims/sprites/confetti.gbapal.lz"); const u32 gSubstituteDollPal[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.gbapal.lz"); const u32 gSubstituteDollGfx[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.4bpp.lz"); const u32 gSubstituteDollTilemap[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.bin.lz"); const u32 gBattleAnimSpriteGfx_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.4bpp.lz"); const u32 gBattleAnimSpritePal_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.gbapal.lz"); const u32 gFile_graphics_misc_confetti_sheet[] = INCBIN_U32("graphics/misc/confetti.4bpp.lz"); const u32 gFile_graphics_misc_confetti_palette[] = INCBIN_U32("graphics/misc/confetti.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.4bpp.lz"); const u32 gBattleAnimSpritePal_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.4bpp.lz"); const u32 gBattleAnimSpritePal_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.gbapal.lz"); const u32 gBattleStatMask_Gfx[] = INCBIN_U32("graphics/battle_anims/masks/stat.4bpp.lz"); const u32 gBattleStatMask1_Tilemap[] = INCBIN_U32("graphics/battle_anims/masks/stat_tilemap_1.bin.lz"); const u32 gBattleStatMask2_Tilemap[] = INCBIN_U32("graphics/battle_anims/masks/stat_tilemap_2.bin.lz"); const u32 gBattleStatMask1_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat1.gbapal.lz"); const u32 gBattleStatMask2_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat2.gbapal.lz"); const u32 gBattleStatMask3_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat3.gbapal.lz"); const u32 gBattleStatMask4_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat4.gbapal.lz"); const u32 gBattleStatMask5_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat5.gbapal.lz"); const u32 gBattleStatMask6_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat6.gbapal.lz"); const u32 gBattleStatMask7_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat7.gbapal.lz"); const u32 gBattleStatMask8_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat8.gbapal.lz"); const u32 gCureBubblesGfx[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.4bpp.lz"); const u32 gCureBubblesPal[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.gbapal.lz"); const u32 gCureBubblesTilemap[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.bin.lz"); const u32 gBattleAnimSpritePal_PurpleScratch[] = INCBIN_U32("graphics/battle_anims/sprites/purple_scratch.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PurpleScratch[] = INCBIN_U32("graphics/battle_anims/sprites/purple_scratch.4bpp.lz"); const u32 gBattleAnimSpriteGfx_PurpleSwipe[] = INCBIN_U32("graphics/battle_anims/sprites/purple_swipe.4bpp.lz"); const u32 gBattleAnimSpriteGfx_GuardRing[] = INCBIN_U32("graphics/battle_anims/sprites/guard_ring.4bpp.lz"); const u32 gBattleAnimSpritePal_GuardRing[] = INCBIN_U32("graphics/battle_anims/sprites/guard_ring.gbapal.lz"); const u32 gBattleAnimSpriteGfx_TagHand[] = INCBIN_U32("graphics/battle_anims/sprites/tag_hand.4bpp.lz"); const u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32("graphics/battle_anims/sprites/noise_line.4bpp.lz"); const u32 gUnusedLevelupAnimationGfx[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.4bpp.lz"); const u32 gUnusedLevelupAnimationTilemap[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.bin.lz"); const u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.4bpp.lz"); const u32 gBattleAnimSpritePal_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.gbapal.lz"); const u32 gBattleAnimSpriteGfx_HollowOrb[] = INCBIN_U32("graphics/battle_anims/sprites/hollow_orb.4bpp.lz"); const u32 gBattleAnimSpritePal_HollowOrb[] = INCBIN_U32("graphics/battle_anims/sprites/hollow_orb.gbapal.lz"); const u32 gBattleAnimSpriteGfx_XSign[] = INCBIN_U32("graphics/battle_anims/sprites/x_sign.4bpp.lz"); const u32 gBattleAnimSpriteGfx_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.4bpp.lz"); const u32 gBattleAnimSpritePal_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.4bpp.lz"); const u32 gBattleAnimSpritePal_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PurpleFlame[] = INCBIN_U32("graphics/battle_anims/sprites/purple_flame.4bpp.lz"); const u32 gBattleAnimSpritePal_PurpleFlame[] = INCBIN_U32("graphics/battle_anims/sprites/purple_flame.gbapal.lz"); const u32 gBattleAnimSpriteGfx_RedBall[] = INCBIN_U32("graphics/battle_anims/sprites/red_ball.4bpp.lz"); const u32 gBattleAnimSpritePal_RedBall[] = INCBIN_U32("graphics/battle_anims/sprites/red_ball.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SmellingsaltEffect[] = INCBIN_U32("graphics/battle_anims/sprites/smellingsalt_effect.4bpp.lz"); const u32 gBattleAnimSpritePal_SmellingsaltEffect[] = INCBIN_U32("graphics/battle_anims/sprites/smellingsalt_effect.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MagnifyingGlass[] = INCBIN_U32("graphics/battle_anims/sprites/magnifying_glass.4bpp.lz"); const u32 gBattleAnimSpritePal_MagnifyingGlass[] = INCBIN_U32("graphics/battle_anims/sprites/magnifying_glass.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Meteor[] = INCBIN_U32("graphics/battle_anims/sprites/meteor.4bpp.lz"); const u32 gBattleAnimSpritePal_Meteor[] = INCBIN_U32("graphics/battle_anims/sprites/meteor.gbapal.lz"); const u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.4bpp.lz"); const u32 gBattleAnimSpritePal_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.gbapal.lz"); const u16 gPPTextPalette[] = INCBIN_U16("graphics/interface/text_pp.gbapal"); #include "data/graphics/pokemon.h" #include "data/graphics/trainers.h" const u8 gMonIcon_QuestionMark[] = INCBIN_U8("graphics/pokemon/question_mark/icon.4bpp"); const u8 gMonFootprint_QuestionMark[] = INCBIN_U8("graphics/pokemon/question_mark/footprint.1bpp"); const u32 gFile_graphics_battle_transitions_vs_frame_sheet[] = INCBIN_U32("graphics/battle_transitions/vs_frame.4bpp.lz"); const u32 gFile_graphics_battle_transitions_vs_frame_tilemap[] = INCBIN_U32("graphics/battle_transitions/vs_frame.bin.lz"); const u32 gFile_graphics_battle_transitions_vs_frame_palette[] = INCBIN_U32("graphics/battle_transitions/vs_frame.gbapal.lz"); const u32 gVsLettersGfx[] = INCBIN_U32("graphics/battle_transitions/vs.4bpp.lz"); #include "data/graphics/battle_terrain_unused.h" const u32 gBattleAnimSpriteGfx_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.4bpp.lz"); const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.bin.lz"); const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.4bpp.lz"); const u32 gBattleAnimSpritePal_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.gbapal.lz"); const u32 gBattleAnimSpriteGfx_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.4bpp.lz"); const u32 gBattleAnimSpritePal_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.gbapal.lz"); const u32 gBattleAnimBgImage_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.4bpp.lz"); const u32 gBattleAnimBgPalette_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.gbapal.lz"); const u32 gBattleAnimBgTilemap_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.bin.lz"); const u32 gBattleAnimSpriteGfx_IcicleSpear[] = INCBIN_U32("graphics/battle_anims/sprites/icicle_spear.4bpp.lz"); const u32 gBattleAnimSpritePal_IcicleSpear[] = INCBIN_U32("graphics/battle_anims/sprites/icicle_spear.gbapal.lz"); const u32 gContestNextTurnGfx[] = INCBIN_U32("graphics/contest/next_turn.4bpp.lz"); const u8 gContestNextTurnNumbersGfx[] = INCBIN_U8("graphics/contest/next_turn_numbers.4bpp"); const u8 gContestNextTurnRandomGfx[] = INCBIN_U8("graphics/contest/next_turn_random.4bpp"); const u32 gBattleAnimSpriteGfx_GlowyRedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_red_orb.4bpp.lz"); const u32 gBattleAnimSpritePal_GlowyRedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_red_orb.gbapal.lz"); const u32 gBattleAnimSpritePal_GlowyGreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_green_orb.gbapal.lz"); const u32 gBattleAnimSpritePal_SleepPowder[] = INCBIN_U32("graphics/battle_anims/sprites/sleep_powder.gbapal.lz"); const u32 gBattleAnimSpritePal_StunSpore[] = INCBIN_U32("graphics/battle_anims/sprites/stun_spore.gbapal.lz"); const u32 gContestApplauseGfx[] = INCBIN_U32("graphics/contest/applause.4bpp.lz"); const u8 gContestApplauseMeterGfx[] = INCBIN_U8("graphics/contest/applause_meter.4bpp"); const u16 gContestNextTurnPal[] = INCBIN_U16("graphics/contest/next_turn.gbapal"); const u32 gBattleAnimSpriteGfx_Splash[] = INCBIN_U32("graphics/battle_anims/sprites/splash.4bpp.lz"); const u32 gBattleAnimSpritePal_Splash[] = INCBIN_U32("graphics/battle_anims/sprites/splash.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SweatBead[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_bead.4bpp.lz"); const u32 gBattleAnimSpriteGfx_SafariBait[] = INCBIN_U32("graphics/battle_anims/sprites/safari_bait.4bpp.lz"); const u32 gBattleAnimSpritePal_SafariBait[] = INCBIN_U32("graphics/battle_anims/sprites/safari_bait.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Gem1[] = INCBIN_U32("graphics/battle_anims/sprites/gem_1.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Gem2[] = INCBIN_U32("graphics/battle_anims/sprites/gem_2.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Gem3[] = INCBIN_U32("graphics/battle_anims/sprites/gem_3.4bpp.lz"); const u32 gBattleAnimSpritePal_Gem1[] = INCBIN_U32("graphics/battle_anims/sprites/gem_1.gbapal.lz"); const u32 gBattleAnimBgImage_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.4bpp.lz"); const u32 gBattleAnimBgPalette_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.gbapal.lz"); const u32 gBattleAnimBgTilemap_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.bin.lz"); const u32 gBattleAnimSpriteGfx_Protect[] = INCBIN_U32("graphics/battle_anims/sprites/protect.4bpp.lz"); const u32 gBattleAnimSpritePal_Protect[] = INCBIN_U32("graphics/battle_anims/sprites/protect.gbapal.lz"); const u32 gBattleAnimBgPalette_MuddyWater[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_muddy.gbapal.lz"); const u32 gEnemyMonShadow_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.lz"); const u32 gBattleInterface_PartySummaryBar_Gfx[] = INCBIN_U32("graphics/battle_interface/party_summary_bar.4bpp.lz"); const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp"); const u32 gBattleAnimBgImage_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.4bpp.lz"); const u32 gBattleAnimBgPalette_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.gbapal.lz"); const u32 gBattleAnimBgTilemap_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.bin.lz"); const u32 gBattleAnimSpritePal_WhipHit[] = INCBIN_U32("graphics/battle_anims/sprites/whip_hit.gbapal.lz"); const u32 gBattleAnimBgPalette_SolarBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.gbapal.lz"); const u32 gBattleAnimBgTilemap_SolarBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.bin.lz"); // Unused const u32 gFile_graphics_berry_blender_center_sheet[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); const u32 gFile_graphics_berry_blender_outer_sheet[] = INCBIN_U32("graphics/berry_blender/outer.4bpp.lz"); const u32 gFile_graphics_berry_blender_outer_map_tilemap[] = INCBIN_U32("graphics/berry_blender/outer_map.bin.lz"); const u32 gBattleAnimBgPalette_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.gbapal.lz"); const u32 gBattleAnimBgImage_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.4bpp.lz"); const u32 gBattleAnimBgTilemap_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.bin.lz"); const u32 gBattleAnimSpritePal_SlamHit2[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_SlamHit2[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit_2.4bpp.lz"); const u32 gBattleAnimFogTilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/fog.bin.lz"); const u32 gBattleAnimSpritePal_WeatherBall[] = INCBIN_U32("graphics/battle_anims/sprites/weather_ball.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WeatherBall[] = INCBIN_U32("graphics/battle_anims/sprites/weather_ball.4bpp.lz"); const u32 gBattleAnimBgTilemap_ScaryFacePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_player.bin.lz"); const u32 gBattleAnimBgTilemap_ScaryFaceOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_opponent.bin.lz"); const u32 gBattleAnimBgTilemap_ScaryFaceContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_contest.bin.lz"); const u32 gBattleAnimSpriteGfx_Hail[] = INCBIN_U32("graphics/battle_anims/sprites/hail.4bpp.lz"); const u32 gBattleAnimSpritePal_Hail[] = INCBIN_U32("graphics/battle_anims/sprites/hail.gbapal.lz"); const u32 gBattleAnimSpriteGfx_GreenSpike[] = INCBIN_U32("graphics/battle_anims/sprites/green_spike.4bpp.lz"); const u32 gBattleAnimSpritePal_GreenSpike[] = INCBIN_U32("graphics/battle_anims/sprites/green_spike.gbapal.lz"); const u32 gBattleAnimSpritePal_WhiteCircleOfLight[] = INCBIN_U32("graphics/battle_anims/sprites/white_circle_of_light.gbapal.lz"); const u32 gBattleAnimSpritePal_GlowyBlueOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_blue_orb.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Recycle[] = INCBIN_U32("graphics/battle_anims/sprites/recycle.4bpp.lz"); const u32 gBattleAnimSpritePal_Recycle[] = INCBIN_U32("graphics/battle_anims/sprites/recycle.gbapal.lz"); const u32 gBattleAnimSpriteGfx_RedParticles[] = INCBIN_U32("graphics/battle_anims/sprites/red_particles.4bpp.lz"); const u32 gBattleAnimSpritePal_RedParticles[] = INCBIN_U32("graphics/battle_anims/sprites/red_particles.gbapal.lz"); const u32 gBattleAnimSpriteGfx_DirtMound[] = INCBIN_U32("graphics/battle_anims/sprites/dirt_mound.4bpp.lz"); const u32 gBattleAnimSpritePal_DirtMound[] = INCBIN_U32("graphics/battle_anims/sprites/dirt_mound.gbapal.lz"); const u32 gBattleAnimBgImage_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.4bpp.lz"); const u32 gBattleAnimBgPalette_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.gbapal.lz"); const u32 gBattleAnimBgTilemap_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.bin.lz"); const u32 gBattleAnimSpriteGfx_Bird[] = INCBIN_U32("graphics/battle_anims/sprites/bird.4bpp.lz"); const u32 gBattleAnimSpritePal_Bird[] = INCBIN_U32("graphics/battle_anims/sprites/bird.gbapal.lz"); const u32 gBattleAnimSpriteGfx_CrossImpact[] = INCBIN_U32("graphics/battle_anims/sprites/cross_impact.4bpp.lz"); const u32 gBattleAnimSpritePal_CrossImpact[] = INCBIN_U32("graphics/battle_anims/sprites/cross_impact.gbapal.lz"); const u32 gBattleAnimBgImage_Surf[] = INCBIN_U32("graphics/battle_anims/backgrounds/water.4bpp.lz"); const u32 gBattleAnimBgPalette_Surf[] = INCBIN_U32("graphics/battle_anims/backgrounds/water.gbapal.lz"); const u32 gBattleAnimBgTilemap_SurfOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_opponent.bin.lz"); const u32 gBattleAnimBgTilemap_SurfPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_player.bin.lz"); const u32 gBattleAnimBgTilemap_SurfContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_contest.bin.lz"); const u32 gBattleAnimSpritePal_Slash2[] = INCBIN_U32("graphics/battle_anims/sprites/slash_2.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.4bpp.lz"); const u32 gBattleAnimSpritePal_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.gbapal.lz"); const u32 gPartyMenuBg_Gfx[] = INCBIN_U32("graphics/party_menu/bg.4bpp.lz"); const u32 gPartyMenuBg_Pal[] = INCBIN_U32("graphics/party_menu/bg.gbapal.lz"); const u32 gPartyMenuBg_Tilemap[] = INCBIN_U32("graphics/party_menu/bg.bin.lz"); const u32 gPartyMenuPokeball_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball.4bpp.lz"); const u32 gPartyMenuPokeballSmall_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball_small.4bpp.lz"); //unused const u32 gPartyMenuPokeball_Pal[] = INCBIN_U32("graphics/party_menu/pokeball.gbapal.lz"); const u32 gStatusGfx_Icons[] = INCBIN_U32("graphics/interface/status_icons.4bpp.lz"); const u32 gStatusPal_Icons[] = INCBIN_U32("graphics/interface/status_icons.gbapal.lz"); const u32 gBagBg_Gfx[] = INCBIN_U32("graphics/item_menu/bg.4bpp.lz"); const u32 gBagBg_Tilemap[] = INCBIN_U32("graphics/item_menu/bg.bin.lz"); const u32 gBagBg_ItemPC_Tilemap[] = INCBIN_U32("graphics/item_menu/bg_item_pc.bin.lz"); const u32 gBagBgPalette[] = INCBIN_U32("graphics/item_menu/bg.gbapal.lz"); // palette 1 (Boy + misc Pal) const u32 gBagBgPalette_FemaleOverride[] = INCBIN_U32("graphics/item_menu/bg_female.gbapal.lz"); // palette 2 (Girl) const u32 gBagMale_Gfx[] = INCBIN_U32("graphics/interface/bag_male.4bpp.lz"); const u32 gBagFemale_Gfx[] = INCBIN_U32("graphics/interface/bag_female.4bpp.lz"); const u32 gBag_Pal[] = INCBIN_U32("graphics/interface/bag.gbapal.lz"); const u32 gSwapLine_Gfx[] = INCBIN_U32("graphics/interface/bag_swap.4bpp.lz"); const u32 gSwapLine_Pal[] = INCBIN_U32("graphics/interface/bag_swap.gbapal.lz"); const u32 gTMCase_Gfx[] = INCBIN_U32("graphics/tm_case/tm_case.4bpp.lz"); const u32 gTMCaseMenu_Tilemap[] = INCBIN_U32("graphics/tm_case/menu.bin.lz"); const u32 gTMCase_Tilemap[] = INCBIN_U32("graphics/tm_case/tm_case.bin.lz"); const u32 gTMCaseMenu_Male_Pal[] = INCBIN_U32("graphics/tm_case/menu_male.gbapal.lz"); const u32 gTMCaseMenu_Female_Pal[] = INCBIN_U32("graphics/tm_case/menu_female.gbapal.lz"); const u32 gTMCaseDisc_Gfx[] = INCBIN_U32("graphics/tm_case/disc.4bpp.lz"); const u32 gTMCaseDiscTypes1_Pal[] = INCBIN_U32("graphics/tm_case/disc_types_1.gbapal.lz"); const u32 gTMCaseDiscTypes2_Pal[] = INCBIN_U32("graphics/tm_case/disc_types_2.gbapal.lz"); const u8 gItemPcTiles[] = INCBIN_U8("graphics/item_pc/bg.4bpp.lz"); const u32 gItemPcBgPals[] = INCBIN_U32("graphics/item_pc/bg.gbapal.lz"); const u8 gItemPcTilemap[] = INCBIN_U8("graphics/item_pc/bg.bin.lz"); const u32 gBerryPouchSpriteTiles[] = INCBIN_U32("graphics/berry_pouch/berry_pouch.4bpp.lz"); const u8 gBerryPouchBgGfx[] = INCBIN_U8("graphics/berry_pouch/background.4bpp.lz"); const u32 gBerryPouchBgPals[] = INCBIN_U32("graphics/berry_pouch/background.gbapal.lz"); const u32 gBerryPouchBgPal0FemaleOverride[] = INCBIN_U32("graphics/berry_pouch/background_female.gbapal.lz"); const u32 gBerryPouchSpritePalette[] = INCBIN_U32("graphics/berry_pouch/berry_pouch.gbapal.lz"); const u8 gBerryPouchBg1Tilemap[] = INCBIN_U8("graphics/berry_pouch/background.bin.lz"); const u32 gBuyMenuFrame_Gfx[] = INCBIN_U32("graphics/shop_menu/shop_menu.4bpp.lz"); const u32 gBuyMenuFrame_Tilemap[] = INCBIN_U32("graphics/shop_menu/shop_tilemap.bin.lz"); const u32 gBuyMenuFrame_TmHmTilemap[] = INCBIN_U32("graphics/shop_menu/shop_tm_hm_tilemap.bin.lz"); const u32 gBuyMenuFrame_Pal[] = INCBIN_U32("graphics/shop_menu/shop_menu.gbapal.lz"); const u8 gTeachyTv_Border_Gfx[] = INCBIN_U8("graphics/teachy_tv/border.4bpp.lz"); // Unused const u8 gTeachyTv_Gfx[] = INCBIN_U8("graphics/teachy_tv/tiles.4bpp.lz"); const u8 gTeachyTvScreen_Tilemap[] = INCBIN_U8("graphics/teachy_tv/screen.bin.lz"); const u8 gTeachyTvTitle_Tilemap[] = INCBIN_U8("graphics/teachy_tv/title.bin.lz"); const u32 gTeachyTv_Pal[] = INCBIN_U32("graphics/teachy_tv/tiles.gbapal.lz"); const u32 gUnusedGrayPalette[] = INCBIN_U32("graphics/unused/gray_palette.gbapal.lz"); #include "data/graphics/items.h" const u32 gBattleAnimSpritePal_Shock3[] = INCBIN_U32("graphics/battle_anims/sprites/shock_3.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Shock3[] = INCBIN_U32("graphics/battle_anims/sprites/shock_3.4bpp.lz"); const u32 gBattleAnimSpritePal_WhiteFeather[] = INCBIN_U32("graphics/battle_anims/sprites/white_feather.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WhiteFeather[] = INCBIN_U32("graphics/battle_anims/sprites/white_feather.4bpp.lz"); const u32 gBattleAnimSpritePal_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.4bpp.lz"); const u32 gGhostPalette[] = INCBIN_U32("graphics/pokemon/ghost/front.gbapal.lz"); const u32 gGhostFrontPic[] = INCBIN_U32("graphics/pokemon/ghost/front.4bpp.lz"); #include "data/graphics/mail.h" const u16 gMenuInfoElements1_Pal[] = INCBIN_U16("graphics/interface/dex_caught_pokeball.gbapal"); const u16 gMenuInfoElements2_Pal[] = INCBIN_U16("graphics/interface/pokemon_types.gbapal"); const u8 gMenuInfoElements_Gfx[] = INCBIN_U8("graphics/interface/menu_info.4bpp"); const u16 gMoveRelearner_Pal[] = INCBIN_U16("graphics/interface/learn_move.gbapal"); const u32 gMoveRelearner_Gfx[] = INCBIN_U32("graphics/interface/learn_move.4bpp.lz"); const u32 gMoveRelearner_Tilemap[] = INCBIN_U32("graphics/interface/learn_move.bin.lz"); const u16 gNamingScreenKeyboard_Pal[] = INCBIN_U16("graphics/naming_screen/keyboard.gbapal"); const u16 gNamingScreenRival_Pal[] = INCBIN_U16("graphics/naming_screen/rival.gbapal"); const u16 gNamingScreenMenu_Pal[6][16] = { INCBIN_U16("graphics/naming_screen/menu.gbapal"), INCBIN_U16("graphics/naming_screen/page_swap_upper.gbapal"), INCBIN_U16("graphics/naming_screen/page_swap_lower.gbapal"), INCBIN_U16("graphics/naming_screen/page_swap_others.gbapal"), INCBIN_U16("graphics/naming_screen/buttons.gbapal"), INCBIN_U16("graphics/naming_screen/cursor.gbapal"), }; const u32 gNamingScreenMenu_Gfx[] = INCBIN_U32("graphics/naming_screen/menu.4bpp.lz"); const u32 gNamingScreenBackground_Tilemap[] = INCBIN_U32("graphics/naming_screen/background.bin.lz"); const u32 gNamingScreenKeyboardUpper_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_upper.bin.lz"); const u32 gNamingScreenKeyboardLower_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_lower.bin.lz"); const u32 gNamingScreenKeyboardSymbols_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_symbols.bin.lz"); const u32 gNamingScreenPageSwapFrame_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_frame.4bpp"); const u32 gNamingScreenBackButton_Gfx[] = INCBIN_U32("graphics/naming_screen/back_button.4bpp"); const u32 gNamingScreenOKButton_Gfx[] = INCBIN_U32("graphics/naming_screen/ok_button.4bpp"); const u32 gNamingScreenPageSwapUpper_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_upper.4bpp"); const u32 gNamingScreenPageSwapLower_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_lower.4bpp"); const u32 gNamingScreenPageSwapOthers_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_others.4bpp"); const u32 gNamingScreenCursor_Gfx[] = INCBIN_U32("graphics/naming_screen/cursor.4bpp"); const u32 gNamingScreenCursorSquished_Gfx[] = INCBIN_U32("graphics/naming_screen/cursor_squished.4bpp"); const u32 gNamingScreenCursorFilled_Gfx[] = INCBIN_U32("graphics/naming_screen/cursor_filled.4bpp"); const u32 gNamingScreenPageSwapButton_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_button.4bpp"); const u32 gNamingScreenInputArrow_Gfx[] = INCBIN_U32("graphics/naming_screen/input_arrow.4bpp"); const u32 gNamingScreenUnderscore_Gfx[] = INCBIN_U32("graphics/naming_screen/underscore.4bpp"); const u8 gTMCaseHM_Gfx[] = INCBIN_U8("graphics/tm_case/hm.4bpp"); const u16 gKantoTrainerCardBlue_Pal[] = INCBIN_U16("graphics/trainer_card/blue.gbapal"); const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/tiles.4bpp.lz"); const u16 gHoennTrainerCardGreen_Pal[] = INCBIN_U16("graphics/trainer_card/rse/green.gbapal"); const u32 gHoennTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/rse/tiles.4bpp.lz"); const u16 gEasyChatWindow_Pal[] = INCBIN_U16("graphics/easy_chat/window.gbapal"); const u32 gEasyChatWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/window.4bpp.lz"); const u32 gEasyChatWindow_Tilemap[] = INCBIN_U32("graphics/easy_chat/window.bin.lz"); const u16 gEasyChatButtonWindow_Pal[] = INCBIN_U16("graphics/easy_chat/button_window.gbapal"); const u32 gEasyChatButtonWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/button_window.4bpp.lz"); const u32 gEasyChatMode_Gfx[] = INCBIN_U32("graphics/easy_chat/mode.4bpp.lz"); const u32 gSummaryScreen_Bg_Gfx[] = INCBIN_U32("graphics/summary_screen/bg.4bpp.lz"); const u32 gSummaryScreen_Bg_Pal[] = INCBIN_U32("graphics/summary_screen/bg.gbapal"); const u32 gSummaryScreen_ExpBar_Gfx[] = INCBIN_U32("graphics/summary_screen/exp_bar.4bpp.lz"); const u32 gSummaryScreen_HpBar_Gfx[] = INCBIN_U32("graphics/summary_screen/hp_bar.4bpp.lz"); const u16 gSummaryScreen_HpExpBar_Pal[] = INCBIN_U16("graphics/summary_screen/exp_bar.gbapal"); // hp bar uses this too const u32 gSummaryScreen_PageInfo_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info.bin.lz"); const u32 gSummaryScreen_PageSkills_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_skills.bin.lz"); const u32 gSummaryScreen_PageMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_moves.bin.lz"); const u32 gSummaryScreen_PageMovesInfo_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_moves_info.bin.lz"); const u32 gSummaryScreen_PageEgg_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_egg.bin.lz"); const u16 gUnusedRedPalette[] = INCBIN_U16("graphics/unused/red_palette.gbapal"); const u32 gEasyChatRectangleCursor_Gfx[] = INCBIN_U32("graphics/easy_chat/rectangle_cursor.4bpp.lz"); const u16 gSummaryScreen_StatusAilmentIcon_Pal[] = INCBIN_U16("graphics/summary_screen/status_ailment_icons.gbapal"); const u32 gSummaryScreen_StatusAilmentIcon_Gfx[] = INCBIN_U32("graphics/summary_screen/status_ailment_icons.4bpp.lz"); const u16 gDexScreen_TopMenuIconPals_AtoZ[] = INCBIN_U16("graphics/pokedex/cat_icon_abc.gbapal"); const u32 gDexScreen_TopMenuIconTiles_AtoZ[] = INCBIN_U32("graphics/pokedex/cat_icon_abc.4bpp.lz"); const u16 gPokeStoragePartyMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/party_menu.gbapal"); const u16 gPokeStorageInterface_Pal[] = INCBIN_U16("graphics/pokemon_storage/interface.gbapal"); const u16 gPokeStorageInterface_NoDisplayMon_Pal[] = INCBIN_U16("graphics/pokemon_storage/interface_no_display_mon.gbapal"); const u32 gPokeStorageMenu_Gfx[] = INCBIN_U32("graphics/pokemon_storage/menu.4bpp.lz"); const u32 gPokeStoragePartyMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/party_menu.bin.lz"); const u16 gMonMarkingsMenu_Pal[] = INCBIN_U16("graphics/misc/markings2.gbapal"); const u16 gMonMarkingsMenu_Gfx[] = INCBIN_U16("graphics/misc/markings2.4bpp"); const u16 gTradeMenu_Pal[] = INCBIN_U16("graphics/trade/menu.gbapal"); const u16 gTradeCursor_Pal[] = INCBIN_U16("graphics/trade/cursor.gbapal"); const u16 gTradeMenu_Gfx[] = INCBIN_U16("graphics/trade/menu.4bpp"); const u16 gTradeCursor_Gfx[] = INCBIN_U16("graphics/trade/cursor.4bpp"); const u16 gTradeUnused_Tilemap[] = INCBIN_U16("graphics/trade/unused.bin"); const u16 gTradeMenu_Tilemap[] = INCBIN_U16("graphics/trade/menu.bin"); const u16 gTradeMenuMonBox_Tilemap[] = INCBIN_U16("graphics/trade/menu_mon_box.bin"); const u16 gFameCheckerBgPals[][16] = INCBIN_U16("graphics/fame_checker/bg.gbapal"); const u16 gFameCheckerBgTiles[] = INCBIN_U16("graphics/fame_checker/bg.4bpp"); const u16 gFameCheckerBg3Tilemap[] = INCBIN_U16("graphics/fame_checker/tilemap3.bin"); const u16 gFameCheckerBg2Tilemap[] = INCBIN_U16("graphics/fame_checker/tilemap2.bin"); const u16 gUnionRoomChat_Bg_Pal[] = INCBIN_U16("graphics/union_room_chat/bg.gbapal"); const u32 gUnionRoomChat_Bg_Gfx[] = INCBIN_U32("graphics/union_room_chat/bg.4bpp.lz"); const u32 gUnionRoomChat_Bg_Tilemap[] = INCBIN_U32("graphics/union_room_chat/bg.bin.lz"); const u32 gUnionRoomChat_Icons_Gfx[] = INCBIN_U32("graphics/union_room_chat/icons.4bpp.lz"); const u16 gTilesetPalettes_General[][16] = { INCBIN_U16("data/tilesets/primary/general/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/01.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/02.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/03.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/04.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/05.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/06.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/07.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/08.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/09.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/10.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/11.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/12.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/13.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/14.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/15.gbapal"), }; const u32 gTilesetTiles_General[] = INCBIN_U32("data/tilesets/primary/general/tiles.4bpp.lz"); const u8 gBerryFixGameboy_Pal[] = INCBIN_U8("graphics/berry_fix/gba_small.gbapal"); const u8 gBerryFixGameboy_Gfx[] = INCBIN_U8("graphics/berry_fix/gba_small.4bpp.lz"); const u8 gBerryFixGameboy_Tilemap[] = INCBIN_U8("graphics/berry_fix/gba_small.bin.lz"); const u8 gBerryFixGameboyLogo_Pal[] = INCBIN_U8("graphics/berry_fix/logo.gbapal"); const u8 gBerryFixGameboyLogo_Gfx[] = INCBIN_U8("graphics/berry_fix/logo.4bpp.lz"); const u8 gBerryFixGameboyLogo_Tilemap[] = INCBIN_U8("graphics/berry_fix/logo.bin.lz"); const u8 gBerryFixGbaTransfer_Pal[] = INCBIN_U8("graphics/berry_fix/gba_transfer.gbapal"); const u8 gBerryFixGbaTransfer_Gfx[] = INCBIN_U8("graphics/berry_fix/gba_transfer.4bpp.lz"); const u8 gBerryFixGbaTransfer_Tilemap[] = INCBIN_U8("graphics/berry_fix/gba_transfer.bin.lz"); const u8 gBerryFixGbaTransferHighlight_Pal[] = INCBIN_U8("graphics/berry_fix/gba_transfer_highlight.gbapal"); const u8 gBerryFixGbaTransferHighlight_Gfx[] = INCBIN_U8("graphics/berry_fix/gba_transfer_highlight.4bpp.lz"); const u8 gBerryFixGbaTransferHighlight_Tilemap[] = INCBIN_U8("graphics/berry_fix/gba_transfer_highlight.bin.lz"); const u8 gBerryFixGbaTransferError_Pal[] = INCBIN_U8("graphics/berry_fix/gba_transfer_error.gbapal"); const u8 gBerryFixGbaTransferError_Gfx[] = INCBIN_U8("graphics/berry_fix/gba_transfer_error.4bpp.lz"); const u8 gBerryFixGbaTransferError_Tilemap[] = INCBIN_U8("graphics/berry_fix/gba_transfer_error.bin.lz"); const u8 gBerryFixWindow_Pal[] = INCBIN_U8("graphics/berry_fix/window.gbapal"); const u8 gBerryFixWindow_Gfx[] = INCBIN_U8("graphics/berry_fix/window.4bpp.lz"); const u8 gBerryFixWindow_Tilemap[] = INCBIN_U8("graphics/berry_fix/window.bin.lz"); const u16 gTilesetPalettes_GenericBuilding1[][16] = { INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building_1/palettes/15.gbapal"), }; const u32 gTilesetTiles_GenericBuilding1[] = INCBIN_U32("data/tilesets/secondary/generic_building_1/tiles.4bpp.lz"); const u16 gTilesetPalettes_DepartmentStore[][16] = { INCBIN_U16("data/tilesets/secondary/department_store/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/01.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/02.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/03.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/04.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/05.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/06.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/07.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/08.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/09.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/10.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/11.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/12.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/13.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/14.gbapal"), INCBIN_U16("data/tilesets/secondary/department_store/palettes/15.gbapal"), }; const u32 gTilesetTiles_DepartmentStore[] = INCBIN_U32("data/tilesets/secondary/department_store/tiles.4bpp.lz"); const u16 gUnionRoomChat_Panel_Pal[] = INCBIN_U16("graphics/union_room_chat/panel.gbapal"); const u32 gUnionRoomChat_Panel_Gfx[] = INCBIN_U32("graphics/union_room_chat/panel.4bpp.lz"); const u32 gUnionRoomChat_Panel_Tilemap[] = INCBIN_U32("graphics/union_room_chat/panel.bin.lz"); const u16 gCreditsMonPokeball_Pals[][16] = { INCBIN_U16("graphics/credits/pokeball_charizard.gbapal"), INCBIN_U16("graphics/credits/pokeball_venusaur.gbapal"), INCBIN_U16("graphics/credits/pokeball_blastoise.gbapal"), INCBIN_U16("graphics/credits/pokeball_pikachu.gbapal"), }; const u32 gCreditsMonPokeball_Tiles[] = INCBIN_U32("graphics/credits/pokeball.4bpp.lz"); const u32 gCreditsMonPokeball_Tilemap[] = INCBIN_U32("graphics/credits/pokeball.bin.lz"); const u16 gGraphics_TitleScreen_GameTitleLogoPals_FR[] = INCBIN_U16("graphics/title_screen/firered/game_title_logo.gbapal"); const u8 gGraphics_TitleScreen_GameTitleLogoTiles_FR[] = INCBIN_U8("graphics/title_screen/firered/game_title_logo.8bpp.lz"); const u8 gGraphics_TitleScreen_GameTitleLogoMap_FR[] = INCBIN_U8("graphics/title_screen/firered/game_title_logo.bin.lz"); const u16 gGraphics_TitleScreen_BoxArtMonPals_FR[] = INCBIN_U16("graphics/title_screen/firered/box_art_mon.gbapal"); const u8 gGraphics_TitleScreen_BoxArtMonTiles_FR[] = INCBIN_U8("graphics/title_screen/firered/box_art_mon.4bpp.lz"); const u8 gGraphics_TitleScreen_BoxArtMonMap_FR[] = INCBIN_U8("graphics/title_screen/firered/box_art_mon.bin.lz"); const u16 gGraphics_TitleScreen_BackgroundPals_FR[] = INCBIN_U16("graphics/title_screen/firered/background.gbapal"); const u16 gTitleScreen_Slash_Pal_FR[] = INCBIN_U16("graphics/title_screen/firered/slash.gbapal"); const u16 gGraphics_TitleScreen_GameTitleLogoPals_LG[] = INCBIN_U16("graphics/title_screen/leafgreen/game_title_logo.gbapal"); const u8 gGraphics_TitleScreen_GameTitleLogoTiles_LG[] = INCBIN_U8("graphics/title_screen/leafgreen/game_title_logo.8bpp.lz"); const u8 gGraphics_TitleScreen_GameTitleLogoMap_LG[] = INCBIN_U8("graphics/title_screen/leafgreen/game_title_logo.bin.lz"); const u16 gGraphics_TitleScreen_BoxArtMonPals_LG[] = INCBIN_U16("graphics/title_screen/leafgreen/box_art_mon.gbapal"); const u8 gGraphics_TitleScreen_BoxArtMonTiles_LG[] = INCBIN_U8("graphics/title_screen/leafgreen/box_art_mon.4bpp.lz"); const u8 gGraphics_TitleScreen_BoxArtMonMap_LG[] = INCBIN_U8("graphics/title_screen/leafgreen/box_art_mon.bin.lz"); const u16 gGraphics_TitleScreen_BackgroundPals_LG[] = INCBIN_U16("graphics/title_screen/leafgreen/background.gbapal"); const u16 gTitleScreen_Slash_Pal_LG[] = INCBIN_U16("graphics/title_screen/leafgreen/slash.gbapal"); const u8 gGraphics_TitleScreen_CopyrightPressStartTiles[] = INCBIN_U8("graphics/title_screen/copyright_press_start.4bpp.lz"); const u8 gGraphics_TitleScreen_CopyrightPressStartMap[] = INCBIN_U8("graphics/title_screen/copyright_press_start.bin.lz"); const u32 gTitleScreen_BlankSprite_Tiles[] = INCBIN_U32("graphics/title_screen/blank_sprite.4bpp.lz"); const u16 gCreditsCopyright_Pal[] = INCBIN_U16("graphics/credits/copyright.gbapal"); const u8 gCreditsCopyright_Tiles[] = INCBIN_U8("graphics/credits/copyright.4bpp.lz"); const u8 gCreditsCopyright_Tilemap[] = INCBIN_U8("graphics/credits/copyright.bin.lz"); const u32 gTradeGba_Pal[] = INCBIN_U32("graphics/trade/gba.gbapal"); const u32 gTradeGba2_Pal[] = INCBIN_U32("graphics/trade/gba_pal2.gbapal"); const u32 gTradeGba_Gfx[] = INCBIN_U32("graphics/trade/gba.4bpp"); const u16 sEmptyPal[16] = {0}; const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/crusher.gbapal"); const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.lz"); const u32 gBerryCrush_TextWindows_Tilemap[] = INCBIN_U32("graphics/berry_crush/text_windows.bin.lz"); const u16 gCableCarBg_Pal[] = INCBIN_U16("graphics/cable_car/bg.gbapal"); const u16 gCableCar_Pal[] = INCBIN_U16("graphics/cable_car/cable_car.gbapal"); const u32 gCableCarBg_Gfx[] = INCBIN_U32("graphics/cable_car/bg.4bpp.lz"); const u32 gCableCar_Gfx[] = INCBIN_U32("graphics/cable_car/cable_car.4bpp.lz"); const u32 gCableCarDoor_Gfx[] = INCBIN_U32("graphics/cable_car/door.4bpp.lz"); const u32 gCableCarCable_Gfx[] = INCBIN_U32("graphics/cable_car/cable.4bpp.lz"); ================================================ FILE: src/hall_of_fame.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "scanline_effect.h" #include "task.h" #include "save.h" #include "data.h" #include "m4a.h" #include "help_system.h" #include "hall_of_fame.h" #include "quest_log.h" #include "pc_screen_effect.h" #include "new_menu_helpers.h" #include "strings.h" #include "credits.h" #include "event_data.h" #include "overworld.h" #include "trainer_pokemon_sprites.h" #include "text_window.h" #include "field_fadetransition.h" #include "menu.h" #include "string_util.h" #include "trig.h" #include "random.h" #include "graphics.h" #include "constants/songs.h" #include "constants/maps.h" #define HALL_OF_FAME_MAX_TEAMS 50 #define HALL_OF_FAME_BG_PAL RGB(22, 24, 29) struct HallofFameMon { u32 tid; u32 personality; u16 species:9; u16 lvl:7; u8 nick[POKEMON_NAME_LENGTH]; }; struct HallofFameTeam { struct HallofFameMon mon[PARTY_SIZE]; }; STATIC_ASSERT(sizeof(struct HallofFameTeam) * HALL_OF_FAME_MAX_TEAMS <= SECTOR_DATA_SIZE * NUM_HOF_SECTORS, HallOfFameFreeSpace); struct HofGfx { u16 state; u8 field_2[4]; u8 tilemap1[0x1000]; u8 tilemap2[0x1000]; }; static EWRAM_DATA u32 sSelectedPaletteIndices = 0; static EWRAM_DATA struct HallofFameTeam * sHofMonPtr = NULL; static EWRAM_DATA struct HofGfx * sHofGfxPtr = NULL; static void Task_Hof_InitMonData(u8 taskId); static void Task_Hof_InitTeamSaveData(u8 taskId); static void Task_Hof_TrySaveData(u8 taskId); static void Task_Hof_DelayAfterSave(u8 taskId); static void Task_Hof_StartDisplayingMons(u8 taskId); static void Task_Hof_DisplayMon(u8 taskId); static void Task_Hof_PlayMonCryAndPrintInfo(u8 taskId); static void Task_Hof_TryDisplayAnotherMon(u8 taskId); static void Task_Hof_PaletteFadeAndPrintWelcomeText(u8 taskId); static void Task_Hof_ApplauseAndConfetti(u8 taskId); static void Task_Hof_WaitBorderFadeAway(u8 taskId); static void Task_Hof_SpawnPlayerPic(u8 taskId); static void Task_Hof_WaitAndPrintPlayerInfo(u8 taskId); static void Task_Hof_ExitOnKeyPressed(u8 taskId); static void Task_Hof_HandlePaletteOnExit(u8 taskId); static void Task_Hof_HandleExit(u8 taskId); static void SetWarpsToRollCredits(void); static void Task_HofPC_CopySaveData(u8 taskId); static void Task_HofPC_DrawSpritesPrintText(u8 taskId); static void Task_HofPC_PrintMonInfo(u8 taskId); static void Task_HofPC_HandleInput(u8 taskId); static void Task_HofPC_HandlePaletteOnExit(u8 taskId); static void Task_HofPC_HandleExit(u8 taskId); static void Task_HofPC_PrintDataIsCorrupted(u8 taskId); static void Task_HofPC_ExitOnButtonPress(u8 taskId); static void HallOfFame_PrintWelcomeText(u8 a0, u8 a1); static void HallOfFame_PrintMonInfo(struct HallofFameMon * hofMon, u8 a1, u8 a2); static void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1); static void ClearVramOamPltt_LoadHofPal(void); static void HofInit_ResetGpuBuffersAndLoadConfettiGfx(void); static void Hof_InitBgs(void); static bool8 DrawHofBackground(void); static void SpriteCB_GetOnScreen(struct Sprite *sprite); static void SpriteCB_Confetti(struct Sprite *sprite); static bool8 Hof_SpawnConfetti(void); static const struct BgTemplate sHof_BgTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 } }; static const struct WindowTemplate sWindowTemplate = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 2, .width = 17, .height = 6, .paletteNum = 13, .baseBlock = 0x001 }; static const u8 sTextColors[][4] = { { 0, 1, 2 }, { 0, 2, 3 }, { 4, 5, 0 } }; static const struct CompressedSpriteSheet sHallOfFame_ConfettiSpriteSheet[] = { {gFile_graphics_misc_confetti_sheet, 0x220, 1001}, {} }; static const struct CompressedSpritePalette sHallOfFame_ConfettiSpritePalette[] = { {gFile_graphics_misc_confetti_palette, 1001}, {} }; static const s16 sHallOfFame_MonFullTeamPositions[6][4] = { {120, 210, 120, 40}, {326, 220, 56, 40}, {-86, 220, 184, 40}, {120, -62, 120, 88}, {-70, -92, 200, 88}, {310, -92, 40, 88} }; static const s16 sHallOfFame_MonHalfTeamPositions[3][4] = { {120, 234, 120, 64}, {326, 244, 56, 64}, {-86, 244, 184, 64} }; static const struct OamData sOamData_Confetti = { .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8) }; static const union AnimCmd sAnimCmd_Frame00[] = { ANIMCMD_FRAME( 0, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame01[] = { ANIMCMD_FRAME( 1, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame02[] = { ANIMCMD_FRAME( 2, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame03[] = { ANIMCMD_FRAME( 3, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame04[] = { ANIMCMD_FRAME( 4, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame05[] = { ANIMCMD_FRAME( 5, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame06[] = { ANIMCMD_FRAME( 6, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame07[] = { ANIMCMD_FRAME( 7, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame08[] = { ANIMCMD_FRAME( 8, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame09[] = { ANIMCMD_FRAME( 9, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame10[] = { ANIMCMD_FRAME(10, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame11[] = { ANIMCMD_FRAME(11, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame12[] = { ANIMCMD_FRAME(12, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame13[] = { ANIMCMD_FRAME(13, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame14[] = { ANIMCMD_FRAME(14, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame15[] = { ANIMCMD_FRAME(15, 30), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Frame16[] = { ANIMCMD_FRAME(16, 30), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_Confetti[] = { sAnimCmd_Frame00, sAnimCmd_Frame01, sAnimCmd_Frame02, sAnimCmd_Frame03, sAnimCmd_Frame04, sAnimCmd_Frame05, sAnimCmd_Frame06, sAnimCmd_Frame07, sAnimCmd_Frame08, sAnimCmd_Frame09, sAnimCmd_Frame10, sAnimCmd_Frame11, sAnimCmd_Frame12, sAnimCmd_Frame13, sAnimCmd_Frame14, sAnimCmd_Frame15, sAnimCmd_Frame16 }; static const struct SpriteTemplate sSpriteTemplate_Confetti = { .tileTag = 1001, .paletteTag = 1001, .oam = &sOamData_Confetti, .anims = sSpriteAnimTable_Confetti, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Confetti }; static const u16 sHallOfFame_Pal[] = INCBIN_U16("graphics/hall_of_fame/hall_of_fame.gbapal"); static const u32 sHallOfFame_Gfx[] = INCBIN_U32("graphics/hall_of_fame/hall_of_fame.4bpp.lz"); static const struct HallofFameMon sDummyHofMon = { .tid = 0x03EA03EA, // (u16[]){1002, 1002} corrupted sprite template? .personality = 0, .species = SPECIES_NONE, .lvl = 0, .nick = __(" ") }; static const u8 sUnused[] = {2, 1, 3, 6, 4, 5}; static void VBlankCB_HofIdle(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB2_HofIdle(void) { RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static bool8 InitHallOfFameScreen(void) { switch (gMain.state) { case 0: gHelpSystemEnabled = FALSE; SetVBlankCallback(NULL); ClearVramOamPltt_LoadHofPal(); sHofGfxPtr = AllocZeroed(sizeof(struct HofGfx)); gMain.state = 1; break; case 1: HofInit_ResetGpuBuffersAndLoadConfettiGfx(); gMain.state++; break; case 2: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 7)); SetGpuReg(REG_OFFSET_BLDY, 0); Hof_InitBgs(); sHofGfxPtr->state = 0; gMain.state++; break; case 3: if (!DrawHofBackground()) { SetVBlankCallback(VBlankCB_HofIdle); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; } break; case 4: UpdatePaletteFade(); if (!gPaletteFade.active) { SetMainCallback2(CB2_HofIdle); PlayBGM(MUS_HALL_OF_FAME); return FALSE; } break; } return TRUE; } void CB2_DoHallOfFameScreen(void) { u8 taskId; if (!InitHallOfFameScreen()) { taskId = CreateTask(Task_Hof_InitMonData, 0); gTasks[taskId].data[0] = FALSE; sHofMonPtr = AllocZeroed(sizeof(struct HallofFameTeam)); } } void CB2_DoHallOfFameScreenDontSaveData(void) { u8 taskId; if (!InitHallOfFameScreen()) { taskId = CreateTask(Task_Hof_InitMonData, 0); gTasks[taskId].data[0] = TRUE; } } static void Task_Hof_InitMonData(u8 taskId) { u32 i; u32 j; u8 nick[11]; gTasks[taskId].data[2] = 0; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE) { sHofMonPtr[0].mon[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); sHofMonPtr[0].mon[i].tid = GetMonData(&gPlayerParty[i], MON_DATA_OT_ID); sHofMonPtr[0].mon[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); if(sHofMonPtr[0].mon[i].species == SPECIES_DEOXYS) { switch(GetMonData(&gPlayerParty[i], MON_DATA_FORME)) { case 1: //Attack Forme sHofMonPtr[0].mon[i].personality = 65531; break; case 2: //Defense Forme sHofMonPtr[0].mon[i].personality = 65532; break; case 3: //Speed Forme sHofMonPtr[0].mon[i].personality = 65533; break; default: //Normal Forme sHofMonPtr[0].mon[i].personality = 65530; break; } } sHofMonPtr[0].mon[i].lvl = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nick); for (j = 0; j < 10; j++) sHofMonPtr[0].mon[i].nick[j] = nick[j]; gTasks[taskId].data[2]++; } else { sHofMonPtr[0].mon[i].species = SPECIES_NONE; sHofMonPtr[0].mon[i].tid = 0; sHofMonPtr[0].mon[i].personality = 0; sHofMonPtr[0].mon[i].lvl = 0; sHofMonPtr[0].mon[i].nick[0] = EOS; } } sSelectedPaletteIndices = 0; gTasks[taskId].data[1] = 0; gTasks[taskId].data[4] = 0xFF; for (i = 0; i < 6; i++) gTasks[taskId].data[i + 5] = 0xFF; if (gTasks[taskId].data[0]) gTasks[taskId].func = Task_Hof_StartDisplayingMons; else gTasks[taskId].func = Task_Hof_InitTeamSaveData; } static void Task_Hof_InitTeamSaveData(u8 taskId) { u32 i; struct HallofFameTeam* lastSavedTeam = (struct HallofFameTeam *)(gDecompressionBuffer); SaveQuestLogData(); if (!gHasHallOfFameRecords) { memset(gDecompressionBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS); } else { if (LoadGameSave(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK) memset(gDecompressionBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS); } for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, lastSavedTeam++) { if (lastSavedTeam[0].mon[0].species == SPECIES_NONE) break; } if (i >= HALL_OF_FAME_MAX_TEAMS) { struct HallofFameTeam *afterTeam = (struct HallofFameTeam *)(gDecompressionBuffer); struct HallofFameTeam *beforeTeam = (struct HallofFameTeam *)(gDecompressionBuffer); afterTeam++; for (i = 0; i < HALL_OF_FAME_MAX_TEAMS - 1; i++, beforeTeam++, afterTeam++) { *beforeTeam = *afterTeam; } lastSavedTeam--; } *lastSavedTeam = *sHofMonPtr; DrawDialogueFrame(0, 0); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_SavingDontTurnOffThePower2, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(0, COPYWIN_FULL); gTasks[taskId].func = Task_Hof_TrySaveData; } static void Task_Hof_TrySaveData(u8 taskId) { gGameContinueCallback = CB2_DoHallOfFameScreenDontSaveData; TrySavingData(SAVE_HALL_OF_FAME); PlaySE(SE_SAVE); gTasks[taskId].func = Task_Hof_DelayAfterSave; gTasks[taskId].data[3] = 32; } static void Task_Hof_DelayAfterSave(u8 taskId) { if (gTasks[taskId].data[3] != 0) gTasks[taskId].data[3]--; else gTasks[taskId].func = Task_Hof_StartDisplayingMons; } static void Task_Hof_StartDisplayingMons(u8 taskId) { gTasks[taskId].func = Task_Hof_DisplayMon; } static void Task_Hof_DisplayMon(u8 taskId) { u8 spriteId; s16 srcX; s16 srcY; s16 dstX; s16 dstY; u16 currMonId = gTasks[taskId].data[1]; struct HallofFameMon* currMon = &sHofMonPtr[0].mon[currMonId]; if (gTasks[taskId].data[2] > 3) { srcX = sHallOfFame_MonFullTeamPositions[currMonId][0]; srcY = sHallOfFame_MonFullTeamPositions[currMonId][1]; dstX = sHallOfFame_MonFullTeamPositions[currMonId][2]; dstY = sHallOfFame_MonFullTeamPositions[currMonId][3]; } else { srcX = sHallOfFame_MonHalfTeamPositions[currMonId][0]; srcY = sHallOfFame_MonHalfTeamPositions[currMonId][1]; dstX = sHallOfFame_MonHalfTeamPositions[currMonId][2]; dstY = sHallOfFame_MonHalfTeamPositions[currMonId][3]; } if(currMon->species == SPECIES_DEOXYS) spriteId = CreateMonPicSprite_HandleDeoxys(currMon->personality, currMon->tid, currMon->personality, 1, srcX, srcY, currMonId, 0xFFFF); else spriteId = CreateMonPicSprite_HandleDeoxys(currMon->species, currMon->tid, currMon->personality, 1, srcX, srcY, currMonId, 0xFFFF); gSprites[spriteId].data[1] = dstX; gSprites[spriteId].data[2] = dstY; gSprites[spriteId].data[0] = 0; gSprites[spriteId].callback = SpriteCB_GetOnScreen; gTasks[taskId].data[5 + currMonId] = spriteId; ClearDialogWindowAndFrame(0, TRUE); gTasks[taskId].func = Task_Hof_PlayMonCryAndPrintInfo; } static void Task_Hof_PlayMonCryAndPrintInfo(u8 taskId) { u16 currMonId = gTasks[taskId].data[1]; struct HallofFameMon* currMon = &sHofMonPtr[0].mon[currMonId]; if (gSprites[gTasks[taskId].data[5 + currMonId]].data[0]) { if (currMon->species != SPECIES_EGG) PlayCry_Normal(currMon->species, 0); HallOfFame_PrintMonInfo(currMon, 0, 14); gTasks[taskId].data[3] = 120; gTasks[taskId].func = Task_Hof_TryDisplayAnotherMon; } } static void Task_Hof_TryDisplayAnotherMon(u8 taskId) { u16 currPokeId = gTasks[taskId].data[1]; struct HallofFameMon* currMon = &sHofMonPtr[0].mon[currPokeId]; if (gTasks[taskId].data[3] != 0) { gTasks[taskId].data[3]--; } else { sSelectedPaletteIndices |= (0x10000 << gSprites[gTasks[taskId].data[5 + currPokeId]].oam.paletteNum); if (gTasks[taskId].data[1] < PARTY_SIZE - 1 && currMon[1].species != SPECIES_NONE) // there is another pokemon to display { gTasks[taskId].data[1]++; BeginNormalPaletteFade(sSelectedPaletteIndices, 0, 12, 12, HALL_OF_FAME_BG_PAL); gSprites[gTasks[taskId].data[5 + currPokeId]].oam.priority = 1; gTasks[taskId].func = Task_Hof_DisplayMon; } else { gTasks[taskId].func = Task_Hof_PaletteFadeAndPrintWelcomeText; } } } static void Task_Hof_PaletteFadeAndPrintWelcomeText(u8 taskId) { u32 i; BeginNormalPaletteFade(PALETTES_OBJECTS, 0, 0, 0, RGB_BLACK); for (i = 0; i < PARTY_SIZE; i++) { if (gTasks[taskId].data[5 + i] != 0xFF) gSprites[gTasks[taskId].data[5 + i]].oam.priority = 0; } HallOfFame_PrintWelcomeText(0, 15); PlaySE(SE_APPLAUSE); gTasks[taskId].data[3] = 400; gTasks[taskId].func = Task_Hof_ApplauseAndConfetti; } static void Task_Hof_ApplauseAndConfetti(u8 taskId) { if (gTasks[taskId].data[3] != 0) { gTasks[taskId].data[3]--; if ((gTasks[taskId].data[3] & 3) == 0 && gTasks[taskId].data[3] > 110) Hof_SpawnConfetti(); } else { u32 i; for (i = 0; i < PARTY_SIZE; i++) { if (gTasks[taskId].data[5 + i] != 0xFF) gSprites[gTasks[taskId].data[5 + i]].oam.priority = 1; } BeginNormalPaletteFade(sSelectedPaletteIndices, 0, 12, 12, HALL_OF_FAME_BG_PAL); FillWindowPixelBuffer(0, PIXEL_FILL(0)); CopyWindowToVram(0, COPYWIN_FULL); gTasks[taskId].data[3] = 7; gTasks[taskId].func = Task_Hof_WaitBorderFadeAway; } } static void Task_Hof_WaitBorderFadeAway(u8 taskId) { if (gTasks[taskId].data[3] > 15) { gTasks[taskId].func = Task_Hof_SpawnPlayerPic; } else { gTasks[taskId].data[3]++; SetGpuReg(REG_OFFSET_BLDALPHA, 256 * gTasks[taskId].data[3]); } } static void Task_Hof_SpawnPlayerPic(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); ShowBg(1); ShowBg(3); gTasks[taskId].data[4] = CreateTrainerPicSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender, TRUE), TRUE, 0x78, 0x48, 6, 0xFFFF); AddWindow(&sWindowTemplate); LoadStdWindowGfx(1, 0x21D, BG_PLTT_ID(13)); gTasks[taskId].data[3] = 120; gTasks[taskId].func = Task_Hof_WaitAndPrintPlayerInfo; } static void Task_Hof_WaitAndPrintPlayerInfo(u8 taskId) { if (gTasks[taskId].data[3] != 0) { gTasks[taskId].data[3]--; } else if (gSprites[gTasks[taskId].data[4]].x != 192) { gSprites[gTasks[taskId].data[4]].x++; } else { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); HallOfFame_PrintPlayerInfo(1, 2); DrawDialogueFrame(0, 0); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_LeagueChamp, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(0, COPYWIN_FULL); gTasks[taskId].func = Task_Hof_ExitOnKeyPressed; } } static void Task_Hof_ExitOnKeyPressed(u8 taskId) { if (JOY_NEW(A_BUTTON)) { FadeOutBGM(4); gTasks[taskId].func = Task_Hof_HandlePaletteOnExit; } } static void Task_Hof_HandlePaletteOnExit(u8 taskId) { CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(PALETTES_ALL, 8, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_Hof_HandleExit; } static void Task_Hof_HandleExit(u8 taskId) { if (!gPaletteFade.active) { s32 i; for (i = 0; i < PARTY_SIZE; i++) { u8 spriteId = gTasks[taskId].data[5 + i]; if (spriteId != 0xFF) { FreeAndDestroyMonPicSprite(spriteId); } } FreeAndDestroyTrainerPicSprite(gTasks[taskId].data[4]); HideBg(0); HideBg(1); HideBg(3); FreeAllWindowBuffers(); UnsetBgTilemapBuffer(1); UnsetBgTilemapBuffer(3); ResetBgsAndClearDma3BusyFlags(0); DestroyTask(taskId); if (sHofGfxPtr != NULL) FREE_AND_SET_NULL(sHofGfxPtr); if (sHofMonPtr != NULL) FREE_AND_SET_NULL(sHofMonPtr); SetWarpsToRollCredits(); } } static void SetWarpsToRollCredits(void) { VarSet(VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR, 1); FlagSet(FLAG_DONT_SHOW_MAP_NAME_POPUP); gDisableMapMusicChangeOnMapLoad = 2; SetWarpDestination(MAP_GROUP(INDIGO_PLATEAU_EXTERIOR), MAP_NUM(INDIGO_PLATEAU_EXTERIOR), -1, 11, 6); DoWarp(); ResetInitialPlayerAvatarState(); } void CB2_InitHofPC(void) { switch (gMain.state) { default: case 0: SetVBlankCallback(NULL); ClearVramOamPltt_LoadHofPal(); sHofGfxPtr = AllocZeroed(sizeof(struct HofGfx)); gMain.state = 1; break; case 1: HofInit_ResetGpuBuffersAndLoadConfettiGfx(); gMain.state++; break; case 2: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); Hof_InitBgs(); gMain.state++; break; case 3: if (!DrawHofBackground()) { BeginPCScreenEffect_TurnOn(0, 0, 0); SetVBlankCallback(VBlankCB_HofIdle); gMain.state++; } break; case 4: RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); if (!IsPCScreenEffectRunning_TurnOn()) gMain.state++; break; case 5: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 7)); SetGpuReg(REG_OFFSET_BLDY, 0); CreateTask(Task_HofPC_CopySaveData, 0); sHofMonPtr = AllocZeroed(SECTOR_SIZE * NUM_HOF_SECTORS); SetMainCallback2(CB2_HofIdle); break; } } static void Task_HofPC_CopySaveData(u8 taskId) { u32 i; struct HallofFameTeam* savedTeams; CreateTopBarWindowLoadPalette(0, 30, 0, 0x0C, 0x226); if (LoadGameSave(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK) { gTasks[taskId].func = Task_HofPC_PrintDataIsCorrupted; } else { CpuCopy16(gDecompressionBuffer, sHofMonPtr, SECTOR_SIZE * NUM_HOF_SECTORS); savedTeams = sHofMonPtr; for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, savedTeams++) { if (savedTeams->mon[0].species == SPECIES_NONE) break; } if (i < HALL_OF_FAME_MAX_TEAMS) gTasks[taskId].data[0] = i - 1; else gTasks[taskId].data[0] = HALL_OF_FAME_MAX_TEAMS - 1; gTasks[taskId].data[1] = GetGameStat(GAME_STAT_ENTERED_HOF); gTasks[taskId].func = Task_HofPC_DrawSpritesPrintText; } } static void Task_HofPC_DrawSpritesPrintText(u8 taskId) { struct HallofFameTeam *savedTeams = sHofMonPtr; struct HallofFameMon *currMon; u32 i; for (i = 0; i < gTasks[taskId].data[0]; i++) savedTeams++; currMon = &savedTeams->mon[0]; sSelectedPaletteIndices = 0; gTasks[taskId].data[2] = 0; gTasks[taskId].data[4] = 0; for (i = 0; i < PARTY_SIZE; i++, currMon++) { if (currMon->species != SPECIES_NONE) gTasks[taskId].data[4]++; } currMon = &savedTeams->mon[0]; for (i = 0; i < PARTY_SIZE; i++, currMon++) { if (currMon->species != SPECIES_NONE) { u16 spriteId; s16 posX, posY; if (gTasks[taskId].data[4] > 3) { posX = sHallOfFame_MonFullTeamPositions[i][2]; posY = sHallOfFame_MonFullTeamPositions[i][3]; } else { posX = sHallOfFame_MonHalfTeamPositions[i][2]; posY = sHallOfFame_MonHalfTeamPositions[i][3]; } if(currMon->species == SPECIES_DEOXYS && (currMon->personality >= 65530 && currMon->personality <= 655333)) spriteId = CreateMonPicSprite_HandleDeoxys(currMon->personality, currMon->tid, currMon->personality, TRUE, posX, posY, i, 0xFFFF); else spriteId = CreateMonPicSprite_HandleDeoxys(currMon->species, currMon->tid, currMon->personality, TRUE, posX, posY, i, 0xFFFF); gSprites[spriteId].oam.priority = 1; gTasks[taskId].data[5 + i] = spriteId; } else { gTasks[taskId].data[5 + i] = 0xFF; } } BlendPalettes(0xFFFF0000, 0xC, HALL_OF_FAME_BG_PAL); ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_HOFNumber); if (gTasks[taskId].data[0] <= 0) TopBarWindowPrintTwoStrings(gStringVar4, gText_UPDOWNPick_ABUTTONBBUTTONCancel, 0, 0, TRUE); else TopBarWindowPrintTwoStrings(gStringVar4, gText_UPDOWNPick_ABUTTONNext_BBUTTONBack, 0, 0, TRUE); gTasks[taskId].func = Task_HofPC_PrintMonInfo; } static void Task_HofPC_PrintMonInfo(u8 taskId) { struct HallofFameTeam* savedTeams = sHofMonPtr; struct HallofFameMon* currMon; u32 i; u16 currMonId; for (i = 0; i < gTasks[taskId].data[0]; i++) savedTeams++; for (i = 0; i < PARTY_SIZE; i++) { u16 spriteId = gTasks[taskId].data[5 + i]; if (spriteId != 0xFF) gSprites[spriteId].oam.priority = 1; } currMonId = gTasks[taskId].data[5 + gTasks[taskId].data[2]]; gSprites[currMonId].oam.priority = 0; sSelectedPaletteIndices = (0x10000 << gSprites[currMonId].oam.paletteNum) ^ 0xFFFF0000; BlendPalettesUnfaded(sSelectedPaletteIndices, 0xC, HALL_OF_FAME_BG_PAL); currMon = &savedTeams->mon[gTasks[taskId].data[2]]; if (currMon->species != SPECIES_EGG) { StopCryAndClearCrySongs(); PlayCry_Normal(currMon->species, 0); } HallOfFame_PrintMonInfo(currMon, 0, 14); gTasks[taskId].func = Task_HofPC_HandleInput; } static void Task_HofPC_HandleInput(u8 taskId) { u32 i; if (JOY_NEW(A_BUTTON)) { if (gTasks[taskId].data[0] != 0) // prepare another team to view { gTasks[taskId].data[0]--; for (i = 0; i < 6; i++) { u8 spriteId = gTasks[taskId].data[5 + i]; if (spriteId != 0xFF) { FreeAndDestroyMonPicSprite(spriteId); } } if (gTasks[taskId].data[1] != 0) gTasks[taskId].data[1]--; gTasks[taskId].func = Task_HofPC_DrawSpritesPrintText; } else // no more teams to view, turn off hall of fame PC { if (IsCryPlayingOrClearCrySongs()) { StopCryAndClearCrySongs(); m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); } gTasks[taskId].func = Task_HofPC_HandlePaletteOnExit; } } else if (JOY_NEW(B_BUTTON)) // turn off hall of fame PC { if (IsCryPlayingOrClearCrySongs()) { StopCryAndClearCrySongs(); m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); } gTasks[taskId].func = Task_HofPC_HandlePaletteOnExit; } else if (JOY_NEW(DPAD_UP) && gTasks[taskId].data[2] != 0) // change mon -1 { gTasks[taskId].data[2]--; gTasks[taskId].func = Task_HofPC_PrintMonInfo; } else if (JOY_NEW(DPAD_DOWN) && gTasks[taskId].data[2] < gTasks[taskId].data[4] - 1) // change mon +1 { gTasks[taskId].data[2]++; gTasks[taskId].func = Task_HofPC_PrintMonInfo; } } static void Task_HofPC_HandlePaletteOnExit(u8 taskId) { struct HallofFameTeam* fameTeam; CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginPCScreenEffect_TurnOff(0, 0, 0); gTasks[taskId].func = Task_HofPC_HandleExit; } static void Task_HofPC_HandleExit(u8 taskId) { if (!IsPCScreenEffectRunning_TurnOff()) { HideBg(0); HideBg(1); HideBg(3); DestroyTopBarWindow(); FreeAllWindowBuffers(); UnsetBgTilemapBuffer(1); UnsetBgTilemapBuffer(3); ResetBgsAndClearDma3BusyFlags(FALSE); DestroyTask(taskId); if (sHofGfxPtr != NULL) FREE_AND_SET_NULL(sHofGfxPtr); if (sHofMonPtr != NULL) FREE_AND_SET_NULL(sHofMonPtr); ReturnFromHallOfFamePC(); } } static void Task_HofPC_PrintDataIsCorrupted(u8 taskId) { TopBarWindowPrintString(gText_ABUTTONExit, 8, TRUE); DrawDialogueFrame(0, 0); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_HOFCorrupted, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(0, COPYWIN_FULL); gTasks[taskId].func = Task_HofPC_ExitOnButtonPress; } static void Task_HofPC_ExitOnButtonPress(u8 taskId) { if (JOY_NEW(A_BUTTON)) gTasks[taskId].func = Task_HofPC_HandlePaletteOnExit; } static void HallOfFame_PrintWelcomeText(u8 not, u8 used) { u8 x = (0xD0 - GetStringWidth(FONT_NORMAL, gText_WelcomeToHOF, 0)) / 2; FillWindowPixelBuffer(0, PIXEL_FILL(0)); PutWindowTilemap(0); AddTextPrinterParameterized3(0, FONT_NORMAL, x, 1, sTextColors[0], 0, gText_WelcomeToHOF); CopyWindowToVram(0, COPYWIN_FULL); } static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u8 unused2) { u8 text[16]; u8 text2[24]; u32 i; u8 *stringPtr; u16 dexNumber; u8 gender; s32 width; s32 x; FillWindowPixelBuffer(0, PIXEL_FILL(0)); PutWindowTilemap(0); // dex number if (currMon->species != SPECIES_EGG) { StringCopy(text2, gText_Number); dexNumber = SpeciesToPokedexNum(currMon->species); if (dexNumber != 0xFFFF) { text[0] = (dexNumber / 100) + CHAR_0; text[1] = ((dexNumber %= 100) / 10) + CHAR_0; text[2] = (dexNumber % 10) + CHAR_0; } else { text[0] = text[1] = text[2] = CHAR_QUESTION_MARK; } text[3] = EOS; StringAppend(text2, text); AddTextPrinterParameterized3(0, FONT_NORMAL, 16, 1, sTextColors[0], 0, text2); } // nick, species names, gender and lvl i = 0; if (currMon->nick[0] != EOS) { for (i = 0; i < 10 && currMon->nick[i] != EOS; i++) { text[i] = currMon->nick[i]; } } text[i] = EOS; width = GetStringWidth(FONT_NORMAL, text, GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING)); if (currMon->species == SPECIES_EGG) x = 0x80 - width / 2; else x = 0x80 - width; AddTextPrinterParameterized3(0, FONT_NORMAL, x, 1, sTextColors[0], 0, text); if (currMon->species != SPECIES_EGG) { text[0] = CHAR_SLASH; stringPtr = StringCopy(text + 1, gSpeciesNames[currMon->species]); if (currMon->species == SPECIES_NIDORAN_M || currMon->species == SPECIES_NIDORAN_F) gender = MON_GENDERLESS; else gender = GetGenderFromSpeciesAndPersonality(currMon->species, currMon->personality); switch (gender) { case MON_MALE: *stringPtr++ = CHAR_MALE; break; case MON_FEMALE: *stringPtr++ = CHAR_FEMALE; break; default: *stringPtr++ = CHAR_SPACE; break; } *stringPtr = EOS; AddTextPrinterParameterized3(0, FONT_NORMAL, 0x80, 1, sTextColors[0], 0, text); stringPtr = StringCopy(text, gText_Level); ConvertIntToDecimalStringN(stringPtr, currMon->lvl, STR_CONV_MODE_LEFT_ALIGN, 3); AddTextPrinterParameterized3(0, FONT_NORMAL, 0x20, 0x11, sTextColors[0], 0, text); stringPtr = StringCopy(text, gText_IDNumber); ConvertIntToDecimalStringN(stringPtr, (u16)(currMon->tid), STR_CONV_MODE_LEADING_ZEROS, 5); AddTextPrinterParameterized3(0, FONT_NORMAL, 0x60, 0x11, sTextColors[0], 0, text); } CopyWindowToVram(0, COPYWIN_FULL); } static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2) { u8 text[20]; u16 trainerId; s32 textWidth = sWindowTemplate.width * 8 - 6; FillWindowPixelBuffer(1, PIXEL_FILL(1)); PutWindowTilemap(1); DrawStdFrameWithCustomTileAndPalette(1, FALSE, 0x21D, 13); AddTextPrinterParameterized4(1, FONT_NORMAL, 4, 3, 0, 0, sTextColors[1], 0, gText_Name); AddTextPrinterParameterized3(1, FONT_NORMAL, textWidth - GetStringWidth(FONT_NORMAL, gSaveBlock2Ptr->playerName, 0), 3, sTextColors[1], 0, gSaveBlock2Ptr->playerName); trainerId = (gSaveBlock2Ptr->playerTrainerId[0]) | (gSaveBlock2Ptr->playerTrainerId[1] << 8); AddTextPrinterParameterized3(1, FONT_NORMAL, 4, 18, sTextColors[1], 0, gText_IDNumber); text[0] = (trainerId % 100000) / 10000 + CHAR_0; text[1] = (trainerId % 10000) / 1000 + CHAR_0; text[2] = (trainerId % 1000) / 100 + CHAR_0; text[3] = (trainerId % 100) / 10 + CHAR_0; text[4] = (trainerId % 10) / 1 + CHAR_0; text[5] = EOS; AddTextPrinterParameterized3(1, FONT_NORMAL, textWidth - 30, 18, sTextColors[1], 0, text); AddTextPrinterParameterized3(1, FONT_NORMAL, 4, 32, sTextColors[1], 0, gText_MainMenuTime); text[0] = (gSaveBlock2Ptr->playTimeHours / 100) + CHAR_0; text[1] = (gSaveBlock2Ptr->playTimeHours % 100) / 10 + CHAR_0; text[2] = (gSaveBlock2Ptr->playTimeHours % 10) + CHAR_0; if (text[0] == CHAR_0) text[0] = CHAR_SPACE; if (text[0] == CHAR_SPACE && text[1] == CHAR_0) text[1] = CHAR_SPACE; text[3] = CHAR_COLON; text[4] = (gSaveBlock2Ptr->playTimeMinutes % 100) / 10 + CHAR_0; text[5] = (gSaveBlock2Ptr->playTimeMinutes % 10) + CHAR_0; text[6] = EOS; AddTextPrinterParameterized3(1, FONT_NORMAL, textWidth - 36, 32, sTextColors[1], 0, text); CopyWindowToVram(1, COPYWIN_FULL); } static void ClearVramOamPltt_LoadHofPal(void) { u32 vramOffset, oamOffset, plttOffset; u32 vramSize, oamSize, plttSize; vramOffset = (VRAM); vramSize = VRAM_SIZE; while (TRUE) { DmaFill16(3, 0, vramOffset, 0x1000); vramOffset += 0x1000; vramSize -= 0x1000; if (vramSize <= 0x1000) { DmaFill16(3, 0, vramOffset, vramSize); break; } } oamOffset = OAM; oamSize = OAM_SIZE; DmaFill32(3, 0, oamOffset, oamSize); plttOffset = PLTT; plttSize = PLTT_SIZE; DmaFill16(3, 0, plttOffset, plttSize); ResetPaletteFade(); LoadPalette(sHallOfFame_Pal, BG_PLTT_ID(0), sizeof(sHallOfFame_Pal)); } static void HofInit_ResetGpuBuffersAndLoadConfettiGfx(void) { ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetTempTileDataBuffers(); ResetAllPicSprites(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; LoadCompressedSpriteSheet(sHallOfFame_ConfettiSpriteSheet); LoadCompressedSpritePalette(sHallOfFame_ConfettiSpritePalette); } static void Hof_InitBgs(void) { ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sHof_BgTemplates, NELEMS(sHof_BgTemplates)); SetBgTilemapBuffer(1, sHofGfxPtr->tilemap1); SetBgTilemapBuffer(3, sHofGfxPtr->tilemap2); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); } static bool8 DrawHofBackground(void) { switch (sHofGfxPtr->state) { case 0: DecompressAndCopyTileDataToVram(1, sHallOfFame_Gfx, 0, 0, 0); break; case 1: if (FreeTempTileDataBuffersIfPossible()) return TRUE; break; case 2: FillBgTilemapBufferRect_Palette0(1, 1, 0, 0, 0x20, 2); FillBgTilemapBufferRect_Palette0(1, 0, 0, 3, 0x20, 0xB); FillBgTilemapBufferRect_Palette0(1, 1, 0, 0xE, 0x20, 6); FillBgTilemapBufferRect_Palette0(3, 2, 0, 0, 0x20, 0x20); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(3); break; case 3: InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); break; case 4: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); ShowBg(1); ShowBg(3); sHofGfxPtr->state = 0; return FALSE; } sHofGfxPtr->state++; return TRUE; } static void SpriteCB_EndGetOnScreen(struct Sprite *sprite) { } static void SpriteCB_GetOnScreen(struct Sprite *sprite) { if (sprite->x != sprite->data[1] || sprite->y != sprite->data[2]) { if (sprite->x < sprite->data[1]) sprite->x += 15; if (sprite->x > sprite->data[1]) sprite->x -= 15; if (sprite->y < sprite->data[2]) sprite->y += 10; if (sprite->y > sprite->data[2]) sprite->y -= 10; } else { sprite->data[0] = 1; sprite->callback = SpriteCB_EndGetOnScreen; } } static void SpriteCB_Confetti(struct Sprite* sprite) { if (sprite->y2 > 120) { DestroySprite(sprite); } else { u16 rand; u8 tableID; sprite->y2++; sprite->y2 += sprite->data[1]; tableID = sprite->data[0]; rand = (Random() % 4) + 8; sprite->x2 = rand * gSineTable[tableID] / 256; sprite->data[0] += 4; } } static bool8 Hof_SpawnConfetti(void) { u8 spriteId; struct Sprite* sprite; s16 posX = Random() % 240; s16 posY = -(Random() % 8); spriteId = CreateSprite(&sSpriteTemplate_Confetti, posX, posY, 0); sprite = &gSprites[spriteId]; StartSpriteAnim(sprite, Random() % 17); if (Random() & 3) sprite->data[1] = 0; else sprite->data[1] = 1; return FALSE; } ================================================ FILE: src/heal_location.c ================================================ #include "global.h" #include "heal_location.h" #include "event_data.h" #include "constants/maps.h" #include "constants/heal_locations.h" static void SetWhiteoutRespawnHealerNpcAsLastTalked(u32 healLocationIdx); // Arrays described here because porymap will overrwrite the below data file // sSpawnPoints // This array defines the fly points for unlocked spawns. // sWhiteoutRespawnHealCenterMapIdxs // This array defines the map where you actually respawn when you white out, // based on where you last checkpointed. // This is either the player's house or a Pokémon Center. // The data are u16 instead of u8 for reasons unknown. // sWhiteoutRespawnHealerNpcIds // When you respawn, your character scurries back to either their house // or a Pokémon Center, and hands their fainted Pokémon to their mother // or the Nurse for healing. // This array defines the index of the NPC on the map defined above // with whom your character interacts in this cutscene. #include "data/heal_locations.h" static u32 GetHealLocationIndexFromMapGroupAndNum(u16 mapGroup, u16 mapNum) { u32 i; for (i = 0; i < NELEMS(sSpawnPoints); i++) { if (sSpawnPoints[i].group == mapGroup && sSpawnPoints[i].map == mapNum) { return i + 1; } } return 0; } static const struct HealLocation * GetHealLocationPointerFromMapGroupAndNum(u16 mapGroup, u16 mapNum) { u32 i = GetHealLocationIndexFromMapGroupAndNum(mapGroup, mapNum); if (i == 0) return NULL; return &sSpawnPoints[i - 1]; } const struct HealLocation * GetHealLocation(u32 idx) { if (idx == 0) return NULL; if (idx > NELEMS(sSpawnPoints)) return NULL; return &sSpawnPoints[idx - 1]; } void SetWhiteoutRespawnWarpAndHealerNpc(struct WarpData * warp) { u32 healLocationIdx; if (VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 1) { if (!gSaveBlock1Ptr->trainerTower[gSaveBlock1Ptr->towerChallengeId].spokeToOwner) VarSet(VAR_MAP_SCENE_TRAINER_TOWER, 0); gSpecialVar_LastTalked = 1; warp->x = 4; warp->y = 11; warp->mapGroup = MAP_GROUP(TRAINER_TOWER_LOBBY); warp->mapNum = MAP_NUM(TRAINER_TOWER_LOBBY); warp->warpId = 0xFF; } else { healLocationIdx = GetHealLocationIndexFromMapGroupAndNum(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum); warp->mapGroup = sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0]; warp->mapNum = sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1]; warp->warpId = 0xFF; if (sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) && sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) { warp->x = 8; warp->y = 5; } else if (sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(INDIGO_PLATEAU_POKEMON_CENTER_1F) && sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(INDIGO_PLATEAU_POKEMON_CENTER_1F)) { warp->x = 13; warp->y = 12; } else if (sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(ONE_ISLAND_POKEMON_CENTER_1F) && sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(ONE_ISLAND_POKEMON_CENTER_1F)) { warp->x = 5; warp->y = 4; } else if (sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(TRAINER_TOWER_LOBBY) && sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(TRAINER_TOWER_LOBBY)) { warp->x = 4; warp->y = 11; VarSet(VAR_MAP_SCENE_TRAINER_TOWER, 0); } else { warp->x = 7; warp->y = 4; } SetWhiteoutRespawnHealerNpcAsLastTalked(healLocationIdx); } } static void SetWhiteoutRespawnHealerNpcAsLastTalked(u32 healLocationIdx) { gSpecialVar_LastTalked = sWhiteoutRespawnHealerNpcIds[healLocationIdx - 1]; } ================================================ FILE: src/help_message.c ================================================ #include "global.h" #include "malloc.h" #include "menu.h" #include "malloc.h" static EWRAM_DATA u8 sHelpMessageWindowId = 0; const u8 gHelpMessageWindow_Gfx[] = INCBIN_U8("graphics/help_system/msg_window.4bpp"); static const struct WindowTemplate sHelpMessageWindowTemplate = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 15, .width = 30, .height = 5, .paletteNum = 15, .baseBlock = 0x08F }; void MapNamePopupWindowIdSetDummy(void) { sHelpMessageWindowId = WINDOW_NONE; } u8 CreateHelpMessageWindow(void) { if (sHelpMessageWindowId == WINDOW_NONE) { sHelpMessageWindowId = AddWindow(&sHelpMessageWindowTemplate); PutWindowTilemap(sHelpMessageWindowId); } return sHelpMessageWindowId; } void DestroyHelpMessageWindow(u8 a0) { if (sHelpMessageWindowId != WINDOW_NONE) { FillWindowPixelBuffer(sHelpMessageWindowId, PIXEL_FILL(0)); ClearWindowTilemap(sHelpMessageWindowId); if (a0) CopyWindowToVram(sHelpMessageWindowId, a0); RemoveWindow(sHelpMessageWindowId); sHelpMessageWindowId = WINDOW_NONE; } } // Creates the bottom bar window that displays help text for e.g. the options in the Start menu void DrawHelpMessageWindowTilesById(u8 windowId) { const u8 *ptr = gHelpMessageWindow_Gfx; u8 *buffer; u8 i, j; u8 width, height; u32 tileId; width = (u8)GetWindowAttribute(windowId, WINDOW_WIDTH); height = (u8)GetWindowAttribute(windowId, WINDOW_HEIGHT); buffer = (u8 *)Alloc(32 * width * height); if (buffer != NULL) { for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { if (i == 0) // Top row tileId = 0; else if (i == height - 1) // Bottom row tileId = 14; else // Middle row tileId = 5; CpuCopy32( &ptr[tileId * 32], &buffer[(i * width + j) * 32], 32 ); } } CopyToWindowPixelBuffer(windowId, buffer, width * height * 32, 0); Free(buffer); } } static void DrawHelpMessageWindowTiles(void) { DrawHelpMessageWindowTilesById(sHelpMessageWindowId); } static const u8 sHelpMessageTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_DARK_GRAY}; static void PrintHelpMessageText(const u8 *text) { AddTextPrinterParameterized4(sHelpMessageWindowId, FONT_NORMAL, 2, 5, 1, 1, sHelpMessageTextColors, -1, text); } void PrintTextOnHelpMessageWindow(const u8 *text, u8 mode) { DrawHelpMessageWindowTiles(); PrintHelpMessageText(text); if (mode) CopyWindowToVram(sHelpMessageWindowId, mode); } ================================================ FILE: src/help_system.c ================================================ #include "global.h" #include "gflib.h" #include "event_data.h" #include "event_scripts.h" #include "field_player_avatar.h" #include "help_system.h" #include "item.h" #include "link.h" #include "overworld.h" #include "pokedex.h" #include "quest_log.h" #include "save.h" #include "save_location.h" #include "strings.h" #include "constants/items.h" #include "constants/maps.h" #include "constants/songs.h" #define HELP_NONE 0 #define HELP_END 0xFF // Help Main Topics enum HelpSystemTopics { TOPIC_WHAT_TO_DO, TOPIC_HOW_TO_DO, TOPIC_TERMS, TOPIC_ABOUT_GAME, TOPIC_TYPE_MATCHUP, TOPIC_EXIT, TOPIC_COUNT }; static EWRAM_DATA u16 sHelpSystemContextId = 0; static EWRAM_DATA u8 sSeenHelpSystemIntro = 0; struct HelpSystemState { // 0: Top level // 1: Submenu // 2: Help content u8 level; // enum HelpSystemTopics u8 topic; // Where the player's cursor was at top level u8 scrollMain; // Where the player's cursor was at submenu u8 scrollSub; }; struct HelpSystemState gHelpSystemState; u16 gHelpContextIdBackup; static bool32 IsCurrentMapInArray(const u16 * mapIdxs); static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); static bool8 HelpSystem_ShouldShowBasicTerms(void); static bool8 IsHelpSystemSubmenuEnabled(u8); static bool8 HasGottenAtLeastOneHM(void); static void PrintWelcomeMessageOnPanel1(void); static void PrintTextOnPanel2Row52RightAlign(const u8 *); static void ResetHelpSystemCursor(struct HelpSystemListMenu * a0); static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); static const u8 *const sHelpSystemTopicPtrs[TOPIC_COUNT] = { [TOPIC_WHAT_TO_DO] = Help_Text_WhatShouldIDo, [TOPIC_HOW_TO_DO] = Help_Text_HowDoIDoThis, [TOPIC_TERMS] = Help_Text_WhatDoesThisTermMean, [TOPIC_ABOUT_GAME] = Help_Text_AboutThisGame, [TOPIC_TYPE_MATCHUP] = Help_Text_TypeMatchupList, [TOPIC_EXIT] = Help_Text_Exit }; static const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[TOPIC_COUNT] = { [TOPIC_WHAT_TO_DO] = Help_Text_DescWhatShouldIDo, [TOPIC_HOW_TO_DO] = Help_Text_DescHowDoIDoThis, [TOPIC_TERMS] = Help_Text_DescWhatDoesThisTermMean, [TOPIC_ABOUT_GAME] = Help_Text_DescAboutThisGame, [TOPIC_TYPE_MATCHUP] = Help_Text_DescTypeMatchupList, [TOPIC_EXIT] = Help_Text_DescExit }; // Submenu IDs for TOPIC_WHAT_TO_DO enum { HELP_PLAYING_FOR_FIRST_TIME = 1, HELP_WHAT_SHOULD_I_BE_DOING, HELP_CANT_GET_OUT_OF_ROOM, HELP_CANT_FIND_PERSON_I_WANT, HELP_TALKED_TO_EVERYONE_NOW_WHAT, HELP_SOMEONE_BLOCKING_MY_WAY, HELP_I_CANT_GO_ON, HELP_OUT_OF_THINGS_TO_DO, HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, HELP_WHAT_ARE_MY_ADVENTURE_BASICS, HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, HELP_HOW_ARE_CAVES_DIFFERENT, HELP_HOW_DO_I_PROGRESS, HELP_WHEN_CAN_I_USE_ITEM, HELP_WHATS_A_BATTLE, HELP_HOW_DO_I_PREPARE_FOR_BATTLE, HELP_WHAT_IS_A_MONS_VITALITY, HELP_MY_MONS_ARE_HURT, HELP_WHAT_IS_STATUS_PROBLEM, HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, HELP_CANT_CATCH_MONS, HELP_RAN_OUT_OF_POTIONS, HELP_CAN_I_BUY_POKEBALLS, HELP_WHATS_A_TRAINER, HELP_HOW_DO_I_WIN_AGAINST_TRAINER, HELP_WHERE_DO_MONS_APPEAR, HELP_WHAT_ARE_MOVES, HELP_WHAT_ARE_HIDDEN_MOVES, HELP_WHAT_MOVES_SHOULD_I_USE, HELP_WANT_TO_ADD_MORE_MOVES, HELP_WANT_TO_MAKE_MON_STRONGER, HELP_FOE_MONS_TOO_STRONG, HELP_WHAT_DO_I_DO_IN_CAVE, HELP_NOTHING_I_WANT_TO_KNOW, HELP_WHATS_POKEMON_CENTER, HELP_WHATS_POKEMON_MART, HELP_WANT_TO_END_GAME, HELP_WHATS_A_MON, HELP_WHAT_IS_THAT_PERSON_LIKE, HELP_WHAT_DOES_HIDDEN_MOVE_DO, HELP_WHAT_DO_I_DO_IN_SAFARI, HELP_WHAT_ARE_SAFARI_RULES, HELP_WANT_TO_END_SAFARI, HELP_WHAT_IS_A_GYM, }; static const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = { [HELP_NONE] = NULL, [HELP_PLAYING_FOR_FIRST_TIME] = Help_Text_PlayingForFirstTime, [HELP_WHAT_SHOULD_I_BE_DOING] = Help_Text_WhatShouldIBeDoing, [HELP_CANT_GET_OUT_OF_ROOM] = Help_Text_CantGetOutOfRoom, [HELP_CANT_FIND_PERSON_I_WANT] = Help_Text_CantFindPersonIWant, [HELP_TALKED_TO_EVERYONE_NOW_WHAT] = Help_Text_TalkedToEveryoneNowWhat, [HELP_SOMEONE_BLOCKING_MY_WAY] = Help_Text_SomeoneBlockingMyWay, [HELP_I_CANT_GO_ON] = Help_Text_ICantGoOn, [HELP_OUT_OF_THINGS_TO_DO] = Help_Text_OutOfThingsToDo, [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT] = Help_Text_WhatHappenedToItemIGot, [HELP_WHAT_ARE_MY_ADVENTURE_BASICS] = Help_Text_WhatAreMyAdventureBasics, [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT] = Help_Text_HowAreRoadsForestsDifferent, [HELP_HOW_ARE_CAVES_DIFFERENT] = Help_Text_HowAreCavesDifferent, [HELP_HOW_DO_I_PROGRESS] = Help_Text_HowDoIProgress, [HELP_WHEN_CAN_I_USE_ITEM] = Help_Text_WhenCanIUseItem, [HELP_WHATS_A_BATTLE] = Help_Text_WhatsABattle, [HELP_HOW_DO_I_PREPARE_FOR_BATTLE] = Help_Text_HowDoIPrepareForBattle, [HELP_WHAT_IS_A_MONS_VITALITY] = Help_Text_WhatIsAMonsVitality, [HELP_MY_MONS_ARE_HURT] = Help_Text_MyMonsAreHurt, [HELP_WHAT_IS_STATUS_PROBLEM] = Help_Text_WhatIsStatusProblem, [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_WhatHappensIfAllMyMonsFaint, [HELP_CANT_CATCH_MONS] = Help_Text_CantCatchMons, [HELP_RAN_OUT_OF_POTIONS] = Help_Text_RanOutOfPotions, [HELP_CAN_I_BUY_POKEBALLS] = Help_Text_CanIBuyPokeBalls, [HELP_WHATS_A_TRAINER] = Help_Text_WhatsATrainer, [HELP_HOW_DO_I_WIN_AGAINST_TRAINER] = Help_Text_HowDoIWinAgainstTrainer, [HELP_WHERE_DO_MONS_APPEAR] = Help_Text_WhereDoMonsAppear, [HELP_WHAT_ARE_MOVES] = Help_Text_WhatAreMoves, [HELP_WHAT_ARE_HIDDEN_MOVES] = Help_Text_WhatAreHiddenMoves, [HELP_WHAT_MOVES_SHOULD_I_USE] = Help_Text_WhatMovesShouldIUse, [HELP_WANT_TO_ADD_MORE_MOVES] = Help_Text_WantToAddMoreMoves, [HELP_WANT_TO_MAKE_MON_STRONGER] = Help_Text_WantToMakeMonStronger, [HELP_FOE_MONS_TOO_STRONG] = Help_Text_FoeMonsTooStrong, [HELP_WHAT_DO_I_DO_IN_CAVE] = Help_Text_WhatDoIDoInCave, [HELP_NOTHING_I_WANT_TO_KNOW] = Help_Text_NothingIWantToKnow, [HELP_WHATS_POKEMON_CENTER] = Help_Text_WhatsPokemonCenter, [HELP_WHATS_POKEMON_MART] = Help_Text_WhatsPokemonMart, [HELP_WANT_TO_END_GAME] = Help_Text_WantToEndGame, [HELP_WHATS_A_MON] = Help_Text_WhatsAMon, [HELP_WHAT_IS_THAT_PERSON_LIKE] = Help_Text_WhatIsThatPersonLike, [HELP_WHAT_DOES_HIDDEN_MOVE_DO] = Help_Text_WhatDoesHiddenMoveDo, [HELP_WHAT_DO_I_DO_IN_SAFARI] = Help_Text_WhatDoIDoInSafari, [HELP_WHAT_ARE_SAFARI_RULES] = Help_Text_WhatAreSafariRules, [HELP_WANT_TO_END_SAFARI] = Help_Text_WantToEndSafari, [HELP_WHAT_IS_A_GYM] = Help_Text_WhatIsAGym }; static const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = { [HELP_NONE] = NULL, [HELP_PLAYING_FOR_FIRST_TIME] = Help_Text_AnswerPlayingForFirstTime, [HELP_WHAT_SHOULD_I_BE_DOING] = Help_Text_AnswerWhatShouldIBeDoing, [HELP_CANT_GET_OUT_OF_ROOM] = Help_Text_AnswerCantGetOutOfRoom, [HELP_CANT_FIND_PERSON_I_WANT] = Help_Text_AnswerCantFindPersonIWant, [HELP_TALKED_TO_EVERYONE_NOW_WHAT] = Help_Text_AnswerTalkedToEveryoneNowWhat, [HELP_SOMEONE_BLOCKING_MY_WAY] = Help_Text_AnswerSomeoneBlockingMyWay, [HELP_I_CANT_GO_ON] = Help_Text_AnswerICantGoOn, [HELP_OUT_OF_THINGS_TO_DO] = Help_Text_AnswerOutOfThingsToDo, [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT] = Help_Text_AnswerWhatHappenedToItemIGot, [HELP_WHAT_ARE_MY_ADVENTURE_BASICS] = Help_Text_AnswerWhatAreMyAdventureBasics, [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT] = Help_Text_AnswerHowAreRoadsForestsDifferent, [HELP_HOW_ARE_CAVES_DIFFERENT] = Help_Text_AnswerHowAreCavesDifferent, [HELP_HOW_DO_I_PROGRESS] = Help_Text_AnswerHowDoIProgress, [HELP_WHEN_CAN_I_USE_ITEM] = Help_Text_AnswerWhenCanIUseItem, [HELP_WHATS_A_BATTLE] = Help_Text_AnswerWhatsABattle, [HELP_HOW_DO_I_PREPARE_FOR_BATTLE] = Help_Text_AnswerHowDoIPrepareForBattle, [HELP_WHAT_IS_A_MONS_VITALITY] = Help_Text_AnswerWhatIsAMonsVitality, [HELP_MY_MONS_ARE_HURT] = Help_Text_AnswerMyMonsAreHurt, [HELP_WHAT_IS_STATUS_PROBLEM] = Help_Text_AnswerWhatIsStatusProblem, [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_AnswerWhatHappensIfAllMyMonsFaint, [HELP_CANT_CATCH_MONS] = Help_Text_AnswerCantCatchMons, [HELP_RAN_OUT_OF_POTIONS] = Help_Text_AnswerRanOutOfPotions, [HELP_CAN_I_BUY_POKEBALLS] = Help_Text_AnswerCanIBuyPokeBalls, [HELP_WHATS_A_TRAINER] = Help_Text_AnswerWhatsATrainer, [HELP_HOW_DO_I_WIN_AGAINST_TRAINER] = Help_Text_AnswerHowDoIWinAgainstTrainer, [HELP_WHERE_DO_MONS_APPEAR] = Help_Text_AnswerWhereDoMonsAppear, [HELP_WHAT_ARE_MOVES] = Help_Text_AnswerWhatAreMoves, [HELP_WHAT_ARE_HIDDEN_MOVES] = Help_Text_AnswerWhatAreHiddenMoves, [HELP_WHAT_MOVES_SHOULD_I_USE] = Help_Text_AnswerWhatMovesShouldIUse, [HELP_WANT_TO_ADD_MORE_MOVES] = Help_Text_AnswerWantToAddMoreMoves, [HELP_WANT_TO_MAKE_MON_STRONGER] = Help_Text_AnswerWantToMakeMonStronger, [HELP_FOE_MONS_TOO_STRONG] = Help_Text_AnswerFoeMonsTooStrong, [HELP_WHAT_DO_I_DO_IN_CAVE] = Help_Text_AnswerWhatDoIDoInCave, [HELP_NOTHING_I_WANT_TO_KNOW] = Help_Text_AnswerNothingIWantToKnow, [HELP_WHATS_POKEMON_CENTER] = Help_Text_AnswerWhatsPokemonCenter, [HELP_WHATS_POKEMON_MART] = Help_Text_AnswerWhatsPokemonMart, [HELP_WANT_TO_END_GAME] = Help_Text_AnswerWantToEndGame, [HELP_WHATS_A_MON] = Help_Text_AnswerWhatsAMon, [HELP_WHAT_IS_THAT_PERSON_LIKE] = Help_Text_AnswerWhatIsThatPersonLike, [HELP_WHAT_DOES_HIDDEN_MOVE_DO] = Help_Text_AnswerWhatDoesHiddenMoveDo, [HELP_WHAT_DO_I_DO_IN_SAFARI] = Help_Text_AnswerWhatDoIDoInSafari, [HELP_WHAT_ARE_SAFARI_RULES] = Help_Text_AnswerWhatAreSafariRules, [HELP_WANT_TO_END_SAFARI] = Help_Text_AnswerWantToEndSafari, [HELP_WHAT_IS_A_GYM] = Help_Text_AnswerWhatIsAGym }; // Submenu IDs for TOPIC_HOW_TO_DO enum { HELP_USING_POKEDEX = 1, HELP_USING_POKEMON, HELP_USING_SUMMARY, HELP_USING_SWITCH, HELP_USING_ITEM, HELP_USING_BAG, HELP_USING_AN_ITEM, HELP_USING_KEYITEM, HELP_USING_POKEBALL, HELP_USING_PLAYER, HELP_USING_SAVE, HELP_USING_OPTION, HELP_USING_POTION, HELP_USING_TOWN_MAP, HELP_USING_TM, HELP_USING_HM, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_RIDING_BICYCLE, HELP_ENTERING_NAME, HELP_USING_PC, HELP_USING_BILLS_PC, HELP_USING_WITHDRAW, HELP_USING_DEPOSIT, HELP_USING_MOVE, HELP_MOVING_ITEMS, HELP_USING_PLAYERS_PC, HELP_USING_WITHDRAW_ITEM, HELP_USING_DEPOSIT_ITEM, HELP_USING_MAILBOX, HELP_USING_PROF_OAKS_PC, HELP_OPENING_MENU, HELP_USING_FIGHT, HELP_USING_POKEMON2, HELP_USING_SHIFT, HELP_USING_SUMMARY2, HELP_USING_BAG2, HELP_READING_POKEDEX, HELP_USING_HOME_PC, HELP_USING_ITEM_STORAGE, HELP_USING_WITHDRAW_ITEM2, HELP_USING_DEPOSIT_ITEM2, HELP_USING_MAILBOX2, HELP_USING_RUN, HELP_REGISTER_KEY_ITEM, HELP_USING_BALL, HELP_USING_BAIT, HELP_USING_ROCK, HELP_USING_HALL_OF_FAME, HELP_USING_KEY_SYSTEM, HELP_SORTING_BAG, HELP_USING_OPTIONS_SUBMENU, HELP_USING_KEY_SYSTEM_SUBMENU, }; static const u8 *const sHelpSystemMenuTopicTextPtrs[] = { [HELP_NONE] = NULL, [HELP_USING_POKEDEX] = Help_Text_UsingPokedex, [HELP_USING_POKEMON] = Help_Text_UsingPokemon, [HELP_USING_SUMMARY] = Help_Text_UsingSummary, [HELP_USING_SWITCH] = Help_Text_UsingSwitch, [HELP_USING_ITEM] = Help_Text_UsingItem, [HELP_USING_BAG] = Help_Text_UsingBag, [HELP_USING_AN_ITEM] = Help_Text_UsingAnItem, [HELP_USING_KEYITEM] = Help_Text_UsingKeyItem, [HELP_USING_POKEBALL] = Help_Text_UsingPokeBall, [HELP_USING_PLAYER] = Help_Text_UsingPlayer, [HELP_USING_SAVE] = Help_Text_UsingSave, [HELP_USING_OPTION] = Help_Text_UsingOption, [HELP_USING_POTION] = Help_Text_UsingPotion, [HELP_USING_TOWN_MAP] = Help_Text_UsingTownMap, [HELP_USING_TM] = Help_Text_UsingTM, [HELP_USING_HM] = Help_Text_UsingHM, [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_UsingMoveOutsideOfBattle, [HELP_RIDING_BICYCLE] = Help_Text_RidingBicycle, [HELP_ENTERING_NAME] = Help_Text_EnteringName, [HELP_USING_PC] = Help_Text_UsingPC, [HELP_USING_BILLS_PC] = Help_Text_UsingBillsPC, [HELP_USING_WITHDRAW] = Help_Text_UsingWithdraw, [HELP_USING_DEPOSIT] = Help_Text_UsingDeposit, [HELP_USING_MOVE] = Help_Text_UsingMove, [HELP_MOVING_ITEMS] = Help_Text_MovingItems, [HELP_USING_PLAYERS_PC] = Help_Text_UsingPlayersPC, [HELP_USING_WITHDRAW_ITEM] = Help_Text_UsingWithdrawItem, [HELP_USING_DEPOSIT_ITEM] = Help_Text_UsingDepositItem, [HELP_USING_MAILBOX] = Help_Text_UsingMailbox, [HELP_USING_PROF_OAKS_PC] = Help_Text_UsingProfOaksPC, [HELP_OPENING_MENU] = Help_Text_OpeningMenu, [HELP_USING_FIGHT] = Help_Text_UsingFight, [HELP_USING_POKEMON2] = Help_Text_UsingPokemon2, [HELP_USING_SHIFT] = Help_Text_UsingShift, [HELP_USING_SUMMARY2] = Help_Text_UsingSummary2, [HELP_USING_BAG2] = Help_Text_UsingBag2, [HELP_READING_POKEDEX] = Help_Text_ReadingPokedex, [HELP_USING_HOME_PC] = Help_Text_UsingHomePC, [HELP_USING_ITEM_STORAGE] = Help_Text_UsingItemStorage, [HELP_USING_WITHDRAW_ITEM2] = Help_Text_UsingWithdrawItem2, [HELP_USING_DEPOSIT_ITEM2] = Help_Text_UsingDepositItem2, [HELP_USING_MAILBOX2] = Help_Text_UsingMailbox2, [HELP_USING_RUN] = Help_Text_UsingRun, [HELP_REGISTER_KEY_ITEM] = Help_Text_RegisterKeyItem, [HELP_USING_BALL] = Help_Text_UsingBall, [HELP_USING_BAIT] = Help_Text_UsingBait, [HELP_USING_ROCK] = Help_Text_UsingRock, [HELP_USING_HALL_OF_FAME] = Help_Text_UsingHallOfFame, [HELP_USING_KEY_SYSTEM] = Help_Text_UsingKeySystem, [HELP_SORTING_BAG] = Help_Text_SortingBag, [HELP_USING_OPTIONS_SUBMENU] = Help_Text_UsingOptionsSubmenu, [HELP_USING_KEY_SYSTEM_SUBMENU] = Help_Text_UsingKeySystemSubmenu, }; static const u8 *const sHelpSystemHowToUseMenuTextPtrs[] = { [HELP_NONE] = NULL, [HELP_USING_POKEDEX] = Help_Text_HowToUsePokedex, [HELP_USING_POKEMON] = Help_Text_HowToUsePokemon, [HELP_USING_SUMMARY] = Help_Text_HowToUseSummary, [HELP_USING_SWITCH] = Help_Text_HowToUseSwitch, [HELP_USING_ITEM] = Help_Text_HowToUseItem, [HELP_USING_BAG] = Help_Text_HowToUseBag, [HELP_USING_AN_ITEM] = Help_Text_HowToUseAnItem, [HELP_USING_KEYITEM] = Help_Text_HowToUseKeyItem, [HELP_USING_POKEBALL] = Help_Text_HowToUsePokeBall, [HELP_USING_PLAYER] = Help_Text_HowToUsePlayer, [HELP_USING_SAVE] = Help_Text_HowToUseSave, [HELP_USING_OPTION] = Help_Text_HowToUseOption, [HELP_USING_POTION] = Help_Text_HowToUsePotion, [HELP_USING_TOWN_MAP] = Help_Text_HowToUseTownMap, [HELP_USING_TM] = Help_Text_HowToUseTM, [HELP_USING_HM] = Help_Text_HowToUseHM, [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_HowToUseMoveOutsideOfBattle, [HELP_RIDING_BICYCLE] = Help_Text_HowToRideBicycle, [HELP_ENTERING_NAME] = Help_Text_HowToEnterName, [HELP_USING_PC] = Help_Text_HowToUsePC, [HELP_USING_BILLS_PC] = Help_Text_HowToUseBillsPC, [HELP_USING_WITHDRAW] = Help_Text_HowToUseWithdraw, [HELP_USING_DEPOSIT] = Help_Text_HowToUseDeposit, [HELP_USING_MOVE] = Help_Text_HowToUseMove, [HELP_MOVING_ITEMS] = Help_Text_HowToMoveItems, [HELP_USING_PLAYERS_PC] = Help_Text_HowToUsePlayersPC, [HELP_USING_WITHDRAW_ITEM] = Help_Text_HowToUseWithdrawItem, [HELP_USING_DEPOSIT_ITEM] = Help_Text_HowToUseDepositItem, [HELP_USING_MAILBOX] = Help_Text_HowToUseMailbox, [HELP_USING_PROF_OAKS_PC] = Help_Text_HowToUseProfOaksPC, [HELP_OPENING_MENU] = Help_Text_HowToOpenMenu, [HELP_USING_FIGHT] = Help_Text_HowToUseFight, [HELP_USING_POKEMON2] = Help_Text_HowToUsePokemon2, [HELP_USING_SHIFT] = Help_Text_HowToUseShift, [HELP_USING_SUMMARY2] = Help_Text_HowToUseSummary2, [HELP_USING_BAG2] = Help_Text_HowToUseBag2, [HELP_READING_POKEDEX] = Help_Text_HowToReadPokedex, [HELP_USING_HOME_PC] = Help_Text_HowToUseHomePC, [HELP_USING_ITEM_STORAGE] = Help_Text_HowToUseItemStorage, [HELP_USING_WITHDRAW_ITEM2] = Help_Text_HowToUseWithdrawItem2, [HELP_USING_DEPOSIT_ITEM2] = Help_Text_HowToUseDepositItem2, [HELP_USING_MAILBOX2] = Help_Text_HowToUseMailbox2, [HELP_USING_RUN] = Help_Text_HowToUseRun, [HELP_REGISTER_KEY_ITEM] = Help_Text_HowToRegisterKeyItem, [HELP_USING_BALL] = Help_Text_HowToUseBall, [HELP_USING_BAIT] = Help_Text_HowToUseBait, [HELP_USING_ROCK] = Help_Text_HowToUseRock, [HELP_USING_HALL_OF_FAME] = Help_Text_HowToUseHallOfFame, [HELP_USING_KEY_SYSTEM] = Help_Text_HowToUseKeySystemSettings, [HELP_SORTING_BAG] = Help_Text_HowToSortBag, [HELP_USING_OPTIONS_SUBMENU] = Help_Text_HowToUseOptionSubmenu, [HELP_USING_KEY_SYSTEM_SUBMENU] = Help_Text_HowToUseKeySystemSubmenu, }; // Submenu IDs for TOPIC_TERMS enum { HELP_TERM_HP = 1, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_ATTACK, HELP_TERM_DEFENSE, HELP_TERM_SPATK, HELP_TERM_SPDEF, HELP_TERM_SPEED, HELP_TERM_LEVEL, HELP_TERM_TYPE, HELP_TERM_OT, HELP_TERM_ITEM, HELP_TERM_ABILITY, HELP_TERM_MONEY, HELP_TERM_MOVE_TYPE, HELP_TERM_NATURE, HELP_TERM_ID_NO, HELP_TERM_PP, HELP_TERM_POWER, HELP_TERM_ACCURACY, HELP_TERM_FNT, HELP_TERM_ITEMS, HELP_TERM_KEYITEMS, HELP_TERM_POKEBALLS, HELP_TERM_POKEDEX, HELP_TERM_PLAY_TIME, HELP_TERM_BADGES, HELP_TERM_TEXT_SPEED, HELP_TERM_BATTLE_SCENE, HELP_TERM_BATTLE_STYLE, HELP_TERM_SOUND, HELP_TERM_BUTTON_MODE, HELP_TERM_FRAME, HELP_TERM_CANCEL, HELP_TERM_TM, HELP_TERM_HM, HELP_TERM_HM_MOVE, HELP_TERM_EVOLUTION, HELP_TERM_STATUS_PROBLEM, HELP_TERM_POKEMON, HELP_TERM_ID_NO2, HELP_TERM_MONEY2, HELP_TERM_BADGES2, HELP_TERM_VERSION, HELP_TERM_FR_EXCLUSIVES, HELP_TERM_LG_EXCLUSIVES, HELP_TERM_DIFFICULTY, HELP_TERM_NUZLOCKE, HELP_TERM_NUZLOCKE_CATCHING, HELP_TERM_NUZLOCKE_LOSING, HELP_TERM_IV_CALC, HELP_TERM_EV_CALC, HELP_TERM_NO_PMC, HELP_TERM_BATTLE_TRANSITIONS, HELP_TERM_EXP_MOD, HELP_TERM_BATTLE_INTRO_ANIM, HELP_TERM_MOVE_ANIMATIONS, HELP_TERM_HP_BAR_ANIM_SPEED, HELP_TERM_EXP_BAR_ANIM_SPEED, HELP_TERM_BACK, HELP_TERM_ADVANCED, HELP_TERM_ADVANCED_KEYS_BACK, }; static const u8 *const sHelpSystemTermTextPtrs[] = { [HELP_NONE] = NULL, [HELP_TERM_HP] = Help_Text_HP, [HELP_TERM_EXP] = Help_Text_EXP, [HELP_TERM_MOVES] = Help_Text_Moves, [HELP_TERM_ATTACK] = Help_Text_Attack, [HELP_TERM_DEFENSE] = Help_Text_Defense, [HELP_TERM_SPATK] = Help_Text_SpAtk, [HELP_TERM_SPDEF] = Help_Text_SpDef, [HELP_TERM_SPEED] = Help_Text_Speed, [HELP_TERM_LEVEL] = Help_Text_Level, [HELP_TERM_TYPE] = Help_Text_Type, [HELP_TERM_OT] = Help_Text_OT, [HELP_TERM_ITEM] = Help_Text_Item, [HELP_TERM_ABILITY] = Help_Text_Ability, [HELP_TERM_MONEY] = Help_Text_Money, [HELP_TERM_MOVE_TYPE] = Help_Text_MoveType, [HELP_TERM_NATURE] = Help_Text_Nature, [HELP_TERM_ID_NO] = Help_Text_IDNo, [HELP_TERM_PP] = Help_Text_PP, [HELP_TERM_POWER] = Help_Text_Power, [HELP_TERM_ACCURACY] = Help_Text_Accuracy, [HELP_TERM_FNT] = Help_Text_FNT, [HELP_TERM_ITEMS] = Help_Text_Items, [HELP_TERM_KEYITEMS] = Help_Text_KeyItems, [HELP_TERM_POKEBALLS] = Help_Text_PokeBalls, [HELP_TERM_POKEDEX] = Help_Text_Pokedex, [HELP_TERM_PLAY_TIME] = Help_Text_PlayTime, [HELP_TERM_BADGES] = Help_Text_Badges, [HELP_TERM_TEXT_SPEED] = Help_Text_TextSpeed, [HELP_TERM_BATTLE_SCENE] = Help_Text_BattleScene, [HELP_TERM_BATTLE_STYLE] = Help_Text_BattleStyle, [HELP_TERM_SOUND] = Help_Text_Sound, [HELP_TERM_BUTTON_MODE] = Help_Text_ButtonMode, [HELP_TERM_FRAME] = Help_Text_Frame, [HELP_TERM_CANCEL] = Help_Text_Cancel2, [HELP_TERM_TM] = Help_Text_TM, [HELP_TERM_HM] = Help_Text_HM, [HELP_TERM_HM_MOVE] = Help_Text_HMMove, [HELP_TERM_EVOLUTION] = Help_Text_Evolution, [HELP_TERM_STATUS_PROBLEM] = Help_Text_StatusProblem, [HELP_TERM_POKEMON] = Help_Text_Pokemon, [HELP_TERM_ID_NO2] = Help_Text_IDNo2, [HELP_TERM_MONEY2] = Help_Text_Money2, [HELP_TERM_BADGES2] = Help_Text_Badges2, [HELP_TERM_VERSION] = Help_Text_Version, [HELP_TERM_FR_EXCLUSIVES] = Help_Text_FRExclusives, [HELP_TERM_LG_EXCLUSIVES] = Help_Text_LGExclusives, [HELP_TERM_DIFFICULTY] = Help_Text_Difficulty, [HELP_TERM_NUZLOCKE] = Help_Text_Nuzlocke, [HELP_TERM_NUZLOCKE_CATCHING] = Help_Text_Nuzlocke_Catching, [HELP_TERM_NUZLOCKE_LOSING] = Help_Text_NuzlockeLosing, [HELP_TERM_IV_CALC] = Help_Text_IvCalc, [HELP_TERM_EV_CALC] = Help_Text_EvCalc, [HELP_TERM_NO_PMC] = Help_Text_NoFreeHeals, [HELP_TERM_BATTLE_TRANSITIONS] = Help_Text_BattleTransitions, [HELP_TERM_EXP_MOD] = Help_Text_ExpMod, [HELP_TERM_BATTLE_INTRO_ANIM] = Help_Text_BattleIntroAnim, [HELP_TERM_MOVE_ANIMATIONS] = Help_Text_MoveAnimations, [HELP_TERM_HP_BAR_ANIM_SPEED] = Help_Text_HpBarAnimSpeed, [HELP_TERM_EXP_BAR_ANIM_SPEED] = Help_Text_ExpBarAnimSpeed, [HELP_TERM_BACK] = Help_Text_Back, [HELP_TERM_ADVANCED] = Help_Text_AdvancedKeys, [HELP_TERM_ADVANCED_KEYS_BACK] = Help_Text_Back, }; static const u8 *const sHelpSystemTermDefinitionsTextPtrs[] = { [HELP_NONE] = NULL, [HELP_TERM_HP] = Help_Text_DefineHP, [HELP_TERM_EXP] = Help_Text_DefineEXP, [HELP_TERM_MOVES] = Help_Text_DefineMoves, [HELP_TERM_ATTACK] = Help_Text_DefineAttack, [HELP_TERM_DEFENSE] = Help_Text_DefineDefense, [HELP_TERM_SPATK] = Help_Text_DefineSpAtk, [HELP_TERM_SPDEF] = Help_Text_DefineSpDef, [HELP_TERM_SPEED] = Help_Text_DefineSpeed, [HELP_TERM_LEVEL] = Help_Text_DefineLevel, [HELP_TERM_TYPE] = Help_Text_DefineType, [HELP_TERM_OT] = Help_Text_DefineOT, [HELP_TERM_ITEM] = Help_Text_DefineItem, [HELP_TERM_ABILITY] = Help_Text_DefineAbility, [HELP_TERM_MONEY] = Help_Text_DefineMoney, [HELP_TERM_MOVE_TYPE] = Help_Text_DefineMoveType, [HELP_TERM_NATURE] = Help_Text_DefineNature, [HELP_TERM_ID_NO] = Help_Text_DefineIDNo, [HELP_TERM_PP] = Help_Text_DefinePP, [HELP_TERM_POWER] = Help_Text_DefinePower, [HELP_TERM_ACCURACY] = Help_Text_DefineAccuracy, [HELP_TERM_FNT] = Help_Text_DefineFNT, [HELP_TERM_ITEMS] = Help_Text_DefineItems, [HELP_TERM_KEYITEMS] = Help_Text_DefineKeyItems, [HELP_TERM_POKEBALLS] = Help_Text_DefinePokeBalls, [HELP_TERM_POKEDEX] = Help_Text_DefinePokedex, [HELP_TERM_PLAY_TIME] = Help_Text_DefinePlayTime, [HELP_TERM_BADGES] = Help_Text_DefineBadges, [HELP_TERM_TEXT_SPEED] = Help_Text_DefineTextSpeed, [HELP_TERM_BATTLE_SCENE] = Help_Text_DefineBattleScene, [HELP_TERM_BATTLE_STYLE] = Help_Text_DefineBattleStyle, [HELP_TERM_SOUND] = Help_Text_DefineSound, [HELP_TERM_BUTTON_MODE] = Help_Text_DefineButtonMode, [HELP_TERM_FRAME] = Help_Text_DefineFrame, [HELP_TERM_CANCEL] = Help_Text_DefineCancel2, [HELP_TERM_TM] = Help_Text_DefineTM, [HELP_TERM_HM] = Help_Text_DefineHM, [HELP_TERM_HM_MOVE] = Help_Text_DefineHMMove, [HELP_TERM_EVOLUTION] = Help_Text_DefineEvolution, [HELP_TERM_STATUS_PROBLEM] = Help_Text_DefineStatusProblem, [HELP_TERM_POKEMON] = Help_Text_DefinePokemon, [HELP_TERM_ID_NO2] = Help_Text_DefineIDNo2, [HELP_TERM_MONEY2] = Help_Text_DefineMoney2, [HELP_TERM_BADGES2] = Help_Text_DefineBadges2, [HELP_TERM_VERSION] = Help_Text_DefineVersion, [HELP_TERM_FR_EXCLUSIVES] = Help_Text_DefineFRExclusives, [HELP_TERM_LG_EXCLUSIVES] = Help_Text_DefineLGExclusives, [HELP_TERM_DIFFICULTY] = Help_Text_DefineDifficulty, [HELP_TERM_NUZLOCKE] = Help_Text_DefineNuzlocke, [HELP_TERM_NUZLOCKE_CATCHING] = Help_Text_DefineNuzlocke_Catching, [HELP_TERM_NUZLOCKE_LOSING] = Help_Text_DefineNuzlockeLosing, [HELP_TERM_IV_CALC] = Help_Text_DefineIvCalc, [HELP_TERM_EV_CALC] = Help_Text_DefineEvCalc, [HELP_TERM_NO_PMC] = Help_Text_DefineNoFreeHeals, [HELP_TERM_BATTLE_TRANSITIONS] = Help_Text_DefineBattleTransitions, [HELP_TERM_EXP_MOD] = Help_Text_DefineExpMod, [HELP_TERM_BATTLE_INTRO_ANIM] = Help_Text_DefineBattleIntroAnims, [HELP_TERM_MOVE_ANIMATIONS] = Help_Text_DefineMoveAnimations, [HELP_TERM_HP_BAR_ANIM_SPEED] = Help_Text_DefineHpBarAnimSpeed, [HELP_TERM_EXP_BAR_ANIM_SPEED] = Help_Text_DefineExpBarAnimSpeed, [HELP_TERM_BACK] = Help_Text_DefineBack, [HELP_TERM_ADVANCED] = Help_Text_DefineAdvancedKeys, [HELP_TERM_ADVANCED_KEYS_BACK] = Help_Text_DefineAdvancedKeysBack, }; // Submenu IDs for TOPIC_ABOUT_GAME enum { HELP_THE_HELP_SYSTEM = 1, HELP_THE_GAME, HELP_WIRELESS_ADAPTER, HELP_GAME_FUNDAMENTALS_1, HELP_GAME_FUNDAMENTALS_2, HELP_GAME_FUNDAMENTALS_3, HELP_WHAT_ARE_POKEMON, }; static const u8 *const sHelpSystemGeneralTopicTextPtrs[] = { [HELP_NONE] = NULL, [HELP_THE_HELP_SYSTEM] = Help_Text_TheHelpSystem, [HELP_THE_GAME] = Help_Text_TheGame, [HELP_WIRELESS_ADAPTER] = Help_Text_WirelessAdapter, [HELP_GAME_FUNDAMENTALS_1] = Help_Text_GameFundamentals1, [HELP_GAME_FUNDAMENTALS_2] = Help_Text_GameFundamentals2, [HELP_GAME_FUNDAMENTALS_3] = Help_Text_GameFundamentals3, [HELP_WHAT_ARE_POKEMON] = Help_Text_WhatArePokemon }; static const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = { [HELP_NONE] = NULL, [HELP_THE_HELP_SYSTEM] = Help_Text_DescTheHelpSystem, [HELP_THE_GAME] = Help_Text_DescTheGame, [HELP_WIRELESS_ADAPTER] = Help_Text_DescWirelessAdapter, [HELP_GAME_FUNDAMENTALS_1] = Help_Text_DescGameFundamentals1, [HELP_GAME_FUNDAMENTALS_2] = Help_Text_DescGameFundamentals2, [HELP_GAME_FUNDAMENTALS_3] = Help_Text_DescGameFundamentals3, [HELP_WHAT_ARE_POKEMON] = Help_Text_DescWhatArePokemon }; // An enum for the type matchups isn't necessary, when used they're always used in their entirety // Macro below is used to reference the entire group at once #define HELP_TYPE_MATCHUPS \ 1, \ 2, 3, \ 4, 5, \ 6, 7, \ 8, 9, \ 10, 11, \ 12, 13, \ 14, 15, \ 16, 17, \ 18, 19, \ 20, 21, \ 22, 23, \ 24, 25, \ 26, 27, \ 28, 29, \ 30, 31, \ 32, 33, \ 34, 35 \ static const u8 *const sHelpSystemTypeMatchupTextPtrs[] = { [HELP_NONE] = NULL, [1] = Help_Text_UsingTypeMatchupList, [2] = Help_Text_OwnMoveDark, [3] = Help_Text_OwnPokemonDark, [4] = Help_Text_OwnMoveRock, [5] = Help_Text_OwnPokemonRock, [6] = Help_Text_OwnMovePsychic, [7] = Help_Text_OwnPokemonPsychic, [8] = Help_Text_OwnMoveFighting, [9] = Help_Text_OwnPokemonFighting, [10] = Help_Text_OwnMoveGrass, [11] = Help_Text_OwnPokemonGrass, [12] = Help_Text_OwnMoveGhost, [13] = Help_Text_OwnPokemonGhost, [14] = Help_Text_OwnMoveIce, [15] = Help_Text_OwnPokemonIce, [16] = Help_Text_OwnMoveGround, [17] = Help_Text_OwnPokemonGround, [18] = Help_Text_OwnMoveElectric, [19] = Help_Text_OwnPokemonElectric, [20] = Help_Text_OwnMovePoison, [21] = Help_Text_OwnPokemonPoison, [22] = Help_Text_OwnMoveDragon, [23] = Help_Text_OwnPokemonDragon, [24] = Help_Text_OwnMoveNormal, [25] = Help_Text_OwnPokemonNormal, [26] = Help_Text_OwnMoveSteel, [27] = Help_Text_OwnPokemonSteel, [28] = Help_Text_OwnMoveFlying, [29] = Help_Text_OwnPokemonFlying, [30] = Help_Text_OwnMoveFire, [31] = Help_Text_OwnPokemonFire, [32] = Help_Text_OwnMoveWater, [33] = Help_Text_OwnPokemonWater, [34] = Help_Text_OwnMoveBug, [35] = Help_Text_OwnPokemonBug }; static const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = { [HELP_NONE] = NULL, [1] = Help_Text_HowToUseTypeMatchupList, [2] = Help_Text_TypeMatchupOwnMoveDark, [3] = Help_Text_TypeMatchupOwnPokemonDark, [4] = Help_Text_TypeMatchupOwnMoveRock, [5] = Help_Text_TypeMatchupOwnPokemonRock, [6] = Help_Text_TypeMatchupOwnMovePsychic, [7] = Help_Text_TypeMatchupOwnPokemonPsychic, [8] = Help_Text_TypeMatchupOwnMoveFighting, [9] = Help_Text_TypeMatchupOwnPokemonFighting, [10] = Help_Text_TypeMatchupOwnMoveGrass, [11] = Help_Text_TypeMatchupOwnPokemonGrass, [12] = Help_Text_TypeMatchupOwnMoveGhost, [13] = Help_Text_TypeMatchupOwnPokemonGhost, [14] = Help_Text_TypeMatchupOwnMoveIce, [15] = Help_Text_TypeMatchupOwnPokemonIce, [16] = Help_Text_TypeMatchupOwnMoveGround, [17] = Help_Text_TypeMatchupOwnPokemonGround, [18] = Help_Text_TypeMatchupOwnMoveElectric, [19] = Help_Text_TypeMatchupOwnPokemonElectric, [20] = Help_Text_TypeMatchupOwnMovePoison, [21] = Help_Text_TypeMatchupOwnPokemonPoison, [22] = Help_Text_TypeMatchupOwnMoveDragon, [23] = Help_Text_TypeMatchupOwnPokemonDragon, [24] = Help_Text_TypeMatchupOwnMoveNormal, [25] = Help_Text_TypeMatchupOwnPokemonNormal, [26] = Help_Text_TypeMatchupOwnMoveSteel, [27] = Help_Text_TypeMatchupOwnPokemonSteel, [28] = Help_Text_TypeMatchupOwnMoveFlying, [29] = Help_Text_TypeMatchupOwnPokemonFlying, [30] = Help_Text_TypeMatchupOwnMoveFire, [31] = Help_Text_TypeMatchupOwnPokemonFire, [32] = Help_Text_TypeMatchupOwnMoveWater, [33] = Help_Text_TypeMatchupOwnPokemonWater, [34] = Help_Text_TypeMatchupOwnMoveBug, [35] = Help_Text_TypeMatchupOwnPokemonBug }; static const u8 sAboutGame_TitleScreen[] = { HELP_THE_HELP_SYSTEM, HELP_THE_GAME, HELP_WIRELESS_ADAPTER, HELP_END }; static const u8 sAboutGame_NewGame[] = { HELP_THE_HELP_SYSTEM, HELP_THE_GAME, HELP_WIRELESS_ADAPTER, HELP_END }; static const u8 sHowTo_NamingScreen[] = { HELP_ENTERING_NAME, HELP_END }; static const u8 sAboutGame_NamingScreen[] = { HELP_THE_HELP_SYSTEM, HELP_THE_GAME, HELP_WIRELESS_ADAPTER, HELP_END }; static const u8 sHowTo_Pokedex[] = { HELP_USING_POKEDEX, HELP_READING_POKEDEX, HELP_END }; static const u8 sHowTo_PartyMenu[] = { HELP_USING_POKEMON, HELP_USING_SUMMARY, HELP_USING_SWITCH, HELP_USING_ITEM, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_END }; static const u8 sTerms_PartyMenu[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_END }; static const u8 sHowTo_PokemonInfo[] = { HELP_USING_POKEMON, HELP_USING_SUMMARY, HELP_END }; static const u8 sTerms_PokemonInfo[] = { HELP_TERM_LEVEL, HELP_TERM_TYPE, HELP_TERM_OT, HELP_TERM_ID_NO, HELP_TERM_ITEM, HELP_TERM_NATURE, HELP_END }; static const u8 sTerms_PokemonSkills[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_ATTACK, HELP_TERM_DEFENSE, HELP_TERM_SPATK, HELP_TERM_SPDEF, HELP_TERM_SPEED, HELP_TERM_EXP, HELP_TERM_ABILITY, HELP_END }; static const u8 sTerms_PokemonMoves[] = { HELP_TERM_LEVEL, HELP_TERM_MOVES, HELP_TERM_TYPE, HELP_TERM_MOVE_TYPE, HELP_TERM_PP, HELP_TERM_POWER, HELP_TERM_ACCURACY, HELP_END }; static const u8 sHowTo_Bag[] = { HELP_USING_BAG, HELP_SORTING_BAG, HELP_USING_AN_ITEM, HELP_USING_KEYITEM, HELP_REGISTER_KEY_ITEM, HELP_USING_POKEBALL, HELP_USING_POTION, HELP_USING_TOWN_MAP, HELP_USING_TM, HELP_USING_HM, HELP_RIDING_BICYCLE, HELP_END }; static const u8 sTerms_Bag[] = { HELP_TERM_ITEMS, HELP_TERM_KEYITEMS, HELP_TERM_POKEBALLS, HELP_END }; static const u8 sHowTo_TrainerCardFront[] = { HELP_USING_PLAYER, HELP_END }; static const u8 sTerms_TrainerCardFront[] = { HELP_TERM_ID_NO, HELP_TERM_MONEY, HELP_TERM_POKEDEX, HELP_TERM_PLAY_TIME, HELP_TERM_BADGES, HELP_END }; static const u8 sHowTo_TrainerCardBack[] = { HELP_USING_PLAYER, HELP_END }; static const u8 sHowTo_Save[] = { HELP_USING_SAVE, HELP_END }; static const u8 sTerms_Save[] = { HELP_TERM_BADGES2, HELP_TERM_POKEDEX, HELP_TERM_PLAY_TIME, HELP_END }; static const u8 sHowTo_Options[] = { HELP_USING_OPTION, HELP_END }; static const u8 sTerms_Options[] = { HELP_TERM_TEXT_SPEED, HELP_TERM_BATTLE_SCENE, HELP_TERM_BATTLE_STYLE, HELP_TERM_SOUND, HELP_TERM_BUTTON_MODE, HELP_TERM_FRAME, HELP_TERM_CANCEL, HELP_END }; static const u8 sWhatToDo_PlayersHouse[] = { HELP_WHAT_SHOULD_I_BE_DOING, HELP_CANT_GET_OUT_OF_ROOM, HELP_CANT_FIND_PERSON_I_WANT, HELP_END }; static const u8 sAboutGame_PlayersHouse[] = { HELP_THE_HELP_SYSTEM, HELP_THE_GAME, HELP_WIRELESS_ADAPTER, HELP_WHAT_ARE_POKEMON, HELP_END }; static const u8 sWhatToDo_OaksLab[] = { HELP_WHAT_SHOULD_I_BE_DOING, HELP_CANT_FIND_PERSON_I_WANT, HELP_TALKED_TO_EVERYONE_NOW_WHAT, HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, HELP_WANT_TO_END_GAME, HELP_END }; static const u8 sHowTo_OaksLab[] = { HELP_OPENING_MENU, HELP_USING_POKEDEX, HELP_USING_POKEMON, HELP_USING_SUMMARY, HELP_USING_SWITCH, HELP_USING_ITEM, HELP_USING_BAG, HELP_USING_AN_ITEM, HELP_USING_KEYITEM, HELP_REGISTER_KEY_ITEM, HELP_USING_POKEBALL, HELP_USING_POTION, HELP_USING_TOWN_MAP, HELP_USING_TM, HELP_USING_HM, HELP_USING_PLAYER, HELP_USING_SAVE, HELP_USING_OPTION, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_END }; static const u8 sTerms_OaksLab[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_TYPE, HELP_TERM_POKEMON, HELP_END }; static const u8 sWhatToDo_PokeCenter[] = { HELP_WHAT_SHOULD_I_BE_DOING, HELP_TALKED_TO_EVERYONE_NOW_WHAT, HELP_SOMEONE_BLOCKING_MY_WAY, HELP_WHAT_ARE_MY_ADVENTURE_BASICS, HELP_WHATS_POKEMON_CENTER, HELP_WHATS_POKEMON_MART, HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, HELP_WANT_TO_END_GAME, HELP_END }; static const u8 sHowTo_PokeCenter[] = { HELP_OPENING_MENU, HELP_USING_POKEDEX, HELP_USING_POKEMON, HELP_USING_SUMMARY, HELP_USING_SWITCH, HELP_USING_ITEM, HELP_USING_BAG, HELP_USING_AN_ITEM, HELP_USING_KEYITEM, HELP_REGISTER_KEY_ITEM, HELP_USING_POKEBALL, HELP_USING_POTION, HELP_USING_TOWN_MAP, HELP_USING_TM, HELP_USING_HM, HELP_USING_PLAYER, HELP_USING_SAVE, HELP_USING_OPTION, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_USING_PC, HELP_END }; static const u8 sTerms_PokeCenter[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_TYPE, HELP_TERM_POKEMON, HELP_END }; static const u8 sAboutGame_PokeCenter[] = { HELP_WIRELESS_ADAPTER, HELP_WHAT_ARE_POKEMON, HELP_GAME_FUNDAMENTALS_1, HELP_GAME_FUNDAMENTALS_2, HELP_GAME_FUNDAMENTALS_3, HELP_END }; static const u8 sWhatToDo_Mart[] = { HELP_WHAT_SHOULD_I_BE_DOING, HELP_TALKED_TO_EVERYONE_NOW_WHAT, HELP_SOMEONE_BLOCKING_MY_WAY, HELP_WHAT_ARE_MY_ADVENTURE_BASICS, HELP_WHATS_POKEMON_CENTER, HELP_WHATS_POKEMON_MART, HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, HELP_WANT_TO_END_GAME, HELP_END }; static const u8 sHowTo_Mart[] = { HELP_OPENING_MENU, HELP_USING_POKEDEX, HELP_USING_POKEMON, HELP_USING_SUMMARY, HELP_USING_SWITCH, HELP_USING_ITEM, HELP_USING_BAG, HELP_USING_AN_ITEM, HELP_USING_KEYITEM, HELP_REGISTER_KEY_ITEM, HELP_USING_POKEBALL, HELP_USING_POTION, HELP_USING_TOWN_MAP, HELP_USING_TM, HELP_USING_HM, HELP_USING_PLAYER, HELP_USING_SAVE, HELP_USING_OPTION, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_END }; static const u8 sTerms_Mart[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_TYPE, HELP_TERM_ITEM, HELP_TERM_MONEY, HELP_TERM_ITEMS, HELP_TERM_KEYITEMS, HELP_TERM_POKEBALLS, HELP_TERM_FNT, HELP_END }; static const u8 sWhatToDo_Gym[] = { HELP_SOMEONE_BLOCKING_MY_WAY, HELP_WHAT_ARE_MY_ADVENTURE_BASICS, HELP_WHATS_POKEMON_CENTER, HELP_WHATS_POKEMON_MART, HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, HELP_WANT_TO_END_GAME, HELP_END }; static const u8 sHowTo_Gym[] = { HELP_OPENING_MENU, HELP_USING_POKEDEX, HELP_USING_POKEMON, HELP_USING_SUMMARY, HELP_USING_SWITCH, HELP_USING_ITEM, HELP_USING_BAG, HELP_USING_AN_ITEM, HELP_USING_KEYITEM, HELP_REGISTER_KEY_ITEM, HELP_USING_POKEBALL, HELP_USING_POTION, HELP_USING_TOWN_MAP, HELP_USING_TM, HELP_USING_HM, HELP_USING_PLAYER, HELP_USING_SAVE, HELP_USING_OPTION, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_END }; static const u8 sTerms_Gym[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_TYPE, HELP_TERM_FNT, HELP_END }; static const u8 sTypeMatchups_Gym[] = { HELP_TYPE_MATCHUPS, HELP_END }; static const u8 sWhatToDo_Indoors[] = { HELP_WHAT_SHOULD_I_BE_DOING, HELP_WHAT_ARE_MY_ADVENTURE_BASICS, HELP_CANT_FIND_PERSON_I_WANT, HELP_TALKED_TO_EVERYONE_NOW_WHAT, HELP_SOMEONE_BLOCKING_MY_WAY, HELP_I_CANT_GO_ON, HELP_HOW_DO_I_PROGRESS, HELP_WHAT_IS_THAT_PERSON_LIKE, HELP_OUT_OF_THINGS_TO_DO, HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, HELP_WHAT_DO_I_DO_IN_CAVE, HELP_WHATS_POKEMON_CENTER, HELP_WHATS_POKEMON_MART, HELP_WHAT_IS_A_GYM, HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, HELP_WHEN_CAN_I_USE_ITEM, HELP_RAN_OUT_OF_POTIONS, HELP_CAN_I_BUY_POKEBALLS, HELP_WHATS_A_BATTLE, HELP_HOW_DO_I_PREPARE_FOR_BATTLE, HELP_WHAT_IS_A_MONS_VITALITY, HELP_WHERE_DO_MONS_APPEAR, HELP_CANT_CATCH_MONS, HELP_WANT_TO_MAKE_MON_STRONGER, HELP_FOE_MONS_TOO_STRONG, HELP_MY_MONS_ARE_HURT, HELP_WHAT_IS_STATUS_PROBLEM, HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, HELP_WHATS_A_TRAINER, HELP_HOW_DO_I_WIN_AGAINST_TRAINER, HELP_WHAT_ARE_MOVES, HELP_WANT_TO_ADD_MORE_MOVES, HELP_WHAT_ARE_HIDDEN_MOVES, HELP_WHAT_DOES_HIDDEN_MOVE_DO, HELP_WANT_TO_END_GAME, HELP_END }; static const u8 sHowTo_Indoors[] = { HELP_OPENING_MENU, HELP_USING_POKEDEX, HELP_USING_POKEMON, HELP_USING_SUMMARY, HELP_USING_SWITCH, HELP_USING_ITEM, HELP_USING_BAG, HELP_USING_AN_ITEM, HELP_USING_KEYITEM, HELP_REGISTER_KEY_ITEM, HELP_USING_POKEBALL, HELP_USING_POTION, HELP_USING_TOWN_MAP, HELP_USING_TM, HELP_USING_HM, HELP_USING_PLAYER, HELP_USING_SAVE, HELP_USING_OPTION, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_END }; static const u8 sTerms_Indoors[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_TYPE, HELP_TERM_OT, HELP_TERM_ITEM, HELP_TERM_ABILITY, HELP_TERM_FNT, HELP_END }; static const u8 sWhatToDo_Overworld[] = { HELP_WHAT_SHOULD_I_BE_DOING, HELP_WHAT_ARE_MY_ADVENTURE_BASICS, HELP_CANT_FIND_PERSON_I_WANT, HELP_TALKED_TO_EVERYONE_NOW_WHAT, HELP_SOMEONE_BLOCKING_MY_WAY, HELP_I_CANT_GO_ON, HELP_HOW_DO_I_PROGRESS, HELP_WHAT_IS_THAT_PERSON_LIKE, HELP_OUT_OF_THINGS_TO_DO, HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, HELP_WHAT_DO_I_DO_IN_CAVE, HELP_WHATS_POKEMON_CENTER, HELP_WHATS_POKEMON_MART, HELP_WHAT_IS_A_GYM, HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, HELP_WHEN_CAN_I_USE_ITEM, HELP_RAN_OUT_OF_POTIONS, HELP_CAN_I_BUY_POKEBALLS, HELP_WHATS_A_BATTLE, HELP_HOW_DO_I_PREPARE_FOR_BATTLE, HELP_WHAT_IS_A_MONS_VITALITY, HELP_WHERE_DO_MONS_APPEAR, HELP_CANT_CATCH_MONS, HELP_WANT_TO_MAKE_MON_STRONGER, HELP_FOE_MONS_TOO_STRONG, HELP_MY_MONS_ARE_HURT, HELP_WHAT_IS_STATUS_PROBLEM, HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, HELP_WHATS_A_TRAINER, HELP_HOW_DO_I_WIN_AGAINST_TRAINER, HELP_WHAT_ARE_MOVES, HELP_WANT_TO_ADD_MORE_MOVES, HELP_WHAT_ARE_HIDDEN_MOVES, HELP_WHAT_DOES_HIDDEN_MOVE_DO, HELP_WANT_TO_END_GAME, HELP_END }; static const u8 sHowTo_Overworld[] = { HELP_OPENING_MENU, HELP_USING_POKEDEX, HELP_USING_POKEMON, HELP_USING_BAG, HELP_USING_PLAYER, HELP_USING_SAVE, HELP_USING_OPTION, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_END }; static const u8 sTerms_Overworld[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_TYPE, HELP_TERM_OT, HELP_TERM_ITEM, HELP_TERM_ABILITY, HELP_TERM_FNT, HELP_TERM_POKEMON, HELP_END }; static const u8 sWhatToDo_Dungeon[] = { HELP_WHAT_ARE_MY_ADVENTURE_BASICS, HELP_I_CANT_GO_ON, HELP_HOW_DO_I_PROGRESS, HELP_WHAT_IS_THAT_PERSON_LIKE, HELP_OUT_OF_THINGS_TO_DO, HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, HELP_WHAT_DO_I_DO_IN_CAVE, HELP_WHATS_POKEMON_CENTER, HELP_WHATS_POKEMON_MART, HELP_WHAT_IS_A_GYM, HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, HELP_WHEN_CAN_I_USE_ITEM, HELP_RAN_OUT_OF_POTIONS, HELP_WHATS_A_BATTLE, HELP_HOW_DO_I_PREPARE_FOR_BATTLE, HELP_WHAT_IS_A_MONS_VITALITY, HELP_WHERE_DO_MONS_APPEAR, HELP_CANT_CATCH_MONS, HELP_WANT_TO_MAKE_MON_STRONGER, HELP_FOE_MONS_TOO_STRONG, HELP_MY_MONS_ARE_HURT, HELP_WHAT_IS_STATUS_PROBLEM, HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, HELP_WHATS_A_TRAINER, HELP_HOW_DO_I_WIN_AGAINST_TRAINER, HELP_WHAT_ARE_MOVES, HELP_WANT_TO_ADD_MORE_MOVES, HELP_WHAT_ARE_HIDDEN_MOVES, HELP_WHAT_DOES_HIDDEN_MOVE_DO, HELP_WANT_TO_END_GAME, HELP_END }; static const u8 sHowTo_Dungeon[] = { HELP_OPENING_MENU, HELP_USING_POKEDEX, HELP_USING_POKEMON, HELP_USING_BAG, HELP_USING_PLAYER, HELP_USING_SAVE, HELP_USING_OPTION, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_END }; static const u8 sTerms_Dungeon[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_TYPE, HELP_TERM_OT, HELP_TERM_ITEM, HELP_TERM_ABILITY, HELP_TERM_FNT, HELP_END }; static const u8 sWhatToDo_Surfing[] = { HELP_I_CANT_GO_ON, HELP_WHAT_IS_THAT_PERSON_LIKE, HELP_OUT_OF_THINGS_TO_DO, HELP_WHAT_IS_A_GYM, HELP_CANT_CATCH_MONS, HELP_WANT_TO_MAKE_MON_STRONGER, HELP_FOE_MONS_TOO_STRONG, HELP_MY_MONS_ARE_HURT, HELP_WHAT_IS_STATUS_PROBLEM, HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, HELP_WHATS_A_TRAINER, HELP_HOW_DO_I_WIN_AGAINST_TRAINER, HELP_WHAT_ARE_MOVES, HELP_WANT_TO_ADD_MORE_MOVES, HELP_WHAT_ARE_HIDDEN_MOVES, HELP_WHAT_DOES_HIDDEN_MOVE_DO, HELP_WANT_TO_END_GAME, HELP_END }; static const u8 sHowTo_Surfing[] = { HELP_OPENING_MENU, HELP_USING_POKEDEX, HELP_USING_POKEMON, HELP_USING_BAG, HELP_USING_PLAYER, HELP_USING_SAVE, HELP_USING_OPTION, HELP_USING_MOVE_OUTSIDE_OF_BATTLE, HELP_END }; static const u8 sTerms_Surfing[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_TYPE, HELP_TERM_OT, HELP_TERM_ITEM, HELP_TERM_ABILITY, HELP_TERM_FNT, HELP_END }; static const u8 sWhatToDo_WildBattle[] = { HELP_WHATS_A_BATTLE, HELP_WHAT_ARE_MOVES, HELP_WHAT_MOVES_SHOULD_I_USE, HELP_WHAT_IS_A_MONS_VITALITY, HELP_MY_MONS_ARE_HURT, HELP_CANT_CATCH_MONS, HELP_CAN_I_BUY_POKEBALLS, HELP_RAN_OUT_OF_POTIONS, HELP_WANT_TO_MAKE_MON_STRONGER, HELP_FOE_MONS_TOO_STRONG, HELP_WHAT_IS_STATUS_PROBLEM, HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, HELP_END }; static const u8 sHowTo_WildBattle[] = { HELP_USING_FIGHT, HELP_USING_POKEMON2, HELP_USING_SHIFT, HELP_USING_SUMMARY2, HELP_USING_BAG2, HELP_USING_AN_ITEM, HELP_USING_POKEBALL, HELP_USING_RUN, HELP_END }; static const u8 sTerms_WildBattle[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_ATTACK, HELP_TERM_DEFENSE, HELP_TERM_SPATK, HELP_TERM_SPDEF, HELP_TERM_SPEED, HELP_TERM_TYPE, HELP_TERM_ABILITY, HELP_TERM_MOVE_TYPE, HELP_TERM_PP, HELP_TERM_POWER, HELP_TERM_ACCURACY, HELP_TERM_STATUS_PROBLEM, HELP_TERM_FNT, HELP_END }; static const u8 sTypeMatchups_WildBattle[] = { HELP_TYPE_MATCHUPS, HELP_END }; static const u8 sWhatToDo_TrainerBattleSingle[] = { HELP_WHATS_A_BATTLE, HELP_WHAT_ARE_MOVES, HELP_WHAT_MOVES_SHOULD_I_USE, HELP_WHAT_IS_A_MONS_VITALITY, HELP_MY_MONS_ARE_HURT, HELP_RAN_OUT_OF_POTIONS, HELP_WANT_TO_MAKE_MON_STRONGER, HELP_FOE_MONS_TOO_STRONG, HELP_WHAT_IS_STATUS_PROBLEM, HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, HELP_END }; static const u8 sHowTo_TrainerBattleSingle[] = { HELP_USING_FIGHT, HELP_USING_POKEMON2, HELP_USING_SHIFT, HELP_USING_SUMMARY2, HELP_USING_BAG2, HELP_USING_AN_ITEM, HELP_USING_RUN, HELP_END }; static const u8 sTerms_TrainerBattleSingle[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_ATTACK, HELP_TERM_DEFENSE, HELP_TERM_SPATK, HELP_TERM_SPDEF, HELP_TERM_SPEED, HELP_TERM_TYPE, HELP_TERM_ABILITY, HELP_TERM_MOVE_TYPE, HELP_TERM_PP, HELP_TERM_POWER, HELP_TERM_ACCURACY, HELP_TERM_STATUS_PROBLEM, HELP_TERM_FNT, HELP_END }; static const u8 sTypeMatchups_TrainerBattleSingle[] = { HELP_TYPE_MATCHUPS, HELP_END }; static const u8 sWhatToDo_TrainerBattleDouble[] = { HELP_WHATS_A_BATTLE, HELP_WHAT_ARE_MOVES, HELP_WHAT_MOVES_SHOULD_I_USE, HELP_WHAT_IS_A_MONS_VITALITY, HELP_MY_MONS_ARE_HURT, HELP_RAN_OUT_OF_POTIONS, HELP_WANT_TO_MAKE_MON_STRONGER, HELP_FOE_MONS_TOO_STRONG, HELP_WHAT_IS_STATUS_PROBLEM, HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, HELP_END }; static const u8 sHowTo_TrainerBattleDouble[] = { HELP_USING_FIGHT, HELP_USING_POKEMON2, HELP_USING_SHIFT, HELP_USING_SUMMARY2, HELP_USING_BAG2, HELP_USING_AN_ITEM, HELP_USING_RUN, HELP_END }; static const u8 sTerms_TrainerBattleDouble[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_ATTACK, HELP_TERM_DEFENSE, HELP_TERM_SPATK, HELP_TERM_SPDEF, HELP_TERM_SPEED, HELP_TERM_TYPE, HELP_TERM_ABILITY, HELP_TERM_MOVE_TYPE, HELP_TERM_PP, HELP_TERM_POWER, HELP_TERM_ACCURACY, HELP_TERM_STATUS_PROBLEM, HELP_TERM_FNT, HELP_END }; static const u8 sTypeMatchups_TrainerBattleDouble[] = { HELP_TYPE_MATCHUPS, HELP_END }; static const u8 sWhatToDo_SafariBattle[] = { HELP_WHAT_DO_I_DO_IN_SAFARI, HELP_WHAT_ARE_SAFARI_RULES, HELP_WANT_TO_END_SAFARI, HELP_END }; static const u8 sHowTo_SafariBattle[] = { HELP_USING_BALL, HELP_USING_BAIT, HELP_USING_ROCK, HELP_USING_RUN, HELP_END }; static const u8 sTerms_SafariBattle[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_ATTACK, HELP_TERM_DEFENSE, HELP_TERM_SPATK, HELP_TERM_SPDEF, HELP_TERM_SPEED, HELP_TERM_TYPE, HELP_TERM_ABILITY, HELP_TERM_MOVE_TYPE, HELP_TERM_PP, HELP_TERM_POWER, HELP_TERM_ACCURACY, HELP_END }; static const u8 sTypeMatchups_SafariBattle[] = { HELP_TYPE_MATCHUPS, HELP_END }; static const u8 sHowTo_PC[] = { HELP_USING_PC, HELP_USING_BILLS_PC, HELP_USING_WITHDRAW, HELP_USING_DEPOSIT, HELP_USING_MOVE, HELP_MOVING_ITEMS, HELP_USING_PLAYERS_PC, HELP_USING_WITHDRAW_ITEM, HELP_USING_DEPOSIT_ITEM, HELP_USING_MAILBOX, HELP_USING_PROF_OAKS_PC, HELP_USING_HALL_OF_FAME, HELP_END }; static const u8 sHowTo_BillsPC[] = { HELP_USING_PC, HELP_USING_BILLS_PC, HELP_USING_WITHDRAW, HELP_USING_DEPOSIT, HELP_USING_MOVE, HELP_MOVING_ITEMS, HELP_USING_PLAYERS_PC, HELP_USING_WITHDRAW_ITEM, HELP_USING_DEPOSIT_ITEM, HELP_USING_MAILBOX, HELP_USING_PROF_OAKS_PC, HELP_USING_HALL_OF_FAME, HELP_END }; static const u8 sHowTo_PlayersPCItems[] = { HELP_USING_PC, HELP_USING_BILLS_PC, HELP_USING_WITHDRAW, HELP_USING_DEPOSIT, HELP_USING_MOVE, HELP_MOVING_ITEMS, HELP_USING_PLAYERS_PC, HELP_USING_WITHDRAW_ITEM, HELP_USING_DEPOSIT_ITEM, HELP_USING_MAILBOX, HELP_USING_PROF_OAKS_PC, HELP_USING_HALL_OF_FAME, HELP_END }; static const u8 sHowTo_PlayersPCMailbox[] = { HELP_USING_PC, HELP_USING_BILLS_PC, HELP_USING_WITHDRAW, HELP_USING_DEPOSIT, HELP_USING_MOVE, HELP_MOVING_ITEMS, HELP_USING_PLAYERS_PC, HELP_USING_WITHDRAW_ITEM, HELP_USING_DEPOSIT_ITEM, HELP_USING_MAILBOX, HELP_USING_PROF_OAKS_PC, HELP_USING_HALL_OF_FAME, HELP_END }; static const u8 sHowTo_PCMisc[] = { HELP_USING_PC, HELP_USING_BILLS_PC, HELP_USING_WITHDRAW, HELP_USING_DEPOSIT, HELP_USING_MOVE, HELP_MOVING_ITEMS, HELP_USING_PLAYERS_PC, HELP_USING_WITHDRAW_ITEM, HELP_USING_DEPOSIT_ITEM, HELP_USING_MAILBOX, HELP_USING_PROF_OAKS_PC, HELP_USING_HALL_OF_FAME, HELP_END }; static const u8 sHowTo_BedroomPC[] = { HELP_USING_HOME_PC, HELP_USING_ITEM_STORAGE, HELP_USING_WITHDRAW_ITEM2, HELP_USING_DEPOSIT_ITEM2, HELP_USING_MAILBOX2, HELP_END }; static const u8 sHowTo_BedroomPCItems[] = { HELP_USING_HOME_PC, HELP_USING_ITEM_STORAGE, HELP_USING_WITHDRAW_ITEM2, HELP_USING_DEPOSIT_ITEM2, HELP_USING_MAILBOX2, HELP_END }; static const u8 sHowTo_BedroomPCMailbox[] = { HELP_USING_HOME_PC, HELP_USING_ITEM_STORAGE, HELP_USING_WITHDRAW_ITEM2, HELP_USING_DEPOSIT_ITEM2, HELP_USING_MAILBOX2, HELP_END }; static const u8 sTerms_Basic[] = { HELP_TERM_LEVEL, HELP_TERM_HP, HELP_TERM_EXP, HELP_TERM_MOVES, HELP_TERM_TM, HELP_TERM_HM_MOVE, HELP_TERM_HM, HELP_TERM_ATTACK, HELP_TERM_DEFENSE, HELP_TERM_SPATK, HELP_TERM_SPDEF, HELP_TERM_SPEED, HELP_TERM_TYPE, HELP_TERM_OT, HELP_TERM_ITEM, HELP_TERM_ABILITY, HELP_TERM_MOVE_TYPE, HELP_TERM_NATURE, HELP_TERM_ID_NO, HELP_TERM_PP, HELP_TERM_POWER, HELP_TERM_ACCURACY, HELP_TERM_STATUS_PROBLEM, HELP_TERM_FNT, HELP_TERM_EVOLUTION, HELP_TERM_ITEMS, HELP_TERM_KEYITEMS, HELP_TERM_POKEBALLS, HELP_TERM_PLAY_TIME, HELP_TERM_MONEY, HELP_TERM_BADGES, HELP_END }; static const u8 sHowTo_KeySystem[] = { HELP_USING_KEY_SYSTEM, HELP_END }; static const u8 sTerms_KeySystem[] = { HELP_TERM_VERSION, HELP_TERM_FR_EXCLUSIVES, HELP_TERM_LG_EXCLUSIVES, HELP_TERM_DIFFICULTY, HELP_TERM_ADVANCED, HELP_TERM_CANCEL, HELP_END }; static const u8 sHowTo_OptionsSubMenu[] = { HELP_USING_OPTIONS_SUBMENU, HELP_END }; static const u8 sTerms_OptionsSubMenu[] = { HELP_TERM_BATTLE_TRANSITIONS, HELP_TERM_BATTLE_INTRO_ANIM, HELP_TERM_MOVE_ANIMATIONS, HELP_TERM_HP_BAR_ANIM_SPEED, HELP_TERM_EXP_BAR_ANIM_SPEED, HELP_TERM_BACK, HELP_END }; static const u8 sHowTo_KeySystemSubMenu[] = { HELP_USING_KEY_SYSTEM_SUBMENU, HELP_END }; static const u8 sTerms_KeySystemSubMenu[] = { HELP_TERM_NUZLOCKE, HELP_TERM_NUZLOCKE_CATCHING, HELP_TERM_NUZLOCKE_LOSING, HELP_TERM_IV_CALC, HELP_TERM_EV_CALC, HELP_TERM_NO_PMC, HELP_TERM_EXP_MOD, HELP_TERM_ADVANCED_KEYS_BACK, HELP_END }; // Cant get this to match as a 2D array but it probably should be one, [HELPCONTEXT_COUNT][TOPIC_COUNT - 1] (Excludes TOPIC_EXIT) static const u8 *const sHelpSystemSubmenuItemLists[HELPCONTEXT_COUNT * (TOPIC_COUNT - 1)] = { NULL, NULL, NULL, NULL, NULL, // HELPCONTEXT_NONE NULL, NULL, NULL, sAboutGame_TitleScreen, NULL, // HELPCONTEXT_TITLE_SCREEN NULL, NULL, NULL, sAboutGame_NewGame, NULL, // HELPCONTEXT_NEW_GAME NULL, sHowTo_NamingScreen, NULL, sAboutGame_NamingScreen, NULL, // HELPCONTEXT_NAMING_SCREEN NULL, sHowTo_Pokedex, NULL, NULL, NULL, // HELPCONTEXT_POKEDEX NULL, sHowTo_PartyMenu, sTerms_PartyMenu, NULL, NULL, // HELPCONTEXT_PARTY_MENU NULL, sHowTo_PokemonInfo, sTerms_PokemonInfo, NULL, NULL, // HELPCONTEXT_POKEMON_INFO NULL, NULL, sTerms_PokemonSkills, NULL, NULL, // HELPCONTEXT_POKEMON_SKILLS NULL, NULL, sTerms_PokemonMoves, NULL, NULL, // HELPCONTEXT_POKEMON_MOVES NULL, sHowTo_Bag, sTerms_Bag, NULL, NULL, // HELPCONTEXT_BAG NULL, sHowTo_TrainerCardFront, sTerms_TrainerCardFront, NULL, NULL, // HELPCONTEXT_TRAINER_CARD_FRONT NULL, sHowTo_TrainerCardBack, NULL, NULL, NULL, // HELPCONTEXT_TRAINER_CARD_BACK NULL, sHowTo_Save, sTerms_Save, NULL, NULL, // HELPCONTEXT_SAVE NULL, sHowTo_Options, sTerms_Options, NULL, NULL, // HELPCONTEXT_OPTIONS sWhatToDo_PlayersHouse, NULL, NULL, sAboutGame_PlayersHouse, NULL, // HELPCONTEXT_PLAYERS_HOUSE sWhatToDo_OaksLab, sHowTo_OaksLab, sTerms_OaksLab, NULL, NULL, // HELPCONTEXT_OAKS_LAB sWhatToDo_PokeCenter, sHowTo_PokeCenter, sTerms_PokeCenter, sAboutGame_PokeCenter, NULL, // HELPCONTEXT_POKECENTER sWhatToDo_Mart, sHowTo_Mart, sTerms_Mart, NULL, NULL, // HELPCONTEXT_MART sWhatToDo_Gym, sHowTo_Gym, sTerms_Gym, NULL, sTypeMatchups_Gym, // HELPCONTEXT_GYM sWhatToDo_Indoors, sHowTo_Indoors, sTerms_Indoors, NULL, NULL, // HELPCONTEXT_INDOORS sWhatToDo_Overworld, sHowTo_Overworld, sTerms_Overworld, NULL, NULL, // HELPCONTEXT_OVERWORLD sWhatToDo_Dungeon, sHowTo_Dungeon, sTerms_Dungeon, NULL, NULL, // HELPCONTEXT_DUNGEON sWhatToDo_Surfing, sHowTo_Surfing, sTerms_Surfing, NULL, NULL, // HELPCONTEXT_SURFING sWhatToDo_WildBattle, sHowTo_WildBattle, sTerms_WildBattle, NULL, sTypeMatchups_WildBattle, // HELPCONTEXT_WILD_BATTLE sWhatToDo_TrainerBattleSingle, sHowTo_TrainerBattleSingle, sTerms_TrainerBattleSingle, NULL, sTypeMatchups_TrainerBattleSingle, // HELPCONTEXT_TRAINER_BATTLE_SINGLE sWhatToDo_TrainerBattleDouble, sHowTo_TrainerBattleDouble, sTerms_TrainerBattleDouble, NULL, sTypeMatchups_TrainerBattleDouble, // HELPCONTEXT_TRAINER_BATTLE_DOUBLE sWhatToDo_SafariBattle, sHowTo_SafariBattle, sTerms_SafariBattle, NULL, sTypeMatchups_SafariBattle, // HELPCONTEXT_SAFARI_BATTLE NULL, sHowTo_PC, NULL, NULL, NULL, // HELPCONTEXT_PC NULL, sHowTo_BillsPC, NULL, NULL, NULL, // HELPCONTEXT_BILLS_PC NULL, sHowTo_PlayersPCItems, NULL, NULL, NULL, // HELPCONTEXT_PLAYERS_PC_ITEMS NULL, sHowTo_PlayersPCMailbox, NULL, NULL, NULL, // HELPCONTEXT_PLAYERS_PC_MAILBOX NULL, sHowTo_PCMisc, NULL, NULL, NULL, // HELPCONTEXT_PC_MISC NULL, sHowTo_BedroomPC, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC NULL, sHowTo_BedroomPCItems, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC_ITEMS NULL, sHowTo_BedroomPCMailbox, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC_MAILBOX NULL, sHowTo_KeySystem, sTerms_KeySystem, NULL, NULL, // HELPCONTEXT_KEY_SYSTEM NULL, sHowTo_OptionsSubMenu, sTerms_OptionsSubMenu, NULL, NULL, // HELPCONTEXT_OPTIONS_SUBMENU NULL, sHowTo_KeySystemSubMenu, sTerms_KeySystemSubMenu, NULL, NULL, // HELPCONTEXT_KEY_SYSTEM_SUBMENU }; static const u16 sUnused[] = INCBIN_U16("graphics/help_system/unused.bin"); static const u8 sHelpSystemContextTopicOrder[TOPIC_COUNT] = { TOPIC_ABOUT_GAME, TOPIC_WHAT_TO_DO, TOPIC_HOW_TO_DO, TOPIC_TERMS, TOPIC_TYPE_MATCHUP, TOPIC_EXIT }; #define CONTEXT_TOPIC_FLAGS(whatToDo, howToDo, terms, aboutGame, typeMatchup, exit) \ { \ [TOPIC_WHAT_TO_DO] = whatToDo, \ [TOPIC_HOW_TO_DO] = howToDo, \ [TOPIC_TERMS] = terms, \ [TOPIC_ABOUT_GAME] = aboutGame, \ [TOPIC_TYPE_MATCHUP] = typeMatchup, \ [TOPIC_EXIT] = exit \ } \ static const bool8 sHelpSystemContextTopicFlags[HELPCONTEXT_COUNT + 1][TOPIC_COUNT] = { [HELPCONTEXT_NONE] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_TITLE_SCREEN] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE), [HELPCONTEXT_NEW_GAME] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE), [HELPCONTEXT_NAMING_SCREEN] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE), [HELPCONTEXT_POKEDEX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_PARTY_MENU] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_POKEMON_INFO] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_POKEMON_SKILLS] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_POKEMON_MOVES] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_BAG] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_TRAINER_CARD_FRONT] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_TRAINER_CARD_BACK] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_SAVE] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_OPTIONS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_PLAYERS_HOUSE] = CONTEXT_TOPIC_FLAGS( TRUE, FALSE, FALSE, TRUE, FALSE, TRUE), [HELPCONTEXT_OAKS_LAB] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_POKECENTER] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, TRUE, FALSE, TRUE), [HELPCONTEXT_MART] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_GYM] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), [HELPCONTEXT_INDOORS] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_OVERWORLD] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_DUNGEON] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_SURFING] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_WILD_BATTLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), [HELPCONTEXT_TRAINER_BATTLE_SINGLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), [HELPCONTEXT_TRAINER_BATTLE_DOUBLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), [HELPCONTEXT_SAFARI_BATTLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), [HELPCONTEXT_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_BILLS_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_PLAYERS_PC_ITEMS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_PLAYERS_PC_MAILBOX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_PC_MISC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_BEDROOM_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_BEDROOM_PC_ITEMS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_BEDROOM_PC_MAILBOX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), [HELPCONTEXT_KEY_SYSTEM] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_OPTIONS_SUBMENU] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_KEY_SYSTEM_SUBMENU] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), [HELPCONTEXT_COUNT] = {} }; static const u16 sMartMaps[] = { MAP_VIRIDIAN_CITY_MART, MAP_PEWTER_CITY_MART, MAP_CERULEAN_CITY_MART, MAP_LAVENDER_TOWN_MART, MAP_VERMILION_CITY_MART, MAP_CELADON_CITY_DEPARTMENT_STORE_1F, MAP_CELADON_CITY_DEPARTMENT_STORE_2F, MAP_CELADON_CITY_DEPARTMENT_STORE_3F, MAP_CELADON_CITY_DEPARTMENT_STORE_4F, MAP_CELADON_CITY_DEPARTMENT_STORE_5F, MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF, MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR, MAP_FUCHSIA_CITY_MART, MAP_CINNABAR_ISLAND_MART, MAP_SAFFRON_CITY_MART, MAP_THREE_ISLAND_MART, MAP_FOUR_ISLAND_MART, MAP_SEVEN_ISLAND_MART, MAP_SIX_ISLAND_MART, MAP_UNDEFINED }; static const u16 sGymMaps[] = { MAP_PEWTER_CITY_GYM, MAP_CERULEAN_CITY_GYM, MAP_VERMILION_CITY_GYM, MAP_CELADON_CITY_GYM, MAP_FUCHSIA_CITY_GYM, MAP_SAFFRON_CITY_GYM, MAP_CINNABAR_ISLAND_GYM, MAP_VIRIDIAN_CITY_GYM, MAP_UNDEFINED }; static const u8 sDungeonMaps[][3] = { { MAP_GROUP(VIRIDIAN_FOREST), MAP_NUM(VIRIDIAN_FOREST), 1 }, { MAP_GROUP(MT_MOON_1F), MAP_NUM(MT_MOON_1F), 3 }, { MAP_GROUP(ROCK_TUNNEL_1F), MAP_NUM(ROCK_TUNNEL_1F), 2 }, { MAP_GROUP(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP_NUM(DIGLETTS_CAVE_NORTH_ENTRANCE), 3 }, { MAP_GROUP(SEAFOAM_ISLANDS_1F), MAP_NUM(SEAFOAM_ISLANDS_1F), 5 }, { MAP_GROUP(VICTORY_ROAD_1F), MAP_NUM(VICTORY_ROAD_1F), 3 }, { MAP_GROUP(CERULEAN_CAVE_1F), MAP_NUM(CERULEAN_CAVE_1F), 3 }, { MAP_GROUP(MT_EMBER_RUBY_PATH_B4F), MAP_NUM(MT_EMBER_RUBY_PATH_B4F), 1 }, { MAP_GROUP(MT_EMBER_SUMMIT_PATH_1F), MAP_NUM(MT_EMBER_SUMMIT_PATH_1F), 3 }, { MAP_GROUP(MT_EMBER_RUBY_PATH_B5F), MAP_NUM(MT_EMBER_RUBY_PATH_B5F), 7 }, { MAP_GROUP(THREE_ISLAND_BERRY_FOREST), MAP_NUM(THREE_ISLAND_BERRY_FOREST), 1 }, { MAP_GROUP(SIX_ISLAND_PATTERN_BUSH), MAP_NUM(SIX_ISLAND_PATTERN_BUSH), 1 }, { MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ENTRANCE), MAP_NUM(FIVE_ISLAND_LOST_CAVE_ENTRANCE), 15 }, { MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), 4 }, { MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), MAP_NUM(SIX_ISLAND_ALTERING_CAVE), 1 }, { MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), 7 } }; void SetHelpContextDontCheckBattle(u8 contextId) { sHelpSystemContextId = contextId; } void SetHelpContext(u8 contextId) { switch (sHelpSystemContextId) { case HELPCONTEXT_WILD_BATTLE: case HELPCONTEXT_TRAINER_BATTLE_SINGLE: case HELPCONTEXT_TRAINER_BATTLE_DOUBLE: case HELPCONTEXT_SAFARI_BATTLE: if (contextId == HELPCONTEXT_BAG || contextId == HELPCONTEXT_PARTY_MENU || contextId == HELPCONTEXT_POKEMON_INFO || contextId == HELPCONTEXT_POKEMON_SKILLS || contextId == HELPCONTEXT_POKEMON_MOVES) break; // fallthrough default: sHelpSystemContextId = contextId; break; } } void Script_SetHelpContext(void) { sHelpSystemContextId = gSpecialVar_0x8004; } void BackupHelpContext(void) { gHelpContextIdBackup = sHelpSystemContextId; } void RestoreHelpContext(void) { sHelpSystemContextId = gHelpContextIdBackup; } static bool32 IsInMartMap(void) { return IsCurrentMapInArray(sMartMaps); } static bool32 IsInGymMap(void) { return IsCurrentMapInArray(sGymMaps); } static bool32 IsCurrentMapInArray(const u16 * mapIdxs) { u16 mapIdx = (gSaveBlock1Ptr->location.mapGroup << 8) + gSaveBlock1Ptr->location.mapNum; s32 i; for (i = 0; mapIdxs[i] != MAP_UNDEFINED; i++) { if (mapIdxs[i] == mapIdx) return TRUE; } return FALSE; } static bool8 IsInDungeonMap(void) { u8 i, j; for (i = 0; i < NELEMS(sDungeonMaps); i++) { for (j = 0; j < sDungeonMaps[i][2]; j++) { if ( sDungeonMaps[i][0] == gSaveBlock1Ptr->location.mapGroup && sDungeonMaps[i][1] + j == gSaveBlock1Ptr->location.mapNum && (i != 15 /* TANOBY */ || FlagGet(FLAG_SYS_UNLOCKED_TANOBY_RUINS) == TRUE) ) return TRUE; } } return FALSE; } #define IN_PLAYERS_HOUSE \ ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) \ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) \ || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) \ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F))) \ #define IN_OAKS_LAB \ (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB) \ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB)) \ void SetHelpContextForMap(void) { HelpSystem_EnableToggleWithRButton(); if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) SetHelpContext(HELPCONTEXT_SURFING); else if (IsInDungeonMap()) SetHelpContext(HELPCONTEXT_DUNGEON); else if (IsMapTypeIndoors(gMapHeader.mapType)) { if (IN_PLAYERS_HOUSE) SetHelpContext(HELPCONTEXT_PLAYERS_HOUSE); else if (IN_OAKS_LAB) SetHelpContext(HELPCONTEXT_OAKS_LAB); else if (IsCurMapPokeCenter() == TRUE) SetHelpContext(HELPCONTEXT_POKECENTER); else if (IsInMartMap() == TRUE) SetHelpContext(HELPCONTEXT_MART); else if (IsInGymMap() == TRUE) SetHelpContext(HELPCONTEXT_GYM); else SetHelpContext(HELPCONTEXT_INDOORS); } else SetHelpContext(HELPCONTEXT_OVERWORLD); } bool8 HelpSystem_UpdateHasntSeenIntro(void) { if (sSeenHelpSystemIntro == TRUE) return FALSE; if (gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID && FlagGet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO)) return FALSE; FlagSet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO); sSeenHelpSystemIntro = TRUE; return TRUE; } bool8 HelpSystem_IsSinglePlayer(void) { if (gReceivedRemoteLinkPlayers == TRUE) return FALSE; return TRUE; } void HelpSystem_Disable(void) { gHelpSystemEnabled = FALSE; } void HelpSystem_Enable(void) { if (!QL_IS_PLAYBACK_STATE) { gHelpSystemEnabled = TRUE; HelpSystem_EnableToggleWithRButton(); } } void HelpSystem_DisableToggleWithRButton(void) { gHelpSystemToggleWithRButtonDisabled = FALSE; } void HelpSystem_EnableToggleWithRButton(void) { gHelpSystemToggleWithRButtonDisabled = FALSE; } static void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { helpListMenu->sub.items = listMenuItemsBuffer; helpListMenu->sub.totalItems = 1; helpListMenu->sub.maxShowed = 1; helpListMenu->sub.left = 1; helpListMenu->sub.top = 4; } static void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer); PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_PickOkEnd); HelpSystem_InitListMenuController(helpListMenu, 0, gHelpSystemState.scrollMain); PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); HS_ShowOrHideMainWindowText(1); HS_ShowOrHideControlsGuideInTopRight(1); } static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { u8 i; u8 totalItems = 0; for (i = 0; i < TOPIC_COUNT; i++) { if (sHelpSystemContextTopicFlags[sHelpSystemContextId][sHelpSystemContextTopicOrder[i]] == TRUE) { listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]]; listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i]; totalItems++; } } listMenuItemsBuffer[totalItems - 1].index = -2; helpListMenu->sub.totalItems = totalItems; helpListMenu->sub.maxShowed = totalItems; helpListMenu->sub.left = 0; } static void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { HS_SetMainWindowBgBrightness(0); HS_ShowOrHideHeaderLine_Darker_FooterStyle(0); HS_ShowOrHideHeaderAndFooterLines_Lighter(1); ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer); PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_PickOkCancel); HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos); HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState.topic], 0, 0); HS_ShowOrHideMainWindowText(1); HS_ShowOrHideControlsGuideInTopRight(1); } static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { u8 totalItems = 0; const u8 * submenuItems = sHelpSystemSubmenuItemLists[sHelpSystemContextId * 5 + gHelpSystemState.topic]; // accessing as 2D array u32 i; for (i = 0; submenuItems[i] != HELP_END; i++) { if (IsHelpSystemSubmenuEnabled(submenuItems[i]) == TRUE) { if (gHelpSystemState.topic == TOPIC_WHAT_TO_DO) listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[submenuItems[i]]; else if (gHelpSystemState.topic == TOPIC_HOW_TO_DO) listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[submenuItems[i]]; else if (gHelpSystemState.topic == TOPIC_TERMS) listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]]; else if (gHelpSystemState.topic == TOPIC_ABOUT_GAME) listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[submenuItems[i]]; else // TOPIC_TYPE_MATCHUP listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[submenuItems[i]]; listMenuItemsBuffer[totalItems].index = submenuItems[i]; totalItems++; } } if (HelpSystem_ShouldShowBasicTerms() == TRUE) { for (i = 0, submenuItems = sTerms_Basic; submenuItems[i] != HELP_END; i++) { listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]]; listMenuItemsBuffer[totalItems].index = submenuItems[i]; totalItems++; } } listMenuItemsBuffer[totalItems].label = Help_Text_Cancel; listMenuItemsBuffer[totalItems].index = -2; totalItems++; helpListMenu->sub.totalItems = totalItems; helpListMenu->sub.maxShowed = 7; helpListMenu->sub.left = 0; helpListMenu->sub.top = 21; } static bool8 HelpSystem_ShouldShowBasicTerms(void) { if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gHelpSystemState.topic == TOPIC_TERMS) return TRUE; return FALSE; } static bool8 IsHelpSystemSubmenuEnabled(u8 id) { u8 i = 0; if (gHelpSystemState.topic == TOPIC_WHAT_TO_DO) { switch (id) { case HELP_PLAYING_FOR_FIRST_TIME: case HELP_WHAT_SHOULD_I_BE_DOING: case HELP_CANT_GET_OUT_OF_ROOM: case HELP_TALKED_TO_EVERYONE_NOW_WHAT: case HELP_OUT_OF_THINGS_TO_DO: case HELP_NOTHING_I_WANT_TO_KNOW: case HELP_WHATS_A_MON: case HELP_WHAT_DO_I_DO_IN_SAFARI: case HELP_WHAT_ARE_SAFARI_RULES: case HELP_WANT_TO_END_SAFARI: return TRUE; case HELP_CANT_FIND_PERSON_I_WANT: return FlagGet(FLAG_VISITED_OAKS_LAB); case HELP_SOMEONE_BLOCKING_MY_WAY: case HELP_WHAT_ARE_MY_ADVENTURE_BASICS: case HELP_HOW_DO_I_PREPARE_FOR_BATTLE: case HELP_WHAT_IS_STATUS_PROBLEM: case HELP_RAN_OUT_OF_POTIONS: case HELP_WHATS_POKEMON_CENTER: case HELP_WHATS_POKEMON_MART: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY); case HELP_I_CANT_GO_ON: return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY); case HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT: case HELP_WHATS_A_TRAINER: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST); case HELP_WHAT_HAPPENED_TO_ITEM_I_GOT: case HELP_WHEN_CAN_I_USE_ITEM: case HELP_HOW_DO_I_PROGRESS: case HELP_WHATS_A_BATTLE: case HELP_WHAT_IS_A_MONS_VITALITY: case HELP_MY_MONS_ARE_HURT: case HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT: case HELP_WHERE_DO_MONS_APPEAR: case HELP_WHAT_MOVES_SHOULD_I_USE: case HELP_WANT_TO_MAKE_MON_STRONGER: case HELP_WANT_TO_END_GAME: return FlagGet(FLAG_SYS_POKEMON_GET); case HELP_CANT_CATCH_MONS: case HELP_CAN_I_BUY_POKEBALLS: return FlagGet(FLAG_SYS_POKEDEX_GET); case HELP_HOW_ARE_CAVES_DIFFERENT: case HELP_WHAT_DO_I_DO_IN_CAVE: case HELP_HOW_DO_I_WIN_AGAINST_TRAINER: case HELP_FOE_MONS_TOO_STRONG: case HELP_WHAT_ARE_MOVES: case HELP_WANT_TO_ADD_MORE_MOVES: return FlagGet(FLAG_BADGE01_GET); case HELP_WHAT_ARE_HIDDEN_MOVES: case HELP_WHAT_DOES_HIDDEN_MOVE_DO: return HasGottenAtLeastOneHM(); case HELP_WHAT_IS_THAT_PERSON_LIKE: return FlagGet(FLAG_GOT_FAME_CHECKER); case HELP_WHAT_IS_A_GYM: return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY); } return FALSE; } if (gHelpSystemState.topic == TOPIC_HOW_TO_DO) { switch (id) { case HELP_USING_BAG: case HELP_USING_PLAYER: case HELP_USING_SAVE: case HELP_USING_OPTION: case HELP_ENTERING_NAME: case HELP_USING_PC: case HELP_USING_BILLS_PC: case HELP_USING_WITHDRAW: case HELP_USING_DEPOSIT: case HELP_USING_MOVE: case HELP_MOVING_ITEMS: case HELP_USING_PLAYERS_PC: case HELP_USING_WITHDRAW_ITEM: case HELP_USING_DEPOSIT_ITEM: case HELP_USING_MAILBOX: case HELP_OPENING_MENU: case HELP_USING_BAG2: case HELP_USING_HOME_PC: case HELP_USING_ITEM_STORAGE: case HELP_USING_WITHDRAW_ITEM2: case HELP_USING_DEPOSIT_ITEM2: case HELP_USING_MAILBOX2: case HELP_USING_BALL: case HELP_USING_BAIT: case HELP_USING_ROCK: case HELP_USING_KEY_SYSTEM: case HELP_SORTING_BAG: case HELP_USING_OPTIONS_SUBMENU: case HELP_USING_KEY_SYSTEM_SUBMENU: return TRUE; case HELP_USING_POKEDEX: case HELP_USING_PROF_OAKS_PC: case HELP_READING_POKEDEX: return FlagGet(FLAG_SYS_POKEDEX_GET); case HELP_USING_TOWN_MAP: return CheckBagHasItem(ITEM_TOWN_MAP, 1); case HELP_USING_POKEMON: case HELP_USING_SUMMARY: case HELP_USING_ITEM: case HELP_USING_AN_ITEM: case HELP_USING_KEYITEM: case HELP_USING_POKEBALL: case HELP_USING_POTION: case HELP_USING_FIGHT: case HELP_USING_POKEMON2: case HELP_USING_SUMMARY2: case HELP_USING_RUN: case HELP_REGISTER_KEY_ITEM: return FlagGet(FLAG_SYS_POKEMON_GET); case HELP_USING_SWITCH: case HELP_USING_SHIFT: // Only show if player has caught mon after starter if (GetKantoPokedexCount(1) > 1) return TRUE; return FALSE; case HELP_USING_TM: return FlagGet(FLAG_BADGE01_GET); case HELP_USING_HM: case HELP_USING_MOVE_OUTSIDE_OF_BATTLE: return HasGottenAtLeastOneHM(); case HELP_RIDING_BICYCLE: return FlagGet(FLAG_GOT_BICYCLE); case HELP_USING_HALL_OF_FAME: return FlagGet(FLAG_SYS_GAME_CLEAR); } return FALSE; } if (gHelpSystemState.topic == TOPIC_TERMS) { if (HelpSystem_ShouldShowBasicTerms() == TRUE) { // After defeating Brock, all basic terms are added // This checks to make sure they arent added twice for (i = 0; sTerms_Basic[i] != HELP_END; i++) { if (sTerms_Basic[i] == id) return FALSE; } } switch (id) { case HELP_TERM_MONEY: case HELP_TERM_ID_NO: case HELP_TERM_ITEMS: case HELP_TERM_KEYITEMS: case HELP_TERM_POKEBALLS: case HELP_TERM_POKEDEX: case HELP_TERM_PLAY_TIME: case HELP_TERM_BADGES: case HELP_TERM_TEXT_SPEED: case HELP_TERM_BATTLE_SCENE: case HELP_TERM_BATTLE_STYLE: case HELP_TERM_SOUND: case HELP_TERM_BUTTON_MODE: case HELP_TERM_FRAME: case HELP_TERM_CANCEL: case HELP_TERM_TM: case HELP_TERM_EVOLUTION: return TRUE; case HELP_TERM_HP: case HELP_TERM_EXP: case HELP_TERM_ATTACK: case HELP_TERM_DEFENSE: case HELP_TERM_SPATK: case HELP_TERM_SPDEF: case HELP_TERM_SPEED: case HELP_TERM_LEVEL: case HELP_TERM_TYPE: case HELP_TERM_OT: case HELP_TERM_ITEM: case HELP_TERM_ABILITY: case HELP_TERM_NATURE: case HELP_TERM_POWER: case HELP_TERM_ACCURACY: case HELP_TERM_FNT: return FlagGet(FLAG_SYS_POKEMON_GET); case HELP_TERM_HM: case HELP_TERM_HM_MOVE: return HasGottenAtLeastOneHM(); case HELP_TERM_MOVES: case HELP_TERM_MOVE_TYPE: case HELP_TERM_PP: case HELP_TERM_STATUS_PROBLEM: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST); } return TRUE; } if (gHelpSystemState.topic == TOPIC_ABOUT_GAME) { switch (id) { case HELP_GAME_FUNDAMENTALS_2: return FlagGet(FLAG_BADGE01_GET); case HELP_GAME_FUNDAMENTALS_3: return FlagGet(FLAG_BADGE02_GET); } return TRUE; } if (gHelpSystemState.topic == TOPIC_TYPE_MATCHUP) { return TRUE; } return FALSE; } static bool8 HasGottenAtLeastOneHM(void) { if (FlagGet(FLAG_GOT_HM01) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM02) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM03) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM04) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM05) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM06) == TRUE) return TRUE; if (FlagGet(FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_HM07) == TRUE) return TRUE; if (FlagGet(FLAG_SYS_CAN_LINK_WITH_RS) == TRUE) return FALSE; return FALSE; } bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { switch (helpListMenu->state) { case 8: return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer); case 9: return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer); case 10: return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer); case 0: return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer); case 1: return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer); case 2: return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer); case 3: return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer); case 4: return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer); case 5: return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer); case 6: return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer); } return FALSE; } bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_A_Next); PrintWelcomeMessageOnPanel1(); HS_ShowOrHideMainWindowText(1); HS_ShowOrHideControlsGuideInTopRight(1); helpListMenu->state = 9; return TRUE; } bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); helpListMenu->state = 10; } return TRUE; } bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { gHelpSystemState.scrollMain = 0; ResetHelpSystemCursor(helpListMenu); BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); helpListMenu->state = 0; return TRUE; } bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 input = HelpSystem_GetMenuInput(); switch (input) { case -6: case -2: return FALSE; case -5: case -4: PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); break; case -3: case -1: break; default: gHelpSystemState.topic = input; helpListMenu->state = 1; break; } return TRUE; } bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { gHelpSystemState.level = 1; gHelpSystemState.scrollMain = helpListMenu->cursorPos; ResetHelpSystemCursor(helpListMenu); BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); HS_UpdateMenuScrollArrows(); HelpSystem_SetInputDelay(2); helpListMenu->state = 3; return TRUE; } bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { HS_ShowOrHideScrollArrows(0, 0); HS_ShowOrHideScrollArrows(1, 0); gHelpSystemState.level = 0; BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); helpListMenu->state = 0; return TRUE; } bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 input = HelpSystem_GetMenuInput(); switch (input) { case -6: return FALSE; case -2: helpListMenu->state = 2; break; case -5: case -4: case -3: case -1: break; default: gHelpSystemState.scrollSub = input; helpListMenu->state = 4; break; } return TRUE; } void HelpSystem_PrintTopicLabel(void) { HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState.topic], 0, 0); } bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { gHelpSystemState.level = 2; HS_ShowOrHideMainWindowText(0); HelpSystem_FillPanel1(); PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_AorBtoCancel); HS_SetMainWindowBgBrightness(1); HS_ShowOrHideHeaderAndFooterLines_Darker(1); if (gHelpSystemState.topic == TOPIC_WHAT_TO_DO) { HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemSpecializedQuestionTextPtrs[gHelpSystemState.scrollSub], sHelpSystemSpecializedAnswerTextPtrs[gHelpSystemState.scrollSub]); } else if (gHelpSystemState.topic == TOPIC_HOW_TO_DO) { HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemMenuTopicTextPtrs[gHelpSystemState.scrollSub], sHelpSystemHowToUseMenuTextPtrs[gHelpSystemState.scrollSub]); } else if (gHelpSystemState.topic == TOPIC_TERMS) { HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemTermTextPtrs[gHelpSystemState.scrollSub], sHelpSystemTermDefinitionsTextPtrs[gHelpSystemState.scrollSub]); } else if (gHelpSystemState.topic == TOPIC_ABOUT_GAME) { HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemGeneralTopicTextPtrs[gHelpSystemState.scrollSub], sHelpSystemGeneralTopicDescriptionTextPtrs[gHelpSystemState.scrollSub]); } else // TOPIC_TYPE_MATCHUP { HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemTypeMatchupTextPtrs[gHelpSystemState.scrollSub], sHelpSystemTypeMatchupDescriptionTextPtrs[gHelpSystemState.scrollSub]); } HS_ShowOrHideMainWindowText(1); HS_ShowOrHideControlsGuideInTopRight(1); helpListMenu->state = 6; return TRUE; } bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { gHelpSystemState.level = 1; BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); HS_UpdateMenuScrollArrows(); HelpSystem_SetInputDelay(2); helpListMenu->state = 3; return TRUE; } bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); helpListMenu->state = 5; return TRUE; } if (JOY_NEW(L_BUTTON | R_BUTTON)) return FALSE; return TRUE; } static void PrintWelcomeMessageOnPanel1(void) { HelpSystem_FillPanel1(); HelpSystem_PrintTextAt(Help_Text_Greetings, 0, 0); } static void PrintTextOnPanel2Row52RightAlign(const u8 * str) { HelpSystem_FillPanel2(); HelpSystem_PrintTextRightAlign_Row52(str); } u8 GetHelpSystemMenuLevel(void) { return gHelpSystemState.level; } static void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu) { helpListMenu->itemsAbove = 0; helpListMenu->cursorPos = 0; } static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index; if (index == -2) HelpSystem_PrintTopicMouseoverDescription(sHelpSystemTopicMouseoverDescriptionPtrs[5]); else HelpSystem_PrintTopicMouseoverDescription(sHelpSystemTopicMouseoverDescriptionPtrs[index]); HS_ShowOrHideToplevelTooltipWindow(1); } ================================================ FILE: src/help_system_util.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "m4a.h" #include "event_data.h" #include "help_system.h" #include "list_menu.h" #include "strings.h" #include "constants/songs.h" #define ZERO 0 bool8 gHelpSystemEnabled; struct HelpSystemVideoState { /*0x00*/ MainCallback savedVblankCb; /*0x04*/ MainCallback savedHblankCb; /*0x08*/ u16 savedDispCnt; /*0x0a*/ u16 savedBg0Cnt; /*0x0c*/ u16 savedBg0Hofs; /*0x0e*/ u16 savedBg0Vofs; /*0x10*/ u16 savedBldCnt; /*0x12*/ u8 savedTextColor[3]; /*0x15*/ u8 state; }; static EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0}; EWRAM_DATA u8 gDisableHelpSystemVolumeReduce = 0; EWRAM_DATA bool8 gHelpSystemToggleWithRButtonDisabled = FALSE; static EWRAM_DATA u8 sDelayTimer = 0; static EWRAM_DATA u8 sInHelpSystem = 0; static EWRAM_DATA struct HelpSystemVideoState sVideoState = {0}; EWRAM_DATA struct HelpSystemListMenu gHelpSystemListMenu = {0}; EWRAM_DATA struct ListMenuItem gHelpSystemListMenuItems[52] = {0}; static const u16 sTiles[] = INCBIN_U16("graphics/help_system/bg_tiles.4bpp"); static const u16 sPals[] = INCBIN_U16("graphics/help_system/bg_tiles.gbapal"); u8 RunHelpSystemCallback(void) { s32 i; switch (sVideoState.state) { case 0: sInHelpSystem = 0; if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_HELP && (gSaveBlock1Ptr->keyFlags.inKeySystemMenu != 1 && !FlagGet(FLAG_SYS_IN_OPTIONS_MENU))) return 0; if (JOY_NEW(L_BUTTON)) { if (!HelpSystem_IsSinglePlayer() || !gHelpSystemEnabled) { PlaySE(SE_HELP_ERROR); return 0; } m4aMPlayStop(&gMPlayInfo_SE1); m4aMPlayStop(&gMPlayInfo_SE2); PlaySE(SE_HELP_OPEN); if (!gDisableHelpSystemVolumeReduce) m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x80); SaveCallbacks(); sInHelpSystem = 1; sVideoState.state = 1; } break; case 1: SaveMapTiles(); SaveMapGPURegs(); SaveMapTextColors(); (*(vu16 *)PLTT) = sPals[15]; SetGpuReg(REG_OFFSET_DISPCNT, 0); sVideoState.state = 2; break; case 2: RequestDma3Fill(0, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); RequestDma3Copy(sPals, (void *)PLTT, sizeof(sPals), DMA3_16BIT); RequestDma3Copy(sTiles, gDecompressionBuffer + 0x3EE0, sizeof(sTiles), DMA3_16BIT); sVideoState.state = 3; break; case 3: HS_BufferFillMapWithTile1FF(); HelpSystem_FillPanel3(); HelpSystem_FillPanel2(); HelpSystem_PrintTextInTopLeftCorner(gString_Help); HS_ShowOrHideWordHELPinTopLeft(1); if (HelpSystem_UpdateHasntSeenIntro() == TRUE) HelpSystemSubroutine_PrintWelcomeMessage(&gHelpSystemListMenu, gHelpSystemListMenuItems); else HelpSystemSubroutine_WelcomeEndGotoMenu(&gHelpSystemListMenu, gHelpSystemListMenuItems); HS_ShowOrHideHeaderAndFooterLines_Lighter(1); HS_ShowOrHideVerticalBlackBarsAlongSides(1); CommitTilemap(); sVideoState.state = 4; break; case 4: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON); sVideoState.state = 5; break; case 5: if (!RunHelpMenuSubroutine(&gHelpSystemListMenu, gHelpSystemListMenuItems)) { PlaySE(SE_HELP_CLOSE); sVideoState.state = 6; } break; case 6: SetGpuReg(REG_OFFSET_DISPCNT, 0); RestoreMapTiles(); for (i = 0; i < 0x200; i += 2) { *((vu16 *)(PLTT + 0x000 + i)) = sPals[15]; *((vu16 *)(PLTT + 0x200 + i)) = sPals[15]; } sVideoState.state = 7; break; case 7: if (!gDisableHelpSystemVolumeReduce) m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); RestoreMapTextColors(); RestoreGPURegs(); sVideoState.state = 8; break; case 8: RestoreCallbacks(); sInHelpSystem = 0; sVideoState.state = 0; break; } return sVideoState.state; } void SaveCallbacks(void) { vu16 * dma; sVideoState.savedVblankCb = gMain.vblankCallback; sVideoState.savedHblankCb = gMain.hblankCallback; gMain.vblankCallback = NULL; gMain.hblankCallback = NULL; dma = (void *)REG_ADDR_DMA0; dma[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); dma[5] &= ~DMA_ENABLE; dma[5]; } void SaveMapGPURegs(void) { sVideoState.savedDispCnt = GetGpuReg(REG_OFFSET_DISPCNT); sVideoState.savedBg0Cnt = GetGpuReg(REG_OFFSET_BG0CNT); sVideoState.savedBg0Hofs = GetGpuReg(REG_OFFSET_BG0HOFS); sVideoState.savedBg0Vofs = GetGpuReg(REG_OFFSET_BG0VOFS); sVideoState.savedBldCnt = GetGpuReg(REG_OFFSET_BLDCNT); } void SaveMapTiles(void) { RequestDma3Copy((void *)BG_CHAR_ADDR(3), sMapTilesBackup, BG_CHAR_SIZE, DMA3_16BIT); } void SaveMapTextColors(void) { SaveTextColors( &sVideoState.savedTextColor[0], &sVideoState.savedTextColor[1], &sVideoState.savedTextColor[2] ); } void RestoreCallbacks(void) { gMain.vblankCallback = sVideoState.savedVblankCb; gMain.hblankCallback = sVideoState.savedHblankCb; } void RestoreGPURegs(void) { SetGpuReg(REG_OFFSET_BLDCNT, sVideoState.savedBldCnt); SetGpuReg(REG_OFFSET_BG0HOFS, sVideoState.savedBg0Hofs); SetGpuReg(REG_OFFSET_BG0VOFS, sVideoState.savedBg0Vofs); SetGpuReg(REG_OFFSET_BG0CNT, sVideoState.savedBg0Cnt); SetGpuReg(REG_OFFSET_DISPCNT, sVideoState.savedDispCnt); } void RestoreMapTiles(void) { RequestDma3Copy(sMapTilesBackup, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); } void RestoreMapTextColors(void) { RestoreTextColors( &sVideoState.savedTextColor[0], &sVideoState.savedTextColor[1], &sVideoState.savedTextColor[2] ); } void CommitTilemap(void) { RequestDma3Copy(gDecompressionBuffer, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); } void HS_DrawBgTilemapRect(u16 baseTile, u8 left, u8 top, u8 width, u8 height, u16 increment) { u16 i, j; for (i = top; i < top + height; i++) { for (j = left; j < left + width; j++) { *((u16 *)(gDecompressionBuffer + 0x3800 + 64 * i + 2 * j)) = baseTile; baseTile += increment; } } CommitTilemap(); } void HS_BufferFillMapWithTile1FF(void) { HS_DrawBgTilemapRect(0x1FF, 0, 0, 30, 20, 0); } void HS_ShowOrHideWordHELPinTopLeft(u8 mode) { switch (mode) { case 0: HS_DrawBgTilemapRect(0x1FF, 1, 0, 7, 2, 0); break; case 1: HS_DrawBgTilemapRect(0x1E8, 1, 0, 7, 2, 1); break; } } void HS_ShowOrHideControlsGuideInTopRight(u8 mode) { switch (mode) { case 0: HS_DrawBgTilemapRect(0x1FF, 13, 0, 16, 2, 0); break; case 1: HS_DrawBgTilemapRect(0x1A0, 13, 0, 16, 2, 1); break; } } void HS_ShowOrHideMainWindowText(u8 mode) { switch (mode) { case 0: HS_DrawBgTilemapRect(0x1FF, 2, 3, 26, 16, 0); break; case 1: HS_DrawBgTilemapRect(0x000, 2, 3, 26, 16, 1); break; } } void HS_SetMainWindowBgBrightness(u8 mode) { switch (mode) { case 0: // Brighter HS_DrawBgTilemapRect(0x1FF, 1, 3, 28, 16, 0); break; case 1: // Darker HS_DrawBgTilemapRect(0x1FA, 1, 3, 28, 17, 0); break; } } void HS_ShowOrHideToplevelTooltipWindow(u8 mode) { switch (mode) { case 0: HS_DrawBgTilemapRect(0x1FF, 2, 14, 26, 5, 0); break; case 1: HS_DrawBgTilemapRect(0x11E, 2, 14, 26, 5, 1); break; } } void HS_ShowOrHideHeaderAndFooterLines_Lighter(u8 mode) { switch (mode) { case 0: HS_DrawBgTilemapRect(0x1FF, 1, 2, 28, 1, 0); HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0); break; case 1: HS_DrawBgTilemapRect(0x1F7, 1, 2, 28, 1, 0); HS_DrawBgTilemapRect(0x1F8, 1, 19, 28, 1, 0); break; } } void HS_ShowOrHideHeaderAndFooterLines_Darker(u8 mode) { switch (mode) { case 0: HS_DrawBgTilemapRect(0x1FF, 1, 2, 28, 1, 0); HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0); break; case 1: HS_DrawBgTilemapRect(0x1FB, 1, 2, 28, 1, 0); HS_DrawBgTilemapRect(0x1FC, 1, 19, 28, 1, 0); break; } } void HS_ShowOrHideVerticalBlackBarsAlongSides(u8 mode) { switch (mode) { case 0: HS_DrawBgTilemapRect(0x1FF, 0, 0, 1, 20, 0); HS_DrawBgTilemapRect(0x1FF, 29, 0, 1, 20, 0); break; case 1: HS_DrawBgTilemapRect(0x1F9, 0, 0, 1, 20, 0); HS_DrawBgTilemapRect(0x1F9, 29, 0, 1, 20, 0); break; } } void HS_ShowOrHideHeaderLine_Darker_FooterStyle(u8 mode) { switch (mode) { case 0: HS_DrawBgTilemapRect(0x1FF, 1, 5, 28, 1, 0); break; case 1: HS_DrawBgTilemapRect(0x1FC, 1, 5, 28, 1, 0); break; } } void HS_ShowOrHideScrollArrows(u8 which, u8 mode) { switch (mode) { case 0: HS_DrawBgTilemapRect(0x1FF, 28, 3, 1, 1, 0); HS_DrawBgTilemapRect(0x1FF, 28, 18, 1, 1, 0); break; case 1: if (which == 0) // top HS_DrawBgTilemapRect(0x1FE, 28, 3, 1, 1, 0); else // bottom HS_DrawBgTilemapRect(0x1FD, 28, 18, 1, 1, 0); break; } } void HelpSystemRenderText(u8 fontId, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height) { // fontId -> sp+24 // dest -> sp+28 // src -> r9 // x -> sp+34 // y -> r10 // width -> sp+2C // height -> sp+30 struct Bitmap srcBlit; struct Bitmap destBlit; u8 orig_x = x; u8 i = 0; s32 clearPixels = 0; while (1) { u16 curChar = *src; src++; switch (curChar) { case EOS: return; case CHAR_NEWLINE: x = orig_x; y += gGlyphInfo.height + 1; break; case PLACEHOLDER_BEGIN: curChar = *src; src++; if (curChar == PLACEHOLDER_ID_PLAYER) { for (i = 0; i < 10; i++) { if (gSaveBlock2Ptr->playerName[i] == EOS) { break; } DecompressAndRenderGlyph(fontId, gSaveBlock2Ptr->playerName[i], &srcBlit, &destBlit, dest, x, y, width, height); // This is required to match a dummy [sp+#0x24] read here if (fontId == FONT_SMALL) { x += gGlyphInfo.width; } else { x += gGlyphInfo.width + ZERO; } } } else if (curChar == PLACEHOLDER_ID_STRING_VAR_1) { for (i = 0; ; i++) { if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC) == TRUE) { if (gString_Bill[i] == EOS) { break; } DecompressAndRenderGlyph(fontId, gString_Bill[i], &srcBlit, &destBlit, dest, x, y, width, height); } else { if (gString_Someone[i] == EOS) { break; } DecompressAndRenderGlyph(fontId, gString_Someone[i], &srcBlit, &destBlit, dest, x, y, width, height); } if (fontId == FONT_SMALL) { x += gGlyphInfo.width; } else { x += gGlyphInfo.width + ZERO; } } } break; case CHAR_PROMPT_SCROLL: case CHAR_PROMPT_CLEAR: x = orig_x; y += gGlyphInfo.height + 1; break; case EXT_CTRL_CODE_BEGIN: curChar = *src; src++; switch (curChar) { case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: src++; //fallthrough case EXT_CTRL_CODE_PLAY_BGM: case EXT_CTRL_CODE_PLAY_SE: src++; //fallthrough case EXT_CTRL_CODE_COLOR: case EXT_CTRL_CODE_HIGHLIGHT: case EXT_CTRL_CODE_SHADOW: case EXT_CTRL_CODE_PALETTE: case EXT_CTRL_CODE_FONT: case EXT_CTRL_CODE_PAUSE: case EXT_CTRL_CODE_ESCAPE: case EXT_CTRL_CODE_SHIFT_RIGHT: case EXT_CTRL_CODE_SHIFT_DOWN: src++; case EXT_CTRL_CODE_RESET_FONT: case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS: case EXT_CTRL_CODE_WAIT_SE: case EXT_CTRL_CODE_FILL_WINDOW: break; case EXT_CTRL_CODE_CLEAR: case EXT_CTRL_CODE_SKIP: src++; break; case EXT_CTRL_CODE_CLEAR_TO: { clearPixels = *src + orig_x - x; if (clearPixels > 0) { destBlit.pixels = dest; destBlit.width = width * 8; destBlit.height = height * 8; FillBitmapRect4Bit(&destBlit, x, y, clearPixels, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT), 0); x += clearPixels; } src++; break; } case EXT_CTRL_CODE_MIN_LETTER_SPACING: src++; break; case EXT_CTRL_CODE_JPN: case EXT_CTRL_CODE_ENG: break; } break; case CHAR_KEYPAD_ICON: curChar = *src; src++; srcBlit.pixels = (u8 *)&gKeypadIconTiles[0x20 * GetKeypadIconTileOffset(curChar)]; srcBlit.width = 0x80; srcBlit.height = 0x80; destBlit.pixels = dest; destBlit.width = width * 8; destBlit.height = height * 8; BlitBitmapRect4Bit(&srcBlit, &destBlit, 0, 0, x, y, GetKeypadIconWidth(curChar), GetKeypadIconHeight(curChar), 0); x += GetKeypadIconWidth(curChar); break; case CHAR_EXTRA_SYMBOL: curChar = *src + 0x100; src++; //fallthrough default: if (curChar == CHAR_SPACE) { if (fontId == FONT_SMALL) { x += 5; } else { x += 4; } } else { DecompressAndRenderGlyph(fontId, curChar, &srcBlit, &destBlit, dest, x, y, width, height); if (fontId == FONT_SMALL) { x += gGlyphInfo.width; } else { x += gGlyphInfo.width + ZERO; } } break; } } } void DecompressAndRenderGlyph(u8 fontId, u16 glyph, struct Bitmap *srcBlit, struct Bitmap *destBlit, u8 *destBuffer, u8 x, u8 y, u8 width, u8 height) { if (fontId == FONT_SMALL) DecompressGlyph_Small(glyph, FALSE); else if (fontId == FONT_FEMALE) DecompressGlyph_Female(glyph, FALSE); else DecompressGlyph_Normal(glyph, FALSE); srcBlit->pixels = gGlyphInfo.pixels; srcBlit->width = 16; srcBlit->height = 16; destBlit->pixels = destBuffer; destBlit->width = width * 8; destBlit->height = height * 8; BlitBitmapRect4Bit(srcBlit, destBlit, 0, 0, x, y, gGlyphInfo.width, gGlyphInfo.height, 0); } void HelpSystem_PrintTextInTopLeftCorner(const u8 * str) { GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_DARK_GRAY); HelpSystemRenderText(5, gDecompressionBuffer + 0x3D00, str, 6, 2, 7, 2); } void HelpSystem_PrintTextRightAlign_Row52(const u8 * str) { s32 left = 0x7C - GetStringWidth(FONT_SMALL, str, 0); GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_DARK_GRAY); HelpSystemRenderText(0, gDecompressionBuffer + 0x3400, str, left, 2, 16, 2); } void HelpSystem_PrintTextAt(const u8 * str, u8 x, u8 y) { GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_DARK_GRAY); HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, str, x, y, 26, 16); } void HelpSystem_PrintQuestionAndAnswerPair(const u8 * question, const u8 * answer) { CpuFill16(0xEEEE, gDecompressionBuffer + 0x0000, 0x3400); GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_5, TEXT_COLOR_DARK_GRAY); HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, question, 0, 0, 26, 16); HelpSystemRenderText(2, gDecompressionBuffer + 0x09C0, answer, 0, 0, 26, 13); } void HelpSystem_PrintTopicMouseoverDescription(const u8 * str) { CpuFill16(0x1111, gDecompressionBuffer + 0x23C0, 0x1040); GenerateFontHalfRowLookupTable(TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); HelpSystemRenderText(2, gDecompressionBuffer + 0x23C0, str, 2, 6, 26, 5); } void HelpSystem_FillPanel3(void) { CpuFill16(0xFFFF, gDecompressionBuffer + 0x3D00, 0x1C0); } void HelpSystem_FillPanel2(void) { CpuFill16(0xFFFF, gDecompressionBuffer + 0x3400, 0x400); } void HelpSystem_FillPanel1(void) { CpuFill16(0xFFFF, gDecompressionBuffer + 0x0000, 0x3400); } void HelpSystem_InitListMenuController(struct HelpSystemListMenu * a0, u8 a1, u8 a2) { gHelpSystemListMenu.sub = a0->sub; gHelpSystemListMenu.itemsAbove = a1; gHelpSystemListMenu.cursorPos = a2; gHelpSystemListMenu.state = 0; if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed) gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems; HS_ShowOrHideMainWindowText(0); HelpSystem_FillPanel1(); PrintListMenuItems(); PlaceListMenuCursor(); } void HelpSystem_SetInputDelay(u8 a0) { sDelayTimer = a0; } s32 HelpSystem_GetMenuInput(void) { if (sDelayTimer != 0) { sDelayTimer--; return -1; } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos].index; } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); return -2; } else if (JOY_NEW(L_BUTTON)) { return -6; } else if (JOY_REPT(DPAD_UP)) { if (!MoveCursor(1, 0)) PlaySE(SE_SELECT); return -4; } else if (JOY_REPT(DPAD_DOWN)) { if (!MoveCursor(1, 1)) PlaySE(SE_SELECT); return -5; } else if (JOY_REPT(DPAD_LEFT)) { if (!MoveCursor(7, 0)) PlaySE(SE_SELECT); return -4; } else if (JOY_REPT(DPAD_RIGHT)) { if (!MoveCursor(7, 1)) PlaySE(SE_SELECT); return -5; } else return -1; } void HS_UpdateMenuScrollArrows(void) { u8 topItemIdx = gHelpSystemListMenu.sub.totalItems - 7; if (gHelpSystemListMenu.sub.totalItems > 7) { s32 cursorPos = gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos; HS_ShowOrHideScrollArrows(0, 0); // Hide both if (cursorPos == 0) HS_ShowOrHideScrollArrows(1, 1); // Show bottom else if (gHelpSystemListMenu.itemsAbove == 0 && gHelpSystemListMenu.cursorPos != 0) HS_ShowOrHideScrollArrows(1, 1); // Show bottom else if (gHelpSystemListMenu.itemsAbove == topItemIdx) HS_ShowOrHideScrollArrows(0, 1); // Show top else if (gHelpSystemListMenu.itemsAbove != 0) { // Show both HS_ShowOrHideScrollArrows(0, 1); HS_ShowOrHideScrollArrows(1, 1); } } } void PrintListMenuItems(void) { u8 glyphHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 1; s32 i; s32 r5 = gHelpSystemListMenu.itemsAbove; for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++) { u8 x = gHelpSystemListMenu.sub.left + 8; u8 y = gHelpSystemListMenu.sub.top + glyphHeight * i; HelpSystem_PrintTextAt(gHelpSystemListMenu.sub.items[r5].label, x, y); r5++; } } void PlaceListMenuCursor(void) { u8 glyphHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 1; u8 x = gHelpSystemListMenu.sub.left; u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.cursorPos; HelpSystem_PrintTextAt(gText_SelectorArrow2, x, y); } void HS_RemoveSelectionCursorAt(u8 i) { u8 glyphHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 1; u8 x = gHelpSystemListMenu.sub.left; u8 y = gHelpSystemListMenu.sub.top + i * glyphHeight; HelpSystem_PrintTextAt(gString_HelpSystem_ClearTo8, x, y); } u8 TryMoveCursor1(u8 dirn) { u16 midPoint; if (dirn == 0) { if (gHelpSystemListMenu.sub.maxShowed == 1) midPoint = 0; else midPoint = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1; if (gHelpSystemListMenu.itemsAbove == 0) { if (gHelpSystemListMenu.cursorPos != 0) { gHelpSystemListMenu.cursorPos--; return 1; } else return 0; } if (gHelpSystemListMenu.cursorPos > midPoint) { gHelpSystemListMenu.cursorPos--; return 1; } else { gHelpSystemListMenu.itemsAbove--; return 2; } } else { if (gHelpSystemListMenu.sub.maxShowed == 1) midPoint = 0; else midPoint = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1); if (gHelpSystemListMenu.itemsAbove == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed) { if (gHelpSystemListMenu.cursorPos < gHelpSystemListMenu.sub.maxShowed - 1) { gHelpSystemListMenu.cursorPos++; return 1; } else return 0; } else if (gHelpSystemListMenu.cursorPos < midPoint) { gHelpSystemListMenu.cursorPos++; return 1; } else { gHelpSystemListMenu.itemsAbove++; return 2; } } } bool8 MoveCursor(u8 by, u8 dirn) { u8 r7 = gHelpSystemListMenu.cursorPos; u8 flags = 0; s32 i; for (i = 0; i < by; i++) flags |= TryMoveCursor1(dirn); switch (flags) { case 0: default: // neither changed return TRUE; case 1: // changed cursorPos only HS_RemoveSelectionCursorAt(r7); PlaceListMenuCursor(); CommitTilemap(); break; case 2: case 3: // changed itemsAbove if (GetHelpSystemMenuLevel() == 1) { HelpSystem_SetInputDelay(2); HelpSystem_FillPanel1(); PrintListMenuItems(); PlaceListMenuCursor(); HelpSystem_PrintTopicLabel(); HS_UpdateMenuScrollArrows(); } else { HS_ShowOrHideMainWindowText(0); HelpSystem_FillPanel1(); PrintListMenuItems(); PlaceListMenuCursor(); HS_ShowOrHideMainWindowText(1); } CommitTilemap(); break; } return FALSE; } ================================================ FILE: src/hof_pc.c ================================================ #include "global.h" #include "gflib.h" #include "hall_of_fame.h" #include "overworld.h" #include "script.h" #include "script_menu.h" #include "task.h" static void ReshowPCMenuAfterHallOfFamePC(void); static void Task_WaitForPaletteFade(u8 taskId); static void Task_WaitFadeAndSetCallback(u8 taskId) { if (!gPaletteFade.active) { FreeAllWindowBuffers(); ResetBgsAndClearDma3BusyFlags(0); DestroyTask(taskId); SetMainCallback2(CB2_InitHofPC); } } void HallOfFamePCBeginFade(void) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); LockPlayerFieldControls(); CreateTask(Task_WaitFadeAndSetCallback, 0); } void ReturnFromHallOfFamePC(void) { SetMainCallback2(CB2_ReturnToField); gFieldCallback = ReshowPCMenuAfterHallOfFamePC; } static void ReshowPCMenuAfterHallOfFamePC(void) { LockPlayerFieldControls(); Overworld_PlaySpecialMapMusic(); CreatePCMenu(); ScriptMenu_DisplayPCStartupPrompt(); BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); CreateTask(Task_WaitForPaletteFade, 10); } static void Task_WaitForPaletteFade(u8 taskId) { if (!gPaletteFade.active) DestroyTask(taskId); } ================================================ FILE: src/image_processing_effects.c ================================================ #include "global.h" #include "image_processing_effects.h" // IWRAM common u8 gCanvasColumnStart; u16 (*gCanvasPixels)[][32]; u8 gCanvasRowEnd; u8 gCanvasHeight; u8 gCanvasColumnEnd; u8 gCanvasRowStart; u8 gCanvasMonPersonality; u8 gCanvasWidth; u16 *gCanvasPalette; u16 gCanvasPaletteStart; static void ApplyImageEffect_Pointillism(void); static void ApplyImageEffect_Blur(void); static void ApplyImageEffect_BlackOutline(void); static void ApplyImageEffect_Invert(void); static void ApplyImageEffect_BlackAndWhite(void); static void ApplyImageEffect_BlurRight(void); static void ApplyImageEffect_BlurDown(void); static void ApplyImageEffect_Shimmer(void); static void ApplyImageEffect_Grayscale(void); static void ApplyImageEffect_PersonalityColor(u8); static void ApplyImageEffect_RedChannelGrayscale(u8); static void ApplyImageEffect_RedChannelGrayscaleHighlight(u8); static void AddPointillismPoints(u16); static u16 ConvertColorToGrayscale(u16 *); static u16 QuantizePixel_Blur(u16 *, u16 *, u16 *); static u16 QuantizePixel_PersonalityColor(u16 *, u8); static u16 QuantizePixel_BlackAndWhite(u16 *); static u16 QuantizePixel_BlackOutline(u16 *, u16 *); static u16 QuantizePixel_Invert(u16 *); static u16 QuantizePixel_BlurHard(u16 *, u16 *, u16 *); static u16 QuantizePixel_MotionBlur(u16 *, u16 *); static u16 GetColorFromPersonality(u8); static void QuantizePalette_Standard(bool8); static void SetPresetPalette_PrimaryColors(void); static void QuantizePalette_PrimaryColors(void); static void SetPresetPalette_Grayscale(void); static void QuantizePalette_Grayscale(void); static void SetPresetPalette_GrayscaleSmall(void); static void QuantizePalette_GrayscaleSmall(void); static void SetPresetPalette_BlackAndWhite(void); static void QuantizePalette_BlackAndWhite(void); static u16 QuantizePixel_Standard(u16 *); static u16 QuantizePixel_GrayscaleSmall(u16 *); static u16 QuantizePixel_Grayscale(u16 *); static u16 QuantizePixel_PrimaryColors(u16 *); static const u8 sPointillismPoints[][3] = { {0x00, 0x1d, 0x1c}, {0x0e, 0x1e, 0x1b}, {0x00, 0x01, 0x32}, {0x2e, 0x1e, 0x37}, {0x0a, 0x22, 0x1f}, {0x05, 0x26, 0x2e}, {0x12, 0x17, 0x1e}, {0x1a, 0x03, 0x11}, {0x05, 0x11, 0x18}, {0x05, 0x27, 0x2f}, {0x1a, 0x3f, 0x12}, {0x22, 0x3f, 0x16}, {0x2b, 0x2f, 0x2e}, {0x11, 0x02, 0x2d}, {0x23, 0x0d, 0x28}, {0x17, 0x0c, 0x19}, {0x2f, 0x0e, 0x13}, {0x30, 0x18, 0x20}, {0x2d, 0x28, 0x22}, {0x01, 0x03, 0x19}, {0x0e, 0x2a, 0x2b}, {0x22, 0x15, 0x25}, {0x22, 0x0a, 0x26}, {0x39, 0x06, 0x23}, {0x16, 0x07, 0x2f}, {0x22, 0x3a, 0x1b}, {0x3b, 0x36, 0x35}, {0x0a, 0x2b, 0x24}, {0x36, 0x09, 0x12}, {0x1c, 0x2f, 0x23}, {0x2e, 0x38, 0x2c}, {0x05, 0x2a, 0x20}, {0x07, 0x14, 0x32}, {0x31, 0x08, 0x17}, {0x1a, 0x24, 0x2d}, {0x22, 0x0a, 0x16}, {0x1b, 0x26, 0x2b}, {0x29, 0x16, 0x11}, {0x35, 0x08, 0x14}, {0x1e, 0x08, 0x14}, {0x05, 0x31, 0x14}, {0x38, 0x31, 0x17}, {0x34, 0x33, 0x12}, {0x11, 0x09, 0x1f}, {0x28, 0x3d, 0x32}, {0x35, 0x03, 0x1e}, {0x3c, 0x2b, 0x2e}, {0x10, 0x01, 0x17}, {0x03, 0x3e, 0x22}, {0x17, 0x18, 0x34}, {0x08, 0x29, 0x19}, {0x03, 0x24, 0x28}, {0x3d, 0x33, 0x2f}, {0x31, 0x24, 0x19}, {0x1b, 0x18, 0x26}, {0x07, 0x0d, 0x25}, {0x2d, 0x3f, 0x12}, {0x2f, 0x15, 0x25}, {0x29, 0x0f, 0x12}, {0x07, 0x2c, 0x12}, {0x2c, 0x0b, 0x26}, {0x12, 0x1a, 0x16}, {0x00, 0x0b, 0x2f}, {0x16, 0x35, 0x24}, {0x1f, 0x1c, 0x22}, {0x29, 0x33, 0x27}, {0x3b, 0x30, 0x17}, {0x11, 0x06, 0x35}, {0x3e, 0x31, 0x2f}, {0x11, 0x3a, 0x25}, {0x2a, 0x02, 0x19}, {0x33, 0x18, 0x35}, {0x2a, 0x20, 0x21}, {0x2e, 0x32, 0x1b}, {0x3b, 0x1f, 0x23}, {0x39, 0x29, 0x2a}, {0x2e, 0x31, 0x29}, {0x2a, 0x0e, 0x2d}, {0x2d, 0x00, 0x1f}, {0x38, 0x28, 0x1b}, {0x14, 0x3b, 0x2b}, {0x2e, 0x04, 0x26}, {0x36, 0x30, 0x11}, {0x3b, 0x21, 0x2d}, {0x2b, 0x3f, 0x1b}, {0x20, 0x13, 0x31}, {0x33, 0x0c, 0x30}, {0x22, 0x2b, 0x2b}, {0x16, 0x02, 0x1e}, {0x1c, 0x12, 0x1c}, {0x0f, 0x3c, 0x36}, {0x38, 0x10, 0x2d}, {0x18, 0x2f, 0x2d}, {0x35, 0x3b, 0x11}, {0x37, 0x31, 0x13}, {0x13, 0x3d, 0x2f}, {0x1e, 0x2c, 0x33}, {0x2e, 0x37, 0x12}, {0x3c, 0x1f, 0x33}, {0x32, 0x2a, 0x27}, {0x0d, 0x3b, 0x1c}, {0x35, 0x2a, 0x27}, {0x09, 0x3d, 0x27}, {0x12, 0x0b, 0x18}, {0x0c, 0x15, 0x1d}, {0x20, 0x01, 0x1c}, {0x08, 0x3b, 0x1c}, {0x12, 0x37, 0x33}, {0x15, 0x03, 0x2c}, {0x2a, 0x3b, 0x31}, {0x0f, 0x04, 0x35}, {0x08, 0x17, 0x33}, {0x38, 0x3d, 0x2a}, {0x2f, 0x35, 0x16}, {0x10, 0x35, 0x16}, {0x23, 0x13, 0x2c}, {0x2f, 0x06, 0x20}, {0x27, 0x3a, 0x24}, {0x00, 0x1c, 0x2a}, {0x03, 0x39, 0x1d}, {0x28, 0x07, 0x1a}, {0x20, 0x0a, 0x37}, {0x07, 0x35, 0x2d}, {0x15, 0x2f, 0x2c}, {0x10, 0x2c, 0x23}, {0x3f, 0x29, 0x14}, {0x2a, 0x21, 0x36}, {0x34, 0x1a, 0x2c}, {0x1c, 0x3d, 0x33}, {0x38, 0x2b, 0x22}, {0x35, 0x28, 0x1f}, {0x3d, 0x0f, 0x1c}, {0x1e, 0x3e, 0x1b}, {0x0c, 0x3e, 0x1f}, {0x2b, 0x31, 0x2c}, {0x32, 0x39, 0x11}, {0x05, 0x09, 0x11}, {0x04, 0x38, 0x2a}, {0x32, 0x00, 0x16}, {0x13, 0x0b, 0x31}, {0x34, 0x2a, 0x13}, {0x2c, 0x22, 0x21}, {0x39, 0x2f, 0x15}, {0x37, 0x28, 0x1e}, {0x07, 0x3b, 0x2d}, {0x11, 0x03, 0x28}, {0x2d, 0x30, 0x1e}, {0x31, 0x11, 0x11}, {0x23, 0x01, 0x1e}, {0x3d, 0x31, 0x34}, {0x1c, 0x02, 0x34}, {0x21, 0x0e, 0x25}, {0x3d, 0x07, 0x17}, {0x33, 0x15, 0x10}, {0x29, 0x32, 0x32}, {0x18, 0x1f, 0x30}, {0x2d, 0x3b, 0x30}, {0x27, 0x3e, 0x16}, {0x31, 0x15, 0x12}, {0x30, 0x25, 0x17}, {0x33, 0x06, 0x34}, {0x00, 0x29, 0x18}, {0x3c, 0x03, 0x12}, {0x2c, 0x0c, 0x11}, {0x09, 0x30, 0x30}, {0x10, 0x0e, 0x11}, {0x27, 0x16, 0x1b}, {0x0c, 0x3b, 0x2e}, {0x2b, 0x33, 0x1e}, {0x13, 0x2d, 0x2d}, {0x11, 0x24, 0x29}, {0x34, 0x3e, 0x2b}, {0x24, 0x1e, 0x21}, {0x27, 0x1a, 0x2d}, {0x04, 0x39, 0x16}, {0x3e, 0x33, 0x26}, {0x1b, 0x2e, 0x25}, {0x0c, 0x06, 0x19}, {0x25, 0x19, 0x18}, {0x1d, 0x33, 0x33}, {0x1d, 0x28, 0x2d}, {0x1c, 0x10, 0x2a}, {0x1f, 0x35, 0x1e}, {0x34, 0x02, 0x10}, {0x2b, 0x3a, 0x14}, {0x0d, 0x0b, 0x15}, {0x0c, 0x2c, 0x10}, {0x37, 0x3a, 0x19}, {0x06, 0x13, 0x17}, {0x24, 0x10, 0x25}, {0x24, 0x04, 0x1e}, {0x00, 0x35, 0x34}, {0x3a, 0x00, 0x37}, {0x3c, 0x07, 0x1a}, {0x2b, 0x28, 0x36}, {0x34, 0x39, 0x2f}, {0x28, 0x09, 0x1f}, {0x38, 0x31, 0x30}, {0x16, 0x25, 0x31}, {0x18, 0x28, 0x31}, {0x18, 0x0c, 0x22}, {0x06, 0x39, 0x2d}, {0x3d, 0x20, 0x24}, {0x2e, 0x27, 0x21}, {0x3e, 0x18, 0x18}, {0x15, 0x3c, 0x24}, {0x06, 0x1b, 0x26}, {0x15, 0x0e, 0x22}, {0x0a, 0x0d, 0x1f}, {0x18, 0x16, 0x34}, {0x10, 0x28, 0x21}, {0x20, 0x11, 0x11}, {0x36, 0x32, 0x15}, {0x3b, 0x2e, 0x24}, {0x1f, 0x2d, 0x12}, {0x36, 0x2e, 0x20}, {0x0b, 0x17, 0x33}, {0x26, 0x03, 0x1f}, {0x08, 0x19, 0x31}, {0x2a, 0x18, 0x25}, {0x35, 0x2d, 0x2d}, {0x30, 0x38, 0x18}, {0x1c, 0x25, 0x14}, {0x1c, 0x22, 0x28}, {0x08, 0x23, 0x21}, {0x26, 0x1e, 0x30}, {0x19, 0x0f, 0x15}, {0x10, 0x2f, 0x22}, {0x12, 0x02, 0x25}, {0x3c, 0x01, 0x1d}, {0x0e, 0x14, 0x18}, {0x0d, 0x18, 0x17}, {0x22, 0x0b, 0x31}, {0x13, 0x34, 0x21}, {0x0f, 0x2d, 0x36}, {0x39, 0x1f, 0x25}, {0x18, 0x10, 0x1f}, {0x2d, 0x20, 0x20}, {0x19, 0x0b, 0x31}, {0x33, 0x13, 0x14}, {0x2e, 0x11, 0x21}, {0x2d, 0x0a, 0x37}, {0x07, 0x15, 0x1b}, {0x32, 0x04, 0x32}, {0x06, 0x18, 0x1b}, {0x13, 0x24, 0x12}, {0x36, 0x22, 0x16}, {0x1d, 0x29, 0x1c}, {0x35, 0x17, 0x21}, {0x36, 0x17, 0x2b}, {0x35, 0x32, 0x19}, {0x2a, 0x0f, 0x2e}, {0x10, 0x00, 0x34}, {0x02, 0x0e, 0x28}, {0x31, 0x32, 0x32}, {0x3b, 0x05, 0x20}, {0x36, 0x26, 0x12}, {0x34, 0x06, 0x34}, {0x1e, 0x31, 0x32}, {0x35, 0x05, 0x34}, {0x1e, 0x13, 0x15}, {0x15, 0x14, 0x2c}, {0x29, 0x1c, 0x18}, {0x24, 0x24, 0x12}, {0x22, 0x29, 0x18}, {0x34, 0x36, 0x30}, {0x1e, 0x01, 0x23}, {0x0c, 0x3c, 0x24}, {0x0a, 0x3d, 0x16}, {0x27, 0x1e, 0x23}, {0x15, 0x02, 0x12}, {0x11, 0x19, 0x2a}, {0x1d, 0x31, 0x15}, {0x03, 0x3b, 0x2a}, {0x21, 0x19, 0x2c}, {0x0a, 0x23, 0x11}, {0x25, 0x11, 0x1a}, {0x1a, 0x0a, 0x34}, {0x3b, 0x0b, 0x33}, {0x21, 0x0b, 0x37}, {0x01, 0x31, 0x28}, {0x35, 0x1d, 0x27}, {0x2c, 0x30, 0x31}, {0x2e, 0x39, 0x2d}, {0x30, 0x05, 0x2c}, {0x12, 0x2a, 0x2b}, {0x39, 0x22, 0x20}, {0x15, 0x34, 0x1c}, {0x1c, 0x01, 0x15}, {0x20, 0x16, 0x22}, {0x13, 0x04, 0x18}, {0x1e, 0x13, 0x10}, {0x25, 0x33, 0x15}, {0x39, 0x03, 0x31}, {0x3f, 0x36, 0x18}, {0x14, 0x23, 0x10}, {0x2f, 0x1e, 0x1f}, {0x1f, 0x17, 0x2c}, {0x02, 0x16, 0x31}, {0x20, 0x18, 0x30}, {0x2e, 0x18, 0x37}, {0x3b, 0x0e, 0x30}, {0x10, 0x39, 0x24}, {0x26, 0x39, 0x1e}, {0x30, 0x26, 0x2e}, {0x12, 0x01, 0x14}, {0x37, 0x2a, 0x2e}, {0x21, 0x06, 0x1d}, {0x2a, 0x16, 0x32}, {0x09, 0x38, 0x1c}, {0x07, 0x22, 0x17}, {0x3b, 0x2d, 0x15}, {0x07, 0x1e, 0x2e}, {0x1b, 0x2e, 0x1d}, {0x04, 0x09, 0x30}, {0x30, 0x2d, 0x37}, {0x2d, 0x34, 0x24}, {0x18, 0x24, 0x25}, {0x0e, 0x2d, 0x26}, {0x23, 0x0a, 0x16}, {0x12, 0x2d, 0x11}, {0x21, 0x28, 0x2e}, {0x0f, 0x01, 0x21}, {0x01, 0x31, 0x12}, {0x3f, 0x1b, 0x1e}, {0x21, 0x25, 0x2b}, {0x26, 0x18, 0x13}, {0x15, 0x2d, 0x34}, {0x23, 0x21, 0x36}, {0x0e, 0x2e, 0x1c}, {0x14, 0x22, 0x1c}, {0x2c, 0x0b, 0x28}, {0x1a, 0x18, 0x21}, {0x21, 0x07, 0x1a}, {0x24, 0x26, 0x29}, {0x2b, 0x0a, 0x34}, {0x3e, 0x27, 0x33}, {0x12, 0x34, 0x1b}, {0x1f, 0x01, 0x2a}, {0x2e, 0x06, 0x23}, {0x2f, 0x1f, 0x14}, {0x18, 0x06, 0x26}, {0x31, 0x1f, 0x2b}, {0x22, 0x26, 0x2e}, {0x1e, 0x15, 0x16}, {0x20, 0x22, 0x28}, {0x15, 0x37, 0x12}, {0x25, 0x04, 0x2c}, {0x1f, 0x04, 0x2e}, {0x0c, 0x13, 0x18}, {0x07, 0x0b, 0x36}, {0x1d, 0x1c, 0x2a}, {0x30, 0x22, 0x1c}, {0x2e, 0x12, 0x2f}, {0x2b, 0x21, 0x1e}, {0x16, 0x38, 0x30}, {0x04, 0x02, 0x16}, {0x05, 0x14, 0x20}, {0x38, 0x3c, 0x33}, {0x21, 0x1b, 0x2f}, {0x14, 0x2a, 0x27}, {0x38, 0x14, 0x1b}, {0x2b, 0x1f, 0x2b}, {0x29, 0x2b, 0x25}, {0x27, 0x36, 0x21}, {0x11, 0x22, 0x1b}, {0x29, 0x03, 0x1b}, {0x18, 0x24, 0x28}, {0x21, 0x2d, 0x36}, {0x3c, 0x2c, 0x24}, {0x33, 0x17, 0x1f}, {0x2a, 0x3a, 0x21}, {0x0a, 0x23, 0x37}, {0x00, 0x0b, 0x21}, {0x11, 0x38, 0x19}, {0x0f, 0x0e, 0x1c}, {0x1f, 0x0f, 0x37}, {0x3c, 0x10, 0x37}, {0x38, 0x31, 0x35}, {0x07, 0x15, 0x28}, {0x1e, 0x2e, 0x19}, {0x26, 0x10, 0x33}, {0x3d, 0x35, 0x2f}, {0x3a, 0x04, 0x34}, {0x0d, 0x18, 0x1a}, {0x01, 0x2d, 0x15}, {0x3d, 0x1a, 0x17}, {0x17, 0x3f, 0x32}, {0x0b, 0x21, 0x11}, {0x1e, 0x26, 0x2b}, {0x0d, 0x19, 0x24}, {0x2e, 0x04, 0x1b}, {0x1b, 0x33, 0x20}, {0x15, 0x21, 0x1d}, {0x1f, 0x04, 0x21}, {0x0f, 0x12, 0x1f}, {0x2d, 0x2a, 0x32}, {0x03, 0x37, 0x1f}, {0x35, 0x07, 0x27}, {0x24, 0x1f, 0x31}, {0x2f, 0x30, 0x15}, {0x06, 0x00, 0x24}, {0x0b, 0x22, 0x1a}, {0x0c, 0x3b, 0x29}, {0x14, 0x1a, 0x17}, {0x37, 0x20, 0x25}, {0x3f, 0x26, 0x37}, {0x3a, 0x3e, 0x10}, {0x22, 0x04, 0x11}, {0x28, 0x12, 0x1c}, {0x03, 0x2e, 0x2e}, {0x0e, 0x38, 0x28}, {0x01, 0x29, 0x22}, {0x1e, 0x33, 0x19}, {0x06, 0x21, 0x27}, {0x33, 0x19, 0x1a}, {0x02, 0x05, 0x17}, {0x11, 0x11, 0x2c}, {0x1f, 0x26, 0x1e}, {0x39, 0x1f, 0x28}, {0x2e, 0x2f, 0x12}, {0x22, 0x34, 0x13}, {0x3b, 0x26, 0x2f}, {0x34, 0x00, 0x14}, {0x10, 0x31, 0x11}, {0x1d, 0x2d, 0x2a}, {0x08, 0x08, 0x37}, {0x15, 0x18, 0x34}, {0x04, 0x2b, 0x24}, {0x2f, 0x1e, 0x27}, {0x22, 0x2a, 0x24}, {0x07, 0x14, 0x25}, {0x01, 0x27, 0x19}, {0x29, 0x0a, 0x29}, {0x3d, 0x1c, 0x2f}, {0x0d, 0x1f, 0x1c}, {0x24, 0x3d, 0x32}, {0x36, 0x1d, 0x24}, {0x14, 0x21, 0x16}, {0x1a, 0x0d, 0x29}, {0x3f, 0x2b, 0x2a}, {0x1a, 0x3e, 0x35}, {0x11, 0x28, 0x18}, {0x32, 0x05, 0x15}, {0x21, 0x2e, 0x34}, {0x2d, 0x14, 0x2a}, {0x3c, 0x08, 0x37}, {0x3f, 0x34, 0x1e}, {0x27, 0x24, 0x1c}, {0x16, 0x16, 0x33}, {0x29, 0x3b, 0x19}, {0x36, 0x2f, 0x1c}, {0x03, 0x25, 0x2c}, {0x0b, 0x16, 0x36}, {0x1c, 0x1d, 0x1b}, {0x2c, 0x27, 0x1b}, {0x0b, 0x1f, 0x2b}, {0x08, 0x10, 0x27}, {0x3f, 0x25, 0x2f}, {0x33, 0x13, 0x1f}, {0x04, 0x31, 0x37}, {0x0e, 0x2f, 0x12}, {0x08, 0x23, 0x20}, {0x3a, 0x1a, 0x1e}, {0x2f, 0x0b, 0x1f}, {0x1e, 0x20, 0x19}, {0x23, 0x3b, 0x14}, {0x25, 0x00, 0x27}, {0x14, 0x04, 0x25}, {0x36, 0x1a, 0x2b}, {0x27, 0x21, 0x15}, {0x28, 0x13, 0x2c}, {0x0e, 0x3c, 0x35}, {0x0c, 0x2d, 0x2b}, {0x37, 0x16, 0x15}, {0x29, 0x15, 0x1d}, {0x17, 0x34, 0x36}, {0x09, 0x0a, 0x31}, {0x37, 0x22, 0x28}, {0x17, 0x2b, 0x35}, {0x14, 0x2b, 0x12}, {0x08, 0x13, 0x1f}, {0x31, 0x13, 0x28}, {0x06, 0x07, 0x35}, {0x23, 0x3a, 0x29}, {0x0f, 0x24, 0x2e}, {0x07, 0x35, 0x26}, {0x0e, 0x12, 0x15}, {0x23, 0x33, 0x2c}, {0x0e, 0x21, 0x26}, {0x1c, 0x12, 0x25}, {0x23, 0x1d, 0x2f}, {0x04, 0x35, 0x33}, {0x16, 0x01, 0x24}, {0x3d, 0x2c, 0x2e}, {0x35, 0x0a, 0x25}, {0x11, 0x13, 0x25}, {0x1b, 0x1b, 0x15}, {0x15, 0x39, 0x10}, {0x0b, 0x35, 0x24}, {0x3a, 0x27, 0x30}, {0x2e, 0x2f, 0x15}, {0x10, 0x1f, 0x35}, {0x1b, 0x28, 0x35}, {0x26, 0x30, 0x37}, {0x34, 0x37, 0x2b}, {0x0f, 0x30, 0x29}, {0x2e, 0x3f, 0x2b}, {0x38, 0x34, 0x2b}, {0x2b, 0x2f, 0x25}, {0x0d, 0x28, 0x2a}, {0x33, 0x18, 0x10}, {0x21, 0x12, 0x11}, {0x1f, 0x22, 0x34}, {0x11, 0x25, 0x23}, {0x21, 0x3f, 0x11}, {0x26, 0x27, 0x25}, {0x28, 0x36, 0x12}, {0x15, 0x26, 0x32}, {0x11, 0x18, 0x24}, {0x32, 0x25, 0x37}, {0x27, 0x3a, 0x33}, {0x35, 0x07, 0x1c}, {0x1a, 0x0e, 0x2a}, {0x1e, 0x2f, 0x1f}, {0x00, 0x2e, 0x21}, {0x1b, 0x3c, 0x14}, {0x2f, 0x3a, 0x2f}, {0x3e, 0x38, 0x15}, {0x1a, 0x13, 0x2f}, {0x29, 0x0d, 0x2f}, {0x37, 0x17, 0x18}, {0x30, 0x1c, 0x35}, {0x15, 0x34, 0x14}, {0x28, 0x11, 0x2c}, {0x2c, 0x25, 0x2a}, {0x20, 0x3f, 0x28}, {0x0c, 0x34, 0x1b}, {0x30, 0x2e, 0x25}, {0x37, 0x1c, 0x24}, {0x1f, 0x25, 0x26}, {0x0c, 0x19, 0x34}, {0x18, 0x10, 0x35}, {0x0a, 0x13, 0x11}, {0x25, 0x13, 0x20}, {0x13, 0x19, 0x11}, {0x20, 0x28, 0x1d}, {0x3e, 0x30, 0x1b}, {0x23, 0x24, 0x21}, {0x0d, 0x23, 0x23}, {0x1d, 0x28, 0x2e}, {0x2d, 0x12, 0x1f}, {0x0e, 0x2e, 0x2b}, {0x0b, 0x31, 0x32}, {0x24, 0x3c, 0x2c}, {0x13, 0x3c, 0x12}, {0x28, 0x16, 0x2a}, {0x05, 0x0c, 0x32}, {0x39, 0x0b, 0x32}, {0x21, 0x04, 0x14}, {0x10, 0x31, 0x32}, {0x12, 0x1f, 0x23}, {0x39, 0x2e, 0x2e}, {0x22, 0x3d, 0x27}, {0x0c, 0x1e, 0x18}, {0x25, 0x00, 0x17}, {0x06, 0x31, 0x14}, {0x13, 0x21, 0x1a}, {0x14, 0x20, 0x35}, {0x0a, 0x3b, 0x25}, {0x33, 0x08, 0x28}, {0x3d, 0x02, 0x33}, {0x23, 0x00, 0x13}, {0x22, 0x21, 0x28}, {0x30, 0x14, 0x2e}, {0x14, 0x32, 0x36}, {0x39, 0x23, 0x1e}, {0x1c, 0x11, 0x30}, {0x37, 0x16, 0x30}, {0x15, 0x31, 0x1f}, {0x34, 0x28, 0x2c}, {0x35, 0x05, 0x29}, {0x37, 0x33, 0x2a}, {0x1c, 0x17, 0x2e}, {0x10, 0x06, 0x16}, {0x32, 0x1f, 0x2f}, {0x00, 0x29, 0x1e}, {0x04, 0x01, 0x16}, {0x3b, 0x23, 0x1e}, {0x1b, 0x34, 0x2a}, {0x30, 0x11, 0x2b}, {0x03, 0x00, 0x1f}, {0x1d, 0x37, 0x1a}, {0x3a, 0x18, 0x25}, {0x1c, 0x16, 0x2c}, {0x04, 0x3f, 0x33}, {0x26, 0x23, 0x2d}, {0x15, 0x2c, 0x27}, {0x02, 0x35, 0x27}, {0x07, 0x35, 0x33}, {0x1a, 0x0c, 0x10}, {0x28, 0x26, 0x2c}, {0x2f, 0x36, 0x16}, {0x37, 0x0b, 0x27}, {0x1b, 0x3d, 0x18}, {0x27, 0x1f, 0x20}, {0x2b, 0x2a, 0x33}, {0x0b, 0x0f, 0x20}, {0x35, 0x3c, 0x2f}, {0x33, 0x21, 0x15}, {0x2d, 0x26, 0x34}, {0x1f, 0x1a, 0x21}, {0x2f, 0x2c, 0x2a}, {0x1a, 0x32, 0x1a}, {0x3b, 0x3f, 0x21}, {0x13, 0x3f, 0x13}, {0x0f, 0x24, 0x22}, {0x14, 0x1b, 0x10}, {0x21, 0x06, 0x28}, {0x25, 0x34, 0x10}, {0x2e, 0x0e, 0x14}, {0x3c, 0x3e, 0x25}, {0x16, 0x06, 0x30}, {0x0b, 0x04, 0x1f}, {0x3e, 0x02, 0x24}, {0x0c, 0x17, 0x25}, {0x2b, 0x3c, 0x2d}, {0x15, 0x36, 0x33}, {0x18, 0x23, 0x2a}, {0x1d, 0x10, 0x2a}, {0x35, 0x17, 0x28}, {0x00, 0x37, 0x24}, {0x0a, 0x3b, 0x15}, {0x1d, 0x0b, 0x1f}, {0x3c, 0x31, 0x25}, {0x1d, 0x0f, 0x1d}, {0x20, 0x13, 0x34}, {0x11, 0x2b, 0x2e}, {0x23, 0x0c, 0x2e}, {0x24, 0x02, 0x14}, {0x31, 0x16, 0x19}, {0x0e, 0x23, 0x35}, {0x1a, 0x10, 0x16}, {0x14, 0x04, 0x19}, {0x2d, 0x27, 0x37}, {0x33, 0x02, 0x31}, {0x02, 0x04, 0x16}, {0x0d, 0x22, 0x25}, {0x25, 0x00, 0x16}, {0x2a, 0x3f, 0x26}, {0x20, 0x0c, 0x12}, {0x2f, 0x2e, 0x35}, {0x1b, 0x0d, 0x22}, {0x1e, 0x01, 0x34}, {0x05, 0x22, 0x21}, {0x34, 0x2a, 0x32}, {0x0b, 0x09, 0x1d}, {0x3f, 0x32, 0x2f}, {0x3d, 0x18, 0x2d}, {0x0b, 0x38, 0x36}, {0x39, 0x17, 0x28}, {0x34, 0x04, 0x24}, {0x36, 0x0e, 0x2a}, {0x38, 0x01, 0x14}, {0x3c, 0x24, 0x22}, {0x21, 0x03, 0x18}, {0x32, 0x2f, 0x12}, {0x29, 0x24, 0x31}, {0x0a, 0x3b, 0x12}, {0x1a, 0x1c, 0x20}, {0x30, 0x31, 0x1b}, {0x1a, 0x21, 0x10}, {0x05, 0x29, 0x10}, {0x26, 0x2d, 0x13}, {0x16, 0x0c, 0x1d}, {0x2b, 0x06, 0x1b}, {0x06, 0x12, 0x14}, {0x38, 0x0f, 0x35}, {0x23, 0x3a, 0x2c}, {0x00, 0x19, 0x33}, {0x29, 0x14, 0x2d}, {0x2a, 0x21, 0x29}, {0x14, 0x31, 0x14}, {0x1a, 0x06, 0x1e}, {0x18, 0x1b, 0x28}, {0x3b, 0x16, 0x29}, {0x15, 0x1e, 0x12}, {0x34, 0x0a, 0x14}, {0x1b, 0x05, 0x27}, {0x0b, 0x01, 0x26}, {0x2a, 0x22, 0x35}, {0x21, 0x20, 0x18}, {0x20, 0x37, 0x17}, {0x14, 0x1f, 0x11}, {0x1d, 0x11, 0x25}, {0x24, 0x2b, 0x2f}, {0x07, 0x3f, 0x1f}, {0x2c, 0x25, 0x25}, {0x2a, 0x29, 0x18}, {0x11, 0x24, 0x28}, {0x31, 0x2c, 0x2a}, {0x39, 0x0b, 0x26}, {0x28, 0x10, 0x26}, {0x22, 0x06, 0x16}, {0x09, 0x2c, 0x13}, {0x34, 0x19, 0x15}, {0x3a, 0x12, 0x21}, {0x1d, 0x38, 0x23}, {0x12, 0x25, 0x24}, {0x21, 0x30, 0x12}, {0x37, 0x1a, 0x12}, {0x24, 0x3b, 0x25}, {0x32, 0x15, 0x23}, {0x0d, 0x1a, 0x10}, {0x16, 0x2e, 0x26}, {0x1d, 0x14, 0x16}, {0x3e, 0x2e, 0x1f}, {0x0a, 0x16, 0x10}, {0x1d, 0x30, 0x2b}, {0x04, 0x3a, 0x19}, {0x08, 0x2d, 0x2e}, {0x28, 0x1e, 0x33}, {0x0a, 0x12, 0x2e}, {0x0d, 0x03, 0x2f}, {0x26, 0x3a, 0x1e}, {0x35, 0x3b, 0x2a}, {0x03, 0x1a, 0x18}, {0x3f, 0x0b, 0x27}, {0x04, 0x05, 0x34}, {0x36, 0x0b, 0x27}, {0x3b, 0x17, 0x11}, {0x0d, 0x27, 0x26}, {0x2c, 0x1f, 0x20}, {0x26, 0x10, 0x20}, {0x25, 0x23, 0x2d}, {0x37, 0x09, 0x13}, {0x14, 0x17, 0x2d}, {0x2e, 0x3d, 0x23}, {0x1d, 0x1a, 0x1f}, {0x21, 0x33, 0x2e}, {0x28, 0x17, 0x13}, {0x26, 0x3c, 0x36}, {0x14, 0x1a, 0x33}, {0x32, 0x20, 0x2b}, {0x19, 0x3e, 0x20}, {0x0c, 0x02, 0x2d}, {0x3c, 0x3c, 0x2a}, {0x30, 0x30, 0x28}, {0x25, 0x3f, 0x1e}, {0x03, 0x17, 0x1e}, {0x35, 0x11, 0x1c}, {0x1b, 0x14, 0x2a}, {0x28, 0x3a, 0x23}, {0x0e, 0x1f, 0x12}, {0x36, 0x21, 0x20}, {0x07, 0x3b, 0x10}, {0x23, 0x19, 0x34}, {0x0d, 0x2e, 0x18}, {0x3f, 0x20, 0x25}, {0x3e, 0x3b, 0x15}, {0x0b, 0x2e, 0x12}, {0x37, 0x0b, 0x23}, {0x3d, 0x32, 0x1f}, {0x16, 0x03, 0x27}, {0x14, 0x0c, 0x21}, {0x18, 0x03, 0x30}, {0x3e, 0x21, 0x13}, {0x0f, 0x00, 0x32}, {0x3f, 0x23, 0x16}, {0x0e, 0x31, 0x1d}, {0x18, 0x1c, 0x1d}, {0x30, 0x0e, 0x1e}, {0x21, 0x20, 0x23}, {0x3f, 0x0c, 0x1e}, {0x14, 0x33, 0x22}, {0x22, 0x21, 0x15}, {0x36, 0x05, 0x1e}, {0x1d, 0x31, 0x14}, {0x20, 0x11, 0x37}, {0x0d, 0x33, 0x19}, {0x25, 0x05, 0x36}, {0x1e, 0x31, 0x20}, {0x35, 0x3a, 0x2f}, {0x32, 0x2f, 0x30}, {0x14, 0x23, 0x2d}, {0x35, 0x1e, 0x29}, {0x05, 0x05, 0x1b}, {0x09, 0x1f, 0x26}, {0x2f, 0x0b, 0x15}, {0x15, 0x11, 0x13}, {0x29, 0x1b, 0x18}, {0x1c, 0x13, 0x35}, {0x34, 0x31, 0x23}, {0x27, 0x3f, 0x2f}, {0x09, 0x30, 0x19}, {0x23, 0x12, 0x34}, {0x02, 0x2a, 0x21}, {0x09, 0x3c, 0x1d}, {0x0c, 0x02, 0x10}, {0x22, 0x05, 0x17}, {0x22, 0x08, 0x1b}, {0x0a, 0x0f, 0x15}, {0x02, 0x11, 0x13}, {0x01, 0x21, 0x22}, {0x16, 0x39, 0x33}, {0x24, 0x38, 0x34}, {0x0f, 0x1e, 0x2b}, {0x2b, 0x15, 0x15}, {0x20, 0x22, 0x2e}, {0x3a, 0x3f, 0x31}, {0x1a, 0x27, 0x2b}, {0x29, 0x34, 0x14}, {0x16, 0x39, 0x2f}, {0x13, 0x3e, 0x16}, {0x36, 0x21, 0x30}, {0x00, 0x24, 0x2b}, {0x24, 0x21, 0x30}, {0x15, 0x31, 0x13}, {0x10, 0x37, 0x24}, {0x08, 0x07, 0x23}, {0x21, 0x09, 0x25}, {0x05, 0x3c, 0x32}, {0x19, 0x03, 0x25}, {0x0f, 0x29, 0x2b}, {0x16, 0x07, 0x13}, {0x3e, 0x3d, 0x25}, {0x36, 0x0b, 0x28}, {0x2e, 0x2b, 0x16}, {0x0c, 0x31, 0x11}, {0x30, 0x13, 0x2d}, {0x26, 0x3e, 0x37}, {0x29, 0x2f, 0x2e}, {0x15, 0x3d, 0x17}, {0x1c, 0x2e, 0x21}, {0x33, 0x2f, 0x10}, {0x0d, 0x05, 0x1d}, {0x1c, 0x1a, 0x12}, {0x0e, 0x18, 0x37}, {0x1b, 0x11, 0x14}, {0x06, 0x14, 0x21}, {0x31, 0x0e, 0x27}, {0x1a, 0x03, 0x10}, {0x00, 0x34, 0x31}, {0x3f, 0x0b, 0x1d}, {0x0f, 0x12, 0x1f}, {0x1a, 0x15, 0x10}, {0x0f, 0x00, 0x24}, {0x3e, 0x0a, 0x2a}, {0x30, 0x2b, 0x24}, {0x26, 0x31, 0x10}, {0x2d, 0x2f, 0x2f}, {0x3f, 0x0c, 0x13}, {0x12, 0x0b, 0x16}, {0x15, 0x07, 0x1f}, {0x28, 0x10, 0x32}, {0x0f, 0x17, 0x15}, {0x0b, 0x27, 0x33}, {0x34, 0x1d, 0x10}, {0x1c, 0x3a, 0x12}, {0x2c, 0x27, 0x37}, {0x0a, 0x1a, 0x32}, {0x05, 0x1f, 0x21}, {0x24, 0x0d, 0x1f}, {0x1c, 0x17, 0x24}, {0x2f, 0x3b, 0x32}, {0x3b, 0x25, 0x10}, {0x03, 0x2f, 0x21}, {0x0c, 0x10, 0x23}, {0x0e, 0x3a, 0x2c}, {0x33, 0x03, 0x2c}, {0x12, 0x06, 0x1c}, {0x2a, 0x37, 0x30}, {0x3f, 0x01, 0x1e}, {0x35, 0x16, 0x37}, {0x2c, 0x32, 0x35}, {0x05, 0x11, 0x22}, {0x29, 0x09, 0x20}, {0x2b, 0x0d, 0x1f}, {0x18, 0x0d, 0x20}, {0x23, 0x39, 0x16}, {0x0f, 0x3a, 0x18}, {0x21, 0x35, 0x2b}, {0x36, 0x26, 0x2b}, {0x23, 0x05, 0x2f}, {0x1b, 0x08, 0x17}, {0x3e, 0x09, 0x16}, {0x2d, 0x3a, 0x37}, {0x15, 0x35, 0x35}, {0x29, 0x0a, 0x12}, {0x02, 0x39, 0x1f}, {0x14, 0x34, 0x33}, {0x17, 0x1d, 0x18}, {0x16, 0x1d, 0x1a}, {0x01, 0x39, 0x22}, {0x1e, 0x27, 0x36}, {0x32, 0x14, 0x26}, {0x0a, 0x39, 0x36}, {0x1f, 0x0d, 0x1e}, {0x0b, 0x0a, 0x19}, {0x35, 0x1d, 0x34}, {0x03, 0x12, 0x16}, {0x0c, 0x13, 0x2e}, {0x0c, 0x34, 0x1e}, {0x10, 0x14, 0x1e}, {0x23, 0x32, 0x27}, {0x02, 0x10, 0x29}, {0x35, 0x18, 0x33}, {0x33, 0x1d, 0x1a}, {0x3c, 0x15, 0x23}, {0x3e, 0x3f, 0x22}, {0x2a, 0x02, 0x2c}, {0x28, 0x0a, 0x2f}, {0x1a, 0x06, 0x35}, {0x3c, 0x17, 0x2b}, {0x03, 0x12, 0x17}, {0x2f, 0x0a, 0x26}, {0x12, 0x38, 0x11}, {0x36, 0x1b, 0x23}, {0x01, 0x39, 0x35}, {0x19, 0x19, 0x17}, {0x09, 0x28, 0x22}, {0x1e, 0x27, 0x2c}, {0x35, 0x33, 0x2c}, {0x27, 0x25, 0x31}, {0x06, 0x31, 0x2d}, {0x1a, 0x39, 0x28}, {0x2d, 0x04, 0x1e}, {0x24, 0x3e, 0x1c}, {0x3c, 0x30, 0x1b}, {0x3f, 0x3e, 0x37}, {0x22, 0x36, 0x11}, {0x00, 0x01, 0x1c}, {0x12, 0x1a, 0x10}, {0x12, 0x1e, 0x2c}, {0x1f, 0x12, 0x2a}, {0x2f, 0x06, 0x19}, {0x35, 0x1a, 0x18}, {0x3b, 0x09, 0x36}, {0x34, 0x1d, 0x13}, {0x02, 0x07, 0x10}, {0x20, 0x2f, 0x1d}, {0x0b, 0x03, 0x33}, {0x1c, 0x16, 0x31}, {0x05, 0x13, 0x1b}, {0x29, 0x06, 0x13}, {0x30, 0x2d, 0x36}, {0x2a, 0x2d, 0x2c}, {0x19, 0x34, 0x1c}, {0x0f, 0x15, 0x12}, {0x36, 0x15, 0x2c}, {0x3a, 0x06, 0x1c}, {0x12, 0x1d, 0x26}, {0x03, 0x38, 0x1d}, {0x01, 0x01, 0x2d}, {0x17, 0x2e, 0x10}, {0x14, 0x17, 0x1c}, {0x34, 0x0f, 0x28}, {0x09, 0x37, 0x1b}, {0x28, 0x1d, 0x26}, {0x29, 0x2d, 0x36}, {0x1e, 0x17, 0x28}, {0x15, 0x0f, 0x1c}, {0x20, 0x2d, 0x10}, {0x27, 0x16, 0x2e}, {0x14, 0x09, 0x12}, {0x3b, 0x3d, 0x21}, {0x25, 0x1a, 0x2c}, {0x00, 0x22, 0x36}, {0x0d, 0x30, 0x10}, {0x17, 0x19, 0x1b}, {0x00, 0x3b, 0x21}, {0x2a, 0x28, 0x34}, {0x2d, 0x0f, 0x16}, {0x0a, 0x30, 0x28}, {0x06, 0x00, 0x25}, {0x31, 0x2e, 0x2a}, {0x14, 0x33, 0x28}, {0x36, 0x10, 0x2e}, {0x05, 0x2e, 0x19}, {0x19, 0x1a, 0x15}, {0x2c, 0x14, 0x17}, {0x37, 0x0f, 0x13}, {0x32, 0x17, 0x1b}, {0x39, 0x18, 0x32}, {0x2e, 0x32, 0x1e}, {0x24, 0x1d, 0x31}, {0x12, 0x1d, 0x2b}, {0x14, 0x0c, 0x27}, {0x36, 0x2e, 0x32}, {0x06, 0x0a, 0x1a}, {0x28, 0x28, 0x20}, {0x3a, 0x3a, 0x17}, {0x08, 0x27, 0x36}, {0x18, 0x1a, 0x10}, {0x1e, 0x26, 0x1b}, {0x1f, 0x33, 0x1f}, {0x21, 0x17, 0x2f}, {0x01, 0x08, 0x20}, {0x35, 0x03, 0x19}, {0x3b, 0x02, 0x20}, {0x02, 0x2d, 0x23}, {0x0e, 0x17, 0x32}, {0x31, 0x29, 0x11}, {0x22, 0x17, 0x22}, {0x3a, 0x2c, 0x23}, {0x34, 0x20, 0x18}, {0x00, 0x3a, 0x22}, {0x25, 0x33, 0x21}, {0x33, 0x04, 0x27}, {0x04, 0x18, 0x32}, {0x2c, 0x0c, 0x2f}, {0x28, 0x14, 0x2c}, {0x3f, 0x30, 0x2b}, {0x30, 0x21, 0x1d}, {0x01, 0x25, 0x32}, {0x05, 0x23, 0x34}, {0x24, 0x10, 0x30}, {0x3d, 0x14, 0x1b}, {0x3f, 0x38, 0x2f}, {0x22, 0x1b, 0x32}, {0x25, 0x07, 0x37}, {0x0a, 0x0c, 0x1d}, {0x03, 0x1e, 0x1a}, {0x0f, 0x3c, 0x12}, {0x11, 0x18, 0x1d}, {0x00, 0x35, 0x2f}, {0x32, 0x18, 0x14}, {0x23, 0x30, 0x1b}, {0x11, 0x3d, 0x12}, {0x1a, 0x16, 0x35}, {0x28, 0x05, 0x24}, {0x17, 0x3d, 0x37}, {0x2e, 0x09, 0x2e}, {0x18, 0x1d, 0x17}, {0x20, 0x1f, 0x18}, {0x23, 0x2c, 0x2f}, {0x20, 0x3f, 0x16}, {0x3f, 0x29, 0x2e}, {0x23, 0x3b, 0x29}, {0x18, 0x39, 0x13}, {0x1e, 0x32, 0x35}, {0x14, 0x1d, 0x2a}, {0x35, 0x01, 0x1d}, {0x3e, 0x3b, 0x1e}, {0x22, 0x1e, 0x16}, {0x18, 0x22, 0x12}, {0x3e, 0x29, 0x33}, {0x2f, 0x14, 0x19}, {0x3b, 0x07, 0x15}, {0x06, 0x3d, 0x29}, {0x35, 0x37, 0x23}, {0x34, 0x1d, 0x2d}, {0x18, 0x12, 0x1b}, {0x0b, 0x13, 0x24}, {0x13, 0x38, 0x1c}, {0x1f, 0x0b, 0x1b}, {0x13, 0x21, 0x1c}, {0x06, 0x39, 0x32}, {0x37, 0x3d, 0x26}, {0x29, 0x26, 0x15}, {0x3c, 0x33, 0x27}, {0x00, 0x01, 0x2e}, {0x15, 0x18, 0x31}, {0x0d, 0x2c, 0x13}, {0x27, 0x3b, 0x20}, {0x2d, 0x01, 0x26}, {0x23, 0x15, 0x30}, {0x24, 0x00, 0x17}, {0x37, 0x3f, 0x33}, {0x25, 0x24, 0x31}, {0x06, 0x3b, 0x37}, {0x03, 0x18, 0x1a}, {0x2c, 0x34, 0x14}, {0x1d, 0x36, 0x18}, {0x3a, 0x04, 0x23}, {0x12, 0x26, 0x15}, {0x2b, 0x19, 0x1a}, {0x29, 0x2c, 0x36}, {0x01, 0x19, 0x1d}, {0x2f, 0x06, 0x2b}, {0x0c, 0x12, 0x26}, {0x36, 0x32, 0x1d}, {0x0d, 0x12, 0x28}, {0x03, 0x28, 0x13}, {0x29, 0x06, 0x17}, {0x03, 0x38, 0x21}, {0x30, 0x2c, 0x10}, {0x22, 0x00, 0x28}, {0x24, 0x3b, 0x1c}, {0x20, 0x3e, 0x13}, {0x02, 0x0c, 0x19}, {0x29, 0x2c, 0x1a}, {0x39, 0x30, 0x22}, {0x2a, 0x1f, 0x22}, {0x14, 0x34, 0x2c}, {0x14, 0x25, 0x1b}, {0x06, 0x3b, 0x15}, {0x06, 0x1c, 0x13}, {0x15, 0x03, 0x18}, {0x1e, 0x2a, 0x1b}, {0x17, 0x25, 0x2f}, {0x1c, 0x29, 0x2e}, {0x02, 0x32, 0x1e}, {0x1d, 0x28, 0x35}, {0x36, 0x03, 0x34}, {0x16, 0x3d, 0x2a}, {0x12, 0x0d, 0x13}, {0x1d, 0x2d, 0x21}, {0x32, 0x17, 0x2e}, {0x1a, 0x15, 0x26}, {0x22, 0x2f, 0x15}, {0x3c, 0x0e, 0x20}, {0x2f, 0x27, 0x13}, {0x04, 0x09, 0x32}, {0x1e, 0x01, 0x34}, {0x06, 0x16, 0x1e}, {0x2e, 0x1b, 0x1c}, {0x28, 0x13, 0x2a}, {0x30, 0x34, 0x12}, {0x12, 0x32, 0x18}, {0x1d, 0x1d, 0x35}, {0x07, 0x1c, 0x16}, {0x2d, 0x3d, 0x35}, {0x1c, 0x1b, 0x24}, {0x21, 0x2d, 0x1e}, {0x10, 0x09, 0x14}, {0x3d, 0x11, 0x12}, {0x25, 0x02, 0x26}, {0x23, 0x02, 0x19}, {0x19, 0x05, 0x14}, {0x0b, 0x21, 0x1a}, {0x09, 0x02, 0x2c}, {0x18, 0x28, 0x2d}, {0x1e, 0x10, 0x12}, {0x2e, 0x18, 0x2e}, {0x1f, 0x02, 0x2c}, {0x14, 0x17, 0x24}, {0x39, 0x08, 0x32}, {0x16, 0x14, 0x22}, {0x16, 0x28, 0x21}, {0x11, 0x10, 0x2c}, {0x23, 0x36, 0x2b}, {0x39, 0x21, 0x26}, {0x0e, 0x06, 0x2d}, {0x3c, 0x3e, 0x26}, {0x2a, 0x1b, 0x1f}, {0x00, 0x3c, 0x33}, {0x35, 0x3f, 0x14}, {0x00, 0x0b, 0x10}, {0x34, 0x3c, 0x17}, {0x2d, 0x07, 0x1f}, {0x24, 0x39, 0x27}, {0x16, 0x00, 0x1d}, {0x33, 0x2b, 0x1e}, {0x0f, 0x08, 0x31}, {0x3a, 0x09, 0x13}, {0x0c, 0x21, 0x1c}, {0x2a, 0x17, 0x34}, {0x29, 0x27, 0x10}, {0x37, 0x1b, 0x18}, {0x15, 0x08, 0x2f}, {0x1f, 0x16, 0x12}, {0x1f, 0x28, 0x34}, {0x1c, 0x20, 0x22}, {0x12, 0x01, 0x12}, {0x21, 0x31, 0x10}, {0x22, 0x26, 0x1e}, {0x01, 0x3d, 0x11}, {0x1e, 0x27, 0x25}, {0x3d, 0x30, 0x24}, {0x1d, 0x11, 0x22}, {0x36, 0x30, 0x16}, {0x1f, 0x3e, 0x2a}, {0x3c, 0x27, 0x1b}, {0x1f, 0x29, 0x10}, {0x1e, 0x05, 0x2a}, {0x0a, 0x10, 0x14}, {0x1f, 0x00, 0x2e}, {0x0b, 0x3b, 0x18}, {0x0a, 0x39, 0x30}, {0x37, 0x0b, 0x1f}, {0x1d, 0x0a, 0x29}, {0x3e, 0x1c, 0x33}, {0x13, 0x2e, 0x28}, {0x27, 0x1b, 0x1e}, {0x1d, 0x02, 0x1c}, {0x01, 0x25, 0x14}, {0x3a, 0x10, 0x1c}, {0x12, 0x05, 0x2a}, {0x30, 0x20, 0x26}, {0x2f, 0x2e, 0x2e}, {0x03, 0x07, 0x24}, {0x36, 0x04, 0x2b}, {0x11, 0x25, 0x2d}, {0x28, 0x0e, 0x2e}, {0x0f, 0x1d, 0x15}, {0x1c, 0x28, 0x30}, {0x1f, 0x23, 0x26}, {0x36, 0x12, 0x37}, {0x3a, 0x31, 0x10}, {0x2c, 0x2c, 0x2f}, {0x1a, 0x0d, 0x15}, {0x3f, 0x3c, 0x32}, {0x35, 0x1c, 0x16}, {0x33, 0x16, 0x28}, {0x1d, 0x3f, 0x21}, {0x2c, 0x3e, 0x2b}, {0x24, 0x23, 0x2f}, {0x32, 0x15, 0x2a}, {0x1b, 0x10, 0x35}, {0x18, 0x37, 0x10}, {0x3b, 0x1e, 0x11}, {0x2b, 0x16, 0x24}, {0x1d, 0x16, 0x26}, {0x3c, 0x2d, 0x11}, {0x15, 0x28, 0x28}, {0x27, 0x27, 0x27}, {0x3b, 0x3a, 0x16}, {0x1a, 0x0c, 0x1a}, {0x15, 0x08, 0x25}, {0x0b, 0x10, 0x22}, {0x1a, 0x3e, 0x17}, {0x28, 0x1f, 0x1e}, {0x01, 0x1e, 0x1e}, {0x1c, 0x2f, 0x10}, {0x25, 0x0b, 0x34}, {0x3e, 0x0c, 0x1a}, {0x1b, 0x10, 0x2a}, {0x0f, 0x14, 0x17}, {0x0f, 0x3f, 0x17}, {0x03, 0x15, 0x1f}, {0x02, 0x36, 0x17}, {0x15, 0x1d, 0x18}, {0x08, 0x36, 0x10}, {0x14, 0x0d, 0x2b}, {0x0a, 0x05, 0x1d}, {0x26, 0x12, 0x1e}, {0x3e, 0x18, 0x19}, {0x36, 0x18, 0x37}, {0x17, 0x39, 0x2e}, {0x0d, 0x04, 0x19}, {0x16, 0x22, 0x15}, {0x3e, 0x26, 0x1f}, {0x00, 0x06, 0x17}, {0x33, 0x22, 0x1d}, {0x2b, 0x39, 0x2b}, {0x3e, 0x31, 0x1c}, {0x22, 0x3f, 0x13}, {0x30, 0x1c, 0x31}, {0x07, 0x2b, 0x14}, {0x32, 0x35, 0x1e}, {0x02, 0x07, 0x20}, {0x0f, 0x3b, 0x11}, {0x20, 0x07, 0x12}, {0x2a, 0x30, 0x1d}, {0x28, 0x38, 0x36}, {0x20, 0x01, 0x17}, {0x15, 0x20, 0x21}, {0x3a, 0x1b, 0x1e}, {0x38, 0x12, 0x24}, {0x03, 0x3e, 0x1f}, {0x29, 0x1d, 0x13}, {0x20, 0x27, 0x19}, {0x12, 0x25, 0x20}, {0x32, 0x33, 0x2b}, {0x3f, 0x05, 0x31}, {0x35, 0x3c, 0x2d}, {0x2d, 0x02, 0x2e}, {0x10, 0x2a, 0x16}, {0x17, 0x08, 0x31}, {0x17, 0x2e, 0x2b}, {0x30, 0x1e, 0x15}, {0x31, 0x15, 0x26}, {0x08, 0x10, 0x33}, {0x15, 0x01, 0x27}, {0x12, 0x07, 0x2f}, {0x29, 0x27, 0x34}, {0x3f, 0x08, 0x31}, {0x1c, 0x20, 0x1a}, {0x33, 0x0c, 0x13}, {0x18, 0x31, 0x24}, {0x37, 0x2d, 0x2e}, {0x21, 0x18, 0x24}, {0x3a, 0x27, 0x31}, {0x35, 0x3e, 0x30}, {0x3a, 0x14, 0x33}, {0x0f, 0x1a, 0x2d}, {0x30, 0x2e, 0x11}, {0x1a, 0x31, 0x1d}, {0x17, 0x3c, 0x18}, {0x33, 0x31, 0x23}, {0x1d, 0x39, 0x2d}, {0x10, 0x1d, 0x2f}, {0x24, 0x15, 0x1c}, {0x25, 0x01, 0x2b}, {0x22, 0x16, 0x2e}, {0x1b, 0x25, 0x35}, {0x37, 0x10, 0x26}, {0x39, 0x01, 0x36}, {0x17, 0x2b, 0x14}, {0x09, 0x16, 0x17}, {0x20, 0x28, 0x23}, {0x26, 0x3a, 0x26}, {0x27, 0x2a, 0x24}, {0x36, 0x02, 0x2c}, {0x29, 0x30, 0x35}, {0x36, 0x01, 0x1f}, {0x28, 0x3b, 0x1d}, {0x23, 0x1e, 0x2d}, {0x11, 0x1e, 0x2c}, {0x2f, 0x32, 0x19}, {0x3f, 0x26, 0x31}, {0x38, 0x1e, 0x17}, {0x05, 0x18, 0x2e}, {0x00, 0x2e, 0x12}, {0x34, 0x3f, 0x34}, {0x16, 0x10, 0x29}, {0x20, 0x3d, 0x36}, {0x2f, 0x16, 0x25}, {0x12, 0x17, 0x10}, {0x21, 0x37, 0x35}, {0x25, 0x37, 0x2d}, {0x01, 0x08, 0x27}, {0x03, 0x1f, 0x29}, {0x0d, 0x2a, 0x16}, {0x3a, 0x3f, 0x33}, {0x2b, 0x19, 0x1d}, {0x2a, 0x1f, 0x29}, {0x28, 0x2c, 0x10}, {0x28, 0x30, 0x10}, {0x39, 0x14, 0x1b}, {0x00, 0x18, 0x21}, {0x28, 0x0c, 0x37}, {0x11, 0x10, 0x11}, {0x3c, 0x33, 0x32}, {0x33, 0x36, 0x1a}, {0x36, 0x00, 0x1c}, {0x31, 0x1b, 0x1d}, {0x38, 0x1d, 0x10}, {0x3c, 0x39, 0x27}, {0x3a, 0x3f, 0x14}, {0x19, 0x12, 0x14}, {0x0d, 0x1f, 0x18}, {0x00, 0x25, 0x18}, {0x28, 0x1c, 0x32}, {0x27, 0x03, 0x1a}, {0x26, 0x2d, 0x2a}, {0x29, 0x28, 0x27}, {0x0a, 0x2a, 0x18}, {0x0a, 0x1a, 0x30}, {0x20, 0x1a, 0x2e}, {0x06, 0x0b, 0x1d}, {0x0f, 0x0c, 0x1c}, {0x35, 0x28, 0x1c}, {0x3d, 0x16, 0x23}, {0x21, 0x1c, 0x31}, {0x14, 0x1c, 0x2e}, {0x22, 0x32, 0x35}, {0x09, 0x29, 0x30}, {0x20, 0x1a, 0x10}, {0x31, 0x3f, 0x2c}, {0x0a, 0x3d, 0x37}, {0x0b, 0x2e, 0x2d}, {0x1f, 0x22, 0x31}, {0x06, 0x07, 0x29}, {0x22, 0x17, 0x2d}, {0x30, 0x11, 0x18}, {0x0c, 0x19, 0x15}, {0x07, 0x0a, 0x34}, {0x18, 0x29, 0x27}, {0x33, 0x0c, 0x30}, {0x03, 0x1a, 0x37}, {0x06, 0x01, 0x2d}, {0x0f, 0x3b, 0x2b}, {0x11, 0x1f, 0x37}, {0x2b, 0x21, 0x36}, {0x3f, 0x23, 0x17}, {0x17, 0x07, 0x2b}, {0x2b, 0x0e, 0x30}, {0x11, 0x39, 0x1d}, {0x29, 0x03, 0x33}, {0x30, 0x03, 0x2f}, {0x3c, 0x20, 0x26}, {0x03, 0x22, 0x14}, {0x3a, 0x28, 0x35}, {0x01, 0x28, 0x2b}, {0x3e, 0x15, 0x18}, {0x30, 0x07, 0x17}, {0x3b, 0x2c, 0x30}, {0x15, 0x07, 0x2c}, {0x17, 0x27, 0x1d}, {0x3f, 0x1e, 0x33}, {0x0d, 0x17, 0x10}, {0x15, 0x0e, 0x30}, {0x09, 0x05, 0x30}, {0x2d, 0x20, 0x15}, {0x3c, 0x3d, 0x30}, {0x0c, 0x17, 0x1c}, {0x1a, 0x0d, 0x25}, {0x2b, 0x2b, 0x2a}, {0x02, 0x16, 0x2d}, {0x17, 0x31, 0x17}, {0x00, 0x08, 0x13}, {0x37, 0x35, 0x21}, {0x1e, 0x1c, 0x1f}, {0x2b, 0x32, 0x1c}, {0x10, 0x2a, 0x16}, {0x3a, 0x33, 0x31}, {0x17, 0x2b, 0x2a}, {0x0c, 0x3d, 0x11}, {0x28, 0x0a, 0x30}, {0x23, 0x0a, 0x26}, {0x0a, 0x14, 0x24}, {0x0b, 0x0f, 0x30}, {0x1b, 0x1e, 0x29}, {0x02, 0x35, 0x28}, {0x3b, 0x02, 0x14}, {0x00, 0x0f, 0x35}, {0x1c, 0x3c, 0x2e}, {0x28, 0x38, 0x19}, {0x1b, 0x11, 0x12}, {0x09, 0x16, 0x10}, {0x2e, 0x0d, 0x20}, {0x3d, 0x04, 0x32}, {0x16, 0x2c, 0x25}, {0x02, 0x3d, 0x18}, {0x0b, 0x13, 0x1c}, {0x22, 0x2a, 0x1c}, {0x20, 0x27, 0x22}, {0x05, 0x26, 0x22}, {0x12, 0x1d, 0x2c}, {0x08, 0x05, 0x2e}, {0x3f, 0x1c, 0x17}, {0x24, 0x0d, 0x33}, {0x36, 0x08, 0x24}, {0x10, 0x22, 0x29}, {0x1c, 0x0a, 0x11}, {0x25, 0x0f, 0x10}, {0x24, 0x38, 0x2f}, {0x25, 0x32, 0x1e}, {0x06, 0x2a, 0x29}, {0x3e, 0x3a, 0x28}, {0x34, 0x17, 0x33}, {0x18, 0x33, 0x17}, {0x07, 0x14, 0x1f}, {0x11, 0x17, 0x20}, {0x13, 0x0e, 0x14}, {0x3b, 0x1c, 0x12}, {0x2a, 0x13, 0x37}, {0x2a, 0x35, 0x32}, {0x30, 0x02, 0x25}, {0x00, 0x07, 0x1f}, {0x0c, 0x04, 0x2c}, {0x37, 0x37, 0x30}, {0x25, 0x12, 0x25}, {0x12, 0x22, 0x21}, {0x22, 0x35, 0x33}, {0x07, 0x20, 0x2d}, {0x27, 0x0e, 0x30}, {0x34, 0x19, 0x1a}, {0x0a, 0x3c, 0x25}, {0x07, 0x1d, 0x2b}, {0x31, 0x3a, 0x12}, {0x1a, 0x3d, 0x37}, {0x16, 0x15, 0x16}, {0x39, 0x13, 0x15}, {0x2d, 0x03, 0x2e}, {0x06, 0x39, 0x2c}, {0x16, 0x00, 0x13}, {0x35, 0x2a, 0x35}, {0x24, 0x01, 0x18}, {0x24, 0x37, 0x28}, {0x25, 0x1b, 0x34}, {0x25, 0x19, 0x17}, {0x27, 0x2f, 0x1b}, {0x27, 0x0d, 0x10}, {0x36, 0x3c, 0x30}, {0x3c, 0x33, 0x23}, {0x3e, 0x27, 0x1e}, {0x25, 0x2d, 0x29}, {0x1f, 0x12, 0x21}, {0x37, 0x32, 0x1f}, {0x11, 0x21, 0x35}, {0x30, 0x0c, 0x19}, {0x25, 0x3d, 0x26}, {0x17, 0x02, 0x1d}, {0x14, 0x2e, 0x11}, {0x38, 0x13, 0x30}, {0x0a, 0x2b, 0x20}, {0x1e, 0x10, 0x15}, {0x37, 0x30, 0x2e}, {0x1e, 0x04, 0x2c}, {0x14, 0x34, 0x19}, {0x08, 0x14, 0x18}, {0x0e, 0x1c, 0x30}, {0x1a, 0x2e, 0x1b}, {0x1f, 0x39, 0x31}, {0x0c, 0x1c, 0x28}, {0x3e, 0x33, 0x23}, {0x0f, 0x13, 0x16}, {0x25, 0x39, 0x2f}, {0x14, 0x1b, 0x1a}, {0x28, 0x3e, 0x21}, {0x2d, 0x19, 0x11}, {0x0c, 0x34, 0x32}, {0x39, 0x31, 0x19}, {0x1a, 0x08, 0x34}, {0x09, 0x2f, 0x11}, {0x30, 0x04, 0x1c}, {0x02, 0x3b, 0x1b}, {0x33, 0x21, 0x33}, {0x38, 0x02, 0x1a}, {0x31, 0x38, 0x32}, {0x1f, 0x1d, 0x16}, {0x17, 0x10, 0x1b}, {0x32, 0x20, 0x17}, {0x00, 0x33, 0x12}, {0x21, 0x0f, 0x27}, {0x14, 0x19, 0x27}, {0x24, 0x2c, 0x37}, {0x25, 0x05, 0x2f}, {0x3d, 0x25, 0x11}, {0x12, 0x30, 0x1a}, {0x16, 0x03, 0x1a}, {0x14, 0x09, 0x13}, {0x02, 0x23, 0x22}, {0x01, 0x3c, 0x10}, {0x3f, 0x2d, 0x23}, {0x31, 0x3f, 0x23}, {0x17, 0x00, 0x33}, {0x3f, 0x0f, 0x2f}, {0x26, 0x07, 0x15}, {0x21, 0x2b, 0x2a}, {0x38, 0x39, 0x1e}, {0x09, 0x25, 0x2b}, {0x3b, 0x30, 0x25}, {0x12, 0x2d, 0x13}, {0x32, 0x19, 0x28}, {0x24, 0x1c, 0x2d}, {0x35, 0x32, 0x26}, {0x0d, 0x23, 0x1e}, {0x1d, 0x07, 0x21}, {0x0b, 0x34, 0x17}, {0x2d, 0x32, 0x32}, {0x3a, 0x3c, 0x35}, {0x1a, 0x10, 0x33}, {0x1a, 0x07, 0x22}, {0x3b, 0x1b, 0x2a}, {0x33, 0x1f, 0x26}, {0x0e, 0x35, 0x1a}, {0x3b, 0x0a, 0x1c}, {0x11, 0x07, 0x11}, {0x0d, 0x3c, 0x2d}, {0x1e, 0x37, 0x29}, {0x11, 0x05, 0x12}, {0x15, 0x2f, 0x1c}, {0x24, 0x31, 0x16}, {0x2b, 0x21, 0x1b}, {0x23, 0x10, 0x31}, {0x02, 0x14, 0x29}, {0x26, 0x20, 0x16}, {0x10, 0x17, 0x10}, {0x0b, 0x0f, 0x33}, {0x01, 0x2e, 0x14}, {0x21, 0x0e, 0x37}, {0x1a, 0x1d, 0x2f}, {0x1e, 0x30, 0x24}, {0x04, 0x14, 0x2d}, {0x11, 0x00, 0x30}, {0x08, 0x2a, 0x1d}, {0x1d, 0x22, 0x21}, {0x24, 0x2c, 0x37}, {0x24, 0x11, 0x12}, {0x04, 0x2e, 0x28}, {0x1d, 0x18, 0x23}, {0x3c, 0x16, 0x16}, {0x10, 0x17, 0x31}, {0x20, 0x21, 0x12}, {0x33, 0x3e, 0x34}, {0x06, 0x13, 0x13}, {0x17, 0x38, 0x2b}, {0x14, 0x0d, 0x15}, {0x24, 0x3b, 0x2b}, {0x34, 0x3b, 0x1e}, {0x18, 0x07, 0x34}, {0x37, 0x1d, 0x1f}, {0x0b, 0x29, 0x20}, {0x12, 0x1e, 0x1d}, {0x1a, 0x24, 0x24}, {0x3d, 0x28, 0x24}, {0x0b, 0x12, 0x33}, {0x1b, 0x3a, 0x22}, {0x14, 0x13, 0x2a}, {0x31, 0x38, 0x15}, {0x37, 0x2b, 0x2e}, {0x19, 0x1e, 0x2c}, {0x3f, 0x1b, 0x2a}, {0x33, 0x1f, 0x33}, {0x3f, 0x15, 0x29}, {0x01, 0x1e, 0x18}, {0x1f, 0x22, 0x19}, {0x33, 0x3c, 0x34}, {0x1e, 0x12, 0x22}, {0x0d, 0x37, 0x2c}, {0x0f, 0x08, 0x31}, {0x2e, 0x09, 0x36}, {0x01, 0x05, 0x1e}, {0x1c, 0x04, 0x1e}, {0x0c, 0x01, 0x1c}, {0x29, 0x28, 0x2f}, {0x39, 0x2d, 0x14}, {0x09, 0x22, 0x36}, {0x04, 0x37, 0x37}, {0x2d, 0x2f, 0x35}, {0x24, 0x23, 0x1b}, {0x08, 0x20, 0x32}, {0x20, 0x1f, 0x34}, {0x02, 0x31, 0x19}, {0x18, 0x13, 0x36}, {0x06, 0x2b, 0x1e}, {0x0e, 0x1b, 0x10}, {0x2f, 0x0e, 0x1c}, {0x11, 0x38, 0x13}, {0x01, 0x37, 0x19}, {0x14, 0x11, 0x26}, {0x31, 0x3d, 0x33}, {0x1d, 0x1b, 0x34}, {0x25, 0x31, 0x2f}, {0x11, 0x0a, 0x2f}, {0x39, 0x17, 0x1b}, {0x05, 0x0e, 0x13}, {0x29, 0x25, 0x22}, {0x15, 0x0d, 0x20}, {0x2b, 0x27, 0x21}, {0x3e, 0x24, 0x27}, {0x2a, 0x2b, 0x16}, {0x24, 0x3d, 0x15}, {0x15, 0x30, 0x31}, {0x0f, 0x33, 0x24}, {0x06, 0x16, 0x13}, {0x06, 0x31, 0x10}, {0x2e, 0x3f, 0x10}, {0x05, 0x0d, 0x2f}, {0x3c, 0x1f, 0x19}, {0x12, 0x13, 0x24}, {0x0f, 0x33, 0x36}, {0x15, 0x3b, 0x33}, {0x03, 0x0f, 0x2a}, {0x3b, 0x3c, 0x2c}, {0x36, 0x09, 0x29}, {0x11, 0x3b, 0x27}, {0x28, 0x2b, 0x31}, {0x1a, 0x0e, 0x2f}, {0x39, 0x2c, 0x31}, {0x0e, 0x3c, 0x35}, {0x2c, 0x24, 0x33}, {0x3d, 0x11, 0x2b}, {0x07, 0x3c, 0x37}, {0x14, 0x18, 0x13}, {0x1d, 0x3f, 0x2e}, {0x30, 0x12, 0x25}, {0x26, 0x1d, 0x11}, {0x07, 0x11, 0x1e}, {0x34, 0x01, 0x11}, {0x0b, 0x39, 0x21}, {0x29, 0x02, 0x29}, {0x15, 0x10, 0x1a}, {0x30, 0x1f, 0x35}, {0x3c, 0x2b, 0x2a}, {0x30, 0x3b, 0x36}, {0x20, 0x1a, 0x23}, {0x32, 0x24, 0x2b}, {0x15, 0x20, 0x1c}, {0x25, 0x3d, 0x36}, {0x2d, 0x14, 0x31}, {0x18, 0x23, 0x17}, {0x18, 0x05, 0x13}, {0x34, 0x30, 0x37}, {0x0e, 0x39, 0x23}, {0x1d, 0x1f, 0x17}, {0x01, 0x15, 0x2f}, {0x0b, 0x3e, 0x1b}, {0x0d, 0x19, 0x2e}, {0x31, 0x38, 0x1c}, {0x15, 0x34, 0x15}, {0x13, 0x19, 0x29}, {0x19, 0x14, 0x27}, {0x15, 0x18, 0x23}, {0x29, 0x0c, 0x27}, {0x2d, 0x0e, 0x17}, {0x34, 0x18, 0x10}, {0x3b, 0x1e, 0x29}, {0x34, 0x2c, 0x22}, {0x31, 0x08, 0x13}, {0x1d, 0x18, 0x1a}, {0x1c, 0x0b, 0x2a}, {0x19, 0x1e, 0x1a}, {0x23, 0x27, 0x17}, {0x3b, 0x0e, 0x37}, {0x19, 0x2b, 0x16}, {0x2f, 0x08, 0x21}, {0x37, 0x02, 0x20}, {0x0b, 0x32, 0x30}, {0x16, 0x05, 0x30}, {0x13, 0x05, 0x1a}, {0x07, 0x39, 0x19}, {0x0c, 0x3b, 0x2a}, {0x15, 0x05, 0x30}, {0x30, 0x05, 0x19}, {0x13, 0x00, 0x12}, {0x27, 0x16, 0x2a}, {0x0f, 0x28, 0x27}, {0x0c, 0x23, 0x2f}, {0x39, 0x28, 0x2a}, {0x24, 0x25, 0x1f}, {0x18, 0x29, 0x14}, {0x16, 0x05, 0x1a}, {0x35, 0x2f, 0x26}, {0x0a, 0x3a, 0x29}, {0x34, 0x2c, 0x36}, {0x2e, 0x3a, 0x15}, {0x1a, 0x0a, 0x2d}, {0x16, 0x14, 0x2e}, {0x35, 0x28, 0x2a}, {0x35, 0x0f, 0x11}, {0x11, 0x32, 0x19}, {0x20, 0x1a, 0x28}, {0x17, 0x1a, 0x28}, {0x16, 0x33, 0x25}, {0x13, 0x2c, 0x29}, {0x09, 0x16, 0x33}, {0x1d, 0x27, 0x26}, {0x15, 0x0c, 0x2f}, {0x22, 0x1c, 0x19}, {0x29, 0x33, 0x10}, {0x2d, 0x11, 0x1b}, {0x16, 0x19, 0x2e}, {0x0d, 0x0c, 0x28}, {0x37, 0x3a, 0x34}, {0x2a, 0x1d, 0x37}, {0x30, 0x0a, 0x36}, {0x24, 0x39, 0x1b}, {0x39, 0x0a, 0x32}, {0x11, 0x03, 0x2d}, {0x32, 0x1d, 0x30}, {0x38, 0x1e, 0x27}, {0x2e, 0x17, 0x18}, {0x16, 0x17, 0x2a}, {0x36, 0x3b, 0x31}, {0x17, 0x04, 0x19}, {0x3a, 0x25, 0x2d}, {0x00, 0x36, 0x27}, {0x25, 0x12, 0x33}, {0x06, 0x0a, 0x14}, {0x11, 0x05, 0x2f}, {0x03, 0x35, 0x2f}, {0x0b, 0x34, 0x29}, {0x00, 0x31, 0x13}, {0x27, 0x0f, 0x1c}, {0x1d, 0x06, 0x2d}, {0x1c, 0x30, 0x27}, {0x2f, 0x2a, 0x27}, {0x16, 0x20, 0x31}, {0x33, 0x2b, 0x2b}, {0x05, 0x30, 0x36}, {0x29, 0x23, 0x35}, {0x10, 0x16, 0x2f}, {0x2d, 0x20, 0x29}, {0x37, 0x13, 0x24}, {0x2d, 0x0e, 0x25}, {0x08, 0x0a, 0x18}, {0x0f, 0x03, 0x1b}, {0x31, 0x0c, 0x37}, {0x1e, 0x34, 0x31}, {0x1b, 0x0e, 0x25}, {0x1a, 0x07, 0x34}, {0x0d, 0x3c, 0x33}, {0x00, 0x3a, 0x36}, {0x04, 0x27, 0x12}, {0x23, 0x18, 0x24}, {0x0d, 0x0b, 0x18}, {0x31, 0x32, 0x37}, {0x00, 0x0d, 0x21}, {0x32, 0x10, 0x12}, {0x26, 0x0d, 0x19}, {0x29, 0x24, 0x2b}, {0x3d, 0x21, 0x1f}, {0x1e, 0x1b, 0x28}, {0x0d, 0x12, 0x28}, {0x35, 0x1e, 0x23}, {0x0a, 0x2e, 0x22}, {0x27, 0x27, 0x35}, {0x01, 0x0e, 0x20}, {0x31, 0x39, 0x29}, {0x3b, 0x24, 0x36}, {0x14, 0x10, 0x33}, {0x18, 0x2c, 0x26}, {0x04, 0x2d, 0x15}, {0x1a, 0x11, 0x37}, {0x0f, 0x0b, 0x14}, {0x0e, 0x2c, 0x2c}, {0x21, 0x17, 0x2c}, {0x16, 0x21, 0x35}, {0x3e, 0x10, 0x10}, {0x0a, 0x05, 0x1e}, {0x3b, 0x09, 0x13}, {0x26, 0x18, 0x1e}, {0x23, 0x0c, 0x1a}, {0x33, 0x37, 0x1f}, {0x09, 0x12, 0x35}, {0x3d, 0x0d, 0x15}, {0x36, 0x06, 0x24}, {0x33, 0x30, 0x29}, {0x3b, 0x0f, 0x28}, {0x34, 0x2a, 0x2c}, {0x02, 0x12, 0x35}, {0x09, 0x22, 0x31}, {0x3b, 0x31, 0x1c}, {0x33, 0x22, 0x27}, {0x3d, 0x34, 0x15}, {0x14, 0x22, 0x28}, {0x28, 0x10, 0x1e}, {0x21, 0x31, 0x10}, {0x2d, 0x16, 0x21}, {0x1e, 0x05, 0x33}, {0x0f, 0x30, 0x31}, {0x0e, 0x1a, 0x35}, {0x38, 0x2e, 0x28}, {0x26, 0x37, 0x1e}, {0x2b, 0x13, 0x33}, {0x1f, 0x1e, 0x37}, {0x0a, 0x28, 0x24}, {0x32, 0x1c, 0x1a}, {0x1f, 0x3f, 0x19}, {0x39, 0x39, 0x29}, {0x2c, 0x1b, 0x14}, {0x15, 0x2a, 0x17}, {0x32, 0x0f, 0x21}, {0x30, 0x21, 0x18}, {0x23, 0x2a, 0x27}, {0x3d, 0x07, 0x10}, {0x0b, 0x3f, 0x2f}, {0x31, 0x02, 0x2e}, {0x08, 0x39, 0x2f}, {0x3f, 0x20, 0x18}, {0x2d, 0x34, 0x11}, {0x2e, 0x34, 0x10}, {0x26, 0x12, 0x23}, {0x25, 0x0a, 0x37}, {0x34, 0x09, 0x25}, {0x0a, 0x3e, 0x16}, {0x1a, 0x17, 0x11}, {0x38, 0x1c, 0x20}, {0x11, 0x21, 0x26}, {0x05, 0x0f, 0x18}, {0x26, 0x2b, 0x32}, {0x0a, 0x0c, 0x16}, {0x03, 0x29, 0x1d}, {0x29, 0x3b, 0x23}, {0x16, 0x1b, 0x29}, {0x07, 0x09, 0x17}, {0x17, 0x2c, 0x1c}, {0x35, 0x33, 0x30}, {0x17, 0x12, 0x1e}, {0x3d, 0x1a, 0x2b}, {0x21, 0x1d, 0x10}, {0x0a, 0x08, 0x17}, {0x14, 0x3c, 0x36}, {0x28, 0x36, 0x36}, {0x3b, 0x20, 0x1b}, {0x13, 0x22, 0x1d}, {0x13, 0x3a, 0x15}, {0x02, 0x23, 0x2c}, {0x3e, 0x19, 0x14}, {0x39, 0x3c, 0x1a}, {0x10, 0x08, 0x1e}, {0x0a, 0x13, 0x29}, {0x3f, 0x38, 0x2c}, {0x07, 0x23, 0x1f}, {0x19, 0x2a, 0x24}, {0x14, 0x3c, 0x1f}, {0x0d, 0x04, 0x37}, {0x1a, 0x2f, 0x28}, {0x2a, 0x1d, 0x1e}, {0x11, 0x37, 0x29}, {0x28, 0x27, 0x12}, {0x0d, 0x00, 0x26}, {0x0a, 0x3c, 0x26}, {0x1f, 0x1c, 0x33}, {0x04, 0x3a, 0x2c}, {0x24, 0x3d, 0x2b}, {0x26, 0x31, 0x2f}, {0x13, 0x1c, 0x21}, {0x3e, 0x12, 0x23}, {0x36, 0x0a, 0x1a}, {0x2d, 0x1e, 0x19}, {0x05, 0x1f, 0x1b}, {0x1e, 0x0a, 0x1f}, {0x20, 0x08, 0x24}, {0x2c, 0x0c, 0x33}, {0x1d, 0x1f, 0x11}, {0x0e, 0x12, 0x10}, {0x27, 0x12, 0x19}, {0x2a, 0x13, 0x31}, {0x1c, 0x04, 0x30}, {0x1a, 0x38, 0x1f}, {0x2c, 0x35, 0x25}, {0x07, 0x0b, 0x33}, {0x2d, 0x02, 0x1a}, {0x2a, 0x35, 0x35}, {0x16, 0x2f, 0x14}, {0x11, 0x31, 0x33}, {0x2c, 0x31, 0x1e}, {0x3c, 0x3a, 0x27}, {0x3c, 0x2b, 0x12}, {0x27, 0x1d, 0x12}, {0x36, 0x2c, 0x2b}, {0x25, 0x3b, 0x35}, {0x12, 0x3d, 0x27}, {0x13, 0x23, 0x19}, {0x33, 0x2c, 0x26}, {0x09, 0x3c, 0x12}, {0x15, 0x1a, 0x23}, {0x21, 0x07, 0x1a}, {0x22, 0x25, 0x20}, {0x19, 0x1b, 0x2c}, {0x3a, 0x19, 0x35}, {0x05, 0x26, 0x1d}, {0x23, 0x22, 0x25}, {0x0e, 0x1e, 0x11}, {0x13, 0x30, 0x12}, {0x2c, 0x22, 0x25}, {0x0a, 0x1d, 0x18}, {0x23, 0x3e, 0x1d}, {0x02, 0x28, 0x25}, {0x21, 0x0e, 0x20}, {0x21, 0x22, 0x37}, {0x18, 0x33, 0x27}, {0x23, 0x23, 0x31}, {0x24, 0x1a, 0x1a}, {0x3e, 0x25, 0x24}, {0x24, 0x01, 0x18}, {0x34, 0x10, 0x22}, {0x07, 0x00, 0x37}, {0x06, 0x20, 0x20}, {0x3a, 0x02, 0x2b}, {0x07, 0x2c, 0x2c}, {0x09, 0x2f, 0x2a}, {0x01, 0x32, 0x2c}, {0x00, 0x35, 0x13}, {0x2b, 0x3c, 0x1f}, {0x36, 0x37, 0x1e}, {0x20, 0x35, 0x1d}, {0x0c, 0x07, 0x33}, {0x16, 0x08, 0x12}, {0x3f, 0x36, 0x11}, {0x0b, 0x1f, 0x2d}, {0x21, 0x20, 0x33}, {0x17, 0x1a, 0x2e}, {0x16, 0x01, 0x2f}, {0x2f, 0x1c, 0x34}, {0x29, 0x31, 0x2e}, {0x3b, 0x38, 0x31}, {0x0d, 0x16, 0x12}, {0x07, 0x29, 0x24}, {0x33, 0x3c, 0x34}, {0x3e, 0x1e, 0x18}, {0x30, 0x02, 0x34}, {0x2a, 0x34, 0x1b}, {0x2e, 0x23, 0x18}, {0x34, 0x00, 0x1f}, {0x20, 0x0e, 0x28}, {0x15, 0x33, 0x37}, {0x27, 0x35, 0x23}, {0x37, 0x3e, 0x11}, {0x32, 0x2e, 0x36}, {0x3a, 0x02, 0x2b}, {0x00, 0x36, 0x1d}, {0x13, 0x29, 0x16}, {0x08, 0x2b, 0x37}, {0x08, 0x02, 0x27}, {0x32, 0x2d, 0x34}, {0x30, 0x36, 0x29}, {0x2e, 0x10, 0x12}, {0x3c, 0x2e, 0x2a}, {0x04, 0x33, 0x30}, {0x3f, 0x01, 0x22}, {0x37, 0x14, 0x1d}, {0x27, 0x00, 0x2f}, {0x0c, 0x39, 0x26}, {0x27, 0x04, 0x21}, {0x19, 0x08, 0x1d}, {0x01, 0x04, 0x1e}, {0x27, 0x1b, 0x2b}, {0x31, 0x17, 0x1f}, {0x07, 0x01, 0x2d}, {0x2e, 0x3b, 0x1f}, {0x34, 0x24, 0x31}, {0x32, 0x2b, 0x24}, {0x0e, 0x07, 0x1e}, {0x0f, 0x33, 0x10}, {0x16, 0x21, 0x32}, {0x39, 0x02, 0x1a}, {0x33, 0x3d, 0x22}, {0x0c, 0x25, 0x1a}, {0x29, 0x29, 0x28}, {0x3a, 0x32, 0x26}, {0x0b, 0x13, 0x22}, {0x1f, 0x0f, 0x1c}, {0x04, 0x2c, 0x20}, {0x39, 0x1a, 0x1b}, {0x1a, 0x2a, 0x1f}, {0x24, 0x13, 0x1a}, {0x31, 0x3b, 0x33}, {0x39, 0x23, 0x28}, {0x31, 0x07, 0x31}, {0x1f, 0x10, 0x20}, {0x29, 0x17, 0x32}, {0x26, 0x3b, 0x2d}, {0x02, 0x3c, 0x1c}, {0x0e, 0x00, 0x20}, {0x14, 0x3e, 0x37}, {0x01, 0x0f, 0x2d}, {0x06, 0x12, 0x27}, {0x30, 0x13, 0x19}, {0x00, 0x33, 0x2a}, {0x0c, 0x07, 0x27}, {0x11, 0x3a, 0x1c}, {0x15, 0x0a, 0x13}, {0x1f, 0x0d, 0x2a}, {0x37, 0x07, 0x2a}, {0x34, 0x35, 0x34}, {0x28, 0x16, 0x27}, {0x06, 0x02, 0x36}, {0x09, 0x23, 0x30}, {0x14, 0x02, 0x28}, {0x39, 0x32, 0x34}, {0x24, 0x35, 0x12}, {0x12, 0x22, 0x26}, {0x09, 0x07, 0x33}, {0x0f, 0x3e, 0x1e}, {0x00, 0x3c, 0x33}, {0x10, 0x37, 0x14}, {0x3a, 0x03, 0x25}, {0x2d, 0x1e, 0x24}, {0x36, 0x36, 0x26}, {0x1f, 0x3c, 0x1a}, {0x37, 0x33, 0x25}, {0x23, 0x13, 0x1f}, {0x33, 0x0d, 0x13}, {0x25, 0x30, 0x1e}, {0x17, 0x03, 0x18}, {0x18, 0x18, 0x14}, {0x30, 0x07, 0x22}, {0x3e, 0x33, 0x21}, {0x14, 0x37, 0x16}, {0x16, 0x00, 0x12}, {0x2c, 0x12, 0x2f}, {0x25, 0x3f, 0x1e}, {0x24, 0x19, 0x16}, {0x16, 0x0f, 0x35}, {0x2d, 0x10, 0x11}, {0x24, 0x2a, 0x28}, {0x19, 0x25, 0x2e}, {0x0c, 0x16, 0x1f}, {0x38, 0x21, 0x36}, {0x3d, 0x1a, 0x2f}, {0x3b, 0x32, 0x12}, {0x36, 0x13, 0x29}, {0x0e, 0x30, 0x31}, {0x19, 0x07, 0x2f}, {0x25, 0x23, 0x28}, {0x20, 0x08, 0x29}, {0x2a, 0x00, 0x30}, {0x30, 0x38, 0x23}, {0x1e, 0x0f, 0x1f}, {0x3b, 0x1b, 0x30}, {0x3a, 0x37, 0x2f}, {0x39, 0x37, 0x35}, {0x39, 0x2d, 0x2f}, {0x1f, 0x2e, 0x1e}, {0x1a, 0x2b, 0x1e}, {0x14, 0x17, 0x20}, {0x2f, 0x03, 0x11}, {0x1d, 0x00, 0x30}, {0x17, 0x2b, 0x1d}, {0x35, 0x28, 0x25}, {0x3b, 0x0f, 0x11}, {0x09, 0x04, 0x2e}, {0x23, 0x11, 0x1e}, {0x13, 0x37, 0x1e}, {0x37, 0x37, 0x1e}, {0x07, 0x01, 0x32}, {0x14, 0x06, 0x32}, {0x11, 0x0c, 0x2e}, {0x36, 0x2e, 0x24}, {0x15, 0x2a, 0x1c}, {0x22, 0x15, 0x34}, {0x2c, 0x1e, 0x35}, {0x22, 0x27, 0x33}, {0x19, 0x3f, 0x2d}, {0x21, 0x33, 0x15}, {0x26, 0x1a, 0x11}, {0x16, 0x3e, 0x12}, {0x2b, 0x24, 0x15}, {0x3c, 0x0f, 0x2d}, {0x31, 0x15, 0x36}, {0x3f, 0x24, 0x1d}, {0x25, 0x01, 0x37}, {0x33, 0x16, 0x1a}, {0x1f, 0x0e, 0x10}, {0x2f, 0x0b, 0x12}, {0x2a, 0x1a, 0x25}, {0x17, 0x0a, 0x35}, {0x09, 0x28, 0x35}, {0x02, 0x13, 0x36}, {0x34, 0x2f, 0x17}, {0x03, 0x04, 0x31}, {0x3e, 0x26, 0x11}, {0x35, 0x33, 0x31}, {0x22, 0x17, 0x23}, {0x1d, 0x05, 0x2b}, {0x2e, 0x27, 0x20}, {0x03, 0x2b, 0x1d}, {0x01, 0x19, 0x1e}, {0x0e, 0x05, 0x18}, {0x16, 0x25, 0x17}, {0x02, 0x28, 0x18}, {0x19, 0x0b, 0x24}, {0x3e, 0x35, 0x16}, {0x2e, 0x29, 0x25}, {0x3e, 0x38, 0x1e}, {0x3a, 0x2f, 0x12}, {0x14, 0x17, 0x2d}, {0x11, 0x12, 0x30}, {0x15, 0x31, 0x18}, {0x08, 0x0b, 0x29}, {0x2d, 0x00, 0x33}, {0x2c, 0x06, 0x1a}, {0x14, 0x1c, 0x2e}, {0x04, 0x08, 0x12}, {0x1b, 0x2b, 0x2d}, {0x2a, 0x37, 0x33}, {0x10, 0x27, 0x2c}, {0x1d, 0x0e, 0x34}, {0x20, 0x02, 0x12}, {0x1e, 0x1a, 0x2e}, {0x07, 0x0b, 0x10}, {0x36, 0x1e, 0x33}, {0x2b, 0x28, 0x1b}, {0x31, 0x25, 0x1f}, {0x38, 0x3a, 0x2f}, {0x39, 0x30, 0x2f}, {0x12, 0x09, 0x14}, {0x0e, 0x08, 0x19}, {0x00, 0x0d, 0x2c}, {0x1b, 0x0e, 0x34}, {0x11, 0x25, 0x15}, {0x0c, 0x2d, 0x26}, {0x36, 0x2c, 0x16}, {0x31, 0x31, 0x2c}, {0x03, 0x1a, 0x16}, {0x1c, 0x32, 0x14}, {0x0a, 0x3e, 0x36}, {0x33, 0x1b, 0x27}, {0x1f, 0x32, 0x18}, {0x33, 0x26, 0x33}, {0x1a, 0x13, 0x1a}, {0x0f, 0x34, 0x1c}, {0x35, 0x2c, 0x2f}, {0x38, 0x03, 0x18}, {0x15, 0x0f, 0x27}, {0x31, 0x29, 0x20}, {0x28, 0x0e, 0x28}, {0x31, 0x2c, 0x2e}, {0x15, 0x19, 0x1b}, {0x10, 0x03, 0x2f}, {0x2e, 0x2a, 0x32}, {0x2a, 0x27, 0x1b}, {0x36, 0x04, 0x1e}, {0x3b, 0x04, 0x21}, {0x07, 0x2f, 0x19}, {0x27, 0x1d, 0x1d}, {0x3c, 0x3d, 0x2e}, {0x25, 0x08, 0x32}, {0x3b, 0x34, 0x2a}, {0x0c, 0x10, 0x13}, {0x25, 0x35, 0x1a}, {0x2f, 0x19, 0x28}, {0x17, 0x00, 0x2b}, {0x0a, 0x1c, 0x17}, {0x0a, 0x11, 0x1b}, {0x35, 0x13, 0x37}, {0x29, 0x1c, 0x28}, {0x0c, 0x31, 0x35}, {0x3c, 0x10, 0x1a}, {0x1b, 0x3a, 0x2d}, {0x3a, 0x1c, 0x18}, {0x22, 0x10, 0x2d}, {0x1c, 0x3c, 0x12}, {0x17, 0x18, 0x2a}, {0x0b, 0x2b, 0x2f}, {0x2d, 0x04, 0x2e}, {0x3c, 0x13, 0x23}, {0x01, 0x1c, 0x2e}, {0x14, 0x16, 0x22}, {0x0c, 0x24, 0x13}, {0x35, 0x37, 0x34}, {0x1b, 0x30, 0x1e}, {0x3a, 0x1c, 0x20}, {0x06, 0x06, 0x36}, {0x09, 0x15, 0x1a}, {0x1b, 0x1a, 0x27}, {0x0f, 0x33, 0x35}, {0x37, 0x06, 0x23}, {0x3a, 0x12, 0x1d}, {0x00, 0x16, 0x29}, {0x0e, 0x1d, 0x35}, {0x3f, 0x38, 0x16}, {0x2a, 0x3c, 0x34}, {0x13, 0x32, 0x10}, {0x17, 0x2c, 0x37}, {0x29, 0x2a, 0x1e}, {0x35, 0x2f, 0x2d}, {0x3c, 0x2a, 0x11}, {0x28, 0x13, 0x21}, {0x19, 0x1e, 0x34}, {0x0c, 0x06, 0x2d}, {0x09, 0x04, 0x1c}, {0x1d, 0x2f, 0x26}, {0x39, 0x07, 0x16}, {0x14, 0x04, 0x2d}, {0x3a, 0x2f, 0x2e}, {0x29, 0x15, 0x35}, {0x24, 0x02, 0x36}, {0x3f, 0x02, 0x1a}, {0x0f, 0x18, 0x24}, {0x16, 0x1d, 0x19}, {0x14, 0x16, 0x10}, {0x29, 0x1b, 0x13}, {0x15, 0x0e, 0x19}, {0x3a, 0x2e, 0x2b}, {0x08, 0x30, 0x15}, {0x35, 0x16, 0x30}, {0x2e, 0x18, 0x35}, {0x3b, 0x0b, 0x1c}, {0x3a, 0x18, 0x13}, {0x29, 0x13, 0x1e}, {0x20, 0x13, 0x27}, {0x04, 0x1d, 0x34}, {0x00, 0x38, 0x19}, {0x08, 0x39, 0x32}, {0x20, 0x10, 0x26}, {0x08, 0x02, 0x28}, {0x3f, 0x0f, 0x16}, {0x30, 0x1f, 0x19}, {0x20, 0x2d, 0x10}, {0x38, 0x17, 0x1c}, {0x18, 0x31, 0x27}, {0x33, 0x38, 0x30}, {0x16, 0x33, 0x23}, {0x00, 0x01, 0x36}, {0x0d, 0x02, 0x23}, {0x39, 0x04, 0x1f}, {0x0e, 0x30, 0x24}, {0x06, 0x01, 0x2c}, {0x34, 0x33, 0x35}, {0x16, 0x34, 0x2e}, {0x32, 0x16, 0x24}, {0x26, 0x39, 0x34}, {0x1f, 0x3c, 0x1d}, {0x28, 0x1d, 0x37}, {0x17, 0x15, 0x2b}, {0x27, 0x39, 0x30}, {0x0b, 0x1b, 0x18}, {0x35, 0x20, 0x2d}, {0x0b, 0x35, 0x1c}, {0x03, 0x0e, 0x21}, {0x06, 0x0c, 0x20}, {0x02, 0x18, 0x34}, {0x1e, 0x36, 0x2d}, {0x16, 0x0c, 0x19}, {0x25, 0x09, 0x2c}, {0x37, 0x05, 0x2e}, {0x2e, 0x2b, 0x2c}, {0x24, 0x1a, 0x14}, {0x27, 0x04, 0x10}, {0x32, 0x38, 0x33}, {0x37, 0x15, 0x35}, {0x11, 0x3f, 0x1d}, {0x23, 0x23, 0x1f}, {0x29, 0x3f, 0x1d}, {0x1a, 0x3c, 0x2b}, {0x1b, 0x2c, 0x2c}, {0x38, 0x3b, 0x36}, {0x04, 0x13, 0x33}, {0x2c, 0x14, 0x12}, {0x1a, 0x09, 0x1b}, {0x36, 0x11, 0x24}, {0x3a, 0x3f, 0x11}, {0x01, 0x0e, 0x2b}, {0x3b, 0x03, 0x2a}, {0x08, 0x0d, 0x2b}, {0x2b, 0x13, 0x27}, {0x3a, 0x3c, 0x1c}, {0x3a, 0x15, 0x2a}, {0x24, 0x00, 0x17}, {0x3e, 0x0a, 0x15}, {0x0c, 0x29, 0x2d}, {0x1f, 0x15, 0x30}, {0x35, 0x18, 0x19}, {0x3d, 0x37, 0x37}, {0x12, 0x38, 0x1b}, {0x3b, 0x02, 0x20}, {0x08, 0x21, 0x19}, {0x2e, 0x36, 0x1d}, {0x15, 0x3d, 0x24}, {0x22, 0x0c, 0x27}, {0x36, 0x3f, 0x33}, {0x33, 0x12, 0x11}, {0x1a, 0x19, 0x1f}, {0x2b, 0x24, 0x12}, {0x11, 0x2a, 0x18}, {0x25, 0x32, 0x2a}, {0x2c, 0x1a, 0x12}, {0x26, 0x06, 0x10}, {0x11, 0x29, 0x33}, {0x2c, 0x09, 0x14}, {0x2b, 0x12, 0x2b}, {0x1d, 0x03, 0x24}, {0x00, 0x12, 0x15}, {0x22, 0x3d, 0x26}, {0x15, 0x37, 0x1a}, {0x0f, 0x12, 0x37}, {0x24, 0x01, 0x18}, {0x2a, 0x17, 0x13}, {0x14, 0x3b, 0x29}, {0x2a, 0x19, 0x32}, {0x2d, 0x17, 0x17}, {0x0b, 0x2c, 0x33}, {0x07, 0x2d, 0x34}, {0x07, 0x38, 0x1d}, {0x1f, 0x36, 0x22}, {0x11, 0x0a, 0x17}, {0x14, 0x11, 0x13}, {0x2a, 0x17, 0x25}, {0x01, 0x3a, 0x1c}, {0x26, 0x27, 0x30}, {0x2d, 0x3b, 0x35}, {0x3a, 0x30, 0x34}, {0x06, 0x3a, 0x1c}, {0x2d, 0x05, 0x13}, {0x21, 0x32, 0x12}, {0x3e, 0x1e, 0x2c}, {0x3a, 0x3f, 0x2d}, {0x20, 0x2a, 0x34}, {0x26, 0x03, 0x1a}, {0x19, 0x27, 0x2e}, {0x31, 0x04, 0x26}, {0x2a, 0x3f, 0x30}, {0x25, 0x23, 0x2a}, {0x08, 0x08, 0x35}, {0x2c, 0x30, 0x1e}, {0x08, 0x05, 0x18}, {0x06, 0x09, 0x2d}, {0x19, 0x00, 0x27}, {0x0d, 0x10, 0x19}, {0x1c, 0x00, 0x13}, {0x3d, 0x0b, 0x24}, {0x2e, 0x1f, 0x16}, {0x3d, 0x18, 0x34}, {0x12, 0x1e, 0x15}, {0x15, 0x39, 0x25}, {0x33, 0x0f, 0x17}, {0x1a, 0x1c, 0x1b}, {0x37, 0x29, 0x1b}, {0x3b, 0x38, 0x12}, {0x1d, 0x22, 0x34}, {0x26, 0x0a, 0x31}, {0x16, 0x2d, 0x13}, {0x0d, 0x20, 0x27}, {0x24, 0x1d, 0x16}, {0x2e, 0x2b, 0x18}, {0x16, 0x2a, 0x1b}, {0x24, 0x17, 0x36}, {0x02, 0x05, 0x2b}, {0x37, 0x1a, 0x17}, {0x11, 0x3d, 0x2c}, {0x1e, 0x2f, 0x22}, {0x2c, 0x29, 0x1a}, {0x2f, 0x04, 0x25}, {0x36, 0x0c, 0x35}, {0x30, 0x3e, 0x12}, {0x11, 0x30, 0x37}, {0x12, 0x21, 0x2e}, {0x21, 0x30, 0x17}, {0x2c, 0x3d, 0x24}, {0x11, 0x23, 0x14}, {0x1a, 0x32, 0x17}, {0x39, 0x27, 0x18}, {0x0f, 0x24, 0x19}, {0x00, 0x3d, 0x37}, {0x2c, 0x3c, 0x1c}, {0x0b, 0x39, 0x23}, {0x0e, 0x04, 0x1f}, {0x1c, 0x31, 0x14}, {0x00, 0x04, 0x15}, {0x26, 0x2a, 0x2a}, {0x20, 0x25, 0x2a}, {0x0b, 0x3c, 0x33}, {0x11, 0x0b, 0x2e}, {0x37, 0x22, 0x2e}, {0x0e, 0x22, 0x26}, {0x18, 0x2d, 0x27}, {0x06, 0x0c, 0x1c}, {0x26, 0x18, 0x2f}, {0x3a, 0x01, 0x2a}, {0x2f, 0x31, 0x34}, {0x1f, 0x34, 0x1a}, {0x31, 0x05, 0x10}, {0x2e, 0x17, 0x34}, {0x18, 0x22, 0x23}, {0x23, 0x21, 0x32}, {0x07, 0x08, 0x22}, {0x26, 0x1c, 0x22}, {0x31, 0x12, 0x2f}, {0x08, 0x1f, 0x10}, {0x27, 0x15, 0x2a}, {0x1f, 0x0b, 0x26}, {0x2f, 0x14, 0x35}, {0x24, 0x1f, 0x26}, {0x3b, 0x23, 0x33}, {0x20, 0x3e, 0x2d}, {0x17, 0x0c, 0x15}, {0x13, 0x39, 0x1a}, {0x30, 0x14, 0x25}, {0x09, 0x07, 0x17}, {0x38, 0x38, 0x1f}, {0x29, 0x24, 0x27}, {0x17, 0x27, 0x28}, {0x1b, 0x12, 0x2a}, {0x2b, 0x3d, 0x2d}, {0x19, 0x34, 0x1c}, {0x01, 0x1d, 0x10}, {0x08, 0x39, 0x11}, {0x0e, 0x36, 0x1b}, {0x26, 0x13, 0x10}, {0x16, 0x28, 0x1e}, {0x3c, 0x28, 0x17}, {0x3e, 0x39, 0x34}, {0x0a, 0x03, 0x2e}, {0x37, 0x1a, 0x13}, {0x2b, 0x33, 0x26}, {0x13, 0x2c, 0x21}, {0x25, 0x14, 0x10}, {0x16, 0x0b, 0x35}, {0x1d, 0x35, 0x33}, {0x21, 0x08, 0x33}, {0x28, 0x21, 0x1a}, {0x12, 0x0c, 0x1b}, {0x36, 0x2a, 0x19}, {0x2c, 0x2b, 0x23}, {0x01, 0x0f, 0x26}, {0x17, 0x0c, 0x18}, {0x09, 0x0f, 0x11}, {0x2b, 0x24, 0x1c}, {0x09, 0x09, 0x15}, {0x36, 0x08, 0x13}, {0x20, 0x39, 0x21}, {0x00, 0x3a, 0x1f}, {0x2b, 0x36, 0x31}, {0x02, 0x37, 0x13}, {0x04, 0x34, 0x35}, {0x37, 0x3d, 0x1a}, {0x17, 0x3d, 0x13}, {0x2b, 0x36, 0x2f}, {0x13, 0x1e, 0x13}, {0x3e, 0x11, 0x33}, {0x27, 0x3a, 0x2d}, {0x1e, 0x31, 0x1a}, {0x03, 0x03, 0x2d}, {0x25, 0x37, 0x1f}, {0x11, 0x01, 0x22}, {0x1c, 0x12, 0x17}, {0x30, 0x3a, 0x30}, {0x17, 0x1d, 0x29}, {0x0e, 0x13, 0x27}, {0x1a, 0x2e, 0x24}, {0x2d, 0x00, 0x1c}, {0x17, 0x28, 0x1d}, {0x09, 0x1f, 0x2e}, {0x1a, 0x2d, 0x26}, {0x0a, 0x13, 0x32}, {0x3e, 0x00, 0x27}, {0x0b, 0x3b, 0x30}, {0x08, 0x3a, 0x2d}, {0x22, 0x12, 0x1e}, {0x34, 0x1d, 0x2b}, {0x26, 0x22, 0x35}, {0x17, 0x2c, 0x17}, {0x29, 0x13, 0x2d}, {0x2d, 0x10, 0x10}, {0x20, 0x31, 0x23}, {0x1e, 0x33, 0x18}, {0x33, 0x06, 0x2d}, {0x26, 0x14, 0x27}, {0x22, 0x1d, 0x2a}, {0x2d, 0x06, 0x18}, {0x07, 0x09, 0x2e}, {0x21, 0x15, 0x2e}, {0x21, 0x38, 0x23}, {0x35, 0x0b, 0x34}, {0x24, 0x0b, 0x22}, {0x1e, 0x01, 0x17}, {0x0b, 0x24, 0x11}, {0x17, 0x07, 0x20}, {0x14, 0x25, 0x32}, {0x1a, 0x0e, 0x2f}, {0x35, 0x17, 0x1f}, {0x0c, 0x08, 0x21}, {0x30, 0x35, 0x1f}, {0x0c, 0x0b, 0x20}, {0x04, 0x10, 0x11}, {0x35, 0x11, 0x1e}, {0x33, 0x3d, 0x16}, {0x1e, 0x2b, 0x1d}, {0x1a, 0x19, 0x10}, {0x04, 0x06, 0x22}, {0x03, 0x3d, 0x24}, {0x2a, 0x0e, 0x35}, {0x03, 0x3e, 0x17}, {0x0b, 0x18, 0x36}, {0x3d, 0x0d, 0x26}, {0x35, 0x12, 0x20}, {0x1f, 0x0d, 0x16}, {0x23, 0x32, 0x1a}, {0x00, 0x3d, 0x26}, {0x30, 0x19, 0x36}, {0x12, 0x0e, 0x23}, {0x01, 0x23, 0x28}, {0x3b, 0x31, 0x11}, {0x2d, 0x1c, 0x36}, {0x2a, 0x05, 0x16}, {0x14, 0x0e, 0x30}, {0x3a, 0x37, 0x19}, {0x1f, 0x30, 0x25}, {0x10, 0x26, 0x2f}, {0x22, 0x11, 0x1f}, {0x2e, 0x2b, 0x1e}, {0x16, 0x16, 0x21}, {0x32, 0x18, 0x35}, {0x23, 0x32, 0x1a}, {0x3d, 0x0d, 0x19}, {0x39, 0x09, 0x23}, {0x30, 0x2e, 0x24}, {0x1e, 0x0f, 0x24}, {0x09, 0x21, 0x31}, {0x05, 0x03, 0x11}, {0x05, 0x22, 0x2a}, {0x03, 0x07, 0x37}, {0x04, 0x08, 0x13}, {0x05, 0x10, 0x34}, {0x37, 0x14, 0x29}, {0x0a, 0x24, 0x32}, {0x34, 0x1e, 0x1b}, {0x12, 0x17, 0x2e}, {0x01, 0x02, 0x13}, {0x0a, 0x0c, 0x11}, {0x02, 0x14, 0x13}, {0x0d, 0x25, 0x23}, {0x00, 0x07, 0x1a}, {0x1c, 0x28, 0x35}, {0x08, 0x0e, 0x2c}, {0x1b, 0x3c, 0x15}, {0x1c, 0x19, 0x1d}, {0x32, 0x13, 0x1a}, {0x1c, 0x00, 0x37}, {0x22, 0x1b, 0x35}, {0x39, 0x3e, 0x14}, {0x32, 0x06, 0x31}, {0x17, 0x05, 0x2b}, {0x01, 0x0f, 0x20}, {0x1e, 0x0f, 0x34}, {0x18, 0x03, 0x1f}, {0x2b, 0x00, 0x14}, {0x15, 0x3a, 0x30}, {0x25, 0x30, 0x21}, {0x0b, 0x00, 0x37}, {0x24, 0x37, 0x1d}, {0x29, 0x21, 0x16}, {0x24, 0x0f, 0x2c}, {0x3e, 0x15, 0x36}, {0x3c, 0x2d, 0x23}, {0x3d, 0x3c, 0x17}, {0x1a, 0x1c, 0x13}, {0x0a, 0x29, 0x22}, {0x25, 0x3f, 0x26}, {0x3b, 0x39, 0x2f}, {0x1d, 0x08, 0x16}, {0x0b, 0x19, 0x14}, {0x12, 0x01, 0x2c}, {0x35, 0x11, 0x2a}, {0x02, 0x00, 0x13}, {0x39, 0x2a, 0x35}, {0x07, 0x1a, 0x11}, {0x24, 0x0e, 0x1e}, {0x0e, 0x2c, 0x15}, {0x08, 0x31, 0x1b}, {0x21, 0x1d, 0x26}, {0x1d, 0x1c, 0x2a}, {0x1d, 0x24, 0x13}, {0x01, 0x00, 0x18}, {0x28, 0x2a, 0x37}, {0x15, 0x0f, 0x13}, {0x10, 0x32, 0x36}, {0x22, 0x13, 0x31}, {0x13, 0x05, 0x1e}, {0x17, 0x35, 0x35}, {0x3b, 0x0e, 0x24}, {0x35, 0x3a, 0x1d}, {0x1b, 0x36, 0x1b}, {0x03, 0x1d, 0x24}, {0x0f, 0x16, 0x30}, {0x2d, 0x09, 0x25}, {0x05, 0x21, 0x13}, {0x0a, 0x27, 0x36}, {0x04, 0x0d, 0x1c}, {0x06, 0x3e, 0x21}, {0x2a, 0x27, 0x33}, {0x28, 0x0e, 0x15}, {0x0b, 0x17, 0x1d}, {0x1d, 0x32, 0x2d}, {0x08, 0x3d, 0x29}, {0x21, 0x32, 0x17}, {0x33, 0x31, 0x22}, {0x0e, 0x03, 0x21}, {0x0d, 0x0b, 0x16}, {0x3e, 0x2a, 0x2e}, {0x19, 0x36, 0x2a}, {0x0d, 0x00, 0x14}, {0x22, 0x07, 0x36}, {0x0a, 0x09, 0x15}, {0x14, 0x10, 0x22}, {0x07, 0x16, 0x2c}, {0x36, 0x13, 0x15}, {0x09, 0x2f, 0x1b}, {0x20, 0x3b, 0x2e}, {0x3a, 0x3a, 0x16}, {0x0d, 0x15, 0x2a}, {0x39, 0x13, 0x2b}, {0x0b, 0x01, 0x2a}, {0x13, 0x17, 0x1e}, {0x08, 0x17, 0x1e}, {0x0c, 0x0f, 0x34}, {0x1f, 0x31, 0x12}, {0x07, 0x3a, 0x1d}, {0x35, 0x1e, 0x12}, {0x24, 0x2c, 0x15}, {0x0e, 0x21, 0x19}, {0x34, 0x3b, 0x33}, {0x19, 0x0f, 0x28}, {0x10, 0x2f, 0x2e}, {0x23, 0x27, 0x31}, {0x39, 0x2e, 0x18}, {0x3c, 0x3f, 0x24}, {0x07, 0x23, 0x30}, {0x28, 0x13, 0x35}, {0x13, 0x0a, 0x10}, {0x35, 0x19, 0x33}, {0x23, 0x28, 0x29}, {0x13, 0x2f, 0x1a}, {0x3a, 0x19, 0x14}, {0x37, 0x36, 0x26}, {0x20, 0x3b, 0x15}, {0x37, 0x39, 0x10}, {0x3c, 0x21, 0x34}, {0x1c, 0x38, 0x30}, {0x15, 0x07, 0x26}, {0x27, 0x21, 0x19}, {0x18, 0x11, 0x23}, {0x30, 0x28, 0x37}, {0x32, 0x2d, 0x1f}, {0x2c, 0x3f, 0x30}, {0x1d, 0x2f, 0x26}, {0x01, 0x11, 0x1c}, {0x3b, 0x0f, 0x12}, {0x2a, 0x17, 0x27}, {0x05, 0x00, 0x1b}, {0x25, 0x1c, 0x32}, {0x04, 0x22, 0x2d}, {0x10, 0x0f, 0x25}, {0x0d, 0x39, 0x30}, {0x0b, 0x2e, 0x27}, {0x2d, 0x34, 0x15}, {0x3e, 0x30, 0x36}, {0x16, 0x26, 0x2a}, {0x05, 0x3f, 0x2b}, {0x20, 0x3b, 0x2e}, {0x3b, 0x1c, 0x2f}, {0x01, 0x18, 0x16}, {0x16, 0x3d, 0x10}, {0x0a, 0x1f, 0x18}, {0x17, 0x0f, 0x22}, {0x06, 0x13, 0x11}, {0x38, 0x21, 0x17}, {0x17, 0x0a, 0x37}, {0x1c, 0x19, 0x30}, {0x16, 0x38, 0x31}, {0x30, 0x10, 0x36}, {0x31, 0x2f, 0x26}, {0x3c, 0x1b, 0x23}, {0x33, 0x2f, 0x19}, {0x16, 0x35, 0x25}, {0x3a, 0x18, 0x1f}, {0x37, 0x01, 0x1e}, {0x0d, 0x18, 0x12}, {0x1f, 0x1c, 0x1b}, {0x07, 0x34, 0x2d}, {0x0b, 0x3f, 0x33}, {0x1e, 0x34, 0x1d}, {0x2c, 0x13, 0x2c}, {0x20, 0x20, 0x13}, {0x20, 0x0f, 0x31}, {0x08, 0x0f, 0x24}, {0x18, 0x3d, 0x1c}, {0x36, 0x34, 0x27}, {0x33, 0x2a, 0x25}, {0x2d, 0x30, 0x26}, {0x3d, 0x37, 0x26}, {0x25, 0x11, 0x11}, {0x03, 0x05, 0x18}, {0x10, 0x04, 0x29}, {0x07, 0x2e, 0x36}, {0x2a, 0x29, 0x15}, {0x3a, 0x0e, 0x33}, {0x2a, 0x06, 0x29}, {0x3d, 0x01, 0x29}, {0x27, 0x0e, 0x16}, {0x1d, 0x28, 0x1b}, {0x10, 0x33, 0x2b}, {0x0c, 0x14, 0x1d}, {0x15, 0x3f, 0x25}, {0x37, 0x23, 0x1e}, {0x04, 0x2c, 0x1c}, {0x15, 0x34, 0x2a}, {0x09, 0x2f, 0x15}, {0x02, 0x3f, 0x14}, {0x19, 0x2c, 0x33}, {0x39, 0x32, 0x20}, {0x2a, 0x18, 0x32}, {0x17, 0x23, 0x21}, {0x0b, 0x2d, 0x25}, {0x24, 0x3a, 0x2d}, {0x31, 0x3f, 0x34}, {0x18, 0x19, 0x24}, {0x1e, 0x15, 0x1a}, {0x17, 0x33, 0x2b}, {0x23, 0x09, 0x26}, {0x1b, 0x0d, 0x15}, {0x36, 0x26, 0x28}, {0x3a, 0x1c, 0x14}, {0x0c, 0x3e, 0x10}, {0x18, 0x06, 0x35}, {0x37, 0x26, 0x36}, {0x21, 0x26, 0x17}, {0x3d, 0x1c, 0x2c}, {0x16, 0x25, 0x1d}, {0x1e, 0x0b, 0x1e}, {0x1d, 0x0d, 0x32}, {0x08, 0x1f, 0x1b}, {0x12, 0x1c, 0x12}, {0x20, 0x2a, 0x28}, {0x06, 0x3b, 0x35}, {0x39, 0x0e, 0x1e}, {0x31, 0x30, 0x28}, {0x02, 0x21, 0x14}, {0x06, 0x1e, 0x29}, {0x16, 0x09, 0x1c}, {0x27, 0x32, 0x2d}, {0x39, 0x03, 0x27}, {0x29, 0x09, 0x1e}, {0x1b, 0x11, 0x1c}, {0x28, 0x3a, 0x2c}, {0x03, 0x03, 0x18}, {0x23, 0x09, 0x2f}, {0x30, 0x17, 0x23}, {0x0f, 0x25, 0x33}, {0x06, 0x24, 0x37}, {0x22, 0x09, 0x33}, {0x2c, 0x09, 0x2a}, {0x0c, 0x12, 0x2a}, {0x28, 0x20, 0x10}, {0x15, 0x29, 0x33}, {0x0f, 0x1a, 0x13}, {0x13, 0x18, 0x36}, {0x2e, 0x16, 0x13}, {0x3c, 0x1a, 0x15}, {0x3a, 0x11, 0x32}, {0x02, 0x0a, 0x2c}, {0x19, 0x39, 0x11}, {0x31, 0x3e, 0x1d}, {0x32, 0x14, 0x32}, {0x12, 0x2e, 0x34}, {0x3e, 0x36, 0x23}, {0x37, 0x3e, 0x15}, {0x15, 0x35, 0x34}, {0x01, 0x3a, 0x2c}, {0x26, 0x25, 0x22}, {0x01, 0x2b, 0x37}, {0x1c, 0x3d, 0x33}, {0x3e, 0x10, 0x1c}, {0x26, 0x33, 0x19}, {0x05, 0x19, 0x17}, {0x12, 0x38, 0x1c}, {0x15, 0x3c, 0x32}, {0x3f, 0x0f, 0x37}, {0x02, 0x39, 0x32}, {0x13, 0x00, 0x1d}, {0x1d, 0x2c, 0x10}, {0x39, 0x13, 0x31}, {0x0f, 0x37, 0x19}, {0x09, 0x0d, 0x2a}, {0x20, 0x2f, 0x32}, {0x3b, 0x34, 0x22}, {0x26, 0x14, 0x10}, {0x24, 0x3d, 0x22}, {0x0b, 0x31, 0x23}, {0x2f, 0x2d, 0x2a}, {0x30, 0x04, 0x35}, {0x19, 0x20, 0x2a}, {0x16, 0x36, 0x37}, {0x14, 0x28, 0x37}, {0x11, 0x0b, 0x27}, {0x1d, 0x06, 0x29}, {0x35, 0x16, 0x2e}, {0x24, 0x2e, 0x29}, {0x36, 0x14, 0x2a}, {0x21, 0x0c, 0x1f}, {0x3f, 0x39, 0x19}, {0x27, 0x10, 0x2a}, {0x1e, 0x12, 0x34}, {0x10, 0x24, 0x34}, {0x1d, 0x13, 0x1d}, {0x17, 0x16, 0x37}, {0x27, 0x1b, 0x27}, {0x07, 0x24, 0x21}, {0x37, 0x21, 0x11}, {0x37, 0x28, 0x24}, {0x19, 0x02, 0x1c}, {0x14, 0x12, 0x1d}, {0x1b, 0x24, 0x2e}, {0x2e, 0x3a, 0x15}, {0x37, 0x34, 0x21}, {0x33, 0x2d, 0x29}, {0x2f, 0x1e, 0x34}, {0x29, 0x3c, 0x12}, {0x05, 0x15, 0x20}, {0x05, 0x3e, 0x19}, {0x18, 0x0b, 0x30}, {0x2f, 0x02, 0x27}, {0x14, 0x1c, 0x34}, {0x12, 0x20, 0x30}, {0x2b, 0x22, 0x1b}, {0x06, 0x31, 0x28}, {0x15, 0x2d, 0x12}, {0x01, 0x0e, 0x13}, {0x13, 0x0c, 0x28}, {0x07, 0x2a, 0x14}, {0x1d, 0x36, 0x14}, {0x15, 0x2b, 0x26}, {0x03, 0x25, 0x15}, {0x3e, 0x3b, 0x20}, {0x35, 0x0c, 0x25}, {0x2b, 0x16, 0x35}, {0x1e, 0x31, 0x2c}, {0x06, 0x03, 0x29}, {0x24, 0x07, 0x1f}, {0x32, 0x2f, 0x19}, {0x25, 0x21, 0x31}, {0x22, 0x26, 0x1d}, {0x00, 0x1b, 0x18}, {0x2a, 0x24, 0x31}, {0x20, 0x06, 0x2f}, {0x1e, 0x32, 0x26}, {0x32, 0x39, 0x12}, {0x20, 0x01, 0x19}, {0x0f, 0x15, 0x15}, {0x27, 0x10, 0x2e}, {0x09, 0x25, 0x19}, {0x29, 0x37, 0x30}, {0x13, 0x1c, 0x1d}, {0x29, 0x2d, 0x26}, {0x02, 0x1a, 0x16}, {0x1d, 0x2b, 0x1c}, {0x18, 0x04, 0x34}, {0x28, 0x2a, 0x21}, {0x15, 0x1b, 0x2e}, {0x16, 0x01, 0x10}, {0x05, 0x09, 0x14}, {0x22, 0x03, 0x22}, {0x02, 0x1b, 0x34}, {0x29, 0x2a, 0x23}, {0x26, 0x36, 0x13}, {0x23, 0x3d, 0x1a}, {0x1d, 0x10, 0x24}, {0x25, 0x2b, 0x37}, {0x19, 0x24, 0x26}, {0x28, 0x13, 0x16}, {0x17, 0x14, 0x19}, {0x0b, 0x2f, 0x25}, {0x37, 0x34, 0x37}, {0x39, 0x21, 0x1b}, {0x0f, 0x3d, 0x2d}, {0x0d, 0x10, 0x20}, {0x05, 0x0b, 0x2d}, {0x01, 0x12, 0x24}, {0x18, 0x3d, 0x32}, {0x09, 0x21, 0x26}, {0x1a, 0x0e, 0x1f}, {0x30, 0x06, 0x1f}, {0x0b, 0x3c, 0x29}, {0x07, 0x3e, 0x27}, {0x13, 0x1e, 0x1a}, {0x13, 0x07, 0x23}, {0x10, 0x34, 0x1e}, {0x32, 0x17, 0x23}, {0x35, 0x16, 0x31}, {0x32, 0x2e, 0x1b}, {0x28, 0x0e, 0x22}, {0x14, 0x3a, 0x23}, {0x22, 0x03, 0x29}, {0x2a, 0x10, 0x20}, {0x3e, 0x3c, 0x27}, {0x16, 0x20, 0x12}, {0x3f, 0x24, 0x31}, {0x0d, 0x2e, 0x32}, {0x2f, 0x17, 0x2d}, {0x36, 0x3b, 0x17}, {0x24, 0x23, 0x18}, {0x37, 0x1d, 0x13}, {0x17, 0x3a, 0x1a}, {0x0a, 0x3d, 0x1e}, {0x05, 0x12, 0x16}, {0x33, 0x32, 0x25}, {0x1d, 0x1f, 0x29}, {0x34, 0x2c, 0x26}, {0x20, 0x29, 0x35}, {0x0e, 0x32, 0x17}, {0x01, 0x39, 0x2d}, {0x27, 0x24, 0x23}, {0x28, 0x3f, 0x18}, {0x39, 0x38, 0x25}, {0x23, 0x11, 0x11}, {0x19, 0x2c, 0x29}, {0x30, 0x08, 0x28}, {0x25, 0x27, 0x1d}, {0x17, 0x25, 0x21}, {0x09, 0x3d, 0x16}, {0x1b, 0x0f, 0x2c}, {0x1b, 0x12, 0x22}, {0x28, 0x3e, 0x26}, {0x34, 0x10, 0x1b}, {0x02, 0x34, 0x15}, {0x1a, 0x29, 0x19}, {0x29, 0x11, 0x31}, {0x12, 0x27, 0x17}, {0x27, 0x27, 0x2f}, {0x34, 0x27, 0x24}, {0x03, 0x19, 0x36}, {0x17, 0x1d, 0x33}, {0x19, 0x25, 0x1a}, {0x2b, 0x39, 0x13}, {0x3b, 0x33, 0x1d}, {0x27, 0x31, 0x34}, {0x28, 0x33, 0x37}, {0x09, 0x30, 0x1b}, {0x03, 0x3a, 0x27}, {0x19, 0x11, 0x1f}, {0x0b, 0x1a, 0x34}, {0x3d, 0x2a, 0x15}, {0x04, 0x24, 0x36}, {0x30, 0x23, 0x30}, {0x0f, 0x22, 0x1b}, {0x3d, 0x3d, 0x24}, {0x29, 0x1d, 0x12}, {0x16, 0x19, 0x2e}, {0x03, 0x12, 0x17}, {0x18, 0x25, 0x33}, {0x2f, 0x23, 0x1a}, {0x1a, 0x35, 0x27}, {0x21, 0x26, 0x19}, {0x1b, 0x30, 0x18}, {0x2b, 0x22, 0x2d}, {0x2c, 0x1a, 0x34}, {0x3e, 0x12, 0x19}, {0x28, 0x27, 0x15}, {0x1b, 0x11, 0x12}, {0x17, 0x15, 0x10}, {0x34, 0x37, 0x25}, {0x12, 0x3f, 0x15}, {0x31, 0x0d, 0x37}, {0x3e, 0x2a, 0x2d}, {0x0f, 0x24, 0x24}, {0x3c, 0x3f, 0x1f}, {0x1d, 0x34, 0x17}, {0x1a, 0x23, 0x1f}, {0x37, 0x0f, 0x10}, {0x32, 0x34, 0x35}, {0x19, 0x05, 0x22}, {0x33, 0x16, 0x34}, {0x1e, 0x14, 0x1e}, {0x08, 0x13, 0x29}, {0x3a, 0x37, 0x30}, {0x1d, 0x36, 0x15}, {0x29, 0x2e, 0x1d}, {0x32, 0x2e, 0x23}, {0x35, 0x17, 0x1c}, {0x36, 0x1d, 0x13}, {0x23, 0x34, 0x34}, {0x24, 0x1a, 0x37}, {0x2f, 0x26, 0x2e}, {0x1e, 0x17, 0x1a}, {0x1f, 0x15, 0x1f}, {0x2b, 0x1f, 0x19}, {0x0a, 0x33, 0x1a}, {0x35, 0x31, 0x24}, {0x2d, 0x17, 0x2c}, {0x0c, 0x21, 0x36}, {0x2c, 0x35, 0x35}, {0x1b, 0x03, 0x27}, {0x01, 0x0d, 0x1d}, {0x1c, 0x0e, 0x11}, {0x11, 0x2b, 0x10}, {0x25, 0x3b, 0x20}, {0x1f, 0x17, 0x19}, {0x20, 0x08, 0x36}, {0x13, 0x38, 0x19}, {0x1b, 0x2b, 0x24}, {0x0b, 0x1f, 0x29}, {0x27, 0x15, 0x2c}, {0x37, 0x39, 0x10}, {0x3a, 0x15, 0x2e}, {0x2f, 0x11, 0x36}, {0x24, 0x04, 0x20}, {0x3b, 0x2a, 0x35}, {0x27, 0x35, 0x34}, {0x0d, 0x1b, 0x20}, {0x10, 0x22, 0x37}, {0x1f, 0x38, 0x27}, {0x31, 0x0f, 0x28}, {0x28, 0x25, 0x15}, {0x00, 0x1d, 0x25}, {0x31, 0x28, 0x28}, {0x0b, 0x3a, 0x1d}, {0x2d, 0x13, 0x1b}, {0x03, 0x37, 0x2e}, {0x1d, 0x28, 0x19}, {0x08, 0x2d, 0x22}, {0x27, 0x39, 0x32}, {0x3f, 0x2f, 0x1d}, {0x33, 0x34, 0x28}, {0x18, 0x08, 0x31}, {0x23, 0x1f, 0x13}, {0x0d, 0x2c, 0x23}, {0x3a, 0x2d, 0x1a}, {0x02, 0x25, 0x13}, {0x20, 0x36, 0x34}, {0x12, 0x2b, 0x2d}, {0x35, 0x35, 0x34}, {0x23, 0x20, 0x21}, {0x3a, 0x19, 0x1b}, {0x1f, 0x2b, 0x19}, {0x35, 0x0e, 0x19}, {0x26, 0x24, 0x37}, {0x18, 0x08, 0x10}, {0x0c, 0x16, 0x2d}, {0x1f, 0x34, 0x21}, {0x05, 0x38, 0x19}, {0x14, 0x21, 0x24}, {0x11, 0x31, 0x14}, {0x3e, 0x38, 0x29}, {0x3f, 0x08, 0x25}, {0x2a, 0x1f, 0x25}, {0x25, 0x06, 0x28}, {0x0b, 0x1e, 0x14}, {0x1a, 0x38, 0x22}, {0x24, 0x18, 0x29}, {0x1a, 0x11, 0x20}, {0x3b, 0x3a, 0x1e}, {0x1c, 0x26, 0x1a}, {0x05, 0x32, 0x19}, {0x39, 0x2a, 0x31}, {0x09, 0x07, 0x25}, {0x05, 0x3e, 0x16}, {0x34, 0x26, 0x14}, {0x1b, 0x32, 0x26}, {0x05, 0x08, 0x37}, {0x0f, 0x03, 0x20}, {0x2a, 0x39, 0x31}, {0x08, 0x01, 0x1e}, {0x1d, 0x23, 0x31}, {0x28, 0x1b, 0x28}, {0x1e, 0x37, 0x14}, {0x13, 0x0e, 0x28}, {0x2a, 0x3b, 0x37}, {0x2f, 0x1c, 0x28}, {0x30, 0x30, 0x1a}, {0x36, 0x1f, 0x16}, {0x3e, 0x0d, 0x15}, {0x2e, 0x16, 0x18}, {0x15, 0x37, 0x20}, {0x2a, 0x33, 0x30}, {0x2b, 0x0e, 0x25}, {0x18, 0x20, 0x16}, {0x02, 0x19, 0x25}, {0x0a, 0x2e, 0x30}, {0x16, 0x03, 0x11}, {0x04, 0x27, 0x25}, {0x1b, 0x1c, 0x21}, {0x29, 0x04, 0x27}, {0x3d, 0x20, 0x1e}, {0x28, 0x33, 0x31}, {0x1e, 0x39, 0x10}, {0x31, 0x29, 0x1e}, {0x06, 0x25, 0x28}, {0x19, 0x3b, 0x12}, {0x0b, 0x1b, 0x1c}, {0x3e, 0x37, 0x20}, {0x0a, 0x37, 0x33}, {0x02, 0x2c, 0x25}, {0x15, 0x18, 0x14}, {0x3b, 0x20, 0x1c}, {0x22, 0x3b, 0x1c}, {0x24, 0x34, 0x35}, {0x0f, 0x2f, 0x31}, {0x3b, 0x17, 0x35}, {0x30, 0x39, 0x37}, {0x0d, 0x15, 0x11}, {0x10, 0x03, 0x1e}, {0x1a, 0x39, 0x33}, {0x2f, 0x2e, 0x28}, {0x1c, 0x28, 0x36}, {0x28, 0x18, 0x1f}, {0x15, 0x01, 0x30}, {0x3e, 0x32, 0x28}, {0x34, 0x2f, 0x23}, {0x07, 0x0c, 0x36}, {0x28, 0x2c, 0x34}, {0x2a, 0x0c, 0x1f}, {0x3f, 0x20, 0x13}, {0x2b, 0x17, 0x27}, {0x28, 0x29, 0x2a}, {0x3c, 0x13, 0x36}, {0x26, 0x2d, 0x2a}, {0x0a, 0x06, 0x1e}, {0x20, 0x04, 0x1a}, {0x02, 0x07, 0x35}, {0x0e, 0x18, 0x30}, {0x00, 0x34, 0x34}, {0x2f, 0x14, 0x37}, {0x21, 0x30, 0x1f}, {0x15, 0x37, 0x1b}, {0x3a, 0x0b, 0x32}, {0x22, 0x22, 0x21}, {0x1b, 0x35, 0x23}, {0x0d, 0x03, 0x1c}, {0x23, 0x3b, 0x13}, {0x0e, 0x1d, 0x1f}, {0x1d, 0x3f, 0x2e}, {0x39, 0x27, 0x2e}, {0x0f, 0x38, 0x20}, {0x31, 0x3c, 0x35}, {0x0b, 0x0f, 0x2e}, {0x06, 0x06, 0x28}, {0x25, 0x39, 0x23}, {0x0a, 0x32, 0x15}, {0x0f, 0x1d, 0x25}, {0x0c, 0x0d, 0x34}, {0x12, 0x2e, 0x21}, {0x36, 0x18, 0x1f}, {0x1f, 0x34, 0x1b}, {0x05, 0x3a, 0x36}, {0x2b, 0x01, 0x17}, {0x0e, 0x16, 0x2b}, {0x0e, 0x0b, 0x26}, {0x0d, 0x2d, 0x10}, {0x21, 0x11, 0x27}, {0x3d, 0x13, 0x32}, {0x15, 0x25, 0x2a}, {0x1b, 0x2d, 0x35}, {0x2c, 0x2b, 0x26}, {0x26, 0x1f, 0x20}, {0x22, 0x2b, 0x12}, {0x3f, 0x3d, 0x27}, {0x30, 0x0a, 0x36}, {0x35, 0x1f, 0x17}, {0x21, 0x08, 0x29}, {0x1d, 0x20, 0x33}, {0x34, 0x11, 0x16}, {0x05, 0x38, 0x2d} }; void ApplyImageProcessingEffects(struct ImageProcessingContext *context) { gCanvasPixels = context->canvasPixels; gCanvasMonPersonality = context->personality; gCanvasColumnStart = context->columnStart; gCanvasRowStart = context->rowStart; gCanvasColumnEnd = context->columnEnd; gCanvasRowEnd = context->rowEnd; gCanvasWidth = context->canvasWidth; gCanvasHeight = context->canvasHeight; switch (context->effect) { case IMAGE_EFFECT_POINTILLISM: ApplyImageEffect_Pointillism(); break; case IMAGE_EFFECT_BLUR: ApplyImageEffect_Blur(); break; case IMAGE_EFFECT_OUTLINE_COLORED: ApplyImageEffect_BlackOutline(); ApplyImageEffect_PersonalityColor(gCanvasMonPersonality); break; case IMAGE_EFFECT_INVERT_BLACK_WHITE: ApplyImageEffect_BlackOutline(); ApplyImageEffect_Invert(); ApplyImageEffect_BlackAndWhite(); case IMAGE_EFFECT_INVERT: ApplyImageEffect_Invert(); break; case IMAGE_EFFECT_THICK_BLACK_WHITE: ApplyImageEffect_BlackOutline(); ApplyImageEffect_BlurRight(); ApplyImageEffect_BlurRight(); ApplyImageEffect_BlurDown(); ApplyImageEffect_BlackAndWhite(); break; case IMAGE_EFFECT_SHIMMER: ApplyImageEffect_Shimmer(); break; case IMAGE_EFFECT_OUTLINE: ApplyImageEffect_BlackOutline(); break; case IMAGE_EFFECT_BLUR_RIGHT: ApplyImageEffect_BlurRight(); break; case IMAGE_EFFECT_BLUR_DOWN: ApplyImageEffect_BlurDown(); break; case IMAGE_EFFECT_GRAYSCALE_LIGHT: ApplyImageEffect_Grayscale(); ApplyImageEffect_RedChannelGrayscale(3); break; case IMAGE_EFFECT_CHARCOAL: ApplyImageEffect_BlackOutline(); ApplyImageEffect_BlurRight(); ApplyImageEffect_BlurDown(); ApplyImageEffect_BlackAndWhite(); ApplyImageEffect_Blur(); ApplyImageEffect_Blur(); ApplyImageEffect_RedChannelGrayscale(2); ApplyImageEffect_RedChannelGrayscaleHighlight(4); break; } } static void ApplyImageEffect_RedChannelGrayscale(u8 delta) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (!(0x8000 & *pixel)) { // Gets the grayscale value, based on the pixel's red channel. // Also adds a delta to skew lighter or darker. u8 grayValue = (31 & *pixel); grayValue += delta; if (grayValue > 31) grayValue = 31; *pixel = RGB2(grayValue, grayValue, grayValue); } } } } static void ApplyImageEffect_RedChannelGrayscaleHighlight(u8 highlight) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (!(0x8000 & *pixel)) { u8 grayValue = (31 & *pixel); if (grayValue > 31 - highlight) grayValue = 31 - (highlight >> 1); *pixel = RGB2(grayValue, grayValue, grayValue); } } } } static void ApplyImageEffect_Pointillism(void) { u32 i; for (i = 0; i < NELEMS(sPointillismPoints); i++) AddPointillismPoints(i); } static void ApplyImageEffect_Grayscale(void) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (!(0x8000 & *pixel)) *pixel = ConvertColorToGrayscale(pixel); } } } static void ApplyImageEffect_Blur(void) { u8 i, j; for (i = 0; i < gCanvasColumnEnd; i++) { u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart + i]; u16 prevPixel = *pixel; j = 1; pixel += gCanvasWidth; while (j < gCanvasRowEnd - 1) { if (!(0x8000 & *pixel)) { *pixel = QuantizePixel_Blur(&prevPixel, pixel, pixel + gCanvasWidth); prevPixel = *pixel; } j++; pixel += gCanvasWidth; } } } static void ApplyImageEffect_PersonalityColor(u8 personality) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (!(0x8000 & *pixel)) *pixel = QuantizePixel_PersonalityColor(pixel, personality); } } } static void ApplyImageEffect_BlackAndWhite(void) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (!(0x8000 & *pixel)) *pixel = QuantizePixel_BlackAndWhite(pixel); } } } static void ApplyImageEffect_BlackOutline(void) { u8 i, j; u16 *pixel; // Handle top row of pixels first. for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; pixel = &pixelRow[gCanvasColumnStart]; *pixel = QuantizePixel_BlackOutline(pixel, pixel + 1); for (i = 1, pixel++; i < gCanvasColumnEnd - 1; i++, pixel++) { *pixel = QuantizePixel_BlackOutline(pixel, pixel + 1); *pixel = QuantizePixel_BlackOutline(pixel, pixel - 1); } *pixel = QuantizePixel_BlackOutline(pixel, pixel - 1); } // Handle each column from left to right. for (i = 0; i < gCanvasColumnEnd; i++) { u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth]; pixel = &pixelRow[gCanvasColumnStart + i]; *pixel = QuantizePixel_BlackOutline(pixel, pixel + gCanvasWidth); for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth) { *pixel = QuantizePixel_BlackOutline(pixel, pixel + gCanvasWidth); *pixel = QuantizePixel_BlackOutline(pixel, pixel - gCanvasWidth); } *pixel = QuantizePixel_BlackOutline(pixel, pixel - gCanvasWidth); } } static void ApplyImageEffect_Invert(void) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (!(0x8000 & *pixel)) *pixel = QuantizePixel_Invert(pixel); } } } static void ApplyImageEffect_Shimmer(void) { u8 i, j; u16 *pixel; u16 prevPixel; // First, invert all of the colors. pixel = (*gCanvasPixels)[0]; for (i = 0; i < 64; i++) { for (j = 0; j < 64; j++, pixel++) { if (!(0x8000 & *pixel)) *pixel = QuantizePixel_Invert(pixel); } } // Blur the pixels twice. for (j = 0; j < 64; j++) { pixel = &(*gCanvasPixels)[0][j]; prevPixel = *pixel; *pixel = 0x8000; for (i = 1, pixel += 64; i < 63; i++, pixel += 64) { if (!(0x8000 & *pixel)) { *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + 64); prevPixel = *pixel; } } *pixel = 0x8000; pixel = &(*gCanvasPixels)[0][j]; prevPixel = *pixel; *pixel = 0x8000; for (i = 1, pixel += 64; i < 63; i++, pixel += 64) { if (!(0x8000 & *pixel)) { *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + 64); prevPixel = *pixel; } } *pixel = 0x8000; } // Finally, invert colors back to the original color space. // The above blur causes the outline areas to darken, which makes // this inversion give the effect of light outlines. pixel = (*gCanvasPixels)[0]; for (i = 0; i < 64; i++) { for (j = 0; j < 64; j++, pixel++) { if (!(0x8000 & *pixel)) *pixel = QuantizePixel_Invert(pixel); } } } static void ApplyImageEffect_BlurRight(void) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; u16 prevPixel = *pixel; for (i = 1, pixel++; i < gCanvasColumnEnd - 1; i++, pixel++) { if (!(0x8000 & *pixel)) { *pixel = QuantizePixel_MotionBlur(&prevPixel, pixel); prevPixel = *pixel; } } } } static void ApplyImageEffect_BlurDown(void) { u8 i, j; for (i = 0; i < gCanvasColumnEnd; i++) { u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart + i]; u16 prevPixel = *pixel; for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth) { if (!(0x8000 & *pixel)) { *pixel = QuantizePixel_MotionBlur(&prevPixel, pixel); prevPixel = *pixel; } } } } struct PointillismPoint { u8 column; u8 row; u16 delta; }; static void AddPointillismPoints(u16 arg0) { u32 i; bool8 offsetDownLeft; u8 colorType; struct PointillismPoint points[6]; points[0].column = sPointillismPoints[arg0][0]; points[0].row = sPointillismPoints[arg0][1]; points[0].delta = (sPointillismPoints[arg0][2] >> 3) & 7; colorType = (sPointillismPoints[arg0][2] >> 1) & 3; offsetDownLeft = sPointillismPoints[arg0][2] & 1; for (i = 1; i < points[0].delta; i++) { if (!offsetDownLeft) { points[i].column = points[0].column - i; points[i].row = points[0].row + i; } else { points[i].column = points[0].column + 1; points[i].row = points[0].row - 1; } if (points[i].column > 63 || points[i].row > 63) { points[0].delta = i - 1; break; } points[i].delta = points[0].delta - i; } for (i = 0; i < points[0].delta; i++) { u16 *pixel = &(*gCanvasPixels)[points[i].row * 2][points[i].column]; if (!(0x8000 & *pixel)) { u16 red = (*pixel) & 0x1F; u16 green = (*pixel >> 5) & 0x1F; u16 blue = (*pixel >> 10) & 0x1F; switch (colorType) { case 0: case 1: switch (((sPointillismPoints[arg0][2] >> 3) & 7) % 3) { case 0: if (red >= points[i].delta) red -= points[i].delta; else red = 0; break; case 1: if (green >= points[i].delta) green -= points[i].delta; else green = 0; break; case 2: if (blue >= points[i].delta) blue -= points[i].delta; else blue = 0; break; } break; case 2: case 3: red += points[i].delta; green += points[i].delta; blue += points[i].delta; if (red > 31) red = 31; if (green > 31) green = 31; if (blue > 31) blue = 31; break; } *pixel = RGB2(red, green, blue); } } } static u16 ConvertColorToGrayscale(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; u16 gray = (red + green + blue) / 3; return RGB2(gray, gray, gray); } // The dark colors are the colored edges of the Cool painting effect. // Everything else is white. static u16 QuantizePixel_PersonalityColor(u16 *color, u8 personality) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; if (red < 17 && green < 17 && blue < 17) return GetColorFromPersonality(personality); else return RGB_WHITE; } // Based on the given value, which comes from the first 8 bits of // the mon's personality value, return a color. static u16 GetColorFromPersonality(u8 personality) { u16 red = 0; u16 green = 0; u16 blue = 0; u8 strength = (personality / 6) % 3; u8 colorType = personality % 6; switch (colorType) { case 0: // Teal color green = 21 - strength; blue = green; red = 0; break; case 1: // Yellow color blue = 0; red = 21 - strength; green = red; break; case 2: // Purple color blue = 21 - strength; green = 0; red = blue; break; case 3: // Red color blue = 0; green = 0; red = 23 - strength; break; case 4: // Blue color blue = 23 - strength; green = 0; red = 0; break; case 5: // Green color blue = 0; green = 23 - strength; red = 0; break; } return RGB2(red, green, blue); } static u16 QuantizePixel_BlackAndWhite(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; if (red < 17 && green < 17 && blue < 17) return RGB_BLACK; else return RGB_WHITE; } static u16 QuantizePixel_BlackOutline(u16 *pixelA, u16 *pixelB) { if (*pixelA != RGB_BLACK) { if (*pixelA & 0x8000) return 0x8000; if (*pixelB & 0x8000) return RGB_BLACK; return *pixelA; } return RGB_BLACK; } static u16 QuantizePixel_Invert(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; red = 31 - red; green = 31 - green; blue = 31 - blue; return RGB2(red, green, blue); } static u16 QuantizePixel_MotionBlur(u16 *prevPixel, u16 *curPixel) { u16 pixelChannels[2][3]; u16 diffs[3]; u32 i; u16 largestDiff; u16 red, green, blue; if (*prevPixel == *curPixel) return *curPixel; pixelChannels[0][0] = (*prevPixel >> 0) & 0x1F; pixelChannels[0][1] = (*prevPixel >> 5) & 0x1F; pixelChannels[0][2] = (*prevPixel >> 10) & 0x1F; pixelChannels[1][0] = (*curPixel >> 0) & 0x1F; pixelChannels[1][1] = (*curPixel >> 5) & 0x1F; pixelChannels[1][2] = (*curPixel >> 10) & 0x1F; // Don't blur light colors. if (pixelChannels[0][0] > 25 && pixelChannels[0][1] > 25 && pixelChannels[0][2] > 25) return *curPixel; if (pixelChannels[1][0] > 25 && pixelChannels[1][1] > 25 && pixelChannels[1][2] > 25) return *curPixel; for (i = 0; i < 3; i++) { if (pixelChannels[0][i] > pixelChannels[1][i]) diffs[i] = pixelChannels[0][i] - pixelChannels[1][i]; else diffs[i] = pixelChannels[1][i] - pixelChannels[0][i]; } // Find the largest diff of any of the color channels. if (diffs[0] >= diffs[1]) { if (diffs[0] >= diffs[2]) largestDiff = diffs[0]; else if (diffs[1] >= diffs[2]) largestDiff = diffs[1]; else largestDiff = diffs[2]; } else { if (diffs[1] >= diffs[2]) largestDiff = diffs[1]; else if (diffs[2] >= diffs[0]) largestDiff = diffs[2]; else largestDiff = diffs[0]; } red = (pixelChannels[1][0] * (31 - largestDiff / 2)) / 31; green = (pixelChannels[1][1] * (31 - largestDiff / 2)) / 31; blue = (pixelChannels[1][2] * (31 - largestDiff / 2)) / 31; return RGB2(red, green, blue); } static u16 QuantizePixel_Blur(u16 *prevPixel, u16 *curPixel, u16 *nextPixel) { u16 red, green, blue; u16 prevAvg, curAvg, nextAvg; u16 prevDiff, nextDiff; u32 diff; u16 factor; if (*prevPixel == *curPixel && *nextPixel == *curPixel) return *curPixel; red = (*curPixel >> 0) & 0x1F; green = (*curPixel >> 5) & 0x1F; blue = (*curPixel >> 10) & 0x1F; prevAvg = (((*prevPixel >> 0) & 0x1F) + ((*prevPixel >> 5) & 0x1F) + ((*prevPixel >> 10) & 0x1F)) / 3; curAvg = (((*curPixel >> 0) & 0x1F) + ((*curPixel >> 5) & 0x1F) + ((*curPixel >> 10) & 0x1F)) / 3; nextAvg = (((*nextPixel >> 0) & 0x1F) + ((*nextPixel >> 5) & 0x1F) + ((*nextPixel >> 10) & 0x1F)) / 3; if (prevAvg == curAvg && nextAvg == curAvg) return *curPixel; if (prevAvg > curAvg) prevDiff = prevAvg - curAvg; else prevDiff = curAvg - prevAvg; if (nextAvg > curAvg) nextDiff = nextAvg - curAvg; else nextDiff = curAvg - nextAvg; if (prevDiff >= nextDiff) diff = prevDiff; else diff = nextDiff; factor = 31 - diff / 2; red = (red * factor) / 31; green = (green * factor) / 31; blue = (blue * factor) / 31; return RGB2(red, green, blue); } static u16 QuantizePixel_BlurHard(u16 *prevPixel, u16 *curPixel, u16 *nextPixel) { u16 red, green, blue; u16 prevAvg, curAvg, nextAvg; u16 prevDiff, nextDiff; u32 diff; u16 factor; if (*prevPixel == *curPixel && *nextPixel == *curPixel) return *curPixel; red = (*curPixel >> 0) & 0x1F; green = (*curPixel >> 5) & 0x1F; blue = (*curPixel >> 10) & 0x1F; prevAvg = (((*prevPixel >> 0) & 0x1F) + ((*prevPixel >> 5) & 0x1F) + ((*prevPixel >> 10) & 0x1F)) / 3; curAvg = (((*curPixel >> 0) & 0x1F) + ((*curPixel >> 5) & 0x1F) + ((*curPixel >> 10) & 0x1F)) / 3; nextAvg = (((*nextPixel >> 0) & 0x1F) + ((*nextPixel >> 5) & 0x1F) + ((*nextPixel >> 10) & 0x1F)) / 3; if (prevAvg == curAvg && nextAvg == curAvg) return *curPixel; if (prevAvg > curAvg) prevDiff = prevAvg - curAvg; else prevDiff = curAvg - prevAvg; if (nextAvg > curAvg) nextDiff = nextAvg - curAvg; else nextDiff = curAvg - nextAvg; if (prevDiff >= nextDiff) diff = prevDiff; else diff = nextDiff; factor = 31 - diff; red = (red * factor) / 31; green = (green * factor) / 31; blue = (blue * factor) / 31; return RGB2(red, green, blue); } void ConvertImageProcessingToGBA(struct ImageProcessingContext *context) { u16 i, j, k; u16 *src, *dest, *src_, *dest_; u16 width, height; width = context->canvasWidth >> 3; height = context->canvasHeight >> 3; src_ = context->canvasPixels; dest_ = context->dest; if (context->var_16 == 2) { for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { for (k = 0; k < 8; k++) { dest = dest_ + ((i * width + j) << 5) + (k << 2); src = src_ + ((((i << 3) + k) << 3) * width) + (j << 3); dest[0] = src[0] | (src[1] << 8); dest[1] = src[2] | (src[3] << 8); dest[2] = src[4] | (src[5] << 8); dest[3] = src[6] | (src[7] << 8); } } } } else { for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { for (k = 0; k < 8; k++) { dest = dest_ + ((i * width + j) << 4) + (k << 1); src = src_ + ((((i << 3) + k) << 3) * width) + (j << 3); dest[0] = src[0] | (src[1] << 4) | (src[2] << 8) | (src[3] << 0xC); dest[1] = src[4] | (src[5] << 4) | (src[6] << 8) | (src[7] << 0xC); } } } } } void ApplyImageProcessingQuantization(struct ImageProcessingContext *context) { gCanvasPaletteStart = context->paletteStart * 16; gCanvasPalette = &context->canvasPalette[gCanvasPaletteStart]; gCanvasPixels = context->canvasPixels; gCanvasColumnStart = context->columnStart; gCanvasRowStart = context->rowStart; gCanvasColumnEnd = context->columnEnd; gCanvasRowEnd = context->rowEnd; gCanvasWidth = context->canvasWidth; gCanvasHeight = context->canvasHeight; switch (context->quantizeEffect) { case QUANTIZE_EFFECT_STANDARD: QuantizePalette_Standard(FALSE); break; case QUANTIZE_EFFECT_STANDARD_LIMITED_COLORS: QuantizePalette_Standard(TRUE); break; case QUANTIZE_EFFECT_PRIMARY_COLORS: SetPresetPalette_PrimaryColors(); QuantizePalette_PrimaryColors(); break; case QUANTIZE_EFFECT_GRAYSCALE: SetPresetPalette_Grayscale(); QuantizePalette_Grayscale(); break; case QUANTIZE_EFFECT_GRAYSCALE_SMALL: SetPresetPalette_GrayscaleSmall(); QuantizePalette_GrayscaleSmall(); break; case QUANTIZE_EFFECT_BLACK_WHITE: SetPresetPalette_BlackAndWhite(); QuantizePalette_BlackAndWhite(); break; } } static void SetPresetPalette_PrimaryColors(void) { gCanvasPalette[0] = RGB2(0, 0, 0); gCanvasPalette[1] = RGB2(6, 6, 6); gCanvasPalette[2] = RGB2(29, 29, 29); gCanvasPalette[3] = RGB2(11, 11, 11); gCanvasPalette[4] = RGB2(29, 6, 6); gCanvasPalette[5] = RGB2(6, 29, 6); gCanvasPalette[6] = RGB2(6, 6, 29); gCanvasPalette[7] = RGB2(29, 29, 6); gCanvasPalette[8] = RGB2(29, 6, 29); gCanvasPalette[9] = RGB2(6, 29, 29); gCanvasPalette[10] = RGB2(29, 11, 6); gCanvasPalette[11] = RGB2(11, 29, 6); gCanvasPalette[12] = RGB2(6, 11, 29); gCanvasPalette[13] = RGB2(29, 6, 11); gCanvasPalette[14] = RGB2(6, 29, 11); gCanvasPalette[15] = RGB2(11, 6, 29); } static void SetPresetPalette_BlackAndWhite(void) { gCanvasPalette[0] = RGB2(0, 0, 0); gCanvasPalette[1] = RGB2(0, 0, 0); gCanvasPalette[2] = RGB2(31, 31, 31); } static void SetPresetPalette_GrayscaleSmall(void) { u32 i; gCanvasPalette[0] = RGB2(0, 0, 0); gCanvasPalette[1] = RGB2(0, 0, 0); for (i = 0; i < 14; i++) gCanvasPalette[i + 2] = RGB2(2 * (i + 2), 2 * (i + 2), 2 * (i + 2)); } static void SetPresetPalette_Grayscale(void) { u32 i; gCanvasPalette[0] = RGB2(0, 0, 0); for (i = 0; i < 32; i++) gCanvasPalette[i + 1] = RGB2(i, i, i); } static void QuantizePalette_Standard(bool8 useLimitedPalette) { u8 i, j; u16 maxIndex; maxIndex = 0xDF; if (!useLimitedPalette) maxIndex = 0xFF; for (i = 0; i < maxIndex; i++) gCanvasPalette[i] = RGB_BLACK; gCanvasPalette[maxIndex] = RGB2(15, 15, 15); for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (*pixel & 0x8000) { *pixel = gCanvasPaletteStart; } else { u16 quantizedColor = QuantizePixel_Standard(pixel); u8 curIndex = 1; if (curIndex < maxIndex) { if (gCanvasPalette[curIndex] == RGB_BLACK) { // The quantized color does not match any existing color in the // palette, so we add it to the palette. // This if block seems pointless because the below while loop handles // this same logic. gCanvasPalette[curIndex] = quantizedColor; *pixel = gCanvasPaletteStart + curIndex; } else { while (curIndex < maxIndex) { if (gCanvasPalette[curIndex] == RGB_BLACK) { // The quantized color does not match any existing color in the // palette, so we add it to the palette. gCanvasPalette[curIndex] = quantizedColor; *pixel = gCanvasPaletteStart + curIndex; break; } if (gCanvasPalette[curIndex] == quantizedColor) { // The quantized color matches this existing color in the // palette, so we use this existing color for the pixel. *pixel = gCanvasPaletteStart + curIndex; break; } curIndex++; } } } if (curIndex == maxIndex) { // The entire palette's colors are already in use, which means // the base image has too many colors to handle. This error is handled // by marking such pixels as gray color. curIndex = maxIndex; *pixel = curIndex; } } } } } static void QuantizePalette_BlackAndWhite(void) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (*pixel & 0x8000) { *pixel = gCanvasPaletteStart; } else { if (QuantizePixel_BlackAndWhite(pixel) == RGB_BLACK) { // Black is the first color in the quantized palette. *pixel = gCanvasPaletteStart + 1; } else { // White is the second color in the quantized palette. *pixel = gCanvasPaletteStart + 2; } } } } } static void QuantizePalette_GrayscaleSmall(void) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (*pixel & 0x8000) *pixel = gCanvasPaletteStart; else *pixel = QuantizePixel_GrayscaleSmall(pixel) + gCanvasPaletteStart; } } } static void QuantizePalette_Grayscale(void) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (*pixel & 0x8000) *pixel = gCanvasPaletteStart; else *pixel = QuantizePixel_Grayscale(pixel) + gCanvasPaletteStart; } } } static void QuantizePalette_PrimaryColors(void) { u8 i, j; for (j = 0; j < gCanvasRowEnd; j++) { u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { if (*pixel & 0x8000) *pixel = gCanvasPaletteStart; else *pixel = QuantizePixel_PrimaryColors(pixel) + gCanvasPaletteStart; } } } // Quantizes the pixel's color channels to nearest multiple of 4, and clamps to [6, 30]. static u16 QuantizePixel_Standard(u16 *pixel) { u16 red = *pixel & 0x1F; u16 green = (*pixel >> 5) & 0x1F; u16 blue = (*pixel >> 10) & 0x1F; // Quantize color channels to muliples of 4, rounding up. if (red & 3) red = (red & 0x1C) + 4; if (green & 3) green = (green & 0x1C) + 4; if (blue & 3) blue = (blue & 0x1C) + 4; // Clamp channels to [6, 30]. if (red < 6) red = 6; if (red > 30) red = 30; if (green < 6) green = 6; if (green > 30) green = 30; if (blue < 6) blue = 6; if (blue > 30) blue = 30; return RGB2(red, green, blue); } static u16 QuantizePixel_PrimaryColors(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; if (red < 12 && green < 11 && blue < 11) return 1; if (red > 19 && green > 19 && blue > 19) return 2; if (red > 19) { if (green > 19) { if (blue > 14) return 2; else return 7; } else if (blue > 19) { if (green > 14) return 2; else return 8; } } if (green > 19 && blue > 19) { if (red > 14) return 2; else return 9; } if (red > 19) { if (green > 11) { if (blue > 11) { if (green < blue) return 8; else return 7; } else { return 10; } } else if (blue > 11) { return 13; } else { return 4; } } if (green > 19) { if (red > 11) { if (blue > 11) { if (red < blue) return 9; else return 7; } else { return 11; } } else { if (blue > 11) return 14; else return 5; } } if (blue > 19) { if (red > 11) { if (green > 11) { if (red < green) return 9; else return 8; } } else if (green > 11) { return 12; } if (blue > 11) return 15; else return 6; } return 3; } static u16 QuantizePixel_GrayscaleSmall(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; u16 average = ((red + green + blue) / 3) & 0x1E; if (average == 0) return 1; else return average / 2; } static u16 QuantizePixel_Grayscale(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; u16 average = (red + green + blue) / 3; return average + 1; } ================================================ FILE: src/intro.c ================================================ #include "global.h" #include "gflib.h" #include "m4a.h" #include "task.h" #include "scanline_effect.h" #include "libgcnmultiboot.h" #include "new_menu_helpers.h" #include "link.h" #include "menu.h" #include "random.h" #include "save.h" #include "new_game.h" #include "title_screen.h" #include "decompress.h" #include "util.h" #include "trig.h" #include "constants/songs.h" #include "constants/sound.h" /* The intro is grouped into the following scenes - Copyright screen - GF Logo Scene 1. Brief close up shot of grass Scene 2. A panning wide shot followed by a close-up of Gengar/Nidorino Scene 3. A fight between Gengar/Nidorino After this it progresses to the title screen */ enum { GFXTAG_STAR, GFXTAG_SPARKLES_SMALL, GFXTAG_SPARKLES_BIG, GFXTAG_GF_LOGO, GFXTAG_PRESENTS, GFXTAG_SCENE3_NIDORINO, GFXTAG_SCENE2_GENGAR, GFXTAG_SCENE2_NIDORINO, GFXTAG_SCENE3_GRASS, GFXTAG_SCENE3_GENGAR, GFXTAG_SCENE3_SWIPE, GFXTAG_SCENE3_RECOIL_DUST, }; enum { PALTAG_STAR, PALTAG_SPARKLES, PALTAG_UNUSED_2, PALTAG_GF, PALTAG_UNUSED_4, PALTAG_UNUSED_5, PALTAG_GENGAR, PALTAG_NIDORINO, PALTAG_SCENE3_GRASS, PALTAG_UNUSED_9, PALTAG_SCENE3_SWIPE, PALTAG_SCENE3_RECOIL_DUST, }; // Background IDs for Game Freak logo scene enum { BG_GF_TEXT_LOGO = 2, BG_GF_BACKGROUND }; // Background IDs for Scene 1 enum { BG_SCENE1_GRASS, BG_SCENE1_BACKGROUND, BG_SCENE1_UNUSED1, BG_SCENE1_UNUSED2 }; #define PALSLOT_SCENE1_GRASS 1 #define PALSLOT_SCENE1_BG 2 // Background IDs for Scene 2 enum { BG_SCENE2_PLANTS, BG_SCENE2_NIDORINO, BG_SCENE2_GENGAR, BG_SCENE2_BACKGROUND // Bg for wide shot on upper half, close up on lower half }; // Background IDs for Scene 3 enum { BG_SCENE3_GENGAR, BG_SCENE3_BACKGROUND, BG_SCENE3_UNUSED1, BG_SCENE3_UNUSED2 }; enum { ANIM_NIDORINO_NORMAL, ANIM_NIDORINO_CRY, ANIM_NIDORINO_CROUCH, ANIM_NIDORINO_HOP, ANIM_NIDORINO_ATTACK, }; enum { ANIM_SPARKLE_LOOP, ANIM_SPARKLE_ONCE, }; enum { ANIM_SWIPE_TOP, ANIM_SWIPE_BOTTOM, }; enum { AFFINEANIM_NORMAL, AFFINEANIM_ZOOM, }; // Window ids for sWindowTemplates (only one) enum { WIN_GF_TEXT_LOGO, WIN_COUNT }; #define NUM_GENGAR_BACK_SPRITES 4 #define COLOSSEUM_GAME_CODE 0x65366347 // "Gc6e" in ASCII struct IntroSequenceData; typedef void (*IntroCallback)(struct IntroSequenceData *); struct IntroSequenceData { IntroCallback callback; u8 state; u8 taskId; bool8 gengarAttackLanded; u16 data[5]; // [0] and [1] are set but never read, the rest are unused u16 timer; struct Sprite *gameFreakLogoArtSprite; struct Sprite *scene3NidorinoSprite; struct Sprite *scene2GengarSprite; struct Sprite *scene2NidorinoSprite; struct Sprite *scene3GrassSprite; struct Sprite *scene3GengarSprites[NUM_GENGAR_BACK_SPRITES]; u8 unused0[4]; u8 gameFreakLogoGfx[0x400]; u8 gameFreakTextGfx[0x400]; u8 unused1[0x2080]; }; // size: 0x28BC static EWRAM_DATA struct GcmbStruct sGcmb = {0}; static EWRAM_DATA u16 sUnusedScene3Var0 = 0; // Set but never read static EWRAM_DATA u16 sUnusedScene3Var1 = 0; // Set but never read static EWRAM_DATA u16 sNidorinoJumpMult = 0; static EWRAM_DATA u16 sNidorinoAnimDelayTime = 0; static EWRAM_DATA u16 sNidorinoJumpDiv = 0; static EWRAM_DATA u16 sNidorinoRecoilReturnTime = 0; static EWRAM_DATA u16 sNidorinoUnusedVar = 0; // Set but never read static EWRAM_DATA u16 sStarSpeedX = 0; static EWRAM_DATA u16 sStarSpeedY = 0; static EWRAM_DATA u16 sStarSparklesXmodMask = 0; static EWRAM_DATA u16 sStarSparklesUnusedVar = 0; // Set but never read static EWRAM_DATA u16 sStarSparklesSpawnRate = 0; static EWRAM_DATA u16 sStarSparklesFlickerStartTime = 0; static EWRAM_DATA u16 sStarSparklesDestroySpriteTime = 0; static EWRAM_DATA u16 sStarSparklesGravityShift = 0; static EWRAM_DATA u16 sStarSparklesXspeed = 0; static EWRAM_DATA u16 sStarSparklesYspeed = 0; static EWRAM_DATA u16 sStarSparklesXprecision = 0; static EWRAM_DATA u16 sStarSparklesYprecision = 0; // General static void CB2_SetUpIntro(void); static void CB2_Intro(void); static void VBlankCB_Intro(void); static void Intro_ResetGpuRegs(void); static void StartIntroSequence(void); static void Task_CallIntroCallback(u8 taskId); static void SetIntroCB(struct IntroSequenceData * ptr, IntroCallback cb); static void IntroCB_Init(struct IntroSequenceData * ptr); static void LoadFightSceneSpriteGraphics(void); static void IntroCB_ExitToTitleScreen(struct IntroSequenceData * ptr); // GF scene static void IntroCB_GF_OpenWindow(struct IntroSequenceData * ptr); static void IntroCB_GF_Star(struct IntroSequenceData * ptr); static void IntroCB_GF_RevealName(struct IntroSequenceData * ptr); static void IntroCB_GF_RevealLogo(struct IntroSequenceData * ptr); static void GFScene_LoadGfxCreateStar(void); static void GFScene_StartNameSparklesSmall(void); static void GFScene_StartNameSparklesBig(void); static void GFScene_Task_NameSparklesSmall(u8 taskId); static void GFScene_Task_NameSparklesBig(u8 taskId); static struct Sprite *GFScene_CreateLogoSprite(void); static void GFScene_CreatePresentsSprite(void); static void SpriteCB_Star(struct Sprite *sprite); static void SpriteCB_SparklesSmall_Star(struct Sprite *sprite); static void SpriteCB_SparklesSmall_Name(struct Sprite *sprite); static void SpriteCB_SparklesBig(struct Sprite *sprite); // Scene 1 static void IntroCB_Scene1(struct IntroSequenceData * ptr); static void Scene1_Task_AnimateGrass(u8 taskId); static void Scene1_StartGrassScrolling(void); static void Scene1_Task_BgZoom(u8 taskId); // Scene 2 static void IntroCB_Scene2(struct IntroSequenceData * ptr); static void Scene2_Task_PanForest(u8 taskId); static void Scene2_Task_PanMons(u8 taskId); static void Scene2_CreateMonSprites(struct IntroSequenceData * ptr); static void Scene2_DestroyMonSprites(struct IntroSequenceData * ptr); // Scene 3 static void IntroCB_Scene3_Entrance(struct IntroSequenceData * ptr); static void IntroCB_Scene3_Fight(struct IntroSequenceData * ptr); static void Scene3_StartBgScroll(void); static void Scene3_Task_GengarBounce(u8 taskId); static void Scene3_CreateGrassSprite(struct IntroSequenceData * ptr); static void Scene3_CreateGengarSprite(struct IntroSequenceData * ptr); static void Scene3_StartNidorinoCry(struct IntroSequenceData * ptr); static void Scene3_StartNidorinoHop(struct Sprite *sprite, u16 time, s16 targetX, u8 heightShift); static void Scene3_StartGengarAttack(struct IntroSequenceData * ptr); static void Scene3_Task_GengarAttack(u8 taskId); static void Scene3_NidorinoZoom(struct IntroSequenceData * ptr); static void Scene3_GengarZoom(struct IntroSequenceData * ptr); static void Scene3_CreateGengarSwipeSprites(void); static void Scene3_Task_GengarEnter(u8 taskId); static void Scene3_CreateNidorinoSprite(struct IntroSequenceData * ptr); static void Scene3_StartNidorinoEntrance(struct Sprite *sprite, s16 xStart, s16 xEnd, u16 speed); static void Scene3_SpriteCB_NidorinoEnter(struct Sprite *sprite); static bool32 Scene3_IsNidorinoEntering(struct IntroSequenceData * ptr); static void Scene3_StartNidorinoRecoil(struct IntroSequenceData * ptr); static bool8 Scene3_NidorinoAnimIsRunning(struct IntroSequenceData * ptr); static void CreateNidorinoRecoilDustSprites(s16 x, s16 y, s16 seed); static void Scene3_StartNidorinoAttack(struct IntroSequenceData * ptr); static void SpriteCB_Grass(struct Sprite *sprite); static void SpriteCB_GengarSwipe(struct Sprite *sprite); static void SpriteCB_RecoilDust(struct Sprite *sprite); static void SpriteCB_NidorinoCry(struct Sprite *sprite); static void SpriteCB_NidorinoRecoil(struct Sprite *sprite); static void SpriteCB_NidorinoHop(struct Sprite *sprite); static void SpriteCB_NidorinoAttack(struct Sprite *sprite); extern const u32 gMultiBootProgram_PokemonColosseum_Start[]; extern const u32 gMultiBootProgram_PokemonColosseum_End[]; static const u16 sCopyright_Pal[] = INCBIN_U16("graphics/intro/copyright.gbapal"); static const u8 sCopyright_Gfx[] = INCBIN_U8( "graphics/intro/copyright.4bpp.lz"); static const u8 sCopyright_Map[] = INCBIN_U8( "graphics/intro/copyright.bin.lz"); // Game Freak static const u16 sGameFreakBg_Pal[] = INCBIN_U16("graphics/intro/game_freak/bg.gbapal"); static const u8 sGameFreakBg_Gfx[] = INCBIN_U8( "graphics/intro/game_freak/bg.4bpp.lz"); static const u8 sGameFreakBg_Map[] = INCBIN_U8( "graphics/intro/game_freak/bg.bin.lz"); static const u16 sGameFreakLogo_Pal[] = INCBIN_U16("graphics/intro/game_freak/logo.gbapal"); static const u8 sGameFreakText_Gfx[] = INCBIN_U8( "graphics/intro/game_freak/game_freak.4bpp.lz"); static const u32 sGameFreakLogo_Gfx[] = INCBIN_U32("graphics/intro/game_freak/logo.4bpp.lz"); static const u16 sStar_Pal[] = INCBIN_U16("graphics/intro/game_freak/star.gbapal"); static const u32 sStar_Gfx[] = INCBIN_U32("graphics/intro/game_freak/star.4bpp.lz"); static const u16 sSparkles_Pal[] = INCBIN_U16("graphics/intro/game_freak/sparkles.gbapal"); static const u32 sSparklesSmall_Gfx[] = INCBIN_U32("graphics/intro/game_freak/sparkles_small.4bpp.lz"); static const u32 sSparklesBig_Gfx[] = INCBIN_U32("graphics/intro/game_freak/sparkles_big.4bpp.lz"); static const u32 sPresents_Gfx[] = INCBIN_U32("graphics/intro/game_freak/presents.4bpp.lz"); // Scene 1 (Grass close up) static const u16 sScene1_Grass_Pal[] = INCBIN_U16("graphics/intro/scene_1/grass.gbapal"); static const u8 sScene1_Grass_Gfx[] = INCBIN_U8( "graphics/intro/scene_1/grass.4bpp.lz"); static const u8 sScene1_Grass_Map[] = INCBIN_U8( "graphics/intro/scene_1/grass.bin.lz"); static const u16 sScene1_Bg_Pal[] = INCBIN_U16("graphics/intro/scene_1/bg.gbapal"); static const u8 sScene1_Bg_Gfx[] = INCBIN_U8( "graphics/intro/scene_1/bg.4bpp.lz"); static const u8 sScene1_Bg_Map[] = INCBIN_U8( "graphics/intro/scene_1/bg.bin.lz"); // Scenes 2 and 3 (Gengar and Nidorino) static const u16 sScene2_Bg_Pal[] = INCBIN_U16("graphics/intro/scene_2/bg.gbapal"); static const u8 sScene2_Bg_Gfx[] = INCBIN_U8( "graphics/intro/scene_2/bg.4bpp.lz"); static const u8 sScene2_Bg_Map[] = INCBIN_U8( "graphics/intro/scene_2/bg.bin.lz"); static const u16 sScene2_Plants_Pal[] = INCBIN_U16("graphics/intro/scene_2/plants.gbapal"); // Unused static const u8 sScene2_Plants_Gfx[] = INCBIN_U8( "graphics/intro/scene_2/plants.4bpp.lz"); static const u8 sScene2_Plants_Map[] = INCBIN_U8( "graphics/intro/scene_2/plants.bin.lz"); static const u16 sGengar_Pal[] = INCBIN_U16("graphics/intro/gengar.gbapal"); // Used by multiple scenes static const u8 sScene2_GengarClose_Gfx[] = INCBIN_U8( "graphics/intro/scene_2/gengar_close.4bpp.lz"); static const u8 sScene2_GengarClose_Map[] = INCBIN_U8( "graphics/intro/scene_2/gengar_close.bin.lz"); static const u16 sScene2_NidorinoClose_Pal[] = INCBIN_U16("graphics/intro/scene_2/nidorino_close.gbapal"); static const u8 sScene2_NidorinoClose_Gfx[] = INCBIN_U8( "graphics/intro/scene_2/nidorino_close.4bpp.lz"); static const u8 sScene2_NidorinoClose_Map[] = INCBIN_U8( "graphics/intro/scene_2/nidorino_close.bin.lz"); static const u16 sScene3_Bg_Pal[] = INCBIN_U16("graphics/intro/scene_3/bg.gbapal"); static const u8 sScene3_Bg_Gfx[] = INCBIN_U8( "graphics/intro/scene_3/bg.4bpp.lz"); static const u8 sScene3_Bg_Map[] = INCBIN_U8( "graphics/intro/scene_3/bg.bin.lz"); static const u8 sScene3_GengarAnim_Gfx[] = INCBIN_U8( "graphics/intro/scene_3/gengar_anim.4bpp.lz"); static const u8 sScene3_GengarAnim_Map[] = INCBIN_U8( "graphics/intro/scene_3/gengar_anim.bin.lz"); static const u32 sScene2_Gengar_Gfx[] = INCBIN_U32("graphics/intro/scene_2/gengar.4bpp.lz"); static const u16 sNidorino_Pal[] = INCBIN_U16("graphics/intro/nidorino.gbapal"); // Used by multiple scenes static const u32 sScene2_Nidorino_Gfx[] = INCBIN_U32("graphics/intro/scene_2/nidorino.4bpp.lz"); static const u16 sScene3_Grass_Pal[] = INCBIN_U16("graphics/intro/scene_3/grass.gbapal"); static const u32 sScene3_Grass_Gfx[] = INCBIN_U32("graphics/intro/scene_3/grass.4bpp.lz"); static const u32 sScene3_GengarStatic_Gfx[] = INCBIN_U32("graphics/intro/scene_3/gengar_static.4bpp.lz"); static const u32 sScene3_Nidorino_Gfx[] = INCBIN_U32("graphics/intro/scene_3/nidorino.4bpp.lz"); static const u16 sScene3_Swipe_Pal[] = INCBIN_U16("graphics/intro/scene_3/swipe.gbapal"); static const u16 sScene3_RecoilDust_Pal[] = INCBIN_U16("graphics/intro/scene_3/recoil_dust.gbapal"); static const u32 sScene3_Swipe_Gfx[] = INCBIN_U32("graphics/intro/scene_3/swipe.4bpp.lz"); static const u32 sScene3_RecoilDust_Gfx[] = INCBIN_U32("graphics/intro/scene_3/recoil_dust.4bpp.lz"); static const struct BgTemplate sBgTemplates_GameFreakScene[] = { { .bg = BG_GF_BACKGROUND, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 }, { .bg = BG_GF_TEXT_LOGO, .charBaseIndex = 3, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x010 } }; static const struct BgTemplate sBgTemplates_Scene1[] = { { .bg = BG_SCENE1_GRASS, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 2, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = BG_SCENE1_BACKGROUND, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 2, .paletteMode = 0, .priority = 0, .baseTile = 0x000 } }; static const struct BgTemplate sBgTemplates_Scene2[] = { { .bg = BG_SCENE2_BACKGROUND, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 2, .paletteMode = 0, .priority = 3, .baseTile = 0x000 }, { .bg = BG_SCENE2_PLANTS, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = BG_SCENE2_GENGAR, .charBaseIndex = 3, .mapBaseIndex = 27, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = BG_SCENE2_NIDORINO, .charBaseIndex = 2, .mapBaseIndex = 28, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 } }; static const struct BgTemplate sBgTemplates_Scene3[] = { { .bg = BG_SCENE3_BACKGROUND, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = BG_SCENE3_GENGAR, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 2, .paletteMode = 0, .priority = 0, .baseTile = 0x000 } }; static const struct WindowTemplate sWindowTemplates[WIN_COUNT + 1] = { [WIN_GF_TEXT_LOGO] = { .bg = BG_GF_TEXT_LOGO, .tilemapLeft = 6, .tilemapTop = 4, .width = 18, .height = 9, .paletteNum = 13, .baseBlock = 0x000 }, [WIN_COUNT] = DUMMY_WIN_TEMPLATE }; static const u8 sGengarZoomMatrixAnchors[NUM_GENGAR_BACK_SPRITES][2] = { {63, 63}, { 0, 63}, {63, 0}, { 0, 0} }; static const struct CompressedSpriteSheet sSpriteSheets_GameFreakScene[] = { {sStar_Gfx, 0x80, GFXTAG_STAR}, {sSparklesSmall_Gfx, 0x80, GFXTAG_SPARKLES_SMALL}, {sSparklesBig_Gfx, 0x800, GFXTAG_SPARKLES_BIG}, {sGameFreakLogo_Gfx, 0x400, GFXTAG_GF_LOGO}, {sPresents_Gfx, 0x100, GFXTAG_PRESENTS} }; static const struct SpritePalette sSpritePalettes_GameFreakScene[] = { {sStar_Pal, PALTAG_STAR}, {sSparkles_Pal, PALTAG_SPARKLES}, {sGameFreakLogo_Pal, PALTAG_GF}, {0} }; static const struct Coords16 sTextSparkleCoords[] = { { 72, 80}, {136, 74}, {168, 80}, {120, 80}, {104, 86}, { 88, 74}, {184, 74}, { 56, 86}, {152, 86} }; static const struct OamData sOam_Star = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0x000, .priority = 2, .paletteNum = 0 }; static const struct OamData sOam_SparklesSmall = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0x000, .priority = 2, .paletteNum = 0 }; static const union AnimCmd sAnim_SparklesSmall_Loop[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_SparklesSmall_Once[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_FRAME(3, 4), ANIMCMD_END }; static const union AnimCmd *const sAnims_SparklesSmall[] = { [ANIM_SPARKLE_LOOP] = sAnim_SparklesSmall_Loop, [ANIM_SPARKLE_ONCE] = sAnim_SparklesSmall_Once }; static const struct SpriteTemplate sSpriteTemplate_Star = { .tileTag = GFXTAG_STAR, .paletteTag = PALTAG_STAR, .oam = &sOam_Star, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Star }; static const struct SpriteTemplate sSpriteTemplate_SparklesSmall = { .tileTag = GFXTAG_SPARKLES_SMALL, .paletteTag = PALTAG_SPARKLES, .oam = &sOam_SparklesSmall, .anims = sAnims_SparklesSmall, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SparklesSmall_Star }; static const struct OamData sOam_SparklesBig = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .matrixNum = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0x000, .priority = 2, .paletteNum = 0 }; static const union AnimCmd sAnim_SparklesBig[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(16, 8), ANIMCMD_FRAME(32, 8), ANIMCMD_FRAME(48, 8), ANIMCMD_END }; static const union AnimCmd *const sAnims_SparklesBig[] = { sAnim_SparklesBig }; static const struct SpriteTemplate sSpriteTemplate_SparklesBig = { .tileTag = GFXTAG_SPARKLES_BIG, .paletteTag = PALTAG_SPARKLES, .oam = &sOam_SparklesBig, .anims = sAnims_SparklesBig, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SparklesBig }; static const struct OamData sOam_GameFreakLogo = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x64), .matrixNum = 0, .size = SPRITE_SIZE(32x64), .tileNum = 0x000, .priority = 3, .paletteNum = 0 }; static const struct SpriteTemplate sSpriteTemplate_GameFreakLogoArt = { .tileTag = GFXTAG_GF_LOGO, .paletteTag = PALTAG_GF, .oam = &sOam_GameFreakLogo, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOam_PresentsText = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .matrixNum = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0x000, .priority = 3, .paletteNum = 0 }; static const struct SpriteTemplate sSpriteTemplate_Presents = { .tileTag = GFXTAG_PRESENTS, .paletteTag = PALTAG_GF, .oam = &sOam_PresentsText, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOam_Scene3_Nidorino = { .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AnimCmd sAnim_Scene3_Nidorino_Normal[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; static const union AnimCmd sAnim_Scene3_Nidorino_Cry[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END }; static const union AnimCmd sAnim_Scene3_Nidorino_Crouch[] = { ANIMCMD_FRAME(128, 1), ANIMCMD_END }; static const union AnimCmd sAnim_Scene3_Nidorino_Hop[] = { ANIMCMD_FRAME(192, 1), ANIMCMD_END }; static const union AnimCmd sAnim_Scene3_Nidorino_Attack[] = { ANIMCMD_FRAME(256, 1), ANIMCMD_END }; static const union AnimCmd *const sAnims_Scene3_Nidorino[] = { [ANIM_NIDORINO_NORMAL] = sAnim_Scene3_Nidorino_Normal, [ANIM_NIDORINO_CRY] = sAnim_Scene3_Nidorino_Cry, [ANIM_NIDORINO_CROUCH] = sAnim_Scene3_Nidorino_Crouch, [ANIM_NIDORINO_HOP] = sAnim_Scene3_Nidorino_Hop, [ANIM_NIDORINO_ATTACK] = sAnim_Scene3_Nidorino_Attack }; static const union AffineAnimCmd sAffineAnim_Scene3_Mons_Normal[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Scene3_Mons_Zoom[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(32, 32, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnims_Scene3_Mons[] = { [AFFINEANIM_NORMAL] = sAffineAnim_Scene3_Mons_Normal, [AFFINEANIM_ZOOM] = sAffineAnim_Scene3_Mons_Zoom }; static const struct SpriteTemplate sSpriteTemplate_Scene3_Nidorino = { .tileTag = GFXTAG_SCENE3_NIDORINO, .paletteTag = PALTAG_NIDORINO, .oam = &sOam_Scene3_Nidorino, .anims = sAnims_Scene3_Nidorino, .images = NULL, .affineAnims = sAffineAnims_Scene3_Mons, .callback = SpriteCallbackDummy }; static const struct OamData sOam_Scene2_Mons = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const struct SpriteTemplate sSpriteTemplate_Scene2_Nidorino = { .tileTag = GFXTAG_SCENE2_NIDORINO, .paletteTag = PALTAG_NIDORINO, .oam = &sOam_Scene2_Mons, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_Scene2_Gengar = { .tileTag = GFXTAG_SCENE2_GENGAR, .paletteTag = PALTAG_GENGAR, .oam = &sOam_Scene2_Mons, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOam_Grass = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x32), .matrixNum = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0x000, .priority = 0, .paletteNum = 0 }; static const union AnimCmd sAnim_Grass_Static[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Grass_Rustle[] = { ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END }; static const union AnimCmd *const sAnims_Grass[] = { sAnim_Grass_Static, sAnim_Grass_Rustle // Unused }; static const struct SpriteTemplate sSpriteTemplate_Grass = { .tileTag = GFXTAG_SCENE3_GRASS, .paletteTag = PALTAG_SCENE3_GRASS, .oam = &sOam_Grass, .anims = sAnims_Grass, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOam_Scene3_Gengar = { .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AnimCmd sAnim_Scene3_Gengar_TopLeft[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Scene3_Gengar_TopRight[] = { ANIMCMD_FRAME(64, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Scene3_Gengar_BottomLeft[] = { ANIMCMD_FRAME(96, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Scene3_Gengar_BottomRight[] = { ANIMCMD_FRAME(160, 0), ANIMCMD_END }; static const union AnimCmd *const sAnims_Scene3_Gengar[NUM_GENGAR_BACK_SPRITES] = { sAnim_Scene3_Gengar_TopLeft, sAnim_Scene3_Gengar_TopRight, sAnim_Scene3_Gengar_BottomLeft, sAnim_Scene3_Gengar_BottomRight }; static const struct SpriteTemplate sSpriteTemplate_Scene3_Gengar = { .tileTag = GFXTAG_SCENE3_GENGAR, .paletteTag = PALTAG_GENGAR, .oam = &sOam_Scene3_Gengar, .anims = sAnims_Scene3_Gengar, .images = NULL, .affineAnims = sAffineAnims_Scene3_Mons, .callback = SpriteCallbackDummy }; static const struct OamData sOam_Swipe = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x64), .matrixNum = 0, .size = SPRITE_SIZE(32x64), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AnimCmd sAnim_Swipe_Top[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(32, 4), ANIMCMD_END }; static const union AnimCmd sAnim_Swipe_Bottom[] = { ANIMCMD_FRAME(64, 8), ANIMCMD_FRAME(72, 4), ANIMCMD_END }; static const union AnimCmd *const sAnims_Swipe[] = { [ANIM_SWIPE_TOP] = sAnim_Swipe_Top, [ANIM_SWIPE_BOTTOM] = sAnim_Swipe_Bottom }; static const struct SpriteTemplate sSpriteTemplate_GengarSwipe = { .tileTag = GFXTAG_SCENE3_SWIPE, .paletteTag = PALTAG_SCENE3_SWIPE, .oam = &sOam_Swipe, .anims = sAnims_Swipe, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_GengarSwipe }; static const struct OamData sOam_RecoilDust = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AnimCmd sAnim_RecoilDust[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_FRAME(4, 10), ANIMCMD_FRAME(8, 10), ANIMCMD_FRAME(12, 8), ANIMCMD_END }; static const union AnimCmd *const sAnims_RecoilDust[] = { sAnim_RecoilDust }; static const struct SpriteTemplate sSpriteTemplate_NidorinoRecoilDust = { .tileTag = GFXTAG_SCENE3_RECOIL_DUST, .paletteTag = PALTAG_SCENE3_RECOIL_DUST, .oam = &sOam_RecoilDust, .anims = sAnims_RecoilDust, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_RecoilDust }; static const struct CompressedSpriteSheet sFightSceneSpriteSheets[] = { {sScene2_Gengar_Gfx, 0x800, GFXTAG_SCENE2_GENGAR}, {sScene2_Nidorino_Gfx, 0x800, GFXTAG_SCENE2_NIDORINO}, {sScene3_Nidorino_Gfx, 0x2800, GFXTAG_SCENE3_NIDORINO}, {sScene3_Grass_Gfx, 0x800, GFXTAG_SCENE3_GRASS}, {sScene3_GengarStatic_Gfx, 0x1800, GFXTAG_SCENE3_GENGAR}, {sScene3_Swipe_Gfx, 0xA00, GFXTAG_SCENE3_SWIPE}, {sScene3_RecoilDust_Gfx, 0x200, GFXTAG_SCENE3_RECOIL_DUST} }; // POTENTIAL UB // This array is passed to LoadSpritePalettes in LoadFightSceneSpriteGraphics. // LoadSpritePalettes uses a {0} entry to signal end of array. // Because such an entry is absent in this case, the function // continues reading into the next .rodata section. static const struct SpritePalette sFightSceneSpritePalettes[] = { {sGengar_Pal, PALTAG_GENGAR}, {sNidorino_Pal, PALTAG_NIDORINO}, {sScene3_Grass_Pal, PALTAG_SCENE3_GRASS}, {sScene3_Swipe_Pal, PALTAG_SCENE3_SWIPE}, {sScene3_RecoilDust_Pal, PALTAG_SCENE3_RECOIL_DUST}, {0} }; static void VBlankCB_Copyright(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB2_WaitFadeBeforeSetUpIntro(void) { if (!UpdatePaletteFade()) SetMainCallback2(CB2_SetUpIntro); } static void LoadCopyrightGraphics(u16 charBase, u16 screenBase, u16 palOffset) { LZ77UnCompVram(sCopyright_Gfx, (void *)BG_VRAM + charBase); LZ77UnCompVram(sCopyright_Map, (void *)BG_VRAM + screenBase); LoadPalette(sCopyright_Pal, palOffset, sizeof(sCopyright_Pal)); } static void SerialCB_CopyrightScreen(void) { GameCubeMultiBoot_HandleSerialInterrupt(&sGcmb); } static bool8 SetUpCopyrightScreen(void) { switch (gMain.state) { case 0: SetVBlankCallback(NULL); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); ((vu16*)PLTT)[0] = RGB_WHITE; SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); DmaFill16(3, 0, VRAM, VRAM_SIZE); DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT + sizeof(vu16), PLTT_SIZE - sizeof(vu16)); ResetPaletteFade(); LoadCopyrightGraphics(0 * BG_CHAR_SIZE, 7 * BG_SCREEN_SIZE, BG_PLTT_ID(0)); ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITEALPHA); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(7)); EnableInterrupts(INTR_FLAG_VBLANK); SetVBlankCallback(VBlankCB_Copyright); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON); SetSerialCallback(SerialCB_CopyrightScreen); GameCubeMultiBoot_Init(&sGcmb); // fallthrough default: UpdatePaletteFade(); gMain.state++; GameCubeMultiBoot_Main(&sGcmb); break; case 140: GameCubeMultiBoot_Main(&sGcmb); if (sGcmb.gcmb_field_2 != 1) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gMain.state++; } break; case 141: if (!UpdatePaletteFade()) { gMain.state++; if (sGcmb.gcmb_field_2 != 0) { if (sGcmb.gcmb_field_2 == 2) { if (*(u32 *)(EWRAM_START + 0xAC) == COLOSSEUM_GAME_CODE) { CpuCopy16(gMultiBootProgram_PokemonColosseum_Start, (void *)EWRAM_START, 0x28000); *(u32 *)(EWRAM_START + 0xAC) = COLOSSEUM_GAME_CODE; } GameCubeMultiBoot_ExecuteProgram(&sGcmb); } } else { GameCubeMultiBoot_Quit(); SetSerialCallback(SerialCB); } return FALSE; } break; case 142: ResetSerial(); SetMainCallback2(CB2_WaitFadeBeforeSetUpIntro); break; } return TRUE; } void CB2_InitCopyrightScreenAfterBootup(void) { if (!SetUpCopyrightScreen()) { ResetMenuAndMonGlobals(); Save_ResetSaveCounters(); LoadGameSave(SAVE_NORMAL); if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID) Sav2_ClearSetDefault(); SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); } } void CB2_InitCopyrightScreenAfterTitleScreen(void) { SetUpCopyrightScreen(); } static void CB2_SetUpIntro(void) { switch (gMain.state) { default: gMain.state = 0; // fallthrough case 0: SetVBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, 0); InitHeap(gHeap, HEAP_SIZE); ResetTasks(); ResetSpriteData(); ResetPaletteFade(); ResetTempTileDataBuffers(); Intro_ResetGpuRegs(); DmaFill16(3, 0, VRAM, VRAM_SIZE); DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT, PLTT_SIZE); FillPalette(RGB_BLACK, 0, PLTT_SIZE); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates_GameFreakScene, ARRAY_COUNT(sBgTemplates_GameFreakScene)); break; case 1: LoadPalette(sGameFreakBg_Pal, BG_PLTT_ID(0), sizeof(sGameFreakBg_Pal)); DecompressAndCopyTileDataToVram(BG_GF_BACKGROUND, sGameFreakBg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_GF_BACKGROUND, sGameFreakBg_Map, 0, 0, 1); LoadPalette(sGameFreakLogo_Pal, BG_PLTT_ID(13), sizeof(sGameFreakLogo_Pal)); break; case 2: if (!FreeTempTileDataBuffersIfPossible()) { StartIntroSequence(); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); SetMainCallback2(CB2_Intro); SetVBlankCallback(VBlankCB_Intro); } return; } gMain.state++; } static void CB2_Intro(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCB_Intro(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void Intro_ResetGpuRegs(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); } static void StartIntroSequence(void) { struct IntroSequenceData * ptr = Alloc(sizeof(*ptr)); SetIntroCB(ptr, IntroCB_Init); ptr->taskId = CreateTask(Task_CallIntroCallback, 3); SetWordTaskArg(ptr->taskId, 0, (uintptr_t)ptr); } static void SetIntroCB(struct IntroSequenceData * ptr, IntroCallback cb) { ptr->callback = cb; ptr->state = 0; } static void Task_CallIntroCallback(u8 taskId) { struct IntroSequenceData * ptr = (void *)GetWordTaskArg(taskId, 0); // End intro early if player presses A/Start/Select if (JOY_NEW(A_BUTTON | START_BUTTON | SELECT_BUTTON) && ptr->callback != IntroCB_ExitToTitleScreen) SetIntroCB(ptr, IntroCB_ExitToTitleScreen); ptr->callback(ptr); } static void IntroCB_Init(struct IntroSequenceData * this) { switch (this->state) { case 0: InitWindows(sWindowTemplates); LZ77UnCompWram(sGameFreakText_Gfx, this->gameFreakTextGfx); LZ77UnCompWram(sGameFreakLogo_Gfx, this->gameFreakLogoGfx); FillBgTilemapBufferRect(BG_GF_TEXT_LOGO, 0x000, 0, 0, 32, 32, 17); FillWindowPixelBuffer(WIN_GF_TEXT_LOGO, PIXEL_FILL(0)); BlitBitmapToWindow(WIN_GF_TEXT_LOGO, this->gameFreakTextGfx, 0, 40, 144, 16); PutWindowTilemap(WIN_GF_TEXT_LOGO); CopyWindowToVram(WIN_GF_TEXT_LOGO, COPYWIN_FULL); this->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) SetIntroCB(this, IntroCB_GF_OpenWindow); break; } } static void IntroCB_GF_OpenWindow(struct IntroSequenceData * this) { switch (this->state) { case 0: SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_ALL); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_WIN1H, DISPLAY_WIDTH); SetGpuReg(REG_OFFSET_WIN1V, 0); this->timer = 0; this->state++; break; case 1: ShowBg(BG_GF_BACKGROUND); BlendPalettes(PALETTES_ALL, 0, RGB_BLACK); this->state++; break; case 2: // Extend window height in both directions from midpoint until it reaches a narrow "theatric" view this->timer += 8; if (this->timer >= 48) this->timer = 48; SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(DISPLAY_HEIGHT / 2 - this->timer, DISPLAY_HEIGHT / 2 + this->timer)); if (this->timer == 48) SetIntroCB(this, IntroCB_GF_Star); break; } } static void IntroCB_GF_Star(struct IntroSequenceData * this) { switch (this->state) { case 0: PlaySE(MUS_GAME_FREAK); GFScene_LoadGfxCreateStar(); this->timer = 0; this->state++; break; case 1: if (++this->timer == 30) { GFScene_StartNameSparklesSmall(); this->timer = 0; this->state++; } break; case 2: this->timer++; if (this->timer == 90) SetIntroCB(this, IntroCB_GF_RevealName); break; } } static void IntroCB_GF_RevealName(struct IntroSequenceData * this) { switch (this->state) { case 0: GFScene_StartNameSparklesBig(); this->timer = 0; this->state++; break; case 1: if (++this->timer >= 40) this->state++; break; case 2: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); StartBlendTask(0, 16, 16, 0, 48, 0); this->state++; break; case 3: ShowBg(BG_GF_TEXT_LOGO); this->state++; break; case 4: if (!IsBlendTaskActive()) { SetGpuReg(REG_OFFSET_BLDCNT, 0); this->timer = 0; this->state++; } break; case 5: if (++this->timer > 50) SetIntroCB(this, IntroCB_GF_RevealLogo); break; } } static void IntroCB_GF_RevealLogo(struct IntroSequenceData * this) { switch (this->state) { case 0: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); StartBlendTask(0, 16, 16, 0, 16, 0); this->data[0] = 0; // Never read this->data[1] = 16; // Never read this->timer = 0; this->state++; break; case 1: this->gameFreakLogoArtSprite = GFScene_CreateLogoSprite(); this->state++; break; case 2: if (!IsBlendTaskActive()) { BlitBitmapToWindow(WIN_GF_TEXT_LOGO, this->gameFreakLogoGfx, 0x38, 0x06, 0x20, 0x40); BlitBitmapToWindow(WIN_GF_TEXT_LOGO, this->gameFreakTextGfx, 0x00, 0x28, 0x90, 0x10); CopyWindowToVram(WIN_GF_TEXT_LOGO, COPYWIN_GFX); this->state++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { DestroySprite(this->gameFreakLogoArtSprite); GFScene_CreatePresentsSprite(); this->timer = 0; this->state++; } break; case 4: if (++this->timer > 90) { SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2); StartBlendTask(16, 0, 0, 16, 20, 0); this->state++; } break; case 5: if (!IsBlendTaskActive()) { HideBg(BG_GF_TEXT_LOGO); this->state++; } break; case 6: ResetSpriteData(); FreeAllSpritePalettes(); this->timer = 0; this->state++; break; case 7: if (++this->timer > 20) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetIntroCB(this, IntroCB_Scene1); } break; } } static void IntroCB_Scene1(struct IntroSequenceData * this) { switch (this->state) { case 0: SetVBlankCallback(NULL); LoadPalette(sScene1_Grass_Pal, BG_PLTT_ID(PALSLOT_SCENE1_GRASS), sizeof(sScene1_Grass_Pal)); LoadPalette(sScene1_Bg_Pal, BG_PLTT_ID(PALSLOT_SCENE1_BG), sizeof(sScene1_Bg_Pal)); BlendPalettes((1 << PALSLOT_SCENE1_GRASS) | (1 << PALSLOT_SCENE1_BG), 16, RGB_WHITE); InitBgsFromTemplates(0, sBgTemplates_Scene1, ARRAY_COUNT(sBgTemplates_Scene1)); DecompressAndCopyTileDataToVram(BG_SCENE1_BACKGROUND, sScene1_Bg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE1_BACKGROUND, sScene1_Bg_Map, 0, 0, 1); ShowBg(BG_SCENE1_BACKGROUND); HideBg(BG_SCENE1_GRASS); HideBg(BG_SCENE1_UNUSED1); HideBg(BG_SCENE1_UNUSED2); LoadFightSceneSpriteGraphics(); SetVBlankCallback(VBlankCB_Intro); this->state++; break; case 1: if (!FreeTempTileDataBuffersIfPossible()) { DecompressAndCopyTileDataToVram(BG_SCENE1_GRASS, sScene1_Grass_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE1_GRASS, sScene1_Grass_Map, 0, 0, 1); ResetBgPositions(); ShowBg(BG_SCENE1_BACKGROUND); this->state++; } break; case 2: if (!FreeTempTileDataBuffersIfPossible()) { ShowBg(BG_SCENE1_GRASS); CreateTask(Scene1_Task_AnimateGrass, 0); BeginNormalPaletteFade((1 << PALSLOT_SCENE1_GRASS) | (1 << PALSLOT_SCENE1_BG), -2, 16, 0, RGB_WHITE); this->state++; } break; case 3: if (!gPaletteFade.active) { m4aSongNumStart(MUS_INTRO_FIGHT); this->timer = 0; this->state++; } break; case 4: if (++this->timer == 20) { // Start animation for transitioning to the next scene CreateTask(Scene1_Task_BgZoom, 0); Scene1_StartGrassScrolling(); } if (this->timer >= 30) { // End scene BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); DestroyTask(FindTaskIdByFunc(Scene1_Task_AnimateGrass)); DestroyTask(FindTaskIdByFunc(Scene1_Task_BgZoom)); SetIntroCB(this, IntroCB_Scene2); } break; case 5: // Never reached if (!gPaletteFade.active) { DestroyTask(FindTaskIdByFunc(Scene1_Task_AnimateGrass)); DestroyTask(FindTaskIdByFunc(Scene1_Task_BgZoom)); SetIntroCB(this, IntroCB_Scene2); } break; } } #define tTimer data[0] #define tFrame data[1] #define tExiting data[2] #define tScroll data[3] static void Scene1_Task_AnimateGrass(u8 taskId) { s16 * data = gTasks[taskId].data; // Each of the 3 frames of the bg grass animation is separated vertically on the tilemap. // The conditional below changes the frame by setting the y coordinate of the bg. if (++tTimer > 5) { tTimer = 0; if (++tFrame >= 3) tFrame = 0; ChangeBgY(BG_SCENE1_GRASS, tFrame << 15, BG_COORD_SET); } // When it's time to progress to the next scene, the grass is meant to scroll downward offscreen. // This scrolling is overwritten by the coord change above, and so the grass "stutters" back upward. // They don't mask the bg, so if it were to continue scrolling offscreen it would reveal the frame above on the tilemap. if (tExiting) { tScroll += 0x120; ChangeBgY(BG_SCENE1_GRASS, tScroll, BG_COORD_SUB); } } static void Scene1_StartGrassScrolling(void) { u8 taskId = FindTaskIdByFunc(Scene1_Task_AnimateGrass); gTasks[taskId].tExiting = TRUE; } #undef tTimer #undef tFrame #undef tExiting #undef tScroll #define tTimer data[0] #define tFrame data[1] // Have the silhouetted forest background "zoom in" during the transition to the next scene. // Same as the grass animation above, this achieved by separating frames vertically on the bg tilemap. static void Scene1_Task_BgZoom(u8 taskId) { s16 * data = gTasks[taskId].data; if (++tTimer > 3) { tTimer = 0; if (tFrame < 2) tFrame++; ChangeBgY(BG_SCENE1_BACKGROUND, tFrame << 15, BG_COORD_SET); } } #undef tTimer #undef tFrame static void IntroCB_Scene2(struct IntroSequenceData * this) { switch (this->state) { case 0: BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); InitBgsFromTemplates(0, sBgTemplates_Scene2, ARRAY_COUNT(sBgTemplates_Scene2)); DecompressAndCopyTileDataToVram(BG_SCENE2_BACKGROUND, sScene2_Bg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE2_BACKGROUND, sScene2_Bg_Map, 0, 0, 1); ShowBg(BG_SCENE2_BACKGROUND); this->state++; break; case 1: if (!FreeTempTileDataBuffersIfPossible()) { SetVBlankCallback(NULL); LoadPalette(sScene2_Bg_Pal, BG_PLTT_ID(1), sizeof(sScene2_Bg_Pal)); LoadPalette(sGengar_Pal, BG_PLTT_ID(5), sizeof(sGengar_Pal)); LoadPalette(sScene2_NidorinoClose_Pal, BG_PLTT_ID(6), sizeof(sScene2_NidorinoClose_Pal)); BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); DecompressAndCopyTileDataToVram(BG_SCENE2_PLANTS, sScene2_Plants_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE2_PLANTS, sScene2_Plants_Map, 0, 0, 1); DecompressAndCopyTileDataToVram(BG_SCENE2_NIDORINO, sScene2_NidorinoClose_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE2_NIDORINO, sScene2_NidorinoClose_Map, 0, 0, 1); DecompressAndCopyTileDataToVram(BG_SCENE2_GENGAR, sScene2_GengarClose_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE2_GENGAR, sScene2_GengarClose_Map, 0, 0, 1); ResetBgPositions(); ShowBg(BG_SCENE2_PLANTS); HideBg(BG_SCENE2_NIDORINO); // Hide bgs for the close up shot HideBg(BG_SCENE2_GENGAR); ChangeBgY(BG_SCENE2_GENGAR, 0x0001CE00, BG_COORD_SET); ChangeBgY(BG_SCENE2_NIDORINO, 0x00002800, BG_COORD_SET); CreateTask(Scene2_Task_PanForest, 0); Scene2_CreateMonSprites(this); BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); SetVBlankCallback(VBlankCB_Intro); this->state++; } break; case 2: if (!FreeTempTileDataBuffersIfPossible()) { BeginNormalPaletteFade(PALETTES_ALL & ~1, -2, 16, 0, RGB_WHITE); this->state++; } break; case 3: if (!gPaletteFade.active) { this->timer = 0; this->state++; } break; case 4: if (++this->timer >= 60) { this->timer = 0; DestroyTask(FindTaskIdByFunc(Scene2_Task_PanForest)); Scene2_DestroyMonSprites(this); CreateTask(Scene2_Task_PanMons, 0); ChangeBgY(BG_SCENE2_BACKGROUND, 0x00010000, BG_COORD_SET); // Move background from upper half (wide shot) to lower half (close up) HideBg(BG_SCENE2_PLANTS); ShowBg(BG_SCENE2_BACKGROUND); ShowBg(BG_SCENE2_NIDORINO); ShowBg(BG_SCENE2_GENGAR); this->state++; } break; case 5: if (!IsDma3ManagerBusyWithBgCopy()) { this->timer = 0; this->state++; } break; case 6: if (++this->timer >= 60) { DestroyTask(FindTaskIdByFunc(Scene2_Task_PanMons)); SetIntroCB(this, IntroCB_Scene3_Entrance); } break; } } // Pan the background trees right and the foreground plants left in the wide shot static void Scene2_Task_PanForest(u8 taskId) { ChangeBgX(BG_SCENE2_BACKGROUND, 0x0E0, BG_COORD_SUB); ChangeBgX(BG_SCENE2_PLANTS, 0x110, BG_COORD_ADD); } // Pan Gengar up and Nidorino down in the close up shot static void Scene2_Task_PanMons(u8 taskId) { ChangeBgY(BG_SCENE2_GENGAR, 0x020, BG_COORD_ADD); ChangeBgY(BG_SCENE2_NIDORINO, 0x024, BG_COORD_SUB); } // Create the Gengar/Nidorino sprites for the wide shot in scene 2 static void Scene2_CreateMonSprites(struct IntroSequenceData * this) { u8 spriteId; this->scene2GengarSprite = NULL; this->scene2NidorinoSprite = NULL; spriteId = CreateSprite(&sSpriteTemplate_Scene2_Nidorino, 168, 80, 11); if (spriteId != MAX_SPRITES) this->scene2NidorinoSprite = &gSprites[spriteId]; spriteId = CreateSprite(&sSpriteTemplate_Scene2_Gengar, 72, 80, 12); if (spriteId != MAX_SPRITES) this->scene2GengarSprite = &gSprites[spriteId]; } static void Scene2_DestroyMonSprites(struct IntroSequenceData * this) { if (this->scene2GengarSprite != NULL) DestroySprite(this->scene2GengarSprite); if (this->scene2NidorinoSprite != NULL) DestroySprite(this->scene2NidorinoSprite); } // Set up the scene 3 graphics, then start the scrolling to get Gengar and Nidorino in their fight positions static void IntroCB_Scene3_Entrance(struct IntroSequenceData * this) { switch (this->state) { case 0: LoadPalette(sScene3_Bg_Pal, BG_PLTT_ID(1), sizeof(sScene3_Bg_Pal)); LoadPalette(sGengar_Pal, BG_PLTT_ID(5), sizeof(sGengar_Pal)); BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); InitBgsFromTemplates(0, sBgTemplates_Scene3, ARRAY_COUNT(sBgTemplates_Scene3)); DecompressAndCopyTileDataToVram(BG_SCENE3_BACKGROUND, sScene3_Bg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE3_BACKGROUND, sScene3_Bg_Map, 0, 0, 1); ShowBg(BG_SCENE3_BACKGROUND); HideBg(BG_SCENE3_GENGAR); HideBg(BG_SCENE3_UNUSED1); HideBg(BG_SCENE3_UNUSED2); ResetBgPositions(); this->state++; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_OBJ); ClearGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_BG0); SetGpuRegBits(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(32, DISPLAY_HEIGHT - 32)); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH / 2)); break; case 1: if (!FreeTempTileDataBuffersIfPossible()) { DecompressAndCopyTileDataToVram(BG_SCENE3_GENGAR, sScene3_GengarAnim_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE3_GENGAR, sScene3_GengarAnim_Map, 0, 0, 1); sUnusedScene3Var0 = 4; sUnusedScene3Var1 = 52; ChangeBgX(BG_SCENE3_GENGAR, 0x00001800, BG_COORD_SET); ChangeBgY(BG_SCENE3_GENGAR, 0x0001F000, BG_COORD_SET); this->state++; } break; case 2: if (!FreeTempTileDataBuffersIfPossible()) { BlendPalettes(PALETTES_ALL & ~1, 0, RGB_WHITE); ShowBg(BG_SCENE3_GENGAR); CreateTask(Scene3_Task_GengarBounce, 0); Scene3_CreateNidorinoSprite(this); Scene3_StartNidorinoEntrance(this->scene3NidorinoSprite, 0, 180, 52); CreateTask(Scene3_Task_GengarEnter, 0); Scene3_StartBgScroll(); this->timer = 0; this->state++; } break; case 3: if (++this->timer == 16) Scene3_CreateGrassSprite(this); if (!Scene3_IsNidorinoEntering(this) && !FuncIsActiveTask(Scene3_Task_GengarEnter)) SetIntroCB(this, IntroCB_Scene3_Fight); break; } } #define tSlow data[0] // Pan the background trees right during the fight scene. // It pans quickly while Gengar/Nidorino are sliding onscreen, and it pans slowly thereafter. static void Scene3_Task_BgScroll(u8 taskId) { if (!gTasks[taskId].tSlow) ChangeBgX(BG_SCENE3_BACKGROUND, 0x400, BG_COORD_SUB); else ChangeBgX(BG_SCENE3_BACKGROUND, 0x020, BG_COORD_SUB); } static void Scene3_StartBgScroll(void) { CreateTask(Scene3_Task_BgScroll, 0); } static void Scene3_SlowBgScroll(void) { u8 taskId = FindTaskIdByFunc(Scene3_Task_BgScroll); gTasks[taskId].tSlow = TRUE; } #undef tSlow #define tPaused data[0] #define tTimer data[1] #define tState data[2] // Gengar has an "idle" animation where it bounces a little static void Scene3_Task_GengarBounce(u8 taskId) { s16 * data = gTasks[taskId].data; if (!tPaused) { if (++tTimer >= 30) { tTimer = 0; tState ^= 1; // Alternate between the 0th (normal) and 1st (slightly crouched) bg frames ChangeBgY(BG_SCENE3_GENGAR, (tState << 15) + 0x1F000, BG_COORD_SET); } } } static void Scene3_PauseGengarBounce(void) { u8 taskId = FindTaskIdByFunc(Scene3_Task_GengarBounce); gTasks[taskId].tPaused = TRUE; } static void Scene3_ResumeGengarBounce(void) { u8 taskId = FindTaskIdByFunc(Scene3_Task_GengarBounce); gTasks[taskId].tPaused = FALSE; } static bool8 Scene3_IsGengarMidBounce(void) { u8 taskId = FindTaskIdByFunc(Scene3_Task_GengarBounce); return gTasks[taskId].tState; } #undef tPaused #undef tTimer #undef tState // The small clump of grass that passes by in the foreground during the fight static void Scene3_CreateGrassSprite(struct IntroSequenceData * this) { u8 spriteId = CreateSprite(&sSpriteTemplate_Grass, 296, 112, 7); if (spriteId != MAX_SPRITES) { this->scene3GrassSprite = &gSprites[spriteId]; this->scene3GrassSprite->callback = SpriteCB_Grass; } else this->scene3GrassSprite = NULL; } #define sState data[0] #define sBaseX data[1] #define sVeloc data[2] static void SpriteCB_Grass(struct Sprite *sprite) { s16 * data = sprite->data; switch (sState) { case 0: sBaseX = sprite->x << 5; sVeloc = 160; sState++; // fallthrough case 1: sBaseX -= sVeloc; sprite->x = sBaseX >> 5; if (sprite->x <= 52) { Scene3_SlowBgScroll(); sState++; } break; case 2: sBaseX -= 32; sprite->x = sBaseX >> 5; if (sprite->x <= -32) { sprite->invisible = TRUE; sprite->sState++; DestroySprite(sprite); } break; } } #undef sState #undef sBaseX #undef sVeloc static void IntroCB_Scene3_Fight(struct IntroSequenceData * this) { switch (this->state) { case 0: this->timer = 0; this->state++; break; case 1: if (++this->timer > 30) { Scene3_StartNidorinoCry(this); this->state++; } break; case 2: if (!Scene3_NidorinoAnimIsRunning(this)) { this->timer = 0; this->state++; } break; case 3: if (++this->timer > 30) { Scene3_PauseGengarBounce(); Scene3_StartGengarAttack(this); this->timer = 0; this->state++; } break; case 4: if (this->gengarAttackLanded) { Scene3_StartNidorinoRecoil(this); this->state++; } break; case 5: if (!Scene3_NidorinoAnimIsRunning(this)) { Scene3_ResumeGengarBounce(); this->timer = 0; this->state++; } break; case 6: if (++this->timer > 16) { // Nidorino's 1st hop backwards in preparation to attack Scene3_StartNidorinoHop(this->scene3NidorinoSprite, 8, 12, 5); this->state++; } break; case 7: if (!Scene3_NidorinoAnimIsRunning(this)) { // Nidorino's 2nd hop backwards in preparation to attack Scene3_StartNidorinoHop(this->scene3NidorinoSprite, 8, 12, 5); this->state++; } break; case 8: if (!Scene3_NidorinoAnimIsRunning(this)) { this->timer = 0; this->state++; } break; case 9: if (++this->timer > 20) { Scene3_StartNidorinoAttack(this); this->timer = 0; this->state++; } break; case 10: if (!Scene3_IsGengarMidBounce()) { Scene3_PauseGengarBounce(); Scene3_CreateGengarSprite(this); this->state++; } break; case 11: HideBg(BG_SCENE3_GENGAR); this->timer = 0; this->state++; break; case 12: if (++this->timer == 48) BeginNormalPaletteFade((1 << 1) | (1 << 2), 2, 0, 16, RGB_WHITE); if (this->timer > 120) { Scene3_NidorinoZoom(this); Scene3_GengarZoom(this); this->state++; this->timer = 0; } break; case 13: if (++this->timer > 8) { CpuFill16(RGB_WHITE, &gPlttBufferUnfaded[BG_PLTT_ID(1)], 2 * PLTT_SIZE_4BPP); BeginNormalPaletteFade(PALETTES_ALL & ~1, -2, 0, 16, RGB_BLACK); this->state++; } break; case 14: if (!gPaletteFade.active) { this->timer = 0; this->state++; } break; case 15: if (++this->timer > 60) SetIntroCB(this, IntroCB_ExitToTitleScreen); break; default: if (JOY_NEW(R_BUTTON)) { BlendPalettes(PALETTES_OBJECTS | (1 << 2) | (1 << 5) | (1 << 6), 0, RGB_WHITE); this->scene3NidorinoSprite->x2 = 0; this->scene3NidorinoSprite->x = 180; this->state = 1; this->timer = 30; } break; } } static void Scene3_CalcCenterToCornerVec(struct Sprite *sprite) { CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); } static void Scene3_CreateGengarSprite(struct IntroSequenceData * this) { int i; // Not using a subsprite table for this for (i = 0; i < NUM_GENGAR_BACK_SPRITES; i++) { int x = (i & 1) * 48 + 49; int y = (i / 2) * 64 + 72; u8 spriteId = CreateSprite(&sSpriteTemplate_Scene3_Gengar, x, y, 8); if (spriteId != MAX_SPRITES) { StartSpriteAnim(&gSprites[spriteId], i); this->scene3GengarSprites[i] = &gSprites[spriteId]; if (i & 1) this->scene3GengarSprites[i]->oam.shape = ST_OAM_V_RECTANGLE; Scene3_CalcCenterToCornerVec(this->scene3GengarSprites[i]); } } } static void Scene3_NidorinoZoom(struct IntroSequenceData * this) { this->scene3NidorinoSprite->x += this->scene3NidorinoSprite->x2; this->scene3NidorinoSprite->y += this->scene3NidorinoSprite->y2; SetSpriteMatrixAnchor(this->scene3NidorinoSprite, 0, 42); this->scene3NidorinoSprite->callback = SpriteCallbackDummy; StartSpriteAffineAnim(this->scene3NidorinoSprite, AFFINEANIM_ZOOM); } static void SpriteCB_Idle(struct Sprite *sprite) { } static void Scene3_GengarZoom(struct IntroSequenceData * this) { int i; for (i = 0; i < NUM_GENGAR_BACK_SPRITES; i++) { StartSpriteAffineAnim(this->scene3GengarSprites[i], AFFINEANIM_ZOOM); this->scene3GengarSprites[i]->callback = SpriteCB_Idle; SetSpriteMatrixAnchor(this->scene3GengarSprites[i], sGengarZoomMatrixAnchors[i][0], sGengarZoomMatrixAnchors[i][1]); } } static void IntroCB_ExitToTitleScreen(struct IntroSequenceData * this) { switch (this->state) { case 0: FillPalette(RGB_BLACK, 0, PLTT_SIZE); this->state++; break; case 1: if (!FreeTempTileDataBuffersIfPossible()) { DestroyTask(this->taskId); Free(this); DisableInterrupts(INTR_FLAG_HBLANK); SetHBlankCallback(NULL); if(gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_NO_FLASH || gSaveFileStatus == SAVE_STATUS_INVALID) { u16 rand = Random(); if(rand % 2 == 0) gSaveBlock1Ptr->keyFlags.version = 0; else gSaveBlock1Ptr->keyFlags.version = 1; } SetMainCallback2(CB2_InitTitleScreen); } break; } } // Sprite data for SpriteCB_Star #define sStar_BaseX data[0] #define sStar_BaseY data[1] #define sStar_SpeedX data[2] #define sStar_SpeedY data[3] #define sStar_SinIdx data[4] #define sStar_SparkleTimer data[5] #define sStar_SparkleRngSeed data[6] static void GFScene_LoadGfxCreateStar(void) { int i; u8 spriteId; static EWRAM_DATA u32 sStarSparklesRngSeed = 0; for (i = 0; i < ARRAY_COUNT(sSpriteSheets_GameFreakScene); i++) LoadCompressedSpriteSheet(&sSpriteSheets_GameFreakScene[i]); LoadSpritePalettes(sSpritePalettes_GameFreakScene); sStarSpeedX = 96; sStarSpeedY = 16; sStarSparklesXmodMask = 0x07; sStarSparklesUnusedVar = 5; sStarSparklesSpawnRate = 8; sStarSparklesFlickerStartTime = 90; sStarSparklesDestroySpriteTime = 120; sStarSparklesXspeed = 1; sStarSparklesYspeed = 1; sStarSparklesXprecision = 5; sStarSparklesYprecision = 5; if (sStarSparklesRngSeed == 0) sStarSparklesRngSeed = 354128453; spriteId = CreateSprite(&sSpriteTemplate_Star, 248, 55, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].sStar_BaseX = 248 << 4; gSprites[spriteId].sStar_BaseY = 55 << 4; gSprites[spriteId].sStar_SpeedX = sStarSpeedX; gSprites[spriteId].sStar_SpeedY = sStarSpeedY; StoreWordInTwoHalfwords((u16 *)&gSprites[spriteId].sStar_SparkleRngSeed, sStarSparklesRngSeed); } } // Sprite data for SpriteCB_SparklesSmall_Star #define sSmSparkleStar_BaseX data[0] #define sSmSparkleStar_BaseY data[1] #define sSmSparkleStar_SpeedX data[2] #define sSmSparkleStar_SpeedY data[3] #define sSmSparkleStar_FallSpeed data[4] #define sSmSparkleStar_FallDist data[5] #define sSmSparkleStar_Timer data[7] static void GFScene_CreateStarSparkle(s16 x, s16 y, u16 random) { static EWRAM_DATA s16 sYmod = 0; u8 spriteId; s16 xMod = (random & sStarSparklesXmodMask) + 2; s16 yMod = sYmod; if (++sYmod > 3) sYmod = -3; x += xMod; y += yMod; if (x > 0 && x < DISPLAY_WIDTH) { spriteId = CreateSprite(&sSpriteTemplate_SparklesSmall, x, y, 1); if (spriteId != MAX_SPRITES) { gSprites[spriteId].sSmSparkleStar_BaseX = x << sStarSparklesXprecision; gSprites[spriteId].sSmSparkleStar_BaseY = y << sStarSparklesYprecision; gSprites[spriteId].sSmSparkleStar_SpeedX = sStarSparklesXspeed * xMod; gSprites[spriteId].sSmSparkleStar_SpeedY = sStarSparklesYspeed * yMod; } } } #define tSparkleIdx data[0] #define tNumLoops data[1] #define tTimer data[2] static void GFScene_StartNameSparklesSmall(void) { CreateTask(GFScene_Task_NameSparklesSmall, 1); } // Sprite data for SpriteCB_SparklesSmall_Name #define sSmSparkleName_State data[0] #define sSmSparkleName_BaseY data[1] #define sSmSparkleName_AnimTimer data[2] #define sSmSparkleName_NumLoops data[3] #define sSmSparkleName_DestroyTimer data[4] static void GFScene_Task_NameSparklesSmall(u8 taskId) { s16 * data = gTasks[taskId].data; u8 i; u8 spriteId; tTimer++; data[3]++; // Unused if (tTimer > 6) { tTimer = 0; i = tSparkleIdx; spriteId = CreateSprite(&sSpriteTemplate_SparklesSmall, sTextSparkleCoords[i].x, sTextSparkleCoords[i].y, 2); StartSpriteAnim(&gSprites[spriteId], ANIM_SPARKLE_ONCE); gSprites[spriteId].callback = SpriteCB_SparklesSmall_Name; gSprites[spriteId].sSmSparkleName_BaseY = sTextSparkleCoords[i].y << 4; gSprites[spriteId].sSmSparkleName_AnimTimer = 120; gSprites[spriteId].sSmSparkleName_NumLoops = tNumLoops; if (gSprites[spriteId].sSmSparkleName_NumLoops < 0) gSprites[spriteId].sSmSparkleName_NumLoops = 1; if (++tSparkleIdx >= ARRAY_COUNT(sTextSparkleCoords)) { if (++tNumLoops > 1) DestroyTask(taskId); else tSparkleIdx = 0; } } } #undef tSparkleIdx #undef tNumLoops #undef tTimer #define tTimer data[0] #define tSparkleIdx data[1] #define tNumSparkles data[2] static void GFScene_StartNameSparklesBig(void) { CreateTask(GFScene_Task_NameSparklesBig, 2); } static void GFScene_Task_NameSparklesBig(u8 taskId) { s16 * data = gTasks[taskId].data; u8 i; if (tTimer == 0) { i = tSparkleIdx; tSparkleIdx += 4; if (tSparkleIdx >= ARRAY_COUNT(sTextSparkleCoords)) tSparkleIdx -= ARRAY_COUNT(sTextSparkleCoords); CreateSprite(&sSpriteTemplate_SparklesBig, sTextSparkleCoords[i].x, sTextSparkleCoords[i].y, 3); if (++tNumSparkles >= (int)ARRAY_COUNT(sTextSparkleCoords)) DestroyTask(taskId); } if (++tTimer > 9) tTimer = 0; } #undef tTimer #undef tSparkleIdx #undef tNumSparkles static struct Sprite *GFScene_CreateLogoSprite(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_GameFreakLogoArt, 120, 70, 4); return &gSprites[spriteId]; } static void GFScene_CreatePresentsSprite(void) { int i; for (i = 0; i < 2; i++) gSprites[CreateSprite(&sSpriteTemplate_Presents, 104 + 32 * i, 108, 5)].oam.tileNum += i * 4; } #define tState data[0] #define tTimer data[1] #define tSinIdx data[3] #define tBaseX data[4] #define IDX_INTRO_DATA 5 // A pointer to the IntroSequenceData will be stored at data[5] and data[6] #define tFrame data[7] #define tMultY data[8] #define tMultX data[9] static void Scene3_StartGengarAttack(struct IntroSequenceData * this) { u8 taskId; this->gengarAttackLanded = FALSE; taskId = CreateTask(Scene3_Task_GengarAttack, 4); SetWordTaskArg(taskId, IDX_INTRO_DATA, (uintptr_t)this); gTasks[taskId].tSinIdx = 64; gTasks[taskId].tBaseX = GetBgX(BG_SCENE3_GENGAR); } static void Scene3_ApplyGengarAnim(int frame, int xSub, int ySub, int xBase) { ChangeBgY(BG_SCENE3_GENGAR, (frame << 15) + 0x1F000, BG_COORD_SET); ChangeBgX(BG_SCENE3_GENGAR, xBase, BG_COORD_SET); ChangeBgX(BG_SCENE3_GENGAR, xSub << 8, BG_COORD_SUB); ChangeBgY(BG_SCENE3_GENGAR, ySub << 8, BG_COORD_SUB); } static void Scene3_Task_GengarAttack(u8 taskId) { s16 * data = gTasks[taskId].data; s32 xSub, ySub; s32 sinIdx; switch (tState) { case 0: tFrame = 2; // Gengar raises arm up tTimer = 0; tMultY = 6; tMultX = 32; tState++; break; case 1: // Gengar moves in a backward arc tSinIdx -= 2; if (++tTimer > 15) { tTimer = 0; tState++; } break; case 2: // Gengar pauses at end of backward arc if (++tTimer == 14) ((struct IntroSequenceData *)GetWordTaskArg(taskId, IDX_INTRO_DATA))->gengarAttackLanded = TRUE; if (tTimer > 15) { tTimer = 0; tState++; } break; case 3: // Gengar moves in a forward arc tSinIdx += 8; if (++tTimer == 4) { Scene3_CreateGengarSwipeSprites(); tMultY = 32; tMultX = 48; tFrame = 3; // Gengar swipes arm down } if (tTimer > 7) { tTimer = 0; tState++; } break; case 4: // Gengar moves in a backward arc to its original position tSinIdx -= 8; if (++tTimer > 3) { tFrame = 0; // Gengar returns to normal posture tSinIdx = 64; tTimer = 0; tState++; } break; case 5: DestroyTask(taskId); return; } // Animate current movement arc / frame change sinIdx = tSinIdx; xSub = -((gSineTable[sinIdx + 64] * tMultX) >> 8); ySub = tMultY - ((gSineTable[sinIdx] * tMultY) >> 8); Scene3_ApplyGengarAnim(tFrame, xSub, ySub, tBaseX); } #undef tState #undef tTimer #undef tSinIdx #undef tBaseX #undef IDX_INTRO_DATA #undef tFrame #undef tMultY #undef tMultX static void Scene3_CreateGengarSwipeSprites(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_GengarSwipe, 132, 78, 6); // Implicitly ANIM_SWIPE_TOP spriteId = CreateSprite(&sSpriteTemplate_GengarSwipe, 132, 118, 6); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.shape = SPRITE_SHAPE(32x16); gSprites[spriteId].oam.size = SPRITE_SIZE(32x16); Scene3_CalcCenterToCornerVec(&gSprites[spriteId]); StartSpriteAnim(&gSprites[spriteId], ANIM_SWIPE_BOTTOM); } } static void SpriteCB_GengarSwipe(struct Sprite *sprite) { sprite->invisible ^= 1; if (sprite->animEnded) DestroySprite(sprite); } #define tState data[0] #define tSpeed data[1] #define tMoves data[2] // Scroll Gengar into position for the fight static void Scene3_Task_GengarEnter(u8 taskId) { s16 * data = gTasks[taskId].data; static EWRAM_DATA u32 sGengarScroll = 0; switch (tState) { case 0: tSpeed = 0x400; tState++; // fallthrough case 1: // Don't decelerate for the first 40 movements if (++tMoves >= 40 && tSpeed > 16) tSpeed -= 16; sGengarScroll = ChangeBgX(BG_SCENE3_GENGAR, tSpeed, BG_COORD_ADD); if (sGengarScroll >= 0x8000) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); if (sGengarScroll >= 0xEF00) { ChangeBgX(BG_SCENE3_GENGAR, 0xEF00, BG_COORD_SET); DestroyTask(taskId); } break; } } #undef tState #undef tSpeed #undef tMoves static void SpriteCB_Star(struct Sprite *sprite) { u32 random; sprite->sStar_BaseX -= sprite->sStar_SpeedX; sprite->sStar_BaseY += sprite->sStar_SpeedY; sprite->sStar_SinIdx += 48; sprite->x = sprite->sStar_BaseX >> 4; sprite->y = sprite->sStar_BaseY >> 4; sprite->y2 = gSineTable[(sprite->sStar_SinIdx >> 4) + 64] >> 5; sprite->sStar_SparkleTimer++; if (sprite->sStar_SparkleTimer % sStarSparklesSpawnRate) { LoadWordFromTwoHalfwords(&sprite->sStar_SparkleRngSeed, &random); random = ISO_RANDOMIZE1(random); StoreWordInTwoHalfwords(&sprite->sStar_SparkleRngSeed, random); random >>= 16; GFScene_CreateStarSparkle(sprite->x, sprite->y + sprite->y2, random); } if (sprite->x < -8) DestroySprite(sprite); } // Callback for the sparkles that trail behind the star static void SpriteCB_SparklesSmall_Star(struct Sprite *sprite) { sprite->sSmSparkleStar_BaseX += sprite->sSmSparkleStar_SpeedX; sprite->sSmSparkleStar_BaseY += sprite->sSmSparkleStar_SpeedY; sprite->sSmSparkleStar_FallDist += ++sprite->sSmSparkleStar_FallSpeed; sprite->sSmSparkleStar_Timer++; sprite->x = (u16)sprite->sSmSparkleStar_BaseX >> sStarSparklesXprecision; sprite->y = sprite->sSmSparkleStar_BaseY >> sStarSparklesYprecision; if (sStarSparklesGravityShift && sprite->sSmSparkleStar_SpeedY < 0) sprite->y2 = sprite->sSmSparkleStar_FallDist >> sStarSparklesGravityShift; if (sprite->sSmSparkleStar_Timer > sStarSparklesFlickerStartTime) { sprite->invisible = !sprite->invisible; if (sprite->sSmSparkleStar_Timer > sStarSparklesDestroySpriteTime) DestroySprite(sprite); } if (sprite->y + sprite->y2 < 0 || sprite->y + sprite->y2 > DISPLAY_HEIGHT) DestroySprite(sprite); } // Callback for the small sparkles during the "Game Freak" text reveal static void SpriteCB_SparklesSmall_Name(struct Sprite *sprite) { if (sprite->sSmSparkleName_AnimTimer) { sprite->sSmSparkleName_AnimTimer--; sprite->sSmSparkleName_BaseY++; sprite->y = sprite->sSmSparkleName_BaseY >> 4; if (sprite->y > 86) { sprite->y = 74; sprite->sSmSparkleName_BaseY = 74 << 4; } if (sprite->animEnded) { if (sprite->sSmSparkleName_State == 0) { sprite->x += 26; if (sprite->x > 188) { sprite->x = (188 * 2) - sprite->x; sprite->sSmSparkleName_State = 1; } } else { sprite->x -= 26; if (sprite->x < 52) { sprite->x = (52 * 2) - sprite->x; sprite->sSmSparkleName_State = 0; } } StartSpriteAnim(sprite, ANIM_SPARKLE_ONCE); } } else { if (sprite->sSmSparkleName_NumLoops) DestroySprite(sprite); if (sprite->animEnded) StartSpriteAnim(sprite, ANIM_SPARKLE_LOOP); sprite->sSmSparkleName_BaseY += 4; sprite->y = sprite->sSmSparkleName_BaseY >> 4; if (++sprite->sSmSparkleName_DestroyTimer > 50) DestroySprite(sprite); } } // Callback for the big sparkles during the "Game Freak" text reveal static void SpriteCB_SparklesBig(struct Sprite *sprite) { if (sprite->animEnded) DestroySprite(sprite); } static void Scene3_CreateNidorinoSprite(struct IntroSequenceData * this) { u8 spriteId = CreateSprite(&sSpriteTemplate_Scene3_Nidorino, 0, 0, 9); this->scene3NidorinoSprite = &gSprites[spriteId]; } #define sX data[0] #define sSpeed data[1] #define sTime data[2] // Not read #define sTargetX data[3] #define sTimer data[4] static void Scene3_StartNidorinoEntrance(struct Sprite *sprite, s16 xStart, s16 x1, u16 time) { sprite->sX = xStart << 4; sprite->sSpeed = ((x1 - xStart) << 4) / time; sprite->sTime = time; sprite->sTargetX = x1; sprite->sTimer = 0; sprite->x = xStart; sprite->y = 100; sprite->callback = Scene3_SpriteCB_NidorinoEnter; } static void Scene3_SpriteCB_NidorinoEnter(struct Sprite *sprite) { if (++sprite->sTimer >= 40) { // Start decelerating after 40 frames if (sprite->sSpeed > 1) sprite->sSpeed--; } sprite->sX += sprite->sSpeed; sprite->x = sprite->sX >> 4; if (sprite->x >= sprite->sTargetX) { // Reached final position sprite->x = sprite->sTargetX; sprite->callback = SpriteCallbackDummy; } } static bool32 Scene3_IsNidorinoEntering(struct IntroSequenceData * ptr) { return ptr->scene3NidorinoSprite->callback == Scene3_SpriteCB_NidorinoEnter ? TRUE : FALSE; } #undef sX #undef sSpeed #undef sTime #undef sTargetX #undef sTimer #define sState data[0] #define sStateTimer data[1] #define sBounceTimer data[2] static void Scene3_StartNidorinoCry(struct IntroSequenceData * ptr) { StartSpriteAnim(ptr->scene3NidorinoSprite, ANIM_NIDORINO_CROUCH); ptr->scene3NidorinoSprite->sState = 0; ptr->scene3NidorinoSprite->sStateTimer = 0; ptr->scene3NidorinoSprite->y2 = 3; ptr->scene3NidorinoSprite->callback = SpriteCB_NidorinoCry; } static void SpriteCB_NidorinoCry(struct Sprite *sprite) { switch (sprite->sState) { case 0: if (++sprite->sStateTimer > 8) { StartSpriteAnim(sprite, ANIM_NIDORINO_CRY); sprite->y2 = 0; sprite->sState++; } break; case 1: PlayCry_ByMode(SPECIES_NIDORINO, 0x3F, CRY_MODE_DOUBLES); sprite->sStateTimer = 0; sprite->sState++; break; case 2: if (++sprite->sBounceTimer > 1) { // Nidorino bounces slightly while crying sprite->sBounceTimer = 0; sprite->y2 = sprite->y2 == 0 ? 1 : 0; } if (++sprite->sStateTimer > 48) { StartSpriteAnim(sprite, ANIM_NIDORINO_NORMAL); sprite->y2 = 0; sprite->callback = SpriteCallbackDummy; } break; } } #undef sState #undef sStateTimer #undef sBounceTimer #define sState data[0] #define sStateTimer data[1] #define sOffsetX data[2] #define sSinIdx data[3] #define sLandTimer data[4] #define sSlowdownTimer data[5] #define sRandSeed data[6] #define sSpeedX data[7] static void Scene3_StartNidorinoRecoil(struct IntroSequenceData * ptr) { sNidorinoRecoilReturnTime = 16; sNidorinoJumpMult = 3; sNidorinoJumpDiv = 5; sNidorinoAnimDelayTime = 0; StartSpriteAnim(ptr->scene3NidorinoSprite, ANIM_NIDORINO_CROUCH); ptr->scene3NidorinoSprite->sState = 0; ptr->scene3NidorinoSprite->sStateTimer = 0; ptr->scene3NidorinoSprite->sOffsetX = 0; ptr->scene3NidorinoSprite->sSinIdx = 0; ptr->scene3NidorinoSprite->sLandTimer = 0; ptr->scene3NidorinoSprite->sSpeedX = 40; ptr->scene3NidorinoSprite->callback = SpriteCB_NidorinoRecoil; } static void SpriteCB_NidorinoRecoil(struct Sprite *sprite) { switch (sprite->sState) { case 0: if (++sprite->sStateTimer > 4) { StartSpriteAnim(sprite, ANIM_NIDORINO_HOP); sprite->sState++; } break; case 1: // Nidorino jumping backwards in the air sprite->sOffsetX += sprite->sSpeedX; sprite->sSinIdx += 8; sprite->x2 = sprite->sOffsetX >> 4; sprite->y2 = -((gSineTable[sprite->sSinIdx] * sNidorinoJumpMult) >> sNidorinoJumpDiv); sprite->sSlowdownTimer++; if (sprite->sSlowdownTimer > sNidorinoAnimDelayTime) { sprite->sSlowdownTimer = 0; sprite->sSpeedX--; } if (++sprite->sLandTimer > 15) { // Nidorino hits the ground StartSpriteAnim(sprite, ANIM_NIDORINO_CROUCH); sprite->sStateTimer = 0; sprite->sRandSeed = 0x4757; sprite->sSpeedX = 28; sprite->sState++; } break; case 2: // Nidorino sliding on the ground sprite->sOffsetX += sprite->sSpeedX; sprite->x2 = sprite->sOffsetX >> 4; if (++sprite->sStateTimer > 6) { // The position of each subsequent dust sprite is "random", but with a fixed // initial seed so that they'll be in the same positions between intro runs CreateNidorinoRecoilDustSprites(sprite->x + sprite->x2, sprite->y + sprite->y2, sprite->sRandSeed); sprite->sRandSeed *= RAND_MULT; } if (sprite->sStateTimer > 12) { StartSpriteAnim(sprite, ANIM_NIDORINO_NORMAL); sprite->sStateTimer = 0; sprite->sState++; } break; case 3: // Nidorino hops back to its original position if (++sprite->sStateTimer > 16) Scene3_StartNidorinoHop(sprite, sNidorinoRecoilReturnTime, -sprite->x2, 4); break; } } #undef sState #undef sStateTimer #undef sOffsetX #undef sSinIdx #undef sLandTimer #undef sSlowdownTimer #undef sRandSeed #undef sSpeedX static bool8 Scene3_NidorinoAnimIsRunning(struct IntroSequenceData * ptr) { return ptr->scene3NidorinoSprite->callback == SpriteCallbackDummy ? FALSE : TRUE; } #define sState data[0] #define sX data[1] #define sY data[2] #define sSpeedX data[3] #define sSpeedY data[4] #define sInvisibleTimer data[7] static void CreateNidorinoRecoilDustSprites(s16 x, s16 y, s16 seed) { int i; u8 spriteId; // Recoil dust sprites are created in pairs at the same initial position but with different speeds. // Only one of each pair will be visible at a time. for (i = 0; i < 2; i++) { spriteId = CreateSprite(&sSpriteTemplate_NidorinoRecoilDust, x - 22, y + 24, 10); if (spriteId != MAX_SPRITES) { gSprites[spriteId].sSpeedX = (seed % 13) + 8; gSprites[spriteId].sSpeedY = seed % 3; gSprites[spriteId].sInvisibleTimer = i; seed *= RAND_MULT; } } } static void SpriteCB_RecoilDust(struct Sprite *sprite) { s16 * data = sprite->data; switch (sprite->sState) { case 0: sX = sprite->x << 4; sY = sprite->y << 4; sprite->sState++; // fallthrough case 1: sX -= sSpeedX; sY += sSpeedY; sprite->x = sX >> 4; sprite->y = sY >> 4; if (sprite->animEnded) DestroySprite(sprite); break; } // Recoil dust flashes in and out if (++sInvisibleTimer > 1) { sInvisibleTimer = 0; sprite->invisible ^= 1; } } #undef sState #undef sX #undef sY #undef sSpeedX #undef sSpeedY #undef sInvisibleTimer #define sState data[0] #define sAirTime data[1] #define sOffsetX data[2] #define sSpeedX data[3] #define sSinIdx data[4] #define sSpeedY data[5] #define sTimer data[6] #define sHeightShift data[7] static void Scene3_StartNidorinoHop(struct Sprite *sprite, u16 time, s16 targetX, u8 heightShift) { sprite->sState = 0; sprite->sAirTime = time; sprite->sOffsetX = sprite->x2 << 4; sprite->sSpeedX = (targetX << 4) / time; sprite->sSinIdx = 0; sprite->sSpeedY = 0x800 / time; sprite->sTimer = 0; sprite->sHeightShift = heightShift; StartSpriteAnim(sprite, ANIM_NIDORINO_CROUCH); sprite->callback = SpriteCB_NidorinoHop; } static void SpriteCB_NidorinoHop(struct Sprite *sprite) { switch (sprite->sState) { case 0: if (++sprite->sTimer > 4) { StartSpriteAnim(sprite, ANIM_NIDORINO_HOP); sprite->sTimer = 0; sprite->sState++; } break; case 1: if (--sprite->sAirTime) { // Nidorino moving through the air sprite->sOffsetX += sprite->sSpeedX; sprite->sSinIdx += sprite->sSpeedY; sprite->x2 = sprite->sOffsetX >> 4; sprite->y2 = -(gSineTable[sprite->sSinIdx >> 4] >> sprite->sHeightShift); } else { // Nidorino lands sprite->x2 = (u16)sprite->sOffsetX >> 4; sprite->y2 = 0; StartSpriteAnim(sprite, ANIM_NIDORINO_CROUCH); if (sprite->sHeightShift == 5) { // This is used by the short hops before Nidorino's attack. // The last state is skipped so that Nidorino will stay in the crouched animation. sprite->callback = SpriteCallbackDummy; } else { sprite->sTimer = 0; sprite->sState++; } } break; case 2: if (++sprite->sTimer > 4) { StartSpriteAnim(sprite, ANIM_NIDORINO_NORMAL); sprite->callback = SpriteCallbackDummy; } break; } } #undef sState #undef sAirTime #undef sOffsetX #undef sSpeedX #undef sSinIdx #undef sSpeedY #undef sTimer #undef sHeightShift #define sState data[0] #define sTimer data[1] #define sShakeTimer data[2] #define sSpeed data[7] static void Scene3_StartNidorinoAttack(struct IntroSequenceData * ptr) { ptr->scene3NidorinoSprite->sState = 0; ptr->scene3NidorinoSprite->sTimer = 0; ptr->scene3NidorinoSprite->sShakeTimer = 0; ptr->scene3NidorinoSprite->data[3] = 0; // Unused ptr->scene3NidorinoSprite->data[4] = 0; // Unused ptr->scene3NidorinoSprite->data[5] = 0; // Unused ptr->scene3NidorinoSprite->x += ptr->scene3NidorinoSprite->x2; ptr->scene3NidorinoSprite->x2 = 0; sNidorinoUnusedVar = 36; sNidorinoAnimDelayTime = 40; sNidorinoJumpMult = 3; sNidorinoJumpDiv = 4; ptr->scene3NidorinoSprite->sSpeed = 36; StartSpriteAnim(ptr->scene3NidorinoSprite, ANIM_NIDORINO_CROUCH); ptr->scene3NidorinoSprite->callback = SpriteCB_NidorinoAttack; } static void SpriteCB_NidorinoAttack(struct Sprite *sprite) { switch (sprite->sState) { case 0: if (++sprite->sTimer & 1) { // Nidorino shakes horizontally before attacking if (++sprite->sShakeTimer & 1) sprite->x2++; else sprite->x2--; } if (sprite->sTimer > 17) { sprite->sTimer = 0; sprite->sState++; } break; case 1: if (++sprite->sTimer >= sNidorinoAnimDelayTime) { StartSpriteAnim(sprite, ANIM_NIDORINO_ATTACK); sprite->sTimer = 0; sprite->sShakeTimer = 0; sprite->sState++; } break; case 2: // Nidorino jumps at Gengar sprite->sTimer += sprite->sSpeed; sprite->x2 = -(sprite->sTimer >> 4); sprite->y2 = -((gSineTable[sprite->sTimer >> 4] * sNidorinoJumpMult) >> sNidorinoJumpDiv); sprite->sShakeTimer++; // Does nothing if (sprite->sSpeed > 12) sprite->sSpeed--; // Decelerate as jump progresses if ((sprite->sTimer >> 4) > 63) sprite->callback = SpriteCallbackDummy; break; } } #undef sState #undef sTimer #undef sShakeTimer #undef sSpeed static void LoadFightSceneSpriteGraphics(void) { int i; for (i = 0; i < ARRAY_COUNT(sFightSceneSpriteSheets); i++) LoadCompressedSpriteSheet(&sFightSceneSpriteSheets[i]); LoadSpritePalettes(sFightSceneSpritePalettes); } ================================================ FILE: src/isagbprn.c ================================================ #include #include #include "config.h" #include "gba/gba.h" #include "malloc.h" #include "mini_printf.h" #define AGB_PRINT_FLUSH_ADDR 0x9FE209D #define AGB_PRINT_STRUCT_ADDR 0x9FE20F8 #define AGB_PRINT_PROTECT_ADDR 0x9FE2FFE #define WSCNT_DATA (WAITCNT_PHI_OUT_16MHZ | WAITCNT_WS0_S_2 | WAITCNT_WS0_N_4) // originally for auto no$gba support, the string "no$gba" should be at this address, // the user needs to read this string out as the memory viewer won't show it. #define NOCASHGBAIDADDR 0x4FFFA00 #define NOCASHGBAPRINTADDR1 0x4FFFA10 // automatically adds a newline after the string has finished #define NOCASHGBAPRINTADDR2 0x4FFFA14 // does not automatically add the newline. by default, NOCASHGBAPRINTADDR2 is used. this is used to keep strings consistent between no$gba and VBA-RR, but a user can choose to forgo this. // hardware extensions for LOG_HANDLER_MGBA_PRINT #define REG_DEBUG_ENABLE ((vu16*) (0x4FFF780)) // handshake: (w)[0xC0DE] -> (r)[0x1DEA] #define REG_DEBUG_FLAGS ((vu16*) (0x4FFF700)) #define REG_DEBUG_STRING ((char*) (0x4FFF600)) struct AGBPrintStruct { u16 m_nRequest; u16 m_nBank; u16 m_nGet; u16 m_nPut; }; typedef void (*LPFN_PRINT_FLUSH)(void); #ifndef NDEBUG // AGBPrint print functions #if (LOG_HANDLER == LOG_HANDLER_AGB_PRINT) void AGBPrintFlush1Block(void); void AGBPrintInit(void) { struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT; u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR; u16 nOldWSCNT = *pWSCNT; *pWSCNT = WSCNT_DATA; *pProtect = 0x20; pPrint->m_nRequest = pPrint->m_nGet = pPrint->m_nPut = 0; pPrint->m_nBank = 0xFD; *pProtect = 0; *pWSCNT = nOldWSCNT; } static void AGBPutcInternal(const char cChr) { volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; u16 *pPrintBuf = (u16 *)(0x8000000 + (pPrint->m_nBank << 16)); u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR; u16 nData = pPrintBuf[pPrint->m_nPut / 2]; *pProtect = 0x20; nData = (pPrint->m_nPut & 1) ? (nData & 0xFF) | (cChr << 8) : (nData & 0xFF00) | cChr; pPrintBuf[pPrint->m_nPut / 2] = nData; pPrint->m_nPut++; *pProtect = 0; } void AGBPutc(const char cChr) { u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT; u16 nOldWSCNT = *pWSCNT; struct AGBPrintStruct *pPrint; *pWSCNT = WSCNT_DATA; AGBPutcInternal(cChr); *pWSCNT = nOldWSCNT; pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; if (pPrint->m_nPut == ((pPrint->m_nGet - 1) & 0xFFFF)) AGBPrintFlush1Block(); } void AGBPrint(const char *pBuf) { struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT; u16 nOldWSCNT = *pWSCNT; *pWSCNT = WSCNT_DATA; while (*pBuf) { AGBPutc(*pBuf); pBuf++; } *pWSCNT = nOldWSCNT; } void AGBPrintf(const char *pBuf, ...) { char bufPrint[0x100]; va_list vArgv; va_start(vArgv, pBuf); #if (PRETTY_PRINT_HANDLER == PRETTY_PRINT_OFF) vsprintf(bufPrint, pBuf, vArgv); #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_MINI_PRINTF) mini_vsnprintf(bufPrint, 0x100, pBuf, vArgv); #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_LIBC) vsnprintf(bufPrint, 0x100, pBuf, vArgv); #else #error "unspecified pretty printing handler." #endif va_end(vArgv); AGBPrint(bufPrint); } static void AGBPrintTransferDataInternal(u32 bAllData) { LPFN_PRINT_FLUSH lpfnFuncFlush; u16 *pIME; u16 nIME; u16 *pWSCNT; u16 nOldWSCNT; u16 *pProtect; volatile struct AGBPrintStruct *pPrint; pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR; pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; lpfnFuncFlush = (LPFN_PRINT_FLUSH)AGB_PRINT_FLUSH_ADDR; pIME = (u16 *)REG_ADDR_IME; nIME = *pIME; pWSCNT = (u16 *)REG_ADDR_WAITCNT; nOldWSCNT = *pWSCNT; *pIME = nIME & ~1; *pWSCNT = WSCNT_DATA; if (bAllData) { while (pPrint->m_nPut != pPrint->m_nGet) { *pProtect = 0x20; lpfnFuncFlush(); *pProtect = 0; } } else if (pPrint->m_nPut != pPrint->m_nGet) { *pProtect = 0x20; lpfnFuncFlush(); *pProtect = 0; } *pWSCNT = nOldWSCNT; *pIME = nIME; } void AGBPrintFlush1Block(void) { AGBPrintTransferDataInternal(FALSE); } void AGBPrintFlush(void) { AGBPrintTransferDataInternal(TRUE); } void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram) { if (nStopProgram) { AGBPrintf("ASSERTION FAILED FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression); AGBPrintFlush(); asm(".hword 0xEFFF"); } else { AGBPrintf("WARING FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression); } } #endif // no$gba print functions #if (LOG_HANDLER == LOG_HANDLER_NOCASH_PRINT) void NoCashGBAPrint(const char *pBuf) { *(volatile u32 *)NOCASHGBAPRINTADDR2 = (u32)pBuf; } void NoCashGBAPrintf(const char *pBuf, ...) { char bufPrint[0x100]; va_list vArgv; va_start(vArgv, pBuf); #if (PRETTY_PRINT_HANDLER == PRETTY_PRINT_OFF) vsprintf(bufPrint, pBuf, vArgv); #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_MINI_PRINTF) mini_vsnprintf(bufPrint, 0x100, pBuf, vArgv); #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_LIBC) vsnprintf(bufPrint, 0x100, pBuf, vArgv); #else #error "unspecified pretty printing handler." #endif va_end(vArgv); NoCashGBAPrint(bufPrint); } void NoCashGBAAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram) { if (nStopProgram) { NoCashGBAPrintf("ASSERTION FAILED FILE=[%s] LINE=[%d] EXP=[%s]", pFile, nLine, pExpression); asm(".hword 0xEFFF"); } else { NoCashGBAPrintf("WARING FILE=[%s] LINE=[%d] EXP=[%s]", pFile, nLine, pExpression); } } #endif // mgba print functions #if (LOG_HANDLER == LOG_HANDLER_MGBA_PRINT) #define MGBA_REG_DEBUG_MAX (256) bool32 MgbaOpen(void) { *REG_DEBUG_ENABLE = 0xC0DE; return *REG_DEBUG_ENABLE == 0x1DEA; } void MgbaClose(void) { *REG_DEBUG_ENABLE = 0; } void MgbaPrintf(s32 level, const char* ptr, ...) { va_list args; level &= 0x7; va_start(args, ptr); #if (PRETTY_PRINT_HANDLER == PRETTY_PRINT_OFF) vsprintf(REG_DEBUG_STRING, ptr, args); #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_MINI_PRINTF) mini_vsnprintf(REG_DEBUG_STRING, MGBA_REG_DEBUG_MAX, ptr, args); #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_LIBC) vsnprintf(REG_DEBUG_STRING, MGBA_REG_DEBUG_MAX, ptr, args); #else #error "unspecified pretty printing handler." #endif va_end(args); *REG_DEBUG_FLAGS = level | 0x100; } void MgbaAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram) { if (nStopProgram) { MgbaPrintf(MGBA_LOG_ERROR, "ASSERTION FAILED FILE=[%s] LINE=[%d] EXP=[%s]", pFile, nLine, pExpression); asm(".hword 0xEFFF"); } else { MgbaPrintf(MGBA_LOG_WARN, "WARING FILE=[%s] LINE=[%d] EXP=[%s]", pFile, nLine, pExpression); } } #endif #endif ================================================ FILE: src/item.c ================================================ #include "global.h" #include "gflib.h" #include "berry.h" #include "event_data.h" #include "event_object_movement.h" #include "item.h" #include "party_menu.h" #include "item_use.h" #include "load_save.h" #include "money.h" #include "quest_log.h" #include "strings.h" #include "constants/hold_effects.h" #include "constants/items.h" #include "constants/maps.h" EWRAM_DATA struct BagPocket gBagPockets[NUM_BAG_POCKETS] = {}; EWRAM_DATA struct ItemSlot gTmHmItemSlots[BAG_TMHM_COUNT] = {0}; EWRAM_DATA struct ItemSlot gKeyItemSlots[BAG_KEYITEMS_COUNT] = {0}; void SortAndCompactBagPocket(struct BagPocket * pocket); static void RemoveTMItemBall(u16 itemId); // Item descriptions and data #include "data/items.h" u16 GetBagItemQuantity(u16 * ptr) { return gSaveBlock2Ptr->encryptionKey ^ *ptr; } void SetBagItemQuantity(u16 * ptr, u16 value) { *ptr = value ^ gSaveBlock2Ptr->encryptionKey; } u16 GetPcItemQuantity(u16 * ptr) { return 0 ^ *ptr; } void SetPcItemQuantity(u16 * ptr, u16 value) { *ptr = value ^ 0; } void ApplyNewEncryptionKeyToBagItems(u32 key) { u32 i, j; for (i = 0; i < NUM_BAG_POCKETS; i++) { for (j = 0; j < gBagPockets[i].capacity; j++) { ApplyNewEncryptionKeyToHword(&gBagPockets[i].itemSlots[j].quantity, key); } } } void ApplyNewEncryptionKeyToBagItems_(u32 key) { ApplyNewEncryptionKeyToBagItems(key); } void DeserializeTmHmItemSlots(void) { int i; for (i = 0; i < BAG_TMHM_COUNT; ++i) { gTmHmItemSlots[i].itemId = 0; SetBagItemQuantity(&(gTmHmItemSlots[i].quantity), 0); } for (i = 0; i < TMHM_COUNT; ++i) { u8 bit = i % 8; if (gSaveBlock1Ptr->bagPocket_TMHM[i / 8] & (1<bagPocket_KeyItems[i] != 0 && gSaveBlock1Ptr->bagPocket_KeyItems[i] <= 30) AddBagItem(gSaveBlock1Ptr->bagPocket_KeyItems[i] + 258, 1); if (gSaveBlock1Ptr->bagPocket_KeyItems[i] != 0 && gSaveBlock1Ptr->bagPocket_KeyItems[i] > 30 && gSaveBlock1Ptr->bagPocket_KeyItems[i] < 59) AddBagItem(gSaveBlock1Ptr->bagPocket_KeyItems[i] + 348 - 30, 1); if (gSaveBlock1Ptr->bagPocket_KeyItems[i] == 59) AddBagItem(ITEM_LINK_BRACELET, 1); } } void SetBagPocketsPointers(void) { gBagPockets[POCKET_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Items; gBagPockets[POCKET_ITEMS - 1].capacity = BAG_ITEMS_COUNT; gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots = &gKeyItemSlots[0]; gBagPockets[POCKET_KEY_ITEMS - 1].capacity = BAG_KEYITEMS_COUNT; gBagPockets[POCKET_POKE_BALLS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls; gBagPockets[POCKET_POKE_BALLS - 1].capacity = BAG_POKEBALLS_COUNT; gBagPockets[POCKET_TM_CASE - 1].itemSlots = &gTmHmItemSlots[0]; gBagPockets[POCKET_TM_CASE - 1].capacity = BAG_TMHM_COUNT; gBagPockets[POCKET_BERRY_POUCH - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Berries; gBagPockets[POCKET_BERRY_POUCH - 1].capacity = BAG_BERRIES_COUNT; gBagPockets[POCKET_MEDICINE - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Medicine; gBagPockets[POCKET_MEDICINE - 1].capacity = BAG_MEDICINE_COUNT; gBagPockets[POCKET_HELD_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_HoldItems; gBagPockets[POCKET_HELD_ITEMS - 1].capacity = BAG_HELD_ITEMS_COUNT; } void CopyItemName(u16 itemId, u8 * dest) { if (itemId == ITEM_ENIGMA_BERRY) { StringCopy(dest, GetBerryInfo(ITEM_TO_BERRY(ITEM_ENIGMA_BERRY))->name); StringAppend(dest, gText_Berry); } else { StringCopy(dest, ItemId_GetName(itemId)); } } s16 BagPocketGetFirstEmptySlot(u8 pocketId) { u32 i; for (i = 0; i < gBagPockets[pocketId].capacity; i++) { if (gBagPockets[pocketId].itemSlots[i].itemId == ITEM_NONE) return i; } return -1; } bool8 IsPocketNotEmpty(u8 pocketId) { u32 i; for (i = 0; i < gBagPockets[pocketId - 1].capacity; i++) { if (gBagPockets[pocketId - 1].itemSlots[i].itemId != ITEM_NONE) return TRUE; } return FALSE; } bool8 CheckBagHasItem(u16 itemId, u16 count) { u32 i; u8 pocket; if (ItemId_GetPocket(itemId) == 0) return FALSE; pocket = ItemId_GetPocket(itemId) - 1; // Check for item slots that contain the item for (i = 0; i < gBagPockets[pocket].capacity; i++) { if (gBagPockets[pocket].itemSlots[i].itemId == itemId) { u16 quantity; // Does this item slot contain enough of the item? quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); if (quantity >= count) return TRUE; // RS and Emerald check whether there is enough of the // item across all stacks. // For whatever reason, FR/LG assume there's only one // stack of the item. else return FALSE; } } return FALSE; } bool8 HasAtLeastOneBerry(void) { u8 itemId; bool8 exists; exists = CheckBagHasItem(ITEM_BERRY_POUCH, 1); if (!exists) { gSpecialVar_Result = FALSE; return FALSE; } for (itemId = FIRST_BERRY_INDEX; itemId <= LAST_BERRY_INDEX; itemId++) { exists = CheckBagHasItem(itemId, 1); if (exists) { gSpecialVar_Result = TRUE; return TRUE; } } gSpecialVar_Result = FALSE; return FALSE; } bool8 CheckBagHasSpace(u16 itemId, u16 count) { u32 i; u8 pocket; if (ItemId_GetPocket(itemId) == 0) return FALSE; pocket = ItemId_GetPocket(itemId) - 1; // Check for item slots that contain the item for (i = 0; i < gBagPockets[pocket].capacity; i++) { if (gBagPockets[pocket].itemSlots[i].itemId == itemId) { u16 quantity; // Does this stack have room for more?? quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); if (quantity + count <= 999) return TRUE; // RS and Emerald check whether there is enough of the // item across all stacks. // For whatever reason, FR/LG assume there's only one // stack of the item. else return FALSE; } } if (BagPocketGetFirstEmptySlot(pocket) != -1) return TRUE; return FALSE; } static void SetTmHmOwned(u16 itemId) { u8* flagByte = &gSaveBlock1Ptr->bagPocket_TMHM[(itemId - ITEM_TM01) / 8]; *flagByte = (*flagByte) | (1 << ((itemId - ITEM_TM01) % 8)); } bool8 AddBagItem(u16 itemId, u16 count) { u32 i; u8 pocket; s16 idx; if (ItemId_GetPocket(itemId) == 0) return FALSE; pocket = ItemId_GetPocket(itemId) - 1; if (pocket == POCKET_TM_CASE - 1) { if (pocket == POCKET_TM_CASE - 1 && !CheckBagHasItem(ITEM_TM_CASE, 1)) { idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1); if (idx == -1) return FALSE; gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_TM_CASE; SetBagItemQuantity(&gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].quantity, 1); } if(!FlagGet(FLAG_DONT_ADD_TMS)) //don't add if Teachy TV SetTmHmOwned(itemId); } for (i = 0; i < gBagPockets[pocket].capacity; i++) { if (gBagPockets[pocket].itemSlots[i].itemId == itemId) { u16 quantity; // Does this stack have room for more?? quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); if (quantity + count <= 999) { quantity += count; SetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity, quantity); return TRUE; } // RS and Emerald check whether there is enough of the // item across all stacks. // For whatever reason, FR/LG assume there's only one // stack of the item. else return FALSE; } } if (pocket == POCKET_BERRY_POUCH - 1 && !CheckBagHasItem(ITEM_BERRY_POUCH, 1)) { idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1); if (idx == -1) return FALSE; gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_BERRY_POUCH; SetBagItemQuantity(&gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].quantity, 1); FlagSet(FLAG_SYS_GOT_BERRY_POUCH); } if (itemId == ITEM_BERRY_POUCH) FlagSet(FLAG_SYS_GOT_BERRY_POUCH); idx = BagPocketGetFirstEmptySlot(pocket); if (idx == -1) return FALSE; gBagPockets[pocket].itemSlots[idx].itemId = itemId; SetBagItemQuantity(&gBagPockets[pocket].itemSlots[idx].quantity, count); RemoveTMItemBall(itemId); return TRUE; } static void RemoveTMItemBall(u16 itemId) { if ((ItemId_GetPocket(itemId) - 1) != POCKET_TM_CASE - 1) //not TM { return; } switch(itemId) { case ITEM_TM01: FlagSet(FLAG_HIDE_SILPH_CO_5F_TM01); RemoveObjectEventByLocalIdAndMap(7, MAP_NUM(SILPH_CO_5F), MAP_GROUP(SILPH_CO_5F)); return; case ITEM_TM02: FlagSet(FLAG_HIDE_VICTORY_ROAD_1F_TM02); RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(VICTORY_ROAD_1F), MAP_GROUP(VICTORY_ROAD_1F)); return; case ITEM_TM05: FlagSet(FLAG_HIDE_ROUTE4_TM05); RemoveObjectEventByLocalIdAndMap(3, MAP_NUM(ROUTE4), MAP_GROUP(ROUTE4)); return; case ITEM_TM07: FlagSet(FLAG_HIDE_VICTORY_ROAD_2F_TM07); RemoveObjectEventByLocalIdAndMap(7, MAP_NUM(VICTORY_ROAD_2F), MAP_GROUP(VICTORY_ROAD_2F)); return; case ITEM_TM08: FlagSet(FLAG_HIDE_SILPH_CO_7F_TM08); RemoveObjectEventByLocalIdAndMap(11, MAP_NUM(SILPH_CO_7F), MAP_GROUP(SILPH_CO_7F)); return; case ITEM_TM09: FlagSet(FLAG_HIDE_MT_MOON_1F_TM09); RemoveObjectEventByLocalIdAndMap(9, MAP_NUM(MT_MOON_1F), MAP_GROUP(MT_MOON_1F)); return; case ITEM_TM11: FlagSet(FLAG_HIDE_SAFARI_ZONE_EAST_TM11); RemoveObjectEventByLocalIdAndMap(3, MAP_NUM(SAFARI_ZONE_EAST), MAP_GROUP(SAFARI_ZONE_EAST)); return; case ITEM_TM12: FlagSet(FLAG_HIDE_ROCKET_HIDEOUT_B2F_TM12); RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(ROCKET_HIDEOUT_B2F), MAP_GROUP(ROCKET_HIDEOUT_B2F)); return; case ITEM_TM14: FlagSet(FLAG_HIDE_POKEMON_MANSION_B1F_TM14); RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(POKEMON_MANSION_B1F), MAP_GROUP(POKEMON_MANSION_B1F)); return; case ITEM_TM17: FlagSet(FLAG_HIDE_POWER_PLANT_TM17); RemoveObjectEventByLocalIdAndMap(2, MAP_NUM(POWER_PLANT), MAP_GROUP(POWER_PLANT)); return; case ITEM_TM18: FlagSet(FLAG_HIDE_ROUTE15_TM18); RemoveObjectEventByLocalIdAndMap(11, MAP_NUM(ROUTE15), MAP_GROUP(ROUTE15)); return; case ITEM_TM21: FlagSet(FLAG_HIDE_ROCKET_HIDEOUT_B3F_TM21); RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(ROCKET_HIDEOUT_B3F), MAP_GROUP(ROCKET_HIDEOUT_B3F)); return; case ITEM_TM22: FlagSet(FLAG_HIDE_POKEMON_MANSION_B1F_TM22); RemoveObjectEventByLocalIdAndMap(1, MAP_NUM(POKEMON_MANSION_B1F), MAP_GROUP(POKEMON_MANSION_B1F)); return; case ITEM_TM25: FlagSet(FLAG_HIDE_POWER_PLANT_TM25); RemoveObjectEventByLocalIdAndMap(3, MAP_NUM(POWER_PLANT), MAP_GROUP(POWER_PLANT)); return; case ITEM_TM31: FlagSet(FLAG_HIDE_SSANNE_1F_ROOM2_TM31); RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(SSANNE_1F_ROOM2), MAP_GROUP(SSANNE_1F_ROOM2)); return; case ITEM_TM32: FlagSet(FLAG_HIDE_SAFARI_ZONE_WEST_TM32); RemoveObjectEventByLocalIdAndMap(2, MAP_NUM(SAFARI_ZONE_WEST), MAP_GROUP(SAFARI_ZONE_WEST)); return; case ITEM_TM36: FlagSet(FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_TM36); RemoveObjectEventByLocalIdAndMap(8, MAP_NUM(FIVE_ISLAND_ROCKET_WAREHOUSE), MAP_GROUP(FIVE_ISLAND_ROCKET_WAREHOUSE)); return; case ITEM_TM37: FlagSet(FLAG_HIDE_VICTORY_ROAD_2F_TM37); RemoveObjectEventByLocalIdAndMap(9, MAP_NUM(VICTORY_ROAD_2F), MAP_GROUP(VICTORY_ROAD_2F)); return; case ITEM_TM40: FlagSet(FLAG_HIDE_ROUTE9_TM40); RemoveObjectEventByLocalIdAndMap(11, MAP_NUM(ROUTE9), MAP_GROUP(ROUTE9)); return; case ITEM_TM41: FlagSet(FLAG_HIDE_SILPH_CO_4F_TM41); RemoveObjectEventByLocalIdAndMap(8, MAP_NUM(SILPH_CO_4F), MAP_GROUP(SILPH_CO_4F)); return; case ITEM_TM43: FlagSet(FLAG_HIDE_ROUTE25_TM43); RemoveObjectEventByLocalIdAndMap(10, MAP_NUM(ROUTE25), MAP_GROUP(ROUTE25)); return; case ITEM_TM44: FlagSet(FLAG_HIDE_SSANNE_B1F_ROOM2_TM44); RemoveObjectEventByLocalIdAndMap(2, MAP_NUM(SSANNE_B1F_ROOM2), MAP_GROUP(SSANNE_B1F_ROOM2)); return; case ITEM_TM45: FlagSet(FLAG_HIDE_ROUTE24_TM45); RemoveObjectEventByLocalIdAndMap(8, MAP_NUM(ROUTE24), MAP_GROUP(ROUTE24)); return; case ITEM_TM46: FlagSet(FLAG_HIDE_MT_MOON_B2F_TM46); RemoveObjectEventByLocalIdAndMap(9, MAP_NUM(MT_MOON_B2F), MAP_GROUP(MT_MOON_B2F)); return; case ITEM_TM47: FlagSet(FLAG_HIDE_SAFARI_ZONE_NORTH_TM47); RemoveObjectEventByLocalIdAndMap(2, MAP_NUM(SAFARI_ZONE_NORTH), MAP_GROUP(SAFARI_ZONE_NORTH)); return; case ITEM_TM48: FlagSet(FLAG_HIDE_ROUTE12_TM48); RemoveObjectEventByLocalIdAndMap(10, MAP_NUM(ROUTE12), MAP_GROUP(ROUTE12)); return; case ITEM_TM49: FlagSet(FLAG_HIDE_ROCKET_HIDEOUT_B4F_TM49); RemoveObjectEventByLocalIdAndMap(7, MAP_NUM(ROCKET_HIDEOUT_B4F), MAP_GROUP(ROCKET_HIDEOUT_B4F)); return; case ITEM_TM50: FlagSet(FLAG_HIDE_VICTORY_ROAD_3F_TM50); RemoveObjectEventByLocalIdAndMap(6, MAP_NUM(VICTORY_ROAD_3F), MAP_GROUP(VICTORY_ROAD_3F)); return; } } bool8 RemoveBagItem(u16 itemId, u16 count) { u32 i; u8 pocket; if (ItemId_GetPocket(itemId) == 0) return FALSE; if (itemId == ITEM_NONE) return FALSE; pocket = ItemId_GetPocket(itemId) - 1; // Check for item slots that contain the item for (i = 0; i < gBagPockets[pocket].capacity; i++) { if (gBagPockets[pocket].itemSlots[i].itemId == itemId) { u16 quantity; // Does this item slot contain enough of the item? quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); if (quantity >= count) { quantity -= count; SetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity, quantity); if (quantity == 0) gBagPockets[pocket].itemSlots[i].itemId = ITEM_NONE; return TRUE; } // RS and Emerald check whether there is enough of the // item across all stacks. // For whatever reason, FR/LG assume there's only one // stack of the item. else return FALSE; } } return FALSE; } u8 GetPocketByItemId(u16 itemId) { return ItemId_GetPocket(itemId); // wow such important } void ClearItemSlots(struct ItemSlot * slots, u8 capacity) { u32 i; for (i = 0; i < capacity; i++) { slots[i].itemId = ITEM_NONE; SetBagItemQuantity(&slots[i].quantity, 0); } } void ClearPCItemSlots(void) { u32 i; for (i = 0; i < PC_ITEMS_COUNT; i++) { gSaveBlock1Ptr->pcItems[i].itemId = ITEM_NONE; SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, 0); } } void ClearBag(void) { u32 i; for (i = 0; i < 7; i++) { ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity); } } s8 PCItemsGetFirstEmptySlot(void) { s32 i; for (i = 0; i < PC_ITEMS_COUNT; i++) { if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE) return i; } return -1; } u8 CountItemsInPC(void) { u8 count = 0; u32 i; for (i = 0; i < PC_ITEMS_COUNT; i++) { if (gSaveBlock1Ptr->pcItems[i].itemId != ITEM_NONE) count++; } return count; } bool8 CheckPCHasItem(u16 itemId, u16 count) { u32 i; u16 quantity; for (i = 0; i < PC_ITEMS_COUNT; i++) { if (gSaveBlock1Ptr->pcItems[i].itemId == itemId) { quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity); if (quantity >= count) return TRUE; } } return FALSE; } bool8 AddPCItem(u16 itemId, u16 count) { u32 i; u16 quantity; s8 idx; for (i = 0; i < PC_ITEMS_COUNT; i++) { if (gSaveBlock1Ptr->pcItems[i].itemId == itemId) { quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity); if (quantity + count <= 999) { quantity += count; SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, quantity); return TRUE; } else return FALSE; } } idx = PCItemsGetFirstEmptySlot(); if (idx == -1) return FALSE; gSaveBlock1Ptr->pcItems[idx].itemId = itemId; SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[idx].quantity, count); return TRUE; } void RemovePCItem(u16 itemId, u16 count) { u32 i; u16 quantity; if (itemId == ITEM_NONE) return; for (i = 0; i < PC_ITEMS_COUNT; i++) { if (gSaveBlock1Ptr->pcItems[i].itemId == itemId) break; } if (i != PC_ITEMS_COUNT) { quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity) - count; SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, quantity); if (quantity == 0) gSaveBlock1Ptr->pcItems[i].itemId = ITEM_NONE; } } void ItemPcCompaction(void) { u16 i, j; struct ItemSlot tmp; for (i = 0; i < PC_ITEMS_COUNT - 1; i++) { for (j = i + 1; j < PC_ITEMS_COUNT; j++) { if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE) { tmp = gSaveBlock1Ptr->pcItems[i]; gSaveBlock1Ptr->pcItems[i] = gSaveBlock1Ptr->pcItems[j]; gSaveBlock1Ptr->pcItems[j] = tmp; } } } } void RegisteredItemHandleBikeSwap(void) { switch (gSaveBlock1Ptr->registeredItem) { case ITEM_MACH_BIKE: gSaveBlock1Ptr->registeredItem = ITEM_ACRO_BIKE; break; case ITEM_ACRO_BIKE: gSaveBlock1Ptr->registeredItem = ITEM_MACH_BIKE; break; } } void SwapItemSlots(struct ItemSlot * a, struct ItemSlot * b) { struct ItemSlot c; c = *a; *a = *b; *b = c; } void BagPocketCompaction(struct ItemSlot * slots, u8 capacity) { u16 i, j; for (i = 0; i < capacity - 1; i++) { for (j = i + 1; j < capacity; j++) { if (GetBagItemQuantity(&slots[i].quantity) == 0) { SwapItemSlots(&slots[i], &slots[j]); } } } } void SortPocketAndPlaceHMsFirst(struct BagPocket * pocket) { u32 i; u16 j = 0; u32 k; struct ItemSlot * buff; SortAndCompactBagPocket(pocket); for (i = 0; i < pocket->capacity; i++) { if (pocket->itemSlots[i].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0) return; if (pocket->itemSlots[i].itemId >= ITEM_HM01 && GetBagItemQuantity(&pocket->itemSlots[i].quantity) != 0) { for (j = i + 1; j < pocket->capacity; j++) { if (pocket->itemSlots[j].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[j].quantity) == 0) break; } break; } } for (k = 0; k < pocket->capacity; k++) pocket->itemSlots[k].quantity = GetBagItemQuantity(&pocket->itemSlots[k].quantity); buff = AllocZeroed(pocket->capacity * sizeof(struct ItemSlot)); CpuCopy16(pocket->itemSlots + i, buff, (j - i) * sizeof(struct ItemSlot)); CpuCopy16(pocket->itemSlots, buff + (j - i), i * sizeof(struct ItemSlot)); CpuCopy16(buff, pocket->itemSlots, pocket->capacity * sizeof(struct ItemSlot)); for (k = 0; k < pocket->capacity; k++) SetBagItemQuantity(&pocket->itemSlots[k].quantity, pocket->itemSlots[k].quantity); Free(buff); } void SortAndCompactBagPocket(struct BagPocket * pocket) { u16 i, j; for (i = 0; i < pocket->capacity; i++) { for (j = i + 1; j < pocket->capacity; j++) { if (GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0 || (GetBagItemQuantity(&pocket->itemSlots[j].quantity) != 0 && pocket->itemSlots[i].itemId > pocket->itemSlots[j].itemId)) SwapItemSlots(&pocket->itemSlots[i], &pocket->itemSlots[j]); } } } u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 slotId) { return gBagPockets[pocketId - 1].itemSlots[slotId].itemId; } u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 slotId) { return GetBagItemQuantity(&gBagPockets[pocketId - 1].itemSlots[slotId].quantity); } u16 BagGetQuantityByItemId(u16 itemId) { u32 i; struct BagPocket * pocket = &gBagPockets[ItemId_GetPocket(itemId) - 1]; for (i = 0; i < pocket->capacity; i++) { if (pocket->itemSlots[i].itemId == itemId) return GetBagItemQuantity(&pocket->itemSlots[i].quantity); } return 0; } void TrySetObtainedItemQuestLogEvent(u16 itemId) { // Only some key items trigger this event if (itemId == ITEM_OAKS_PARCEL || itemId == ITEM_POKE_FLUTE || itemId == ITEM_SECRET_KEY || itemId == ITEM_BIKE_VOUCHER || itemId == ITEM_GOLD_TEETH || itemId == ITEM_OLD_AMBER || itemId == ITEM_CARD_KEY || itemId == ITEM_LIFT_KEY || itemId == ITEM_HELIX_FOSSIL || itemId == ITEM_DOME_FOSSIL || itemId == ITEM_SILPH_SCOPE || itemId == ITEM_BICYCLE || itemId == ITEM_TOWN_MAP || itemId == ITEM_VS_SEEKER || itemId == ITEM_TEACHY_TV || itemId == ITEM_RAINBOW_PASS || itemId == ITEM_TEA || itemId == ITEM_POWDER_JAR || itemId == ITEM_RUBY || itemId == ITEM_SAPPHIRE) { if (itemId != ITEM_TOWN_MAP || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_RIVALS_HOUSE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_RIVALS_HOUSE))) { struct QuestLogEvent_StoryItem * data = malloc(sizeof(*data)); data->itemId = itemId; data->mapSec = gMapHeader.regionMapSectionId; SetQuestLogEvent(QL_EVENT_OBTAINED_STORY_ITEM, (const u16 *)data); free(data); } } } u16 SanitizeItemId(u16 itemId) { if (itemId >= ITEMS_COUNT) return ITEM_NONE; return itemId; } const u8 * ItemId_GetName(u16 itemId) { return gItems[SanitizeItemId(itemId)].name; } // Unused u16 ItemId_GetId(u16 itemId) { return gItems[SanitizeItemId(itemId)].itemId; } u16 ItemId_GetPrice(u16 itemId) { return gItems[SanitizeItemId(itemId)].price; } u8 ItemId_GetHoldEffect(u16 itemId) { return gItems[SanitizeItemId(itemId)].holdEffect; } u8 ItemId_GetHoldEffectParam(u16 itemId) { return gItems[SanitizeItemId(itemId)].holdEffectParam; } const u8 * ItemId_GetDescription(u16 itemId) { return gItems[SanitizeItemId(itemId)].description; } u8 ItemId_GetImportance(u16 itemId) { if(SanitizeItemId(itemId) >= ITEM_TM01 && SanitizeItemId(itemId) <= ITEM_TM50) return TRUE; return gItems[SanitizeItemId(itemId)].importance; } // Unused u8 ItemId_GetRegistrability(u16 itemId) { return gItems[SanitizeItemId(itemId)].registrability; } u8 ItemId_GetPocket(u16 itemId) { return gItems[SanitizeItemId(itemId)].pocket; } u8 ItemId_GetType(u16 itemId) { return gItems[SanitizeItemId(itemId)].type; } ItemUseFunc ItemId_GetFieldFunc(u16 itemId) { return gItems[SanitizeItemId(itemId)].fieldUseFunc; } bool8 ItemId_GetBattleUsage(u16 itemId) { return gItems[SanitizeItemId(itemId)].battleUsage; } ItemUseFunc ItemId_GetBattleFunc(u16 itemId) { return gItems[SanitizeItemId(itemId)].battleUseFunc; } u8 ItemId_GetSecondaryId(u16 itemId) { return gItems[SanitizeItemId(itemId)].secondaryId; } bool8 CheckAssetsForSoftlock(void) { u32 money = GetMoney(&gSaveBlock1Ptr->money); u32 i; u32 pocket; u32 itemWorth; u32 maxU32 = 4294967295U; if(money >= 200) return FALSE; for(pocket = POCKET_ITEMS - 1; pocket < POCKET_BERRY_POUCH; pocket++) { if(pocket == (POCKET_KEY_ITEMS - 1) || pocket == (POCKET_TM_CASE - 1)) //skip KEY_ITEMS and TM_CASE continue; for(i = 0; i < gBagPockets[pocket].capacity && gBagPockets[pocket].itemSlots[i].itemId != ITEM_NONE; i++) { itemWorth = ((ItemId_GetPrice(gBagPockets[pocket].itemSlots[i].itemId) / 2) * GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity)); if(money > 0) { if(itemWorth > (maxU32 - money)) //checking for overflow return FALSE; //overflowed, so have enough money } money = money + itemWorth; if(money >= 200) return FALSE; } } return TRUE; } ================================================ FILE: src/item_menu.c ================================================ #include "global.h" #include "gflib.h" #include "bag.h" #include "battle_controllers.h" #include "berry_pouch.h" #include "decompress.h" #include "event_scripts.h" #include "event_object_movement.h" #include "field_player_avatar.h" #include "graphics.h" #include "help_system.h" #include "item.h" #include "item_menu.h" #include "item_menu_icons.h" #include "item_use.h" #include "link.h" #include "list_menu.h" #include "load_save.h" #include "mail_data.h" #include "map_name_popup.h" #include "menu.h" #include "menu_indicators.h" #include "money.h" #include "new_menu_helpers.h" #include "overworld.h" #include "party_menu.h" #include "pokemon_storage_system.h" #include "scanline_effect.h" #include "script.h" #include "shop.h" #include "strings.h" #include "string_util.h" #include "teachy_tv.h" #include "tm_case.h" #include "constants/items.h" #include "constants/songs.h" #include "constants/quest_log.h" void BagMenu_Print(u8, u8, const u8*, u8, u8, u8, u8, u8, u8); #define FREE_IF_SET(ptr) ({ if (ptr) Free(ptr); }) struct BagMenuAlloc { MainCallback exitCB; u8 itemOriginalLocation; u8 pocketSwitchMode:4; u8 itemMenuIcon:2; u8 inhibitItemDescriptionPrint:2; u16 contextMenuSelectedItem; u8 pocketScrollArrowsTask; u8 pocketSwitchArrowsTask; u8 nItems[5]; u8 maxShowed[5]; u8 data[4]; }; struct BagSlots { struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT]; struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT]; struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT]; struct ItemSlot bagPocket_Medicine[BAG_MEDICINE_COUNT]; struct ItemSlot bagPocket_HoldItems[BAG_HELD_ITEMS_COUNT]; u16 itemsAbove[5]; u16 cursorPos[5]; u16 registeredItem; s16 pocket; }; EWRAM_DATA struct BagStruct gBagMenuState = {}; static EWRAM_DATA struct BagMenuAlloc * sBagMenuDisplay = NULL; static EWRAM_DATA void *sBagBgTilemapBuffer = NULL; static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL; static EWRAM_DATA u8 (*sListMenuItemStrings)[19] = NULL; static EWRAM_DATA u8 sContextMenuItemsBuffer[4] = {}; static EWRAM_DATA const u8 *sContextMenuItemsPtr = NULL; static EWRAM_DATA u8 sContextMenuNumItems = 0; static EWRAM_DATA struct BagSlots * sBackupPlayerBag = NULL; EWRAM_DATA u16 gSpecialVar_ItemId = ITEM_NONE; static void CB2_OpenBagMenu(void); static bool8 LoadBagMenuGraphics(void); static void FadeOutOfBagMenu(void); static void Task_WaitFadeOutOfBagMenu(u8 taskId); static void NullBagMenuBufferPtrs(void); static bool8 BagMenuInitBgsAndAllocTilemapBuffer(void); static bool8 DoLoadBagGraphics(void); static u8 CreateBagInputHandlerTask(u8 location); static bool8 TryAllocListMenuBuffers(void); static void Bag_BuildListMenuTemplate(u8 pocket); static void BagListMenuGetItemNameColored(u8 *dest, u16 itemId); static void BagListMenuMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); static void BagListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y); static void bag_menu_print_cursor(u8 y, u8 colorIdx); static void PrintBagPocketName(void); static void PrintItemDescriptionOnMessageWindow(s32 itemIndex); static void CreatePocketScrollArrowPair(void); static void CreatePocketSwitchArrowPair(void); static void BagDestroyPocketSwitchArrowPair(void); static void CalculateInitialCursorPosAndItemsAbove(void); static void UpdatePocketScrollPositions(void); static void DestroyBagMenuResources(void); static void Task_ItemMenu_WaitFadeAndSwitchToExitCallback(u8 taskId); static void Task_AnimateWin0v(u8 taskId); static void ShowBagOrBeginWin0OpenTask(void); static void All_CalculateNItemsAndMaxShowed(void); static void Task_BagMenu_HandleInput(u8 taskId); static void Task_ItemContextMenuByLocation(u8 taskId); static void Bag_FillMessageBoxWithPalette(u32 a0); static u8 ProcessPocketSwitchInput(u8 taskId, s16 pocketId); static void SwitchPockets(u8 taskId, s16 direction, bool16 a2); static void Task_AnimateSwitchPockets(u8 taskId); static void BeginMovingItemInPocket(u8 taskId, s16 itemIndex); static void Task_MoveItemInPocket_HandleInput(u8 taskId); static void ExecuteMoveItemInPocket(u8 taskId, u32 itemIndex); static void AbortMovingItemInPocket(u8 taskId, u32 itemIndex); static void DrawItemListRow(u8 row); static void Task_ItemContext_FieldOrBattle(u8 taskId); static void Task_FieldItemContextMenuHandleInput(u8 taskId); static void Task_ItemMenuAction_Use(u8 taskId); static void Task_ItemMenuAction_Toss(u8 taskId); static void Task_ConfirmTossItems(u8 taskId); static void Task_TossItem_No(u8 taskId); static void Task_SelectQuantityToToss(u8 taskId); static void Task_TossItem_Yes(u8 taskId); static void Task_WaitAB_RedrawAndReturnToBag(u8 taskId); static void Task_ItemMenuAction_ToggleSelect(u8 taskId); static void Task_ItemMenuAction_Give(u8 taskId); static void Task_PrintThereIsNoPokemon(u8 taskId); static void Task_ItemMenuAction_Cancel(u8 taskId); static void Task_PrintItemCantBeHeld(u8 taskId); static void Task_WaitAButtonAndCloseContextMenu(u8 taskId); static void Task_ItemMenuAction_BattleUse(u8 taskId); static void Task_ItemContext_FieldGive(u8 taskId); static void GoToTMCase_Give(void); static void GoToBerryPouch_Give(void); static void ReturnToBagMenuFromSubmenu_Give(void); static void Task_ItemContext_PcBoxGive(u8 taskId); static void GoToTMCase_PCBox(void); static void GoToBerryPouch_PCBox(void); static void ReturnToBagMenuFromSubmenu_PCBox(void); static void Task_ItemContext_Sell(u8 taskId); static void GoToTMCase_Sell(void); static void GoToBerryPouch_Sell(void); static void ReturnToBagMenuFromSubmenu_Sell(void); static void Task_PrintSaleConfirmationText(u8 taskId); static void Task_ShowSellYesNoMenu(u8 taskId); static void Task_SellItem_No(u8 taskId); static void Task_InitSaleQuantitySelectInterface(u8 taskId); static void UpdateSalePriceDisplay(s32 price); static void Task_SelectQuantityToSell(u8 taskId); static void Task_SellItem_Yes(u8 taskId); static void Task_FinalizeSaleToShop(u8 taskId); static void Task_WaitPressAB_AfterSell(u8 taskId); static void Task_ItemContext_Deposit(u8 taskId); static void Task_SelectQuantityToDeposit(u8 taskId); static void Task_TryDoItemDeposit(u8 taskId); static bool8 BagIsTutorial(void); static void Task_Bag_OldManTutorial(u8 taskId); static void Task_Pokedude_FadeFromBag(u8 taskId); static void Task_Pokedude_WaitFadeAndExitBag(u8 taskId); static void Task_Bag_TeachyTvRegister(u8 taskId); static void Task_Bag_TeachyTvCatching(u8 taskId); static void Task_Bag_TeachyTvStatus(u8 taskId); static void Task_Bag_TeachyTvTMs(u8 taskId); //bag sort static void Task_LoadBagSortOptions(u8 taskId); static void ItemMenu_SortByName(u8 taskId); static void ItemMenu_SortByType(u8 taskId); static void ItemMenu_SortByAmount(u8 taskId); static void ItemMenu_SortByNumber(u8 taskId); static void SortBagItems(u8 taskId); static void Task_SortFinish(u8 taskId); static void SortItemsInBag(u8 pocket, u8 type); static void MergeSort(struct ItemSlot* array, u32 low, u32 high, s8 (*comparator)(struct ItemSlot*, struct ItemSlot*)); static void Merge(struct ItemSlot* array, u32 low, u32 mid, u32 high, s8 (*comparator)(struct ItemSlot*, struct ItemSlot*)); static s8 CompareItemsAlphabetically(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2); static s8 CompareItemsByMost(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2); static s8 CompareItemsByType(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2); static s8 CompareItemsById(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2); static const struct BgTemplate sBgTemplates[2] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 3, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 } }; static const u8 *const sPocketNames[] = { gText_Items2, gText_Medicine, gText_KeyItems2, gText_HeldItems, gText_PokeBalls2 }; #define LIST_TILES_WIDTH 18 #define LIST_TILES_HEIGHT 12 static const u16 sItemListTilemap[LIST_TILES_WIDTH * LIST_TILES_HEIGHT] = INCBIN_U16("graphics/item_menu/list.bin"); static const u8 sMenuText_ByName[] = _("NAME"); static const u8 sMenuText_ByType[] = _("TYPE"); static const u8 sMenuText_ByAmount[] = _("AMOUNT"); static const u8 sMenuText_ByNumber[] = _("NUMBER"); static const u8 sText_NothingToSort[] = _("There's nothing to sort!"); static const struct MenuAction sItemMenuContextActions[] = { [ITEMMENUACTION_USE] = {gOtherText_Use, {.void_u8 = Task_ItemMenuAction_Use}}, [ITEMMENUACTION_TOSS] = {gOtherText_Toss, {.void_u8 = Task_ItemMenuAction_Toss}}, [ITEMMENUACTION_REGISTER] = {gOtherText_Register, {.void_u8 = Task_ItemMenuAction_ToggleSelect}}, [ITEMMENUACTION_GIVE] = {gOtherText_Give, {.void_u8 = Task_ItemMenuAction_Give}}, [ITEMMENUACTION_CANCEL] = {gFameCheckerText_Cancel, {.void_u8 = Task_ItemMenuAction_Cancel}}, [ITEMMENUACTION_BATTLE_USE] = {gOtherText_Use, {.void_u8 = Task_ItemMenuAction_BattleUse}}, [ITEMMENUACTION_CHECK] = {gOtherText_Check, {.void_u8 = Task_ItemMenuAction_Use}}, [ITEMMENUACTION_OPEN] = {gOtherText_Open, {.void_u8 = Task_ItemMenuAction_Use}}, [ITEMMENUACTION_OPEN_BERRIES] = {gOtherText_Open, {.void_u8 = Task_ItemMenuAction_BattleUse}}, [ITEMMENUACTION_WALK] = {gOtherText_Walk, {.void_u8 = Task_ItemMenuAction_Use}}, [ITEMMENUACTION_DESELECT] = {gOtherText_Deselect, {.void_u8 = Task_ItemMenuAction_ToggleSelect}}, [ITEMMENUACTION_BY_NAME] = {sMenuText_ByName, ItemMenu_SortByName}, [ITEMMENUACTION_BY_TYPE] = {sMenuText_ByType, ItemMenu_SortByType}, [ITEMMENUACTION_BY_AMOUNT] = {sMenuText_ByAmount, ItemMenu_SortByAmount}, [ITEMMENUACTION_BY_NUMBER] = {sMenuText_ByNumber, ItemMenu_SortByNumber}, [ITEMMENUACTION_DUMMY] = {gString_Dummy, {.void_u8 = NULL}} }; static const u8 sContextMenuItems_Field[][4] = { { ITEMMENUACTION_USE, ITEMMENUACTION_GIVE, ITEMMENUACTION_TOSS, ITEMMENUACTION_CANCEL }, { ITEMMENUACTION_USE, ITEMMENUACTION_GIVE, ITEMMENUACTION_TOSS, ITEMMENUACTION_CANCEL }, { ITEMMENUACTION_USE, ITEMMENUACTION_REGISTER, ITEMMENUACTION_CANCEL, ITEMMENUACTION_DUMMY }, { ITEMMENUACTION_GIVE, ITEMMENUACTION_TOSS, ITEMMENUACTION_CANCEL, ITEMMENUACTION_DUMMY }, { ITEMMENUACTION_GIVE, ITEMMENUACTION_TOSS, ITEMMENUACTION_CANCEL, ITEMMENUACTION_DUMMY } }; static const u8 sContextMenuItems_CheckGiveTossCancel[] = { ITEMMENUACTION_CHECK, ITEMMENUACTION_GIVE, ITEMMENUACTION_TOSS, ITEMMENUACTION_CANCEL }; static const u8 sContextMenuItems_GiveIfNotKeyItemPocket[][2] = { { ITEMMENUACTION_GIVE, ITEMMENUACTION_CANCEL }, { ITEMMENUACTION_CANCEL, ITEMMENUACTION_DUMMY }, { ITEMMENUACTION_GIVE, ITEMMENUACTION_CANCEL } }; static const u8 sContextMenuItems_Open[] = { ITEMMENUACTION_OPEN, ITEMMENUACTION_CANCEL }; static const u8 sContextMenuItems_BattleUse[] = { ITEMMENUACTION_BATTLE_USE, ITEMMENUACTION_CANCEL }; static const u8 sContextMenuItems_Cancel[] = { ITEMMENUACTION_CANCEL, ITEMMENUACTION_DUMMY }; static const TaskFunc sItemContextTaskFuncs[] = { [ITEMMENULOCATION_FIELD] = Task_ItemContext_FieldOrBattle, [ITEMMENULOCATION_PARTY] = Task_ItemContext_FieldGive, [ITEMMENULOCATION_SHOP] = Task_ItemContext_Sell, [ITEMMENULOCATION_ITEMPC] = Task_ItemContext_Deposit, [ITEMMENULOCATION_PCBOX] = Task_ItemContext_PcBoxGive, [ITEMMENULOCATION_BATTLE] = Task_ItemContext_FieldOrBattle, [ITEMMENULOCATION_OLD_MAN] = NULL }; static const struct YesNoFuncTable sYesNoMenu_Toss = { Task_TossItem_Yes, Task_TossItem_No }; static const struct YesNoFuncTable sYesNoMenu_Sell = { Task_SellItem_Yes, Task_SellItem_No }; static const u8 sListItemTextColor_RegularItem[] = _("{COLOR_HIGHLIGHT_SHADOW DARK_GRAY TRANSPARENT LIGHT_GRAY}"); static const u8 sListItemTextColor_TmCase_BerryPouch[] = _("{COLOR_HIGHLIGHT_SHADOW BLUE TRANSPARENT LIGHT_BLUE}"); static const struct ScrollArrowsTemplate sPocketSwitchArrowPairTemplate = { .firstArrowType = SCROLL_ARROW_LEFT, .firstX = 8, .firstY = 72, .secondArrowType = SCROLL_ARROW_RIGHT, .secondX = 72, .secondY = 72, .fullyUpThreshold = -1, .fullyDownThreshold = -1, .tileTag = 111, .palTag = 111, .palNum = 0, }; static const u8 sBlit_SelectButton[] = INCBIN_U8("graphics/interface/select_button.4bpp"); #define tSwitchDir data[11] #define tSwitchCounter data[12] #define tSwitchState data[13] void GoToBagMenu(u8 location, u8 pocket, MainCallback bagCallback) { u32 i; NullBagMenuBufferPtrs(); sBagMenuDisplay = Alloc(sizeof(struct BagMenuAlloc)); if (sBagMenuDisplay == NULL) SetMainCallback2(bagCallback); else { if (location != ITEMMENULOCATION_LAST) gBagMenuState.location = location; if (bagCallback != NULL) gBagMenuState.bagCallback = bagCallback; sBagMenuDisplay->exitCB = NULL; sBagMenuDisplay->itemOriginalLocation = 0xFF; sBagMenuDisplay->itemMenuIcon = 0; sBagMenuDisplay->inhibitItemDescriptionPrint = FALSE; sBagMenuDisplay->pocketScrollArrowsTask = TASK_NONE; sBagMenuDisplay->pocketSwitchArrowsTask = TASK_NONE; if (location == ITEMMENULOCATION_ITEMPC) sBagMenuDisplay->pocketSwitchMode = 1; else if (location == ITEMMENULOCATION_OLD_MAN) sBagMenuDisplay->pocketSwitchMode = 2; else sBagMenuDisplay->pocketSwitchMode = 0; for (i = 0; i < 4; i++) { sBagMenuDisplay->data[i] = 0; } if (pocket == OPEN_BAG_ITEMS || pocket == OPEN_BAG_KEYITEMS || pocket == OPEN_BAG_POKEBALLS) gBagMenuState.pocket = pocket; gTextFlags.autoScroll = FALSE; gSpecialVar_ItemId = ITEM_NONE; SetMainCallback2(CB2_OpenBagMenu); } } void CB2_BagMenuFromStartMenu(void) { GoToBagMenu(ITEMMENULOCATION_FIELD, OPEN_BAG_LAST, CB2_ReturnToFieldWithOpenMenu); } void CB2_BagMenuFromBattle(void) { GoToBagMenu(ITEMMENULOCATION_BATTLE, OPEN_BAG_LAST, SetCB2ToReshowScreenAfterMenu2); } static void CB2_BagMenuRun(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); DoScheduledBgTilemapCopiesToVram(); UpdatePaletteFade(); } static void VBlankCB_BagMenuRun(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB2_OpenBagMenu(void) { while (1) { if (IsActiveOverworldLinkBusy() == TRUE) break; if (LoadBagMenuGraphics() == TRUE) break; if (MenuHelpers_IsLinkActive() == TRUE) break; } } static bool8 LoadBagMenuGraphics(void) { u8 taskId; switch (gMain.state) { case 0: SetVBlankHBlankCallbacksToNull(); ClearScheduledBgCopiesToVram(); gMain.state++; break; case 1: ScanlineEffect_Stop(); gMain.state++; break; case 2: FreeAllSpritePalettes(); gMain.state++; break; case 3: ResetPaletteFade(); gPaletteFade.bufferTransferDisabled = TRUE; gMain.state++; break; case 4: ResetSpriteData(); gMain.state++; break; case 5: ResetItemMenuIconState(); gMain.state++; break; case 6: if (!MenuHelpers_IsLinkActive()) { ResetTasks(); } gMain.state++; break; case 7: if (BagMenuInitBgsAndAllocTilemapBuffer()) { sBagMenuDisplay->data[0] = 0; gMain.state++; } else { FadeOutOfBagMenu(); return TRUE; } break; case 8: if (DoLoadBagGraphics() == TRUE) gMain.state++; break; case 9: InitBagWindows(); gMain.state++; break; case 10: All_CalculateNItemsAndMaxShowed(); CalculateInitialCursorPosAndItemsAbove(); UpdatePocketScrollPositions(); gMain.state++; break; case 11: if (!TryAllocListMenuBuffers()) { FadeOutOfBagMenu(); return TRUE; } gMain.state++; break; case 12: Bag_BuildListMenuTemplate(gBagMenuState.pocket); gMain.state++; break; case 13: if (gBagMenuState.location != ITEMMENULOCATION_ITEMPC) PrintBagPocketName(); else BagDrawDepositItemTextBox(); gMain.state++; break; case 14: taskId = CreateBagInputHandlerTask(gBagMenuState.location); gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); gTasks[taskId].data[3] = 0; gTasks[taskId].data[8] = 0; gMain.state++; break; case 15: CreateBagSprite(gBagMenuState.pocket); gMain.state++; break; case 16: CreatePocketScrollArrowPair(); CreatePocketSwitchArrowPair(); gMain.state++; break; case 17: CreateSwapLine(); gMain.state++; break; case 18: ShowBagOrBeginWin0OpenTask(); gMain.state++; break; case 19: if (gBagMenuState.location == ITEMMENULOCATION_ITEMPC) SetHelpContext(HELPCONTEXT_PLAYERS_PC_ITEMS); else SetHelpContext(HELPCONTEXT_BAG); gPaletteFade.bufferTransferDisabled = FALSE; gMain.state++; break; default: SetVBlankCallback(VBlankCB_BagMenuRun); SetMainCallback2(CB2_BagMenuRun); return TRUE; } return FALSE; } static void FadeOutOfBagMenu(void) { BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); CreateTask(Task_WaitFadeOutOfBagMenu, 0); SetVBlankCallback(VBlankCB_BagMenuRun); SetMainCallback2(CB2_BagMenuRun); } static void Task_WaitFadeOutOfBagMenu(u8 taskId) { if (!gPaletteFade.active) { SetMainCallback2(gBagMenuState.bagCallback); DestroyBagMenuResources(); DestroyTask(taskId); } } static void NullBagMenuBufferPtrs(void) { sBagMenuDisplay = NULL; sBagBgTilemapBuffer = NULL; sListMenuItems = NULL; sListMenuItemStrings = NULL; } static bool8 BagMenuInitBgsAndAllocTilemapBuffer(void) { void **buff; ResetAllBgsCoordinatesAndBgCntRegs(); buff = &sBagBgTilemapBuffer; *buff = Alloc(0x800); if (*buff == NULL) return FALSE; memset(*buff, 0, 0x800); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetBgTilemapBuffer(1, *buff); ScheduleBgCopyTilemapToVram(1); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); ShowBg(0); ShowBg(1); SetGpuReg(REG_OFFSET_BLDCNT, 0); return TRUE; } static bool8 DoLoadBagGraphics(void) { switch (sBagMenuDisplay->data[0]) { case 0: ResetTempTileDataBuffers(); DecompressAndCopyTileDataToVram(1, gBagBg_Gfx, 0, 0, 0); sBagMenuDisplay->data[0]++; break; case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { if (gBagMenuState.location != ITEMMENULOCATION_ITEMPC) LZDecompressWram(gBagBg_Tilemap, sBagBgTilemapBuffer); else LZDecompressWram(gBagBg_ItemPC_Tilemap, sBagBgTilemapBuffer); sBagMenuDisplay->data[0]++; } break; case 2: LoadCompressedPalette(gBagBgPalette, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP); if (!BagIsTutorial() && gSaveBlock2Ptr->playerGender != MALE) LoadCompressedPalette(gBagBgPalette_FemaleOverride, BG_PLTT_ID(0), PLTT_SIZE_4BPP); sBagMenuDisplay->data[0]++; break; case 3: if (BagIsTutorial() == TRUE || gSaveBlock2Ptr->playerGender == MALE) LoadCompressedSpriteSheet(&gSpriteSheet_BagMale); else LoadCompressedSpriteSheet(&gSpriteSheet_BagFemale); sBagMenuDisplay->data[0]++; break; case 4: LoadCompressedSpritePalette(&gSpritePalette_Bag); sBagMenuDisplay->data[0]++; break; case 5: LoadCompressedSpriteSheet(&gBagSwapSpriteSheet); sBagMenuDisplay->data[0]++; break; default: LoadCompressedSpritePalette(&gBagSwapSpritePalette); sBagMenuDisplay->data[0] = 0; return TRUE; } return FALSE; } static u8 CreateBagInputHandlerTask(u8 location) { switch (location) { case ITEMMENULOCATION_OLD_MAN: return CreateTask(Task_Bag_OldManTutorial, 0); case ITEMMENULOCATION_TTVSCR_REGISTER: return CreateTask(Task_Bag_TeachyTvRegister, 0); case ITEMMENULOCATION_TTVSCR_TMS: return CreateTask(Task_Bag_TeachyTvTMs, 0); case ITEMMENULOCATION_TTVSCR_STATUS: return CreateTask(Task_Bag_TeachyTvStatus, 0); case ITEMMENULOCATION_TTVSCR_CATCHING: return CreateTask(Task_Bag_TeachyTvCatching, 0); default: return CreateTask(Task_BagMenu_HandleInput, 0); } } static bool8 TryAllocListMenuBuffers(void) { // The items pocket has the highest capacity, + 1 for CANCEL sListMenuItems = Alloc((BAG_HELD_ITEMS_COUNT + 1) * sizeof(struct ListMenuItem)); if (sListMenuItems == NULL) return FALSE; sListMenuItemStrings = Alloc((BAG_HELD_ITEMS_COUNT + 1) * sizeof(*sListMenuItemStrings)); if (sListMenuItemStrings == NULL) return FALSE; return TRUE; } static void Bag_BuildListMenuTemplate(u8 pocket) { u32 i; struct BagPocket * bagPocket = &gBagPockets[pocket]; for (i = 0; i < sBagMenuDisplay->nItems[pocket]; i++) { BagListMenuGetItemNameColored(sListMenuItemStrings[i], bagPocket->itemSlots[i].itemId); sListMenuItems[i].label = sListMenuItemStrings[i]; sListMenuItems[i].index = i; } StringCopy(sListMenuItemStrings[i], sListItemTextColor_RegularItem); StringAppend(sListMenuItemStrings[i], gFameCheckerText_Cancel); sListMenuItems[i].label = sListMenuItemStrings[i]; sListMenuItems[i].index = i; gMultiuseListMenuTemplate.items = sListMenuItems; gMultiuseListMenuTemplate.totalItems = sBagMenuDisplay->nItems[pocket] + 1; gMultiuseListMenuTemplate.windowId = 0; gMultiuseListMenuTemplate.header_X = 0; gMultiuseListMenuTemplate.item_X = 9; gMultiuseListMenuTemplate.cursor_X = 1; gMultiuseListMenuTemplate.lettersSpacing = 0; gMultiuseListMenuTemplate.itemVerticalPadding = 2; gMultiuseListMenuTemplate.upText_Y = 2; gMultiuseListMenuTemplate.maxShowed = sBagMenuDisplay->maxShowed[pocket]; gMultiuseListMenuTemplate.fontId = FONT_NORMAL; gMultiuseListMenuTemplate.cursorPal = 2; gMultiuseListMenuTemplate.fillValue = 0; gMultiuseListMenuTemplate.cursorShadowPal = 3; gMultiuseListMenuTemplate.moveCursorFunc = BagListMenuMoveCursorFunc; gMultiuseListMenuTemplate.itemPrintFunc = BagListMenuItemPrintFunc; gMultiuseListMenuTemplate.cursorKind = 0; gMultiuseListMenuTemplate.scrollMultiple = 0; } static void BagListMenuGetItemNameColored(u8 *dest, u16 itemId) { if (itemId == ITEM_TM_CASE || itemId == ITEM_BERRY_POUCH) StringCopy(dest, sListItemTextColor_TmCase_BerryPouch); else StringCopy(dest, sListItemTextColor_RegularItem); StringAppend(dest, ItemId_GetName(itemId)); } static void BagListMenuMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) { if (onInit != TRUE) { PlaySE(SE_BAG_CURSOR); ShakeBagSprite(); } if (sBagMenuDisplay->itemOriginalLocation == 0xFF) { DestroyItemMenuIcon(sBagMenuDisplay->itemMenuIcon ^ 1); if (sBagMenuDisplay->nItems[gBagMenuState.pocket] != itemIndex) CreateItemMenuIcon(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, itemIndex), sBagMenuDisplay->itemMenuIcon); else CreateItemMenuIcon(ITEMS_COUNT, sBagMenuDisplay->itemMenuIcon); sBagMenuDisplay->itemMenuIcon ^= 1; if (!sBagMenuDisplay->inhibitItemDescriptionPrint) PrintItemDescriptionOnMessageWindow(itemIndex); } } static void BagListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y) { u16 bagItemId; u16 bagItemQuantity; if (sBagMenuDisplay->itemOriginalLocation != 0xFF) { if (sBagMenuDisplay->itemOriginalLocation == (u8)itemId) bag_menu_print_cursor(y, 2); else bag_menu_print_cursor(y, 0xFF); } if (itemId != -2 && sBagMenuDisplay->nItems[gBagMenuState.pocket] != itemId) { bagItemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, itemId); bagItemQuantity = BagGetQuantityByPocketPosition(gBagMenuState.pocket + 1, itemId); if (gBagMenuState.pocket != POCKET_KEY_ITEMS - 1 && ItemId_GetImportance(bagItemId) == 0) { ConvertIntToDecimalStringN(gStringVar1, bagItemQuantity, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); BagPrintTextOnWindow(windowId, FONT_SMALL, gStringVar4, 0x6e, y, 0, 0, 0xFF, 1); } else if (gSaveBlock1Ptr->registeredItem != ITEM_NONE && gSaveBlock1Ptr->registeredItem == bagItemId) { BlitBitmapToWindow(windowId, sBlit_SelectButton, 0x70, y, 0x18, 0x10); } } } static void bag_menu_print_cursor_(u8 taskId, u8 colorIdx) { bag_menu_print_cursor(ListMenuGetYCoordForPrintingArrowCursor(taskId), colorIdx); } static void bag_menu_print_cursor(u8 y, u8 colorIdx) { if (colorIdx == 0xFF) { FillWindowPixelRect(0, PIXEL_FILL(0), 1, y, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), GetMenuCursorDimensionByFont(FONT_NORMAL, 1)); } else { BagPrintTextOnWindow(0, FONT_NORMAL, gText_SelectorArrow2, 1, y, 0, 0, 0, colorIdx); } } static void PrintBagPocketName(void) { FillWindowPixelBuffer(2, PIXEL_FILL(0)); BagPrintTextOnWin1CenteredColor0(sPocketNames[gBagMenuState.pocket], gBagMenuState.pocket); } static void PrintItemDescriptionOnMessageWindow(s32 itemIndex) { const u8 *description; if (itemIndex != sBagMenuDisplay->nItems[gBagMenuState.pocket]) description = ItemId_GetDescription(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, itemIndex)); else description = gText_CloseBag; StringExpandPlaceholders(gStringVar4, description); FillWindowPixelBuffer(1, PIXEL_FILL(0)); BagPrintTextOnWindow(1, FONT_NORMAL, description, 0, 3, 2, 0, 0, 0); } static void CreatePocketScrollArrowPair(void) { sBagMenuDisplay->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized( SCROLL_ARROW_UP, 160, 8, 104, sBagMenuDisplay->nItems[gBagMenuState.pocket] - sBagMenuDisplay->maxShowed[gBagMenuState.pocket] + 1, 110, 110, &gBagMenuState.cursorPos[gBagMenuState.pocket] ); } static void CreatePocketSwitchArrowPair(void) { u16 pocketForLeftRightArrows = POCKET_KEY_ITEMS; // makes left/right scroll arrows always on. if (sBagMenuDisplay->pocketSwitchMode != 1) { sBagMenuDisplay->pocketSwitchArrowsTask = AddScrollIndicatorArrowPair(&sPocketSwitchArrowPairTemplate, &pocketForLeftRightArrows); } } static void CreatePocketScrollArrowPair_SellQuantity(void) { sBagMenuDisplay->contextMenuSelectedItem = 1; sBagMenuDisplay->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized( SCROLL_ARROW_UP, 152, 72, 104, 2, 110, 110, &sBagMenuDisplay->contextMenuSelectedItem ); } static void CreateArrowPair_QuantitySelect(void) { sBagMenuDisplay->contextMenuSelectedItem = 1; sBagMenuDisplay->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized( SCROLL_ARROW_UP, 212, 120, 152, 2, 110, 110, &sBagMenuDisplay->contextMenuSelectedItem ); } static void BagDestroyPocketScrollArrowPair(void) { if (sBagMenuDisplay->pocketScrollArrowsTask != 0xFF) { RemoveScrollIndicatorArrowPair(sBagMenuDisplay->pocketScrollArrowsTask); sBagMenuDisplay->pocketScrollArrowsTask = 0xFF; } BagDestroyPocketSwitchArrowPair(); } static void BagDestroyPocketSwitchArrowPair(void) { if (sBagMenuDisplay->pocketSwitchArrowsTask != 0xFF) { RemoveScrollIndicatorArrowPair(sBagMenuDisplay->pocketSwitchArrowsTask); sBagMenuDisplay->pocketSwitchArrowsTask = 0xFF; } } void ResetBagCursorPositions(void) { u32 i; gBagMenuState.pocket = POCKET_ITEMS - 1; gBagMenuState.bagOpen = FALSE; for (i = 0; i < 5; i++) { gBagMenuState.itemsAbove[i] = 0; gBagMenuState.cursorPos[i] = 0; } } void PocketCalculateInitialCursorPosAndItemsAbove(u8 pocketId) { if (gBagMenuState.cursorPos[pocketId] != 0 && gBagMenuState.cursorPos[pocketId] + sBagMenuDisplay->maxShowed[pocketId] > sBagMenuDisplay->nItems[pocketId] + 1) { gBagMenuState.cursorPos[pocketId] = (sBagMenuDisplay->nItems[pocketId] + 1) - sBagMenuDisplay->maxShowed[pocketId]; } if (gBagMenuState.cursorPos[pocketId] + gBagMenuState.itemsAbove[pocketId] >= sBagMenuDisplay->nItems[pocketId] + 1) { if (sBagMenuDisplay->nItems[pocketId] + 1 < 2) gBagMenuState.itemsAbove[pocketId] = 0; else gBagMenuState.itemsAbove[pocketId] = sBagMenuDisplay->nItems[pocketId]; } } static void CalculateInitialCursorPosAndItemsAbove(void) { u32 i; for (i = 0; i < 5; i++) { PocketCalculateInitialCursorPosAndItemsAbove(i); } } static void UpdatePocketScrollPositions(void) { u32 i; u32 j; for (i = 0; i < 5; i++) { if (gBagMenuState.itemsAbove[i] > 3) { for (j = 0; j <= gBagMenuState.itemsAbove[i] - 3; gBagMenuState.itemsAbove[i]--, gBagMenuState.cursorPos[i]++, j++) { if (gBagMenuState.cursorPos[i] + sBagMenuDisplay->maxShowed[i] == sBagMenuDisplay->nItems[i] + 1) break; } } } } static void DestroyBagMenuResources(void) { FREE_IF_SET(sBagMenuDisplay); FREE_IF_SET(sBagBgTilemapBuffer); FREE_IF_SET(sListMenuItems); FREE_IF_SET(sListMenuItemStrings); FreeAllWindowBuffers(); } void ItemMenu_StartFadeToExitCallback(u8 taskId) { BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ItemMenu_WaitFadeAndSwitchToExitCallback; } static void Task_ItemMenu_WaitFadeAndSwitchToExitCallback(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active && FuncIsActiveTask(Task_AnimateWin0v) != TRUE) { DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); if (sBagMenuDisplay->exitCB != NULL) SetMainCallback2(sBagMenuDisplay->exitCB); else SetMainCallback2(gBagMenuState.bagCallback); BagDestroyPocketScrollArrowPair(); DestroyBagMenuResources(); DestroyTask(taskId); } } static void ShowBagOrBeginWin0OpenTask(void) { u16 paldata = RGB_BLACK; u8 taskId; SetBackdropFromPalette(&paldata); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); if (gBagMenuState.bagOpen == TRUE) { SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 0)); } else { SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, DISPLAY_HEIGHT)); taskId = CreateTask(Task_AnimateWin0v, 0); gTasks[taskId].data[0] = 192; gTasks[taskId].data[1] = -16; gBagMenuState.bagOpen = TRUE; } } void Bag_BeginCloseWin0Animation(void) { u8 taskId = CreateTask(Task_AnimateWin0v, 0); gTasks[taskId].data[0] = -16; gTasks[taskId].data[1] = 16; gBagMenuState.bagOpen = FALSE; } void CB2_SetUpReshowBattleScreenAfterMenu(void) { gBagMenuState.bagOpen = FALSE; } static void Task_AnimateWin0v(u8 taskId) { s16 *data = gTasks[taskId].data; data[0] += data[1]; if (data[0] > 160) SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 160)); else SetGpuReg(REG_OFFSET_WIN0V, data[0]); if ((data[1] == 16 && data[0] == 160) || (data[1] == -16 && data[0] == 0)) DestroyTask(taskId); } void MoveItemSlotInList(struct ItemSlot * itemSlots_, u32 from, u32 to_) { // dumb assignments needed to match struct ItemSlot *itemSlots = itemSlots_; u32 to = to_; if (from != to) { s16 i, count; struct ItemSlot firstSlot = itemSlots[from]; if (to > from) { to--; for (i = from, count = to; i < count; i++) itemSlots[i] = itemSlots[i + 1]; } else { for (i = from, count = to; i > count; i--) itemSlots[i] = itemSlots[i - 1]; } itemSlots[to] = firstSlot; } } void Pocket_CalculateNItemsAndMaxShowed(u8 pocketId) { u32 i; struct BagPocket * pocket = &gBagPockets[pocketId]; BagPocketCompaction(pocket->itemSlots, pocket->capacity); sBagMenuDisplay->nItems[pocketId] = 0; for (i = 0; i < pocket->capacity; i++) { if (pocket->itemSlots[i].itemId == ITEM_NONE) break; sBagMenuDisplay->nItems[pocketId]++; } if (sBagMenuDisplay->nItems[pocketId] + 1 > 6) sBagMenuDisplay->maxShowed[pocketId] = 6; else sBagMenuDisplay->maxShowed[pocketId] = sBagMenuDisplay->nItems[pocketId] + 1; } static void All_CalculateNItemsAndMaxShowed(void) { u32 i; for (i = 0; i < 5; i++) Pocket_CalculateNItemsAndMaxShowed(i); } void DisplayItemMessageInBag(u8 taskId, u8 fontId, const u8 * string, TaskFunc followUpFunc) { s16 *data = gTasks[taskId].data; data[10] = OpenBagWindow(5); FillWindowPixelBuffer(data[10], PIXEL_FILL(1)); DisplayMessageAndContinueTask(taskId, data[10], 0x06D, 0x0D, fontId, GetTextSpeedSetting(), string, followUpFunc); ScheduleBgCopyTilemapToVram(0); } void ItemMenu_SetExitCallback(MainCallback cb) { sBagMenuDisplay->exitCB = cb; } static u8 GetSelectedItemIndex(u8 pocket) { return gBagMenuState.cursorPos[pocket] + gBagMenuState.itemsAbove[pocket]; } static void Task_BagMenu_HandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; u16 cursorPos; u16 itemsAbove; s32 input; if (gPaletteFade.active) return; if (FuncIsActiveTask(Task_AnimateWin0v) == TRUE) return; if (IsActiveOverworldLinkBusy() == TRUE) return; switch (ProcessPocketSwitchInput(taskId, gBagMenuState.pocket)) { case 1: SwitchPockets(taskId, -1, FALSE); return; case 2: SwitchPockets(taskId, 1, FALSE); return; case 3: //to poke balls from items SwitchPockets(taskId, 4, FALSE); return; case 4: //to items from poke balls SwitchPockets(taskId, -4, FALSE); return; default: if (JOY_NEW(SELECT_BUTTON) && gBagMenuState.location == ITEMMENULOCATION_FIELD) { ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove); if (cursorPos + itemsAbove != sBagMenuDisplay->nItems[gBagMenuState.pocket]) { PlaySE(SE_SELECT); BagDestroyPocketScrollArrowPair(); CreatePocketScrollArrowPair(); BeginMovingItemInPocket(taskId, cursorPos + itemsAbove); return; } } else if (JOY_NEW(START_BUTTON)) { if ((sBagMenuDisplay->nItems[gBagMenuState.pocket]) <= 1) { PlaySE(SE_FAILURE); BagDestroyPocketScrollArrowPair(); DisplayItemMessageInBag(taskId, 2, sText_NothingToSort, Task_WaitAButtonAndCloseContextMenu); break; } data[1] = ListMenu_ProcessInput(data[0]); data[2] = BagGetQuantityByPocketPosition(gBagMenuState.pocket + 1, data[1]); if (cursorPos + itemsAbove != sBagMenuDisplay->nItems[gBagMenuState.pocket]) gSpecialVar_ItemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]); else break; PlaySE(SE_SELECT); BagDestroyPocketScrollArrowPair(); bag_menu_print_cursor_(data[0], 2); ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove); gTasks[taskId].func = Task_LoadBagSortOptions; } break; } input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); switch (input) { case LIST_NOTHING_CHOSEN: return; case LIST_CANCEL: PlaySE(SE_SELECT); gSpecialVar_ItemId = ITEM_NONE; Bag_BeginCloseWin0Animation(); gTasks[taskId].func = ItemMenu_StartFadeToExitCallback; break; default: PlaySE(SE_SELECT); if (input == sBagMenuDisplay->nItems[gBagMenuState.pocket]) { gSpecialVar_ItemId = ITEM_NONE; Bag_BeginCloseWin0Animation(); gTasks[taskId].func = ItemMenu_StartFadeToExitCallback; } else { BagDestroyPocketScrollArrowPair(); bag_menu_print_cursor_(data[0], 2); data[1] = input; data[2] = BagGetQuantityByPocketPosition(gBagMenuState.pocket + 1, input); gSpecialVar_ItemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, input); gTasks[taskId].func = Task_ItemContextMenuByLocation; } break; } } static void Task_ItemContextMenuByLocation(u8 taskId) { Bag_FillMessageBoxWithPalette(1); sItemContextTaskFuncs[gBagMenuState.location](taskId); } static void Task_RedrawArrowsAndReturnToBagMenuSelect(u8 taskId) { Bag_FillMessageBoxWithPalette(0); CreatePocketScrollArrowPair(); CreatePocketSwitchArrowPair(); gTasks[taskId].func = Task_BagMenu_HandleInput; } static void Bag_FillMessageBoxWithPalette(u32 a0) { SetBgTilemapPalette(1, 0, 14, 30, 6, a0 + 1); ScheduleBgCopyTilemapToVram(1); } static u8 ProcessPocketSwitchInput(u8 taskId, s16 pocketId) { u8 lrState; if (sBagMenuDisplay->pocketSwitchMode != 0) return 0; lrState = GetLRKeysPressed(); if(pocketId == -4) pocketId = POCKET_ITEMS - 1; if(pocketId == 8) pocketId = POCKET_POKE_BALLS - 1; if (JOY_NEW(DPAD_LEFT) || lrState == MENU_L_PRESSED) { PlaySE(SE_BAG_POCKET); if (pocketId == POCKET_ITEMS - 1) return 3; return 1; } if (JOY_NEW(DPAD_RIGHT) || lrState == MENU_R_PRESSED) { PlaySE(SE_BAG_POCKET); if (pocketId == POCKET_POKE_BALLS - 1) return 4; return 2; } return 0; } static void SwitchPockets(u8 taskId, s16 direction, bool16 a2) { s16 *data = gTasks[taskId].data; tSwitchState = 0; tSwitchCounter = 0; tSwitchDir = direction; if (!a2) { ClearWindowTilemap(0); ClearWindowTilemap(1); ClearWindowTilemap(2); DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); ScheduleBgCopyTilemapToVram(0); DestroyItemMenuIcon(sBagMenuDisplay->itemMenuIcon ^ 1); BagDestroyPocketScrollArrowPair(); } FillBgTilemapBufferRect_Palette0(1, 0x02D, 11, 1, 18, 12); ScheduleBgCopyTilemapToVram(1); if(direction == 4) SetBagVisualPocketId(POCKET_POKE_BALLS - 1); else if(direction == -4) SetBagVisualPocketId(POCKET_ITEMS - 1); else SetBagVisualPocketId(gBagMenuState.pocket + direction); SetTaskFuncWithFollowupFunc(taskId, Task_AnimateSwitchPockets, gTasks[taskId].func); } static void Task_AnimateSwitchPockets(u8 taskId) { s16 *data = gTasks[taskId].data; if (!MenuHelpers_IsLinkActive() && !BagIsTutorial()) { switch (ProcessPocketSwitchInput(taskId, gBagMenuState.pocket + tSwitchDir)) { case 1: if(tSwitchDir == 4 && (gBagMenuState.pocket != POCKET_ITEMS - 1)) tSwitchDir = -1; gBagMenuState.pocket += tSwitchDir; SwitchTaskToFollowupFunc(taskId); SwitchPockets(taskId, -1, TRUE); return; case 2: if(tSwitchDir == -4 && (gBagMenuState.pocket != POCKET_POKE_BALLS - 1)) tSwitchDir = 1; gBagMenuState.pocket += tSwitchDir; SwitchTaskToFollowupFunc(taskId); SwitchPockets(taskId, 1, TRUE); return; case 3: //to poke balls from items gBagMenuState.pocket = POCKET_POKE_BALLS - 1; SwitchTaskToFollowupFunc(taskId); SwitchPockets(taskId, 4, TRUE); return; case 4: //to items from poke balls gBagMenuState.pocket = POCKET_ITEMS - 1; SwitchTaskToFollowupFunc(taskId); SwitchPockets(taskId, -4, TRUE); return; } } switch (tSwitchState) { case 0: // Animate the item list being revealed from the bottom row up if (tSwitchCounter != SHRT_MAX) { tSwitchCounter++; DrawItemListRow(tSwitchCounter); if (tSwitchCounter == LIST_TILES_HEIGHT) tSwitchCounter = SHRT_MAX; } if (tSwitchCounter == SHRT_MAX) tSwitchState++; break; case 1: if(gBagMenuState.pocket == (POCKET_ITEMS - 1) && tSwitchDir == -4) gBagMenuState.pocket == POCKET_POKE_BALLS - 1; else if(gBagMenuState.pocket == POCKET_POKE_BALLS - 1 && tSwitchDir == 4) gBagMenuState.pocket == (POCKET_ITEMS - 1); else gBagMenuState.pocket += tSwitchDir; PrintBagPocketName(); Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); PutWindowTilemap(1); PutWindowTilemap(2); ScheduleBgCopyTilemapToVram(0); CreatePocketScrollArrowPair(); CreatePocketSwitchArrowPair(); SwitchTaskToFollowupFunc(taskId); break; } } static void BeginMovingItemInPocket(u8 taskId, s16 itemIndex) { u16 itemsAbove; u16 cursorPos; s16 *data = gTasks[taskId].data; ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove); ListMenuSetTemplateField(data[0], LISTFIELD_CURSORKIND, 1); data[1] = itemIndex; sBagMenuDisplay->itemOriginalLocation = itemIndex; StringCopy(gStringVar1, ItemId_GetName(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]))); StringExpandPlaceholders(gStringVar4, gOtherText_WhereShouldTheStrVar1BePlaced); FillWindowPixelBuffer(1, PIXEL_FILL(0)); BagPrintTextOnWindow(1, FONT_NORMAL, gStringVar4, 0, 3, 2, 0, 0, 0); UpdateSwapLinePos(0, ListMenuGetYCoordForPrintingArrowCursor(data[0])); SetSwapLineInvisibility(FALSE); BagDestroyPocketSwitchArrowPair(); bag_menu_print_cursor_(data[0], 2); gTasks[taskId].func = Task_MoveItemInPocket_HandleInput; } static void Task_MoveItemInPocket_HandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; s32 input; u16 itemsAbove; u16 cursorPos; if (IsActiveOverworldLinkBusy() == TRUE) return; input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); UpdateSwapLinePos(0, ListMenuGetYCoordForPrintingArrowCursor(data[0])); if (JOY_NEW(SELECT_BUTTON)) { PlaySE(SE_SELECT); sBagMenuDisplay->itemOriginalLocation = 0xFF; ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove); ExecuteMoveItemInPocket(taskId, cursorPos + itemsAbove); return; } switch (input) { case LIST_NOTHING_CHOSEN: return; case LIST_CANCEL: PlaySE(SE_SELECT); sBagMenuDisplay->itemOriginalLocation = 0xFF; ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove); AbortMovingItemInPocket(taskId, cursorPos + itemsAbove); break; default: PlaySE(SE_SELECT); sBagMenuDisplay->itemOriginalLocation = 0xFF; ExecuteMoveItemInPocket(taskId, input); break; } } static void ExecuteMoveItemInPocket(u8 taskId, u32 itemIndex) { s16 *data = gTasks[taskId].data; if (data[1] == itemIndex || data[1] == itemIndex - 1) { AbortMovingItemInPocket(taskId, itemIndex); } else { MoveItemSlotInList(gBagPockets[gBagMenuState.pocket].itemSlots, data[1], itemIndex); DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); if (data[1] < itemIndex) gBagMenuState.itemsAbove[gBagMenuState.pocket]--; Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); SetSwapLineInvisibility(TRUE); CreatePocketSwitchArrowPair(); gTasks[taskId].func = Task_BagMenu_HandleInput; } } static void AbortMovingItemInPocket(u8 taskId, u32 itemIndex) { s16 *data = gTasks[taskId].data; DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); if (data[1] < itemIndex) gBagMenuState.itemsAbove[gBagMenuState.pocket]--; Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); SetSwapLineInvisibility(TRUE); CreatePocketSwitchArrowPair(); gTasks[taskId].func = Task_BagMenu_HandleInput; } static void InitQuantityToTossOrDeposit(u16 cursorPos, const u8 *str) { u8 r4; u8 r5 = ShowBagWindow(6, 2); CopyItemName(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, cursorPos), gStringVar1); StringExpandPlaceholders(gStringVar4, str); BagPrintTextOnWindow(r5, FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1); r4 = ShowBagWindow(0, 0); ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 3); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); BagPrintTextOnWindow(r4, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, 1); CreateArrowPair_QuantitySelect(); } static void UpdateQuantityToTossOrDeposit(s16 value, u8 ndigits) { u8 r6 = GetBagWindow(0); FillWindowPixelBuffer(r6, PIXEL_FILL(1)); ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, ndigits); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); BagPrintTextOnWindow(r6, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, 1); } // row of 0 is the bottom row in the list, up to LIST_TILES_HEIGHT at the top static void DrawItemListRow(u8 row) { CopyToBgTilemapBufferRect(1, &sItemListTilemap[(LIST_TILES_HEIGHT - row) * LIST_TILES_WIDTH], 11, 1 + LIST_TILES_HEIGHT - row, LIST_TILES_WIDTH, 1); ScheduleBgCopyTilemapToVram(1); } static bool8 IsUnregisterableKeyItem(u16 item) { switch(item) { case ITEM_MACH_BIKE ... ITEM_SUPER_ROD: case ITEM_WAILMER_PAIL: case ITEM_SOOT_SACK: case ITEM_ACRO_BIKE: case ITEM_POKEBLOCK_CASE: case ITEM_POKE_FLUTE: case ITEM_BICYCLE ... ITEM_TEACHY_TV: case ITEM_POWDER_JAR: return FALSE; } return TRUE; } static void OpenContextMenu(u8 taskId) { u8 r6; u8 r4; switch (gBagMenuState.location) { case ITEMMENULOCATION_BATTLE: case ITEMMENULOCATION_TTVSCR_STATUS: if (gSpecialVar_ItemId == ITEM_BERRY_POUCH) { sContextMenuItemsBuffer[0] = ITEMMENUACTION_OPEN_BERRIES; sContextMenuItemsBuffer[1] = ITEMMENUACTION_CANCEL; sContextMenuItemsPtr = sContextMenuItemsBuffer; sContextMenuNumItems = 2; } else if (ItemId_GetBattleUsage(gSpecialVar_ItemId)) { sContextMenuItemsPtr = sContextMenuItems_BattleUse; sContextMenuNumItems = 2; } else { sContextMenuItemsPtr = sContextMenuItems_Cancel; sContextMenuNumItems = 1; } break; case ITEMMENULOCATION_OLD_MAN: case ITEMMENULOCATION_TTVSCR_CATCHING: sContextMenuItemsPtr = sContextMenuItems_BattleUse; sContextMenuNumItems = 2; break; default: if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE) { if (gSpecialVar_ItemId == ITEM_TM_CASE || gSpecialVar_ItemId == ITEM_BERRY_POUCH) { sContextMenuItemsPtr = sContextMenuItems_Open; sContextMenuNumItems = 2; } else { if (gBagMenuState.pocket == POCKET_KEY_ITEMS - 1) sContextMenuNumItems = 1; else sContextMenuNumItems = 2; sContextMenuItemsPtr = sContextMenuItems_GiveIfNotKeyItemPocket[gBagMenuState.pocket]; } } else { switch (gBagMenuState.pocket) { case 0: //pockets in order of Items, Medicine, Key Items, Held Items, Poke Balls case 1: sContextMenuNumItems = 4; if (ItemIsMail(gSpecialVar_ItemId) == TRUE) sContextMenuItemsPtr = sContextMenuItems_CheckGiveTossCancel; else sContextMenuItemsPtr = sContextMenuItems_Field[gBagMenuState.pocket]; break; case 2: sContextMenuItemsPtr = sContextMenuItemsBuffer; sContextMenuNumItems = 3; sContextMenuItemsBuffer[2] = ITEMMENUACTION_CANCEL; if (gSaveBlock1Ptr->registeredItem == gSpecialVar_ItemId) sContextMenuItemsBuffer[1] = ITEMMENUACTION_DESELECT; else sContextMenuItemsBuffer[1] = ITEMMENUACTION_REGISTER; if (gSpecialVar_ItemId == ITEM_TM_CASE || gSpecialVar_ItemId == ITEM_BERRY_POUCH) sContextMenuItemsBuffer[0] = ITEMMENUACTION_OPEN; else if(IsUnregisterableKeyItem(gSpecialVar_ItemId)) { sContextMenuNumItems = 2; sContextMenuItemsBuffer[0] = ITEMMENUACTION_USE; sContextMenuItemsBuffer[1] = ITEMMENUACTION_CANCEL; } else if (gSpecialVar_ItemId == ITEM_BICYCLE && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE)) sContextMenuItemsBuffer[0] = ITEMMENUACTION_WALK; else sContextMenuItemsBuffer[0] = ITEMMENUACTION_USE; break; case 3: case 4: sContextMenuItemsPtr = sContextMenuItems_Field[gBagMenuState.pocket]; sContextMenuNumItems = 3; break; } } } r6 = ShowBagWindow(10, sContextMenuNumItems - 1); AddItemMenuActionTextPrinters( r6, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING), GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumItems, sItemMenuContextActions, sContextMenuItemsPtr ); Menu_InitCursor(r6, FONT_NORMAL, 0, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumItems, 0); r4 = ShowBagWindow(6, 0); CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected); BagPrintTextOnWindow(r4, FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1); } static void Task_ItemContext_FieldOrBattle(u8 taskId) { OpenContextMenu(taskId); gTasks[taskId].func = Task_FieldItemContextMenuHandleInput; } static void Task_FieldItemContextMenuHandleInput(u8 taskId) { s16 input; if (IsActiveOverworldLinkBusy() != TRUE) { input = Menu_ProcessInputNoWrapAround2(); switch (input) { case -1: PlaySE(SE_SELECT); sItemMenuContextActions[ITEMMENUACTION_CANCEL].func.void_u8(taskId); break; case -2: break; default: PlaySE(SE_SELECT); sItemMenuContextActions[sContextMenuItemsPtr[input]].func.void_u8(taskId); break; } } } static void Task_ItemMenuAction_Use(u8 taskId) { if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL) { HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == ITEM_TYPE_PARTY_MENU) Task_PrintThereIsNoPokemon(taskId); else ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); } } static void Task_ItemMenuAction_Toss(u8 taskId) { s16 *data = gTasks[taskId].data; ClearWindowTilemap(GetBagWindow(10)); ClearWindowTilemap(GetBagWindow(6)); HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); data[8] = 1; if (data[2] == 1) { Task_ConfirmTossItems(taskId); } else { InitQuantityToTossOrDeposit(data[1], gText_TossOutHowManyStrVar1s); gTasks[taskId].func = Task_SelectQuantityToToss; } } static void Task_ConfirmTossItems(u8 taskId) { s16 *data = gTasks[taskId].data; ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_ThrowAwayStrVar2OfThisItemQM); BagPrintTextOnWindow(ShowBagWindow(6, 1), FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1); BagCreateYesNoMenuBottomRight(taskId, &sYesNoMenu_Toss); } static void Task_TossItem_No(u8 taskId) { s16 *data = gTasks[taskId].data; HideBagWindow(6); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); bag_menu_print_cursor_(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } static void Task_SelectQuantityToToss(u8 taskId) { s16 *data = gTasks[taskId].data; if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) { UpdateQuantityToTossOrDeposit(data[8], 3); } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); ClearWindowTilemap(GetBagWindow(6)); HideBagWindow(6); HideBagWindow(0); ScheduleBgCopyTilemapToVram(0); BagDestroyPocketScrollArrowPair(); Task_ConfirmTossItems(taskId); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); HideBagWindow(6); HideBagWindow(0); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); bag_menu_print_cursor_(data[0], 1); BagDestroyPocketScrollArrowPair(); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } } static void Task_TossItem_Yes(u8 taskId) { s16 *data = gTasks[taskId].data; HideBagWindow(6); CopyItemName(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]), gStringVar1); ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_ThrewAwayStrVar2StrVar1s); BagPrintTextOnWindow(ShowBagWindow(6, 3), FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1); gTasks[taskId].func = Task_WaitAB_RedrawAndReturnToBag; } static void Task_WaitAB_RedrawAndReturnToBag(u8 taskId) { s16 *data = gTasks[taskId].data; if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); RemoveBagItem(gSpecialVar_ItemId, data[8]); HideBagWindow(6); DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket); PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket); Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); bag_menu_print_cursor_(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } } static void Task_ItemMenuAction_ToggleSelect(u8 taskId) { u16 itemId; s16 *data = gTasks[taskId].data; itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]); if (gSaveBlock1Ptr->registeredItem == itemId) gSaveBlock1Ptr->registeredItem = ITEM_NONE; else gSaveBlock1Ptr->registeredItem = itemId; DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); CopyWindowToVram(0, COPYWIN_MAP); Task_ItemMenuAction_Cancel(taskId); } static void Task_ItemMenuAction_Give(u8 taskId) { s16 *data = gTasks[taskId].data; u16 itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]); HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); CopyWindowToVram(0, COPYWIN_MAP); if (!IsWritingMailAllowed(itemId)) DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_CantWriteMailHere, Task_WaitAButtonAndCloseContextMenu); else if (ItemId_GetImportance(itemId) == 0) { if (CalculatePlayerPartyCount() == 0) { Task_PrintThereIsNoPokemon(taskId); } else { sBagMenuDisplay->exitCB = CB2_ChooseMonToGiveItem; gTasks[taskId].func = ItemMenu_StartFadeToExitCallback; } } else Task_PrintItemCantBeHeld(taskId); } static void Task_PrintThereIsNoPokemon(u8 taskId) { DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_ThereIsNoPokemon, Task_WaitAButtonAndCloseContextMenu); } static void Task_PrintItemCantBeHeld(u8 taskId) { CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_ItemCantBeHeld); DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_WaitAButtonAndCloseContextMenu); } static void Task_WaitAButtonAndCloseContextMenu(u8 taskId) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); Task_ReturnToBagFromContextMenu(taskId); } } void Task_ReturnToBagFromContextMenu(u8 taskId) { s16 *data = gTasks[taskId].data; CloseBagWindow(5); DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket); PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket); Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); ScheduleBgCopyTilemapToVram(0); bag_menu_print_cursor_(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } static void Task_UnusedReturnToBag(u8 taskId) { s16 *data = gTasks[taskId].data; u16 itemsAbove; u16 cursorPos; ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove); PrintItemDescriptionOnMessageWindow(cursorPos + itemsAbove); PutWindowTilemap(0); ScheduleBgCopyTilemapToVram(0); bag_menu_print_cursor_(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } static void Task_ItemMenuAction_Cancel(u8 taskId) { HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); bag_menu_print_cursor_(gTasks[taskId].data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } static void Task_ItemMenuAction_BattleUse(u8 taskId) { if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL) { HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); CopyWindowToVram(0, COPYWIN_MAP); ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId); } } static void Task_ItemContext_FieldGive(u8 taskId) { s16 *data = gTasks[taskId].data; u16 itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]); if (!IsWritingMailAllowed(itemId)) { DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_CantWriteMailHere, Task_WaitAButtonAndCloseContextMenu); } else if (itemId == ITEM_TM_CASE) { ItemMenu_SetExitCallback(GoToTMCase_Give); ItemMenu_StartFadeToExitCallback(taskId); } else if (itemId == ITEM_BERRY_POUCH) { ItemMenu_SetExitCallback(GoToBerryPouch_Give); ItemMenu_StartFadeToExitCallback(taskId); } else if (gBagMenuState.pocket != POCKET_KEY_ITEMS - 1 && ItemId_GetImportance(itemId) == 0) { Bag_BeginCloseWin0Animation(); gTasks[taskId].func = ItemMenu_StartFadeToExitCallback; } else { Task_PrintItemCantBeHeld(taskId); } } static void GoToTMCase_Give(void) { InitTMCase(TMCASE_GIVE_PARTY, ReturnToBagMenuFromSubmenu_Give, FALSE); } static void GoToBerryPouch_Give(void) { InitBerryPouch(BERRYPOUCH_FROMPARTYGIVE, ReturnToBagMenuFromSubmenu_Give, FALSE); } static void ReturnToBagMenuFromSubmenu_Give(void) { CB2_SelectBagItemToGive(); } static void Task_ItemContext_PcBoxGive(u8 taskId) { s16 *data = gTasks[taskId].data; u16 itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]); if (ItemIsMail(itemId) == TRUE) { DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_CantWriteMailHere, Task_WaitAButtonAndCloseContextMenu); } else if (itemId == ITEM_TM_CASE) { ItemMenu_SetExitCallback(GoToTMCase_PCBox); ItemMenu_StartFadeToExitCallback(taskId); } else if (itemId == ITEM_BERRY_POUCH) { ItemMenu_SetExitCallback(GoToBerryPouch_PCBox); ItemMenu_StartFadeToExitCallback(taskId); } else if (gBagMenuState.pocket != POCKET_KEY_ITEMS - 1 && ItemId_GetImportance(itemId) == 0) { Bag_BeginCloseWin0Animation(); gTasks[taskId].func = ItemMenu_StartFadeToExitCallback; } else { Task_PrintItemCantBeHeld(taskId); } } static void GoToTMCase_PCBox(void) { InitTMCase(TMCASE_GIVE_PC, ReturnToBagMenuFromSubmenu_PCBox, FALSE); } static void GoToBerryPouch_PCBox(void) { InitBerryPouch(BERRYPOUCH_FROMPOKEMONSTORAGEPC, ReturnToBagMenuFromSubmenu_PCBox, FALSE); } static void ReturnToBagMenuFromSubmenu_PCBox(void) { GoToBagMenu(ITEMMENULOCATION_PCBOX, OPEN_BAG_LAST, CB2_ReturnToPokeStorage); } static void Task_ItemContext_Sell(u8 taskId) { s16 *data = gTasks[taskId].data; if (gSpecialVar_ItemId == ITEM_TM_CASE) { ItemMenu_SetExitCallback(GoToTMCase_Sell); ItemMenu_StartFadeToExitCallback(taskId); } else if (gSpecialVar_ItemId == ITEM_BERRY_POUCH) { ItemMenu_SetExitCallback(GoToBerryPouch_Sell); ItemMenu_StartFadeToExitCallback(taskId); } else if (ItemId_GetPrice(gSpecialVar_ItemId) == 0) { CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat); DisplayItemMessageInBag(taskId, GetDialogBoxFontId(), gStringVar4, Task_ReturnToBagFromContextMenu); } else { data[8] = 1; if (data[2] == 1) { BagPrintMoneyAmount(); Task_PrintSaleConfirmationText(taskId); } else { if (data[2] > 99) data[2] = 99; CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell); DisplayItemMessageInBag(taskId, GetDialogBoxFontId(), gStringVar4, Task_InitSaleQuantitySelectInterface); } } } static void GoToTMCase_Sell(void) { InitTMCase(TMCASE_SELL, ReturnToBagMenuFromSubmenu_Sell, FALSE); } static void GoToBerryPouch_Sell(void) { InitBerryPouch(BERRYPOUCH_FROMMARTSELL, ReturnToBagMenuFromSubmenu_Sell, FALSE); } static void ReturnToBagMenuFromSubmenu_Sell(void) { GoToBagMenu(ITEMMENULOCATION_SHOP, OPEN_BAG_LAST, CB2_ReturnToField); } static void Task_PrintSaleConfirmationText(u8 taskId) { s16 *data = gTasks[taskId].data; ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay); DisplayItemMessageInBag(taskId, GetDialogBoxFontId(), gStringVar4, Task_ShowSellYesNoMenu); } static void Task_ShowSellYesNoMenu(u8 taskId) { BagCreateYesNoMenuTopRight(taskId, &sYesNoMenu_Sell); } static void Task_SellItem_No(u8 taskId) { s16 *data = gTasks[taskId].data; HideBagWindow(2); CloseBagWindow(5); PutWindowTilemap(2); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); bag_menu_print_cursor_(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } static void Task_InitSaleQuantitySelectInterface(u8 taskId) { s16 *data = gTasks[taskId].data; u8 r4 = ShowBagWindow(0, 1); ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); BagPrintTextOnWindow(r4, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0xFF, 1); UpdateSalePriceDisplay(ItemId_GetPrice(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8]); BagPrintMoneyAmount(); CreatePocketScrollArrowPair_SellQuantity(); gTasks[taskId].func = Task_SelectQuantityToSell; } static void UpdateSalePriceDisplay(s32 amount) { PrintMoneyAmount(GetBagWindow(0), 56, 10, amount, 0); } static void Task_SelectQuantityToSell(u8 taskId) { s16 *data = gTasks[taskId].data; if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) { UpdateQuantityToTossOrDeposit(data[8], 2); UpdateSalePriceDisplay(ItemId_GetPrice(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8]); } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); HideBagWindow(0); PutWindowTilemap(0); ScheduleBgCopyTilemapToVram(0); BagDestroyPocketScrollArrowPair(); Task_PrintSaleConfirmationText(taskId); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); HideBagWindow(0); HideBagWindow(2); CloseBagWindow(5); PutWindowTilemap(2); PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); BagDestroyPocketScrollArrowPair(); bag_menu_print_cursor_(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } } static void Task_SellItem_Yes(u8 taskId) { s16 *data = gTasks[taskId].data; PutWindowTilemap(0); ScheduleBgCopyTilemapToVram(0); CopyItemName(gSpecialVar_ItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen); DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_FinalizeSaleToShop); } static void Task_FinalizeSaleToShop(u8 taskId) { s16 *data = gTasks[taskId].data; PlaySE(SE_SHOP); RemoveBagItem(gSpecialVar_ItemId, data[8]); AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * data[8]); RecordItemTransaction(gSpecialVar_ItemId, data[8], QL_EVENT_SOLD_ITEM - QL_EVENT_USED_POKEMART); DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket); PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket); sBagMenuDisplay->inhibitItemDescriptionPrint = TRUE; Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); bag_menu_print_cursor_(data[0], 2); BagDrawTextBoxOnWindow(GetBagWindow(2)); PrintMoneyAmountInMoneyBox(GetBagWindow(2), GetMoney(&gSaveBlock1Ptr->money), 0); gTasks[taskId].func = Task_WaitPressAB_AfterSell; } static void Task_WaitPressAB_AfterSell(u8 taskId) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); HideBagWindow(2); PutWindowTilemap(2); sBagMenuDisplay->inhibitItemDescriptionPrint = FALSE; Task_ReturnToBagFromContextMenu(taskId); } } static void Task_ItemContext_Deposit(u8 taskId) { s16 *data = gTasks[taskId].data; data[8] = 1; if (data[2] == 1) { Task_TryDoItemDeposit(taskId); } else { InitQuantityToTossOrDeposit(data[1], gText_DepositHowManyStrVars1); gTasks[taskId].func = Task_SelectQuantityToDeposit; } } static void Task_SelectQuantityToDeposit(u8 taskId) { s16 *data = gTasks[taskId].data; if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) { UpdateQuantityToTossOrDeposit(data[8], 3); } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); ClearWindowTilemap(GetBagWindow(6)); HideBagWindow(6); HideBagWindow(0); ScheduleBgCopyTilemapToVram(0); BagDestroyPocketScrollArrowPair(); Task_TryDoItemDeposit(taskId); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); HideBagWindow(6); HideBagWindow(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); bag_menu_print_cursor_(data[0], 1); BagDestroyPocketScrollArrowPair(); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } } static void Task_TryDoItemDeposit(u8 taskId) { s16 *data = gTasks[taskId].data; if (AddPCItem(gSpecialVar_ItemId, data[8]) == TRUE) { ItemUse_SetQuestLogEvent(QL_EVENT_DEPOSITED_ITEM_PC, 0, gSpecialVar_ItemId, 0xFFFF); CopyItemName(gSpecialVar_ItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_DepositedStrVar2StrVar1s); BagPrintTextOnWindow(ShowBagWindow(6, 3), FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1); gTasks[taskId].func = Task_WaitAB_RedrawAndReturnToBag; } else { DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_NoRoomToStoreItems, Task_WaitAButtonAndCloseContextMenu); } } bool8 UseRegisteredKeyItemOnField(void) { u8 taskId; if (InUnionRoom() == TRUE) return FALSE; DismissMapNamePopup(); ChangeBgY(0, 0, 0); if (gSaveBlock1Ptr->registeredItem != ITEM_NONE) { if (CheckBagHasItem(gSaveBlock1Ptr->registeredItem, 1) == TRUE) { LockPlayerFieldControls(); FreezeObjectEvents(); HandleEnforcedLookDirectionOnPlayerStopMoving(); StopPlayerAvatar(); gSpecialVar_ItemId = gSaveBlock1Ptr->registeredItem; taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1Ptr->registeredItem), 8); gTasks[taskId].data[3] = 1; return TRUE; } gSaveBlock1Ptr->registeredItem = ITEM_NONE; } ScriptContext_SetupScript(EventScript_BagItemCanBeRegistered); return TRUE; } static bool8 BagIsTutorial(void) { if ( gBagMenuState.location == ITEMMENULOCATION_OLD_MAN || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_CATCHING || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_STATUS || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_REGISTER || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_TMS ) return TRUE; return FALSE; } static void BackUpPlayerBag(void) { u32 i; sBackupPlayerBag = AllocZeroed(sizeof(struct BagSlots)); memcpy(sBackupPlayerBag->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT * sizeof(struct ItemSlot)); memcpy(sBackupPlayerBag->bagPocket_KeyItems, gKeyItemSlots, BAG_KEYITEMS_COUNT * sizeof(struct ItemSlot)); memcpy(sBackupPlayerBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT * sizeof(struct ItemSlot)); memcpy(sBackupPlayerBag->bagPocket_Medicine, gSaveBlock1Ptr->bagPocket_Medicine, BAG_MEDICINE_COUNT * sizeof(struct ItemSlot)); memcpy(sBackupPlayerBag->bagPocket_HoldItems, gSaveBlock1Ptr->bagPocket_HoldItems, BAG_HELD_ITEMS_COUNT * sizeof(struct ItemSlot)); sBackupPlayerBag->registeredItem = gSaveBlock1Ptr->registeredItem; sBackupPlayerBag->pocket = gBagMenuState.pocket; for (i = 0; i < 5; i++) { sBackupPlayerBag->itemsAbove[i] = gBagMenuState.itemsAbove[i]; sBackupPlayerBag->cursorPos[i] = gBagMenuState.cursorPos[i]; } ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT); ClearItemSlots(gKeyItemSlots, BAG_KEYITEMS_COUNT); ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT); ClearItemSlots(gSaveBlock1Ptr->bagPocket_Medicine, BAG_MEDICINE_COUNT); ClearItemSlots(gSaveBlock1Ptr->bagPocket_HoldItems, BAG_HELD_ITEMS_COUNT); gSaveBlock1Ptr->registeredItem = ITEM_NONE; ResetBagCursorPositions(); } static void RestorePlayerBag(void) { u32 i; memcpy(gSaveBlock1Ptr->bagPocket_Items, sBackupPlayerBag->bagPocket_Items, BAG_ITEMS_COUNT * sizeof(struct ItemSlot)); memcpy(gKeyItemSlots, sBackupPlayerBag->bagPocket_KeyItems, BAG_KEYITEMS_COUNT * sizeof(struct ItemSlot)); memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, sBackupPlayerBag->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT * sizeof(struct ItemSlot)); memcpy(gSaveBlock1Ptr->bagPocket_Medicine, sBackupPlayerBag->bagPocket_Medicine, BAG_MEDICINE_COUNT * sizeof(struct ItemSlot)); memcpy(gSaveBlock1Ptr->bagPocket_HoldItems, sBackupPlayerBag->bagPocket_HoldItems, BAG_HELD_ITEMS_COUNT * sizeof(struct ItemSlot)); gSaveBlock1Ptr->registeredItem = sBackupPlayerBag->registeredItem; gBagMenuState.pocket = sBackupPlayerBag->pocket; for (i = 0; i < 5; i++) { gBagMenuState.itemsAbove[i] = sBackupPlayerBag->itemsAbove[i]; gBagMenuState.cursorPos[i] = sBackupPlayerBag->cursorPos[i]; } Free(sBackupPlayerBag); } void InitOldManBag(void) { BackUpPlayerBag(); AddBagItem(ITEM_POTION, 1); AddBagItem(ITEM_POKE_BALL, 1); GoToBagMenu(ITEMMENULOCATION_OLD_MAN, OPEN_BAG_ITEMS, SetCB2ToReshowScreenAfterMenu2); } static void Task_Bag_OldManTutorial(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { switch (data[8]) { case 102: case 204: case 306: case 408: PlaySE(SE_BAG_POCKET); SwitchPockets(taskId, 1, FALSE); break; case 510: PlaySE(SE_SELECT); bag_menu_print_cursor_(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_POKE_BALL; OpenContextMenu(taskId); break; case 612: PlaySE(SE_SELECT); HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); CopyWindowToVram(0, COPYWIN_MAP); DestroyListMenuTask(data[0], NULL, NULL); RestorePlayerBag(); Bag_BeginCloseWin0Animation(); gTasks[taskId].func = Task_Pokedude_FadeFromBag; return; } data[8]++; } } static void Task_Pokedude_FadeFromBag(u8 taskId) { BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_Pokedude_WaitFadeAndExitBag; } static void Task_Pokedude_WaitFadeAndExitBag(u8 taskId) { if (!gPaletteFade.active && FuncIsActiveTask(Task_AnimateWin0v) != TRUE) { if (sBagMenuDisplay->exitCB != NULL) SetMainCallback2(sBagMenuDisplay->exitCB); else SetMainCallback2(gBagMenuState.bagCallback); BagDestroyPocketScrollArrowPair(); DestroyBagMenuResources(); DestroyTask(taskId); } } void InitPokedudeBag(u8 a0) { MainCallback cb2; u8 location; BackUpPlayerBag(); AddBagItem(ITEM_POTION, 1); AddBagItem(ITEM_ANTIDOTE, 1); AddBagItem(ITEM_TEACHY_TV, 1); AddBagItem(ITEM_TM_CASE, 1); AddBagItem(ITEM_POKE_BALL, 5); AddBagItem(ITEM_GREAT_BALL, 1); AddBagItem(ITEM_NEST_BALL, 1); switch (a0) { default: cb2 = CB2_ReturnToTeachyTV; location = a0; break; case 7: cb2 = SetCB2ToReshowScreenAfterMenu2; location = ITEMMENULOCATION_TTVSCR_STATUS; break; case 8: cb2 = SetCB2ToReshowScreenAfterMenu2; location = ITEMMENULOCATION_TTVSCR_CATCHING; break; } GoToBagMenu(location, OPEN_BAG_ITEMS, cb2); } static bool8 Task_BButtonInterruptTeachyTv(u8 taskId) { if (JOY_NEW(B_BUTTON)) { RestorePlayerBag(); SetTeachyTvControllerModeToResume(); sBagMenuDisplay->exitCB = CB2_ReturnToTeachyTV; gTasks[taskId].func = Task_Pokedude_FadeFromBag; return TRUE; } else { return FALSE; } } static void Task_Bag_TeachyTvRegister(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active && Task_BButtonInterruptTeachyTv(taskId) != TRUE) { switch (data[8]) { case 102: case 204: PlaySE(SE_BAG_POCKET); SwitchPockets(taskId, 1, FALSE); break; case 306: PlaySE(SE_SELECT); bag_menu_print_cursor_(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_TEACHY_TV; OpenContextMenu(taskId); break; case 408: PlaySE(SE_SELECT); Menu_MoveCursorNoWrapAround(1); break; case 510: PlaySE(SE_SELECT); gSaveBlock1Ptr->registeredItem = gSpecialVar_ItemId; HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); Bag_FillMessageBoxWithPalette(0); bag_menu_print_cursor_(data[0], 1); CopyWindowToVram(0, COPYWIN_MAP); break; case 612: case 714: gMain.newKeys = 0; gMain.newAndRepeatedKeys = DPAD_DOWN; ListMenu_ProcessInput(data[0]); break; case 816: PlaySE(SE_SELECT); DestroyListMenuTask(data[0], NULL, NULL); RestorePlayerBag(); Bag_BeginCloseWin0Animation(); gTasks[taskId].func = Task_Pokedude_FadeFromBag; return; } data[8]++; } } static void Task_Bag_TeachyTvCatching(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { if (Task_BButtonInterruptTeachyTv(taskId) == TRUE) { FreeRestoreBattleData(); LoadPlayerParty(); return; } switch (data[8]) { case 102: case 204: case 306: case 408: PlaySE(SE_BAG_POCKET); SwitchPockets(taskId, 1, FALSE); break; case 510: case 612: gMain.newKeys = 0; gMain.newAndRepeatedKeys = DPAD_DOWN; ListMenu_ProcessInput(data[0]); break; case 714: case 816: gMain.newKeys = 0; gMain.newAndRepeatedKeys = DPAD_UP; ListMenu_ProcessInput(data[0]); break; case 918: PlaySE(SE_SELECT); bag_menu_print_cursor_(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_POKE_BALL; OpenContextMenu(taskId); break; case 1020: PlaySE(SE_SELECT); HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); CopyWindowToVram(0, COPYWIN_MAP); DestroyListMenuTask(data[0], NULL, NULL); RestorePlayerBag(); Bag_BeginCloseWin0Animation(); gTasks[taskId].func = Task_Pokedude_FadeFromBag; return; } data[8]++; } } static void Task_Bag_TeachyTvStatus(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { if (Task_BButtonInterruptTeachyTv(taskId) == TRUE) { FreeRestoreBattleData(); LoadPlayerParty(); return; } switch (data[8]) { case 102: PlaySE(SE_BAG_POCKET); SwitchPockets(taskId, 1, 0); break; case 204: gMain.newKeys = 0; gMain.newAndRepeatedKeys = DPAD_DOWN; ListMenu_ProcessInput(data[0]); break; case 306: PlaySE(SE_SELECT); bag_menu_print_cursor_(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_ANTIDOTE; OpenContextMenu(taskId); break; case 408: PlaySE(SE_SELECT); HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); CopyWindowToVram(0, COPYWIN_MAP); DestroyListMenuTask(data[0], NULL, NULL); RestorePlayerBag(); gItemUseCB = ItemUseCB_MedicineStep; ItemMenu_SetExitCallback(Pokedude_ChooseMonForInBattleItem); gTasks[taskId].func = Task_Pokedude_FadeFromBag; return; } data[8]++; } } static void Task_Bag_TeachyTvTMs(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active && Task_BButtonInterruptTeachyTv(taskId) != TRUE) { switch (data[8]) { case 102: case 204: PlaySE(SE_BAG_POCKET); SwitchPockets(taskId, 1, 0); break; case 306: gMain.newKeys = 0; gMain.newAndRepeatedKeys = DPAD_DOWN; ListMenu_ProcessInput(data[0]); break; case 408: PlaySE(SE_SELECT); bag_menu_print_cursor_(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_TM_CASE; OpenContextMenu(taskId); break; case 510: PlaySE(SE_SELECT); HideBagWindow(10); HideBagWindow(6); PutWindowTilemap(0); PutWindowTilemap(1); CopyWindowToVram(0, COPYWIN_MAP); DestroyListMenuTask(data[0], NULL, NULL); RestorePlayerBag(); sBagMenuDisplay->exitCB = Pokedude_InitTMCase; gTasks[taskId].func = Task_Pokedude_FadeFromBag; return; } data[8]++; } } // bag sorting enum BagSortOptions { SORT_ALPHABETICALLY, SORT_BY_TYPE, SORT_BY_AMOUNT, //greatest->least SORT_BY_NUMBER, //by itemID }; enum ItemSortType { ITEM_TYPE_FIELD_USE, ITEM_TYPE_HEALTH_RECOVERY, ITEM_TYPE_STATUS_RECOVERY, ITEM_TYPE_PP_RECOVERY, ITEM_TYPE_STAT_BOOST_DRINK, ITEM_TYPE_EVOLUTION_STONE, ITEM_TYPE_EVOLUTION_ITEM, ITEM_TYPE_BATTLE_ITEM, ITEM_TYPE_FLUTE, ITEM_TYPE_STAT_BOOST_HELD_ITEM, ITEM_TYPE_HELD_ITEM, ITEM_TYPE_INCENSE, ITEM_TYPE_MEGA_STONE, ITEM_TYPE_SELLABLE, ITEM_TYPE_SHARD, ITEM_TYPE_FOSSIL, ITEM_TYPE_MAIL_SORT, }; static const u8 sText_SortItemsHow[] = _("Sort items how?"); static const u8 sText_Name[] = _("name"); static const u8 sText_Type[] = _("type"); static const u8 sText_Amount[] = _("amount"); static const u8 sText_Number[] = _("number"); static const u8 sText_ItemsSorted[] = _("Items sorted by {STR_VAR_1}!"); static const u8 *const sSortTypeStrings[] = { [SORT_ALPHABETICALLY] = sText_Name, [SORT_BY_TYPE] = sText_Type, [SORT_BY_AMOUNT] = sText_Amount, [SORT_BY_NUMBER] = sText_Number, }; static const u8 sBagMenuSortItems[] = { ITEMMENUACTION_BY_NAME, ITEMMENUACTION_BY_TYPE, ITEMMENUACTION_BY_AMOUNT, ITEMMENUACTION_CANCEL, }; static const u8 sBagMenuSortKeyItems[] = { ITEMMENUACTION_BY_NAME, ITEMMENUACTION_CANCEL, }; static const u8 sBagMenuSortPokeBalls[] = { ITEMMENUACTION_BY_NAME, ITEMMENUACTION_BY_AMOUNT, ITEMMENUACTION_CANCEL, }; static const u8 sBagMenuSortTMBerries[] = { ITEMMENUACTION_BY_NAME, ITEMMENUACTION_BY_AMOUNT, ITEMMENUACTION_BY_NUMBER, ITEMMENUACTION_CANCEL, }; static const u16 sItemsByType[ITEMS_COUNT] = { [ITEM_REPEL] = ITEM_TYPE_FIELD_USE, [ITEM_SUPER_REPEL] = ITEM_TYPE_FIELD_USE, [ITEM_MAX_REPEL] = ITEM_TYPE_FIELD_USE, [ITEM_ESCAPE_ROPE] = ITEM_TYPE_FIELD_USE, [ITEM_HEART_SCALE] = ITEM_TYPE_FIELD_USE, [ITEM_POTION] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_FULL_RESTORE] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_MAX_POTION] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_HYPER_POTION] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_SUPER_POTION] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_REVIVE] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_MAX_REVIVE] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_FRESH_WATER] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_SODA_POP] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_LEMONADE] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_MOOMOO_MILK] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_ENERGY_POWDER] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_ENERGY_ROOT] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_REVIVAL_HERB] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_BERRY_JUICE] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_SACRED_ASH] = ITEM_TYPE_HEALTH_RECOVERY, [ITEM_ANTIDOTE] = ITEM_TYPE_STATUS_RECOVERY, [ITEM_BURN_HEAL] = ITEM_TYPE_STATUS_RECOVERY, [ITEM_ICE_HEAL] = ITEM_TYPE_STATUS_RECOVERY, [ITEM_AWAKENING] = ITEM_TYPE_STATUS_RECOVERY, [ITEM_PARALYZE_HEAL] = ITEM_TYPE_STATUS_RECOVERY, [ITEM_FULL_HEAL] = ITEM_TYPE_STATUS_RECOVERY, [ITEM_LAVA_COOKIE] = ITEM_TYPE_STATUS_RECOVERY, [ITEM_ETHER] = ITEM_TYPE_PP_RECOVERY, [ITEM_MAX_ETHER] = ITEM_TYPE_PP_RECOVERY, [ITEM_ELIXIR] = ITEM_TYPE_PP_RECOVERY, [ITEM_MAX_ELIXIR] = ITEM_TYPE_PP_RECOVERY, [ITEM_HP_UP] = ITEM_TYPE_STAT_BOOST_DRINK, [ITEM_PROTEIN] = ITEM_TYPE_STAT_BOOST_DRINK, [ITEM_IRON] = ITEM_TYPE_STAT_BOOST_DRINK, [ITEM_CARBOS] = ITEM_TYPE_STAT_BOOST_DRINK, [ITEM_CALCIUM] = ITEM_TYPE_STAT_BOOST_DRINK, [ITEM_ZINC] = ITEM_TYPE_STAT_BOOST_DRINK, [ITEM_RARE_CANDY] = ITEM_TYPE_STAT_BOOST_DRINK, [ITEM_PP_UP] = ITEM_TYPE_STAT_BOOST_DRINK, [ITEM_PP_MAX] = ITEM_TYPE_STAT_BOOST_DRINK, [ITEM_MACHO_BRACE] = ITEM_TYPE_STAT_BOOST_HELD_ITEM, [ITEM_SUN_STONE] = ITEM_TYPE_EVOLUTION_STONE, [ITEM_MOON_STONE] = ITEM_TYPE_EVOLUTION_STONE, [ITEM_FIRE_STONE] = ITEM_TYPE_EVOLUTION_STONE, [ITEM_THUNDER_STONE] = ITEM_TYPE_EVOLUTION_STONE, [ITEM_WATER_STONE] = ITEM_TYPE_EVOLUTION_STONE, [ITEM_LEAF_STONE] = ITEM_TYPE_EVOLUTION_STONE, [ITEM_KINGS_ROCK] = ITEM_TYPE_EVOLUTION_ITEM, [ITEM_DEEP_SEA_TOOTH] = ITEM_TYPE_EVOLUTION_ITEM, [ITEM_DEEP_SEA_SCALE] = ITEM_TYPE_EVOLUTION_ITEM, [ITEM_EVERSTONE] = ITEM_TYPE_EVOLUTION_ITEM, [ITEM_METAL_COAT] = ITEM_TYPE_EVOLUTION_ITEM, [ITEM_DRAGON_SCALE] = ITEM_TYPE_EVOLUTION_ITEM, [ITEM_UP_GRADE] = ITEM_TYPE_EVOLUTION_ITEM, [ITEM_GUARD_SPEC] = ITEM_TYPE_BATTLE_ITEM, [ITEM_DIRE_HIT] = ITEM_TYPE_BATTLE_ITEM, [ITEM_X_ATTACK] = ITEM_TYPE_BATTLE_ITEM, [ITEM_X_DEFEND] = ITEM_TYPE_BATTLE_ITEM, [ITEM_X_SPEED] = ITEM_TYPE_BATTLE_ITEM, [ITEM_X_ACCURACY] = ITEM_TYPE_BATTLE_ITEM, [ITEM_X_SPECIAL] = ITEM_TYPE_BATTLE_ITEM, [ITEM_POKE_DOLL] = ITEM_TYPE_BATTLE_ITEM, [ITEM_FLUFFY_TAIL] = ITEM_TYPE_BATTLE_ITEM, [ITEM_BRIGHT_POWDER] = ITEM_TYPE_HELD_ITEM, [ITEM_WHITE_HERB] = ITEM_TYPE_HELD_ITEM, [ITEM_EXP_SHARE] = ITEM_TYPE_HELD_ITEM, [ITEM_QUICK_CLAW] = ITEM_TYPE_HELD_ITEM, [ITEM_SOOTHE_BELL] = ITEM_TYPE_HELD_ITEM, [ITEM_MENTAL_HERB] = ITEM_TYPE_HELD_ITEM, [ITEM_CHOICE_BAND] = ITEM_TYPE_HELD_ITEM, [ITEM_SILVER_POWDER] = ITEM_TYPE_HELD_ITEM, [ITEM_AMULET_COIN] = ITEM_TYPE_HELD_ITEM, [ITEM_CLEANSE_TAG] = ITEM_TYPE_HELD_ITEM, [ITEM_SOUL_DEW] = ITEM_TYPE_HELD_ITEM, [ITEM_SMOKE_BALL] = ITEM_TYPE_HELD_ITEM, [ITEM_FOCUS_BAND] = ITEM_TYPE_HELD_ITEM, [ITEM_LUCKY_EGG] = ITEM_TYPE_HELD_ITEM, [ITEM_SCOPE_LENS] = ITEM_TYPE_HELD_ITEM, [ITEM_LEFTOVERS] = ITEM_TYPE_HELD_ITEM, [ITEM_LIGHT_BALL] = ITEM_TYPE_HELD_ITEM, [ITEM_SOFT_SAND] = ITEM_TYPE_HELD_ITEM, [ITEM_HARD_STONE] = ITEM_TYPE_HELD_ITEM, [ITEM_MIRACLE_SEED] = ITEM_TYPE_HELD_ITEM, [ITEM_BLACK_GLASSES] = ITEM_TYPE_HELD_ITEM, [ITEM_BLACK_BELT] = ITEM_TYPE_HELD_ITEM, [ITEM_MAGNET] = ITEM_TYPE_HELD_ITEM, [ITEM_MYSTIC_WATER] = ITEM_TYPE_HELD_ITEM, [ITEM_SHARP_BEAK] = ITEM_TYPE_HELD_ITEM, [ITEM_POISON_BARB] = ITEM_TYPE_HELD_ITEM, [ITEM_NEVER_MELT_ICE] = ITEM_TYPE_HELD_ITEM, [ITEM_SPELL_TAG] = ITEM_TYPE_HELD_ITEM, [ITEM_TWISTED_SPOON] = ITEM_TYPE_HELD_ITEM, [ITEM_CHARCOAL] = ITEM_TYPE_HELD_ITEM, [ITEM_DRAGON_FANG] = ITEM_TYPE_HELD_ITEM, [ITEM_SILK_SCARF] = ITEM_TYPE_HELD_ITEM, [ITEM_SHELL_BELL] = ITEM_TYPE_HELD_ITEM, [ITEM_LUCKY_PUNCH] = ITEM_TYPE_HELD_ITEM, [ITEM_METAL_POWDER] = ITEM_TYPE_HELD_ITEM, [ITEM_THICK_CLUB] = ITEM_TYPE_HELD_ITEM, [ITEM_STICK] = ITEM_TYPE_HELD_ITEM, [ITEM_SEA_INCENSE] = ITEM_TYPE_INCENSE, [ITEM_LAX_INCENSE] = ITEM_TYPE_INCENSE, [ITEM_RED_ORB] = ITEM_TYPE_MEGA_STONE, [ITEM_BLUE_ORB] = ITEM_TYPE_MEGA_STONE, [ITEM_BLUE_FLUTE] = ITEM_TYPE_FLUTE, [ITEM_YELLOW_FLUTE] = ITEM_TYPE_FLUTE, [ITEM_RED_FLUTE] = ITEM_TYPE_FLUTE, [ITEM_BLACK_FLUTE] = ITEM_TYPE_FLUTE, [ITEM_WHITE_FLUTE] = ITEM_TYPE_FLUTE, [ITEM_SHOAL_SALT] = ITEM_TYPE_SELLABLE, [ITEM_SHOAL_SHELL] = ITEM_TYPE_SELLABLE, [ITEM_TINY_MUSHROOM] = ITEM_TYPE_SELLABLE, [ITEM_BIG_MUSHROOM] = ITEM_TYPE_SELLABLE, [ITEM_PEARL] = ITEM_TYPE_SELLABLE, [ITEM_BIG_PEARL] = ITEM_TYPE_SELLABLE, [ITEM_STARDUST] = ITEM_TYPE_SELLABLE, [ITEM_STAR_PIECE] = ITEM_TYPE_SELLABLE, [ITEM_NUGGET] = ITEM_TYPE_SELLABLE, [ITEM_RED_SHARD] = ITEM_TYPE_SHARD, [ITEM_BLUE_SHARD] = ITEM_TYPE_SHARD, [ITEM_YELLOW_SHARD] = ITEM_TYPE_SHARD, [ITEM_GREEN_SHARD] = ITEM_TYPE_SHARD, [ITEM_HELIX_FOSSIL] = ITEM_TYPE_FOSSIL, [ITEM_DOME_FOSSIL] = ITEM_TYPE_FOSSIL, [ITEM_OLD_AMBER] = ITEM_TYPE_FOSSIL, [ITEM_ORANGE_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_HARBOR_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_GLITTER_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_MECH_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_WOOD_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_WAVE_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_BEAD_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_SHADOW_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_TROPIC_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_DREAM_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_FAB_MAIL] = ITEM_TYPE_MAIL_SORT, [ITEM_RETRO_MAIL] = ITEM_TYPE_MAIL_SORT, }; static const u8 sFontColorTable[][3] = { {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY}, // Default {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_GREEN}, // Unused {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_2, TEXT_DYNAMIC_COLOR_3}, // Gender symbol {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, // Selection actions {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, // Field moves {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, // Unused }; void BagMenu_Print(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIndex) { AddTextPrinterParameterized4(windowId, fontId, left, top, letterSpacing, lineSpacing, sFontColorTable[colorIndex], speed, str); } static void AddBagSortSubMenu(void) { u8 windowId = 0; switch (gBagMenuState.pocket + 1) { case POCKET_KEY_ITEMS: sContextMenuItemsPtr = sBagMenuSortKeyItems; memcpy(&sContextMenuItemsBuffer, &sBagMenuSortKeyItems, NELEMS(sBagMenuSortKeyItems)); sContextMenuNumItems = NELEMS(sBagMenuSortKeyItems); break; case POCKET_POKE_BALLS: sContextMenuItemsPtr = sBagMenuSortPokeBalls; memcpy(&sContextMenuItemsBuffer, &sBagMenuSortPokeBalls, NELEMS(sBagMenuSortPokeBalls)); sContextMenuNumItems = NELEMS(sBagMenuSortPokeBalls); break; case POCKET_BERRY_POUCH: sContextMenuItemsPtr = sBagMenuSortTMBerries; memcpy(&sContextMenuItemsBuffer, &sBagMenuSortTMBerries, NELEMS(sBagMenuSortTMBerries)); sContextMenuNumItems = NELEMS(sBagMenuSortTMBerries); break; default: sContextMenuItemsPtr = sBagMenuSortItems; memcpy(&sContextMenuItemsBuffer, &sBagMenuSortItems, NELEMS(sBagMenuSortItems)); sContextMenuNumItems = NELEMS(sBagMenuSortItems); break; } StringExpandPlaceholders(gStringVar4, sText_SortItemsHow); FillWindowPixelBuffer(1, PIXEL_FILL(0)); BagMenu_Print(1, 1, gStringVar4, 0, 3, 0, 0, 0, 5); windowId = ShowBagWindow(10, sContextMenuNumItems -1); AddItemMenuActionTextPrinters(windowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, GetFontAttribute(2, FONTATTR_LETTER_SPACING), GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumItems, sItemMenuContextActions, sContextMenuItemsPtr); Menu_InitCursor (windowId, 2, 0, 2, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumItems, 0); } static void Task_FieldItemSortMenuHandleInput(u8 taskId) { s16 input; if (IsActiveOverworldLinkBusy() != TRUE) { input = Menu_ProcessInputNoWrapAround2(); switch (input) { case -1: PlaySE(SE_SELECT); CloseBagWindow(10); Task_ReturnToBagFromContextMenu(taskId); break; case -2: break; default: PlaySE(SE_SELECT); if(sContextMenuItemsPtr[input] == ITEMMENUACTION_CANCEL) { PlaySE(SE_SELECT); CloseBagWindow(10); Task_ReturnToBagFromContextMenu(taskId); } else sItemMenuContextActions[sContextMenuItemsPtr[input]].func.void_u8(taskId); break; } } } static void Task_LoadBagSortOptions(u8 taskId) { AddBagSortSubMenu(); gTasks[taskId].func = Task_FieldItemSortMenuHandleInput; } #define tSortType data[2] static void ItemMenu_SortByName(u8 taskId) { gTasks[taskId].tSortType = SORT_ALPHABETICALLY; StringCopy(gStringVar1, sSortTypeStrings[SORT_ALPHABETICALLY]); gTasks[taskId].func = SortBagItems; } static void ItemMenu_SortByType(u8 taskId) { gTasks[taskId].tSortType = SORT_BY_TYPE; StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_TYPE]); gTasks[taskId].func = SortBagItems; } static void ItemMenu_SortByAmount(u8 taskId) { gTasks[taskId].tSortType = SORT_BY_AMOUNT; //greatest->least StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_AMOUNT]); gTasks[taskId].func = SortBagItems; } static void ItemMenu_SortByNumber(u8 taskId) { gTasks[taskId].tSortType = SORT_BY_NUMBER; //by itemID StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_NUMBER]); gTasks[taskId].func = SortBagItems; } static void SortBagItems(u8 taskId) { s16* data = gTasks[taskId].data; CloseBagWindow(10); CloseBagWindow(5); DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket); PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket); Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); ScheduleBgCopyTilemapToVram(0); bag_menu_print_cursor_(data[0], 1); StringCopy(gStringVar1, sSortTypeStrings[tSortType]); StringExpandPlaceholders(gStringVar4, sText_ItemsSorted); DisplayItemMessageInBag(taskId, 1, gStringVar4, Task_SortFinish); } static void Task_SortFinish(u8 taskId) { s16* data = gTasks[taskId].data; if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { SortItemsInBag(gBagMenuState.pocket, tSortType); PlaySE(SE_SELECT); Task_ReturnToBagFromContextMenu(taskId); } } static void SortItemsInBag(u8 pocket, u8 type) { struct ItemSlot* itemMem; u16 itemAmount; s8 (*func)(struct ItemSlot*, struct ItemSlot*); switch (pocket) { case (POCKET_ITEMS - 1): itemMem = gSaveBlock1Ptr->bagPocket_Items; itemAmount = BAG_ITEMS_COUNT; break; case (POCKET_MEDICINE - 1): itemMem = gSaveBlock1Ptr->bagPocket_Medicine; itemAmount = BAG_MEDICINE_COUNT; break; case (POCKET_KEY_ITEMS - 1): itemMem = gKeyItemSlots; itemAmount = BAG_KEYITEMS_COUNT; break; case (POCKET_HELD_ITEMS - 1): itemMem = gSaveBlock1Ptr->bagPocket_HoldItems; itemAmount = BAG_HELD_ITEMS_COUNT; break; case (POCKET_POKE_BALLS - 1): itemMem = gSaveBlock1Ptr->bagPocket_PokeBalls; itemAmount = BAG_POKEBALLS_COUNT; break; case (POCKET_BERRY_POUCH - 1): itemMem = gSaveBlock1Ptr->bagPocket_Berries; itemAmount = BAG_BERRIES_COUNT; break; default: return; } switch (type) { case SORT_ALPHABETICALLY: MergeSort(itemMem, 0, itemAmount - 1, CompareItemsAlphabetically); break; case SORT_BY_AMOUNT: MergeSort(itemMem, 0, itemAmount - 1, CompareItemsByMost); break; case SORT_BY_NUMBER: MergeSort(itemMem, 0, itemAmount - 1, CompareItemsById); break; default: MergeSort(itemMem, 0, itemAmount - 1, CompareItemsByType); break; } } static void MergeSort(struct ItemSlot* array, u32 low, u32 high, s8 (*comparator)(struct ItemSlot*, struct ItemSlot*)) { u32 mid; if (high <= low) return; mid = low + (high - low) / 2; MergeSort(array, low, mid, comparator); //Sort left half. MergeSort(array, mid + 1, high, comparator); //Sort right half. Merge(array, low, mid, high, comparator); //Merge results. } static void Merge(struct ItemSlot* array, u32 low, u32 mid, u32 high, s8 (*comparator)(struct ItemSlot*, struct ItemSlot*)) { u32 i = low; u32 j = mid + 1; u32 k; struct ItemSlot aux[high + 1]; for (k = low; k <= high; ++k) aux[k] = array[k]; for (k = low; k <= high; ++k) { //Merge back to a[low..high] if (i > mid) array[k] = aux[j++]; else if (j > high) array[k] = aux[i++]; else if (comparator(&aux[j], &aux[i]) < 0) array[k] = aux[j++]; else array[k] = aux[i++]; } } static s8 CompareItemsAlphabetically(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2) { u16 item1 = itemSlot1->itemId; u16 item2 = itemSlot2->itemId; int i; const u8 *name1; const u8 *name2; if (item1 == ITEM_NONE) return 1; else if (item2 == ITEM_NONE) return -1; name1 = ItemId_GetName(item1); name2 = ItemId_GetName(item2); for (i = 0; ; ++i) { if (name1[i] == EOS && name2[i] != EOS) return -1; else if (name1[i] != EOS && name2[i] == EOS) return 1; else if (name1[i] == EOS && name2[i] == EOS) return 0; if (name1[i] < name2[i]) return -1; else if (name1[i] > name2[i]) return 1; } return 0; //Will never be reached } static s8 CompareItemsByMost(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2) { u16 quantity1 = GetBagItemQuantity(&itemSlot1->quantity); u16 quantity2 = GetBagItemQuantity(&itemSlot2->quantity); if (itemSlot1->itemId == ITEM_NONE) return 1; else if (itemSlot2->itemId == ITEM_NONE) return -1; if (quantity1 < quantity2) return 1; else if (quantity1 > quantity2) return -1; return CompareItemsAlphabetically(itemSlot1, itemSlot2); //Items have same quantity so sort alphabetically } static s8 CompareItemsById(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2) { if (itemSlot1->itemId == ITEM_NONE) return 1; else if (itemSlot2->itemId == ITEM_NONE) return -1; if (itemSlot2->itemId < itemSlot1->itemId) return 1; else if (itemSlot2->itemId > itemSlot1->itemId) return -1; return CompareItemsByMost(itemSlot1, itemSlot2); //Items with the same ID are sorted by stack amount } static s8 CompareItemsByType(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2) { //Null items go last u8 type1 = (itemSlot1->itemId == ITEM_NONE) ? 0xFF : sItemsByType[itemSlot1->itemId]; u8 type2 = (itemSlot2->itemId == ITEM_NONE) ? 0xFF : sItemsByType[itemSlot2->itemId]; if (type1 < type2) return -1; else if (type1 > type2) return 1; return CompareItemsAlphabetically(itemSlot1, itemSlot2); //Items are of same type so sort alphabetically } ================================================ FILE: src/item_menu_icons.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "graphics.h" #include "item_menu_icons.h" #include "constants/items.h" enum { TAG_BAG = 100, TAG_SWAP_LINE, TAG_ITEM_ICON, TAG_ITEM_ICON_ALT, }; #define NUM_SWAP_LINE_SPRITES 9 // Indexes for sItemMenuIconSpriteIds enum { SPR_BAG, SPR_SWAP_LINE_START, SPR_ITEM_ICON = SPR_SWAP_LINE_START + NUM_SWAP_LINE_SPRITES, SPR_ITEM_ICON_ALT, SPR_COUNT }; enum { ANIM_SWAP_LINE_START, ANIM_SWAP_LINE_MID, ANIM_SWAP_LINE_END, }; enum { AFFINEANIM_BAG_IDLE, AFFINEANIM_BAG_SHAKE, }; static EWRAM_DATA u8 sItemMenuIconSpriteIds[SPR_COUNT] = {0}; static EWRAM_DATA void *sItemIconTilesBuffer = NULL; static EWRAM_DATA void *sItemIconTilesBufferPadded = NULL; static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite); static void SpriteCB_ShakeBagSprite(struct Sprite *sprite); static const struct OamData sOamData_Bag = { .affineMode = ST_OAM_AFFINE_NORMAL, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .priority = 1, .paletteNum = 0 }; static const union AnimCmd sAnim_Bag_OpenPokeBallsPocket[] = { ANIMCMD_FRAME( 0, 5), ANIMCMD_FRAME(0x40, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Bag_OpenItemsPocket[] = { ANIMCMD_FRAME( 0, 5), ANIMCMD_FRAME(0x80, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Bag_OpenKeyItemsPocket[] = { ANIMCMD_FRAME( 0, 5), ANIMCMD_FRAME(0xc0, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Bag_OpenMedicinePocket[] = { ANIMCMD_FRAME( 0, 5), ANIMCMD_FRAME(0x100, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Bag_OpenHeldItemsPocket[] = { ANIMCMD_FRAME( 0, 5), ANIMCMD_FRAME(0x140, 0), ANIMCMD_END }; static const union AnimCmd *const sAnims_Bag[] = { [POCKET_ITEMS - 1] = sAnim_Bag_OpenItemsPocket, [POCKET_MEDICINE - 1] = sAnim_Bag_OpenMedicinePocket, [POCKET_KEY_ITEMS - 1] = sAnim_Bag_OpenKeyItemsPocket, [POCKET_HELD_ITEMS - 1] = sAnim_Bag_OpenHeldItemsPocket, [POCKET_POKE_BALLS - 1] = sAnim_Bag_OpenPokeBallsPocket, }; static const union AffineAnimCmd sAffineAnim_BagIdle[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_BagShake[] = { AFFINEANIMCMD_FRAME(0, 0, -2, 2), AFFINEANIMCMD_FRAME(0, 0, 2, 4), AFFINEANIMCMD_FRAME(0, 0, -2, 4), AFFINEANIMCMD_FRAME(0, 0, 2, 2), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnimTable_Bag[] = { [AFFINEANIM_BAG_IDLE] = sAffineAnim_BagIdle, [AFFINEANIM_BAG_SHAKE] = sAffineAnim_BagShake }; const struct CompressedSpriteSheet gSpriteSheet_BagMale = { .data = gBagMale_Gfx, .size = 0x3000, .tag = TAG_BAG }; const struct CompressedSpriteSheet gSpriteSheet_BagFemale = { .data = gBagFemale_Gfx, .size = 0x3000, .tag = TAG_BAG }; const struct CompressedSpritePalette gSpritePalette_Bag = { .data = gBag_Pal, .tag = TAG_BAG }; static const struct SpriteTemplate sSpriteTemplate_Bag = { .tileTag = TAG_BAG, .paletteTag = TAG_BAG, .oam = &sOamData_Bag, .anims = sAnims_Bag, .images = NULL, .affineAnims = sAffineAnimTable_Bag, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_SwapLine = { .affineMode = ST_OAM_AFFINE_OFF, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 1, .paletteNum = 1 }; static const union AnimCmd sAnim_SwapLine_Start[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sAnim_SwapLine_Mid[] = { ANIMCMD_FRAME(4, 0), ANIMCMD_END }; static const union AnimCmd sAnim_SwapLine_End[] = { ANIMCMD_FRAME(0, 0, .hFlip = TRUE), ANIMCMD_END }; static const union AnimCmd *const sAnims_SwapLine[] = { [ANIM_SWAP_LINE_START] = sAnim_SwapLine_Start, [ANIM_SWAP_LINE_MID] = sAnim_SwapLine_Mid, [ANIM_SWAP_LINE_END] = sAnim_SwapLine_End }; const struct CompressedSpriteSheet gBagSwapSpriteSheet = { .data = gSwapLine_Gfx, .size = 0x100, .tag = TAG_SWAP_LINE }; const struct CompressedSpritePalette gBagSwapSpritePalette = { .data = gSwapLine_Pal, .tag = TAG_SWAP_LINE }; static const struct SpriteTemplate sSpriteTemplate_SwapLine = { .tileTag = TAG_SWAP_LINE, .paletteTag = TAG_SWAP_LINE, .oam = &sOamData_SwapLine, .anims = sAnims_SwapLine, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_ItemIcon = { .affineMode = ST_OAM_AFFINE_OFF, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .priority = 1, .paletteNum = 2 }; static const union AnimCmd sAnim_ItemIcon[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd *const sAnims_ItemIcon[] = { sAnim_ItemIcon }; static const struct SpriteTemplate sSpriteTemplate_ItemIcon = { .tileTag = TAG_ITEM_ICON, .paletteTag = TAG_ITEM_ICON, .oam = &sOamData_ItemIcon, .anims = sAnims_ItemIcon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; #include "data/item_icon_table.h" void ResetItemMenuIconState(void) { u32 i; for (i = 0; i < SPR_COUNT; i++) sItemMenuIconSpriteIds[i] = SPRITE_NONE; } void CreateBagSprite(u8 animNum) { sItemMenuIconSpriteIds[SPR_BAG] = CreateSprite(&sSpriteTemplate_Bag, 40, 68, 0); SetBagVisualPocketId(animNum); } void SetBagVisualPocketId(u8 animNum) { struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]]; sprite->y2 = -5; sprite->callback = SpriteCB_BagVisualSwitchingPockets; StartSpriteAnim(sprite, animNum); } static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite) { if (sprite->y2 != 0) sprite->y2++; else sprite->callback = SpriteCallbackDummy; } void ShakeBagSprite(void) { struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]]; if (sprite->affineAnimEnded) { StartSpriteAffineAnim(sprite, AFFINEANIM_BAG_SHAKE); sprite->callback = SpriteCB_ShakeBagSprite; } } static void SpriteCB_ShakeBagSprite(struct Sprite *sprite) { if (sprite->affineAnimEnded) { StartSpriteAffineAnim(sprite, AFFINEANIM_BAG_IDLE); sprite->callback = SpriteCallbackDummy; } } void CreateSwapLine(void) { u32 i; u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) { spriteIds[i] = CreateSprite(&sSpriteTemplate_SwapLine, i * 16 + 96, 7, 0); switch (i) { case 0: // ANIM_SWAP_LINE_START, by default break; case NUM_SWAP_LINE_SPRITES - 1: StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_END); break; default: StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_MID); break; } gSprites[spriteIds[i]].invisible = TRUE; } } void SetSwapLineInvisibility(bool8 invisible) { u32 i; u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) gSprites[spriteIds[i]].invisible = invisible; } void UpdateSwapLinePos(s16 x, u16 y) { u32 i; u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) { gSprites[spriteIds[i]].x2 = x; gSprites[spriteIds[i]].y = y + 7; } } static bool8 TryAllocItemIconTilesBuffers(void) { void ** ptr1, ** ptr2; ptr1 = &sItemIconTilesBuffer; *ptr1 = Alloc(0x120); if (*ptr1 == NULL) return FALSE; ptr2 = &sItemIconTilesBufferPadded; *ptr2 = AllocZeroed(0x200); if (*ptr2 == NULL) { Free(*ptr1); return FALSE; } return TRUE; } void CopyItemIconPicTo4x4Buffer(const void *src, void *dest) { u32 i; for (i = 0; i < 3; i++) CpuCopy16(src + 0x60 * i, dest + 0x80 * i, 0x60); } u8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId) { struct SpriteTemplate template; struct SpriteSheet spriteSheet; struct CompressedSpritePalette spritePalette; u8 spriteId; if (!TryAllocItemIconTilesBuffers()) return MAX_SPRITES; LZDecompressWram(GetItemIconGfxPtr(itemId, ITEMICON_TILES), sItemIconTilesBuffer); CopyItemIconPicTo4x4Buffer(sItemIconTilesBuffer, sItemIconTilesBufferPadded); spriteSheet.data = sItemIconTilesBufferPadded; spriteSheet.size = 0x200; spriteSheet.tag = tilesTag; LoadSpriteSheet(&spriteSheet); spritePalette.data = GetItemIconGfxPtr(itemId, ITEMICON_PAL); spritePalette.tag = paletteTag; LoadCompressedSpritePalette(&spritePalette); CpuCopy16(&sSpriteTemplate_ItemIcon, &template, sizeof(struct SpriteTemplate)); template.tileTag = tilesTag; template.paletteTag = paletteTag; spriteId = CreateSprite(&template, 0, 0, 0); Free(sItemIconTilesBuffer); Free(sItemIconTilesBufferPadded); return spriteId; } u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origTemplate, u16 tilesTag, u16 paletteTag, u16 itemId) { struct SpriteTemplate template; struct SpriteSheet spriteSheet; struct CompressedSpritePalette spritePalette; u8 spriteId; if (!TryAllocItemIconTilesBuffers()) return MAX_SPRITES; LZDecompressWram(GetItemIconGfxPtr(itemId, ITEMICON_TILES), sItemIconTilesBuffer); CopyItemIconPicTo4x4Buffer(sItemIconTilesBuffer, sItemIconTilesBufferPadded); spriteSheet.data = sItemIconTilesBufferPadded; spriteSheet.size = 0x200; spriteSheet.tag = tilesTag; LoadSpriteSheet(&spriteSheet); spritePalette.data = GetItemIconGfxPtr(itemId, ITEMICON_PAL); spritePalette.tag = paletteTag; LoadCompressedSpritePalette(&spritePalette); CpuCopy16(origTemplate, &template, sizeof(struct SpriteTemplate)); template.tileTag = tilesTag; template.paletteTag = paletteTag; spriteId = CreateSprite(&template, 0, 0, 0); Free(sItemIconTilesBuffer); Free(sItemIconTilesBufferPadded); return spriteId; } void CreateItemMenuIcon(u16 itemId, u8 idx) { u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; u8 spriteId; if (spriteIds[idx] == SPRITE_NONE) { // Either TAG_ITEM_ICON or TAG_ITEM_ICON_ALT FreeSpriteTilesByTag(TAG_ITEM_ICON + idx); FreeSpritePaletteByTag(TAG_ITEM_ICON + idx); spriteId = AddItemIconObject(TAG_ITEM_ICON + idx, TAG_ITEM_ICON + idx, itemId); if (spriteId != MAX_SPRITES) { spriteIds[idx] = spriteId; gSprites[spriteId].x2 = 24; gSprites[spriteId].y2 = 140; } } } void DestroyItemMenuIcon(u8 idx) { u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; if (spriteIds[idx] != SPRITE_NONE) { DestroySpriteAndFreeResources(&gSprites[spriteIds[idx]]); spriteIds[idx] = SPRITE_NONE; } } // attrId is either ITEMICON_TILES or ITEMICON_PAL const u32 *GetItemIconGfxPtr(u16 itemId, u8 attrId) { if (itemId > ITEMS_COUNT) itemId = ITEM_NONE; return sItemIconTable[itemId][attrId]; } void CreateBerryPouchItemIcon(u16 itemId, u8 idx) { u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; u8 spriteId; if (spriteIds[idx] == SPRITE_NONE) { // Either TAG_ITEM_ICON or TAG_ITEM_ICON_ALT FreeSpriteTilesByTag(TAG_ITEM_ICON + idx); FreeSpritePaletteByTag(TAG_ITEM_ICON + idx); spriteId = AddItemIconObject(TAG_ITEM_ICON + idx, TAG_ITEM_ICON + idx, itemId); if (spriteId != MAX_SPRITES) { spriteIds[idx] = spriteId; gSprites[spriteId].x2 = 24; gSprites[spriteId].y2 = 147; // This value is the only difference from CreateItemMenuIcon } } } ================================================ FILE: src/item_pc.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "decompress.h" #include "graphics.h" #include "help_system.h" #include "item.h" #include "item_menu.h" #include "item_menu_icons.h" #include "list_menu.h" #include "item_pc.h" #include "item_use.h" #include "menu.h" #include "menu_helpers.h" #include "menu_indicators.h" #include "new_menu_helpers.h" #include "party_menu.h" #include "pc_screen_effect.h" #include "scanline_effect.h" #include "strings.h" #include "task.h" #include "text_window.h" #include "constants/items.h" #include "constants/quest_log.h" #include "constants/songs.h" struct ItemPcResources { MainCallback savedCallback; u8 moveModeOrigPos; u8 itemMenuIconSlot; u8 maxShowed; u8 nItems; u8 scrollIndicatorArrowPairId; u16 withdrawQuantitySubmenuCursorPos; s16 data[3]; }; struct ItemPcStaticResources { MainCallback savedCallback; u16 scroll; u16 row; u8 initialized; }; static EWRAM_DATA struct ItemPcResources * sStateDataPtr = NULL; static EWRAM_DATA u8 * sBg1TilemapBuffer = NULL; static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL; static EWRAM_DATA u8 * sUnusedStringAllocation = NULL; static EWRAM_DATA struct ItemPcStaticResources sListMenuState = {}; static EWRAM_DATA u8 sSubmenuWindowIds[3] = {}; extern const struct CompressedSpriteSheet gBagSwapSpriteSheet; extern const struct CompressedSpritePalette gBagSwapSpritePalette; static void ItemPc_RunSetup(void); static bool8 ItemPc_DoGfxSetup(void); static void ItemPc_FadeAndBail(void); static void Task_ItemPcWaitFadeAndBail(u8 taskId); static bool8 ItemPc_InitBgs(void); static bool8 ItemPc_LoadGraphics(void); static bool8 ItemPc_AllocateResourcesForListMenu(void); static void ItemPc_BuildListMenuTemplate(void); static void ItemPc_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list); static void ItemPc_ItemPrintFunc(u8 windowId, u32 itemId, u8 y); static void ItemPc_PrintOrRemoveCursorAt(u8 y, u8 state); static void ItemPc_PrintWithdrawItem(void); static void ItemPc_PlaceTopMenuScrollIndicatorArrows(void); static void ItemPc_SetCursorPosition(void); static void ItemPc_FreeResources(void); static void Task_ItemPcTurnOff2(u8 taskId); static u16 ItemPc_GetItemIdBySlotId(u16 itemIndex); static u16 ItemPc_GetItemQuantityBySlotId(u16 itemIndex); static void ItemPc_CountPcItems(void); static void ItemPc_SetScrollPosition(void); static void Task_ItemPcMain(u8 taskId); static void ItemPc_MoveItemModeInit(u8 taskId, s16 pos); static void Task_ItemPcMoveItemModeRun(u8 taskId); static void ItemPc_InsertItemIntoNewSlot(u8 taskId, u32 pos); static void ItemPc_MoveItemModeCancel(u8 taskId, u32 pos); static void Task_ItemPcSubmenuInit(u8 taskId); static void Task_ItemPcSubmenuRun(u8 taskId); static void Task_ItemPcWithdraw(u8 taskId); static void ItemPc_DoWithdraw(u8 taskId); static void Task_ItemPcWaitButtonAndFinishWithdrawMultiple(u8 taskId); static void Task_ItemPcWaitButtonWithdrawMultipleFailed(u8 taskId); static void Task_ItemPcCleanUpWithdraw(u8 taskId); static void ItemPc_WithdrawMultipleInitWindow(u16 slotId); static void Task_ItemPcHandleWithdrawMultiple(u8 taskId); static void Task_ItemPcGive(u8 taskId); static void ItemPc_CB2_SwitchToPartyMenu(void); static void ItemPc_CB2_ReturnFromPartyMenu(void); static void gTask_ItemPcWaitButtonAndExitSubmenu(u8 taskId); static void Task_ItemPcCancel(u8 taskId); static void ItemPc_InitWindows(void); static void ItemPc_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx); static void ItemPc_SetBorderStyleOnWindow(u8 windowId); static u8 ItemPc_GetOrCreateSubwindow(u8 idx); static void ItemPc_DestroySubwindow(u8 idx); static void ItemPc_PrintOnWindow5WithContinueTask(u8 taskId, const u8 * str, TaskFunc taskFunc); static const struct BgTemplate sBgTemplates[2] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .priority = 0 }, { .bg = 1, .charBaseIndex = 3, .mapBaseIndex = 30, .priority = 1 } }; static const struct MenuAction sItemPcSubmenuOptions[] = { {gText_Withdraw, {.void_u8 = Task_ItemPcWithdraw}}, {gOtherText_Give, {.void_u8 = Task_ItemPcGive}}, {gFameCheckerText_Cancel, {.void_u8 = Task_ItemPcCancel}} }; static const u8 sTextColors[][3] = { {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY}, {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_DARK_GRAY} }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 7, .tilemapTop = 1, .width = 19, .height = 12, .paletteNum = 15, .baseBlock = 0x02bf }, { .bg = 0, .tilemapLeft = 5, .tilemapTop = 14, .width = 25, .height = 6, .paletteNum = 13, .baseBlock = 0x0229 }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 5, .height = 4, .paletteNum = 15, .baseBlock = 0x0215 }, { .bg = 0, .tilemapLeft = 24, .tilemapTop = 15, .width = 5, .height = 4, .paletteNum = 15, .baseBlock = 0x0201 }, { .bg = 0, .tilemapLeft = 22, .tilemapTop = 13, .width = 7, .height = 6, .paletteNum = 15, .baseBlock = 0x01d7 }, { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 11, .baseBlock = 0x016f }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sSubwindowTemplates[] = { { .bg = 0, .tilemapLeft = 6, .tilemapTop = 15, .width = 14, .height = 4, .paletteNum = 12, .baseBlock = 0x0137 }, { .bg = 0, .tilemapLeft = 6, .tilemapTop = 15, .width = 16, .height = 4, .paletteNum = 12, .baseBlock = 0x0137 }, { .bg = 0, .tilemapLeft = 6, .tilemapTop = 15, .width = 23, .height = 4, .paletteNum = 12, .baseBlock = 0x009b } }; void ItemPc_Init(u8 kind, MainCallback callback) { u32 i; if (kind >= 2) { SetMainCallback2(callback); return; } if ((sStateDataPtr = Alloc(sizeof(struct ItemPcResources))) == NULL) { SetMainCallback2(callback); return; } if (kind != 1) { sListMenuState.savedCallback = callback; sListMenuState.scroll = sListMenuState.row = 0; } sStateDataPtr->moveModeOrigPos = 0xFF; sStateDataPtr->itemMenuIconSlot = 0; sStateDataPtr->scrollIndicatorArrowPairId = 0xFF; sStateDataPtr->savedCallback = 0; for (i = 0; i < 3; i++) { sStateDataPtr->data[i] = 0; } SetMainCallback2(ItemPc_RunSetup); } static void ItemPc_MainCB(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); DoScheduledBgTilemapCopiesToVram(); UpdatePaletteFade(); } static void ItemPc_VBlankCB(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void ItemPc_RunSetup(void) { while (1) { if (ItemPc_DoGfxSetup() == TRUE) break; if (MenuHelpers_IsLinkActive() == TRUE) break; } } static bool8 ItemPc_DoGfxSetup(void) { u8 taskId; switch (gMain.state) { case 0: SetVBlankHBlankCallbacksToNull(); ClearScheduledBgCopiesToVram(); gMain.state++; break; case 1: ScanlineEffect_Stop(); gMain.state++; break; case 2: FreeAllSpritePalettes(); gMain.state++; break; case 3: ResetPaletteFade(); gMain.state++; break; case 4: ResetSpriteData(); gMain.state++; break; case 5: ResetItemMenuIconState(); gMain.state++; break; case 6: ResetTasks(); gMain.state++; break; case 7: if (ItemPc_InitBgs()) { sStateDataPtr->data[0] = 0; gMain.state++; } else { ItemPc_FadeAndBail(); return TRUE; } break; case 8: if (ItemPc_LoadGraphics() == TRUE) gMain.state++; break; case 9: ItemPc_InitWindows(); gMain.state++; break; case 10: ItemPc_CountPcItems(); ItemPc_SetCursorPosition(); ItemPc_SetScrollPosition(); gMain.state++; break; case 11: if (ItemPc_AllocateResourcesForListMenu()) gMain.state++; else { ItemPc_FadeAndBail(); return TRUE; } break; case 12: ItemPc_BuildListMenuTemplate(); gMain.state++; break; case 13: ItemPc_PrintWithdrawItem(); gMain.state++; break; case 14: CreateSwapLine(); gMain.state++; break; case 15: taskId = CreateTask(Task_ItemPcMain, 0); gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row); gMain.state++; break; case 16: ItemPc_PlaceTopMenuScrollIndicatorArrows(); gMain.state++; break; case 17: SetHelpContext(HELPCONTEXT_PLAYERS_PC_ITEMS); gMain.state++; break; case 18: if (sListMenuState.initialized == 1) { BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); } gMain.state++; break; case 19: if (sListMenuState.initialized == 1) { BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); } else { BeginPCScreenEffect_TurnOn(0, 0, 0); ItemPc_SetInitializedFlag(TRUE); PlaySE(SE_PC_LOGIN); } gMain.state++; break; case 20: if (IsActiveOverworldLinkBusy() != TRUE) gMain.state++; break; default: SetVBlankCallback(ItemPc_VBlankCB); SetMainCallback2(ItemPc_MainCB); return TRUE; } return FALSE; } static void ItemPc_FadeAndBail(void) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); CreateTask(Task_ItemPcWaitFadeAndBail, 0); SetVBlankCallback(ItemPc_VBlankCB); SetMainCallback2(ItemPc_MainCB); } static void Task_ItemPcWaitFadeAndBail(u8 taskId) { if (!gPaletteFade.active) { SetMainCallback2(sListMenuState.savedCallback); ItemPc_FreeResources(); DestroyTask(taskId); } } static bool8 ItemPc_InitBgs(void) { ResetAllBgsCoordinatesAndBgCntRegs(); sBg1TilemapBuffer = Alloc(0x800); if (sBg1TilemapBuffer == NULL) return FALSE; memset(sBg1TilemapBuffer, 0, 0x800); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetBgTilemapBuffer(1, sBg1TilemapBuffer); ScheduleBgCopyTilemapToVram(1); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BLDCNT , 0); ShowBg(0); ShowBg(1); return TRUE; } static bool8 ItemPc_LoadGraphics(void) { switch (sStateDataPtr->data[0]) { case 0: ResetTempTileDataBuffers(); DecompressAndCopyTileDataToVram(1, gItemPcTiles, 0, 0, 0); sStateDataPtr->data[0]++; break; case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { LZDecompressWram(gItemPcTilemap, sBg1TilemapBuffer); sStateDataPtr->data[0]++; } break; case 2: LoadCompressedPalette(gItemPcBgPals, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP); sStateDataPtr->data[0]++; break; case 3: LoadCompressedSpriteSheet(&gBagSwapSpriteSheet); sStateDataPtr->data[0]++; break; default: LoadCompressedSpritePalette(&gBagSwapSpritePalette); sStateDataPtr->data[0] = 0; return TRUE; } return FALSE; } #define try_alloc(ptr__, size) ({ \ void ** ptr = (void **)&(ptr__); \ *ptr = Alloc(size); \ if (*ptr == NULL) \ { \ ItemPc_FreeResources(); \ ItemPc_FadeAndBail(); \ return FALSE; \ } \ }) static bool8 ItemPc_AllocateResourcesForListMenu(void) { try_alloc(sListMenuItems, sizeof(struct ListMenuItem) * (PC_ITEMS_COUNT + 1)); try_alloc(sUnusedStringAllocation, 14 * (PC_ITEMS_COUNT + 1)); return TRUE; } static void ItemPc_BuildListMenuTemplate(void) { u32 i; for (i = 0; i < sStateDataPtr->nItems; i++) { sListMenuItems[i].label = ItemId_GetName(gSaveBlock1Ptr->pcItems[i].itemId); sListMenuItems[i].index = i; } sListMenuItems[i].label = gFameCheckerText_Cancel; sListMenuItems[i].index = -2; gMultiuseListMenuTemplate.items = sListMenuItems; gMultiuseListMenuTemplate.totalItems = sStateDataPtr->nItems + 1; gMultiuseListMenuTemplate.windowId = 0; gMultiuseListMenuTemplate.header_X = 0; gMultiuseListMenuTemplate.item_X = 9; gMultiuseListMenuTemplate.cursor_X = 1; gMultiuseListMenuTemplate.lettersSpacing = 1; gMultiuseListMenuTemplate.itemVerticalPadding = 2; gMultiuseListMenuTemplate.upText_Y = 2; gMultiuseListMenuTemplate.maxShowed = sStateDataPtr->maxShowed; gMultiuseListMenuTemplate.fontId = FONT_NORMAL; gMultiuseListMenuTemplate.cursorPal = 2; gMultiuseListMenuTemplate.fillValue = 0; gMultiuseListMenuTemplate.cursorShadowPal = 3; gMultiuseListMenuTemplate.moveCursorFunc = ItemPc_MoveCursorFunc; gMultiuseListMenuTemplate.itemPrintFunc = ItemPc_ItemPrintFunc; gMultiuseListMenuTemplate.scrollMultiple = 0; gMultiuseListMenuTemplate.cursorKind = 0; } static void ItemPc_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list) { u16 itemId; const u8 * desc; if (onInit != TRUE) PlaySE(SE_SELECT); if (sStateDataPtr->moveModeOrigPos == 0xFF) { DestroyItemMenuIcon(sStateDataPtr->itemMenuIconSlot ^ 1); if (itemIndex != -2) { itemId = ItemPc_GetItemIdBySlotId(itemIndex); CreateItemMenuIcon(itemId, sStateDataPtr->itemMenuIconSlot); if (ItemId_GetPocket(itemId) == POCKET_TM_CASE) desc = gMoveNames[ItemIdToBattleMoveId(itemId)]; else desc = ItemId_GetDescription(itemId); } else { CreateItemMenuIcon(ITEMS_COUNT, sStateDataPtr->itemMenuIconSlot); desc = gText_ReturnToPC; } sStateDataPtr->itemMenuIconSlot ^= 1; FillWindowPixelBuffer(1, 0); ItemPc_AddTextPrinterParameterized(1, FONT_NORMAL, desc, 0, 3, 2, 0, 0, 3); } } static void ItemPc_ItemPrintFunc(u8 windowId, u32 itemId, u8 y) { if (sStateDataPtr->moveModeOrigPos != 0xFF) { if (sStateDataPtr->moveModeOrigPos == (u8)itemId) ItemPc_PrintOrRemoveCursorAt(y, 2); else ItemPc_PrintOrRemoveCursorAt(y, 0xFF); } if (itemId != -2) { u16 quantity = ItemPc_GetItemQuantityBySlotId(itemId); ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); ItemPc_AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, 110, y, 0, 0, 0xFF, 1); } } static void ItemPc_PrintOrRemoveCursor(u8 listMenuId, u8 colorIdx) { ItemPc_PrintOrRemoveCursorAt(ListMenuGetYCoordForPrintingArrowCursor(listMenuId), colorIdx); } static void ItemPc_PrintOrRemoveCursorAt(u8 y, u8 colorIdx) { if (colorIdx == 0xFF) { u8 maxWidth = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_WIDTH); u8 maxHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT); FillWindowPixelRect(0, 0, 0, y, maxWidth, maxHeight); } else { ItemPc_AddTextPrinterParameterized(0, FONT_NORMAL, gText_SelectorArrow2, 0, y, 0, 0, 0, colorIdx); } } static void ItemPc_PrintWithdrawItem(void) { ItemPc_AddTextPrinterParameterized(2, FONT_SMALL, gText_WithdrawItem, 0, 1, 0, 1, 0, 0); } static void ItemPc_PlaceTopMenuScrollIndicatorArrows(void) { sStateDataPtr->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 128, 8, 104, sStateDataPtr->nItems - sStateDataPtr->maxShowed + 1, 110, 110, &sListMenuState.scroll); } static void ItemPc_PlaceWithdrawQuantityScrollIndicatorArrows(void) { sStateDataPtr->withdrawQuantitySubmenuCursorPos = 1; sStateDataPtr->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 212, 120, 152, 2, 110, 110, &sStateDataPtr->withdrawQuantitySubmenuCursorPos); } static void ItemPc_RemoveScrollIndicatorArrowPair(void) { if (sStateDataPtr->scrollIndicatorArrowPairId != 0xFF) { RemoveScrollIndicatorArrowPair(sStateDataPtr->scrollIndicatorArrowPairId); sStateDataPtr->scrollIndicatorArrowPairId = 0xFF; } } static void ItemPc_SetCursorPosition(void) { if (sListMenuState.scroll != 0 && sListMenuState.scroll + sStateDataPtr->maxShowed > sStateDataPtr->nItems + 1) sListMenuState.scroll = (sStateDataPtr->nItems + 1) - sStateDataPtr->maxShowed; if (sListMenuState.scroll + sListMenuState.row >= sStateDataPtr->nItems + 1) { if (sStateDataPtr->nItems + 1 < 2) sListMenuState.row = 0; else sListMenuState.row = sStateDataPtr->nItems; } } #define try_free(ptr) ({ \ void ** ptr__ = (void **)&(ptr); \ if (*ptr__ != NULL) \ Free(*ptr__); \ }) static void ItemPc_FreeResources(void) { try_free(sStateDataPtr); try_free(sBg1TilemapBuffer); try_free(sListMenuItems); try_free(sUnusedStringAllocation); FreeAllWindowBuffers(); } static void Task_ItemPcTurnOff1(u8 taskId) { if (sListMenuState.initialized == 1) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); } else { BeginPCScreenEffect_TurnOff(0, 0, 0); PlaySE(SE_PC_OFF); } gTasks[taskId].func = Task_ItemPcTurnOff2; } static void Task_ItemPcTurnOff2(u8 taskId) { s16 * data = gTasks[taskId].data; if (!gPaletteFade.active && !IsPCScreenEffectRunning_TurnOff()) { DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row); if (sStateDataPtr->savedCallback != NULL) SetMainCallback2(sStateDataPtr->savedCallback); else SetMainCallback2(sListMenuState.savedCallback); ItemPc_RemoveScrollIndicatorArrowPair(); ItemPc_FreeResources(); DestroyTask(taskId); } } static u8 ItemPc_GetCursorPosition(void) { return sListMenuState.scroll + sListMenuState.row; } static u16 ItemPc_GetItemIdBySlotId(u16 idx) { return gSaveBlock1Ptr->pcItems[idx].itemId; } static u16 ItemPc_GetItemQuantityBySlotId(u16 idx) { return GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[idx].quantity); } static void ItemPc_CountPcItems(void) { u32 i; ItemPcCompaction(); sStateDataPtr->nItems = 0; for (i = 0; i < PC_ITEMS_COUNT; sStateDataPtr->nItems++, i++) { if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE) break; } sStateDataPtr->maxShowed = sStateDataPtr->nItems + 1 <= 6 ? sStateDataPtr->nItems + 1 : 6; } static void ItemPc_SetScrollPosition(void) { u32 i; if (sListMenuState.row > 3) { for (i = 0; i <= sListMenuState.row - 3; sListMenuState.row--, sListMenuState.scroll++, i++) { if (sListMenuState.scroll + sStateDataPtr->maxShowed == sStateDataPtr->nItems + 1) break; } } } static void ItemPc_SetMessageWindowPalette(int palIdx) { SetBgTilemapPalette(1, 0, 14, 30, 6, palIdx + 1); ScheduleBgCopyTilemapToVram(1); } void ItemPc_SetInitializedFlag(bool8 flag) { sListMenuState.initialized = flag; } static void Task_ItemPcMain(u8 taskId) { s16 * data = gTasks[taskId].data; u16 scroll; u16 row; s32 input; if (!gPaletteFade.active && !IsPCScreenEffectRunning_TurnOn()) { if (JOY_NEW(SELECT_BUTTON)) { ListMenuGetScrollAndRow(data[0], &scroll, &row); if (scroll + row != sStateDataPtr->nItems) { PlaySE(SE_SELECT); ItemPc_MoveItemModeInit(taskId, scroll + row); return; } } input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row); switch (input) { case -1: break; case -2: PlaySE(SE_SELECT); ItemPc_SetInitializedFlag(FALSE); gTasks[taskId].func = Task_ItemPcTurnOff1; break; default: PlaySE(SE_SELECT); ItemPc_SetMessageWindowPalette(1); ItemPc_RemoveScrollIndicatorArrowPair(); data[1] = input; data[2] = ItemPc_GetItemQuantityBySlotId(input); ItemPc_PrintOrRemoveCursor(data[0], 2); gTasks[taskId].func = Task_ItemPcSubmenuInit; break; } } } static void ItemPc_ReturnFromSubmenu(u8 taskId) { ItemPc_SetMessageWindowPalette(0); ItemPc_PlaceTopMenuScrollIndicatorArrows(); gTasks[taskId].func = Task_ItemPcMain; } static void ItemPc_MoveItemModeInit(u8 taskId, s16 pos) { s16 * data = gTasks[taskId].data; ListMenuSetTemplateField(data[0], LISTFIELD_CURSORKIND, 1); data[1] = pos; sStateDataPtr->moveModeOrigPos = pos; StringCopy(gStringVar1, ItemId_GetName(ItemPc_GetItemIdBySlotId(data[1]))); StringExpandPlaceholders(gStringVar4, gOtherText_WhereShouldTheStrVar1BePlaced); FillWindowPixelBuffer(1, 0x00); ItemPc_AddTextPrinterParameterized(1, FONT_NORMAL, gStringVar4, 0, 3, 2, 3, 0, 0); UpdateSwapLinePos(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0])); SetSwapLineInvisibility(FALSE); ItemPc_PrintOrRemoveCursor(data[0], 2); gTasks[taskId].func = Task_ItemPcMoveItemModeRun; } static void Task_ItemPcMoveItemModeRun(u8 taskId) { s16 * data = gTasks[taskId].data; ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row); UpdateSwapLinePos(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0])); if (JOY_NEW(A_BUTTON | SELECT_BUTTON)) { PlaySE(SE_SELECT); sStateDataPtr->moveModeOrigPos = 0xFF; ItemPc_InsertItemIntoNewSlot(taskId, sListMenuState.scroll + sListMenuState.row); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); sStateDataPtr->moveModeOrigPos = 0xFF; ItemPc_MoveItemModeCancel(taskId, sListMenuState.scroll + sListMenuState.row); } } static void ItemPc_InsertItemIntoNewSlot(u8 taskId, u32 pos) { s16 * data = gTasks[taskId].data; if (data[1] == pos || data[1] == pos - 1) ItemPc_MoveItemModeCancel(taskId, pos); else { MoveItemSlotInList(gSaveBlock1Ptr->pcItems, data[1], pos); DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row); if (data[1] < pos) sListMenuState.row--; ItemPc_BuildListMenuTemplate(); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row); SetSwapLineInvisibility(TRUE); gTasks[taskId].func = Task_ItemPcMain; } } static void ItemPc_MoveItemModeCancel(u8 taskId, u32 pos) { s16 * data = gTasks[taskId].data; DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row); if (data[1] < pos) sListMenuState.row--; ItemPc_BuildListMenuTemplate(); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row); SetSwapLineInvisibility(TRUE); gTasks[taskId].func = Task_ItemPcMain; } static void Task_ItemPcSubmenuInit(u8 taskId) { s16 * data = gTasks[taskId].data; u8 windowId; ItemPc_SetBorderStyleOnWindow(4); windowId = ItemPc_GetOrCreateSubwindow(0); PrintTextArray(4, FONT_NORMAL, 8, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 3, sItemPcSubmenuOptions); Menu_InitCursor(4, FONT_NORMAL, 0, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 3, 0); CopyItemName(ItemPc_GetItemIdBySlotId(data[1]), gStringVar1); StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected); ItemPc_AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Task_ItemPcSubmenuRun; } static void Task_ItemPcSubmenuRun(u8 taskId) { s8 input = Menu_ProcessInputNoWrapAround(); switch (input) { case -1: PlaySE(SE_SELECT); Task_ItemPcCancel(taskId); break; case -2: break; default: PlaySE(SE_SELECT); sItemPcSubmenuOptions[input].func.void_u8(taskId); } } static void Task_ItemPcWithdraw(u8 taskId) { s16 * data = gTasks[taskId].data; ClearStdWindowAndFrameToTransparent(4, FALSE); ItemPc_DestroySubwindow(0); ClearWindowTilemap(4); data[8] = 1; if (ItemPc_GetItemQuantityBySlotId(data[1]) == 1) { PutWindowTilemap(0); ScheduleBgCopyTilemapToVram(0); ItemPc_DoWithdraw(taskId); } else { PutWindowTilemap(0); ItemPc_WithdrawMultipleInitWindow(data[1]); ItemPc_PlaceWithdrawQuantityScrollIndicatorArrows(); gTasks[taskId].func = Task_ItemPcHandleWithdrawMultiple; } } static void ItemPc_DoWithdraw(u8 taskId) { s16 * data = gTasks[taskId].data; u16 itemId = ItemPc_GetItemIdBySlotId(data[1]); u8 windowId; if (AddBagItem(itemId, data[8]) == TRUE) { ItemUse_SetQuestLogEvent(QL_EVENT_WITHDREW_ITEM_PC, NULL, itemId, 0xFFFF); CopyItemName(itemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_WithdrewQuantItem); windowId = ItemPc_GetOrCreateSubwindow(2); AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, 0, 2, 0, NULL); gTasks[taskId].func = Task_ItemPcWaitButtonAndFinishWithdrawMultiple; } else { windowId = ItemPc_GetOrCreateSubwindow(2); AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_NoMoreRoomInBag, 0, 2, 0, NULL); gTasks[taskId].func = Task_ItemPcWaitButtonWithdrawMultipleFailed; } } static void Task_ItemPcWaitButtonAndFinishWithdrawMultiple(u8 taskId) { s16 * data = gTasks[taskId].data; u16 itemId; if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); itemId = ItemPc_GetItemIdBySlotId(data[1]); RemovePCItem(itemId, data[8]); ItemPcCompaction(); Task_ItemPcCleanUpWithdraw(taskId); } } static void Task_ItemPcWaitButtonWithdrawMultipleFailed(u8 taskId) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); Task_ItemPcCleanUpWithdraw(taskId); } } static void Task_ItemPcCleanUpWithdraw(u8 taskId) { s16 * data = gTasks[taskId].data; ItemPc_DestroySubwindow(2); PutWindowTilemap(1); DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row); ItemPc_CountPcItems(); ItemPc_SetCursorPosition(); ItemPc_BuildListMenuTemplate(); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row); ScheduleBgCopyTilemapToVram(0); ItemPc_ReturnFromSubmenu(taskId); } static void ItemPc_WithdrawMultipleInitWindow(u16 slotId) { u16 itemId = ItemPc_GetItemIdBySlotId(slotId); CopyItemName(itemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_WithdrawHowMany); AddTextPrinterParameterized(ItemPc_GetOrCreateSubwindow(1), FONT_NORMAL, gStringVar4, 0, 2, 0, NULL); ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 3); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); ItemPc_SetBorderStyleOnWindow(3); ItemPc_AddTextPrinterParameterized(3, FONT_SMALL, gStringVar4, 8, 10, 1, 0, 0, 1); ScheduleBgCopyTilemapToVram(0); } static void UpdateWithdrawQuantityDisplay(s16 quantity) { FillWindowPixelRect(3, PIXEL_FILL(1), 10, 10, 28, 12); ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, 3); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); ItemPc_AddTextPrinterParameterized(3, FONT_SMALL, gStringVar4, 8, 10, 1, 0, 0, 1); } static void Task_ItemPcHandleWithdrawMultiple(u8 taskId) { s16 * data = gTasks[taskId].data; if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) UpdateWithdrawQuantityDisplay(data[8]); else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); ItemPc_DestroySubwindow(1); ClearWindowTilemap(3); PutWindowTilemap(0); ItemPc_PrintOrRemoveCursor(data[0], 1); ScheduleBgCopyTilemapToVram(0); ItemPc_RemoveScrollIndicatorArrowPair(); ItemPc_DoWithdraw(taskId); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); ClearStdWindowAndFrameToTransparent(3, FALSE); ItemPc_DestroySubwindow(1); ClearWindowTilemap(3); PutWindowTilemap(0); PutWindowTilemap(1); ItemPc_PrintOrRemoveCursor(data[0], 1); ScheduleBgCopyTilemapToVram(0); ItemPc_RemoveScrollIndicatorArrowPair(); ItemPc_ReturnFromSubmenu(taskId); } } static void Task_ItemPcGive(u8 taskId) { if (CalculatePlayerPartyCount() == 0) { ClearStdWindowAndFrameToTransparent(4, FALSE); ItemPc_DestroySubwindow(0); ClearWindowTilemap(4); PutWindowTilemap(0); ItemPc_PrintOnWindow5WithContinueTask(taskId, gText_ThereIsNoPokemon, gTask_ItemPcWaitButtonAndExitSubmenu); } else { sStateDataPtr->savedCallback = ItemPc_CB2_SwitchToPartyMenu; Task_ItemPcTurnOff1(taskId); } } static void ItemPc_CB2_SwitchToPartyMenu(void) { InitPartyMenu(0, 0, 6, 0, 6, Task_HandleChooseMonInput, ItemPc_CB2_ReturnFromPartyMenu); gPartyMenu.bagItem = ItemPc_GetItemIdBySlotId(ItemPc_GetCursorPosition()); } static void ItemPc_CB2_ReturnFromPartyMenu(void) { ItemPc_Init(1, NULL); } static void gTask_ItemPcWaitButtonAndExitSubmenu(u8 taskId) { s16 * data = gTasks[taskId].data; if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); ClearDialogWindowAndFrameToTransparent(5, FALSE); ClearWindowTilemap(5); PutWindowTilemap(1); ItemPc_PrintOrRemoveCursor(data[0], 1); ScheduleBgCopyTilemapToVram(0); ItemPc_ReturnFromSubmenu(taskId); } } static void Task_ItemPcCancel(u8 taskId) { s16 * data = gTasks[taskId].data; ClearStdWindowAndFrameToTransparent(4, FALSE); ItemPc_DestroySubwindow(0); ClearWindowTilemap(4); PutWindowTilemap(0); PutWindowTilemap(1); ItemPc_PrintOrRemoveCursor(data[0], 1); ScheduleBgCopyTilemapToVram(0); ItemPc_ReturnFromSubmenu(taskId); } static void ItemPc_InitWindows(void) { u32 i; InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); LoadUserWindowGfx(0, 0x3C0, BG_PLTT_ID(14)); LoadStdWindowGfx(0, 0x3A3, BG_PLTT_ID(12)); LoadMenuMessageWindowGfx(0, 0x3AC, BG_PLTT_ID(11)); LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(13), PLTT_SIZE_4BPP); LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZE_4BPP); for (i = 0; i < 3; i++) { FillWindowPixelBuffer(i, 0x00); PutWindowTilemap(i); } ScheduleBgCopyTilemapToVram(0); for (i = 0; i < 3; i++) sSubmenuWindowIds[i] = 0xFF; } static void unused_ItemPc_AddTextPrinterParameterized(u8 windowId, const u8 * string, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed) { struct TextPrinterTemplate template; template.currentChar = string; template.windowId = windowId; template.fontId = FONT_NORMAL_COPY_2; template.x = x; template.y = y; template.currentX = x; template.currentY = y; template.fgColor = 2; template.bgColor = 0; template.shadowColor = 3; template.unk = GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_UNKNOWN); template.letterSpacing = letterSpacing + GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LETTER_SPACING); template.lineSpacing = lineSpacing + GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LINE_SPACING); AddTextPrinter(&template, speed, NULL); } static void ItemPc_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx) { AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str); } static void ItemPc_SetBorderStyleOnWindow(u8 windowId) { DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x3C0, 14); } static u8 ItemPc_GetOrCreateSubwindow(u8 idx) { if (sSubmenuWindowIds[idx] == 0xFF) { sSubmenuWindowIds[idx] = AddWindow(&sSubwindowTemplates[idx]); DrawStdFrameWithCustomTileAndPalette(sSubmenuWindowIds[idx], TRUE, 0x3A3, 12); } return sSubmenuWindowIds[idx]; } static void ItemPc_DestroySubwindow(u8 idx) { ClearStdWindowAndFrameToTransparent(sSubmenuWindowIds[idx], FALSE); ClearWindowTilemap(sSubmenuWindowIds[idx]); // redundant RemoveWindow(sSubmenuWindowIds[idx]); sSubmenuWindowIds[idx] = 0xFF; } static u8 ItemPc_GetSubwindow(u8 idx) { return sSubmenuWindowIds[idx]; } static void ItemPc_PrintOnWindow5WithContinueTask(u8 taskId, const u8 * str, TaskFunc taskFunc) { DisplayMessageAndContinueTask(taskId, 5, 0x3AC, 0x0B, FONT_NORMAL, GetTextSpeedSetting(), str, taskFunc); ScheduleBgCopyTilemapToVram(0); } ================================================ FILE: src/item_use.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "berry_pouch.h" #include "berry_powder.h" #include "bike.h" #include "coins.h" #include "event_data.h" #include "field_effect.h" #include "field_fadetransition.h" #include "event_object_movement.h" #include "field_player_avatar.h" #include "field_specials.h" #include "field_weather.h" #include "fieldmap.h" #include "item.h" #include "item_menu.h" #include "item_use.h" #include "itemfinder.h" #include "mail.h" #include "event_object_lock.h" #include "metatile_behavior.h" #include "new_menu_helpers.h" #include "overworld.h" #include "party_menu.h" #include "quest_log.h" #include "region_map.h" #include "script.h" #include "strings.h" #include "task.h" #include "teachy_tv.h" #include "tm_case.h" #include "vs_seeker.h" #include "constants/sound.h" #include "constants/items.h" #include "constants/item_effects.h" #include "constants/maps.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/field_weather.h" static EWRAM_DATA void (*sItemUseOnFieldCB)(u8 taskId) = NULL; static void FieldCB_FadeInFromBlack(void); static void Task_WaitFadeIn_CallItemUseOnFieldCB(u8 taskId); static void Task_ItemUse_CloseMessageBoxAndReturnToField(u8 taskId); static void Task_ItemUseWaitForFade(u8 taskId); static bool8 FieldCB2_UseItemFromField(void); static void CB2_CheckMail(void); static void ItemUseOnFieldCB_Bicycle(u8 taskId); static bool8 CanFish(void); static void ItemUseOnFieldCB_Rod(u8 taskId); static void Task_PlayPokeFlute(u8 taskId); static void Task_DisplayPokeFluteMessage(u8 taskId); static void InitTMCaseFromBag(void); static void Task_InitTMCaseFromField(u8 taskId); static void InitBerryPouchFromBag(void); static void Task_InitBerryPouchFromField(u8 taskId); static void InitBerryPouchFromBattle(void); static void InitTeachyTvFromBag(void); static void Task_InitTeachyTvFromField(u8 taskId); static void Task_UseRepel(u8 taskId); static void RemoveUsedItem(void); static void Task_UsedBlackWhiteFlute(u8 taskId); static void ItemUseOnFieldCB_EscapeRope(u8 taskId); static void UseTownMapFromBag(void); static void Task_UseTownMapFromField(u8 taskId); static void UseFameCheckerFromBag(void); static void Task_UseFameCheckerFromField(u8 taskId); static void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId); static void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId); // unknown unused data. // It's curiously about the size of an array of values indexed by species (including padding), // but the arrangement of values is not sensible (e.g., not giving all "old unown" the same value). static const u8 sUnused[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x03, 0x00, 0x7c, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static void (*const sExitCallbackByItemType[])(void) = { [ITEM_TYPE_PARTY_MENU - 1] = CB2_ShowPartyMenuForItemUse, [ITEM_TYPE_FIELD - 1] = CB2_ReturnToField, [ITEM_TYPE_UNUSED - 1] = NULL, [ITEM_TYPE_BAG_MENU - 1] = NULL, }; static void SetUpItemUseCallback(u8 taskId) { u8 itemType; if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY) itemType = gTasks[taskId].data[4] - 1; else itemType = ItemId_GetType(gSpecialVar_ItemId) - 1; if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH) { BerryPouch_SetExitCallback(sExitCallbackByItemType[itemType]); BerryPouch_StartFadeToExitCallback(taskId); } else { ItemMenu_SetExitCallback(sExitCallbackByItemType[itemType]); if (itemType == ITEM_TYPE_FIELD - 1) Bag_BeginCloseWin0Animation(); ItemMenu_StartFadeToExitCallback(taskId); } } static void SetUpItemUseOnFieldCallback(u8 taskId) { if (gTasks[taskId].data[3] != 1) { gFieldCallback = FieldCB_FadeInFromBlack; SetUpItemUseCallback(taskId); } else sItemUseOnFieldCB(taskId); } static void FieldCB_FadeInFromBlack(void) { FadeInFromBlack(); CreateTask(Task_WaitFadeIn_CallItemUseOnFieldCB, 8); } static void Task_WaitFadeIn_CallItemUseOnFieldCB(u8 taskId) { if (IsWeatherNotFadingIn() == TRUE) sItemUseOnFieldCB(taskId); } static void DisplayItemMessageInCurrentContext(u8 taskId, bool8 inField, u8 fontId, const u8 *str) { StringExpandPlaceholders(gStringVar4, str); if (inField == FALSE) DisplayItemMessageInBag(taskId, fontId, gStringVar4, Task_ReturnToBagFromContextMenu); else DisplayItemMessageOnField(taskId, fontId, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField); } static void PrintNotTheTimeToUseThat(u8 taskId, bool8 inField) { DisplayItemMessageInCurrentContext(taskId, inField, FONT_MALE, gText_OakForbidsUseOfItemHere); } static void Task_ItemUse_CloseMessageBoxAndReturnToField(u8 taskId) { ClearDialogWindowAndFrame(0, 1); DestroyTask(taskId); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); } u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId) { if (ItemId_GetPocket(itemId) == POCKET_TM_CASE) return 1; else if (ItemId_GetFieldFunc(itemId) == FieldUseFunc_EvoItem) return 2; else return 0; } static void SetFieldCallback2ForItemUse(void) { gFieldCallback2 = FieldCB2_UseItemFromField; } static bool8 FieldCB2_UseItemFromField(void) { FreezeObjectEvents(); LockPlayerFieldControls(); FadeInFromBlack(); CreateTask(Task_ItemUseWaitForFade, 10); gExitStairsMovementDisabled = FALSE; return TRUE; } static void Task_ItemUseWaitForFade(u8 taskId) { if (IsWeatherNotFadingIn() == TRUE) { UnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); } } void FieldUseFunc_Mail(u8 taskId) { ItemMenu_SetExitCallback(CB2_CheckMail); ItemMenu_StartFadeToExitCallback(taskId); } static void CB2_CheckMail(void) { struct Mail mail; mail.itemId = gSpecialVar_ItemId; ReadMail(&mail, CB2_BagMenuFromStartMenu, FALSE); } void FieldUseFunc_Bike(u8 taskId) { s16 x, y; u8 behavior; PlayerGetDestCoords(&x, &y); behavior = MapGridGetMetatileBehaviorAt(x, y); if (FlagGet(FLAG_SYS_ON_CYCLING_ROAD) == TRUE || MetatileBehavior_IsVerticalRail(behavior) == TRUE || MetatileBehavior_IsHorizontalRail(behavior) == TRUE || MetatileBehavior_IsIsolatedVerticalRail(behavior) == TRUE || MetatileBehavior_IsIsolatedHorizontalRail(behavior) == TRUE) DisplayItemMessageInCurrentContext(taskId, gTasks[taskId].data[3], FONT_NORMAL, gText_CantDismountBike); else if (Overworld_IsBikingAllowed() == TRUE && !IsBikingDisallowedByPlayer()) { sItemUseOnFieldCB = ItemUseOnFieldCB_Bicycle; SetUpItemUseOnFieldCallback(taskId); } else PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); } static void ItemUseOnFieldCB_Bicycle(u8 taskId) { if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) PlaySE(SE_BIKE_BELL); GetOnOffBike(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); } void FieldUseFunc_Rod(u8 taskId) { if (CanFish() == TRUE) { sItemUseOnFieldCB = ItemUseOnFieldCB_Rod; SetUpItemUseOnFieldCallback(taskId); } else PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); } static bool8 CanFish(void) { s16 x, y; u16 behavior; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); behavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsWaterfall(behavior)) return FALSE; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER)) return FALSE; if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) { if (IsPlayerFacingSurfableFishableWater()) return TRUE; } else { if (MetatileBehavior_IsSurfable(behavior) && MapGridGetCollisionAt(x, y) == 0) return TRUE; if (MetatileBehavior_IsBridge(behavior) == TRUE) return TRUE; } return FALSE; } static void ItemUseOnFieldCB_Rod(u8 taskId) { StartFishing(ItemId_GetSecondaryId(gSpecialVar_ItemId)); DestroyTask(taskId); } void ItemUseOutOfBattle_Itemfinder(u8 taskId) { IncrementGameStat(GAME_STAT_USED_ITEMFINDER); sItemUseOnFieldCB = ItemUseOnFieldCB_Itemfinder; SetUpItemUseOnFieldCallback(taskId); } void FieldUseFunc_CoinCase(u8 taskId) { ConvertIntToDecimalStringN(gStringVar1, GetCoins(), STR_CONV_MODE_LEFT_ALIGN, 4); StringExpandPlaceholders(gStringVar4, gText_CoinCase); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); if (gTasks[taskId].data[3] == 0) DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_ReturnToBagFromContextMenu); else DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField); } void FieldUseFunc_PowderJar(u8 taskId) { ConvertIntToDecimalStringN(gStringVar1, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 5); StringExpandPlaceholders(gStringVar4, gText_PowderQty); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); if (gTasks[taskId].data[3] == 0) DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_ReturnToBagFromContextMenu); else DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField); } void FieldUseFunc_SootSack(u8 taskId) { ConvertIntToDecimalStringN(gStringVar1, GetAshCount(), STR_CONV_MODE_LEFT_ALIGN, 5); StringExpandPlaceholders(gStringVar4, gText_AshQuantity); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); if (gTasks[taskId].data[3] == 0) DisplayItemMessageInBag(taskId, 2, gStringVar4, Task_ReturnToBagFromContextMenu); else DisplayItemMessageOnField(taskId, 2, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField); } u16 GetAshCount(void) { u16 *ashGatherCount; ashGatherCount = GetVarPointer(VAR_ASH_GATHER_COUNT); return *ashGatherCount; } void FieldUseFunc_PokeFlute(u8 taskId) { bool8 wokeSomeoneUp = FALSE; u32 i; for (i = 0; i < CalculatePlayerPartyCount(); i++) { if (!ExecuteTableBasedItemEffect(&gPlayerParty[i], ITEM_AWAKENING, i, 0)) wokeSomeoneUp = TRUE; } if (wokeSomeoneUp) { ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); if (gTasks[taskId].data[3] == 0) DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_PlayedPokeFlute, Task_PlayPokeFlute); else DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_PlayedPokeFlute, Task_PlayPokeFlute); } else { if (gTasks[taskId].data[3] == 0) DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_PlayedPokeFluteCatchy, Task_ReturnToBagFromContextMenu); else DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_PlayedPokeFluteCatchy, Task_ItemUse_CloseMessageBoxAndReturnToField); } } static void Task_PlayPokeFlute(u8 taskId) { PlayFanfareByFanfareNum(FANFARE_POKE_FLUTE); gTasks[taskId].func = Task_DisplayPokeFluteMessage; } static void Task_DisplayPokeFluteMessage(u8 taskId) { if (WaitFanfare(FALSE)) { if (gTasks[taskId].data[3] == 0) DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_PokeFluteAwakenedMon, Task_ReturnToBagFromContextMenu); else DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_PokeFluteAwakenedMon, Task_ItemUse_CloseMessageBoxAndReturnToField); } } static void DoSetUpItemUseCallback(u8 taskId) { SetUpItemUseCallback(taskId); } void FieldUseFunc_Medicine(u8 taskId) { gItemUseCB = ItemUseCB_Medicine; DoSetUpItemUseCallback(taskId); } void FieldUseFunc_Ether(u8 taskId) { gItemUseCB = ItemUseCB_TryRestorePP; DoSetUpItemUseCallback(taskId); } void FieldUseFunc_PpUp(u8 taskId) { gItemUseCB = ItemUseCB_PPUp; DoSetUpItemUseCallback(taskId); } void FieldUseFunc_RareCandy(u8 taskId) { gItemUseCB = ItemUseCB_RareCandy; DoSetUpItemUseCallback(taskId); } void FieldUseFunc_EvoItem(u8 taskId) { gItemUseCB = ItemUseCB_EvolutionStone; DoSetUpItemUseCallback(taskId); } void FieldUseFunc_SacredAsh(u8 taskId) { gItemUseCB = ItemUseCB_SacredAsh; SetUpItemUseCallback(taskId); } void FieldUseFunc_TmCase(u8 taskId) { if (gTasks[taskId].data[3] == 0) { ItemMenu_SetExitCallback(InitTMCaseFromBag); ItemMenu_StartFadeToExitCallback(taskId); } else { StopPokemonLeagueLightingEffectTask(); FadeScreen(FADE_TO_BLACK, 0); gTasks[taskId].func = Task_InitTMCaseFromField; } } static void InitTMCaseFromBag(void) { InitTMCase(TMCASE_FIELD, CB2_BagMenuFromStartMenu, FALSE); } static void Task_InitTMCaseFromField(u8 taskId) { if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); SetFieldCallback2ForItemUse(); InitTMCase(TMCASE_FIELD, CB2_ReturnToField, TRUE); DestroyTask(taskId); } } void FieldUseFunc_BerryPouch(u8 taskId) { if (gTasks[taskId].data[3] == 0) { ItemMenu_SetExitCallback(InitBerryPouchFromBag); ItemMenu_StartFadeToExitCallback(taskId); } else { StopPokemonLeagueLightingEffectTask(); FadeScreen(FADE_TO_BLACK, 0); gTasks[taskId].func = Task_InitBerryPouchFromField; } } static void InitBerryPouchFromBag(void) { InitBerryPouch(BERRYPOUCH_FROMFIELD, CB2_BagMenuFromStartMenu, 0); } static void Task_InitBerryPouchFromField(u8 taskId) { if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); SetFieldCallback2ForItemUse(); InitBerryPouch(BERRYPOUCH_FROMFIELD, CB2_ReturnToField, 1); DestroyTask(taskId); } } void BattleUseFunc_BerryPouch(u8 taskId) { ItemMenu_SetExitCallback(InitBerryPouchFromBattle); ItemMenu_StartFadeToExitCallback(taskId); } static void InitBerryPouchFromBattle(void) { InitBerryPouch(BERRYPOUCH_FROMBATTLE, CB2_BagMenuFromBattle, 0); } void FieldUseFunc_TeachyTv(u8 taskId) { ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); if (gTasks[taskId].data[3] == 0) { ItemMenu_SetExitCallback(InitTeachyTvFromBag); ItemMenu_StartFadeToExitCallback(taskId); } else { StopPokemonLeagueLightingEffectTask(); FadeScreen(FADE_TO_BLACK, 0); gTasks[taskId].func = Task_InitTeachyTvFromField; } } static void InitTeachyTvFromBag(void) { InitTeachyTvController(0, CB2_BagMenuFromStartMenu); } static void Task_InitTeachyTvFromField(u8 taskId) { if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); SetFieldCallback2ForItemUse(); InitTeachyTvController(0, CB2_ReturnToField); DestroyTask(taskId); } } void FieldUseFunc_Repel(u8 taskId) { if (VarGet(VAR_REPEL_STEP_COUNT) == 0) { PlaySE(SE_REPEL); gTasks[taskId].func = Task_UseRepel; } else // An earlier repel is still in effect DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_RepelEffectsLingered, Task_ReturnToBagFromContextMenu); } static void Task_UseRepel(u8 taskId) { if (!IsSEPlaying()) { ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId)); VarSet(VAR_LAST_REPEL_USED, gSpecialVar_ItemId); RemoveUsedItem(); DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_ReturnToBagFromContextMenu); } } static void RemoveUsedItem(void) { RemoveBagItem(gSpecialVar_ItemId, 1); Pocket_CalculateNItemsAndMaxShowed(ItemId_GetPocket(gSpecialVar_ItemId)); PocketCalculateInitialCursorPosAndItemsAbove(ItemId_GetPocket(gSpecialVar_ItemId)); CopyItemName(gSpecialVar_ItemId, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2); } void FieldUseFunc_BlackWhiteFlute(u8 taskId) { ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE) { FlagSet(FLAG_SYS_WHITE_FLUTE_ACTIVE); FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE); CopyItemName(gSpecialVar_ItemId, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured); gTasks[taskId].func = Task_UsedBlackWhiteFlute; gTasks[taskId].data[8] = 0; } else if (gSpecialVar_ItemId == ITEM_BLACK_FLUTE) { FlagSet(FLAG_SYS_BLACK_FLUTE_ACTIVE); FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE); CopyItemName(gSpecialVar_ItemId, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildRepelled); gTasks[taskId].func = Task_UsedBlackWhiteFlute; gTasks[taskId].data[8] = 0; } } static void Task_UsedBlackWhiteFlute(u8 taskId) { if (++gTasks[taskId].data[8] > 7) { PlaySE(SE_GLASS_FLUTE); DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_ReturnToBagFromContextMenu); } } bool8 CanUseEscapeRopeOnCurrMap(void) { if (gMapHeader.allowEscaping) return TRUE; else return FALSE; } void ItemUseOutOfBattle_EscapeRope(u8 taskId) { if (CanUseEscapeRopeOnCurrMap() == TRUE) { ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, gMapHeader.regionMapSectionId); sItemUseOnFieldCB = ItemUseOnFieldCB_EscapeRope; SetUpItemUseOnFieldCallback(taskId); } else PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); } static void ItemUseOnFieldCB_EscapeRope(u8 taskId) { Overworld_ResetStateAfterDigEscRope(); RemoveUsedItem(); gTasks[taskId].data[0] = 0; DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_UseDigEscapeRopeOnField); } void Task_UseDigEscapeRopeOnField(u8 taskId) { ResetInitialPlayerAvatarState(); StartEscapeRopeFieldEffect(); DestroyTask(taskId); } void FieldUseFunc_TownMap(u8 taskId) { if (gTasks[taskId].data[3] == 0) { ItemMenu_SetExitCallback(UseTownMapFromBag); ItemMenu_StartFadeToExitCallback(taskId); } else { StopPokemonLeagueLightingEffectTask(); FadeScreen(FADE_TO_BLACK, 0); gTasks[taskId].func = Task_UseTownMapFromField; } } static void UseTownMapFromBag(void) { //if(gMapHeader.regionMapSectionId <= 0x55) //MAPSEC_SKY_PILLAR //InitRegionMapWithExitCB(REGIONMAP_TYPE_HOENN, CB2_BagMenuFromStartMenu); //else InitRegionMapWithExitCB(REGIONMAP_TYPE_NORMAL, CB2_BagMenuFromStartMenu); } static void Task_UseTownMapFromField(u8 taskId) { if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); SetFieldCallback2ForItemUse(); InitRegionMapWithExitCB(REGIONMAP_TYPE_NORMAL, CB2_ReturnToField); DestroyTask(taskId); } } void FieldUseFunc_FameChecker(u8 taskId) { ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); if (gTasks[taskId].data[3] == 0) { ItemMenu_SetExitCallback(UseFameCheckerFromBag); ItemMenu_StartFadeToExitCallback(taskId); } else { StopPokemonLeagueLightingEffectTask(); FadeScreen(FADE_TO_BLACK, 0); gTasks[taskId].func = Task_UseFameCheckerFromField; } } static void UseFameCheckerFromBag(void) { UseFameChecker(CB2_BagMenuFromStartMenu); } static void Task_UseFameCheckerFromField(u8 taskId) { if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); SetFieldCallback2ForItemUse(); UseFameChecker(CB2_ReturnToField); DestroyTask(taskId); } } void FieldUseFunc_VsSeeker(u8 taskId) { if ((gMapHeader.mapType != MAP_TYPE_ROUTE && gMapHeader.mapType != MAP_TYPE_TOWN && gMapHeader.mapType != MAP_TYPE_CITY) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VIRIDIAN_FOREST) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(VIRIDIAN_FOREST) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(MT_EMBER_EXTERIOR) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(THREE_ISLAND_BERRY_FOREST) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_PATTERN_BUSH)))) { PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); } else { sItemUseOnFieldCB = Task_VsSeeker_0; SetUpItemUseOnFieldCallback(taskId); } } void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId) { Task_ItemUse_CloseMessageBoxAndReturnToField(taskId); } void BattleUseFunc_PokeBallEtc(u8 taskId) { if (!IsPlayerPartyAndPokemonStorageFull()) { RemoveBagItem(gSpecialVar_ItemId, 1); Bag_BeginCloseWin0Animation(); ItemMenu_StartFadeToExitCallback(taskId); } else DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_BoxFull, Task_ReturnToBagFromContextMenu); } void BattleUseFunc_PokeFlute(u8 taskId) { Bag_BeginCloseWin0Animation(); ItemMenu_StartFadeToExitCallback(taskId); } void BattleUseFunc_StatBooster(u8 taskId) { if (ExecuteTableBasedItemEffect(&gPlayerParty[gBattlerPartyIndexes[gBattlerInMenuId]], gSpecialVar_ItemId, gBattlerPartyIndexes[gBattlerInMenuId], 0)) DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_WontHaveEffect, Task_ReturnToBagFromContextMenu); else { gTasks[taskId].data[8] = 0; gTasks[taskId].func = Task_BattleUse_StatBooster_DelayAndPrint; } } static void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId) { s16 *data = gTasks[taskId].data; if (++data[8] > 7) { u16 itemId = gSpecialVar_ItemId; PlaySE(SE_USE_ITEM); RemoveBagItem(itemId, 1); DisplayItemMessageInBag(taskId, FONT_NORMAL, Battle_PrintStatBoosterEffectMessage(itemId), Task_BattleUse_StatBooster_WaitButton_ReturnToBattle); } } static void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { Bag_BeginCloseWin0Animation(); ItemMenu_StartFadeToExitCallback(taskId); } } static void ItemUse_SwitchToPartyMenuInBattle(u8 taskId) { if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH) { BerryPouch_SetExitCallback(EnterPartyFromItemMenuInBattle); BerryPouch_StartFadeToExitCallback(taskId); } else { ItemMenu_SetExitCallback(EnterPartyFromItemMenuInBattle); ItemMenu_StartFadeToExitCallback(taskId); } } void BattleUseFunc_Medicine(u8 taskId) { gItemUseCB = ItemUseCB_MedicineStep; ItemUse_SwitchToPartyMenuInBattle(taskId); } // Unused. Sacred Ash cannot be used in battle static void BattleUseFunc_SacredAsh(u8 taskId) { gItemUseCB = ItemUseCB_SacredAsh; ItemUse_SwitchToPartyMenuInBattle(taskId); } void BattleUseFunc_Ether(u8 taskId) { gItemUseCB = ItemUseCB_TryRestorePP; ItemUse_SwitchToPartyMenuInBattle(taskId); } void BattleUseFunc_PokeDoll(u8 taskId) { if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) { RemoveUsedItem(); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, 0, gSpecialVar_ItemId, 0xFFFF); DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, ItemMenu_StartFadeToExitCallback); } else PrintNotTheTimeToUseThat(taskId, 0); } void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) { switch (GetItemEffectType(gSpecialVar_ItemId)) { case ITEM_EFFECT_HEAL_HP: case ITEM_EFFECT_CURE_POISON: case ITEM_EFFECT_CURE_SLEEP: case ITEM_EFFECT_CURE_BURN: case ITEM_EFFECT_CURE_FREEZE: case ITEM_EFFECT_CURE_PARALYSIS: case ITEM_EFFECT_CURE_ALL_STATUS: case ITEM_EFFECT_ATK_EV: case ITEM_EFFECT_HP_EV: case ITEM_EFFECT_SPATK_EV: case ITEM_EFFECT_SPDEF_EV: case ITEM_EFFECT_SPEED_EV: case ITEM_EFFECT_DEF_EV: gTasks[taskId].data[4] = 1; FieldUseFunc_Medicine(taskId); break; case ITEM_EFFECT_SACRED_ASH: gTasks[taskId].data[4] = 1; FieldUseFunc_SacredAsh(taskId); break; case ITEM_EFFECT_RAISE_LEVEL: gTasks[taskId].data[4] = 1; FieldUseFunc_RareCandy(taskId); break; case ITEM_EFFECT_PP_UP: case ITEM_EFFECT_PP_MAX: gTasks[taskId].data[4] = 1; FieldUseFunc_PpUp(taskId); break; case ITEM_EFFECT_HEAL_PP: gTasks[taskId].data[4] = 1; FieldUseFunc_Ether(taskId); break; default: gTasks[taskId].data[4] = 4; FieldUseFunc_OakStopsYou(taskId); } } void ItemUseInBattle_EnigmaBerry(u8 taskId) { switch (GetItemEffectType(gSpecialVar_ItemId)) { case ITEM_EFFECT_X_ITEM: BattleUseFunc_StatBooster(taskId); break; case ITEM_EFFECT_HEAL_HP: case ITEM_EFFECT_CURE_POISON: case ITEM_EFFECT_CURE_SLEEP: case ITEM_EFFECT_CURE_BURN: case ITEM_EFFECT_CURE_FREEZE: case ITEM_EFFECT_CURE_PARALYSIS: case ITEM_EFFECT_CURE_CONFUSION: case ITEM_EFFECT_CURE_INFATUATION: case ITEM_EFFECT_CURE_ALL_STATUS: BattleUseFunc_Medicine(taskId); break; case ITEM_EFFECT_HEAL_PP: BattleUseFunc_Ether(taskId); break; default: FieldUseFunc_OakStopsYou(taskId); } } void FieldUseFunc_OakStopsYou(u8 taskId) { if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH) { StringExpandPlaceholders(gStringVar4, gText_OakForbidsUseOfItemHere); DisplayItemMessageInBerryPouch(taskId, FONT_MALE, gStringVar4, Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu); } else PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); } void ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon *pokemon, u16 itemId, u16 param) { struct QuestLogEvent_Item *data = Alloc(sizeof(*data)); data->itemId = itemId; data->itemParam = param; if (pokemon != NULL) data->species = GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG); else data->species = 0xFFFF; SetQuestLogEvent(eventId, (void *)data); Free(data); } void ItemUseOutOfBattle_ReduceEV(u8 taskId) { gItemUseCB = ItemUseCB_ReduceEV; DoSetUpItemUseCallback(taskId); } ================================================ FILE: src/itemfinder.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "new_menu_helpers.h" #include "strings.h" #include "event_scripts.h" #include "event_object_lock.h" #include "script.h" #include "event_data.h" #include "field_player_avatar.h" #include "field_specials.h" #include "fieldmap.h" #include "constants/songs.h" static void Task_NoResponse_CleanUp(u8 taskId); static void Task_ItemfinderResponseSoundsAndAnims(u8 taskId); static void Task_ItemfinderUnderfootSoundsAndAnims(u8 taskId); static bool8 HiddenItemIsWithinRangeOfPlayer(const struct MapEvents * events, u8 taskId); static void SetUnderfootHiddenItem(u8 taskId, u32 hiddenItem); static void SetNormalHiddenItem(u8 taskId); static void FindHiddenItemsInConnectedMaps(u8 taskId); static void RegisterHiddenItemRelativeCoordsIfCloser(u8 taskId, s16 dx, s16 dy); static u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY); static void Task_ItemfinderResponsePrintMessage(u8 taskId); static void Task_ItemfinderResponseCleanUp(u8 taskId); static void Task_ItemfinderUnderfootPrintMessage(u8 taskId); static void Task_ItemfinderUnderfootDigUpItem(u8 taskId); static void DestroyArrowAndStarTiles(void); static void LoadArrowAndStarTiles(void); static void CreateArrowSprite(u8 animNum, u8 direction); static void SpriteCallback_Arrow(struct Sprite *sprite); static void SpriteCallback_DestroyArrow(struct Sprite *sprite); static u8 CreateStarSprite(void); static void SpriteCallback_Star(struct Sprite *sprite); static void SpriteCallback_DestroyStar(struct Sprite *sprite); #define ARROW_TILE_TAG 2000 static const u16 sArrowAndStarSpriteTiles[] = INCBIN_U16("graphics/itemfinder/spr_tiles.4bpp"); static const union AnimCmd sArrowAnim0[] = { ANIMCMD_FRAME( 0, 10), ANIMCMD_END }; static const union AnimCmd sArrowAnim1[] = { ANIMCMD_FRAME( 4, 10), ANIMCMD_END }; static const union AnimCmd sArrowAnim2[] = { ANIMCMD_FRAME( 8, 10), ANIMCMD_END }; static const union AnimCmd sArrowAnim3[] = { ANIMCMD_FRAME(12, 10), ANIMCMD_END }; static const union AnimCmd sStarAnim[] = { ANIMCMD_FRAME(16, 10), ANIMCMD_END }; static const union AnimCmd *const sArrowAndStarSpriteAnimTable[] = { sArrowAnim0, sArrowAnim1, sArrowAnim2, sArrowAnim3, sStarAnim }; static const struct OamData sArrowAndStarSpriteOamData = { .affineMode = ST_OAM_AFFINE_NORMAL, .shape = ST_OAM_SQUARE, .size = ST_OAM_SIZE_1 }; static const union AffineAnimCmd sAffineAnim_Left[] = { AFFINEANIMCMD_FRAME(0, 0, 0x00, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Down[] = { AFFINEANIMCMD_FRAME(0, 0, 0x40, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Right[] = { AFFINEANIMCMD_FRAME(0, 0, 0x80, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Up[] = { AFFINEANIMCMD_FRAME(0, 0, 0xc0, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowAndStarSpriteAffineAnimTable[] = { sAffineAnim_Left, sAffineAnim_Down, sAffineAnim_Right, sAffineAnim_Up }; static const struct SpriteTemplate sSpriteTemplate_ArrowAndStar = { .tileTag = ARROW_TILE_TAG, .paletteTag = 0xFFFF, .oam = &sArrowAndStarSpriteOamData, .anims = sArrowAndStarSpriteAnimTable, .affineAnims = sArrowAndStarSpriteAffineAnimTable, .callback = SpriteCallback_Arrow }; static const struct SpriteSheet sArrowAndStarSpriteSheet = { .data = sArrowAndStarSpriteTiles, .size = sizeof(sArrowAndStarSpriteTiles), .tag = ARROW_TILE_TAG }; #define tItemX data[0] #define tItemY data[1] #define tHiddenItemFound data[2] #define tDingTimer data[3] #define tNumDingsRemaining data[4] #define tDingNum data[5] #define tUnderfoot data[6] #define tStartSpriteId data[7] void ItemUseOnFieldCB_Itemfinder(u8 taskId) { u32 i; for (i = 0; i < 16; i++) gTasks[taskId].data[i] = 0; if (HiddenItemIsWithinRangeOfPlayer(gMapHeader.events, taskId) == TRUE) { LoadArrowAndStarTiles(); if (gTasks[taskId].tUnderfoot == TRUE) gTasks[taskId].func = Task_ItemfinderUnderfootSoundsAndAnims; else gTasks[taskId].func = Task_ItemfinderResponseSoundsAndAnims; } else { DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_NopeTheresNoResponse, Task_NoResponse_CleanUp); } } static void Task_NoResponse_CleanUp(u8 taskId) { ClearDialogWindowAndFrame(0, TRUE); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); } static void Task_ItemfinderResponseSoundsAndAnims(u8 taskId) { s16 *data = gTasks[taskId].data; u8 direction; if (tDingTimer % 25 == 0) { direction = GetPlayerDirectionTowardsHiddenItem(tItemX, tItemY); if (tNumDingsRemaining == 0) { gTasks[taskId].func = Task_ItemfinderResponsePrintMessage; return; } else { PlaySE(SE_ITEMFINDER); CreateArrowSprite(tDingNum, direction); tDingNum++; tNumDingsRemaining--; } } tDingTimer++; } static void Task_ItemfinderUnderfootSoundsAndAnims(u8 taskId) { s16 *data = gTasks[taskId].data; if (tDingTimer % 25 == 0) { if (tNumDingsRemaining == 0) { gTasks[taskId].func = Task_ItemfinderUnderfootPrintMessage; return; } else { PlaySE(SE_ITEMFINDER); tStartSpriteId = CreateStarSprite(); tDingNum++; tNumDingsRemaining--; } } tDingTimer++; } static bool8 HiddenItemIsWithinRangeOfPlayer(const struct MapEvents * events, u8 taskId) { s16 x, y, i, dx, dy; PlayerGetDestCoords(&x, &y); gTasks[taskId].tHiddenItemFound = FALSE; for (i = 0; i < events->bgEventCount; i++) { if (events->bgEvents[i].kind == 7 && !FlagGet(GetHiddenItemAttr(events->bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_FLAG))) { dx = events->bgEvents[i].x + 7 - x; dy = events->bgEvents[i].y + 7 - y; if (GetHiddenItemAttr(events->bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_UNDERFOOT) == TRUE) { if (dx == 0 && dy == 0) { SetUnderfootHiddenItem(taskId, events->bgEvents[i].bgUnion.hiddenItem); return TRUE; } } else if ( dx >= -7 && dx <= 7 && dy >= -5 && dy <= 5 ) { RegisterHiddenItemRelativeCoordsIfCloser(taskId, dx, dy); } } } FindHiddenItemsInConnectedMaps(taskId); if (gTasks[taskId].tHiddenItemFound == TRUE) { SetNormalHiddenItem(taskId); return TRUE; } return FALSE; } static void SetUnderfootHiddenItem(u8 taskId, u32 hiddenItem) { s16 *data = gTasks[taskId].data; gSpecialVar_0x8004 = GetHiddenItemAttr(hiddenItem, HIDDEN_ITEM_FLAG); gSpecialVar_0x8005 = GetHiddenItemAttr(hiddenItem, HIDDEN_ITEM_ITEM); gSpecialVar_0x8006 = 1; // Quantity. The 'HIDDEN_ITEM_QUANTITY' data is ignored for underfoot items TV_PrintIntToStringVar(0, gSpecialVar_0x8005); tHiddenItemFound = TRUE; tItemX = 0; tItemY = 0; tNumDingsRemaining = 3; tUnderfoot = TRUE; } static void SetNormalHiddenItem(u8 taskId) { s16 *data = gTasks[taskId].data; s16 absY = tItemY; s16 absX = tItemX; // The strength of the response increases inversely with distance to the item. if (tItemX == 0 && tItemY == 0) tNumDingsRemaining = 4; else { if (tItemX < 0) absX = tItemX * -1; if (tItemY < 0) absY = tItemY * -1; if (absX > absY) { if (absX > 3) tNumDingsRemaining = 2; else tNumDingsRemaining = 4; } else { if (absY > 3) tNumDingsRemaining = 2; else tNumDingsRemaining = 4; } } } static bool8 HiddenItemAtPos(const struct MapEvents * events, s16 x, s16 y) { u8 bgEventCount = events->bgEventCount; const struct BgEvent * bgEvents = events->bgEvents; u16 eventFlag; int i; for (i = 0; i < bgEventCount; i++) { if ( bgEvents[i].kind == 7 && x == bgEvents[i].x && y == bgEvents[i].y ) { eventFlag = GetHiddenItemAttr(bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_FLAG); if (GetHiddenItemAttr(bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_UNDERFOOT) != TRUE && !FlagGet(eventFlag)) return TRUE; else return FALSE; } } return FALSE; } static bool8 HiddenItemInConnectedMapAtPos(const struct MapConnection * connection, s32 x, s32 y) { const struct MapHeader * mapHeader; u16 localX, localY; u32 localOffset; s32 localLength; mapHeader = GetMapHeaderFromConnection(connection); switch (connection->direction) { // same weird temp variable behavior seen in HiddenItemAtPos case CONNECTION_NORTH: localOffset = connection->offset + 7; localX = x - localOffset; localLength = mapHeader->mapLayout->height - 7; localY = localLength + y; // additions are reversed for some reason break; case CONNECTION_SOUTH: localOffset = connection->offset + 7; localX = x - localOffset; localLength = gMapHeader.mapLayout->height + 7; localY = y - localLength; break; case CONNECTION_WEST: localLength = mapHeader->mapLayout->width - 7; localX = localLength + x; // additions are reversed for some reason localOffset = connection->offset + 7; localY = y - localOffset; break; case CONNECTION_EAST: localLength = gMapHeader.mapLayout->width + 7; localX = x - localLength; localOffset = connection->offset + 7; localY = y - localOffset; break; default: return FALSE; } return HiddenItemAtPos(mapHeader->events, localX, localY); } static void FindHiddenItemsInConnectedMaps(u8 taskId) { s16 x, y; s16 curX, curY; s16 width = gMapHeader.mapLayout->width + 7; s16 height = gMapHeader.mapLayout->height + 7; s16 var1 = 7; s16 var2 = 7; PlayerGetDestCoords(&x, &y); for (curX = x - 7; curX <= x + 7; curX++) { for (curY = y - 5; curY <= y + 5; curY++) { if (var1 > curX || curX >= width || var2 > curY || curY >= height) { const struct MapConnection * conn = GetMapConnectionAtPos(curX, curY); if (conn != NULL && HiddenItemInConnectedMapAtPos(conn, curX, curY) == TRUE) RegisterHiddenItemRelativeCoordsIfCloser(taskId, curX - x, curY - y); } } } } static void RegisterHiddenItemRelativeCoordsIfCloser(u8 taskId, s16 dx, s16 dy) { s16 *data = gTasks[taskId].data; s16 dx2, dy2, dx3, dy3; if (tHiddenItemFound == FALSE) { tItemX = dx; tItemY = dy; tHiddenItemFound = TRUE; } else { // tItemX and tItemY contain the player's coordinates. // dx and dy contain the item's coordinates. if (tItemX < 0) dx2 = tItemX * -1; // item is to the left else dx2 = tItemX; // item is to the right if (tItemY < 0) dy2 = tItemY * -1; // item is to the north else dy2 = tItemY; // item is to the south if (dx < 0) dx3 = dx * -1; else dx3 = dx; if (dy < 0) dy3 = dy * -1; else dy3 = dy; if (dx2 + dy2 > dx3 + dy3) { tItemX = dx; tItemY = dy; } else { if (dx2 + dy2 == dx3 + dy3 && (dy2 > dy3 || (dy2 == dy3 && tItemY < dy))) { tItemX = dx; tItemY = dy; } } } } static u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY) { s16 abX, abY; if (itemX == 0 && itemY == 0) return DIR_NONE; // player is standing on the item. // get absolute X distance. if (itemX < 0) abX = itemX * -1; else abX = itemX; // get absolute Y distance. if (itemY < 0) abY = itemY * -1; else abY = itemY; if (abX > abY) { if (itemX < 0) return DIR_EAST; else return DIR_NORTH; } else { if (abX < abY) { if (itemY < 0) return DIR_SOUTH; else return DIR_WEST; } if (abX == abY) { if (itemY < 0) return DIR_SOUTH; else return DIR_WEST; } return DIR_NONE; // should never get here. return something so it doesnt crash. } } static void Task_ItemfinderResponsePrintMessage(u8 taskId) { DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_ItemfinderResponding, Task_ItemfinderResponseCleanUp); } static void Task_ItemfinderResponseCleanUp(u8 taskId) { DestroyArrowAndStarTiles(); ClearDialogWindowAndFrame(0, TRUE); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); } static void Task_ItemfinderUnderfootPrintMessage(u8 taskId) { DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_ItemfinderShakingWildly, Task_ItemfinderUnderfootDigUpItem); } static void Task_ItemfinderUnderfootDigUpItem(u8 taskId) { DestroyArrowAndStarTiles(); DestroyTask(taskId); ScriptContext_SetupScript(EventScript_ItemfinderDigUpUnderfootItem); LockPlayerFieldControls(); } #undef tStartSpriteId #undef tUnderfoot #undef tDingNum #undef tNumDingsRemaining #undef tDingTimer #undef tHiddenItemFound #undef tItemY #undef tItemX #define spData0 data[0] #define spDeltaX data[1] #define spDeltaY data[2] #define spCurX data[3] #define spCurY data[4] #define spCenterX data[5] #define spCenterY data[6] #define spAnimNum data[7] static void LoadArrowAndStarTiles(void) { LoadSpriteSheet(&sArrowAndStarSpriteSheet); } static void DestroyArrowAndStarTiles(void) { FreeSpriteTilesByTag(ARROW_TILE_TAG); } static void CreateArrowSprite(u8 animNum, u8 direction) { u8 spriteId = CreateSprite(&sSpriteTemplate_ArrowAndStar, 120, 76, 0); gSprites[spriteId].oam.paletteNum = 0; StartSpriteAnim(&gSprites[spriteId], animNum); gSprites[spriteId].spAnimNum = animNum; gSprites[spriteId].spData0 = 0; gSprites[spriteId].spCurX = 0; gSprites[spriteId].spCurY = 0; gSprites[spriteId].spCenterX = 120; gSprites[spriteId].spCenterY = 76; switch (direction) { case DIR_NONE: switch (GetPlayerFacingDirection()) { case DIR_WEST: gSprites[spriteId].spDeltaX = -100; gSprites[spriteId].spDeltaY = 0; StartSpriteAffineAnim(&gSprites[spriteId], 0); break; case DIR_NORTH: gSprites[spriteId].spDeltaX = 0; gSprites[spriteId].spDeltaY = -100; StartSpriteAffineAnim(&gSprites[spriteId], 3); break; case DIR_EAST: gSprites[spriteId].spDeltaX = 100; gSprites[spriteId].spDeltaY = 0; StartSpriteAffineAnim(&gSprites[spriteId], 2); break; case DIR_SOUTH: gSprites[spriteId].spDeltaX = 0; gSprites[spriteId].spDeltaY = 100; StartSpriteAffineAnim(&gSprites[spriteId], 1); break; } break; case DIR_SOUTH: gSprites[spriteId].spDeltaX = 0; gSprites[spriteId].spDeltaY = -100; StartSpriteAffineAnim(&gSprites[spriteId], 3); break; case DIR_NORTH: gSprites[spriteId].spDeltaX = 100; gSprites[spriteId].spDeltaY = 0; StartSpriteAffineAnim(&gSprites[spriteId], 2); break; case DIR_WEST: gSprites[spriteId].spDeltaX = 0; gSprites[spriteId].spDeltaY = 100; StartSpriteAffineAnim(&gSprites[spriteId], 1); break; case DIR_EAST: gSprites[spriteId].spDeltaX = -100; gSprites[spriteId].spDeltaY = 0; break; } } static void SpriteCallback_Arrow(struct Sprite *sprite) { s16 x, y; sprite->spCurX += sprite->spDeltaX; sprite->spCurY += sprite->spDeltaY; sprite->x = sprite->spCenterX + (sprite->spCurX >> 8); sprite->y = sprite->spCenterY + (sprite->spCurY >> 8); if (sprite->x <= 104 || sprite->x > 132 || sprite->y <= 60 || sprite->y > 88) sprite->callback = SpriteCallback_DestroyArrow; } static void SpriteCallback_DestroyArrow(struct Sprite *sprite) { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } static u8 CreateStarSprite(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_ArrowAndStar, 120, 76, 0); gSprites[spriteId].oam.paletteNum = 0; gSprites[spriteId].callback = SpriteCallback_Star; StartSpriteAnim(&gSprites[spriteId], 4); gSprites[spriteId].spAnimNum = 0; gSprites[spriteId].spData0 = 0; gSprites[spriteId].spCurX = 0; gSprites[spriteId].spCurY = 0; gSprites[spriteId].spCenterX = 120; gSprites[spriteId].spCenterY = 76; gSprites[spriteId].spDeltaX = 0; gSprites[spriteId].spDeltaY = -100; return spriteId; } static void SpriteCallback_Star(struct Sprite *sprite) { s16 x, y; sprite->spCurX += sprite->spDeltaX; sprite->spCurY += sprite->spDeltaY; sprite->x = sprite->spCenterX + (sprite->spCurX >> 8); sprite->y = sprite->spCenterY + (sprite->spCurY >> 8); if (sprite->x <= 104 || sprite->x > 132 || sprite->y <= 60 || sprite->y > 88) sprite->callback = SpriteCallback_DestroyStar; } static void SpriteCallback_DestroyStar(struct Sprite *sprite) { DestroySprite(sprite); } #undef spAnimNum #undef spCenterY #undef spCenterX #undef spCurY #undef spCurX #undef spDeltaY #undef spDeltaX #undef spData0 ================================================ FILE: src/key_system_menu.c ================================================ #include "global.h" #include "gflib.h" #include "scanline_effect.h" #include "text_window_graphics.h" #include "main_menu.h" #include "menu.h" #include "task.h" #include "overworld.h" #include "help_system.h" #include "text_window.h" #include "strings.h" #include "field_fadetransition.h" #include "gba/m4a_internal.h" // can't include the one in menu_helpers.h since Task_KeySystemMenu needs bool32 for matching bool32 IsActiveOverworldLinkBusy(void); // Menu items enum { MENUITEM_VERSION = 0, MENUITEM_DIFFICULTY, MENUITEM_ADVANCED, MENUITEM_CANCEL, MENUITEM_COUNT }; enum { MENUITEM_NUZLOCKE = 0, MENUITEM_IV, MENUITEM_EV, MENUITEM_NO_PMC, MENUITEM_EXP_MOD, MENUITEM_BACK, MENUITEM_COUNT2 }; // Window Ids enum { WIN_TEXT_KEY, WIN_KEYS }; // RAM symbols struct KeySystemMenu { /*0x00*/ u16 option[MENUITEM_COUNT]; u16 subOption[MENUITEM_COUNT2]; /*0x0E*/ u8 cursorPos; /*0x10*/ u8 loadState; /*0x11*/ u8 state; /*0x12*/ u8 loadPaletteState; bool8 inSubMenu; }; static EWRAM_DATA struct KeySystemMenu *sKeySystemMenuPtr = NULL; //Function Declarations static void CB2_InitKeySystemMenu(void); static void VBlankCB_KeySystemMenu(void); static void KeySystemMenu_InitCallbacks(void); static void KeySystemMenu_SetVBlankCallback(void); static void CB2_KeySystemMenu(void); static void SetKeySystemMenuTask(void); static void InitKeySystemMenuBg(void); static void KeySystemMenu_PickSwitchCancel(void); static void KeySystemMenu_ResetSpriteData(void); static bool8 LoadKeySystemMenuPalette(void); static void Task_KeySystemMenu(u8 taskId); static u8 KeySystemMenu_ProcessInput(void); static void BufferKeySystemMenuString(u8 selection); static void CloseAndSaveKeySystemMenu(u8 taskId); static void PrintKeySystemMenuHeader(void); static void DrawKeySystemMenuBg(void); static void LoadKeySystemMenuItemNames(void); static void UpdateSettingSelectionDisplay(u16 selection); // Data Definitions static const struct WindowTemplate sKeySystemMenuWinTemplates[] = { { .bg = 1, .tilemapLeft = 2, .tilemapTop = 3, .width = 26, .height = 2, .paletteNum = 1, .baseBlock = 2 }, { .bg = 0, .tilemapLeft = 2, .tilemapTop = 7, .width = 26, .height = 12, .paletteNum = 1, .baseBlock = 0x36 }, { .bg = 2, .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 2, .paletteNum = 0xF, .baseBlock = 0x16e }, DUMMY_WIN_TEMPLATE }; static const struct BgTemplate sKeySystemMenuBgTemplates[] = { { .bg = 1, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0 }, { .bg = 0, .charBaseIndex = 1, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = 2, .charBaseIndex = 1, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0 }, }; static const u16 sKeySystemMenuPalette[] = INCBIN_U16("graphics/misc/option_menu.gbapal"); static const u16 sKeySystemMenuItemCounts[MENUITEM_COUNT] = {2, 3, 1, 0}; static const u16 sKeySystemSubMenuItemCounts[MENUITEM_COUNT2] = {2, 3, 2, 2, 4, 0}; static const u8 *const sKeySystemMenuItemsNames[MENUITEM_COUNT] = { [MENUITEM_VERSION] = gText_Version, [MENUITEM_DIFFICULTY] = gText_Difficulty, [MENUITEM_ADVANCED] = gText_Advanced, [MENUITEM_CANCEL] = gText_OptionMenuSaveAndExit, }; static const u8 *const sKeySystemSubMenuItemsNames[MENUITEM_COUNT2] ={ [MENUITEM_NUZLOCKE] = gText_Nuzlocke, [MENUITEM_IV] = gText_IVCalc, [MENUITEM_EV] = gText_EVCalc, [MENUITEM_NO_PMC] = gText_NoPMC, [MENUITEM_EXP_MOD] = gText_ExpMod, [MENUITEM_BACK] = gText_Back, }; static const u8 *const sVersionOptions[] = { gText_FireredVersion, gText_LeafgreenVersion }; static const u8 *const sDifficultyOptions[] = { gText_NormalDifficulty, gText_ChallengeDifficulty, gText_EasyDifficulty }; static const u8 *const sAdvancedOptions[] = { gText_BattleScenePressA }; static const u8 *const sNuzlockeOptions[] = { gText_Nuzlocke_Off, gText_Nuzlocke_On }; static const u8 *const sIVCalcOptions[] = { gText_IVCalcStandard, gText_IVCalcPerfect, gText_IVCalcZero }; static const u8 *const sEVCalcOptions[] = { gText_EVCalcStandard, gText_EVCalcZero }; static const u8 *const sExpModOptions[] = { gText_ExpModZero, gText_ExpModHalf, gText_ExpModNormal, gText_ExpModTwice }; static const u8 sKeySystemMenuPickSwitchCancelTextColor[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}; static const u8 sKeySystemMenuTextColor[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED}; // Functions static void CB2_InitKeySystemMenu(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCB_KeySystemMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void CB2_KeySystemMenuFromContinueScreen(void) { u32 i; if (gMain.savedCallback == NULL) gMain.savedCallback = CB2_InitMainMenu; //changed to continue screen callback sKeySystemMenuPtr = AllocZeroed(sizeof(struct KeySystemMenu)); sKeySystemMenuPtr->loadState = 0; sKeySystemMenuPtr->loadPaletteState = 0; sKeySystemMenuPtr->state = 0; sKeySystemMenuPtr->cursorPos = 0; sKeySystemMenuPtr->inSubMenu = 0; sKeySystemMenuPtr->option[MENUITEM_VERSION] = gSaveBlock1Ptr->keyFlags.version; sKeySystemMenuPtr->option[MENUITEM_DIFFICULTY] = gSaveBlock1Ptr->keyFlags.difficulty; sKeySystemMenuPtr->option[MENUITEM_ADVANCED] = 0; sKeySystemMenuPtr->subOption[MENUITEM_NUZLOCKE] = gSaveBlock1Ptr->keyFlags.nuzlocke; sKeySystemMenuPtr->subOption[MENUITEM_IV] = gSaveBlock1Ptr->keyFlags.ivCalcMode; sKeySystemMenuPtr->subOption[MENUITEM_EV] = gSaveBlock1Ptr->keyFlags.evCalcMode; sKeySystemMenuPtr->subOption[MENUITEM_NO_PMC] = gSaveBlock1Ptr->keyFlags.noPMC; sKeySystemMenuPtr->subOption[MENUITEM_EXP_MOD] = gSaveBlock1Ptr->keyFlags.expMod; if(gSaveBlock1Ptr->keyFlags.changedCalcMode != 1) gSaveBlock1Ptr->keyFlags.changedCalcMode = 0; gSaveBlock1Ptr->keyFlags.inKeySystemMenu = 1; for (i = 0; i < MENUITEM_COUNT - 1; i++) { if (sKeySystemMenuPtr->option[i] > (sKeySystemMenuItemCounts[i]) - 1) sKeySystemMenuPtr->option[i] = 0; } for (i = 0; i < MENUITEM_COUNT2 - 1; i++) { if (sKeySystemMenuPtr->subOption[i] > (sKeySystemSubMenuItemCounts[i]) - 1) sKeySystemMenuPtr->subOption[i] = 0; } SetHelpContext(HELPCONTEXT_KEY_SYSTEM); SetMainCallback2(CB2_KeySystemMenu); } static void KeySystemMenu_InitCallbacks(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); } static void KeySystemMenu_SetVBlankCallback(void) { SetVBlankCallback(VBlankCB_KeySystemMenu); } static void CB2_KeySystemMenu(void) { u8 i, state; state = sKeySystemMenuPtr->state; switch (state) { case 0: KeySystemMenu_InitCallbacks(); break; case 1: InitKeySystemMenuBg(); break; case 2: KeySystemMenu_ResetSpriteData(); break; case 3: if (LoadKeySystemMenuPalette() != TRUE) return; break; case 4: PrintKeySystemMenuHeader(); break; case 5: DrawKeySystemMenuBg(); break; case 6: LoadKeySystemMenuItemNames(); break; case 7: if(!sKeySystemMenuPtr->inSubMenu) { for (i = 0; i < MENUITEM_COUNT; i++) BufferKeySystemMenuString(i); } else { for (i = 0; i < MENUITEM_COUNT2; i++) BufferKeySystemMenuString(i); } break; case 8: UpdateSettingSelectionDisplay(sKeySystemMenuPtr->cursorPos); break; case 9: KeySystemMenu_PickSwitchCancel(); break; default: SetKeySystemMenuTask(); break; } sKeySystemMenuPtr->state++; } static void SetKeySystemMenuTask(void) { CreateTask(Task_KeySystemMenu, 0); SetMainCallback2(CB2_InitKeySystemMenu); } static void InitKeySystemMenuBg(void) { void * dest = (void *)VRAM; DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sKeySystemMenuBgTemplates, NELEMS(sKeySystemMenuBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); InitWindows(sKeySystemMenuWinTemplates); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, BLDCNT_TGT1_BG1); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); ShowBg(0); ShowBg(1); ShowBg(2); }; static void KeySystemMenu_PickSwitchCancel(void) { s32 x; FillWindowPixelBuffer(2, PIXEL_FILL(15)); if(!sKeySystemMenuPtr->inSubMenu) { if(sKeySystemMenuPtr->cursorPos == MENUITEM_ADVANCED) { x = 0xE4 - GetStringWidth(0, gText_PickSwitchCancelA, 0); AddTextPrinterParameterized3(2, 0, x, 0, sKeySystemMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancelA); } else if(sKeySystemMenuPtr->cursorPos == MENUITEM_CANCEL) { x = 0xE4 - GetStringWidth(0, gText_PickSwitchExit, 0); AddTextPrinterParameterized3(2, 0, x, 0, sKeySystemMenuPickSwitchCancelTextColor, 0, gText_PickSwitchExit); } else { x = 0xE4 - GetStringWidth(0, gText_PickSwitchCancel, 0); AddTextPrinterParameterized3(2, 0, x, 0, sKeySystemMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancel); } } else { x = 0xE4 - GetStringWidth(0, gText_PickSwitchBack, 0); AddTextPrinterParameterized3(2, 0, x, 0, sKeySystemMenuPickSwitchCancelTextColor, 0, gText_PickSwitchBack); } PutWindowTilemap(2); CopyWindowToVram(2, COPYWIN_FULL); } static void KeySystemMenu_ResetSpriteData(void) { ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); ResetTasks(); ScanlineEffect_Stop(); } static bool8 LoadKeySystemMenuPalette(void) { switch (sKeySystemMenuPtr->loadPaletteState) { case 0: LoadBgTiles(1, GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1AA); break; case 1: LoadPalette(GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->palette, 0x20, 0x20); break; case 2: LoadPalette(sKeySystemMenuPalette, 0x10, 0x20); LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(15), PLTT_SIZE_4BPP); break; case 3: LoadStdWindowGfxOnBg(1, 0x1B3, BG_PLTT_ID(3)); break; default: return TRUE; } sKeySystemMenuPtr->loadPaletteState++; return FALSE; } static void Task_KeySystemMenu(u8 taskId) { switch (sKeySystemMenuPtr->loadState) { case 0: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); KeySystemMenu_SetVBlankCallback(); sKeySystemMenuPtr->loadState++; break; case 1: if (gPaletteFade.active) return; sKeySystemMenuPtr->loadState++; break; case 2: if (((bool32)IsActiveOverworldLinkBusy()) == TRUE) break; switch (KeySystemMenu_ProcessInput()) { case 0: break; case 1: sKeySystemMenuPtr->loadState++; break; case 2: LoadBgTiles(1, GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1AA); LoadPalette(GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->palette, 0x20, 0x20); BufferKeySystemMenuString(sKeySystemMenuPtr->cursorPos); break; case 3: UpdateSettingSelectionDisplay(sKeySystemMenuPtr->cursorPos); break; case 4: BufferKeySystemMenuString(sKeySystemMenuPtr->cursorPos); break; case 6: if(!sKeySystemMenuPtr->inSubMenu) { sKeySystemMenuPtr->inSubMenu = TRUE; PrintKeySystemMenuHeader(); sKeySystemMenuPtr->state = 6; sKeySystemMenuPtr->loadState = 1; sKeySystemMenuPtr->cursorPos = 0; SetHelpContext(HELPCONTEXT_KEY_SYSTEM_SUBMENU); DestroyTask(taskId); SetMainCallback2(CB2_KeySystemMenu); break; } else { sKeySystemMenuPtr->inSubMenu = FALSE; PrintKeySystemMenuHeader(); sKeySystemMenuPtr->state = 6; sKeySystemMenuPtr->loadState = 1; sKeySystemMenuPtr->cursorPos = MENUITEM_ADVANCED; SetHelpContext(HELPCONTEXT_KEY_SYSTEM); DestroyTask(taskId); SetMainCallback2(CB2_KeySystemMenu); break; } } break; case 3: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); sKeySystemMenuPtr->loadState++; break; case 4: if (gPaletteFade.active) return; sKeySystemMenuPtr->loadState++; break; case 5: CloseAndSaveKeySystemMenu(taskId); break; } } static u8 KeySystemMenu_ProcessInput(void) { u16 current; u16* curr; if (JOY_REPT(DPAD_RIGHT)) { if(!sKeySystemMenuPtr->inSubMenu) { current = sKeySystemMenuPtr->option[(sKeySystemMenuPtr->cursorPos)]; if (current == (sKeySystemMenuItemCounts[sKeySystemMenuPtr->cursorPos] - 1)) sKeySystemMenuPtr->option[sKeySystemMenuPtr->cursorPos] = 0; else sKeySystemMenuPtr->option[sKeySystemMenuPtr->cursorPos] = current + 1; return 4; } else { current = sKeySystemMenuPtr->subOption[(sKeySystemMenuPtr->cursorPos)]; if (current == (sKeySystemSubMenuItemCounts[sKeySystemMenuPtr->cursorPos] - 1)) sKeySystemMenuPtr->subOption[sKeySystemMenuPtr->cursorPos] = 0; else sKeySystemMenuPtr->subOption[sKeySystemMenuPtr->cursorPos] = current + 1; return 4; } } else if (JOY_REPT(DPAD_LEFT)) { if(!sKeySystemMenuPtr->inSubMenu) { curr = &sKeySystemMenuPtr->option[sKeySystemMenuPtr->cursorPos]; if (*curr == 0) *curr = sKeySystemMenuItemCounts[sKeySystemMenuPtr->cursorPos] - 1; else --*curr; return 4; } else { curr = &sKeySystemMenuPtr->subOption[sKeySystemMenuPtr->cursorPos]; if (*curr == 0) *curr = sKeySystemSubMenuItemCounts[sKeySystemMenuPtr->cursorPos] - 1; else --*curr; return 4; } } else if (JOY_REPT(DPAD_UP)) { if(!sKeySystemMenuPtr->inSubMenu) { if (sKeySystemMenuPtr->cursorPos == MENUITEM_VERSION) sKeySystemMenuPtr->cursorPos = MENUITEM_CANCEL; else sKeySystemMenuPtr->cursorPos = sKeySystemMenuPtr->cursorPos - 1; } else { if (sKeySystemMenuPtr->cursorPos == MENUITEM_NUZLOCKE) sKeySystemMenuPtr->cursorPos = MENUITEM_BACK; else sKeySystemMenuPtr->cursorPos = sKeySystemMenuPtr->cursorPos - 1; } KeySystemMenu_PickSwitchCancel(); return 3; } else if (JOY_REPT(DPAD_DOWN)) { if(!sKeySystemMenuPtr->inSubMenu) { if (sKeySystemMenuPtr->cursorPos == MENUITEM_CANCEL) sKeySystemMenuPtr->cursorPos = MENUITEM_VERSION; else sKeySystemMenuPtr->cursorPos = sKeySystemMenuPtr->cursorPos + 1; } else { if (sKeySystemMenuPtr->cursorPos == MENUITEM_BACK) sKeySystemMenuPtr->cursorPos = MENUITEM_NUZLOCKE; else sKeySystemMenuPtr->cursorPos = sKeySystemMenuPtr->cursorPos + 1; } KeySystemMenu_PickSwitchCancel(); return 3; } else if (JOY_NEW(A_BUTTON)) { if(!sKeySystemMenuPtr->inSubMenu) { if(sKeySystemMenuPtr->cursorPos == MENUITEM_ADVANCED) return 6; if(sKeySystemMenuPtr->cursorPos == MENUITEM_CANCEL) return 1; } else return 6; } else if (JOY_NEW(B_BUTTON)) { if(sKeySystemMenuPtr->inSubMenu) return 6; else return 1; } else { return 0; } } static void BufferKeySystemMenuString(u8 selection) { u8 str[20]; u8 buf[12]; u8 dst[3]; u8 x, y; memcpy(dst, sKeySystemMenuTextColor, 3); x = 0x69; y = ((GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) - 1) * selection) + 2; FillWindowPixelRect(1, 1, x, y, 0x6F, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT)); if(!sKeySystemMenuPtr->inSubMenu) { switch (selection) { case MENUITEM_VERSION: AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sVersionOptions[sKeySystemMenuPtr->option[selection]]); break; case MENUITEM_DIFFICULTY: AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sDifficultyOptions[sKeySystemMenuPtr->option[selection]]); break; case MENUITEM_ADVANCED: AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sAdvancedOptions[sKeySystemMenuPtr->option[selection]]); break; default: break; } } else { switch (selection) { case MENUITEM_NUZLOCKE: AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sNuzlockeOptions[sKeySystemMenuPtr->subOption[selection]]); break; case MENUITEM_IV: AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sIVCalcOptions[sKeySystemMenuPtr->subOption[selection]]); break; case MENUITEM_EV: AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sEVCalcOptions[sKeySystemMenuPtr->subOption[selection]]); break; case MENUITEM_NO_PMC: AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sNuzlockeOptions[sKeySystemMenuPtr->subOption[selection]]); break; case MENUITEM_EXP_MOD: AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sExpModOptions[sKeySystemMenuPtr->subOption[selection]]); break; default: break; } } PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_FULL); } static void CloseAndSaveKeySystemMenu(u8 taskId) { gFieldCallback = FieldCB_DefaultWarpExit; SetMainCallback2(gMain.savedCallback); FreeAllWindowBuffers(); gSaveBlock1Ptr->keyFlags.version = sKeySystemMenuPtr->option[MENUITEM_VERSION]; gSaveBlock1Ptr->keyFlags.difficulty = sKeySystemMenuPtr->option[MENUITEM_DIFFICULTY]; gSaveBlock1Ptr->keyFlags.nuzlocke = sKeySystemMenuPtr->subOption[MENUITEM_NUZLOCKE]; if(gSaveBlock1Ptr->keyFlags.ivCalcMode != sKeySystemMenuPtr->subOption[MENUITEM_IV] || gSaveBlock1Ptr->keyFlags.evCalcMode != sKeySystemMenuPtr->subOption[MENUITEM_EV]) { gSaveBlock1Ptr->keyFlags.changedCalcMode = 1; //iv or ev calc mode changed, recalculate party stats on saveload. } gSaveBlock1Ptr->keyFlags.ivCalcMode = sKeySystemMenuPtr->subOption[MENUITEM_IV]; gSaveBlock1Ptr->keyFlags.evCalcMode = sKeySystemMenuPtr->subOption[MENUITEM_EV]; gSaveBlock1Ptr->keyFlags.noPMC = sKeySystemMenuPtr->subOption[MENUITEM_NO_PMC]; gSaveBlock1Ptr->keyFlags.expMod = sKeySystemMenuPtr->subOption[MENUITEM_EXP_MOD]; gSaveBlock1Ptr->keyFlags.inKeySystemMenu = 0; FREE_AND_SET_NULL(sKeySystemMenuPtr); DestroyTask(taskId); } static void PrintKeySystemMenuHeader(void) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); if(!sKeySystemMenuPtr->inSubMenu) AddTextPrinterParameterized(WIN_TEXT_KEY, 2, gText_KeySystemSettings, 8, 1, TEXT_SKIP_DRAW, NULL); else AddTextPrinterParameterized(WIN_TEXT_KEY, 2, gText_Advanced, 8, 1, TEXT_SKIP_DRAW, NULL); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); } static void DrawKeySystemMenuBg(void) { u8 h; h = 2; FillBgTilemapBufferRect(1, 0x1B3, 1, 2, 1, 1, 3); FillBgTilemapBufferRect(1, 0x1B4, 2, 2, 0x1B, 1, 3); FillBgTilemapBufferRect(1, 0x1B5, 0x1C, 2, 1, 1, 3); FillBgTilemapBufferRect(1, 0x1B6, 1, 3, 1, h, 3); FillBgTilemapBufferRect(1, 0x1B8, 0x1C, 3, 1, h, 3); FillBgTilemapBufferRect(1, 0x1B9, 1, 5, 1, 1, 3); FillBgTilemapBufferRect(1, 0x1BA, 2, 5, 0x1B, 1, 3); FillBgTilemapBufferRect(1, 0x1BB, 0x1C, 5, 1, 1, 3); FillBgTilemapBufferRect(1, 0x1AA, 1, 6, 1, 1, h); FillBgTilemapBufferRect(1, 0x1AB, 2, 6, 0x1A, 1, h); FillBgTilemapBufferRect(1, 0x1AC, 0x1C, 6, 1, 1, h); FillBgTilemapBufferRect(1, 0x1AD, 1, 7, 1, 0x10, h); FillBgTilemapBufferRect(1, 0x1AF, 0x1C, 7, 1, 0x10, h); FillBgTilemapBufferRect(1, 0x1B0, 1, 0x13, 1, 1, h); FillBgTilemapBufferRect(1, 0x1B1, 2, 0x13, 0x1A, 1, h); FillBgTilemapBufferRect(1, 0x1B2, 0x1C, 0x13, 1, 1, h); CopyBgTilemapBufferToVram(1); } static void LoadKeySystemMenuItemNames(void) { u32 i; FillWindowPixelBuffer(1, PIXEL_FILL(1)); if(!sKeySystemMenuPtr->inSubMenu) { for (i = 0; i < MENUITEM_COUNT; i++) { AddTextPrinterParameterized(WIN_KEYS, 2, sKeySystemMenuItemsNames[i], 8, (u8)((i * (GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SKIP_DRAW, NULL); } } else { for (i = 0; i < MENUITEM_COUNT2; i++) { AddTextPrinterParameterized(WIN_KEYS, 2, sKeySystemMenuItemsNames[i + MENUITEM_COUNT], 8, (u8)((i * (GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SKIP_DRAW, NULL); } } } static void UpdateSettingSelectionDisplay(u16 selection) { u16 maxLetterHeight, y; maxLetterHeight = GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT); y = selection * (maxLetterHeight - 1) + 0x3A; SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(y, y + maxLetterHeight)); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0x10, 0xE0)); } ================================================ FILE: src/keyboard_text.c ================================================ #include "global.h" // Easy Chat keyboard const u8 gText_EasyChatKeyboard_ABCDEFothers[] = _("{CLEAR 11}A{CLEAR 6}B{CLEAR 6}C{CLEAR 26}D{CLEAR 6}E{CLEAR 6}F{CLEAR 26}others"); const u8 gText_EasyChatKeyboard_GHIJKL[] = _("{CLEAR 11}G{CLEAR 6}H{CLEAR 6}I{CLEAR 26}J{CLEAR 6}K{CLEAR 6}L"); const u8 gText_EasyChatKeyboard_MNOPQRS[] = _("{CLEAR 11}M{CLEAR 6}N{CLEAR 6}O{CLEAR 26}P{CLEAR 6}Q{CLEAR 6}R{CLEAR 6}S{CLEAR 26} "); const u8 gText_EasyChatKeyboard_TUVWXYZ[] = _("{CLEAR 11}T{CLEAR 6}U{CLEAR 6}V{CLEAR 26}W{CLEAR 6}X{CLEAR 6}Y{CLEAR 6}Z{CLEAR 26} "); // Naming Screen keyboard const u8 gText_NamingScreenKeyboard_abcdef[] = _("{CLEAR 11}a{CLEAR 6}b{CLEAR 6}c{CLEAR 26}d{CLEAR 6}e{CLEAR 6}f{CLEAR 6} {CLEAR 26}."); const u8 gText_NamingScreenKeyboard_ghijkl[] = _("{CLEAR 11}g{CLEAR 6}h{CLEAR 7}i{CLEAR 27}j{CLEAR 6}k{CLEAR 6}l{CLEAR 7} {CLEAR 26},"); const u8 gText_NamingScreenKeyboard_mnopqrs[] = _("{CLEAR 11}m{CLEAR 6}n{CLEAR 7}o{CLEAR 26}p{CLEAR 6}q{CLEAR 7}r{CLEAR 6}s{CLEAR 27} "); const u8 gText_NamingScreenKeyboard_tuvwxyz[] = _("{CLEAR 12}t{CLEAR 6}u{CLEAR 6}v{CLEAR 26}w{CLEAR 6}x{CLEAR 6}y{CLEAR 6}z{CLEAR 26} "); const u8 gText_NamingScreenKeyboard_ABCDEF[] = _("{CLEAR 11}A{CLEAR 6}B{CLEAR 6}C{CLEAR 26}D{CLEAR 6}E{CLEAR 6}F{CLEAR 6} {CLEAR 26}."); const u8 gText_NamingScreenKeyboard_GHIJKL[] = _("{CLEAR 11}G{CLEAR 6}H{CLEAR 6}I{CLEAR 26}J{CLEAR 6}K{CLEAR 6}L{CLEAR 6} {CLEAR 26},"); const u8 gText_NamingScreenKeyboard_MNOPQRS[] = _("{CLEAR 11}M{CLEAR 6}N{CLEAR 6}O{CLEAR 26}P{CLEAR 6}Q{CLEAR 6}R{CLEAR 6}S{CLEAR 26} "); const u8 gText_NamingScreenKeyboard_TUVWXYZ[] = _("{CLEAR 11}T{CLEAR 6}U{CLEAR 6}V{CLEAR 26}W{CLEAR 6}X{CLEAR 6}Y{CLEAR 6}Z{CLEAR 26} "); const u8 gText_NamingScreenKeyboard_01234[] = _("{CLEAR 11}0{CLEAR 16}1{CLEAR 16}2{CLEAR 16}3{CLEAR 16}4{CLEAR 16} "); const u8 gText_NamingScreenKeyboard_56789[] = _("{CLEAR 11}5{CLEAR 16}6{CLEAR 16}7{CLEAR 16}8{CLEAR 16}9{CLEAR 16} "); const u8 gText_NamingScreenKeyboard_Symbols1[] = _("{CLEAR 11}!{CLEAR 16}?{CLEAR 16}♂{CLEAR 16}♀{CLEAR 16}/{CLEAR 16}-"); const u8 gText_NamingScreenKeyboard_Symbols2[] = _("{CLEAR 11}…{CLEAR 16}“{CLEAR 16}”{CLEAR 18}‘{CLEAR 18}'{CLEAR 18} "); // Union Room Chat keyboard const u8 gText_UnionRoomChatKeyboard_ABCDE[] = _("ABCDE"); const u8 gText_UnionRoomChatKeyboard_FGHIJ[] = _("FGHIJ"); const u8 gText_UnionRoomChatKeyboard_KLMNO[] = _("KLMNO"); const u8 gText_UnionRoomChatKeyboard_PQRST[] = _("PQRST"); const u8 gText_UnionRoomChatKeyboard_UVWXY[] = _("UVWXY"); const u8 gText_UnionRoomChatKeyboard_Z[] = _("Z "); const u8 gText_UnionRoomChatKeyboard_01234Upper[] = _("01234"); const u8 gText_UnionRoomChatKeyboard_56789Upper[] = _("56789"); const u8 gText_UnionRoomChatKeyboard_PunctuationUpper[] = _(".,!? "); const u8 gText_UnionRoomChatKeyboard_SymbolsUpper[] = _("-/&… "); const u8 gText_UnionRoomChatKeyboard_abcde[] = _("abcde"); const u8 gText_UnionRoomChatKeyboard_fghij[] = _("fghij"); const u8 gText_UnionRoomChatKeyboard_klmno[] = _("klmno"); const u8 gText_UnionRoomChatKeyboard_pqrst[] = _("pqrst"); const u8 gText_UnionRoomChatKeyboard_uvwxy[] = _("uvwxy"); const u8 gText_UnionRoomChatKeyboard_z[] = _("z "); const u8 gText_UnionRoomChatKeyboard_01234Lower[] = _("01234"); const u8 gText_UnionRoomChatKeyboard_56789Lower[] = _("56789"); const u8 gText_UnionRoomChatKeyboard_PunctuationLower[] = _(".,!? "); const u8 gText_UnionRoomChatKeyboard_SymbolsLower[] = _("-/&… "); const u8 gText_EmptyTextInput1[] = _(""); const u8 gText_EmptyTextInput2[] = _(""); const u8 gText_EmptyTextInput3[] = _(""); const u8 gText_EmptyTextInput4[] = _(""); const u8 gText_EmptyTextInput5[] = _(""); const u8 gText_EmptyTextInput6[] = _(""); const u8 gText_EmptyTextInput7[] = _(""); const u8 gText_EmptyTextInput8[] = _(""); // Union Room Chat keyboard emojis const u8 gText_UnionRoomChatKeyboard_Emoji1[] = _("{EMOJI_MISCHIEVOUS}{EMOJI_HAPPY}{EMOJI_ANGRY}{EMOJI_SURPRISED}{EMOJI_BIGANGER}"); const u8 gText_UnionRoomChatKeyboard_Emoji2[] = _("{EMOJI_BIGSMILE}{EMOJI_EVIL}{EMOJI_NEUTRAL}{EMOJI_TIRED}{EMOJI_SHOCKED}"); const u8 gText_UnionRoomChatKeyboard_Emoji3[] = _("{EMOJI_LEAF}{EMOJI_FIRE}{EMOJI_WATER}{EMOJI_BOLT}{EMOJI_BALL}"); const u8 gText_UnionRoomChatKeyboard_Emoji4[] = _("♂♀{EMOJI_LEFT_PAREN}{EMOJI_RIGHT_PAREN}{EMOJI_TILDE}"); const u8 gText_UnionRoomChatKeyboard_Emoji5[] = _("{EMOJI_LEFT_EYE}{EMOJI_RIGHT_EYE}{EMOJI_SMALLWHEEL}{EMOJI_SPHERE}{EMOJI_IRRITATED}"); const u8 gText_UnionRoomChatKeyboard_Emoji6[] = _("{EMOJI_AT}{EMOJI_BIGWHEEL}{EMOJI_TONGUE}{EMOJI_ACUTE}{EMOJI_GRAVE}"); const u8 gText_UnionRoomChatKeyboard_Emoji7[] = _("{EMOJI_RIGHT_FIST}{EMOJI_LEFT_FIST}{EMOJI_TRIANGLE_OUTLINE}{EMOJI_UNION}{EMOJI_GREATER_THAN}"); const u8 gText_UnionRoomChatKeyboard_Emoji8[] = _("{EMOJI_CIRCLE}{EMOJI_TRIANGLE}{EMOJI_SQUARE}{EMOJI_HEART}{EMOJI_MOON}"); const u8 gText_UnionRoomChatKeyboard_Emoji9[] = _("{EMOJI_NOTE}{EMOJI_PLUS}{EMOJI_MINUS}{EMOJI_EQUALS}{EMOJI_PIPE}"); const u8 gText_UnionRoomChatKeyboard_Emoji10[] = _("{EMOJI_HIGHBAR}{EMOJI_UNDERSCORE};: "); ================================================ FILE: src/learn_move.c ================================================ #include "global.h" #include "gflib.h" #include "script.h" #include "task.h" #include "data.h" #include "trig.h" #include "field_fadetransition.h" #include "overworld.h" #include "new_menu_helpers.h" #include "menu.h" #include "list_menu.h" #include "event_data.h" #include "text_window.h" #include "pokemon_summary_screen.h" #include "graphics.h" #include "strings.h" #include "constants/songs.h" #include "constants/moves.h" /* * Move relearner state machine * ------------------------ * * CB2_MoveRelearner_Init * - Creates listMenuScrollPos to listen to right/left buttons. * - Creates listMenuScrollRow to listen to up/down buttons. * MoveRelearnerStateMachine: MENU_STATE_FADE_TO_BLACK * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_FADE * - Go to MENU_STATE_IDLE_BATTLE_MODE * * MoveRelearnerStateMachine: MENU_STATE_SETUP_BATTLE_MODE * MoveRelearnerStateMachine: MENU_STATE_IDLE_BATTLE_MODE * - If the player selected a move (pressed A), go to MENU_STATE_PRINT_TEACH_MOVE_PROMPT. * - If the player cancelled (pressed B), go to MENU_STATE_PRINT_GIVE_UP_PROMPT. * * MoveRelearnerStateMachine: MENU_STATE_PRINT_TEACH_MOVE_PROMPT * MoveRelearnerStateMachine: MENU_STATE_TEACH_MOVE_CONFIRM * - Wait for the player to confirm. * - If cancelled, go to MENU_STATE_SETUP_BATTLE_MODE. * - If confirmed and the pokemon had an empty move slot, set VAR_0x8004 to TRUE and go to * MENU_STATE_PRINT_TEXT_THEN_FANFARE. * - If confirmed and the pokemon doesn't have an empty move slot, go to * MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT. * * MoveRelearnerStateMachine: MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_TRYING_TO_LEARN * MoveRelearnerStateMachine: MENU_STATE_CONFIRM_DELETE_OLD_MOVE * - If the player confirms, go to MENU_STATE_PRINT_WHICH_MOVE_PROMPT. * - If the player cancels, go to MENU_STATE_PRINT_STOP_TEACHING * * MoveRelearnerStateMachine: MENU_STATE_PRINT_STOP_TEACHING * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_STOP_TEACHING * MoveRelearnerStateMachine: MENU_STATE_CONFIRM_STOP_TEACHING * - If the player confirms, go to MENU_STATE_CHOOSE_SETUP_STATE. * - If the player cancels, go back to MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT. * * MoveRelearnerStateMachine: MENU_STATE_PRINT_WHICH_MOVE_PROMPT * MoveRelearnerStateMachine: MENU_STATE_SHOW_MOVE_SUMMARY_SCREEN * - Go to ShowSelectMovePokemonSummaryScreen. When done, control returns to * CB2_MoveRelearner_Resume. * * MoveRelearnerStateMachine: MENU_STATE_DOUBLE_FANFARE_FORGOT_MOVE * MoveRelearnerStateMachine: MENU_STATE_PRINT_TEXT_THEN_FANFARE * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_FANFARE * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_A_BUTTON * MoveRelearnerStateMachine: MENU_STATE_FADE_AND_RETURN * MoveRelearnerStateMachine: MENU_STATE_RETURN_TO_FIELD * - Clean up and go to CB2_ReturnToField. * * MoveRelearnerStateMachine: MENU_STATE_PRINT_GIVE_UP_PROMPT * MoveRelearnerStateMachine: MENU_STATE_GIVE_UP_CONFIRM * - If the player confirms, go to MENU_STATE_FADE_AND_RETURN, and set VAR_0x8004 to FALSE. * - If the player cancels, go to MENU_STATE_SETUP_BATTLE_MODE. * * CB2_MoveRelearner_Resume: * - Do most of the same stuff as CB2_MoveRelearner_Init. * MoveRelearnerStateMachine: MENU_STATE_FADE_FROM_SUMMARY_SCREEN * MoveRelearnerStateMachine: MENU_STATE_TRY_OVERWRITE_MOVE * - If any of the pokemon's existing moves were chosen, overwrite the move and * go to MENU_STATE_DOUBLE_FANFARE_FORGOT_MOVE and set VAR_0x8004 to TRUE. * - If the chosen move is the one the player selected before the summary screen, * go to MENU_STATE_PRINT_STOP_TEACHING. * */ #define MENU_STATE_FADE_TO_BLACK 0 #define MENU_STATE_WAIT_FOR_FADE 1 #define MENU_STATE_UNREACHABLE 2 #define MENU_STATE_SETUP_BATTLE_MODE 3 #define MENU_STATE_IDLE_BATTLE_MODE 4 // States 5, 6, and 7 are skipped. #define MENU_STATE_PRINT_TEACH_MOVE_PROMPT 8 #define MENU_STATE_TEACH_MOVE_CONFIRM 9 // States 10 and 11 are skipped. #define MENU_STATE_PRINT_GIVE_UP_PROMPT 12 #define MENU_STATE_GIVE_UP_CONFIRM 13 #define MENU_STATE_FADE_AND_RETURN 14 #define MENU_STATE_RETURN_TO_FIELD 15 #define MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT 16 #define MENU_STATE_WAIT_FOR_TRYING_TO_LEARN 17 #define MENU_STATE_CONFIRM_DELETE_OLD_MOVE 18 #define MENU_STATE_PRINT_WHICH_MOVE_PROMPT 19 #define MENU_STATE_SHOW_MOVE_SUMMARY_SCREEN 20 // States 21, 22, and 23 are skipped. #define MENU_STATE_PRINT_STOP_TEACHING 24 #define MENU_STATE_WAIT_FOR_STOP_TEACHING 25 #define MENU_STATE_CONFIRM_STOP_TEACHING 26 #define MENU_STATE_CHOOSE_SETUP_STATE 27 #define MENU_STATE_FADE_FROM_SUMMARY_SCREEN 28 #define MENU_STATE_TRY_OVERWRITE_MOVE 29 #define MENU_STATE_DOUBLE_FANFARE_FORGOT_MOVE 30 #define MENU_STATE_PRINT_TEXT_THEN_FANFARE 31 #define MENU_STATE_WAIT_FOR_FANFARE 32 #define MENU_STATE_WAIT_FOR_A_BUTTON 33 struct MoveTutorMoveInfoHeaders { const u8 *text; u8 left; u8 right; u8 index; // unused }; struct LearnMoveGfxResources { u8 state; u8 unk_01; u8 unk_02; u8 spriteIds[2]; u8 filler_05[0x13]; u8 unk_18; u8 scrollPositionMaybe; u8 numLearnableMoves; u8 unk_1B; u8 unk_1C; u8 unk_1D; u8 unk_1E; struct ListMenuItem listMenuItems[25]; u16 learnableMoves[25]; u8 listMenuStrbufs[25][13]; bool8 scheduleMoveInfoUpdate; u8 selectedPartyMember; u8 selectedMoveSlot; u8 unk_262; u8 listMenuTaskId; u8 bg1TilemapBuffer[BG_SCREEN_SIZE]; // 264 u8 textColor[3]; // A64 u8 selectedIndex; u16 listMenuScrollPos; u16 listMenuScrollRow; }; static EWRAM_DATA struct LearnMoveGfxResources * sMoveRelearner = NULL; static void Task_InitMoveRelearnerMenu(u8 taskId); static void CB2_MoveRelearner_Init(void); static void CB2_MoveRelearner(void); static void MoveRelearnerStateMachine(void); static void DrawTextBorderOnWindows6and7(void); static void PrintTeachWhichMoveToStrVar1(bool8 onInit); static void InitMoveRelearnerStateVariables(void); static void SpriteCB_ListMenuScrollIndicators(struct Sprite *sprite); static void SpawnListMenuScrollIndicatorSprites(void); static void MoveRelearnerInitListMenuBuffersEtc(void); static void MoveRelearnerMenuHandleInput(void); static void MoveLearnerInitListMenu(void); static void LoadMoveInfoUI(void); static void PrintMoveInfoHandleCancel_CopyToVram(void); static void MoveRelearnerMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); static s8 YesNoMenuProcessInput(void); static void PrintTextOnWindow(u8 windowId, const u8 *str, u8 x, u8 y, s32 speed, s32 colorIdx); static const u16 sLearnMoveInterfaceSpritesPalette[] = INCBIN_U16("graphics/learn_move/interface_sprites.gbapal"); static const u16 sLearnMoveInterfaceSpritesTiles[] = INCBIN_U16("graphics/learn_move/interface_sprites.4bpp"); static const u8 sMoveTutorMenuWindowFrameDimensions[][4] = { { 0, 0, 19, 13}, {20, 0, 29, 13}, { 2, 14, 27, 19} }; static const struct SpriteSheet sSpriteSheet_ListMenuScrollIndicators = { sLearnMoveInterfaceSpritesTiles, 0x180, 5525 }; static const struct SpritePalette sSpritePalette_ListMenuScrollIndicators = { sLearnMoveInterfaceSpritesPalette, 5526 }; static const struct OamData sOamdata_MoveRelearnerListMenuScrollIndicators = { .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8) }; static const union AnimCmd sAnimCmd_ScrollIndicatorDown[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ScrollIndicatorUp[] = { ANIMCMD_FRAME(6, 5), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_MoveRelearnerListMenuScrollIndicators[] = { sAnimCmd_ScrollIndicatorDown, sAnimCmd_ScrollIndicatorUp }; static const struct SpriteTemplate sSpriteTemplate_MoveRelearnerListMenuScrollIndicators = { 5525, 5526, &sOamdata_MoveRelearnerListMenuScrollIndicators, sSpriteAnimTable_MoveRelearnerListMenuScrollIndicators, NULL, gDummySpriteAffineAnimTable, SpriteCB_ListMenuScrollIndicators }; static const struct BgTemplate sBgTemplates[2] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .priority = 0 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 8, .priority = 1 } }; static const struct WindowTemplate sWindowTemplates[9] = { { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 6, .height = 7, .paletteNum = 13, .baseBlock = 0x014 }, { .bg = 0, .tilemapLeft = 10, .tilemapTop = 0, .width = 5, .height = 5, .paletteNum = 13, .baseBlock = 0x03e }, { .bg = 0, .tilemapLeft = 5, .tilemapTop = 0, .width = 5, .height = 2, .paletteNum = 13, .baseBlock = 0x057 }, { .bg = 0, .tilemapLeft = 15, .tilemapTop = 0, .width = 3, .height = 5, .paletteNum = 15, .baseBlock = 0x061 }, { .bg = 0, .tilemapLeft = 5, .tilemapTop = 2, .width = 3, .height = 3, .paletteNum = 15, .baseBlock = 0x070 }, { .bg = 0, .tilemapLeft = 2, .tilemapTop = 6, .width = 15, .height = 8, .paletteNum = 15, .baseBlock = 0x079 }, { .bg = 0, .tilemapLeft = 19, .tilemapTop = 1, .width = 10, .height = 12, .paletteNum = 15, .baseBlock = 0x0f1 }, { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 15, .baseBlock = 0x169 }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sMoveRelearnerYesNoMenuTemplate = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 8, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x1d1 }; static const struct ListMenuTemplate sMoveRelearnerListMenuTemplate = { .items = NULL, .moveCursorFunc = MoveRelearnerMenu_MoveCursorFunc, .itemPrintFunc = NULL, .totalItems = 0, .maxShowed = 7, .windowId = 6, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = FONT_NORMAL, .cursorKind = 0, }; static void VBlankCB_MoveRelearner(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void DisplayMoveTutorMenu(void) { LockPlayerFieldControls(); CreateTask(Task_InitMoveRelearnerMenu, 10); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); } static void Task_InitMoveRelearnerMenu(u8 taskId) { if (!gPaletteFade.active) { SetMainCallback2(CB2_MoveRelearner_Init); gFieldCallback = FieldCB_ContinueScriptHandleMusic; DestroyTask(taskId); } } static void MoveRelearnerLoadBgGfx(void) { int i; ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); ResetTempTileDataBuffers(); if (InitWindows(sWindowTemplates)) { DeactivateAllTextPrinters(); for (i = 0; i < NELEMS(sWindowTemplates); i++) { ClearWindowTilemap(i); FillWindowPixelBuffer(i, PIXEL_FILL(0)); } FillWindowPixelBuffer(7, PIXEL_FILL(1)); FillBgTilemapBufferRect(0, 0x000, 0, 0, 30, 20, 15); SetBgTilemapBuffer(1, sMoveRelearner->bg1TilemapBuffer); LoadUserWindowGfx(0, 1, BG_PLTT_ID(14)); ListMenuLoadStdPalAt(BG_PLTT_ID(13), 1); LoadPalette(gMoveRelearner_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); DecompressAndLoadBgGfxUsingHeap(1, gMoveRelearner_Gfx, 0, 0, 0); CopyToBgTilemapBuffer(1, gMoveRelearner_Tilemap, 0, 0); CopyBgTilemapBufferToVram(1); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); } } static void CB2_MoveRelearner_Init(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); sMoveRelearner = AllocZeroed(sizeof(struct LearnMoveGfxResources)); InitMoveRelearnerStateVariables(); sMoveRelearner->selectedPartyMember = gSpecialVar_0x8004; MoveRelearnerInitListMenuBuffersEtc(); SetVBlankCallback(VBlankCB_MoveRelearner); MoveRelearnerLoadBgGfx(); SpawnListMenuScrollIndicatorSprites(); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); SetMainCallback2(CB2_MoveRelearner); } static void CB2_MoveRelearner_Resume(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); MoveRelearnerInitListMenuBuffersEtc(); sMoveRelearner->selectedMoveSlot = gSpecialVar_0x8005; SetVBlankCallback(VBlankCB_MoveRelearner); MoveRelearnerLoadBgGfx(); SpawnListMenuScrollIndicatorSprites(); SetBackdropFromColor(RGB_BLACK); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); SetMainCallback2(CB2_MoveRelearner); } static void CB2_MoveRelearner(void) { if (!IsTextPrinterActive(7)) MoveRelearnerStateMachine(); if (sMoveRelearner->scheduleMoveInfoUpdate) { PrintMoveInfoHandleCancel_CopyToVram(); sMoveRelearner->scheduleMoveInfoUpdate = FALSE; } RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void StringExpandPlaceholdersAndPrintTextOnWindow7Color2(const u8 *str) { StringExpandPlaceholders(gStringVar4, str); PrintTextOnWindow(7, gStringVar4, 0, 2, GetTextSpeedSetting(), 2); } static void MoveRelearnerStateMachine(void) { u16 move; switch (sMoveRelearner->state) { case MENU_STATE_FADE_TO_BLACK: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); ShowBg(0); ShowBg(1); LoadMoveInfoUI(); sMoveRelearner->state++; DrawTextBorderOnWindows6and7(); PrintTeachWhichMoveToStrVar1(FALSE); MoveLearnerInitListMenu(); sMoveRelearner->scheduleMoveInfoUpdate = TRUE; break; case MENU_STATE_WAIT_FOR_FADE: if (!gPaletteFade.active) sMoveRelearner->state = 4; break; case MENU_STATE_UNREACHABLE: sMoveRelearner->state++; break; case MENU_STATE_SETUP_BATTLE_MODE: PrintTeachWhichMoveToStrVar1(FALSE); sMoveRelearner->scheduleMoveInfoUpdate = TRUE; sMoveRelearner->state++; break; case MENU_STATE_IDLE_BATTLE_MODE: MoveRelearnerMenuHandleInput(); break; case MENU_STATE_PRINT_TEACH_MOVE_PROMPT: CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0); sMoveRelearner->state++; break; case MENU_STATE_TEACH_MOVE_CONFIRM : switch (YesNoMenuProcessInput()) { case 0: if (GiveMoveToMon(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]) != 0xFFFF) { StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_MonLearnedMove); gSpecialVar_0x8004 = TRUE; sMoveRelearner->state = 31; } else { sMoveRelearner->state = 16; } break; case 1: case -1: sMoveRelearner->state = 3; break; } break; case MENU_STATE_PRINT_GIVE_UP_PROMPT: CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0); sMoveRelearner->state++; break; case MENU_STATE_GIVE_UP_CONFIRM: switch (YesNoMenuProcessInput()) { case 0: gSpecialVar_0x8004 = FALSE; sMoveRelearner->state = 14; break; case 1: case -1: sMoveRelearner->state = 3; break; } break; case MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT: StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_MonIsTryingToLearnMove); sMoveRelearner->state++; break; case MENU_STATE_WAIT_FOR_TRYING_TO_LEARN: CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0); sMoveRelearner->state = 18; break; case MENU_STATE_CONFIRM_DELETE_OLD_MOVE: switch (YesNoMenuProcessInput()) { case 0: StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_WhichMoveShouldBeForgotten); sMoveRelearner->state = 19; break; case 1: case -1: sMoveRelearner->state = 24; break; } break; case MENU_STATE_PRINT_STOP_TEACHING: StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_StopLearningMove); sMoveRelearner->state++; break; case MENU_STATE_WAIT_FOR_STOP_TEACHING: CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0); sMoveRelearner->state = 26; break; case MENU_STATE_CONFIRM_STOP_TEACHING: switch (YesNoMenuProcessInput()) { case 0: sMoveRelearner->state = 27; break; case 1: case -1: sMoveRelearner->state = 16; break; } break; case MENU_STATE_CHOOSE_SETUP_STATE : sMoveRelearner->state = 3; break; case MENU_STATE_PRINT_WHICH_MOVE_PROMPT: sMoveRelearner->state = 20; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case MENU_STATE_SHOW_MOVE_SUMMARY_SCREEN: if (!gPaletteFade.active) { ListMenuGetScrollAndRow(sMoveRelearner->listMenuTaskId, &sMoveRelearner->listMenuScrollPos, &sMoveRelearner->listMenuScrollRow); FreeAllWindowBuffers(); ShowSelectMovePokemonSummaryScreen(gPlayerParty, sMoveRelearner->selectedPartyMember, gPlayerPartyCount - 1, CB2_MoveRelearner_Resume, sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]); sMoveRelearner->state = 28; } break; case 21: sMoveRelearner->state = 14; break; case 22: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; case MENU_STATE_FADE_AND_RETURN: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sMoveRelearner->state++; break; case MENU_STATE_RETURN_TO_FIELD: if (!gPaletteFade.active) { FreeAllWindowBuffers(); Free(sMoveRelearner); SetMainCallback2(CB2_ReturnToField); } break; case MENU_STATE_FADE_FROM_SUMMARY_SCREEN: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); ShowBg(0); ShowBg(1); sMoveRelearner->state++; LoadMoveInfoUI(); DrawTextBorderOnWindows6and7(); MoveLearnerInitListMenu(); PrintTeachWhichMoveToStrVar1(TRUE); PrintMoveInfoHandleCancel_CopyToVram(); break; case MENU_STATE_TRY_OVERWRITE_MOVE: if (!gPaletteFade.active) { if (sMoveRelearner->selectedMoveSlot == 4) { sMoveRelearner->state = 24; } else { move = GetMonData(&gPlayerParty[sMoveRelearner->selectedPartyMember], MON_DATA_MOVE1 + sMoveRelearner->selectedMoveSlot); StringCopy(gStringVar3, gMoveNames[move]); RemoveMonPPBonus(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->selectedMoveSlot); SetMonMoveSlot(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex], sMoveRelearner->selectedMoveSlot); StringCopy(gStringVar2, gMoveNames[sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]]); StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_1_2_and_Poof); sMoveRelearner->state = 30; gSpecialVar_0x8004 = TRUE; } } break; case MENU_STATE_DOUBLE_FANFARE_FORGOT_MOVE: StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_MonForgotOldMoveAndMonLearnedNewMove); sMoveRelearner->state = 31; PlayFanfare(MUS_LEVEL_UP); break; case MENU_STATE_PRINT_TEXT_THEN_FANFARE: PlayFanfare(MUS_LEVEL_UP); sMoveRelearner->state = 32; break; case MENU_STATE_WAIT_FOR_FANFARE: if (IsFanfareTaskInactive()) sMoveRelearner->state = 33; break; case MENU_STATE_WAIT_FOR_A_BUTTON: if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); sMoveRelearner->state = 14; } break; } } static void DrawTextBorderOnWindows6and7(void) { int i; for (i = 6; i < 8; i++) DrawTextBorderOuter(i, 0x001, 14); } static void PrintTeachWhichMoveToStrVar1(bool8 onInit) { if (!onInit) { StringExpandPlaceholders(gStringVar4, gText_TeachWhichMoveToMon); PrintTextOnWindow(7, gStringVar4, 0, 2, 0, 2); PutWindowTilemap(7); CopyWindowToVram(7, COPYWIN_FULL); } } static void InitMoveRelearnerStateVariables(void) { int i; sMoveRelearner->state = 0; sMoveRelearner->unk_02 = 0; sMoveRelearner->scrollPositionMaybe = 0; sMoveRelearner->unk_18 = 0; sMoveRelearner->unk_1C = 0; sMoveRelearner->numLearnableMoves = 0; sMoveRelearner->unk_1B = 0; sMoveRelearner->unk_1D = 0; sMoveRelearner->unk_1E = 0; sMoveRelearner->scheduleMoveInfoUpdate = FALSE; for (i = 0; i < 20; i++) sMoveRelearner->learnableMoves[i] = MOVE_NONE; } static void SpriteCB_ListMenuScrollIndicators(struct Sprite *sprite) { s16 abcissa = (sprite->data[1] * 10) & 0xFF; switch (sprite->data[0]) { case 0: break; case 1: sprite->x2 = Sin(abcissa, 3) * sprite->data[2]; break; case 2: sprite->y2 = Sin(abcissa, 1) * sprite->data[2]; break; } sprite->data[1]++; } static void SpawnListMenuScrollIndicatorSprites(void) { int i; LoadSpriteSheet(&sSpriteSheet_ListMenuScrollIndicators); LoadSpritePalette(&sSpritePalette_ListMenuScrollIndicators); sMoveRelearner->spriteIds[0] = CreateSprite(&sSpriteTemplate_MoveRelearnerListMenuScrollIndicators, 200, 4, 0); StartSpriteAnim(&gSprites[sMoveRelearner->spriteIds[0]], 1); gSprites[sMoveRelearner->spriteIds[0]].data[0] = 2; gSprites[sMoveRelearner->spriteIds[0]].data[2] = -1; // Bug: This should be using the second element of spriteIds. sMoveRelearner->spriteIds[0] = CreateSprite(&sSpriteTemplate_MoveRelearnerListMenuScrollIndicators, 200, 108, 0); gSprites[sMoveRelearner->spriteIds[0]].data[0] = 2; gSprites[sMoveRelearner->spriteIds[0]].data[2] = 1; for (i = 0; i < 2; i++) gSprites[sMoveRelearner->spriteIds[i]].invisible = TRUE; } static void MoveRelearnerInitListMenuBuffersEtc(void) { int i; s32 count; u8 nickname[11]; sMoveRelearner->numLearnableMoves = GetMoveRelearnerMoves(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves); count = sMoveRelearner->numLearnableMoves; for (i = 0; i < sMoveRelearner->numLearnableMoves; i++) StringCopy(sMoveRelearner->listMenuStrbufs[i], gMoveNames[sMoveRelearner->learnableMoves[i]]); GetMonData(&gPlayerParty[sMoveRelearner->selectedPartyMember], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gStringVar1, nickname); StringCopy(sMoveRelearner->listMenuStrbufs[sMoveRelearner->numLearnableMoves], gFameCheckerText_Cancel); sMoveRelearner->numLearnableMoves++; for (i = 0; i < count; i++) { sMoveRelearner->listMenuItems[i].label = sMoveRelearner->listMenuStrbufs[i]; sMoveRelearner->listMenuItems[i].index = i; } sMoveRelearner->listMenuItems[i].label = gFameCheckerText_Cancel; sMoveRelearner->listMenuItems[i].index = 0xFE; gMultiuseListMenuTemplate = sMoveRelearnerListMenuTemplate; gMultiuseListMenuTemplate.items = sMoveRelearner->listMenuItems; gMultiuseListMenuTemplate.totalItems = count + 1; } static void MoveRelearnerMenuHandleInput(void) { ListMenu_ProcessInput(sMoveRelearner->listMenuTaskId); if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); if (sMoveRelearner->selectedIndex != 0xFE) { sMoveRelearner->state = 8; StringCopy(gStringVar2, sMoveRelearner->listMenuStrbufs[sMoveRelearner->selectedIndex]); StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_TeachMoveQues); } else { StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_GiveUpTryingToTeachNewMove); sMoveRelearner->state = 12; } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); sMoveRelearner->state = 12; StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_GiveUpTryingToTeachNewMove); } if (sMoveRelearner->numLearnableMoves > 6) { gSprites[0].invisible = FALSE; gSprites[1].invisible = FALSE; if (sMoveRelearner->scrollPositionMaybe == 0) gSprites[0].invisible = TRUE; else if (sMoveRelearner->scrollPositionMaybe == sMoveRelearner->numLearnableMoves - 6) gSprites[1].invisible = TRUE; } } static void MoveLearnerInitListMenu(void) { sMoveRelearner->listMenuTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sMoveRelearner->listMenuScrollPos, sMoveRelearner->listMenuScrollRow); CopyWindowToVram(6, COPYWIN_MAP); } static void PrintMoveInfo(u16 move) { u8 buffer[50]; BlitMenuInfoIcon(2, gBattleMoves[move].type + 1, 1, 4); if (gBattleMoves[move].power < 2) { PrintTextOnWindow(3, gText_ThreeHyphens, 1, 4, 0, 0); } else { ConvertIntToDecimalStringN(buffer, gBattleMoves[move].power, STR_CONV_MODE_RIGHT_ALIGN, 3); PrintTextOnWindow(3, buffer, 1, 4, 0, 0); } if (gBattleMoves[move].accuracy == 0) { PrintTextOnWindow(3, gText_ThreeHyphens, 1, 18, 0, 1); } else { ConvertIntToDecimalStringN(buffer, gBattleMoves[move].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); PrintTextOnWindow(3, buffer, 1, 18, 0, 1); } ConvertIntToDecimalStringN(buffer, gBattleMoves[move].pp, STR_CONV_MODE_LEFT_ALIGN, 2); PrintTextOnWindow(4, buffer, 2, 2, 0, 0); PrintTextOnWindow(5, gMoveDescriptionPointers[move - 1], 1, 0, 0, 0); } static void LoadMoveInfoUI(void) { BlitMenuInfoIcon(0, MENU_INFO_ICON_TYPE, 1, 4); BlitMenuInfoIcon(1, MENU_INFO_ICON_POWER, 0, 4); BlitMenuInfoIcon(1, MENU_INFO_ICON_ACCURACY, 0, 19); BlitMenuInfoIcon(0, MENU_INFO_ICON_PP, 1, 19); BlitMenuInfoIcon(0, MENU_INFO_ICON_EFFECT, 1, 34); PutWindowTilemap(0); PutWindowTilemap(1); PutWindowTilemap(4); PutWindowTilemap(3); PutWindowTilemap(5); PutWindowTilemap(2); PutWindowTilemap(7); CopyWindowToVram(0, COPYWIN_GFX); CopyWindowToVram(1, COPYWIN_GFX); } static void PrintMoveInfoHandleCancel_CopyToVram(void) { int i; if (sMoveRelearner->selectedIndex != 0xFE) { PrintMoveInfo(sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]); } else { for (i = 2; i < 6; i++) { FillWindowPixelBuffer(i, PIXEL_FILL(0)); CopyWindowToVram(i, COPYWIN_GFX); } } CopyWindowToVram(3, COPYWIN_GFX); CopyWindowToVram(4, COPYWIN_GFX); CopyWindowToVram(2, COPYWIN_GFX); CopyWindowToVram(2, COPYWIN_GFX); CopyWindowToVram(5, COPYWIN_GFX); CopyWindowToVram(7, COPYWIN_FULL); } static void MoveRelearnerMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) { if (!onInit) { PlaySE(SE_SELECT); sMoveRelearner->scheduleMoveInfoUpdate = TRUE; sMoveRelearner->selectedIndex = itemIndex; } } static s8 YesNoMenuProcessInput(void) { s8 input = Menu_ProcessInputNoWrapClearOnChoose(); if (input != -2) { PutWindowTilemap(6); CopyWindowToVram(6, COPYWIN_MAP); } return input; } static void PrintTextOnWindow(u8 windowId, const u8 *str, u8 x, u8 y, s32 speed, s32 colorIdx) { s32 letterSpacing = 1; s32 lineSpacing = 1; if (colorIdx == 0 || colorIdx == 1) { letterSpacing = 0; lineSpacing = 0; } switch (colorIdx) { case 0: case 1: sMoveRelearner->textColor[0] = 0; sMoveRelearner->textColor[1] = 2; sMoveRelearner->textColor[2] = 3; break; case 2: sMoveRelearner->textColor[0] = 1; sMoveRelearner->textColor[1] = 2; sMoveRelearner->textColor[2] = 3; } if (colorIdx != 1) FillWindowPixelBuffer(windowId, PIXEL_FILL(sMoveRelearner->textColor[0])); AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_2, x, y, letterSpacing, lineSpacing, sMoveRelearner->textColor, speed, str); } ================================================ FILE: src/libagbsyscall.s ================================================ .include "constants/gba_constants.inc" .include "asm/macros.inc" .syntax unified .text thumb_func_start ArcTan2 ArcTan2: svc 0xA bx lr thumb_func_end ArcTan2 thumb_func_start BgAffineSet BgAffineSet: svc 0xE bx lr thumb_func_end BgAffineSet thumb_func_start CpuFastSet CpuFastSet: svc 0xC bx lr thumb_func_end CpuFastSet thumb_func_start CpuSet CpuSet: svc 0xB bx lr thumb_func_end CpuSet thumb_func_start Div Div: svc 0x6 bx lr thumb_func_end Div thumb_func_start LZ77UnCompVram LZ77UnCompVram: svc 0x12 bx lr thumb_func_end LZ77UnCompVram thumb_func_start LZ77UnCompWram LZ77UnCompWram: svc 0x11 bx lr thumb_func_end LZ77UnCompWram thumb_func_start MultiBoot MultiBoot: movs r1, 0x1 svc 0x25 bx lr thumb_func_end MultiBoot thumb_func_start ObjAffineSet ObjAffineSet: svc 0xF bx lr thumb_func_end ObjAffineSet thumb_func_start RegisterRamReset RegisterRamReset: svc 0x1 bx lr thumb_func_end RegisterRamReset thumb_func_start SoftReset SoftReset: ldr r3, =REG_IME movs r2, 0 strb r2, [r3] ldr r1, =0x03007f00 @ User Stack mov sp, r1 svc 0x1 svc 0 .pool thumb_func_end SoftReset thumb_func_start Sqrt Sqrt: svc 0x8 bx lr thumb_func_end Sqrt thumb_func_start VBlankIntrWait VBlankIntrWait: movs r2, 0 svc 0x5 bx lr thumb_func_end VBlankIntrWait .align 2, 0 @ Don't pad with nop. ================================================ FILE: src/libgcnmultiboot.s ================================================ @ This library can be used to download and execute a multi-boot image from @ a GameCube using the JOY Bus protocol over the link cable. .include "asm/macros.inc" .include "constants/constants.inc" .equiv GCMB_STRUCT_COUNTER1, 0x00 .equiv GCMB_STRUCT_COUNTER2, 0x01 .equiv GCMB_STRUCT_MBPROGRESS, 0x02 .equiv GCMB_STRUCT_SAVEDVCOUNT, 0x03 .equiv GCMB_STRUCT_KEYA, 0x04 .equiv GCMB_STRUCT_KEYB, 0x08 .equiv GCMB_STRUCT_KEYC, 0x0C .equiv GCMB_STRUCT_BOOT_KEY, 0x10 .equiv GCMB_STRUCT_IMAGE_SIZE, 0x12 .equiv GCMB_STRUCT_SESSION_KEY, 0x14 .equiv GCMB_STRUCT_HASH_VAL, 0x18 .equiv GCMB_STRUCT_KEYC_DERIVATION, 0x1C .equiv GCMB_STRUCT_BASE_DEST_PTR, 0x20 .equiv GCMB_STRUCT_CUR_DEST_PTR, 0x24 .equiv GCMB_STRUCT_SERIAL_INTR_HANDLER, 0x28 .equiv ROM_HEADER_NINTENDO_LOGO_OFFSET, 0x04 .equiv ROM_HEADER_NINTENDO_LOGO_LENGTH, 0x98 .equiv ROM_HEADER_NINTENDO_LOGO_END, 0xA0 .equiv MBPROGRESS_NONE, 0x00 .equiv MBPROGRESS_LOGO_CORRECT, 0x01 .equiv MBPROGRESS_READY_TO_BOOT, 0x02 .equiv GCMB_MAGIC_BOOTKEY_HASHVAL, 0xBB .equiv GCMB_MAGIC_BOOTKEY, 0xBB .equiv GCMB_MAGIC_COUNTER2, 0xCC .equiv GCMB_MAGIC_KEYA, 0xDD .equiv GCMB_MAGIC_KEYB, 0xEE .equiv GCMB_MAGIC_KEYCDERIVATION, 0xFF .syntax unified .text thumb_func_start GameCubeMultiBoot_Hash GameCubeMultiBoot_Hash: push {r4,lr} ldr r4, pool_HashVal eors r3, r1 movs r2, 0x20 GameCubeMultiBoot_Hash_Loop: lsrs r3, 1 bcc GameCubeMultiBoot_Hash_SkipEor eors r3, r4 GameCubeMultiBoot_Hash_SkipEor: subs r2, 0x1 bne GameCubeMultiBoot_Hash_Loop pop {r4,pc} thumb_func_end GameCubeMultiBoot_Hash thumb_func_start GameCubeMultiBoot_Main @ void GameCubeMultiBoot_Main(struct GameCubeMultiBoot *mb)@ GameCubeMultiBoot_Main: @ If there is no interrupt handler, skip counter manipulation ldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] cmp r1, 0 beq GameCubeMultiBoot_Main_SkipCounters @ Increment the second counter ldrb r1, [r0, GCMB_STRUCT_COUNTER2] adds r1, 0x1 strb r1, [r0, GCMB_STRUCT_COUNTER2] @ If there is nothing more to do, bail out ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] cmp r1, MBPROGRESS_READY_TO_BOOT beq GameCubeMultiBoot_Main_Return @ Save current interrupt master register value ldr r3, pool_InterruptRegs ldrh r2, [r3, OFFSET_REG_IME - 0x200] @ Disable all interrupts movs r1, 0 strh r1, [r3, OFFSET_REG_IME - 0x200] @ Increment the first counter, if it's less than or equal to 10. ldrb r1, [r0, GCMB_STRUCT_COUNTER1] cmp r1, 0xA bgt GameCubeMultiBoot_Main_SkipCounter1Inc adds r1, 0x1 strb r1, [r0, GCMB_STRUCT_COUNTER1] GameCubeMultiBoot_Main_SkipCounter1Inc: @ Load the saved interrupt master register value (re-enables interrupts if they were enabled before) strh r2, [r3, OFFSET_REG_IME - 0x200] GameCubeMultiBoot_Main_SkipCounters: @ Initialise multiboot structures if required bcs GameCubeMultiBoot_Init @ Skip this section (check Nintendo logo) if the check has already passed ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] cmp r1, MBPROGRESS_NONE bne GameCubeMultiBoot_Main_SkipLogoCheck @ Bail out if no multiboot image data has been transferred yet ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] subs r1, r2 beq GameCubeMultiBoot_Main_Return2 @ Also bail out if not enough data has been transferred cmp r1, ROM_HEADER_NINTENDO_LOGO_END bcc GameCubeMultiBoot_Main_Return2 @ Compare the Nintendo logo of the transferred multiboot image header, with the one in the ROM image of the inserted cart push {r4-r6} movs r1, ROM_HEADER_NINTENDO_LOGO_LENGTH adds r2, ROM_HEADER_NINTENDO_LOGO_OFFSET ldr r4, pool_NintendoLogo GameCubeMultiBoot_Main_LogoCmpLoop: ldm r2!, {r5} ldm r4!, {r6} cmp r5, r6 bne GameCubeMultiBoot_Main_LogoCmpEnd subs r1, 0x4 bne GameCubeMultiBoot_Main_LogoCmpLoop ldm r2!, {r5} ldm r4!, {r6} eors r5, r6 lsrs r5, 8 str r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] GameCubeMultiBoot_Main_LogoCmpEnd: pop {r4-r6} @ Throw everything away if the logo data didn't match bne GameCubeMultiBoot_Init @ Logo matched, set the relevent multiboot progress bit movs r1, MBPROGRESS_LOGO_CORRECT strb r1, [r0, GCMB_STRUCT_MBPROGRESS] @ XOR together KeyA and KeyB to get the initial multiboot image checksum value ldr r1, [r0, GCMB_STRUCT_KEYA] ldr r2, [r0, GCMB_STRUCT_KEYB] eors r1, r2 str r1, [r0, GCMB_STRUCT_HASH_VAL] @ ...also use it as the initial value for the image encryption session key. Algorithm is the same as the GBA BIOS multiboot: sessionkey = (initialvalue * 0x6177614b) + 1 ldr r2, pool_Kawa muls r1, r2 adds r1, 0x1 str r1, [r0, GCMB_STRUCT_SESSION_KEY] GameCubeMultiBoot_Main_Return: bx lr GameCubeMultiBoot_Main_SkipLogoCheck: @ If this code is executed, then the logo check has passed, and the data being transferred in is encrypted. @ Set up registers. ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] mov r12, r1 ldr r3, [r0, GCMB_STRUCT_HASH_VAL] push {r4-r7} ldr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] ldr r5, pool_Kawa ldr r6, [r0, GCMB_STRUCT_SESSION_KEY] ldr r7, pool_HashVal GameCubeMultiBoot_Main_ImageDecryptHashLoop: @ If there's no more data, break out of the loop cmp r4, r12 bcs GameCubeMultiBoot_Main_ImageDecryptHashEnd @ Get the next uint32 ldr r1, [r4] @ Decrypt the ciphertext: plaintext = (ciphertext ^ sessionkey) + hashval eors r1, r6 adds r1, r3 @ Save the current uint32 of plaintext and advance the pointer stm r4!, {r1} @ Advance the hashval with this uint32 of plaintext -- this is the same code as GameCubeMultiBoot_Hash. eors r3, r1 movs r2, 0x20 GameCubeMultiBoot_Main_HashLoop: lsrs r3, 1 bcc GameCubeMultiBoot_Main_HashSkipEor eors r3, r7 GameCubeMultiBoot_Main_HashSkipEor: subs r2, 0x1 bne GameCubeMultiBoot_Main_HashLoop @ Advance the sessionkey with the usual algorithm: sessionkey = (sessionkey * 0x6177614b) + 1 muls r6, r5 adds r6, 0x1 b GameCubeMultiBoot_Main_ImageDecryptHashLoop GameCubeMultiBoot_Main_ImageDecryptHashEnd: @ Save the new pointer, sessionkey, hashval str r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] str r6, [r0, GCMB_STRUCT_SESSION_KEY] pop {r4-r7} str r3, [r0, GCMB_STRUCT_HASH_VAL] @ Bail out if the image size is unknown ldrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] cmp r1, 0 bne GameCubeMultiBoot_Main_Return2 @ Bail out if no image data has been transferred ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] cmp r1, r2 bne GameCubeMultiBoot_Main_Return2 @ If KeyC hasn't been generated yet, go generate it ldr r1, [r0, GCMB_STRUCT_KEYC] cmp r1, 0 beq GameCubeMultiBoot_Main_GenerateKeyC @ If the other side hasn't sent its boot key yet, bail out ldrh r1, [r0, GCMB_STRUCT_BOOT_KEY] cmp r1, 0 beq GameCubeMultiBoot_Main_Return @ Save off LR so it doesn't get clobbered by the upcoming function call mov r12, lr @ Generate the real boot key, which is the checksum of a hardcoded value and KeyC movs r1, GCMB_MAGIC_BOOTKEY_HASHVAL ldr r3, [r0, GCMB_STRUCT_KEYC] bl GameCubeMultiBoot_Hash ldrh r1, [r0, GCMB_STRUCT_BOOT_KEY] @ Restore the saved LR value mov lr, r12 @ Compare the two boot keys (real and passed in), if they don't match then throw everything away subs r1, r3 bne GameCubeMultiBoot_Init @ The two boot keys matched, tell the caller that the image is ready to boot movs r1, MBPROGRESS_READY_TO_BOOT strb r1, [r0, GCMB_STRUCT_MBPROGRESS] @ Nothing more to do, return. bx lr GameCubeMultiBoot_Main_GenerateKeyC: @ Save off LR so it doesn't get clobbered by the upcoming function call mov r12, lr @ KeyC = (SavedVCount << 24) - 1 ldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT] lsls r1, 24 subs r1, 0x1 str r1, [r0, GCMB_STRUCT_KEYC] @ Hash the KeyC with the multiboot image checksum to generate the KeyC derivation material to be sent to the other side of the link bl GameCubeMultiBoot_Hash @ Make sure the sent KeyC derivation material contains a magic value so that the other side can detect it lsls r3, 8 adds r3, GCMB_MAGIC_KEYCDERIVATION @ Save off the KeyC derivation material and return to caller str r3, [r0, GCMB_STRUCT_KEYC_DERIVATION] bx r12 GameCubeMultiBoot_Main_Return2: bx lr thumb_func_end GameCubeMultiBoot_Main .align 2, 0 pool_HashVal: .4byte 0xa1c1 pool_Kawa: .ascii "Kawa" @ name of BIOS developer pool_NintendoLogo: .4byte RomHeaderNintendoLogo thumb_func_start GameCubeMultiBoot_ExecuteProgram @ void GameCubeMultiBoot_ExecuteProgram(struct GameCubeMultiBoot *mb)@ GameCubeMultiBoot_ExecuteProgram: @ If there's no multiboot image ready, just return to caller ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] cmp r1, MBPROGRESS_READY_TO_BOOT bne GameCubeMultiBoot_ExecuteProgram_Fail @ Disable interrupts ldr r3, pool_InterruptRegs movs r1, 0 strh r1, [r3, OFFSET_REG_IME - 0x200] @ Jump to the real entry point of the multiboot image (past the image header), in ARM mode ldr r1, pool_MultiBootLoadAddr adds r1, 0xC0 bx r1 GameCubeMultiBoot_ExecuteProgram_Fail: bx lr thumb_func_end GameCubeMultiBoot_ExecuteProgram thumb_func_start GameCubeMultiBoot_Init @ void GameCubeMultiBoot_Init(struct GameCubeMultiBoot *mb)@ GameCubeMultiBoot_Init: ldr r3, pool_InterruptRegs @ Save IME register. ldrh r2, [r3, OFFSET_REG_IME - 0x200] @ Disable interrupts. movs r1, 0 strh r1, [r3, OFFSET_REG_IME - 0x200] @ Set the handler to the "Stop" routine. @ Unless the first command that is received is a device reset command, the @ "Stop" routine will be executed and no further commands will be processed. adr r3, GcMbIntrHandler_Stop str r3, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] ldrb r3, [r0, 0x3] push {r3} ldrb r3, [r0, 0x1] push {r0,r3} adds r3, r0, 0 adds r3, GCMB_STRUCT_BASE_DEST_PTR @ clear all but the last 3 fields of the struct GameCubeMultiBoot_Init_ClearStructLoop: stm r0!, {r1} cmp r0, r3 blo GameCubeMultiBoot_Init_ClearStructLoop pop {r0,r3} lsrs r3, 1 strb r3, [r0, 0x3] pop {r3} strb r3, [r0, 0x1] ldr r3, pool_SerialRegs @ Turn off JOY Bus mode. lsls r0, r3, 10 strh r0, [r3, OFFSET_REG_RCNT - 0x120] @ Turn on JOY Bus mode. movs r0, 0xC0 lsls r0, 8 strh r0, [r3, OFFSET_REG_RCNT - 0x120] @ Init JOY Bus registers. movs r0, 0x47 strh r0, [r3, OFFSET_REG_JOYCNT - 0x120] strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] ldr r3, pool_InterruptRegs @ Acknowledge serial interrupt. movs r0, INTR_FLAG_SERIAL strh r0, [r3, OFFSET_REG_IF - 0x200] @ Enable serial interrupt. ldrh r1, [r3, OFFSET_REG_IE - 0x200] orrs r1, r0 strh r1, [r3, OFFSET_REG_IE - 0x200] @ Restore IME register. strh r2, [r3, OFFSET_REG_IME - 0x200] bx lr thumb_func_end GameCubeMultiBoot_Init non_word_aligned_thumb_func_start GameCubeMultiBoot_HandleSerialInterrupt @ void GameCubeMultiBoot_HandleSerialInterrupt(struct GameCubeMultiBoot *mb)@ GameCubeMultiBoot_HandleSerialInterrupt: ldr r3, pool_SerialRegs @ Acknowledge reset/receive/send flags. ldrh r1, [r3, OFFSET_REG_JOYCNT - 0x120] strh r1, [r3, OFFSET_REG_JOYCNT - 0x120] movs r2, 0 strb r2, [r0] ldr r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] cmp r2, 0 beq GameCubeMultiBoot_HandleSerialInterruptDone lsrs r1, 1 @ was a device reset command received? bcs GameCubeMultiBoot_BeginHandshake @ branch if so mov pc, r2 .align 2, 0 @ Zero the status and the interrupt handler pointer. @ Commands from the GameCube will not be processed after this is executed @ unless GameCubeMultiBoot_Init() is called again. GcMbIntrHandler_Stop: movs r2, 0 strh r2, [r3, OFFSET_REG_JOYSTAT - 0x120] GameCubeMultiBoot_SetInterruptHandler: str r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] GameCubeMultiBoot_ReadVCount: ldr r3, pool_RegDispstat ldrh r1, [r3, OFFSET_REG_VCOUNT - OFFSET_REG_DISPSTAT] strb r1, [r0, 0x3] GameCubeMultiBoot_HandleSerialInterruptDone: bx lr GameCubeMultiBoot_BeginHandshake: @ Throw away anything that got sent ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] @ Send the game code, the other side of the link must send back the same game code ldr r1, pool_RubyUSAGameCode str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] movs r1, 0x10 strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] @ Use the saved VCount value to provide 8 bits of entropy for KeyB ldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT] strb r1, [r0, GCMB_STRUCT_KEYB + 1] @ If a multiboot image has been transferred at least enough such that the Nintendo logo check has passed, stop everything. ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] cmp r1, 0 bne GcMbIntrHandler_Stop @ Set the image destination pointers. ldr r1, pool_MultiBootLoadAddr str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR] str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] @ Set the new interrupt handler. adr r2, GcMbIntrHandler_CheckGameCodeSent b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_CheckGameCodeSent: lsls r1, 31 bcc GcMbIntrHandler_Stop @ stop if send failed bmi GameCubeMultiBoot_CheckHandshakeResponse @ branch if receive is complete @ If the response hasn't been fully received yet, @ check again upon the next interrupt. adr r2, GcMbIntrHandler_CheckHandshakeResponse b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_CheckHandshakeResponse: lsrs r1, 1 @ is receive complete? bcc GcMbIntrHandler_Stop @ stop if not GameCubeMultiBoot_CheckHandshakeResponse: ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] ldr r2, pool_RubyUSAGameCode cmp r1, r2 bne GcMbIntrHandler_Stop @ stop if the GameCube didn't reply with the same game code @ Use the saved VCount value to provide another 8 bits of entropy for KeyB. ldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT] strb r1, [r0, GCMB_STRUCT_KEYB + 3] adr r2, GcMbIntrHandler_ReceiveKeyA b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_ReceiveKeyA: lsrs r1, 1 @ is receive complete? bcc GcMbIntrHandler_Stop @ branch if not ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] @ make sure top 8 bits of the received value is the KeyA magic number, stop if KeyA is invalid lsrs r2, r1, 24 cmp r2, GCMB_MAGIC_KEYA bne GcMbIntrHandler_Stop @ save received KeyA str r1, [r0, GCMB_STRUCT_KEYA] @ use the second GameCubeMultiBoot_Main() counter as another 8 bits of entropy for KeyB ldrb r1, [r0, GCMB_STRUCT_COUNTER2] strb r1, [r0, GCMB_STRUCT_KEYB + 2] movs r2, 0 movs r3, 0 ldr r1, [r0, GCMB_STRUCT_KEYB] lsrs r1, 8 @ make sure KeyB is valid (other side of the link is supposed to check KeyB too), if it's not then change the byte that was just set so it is GameCubeMultiBoot_KeyBCheckLoop: lsrs r1, 1 adcs r2, r3 cmp r1, 0 bne GameCubeMultiBoot_KeyBCheckLoop cmp r2, 0xE bgt GameCubeMultiBoot_KeyBSaveNewByte cmp r2, 0x7 bge GameCubeMultiBoot_KeyBCheckEnd movs r1, 0xFF GameCubeMultiBoot_KeyBSaveNewByte: strb r1, [r0, GCMB_STRUCT_KEYB + 2] GameCubeMultiBoot_KeyBCheckEnd: @ add in the KeyB magic number and send off KeyB ldr r1, [r0, GCMB_STRUCT_KEYB] adds r1, GCMB_MAGIC_KEYB ldr r3, pool_SerialRegs str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] movs r1, 0x30 strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] @ set new interrupt handler adr r2, GcMbIntrHandler_CheckKeyBSent b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_CheckKeyBSent: lsls r1, 31 bcc GcMbIntrHandler_Stop @ stop if send failed bmi GameCubeMultiBoot_CheckImageSizeResponse @ branch if receive is complete adr r2, GcMbIntrHandler_CheckImageSizeResponse b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_CheckImageSizeResponse: lsrs r1, 1 @ is receive complete? bcc GcMbIntrHandler_Stop @ branch if not GameCubeMultiBoot_CheckImageSizeResponse: ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] ldr r2, GameCubeMultiBoot_MaximumImageSizeUInt32s cmp r1, r2 bhs GcMbIntrHandler_Stop adds r1, 0x1 adds r1, r1 strh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] cmp r1, 0 GcMbIntrHandler_StopIfNotEqual: bne GcMbIntrHandler_Stop ldr r1, pool_MultiBootLoadAddr str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR] str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] adr r2, GcMbIntrHandler_CheckImageResponse b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_CheckImageResponse: lsrs r1, 1 @ is receive complete? bcc GcMbIntrHandler_Stop @ branch if not ldr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR] movs r1, 0x4 ands r1, r2 adds r1, 0x8 lsls r1, 2 strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] @ get the recieved uint32 ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] @ put it in the current destination pointer and advance that pointer stm r2!, {r1} @ save off the advanced pointer str r2, [r0, GCMB_STRUCT_CUR_DEST_PTR] @ decrease the image size (in uint32s) ldrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] subs r1, 0x1 strh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] @ branch away if the transfer is not yet complete bne GameCubeMultiBoot_ReadVCount GcMbIntrHandler_SendCounter2: @ send counter2 with magic number ldrb r1, [r0, GCMB_STRUCT_COUNTER2] lsls r1, 8 adds r1, GCMB_MAGIC_COUNTER2 str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] adr r2, GcMbIntrHandler_CheckCounter2Sent b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_CheckCounter2Sent: lsls r1, 31 GcMbIntrHandler_StopIfSendFailed: bcc GcMbIntrHandler_Stop @ stop if send failed @ if KeyC derivation value has not yet been generated, send Counter2 again, otherwise, send KeyC derivation ldr r1, [r0, GCMB_STRUCT_KEYC_DERIVATION] cmp r1, 0 beq GcMbIntrHandler_SendCounter2 str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] adr r2, GcMbIntrHandler_CheckKeyCDerivationSent b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_CheckKeyCDerivationSent: lsls r1, 31 bcc GcMbIntrHandler_StopIfSendFailed @ branch if send failed bmi GameCubeMultiBoot_CheckBootKeyResponse @ branch if receive is complete adr r2, GcMbIntrHandler_CheckBootKeyResponse b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_CheckBootKeyResponse: lsrs r1, 1 @ is receive complete? bcc GcMbIntrHandler_StopIfSendFailed @ branch if not GameCubeMultiBoot_CheckBootKeyResponse: ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] @ make sure received boot key contains expected magic number, stop if not lsrs r2, r1, 24 cmp r2, GCMB_MAGIC_BOOTKEY bne GcMbIntrHandler_StopIfNotEqual @ save received bootkey to be checked in GameCubeMultiBoot_Main() strh r1, [r0, GCMB_STRUCT_BOOT_KEY] @ stop if anything more gets sent adr r2, GcMbIntrHandler_StopUnconditionally b GameCubeMultiBoot_SetInterruptHandler .align 2, 0 GcMbIntrHandler_StopUnconditionally: b GcMbIntrHandler_Stop thumb_func_end GameCubeMultiBoot_HandleSerialInterrupt non_word_aligned_thumb_func_start GameCubeMultiBoot_Quit @ void GameCubeMultiBoot_Quit()@ GameCubeMultiBoot_Quit: ldr r3, pool_InterruptRegs @ Save IME register. ldrh r2, [r3, OFFSET_REG_IME - 0x200] @ Disable interrupts. movs r1, 0 strh r1, [r3, OFFSET_REG_IME - 0x200] ldr r3, pool_SerialRegs @ Acknowledge all JOYCNT flags. movs r0, 0x7 strh r0, [r3, OFFSET_REG_JOYCNT - 0x120] @ Turn off JOY Bus mode. lsls r0, r3, 10 strh r0, [r3, OFFSET_REG_RCNT - 0x120] @ store 0x8000 ldr r3, pool_InterruptRegs @ Acknowledge serial interrupt. movs r0, INTR_FLAG_SERIAL strh r0, [r3, OFFSET_REG_IF - 0x200] @ Disable serial interrupt. ldrh r1, [r3, OFFSET_REG_IE - 0x200] bics r1, r0 strh r1, [r3, OFFSET_REG_IE - 0x200] @ Restore IME register. strh r2, [r3, OFFSET_REG_IME - 0x200] bx lr thumb_func_end GameCubeMultiBoot_Quit .align 2, 0 GameCubeMultiBoot_MaximumImageSizeUInt32s: .4byte 0x00004000 pool_InterruptRegs: .4byte REG_BASE + 0x200 pool_SerialRegs: .4byte REG_BASE + 0x120 pool_RegDispstat: .4byte REG_DISPSTAT pool_RubyUSAGameCode: .ascii "AXVE" pool_MultiBootLoadAddr: .4byte EWRAM_START .align 2, 0 @ Don't pad with nop. ================================================ FILE: src/librfu_intr.c ================================================ #include "librfu.h" static void sio32intr_clock_master(void); static void sio32intr_clock_slave(void); static u16 handshake_wait(u16 slot); static void STWI_set_timer_in_RAM(u8 count); static void STWI_stop_timer_in_RAM(void); static void STWI_init_slave(void); static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()); static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16)); static void Callback_Dummy_ID(void (*callbackId)(void)); void IntrSIO32(void) { if (gSTWIStatus->state == 10) { if (gSTWIStatus->callbackID != NULL) Callback_Dummy_ID(gSTWIStatus->callbackID); } else { if (gSTWIStatus->msMode == AGB_CLK_MASTER) sio32intr_clock_master(); else sio32intr_clock_slave(); } } static void sio32intr_clock_master(void) { u32 regSIODATA32; u32 ackLen; STWI_set_timer_in_RAM(80); regSIODATA32 = REG_SIODATA32; if (gSTWIStatus->state == 0) // master send req { if (regSIODATA32 == 0x80000000) { if (gSTWIStatus->reqNext <= gSTWIStatus->reqLength) { REG_SIODATA32 = ((u32 *)gSTWIStatus->txPacket->rfuPacket8.data)[gSTWIStatus->reqNext]; gSTWIStatus->reqNext++; } else { gSTWIStatus->state = 1; // master wait ack REG_SIODATA32 = 0x80000000; } } else { STWI_stop_timer_in_RAM(); STWI_set_timer_in_RAM(130); return; } } else if (gSTWIStatus->state == 1) // master wait ack { if ((regSIODATA32 & 0xFFFF0000) == 0x99660000) { gSTWIStatus->ackNext = 0; ((u32 *)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32; gSTWIStatus->ackNext++; gSTWIStatus->ackActiveCommand = regSIODATA32; gSTWIStatus->ackLength = ackLen = regSIODATA32 >> 8; if ((ackLen = gSTWIStatus->ackLength) >= gSTWIStatus->ackNext) { gSTWIStatus->state = 2; // master receive ack REG_SIODATA32 = 0x80000000; } else { gSTWIStatus->state = 3; // master done ack } } else { STWI_stop_timer_in_RAM(); STWI_set_timer_in_RAM(130); return; } } else if (gSTWIStatus->state == 2) // master receive ack { ((u32 *)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32; gSTWIStatus->ackNext++; if (gSTWIStatus->ackLength < gSTWIStatus->ackNext) gSTWIStatus->state = 3; // master done ack else REG_SIODATA32 = 0x80000000; } if (handshake_wait(1) == 1) return; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_MULTI_SD; if (handshake_wait(0) == 1) return; STWI_stop_timer_in_RAM(); if (gSTWIStatus->state == 3) // master done ack { if ( gSTWIStatus->ackActiveCommand == (0x80 | ID_MS_CHANGE_REQ) || gSTWIStatus->ackActiveCommand == (0x80 | ID_DATA_TX_AND_CHANGE_REQ) || gSTWIStatus->ackActiveCommand == (0x80 | ID_UNK35_REQ) || gSTWIStatus->ackActiveCommand == (0x80 | ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) ) { gSTWIStatus->msMode = AGB_CLK_SLAVE; REG_SIODATA32 = 0x80000000; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE; gSTWIStatus->state = 5; // slave receive req init } else { if (gSTWIStatus->ackActiveCommand == 0xEE) { REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; gSTWIStatus->state = 4; // error gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION; } else { REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; gSTWIStatus->state = 4; // error } } gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, gSTWIStatus->callbackM); } else { REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_ENABLE; } } static void sio32intr_clock_slave(void) { u32 regSIODATA32; u32 r0; u32 reqLen; gSTWIStatus->timerActive = 0; STWI_set_timer_in_RAM(100); if (handshake_wait(0) == 1) return; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_MULTI_SD; regSIODATA32 = REG_SIODATA32; if (gSTWIStatus->state == 5) // slave receive req init { ((u32 *)gSTWIStatus->rxPacket)[0] = regSIODATA32; gSTWIStatus->reqNext = 1; r0 = 0x99660000; // variable reuse required reqLen = (regSIODATA32 >> 16); if (reqLen == (r0 >> 16)) { // only reqLen = regSIODATA32 >> 8 is required to match, but it looks a bit // more consistent when both lines update the variables. Might have been a macro? gSTWIStatus->reqLength = reqLen = regSIODATA32 >> 8; gSTWIStatus->reqActiveCommand = reqLen = (regSIODATA32 >> 0); if (gSTWIStatus->reqLength == 0) { if ( gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ ) { gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80; ((u32 *)gSTWIStatus->txPacket)[0] = 0x99660000 + gSTWIStatus->ackActiveCommand; gSTWIStatus->ackLength = 0; } else { ((u32 *)gSTWIStatus->txPacket)[0] = 0x996601EE; if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D) { ((u32 *)gSTWIStatus->txPacket)[1] = 1; } else { ((u32 *)gSTWIStatus->txPacket)[1] = 2; } gSTWIStatus->ackLength = 1; gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION; } REG_SIODATA32 = ((u32 *)gSTWIStatus->txPacket)[0]; gSTWIStatus->ackNext = 1; gSTWIStatus->state = 7; // slave send ack } else { REG_SIODATA32 = 0x80000000; gSTWIStatus->reqNext = 1; gSTWIStatus->state = 6; // slave receive req } } else { STWI_stop_timer_in_RAM(); STWI_set_timer_in_RAM(100); return; } } else if (gSTWIStatus->state == 6) // slave receive req { ((u32 *)gSTWIStatus->rxPacket)[gSTWIStatus->reqNext] = regSIODATA32; gSTWIStatus->reqNext++; if (gSTWIStatus->reqLength < gSTWIStatus->reqNext) { if ( gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ ) { gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80; ((u32 *)gSTWIStatus->txPacket)[0] = 0x99660000 | gSTWIStatus->ackActiveCommand; gSTWIStatus->ackLength = 0; } else { ((u32 *)gSTWIStatus->txPacket)[0] = 0x996601EE; if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D) { ((u32 *)gSTWIStatus->txPacket)[1] = 1; } else { ((u32 *)gSTWIStatus->txPacket)[1] = 2; } gSTWIStatus->ackLength = 1; gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION; } REG_SIODATA32 = ((u32 *)gSTWIStatus->txPacket)[0]; gSTWIStatus->ackNext = 1; gSTWIStatus->state = 7; // slave send ack } else { REG_SIODATA32 = 0x80000000; } } else if (gSTWIStatus->state == 7) // slave send ack { if (regSIODATA32 == 0x80000000) { if (gSTWIStatus->ackLength < gSTWIStatus->ackNext) { gSTWIStatus->state = 8; // slave done ack } else { REG_SIODATA32 = ((u32 *)gSTWIStatus->txPacket)[gSTWIStatus->ackNext]; gSTWIStatus->ackNext++; } } else { STWI_stop_timer_in_RAM(); STWI_set_timer_in_RAM(100); return; } } if (handshake_wait(1) == 1) return; if (gSTWIStatus->state == 8) // slave done ack { REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS; STWI_stop_timer_in_RAM(); if (gSTWIStatus->error == ERR_REQ_CMD_ACK_REJECTION) { STWI_init_slave(); if (gSTWIStatus->callbackS != NULL) { Callback_Dummy_S(0x1EE, gSTWIStatus->callbackS); } } else { REG_SIODATA32 = 0; REG_SIOCNT = 0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; gSTWIStatus->msMode = AGB_CLK_MASTER; gSTWIStatus->state = 0; // master send req if (gSTWIStatus->callbackS != NULL) { Callback_Dummy_S((gSTWIStatus->reqLength << 8) | (gSTWIStatus->reqActiveCommand), gSTWIStatus->callbackS); } } } else { REG_IME = 0; if (REG_TM0CNT_H & TIMER_ENABLE) { if ((REG_TM0CNT_H & 0x03) == TIMER_1CLK) { while (REG_TM0CNT_L > 0xFF9B); } else { while (REG_TM0CNT_L > 0xFFFE); } } REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE; REG_IME = 1; } } static u16 handshake_wait(u16 slot) { do { if ((gSTWIStatus->timerActive & 0xFF) == 1) { gSTWIStatus->timerActive = 0; return 1; } } while ((REG_SIOCNT & SIO_MULTI_SI) != (slot << SIO_MULTI_SI_SHIFT)); return 0; } static void STWI_set_timer_in_RAM(u8 count) { vu16* regTMCNTL = (vu16*)(REG_ADDR_TMCNT_L + gSTWIStatus->timerSelect * 4); vu16* regTMCNTH = (vu16*)(REG_ADDR_TMCNT_H + gSTWIStatus->timerSelect * 4); REG_IME = 0; switch (count) { case 50: *regTMCNTL = 0xFCCB; gSTWIStatus->timerState = 1; break; case 80: *regTMCNTL = 0xFAE0; gSTWIStatus->timerState = 2; break; case 100: *regTMCNTL = 0xF996; gSTWIStatus->timerState = 3; break; case 130: *regTMCNTL = 0xF7AD; gSTWIStatus->timerState = 4; break; } *regTMCNTH = TIMER_ENABLE | TIMER_64CLK | TIMER_256CLK | TIMER_INTR_ENABLE; REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect; REG_IME = 1; } static void STWI_stop_timer_in_RAM(void) { gSTWIStatus->timerState = 0; REG_TMCNT_L(gSTWIStatus->timerSelect) = 0; REG_TMCNT_H(gSTWIStatus->timerSelect) = 0; } static void STWI_init_slave(void) { gSTWIStatus->state = 5; // slave receive req init gSTWIStatus->msMode = AGB_CLK_SLAVE; gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->reqActiveCommand = 0; gSTWIStatus->ackLength = 0; gSTWIStatus->ackNext = 0; gSTWIStatus->ackActiveCommand = 0; gSTWIStatus->timerState = 0; gSTWIStatus->timerActive = 0; gSTWIStatus->error = 0; gSTWIStatus->recoveryCount = 0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE; } NAKED static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()) { asm("bx r2"); } NAKED static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16)) { asm("bx r1"); } NAKED static void Callback_Dummy_ID(void (*callbackId)(void)) { asm("bx r0"); } ================================================ FILE: src/librfu_rfu.c ================================================ #include #include "librfu.h" struct LLSFStruct { u8 frameSize; u8 recvFirstShift; u8 connSlotFlagShift; u8 slotStateShift; u8 ackShift; u8 phaseShit; u8 nShift; u8 recvFirstMask; u8 connSlotFlagMask; u8 slotStateMask; u8 ackMask; u8 phaseMask; u8 nMask; u16 framesMask; }; struct RfuLocalStruct { u8 recvFirst; u8 connSlotFlag; u8 slotState; u8 ack; u8 phase; u8 n; u16 frame; }; static void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult); static void rfu_CB_reset(u8 reqCommand, u16 reqResult); static void rfu_CB_configGameData(u8 reqCommand, u16 reqResult); static void rfu_CB_stopMode(u8 reqCommand, u16 reqResult); static void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult); static void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult); static void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult); static void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult); static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult); static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult); static void rfu_CB_disconnect(u8 reqCommand, u16 reqResult); static void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult); static void rfu_CB_sendData(u8 reqCommand, u16 reqResult); static void rfu_CB_sendData2(u8 reqCommand, u16 reqResult); static void rfu_CB_sendData3(u8 reqCommand, u16 reqResult); static void rfu_CB_recvData(u8 reqCommand, u16 reqResult); static void rfu_enableREQCallback(bool8 enable); static void rfu_STC_clearAPIVariables(void); static void rfu_STC_readChildList(void); static void rfu_STC_readParentCandidateList(void); static void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult); static void rfu_STC_removeLinkData(u8, u8); static void rfu_STC_fastCopy(const u8 **, u8 **, s32); static void rfu_STC_clearLinkStatus(u8); static void rfu_NI_checkCommFailCounter(void); static u16 rfu_STC_setSendData_org(u8, u8, u8, const void *, u32); static void rfu_constructSendLLFrame(void); static u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *); static u16 rfu_STC_UNI_constructLLSF(u8, u8 **); static void rfu_STC_PARENT_analyzeRecvPacket(void); static void rfu_STC_CHILD_analyzeRecvPacket(void); static u16 rfu_STC_analyzeLLSF(u8, const u8 *, u16); static void rfu_STC_UNI_receive(u8, const struct RfuLocalStruct *, const u8 *); static void rfu_STC_NI_receive_Receiver(u8, const struct RfuLocalStruct *, const u8 *); static void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuLocalStruct *, const u8 *); static void rfu_STC_NI_initSlot_asRecvDataEntity(u8, struct NIComm *); static void rfu_STC_NI_initSlot_asRecvControllData(u8, struct NIComm *); struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX]; struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX]; struct RfuLinkStatus *gRfuLinkStatus; struct RfuStatic *gRfuStatic; struct RfuFixed *gRfuFixed; static const struct LLSFStruct llsf_struct[2] = { [MODE_CHILD] = { .frameSize = 2, .recvFirstShift = 14, .connSlotFlagShift = 0, .slotStateShift = 10, .ackShift = 9, .phaseShit = 5, .nShift = 7, .recvFirstMask = 2, .connSlotFlagMask = 0, .slotStateMask = 15, .ackMask = 1, .phaseMask = 3, .nMask = 3, .framesMask = 0x1f }, [MODE_PARENT] = { .frameSize = 3, .recvFirstShift = 22, .connSlotFlagShift = 18, .slotStateShift = 14, .ackShift = 13, .phaseShit = 9, .nShift = 11, .recvFirstMask = 3, .connSlotFlagMask = 15, .slotStateMask = 15, .ackMask = 1, .phaseMask = 3, .nMask = 3, .framesMask = 0x7f } }; #define xstr(s) str(s) #define str(s) #s static const char version_string[] = "RFU_V" xstr(LIBRFU_VERSION); static const char str_checkMbootLL[] = "RFU-MBOOT"; #define COPY(src, dst, iterator, size) do { \ const u16 *_src = (const u16 *)(src); \ u16 *_dst = (u16 *)(dst); \ (iterator) = (size); \ while ((iterator)-- != 0) \ *_dst++ = *_src++; \ } while (0) u16 rfu_initializeAPI(u32 *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam) { u16 i; u16 *dst; const u16 *src; u16 buffByteSizeMax; // is in EWRAM? if (((uintptr_t)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam) return ERR_RFU_API_BUFF_ADR; // is not 4-byte aligned? if ((u32)APIBuffer & 3) return ERR_RFU_API_BUFF_ADR; if (copyInterruptToRam) { // An assert/debug print may have existed before, ie // printf("%s %u < %u", "somefile.c:12345", buffByteSize, num) // to push this into buffByteSizeMax? buffByteSizeMax = RFU_API_BUFF_SIZE_RAM; if (buffByteSize < buffByteSizeMax) return ERR_RFU_API_BUFF_SIZE; } if (!copyInterruptToRam) { buffByteSizeMax = RFU_API_BUFF_SIZE_ROM; // same issue as above if (buffByteSize < buffByteSizeMax) return ERR_RFU_API_BUFF_SIZE; } gRfuLinkStatus = (void *)APIBuffer + 0; gRfuStatic = (void *)APIBuffer + 0xb4; // + sizeof(*gRfuLinkStatus) gRfuFixed = (void *)APIBuffer + 0xdc; // + sizeof(*gRfuStatic) gRfuSlotStatusNI[0] = (void *)APIBuffer + 0x1bc; // + sizeof(*gRfuFixed) gRfuSlotStatusUNI[0] = (void *)APIBuffer + 0x37c; // + sizeof(*gRfuSlotStatusNI[0]) * RFU_CHILD_MAX for (i = 1; i < RFU_CHILD_MAX; ++i) { gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1]; gRfuSlotStatusUNI[i] = &gRfuSlotStatusUNI[i - 1][1]; } // remaining space in API buffer is used for `struct RfuIntrStruct`. gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1]; STWI_init_all((struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1], sioIntrTable_p, copyInterruptToRam); rfu_STC_clearAPIVariables(); for (i = 0; i < RFU_CHILD_MAX; ++i) { gRfuSlotStatusNI[i]->recvBuffer = NULL; gRfuSlotStatusNI[i]->recvBufferSize = 0; gRfuSlotStatusUNI[i]->recvBuffer = NULL; gRfuSlotStatusUNI[i]->recvBufferSize = 0; } // rfu_REQ_changeMasterSlave is the function next to rfu_STC_fastCopy #if LIBRFU_VERSION < 1026 src = (const u16 *)((uintptr_t)&rfu_STC_fastCopy & ~1); dst = gRfuFixed->fastCopyBuffer; buffByteSizeMax = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16); while (buffByteSizeMax-- != 0) *dst++ = *src++; #else COPY( (uintptr_t)&rfu_STC_fastCopy & ~1, gRfuFixed->fastCopyBuffer, buffByteSizeMax, 0x60 / sizeof(u16) ); #endif gRfuFixed->fastCopyPtr = (void *)gRfuFixed->fastCopyBuffer + 1; return 0; } static void rfu_STC_clearAPIVariables(void) { u16 IMEBackup = REG_IME; u8 i, flags; REG_IME = 0; flags = gRfuStatic->flags; CpuFill16(0, gRfuStatic, sizeof(struct RfuStatic)); gRfuStatic->flags = flags & 8; CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); gRfuLinkStatus->watchInterval = 4; gRfuStatic->nowWatchInterval = 0; gRfuLinkStatus->parentChild = MODE_NEUTRAL; rfu_clearAllSlot(); gRfuStatic->SCStartFlag = 0; for (i = 0; i < RFU_CHILD_MAX; ++i) gRfuStatic->cidBak[i] = 0; REG_IME = IMEBackup; } void rfu_REQ_PARENT_resumeRetransmitAndChange(void) { STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_ResumeRetransmitAndChangeREQ(); } u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) { u8 *buf; *ackFlag = 0; if (gRfuLinkStatus->parentChild != MODE_PARENT) return ERR_MODE_NOT_PARENT; buf = rfu_getSTWIRecvBuffer(); switch (*buf) { case 40: case 54: if (buf[1] == 0) *ackFlag = gRfuLinkStatus->connSlotFlag; else *ackFlag = buf[4]; return 0; default: return ERR_REQ_CMD_ID; } } void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p) { STWI_init_timer(timerIntrTable_p, timerNo); } u8 *rfu_getSTWIRecvBuffer(void) { return (u8 *)gRfuFixed->STWIBuffer; } void rfu_setMSCCallback(void (*callback)(u16 reqCommandId)) { STWI_set_Callback_S(callback); } void rfu_setREQCallback(void (*callback)(u16 reqCommandId, u16 reqResult)) { gRfuFixed->reqCallback = callback; rfu_enableREQCallback(callback != NULL); } static void rfu_enableREQCallback(bool8 enable) { if (enable) gRfuStatic->flags |= 8; else gRfuStatic->flags &= 0xF7; } static void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult) { STWI_set_Callback_M(rfu_CB_defaultCallback); gRfuStatic->reqResult = reqResult; if (gRfuStatic->flags & 8) gRfuFixed->reqCallback(reqCommand, reqResult); } static void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult) { s32 bmSlotFlags; u8 i; if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ) { if (gRfuStatic->flags & 8) gRfuFixed->reqCallback(reqCommand, reqResult); bmSlotFlags = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; for (i = 0; i < RFU_CHILD_MAX; ++i) if ((bmSlotFlags >> i) & 1) rfu_STC_removeLinkData(i, 1); gRfuLinkStatus->parentChild = MODE_NEUTRAL; } } u16 rfu_waitREQComplete(void) { STWI_poll_CommandEnd(); return gRfuStatic->reqResult; } void rfu_REQ_RFUStatus(void) { STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_SystemStatusREQ(); } u16 rfu_getRFUStatus(u8 *rfuState) { if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] != 0x93) return ERR_REQ_CMD_ID; if (STWI_poll_CommandEnd() == 0) *rfuState = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7]; else *rfuState = 0xFF; return 0; } /* * RFU Multiboot images are loaded into IWRAM * struct RfuMbootLL * { * struct RfuLinkStatus status; * u8 filler_B4[0x3C]; * char name[10]; * u16 checksum; * } * Returns 1 if the packet to inherit is malformed. */ u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) { const char *s1 = str_checkMbootLL; char *s2 = (char *)0x30000F0; u16 checksum; u16 *mb_buff_iwram_p; u8 i; // if (strcmp(s1, s2) != 0) return 1; while (*s1 != '\0') if (*s1++ != *s2++) return 1; mb_buff_iwram_p = (u16 *)0x3000000; // The size of struct RfuLinkStatus is 180 checksum = 0; for (i = 0; i < 180/2; ++i) checksum += *mb_buff_iwram_p++; if (checksum != *(u16 *)0x30000FA) return 1; CpuCopy16((u16 *)0x3000000, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); gRfuStatic->flags |= 0x80; // mboot return 0; } void rfu_REQ_stopMode(void) { vu32 *timerReg; if (REG_IME == 0) { rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 6); gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; } else { AgbRFU_SoftReset(); rfu_STC_clearAPIVariables(); if (AgbRFU_checkID(8) == RFU_ID) { timerReg = ®_TMCNT(gSTWIStatus->timerSelect); *timerReg = 0; *timerReg = (TIMER_ENABLE | TIMER_1024CLK) << 16; while (*timerReg << 16 < 262 << 16) ; *timerReg = 0; STWI_set_Callback_M(rfu_CB_stopMode); STWI_send_StopModeREQ(); } else { REG_SIOCNT = SIO_MULTI_MODE; rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 0); } } } static void rfu_CB_stopMode(u8 reqCommand, u16 reqResult) { if (reqResult == 0) REG_SIOCNT = SIO_MULTI_MODE; rfu_STC_REQ_callback(reqCommand, reqResult); } u32 rfu_REQBN_softReset_and_checkID(void) { u32 id; if (REG_IME == 0) return ERR_ID_CHECK_IME_DISABLE; AgbRFU_SoftReset(); rfu_STC_clearAPIVariables(); if ((id = AgbRFU_checkID(30)) == 0) REG_SIOCNT = SIO_MULTI_MODE; return id; } void rfu_REQ_reset(void) { STWI_set_Callback_M(rfu_CB_reset); STWI_send_ResetREQ(); } static void rfu_CB_reset(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_clearAPIVariables(); rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) { STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_SystemConfigREQ((availSlotFlag & AVAIL_SLOT1) | 0x3C, maxMFrame, mcTimer); if (mcTimer == 0) { gRfuStatic->linkEmergencyLimit = 1; } else { u16 IMEBackup = REG_IME; REG_IME = 0; gRfuStatic->linkEmergencyLimit = Div(600, mcTimer); REG_IME = IMEBackup; } } void rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname) { u8 packet[16]; u8 i; u8 check_sum; const u8 *gnameBackup = gname; const u8 *unameBackup; packet[0] = serialNo; packet[1] = serialNo >> 8; if (mbootFlag != 0) packet[1] = (serialNo >> 8) | 0x80; for (i = 2; i < 15; ++i) packet[i] = *gname++; check_sum = 0; unameBackup = uname; for (i = 0; i < 8; ++i) { check_sum += *unameBackup++; check_sum += *gnameBackup++; } packet[15] = ~check_sum; if (mbootFlag != 0) packet[14] = 0; STWI_set_Callback_M(rfu_CB_configGameData); STWI_send_GameConfigREQ(packet, uname); } static void rfu_CB_configGameData(u8 reqCommand, u16 reqResult) { s32 serialNo; u8 *gname_uname_p; u8 i; u8 *packet_p; if (reqResult == 0) { packet_p = gSTWIStatus->txPacket->rfuPacket8.data; serialNo = gRfuLinkStatus->my.serialNo = packet_p[4]; gRfuLinkStatus->my.serialNo = (packet_p[5] << 8) | serialNo; gname_uname_p = &packet_p[6]; if (gRfuLinkStatus->my.serialNo & 0x8000) { gRfuLinkStatus->my.serialNo = gRfuLinkStatus->my.serialNo ^ 0x8000; gRfuLinkStatus->my.mbootFlag = 1; } else { gRfuLinkStatus->my.mbootFlag = 0; } for (i = 0; i < RFU_GAME_NAME_LENGTH; ++i) gRfuLinkStatus->my.gname[i] = *gname_uname_p++; ++gname_uname_p; for (i = 0; i < RFU_USER_NAME_LENGTH; ++i) gRfuLinkStatus->my.uname[i] = *gname_uname_p++; } rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_startSearchChild(void) { u16 result; #if LIBRFU_VERSION >= 1026 u16 i; for (i = 0; i < RFU_CHILD_MAX; i++) { gRfuStatic->lsFixedCount[i] = 0; } #endif STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SystemStatusREQ(); result = STWI_poll_CommandEnd(); if (result == 0) { if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) rfu_STC_clearLinkStatus(MODE_PARENT); } else { rfu_STC_REQ_callback(ID_SC_START_REQ, result); } STWI_set_Callback_M(rfu_CB_startSearchChild); STWI_send_SC_StartREQ(); } static void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult) { if (reqResult == 0) gRfuStatic->SCStartFlag = 1; rfu_STC_REQ_callback(reqCommand, reqResult); } static void rfu_STC_clearLinkStatus(u8 parentChild) { u8 i; rfu_clearAllSlot(); if (parentChild != MODE_CHILD) { CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); gRfuLinkStatus->findParentCount = 0; } for (i = 0; i < RFU_CHILD_MAX; ++i) gRfuLinkStatus->strength[i] = 0; gRfuLinkStatus->connCount = 0; gRfuLinkStatus->connSlotFlag = 0; gRfuLinkStatus->linkLossSlotFlag = 0; gRfuLinkStatus->getNameFlag = 0; } void rfu_REQ_pollSearchChild(void) { STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild); STWI_send_SC_PollingREQ(); } void rfu_REQ_endSearchChild(void) { STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild); STWI_send_SC_EndREQ(); } static void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_readChildList(); if (reqCommand == ID_SC_POLL_REQ) { if (gRfuLinkStatus->my.id == 0) { STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SystemStatusREQ(); if (STWI_poll_CommandEnd() == 0) gRfuLinkStatus->my.id = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; } } else if (reqCommand == ID_SC_END_REQ) { if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) gRfuLinkStatus->my.id = 0; gRfuStatic->SCStartFlag = 0; } rfu_STC_REQ_callback(reqCommand, reqResult); } static void rfu_STC_readChildList(void) { u32 stwiParam; u8 numSlots = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]; u8 *data_p; u8 i; u8 bm_slot_id; #if LIBRFU_VERSION < 1026 u8 true_slots[RFU_CHILD_MAX]; #endif #if LIBRFU_VERSION < 1026 if (numSlots != 0) { stwiParam = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_LinkStatusREQ(); if (STWI_poll_CommandEnd() == 0) { data_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; for (i = 0; i < RFU_CHILD_MAX; ++i) true_slots[i] = *data_p++; } gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = stwiParam; } #endif for (data_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; numSlots != 0; data_p += 4) { bm_slot_id = data_p[2]; if (bm_slot_id < RFU_CHILD_MAX && !((gRfuLinkStatus->connSlotFlag >> bm_slot_id) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> bm_slot_id) & 1)) { #if LIBRFU_VERSION < 1026 if (true_slots[bm_slot_id] != 0) ++gRfuStatic->lsFixedCount[bm_slot_id]; if (gRfuStatic->lsFixedCount[bm_slot_id] >= 4) { gRfuStatic->lsFixedCount[bm_slot_id] = 0; gRfuLinkStatus->strength[bm_slot_id] = 255; gRfuLinkStatus->connSlotFlag |= 1 << bm_slot_id; ++gRfuLinkStatus->connCount; gRfuLinkStatus->partner[bm_slot_id].id = *(u16 *)data_p; gRfuLinkStatus->partner[bm_slot_id].slot = bm_slot_id; gRfuLinkStatus->parentChild = MODE_PARENT; gRfuStatic->flags &= 0x7F; gRfuStatic->cidBak[bm_slot_id] = gRfuLinkStatus->partner[bm_slot_id].id; } #else gRfuStatic->lsFixedCount[bm_slot_id] = 0xF0; gRfuLinkStatus->strength[bm_slot_id] = 16; gRfuLinkStatus->connSlotFlag |= 1 << bm_slot_id; ++gRfuLinkStatus->connCount; gRfuLinkStatus->partner[bm_slot_id].id = *(u16 *)data_p; gRfuLinkStatus->partner[bm_slot_id].slot = bm_slot_id; gRfuLinkStatus->parentChild = MODE_PARENT; gRfuStatic->flags &= 0x7F; gRfuStatic->cidBak[bm_slot_id] = gRfuLinkStatus->partner[bm_slot_id].id; #endif } --numSlots; } } void rfu_REQ_startSearchParent(void) { STWI_set_Callback_M(rfu_CB_startSearchParent); STWI_send_SP_StartREQ(); } static void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_clearLinkStatus(MODE_CHILD); rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_pollSearchParent(void) { STWI_set_Callback_M(rfu_CB_pollSearchParent); STWI_send_SP_PollingREQ(); } static void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_readParentCandidateList(); rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_endSearchParent(void) { STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_SP_EndREQ(); } static void rfu_STC_readParentCandidateList(void) { u8 numSlots, i, check_sum, my_check_sum, j; u8 *uname_p, *packet_p; struct RfuTgtData *target; CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0]; numSlots = packet_p[1]; packet_p += 4; gRfuLinkStatus->findParentCount = 0; for (i = 0; i < RFU_CHILD_MAX && numSlots != 0; ++i) { numSlots -= 7; uname_p = packet_p + 6; packet_p += 19; check_sum = ~*packet_p; ++packet_p; my_check_sum = 0; for (j = 0; j < 8; ++j) { my_check_sum += *packet_p++; my_check_sum += *uname_p++; } if (my_check_sum == check_sum) { packet_p -= 28; target = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount]; target->id = *(u16 *)packet_p; packet_p += 2; target->slot = *packet_p; packet_p += 2; target->serialNo = *(u16 *)packet_p & 0x7FFF; if (*(u16 *)packet_p & 0x8000) target->mbootFlag = 1; else target->mbootFlag = 0; packet_p += 2; for (j = 0; j < RFU_GAME_NAME_LENGTH; ++j) target->gname[j] = *packet_p++; ++packet_p; for (j = 0; j < RFU_USER_NAME_LENGTH; ++j) target->uname[j] = *packet_p++; ++gRfuLinkStatus->findParentCount; } } } void rfu_REQ_startConnectParent(u16 pid) { u16 result = 0; u8 i; for (i = 0; i < RFU_CHILD_MAX && gRfuLinkStatus->partner[i].id != pid; ++i) ; if (i == RFU_CHILD_MAX) result = ERR_PID_NOT_FOUND; if (result == 0) { gRfuStatic->tryPid = pid; STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_CP_StartREQ(pid); } else { rfu_STC_REQ_callback(ID_CP_START_REQ, result); } } void rfu_REQ_pollConnectParent(void) { STWI_set_Callback_M(rfu_CB_pollConnectParent); STWI_send_CP_PollingREQ(); } static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult) { u16 id; u8 slot; u8 bm_slot_flag, i; struct RfuTgtData *target_p; struct RfuTgtData target_local; if (reqResult == 0) { id = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; slot = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]; if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) { bm_slot_flag = 1 << slot; if (!(bm_slot_flag & gRfuLinkStatus->connSlotFlag)) { gRfuLinkStatus->connSlotFlag |= bm_slot_flag; gRfuLinkStatus->linkLossSlotFlag &= ~bm_slot_flag; gRfuLinkStatus->my.id = id; ++gRfuLinkStatus->connCount; gRfuLinkStatus->parentChild = MODE_CHILD; gRfuStatic->flags |= 0x80; for (i = 0; i < RFU_CHILD_MAX; ++i) { if (gRfuLinkStatus->partner[i].id == gRfuStatic->tryPid) { if (gRfuLinkStatus->findParentCount != 0) { target_p = &target_local; CpuCopy16(&gRfuLinkStatus->partner[i], &target_local, sizeof(struct RfuTgtData)); CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); gRfuLinkStatus->findParentCount = 0; } else { target_p = &gRfuLinkStatus->partner[i]; } break; } } if (i < RFU_CHILD_MAX) { CpuCopy16(target_p, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData)); gRfuLinkStatus->partner[slot].slot = slot; } } } } rfu_STC_REQ_callback(reqCommand, reqResult); } u16 rfu_getConnectParentStatus(u8 *status, u8 *connectSlotNo) { u8 *packet_p; *status = 0xFF; packet_p = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; if (packet_p[0] == 0xa0 || packet_p[0] == 0xa1) { packet_p += 6; *connectSlotNo = packet_p[0]; *status = packet_p[1]; return 0; } return ERR_REQ_CMD_ID; } void rfu_REQ_endConnectParent(void) { STWI_set_Callback_M(rfu_CB_pollConnectParent); STWI_send_CP_EndREQ(); if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6] < 4) gRfuStatic->linkEmergencyFlag[gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]] = 0; } u16 rfu_syncVBlank(void) { u8 masterSlave, i; s32 bmSlotFlag; rfu_NI_checkCommFailCounter(); if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) return 0; if (gRfuStatic->nowWatchInterval != 0) --gRfuStatic->nowWatchInterval; masterSlave = rfu_getMasterSlave(); if (!(gRfuStatic->flags & 2)) { if (masterSlave == AGB_CLK_SLAVE) { gRfuStatic->flags |= 4; gRfuStatic->watchdogTimer = 360; } } else if (masterSlave != AGB_CLK_SLAVE) { gRfuStatic->flags &= 0xFB; } if (masterSlave != AGB_CLK_SLAVE) gRfuStatic->flags &= 0xFD; else gRfuStatic->flags |= 2; if (!(gRfuStatic->flags & 4)) return 0; if (gRfuStatic->watchdogTimer == 0) { gRfuStatic->flags &= 0xFB; bmSlotFlag = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; for (i = 0; i < RFU_CHILD_MAX; ++i) if ((bmSlotFlag >> i) & 1) rfu_STC_removeLinkData(i, 1); gRfuLinkStatus->parentChild = MODE_NEUTRAL; return 1; } --gRfuStatic->watchdogTimer; return 0; } u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot) { u8 reasonMaybe = 0; u8 reqResult = 0; u8 i; s32 stwiCommand, stwiParam; u8 *packet_p; u8 to_req_disconnect, newLinkLossFlag, num_packets, connSlotFlag, to_disconnect; *bmLinkLossSlot = 0; *linkLossReason = REASON_DISCONNECTED; *parentBmLinkRecoverySlot = 0; if (gRfuLinkStatus->parentChild == MODE_NEUTRAL || gSTWIStatus->msMode == 0) return 0; if (gRfuStatic->flags & 4) gRfuStatic->watchdogTimer = 360; if (gRfuStatic->nowWatchInterval == 0) { #if LIBRFU_VERSION < 1026 gRfuStatic->nowWatchInterval = gRfuLinkStatus->watchInterval; #else gRfuStatic->nowWatchInterval = 4; #endif reasonMaybe = 1; } if ((u8)reqCommandId == ID_DISCONNECTED_AND_CHANGE_REQ) { u8 *packet_p_2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; *bmLinkLossSlot = packet_p_2[4]; *linkLossReason = packet_p_2[5]; if (*linkLossReason == REASON_LINK_LOSS) *bmLinkLossSlot = gRfuLinkStatus->connSlotFlag; reasonMaybe = 2; } else { if (reqCommandId == 0x0136) { newLinkLossFlag = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5]; newLinkLossFlag ^= gRfuLinkStatus->connSlotFlag; *bmLinkLossSlot = newLinkLossFlag & gRfuLinkStatus->connSlotFlag; *linkLossReason = REASON_LINK_LOSS; for (i = 0; i < RFU_CHILD_MAX; ++i) { if ((*bmLinkLossSlot >> i) & 1) { gRfuLinkStatus->strength[i] = 0; rfu_STC_removeLinkData(i, 0); } } } if (reasonMaybe == 0) return 0; } stwiCommand = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command; stwiParam = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_LinkStatusREQ(); reqResult = STWI_poll_CommandEnd(); if (reqResult == 0) { packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; for (i = 0; i < RFU_CHILD_MAX; ++i) gRfuLinkStatus->strength[i] = *packet_p++; to_req_disconnect = 0; i = 0; } else { rfu_STC_REQ_callback(ID_LINK_STATUS_REQ, reqResult); return reqResult; } for (; i < RFU_CHILD_MAX; ++i) { #if LIBRFU_VERSION >= 1026 if (gRfuStatic->lsFixedCount[i] != 0) { gRfuStatic->lsFixedCount[i] -= 4; if (gRfuLinkStatus->strength[i] <= 15) gRfuLinkStatus->strength[i] = 16; } #endif newLinkLossFlag = 1 << i; if (reqResult == 0) { if (reasonMaybe == 1 && (gRfuLinkStatus->connSlotFlag & newLinkLossFlag)) { if (gRfuLinkStatus->strength[i] == 0) { if (gRfuLinkStatus->parentChild == MODE_PARENT) { ++gRfuStatic->linkEmergencyFlag[i]; if (gRfuStatic->linkEmergencyFlag[i] > 3) { *bmLinkLossSlot |= newLinkLossFlag; *linkLossReason = REASON_LINK_LOSS; } } else { STWI_send_SystemStatusREQ(); if (STWI_poll_CommandEnd() == 0) { if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) { *bmLinkLossSlot |= newLinkLossFlag; *linkLossReason = REASON_LINK_LOSS; } else { if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->linkEmergencyLimit) { gRfuStatic->linkEmergencyFlag[i] = 0; STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag); STWI_poll_CommandEnd(); *bmLinkLossSlot |= newLinkLossFlag; *linkLossReason = REASON_LINK_LOSS; } } } } } else { gRfuStatic->linkEmergencyFlag[i] = 0; } } if (gRfuLinkStatus->parentChild == MODE_PARENT && gRfuLinkStatus->strength[i] != 0) { if (newLinkLossFlag & gRfuLinkStatus->linkLossSlotFlag) { if (gRfuLinkStatus->strength[i] > 10) { *parentBmLinkRecoverySlot |= newLinkLossFlag; gRfuLinkStatus->connSlotFlag |= newLinkLossFlag; gRfuLinkStatus->linkLossSlotFlag &= ~newLinkLossFlag; ++gRfuLinkStatus->connCount; gRfuStatic->linkEmergencyFlag[i] = 0; } else { gRfuLinkStatus->strength[i] = 0; } } else { if (!((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & newLinkLossFlag)) { STWI_send_SlotStatusREQ(); STWI_poll_CommandEnd(); packet_p = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; num_packets = packet_p[1] - 1; for (packet_p += 8; num_packets != 0; packet_p += 4, --num_packets) { u16 cid = *(u16 *)packet_p; if (packet_p[2] == i && cid == gRfuStatic->cidBak[i]) { to_req_disconnect |= 1 << i; break; } } } } } } connSlotFlag = gRfuLinkStatus->connSlotFlag; to_disconnect = *bmLinkLossSlot; to_disconnect &= connSlotFlag; if (newLinkLossFlag & to_disconnect) rfu_STC_removeLinkData(i, 0); } if (to_req_disconnect != 0) { STWI_send_DisconnectREQ(to_req_disconnect); STWI_poll_CommandEnd(); } // equivalent to: // gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command = stwiCommand; *(u32 *)gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data = stwiCommand; gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = stwiParam; return 0; } static void rfu_STC_removeLinkData(u8 bmConnectedPartnerId, u8 bmDisconnect) { u8 bmLinkLossFlag = 1 << bmConnectedPartnerId; s32 bmLinkRetainedFlag; #if LIBRFU_VERSION >= 1026 gRfuStatic->lsFixedCount[bmConnectedPartnerId] = 0; #endif if ((gRfuLinkStatus->connSlotFlag & bmLinkLossFlag) && gRfuLinkStatus->connCount != 0) --gRfuLinkStatus->connCount; gRfuLinkStatus->connSlotFlag &= bmLinkRetainedFlag = ~bmLinkLossFlag; gRfuLinkStatus->linkLossSlotFlag |= bmLinkLossFlag; if (gRfuLinkStatus->parentChild == MODE_CHILD && gRfuLinkStatus->connSlotFlag == 0) gRfuLinkStatus->parentChild = MODE_NEUTRAL; if (bmDisconnect) { CpuFill16(0, &gRfuLinkStatus->partner[bmConnectedPartnerId], sizeof(struct RfuTgtData)); gRfuLinkStatus->linkLossSlotFlag &= bmLinkRetainedFlag; gRfuLinkStatus->getNameFlag &= bmLinkRetainedFlag; gRfuLinkStatus->strength[bmConnectedPartnerId] = 0; } } void rfu_REQ_disconnect(u8 bmDisconnectSlot) { u16 result; if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmDisconnectSlot) { gRfuStatic->recoveryBmSlot = bmDisconnectSlot; if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && gRfuStatic->flags & 0x80) { if (gRfuLinkStatus->linkLossSlotFlag & bmDisconnectSlot) rfu_CB_disconnect(48, 0); } else if (gRfuStatic->SCStartFlag && (STWI_set_Callback_M(rfu_CB_defaultCallback), STWI_send_SC_EndREQ(), (result = STWI_poll_CommandEnd()) != 0)) { rfu_STC_REQ_callback(ID_SC_END_REQ, result); } else { STWI_set_Callback_M(rfu_CB_disconnect); STWI_send_DisconnectREQ(bmDisconnectSlot); } } } static void rfu_CB_disconnect(u8 reqCommand, u16 reqResult) { u8 i, bm_slot_flag; if (reqResult == 3 && gRfuLinkStatus->parentChild == MODE_CHILD) { STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SystemStatusREQ(); if (STWI_poll_CommandEnd() == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) reqResult = 0; } gRfuStatic->recoveryBmSlot &= gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8] = gRfuStatic->recoveryBmSlot; if (reqResult == 0) { for (i = 0; i < RFU_CHILD_MAX; ++i) { bm_slot_flag = 1 << i; if (bm_slot_flag & gRfuStatic->recoveryBmSlot) rfu_STC_removeLinkData(i, 1); } } if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0) gRfuLinkStatus->parentChild = MODE_NEUTRAL; rfu_STC_REQ_callback(reqCommand, reqResult); if (gRfuStatic->SCStartFlag) { STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SC_StartREQ(); reqResult = STWI_poll_CommandEnd(); if (reqResult != 0) rfu_STC_REQ_callback(ID_SC_START_REQ, reqResult); } } void rfu_REQ_CHILD_startConnectRecovery(u8 bmRecoverySlot) { u8 i; gRfuStatic->recoveryBmSlot = bmRecoverySlot; for (i = 0; i < RFU_CHILD_MAX && !((bmRecoverySlot >> i) & 1); ++i) ; STWI_set_Callback_M(rfu_STC_REQ_callback); // if i == 4, gRfuLinkStatus->partner[i].id becomes gRfuLinkStatus->my.id STWI_send_CPR_StartREQ(gRfuLinkStatus->partner[i].id, gRfuLinkStatus->my.id, bmRecoverySlot); } void rfu_REQ_CHILD_pollConnectRecovery(void) { STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery); STWI_send_CPR_PollingREQ(); } static void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult) { u8 bm_slot_flag, i; struct RfuLinkStatus *rfuLinkStatus; if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) { gRfuLinkStatus->parentChild = MODE_CHILD; for (i = 0; i < RFU_CHILD_MAX; ++i) { bm_slot_flag = 1 << i; rfuLinkStatus = gRfuLinkStatus; // ??? if (gRfuStatic->recoveryBmSlot & bm_slot_flag & rfuLinkStatus->linkLossSlotFlag) { gRfuLinkStatus->connSlotFlag |= bm_slot_flag; gRfuLinkStatus->linkLossSlotFlag &= ~bm_slot_flag; ++gRfuLinkStatus->connCount; gRfuStatic->linkEmergencyFlag[i] = 0; } } gRfuStatic->recoveryBmSlot = 0; } rfu_STC_REQ_callback(reqCommand, reqResult); } u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status) { *status = 0xFF; if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] == 0xB3 || gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] == 0xB4) { *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; return 0; } return ERR_REQ_CMD_ID; } void rfu_REQ_CHILD_endConnectRecovery(void) { STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery); STWI_send_CPR_EndREQ(); } static void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size) { const u8 *src = *src_p; u8 *dst = *dst_p; s32 i; for (i = size - 1; i != -1; --i) *dst++ = *src++; *src_p = src; *dst_p = dst; } void rfu_REQ_changeMasterSlave(void) { if (STWI_read_status(1) == AGB_CLK_MASTER) { STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_MS_ChangeREQ(); } else { rfu_STC_REQ_callback(ID_MS_CHANGE_REQ, 0); } } bool8 rfu_getMasterSlave(void) { bool8 masterSlave = STWI_read_status(1); if (masterSlave == AGB_CLK_MASTER) { if (gSTWIStatus->sending) { if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) masterSlave = AGB_CLK_SLAVE; } } return masterSlave; } void rfu_clearAllSlot(void) { u16 i; u16 IMEBackup = REG_IME; REG_IME = 0; for (i = 0; i < RFU_CHILD_MAX; ++i) { CpuFill16(0, gRfuSlotStatusNI[i], 2 * sizeof(struct NIComm)); CpuFill16(0, gRfuSlotStatusUNI[i], sizeof(struct UNISend) + sizeof(struct UNIRecv)); gRfuLinkStatus->remainLLFrameSizeChild[i] = 16; } gRfuLinkStatus->remainLLFrameSizeParent = LLF_P_SIZE; gRfuLinkStatus->sendSlotNIFlag = 0; gRfuLinkStatus->recvSlotNIFlag = 0; gRfuLinkStatus->sendSlotUNIFlag = 0; gRfuStatic->recvRenewalFlag = 0; REG_IME = IMEBackup; } static void rfu_STC_releaseFrame(u8 bm_slot_id, u8 send_recv, struct NIComm *NI_comm) { if (!(gRfuStatic->flags & 0x80)) { if (send_recv == 0) gRfuLinkStatus->remainLLFrameSizeParent += NI_comm->payloadSize; gRfuLinkStatus->remainLLFrameSizeParent += 3; } else { if (send_recv == 0) gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id] += NI_comm->payloadSize; gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id] += 2; } } u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) { u16 imeBak, send_recv, i; struct NIComm *NI_comm; if (slotStatusIndex >= RFU_CHILD_MAX) return ERR_SLOT_NO; if (!(connTypeFlag & (TYPE_UNI_SEND | TYPE_UNI_RECV | TYPE_NI_SEND | TYPE_NI_RECV))) return ERR_COMM_TYPE; imeBak = REG_IME; REG_IME = 0; if (connTypeFlag & (TYPE_NI_SEND | TYPE_NI_RECV)) { for (send_recv = 0; send_recv < 2; ++send_recv) { NI_comm = NULL; if (send_recv == 0) { if (connTypeFlag & TYPE_NI_SEND) { NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->send; gRfuLinkStatus->sendSlotNIFlag &= ~NI_comm->bmSlotOrg; } } else { if (connTypeFlag & TYPE_NI_RECV) { NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->recv; gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); } } if (NI_comm != NULL) { if (NI_comm->state & SLOT_BUSY_FLAG) { rfu_STC_releaseFrame(slotStatusIndex, send_recv, NI_comm); for (i = 0; i < RFU_CHILD_MAX; ++i) if ((NI_comm->bmSlotOrg >> i) & 1) NI_comm->failCounter = 0; } CpuFill16(0, NI_comm, sizeof(struct NIComm)); } } } if (connTypeFlag & TYPE_UNI_SEND) { struct RfuSlotStatusUNI *slotStatusUNI = gRfuSlotStatusUNI[slotStatusIndex]; if (slotStatusUNI->send.state & SLOT_BUSY_FLAG) { if (!(gRfuStatic->flags & 0x80)) gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)slotStatusUNI->send.payloadSize; else gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] += 2 + (u8)slotStatusUNI->send.payloadSize; gRfuLinkStatus->sendSlotUNIFlag &= ~slotStatusUNI->send.bmSlot; } CpuFill16(0, &slotStatusUNI->send, sizeof(struct UNISend)); } if (connTypeFlag & TYPE_UNI_RECV) { CpuFill16(0, &gRfuSlotStatusUNI[slotStatusIndex]->recv, sizeof(struct UNIRecv)); } REG_IME = imeBak; return 0; } u16 rfu_setRecvBuffer(u8 connType, u8 slotNo, void *buffer, u32 buffSize) { if (slotNo >= RFU_CHILD_MAX) return ERR_SLOT_NO; if (connType & TYPE_NI) { gRfuSlotStatusNI[slotNo]->recvBuffer = buffer; gRfuSlotStatusNI[slotNo]->recvBufferSize = buffSize; } else if (!(connType & TYPE_UNI)) { return ERR_COMM_TYPE; } else { gRfuSlotStatusUNI[slotNo]->recvBuffer = buffer; gRfuSlotStatusUNI[slotNo]->recvBufferSize = buffSize; } return 0; } u16 rfu_NI_setSendData(u8 bmSendSlot, u8 subFrameSize, const void *src, u32 size) { return rfu_STC_setSendData_org(32, bmSendSlot, subFrameSize, src, size); } u16 rfu_UNI_setSendData(u8 bmSendSlot, const void *src, u8 size) { u8 subFrameSize; if (gRfuLinkStatus->parentChild == MODE_PARENT) subFrameSize = size + 3; else subFrameSize = size + 2; return rfu_STC_setSendData_org(16, bmSendSlot, subFrameSize, src, 0); } u16 rfu_NI_CHILD_setSendGameName(u8 slotNo, u8 subFrameSize) { return rfu_STC_setSendData_org(64, 1 << slotNo, subFrameSize, &gRfuLinkStatus->my.serialNo, 26); } static u16 rfu_STC_setSendData_org(u8 ni_or_uni, u8 bmSendSlot, u8 subFrameSize, const void *src, u32 dataSize) { u8 bm_slot_id, sendSlotFlag; u8 frameSize; u8 *llFrameSize_p; u8 sending; u8 i; u16 imeBak; struct RfuSlotStatusUNI *slotStatus_UNI; struct RfuSlotStatusNI *slotStatus_NI; if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) return ERR_MODE_NOT_CONNECTED; if (!(bmSendSlot & 0xF)) return ERR_SLOT_NO; if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmSendSlot) != bmSendSlot) return ERR_SLOT_NOT_CONNECTED; if (ni_or_uni & 0x10) sendSlotFlag = gRfuLinkStatus->sendSlotUNIFlag; else sendSlotFlag = gRfuLinkStatus->sendSlotNIFlag; if (sendSlotFlag & bmSendSlot) return ERR_SLOT_BUSY; for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX && !((bmSendSlot >> bm_slot_id) & 1); ++bm_slot_id) ; if (gRfuLinkStatus->parentChild == MODE_PARENT) llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeParent; else if (gRfuLinkStatus->parentChild == MODE_CHILD) llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id]; frameSize = llsf_struct[gRfuLinkStatus->parentChild].frameSize; if (subFrameSize > *llFrameSize_p || subFrameSize <= frameSize) return ERR_SUBFRAME_SIZE; imeBak = REG_IME; REG_IME = 0; sending = ni_or_uni & 0x20; if (sending || ni_or_uni == 0x40) { slotStatus_NI = gRfuSlotStatusNI[bm_slot_id]; slotStatus_UNI = NULL; slotStatus_NI->send.errorCode = 0; slotStatus_NI->send.now_p[0] = &slotStatus_NI->send.dataType; slotStatus_NI->send.remainSize = 7; slotStatus_NI->send.bmSlotOrg = bmSendSlot; slotStatus_NI->send.bmSlot = bmSendSlot; slotStatus_NI->send.payloadSize = subFrameSize - frameSize; if (sending != 0) slotStatus_NI->send.dataType = 0; else slotStatus_NI->send.dataType = 1; slotStatus_NI->send.dataSize = dataSize; slotStatus_NI->send.src = src; slotStatus_NI->send.ack = 0; slotStatus_NI->send.phase = 0; for (i = 0; i < WINDOW_COUNT; ++i) { slotStatus_NI->send.recvAckFlag[i] = 0; slotStatus_NI->send.n[i] = 1; } for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id) { do { if ((bmSendSlot >> bm_slot_id) & 1) gRfuSlotStatusNI[bm_slot_id]->send.failCounter = 0; } while (0); } gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot; *llFrameSize_p -= subFrameSize; slotStatus_NI->send.state = SLOT_STATE_SEND_START; } else if (ni_or_uni & 0x10) { slotStatus_UNI = gRfuSlotStatusUNI[bm_slot_id]; slotStatus_UNI->send.bmSlot = bmSendSlot; slotStatus_UNI->send.src = src; slotStatus_UNI->send.payloadSize = subFrameSize - frameSize; *llFrameSize_p -= subFrameSize; slotStatus_UNI->send.state = SLOT_STATE_SEND_UNI; gRfuLinkStatus->sendSlotUNIFlag |= bmSendSlot; } REG_IME = imeBak; return 0; } u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) { struct RfuSlotStatusNI *slotStatusNI; u16 imeBak; u8 i; if (slotStatusIndex >= RFU_CHILD_MAX) return ERR_SLOT_NO; if (connType == 0x20) { slotStatusNI = gRfuSlotStatusNI[slotStatusIndex]; if ((slotStatusNI->send.state & SLOT_BUSY_FLAG) && (slotStatusNI->send.state & SLOT_SEND_FLAG)) { connType = bmNewTgtSlot ^ slotStatusNI->send.bmSlot; if (!(connType & bmNewTgtSlot)) { if (connType) { imeBak = REG_IME; REG_IME = 0; for (i = 0; i < RFU_CHILD_MAX; ++i) { if ((connType >> i) & 1) gRfuSlotStatusNI[i]->send.failCounter = 0; } gRfuLinkStatus->sendSlotNIFlag &= ~connType; slotStatusNI->send.bmSlot = bmNewTgtSlot; if (slotStatusNI->send.bmSlot == 0) { rfu_STC_releaseFrame(slotStatusIndex, 0, &slotStatusNI->send); slotStatusNI->send.state = SLOT_STATE_SEND_FAILED; } REG_IME = imeBak; } } else { return ERR_SLOT_TARGET; } } else { return ERR_SLOT_NOT_SENDING; } } else { if (connType == 16) { s32 bmSlot; if (gRfuSlotStatusUNI[slotStatusIndex]->send.state != SLOT_STATE_SEND_UNI) return ERR_SLOT_NOT_SENDING; for (bmSlot = 0, i = 0; i < RFU_CHILD_MAX; ++i) if (i != slotStatusIndex) bmSlot |= gRfuSlotStatusUNI[i]->send.bmSlot; if (bmNewTgtSlot & bmSlot) return ERR_SLOT_TARGET; imeBak = REG_IME; REG_IME = 0; gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot; gRfuLinkStatus->sendSlotUNIFlag |= bmNewTgtSlot; gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot = bmNewTgtSlot; REG_IME = imeBak; } else { return ERR_COMM_TYPE; } } return 0; } u16 rfu_NI_stopReceivingData(u8 slotStatusIndex) { struct NIComm *NI_comm; u16 imeBak; if (slotStatusIndex >= RFU_CHILD_MAX) return ERR_SLOT_NO; NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->recv; imeBak = REG_IME; ++imeBak; --imeBak; // fix imeBak, NI_comm register swap REG_IME = 0; if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & SLOT_BUSY_FLAG) { if (gRfuSlotStatusNI[slotStatusIndex]->recv.state == SLOT_STATE_RECV_LAST) gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN; else gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_FAILED; gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); rfu_STC_releaseFrame(slotStatusIndex, 1, NI_comm); } REG_IME = imeBak; return 0; } u16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size) { struct UNISend *UNI_send; u8 *frame_p; u16 imeBak; u8 frameEnd; if (slotStatusIndex >= RFU_CHILD_MAX) return ERR_SLOT_NO; UNI_send = &gRfuSlotStatusUNI[slotStatusIndex]->send; if (UNI_send->state != SLOT_STATE_SEND_UNI) return ERR_SLOT_NOT_SENDING; if (gRfuLinkStatus->parentChild == MODE_PARENT) { frame_p = &gRfuLinkStatus->remainLLFrameSizeParent; frameEnd = gRfuLinkStatus->remainLLFrameSizeParent + (u8)UNI_send->payloadSize; } else { frame_p = &gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex]; frameEnd = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)UNI_send->payloadSize; } if (frameEnd < size) return ERR_SUBFRAME_SIZE; imeBak = REG_IME; REG_IME = 0; UNI_send->src = src; *frame_p = frameEnd - size; UNI_send->payloadSize = size; UNI_send->dataReadyFlag = 1; REG_IME = imeBak; return 0; } void rfu_UNI_readySendData(u8 slotStatusIndex) { if (slotStatusIndex < RFU_CHILD_MAX) { if (gRfuSlotStatusUNI[slotStatusIndex]->send.state == SLOT_STATE_SEND_UNI) gRfuSlotStatusUNI[slotStatusIndex]->send.dataReadyFlag = 1; } } void rfu_UNI_clearRecvNewDataFlag(u8 slotStatusIndex) { if (slotStatusIndex < RFU_CHILD_MAX) gRfuSlotStatusUNI[slotStatusIndex]->recv.newDataFlag = 0; } void rfu_REQ_sendData(bool8 clockChangeFlag) { if (gRfuLinkStatus->parentChild != MODE_NEUTRAL) { if (gRfuLinkStatus->parentChild == MODE_PARENT && !(gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag)) { if (gRfuStatic->commExistFlag) { gRfuStatic->emberCount = 16; gRfuStatic->nullFrameCount = 0; } if (gRfuStatic->emberCount) --gRfuStatic->emberCount; else ++gRfuStatic->nullFrameCount; if (gRfuStatic->emberCount || !(gRfuStatic->nullFrameCount & 0xF)) { gRfuFixed->LLFBuffer[0] = 1; gRfuFixed->LLFBuffer[4] = 0xFF; STWI_set_Callback_M(rfu_CB_sendData3); if (!clockChangeFlag) STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, 1); else STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, 1); return; } } else { if (!gRfuLinkStatus->LLFReadyFlag) rfu_constructSendLLFrame(); if (gRfuLinkStatus->LLFReadyFlag) { STWI_set_Callback_M(rfu_CB_sendData); if (clockChangeFlag) { STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); return; } STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); } } if (clockChangeFlag) { if (gRfuLinkStatus->parentChild == MODE_PARENT) { if (gSTWIStatus->callbackS != NULL) gSTWIStatus->callbackS(39); } else { STWI_set_Callback_M(rfu_CB_sendData2); STWI_send_MS_ChangeREQ(); } } } } static void rfu_CB_sendData(u8 reqCommand, u16 reqResult) { u8 i; struct NIComm *NI_comm; if (reqResult == 0) { for (i = 0; i < RFU_CHILD_MAX; ++i) { if (gRfuSlotStatusUNI[i]->send.dataReadyFlag) gRfuSlotStatusUNI[i]->send.dataReadyFlag = 0; NI_comm = &gRfuSlotStatusNI[i]->send; if (NI_comm->state == SLOT_STATE_SEND_NULL) { rfu_STC_releaseFrame(i, 0, NI_comm); gRfuLinkStatus->sendSlotNIFlag &= ~NI_comm->bmSlot; if (NI_comm->dataType == 1) gRfuLinkStatus->getNameFlag |= 1 << i; NI_comm->state = SLOT_STATE_SEND_SUCCESS; } } } gRfuLinkStatus->LLFReadyFlag = 0; rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult); } static void rfu_CB_sendData2(u8 reqCommand, u16 reqResult) { rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult); } static void rfu_CB_sendData3(u8 reqCommand, u16 reqResult) { if (reqResult != 0) rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult); else if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ) rfu_STC_REQ_callback(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0); } static void rfu_constructSendLLFrame(void) { u32 pakcketSize, currSize; u8 i; u8 *llf_p; struct RfuSlotStatusNI *slotStatusNI; if (gRfuLinkStatus->parentChild != MODE_NEUTRAL && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag) { gRfuLinkStatus->LLFReadyFlag = 0; pakcketSize = 0; llf_p = (u8 *)&gRfuFixed->LLFBuffer[1]; for (i = 0; i < RFU_CHILD_MAX; ++i) { currSize = 0; if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG) currSize = rfu_STC_NI_constructLLSF(i, &llf_p, &gRfuSlotStatusNI[i]->send); if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG) currSize += rfu_STC_NI_constructLLSF(i, &llf_p, &gRfuSlotStatusNI[i]->recv); if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI) currSize += rfu_STC_UNI_constructLLSF(i, &llf_p); if (currSize != 0) { if (gRfuLinkStatus->parentChild == MODE_PARENT) pakcketSize += currSize; else pakcketSize |= currSize << (5 * i + 8); } } if (pakcketSize != 0) { while ((u32)llf_p & 3) *llf_p++ = 0; gRfuFixed->LLFBuffer[0] = pakcketSize; if (gRfuLinkStatus->parentChild == MODE_CHILD) { u8 *maxSize = llf_p - offsetof(struct RfuFixed, LLFBuffer[1]); pakcketSize = maxSize - *(u8 *volatile *)&gRfuFixed; } } gRfuStatic->totalPacketSize = pakcketSize; } } static u16 rfu_STC_NI_constructLLSF(u8 bm_slot_id, u8 **dest_pp, struct NIComm *NI_comm) { u16 size; u32 frame; u8 i; u8 *frame8_p; const struct LLSFStruct *llsf = &llsf_struct[gRfuLinkStatus->parentChild]; if (NI_comm->state == SLOT_STATE_SENDING) { while (NI_comm->now_p[NI_comm->phase] >= (const u8 *)NI_comm->src + NI_comm->dataSize) { ++NI_comm->phase; if (NI_comm->phase == 4) NI_comm->phase = 0; } } if (NI_comm->state & SLOT_RECV_FLAG) { size = 0; } else if (NI_comm->state == SLOT_STATE_SENDING) { if (NI_comm->now_p[NI_comm->phase] + NI_comm->payloadSize > (const u8 *)NI_comm->src + NI_comm->dataSize) size = (const u8 *)NI_comm->src + NI_comm->dataSize - NI_comm->now_p[NI_comm->phase]; else size = NI_comm->payloadSize; } else { if (NI_comm->remainSize >= NI_comm->payloadSize) size = NI_comm->payloadSize; else size = NI_comm->remainSize; } frame = (NI_comm->state & 0xF) << llsf->slotStateShift | NI_comm->ack << llsf->ackShift | NI_comm->phase << llsf->phaseShit | NI_comm->n[NI_comm->phase] << llsf->nShift | size; if (gRfuLinkStatus->parentChild == MODE_PARENT) frame |= NI_comm->bmSlot << 18; frame8_p = (u8 *)&frame; for (i = 0; i < llsf->frameSize; ++i) *(*dest_pp)++ = *frame8_p++; if (size != 0) { const u8 *src = NI_comm->now_p[NI_comm->phase]; gRfuFixed->fastCopyPtr(&src, dest_pp, size); } if (NI_comm->state == SLOT_STATE_SENDING) { ++NI_comm->phase; if (NI_comm->phase == 4) NI_comm->phase = 0; } if (gRfuLinkStatus->parentChild == MODE_PARENT) gRfuLinkStatus->LLFReadyFlag = 1; else gRfuLinkStatus->LLFReadyFlag |= 1 << bm_slot_id; return size + llsf->frameSize; } static u16 rfu_STC_UNI_constructLLSF(u8 bm_slot_id, u8 **dest_p) { const struct LLSFStruct *llsf; const u8 *src_p; u32 frame; u8 *frame8_p; u8 i; struct UNISend *UNI_send = &gRfuSlotStatusUNI[bm_slot_id]->send; if (!UNI_send->dataReadyFlag || !UNI_send->bmSlot) return 0; llsf = &llsf_struct[gRfuLinkStatus->parentChild]; frame = (UNI_send->state & 0xF) << llsf->slotStateShift | UNI_send->payloadSize; if (gRfuLinkStatus->parentChild == MODE_PARENT) frame |= UNI_send->bmSlot << 18; frame8_p = (u8 *)&frame; for (i = 0; i < llsf->frameSize; ++i) *(*dest_p)++ = *frame8_p++; src_p = UNI_send->src; gRfuFixed->fastCopyPtr(&src_p, dest_p, UNI_send->payloadSize); if (gRfuLinkStatus->parentChild == MODE_PARENT) gRfuLinkStatus->LLFReadyFlag = 16; else gRfuLinkStatus->LLFReadyFlag |= 16 << bm_slot_id; return llsf->frameSize + UNI_send->payloadSize; } void rfu_REQ_recvData(void) { if (gRfuLinkStatus->parentChild != MODE_NEUTRAL) { gRfuStatic->commExistFlag = gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag; gRfuStatic->recvErrorFlag = 0; STWI_set_Callback_M(rfu_CB_recvData); STWI_send_DataRxREQ(); } } static void rfu_CB_recvData(u8 reqCommand, u16 reqResult) { u8 i; struct RfuSlotStatusNI *slotStatusNI; struct NIComm *NI_comm; if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) { gRfuStatic->NIEndRecvFlag = 0; if (gRfuLinkStatus->parentChild == MODE_PARENT) rfu_STC_PARENT_analyzeRecvPacket(); else rfu_STC_CHILD_analyzeRecvPacket(); for (i = 0; i < RFU_CHILD_MAX; ++i) { slotStatusNI = gRfuSlotStatusNI[i]; if (slotStatusNI->recv.state == SLOT_STATE_RECV_LAST && !((gRfuStatic->NIEndRecvFlag >> i) & 1)) { NI_comm = &slotStatusNI->recv; if (NI_comm->dataType == 1) gRfuLinkStatus->getNameFlag |= 1 << i; rfu_STC_releaseFrame(i, 1, NI_comm); gRfuLinkStatus->recvSlotNIFlag &= ~NI_comm->bmSlot; slotStatusNI->recv.state = SLOT_STATE_RECV_SUCCESS; } } if (gRfuStatic->recvErrorFlag) reqResult = gRfuStatic->recvErrorFlag | ERR_DATA_RECV; } rfu_STC_REQ_callback(reqCommand, reqResult); } static void rfu_STC_PARENT_analyzeRecvPacket(void) { u32 frames32; u8 bm_slot_id; u8 frame_counts[RFU_CHILD_MAX]; u8 *packet_p; frames32 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8; for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id) { frame_counts[bm_slot_id] = frames32 & 0x1F; frames32 >>= 5; if (frame_counts[bm_slot_id] == 0) gRfuStatic->NIEndRecvFlag |= 1 << bm_slot_id; } packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id) { if (frame_counts[bm_slot_id]) { u8 *frames_p = &frame_counts[bm_slot_id]; do { u8 analyzed_frames = rfu_STC_analyzeLLSF(bm_slot_id, packet_p, *frames_p); packet_p += analyzed_frames; *frames_p -= analyzed_frames; } while (!(*frames_p & 0x80) && (*frames_p)); } } } static void rfu_STC_CHILD_analyzeRecvPacket(void) { u16 frames_remaining; u8 *packet_p; u16 analyzed_frames; frames_remaining = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] & 0x7F; packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; if (frames_remaining == 0) gRfuStatic->NIEndRecvFlag = 15; do { if (frames_remaining == 0) break; analyzed_frames = rfu_STC_analyzeLLSF(0, packet_p, frames_remaining); packet_p += analyzed_frames; frames_remaining -= analyzed_frames; } while (!(frames_remaining & 0x8000)); } static u16 rfu_STC_analyzeLLSF(u8 slot_id, const u8 *src, u16 last_frame) { struct RfuLocalStruct llsf_NI; const struct LLSFStruct *llsf_p; u32 frames; u8 i; u16 retVal; llsf_p = &llsf_struct[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)]; if (last_frame < llsf_p->frameSize) return last_frame; frames = 0; for (i = 0; i < llsf_p->frameSize; ++i) frames |= *src++ << 8 * i; llsf_NI.recvFirst = (frames >> llsf_p->recvFirstShift) & llsf_p->recvFirstMask; llsf_NI.connSlotFlag = (frames >> llsf_p->connSlotFlagShift) & llsf_p->connSlotFlagMask; llsf_NI.slotState = (frames >> llsf_p->slotStateShift) & llsf_p->slotStateMask; llsf_NI.ack = (frames >> llsf_p->ackShift) & llsf_p->ackMask; llsf_NI.phase = (frames >> llsf_p->phaseShit) & llsf_p->phaseMask; llsf_NI.n = (frames >> llsf_p->nShift) & llsf_p->nMask; llsf_NI.frame = (frames & llsf_p->framesMask) & frames; retVal = llsf_NI.frame + llsf_p->frameSize; if (llsf_NI.recvFirst == 0) { if (gRfuLinkStatus->parentChild == MODE_PARENT) { if ((gRfuLinkStatus->connSlotFlag >> slot_id) & 1) { if (llsf_NI.slotState == LCOM_UNI) { rfu_STC_UNI_receive(slot_id, &llsf_NI, src); } else if (llsf_NI.ack == 0) { rfu_STC_NI_receive_Receiver(slot_id, &llsf_NI, src); } else { for (i = 0; i < RFU_CHILD_MAX; ++i) if (((gRfuSlotStatusNI[i]->send.bmSlot >> slot_id) & 1) && ((gRfuLinkStatus->sendSlotNIFlag >> slot_id) & 1)) break; if (i < RFU_CHILD_MAX) rfu_STC_NI_receive_Sender(i, slot_id, &llsf_NI, src); } } } else { s32 conSlots = gRfuLinkStatus->connSlotFlag & llsf_NI.connSlotFlag; if (conSlots) { for (i = 0; i < RFU_CHILD_MAX; ++i) { if ((conSlots >> i) & 1) { if (llsf_NI.slotState == LCOM_UNI) rfu_STC_UNI_receive(i, &llsf_NI, src); else if (llsf_NI.ack == 0) rfu_STC_NI_receive_Receiver(i, &llsf_NI, src); else if ((gRfuLinkStatus->sendSlotNIFlag >> i) & 1) rfu_STC_NI_receive_Sender(i, i, &llsf_NI, src); } } } } } return retVal; } static void rfu_STC_UNI_receive(u8 bm_slot_id, const struct RfuLocalStruct *llsf_NI, const u8 *src) { u8 *dest; u32 size; struct RfuSlotStatusUNI *slotStatusUNI = gRfuSlotStatusUNI[bm_slot_id]; struct UNIRecv *UNI_recv = &slotStatusUNI->recv; UNI_recv->errorCode = 0; if (gRfuSlotStatusUNI[bm_slot_id]->recvBufferSize < llsf_NI->frame) { slotStatusUNI->recv.state = SLOT_STATE_RECV_IGNORE; UNI_recv->errorCode = ERR_RECV_BUFF_OVER; } else { if (UNI_recv->dataBlockFlag) { if (UNI_recv->newDataFlag) { UNI_recv->errorCode = ERR_RECV_UNK; goto force_tail_merge; } } else { if (UNI_recv->newDataFlag) UNI_recv->errorCode = ERR_RECV_DATA_OVERWRITED; } UNI_recv->state = SLOT_STATE_RECEIVING; size = UNI_recv->dataSize = llsf_NI->frame; dest = gRfuSlotStatusUNI[bm_slot_id]->recvBuffer; gRfuFixed->fastCopyPtr(&src, &dest, size); UNI_recv->newDataFlag = 1; UNI_recv->state = 0; } force_tail_merge: if (UNI_recv->errorCode) gRfuStatic->recvErrorFlag |= 16 << bm_slot_id; } static void rfu_STC_NI_receive_Sender(u8 NI_slot, u8 bm_flag, const struct RfuLocalStruct *llsf_NI, const u8 *data_p) { struct NIComm *NI_comm = &gRfuSlotStatusNI[NI_slot]->send; u16 state = NI_comm->state; u8 n = NI_comm->n[llsf_NI->phase]; u8 i; u16 imeBak; if ((llsf_NI->slotState == LCOM_NI && state == SLOT_STATE_SENDING) || (llsf_NI->slotState == LCOM_NI_START && state == SLOT_STATE_SEND_START) || (llsf_NI->slotState == LCOM_NI_END && state == SLOT_STATE_SEND_LAST)) { if (NI_comm->n[llsf_NI->phase] == llsf_NI->n) NI_comm->recvAckFlag[llsf_NI->phase] |= 1 << bm_flag; } if ((NI_comm->recvAckFlag[llsf_NI->phase] & NI_comm->bmSlot) == NI_comm->bmSlot) { NI_comm->n[llsf_NI->phase] = (NI_comm->n[llsf_NI->phase] + 1) & 3; NI_comm->recvAckFlag[llsf_NI->phase] = 0; if ((u16)(NI_comm->state + ~SLOT_STATE_SEND_NULL) <= 1) { if (NI_comm->state == SLOT_STATE_SEND_START) NI_comm->now_p[llsf_NI->phase] += NI_comm->payloadSize; else NI_comm->now_p[llsf_NI->phase] += NI_comm->payloadSize << 2; NI_comm->remainSize -= NI_comm->payloadSize; switch (NI_comm->remainSize) { default: case 0: NI_comm->phase = 0; if (NI_comm->state == SLOT_STATE_SEND_START) { for (i = 0; i < WINDOW_COUNT; ++i) { NI_comm->n[i] = 1; NI_comm->now_p[i] = NI_comm->src + NI_comm->payloadSize * i; } NI_comm->remainSize = NI_comm->dataSize; NI_comm->state = SLOT_STATE_SENDING; } else { NI_comm->n[0] = 0; NI_comm->remainSize = 0; NI_comm->state = SLOT_STATE_SEND_LAST; } break; case 1 ... INT_MAX: break; } } else if (NI_comm->state == SLOT_STATE_SEND_LAST) { NI_comm->state = SLOT_STATE_SEND_NULL; } } if (NI_comm->state != state || NI_comm->n[llsf_NI->phase] != n || (NI_comm->recvAckFlag[llsf_NI->phase] >> bm_flag) & 1) { imeBak = REG_IME; REG_IME = 0; gRfuStatic->recvRenewalFlag |= 16 << bm_flag; gRfuSlotStatusNI[bm_flag]->send.failCounter = 0; REG_IME = imeBak; } } static void rfu_STC_NI_receive_Receiver(u8 bm_slot_id, const struct RfuLocalStruct *llsf_NI, const u8 *data_p) { u16 imeBak; u32 state_check = 0; struct RfuSlotStatusNI *slotStatus_NI = gRfuSlotStatusNI[bm_slot_id]; struct NIComm *recvSlot = &slotStatus_NI->recv; u16 state = slotStatus_NI->recv.state; u8 n = slotStatus_NI->recv.n[llsf_NI->phase]; if (llsf_NI->slotState == LCOM_NI_END) { gRfuStatic->NIEndRecvFlag |= 1 << bm_slot_id; if (slotStatus_NI->recv.state == SLOT_STATE_RECEIVING) { slotStatus_NI->recv.phase = 0; slotStatus_NI->recv.n[0] = 0; slotStatus_NI->recv.state = SLOT_STATE_RECV_LAST; } } else if (llsf_NI->slotState == LCOM_NI) { if (state == SLOT_STATE_RECV_START && !recvSlot->remainSize) rfu_STC_NI_initSlot_asRecvDataEntity(bm_slot_id, recvSlot); if (recvSlot->state == SLOT_STATE_RECEIVING) state_check = 1; } else if (llsf_NI->slotState == LCOM_NI_START) { if (state == SLOT_STATE_RECV_START) { state_check = 1; } else { rfu_STC_NI_initSlot_asRecvControllData(bm_slot_id, recvSlot); if (slotStatus_NI->recv.state != SLOT_STATE_RECV_START) return; state_check = 1; } } if (state_check != 0) { if (llsf_NI->n == ((recvSlot->n[llsf_NI->phase] + 1) & 3)) { gRfuFixed->fastCopyPtr(&data_p, (u8 **)&recvSlot->now_p[llsf_NI->phase], llsf_NI->frame); if (recvSlot->state == SLOT_STATE_RECEIVING) recvSlot->now_p[llsf_NI->phase] += 3 * recvSlot->payloadSize; recvSlot->remainSize -= llsf_NI->frame; recvSlot->n[llsf_NI->phase] = llsf_NI->n; } } if (recvSlot->errorCode == 0) { recvSlot->phase = llsf_NI->phase; if (recvSlot->state != state || recvSlot->n[llsf_NI->phase] != n || recvSlot->n[llsf_NI->phase] == llsf_NI->n) { imeBak = REG_IME; REG_IME = 0; gRfuStatic->recvRenewalFlag |= 1 << bm_slot_id; recvSlot->failCounter = 0; REG_IME = imeBak; } } } static void rfu_STC_NI_initSlot_asRecvControllData(u8 bm_slot_id, struct NIComm *NI_comm) { u8 *llFrameSize_p; u32 llFrameSize; u8 bm_slot_flag; if (gRfuLinkStatus->parentChild == MODE_PARENT) { llFrameSize = 3; llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeParent; } else { llFrameSize = 2; llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id]; } bm_slot_flag = 1 << bm_slot_id; if (NI_comm->state == 0) { if (*llFrameSize_p < llFrameSize) { NI_comm->state = SLOT_STATE_RECV_IGNORE; NI_comm->errorCode = ERR_RECV_REPLY_SUBFRAME_SIZE; gRfuStatic->recvErrorFlag |= bm_slot_flag; } else { NI_comm->errorCode = 0; *llFrameSize_p -= llFrameSize; NI_comm->now_p[0] = &NI_comm->dataType; NI_comm->remainSize = 7; NI_comm->ack = 1; NI_comm->payloadSize = 0; NI_comm->bmSlot = bm_slot_flag; NI_comm->state = SLOT_STATE_RECV_START; gRfuLinkStatus->recvSlotNIFlag |= bm_slot_flag; } } } static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 bm_slot_id, struct NIComm *NI_comm) { u8 bm_slot_flag, win_id; if (NI_comm->dataType == 1) { NI_comm->now_p[0] = (void *)&gRfuLinkStatus->partner[bm_slot_id].serialNo; } else { if (NI_comm->dataSize > gRfuSlotStatusNI[bm_slot_id]->recvBufferSize) { bm_slot_flag = 1 << bm_slot_id; gRfuStatic->recvErrorFlag |= bm_slot_flag; gRfuLinkStatus->recvSlotNIFlag &= ~bm_slot_flag; NI_comm->errorCode = ERR_RECV_BUFF_OVER; NI_comm->state = SLOT_STATE_RECV_FAILED; rfu_STC_releaseFrame(bm_slot_id, 1, NI_comm); return; } NI_comm->now_p[0] = gRfuSlotStatusNI[bm_slot_id]->recvBuffer; } for (win_id = 0; win_id < WINDOW_COUNT; ++win_id) { NI_comm->n[win_id] = 0; NI_comm->now_p[win_id] = &NI_comm->now_p[0][NI_comm->payloadSize * win_id]; } NI_comm->remainSize = NI_comm->dataSize; NI_comm->state = SLOT_STATE_RECEIVING; } static void rfu_NI_checkCommFailCounter(void) { u16 imeBak; u32 recvRenewalFlag; u8 bm_slot_flag, bm_slot_id; if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag) { imeBak = REG_IME; REG_IME = 0; recvRenewalFlag = gRfuStatic->recvRenewalFlag >> 4; for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id) { bm_slot_flag = 1 << bm_slot_id; if (gRfuLinkStatus->sendSlotNIFlag & bm_slot_flag && !(gRfuStatic->recvRenewalFlag & bm_slot_flag)) ++gRfuSlotStatusNI[bm_slot_id]->send.failCounter; if (gRfuLinkStatus->recvSlotNIFlag & bm_slot_flag && !(recvRenewalFlag & bm_slot_flag)) ++gRfuSlotStatusNI[bm_slot_id]->recv.failCounter; } gRfuStatic->recvRenewalFlag = 0; REG_IME = imeBak; } } void rfu_REQ_noise(void) { STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_TestModeREQ(1, 0); } ================================================ FILE: src/librfu_sio32id.c ================================================ #include "librfu.h" static void Sio32IDIntr(void); static void Sio32IDInit(void); static s32 Sio32IDMain(void); struct RfuSIO32Id { u8 MS_mode; u8 state; u16 count; u16 send_id; u16 recv_id; u16 unk8; // unused u16 lastId; }; struct RfuSIO32Id gRfuSIO32Id; static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO static const char Sio32IDLib_Var[] = "Sio32ID_030820"; s32 AgbRFU_checkID(u8 maxTries) { u16 ieBak; vu16 *regTMCNTL; s32 id; // Interrupts must be enabled if (REG_IME == 0) return -1; ieBak = REG_IE; gSTWIStatus->state = 10; STWI_set_Callback_ID(Sio32IDIntr); Sio32IDInit(); regTMCNTL = ®_TMCNT_L(gSTWIStatus->timerSelect); maxTries *= 8; while (--maxTries != 0xFF) { id = Sio32IDMain(); if (id != 0) break; regTMCNTL[1] = 0; regTMCNTL[0] = 0; regTMCNTL[1] = TIMER_1024CLK | TIMER_ENABLE; while (regTMCNTL[0] < 32) ; regTMCNTL[1] = 0; regTMCNTL[0] = 0; } REG_IME = 0; REG_IE = ieBak; REG_IME = 1; gSTWIStatus->state = 0; STWI_set_Callback_ID(NULL); return id; } static void Sio32IDInit(void) { REG_IME = 0; REG_IE &= ~((8 << gSTWIStatus->timerSelect) | INTR_FLAG_SERIAL); REG_IME = 1; REG_RCNT = 0; REG_SIOCNT = SIO_32BIT_MODE; REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; CpuFill32(0, &gRfuSIO32Id, sizeof(struct RfuSIO32Id)); REG_IF = INTR_FLAG_SERIAL; } static s32 Sio32IDMain(void) { switch (gRfuSIO32Id.state) { case 0: gRfuSIO32Id.MS_mode = AGB_CLK_MASTER; REG_SIOCNT |= SIO_38400_BPS; REG_IME = 0; REG_IE |= INTR_FLAG_SERIAL; REG_IME = 1; gRfuSIO32Id.state = 1; *(vu8 *)®_SIOCNT |= SIO_ENABLE; break; case 1: if (gRfuSIO32Id.lastId == 0) { if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER) { if (gRfuSIO32Id.count == 0) { REG_IME = 0; REG_SIOCNT |= SIO_ENABLE; REG_IME = 1; } } else if (gRfuSIO32Id.send_id != RFU_ID && !gRfuSIO32Id.count) { REG_IME = 0; REG_IE &= ~INTR_FLAG_SERIAL; REG_IME = 1; REG_SIOCNT = 0; REG_SIOCNT = SIO_32BIT_MODE; REG_IF = INTR_FLAG_SERIAL; REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; REG_IME = 0; REG_IE |= INTR_FLAG_SERIAL; REG_IME = 1; } break; } else { gRfuSIO32Id.state = 2; // fallthrough } default: return gRfuSIO32Id.lastId; } return 0; } static void Sio32IDIntr(void) { u32 regSIODATA32; u16 delay; u32 rfuSIO32IdUnk0_times_16; u16 negRfuSIO32IdUnk6; regSIODATA32 = REG_SIODATA32; if (gRfuSIO32Id.MS_mode != AGB_CLK_MASTER) REG_SIOCNT |= SIO_ENABLE; rfuSIO32IdUnk0_times_16 = (regSIODATA32 << (16 * gRfuSIO32Id.MS_mode)) >> 16; regSIODATA32 = (regSIODATA32 << 16 * (1 - gRfuSIO32Id.MS_mode)) >> 16; if (gRfuSIO32Id.lastId == 0) { u16 backup = rfuSIO32IdUnk0_times_16; if (backup == gRfuSIO32Id.recv_id) { if (gRfuSIO32Id.count < 4) { backup = (u16)~gRfuSIO32Id.send_id; if (gRfuSIO32Id.recv_id == backup) { if (regSIODATA32 == (u16)~gRfuSIO32Id.recv_id) ++gRfuSIO32Id.count; } } else gRfuSIO32Id.lastId = regSIODATA32; } else { gRfuSIO32Id.count = 0; } } if (gRfuSIO32Id.count < 4) gRfuSIO32Id.send_id = *(gRfuSIO32Id.count + Sio32ConnectionData); else gRfuSIO32Id.send_id = RFU_ID; gRfuSIO32Id.recv_id = ~regSIODATA32; REG_SIODATA32 = (gRfuSIO32Id.send_id << 16 * (1 - gRfuSIO32Id.MS_mode)) + (gRfuSIO32Id.recv_id << 16 * gRfuSIO32Id.MS_mode); if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER && (gRfuSIO32Id.count != 0 || regSIODATA32 == 0x494e)) { for (delay = 0; delay < 600; ++delay) ; if (gRfuSIO32Id.lastId == 0) REG_SIOCNT |= SIO_ENABLE; } } ================================================ FILE: src/librfu_stwi.c ================================================ #include "librfu.h" static void STWI_intr_timer(void); static u16 STWI_init(u8 request); static s32 STWI_start_Command(void); static void STWI_set_timer(u8 unk); static void STWI_stop_timer(void); static s32 STWI_restart_Command(void); static s32 STWI_reset_ClockCounter(void); struct STWIStatus *gSTWIStatus; void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) { // If we're copying our interrupt into RAM, DMA it to block1 and use // block2 for our STWIStatus, otherwise block1 holds the STWIStatus. // interrupt usually is a pointer to gIntrTable[1] if (copyInterruptToRam == TRUE) { *interrupt = (IntrFunc)interruptStruct->block1; DmaCopy16(3, &IntrSIO32, interruptStruct->block1, sizeof(interruptStruct->block1)); gSTWIStatus = &interruptStruct->block2; } else { *interrupt = IntrSIO32; gSTWIStatus = (struct STWIStatus *)interruptStruct->block1; } gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc; gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc; gSTWIStatus->msMode = AGB_CLK_MASTER; gSTWIStatus->state = 0; // master send req gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->ackLength = 0; gSTWIStatus->ackNext = 0; gSTWIStatus->ackActiveCommand = 0; gSTWIStatus->timerState = 0; gSTWIStatus->timerActive = 0; gSTWIStatus->error = 0; gSTWIStatus->recoveryCount = 0; gSTWIStatus->sending = 0; REG_RCNT = 0x100; // TODO: mystery bit? REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; STWI_init_Callback_M(); STWI_init_Callback_S(); IntrEnable(INTR_FLAG_SERIAL); } void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect) { *interrupt = STWI_intr_timer; gSTWIStatus->timerSelect = timerSelect; IntrEnable(INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect); } void AgbRFU_SoftReset(void) { vu16 *timerL; vu16 *timerH; REG_RCNT = 0x8000; REG_RCNT = 0x80A0; // all these bits are undocumented timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); *timerH = 0; *timerL = 0; *timerH = TIMER_ENABLE | TIMER_1024CLK; while (*timerL <= 0x11) REG_RCNT = 0x80A2; *timerH = 3; REG_RCNT = 0x80A0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; gSTWIStatus->state = 0; // master send req gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->reqActiveCommand = 0; gSTWIStatus->ackLength = 0; gSTWIStatus->ackNext = 0; gSTWIStatus->ackActiveCommand = 0; gSTWIStatus->timerState = 0; gSTWIStatus->timerActive = 0; gSTWIStatus->error = 0; gSTWIStatus->msMode = AGB_CLK_MASTER; gSTWIStatus->recoveryCount = 0; gSTWIStatus->sending = 0; } void STWI_set_MS_mode(u8 mode) { gSTWIStatus->msMode = mode; } u16 STWI_read_status(u8 index) { switch (index) { case 0: return gSTWIStatus->error; case 1: return gSTWIStatus->msMode; case 2: return gSTWIStatus->state; case 3: return gSTWIStatus->reqActiveCommand; default: return 0xFFFF; } } void STWI_init_Callback_M(void) { STWI_set_Callback_M(NULL); } void STWI_init_Callback_S(void) { STWI_set_Callback_S(NULL); } // The callback can take 2 or 3 arguments. void STWI_set_Callback_M(void *callbackM) { gSTWIStatus->callbackM = callbackM; } void STWI_set_Callback_S(void (*callbackS)(u16)) { gSTWIStatus->callbackS = callbackS; } void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer { gSTWIStatus->callbackID = func; } u16 STWI_poll_CommandEnd(void) { while (gSTWIStatus->sending == 1) ; return gSTWIStatus->error; } void STWI_send_ResetREQ(void) { if (!STWI_init(ID_RESET_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_LinkStatusREQ(void) { if (!STWI_init(ID_LINK_STATUS_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_VersionStatusREQ(void) { if (!STWI_init(ID_VERSION_STATUS_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SystemStatusREQ(void) { if (!STWI_init(ID_SYSTEM_STATUS_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SlotStatusREQ(void) { if (!STWI_init(ID_SLOT_STATUS_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_ConfigStatusREQ(void) { if (!STWI_init(ID_CONFIG_STATUS_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_GameConfigREQ(const u8 *serial_gname, const u8 *uname) { u8 *packetBytes; s32 i; if (!STWI_init(ID_GAME_CONFIG_REQ)) { gSTWIStatus->reqLength = 6; packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *(u16 *)packetBytes = *(u16 *)serial_gname; packetBytes += sizeof(u16); serial_gname += sizeof(u16); for (i = 0; i < 14; ++i) { *packetBytes = *serial_gname; ++packetBytes; ++serial_gname; } for (i = 0; i < 8; ++i) { *packetBytes = *uname; ++packetBytes; ++uname; } STWI_start_Command(); } } void STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) { if (!STWI_init(ID_SYSTEM_CONFIG_REQ)) { u8 *packetBytes; gSTWIStatus->reqLength = 1; packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *packetBytes++ = mcTimer; *packetBytes++ = maxMFrame; *(u16 *)packetBytes = availSlotFlag; STWI_start_Command(); } } void STWI_send_SC_StartREQ(void) { if (!STWI_init(ID_SC_START_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SC_PollingREQ(void) { if (!STWI_init(ID_SC_POLL_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SC_EndREQ(void) { if (!STWI_init(ID_SC_END_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SP_StartREQ(void) { if (!STWI_init(ID_SP_START_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SP_PollingREQ(void) { if (!STWI_init(ID_SP_POLL_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SP_EndREQ(void) { if (!STWI_init(ID_SP_END_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_CP_StartREQ(u16 unk1) { if (!STWI_init(ID_CP_START_REQ)) { gSTWIStatus->reqLength = 1; gSTWIStatus->txPacket->rfuPacket32.data[0] = unk1; STWI_start_Command(); } } void STWI_send_CP_PollingREQ(void) { if (!STWI_init(ID_CP_POLL_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_CP_EndREQ(void) { if (!STWI_init(ID_CP_END_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_DataTxREQ(const void *in, u8 size) { if (!STWI_init(ID_DATA_TX_REQ)) { u8 reqLength = (size / sizeof(u32)); if (size & (sizeof(u32) - 1)) reqLength += 1; gSTWIStatus->reqLength = reqLength; CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32)); STWI_start_Command(); } } void STWI_send_DataTxAndChangeREQ(const void *in, u8 size) { if (!STWI_init(ID_DATA_TX_AND_CHANGE_REQ)) { u8 reqLength = (size / sizeof(u32)); if (size & (sizeof(u32) - 1)) reqLength += 1; gSTWIStatus->reqLength = reqLength; CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32)); STWI_start_Command(); } } void STWI_send_DataRxREQ(void) { if (!STWI_init(ID_DATA_RX_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_MS_ChangeREQ(void) { if (!STWI_init(ID_MS_CHANGE_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_DataReadyAndChangeREQ(u8 unk) { if (!STWI_init(ID_DATA_READY_AND_CHANGE_REQ)) { if (!unk) { gSTWIStatus->reqLength = 0; } else { u8 *packetBytes; gSTWIStatus->reqLength = 1; packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *packetBytes++ = unk; *packetBytes++ = 0; *packetBytes++ = 0; *packetBytes = 0; } STWI_start_Command(); } } void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) { if (!STWI_init(ID_DISCONNECTED_AND_CHANGE_REQ)) { u8 *packetBytes; gSTWIStatus->reqLength = 1; packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *packetBytes++ = unk0; *packetBytes++ = unk1; *packetBytes++ = 0; *packetBytes = 0; STWI_start_Command(); } } void STWI_send_ResumeRetransmitAndChangeREQ(void) { if (!STWI_init(ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_DisconnectREQ(u8 unk) { if (!STWI_init(ID_DISCONNECT_REQ)) { gSTWIStatus->reqLength = 1; gSTWIStatus->txPacket->rfuPacket32.data[0] = unk; STWI_start_Command(); } } void STWI_send_TestModeREQ(u8 unk0, u8 unk1) { if (!STWI_init(ID_TEST_MODE_REQ)) { gSTWIStatus->reqLength = 1; gSTWIStatus->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); STWI_start_Command(); } } void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) { u32 *packetData; u32 arg1; if (!STWI_init(ID_CPR_START_REQ)) { gSTWIStatus->reqLength = 2; arg1 = unk1 | (unk0 << 16); packetData = gSTWIStatus->txPacket->rfuPacket32.data; packetData[0] = arg1; packetData[1] = unk2; STWI_start_Command(); } } void STWI_send_CPR_PollingREQ(void) { if (!STWI_init(ID_CPR_POLL_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_CPR_EndREQ(void) { if (!STWI_init(ID_CPR_END_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_StopModeREQ(void) { if (!STWI_init(ID_STOP_MODE_REQ)) { gSTWIStatus->reqLength = 0; STWI_start_Command(); } } static void STWI_intr_timer(void) { switch (gSTWIStatus->timerState) { // TODO: Make an enum for these case 2: gSTWIStatus->timerActive = 1; STWI_set_timer(50); break; case 1: case 4: STWI_stop_timer(); STWI_restart_Command(); break; case 3: gSTWIStatus->timerActive = 1; STWI_stop_timer(); STWI_reset_ClockCounter(); if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0); break; } } static void STWI_set_timer(u8 count) { vu16 *timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); vu16 *timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); REG_IME = 0; switch (count) { case 50: *timerL = 0xFCCB; gSTWIStatus->timerState = 1; break; case 80: *timerL = 0xFAE0; gSTWIStatus->timerState = 2; break; case 100: *timerL = 0xF996; gSTWIStatus->timerState = 3; break; case 130: *timerL = 0xF7AD; gSTWIStatus->timerState = 4; break; } *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK; REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect; REG_IME = 1; } static void STWI_stop_timer(void) { gSTWIStatus->timerState = 0; REG_TMCNT_L(gSTWIStatus->timerSelect) = 0; REG_TMCNT_H(gSTWIStatus->timerSelect) = 0; } /* * Set up STWI to send REQ. Returns 1 if error (see below). */ static u16 STWI_init(u8 request) { if (!REG_IME) { // Can't start sending if IME is disabled. gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } else if (gSTWIStatus->sending == 1) { // Already sending something. Cancel and error. gSTWIStatus->error = ERR_REQ_CMD_SENDING; gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } else if (gSTWIStatus->msMode == AGB_CLK_SLAVE) { // Can't send if clock slave gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus); return TRUE; } else { // Good to go, start sending gSTWIStatus->sending = 1; gSTWIStatus->reqActiveCommand = request; gSTWIStatus->state = 0; // master send req gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->ackLength = 0; gSTWIStatus->ackNext = 0; gSTWIStatus->ackActiveCommand = 0; gSTWIStatus->timerState = 0; gSTWIStatus->timerActive = 0; gSTWIStatus->error = 0; gSTWIStatus->recoveryCount = 0; REG_RCNT = 0x100; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; return FALSE; } } static s32 STWI_start_Command(void) { u16 imeTemp; // equivalent to gSTWIStatus->txPacket->rfuPacket32.command, // but the cast here is required to avoid register issue *(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand; REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command; gSTWIStatus->state = 0; // master send req gSTWIStatus->reqNext = 1; imeTemp = REG_IME; REG_IME = 0; REG_IE |= (INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect); REG_IE |= INTR_FLAG_SERIAL; REG_IME = imeTemp; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS; return 0; } static s32 STWI_restart_Command(void) { if (gSTWIStatus->recoveryCount < 2) { ++gSTWIStatus->recoveryCount; STWI_start_Command(); } else { if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) { gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); } else { gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); gSTWIStatus->state = 4; // error } } return 0; } static s32 STWI_reset_ClockCounter(void) { gSTWIStatus->state = 5; // slave receive req init gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; REG_SIODATA32 = (1 << 31); REG_SIOCNT = 0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; REG_SIOCNT = (SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS) + 0x7F; return 0; } ================================================ FILE: src/link.c ================================================ #include "global.h" #include "gflib.h" #include "m4a.h" #include "scanline_effect.h" #include "bg_regs.h" #include "decompress.h" #include "save.h" #include "battle.h" #include "quest_log.h" #include "link_rfu.h" #include "librfu.h" #include "random.h" #include "task.h" #include "event_data.h" #include "item_menu.h" #include "trade.h" #include "menu.h" #include "overworld.h" #include "new_menu_helpers.h" #include "link.h" #include "graphics.h" #include "strings.h" #include "help_system.h" #include "reset_save_heap.h" #include "constants/battle.h" #include "constants/songs.h" extern u16 gHeldKeyCodeToSend; struct BlockTransfer { u16 pos; u16 size; const u8 *src; bool8 active; u8 multiplayerId; }; struct LinkTestBGInfo { u32 screenBaseBlock; u32 paletteNum; u32 baseChar; u32 unused; }; #define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT) static struct BlockTransfer sBlockSend; ALIGNED(8) static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS]; static u32 sBlockSendDelayCounter; static u32 sDummy1; // Never read static u8 sDummy2; // Never assigned, read in unused function static u32 sPlayerDataExchangeStatus; static u32 sDummy3; // Never read static u8 sLinkTestLastBlockSendPos; ALIGNED(8) static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; static u8 sNumVBlanksWithoutSerialIntr; static bool8 sSendBufferEmpty; static u16 sSendNonzeroCheck; static u16 sRecvNonzeroCheck; static u8 sChecksumAvailable; static u8 sHandshakePlayerCount; u16 gLinkPartnersHeldKeys[6]; u32 gLinkDebugSeed; struct LinkPlayerBlock gLocalLinkPlayerBlock; bool8 gLinkErrorOccurred; u32 gLinkDebugFlags; u32 gLinkFiller1; bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS]; u8 gBlockReceivedStatus[MAX_LINK_PLAYERS]; u32 gLinkFiller2; u16 gLinkHeldKeys; u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; u32 gLinkStatus; bool8 gLinkDummy1; // Never read bool8 gLinkDummy2; // Never read bool8 gReadyToExitStandby[MAX_LINK_PLAYERS]; bool8 gReadyToCloseLink[MAX_LINK_PLAYERS]; u16 gReadyCloseLinkType; u8 gSuppressLinkErrorMessage; u8 gWirelessCommType; u8 gSavedLinkPlayerCount; u16 gSendCmd[CMD_LENGTH]; u8 gSavedMultiplayerId; bool8 gReceivedRemoteLinkPlayers; struct LinkTestBGInfo gLinkTestBGInfo; void (*gLinkCallback)(void); u8 gShouldAdvanceLinkState; u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; u8 gBlockRequestType; u32 gLinkFiller3; // file u32 gLinkFiller4; // boundary u32 gLinkFiller5; // here? u8 gLastSendQueueCount; struct Link gLink; u8 gLastRecvQueueCount; u16 gLinkSavedIme; static EWRAM_DATA bool8 sLinkTestDebugValuesEnabled = FALSE; static EWRAM_DATA bool8 sDummyFlag = FALSE; EWRAM_DATA u32 gBerryBlenderKeySendAttempts = 0; EWRAM_DATA u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2] = {}; EWRAM_DATA u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE] = {}; static EWRAM_DATA bool8 sLinkOpen = FALSE; EWRAM_DATA u16 gLinkType = 0; static EWRAM_DATA u16 sTimeOutCounter = 0; EWRAM_DATA struct LinkPlayer gLocalLinkPlayer = {}; EWRAM_DATA struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS] = {}; EWRAM_DATA struct LinkPlayer gSavedLinkPlayers[MAX_RFU_PLAYERS] = {}; EWRAM_DATA struct { u32 status; u8 lastRecvQueueCount; u8 lastSendQueueCount; bool8 disconnected; } sLinkErrorBuffer = {}; static EWRAM_DATA u16 sReadyCloseLinkAttempts = 0; // never read static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL; static void InitLocalLinkPlayer(void); static void VBlankCB_LinkError(void); static void CB2_LinkTest(void); static void ProcessRecvCmds(u8 id); static void LinkCB_SendHeldKeys(void); static void ResetBlockSend(void); static bool32 InitBlockSend(const void *src, size_t size); static void LinkCB_BlockSendBegin(void); static void LinkCB_BlockSend(void); static void LinkCB_BlockSendEnd(void); static void SetBerryBlenderLinkCallback(void); static void SetBlockReceivedFlag(u8 id); static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size); static void LinkTest_PrintHex(u32 pos, u8 a0, u8 a1, u8 a2); static void LinkCB_RequestPlayerDataExchange(void); static void Task_PrintTestData(u8 taskId); static void LinkCB_ReadyCloseLink(void); static void LinkCB_WaitCloseLink(void); static void LinkCB_Standby(void); static void LinkCB_StandbyForAll(void); static void CheckErrorStatus(void); static void CB2_PrintErrorMessage(void); static void SetWirelessCommType0_Internal(void); static void DisableSerial(void); static void EnableSerial(void); static bool8 IsSioMultiMaster(void); static void CheckMasterOrSlave(void); static void InitTimer(void); static void EnqueueSendCmd(u16 *sendCmd); static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]); static void StartTransfer(void); static bool8 DoHandshake(void); static void DoRecv(void); static void DoSend(void); static void StopTimer(void); static void SendRecvDone(void); static const u16 sWirelessLinkDisplayPal[] = INCBIN_U16("graphics/link/wireless_display.gbapal"); static const u16 sWirelessLinkDisplayGfx[] = INCBIN_U16("graphics/link/wireless_display.4bpp.lz"); static const u16 sWirelessLinkDisplayTilemap[] = INCBIN_U16("graphics/link/wireless_display.bin.lz"); static const u16 sLinkTestFontPal[] = INCBIN_U16("graphics/link/test_font.gbapal"); static const u16 sLinkTestFontGfx[] = INCBIN_U16("graphics/link/test_font.4bpp"); static const struct BlockRequest sBlockRequests[] = { [BLOCK_REQ_SIZE_NONE] = { gBlockSendBuffer, 200 }, [BLOCK_REQ_SIZE_200] = { gBlockSendBuffer, 200 }, [BLOCK_REQ_SIZE_100] = { gBlockSendBuffer, 100 }, [BLOCK_REQ_SIZE_220] = { gBlockSendBuffer, 220 }, [BLOCK_REQ_SIZE_40] = { gBlockSendBuffer, 40 } }; static const char sASCIIGameFreakInc[] = "GameFreak inc."; static const char sASCIITestPrint[] = "TEST PRINT\nP0\nP1\nP2\nP3"; static const struct BgTemplate sLinkErrorBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .priority = 0 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 8, .priority = 1 } }; static const struct WindowTemplate sLinkErrorWindowTemplates[] = { { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 5, .paletteNum = 15, .baseBlock = 0x002 }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 6, .width = 30, .height = 7, .paletteNum = 15, .baseBlock = 0x098 }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 13, .width = 30, .height = 7, .paletteNum = 15, .baseBlock = 0x16A }, DUMMY_WIN_TEMPLATE }; static const u8 sLinkErrorTextColor[] = { 0x00, 0x01, 0x02 }; bool32 IsWirelessAdapterConnected(void) { if (QL_IS_PLAYBACK_STATE) return FALSE; SetWirelessCommType1(); InitRFUAPI(); RfuSetIgnoreError(TRUE); if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) { rfu_REQ_stopMode(); rfu_waitREQComplete(); return TRUE; } SetWirelessCommType0_Internal(); CloseLink(); RestoreSerialTimer3IntrHandlers(); return FALSE; } void Task_DestroySelf(u8 taskId) { DestroyTask(taskId); } void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 baseChar) { LoadPalette(sLinkTestFontPal, BG_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); DmaCopy16(3, sLinkTestFontGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * baseChar), sizeof sLinkTestFontGfx); gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; gLinkTestBGInfo.paletteNum = paletteNum; gLinkTestBGInfo.baseChar = baseChar; switch (bgNum) { case 1: SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock)); break; case 2: SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock)); break; case 3: SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock)); break; } SetGpuReg(REG_OFFSET_BG0HOFS + bgNum * 4, 0); SetGpuReg(REG_OFFSET_BG0VOFS + bgNum * 4, 0); } // Unused static void LoadLinkTestBgGfx(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) { LoadPalette(sLinkTestFontPal, BG_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); DmaCopy16(3, sLinkTestFontGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof sLinkTestFontGfx); gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; gLinkTestBGInfo.paletteNum = paletteNum; gLinkTestBGInfo.baseChar = 0; SetGpuReg(gBGControlRegOffsets[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock)); } // Unused static void LinkTestScreen(void) { int i; ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); SetVBlankCallback(VBlankCB_LinkError); ResetBlockSend(); gLinkType = LINKTYPE_TRADE; OpenLink(); SeedRng(gMain.vblankCounter2); for (i = 0; i < TRAINER_ID_LENGTH; i++) gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256; InitLinkTestBG(0, 2, 4, 0, 0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); CreateTask(Task_DestroySelf, 0); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); sDummy3 = FALSE; InitLocalLinkPlayer(); CreateTask(Task_PrintTestData, 0); SetMainCallback2(CB2_LinkTest); } void SetLocalLinkPlayerId(u8 playerId) { gLocalLinkPlayer.id = playerId; } static void InitLocalLinkPlayer(void) { gLocalLinkPlayer.trainerId = gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24); StringCopy(gLocalLinkPlayer.name, gSaveBlock2Ptr->playerName); gLocalLinkPlayer.gender = gSaveBlock2Ptr->playerGender; gLocalLinkPlayer.linkType = gLinkType; gLocalLinkPlayer.language = gGameLanguage; gLocalLinkPlayer.version = gGameVersion + 0x4000; gLocalLinkPlayer.lp_field_2 = 0x8000; gLocalLinkPlayer.progressFlags = TRUE; //IsNationalPokedexEnabled(); gLocalLinkPlayer.progressFlags |= 0x10; gLocalLinkPlayer.neverRead = gSaveBlock1Ptr->masterTrainerTitle; // should only ever be read by FRLG++ } static void VBlankCB_LinkError(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void InitLink(void) { int i; for (i = 0; i < CMD_LENGTH; i++) gSendCmd[i] = LINKCMD_NONE; sLinkOpen = TRUE; EnableSerial(); } void Task_TriggerHandshake(u8 taskId) { if (++gTasks[taskId].data[0] == 5) { gShouldAdvanceLinkState = 1; DestroyTask(taskId); } } void OpenLink(void) { int i; if (!gWirelessCommType) { ResetSerial(); InitLink(); gLinkCallback = LinkCB_RequestPlayerDataExchange; gLinkVSyncDisabled = FALSE; gLinkErrorOccurred = FALSE; gSuppressLinkErrorMessage = FALSE; ResetBlockReceivedFlags(); ResetBlockSend(); sDummy1 = FALSE; gLinkDummy2 = FALSE; gLinkDummy1 = FALSE; gReadyCloseLinkType = 0; CreateTask(Task_TriggerHandshake, 2); } else { InitRFUAPI(); } gReceivedRemoteLinkPlayers = FALSE; for (i = 0; i < MAX_LINK_PLAYERS; i++) { gRemoteLinkPlayersNotReceived[i] = TRUE; gReadyToCloseLink[i] = FALSE; gReadyToExitStandby[i] = FALSE; } } void CloseLink(void) { gReceivedRemoteLinkPlayers = FALSE; if (gWirelessCommType) LinkRfu_Shutdown(); sLinkOpen = FALSE; DisableSerial(); } static void TestBlockTransfer(u8 unused0, u8 unused1, u8 unused2) { u8 i; u8 status; if (sLinkTestLastBlockSendPos != sBlockSend.pos) { LinkTest_PrintHex(sBlockSend.pos, 2, 3, 2); sLinkTestLastBlockSendPos = sBlockSend.pos; } for (i = 0; i < MAX_LINK_PLAYERS; i++) { if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos) { LinkTest_PrintHex(sBlockRecv[i].pos, 2, i + 4, 2); sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos; } } status = GetBlockReceivedStatus(); if (status == 0xF) // 0b1111 { for (i = 0; i < MAX_LINK_PLAYERS; i++) { if ((status >> i) & 1) { gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(gBlockRecvBuffer[i], sBlockRecv[i].size); ResetBlockReceivedFlag(i); if (gLinkTestBlockChecksums[i] != 0x0342) { sLinkTestDebugValuesEnabled = FALSE; sDummyFlag = FALSE; } } } } } static void LinkTestProcessKeyInput(void) { if (JOY_NEW(A_BUTTON)) gShouldAdvanceLinkState = 1; if (JOY_HELD(B_BUTTON)) InitBlockSend(gHeap + 0x4000, 0x2004); if (JOY_NEW(L_BUTTON)) BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(2, 0, 0)); if (JOY_NEW(START_BUTTON)) SetSuppressLinkErrorMessage(TRUE); if (JOY_NEW(R_BUTTON)) TrySavingData(SAVE_LINK); if (JOY_NEW(SELECT_BUTTON)) SetCloseLinkCallback(); if (sLinkTestDebugValuesEnabled) SetLinkDebugValues(gMain.vblankCounter2, gLinkCallback ? gLinkVSyncDisabled : gLinkVSyncDisabled | 0x10); } static void CB2_LinkTest(void) { LinkTestProcessKeyInput(); TestBlockTransfer(1, 1, 0); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } u16 LinkMain2(const u16 *heldKeys) { u8 i; if (!sLinkOpen) return 0; for (i = 0; i < CMD_LENGTH; i++) gSendCmd[i] = 0; gLinkHeldKeys = *heldKeys; if (gLinkStatus & LINK_STAT_CONN_ESTABLISHED) { ProcessRecvCmds(SIO_MULTI_CNT->id); if (gLinkCallback != NULL) gLinkCallback(); CheckErrorStatus(); } return gLinkStatus; } static void HandleReceiveRemoteLinkPlayer(u8 who) { int i; int count; count = 0; gRemoteLinkPlayersNotReceived[who] = FALSE; for (i = 0; i < GetLinkPlayerCount_2(); i++) count += gRemoteLinkPlayersNotReceived[i]; if (count == 0 && !gReceivedRemoteLinkPlayers) gReceivedRemoteLinkPlayers = TRUE; } static void ProcessRecvCmds(u8 unused) { u16 i; for (i = 0; i < MAX_LINK_PLAYERS; i++) { gLinkPartnersHeldKeys[i] = 0; if (gRecvCmds[i][0] == 0) continue; switch (gRecvCmds[i][0]) { case LINKCMD_SEND_LINK_TYPE: { struct LinkPlayerBlock * block; InitLocalLinkPlayer(); block = &gLocalLinkPlayerBlock; block->linkPlayer = gLocalLinkPlayer; memcpy(block->magic1, sASCIIGameFreakInc, sizeof(block->magic1) - 1); memcpy(block->magic2, sASCIIGameFreakInc, sizeof(block->magic2) - 1); InitBlockSend(block, sizeof(*block)); break; } case LINKCMD_BLENDER_SEND_KEYS: gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; case LINKCMD_DUMMY_1: gLinkDummy2 = TRUE; break; case LINKCMD_DUMMY_2: gLinkDummy2 = TRUE; break; case LINKCMD_INIT_BLOCK: { struct BlockTransfer * blockRecv; blockRecv = &sBlockRecv[i]; blockRecv->pos = 0; blockRecv->size = gRecvCmds[i][1]; blockRecv->multiplayerId = gRecvCmds[i][2]; break; } case LINKCMD_CONT_BLOCK: { if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE) { u16 *buffer; u16 j; buffer = (u16 *)gDecompressionBuffer; for (j = 0; j < CMD_LENGTH - 1; j++) buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1]; } else { u16 j; for (j = 0; j < CMD_LENGTH - 1; j++) gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1]; } sBlockRecv[i].pos += (CMD_LENGTH - 1) * 2; if (sBlockRecv[i].pos >= sBlockRecv[i].size) { if (gRemoteLinkPlayersNotReceived[i] == TRUE) { struct LinkPlayerBlock * block; struct LinkPlayer * linkPlayer; block = (struct LinkPlayerBlock *)&gBlockRecvBuffer[i]; linkPlayer = &gLinkPlayers[i]; *linkPlayer = block->linkPlayer; if ((linkPlayer->version & 0xFF) == VERSION_RUBY || (linkPlayer->version & 0xFF) == VERSION_SAPPHIRE) { linkPlayer->progressFlagsCopy = 0; linkPlayer->neverRead = 0; linkPlayer->progressFlags = 0; } ConvertLinkPlayerName(linkPlayer); if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 || strcmp(block->magic2, sASCIIGameFreakInc) != 0) SetMainCallback2(CB2_LinkError); else HandleReceiveRemoteLinkPlayer(i); } else { SetBlockReceivedFlag(i); } } } break; case LINKCMD_READY_CLOSE_LINK: gReadyToCloseLink[i] = TRUE; break; case LINKCMD_READY_EXIT_STANDBY: gReadyToExitStandby[i] = TRUE; break; case LINKCMD_BLENDER_NO_PBLOCK_SPACE: SetBerryBlenderLinkCallback(); break; case LINKCMD_SEND_BLOCK_REQ: SendBlock(0, sBlockRequests[gRecvCmds[i][1]].address, sBlockRequests[gRecvCmds[i][1]].size); break; case LINKCMD_SEND_HELD_KEYS: gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; } } } void BuildSendCmd(u16 command) { switch (command) { case LINKCMD_SEND_LINK_TYPE: gSendCmd[0] = LINKCMD_SEND_LINK_TYPE; gSendCmd[1] = gLinkType; break; case LINKCMD_READY_EXIT_STANDBY: gSendCmd[0] = LINKCMD_READY_EXIT_STANDBY; break; case LINKCMD_BLENDER_SEND_KEYS: gSendCmd[0] = LINKCMD_BLENDER_SEND_KEYS; gSendCmd[1] = gMain.heldKeys; break; case LINKCMD_DUMMY_1: gSendCmd[0] = LINKCMD_DUMMY_1; break; case LINKCMD_SEND_EMPTY: gSendCmd[0] = LINKCMD_SEND_EMPTY; gSendCmd[1] = 0; break; case LINKCMD_SEND_0xEE: { u8 i; gSendCmd[0] = LINKCMD_SEND_0xEE; for (i = 0; i < 5; i++) gSendCmd[i + 1] = 0xEE; break; } case LINKCMD_INIT_BLOCK: gSendCmd[0] = LINKCMD_INIT_BLOCK; gSendCmd[1] = sBlockSend.size; gSendCmd[2] = sBlockSend.multiplayerId + 0x80; break; case LINKCMD_BLENDER_NO_PBLOCK_SPACE: gSendCmd[0] = LINKCMD_BLENDER_NO_PBLOCK_SPACE; break; case LINKCMD_SEND_ITEM: gSendCmd[0] = LINKCMD_SEND_ITEM; gSendCmd[1] = gSpecialVar_ItemId; break; case LINKCMD_SEND_BLOCK_REQ: gSendCmd[0] = LINKCMD_SEND_BLOCK_REQ; gSendCmd[1] = gBlockRequestType; break; case LINKCMD_READY_CLOSE_LINK: gSendCmd[0] = LINKCMD_READY_CLOSE_LINK; gSendCmd[1] = gReadyCloseLinkType; break; case LINKCMD_DUMMY_2: gSendCmd[0] = LINKCMD_DUMMY_2; break; case LINKCMD_SEND_HELD_KEYS: if (gHeldKeyCodeToSend == 0 || gLinkTransferringData) { break; } gSendCmd[0] = LINKCMD_SEND_HELD_KEYS; gSendCmd[1] = gHeldKeyCodeToSend; break; } } void StartSendingKeysToLink(void) { if (gWirelessCommType) StartSendingKeysToRfu(); gLinkCallback = LinkCB_SendHeldKeys; } bool32 IsSendingKeysToLink(void) { if (gWirelessCommType) return IsSendingKeysToRfu(); if (gLinkCallback == LinkCB_SendHeldKeys) return TRUE; return FALSE; } static void LinkCB_SendHeldKeys(void) { if (gReceivedRemoteLinkPlayers == TRUE) BuildSendCmd(LINKCMD_SEND_HELD_KEYS); } void ClearLinkCallback(void) { gLinkCallback = NULL; } void ClearLinkCallback_2(void) { if (gWirelessCommType) ClearLinkRfuCallback(); else gLinkCallback = NULL; } u8 GetLinkPlayerCount(void) { if (gWirelessCommType) return Rfu_GetLinkPlayerCount(); return EXTRACT_PLAYER_COUNT(gLinkStatus); } void OpenLinkTimed(void) { sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED; sTimeOutCounter = 0; OpenLink(); } u8 GetLinkPlayerDataExchangeStatusTimed(int minPlayers, int maxPlayers) { int i; int count; u32 index; u8 numPlayers; u32 linkType1; u32 linkType2; count = 0; if (gReceivedRemoteLinkPlayers == TRUE) { numPlayers = GetLinkPlayerCount_2(); if (minPlayers > numPlayers || numPlayers > maxPlayers) { sPlayerDataExchangeStatus = EXCHANGE_WRONG_NUM_PLAYERS; return sPlayerDataExchangeStatus; } else { if (GetLinkPlayerCount() == 0) { gLinkErrorOccurred = TRUE; CloseLink(); } for (i = 0, index = 0; i < GetLinkPlayerCount(); index++, i++) { if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType) count++; } if (count == GetLinkPlayerCount()) { if (gLinkPlayers[0].linkType == LINKTYPE_TRADE_SETUP) { switch (GetGameProgressForLinkTrade()) { case TRADE_BOTH_PLAYERS_READY: sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; break; case TRADE_PLAYER_NOT_READY: sPlayerDataExchangeStatus = EXCHANGE_PLAYER_NOT_READY; break; case TRADE_PARTNER_NOT_READY: sPlayerDataExchangeStatus = EXCHANGE_PARTNER_NOT_READY; break; } } else { sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; } } else { sPlayerDataExchangeStatus = EXCHANGE_DIFF_SELECTIONS; } } } else if (++sTimeOutCounter > 600) { sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT; } return sPlayerDataExchangeStatus; } bool8 IsLinkPlayerDataExchangeComplete(void) { u8 i; u8 count; bool8 retval; count = 0; for (i = 0; i < GetLinkPlayerCount(); i++) { if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType) count++; } if (count == GetLinkPlayerCount()) { retval = TRUE; sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; } else { retval = FALSE; sPlayerDataExchangeStatus = EXCHANGE_DIFF_SELECTIONS; } return retval; } u32 GetLinkPlayerTrainerId(u8 who) { return gLinkPlayers[who].trainerId; } void ResetLinkPlayers(void) { int i; for (i = 0; i <= MAX_LINK_PLAYERS; i++) gLinkPlayers[i] = (struct LinkPlayer){}; } static void ResetBlockSend(void) { sBlockSend.active = FALSE; sBlockSend.pos = 0; sBlockSend.size = 0; sBlockSend.src = NULL; } static bool32 InitBlockSend(const void *src, size_t size) { if (sBlockSend.active) return FALSE; sBlockSend.multiplayerId = GetMultiplayerId(); sBlockSend.active = TRUE; sBlockSend.size = size; sBlockSend.pos = 0; if (size > BLOCK_BUFFER_SIZE) { sBlockSend.src = src; } else { if (src != gBlockSendBuffer) memcpy(gBlockSendBuffer, src, size); sBlockSend.src = gBlockSendBuffer; } BuildSendCmd(LINKCMD_INIT_BLOCK); gLinkCallback = LinkCB_BlockSendBegin; sBlockSendDelayCounter = 0; return TRUE; } static void LinkCB_BlockSendBegin(void) { if (++sBlockSendDelayCounter > 2) gLinkCallback = LinkCB_BlockSend; } static void LinkCB_BlockSend(void) { int i; const u8 *src; src = sBlockSend.src; gSendCmd[0] = LINKCMD_CONT_BLOCK; for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i + 1] = (src[sBlockSend.pos + i * 2 + 1] << 8) | src[sBlockSend.pos + i * 2]; sBlockSend.pos += 14; if (sBlockSend.size <= sBlockSend.pos) { sBlockSend.active = FALSE; gLinkCallback = LinkCB_BlockSendEnd; } } static void LinkCB_BlockSendEnd(void) { gLinkCallback = NULL; } static void LinkCB_BerryBlenderSendHeldKeys(void) { GetMultiplayerId(); BuildSendCmd(LINKCMD_BLENDER_SEND_KEYS); gBerryBlenderKeySendAttempts++; } static void SetBerryBlenderLinkCallback(void) { gBerryBlenderKeySendAttempts = 0; gLinkCallback = LinkCB_BerryBlenderSendHeldKeys; } // Unused static u32 GetBerryBlenderKeySendAttempts(void) { return gBerryBlenderKeySendAttempts; } // Unused static void SendBerryBlenderNoSpaceForPokeblocks(void) { BuildSendCmd(LINKCMD_BLENDER_NO_PBLOCK_SPACE); } u8 GetMultiplayerId(void) { if (gWirelessCommType == 1) return Rfu_GetMultiplayerId(); return SIO_MULTI_CNT->id; } u8 BitmaskAllOtherLinkPlayers(void) { u8 mpId; mpId = GetMultiplayerId(); return ((1 << MAX_LINK_PLAYERS) - 1) ^ (1 << mpId); } bool8 SendBlock(u8 unused, const void *src, u16 size) { if (gWirelessCommType == 1) return Rfu_InitBlockSend(src, size); return InitBlockSend(src, size); } bool8 SendBlockRequest(u8 blockRequestType) { if (gWirelessCommType == 1) return Rfu_SendBlockRequest(blockRequestType); if (gLinkCallback == NULL) { gBlockRequestType = blockRequestType; BuildSendCmd(LINKCMD_SEND_BLOCK_REQ); return TRUE; } return FALSE; } bool8 IsLinkTaskFinished(void) { if (gWirelessCommType == 1) return IsLinkRfuTaskFinished(); return gLinkCallback == NULL; } u8 GetBlockReceivedStatus(void) { if (gWirelessCommType == 1) return Rfu_GetBlockReceivedStatus(); return (gBlockReceivedStatus[3] << 3) | (gBlockReceivedStatus[2] << 2) | (gBlockReceivedStatus[1] << 1) | (gBlockReceivedStatus[0] << 0); } static void SetBlockReceivedFlag(u8 who) { if (gWirelessCommType == 1) Rfu_SetBlockReceivedFlag(who); else gBlockReceivedStatus[who] = TRUE; } void ResetBlockReceivedFlags(void) { int i; if (gWirelessCommType == 1) { for (i = 0; i < MAX_RFU_PLAYERS; i++) Rfu_ResetBlockReceivedFlag(i); } else { for (i = 0; i < MAX_LINK_PLAYERS; i++) gBlockReceivedStatus[i] = FALSE; } } void ResetBlockReceivedFlag(u8 who) { if (gWirelessCommType == 1) Rfu_ResetBlockReceivedFlag(who); else if (gBlockReceivedStatus[who]) gBlockReceivedStatus[who] = FALSE; } void CheckShouldAdvanceLinkState(void) { if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1) gShouldAdvanceLinkState = 1; } static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size) { u16 checksum; u16 i; checksum = 0; for (i = 0; i < size / 2; i++) checksum += src[i]; return checksum; } static void LinkTest_PrintNumChar(char val, u8 x, u8 y) { u16 *vAddr; vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); vAddr[y * 32 + x] = (gLinkTestBGInfo.paletteNum << 12) | (val + 1 + gLinkTestBGInfo.baseChar); } static void LinkTest_PrintChar(char val, u8 x, u8 y) { u16 *vAddr; vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); vAddr[y * 32 + x] = (gLinkTestBGInfo.paletteNum << 12) | (val + gLinkTestBGInfo.baseChar); } static void LinkTest_PrintHex(u32 num, u8 x, u8 y, u8 length) { char buff[16]; int i; for (i = 0; i < length; i++) { buff[i] = num & 0xf; num >>= 4; } for (i = length - 1; i >= 0; i--) { LinkTest_PrintNumChar(buff[i], x, y); x++; } } static void LinkTest_PrintString(const char *str, u8 x, u8 y) { int xOffset; int i; int yOffset; yOffset = 0; xOffset = 0; for (i = 0; str[i] != 0; str++) { if (str[i] == *"\n") { yOffset++; xOffset = 0; } else { LinkTest_PrintChar(str[i], x + xOffset, y + yOffset); xOffset++; } } } static void LinkCB_RequestPlayerDataExchange(void) { if (gLinkStatus & LINK_STAT_MASTER) BuildSendCmd(LINKCMD_SEND_LINK_TYPE); gLinkCallback = NULL; } static void Task_PrintTestData(u8 taskId) { char testTitle[32]; int i; strcpy(testTitle, sASCIITestPrint); LinkTest_PrintString(testTitle, 5, 2); LinkTest_PrintHex(gShouldAdvanceLinkState, 2, 1, 2); LinkTest_PrintHex(gLinkStatus, 15, 1, 8); LinkTest_PrintHex(gLink.state, 2, 10, 2); LinkTest_PrintHex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2); LinkTest_PrintHex(GetMultiplayerId(), 15, 12, 2); LinkTest_PrintHex(gLastSendQueueCount, 25, 1, 2); LinkTest_PrintHex(gLastRecvQueueCount, 25, 2, 2); LinkTest_PrintHex(GetBlockReceivedStatus(), 15, 5, 2); LinkTest_PrintHex(gLinkDebugSeed, 2, 12, 8); LinkTest_PrintHex(gLinkDebugFlags, 2, 13, 8); LinkTest_PrintHex(GetSioMultiSI(), 25, 5, 1); LinkTest_PrintHex(IsSioMultiMaster(), 25, 6, 1); LinkTest_PrintHex(IsLinkConnectionEstablished(), 25, 7, 1); LinkTest_PrintHex(HasLinkErrorOccurred(), 25, 8, 1); for (i = 0; i < MAX_LINK_PLAYERS; i++) LinkTest_PrintHex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); } void SetLinkDebugValues(u32 seed, u32 flags) { gLinkDebugSeed = seed; gLinkDebugFlags = flags; } u8 GetSavedLinkPlayerCountAsBitFlags(void) { int i; u8 flags; flags = 0; for (i = 0; i < gSavedLinkPlayerCount; i++) flags |= (1 << i); return flags; } u8 GetLinkPlayerCountAsBitFlags(void) { int i; u8 flags; flags = 0; for (i = 0; i < GetLinkPlayerCount(); i++) flags |= (1 << i); return flags; } void SaveLinkPlayers(u8 numPlayers) { int i; gSavedLinkPlayerCount = numPlayers; gSavedMultiplayerId = GetMultiplayerId(); for (i = 0; i < MAX_RFU_PLAYERS; i++) gSavedLinkPlayers[i] = gLinkPlayers[i]; } // The number of players when trading began. This is frequently compared against the // current number of connected players to check if anyone dropped out. u8 GetSavedPlayerCount(void) { return gSavedLinkPlayerCount; } // Unused static u8 GetSavedMultiplayerId(void) { return gSavedMultiplayerId; } // Unused static bool8 DoesLinkPlayerCountMatchSaved(void) { int i; u32 count = 0; for (i = 0; i < gSavedLinkPlayerCount; i++) { if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId) count++; } if (count == gSavedLinkPlayerCount) return TRUE; return FALSE; } void CheckLinkPlayersMatchSaved(void) { u8 i; for (i = 0; i < gSavedLinkPlayerCount; i++) { if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0) { gLinkErrorOccurred = TRUE; CloseLink(); SetMainCallback2(CB2_LinkError); } } } void ResetLinkPlayerCount(void) { gSavedLinkPlayerCount = 0; gSavedMultiplayerId = 0; } u8 GetLinkPlayerCount_2(void) { return EXTRACT_PLAYER_COUNT(gLinkStatus); } bool8 IsLinkMaster(void) { if (gWirelessCommType) return Rfu_IsMaster(); return EXTRACT_MASTER(gLinkStatus); } // Unused static u8 GetDummy2(void) { return sDummy2; } void SetCloseLinkCallbackAndType(u16 type) { if (gWirelessCommType == 1) { Rfu_SetCloseLinkCallback(); } else { if (gLinkCallback == NULL) { gLinkCallback = LinkCB_ReadyCloseLink; gLinkDummy1 = FALSE; gReadyCloseLinkType = type; } } } void SetCloseLinkCallback(void) { if (gWirelessCommType == 1) { Rfu_SetCloseLinkCallback(); } else { if (gLinkCallback != NULL) { sReadyCloseLinkAttempts++; } else { gLinkCallback = LinkCB_ReadyCloseLink; gLinkDummy1 = FALSE; gReadyCloseLinkType = 0; } } } static void LinkCB_ReadyCloseLink(void) { if (gLastRecvQueueCount == 0) { BuildSendCmd(LINKCMD_READY_CLOSE_LINK); gLinkCallback = LinkCB_WaitCloseLink; } } static void LinkCB_WaitCloseLink(void) { int i; unsigned count; // Wait for all players to be ready u8 linkPlayerCount = GetLinkPlayerCount(); count = 0; for (i = 0; i < linkPlayerCount; i++) { if (gReadyToCloseLink[i]) count++; } if (count == linkPlayerCount) { // All ready, close link gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_IN_BATTLE | 0xFFFF0000); gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; gLinkDummy1 = TRUE; } } void SetLinkStandbyCallback(void) { if (gWirelessCommType == 1) { Rfu_SetLinkStandbyCallback(); } else { if (gLinkCallback == NULL) gLinkCallback = LinkCB_Standby; gLinkDummy1 = FALSE; } } static void LinkCB_Standby(void) { if (gLastRecvQueueCount == 0) { BuildSendCmd(LINKCMD_READY_EXIT_STANDBY); gLinkCallback = LinkCB_StandbyForAll; } } static void LinkCB_StandbyForAll(void) { u8 i; u8 linkPlayerCount = GetLinkPlayerCount(); for (i = 0; i < linkPlayerCount; i++) { if (!gReadyToExitStandby[i]) break; } // If true, all players ready to exit standby if (i == linkPlayerCount) { for (i = 0; i < MAX_LINK_PLAYERS; i++) gReadyToExitStandby[i] = FALSE; gLinkCallback = NULL; } } static void CheckErrorStatus(void) { // Check if a link error has occurred if (sLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus)) { // Link error has occurred, handle message details if // necessary, then stop the link. if (!gSuppressLinkErrorMessage) { sLinkErrorBuffer.status = gLinkStatus; sLinkErrorBuffer.lastRecvQueueCount = gLastRecvQueueCount; sLinkErrorBuffer.lastSendQueueCount = gLastSendQueueCount; SetMainCallback2(CB2_LinkError); } gLinkErrorOccurred = TRUE; CloseLink(); } } void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 isConnectionError) { sLinkErrorBuffer.status = status; sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount; sLinkErrorBuffer.lastRecvQueueCount = lastRecvQueueCount; sLinkErrorBuffer.disconnected = isConnectionError; } void CB2_LinkError(void) { u8 *tilemapBuffer; SetGpuReg(REG_OFFSET_DISPCNT, 0); m4aMPlayStop(&gMPlayInfo_SE1); m4aMPlayStop(&gMPlayInfo_SE2); m4aMPlayStop(&gMPlayInfo_SE3); InitHeap(gHeap, HEAP_SIZE); ResetSpriteData(); FreeAllSpritePalettes(); ResetPaletteFadeControl(); SetBackdropFromColor(RGB_BLACK); ResetTasks(); ScanlineEffect_Stop(); if (gWirelessCommType) { if (!sLinkErrorBuffer.disconnected) gWirelessCommType = 3; ResetLinkRfuGFLayer(); } SetVBlankCallback(VBlankCB_LinkError); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sLinkErrorBgTemplates, ARRAY_COUNT(sLinkErrorBgTemplates)); sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(BG_SCREEN_SIZE); SetBgTilemapBuffer(1, tilemapBuffer); if (InitWindows(sLinkErrorWindowTemplates)) { DeactivateAllTextPrinters(); ResetTempTileDataBuffers(); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON); LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZE_4BPP); gSoftResetDisabled = FALSE; CreateTask(Task_DestroySelf, 0); StopMapMusic(); gMain.callback1 = NULL; RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); SetMainCallback2(CB2_PrintErrorMessage); } } static void ErrorMsg_MoveCloserToPartner(void) { DecompressAndLoadBgGfxUsingHeap(1, sWirelessLinkDisplayGfx, FALSE, 0, 0); CopyToBgTilemapBuffer(1, sWirelessLinkDisplayTilemap, 0, 0); CopyBgTilemapBufferToVram(1); LoadPalette(sWirelessLinkDisplayPal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); FillWindowPixelBuffer(0, PIXEL_FILL(0)); FillWindowPixelBuffer(2, PIXEL_FILL(0)); AddTextPrinterParameterized3(0, FONT_NORMAL_COPY_2, 2, 5, sLinkErrorTextColor, 0, gText_CommErrorEllipsis); AddTextPrinterParameterized3(2, FONT_NORMAL_COPY_2, 2, 2, sLinkErrorTextColor, 0, gText_MoveCloserToLinkPartner); PutWindowTilemap(0); PutWindowTilemap(2); CopyWindowToVram(0, COPYWIN_NONE); // Does nothing CopyWindowToVram(2, COPYWIN_FULL); ShowBg(0); ShowBg(1); } static void ErrorMsg_CheckConnections(void) { FillWindowPixelBuffer(1, PIXEL_FILL(0)); FillWindowPixelBuffer(2, PIXEL_FILL(0)); AddTextPrinterParameterized3(1, FONT_NORMAL_COPY_2, 2, 0, sLinkErrorTextColor, 0, gText_CommErrorCheckConnections); PutWindowTilemap(1); PutWindowTilemap(2); CopyWindowToVram(1, COPYWIN_NONE); // Does nothing CopyWindowToVram(2, COPYWIN_FULL); ShowBg(0); } static void CB2_PrintErrorMessage(void) { switch (gMain.state) { case 0: // Below is only true for the RFU, so the other error // type is inferred to be from a wired connection if (sLinkErrorBuffer.disconnected) ErrorMsg_MoveCloserToPartner(); else ErrorMsg_CheckConnections(); break; case 30: PlaySE(SE_BOO); break; case 60: PlaySE(SE_BOO); break; case 90: PlaySE(SE_BOO); break; case 130: if (gWirelessCommType == 2) AddTextPrinterParameterized3(0, FONT_NORMAL_COPY_2, 2, 20, sLinkErrorTextColor, 0, gText_ABtnTitleScreen); else if (gWirelessCommType == 1) AddTextPrinterParameterized3(0, FONT_NORMAL_COPY_2, 2, 20, sLinkErrorTextColor, 0, gText_ABtnRegistrationCounter); break; } if (gMain.state == 160) { if (gWirelessCommType == 1) { if (JOY_NEW(A_BUTTON)) { HelpSystem_Enable(); PlaySE(SE_PIN); gWirelessCommType = 0; sLinkErrorBuffer.disconnected = 0; ReloadSave(); } } else if (gWirelessCommType == 2) { if (JOY_NEW(A_BUTTON)) { HelpSystem_Enable(); rfu_REQ_stopMode(); rfu_waitREQComplete(); DoSoftReset(); } } } if (gMain.state != 160) gMain.state++; } bool8 GetSioMultiSI(void) { return (REG_SIOCNT & SIO_MULTI_SI) != 0; } static bool8 IsSioMultiMaster(void) { return (REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI); } bool8 IsLinkConnectionEstablished(void) { return EXTRACT_CONN_ESTABLISHED(gLinkStatus); } void SetSuppressLinkErrorMessage(bool8 flag) { gSuppressLinkErrorMessage = flag; } bool8 HasLinkErrorOccurred(void) { return gLinkErrorOccurred; } void LocalLinkPlayerToBlock(void) { struct LinkPlayerBlock * block; InitLocalLinkPlayer(); block = &gLocalLinkPlayerBlock; block->linkPlayer = gLocalLinkPlayer; memcpy(block->magic1, sASCIIGameFreakInc, sizeof(block->magic1) - 1); memcpy(block->magic2, sASCIIGameFreakInc, sizeof(block->magic2) - 1); memcpy(gBlockSendBuffer, block, sizeof(*block)); } void LinkPlayerFromBlock(u32 who) { u8 who_ = who; struct LinkPlayerBlock * block; struct LinkPlayer * player; block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_]; player = &gLinkPlayers[who_]; *player = block->linkPlayer; ConvertLinkPlayerName(player); if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 || strcmp(block->magic2, sASCIIGameFreakInc) != 0) { SetMainCallback2(CB2_LinkError); } } // When this function returns TRUE the callbacks are skipped bool8 HandleLinkConnection(void) { bool32 main1Failed; bool32 main2Failed; if (gWirelessCommType == 0) { gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds); LinkMain2(&gMain.heldKeys); if ((gLinkStatus & LINK_STAT_RECEIVED_NOTHING) && IsSendingKeysOverCable() == TRUE) return TRUE; } else { main1Failed = RfuMain1(); // Always returns FALSE main2Failed = RfuMain2(); if (IsSendingKeysOverCable() == TRUE) { // This will never be reached. // IsSendingKeysOverCable is always FALSE for wireless communication if (main1Failed == TRUE || IsRfuRecvQueueEmpty() || main2Failed) return TRUE; } } return FALSE; } void SetWirelessCommType1(void) { if (!gReceivedRemoteLinkPlayers) gWirelessCommType = 1; } static void SetWirelessCommType0_Internal(void) { if (!gReceivedRemoteLinkPlayers) gWirelessCommType = 0; } // Unused void SetWirelessCommType0(void) { if (!gReceivedRemoteLinkPlayers) gWirelessCommType = 0; } u32 GetLinkRecvQueueLength(void) { if (gWirelessCommType != 0) return GetRfuRecvQueueLength(); return gLink.recvQueue.count; } bool32 IsLinkRecvQueueAtOverworldMax(void) { if (GetLinkRecvQueueLength() >= OVERWORLD_RECV_QUEUE_MAX) return TRUE; return FALSE; } void ConvertLinkPlayerName(struct LinkPlayer * player) { player->progressFlagsCopy = player->progressFlags; // ? Perhaps relocating for a longer name field ConvertInternationalString(player->name, player->language); } // File break? static void DisableSerial(void) { DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); REG_SIOCNT = SIO_MULTI_MODE; REG_TM3CNT_H = 0; REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL; REG_SIOMLT_SEND = 0; REG_SIOMLT_RECV = 0; CpuFill32(0, &gLink, sizeof(gLink)); } static void EnableSerial(void) { DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); REG_RCNT = 0; REG_SIOCNT = SIO_MULTI_MODE; REG_SIOCNT |= SIO_115200_BPS | SIO_INTR_ENABLE; EnableInterrupts(INTR_FLAG_SERIAL); REG_SIOMLT_SEND = 0; CpuFill32(0, &gLink, sizeof(gLink)); sNumVBlanksWithoutSerialIntr = 0; sSendNonzeroCheck = 0; sRecvNonzeroCheck = 0; sChecksumAvailable = 0; sHandshakePlayerCount = 0; gLastSendQueueCount = 0; gLastRecvQueueCount = 0; } void ResetSerial(void) { EnableSerial(); DisableSerial(); } u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENGTH]) { u32 retVal; u32 retVal2; switch (gLink.state) { case LINK_STATE_START0: DisableSerial(); gLink.state = LINK_STATE_START1; break; case LINK_STATE_START1: if (*shouldAdvanceLinkState == 1) { EnableSerial(); gLink.state = LINK_STATE_HANDSHAKE; } break; case LINK_STATE_HANDSHAKE: switch (*shouldAdvanceLinkState) { default: CheckMasterOrSlave(); break; case 1: if (gLink.isMaster == LINK_MASTER && gLink.playerCount > 1) gLink.handshakeAsMaster = TRUE; break; case 2: gLink.state = LINK_STATE_START0; REG_SIOMLT_SEND = 0; break; } break; case LINK_STATE_INIT_TIMER: InitTimer(); gLink.state = LINK_STATE_CONN_ESTABLISHED; // fallthrough case LINK_STATE_CONN_ESTABLISHED: EnqueueSendCmd(sendCmd); DequeueRecvCmds(recvCmds); break; } *shouldAdvanceLinkState = 0; retVal = gLink.localId; retVal |= (gLink.playerCount << LINK_STAT_PLAYER_COUNT_SHIFT); if (gLink.isMaster == LINK_MASTER) { retVal |= LINK_STAT_MASTER; } { u32 receivedNothing = gLink.receivedNothing << LINK_STAT_RECEIVED_NOTHING_SHIFT; u32 link_field_F = gLink.link_field_F << LINK_STAT_UNK_FLAG_9_SHIFT; u32 hardwareError = gLink.hardwareError << LINK_STAT_ERROR_HARDWARE_SHIFT; u32 badChecksum = gLink.badChecksum << LINK_STAT_ERROR_CHECKSUM_SHIFT; u32 queueFull = gLink.queueFull << LINK_STAT_ERROR_QUEUE_FULL_SHIFT; u32 val; if (gLink.state == LINK_STATE_CONN_ESTABLISHED) { val = LINK_STAT_CONN_ESTABLISHED; val |= receivedNothing; val |= retVal; val |= link_field_F; val |= hardwareError; val |= badChecksum; val |= queueFull; } else { val = retVal; val |= receivedNothing; val |= link_field_F; val |= hardwareError; val |= badChecksum; val |= queueFull; } retVal = val; } if (gLink.lag == LAG_MASTER) retVal |= LINK_STAT_ERROR_LAG_MASTER; if (gLink.localId >= MAX_LINK_PLAYERS) retVal |= LINK_STAT_ERROR_INVALID_ID; retVal2 = retVal; if (gLink.lag == LAG_SLAVE) retVal2 |= LINK_STAT_ERROR_LAG_SLAVE; return retVal2; } static void CheckMasterOrSlave(void) { u32 terminals; terminals = *(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI); if (terminals == SIO_MULTI_SD && gLink.localId == 0) gLink.isMaster = LINK_MASTER; else gLink.isMaster = LINK_SLAVE; } static void InitTimer(void) { if (gLink.isMaster) { REG_TM3CNT_L = -197; REG_TM3CNT_H = TIMER_64CLK | TIMER_INTR_ENABLE; EnableInterrupts(INTR_FLAG_TIMER3); } } static void EnqueueSendCmd(u16 *sendCmd) { u8 i; u8 offset; gLinkSavedIme = REG_IME; REG_IME = 0; if (gLink.sendQueue.count < QUEUE_CAPACITY) { offset = gLink.sendQueue.pos + gLink.sendQueue.count; if (offset >= QUEUE_CAPACITY) offset -= QUEUE_CAPACITY; for (i = 0; i < CMD_LENGTH; i++) { sSendNonzeroCheck |= *sendCmd; gLink.sendQueue.data[i][offset] = *sendCmd; *sendCmd = 0; sendCmd++; } } else { gLink.queueFull = QUEUE_FULL_SEND; } if (sSendNonzeroCheck) { gLink.sendQueue.count++; sSendNonzeroCheck = 0; } REG_IME = gLinkSavedIme; gLastSendQueueCount = gLink.sendQueue.count; } static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]) { u8 i; u8 j; gLinkSavedIme = REG_IME; REG_IME = 0; if (gLink.recvQueue.count == 0) { for (i = 0; i < gLink.playerCount; i++) { for (j = 0; j < CMD_LENGTH; j++) recvCmds[i][j] = 0; } gLink.receivedNothing = TRUE; } else { for (i = 0; i < gLink.playerCount; i++) { for (j = 0; j < CMD_LENGTH; j++) recvCmds[i][j] = gLink.recvQueue.data[i][j][gLink.recvQueue.pos]; } gLink.recvQueue.count--; gLink.recvQueue.pos++; if (gLink.recvQueue.pos >= QUEUE_CAPACITY) gLink.recvQueue.pos = 0; gLink.receivedNothing = FALSE; } REG_IME = gLinkSavedIme; } void LinkVSync(void) { if (gLink.isMaster) { switch (gLink.state) { case LINK_STATE_CONN_ESTABLISHED: if (gLink.serialIntrCounter < 9) { if (gLink.hardwareError != TRUE) gLink.lag = LAG_MASTER; else StartTransfer(); } else if (gLink.lag != LAG_MASTER) { gLink.serialIntrCounter = 0; StartTransfer(); } break; case LINK_STATE_HANDSHAKE: StartTransfer(); break; } } else if (gLink.state == LINK_STATE_CONN_ESTABLISHED || gLink.state == LINK_STATE_HANDSHAKE) { if (++sNumVBlanksWithoutSerialIntr > 10) { if (gLink.state == LINK_STATE_CONN_ESTABLISHED) gLink.lag = LAG_SLAVE; if (gLink.state == LINK_STATE_HANDSHAKE) { gLink.playerCount = 0; gLink.link_field_F = FALSE; } } } } void Timer3Intr(void) { StopTimer(); StartTransfer(); } void SerialCB(void) { gLink.localId = SIO_MULTI_CNT->id; switch (gLink.state) { case LINK_STATE_CONN_ESTABLISHED: gLink.hardwareError = SIO_MULTI_CNT->error; DoRecv(); DoSend(); SendRecvDone(); break; case LINK_STATE_HANDSHAKE: if (DoHandshake()) { if (gLink.isMaster) { gLink.state = LINK_STATE_INIT_TIMER; gLink.serialIntrCounter = 8; } else { gLink.state = LINK_STATE_CONN_ESTABLISHED; } } break; } gLink.serialIntrCounter++; sNumVBlanksWithoutSerialIntr = 0; if (gLink.serialIntrCounter == 8) gLastRecvQueueCount = gLink.recvQueue.count; } static void StartTransfer(void) { REG_SIOCNT |= SIO_START; } static bool8 DoHandshake(void) { u8 i; u8 playerCount; u16 minRecv; playerCount = 0; minRecv = 0xFFFF; if (gLink.handshakeAsMaster == TRUE) REG_SIOMLT_SEND = MASTER_HANDSHAKE; else REG_SIOMLT_SEND = SLAVE_HANDSHAKE; *(u64 *)gLink.tempRecvBuffer = REG_SIOMLT_RECV; REG_SIOMLT_RECV = 0; gLink.handshakeAsMaster = FALSE; for (i = 0; i < 4; i++) { if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE) { playerCount++; if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0) minRecv = gLink.tempRecvBuffer[i]; } else { if (gLink.tempRecvBuffer[i] != 0xFFFF) playerCount = 0; break; } } gLink.playerCount = playerCount; if (gLink.playerCount > 1 && gLink.playerCount == sHandshakePlayerCount && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE) return TRUE; if (gLink.playerCount > 1) gLink.link_field_F = (minRecv & 3) + 1; else gLink.link_field_F = 0; sHandshakePlayerCount = gLink.playerCount; return FALSE; } static void DoRecv(void) { u16 recv[4]; u8 i; u8 index; *(u64 *)recv = REG_SIOMLT_RECV; if (gLink.sendCmdIndex == 0) { for (i = 0; i < gLink.playerCount; i++) { if (gLink.checksum != recv[i] && sChecksumAvailable) gLink.badChecksum = TRUE; } gLink.checksum = 0; sChecksumAvailable = TRUE; } else { index = gLink.recvQueue.pos + gLink.recvQueue.count; if (index >= QUEUE_CAPACITY) index -= QUEUE_CAPACITY; if (gLink.recvQueue.count < QUEUE_CAPACITY) { for (i = 0; i < gLink.playerCount; i++) { gLink.checksum += recv[i]; sRecvNonzeroCheck |= recv[i]; gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recv[i]; } } else { gLink.queueFull = QUEUE_FULL_RECV; } gLink.recvCmdIndex++; if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck) { gLink.recvQueue.count++; sRecvNonzeroCheck = 0; } } } static void DoSend(void) { if (gLink.sendCmdIndex == CMD_LENGTH) { REG_SIOMLT_SEND = gLink.checksum; if (!sSendBufferEmpty) { gLink.sendQueue.count--; gLink.sendQueue.pos++; if (gLink.sendQueue.pos >= QUEUE_CAPACITY) gLink.sendQueue.pos = 0; } else { sSendBufferEmpty = FALSE; } } else { if (!sSendBufferEmpty && gLink.sendQueue.count == 0) sSendBufferEmpty = TRUE; if (sSendBufferEmpty) REG_SIOMLT_SEND = 0; else REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos]; gLink.sendCmdIndex++; } } static void StopTimer(void) { if (gLink.isMaster) { REG_TM3CNT_H &= ~TIMER_ENABLE; REG_TM3CNT_L = -197; } } static void SendRecvDone(void) { if (gLink.recvCmdIndex == CMD_LENGTH) { gLink.sendCmdIndex = 0; gLink.recvCmdIndex = 0; } else if (gLink.isMaster) { REG_TM3CNT_H |= TIMER_ENABLE; } } void ResetSendBuffer(void) { u8 i; u8 j; gLink.sendQueue.count = 0; gLink.sendQueue.pos = 0; for (i = 0; i < CMD_LENGTH; i++) { for (j = 0; j < QUEUE_CAPACITY; j++) gLink.sendQueue.data[i][j] = LINKCMD_NONE; } } void ResetRecvBuffer(void) { u8 i; u8 j; u8 k; gLink.recvQueue.count = 0; gLink.recvQueue.pos = 0; for (i = 0; i < MAX_LINK_PLAYERS; i++) { for (j = 0; j < CMD_LENGTH; j++) { for (k = 0; k < QUEUE_CAPACITY; k++) gLink.recvQueue.data[i][j][k] = LINKCMD_NONE; } } } ================================================ FILE: src/link_rfu_2.c ================================================ #include "global.h" #include "gflib.h" #include "librfu.h" #include "battle.h" #include "link.h" #include "link_rfu.h" #include "mystery_gift_menu.h" #include "overworld.h" #include "quest_log.h" #include "random.h" #include "task.h" #include "constants/union_room.h" enum { RFUSTATE_INIT, RFUSTATE_INIT_END, RFUSTATE_PARENT_CONNECT, RFUSTATE_PARENT_CONNECT_END, RFUSTATE_STOP_MANAGER, RFUSTATE_STOP_MANAGER_END, RFUSTATE_CHILD_CONNECT, RFUSTATE_CHILD_CONNECT_END, RFUSTATE_UNUSED, RFUSTATE_RECONNECTED, RFUSTATE_CONNECTED, RFUSTATE_CHILD_TRY_JOIN, RFUSTATE_CHILD_JOINED, RFUSTATE_UR_PLAYER_EXCHANGE, RFUSTATE_UR_STOP_MANAGER, RFUSTATE_UR_STOP_MANAGER_END, RFUSTATE_UR_FINALIZE, }; // These states are used for different purposes // depending on the link mode (parent, child, union room) #define RFUSTATE_PARENT_FINALIZE_START 17 #define RFUSTATE_PARENT_FINALIZE 18 #define RFUSTATE_UR_CONNECT 17 #define RFUSTATE_UR_CONNECT_END 18 #define RFUSTATE_FINALIZED 20 // States for the 'receiving' field of RfuBlockSend enum { RECV_STATE_READY, RECV_STATE_RECEIVING, RECV_STATE_FINISHED, }; struct SioInfo { char magic[sizeof("PokemonSioInfo")]; u8 playerCount; u8 linkPlayerIdx[RFU_CHILD_MAX]; struct LinkPlayer linkPlayers[MAX_RFU_PLAYERS]; u8 filler[92]; }; struct RfuDebug { u8 unused0[6]; u16 recvCount; u8 unused1[6]; vu8 unkFlag; bool8 childJoined; u8 unused2[84]; u16 blockSendFailures; u8 unused3[29]; u8 blockSendTime; u8 unused4[88]; }; static EWRAM_DATA INIT_PARAM sRfuReqConfig = {}; static EWRAM_DATA struct RfuDebug sRfuDebug = {}; static u32 sRfuAPIBuffer[RFU_API_BUFF_SIZE_RAM / 4]; static u8 sResendBlock8[CMD_LENGTH * 2]; static u16 sResendBlock16[CMD_LENGTH]; struct RfuGameData gHostRfuGameData; struct RfuManager gRfu; u8 gHostRfuUsername[PLAYER_NAME_LENGTH + 1]; static void InitChildRecvBuffers(void); static void InitParentSendData(void); static void MscCallback_Child(u16 REQ_commandID); static void MSCCallback_Parent(u16 REQ_commandID); static void UpdateBackupQueue(void); static void RfuHandleReceiveCommand(u8 unused); static void ResetSendDataManager(struct RfuBlockSend *data); static void RfuPrepareSendBuffer(u16 command); static void HandleBlockSend(void); static void SendNextBlock(void); static void SendLastBlock(void); static void CallRfuFunc(void); static void UpdateChildStatuses(void); static s32 GetJoinGroupStatus(void); static void Task_PlayerExchange(u8 taskId); static void ClearSelectedLinkPlayerIds(u16 disconnectMask); static void ValidateAndReceivePokemonSioInfo(void *recvBuffer); static void Task_PlayerExchangeUpdate(u8 taskId); static void Task_PlayerExchangeChat(u8 taskId); static void RfuSetErrorParams(u32 errorInfo); static void ParentResetChildRecvMetadata(s32 slot); static void CB2_RfuIdle(void); static u8 GetPartnerIndexByNameAndTrainerID(const u8 *trainerName, u16 trainerId); static void RfuReqDisconnectSlot(u32 bmDisconnectSlot); static void SendDisconnectCommand(u32 playersToDisconnect, u32 disconnectMode); static void Task_TryConnectToUnionRoomParent(u8 taskId); static void Debug_PrintEmpty(void); static void Task_Idle(u8 taskId); static const INIT_PARAM sRfuReqConfigTemplate = { .maxMFrame = 4, .MC_TimerCount = 32, .availSlot_flag = 0, .mboot_flag = 0, .serialNo = RFU_SERIAL_GAME, .gameName = (void *)&gHostRfuGameData, .userName = gHostRfuUsername, .fastSearchParent_flag = TRUE, .linkRecovery_enable = FALSE, .linkRecovery_period = 600, .NI_failCounter_limit = 300 }; static const u8 sAvailSlots[] = { [1] = AVAIL_SLOT1, [2] = AVAIL_SLOT2, [3] = AVAIL_SLOT3, [4] = AVAIL_SLOT4 }; #define BLOCK_MASK(bitNum)((1 << (bitNum)) - 1) static const u32 sAllBlocksReceived[] = { BLOCK_MASK(0), BLOCK_MASK(1), BLOCK_MASK(2), BLOCK_MASK(3), BLOCK_MASK(4), BLOCK_MASK(5), BLOCK_MASK(6), BLOCK_MASK(7), BLOCK_MASK(8), BLOCK_MASK(9), BLOCK_MASK(10), BLOCK_MASK(11), BLOCK_MASK(12), BLOCK_MASK(13), BLOCK_MASK(14), BLOCK_MASK(15), BLOCK_MASK(16), BLOCK_MASK(17), BLOCK_MASK(18), BLOCK_MASK(19), BLOCK_MASK(20), BLOCK_MASK(21), BLOCK_MASK(22), BLOCK_MASK(23), BLOCK_MASK(24), }; #undef BLOCK_MASK static const u8 sSlotToLinkPlayerTableId[] = { 0, 0, 1, 1, 2, 2, 2, 2, 3 }; // Effectively just returns the number of bits set in the index value // Used for masks of the other players, MAX_RFU_PLAYERS - 1 excludes self static const u8 sPlayerBitsToCount[1 << (MAX_RFU_PLAYERS - 1)] = { 0, // 0000 1, // 0001 1, // 0010 2, // 0011 1, // 0100 2, // 0101 2, // 0110 3, // 0111 1, // 1000 2, // 1001 2, // 1010 3, // 1011 2, // 1100 3, // 1101 3, // 1110 4 // 1111 }; // If the 4 bits representing child slots were an array, this table // would return the index of the most recently set bit static const u8 sPlayerBitsToNewChildIdx[1 << (MAX_RFU_PLAYERS - 1)] = { 0, // 0000 0, // 0001 1, // 0010 0, // 0011 2, // 0100 0, // 0101 1, // 0110 0, // 0111 3, // 1000 0, // 1001 1, // 1010 0, // 1011 2, // 1100 0, // 1101 1, // 1110 0 // 1111 }; static const struct BlockRequest sBlockRequests[] = { [BLOCK_REQ_SIZE_NONE] = { gBlockSendBuffer, 200 }, [BLOCK_REQ_SIZE_200] = { gBlockSendBuffer, 200 }, [BLOCK_REQ_SIZE_100] = { gBlockSendBuffer, 100 }, [BLOCK_REQ_SIZE_220] = { gBlockSendBuffer, 220 }, [BLOCK_REQ_SIZE_40] = { gBlockSendBuffer, 40 } }; static const u16 sAcceptedSerialNos[] = { RFU_SERIAL_GAME, RFU_SERIAL_WONDER_DISTRIBUTOR, RFU_SERIAL_END }; static const char sASCII_RfuCmds[][15] = { "RFU WAIT", "RFU BOOT", "RFU ERROR", "RFU RESET", "RFU CONFIG", "RFU START", "RFU SC POLL", "RFU SP POLL", "RFU START", "RFU SEND ERR", "RFU CP POLL" }; static const char sASCII_RecoverCmds[][16] = { " ", "RECOVER START ", "DISSCONECT ", "RECOVER SUUSES", "RECOVER FAILED" }; // List of additional tasks to destroy (if active) when the RFU shuts down static const TaskFunc sShutdownTasks[] = { Task_PlayerExchange, Task_PlayerExchangeUpdate, Task_PlayerExchangeChat }; static void Debug_PrintString(const void *string, u8 x, u8 y) { } static void Debug_PrintNum(u16 num, u8 x, u8 y, u8 numDigits) { } void ResetLinkRfuGFLayer(void) { s32 i; u8 errorState = gRfu.errorState; CpuFill16(0, &gRfu, sizeof gRfu); gRfu.parentChild = MODE_NEUTRAL; gRfu.errorState = errorState; if (gRfu.errorState != RFU_ERROR_STATE_IGNORE) gRfu.errorState = RFU_ERROR_STATE_NONE; for (i = 0; i < MAX_RFU_PLAYERS; i++) ResetSendDataManager(&gRfu.recvBlock[i]); ResetSendDataManager(&gRfu.sendBlock); RfuRecvQueue_Reset(&gRfu.recvQueue); RfuSendQueue_Reset(&gRfu.sendQueue); CpuFill16(0, gSendCmd, sizeof gSendCmd); CpuFill16(0, gRecvCmds, sizeof gRecvCmds); CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers); } void InitRFU(void) { IntrFunc serialIntr = gIntrTable[1]; IntrFunc timerIntr = gIntrTable[2]; InitRFUAPI(); rfu_REQ_stopMode(); rfu_waitREQComplete(); REG_IME = 0; gIntrTable[1] = serialIntr; gIntrTable[2] = timerIntr; REG_IME = INTR_FLAG_VBLANK; } void InitRFUAPI(void) { if (!rfu_initializeAPI(sRfuAPIBuffer, RFU_API_BUFF_SIZE_RAM, &gIntrTable[1], TRUE)) { gLinkType = 0; // ClearSavedLinkPlayers(); // Em fix RfuSetIgnoreError(FALSE); ResetLinkRfuGFLayer(); rfu_setTimerInterrupt(3, &gIntrTable[2]); } } static void Task_ParentSearchForChildren(u8 taskId) { UpdateChildStatuses(); switch (gRfu.state) { case RFUSTATE_INIT: rfu_LMAN_initializeRFU(&sRfuReqConfig); gRfu.state = RFUSTATE_INIT_END; gTasks[taskId].data[1] = 1; break; case RFUSTATE_INIT_END: break; case RFUSTATE_PARENT_CONNECT: rfu_LMAN_establishConnection(gRfu.parentChild, 0, 240, (u16 *)sAcceptedSerialNos); gRfu.state = RFUSTATE_PARENT_CONNECT_END; gTasks[taskId].data[1] = 6; break; case RFUSTATE_PARENT_CONNECT_END: break; case RFUSTATE_STOP_MANAGER: rfu_LMAN_stopManager(FALSE); gRfu.state = RFUSTATE_STOP_MANAGER_END; break; case RFUSTATE_STOP_MANAGER_END: break; case RFUSTATE_PARENT_FINALIZE: gRfu.parentFinished = FALSE; rfu_LMAN_setMSCCallback(MSCCallback_Parent); InitChildRecvBuffers(); InitParentSendData(); gRfu.state = RFUSTATE_FINALIZED; gTasks[taskId].data[1] = 8; CreateTask(Task_PlayerExchange, 5); DestroyTask(taskId); break; } } static u8 Rfu_GetIndexOfNewestChild(u8 bits) { return sPlayerBitsToNewChildIdx[bits]; } static void SetLinkPlayerIdsFromSlots(s32 baseSlots, s32 addSlots) { u8 i; u8 baseId = 1; s32 baseSlotsCopy = baseSlots; s32 newId = 0; if (addSlots == -1) { // Initialize for (i = 0; i < RFU_CHILD_MAX; baseSlots >>= 1, i++) { if (baseSlots & 1) { gRfu.linkPlayerIdx[i] = baseId; baseId++; } } } else { // Clear id for any empty slot for (i = 0; i < RFU_CHILD_MAX; baseSlotsCopy >>= 1, i++) { if (!(baseSlotsCopy & 1)) gRfu.linkPlayerIdx[i] = 0; } // Get starting id by checking existing slots for (baseId = RFU_CHILD_MAX; baseId != 0; baseId--) { for (i = 0; i < RFU_CHILD_MAX && gRfu.linkPlayerIdx[i] != baseId; i++) ; if (i == RFU_CHILD_MAX) newId = baseId; } // Set id for new slots for (addSlots &= ~baseSlots, i = 0; i < RFU_CHILD_MAX; addSlots >>= 1, i++) { if (addSlots & 1) gRfu.linkPlayerIdx[i] = newId++; } } } static void Task_ChildSearchForParent(u8 taskId) { switch (gRfu.state) { case RFUSTATE_INIT: rfu_LMAN_initializeRFU((INIT_PARAM*)&sRfuReqConfigTemplate); gRfu.state = RFUSTATE_INIT_END; gTasks[taskId].data[1] = 1; break; case RFUSTATE_INIT_END: break; case RFUSTATE_CHILD_CONNECT: rfu_LMAN_establishConnection(gRfu.parentChild, 0, 240, (u16 *)sAcceptedSerialNos); gRfu.state = RFUSTATE_CHILD_CONNECT_END; gTasks[taskId].data[1] = 7; break; case RFUSTATE_CHILD_CONNECT_END: break; case RFUSTATE_RECONNECTED: gTasks[taskId].data[1] = 10; break; case RFUSTATE_CHILD_TRY_JOIN: switch (GetJoinGroupStatus()) { case RFU_STATUS_JOIN_GROUP_OK: gRfu.state = RFUSTATE_CHILD_JOINED; break; case RFU_STATUS_JOIN_GROUP_NO: case RFU_STATUS_LEAVE_GROUP: rfu_LMAN_requestChangeAgbClockMaster(); gRfu.disconnectMode = RFU_DISCONNECT_NORMAL; DestroyTask(taskId); break; } break; case RFUSTATE_CHILD_JOINED: { u8 bmChildSlot = 1 << gRfu.childSlot; rfu_clearSlot(TYPE_NI_SEND | TYPE_NI_RECV, gRfu.childSlot); rfu_setRecvBuffer(TYPE_UNI, gRfu.childSlot, gRfu.childRecvQueue, sizeof(gRfu.childRecvQueue)); rfu_UNI_setSendData(bmChildSlot, gRfu.childSendBuffer, sizeof(gRfu.childSendBuffer)); gTasks[taskId].data[1] = 8; DestroyTask(taskId); if (!sRfuDebug.childJoined) { Debug_PrintEmpty(); sRfuDebug.childJoined++; } CreateTask(Task_PlayerExchange, 5); break; } } } static void InitChildRecvBuffers(void) { u8 i; u8 acceptSlot = lman.acceptSlot_flag; for (i = 0; i < RFU_CHILD_MAX; i++) { if (acceptSlot & 1) { rfu_setRecvBuffer(TYPE_UNI, i, gRfu.childRecvBuffer[i], sizeof(gRfu.childRecvBuffer[i])); rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, i); } acceptSlot >>= 1; } } static void InitParentSendData(void) { u8 acceptSlot = lman.acceptSlot_flag; rfu_UNI_setSendData(acceptSlot, gRfu.recvCmds, sizeof(gRfu.recvCmds)); gRfu.parentSendSlot = Rfu_GetIndexOfNewestChild(acceptSlot); gRfu.parentSlots = acceptSlot; SetLinkPlayerIdsFromSlots(acceptSlot, -1); gRfu.parentChild = MODE_PARENT; } #define tConnectingForChat data[7] static void Task_UnionRoomListen(u8 taskId) { if (GetHostRfuGameData()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM) && RfuGetStatus() == RFU_STATUS_NEW_CHILD_DETECTED) { rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); RfuSetStatus(RFU_STATUS_OK, 0); } switch (gRfu.state) { case RFUSTATE_INIT: rfu_LMAN_initializeRFU(&sRfuReqConfig); gRfu.state = RFUSTATE_INIT_END; gTasks[taskId].data[1] = 1; break; case RFUSTATE_INIT_END: break; case RFUSTATE_UR_CONNECT: rfu_LMAN_establishConnection(MODE_P_C_SWITCH, 0, 240, (u16 *)sAcceptedSerialNos); rfu_LMAN_setMSCCallback(MscCallback_Child); gRfu.state = RFUSTATE_UR_CONNECT_END; break; case RFUSTATE_UR_CONNECT_END: break; case RFUSTATE_UR_PLAYER_EXCHANGE: if (rfu_UNI_setSendData(1 << gRfu.childSlot, gRfu.childSendBuffer, sizeof(gRfu.childSendBuffer)) == 0) { gRfu.parentChild = MODE_CHILD; DestroyTask(taskId); if (gTasks[taskId].tConnectingForChat) CreateTask(Task_PlayerExchangeChat, 1); else CreateTask(Task_PlayerExchange, 5); } break; case RFUSTATE_UR_STOP_MANAGER: rfu_LMAN_stopManager(FALSE); gRfu.state = RFUSTATE_UR_STOP_MANAGER_END; break; case RFUSTATE_UR_STOP_MANAGER_END: break; case RFUSTATE_UR_FINALIZE: gRfu.parentFinished = FALSE; rfu_LMAN_setMSCCallback(MSCCallback_Parent); UpdateGameData_GroupLockedIn(TRUE); InitChildRecvBuffers(); InitParentSendData(); gRfu.state = RFUSTATE_FINALIZED; gTasks[taskId].data[1] = 8; gRfu.parentChild = MODE_PARENT; CreateTask(Task_PlayerExchange, 5); gRfu.playerExchangeActive = TRUE; DestroyTask(taskId); break; } } void LinkRfu_CreateConnectionAsParent(void) { rfu_LMAN_establishConnection(MODE_PARENT, 0, 240, (u16 *)sAcceptedSerialNos); } void LinkRfu_StopManagerBeforeEnteringChat(void) { rfu_LMAN_stopManager(FALSE); } // Argument is provided by the RFU and is unused. static void MscCallback_Child(u16 REQ_commandID) { s32 i; for (i = 0; i < COMM_SLOT_LENGTH; i++) gRfu.childSendBuffer[i] = 0; rfu_REQ_recvData(); rfu_waitREQComplete(); if (gRfuSlotStatusUNI[gRfu.childSlot]->recv.newDataFlag) { gRfu.childSendCount++; RfuRecvQueue_Enqueue(&gRfu.recvQueue, gRfu.childRecvQueue); sRfuDebug.recvCount++; UpdateBackupQueue(); rfu_UNI_readySendData(gRfu.childSlot); rfu_UNI_clearRecvNewDataFlag(gRfu.childSlot); } rfu_LMAN_REQ_sendData(TRUE); } // Argument is provided by the RFU and is unused. static void MSCCallback_Parent(u16 REQ_commandID) { gRfu.parentFinished = TRUE; } void LinkRfu_Shutdown(void) { u8 i; if (QL_IS_PLAYBACK_STATE) return; rfu_LMAN_powerDownRFU(); if (gRfu.parentChild == MODE_PARENT) { // Stop parent searching for children if (FuncIsActiveTask(Task_ParentSearchForChildren) == TRUE) { DestroyTask(gRfu.searchTaskId); ResetLinkRfuGFLayer(); } } else if (gRfu.parentChild == MODE_CHILD) { // Stop child searching for parent if (FuncIsActiveTask(Task_ChildSearchForParent) == TRUE) { DestroyTask(gRfu.searchTaskId); ResetLinkRfuGFLayer(); } } else if (gRfu.parentChild == MODE_P_C_SWITCH) { // Stop parent-child switching mode (union room) if (FuncIsActiveTask(Task_UnionRoomListen) == TRUE) { DestroyTask(gRfu.searchTaskId); ResetLinkRfuGFLayer(); } } // Destroy additional tasks for (i = 0; i < ARRAY_COUNT(sShutdownTasks); i++) { if (FuncIsActiveTask(sShutdownTasks[i]) == TRUE) DestroyTask(FindTaskIdByFunc(sShutdownTasks[i])); } } static void CreateTask_ParentSearchForChildren(void) { if (QL_IS_PLAYBACK_STATE) return; gRfu.searchTaskId = CreateTask(Task_ParentSearchForChildren, 1); } // If no parent ID (or if child connection not ready) can't reconnect with parent yet static bool8 CanTryReconnectParent(void) { if (gRfu.state == RFUSTATE_CHILD_CONNECT_END && gRfu.parentId) return TRUE; return FALSE; } static bool32 TryReconnectParent(void) { if (gRfu.state == RFUSTATE_CHILD_CONNECT_END && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[gRfu.reconnectParentId].id, 240)) { gRfu.state = RFUSTATE_RECONNECTED; return TRUE; } return FALSE; } static void CreateTask_ChildSearchForParent(void) { if (QL_IS_PLAYBACK_STATE) return; gRfu.searchTaskId = CreateTask(Task_ChildSearchForParent, 1); } bool8 LmanAcceptSlotFlagIsNotZero(void) { if (lman.acceptSlot_flag) return TRUE; return FALSE; } void LinkRfu_StopManagerAndFinalizeSlots(void) { gRfu.state = RFUSTATE_STOP_MANAGER; gRfu.acceptSlot_flag = lman.acceptSlot_flag; } bool32 WaitRfuState(bool32 force) { if (gRfu.state == RFUSTATE_PARENT_FINALIZE_START || force) { gRfu.state = RFUSTATE_PARENT_FINALIZE; return TRUE; } return FALSE; } void StopUnionRoomLinkManager(void) { gRfu.state = RFUSTATE_UR_STOP_MANAGER; } // Unused static void ReadySendDataForSlots(u8 slots) { u8 i; for (i = 0; i < RFU_CHILD_MAX; i++) { if (slots & 1) { rfu_UNI_readySendData(i); break; } slots >>= 1; } } static void ReadAllPlayerRecvCmds(void) { s32 i, j; for (i = 0; i < MAX_RFU_PLAYERS; i++) { struct RfuManager *ptr = &gRfu; for (j = 0; j < CMD_LENGTH - 1; j++) { ptr->recvCmds[i][j][1] = gRecvCmds[i][j] >> 8; ptr->recvCmds[i][j][0] = gRecvCmds[i][j]; } } CpuFill16(0, gRecvCmds, sizeof gRecvCmds); } static void MoveSendCmdToRecv(void) { s32 i; for (i = 0; i < CMD_LENGTH - 1; i++) gRecvCmds[0][i] = gSendCmd[i]; for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i] = 0; } static void UpdateBackupQueue(void) { if (gRfu.linkRecovered) { bool8 backupEmpty = RfuBackupQueue_Dequeue(&gRfu.backupQueue, gRfu.childSendBuffer); if (gRfu.backupQueue.count == 0) gRfu.linkRecovered = FALSE; if (backupEmpty) return; } if (!gRfu.linkRecovered) { RfuSendQueue_Dequeue(&gRfu.sendQueue, gRfu.childSendBuffer); RfuBackupQueue_Enqueue(&gRfu.backupQueue, gRfu.childSendBuffer); } } bool32 IsRfuRecvQueueEmpty(void) { s32 i; s32 j; if (gRfuLinkStatus->sendSlotUNIFlag == 0) return FALSE; for (i = 0; i < MAX_RFU_PLAYERS; i++) for (j = 0; j < CMD_LENGTH - 1; j++) if (gRecvCmds[i][j] != 0) return FALSE; return TRUE; } static bool32 RfuMain1_Parent(void) { if (gRfu.state < RFUSTATE_FINALIZED) { rfu_REQ_recvData(); rfu_waitREQComplete(); rfu_LMAN_REQ_sendData(FALSE); } else { gRfu.parentFinished = FALSE; if ((gRfu.parentSlots & gRfuLinkStatus->connSlotFlag) == gRfu.parentSlots && (gRfu.parentSlots & gRfuLinkStatus->connSlotFlag)) { if (!gRfu.parentMain2Failed) { if (gRfu.disconnectSlots) { RfuReqDisconnectSlot(gRfu.disconnectSlots); gRfu.disconnectSlots = 0; if (gRfu.disconnectMode == RFU_DISCONNECT_ERROR) { RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_8); RfuSetErrorParams(F_RFU_ERROR_8); return FALSE; } if (!lman.acceptSlot_flag) { LinkRfu_Shutdown(); gReceivedRemoteLinkPlayers = FALSE; return FALSE; } } ReadAllPlayerRecvCmds(); rfu_UNI_readySendData(gRfu.parentSendSlot); rfu_LMAN_REQ_sendData(TRUE); } else { rfu_REQ_PARENT_resumeRetransmitAndChange(); } gRfu.runParentMain2 = TRUE; } } return FALSE; } static bool32 RfuMain2_Parent(void) { u16 i; u16 flags; u8 r0; u16 j; bool8 failed; if (gRfu.state >= RFUSTATE_FINALIZED && gRfu.runParentMain2 == TRUE) { rfu_waitREQComplete(); while (!gRfu.parentFinished) { if (gRfu.errorState != RFU_ERROR_STATE_NONE) return FALSE; } rfu_REQ_recvData(); rfu_waitREQComplete(); if ((lman.parentAck_flag & gRfu.parentSlots) == gRfu.parentSlots) { gRfu.parentMain2Failed = FALSE; sRfuDebug.recvCount++; flags = lman.acceptSlot_flag; for (i = 0; i < RFU_CHILD_MAX; i++) { if (flags & 1) { if (gRfu.childRecvBuffer[i][1]) { if (gRfu.childRecvIds[i] != 0xFF && (gRfu.childRecvBuffer[i][0] >> 5) != ((gRfu.childRecvIds[i] + 1) & 7)) { if (++gRfu.numChildRecvErrors[i] > 4) RfuSetErrorParams(F_RFU_ERROR_8 | F_RFU_ERROR_1); } else { gRfu.childRecvIds[i] = gRfu.childRecvBuffer[i][0] / 32; gRfu.numChildRecvErrors[i] = 0; gRfu.childRecvBuffer[i][0] &= 0x1f; r0 = gRfu.linkPlayerIdx[i]; for (j = 0; j < CMD_LENGTH - 1; j++) { gRecvCmds[r0][j] = (gRfu.childRecvBuffer[i][(j << 1) + 1] << 8) | gRfu.childRecvBuffer[i][(j << 1) + 0]; gRfu.childRecvBuffer[i][(j << 1) + 1] = 0; gRfu.childRecvBuffer[i][(j << 1) + 0] = 0; } } } rfu_UNI_clearRecvNewDataFlag(i); } flags >>= 1; } MoveSendCmdToRecv(); RfuHandleReceiveCommand(0); CallRfuFunc(); if (gRfu.nextChildBits && !gRfu.stopNewConnections) { sRfuDebug.unkFlag = FALSE; rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, gRfu.parentSendSlot); for (i = 0; i < RFU_CHILD_MAX; i++) { if ((gRfu.nextChildBits >> i) & 1) rfu_setRecvBuffer(TYPE_UNI, i, gRfu.childRecvBuffer[i], sizeof(gRfu.childRecvBuffer[i])); } SetLinkPlayerIdsFromSlots(gRfu.parentSlots, gRfu.parentSlots | gRfu.nextChildBits); gRfu.incomingChild = gRfu.nextChildBits; gRfu.parentSlots |= gRfu.nextChildBits; gRfu.nextChildBits = 0; rfu_UNI_setSendData(gRfu.parentSlots, gRfu.recvCmds, sizeof(gRfu.recvCmds)); gRfu.parentSendSlot = Rfu_GetIndexOfNewestChild(gRfu.parentSlots); CreateTask(Task_PlayerExchangeUpdate, 0); } } else { gRfu.parentMain2Failed = TRUE; gRfu.runParentMain2 = FALSE; } gRfu.runParentMain2 = FALSE; } failed = gRfu.parentMain2Failed; return gRfuLinkStatus->sendSlotUNIFlag ? failed & 1 : FALSE; } static void ChildBuildSendCmd(u16 *sendCmd, u8 *dst) { s32 i; if (sendCmd[0]) { sendCmd[0] |= (gRfu.childSendCmdId << 5); gRfu.childSendCmdId = (gRfu.childSendCmdId + 1) & 7; for (i = 0; i < CMD_LENGTH - 1; i++) { dst[2 * i + 1] = sendCmd[i] >> 8; dst[2 * i + 0] = sendCmd[i]; } } else { for (i = 0; i < 2 * (CMD_LENGTH - 1); i++) dst[i] = 0; } } static bool32 RfuMain1_Child(void) { u8 i; u8 j; u8 recvBuf[MAX_RFU_PLAYERS * (2 * (CMD_LENGTH - 1))]; u8 sendBuf[2 * (CMD_LENGTH - 1)]; u8 status; RfuRecvQueue_Dequeue(&gRfu.recvQueue, recvBuf); for (i = 0; i < MAX_RFU_PLAYERS; i++) { for (j = 0; j < CMD_LENGTH - 1; j++) { gRecvCmds[i][j] = (recvBuf[i * COMM_SLOT_LENGTH + (j * 2) + 1] << 8) | recvBuf[i * COMM_SLOT_LENGTH + (j * 2) + 0]; } } RfuHandleReceiveCommand(0); if (lman.childClockSlave_flag == 0 && gRfu.disconnectMode != RFU_DISCONNECT_NONE) { rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); rfu_waitREQComplete(); status = RfuGetStatus(); if (status != RFU_STATUS_FATAL_ERROR && status != RFU_STATUS_JOIN_GROUP_NO && status != RFU_STATUS_LEAVE_GROUP) RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_8); rfu_clearAllSlot(); gReceivedRemoteLinkPlayers = FALSE; gRfu.callback = NULL; if (gRfu.disconnectMode == RFU_DISCONNECT_ERROR) { RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_8); RfuSetErrorParams(F_RFU_ERROR_5 | F_RFU_ERROR_8); } lman.state = lman.next_state = 0; gRfu.disconnectMode = RFU_DISCONNECT_NONE; } if (gRfu.childSendCount) { gRfu.childSendCount--; CallRfuFunc(); ChildBuildSendCmd(gSendCmd, sendBuf); RfuSendQueue_Enqueue(&gRfu.sendQueue, sendBuf); for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i] = 0; } return IsRfuRecvQueueEmpty(); } static void HandleSendFailure(u8 unused, u32 flags) { s32 i, j, temp; const u8 *payload = gRfu.sendBlock.payload; for (i = 0; i < gRfu.sendBlock.count; i++) { if (!(flags & 1)) { sResendBlock16[0] = RFUCMD_SEND_BLOCK | i; for (j = 0; j < CMD_LENGTH - 1; j++) { temp = j * 2; sResendBlock16[j + 1] = (payload[(COMM_SLOT_LENGTH - 2) * i + temp + 1] << 8) | payload[(COMM_SLOT_LENGTH - 2) * i + temp + 0]; } for (j = 0; j < CMD_LENGTH - 1; j++) { temp = j * 2; sResendBlock8[temp + 1] = sResendBlock16[j] >> 8; sResendBlock8[temp + 0] = sResendBlock16[j]; } RfuSendQueue_Enqueue(&gRfu.sendQueue, sResendBlock8); gRfu.sendBlock.failedFlags |= (1 << i); } flags >>= 1; } } void Rfu_SetBlockReceivedFlag(u8 linkPlayerId) { if (gRfu.parentChild == MODE_PARENT && linkPlayerId != 0) gRfu.numBlocksReceived[linkPlayerId] = 1; else gRfu.blockReceived[linkPlayerId] = TRUE; } void Rfu_ResetBlockReceivedFlag(u8 linkPlayerId) { gRfu.blockReceived[linkPlayerId] = FALSE; gRfu.recvBlock[linkPlayerId].receiving = RECV_STATE_READY; } static u8 LoadLinkPlayerIds(const u8 *ids) { u8 i; if (gRfu.parentChild == MODE_PARENT) return FALSE; for (i = 0; i < RFU_CHILD_MAX; i++) gRfu.linkPlayerIdx[i] = ids[i]; return ids[gRfu.childSlot]; } static void SendKeysToRfu(void) { static u8 heldKeyCount; if (gReceivedRemoteLinkPlayers && gHeldKeyCodeToSend != LINK_KEY_CODE_NULL && gLinkTransferringData != TRUE) { heldKeyCount++; gHeldKeyCodeToSend |= (heldKeyCount << 8); RfuPrepareSendBuffer(RFUCMD_SEND_HELD_KEYS); } } struct RfuGameData *GetHostRfuGameData(void) { return &gHostRfuGameData; } bool32 IsSendingKeysToRfu(void) { return gRfu.callback == SendKeysToRfu; } void StartSendingKeysToRfu(void) { // This is the original symbol and field name, which is baked into the assert below #define Rfu gRfu #define RfuFunc callback AGB_ASSERT_EX(Rfu.RfuFunc == NULL, ABSPATH("rfu.c"), 1473); #undef RfuFunc #undef Rfu gRfu.callback = SendKeysToRfu; } void ClearLinkRfuCallback(void) { gRfu.callback = NULL; } /* static void Rfu_BerryBlenderSendHeldKeys(void) { RfuPrepareSendBuffer(RFUCMD_BLENDER_SEND_KEYS); if (GetMultiplayerId() == 0) gSendCmd[BLENDER_COMM_ARROW_POS] = GetBlenderArrowPosition(); gBerryBlenderKeySendAttempts++; } void Rfu_SetBerryBlenderLinkCallback(void) { if (gRfu.callback == NULL) gRfu.callback = Rfu_BerryBlenderSendHeldKeys; } */ static void RfuHandleReceiveCommand(u8 unused) { u16 i; u16 j; for (i = 0; i < MAX_RFU_PLAYERS; i++) { switch (gRecvCmds[i][0] & RFUCMD_MASK) { case RFUCMD_SEND_PLAYER_IDS_NEW: if (gRfu.parentChild == MODE_CHILD && gReceivedRemoteLinkPlayers) return; // fallthrough case RFUCMD_SEND_PLAYER_IDS: if (gRfuLinkStatus->parentChild == MODE_CHILD) { gRfu.playerCount = gRecvCmds[i][1]; gRfu.multiplayerId = LoadLinkPlayerIds((u8 *)(gRecvCmds[i] + 2)); } break; case RFUCMD_SEND_BLOCK_INIT: if (gRfu.recvBlock[i].receiving == RECV_STATE_READY) { gRfu.recvBlock[i].next = 0; gRfu.recvBlock[i].count = gRecvCmds[i][1]; gRfu.recvBlock[i].owner = gRecvCmds[i][2]; gRfu.recvBlock[i].receivedFlags = 0; gRfu.recvBlock[i].receiving = RECV_STATE_RECEIVING; gRfu.blockReceived[i] = FALSE; } break; case RFUCMD_SEND_BLOCK: if (gRfu.recvBlock[i].receiving == RECV_STATE_RECEIVING) { gRfu.recvBlock[i].next = gRecvCmds[i][0] & ~RFUCMD_MASK; gRfu.recvBlock[i].receivedFlags |= (1 << gRfu.recvBlock[i].next); for (j = 0; j < 6; j++) gBlockRecvBuffer[i][gRfu.recvBlock[i].next * 6 + j] = gRecvCmds[i][j + 1]; if (gRfu.recvBlock[i].receivedFlags == sAllBlocksReceived[gRfu.recvBlock[i].count]) { gRfu.recvBlock[i].receiving = RECV_STATE_FINISHED; Rfu_SetBlockReceivedFlag(i); if (GetHostRfuGameData()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && gReceivedRemoteLinkPlayers && gRfu.parentChild == MODE_CHILD) ValidateAndReceivePokemonSioInfo(gBlockRecvBuffer); } } break; case RFUCMD_SEND_BLOCK_REQ: Rfu_InitBlockSend(sBlockRequests[gRecvCmds[i][1]].address, (u16)sBlockRequests[gRecvCmds[i][1]].size); break; case RFUCMD_READY_CLOSE_LINK: gRfu.readyCloseLink[i] = TRUE; break; case RFUCMD_READY_EXIT_STANDBY: if (gRfu.resendExitStandbyCount == gRecvCmds[i][1]) gRfu.readyExitStandby[i] = TRUE; break; case RFUCMD_DISCONNECT: if (gRfu.parentChild == MODE_CHILD) { // Disconnect child if (gReceivedRemoteLinkPlayers) { if (gRecvCmds[i][1] & gRfuLinkStatus->connSlotFlag) { gReceivedRemoteLinkPlayers = FALSE; rfu_LMAN_requestChangeAgbClockMaster(); gRfu.disconnectMode = gRecvCmds[i][2]; } gRfu.playerCount = gRecvCmds[i][3]; ClearSelectedLinkPlayerIds(gRecvCmds[i][1]); } } else { // Disconnect parent RfuPrepareSendBuffer(RFUCMD_DISCONNECT_PARENT); gSendCmd[1] = gRecvCmds[i][1]; gSendCmd[2] = gRecvCmds[i][2]; gSendCmd[3] = gRecvCmds[i][3]; } break; case RFUCMD_DISCONNECT_PARENT: if (gRfu.parentChild == MODE_PARENT) { gRfu.disconnectSlots |= gRecvCmds[i][1]; gRfu.disconnectMode = gRecvCmds[i][2]; ClearSelectedLinkPlayerIds(gRecvCmds[i][1]); } break; //case RFUCMD_BLENDER_SEND_KEYS: case RFUCMD_SEND_HELD_KEYS: gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; } if (gRfu.parentChild == MODE_PARENT && gRfu.numBlocksReceived[i]) { if (gRfu.numBlocksReceived[i] == 4) { gRfu.blockReceived[i] = TRUE; gRfu.numBlocksReceived[i] = 0; } else gRfu.numBlocksReceived[i]++; } } } static bool8 AreAllPlayersReadyToReceive(void) { s32 i; for (i = 0; i < MAX_RFU_PLAYERS; i++) { if (gRfu.recvBlock[i].receiving != RECV_STATE_READY) return FALSE; } return TRUE; } static bool8 AreAllPlayersFinishedReceiving(void) { s32 i; for (i = 0; i < gRfu.playerCount; i++) { if (gRfu.recvBlock[i].receiving != RECV_STATE_FINISHED || gRfu.blockReceived[i] != TRUE) return FALSE; } return TRUE; } static void ResetSendDataManager(struct RfuBlockSend *data) { data->next = 0; data->count = 0; data->payload = NULL; data->receivedFlags = 0; data->sending = FALSE; data->owner = 0; data->receiving = RECV_STATE_READY; } u8 Rfu_GetBlockReceivedStatus(void) { u8 flags = 0; s32 i; for (i = 0; i < MAX_RFU_PLAYERS; i++) { if (gRfu.recvBlock[i].receiving == RECV_STATE_FINISHED && gRfu.blockReceived[i] == TRUE) flags |= (1 << i); } return flags; } static void RfuPrepareSendBuffer(u16 command) { u8 i; u8 *buff; u8 tmp; gSendCmd[0] = command; switch (command) { case RFUCMD_SEND_BLOCK_INIT: gSendCmd[1] = gRfu.sendBlock.count; gSendCmd[2] = gRfu.sendBlock.owner + 0x80; break; case RFUCMD_SEND_BLOCK_REQ: if (AreAllPlayersReadyToReceive()) gSendCmd[1] = gRfu.blockRequestType; break; case RFUCMD_SEND_PLAYER_IDS: case RFUCMD_SEND_PLAYER_IDS_NEW: tmp = gRfu.parentSlots ^ gRfu.disconnectSlots; gRfu.playerCount = sPlayerBitsToCount[tmp] + 1; gSendCmd[1] = gRfu.playerCount; buff = (u8 *)&gSendCmd[2]; for (i = 0; i < RFU_CHILD_MAX; i++) buff[i] = gRfu.linkPlayerIdx[i]; break; case RFUCMD_READY_EXIT_STANDBY: case RFUCMD_READY_CLOSE_LINK: gSendCmd[1] = gRfu.resendExitStandbyCount; break; case RFUCMD_SEND_PACKET: for (i = 0; i < RFU_PACKET_SIZE; i++) gSendCmd[1 + i] = gRfu.packet[i]; break; case RFUCMD_SEND_HELD_KEYS: gSendCmd[1] = gHeldKeyCodeToSend; break; case RFUCMD_DISCONNECT_PARENT: case RFUCMD_DISCONNECT: break; } } void Rfu_SendPacket(void *data) { if (IsSendCmdComplete() && !RfuHasErrored()) { memcpy(gRfu.packet, data, sizeof(gRfu.packet)); RfuPrepareSendBuffer(RFUCMD_SEND_PACKET); } } bool32 Rfu_InitBlockSend(const u8 *src, size_t size) { bool8 round; AGB_ASSERT_EX(size<=252, ABSPATH("rfu.c"), 1793); if (gRfu.callback != NULL) return FALSE; if (gSendCmd[0] != 0) return FALSE; if (gRfu.sendBlock.sending) { sRfuDebug.blockSendTime++; return FALSE; } round = (size % 12) != 0; gRfu.sendBlock.owner = GetMultiplayerId(); gRfu.sendBlock.sending = TRUE; gRfu.sendBlock.count = (size / 12) + round; gRfu.sendBlock.next = 0; if (size > BLOCK_BUFFER_SIZE) gRfu.sendBlock.payload = src; else { if (src != gBlockSendBuffer) memcpy(gBlockSendBuffer, src, size); gRfu.sendBlock.payload = gBlockSendBuffer; } RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_INIT); gRfu.callback = HandleBlockSend; gRfu.sendBlockInitDelay = 0; return TRUE; } static void HandleBlockSend(void) { if (IsSendCmdComplete()) { RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_INIT); if (gRfu.parentChild == MODE_PARENT) { if (++gRfu.sendBlockInitDelay > 2) gRfu.callback = SendNextBlock; } else { if ((gRecvCmds[GetMultiplayerId()][0] & RFUCMD_MASK) == RFUCMD_SEND_BLOCK_INIT) gRfu.callback = SendNextBlock; } } } static void SendNextBlock(void) { s32 i; const u8 *src = gRfu.sendBlock.payload; gSendCmd[0] = RFUCMD_SEND_BLOCK | gRfu.sendBlock.next; for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i + 1] = (src[(i << 1) + gRfu.sendBlock.next * 12 + 1] << 8) | src[(i << 1) + gRfu.sendBlock.next * 12 + 0]; gRfu.sendBlock.next++; if (gRfu.sendBlock.count <= gRfu.sendBlock.next) { gRfu.sendBlock.sending = FALSE; gRfu.callback = SendLastBlock; } } static void SendLastBlock(void) { const u8 *src = gRfu.sendBlock.payload; u8 mpId = GetMultiplayerId(); s32 i; if (gRfu.parentChild == MODE_CHILD) { gSendCmd[0] = RFUCMD_SEND_BLOCK | (gRfu.sendBlock.count - 1); for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i + 1] = (src[(i << 1) + (gRfu.sendBlock.count - 1) * 12 + 1] << 8) | src[(i << 1) + (gRfu.sendBlock.count - 1) * 12 + 0]; if ((u8)gRecvCmds[mpId][0] == gRfu.sendBlock.count - 1) { if (gRfu.recvBlock[mpId].receivedFlags != sAllBlocksReceived[gRfu.recvBlock[mpId].count]) { HandleSendFailure(mpId, gRfu.recvBlock[mpId].receivedFlags); sRfuDebug.blockSendFailures++; } else gRfu.callback = NULL; } } else gRfu.callback = NULL; } bool8 Rfu_SendBlockRequest(u8 blockRequestType) { gRfu.blockRequestType = blockRequestType; RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_REQ); return TRUE; } static void RfuShutdownAfterDisconnect(void) { rfu_clearAllSlot(); rfu_LMAN_powerDownRFU(); gReceivedRemoteLinkPlayers = FALSE; gRfu.isShuttingDown = TRUE; gRfu.callback = NULL; } static void DisconnectRfu(void) { rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); rfu_waitREQComplete(); RfuShutdownAfterDisconnect(); } static void TryDisconnectRfu(void) { if (gRfu.parentChild == MODE_CHILD) { rfu_LMAN_requestChangeAgbClockMaster(); gRfu.disconnectMode = RFU_DISCONNECT_NORMAL; } else gRfu.callback = DisconnectRfu; } void LinkRfu_FatalError(void) { rfu_LMAN_requestChangeAgbClockMaster(); gRfu.disconnectMode = RFU_DISCONNECT_ERROR; gRfu.disconnectSlots = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; } // RFU equivalent of LinkCB_WaitCloseLink static void WaitAllReadyToCloseLink(void) { s32 i; u8 playerCount = gRfu.playerCount; s32 count = 0; // Wait for all players to be ready for (i = 0; i < MAX_RFU_PLAYERS; i++) { if (gRfu.readyCloseLink[i]) count++; } if (count == playerCount) { // All ready, close link gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_IN_BATTLE | 0xFFFF0000); if (gRfu.parentChild == MODE_CHILD) { gRfu.errorState = RFU_ERROR_STATE_DISCONNECTING; TryDisconnectRfu(); } else gRfu.callback = TryDisconnectRfu; } } static void SendReadyCloseLink(void) { if (IsSendCmdComplete() && !gRfu.playerExchangeActive) { RfuPrepareSendBuffer(RFUCMD_READY_CLOSE_LINK); gRfu.callback = WaitAllReadyToCloseLink; } } static void Task_TryReadyCloseLink(u8 taskId) { if (gRfu.callback == NULL) { gRfu.stopNewConnections = TRUE; gRfu.callback = SendReadyCloseLink; DestroyTask(taskId); } } void Rfu_SetCloseLinkCallback(void) { if (!FuncIsActiveTask(Task_TryReadyCloseLink)) CreateTask(Task_TryReadyCloseLink, 5); } static void SendReadyExitStandbyUntilAllReady(void) { u8 playerCount; u8 i; if (GetMultiplayerId() != 0) // child { if (gRfu.recvQueue.count == 0 && gRfu.resendExitStandbyTimer > 60) { RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY); gRfu.resendExitStandbyTimer = 0; } } playerCount = GetLinkPlayerCount(); for (i = 0; i < playerCount; i++) { if (!gRfu.readyExitStandby[i]) break; } if (i == playerCount) { for (i = 0; i < MAX_RFU_PLAYERS; i++) gRfu.readyExitStandby[i] = FALSE; gRfu.resendExitStandbyCount++; gRfu.callback = NULL; } gRfu.resendExitStandbyTimer++; } static void LinkLeaderReadyToExitStandby(void) { if (gRfu.recvQueue.count == 0 && IsSendCmdComplete()) { RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY); gRfu.callback = SendReadyExitStandbyUntilAllReady; } } // RFU equivalent of LinkCB_Standby and LinkCB_StandbyForAll static void Rfu_LinkStandby(void) { u8 i; u8 playerCount; if (GetMultiplayerId() != 0) { // Not link leader, send exit standby when ready if (gRfu.recvQueue.count == 0 && IsSendCmdComplete()) { RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY); gRfu.callback = SendReadyExitStandbyUntilAllReady; } } else { // Link leader, wait for all members to send exit ready playerCount = GetLinkPlayerCount(); for (i = 1; i < playerCount; i++) { if (!gRfu.readyExitStandby[i]) break; } if (i == playerCount) { if (gRfu.recvQueue.count == 0 && IsSendCmdComplete()) { RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY); gRfu.callback = LinkLeaderReadyToExitStandby; } } } } void Rfu_SetLinkStandbyCallback(void) { if (gRfu.callback == NULL) { gRfu.callback = Rfu_LinkStandby; gRfu.resendExitStandbyTimer = 0; } } bool32 IsRfuSerialNumberValid(u32 serialNo) { s32 i; for (i = 0; sAcceptedSerialNos[i] != serialNo; i++) { if (sAcceptedSerialNos[i] == RFU_SERIAL_END) return FALSE; } return TRUE; } u8 Rfu_SetLinkRecovery(bool32 enable) { if (!enable) return rfu_LMAN_setLinkRecovery(FALSE, 0); rfu_LMAN_setLinkRecovery(TRUE, 600); return 0; } void Rfu_StopPartnerSearch(void) { gRfu.stopNewConnections = TRUE; rfu_LMAN_stopManager(FALSE); } u8 Rfu_GetMultiplayerId(void) { if (gRfu.parentChild == MODE_PARENT) return 0; return gRfu.multiplayerId; } u8 Rfu_GetLinkPlayerCount(void) { return gRfu.playerCount; } bool8 IsLinkRfuTaskFinished(void) { return gRfu.callback != NULL ? FALSE : TRUE; } static void CallRfuFunc(void) { if (gRfu.callback != NULL) gRfu.callback(); } static bool8 CheckForLeavingGroupMembers(void) { s32 i; bool8 memberLeft = FALSE; for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfu.partnerSendStatuses[i] < RFU_STATUS_JOIN_GROUP_OK || gRfu.partnerSendStatuses[i] > RFU_STATUS_JOIN_GROUP_NO) { if (gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS || gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN) { if (gRfu.partnerRecvStatuses[i] == RFU_STATUS_LEAVE_GROUP_NOTICE) { gRfu.partnerSendStatuses[i] = RFU_STATUS_LEAVE_GROUP; gRfu.partnerRecvStatuses[i] = RFU_STATUS_CHILD_LEAVE_READY; rfu_clearSlot(TYPE_NI_RECV, i); rfu_NI_setSendData(1 << i, 8, &gRfu.partnerSendStatuses[i], 1); memberLeft = TRUE; } } else if (gRfuSlotStatusNI[gRfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED) { rfu_clearSlot(TYPE_NI_RECV, i); } } } return memberLeft; } bool32 RfuTryDisconnectLeavingChildren(void) { u8 childrenLeaving = 0; s32 i; // Check all children, get those waiting to be disconnected for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfu.partnerRecvStatuses[i] == RFU_STATUS_CHILD_LEAVE) { childrenLeaving |= (1 << i); gRfu.partnerRecvStatuses[i] = RFU_STATUS_OK; } } // Disconnect any leaving children if (childrenLeaving) { rfu_REQ_disconnect(childrenLeaving); rfu_waitREQComplete(); } // Return true if any children have left or are still waiting to leave for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfu.partnerRecvStatuses[i] == RFU_STATUS_CHILD_LEAVE_READY || gRfu.partnerRecvStatuses[i] == RFU_STATUS_CHILD_LEAVE) return TRUE; } return FALSE; } bool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *name) { u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId); if (idx == 0xFF) return TRUE; if (gRfu.partnerSendStatuses[idx] == RFU_STATUS_LEAVE_GROUP) return TRUE; return FALSE; } void SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name) { u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId); gRfu.partnerSendStatuses[idx] = status; rfu_clearSlot(TYPE_NI_SEND, idx); rfu_NI_setSendData(1 << idx, 8, &gRfu.partnerSendStatuses[idx], 1); } void SendLeaveGroupNotice(void) { gRfu.sendStatus = RFU_STATUS_LEAVE_GROUP_NOTICE; rfu_clearSlot(TYPE_NI_SEND, gRfu.childSlot); rfu_NI_setSendData(1 << gRfu.childSlot, 8, &gRfu.sendStatus, 1); } u32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name) { u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId); if (idx == 0xFF) return 2; if (gRfuSlotStatusNI[idx]->send.state == SLOT_STATE_READY) return 1; return 0; } static void UpdateChildStatuses(void) { s32 i; CheckForLeavingGroupMembers(); for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfuSlotStatusNI[i]->send.state == SLOT_STATE_SEND_SUCCESS || gRfuSlotStatusNI[i]->send.state == SLOT_STATE_SEND_FAILED) { if (gRfu.partnerRecvStatuses[i] == RFU_STATUS_CHILD_LEAVE_READY) gRfu.partnerRecvStatuses[i] = RFU_STATUS_CHILD_LEAVE; rfu_clearSlot(TYPE_NI_SEND, i); } } } static s32 GetJoinGroupStatus(void) { s32 status = RFU_STATUS_OK; if (gRfu.sendStatus == RFU_STATUS_LEAVE_GROUP_NOTICE) { if (gRfuSlotStatusNI[gRfu.childSlot]->send.state == SLOT_STATE_SEND_SUCCESS || gRfuSlotStatusNI[gRfu.childSlot]->send.state == SLOT_STATE_SEND_FAILED) rfu_clearSlot(TYPE_NI_SEND, gRfu.childSlot); } if (gRfuSlotStatusNI[gRfu.childSlot]->recv.state == SLOT_STATE_RECV_SUCCESS || gRfuSlotStatusNI[gRfu.childSlot]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN) { rfu_clearSlot(TYPE_NI_RECV, gRfu.childSlot); RfuSetStatus(gRfu.recvStatus, 0); status = gRfu.recvStatus; } else if (gRfuSlotStatusNI[gRfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED) { rfu_clearSlot(TYPE_NI_RECV, gRfu.childSlot); status = RFU_STATUS_JOIN_GROUP_NO; } return status; } #define tState data[0] static void Task_PlayerExchange(u8 taskId) { s32 i; if (gRfu.status == RFU_STATUS_FATAL_ERROR || gRfu.status == RFU_STATUS_CONNECTION_ERROR) { gRfu.playerExchangeActive = FALSE; DestroyTask(taskId); } switch (gTasks[taskId].tState) { case 0: if (AreAllPlayersReadyToReceive()) { ResetBlockReceivedFlags(); LocalLinkPlayerToBlock(); gTasks[taskId].tState++; } break; case 1: if (gRfu.parentChild == MODE_PARENT) { if (gReceivedRemoteLinkPlayers) RfuPrepareSendBuffer(RFUCMD_SEND_PLAYER_IDS_NEW); else RfuPrepareSendBuffer(RFUCMD_SEND_PLAYER_IDS); gTasks[taskId].tState = 101; } else gTasks[taskId].tState = 2; break; case 101: if (IsSendCmdComplete()) gTasks[taskId].tState = 2; break; case 2: if (gRfu.playerCount) gTasks[taskId].tState++; break; case 3: if (gRfu.parentChild == MODE_PARENT) { if (AreAllPlayersReadyToReceive()) { gRfu.blockRequestType = BLOCK_REQ_SIZE_NONE; RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_REQ); gTasks[taskId].tState++; } } else gTasks[taskId].tState++; break; case 4: if (AreAllPlayersFinishedReceiving()) gTasks[taskId].tState++; break; case 5: for (i = 0; i < gRfu.playerCount; i++) { LinkPlayerFromBlock(i); Rfu_ResetBlockReceivedFlag(i); } gTasks[taskId].tState++; break; case 6: DestroyTask(taskId); gReceivedRemoteLinkPlayers = TRUE; gRfu.playerExchangeActive = FALSE; rfu_LMAN_setLinkRecovery(1, 600); if (gRfu.newChildQueue) { for (i = 0; i < RFU_CHILD_MAX; i++) { if ((gRfu.newChildQueue >> i) & 1) { gRfu.nextChildBits = 1 << i; gRfu.newChildQueue ^= (1 << i); } } } break; } } static void ClearSelectedLinkPlayerIds(u16 selected) { s32 i; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((selected >> i) & 1) gRfu.linkPlayerIdx[i] = 0; } } static void ReceiveRfuLinkPlayers(const struct SioInfo *sioInfo) { s32 i; gRfu.playerCount = sioInfo->playerCount; for (i = 0; i < RFU_CHILD_MAX; i++) gRfu.linkPlayerIdx[i] = sioInfo->linkPlayerIdx[i]; for (i = 0; i < MAX_RFU_PLAYERS; i++) { gLinkPlayers[i] = sioInfo->linkPlayers[i]; ConvertLinkPlayerName(gLinkPlayers + i); } } // Could be relocated to top of file, but would also require relocating assert strings static const char sASCII_PokemonSioInfo[] = "PokemonSioInfo"; static const u8 sText_Akito[] = _(" あきと"); // Presumably "Akito Mori", one of Game Freak's programmers static const char sASCII_LinkLossDisconnect[] = "LINK LOSS DISCONNECT!"; static const char sASCII_LinkLossRecoveryNow[] = "LINK LOSS RECOVERY NOW"; ALIGNED(4) static const char sASCII_30Spaces[] = {" "}; static const char sASCII_15Spaces[] = {" "}; static const char sASCII_8Spaces[] = {" "}; ALIGNED(4) static const char sASCII_Space[] = {" "}; static const char sASCII_Asterisk[] = {"*"}; static const char sASCII_NowSlot[] = "NOWSLOT"; static const char sASCII_ClockCmds[][12] = { " ", "CLOCK DRIFT", "BUSY SEND ", "CMD REJECT ", "CLOCK SLAVE" }; static const char sASCII_ChildParentSearch[][8] = { "CHILD ", "PARENT", "SEARCH" }; static void ValidateAndReceivePokemonSioInfo(void *recvBuffer) { if (strcmp(sASCII_PokemonSioInfo, recvBuffer) == 0) { ReceiveRfuLinkPlayers(recvBuffer); CpuFill16(0, recvBuffer, sizeof(struct SioInfo)); ResetBlockReceivedFlag(0); } } // Equivalent to Task_PlayerExchange, but for when new children arrive after the first exchange static void Task_PlayerExchangeUpdate(u8 taskId) { s32 i; struct LinkPlayerBlock *playerBlock; struct SioInfo *sio; u8 playerId = gRfu.linkPlayerIdx[sSlotToLinkPlayerTableId[gRfu.incomingChild]]; if (gRfu.status == RFU_STATUS_FATAL_ERROR || gRfu.status == RFU_STATUS_CONNECTION_ERROR) { gRfu.playerExchangeActive = FALSE; DestroyTask(taskId); } switch (gTasks[taskId].tState) { case 0: if (IsSendCmdComplete()) { ResetBlockReceivedFlag(playerId); RfuPrepareSendBuffer(RFUCMD_SEND_PLAYER_IDS_NEW); gTasks[taskId].tState++; } break; case 1: if (IsSendCmdComplete()) gTasks[taskId].tState++; break; case 2: if ((GetBlockReceivedStatus() >> playerId) & 1) { ResetBlockReceivedFlag(playerId); playerBlock = (struct LinkPlayerBlock *)gBlockRecvBuffer[playerId]; gLinkPlayers[playerId] = playerBlock->linkPlayer; ConvertLinkPlayerName(&gLinkPlayers[playerId]); gTasks[taskId].tState++; } break; case 3: // Prepare send block sio = (struct SioInfo *)gBlockSendBuffer; memcpy(sio->magic, sASCII_PokemonSioInfo, sizeof sASCII_PokemonSioInfo); sio->playerCount = gRfu.playerCount; for (i = 0; i < RFU_CHILD_MAX; i++) sio->linkPlayerIdx[i] = gRfu.linkPlayerIdx[i]; memcpy(sio->linkPlayers, gLinkPlayers, sizeof gLinkPlayers); gTasks[taskId].tState++; // fallthrough case 4: sio = (struct SioInfo *)gBlockSendBuffer; sio->playerCount = gRfu.playerCount; for (i = 0; i < RFU_CHILD_MAX; i++) sio->linkPlayerIdx[i] = gRfu.linkPlayerIdx[i]; memcpy(sio->linkPlayers, gLinkPlayers, sizeof gLinkPlayers); if (SendBlock(0, gBlockSendBuffer, 0xa0)) gTasks[taskId].tState++; break; case 5: if (IsLinkTaskFinished() && GetBlockReceivedStatus() & 1) { CpuFill16(0, gBlockRecvBuffer, sizeof(struct SioInfo)); ResetBlockReceivedFlag(0); gRfu.playerExchangeActive = FALSE; if (gRfu.newChildQueue) { for (i = 0; i < RFU_CHILD_MAX; i++) { if ((gRfu.newChildQueue >> i) & 1) { gRfu.nextChildBits = 1 << i; gRfu.newChildQueue ^= (1 << i); gRfu.playerExchangeActive = TRUE; break; } } } DestroyTask(taskId); } break; } } // Equivalent to Task_PlayerExchange but for chatting with a Union Room partner static void Task_PlayerExchangeChat(u8 taskId) { if (gRfu.status == RFU_STATUS_FATAL_ERROR || gRfu.status == RFU_STATUS_CONNECTION_ERROR) DestroyTask(taskId); switch (gTasks[taskId].tState) { case 0: if (gRfu.playerCount != 0) { LocalLinkPlayerToBlock(); SendBlock(0, gBlockSendBuffer, sizeof(struct LinkPlayerBlock)); gTasks[taskId].tState++; } break; case 1: if (IsLinkTaskFinished()) gTasks[taskId].tState++; break; case 2: if (GetBlockReceivedStatus() & 1) { ReceiveRfuLinkPlayers((const struct SioInfo *)gBlockRecvBuffer); ResetBlockReceivedFlag(0); gReceivedRemoteLinkPlayers = TRUE; DestroyTask(taskId); } break; } } static void RfuCheckErrorStatus(void) { if (gRfu.errorState == RFU_ERROR_STATE_OCCURRED && lman.childClockSlave_flag == 0) { if (gMain.callback2 == CB2_MysteryGiftEReader) gWirelessCommType = 2; SetMainCallback2(CB2_LinkError); gMain.savedCallback = CB2_LinkError; SetLinkErrorFromRfu( (gRfu.errorInfo << 16) | (gRfu.errorParams[0] << 8) | gRfu.errorParams[1], gRfu.recvQueue.count, gRfu.sendQueue.count, RfuGetStatus() == RFU_STATUS_CONNECTION_ERROR ); gRfu.errorState = RFU_ERROR_STATE_PROCESSED; CloseLink(); } else if (gRfu.sendQueue.full == TRUE || gRfu.recvQueue.full == TRUE) { if (lman.childClockSlave_flag) rfu_LMAN_requestChangeAgbClockMaster(); RfuSetStatus(RFU_STATUS_FATAL_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7); RfuSetErrorParams(F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7); } } static void RfuMain1_UnionRoom(void) { if (lman.parent_child == MODE_PARENT) { rfu_REQ_recvData(); rfu_waitREQComplete(); rfu_LMAN_REQ_sendData(RFU_CHILD_CLOCK_SLAVE_OFF); } } // Rfu equivalent of LinkMain1 bool32 RfuMain1(void) { bool32 retval = FALSE; gRfu.parentId = 0; rfu_LMAN_manager_entity(Random()); if (!gRfu.isShuttingDown) { switch (gRfu.parentChild) { case MODE_PARENT: RfuMain1_Parent(); break; case MODE_CHILD: retval = RfuMain1_Child(); break; case MODE_P_C_SWITCH: RfuMain1_UnionRoom(); break; } } return retval; } // Rfu equivalent of LinkMain2 bool32 RfuMain2(void) { bool32 retval = FALSE; if (!gRfu.isShuttingDown) { if (gRfu.parentChild == MODE_PARENT) retval = RfuMain2_Parent(); RfuCheckErrorStatus(); } return retval; } static void SetHostRfuUsername(void) { StringCopy(gHostRfuUsername, gSaveBlock2Ptr->playerName); } void ResetHostRfuGameData(void) { memset(&gHostRfuGameData, 0, RFU_GAME_NAME_LENGTH); InitHostRfuGameData(&gHostRfuGameData, ACTIVITY_NONE, FALSE, 0); } void SetHostRfuGameData(u8 activity, u32 partnerInfo, u32 startedActivity) { InitHostRfuGameData(&gHostRfuGameData, activity, startedActivity, partnerInfo); } void SetHostRfuWonderFlags(bool32 hasNews, bool32 hasCard) { gHostRfuGameData.compatibility.hasNews = hasNews; gHostRfuGameData.compatibility.hasCard = hasCard; } void SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level) { gHostRfuGameData.tradeType = type; gHostRfuGameData.tradeSpecies = species; gHostRfuGameData.tradeLevel = level; } void UpdateGameData_GroupLockedIn(bool8 startedActivity) { gHostRfuGameData.startedActivity = startedActivity; rfu_REQ_configGameData(0, RFU_SERIAL_GAME, (void *)&gHostRfuGameData, gHostRfuUsername); } void UpdateGameData_SetActivity(u8 activity, u32 partnerInfo, u32 startedActivity) { if (activity != ACTIVITY_NONE) SetHostRfuGameData(activity, partnerInfo, startedActivity); rfu_REQ_configGameData(0, RFU_SERIAL_GAME, (void *)&gHostRfuGameData, gHostRfuUsername); } void SetUnionRoomChatPlayerData(u32 numPlayers) { s32 i; u32 numConnectedChildren; u32 partnerInfo; s32 slots; if (GetHostRfuGameData()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM)) { numConnectedChildren = 0; partnerInfo = 0; slots = gRfu.parentSlots ^ gRfu.disconnectSlots; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((slots >> i) & 1) { // Only trainerId is shifted by the number of children, so the active flag and gender // are only ever set for the first child partnerInfo |= ((PINFO_ACTIVE_FLAG | ((gLinkPlayers[gRfu.linkPlayerIdx[i]].gender & 1) << PINFO_GENDER_SHIFT) | (gLinkPlayers[gRfu.linkPlayerIdx[i]].trainerId & PINFO_TID_MASK)) << (numConnectedChildren * 8)); numConnectedChildren++; if (numConnectedChildren == numPlayers - 1) break; } } UpdateGameData_SetActivity(ACTIVITY_CHAT | IN_UNION_ROOM, partnerInfo, FALSE); } } static void RfuSetErrorParams(u32 errorInfo) { if (gRfu.errorState == RFU_ERROR_STATE_NONE) { gRfu.errorParams[0] = lman.param[0]; gRfu.errorParams[1] = lman.param[1]; gRfu.errorInfo = errorInfo; gRfu.errorState = RFU_ERROR_STATE_OCCURRED; } } static void ResetErrorState(void) { gRfu.errorState = RFU_ERROR_STATE_NONE; } void RfuSetIgnoreError(bool32 enable) { if (!enable) gRfu.errorState = RFU_ERROR_STATE_NONE; else gRfu.errorState = RFU_ERROR_STATE_IGNORE; } static void DisconnectNewChild(void) { SendDisconnectCommand(lman.acceptSlot_flag, RFU_DISCONNECT_ERROR); gRfu.callback = NULL; } static void StartDisconnectNewChild(void) { gRfu.callback = DisconnectNewChild; } static void LinkManagerCB_Parent(u8 msg, u8 param_count) { u8 i; u8 disconnectFlag = 0; switch (msg) { case LMAN_MSG_INITIALIZE_COMPLETED: gRfu.state = RFUSTATE_PARENT_CONNECT; break; case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED: break; case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED: ParentResetChildRecvMetadata(lman.param[0]); for (i = 0; i < RFU_CHILD_MAX; i++) { if ((lman.param[0] >> i) & 1) { struct RfuGameData *structPtr = (void *)&gRfuLinkStatus->partner[i].gname; if (structPtr->activity == GetHostRfuGameData()->activity) { gRfu.partnerSendStatuses[i] = RFU_STATUS_OK; gRfu.partnerRecvStatuses[i] = RFU_STATUS_OK; rfu_setRecvBuffer(TYPE_NI, i, &gRfu.partnerRecvStatuses[i], sizeof(gRfu.partnerRecvStatuses[0])); } else { disconnectFlag |= (1 << i); } } } if (disconnectFlag) { rfu_REQ_disconnect(disconnectFlag); rfu_waitREQComplete(); } break; case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED: break; case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED: break; case LMAN_MSG_END_WAIT_CHILD_NAME: if (gRfu.acceptSlot_flag != lman.acceptSlot_flag) { rfu_REQ_disconnect(gRfu.acceptSlot_flag ^ lman.acceptSlot_flag); rfu_waitREQComplete(); } gRfu.state = RFUSTATE_PARENT_FINALIZE_START; break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: gRfu.linkLossRecoveryState = 1; break; case LMAN_MSG_LINK_RECOVERY_SUCCESSED: gRfu.linkLossRecoveryState = 3; break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: gRfu.linkLossRecoveryState = 4; gRfu.parentSlots &= ~lman.param[0]; if (gReceivedRemoteLinkPlayers == 1) { if (gRfu.parentSlots == 0) RfuSetErrorParams(msg); else StartDisconnectNewChild(); } RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case 0x34: // ? Not a valid LMAN_MSG value case LMAN_MSG_RFU_POWER_DOWN: case LMAN_MSG_MANAGER_STOPPED: case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; case LMAN_MSG_LMAN_API_ERROR_RETURN: RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); RfuSetErrorParams(msg); gRfu.isShuttingDown = TRUE; break; case LMAN_MSG_REQ_API_ERROR: case LMAN_MSG_WATCH_DOG_TIMER_ERROR: case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: case LMAN_MSG_RFU_FATAL_ERROR: RfuSetErrorParams(msg); RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); gRfu.parentFinished = TRUE; break; } } static void LinkManagerCB_Child(u8 msg, u8 param_count) { switch (msg) { case LMAN_MSG_INITIALIZE_COMPLETED: gRfu.state = RFUSTATE_CHILD_CONNECT; break; case LMAN_MSG_PARENT_FOUND: gRfu.parentId = lman.param[0]; break; case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED: break; case LMAN_MSG_CONNECT_PARENT_SUCCESSED: gRfu.childSlot = lman.param[0]; break; case LMAN_MSG_CONNECT_PARENT_FAILED: RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case LMAN_MSG_CHILD_NAME_SEND_COMPLETED: gRfu.state = RFUSTATE_CHILD_TRY_JOIN; gRfu.sendStatus = RFU_STATUS_OK; gRfu.recvStatus = RFU_STATUS_OK; rfu_setRecvBuffer(TYPE_NI, gRfu.childSlot, &gRfu.recvStatus, sizeof(gRfu.recvStatus)); rfu_setRecvBuffer(TYPE_UNI, gRfu.childSlot, gRfu.childRecvQueue, sizeof(gRfu.childRecvQueue)); break; case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: gRfu.linkLossRecoveryState = 2; if (gRfu.recvStatus == RFU_STATUS_JOIN_GROUP_NO) break; case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: if (gRfu.linkLossRecoveryState != 2) gRfu.linkLossRecoveryState = 4; if (gRfu.recvStatus != RFU_STATUS_LEAVE_GROUP) RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); Debug_PrintString(sASCII_LinkLossDisconnect, 5, 5); if (gReceivedRemoteLinkPlayers == 1) RfuSetErrorParams(msg); break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: gRfu.linkLossRecoveryState = 1; Debug_PrintString(sASCII_LinkLossRecoveryNow, 5, 5); break; case LMAN_MSG_LINK_RECOVERY_SUCCESSED: gRfu.linkLossRecoveryState = 3; gRfu.linkRecovered = TRUE; break; case 0x34: // ? Not a valid LMAN_MSG value break; case LMAN_MSG_RFU_POWER_DOWN: case LMAN_MSG_MANAGER_STOPPED: case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; case LMAN_MSG_LMAN_API_ERROR_RETURN: RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); RfuSetErrorParams(msg); gRfu.isShuttingDown = TRUE; break; case LMAN_MSG_REQ_API_ERROR: case LMAN_MSG_WATCH_DOG_TIMER_ERROR: case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: case LMAN_MSG_RFU_FATAL_ERROR: RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); RfuSetErrorParams(msg); gRfu.parentFinished = TRUE; break; } } static void ParentResetChildRecvMetadata(s32 slot) { s32 i; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((slot >> i) & 1) { gRfu.numChildRecvErrors[i] = 0; gRfu.childRecvIds[i] = 0xFF; } } } static u8 GetNewChildrenInUnionRoomChat(s32 emptySlotMask) { u8 ret = 0; u8 i; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((emptySlotMask >> i) & 1) { struct RfuGameData *data = (void *)&gRfuLinkStatus->partner[i].gname; if (data->activity == (ACTIVITY_CHAT | IN_UNION_ROOM)) ret |= (1 << i); } } return ret; } static void LinkManagerCB_UnionRoom(u8 msg, u8 param_count) { u8 acceptSlot; switch (msg) { case LMAN_MSG_INITIALIZE_COMPLETED: gRfu.state = RFUSTATE_UR_CONNECT; break; case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED: RfuSetStatus(RFU_STATUS_NEW_CHILD_DETECTED, 0); break; case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED: if (GetHostRfuGameData()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && !gRfu.stopNewConnections) { u8 newChildren = GetNewChildrenInUnionRoomChat(lman.param[0]); if (newChildren != 0) { acceptSlot = 1 << Rfu_GetIndexOfNewestChild(newChildren); if (gRfu.newChildQueue == 0 && !gRfu.playerExchangeActive) { gRfu.nextChildBits = acceptSlot; gRfu.newChildQueue |= (acceptSlot ^ newChildren); gRfu.playerExchangeActive = TRUE; } else { gRfu.newChildQueue |= newChildren; } } if (newChildren != lman.param[0]) { gRfu.disconnectSlots |= (newChildren ^ lman.param[0]); gRfu.disconnectMode = RFU_DISCONNECT_NORMAL; } } else if (GetHostRfuGameData()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM)) { rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); } ParentResetChildRecvMetadata(lman.param[0]); break; case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED: break; case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED: break; case LMAN_MSG_END_WAIT_CHILD_NAME: if (GetHostRfuGameData()->activity != (ACTIVITY_CHAT | IN_UNION_ROOM) && lman.acceptCount > 1) { acceptSlot = 1 << Rfu_GetIndexOfNewestChild(lman.param[0]); rfu_REQ_disconnect(lman.acceptSlot_flag ^ acceptSlot); rfu_waitREQComplete(); } if (gRfu.state == RFUSTATE_UR_STOP_MANAGER_END) gRfu.state = RFUSTATE_UR_FINALIZE; break; case LMAN_MSG_PARENT_FOUND: gRfu.parentId = lman.param[0]; break; case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED: break; case LMAN_MSG_CONNECT_PARENT_SUCCESSED: gRfu.childSlot = lman.param[0]; break; case LMAN_MSG_CONNECT_PARENT_FAILED: gRfu.state = RFUSTATE_UR_CONNECT_END; if (gRfu.connectParentFailures < 2) { gRfu.connectParentFailures++; CreateTask(Task_TryConnectToUnionRoomParent, 2); } else { RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); } break; case LMAN_MSG_CHILD_NAME_SEND_COMPLETED: gRfu.state = RFUSTATE_UR_PLAYER_EXCHANGE; RfuSetStatus(RFU_STATUS_CHILD_SEND_COMPLETE, 0); rfu_setRecvBuffer(TYPE_UNI, gRfu.childSlot, gRfu.childRecvQueue, sizeof(gRfu.childRecvQueue)); break; case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: if (lman.acceptSlot_flag & lman.param[0]) gRfu.linkLossRecoveryState = 1; break; case LMAN_MSG_LINK_RECOVERY_SUCCESSED: gRfu.linkLossRecoveryState = 3; if (gRfuLinkStatus->parentChild == MODE_CHILD) gRfu.linkRecovered = TRUE; break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: gRfu.linkLossRecoveryState = 2; // fallthrough case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: if (gRfu.linkLossRecoveryState != 2) gRfu.linkLossRecoveryState = 4; if (gRfu.parentChild == MODE_PARENT) { if (gReceivedRemoteLinkPlayers == 1) { gRfu.parentSlots &= ~(lman.param[0]); if (gRfu.parentSlots == 0) RfuSetErrorParams(msg); else StartDisconnectNewChild(); } } else if (gRfu.disconnectMode != RFU_DISCONNECT_NORMAL && gReceivedRemoteLinkPlayers == 1) { RfuSetErrorParams(msg); rfu_LMAN_stopManager(0); } if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && lman.pcswitch_flag == 0 && FuncIsActiveTask(Task_UnionRoomListen) == TRUE) gRfu.state = RFUSTATE_UR_CONNECT; RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case LMAN_MSG_LINK_DISCONNECTED_BY_USER: gRfu.disconnectSlots = 0; break; case LMAN_MSG_RFU_POWER_DOWN: case LMAN_MSG_MANAGER_STOPPED: case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; case LMAN_MSG_LMAN_API_ERROR_RETURN: RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); RfuSetErrorParams(msg); gRfu.isShuttingDown = TRUE; break; case LMAN_MSG_REQ_API_ERROR: case LMAN_MSG_WATCH_DOG_TIMER_ERROR: case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: case LMAN_MSG_RFU_FATAL_ERROR: RfuSetErrorParams(msg); RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); gRfu.parentFinished = FALSE; break; } } void RfuSetNormalDisconnectMode(void) { gRfu.disconnectMode = RFU_DISCONNECT_NORMAL; } void RfuSetStatus(u8 status, u16 errorInfo) { gRfu.status = status; gRfu.errorInfo = errorInfo; } u8 RfuGetStatus(void) { return gRfu.status; } bool32 RfuHasErrored(void) { u32 status = RfuGetStatus(); if (status == RFU_STATUS_FATAL_ERROR || status == RFU_STATUS_CONNECTION_ERROR) return TRUE; else return FALSE; } bool32 Rfu_IsPlayerExchangeActive(void) { return gRfu.playerExchangeActive; } bool8 Rfu_IsMaster(void) { return gRfu.parentChild; } void RfuVSync(void) { rfu_LMAN_syncVBlank(); } void ClearRecvCommands(void) { CpuFill32(0, gRecvCmds, sizeof(gRecvCmds)); } static void VBlank_RfuIdle(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } // Unused static void Debug_RfuIdle(void) { s32 i; ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); ResetPaletteFade(); SetVBlankCallback(VBlank_RfuIdle); if (IsWirelessAdapterConnected()) { gLinkType = LINKTYPE_TRADE; SetWirelessCommType1(); OpenLink(); SeedRng(gMain.vblankCounter2); for (i = 0; i < TRAINER_ID_LENGTH; i++) gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_1D_MAP); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); CreateTask_RfuIdle(); SetMainCallback2(CB2_RfuIdle); } } bool32 IsUnionRoomListenTaskActive(void) { return FuncIsActiveTask(Task_UnionRoomListen); } void CreateTask_RfuIdle(void) { if (!FuncIsActiveTask(Task_Idle)) gRfu.idleTaskId = CreateTask(Task_Idle, 0); } void DestroyTask_RfuIdle(void) { if (FuncIsActiveTask(Task_Idle) == TRUE) DestroyTask(gRfu.idleTaskId); } static void CB2_RfuIdle(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } void InitializeRfuLinkManager_LinkLeader(u32 groupMax) { gRfu.parentChild = MODE_PARENT; SetHostRfuUsername(); rfu_LMAN_initializeManager(LinkManagerCB_Parent, NULL); sRfuReqConfig = sRfuReqConfigTemplate; sRfuReqConfig.availSlot_flag = sAvailSlots[groupMax - 1]; CreateTask_ParentSearchForChildren(); } void InitializeRfuLinkManager_JoinGroup(void) { gRfu.parentChild = MODE_CHILD; SetHostRfuUsername(); rfu_LMAN_initializeManager(LinkManagerCB_Child, MscCallback_Child); CreateTask_ChildSearchForParent(); } void InitializeRfuLinkManager_EnterUnionRoom(void) { if (QL_IS_PLAYBACK_STATE) return; gRfu.parentChild = MODE_P_C_SWITCH; SetHostRfuUsername(); rfu_LMAN_initializeManager(LinkManagerCB_UnionRoom, NULL); sRfuReqConfig = sRfuReqConfigTemplate; sRfuReqConfig.linkRecovery_enable = 0; sRfuReqConfig.linkRecovery_period = 600; gRfu.searchTaskId = CreateTask(Task_UnionRoomListen, 1); } static u16 ReadU16(const void *ptr) { const u8 *ptr_ = ptr; return (ptr_[1] << 8) | (ptr_[0]); } /* * ================================================================ * Looks up the player by uname and pid. Returns the index in * gRfuLinkStatus->partner of the first match with a valid slot ID. * Returns 0xFF if not found. * ================================================================ */ static u8 GetPartnerIndexByNameAndTrainerID(const u8 *name, u16 trainerId) { u8 i; u8 idx = 0xFF; for (i = 0; i < RFU_CHILD_MAX; i++) { u16 partnerTrainerId = ReadU16(((struct RfuGameData *)gRfuLinkStatus->partner[i].gname)->compatibility.playerTrainerId); if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[i].serialNo) && !StringCompare(name, gRfuLinkStatus->partner[i].uname) && trainerId == partnerTrainerId) { idx = i; if (gRfuLinkStatus->partner[i].slot != 0xFF) break; } } return idx; } static void RfuReqDisconnectSlot(u32 slot) { rfu_REQ_disconnect(slot); rfu_waitREQComplete(); gRfu.parentSlots &= ~slot; rfu_clearSlot(TYPE_UNI_SEND, gRfu.parentSendSlot); rfu_UNI_setSendData(gRfu.parentSlots, gRfu.recvCmds, sizeof(gRfu.recvCmds)); gRfu.parentSendSlot = Rfu_GetIndexOfNewestChild(gRfu.parentSlots); } void RequestDisconnectSlotByTrainerNameAndId(const u8 *trainerName, u16 trainerId) { u8 index = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId); if (index != 0xFF) RfuReqDisconnectSlot(1 << index); } void Rfu_DisconnectPlayerById(u32 playerIdx) { if (playerIdx != 0) { s32 i; u8 toDisconnect = 0; for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfu.linkPlayerIdx[i] == playerIdx && (gRfu.parentSlots >> i) & 1) toDisconnect |= 1 << i; } if (toDisconnect) SendDisconnectCommand(toDisconnect, RFU_DISCONNECT_NORMAL); } } #define tDisconnectPlayers data[0] #define tDisconnectMode data[1] static void Task_SendDisconnectCommand(u8 taskId) { if (IsSendCmdComplete() && !gRfu.playerExchangeActive) { RfuPrepareSendBuffer(RFUCMD_DISCONNECT); gSendCmd[1] = gTasks[taskId].tDisconnectPlayers; gSendCmd[2] = gTasks[taskId].tDisconnectMode; gRfu.playerCount -= sPlayerBitsToCount[gTasks[taskId].tDisconnectPlayers]; gSendCmd[3] = gRfu.playerCount; DestroyTask(taskId); } } static void SendDisconnectCommand(u32 playersToDisconnect, u32 disconnectMode) { u8 taskId = FindTaskIdByFunc(Task_SendDisconnectCommand); if (taskId == TASK_NONE) { taskId = CreateTask(Task_SendDisconnectCommand, 5); gTasks[taskId].tDisconnectPlayers = playersToDisconnect; } else { // Task is already active, just add the new players to disconnect gTasks[taskId].tDisconnectPlayers |= playersToDisconnect; } gTasks[taskId].tDisconnectMode = disconnectMode; } #undef tDisconnectPlayers #undef tDisconnectMode #define tTime data[15] static void Task_RfuReconnectWithParent(u8 taskId) { s16 *data = gTasks[taskId].data; if (CanTryReconnectParent()) { u8 id = GetPartnerIndexByNameAndTrainerID((u8 *)data, ReadU16(&data[8])); if (id != 0xFF) { if (gRfuLinkStatus->partner[id].slot != 0xFF) { gRfu.reconnectParentId = id; if (TryReconnectParent()) DestroyTask(taskId); } else if (GetHostRfuGameData()->activity == ACTIVITY_WONDER_CARD || GetHostRfuGameData()->activity == ACTIVITY_WONDER_NEWS) { tTime++; } else { // Error, unable to reconnect to parent RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7); DestroyTask(taskId); } } else { tTime++; gRfu.reconnectParentId = id; } } else { tTime++; } if (tTime > 240) { // Timeout error RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7); DestroyTask(taskId); } } #undef tTime void CreateTask_RfuReconnectWithParent(const u8 *name, u16 trainerId) { u8 taskId; s16 *data; gRfu.status = RFU_STATUS_OK; taskId = CreateTask(Task_RfuReconnectWithParent, 3); data = gTasks[taskId].data; StringCopy((u8 *)(data), name); data[8] = trainerId; } static bool32 IsPartnerActivityIncompatible(s16 activity, struct RfuGameData *partner) { if (GetHostRfuGameData()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM)) { // Host trying to chat, but partner isn't if (partner->activity != (ACTIVITY_CHAT | IN_UNION_ROOM)) return TRUE; } else if (partner->activity != IN_UNION_ROOM) { // Partner not in union room return TRUE; } else if (activity == (ACTIVITY_TRADE | IN_UNION_ROOM)) { // Verify that the trade offered hasn't changed struct RfuGameData *original = (struct RfuGameData *)&gRfu.parent.gname; if (original->tradeSpecies == SPECIES_EGG) { if (partner->tradeSpecies == original->tradeSpecies) return FALSE; else return TRUE; } else if (partner->tradeSpecies != original->tradeSpecies || partner->tradeLevel != original->tradeLevel || partner->tradeType != original->tradeType) { return TRUE; } } return FALSE; } #define tTime data[0] #define tActivity data[1] static void Task_TryConnectToUnionRoomParent(u8 taskId) { // Stop task if player is the new parent if (gRfu.status == RFU_STATUS_NEW_CHILD_DETECTED) DestroyTask(taskId); if (++gTasks[taskId].data[0] > 300) { // Timeout error RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7); DestroyTask(taskId); } // Check if parent should be searched for if (gRfu.parentId != 0 && lman.parent_child == MODE_CHILD) { // Search for parent u16 trainerId = ReadU16(((struct RfuGameData *)&gRfu.parent.gname)->compatibility.playerTrainerId); u8 id = GetPartnerIndexByNameAndTrainerID(gRfu.parent.uname, trainerId); if (id != 0xFF) { // Parent found, try to connect if (!IsPartnerActivityIncompatible(gTasks[taskId].data[1], (struct RfuGameData *)&gRfuLinkStatus->partner[id].gname)) { if (gRfuLinkStatus->partner[id].slot != 0xFF && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[id].id, 90)) { // Succesfully connected to parent gRfu.state = RFUSTATE_CONNECTED; DestroyTask(taskId); } } else { // Incompatible partner activity RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7); DestroyTask(taskId); } } } } void TryConnectToUnionRoomParent(const u8 *name, struct RfuGameData *parent, u8 activity) { u8 taskId, listenTaskId; gRfu.connectParentFailures = 0; gRfu.status = RFU_STATUS_OK; StringCopy(gRfu.parent.uname, name); memcpy(gRfu.parent.gname, parent, RFU_GAME_NAME_LENGTH); rfu_LMAN_forceChangeSP(); taskId = CreateTask(Task_TryConnectToUnionRoomParent, 2); gTasks[taskId].tActivity = activity; listenTaskId = FindTaskIdByFunc(Task_UnionRoomListen); if (activity == (ACTIVITY_CHAT | IN_UNION_ROOM)) { if (listenTaskId != TASK_NONE) gTasks[listenTaskId].tConnectingForChat = TRUE; } else { if (listenTaskId != TASK_NONE) gTasks[listenTaskId].tConnectingForChat = FALSE; } } bool8 IsRfuRecoveringFromLinkLoss(void) { if (gRfu.linkLossRecoveryState == 1) return TRUE; else return FALSE; } bool32 IsRfuCommunicatingWithAllChildren(void) { s32 i; for (i = 0; i < RFU_CHILD_MAX; i++) { // RFU_STATUS_OK is the default status. // If any connected child is receiving a status other // than OK, then the parent is communicating with them if ((lman.acceptSlot_flag >> i) & 1 && gRfu.partnerSendStatuses[i] == RFU_STATUS_OK) return FALSE; } return TRUE; } static void Debug_PrintEmpty(void) { s32 i; for (i = 0; i < 20; i++) Debug_PrintString(sASCII_30Spaces, 0, i); } static void Debug_PrintStatus(void) { s32 i, j; Debug_PrintNum(GetBlockReceivedStatus(), 28, 19, 2); Debug_PrintNum(gRfuLinkStatus->connSlotFlag, 20, 1, 1); Debug_PrintNum(gRfuLinkStatus->linkLossSlotFlag, 23, 1, 1); if (gRfu.parentChild == MODE_PARENT) { for (i = 0; i < RFU_CHILD_MAX; i++) { if ((gRfuLinkStatus->getNameFlag >> i) & 1) { Debug_PrintNum(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4); Debug_PrintString((void *) &gRfuLinkStatus->partner[i].gname, 6, i + 3); Debug_PrintString(gRfuLinkStatus->partner[i].uname, 22, i + 3); } } for (i = 0; i < RFU_CHILD_MAX; i++) { for (j = 0; j < COMM_SLOT_LENGTH; j++) Debug_PrintNum(gRfu.childRecvBuffer[i][j], j * 2, i + 11, 2); } Debug_PrintString(sASCII_NowSlot, 1, 15); } else if (gRfuLinkStatus->connSlotFlag != 0 && gRfuLinkStatus->getNameFlag != 0) { for (i = 0; i < RFU_CHILD_MAX; i++) { Debug_PrintNum(0, 1, i + 3, 4); Debug_PrintString(sASCII_15Spaces, 6, i + 3); Debug_PrintString(sASCII_8Spaces, 22, i + 3); } Debug_PrintNum(gRfuLinkStatus->partner[gRfu.childSlot].serialNo, 1, 3, 4); Debug_PrintString(gRfuLinkStatus->partner[gRfu.childSlot].gname, 6, 3); Debug_PrintString(gRfuLinkStatus->partner[gRfu.childSlot].uname, 22, 3); } else { for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { if (gRfuLinkStatus->partner[i].slot != 0xFF) { Debug_PrintNum(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4); Debug_PrintNum(gRfuLinkStatus->partner[i].id, 6, i + 3, 4); Debug_PrintString(gRfuLinkStatus->partner[i].uname, 22, i + 3); } } for (; i < RFU_CHILD_MAX; i++) { Debug_PrintNum(0, 1, i + 3, 4); Debug_PrintString(sASCII_15Spaces, 6, i + 3); Debug_PrintString(sASCII_8Spaces, 22, i + 3); } } } static u32 GetRfuSendQueueLength(void) { return gRfu.sendQueue.count; } u32 GetRfuRecvQueueLength(void) { return gRfu.recvQueue.count; } static void Task_Idle(u8 taskId) { } ================================================ FILE: src/link_rfu_3.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "event_data.h" #include "link.h" #include "link_rfu.h" #include "random.h" enum { WIRELESS_STATUS_ANIM_3_BARS, WIRELESS_STATUS_ANIM_2_BARS, WIRELESS_STATUS_ANIM_1_BAR, WIRELESS_STATUS_ANIM_SEARCHING, WIRELESS_STATUS_ANIM_ERROR, }; #define TAG_GFX_STATUS_INDICATOR 0xD431 #define TAG_PAL_STATUS_INDICATOR 0xD432 #define UNUSED_QUEUE_NUM_SLOTS 2 #define UNUSED_QUEUE_SLOT_LENGTH 256 struct RfuUnusedQueue { u8 slots[UNUSED_QUEUE_NUM_SLOTS][UNUSED_QUEUE_SLOT_LENGTH]; vu8 recvSlot; vu8 sendSlot; vu8 count; vu8 full; }; static EWRAM_DATA u8 sWirelessStatusIndicatorSpriteId = 0; static const u16 sWirelessLinkIconPalette[] = INCBIN_U16("graphics/link/wireless_icon.gbapal"); static const u32 sWirelessLinkIconPic[] = INCBIN_U32("graphics/link/wireless_icon.4bpp.lz"); // Most of the below two tables won't make sense with ASCII encoding. static const u8 sWireless_ASCIItoRSETable[] = { EOS, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, [' '] = CHAR_SPACE, ['!'] = CHAR_EXCL_MARK, 0xb5, 0xb6, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0xf1, 0x00, ['-'] = CHAR_HYPHEN, ['.'] = CHAR_PERIOD, ['/'] = CHAR_SLASH, ['0'] = CHAR_0, ['1'] = CHAR_1, ['2'] = CHAR_2, ['3'] = CHAR_3, ['4'] = CHAR_4, ['5'] = CHAR_5, ['6'] = CHAR_6, ['7'] = CHAR_7, ['8'] = CHAR_8, ['9'] = CHAR_9, 0x00, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x00, ['A'] = CHAR_A, ['B'] = CHAR_B, ['C'] = CHAR_C, ['D'] = CHAR_D, ['E'] = CHAR_E, ['F'] = CHAR_F, ['G'] = CHAR_G, ['H'] = CHAR_H, ['I'] = CHAR_I, ['J'] = CHAR_J, ['K'] = CHAR_K, ['L'] = CHAR_L, ['M'] = CHAR_M, ['N'] = CHAR_N, ['O'] = CHAR_O, ['P'] = CHAR_P, ['Q'] = CHAR_Q, ['R'] = CHAR_R, ['S'] = CHAR_S, ['T'] = CHAR_T, ['U'] = CHAR_U, ['V'] = CHAR_V, ['W'] = CHAR_W, ['X'] = CHAR_X, ['Y'] = CHAR_Y, ['Z'] = CHAR_Z, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, ['a'] = CHAR_a, ['b'] = CHAR_b, ['c'] = CHAR_c, ['d'] = CHAR_d, ['e'] = CHAR_e, ['f'] = CHAR_f, ['g'] = CHAR_g, ['h'] = CHAR_h, ['i'] = CHAR_i, ['j'] = CHAR_j, ['k'] = CHAR_k, ['l'] = CHAR_l, ['m'] = CHAR_m, ['n'] = CHAR_n, ['o'] = CHAR_o, ['p'] = CHAR_p, ['q'] = CHAR_q, ['r'] = CHAR_r, ['s'] = CHAR_s, ['t'] = CHAR_t, ['u'] = CHAR_u, ['v'] = CHAR_v, ['w'] = CHAR_w, ['x'] = CHAR_x, ['y'] = CHAR_y, ['z'] = CHAR_z, 0x2d, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x50, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0xad, 0xb3, 0xb4, 0x00, 0xaf, 0x7d, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0xa0, 0xae, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7e, 0xb0, 0xac, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2e, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94 }; static const u8 sWireless_RSEtoASCIITable[] = { [CHAR_SPACE] = ' ', 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0x7b, 0xf1, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x84, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xa6, 0xdd, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0xaf, [CHAR_0] = '0', [CHAR_1] = '1', [CHAR_2] = '2', [CHAR_3] = '3', [CHAR_4] = '4', [CHAR_5] = '5', [CHAR_6] = '6', [CHAR_7] = '7', [CHAR_8] = '8', [CHAR_9] = '9', [CHAR_EXCL_MARK] = '!', 0xdf, 0xa1, 0xb0, 0xa5, 0xde, 0x24, 0x2a, 0xa2, 0xa3, 0x22, 0x23, 0x20, 0xa4, 0x20, [CHAR_SLASH] = '/', [CHAR_A] = 'A', [CHAR_B] = 'B', [CHAR_C] = 'C', [CHAR_D] = 'D', [CHAR_E] = 'E', [CHAR_F] = 'F', [CHAR_G] = 'G', [CHAR_H] = 'H', [CHAR_I] = 'I', [CHAR_J] = 'J', [CHAR_K] = 'K', [CHAR_L] = 'L', [CHAR_M] = 'M', [CHAR_N] = 'N', [CHAR_O] = 'O', [CHAR_P] = 'P', [CHAR_Q] = 'Q', [CHAR_R] = 'R', [CHAR_S] = 'S', [CHAR_T] = 'T', [CHAR_U] = 'U', [CHAR_V] = 'V', [CHAR_W] = 'W', [CHAR_X] = 'X', [CHAR_Y] = 'Y', [CHAR_Z] = 'Z', [CHAR_a] = 'a', [CHAR_b] = 'b', [CHAR_c] = 'c', [CHAR_d] = 'd', [CHAR_e] = 'e', [CHAR_f] = 'f', [CHAR_g] = 'g', [CHAR_h] = 'h', [CHAR_i] = 'i', [CHAR_j] = 'j', [CHAR_k] = 'k', [CHAR_l] = 'l', [CHAR_m] = 'm', [CHAR_n] = 'n', [CHAR_o] = 'o', [CHAR_p] = 'p', [CHAR_q] = 'q', [CHAR_r] = 'r', [CHAR_s] = 's', [CHAR_t] = 't', [CHAR_u] = 'u', [CHAR_v] = 'v', [CHAR_w] = 'w', [CHAR_x] = 'x', [CHAR_y] = 'y', [CHAR_z] = 'z', 0x20, 0x20, 0x2b, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, [CHAR_DYNAMIC] = ' ', [CHAR_KEYPAD_ICON] = ' ', [CHAR_EXTRA_SYMBOL] = ' ', [CHAR_PROMPT_SCROLL] = ' ', [CHAR_PROMPT_CLEAR] = ' ', [EXT_CTRL_CODE_BEGIN] = ' ', [PLACEHOLDER_BEGIN] = ' ', [CHAR_NEWLINE] = ' ', [EOS] = 0 }; static const struct OamData sWirelessStatusIndicatorOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 0, .paletteNum = 0, }; static const union AnimCmd sWirelessStatusIndicator_3Bars[] = { ANIMCMD_FRAME( 4, 5), ANIMCMD_FRAME( 8, 5), ANIMCMD_FRAME(12, 5), ANIMCMD_FRAME(16, 10), ANIMCMD_FRAME(12, 5), ANIMCMD_FRAME( 8, 5), ANIMCMD_JUMP(0) }; static const union AnimCmd sWirelessStatusIndicator_2Bars[] = { ANIMCMD_FRAME( 4, 5), ANIMCMD_FRAME( 8, 5), ANIMCMD_FRAME(12, 10), ANIMCMD_FRAME( 8, 5), ANIMCMD_JUMP(0) }; static const union AnimCmd sWirelessStatusIndicator_1Bar[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_JUMP(0) }; static const union AnimCmd sWirelessStatusIndicator_Searching[] = { ANIMCMD_FRAME( 4, 10), ANIMCMD_FRAME(20, 10), ANIMCMD_JUMP(0) }; static const union AnimCmd sWirelessStatusIndicator_Error[] = { ANIMCMD_FRAME(24, 10), ANIMCMD_FRAME( 4, 10), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sWirelessStatusIndicatorAnims[] = { [WIRELESS_STATUS_ANIM_3_BARS] = sWirelessStatusIndicator_3Bars, [WIRELESS_STATUS_ANIM_2_BARS] = sWirelessStatusIndicator_2Bars, [WIRELESS_STATUS_ANIM_1_BAR] = sWirelessStatusIndicator_1Bar, [WIRELESS_STATUS_ANIM_SEARCHING] = sWirelessStatusIndicator_Searching, [WIRELESS_STATUS_ANIM_ERROR] = sWirelessStatusIndicator_Error }; static const struct CompressedSpriteSheet sWirelessStatusIndicatorSpriteSheet = { sWirelessLinkIconPic, 0x0380, TAG_GFX_STATUS_INDICATOR }; static const struct SpritePalette sWirelessStatusIndicatorSpritePalette = { sWirelessLinkIconPalette, TAG_PAL_STATUS_INDICATOR }; static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = { .tileTag = TAG_GFX_STATUS_INDICATOR, .paletteTag = TAG_PAL_STATUS_INDICATOR, .oam = &sWirelessStatusIndicatorOamData, .anims = sWirelessStatusIndicatorAnims, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; // A bunch of FIFO queues void RfuRecvQueue_Reset(struct RfuRecvQueue *queue) { s32 i; s32 j; for (i = 0; i < RECV_QUEUE_NUM_SLOTS; i++) { for (j = 0; j < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; j++) queue->slots[i][j] = 0; } queue->sendSlot = 0; queue->recvSlot = 0; queue->count = 0; queue->full = FALSE; } void RfuSendQueue_Reset(struct RfuSendQueue *queue) { s32 i; s32 j; for (i = 0; i < SEND_QUEUE_NUM_SLOTS; i++) { for (j = 0; j < COMM_SLOT_LENGTH; j++) queue->slots[i][j] = 0; } queue->sendSlot = 0; queue->recvSlot = 0; queue->count = 0; queue->full = FALSE; } static void RfuUnusedQueue_Reset(struct RfuUnusedQueue *queue) { s32 i; s32 j; for (i = 0; i < UNUSED_QUEUE_NUM_SLOTS; i++) { for (j = 0; j < UNUSED_QUEUE_SLOT_LENGTH; j++) queue->slots[i][j] = 0; } queue->sendSlot = 0; queue->recvSlot = 0; queue->count = 0; queue->full = FALSE; } void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *src) { s32 i; u16 imeBak; u8 count; if (queue->count < RECV_QUEUE_NUM_SLOTS) { imeBak = REG_IME; REG_IME = 0; count = 0; for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i += COMM_SLOT_LENGTH) { if (src[i] == 0 && src[i + 1] == 0) count++; } if (count != MAX_RFU_PLAYERS) { for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i++) queue->slots[queue->recvSlot][i] = src[i]; queue->recvSlot++; queue->recvSlot %= RECV_QUEUE_NUM_SLOTS; queue->count++; for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i++) src[i] = 0; } REG_IME = imeBak; } else { queue->full = TRUE; } } void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *src) { s32 i; u16 imeBak; if (queue->count < SEND_QUEUE_NUM_SLOTS) { imeBak = REG_IME; REG_IME = 0; for (i = 0; i < COMM_SLOT_LENGTH; i++) { if (src[i] != 0) break; } if (i != COMM_SLOT_LENGTH) { for (i = 0; i < COMM_SLOT_LENGTH; i++) queue->slots[queue->recvSlot][i] = src[i]; queue->recvSlot++; queue->recvSlot %= SEND_QUEUE_NUM_SLOTS; queue->count++; for (i = 0; i < COMM_SLOT_LENGTH; i++) src[i] = 0; } REG_IME = imeBak; } else { queue->full = TRUE; } } bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *dest) { u16 imeBak; s32 i; imeBak = REG_IME; REG_IME = 0; if (queue->recvSlot == queue->sendSlot || queue->full) { for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i++) dest[i] = 0; REG_IME = imeBak; return FALSE; } for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i++) dest[i] = queue->slots[queue->sendSlot][i]; queue->sendSlot++; queue->sendSlot %= RECV_QUEUE_NUM_SLOTS; queue->count--; REG_IME = imeBak; return TRUE; } bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *dest) { s32 i; u16 imeBak; if (queue->recvSlot == queue->sendSlot || queue->full) return FALSE; imeBak = REG_IME; REG_IME = 0; for (i = 0; i < COMM_SLOT_LENGTH; i++) dest[i] = queue->slots[queue->sendSlot][i]; queue->sendSlot++; queue->sendSlot %= SEND_QUEUE_NUM_SLOTS; queue->count--; REG_IME = imeBak; return TRUE; } void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *dest) { s32 i; if (dest[1] == 0) { RfuBackupQueue_Dequeue(queue, NULL); } else { for (i = 0; i < COMM_SLOT_LENGTH; i++) queue->slots[queue->recvSlot][i] = dest[i]; queue->recvSlot++; queue->recvSlot %= BACKUP_QUEUE_NUM_SLOTS; if (queue->count < BACKUP_QUEUE_NUM_SLOTS) queue->count++; else queue->sendSlot = queue->recvSlot; } } bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *dest) { s32 i; if (queue->count == 0) return FALSE; if (dest != NULL) { for (i = 0; i < COMM_SLOT_LENGTH; i++) dest[i] = queue->slots[queue->sendSlot][i]; } queue->sendSlot++; queue->sendSlot %= BACKUP_QUEUE_NUM_SLOTS; queue->count--; return TRUE; } static void RfuUnusedQueue_Dequeue(struct RfuUnusedQueue *queue, u8 *dest) { s32 i; if (queue->count < UNUSED_QUEUE_NUM_SLOTS) { for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++) queue->slots[queue->recvSlot][i] = dest[i]; queue->recvSlot++; queue->recvSlot %= UNUSED_QUEUE_NUM_SLOTS; queue->count++; } else { queue->full = TRUE; } } static bool8 RfuUnusedQueue_Enqueue(struct RfuUnusedQueue *queue, u8 *dest) { s32 i; if (queue->recvSlot == queue->sendSlot || queue->full) return FALSE; for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++) dest[i] = queue->slots[queue->sendSlot][i]; queue->sendSlot++; queue->sendSlot %= UNUSED_QUEUE_NUM_SLOTS; queue->count--; return TRUE; } // Unused // Populates an array with a sequence of numbers (which numbers depends on the mode) // and sets the final element to the total of the other elements #define SEQ_ARRAY_MAX_SIZE 200 static void PopulateArrayWithSequence(u8 *arr, u8 mode) { s32 i; u8 rval; u16 total = 0; static u8 counter; switch (mode) { case 0: // Populate with numbers 1-200 // Total will be 20100 for (i = 0; i < SEQ_ARRAY_MAX_SIZE; i++) { arr[i] = i + 1; total += i + 1; } *((u16 *)(arr + i)) = total; break; case 1: // Populate with numbers 1-100 // Total will be 5050 for (i = 0; i < 100; i++) { arr[i] = i + 1; total += i + 1; } *((u16 *)(arr + SEQ_ARRAY_MAX_SIZE)) = total; break; case 2: // Populate with random numbers 0-255 // Total will be a number 0-51000 for (i = 0; i < SEQ_ARRAY_MAX_SIZE; i++) { rval = Random(); arr[i] = rval; total += rval; } *((u16 *)(arr + i)) = total; break; case 3: // Populate with numbers 1-200 + counter // Total will be a number 20100-51000 for (i = 0; i < SEQ_ARRAY_MAX_SIZE; i++) { arr[i] = i + 1 + counter; total += (i + 1 + counter) & 0xFF; } *((u16 *)(arr + i)) = total; counter++; break; } } static void PkmnStrToASCII(u8 *dest, const u8 *src) { s32 i; for (i = 0; src[i] != EOS; i++) dest[i] = sWireless_RSEtoASCIITable[src[i]]; dest[i] = 0; } static void ASCIIToPkmnStr(u8 *dest, const u8 *src) { s32 i; for (i = 0; src[i] != 0; i++) dest[i] = sWireless_ASCIItoRSETable[src[i]]; dest[i] = EOS; } static u8 GetConnectedChildStrength(u8 maxFlags) { u8 flagCount = 0; u8 flags = gRfuLinkStatus->connSlotFlag; u8 i; if (gRfuLinkStatus->parentChild == MODE_PARENT) { for (i = 0; i < 4; i++) { if (flags & 1) { if (maxFlags == flagCount + 1) { return gRfuLinkStatus->strength[i]; break; // This break is needed to match } flagCount++; } flags >>= 1; } } else { for (i = 0; i < 4; i++) { if (flags & 1) return gRfuLinkStatus->strength[i]; flags >>= 1; } } return 0; } void InitHostRfuGameData(struct RfuGameData *data, u8 activity, bool32 startedActivity, s32 partnerInfo) { s32 i; for (i = 0; i < (s32)ARRAY_COUNT(data->compatibility.playerTrainerId); i++) data->compatibility.playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; for (i = 0; i < RFU_CHILD_MAX; i++) { data->partnerInfo[i] = partnerInfo; partnerInfo >>= 8; // Each element is 1 byte } data->playerGender = gSaveBlock2Ptr->playerGender; data->activity = activity; data->startedActivity = startedActivity; data->compatibility.language = GAME_LANGUAGE; data->compatibility.version = GAME_VERSION; data->compatibility.hasNews = FALSE; data->compatibility.hasCard = FALSE; data->compatibility.unknown = FALSE; data->compatibility.canLinkNationally = TRUE; //FlagGet(FLAG_SYS_CAN_LINK_WITH_RS); data->compatibility.hasNationalDex = TRUE; //IsNationalPokedexEnabled(); data->compatibility.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR_OLD); } /* * ================================================================ * Returns 1 if parent, 0 if child or neutral. * If partner serial number is valid, copies gameData and username. * Otherwise, blanks these. * ================================================================ */ bool8 Rfu_GetCompatiblePlayerData(struct RfuGameData *gameData, u8 *username, u8 idx) { bool8 retVal; if (lman.parent_child == MODE_PARENT) { retVal = TRUE; if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1)) { memcpy(gameData, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH); memcpy(username, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH); } else { memset(gameData, 0, RFU_GAME_NAME_LENGTH); memset(username, 0, RFU_USER_NAME_LENGTH); } } else { retVal = FALSE; if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[idx].serialNo)) { memcpy(gameData, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH); memcpy(username, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH); } else { memset(gameData, 0, RFU_GAME_NAME_LENGTH); memset(username, 0, RFU_USER_NAME_LENGTH); } } return retVal; } bool8 Rfu_GetWonderDistributorPlayerData(struct RfuGameData *gameData, u8 *username, u8 idx) { bool8 retVal = FALSE; if (gRfuLinkStatus->partner[idx].serialNo == RFU_SERIAL_WONDER_DISTRIBUTOR) { memcpy(gameData, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH); memcpy(username, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH); retVal = TRUE; } else { memset(gameData, 0, RFU_GAME_NAME_LENGTH); memset(username, 0, RFU_USER_NAME_LENGTH); } return retVal; } void CopyHostRfuGameDataAndUsername(struct RfuGameData *gameData, u8 *username) { memcpy(gameData, &gHostRfuGameData, RFU_GAME_NAME_LENGTH); memcpy(username, gHostRfuUsername, RFU_USER_NAME_LENGTH); } #define sNextAnimNum data[0] #define sSavedAnimNum data[1] #define sCurrAnimNum data[2] #define sFrameDelay data[3] #define sFrameIdx data[4] #define sTileStart data[6] #define sValidator data[7] #define STATUS_INDICATOR_ACTIVE 0x1234 // Used to validate active indicator void CreateWirelessStatusIndicatorSprite(u8 x, u8 y) { u8 sprId; if (x == 0 && y == 0) { x = 231; y = 8; } if (gRfuLinkStatus->parentChild == MODE_PARENT) { sprId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0); gSprites[sprId].sValidator = STATUS_INDICATOR_ACTIVE; gSprites[sprId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag); gSprites[sprId].invisible = TRUE; sWirelessStatusIndicatorSpriteId = sprId; } else { sWirelessStatusIndicatorSpriteId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0); gSprites[sWirelessStatusIndicatorSpriteId].sValidator = STATUS_INDICATOR_ACTIVE; gSprites[sWirelessStatusIndicatorSpriteId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag); gSprites[sWirelessStatusIndicatorSpriteId].invisible = TRUE; } } void DestroyWirelessStatusIndicatorSprite(void) { if (gSprites[sWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE) { gSprites[sWirelessStatusIndicatorSpriteId].sValidator = 0; DestroySprite(&gSprites[sWirelessStatusIndicatorSpriteId]); gMain.oamBuffer[125] = gDummyOamData; CpuCopy16(&gDummyOamData, (struct OamData *)OAM + 125, sizeof(struct OamData)); } } void LoadWirelessStatusIndicatorSpriteGfx(void) { if (GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag) == 0xFFFF) LoadCompressedSpriteSheet(&sWirelessStatusIndicatorSpriteSheet); LoadSpritePalette(&sWirelessStatusIndicatorSpritePalette); sWirelessStatusIndicatorSpriteId = SPRITE_NONE; } static u8 GetParentSignalStrength(void) { u8 i; u8 flags = gRfuLinkStatus->connSlotFlag; for (i = 0; i < RFU_CHILD_MAX; i++) { if (flags & 1) return gRfuLinkStatus->strength[i]; flags >>= 1; } return 0; } static void SetAndRestartWirelessStatusIndicatorAnim(struct Sprite *sprite, s32 animNum) { if (sprite->sCurrAnimNum != animNum) { sprite->sCurrAnimNum = animNum; sprite->sFrameDelay = 0; sprite->sFrameIdx = 0; } } void UpdateWirelessStatusIndicatorSprite(void) { if (sWirelessStatusIndicatorSpriteId != SPRITE_NONE && gSprites[sWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE) { struct Sprite *sprite = &gSprites[sWirelessStatusIndicatorSpriteId]; u8 signalStrength = RFU_LINK_ICON_LEVEL4_MAX; u8 i = 0; // Get weakest signal strength if (gRfuLinkStatus->parentChild == MODE_PARENT) { for (i = 0; i < GetLinkPlayerCount() - 1; i++) { if (signalStrength >= GetConnectedChildStrength(i + 1)) signalStrength = GetConnectedChildStrength(i + 1); } } else { signalStrength = GetParentSignalStrength(); } // Set signal strength sprite anim number if (IsRfuRecoveringFromLinkLoss() == TRUE) sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_ERROR; else if (signalStrength <= RFU_LINK_ICON_LEVEL1_MAX) sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_SEARCHING; else if (signalStrength >= RFU_LINK_ICON_LEVEL2_MIN && signalStrength <= RFU_LINK_ICON_LEVEL2_MAX) sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_1_BAR; else if (signalStrength >= RFU_LINK_ICON_LEVEL3_MIN && signalStrength <= RFU_LINK_ICON_LEVEL3_MAX) sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_2_BARS; else if (signalStrength >= RFU_LINK_ICON_LEVEL4_MIN) sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_3_BARS; if (sprite->sNextAnimNum != sprite->sSavedAnimNum) { SetAndRestartWirelessStatusIndicatorAnim(sprite, sprite->sNextAnimNum); sprite->sSavedAnimNum = sprite->sNextAnimNum; } if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.duration < sprite->sFrameDelay) { sprite->sFrameIdx++; sprite->sFrameDelay = 0; if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].type == -2) // ANIMCMD_JUMP sprite->sFrameIdx = 0; } else { sprite->sFrameDelay++; } gMain.oamBuffer[125] = sWirelessStatusIndicatorOamData; gMain.oamBuffer[125].x = sprite->x + sprite->centerToCornerVecX; gMain.oamBuffer[125].y = sprite->y + sprite->centerToCornerVecY; gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum; gMain.oamBuffer[125].tileNum = sprite->sTileStart + sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.imageValue; CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData)); if (RfuGetStatus() == RFU_STATUS_FATAL_ERROR) { DestroyWirelessStatusIndicatorSprite(); } } } #undef sNextAnimNum #undef sSavedAnimNum #undef sCurrAnimNum #undef sFrameDelay #undef sFrameIdx #undef sTileStart #undef sValidator static void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name) { int i; dest->trainerId = trainerId; for (i = 0; i < PLAYER_NAME_LENGTH; i++) { if (name[i] == EOS) break; dest->trainerName[i] = name[i]; } dest->trainerName[i] = EOS; } static void ZeroName(u8 *name) { s32 i; for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) *name++ = 0; } static bool32 NameIsEmpty(const u8 *name) { s32 i; for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) { if (*name++ != 0) return FALSE; } return TRUE; } // Save the currently connected players into the trainer records, shifting all previous records down. void SaveLinkTrainerNames(void) { if (gWirelessCommType != 0) { s32 i; s32 j; s32 nextSpace; s32 connectedTrainerRecordIndices[5]; struct TrainerNameRecord *newRecords = AllocZeroed(sizeof(gSaveBlock1Ptr->trainerNameRecords)); // Check if we already have a record saved for connected trainers. for (i = 0; i < GetLinkPlayerCount(); i++) { connectedTrainerRecordIndices[i] = -1; for (j = 0; j < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); j++) { if ((u16)gLinkPlayers[i].trainerId == gSaveBlock1Ptr->trainerNameRecords[j].trainerId && StringCompare(gLinkPlayers[i].name, gSaveBlock1Ptr->trainerNameRecords[j].trainerName) == 0) { connectedTrainerRecordIndices[i] = j; } } } // Save the connected trainers first, at the top of the list. nextSpace = 0; for (i = 0; i < GetLinkPlayerCount(); i++) { if (i != GetMultiplayerId() && gLinkPlayers[i].language != LANGUAGE_JAPANESE) { CopyTrainerRecord(&newRecords[nextSpace], (u16)gLinkPlayers[i].trainerId, gLinkPlayers[i].name); // If we already had a record for this trainer, wipe it so that the next step doesn't duplicate it. if (connectedTrainerRecordIndices[i] >= 0) ZeroName(gSaveBlock1Ptr->trainerNameRecords[connectedTrainerRecordIndices[i]].trainerName); nextSpace++; } } // Copy all non-empty records to the new list, in the order they appear on the old list. If the list is full, // the last (oldest) records will be dropped. for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++) { if (!NameIsEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName)) { CopyTrainerRecord(&newRecords[nextSpace], gSaveBlock1Ptr->trainerNameRecords[i].trainerId, gSaveBlock1Ptr->trainerNameRecords[i].trainerName); if (++nextSpace >= (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords)) break; } } // Finalize the new list, and clean up. memcpy(gSaveBlock1Ptr->trainerNameRecords, newRecords, sizeof(gSaveBlock1Ptr->trainerNameRecords)); Free(newRecords); } } bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name) { s32 i; for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++) { if (StringCompareN(gSaveBlock1Ptr->trainerNameRecords[i].trainerName, name, PLAYER_NAME_LENGTH) == 0 && gSaveBlock1Ptr->trainerNameRecords[i].trainerId == id) return TRUE; if (NameIsEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName)) return FALSE; } return FALSE; } ================================================ FILE: src/list_menu.c ================================================ #include "global.h" #include "gflib.h" #include "menu.h" #include "list_menu.h" #include "menu_indicators.h" #include "new_menu_helpers.h" #include "text_window.h" #include "task.h" #include "graphics.h" #include "strings.h" #include "pokemon_icon.h" #include "constants/songs.h" struct MysteryGiftLinkMenuStruct { u32 currItemId; u8 state; u8 windowId; u8 listTaskId; }; struct ListMenuOverride { u8 cursorPal:4; u8 fillValue:4; u8 cursorShadowPal:4; u8 lettersSpacing:6; u8 field_2_2:6; // unused u8 fontId:7; bool8 enabled:1; }; struct MoveMenuInfoIcon { u8 width; u8 height; u16 offset; }; static EWRAM_DATA struct MysteryGiftLinkMenuStruct sMysteryGiftLinkMenu = {0}; struct ListMenuOverride gListMenuOverride; struct ListMenuTemplate gMultiuseListMenuTemplate; static u8 ListMenuInitInternal(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove); static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown); static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count); static void ListMenuDrawCursor(struct ListMenu *list); static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit); static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind); static const struct MoveMenuInfoIcon sMenuInfoIcons[] = { // { width, height, offset } [MENU_INFO_ICON_CAUGHT] = { 12, 12, 0x00 }, [TYPE_NORMAL + 1] = { 32, 12, 0x20 }, [TYPE_FIGHTING + 1] = { 32, 12, 0x64 }, [TYPE_FLYING + 1] = { 32, 12, 0x60 }, [TYPE_POISON + 1] = { 32, 12, 0x80 }, [TYPE_GROUND + 1] = { 32, 12, 0x48 }, [TYPE_ROCK + 1] = { 32, 12, 0x44 }, [TYPE_BUG + 1] = { 32, 12, 0x6C }, [TYPE_GHOST + 1] = { 32, 12, 0x68 }, [TYPE_STEEL + 1] = { 32, 12, 0x88 }, [TYPE_MYSTERY + 1] = { 32, 12, 0xA4 }, [TYPE_FIRE + 1] = { 32, 12, 0x24 }, [TYPE_WATER + 1] = { 32, 12, 0x28 }, [TYPE_GRASS + 1] = { 32, 12, 0x2C }, [TYPE_ELECTRIC + 1] = { 32, 12, 0x40 }, [TYPE_PSYCHIC + 1] = { 32, 12, 0x84 }, [TYPE_ICE + 1] = { 32, 12, 0x4C }, [TYPE_DRAGON + 1] = { 32, 12, 0xA0 }, [TYPE_DARK + 1] = { 32, 12, 0x8C }, [MENU_INFO_ICON_TYPE] = { 40, 12, 0xA8 }, [MENU_INFO_ICON_POWER] = { 40, 12, 0xC0 }, [MENU_INFO_ICON_ACCURACY] = { 40, 12, 0xC8 }, [MENU_INFO_ICON_PP] = { 40, 12, 0xE0 }, [MENU_INFO_ICON_EFFECT] = { 40, 12, 0xE8 }, }; static void ListMenuDummyTask(u8 taskId) { } u32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palOffset) { switch (sMysteryGiftLinkMenu.state) { case 0: default: sMysteryGiftLinkMenu.windowId = AddWindow(windowTemplate); switch (arg2) { case 2: LoadUserWindowGfx(sMysteryGiftLinkMenu.windowId, tileNum, palOffset); case 1: DrawTextBorderOuter(sMysteryGiftLinkMenu.windowId, tileNum, palOffset / 16); break; } gMultiuseListMenuTemplate = *listMenuTemplate; gMultiuseListMenuTemplate.windowId = sMysteryGiftLinkMenu.windowId; sMysteryGiftLinkMenu.listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); CopyWindowToVram(sMysteryGiftLinkMenu.windowId, COPYWIN_MAP); sMysteryGiftLinkMenu.state = 1; break; case 1: sMysteryGiftLinkMenu.currItemId = ListMenu_ProcessInput(sMysteryGiftLinkMenu.listTaskId); if (JOY_NEW(A_BUTTON)) { sMysteryGiftLinkMenu.state = 2; } if (JOY_NEW(B_BUTTON)) { sMysteryGiftLinkMenu.currItemId = LIST_CANCEL; sMysteryGiftLinkMenu.state = 2; } if (sMysteryGiftLinkMenu.state == 2) { if (!arg2) { ClearWindowTilemap(sMysteryGiftLinkMenu.windowId); } else { switch (arg2) { case 0: // can never be reached, because of the if statement above ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE); break; case 2: case 1: ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE); break; } } CopyWindowToVram(sMysteryGiftLinkMenu.windowId, COPYWIN_MAP); } break; case 2: DestroyListMenuTask(sMysteryGiftLinkMenu.listTaskId, NULL, NULL); RemoveWindow(sMysteryGiftLinkMenu.windowId); sMysteryGiftLinkMenu.state = 0; return sMysteryGiftLinkMenu.currItemId; } return LIST_NOTHING_CHOSEN; } u8 ListMenuInit(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove) { u8 taskId = ListMenuInitInternal(listMenuTemplate, cursorPos, itemsAbove); PutWindowTilemap(listMenuTemplate->windowId); CopyWindowToVram(listMenuTemplate->windowId, COPYWIN_GFX); return taskId; } u8 ListMenuInitInRect(const struct ListMenuTemplate *listMenuTemplate, const struct ListMenuWindowRect *rect, u16 cursorPos, u16 itemsAbove) { s32 i; u8 taskId = ListMenuInitInternal(listMenuTemplate, cursorPos, itemsAbove); for (i = 0; rect[i].palNum != 0xFF; i++) PutWindowRectTilemapOverridePalette(listMenuTemplate->windowId, rect[i].x, rect[i].y, rect[i].width, rect[i].height, rect[i].palNum); CopyWindowToVram(listMenuTemplate->windowId, COPYWIN_GFX); return taskId; } s32 ListMenu_ProcessInput(u8 listTaskId) { struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; if (JOY_NEW(A_BUTTON)) { return list->template.items[list->cursorPos + list->itemsAbove].index; } else if (JOY_NEW(B_BUTTON)) { return LIST_CANCEL; } else if (gMain.newAndRepeatedKeys & DPAD_UP) { ListMenuChangeSelection(list, TRUE, 1, FALSE); return LIST_NOTHING_CHOSEN; } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { ListMenuChangeSelection(list, TRUE, 1, TRUE); return LIST_NOTHING_CHOSEN; } else // try to move by one window scroll { bool16 rightButton, leftButton; switch (list->template.scrollMultiple) { case LIST_NO_MULTIPLE_SCROLL: default: leftButton = FALSE; rightButton = FALSE; break; case LIST_MULTIPLE_SCROLL_DPAD: leftButton = gMain.newAndRepeatedKeys & DPAD_LEFT; rightButton = gMain.newAndRepeatedKeys & DPAD_RIGHT; break; case LIST_MULTIPLE_SCROLL_L_R: leftButton = gMain.newAndRepeatedKeys & L_BUTTON; rightButton = gMain.newAndRepeatedKeys & R_BUTTON; break; } if (leftButton) { ListMenuChangeSelection(list, TRUE, list->template.maxShowed, FALSE); return LIST_NOTHING_CHOSEN; } else if (rightButton) { ListMenuChangeSelection(list, TRUE, list->template.maxShowed, TRUE); return LIST_NOTHING_CHOSEN; } else { return LIST_NOTHING_CHOSEN; } } } void DestroyListMenuTask(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove) { struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; if (cursorPos != NULL) *cursorPos = list->cursorPos; if (itemsAbove != NULL) *itemsAbove = list->itemsAbove; if (list->taskId != TAIL_SENTINEL) ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2); DestroyTask(listTaskId); } void RedrawListMenu(u8 listTaskId) { struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue)); ListMenuPrintEntries(list, list->cursorPos, 0, list->template.maxShowed); ListMenuDrawCursor(list); CopyWindowToVram(list->template.windowId, COPYWIN_GFX); } static void ChangeListMenuPals(u8 listTaskId, u8 cursorPal, u8 fillValue, u8 cursorShadowPal) { struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; list->template.cursorPal = cursorPal; list->template.fillValue = fillValue; list->template.cursorShadowPal = cursorShadowPal; } static void ChangeListMenuCoords(u8 listTaskId, u8 x, u8 y) { struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT, x); SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP, y); } static s32 ListMenuTestInput(struct ListMenuTemplate *template, u32 cursorPos, u32 itemsAbove, u16 keys, u16 *newCursorPos, u16 *newItemsAbove) { struct ListMenu list; list.template = *template; list.cursorPos = cursorPos; list.itemsAbove = itemsAbove; list.unk_1C = 0; list.unk_1D = 0; if (keys == DPAD_UP) ListMenuChangeSelection(&list, FALSE, 1, FALSE); if (keys == DPAD_DOWN) ListMenuChangeSelection(&list, FALSE, 1, TRUE); if (newCursorPos != NULL) *newCursorPos = list.cursorPos; if (newItemsAbove != NULL) *newItemsAbove = list.itemsAbove; return LIST_NOTHING_CHOSEN; } static void ListMenuGetCurrentItemArrayId(u8 listTaskId, u16 *arrayId) { struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; if (arrayId != NULL) *arrayId = list->cursorPos + list->itemsAbove; } void ListMenuGetScrollAndRow(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove) { struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; if (cursorPos != NULL) *cursorPos = list->cursorPos; if (itemsAbove != NULL) *itemsAbove = list->itemsAbove; } u16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId) { struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; return list->itemsAbove * yMultiplier + list->template.upText_Y; } static u8 ListMenuInitInternal(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove) { u8 listTaskId = CreateTask(ListMenuDummyTask, 0); struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; list->template = *listMenuTemplate; list->cursorPos = cursorPos; list->itemsAbove = itemsAbove; list->unk_1C = 0; list->unk_1D = 0; list->taskId = TAIL_SENTINEL; list->unk_1F = 0; gListMenuOverride.cursorPal = list->template.cursorPal; gListMenuOverride.fillValue = list->template.fillValue; gListMenuOverride.cursorShadowPal = list->template.cursorShadowPal; gListMenuOverride.lettersSpacing = list->template.lettersSpacing; gListMenuOverride.fontId = list->template.fontId; gListMenuOverride.enabled = FALSE; if (list->template.totalItems < list->template.maxShowed) list->template.maxShowed = list->template.totalItems; FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue)); ListMenuPrintEntries(list, list->cursorPos, 0, list->template.maxShowed); ListMenuDrawCursor(list); ListMenuCallSelectionChangedCallback(list, TRUE); return listTaskId; } static void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y) { u8 colors[3]; if (gListMenuOverride.enabled) { colors[0] = gListMenuOverride.fillValue; colors[1] = gListMenuOverride.cursorPal; colors[2] = gListMenuOverride.cursorShadowPal; AddTextPrinterParameterized4(list->template.windowId, gListMenuOverride.fontId, x, y, gListMenuOverride.lettersSpacing, 0, colors, TEXT_SKIP_DRAW, str); gListMenuOverride.enabled = FALSE; } else { colors[0] = list->template.fillValue; colors[1] = list->template.cursorPal; colors[2] = list->template.cursorShadowPal; AddTextPrinterParameterized4(list->template.windowId, list->template.fontId, x, y, list->template.lettersSpacing, 0, colors, TEXT_SKIP_DRAW, str); } } static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count) { s32 i; u8 x, y; u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; for (i = 0; i < count; i++) { if (list->template.items[startIndex].index != LIST_HEADER) x = list->template.item_X; else x = list->template.header_X; y = (yOffset + i) * yMultiplier + list->template.upText_Y; if (list->template.itemPrintFunc != NULL) list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].index, y); ListMenuPrint(list, list->template.items[startIndex].label, x, y); startIndex++; } } static void ListMenuDrawCursor(struct ListMenu *list) { u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; u8 x = list->template.cursor_X; u8 y = list->itemsAbove * yMultiplier + list->template.upText_Y; switch (list->template.cursorKind) { case 0: ListMenuPrint(list, gText_SelectorArrow2, x, y); break; case 1: break; case 2: if (list->taskId == TAIL_SENTINEL) list->taskId = ListMenuAddCursorObject(list, 0); ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 - 1, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y - 1, 0); break; case 3: if (list->taskId == TAIL_SENTINEL) list->taskId = ListMenuAddCursorObject(list, 1); ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 + x, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y, 1); break; } } static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind) { struct CursorStruct cursor; cursor.left = 0; cursor.top = 160; cursor.rowWidth = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8 + 2; cursor.rowHeight = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + 2; cursor.tileTag = 0x4000; cursor.palTag = TAG_NONE; cursor.palNum = 15; return ListMenuAddCursorObjectInternal(&cursor, cursorKind); } static void ListMenuErasePrintedCursor(struct ListMenu *list, u16 itemsAbove) { u8 cursorKind = list->template.cursorKind; if (cursorKind == 0) { u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; u8 width = GetMenuCursorDimensionByFont(list->template.fontId, 0); u8 height = GetMenuCursorDimensionByFont(list->template.fontId, 1); FillWindowPixelRect(list->template.windowId, PIXEL_FILL(list->template.fillValue), list->template.cursor_X, itemsAbove * yMultiplier + list->template.upText_Y, width, height); } } static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, bool8 movingDown) { u16 itemsAbove = list->itemsAbove; u16 cursorPos = list->cursorPos; u16 newRow; u32 newScroll; if (!movingDown) { if (list->template.maxShowed == 1) newRow = 0; else newRow = list->template.maxShowed - ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)) - 1; if (cursorPos == 0) { while (itemsAbove != 0) { itemsAbove--; if (list->template.items[cursorPos + itemsAbove].index != LIST_HEADER) { list->itemsAbove = itemsAbove; return 1; } } return 0; } else { while (itemsAbove > newRow) { itemsAbove--; if (list->template.items[cursorPos + itemsAbove].index != LIST_HEADER) { list->itemsAbove = itemsAbove; return 1; } } newScroll = cursorPos - 1; } } else { if (list->template.maxShowed == 1) newRow = 0; else newRow = ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)); if (cursorPos == list->template.totalItems - list->template.maxShowed) { while (itemsAbove < list->template.maxShowed - 1) { itemsAbove++; if (list->template.items[cursorPos + itemsAbove].index != LIST_HEADER) { list->itemsAbove = itemsAbove; return 1; } } return 0; } else { while (itemsAbove < newRow) { itemsAbove++; if (list->template.items[cursorPos + itemsAbove].index != LIST_HEADER) { list->itemsAbove = itemsAbove; return 1; } } newScroll = cursorPos + 1; } } list->itemsAbove = newRow; list->cursorPos = newScroll; return 2; } static void ListMenuScroll(struct ListMenu *list, u8 count, bool8 movingDown) { if (count >= list->template.maxShowed) { FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue)); ListMenuPrintEntries(list, list->cursorPos, 0, list->template.maxShowed); } else { u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; if (!movingDown) { u16 y, width, height; ScrollWindow(list->template.windowId, 1, count * yMultiplier, PIXEL_FILL(list->template.fillValue)); ListMenuPrintEntries(list, list->cursorPos, 0, count); y = (list->template.maxShowed * yMultiplier) + list->template.upText_Y; width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8; height = (GetWindowAttribute(list->template.windowId, WINDOW_HEIGHT) * 8) - y; FillWindowPixelRect(list->template.windowId, PIXEL_FILL(list->template.fillValue), 0, y, width, height); } else { u16 width; ScrollWindow(list->template.windowId, 0, count * yMultiplier, PIXEL_FILL(list->template.fillValue)); ListMenuPrintEntries(list, list->cursorPos + (list->template.maxShowed - count), list->template.maxShowed - count, count); width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8; FillWindowPixelRect(list->template.windowId, PIXEL_FILL(list->template.fillValue), 0, 0, width, list->template.upText_Y); } } } static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown) { u16 oldSelectedRow; u8 selectionChange, i, cursorCount; oldSelectedRow = list->itemsAbove; cursorCount = 0; selectionChange = 0; for (i = 0; i < count; i++) { do { u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown); selectionChange |= ret; if (ret != 2) break; cursorCount++; } while (list->template.items[list->cursorPos + list->itemsAbove].index == LIST_HEADER); } if (updateCursorAndCallCallback) { switch (selectionChange) { case 0: default: return TRUE; case 1: ListMenuErasePrintedCursor(list, oldSelectedRow); ListMenuDrawCursor(list); ListMenuCallSelectionChangedCallback(list, FALSE); CopyWindowToVram(list->template.windowId, COPYWIN_GFX); break; case 2: case 3: ListMenuErasePrintedCursor(list, oldSelectedRow); ListMenuScroll(list, cursorCount, movingDown); ListMenuDrawCursor(list); ListMenuCallSelectionChangedCallback(list, FALSE); CopyWindowToVram(list->template.windowId, COPYWIN_GFX); break; } } return FALSE; } static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit) { if (list->template.moveCursorFunc != NULL) list->template.moveCursorFunc(list->template.items[list->cursorPos + list->itemsAbove].index, onInit, list); } void ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal) { gListMenuOverride.cursorPal = cursorPal; gListMenuOverride.fillValue = fillValue; gListMenuOverride.cursorShadowPal = cursorShadowPal; gListMenuOverride.enabled = TRUE; } void ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) { if (!onInit) PlaySE(SE_SELECT); } static s32 ListMenuGetTemplateField(u8 taskId, u8 field) { struct ListMenu *data = (struct ListMenu *)gTasks[taskId].data; switch (field) { case LISTFIELD_MOVECURSORFUNC: case LISTFIELD_MOVECURSORFUNC2: return (s32)(data->template.moveCursorFunc); case LISTFIELD_TOTALITEMS: return data->template.totalItems; case LISTFIELD_MAXSHOWED: return data->template.maxShowed; case LISTFIELD_WINDOWID: return data->template.windowId; case LISTFIELD_HEADERX: return data->template.header_X; case LISTFIELD_ITEMX: return data->template.item_X; case LISTFIELD_CURSORX: return data->template.cursor_X; case LISTFIELD_UPTEXTY: return data->template.upText_Y; case LISTFIELD_CURSORPAL: return data->template.cursorPal; case LISTFIELD_FILLVALUE: return data->template.fillValue; case LISTFIELD_CURSORSHADOWPAL: return data->template.cursorShadowPal; case LISTFIELD_LETTERSPACING: return data->template.lettersSpacing; case LISTFIELD_ITEMVERTICALPADDING: return data->template.itemVerticalPadding; case LISTFIELD_SCROLLMULTIPLE: return data->template.scrollMultiple; case LISTFIELD_FONTID: return data->template.fontId; case LISTFIELD_CURSORKIND: return data->template.cursorKind; default: return -1; } } void ListMenuSetTemplateField(u8 taskId, u8 field, s32 value) { struct ListMenu *data = (struct ListMenu *)gTasks[taskId].data; switch (field) { case LISTFIELD_MOVECURSORFUNC: case LISTFIELD_MOVECURSORFUNC2: data->template.moveCursorFunc = (void *)value; break; case LISTFIELD_TOTALITEMS: data->template.totalItems = value; break; case LISTFIELD_MAXSHOWED: data->template.maxShowed = value; break; case LISTFIELD_WINDOWID: data->template.windowId = value; break; case LISTFIELD_HEADERX: data->template.header_X = value; break; case LISTFIELD_ITEMX: data->template.item_X = value; break; case LISTFIELD_CURSORX: data->template.cursor_X = value; break; case LISTFIELD_UPTEXTY: data->template.upText_Y = value; break; case LISTFIELD_CURSORPAL: data->template.cursorPal = value; break; case LISTFIELD_FILLVALUE: data->template.fillValue = value; break; case LISTFIELD_CURSORSHADOWPAL: data->template.cursorShadowPal = value; break; case LISTFIELD_LETTERSPACING: data->template.lettersSpacing = value; break; case LISTFIELD_ITEMVERTICALPADDING: data->template.itemVerticalPadding = value; break; case LISTFIELD_SCROLLMULTIPLE: data->template.scrollMultiple = value; break; case LISTFIELD_FONTID: data->template.fontId = value; break; case LISTFIELD_CURSORKIND: data->template.cursorKind = value; break; } } void ListMenu_LoadMonIconPalette(u8 palOffset, u16 speciesId) { LoadPalette(GetValidMonIconPalettePtr(speciesId), palOffset, PLTT_SIZE_4BPP); } void ListMenu_DrawMonIconGraphics(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y) { BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32); } void ListMenuLoadStdPalAt(u8 palOffset, u8 palId) { const u16 *palette; switch (palId) { case 0: default: palette = gMenuInfoElements1_Pal; break; case 1: palette = gMenuInfoElements2_Pal; break; } LoadPalette(palette, palOffset, PLTT_SIZE_4BPP); } void BlitMenuInfoIcon(u8 windowId, u8 iconId, u16 x, u16 y) { BlitBitmapRectToWindow(windowId, &gMenuInfoElements_Gfx[sMenuInfoIcons[iconId].offset * TILE_SIZE_4BPP], 0, 0, 128, 128, x, y, sMenuInfoIcons[iconId].width, sMenuInfoIcons[iconId].height); } ================================================ FILE: src/load_save.c ================================================ #include "global.h" #include "gflib.h" #include "gba/flash_internal.h" #include "load_save.h" #include "pokemon.h" #include "pokemon_storage_system.h" #include "random.h" #include "item.h" #include "save_location.h" #include "berry_powder.h" #include "overworld.h" #include "quest_log.h" #include "constants/items.h" #define SAVEBLOCK_MOVE_RANGE 128 struct LoadedSaveData { /*0x0000*/ struct ItemSlot items[BAG_ITEMS_COUNT]; /*0x0078*/ struct ItemSlot keyItems[BAG_KEYITEMS_COUNT]; /*0x00F0*/ struct ItemSlot pokeBalls[BAG_POKEBALLS_COUNT]; /*0x0130*/ struct ItemSlot TMsHMs[BAG_TMHM_COUNT]; /*0x0230*/ struct ItemSlot berries[BAG_BERRIES_COUNT]; /*0x02E8*/ struct Mail mail[MAIL_COUNT]; struct ItemSlot medicine[BAG_MEDICINE_COUNT]; struct ItemSlot heldItems[BAG_HELD_ITEMS_COUNT]; }; // EWRAM DATA EWRAM_DATA struct SaveBlock2 gSaveBlock2 = {0}; EWRAM_DATA u8 gSaveBlock2_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; EWRAM_DATA struct SaveBlock1 gSaveBlock1 = {0}; EWRAM_DATA u8 gSaveBlock1_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; EWRAM_DATA u8 gSaveBlock3_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0}; EWRAM_DATA u32 gLastEncryptionKey = 0; // IWRAM common bool32 gFlashMemoryPresent; struct SaveBlock1 *gSaveBlock1Ptr; struct SaveBlock2 *gSaveBlock2Ptr; struct PokemonStorage *gPokemonStoragePtr; extern struct ItemSlot gKeyItemSlots[BAG_KEYITEMS_COUNT]; void CheckForFlashMemory(void) { if (!IdentifyFlash()) { gFlashMemoryPresent = TRUE; InitFlashTimer(); } else { gFlashMemoryPresent = FALSE; } } void ClearSav2(void) { CpuFill16(0, &gSaveBlock2, sizeof(struct SaveBlock2) + sizeof(gSaveBlock2_DMA)); } void ClearSav1(void) { CpuFill16(0, &gSaveBlock1, sizeof(struct SaveBlock1) + sizeof(gSaveBlock1_DMA)); } void SetSaveBlocksPointers(void) { u32 offset; struct SaveBlock1** sav1_LocalVar = &gSaveBlock1Ptr; void *oldSave = (void *)gSaveBlock1Ptr; offset = (Random()) & ((SAVEBLOCK_MOVE_RANGE - 1) & ~3); gSaveBlock2Ptr = (void *)(&gSaveBlock2) + offset; *sav1_LocalVar = (void *)(&gSaveBlock1) + offset; gPokemonStoragePtr = (void *)(&gPokemonStorage) + offset; SetBagPocketsPointers(); QL_AddASLROffset(oldSave); } void MoveSaveBlocks_ResetHeap(void) { void *vblankCB, *hblankCB; u32 encryptionKey; struct SaveBlock2 *saveBlock2Copy; struct SaveBlock1 *saveBlock1Copy; struct PokemonStorage *pokemonStorageCopy; // save interrupt functions and turn them off vblankCB = gMain.vblankCallback; hblankCB = gMain.hblankCallback; gMain.vblankCallback = NULL; gMain.hblankCallback = NULL; gMain.vblankCounter1 = NULL; saveBlock2Copy = (struct SaveBlock2 *)(gHeap); saveBlock1Copy = (struct SaveBlock1 *)(gHeap + sizeof(struct SaveBlock2)); pokemonStorageCopy = (struct PokemonStorage *)(gHeap + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1)); // backup the saves. *saveBlock2Copy = *gSaveBlock2Ptr; *saveBlock1Copy = *gSaveBlock1Ptr; *pokemonStorageCopy = *gPokemonStoragePtr; // change saveblocks' pointers SetSaveBlocksPointers(); // unlike Emerald, this does not use // the trainer ID sum for an offset. // restore saveblock data since the pointers changed *gSaveBlock2Ptr = *saveBlock2Copy; *gSaveBlock1Ptr = *saveBlock1Copy; *gPokemonStoragePtr = *pokemonStorageCopy; // heap was destroyed in the copying process, so reset it InitHeap(gHeap, HEAP_SIZE); // restore interrupt functions gMain.hblankCallback = hblankCB; gMain.vblankCallback = vblankCB; // create a new encryption key encryptionKey = (Random() << 0x10) + (Random()); ApplyNewEncryptionKeyToAllEncryptedData(encryptionKey); gSaveBlock2Ptr->encryptionKey = encryptionKey; } u32 UseContinueGameWarp(void) { return gSaveBlock2Ptr->specialSaveWarpFlags & CONTINUE_GAME_WARP; } void ClearContinueGameWarpStatus(void) { gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP; } void SetContinueGameWarpStatus(void) { gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP; } void SetContinueGameWarpStatusToDynamicWarp(void) { SetContinueGameWarpToDynamicWarp(0); gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP; } void ClearContinueGameWarpStatus2(void) { gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP; } void SavePlayerParty(void) { int i; gSaveBlock1Ptr->playerPartyCount = gPlayerPartyCount; for (i = 0; i < PARTY_SIZE; i++) gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i]; } void LoadPlayerParty(void) { int i; gPlayerPartyCount = gSaveBlock1Ptr->playerPartyCount; for (i = 0; i < PARTY_SIZE; i++) gPlayerParty[i] = gSaveBlock1Ptr->playerParty[i]; } void SaveObjectEvents(void) { int i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) gSaveBlock1Ptr->objectEvents[i] = gObjectEvents[i]; } void LoadObjectEvents(void) { int i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) gObjectEvents[i] = gSaveBlock1Ptr->objectEvents[i]; } void SaveSerializedGame(void) { SavePlayerParty(); SaveObjectEvents(); SerializeKeyItemSlots(); } void LoadSerializedGame(void) { LoadPlayerParty(); LoadObjectEvents(); DeserializeTmHmItemSlots(); DeserializeKeyItemSlots(); } void SerializeKeyItemSlots(void) { u32 i; for (i = 0; i < BAG_KEYITEMS_COUNT; i++) { if(gKeyItemSlots[i].itemId > 258 && gKeyItemSlots[i].itemId < 289) //RS Key Items { gSaveBlock1Ptr->bagPocket_KeyItems[i] = (u8)(gKeyItemSlots[i].itemId - 258); } if(gKeyItemSlots[i].itemId > 348) //FRLGE Key Items { gSaveBlock1Ptr->bagPocket_KeyItems[i] = (u8)(gKeyItemSlots[i].itemId - 348 + 30); } if(gKeyItemSlots[i].itemId == ITEM_LINK_BRACELET) { gSaveBlock1Ptr->bagPocket_KeyItems[i] = 59; } } } void LoadPlayerBag(void) { int i; // load player items. for (i = 0; i < BAG_ITEMS_COUNT; i++) gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i]; // load player key items. for (i = 0; i < BAG_KEYITEMS_COUNT; i++) gLoadedSaveData.keyItems[i] = gKeyItemSlots[i]; // load player pokeballs. for (i = 0; i < BAG_POKEBALLS_COUNT; i++) gLoadedSaveData.pokeBalls[i] = gSaveBlock1Ptr->bagPocket_PokeBalls[i]; // load player TMs and HMs. for (i = 0; i < BAG_TMHM_COUNT; i++) gLoadedSaveData.TMsHMs[i] = gTmHmItemSlots[i]; // load player berries. for (i = 0; i < BAG_BERRIES_COUNT; i++) gLoadedSaveData.berries[i] = gSaveBlock1Ptr->bagPocket_Berries[i]; // load mail. for (i = 0; i < MAIL_COUNT; i++) gLoadedSaveData.mail[i] = gSaveBlock1Ptr->mail[i]; // load player medicine. for (i = 0; i < BAG_BERRIES_COUNT; i++) gLoadedSaveData.medicine[i] = gSaveBlock1Ptr->bagPocket_Medicine[i]; // load player held items. for (i = 0; i < BAG_BERRIES_COUNT; i++) gLoadedSaveData.heldItems[i] = gSaveBlock1Ptr->bagPocket_HoldItems[i]; gLastEncryptionKey = gSaveBlock2Ptr->encryptionKey; } void SavePlayerBag(void) { int i; u32 encryptionKeyBackup; // save player items. for (i = 0; i < BAG_ITEMS_COUNT; i++) gSaveBlock1Ptr->bagPocket_Items[i] = gLoadedSaveData.items[i]; // save player key items. for (i = 0; i < BAG_KEYITEMS_COUNT; i++) { if(gLoadedSaveData.keyItems[i].itemId > 258 && gLoadedSaveData.keyItems[i].itemId < 289) //RS Key Items { gSaveBlock1Ptr->bagPocket_KeyItems[i] = (u8)(gLoadedSaveData.keyItems[i].itemId - 258); } if(gLoadedSaveData.keyItems[i].itemId > 348) //FRLGE Key Items { gSaveBlock1Ptr->bagPocket_KeyItems[i] = (u8)(gLoadedSaveData.keyItems[i].itemId - 348 + 30); } if(gLoadedSaveData.keyItems[i].itemId == ITEM_LINK_BRACELET) { gSaveBlock1Ptr->bagPocket_KeyItems[i] = 59; } } // save player pokeballs. for (i = 0; i < BAG_POKEBALLS_COUNT; i++) gSaveBlock1Ptr->bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i]; // save player TMs and HMs. for (i = 0; i < BAG_TMHM_COUNT; i++) gTmHmItemSlots[i] = gLoadedSaveData.TMsHMs[i]; // save player berries. for (i = 0; i < BAG_BERRIES_COUNT; i++) gSaveBlock1Ptr->bagPocket_Berries[i] = gLoadedSaveData.berries[i]; // save mail. for (i = 0; i < MAIL_COUNT; i++) gSaveBlock1Ptr->mail[i] = gLoadedSaveData.mail[i]; // save player medicine. for (i = 0; i < BAG_BERRIES_COUNT; i++) gSaveBlock1Ptr->bagPocket_Medicine[i] = gLoadedSaveData.medicine[i]; // save player held items. for (i = 0; i < BAG_BERRIES_COUNT; i++) gSaveBlock1Ptr->bagPocket_HoldItems[i] = gLoadedSaveData.heldItems[i]; encryptionKeyBackup = gSaveBlock2Ptr->encryptionKey; gSaveBlock2Ptr->encryptionKey = gLastEncryptionKey; ApplyNewEncryptionKeyToBagItems(encryptionKeyBackup); gSaveBlock2Ptr->encryptionKey = encryptionKeyBackup; } void ApplyNewEncryptionKeyToHword(u16 *hWord, u32 newKey) { *hWord ^= gSaveBlock2Ptr->encryptionKey; *hWord ^= newKey; } void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey) { *word ^= gSaveBlock2Ptr->encryptionKey; *word ^= newKey; } void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey) { int i; for(i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->trainerTower[i].bestTime, encryptionKey); ApplyNewEncryptionKeyToGameStats(encryptionKey); ApplyNewEncryptionKeyToBagItems_(encryptionKey); ApplyNewEncryptionKeyToBerryPowder(encryptionKey); ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->money, encryptionKey); ApplyNewEncryptionKeyToHword(&gSaveBlock1Ptr->coins, encryptionKey); } ================================================ FILE: src/m4a.c ================================================ #include #include "gba/m4a_internal.h" extern const u8 gCgb3Vol[]; #define BSS_CODE __attribute__((section(".bss.code"))) BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0}; struct SoundInfo gSoundInfo; struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES]; struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES]; MPlayFunc gMPlayJumpTable[36]; struct CgbChannel gCgbChans[4]; struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2]; struct PokemonCrySong gPokemonCrySong; struct MusicPlayerInfo gMPlayInfo_BGM; struct MusicPlayerInfo gMPlayInfo_SE1; struct MusicPlayerInfo gMPlayInfo_SE2; struct MusicPlayerInfo gMPlayInfo_SE3; u8 gMPlayMemAccArea[0x10]; u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) { u32 val1; u32 val2; u32 fineAdjustShifted = fineAdjust << 24; if (key > 178) { key = 178; fineAdjustShifted = 255 << 24; } val1 = gScaleTable[key]; val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); val2 = gScaleTable[key + 1]; val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); } void UnusedDummyFunc(void) { } void MPlayContinue(struct MusicPlayerInfo *mplayInfo) { if (mplayInfo->ident == ID_NUMBER) { mplayInfo->ident++; mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; mplayInfo->ident = ID_NUMBER; } } void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) { if (mplayInfo->ident == ID_NUMBER) { mplayInfo->ident++; mplayInfo->fadeOC = speed; mplayInfo->fadeOI = speed; mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); mplayInfo->ident = ID_NUMBER; } } void m4aSoundInit(void) { s32 i; CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); SoundInit(&gSoundInfo); MPlayExtender(gCgbChans); m4aSoundMode(SOUND_MODE_DA_BIT_8 | SOUND_MODE_FREQ_13379 | (12 << SOUND_MODE_MASVOL_SHIFT) | (5 << SOUND_MODE_MAXCHN_SHIFT)); for (i = 0; i < NUM_MUSIC_PLAYERS; i++) { struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); mplayInfo->unk_B = gMPlayTable[i].unk_A; mplayInfo->memAccArea = gMPlayMemAccArea; } memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong)); for (i = 0; i < MAX_POKEMON_CRIES; i++) { struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i]; struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; MPlayOpen(mplayInfo, track, 2); track->chan = 0; } } void m4aSoundMain(void) { SoundMain(); } void m4aSongNumStart(u16 n) { const struct MusicPlayer *mplayTable = gMPlayTable; const struct Song *songTable = gSongTable; const struct Song *song = &songTable[n]; const struct MusicPlayer *mplay = &mplayTable[song->ms]; MPlayStart(mplay->info, song->header); } void m4aSongNumStartOrChange(u16 n) { const struct MusicPlayer *mplayTable = gMPlayTable; const struct Song *songTable = gSongTable; const struct Song *song = &songTable[n]; const struct MusicPlayer *mplay = &mplayTable[song->ms]; if (mplay->info->songHeader != song->header) { MPlayStart(mplay->info, song->header); } else { if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) { MPlayStart(mplay->info, song->header); } } } void m4aSongNumStartOrContinue(u16 n) { const struct MusicPlayer *mplayTable = gMPlayTable; const struct Song *songTable = gSongTable; const struct Song *song = &songTable[n]; const struct MusicPlayer *mplay = &mplayTable[song->ms]; if (mplay->info->songHeader != song->header) MPlayStart(mplay->info, song->header); else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) MPlayStart(mplay->info, song->header); else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) MPlayContinue(mplay->info); } void m4aSongNumStop(u16 n) { const struct MusicPlayer *mplayTable = gMPlayTable; const struct Song *songTable = gSongTable; const struct Song *song = &songTable[n]; const struct MusicPlayer *mplay = &mplayTable[song->ms]; if (mplay->info->songHeader == song->header) m4aMPlayStop(mplay->info); } void m4aSongNumContinue(u16 n) { const struct MusicPlayer *mplayTable = gMPlayTable; const struct Song *songTable = gSongTable; const struct Song *song = &songTable[n]; const struct MusicPlayer *mplay = &mplayTable[song->ms]; if (mplay->info->songHeader == song->header) MPlayContinue(mplay->info); } void m4aMPlayAllStop(void) { s32 i; for (i = 0; i < NUM_MUSIC_PLAYERS; i++) m4aMPlayStop(gMPlayTable[i].info); for (i = 0; i < MAX_POKEMON_CRIES; i++) m4aMPlayStop(&gPokemonCryMusicPlayers[i]); } void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) { MPlayContinue(mplayInfo); } void m4aMPlayAllContinue(void) { s32 i; for (i = 0; i < NUM_MUSIC_PLAYERS; i++) MPlayContinue(gMPlayTable[i].info); for (i = 0; i < MAX_POKEMON_CRIES; i++) MPlayContinue(&gPokemonCryMusicPlayers[i]); } void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) { MPlayFadeOut(mplayInfo, speed); } void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed) { if (mplayInfo->ident == ID_NUMBER) { mplayInfo->ident++; mplayInfo->fadeOC = speed; mplayInfo->fadeOI = speed; mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; mplayInfo->ident = ID_NUMBER; } } void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) { if (mplayInfo->ident == ID_NUMBER) { mplayInfo->ident++; mplayInfo->fadeOC = speed; mplayInfo->fadeOI = speed; mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; mplayInfo->ident = ID_NUMBER; } } void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) { s32 trackCount = mplayInfo->trackCount; struct MusicPlayerTrack *track = mplayInfo->tracks; while (trackCount > 0) { if (track->flags & MPT_FLG_EXIST) { if (track->flags & MPT_FLG_START) { Clear64byte(track); track->flags = MPT_FLG_EXIST; track->bendRange = 2; track->volX = 64; track->lfoSpeed = 22; track->tone.type = 1; } } trackCount--; track++; } } void MPlayExtender(struct CgbChannel *cgbChans) { struct SoundInfo *soundInfo; u32 ident; REG_SOUNDCNT_X = SOUND_MASTER_ENABLE | SOUND_4_ON | SOUND_3_ON | SOUND_2_ON | SOUND_1_ON; REG_SOUNDCNT_L = 0; // set master volume to zero REG_NR12 = 0x8; REG_NR22 = 0x8; REG_NR42 = 0x8; REG_NR14 = 0x80; REG_NR24 = 0x80; REG_NR44 = 0x80; REG_NR30 = 0; REG_NR50 = 0x77; soundInfo = SOUND_INFO_PTR; ident = soundInfo->ident; if (ident != ID_NUMBER) return; soundInfo->ident++; gMPlayJumpTable[8] = ply_memacc; gMPlayJumpTable[17] = ply_lfos; gMPlayJumpTable[19] = ply_mod; gMPlayJumpTable[28] = ply_xcmd; gMPlayJumpTable[29] = ply_endtie; gMPlayJumpTable[30] = SampleFreqSet; gMPlayJumpTable[31] = TrackStop; gMPlayJumpTable[32] = FadeOutBody; gMPlayJumpTable[33] = TrkVolPitSet; soundInfo->cgbChans = cgbChans; soundInfo->CgbSound = CgbSound; soundInfo->CgbOscOff = CgbOscOff; soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; soundInfo->maxLines = MAX_LINES; CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); cgbChans[0].type = 1; cgbChans[0].panMask = 0x11; cgbChans[1].type = 2; cgbChans[1].panMask = 0x22; cgbChans[2].type = 3; cgbChans[2].panMask = 0x44; cgbChans[3].type = 4; cgbChans[3].panMask = 0x88; soundInfo->ident = ident; } void MusicPlayerJumpTableCopy(void) { asm("swi 0x2A"); } void ClearChain(void *x) { void (*func)(void *) = *(&gMPlayJumpTable[34]); func(x); } void Clear64byte(void *x) { void (*func)(void *) = *(&gMPlayJumpTable[35]); func(x); } void SoundInit(struct SoundInfo *soundInfo) { soundInfo->ident = 0; if (REG_DMA1CNT & (DMA_REPEAT << 16)) REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; if (REG_DMA2CNT & (DMA_REPEAT << 16)) REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; REG_DMA1CNT_H = DMA_32BIT; REG_DMA2CNT_H = DMA_32BIT; REG_SOUNDCNT_X = SOUND_MASTER_ENABLE | SOUND_4_ON | SOUND_3_ON | SOUND_2_ON | SOUND_1_ON; REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT | SOUND_ALL_MIX_FULL; REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; REG_DMA1SAD = (s32)soundInfo->pcmBuffer; REG_DMA1DAD = (s32)®_FIFO_A; REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; REG_DMA2DAD = (s32)®_FIFO_B; SOUND_INFO_PTR = soundInfo; CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); soundInfo->maxChans = 8; soundInfo->masterVolume = 15; soundInfo->plynote = ply_note; soundInfo->CgbSound = DummyFunc; soundInfo->CgbOscOff = (CgbOscOffFunc)DummyFunc; soundInfo->MidiKeyToCgbFreq = (MidiKeyToCgbFreqFunc)DummyFunc; soundInfo->ExtVolPit = (ExtVolPitFunc)DummyFunc; MPlayJumpTableCopy(gMPlayJumpTable); soundInfo->MPlayJumpTable = gMPlayJumpTable; SampleFreqSet(SOUND_MODE_FREQ_13379); soundInfo->ident = ID_NUMBER; } void SampleFreqSet(u32 freq) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; freq = (freq & 0xF0000) >> 16; soundInfo->freq = freq; soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; // LCD refresh rate 59.7275Hz soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; // CPU frequency 16.78Mhz soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; // Turn off timer 0. REG_TM0CNT_H = 0; // cycles per LCD fresh 280896 REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); m4aSoundVSyncOn(); while (*(vu8 *)REG_ADDR_VCOUNT == 159) ; while (*(vu8 *)REG_ADDR_VCOUNT != 159) ; REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; } void m4aSoundMode(u32 mode) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; u32 temp; if (soundInfo->ident != ID_NUMBER) return; soundInfo->ident++; temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); if (temp) soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; temp = mode & SOUND_MODE_MAXCHN; if (temp) { struct SoundChannel *chan; soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; temp = MAX_DIRECTSOUND_CHANNELS; chan = &soundInfo->chans[0]; while (temp != 0) { chan->statusFlags = 0; temp--; chan++; } } temp = mode & SOUND_MODE_MASVOL; if (temp) soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; temp = mode & SOUND_MODE_DA_BIT; if (temp) { temp = (temp & 0x300000) >> 14; REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; } temp = mode & SOUND_MODE_FREQ; if (temp) { m4aSoundVSyncOff(); SampleFreqSet(temp); } soundInfo->ident = ID_NUMBER; } void SoundClear(void) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; s32 i; void *chan; if (soundInfo->ident != ID_NUMBER) return; soundInfo->ident++; i = MAX_DIRECTSOUND_CHANNELS; chan = &soundInfo->chans[0]; while (i > 0) { ((struct SoundChannel *)chan)->statusFlags = 0; i--; chan = (void *)((s32)chan + sizeof(struct SoundChannel)); } chan = soundInfo->cgbChans; if (chan) { i = 1; while (i <= 4) { soundInfo->CgbOscOff(i); ((struct CgbChannel *)chan)->statusFlags = 0; i++; chan = (void *)((s32)chan + sizeof(struct CgbChannel)); } } soundInfo->ident = ID_NUMBER; } void m4aSoundVSyncOff(void) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) { soundInfo->ident += 10; if (REG_DMA1CNT & (DMA_REPEAT << 16)) REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; if (REG_DMA2CNT & (DMA_REPEAT << 16)) REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; REG_DMA1CNT_H = DMA_32BIT; REG_DMA2CNT_H = DMA_32BIT; CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); } } void m4aSoundVSyncOn(void) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; u32 ident = soundInfo->ident; if (ident == ID_NUMBER) return; REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; soundInfo->pcmDmaCounter = 0; soundInfo->ident = ident - 10; } void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) { struct SoundInfo *soundInfo; if (trackCount == 0) return; if (trackCount > MAX_MUSICPLAYER_TRACKS) trackCount = MAX_MUSICPLAYER_TRACKS; soundInfo = SOUND_INFO_PTR; if (soundInfo->ident != ID_NUMBER) return; soundInfo->ident++; Clear64byte(mplayInfo); mplayInfo->tracks = tracks; mplayInfo->trackCount = trackCount; mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; while (trackCount != 0) { tracks->flags = 0; trackCount--; tracks++; } // append music player and MPlayMain to linked list if (soundInfo->MPlayMainHead != NULL) { mplayInfo->MPlayMainNext = soundInfo->MPlayMainHead; mplayInfo->musicPlayerNext = soundInfo->musicPlayerHead; // NULL assignment semantically useless, but required for match soundInfo->MPlayMainHead = NULL; } soundInfo->musicPlayerHead = mplayInfo; soundInfo->MPlayMainHead = MPlayMain; soundInfo->ident = ID_NUMBER; mplayInfo->ident = ID_NUMBER; } void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) { s32 i; u8 unk_B; struct MusicPlayerTrack *track; if (mplayInfo->ident != ID_NUMBER) return; unk_B = mplayInfo->unk_B; if (!unk_B || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) || (mplayInfo->priority <= songHeader->priority)) { mplayInfo->ident++; mplayInfo->status = 0; mplayInfo->songHeader = songHeader; mplayInfo->tone = songHeader->tone; mplayInfo->priority = songHeader->priority; mplayInfo->clock = 0; mplayInfo->tempoD = 150; mplayInfo->tempoI = 150; mplayInfo->tempoU = 0x100; mplayInfo->tempoC = 0; mplayInfo->fadeOI = 0; i = 0; track = mplayInfo->tracks; while (i < songHeader->trackCount && i < mplayInfo->trackCount) { TrackStop(mplayInfo, track); track->flags = MPT_FLG_EXIST | MPT_FLG_START; track->chan = 0; track->cmdPtr = songHeader->part[i]; i++; track++; } while (i < mplayInfo->trackCount) { TrackStop(mplayInfo, track); track->flags = 0; i++; track++; } if (songHeader->reverb & SOUND_MODE_REVERB_SET) m4aSoundMode(songHeader->reverb); mplayInfo->ident = ID_NUMBER; } } void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) { s32 i; struct MusicPlayerTrack *track; if (mplayInfo->ident != ID_NUMBER) return; mplayInfo->ident++; mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; i = mplayInfo->trackCount; track = mplayInfo->tracks; while (i > 0) { TrackStop(mplayInfo, track); i--; track++; } mplayInfo->ident = ID_NUMBER; } void FadeOutBody(struct MusicPlayerInfo *mplayInfo) { s32 i; struct MusicPlayerTrack *track; u16 fadeOV; if (mplayInfo->fadeOI == 0) return; if (--mplayInfo->fadeOC != 0) return; mplayInfo->fadeOC = mplayInfo->fadeOI; if (mplayInfo->fadeOV & FADE_IN) { if ((u16)(mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT)) >= (64 << FADE_VOL_SHIFT)) { mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); mplayInfo->fadeOI = 0; } } else { if ((s16)(mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT)) <= 0) { i = mplayInfo->trackCount; track = mplayInfo->tracks; while (i > 0) { u32 val; TrackStop(mplayInfo, track); val = TEMPORARY_FADE; fadeOV = mplayInfo->fadeOV; val &= fadeOV; if (!val) track->flags = 0; i--; track++; } if (mplayInfo->fadeOV & TEMPORARY_FADE) mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; else mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; mplayInfo->fadeOI = 0; return; } } i = mplayInfo->trackCount; track = mplayInfo->tracks; while (i > 0) { if (track->flags & MPT_FLG_EXIST) { fadeOV = mplayInfo->fadeOV; track->volX = (fadeOV >> FADE_VOL_SHIFT); track->flags |= MPT_FLG_VOLCHG; } i--; track++; } } void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { if (track->flags & MPT_FLG_VOLSET) { s32 x; s32 y; x = (u32)(track->vol * track->volX) >> 5; if (track->modT == 1) x = (u32)(x * (track->modM + 128)) >> 7; y = 2 * track->pan + track->panX; if (track->modT == 2) y += track->modM; if (y < -128) y = -128; else if (y > 127) y = 127; track->volMR = (u32)((y + 128) * x) >> 8; track->volML = (u32)((127 - y) * x) >> 8; } if (track->flags & MPT_FLG_PITSET) { s32 bend = track->bend * track->bendRange; s32 x = (track->tune + bend) * 4 + (track->keyShift << 8) + (track->keyShiftX << 8) + track->pitX; if (track->modT == 0) x += 16 * track->modM; track->keyM = x >> 8; track->pitM = x; } track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); } u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) { if (chanNum == 4) { if (key <= 20) { key = 0; } else { key -= 21; if (key > 59) key = 59; } return gNoiseTable[key]; } else { s32 val1; s32 val2; if (key <= 35) { fineAdjust = 0; key = 0; } else { key -= 36; if (key > 130) { key = 130; fineAdjust = 255; } } val1 = gCgbScaleTable[key]; val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); val2 = gCgbScaleTable[key + 1]; val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; } } void CgbOscOff(u8 chanNum) { switch (chanNum) { case 1: REG_NR12 = 8; REG_NR14 = 0x80; break; case 2: REG_NR22 = 8; REG_NR24 = 0x80; break; case 3: REG_NR30 = 0; break; default: REG_NR42 = 8; REG_NR44 = 0x80; } } static inline int CgbPan(struct CgbChannel *chan) { u32 rightVolume = chan->rightVolume; u32 leftVolume = chan->leftVolume; if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) { if (rightVolume / 2 >= leftVolume) { chan->pan = 0x0F; return 1; } } else { if (leftVolume / 2 >= rightVolume) { chan->pan = 0xF0; return 1; } } return 0; } void CgbModVol(struct CgbChannel *chan) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; if ((soundInfo->mode & 1) || !CgbPan(chan)) { chan->pan = 0xFF; chan->envelopeGoal = (u32)(chan->leftVolume + chan->rightVolume); chan->envelopeGoal /= 16; } else { chan->envelopeGoal = (u32)(chan->leftVolume + chan->rightVolume); chan->envelopeGoal /= 16; if (chan->envelopeGoal > 15) chan->envelopeGoal = 15; } chan->sustainGoal = (chan->envelopeGoal * chan->sustain + 15) >> 4; chan->pan &= chan->panMask; } void CgbSound(void) { s32 ch; struct CgbChannel *channels; s32 prevC15; struct SoundInfo *soundInfo = SOUND_INFO_PTR; vu8 *nrx0ptr; vu8 *nrx1ptr; vu8 *nrx2ptr; vu8 *nrx3ptr; vu8 *nrx4ptr; s32 envelopeStepTimeAndDir; // Most comparision operations that cast to s8 perform 'and' by 0xFF. int mask = 0xff; if (soundInfo->c15) soundInfo->c15--; else soundInfo->c15 = 14; for (ch = 1, channels = soundInfo->cgbChans; ch <= 4; ch++, channels++) { if (!(channels->statusFlags & SOUND_CHANNEL_SF_ON)) continue; /* 1. determine hardware channel registers */ switch (ch) { case 1: nrx0ptr = (vu8 *)(REG_ADDR_NR10); nrx1ptr = (vu8 *)(REG_ADDR_NR11); nrx2ptr = (vu8 *)(REG_ADDR_NR12); nrx3ptr = (vu8 *)(REG_ADDR_NR13); nrx4ptr = (vu8 *)(REG_ADDR_NR14); break; case 2: nrx0ptr = (vu8 *)(REG_ADDR_NR10+1); nrx1ptr = (vu8 *)(REG_ADDR_NR21); nrx2ptr = (vu8 *)(REG_ADDR_NR22); nrx3ptr = (vu8 *)(REG_ADDR_NR23); nrx4ptr = (vu8 *)(REG_ADDR_NR24); break; case 3: nrx0ptr = (vu8 *)(REG_ADDR_NR30); nrx1ptr = (vu8 *)(REG_ADDR_NR31); nrx2ptr = (vu8 *)(REG_ADDR_NR32); nrx3ptr = (vu8 *)(REG_ADDR_NR33); nrx4ptr = (vu8 *)(REG_ADDR_NR34); break; default: nrx0ptr = (vu8 *)(REG_ADDR_NR30+1); nrx1ptr = (vu8 *)(REG_ADDR_NR41); nrx2ptr = (vu8 *)(REG_ADDR_NR42); nrx3ptr = (vu8 *)(REG_ADDR_NR43); nrx4ptr = (vu8 *)(REG_ADDR_NR44); break; } prevC15 = soundInfo->c15; envelopeStepTimeAndDir = *nrx2ptr; /* 2. calculate envelope volume */ if (channels->statusFlags & SOUND_CHANNEL_SF_START) { if (!(channels->statusFlags & SOUND_CHANNEL_SF_STOP)) { channels->statusFlags = SOUND_CHANNEL_SF_ENV_ATTACK; channels->modify = CGB_CHANNEL_MO_PIT | CGB_CHANNEL_MO_VOL; CgbModVol(channels); switch (ch) { case 1: *nrx0ptr = channels->sweep; // fallthrough case 2: *nrx1ptr = ((u32)channels->wavePointer << 6) + channels->length; goto init_env_step_time_dir; case 3: if (channels->wavePointer != channels->currentPointer) { *nrx0ptr = 0x40; REG_WAVE_RAM0 = channels->wavePointer[0]; REG_WAVE_RAM1 = channels->wavePointer[1]; REG_WAVE_RAM2 = channels->wavePointer[2]; REG_WAVE_RAM3 = channels->wavePointer[3]; channels->currentPointer = channels->wavePointer; } *nrx0ptr = 0; *nrx1ptr = channels->length; if (channels->length) channels->n4 = 0xC0; else channels->n4 = 0x80; break; default: *nrx1ptr = channels->length; *nrx3ptr = (u32)channels->wavePointer << 3; init_env_step_time_dir: envelopeStepTimeAndDir = channels->attack + CGB_NRx2_ENV_DIR_INC; if (channels->length) channels->n4 = 0x40; else channels->n4 = 0x00; break; } channels->envelopeCounter = channels->attack; if ((s8)(channels->attack & mask)) { channels->envelopeVolume = 0; goto envelope_step_complete; } else { // skip attack phase if attack is instantaneous (=0) goto envelope_decay_start; } } else { goto oscillator_off; } } else if (channels->statusFlags & SOUND_CHANNEL_SF_IEC) { channels->pseudoEchoLength--; if ((s8)(channels->pseudoEchoLength & mask) <= 0) { oscillator_off: CgbOscOff(ch); channels->statusFlags = 0; goto channel_complete; } goto envelope_complete; } else if ((channels->statusFlags & SOUND_CHANNEL_SF_STOP) && (channels->statusFlags & SOUND_CHANNEL_SF_ENV)) { channels->statusFlags &= ~SOUND_CHANNEL_SF_ENV; channels->envelopeCounter = channels->release; if ((s8)(channels->release & mask)) { channels->modify |= CGB_CHANNEL_MO_VOL; if (ch != 3) envelopeStepTimeAndDir = channels->release | CGB_NRx2_ENV_DIR_DEC; goto envelope_step_complete; } else { goto envelope_pseudoecho_start; } } else { envelope_step_repeat: if (channels->envelopeCounter == 0) { if (ch == 3) channels->modify |= CGB_CHANNEL_MO_VOL; CgbModVol(channels); if ((channels->statusFlags & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_RELEASE) { channels->envelopeVolume--; if ((s8)(channels->envelopeVolume & mask) <= 0) { envelope_pseudoecho_start: channels->envelopeVolume = ((channels->envelopeGoal * channels->pseudoEchoVolume) + 0xFF) >> 8; if (channels->envelopeVolume) { channels->statusFlags |= SOUND_CHANNEL_SF_IEC; channels->modify |= CGB_CHANNEL_MO_VOL; if (ch != 3) envelopeStepTimeAndDir = 0 | CGB_NRx2_ENV_DIR_INC; goto envelope_complete; } else { goto oscillator_off; } } else { channels->envelopeCounter = channels->release; } } else if ((channels->statusFlags & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_SUSTAIN) { envelope_sustain: channels->envelopeVolume = channels->sustainGoal; channels->envelopeCounter = 7; } else if ((channels->statusFlags & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_DECAY) { int envelopeVolume, sustainGoal; channels->envelopeVolume--; envelopeVolume = (s8)(channels->envelopeVolume & mask); sustainGoal = (s8)(channels->sustainGoal); if (envelopeVolume <= sustainGoal) { envelope_sustain_start: if (channels->sustain == 0) { channels->statusFlags &= ~SOUND_CHANNEL_SF_ENV; goto envelope_pseudoecho_start; } else { channels->statusFlags--; channels->modify |= CGB_CHANNEL_MO_VOL; if (ch != 3) envelopeStepTimeAndDir = 0 | CGB_NRx2_ENV_DIR_INC; goto envelope_sustain; } } else { channels->envelopeCounter = channels->decay; } } else { channels->envelopeVolume++; if ((u8)(channels->envelopeVolume & mask) >= channels->envelopeGoal) { envelope_decay_start: channels->statusFlags--; channels->envelopeCounter = channels->decay; if ((u8)(channels->envelopeCounter & mask)) { channels->modify |= CGB_CHANNEL_MO_VOL; channels->envelopeVolume = channels->envelopeGoal; if (ch != 3) envelopeStepTimeAndDir = channels->decay | CGB_NRx2_ENV_DIR_DEC; } else { goto envelope_sustain_start; } } else { channels->envelopeCounter = channels->attack; } } } } envelope_step_complete: // every 15 frames, envelope calculation has to be done twice // to keep up with the hardware envelope rate (1/64 s) channels->envelopeCounter--; if (prevC15 == 0) { prevC15--; goto envelope_step_repeat; } envelope_complete: /* 3. apply pitch to HW registers */ if (channels->modify & CGB_CHANNEL_MO_PIT) { if (ch < 4 && (channels->type & TONEDATA_TYPE_FIX)) { int dac_pwm_rate = REG_SOUNDBIAS_H; if (dac_pwm_rate < 0x40) // if PWM rate = 32768 Hz channels->frequency = (channels->frequency + 2) & 0x7fc; else if (dac_pwm_rate < 0x80) // if PWM rate = 65536 Hz channels->frequency = (channels->frequency + 1) & 0x7fe; } if (ch != 4) *nrx3ptr = channels->frequency; else *nrx3ptr = (*nrx3ptr & 0x08) | channels->frequency; channels->n4 = (channels->n4 & 0xC0) + (*((u8 *)(&channels->frequency) + 1)); *nrx4ptr = (s8)(channels->n4 & mask); } /* 4. apply envelope & volume to HW registers */ if (channels->modify & CGB_CHANNEL_MO_VOL) { REG_NR51 = (REG_NR51 & ~channels->panMask) | channels->pan; if (ch == 3) { *nrx2ptr = gCgb3Vol[channels->envelopeVolume]; if (channels->n4 & 0x80) { *nrx0ptr = 0x80; *nrx4ptr = channels->n4; channels->n4 &= 0x7f; } } else { u32 envMask = 0xF; *nrx2ptr = (envelopeStepTimeAndDir & envMask) + (channels->envelopeVolume << 4); *nrx4ptr = channels->n4 | 0x80; if (ch == 1 && !(*nrx0ptr & 0x08)) *nrx4ptr = channels->n4 | 0x80; } } channel_complete: channels->modify = 0; } } void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) { if (mplayInfo->ident == ID_NUMBER) { mplayInfo->ident++; mplayInfo->tempoU = tempo; mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; mplayInfo->ident = ID_NUMBER; } } void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) { s32 i; u32 bit; struct MusicPlayerTrack *track; if (mplayInfo->ident != ID_NUMBER) return; mplayInfo->ident++; i = mplayInfo->trackCount; track = mplayInfo->tracks; bit = 1; while (i > 0) { if (trackBits & bit) { if (track->flags & MPT_FLG_EXIST) { track->volX = volume / 4; track->flags |= MPT_FLG_VOLCHG; } } i--; track++; bit <<= 1; } mplayInfo->ident = ID_NUMBER; } void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch) { s32 i; u32 bit; struct MusicPlayerTrack *track; if (mplayInfo->ident != ID_NUMBER) return; mplayInfo->ident++; i = mplayInfo->trackCount; track = mplayInfo->tracks; bit = 1; while (i > 0) { if (trackBits & bit) { if (track->flags & MPT_FLG_EXIST) { track->keyShiftX = pitch >> 8; track->pitX = pitch; track->flags |= MPT_FLG_PITCHG; } } i--; track++; bit <<= 1; } mplayInfo->ident = ID_NUMBER; } void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) { s32 i; u32 bit; struct MusicPlayerTrack *track; if (mplayInfo->ident != ID_NUMBER) return; mplayInfo->ident++; i = mplayInfo->trackCount; track = mplayInfo->tracks; bit = 1; while (i > 0) { if (trackBits & bit) { if (track->flags & MPT_FLG_EXIST) { track->panX = pan; track->flags |= MPT_FLG_VOLCHG; } } i--; track++; bit <<= 1; } mplayInfo->ident = ID_NUMBER; } void ClearModM(struct MusicPlayerTrack *track) { track->lfoSpeedC = 0; track->modM = 0; if (track->modT == 0) track->flags |= MPT_FLG_PITCHG; else track->flags |= MPT_FLG_VOLCHG; } void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) { s32 i; u32 bit; struct MusicPlayerTrack *track; if (mplayInfo->ident != ID_NUMBER) return; mplayInfo->ident++; i = mplayInfo->trackCount; track = mplayInfo->tracks; bit = 1; while (i > 0) { if (trackBits & bit) { if (track->flags & MPT_FLG_EXIST) { track->mod = modDepth; if (!track->mod) ClearModM(track); } } i--; track++; bit <<= 1; } mplayInfo->ident = ID_NUMBER; } void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) { s32 i; u32 bit; struct MusicPlayerTrack *track; if (mplayInfo->ident != ID_NUMBER) return; mplayInfo->ident++; i = mplayInfo->trackCount; track = mplayInfo->tracks; bit = 1; while (i > 0) { if (trackBits & bit) { if (track->flags & MPT_FLG_EXIST) { track->lfoSpeed = lfoSpeed; if (!track->lfoSpeed) ClearModM(track); } } i--; track++; bit <<= 1; } mplayInfo->ident = ID_NUMBER; } #define MEMACC_COND_JUMP(cond) \ if (cond) \ goto cond_true; \ else \ goto cond_false; \ void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { u32 op; u8 *addr; u8 data; op = *track->cmdPtr; track->cmdPtr++; addr = mplayInfo->memAccArea + *track->cmdPtr; track->cmdPtr++; data = *track->cmdPtr; track->cmdPtr++; switch (op) { case 0: *addr = data; return; case 1: *addr += data; return; case 2: *addr -= data; return; case 3: *addr = mplayInfo->memAccArea[data]; return; case 4: *addr += mplayInfo->memAccArea[data]; return; case 5: *addr -= mplayInfo->memAccArea[data]; return; case 6: MEMACC_COND_JUMP(*addr == data) return; case 7: MEMACC_COND_JUMP(*addr != data) return; case 8: MEMACC_COND_JUMP(*addr > data) return; case 9: MEMACC_COND_JUMP(*addr >= data) return; case 10: MEMACC_COND_JUMP(*addr <= data) return; case 11: MEMACC_COND_JUMP(*addr < data) return; case 12: MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) return; case 13: MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) return; case 14: MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) return; case 15: MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) return; case 16: MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) return; case 17: MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) return; default: return; } cond_true: { // *& is required for matching (*&gMPlayJumpTable[1])(mplayInfo, track); return; } cond_false: track->cmdPtr += 4; } void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { u32 n = *track->cmdPtr; track->cmdPtr++; gXcmdTable[n](mplayInfo, track); } void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { gMPlayJumpTable[0](mplayInfo, track); } #define READ_XCMD_BYTE(var, n) \ { \ u32 byte = track->cmdPtr[(n)]; \ byte <<= n * 8; \ (var) &= ~(0xFF << (n * 8)); \ (var) |= byte; \ } void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { u32 wav; #ifdef UBFIX wav = 0; #endif READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable READ_XCMD_BYTE(wav, 1) READ_XCMD_BYTE(wav, 2) READ_XCMD_BYTE(wav, 3) track->tone.wav = (struct WaveData *)wav; track->cmdPtr += 4; } void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { track->tone.type = *track->cmdPtr; track->cmdPtr++; } void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { track->tone.attack = *track->cmdPtr; track->cmdPtr++; } void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { track->tone.decay = *track->cmdPtr; track->cmdPtr++; } void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { track->tone.sustain = *track->cmdPtr; track->cmdPtr++; } void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { track->tone.release = *track->cmdPtr; track->cmdPtr++; } void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { track->pseudoEchoVolume = *track->cmdPtr; track->cmdPtr++; } void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { track->pseudoEchoLength = *track->cmdPtr; track->cmdPtr++; } void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { track->tone.length = *track->cmdPtr; track->cmdPtr++; } void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { track->tone.pan_sweep = *track->cmdPtr; track->cmdPtr++; } void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { u32 unk; #ifdef UBFIX unk = 0; #endif READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable READ_XCMD_BYTE(unk, 1) if (track->unk_3A < (u16)unk) { track->unk_3A++; track->cmdPtr -= 2; track->wait = 1; } else { track->unk_3A = 0; track->cmdPtr += 2; } } void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { u32 unk; #ifdef UBFIX unk = 0; #endif READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable READ_XCMD_BYTE(unk, 1) READ_XCMD_BYTE(unk, 2) READ_XCMD_BYTE(unk, 3) track->unk_3C = unk; track->cmdPtr += 4; } void DummyFunc(void) { } struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone) { u32 maxClock = 0; s32 maxClockIndex = 0; s32 i; struct MusicPlayerInfo *mplayInfo; for (i = 0; i < MAX_POKEMON_CRIES; i++) { struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; if (!track->flags && (!track->chan || track->chan->track != track)) goto start_song; if (maxClock < gPokemonCryMusicPlayers[i].clock) { maxClock = gPokemonCryMusicPlayers[i].clock; maxClockIndex = i; } } i = maxClockIndex; start_song: mplayInfo = &gPokemonCryMusicPlayers[i]; mplayInfo->ident++; gPokemonCrySongs[i] = gPokemonCrySong; gPokemonCrySongs[i].tone = tone; gPokemonCrySongs[i].part[0] = &gPokemonCrySongs[i].part0; gPokemonCrySongs[i].part[1] = &gPokemonCrySongs[i].part1; gPokemonCrySongs[i].gotoTarget = (u32)&gPokemonCrySongs[i].cont; mplayInfo->ident = ID_NUMBER; MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i])); return mplayInfo; } void SetPokemonCryVolume(u8 val) { gPokemonCrySong.volumeValue = val & 0x7F; } void SetPokemonCryPanpot(s8 val) { gPokemonCrySong.panValue = (val + C_V) & 0x7F; } void SetPokemonCryPitch(s16 val) { s16 b = val + 0x80; u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue; gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F; gPokemonCrySong.tuneValue = (b >> 1) & 0x7F; gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F; } void SetPokemonCryLength(u16 val) { gPokemonCrySong.unkCmd0CParam = val; } void SetPokemonCryRelease(u8 val) { gPokemonCrySong.releaseValue = val; } void SetPokemonCryProgress(u32 val) { gPokemonCrySong.unkCmd0DParam = val; } bool32 IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo) { struct MusicPlayerTrack *track = mplayInfo->tracks; if (track->chan && track->chan->track == track) return TRUE; else return FALSE; } void SetPokemonCryChorus(s8 val) { if (val) { gPokemonCrySong.trackCount = 2; gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F; } else { gPokemonCrySong.trackCount = 1; } } void SetPokemonCryStereo(u32 val) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; if (val) { REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT | SOUND_ALL_MIX_FULL; soundInfo->mode &= ~1; } else { REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL; soundInfo->mode |= 1; } } void SetPokemonCryPriority(u8 val) { gPokemonCrySong.priority = val; } ================================================ FILE: src/m4a_1.s ================================================ .include "asm/macros.inc" .include "constants/gba_constants.inc" .include "constants/m4a_constants.inc" .syntax unified .text thumb_func_start umul3232H32 umul3232H32: adr r2, __umul3232H32 bx r2 .arm __umul3232H32: umull r2, r3, r0, r1 add r0, r3, 0 bx lr thumb_func_end umul3232H32 thumb_func_start SoundMain SoundMain: ldr r0, lt_SOUND_INFO_PTR ldr r0, [r0] ldr r2, lt_ID_NUMBER ldr r3, [r0, o_SoundInfo_ident] cmp r2, r3 beq SoundMain_1 bx lr @ Exit the function if ident doesn't match ID_NUMBER. SoundMain_1: adds r3, 1 str r3, [r0, o_SoundInfo_ident] push {r4-r7,lr} mov r1, r8 mov r2, r9 mov r3, r10 mov r4, r11 push {r0-r4} sub sp, 0x18 ldrb r1, [r0, o_SoundInfo_maxLines] cmp r1, 0 @ if maxLines is 0, there is no maximum beq SoundMain_3 ldr r2, lt_REG_VCOUNT ldrb r2, [r2] cmp r2, VCOUNT_VBLANK bhs SoundMain_2 adds r2, TOTAL_SCANLINES SoundMain_2: adds r1, r2 SoundMain_3: str r1, [sp, 0x14] ldr r3, [r0, o_SoundInfo_MPlayMainHead] cmp r3, 0 beq SoundMain_4 ldr r0, [r0, o_SoundInfo_musicPlayerHead] bl _081DD25E ldr r0, [sp, 0x18] SoundMain_4: ldr r3, [r0, o_SoundInfo_CgbSound] bl _081DD25E ldr r0, [sp, 0x18] ldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank] mov r8, r3 ldr r5, lt_o_SoundInfo_pcmBuffer adds r5, r0 ldrb r4, [r0, o_SoundInfo_pcmDmaCounter] subs r7, r4, 1 bls SoundMain_5 ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] subs r1, r7 mov r2, r8 muls r2, r1 adds r5, r2 SoundMain_5: str r5, [sp, 0x8] ldr r6, lt_PCM_DMA_BUF_SIZE ldr r3, lt_SoundMainRAM_Buffer bx r3 .align 2, 0 lt_SOUND_INFO_PTR: .word SOUND_INFO_PTR lt_ID_NUMBER: .word ID_NUMBER lt_SoundMainRAM_Buffer: .word SoundMainRAM_Buffer + 1 lt_REG_VCOUNT: .word REG_VCOUNT lt_o_SoundInfo_pcmBuffer: .word o_SoundInfo_pcmBuffer lt_PCM_DMA_BUF_SIZE: .word PCM_DMA_BUF_SIZE thumb_func_end SoundMain thumb_func_start SoundMainRAM SoundMainRAM: ldrb r3, [r0, o_SoundInfo_reverb] cmp r3, 0 beq SoundMainRAM_NoReverb adr r1, SoundMainRAM_Reverb bx r1 .arm SoundMainRAM_Reverb: cmp r4, 0x2 addeq r7, r0, o_SoundInfo_pcmBuffer addne r7, r5, r8 mov r4, r8 _081DCEC4: ldrsb r0, [r5, r6] ldrsb r1, [r5] add r0, r0, r1 ldrsb r1, [r7, r6] add r0, r0, r1 ldrsb r1, [r7], 0x1 add r0, r0, r1 mul r1, r0, r3 mov r0, r1, asr 9 tst r0, 0x80 addne r0, r0, 0x1 strb r0, [r5, r6] strb r0, [r5], 0x1 subs r4, r4, 0x1 bgt _081DCEC4 adr r0, _081DCF36 + 1 @ plus 1 because THUMB bx r0 .thumb SoundMainRAM_NoReverb: movs r0, 0 mov r1, r8 adds r6, r5 lsrs r1, 3 bcc SoundMainRAM_NoReverb_Ok stm r5!, {r0} stm r6!, {r0} SoundMainRAM_NoReverb_Ok: lsrs r1, 1 bcc SoundMainRAM_NoReverb_Loop stm r5!, {r0} stm r6!, {r0} stm r5!, {r0} stm r6!, {r0} SoundMainRAM_NoReverb_Loop: stm r5!, {r0} stm r6!, {r0} stm r5!, {r0} stm r6!, {r0} stm r5!, {r0} stm r6!, {r0} stm r5!, {r0} stm r6!, {r0} subs r1, 1 bgt SoundMainRAM_NoReverb_Loop _081DCF36: ldr r4, [sp, 0x18] ldr r0, [r4, o_SoundInfo_divFreq] mov r12, r0 ldrb r0, [r4, o_SoundInfo_maxChans] adds r4, o_SoundInfo_chans SoundMainRAM_ChanLoop: str r0, [sp, 0x4] ldr r3, [r4, o_SoundChannel_wav] ldr r0, [sp, 0x14] cmp r0, 0 beq _081DCF60 ldr r1, =REG_VCOUNT ldrb r1, [r1] cmp r1, VCOUNT_VBLANK bhs _081DCF54 adds r1, TOTAL_SCANLINES _081DCF54: cmp r1, r0 blo _081DCF60 b _081DD24A .pool _081DCF60: ldrb r6, [r4, o_SoundChannel_statusFlags] movs r0, SOUND_CHANNEL_SF_ON tst r0, r6 bne _081DCF6A b _081DD240 _081DCF6A: movs r0, SOUND_CHANNEL_SF_START tst r0, r6 beq _081DCFA0 movs r0, SOUND_CHANNEL_SF_STOP tst r0, r6 bne _081DCFB0 movs r6, SOUND_CHANNEL_SF_ENV_ATTACK strb r6, [r4, o_SoundChannel_statusFlags] adds r0, r3, 0 adds r0, o_WaveData_data ldr r1, [r4, o_SoundChannel_count] adds r0, r1 str r0, [r4, o_SoundChannel_currentPointer] ldr r0, [r3, o_WaveData_size] subs r0, r1 str r0, [r4, o_SoundChannel_count] movs r5, 0 strb r5, [r4, o_SoundChannel_envelopeVolume] str r5, [r4, o_SoundChannel_fw] ldrb r2, [r3, o_WaveData_flags] movs r0, WAVE_DATA_FLAG_LOOP tst r0, r2 beq _081DCFF8 movs r0, SOUND_CHANNEL_SF_LOOP orrs r6, r0 strb r6, [r4, o_SoundChannel_statusFlags] b _081DCFF8 _081DCFA0: ldrb r5, [r4, o_SoundChannel_envelopeVolume] movs r0, SOUND_CHANNEL_SF_IEC tst r0, r6 beq _081DCFB6 ldrb r0, [r4, o_SoundChannel_pseudoEchoLength] subs r0, 1 strb r0, [r4, o_SoundChannel_pseudoEchoLength] bhi _081DD006 _081DCFB0: movs r0, 0 strb r0, [r4, o_SoundChannel_statusFlags] b _081DD240 _081DCFB6: movs r0, SOUND_CHANNEL_SF_STOP tst r0, r6 beq _081DCFD6 ldrb r0, [r4, o_SoundChannel_release] muls r5, r0 lsrs r5, 8 ldrb r0, [r4, o_SoundChannel_pseudoEchoVolume] cmp r5, r0 bhi _081DD006 _081DCFC8: ldrb r5, [r4, o_SoundChannel_pseudoEchoVolume] cmp r5, 0 beq _081DCFB0 movs r0, SOUND_CHANNEL_SF_IEC orrs r6, r0 strb r6, [r4, o_SoundChannel_statusFlags] b _081DD006 _081DCFD6: movs r2, SOUND_CHANNEL_SF_ENV ands r2, r6 cmp r2, SOUND_CHANNEL_SF_ENV_DECAY bne _081DCFF4 ldrb r0, [r4, o_SoundChannel_decay] muls r5, r0 lsrs r5, 8 ldrb r0, [r4, o_SoundChannel_sustain] cmp r5, r0 bhi _081DD006 adds r5, r0, 0 beq _081DCFC8 subs r6, 0x1 strb r6, [r4, o_SoundChannel_statusFlags] b _081DD006 _081DCFF4: cmp r2, SOUND_CHANNEL_SF_ENV_ATTACK bne _081DD006 _081DCFF8: ldrb r0, [r4, o_SoundChannel_attack] adds r5, r0 cmp r5, 0xFF bcc _081DD006 movs r5, 0xFF subs r6, 0x1 strb r6, [r4, o_SoundChannel_statusFlags] _081DD006: strb r5, [r4, o_SoundChannel_envelopeVolume] ldr r0, [sp, 0x18] ldrb r0, [r0, o_SoundChannel_release] adds r0, 0x1 muls r0, r5 lsrs r5, r0, 4 ldrb r0, [r4, o_SoundChannel_rightVolume] muls r0, r5 lsrs r0, 8 strb r0, [r4, o_SoundChannel_envelopeVolumeRight] ldrb r0, [r4, o_SoundChannel_leftVolume] muls r0, r5 lsrs r0, 8 strb r0, [r4, o_SoundChannel_envelopeVolumeLeft] movs r0, SOUND_CHANNEL_SF_LOOP ands r0, r6 str r0, [sp, 0x10] beq _081DD03A adds r0, r3, 0 adds r0, o_WaveData_data ldr r1, [r3, o_WaveData_loopStart] adds r0, r1 str r0, [sp, 0xC] ldr r0, [r3, o_WaveData_size] subs r0, r1 str r0, [sp, 0x10] _081DD03A: ldr r5, [sp, 0x8] ldr r2, [r4, o_SoundChannel_count] ldr r3, [r4, o_SoundChannel_currentPointer] adr r0, _081DD044 bx r0 .arm _081DD044: str r8, [sp] ldr r9, [r4, o_SoundChannel_fw] ldrb r10, [r4, o_SoundChannel_envelopeVolumeRight] ldrb r11, [r4, o_SoundChannel_envelopeVolumeLeft] ldrb r0, [r4, o_SoundChannel_type] tst r0, TONEDATA_TYPE_CMP | TONEDATA_TYPE_REV beq _081DD068 bl SoundMainRAM_Unk1 b _081DD228 _081DD068: mov r10, r10, lsl 16 mov r11, r11, lsl 16 ldrb r0, [r4, o_SoundChannel_type] tst r0, 0x8 beq _081DD19C _081DD07C: cmp r2, 0x4 ble _081DD0EC subs r2, r2, r8 movgt r9, 0 bgt _081DD0A8 mov r9, r8 add r2, r2, r8 sub r8, r2, 0x4 sub r9, r9, r8 ands r2, r2, 0x3 moveq r2, 0x4 _081DD0A8: ldr r6, [r5] ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD0B0: ldrsb r0, [r3], 0x1 mul r1, r10, r0 bic r1, r1, 0xFF0000 add r6, r1, r6, ror 8 mul r1, r11, r0 bic r1, r1, 0xFF0000 add r7, r1, r7, ror 8 adds r5, r5, 0x40000000 bcc _081DD0B0 str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 subs r8, r8, 0x4 bgt _081DD0A8 adds r8, r8, r9 beq _081DD22C _081DD0EC: ldr r6, [r5] ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD0F4: ldrsb r0, [r3], 0x1 mul r1, r10, r0 bic r1, r1, 0xFF0000 add r6, r1, r6, ror 8 mul r1, r11, r0 bic r1, r1, 0xFF0000 add r7, r1, r7, ror 8 subs r2, r2, 0x1 beq _081DD164 _081DD118: adds r5, r5, 0x40000000 bcc _081DD0F4 str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 subs r8, r8, 0x4 bgt _081DD07C b _081DD22C _081DD134: ldr r0, [sp, 0x18] cmp r0, 0 beq _081DD158 ldr r3, [sp, 0x14] rsb lr, r2, 0 _081DD148: adds r2, r0, r2 bgt _081DD1FC sub lr, lr, r0 b _081DD148 _081DD158: pop {r4,r12} mov r2, 0 b _081DD174 _081DD164: ldr r2, [sp, 0x10] cmp r2, 0 ldrne r3, [sp, 0xC] bne _081DD118 _081DD174: strb r2, [r4, o_SoundChannel_statusFlags] mov r0, r5, lsr 30 bic r5, r5, 0xC0000000 rsb r0, r0, 0x3 mov r0, r0, lsl 3 mov r6, r6, ror r0 mov r7, r7, ror r0 str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 b _081DD234 _081DD19C: push {r4,r12} ldr r1, [r4, o_SoundChannel_frequency] mul r4, r12, r1 ldrsb r0, [r3] ldrsb r1, [r3, 0x1]! sub r1, r1, r0 _081DD1B4: ldr r6, [r5] ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD1BC: mul lr, r9, r1 add lr, r0, lr, asr 23 mul r12, r10, lr bic r12, r12, 0xFF0000 add r6, r12, r6, ror 8 mul r12, r11, lr bic r12, r12, 0xFF0000 add r7, r12, r7, ror 8 add r9, r9, r4 movs lr, r9, lsr 23 beq _081DD208 bic r9, r9, 0x3F800000 subs r2, r2, lr ble _081DD134 subs lr, lr, 0x1 addeq r0, r0, r1 _081DD1FC: ldrsbne r0, [r3, lr]! ldrsb r1, [r3, 0x1]! sub r1, r1, r0 _081DD208: adds r5, r5, 0x40000000 bcc _081DD1BC str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 subs r8, r8, 0x4 bgt _081DD1B4 sub r3, r3, 0x1 pop {r4,r12} _081DD228: str r9, [r4, o_SoundChannel_fw] _081DD22C: str r2, [r4, o_SoundChannel_count] str r3, [r4, o_SoundChannel_currentPointer] _081DD234: ldr r8, [sp] add r0, pc, 0x1 bx r0 .thumb _081DD240: ldr r0, [sp, 0x4] subs r0, 1 ble _081DD24A adds r4, SoundChannel_size b SoundMainRAM_ChanLoop _081DD24A: ldr r0, [sp, 0x18] ldr r3, =ID_NUMBER str r3, [r0] add sp, 0x1C pop {r0-r7} mov r8, r0 mov r9, r1 mov r10, r2 mov r11, r3 pop {r3} _081DD25E: bx r3 .pool thumb_func_end SoundMainRAM @ Not present in GBA SDK 3.0 arm_func_start SoundMainRAM_Unk1 SoundMainRAM_Unk1: ldr r6, [r4, o_SoundChannel_wav] ldrb r0, [r4, o_SoundChannel_statusFlags] tst r0, SOUND_CHANNEL_SF_SPECIAL bne _081DD2B4 orr r0, r0, SOUND_CHANNEL_SF_SPECIAL strb r0, [r4, o_SoundChannel_statusFlags] ldrb r0, [r4, o_SoundChannel_type] tst r0, TONEDATA_TYPE_REV beq _081DD29C ldr r1, [r6, o_WaveData_size] add r1, r1, r6, lsl 1 add r1, r1, 0x20 sub r3, r1, r3 str r3, [r4, o_SoundChannel_currentPointer] _081DD29C: ldrh r0, [r6, o_WaveData_type] cmp r0, 0 beq _081DD2B4 sub r3, r3, r6 sub r3, r3, 0x10 str r3, [r4, o_SoundChannel_currentPointer] _081DD2B4: push {r8,r12,lr} mov r10, r10, lsl 16 mov r11, r11, lsl 16 ldr r1, [r4, o_SoundChannel_frequency] ldrb r0, [r4, o_SoundChannel_type] tst r0, TONEDATA_TYPE_FIX movne r8, 0x800000 muleq r8, r12, r1 ldrh r0, [r6, o_WaveData_type] cmp r0, 0 beq _081DD468 mov r0, 0xFF000000 str r0, [r4, o_SoundChannel_xpi] ldrb r0, [r4, o_SoundChannel_type] tst r0, TONEDATA_TYPE_REV bne _081DD3C0 bl SoundMainRAM_Unk2 mov r0, r1 add r3, r3, 0x1 bl SoundMainRAM_Unk2 sub r1, r1, r0 _081DD308: ldr r6, [r5] ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD310: mul lr, r9, r1 add lr, r0, lr, asr 23 mul r12, r10, lr bic r12, r12, 0xFF0000 add r6, r12, r6, ror 8 mul r12, r11, lr bic r12, r12, 0xFF0000 add r7, r12, r7, ror 8 add r9, r9, r8 movs lr, r9, lsr 23 beq _081DD370 bic r9, r9, 0x3F800000 subs r2, r2, lr ble _081DD398 subs lr, lr, 0x1 bne _081DD358 add r0, r0, r1 b _081DD364 _081DD358: add r3, r3, lr bl SoundMainRAM_Unk2 mov r0, r1 _081DD364: add r3, r3, 0x1 bl SoundMainRAM_Unk2 sub r1, r1, r0 _081DD370: adds r5, r5, 0x40000000 bcc _081DD310 str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 ldr r6, [sp] subs r6, r6, 0x4 str r6, [sp] bgt _081DD308 sub r3, r3, 0x1 b _081DD4F0 _081DD398: ldr r0, [sp, 0x1C] cmp r0, 0 beq _081DD4F4 ldr r3, [r4, o_SoundChannel_wav] ldr r3, [r3, o_WaveData_loopStart] rsb lr, r2, 0 _081DD3B0: adds r2, r2, r0 bgt _081DD358 sub lr, lr, r0 b _081DD3B0 _081DD3C0: sub r3, r3, 0x1 bl SoundMainRAM_Unk2 mov r0, r1 sub r3, r3, 0x1 bl SoundMainRAM_Unk2 sub r1, r1, r0 _081DD3D8: ldr r6, [r5] ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD3E0: mul lr, r9, r1 add lr, r0, lr, asr 23 mul r12, r10, lr bic r12, r12, 0xFF0000 add r6, r12, r6, ror 8 mul r12, r11, lr bic r12, r12, 0xFF0000 add r7, r12, r7, ror 8 add r9, r9, r8 movs lr, r9, lsr 23 beq _081DD440 bic r9, r9, 0x3F800000 subs r2, r2, lr ble _081DD4F4 subs lr, lr, 0x1 bne _081DD428 add r0, r0, r1 b _081DD434 _081DD428: sub r3, r3, lr bl SoundMainRAM_Unk2 mov r0, r1 _081DD434: sub r3, r3, 0x1 bl SoundMainRAM_Unk2 sub r1, r1, r0 _081DD440: adds r5, r5, 0x40000000 bcc _081DD3E0 str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 ldr r6, [sp] subs r6, r6, 0x4 str r6, [sp] bgt _081DD3D8 add r3, r3, 0x2 b _081DD4F0 _081DD468: ldrb r0, [r4, o_SoundChannel_type] tst r0, TONEDATA_TYPE_REV beq _081DD4F0 ldrsb r0, [r3, -0x1]! ldrsb r1, [r3, -0x1] sub r1, r1, r0 _081DD480: ldr r6, [r5] ldr r7, [r5, 0x630] _081DD488: mul lr, r9, r1 add lr, r0, lr, asr 23 mul r12, r10, lr bic r12, r12, 0xFF0000 add r6, r12, r6, ror 8 mul r12, r11, lr bic r12, r12, 0xFF0000 add r7, r12, r7, ror 8 add r9, r9, r8 movs lr, r9, lsr 23 beq _081DD4CC bic r9, r9, 0x3F800000 subs r2, r2, lr ble _081DD4F4 ldrsb r0, [r3, -lr]! ldrsb r1, [r3, -0x1] sub r1, r1, r0 _081DD4CC: adds r5, r5, 0x40000000 bcc _081DD488 str r7, [r5, 0x630] str r6, [r5], 0x4 ldr r6, [sp] subs r6, r6, 0x4 str r6, [sp] bgt _081DD480 add r3, r3, 0x1 _081DD4F0: pop {r8,r12,pc} _081DD4F4: mov r2, 0 strb r2, [r4, o_SoundChannel_statusFlags] mov r0, r5, lsr 30 bic r5, r5, 0xC0000000 rsb r0, r0, 0x3 mov r0, r0, lsl 3 mov r6, r6, ror r0 mov r7, r7, ror r0 str r7, [r5, 0x630] str r6, [r5], 0x4 pop {r8,r12,pc} arm_func_end SoundMainRAM_Unk1 @ Not present in GBA SDK 3.0 arm_func_start SoundMainRAM_Unk2 SoundMainRAM_Unk2: push {r0,r2,r5-r7,lr} mov r0, r3, lsr 6 ldr r1, [r4, o_SoundChannel_xpi] cmp r0, r1 beq _081DD594 str r0, [r4, o_SoundChannel_xpi] mov r1, 0x21 mul r2, r1, r0 ldr r1, [r4, o_SoundChannel_wav] add r2, r2, r1 add r2, r2, 0x10 ldr r5, =sDecodingBuffer ldr r6, =gDeltaEncodingTable mov r7, 0x40 ldrb lr, [r2], 1 strb lr, [r5], 1 ldrb r1, [r2], 1 b _081DD57C _081DD568: ldrb r1, [r2], 1 mov r0, r1, lsr 4 ldrsb r0, [r6, r0] add lr, lr, r0 strb lr, [r5], 1 _081DD57C: and r0, r1, 0xF ldrsb r0, [r6, r0] add lr, lr, r0 strb lr, [r5], 1 subs r7, r7, 2 bgt _081DD568 _081DD594: ldr r5, =sDecodingBuffer and r0, r3, 0x3F ldrsb r1, [r5, r0] pop {r0,r2,r5-r7,pc} .pool arm_func_end SoundMainRAM_Unk2 thumb_func_start SoundMainBTM SoundMainBTM: mov r12, r4 movs r1, 0 movs r2, 0 movs r3, 0 movs r4, 0 stm r0!, {r1-r4} stm r0!, {r1-r4} stm r0!, {r1-r4} stm r0!, {r1-r4} mov r4, r12 bx lr thumb_func_end SoundMainBTM thumb_func_start RealClearChain RealClearChain: ldr r3, [r0, o_SoundChannel_track] cmp r3, 0 beq _081DD5E2 ldr r1, [r0, o_SoundChannel_nextChannelPointer] ldr r2, [r0, o_SoundChannel_prevChannelPointer] cmp r2, 0 beq _081DD5D6 str r1, [r2, o_SoundChannel_nextChannelPointer] b _081DD5D8 _081DD5D6: str r1, [r3, o_MusicPlayerTrack_chan] _081DD5D8: cmp r1, 0 beq _081DD5DE str r2, [r1, o_SoundChannel_prevChannelPointer] _081DD5DE: movs r1, 0 str r1, [r0, o_SoundChannel_track] _081DD5E2: bx lr thumb_func_end RealClearChain thumb_func_start ply_fine ply_fine: push {r4,r5,lr} adds r5, r1, 0 ldr r4, [r5, o_MusicPlayerTrack_chan] cmp r4, 0 beq ply_fine_done ply_fine_loop: ldrb r1, [r4, o_SoundChannel_statusFlags] movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 beq ply_fine_ok movs r0, SOUND_CHANNEL_SF_STOP orrs r1, r0 strb r1, [r4, o_SoundChannel_statusFlags] ply_fine_ok: adds r0, r4, 0 bl RealClearChain ldr r4, [r4, o_SoundChannel_nextChannelPointer] cmp r4, 0 bne ply_fine_loop ply_fine_done: movs r0, 0 strb r0, [r5, o_MusicPlayerTrack_flags] pop {r4,r5} pop {r0} bx r0 thumb_func_end ply_fine thumb_func_start MPlayJumpTableCopy MPlayJumpTableCopy: mov r12, lr movs r1, 0x24 ldr r2, lt_MPlayJumpTableTemplate MPlayJumpTableCopy_Loop: ldr r3, [r2] bl chk_adr_r2 stm r0!, {r3} adds r2, 0x4 subs r1, 0x1 bgt MPlayJumpTableCopy_Loop bx r12 thumb_func_end MPlayJumpTableCopy .align 2, 0 .thumb_func ldrb_r3_r2: ldrb r3, [r2] @ This attempts to protect against reading anything from the BIOS ROM @ besides the jump table template. @ It assumes that the jump table template is located at the end of the ROM. .thumb_func chk_adr_r2: push {r0} lsrs r0, r2, 25 bne chk_adr_r2_done @ if adr >= 0x2000000 (i.e. not in BIOS ROM), accept it ldr r0, lt_MPlayJumpTableTemplate cmp r2, r0 blo chk_adr_r2_reject @ if adr < gMPlayJumpTableTemplate, reject it lsrs r0, r2, 14 beq chk_adr_r2_done @ if adr < 0x40000 (i.e. in BIOS ROM), accept it chk_adr_r2_reject: movs r3, 0 chk_adr_r2_done: pop {r0} bx lr .align 2, 0 lt_MPlayJumpTableTemplate: .word gMPlayJumpTableTemplate thumb_func_start ld_r3_tp_adr_i ld_r3_tp_adr_i: ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] _081DD64A: adds r3, r2, 0x1 str r3, [r1, o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] b chk_adr_r2 thumb_func_end ld_r3_tp_adr_i thumb_func_start ply_goto ply_goto: push {lr} ply_goto_1: ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] ldrb r0, [r2, 0x3] lsls r0, 8 ldrb r3, [r2, 0x2] orrs r0, r3 lsls r0, 8 ldrb r3, [r2, 0x1] orrs r0, r3 lsls r0, 8 bl ldrb_r3_r2 orrs r0, r3 str r0, [r1, o_MusicPlayerTrack_cmdPtr] pop {r0} bx r0 thumb_func_end ply_goto thumb_func_start ply_patt ply_patt: ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] cmp r2, 3 bhs ply_patt_done lsls r2, 2 adds r3, r1, r2 ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] adds r2, 0x4 str r2, [r3, o_MusicPlayerTrack_patternStack] ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] adds r2, 1 strb r2, [r1, o_MusicPlayerTrack_patternLevel] b ply_goto ply_patt_done: b ply_fine thumb_func_end ply_patt thumb_func_start ply_pend ply_pend: ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] cmp r2, 0 beq ply_pend_done subs r2, 1 strb r2, [r1, o_MusicPlayerTrack_patternLevel] lsls r2, 2 adds r3, r1, r2 ldr r2, [r3, o_MusicPlayerTrack_patternStack] str r2, [r1, o_MusicPlayerTrack_cmdPtr] ply_pend_done: bx lr thumb_func_end ply_pend thumb_func_start ply_rept ply_rept: push {lr} ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] cmp r3, 0 bne ply_rept_1 adds r2, 1 str r2, [r1, o_MusicPlayerTrack_cmdPtr] b ply_goto_1 ply_rept_1: ldrb r3, [r1, o_MusicPlayerTrack_repN] adds r3, 1 strb r3, [r1, o_MusicPlayerTrack_repN] mov r12, r3 bl ld_r3_tp_adr_i cmp r12, r3 bhs ply_rept_2 b ply_goto_1 ply_rept_2: movs r3, 0 strb r3, [r1, o_MusicPlayerTrack_repN] adds r2, 5 str r2, [r1, o_MusicPlayerTrack_cmdPtr] pop {r0} bx r0 thumb_func_end ply_rept thumb_func_start ply_prio ply_prio: mov r12, lr bl ld_r3_tp_adr_i strb r3, [r1, o_MusicPlayerTrack_priority] bx r12 thumb_func_end ply_prio thumb_func_start ply_tempo ply_tempo: mov r12, lr bl ld_r3_tp_adr_i lsls r3, 1 strh r3, [r0, o_MusicPlayerInfo_tempoD] ldrh r2, [r0, o_MusicPlayerInfo_tempoU] muls r3, r2 lsrs r3, 8 strh r3, [r0, o_MusicPlayerInfo_tempoI] bx r12 thumb_func_end ply_tempo thumb_func_start ply_keysh ply_keysh: mov r12, lr bl ld_r3_tp_adr_i strb r3, [r1, o_MusicPlayerTrack_keyShift] ldrb r3, [r1, o_MusicPlayerTrack_flags] movs r2, 0xC orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_keysh thumb_func_start ply_voice ply_voice: mov r12, lr ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] adds r2, 1 str r2, [r1, o_MusicPlayerTrack_cmdPtr] lsls r2, r3, 1 adds r2, r3 lsls r2, 2 ldr r3, [r0, o_MusicPlayerInfo_tone] adds r2, r3 ldr r3, [r2, o_ToneData_type] bl chk_adr_r2 str r3, [r1, o_MusicPlayerTrack_ToneData_type] ldr r3, [r2, o_ToneData_wav] bl chk_adr_r2 str r3, [r1, o_MusicPlayerTrack_ToneData_wav] ldr r3, [r2, o_ToneData_attack] bl chk_adr_r2 str r3, [r1, o_MusicPlayerTrack_ToneData_attack] bx r12 thumb_func_end ply_voice thumb_func_start ply_vol ply_vol: mov r12, lr bl ld_r3_tp_adr_i strb r3, [r1, o_MusicPlayerTrack_vol] ldrb r3, [r1, o_MusicPlayerTrack_flags] movs r2, MPT_FLG_VOLCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_vol thumb_func_start ply_pan ply_pan: mov r12, lr bl ld_r3_tp_adr_i subs r3, C_V strb r3, [r1, o_MusicPlayerTrack_pan] ldrb r3, [r1, o_MusicPlayerTrack_flags] movs r2, MPT_FLG_VOLCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_pan thumb_func_start ply_bend ply_bend: mov r12, lr bl ld_r3_tp_adr_i subs r3, C_V strb r3, [r1, o_MusicPlayerTrack_bend] ldrb r3, [r1, o_MusicPlayerTrack_flags] movs r2, MPT_FLG_PITCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_bend thumb_func_start ply_bendr ply_bendr: mov r12, lr bl ld_r3_tp_adr_i strb r3, [r1, o_MusicPlayerTrack_bendRange] ldrb r3, [r1, o_MusicPlayerTrack_flags] movs r2, MPT_FLG_PITCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_bendr thumb_func_start ply_lfodl ply_lfodl: mov r12, lr bl ld_r3_tp_adr_i strb r3, [r1, o_MusicPlayerTrack_lfoDelay] bx r12 thumb_func_end ply_lfodl thumb_func_start ply_modt ply_modt: mov r12, lr bl ld_r3_tp_adr_i ldrb r0, [r1, o_MusicPlayerTrack_modT] cmp r0, r3 beq _081DD7AA strb r3, [r1, o_MusicPlayerTrack_modT] ldrb r3, [r1, o_MusicPlayerTrack_flags] movs r2, MPT_FLG_VOLCHG | MPT_FLG_PITCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] _081DD7AA: bx r12 thumb_func_end ply_modt thumb_func_start ply_tune ply_tune: mov r12, lr bl ld_r3_tp_adr_i subs r3, C_V strb r3, [r1, o_MusicPlayerTrack_tune] ldrb r3, [r1, o_MusicPlayerTrack_flags] movs r2, MPT_FLG_PITCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_tune thumb_func_start ply_port ply_port: mov r12, lr ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] adds r2, 1 ldr r0, =REG_SOUND1CNT_L @ sound register base address adds r0, r3 bl _081DD64A strb r3, [r0] bx r12 .pool thumb_func_end ply_port thumb_func_start m4aSoundVSync m4aSoundVSync: ldr r0, lt2_SOUND_INFO_PTR ldr r0, [r0] @ Exit the function if ident is not ID_NUMBER or ID_NUMBER+1. ldr r2, lt2_ID_NUMBER ldr r3, [r0, o_SoundInfo_ident] subs r3, r2 cmp r3, 1 bhi m4aSoundVSync_Done @ Decrement the PCM DMA counter. If it reaches 0, we need to do a DMA. ldrb r1, [r0, o_SoundInfo_pcmDmaCounter] subs r1, 1 strb r1, [r0, o_SoundInfo_pcmDmaCounter] bgt m4aSoundVSync_Done @ Reload the PCM DMA counter. ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] strb r1, [r0, o_SoundInfo_pcmDmaCounter] ldr r2, =REG_DMA1 ldr r1, [r2, 0x8] @ DMA1CNT lsls r1, 7 bcc m4aSoundVSync_SkipDMA1 @ branch if repeat bit isn't set ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 str r1, [r2, 0x8] @ DMA1CNT m4aSoundVSync_SkipDMA1: ldr r1, [r2, 0xC + 0x8] @ DMA2CNT lsls r1, 7 bcc m4aSoundVSync_SkipDMA2 @ branch if repeat bit isn't set ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 str r1, [r2, 0xC + 0x8] @ DMA2CNT m4aSoundVSync_SkipDMA2: @ turn off DMA1/DMA2 movs r1, DMA_32BIT >> 8 lsls r1, 8 strh r1, [r2, 0xA] @ DMA1CNT_H strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H @ turn on DMA1/DMA2 direct-sound FIFO mode movs r1, (DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT) >> 8 lsls r1, 8 @ LSB is 0, so DMA_SRC_INC is used (destination is always fixed in FIFO mode) strh r1, [r2, 0xA] @ DMA1CNT_H strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H m4aSoundVSync_Done: bx lr .pool thumb_func_end m4aSoundVSync thumb_func_start MPlayMain MPlayMain: ldr r2, lt2_ID_NUMBER ldr r3, [r0, o_MusicPlayerInfo_ident] cmp r2, r3 beq _081DD82E bx lr _081DD82E: adds r3, 0x1 str r3, [r0, o_MusicPlayerInfo_ident] push {r0,lr} ldr r3, [r0, o_MusicPlayerInfo_func] cmp r3, 0 beq _081DD840 ldr r0, [r0, o_MusicPlayerInfo_intp] bl call_r3 _081DD840: pop {r0} push {r4-r7} mov r4, r8 mov r5, r9 mov r6, r10 mov r7, r11 push {r4-r7} adds r7, r0, 0 ldr r0, [r7, o_MusicPlayerInfo_status] cmp r0, 0 bge _081DD858 b _081DDA6C _081DD858: ldr r0, lt2_SOUND_INFO_PTR ldr r0, [r0] mov r8, r0 adds r0, r7, 0 bl FadeOutBody ldr r0, [r7, o_MusicPlayerInfo_status] cmp r0, 0 bge _081DD86C b _081DDA6C _081DD86C: ldrh r0, [r7, o_MusicPlayerInfo_tempoC] ldrh r1, [r7, o_MusicPlayerInfo_tempoI] adds r0, r1 b _081DD9BC _081DD874: ldrb r6, [r7, o_MusicPlayerInfo_trackCount] ldr r5, [r7, o_MusicPlayerInfo_tracks] movs r3, 0x1 movs r4, 0 _081DD87C: ldrb r0, [r5, o_MusicPlayerTrack_flags] movs r1, MPT_FLG_EXIST tst r1, r0 bne _081DD886 b _081DD998 _081DD886: mov r10, r3 orrs r4, r3 mov r11, r4 ldr r4, [r5, o_MusicPlayerTrack_chan] cmp r4, 0 beq _081DD8BA _081DD892: ldrb r1, [r4, o_SoundChannel_statusFlags] movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 beq _081DD8AE ldrb r0, [r4, o_SoundChannel_gateTime] cmp r0, 0 beq _081DD8B4 subs r0, 0x1 strb r0, [r4, o_SoundChannel_gateTime] bne _081DD8B4 movs r0, SOUND_CHANNEL_SF_STOP orrs r1, r0 strb r1, [r4, o_SoundChannel_statusFlags] b _081DD8B4 _081DD8AE: adds r0, r4, 0 bl ClearChain _081DD8B4: ldr r4, [r4, o_SoundChannel_nextChannelPointer] cmp r4, 0 bne _081DD892 _081DD8BA: ldrb r3, [r5, o_MusicPlayerTrack_flags] movs r0, MPT_FLG_START tst r0, r3 beq _081DD938 adds r0, r5, 0 bl Clear64byte movs r0, MPT_FLG_EXIST strb r0, [r5, o_MusicPlayerTrack_flags] movs r0, 0x2 strb r0, [r5, o_MusicPlayerTrack_bendRange] movs r0, 0x40 strb r0, [r5, o_MusicPlayerTrack_volX] movs r0, 0x16 strb r0, [r5, o_MusicPlayerTrack_lfoSpeed] movs r0, 0x1 adds r1, r5, 0x6 strb r0, [r1, o_MusicPlayerTrack_ToneData_type - 0x6] b _081DD938 _081DD8E0: ldr r2, [r5, o_MusicPlayerTrack_cmdPtr] ldrb r1, [r2] cmp r1, 0x80 bhs _081DD8EC ldrb r1, [r5, o_MusicPlayerTrack_runningStatus] b _081DD8F6 _081DD8EC: adds r2, 0x1 str r2, [r5, o_MusicPlayerTrack_cmdPtr] cmp r1, 0xBD bcc _081DD8F6 strb r1, [r5, o_MusicPlayerTrack_runningStatus] _081DD8F6: cmp r1, 0xCF bcc _081DD90C mov r0, r8 ldr r3, [r0, o_SoundInfo_plynote] adds r0, r1, 0 subs r0, 0xCF adds r1, r7, 0 adds r2, r5, 0 bl call_r3 b _081DD938 _081DD90C: cmp r1, 0xB0 bls _081DD92E adds r0, r1, 0 subs r0, 0xB1 strb r0, [r7, o_MusicPlayerInfo_cmd] mov r3, r8 ldr r3, [r3, o_SoundInfo_MPlayJumpTable] lsls r0, 2 ldr r3, [r3, r0] adds r0, r7, 0 adds r1, r5, 0 bl call_r3 ldrb r0, [r5, o_MusicPlayerTrack_flags] cmp r0, 0 beq _081DD994 b _081DD938 _081DD92E: ldr r0, lt_gClockTable subs r1, 0x80 adds r1, r0 ldrb r0, [r1] strb r0, [r5, o_MusicPlayerTrack_wait] _081DD938: ldrb r0, [r5, o_MusicPlayerTrack_wait] cmp r0, 0 beq _081DD8E0 subs r0, 0x1 strb r0, [r5, o_MusicPlayerTrack_wait] ldrb r1, [r5, o_MusicPlayerTrack_lfoSpeed] cmp r1, 0 beq _081DD994 ldrb r0, [r5, o_MusicPlayerTrack_mod] cmp r0, 0 beq _081DD994 ldrb r0, [r5, o_MusicPlayerTrack_lfoDelayC] cmp r0, 0 beq _081DD95A subs r0, 0x1 strb r0, [r5, o_MusicPlayerTrack_lfoDelayC] b _081DD994 _081DD95A: ldrb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] adds r0, r1 strb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] adds r1, r0, 0 subs r0, 0x40 lsls r0, 24 bpl _081DD96E lsls r2, r1, 24 asrs r2, 24 b _081DD972 _081DD96E: movs r0, 0x80 subs r2, r0, r1 _081DD972: ldrb r0, [r5, o_MusicPlayerTrack_mod] muls r0, r2 asrs r2, r0, 6 ldrb r0, [r5, o_MusicPlayerTrack_modM] eors r0, r2 lsls r0, 24 beq _081DD994 strb r2, [r5, o_MusicPlayerTrack_modM] ldrb r0, [r5] ldrb r1, [r5, o_MusicPlayerTrack_modT] cmp r1, 0 bne _081DD98E movs r1, MPT_FLG_PITCHG b _081DD990 _081DD98E: movs r1, MPT_FLG_VOLCHG _081DD990: orrs r0, r1 strb r0, [r5, o_MusicPlayerTrack_flags] _081DD994: mov r3, r10 mov r4, r11 _081DD998: subs r6, 0x1 ble _081DD9A4 movs r0, MusicPlayerTrack_size adds r5, r0 lsls r3, 1 b _081DD87C _081DD9A4: ldr r0, [r7, o_MusicPlayerInfo_clock] adds r0, 0x1 str r0, [r7, o_MusicPlayerInfo_clock] cmp r4, 0 bne _081DD9B6 movs r0, 0x80 lsls r0, 24 str r0, [r7, o_MusicPlayerInfo_status] b _081DDA6C _081DD9B6: str r4, [r7, o_MusicPlayerInfo_status] ldrh r0, [r7, o_MusicPlayerInfo_tempoC] subs r0, 150 _081DD9BC: strh r0, [r7, o_MusicPlayerInfo_tempoC] cmp r0, 150 bcc _081DD9C4 b _081DD874 _081DD9C4: ldrb r2, [r7, o_MusicPlayerInfo_trackCount] ldr r5, [r7, o_MusicPlayerInfo_tracks] _081DD9C8: ldrb r0, [r5, o_MusicPlayerTrack_flags] movs r1, 0x80 tst r1, r0 beq _081DDA62 movs r1, MPT_FLG_VOLCHG | MPT_FLG_PITCHG tst r1, r0 beq _081DDA62 mov r9, r2 adds r0, r7, 0 adds r1, r5, 0 bl TrkVolPitSet ldr r4, [r5, o_MusicPlayerTrack_chan] cmp r4, 0 beq _081DDA58 _081DD9E6: ldrb r1, [r4, o_SoundChannel_statusFlags] movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 bne _081DD9F6 adds r0, r4, 0 bl ClearChain b _081DDA52 _081DD9F6: ldrb r0, [r4, o_SoundChannel_type] movs r6, TONEDATA_TYPE_CGB ands r6, r0 ldrb r3, [r5, o_MusicPlayerTrack_flags] movs r0, MPT_FLG_VOLCHG tst r0, r3 beq _081DDA14 bl ChnVolSetAsm cmp r6, 0 beq _081DDA14 ldrb r0, [r4, o_CgbChannel_modify] movs r1, CGB_CHANNEL_MO_VOL orrs r0, r1 strb r0, [r4, o_CgbChannel_modify] _081DDA14: ldrb r3, [r5, o_MusicPlayerTrack_flags] movs r0, MPT_FLG_PITCHG tst r0, r3 beq _081DDA52 ldrb r1, [r4, o_SoundChannel_key] movs r0, o_MusicPlayerTrack_keyM ldrsb r0, [r5, r0] adds r2, r1, r0 bpl _081DDA28 movs r2, 0 _081DDA28: cmp r6, 0 beq _081DDA46 mov r0, r8 ldr r3, [r0, o_SoundInfo_MidiKeyToCgbFreq] adds r1, r2, 0 ldrb r2, [r5, o_MusicPlayerTrack_pitM] adds r0, r6, 0 bl call_r3 str r0, [r4, o_CgbChannel_frequency] ldrb r0, [r4, o_CgbChannel_modify] movs r1, CGB_CHANNEL_MO_PIT orrs r0, r1 strb r0, [r4, o_CgbChannel_modify] b _081DDA52 _081DDA46: adds r1, r2, 0 ldrb r2, [r5, o_MusicPlayerTrack_pitM] ldr r0, [r4, o_SoundChannel_wav] bl MidiKeyToFreq str r0, [r4, o_SoundChannel_frequency] _081DDA52: ldr r4, [r4, o_SoundChannel_nextChannelPointer] cmp r4, 0 bne _081DD9E6 _081DDA58: ldrb r0, [r5, o_MusicPlayerTrack_flags] movs r1, 0xF0 ands r0, r1 strb r0, [r5, o_MusicPlayerTrack_flags] mov r2, r9 _081DDA62: subs r2, 0x1 ble _081DDA6C movs r0, MusicPlayerTrack_size adds r5, r0 bgt _081DD9C8 _081DDA6C: ldr r0, lt2_ID_NUMBER str r0, [r7, o_MusicPlayerInfo_ident] pop {r0-r7} mov r8, r0 mov r9, r1 mov r10, r2 mov r11, r3 pop {r3} call_r3: bx r3 .align 2, 0 lt_gClockTable: .word gClockTable lt2_SOUND_INFO_PTR: .word SOUND_INFO_PTR lt2_ID_NUMBER: .word ID_NUMBER thumb_func_end MPlayMain thumb_func_start TrackStop TrackStop: push {r4-r6,lr} adds r5, r1, 0 ldrb r1, [r5, o_MusicPlayerTrack_flags] movs r0, MPT_FLG_EXIST tst r0, r1 beq TrackStop_Done ldr r4, [r5, o_MusicPlayerTrack_chan] cmp r4, 0 beq TrackStop_3 movs r6, 0 TrackStop_Loop: ldrb r0, [r4, o_SoundChannel_statusFlags] cmp r0, 0 beq TrackStop_2 ldrb r0, [r4, o_SoundChannel_type] movs r3, TONEDATA_TYPE_CGB ands r0, r3 beq TrackStop_1 ldr r3, =SOUND_INFO_PTR ldr r3, [r3] ldr r3, [r3, o_SoundInfo_CgbOscOff] bl call_r3 TrackStop_1: strb r6, [r4, o_SoundChannel_statusFlags] TrackStop_2: str r6, [r4, o_SoundChannel_track] ldr r4, [r4, o_SoundChannel_nextChannelPointer] cmp r4, 0 bne TrackStop_Loop TrackStop_3: str r4, [r5, o_MusicPlayerTrack_chan] TrackStop_Done: pop {r4-r6} pop {r0} bx r0 .pool thumb_func_end TrackStop thumb_func_start ChnVolSetAsm ChnVolSetAsm: ldrb r1, [r4, o_SoundChannel_velocity] movs r0, o_SoundChannel_rhythmPan ldrsb r2, [r4, r0] movs r3, 0x80 adds r3, r2 muls r3, r1 ldrb r0, [r5, o_MusicPlayerTrack_volMR] muls r0, r3 asrs r0, 14 cmp r0, 0xFF bls _081DDAE8 movs r0, 0xFF _081DDAE8: strb r0, [r4, o_SoundChannel_rightVolume] movs r3, 0x7F subs r3, r2 muls r3, r1 ldrb r0, [r5, o_MusicPlayerTrack_volML] muls r0, r3 asrs r0, 14 cmp r0, 0xFF bls _081DDAFC movs r0, 0xFF _081DDAFC: strb r0, [r4, o_SoundChannel_leftVolume] bx lr thumb_func_end ChnVolSetAsm thumb_func_start ply_note ply_note: push {r4-r7,lr} mov r4, r8 mov r5, r9 mov r6, r10 mov r7, r11 push {r4-r7} sub sp, 0x18 str r1, [sp] adds r5, r2, 0 ldr r1, =SOUND_INFO_PTR ldr r1, [r1] str r1, [sp, 0x4] ldr r1, =gClockTable adds r0, r1 ldrb r0, [r0] strb r0, [r5, o_MusicPlayerTrack_gateTime] ldr r3, [r5, o_MusicPlayerTrack_cmdPtr] ldrb r0, [r3] cmp r0, 0x80 bhs _081DDB46 strb r0, [r5, o_MusicPlayerTrack_key] adds r3, 0x1 ldrb r0, [r3] cmp r0, 0x80 bhs _081DDB44 strb r0, [r5, o_MusicPlayerTrack_velocity] adds r3, 0x1 ldrb r0, [r3] cmp r0, 0x80 bhs _081DDB44 ldrb r1, [r5, o_MusicPlayerTrack_gateTime] adds r1, r0 strb r1, [r5, o_MusicPlayerTrack_gateTime] adds r3, 0x1 _081DDB44: str r3, [r5, o_MusicPlayerTrack_cmdPtr] _081DDB46: movs r0, 0 str r0, [sp, 0x14] adds r4, r5, 0 adds r4, o_MusicPlayerTrack_ToneData_type ldrb r2, [r4] movs r0, TONEDATA_TYPE_RHY | TONEDATA_TYPE_SPL tst r0, r2 beq _081DDB98 ldrb r3, [r5, o_MusicPlayerTrack_key] movs r0, TONEDATA_TYPE_SPL tst r0, r2 beq _081DDB66 ldr r1, [r5, o_MusicPlayerTrack_ToneData_keySplitTable] adds r1, r3 ldrb r0, [r1] b _081DDB68 _081DDB66: adds r0, r3, 0 _081DDB68: lsls r1, r0, 1 adds r1, r0 lsls r1, 2 ldr r0, [r5, o_MusicPlayerTrack_ToneData_wav] adds r1, r0 mov r9, r1 mov r6, r9 ldrb r1, [r6] movs r0, TONEDATA_TYPE_SPL | TONEDATA_TYPE_RHY tst r0, r1 beq _081DDB80 b _081DDCEA _081DDB80: movs r0, TONEDATA_TYPE_RHY tst r0, r2 beq _081DDB9C ldrb r1, [r6, o_ToneData_pan_sweep] movs r0, 0x80 tst r0, r1 beq _081DDB94 subs r1, TONEDATA_P_S_PAN lsls r1, 1 str r1, [sp, 0x14] _081DDB94: ldrb r3, [r6, o_SoundChannel_type] b _081DDB9C _081DDB98: mov r9, r4 ldrb r3, [r5, o_MusicPlayerTrack_key] _081DDB9C: str r3, [sp, 0x8] ldr r6, [sp] ldrb r1, [r6, o_MusicPlayerInfo_priority] ldrb r0, [r5, o_MusicPlayerTrack_priority] adds r0, r1 cmp r0, 0xFF bls _081DDBAC movs r0, 0xFF _081DDBAC: str r0, [sp, 0x10] mov r6, r9 ldrb r0, [r6, o_ToneData_type] movs r6, TONEDATA_TYPE_CGB ands r6, r0 str r6, [sp, 0xC] beq _081DDBEC ldr r0, [sp, 0x4] ldr r4, [r0, o_SoundInfo_cgbChans] cmp r4, 0 bne _081DDBC4 b _081DDCEA _081DDBC4: subs r6, 0x1 lsls r0, r6, 6 adds r4, r0 ldrb r1, [r4, o_CgbChannel_statusFlags] movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 beq _081DDC40 movs r0, SOUND_CHANNEL_SF_STOP tst r0, r1 bne _081DDC40 ldrb r1, [r4, o_CgbChannel_priority] ldr r0, [sp, 0x10] cmp r1, r0 bcc _081DDC40 beq _081DDBE4 b _081DDCEA _081DDBE4: ldr r0, [r4, o_CgbChannel_track] cmp r0, r5 bcs _081DDC40 b _081DDCEA _081DDBEC: ldr r6, [sp, 0x10] adds r7, r5, 0 movs r2, 0 mov r8, r2 ldr r4, [sp, 0x4] ldrb r3, [r4, o_SoundInfo_maxChans] adds r4, o_SoundInfo_chans _081DDBFA: ldrb r1, [r4, o_SoundChannel_statusFlags] movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 beq _081DDC40 movs r0, SOUND_CHANNEL_SF_STOP tst r0, r1 beq _081DDC14 cmp r2, 0 bne _081DDC18 adds r2, 0x1 ldrb r6, [r4, o_SoundChannel_priority] ldr r7, [r4, o_SoundChannel_track] b _081DDC32 _081DDC14: cmp r2, 0 bne _081DDC34 _081DDC18: ldrb r0, [r4, o_SoundChannel_priority] cmp r0, r6 bcs _081DDC24 adds r6, r0, 0 ldr r7, [r4, o_SoundChannel_track] b _081DDC32 _081DDC24: bhi _081DDC34 ldr r0, [r4, o_SoundChannel_track] cmp r0, r7 bls _081DDC30 adds r7, r0, 0 b _081DDC32 _081DDC30: bcc _081DDC34 _081DDC32: mov r8, r4 _081DDC34: adds r4, SoundChannel_size subs r3, 0x1 bgt _081DDBFA mov r4, r8 cmp r4, 0 beq _081DDCEA _081DDC40: adds r0, r4, 0 bl ClearChain movs r1, 0 str r1, [r4, o_SoundChannel_prevChannelPointer] ldr r3, [r5, o_MusicPlayerTrack_chan] str r3, [r4, o_SoundChannel_nextChannelPointer] cmp r3, 0 beq _081DDC54 str r4, [r3, o_SoundChannel_prevChannelPointer] _081DDC54: str r4, [r5, o_MusicPlayerTrack_chan] str r5, [r4, o_SoundChannel_track] ldrb r0, [r5, o_MusicPlayerTrack_lfoDelay] strb r0, [r5, o_MusicPlayerTrack_lfoDelayC] cmp r0, r1 beq _081DDC66 adds r1, r5, 0 bl clear_modM _081DDC66: ldr r0, [sp] adds r1, r5, 0 bl TrkVolPitSet ldr r0, [r5, o_MusicPlayerTrack_gateTime] str r0, [r4, o_SoundChannel_gateTime] ldr r0, [sp, 0x10] strb r0, [r4, o_SoundChannel_priority] ldr r0, [sp, 0x8] strb r0, [r4, o_SoundChannel_key] ldr r0, [sp, 0x14] strb r0, [r4, o_SoundChannel_rhythmPan] mov r6, r9 ldrb r0, [r6, o_ToneData_type] strb r0, [r4, o_SoundChannel_type] ldr r7, [r6, o_ToneData_wav] str r7, [r4, o_SoundChannel_wav] ldr r0, [r6, o_ToneData_attack] str r0, [r4, o_SoundChannel_attack] ldrh r0, [r5, o_MusicPlayerTrack_pseudoEchoVolume] strh r0, [r4, o_SoundChannel_pseudoEchoVolume] bl ChnVolSetAsm ldrb r1, [r4, o_SoundChannel_key] movs r0, o_MusicPlayerTrack_keyM ldrsb r0, [r5, r0] adds r3, r1, r0 bpl _081DDCA0 movs r3, 0 _081DDCA0: ldr r6, [sp, 0xC] cmp r6, 0 beq _081DDCCE mov r6, r9 ldrb r0, [r6, o_ToneData_length] strb r0, [r4, o_CgbChannel_length] ldrb r1, [r6, o_ToneData_pan_sweep] movs r0, 0x80 tst r0, r1 bne _081DDCBA movs r0, 0x70 tst r0, r1 bne _081DDCBC _081DDCBA: movs r1, 0x8 _081DDCBC: strb r1, [r4, o_CgbChannel_sweep] ldrb r2, [r5, o_MusicPlayerTrack_pitM] adds r1, r3, 0 ldr r0, [sp, 0xC] ldr r3, [sp, 0x4] ldr r3, [r3, o_SoundInfo_MidiKeyToCgbFreq] bl call_r3 b _081DDCDC _081DDCCE: ldr r0, [r5, o_MusicPlayerTrack_unk_3C] str r0, [r4, o_SoundChannel_count] ldrb r2, [r5, o_MusicPlayerTrack_pitM] adds r1, r3, 0 adds r0, r7, 0 bl MidiKeyToFreq _081DDCDC: str r0, [r4, o_SoundChannel_frequency] movs r0, SOUND_CHANNEL_SF_START strb r0, [r4, o_SoundChannel_statusFlags] ldrb r1, [r5, o_MusicPlayerTrack_flags] movs r0, 0xF0 ands r0, r1 strb r0, [r5, o_MusicPlayerTrack_flags] _081DDCEA: add sp, 0x18 pop {r0-r7} mov r8, r0 mov r9, r1 mov r10, r2 mov r11, r3 pop {r0} bx r0 .pool thumb_func_end ply_note thumb_func_start ply_endtie ply_endtie: push {r4,r5} ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] cmp r3, 0x80 bhs _081DDD16 strb r3, [r1, o_MusicPlayerTrack_key] adds r2, 0x1 str r2, [r1, o_MusicPlayerTrack_cmdPtr] b _081DDD18 _081DDD16: ldrb r3, [r1, o_MusicPlayerTrack_key] _081DDD18: ldr r1, [r1, o_MusicPlayerTrack_chan] cmp r1, 0 beq _081DDD40 movs r4, SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_ENV movs r5, SOUND_CHANNEL_SF_STOP _081DDD22: ldrb r2, [r1, o_SoundChannel_statusFlags] tst r2, r4 beq _081DDD3A tst r2, r5 bne _081DDD3A ldrb r0, [r1, o_SoundChannel_midiKey] cmp r0, r3 bne _081DDD3A movs r0, SOUND_CHANNEL_SF_STOP orrs r2, r0 strb r2, [r1, o_SoundChannel_statusFlags] b _081DDD40 _081DDD3A: ldr r1, [r1, o_SoundChannel_nextChannelPointer] cmp r1, 0 bne _081DDD22 _081DDD40: pop {r4,r5} bx lr thumb_func_end ply_endtie thumb_func_start clear_modM clear_modM: movs r2, 0 strb r2, [r1, o_MusicPlayerTrack_modM] strb r2, [r1, o_MusicPlayerTrack_lfoSpeedC] ldrb r2, [r1, o_MusicPlayerTrack_modT] cmp r2, 0 bne _081DDD54 movs r2, MPT_FLG_PITCHG b _081DDD56 _081DDD54: movs r2, MPT_FLG_VOLCHG _081DDD56: ldrb r3, [r1, o_MusicPlayerTrack_flags] orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx lr thumb_func_end clear_modM thumb_func_start ld_r3_tp_adr_i ld_r3_tp_adr_i_unchecked: ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] adds r3, r2, 1 str r3, [r1, o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] bx lr thumb_func_end ld_r3_tp_adr_i thumb_func_start ply_lfos ply_lfos: mov r12, lr bl ld_r3_tp_adr_i_unchecked strb r3, [r1, o_MusicPlayerTrack_lfoSpeed] cmp r3, 0 bne _081DDD7C bl clear_modM _081DDD7C: bx r12 thumb_func_end ply_lfos thumb_func_start ply_mod ply_mod: mov r12, lr bl ld_r3_tp_adr_i_unchecked strb r3, [r1, o_MusicPlayerTrack_mod] cmp r3, 0 bne _081DDD90 bl clear_modM _081DDD90: bx r12 thumb_func_end ply_mod .align 2, 0 @ Don't pad with nop. .bss .align 3 sDecodingBuffer: @ Used as a buffer for audio decoded from compressed DPCM .space 0x40 .size sDecodingBuffer, .-sDecodingBuffer ================================================ FILE: src/m4a_tables.c ================================================ #include "gba/m4a_internal.h" // Some of these functions have different signatures, so we need to make this // an array of void pointers or a struct. It's simpler to just make it an array // for now. void *const gMPlayJumpTableTemplate[] = { ply_fine, ply_goto, ply_patt, ply_pend, ply_rept, ply_fine, ply_fine, ply_fine, ply_fine, ply_prio, ply_tempo, ply_keysh, ply_voice, ply_vol, ply_pan, ply_bend, ply_bendr, ply_lfos, ply_lfodl, ply_mod, ply_modt, ply_fine, ply_fine, ply_tune, ply_fine, ply_fine, ply_fine, ply_port, ply_fine, ply_endtie, SampleFreqSet, TrackStop, FadeOutBody, TrkVolPitSet, RealClearChain, SoundMainBTM, }; // This is a table of deltas between sample values in compressed PCM data. const s8 gDeltaEncodingTable[] = { 0, 1, 4, 9, 16, 25, 36, 49, -64, -49, -36, -25, -16, -9, -4, -1, }; const u8 gScaleTable[] = { 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, }; const u32 gFreqTable[] = { 2147483648u, 2275179671u, 2410468894u, 2553802834u, 2705659852u, 2866546760u, 3037000500u, 3217589947u, 3408917802u, 3611622603u, 3826380858u, 4053909305u, }; const u16 gPcmSamplesPerVBlankTable[] = { 96, 132, 176, 224, 264, 304, 352, 448, 528, 608, 672, 704, }; const u8 gCgbScaleTable[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, }; const s16 gCgbFreqTable[] = { -2004, -1891, -1785, -1685, -1591, -1501, -1417, -1337, -1262, -1192, -1125, -1062, }; const u8 gNoiseTable[] = { 0xD7, 0xD6, 0xD5, 0xD4, 0xC7, 0xC6, 0xC5, 0xC4, 0xB7, 0xB6, 0xB5, 0xB4, 0xA7, 0xA6, 0xA5, 0xA4, 0x97, 0x96, 0x95, 0x94, 0x87, 0x86, 0x85, 0x84, 0x77, 0x76, 0x75, 0x74, 0x67, 0x66, 0x65, 0x64, 0x57, 0x56, 0x55, 0x54, 0x47, 0x46, 0x45, 0x44, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x25, 0x24, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, }; const u8 gCgb3Vol[] = { 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x20, 0x20, }; const u8 gClockTable[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1C, 0x1E, 0x20, 0x24, 0x28, 0x2A, 0x2C, 0x30, 0x34, 0x36, 0x38, 0x3C, 0x40, 0x42, 0x44, 0x48, 0x4C, 0x4E, 0x50, 0x54, 0x58, 0x5A, 0x5C, 0x60, }; #define FINE 0xb1 #define GOTO 0xb2 #define PATT 0xb3 #define PEND 0xb4 #define REPT 0xb5 #define MEMACC 0xb9 #define PRIO 0xba #define TEMPO 0xbb #define KEYSH 0xbc #define VOICE 0xbd #define VOL 0xbe #define PAN 0xbf #define BEND 0xc0 #define BENDR 0xc1 #define LFOS 0xc2 #define LFODL 0xc3 #define MOD 0xc4 #define MODT 0xc5 #define TUNE 0xc8 #define XCMD 0xcd #define xRELE 0x07 #define xIECV 0x08 #define xIECL 0x09 #define EOT 0xce #define TIE 0xcf const struct PokemonCrySong gPokemonCrySongTemplate = { 1, // track count 0, // block count 255, // priority 0, // reverb (struct ToneData *)&voicegroup000, NULL, NULL, 0, TUNE, // part 0 C_V, // TUNE value GOTO, 0, // GOTO target address TUNE, // part 1 C_V + 16, // TUNE value {VOICE, 0}, // part 0 jumps here with GOTO VOL, 127, // volume {XCMD, 0x0D}, 0, // unk value {XCMD, xRELE}, 0, // release PAN, C_V, // PAN value TIE, 60, // TIE key (default is Cn3) 127, // TIE velocity {XCMD, 0x0C}, 60, // unk value {EOT, FINE} // end }; const XcmdFunc gXcmdTable[] = { ply_xxx, ply_xwave, ply_xtype, ply_xxx, ply_xatta, ply_xdeca, ply_xsust, ply_xrele, ply_xiecv, ply_xiecl, ply_xleng, ply_xswee, ply_xcmd_0C, ply_xcmd_0D, }; ================================================ FILE: src/mail.c ================================================ #include "global.h" #include "gflib.h" #include "scanline_effect.h" #include "palette.h" #include "text_window.h" #include "easy_chat.h" #include "mail.h" #include "task.h" #include "menu.h" #include "mail_data.h" #include "player_pc.h" #include "overworld.h" #include "help_system.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "graphics.h" #include "pokemon_icon.h" #include "string_util.h" #include "strings.h" #include "constants/items.h" enum MailIconParam { MAIL_ICON_NONE = 0, MAIL_ICON_BEAD, MAIL_ICON_DREAM }; struct MailEcWordLayout { u32 numWordsInLine:2; u32 lineXoffset:6; u32 lineHeight:8; }; struct MailAttrStruct { u8 numRows; u8 nameY; u8 nameX; u8 messageTop; u8 messageLeft; const struct MailEcWordLayout * linesLayout; }; struct MailGfxData { const void *pal; const void *tiles; const void *map; u32 size; u16 textpals[2]; }; struct MailViewResources { u8 messageLinesBuffer[8][26]; u8 authorNameBuffer[12]; void (*savedCallback)(void); void (*showMailCallback)(void); struct Mail * mail; bool8 messageExists; u8 nameX; u8 mailType; u8 monIconType; u8 monIconSpriteId; u8 unused; u8 mailArrangementType; u8 *(*copyEasyChatWord)(u8 *dest, u16 word); u8 *(*convertEasyChatWordsToString)(u8 *dest, const u16 *src, u16 length1, u16 length2); const struct MailAttrStruct * messageLayout; u16 bg1TilemapBuffer[BG_SCREEN_SIZE]; u16 bg2TilemapBuffer[BG_SCREEN_SIZE]; }; static EWRAM_DATA struct MailViewResources * sMailViewResources = NULL; static void CB2_InitMailView(void); static void BufferMailMessage(void); static void AddMailMessagePrinters(void); static void VBlankCB_ShowMail(void); static void CB2_RunShowMailCB(void); static void ShowMailCB_WaitFadeIn(void); static void ShowMailCB_WaitButton(void); static void ShowMailCB_Teardown(void); static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 } }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 3, .tilemapTop = 4, .width = 24, .height = 10, .paletteNum = 15, .baseBlock = 0x001 }, { .bg = 0, .tilemapLeft = 15, .tilemapTop = 15, .width = 13, .height = 3, .paletteNum = 15, .baseBlock = 0x0F2 }, DUMMY_WIN_TEMPLATE }; static const u8 sTextColor[] = { 0, 10, 11 }; static const u16 sGenderPals[][2] = { { RGB(13, 22, 26), RGB(05, 13, 20) }, { RGB(28, 15, 17), RGB(20, 06, 14) } }; static const struct MailGfxData sGfxHeaders[] = { [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)] = { .pal = gFile_graphics_mail_orange_palette_pal, .tiles = gFile_graphics_mail_orange_tiles_sheet, .map = gFile_graphics_mail_orange_map_tilemap, .size = 0x2c0, .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } }, [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)] = { .pal = gFile_graphics_mail_harbor_palette_pal, .tiles = gFile_graphics_mail_harbor_tiles_sheet, .map = gFile_graphics_mail_harbor_map_tilemap, .size = 0x2e0, .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } }, [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = { .pal = gFile_graphics_mail_glitter_palette_pal, .tiles = gFile_graphics_mail_glitter_tiles_sheet, .map = gFile_graphics_mail_glitter_map_tilemap, .size = 0x400, .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } }, [ITEM_TO_MAIL(ITEM_MECH_MAIL)] = { .pal = gFile_graphics_mail_mech_palette_pal, .tiles = gFile_graphics_mail_mech_tiles_sheet, .map = gFile_graphics_mail_mech_map_tilemap, .size = 0x1e0, .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } }, [ITEM_TO_MAIL(ITEM_WOOD_MAIL)] = { .pal = gFile_graphics_mail_wood_palette_pal, .tiles = gFile_graphics_mail_wood_tiles_sheet, .map = gFile_graphics_mail_wood_map_tilemap, .size = 0x2e0, .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } }, [ITEM_TO_MAIL(ITEM_WAVE_MAIL)] = { .pal = gFile_graphics_mail_wave_palette_pal, .tiles = gFile_graphics_mail_wave_tiles_sheet, .map = gFile_graphics_mail_wave_map_tilemap, .size = 0x300, .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } }, [ITEM_TO_MAIL(ITEM_BEAD_MAIL)] = { .pal = gFile_graphics_mail_bead_palette_pal, .tiles = gFile_graphics_mail_bead_tiles_sheet, .map = gFile_graphics_mail_bead_map_tilemap, .size = 0x140, .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } }, [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)] = { .pal = gFile_graphics_mail_shadow_palette_pal, .tiles = gFile_graphics_mail_shadow_tiles_sheet, .map = gFile_graphics_mail_shadow_map_tilemap, .size = 0x300, .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) } }, [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)] = { .pal = gFile_graphics_mail_tropic_palette_pal, .tiles = gFile_graphics_mail_tropic_tiles_sheet, .map = gFile_graphics_mail_tropic_map_tilemap, .size = 0x220, .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } }, [ITEM_TO_MAIL(ITEM_DREAM_MAIL)] = { .pal = gFile_graphics_mail_dream_palette_pal, .tiles = gFile_graphics_mail_dream_tiles_sheet, .map = gFile_graphics_mail_dream_map_tilemap, .size = 0x340, .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } }, [ITEM_TO_MAIL(ITEM_FAB_MAIL)] = { .pal = gFile_graphics_mail_fab_palette_pal, .tiles = gFile_graphics_mail_fab_tiles_sheet, .map = gFile_graphics_mail_fab_map_tilemap, .size = 0x2a0, .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } }, [ITEM_TO_MAIL(ITEM_RETRO_MAIL)] = { .pal = gFile_graphics_mail_retro_palette_pal, .tiles = gFile_graphics_mail_retro_tiles_sheet, .map = gFile_graphics_mail_retro_map_tilemap, .size = 0x520, .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) } } }; static const struct MailEcWordLayout sLayout_3x3[] = { { .numWordsInLine = 3, .lineXoffset = 0, .lineHeight = 16 }, { .numWordsInLine = 3, .lineXoffset = 0, .lineHeight = 16 }, { .numWordsInLine = 3, .lineXoffset = 0, .lineHeight = 16 } }; static const struct MailAttrStruct sMessageLayouts_3x3[] = { [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_MECH_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_WOOD_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_WAVE_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_BEAD_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_DREAM_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_FAB_MAIL)] = { .numRows = 3, .nameY = 8, .nameX = 0, .messageTop = 2, .messageLeft = 4, .linesLayout = sLayout_3x3 }, [ITEM_TO_MAIL(ITEM_RETRO_MAIL)] = { .numRows = 3, .nameY = 0, .nameX = 0, .messageTop = 2, .messageLeft = 0, .linesLayout = sLayout_3x3 }, }; static const struct MailEcWordLayout sLayout_5x2[] = { { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 }, { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 }, { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 }, { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 }, { .numWordsInLine = 1, .lineXoffset = 0, .lineHeight = 16 } }; static const struct MailAttrStruct sMessageLayouts_5x2[] = { [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)] = { .numRows = 5, .nameY = 0, .nameX = 8, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)] = { .numRows = 5, .nameY = 3, .nameX = 14, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = { .numRows = 5, .nameY = 0, .nameX = 16, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_MECH_MAIL)] = { .numRows = 5, .nameY = 0, .nameX = 14, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_WOOD_MAIL)] = { .numRows = 5, .nameY = 3, .nameX = 12, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_WAVE_MAIL)] = { .numRows = 5, .nameY = 0, .nameX = 18, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_BEAD_MAIL)] = { .numRows = 5, .nameY = 0, .nameX = 20, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)] = { .numRows = 5, .nameY = 6, .nameX = 20, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)] = { .numRows = 5, .nameY = 0, .nameX = 16, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_DREAM_MAIL)] = { .numRows = 5, .nameY = 0, .nameX = 14, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_FAB_MAIL)] = { .numRows = 5, .nameY = 8, .nameX = 16, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, [ITEM_TO_MAIL(ITEM_RETRO_MAIL)] = { .numRows = 5, .nameY = 0, .nameX = 16, .messageTop = 3, .messageLeft = 8, .linesLayout = sLayout_5x2 }, }; void ReadMail(struct Mail * mail, void (*savedCallback)(void), bool8 messageExists) { u16 sp0; u16 species; sMailViewResources = AllocZeroed(sizeof(struct MailViewResources)); sMailViewResources->unused = 2; sMailViewResources->mailArrangementType = 1; sMailViewResources->copyEasyChatWord = CopyEasyChatWord; sMailViewResources->convertEasyChatWordsToString = ConvertEasyChatWordsToString; if (IS_ITEM_MAIL(mail->itemId)) { sMailViewResources->mailType = ITEM_TO_MAIL(mail->itemId); } else { sMailViewResources->mailType = ITEM_TO_MAIL(ITEM_ORANGE_MAIL); messageExists = FALSE; } switch (sMailViewResources->mailArrangementType) { case 0: default: sMailViewResources->messageLayout = &sMessageLayouts_3x3[sMailViewResources->mailType]; break; case 1: sMailViewResources->messageLayout = &sMessageLayouts_5x2[sMailViewResources->mailType]; break; } species = MailSpeciesToSpecies(mail->species, &sp0); if (species != SPECIES_NONE && species < NUM_SPECIES) { switch (sMailViewResources->mailType) { default: sMailViewResources->monIconType = MAIL_ICON_NONE; break; case ITEM_TO_MAIL(ITEM_BEAD_MAIL): sMailViewResources->monIconType = MAIL_ICON_BEAD; break; case ITEM_TO_MAIL(ITEM_DREAM_MAIL): sMailViewResources->monIconType = MAIL_ICON_DREAM; break; } } else { sMailViewResources->monIconType = MAIL_ICON_NONE; } sMailViewResources->mail = mail; sMailViewResources->savedCallback = savedCallback; sMailViewResources->messageExists = messageExists; SetMainCallback2(CB2_InitMailView); } static bool8 DoInitMailView(void) { u16 iconId; switch (gMain.state) { case 0: SetVBlankCallback(NULL); ScanlineEffect_Stop(); SetGpuReg(REG_OFFSET_DISPCNT, 0); if (gPlayerPcMenuManager.notInRoom == FALSE) SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX); else SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX); break; case 1: CpuFill16(0, (void *)OAM, OAM_SIZE); break; case 2: ResetPaletteFade(); break; case 3: ResetTasks(); break; case 4: ResetSpriteData(); break; case 5: FreeAllSpritePalettes(); ResetTempTileDataBuffers(); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); break; case 6: ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetBgTilemapBuffer(1, sMailViewResources->bg1TilemapBuffer); SetBgTilemapBuffer(2, sMailViewResources->bg2TilemapBuffer); break; case 7: InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); break; case 8: DecompressAndCopyTileDataToVram(1, sGfxHeaders[sMailViewResources->mailType].tiles, 0, 0x000, 0); break; case 9: if (FreeTempTileDataBuffersIfPossible()) return FALSE; break; case 10: FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 0x001, 0, 0, 30, 20); CopyToBgTilemapBuffer(1, sGfxHeaders[sMailViewResources->mailType].map, 0, 0x000); break; case 11: CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); break; case 12: LoadPalette(GetTextWindowPalette(0), BG_PLTT_ID(15), PLTT_SIZE_4BPP); gPlttBufferUnfaded[BG_PLTT_ID(15) + 10] = sGfxHeaders[sMailViewResources->mailType].textpals[0]; gPlttBufferFaded[BG_PLTT_ID(15) + 10] = sGfxHeaders[sMailViewResources->mailType].textpals[0]; gPlttBufferUnfaded[BG_PLTT_ID(15) + 11] = sGfxHeaders[sMailViewResources->mailType].textpals[1]; gPlttBufferFaded[BG_PLTT_ID(15) + 11] = sGfxHeaders[sMailViewResources->mailType].textpals[1]; LoadPalette(sGfxHeaders[sMailViewResources->mailType].pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); gPlttBufferUnfaded[BG_PLTT_ID(0) + 10] = sGenderPals[gSaveBlock2Ptr->playerGender][0]; gPlttBufferFaded[BG_PLTT_ID(0) + 10] = sGenderPals[gSaveBlock2Ptr->playerGender][0]; gPlttBufferUnfaded[BG_PLTT_ID(0) + 11] = sGenderPals[gSaveBlock2Ptr->playerGender][1]; gPlttBufferFaded[BG_PLTT_ID(0) + 11] = sGenderPals[gSaveBlock2Ptr->playerGender][1]; break; case 13: if (sMailViewResources->messageExists) BufferMailMessage(); break; case 14: if (sMailViewResources->messageExists) { AddMailMessagePrinters(); RunTextPrinters(); } break; case 15: if (Overworld_LinkRecvQueueLengthMoreThan2() == TRUE) return FALSE; break; case 16: SetVBlankCallback(VBlankCB_ShowMail); gPaletteFade.bufferTransferDisabled = TRUE; break; case 17: iconId = MailSpeciesToIconSpecies(sMailViewResources->mail->species); switch (sMailViewResources->monIconType) { case MAIL_ICON_BEAD: LoadMonIconPalette(iconId); sMailViewResources->monIconSpriteId = CreateMonIcon_HandleDeoxys(iconId, SpriteCallbackDummy, 0x60, 0x80, 0, FALSE); break; case MAIL_ICON_DREAM: LoadMonIconPalette(iconId); sMailViewResources->monIconSpriteId = CreateMonIcon_HandleDeoxys(iconId, SpriteCallbackDummy, 0x28, 0x80, 0, FALSE); break; } break; case 18: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); ShowBg(1); ShowBg(2); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gPaletteFade.bufferTransferDisabled = FALSE; sMailViewResources->showMailCallback = ShowMailCB_WaitFadeIn; return TRUE; default: return FALSE; } gMain.state++; return FALSE; } static void CB2_InitMailView(void) { do { if (DoInitMailView() == TRUE) { SetMainCallback2(CB2_RunShowMailCB); break; } } while (MenuHelpers_IsLinkActive() != TRUE); } static void BufferMailMessage(void) { u32 i; u8 j = 0; for (i = 0; i < sMailViewResources->messageLayout->numRows; i++) { ConvertEasyChatWordsToString(sMailViewResources->messageLinesBuffer[i], &sMailViewResources->mail->words[j], sMailViewResources->messageLayout->linesLayout[i].numWordsInLine, 1); j += sMailViewResources->messageLayout->linesLayout[i].numWordsInLine; } if (sMailViewResources->mailArrangementType == 0) { StringCopy(StringCopy(sMailViewResources->authorNameBuffer, sMailViewResources->mail->playerName), gText_From); // ??? sMailViewResources->nameX = sMailViewResources->messageLayout->nameX + 0x60 - 8 * StringLength(sMailViewResources->authorNameBuffer); } else { StringCopy(sMailViewResources->authorNameBuffer, sMailViewResources->mail->playerName); if (StringLength(sMailViewResources->authorNameBuffer) < 6) ConvertInternationalString(sMailViewResources->authorNameBuffer, LANGUAGE_JAPANESE); sMailViewResources->nameX = sMailViewResources->messageLayout->nameX; } } static void AddMailMessagePrinters(void) { u8 y = 0; u32 i; u32 width; PutWindowTilemap(0); PutWindowTilemap(1); FillWindowPixelBuffer(0, PIXEL_FILL(0)); FillWindowPixelBuffer(1, PIXEL_FILL(0)); for (i = 0; i < sMailViewResources->messageLayout->numRows; i++) { if (sMailViewResources->messageLinesBuffer[i][0] != EOS && sMailViewResources->messageLinesBuffer[i][0] != CHAR_SPACE) { AddTextPrinterParameterized3(0, FONT_NORMAL_COPY_1, sMailViewResources->messageLayout->linesLayout[i].lineXoffset + sMailViewResources->messageLayout->messageLeft, y + sMailViewResources->messageLayout->messageTop, sTextColor, 0, sMailViewResources->messageLinesBuffer[i]); y += sMailViewResources->messageLayout->linesLayout[i].lineHeight; } } width = GetStringWidth(FONT_NORMAL_COPY_1, gText_From, 0); AddTextPrinterParameterized3(1, FONT_NORMAL_COPY_1, sMailViewResources->nameX, sMailViewResources->messageLayout->nameY, sTextColor, 0, gText_From); AddTextPrinterParameterized3(1, FONT_NORMAL_COPY_1, sMailViewResources->nameX + width, sMailViewResources->messageLayout->nameY, sTextColor, 0, sMailViewResources->authorNameBuffer); CopyWindowToVram(0, COPYWIN_FULL); CopyWindowToVram(1, COPYWIN_FULL); } static void VBlankCB_ShowMail(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB2_RunShowMailCB(void) { if (sMailViewResources->monIconType != MAIL_ICON_NONE) { AnimateSprites(); BuildOamBuffer(); } sMailViewResources->showMailCallback(); } static void ShowMailCB_WaitFadeIn(void) { if (!UpdatePaletteFade()) sMailViewResources->showMailCallback = ShowMailCB_WaitButton; } static void ShowMailCB_WaitButton(void) { if (JOY_NEW(A_BUTTON | B_BUTTON)) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sMailViewResources->showMailCallback = ShowMailCB_Teardown; } } static void ShowMailCB_Teardown(void) { if (!UpdatePaletteFade()) { SetMainCallback2(sMailViewResources->savedCallback); switch (sMailViewResources->monIconType) { case MAIL_ICON_BEAD: case MAIL_ICON_DREAM: FreeMonIconPalette(MailSpeciesToIconSpecies(sMailViewResources->mail->species)); DestroyMonIcon(&gSprites[sMailViewResources->monIconSpriteId]); break; } *sMailViewResources = (struct MailViewResources){}; ResetPaletteFade(); FreeAllWindowBuffers(); FREE_AND_SET_NULL(sMailViewResources); } } ================================================ FILE: src/mail_data.c ================================================ #include "global.h" #include "gflib.h" #include "mail.h" #include "mail_data.h" #include "constants/items.h" #include "pokemon_icon.h" #define UNOWN_OFFSET 30000 void ClearMailData(void) { u32 i; for (i = 0; i < MAIL_COUNT; i++) ClearMailStruct(&gSaveBlock1Ptr->mail[i]); } void ClearMailStruct(struct Mail *mail) { s32 i; for (i = 0; i < MAIL_WORDS_COUNT; i++) mail->words[i] = 0xFFFF; for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) mail->playerName[i] = EOS; for (i = 0; i < 4; i++) mail->trainerId[i] = 0; mail->species = SPECIES_BULBASAUR; mail->itemId = ITEM_NONE; } bool8 MonHasMail(struct Pokemon *mon) { u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) return TRUE; else return FALSE; } u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) { u8 heldItem[2]; u8 id, i; u16 species; u32 personality; heldItem[0] = itemId; heldItem[1] = itemId >> 8; for (id = 0; id < PARTY_SIZE; id++) { if (gSaveBlock1Ptr->mail[id].itemId == 0) { for (i = 0; i < MAIL_WORDS_COUNT; i++) gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF; for (i = 0; i < PLAYER_NAME_LENGTH && gSaveBlock2Ptr->playerName[i] != EOS; i++) gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i]; for (; i <= 5; i++) gSaveBlock1Ptr->mail[id].playerName[i] = CHAR_SPACE; gSaveBlock1Ptr->mail[id].playerName[i] = EOS; for (i = 0; i < 4; i++) gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; species = GetBoxMonData(&mon->box, MON_DATA_SPECIES); personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY); gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality); gSaveBlock1Ptr->mail[id].itemId = itemId; SetMonData(mon, MON_DATA_MAIL, &id); SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); return id; } } return 0xFF; } u16 SpeciesToMailSpecies(u16 species, u32 personality) { if (species == SPECIES_UNOWN) { u32 mailSpecies = GetUnownLetterByPersonality(personality) + UNOWN_OFFSET; return mailSpecies; } return species; } u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *unownLetter) { u16 result; if (mailSpecies >= UNOWN_OFFSET && mailSpecies < (UNOWN_OFFSET + NUM_UNOWN_FORMS)) { result = SPECIES_UNOWN; *unownLetter = mailSpecies - UNOWN_OFFSET; } else { result = mailSpecies; } return result; } u8 GiveMailToMon2(struct Pokemon *mon, struct Mail *mail) { u8 heldItem[2]; u16 itemId = mail->itemId; u8 mailId = GiveMailToMon(mon, itemId); if (mailId == 0xFF) return 0xFF; gSaveBlock1Ptr->mail[mailId] = *mail; SetMonData(mon, MON_DATA_MAIL, &mailId); heldItem[0] = itemId; heldItem[1] = itemId >> 8; SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); return mailId; } static bool32 DummyMailFunc(void) { return FALSE; } void TakeMailFromMon(struct Pokemon *mon) { u8 heldItem[2]; u8 mailId; if (MonHasMail(mon)) { mailId = GetMonData(mon, MON_DATA_MAIL); gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; mailId = 0xFF; heldItem[0] = ITEM_NONE; heldItem[1] = ITEM_NONE << 8; SetMonData(mon, MON_DATA_MAIL, &mailId); SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); } } void ClearMailItemId(u8 mailId) { gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; } u8 TakeMailFromMon2(struct Pokemon *mon) { u8 i, newMailId; u8 newHeldItem[2]; newHeldItem[0] = ITEM_NONE; newHeldItem[1] = ITEM_NONE << 8; newMailId = 0xFF; for (i = PARTY_SIZE; i < MAIL_COUNT; i++) { if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE) { memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct Mail)); gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE; SetMonData(mon, MON_DATA_MAIL, &newMailId); SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem); return i; } } return 0xFF; } bool8 ItemIsMail(u16 itemId) { switch (itemId) { case ITEM_ORANGE_MAIL: case ITEM_HARBOR_MAIL: case ITEM_GLITTER_MAIL: case ITEM_MECH_MAIL: case ITEM_WOOD_MAIL: case ITEM_WAVE_MAIL: case ITEM_BEAD_MAIL: case ITEM_SHADOW_MAIL: case ITEM_TROPIC_MAIL: case ITEM_DREAM_MAIL: case ITEM_FAB_MAIL: case ITEM_RETRO_MAIL: return TRUE; default: return FALSE; } } ================================================ FILE: src/mailbox_pc.c ================================================ #include "global.h" #include "gflib.h" #include "menu.h" #include "new_menu_helpers.h" #include "list_menu.h" #include "player_pc.h" #include "strings.h" #include "menu_indicators.h" #include "constants/songs.h" static EWRAM_DATA u8 sWindowIds[3] = {}; static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL; static void MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list); static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 10, .height = 2, .paletteNum = 15, .baseBlock = 0x008 }, { .bg = 0, .tilemapLeft = 19, .tilemapTop = 1, .width = 10, .height = 18, .paletteNum = 15, .baseBlock = 0x01c }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 15, .height = 8, .paletteNum = 15, .baseBlock = 0x01c } }; static const u8 sTextColor[3] = {1, 2, 3}; static const u8 sString_Dummy[] = _(""); bool8 MailboxPC_InitBuffers(u8 num) { u32 i; sListMenuItems = Alloc(sizeof(struct ListMenuItem) * (num + 1)); if (sListMenuItems == NULL) return FALSE; for (i = 0; i < NELEMS(sWindowIds); i++) sWindowIds[i] = 0xFF; return TRUE; } u8 MailboxPC_GetAddWindow(u8 winIdx) { if (sWindowIds[winIdx] == 0xFF) { sWindowIds[winIdx] = AddWindow(&sWindowTemplates[winIdx]); SetStdWindowBorderStyle(sWindowIds[winIdx], 0); } return sWindowIds[winIdx]; } void MailboxPC_RemoveWindow(u8 winIdx) { ClearStdWindowAndFrameToTransparent(sWindowIds[winIdx], FALSE); ClearWindowTilemap(sWindowIds[winIdx]); RemoveWindow(sWindowIds[winIdx]); sWindowIds[winIdx] = 0xFF; } u8 MailboxPC_GetWindowId(u8 winIdx) { return sWindowIds[winIdx]; } static void ItemPrintFunc(u8 windowId, u32 itemId, u8 y) { u8 strbuf[30]; if (itemId != -2) { StringCopy(strbuf, gSaveBlock1Ptr->mail[itemId + PARTY_SIZE].playerName); if (StringLength(strbuf) <= 5) ConvertInternationalString(strbuf, LANGUAGE_JAPANESE); AddTextPrinterParameterized4(windowId, FONT_NORMAL, 8, y, 0, 0, sTextColor, -1, strbuf); } } u8 MailboxPC_InitListMenu(struct PlayerPCItemPageStruct * playerPcStruct) { u32 i; for (i = 0; i < playerPcStruct->count; i++) { sListMenuItems[i].label = sString_Dummy; sListMenuItems[i].index = i; } sListMenuItems[i].label = gFameCheckerText_Cancel; sListMenuItems[i].index = -2; gMultiuseListMenuTemplate.items = sListMenuItems; gMultiuseListMenuTemplate.totalItems = playerPcStruct->count + 1; gMultiuseListMenuTemplate.windowId = sWindowIds[1]; gMultiuseListMenuTemplate.header_X = 0; gMultiuseListMenuTemplate.item_X = GetMenuCursorDimensionByFont(FONT_NORMAL, 0); gMultiuseListMenuTemplate.cursor_X = 0; gMultiuseListMenuTemplate.lettersSpacing = 0; gMultiuseListMenuTemplate.itemVerticalPadding = 2; gMultiuseListMenuTemplate.maxShowed = 8; gMultiuseListMenuTemplate.fontId = FONT_NORMAL; gMultiuseListMenuTemplate.upText_Y = 10; gMultiuseListMenuTemplate.cursorPal = 2; gMultiuseListMenuTemplate.fillValue = 1; gMultiuseListMenuTemplate.cursorShadowPal = 3; gMultiuseListMenuTemplate.moveCursorFunc = MoveCursorFunc; gMultiuseListMenuTemplate.itemPrintFunc = ItemPrintFunc; gMultiuseListMenuTemplate.cursorKind = 0; gMultiuseListMenuTemplate.scrollMultiple = 0; return ListMenuInit(&gMultiuseListMenuTemplate, playerPcStruct->cursorPos, playerPcStruct->itemsAbove); } static void MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list) { if (onInit != TRUE) PlaySE(SE_SELECT); } void MailboxPC_AddScrollIndicatorArrows(struct PlayerPCItemPageStruct * playerPcStruct) { playerPcStruct->scrollIndicatorId = AddScrollIndicatorArrowPairParameterized(2, 0xC2, 0xC, 0x94, playerPcStruct->count - playerPcStruct->pageItems + 1, 110, 110, &playerPcStruct->cursorPos); } void MailboxPC_DestroyListMenuBuffer(void) { Free(sListMenuItems); } ================================================ FILE: src/main.c ================================================ #include "global.h" #include "gflib.h" #include "link.h" #include "link_rfu.h" #include "load_save.h" #include "m4a.h" #include "random.h" #include "gba/flash_internal.h" #include "help_system.h" #include "new_menu_helpers.h" #include "overworld.h" #include "play_time.h" #include "intro.h" #include "battle_controllers.h" #include "scanline_effect.h" #include "save_failed_screen.h" #include "quest_log.h" extern u32 intr_main[]; static void VBlankIntr(void); static void HBlankIntr(void); static void VCountIntr(void); static void SerialIntr(void); static void IntrDummy(void); const u8 gGameVersion = GAME_VERSION; const u8 gGameLanguage = GAME_LANGUAGE; #if MODERN const char BuildDateTime[] = __DATE__ " " __TIME__; #else const char BuildDateTime[] = "2004 04 26 11:20"; #endif //MODERN const IntrFunc gIntrTableTemplate[] = { VCountIntr, // V-count interrupt SerialIntr, // Serial interrupt Timer3Intr, // Timer 3 interrupt HBlankIntr, // H-blank interrupt VBlankIntr, // V-blank interrupt IntrDummy, // Timer 0 interrupt IntrDummy, // Timer 1 interrupt IntrDummy, // Timer 2 interrupt IntrDummy, // DMA 0 interrupt IntrDummy, // DMA 1 interrupt IntrDummy, // DMA 2 interrupt IntrDummy, // DMA 3 interrupt IntrDummy, // Key interrupt IntrDummy, // Game Pak interrupt }; #define INTR_COUNT ((int)(sizeof(gIntrTableTemplate)/sizeof(IntrFunc))) u16 gKeyRepeatStartDelay; u8 gLinkTransferringData; struct Main gMain; u16 gKeyRepeatContinueDelay; u8 gSoftResetDisabled; IntrFunc gIntrTable[INTR_COUNT]; bool8 gLinkVSyncDisabled; u32 IntrMain_Buffer[0x200]; u8 gPcmDmaCounter; // These variables are not defined in RS or Emerald, and are never read. // They were likely used to debug the audio engine and VCount interrupt. u8 sVcountAfterSound; u8 sVcountAtIntr; u8 sVcountBeforeSound; static IntrFunc * const sTimerIntrFunc = gIntrTable + 0x7; EWRAM_DATA u8 gDecompressionBuffer[0x4000] = {0}; EWRAM_DATA u16 gTrainerId = 0; static void UpdateLinkAndCallCallbacks(void); static void InitMainCallbacks(void); static void CallCallbacks(void); static void ReadKeys(void); void InitIntrHandlers(void); static void WaitForVBlank(void); void EnableVCountIntrAtLine150(void); #define B_START_SELECT (B_BUTTON | START_BUTTON | SELECT_BUTTON) void AgbMain() { #if MODERN // Modern compilers are liberal with the stack on entry to this function, // so RegisterRamReset may crash if it resets IWRAM. RegisterRamReset(RESET_ALL & ~RESET_IWRAM); asm("mov\tr1, #0xC0\n" "\tlsl\tr1, r1, #0x12\n" "\tmov\tr2, #0xFC\n" "\tlsl\tr2, r2, #0x7\n" "\tadd\tr2, r1, r2\n" "\tmov\tr0, #0\n" "\tmov\tr3, r0\n" "\tmov\tr4, r0\n" "\tmov\tr5, r0\n" ".LCU%=:\n" "\tstmia\tr1!, {r0, r3, r4, r5}\n" "\tstmia\tr1!, {r0, r3, r4, r5}\n" "\tstmia\tr1!, {r0, r3, r4, r5}\n" "\tstmia\tr1!, {r0, r3, r4, r5}\n" "\tstmia\tr1!, {r0, r3, r4, r5}\n" "\tstmia\tr1!, {r0, r3, r4, r5}\n" "\tstmia\tr1!, {r0, r3, r4, r5}\n" "\tstmia\tr1!, {r0, r3, r4, r5}\n" "\tcmp\tr1, r2\n" "\tbcc\t.LCU%=\n" : : : "r0", "r1", "r2", "r3", "r4", "r5", "memory" ); #else RegisterRamReset(RESET_ALL); #endif //MODERN *(vu16 *)BG_PLTT = RGB_WHITE; InitGpuRegManager(); REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; InitKeys(); InitIntrHandlers(); m4aSoundInit(); EnableVCountIntrAtLine150(); InitRFU(); CheckForFlashMemory(); InitMainCallbacks(); InitMapMusic(); ClearDma3Requests(); ResetBgs(); InitHeap(gHeap, HEAP_SIZE); SetDefaultFontsPointer(); gSoftResetDisabled = FALSE; gHelpSystemEnabled = FALSE; SetNotInSaveFailedScreen(); #ifndef NDEBUG #if (LOG_HANDLER == LOG_HANDLER_MGBA_PRINT) (void) MgbaOpen(); #elif (LOG_HANDLER == LOG_HANDLER_AGB_PRINT) AGBPrintInit(); #endif #endif if (gFlashMemoryPresent != TRUE) SetMainCallback2(NULL); gLinkTransferringData = FALSE; for (;;) { ReadKeys(); if (gSoftResetDisabled == FALSE && (gMain.heldKeysRaw & A_BUTTON) && (gMain.heldKeysRaw & B_START_SELECT) == B_START_SELECT) { rfu_REQ_stopMode(); rfu_waitREQComplete(); DoSoftReset(); } if (Overworld_SendKeysToLinkIsRunning() == TRUE) { gLinkTransferringData = TRUE; UpdateLinkAndCallCallbacks(); gLinkTransferringData = FALSE; } else { gLinkTransferringData = FALSE; UpdateLinkAndCallCallbacks(); if (Overworld_RecvKeysFromLinkIsRunning() == 1) { gMain.newKeys = 0; ClearSpriteCopyRequests(); gLinkTransferringData = TRUE; UpdateLinkAndCallCallbacks(); gLinkTransferringData = FALSE; } } PlayTimeCounter_Update(); MapMusicMain(); WaitForVBlank(); } } static void UpdateLinkAndCallCallbacks(void) { if (!HandleLinkConnection()) CallCallbacks(); } static void InitMainCallbacks(void) { gMain.vblankCounter1 = 0; gMain.vblankCounter2 = 0; gMain.callback1 = NULL; SetMainCallback2(CB2_InitCopyrightScreenAfterBootup); gSaveBlock2Ptr = &gSaveBlock2; gSaveBlock1Ptr = &gSaveBlock1; gSaveBlock2.encryptionKey = 0; gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; } static void CallCallbacks(void) { if (!RunSaveFailedScreen() && !RunHelpSystemCallback()) { if (gMain.callback1) gMain.callback1(); if (gMain.callback2) gMain.callback2(); } } void SetMainCallback2(MainCallback callback) { gMain.callback2 = callback; gMain.state = 0; } void StartTimer1(void) { REG_TM1CNT_H = 0x80; } void SeedRngAndSetTrainerId(void) { u16 val = REG_TM1CNT_L; SeedRng(val); REG_TM1CNT_H = 0; gTrainerId = val; } u16 GetGeneratedTrainerIdLower(void) { return gTrainerId; } void EnableVCountIntrAtLine150(void) { u16 gpuReg = (GetGpuReg(REG_OFFSET_DISPSTAT) & 0xFF) | (150 << 8); SetGpuReg(REG_OFFSET_DISPSTAT, gpuReg | DISPSTAT_VCOUNT_INTR); EnableInterrupts(INTR_FLAG_VCOUNT); } void InitKeys(void) { gKeyRepeatContinueDelay = 5; gKeyRepeatStartDelay = 40; gMain.heldKeys = 0; gMain.newKeys = 0; gMain.newAndRepeatedKeys = 0; gMain.heldKeysRaw = 0; gMain.newKeysRaw = 0; } static void ReadKeys(void) { u16 keyInput = REG_KEYINPUT ^ KEYS_MASK; gMain.newKeysRaw = keyInput & ~gMain.heldKeysRaw; gMain.newKeys = gMain.newKeysRaw; gMain.newAndRepeatedKeys = gMain.newKeysRaw; // BUG: Key repeat won't work when pressing L using L=A button mode // because it compares the raw key input with the remapped held keys. // Note that newAndRepeatedKeys is never remapped either. if (keyInput != 0 && gMain.heldKeys == keyInput) { gMain.keyRepeatCounter--; if (gMain.keyRepeatCounter == 0) { gMain.newAndRepeatedKeys = keyInput; gMain.keyRepeatCounter = gKeyRepeatContinueDelay; } } else { // If there is no input or the input has changed, reset the counter. gMain.keyRepeatCounter = gKeyRepeatStartDelay; } gMain.heldKeysRaw = keyInput; gMain.heldKeys = gMain.heldKeysRaw; // Remap L to A if the L=A option is enabled. if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) { if (JOY_NEW(L_BUTTON)) gMain.newKeys |= A_BUTTON; if (JOY_HELD(L_BUTTON)) gMain.heldKeys |= A_BUTTON; } if (JOY_NEW(gMain.watchedKeysMask)) gMain.watchedKeysPressed = TRUE; } void InitIntrHandlers(void) { int i; for (i = 0; i < INTR_COUNT; i++) gIntrTable[i] = gIntrTableTemplate[i]; DmaCopy32(3, intr_main, IntrMain_Buffer, sizeof(IntrMain_Buffer)); INTR_VECTOR = IntrMain_Buffer; SetVBlankCallback(NULL); SetHBlankCallback(NULL); SetSerialCallback(NULL); REG_IME = 1; EnableInterrupts(INTR_FLAG_VBLANK); } void SetVBlankCallback(IntrCallback callback) { gMain.vblankCallback = callback; } void SetHBlankCallback(IntrCallback callback) { gMain.hblankCallback = callback; } void SetVCountCallback(IntrCallback callback) { gMain.vcountCallback = callback; } void SetSerialCallback(IntrCallback callback) { gMain.serialCallback = callback; } extern void CopyBufferedValuesToGpuRegs(void); extern void ProcessDma3Requests(void); static void VBlankIntr(void) { if (gWirelessCommType) RfuVSync(); else if (!gLinkVSyncDisabled) LinkVSync(); if (gMain.vblankCounter1) (*gMain.vblankCounter1)++; if (gMain.vblankCallback) gMain.vblankCallback(); gMain.vblankCounter2++; CopyBufferedValuesToGpuRegs(); ProcessDma3Requests(); gPcmDmaCounter = gSoundInfo.pcmDmaCounter; #ifndef NDEBUG sVcountBeforeSound = REG_VCOUNT; #endif m4aSoundMain(); #ifndef NDEBUG sVcountAfterSound = REG_VCOUNT; #endif TryReceiveLinkBattleData(); Random(); UpdateWirelessStatusIndicatorSprite(); INTR_CHECK |= INTR_FLAG_VBLANK; gMain.intrCheck |= INTR_FLAG_VBLANK; } void InitFlashTimer(void) { IntrFunc **func = (IntrFunc **)&sTimerIntrFunc; SetFlashTimerIntr(2, *func); } static void HBlankIntr(void) { if (gMain.hblankCallback) gMain.hblankCallback(); INTR_CHECK |= INTR_FLAG_HBLANK; gMain.intrCheck |= INTR_FLAG_HBLANK; } static void VCountIntr(void) { #ifndef NDEBUG sVcountAtIntr = REG_VCOUNT; #endif m4aSoundVSync(); INTR_CHECK |= INTR_FLAG_VCOUNT; gMain.intrCheck |= INTR_FLAG_VCOUNT; } static void SerialIntr(void) { if (gMain.serialCallback) gMain.serialCallback(); INTR_CHECK |= INTR_FLAG_SERIAL; gMain.intrCheck |= INTR_FLAG_SERIAL; } void RestoreSerialTimer3IntrHandlers(void) { gIntrTable[1] = SerialIntr; gIntrTable[2] = Timer3Intr; } static void IntrDummy(void) {} static void WaitForVBlank(void) { gMain.intrCheck &= ~INTR_FLAG_VBLANK; if(!gWirelessCommType) { asm("swi 0x5"); return; } while (!(gMain.intrCheck & INTR_FLAG_VBLANK)) ; } void SetVBlankCounter1Ptr(u32 *ptr) { gMain.vblankCounter1 = ptr; } void DisableVBlankCounter1(void) { gMain.vblankCounter1 = NULL; } void DoSoftReset(void) { REG_IME = 0; m4aSoundVSyncOff(); ScanlineEffect_Stop(); DmaStop(1); DmaStop(2); DmaStop(3); SoftReset(RESET_ALL & ~RESET_SIO_REGS); } void ClearPokemonCrySongs(void) { CpuFill16(0, gPokemonCrySongs, MAX_POKEMON_CRIES * sizeof(struct PokemonCrySong)); } ================================================ FILE: src/main_menu.c ================================================ #include "global.h" #include "gflib.h" #include "scanline_effect.h" #include "task.h" #include "save.h" #include "event_data.h" #include "menu.h" #include "link.h" #include "oak_speech.h" #include "overworld.h" #include "quest_log.h" #include "mystery_gift_menu.h" #include "strings.h" #include "title_screen.h" #include "help_system.h" #include "pokedex.h" #include "text_window.h" #include "text_window_graphics.h" #include "constants/songs.h" enum MainMenuType { MAIN_MENU_NEWGAME = 0, MAIN_MENU_CONTINUE, MAIN_MENU_MYSTERYGIFT, MAIN_MENU_KEYSYSTEM }; enum MainMenuWindow { MAIN_MENU_WINDOW_NEWGAME_ONLY = 0, MAIN_MENU_WINDOW_CONTINUE, MAIN_MENU_WINDOW_NEWGAME, MAIN_MENU_WINDOW_MYSTERYGIFT, MAIN_MENU_WINDOW_KEYSYSTEM, MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED, MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY, MAIN_MENU_WINDOW_ERROR, MAIN_MENU_WINDOW_FRLG_CHOICE, MAIN_MENU_WINDOW_COUNT }; #define tMenuType data[0] #define tCursorPos data[1] #define tUnused8 data[8] #define tMGErrorMsgState data[9] #define tMGErrorType data[10] extern void CB2_KeySystemMenuFromContinueScreen(void); static bool32 MainMenuGpuInit(u8 a0); static void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId); static void PrintSaveErrorStatus(u8 taskId, const u8 *str); static void Task_SaveErrorStatus_RunPrinterThenWaitButton(u8 taskId); static void Task_SetWin0BldRegsNoSaveFileCheck(u8 taskId); static void Task_WaitFadeAndPrintMainMenuText(u8 taskId); static void Task_PrintMainMenuText(u8 taskId); static void Task_WaitDma3AndFadeIn(u8 taskId); static void Task_UpdateVisualSelection(u8 taskId); static void Task_HandleMenuInput(u8 taskId); static void Task_ExecuteMainMenuSelection(u8 taskId); static void Task_MysteryGiftError(u8 taskId); static void Task_ReturnToTileScreen(u8 taskId); static void MoveWindowByMenuTypeAndCursorPos(u8 menuType, u8 cursorPos); static bool8 HandleMenuInput(u8 taskId); static void PrintMessageOnWindow4(const u8 *str); static void PrintContinueStats(void); static void PrintPlayerName(void); static void PrintPlayTime(void); static void PrintDexCount(void); static void PrintBadgeCount(void); static void LoadUserFrameToBg(u8 bgId); static void SetStdFrame0OnBg(u8 bgId); static void MainMenu_DrawWindow(const struct WindowTemplate * template); static void MainMenu_EraseWindow(const struct WindowTemplate * template); static void Task_DoFireredOrLeafgreenMultichoice(u8 taskId); static void Task_ChooseVersionOnNewGame(u8 taskId); static void Task_StartNewGame(u8 taskId); static void CreateFRLGChoiceMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos); static void MainMenu_DrawWindow_WindowFunction(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); static void DrawFRLGChoiceFrame(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum); static const u8 sString_Dummy[] = _(""); static const u8 sString_Newline[] = _("\n"); static const struct WindowTemplate sWindowTemplate[] = { [MAIN_MENU_WINDOW_NEWGAME_ONLY] = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 1, .width = 24, .height = 2, .paletteNum = 15, .baseBlock = 0x001 }, [MAIN_MENU_WINDOW_CONTINUE] = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 1, .width = 24, .height = 6, .paletteNum = 15, .baseBlock = 0x001 }, [MAIN_MENU_WINDOW_NEWGAME] = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 9, .width = 24, .height = 2, .paletteNum = 15, .baseBlock = 0x091 }, [MAIN_MENU_WINDOW_MYSTERYGIFT] = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 13, .width = 24, .height = 2, .paletteNum = 15, .baseBlock = 0x0C1 }, [MAIN_MENU_WINDOW_KEYSYSTEM] = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 13, .width = 24, .height = 2, .paletteNum = 15, .baseBlock = 0x0C1 }, [MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED] = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 17, .width = 24, .height = 2, .paletteNum = 15, .baseBlock = 0xF1 }, [MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY] = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 5, .width = 24, .height = 2, .paletteNum = 15, .baseBlock = 0x31 }, [MAIN_MENU_WINDOW_ERROR] = { .bg = 0, .tilemapLeft = 3, .tilemapTop = 15, .width = 24, .height = 4, .paletteNum = 15, .baseBlock = 0x001 }, [MAIN_MENU_WINDOW_FRLG_CHOICE] = { .bg = 0x00, .tilemapLeft = 0x13, .tilemapTop = 0x0f, .width = 0x08, .height = 0x04, .paletteNum = 2, .baseBlock = 0x0155 }, [MAIN_MENU_WINDOW_COUNT] = DUMMY_WIN_TEMPLATE }; static const u16 sBg_Pal[] = INCBIN_U16("graphics/main_menu/bg.gbapal"); static const u16 sTextbox_Pal[] = INCBIN_U16("graphics/main_menu/textbox.gbapal"); static const u8 sTextColor1[] = { 10, 11, 12 }; static const u8 sTextColor2[] = { 10, 1, 12 }; static const struct BgTemplate sBgTemplate[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 30, .priority = 0 } }; static const u8 sMenuCursorYMax[] = { 1, 2, 3 }; static void CB2_MainMenu(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCB_MainMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void CB2_InitMainMenu(void) { MainMenuGpuInit(1); } static void CB2_InitMainMenu_2(void) { MainMenuGpuInit(1); } static bool32 MainMenuGpuInit(u8 a0) { u8 taskId; SetVBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG2CNT, 0); SetGpuReg(REG_OFFSET_BG1CNT, 0); SetGpuReg(REG_OFFSET_BG0CNT, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); DmaFill32(3, 0, (void *)OAM, OAM_SIZE); DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); ResetPaletteFade(); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplate, NELEMS(sBgTemplate)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); InitWindows(sWindowTemplate); DeactivateAllTextPrinters(); LoadPalette(sBg_Pal, BG_PLTT_ID(0), sizeof(sBg_Pal)); LoadPalette(sTextbox_Pal, BG_PLTT_ID(15), sizeof(sTextbox_Pal)); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetMainCallback2(CB2_MainMenu); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); taskId = CreateTask(Task_SetWin0BldRegsAndCheckSaveFile, 0); gTasks[taskId].tCursorPos = 0; gTasks[taskId].tUnused8 = 0; return FALSE; } /* * The entire screen is darkened slightly except at WIN0 to indicate * the player cursor position. */ static void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId) { if (!gPaletteFade.active) { SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0x0001); SetGpuReg(REG_OFFSET_WINOUT, 0x0021); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); SetGpuReg(REG_OFFSET_BLDY, 7); switch (gSaveFileStatus) { case SAVE_STATUS_OK: LoadUserFrameToBg(0); if (IsMysteryGiftEnabled() == TRUE) { gTasks[taskId].tMenuType = MAIN_MENU_MYSTERYGIFT; } else { gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE; } gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck; break; case SAVE_STATUS_INVALID: SetStdFrame0OnBg(0); gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME; PrintSaveErrorStatus(taskId, gText_SaveFileHasBeenDeleted); break; case SAVE_STATUS_ERROR: SetStdFrame0OnBg(0); gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE; PrintSaveErrorStatus(taskId, gText_SaveFileCorrupted); if (IsMysteryGiftEnabled() == TRUE) { gTasks[taskId].tMenuType = MAIN_MENU_MYSTERYGIFT; } else { gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE; } break; case SAVE_STATUS_EMPTY: SetStdFrame0OnBg(0); gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME; gTasks[taskId].tUnused8 = 3; PrintSaveErrorStatus(taskId, gChooseVersionNewGame); break; default: LoadUserFrameToBg(0); gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME; gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck; break; case SAVE_STATUS_NO_FLASH: SetStdFrame0OnBg(0); gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME; PrintSaveErrorStatus(taskId, gText_1MSubCircuitBoardNotInstalled); break; } } } static void PrintSaveErrorStatus(u8 taskId, const u8 *str) { PrintMessageOnWindow4(str); gTasks[taskId].func = Task_SaveErrorStatus_RunPrinterThenWaitButton; BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0xFFFF); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240)); SetGpuReg(REG_OFFSET_WIN0V, ((0x0 << 8) + (2 << 8)) | ((0xA0) - 2)); ShowBg(0); SetVBlankCallback(VBlankCB_MainMenu); } static void Task_SaveErrorStatus_RunPrinterThenWaitButton(u8 taskId) { if (!gPaletteFade.active) { RunTextPrinters(); if(gTasks[taskId].tUnused8 == 3) { if(!IsTextPrinterActive(MAIN_MENU_WINDOW_ERROR)) { gTasks[taskId].func = Task_DoFireredOrLeafgreenMultichoice; } } else { if (!IsTextPrinterActive(MAIN_MENU_WINDOW_ERROR) && JOY_NEW(A_BUTTON)) { ClearWindowTilemap(MAIN_MENU_WINDOW_ERROR); MainMenu_EraseWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]); LoadUserFrameToBg(0); if (gTasks[taskId].tMenuType == MAIN_MENU_NEWGAME) gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck; else gTasks[taskId].func = Task_PrintMainMenuText; } } } } static void Task_SetWin0BldRegsNoSaveFileCheck(u8 taskId) { if (!gPaletteFade.active) { SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0x0001); SetGpuReg(REG_OFFSET_WINOUT, 0x0021); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); SetGpuReg(REG_OFFSET_BLDY, 7); if (gTasks[taskId].tMenuType == MAIN_MENU_NEWGAME) gTasks[taskId].func = Task_ExecuteMainMenuSelection; else gTasks[taskId].func = Task_WaitFadeAndPrintMainMenuText; } } static void Task_WaitFadeAndPrintMainMenuText(u8 taskId) { if (!gPaletteFade.active) { Task_PrintMainMenuText(taskId); } } static void Task_PrintMainMenuText(u8 taskId) { u16 pal; SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0x0001); SetGpuReg(REG_OFFSET_WINOUT, 0x0021); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); SetGpuReg(REG_OFFSET_BLDY, 7); if (gSaveBlock2Ptr->playerGender == MALE) pal = RGB(4, 16, 31); else pal = RGB(31, 3, 21); LoadPalette(&pal, BG_PLTT_ID(15) + 1, PLTT_SIZEOF(1)); switch (gTasks[taskId].tMenuType) { case MAIN_MENU_NEWGAME: default: FillWindowPixelBuffer(MAIN_MENU_WINDOW_NEWGAME_ONLY, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY, PIXEL_FILL(10)); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME_ONLY, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_NewGame); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_KeySystemSettings); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME_ONLY]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY]); PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME_ONLY); PutWindowTilemap(MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY); CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME_ONLY, COPYWIN_GFX); CopyWindowToVram(MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY, COPYWIN_FULL); break; case MAIN_MENU_CONTINUE: FillWindowPixelBuffer(MAIN_MENU_WINDOW_CONTINUE, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_NEWGAME, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_KEYSYSTEM, PIXEL_FILL(10)); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_Continue); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_NewGame); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_KEYSYSTEM, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_KeySystemSettings); PrintContinueStats(); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_CONTINUE]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_KEYSYSTEM]); PutWindowTilemap(MAIN_MENU_WINDOW_CONTINUE); PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME); PutWindowTilemap(MAIN_MENU_WINDOW_KEYSYSTEM); CopyWindowToVram(MAIN_MENU_WINDOW_CONTINUE, COPYWIN_GFX); CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME, COPYWIN_GFX); CopyWindowToVram(MAIN_MENU_WINDOW_KEYSYSTEM, COPYWIN_FULL); break; case MAIN_MENU_MYSTERYGIFT: FillWindowPixelBuffer(MAIN_MENU_WINDOW_CONTINUE, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_NEWGAME, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_MYSTERYGIFT, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED, PIXEL_FILL(10)); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_Continue); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_NewGame); gTasks[taskId].tMGErrorType = 1; AddTextPrinterParameterized3(MAIN_MENU_WINDOW_MYSTERYGIFT, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_MysteryGift); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_KeySystemSettings); PrintContinueStats(); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_CONTINUE]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_MYSTERYGIFT]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED]); PutWindowTilemap(MAIN_MENU_WINDOW_CONTINUE); PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME); PutWindowTilemap(MAIN_MENU_WINDOW_MYSTERYGIFT); PutWindowTilemap(MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED); CopyWindowToVram(MAIN_MENU_WINDOW_CONTINUE, COPYWIN_GFX); CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME, COPYWIN_GFX); CopyWindowToVram(MAIN_MENU_WINDOW_MYSTERYGIFT, COPYWIN_GFX); CopyWindowToVram(MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED, COPYWIN_FULL); break; } gTasks[taskId].func = Task_WaitDma3AndFadeIn; } static void Task_WaitDma3AndFadeIn(u8 taskId) { if (WaitDma3Request(-1) != -1) { gTasks[taskId].func = Task_UpdateVisualSelection; BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0xFFFF); ShowBg(0); SetVBlankCallback(VBlankCB_MainMenu); } } static void Task_UpdateVisualSelection(u8 taskId) { MoveWindowByMenuTypeAndCursorPos(gTasks[taskId].tMenuType, gTasks[taskId].tCursorPos); gTasks[taskId].func = Task_HandleMenuInput; } static void Task_HandleMenuInput(u8 taskId) { if (!gPaletteFade.active && HandleMenuInput(taskId)) { gTasks[taskId].func = Task_UpdateVisualSelection; } } static void Task_ExecuteMainMenuSelection(u8 taskId) { s32 menuAction; if (!gPaletteFade.active) { switch (gTasks[taskId].tMenuType) { default: case MAIN_MENU_NEWGAME: switch (gTasks[taskId].tCursorPos) { default: case 0: menuAction = MAIN_MENU_NEWGAME; break; case 1: menuAction = MAIN_MENU_KEYSYSTEM; break; } break; case MAIN_MENU_CONTINUE: switch (gTasks[taskId].tCursorPos) { default: case 0: menuAction = MAIN_MENU_CONTINUE; break; case 1: menuAction = MAIN_MENU_NEWGAME; break; case 2: menuAction = MAIN_MENU_KEYSYSTEM; break; } break; case MAIN_MENU_MYSTERYGIFT: switch (gTasks[taskId].tCursorPos) { default: case 0: menuAction = MAIN_MENU_CONTINUE; break; case 1: menuAction = MAIN_MENU_NEWGAME; break; case 2: if (!IsWirelessAdapterConnected()) { SetStdFrame0OnBg(0); gTasks[taskId].func = Task_MysteryGiftError; BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); return; } else { menuAction = MAIN_MENU_MYSTERYGIFT; } break; case 3: menuAction = MAIN_MENU_KEYSYSTEM; break; } break; } switch (menuAction) { default: case MAIN_MENU_NEWGAME: SetStdFrame0OnBg(0); gTasks[taskId].func = Task_ChooseVersionOnNewGame; BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); return; case MAIN_MENU_CONTINUE: gPlttBufferUnfaded[0] = RGB_BLACK; gPlttBufferFaded[0] = RGB_BLACK; gExitStairsMovementDisabled = FALSE; FreeAllWindowBuffers(); TryStartQuestLogPlayback(taskId); break; case MAIN_MENU_MYSTERYGIFT: SetMainCallback2(CB2_InitMysteryGift); HelpSystem_Disable(); FreeAllWindowBuffers(); DestroyTask(taskId); break; case MAIN_MENU_KEYSYSTEM: SetMainCallback2(CB2_KeySystemMenuFromContinueScreen); //HelpSystem_Disable(); FreeAllWindowBuffers(); DestroyTask(taskId); break; } } } static void Task_DoFireredOrLeafgreenMultichoice(u8 taskId) { struct WindowTemplate windowTemplate; s8 input; switch (gTasks[taskId].tUnused8) { case 3: //StringExpandPlaceholders(gStringVar4, gChooseVersionNewGame); //MAIN_MENU_WINDOW_ERROR = AddWindow(&sWindowTemplate_Prompt_FRLG); //FillWindowPixelBuffer(MAIN_MENU_WINDOW_ERROR, 0x11); //AddTextPrinterParameterized4(MAIN_MENU_WINDOW_ERROR, 2, 0, 2, 0, 2, sMG_Ereader_TextColor_2, 0, gStringVar4); //DrawTextBorderOuter(MAIN_MENU_WINDOW_ERROR, 0x001, 0x0F); //CopyWindowToVram(MAIN_MENU_WINDOW_ERROR, COPYWIN_GFX); //PutWindowTilemap(MAIN_MENU_WINDOW_ERROR); gTasks[taskId].tUnused8++; break; case 4: windowTemplate = sWindowTemplate[MAIN_MENU_WINDOW_FRLG_CHOICE]; windowTemplate.tilemapTop = 9; CreateFRLGChoiceMenu(&windowTemplate, 2, 0, 2, 0x0155, 2, 0); gTasks[taskId].tUnused8++; break; case 5: input = Menu_ProcessInputNoWrapAround(); if (input == 0 || input == 1) { if(input == 0) { gSaveBlock1Ptr->keyFlags.version = 0; } else { gSaveBlock1Ptr->keyFlags.version = 1; } PlaySE(SE_SELECT); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); gTasks[taskId].tUnused8 = 3; rbox_fill_rectangle(MAIN_MENU_WINDOW_ERROR); ClearWindowTilemap(MAIN_MENU_WINDOW_ERROR); CopyWindowToVram(MAIN_MENU_WINDOW_ERROR, COPYWIN_MAP); RemoveWindow(MAIN_MENU_WINDOW_ERROR); gTasks[taskId].func = Task_StartNewGame; break; } break; /*case 0xFF: if(input == 0) { gSaveBlock1Ptr->keyFlags.version = 0; } else { gSaveBlock1Ptr->keyFlags.version = 1; } PlaySE(SE_SELECT); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); gTasks[taskId].tUnused8 = 3; rbox_fill_rectangle(MAIN_MENU_WINDOW_ERROR); ClearWindowTilemap(MAIN_MENU_WINDOW_ERROR); CopyWindowToVram(MAIN_MENU_WINDOW_ERROR, COPYWIN_MAP); RemoveWindow(MAIN_MENU_WINDOW_ERROR); gTasks[taskId].func = Task_StartNewGame; break;*/ } } void CreateFRLGChoiceMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos) { struct TextPrinterTemplate textSubPrinter; u8 YesNoWindowId; YesNoWindowId = AddWindow(window); DrawFRLGChoiceFrame(YesNoWindowId, 1, baseTileNum, paletteNum); textSubPrinter.currentChar = gFRLG_Multichoice; textSubPrinter.windowId = YesNoWindowId; textSubPrinter.fontId = fontId; textSubPrinter.x = GetMenuCursorDimensionByFont(fontId, 0) + left; textSubPrinter.y = top; textSubPrinter.currentX = textSubPrinter.x; textSubPrinter.currentY = textSubPrinter.y; textSubPrinter.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND); textSubPrinter.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND); textSubPrinter.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW); textSubPrinter.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN); textSubPrinter.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING); textSubPrinter.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); AddTextPrinter(&textSubPrinter, 0xFF, NULL); Menu_InitCursor(YesNoWindowId, fontId, left, top, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT) + textSubPrinter.lineSpacing, 2, initialCursorPos); } static void DrawFRLGChoiceFrame(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum) { u16 TileNum; u8 PaletteNum; TileNum = baseTileNum; PaletteNum = paletteNum; CallWindowFunction(windowId, MainMenu_DrawWindow_WindowFunction); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } static void Task_ChooseVersionOnNewGame(u8 taskId) { s8 state = 0; //undarken screen SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240)); SetGpuReg(REG_OFFSET_WIN0V, ((0x0 << 8) + (2 << 8)) | ((0xA0) - 2)); switch (gTasks[taskId].tUnused8) { case 0: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); PrintMessageOnWindow4(gChooseVersionNewGame); gTasks[taskId].tUnused8++; break; case 1: if (!gPaletteFade.active) gTasks[taskId].tUnused8++; break; case 2: RunTextPrinters(); if (!IsTextPrinterActive(MAIN_MENU_WINDOW_ERROR)) gTasks[taskId].tUnused8++; break; case 3: //yesno here gTasks[taskId].func = Task_DoFireredOrLeafgreenMultichoice; //PlaySE(SE_SELECT); //BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); //gTasks[taskId].func = Task_StartNewGame; break; } } static void Task_StartNewGame(u8 taskId) { gExitStairsMovementDisabled = 0; FreeAllWindowBuffers(); DestroyTask(taskId); StartNewGameScene(); } static void Task_MysteryGiftError(u8 taskId) { switch (gTasks[taskId].tMGErrorMsgState) { case 0: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); if (gTasks[taskId].tMGErrorType == 1) PrintMessageOnWindow4(gText_WirelessNotConnected); else PrintMessageOnWindow4(gText_MysteryGiftCantUse); gTasks[taskId].tMGErrorMsgState++; break; case 1: if (!gPaletteFade.active) gTasks[taskId].tMGErrorMsgState++; break; case 2: RunTextPrinters(); if (!IsTextPrinterActive(MAIN_MENU_WINDOW_ERROR)) gTasks[taskId].tMGErrorMsgState++; break; case 3: if (JOY_NEW(A_BUTTON | B_BUTTON)) { PlaySE(SE_SELECT); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ReturnToTileScreen; } break; } } static void Task_ReturnToTileScreen(u8 taskId) { if (!gPaletteFade.active) { SetMainCallback2(CB2_InitTitleScreen); DestroyTask(taskId); } } static void MoveWindowByMenuTypeAndCursorPos(u8 menuType, u8 cursorPos) { u16 win0vTop, win0vBot; SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(18, 222)); switch (menuType) { default: case MAIN_MENU_NEWGAME: switch (cursorPos) { default: case 0: // NEW GAME win0vTop = 0x00 << 8; win0vBot = 0x20; break; case 1: // KEY SYSTEM SETTINGS win0vTop = 0x20 << 8; win0vBot = 0x40; break; } case MAIN_MENU_CONTINUE: switch (cursorPos) { default: case 0: // CONTINUE win0vTop = 0x00 << 8; win0vBot = 0x40; break; case 1: // NEW GAME win0vTop = 0x40 << 8; win0vBot = 0x60; break; case 2: // KEY SYSTEM SETTINGS win0vTop = 0x60 << 8; win0vBot = 0x80; break; } case MAIN_MENU_MYSTERYGIFT: switch (cursorPos) { default: case 0: // CONTINUE win0vTop = 0x00 << 8; win0vBot = 0x40; break; case 1: // NEW GAME win0vTop = 0x40 << 8; win0vBot = 0x60; break; case 2: // MYSTERY GIFT win0vTop = 0x60 << 8; win0vBot = 0x80; break; case 3: // KEY SYSTEM SETTINGS win0vTop = 0x80 << 8; win0vBot = 0xA0; break; } break; } SetGpuReg(REG_OFFSET_WIN0V, (win0vTop + (2 << 8)) | (win0vBot - 2)); } static bool8 HandleMenuInput(u8 taskId) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); IsWirelessAdapterConnected(); // called for its side effects only BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ExecuteMainMenuSelection; } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 160)); gTasks[taskId].func = Task_ReturnToTileScreen; } else if (JOY_NEW(DPAD_UP) && gTasks[taskId].tCursorPos > 0) { gTasks[taskId].tCursorPos--; return TRUE; } else if (JOY_NEW(DPAD_DOWN) && gTasks[taskId].tCursorPos < sMenuCursorYMax[gTasks[taskId].tMenuType]) { gTasks[taskId].tCursorPos++; return TRUE; } return FALSE; } static void PrintMessageOnWindow4(const u8 *str) { FillWindowPixelBuffer(MAIN_MENU_WINDOW_ERROR, PIXEL_FILL(10)); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_ERROR, FONT_NORMAL, 0, 2, sTextColor1, 2, str); PutWindowTilemap(MAIN_MENU_WINDOW_ERROR); CopyWindowToVram(MAIN_MENU_WINDOW_ERROR, COPYWIN_GFX); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE( 19, 221)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(115, 157)); } static void PrintContinueStats(void) { PrintPlayerName(); PrintDexCount(); PrintPlayTime(); PrintBadgeCount(); } static void PrintPlayerName(void) { s32 i; u8 name[PLAYER_NAME_LENGTH + 1]; u8 *ptr; AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 2, 18, sTextColor2, -1, gText_Player); ptr = name; for (i = 0; i < PLAYER_NAME_LENGTH; i++) *ptr++ = gSaveBlock2Ptr->playerName[i]; *ptr = EOS; AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 52, 18, sTextColor2, -1, name); } static void PrintPlayTime(void) { u8 strbuf[30]; u8 *ptr; AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 2, 34, sTextColor2, -1, gText_Time); ptr = ConvertIntToDecimalStringN(strbuf, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3); *ptr++ = CHAR_COLON; ConvertIntToDecimalStringN(ptr, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 52, 34, sTextColor2, -1, strbuf); } static void PrintDexCount(void) { u8 strbuf[30]; u8 *ptr; u16 dexcount; if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) { if (IsNationalPokedexEnabled()) dexcount = GetNationalPokedexCount(FLAG_GET_CAUGHT); else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) dexcount = GetExtendedPokedexCount(FLAG_GET_CAUGHT); else dexcount = GetKantoPokedexCount(FLAG_GET_CAUGHT); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 112, 18, sTextColor2, -1, gText_Pokedex); ptr = ConvertIntToDecimalStringN(strbuf, dexcount, STR_CONV_MODE_LEFT_ALIGN, 3); StringAppend(ptr, gTextJPDummy_Hiki); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 162, 18, sTextColor2, -1, strbuf); } } static void PrintBadgeCount(void) { u8 strbuf[30]; u8 *ptr; u32 flagId; u8 nbadges = 0; for (flagId = FLAG_BADGE01_GET; flagId < FLAG_BADGE01_GET + 8; flagId++) { if (FlagGet(flagId)) nbadges++; } AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 112, 34, sTextColor2, -1, gText_Badges); ptr = ConvertIntToDecimalStringN(strbuf, nbadges, STR_CONV_MODE_LEADING_ZEROS, 1); StringAppend(ptr, gTextJPDummy_Ko); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 162, 34, sTextColor2, -1, strbuf); } static void LoadUserFrameToBg(u8 bgId) { LoadBgTiles(bgId, GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1B1); LoadPalette(GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP); MainMenu_EraseWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]); } static void SetStdFrame0OnBg(u8 bgId) { LoadStdWindowGfx(MAIN_MENU_WINDOW_NEWGAME_ONLY, 0x1B1, BG_PLTT_ID(2)); MainMenu_EraseWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]); } static void MainMenu_DrawWindow_WindowFunction(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { FillBgTilemapBufferRect( bg, 0x1B1, tilemapLeft - 1, tilemapTop - 1, 1, 1, 2 ); FillBgTilemapBufferRect( bg, 0x1B2, tilemapLeft, tilemapTop - 1, width, height, 2 ); FillBgTilemapBufferRect( bg, 0x1B3, tilemapLeft + width, tilemapTop - 1, 1, 1, 2 ); FillBgTilemapBufferRect( bg, 0x1B4, tilemapLeft - 1, tilemapTop, 1, height, 2 ); FillBgTilemapBufferRect( bg, 0x1B6, tilemapLeft + width, tilemapTop, 1, height, 2 ); FillBgTilemapBufferRect( bg, 0x1B7, tilemapLeft - 1, tilemapTop + height, 1, 1, 2 ); FillBgTilemapBufferRect( bg, 0x1B8, tilemapLeft, tilemapTop + height, width, 1, 2 ); FillBgTilemapBufferRect( bg, 0x1B9, tilemapLeft + width, tilemapTop + height, 1, 1, 2 ); CopyBgTilemapBufferToVram(bg); } static void MainMenu_DrawWindow(const struct WindowTemplate * windowTemplate) { FillBgTilemapBufferRect( windowTemplate->bg, 0x1B1, windowTemplate->tilemapLeft - 1, windowTemplate->tilemapTop - 1, 1, 1, 2 ); FillBgTilemapBufferRect( windowTemplate->bg, 0x1B2, windowTemplate->tilemapLeft, windowTemplate->tilemapTop - 1, windowTemplate->width, windowTemplate->height, 2 ); FillBgTilemapBufferRect( windowTemplate->bg, 0x1B3, windowTemplate->tilemapLeft + windowTemplate->width, windowTemplate->tilemapTop - 1, 1, 1, 2 ); FillBgTilemapBufferRect( windowTemplate->bg, 0x1B4, windowTemplate->tilemapLeft - 1, windowTemplate->tilemapTop, 1, windowTemplate->height, 2 ); FillBgTilemapBufferRect( windowTemplate->bg, 0x1B6, windowTemplate->tilemapLeft + windowTemplate->width, windowTemplate->tilemapTop, 1, windowTemplate->height, 2 ); FillBgTilemapBufferRect( windowTemplate->bg, 0x1B7, windowTemplate->tilemapLeft - 1, windowTemplate->tilemapTop + windowTemplate->height, 1, 1, 2 ); FillBgTilemapBufferRect( windowTemplate->bg, 0x1B8, windowTemplate->tilemapLeft, windowTemplate->tilemapTop + windowTemplate->height, windowTemplate->width, 1, 2 ); FillBgTilemapBufferRect( windowTemplate->bg, 0x1B9, windowTemplate->tilemapLeft + windowTemplate->width, windowTemplate->tilemapTop + windowTemplate->height, 1, 1, 2 ); CopyBgTilemapBufferToVram(windowTemplate->bg); } static void MainMenu_EraseWindow(const struct WindowTemplate * windowTemplate) { FillBgTilemapBufferRect( windowTemplate->bg, 0x000, windowTemplate->tilemapLeft - 1, windowTemplate->tilemapTop - 1, windowTemplate->tilemapLeft + windowTemplate->width + 1, windowTemplate->tilemapTop + windowTemplate->height + 1, 2 ); CopyBgTilemapBufferToVram(windowTemplate->bg); } ================================================ FILE: src/malloc.c ================================================ #include "global.h" static void *sHeapStart; static u32 sHeapSize; static EWRAM_DATA struct MemBlock *head = NULL; static EWRAM_DATA struct MemBlock *pos = NULL; static EWRAM_DATA struct MemBlock *splitBlock = NULL; #define MALLOC_SYSTEM_ID 0xA3A3 struct MemBlock { // Whether this block is currently allocated. bool16 flag; // Magic number used for error checking. Should equal MALLOC_SYSTEM_ID. u16 magic_number; // Size of the block (not including this header struct). u32 size; // Previous block pointer. Equals sHeapStart if this is the first block. struct MemBlock *prev; // Next block pointer. Equals sHeapStart if this is the last block. struct MemBlock *next; // Data in the memory block. (Arrays of length 0 are a GNU extension.) u8 data[0]; }; void PutMemBlockHeader(void *block, struct MemBlock *prev, struct MemBlock *next, u32 size) { struct MemBlock *header = (struct MemBlock *)block; header->flag = FALSE; header->magic_number = MALLOC_SYSTEM_ID; header->size = size; header->prev = prev; header->next = next; } void PutFirstMemBlockHeader(void *block, u32 size) { PutMemBlockHeader(block, (struct MemBlock *)block, (struct MemBlock *)block, size - sizeof(struct MemBlock)); } void *AllocInternal(void *heapStart, u32 size) { u32 foundBlockSize; head = (struct MemBlock *)heapStart; pos = head; // Alignment if (size & 3) size = 4 * ((size / 4) + 1); for (;;) { // Loop through the blocks looking for unused block that's big enough. if (!pos->flag) { foundBlockSize = pos->size; if (foundBlockSize >= size) { if (foundBlockSize - size < 2 * sizeof(struct MemBlock)) { // The block isn't much bigger than the requested size, // so just use it. pos->flag = TRUE; return pos->data; } else { // The block is significantly bigger than the requested // size, so split the rest into a separate block. int splitBlockSize = foundBlockSize; splitBlockSize -= sizeof(struct MemBlock); splitBlockSize -= size; splitBlock = (struct MemBlock *)(pos->data + size); pos->flag = TRUE; pos->size = size; PutMemBlockHeader(splitBlock, pos, pos->next, splitBlockSize); pos->next = splitBlock; if (splitBlock->next != head) splitBlock->next->prev = splitBlock; return pos->data; } } } if (pos->next == head) { AGB_ASSERT_EX(0, ABSPATH("gflib/malloc.c"), 174); return NULL; } pos = pos->next; } } void FreeInternal(void *heapStart, void *p) { AGB_ASSERT_EX(p != NULL, ABSPATH("gflib/malloc.c"), 195); if (p) { struct MemBlock *head = (struct MemBlock *)heapStart; struct MemBlock *pos = (struct MemBlock *)((u8 *)p - sizeof(struct MemBlock)); AGB_ASSERT_EX(pos->magic_number == MALLOC_SYSTEM_ID, ABSPATH("gflib/malloc.c"), 204); AGB_ASSERT_EX(pos->flag == TRUE, ABSPATH("gflib/malloc.c"), 205); pos->flag = FALSE; // If the freed block isn't the last one, merge with the next block // if it's not in use. if (pos->next != head) { if (!pos->next->flag) { AGB_ASSERT_EX(pos->next->magic_number == MALLOC_SYSTEM_ID, ABSPATH("gflib/malloc.c"), 211); pos->size += sizeof(struct MemBlock) + pos->next->size; pos->next->magic_number = 0; pos->next = pos->next->next; if (pos->next != head) pos->next->prev = pos; } } // If the freed block isn't the first one, merge with the previous block // if it's not in use. if (pos != head) { if (!pos->prev->flag) { AGB_ASSERT_EX(pos->prev->magic_number == MALLOC_SYSTEM_ID, ABSPATH("gflib/malloc.c"), 228); pos->prev->next = pos->next; if (pos->next != head) pos->next->prev = pos->prev; pos->magic_number = 0; pos->prev->size += sizeof(struct MemBlock) + pos->size; } } } } void *AllocZeroedInternal(void *heapStart, u32 size) { void *mem = AllocInternal(heapStart, size); if (mem != NULL) { if (size & 3) size = 4 * ((size / 4) + 1); CpuFill32(0, mem, size); } return mem; } bool32 CheckMemBlockInternal(void *heapStart, void *pointer) { struct MemBlock *head = (struct MemBlock *)heapStart; struct MemBlock *block = (struct MemBlock *)((u8 *)pointer - sizeof(struct MemBlock)); if (block->magic_number != MALLOC_SYSTEM_ID) return FALSE; if (block->next->magic_number != MALLOC_SYSTEM_ID) return FALSE; if (block->next != head && block->next->prev != block) return FALSE; if (block->prev->magic_number != MALLOC_SYSTEM_ID) return FALSE; if (block->prev != head && block->prev->next != block) return FALSE; if (block->next != head && block->next != (struct MemBlock *)(block->data + block->size)) return FALSE; return TRUE; } void InitHeap(void *heapStart, u32 heapSize) { sHeapStart = heapStart; sHeapSize = heapSize; PutFirstMemBlockHeader(heapStart, heapSize); } void *Alloc(u32 size) { return AllocInternal(sHeapStart, size); } void *AllocZeroed(u32 size) { return AllocZeroedInternal(sHeapStart, size); } void Free(void *pointer) { FreeInternal(sHeapStart, pointer); } bool32 CheckMemBlock(void *pointer) { return CheckMemBlockInternal(sHeapStart, pointer); } bool32 CheckHeap() { struct MemBlock *pos = (struct MemBlock *)sHeapStart; do { if (!CheckMemBlockInternal(sHeapStart, pos->data)) return FALSE; pos = pos->next; } while (pos != (struct MemBlock *)sHeapStart); return TRUE; } ================================================ FILE: src/map_name_popup.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "event_data.h" #include "text_window.h" #include "quest_log.h" #include "region_map.h" #include "strings.h" #include "constants/flags.h" #include "constants/maps.h" #include "constants/map_groups.h" #include "constants/map_types.h" #include "constants/region_map_sections.h" #define FLOOR_ROOFTOP 127 static void Task_MapNamePopup(u8 taskId); static u16 MapNamePopupCreateWindow(bool32 palIntoFadedBuffer); static void MapNamePopupPrintMapNameOnWindow(u16 windowId); static u8 *MapNamePopupAppendFloorNum(u8 *dest, s8 flags); #define tState data[0] #define tTimer data[1] #define tPos data[2] #define tReshow data[3] #define tWindowId data[4] #define tWindowExists data[5] #define tWindowCleared data[6] #define tWindowDestroyed data[7] #define tPalIntoFadedBuffer data[8] void ShowMapNamePopup(bool32 palIntoFadedBuffer) { u8 taskId; if (FlagGet(FLAG_DONT_SHOW_MAP_NAME_POPUP) != TRUE && !QL_IS_PLAYBACK_STATE) { taskId = FindTaskIdByFunc(Task_MapNamePopup); if (taskId == TASK_NONE) { taskId = CreateTask(Task_MapNamePopup, 90); ChangeBgX(0, 0x0000, 0); ChangeBgY(0, -0x1081, 0); gTasks[taskId].tState = 0; gTasks[taskId].tPos = 0; gTasks[taskId].tPalIntoFadedBuffer = palIntoFadedBuffer; } else { if (gTasks[taskId].tState != 4) gTasks[taskId].tState = 4; gTasks[taskId].tReshow = TRUE; } } } static void Task_MapNamePopup(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: task->tWindowId = MapNamePopupCreateWindow(task->tPalIntoFadedBuffer); task->tWindowExists = TRUE; task->tState = 1; break; case 1: if (IsDma3ManagerBusyWithBgCopy()) break; // fallthrough case 2: task->tPos -= 2; if (task->tPos <= -24) { task->tState = 3; task->tTimer = 0; } break; case 3: task->tTimer++; if (task->tTimer > 120) { task->tTimer = 0; task->tState = 4; } break; case 4: task->tPos += 2; if (task->tPos >= 0) { if (task->tReshow) { MapNamePopupPrintMapNameOnWindow(task->tWindowId); CopyWindowToVram(task->tWindowId, COPYWIN_GFX); task->tState = 1; task->tReshow = FALSE; } else { task->tState = 6; return; } } case 5: break; case 6: if (task->tWindowExists && !task->tWindowCleared) { rbox_fill_rectangle(task->tWindowId); CopyWindowToVram(task->tWindowId, COPYWIN_MAP); task->tWindowCleared = TRUE; } task->tState = 7; return; case 7: if (!IsDma3ManagerBusyWithBgCopy()) { if (task->tWindowExists) { RemoveWindow(task->tWindowId); task->tWindowExists = FALSE; task->tWindowDestroyed = TRUE; } task->tState = 8; ChangeBgY(0, 0x00000000, 0); } return; case 8: DestroyTask(taskId); return; } SetGpuReg(REG_OFFSET_BG0VOFS, task->tPos); } void DismissMapNamePopup(void) { u8 taskId; s16 *data; taskId = FindTaskIdByFunc(Task_MapNamePopup); if (taskId != TASK_NONE) { data = gTasks[taskId].data; if (tState < 6) tState = 6; } } bool32 IsMapNamePopupTaskActive(void) { return FindTaskIdByFunc(Task_MapNamePopup) != TASK_NONE ? TRUE : FALSE; } #define WIN_PAL_NUM 13 static u16 MapNamePopupCreateWindow(bool32 palintoFadedBuffer) { struct WindowTemplate windowTemplate = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 29, .width = 14, .height = 2, .paletteNum = WIN_PAL_NUM, .baseBlock = 0x001 }; u16 windowId; u16 tileNum = 0x01D; if (gMapHeader.floorNum != 0) { if (gMapHeader.floorNum != FLOOR_ROOFTOP) { windowTemplate.width += 5; tileNum = 0x027; } else { // ROOFTOP windowTemplate.width += 8; tileNum = 0x02D; } } windowId = AddWindow(&windowTemplate); if (palintoFadedBuffer) LoadPalette(GetTextWindowPalette(3), BG_PLTT_ID(WIN_PAL_NUM), PLTT_SIZE_4BPP); else CpuCopy16(GetTextWindowPalette(3), &gPlttBufferUnfaded[BG_PLTT_ID(WIN_PAL_NUM)], PLTT_SIZE_4BPP); LoadStdWindowTiles(windowId, tileNum); DrawTextBorderOuter(windowId, tileNum, WIN_PAL_NUM); PutWindowTilemap(windowId); MapNamePopupPrintMapNameOnWindow(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); return windowId; } static void MapNamePopupPrintMapNameOnWindow(u16 windowId) { u8 mapName[25]; u32 maxWidth = 112; u32 xpos; u8 *ptr = GetMapName(mapName, gMapHeader.regionMapSectionId, 0); if(gMapHeader.mapType == MAP_TYPE_UNDERWATER) { ptr = GetMapName(mapName, MAPSEC_UNDERWATER_124, 0); } else if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(RS_BATTLE_TOWER) && (gSaveBlock1Ptr->location.mapNum >= MAP_NUM(RS_BATTLE_TOWER) && gSaveBlock1Ptr->location.mapNum <= MAP_NUM(RS_BATTLE_TOWER_BATTLE_ROOM))) //overwrite Battle Frontier name { ptr = StringCopy(mapName, gText_BattleTower); } /* else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FACTORY_LOBBY) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FACTORY_LOBBY)) //overwrite Battle Frontier name { ptr = StringCopy(mapName, gText_BattleFactory); } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_ARENA_LOBBY) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_ARENA_LOBBY)) //overwrite Battle Frontier name { ptr = StringCopy(mapName, gText_BattleArena); } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_PIKE_LOBBY) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_PIKE_LOBBY)) //overwrite Battle Frontier name { ptr = StringCopy(mapName, gText_BattlePike); } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_PALACE_LOBBY) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_PALACE_LOBBY)) //overwrite Battle Frontier name { ptr = StringCopy(mapName, gText_BattlePalace); } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_PYRAMID_LOBBY) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_PYRAMID_LOBBY)) //overwrite Battle Frontier name { ptr = StringCopy(mapName, gText_BattlePyramid); } else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_TOWER_LOBBY) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_TOWER_LOBBY)) //overwrite Battle Frontier name { ptr = StringCopy(mapName, gText_BattleTower); }*/ if (gMapHeader.floorNum != 0) { ptr = MapNamePopupAppendFloorNum(ptr, gMapHeader.floorNum); maxWidth = gMapHeader.floorNum != FLOOR_ROOFTOP ? 152 : 176; } xpos = (maxWidth - GetStringWidth(FONT_NORMAL, mapName, -1)) / 2; FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); AddTextPrinterParameterized(windowId, FONT_NORMAL, mapName, xpos, 2, TEXT_SKIP_DRAW, NULL); } static u8 *MapNamePopupAppendFloorNum(u8 *dest, s8 floorNum) { if (floorNum == 0) return dest; *dest++ = CHAR_SPACE; if (floorNum == FLOOR_ROOFTOP) return StringCopy(dest, gText_Rooftop2); if (floorNum < 0) { *dest++ = CHAR_B; floorNum *= -1; } dest = ConvertIntToDecimalStringN(dest, floorNum, STR_CONV_MODE_LEFT_ALIGN, 2); *dest++ = CHAR_F; *dest = EOS; return dest; } #undef tPalIntoFadedBuffer #undef tWindowDestroyed #undef tWindowCleared #undef tWindowExists #undef tWindowId #undef tReshow #undef tPos #undef tTimer #undef tState ================================================ FILE: src/map_preview_screen.c ================================================ #include "global.h" #include "gflib.h" #include "quest_log.h" #include "new_menu_helpers.h" #include "region_map.h" #include "menu.h" #include "field_fadetransition.h" #include "field_weather.h" #include "script.h" #include "overworld.h" #include "event_data.h" #include "map_preview_screen.h" #include "constants/region_map_sections.h" static EWRAM_DATA bool8 sHasVisitedMapBefore = FALSE; static EWRAM_DATA bool8 sAllocedBg0TilemapBuffer = FALSE; static void Task_RunMapPreviewScreenForest(u8 taskId); static const u8 sViridianForestMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/viridian_forest/tiles.gbapal"); static const u8 sViridianForestMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/viridian_forest/tiles.4bpp.lz"); static const u8 sViridianForestMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/viridian_forest/tilemap.bin.lz"); static const u8 sRockTunnelMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/rock_tunnel/tiles.gbapal"); static const u8 sRockTunnelMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/rock_tunnel/tiles.4bpp.lz"); static const u8 sRockTunnelMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/rock_tunnel/tilemap.bin.lz"); static const u8 sRocketHideoutMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/rocket_hideout/tiles.gbapal"); static const u8 sRocketHideoutMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/rocket_hideout/tiles.4bpp.lz"); static const u8 sRocketHideoutMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/rocket_hideout/tilemap.bin.lz"); static const u8 sPowerPlantMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/power_plant/tiles.gbapal"); static const u8 sPowerPlantMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/power_plant/tiles.4bpp.lz"); static const u8 sPowerPlantMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/power_plant/tilemap.bin.lz"); static const u8 sPokemonMansionMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/pokemon_mansion/tiles.gbapal"); static const u8 sPokemonMansionMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/pokemon_mansion/tiles.4bpp.lz"); static const u8 sPokemonMansionMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/pokemon_mansion/tilemap.bin.lz"); static const u8 sPokemonTowerMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/pokemon_tower/tiles.gbapal"); static const u8 sPokemonTowerMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/pokemon_tower/tiles.4bpp.lz"); static const u8 sPokemonTowerMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/pokemon_tower/tilemap.bin.lz"); static const u8 sSilphCoMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/silph_co/tiles.gbapal"); static const u8 sSilphCoMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/silph_co/tiles.4bpp.lz"); static const u8 sSilphCoMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/silph_co/tilemap.bin.lz"); static const u8 sMtMoonMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/mt_moon/tiles.gbapal"); static const u8 sMtMoonMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/mt_moon/tiles.4bpp.lz"); static const u8 sMtMoonMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/mt_moon/tilemap.bin.lz"); static const u8 sSeafoamIslandsMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/seafoam_islands/tiles.gbapal"); static const u8 sSeafoamIslandsMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/seafoam_islands/tiles.4bpp.lz"); static const u8 sSeafoamIslandsMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/seafoam_islands/tilemap.bin.lz"); static const u8 sRocketWarehouseMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/rocket_warehouse/tiles.gbapal"); static const u8 sRocketWarehouseMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/rocket_warehouse/tiles.4bpp.lz"); static const u8 sRocketWarehouseMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/rocket_warehouse/tilemap.bin.lz"); static const u8 sVictoryRoadMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/victory_road/tiles.gbapal"); static const u8 sVictoryRoadMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/victory_road/tiles.4bpp.lz"); static const u8 sVictoryRoadMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/victory_road/tilemap.bin.lz"); static const u8 sMtEmberMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/mt_ember/tiles.gbapal"); static const u8 sMtEmberMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/mt_ember/tiles.4bpp.lz"); static const u8 sMtEmberMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/mt_ember/tilemap.bin.lz"); static const u8 sSafariZoneMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/safari_zone/tiles.gbapal"); static const u8 sSafariZoneMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/safari_zone/tiles.4bpp.lz"); static const u8 sSafariZoneMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/safari_zone/tilemap.bin.lz"); static const u8 sMoneanChamberMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/monean_chamber/tiles.gbapal"); static const u8 sMoneanChamberMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/monean_chamber/tiles.4bpp.lz"); static const u8 sMoneanChamberMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/monean_chamber/tilemap.bin.lz"); static const u8 sDottedHoleMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/dotted_hole/tiles.gbapal"); static const u8 sDottedHoleMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/dotted_hole/tiles.4bpp.lz"); static const u8 sDottedHoleMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/dotted_hole/tilemap.bin.lz"); static const u8 sCeruleanCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/cerulean_cave/tiles.gbapal"); static const u8 sCeruleanCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/cerulean_cave/tiles.4bpp.lz"); static const u8 sCeruleanCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/cerulean_cave/tilemap.bin.lz"); static const u8 sDiglettsCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/digletts_cave/tiles.gbapal"); static const u8 sDiglettsCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/digletts_cave/tiles.4bpp.lz"); static const u8 sDiglettsCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/digletts_cave/tilemap.bin.lz"); static const u8 sLostCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/lost_cave/tiles.gbapal"); static const u8 sLostCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/lost_cave/tiles.4bpp.lz"); static const u8 sLostCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/lost_cave/tilemap.bin.lz"); static const u8 sBerryForestMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/berry_forest/tiles.gbapal"); static const u8 sBerryForestMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/berry_forest/tiles.4bpp.lz"); static const u8 sBerryForestMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/berry_forest/tilemap.bin.lz"); static const u8 sIcefallCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/icefall_cave/tiles.gbapal"); static const u8 sIcefallCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/icefall_cave/tiles.4bpp.lz"); static const u8 sIcefallCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/icefall_cave/tilemap.bin.lz"); static const u8 sAlteringCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/altering_cave/tiles.gbapal"); static const u8 sAlteringCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/altering_cave/tiles.4bpp.lz"); static const u8 sAlteringCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/altering_cave/tilemap.bin.lz"); static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = { [MPS_VIRIDIAN_FOREST] = { .mapsec = MAPSEC_VIRIDIAN_FOREST, .type = MPS_TYPE_FOREST, .flagId = FLAG_WORLD_MAP_VIRIDIAN_FOREST, .tilesptr = sViridianForestMapPreviewTiles, .tilemapptr = sViridianForestMapPreviewTilemap, .palptr = sViridianForestMapPreviewPalette }, [MPS_MT_MOON] = { .mapsec = MAPSEC_MT_MOON, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_MT_MOON_1F, .tilesptr = sMtMoonMapPreviewTiles, .tilemapptr = sMtMoonMapPreviewTilemap, .palptr = sMtMoonMapPreviewPalette }, [MPS_DIGLETTS_CAVE] = { .mapsec = MAPSEC_DIGLETTS_CAVE, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F, .tilesptr = sDiglettsCaveMapPreviewTiles, .tilemapptr = sDiglettsCaveMapPreviewTilemap, .palptr = sDiglettsCaveMapPreviewPalette }, [MPS_ROCK_TUNNEL] = { .mapsec = MAPSEC_ROCK_TUNNEL, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_ROCK_TUNNEL_1F, .tilesptr = sRockTunnelMapPreviewTiles, .tilemapptr = sRockTunnelMapPreviewTilemap, .palptr = sRockTunnelMapPreviewPalette }, [MPS_POKEMON_TOWER] = { .mapsec = MAPSEC_POKEMON_TOWER, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_POKEMON_TOWER_1F, .tilesptr = sPokemonTowerMapPreviewTiles, .tilemapptr = sPokemonTowerMapPreviewTilemap, .palptr = sPokemonTowerMapPreviewPalette }, [MPS_SAFARI_ZONE] = { .mapsec = MAPSEC_KANTO_SAFARI_ZONE, .type = MPS_TYPE_FOREST, .flagId = FLAG_WORLD_MAP_SAFARI_ZONE_CENTER, .tilesptr = sSafariZoneMapPreviewTiles, .tilemapptr = sSafariZoneMapPreviewTilemap, .palptr = sSafariZoneMapPreviewPalette }, [MPS_SEAFOAM_ISLANDS] = { .mapsec = MAPSEC_SEAFOAM_ISLANDS, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F, .tilesptr = sSeafoamIslandsMapPreviewTiles, .tilemapptr = sSeafoamIslandsMapPreviewTilemap, .palptr = sSeafoamIslandsMapPreviewPalette }, [MPS_POKEMON_MANSION] = { .mapsec = MAPSEC_POKEMON_MANSION, .type = MPS_TYPE_FOREST, .flagId = FLAG_WORLD_MAP_POKEMON_MANSION_1F, .tilesptr = sPokemonMansionMapPreviewTiles, .tilemapptr = sPokemonMansionMapPreviewTilemap, .palptr = sPokemonMansionMapPreviewPalette }, [MPS_ROCKET_HIDEOUT] = { .mapsec = MAPSEC_ROCKET_HIDEOUT, .type = MPS_TYPE_FOREST, .flagId = FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F, .tilesptr = sRocketHideoutMapPreviewTiles, .tilemapptr = sRocketHideoutMapPreviewTilemap, .palptr = sRocketHideoutMapPreviewPalette }, [MPS_SILPH_CO] = { .mapsec = MAPSEC_SILPH_CO, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SILPH_CO_1F, .tilesptr = sSilphCoMapPreviewTiles, .tilemapptr = sSilphCoMapPreviewTilemap, .palptr = sSilphCoMapPreviewPalette }, [MPS_VICTORY_ROAD] = { .mapsec = MAPSEC_KANTO_VICTORY_ROAD, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_VICTORY_ROAD_1F, .tilesptr = sVictoryRoadMapPreviewTiles, .tilemapptr = sVictoryRoadMapPreviewTilemap, .palptr = sVictoryRoadMapPreviewPalette }, [MPS_CERULEAN_CAVE] = { .mapsec = MAPSEC_CERULEAN_CAVE, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_CERULEAN_CAVE_1F, .tilesptr = sCeruleanCaveMapPreviewTiles, .tilemapptr = sCeruleanCaveMapPreviewTilemap, .palptr = sCeruleanCaveMapPreviewPalette }, [MPS_POWER_PLANT] = { .mapsec = MAPSEC_POWER_PLANT, .type = MPS_TYPE_FOREST, .flagId = FLAG_WORLD_MAP_POWER_PLANT, .tilesptr = sPowerPlantMapPreviewTiles, .tilemapptr = sPowerPlantMapPreviewTilemap, .palptr = sPowerPlantMapPreviewPalette }, [MPS_MT_EMBER] = { .mapsec = MAPSEC_MT_EMBER, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_MT_EMBER_EXTERIOR, .tilesptr = sMtEmberMapPreviewTiles, .tilemapptr = sMtEmberMapPreviewTilemap, .palptr = sMtEmberMapPreviewPalette }, [MPS_ROCKET_WAREHOUSE] = { .mapsec = MAPSEC_ROCKET_WAREHOUSE, .type = MPS_TYPE_FOREST, .flagId = FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST, .tilesptr = sRocketWarehouseMapPreviewTiles, .tilemapptr = sRocketWarehouseMapPreviewTilemap, .palptr = sRocketWarehouseMapPreviewPalette }, [MPS_MONEAN_CHAMBER] = { .mapsec = MAPSEC_MONEAN_CHAMBER, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER, .tilesptr = sMoneanChamberMapPreviewTiles, .tilemapptr = sMoneanChamberMapPreviewTilemap, .palptr = sMoneanChamberMapPreviewPalette }, [MPS_DOTTED_HOLE] = { .mapsec = MAPSEC_DOTTED_HOLE, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F, .tilesptr = sDottedHoleMapPreviewTiles, .tilemapptr = sDottedHoleMapPreviewTilemap, .palptr = sDottedHoleMapPreviewPalette }, [MPS_BERRY_FOREST] = { .mapsec = MAPSEC_BERRY_FOREST, .type = MPS_TYPE_FOREST, .flagId = FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST, .tilesptr = sBerryForestMapPreviewTiles, .tilemapptr = sBerryForestMapPreviewTilemap, .palptr = sBerryForestMapPreviewPalette }, [MPS_ICEFALL_CAVE] = { .mapsec = MAPSEC_ICEFALL_CAVE, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE, .tilesptr = sIcefallCaveMapPreviewTiles, .tilemapptr = sIcefallCaveMapPreviewTilemap, .palptr = sIcefallCaveMapPreviewPalette }, [MPS_LOST_CAVE] = { .mapsec = MAPSEC_LOST_CAVE, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE, .tilesptr = sLostCaveMapPreviewTiles, .tilemapptr = sLostCaveMapPreviewTilemap, .palptr = sLostCaveMapPreviewPalette }, [MPS_ALTERING_CAVE] = { .mapsec = MAPSEC_ALTERING_CAVE, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE, .tilesptr = sAlteringCaveMapPreviewTiles, .tilemapptr = sAlteringCaveMapPreviewTilemap, .palptr = sAlteringCaveMapPreviewPalette }, [MPS_PATTERN_BUSH] = { .mapsec = MAPSEC_PATTERN_BUSH, .type = MPS_TYPE_FOREST, .flagId = FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH, .tilesptr = sViridianForestMapPreviewTiles, .tilemapptr = sViridianForestMapPreviewTilemap, .palptr = sViridianForestMapPreviewPalette }, [MPS_LIPTOO_CHAMBER] = { .mapsec = MAPSEC_LIPTOO_CHAMBER, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER, .tilesptr = sMoneanChamberMapPreviewTiles, .tilemapptr = sMoneanChamberMapPreviewTilemap, .palptr = sMoneanChamberMapPreviewPalette }, [MPS_WEEPTH_CHAMBER] = { .mapsec = MAPSEC_WEEPTH_CHAMBER, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER, .tilesptr = sMoneanChamberMapPreviewTiles, .tilemapptr = sMoneanChamberMapPreviewTilemap, .palptr = sMoneanChamberMapPreviewPalette }, [MPS_TDILFORD_CHAMBER] = { .mapsec = MAPSEC_DILFORD_CHAMBER, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER, .tilesptr = sMoneanChamberMapPreviewTiles, .tilemapptr = sMoneanChamberMapPreviewTilemap, .palptr = sMoneanChamberMapPreviewPalette }, [MPS_SCUFIB_CHAMBER] = { .mapsec = MAPSEC_SCUFIB_CHAMBER, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER, .tilesptr = sMoneanChamberMapPreviewTiles, .tilemapptr = sMoneanChamberMapPreviewTilemap, .palptr = sMoneanChamberMapPreviewPalette }, [MPS_RIXY_CHAMBER] = { .mapsec = MAPSEC_RIXY_CHAMBER, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER, .tilesptr = sMoneanChamberMapPreviewTiles, .tilemapptr = sMoneanChamberMapPreviewTilemap, .palptr = sMoneanChamberMapPreviewPalette }, [MPS_VIAPOIS_CHAMBER] = { .mapsec = MAPSEC_VIAPOIS_CHAMBER, .type = MPS_TYPE_CAVE, .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER, .tilesptr = sMoneanChamberMapPreviewTiles, .tilemapptr = sMoneanChamberMapPreviewTilemap, .palptr = sMoneanChamberMapPreviewPalette } }; static const struct WindowTemplate sMapNameWindow = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 13, .height = 2, .paletteNum = 14, .baseBlock = 0x1C2 }; static const struct BgTemplate sMapPreviewBgTemplate[1] = { { .mapBaseIndex = 31 } }; static u8 GetMapPreviewScreenIdx(u8 mapsec) { s32 i; for (i = 0; i < MPS_COUNT; i++) { if (sMapPreviewScreenData[i].mapsec == mapsec) { return i; } } return MPS_COUNT; } bool8 MapHasPreviewScreen(u8 mapsec, u8 type) { u8 idx; idx = GetMapPreviewScreenIdx(mapsec); if (idx != MPS_COUNT) { if (type == MPS_TYPE_ANY) { return TRUE; } else { return sMapPreviewScreenData[idx].type == type ? TRUE : FALSE; } } else { return FALSE; } } bool32 MapHasPreviewScreen_HandleQLState2(u8 mapsec, u8 type) { if (gQuestLogState == QL_STATE_PLAYBACK) { return FALSE; } else { return MapHasPreviewScreen(mapsec, type); } } void MapPreview_InitBgs(void) { InitBgsFromTemplates(0, sMapPreviewBgTemplate, NELEMS(sMapPreviewBgTemplate)); ShowBg(0); } void MapPreview_LoadGfx(u8 mapsec) { u8 idx; idx = GetMapPreviewScreenIdx(mapsec); if (idx != MPS_COUNT) { ResetTempTileDataBuffers(); LoadPalette(sMapPreviewScreenData[idx].palptr, BG_PLTT_ID(13), 3 * PLTT_SIZE_4BPP); DecompressAndCopyTileDataToVram(0, sMapPreviewScreenData[idx].tilesptr, 0, 0, 0); if (GetBgTilemapBuffer(0) == NULL) { SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); sAllocedBg0TilemapBuffer = TRUE; } else { sAllocedBg0TilemapBuffer = FALSE; } CopyToBgTilemapBuffer(0, sMapPreviewScreenData[idx].tilemapptr, 0, 0x000); CopyBgTilemapBufferToVram(0); } } void MapPreview_Unload(s32 windowId) { RemoveWindow(windowId); if (sAllocedBg0TilemapBuffer) { Free(GetBgTilemapBuffer(0)); } } bool32 MapPreview_IsGfxLoadFinished(void) { return FreeTempTileDataBuffersIfPossible(); } void MapPreview_StartForestTransition(u8 mapsec) { u8 taskId; taskId = CreateTask(Task_RunMapPreviewScreenForest, 0); gTasks[taskId].data[2] = GetBgAttribute(0, BG_ATTR_PRIORITY); gTasks[taskId].data[4] = GetGpuReg(REG_OFFSET_BLDCNT); gTasks[taskId].data[5] = GetGpuReg(REG_OFFSET_BLDALPHA); gTasks[taskId].data[3] = GetGpuReg(REG_OFFSET_DISPCNT); gTasks[taskId].data[6] = GetGpuReg(REG_OFFSET_WININ); gTasks[taskId].data[7] = GetGpuReg(REG_OFFSET_WINOUT); gTasks[taskId].data[10] = MapPreview_GetDuration(mapsec); gTasks[taskId].data[8] = 16; gTasks[taskId].data[9] = 0; SetBgAttribute(0, BG_ATTR_PRIORITY, 0); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_CLR | WININ_WIN1_CLR); SetGpuRegBits(REG_OFFSET_WINOUT, WINOUT_WIN01_CLR); gTasks[taskId].data[11] = MapPreview_CreateMapNameWindow(mapsec); LockPlayerFieldControls(); } u16 MapPreview_CreateMapNameWindow(u8 mapsec) { u16 windowId; u32 xctr; u8 color[3]; windowId = AddWindow(&sMapNameWindow); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); color[0] = TEXT_COLOR_WHITE; // Access violation color[1] = TEXT_COLOR_RED; // Access violation color[2] = TEXT_COLOR_LIGHT_GRAY; // Access violation GetMapName(gStringVar4, mapsec, 0); xctr = 104 - GetStringWidth(FONT_NORMAL, gStringVar4, 0); AddTextPrinterParameterized4(windowId, FONT_NORMAL, xctr / 2, 2, 0, 0, color/* Access violation */, -1, gStringVar4); return windowId; } bool32 ForestMapPreviewScreenIsRunning(void) { if (FuncIsActiveTask(Task_RunMapPreviewScreenForest) == TRUE) { return FALSE; } else { return TRUE; } } static void Task_RunMapPreviewScreenForest(u8 taskId) { s16 * data; data = gTasks[taskId].data; switch (data[0]) { case 0: if (!MapPreview_IsGfxLoadFinished() && !IsDma3ManagerBusyWithBgCopy()) { CopyWindowToVram(data[11], COPYWIN_FULL); data[0]++; } break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { FadeInFromBlack(); data[0]++; } break; case 2: if (IsWeatherNotFadingIn()) { Overworld_PlaySpecialMapMusic(); data[0]++; } break; case 3: data[1]++; if (data[1] > data[10]) { data[1] = 0; data[0]++; } break; case 4: switch (data[1]) { case 0: data[9]++; if (data[9] > 16) { data[9] = 16; } break; case 1: data[8]--; if (data[8] < 0) { data[8] = 0; } break; } data[1] = (data[1] + 1) % 3; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(data[8], data[9])); if (data[8] == 0 && data[9] == 16) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(0); data[0]++; } break; case 5: if (!IsDma3ManagerBusyWithBgCopy()) { MapPreview_Unload(data[11]); SetBgAttribute(0, BG_ATTR_PRIORITY, data[2]); SetGpuReg(REG_OFFSET_DISPCNT, data[3]); SetGpuReg(REG_OFFSET_BLDCNT, data[4]); SetGpuReg(REG_OFFSET_BLDALPHA, data[5]); SetGpuReg(REG_OFFSET_WININ, data[6]); SetGpuReg(REG_OFFSET_WINOUT, data[7]); DestroyTask(taskId); } break; } } const struct MapPreviewScreen * GetDungeonMapPreviewScreenInfo(u8 mapsec) { u8 idx; idx = GetMapPreviewScreenIdx(mapsec); if (idx == MPS_COUNT) { return NULL; } else { return &sMapPreviewScreenData[idx]; } } u16 MapPreview_GetDuration(u8 mapsec) { u8 idx; u16 flagId; idx = GetMapPreviewScreenIdx(mapsec); if (idx == MPS_COUNT) { return 0; } flagId = sMapPreviewScreenData[idx].flagId; if (sMapPreviewScreenData[idx].type == MPS_TYPE_CAVE) { if (!FlagGet(flagId)) { return 120; } else { return 40; } } else { if (sHasVisitedMapBefore) { return 120; } else { return 40; } } } void MapPreview_SetFlag(u16 flagId) { if (!FlagGet(flagId)) { sHasVisitedMapBefore = TRUE; } else { sHasVisitedMapBefore = FALSE; } FlagSet(flagId); } ================================================ FILE: src/math_util.c ================================================ #include "global.h" #include "math_util.h" s16 Q_8_8_mul(s16 x, s16 y) { s32 result; result = x; result *= y; result /= 256; return result; } s16 Q_N_S_mul(u8 s, s16 x, s16 y) { s32 result; result = x; result *= y; result /= (1 << s); return result; } s32 Q_24_8_mul(s32 x, s32 y) { s64 result; result = x; result *= y; result /= 256; return result; } s16 Q_8_8_div(s16 x, s16 y) { if (y == 0) { return 0; } return (x << 8) / y; } s16 Q_N_S_div(u8 s, s16 x, s16 y) { if (y == 0) { return 0; } return (x << s) / y; } s32 Q_24_8_div(s32 x, s32 y) { s64 _x; if (y == 0) { return 0; } _x = x; _x *= 256; return _x / y; } s16 Q_8_8_inv(s16 y) { s32 x; x = 0x10000; return x / y; } s16 Q_N_S_inv(u8 s, s16 y) { s32 x; x = 0x100 << s; return x / y; } s32 Q_24_8_inv(s32 y) { s64 x; x = 0x10000; return x / y; } ================================================ FILE: src/menu.c ================================================ #include "global.h" #include "gflib.h" #include "menu.h" #include "menu_helpers.h" #include "strings.h" #include "text_window.h" #include "constants/songs.h" struct Menu { u8 left; u8 top; s8 cursorPos; s8 minCursorPos; s8 maxCursorPos; u8 windowId; u8 fontId; u8 optionWidth; u8 optionHeight; u8 columns; u8 rows; bool8 APressMuted; }; static EWRAM_DATA struct Menu sMenu = {0}; static EWRAM_DATA u16 sTileNum = 0; static EWRAM_DATA u8 sPaletteNum = 0; static EWRAM_DATA u8 sYesNoWindowId = 0; static EWRAM_DATA u8 sTopBarWindowId = 0; static void WindowFunc_DrawDialogFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); static void WindowFunc_ClearDialogWindowAndFrameNullPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); static void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); static void WindowFunc_ClearStdWindowAndFrameToTransparent(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); static u8 MultichoiceGrid_MoveCursor(s8 deltaX, s8 deltaY); static const u8 sTopBarWindowTextColors[3] = {15, 1, 2}; void DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 tileNum, u8 paletteNum) { sTileNum = tileNum; sPaletteNum = paletteNum; CallWindowFunction(windowId, WindowFunc_DrawDialogFrameWithCustomTileAndPalette); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } // not used static void DrawDialogFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 tileNum) { sTileNum = tileNum; sPaletteNum = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM); CallWindowFunction(windowId, WindowFunc_DrawDialogFrameWithCustomTileAndPalette); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_DrawDialogFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { FillBgTilemapBufferRect(bg, sTileNum, tilemapLeft - 2, tilemapTop - 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 2, tilemapLeft, tilemapTop - 1, width, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 5, tilemapLeft - 2, tilemapTop, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 6, tilemapLeft - 1, tilemapTop, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 8, tilemapLeft + width, tilemapTop, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 10), tilemapLeft - 2, tilemapTop + 2, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 11), tilemapLeft - 1, tilemapTop + 2, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 12), tilemapLeft + width, tilemapTop + 2, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 13), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 5), tilemapLeft - 2, tilemapTop + 3, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 6), tilemapLeft - 1, tilemapTop + 3, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 8), tilemapLeft + width, tilemapTop + 3, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 9), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum), tilemapLeft - 2, tilemapTop + 4, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 2), tilemapLeft, tilemapTop + 4, width, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, sPaletteNum); } void ClearDialogWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram) { // The palette slot doesn't matter, since the tiles are transparent. CallWindowFunction(windowId, WindowFunc_ClearDialogWindowAndFrameNullPalette); FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); ClearWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_ClearDialogWindowAndFrameNullPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, 0); } void DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum) { sTileNum = baseTileNum; sPaletteNum = paletteNum; CallWindowFunction(windowId, WindowFunc_DrawStdFrameWithCustomTileAndPalette); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } // not used static void DrawStdFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 baseTileNum) { sTileNum = baseTileNum; sPaletteNum = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM); CallWindowFunction(windowId, WindowFunc_DrawStdFrameWithCustomTileAndPalette); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { FillBgTilemapBufferRect(bg, sTileNum, tilemapLeft - 1, tilemapTop - 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 1, tilemapLeft, tilemapTop - 1, width, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 2, tilemapLeft + width, tilemapTop - 1, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 3, tilemapLeft - 1, tilemapTop, 1, height, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 5, tilemapLeft + width, tilemapTop, 1, height, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 6, tilemapLeft - 1, tilemapTop + height, 1, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 7, tilemapLeft, tilemapTop + height, width, 1, sPaletteNum); FillBgTilemapBufferRect(bg, sTileNum + 8, tilemapLeft + width, tilemapTop + height, 1, 1, sPaletteNum); } void ClearStdWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram) { CallWindowFunction(windowId, WindowFunc_ClearStdWindowAndFrameToTransparent); FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); ClearWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_ClearStdWindowAndFrameToTransparent(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, 0); } /* The following functions are used for handling top bar window in hall of fame screen and story mode screen before oak intro. However, you can still designate a yPos value to place that bar as well as the bar width. The xPos is simply computed according to width (always right aligned). */ u8 CreateTopBarWindowLoadPalette(u8 bg, u8 width, u8 yPos, u8 palette, u16 baseTile) { struct WindowTemplate window; memset(&window, 0, sizeof(window)); if (bg > 3) window.bg = 0; else window.bg = bg; window.tilemapTop = yPos; window.height = 2; window.tilemapLeft = 0x1E - width; window.width = width; window.paletteNum = palette; window.baseBlock = baseTile; sTopBarWindowId = AddWindow(&window); if (palette > 15) palette = BG_PLTT_ID(15); else palette = BG_PLTT_ID(palette); LoadPalette(GetTextWindowPalette(2), palette, PLTT_SIZE_4BPP); return sTopBarWindowId; } void TopBarWindowPrintString(const u8 *string, u8 unused, bool8 copyToVram) { s32 width; if (sTopBarWindowId != 0xFF) { PutWindowTilemap(sTopBarWindowId); FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15)); width = GetStringWidth(FONT_SMALL, string, 0); AddTextPrinterParameterized3(sTopBarWindowId, FONT_SMALL, -20 - width, 1, sTopBarWindowTextColors, 0, string); if (copyToVram) CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); } } void TopBarWindowPrintTwoStrings(const u8 *string, const u8 *string2, bool8 fgColorChooser, u8 unused, bool8 copyToVram) { u8 color[3]; s32 fgColor, width; if ( sTopBarWindowId != 0xFF ) { if (fgColorChooser) { color[0] = 0; color[1] = 1; color[2] = 2; } else { color[0] = 15; color[1] = 1; color[2] = 2; } PutWindowTilemap(sTopBarWindowId); FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15)); if (string2) { width = GetStringWidth(FONT_SMALL, string2, 0); AddTextPrinterParameterized3(sTopBarWindowId, FONT_SMALL, -20 - width, 1, color, 0, string2); } AddTextPrinterParameterized4(sTopBarWindowId, FONT_NORMAL_COPY_1, 4, 1, 0, 0, color, 0, string); if (copyToVram) CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); } } // not used static void CopyTopBarWindowToVram(void) { if (sTopBarWindowId != 0xFF) CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); } void ClearTopBarWindow(void) { if (sTopBarWindowId != 0xFF) { FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15)); CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); } } void DestroyTopBarWindow(void) { if (sTopBarWindowId != 0xFF) { FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(0)); ClearWindowTilemap(sTopBarWindowId); CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL); RemoveWindow(sTopBarWindowId); sTopBarWindowId = 0xFF; } } u8 Menu_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos, bool8 APressMuted) { s32 pos; sMenu.left = left; sMenu.top = top; sMenu.minCursorPos = 0; sMenu.maxCursorPos = numChoices - 1; sMenu.windowId = windowId; sMenu.fontId = fontId; sMenu.optionHeight = cursorHeight; sMenu.APressMuted = APressMuted; pos = initialCursorPos; if (pos < 0 || pos > sMenu.maxCursorPos) sMenu.cursorPos = 0; else sMenu.cursorPos = pos; Menu_MoveCursor(0); return sMenu.cursorPos; } u8 Menu_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos) { return Menu_InitCursorInternal(windowId, fontId, left, top, cursorHeight, numChoices, initialCursorPos, 0); } // Unused static u8 InitMenuDefaultCursorHeight(u8 windowId, u8 fontId, u8 left, u8 top, u8 numChoices, u8 initialCursorPos) { return Menu_InitCursor(windowId, fontId, left, top, GetMenuCursorDimensionByFont(fontId, 1), numChoices, initialCursorPos); } static void Menu_RedrawCursor(u8 oldPos, u8 newPos) { u8 width, height; width = GetMenuCursorDimensionByFont(sMenu.fontId, 0); height = GetMenuCursorDimensionByFont(sMenu.fontId, 1); FillWindowPixelRect(sMenu.windowId, 1, sMenu.left, sMenu.optionHeight * oldPos + sMenu.top, width, height); AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gText_SelectorArrow2, sMenu.left, sMenu.optionHeight * newPos + sMenu.top, 0, 0); } u8 Menu_MoveCursor(s8 cursorDelta) { u8 oldPos = sMenu.cursorPos; s32 newPos = sMenu.cursorPos + cursorDelta; if (newPos < sMenu.minCursorPos) sMenu.cursorPos = sMenu.maxCursorPos; else if (newPos > sMenu.maxCursorPos) sMenu.cursorPos = sMenu.minCursorPos; else sMenu.cursorPos += cursorDelta; Menu_RedrawCursor(oldPos, sMenu.cursorPos); return sMenu.cursorPos; } u8 Menu_MoveCursorNoWrapAround(s8 cursorDelta) { u8 oldPos = sMenu.cursorPos; s32 newPos = sMenu.cursorPos + cursorDelta; if (newPos < sMenu.minCursorPos) sMenu.cursorPos = sMenu.minCursorPos; else if (newPos > sMenu.maxCursorPos) sMenu.cursorPos = sMenu.maxCursorPos; else sMenu.cursorPos += cursorDelta; Menu_RedrawCursor(oldPos, sMenu.cursorPos); return sMenu.cursorPos; } u8 Menu_GetCursorPos(void) { return sMenu.cursorPos; } s8 Menu_ProcessInput(void) { if (JOY_NEW(A_BUTTON)) { if (!sMenu.APressMuted) PlaySE(SE_SELECT); return sMenu.cursorPos; } if (JOY_NEW(B_BUTTON)) { return MENU_B_PRESSED; } if (JOY_NEW(DPAD_UP)) { PlaySE(SE_SELECT); Menu_MoveCursor(-1); return MENU_NOTHING_CHOSEN; } if (JOY_NEW(DPAD_DOWN)) { PlaySE(SE_SELECT); Menu_MoveCursor(1); return MENU_NOTHING_CHOSEN; } return MENU_NOTHING_CHOSEN; } s8 Menu_ProcessInputNoWrapAround(void) { u8 oldPos = sMenu.cursorPos; if (JOY_NEW(A_BUTTON)) { if (!sMenu.APressMuted) PlaySE(SE_SELECT); return sMenu.cursorPos; } if (JOY_NEW(B_BUTTON)) { return MENU_B_PRESSED; } if (JOY_NEW(DPAD_UP)) { if (oldPos != Menu_MoveCursorNoWrapAround(-1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } if (JOY_NEW(DPAD_DOWN)) { if (oldPos != Menu_MoveCursorNoWrapAround(1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } return MENU_NOTHING_CHOSEN; } s16 Menu_ProcessInputNoWrapAround2(void) { u16 oldPos = sMenu.cursorPos; if (JOY_NEW(A_BUTTON)) { if (!sMenu.APressMuted) PlaySE(SE_SELECT); return sMenu.cursorPos; } else if (JOY_NEW(B_BUTTON)) { return MENU_B_PRESSED; } else if (JOY_NEW(DPAD_UP)) { if (oldPos != Menu_MoveCursorNoWrapAround(-1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } else if (JOY_NEW(DPAD_DOWN)) { if (oldPos != Menu_MoveCursorNoWrapAround(1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } return MENU_NOTHING_CHOSEN; } s8 Menu_ProcessInput_other(void) { if (JOY_NEW(A_BUTTON)) { if (!sMenu.APressMuted) PlaySE(SE_SELECT); return sMenu.cursorPos; } if (JOY_NEW(B_BUTTON)) { return MENU_B_PRESSED; } if (JOY_REPT(DPAD_ANY) == DPAD_UP) { PlaySE(SE_SELECT); Menu_MoveCursor(-1); return MENU_NOTHING_CHOSEN; } if (JOY_REPT(DPAD_ANY) == DPAD_DOWN) { PlaySE(SE_SELECT); Menu_MoveCursor(1); return MENU_NOTHING_CHOSEN; } return MENU_NOTHING_CHOSEN; } s8 Menu_ProcessInputNoWrapAround_other(void) { u8 oldPos = sMenu.cursorPos; if (JOY_NEW(A_BUTTON)) { if (!sMenu.APressMuted) PlaySE(SE_SELECT); return sMenu.cursorPos; } if (JOY_NEW(B_BUTTON)) { return MENU_B_PRESSED; } if (JOY_REPT(DPAD_ANY) == DPAD_UP) { if (oldPos != Menu_MoveCursorNoWrapAround(-1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } if (JOY_REPT(DPAD_ANY) == DPAD_DOWN) { if (oldPos != Menu_MoveCursorNoWrapAround(1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } return MENU_NOTHING_CHOSEN; } void PrintTextArray(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs) { u32 i; for (i = 0; i < itemCount; i++) AddTextPrinterParameterized(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL); CopyWindowToVram(windowId, COPYWIN_GFX); } void MultichoiceList_PrintItems(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, u8 letterSpacing, u8 lineSpacing) { u32 i; for (i = 0; i < itemCount; i++) AddTextPrinterParameterized5(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL, letterSpacing, lineSpacing); CopyWindowToVram(windowId, COPYWIN_GFX); } void PrintMenuTable(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs) { u8 left = GetMenuCursorDimensionByFont(fontId, 0); PrintTextArray(windowId, fontId, left, 0, lineHeight, itemCount, strs); } void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray) { u32 i; struct TextPrinterTemplate printer; printer.windowId = windowId; printer.fontId = fontId; printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND); printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND); printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW); printer.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN); printer.letterSpacing = letterSpacing; printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); printer.x = left; printer.currentX = left; for (i = 0; i < itemCount; i++) { printer.currentChar = strs[orderArray[i]].text; printer.y = (lineHeight * i) + top; printer.currentY = printer.y; AddTextPrinter(&printer, 0xFF, NULL); } CopyWindowToVram(windowId, COPYWIN_GFX); } // Unused static void PrintMenuActionTextsAtTopById(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray) { AddItemMenuActionTextPrinters(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 0, GetFontAttribute(fontId, FONTATTR_LETTER_SPACING), lineHeight, itemCount, strs, orderArray); } struct WindowTemplate SetWindowTemplateFields(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock) { struct WindowTemplate template; template.bg = bg; template.tilemapLeft = left; template.tilemapTop = top; template.width = width; template.height = height; template.paletteNum = paletteNum; template.baseBlock = baseBlock; return template; } // not used static u16 CreateWindowTemplate(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock) { struct WindowTemplate template = SetWindowTemplateFields(bg, left, top, width, height, paletteNum, baseBlock); return AddWindow(&template); } void CreateYesNoMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos) { struct TextPrinterTemplate textSubPrinter; sYesNoWindowId = AddWindow(window); DrawStdFrameWithCustomTileAndPalette(sYesNoWindowId, 1, baseTileNum, paletteNum); textSubPrinter.currentChar = gText_YesNo; textSubPrinter.windowId = sYesNoWindowId; textSubPrinter.fontId = fontId; textSubPrinter.x = GetMenuCursorDimensionByFont(fontId, 0) + left; textSubPrinter.y = top; textSubPrinter.currentX = textSubPrinter.x; textSubPrinter.currentY = textSubPrinter.y; textSubPrinter.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND); textSubPrinter.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND); textSubPrinter.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW); textSubPrinter.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN); textSubPrinter.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING); textSubPrinter.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); AddTextPrinter(&textSubPrinter, 0xFF, NULL); Menu_InitCursor(sYesNoWindowId, fontId, left, top, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT) + textSubPrinter.lineSpacing, 2, initialCursorPos); } // not used static void CreateYesNoMenu2(const struct WindowTemplate *window, u8 fontId, u16 baseTileNum, u8 initialCursorPos) { CreateYesNoMenu(window, fontId, 0, 0, baseTileNum, initialCursorPos, 0); } s8 Menu_ProcessInputNoWrapClearOnChoose(void) { s8 result = Menu_ProcessInputNoWrapAround(); if (result != MENU_NOTHING_CHOSEN) DestroyYesNoMenu(); return result; } void DestroyYesNoMenu(void) { ClearStdWindowAndFrameToTransparent(sYesNoWindowId, TRUE); RemoveWindow(sYesNoWindowId); } void MultichoiceGrid_PrintItems(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs) { u8 width, i, j, yOffset; fontId = fontId; itemWidth = itemWidth; itemHeight = itemHeight; width = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH); yOffset = (16 - GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT)) / 2; for (i = 0; i < rows; ++i) for (j = 0; j < cols; ++j) AddTextPrinterParameterized(windowId, fontId, strs[i * cols + j].text, itemWidth * j + width, yOffset + itemHeight * i, 0xFF, 0); CopyWindowToVram(windowId, COPYWIN_GFX); } //not used static void MultichoiceGrid_PrintItemsCustomOrder(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs, const u8 *orderArray) { u8 width, i, j; fontId = fontId; itemWidth = itemWidth; itemHeight = itemHeight; width = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH); for (i = 0; i < rows; ++i) for (j = 0; j < cols; ++j) AddTextPrinterParameterized(windowId, fontId, strs[orderArray[i * cols + j]].text, itemWidth * j + width, itemHeight * i, 0xFF, 0); CopyWindowToVram(windowId, COPYWIN_GFX); } static u8 MultichoiceGrid_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cursorHeight, u8 cols, u8 rows, u8 numChoices, u8 cursorPos) { s32 pos; sMenu.left = left; sMenu.top = top; sMenu.minCursorPos = 0; sMenu.maxCursorPos = numChoices - 1; sMenu.windowId = windowId; sMenu.fontId = fontId; sMenu.optionWidth = optionWidth; sMenu.optionHeight = cursorHeight; sMenu.columns = cols; sMenu.rows = rows; pos = cursorPos; if (pos < 0 || pos > sMenu.maxCursorPos) sMenu.cursorPos = 0; else sMenu.cursorPos = pos; MultichoiceGrid_MoveCursor(0, 0); return sMenu.cursorPos; } u8 MultichoiceGrid_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cols, u8 rows, u8 cursorPos) { s32 cursorHeight = 16; u8 numChoices = cols * rows; return MultichoiceGrid_InitCursorInternal(windowId, fontId, left, top, optionWidth, cursorHeight, cols, rows, numChoices, cursorPos); } static void MultichoiceGrid_RedrawCursor(u8 oldCursorPos, u8 newCursorPos) { u8 cursorWidth = GetMenuCursorDimensionByFont(sMenu.fontId, 0); u8 cursorHeight = GetMenuCursorDimensionByFont(sMenu.fontId, 1); u8 xPos = (oldCursorPos % sMenu.columns) * sMenu.optionWidth + sMenu.left; u8 yPos = (oldCursorPos / sMenu.columns) * sMenu.optionHeight + sMenu.top; FillWindowPixelRect(sMenu.windowId, PIXEL_FILL(1), xPos, yPos, cursorWidth, cursorHeight); xPos = (newCursorPos % sMenu.columns) * sMenu.optionWidth + sMenu.left; yPos = (newCursorPos / sMenu.columns) * sMenu.optionHeight + sMenu.top; AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gText_SelectorArrow2, xPos, yPos, 0, 0); } static u8 MultichoiceGrid_MoveCursor(s8 deltaX, s8 deltaY) { u8 oldPos = sMenu.cursorPos; if (deltaX) { if ((sMenu.cursorPos % sMenu.columns) + deltaX < 0) sMenu.cursorPos += sMenu.columns - 1; else if ((sMenu.cursorPos % sMenu.columns) + deltaX >= sMenu.columns) sMenu.cursorPos = (sMenu.cursorPos / sMenu.columns) * sMenu.columns; else sMenu.cursorPos += deltaX; } if (deltaY) { if ((sMenu.cursorPos / sMenu.columns) + deltaY < 0) sMenu.cursorPos += sMenu.columns * (sMenu.rows - 1); else if ((sMenu.cursorPos / sMenu.columns) + deltaY >= sMenu.rows) sMenu.cursorPos -= sMenu.columns * (sMenu.rows - 1); else sMenu.cursorPos += (sMenu.columns * deltaY); } if (sMenu.cursorPos > sMenu.maxCursorPos) { sMenu.cursorPos = oldPos; return sMenu.cursorPos; } else { MultichoiceGrid_RedrawCursor(oldPos, sMenu.cursorPos); return sMenu.cursorPos; } } static u8 MultichoiceGrid_MoveCursorIfValid(s8 deltaX, s8 deltaY) { u8 oldPos = sMenu.cursorPos; if (deltaX) { if (((sMenu.cursorPos % sMenu.columns) + deltaX >= 0) && ((sMenu.cursorPos % sMenu.columns) + deltaX < sMenu.columns)) sMenu.cursorPos += deltaX; } if (deltaY) { if (((sMenu.cursorPos / sMenu.columns) + deltaY >= 0) && ((sMenu.cursorPos / sMenu.columns) + deltaY < sMenu.rows)) sMenu.cursorPos += (sMenu.columns * deltaY); } if (sMenu.cursorPos > sMenu.maxCursorPos) { sMenu.cursorPos = oldPos; return sMenu.cursorPos; } else { MultichoiceGrid_RedrawCursor(oldPos, sMenu.cursorPos); return sMenu.cursorPos; } } // Unused static s8 Menu_ProcessGridInput_NoSoundLimit(void) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); return sMenu.cursorPos; } else if (JOY_NEW(B_BUTTON)) { return MENU_B_PRESSED; } else if (JOY_NEW(DPAD_UP)) { PlaySE(SE_SELECT); MultichoiceGrid_MoveCursor(0, -1); return MENU_NOTHING_CHOSEN; } else if (JOY_NEW(DPAD_DOWN)) { PlaySE(SE_SELECT); MultichoiceGrid_MoveCursor(0, 1); return MENU_NOTHING_CHOSEN; } else if (JOY_NEW(DPAD_LEFT) || GetLRKeysPressed() == MENU_L_PRESSED) { PlaySE(SE_SELECT); MultichoiceGrid_MoveCursor(-1, 0); return MENU_NOTHING_CHOSEN; } else if (JOY_NEW(DPAD_RIGHT) || GetLRKeysPressed() == MENU_R_PRESSED) { PlaySE(SE_SELECT); MultichoiceGrid_MoveCursor(1, 0); return MENU_NOTHING_CHOSEN; } return MENU_NOTHING_CHOSEN; } s8 Menu_ProcessInputGridLayout(void) { u8 oldPos = sMenu.cursorPos; if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); return sMenu.cursorPos; } else if (JOY_NEW(B_BUTTON)) { return MENU_B_PRESSED; } else if (JOY_NEW(DPAD_UP)) { if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, -1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } else if (JOY_NEW(DPAD_DOWN)) { if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, 1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } else if (JOY_NEW(DPAD_LEFT) || GetLRKeysPressed() == MENU_L_PRESSED) { if (oldPos != MultichoiceGrid_MoveCursorIfValid(-1, 0)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } else if (JOY_NEW(DPAD_RIGHT) || GetLRKeysPressed() == MENU_R_PRESSED) { if (oldPos != MultichoiceGrid_MoveCursorIfValid(1, 0)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } return MENU_NOTHING_CHOSEN; } // Unused static s8 Menu_ProcessGridInputRepeat_NoSoundLimit(void) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); return sMenu.cursorPos; } else if (JOY_NEW(B_BUTTON)) { return MENU_B_PRESSED; } else if (JOY_REPT(DPAD_ANY) == DPAD_UP) { PlaySE(SE_SELECT); MultichoiceGrid_MoveCursor(0, -1); return MENU_NOTHING_CHOSEN; } else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN) { PlaySE(SE_SELECT); MultichoiceGrid_MoveCursor(0, 1); return MENU_NOTHING_CHOSEN; } else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT || GetLRKeysPressedAndHeld() == MENU_L_PRESSED) { PlaySE(SE_SELECT); MultichoiceGrid_MoveCursor(-1, 0); return MENU_NOTHING_CHOSEN; } else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT || GetLRKeysPressedAndHeld() == MENU_R_PRESSED) { PlaySE(SE_SELECT); MultichoiceGrid_MoveCursor(1, 0); return MENU_NOTHING_CHOSEN; } return MENU_NOTHING_CHOSEN; } // Unused static s8 Menu_ProcessGridInputRepeat(void) { u8 oldPos = sMenu.cursorPos; if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); return sMenu.cursorPos; } else if (JOY_NEW(B_BUTTON)) { return MENU_B_PRESSED; } else if (JOY_REPT(DPAD_ANY) == DPAD_UP) { if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, -1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN) { if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, 1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT || GetLRKeysPressedAndHeld() == MENU_L_PRESSED) { if (oldPos != MultichoiceGrid_MoveCursorIfValid(-1, 0)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT || GetLRKeysPressedAndHeld() == MENU_R_PRESSED) { if (oldPos != MultichoiceGrid_MoveCursorIfValid(1, 0)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } return MENU_NOTHING_CHOSEN; } ================================================ FILE: src/menu2.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "wild_encounter.h" // Not actually "old" given these were introduced in Gen 3, // but they're used as equivalents here alongside the other OLD_UNOWN #define SPECIES_OLD_UNOWN_EMARK (NUM_SPECIES + 0) #define SPECIES_OLD_UNOWN_QMARK (NUM_SPECIES + 1) static void Task_SmoothBlendLayers(u8 taskId); static const u8 sMonSpriteAnchorCoords[][5] = { [SPECIES_BULBASAUR - 1] = {0x16, 0x1b, 0x30, 0x16, 0x29}, [SPECIES_IVYSAUR - 1] = {0x14, 0x1b, 0x30, 0x15, 0x2a}, [SPECIES_VENUSAUR - 1] = {0x1b, 0x20, 0x20, 0x1b, 0x33}, [SPECIES_CHARMANDER - 1] = {0x14, 0x0f, 0x38, 0x13, 0x1e}, [SPECIES_CHARMELEON - 1] = {0x0d, 0x11, 0x30, 0x0f, 0x22}, [SPECIES_CHARIZARD - 1] = {0x1b, 0x07, 0x28, 0x1a, 0x19}, [SPECIES_SQUIRTLE - 1] = {0x19, 0x13, 0x30, 0x1a, 0x22}, [SPECIES_WARTORTLE - 1] = {0x16, 0x13, 0x30, 0x17, 0x21}, [SPECIES_BLASTOISE - 1] = {0x12, 0x08, 0x28, 0x15, 0x19}, [SPECIES_CATERPIE - 1] = {0x15, 0x14, 0x30, 0x13, 0x24}, [SPECIES_METAPOD - 1] = {0x13, 0x1d, 0x30, 0x18, 0x2a}, [SPECIES_BUTTERFREE - 1] = {0x12, 0x1b, 0x08, 0x12, 0x2a}, [SPECIES_WEEDLE - 1] = {0x16, 0x1c, 0x30, 0x15, 0x2b}, [SPECIES_KAKUNA - 1] = {0x19, 0x13, 0x30, 0x1a, 0x24}, [SPECIES_BEEDRILL - 1] = {0x19, 0x16, 0x08, 0x19, 0x25}, [SPECIES_PIDGEY - 1] = {0x15, 0x12, 0x30, 0x12, 0x1e}, [SPECIES_PIDGEOTTO - 1] = {0x24, 0x0e, 0x30, 0x1f, 0x1e}, [SPECIES_PIDGEOT - 1] = {0x0c, 0x13, 0x08, 0x0a, 0x23}, [SPECIES_RATTATA - 1] = {0x17, 0x1e, 0x30, 0x18, 0x2d}, [SPECIES_RATICATE - 1] = {0x12, 0x14, 0x30, 0x10, 0x26}, [SPECIES_SPEAROW - 1] = {0x15, 0x14, 0x30, 0x15, 0x1f}, [SPECIES_FEAROW - 1] = {0x0c, 0x27, 0x00, 0x0b, 0x3f}, [SPECIES_EKANS - 1] = {0x11, 0x0f, 0x30, 0x14, 0x1d}, [SPECIES_ARBOK - 1] = {0x1b, 0x01, 0x28, 0x1d, 0x10}, [SPECIES_PIKACHU - 1] = {0x19, 0x13, 0x30, 0x1a, 0x1f}, [SPECIES_RAICHU - 1] = {0x19, 0x14, 0x28, 0x1c, 0x22}, [SPECIES_SANDSHREW - 1] = {0x17, 0x16, 0x30, 0x18, 0x25}, [SPECIES_SANDSLASH - 1] = {0x11, 0x13, 0x28, 0x13, 0x22}, [SPECIES_NIDORAN_F - 1] = {0x16, 0x15, 0x30, 0x18, 0x21}, [SPECIES_NIDORINA - 1] = {0x1f, 0x17, 0x30, 0x1e, 0x28}, [SPECIES_NIDOQUEEN - 1] = {0x10, 0x0b, 0x28, 0x13, 0x1c}, [SPECIES_NIDORAN_M - 1] = {0x15, 0x22, 0x28, 0x15, 0x31}, [SPECIES_NIDORINO - 1] = {0x13, 0x1e, 0x28, 0x1b, 0x2d}, [SPECIES_NIDOKING - 1] = {0x12, 0x15, 0x28, 0x13, 0x27}, [SPECIES_CLEFAIRY - 1] = {0x19, 0x14, 0x30, 0x1b, 0x24}, [SPECIES_CLEFABLE - 1] = {0x1c, 0x12, 0x30, 0x1d, 0x21}, [SPECIES_VULPIX - 1] = {0x10, 0x16, 0x30, 0x0e, 0x25}, [SPECIES_NINETALES - 1] = {0x28, 0x10, 0x28, 0x27, 0x1e}, [SPECIES_JIGGLYPUFF - 1] = {0x1d, 0x15, 0x30, 0x1e, 0x25}, [SPECIES_WIGGLYTUFF - 1] = {0x1a, 0x12, 0x30, 0x1c, 0x22}, [SPECIES_ZUBAT - 1] = {0x14, 0x1d, 0x08, 0x14, 0x29}, [SPECIES_GOLBAT - 1] = {0x23, 0x1a, 0x00, 0x21, 0x2e}, [SPECIES_ODDISH - 1] = {0x1d, 0x20, 0x28, 0x1d, 0x2b}, [SPECIES_GLOOM - 1] = {0x1c, 0x18, 0x28, 0x1c, 0x27}, [SPECIES_VILEPLUME - 1] = {0x1c, 0x1e, 0x28, 0x1d, 0x2a}, [SPECIES_PARAS - 1] = {0x1d, 0x1a, 0x30, 0x1c, 0x27}, [SPECIES_PARASECT - 1] = {0x1e, 0x1c, 0x28, 0x20, 0x2e}, [SPECIES_VENONAT - 1] = {0x1b, 0x16, 0x10, 0x1a, 0x29}, [SPECIES_VENOMOTH - 1] = {0x12, 0x19, 0x08, 0x16, 0x27}, [SPECIES_DIGLETT - 1] = {0x1e, 0x16, 0x30, 0x1c, 0x23}, [SPECIES_DUGTRIO - 1] = {0x1a, 0x11, 0x30, 0x1a, 0x1f}, [SPECIES_MEOWTH - 1] = {0x1c, 0x16, 0x30, 0x1c, 0x23}, [SPECIES_PERSIAN - 1] = {0x13, 0x13, 0x30, 0x13, 0x21}, [SPECIES_PSYDUCK - 1] = {0x1c, 0x13, 0x30, 0x17, 0x29}, [SPECIES_GOLDUCK - 1] = {0x17, 0x12, 0x28, 0x17, 0x22}, [SPECIES_MANKEY - 1] = {0x1c, 0x15, 0x30, 0x1b, 0x23}, [SPECIES_PRIMEAPE - 1] = {0x1e, 0x16, 0x30, 0x1a, 0x27}, [SPECIES_GROWLITHE - 1] = {0x14, 0x17, 0x30, 0x14, 0x24}, [SPECIES_ARCANINE - 1] = {0x0f, 0x09, 0x28, 0x0c, 0x19}, [SPECIES_POLIWAG - 1] = {0x15, 0x14, 0x30, 0x13, 0x1f}, [SPECIES_POLIWHIRL - 1] = {0x1f, 0x10, 0x30, 0x1e, 0x17}, [SPECIES_POLIWRATH - 1] = {0x22, 0x0c, 0x30, 0x21, 0x18}, [SPECIES_ABRA - 1] = {0x1f, 0x13, 0x30, 0x1f, 0x21}, [SPECIES_KADABRA - 1] = {0x1b, 0x12, 0x30, 0x1c, 0x25}, [SPECIES_ALAKAZAM - 1] = {0x1c, 0x11, 0x28, 0x1d, 0x26}, [SPECIES_MACHOP - 1] = {0x1b, 0x11, 0x30, 0x1b, 0x1e}, [SPECIES_MACHOKE - 1] = {0x1d, 0x11, 0x30, 0x1d, 0x1f}, [SPECIES_MACHAMP - 1] = {0x1a, 0x0d, 0x28, 0x1c, 0x1b}, [SPECIES_BELLSPROUT - 1] = {0x15, 0x0e, 0x30, 0x0e, 0x1c}, [SPECIES_WEEPINBELL - 1] = {0x1a, 0x1c, 0x10, 0x15, 0x32}, [SPECIES_VICTREEBEL - 1] = {0x1e, 0x0f, 0x30, 0x1c, 0x1b}, [SPECIES_TENTACOOL - 1] = {0x1a, 0x15, 0x30, 0x1e, 0x26}, [SPECIES_TENTACRUEL - 1] = {0x1b, 0x10, 0x28, 0x1c, 0x26}, [SPECIES_GEODUDE - 1] = {0x1c, 0x20, 0x28, 0x1d, 0x2d}, [SPECIES_GRAVELER - 1] = {0x1d, 0x19, 0x28, 0x1e, 0x26}, [SPECIES_GOLEM - 1] = {0x19, 0x1b, 0x28, 0x1c, 0x27}, [SPECIES_PONYTA - 1] = {0x0f, 0x11, 0x30, 0x0e, 0x23}, [SPECIES_RAPIDASH - 1] = {0x2f, 0x0f, 0x28, 0x2b, 0x1e}, [SPECIES_SLOWPOKE - 1] = {0x14, 0x1f, 0x28, 0x15, 0x2f}, [SPECIES_SLOWBRO - 1] = {0x0e, 0x0d, 0x28, 0x0c, 0x1f}, [SPECIES_MAGNEMITE - 1] = {0x20, 0x1b, 0x10, 0x1f, 0x29}, [SPECIES_MAGNETON - 1] = {0x1f, 0x14, 0x08, 0x1f, 0x22}, [SPECIES_FARFETCHD - 1] = {0x16, 0x14, 0x30, 0x16, 0x29}, [SPECIES_DODUO - 1] = {0x11, 0x16, 0x30, 0x0d, 0x2c}, [SPECIES_DODRIO - 1] = {0x1d, 0x04, 0x28, 0x0e, 0x07}, [SPECIES_SEEL - 1] = {0x1b, 0x24, 0x20, 0x17, 0x35}, [SPECIES_DEWGONG - 1] = {0x12, 0x0a, 0x30, 0x0e, 0x1a}, [SPECIES_GRIMER - 1] = {0x1f, 0x10, 0x30, 0x1d, 0x25}, [SPECIES_MUK - 1] = {0x17, 0x0f, 0x30, 0x19, 0x22}, [SPECIES_SHELLDER - 1] = {0x1a, 0x18, 0x30, 0x17, 0x29}, [SPECIES_CLOYSTER - 1] = {0x19, 0x1e, 0x28, 0x1d, 0x2c}, [SPECIES_GASTLY - 1] = {0x1a, 0x1f, 0x08, 0x19, 0x30}, [SPECIES_HAUNTER - 1] = {0x20, 0x14, 0x08, 0x1d, 0x26}, [SPECIES_GENGAR - 1] = {0x1a, 0x16, 0x30, 0x19, 0x28}, [SPECIES_ONIX - 1] = {0x1f, 0x24, 0x20, 0x28, 0x36}, [SPECIES_DROWZEE - 1] = {0x1a, 0x0e, 0x30, 0x1a, 0x1e}, [SPECIES_HYPNO - 1] = {0x1c, 0x12, 0x30, 0x19, 0x24}, [SPECIES_KRABBY - 1] = {0x1d, 0x1d, 0x30, 0x1a, 0x2b}, [SPECIES_KINGLER - 1] = {0x1e, 0x1f, 0x28, 0x1c, 0x30}, [SPECIES_VOLTORB - 1] = {0x1c, 0x1b, 0x30, 0x1b, 0x2b}, [SPECIES_ELECTRODE - 1] = {0x1c, 0x18, 0x30, 0x1d, 0x2e}, [SPECIES_EXEGGCUTE - 1] = {0x21, 0x17, 0x30, 0x20, 0x24}, [SPECIES_EXEGGUTOR - 1] = {0x1c, 0x17, 0x28, 0x1b, 0x25}, [SPECIES_CUBONE - 1] = {0x1b, 0x12, 0x30, 0x1b, 0x22}, [SPECIES_MAROWAK - 1] = {0x14, 0x0f, 0x30, 0x11, 0x23}, [SPECIES_HITMONLEE - 1] = {0x2e, 0x11, 0x30, 0x28, 0x22}, [SPECIES_HITMONCHAN - 1] = {0x22, 0x0e, 0x30, 0x1e, 0x1d}, [SPECIES_LICKITUNG - 1] = {0x14, 0x11, 0x30, 0x14, 0x24}, [SPECIES_KOFFING - 1] = {0x1e, 0x14, 0x10, 0x1d, 0x20}, [SPECIES_WEEZING - 1] = {0x11, 0x0d, 0x10, 0x0f, 0x1c}, [SPECIES_RHYHORN - 1] = {0x0e, 0x23, 0x20, 0x14, 0x33}, [SPECIES_RHYDON - 1] = {0x0d, 0x12, 0x28, 0x17, 0x22}, [SPECIES_CHANSEY - 1] = {0x1a, 0x0d, 0x30, 0x1a, 0x1a}, [SPECIES_TANGELA - 1] = {0x1c, 0x18, 0x30, 0x1d, 0x29}, [SPECIES_KANGASKHAN - 1] = {0x1b, 0x06, 0x28, 0x1c, 0x14}, [SPECIES_HORSEA - 1] = {0x1c, 0x14, 0x30, 0x16, 0x23}, [SPECIES_SEADRA - 1] = {0x10, 0x17, 0x30, 0x09, 0x2a}, [SPECIES_GOLDEEN - 1] = {0x16, 0x23, 0x20, 0x15, 0x34}, [SPECIES_SEAKING - 1] = {0x16, 0x0f, 0x30, 0x10, 0x18}, [SPECIES_STARYU - 1] = {0x1c, 0x18, 0x30, 0x1a, 0x26}, [SPECIES_STARMIE - 1] = {0x1d, 0x13, 0x30, 0x1b, 0x20}, [SPECIES_MR_MIME - 1] = {0x24, 0x11, 0x30, 0x25, 0x1e}, [SPECIES_SCYTHER - 1] = {0x10, 0x19, 0x28, 0x12, 0x27}, [SPECIES_JYNX - 1] = {0x1b, 0x0f, 0x30, 0x19, 0x1c}, [SPECIES_ELECTABUZZ - 1] = {0x14, 0x11, 0x30, 0x17, 0x20}, [SPECIES_MAGMAR - 1] = {0x10, 0x0e, 0x30, 0x0b, 0x19}, [SPECIES_PINSIR - 1] = {0x1d, 0x1c, 0x28, 0x20, 0x2b}, [SPECIES_TAUROS - 1] = {0x11, 0x1d, 0x28, 0x13, 0x2e}, [SPECIES_MAGIKARP - 1] = {0x16, 0x15, 0x30, 0x13, 0x23}, [SPECIES_GYARADOS - 1] = {0x0b, 0x18, 0x28, 0x16, 0x29}, [SPECIES_LAPRAS - 1] = {0x16, 0x08, 0x28, 0x15, 0x16}, [SPECIES_DITTO - 1] = {0x24, 0x12, 0x30, 0x1f, 0x20}, [SPECIES_EEVEE - 1] = {0x16, 0x16, 0x30, 0x16, 0x23}, [SPECIES_VAPOREON - 1] = {0x18, 0x23, 0x28, 0x18, 0x30}, [SPECIES_JOLTEON - 1] = {0x14, 0x1b, 0x30, 0x16, 0x28}, [SPECIES_FLAREON - 1] = {0x16, 0x17, 0x30, 0x14, 0x25}, [SPECIES_PORYGON - 1] = {0x18, 0x12, 0x30, 0x10, 0x23}, [SPECIES_OMANYTE - 1] = {0x1d, 0x1d, 0x30, 0x1c, 0x2b}, [SPECIES_OMASTAR - 1] = {0x16, 0x1a, 0x30, 0x19, 0x2d}, [SPECIES_KABUTO - 1] = {0x1b, 0x16, 0x30, 0x1a, 0x27}, [SPECIES_KABUTOPS - 1] = {0x15, 0x11, 0x30, 0x15, 0x1f}, [SPECIES_AERODACTYL - 1] = {0x13, 0x1d, 0x00, 0x14, 0x30}, [SPECIES_SNORLAX - 1] = {0x35, 0x09, 0x30, 0x2e, 0x14}, [SPECIES_ARTICUNO - 1] = {0x18, 0x0b, 0x18, 0x17, 0x17}, [SPECIES_ZAPDOS - 1] = {0x0e, 0x0e, 0x10, 0x04, 0x28}, [SPECIES_MOLTRES - 1] = {0x0b, 0x2a, 0x08, 0x0b, 0x38}, [SPECIES_DRATINI - 1] = {0x0d, 0x12, 0x30, 0x0b, 0x21}, [SPECIES_DRAGONAIR - 1] = {0x18, 0x0e, 0x30, 0x13, 0x1c}, [SPECIES_DRAGONITE - 1] = {0x1b, 0x07, 0x18, 0x19, 0x17}, [SPECIES_MEWTWO - 1] = {0x2b, 0x09, 0x28, 0x2c, 0x18}, [SPECIES_MEW - 1] = {0x19, 0x14, 0x10, 0x1f, 0x21}, [SPECIES_CHIKORITA - 1] = {0x1b, 0x17, 0x30, 0x1b, 0x24}, [SPECIES_BAYLEEF - 1] = {0x1d, 0x10, 0x30, 0x20, 0x1d}, [SPECIES_MEGANIUM - 1] = {0x05, 0x0d, 0x28, 0x0d, 0x1b}, [SPECIES_CYNDAQUIL - 1] = {0x11, 0x1b, 0x30, 0x14, 0x27}, [SPECIES_QUILAVA - 1] = {0x25, 0x18, 0x30, 0x27, 0x26}, [SPECIES_TYPHLOSION - 1] = {0x09, 0x10, 0x28, 0x10, 0x1c}, [SPECIES_TOTODILE - 1] = {0x16, 0x10, 0x30, 0x19, 0x20}, [SPECIES_CROCONAW - 1] = {0x16, 0x10, 0x30, 0x18, 0x21}, [SPECIES_FERALIGATR - 1] = {0x0e, 0x0a, 0x28, 0x08, 0x1a}, [SPECIES_SENTRET - 1] = {0x1e, 0x0a, 0x30, 0x1d, 0x15}, [SPECIES_FURRET - 1] = {0x21, 0x0e, 0x30, 0x21, 0x19}, [SPECIES_HOOTHOOT - 1] = {0x1d, 0x15, 0x30, 0x1c, 0x24}, [SPECIES_NOCTOWL - 1] = {0x19, 0x0e, 0x30, 0x18, 0x1c}, [SPECIES_LEDYBA - 1] = {0x1b, 0x15, 0x30, 0x1c, 0x24}, [SPECIES_LEDIAN - 1] = {0x18, 0x12, 0x10, 0x1c, 0x21}, [SPECIES_SPINARAK - 1] = {0x20, 0x20, 0x28, 0x20, 0x2d}, [SPECIES_ARIADOS - 1] = {0x17, 0x23, 0x28, 0x15, 0x30}, [SPECIES_CROBAT - 1] = {0x22, 0x1e, 0x08, 0x23, 0x2b}, [SPECIES_CHINCHOU - 1] = {0x1f, 0x1d, 0x30, 0x1f, 0x29}, [SPECIES_LANTURN - 1] = {0x10, 0x23, 0x28, 0x19, 0x33}, [SPECIES_PICHU - 1] = {0x1e, 0x17, 0x30, 0x1e, 0x24}, [SPECIES_CLEFFA - 1] = {0x1c, 0x18, 0x30, 0x1e, 0x26}, [SPECIES_IGGLYBUFF - 1] = {0x1f, 0x19, 0x30, 0x1f, 0x24}, [SPECIES_TOGEPI - 1] = {0x21, 0x15, 0x30, 0x1f, 0x20}, [SPECIES_TOGETIC - 1] = {0x1b, 0x10, 0x30, 0x1c, 0x1c}, [SPECIES_NATU - 1] = {0x1c, 0x17, 0x30, 0x15, 0x21}, [SPECIES_XATU - 1] = {0x1b, 0x08, 0x30, 0x19, 0x14}, [SPECIES_MAREEP - 1] = {0x16, 0x15, 0x30, 0x15, 0x24}, [SPECIES_FLAAFFY - 1] = {0x19, 0x12, 0x30, 0x18, 0x21}, [SPECIES_AMPHAROS - 1] = {0x0f, 0x0a, 0x30, 0x10, 0x1b}, [SPECIES_BELLOSSOM - 1] = {0x1f, 0x13, 0x30, 0x1f, 0x20}, [SPECIES_MARILL - 1] = {0x1d, 0x15, 0x30, 0x1d, 0x22}, [SPECIES_AZUMARILL - 1] = {0x1a, 0x12, 0x30, 0x17, 0x1f}, [SPECIES_SUDOWOODO - 1] = {0x20, 0x10, 0x30, 0x20, 0x1f}, [SPECIES_POLITOED - 1] = {0x1d, 0x0f, 0x30, 0x1e, 0x20}, [SPECIES_HOPPIP - 1] = {0x23, 0x25, 0x08, 0x25, 0x33}, [SPECIES_SKIPLOOM - 1] = {0x1e, 0x18, 0x08, 0x1c, 0x27}, [SPECIES_JUMPLUFF - 1] = {0x1d, 0x21, 0x08, 0x20, 0x2f}, [SPECIES_AIPOM - 1] = {0x1e, 0x29, 0x18, 0x1e, 0x35}, [SPECIES_SUNKERN - 1] = {0x1f, 0x20, 0x08, 0x24, 0x2e}, [SPECIES_SUNFLORA - 1] = {0x1c, 0x0c, 0x30, 0x1b, 0x19}, [SPECIES_YANMA - 1] = {0x1b, 0x28, 0x08, 0x16, 0x35}, [SPECIES_WOOPER - 1] = {0x1d, 0x13, 0x30, 0x1f, 0x21}, [SPECIES_QUAGSIRE - 1] = {0x15, 0x09, 0x30, 0x12, 0x18}, [SPECIES_ESPEON - 1] = {0x11, 0x1b, 0x30, 0x11, 0x29}, [SPECIES_UMBREON - 1] = {0x23, 0x15, 0x30, 0x23, 0x22}, [SPECIES_MURKROW - 1] = {0x24, 0x13, 0x30, 0x20, 0x22}, [SPECIES_SLOWKING - 1] = {0x1e, 0x13, 0x28, 0x1d, 0x25}, [SPECIES_MISDREAVUS - 1] = {0x28, 0x21, 0x08, 0x26, 0x2e}, [SPECIES_UNOWN - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21}, [SPECIES_WOBBUFFET - 1] = {0x1d, 0x09, 0x30, 0x1d, 0x1a}, [SPECIES_GIRAFARIG - 1] = {0x0b, 0x0d, 0x28, 0x11, 0x1d}, [SPECIES_PINECO - 1] = {0x1d, 0x12, 0x10, 0x19, 0x25}, [SPECIES_FORRETRESS - 1] = {0x19, 0x17, 0x08, 0x1e, 0x26}, [SPECIES_DUNSPARCE - 1] = {0x10, 0x1b, 0x30, 0x0c, 0x2d}, [SPECIES_GLIGAR - 1] = {0x1e, 0x13, 0x08, 0x1d, 0x23}, [SPECIES_STEELIX - 1] = {0x0c, 0x0d, 0x28, 0x0d, 0x1c}, [SPECIES_SNUBBULL - 1] = {0x1b, 0x15, 0x30, 0x1a, 0x23}, [SPECIES_GRANBULL - 1] = {0x1c, 0x09, 0x30, 0x19, 0x18}, [SPECIES_QWILFISH - 1] = {0x1f, 0x26, 0x20, 0x1d, 0x33}, [SPECIES_SCIZOR - 1] = {0x15, 0x0f, 0x10, 0x1a, 0x1a}, [SPECIES_SHUCKLE - 1] = {0x25, 0x0a, 0x30, 0x24, 0x18}, [SPECIES_HERACROSS - 1] = {0x18, 0x19, 0x28, 0x1a, 0x26}, [SPECIES_SNEASEL - 1] = {0x1c, 0x13, 0x30, 0x1d, 0x24}, [SPECIES_TEDDIURSA - 1] = {0x1e, 0x12, 0x30, 0x1b, 0x23}, [SPECIES_URSARING - 1] = {0x1e, 0x04, 0x28, 0x1d, 0x14}, [SPECIES_SLUGMA - 1] = {0x20, 0x18, 0x30, 0x20, 0x28}, [SPECIES_MAGCARGO - 1] = {0x16, 0x11, 0x30, 0x17, 0x23}, [SPECIES_SWINUB - 1] = {0x1c, 0x18, 0x30, 0x1b, 0x25}, [SPECIES_PILOSWINE - 1] = {0x18, 0x23, 0x20, 0x18, 0x36}, [SPECIES_CORSOLA - 1] = {0x19, 0x1d, 0x28, 0x19, 0x2b}, [SPECIES_REMORAID - 1] = {0x15, 0x1f, 0x28, 0x13, 0x2b}, [SPECIES_OCTILLERY - 1] = {0x1c, 0x11, 0x30, 0x1a, 0x20}, [SPECIES_DELIBIRD - 1] = {0x1d, 0x11, 0x30, 0x1b, 0x1f}, [SPECIES_MANTINE - 1] = {0x16, 0x1e, 0x28, 0x1f, 0x27}, [SPECIES_SKARMORY - 1] = {0x1e, 0x00, 0x28, 0x13, 0x07}, [SPECIES_HOUNDOUR - 1] = {0x25, 0x11, 0x30, 0x25, 0x1f}, [SPECIES_HOUNDOOM - 1] = {0x0d, 0x13, 0x30, 0x0d, 0x24}, [SPECIES_KINGDRA - 1] = {0x0e, 0x13, 0x28, 0x0a, 0x2c}, [SPECIES_PHANPY - 1] = {0x1b, 0x11, 0x30, 0x19, 0x24}, [SPECIES_DONPHAN - 1] = {0x11, 0x15, 0x30, 0x19, 0x2c}, [SPECIES_PORYGON2 - 1] = {0x18, 0x11, 0x30, 0x11, 0x20}, [SPECIES_STANTLER - 1] = {0x15, 0x15, 0x28, 0x17, 0x28}, [SPECIES_SMEARGLE - 1] = {0x18, 0x10, 0x30, 0x1b, 0x25}, [SPECIES_TYROGUE - 1] = {0x1e, 0x12, 0x30, 0x1f, 0x1f}, [SPECIES_HITMONTOP - 1] = {0x1a, 0x39, 0x10, 0x1a, 0x2b}, [SPECIES_SMOOCHUM - 1] = {0x20, 0x18, 0x30, 0x21, 0x26}, [SPECIES_ELEKID - 1] = {0x1d, 0x14, 0x30, 0x1d, 0x23}, [SPECIES_MAGBY - 1] = {0x1c, 0x15, 0x30, 0x1a, 0x24}, [SPECIES_MILTANK - 1] = {0x18, 0x0e, 0x30, 0x18, 0x1e}, [SPECIES_BLISSEY - 1] = {0x1d, 0x09, 0x30, 0x1d, 0x19}, [SPECIES_RAIKOU - 1] = {0x29, 0x0c, 0x28, 0x27, 0x1e}, [SPECIES_ENTEI - 1] = {0x08, 0x09, 0x28, 0x0b, 0x18}, [SPECIES_SUICUNE - 1] = {0x23, 0x1d, 0x28, 0x26, 0x2c}, [SPECIES_LARVITAR - 1] = {0x1c, 0x18, 0x30, 0x1a, 0x24}, [SPECIES_PUPITAR - 1] = {0x1b, 0x19, 0x30, 0x1b, 0x28}, [SPECIES_TYRANITAR - 1] = {0x06, 0x0b, 0x28, 0x0d, 0x19}, [SPECIES_LUGIA - 1] = {0x08, 0x2a, 0x08, 0x14, 0x34}, [SPECIES_HO_OH - 1] = {0x0d, 0x25, 0x08, 0x0e, 0x34}, [SPECIES_CELEBI - 1] = {0x15, 0x21, 0x08, 0x1a, 0x2b}, [SPECIES_OLD_UNOWN_B - 1] = {0x1f, 0x12, 0x08, 0x1e, 0x1c}, [SPECIES_OLD_UNOWN_C - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21}, [SPECIES_OLD_UNOWN_D - 1] = {0x1c, 0x19, 0x08, 0x1b, 0x23}, [SPECIES_OLD_UNOWN_E - 1] = {0x21, 0x19, 0x08, 0x20, 0x23}, [SPECIES_OLD_UNOWN_F - 1] = {0x1b, 0x13, 0x08, 0x1a, 0x1d}, [SPECIES_OLD_UNOWN_G - 1] = {0x20, 0x16, 0x08, 0x1f, 0x21}, [SPECIES_OLD_UNOWN_H - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23}, [SPECIES_OLD_UNOWN_I - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23}, [SPECIES_OLD_UNOWN_J - 1] = {0x20, 0x16, 0x08, 0x1f, 0x20}, [SPECIES_OLD_UNOWN_K - 1] = {0x1d, 0x1a, 0x08, 0x1c, 0x24}, [SPECIES_OLD_UNOWN_L - 1] = {0x20, 0x16, 0x08, 0x1f, 0x1f}, [SPECIES_OLD_UNOWN_M - 1] = {0x20, 0x1c, 0x08, 0x1f, 0x26}, [SPECIES_OLD_UNOWN_N - 1] = {0x20, 0x1a, 0x08, 0x1f, 0x23}, [SPECIES_OLD_UNOWN_O - 1] = {0x20, 0x1a, 0x08, 0x1f, 0x23}, [SPECIES_OLD_UNOWN_P - 1] = {0x20, 0x16, 0x08, 0x1f, 0x20}, [SPECIES_OLD_UNOWN_Q - 1] = {0x1d, 0x16, 0x08, 0x1c, 0x20}, [SPECIES_OLD_UNOWN_R - 1] = {0x20, 0x15, 0x08, 0x1f, 0x1f}, [SPECIES_OLD_UNOWN_S - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23}, [SPECIES_OLD_UNOWN_T - 1] = {0x20, 0x1e, 0x08, 0x1f, 0x28}, [SPECIES_OLD_UNOWN_U - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21}, [SPECIES_OLD_UNOWN_V - 1] = {0x1e, 0x1e, 0x08, 0x1d, 0x28}, [SPECIES_OLD_UNOWN_W - 1] = {0x20, 0x1d, 0x08, 0x1f, 0x27}, [SPECIES_OLD_UNOWN_X - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23}, [SPECIES_OLD_UNOWN_Y - 1] = {0x20, 0x15, 0x08, 0x1f, 0x1f}, [SPECIES_OLD_UNOWN_Z - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23}, [SPECIES_TREECKO - 1] = {0x1a, 0x0f, 0x30, 0x19, 0x20}, [SPECIES_GROVYLE - 1] = {0x0d, 0x05, 0x10, 0x05, 0x13}, [SPECIES_SCEPTILE - 1] = {0x10, 0x04, 0x28, 0x0c, 0x12}, [SPECIES_TORCHIC - 1] = {0x17, 0x18, 0x30, 0x15, 0x25}, [SPECIES_COMBUSKEN - 1] = {0x20, 0x12, 0x28, 0x1e, 0x20}, [SPECIES_BLAZIKEN - 1] = {0x1a, 0x07, 0x28, 0x1d, 0x13}, [SPECIES_MUDKIP - 1] = {0x1b, 0x1d, 0x28, 0x19, 0x2c}, [SPECIES_MARSHTOMP - 1] = {0x1d, 0x11, 0x30, 0x1c, 0x20}, [SPECIES_SWAMPERT - 1] = {0x1b, 0x11, 0x28, 0x1b, 0x23}, [SPECIES_POOCHYENA - 1] = {0x14, 0x12, 0x30, 0x0f, 0x20}, [SPECIES_MIGHTYENA - 1] = {0x09, 0x0d, 0x28, 0x09, 0x1c}, [SPECIES_ZIGZAGOON - 1] = {0x0b, 0x1a, 0x30, 0x09, 0x2b}, [SPECIES_LINOONE - 1] = {0x0d, 0x28, 0x18, 0x0b, 0x37}, [SPECIES_WURMPLE - 1] = {0x21, 0x17, 0x30, 0x1f, 0x26}, [SPECIES_SILCOON - 1] = {0x13, 0x1c, 0x30, 0x11, 0x2a}, [SPECIES_BEAUTIFLY - 1] = {0x0f, 0x1b, 0x08, 0x0e, 0x28}, [SPECIES_CASCOON - 1] = {0x14, 0x1d, 0x30, 0x11, 0x2c}, [SPECIES_DUSTOX - 1] = {0x14, 0x19, 0x08, 0x16, 0x26}, [SPECIES_LOTAD - 1] = {0x19, 0x25, 0x28, 0x17, 0x32}, [SPECIES_LOMBRE - 1] = {0x22, 0x10, 0x30, 0x29, 0x1d}, [SPECIES_LUDICOLO - 1] = {0x1c, 0x0f, 0x28, 0x1b, 0x24}, [SPECIES_SEEDOT - 1] = {0x1b, 0x17, 0x30, 0x18, 0x28}, [SPECIES_NUZLEAF - 1] = {0x20, 0x0d, 0x30, 0x1a, 0x1d}, [SPECIES_SHIFTRY - 1] = {0x32, 0x11, 0x28, 0x2e, 0x23}, [SPECIES_NINCADA - 1] = {0x18, 0x1a, 0x30, 0x17, 0x28}, [SPECIES_NINJASK - 1] = {0x17, 0x21, 0x00, 0x17, 0x2f}, [SPECIES_SHEDINJA - 1] = {0x16, 0x19, 0x08, 0x18, 0x2a}, [SPECIES_TAILLOW - 1] = {0x17, 0x10, 0x30, 0x14, 0x1e}, [SPECIES_SWELLOW - 1] = {0x0c, 0x0a, 0x28, 0x05, 0x16}, [SPECIES_SHROOMISH - 1] = {0x1f, 0x16, 0x30, 0x1d, 0x23}, [SPECIES_BRELOOM - 1] = {0x25, 0x0c, 0x30, 0x23, 0x19}, [SPECIES_SPINDA - 1] = {0x21, 0x16, 0x30, 0x1f, 0x27}, [SPECIES_WINGULL - 1] = {0x1a, 0x16, 0x10, 0x15, 0x26}, [SPECIES_PELIPPER - 1] = {0x1d, 0x0a, 0x10, 0x09, 0x1b}, [SPECIES_SURSKIT - 1] = {0x1d, 0x16, 0x30, 0x1c, 0x25}, [SPECIES_MASQUERAIN - 1] = {0x1a, 0x21, 0x08, 0x14, 0x30}, [SPECIES_WAILMER - 1] = {0x17, 0x17, 0x30, 0x16, 0x28}, [SPECIES_WAILORD - 1] = {0x17, 0x03, 0x30, 0x09, 0x13}, [SPECIES_SKITTY - 1] = {0x24, 0x1a, 0x30, 0x22, 0x2a}, [SPECIES_DELCATTY - 1] = {0x1e, 0x12, 0x30, 0x1c, 0x21}, [SPECIES_KECLEON - 1] = {0x19, 0x10, 0x30, 0x13, 0x1e}, [SPECIES_BALTOY - 1] = {0x1d, 0x15, 0x30, 0x1b, 0x22}, [SPECIES_CLAYDOL - 1] = {0x1e, 0x0d, 0x28, 0x1d, 0x24}, [SPECIES_NOSEPASS - 1] = {0x1f, 0x10, 0x30, 0x15, 0x23}, [SPECIES_TORKOAL - 1] = {0x0e, 0x19, 0x28, 0x0a, 0x27}, [SPECIES_SABLEYE - 1] = {0x1e, 0x16, 0x30, 0x1d, 0x27}, [SPECIES_BARBOACH - 1] = {0x17, 0x12, 0x30, 0x15, 0x1e}, [SPECIES_WHISCASH - 1] = {0x18, 0x20, 0x28, 0x17, 0x31}, [SPECIES_LUVDISC - 1] = {0x19, 0x0f, 0x30, 0x13, 0x1c}, [SPECIES_CORPHISH - 1] = {0x1f, 0x14, 0x30, 0x1d, 0x23}, [SPECIES_CRAWDAUNT - 1] = {0x14, 0x0c, 0x28, 0x18, 0x23}, [SPECIES_FEEBAS - 1] = {0x18, 0x1e, 0x28, 0x16, 0x2f}, [SPECIES_MILOTIC - 1] = {0x20, 0x0c, 0x28, 0x1f, 0x1d}, [SPECIES_CARVANHA - 1] = {0x16, 0x19, 0x30, 0x13, 0x22}, [SPECIES_SHARPEDO - 1] = {0x19, 0x0c, 0x28, 0x17, 0x27}, [SPECIES_TRAPINCH - 1] = {0x29, 0x13, 0x30, 0x17, 0x18}, [SPECIES_VIBRAVA - 1] = {0x10, 0x27, 0x20, 0x0e, 0x34}, [SPECIES_FLYGON - 1] = {0x22, 0x07, 0x10, 0x21, 0x13}, [SPECIES_MAKUHITA - 1] = {0x22, 0x13, 0x30, 0x1c, 0x23}, [SPECIES_HARIYAMA - 1] = {0x24, 0x0f, 0x28, 0x26, 0x1c}, [SPECIES_ELECTRIKE - 1] = {0x11, 0x18, 0x30, 0x14, 0x27}, [SPECIES_MANECTRIC - 1] = {0x2f, 0x18, 0x28, 0x2e, 0x29}, [SPECIES_NUMEL - 1] = {0x10, 0x1a, 0x30, 0x0d, 0x2a}, [SPECIES_CAMERUPT - 1] = {0x0d, 0x22, 0x28, 0x0e, 0x36}, [SPECIES_SPHEAL - 1] = {0x1e, 0x0f, 0x30, 0x18, 0x1f}, [SPECIES_SEALEO - 1] = {0x1c, 0x09, 0x30, 0x1a, 0x18}, [SPECIES_WALREIN - 1] = {0x19, 0x01, 0x28, 0x10, 0x16}, [SPECIES_CACNEA - 1] = {0x1f, 0x17, 0x30, 0x1d, 0x29}, [SPECIES_CACTURNE - 1] = {0x1d, 0x0e, 0x28, 0x1d, 0x1b}, [SPECIES_SNORUNT - 1] = {0x1e, 0x16, 0x30, 0x1e, 0x26}, [SPECIES_GLALIE - 1] = {0x1a, 0x1c, 0x08, 0x1a, 0x31}, [SPECIES_LUNATONE - 1] = {0x1c, 0x16, 0x08, 0x19, 0x2c}, [SPECIES_SOLROCK - 1] = {0x18, 0x18, 0x10, 0x17, 0x31}, [SPECIES_AZURILL - 1] = {0x1b, 0x10, 0x30, 0x18, 0x1f}, [SPECIES_SPOINK - 1] = {0x21, 0x14, 0x30, 0x1b, 0x28}, [SPECIES_GRUMPIG - 1] = {0x14, 0x10, 0x30, 0x15, 0x20}, [SPECIES_PLUSLE - 1] = {0x1c, 0x16, 0x08, 0x1d, 0x25}, [SPECIES_MINUN - 1] = {0x21, 0x16, 0x08, 0x1f, 0x26}, [SPECIES_MAWILE - 1] = {0x2d, 0x14, 0x30, 0x2f, 0x24}, [SPECIES_MEDITITE - 1] = {0x1f, 0x17, 0x30, 0x1e, 0x25}, [SPECIES_MEDICHAM - 1] = {0x21, 0x0f, 0x28, 0x1e, 0x1d}, [SPECIES_SWABLU - 1] = {0x1b, 0x16, 0x10, 0x17, 0x23}, [SPECIES_ALTARIA - 1] = {0x1d, 0x0b, 0x10, 0x1a, 0x1a}, [SPECIES_WYNAUT - 1] = {0x1a, 0x15, 0x30, 0x1b, 0x26}, [SPECIES_DUSKULL - 1] = {0x10, 0x18, 0x08, 0x14, 0x2e}, [SPECIES_DUSCLOPS - 1] = {0x1c, 0x0f, 0x30, 0x1a, 0x28}, [SPECIES_ROSELIA - 1] = {0x1e, 0x11, 0x30, 0x1d, 0x20}, [SPECIES_SLAKOTH - 1] = {0x19, 0x1e, 0x30, 0x18, 0x2f}, [SPECIES_VIGOROTH - 1] = {0x10, 0x12, 0x28, 0x14, 0x24}, [SPECIES_SLAKING - 1] = {0x37, 0x0f, 0x30, 0x29, 0x21}, [SPECIES_GULPIN - 1] = {0x1b, 0x18, 0x30, 0x17, 0x26}, [SPECIES_SWALOT - 1] = {0x1f, 0x06, 0x30, 0x15, 0x13}, [SPECIES_TROPIUS - 1] = {0x18, 0x0a, 0x28, 0x20, 0x18}, [SPECIES_WHISMUR - 1] = {0x1f, 0x19, 0x30, 0x1d, 0x29}, [SPECIES_LOUDRED - 1] = {0x1c, 0x12, 0x28, 0x22, 0x27}, [SPECIES_EXPLOUD - 1] = {0x10, 0x10, 0x28, 0x1a, 0x2a}, [SPECIES_CLAMPERL - 1] = {0x20, 0x1a, 0x30, 0x1e, 0x26}, [SPECIES_HUNTAIL - 1] = {0x13, 0x1e, 0x28, 0x15, 0x33}, [SPECIES_GOREBYSS - 1] = {0x0d, 0x1f, 0x28, 0x03, 0x32}, [SPECIES_ABSOL - 1] = {0x2a, 0x11, 0x28, 0x2a, 0x22}, [SPECIES_SHUPPET - 1] = {0x16, 0x19, 0x08, 0x17, 0x27}, [SPECIES_BANETTE - 1] = {0x1c, 0x14, 0x08, 0x1b, 0x23}, [SPECIES_SEVIPER - 1] = {0x0e, 0x0d, 0x30, 0x0b, 0x1e}, [SPECIES_ZANGOOSE - 1] = {0x18, 0x0c, 0x28, 0x15, 0x1a}, [SPECIES_RELICANTH - 1] = {0x0c, 0x1f, 0x30, 0x09, 0x2d}, [SPECIES_ARON - 1] = {0x18, 0x1c, 0x30, 0x1a, 0x2c}, [SPECIES_LAIRON - 1] = {0x0b, 0x21, 0x30, 0x12, 0x2f}, [SPECIES_AGGRON - 1] = {0x10, 0x0b, 0x28, 0x16, 0x1b}, [SPECIES_CASTFORM - 1] = {0x1d, 0x18, 0x08, 0x1b, 0x26}, [SPECIES_VOLBEAT - 1] = {0x25, 0x15, 0x08, 0x21, 0x25}, [SPECIES_ILLUMISE - 1] = {0x20, 0x12, 0x08, 0x1f, 0x20}, [SPECIES_LILEEP - 1] = {0x1e, 0x11, 0x30, 0x1f, 0x1e}, [SPECIES_CRADILY - 1] = {0x12, 0x16, 0x28, 0x15, 0x28}, [SPECIES_ANORITH - 1] = {0x1c, 0x1e, 0x30, 0x1b, 0x2b}, [SPECIES_ARMALDO - 1] = {0x15, 0x05, 0x28, 0x14, 0x13}, [SPECIES_RALTS - 1] = {0x1f, 0x17, 0x30, 0x20, 0x23}, [SPECIES_KIRLIA - 1] = {0x1c, 0x12, 0x30, 0x1f, 0x1e}, [SPECIES_GARDEVOIR - 1] = {0x35, 0x07, 0x28, 0x32, 0x14}, [SPECIES_BAGON - 1] = {0x17, 0x13, 0x30, 0x16, 0x26}, [SPECIES_SHELGON - 1] = {0x19, 0x1b, 0x30, 0x19, 0x2c}, [SPECIES_SALAMENCE - 1] = {0x09, 0x11, 0x30, 0x0a, 0x21}, [SPECIES_BELDUM - 1] = {0x16, 0x19, 0x08, 0x18, 0x23}, [SPECIES_METANG - 1] = {0x22, 0x0f, 0x10, 0x1f, 0x21}, [SPECIES_METAGROSS - 1] = {0x24, 0x1b, 0x28, 0x22, 0x2b}, [SPECIES_REGIROCK - 1] = {0x16, 0x07, 0x28, 0x14, 0x12}, [SPECIES_REGICE - 1] = {0x19, 0x0c, 0x28, 0x17, 0x19}, [SPECIES_REGISTEEL - 1] = {0x19, 0x0d, 0x28, 0x19, 0x19}, [SPECIES_KYOGRE - 1] = {0x0e, 0x19, 0x28, 0x0b, 0x26}, [SPECIES_GROUDON - 1] = {0x04, 0x0b, 0x28, 0x0a, 0x19}, [SPECIES_RAYQUAZA - 1] = {0x0c, 0x0e, 0x10, 0x0e, 0x1f}, [SPECIES_LATIAS - 1] = {0x1e, 0x0c, 0x10, 0x23, 0x19}, [SPECIES_LATIOS - 1] = {0x05, 0x0e, 0x10, 0x05, 0x1d}, [SPECIES_JIRACHI - 1] = {0x1c, 0x15, 0x08, 0x1e, 0x22}, [SPECIES_DEOXYS - 1] = {0x1b, 0x08, 0x28, 0x1c, 0x16}, [SPECIES_CHIMECHO - 1] = {0x1d, 0x0c, 0x08, 0x1c, 0x1a}, [SPECIES_OLD_UNOWN_EMARK - 1] = {0x20, 0x21, 0x08, 0x20, 0x2b}, [SPECIES_OLD_UNOWN_QMARK - 1] = {0x20, 0x23, 0x08, 0x20, 0x2d} }; void AddTextPrinterParameterized3(u8 windowId, u8 fontId, u8 x, u8 y, const u8 * color, s8 speed, const u8 * str) { struct TextPrinterTemplate printer; printer.currentChar = str; printer.windowId = windowId; printer.fontId = fontId; printer.x = x; printer.y = y; printer.currentX = printer.x; printer.currentY = printer.y; printer.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING); printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); printer.unk = 0; printer.fgColor = color[1]; printer.bgColor = color[0]; printer.shadowColor = color[2]; AddTextPrinter(&printer, speed, NULL); } void AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const u8 *color, s8 speed, const u8 *str) { struct TextPrinterTemplate printer; printer.currentChar = str; printer.windowId = windowId; printer.fontId = fontId; printer.x = x; printer.y = y; printer.currentX = printer.x; printer.currentY = printer.y; printer.letterSpacing = letterSpacing; printer.lineSpacing = lineSpacing; printer.unk = 0; printer.fgColor = color[1]; printer.bgColor = color[0]; printer.shadowColor = color[2]; AddTextPrinter(&printer, speed, NULL); } void AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing) { struct TextPrinterTemplate printer; printer.currentChar = str; printer.windowId = windowId; printer.fontId = fontId; printer.x = x; printer.y = y; printer.currentX = x; printer.currentY = y; printer.letterSpacing = letterSpacing; printer.lineSpacing = lineSpacing; printer.unk = 0; printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND); printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND); printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW); AddTextPrinter(&printer, speed, callback); } void Menu_PrintFormatIntlPlayerName(u8 windowId, const u8 * src, u16 x, u16 y) { s32 i; for (i = 0; gSaveBlock2Ptr->playerName[i] != EOS; i++) ; StringExpandPlaceholders(gStringVar4, src); if (i != 5) { AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, x, y, 0xFF, NULL); } else { AddTextPrinterParameterized5(windowId, FONT_NORMAL, gStringVar4, x, y, 0xFF, NULL, 0, 0); } } static void UnusedBlitBitmapRect(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height) { s32 loopSrcY, loopDstY, loopSrcX, loopDstX, xEnd, yEnd, multiplierSrcY, multiplierDstY; u16 toOrr; u8 *pixelsSrc; u8 *pixelsDst; if (dst->width - dstX < width) xEnd = dst->width - dstX + srcX; else xEnd = width + srcX; if (dst->height - dstY < height) yEnd = srcY + dst->height - dstY; else yEnd = srcY + height; multiplierSrcY = (src->width + (src->width & 7)) >> 3; multiplierDstY = (dst->width + (dst->width & 7)) >> 3; for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++) { for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) { pixelsSrc = (u8 *)(src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B)); pixelsDst = (u8 *)(dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + ((( loopDstY >> 3) * multiplierDstY) << 5) + ((u32)( loopDstY << 0x1d) >> 0x1B)); if ((u32)pixelsDst & 0x1) { pixelsDst--; if (loopDstX & 0x1) { toOrr = *(vu16 *)pixelsDst & 0x0fff; if (loopSrcX & 0x1) toOrr |= ((*pixelsSrc & 0xf0) << 8); else toOrr |= ((*pixelsSrc & 0x0f) << 12); } else { toOrr = *(vu16 *)pixelsDst & 0xf0ff; if (loopSrcX & 0x1) toOrr |= ((*pixelsSrc & 0xf0) << 4); else toOrr |= ((*pixelsSrc & 0x0f) << 8); } } else { if (loopDstX & 1) { toOrr = *(vu16 *)pixelsDst & 0xff0f; if (loopSrcX & 1) toOrr |= ((*pixelsSrc & 0xf0) << 0); else toOrr |= ((*pixelsSrc & 0x0f) << 4); } else { toOrr = *(vu16 *)pixelsDst & 0xfff0; if (loopSrcX & 1) toOrr |= ((*pixelsSrc & 0xf0) >> 4); else toOrr |= ((*pixelsSrc & 0x0f) >> 0); } } *(vu16 *)pixelsDst = toOrr; } } } #define tEvA data[0] #define tEvB data[1] #define tEvAEnd data[2] #define tEvBEnd data[3] #define tEvADelta data[4] #define tEvBDelta data[5] #define tEvWhich data[6] #define tEvStepCount data[8] void StartBlendTask(u8 eva_start, u8 evb_start, u8 eva_end, u8 evb_end, u8 ev_step, u8 priority) { u8 taskId = CreateTask(Task_SmoothBlendLayers, priority); gTasks[taskId].tEvA = eva_start << 8; gTasks[taskId].tEvB = evb_start << 8; gTasks[taskId].tEvAEnd = eva_end; gTasks[taskId].tEvBEnd = evb_end; gTasks[taskId].tEvADelta = (eva_end - eva_start) * 256 / ev_step; gTasks[taskId].tEvBDelta = (evb_end - evb_start) * 256 / ev_step; gTasks[taskId].tEvStepCount = ev_step; SetGpuReg(REG_OFFSET_BLDALPHA, (evb_start << 8) | eva_start); } bool8 IsBlendTaskActive(void) { return FuncIsActiveTask(Task_SmoothBlendLayers); } static void Task_SmoothBlendLayers(u8 taskId) { s16 * data = gTasks[taskId].data; if (tEvStepCount != 0) { if (tEvWhich == 0) { tEvA += tEvADelta; tEvWhich = 1; } else { if (--tEvStepCount != 0) { tEvB += tEvBDelta; } else { tEvA = tEvAEnd << 8; tEvB = tEvBEnd << 8; } tEvWhich = 0; } SetGpuReg(REG_OFFSET_BLDALPHA, (tEvB & ~0xFF) | ((u16)tEvA >> 8)); if (tEvStepCount == 0) DestroyTask(taskId); } } u8 Menu2_GetMonSpriteAnchorCoord(u16 species, u32 personality, u8 a2) { if (species == SPECIES_UNOWN) { u8 unownLetter = GetUnownLetterByPersonalityLoByte(personality); switch (unownLetter) { case 0: break; case 26: species = SPECIES_OLD_UNOWN_EMARK; break; case 27: species = SPECIES_OLD_UNOWN_QMARK; break; default: species = SPECIES_OLD_UNOWN_B + unownLetter - 1; break; } } if (species != SPECIES_NONE && a2 < 5) { species--; if (sMonSpriteAnchorCoords[species][a2] != 0xFF) return sMonSpriteAnchorCoords[species][a2]; } return 32; } s8 Menu2_GetMonSpriteAnchorCoordMinusx20(u16 species, u32 personality, u8 a2) { return Menu2_GetMonSpriteAnchorCoord(species, personality, a2) - 32; } ================================================ FILE: src/menu_helpers.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "menu.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "link.h" #include "overworld.h" #include "mail_data.h" #include "field_specials.h" #include "constants/songs.h" #include "constants/items.h" #include "constants/maps.h" static EWRAM_DATA const struct YesNoFuncTable *sYesNo = NULL; static EWRAM_DATA TaskFunc sMessageNextTask = NULL; static EWRAM_DATA u8 sMessageWindowId = {0}; static void Task_ContinueTaskAfterMessagePrints(u8 taskId); void DisplayMessageAndContinueTask(u8 taskId, u8 windowId, u16 tileNum, u8 paletteNum, u8 fontId, u8 textSpeed, const u8 *string, void *taskFunc) { sMessageWindowId = windowId; DrawDialogFrameWithCustomTileAndPalette(windowId, TRUE, tileNum, paletteNum); if (string != gStringVar4) StringExpandPlaceholders(gStringVar4, string); gTextFlags.canABSpeedUpPrint = 1; AddTextPrinterParameterized2(windowId, fontId, gStringVar4, textSpeed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); sMessageNextTask = taskFunc; gTasks[taskId].func = Task_ContinueTaskAfterMessagePrints; } bool16 RunTextPrinters_CheckActive(u8 textPrinterId) { RunTextPrinters(); return IsTextPrinterActive(textPrinterId); } static void Task_ContinueTaskAfterMessagePrints(u8 taskId) { if (!RunTextPrinters_CheckActive(sMessageWindowId)) sMessageNextTask(taskId); } static void Task_CallYesOrNoCallback(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: PlaySE(SE_SELECT); gTasks[taskId].func = sYesNo->yesFunc; break; case 1: case MENU_B_PRESSED: PlaySE(SE_SELECT); gTasks[taskId].func = sYesNo->noFunc; break; } } void CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *template, u8 fontId, u8 left, u8 top, u16 tileStart, u8 palette, const struct YesNoFuncTable *yesNo) { CreateYesNoMenu(template, fontId, left, top, tileStart, palette, 0); sYesNo = yesNo; gTasks[taskId].func = Task_CallYesOrNoCallback; } u8 GetLRKeysPressed(void) { if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_NEW(L_BUTTON)) return MENU_L_PRESSED; if (JOY_NEW(R_BUTTON)) return MENU_R_PRESSED; } return 0; } u8 GetLRKeysPressedAndHeld(void) { if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_REPT(L_BUTTON)) return MENU_L_PRESSED; if (JOY_REPT(R_BUTTON)) return MENU_R_PRESSED; } return 0; } bool8 IsHoldingItemAllowed(u16 itemId) { // Enigma Berry can't be held in link areas if (itemId == ITEM_ENIGMA_BERRY && ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRADE_CENTER) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRADE_CENTER)) || InUnionRoom() == TRUE)) return FALSE; else return TRUE; } bool8 IsWritingMailAllowed(u16 itemId) { if ((IsUpdateLinkStateCBActive() == TRUE || InUnionRoom() == TRUE) && ItemIsMail(itemId) == TRUE) return FALSE; else return TRUE; } bool8 MenuHelpers_IsLinkActive(void) { if (IsUpdateLinkStateCBActive() == TRUE || gReceivedRemoteLinkPlayers == 1) return TRUE; else return FALSE; } bool8 IsActiveOverworldLinkBusy(void) { if (!MenuHelpers_IsLinkActive()) return FALSE; else return (u8)Overworld_LinkRecvQueueLengthMoreThan2(); } bool8 MenuHelpers_ShouldWaitForLinkRecv(void) { if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE) return TRUE; else return FALSE; } void SetVBlankHBlankCallbacksToNull(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); } void ResetVramOamAndBgCntRegs(void) { ResetAllBgsCoordinatesAndBgCntRegs(); CpuFill16(0, (void *) VRAM, VRAM_SIZE); CpuFill32(0, (void *) OAM, OAM_SIZE); CpuFill16(0, (void *) PLTT, PLTT_SIZE); } void ResetAllBgsCoordinatesAndBgCntRegs(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG3CNT, 0); SetGpuReg(REG_OFFSET_BG2CNT, 0); SetGpuReg(REG_OFFSET_BG1CNT, 0); SetGpuReg(REG_OFFSET_BG0CNT, 0); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); } bool8 AdjustQuantityAccordingToDPadInput(s16 *quantity_p, u16 qmax) { s16 valBefore = (*quantity_p); if (JOY_REPT(DPAD_ANY) == DPAD_UP) { (*quantity_p)++; if ((*quantity_p) > qmax) (*quantity_p) = 1; if ((*quantity_p) == valBefore) { return FALSE; } else { PlaySE(SE_SELECT); return TRUE; } } else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN) { (*quantity_p)--; if ((*quantity_p) <= 0) (*quantity_p) = qmax; if ((*quantity_p) == valBefore) { return FALSE; } else { PlaySE(SE_SELECT); return TRUE; } } else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT) { (*quantity_p) += 10; if ((*quantity_p) > qmax) (*quantity_p) = qmax; if ((*quantity_p) == valBefore) { return FALSE; } else { PlaySE(SE_SELECT); return TRUE; } } else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT) { (*quantity_p) -= 10; if ((*quantity_p) <= 0) (*quantity_p) = 1; if ((*quantity_p) == valBefore) { return FALSE; } else { PlaySE(SE_SELECT); return TRUE; } } return FALSE; } u8 GetDialogBoxFontId(void) { if (ContextNpcGetTextColor() == NPC_TEXT_COLOR_MALE) return FONT_MALE; else return FONT_FEMALE; } ================================================ FILE: src/menu_indicators.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "decompress.h" #include "trig.h" #include "list_menu.h" #include "menu_indicators.h" struct ScrollIndicatorPair { u8 field_0; u16 *scrollOffset; u16 fullyUpThreshold; u16 fullyDownThreshold; u8 topSpriteId; u8 bottomSpriteId; u16 tileTag; u16 palTag; }; struct RedOutlineCursor { struct SubspriteTable subspriteTable; struct Subsprite *subspritesPtr; u8 spriteId; u16 tileTag; u16 palTag; }; struct RedArrowCursor { u8 spriteId; u16 tileTag; u16 palTag; }; struct ScrollIndicatorTemplate { u8 animNum:4; u8 bounceDir:4; u8 multiplier; s16 frequency; }; static EWRAM_DATA struct ScrollArrowsTemplate sTempScrollArrowTemplate = {0}; static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite); static void SpriteCallback_RedArrowCursor(struct Sprite *sprite); static void Task_ScrollIndicatorArrowPair(u8 taskId); static u8 ListMenuAddRedArrowCursorObject(const struct CursorStruct *cursor); static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y); static void ListMenuRemoveRedArrowCursorObject(u8 taskId); static const struct ScrollIndicatorTemplate sScrollIndicatorTemplates[] = { { .animNum = 0, .bounceDir = 0, .multiplier = 2, .frequency = 8, }, { .animNum = 1, .bounceDir = 0, .multiplier = 2, .frequency = -8, }, { .animNum = 2, .bounceDir = 1, .multiplier = 2, .frequency = 8, }, { .animNum = 3, .bounceDir = 1, .multiplier = 2, .frequency = -8, }, }; static const struct OamData sOamData_ScrollArrowIndicator = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 0, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sSpriteAnim_ScrollArrowIndicator0[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END, }; static const union AnimCmd sSpriteAnim_ScrollArrowIndicator1[] = { ANIMCMD_FRAME(0, 30, 1, 0), ANIMCMD_END, }; static const union AnimCmd sSpriteAnim_ScrollArrowIndicator2[] = { ANIMCMD_FRAME(4, 30), ANIMCMD_END, }; static const union AnimCmd sSpriteAnim_ScrollArrowIndicator3[] = { ANIMCMD_FRAME(4, 30, 0, 1), ANIMCMD_END, }; static const union AnimCmd *const sSpriteAnimTable_ScrollArrowIndicator[] = { sSpriteAnim_ScrollArrowIndicator0, sSpriteAnim_ScrollArrowIndicator1, sSpriteAnim_ScrollArrowIndicator2, sSpriteAnim_ScrollArrowIndicator3, }; static const struct SpriteTemplate sSpriteTemplate_ScrollArrowIndicator = { .tileTag = 0, .paletteTag = 0, .oam = &sOamData_ScrollArrowIndicator, .anims = sSpriteAnimTable_ScrollArrowIndicator, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallback_ScrollIndicatorArrow, }; static const struct Subsprite sSubsprite_RedOutline1 = { .x = 0, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 0, .priority = 0, }; static const struct Subsprite sSubsprite_RedOutline2 = { .x = 0, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 1, .priority = 0, }; static const struct Subsprite sSubsprite_RedOutline3 = { .x = 0, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 2, .priority = 0, }; static const struct Subsprite sSubsprite_RedOutline4 = { .x = 0, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 3, .priority = 0, }; static const struct Subsprite sSubsprite_RedOutline5 = { .x = 0, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 4, .priority = 0, }; static const struct Subsprite sSubsprite_RedOutline6 = { .x = 0, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 5, .priority = 0, }; static const struct Subsprite sSubsprite_RedOutline7 = { .x = 0, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 6, .priority = 0, }; static const struct Subsprite sSubsprite_RedOutline8 = { .x = 0, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 7, .priority = 0, }; static const struct OamData sOamData_RedArrowCursor = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = 0, .mosaic = FALSE, .bpp = 0, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 0, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sSpriteAnim_RedArrowCursor[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END, }; static const union AnimCmd *const sSpriteAnimTable_RedArrowCursor[] = { sSpriteAnim_RedArrowCursor }; static const struct SpriteTemplate sSpriteTemplate_RedArrowCursor = { .tileTag = 0, .paletteTag = 0, .oam = &sOamData_RedArrowCursor, .anims = sSpriteAnimTable_RedArrowCursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallback_RedArrowCursor, }; static const u16 sRedArrowPal[] = INCBIN_U16("graphics/interface/red_arrow.gbapal"); static const u32 sRedArrowOtherGfx[] = INCBIN_U32("graphics/interface/red_arrow_other.4bpp.lz"); static const u32 sSelectorOutlineGfx[] = INCBIN_U32("graphics/interface/selector_outline.4bpp.lz"); static const u32 sRedArrowGfx[] = INCBIN_U32("graphics/interface/red_arrow.4bpp.lz"); #define tState data[0] #define tAnimNum data[1] #define tBounceDir data[2] #define tMultiplier data[3] #define tFrequency data[4] #define tSinePos data[5] static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite) { s32 multiplier; switch (sprite->tState) { case 0: StartSpriteAnim(sprite, sprite->tAnimNum); sprite->tState++; break; case 1: switch (sprite->tBounceDir) { case 0: multiplier = sprite->tMultiplier; sprite->x2 = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256; break; case 1: multiplier = sprite->tMultiplier; sprite->y2 = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256; break; } sprite->tSinePos += sprite->tFrequency; break; } } static u8 AddScrollIndicatorArrowObject(u8 arrowDir, u8 x, u8 y, u16 tileTag, u16 palTag) { u8 spriteId; struct SpriteTemplate spriteTemplate; spriteTemplate = sSpriteTemplate_ScrollArrowIndicator; spriteTemplate.tileTag = tileTag; spriteTemplate.paletteTag = palTag; spriteId = CreateSprite(&spriteTemplate, x, y, 0); gSprites[spriteId].invisible = TRUE; gSprites[spriteId].tState = 0; gSprites[spriteId].tAnimNum = sScrollIndicatorTemplates[arrowDir].animNum; gSprites[spriteId].tBounceDir = sScrollIndicatorTemplates[arrowDir].bounceDir; gSprites[spriteId].tMultiplier = sScrollIndicatorTemplates[arrowDir].multiplier; gSprites[spriteId].tFrequency = sScrollIndicatorTemplates[arrowDir].frequency; gSprites[spriteId].tSinePos = 0; return spriteId; } #undef tState #undef tAnimNum #undef tBounceDir #undef tMultiplier #undef tFrequency #undef tSinePos u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16 *scrollOffset) { struct CompressedSpriteSheet spriteSheet; struct SpritePalette spritePal; struct ScrollIndicatorPair *data; u8 taskId; spriteSheet.data = sRedArrowOtherGfx; spriteSheet.size = 0x100; spriteSheet.tag = arrowInfo->tileTag; LoadCompressedSpriteSheet(&spriteSheet); if (arrowInfo->palTag == TAG_NONE) { LoadPalette(sRedArrowPal, OBJ_PLTT_ID(arrowInfo->palNum), sizeof(sRedArrowPal)); } else { spritePal.data = sRedArrowPal; spritePal.tag = arrowInfo->palTag; LoadSpritePalette(&spritePal); } taskId = CreateTask(Task_ScrollIndicatorArrowPair, 0); data = (struct ScrollIndicatorPair *)gTasks[taskId].data; data->field_0 = 0; data->scrollOffset = scrollOffset; data->fullyUpThreshold = arrowInfo->fullyUpThreshold; data->fullyDownThreshold = arrowInfo->fullyDownThreshold; data->tileTag = arrowInfo->tileTag; data->palTag = arrowInfo->palTag; data->topSpriteId = AddScrollIndicatorArrowObject(arrowInfo->firstArrowType, arrowInfo->firstX, arrowInfo->firstY, arrowInfo->tileTag, arrowInfo->palTag); data->bottomSpriteId = AddScrollIndicatorArrowObject(arrowInfo->secondArrowType, arrowInfo->secondX, arrowInfo->secondY, arrowInfo->tileTag, arrowInfo->palTag); if (arrowInfo->palTag == TAG_NONE) { gSprites[data->topSpriteId].oam.paletteNum = arrowInfo->palNum; gSprites[data->bottomSpriteId].oam.paletteNum = arrowInfo->palNum; } return taskId; } u8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset) { if (arrowType == SCROLL_ARROW_UP || arrowType == SCROLL_ARROW_DOWN) { sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_UP; sTempScrollArrowTemplate.firstX = commonPos; sTempScrollArrowTemplate.firstY = firstPos; sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_DOWN; sTempScrollArrowTemplate.secondX = commonPos; sTempScrollArrowTemplate.secondY = secondPos; } else { sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_LEFT; sTempScrollArrowTemplate.firstX = firstPos; sTempScrollArrowTemplate.firstY = commonPos; sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_RIGHT; sTempScrollArrowTemplate.secondX = secondPos; sTempScrollArrowTemplate.secondY = commonPos; } sTempScrollArrowTemplate.fullyUpThreshold = 0; sTempScrollArrowTemplate.fullyDownThreshold = fullyDownThreshold; sTempScrollArrowTemplate.tileTag = tileTag; sTempScrollArrowTemplate.palTag = palTag; sTempScrollArrowTemplate.palNum = 0; return AddScrollIndicatorArrowPair(&sTempScrollArrowTemplate, scrollOffset); } static void Task_ScrollIndicatorArrowPair(u8 taskId) { struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data; u16 currItem = (*data->scrollOffset); if (currItem == data->fullyUpThreshold) gSprites[data->topSpriteId].invisible = TRUE; else gSprites[data->topSpriteId].invisible = FALSE; if (currItem == data->fullyDownThreshold) gSprites[data->bottomSpriteId].invisible = TRUE; else gSprites[data->bottomSpriteId].invisible = FALSE; } void RemoveScrollIndicatorArrowPair(u8 taskId) { struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data; if (data->tileTag != TAG_NONE) FreeSpriteTilesByTag(data->tileTag); if (data->palTag != TAG_NONE) FreeSpritePaletteByTag(data->palTag); DestroySprite(&gSprites[data->topSpriteId]); DestroySprite(&gSprites[data->bottomSpriteId]); DestroyTask(taskId); } u8 ListMenuAddCursorObjectInternal(const struct CursorStruct *cursor, u32 cursorKind) { switch (cursorKind) { case 0: default: return ListMenuAddRedOutlineCursorObject(cursor); case 1: return ListMenuAddRedArrowCursorObject(cursor); } } void ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind) { switch (cursorKind) { case 0: ListMenuUpdateRedOutlineCursorObject(taskId, x, y); break; case 1: ListMenuUpdateRedArrowCursorObject(taskId, x, y); break; } } void ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind) { switch (cursorKind) { case 0: ListMenuRemoveRedOutlineCursorObject(taskId); break; case 1: ListMenuRemoveRedArrowCursorObject(taskId); break; } } void Task_RedOutlineCursor(u8 taskId) { } u8 ListMenuGetRedOutlineCursorSpriteCount(u16 rowWidth, u16 rowHeight) { s32 i, count = 4; if (rowWidth > 16) for (i = 8; i < (rowWidth - 8); i += 8) count += 2; if (rowHeight > 16) for (i = 8; i < (rowHeight - 8); i += 8) count += 2; return count; } void ListMenuSetUpRedOutlineCursorSpriteOamTable(u16 rowWidth, u16 rowHeight, struct Subsprite *subsprites) { s32 i, j, id = 0; subsprites[id] = sSubsprite_RedOutline1; subsprites[id].x = 136; subsprites[id].y = 136; id++; subsprites[id] = sSubsprite_RedOutline2; subsprites[id].x = rowWidth + 128; subsprites[id].y = 136; id++; subsprites[id] = sSubsprite_RedOutline7; subsprites[id].x = 136; subsprites[id].y = rowHeight + 128; id++; subsprites[id] = sSubsprite_RedOutline8; subsprites[id].x = rowWidth + 128; subsprites[id].y = rowHeight + 128; id++; if (rowWidth > 16) { for (i = 8; i < rowWidth - 8; i += 8) { subsprites[id] = sSubsprite_RedOutline3; subsprites[id].x = i - 120; subsprites[id].y = 136; id++; subsprites[id] = sSubsprite_RedOutline6; subsprites[id].x = i - 120; subsprites[id].y = rowHeight + 128; id++; } } if (rowHeight > 16) { for (j = 8; j < rowHeight - 8; j += 8) { subsprites[id] = sSubsprite_RedOutline4; subsprites[id].x = 136; subsprites[id].y = j - 120; id++; subsprites[id] = sSubsprite_RedOutline5; subsprites[id].x = rowWidth + 128; subsprites[id].y = j - 120; id++; } } } u8 ListMenuAddRedOutlineCursorObject(const struct CursorStruct *cursor) { struct CompressedSpriteSheet spriteSheet; struct SpritePalette spritePal; struct RedOutlineCursor *data; struct SpriteTemplate spriteTemplate; u8 taskId; spriteSheet.data = sSelectorOutlineGfx; spriteSheet.size = 0x100; spriteSheet.tag = cursor->tileTag; LoadCompressedSpriteSheet(&spriteSheet); if (cursor->palTag == TAG_NONE) { LoadPalette(sRedArrowPal, OBJ_PLTT_ID(cursor->palNum), sizeof(sRedArrowPal)); } else { spritePal.data = sRedArrowPal; spritePal.tag = cursor->palTag; LoadSpritePalette(&spritePal); } taskId = CreateTask(Task_RedOutlineCursor, 0); data = (struct RedOutlineCursor *)gTasks[taskId].data; data->tileTag = cursor->tileTag; data->palTag = cursor->palTag; data->subspriteTable.subspriteCount = ListMenuGetRedOutlineCursorSpriteCount(cursor->rowWidth, cursor->rowHeight); data->subspriteTable.subsprites = data->subspritesPtr = Alloc(data->subspriteTable.subspriteCount * 4); ListMenuSetUpRedOutlineCursorSpriteOamTable(cursor->rowWidth, cursor->rowHeight, data->subspritesPtr); spriteTemplate = gDummySpriteTemplate; spriteTemplate.tileTag = cursor->tileTag; spriteTemplate.paletteTag = cursor->palTag; data->spriteId = CreateSprite(&spriteTemplate, cursor->left + 120, cursor->top + 120, 0); SetSubspriteTables(&gSprites[data->spriteId], &data->subspriteTable); gSprites[data->spriteId].oam.priority = 0; gSprites[data->spriteId].subpriority = 0; gSprites[data->spriteId].subspriteTableNum = 0; if (cursor->palTag == TAG_NONE) gSprites[data->spriteId].oam.paletteNum = cursor->palNum; return taskId; } void ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y) { struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data; gSprites[data->spriteId].x = x + 120; gSprites[data->spriteId].y = y + 120; } void ListMenuRemoveRedOutlineCursorObject(u8 taskId) { struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data; Free(data->subspritesPtr); if (data->tileTag != TAG_NONE) FreeSpriteTilesByTag(data->tileTag); if (data->palTag != TAG_NONE) FreeSpritePaletteByTag(data->palTag); DestroySprite(&gSprites[data->spriteId]); DestroyTask(taskId); } static void SpriteCallback_RedArrowCursor(struct Sprite *sprite) { sprite->x2 = gSineTable[(u8)(sprite->data[0])] / 64; sprite->data[0] += 8; } static void Task_RedArrowCursor(u8 taskId) { } static u8 ListMenuAddRedArrowCursorObject(const struct CursorStruct *cursor) { struct CompressedSpriteSheet spriteSheet; struct SpritePalette spritePal; struct RedArrowCursor *data; struct SpriteTemplate spriteTemplate; u8 taskId; spriteSheet.data = sRedArrowGfx; spriteSheet.size = 0x80; spriteSheet.tag = cursor->tileTag; LoadCompressedSpriteSheet(&spriteSheet); if (cursor->palTag == TAG_NONE) { LoadPalette(sRedArrowPal, OBJ_PLTT_ID(cursor->palNum), sizeof(sRedArrowPal)); } else { spritePal.data = sRedArrowPal; spritePal.tag = cursor->palTag; LoadSpritePalette(&spritePal); } taskId = CreateTask(Task_RedArrowCursor, 0); data = (struct RedArrowCursor *)gTasks[taskId].data; data->tileTag = cursor->tileTag; data->palTag = cursor->palTag; spriteTemplate = sSpriteTemplate_RedArrowCursor; spriteTemplate.tileTag = cursor->tileTag; spriteTemplate.paletteTag = cursor->palTag; data->spriteId = CreateSprite(&spriteTemplate, cursor->left, cursor->top, 0); gSprites[data->spriteId].x2 = 8; gSprites[data->spriteId].y2 = 8; if (cursor->palTag == TAG_NONE) gSprites[data->spriteId].oam.paletteNum = cursor->palNum; return taskId; } static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y) { struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data; gSprites[data->spriteId].x = x; gSprites[data->spriteId].y = y; } static void ListMenuRemoveRedArrowCursorObject(u8 taskId) { struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data; if (data->tileTag != TAG_NONE) FreeSpriteTilesByTag(data->tileTag); if (data->palTag != TAG_NONE) FreeSpritePaletteByTag(data->palTag); DestroySprite(&gSprites[data->spriteId]); DestroyTask(taskId); } ================================================ FILE: src/metatile_behavior.c ================================================ #include "global.h" #include "metatile_behavior.h" #include "constants/metatile_behaviors.h" static const bool8 sBehaviorSurfable[NUM_METATILE_BEHAVIORS] = { [MB_POND_WATER] = TRUE, [MB_FAST_WATER] = TRUE, [MB_DEEP_WATER] = TRUE, [MB_WATERFALL] = TRUE, [MB_OCEAN_WATER] = TRUE, [MB_UNUSED_WATER] = TRUE, [MB_CYCLING_ROAD_WATER] = TRUE, [MB_EASTWARD_CURRENT] = TRUE, [MB_WESTWARD_CURRENT] = TRUE, [MB_NORTHWARD_CURRENT] = TRUE, [MB_SOUTHWARD_CURRENT] = TRUE }; static const u8 sTileBitAttributes[32] = { [0] = 0, [1] = 1 << 0, [2] = 1 << 1, [3] = 1 << 2, [4] = 1 << 3, }; bool8 MetatileBehavior_IsATile(u8 metatileBehavior) { return TRUE; } bool8 MetatileBehavior_IsJumpEast(u8 metatileBehavior) { if (metatileBehavior == MB_JUMP_EAST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsJumpWest(u8 metatileBehavior) { if (metatileBehavior == MB_JUMP_WEST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsJumpNorth(u8 metatileBehavior) { if (metatileBehavior == MB_JUMP_NORTH) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsJumpSouth(u8 metatileBehavior) { if (metatileBehavior == MB_JUMP_SOUTH) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPokeGrass(u8 metatileBehavior) { if(metatileBehavior == MB_TALL_GRASS || metatileBehavior == MB_CYCLING_ROAD_PULL_DOWN_GRASS || metatileBehavior == MB_LONG_GRASS || metatileBehavior == MB_ASHGRASS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSand(u8 metatileBehavior) { if (metatileBehavior == MB_SAND || metatileBehavior == MB_SAND_CAVE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSandOrShallowFlowingWater(u8 metatileBehavior) { if (metatileBehavior == MB_SAND || metatileBehavior == MB_SHALLOW_WATER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsDeepSand(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsReflective(u8 metatileBehavior) { if (metatileBehavior == MB_POND_WATER || metatileBehavior == MB_PUDDLE || metatileBehavior == MB_UNUSED_WATER || metatileBehavior == MB_CYCLING_ROAD_WATER || metatileBehavior == MB_ICE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsIce(u8 metatileBehavior) { if (metatileBehavior == MB_ICE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWarpDoor(u8 metatileBehavior) { if (metatileBehavior == MB_WARP_DOOR) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWarpDoor_2(u8 metatileBehavior) { if (metatileBehavior == MB_WARP_DOOR) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsEscalator(u8 metatileBehavior) { if (metatileBehavior >= MB_UP_ESCALATOR && metatileBehavior <= MB_DOWN_ESCALATOR) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsDirectionalUpRightStairWarp(u8 metatileBehavior) { u8 result = FALSE; if (metatileBehavior == MB_UP_RIGHT_STAIR_WARP) result = TRUE; return result; } bool8 MetatileBehavior_IsDirectionalUpLeftStairWarp(u8 metatileBehavior) { u8 result = FALSE; if (metatileBehavior == MB_UP_LEFT_STAIR_WARP) result = TRUE; return result; } bool8 MetatileBehavior_IsDirectionalDownRightStairWarp(u8 metatileBehavior) { u8 result = FALSE; if (metatileBehavior == MB_DOWN_RIGHT_STAIR_WARP) result = TRUE; return result; } bool8 MetatileBehavior_IsDirectionalDownLeftStairWarp(u8 metatileBehavior) { u8 result = FALSE; if (metatileBehavior == MB_DOWN_LEFT_STAIR_WARP) result = TRUE; return result; } bool8 MetatileBehavior_IsDirectionalStairWarp(u8 metatileBehavior) { bool8 result = FALSE; if (metatileBehavior >= MB_UP_RIGHT_STAIR_WARP && metatileBehavior <= MB_DOWN_LEFT_STAIR_WARP) result = TRUE; else result = FALSE; return result; } bool8 MetatileBehavior_IsLadder(u8 metatileBehavior) { if (metatileBehavior == MB_LADDER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsNonAnimDoor(u8 metatileBehavior) { if (metatileBehavior == MB_CAVE_DOOR) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsDeepSouthWarp(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsSurfable(u8 metatileBehavior) { if (sBehaviorSurfable[metatileBehavior] & 1) return TRUE; else return FALSE; } // Water that's too fast to surf on bool8 MetatileBehavior_IsFastWater(u8 metatileBehavior) { if (metatileBehavior == MB_FAST_WATER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsEastArrowWarp(u8 metatileBehavior) { if (metatileBehavior == MB_EAST_ARROW_WARP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWestArrowWarp(u8 metatileBehavior) { if (metatileBehavior == MB_WEST_ARROW_WARP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsNorthArrowWarp(u8 metatileBehavior) { if (metatileBehavior == MB_NORTH_ARROW_WARP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSouthArrowWarp(u8 metatileBehavior) { if (metatileBehavior == MB_SOUTH_ARROW_WARP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsArrowWarp(u8 metatileBehavior) { u8 result = FALSE; if (MetatileBehavior_IsEastArrowWarp(metatileBehavior) || MetatileBehavior_IsWestArrowWarp(metatileBehavior) || MetatileBehavior_IsNorthArrowWarp(metatileBehavior) || MetatileBehavior_IsSouthArrowWarp(metatileBehavior)) result = TRUE; return result; } bool8 MetatileBehavior_IsForcedMovementTile(u8 metatileBehavior) { if ((metatileBehavior >= MB_WALK_EAST && metatileBehavior <= MB_TRICK_HOUSE_PUZZLE_8_FLOOR) || (metatileBehavior >= MB_EASTWARD_CURRENT && metatileBehavior <= MB_SOUTHWARD_CURRENT) || metatileBehavior == MB_WATERFALL || metatileBehavior == MB_ICE || (metatileBehavior >= MB_SPIN_RIGHT && metatileBehavior <= MB_SPIN_DOWN)) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsIce_2(u8 metatileBehavior) { if (metatileBehavior == MB_ICE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 metatileBehavior) { if (metatileBehavior == MB_TRICK_HOUSE_PUZZLE_8_FLOOR) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWalkNorth(u8 metatileBehavior) { if (metatileBehavior == MB_WALK_NORTH) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWalkSouth(u8 metatileBehavior) { if (metatileBehavior == MB_WALK_SOUTH) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWalkWest(u8 metatileBehavior) { if (metatileBehavior == MB_WALK_WEST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWalkEast(u8 metatileBehavior) { if (metatileBehavior == MB_WALK_EAST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsNorthwardCurrent(u8 metatileBehavior) { if (metatileBehavior == MB_NORTHWARD_CURRENT) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSouthwardCurrent(u8 metatileBehavior) { if (metatileBehavior == MB_SOUTHWARD_CURRENT) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWestwardCurrent(u8 metatileBehavior) { if (metatileBehavior == MB_WESTWARD_CURRENT) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsEastwardCurrent(u8 metatileBehavior) { if (metatileBehavior == MB_EASTWARD_CURRENT) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSlideNorth(u8 metatileBehavior) { if (metatileBehavior == MB_SLIDE_NORTH) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSlideSouth(u8 metatileBehavior) { if (metatileBehavior == MB_SLIDE_SOUTH) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSlideWest(u8 metatileBehavior) { if (metatileBehavior == MB_SLIDE_WEST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSlideEast(u8 metatileBehavior) { if (metatileBehavior == MB_SLIDE_EAST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsCounter(u8 metatileBehavior) { if (metatileBehavior == MB_COUNTER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 metatileBehavior, u8 playerDirection) { if (playerDirection != DIR_NORTH) return FALSE; else if (metatileBehavior == MB_TELEVISION) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPC(u8 metatileBehavior) { if (metatileBehavior == MB_PC) return TRUE; else return FALSE; } bool8 MetatileBehavior_HasRipples(u8 metatileBehavior) { if (metatileBehavior == MB_POND_WATER || metatileBehavior == MB_PUDDLE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPuddle(u8 metatileBehavior) { if (metatileBehavior == MB_PUDDLE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsTallGrass(u8 metatileBehavior) { if(metatileBehavior == MB_TALL_GRASS || metatileBehavior == MB_CYCLING_ROAD_PULL_DOWN_GRASS || metatileBehavior == MB_ASHGRASS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsLongGrass(u8 metatileBehavior) { if(metatileBehavior == MB_LONG_GRASS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsFootprints(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsBridge(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_GetBridgeType(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsUnused01(u8 metatileBehavior) { if (metatileBehavior == MB_UNUSED_01) return TRUE; else return FALSE; } bool8 MetatileBehavior_UnusedIsTallGrass(u8 metatileBehavior) { if (metatileBehavior == MB_TALL_GRASS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsIndoorEncounter(u8 metatileBehavior) { if (metatileBehavior == MB_INDOOR_ENCOUNTER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsMountain(u8 metatileBehavior) { if (metatileBehavior == MB_MOUNTAIN_TOP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsDiveable(u8 metatileBehavior) { if (metatileBehavior >= MB_FAST_WATER && metatileBehavior <= MB_DEEP_WATER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsUnableToEmerge(u8 metatileBehavior) { if(metatileBehavior == MB_UNDERWATER_BLOCKED_ABOVE || metatileBehavior == MB_SEAWEED_NO_SURFACING) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsShallowFlowingWater(u8 metatileBehavior) { if (metatileBehavior == MB_SHALLOW_WATER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsThinIce(u8 metatileBehavior) { if (metatileBehavior == MB_THIN_ICE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsCrackedIce(u8 metatileBehavior) { if (metatileBehavior == MB_CRACKED_ICE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsDeepWaterTerrain(u8 metatileBehavior) { if ((metatileBehavior >= MB_FAST_WATER && metatileBehavior <= MB_DEEP_WATER) || metatileBehavior == MB_OCEAN_WATER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsUnusedWater(u8 metatileBehavior) { if (metatileBehavior == MB_UNUSED_WATER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSurfableAndNotWaterfall(u8 metatileBehavior) { if (MetatileBehavior_IsSurfable(metatileBehavior) && !MetatileBehavior_IsWaterfall(metatileBehavior)) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsEastBlocked(u8 metatileBehavior) { if (metatileBehavior == MB_IMPASSABLE_EAST || metatileBehavior == MB_IMPASSABLE_NORTHEAST || metatileBehavior == MB_IMPASSABLE_SOUTHEAST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWestBlocked(u8 metatileBehavior) { if (metatileBehavior == MB_IMPASSABLE_WEST || metatileBehavior == MB_IMPASSABLE_NORTHWEST || metatileBehavior == MB_IMPASSABLE_SOUTHWEST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsNorthBlocked(u8 metatileBehavior) { if (metatileBehavior == MB_IMPASSABLE_NORTH || metatileBehavior == MB_IMPASSABLE_NORTHEAST || metatileBehavior == MB_IMPASSABLE_NORTHWEST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSouthBlocked(u8 metatileBehavior) { if (metatileBehavior == MB_IMPASSABLE_SOUTH || metatileBehavior == MB_IMPASSABLE_SOUTHEAST || metatileBehavior == MB_IMPASSABLE_SOUTHWEST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsShortGrass(u8 metatileBehavior) { if (metatileBehavior == MB_SHORT_GRASS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsHotSprings(u8 metatileBehavior) { if (metatileBehavior == MB_HOT_SPRINGS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWaterfall(u8 metatileBehavior) { if (metatileBehavior == MB_WATERFALL) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsFortreeBridge(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsPacifidlogVerticalLogTop(u8 metatileBehavior){ return FALSE; } bool8 MetatileBehavior_IsPacifidlogVerticalLogBottom(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsPacifidlogHorizontalLogLeft(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsPacifidlogHorizontalLogRight(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsPacifidlogLog(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsRegionMap(u8 metatileBehavior) { if (metatileBehavior == MB_REGION_MAP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsRoulette(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsPokeblockFeeder(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsSecretBaseJumpMat(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsSecretBaseSpinMat(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsLavaridge1FWarp(u8 metatileBehavior) { if (metatileBehavior == MB_LAVARIDGE_1F_WARP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWarpPad(u8 metatileBehavior) { if (metatileBehavior == MB_REGULAR_WARP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsUnionRoomWarp(u8 metatileBehavior) { if (metatileBehavior == MB_UNION_ROOM_WARP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsWater(u8 metatileBehavior) { if ((metatileBehavior >= MB_POND_WATER && metatileBehavior <= MB_DEEP_WATER) || metatileBehavior == MB_OCEAN_WATER || (metatileBehavior >= MB_EASTWARD_CURRENT && metatileBehavior <= MB_SOUTHWARD_CURRENT)) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsFallWarp(u8 metatileBehavior) { if (metatileBehavior == MB_FALL_WARP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsCrackedFloor(u8 metatileBehavior){ return FALSE; } bool32 MetatileBehavior_IsCyclingRoadPullDownTile(u8 metatileBehavior) { if (metatileBehavior >= MB_CYCLING_ROAD_PULL_DOWN && metatileBehavior <= MB_CYCLING_ROAD_PULL_DOWN_GRASS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsCyclingRoadPullDownTileGrass(u8 metatileBehavior) { return metatileBehavior == MB_CYCLING_ROAD_PULL_DOWN_GRASS; } bool8 MetatileBehavior_IsBumpySlope(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsIsolatedVerticalRail(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsVerticalRail(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsHorizontalRail(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsSeaweed(u8 metatileBehavior) { if(metatileBehavior == MB_SEAWEED || metatileBehavior == MB_SEAWEED_NO_SURFACING) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsRunningDisallowed(u8 metatileBehavior) { if (metatileBehavior == MB_RUNNING_DISALLOWED) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSafariExtensionSign(u8 metatileBehavior, u8 playerDirection) { if(playerDirection != DIR_NORTH && playerDirection != DIR_EAST) return FALSE; else if(metatileBehavior == MB_SAFARI_ZONE_EXTENSION_SIGN) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsBookshelf(u8 metatileBehavior) { if (metatileBehavior == MB_BOOKSHELF) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPokeMartShelf(u8 metatileBehavior) { if (metatileBehavior == MB_POKEMART_SHELF) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPlayerFacingPokemonCenterSign(u8 metatileBehavior, u8 playerDirection) { if (playerDirection != DIR_NORTH) return FALSE; else if (metatileBehavior == MB_POKEMON_CENTER_SIGN) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPlayerFacingPokeMartSign(u8 metatileBehavior, u8 playerDirection) { if (playerDirection != DIR_NORTH) return FALSE; else if (metatileBehavior == MB_POKEMART_SIGN) return TRUE; else return FALSE; } bool8 MetatileBehavior_UnknownDummy1(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_UnknownDummy2(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_UnknownDummy3(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_UnknownDummy4(u8 metatileBehavior) { return FALSE; } bool8 TestMetatileAttributeBit(u8 arg1, u8 arg2) { if (sTileBitAttributes[arg1] & arg2) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSpinRight(u8 metatileBehavior) { if (metatileBehavior == MB_SPIN_RIGHT) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSpinLeft(u8 metatileBehavior) { if (metatileBehavior == MB_SPIN_LEFT) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSpinUp(u8 metatileBehavior) { if (metatileBehavior == MB_SPIN_UP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSpinDown(u8 metatileBehavior) { if (metatileBehavior == MB_SPIN_DOWN) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsStopSpinning(u8 metatileBehavior) { if (metatileBehavior == MB_STOP_SPINNING) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSpinTile(u8 metatileBehavior) { bool8 result = FALSE; if (metatileBehavior >= MB_SPIN_RIGHT && metatileBehavior <= MB_SPIN_DOWN) result = TRUE; else result = FALSE; return result; } bool8 MetatileBehavior_IsSignpost(u8 metatileBehavior) { if (metatileBehavior == MB_SIGNPOST) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsCabinet(u8 metatileBehavior) { if (metatileBehavior == MB_CABINET) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsKitchen(u8 metatileBehavior) { if (metatileBehavior == MB_KITCHEN) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsDresser(u8 metatileBehavior) { if (metatileBehavior == MB_DRESSER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsSnacks(u8 metatileBehavior) { if (metatileBehavior == MB_SNACKS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsStrengthButton(u8 metatileBehavior) { if (metatileBehavior == MB_STRENGTH_BUTTON) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPlayerFacingCableClubWirelessMonitor(u8 metatileBehavior, u8 playerDirection) { if (playerDirection != DIR_NORTH) return FALSE; else if (metatileBehavior == MB_CABLE_CLUB_WIRELESS_MONITOR) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPlayerFacingBattleRecords(u8 metatileBehavior, u8 playerDirection) { if (playerDirection != DIR_NORTH) return FALSE; else if (metatileBehavior == MB_BATTLE_RECORDS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsQuestionnaire(u8 metatileBehavior) { if (metatileBehavior == MB_QUESTIONNAIRE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsIndigoPlateauSign1(u8 metatileBehavior) { if (metatileBehavior == MB_INDIGO_PLATEAU_SIGN_1) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsIndigoPlateauSign2(u8 metatileBehavior) { if (metatileBehavior == MB_INDIGO_PLATEAU_SIGN_2) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsFood(u8 metatileBehavior) { if (metatileBehavior == MB_FOOD) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior) { bool8 result = FALSE; if (metatileBehavior == MB_ROCK_STAIRS) result = TRUE; else result = FALSE; return result; } bool8 MetatileBehavior_IsBlueprints(u8 metatileBehavior) { if (metatileBehavior == MB_BLUEPRINTS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPainting(u8 metatileBehavior) { if (metatileBehavior == MB_PAINTING) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPowerPlantMachine(u8 metatileBehavior) { if (metatileBehavior == MB_POWER_PLANT_MACHINE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsTelephone(u8 metatileBehavior) { if (metatileBehavior == MB_TELEPHONE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsComputer(u8 metatileBehavior) { if (metatileBehavior == MB_COMPUTER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsAdvertisingPoster(u8 metatileBehavior) { if (metatileBehavior == MB_ADVERTISING_POSTER) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsTastyFood(u8 metatileBehavior) { if (metatileBehavior == MB_FOOD_SMELLS_TASTY) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsTrashBin(u8 metatileBehavior) { if (metatileBehavior == MB_TRASH_BIN) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsCup(u8 metatileBehavior) { if (metatileBehavior == MB_CUP) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsPolishedWindow(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsBeautifulSkyWindow(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsBlinkingLights(u8 metatileBehavior) { if (metatileBehavior == MB_BLINKING_LIGHTS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsNeatlyLinedUpTools(u8 metatileBehavior) { if (metatileBehavior == MB_NEATLY_LINED_UP_TOOLS) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsImpressiveMachine(u8 metatileBehavior) { if (metatileBehavior == MB_IMPRESSIVE_MACHINE) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsVideoGame(u8 metatileBehavior) { if (metatileBehavior == MB_VIDEO_GAME) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsBurglary(u8 metatileBehavior) { if (metatileBehavior == MB_BURGLARY) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsTrainerTowerMonitor(u8 metatileBehavior) { if (metatileBehavior == MB_TRAINER_TOWER_MONITOR) return TRUE; else return FALSE; } bool8 MetatileBehavior_IsAshGrass(u8 metatileBehavior) { if (metatileBehavior == MB_ASHGRASS) return TRUE; else return FALSE; } ================================================ FILE: src/mini_printf.c ================================================ /* * The Minimal snprintf() implementation * * Copyright (c) 2013,2014 Michal Ludvig * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the auhor nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * mini-printf courtesy of https://github.com/mludvig/mini-printf * stripped to reduce file size for agb needs */ #include "mini_printf.h" #include "gba/types.h" #include "gba/defines.h" #include "config.h" #include "characters.h" #include "string_util.h" #ifndef NDEBUG #if (PRETTY_PRINT_HANDLER != PRETTY_PRINT_OFF) struct mini_buff { char *buffer, *pbuffer; u32 buffer_len; }; static inline char mini_pchar_decode(char encoded) { char ret = '?'; if (encoded >= CHAR_a && encoded <= CHAR_z) ret = encoded-(CHAR_a-'a'); // lower-case characters else if (encoded >= CHAR_A && encoded <= CHAR_Z) ret = encoded-(CHAR_A-'A'); // upper-case characters else if (encoded >= CHAR_0 && encoded <= CHAR_9) ret = encoded-(CHAR_0-'0'); // numbers else if (encoded == CHAR_SPACE) ret = ' '; // space else if (encoded == CHAR_EXCL_MARK) ret = '!'; // exclamation point else if (encoded == CHAR_QUESTION_MARK) ret = '?'; // question mark else if (encoded == CHAR_PERIOD) ret = '.'; // period else if (encoded == CHAR_DBL_QUOTE_LEFT || encoded == CHAR_DBL_QUOTE_RIGHT) ret = '"'; // double quote else if (encoded == CHAR_SGL_QUOTE_LEFT || encoded == CHAR_SGL_QUOTE_RIGHT) ret = '\''; // single quote else if (encoded == CHAR_CURRENCY) ret = '$'; // currency mark (pokemonies in game, dollar sign in logs) else if (encoded == CHAR_COMMA) ret = ','; // comma else if (encoded == CHAR_MULT_SIGN) ret = '#'; // pound, hashtag, octothorpe, whatever else if (encoded == CHAR_SLASH) ret = '/'; // slash else if (encoded == CHAR_LESS_THAN) ret = '<'; // less than sign else if (encoded == CHAR_GREATER_THAN) ret = '>'; // greater than sign else if (encoded == CHAR_PERCENT) ret = '%'; // percentage else if (encoded == CHAR_LEFT_PAREN) ret = '('; // opening parentheses else if (encoded == CHAR_RIGHT_PAREN) ret = ')'; // closing parentheses return ret; } static s32 _putsAscii(char *s, s32 len, void *buf) { char *p0; s32 i; struct mini_buff *b; if (!buf) return len; b = buf; p0 = b->buffer; /* Copy to buffer */ for (i = 0; i < len; i++) { if(b->pbuffer == b->buffer + b->buffer_len - 1) { break; } *(b->pbuffer ++) = s[i]; } *(b->pbuffer) = 0; return b->pbuffer - p0; } static s32 _putsEncoded(char *s, s32 len, void *buf) { char *p0; s32 i; struct mini_buff *b; if (!buf) return len; b = buf; p0 = b->buffer; /* Copy to buffer */ for (i = 0; i < len; i++) { if(b->pbuffer == b->buffer + b->buffer_len - 1) { break; } *(b->pbuffer ++) = mini_pchar_decode(s[i]); } *(b->pbuffer) = 0; return b->pbuffer - p0; } static s32 mini_strlen(const char *s) { s32 len = 0; while (s[len] != '\0') len++; return len; } static s32 mini_itoa(s32 value, u32 radix, s32 uppercase, bool32 unsig, char *buffer) { char *pbuffer = buffer; s32 negative = 0; s32 i, len; /* No support for unusual radixes. */ if (radix > 16) return 0; if (value < 0 && !unsig) { negative = 1; value = -value; } /* This builds the string back to front ... */ do { s32 digit = value % radix; *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); value /= radix; } while (value > 0); if (negative) *(pbuffer++) = '-'; *(pbuffer) = '\0'; /* ... now we reverse it (could do it recursively but will * conserve the stack space) */ len = (pbuffer - buffer); for (i = 0; i < len / 2; i++) { char j = buffer[i]; buffer[i] = buffer[len-i-1]; buffer[len-i-1] = j; } return len; } static s32 mini_pad(char* ptr, s32 len, char pad_char, s32 pad_to, char *buffer) { s32 i; bool32 overflow = FALSE; char * pbuffer = buffer; if(pad_to == 0) pad_to = len; if (len > pad_to) { len = pad_to; overflow = TRUE; } for(i = pad_to - len; i > 0; i --) { *(pbuffer++) = pad_char; } for(i = len; i > 0; i --) { *(pbuffer++) = *(ptr++); } len = pbuffer - buffer; if(overflow) { for (i = 0; i < 3 && pbuffer > buffer; i ++) { *(pbuffer-- - 1) = '*'; } } return len; } s32 mini_vsnprintf(char *buffer, u32 buffer_len, const char *fmt, va_list va) { struct mini_buff b; s32 n; b.buffer = buffer; b.pbuffer = buffer; b.buffer_len = buffer_len; if (buffer_len == 0) buffer = NULL; n = mini_vpprintf((buffer != NULL) ? &b : NULL, fmt, va); if (buffer == NULL) return n; return b.pbuffer - b.buffer; } s32 mini_vpprintf(void* buf, const char *fmt, va_list va) { char bf[24]; char bf2[24]; char ch; s32 n; n = 0; while ((ch=*(fmt++))) { s32 len; if (ch != '%') { len = 1; len = _putsAscii(&ch, len, buf); } else { char pad_char = ' '; s32 pad_to = 0; char l = 0; char *ptr; ch=*(fmt++); /* Zero padding requested */ if (ch == '0') pad_char = '0'; while (ch >= '0' && ch <= '9') { pad_to = pad_to * 10 + (ch - '0'); ch= *(fmt++); } if(pad_to > (s32) sizeof(bf)) { pad_to = sizeof(bf); } if (ch == 'l') { l = 1; ch=*(fmt++); } switch (ch) { case 0: goto end; case 'u': case 'd': if(l) { len = mini_itoa(va_arg(va, u32), 10, 0, (ch=='u'), bf2); } else { if(ch == 'u') { len = mini_itoa((u32) va_arg(va, u32), 10, 0, 1, bf2); } else { len = mini_itoa((s32) va_arg(va, s32), 10, 0, 0, bf2); } } len = mini_pad(bf2, len, pad_char, pad_to, bf); len = _putsAscii(bf, len, buf); break; case 'x': case 'X': if(l) { len = mini_itoa(va_arg(va, u32), 16, (ch=='X'), 1, bf2); } else { len = mini_itoa((u32) va_arg(va, u32), 16, (ch=='X'), 1, bf2); } len = mini_pad(bf2, len, pad_char, pad_to, bf); len = _putsAscii(bf, len, buf); break; case 'c' : ch = (char)(va_arg(va, s32)); len = mini_pad(&ch, 1, pad_char, pad_to, bf); len = _putsAscii(bf, len, buf); break; case 's' : ptr = va_arg(va, char*); len = mini_strlen(ptr); if (pad_to > 0) { len = mini_pad(ptr, len, pad_char, pad_to, bf); len = _putsAscii(bf, len, buf); } else { len = _putsAscii(ptr, len, buf); } break; case 'S' : // preproc encoded string handler ptr = va_arg(va, char*); len = StringLength(ptr); if (pad_to > 0) { len = mini_pad(ptr, len, pad_char, pad_to, bf); len = _putsEncoded(bf, len, buf); } else { len = _putsEncoded(ptr, len, buf); } break; default: len = 1; len = _putsAscii(&ch, len, buf); break; } } n = n + len; } end: return n; } #endif #endif ================================================ FILE: src/minigame_countdown.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "task.h" #include "trig.h" #include "constants/songs.h" static void Task_MinigameCountdown(u8 taskId); static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId); static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3); static bool32 IsStartGraphicAnimRunning(u8 spriteId); static void SpriteCB_Start(struct Sprite *sprite); static void Load321StartGfx(u16 tilesTag, u16 palTag); static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority); static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p); #define tState data[0] #define tTilesTag data[2] #define tPalTag data[3] #define tX data[4] #define tY data[5] #define tSubpriority data[6] #define tSpriteId1 data[7] #define tSpriteId2 data[8] #define tSpriteId3 data[9] void StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority) { u8 taskId = CreateTask(Task_MinigameCountdown, 80); gTasks[taskId].tTilesTag = tilesTag; gTasks[taskId].tPalTag = palTag; gTasks[taskId].tX = x; gTasks[taskId].tY = y; gTasks[taskId].tSubpriority = subpriority; } bool32 IsMinigameCountdownRunning(void) { return FuncIsActiveTask(Task_MinigameCountdown); } static void Task_MinigameCountdown(u8 taskId) { s16 * data = gTasks[taskId].data; switch (tState) { case 0: Load321StartGfx(tTilesTag, tPalTag); tSpriteId1 = CreateNumberSprite(tTilesTag, tPalTag, tX, tY, tSubpriority); CreateStartSprite(tTilesTag, tPalTag, tX, tY, tSubpriority, &tSpriteId2, &tSpriteId3); tState++; break; case 1: if (!RunMinigameCountdownDigitsAnim(tSpriteId1)) { StartStartGraphic(tSpriteId1, tSpriteId2, tSpriteId3); FreeSpriteOamMatrix(&gSprites[tSpriteId1]); DestroySprite(&gSprites[tSpriteId1]); tState++; } break; case 2: if (!IsStartGraphicAnimRunning(tSpriteId2)) { DestroySprite(&gSprites[tSpriteId2]); DestroySprite(&gSprites[tSpriteId3]); FreeSpriteTilesByTag(tTilesTag); FreeSpritePaletteByTag(tPalTag); DestroyTask(taskId); } break; } } static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId) { struct Sprite *sprite = &gSprites[spriteId]; switch (sprite->data[0]) { case 0: SetSpriteMatrixAnchor(sprite, NO_ANCHOR, 26); sprite->data[0]++; // fallthrough case 1: if (sprite->data[2] == 0) PlaySE(SE_BALL_BOUNCE_2); if (++sprite->data[2] >= 20) { sprite->data[2] = 0; StartSpriteAffineAnim(sprite, 1); sprite->data[0]++; } break; case 2: if (sprite->affineAnimEnded) sprite->data[0]++; break; case 3: if (++sprite->data[2] >= 4) { sprite->data[2] = 0; sprite->data[0]++; StartSpriteAffineAnim(sprite, 2); } break; case 4: sprite->y -= 4; if (++sprite->data[2] >= 8) { if (sprite->data[4] < 2) { StartSpriteAnim(sprite, sprite->data[4] + 1); sprite->data[2] = 0; sprite->data[0]++; } else { sprite->data[0] = 7; return FALSE; } } break; case 5: sprite->y += 4; if (++sprite->data[2] >= 8) { sprite->data[2] = 0; StartSpriteAffineAnim(sprite, 3); sprite->data[0]++; } break; case 6: if (sprite->affineAnimEnded) { sprite->data[4]++; sprite->data[0] = 1; } break; case 7: return FALSE; } return TRUE; } static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3) { gSprites[spriteId2].y2 = -40; gSprites[spriteId3].y2 = -40; gSprites[spriteId2].invisible = FALSE; gSprites[spriteId3].invisible = FALSE; gSprites[spriteId2].callback = SpriteCB_Start; gSprites[spriteId3].callback = SpriteCB_Start; } static bool32 IsStartGraphicAnimRunning(u8 spriteId) { return gSprites[spriteId].callback == SpriteCB_Start; } static void SpriteCB_Start(struct Sprite *sprite) { s16 * data = sprite->data; s32 y; switch (sprite->data[0]) { case 0: data[4] = 64; data[5] = sprite->y2 << 4; data[0]++; //fallthrough case 1: data[5] += data[4]; data[4]++; sprite->y2 = data[5] >> 4; if (sprite->y2 >= 0) { PlaySE(SE_BALL_BOUNCE_2); sprite->y2 = 0; data[0]++; } break; case 2: data[1] += 12; if (data[1] >= 128) { PlaySE(SE_BALL_BOUNCE_2); data[1] = 0; data[0]++; } y = gSineTable[data[1]]; sprite->y2 = -(y >> 4); break; case 3: data[1] += 16; if (data[1] >= 128) { PlaySE(SE_BALL_BOUNCE_2); data[1] = 0; data[0]++; } sprite->y2 = -(gSineTable[data[1]] >> 5); break; case 4: if (++data[1] > 40) sprite->callback = SpriteCallbackDummy; break; } } static const u16 sSpritePal_321Start[] = INCBIN_U16("graphics/misc/minigame_countdown.gbapal"); static const u16 sSpriteSheet_321Start[] = INCBIN_U16("graphics/misc/minigame_countdown.4bpp.lz"); static void Load321StartGfx(u16 tilesTag, u16 palTag) { struct CompressedSpriteSheet spriteSheet = {(const void *)sSpriteSheet_321Start, 0xE00}; struct SpritePalette spritePalette = {sSpritePal_321Start}; spriteSheet.tag = tilesTag; spritePalette.tag = palTag; LoadCompressedSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); } static const struct OamData sOamData_Numbers = { .affineMode = ST_OAM_AFFINE_DOUBLE, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32) }; static const struct OamData sOamData_Start = { .affineMode = ST_OAM_AFFINE_OFF, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32) }; static const union AnimCmd sAnim_Numbers_Three[] = { ANIMCMD_FRAME( 0, 1), ANIMCMD_END }; static const union AnimCmd sAnim_Numbers_Two[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; static const union AnimCmd sAnim_Numbers_One[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; static const union AnimCmd *const sAnimTable_Numbers[] = { sAnim_Numbers_Three, sAnim_Numbers_Two, sAnim_Numbers_One }; static const union AnimCmd sAnim_StartLeft[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END }; static const union AnimCmd sAnim_StartRight[] = { ANIMCMD_FRAME(80, 1), ANIMCMD_END }; static const union AnimCmd *const sAnimTable_Start[] = { sAnim_StartLeft, sAnim_StartRight }; static const union AffineAnimCmd sAffineAnim_Numbers_0[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Numbers_1[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Numbers_2[] = { AFFINEANIMCMD_FRAME(-0x12, 0x12, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Numbers_3[] = { AFFINEANIMCMD_FRAME( 0x6, -0x6, 0, 8), AFFINEANIMCMD_FRAME( -0x4, 0x4, 0, 8), AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnimTable_Numbers[] = { sAffineAnim_Numbers_0, sAffineAnim_Numbers_1, sAffineAnim_Numbers_2, sAffineAnim_Numbers_3 }; static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority) { struct SpriteTemplate spriteTemplate = { .oam = &sOamData_Numbers, .anims = sAnimTable_Numbers, .affineAnims = sAffineAnimTable_Numbers, .callback = SpriteCallbackDummy }; spriteTemplate.tileTag = tilesTag; spriteTemplate.paletteTag = palTag; return CreateSprite(&spriteTemplate, x, y, subpriority); } static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p) { struct SpriteTemplate spriteTemplate = { .oam = &sOamData_Start, .anims = sAnimTable_Start, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; spriteTemplate.tileTag = tilesTag; spriteTemplate.paletteTag = palTag; *spriteId2_p = CreateSprite(&spriteTemplate, x - 32, y, subpriority); *spriteId3_p = CreateSprite(&spriteTemplate, x + 32, y, subpriority); gSprites[*spriteId2_p].invisible = TRUE; gSprites[*spriteId3_p].invisible = TRUE; StartSpriteAnim(&gSprites[*spriteId3_p], 1); } ================================================ FILE: src/mon_markings.c ================================================ #include "global.h" #include "gflib.h" #include "text_window_graphics.h" #include "mon_markings.h" #include "graphics.h" #include "constants/songs.h" #define ANIM_CURSOR (NUM_MON_MARKINGS * 2) #define ANIM_TEXT (ANIM_CURSOR + 1) #define SELECTION_OK NUM_MON_MARKINGS #define SELECTION_CANCEL (SELECTION_OK + 1) static void CreateMonMarkingsMenuSprites(s16, s16, u16, u16); static void SpriteCB_Dummy(struct Sprite *); static void SpriteCB_Marking(struct Sprite *); static void SpriteCB_Cursor(struct Sprite *); static struct Sprite *CreateMarkingComboSprite(u16, u16, const u16 *, u16); static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/misc/mon_markings.gbapal"); static const u16 sMonMarkings_Gfx[] = INCBIN_U16("graphics/misc/mon_markings.4bpp"); static const u8 sUnused[] = {0x09, 0x50, 0x13, 0x02, 0xFF}; static const struct OamData sOamData_MenuWindow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 0, .paletteNum = 0, .affineParam = 0, }; // Used for the markings, OK/Cancel text, and cursor sprites static const struct OamData sOamData_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 0, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sAnim_Marking_CircleOff[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_Marking_CircleOn[] = { ANIMCMD_FRAME(1, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_Marking_SquareOff[] = { ANIMCMD_FRAME(2, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_Marking_SquareOn[] = { ANIMCMD_FRAME(3, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_Marking_TriangleOff[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_Marking_TriangleOn[] = { ANIMCMD_FRAME(5, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_Marking_HeartOff[] = { ANIMCMD_FRAME(6, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_Marking_HeartOn[] = { ANIMCMD_FRAME(7, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_Cursor[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_OKCancelText[] = { ANIMCMD_FRAME(9, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_MenuSprite[] = { sAnim_Marking_CircleOff, sAnim_Marking_CircleOn, sAnim_Marking_SquareOff, sAnim_Marking_SquareOn, sAnim_Marking_TriangleOff, sAnim_Marking_TriangleOn, sAnim_Marking_HeartOff, sAnim_Marking_HeartOn, [ANIM_CURSOR] = sAnim_Cursor, [ANIM_TEXT] = sAnim_OKCancelText, }; static const union AnimCmd sAnim_MenuWindow_UpperHalf[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MenuWindow_LowerHalf[] = { ANIMCMD_FRAME(64, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_MenuWindow[] = { sAnim_MenuWindow_UpperHalf, sAnim_MenuWindow_LowerHalf, }; static const struct OamData sOamData_MarkingCombo = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 0, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sAnim_MarkingCombo_AllOff[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_Circle[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_Square[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_CircleSquare[] = { ANIMCMD_FRAME(12, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_Triangle[] = { ANIMCMD_FRAME(16, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_CircleTriangle[] = { ANIMCMD_FRAME(20, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_SquareTriangle[] = { ANIMCMD_FRAME(24, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_CircleSquareTriangle[] = { ANIMCMD_FRAME(28, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_Heart[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_CircleHeart[] = { ANIMCMD_FRAME(36, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_SquareHeart[] = { ANIMCMD_FRAME(40, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_CircleSquareHeart[] = { ANIMCMD_FRAME(44, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_TriangleHeart[] = { ANIMCMD_FRAME(48, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_CircleTriangleHeart[] = { ANIMCMD_FRAME(52, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_SquareTriangleHeart[] = { ANIMCMD_FRAME(56, 5), ANIMCMD_END, }; static const union AnimCmd sAnim_MarkingCombo_AllOn[] = { ANIMCMD_FRAME(60, 5), ANIMCMD_END, }; static const union AnimCmd *const sAnims_MarkingCombo[] = { sAnim_MarkingCombo_AllOff, sAnim_MarkingCombo_Circle, sAnim_MarkingCombo_Square, sAnim_MarkingCombo_CircleSquare, sAnim_MarkingCombo_Triangle, sAnim_MarkingCombo_CircleTriangle, sAnim_MarkingCombo_SquareTriangle, sAnim_MarkingCombo_CircleSquareTriangle, sAnim_MarkingCombo_Heart, sAnim_MarkingCombo_CircleHeart, sAnim_MarkingCombo_SquareHeart, sAnim_MarkingCombo_CircleSquareHeart, sAnim_MarkingCombo_TriangleHeart, sAnim_MarkingCombo_CircleTriangleHeart, sAnim_MarkingCombo_SquareTriangleHeart, sAnim_MarkingCombo_AllOn, }; static EWRAM_DATA struct MonMarkingsMenu *sMenu = NULL; void InitMonMarkingsMenu(struct MonMarkingsMenu *ptr) { sMenu = ptr; } static void BufferMenuWindowTiles(void) { const struct TextWindowGraphics *frame = GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType); sMenu->frameTiles = frame->tiles; sMenu->framePalette = frame->palette; sMenu->tileLoadState = 0; CpuFill16(0, sMenu->windowSpriteTiles, sizeof(sMenu->windowSpriteTiles)); } static bool8 BufferMenuFrameTiles(void) { u32 i; u8 *dest = sMenu->windowSpriteTiles + sMenu->tileLoadState * 0x100; switch (sMenu->tileLoadState) { case 0: CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP); for (i = 0; i < 6; i++) CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); sMenu->tileLoadState++; break; default: CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP); for (i = 0; i < 6; i++) CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); sMenu->tileLoadState++; break; case 13: CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP); for (i = 0; i < 6; i++) CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); sMenu->tileLoadState++; return FALSE; case 14: return FALSE; } return TRUE; } void BufferMonMarkingsMenuTiles(void) { BufferMenuWindowTiles(); while (BufferMenuFrameTiles()); } void OpenMonMarkingsMenu(u8 markings, s16 x, s16 y) { u32 i; sMenu->cursorPos = 0; sMenu->markings = markings; for (i = 0; i < NUM_MON_MARKINGS; i++) sMenu->markingsArray[i] = (sMenu->markings >> i) & 1; CreateMonMarkingsMenuSprites(x, y, sMenu->baseTileTag, sMenu->basePaletteTag); } void FreeMonMarkingsMenu(void) { u32 i; for (i = 0; i < 3; i++) FreeSpriteTilesByTag(sMenu->baseTileTag + i); FreeSpritePaletteByTag(sMenu->basePaletteTag); FreeSpritePaletteByTag(sMenu->basePaletteTag + 1); for (i = 0; i < ARRAY_COUNT(sMenu->windowSprites); i++) { if (sMenu->windowSprites[i] == NULL) return; // break; DestroySprite(sMenu->windowSprites[i]); } for (i = 0; i < NUM_MON_MARKINGS; i++) { if (sMenu->markingSprites[i] == NULL) return; // break; DestroySprite(sMenu->markingSprites[i]); } if (sMenu->cursorSprite != NULL) DestroySprite(sMenu->cursorSprite); if (sMenu->textSprite != NULL) DestroySprite(sMenu->textSprite); } bool8 HandleMonMarkingsMenuInput(void) { u32 i; if (JOY_NEW(DPAD_UP)) { PlaySE(SE_SELECT); if (--sMenu->cursorPos < 0) sMenu->cursorPos = SELECTION_CANCEL; return TRUE; } if (JOY_NEW(DPAD_DOWN)) { PlaySE(SE_SELECT); if (++sMenu->cursorPos > SELECTION_CANCEL) sMenu->cursorPos = 0; return TRUE; } if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); switch (sMenu->cursorPos) { case SELECTION_OK: sMenu->markings = 0; for (i = 0; i < NUM_MON_MARKINGS; i++) sMenu->markings |= sMenu->markingsArray[i] << i; return FALSE; case SELECTION_CANCEL: return FALSE; } sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos]; return TRUE; } if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); return FALSE; } return TRUE; } #define sMarkingId data[0] #define sCursorYOffset data[0] static void CreateMonMarkingsMenuSprites(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag) { u32 i; u8 spriteId; struct SpriteSheet sheets[] = { { sMenu->windowSpriteTiles, 0x1000, baseTileTag }, { gMonMarkingsMenu_Gfx, 0x320, baseTileTag + 1 }, {} }; struct SpritePalette palettes[] = { { sMenu->framePalette, basePaletteTag }, { gMonMarkingsMenu_Pal, basePaletteTag + 1}, {} }; struct SpriteTemplate template = { .tileTag = baseTileTag, .paletteTag = basePaletteTag, .oam = &sOamData_MenuWindow, .anims = sAnims_MenuWindow, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Dummy, }; LoadSpriteSheets(sheets); LoadSpritePalettes(palettes); // Create window sprites for (i = 0; i < ARRAY_COUNT(sMenu->windowSprites); i++) { spriteId = CreateSprite(&template, x + 32, y + 32, 1); if (spriteId != MAX_SPRITES) { sMenu->windowSprites[i] = &gSprites[spriteId]; StartSpriteAnim(&gSprites[spriteId], i); } else { sMenu->windowSprites[i] = NULL; return; } } sMenu->windowSprites[1]->y = y + 96; // Create marking sprites template.tileTag++; template.paletteTag++; template.anims = sAnims_MenuSprite; template.callback = SpriteCB_Marking; template.oam = &sOamData_8x8; for (i = 0; i < NUM_MON_MARKINGS; i++) { spriteId = CreateSprite(&template, x + 32, y + 16 + 16 * i, 0); if (spriteId != MAX_SPRITES) { sMenu->markingSprites[i] = &gSprites[spriteId]; gSprites[spriteId].sMarkingId = i; } else { sMenu->markingSprites[i] = NULL; return; } } // Create OK/Cancel text sprite template.callback = SpriteCallbackDummy; spriteId = CreateSprite(&template, 0, 0, 0); if (spriteId != MAX_SPRITES) { sMenu->textSprite = &gSprites[spriteId]; sMenu->textSprite->oam.shape = SPRITE_SHAPE(32x32); sMenu->textSprite->oam.size = SPRITE_SIZE(32x32); StartSpriteAnim(sMenu->textSprite, ANIM_TEXT); sMenu->textSprite->x = x + 32; sMenu->textSprite->y = y + 80; CalcCenterToCornerVec(sMenu->textSprite, SPRITE_SHAPE(32x16), SPRITE_SIZE(32x16), ST_OAM_AFFINE_OFF); } else { sMenu->textSprite = NULL; } // Create cursor sprite template.callback = SpriteCB_Cursor; spriteId = CreateSprite(&template, x + 12, 0, 0); if (spriteId != MAX_SPRITES) { sMenu->cursorSprite = &gSprites[spriteId]; sMenu->cursorSprite->sCursorYOffset = y + 16; StartSpriteAnim(sMenu->cursorSprite, ANIM_CURSOR); } else { sMenu->cursorSprite = NULL; } } static void SpriteCB_Dummy(struct Sprite *sprite) { } static void SpriteCB_Marking(struct Sprite *sprite) { if (sMenu->markingsArray[sprite->sMarkingId]) StartSpriteAnim(sprite, 2 * sprite->sMarkingId + 1); // Set marking 'on' else StartSpriteAnim(sprite, 2 * sprite->sMarkingId); // Set marking 'off' } #undef sMarkingId static void SpriteCB_Cursor(struct Sprite *sprite) { sprite->y = (16 * sMenu->cursorPos) + sprite->sCursorYOffset; } #undef sCursorYOffset // Creates a mon marking combination sprite with a spritesheet that holds every possible combination, used by the summary screen / Pokénav struct Sprite *CreateMonMarkingAllCombosSprite(u16 tileTag, u16 paletteTag, const u16 *palette) { if (palette == NULL) palette = sMonMarkings_Pal; return CreateMarkingComboSprite(tileTag, paletteTag, palette, 1 << NUM_MON_MARKINGS); } // Creates a mon marking combination sprite with a spritesheet that holds only one combination, used for the currently selected PC mon struct Sprite *CreateMonMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette) { if (palette == NULL) palette = sMonMarkings_Pal; return CreateMarkingComboSprite(tileTag, paletteTag, palette, 1); } static struct Sprite *CreateMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size) { u8 spriteId; struct SpriteTemplate template; struct SpriteSheet sheet = { sMonMarkings_Gfx, 0x80, tileTag }; struct SpritePalette sprPalette = { palette, paletteTag }; template.tileTag = tileTag; template.paletteTag = paletteTag; template.oam = &sOamData_MarkingCombo; template.anims = sAnims_MarkingCombo; template.images = NULL; template.affineAnims = gDummySpriteAffineAnimTable; template.callback = SpriteCB_Dummy; sheet.size = size * 0x80; LoadSpriteSheet(&sheet); LoadSpritePalette(&sprPalette); spriteId = CreateSprite(&template, 0, 0, 0); if (spriteId != MAX_SPRITES) return &gSprites[spriteId]; else return NULL; } // Update what combination is shown, used for sprites created with CreateMonMarkingComboSprite void UpdateMonMarkingTiles(u8 markings, void *dest) { RequestDma3Copy(&sMonMarkings_Gfx[64 * markings], dest, 0x80, DMA3_32BIT); } ================================================ FILE: src/money.c ================================================ #include "global.h" #include "gflib.h" #include "event_data.h" #include "menu.h" #include "text_window.h" #include "strings.h" #define MAX_MONEY 999999 EWRAM_DATA static u8 sMoneyBoxWindowId = 0; u32 GetMoney(u32 *moneyPtr) { return *moneyPtr ^ gSaveBlock2Ptr->encryptionKey; } void SetMoney(u32 *moneyPtr, u32 newValue) { *moneyPtr = gSaveBlock2Ptr->encryptionKey ^ newValue; } bool8 IsEnoughMoney(u32 *moneyPtr, u32 cost) { if (GetMoney(moneyPtr) >= cost) return TRUE; else return FALSE; } void AddMoney(u32 *moneyPtr, u32 toAdd) { u32 toSet = GetMoney(moneyPtr); // can't have more money than MAX if (toSet + toAdd > MAX_MONEY) { toSet = MAX_MONEY; } else { toSet += toAdd; // check overflow, can't have less money after you receive more if (toSet < GetMoney(moneyPtr)) toSet = MAX_MONEY; } SetMoney(moneyPtr, toSet); } void RemoveMoney(u32 *moneyPtr, u32 toSub) { u32 toSet = GetMoney(moneyPtr); // can't subtract more than you already have if (toSet < toSub) toSet = 0; else toSet -= toSub; SetMoney(moneyPtr, toSet); } bool8 IsEnoughForCostInVar0x8005(void) { return IsEnoughMoney(&gSaveBlock1Ptr->money, gSpecialVar_0x8005); } void SubtractMoneyFromVar0x8005(void) { RemoveMoney(&gSaveBlock1Ptr->money, gSpecialVar_0x8005); } void PrintMoneyAmountInMoneyBox(u8 windowId, int amount, u8 speed) { u8 *txtPtr; s32 strLength; ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_LEFT_ALIGN, 6); strLength = 6 - StringLength(gStringVar1); txtPtr = gStringVar4; while (strLength-- != 0) *(txtPtr++) = 0; StringExpandPlaceholders(txtPtr, gText_PokedollarVar1); AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, 64 - GetStringWidth(FONT_SMALL, gStringVar4, 0), 0xC, speed, NULL); } void PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed) { u8 *txtPtr; s32 strLength; ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_LEFT_ALIGN, 6); strLength = 6 - StringLength(gStringVar1); txtPtr = gStringVar4; while (strLength-- != 0) *(txtPtr++) = 0; StringExpandPlaceholders(txtPtr, gText_PokedollarVar1); AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, x, y, speed, NULL); } void PrintMoneyAmountInMoneyBoxWithBorder(u8 windowId, u16 tileStart, u8 paletteNum, int amount) { DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, tileStart, paletteNum); AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_TrainerCardMoney, 0, 0, 0xFF, 0); PrintMoneyAmountInMoneyBox(windowId, amount, 0); } void ChangeAmountInMoneyBox(int amount) { PrintMoneyAmountInMoneyBox(sMoneyBoxWindowId, amount, 0); } void DrawMoneyBox(int amount, u8 x, u8 y) { struct WindowTemplate template; template = SetWindowTemplateFields(0, x + 1, y + 1, 8, 3, 15, 8); sMoneyBoxWindowId = AddWindow(&template); FillWindowPixelBuffer(sMoneyBoxWindowId, 0); PutWindowTilemap(sMoneyBoxWindowId); LoadStdWindowGfx(sMoneyBoxWindowId, 0x21D, BG_PLTT_ID(13)); PrintMoneyAmountInMoneyBoxWithBorder(sMoneyBoxWindowId, 0x21D, 13, amount); } void HideMoneyBox(void) { ClearStdWindowAndFrameToTransparent(sMoneyBoxWindowId, FALSE); CopyWindowToVram(sMoneyBoxWindowId, COPYWIN_GFX); RemoveWindow(sMoneyBoxWindowId); } ================================================ FILE: src/move_descriptions.c ================================================ #include "global.h" #include "constants/moves.h" const u8 gMoveDescription_Pound[] = _("A physical attack\ndelivered with a\nlong tail or a\nforeleg, etc."); const u8 gMoveDescription_KarateChop[] = _("The foe is attacked\nwith a sharp chop.\nIt has a high\ncritical-hit ratio."); const u8 gMoveDescription_DoubleSlap[] = _("The foe is slapped\nrepeatedly, back\nand forth, two to\nfive times."); const u8 gMoveDescription_CometPunch[] = _("The foe is hit with\na flurry of punches\nthat strike two to\nfive times."); const u8 gMoveDescription_MegaPunch[] = _("The foe is slugged\nby a punch thrown\nwith muscle-packed\npower."); const u8 gMoveDescription_PayDay[] = _("Numerous coins are\nhurled at the foe.\nMoney is earned\nafter battle."); const u8 gMoveDescription_FirePunch[] = _("The foe is punched\nwith a fiery fist.\nIt may leave the\nfoe with a burn."); const u8 gMoveDescription_IcePunch[] = _("The foe is punched\nwith an icy fist.\nIt may leave the\nfoe frozen."); const u8 gMoveDescription_ThunderPunch[] = _("The foe is punched\nwith an electrified\nfist. It may leave\nthe foe paralyzed."); const u8 gMoveDescription_Scratch[] = _("Hard, pointed, and\nsharp claws rake\nthe foe."); const u8 gMoveDescription_ViceGrip[] = _("Huge, impressive\npincers grip and\nsqueeze the foe."); const u8 gMoveDescription_Guillotine[] = _("A vicious tearing\nattack with pincers.\nThe foe will faint\nif it hits."); const u8 gMoveDescription_RazorWind[] = _("Blades of wind hit\nthe foe on the 2nd\nturn. It has a high\ncritical-hit ratio."); const u8 gMoveDescription_SwordsDance[] = _("A frenetic dance of\nfighting. It sharply\nraises the ATTACK\nstat."); const u8 gMoveDescription_Cut[] = _("A basic attack.\nIt can be used to\ncut down thin trees\nand grass."); const u8 gMoveDescription_Gust[] = _("Strikes the foe\nwith a gust of wind\nwhipped up by\nwings."); const u8 gMoveDescription_WingAttack[] = _("The foe is struck\nwith large, imposing\nwings spread wide."); const u8 gMoveDescription_Whirlwind[] = _("The foe is made to\nswitch out with an\nally. In the wild,\nthe battle ends."); const u8 gMoveDescription_Fly[] = _("A 2-turn move that\nhits on the 2nd\nturn. Use it to fly\nto any known town."); const u8 gMoveDescription_Bind[] = _("A long body or\ntentacles are used\nto bind the foe for\ntwo to five turns."); const u8 gMoveDescription_Slam[] = _("The foe is struck\nwith a long tail,\nvines, etc."); const u8 gMoveDescription_VineWhip[] = _("The foe is struck\nwith slender, whip-\nlike vines."); const u8 gMoveDescription_Stomp[] = _("The foe is stomped\nwith a big foot.\nIt may make the\nfoe flinch."); const u8 gMoveDescription_DoubleKick[] = _("Two legs are used\nto quickly kick the\nfoe twice in one\nturn."); const u8 gMoveDescription_MegaKick[] = _("The foe is attacked\nby a kick fired\nwith muscle-packed\npower."); const u8 gMoveDescription_JumpKick[] = _("The user jumps up\nhigh, then kicks.\nIf it misses, the\nuser hurts itself."); const u8 gMoveDescription_RollingKick[] = _("A quick kick from a\nrolling spin.\nIt may make the\nfoe flinch."); const u8 gMoveDescription_SandAttack[] = _("A lot of sand is\nhurled in the foe's\nface, reducing its\naccuracy."); const u8 gMoveDescription_Headbutt[] = _("The user sticks its\nhead out and rams.\nIt may make the\nfoe flinch."); const u8 gMoveDescription_HornAttack[] = _("The foe is jabbed\nwith a sharply\npointed horn to\ninflict damage."); const u8 gMoveDescription_FuryAttack[] = _("The foe is jabbed\nrepeatedly with a\nhorn or beak two to\nfive times."); const u8 gMoveDescription_HornDrill[] = _("The horn is rotated\nlike a drill to ram.\nThe foe will faint\nif it hits."); const u8 gMoveDescription_Tackle[] = _("A physical attack\nin which the user\ncharges, full body,\ninto the foe."); const u8 gMoveDescription_BodySlam[] = _("The user drops its\nfull body on the\nfoe. It may leave\nthe foe paralyzed."); const u8 gMoveDescription_Wrap[] = _("A long body or\nvines are used to\nwrap the foe for\ntwo to five turns."); const u8 gMoveDescription_TakeDown[] = _("A reckless, full-\nbody charge attack\nthat also hurts the\nuser a little."); const u8 gMoveDescription_Thrash[] = _("The user rampages\nabout for two to\nthree turns, then\nbecomes confused."); const u8 gMoveDescription_DoubleEdge[] = _("A reckless, life-\nrisking tackle that\nalso hurts the user\na little."); const u8 gMoveDescription_TailWhip[] = _("The user wags its\ntail cutely, making\nthe foe lower its\nDEFENSE stat."); const u8 gMoveDescription_PoisonSting[] = _("The foe is stabbed\nwith a toxic barb,\netc. It may poison\nthe foe."); const u8 gMoveDescription_Twineedle[] = _("The foe is stabbed\ntwice with foreleg\nstingers. It may\npoison the foe."); const u8 gMoveDescription_PinMissile[] = _("Sharp pins are shot\nat the foe and hit\ntwo to five times\nat once."); const u8 gMoveDescription_Leer[] = _("The foe is given an\nintimidating look\nthat lowers its\nDEFENSE stat."); const u8 gMoveDescription_Bite[] = _("The user bites with\nvicious fangs.\nIt may make the\nfoe flinch."); const u8 gMoveDescription_Growl[] = _("The user growls in\na cute way, making\nthe foe lower its\nATTACK stat."); const u8 gMoveDescription_Roar[] = _("The foe is made to\nswitch out with an\nally. In the wild,\nthe battle ends."); const u8 gMoveDescription_Sing[] = _("A soothing song\nin a calming voice\nlulls the foe into\na deep slumber."); const u8 gMoveDescription_Supersonic[] = _("The user generates\nodd sound waves.\nIt may confuse the\nfoe."); const u8 gMoveDescription_SonicBoom[] = _("The foe is hit with\na shock wave that\nalways inflicts 20-\nHP damage."); const u8 gMoveDescription_Disable[] = _("For a few turns,\nit prevents the foe\nfrom using the move\nit last used."); const u8 gMoveDescription_Acid[] = _("The foe is sprayed\nwith a harsh, hide-\nmelting acid that\nmay lower DEFENSE."); const u8 gMoveDescription_Ember[] = _("The foe is attacked\nwith small flames.\nThe foe may suffer\na burn."); const u8 gMoveDescription_Flamethrower[] = _("The foe is scorched\nwith intense flames.\nThe foe may suffer\na burn."); const u8 gMoveDescription_Mist[] = _("The ally party is\nprotected by a\nmist that prevents\nstat reductions."); const u8 gMoveDescription_WaterGun[] = _("The foe is struck\nwith a lot of water\nexpelled forcibly\nfrom the mouth."); const u8 gMoveDescription_HydroPump[] = _("A high volume of\nwater is blasted at\nthe foe under great\npressure."); const u8 gMoveDescription_Surf[] = _("A big wave crashes\ndown on the foe.\nCan also be used\nfor crossing water."); const u8 gMoveDescription_IceBeam[] = _("The foe is struck\nwith an icy beam.\nIt may freeze the\nfoe solid."); const u8 gMoveDescription_Blizzard[] = _("The foe is blasted\nwith a blizzard.\nIt may freeze the\nfoe solid."); const u8 gMoveDescription_Psybeam[] = _("A peculiar ray is\nshot at the foe.\nIt may leave the\nfoe confused."); const u8 gMoveDescription_BubbleBeam[] = _("A spray of bubbles\nstrikes the foe.\nIt may lower the\nfoe's SPEED stat."); const u8 gMoveDescription_AuroraBeam[] = _("A rainbow-colored\nattack beam.\nIt may lower the\nfoe's ATTACK stat."); const u8 gMoveDescription_HyperBeam[] = _("A severely damaging\nattack that makes\nthe user rest on\nthe next turn."); const u8 gMoveDescription_Peck[] = _("The foe is jabbed\nwith a sharply\npointed beak or\nhorn."); const u8 gMoveDescription_DrillPeck[] = _("A corkscrewing\nattack with the\nsharp beak acting\nas a drill."); const u8 gMoveDescription_Submission[] = _("A reckless, full-\nbody throw attack\nthat also hurts the\nuser a little."); const u8 gMoveDescription_LowKick[] = _("A low, tripping kick\nthat inflicts more\ndamage on heavier\nfoes."); const u8 gMoveDescription_Counter[] = _("A retaliation move\nthat counters any\nphysical hit with\ndouble the damage."); const u8 gMoveDescription_SeismicToss[] = _("A gravity-fed throw\nthat causes damage\nmatching the user's\nlevel."); const u8 gMoveDescription_Strength[] = _("The foe is slugged\nat maximum power.\nCan also be used\nto move boulders."); const u8 gMoveDescription_Absorb[] = _("An attack that\nabsorbs half the\ndamage it inflicted\nto restore HP."); const u8 gMoveDescription_MegaDrain[] = _("A tough attack that\ndrains half the\ndamage it inflicted\nto restore HP."); const u8 gMoveDescription_LeechSeed[] = _("A seed is planted\non the foe to steal\nsome HP for the \nuser on every turn."); const u8 gMoveDescription_Growth[] = _("The user's body is\nforced to grow,\nraising the SP.\nATK stat."); const u8 gMoveDescription_RazorLeaf[] = _("The foe is hit with\na cutting leaf.\nIt has a high\ncritical-hit ratio."); const u8 gMoveDescription_SolarBeam[] = _("A 2-turn move that\nblasts the foe with\nabsorbed energy in\nthe 2nd turn."); const u8 gMoveDescription_PoisonPowder[] = _("A cloud of toxic\ndust is scattered.\nIt may poison the\nfoe."); const u8 gMoveDescription_StunSpore[] = _("Paralyzing dust is\nscattered wildly.\nIt may paralyze\nthe foe."); const u8 gMoveDescription_SleepPowder[] = _("A sleep-inducing\ndust is scattered\nin high volume\naround a foe."); const u8 gMoveDescription_PetalDance[] = _("The user attacks\nwith petals for two\nto three turns,\nthen gets confused."); const u8 gMoveDescription_StringShot[] = _("The foe is bound\nwith strings shot\nfrom the mouth to\nreduce its SPEED."); const u8 gMoveDescription_DragonRage[] = _("The foe is hit with\na shock wave that\nalways inflicts 40-\nHP damage."); const u8 gMoveDescription_FireSpin[] = _("The foe is trapped\nin an intense spiral\nof fire that rages\ntwo to five turns."); const u8 gMoveDescription_ThunderShock[] = _("An electric shock\nattack that may\nalso leave the foe\nparalyzed."); const u8 gMoveDescription_Thunderbolt[] = _("A strong electrical\nattack that may\nalso leave the foe\nparalyzed."); const u8 gMoveDescription_ThunderWave[] = _("A weak electric\nshock that is sure\nto cause paralysis\nif it hits."); const u8 gMoveDescription_Thunder[] = _("A brutal lightning\nattack that may\nalso leave the foe\nparalyzed."); const u8 gMoveDescription_RockThrow[] = _("The foe is attacked\nwith a shower of\nsmall, easily\nthrown rocks."); const u8 gMoveDescription_Earthquake[] = _("An earthquake that\nstrikes all POKéMON\nin battle excluding\nthe user."); const u8 gMoveDescription_Fissure[] = _("The foe is dropped\ninto a fissure.\nThe foe faints if it\nhits."); const u8 gMoveDescription_Dig[] = _("An attack that hits\non the 2nd turn.\nCan also be used\nto exit dungeons."); const u8 gMoveDescription_Toxic[] = _("A move that badly\npoisons the foe.\nIts poison damage\nworsens every turn."); const u8 gMoveDescription_Confusion[] = _("A weak telekinetic\nattack that may\nalso leave the foe\nconfused."); const u8 gMoveDescription_Psychic[] = _("A strong telekinetic\nattack. It may also\nlower the foe's\nSP. DEF stat."); const u8 gMoveDescription_Hypnosis[] = _("Hypnotic suggestion\nis used to make the\nfoe fall into a\ndeep sleep."); const u8 gMoveDescription_Meditate[] = _("The user meditates\nto awaken its power\nand raise its\nATTACK stat."); const u8 gMoveDescription_Agility[] = _("The user relaxes\nand lightens its\nbody to sharply\nboost its SPEED."); const u8 gMoveDescription_QuickAttack[] = _("An almost invisibly\nfast attack that\nis certain to strike\nfirst."); const u8 gMoveDescription_Rage[] = _("An attack that\nbecomes stronger\neach time the user\nis hit in battle."); const u8 gMoveDescription_Teleport[] = _("Use it to flee from\nany wild POKéMON.\nAlso warps to the\nlast POKé CENTER."); const u8 gMoveDescription_NightShade[] = _("An attack with a\nmirage that inflicts\ndamage matching\nthe user's level."); const u8 gMoveDescription_Mimic[] = _("The user copies the\nmove last used by\nthe foe for the\nrest of the battle."); const u8 gMoveDescription_Screech[] = _("An ear-splitting\nscreech is emitted\nto sharply reduce\nthe foe's DEFENSE."); const u8 gMoveDescription_DoubleTeam[] = _("The user creates\nillusory copies of\nitself to raise its\nevasiveness."); const u8 gMoveDescription_Recover[] = _("A self-healing move\nthat restores HP by\nup to half of the\nuser's maximum HP."); const u8 gMoveDescription_Harden[] = _("The user stiffens\nall the muscles in\nits body to raise\nits DEFENSE stat."); const u8 gMoveDescription_Minimize[] = _("The user compresses\nall the cells in its\nbody to raise its\nevasiveness."); const u8 gMoveDescription_Smokescreen[] = _("An obscuring cloud\nof smoke or ink\nreduces the foe's\naccuracy."); const u8 gMoveDescription_ConfuseRay[] = _("The foe is exposed\nto a sinister ray\nthat triggers\nconfusion."); const u8 gMoveDescription_Withdraw[] = _("The user withdraws\nits body in its hard\nshell, raising its\nDEFENSE stat."); const u8 gMoveDescription_DefenseCurl[] = _("The user curls up\nto conceal weak\nspots and raise its\nDEFENSE stat."); const u8 gMoveDescription_Barrier[] = _("The user creates a\nsturdy wall that\nsharply raises its\nDEFENSE stat."); const u8 gMoveDescription_LightScreen[] = _("A wall of light\ncuts damage from\nSP. ATK attacks\nfor five turns."); const u8 gMoveDescription_Haze[] = _("Eliminates all stat\nchanges among all\nPOKéMON engaged in\nbattle."); const u8 gMoveDescription_Reflect[] = _("A wall of light\ncuts damage from\nphysical attacks\nfor five turns."); const u8 gMoveDescription_FocusEnergy[] = _("The user takes a\ndeep breath and\nfocuses to raise its\ncritical-hit ratio."); const u8 gMoveDescription_Bide[] = _("The user endures\nattacks for two\nturns, then strikes\nback double."); const u8 gMoveDescription_Metronome[] = _("Waggles a finger\nand stimulates the\nbrain into using any\nmove at random."); const u8 gMoveDescription_MirrorMove[] = _("The user counters\nthe move last used\nby the foe with the\nsame move."); const u8 gMoveDescription_SelfDestruct[] = _("The user blows up\nto inflict severe\ndamage, even\nmaking itself faint."); const u8 gMoveDescription_EggBomb[] = _("A large egg is\nhurled with great\nforce at the foe to\ninflict damage."); const u8 gMoveDescription_Lick[] = _("The foe is licked\nand hit with a long\ntongue. It may\nalso paralyze."); const u8 gMoveDescription_Smog[] = _("The foe is attacked\nwith exhaust gases.\nIt may also poison\nthe foe."); const u8 gMoveDescription_Sludge[] = _("Toxic sludge is\nhurled at the foe.\nIt may poison the\ntarget."); const u8 gMoveDescription_BoneClub[] = _("The foe is clubbed\nwith a bone held in\nhand. It may make\nthe foe flinch."); const u8 gMoveDescription_FireBlast[] = _("The foe is hit with\nan intense flame.\nIt may leave the\ntarget with a burn."); const u8 gMoveDescription_Waterfall[] = _("A powerful charge\nattack. It can also\nbe used to climb\na waterfall."); const u8 gMoveDescription_Clamp[] = _("The foe is clamped\nand squeezed by\nthe user's shell for\ntwo to five turns."); const u8 gMoveDescription_Swift[] = _("Star-shaped rays\nthat never miss are\nfired at all foes in\nbattle."); const u8 gMoveDescription_SkullBash[] = _("The user raises its\nDEFENSE in the 1st\nturn, then attacks\nin the 2nd turn."); const u8 gMoveDescription_SpikeCannon[] = _("Sharp spikes are\nfired at the foe to\nstrike two to five\ntimes."); const u8 gMoveDescription_Constrict[] = _("The foe is attacked\nwith long tentacles\nor vines. It may\nlower SPEED."); const u8 gMoveDescription_Amnesia[] = _("Forgets about\nsomething and\nsharply raises\nSP. DEF."); const u8 gMoveDescription_Kinesis[] = _("The user distracts\nthe foe by bending\na spoon. It may\nlower accuracy."); const u8 gMoveDescription_SoftBoiled[] = _("Heals the user by\nup to half its full\nHP. It can be used\nto heal an ally."); const u8 gMoveDescription_HiJumpKick[] = _("A strong jumping\nknee kick. If it\nmisses, the user is\nhurt."); const u8 gMoveDescription_Glare[] = _("The user intimidates\nthe foe with the\ndesign on its belly\nto cause paralysis."); const u8 gMoveDescription_DreamEater[] = _("Absorbs half the\ndamage it inflicted\non a sleeping foe\nto restore HP."); const u8 gMoveDescription_PoisonGas[] = _("The foe is sprayed\nwith a cloud of\ntoxic gas that may\npoison the foe."); const u8 gMoveDescription_Barrage[] = _("Round objects are\nhurled at the foe\nto strike two to\nfive times."); const u8 gMoveDescription_LeechLife[] = _("An attack that\nabsorbs half the\ndamage it inflicted\nto restore HP."); const u8 gMoveDescription_LovelyKiss[] = _("The user forces a\nkiss on the foe\nwith a scary face\nthat induces sleep."); const u8 gMoveDescription_SkyAttack[] = _("A 2nd-turn attack\nmove with a high\ncritical-hit ratio.\nThe foe may flinch."); const u8 gMoveDescription_Transform[] = _("The user transforms\ninto a copy of the\nfoe with even the\nsame move set."); const u8 gMoveDescription_Bubble[] = _("A spray of bubbles\nhits the foe.\nIt may lower the\nfoe's SPEED stat."); const u8 gMoveDescription_DizzyPunch[] = _("The foe is hit with\na rhythmic punch\nthat may leave it\nconfused."); const u8 gMoveDescription_Spore[] = _("The user scatters\nbursts of fine\nspores that induce\nsleep."); const u8 gMoveDescription_Flash[] = _("A blast of light\nthat cuts the foe's\naccuracy. It also\nilluminates caves."); const u8 gMoveDescription_Psywave[] = _("The foe is attacked\nwith an odd, hot\nenergy wave that\nvaries in intensity."); const u8 gMoveDescription_Splash[] = _("The user just flops\nand splashes around\nwithout having any\neffect."); const u8 gMoveDescription_AcidArmor[] = _("The user alters its\ncells to liquefy\nitself and sharply\nraise DEFENSE."); const u8 gMoveDescription_Crabhammer[] = _("A large pincer is\nused to hammer the\nfoe. It has a high\ncritical-hit ratio."); const u8 gMoveDescription_Explosion[] = _("The user explodes\nto inflict terrible\ndamage even while\nfainting itself."); const u8 gMoveDescription_FurySwipes[] = _("The foe is raked\nwith sharp claws or\nscythes two to five\ntimes."); const u8 gMoveDescription_Bonemerang[] = _("The user throws a\nbone that hits the\nfoe once, then once\nagain on return."); const u8 gMoveDescription_Rest[] = _("The user sleeps for\ntwo turns to fully\nrestore HP and heal\nany status problem."); const u8 gMoveDescription_RockSlide[] = _("Large boulders are\nhurled at the foe.\nIt may make the\nfoe flinch."); const u8 gMoveDescription_HyperFang[] = _("The foe is attacked\nwith sharp fangs.\nIt may make the\nfoe flinch."); const u8 gMoveDescription_Sharpen[] = _("The user reduces\nits polygon count\nto sharpen edges\nand raise ATTACK."); const u8 gMoveDescription_Conversion[] = _("The user changes\nits type to match\nthe type of one of\nits moves."); const u8 gMoveDescription_TriAttack[] = _("A simultaneous\n3-beam attack that\nmay paralyze, burn,\nor freeze the foe."); const u8 gMoveDescription_SuperFang[] = _("The user attacks\nwith sharp fangs\nand halves the\nfoe's HP."); const u8 gMoveDescription_Slash[] = _("The foe is slashed\nwith claws, etc.\nIt has a high\ncritical-hit ratio."); const u8 gMoveDescription_Substitute[] = _("The user creates a\ndecoy using one-\nquarter of its full\nHP."); const u8 gMoveDescription_Struggle[] = _("An attack that is\nused only if there\nis no PP. It also\nhurts the user."); const u8 gMoveDescription_Sketch[] = _("This move copies\nthe move last used\nby the foe, then\ndisappears."); const u8 gMoveDescription_TripleKick[] = _("A 3-kick attack\nthat becomes more\npowerful with each\nsuccessive hit."); const u8 gMoveDescription_Thief[] = _("An attack that may\ntake the foe's held\nitem if the user\nisn't holding one."); const u8 gMoveDescription_SpiderWeb[] = _("Ensnares the foe \nwith sticky string\nso it doesn't flee\nor switch out."); const u8 gMoveDescription_MindReader[] = _("The user predicts\nthe foe's action to\nensure its next\nattack hits."); const u8 gMoveDescription_Nightmare[] = _("A sleeping foe is\nshown a nightmare\nthat inflicts some\ndamage every turn."); const u8 gMoveDescription_FlameWheel[] = _("The user makes a\nfiery charge at the\nfoe. It may cause\na burn."); const u8 gMoveDescription_Snore[] = _("An attack that can\nbe used only while\nasleep. It may\ncause flinching."); const u8 gMoveDescription_Curse[] = _("A move that works\ndifferently for the\nGHOST-type and all\nthe other types."); const u8 gMoveDescription_Flail[] = _("A desperate attack\nthat becomes more\npowerful the less\nHP the user has."); const u8 gMoveDescription_Conversion2[] = _("The user changes\ntype to make itself\nresistant to the\nlast attack it took."); const u8 gMoveDescription_Aeroblast[] = _("A vortex of air is\nshot at the foe.\nIt has a high\ncritical-hit ratio."); const u8 gMoveDescription_CottonSpore[] = _("Cotton-like spores\ncling to the foe,\nsharply reducing\nits SPEED stat."); const u8 gMoveDescription_Reversal[] = _("An all-out attack\nthat becomes more\npowerful the less\nHP the user has."); const u8 gMoveDescription_Spite[] = _("A move that cuts\n2 to 5 PP from the\nmove last used by\nthe foe."); const u8 gMoveDescription_PowderSnow[] = _("Blasts the foe with\na snowy gust.\nIt may cause\nfreezing."); const u8 gMoveDescription_Protect[] = _("Enables the user to\nevade all attacks.\nIt may fail if used\nin succession."); const u8 gMoveDescription_MachPunch[] = _("A punch thrown at\nblinding speed.\nIt is certain to\nstrike first."); const u8 gMoveDescription_ScaryFace[] = _("Frightens the foe\nwith a scary face\nto sharply reduce\nits SPEED."); const u8 gMoveDescription_FaintAttack[] = _("The user draws up\nclose to the foe\ndisarmingly, then\nhits without fail."); const u8 gMoveDescription_SweetKiss[] = _("The user kisses\nthe foe with sweet\ncuteness that\ncauses confusion."); const u8 gMoveDescription_BellyDrum[] = _("The user maximizes\nits ATTACK stat at\nthe cost of half\nits full HP."); const u8 gMoveDescription_SludgeBomb[] = _("Filthy sludge is\nhurled at the foe.\nIt may poison the\ntarget."); const u8 gMoveDescription_MudSlap[] = _("Mud is hurled in\nthe foe's face to\ninflict damage and\nlower its accuracy."); const u8 gMoveDescription_Octazooka[] = _("Ink is blasted in\nthe foe's face or\neyes to damage and\nlower accuracy."); const u8 gMoveDescription_Spikes[] = _("A trap of spikes is\nlaid around the\nfoe's party to hurt\nfoes switching in."); const u8 gMoveDescription_ZapCannon[] = _("An electric blast is\nfired like a cannon\nto inflict damage\nand paralyze."); const u8 gMoveDescription_Foresight[] = _("Completely negates\nthe foe's efforts to\nheighten its ability\nto evade."); const u8 gMoveDescription_DestinyBond[] = _("If the user faints,\nthe foe delivering\nthe final hit also\nfaints."); const u8 gMoveDescription_PerishSong[] = _("Any battler that\nhears this faints\nin three turns\nunless it switches."); const u8 gMoveDescription_IcyWind[] = _("A chilling wind is\nused to attack.\nIt also lowers the\nSPEED stat."); const u8 gMoveDescription_Detect[] = _("Enables the user to\nevade all attacks.\nIt may fail if used\nin succession."); const u8 gMoveDescription_BoneRush[] = _("The user strikes\nthe foe with a bone\nin hand two to five\ntimes."); const u8 gMoveDescription_LockOn[] = _("The user locks on\nto the foe, making\nthe next move sure\nto hit."); const u8 gMoveDescription_Outrage[] = _("The user thrashes\nabout for two to\nthree turns, then\nbecomes confused."); const u8 gMoveDescription_Sandstorm[] = _("A 5-turn sandstorm\nthat damages all\ntypes except ROCK,\nGROUND, and STEEL."); const u8 gMoveDescription_GigaDrain[] = _("A harsh attack that\nabsorbs half the\ndamage it inflicted\nto restore HP."); const u8 gMoveDescription_Endure[] = _("The user endures\nany hit with 1 HP\nleft. It may fail if\nused in succession."); const u8 gMoveDescription_Charm[] = _("The foe is charmed\nby the user's cute\nappeals, sharply\ncutting its ATTACK."); const u8 gMoveDescription_Rollout[] = _("A 5-turn rolling\nattack that becomes\nstronger each time\nit hits."); const u8 gMoveDescription_FalseSwipe[] = _("A restrained attack\nthat always leaves\nthe foe with at\nleast 1 HP."); const u8 gMoveDescription_Swagger[] = _("A move that makes\nthe foe confused,\nbut also sharply\nraises its ATTACK."); const u8 gMoveDescription_MilkDrink[] = _("Heals the user by\nup to half its full\nHP. It can be used\nto heal an ally."); const u8 gMoveDescription_Spark[] = _("An electrically\ncharged tackle that\nmay also paralyze\nthe foe."); const u8 gMoveDescription_FuryCutter[] = _("An attack that\ngrows stronger on\neach successive\nhit."); const u8 gMoveDescription_SteelWing[] = _("The foe is hit with\nwings of steel.\nIt may also raise\nthe user's DEFENSE."); const u8 gMoveDescription_MeanLook[] = _("The foe is fixed\nwith a mean look\nthat prevents it\nfrom escaping."); const u8 gMoveDescription_Attract[] = _("If it is the other\ngender, the foe is\nmade infatuated and\nunlikely to attack."); const u8 gMoveDescription_SleepTalk[] = _("While asleep, the\nuser randomly uses\none of the moves it\nknows."); const u8 gMoveDescription_HealBell[] = _("A soothing bell\nchimes to heal the\nstatus problems of\nall allies."); const u8 gMoveDescription_Return[] = _("This attack move\ngrows more powerful\nthe more the user\nlikes its TRAINER."); const u8 gMoveDescription_Present[] = _("The foe is given a\nbooby-trapped gift.\nIt restores HP\nsometimes, however."); const u8 gMoveDescription_Frustration[] = _("This attack move\ngrows more powerful\nthe less the user\nlikes its TRAINER."); const u8 gMoveDescription_Safeguard[] = _("It protects the\nuser's party from\nall status problems\nfor five turns."); const u8 gMoveDescription_PainSplit[] = _("The user adds its\nHP to the foe's HP,\nthen equally shares\nthe total HP."); const u8 gMoveDescription_SacredFire[] = _("A mystical and\npowerful fire\nattack that may\ninflict a burn."); const u8 gMoveDescription_Magnitude[] = _("A ground-shaking\nattack against all\nstanding POKéMON.\nIts power varies."); const u8 gMoveDescription_DynamicPunch[] = _("The foe is punched\nwith the user's full\npower. It confuses\nthe foe if it hits."); const u8 gMoveDescription_Megahorn[] = _("A brutal ramming\nattack delivered\nwith a tough and\nimpressive horn."); const u8 gMoveDescription_DragonBreath[] = _("The foe is hit with\nan incredible blast\nof breath that may\nalso paralyze."); const u8 gMoveDescription_BatonPass[] = _("The user switches\nout, passing along\nany stat changes\nto the new battler."); const u8 gMoveDescription_Encore[] = _("Makes the foe use\nthe move it last\nused repeatedly for\ntwo to six turns."); const u8 gMoveDescription_Pursuit[] = _("An attack move that\nworks especially\nwell on a foe that\nis switching out."); const u8 gMoveDescription_RapidSpin[] = _("An attack that\nfrees the user from\nBIND, WRAP, LEECH\nSEED, and SPIKES."); const u8 gMoveDescription_SweetScent[] = _("Allures the foe to\nreduce evasiveness.\nIt also attracts\nwild POKéMON."); const u8 gMoveDescription_IronTail[] = _("An attack with a\nsteel-hard tail.\nIt may lower the\nfoe's DEFENSE stat."); const u8 gMoveDescription_MetalClaw[] = _("The foe is attacked\nwith steel claws.\nIt may also raise\nthe user's ATTACK."); const u8 gMoveDescription_VitalThrow[] = _("Makes the user\nattack after the\nfoe. In return,\nit will not miss."); const u8 gMoveDescription_MorningSun[] = _("Restores the user's\nHP. The amount of\nHP regained varies\nwith the weather."); const u8 gMoveDescription_Synthesis[] = _("Restores the user's\nHP. The amount of\nHP regained varies\nwith the weather."); const u8 gMoveDescription_Moonlight[] = _("Restores the user's\nHP. The amount of\nHP regained varies\nwith the weather."); const u8 gMoveDescription_HiddenPower[] = _("An attack that\nvaries in type and\nintensity depending\non the user."); const u8 gMoveDescription_CrossChop[] = _("The foe is hit with\ndouble chops.\nIt has a high\ncritical-hit ratio."); const u8 gMoveDescription_Twister[] = _("A vicious twister\nattacks the foe.\nIt may make the\nfoe flinch."); const u8 gMoveDescription_RainDance[] = _("A heavy rain falls\nfor five turns,\npowering up WATER-\ntype moves."); const u8 gMoveDescription_SunnyDay[] = _("The sun blazes for\nfive turns, powering\nup FIRE-type\nmoves."); const u8 gMoveDescription_Crunch[] = _("The foe is crunched\nwith sharp fangs.\nIt may lower the\nfoe's SP. DEF."); const u8 gMoveDescription_MirrorCoat[] = _("A retaliation move\nthat pays back the\nfoe's special attack\ndouble."); const u8 gMoveDescription_PsychUp[] = _("The user hypnotizes\nitself into copying\nany stat change\nmade by the foe."); const u8 gMoveDescription_ExtremeSpeed[] = _("A blindingly speedy\ncharge attack that\nalways goes before\nany other."); const u8 gMoveDescription_AncientPower[] = _("An ancient power is\nused to attack. It\nmay also raise all\nthe user's stats."); const u8 gMoveDescription_ShadowBall[] = _("A shadowy blob is\nhurled at the foe.\nMay also lower the\nfoe's SP. DEF."); const u8 gMoveDescription_FutureSight[] = _("Two turns after\nthis move is used,\nthe foe is attacked\npsychically."); const u8 gMoveDescription_RockSmash[] = _("An attack that may\nalso cut DEFENSE.\nIt can also smash\ncracked boulders."); const u8 gMoveDescription_Whirlpool[] = _("The foe is trapped\nin a fast, vicious\nwhirlpool for two\nto five turns."); const u8 gMoveDescription_BeatUp[] = _("All party POKéMON\njoin in the attack.\nThe more allies,\nthe more damage."); const u8 gMoveDescription_FakeOut[] = _("An attack that hits\nfirst and causes\nflinching. Usable\nonly on 1st turn."); const u8 gMoveDescription_Uproar[] = _("The user attacks in\nan uproar that\nprevents sleep for\ntwo to five turns."); const u8 gMoveDescription_Stockpile[] = _("The user charges\nup power for use\nlater. It can be\nused three times."); const u8 gMoveDescription_SpitUp[] = _("The power built\nusing STOCKPILE is\nreleased at once\nfor attack."); const u8 gMoveDescription_Swallow[] = _("The energy it built\nusing STOCKPILE is\nabsorbed to restore\nHP."); const u8 gMoveDescription_HeatWave[] = _("The user exhales a\nheated breath to\nattack. It may also\ninflict a burn."); const u8 gMoveDescription_Hail[] = _("A hailstorm lasting\nfive turns damages\nall POKéMON except\nthe ICE-type."); const u8 gMoveDescription_Torment[] = _("It enrages the foe,\nmaking it incapable\nof using the same\nmove successively."); const u8 gMoveDescription_Flatter[] = _("Flattery is used to\nconfuse the foe,\nbut its SP. ATK\nalso rises."); const u8 gMoveDescription_WillOWisp[] = _("A sinister, bluish\nwhite flame is shot\nat the foe to\ninflict a burn."); const u8 gMoveDescription_Memento[] = _("The user faints,\nbut sharply lowers\nthe foe's ATTACK\nand SP. ATK."); const u8 gMoveDescription_Facade[] = _("An attack that is\nboosted if user is\nburned, poisoned,\nor paralyzed."); const u8 gMoveDescription_FocusPunch[] = _("An attack that is\nexecuted last.\nThe user flinches\nif hit beforehand."); const u8 gMoveDescription_SmellingSalt[] = _("Doubly effective on\na paralyzed foe,\nbut it also cures\nthe foe's paralysis."); const u8 gMoveDescription_FollowMe[] = _("The user draws\nattention to itself,\nmaking foes attack\nonly the user."); const u8 gMoveDescription_NaturePower[] = _("An attack that\nchanges type\ndepending on the\nuser's location."); const u8 gMoveDescription_Charge[] = _("The user charges\npower to boost the\nELECTRIC move it\nuses next."); const u8 gMoveDescription_Taunt[] = _("The foe is taunted\ninto a rage that\nallows it to use\nonly attack moves."); const u8 gMoveDescription_HelpingHand[] = _("A move that boosts\nthe power of the\nally's attack in a\nbattle."); const u8 gMoveDescription_Trick[] = _("A move that tricks\nthe foe into\ntrading held items\nwith the user."); const u8 gMoveDescription_RolePlay[] = _("The user mimics the\nfoe completely and\ncopies the foe's\nability."); const u8 gMoveDescription_Wish[] = _("A self-healing move\nthat restores half\nthe full HP on the\nnext turn."); const u8 gMoveDescription_Assist[] = _("The user randomly\npicks and uses a\nmove of an allied\nPOKéMON."); const u8 gMoveDescription_Ingrain[] = _("The user lays roots\nthat restore HP on\nevery turn.\nIt can't switch out."); const u8 gMoveDescription_Superpower[] = _("A powerful attack,\nbut it also lowers\nthe user's ATTACK\nand DEFENSE stats."); const u8 gMoveDescription_MagicCoat[] = _("Reflects back the\nfoe's LEECH SEED\nand any status-\ndamaging move."); const u8 gMoveDescription_Recycle[] = _("A move that\nrecycles a used\nitem for use once\nmore."); const u8 gMoveDescription_Revenge[] = _("An attack move that\ngains in intensity if\nthe target has hurt\nthe user."); const u8 gMoveDescription_BrickBreak[] = _("An attack that also\nbreaks any barrier\nlike LIGHT SCREEN\nand REFLECT."); const u8 gMoveDescription_Yawn[] = _("A huge yawn lulls\nthe foe into falling\nasleep on the next\nturn."); const u8 gMoveDescription_KnockOff[] = _("Knocks down the\nfoe's held item to\nprevent its use\nduring the battle."); const u8 gMoveDescription_Endeavor[] = _("Gains power the\nfewer HP the user\nhas compared with\nthe foe."); const u8 gMoveDescription_Eruption[] = _("The higher the\nuser's HP, the more\npowerful this\nattack becomes."); const u8 gMoveDescription_SkillSwap[] = _("The user employs\nits psychic power\nto swap abilities\nwith the foe."); const u8 gMoveDescription_Imprison[] = _("Prevents foes from\nusing any move\nthat is also known\nby the user."); const u8 gMoveDescription_Refresh[] = _("A self-healing move\nthat cures the user\nof a poisoning,\nburn, or paralysis."); const u8 gMoveDescription_Grudge[] = _("If the user faints,\nthis move deletes\nthe PP of the move\nthat finished it."); const u8 gMoveDescription_Snatch[] = _("Steals the effects\nof the foe's\nhealing or status-\nchanging move."); const u8 gMoveDescription_SecretPower[] = _("An attack that may\nhave an additional\neffect that varies\nwith the terrain."); const u8 gMoveDescription_Dive[] = _("The user dives\nunderwater on the\nfirst turn and\nstrikes next turn."); const u8 gMoveDescription_ArmThrust[] = _("A quick flurry of\nstraight-arm\npunches that hit\ntwo to five times."); const u8 gMoveDescription_Camouflage[] = _("Alters the user's\ntype depending on\nthe location's\nterrain."); const u8 gMoveDescription_TailGlow[] = _("The user flashes a\nlight that sharply\nraises its SP. ATK\nstat."); const u8 gMoveDescription_LusterPurge[] = _("A burst of light\ninjures the foe. It\nmay also lower the\nfoe's SP. DEF."); const u8 gMoveDescription_MistBall[] = _("A flurry of down\nhits the foe. It\nmay also lower the\nfoe's SP. ATK."); const u8 gMoveDescription_FeatherDance[] = _("The foe is covered\nwith a mass of down\nthat sharply cuts\nthe ATTACK stat."); const u8 gMoveDescription_TeeterDance[] = _("A wobbly dance\nthat confuses all\nthe POKéMON in\nbattle."); const u8 gMoveDescription_BlazeKick[] = _("A fiery kick with a\nhigh critical-hit\nratio. It may also\nburn the foe."); const u8 gMoveDescription_MudSport[] = _("Weakens ELECTRIC-\ntype attacks while\nthe user is in the\nbattle."); const u8 gMoveDescription_IceBall[] = _("A 5-turn rolling\nattack that becomes\nstronger each time\nit rolls."); const u8 gMoveDescription_NeedleArm[] = _("An attack using\nthorny arms.\nIt may make the\nfoe flinch."); const u8 gMoveDescription_SlackOff[] = _("The user slacks off\nand restores its HP\nby half its full\nHP."); const u8 gMoveDescription_HyperVoice[] = _("The user lets loose\na horribly loud\nshout with the\npower to damage."); const u8 gMoveDescription_PoisonFang[] = _("The foe is bitten\nwith toxic fangs.\nIt may also badly\npoison the foe."); const u8 gMoveDescription_CrushClaw[] = _("The foe is attacked\nwith sharp claws.\nIt may also lower\nthe foe's DEFENSE."); const u8 gMoveDescription_BlastBurn[] = _("The foe is hit with\na huge explosion.\nThe user can't move\non the next turn."); const u8 gMoveDescription_HydroCannon[] = _("The foe is hit with\na watery cannon.\nThe user can't move\non the next turn."); const u8 gMoveDescription_MeteorMash[] = _("The foe is hit with\na hard, fast punch.\nIt may also raise\nthe user's ATTACK."); const u8 gMoveDescription_Astonish[] = _("An attack using a\nstartling shout.\nIt also may make\nthe foe flinch."); const u8 gMoveDescription_WeatherBall[] = _("An attack that\nvaries in power and\ntype depending on\nthe weather."); const u8 gMoveDescription_Aromatherapy[] = _("A soothing scent is\nreleased to heal\nall status problems\nin the user's party."); const u8 gMoveDescription_FakeTears[] = _("The user feigns\ncrying to sharply\nlower the foe's\nSP. DEF stat."); const u8 gMoveDescription_AirCutter[] = _("The foe is hit with\nrazor-like wind.\nIt has a high\ncritical-hit ratio."); const u8 gMoveDescription_Overheat[] = _("An intense attack\nthat also sharply\nreduces the user's\nSP. ATK stat."); const u8 gMoveDescription_OdorSleuth[] = _("Completely negates\nthe foe's efforts to\nheighten its ability\nto evade."); const u8 gMoveDescription_RockTomb[] = _("Boulders are hurled\nat the foe. It also\nlowers the foe's\nSPEED if it hits."); const u8 gMoveDescription_SilverWind[] = _("The foe is attacked\nwith a silver dust.\nIt may raise all\nthe user's stats."); const u8 gMoveDescription_MetalSound[] = _("A horrible metallic\nscreech is used to\nsharply lower the\nfoe's SP. DEF."); const u8 gMoveDescription_GrassWhistle[] = _("A pleasant melody\nis played to lull\nthe foe into a deep\nsleep."); const u8 gMoveDescription_Tickle[] = _("The foe is made to\nlaugh, reducing its\nATTACK and DEFENSE\nstats."); const u8 gMoveDescription_CosmicPower[] = _("The user absorbs a\nmystic power to\nraise its DEFENSE\nand SP. DEF."); const u8 gMoveDescription_WaterSpout[] = _("The higher the\nuser's HP, the more\npowerful this\nattack becomes."); const u8 gMoveDescription_SignalBeam[] = _("The foe is hit with\na flashing beam\nthat may also\ncause confusion."); const u8 gMoveDescription_ShadowPunch[] = _("The user throws a\npunch from the\nshadows. It cannot\nbe evaded."); const u8 gMoveDescription_Extrasensory[] = _("The user attacks\nwith an odd power\nthat may make the\nfoe flinch."); const u8 gMoveDescription_SkyUppercut[] = _("The user attacks\nwith an uppercut\nthrown skywards\nwith force."); const u8 gMoveDescription_SandTomb[] = _("The foe is trapped\ninside a painful\nsandstorm for two\nto five turns."); const u8 gMoveDescription_SheerCold[] = _("The foe is attacked\nwith ultimate cold\nthat causes fainting\nif it hits."); const u8 gMoveDescription_MuddyWater[] = _("The user attacks\nwith muddy water.\nIt may also lower\nthe foe's accuracy."); const u8 gMoveDescription_BulletSeed[] = _("The user shoots\nseeds at the foe.\nTwo to five seeds\nare shot at once."); const u8 gMoveDescription_AerialAce[] = _("An extremely fast\nattack against one\ntarget. It can't be\nevaded."); const u8 gMoveDescription_IcicleSpear[] = _("Sharp icicles are\nfired at the foe.\nIt strikes two to\nfive times."); const u8 gMoveDescription_IronDefense[] = _("The user hardens\nits body's surface\nto sharply raise its\nDEFENSE stat."); const u8 gMoveDescription_Block[] = _("The user blocks the\nfoe's way with arms\nspread wide to\nprevent escape."); const u8 gMoveDescription_Howl[] = _("The user howls to\nraise its spirit and\nboost its ATTACK\nstat."); const u8 gMoveDescription_DragonClaw[] = _("Sharp, huge claws\nhook and slash the\nfoe quickly and\nwith great power."); const u8 gMoveDescription_FrenzyPlant[] = _("The foe is hit with\nan enormous branch.\nThe user can't move\non the next turn."); const u8 gMoveDescription_BulkUp[] = _("The user bulks up\nits body to boost\nboth its ATTACK and\nDEFENSE stats."); const u8 gMoveDescription_Bounce[] = _("The user bounces\non the foe on the\n2nd turn. It may\nparalyze the foe."); const u8 gMoveDescription_MudShot[] = _("The user attacks by\nhurling mud.\nIt also reduces the\nfoe's SPEED."); const u8 gMoveDescription_PoisonTail[] = _("An attack with a\nhigh critical-hit\nratio. It may also\npoison the foe."); const u8 gMoveDescription_Covet[] = _("A cutely executed\nattack that also\nsteals the foe's\nhold item."); const u8 gMoveDescription_VoltTackle[] = _("The user throws an\nelectrified tackle.\nIt hurts the user\na little."); const u8 gMoveDescription_MagicalLeaf[] = _("The foe is attacked\nwith a strange leaf\nthat cannot be\nevaded."); const u8 gMoveDescription_WaterSport[] = _("Weakens FIRE-type\nattacks while the\nuser is in the\nbattle."); const u8 gMoveDescription_CalmMind[] = _("The user focuses\nits mind to raise\nthe SP. ATK and\nSP. DEF stats."); const u8 gMoveDescription_LeafBlade[] = _("The foe is slashed\nwith a sharp leaf.\nIt has a high\ncritical-hit ratio."); const u8 gMoveDescription_DragonDance[] = _("A mystic, powerful\ndance that boosts\nthe user's ATTACK\nand SPEED stats."); const u8 gMoveDescription_RockBlast[] = _("The user hurls two\nto five hard rocks\nat the foe to\nattack."); const u8 gMoveDescription_ShockWave[] = _("A rapid jolt of\nelectricity strikes\nthe foe. It can't\nbe evaded."); const u8 gMoveDescription_WaterPulse[] = _("An attack with a\npulsing blast of\nwater. It may also\nconfuse the foe."); const u8 gMoveDescription_DoomDesire[] = _("A move that attacks\nthe foe with a\nblast of light two\nturns after use."); const u8 gMoveDescription_PsychoBoost[] = _("An intense attack\nthat also sharply\nreduces the user's\nSP. ATK stat."); const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = { [MOVE_POUND - 1] = gMoveDescription_Pound, [MOVE_KARATE_CHOP - 1] = gMoveDescription_KarateChop, [MOVE_DOUBLE_SLAP - 1] = gMoveDescription_DoubleSlap, [MOVE_COMET_PUNCH - 1] = gMoveDescription_CometPunch, [MOVE_MEGA_PUNCH - 1] = gMoveDescription_MegaPunch, [MOVE_PAY_DAY - 1] = gMoveDescription_PayDay, [MOVE_FIRE_PUNCH - 1] = gMoveDescription_FirePunch, [MOVE_ICE_PUNCH - 1] = gMoveDescription_IcePunch, [MOVE_THUNDER_PUNCH - 1] = gMoveDescription_ThunderPunch, [MOVE_SCRATCH - 1] = gMoveDescription_Scratch, [MOVE_VICE_GRIP - 1] = gMoveDescription_ViceGrip, [MOVE_GUILLOTINE - 1] = gMoveDescription_Guillotine, [MOVE_RAZOR_WIND - 1] = gMoveDescription_RazorWind, [MOVE_SWORDS_DANCE - 1] = gMoveDescription_SwordsDance, [MOVE_CUT - 1] = gMoveDescription_Cut, [MOVE_GUST - 1] = gMoveDescription_Gust, [MOVE_WING_ATTACK - 1] = gMoveDescription_WingAttack, [MOVE_WHIRLWIND - 1] = gMoveDescription_Whirlwind, [MOVE_FLY - 1] = gMoveDescription_Fly, [MOVE_BIND - 1] = gMoveDescription_Bind, [MOVE_SLAM - 1] = gMoveDescription_Slam, [MOVE_VINE_WHIP - 1] = gMoveDescription_VineWhip, [MOVE_STOMP - 1] = gMoveDescription_Stomp, [MOVE_DOUBLE_KICK - 1] = gMoveDescription_DoubleKick, [MOVE_MEGA_KICK - 1] = gMoveDescription_MegaKick, [MOVE_JUMP_KICK - 1] = gMoveDescription_JumpKick, [MOVE_ROLLING_KICK - 1] = gMoveDescription_RollingKick, [MOVE_SAND_ATTACK - 1] = gMoveDescription_SandAttack, [MOVE_HEADBUTT - 1] = gMoveDescription_Headbutt, [MOVE_HORN_ATTACK - 1] = gMoveDescription_HornAttack, [MOVE_FURY_ATTACK - 1] = gMoveDescription_FuryAttack, [MOVE_HORN_DRILL - 1] = gMoveDescription_HornDrill, [MOVE_TACKLE - 1] = gMoveDescription_Tackle, [MOVE_BODY_SLAM - 1] = gMoveDescription_BodySlam, [MOVE_WRAP - 1] = gMoveDescription_Wrap, [MOVE_TAKE_DOWN - 1] = gMoveDescription_TakeDown, [MOVE_THRASH - 1] = gMoveDescription_Thrash, [MOVE_DOUBLE_EDGE - 1] = gMoveDescription_DoubleEdge, [MOVE_TAIL_WHIP - 1] = gMoveDescription_TailWhip, [MOVE_POISON_STING - 1] = gMoveDescription_PoisonSting, [MOVE_TWINEEDLE - 1] = gMoveDescription_Twineedle, [MOVE_PIN_MISSILE - 1] = gMoveDescription_PinMissile, [MOVE_LEER - 1] = gMoveDescription_Leer, [MOVE_BITE - 1] = gMoveDescription_Bite, [MOVE_GROWL - 1] = gMoveDescription_Growl, [MOVE_ROAR - 1] = gMoveDescription_Roar, [MOVE_SING - 1] = gMoveDescription_Sing, [MOVE_SUPERSONIC - 1] = gMoveDescription_Supersonic, [MOVE_SONIC_BOOM - 1] = gMoveDescription_SonicBoom, [MOVE_DISABLE - 1] = gMoveDescription_Disable, [MOVE_ACID - 1] = gMoveDescription_Acid, [MOVE_EMBER - 1] = gMoveDescription_Ember, [MOVE_FLAMETHROWER - 1] = gMoveDescription_Flamethrower, [MOVE_MIST - 1] = gMoveDescription_Mist, [MOVE_WATER_GUN - 1] = gMoveDescription_WaterGun, [MOVE_HYDRO_PUMP - 1] = gMoveDescription_HydroPump, [MOVE_SURF - 1] = gMoveDescription_Surf, [MOVE_ICE_BEAM - 1] = gMoveDescription_IceBeam, [MOVE_BLIZZARD - 1] = gMoveDescription_Blizzard, [MOVE_PSYBEAM - 1] = gMoveDescription_Psybeam, [MOVE_BUBBLE_BEAM - 1] = gMoveDescription_BubbleBeam, [MOVE_AURORA_BEAM - 1] = gMoveDescription_AuroraBeam, [MOVE_HYPER_BEAM - 1] = gMoveDescription_HyperBeam, [MOVE_PECK - 1] = gMoveDescription_Peck, [MOVE_DRILL_PECK - 1] = gMoveDescription_DrillPeck, [MOVE_SUBMISSION - 1] = gMoveDescription_Submission, [MOVE_LOW_KICK - 1] = gMoveDescription_LowKick, [MOVE_COUNTER - 1] = gMoveDescription_Counter, [MOVE_SEISMIC_TOSS - 1] = gMoveDescription_SeismicToss, [MOVE_STRENGTH - 1] = gMoveDescription_Strength, [MOVE_ABSORB - 1] = gMoveDescription_Absorb, [MOVE_MEGA_DRAIN - 1] = gMoveDescription_MegaDrain, [MOVE_LEECH_SEED - 1] = gMoveDescription_LeechSeed, [MOVE_GROWTH - 1] = gMoveDescription_Growth, [MOVE_RAZOR_LEAF - 1] = gMoveDescription_RazorLeaf, [MOVE_SOLAR_BEAM - 1] = gMoveDescription_SolarBeam, [MOVE_POISON_POWDER - 1] = gMoveDescription_PoisonPowder, [MOVE_STUN_SPORE - 1] = gMoveDescription_StunSpore, [MOVE_SLEEP_POWDER - 1] = gMoveDescription_SleepPowder, [MOVE_PETAL_DANCE - 1] = gMoveDescription_PetalDance, [MOVE_STRING_SHOT - 1] = gMoveDescription_StringShot, [MOVE_DRAGON_RAGE - 1] = gMoveDescription_DragonRage, [MOVE_FIRE_SPIN - 1] = gMoveDescription_FireSpin, [MOVE_THUNDER_SHOCK - 1] = gMoveDescription_ThunderShock, [MOVE_THUNDERBOLT - 1] = gMoveDescription_Thunderbolt, [MOVE_THUNDER_WAVE - 1] = gMoveDescription_ThunderWave, [MOVE_THUNDER - 1] = gMoveDescription_Thunder, [MOVE_ROCK_THROW - 1] = gMoveDescription_RockThrow, [MOVE_EARTHQUAKE - 1] = gMoveDescription_Earthquake, [MOVE_FISSURE - 1] = gMoveDescription_Fissure, [MOVE_DIG - 1] = gMoveDescription_Dig, [MOVE_TOXIC - 1] = gMoveDescription_Toxic, [MOVE_CONFUSION - 1] = gMoveDescription_Confusion, [MOVE_PSYCHIC - 1] = gMoveDescription_Psychic, [MOVE_HYPNOSIS - 1] = gMoveDescription_Hypnosis, [MOVE_MEDITATE - 1] = gMoveDescription_Meditate, [MOVE_AGILITY - 1] = gMoveDescription_Agility, [MOVE_QUICK_ATTACK - 1] = gMoveDescription_QuickAttack, [MOVE_RAGE - 1] = gMoveDescription_Rage, [MOVE_TELEPORT - 1] = gMoveDescription_Teleport, [MOVE_NIGHT_SHADE - 1] = gMoveDescription_NightShade, [MOVE_MIMIC - 1] = gMoveDescription_Mimic, [MOVE_SCREECH - 1] = gMoveDescription_Screech, [MOVE_DOUBLE_TEAM - 1] = gMoveDescription_DoubleTeam, [MOVE_RECOVER - 1] = gMoveDescription_Recover, [MOVE_HARDEN - 1] = gMoveDescription_Harden, [MOVE_MINIMIZE - 1] = gMoveDescription_Minimize, [MOVE_SMOKESCREEN - 1] = gMoveDescription_Smokescreen, [MOVE_CONFUSE_RAY - 1] = gMoveDescription_ConfuseRay, [MOVE_WITHDRAW - 1] = gMoveDescription_Withdraw, [MOVE_DEFENSE_CURL - 1] = gMoveDescription_DefenseCurl, [MOVE_BARRIER - 1] = gMoveDescription_Barrier, [MOVE_LIGHT_SCREEN - 1] = gMoveDescription_LightScreen, [MOVE_HAZE - 1] = gMoveDescription_Haze, [MOVE_REFLECT - 1] = gMoveDescription_Reflect, [MOVE_FOCUS_ENERGY - 1] = gMoveDescription_FocusEnergy, [MOVE_BIDE - 1] = gMoveDescription_Bide, [MOVE_METRONOME - 1] = gMoveDescription_Metronome, [MOVE_MIRROR_MOVE - 1] = gMoveDescription_MirrorMove, [MOVE_SELF_DESTRUCT - 1] = gMoveDescription_SelfDestruct, [MOVE_EGG_BOMB - 1] = gMoveDescription_EggBomb, [MOVE_LICK - 1] = gMoveDescription_Lick, [MOVE_SMOG - 1] = gMoveDescription_Smog, [MOVE_SLUDGE - 1] = gMoveDescription_Sludge, [MOVE_BONE_CLUB - 1] = gMoveDescription_BoneClub, [MOVE_FIRE_BLAST - 1] = gMoveDescription_FireBlast, [MOVE_WATERFALL - 1] = gMoveDescription_Waterfall, [MOVE_CLAMP - 1] = gMoveDescription_Clamp, [MOVE_SWIFT - 1] = gMoveDescription_Swift, [MOVE_SKULL_BASH - 1] = gMoveDescription_SkullBash, [MOVE_SPIKE_CANNON - 1] = gMoveDescription_SpikeCannon, [MOVE_CONSTRICT - 1] = gMoveDescription_Constrict, [MOVE_AMNESIA - 1] = gMoveDescription_Amnesia, [MOVE_KINESIS - 1] = gMoveDescription_Kinesis, [MOVE_SOFT_BOILED - 1] = gMoveDescription_SoftBoiled, [MOVE_HI_JUMP_KICK - 1] = gMoveDescription_HiJumpKick, [MOVE_GLARE - 1] = gMoveDescription_Glare, [MOVE_DREAM_EATER - 1] = gMoveDescription_DreamEater, [MOVE_POISON_GAS - 1] = gMoveDescription_PoisonGas, [MOVE_BARRAGE - 1] = gMoveDescription_Barrage, [MOVE_LEECH_LIFE - 1] = gMoveDescription_LeechLife, [MOVE_LOVELY_KISS - 1] = gMoveDescription_LovelyKiss, [MOVE_SKY_ATTACK - 1] = gMoveDescription_SkyAttack, [MOVE_TRANSFORM - 1] = gMoveDescription_Transform, [MOVE_BUBBLE - 1] = gMoveDescription_Bubble, [MOVE_DIZZY_PUNCH - 1] = gMoveDescription_DizzyPunch, [MOVE_SPORE - 1] = gMoveDescription_Spore, [MOVE_FLASH - 1] = gMoveDescription_Flash, [MOVE_PSYWAVE - 1] = gMoveDescription_Psywave, [MOVE_SPLASH - 1] = gMoveDescription_Splash, [MOVE_ACID_ARMOR - 1] = gMoveDescription_AcidArmor, [MOVE_CRABHAMMER - 1] = gMoveDescription_Crabhammer, [MOVE_EXPLOSION - 1] = gMoveDescription_Explosion, [MOVE_FURY_SWIPES - 1] = gMoveDescription_FurySwipes, [MOVE_BONEMERANG - 1] = gMoveDescription_Bonemerang, [MOVE_REST - 1] = gMoveDescription_Rest, [MOVE_ROCK_SLIDE - 1] = gMoveDescription_RockSlide, [MOVE_HYPER_FANG - 1] = gMoveDescription_HyperFang, [MOVE_SHARPEN - 1] = gMoveDescription_Sharpen, [MOVE_CONVERSION - 1] = gMoveDescription_Conversion, [MOVE_TRI_ATTACK - 1] = gMoveDescription_TriAttack, [MOVE_SUPER_FANG - 1] = gMoveDescription_SuperFang, [MOVE_SLASH - 1] = gMoveDescription_Slash, [MOVE_SUBSTITUTE - 1] = gMoveDescription_Substitute, [MOVE_STRUGGLE - 1] = gMoveDescription_Struggle, [MOVE_SKETCH - 1] = gMoveDescription_Sketch, [MOVE_TRIPLE_KICK - 1] = gMoveDescription_TripleKick, [MOVE_THIEF - 1] = gMoveDescription_Thief, [MOVE_SPIDER_WEB - 1] = gMoveDescription_SpiderWeb, [MOVE_MIND_READER - 1] = gMoveDescription_MindReader, [MOVE_NIGHTMARE - 1] = gMoveDescription_Nightmare, [MOVE_FLAME_WHEEL - 1] = gMoveDescription_FlameWheel, [MOVE_SNORE - 1] = gMoveDescription_Snore, [MOVE_CURSE - 1] = gMoveDescription_Curse, [MOVE_FLAIL - 1] = gMoveDescription_Flail, [MOVE_CONVERSION_2 - 1] = gMoveDescription_Conversion2, [MOVE_AEROBLAST - 1] = gMoveDescription_Aeroblast, [MOVE_COTTON_SPORE - 1] = gMoveDescription_CottonSpore, [MOVE_REVERSAL - 1] = gMoveDescription_Reversal, [MOVE_SPITE - 1] = gMoveDescription_Spite, [MOVE_POWDER_SNOW - 1] = gMoveDescription_PowderSnow, [MOVE_PROTECT - 1] = gMoveDescription_Protect, [MOVE_MACH_PUNCH - 1] = gMoveDescription_MachPunch, [MOVE_SCARY_FACE - 1] = gMoveDescription_ScaryFace, [MOVE_FAINT_ATTACK - 1] = gMoveDescription_FaintAttack, [MOVE_SWEET_KISS - 1] = gMoveDescription_SweetKiss, [MOVE_BELLY_DRUM - 1] = gMoveDescription_BellyDrum, [MOVE_SLUDGE_BOMB - 1] = gMoveDescription_SludgeBomb, [MOVE_MUD_SLAP - 1] = gMoveDescription_MudSlap, [MOVE_OCTAZOOKA - 1] = gMoveDescription_Octazooka, [MOVE_SPIKES - 1] = gMoveDescription_Spikes, [MOVE_ZAP_CANNON - 1] = gMoveDescription_ZapCannon, [MOVE_FORESIGHT - 1] = gMoveDescription_Foresight, [MOVE_DESTINY_BOND - 1] = gMoveDescription_DestinyBond, [MOVE_PERISH_SONG - 1] = gMoveDescription_PerishSong, [MOVE_ICY_WIND - 1] = gMoveDescription_IcyWind, [MOVE_DETECT - 1] = gMoveDescription_Detect, [MOVE_BONE_RUSH - 1] = gMoveDescription_BoneRush, [MOVE_LOCK_ON - 1] = gMoveDescription_LockOn, [MOVE_OUTRAGE - 1] = gMoveDescription_Outrage, [MOVE_SANDSTORM - 1] = gMoveDescription_Sandstorm, [MOVE_GIGA_DRAIN - 1] = gMoveDescription_GigaDrain, [MOVE_ENDURE - 1] = gMoveDescription_Endure, [MOVE_CHARM - 1] = gMoveDescription_Charm, [MOVE_ROLLOUT - 1] = gMoveDescription_Rollout, [MOVE_FALSE_SWIPE - 1] = gMoveDescription_FalseSwipe, [MOVE_SWAGGER - 1] = gMoveDescription_Swagger, [MOVE_MILK_DRINK - 1] = gMoveDescription_MilkDrink, [MOVE_SPARK - 1] = gMoveDescription_Spark, [MOVE_FURY_CUTTER - 1] = gMoveDescription_FuryCutter, [MOVE_STEEL_WING - 1] = gMoveDescription_SteelWing, [MOVE_MEAN_LOOK - 1] = gMoveDescription_MeanLook, [MOVE_ATTRACT - 1] = gMoveDescription_Attract, [MOVE_SLEEP_TALK - 1] = gMoveDescription_SleepTalk, [MOVE_HEAL_BELL - 1] = gMoveDescription_HealBell, [MOVE_RETURN - 1] = gMoveDescription_Return, [MOVE_PRESENT - 1] = gMoveDescription_Present, [MOVE_FRUSTRATION - 1] = gMoveDescription_Frustration, [MOVE_SAFEGUARD - 1] = gMoveDescription_Safeguard, [MOVE_PAIN_SPLIT - 1] = gMoveDescription_PainSplit, [MOVE_SACRED_FIRE - 1] = gMoveDescription_SacredFire, [MOVE_MAGNITUDE - 1] = gMoveDescription_Magnitude, [MOVE_DYNAMIC_PUNCH - 1] = gMoveDescription_DynamicPunch, [MOVE_MEGAHORN - 1] = gMoveDescription_Megahorn, [MOVE_DRAGON_BREATH - 1] = gMoveDescription_DragonBreath, [MOVE_BATON_PASS - 1] = gMoveDescription_BatonPass, [MOVE_ENCORE - 1] = gMoveDescription_Encore, [MOVE_PURSUIT - 1] = gMoveDescription_Pursuit, [MOVE_RAPID_SPIN - 1] = gMoveDescription_RapidSpin, [MOVE_SWEET_SCENT - 1] = gMoveDescription_SweetScent, [MOVE_IRON_TAIL - 1] = gMoveDescription_IronTail, [MOVE_METAL_CLAW - 1] = gMoveDescription_MetalClaw, [MOVE_VITAL_THROW - 1] = gMoveDescription_VitalThrow, [MOVE_MORNING_SUN - 1] = gMoveDescription_MorningSun, [MOVE_SYNTHESIS - 1] = gMoveDescription_Synthesis, [MOVE_MOONLIGHT - 1] = gMoveDescription_Moonlight, [MOVE_HIDDEN_POWER - 1] = gMoveDescription_HiddenPower, [MOVE_CROSS_CHOP - 1] = gMoveDescription_CrossChop, [MOVE_TWISTER - 1] = gMoveDescription_Twister, [MOVE_RAIN_DANCE - 1] = gMoveDescription_RainDance, [MOVE_SUNNY_DAY - 1] = gMoveDescription_SunnyDay, [MOVE_CRUNCH - 1] = gMoveDescription_Crunch, [MOVE_MIRROR_COAT - 1] = gMoveDescription_MirrorCoat, [MOVE_PSYCH_UP - 1] = gMoveDescription_PsychUp, [MOVE_EXTREME_SPEED - 1] = gMoveDescription_ExtremeSpeed, [MOVE_ANCIENT_POWER - 1] = gMoveDescription_AncientPower, [MOVE_SHADOW_BALL - 1] = gMoveDescription_ShadowBall, [MOVE_FUTURE_SIGHT - 1] = gMoveDescription_FutureSight, [MOVE_ROCK_SMASH - 1] = gMoveDescription_RockSmash, [MOVE_WHIRLPOOL - 1] = gMoveDescription_Whirlpool, [MOVE_BEAT_UP - 1] = gMoveDescription_BeatUp, [MOVE_FAKE_OUT - 1] = gMoveDescription_FakeOut, [MOVE_UPROAR - 1] = gMoveDescription_Uproar, [MOVE_STOCKPILE - 1] = gMoveDescription_Stockpile, [MOVE_SPIT_UP - 1] = gMoveDescription_SpitUp, [MOVE_SWALLOW - 1] = gMoveDescription_Swallow, [MOVE_HEAT_WAVE - 1] = gMoveDescription_HeatWave, [MOVE_HAIL - 1] = gMoveDescription_Hail, [MOVE_TORMENT - 1] = gMoveDescription_Torment, [MOVE_FLATTER - 1] = gMoveDescription_Flatter, [MOVE_WILL_O_WISP - 1] = gMoveDescription_WillOWisp, [MOVE_MEMENTO - 1] = gMoveDescription_Memento, [MOVE_FACADE - 1] = gMoveDescription_Facade, [MOVE_FOCUS_PUNCH - 1] = gMoveDescription_FocusPunch, [MOVE_SMELLING_SALT - 1] = gMoveDescription_SmellingSalt, [MOVE_FOLLOW_ME - 1] = gMoveDescription_FollowMe, [MOVE_NATURE_POWER - 1] = gMoveDescription_NaturePower, [MOVE_CHARGE - 1] = gMoveDescription_Charge, [MOVE_TAUNT - 1] = gMoveDescription_Taunt, [MOVE_HELPING_HAND - 1] = gMoveDescription_HelpingHand, [MOVE_TRICK - 1] = gMoveDescription_Trick, [MOVE_ROLE_PLAY - 1] = gMoveDescription_RolePlay, [MOVE_WISH - 1] = gMoveDescription_Wish, [MOVE_ASSIST - 1] = gMoveDescription_Assist, [MOVE_INGRAIN - 1] = gMoveDescription_Ingrain, [MOVE_SUPERPOWER - 1] = gMoveDescription_Superpower, [MOVE_MAGIC_COAT - 1] = gMoveDescription_MagicCoat, [MOVE_RECYCLE - 1] = gMoveDescription_Recycle, [MOVE_REVENGE - 1] = gMoveDescription_Revenge, [MOVE_BRICK_BREAK - 1] = gMoveDescription_BrickBreak, [MOVE_YAWN - 1] = gMoveDescription_Yawn, [MOVE_KNOCK_OFF - 1] = gMoveDescription_KnockOff, [MOVE_ENDEAVOR - 1] = gMoveDescription_Endeavor, [MOVE_ERUPTION - 1] = gMoveDescription_Eruption, [MOVE_SKILL_SWAP - 1] = gMoveDescription_SkillSwap, [MOVE_IMPRISON - 1] = gMoveDescription_Imprison, [MOVE_REFRESH - 1] = gMoveDescription_Refresh, [MOVE_GRUDGE - 1] = gMoveDescription_Grudge, [MOVE_SNATCH - 1] = gMoveDescription_Snatch, [MOVE_SECRET_POWER - 1] = gMoveDescription_SecretPower, [MOVE_DIVE - 1] = gMoveDescription_Dive, [MOVE_ARM_THRUST - 1] = gMoveDescription_ArmThrust, [MOVE_CAMOUFLAGE - 1] = gMoveDescription_Camouflage, [MOVE_TAIL_GLOW - 1] = gMoveDescription_TailGlow, [MOVE_LUSTER_PURGE - 1] = gMoveDescription_LusterPurge, [MOVE_MIST_BALL - 1] = gMoveDescription_MistBall, [MOVE_FEATHER_DANCE - 1] = gMoveDescription_FeatherDance, [MOVE_TEETER_DANCE - 1] = gMoveDescription_TeeterDance, [MOVE_BLAZE_KICK - 1] = gMoveDescription_BlazeKick, [MOVE_MUD_SPORT - 1] = gMoveDescription_MudSport, [MOVE_ICE_BALL - 1] = gMoveDescription_IceBall, [MOVE_NEEDLE_ARM - 1] = gMoveDescription_NeedleArm, [MOVE_SLACK_OFF - 1] = gMoveDescription_SlackOff, [MOVE_HYPER_VOICE - 1] = gMoveDescription_HyperVoice, [MOVE_POISON_FANG - 1] = gMoveDescription_PoisonFang, [MOVE_CRUSH_CLAW - 1] = gMoveDescription_CrushClaw, [MOVE_BLAST_BURN - 1] = gMoveDescription_BlastBurn, [MOVE_HYDRO_CANNON - 1] = gMoveDescription_HydroCannon, [MOVE_METEOR_MASH - 1] = gMoveDescription_MeteorMash, [MOVE_ASTONISH - 1] = gMoveDescription_Astonish, [MOVE_WEATHER_BALL - 1] = gMoveDescription_WeatherBall, [MOVE_AROMATHERAPY - 1] = gMoveDescription_Aromatherapy, [MOVE_FAKE_TEARS - 1] = gMoveDescription_FakeTears, [MOVE_AIR_CUTTER - 1] = gMoveDescription_AirCutter, [MOVE_OVERHEAT - 1] = gMoveDescription_Overheat, [MOVE_ODOR_SLEUTH - 1] = gMoveDescription_OdorSleuth, [MOVE_ROCK_TOMB - 1] = gMoveDescription_RockTomb, [MOVE_SILVER_WIND - 1] = gMoveDescription_SilverWind, [MOVE_METAL_SOUND - 1] = gMoveDescription_MetalSound, [MOVE_GRASS_WHISTLE - 1] = gMoveDescription_GrassWhistle, [MOVE_TICKLE - 1] = gMoveDescription_Tickle, [MOVE_COSMIC_POWER - 1] = gMoveDescription_CosmicPower, [MOVE_WATER_SPOUT - 1] = gMoveDescription_WaterSpout, [MOVE_SIGNAL_BEAM - 1] = gMoveDescription_SignalBeam, [MOVE_SHADOW_PUNCH - 1] = gMoveDescription_ShadowPunch, [MOVE_EXTRASENSORY - 1] = gMoveDescription_Extrasensory, [MOVE_SKY_UPPERCUT - 1] = gMoveDescription_SkyUppercut, [MOVE_SAND_TOMB - 1] = gMoveDescription_SandTomb, [MOVE_SHEER_COLD - 1] = gMoveDescription_SheerCold, [MOVE_MUDDY_WATER - 1] = gMoveDescription_MuddyWater, [MOVE_BULLET_SEED - 1] = gMoveDescription_BulletSeed, [MOVE_AERIAL_ACE - 1] = gMoveDescription_AerialAce, [MOVE_ICICLE_SPEAR - 1] = gMoveDescription_IcicleSpear, [MOVE_IRON_DEFENSE - 1] = gMoveDescription_IronDefense, [MOVE_BLOCK - 1] = gMoveDescription_Block, [MOVE_HOWL - 1] = gMoveDescription_Howl, [MOVE_DRAGON_CLAW - 1] = gMoveDescription_DragonClaw, [MOVE_FRENZY_PLANT - 1] = gMoveDescription_FrenzyPlant, [MOVE_BULK_UP - 1] = gMoveDescription_BulkUp, [MOVE_BOUNCE - 1] = gMoveDescription_Bounce, [MOVE_MUD_SHOT - 1] = gMoveDescription_MudShot, [MOVE_POISON_TAIL - 1] = gMoveDescription_PoisonTail, [MOVE_COVET - 1] = gMoveDescription_Covet, [MOVE_VOLT_TACKLE - 1] = gMoveDescription_VoltTackle, [MOVE_MAGICAL_LEAF - 1] = gMoveDescription_MagicalLeaf, [MOVE_WATER_SPORT - 1] = gMoveDescription_WaterSport, [MOVE_CALM_MIND - 1] = gMoveDescription_CalmMind, [MOVE_LEAF_BLADE - 1] = gMoveDescription_LeafBlade, [MOVE_DRAGON_DANCE - 1] = gMoveDescription_DragonDance, [MOVE_ROCK_BLAST - 1] = gMoveDescription_RockBlast, [MOVE_SHOCK_WAVE - 1] = gMoveDescription_ShockWave, [MOVE_WATER_PULSE - 1] = gMoveDescription_WaterPulse, [MOVE_DOOM_DESIRE - 1] = gMoveDescription_DoomDesire, [MOVE_PSYCHO_BOOST - 1] = gMoveDescription_PsychoBoost, }; ================================================ FILE: src/multiboot.c ================================================ #include "global.h" #include "multiboot.h" static u16 MultiBoot_required_data[MULTIBOOT_NCHILD]; static int MultiBootSend(struct MultiBootParam *mp, u16 data); static int MultiBootHandShake(struct MultiBootParam *mp); static void MultiBootWaitCycles(u32 cycles); static void MultiBootWaitSendDone(void); void MultiBootInit(struct MultiBootParam *mp) { mp->client_bit = 0; mp->probe_count = 0; mp->response_bit = 0; mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT; mp->sendflag = 0; mp->handshake_timeout = 0; REG_RCNT = 0; REG_SIOCNT = SIO_MULTI_MODE | SIO_115200_BPS; REG_SIODATA8 = 0; } int MultiBootMain(struct MultiBootParam *mp) { int i, j, k; if (MultiBootCheckComplete(mp)) { return 0; } if (mp->check_wait > MULTIBOOT_CONNECTION_CHECK_WAIT) { mp->check_wait--; return 0; } output_burst: if (mp->sendflag) { mp->sendflag = 0; i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_ERROR | SIO_ID | SIO_MULTI_SD | SIO_MULTI_SI); if (i != SIO_MULTI_SD) { MultiBootInit(mp); return i ^ SIO_MULTI_SD; } } if (mp->probe_count >= 0xe0) { i = MultiBootHandShake(mp); if (i) { return i; } if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK && mp->probe_count > 0xe1 && MultiBootCheckComplete(mp) == 0) { MultiBootWaitSendDone(); goto output_burst; } if (MultiBootCheckComplete(mp) == 0) { if (mp->handshake_timeout == 0) { MultiBootInit(mp); return MULTIBOOT_ERROR_HANDSHAKE_FAILURE; } mp->handshake_timeout--; } return 0; } switch (mp->probe_count) { case 0: k = 0x0e; for (i = MULTIBOOT_NCHILD; i != 0; i--) { if (*(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2) != 0xffff) { break; } k >>= 1; } k &= 0x0e; mp->response_bit = k; for (i = MULTIBOOT_NCHILD; i != 0; i--) { j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); if (mp->client_bit & (1 << i)) { if (j != ((MULTIBOOT_CLIENT_INFO << 8) | (1 << i))) { k = 0; break; } } } mp->client_bit &= k; if (k == 0) { mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT; } if (mp->check_wait) { mp->check_wait--; } else { if (mp->response_bit != mp->client_bit) { MultiBootStartProbe(mp); goto case_1; } } output_master_info: return MultiBootSend(mp, (MULTIBOOT_MASTER_INFO << 8) | mp->client_bit); case_1: case 1: mp->probe_target_bit = 0; for (i = MULTIBOOT_NCHILD; i != 0; i--) { j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); if ((j >> 8) == MULTIBOOT_CLIENT_INFO) { MultiBoot_required_data[i - 1] = j; j &= 0xff; if (j == (1 << i)) { mp->probe_target_bit |= j; } } } if (mp->response_bit != mp->probe_target_bit) { goto output_master_info; } mp->probe_count = 2; return MultiBootSend(mp, (MULTIBOOT_MASTER_START_PROBE << 8) | mp->probe_target_bit); case 2: for (i = MULTIBOOT_NCHILD; i != 0; i--) { if (mp->probe_target_bit & (1 << i)) { j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); if (j != MultiBoot_required_data[i - 1]) { mp->probe_target_bit ^= 1 << i; } } } goto output_header; case 0xd0: k = 1; for (i = MULTIBOOT_NCHILD; i != 0; i--) { j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); mp->client_data[i - 1] = j; if (mp->probe_target_bit & (1 << i)) { if ((j >> 8) != MULTIBOOT_CLIENT_INFO && (j >> 8) != MULTIBOOT_CLIENT_DLREADY) { MultiBootInit(mp); return MULTIBOOT_ERROR_NO_DLREADY; } if (j == MultiBoot_required_data[i - 1]) { k = 0; } } } if (k == 0) { return MultiBootSend(mp, (MULTIBOOT_MASTER_REQUEST_DLREADY << 8) | mp->palette_data); } mp->probe_count = 0xd1; k = 0x11; for (i = MULTIBOOT_NCHILD; i != 0; i--) { k += mp->client_data[i - 1]; } mp->handshake_data = k; return MultiBootSend(mp, (MULTIBOOT_MASTER_START_DL << 8) | (k & 0xff)); case 0xd1: for (i = MULTIBOOT_NCHILD; i != 0; i--) { j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); if (mp->probe_target_bit & (1 << i)) { if ((j >> 8) != MULTIBOOT_CLIENT_DLREADY) { MultiBootInit(mp); return MULTIBOOT_ERROR_NO_DLREADY; } } } i = MultiBoot(mp); if (i == 0) { mp->probe_count = 0xe0; mp->handshake_timeout = MULTIBOOT_HANDSHAKE_TIMEOUT; return 0; } MultiBootInit(mp); mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT * 2; return MULTIBOOT_ERROR_BOOT_FAILURE; default: for (i = MULTIBOOT_NCHILD; i != 0; i--) { if (mp->probe_target_bit & (1 << i)) { j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); if ((j >> 8) != (MULTIBOOT_MASTER_START_PROBE + 1 - (mp->probe_count >> 1)) || ((j & 0xff) != (1 << i))) { mp->probe_target_bit ^= 1 << i; } } } if (mp->probe_count == 0xc4) { mp->client_bit = mp->probe_target_bit & 0x0e; mp->probe_count = 0; goto output_master_info; } output_header: if (mp->probe_target_bit == 0) { MultiBootInit(mp); return MULTIBOOT_ERROR_NO_PROBE_TARGET; } mp->probe_count += 2; if (mp->probe_count == 0xc4) { goto output_master_info; } i = MultiBootSend(mp, (mp->masterp[mp->probe_count - 4 + 1] << 8) | mp->masterp[mp->probe_count - 4]); if (i) { return i; } if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK) { MultiBootWaitSendDone(); goto output_burst; } return 0; } } static int MultiBootSend(struct MultiBootParam *mp, u16 data) { int i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_MULTI_SD | SIO_MULTI_SI); if (i != SIO_MULTI_SD) { MultiBootInit(mp); return i ^ SIO_MULTI_SD; } REG_SIODATA8 = data; REG_SIOCNT = SIO_MULTI_MODE | SIO_START | SIO_115200_BPS; mp->sendflag = 1; return 0; } void MultiBootStartProbe(struct MultiBootParam *mp) { if (mp->probe_count != 0) { MultiBootInit(mp); return; } mp->check_wait = 0; mp->client_bit = 0; mp->probe_count = 1; } void MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed) { int i = 0; if (mp->probe_count != 0 || mp->client_bit == 0 || mp->check_wait != 0) { MultiBootInit(mp); return; } mp->boot_srcp = srcp; length = (length + 15) & ~15; if (length < MULTIBOOT_SEND_SIZE_MIN || length > MULTIBOOT_SEND_SIZE_MAX) { MultiBootInit(mp); return; } mp->boot_endp = srcp + length; switch (palette_speed) { case -4: case -3: case -2: case -1: i = (palette_color << 3) | (3 - palette_speed); break; case 0: i = 0x38 | palette_color; break; case 1: case 2: case 3: case 4: i = (palette_color << 3) | (palette_speed - 1); break; } mp->palette_data = ((i & 0x3f) << 1) | 0x81; mp->probe_count = 0xd0; } bool32 MultiBootCheckComplete(struct MultiBootParam *mp) { if (mp->probe_count == 0xe9) return 1; else return 0; } static int MultiBootHandShake(struct MultiBootParam *mp) { int i, j; #define send_data (mp->system_work[0]) #define must_data (mp->system_work[1]) switch (mp->probe_count) { case_0xe0: case 0xe0: mp->probe_count = 0xe1; must_data = 0x0000; send_data = 0x100000; return MultiBootSend(mp, 0x0000); default: for (i = MULTIBOOT_NCHILD; i != 0; i--) { j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); if ((mp->client_bit & (1 << i)) && j != must_data) { goto case_0xe0; } } mp->probe_count++; must_data = send_data & 0xffff; if (send_data == 0x0000) { must_data = mp->masterp[0xac] | (mp->masterp[0xad] << 8); send_data = must_data << 5; } send_data >>= 5; output_common: return MultiBootSend(mp, send_data); case 0xe7: case 0xe8: for (i = MULTIBOOT_NCHILD; i != 0; i--) { j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); if ((mp->client_bit & (1 << i)) && j != must_data) { MultiBootInit(mp); return MULTIBOOT_ERROR_HANDSHAKE_FAILURE; } } mp->probe_count++; if (mp->probe_count == 0xe9) { return 0; } send_data = mp->masterp[0xae] | (mp->masterp[0xaf] << 8); must_data = send_data; goto output_common; } #undef send_data #undef must_data } static NOINLINE void MultiBootWaitCycles(u32 cycles) { asm("mov r2, pc"); asm("lsr r2, #24"); asm("mov r1, #12"); asm("cmp r2, #0x02"); asm("beq MultiBootWaitCyclesLoop"); asm("mov r1, #13"); asm("cmp r2, #0x08"); asm("beq MultiBootWaitCyclesLoop"); asm("mov r1, #4"); asm("MultiBootWaitCyclesLoop:"); asm("sub r0, r1"); asm("bgt MultiBootWaitCyclesLoop"); } static void MultiBootWaitSendDone(void) { int i; for (i = 0; (i < 31069) && (REG_SIOCNT & SIO_START); i++); MultiBootWaitCycles(600); } ================================================ FILE: src/mystery_event_msg.c ================================================ #include "global.h" const u8 gText_MysteryGiftBerry[] = _("Obtained a {STR_VAR_2} BERRY!\nDad has it at PETALBURG GYM."); const u8 gText_MysteryGiftBerryTransform[] = _("The {STR_VAR_1} BERRY transformed into\none {STR_VAR_2} BERRY."); const u8 gText_MysteryGiftBerryObtained[] = _("The {STR_VAR_1} BERRY has already been\nobtained."); const u8 gText_MysteryGiftSpecialRibbon[] = _("A special RIBBON was awarded to\nyour party POKéMON."); const u8 gText_MysteryGiftNationalDex[] = _("The POKéDEX has been upgraded\nwith the NATIONAL MODE."); const u8 gText_MysteryGiftRareWord[] = _("A rare word has been added."); const u8 gText_MysteryGiftSentOver[] = _("{STR_VAR_1} was sent over!"); const u8 gText_MysteryGiftFullParty[] = _("Your party is full.\n{STR_VAR_1} could not be sent over."); const u8 gText_MysteryGiftNewTrainer[] = _("A new TRAINER has arrived in\nHOENN."); const u8 gText_MysteryGiftCantBeUsed[] = _("This data can't be used in\nthis version."); ================================================ FILE: src/mystery_event_script.c ================================================ #include "global.h" #include "gflib.h" #include "berry.h" #include "battle_tower.h" #include "easy_chat.h" #include "event_data.h" #include "mail_data.h" #include "mystery_event_script.h" #include "pokedex.h" #include "pokemon_size_record.h" #include "script.h" #include "strings.h" #include "util.h" #include "mystery_event_msg.h" #include "pokemon_storage_system.h" extern ScrCmdFunc gMysteryEventScriptCmdTable[]; extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[]; #define LANGUAGE_MASK 0x1 #define VERSION_MASK 0x1 EWRAM_DATA static struct ScriptContext sMysteryEventScriptContext = {0}; static bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4) { if (!(a1 & LANGUAGE_MASK)) return FALSE; if (!(a2 & LANGUAGE_MASK)) return FALSE; if (!(a3 & 0x1)) return FALSE; if (!(a4 & VERSION_MASK)) return FALSE; return TRUE; } static void SetIncompatible(void) { StringExpandPlaceholders(gStringVar4, gText_MysteryGiftCantBeUsed); SetMysteryEventScriptStatus(3); } static void InitMysteryEventScript(struct ScriptContext *ctx, u8 *script) { InitScriptContext(ctx, gMysteryEventScriptCmdTable, gMysteryEventScriptCmdTableEnd); SetupBytecodeScript(ctx, script); ctx->data[0] = (u32)script; ctx->data[1] = 0; ctx->data[2] = 0; ctx->data[3] = 0; } static bool32 RunMysteryEventScriptCommand(struct ScriptContext *ctx) { if (RunScriptCommand(ctx) && ctx->data[3]) return TRUE; else return FALSE; } void MEventScript_InitContext(u8 *script) { InitMysteryEventScript(&sMysteryEventScriptContext, script); } bool32 MEventScript_Run(u32 *a0) { bool32 ret = RunMysteryEventScriptCommand(&sMysteryEventScriptContext); *a0 = sMysteryEventScriptContext.data[2]; return ret; } u32 RunMysteryEventScript(u8 *script) { u32 ret; MEventScript_InitContext(script); while (MEventScript_Run(&ret)); return ret; } void SetMysteryEventScriptStatus(u32 val) { sMysteryEventScriptContext.data[2] = val; } bool8 MEScrCmd_end(struct ScriptContext *ctx) { StopScript(ctx); return TRUE; } bool8 MEScrCmd_checkcompat(struct ScriptContext *ctx) { u16 v1; u32 v2; u16 v3; u32 v4; ctx->data[1] = ScriptReadWord(ctx); v1 = ScriptReadHalfword(ctx); v2 = ScriptReadWord(ctx); v3 = ScriptReadHalfword(ctx); v4 = ScriptReadWord(ctx); if (CheckCompatibility(v1, v2, v3, v4) == TRUE) ctx->data[3] = 1; else SetIncompatible(); return TRUE; } bool8 MEScrCmd_nop(struct ScriptContext *ctx) { return FALSE; } bool8 MEScrCmd_setstatus(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); ctx->data[2] = value; return FALSE; } bool8 MEScrCmd_setmsg(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); u8 *str = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); if (value == 0xFF || value == ctx->data[2]) StringExpandPlaceholders(gStringVar4, str); return FALSE; } bool8 MEScrCmd_runscript(struct ScriptContext *ctx) { u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); RunScriptImmediately(script); return FALSE; } bool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx) { u8 *str; const u8 *message; bool32 haveBerry = IsEnigmaBerryValid(); u8 *berry = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); StringCopyN(gStringVar1, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_LENGTH + 1); SetEnigmaBerry(berry); StringCopyN(gStringVar2, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_LENGTH + 1); if (!haveBerry) { str = gStringVar4; message = gText_MysteryGiftBerry; } else if (StringCompare(gStringVar1, gStringVar2)) { str = gStringVar4; message = gText_MysteryGiftBerryTransform; } else { str = gStringVar4; message = gText_MysteryGiftBerryObtained; } StringExpandPlaceholders(str, message); ctx->data[2] = 2; if (IsEnigmaBerryValid() == TRUE) VarSet(VAR_ENIGMA_BERRY_AVAILABLE, 1); else ctx->data[2] = 1; return FALSE; } bool8 MEScrCmd_giveribbon(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); u8 ribbonId = ScriptReadByte(ctx); GiveGiftRibbonToParty(index, ribbonId); StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSpecialRibbon); ctx->data[2] = 2; return FALSE; } bool8 MEScrCmd_initramscript(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 objectId = ScriptReadByte(ctx); u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); u8 *scriptEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); InitRamScript(script, scriptEnd - script, mapGroup, mapNum, objectId); return FALSE; } bool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx) { EnableNationalPokedex(); StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNationalDex); ctx->data[2] = 2; return FALSE; } bool8 MEScrCmd_addrareword(struct ScriptContext *ctx) { EnableRareWord(ScriptReadByte(ctx)); StringExpandPlaceholders(gStringVar4, gText_MysteryGiftRareWord); ctx->data[2] = 2; return FALSE; } bool8 MEScrCmd_setrecordmixinggift(struct ScriptContext *ctx) { SetIncompatible(); ctx->data[3] = 0; return TRUE; } bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) { struct Mail mail; struct Pokemon pokemon; u16 species; u16 heldItem; u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; void *pokemonPtr = (void *)data; void *mailPtr = (void *)(data + sizeof(struct Pokemon)); pokemon = *(struct Pokemon *)pokemonPtr; species = GetMonData(&pokemon, MON_DATA_SPECIES_OR_EGG); if (species == SPECIES_EGG) StringCopyN(gStringVar1, gText_EggNickname, POKEMON_NAME_LENGTH + 1); else StringCopyN(gStringVar1, gText_MenuPokemon, POKEMON_NAME_LENGTH + 1); if (gPlayerPartyCount == PARTY_SIZE) { StringExpandPlaceholders(gStringVar4, gText_MysteryGiftFullParty); ctx->data[2] = 3; } else { memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon)); memcpy(&mail, mailPtr, sizeof(struct Mail)); if (species != SPECIES_EGG) { u16 pokedexNum = SpeciesToNationalPokedexNum(species); GetSetPokedexFlag(pokedexNum, FLAG_SET_SEEN); GetSetPokedexFlag(pokedexNum, FLAG_SET_CAUGHT); } heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM); if (ItemIsMail(heldItem)) GiveMailToMon2(&gPlayerParty[5], &mail); CompactPartySlots(); CalculatePlayerPartyCount(); StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSentOver); ctx->data[2] = 2; } return FALSE; } bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx) { u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; memcpy(&gSaveBlock2Ptr->battleTower.ereaderTrainer, (void *)data, sizeof(struct BattleTowerEReaderTrainer)); ValidateEReaderTrainer(); StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNewTrainer); ctx->data[2] = 2; return FALSE; } bool8 MEScrCmd_enableresetrtc(struct ScriptContext *ctx) { SetIncompatible(); ctx->data[3] = 0; return TRUE; } bool8 MEScrCmd_checksum(struct ScriptContext *ctx) { int checksum = ScriptReadWord(ctx); u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); if (checksum != CalcByteArraySum(data, dataEnd - data)) { ctx->data[3] = 0; ctx->data[2] = 1; } return TRUE; } bool8 MEScrCmd_crc(struct ScriptContext *ctx) { int crc = ScriptReadWord(ctx); u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); if (crc != CalcCRC16(data, dataEnd - data)) { ctx->data[3] = 0; ctx->data[2] = 1; } return TRUE; } ================================================ FILE: src/mystery_gift.c ================================================ #include "global.h" #include "gflib.h" #include "constants/songs.h" #include "easy_chat.h" #include "task.h" #include "link.h" #include "link_rfu.h" #include "util.h" #include "script.h" #include "event_data.h" #include "battle_tower.h" #include "new_game.h" #include "wonder_news.h" #include "mystery_gift_menu.h" #include "help_system.h" #include "mystery_gift.h" #include "strings.h" #define CALC_CRC(data) CalcCRC16WithTable((void *)&(data), sizeof(data)) static bool32 ValidateWonderNews(const struct WonderNews * src); static void ClearSavedWonderNews(void); static void ClearSavedWonderNewsMetadata(void); static bool32 ValidateWonderCard(const struct WonderCard * src); static void ClearSavedWonderCard(void); static void ClearSavedWonderCardMetadata(void); static void IncrementCardStatForNewTrainer(u32 eventId, u32 trainerId, u32 *idsList, s32 count); static void ClearSavedTrainerIds(void); static const u16 sReceivedGiftFlags[] = { FLAG_RECEIVED_AURORA_TICKET, FLAG_RECEIVED_MYSTIC_TICKET, FLAG_RECEIVED_OLD_SEA_MAP, // Not used until Emerald FLAG_WONDER_CARD_UNUSED_1, FLAG_WONDER_CARD_UNUSED_2, FLAG_WONDER_CARD_UNUSED_3, FLAG_WONDER_CARD_UNUSED_4, FLAG_WONDER_CARD_UNUSED_5, FLAG_WONDER_CARD_UNUSED_6, FLAG_WONDER_CARD_UNUSED_7, FLAG_WONDER_CARD_UNUSED_8, FLAG_WONDER_CARD_UNUSED_9, FLAG_WONDER_CARD_UNUSED_10, FLAG_WONDER_CARD_UNUSED_11, FLAG_WONDER_CARD_UNUSED_12, FLAG_WONDER_CARD_UNUSED_13, FLAG_WONDER_CARD_UNUSED_14, FLAG_WONDER_CARD_UNUSED_15, FLAG_WONDER_CARD_UNUSED_16, FLAG_WONDER_CARD_UNUSED_17 }; static EWRAM_DATA bool32 sStatsEnabled = FALSE; void ClearMysteryGift(void) { CpuFill32(0, &gSaveBlock1Ptr->mysteryGift, sizeof(gSaveBlock1Ptr->mysteryGift)); ClearSavedWonderNewsMetadata(); InitQuestionnaireWords(); } struct WonderNews * GetSavedWonderNews(void) { return &gSaveBlock1Ptr->mysteryGift.news; } struct WonderCard * GetSavedWonderCard(void) { return &gSaveBlock1Ptr->mysteryGift.card; } struct WonderCardMetadata * GetSavedWonderCardMetadata(void) { return &gSaveBlock1Ptr->mysteryGift.cardMetadata; } struct WonderNewsMetadata * GetSavedWonderNewsMetadata(void) { return &gSaveBlock1Ptr->mysteryGift.newsMetadata; } u16 * GetQuestionnaireWordsPtr(void) { return gSaveBlock1Ptr->mysteryGift.questionnaireWords; } // Equivalent to ClearSavedWonderCardAndRelated, but nothing else to clear void ClearSavedWonderNewsAndRelated(void) { ClearSavedWonderNews(); } bool32 SaveWonderNews(const struct WonderNews * news) { if (!ValidateWonderNews(news)) return FALSE; ClearSavedWonderNews(); gSaveBlock1Ptr->mysteryGift.news = *news; gSaveBlock1Ptr->mysteryGift.newsCrc = CALC_CRC(gSaveBlock1Ptr->mysteryGift.news); return TRUE; } bool32 ValidateSavedWonderNews(void) { if (CALC_CRC(gSaveBlock1Ptr->mysteryGift.news) != gSaveBlock1Ptr->mysteryGift.newsCrc) return FALSE; if (!ValidateWonderNews(&gSaveBlock1Ptr->mysteryGift.news)) return FALSE; return TRUE; } static bool32 ValidateWonderNews(const struct WonderNews * news) { if (news->id == 0) return FALSE; return TRUE; } bool32 IsSendingSavedWonderNewsAllowed(void) { const struct WonderNews * news = &gSaveBlock1Ptr->mysteryGift.news; if (news->sendType == SEND_TYPE_DISALLOWED) return FALSE; return TRUE; } static void ClearSavedWonderNews(void) { CpuFill32(0, GetSavedWonderNews(), sizeof(gSaveBlock1Ptr->mysteryGift.news)); gSaveBlock1Ptr->mysteryGift.newsCrc = 0; } static void ClearSavedWonderNewsMetadata(void) { CpuFill32(0, GetSavedWonderNewsMetadata(), sizeof(gSaveBlock1Ptr->mysteryGift.newsMetadata)); WonderNews_Reset(); } bool32 IsWonderNewsSameAsSaved(const u8 * news) { const u8 * savedNews = (const u8 *)&gSaveBlock1Ptr->mysteryGift.news; u32 i; if (!ValidateSavedWonderNews()) return FALSE; for (i = 0; i < sizeof(gSaveBlock1Ptr->mysteryGift.news); i++) { if (savedNews[i] != news[i]) return FALSE; } return TRUE; } void ClearSavedWonderCardAndRelated(void) { ClearSavedWonderCard(); ClearSavedWonderCardMetadata(); ClearSavedTrainerIds(); ClearRamScript(); ClearMysteryGiftFlags(); ClearMysteryGiftVars(); ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer); } bool32 SaveWonderCard(const struct WonderCard * card) { struct WonderCardMetadata * metadata; if (!ValidateWonderCard(card)) return FALSE; ClearSavedWonderCardAndRelated(); memcpy(&gSaveBlock1Ptr->mysteryGift.card, card, sizeof(struct WonderCard)); gSaveBlock1Ptr->mysteryGift.cardCrc = CALC_CRC(gSaveBlock1Ptr->mysteryGift.card); metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata; metadata->iconSpecies = (&gSaveBlock1Ptr->mysteryGift.card)->iconSpecies; return TRUE; } bool32 ValidateSavedWonderCard(void) { if (gSaveBlock1Ptr->mysteryGift.cardCrc != CALC_CRC(gSaveBlock1Ptr->mysteryGift.card)) return FALSE; if (!ValidateWonderCard(&gSaveBlock1Ptr->mysteryGift.card)) return FALSE; if (!ValidateRamScript()) return FALSE; return TRUE; } static bool32 ValidateWonderCard(const struct WonderCard * card) { if (card->flagId == 0) return FALSE; if (card->type >= CARD_TYPE_COUNT) return FALSE; if (!(card->sendType == SEND_TYPE_DISALLOWED || card->sendType == SEND_TYPE_ALLOWED || card->sendType == SEND_TYPE_ALLOWED_ALWAYS)) return FALSE; if (card->bgType >= NUM_WONDER_BGS) return FALSE; if (card->maxStamps > MAX_STAMP_CARD_STAMPS) return FALSE; return TRUE; } bool32 IsSendingSavedWonderCardAllowed(void) { const struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; if (card->sendType == SEND_TYPE_DISALLOWED) return FALSE; return TRUE; } static void ClearSavedWonderCard(void) { CpuFill32(0, &gSaveBlock1Ptr->mysteryGift.card, sizeof(gSaveBlock1Ptr->mysteryGift.card)); gSaveBlock1Ptr->mysteryGift.cardCrc = 0; } static void ClearSavedWonderCardMetadata(void) { CpuFill32(0, GetSavedWonderCardMetadata(), sizeof(gSaveBlock1Ptr->mysteryGift.cardMetadata)); gSaveBlock1Ptr->mysteryGift.cardMetadataCrc = 0; } u16 GetWonderCardFlagId(void) { if (ValidateSavedWonderCard()) return gSaveBlock1Ptr->mysteryGift.card.flagId; return 0; } void DisableWonderCardSending(struct WonderCard * card) { if (card->sendType == SEND_TYPE_ALLOWED) card->sendType = SEND_TYPE_DISALLOWED; } static bool32 IsWonderCardFlagIDInValidRange(u16 flagId) { if (flagId >= WONDER_CARD_FLAG_OFFSET && flagId < WONDER_CARD_FLAG_OFFSET + NUM_WONDER_CARD_FLAGS) return TRUE; return FALSE; } bool32 IsSavedWonderCardGiftNotReceived(void) { u16 value = GetWonderCardFlagId(); if (!IsWonderCardFlagIDInValidRange(value)) return FALSE; // If flag is set, player has received gift from this card if (FlagGet(sReceivedGiftFlags[value - WONDER_CARD_FLAG_OFFSET]) == TRUE) return FALSE; return TRUE; } static s32 GetNumStampsInMetadata(const struct WonderCardMetadata * data, s32 size) { s32 numStamps = 0; s32 i; for (i = 0; i < size; i++) { if (data->stampData[STAMP_ID][i] && data->stampData[STAMP_SPECIES][i]) numStamps++; } return numStamps; } static bool32 IsStampInMetadata(const struct WonderCardMetadata * metadata, const u16 * stamp, s32 maxStamps) { s32 i; for (i = 0; i < maxStamps; i++) { if (metadata->stampData[STAMP_ID][i] == stamp[STAMP_ID]) return TRUE; if (metadata->stampData[STAMP_SPECIES][i] == stamp[STAMP_SPECIES]) return TRUE; } return FALSE; } static bool32 ValidateStamp(const u16 * stamp) { if (stamp[STAMP_ID] == 0) return FALSE; if (stamp[STAMP_SPECIES] == SPECIES_NONE) return FALSE; if (stamp[STAMP_SPECIES] >= NUM_SPECIES) return FALSE; return TRUE; } static s32 GetNumStampsInSavedCard(void) { struct WonderCard * card; if (!ValidateSavedWonderCard()) return 0; card = &gSaveBlock1Ptr->mysteryGift.card; if (card->type != CARD_TYPE_STAMP) return 0; return GetNumStampsInMetadata(&gSaveBlock1Ptr->mysteryGift.cardMetadata, card->maxStamps); } bool32 MysteryGift_TrySaveStamp(const u16 * stamp) { struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; s32 maxStamps = card->maxStamps; s32 i; if (!ValidateStamp(stamp)) return FALSE; if (IsStampInMetadata(&gSaveBlock1Ptr->mysteryGift.cardMetadata, stamp, maxStamps)) return FALSE; for (i = 0; i < maxStamps; i++) { if (gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_ID][i] == 0 && gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_SPECIES][i] == SPECIES_NONE) { gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_ID][i] = stamp[STAMP_ID]; gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_SPECIES][i] = stamp[STAMP_SPECIES]; return TRUE; } } return FALSE; } #define GAME_DATA_VALID_VAR 0x101 #if defined(FIRERED) #define VERSION_CODE 1 #elif defined(LEAFGREEN) #define VERSION_CODE 2 #endif void MysteryGift_LoadLinkGameData(struct MysteryGiftLinkGameData * data) { s32 i; CpuFill32(0, data, sizeof(*data)); // Magic data->unk_00 = GAME_DATA_VALID_VAR; data->unk_04 = 1; data->unk_08 = 1; data->unk_0C = 1; data->unk_10 = VERSION_CODE; // Check whether a card already exists if (ValidateSavedWonderCard()) { // Populate fields data->flagId = GetSavedWonderCard()->flagId; data->cardMetadata = *GetSavedWonderCardMetadata(); data->maxStamps = GetSavedWonderCard()->maxStamps; } else { data->flagId = 0; } for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) data->questionnaireWords[i] = gSaveBlock1Ptr->mysteryGift.questionnaireWords[i]; CopyTrainerId(data->playerTrainerId, gSaveBlock2Ptr->playerTrainerId); StringCopy(data->playerName, gSaveBlock2Ptr->playerName); for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) data->easyChatProfile[i] = gSaveBlock1Ptr->easyChatProfile[i]; memcpy(data->gameCode, RomHeaderGameCode, GAME_CODE_LENGTH); data->version = RomHeaderSoftwareVersion; } bool32 MysteryGift_ValidateLinkGameData(const struct MysteryGiftLinkGameData * data) { if (data->unk_00 != GAME_DATA_VALID_VAR) return FALSE; if (!(data->unk_04 & 1)) return FALSE; if (!(data->unk_08 & 1)) return FALSE; if (!(data->unk_0C & 1)) return FALSE; if (!(data->unk_10 & 0x0F)) return FALSE; return TRUE; } u32 MysteryGift_CompareCardFlags(const u16 * flagId, const struct MysteryGiftLinkGameData * data, const void *unused) { // Has a Wonder Card already? if (data->flagId == 0) return 0; // Has this Wonder Card already? if (*flagId == data->flagId) return 1; // Player has a different Wonder Card return 2; } u32 MysteryGift_CheckStamps(const u16 * stamp, const struct MysteryGiftLinkGameData * data, const void *unused) { s32 stampsMissing = data->maxStamps - GetNumStampsInMetadata(&data->cardMetadata, data->maxStamps); // Has full stamp card? if (stampsMissing == 0) return 1; // Already has stamp? if (IsStampInMetadata(&data->cardMetadata, stamp, data->maxStamps)) return 3; // Only 1 empty stamp left? if (stampsMissing == 1) return 4; // This is a new stamp return 2; } bool32 MysteryGift_DoesQuestionnaireMatch(const struct MysteryGiftLinkGameData * data, const u16 * words) { s32 i; for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) { if (data->questionnaireWords[i] != words[i]) return FALSE; } return TRUE; } static s32 GetNumStampsInLinkData(const struct MysteryGiftLinkGameData * data) { return GetNumStampsInMetadata(&data->cardMetadata, data->maxStamps); } u16 MysteryGift_GetCardStatFromLinkData(const struct MysteryGiftLinkGameData * data, u32 stat) { switch (stat) { case CARD_STAT_BATTLES_WON: return data->cardMetadata.battlesWon; case CARD_STAT_BATTLES_LOST: return data->cardMetadata.battlesLost; case CARD_STAT_NUM_TRADES: return data->cardMetadata.numTrades; case CARD_STAT_NUM_STAMPS: return GetNumStampsInLinkData(data); case CARD_STAT_MAX_STAMPS: return data->maxStamps; default: AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 825); return 0; } } static void IncrementCardStat(u32 statType) { struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; if (card->type == CARD_TYPE_LINK_STAT) { u16 * stat = NULL; switch (statType) { case CARD_STAT_BATTLES_WON: stat = &gSaveBlock1Ptr->mysteryGift.cardMetadata.battlesWon; break; case CARD_STAT_BATTLES_LOST: stat = &gSaveBlock1Ptr->mysteryGift.cardMetadata.battlesLost; break; case CARD_STAT_NUM_TRADES: stat = &gSaveBlock1Ptr->mysteryGift.cardMetadata.numTrades; break; case CARD_STAT_NUM_STAMPS: case CARD_STAT_MAX_STAMPS: break; } if (stat == NULL) { AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 868); } else if (++(*stat) > MAX_WONDER_CARD_STAT) { *stat = MAX_WONDER_CARD_STAT; } } } u16 MysteryGift_GetCardStat(u32 stat) { switch (stat) { case CARD_STAT_BATTLES_WON: { struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; if (card->type == CARD_TYPE_LINK_STAT) { struct WonderCardMetadata * metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata; return metadata->battlesWon; } break; } case CARD_STAT_BATTLES_LOST: { struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; if (card->type == CARD_TYPE_LINK_STAT) { struct WonderCardMetadata * metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata; return metadata->battlesLost; } break; } case CARD_STAT_NUM_TRADES: { struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; if (card->type == CARD_TYPE_LINK_STAT) { struct WonderCardMetadata * metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata; return metadata->numTrades; } break; } case CARD_STAT_NUM_STAMPS: { struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; if (card->type == CARD_TYPE_STAMP) return GetNumStampsInSavedCard(); break; } case CARD_STAT_MAX_STAMPS: { struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; if (card->type == CARD_TYPE_STAMP) return card->maxStamps; break; } } AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 913); return 0; } void MysteryGift_DisableStats(void) { sStatsEnabled = FALSE; } bool32 MysteryGift_TryEnableStatsByFlagId(u16 flagId) { sStatsEnabled = FALSE; if (flagId == 0) return FALSE; if (!ValidateSavedWonderCard()) return FALSE; if (gSaveBlock1Ptr->mysteryGift.card.flagId != flagId) return FALSE; sStatsEnabled = TRUE; return TRUE; } void MysteryGift_TryIncrementStat(u32 stat, u32 trainerId) { if (sStatsEnabled) { switch (stat) { case CARD_STAT_NUM_TRADES: IncrementCardStatForNewTrainer(CARD_STAT_NUM_TRADES, trainerId, gSaveBlock1Ptr->mysteryGift.trainerIds[1], ARRAY_COUNT(gSaveBlock1Ptr->mysteryGift.trainerIds[1])); break; case CARD_STAT_BATTLES_WON: IncrementCardStatForNewTrainer(CARD_STAT_BATTLES_WON, trainerId, gSaveBlock1Ptr->mysteryGift.trainerIds[0], ARRAY_COUNT(gSaveBlock1Ptr->mysteryGift.trainerIds[0])); break; case CARD_STAT_BATTLES_LOST: IncrementCardStatForNewTrainer(CARD_STAT_BATTLES_LOST, trainerId, gSaveBlock1Ptr->mysteryGift.trainerIds[0], ARRAY_COUNT(gSaveBlock1Ptr->mysteryGift.trainerIds[0])); break; default: AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 988); break; } } } static void ClearSavedTrainerIds(void) { CpuFill32(0, gSaveBlock1Ptr->mysteryGift.trainerIds, sizeof(gSaveBlock1Ptr->mysteryGift.trainerIds)); } // Returns TRUE if it's a new trainer id, FALSE if an existing one. // In either case the given trainerId is saved in element 0 static bool32 RecordTrainerId(u32 trainerId, u32 * trainerIds, s32 size) { s32 i; s32 j; for (i = 0; i < size; i++) { if (trainerIds[i] == trainerId) break; } if (i == size) { // New trainer, shift array and insert new id at front for (j = size - 1; j > 0; j--) trainerIds[j] = trainerIds[j - 1]; trainerIds[0] = trainerId; return TRUE; } else { // Existing trainer, shift back to old slot and move id to front for (j = i; j > 0; j--) trainerIds[j] = trainerIds[j - 1]; trainerIds[0] = trainerId; return FALSE; } } static void IncrementCardStatForNewTrainer(u32 stat, u32 trainerId, u32 * trainerIds, s32 size) { if (RecordTrainerId(trainerId, trainerIds, size)) IncrementCardStat(stat); } ================================================ FILE: src/mystery_gift_client.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "overworld.h" #include "script.h" #include "battle_tower.h" #include "mystery_event_script.h" #include "mystery_gift.h" #include "mystery_gift_client.h" #include "mystery_gift_server.h" enum { FUNC_INIT, FUNC_DONE, FUNC_RECV, FUNC_SEND, FUNC_RUN, FUNC_WAIT, FUNC_RUN_MEVENT, FUNC_RUN_BUFFER, }; static EWRAM_DATA struct MysteryGiftClient * sClient = NULL; static void MysteryGiftClient_Init(struct MysteryGiftClient *, u32, u32); static u32 MysteryGiftClient_CallFunc(struct MysteryGiftClient *); static void MysteryGiftClient_Free(struct MysteryGiftClient *); extern const struct MysteryGiftClientCmd gMysteryGiftClientScript_Init[]; void MysteryGiftClient_Create(void) { sClient = AllocZeroed(sizeof(*sClient)); MysteryGiftClient_Init(sClient, 1, 0); } u32 MysteryGiftClient_Run(u16 * endVal) { u32 result; if (sClient == NULL) return CLI_RET_END; result = MysteryGiftClient_CallFunc(sClient); if (result == CLI_RET_END) { *endVal = sClient->param; MysteryGiftClient_Free(sClient); FREE_AND_SET_NULL(sClient); } return result; } void MysteryGiftClient_AdvanceState(void) { sClient->funcState++; } void *MysteryGiftClient_GetMsg(void) { return sClient->msg; } void MysteryGiftClient_SetParam(u32 val) { sClient->param = val; } static void MysteryGiftClient_Init(struct MysteryGiftClient * client, u32 sendPlayerId, u32 recvPlayerId) { client->unused = 0; client->funcId = FUNC_INIT; client->funcState = 0; client->sendBuffer = AllocZeroed(MG_LINK_BUFFER_SIZE); client->recvBuffer = AllocZeroed(MG_LINK_BUFFER_SIZE); client->script = AllocZeroed(MG_LINK_BUFFER_SIZE); client->msg = AllocZeroed(CLIENT_MAX_MSG_SIZE); MysteryGiftLink_Init(&client->link, sendPlayerId, recvPlayerId); } static void MysteryGiftClient_Free(struct MysteryGiftClient * client) { Free(client->sendBuffer); Free(client->recvBuffer); Free(client->script); Free(client->msg); } static void MysteryGiftClient_CopyRecvScript(struct MysteryGiftClient * client) { memcpy(client->script, client->recvBuffer, MG_LINK_BUFFER_SIZE); client->cmdidx = 0; } static void MysteryGiftClient_InitSendWord(struct MysteryGiftClient * client, u32 ident, u32 word) { CpuFill32(0, client->sendBuffer, MG_LINK_BUFFER_SIZE); *(u32 *)client->sendBuffer = word; MysteryGiftLink_InitSend(&client->link, ident, client->sendBuffer, sizeof(word)); } static u32 Client_Init(struct MysteryGiftClient * client) { memcpy(client->script, gMysteryGiftClientScript_Init, MG_LINK_BUFFER_SIZE); client->cmdidx = 0; client->funcId = FUNC_RUN; client->funcState = 0; return CLI_RET_INIT; } static u32 Client_Done(struct MysteryGiftClient * client) { return CLI_RET_END; } static u32 Client_Recv(struct MysteryGiftClient * client) { if (MysteryGiftLink_Recv(&client->link)) { client->funcId = FUNC_RUN; client->funcState = 0; } return CLI_RET_ACTIVE; } static u32 Client_Send(struct MysteryGiftClient * client) { if (MysteryGiftLink_Send(&client->link)) { client->funcId = FUNC_RUN; client->funcState = 0; } return CLI_RET_ACTIVE; } static u32 Client_Run(struct MysteryGiftClient * client) { // process command struct MysteryGiftClientCmd * cmd = &client->script[client->cmdidx]; client->cmdidx++; switch (cmd->instr) { case CLI_NONE: break; case CLI_RETURN: client->param = cmd->parameter; // Set for endVal in MysteryGiftClient_Run client->funcId = FUNC_DONE; client->funcState = 0; break; case CLI_RECV: MysteryGiftLink_InitRecv(&client->link, cmd->parameter, client->recvBuffer); client->funcId = FUNC_RECV; client->funcState = 0; break; case CLI_SEND_LOADED: // Send without a MysteryGiftLink_InitSend // Sends whatever has been loaded already client->funcId = FUNC_SEND; client->funcState = 0; break; case CLI_SEND_READY_END: MysteryGiftLink_InitSend(&client->link, MG_LINKID_READY_END, client->sendBuffer, 0); client->funcId = FUNC_SEND; client->funcState = 0; break; case CLI_SEND_STAT: MysteryGiftClient_InitSendWord(client, MG_LINKID_GAME_STAT, GetGameStat(cmd->parameter)); client->funcId = FUNC_SEND; client->funcState = 0; break; case CLI_COPY_RECV_IF_N: if (client->param == FALSE) MysteryGiftClient_CopyRecvScript(client); break; case CLI_COPY_RECV_IF: if (client->param == TRUE) MysteryGiftClient_CopyRecvScript(client); break; case CLI_COPY_RECV: MysteryGiftClient_CopyRecvScript(client); break; case CLI_YES_NO: memcpy(client->msg, client->recvBuffer, CLIENT_MAX_MSG_SIZE); client->funcId = FUNC_WAIT; client->funcState = 0; return CLI_RET_YES_NO; case CLI_PRINT_MSG: memcpy(client->msg, client->recvBuffer, CLIENT_MAX_MSG_SIZE); client->funcId = FUNC_WAIT; client->funcState = 0; return CLI_RET_PRINT_MSG; case CLI_COPY_MSG: memcpy(client->msg, client->recvBuffer, CLIENT_MAX_MSG_SIZE); client->funcId = FUNC_WAIT; client->funcState = 0; return CLI_RET_COPY_MSG; case CLI_ASK_TOSS: client->funcId = FUNC_WAIT; client->funcState = 0; return CLI_RET_ASK_TOSS; case CLI_LOAD_GAME_DATA: MysteryGift_LoadLinkGameData(client->sendBuffer); MysteryGiftLink_InitSend(&client->link, MG_LINKID_GAME_DATA, client->sendBuffer, sizeof(struct MysteryGiftLinkGameData)); break; case CLI_LOAD_TOSS_RESPONSE: // param here is set by MG_STATE_CLIENT_ASK_TOSS or MG_STATE_CLIENT_ASK_TOSS_UNRECEIVED MysteryGiftClient_InitSendWord(client, MG_LINKID_RESPONSE, client->param); break; case CLI_SAVE_CARD: SaveWonderCard(client->recvBuffer); break; case CLI_SAVE_NEWS: if (!IsWonderNewsSameAsSaved(client->recvBuffer)) { SaveWonderNews(client->recvBuffer); MysteryGiftClient_InitSendWord(client, MG_LINKID_RESPONSE, FALSE); } else { // Wonder News has already been saved (or is invalid). // Prepare a signal to indicate it was not saved. MysteryGiftClient_InitSendWord(client, MG_LINKID_RESPONSE, TRUE); } break; case CLI_RUN_MEVENT_SCRIPT: client->funcId = FUNC_RUN_MEVENT; client->funcState = 0; break; case CLI_SAVE_STAMP: MysteryGift_TrySaveStamp(client->recvBuffer); break; case CLI_SAVE_RAM_SCRIPT: InitRamScript_NoObjectEvent(client->recvBuffer, sizeof(struct RamScriptData)); break; case CLI_RECV_EREADER_TRAINER: memcpy(&gSaveBlock2Ptr->battleTower.ereaderTrainer, client->recvBuffer, sizeof(gSaveBlock2Ptr->battleTower.ereaderTrainer)); ValidateEReaderTrainer(); break; case CLI_RUN_BUFFER_SCRIPT: memcpy(gDecompressionBuffer, client->recvBuffer, MG_LINK_BUFFER_SIZE); client->funcId = FUNC_RUN_BUFFER; client->funcState = 0; break; } return CLI_RET_ACTIVE; } static u32 Client_Wait(struct MysteryGiftClient * client) { if (client->funcState) { client->funcId = FUNC_RUN; client->funcState = 0; } return CLI_RET_ACTIVE; } static u32 Client_RunMysteryEventScript(struct MysteryGiftClient * client) { switch (client->funcState) { case 0: MEventScript_InitContext(client->recvBuffer); client->funcState++; break; case 1: if (!MEventScript_Run(&client->param)) { client->funcId = FUNC_RUN; client->funcState = 0; } break; } return CLI_RET_ACTIVE; } static u32 Client_RunBufferScript(struct MysteryGiftClient * client) { u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer; if (func(&client->param, gSaveBlock2Ptr, gSaveBlock1Ptr) == 1) { client->funcId = FUNC_RUN; client->funcState = 0; } return CLI_RET_ACTIVE; } static u32 MysteryGiftClient_CallFunc(struct MysteryGiftClient * client) { u32 (*funcs[])(struct MysteryGiftClient *) = { [FUNC_INIT] = Client_Init, [FUNC_DONE] = Client_Done, [FUNC_RECV] = Client_Recv, [FUNC_SEND] = Client_Send, [FUNC_RUN] = Client_Run, [FUNC_WAIT] = Client_Wait, [FUNC_RUN_MEVENT] = Client_RunMysteryEventScript, [FUNC_RUN_BUFFER] = Client_RunBufferScript }; return funcs[client->funcId](client); } ================================================ FILE: src/mystery_gift_link.c ================================================ #include "global.h" #include "util.h" #include "link.h" #include "link_rfu.h" #include "mystery_gift_server.h" /* Handles the link connection functions used by the Mystery Gift client/server. Note: MysteryGiftLink is shortened to MGL for internal functions. */ struct SendRecvHeader { u16 ident; u16 crc; u16 size; }; static u32 MGL_Receive(struct MysteryGiftLink *); static u32 MGL_Send(struct MysteryGiftLink *); u32 MysteryGiftLink_Recv(struct MysteryGiftLink * link) { return link->recvFunc(link); } u32 MysteryGiftLink_Send(struct MysteryGiftLink * link) { return link->sendFunc(link); } void MysteryGiftLink_Init(struct MysteryGiftLink * link, u32 sendPlayerId, u32 recvPlayerId) { link->sendPlayerId = sendPlayerId; link->recvPlayerId = recvPlayerId; link->state = 0; link->sendCRC = 0; link->sendSize = 0; link->sendCounter = 0; link->recvCRC = 0; link->recvSize = 0; link->recvCounter = 0; link->sendBuffer = NULL; link->recvBuffer = NULL; link->sendFunc = MGL_Send; link->recvFunc = MGL_Receive; } void MysteryGiftLink_InitSend(struct MysteryGiftLink * link, u32 ident, const void *src, u32 size) { link->state = 0; link->sendIdent = ident; link->sendCounter = 0; link->sendCRC = 0; if (size != 0) link->sendSize = size; else link->sendSize = MG_LINK_BUFFER_SIZE; link->sendBuffer = src; } void MysteryGiftLink_InitRecv(struct MysteryGiftLink * link, u32 ident, void *dest) { link->state = 0; link->recvIdent = ident; link->recvCounter = 0; link->recvCRC = 0; link->recvSize = 0; link->recvBuffer = dest; } static void MGL_ReceiveBlock(u32 playerId, void *dest, size_t size) { memcpy(dest, gBlockRecvBuffer[playerId], size); } static bool32 MGL_HasReceived(u32 playerId) { if ((GetBlockReceivedStatus() >> playerId) & 1) return TRUE; else return FALSE; } static void MGL_ResetReceived(u32 playerId) { ResetBlockReceivedFlag(playerId); } static bool32 MGL_Receive(struct MysteryGiftLink * link) { struct SendRecvHeader header; switch (link->state) { case 0: if (MGL_HasReceived(link->recvPlayerId)) { MGL_ReceiveBlock(link->recvPlayerId, &header, sizeof(header)); link->recvSize = header.size; link->recvCRC = header.crc; if (link->recvSize > MG_LINK_BUFFER_SIZE) { LinkRfu_FatalError(); return FALSE; } else if (link->recvIdent != header.ident) { LinkRfu_FatalError(); return FALSE; } else { link->recvCounter = 0; MGL_ResetReceived(link->recvPlayerId); link->state++; } } break; case 1: if (MGL_HasReceived(link->recvPlayerId)) { size_t blocksize = link->recvCounter * 252; if (link->recvSize - blocksize <= 252) { MGL_ReceiveBlock(link->recvPlayerId, link->recvBuffer + blocksize, link->recvSize - blocksize); link->recvCounter++; link->state++; } else { MGL_ReceiveBlock(link->recvPlayerId, link->recvBuffer + blocksize, 252); link->recvCounter++; } MGL_ResetReceived(link->recvPlayerId); } break; case 2: if (CalcCRC16WithTable(link->recvBuffer, link->recvSize) != link->recvCRC) { LinkRfu_FatalError(); return FALSE; } else { link->state = 0; return TRUE; } break; } return FALSE; } static bool32 MGL_Send(struct MysteryGiftLink * link) { struct SendRecvHeader header; switch (link->state) { case 0: if (IsLinkTaskFinished()) { header.ident = link->sendIdent; header.size = link->sendSize; header.crc = CalcCRC16WithTable(link->sendBuffer, link->sendSize); link->sendCRC = header.crc; link->sendCounter = 0; SendBlock(0, &header, sizeof(header)); link->state++; } break; case 1: if (IsLinkTaskFinished()) { if (MGL_HasReceived(link->sendPlayerId)) { size_t blocksize; MGL_ResetReceived(link->sendPlayerId); blocksize = 252 * link->sendCounter; if (link->sendSize - blocksize <= 252) { SendBlock(0, link->sendBuffer + blocksize, link->sendSize - blocksize); link->sendCounter++; link->state++; } else { SendBlock(0, link->sendBuffer + blocksize, 252); link->sendCounter++; } } } break; case 2: if (IsLinkTaskFinished()) { if (CalcCRC16WithTable(link->sendBuffer, link->sendSize) != link->sendCRC) LinkRfu_FatalError(); else link->state++; } break; case 3: if (MGL_HasReceived(link->sendPlayerId)) { MGL_ResetReceived(link->sendPlayerId); link->state = 0; return TRUE; } break; } return FALSE; } ================================================ FILE: src/mystery_gift_menu.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "scanline_effect.h" #include "text_window.h" #include "menu.h" #include "new_menu_helpers.h" #include "mystery_gift_menu.h" #include "title_screen.h" #include "list_menu.h" #include "link_rfu.h" #include "mystery_gift.h" #include "save.h" #include "link.h" #include "event_data.h" #include "mystery_gift_server.h" #include "mystery_gift_client.h" #include "wonder_news.h" #include "help_system.h" #include "strings.h" #include "decompress.h" #include "constants/cable_club.h" #include "constants/songs.h" #include "constants/union_room.h" EWRAM_DATA u8 sDownArrowCounterAndYCoordIdx[8] = {}; EWRAM_DATA bool8 gGiftIsFromEReader = FALSE; static void CreateMysteryGiftTask(void); static void Task_MysteryGift(u8 taskId); extern void CreateEReaderTask(void); static const u16 sTextboxBorder_Pal[] = INCBIN_U16("graphics/interface/mystery_gift_textbox_border.gbapal"); static const u32 sTextboxBorder_Gfx[] = INCBIN_U32("graphics/interface/mystery_gift_textbox_border.4bpp.lz"); struct MysteryGiftTaskData { u16 var; // Multipurpose u16 unused1; u16 unused2; u16 unused3; u8 state; u8 textState; u8 unused4; u8 unused5; bool8 isWonderNews; bool8 sourceIsFriend; u8 msgId; u8 * clientMsg; }; static const struct BgTemplate sBGTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 15, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 14, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 13, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 12, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 } }; static const struct WindowTemplate sMainWindows[] = { { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 2, .paletteNum = 15, .baseBlock = 0x0013 }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 15, .width = 28, .height = 4, .paletteNum = 15, .baseBlock = 0x004f }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 15, .width = 30, .height = 5, .paletteNum = 13, .baseBlock = 0x004f }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sWindowTemplate_YesNoMsg_Wide = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 15, .width = 28, .height = 4, .paletteNum = 15, .baseBlock = 0x00e5 }; static const struct WindowTemplate sWindowTemplate_YesNoMsg = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 15, .width = 20, .height = 4, .paletteNum = 15, .baseBlock = 0x00e5 }; static const struct WindowTemplate sWindowTemplate_GiftSelect = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 15, .width = 19, .height = 4, .paletteNum = 15, .baseBlock = 0x00e5 }; static const struct WindowTemplate sWindowTemplate_ThreeOptions = { .bg = 0, .tilemapLeft = 8, .tilemapTop = 5, .width = 14, .height = 5, .paletteNum = 14, .baseBlock = 0x0155 }; static const struct WindowTemplate sWindowTemplate_YesNoBox = { .bg = 0, .tilemapLeft = 23, .tilemapTop = 15, .width = 6, .height = 4, .paletteNum = 14, .baseBlock = 0x0155 }; static const struct WindowTemplate sWindowTemplate_GiftSelect_3Options = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 12, .width = 7, .height = 7, .paletteNum = 14, .baseBlock = 0x0155 }; static const struct WindowTemplate sWindowTemplate_GiftSelect_2Options = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 14, .width = 7, .height = 5, .paletteNum = 14, .baseBlock = 0x0155 }; static const struct WindowTemplate sWindowTemplate_GiftSelect_1Option = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 15, .width = 7, .height = 4, .paletteNum = 14, .baseBlock = 0x0155 }; static const struct ListMenuItem sListMenuItems_CardsOrNews[] = { { gText_WonderCards, 0 }, { gText_WonderNews, 1 }, { gText_Exit3, LIST_CANCEL } }; static const struct ListMenuItem sListMenuItems_WirelessOrFriend[] = { { gText_WirelessCommunication, 0 }, { gText_Friend2, 1 }, { gFameCheckerText_Cancel, LIST_CANCEL } }; static const struct ListMenuTemplate sListMenuTemplate_ThreeOptions = { .items = NULL, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, .totalItems = 3, .maxShowed = 3, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 0, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct ListMenuItem sListMenuItems_ReceiveSendToss[] = { { gText_Receive, 0 }, { gText_Send, 1 }, { gText_Toss, 2 }, { gFameCheckerText_Cancel, LIST_CANCEL } }; static const struct ListMenuItem sListMenuItems_ReceiveToss[] = { { gText_Receive, 0 }, { gText_Toss, 2 }, { gFameCheckerText_Cancel, LIST_CANCEL } }; static const struct ListMenuItem sListMenuItems_ReceiveSend[] = { { gText_Receive, 0 }, { gText_Send, 1 }, { gFameCheckerText_Cancel, LIST_CANCEL } }; static const struct ListMenuItem sListMenuItems_Receive[] = { { gText_Receive, 0 }, { gFameCheckerText_Cancel, LIST_CANCEL } }; static const struct ListMenuTemplate sListMenu_ReceiveSendToss = { .items = sListMenuItems_ReceiveSendToss, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, .totalItems = 4, .maxShowed = 4, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 2, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 0, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct ListMenuTemplate sListMenu_ReceiveToss = { .items = sListMenuItems_ReceiveToss, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, .totalItems = 3, .maxShowed = 3, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 0, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct ListMenuTemplate sListMenu_ReceiveSend = { .items = sListMenuItems_ReceiveSend, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, .totalItems = 3, .maxShowed = 3, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 0, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const struct ListMenuTemplate sListMenu_Receive = { .items = sListMenuItems_Receive, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, .totalItems = 2, .maxShowed = 2, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 0, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 0, .itemVerticalPadding = 2, .scrollMultiple = 0, .fontId = FONT_NORMAL, .cursorKind = 0 }; static const u8 *const sUnusedMenuTexts[] = { gText_VarietyOfEventsImportedWireless, gText_WonderCardsInPossession, gText_ReadNewsThatArrived, gText_ReturnToTitle }; ALIGNED(4) static const u8 sTextColors_TopMenu[3] = { 0, 1, 2 }; ALIGNED(4) static const u8 sTextColors_TopMenu_Copy[3] = { 0, 1, 2 }; ALIGNED(4) static const u8 sMG_Ereader_TextColor_2[3] = { 1, 2, 3 }; static const u8 sText_Test[] = _("テスト"); static const u8 sText_EonTicket[] = _("むげんのチケット"); static void VBlankCB_MysteryGiftEReader(void) { ProcessSpriteCopyRequests(); LoadOam(); TransferPlttBuffer(); } void CB2_MysteryGiftEReader(void) { RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); } bool32 HandleMysteryGiftOrEReaderSetup(s32 isEReader) { switch (gMain.state) { case 0: SetVBlankCallback(NULL); ResetPaletteFade(); ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); ScanlineEffect_Stop(); ResetBgsAndClearDma3BusyFlags(1); InitBgsFromTemplates(0, sBGTemplates, ARRAY_COUNT(sBGTemplates)); ChangeBgX(0, 0, BG_COORD_SET); ChangeBgY(0, 0, BG_COORD_SET); ChangeBgX(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); ChangeBgX(2, 0, BG_COORD_SET); ChangeBgY(2, 0, BG_COORD_SET); ChangeBgX(3, 0, BG_COORD_SET); ChangeBgY(3, 0, BG_COORD_SET); SetBgTilemapBuffer(3, Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(2, Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); LoadUserWindowGfx2(0, 10, BG_PLTT_ID(14)); LoadStdWindowGfxOnBg(0, 1, BG_PLTT_ID(15)); DecompressAndLoadBgGfxUsingHeap(3, sTextboxBorder_Gfx, 0x100, 0, 0); InitWindows(sMainWindows); DeactivateAllTextPrinters(); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); gMain.state++; break; case 1: LoadPalette(sTextboxBorder_Pal, BG_PLTT_ID(0), sizeof(sTextboxBorder_Pal)); LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(13), PLTT_SIZE_4BPP); FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 17); FillBgTilemapBufferRect(1, 0x000, 0, 0, 32, 32, 17); FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 17); MG_DrawCheckerboardPattern(); PrintMysteryGiftOrEReaderTopMenu(isEReader, FALSE); gMain.state++; break; case 2: CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); gMain.state++; break; case 3: ShowBg(0); ShowBg(3); PlayBGM(MUS_MYSTERY_GIFT); SetVBlankCallback(VBlankCB_MysteryGiftEReader); EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); return TRUE; } return FALSE; } void CB2_InitMysteryGift(void) { if (HandleMysteryGiftOrEReaderSetup(FALSE)) { SetMainCallback2(CB2_MysteryGiftEReader); gGiftIsFromEReader = FALSE; CreateMysteryGiftTask(); } } void CB2_InitEReader(void) { if (HandleMysteryGiftOrEReaderSetup(TRUE)) { SetMainCallback2(CB2_MysteryGiftEReader); gGiftIsFromEReader = TRUE; CreateEReaderTask(); } } void MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void) { gGiftIsFromEReader = FALSE; FreeAllWindowBuffers(); Free(GetBgTilemapBuffer(0)); Free(GetBgTilemapBuffer(1)); Free(GetBgTilemapBuffer(2)); Free(GetBgTilemapBuffer(3)); SetMainCallback2(CB2_InitTitleScreen); } void PrintMysteryGiftOrEReaderTopMenu(bool8 isEReader, bool32 useCancel) { const u8 * options; s32 width; FillWindowPixelBuffer(0, 0x00); if (!isEReader) { options = useCancel == TRUE ? gText_PickOKExit : gText_PickOKCancel; AddTextPrinterParameterized4(0, FONT_NORMAL, 2, 2, 0, 0, sTextColors_TopMenu, 0, gText_MysteryGift2); width = 222 - GetStringWidth(FONT_SMALL, options, 0); AddTextPrinterParameterized4(0, FONT_SMALL, width, 2, 0, 0, sTextColors_TopMenu, 0, options); } else { AddTextPrinterParameterized4(0, FONT_NORMAL, 2, 2, 0, 0, sTextColors_TopMenu, 0, gJPText_MysteryGift); AddTextPrinterParameterized4(0, FONT_SMALL, 120, 2, 0, 0, sTextColors_TopMenu, 0, gJPText_DecideStop); } CopyWindowToVram(0, COPYWIN_GFX); PutWindowTilemap(0); } void MG_DrawTextBorder(u8 windowId) { DrawTextBorderOuter(windowId, 0x01, 15); } void MG_DrawCheckerboardPattern(void) { s32 i = 0, j; FillBgTilemapBufferRect(3, 0x003, 0, 0, 32, 2, 17); for (i = 0; i < 18; i++) { for (j = 0; j < 32; j++) { if ((i & 1) != (j & 1)) FillBgTilemapBufferRect(3, 1, j, i + 2, 1, 1, 17); else FillBgTilemapBufferRect(3, 2, j, i + 2, 1, 1, 17); } } } void ClearScreenInBg0(bool32 ignoreTopTwoRows) { switch (ignoreTopTwoRows) { case 0: FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 17); break; case 1: FillBgTilemapBufferRect(0, 0, 0, 2, 32, 30, 17); break; } CopyBgTilemapBufferToVram(0); } void AddTextPrinterToWindow1(const u8 *str) { StringExpandPlaceholders(gStringVar4, str); FillWindowPixelBuffer(1, 0x11); AddTextPrinterParameterized4(1, FONT_NORMAL, 0, 2, 0, 2, sMG_Ereader_TextColor_2, 0, gStringVar4); DrawTextBorderOuter(1, 0x001, 15); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_FULL); } static void ClearTextWindow(void) { rbox_fill_rectangle(1); ClearWindowTilemap(1); CopyWindowToVram(1, COPYWIN_MAP); } #define DOWN_ARROW_X 208 #define DOWN_ARROW_Y 20 bool32 PrintMysteryGiftMenuMessage(u8 *textState, const u8 *str) { switch (*textState) { case 0: AddTextPrinterToWindow1(str); goto inc; case 1: DrawDownArrow(1, DOWN_ARROW_X, DOWN_ARROW_Y, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); if (JOY_NEW(A_BUTTON | B_BUTTON)) { inc: (*textState)++; } break; case 2: DrawDownArrow(1, DOWN_ARROW_X, DOWN_ARROW_Y, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); *textState = 0; ClearTextWindow(); return TRUE; case 0xFF: *textState = 2; break; } return FALSE; } static void HideDownArrow(void) { DrawDownArrow(1, DOWN_ARROW_X, DOWN_ARROW_Y, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); } static void ShowDownArrow(void) { DrawDownArrow(1, DOWN_ARROW_X, DOWN_ARROW_Y, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); } // Unused static bool32 HideDownArrowAndWaitButton(u8 * textState) { switch (*textState) { case 0: HideDownArrow(); if (JOY_NEW(A_BUTTON | B_BUTTON)) (*textState)++; break; case 1: ShowDownArrow(); *textState = 0; return TRUE; } return FALSE; } static bool32 PrintStringAndWait2Seconds(u8 * counter, const u8 * str) { if (*counter == 0) AddTextPrinterToWindow1(str); if (++(*counter) > 120) { *counter = 0; ClearTextWindow(); return TRUE; } else { return FALSE; } } static u32 MysteryGift_HandleThreeOptionMenu(u8 * unused0, u16 * unused1, u8 whichMenu) { struct ListMenuTemplate listMenuTemplate = sListMenuTemplate_ThreeOptions; struct WindowTemplate windowTemplate = sWindowTemplate_ThreeOptions; u32 width; s32 finalWidth; s32 response; u32 i; if (whichMenu == 0) listMenuTemplate.items = sListMenuItems_CardsOrNews; else listMenuTemplate.items = sListMenuItems_WirelessOrFriend; width = 0; for (i = 0; i < listMenuTemplate.totalItems; i++) { u32 curWidth = GetStringWidth(FONT_NORMAL, listMenuTemplate.items[i].label, listMenuTemplate.lettersSpacing); if (curWidth > width) width = curWidth; } finalWidth = (((width + 9) / 8) + 2) & ~1; windowTemplate.width = finalWidth; windowTemplate.tilemapLeft = (30 - finalWidth) / 2; response = DoMysteryGiftListMenu(&windowTemplate, &listMenuTemplate, 1, 0x00A, BG_PLTT_ID(14)); if (response != LIST_NOTHING_CHOSEN) { ClearWindowTilemap(2); CopyWindowToVram(2, COPYWIN_MAP); } return response; } s8 DoMysteryGiftYesNo(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str) { struct WindowTemplate windowTemplate; s8 input; switch (*textState) { case 0: // Print question message StringExpandPlaceholders(gStringVar4, str); if (yesNoBoxPlacement == 0) *windowId = AddWindow(&sWindowTemplate_YesNoMsg_Wide); else *windowId = AddWindow(&sWindowTemplate_YesNoMsg); FillWindowPixelBuffer(*windowId, 0x11); AddTextPrinterParameterized4(*windowId, FONT_NORMAL, 0, 2, 0, 2, sMG_Ereader_TextColor_2, 0, gStringVar4); DrawTextBorderOuter(*windowId, 0x001, 15); CopyWindowToVram(*windowId, COPYWIN_GFX); PutWindowTilemap(*windowId); (*textState)++; break; case 1: // Create Yes/No windowTemplate = sWindowTemplate_YesNoBox; if (yesNoBoxPlacement == 0) windowTemplate.tilemapTop = 9; else windowTemplate.tilemapTop = 15; CreateYesNoMenu(&windowTemplate, FONT_NORMAL, 0, 2, 10, 14, 0); (*textState)++; break; case 2: // Handle Yes/No input input = Menu_ProcessInputNoWrapClearOnChoose(); if (input == MENU_B_PRESSED || input == 0 || input == 1) { *textState = 0; rbox_fill_rectangle(*windowId); ClearWindowTilemap(*windowId); CopyWindowToVram(*windowId, COPYWIN_MAP); RemoveWindow(*windowId); return input; } break; case 0xFF: *textState = 0; rbox_fill_rectangle(*windowId); ClearWindowTilemap(*windowId); CopyWindowToVram(*windowId, COPYWIN_MAP); RemoveWindow(*windowId); return MENU_B_PRESSED; } return MENU_NOTHING_CHOSEN; } // Handle the "Receive/Send/Toss" menu that appears when selecting Wonder Card/News static s32 HandleMysteryGiftListMenu(u8 * textState, u16 * windowId, bool32 cannotToss, bool32 cannotSend) { struct WindowTemplate windowTemplate; s32 input; switch (*textState) { case 0: // Print menu message if (!cannotToss) StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithCards); else StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithNews); *windowId = AddWindow(&sWindowTemplate_GiftSelect); FillWindowPixelBuffer(*windowId, 0x11); AddTextPrinterParameterized4(*windowId, FONT_NORMAL, 0, 2, 0, 2, sMG_Ereader_TextColor_2, 0, gStringVar4); DrawTextBorderOuter(*windowId, 0x001, 15); CopyWindowToVram(*windowId, COPYWIN_GFX); PutWindowTilemap(*windowId); (*textState)++; break; case 1: windowTemplate = sWindowTemplate_YesNoBox; if (cannotSend) { if (!cannotToss) input = DoMysteryGiftListMenu(&sWindowTemplate_GiftSelect_2Options, &sListMenu_ReceiveToss, 1, 0x00A, BG_PLTT_ID(14)); else input = DoMysteryGiftListMenu(&sWindowTemplate_GiftSelect_1Option, &sListMenu_Receive, 1, 0x00A, BG_PLTT_ID(14)); } else { if (!cannotToss) input = DoMysteryGiftListMenu(&sWindowTemplate_GiftSelect_3Options, &sListMenu_ReceiveSendToss, 1, 0x00A, BG_PLTT_ID(14)); else input = DoMysteryGiftListMenu(&sWindowTemplate_GiftSelect_2Options, &sListMenu_ReceiveSend, 1, 0x00A, BG_PLTT_ID(14)); } if (input != LIST_NOTHING_CHOSEN) { *textState = 0; rbox_fill_rectangle(*windowId); ClearWindowTilemap(*windowId); CopyWindowToVram(*windowId, COPYWIN_MAP); RemoveWindow(*windowId); return input; } break; case 0xFF: *textState = 0; rbox_fill_rectangle(*windowId); ClearWindowTilemap(*windowId); CopyWindowToVram(*windowId, COPYWIN_MAP); RemoveWindow(*windowId); return LIST_CANCEL; } return LIST_NOTHING_CHOSEN; } static bool32 ValidateCardOrNews(bool32 isWonderNews) { if (!isWonderNews) return ValidateSavedWonderCard(); else return ValidateSavedWonderNews(); } static bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 isWonderNews) { switch (*state) { case 0: if (!isWonderNews) WonderCard_Init(GetSavedWonderCard(), GetSavedWonderCardMetadata()); else WonderNews_Init(GetSavedWonderNews()); (*state)++; break; case 1: if (!isWonderNews) { if (!WonderCard_Enter()) return FALSE; } else { if (!WonderNews_Enter()) return FALSE; } *state = 0; return TRUE; } return FALSE; } static bool32 ClearSavedNewsOrCard(bool32 isWonderNews) { if (!isWonderNews) ClearSavedWonderCardAndRelated(); else ClearSavedWonderNewsAndRelated(); return TRUE; } static bool32 ExitWonderCardOrNews(bool32 isWonderNews, bool32 useCancel) { if (!isWonderNews) { if (WonderCard_Exit(useCancel)) { WonderCard_Destroy(); return TRUE; } else { return FALSE; } } else { if (WonderNews_Exit(useCancel)) { WonderNews_Destroy(); return TRUE; } else { return FALSE; } } } static s32 AskDiscardGift(u8 * textState, u16 * windowId, bool32 isWonderNews) { if (!isWonderNews) return DoMysteryGiftYesNo(textState, windowId, TRUE, gText_IfThrowAwayCardEventWontHappen); else return DoMysteryGiftYesNo(textState, windowId, TRUE, gText_OkayToDiscardNews); } static bool32 PrintThrownAway(u8 * textState, bool32 isWonderNews) { if (!isWonderNews) return PrintMysteryGiftMenuMessage(textState, gText_WonderCardThrownAway); else return PrintMysteryGiftMenuMessage(textState, gText_WonderNewsThrownAway); } static bool32 SaveOnMysteryGiftMenu(u8 * state) { switch (*state) { case 0: AddTextPrinterToWindow1(gText_DataWillBeSaved); (*state)++; break; case 1: TrySavingData(SAVE_NORMAL); (*state)++; break; case 2: AddTextPrinterToWindow1(gText_SaveCompletedPressA); (*state)++; break; case 3: if (JOY_NEW(A_BUTTON | B_BUTTON)) (*state)++; break; case 4: *state = 0; ClearTextWindow(); return TRUE; } return FALSE; } static const u8 * GetClientResultMessage(bool32 * successMsg, bool8 isWonderNews, bool8 sourceIsFriend, u32 msgId) { const u8 * msg = NULL; *successMsg = FALSE; switch (msgId) { case CLI_MSG_NOTHING_SENT: *successMsg = FALSE; msg = gText_NothingSentOver; break; case CLI_MSG_RECORD_UPLOADED: *successMsg = FALSE; msg = gText_RecordUploadedViaWireless; break; case CLI_MSG_CARD_RECEIVED: *successMsg = TRUE; msg = !sourceIsFriend ? gText_WonderCardReceived : gText_WonderCardReceivedFrom; break; case CLI_MSG_NEWS_RECEIVED: *successMsg = TRUE; msg = !sourceIsFriend ? gText_WonderNewsReceived : gText_WonderNewsReceivedFrom; break; case CLI_MSG_STAMP_RECEIVED: *successMsg = TRUE; msg = gText_NewStampReceived; break; case CLI_MSG_HAD_CARD: *successMsg = FALSE; msg = gText_AlreadyHadCard; break; case CLI_MSG_HAD_STAMP: *successMsg = FALSE; msg = gText_AlreadyHadStamp; break; case CLI_MSG_HAD_NEWS: *successMsg = FALSE; msg = gText_AlreadyHadNews; break; case CLI_MSG_NO_ROOM_STAMPS: *successMsg = FALSE; msg = gText_NoMoreRoomForStamps; break; case CLI_MSG_COMM_CANCELED: *successMsg = FALSE; msg = gText_CommunicationCanceled; break; case CLI_MSG_CANT_ACCEPT: *successMsg = FALSE; msg = !isWonderNews ? gText_CantAcceptCardFromTrainer : gText_CantAcceptNewsFromTrainer; break; case CLI_MSG_COMM_ERROR: *successMsg = FALSE; msg = gText_CommunicationError; break; case CLI_MSG_TRAINER_RECEIVED: *successMsg = TRUE; msg = gText_NewTrainerReceived; break; case CLI_MSG_BUFFER_SUCCESS: *successMsg = TRUE; // msg is NULL, use buffer break; case CLI_MSG_BUFFER_FAILURE: *successMsg = FALSE; // msg is NULL, use buffer break; } return msg; } static bool32 PrintSuccessMessage(u8 * state, const u8 * msg, u16 * timer) { switch (*state) { case 0: if (msg != NULL) AddTextPrinterToWindow1(msg); PlayFanfare(MUS_OBTAIN_ITEM); *timer = 0; (*state)++; break; case 1: if (++(*timer) > 240) (*state)++; break; case 2: if (IsFanfareTaskInactive()) { *state = 0; ClearTextWindow(); return TRUE; } break; } return FALSE; } static const u8 * GetServerResultMessage(bool32 * wonderSuccess, u8 unused, u32 msgId) { const u8 * result = gText_CommunicationError; *wonderSuccess = FALSE; switch (msgId) { case SVR_MSG_NOTHING_SENT: result = gText_NothingSentOver; break; case SVR_MSG_RECORD_UPLOADED: result = gText_RecordUploadedViaWireless; break; case SVR_MSG_CARD_SENT: result = gText_WonderCardSentTo; *wonderSuccess = TRUE; break; case SVR_MSG_NEWS_SENT: result = gText_WonderNewsSentTo; *wonderSuccess = TRUE; break; case SVR_MSG_STAMP_SENT: result = gText_StampSentTo; break; case SVR_MSG_HAS_CARD: result = gText_OtherTrainerHasCard; break; case SVR_MSG_HAS_STAMP: result = gText_OtherTrainerHasStamp; break; case SVR_MSG_HAS_NEWS: result = gText_OtherTrainerHasNews; break; case SVR_MSG_NO_ROOM_STAMPS: result = gText_NoMoreRoomForStamps; break; case SVR_MSG_CLIENT_CANCELED: result = gText_OtherTrainerCanceled; break; case SVR_MSG_CANT_SEND_GIFT_1: result = gText_CantSendGiftToTrainer; break; case SVR_MSG_COMM_ERROR: result = gText_CommunicationError; break; case SVR_MSG_GIFT_SENT_1: result = gText_GiftSentTo; break; case SVR_MSG_GIFT_SENT_2: result = gText_GiftSentTo; break; case SVR_MSG_CANT_SEND_GIFT_2: result = gText_CantSendGiftToTrainer; break; } return result; } static bool32 PrintServerResultMessage(u8 * state, u16 * timer, bool8 sourceIsFriend, u32 msgId) { bool32 wonderSuccess; const u8 * str = GetServerResultMessage(&wonderSuccess, sourceIsFriend, msgId); if (wonderSuccess) return PrintSuccessMessage(state, str, timer); else return PrintMysteryGiftMenuMessage(state, str); } // States for Task_MysteryGift. // CLIENT states are for when the player is receiving a gift, and use mystery_gift_client.c link functions. // SERVER states are for when the player is sending a gift, and use mystery_gift_server.c link functions. // Other states handle the general Mystery Gift menu usage. enum { MG_STATE_TO_MAIN_MENU, MG_STATE_MAIN_MENU, MG_STATE_DONT_HAVE_ANY, MG_STATE_SOURCE_PROMPT, MG_STATE_SOURCE_PROMPT_INPUT, MG_STATE_CLIENT_LINK_START, MG_STATE_CLIENT_LINK_WAIT, MG_STATE_CLIENT_COMMUNICATING, MG_STATE_CLIENT_LINK, MG_STATE_CLIENT_YES_NO, MG_STATE_CLIENT_MESSAGE, MG_STATE_CLIENT_ASK_TOSS, MG_STATE_CLIENT_ASK_TOSS_UNRECEIVED, MG_STATE_CLIENT_LINK_END, MG_STATE_CLIENT_COMM_COMPLETED, MG_STATE_CLIENT_RESULT_MSG, MG_STATE_CLIENT_ERROR, MG_STATE_SAVE_LOAD_GIFT, MG_STATE_LOAD_GIFT, MG_STATE_UNUSED, MG_STATE_HANDLE_GIFT_INPUT, MG_STATE_HANDLE_GIFT_SELECT, MG_STATE_ASK_TOSS, MG_STATE_ASK_TOSS_UNRECEIVED, MG_STATE_TOSS, MG_STATE_TOSS_SAVE, MG_STATE_TOSSED, MG_STATE_GIFT_INPUT_EXIT, MG_STATE_RECEIVE, MG_STATE_SEND, MG_STATE_SERVER_LINK_WAIT, MG_STATE_SERVER_LINK_START, MG_STATE_SERVER_LINK, MG_STATE_SERVER_LINK_END, MG_STATE_SERVER_LINK_END_WAIT, MG_STATE_SERVER_RESULT_MSG, MG_STATE_SERVER_ERROR, MG_STATE_EXIT, }; static void CreateMysteryGiftTask(void) { u8 taskId = CreateTask(Task_MysteryGift, 0); struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data; data->state = MG_STATE_TO_MAIN_MENU; data->textState = 0; data->unused4 = 0; data->unused5 = 0; data->isWonderNews = FALSE; data->sourceIsFriend = FALSE; data->var = 0; data->unused1 = 0; data->unused2 = 0; data->unused3 = 0; data->msgId = 0; data->clientMsg = AllocZeroed(CLIENT_MAX_MSG_SIZE); } static void Task_MysteryGift(u8 taskId) { struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data; bool32 successMsg, input; const u8 * msg; switch (data->state) { case MG_STATE_TO_MAIN_MENU: data->state = MG_STATE_MAIN_MENU; break; case MG_STATE_MAIN_MENU: // Main Mystery Gift menu, player can select Wonder Cards or News (or exit) switch (MysteryGift_HandleThreeOptionMenu(&data->textState, &data->var, FALSE)) { case 0: // "Wonder Cards" data->isWonderNews = FALSE; if (ValidateSavedWonderCard() == TRUE) data->state = MG_STATE_LOAD_GIFT; else data->state = MG_STATE_DONT_HAVE_ANY; break; case 1: // "Wonder News" data->isWonderNews = TRUE; if (ValidateSavedWonderNews() == TRUE) data->state = MG_STATE_LOAD_GIFT; else data->state = MG_STATE_DONT_HAVE_ANY; break; case LIST_CANCEL: data->state = MG_STATE_EXIT; break; } break; case MG_STATE_DONT_HAVE_ANY: { // Player doesn't have any Wonder Card/News // Start prompt to ask where to read one from if (!data->isWonderNews) { if (PrintMysteryGiftMenuMessage(&data->textState, gText_DontHaveCardNewOneInput)) { data->state = MG_STATE_SOURCE_PROMPT; PrintMysteryGiftOrEReaderTopMenu(FALSE, TRUE); } } else { if (PrintMysteryGiftMenuMessage(&data->textState, gText_DontHaveNewsNewOneInput)) { data->state = MG_STATE_SOURCE_PROMPT; PrintMysteryGiftOrEReaderTopMenu(FALSE, TRUE); } } break; } case MG_STATE_SOURCE_PROMPT: if (!data->isWonderNews) AddTextPrinterToWindow1(gText_WhereShouldCardBeAccessed); else AddTextPrinterToWindow1(gText_WhereShouldNewsBeAccessed); data->state = MG_STATE_SOURCE_PROMPT_INPUT; break; case MG_STATE_SOURCE_PROMPT_INPUT: // Choose where to access the Wonder Card/News from switch (MysteryGift_HandleThreeOptionMenu(&data->textState, &data->var, TRUE)) { case 0: // "Wireless Communication" ClearTextWindow(); data->state = MG_STATE_CLIENT_LINK_START; data->sourceIsFriend = FALSE; break; case 1: // "Friend" ClearTextWindow(); data->state = MG_STATE_CLIENT_LINK_START; data->sourceIsFriend = TRUE; break; case LIST_CANCEL: ClearTextWindow(); if (ValidateCardOrNews(data->isWonderNews)) { data->state = MG_STATE_LOAD_GIFT; } else { data->state = MG_STATE_TO_MAIN_MENU; PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE); } break; } break; case MG_STATE_CLIENT_LINK_START: *gStringVar1 = EOS; *gStringVar2 = EOS; *gStringVar3 = EOS; switch (data->isWonderNews) { case FALSE: if (data->sourceIsFriend == TRUE) CreateTask_LinkMysteryGiftWithFriend(ACTIVITY_WONDER_CARD); else if (data->sourceIsFriend == FALSE) CreateTask_LinkMysteryGiftOverWireless(ACTIVITY_WONDER_CARD); break; case TRUE: if (data->sourceIsFriend == TRUE) CreateTask_LinkMysteryGiftWithFriend(ACTIVITY_WONDER_NEWS); else if (data->sourceIsFriend == FALSE) CreateTask_LinkMysteryGiftOverWireless(ACTIVITY_WONDER_NEWS); break; } data->state = MG_STATE_CLIENT_LINK_WAIT; break; case MG_STATE_CLIENT_LINK_WAIT: if (gReceivedRemoteLinkPlayers) { ClearScreenInBg0(TRUE); data->state = MG_STATE_CLIENT_COMMUNICATING; MysteryGiftClient_Create(); } else if (gSpecialVar_Result == LINKUP_FAILED) { // Link failed, return to link start menu ClearScreenInBg0(TRUE); data->state = MG_STATE_SOURCE_PROMPT; } break; case MG_STATE_CLIENT_COMMUNICATING: AddTextPrinterToWindow1(gText_Communicating); data->state = MG_STATE_CLIENT_LINK; break; case MG_STATE_CLIENT_LINK: switch (MysteryGiftClient_Run(&data->var)) { case CLI_RET_END: Rfu_SetCloseLinkCallback(); data->msgId = data->var; data->state = MG_STATE_CLIENT_LINK_END; break; case CLI_RET_COPY_MSG: memcpy(data->clientMsg, MysteryGiftClient_GetMsg(), CLIENT_MAX_MSG_SIZE); MysteryGiftClient_AdvanceState(); break; case CLI_RET_PRINT_MSG: data->state = MG_STATE_CLIENT_MESSAGE; break; case CLI_RET_YES_NO: data->state = MG_STATE_CLIENT_YES_NO; break; case CLI_RET_ASK_TOSS: data->state = MG_STATE_CLIENT_ASK_TOSS; StringCopy(gStringVar1, gLinkPlayers[0].name); break; } break; case MG_STATE_CLIENT_YES_NO: input = DoMysteryGiftYesNo(&data->textState, &data->var, FALSE, MysteryGiftClient_GetMsg()); switch (input) { case 0: // Yes MysteryGiftClient_SetParam(FALSE); MysteryGiftClient_AdvanceState(); data->state = MG_STATE_CLIENT_COMMUNICATING; break; case 1: // No case MENU_B_PRESSED: MysteryGiftClient_SetParam(TRUE); MysteryGiftClient_AdvanceState(); data->state = MG_STATE_CLIENT_COMMUNICATING; break; } break; case MG_STATE_CLIENT_MESSAGE: if (PrintMysteryGiftMenuMessage(&data->textState, MysteryGiftClient_GetMsg())) { MysteryGiftClient_AdvanceState(); data->state = MG_STATE_CLIENT_COMMUNICATING; } break; case MG_STATE_CLIENT_ASK_TOSS: // Player is receiving a new Wonder Card/News but needs to toss an existing one to make room. // Ask for confirmation. input = DoMysteryGiftYesNo(&data->textState, &data->var, FALSE, gText_ThrowAwayWonderCard); switch (input) { case 0: // Yes if (IsSavedWonderCardGiftNotReceived() == TRUE) { data->state = MG_STATE_CLIENT_ASK_TOSS_UNRECEIVED; } else { MysteryGiftClient_SetParam(FALSE); MysteryGiftClient_AdvanceState(); data->state = MG_STATE_CLIENT_COMMUNICATING; } break; case 1: // No case MENU_B_PRESSED: MysteryGiftClient_SetParam(TRUE); MysteryGiftClient_AdvanceState(); data->state = MG_STATE_CLIENT_COMMUNICATING; break; } break; case MG_STATE_CLIENT_ASK_TOSS_UNRECEIVED: // Player has selected to toss a Wonder Card that they haven't received the gift for. // Ask for confirmation again. input = DoMysteryGiftYesNo(&data->textState, &data->var, FALSE, gText_HaventReceivedCardsGift); switch (input) { case 0: // Yes MysteryGiftClient_SetParam(FALSE); MysteryGiftClient_AdvanceState(); data->state = MG_STATE_CLIENT_COMMUNICATING; break; case 1: // No case MENU_B_PRESSED: MysteryGiftClient_SetParam(TRUE); MysteryGiftClient_AdvanceState(); data->state = MG_STATE_CLIENT_COMMUNICATING; break; } break; case MG_STATE_CLIENT_LINK_END: if (IsLinkRfuTaskFinished()) { DestroyWirelessStatusIndicatorSprite(); data->state = MG_STATE_CLIENT_COMM_COMPLETED; } break; case MG_STATE_CLIENT_COMM_COMPLETED: if (PrintStringAndWait2Seconds(&data->textState, gText_CommunicationCompleted)) { if (data->sourceIsFriend == TRUE) StringCopy(gStringVar1, gLinkPlayers[0].name); data->state = MG_STATE_CLIENT_RESULT_MSG; } break; case MG_STATE_CLIENT_RESULT_MSG: msg = GetClientResultMessage(&successMsg, data->isWonderNews, data->sourceIsFriend, data->msgId); if (msg == NULL) msg = data->clientMsg; if (successMsg) input = PrintSuccessMessage(&data->textState, msg, &data->var); else input = PrintMysteryGiftMenuMessage(&data->textState, msg); // input var re-used, here it is TRUE if the message is finished if (input) { if (data->msgId == CLI_MSG_NEWS_RECEIVED) { if (data->sourceIsFriend == TRUE) WonderNews_SetReward(WONDER_NEWS_RECV_FRIEND); else WonderNews_SetReward(WONDER_NEWS_RECV_WIRELESS); } if (!successMsg) { // Did not receive card/news, return to main menu data->state = MG_STATE_TO_MAIN_MENU; PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE); } else { data->state = MG_STATE_SAVE_LOAD_GIFT; } } break; case MG_STATE_SAVE_LOAD_GIFT: if (SaveOnMysteryGiftMenu(&data->textState)) { data->state = MG_STATE_TO_MAIN_MENU; PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE); } break; case MG_STATE_LOAD_GIFT: if (HandleLoadWonderCardOrNews(&data->textState, data->isWonderNews)) data->state = MG_STATE_HANDLE_GIFT_INPUT; break; case MG_STATE_HANDLE_GIFT_INPUT: if (!data->isWonderNews) { // Handle Wonder Card input if (JOY_NEW(A_BUTTON)) data->state = MG_STATE_HANDLE_GIFT_SELECT; if (JOY_NEW(B_BUTTON)) data->state = MG_STATE_GIFT_INPUT_EXIT; } else { switch (WonderNews_GetInput(gMain.newKeys)) { case NEWS_INPUT_A: WonderNews_RemoveScrollIndicatorArrowPair(); data->state = MG_STATE_HANDLE_GIFT_SELECT; break; case NEWS_INPUT_B: data->state = MG_STATE_GIFT_INPUT_EXIT; break; } } break; case MG_STATE_HANDLE_GIFT_SELECT: { // A Wonder Card/News has been selected, handle its menu u32 result; if (!data->isWonderNews) { if (IsSendingSavedWonderCardAllowed()) result = HandleMysteryGiftListMenu(&data->textState, &data->var, data->isWonderNews, FALSE); else result = HandleMysteryGiftListMenu(&data->textState, &data->var, data->isWonderNews, TRUE); } else { if (IsSendingSavedWonderNewsAllowed()) result = HandleMysteryGiftListMenu(&data->textState, &data->var, data->isWonderNews, FALSE); else result = HandleMysteryGiftListMenu(&data->textState, &data->var, data->isWonderNews, TRUE); } switch (result) { case 0: // Receive data->state = MG_STATE_RECEIVE; break; case 1: // Send data->state = MG_STATE_SEND; break; case 2: // Toss data->state = MG_STATE_ASK_TOSS; break; case LIST_CANCEL: if (data->isWonderNews == TRUE) WonderNews_AddScrollIndicatorArrowPair(); data->state = MG_STATE_HANDLE_GIFT_INPUT; break; } break; } case MG_STATE_ASK_TOSS: // Player is attempting to discard a saved Wonder Card/News switch (AskDiscardGift(&data->textState, &data->var, data->isWonderNews)) { case 0: // Yes if (!data->isWonderNews && IsSavedWonderCardGiftNotReceived() == TRUE) data->state = MG_STATE_ASK_TOSS_UNRECEIVED; else data->state = MG_STATE_TOSS; break; case 1: // No case MENU_B_PRESSED: data->state = MG_STATE_HANDLE_GIFT_SELECT; break; } break; case MG_STATE_ASK_TOSS_UNRECEIVED: // Player has selected to toss a Wonder Card that they haven't received the gift for. // Ask for confirmation again. switch ((u32)DoMysteryGiftYesNo(&data->textState, &data->var, TRUE, gText_HaventReceivedGiftOkayToDiscard)) { case 0: // Yes data->state = MG_STATE_TOSS; break; case 1: // No case MENU_B_PRESSED: data->state = MG_STATE_HANDLE_GIFT_SELECT; break; } break; case MG_STATE_TOSS: if (ExitWonderCardOrNews(data->isWonderNews, TRUE)) { ClearSavedNewsOrCard(data->isWonderNews); data->state = MG_STATE_TOSS_SAVE; } break; case MG_STATE_TOSS_SAVE: if (SaveOnMysteryGiftMenu(&data->textState)) data->state = MG_STATE_TOSSED; break; case MG_STATE_TOSSED: if (PrintThrownAway(&data->textState, data->isWonderNews)) { data->state = MG_STATE_TO_MAIN_MENU; PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE); } break; case MG_STATE_GIFT_INPUT_EXIT: if (ExitWonderCardOrNews(data->isWonderNews, FALSE)) data->state = MG_STATE_TO_MAIN_MENU; break; case MG_STATE_RECEIVE: if (ExitWonderCardOrNews(data->isWonderNews, TRUE)) data->state = MG_STATE_SOURCE_PROMPT; break; case MG_STATE_SEND: if (ExitWonderCardOrNews(data->isWonderNews, TRUE)) { switch (data->isWonderNews) { case FALSE: CreateTask_SendMysteryGift(ACTIVITY_WONDER_CARD); break; case TRUE: CreateTask_SendMysteryGift(ACTIVITY_WONDER_NEWS); break; } data->sourceIsFriend = TRUE; data->state = MG_STATE_SERVER_LINK_WAIT; } break; case MG_STATE_SERVER_LINK_WAIT: if (gReceivedRemoteLinkPlayers) { ClearScreenInBg0(TRUE); data->state = MG_STATE_SERVER_LINK_START; } else if (gSpecialVar_Result == LINKUP_FAILED) { ClearScreenInBg0(TRUE); data->state = MG_STATE_LOAD_GIFT; } break; case MG_STATE_SERVER_LINK_START: *gStringVar1 = EOS; *gStringVar2 = EOS; *gStringVar3 = EOS; if (!data->isWonderNews) { AddTextPrinterToWindow1(gText_SendingWonderCard); MysterGiftServer_CreateForCard(); } else { AddTextPrinterToWindow1(gText_SendingWonderNews); MysterGiftServer_CreateForNews(); } data->state = MG_STATE_SERVER_LINK; break; case MG_STATE_SERVER_LINK: if (MysterGiftServer_Run(&data->var) == SVR_RET_END) { data->msgId = data->var; data->state = MG_STATE_SERVER_LINK_END; } break; case MG_STATE_SERVER_LINK_END: Rfu_SetCloseLinkCallback(); StringCopy(gStringVar1, gLinkPlayers[1].name); data->state = MG_STATE_SERVER_LINK_END_WAIT; break; case MG_STATE_SERVER_LINK_END_WAIT: if (IsLinkRfuTaskFinished()) { DestroyWirelessStatusIndicatorSprite(); data->state = MG_STATE_SERVER_RESULT_MSG; } break; case MG_STATE_SERVER_RESULT_MSG: if (PrintServerResultMessage(&data->textState, &data->var, data->sourceIsFriend, data->msgId)) { if (data->sourceIsFriend == TRUE && data->msgId == SVR_MSG_NEWS_SENT) { WonderNews_SetReward(WONDER_NEWS_SENT); data->state = MG_STATE_SAVE_LOAD_GIFT; } else { data->state = MG_STATE_TO_MAIN_MENU; PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE); } } break; case MG_STATE_CLIENT_ERROR: case MG_STATE_SERVER_ERROR: if (PrintMysteryGiftMenuMessage(&data->textState, gText_CommunicationError)) { data->state = MG_STATE_TO_MAIN_MENU; PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE); } break; case MG_STATE_EXIT: CloseLink(); HelpSystem_Enable(); Free(data->clientMsg); DestroyTask(taskId); SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen); break; } } u16 GetMysteryGiftBaseBlock(void) { return 0x19B; } ================================================ FILE: src/mystery_gift_scripts.c ================================================ #include "global.h" #include "mystery_gift_server.h" #include "mystery_gift_client.h" #include "constants/mystery_gift.h" extern const struct MysteryGiftServerCmd gServerScript_ClientCanceledCard[]; // Unreferenced static const u8 sText_CollectedAllStamps[] = _("You have collected all STAMPs!\nWant to input a CARD as a prize?"); //================== // Client scripts //================== const struct MysteryGiftClientCmd gMysteryGiftClientScript_Init[] = { {CLI_RECV, MG_LINKID_CLIENT_SCRIPT}, {CLI_COPY_RECV} }; static const struct MysteryGiftClientCmd sClientScript_SendGameData[] = { {CLI_LOAD_GAME_DATA}, {CLI_SEND_LOADED}, {CLI_RECV, MG_LINKID_CLIENT_SCRIPT}, {CLI_COPY_RECV} }; static const struct MysteryGiftClientCmd sClientScript_CantAccept[] = { {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_CANT_ACCEPT} }; static const struct MysteryGiftClientCmd sClientScript_CommError[] = { {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_COMM_ERROR} }; static const struct MysteryGiftClientCmd sClientScript_NothingSent[] = { {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_NOTHING_SENT} }; static const struct MysteryGiftClientCmd sClientScript_SaveCard[] = { {CLI_RECV, MG_LINKID_CARD}, {CLI_SAVE_CARD}, {CLI_RECV, MG_LINKID_RAM_SCRIPT}, {CLI_SAVE_RAM_SCRIPT}, {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_CARD_RECEIVED} }; static const struct MysteryGiftClientCmd sClientScript_SaveNews[] = { {CLI_RECV, MG_LINKID_NEWS}, {CLI_SAVE_NEWS}, {CLI_SEND_LOADED}, // Send whether or not the News was saved (read by sServerScript_SendNews) {CLI_RECV, MG_LINKID_CLIENT_SCRIPT}, {CLI_COPY_RECV} }; static const struct MysteryGiftClientCmd sClientScript_HadNews[] = { {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_HAD_NEWS} }; static const struct MysteryGiftClientCmd sClientScript_NewsReceived[] = { {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_NEWS_RECEIVED} }; static const struct MysteryGiftClientCmd sClientScript_AskToss[] = { {CLI_ASK_TOSS}, {CLI_LOAD_TOSS_RESPONSE}, {CLI_SEND_LOADED}, {CLI_RECV, MG_LINKID_CLIENT_SCRIPT}, {CLI_COPY_RECV} }; static const struct MysteryGiftClientCmd sClientScript_Canceled[] = { {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_COMM_CANCELED} }; static const struct MysteryGiftClientCmd sClientScript_HadCard[] = { {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_HAD_CARD} }; static const struct MysteryGiftClientCmd sClientScript_DynamicSuccess[] = { {CLI_RECV, MG_LINKID_DYNAMIC_MSG}, {CLI_COPY_MSG}, {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_BUFFER_SUCCESS} }; //================== // Server scripts //================== static const struct MysteryGiftServerCmd sServerScript_CantSend[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_CantAccept)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_READY_END}, {SVR_RETURN, SVR_MSG_CANT_SEND_GIFT_1} }; static const struct MysteryGiftServerCmd sServerScript_CommError[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_CommError)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_READY_END}, {SVR_RETURN, SVR_MSG_COMM_ERROR} }; static const struct MysteryGiftServerCmd sServerScript_ClientCanceledNews[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_Canceled)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_READY_END}, {SVR_RETURN, SVR_MSG_CLIENT_CANCELED} }; static const struct MysteryGiftServerCmd sServerScript_HasNews[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_HadNews)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_READY_END}, {SVR_RETURN, SVR_MSG_HAS_NEWS} }; static const struct MysteryGiftServerCmd sServerScript_SendNews[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_SaveNews)}, {SVR_SEND}, {SVR_LOAD_NEWS}, {SVR_SEND}, {SVR_RECV, MG_LINKID_RESPONSE}, {SVR_READ_RESPONSE}, {SVR_GOTO_IF_EQ, TRUE, sServerScript_HasNews}, // Wonder News was not saved {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_NewsReceived)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_READY_END}, {SVR_RETURN, SVR_MSG_NEWS_SENT} }; static const struct MysteryGiftServerCmd sServerScript_SendCard[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_SaveCard)}, {SVR_SEND}, {SVR_LOAD_CARD}, {SVR_SEND}, {SVR_LOAD_RAM_SCRIPT}, {SVR_SEND}, {SVR_RECV, MG_LINKID_READY_END}, {SVR_RETURN, SVR_MSG_CARD_SENT} }; static const struct MysteryGiftServerCmd sServerScript_TossPrompt[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_AskToss)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_RESPONSE}, {SVR_READ_RESPONSE}, {SVR_GOTO_IF_EQ, FALSE, sServerScript_SendCard}, // Tossed old card, send new one {SVR_GOTO, .ptr = gServerScript_ClientCanceledCard} // Kept old card, cancel new one }; static const struct MysteryGiftServerCmd sServerScript_HasCard[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_HadCard)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_READY_END}, {SVR_RETURN, SVR_MSG_HAS_CARD} }; static const struct MysteryGiftServerCmd sServerScript_NothingSent[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_NothingSent)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_READY_END}, {SVR_RETURN, SVR_MSG_NOTHING_SENT} }; const struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderNews[] = { {SVR_COPY_SAVED_NEWS}, {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_SendGameData)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_GAME_DATA}, {SVR_COPY_GAME_DATA}, {SVR_CHECK_GAME_DATA}, {SVR_GOTO_IF_EQ, FALSE, sServerScript_CantSend}, {SVR_GOTO, .ptr = sServerScript_SendNews}, }; const struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderCard[] = { {SVR_COPY_SAVED_CARD}, {SVR_COPY_SAVED_RAM_SCRIPT}, {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_SendGameData)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_GAME_DATA}, {SVR_COPY_GAME_DATA}, {SVR_CHECK_GAME_DATA}, {SVR_GOTO_IF_EQ, FALSE, sServerScript_CantSend}, {SVR_CHECK_EXISTING_CARD}, {SVR_GOTO_IF_EQ, HAS_DIFF_CARD, sServerScript_TossPrompt}, {SVR_GOTO_IF_EQ, HAS_NO_CARD, sServerScript_SendCard}, {SVR_GOTO, .ptr = sServerScript_HasCard} // HAS_SAME_CARD }; ================================================ FILE: src/mystery_gift_server.c ================================================ #include "global.h" #include "gflib.h" #include "script.h" #include "mystery_gift.h" #include "mystery_gift_server.h" // Assert statements use the original GF names, which are defined below. // Note that their name "flag" is especially misleading, // as it's not a boolean (for example it can contain a size argument). // 'parameter' is shortened to param explicitly to avoid a collision with // the original name for a different field. #define mainseqno funcId #define func_tbl sFuncTable #define parameter ptr #define flag param #define ME_SEND_BUF_SIZE MG_LINK_BUFFER_SIZE #define FILE ABSPATH("mevent_server.c") #define ASSERT_PTR_EMPTY(lineNum) AGB_ASSERT_EX(cmd->parameter == NULL, FILE, (lineNum)); #define ASSERT_PARAM_EMPTY(lineNum) AGB_ASSERT_EX(cmd->flag == FALSE, FILE, (lineNum)); #define ASSERT_PTR_PARAM_EMPTY(lineNum) AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, FILE, (lineNum)); #define ASSERT_VALID_FUNC(lineNum) AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), FILE, (lineNum)); #define ASSERT_SIZE_OK(lineNum) AGB_ASSERT_EX(size <= ME_SEND_BUF_SIZE, FILE, (lineNum)); enum { FUNC_INIT, FUNC_DONE, FUNC_RECV, FUNC_SEND, FUNC_RUN, }; static EWRAM_DATA struct MysteryGiftServer * sServer = NULL; static void MysteryGiftServer_Init(struct MysteryGiftServer *, const void *, u32, u32); static void MysteryGiftServer_Free(struct MysteryGiftServer *); static u32 MysteryGiftServer_CallFunc(struct MysteryGiftServer *); extern const struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderNews[]; extern const struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderCard[]; void MysterGiftServer_CreateForNews(void) { sServer = AllocZeroed(sizeof(*sServer)); MysteryGiftServer_Init(sServer, gMysteryGiftServerScript_SendWonderNews, 0, 1); } void MysterGiftServer_CreateForCard(void) { sServer = AllocZeroed(sizeof(*sServer)); MysteryGiftServer_Init(sServer, gMysteryGiftServerScript_SendWonderCard, 0, 1); } u32 MysterGiftServer_Run(u16 * endVal) { u32 result; if (sServer == NULL) return SVR_RET_END; result = MysteryGiftServer_CallFunc(sServer); if (result == SVR_RET_END) { *endVal = sServer->param; MysteryGiftServer_Free(sServer); FREE_AND_SET_NULL(sServer); } return result; } static void MysteryGiftServer_Init(struct MysteryGiftServer * svr, const void *script, u32 sendPlayerId, u32 recvPlayerId) { svr->unused = 0; svr->funcId = FUNC_INIT; svr->card = AllocZeroed(sizeof(*svr->card)); svr->news = AllocZeroed(sizeof(*svr->news)); svr->recvBuffer = AllocZeroed(MG_LINK_BUFFER_SIZE); svr->linkGameData = AllocZeroed(sizeof(*svr->linkGameData)); svr->script = script; svr->cmdidx = 0; MysteryGiftLink_Init(&svr->manager, sendPlayerId, recvPlayerId); } static void MysteryGiftServer_Free(struct MysteryGiftServer * svr) { Free(svr->card); Free(svr->news); Free(svr->recvBuffer); Free(svr->linkGameData); } static void MysteryGiftServer_InitSend(struct MysteryGiftServer * svr, u32 ident, const void *src, u32 size) { ASSERT_SIZE_OK(257); MysteryGiftLink_InitSend(&svr->manager, ident, src, size); } // Given the command pointer parameter and the 'default' normal data. // If the command's pointer is not empty use that as the send data, otherwise use the default. static const void *MysteryGiftServer_GetSendData(const void *dynamicData, const void *defaultData) { if (dynamicData != NULL) return dynamicData; else return defaultData; } static u32 MysteryGiftServer_Compare(const void *a, const void *b) { if (b < a) return 0; else if (b == a) return 1; else return 2; } static u32 Server_Init(struct MysteryGiftServer * svr) { svr->funcId = FUNC_RUN; return SVR_RET_INIT; } static u32 Server_Done(struct MysteryGiftServer * svr) { return SVR_RET_END; } static u32 Server_Recv(struct MysteryGiftServer * svr) { if (MysteryGiftLink_Recv(&svr->manager)) svr->funcId = FUNC_RUN; return SVR_RET_ACTIVE; } static u32 Server_Send(struct MysteryGiftServer * svr) { if (MysteryGiftLink_Send(&svr->manager)) svr->funcId = FUNC_RUN; return SVR_RET_ACTIVE; } static u32 Server_Run(struct MysteryGiftServer * svr) { // process command const struct MysteryGiftServerCmd * cmd = &svr->script[svr->cmdidx]; const void *ptr; svr->cmdidx++; switch (cmd->instr) { case SVR_RETURN: ASSERT_PTR_EMPTY(354); svr->funcId = FUNC_DONE; svr->param = cmd->param; // Set for endVal in MysteryGiftServer_Run break; case SVR_SEND: svr->funcId = FUNC_SEND; break; case SVR_RECV: ASSERT_PTR_EMPTY(364); MysteryGiftLink_InitRecv(&svr->manager, cmd->param, svr->recvBuffer); svr->funcId = FUNC_RECV; break; case SVR_GOTO: ASSERT_PARAM_EMPTY(370); svr->cmdidx = 0; svr->script = cmd->ptr; break; case SVR_COPY_GAME_DATA: ASSERT_PARAM_EMPTY(376); ASSERT_PTR_EMPTY(377); memcpy(svr->linkGameData, svr->recvBuffer, sizeof(*svr->linkGameData)); break; case SVR_CHECK_GAME_DATA: ASSERT_PARAM_EMPTY(382); ASSERT_PTR_EMPTY(383); svr->param = MysteryGift_ValidateLinkGameData(svr->linkGameData); break; case SVR_GOTO_IF_EQ: if (svr->param == cmd->param) { svr->cmdidx = 0; svr->script = cmd->ptr; } break; case SVR_CHECK_EXISTING_CARD: ASSERT_PARAM_EMPTY(396); ptr = MysteryGiftServer_GetSendData(cmd->ptr, svr->card); svr->param = MysteryGift_CompareCardFlags(ptr, svr->linkGameData, ptr); break; case SVR_READ_RESPONSE: ASSERT_PARAM_EMPTY(402); ASSERT_PTR_EMPTY(403); svr->param = *(u32 *)svr->recvBuffer; break; case SVR_CHECK_EXISTING_STAMPS: ASSERT_PARAM_EMPTY(408); ptr = MysteryGiftServer_GetSendData(cmd->ptr, &svr->stamp); svr->param = MysteryGift_CheckStamps(ptr, svr->linkGameData, ptr); break; case SVR_GET_CARD_STAT: ASSERT_PTR_EMPTY(415); svr->param = MysteryGift_GetCardStatFromLinkData(svr->linkGameData, cmd->param); break; case SVR_CHECK_QUESTIONNAIRE: ASSERT_PARAM_EMPTY(420); svr->param = MysteryGift_DoesQuestionnaireMatch(svr->linkGameData, cmd->ptr); break; case SVR_COMPARE: ASSERT_PARAM_EMPTY(426); svr->param = MysteryGiftServer_Compare(cmd->ptr, *(void **)svr->recvBuffer); break; case SVR_LOAD_NEWS: ASSERT_PARAM_EMPTY(432); MysteryGiftServer_InitSend(svr, MG_LINKID_NEWS, MysteryGiftServer_GetSendData(cmd->ptr, svr->news), sizeof(struct WonderNews)); break; case SVR_LOAD_CARD: ASSERT_PARAM_EMPTY(438); MysteryGiftServer_InitSend(svr, MG_LINKID_CARD, MysteryGiftServer_GetSendData(cmd->ptr, svr->card), sizeof(struct WonderCard)); break; case SVR_LOAD_STAMP: ASSERT_PARAM_EMPTY(444); MysteryGiftServer_InitSend(svr, MG_LINKID_STAMP, MysteryGiftServer_GetSendData(cmd->ptr, &svr->stamp), sizeof(svr->stamp)); break; case SVR_LOAD_RAM_SCRIPT: if (cmd->ptr == NULL) MysteryGiftServer_InitSend(svr, MG_LINKID_RAM_SCRIPT, svr->ramScript, svr->ramScriptSize); else MysteryGiftServer_InitSend(svr, MG_LINKID_RAM_SCRIPT, cmd->ptr, cmd->param); break; case SVR_LOAD_CLIENT_SCRIPT: if (cmd->ptr == NULL) MysteryGiftServer_InitSend(svr, MG_LINKID_CLIENT_SCRIPT, svr->clientScript, svr->clientScriptSize); else MysteryGiftServer_InitSend(svr, MG_LINKID_CLIENT_SCRIPT, cmd->ptr, cmd->param); break; case SVR_LOAD_EREADER_TRAINER: ASSERT_PARAM_EMPTY(466); MysteryGiftServer_InitSend(svr, MG_LINKID_EREADER_TRAINER, cmd->ptr, sizeof(struct BattleTowerEReaderTrainer)); break; case SVR_LOAD_MSG: MysteryGiftServer_InitSend(svr, MG_LINKID_DYNAMIC_MSG, cmd->ptr, cmd->param); break; case SVR_LOAD_UNK_2: MysteryGiftServer_InitSend(svr, MG_LINKID_UNK_2, cmd->ptr, cmd->param); break; case SVR_COPY_CARD: ASSERT_PARAM_EMPTY(481); memcpy(svr->card, cmd->ptr, sizeof(*svr->card)); break; case SVR_COPY_NEWS: ASSERT_PARAM_EMPTY(486); memcpy(svr->news, cmd->ptr, sizeof(*svr->news)); break; case SVR_COPY_STAMP: ASSERT_PARAM_EMPTY(491); svr->stamp = *(u32 *)cmd->ptr; break; case SVR_SET_RAM_SCRIPT: svr->ramScript = cmd->ptr; svr->ramScriptSize = cmd->param; break; case SVR_SET_CLIENT_SCRIPT: svr->clientScript = cmd->ptr; svr->clientScriptSize = cmd->param; break; case SVR_COPY_SAVED_CARD: ASSERT_PTR_PARAM_EMPTY(506); memcpy(svr->card, GetSavedWonderCard(), sizeof(*svr->card)); DisableWonderCardSending(svr->card); break; case SVR_COPY_SAVED_NEWS: ASSERT_PTR_PARAM_EMPTY(512); memcpy(svr->news, GetSavedWonderNews(), sizeof(*svr->news)); break; case SVR_COPY_SAVED_RAM_SCRIPT: ASSERT_PTR_PARAM_EMPTY(517); svr->ramScript = GetSavedRamScriptIfValid(); break; case SVR_LOAD_UNK_1: MysteryGiftServer_InitSend(svr, MG_LINKID_UNK_1, cmd->ptr, cmd->param); break; } return SVR_RET_ACTIVE; } static u32 (*const sFuncTable[])(struct MysteryGiftServer *) = { [FUNC_INIT] = Server_Init, [FUNC_DONE] = Server_Done, [FUNC_RECV] = Server_Recv, [FUNC_SEND] = Server_Send, [FUNC_RUN] = Server_Run }; static u32 MysteryGiftServer_CallFunc(struct MysteryGiftServer * svr) { u32 response; ASSERT_VALID_FUNC(546) response = sFuncTable[svr->funcId](svr); ASSERT_VALID_FUNC(548) return response; } ================================================ FILE: src/mystery_gift_show_card.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "menu.h" #include "new_menu_helpers.h" #include "pokemon_icon.h" #include "mystery_gift_menu.h" #include "mystery_gift.h" #include "battle_anim.h" #include "constants/mystery_gift.h" enum { WIN_HEADER, WIN_BODY, WIN_FOOTER, WIN_COUNT }; #define TAG_STAMP_SHADOW 0x8000 struct CardStatTextData { u8 width; u8 statText[WONDER_CARD_TEXT_LENGTH + 1]; u8 statNumberText[4]; }; struct WonderCardData { /*0000*/ struct WonderCard card; /*014c*/ struct WonderCardMetadata cardMetadata; /*0170*/ const struct WonderGraphics * gfx; /*0174*/ u8 enterExitState; /*0175*/ u8 recordIdx; /*0176*/ u16 windowIds[WIN_COUNT]; /*017C*/ u8 monIconSpriteId; /*017D*/ u8 stampSpriteIds[MAX_STAMP_CARD_STAMPS][2]; // 2 sprites each, 1 for the shadow and 1 for the Pokémon /*018B*/ u8 titleText[WONDER_CARD_TEXT_LENGTH + 1]; /*01B4*/ u8 subtitleText[WONDER_CARD_TEXT_LENGTH + 1]; /*01DD*/ u8 idNumberText[7]; /*01E4*/ u8 bodyText[WONDER_CARD_BODY_TEXT_LINES][WONDER_CARD_TEXT_LENGTH + 1]; /*0288*/ u8 footerLine1Text[WONDER_CARD_TEXT_LENGTH + 1]; /*02B1*/ u8 footerLine2Text[WONDER_CARD_TEXT_LENGTH + 1]; /*02DC*/ struct CardStatTextData statTextData[8]; /*045C*/ u8 bgTilemapBuffer[0x1000]; }; static EWRAM_DATA struct WonderCardData * sWonderCardData = NULL; static void BufferCardText(void); static void DrawCardWindow(u8 whichWindow); static void CreateCardSprites(void); static void DestroyCardSprites(void); static const u8 sTextColorTable[][3] = { {0, 2, 3}, {0, 1, 2} }; static const u8 ALIGNED(4) sFooterTextOffsets[CARD_TYPE_COUNT] = { [CARD_TYPE_GIFT] = 7, [CARD_TYPE_STAMP] = 4, [CARD_TYPE_LINK_STAT] = 7 }; static const struct WindowTemplate sWindowTemplates[] = { [WIN_HEADER] = { .bg = 1, .tilemapLeft = 1, .tilemapTop = 1, .width = 25, .height = 4, .paletteNum = 15, .baseBlock = 0x29c }, [WIN_BODY] = { .bg = 1, .tilemapLeft = 1, .tilemapTop = 6, .width = 28, .height = 8, .paletteNum = 15, .baseBlock = 0x1bc }, [WIN_FOOTER] = { .bg = 1, .tilemapLeft = 1, .tilemapTop = 14, .width = 28, .height = 5, .paletteNum = 15, .baseBlock = 0x130 } }; static const u16 sCard0Pal[] = INCBIN_U16("graphics/wonder_card/bg0.gbapal"); const u16 gCard1Pal[] = INCBIN_U16("graphics/wonder_card/bg1.gbapal"); const u16 gCard2Pal[] = INCBIN_U16("graphics/wonder_card/bg2.gbapal"); const u16 gCard3Pal[] = INCBIN_U16("graphics/wonder_card/bg3.gbapal"); const u16 gCard4Pal[] = INCBIN_U16("graphics/wonder_card/bg4.gbapal"); const u16 gCard5Pal[] = INCBIN_U16("graphics/wonder_card/bg5.gbapal"); static const u16 sCard6Pal[] = INCBIN_U16("graphics/wonder_card/bg6.gbapal"); static const u16 sCard7Pal[] = INCBIN_U16("graphics/wonder_card/bg7.gbapal"); static const u8 sCard0Gfx[] = INCBIN_U8("graphics/wonder_card/bg0.4bpp.lz"); static const u8 sCard0Map[] = INCBIN_U8("graphics/wonder_card/bg0.bin.lz"); static const u8 sCard1Gfx[] = INCBIN_U8("graphics/wonder_card/bg1.4bpp.lz"); static const u8 sCard1Map[] = INCBIN_U8("graphics/wonder_card/bg1.bin.lz"); static const u8 sCard2Gfx[] = INCBIN_U8("graphics/wonder_card/bg2.4bpp.lz"); static const u8 sCard2Map[] = INCBIN_U8("graphics/wonder_card/bg2.bin.lz"); static const u8 sCard6Gfx[] = INCBIN_U8("graphics/wonder_card/bg6.4bpp.lz"); static const u8 sCard6Map[] = INCBIN_U8("graphics/wonder_card/bg6.bin.lz"); static const u8 sCard7Gfx[] = INCBIN_U8("graphics/wonder_card/bg7.4bpp.lz"); static const u8 sCard7Map[] = INCBIN_U8("graphics/wonder_card/bg7.bin.lz"); static const u16 sStampShadowPal0[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_0.gbapal"); static const u16 sStampShadowPal1[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_1.gbapal"); static const u16 sStampShadowPal2[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_2.gbapal"); static const u16 sStampShadowPal3[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_3.gbapal"); static const u16 sStampShadowPal4[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_4.gbapal"); static const u16 sStampShadowPal5[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_5.gbapal"); static const u16 sStampShadowPal6[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_6.gbapal"); static const u16 sStampShadowPal7[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_7.gbapal"); static const u32 sStampShadowGfx[] = INCBIN_U32("graphics/wonder_card/stamp_shadow.4bpp.lz"); static const struct CompressedSpriteSheet sSpriteSheet_StampShadow = { sStampShadowGfx, 0x100, TAG_STAMP_SHADOW }; static const struct SpritePalette sSpritePalettes_StampShadow[] = { {sStampShadowPal0, TAG_STAMP_SHADOW}, {sStampShadowPal1, TAG_STAMP_SHADOW}, {sStampShadowPal2, TAG_STAMP_SHADOW}, {sStampShadowPal3, TAG_STAMP_SHADOW}, {sStampShadowPal4, TAG_STAMP_SHADOW}, {sStampShadowPal5, TAG_STAMP_SHADOW}, {sStampShadowPal6, TAG_STAMP_SHADOW}, {sStampShadowPal7, TAG_STAMP_SHADOW} }; static const struct SpriteTemplate sSpriteTemplate_StampShadow = { .tileTag = TAG_STAMP_SHADOW, .paletteTag = TAG_STAMP_SHADOW, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct WonderGraphics sCardGraphics[NUM_WONDER_BGS] = { {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 0, .tiles = sCard0Gfx, .map = sCard0Map, .pal = sCard0Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 1, .tiles = sCard1Gfx, .map = sCard1Map, .pal = gCard1Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 2, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard2Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 3, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard3Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 4, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard4Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 5, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard5Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 6, .tiles = sCard6Gfx, .map = sCard6Map, .pal = sCard6Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 7, .tiles = sCard7Gfx, .map = sCard7Map, .pal = sCard7Pal} }; bool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata) { if (card == NULL || metadata == NULL) return FALSE; sWonderCardData = AllocZeroed(sizeof(*sWonderCardData)); if (sWonderCardData == NULL) return FALSE; sWonderCardData->card = *card; sWonderCardData->cardMetadata = *metadata; if (sWonderCardData->card.bgType >= NUM_WONDER_BGS) sWonderCardData->card.bgType = 0; if (sWonderCardData->card.type >= CARD_TYPE_COUNT) sWonderCardData->card.type = 0; if (sWonderCardData->card.maxStamps > MAX_STAMP_CARD_STAMPS) sWonderCardData->card.maxStamps = 0; sWonderCardData->gfx = &sCardGraphics[sWonderCardData->card.bgType]; return TRUE; } void WonderCard_Destroy(void) { if (sWonderCardData != NULL) { *sWonderCardData = (struct WonderCardData){}; FREE_AND_SET_NULL(sWonderCardData); } } s32 WonderCard_Enter(void) { if (sWonderCardData == NULL) return -1; switch(sWonderCardData->enterExitState) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case 1: if (UpdatePaletteFade()) return 0; break; case 2: FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); DecompressAndCopyTileDataToVram(2, sWonderCardData->gfx->tiles, 0, 0x008, 0); sWonderCardData->windowIds[WIN_HEADER] = AddWindow(&sWindowTemplates[WIN_HEADER]); sWonderCardData->windowIds[WIN_BODY] = AddWindow(&sWindowTemplates[WIN_BODY]); sWonderCardData->windowIds[WIN_FOOTER] = AddWindow(&sWindowTemplates[WIN_FOOTER]); break; case 3: if (FreeTempTileDataBuffersIfPossible()) return 0; gPaletteFade.bufferTransferDisabled = TRUE; LoadPalette(sWonderCardData->gfx->pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); LZ77UnCompWram(sWonderCardData->gfx->map, sWonderCardData->bgTilemapBuffer); CopyRectToBgTilemapBufferRect(2, sWonderCardData->bgTilemapBuffer, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0); CopyBgTilemapBufferToVram(2); break; case 4: BufferCardText(); break; case 5: DrawCardWindow(WIN_HEADER); DrawCardWindow(WIN_BODY); DrawCardWindow(WIN_FOOTER); CopyBgTilemapBufferToVram(1); break; case 6: LoadMonIconPalettes(); break; case 7: ShowBg(1); ShowBg(2); gPaletteFade.bufferTransferDisabled = FALSE; CreateCardSprites(); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); UpdatePaletteFade(); break; default: if (UpdatePaletteFade()) return 0; sWonderCardData->enterExitState = 0; return 1; } sWonderCardData->enterExitState++; return 0; } s32 WonderCard_Exit(bool32 useCancel) { if (sWonderCardData == NULL) return -1; switch (sWonderCardData->enterExitState) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case 1: if (UpdatePaletteFade()) return 0; break; case 2: FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); break; case 3: HideBg(1); HideBg(2); RemoveWindow(sWonderCardData->windowIds[WIN_FOOTER]); RemoveWindow(sWonderCardData->windowIds[WIN_BODY]); RemoveWindow(sWonderCardData->windowIds[WIN_HEADER]); break; case 4: DestroyCardSprites(); FreeMonIconPalettes(); break; case 5: PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, useCancel); break; case 6: CopyBgTilemapBufferToVram(0); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; default: if (UpdatePaletteFade()) return 0; sWonderCardData->enterExitState = 0; return 1; } sWonderCardData->enterExitState++; return 0; } static void BufferCardText(void) { u16 i = 0; u16 charsUntilStat; u16 stats[3] = {0, 0, 0}; // Copy title/subtitle text memcpy(sWonderCardData->titleText, sWonderCardData->card.titleText, WONDER_CARD_TEXT_LENGTH); sWonderCardData->titleText[WONDER_CARD_TEXT_LENGTH] = EOS; memcpy(sWonderCardData->subtitleText, sWonderCardData->card.subtitleText, WONDER_CARD_TEXT_LENGTH); sWonderCardData->subtitleText[WONDER_CARD_TEXT_LENGTH] = EOS; // Copy card id number if (sWonderCardData->card.idNumber > 999999) sWonderCardData->card.idNumber = 999999; ConvertIntToDecimalStringN(sWonderCardData->idNumberText, sWonderCardData->card.idNumber, STR_CONV_MODE_LEFT_ALIGN, 6); // Copy body text for (i = 0; i < WONDER_CARD_BODY_TEXT_LINES; i++) { memcpy(sWonderCardData->bodyText[i], sWonderCardData->card.bodyText[i], WONDER_CARD_TEXT_LENGTH); sWonderCardData->bodyText[i][WONDER_CARD_TEXT_LENGTH] = EOS; } // Copy footer line 1 memcpy(sWonderCardData->footerLine1Text, sWonderCardData->card.footerLine1Text, WONDER_CARD_TEXT_LENGTH); sWonderCardData->footerLine1Text[WONDER_CARD_TEXT_LENGTH] = EOS; // Copy footer line 2 switch (sWonderCardData->card.type) { case CARD_TYPE_GIFT: memcpy(sWonderCardData->footerLine2Text, sWonderCardData->card.footerLine2Text, WONDER_CARD_TEXT_LENGTH); sWonderCardData->footerLine2Text[WONDER_CARD_TEXT_LENGTH] = EOS; break; case CARD_TYPE_STAMP: sWonderCardData->footerLine2Text[0] = EOS; break; case CARD_TYPE_LINK_STAT: sWonderCardData->footerLine2Text[0] = EOS; // Load stats stats[0] = sWonderCardData->cardMetadata.battlesWon < MAX_WONDER_CARD_STAT ? sWonderCardData->cardMetadata.battlesWon : MAX_WONDER_CARD_STAT; stats[1] = sWonderCardData->cardMetadata.battlesLost < MAX_WONDER_CARD_STAT ? sWonderCardData->cardMetadata.battlesLost : MAX_WONDER_CARD_STAT; stats[2] = sWonderCardData->cardMetadata.numTrades < MAX_WONDER_CARD_STAT ? sWonderCardData->cardMetadata.numTrades : MAX_WONDER_CARD_STAT; // Init stat text arrays for (i = 0; i < ARRAY_COUNT(sWonderCardData->statTextData); i++) { memset(sWonderCardData->statTextData[i].statNumberText, EOS, sizeof(sWonderCardData->statTextData[i].statNumberText)); memset(sWonderCardData->statTextData[i].statText, EOS, sizeof(sWonderCardData->statTextData[i].statText)); } // Copy stat texts for (i = 0, charsUntilStat = 0; i < WONDER_CARD_TEXT_LENGTH; i++) { if (sWonderCardData->card.footerLine2Text[i] != CHAR_DYNAMIC) { // Regular text, just copy as is sWonderCardData->statTextData[sWonderCardData->recordIdx].statText[charsUntilStat] = sWonderCardData->card.footerLine2Text[i]; charsUntilStat++; } else { // Dynamic char encountered // These are used to give the id of which stat to print u8 id = sWonderCardData->card.footerLine2Text[i + 1]; if (id >= ARRAY_COUNT(stats)) { // Invalid stat id, skip ahead i += 2; } else { // Copy stat number ConvertIntToDecimalStringN(sWonderCardData->statTextData[sWonderCardData->recordIdx].statNumberText, stats[id], STR_CONV_MODE_LEADING_ZEROS, 3); sWonderCardData->statTextData[sWonderCardData->recordIdx].width = sWonderCardData->card.footerLine2Text[i + 2]; sWonderCardData->recordIdx++; if (sWonderCardData->recordIdx >= ARRAY_COUNT(sWonderCardData->statTextData)) break; charsUntilStat = 0; i += 2; } } } } } static void DrawCardWindow(u8 whichWindow) { s8 i = 0; s32 windowId = sWonderCardData->windowIds[whichWindow]; PutWindowTilemap(windowId); FillWindowPixelBuffer(windowId, 0); switch (whichWindow) { case WIN_HEADER: { // Print card title/subtitle s32 x; AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, 0, 1, sTextColorTable[sWonderCardData->gfx->titleTextPal], 0, sWonderCardData->titleText); x = 160 - GetStringWidth(FONT_NORMAL_COPY_2, sWonderCardData->subtitleText, GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LETTER_SPACING)); if (x < 0) x = 0; AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, x, 17, sTextColorTable[sWonderCardData->gfx->titleTextPal], 0, sWonderCardData->subtitleText); // Print id number if (sWonderCardData->card.idNumber != 0) AddTextPrinterParameterized3(windowId, FONT_NORMAL, 166, 17, sTextColorTable[sWonderCardData->gfx->titleTextPal], 0, sWonderCardData->idNumberText); break; } case WIN_BODY: // Print body text for (; i < WONDER_CARD_BODY_TEXT_LINES; i++) AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, 0, 16 * i + 2, sTextColorTable[sWonderCardData->gfx->bodyTextPal], 0, sWonderCardData->bodyText[i]); break; case WIN_FOOTER: // Print footer line 1 AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, 0, sFooterTextOffsets[sWonderCardData->card.type], sTextColorTable[sWonderCardData->gfx->footerTextPal], 0, sWonderCardData->footerLine1Text); // Print footer line 2 if (sWonderCardData->card.type != CARD_TYPE_LINK_STAT) { // Print gift text // Odd that CARD_TYPE_STAMP is not ignored, it has empty text for this AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, 0, 16 + sFooterTextOffsets[sWonderCardData->card.type], sTextColorTable[sWonderCardData->gfx->footerTextPal], 0, sWonderCardData->footerLine2Text); } else { s32 x = 0; s32 y = sFooterTextOffsets[sWonderCardData->card.type] + 16; s32 spacing = GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LETTER_SPACING); for (; i < sWonderCardData->recordIdx; i++) { // Print stat text AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, x, y, sTextColorTable[sWonderCardData->gfx->footerTextPal], 0, sWonderCardData->statTextData[i].statText); if (sWonderCardData->statTextData[i].statNumberText[0] != EOS) { // Print stat number x += GetStringWidth(FONT_NORMAL_COPY_2, sWonderCardData->statTextData[i].statText, spacing); AddTextPrinterParameterized3(windowId, FONT_NORMAL, x, y, sTextColorTable[sWonderCardData->gfx->footerTextPal], 0, sWonderCardData->statTextData[i].statNumberText); x += GetStringWidth(FONT_NORMAL_COPY_2, sWonderCardData->statTextData[i].statNumberText, spacing) + sWonderCardData->statTextData[i].width; } } } break; } CopyWindowToVram(windowId, COPYWIN_FULL); } static void CreateCardSprites(void) { u8 i = 0; sWonderCardData->monIconSpriteId = SPRITE_NONE; // Create icon sprite if (sWonderCardData->cardMetadata.iconSpecies != SPECIES_NONE) { sWonderCardData->monIconSpriteId = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sWonderCardData->cardMetadata.iconSpecies), SpriteCallbackDummy, 220, 20, 0, FALSE); gSprites[sWonderCardData->monIconSpriteId].oam.priority = 2; } // Create stamp sprites if (sWonderCardData->card.maxStamps != 0 && sWonderCardData->card.type == CARD_TYPE_STAMP) { LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_StampShadow); LoadSpritePalette(&sSpritePalettes_StampShadow[sWonderCardData->gfx->stampShadowPal]); for (; i < sWonderCardData->card.maxStamps; i++) { sWonderCardData->stampSpriteIds[i][0] = SPRITE_NONE; sWonderCardData->stampSpriteIds[i][1] = SPRITE_NONE; sWonderCardData->stampSpriteIds[i][0] = CreateSprite(&sSpriteTemplate_StampShadow, 216 - 32 * i, 0x90, 8); if (sWonderCardData->cardMetadata.stampData[0][i] != 0) { sWonderCardData->stampSpriteIds[i][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sWonderCardData->cardMetadata.stampData[0][i]), SpriteCallbackDummy, 216 - 32 * i, 136, 0, 0); gSprites[sWonderCardData->stampSpriteIds[i][1]].oam.priority = 2; } } } } static void DestroyCardSprites(void) { u8 i = 0; // Destroy icon sprite if (sWonderCardData->monIconSpriteId != SPRITE_NONE) DestroyMonIcon(&gSprites[sWonderCardData->monIconSpriteId]); // Destroy stamp sprites if (sWonderCardData->card.maxStamps != 0 && sWonderCardData->card.type == CARD_TYPE_STAMP) { for (; i < sWonderCardData->card.maxStamps; i++) { if (sWonderCardData->stampSpriteIds[i][0] != SPRITE_NONE) { DestroySprite(&gSprites[sWonderCardData->stampSpriteIds[i][0]]); #ifdef BUGFIX if (sWonderCardData->stampSpriteIds[i][1] != SPRITE_NONE) #else if (sWonderCardData->stampSpriteIds[i][0] != SPRITE_NONE) #endif DestroyMonIcon(&gSprites[sWonderCardData->stampSpriteIds[i][1]]); } } FreeSpriteTilesByTag(TAG_STAMP_SHADOW); FreeSpritePaletteByTag(TAG_STAMP_SHADOW); } } ================================================ FILE: src/mystery_gift_show_news.c ================================================ #include "global.h" #include "gflib.h" #include "menu_indicators.h" #include "new_menu_helpers.h" #include "mystery_gift.h" #include "mystery_gift_menu.h" #include "menu.h" #include "link_rfu.h" #include "list_menu.h" #include "constants/mystery_gift.h" enum { WIN_TITLE, WIN_BODY, WIN_COUNT }; #define TAG_ARROWS 0x1000 struct WonderNewsData { struct WonderNews news; const struct WonderGraphics * gfx; bool8 verticalScrollDisabled:1; u8 enterExitState:7; u8 arrowTaskId; bool8 scrolling:1; u8 scrollIncrement:7; bool8 scrollingDown:1; u8 scrollTotal:7; u16 scrollEnd; u16 scrollOffset; u16 windowIds[WIN_COUNT]; u8 unused[2]; u8 titleText[WONDER_NEWS_TEXT_LENGTH + 1]; u8 bodyText[WONDER_NEWS_BODY_TEXT_LINES][WONDER_NEWS_TEXT_LENGTH + 1]; struct ScrollArrowsTemplate arrowsTemplate; u8 bgTilemapBuffer[0x1000]; }; static EWRAM_DATA struct WonderNewsData * sWonderNewsData = NULL; static void BufferNewsText(void); static void DrawNewsWindows(void); static void UpdateNewsScroll(void); static const u8 sTextColorTable[][3] = { {0, 2, 3}, {0, 1, 2} }; static const struct WindowTemplate sWindowTemplates[] = { [WIN_TITLE] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 0, .width = 28, .height = 3, .paletteNum = 15, .baseBlock = 0x000 }, [WIN_BODY] = { .bg = 2, .tilemapLeft = 1, .tilemapTop = 3, .width = 28, .height = 20, .paletteNum = 15, .baseBlock = 0x000 } }; static const struct ScrollArrowsTemplate sArrowsTemplate = { .firstArrowType = SCROLL_ARROW_UP, .firstX = 232, .firstY = 24, .secondArrowType = SCROLL_ARROW_DOWN, .secondX = 232, .secondY = 152, .fullyUpThreshold = 0, .fullyDownThreshold = 2, .tileTag = TAG_ARROWS, .palTag = TAG_ARROWS, .palNum = 0 }; static const u16 sNews0Pal[] = INCBIN_U16("graphics/wonder_news/bg0.gbapal"); static const u16 sNews6Pal[] = INCBIN_U16("graphics/wonder_news/bg6.gbapal"); static const u16 sNews7Pal[] = INCBIN_U16("graphics/wonder_news/bg7.gbapal"); static const u8 sNews0Gfx[] = INCBIN_U8("graphics/wonder_news/bg0.4bpp.lz"); static const u8 sNews0Map[] = INCBIN_U8("graphics/wonder_news/bg0.bin.lz"); static const u8 sNews1Gfx[] = INCBIN_U8("graphics/wonder_news/bg1.4bpp.lz"); static const u8 sNews1Map[] = INCBIN_U8("graphics/wonder_news/bg1.bin.lz"); static const u8 sNews2Gfx[] = INCBIN_U8("graphics/wonder_news/bg2.4bpp.lz"); static const u8 sNews2Map[] = INCBIN_U8("graphics/wonder_news/bg2.bin.lz"); static const u8 sNews6Gfx[] = INCBIN_U8("graphics/wonder_news/bg6.4bpp.lz"); static const u8 sNews6Map[] = INCBIN_U8("graphics/wonder_news/bg6.bin.lz"); static const u8 sNews7Gfx[] = INCBIN_U8("graphics/wonder_news/bg7.4bpp.lz"); static const u8 sNews7Map[] = INCBIN_U8("graphics/wonder_news/bg7.bin.lz"); static const struct WonderGraphics sNewsGraphics[NUM_WONDER_BGS] = { {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews0Gfx, .map = sNews0Map, .pal = sNews0Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews1Gfx, .map = sNews1Map, .pal = gCard1Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard2Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard3Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard4Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard5Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews6Gfx, .map = sNews6Map, .pal = sNews6Pal}, {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews7Gfx, .map = sNews7Map, .pal = sNews7Pal} }; bool32 WonderNews_Init(const struct WonderNews * news) { if (news == NULL) return FALSE; sWonderNewsData = AllocZeroed(sizeof(*sWonderNewsData)); if (sWonderNewsData == NULL) return FALSE; sWonderNewsData->news = *news; if (sWonderNewsData->news.bgType >= NUM_WONDER_BGS) sWonderNewsData->news.bgType = 0; sWonderNewsData->gfx = &sNewsGraphics[sWonderNewsData->news.bgType]; sWonderNewsData->arrowTaskId = TASK_NONE; return TRUE; } void WonderNews_Destroy(void) { if (sWonderNewsData != NULL) { *sWonderNewsData = (struct WonderNewsData){}; FREE_AND_SET_NULL(sWonderNewsData); } } s32 WonderNews_Enter(void) { if (sWonderNewsData == NULL) return -1; switch (sWonderNewsData->enterExitState) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case 1: if (UpdatePaletteFade()) return 0; ChangeBgY(0, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); ChangeBgY(2, 0, BG_COORD_SET); ChangeBgY(3, 0, BG_COORD_SET); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(26, 152)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); break; case 2: FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); DecompressAndCopyTileDataToVram(3, sWonderNewsData->gfx->tiles, 0, 8, 0); sWonderNewsData->windowIds[WIN_TITLE] = AddWindow(&sWindowTemplates[WIN_TITLE]); sWonderNewsData->windowIds[WIN_BODY] = AddWindow(&sWindowTemplates[WIN_BODY]); break; case 3: if (FreeTempTileDataBuffersIfPossible()) return 0; gPaletteFade.bufferTransferDisabled = TRUE; LoadPalette(sWonderNewsData->gfx->pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); LZ77UnCompWram(sWonderNewsData->gfx->map, sWonderNewsData->bgTilemapBuffer); CopyRectToBgTilemapBufferRect(1, sWonderNewsData->bgTilemapBuffer, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0); CopyRectToBgTilemapBufferRect(3, sWonderNewsData->bgTilemapBuffer, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(3); break; case 4: BufferNewsText(); break; case 5: DrawNewsWindows(); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(2); break; case 6: ShowBg(1); ShowBg(2); ShowBg(3); gPaletteFade.bufferTransferDisabled = FALSE; sWonderNewsData->arrowTaskId = AddScrollIndicatorArrowPair(&sWonderNewsData->arrowsTemplate, &sWonderNewsData->scrollOffset); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); UpdatePaletteFade(); break; default: if (UpdatePaletteFade()) return 0; sWonderNewsData->enterExitState = 0; return 1; } sWonderNewsData->enterExitState++; return 0; } s32 WonderNews_Exit(bool32 useCancel) { if (sWonderNewsData == NULL) return -1; switch (sWonderNewsData->enterExitState) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case 1: if (UpdatePaletteFade()) return 0; ChangeBgY(2, 0, BG_COORD_SET); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); break; case 2: FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24); FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); break; case 3: HideBg(1); HideBg(2); RemoveWindow(sWonderNewsData->windowIds[WIN_BODY]); RemoveWindow(sWonderNewsData->windowIds[WIN_TITLE]); break; case 4: ChangeBgY(2, 0, BG_COORD_SET); ChangeBgY(3, 0, BG_COORD_SET); if (sWonderNewsData->arrowTaskId != TASK_NONE) { RemoveScrollIndicatorArrowPair(sWonderNewsData->arrowTaskId); sWonderNewsData->arrowTaskId = TASK_NONE; } break; case 5: PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, useCancel); break; case 6: MG_DrawCheckerboardPattern(); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; default: if (UpdatePaletteFade()) return 0; sWonderNewsData->enterExitState = 0; return 1; } ++sWonderNewsData->enterExitState; return 0; } void WonderNews_RemoveScrollIndicatorArrowPair(void) { if (!sWonderNewsData->verticalScrollDisabled && sWonderNewsData->arrowTaskId != TASK_NONE) { RemoveScrollIndicatorArrowPair(sWonderNewsData->arrowTaskId); sWonderNewsData->arrowTaskId = TASK_NONE; sWonderNewsData->verticalScrollDisabled = TRUE; } } void WonderNews_AddScrollIndicatorArrowPair(void) { if (sWonderNewsData->verticalScrollDisabled) { sWonderNewsData->arrowTaskId = AddScrollIndicatorArrowPair(&sWonderNewsData->arrowsTemplate, &sWonderNewsData->scrollOffset); sWonderNewsData->verticalScrollDisabled = FALSE; } } u32 WonderNews_GetInput(u16 input) { if (sWonderNewsData->scrolling) { UpdateNewsScroll(); return NEWS_INPUT_NONE; } switch (input) { case A_BUTTON: return NEWS_INPUT_A; case B_BUTTON: return NEWS_INPUT_B; case DPAD_UP: if (sWonderNewsData->scrollOffset == 0) return NEWS_INPUT_NONE; if (sWonderNewsData->verticalScrollDisabled) return NEWS_INPUT_NONE; sWonderNewsData->scrollingDown = FALSE; break; case DPAD_DOWN: if (sWonderNewsData->scrollOffset == sWonderNewsData->scrollEnd) return NEWS_INPUT_NONE; if (sWonderNewsData->verticalScrollDisabled) return NEWS_INPUT_NONE; sWonderNewsData->scrollingDown = TRUE; break; default: return NEWS_INPUT_NONE; } // Init scroll sWonderNewsData->scrolling = TRUE; sWonderNewsData->scrollIncrement = 2; sWonderNewsData->scrollTotal = 0; if (!sWonderNewsData->scrollingDown) return NEWS_INPUT_SCROLL_UP; else return NEWS_INPUT_SCROLL_DOWN; } static void BufferNewsText(void) { u8 i = 0; // Copy title text memcpy(sWonderNewsData->titleText, sWonderNewsData->news.titleText, WONDER_NEWS_TEXT_LENGTH); sWonderNewsData->titleText[WONDER_NEWS_TEXT_LENGTH] = EOS; // Copy body text for (; i < WONDER_NEWS_BODY_TEXT_LINES; i++) { memcpy(sWonderNewsData->bodyText[i], sWonderNewsData->news.bodyText[i], WONDER_NEWS_TEXT_LENGTH); sWonderNewsData->bodyText[i][WONDER_NEWS_TEXT_LENGTH] = EOS; if (i > 7 && sWonderNewsData->bodyText[i][0] != EOS) sWonderNewsData->scrollEnd++; } sWonderNewsData->arrowsTemplate = sArrowsTemplate; sWonderNewsData->arrowsTemplate.fullyDownThreshold = sWonderNewsData->scrollEnd; } static void DrawNewsWindows(void) { u8 i = 0; s32 x; PutWindowTilemap(sWonderNewsData->windowIds[WIN_TITLE]); PutWindowTilemap(sWonderNewsData->windowIds[WIN_BODY]); FillWindowPixelBuffer(sWonderNewsData->windowIds[WIN_TITLE], 0); FillWindowPixelBuffer(sWonderNewsData->windowIds[WIN_BODY], 0); // Print title text x = (224 - GetStringWidth(FONT_NORMAL_COPY_2, sWonderNewsData->titleText, GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LETTER_SPACING))) / 2; if (x < 0) x = 0; AddTextPrinterParameterized3(sWonderNewsData->windowIds[WIN_TITLE], FONT_NORMAL_COPY_2, x, 6, sTextColorTable[sWonderNewsData->gfx->titleTextPal], 0, sWonderNewsData->titleText); // Print body text for (; i < WONDER_NEWS_BODY_TEXT_LINES; ++i) { AddTextPrinterParameterized3(sWonderNewsData->windowIds[WIN_BODY], FONT_NORMAL_COPY_2, 0, 16 * i + 2, sTextColorTable[sWonderNewsData->gfx->bodyTextPal], 0, sWonderNewsData->bodyText[i]); } CopyWindowToVram(sWonderNewsData->windowIds[WIN_TITLE], COPYWIN_FULL); CopyWindowToVram(sWonderNewsData->windowIds[WIN_BODY], COPYWIN_FULL); } static void UpdateNewsScroll(void) { u16 bgMove = sWonderNewsData->scrollIncrement; bgMove *= 256; if (sWonderNewsData->scrollingDown) { ChangeBgY(2, bgMove, BG_COORD_ADD); ChangeBgY(3, bgMove, BG_COORD_ADD); } else { ChangeBgY(2, bgMove, BG_COORD_SUB); ChangeBgY(3, bgMove, BG_COORD_SUB); } sWonderNewsData->scrollTotal += sWonderNewsData->scrollIncrement; if (sWonderNewsData->scrollTotal > 15) { if (sWonderNewsData->scrollingDown) sWonderNewsData->scrollOffset++; else sWonderNewsData->scrollOffset--; sWonderNewsData->scrolling = FALSE; sWonderNewsData->scrollTotal = 0; } } ================================================ FILE: src/naming_screen.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "keyboard_text.h" #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" #include "field_effect.h" #include "field_player_avatar.h" #include "field_specials.h" #include "graphics.h" #include "help_system.h" #include "menu.h" #include "overworld.h" #include "naming_screen.h" #include "new_menu_helpers.h" #include "pokemon_icon.h" #include "pokemon_storage_system.h" #include "strings.h" #include "task.h" #include "text_window.h" #include "trig.h" #include "constants/event_object_movement.h" #include "constants/help_system.h" #include "constants/songs.h" #include "constants/event_objects.h" enum { INPUT_NONE, INPUT_DPAD_UP, INPUT_DPAD_DOWN, INPUT_DPAD_LEFT, INPUT_DPAD_RIGHT, INPUT_A_BUTTON, INPUT_B_BUTTON, INPUT_LR_BUTTON, INPUT_SELECT, INPUT_START, }; #define KBROW_COUNT 4 #define KBCOL_COUNT 8 enum { GFXTAG_BACK_BUTTON, GFXTAG_OK_BUTTON, GFXTAG_PAGE_SWAP_FRAME, GFXTAG_PAGE_SWAP_BUTTON, GFXTAG_PAGE_SWAP_UPPER, GFXTAG_PAGE_SWAP_LOWER, GFXTAG_PAGE_SWAP_OTHERS, GFXTAG_CURSOR, GFXTAG_CURSOR_SQUISHED, GFXTAG_CURSOR_FILLED, GFXTAG_INPUT_ARROW, GFXTAG_UNDERSCORE, GFXTAG_RIVAL = 255, }; enum { PALTAG_MENU, // Also the PC icon PALTAG_PAGE_SWAP_UPPER, PALTAG_PAGE_SWAP_LOWER, PALTAG_PAGE_SWAP_OTHERS, // Also the input arrow/underscore PALTAG_PAGE_SWAP, PALTAG_CURSOR, PALTAG_BACK_BUTTON, PALTAG_OK_BUTTON, PALTAG_RIVAL = 255, }; enum { WIN_KB_PAGE_1, // Which of these two windows is in front is cycled as the player swaps WIN_KB_PAGE_2, // Initially WIN_KB_PAGE_1 is in front, with WIN_KB_PAGE_2 on deck WIN_TEXT_ENTRY, WIN_TEXT_ENTRY_BOX, WIN_BANNER, WIN_COUNT, }; // The constants for the pages are needlessly complicated because GF didn't keep the indexing order consistent // This set is used for sNamingScreen->currentPage. It uses the order that the pages are cycled in enum { KBPAGE_SYMBOLS, KBPAGE_LETTERS_UPPER, KBPAGE_LETTERS_LOWER, KBPAGE_COUNT, }; // This set is used for initializing a page's keyboard text and getting its number of columns enum { KEYBOARD_LETTERS_LOWER, KEYBOARD_LETTERS_UPPER, KEYBOARD_SYMBOLS, }; // This set is used for getting the gfx/pal tags of the page's swap button enum { PAGE_SWAP_UPPER, PAGE_SWAP_OTHERS, PAGE_SWAP_LOWER, }; enum { KEY_ROLE_CHAR, KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK, }; enum { BUTTON_PAGE, BUTTON_BACK, BUTTON_OK, BUTTON_COUNT, }; // states for Task_NamingScreen enum { STATE_FADE_IN, STATE_WAIT_FADE_IN, STATE_HANDLE_INPUT, STATE_MOVE_TO_OK_BUTTON, STATE_START_PAGE_SWAP, STATE_WAIT_PAGE_SWAP, STATE_PRESSED_OK, STATE_WAIT_SENT_TO_PC_MESSAGE, STATE_FADE_OUT, STATE_EXIT, }; // sates for Task_HandleInput enum { INPUT_STATE_DISABLED, INPUT_STATE_ENABLED, }; struct NamingScreenTemplate { u8 copyExistingString; u8 maxChars; u8 iconFunction; u8 addGenderIcon; u8 initialPage; const u8 *title; }; struct NamingScreenData { /*0x0*/ u8 tilemapBuffer1[0x800]; /*0x800*/ u8 tilemapBuffer2[0x800]; /*0x800*/ u8 tilemapBuffer3[0x800]; /*0x1800*/ u8 textBuffer[0x10]; /*0x1810*/ u8 tileBuffer[0x600]; /*0x1E10*/ u8 state; /*0x1E11*/ u8 windows[WIN_COUNT]; /*0x1E16*/ u16 inputCharBaseXPos; /*0x1E18*/ u16 bg1vOffset; /*0x1E1A*/ u16 bg2vOffset; /*0x1E1C*/ u16 bg1Priority; /*0x1E1E*/ u16 bg2Priority; /*0x1E20*/ u8 bgToReveal; /*0x1E21*/ u8 bgToHide; /*0x1E22*/ u8 currentPage; /*0x1E23*/ u8 cursorSpriteId; /*0x1E24*/ u8 swapBtnFrameSpriteId; /*0x1E25*/ u8 keyRepeatStartDelayCopy; /*0x1E28*/ const struct NamingScreenTemplate *template; /*0x1E2C*/ u8 templateNum; /*0x1E30*/ u8 *destBuffer; /*0x1E34*/ u16 monSpecies; /*0x1E36*/ u16 monGender; /*0x1E38*/ u32 monPersonality; /*0x1E3C*/ MainCallback returnCallback; }; static EWRAM_DATA struct NamingScreenData * sNamingScreen = NULL; static void CB2_LoadNamingScreen(void); static void NamingScreen_Init(void); static void NamingScreen_InitBGs(void); static void CreateNamingScreenTask(void); static void Task_NamingScreen(u8); static bool8 MainState_FadeIn(void); static bool8 MainState_WaitFadeIn(void); static bool8 MainState_HandleInput(void); static bool8 MainState_MoveToOKButton(void); static bool8 MainState_PressedOKButton(void); static bool8 MainState_FadeOut(void); static bool8 MainState_Exit(void); static void DisplaySentToPCMessage(void); static bool8 MainState_WaitSentToPCMessage(void); static bool8 MainState_StartPageSwap(void); static bool8 MainState_WaitPageSwap(void); static void StartPageSwapAnim(void); static void Task_HandlePageSwapAnim(u8); static bool8 IsPageSwapAnimNotInProgress(void); static bool8 PageSwapAnimState_Init(struct Task *); static bool8 PageSwapAnimState_1(struct Task *); static bool8 PageSwapAnimState_2(struct Task *); static bool8 PageSwapAnimState_Done(struct Task *); static void TryStartButtonFlash(u8, u8, u8); static void Task_UpdateButtonFlash(u8); static u16 GetButtonPalOffset(u8); static void RestoreButtonColor(u8); static void StartButtonFlash(struct Task *, u8, u8); static void SpriteCB_Cursor(struct Sprite *); static void SpriteCB_InputArrow(struct Sprite *); static void SpriteCB_Underscore(struct Sprite *); static void CreateSprites(void); static void CreateCursorSprite(void); static void SetCursorPos(s16, s16); static void GetCursorPos(s16 *, s16 *); static void MoveCursorToOKButton(void); static void SetCursorInvisibility(u8); static void SetCursorFlashing(u8); static bool8 IsCursorAnimFinished(void); static u8 GetCurrentPageColumnCount(void); static void CreatePageSwapButtonSprites(void); static void StartPageSwapButtonAnim(void); static bool8 PageSwapSprite_Init(struct Sprite *); static bool8 PageSwapSprite_Idle(struct Sprite *); static bool8 PageSwapSprite_SlideOff(struct Sprite *); static bool8 PageSwapSprite_SlideOn(struct Sprite *); static void SetPageSwapButtonGfx(u8, struct Sprite *, struct Sprite *); static void CreateBackOkSprites(void); static void CreateTextEntrySprites(void); static void CreateInputTargetIcon(void); static void NamingScreen_NoIcon(void); static void NamingScreen_CreatePlayerIcon(void); static void NamingScreen_CreatePCIcon(void); static void NamingScreen_CreateMonIcon(void); static void NamingScreen_CreateRivalIcon(void); static bool8 HandleKeyboardEvent(void); static bool8 KeyboardKeyHandler_Character(u8); static bool8 KeyboardKeyHandler_Page(u8); static bool8 KeyboardKeyHandler_Backspace(u8); static bool8 KeyboardKeyHandler_OK(u8); static bool8 SwapKeyboardPage(void); static u8 GetInputEvent(void); static void SetInputState(u8); static void Task_HandleInput(u8); static void Input_Disabled(struct Task *); static void Input_Enabled(struct Task *); static void HandleDpadMovement(struct Task *); static void DrawTextEntryBox(void); static void DummyGenderIcon(void); static void DrawGenderIcon(void); static void DeleteTextCharacter(void); static u8 GetTextEntryPosition(void); static bool8 AddTextCharacter(void); static void BufferCharacter(u8 character); static void SaveInputText(void); static void LoadGfx(void); static void CreateHelperTasks(void); static void LoadPalettes(void); static void DecompressToBgTilemapBuffer(u8, const u32 *); static void DrawTextEntry(void); static void PrintKeyboardKeys(u8, u8); static void DrawKeyboardPageOnDeck(void); static void PrintControls(void); static void CB2_NamingScreen(void); static void ResetVHBlank(void); static void SetVBlank(void); static void VBlankCB_NamingScreen(void); static void NamingScreen_ShowBgs(void); static bool8 IsWideLetter(u8); static const struct SubspriteTable sSubspriteTable_PageSwapFrame[]; static const struct SubspriteTable sSubspriteTable_PageSwapText[]; static const struct SubspriteTable sSubspriteTable_Button[]; static const struct SubspriteTable sSubspriteTable_PCIcon[]; static const struct SpriteTemplate sSpriteTemplate_PageSwapFrame; static const struct SpriteTemplate sSpriteTemplate_PageSwapButton; static const struct SpriteTemplate sSpriteTemplate_PageSwapText; static const struct SpriteTemplate sSpriteTemplate_BackButton; static const struct SpriteTemplate sSpriteTemplate_OkButton; static const struct SpriteTemplate sSpriteTemplate_Cursor; static const struct SpriteTemplate sSpriteTemplate_InputArrow; static const struct SpriteTemplate sSpriteTemplate_Underscore; static const struct SpriteTemplate sSpriteTemplate_PCIcon; static const u8 *const sNamingScreenKeyboardText[][KBROW_COUNT]; static const struct SpriteSheet sSpriteSheets[]; static const struct SpritePalette sSpritePalettes[]; static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; static const u16 sPCIconOff_Gfx[] = INCBIN_U16("graphics/naming_screen/pc_icon_off.4bpp"); static const u16 sPCIconOn_Gfx[] = INCBIN_U16("graphics/naming_screen/pc_icon_on.4bpp"); static const u16 sRival_Gfx[] = INCBIN_U16("graphics/naming_screen/rival.4bpp"); static const u8 *const sTransferredToPCMessages[] = { Text_MonSentToBoxInSomeonesPC, Text_MonSentToBoxInBillsPC, Text_MonSentToBoxSomeonesBoxFull, Text_MonSentToBoxBillsBoxFull }; static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 30, .priority = 0, },{ .bg = 1, .charBaseIndex = 2, .mapBaseIndex = 29, .priority = 1, }, { .bg = 2, .charBaseIndex = 2, .mapBaseIndex = 28, .priority = 2, }, { .bg = 3, .charBaseIndex = 3, .mapBaseIndex = 31, .priority = 3, } }; static const struct WindowTemplate sWindowTemplates[WIN_COUNT + 1] = { [WIN_KB_PAGE_1] = { .bg = 1, .tilemapLeft = 3, .tilemapTop = 10, .width = 19, .height = 8, .paletteNum = 10, .baseBlock = 0x0030 }, [WIN_KB_PAGE_2] = { .bg = 2, .tilemapLeft = 3, .tilemapTop = 10, .width = 19, .height = 8, .paletteNum = 10, .baseBlock = 0x00c8 }, [WIN_TEXT_ENTRY] = { .bg = 3, .tilemapLeft = 8, .tilemapTop = 6, .width = 14, .height = 2, .paletteNum = 10, .baseBlock = 0x0030 }, [WIN_TEXT_ENTRY_BOX] = { .bg = 3, .tilemapLeft = 9, .tilemapTop = 4, .width = 16, .height = 2, .paletteNum = 10, .baseBlock = 0x004c }, [WIN_BANNER] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 2, .paletteNum = 11, .baseBlock = 0x006c }, DUMMY_WIN_TEMPLATE }; // This handles what characters get inserted when a key is pressed // The keys shown on the keyboard are handled separately by sNamingScreenKeyboardText static const u8 sKeyboardChars[KBPAGE_COUNT][KBROW_COUNT][KBCOL_COUNT] = { [KEYBOARD_LETTERS_LOWER] = { __("abcdef ."), __("ghijkl ,"), __("mnopqrs"), __("tuvwxyz"), }, [KEYBOARD_LETTERS_UPPER] = { __("ABCDEF ."), __("GHIJKL ,"), __("MNOPQRS"), __("TUVWXYZ"), }, [KEYBOARD_SYMBOLS] = { __("01234"), __("56789"), __("!?♂♀/-"), __("…“”‘'"), } }; static const u8 sPageColumnCounts[] = { [KEYBOARD_LETTERS_LOWER] = KBCOL_COUNT, [KEYBOARD_LETTERS_UPPER] = KBCOL_COUNT, [KEYBOARD_SYMBOLS] = 6 }; static const u8 sPageColumnXPos[KBPAGE_COUNT][KBCOL_COUNT] = { [KEYBOARD_LETTERS_LOWER] = {0, 12, 24, 56, 68, 80, 92, 123}, [KEYBOARD_LETTERS_UPPER] = {0, 12, 24, 56, 68, 80, 92, 123}, [KEYBOARD_SYMBOLS] = {0, 22, 44, 66, 88, 110} }; void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback) { sNamingScreen = Alloc(sizeof(struct NamingScreenData)); if (!sNamingScreen) { SetMainCallback2(returnCallback); } else { sNamingScreen->templateNum = templateNum; sNamingScreen->monSpecies = monSpecies; sNamingScreen->monGender = monGender; sNamingScreen->monPersonality = monPersonality; sNamingScreen->destBuffer = destBuffer; sNamingScreen->returnCallback = returnCallback; if (templateNum == NAMING_SCREEN_PLAYER) StartTimer1(); SetMainCallback2(CB2_LoadNamingScreen); } } static void CB2_LoadNamingScreen(void) { switch (gMain.state) { case 0: ResetVHBlank(); NamingScreen_Init(); gMain.state++; break; case 1: NamingScreen_InitBGs(); gMain.state++; break; case 2: ResetPaletteFade(); gMain.state++; break; case 3: ResetSpriteData(); FreeAllSpritePalettes(); gMain.state++; break; case 4: ResetTasks(); gMain.state++; break; case 5: LoadPalettes(); gMain.state++; break; case 6: LoadGfx(); gMain.state++; break; case 7: CreateSprites(); UpdatePaletteFade(); NamingScreen_ShowBgs(); gMain.state++; break; default: CreateHelperTasks(); CreateNamingScreenTask(); break; } } static void NamingScreen_Init(void) { sNamingScreen->state = STATE_FADE_IN; sNamingScreen->bg1vOffset = 0; sNamingScreen->bg2vOffset = 0; sNamingScreen->bg1Priority = BGCNT_PRIORITY(1); sNamingScreen->bg2Priority = BGCNT_PRIORITY(2); sNamingScreen->bgToReveal = 0; sNamingScreen->bgToHide = 1; sNamingScreen->template = sNamingScreenTemplates[sNamingScreen->templateNum]; sNamingScreen->currentPage = sNamingScreen->template->initialPage; sNamingScreen->inputCharBaseXPos = (DISPLAY_WIDTH - sNamingScreen->template->maxChars * 8) / 2 + 6; sNamingScreen->keyRepeatStartDelayCopy = gKeyRepeatStartDelay; memset(sNamingScreen->textBuffer, EOS, sizeof(sNamingScreen->textBuffer)); if (sNamingScreen->template->copyExistingString) StringCopy(sNamingScreen->textBuffer, sNamingScreen->destBuffer); gKeyRepeatStartDelay = 16; } static void SetSpritesVisible(void) { u32 i; for (i = 0; i < MAX_SPRITES; i++) { if (gSprites[i].inUse) gSprites[i].invisible = FALSE; } SetCursorInvisibility(0); } static void NamingScreen_InitBGs(void) { u32 i; DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); ChangeBgX(0, 0, BG_COORD_SET); ChangeBgY(0, 0, BG_COORD_SET); ChangeBgX(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); ChangeBgX(2, 0, BG_COORD_SET); ChangeBgY(2, 0, BG_COORD_SET); ChangeBgX(3, 0, BG_COORD_SET); ChangeBgY(3, 0, BG_COORD_SET); InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); for (i = 0; i < WIN_COUNT; i++) sNamingScreen->windows[i] = AddWindow(&sWindowTemplates[i]); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8)); SetBgTilemapBuffer(1, sNamingScreen->tilemapBuffer1); SetBgTilemapBuffer(2, sNamingScreen->tilemapBuffer2); SetBgTilemapBuffer(3, sNamingScreen->tilemapBuffer3); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20); } static void CreateNamingScreenTask(void) { CreateTask(Task_NamingScreen, 2); SetMainCallback2(CB2_NamingScreen); BackupHelpContext(); SetHelpContext(HELPCONTEXT_NAMING_SCREEN); } static void Task_NamingScreen(u8 taskId) { switch (sNamingScreen->state) { case STATE_FADE_IN: MainState_FadeIn(); SetSpritesVisible(); SetVBlank(); break; case STATE_WAIT_FADE_IN: MainState_WaitFadeIn(); break; case STATE_HANDLE_INPUT: MainState_HandleInput(); break; case STATE_MOVE_TO_OK_BUTTON: MainState_MoveToOKButton(); break; case STATE_START_PAGE_SWAP: MainState_StartPageSwap(); break; case STATE_WAIT_PAGE_SWAP: MainState_WaitPageSwap(); break; case STATE_PRESSED_OK: MainState_PressedOKButton(); break; case STATE_WAIT_SENT_TO_PC_MESSAGE: MainState_WaitSentToPCMessage(); break; case STATE_FADE_OUT: MainState_FadeOut(); break; case STATE_EXIT: MainState_Exit(); break; } } // Which gfx/pal to load for the swap page button static const u8 sPageToNextGfxId[KBPAGE_COUNT] = { [KBPAGE_SYMBOLS] = PAGE_SWAP_UPPER, [KBPAGE_LETTERS_UPPER] = PAGE_SWAP_LOWER, [KBPAGE_LETTERS_LOWER] = PAGE_SWAP_OTHERS }; static const u8 sPageToNextKeyboardId[KBPAGE_COUNT] = { [KBPAGE_SYMBOLS] = KEYBOARD_LETTERS_UPPER, [KBPAGE_LETTERS_UPPER] = KEYBOARD_LETTERS_LOWER, [KBPAGE_LETTERS_LOWER] = KEYBOARD_SYMBOLS }; static const u8 sPageToKeyboardId[KBPAGE_COUNT] = { [KBPAGE_SYMBOLS] = KEYBOARD_SYMBOLS, [KBPAGE_LETTERS_UPPER] = KEYBOARD_LETTERS_UPPER, [KBPAGE_LETTERS_LOWER] = KEYBOARD_LETTERS_LOWER }; static u8 PageToNextGfxId(u8 page) { return sPageToNextGfxId[page]; } static u8 CurrentPageToNextKeyboardId(void) { return sPageToNextKeyboardId[sNamingScreen->currentPage]; } static u8 CurrentPageToKeyboardId(void) { return sPageToKeyboardId[sNamingScreen->currentPage]; } static bool8 MainState_FadeIn(void) { DecompressToBgTilemapBuffer(3, gNamingScreenBackground_Tilemap); sNamingScreen->currentPage = KBPAGE_LETTERS_UPPER; DecompressToBgTilemapBuffer(2, gNamingScreenKeyboardLower_Tilemap); DecompressToBgTilemapBuffer(1, gNamingScreenKeyboardUpper_Tilemap); PrintKeyboardKeys(sNamingScreen->windows[WIN_KB_PAGE_2], KEYBOARD_LETTERS_LOWER); PrintKeyboardKeys(sNamingScreen->windows[WIN_KB_PAGE_1], KEYBOARD_LETTERS_UPPER); DrawTextEntry(); DrawTextEntryBox(); PrintControls(); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sNamingScreen->state++; return FALSE; } static bool8 MainState_WaitFadeIn(void) { if (!gPaletteFade.active) { SetInputState(INPUT_STATE_ENABLED); SetCursorFlashing(TRUE); sNamingScreen->state++; } return FALSE; } static bool8 MainState_HandleInput(void) { return HandleKeyboardEvent(); } static bool8 MainState_MoveToOKButton(void) { if (IsCursorAnimFinished()) { SetInputState(INPUT_STATE_ENABLED); MoveCursorToOKButton(); sNamingScreen->state = STATE_HANDLE_INPUT; } return FALSE; } static bool8 MainState_PressedOKButton(void) { SaveInputText(); SetInputState(INPUT_STATE_DISABLED); SetCursorFlashing(FALSE); TryStartButtonFlash(BUTTON_COUNT, FALSE, TRUE); if (sNamingScreen->templateNum == NAMING_SCREEN_CAUGHT_MON && CalculatePlayerPartyCount() >= PARTY_SIZE) { DisplaySentToPCMessage(); sNamingScreen->state = STATE_WAIT_SENT_TO_PC_MESSAGE; return FALSE; } else { sNamingScreen->state = STATE_FADE_OUT; return TRUE; //Exit the naming screen } } static bool8 MainState_FadeOut(void) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sNamingScreen->state++; return FALSE; } static bool8 MainState_Exit(void) { if (!gPaletteFade.active) { if (sNamingScreen->templateNum == NAMING_SCREEN_PLAYER) SeedRngAndSetTrainerId(); SetMainCallback2(sNamingScreen->returnCallback); DestroyTask(FindTaskIdByFunc(Task_NamingScreen)); FreeAllWindowBuffers(); FREE_AND_SET_NULL(sNamingScreen); RestoreHelpContext(); } return FALSE; } static void DisplaySentToPCMessage(void) { u8 stringToDisplay = 0; if (!IsDestinationBoxFull()) { StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); StringCopy(gStringVar2, sNamingScreen->destBuffer); } else { StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); StringCopy(gStringVar2, sNamingScreen->destBuffer); StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); stringToDisplay = 2; } if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC)) stringToDisplay++; StringExpandPlaceholders(gStringVar4, sTransferredToPCMessages[stringToDisplay]); DrawDialogueFrame(0, FALSE); gTextFlags.canABSpeedUpPrint = TRUE; AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(0, COPYWIN_FULL); } static bool8 MainState_WaitSentToPCMessage(void) { RunTextPrinters(); if (!IsTextPrinterActive(0) && JOY_NEW(A_BUTTON)) sNamingScreen->state = STATE_FADE_OUT; return FALSE; } static bool8 MainState_StartPageSwap(void) { SetInputState(INPUT_STATE_DISABLED); StartPageSwapButtonAnim(); StartPageSwapAnim(); SetCursorInvisibility(TRUE); TryStartButtonFlash(BUTTON_PAGE, FALSE, TRUE); PlaySE(SE_WIN_OPEN); sNamingScreen->state = STATE_WAIT_PAGE_SWAP; return FALSE; } static bool8 MainState_WaitPageSwap(void) { s16 cursorX; s16 cursorY; bool32 onLastColumn; if (IsPageSwapAnimNotInProgress()) { GetCursorPos(&cursorX, &cursorY); onLastColumn = (cursorX == GetCurrentPageColumnCount()); sNamingScreen->state = STATE_HANDLE_INPUT; sNamingScreen->currentPage++; sNamingScreen->currentPage %= KBPAGE_COUNT; if (onLastColumn) { cursorX = GetCurrentPageColumnCount(); } else { if (cursorX >= GetCurrentPageColumnCount()) cursorX = GetCurrentPageColumnCount() - 1; } SetCursorPos(cursorX, cursorY); DrawKeyboardPageOnDeck(); SetInputState(INPUT_STATE_ENABLED); SetCursorInvisibility(FALSE); } return FALSE; } //-------------------------------------------------- // Page Swap //-------------------------------------------------- #define tState data[0] #define tFrameCount data[1] static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *task) = { PageSwapAnimState_Init, PageSwapAnimState_1, PageSwapAnimState_2, PageSwapAnimState_Done }; static void StartPageSwapAnim(void) { u8 taskId = CreateTask(Task_HandlePageSwapAnim, 0); Task_HandlePageSwapAnim(taskId); } static void Task_HandlePageSwapAnim(u8 taskId) { while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId])) ; } static bool8 IsPageSwapAnimNotInProgress(void) { if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == TASK_NONE) return TRUE; else return FALSE; } static bool8 PageSwapAnimState_Init(struct Task *task) { sNamingScreen->bg1vOffset = 0; sNamingScreen->bg2vOffset = 0; task->tState++; return 0; } static bool8 PageSwapAnimState_1(struct Task *task) { u16 *const vOffsets[] = { &sNamingScreen->bg2vOffset, &sNamingScreen->bg1vOffset }; task->tFrameCount += 4; *vOffsets[sNamingScreen->bgToReveal] = Sin(task->tFrameCount, 40); *vOffsets[sNamingScreen->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40); if (task->tFrameCount >= 64) { u8 temp; SWAP(sNamingScreen->bg1Priority, sNamingScreen->bg2Priority, temp); task->tState++; } return 0; } static bool8 PageSwapAnimState_2(struct Task *task) { u16 *const vOffsets[] = { &sNamingScreen->bg2vOffset, &sNamingScreen->bg1vOffset }; task->tFrameCount += 4; *vOffsets[sNamingScreen->bgToReveal] = Sin(task->tFrameCount, 40); *vOffsets[sNamingScreen->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40); if (task->tFrameCount >= 128) { u8 temp; SWAP(sNamingScreen->bgToReveal, sNamingScreen->bgToHide, temp); task->tState++; } return 0; } static bool8 PageSwapAnimState_Done(struct Task *task) { DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim)); return 0; } #undef tState #undef tFrameCount //-------------------------------------------------- // Cursor blink //-------------------------------------------------- #define tButtonId data[0] #define tKeepFlashing data[1] #define tAllowFlash data[2] #define tColor data[3] #define tColorIncr data[4] #define tColorDelay data[5] #define tColorDelta data[6] static void CreateButtonFlashTask(void) { u8 taskId = CreateTask(Task_UpdateButtonFlash, 3); gTasks[taskId].tButtonId = BUTTON_COUNT; } static void TryStartButtonFlash(u8 button, bool8 keepFlashing, bool8 interruptCurFlash) { struct Task *task = &gTasks[FindTaskIdByFunc(Task_UpdateButtonFlash)]; if (button == task->tButtonId && !interruptCurFlash) { task->tKeepFlashing = keepFlashing; task->tAllowFlash = TRUE; return; } if (button == BUTTON_COUNT && !task->tKeepFlashing && !interruptCurFlash) return; if (task->tButtonId != BUTTON_COUNT) RestoreButtonColor(task->tButtonId); StartButtonFlash(task, button, keepFlashing); } static void Task_UpdateButtonFlash(u8 taskId) { struct Task *task = &gTasks[taskId]; if (task->tButtonId == BUTTON_COUNT || !task->tAllowFlash) return; MultiplyInvertedPaletteRGBComponents(GetButtonPalOffset(task->tButtonId), task->tColor, task->tColor, task->tColor); if (task->tColorDelay && --task->tColorDelay) return; task->tColorDelay = 2; if (task->tColorIncr >= 0) { if (task->tColor < 14) { task->tColor += task->tColorIncr; task->tColorDelta += task->tColorIncr; } else { task->tColor = 16; task->tColorDelta++; } } else { task->tColor += task->tColorIncr; task->tColorDelta += task->tColorIncr; } if (task->tColor == 16 && task->tColorDelta == 22) { task->tColorIncr = -4; } else if (task->tColor == 0) { task->tAllowFlash = task->tKeepFlashing; task->tColorIncr = 2; task->tColorDelta = 0; } } static u16 GetButtonPalOffset(u8 button) { const u16 palOffsets[BUTTON_COUNT + 1] = { [BUTTON_PAGE] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_PAGE_SWAP)) + 14, [BUTTON_BACK] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_BACK_BUTTON)) + 14, [BUTTON_OK] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_OK_BUTTON)) + 14, [BUTTON_COUNT] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_OK_BUTTON)) + 1, }; return palOffsets[button]; } static void RestoreButtonColor(u8 button) { u16 index = GetButtonPalOffset(button); gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; } static void StartButtonFlash(struct Task *task, u8 button, u8 keepFlashing) { task->tButtonId = button; task->tKeepFlashing = keepFlashing; task->tAllowFlash = TRUE; task->tColor = 4; task->tColorIncr = 2; task->tColorDelay = 0; task->tColorDelta = 4; } #undef tButtonId #undef tKeepFlashing #undef tAllowFlash #undef tColor #undef tColorIncr #undef tColorDelay #undef tColorDelta //-------------------------------------------------- // Cursor //-------------------------------------------------- // Sprite data for the the cursor #define sX data[0] #define sY data[1] #define sPrevX data[2] #define sPrevY data[3] #define sInvisible data[4] & 0x00FF #define sFlashing data[4] & 0xFF00 #define sColor data[5] #define sColorIncr data[6] #define sColorDelay data[7] static void SpriteCB_Cursor(struct Sprite *sprite) { if (sprite->animEnded) StartSpriteAnim(sprite, 0); // Hide cursor when on button column sprite->invisible = sprite->sInvisible; if (sprite->sX == GetCurrentPageColumnCount()) sprite->invisible = TRUE; if (sprite->invisible || !(sprite->sFlashing) || sprite->sX != sprite->sPrevX || sprite->sY != sprite->sPrevY) { sprite->sColor = 0; sprite->sColorIncr = 2; sprite->sColorDelay = 2; } sprite->sColorDelay--; if (sprite->sColorDelay == 0) { sprite->sColor += sprite->sColorIncr; if (sprite->sColor == 16 || sprite->sColor == 0) sprite->sColorIncr = -sprite->sColorIncr; sprite->sColorDelay = 2; } if (sprite->sFlashing) { s8 gb = sprite->sColor; s8 r = sprite->sColor >> 1; u16 index = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_CURSOR)) + 1; MultiplyInvertedPaletteRGBComponents(index, r, gb, gb); } } #define sDelay data[0] #define sXPosId data[1] static void SpriteCB_InputArrow(struct Sprite *sprite) { const s16 x[] = {0, -4, -2, -1}; if (sprite->sDelay == 0 || --sprite->sDelay == 0) { sprite->sDelay = 8; sprite->sXPosId = (sprite->sXPosId + 1) & (ARRAY_COUNT(x) - 1); } sprite->x2 = x[sprite->sXPosId]; } #undef sDelay #undef sXPosId #define sId data[0] // set in CreateTextEntrySprites #define sYPosId data[1] #define sDelay data[2] static void SpriteCB_Underscore(struct Sprite *sprite) { const s16 y[] = {2, 3, 2, 1}; u8 pos = GetTextEntryPosition(); if (pos != (u8)sprite->sId) { sprite->y2 = 0; sprite->sYPosId = 0; sprite->sDelay = 0; } else { sprite->y2 = y[sprite->sYPosId]; sprite->sDelay++; if (sprite->sDelay > 8) { sprite->sYPosId = (sprite->sYPosId + 1) & (ARRAY_COUNT(y) - 1); sprite->sDelay = 0; } } } #undef sId #undef sYPosId #undef sDelay static void CreateSprites(void) { CreateCursorSprite(); CreatePageSwapButtonSprites(); CreateBackOkSprites(); CreateTextEntrySprites(); CreateInputTargetIcon(); } static void CreateCursorSprite(void) { sNamingScreen->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, 38, 88, 1); SetCursorInvisibility(TRUE); gSprites[sNamingScreen->cursorSpriteId].oam.priority = 1; gSprites[sNamingScreen->cursorSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; gSprites[sNamingScreen->cursorSpriteId].sColorIncr = 1; // ? immediately overwritten gSprites[sNamingScreen->cursorSpriteId].sColorIncr = 2; SetCursorPos(0, 0); } static void SetCursorPos(s16 x, s16 y) { struct Sprite *cursorSprite = &gSprites[sNamingScreen->cursorSpriteId]; if (x < sPageColumnCounts[CurrentPageToKeyboardId()]) cursorSprite->x = sPageColumnXPos[CurrentPageToKeyboardId()][x] + 38; else cursorSprite->x = 0; cursorSprite->y = y * 16 + 88; cursorSprite->sPrevX = cursorSprite->sX; cursorSprite->sPrevY = cursorSprite->sY; cursorSprite->sX = x; cursorSprite->sY = y; } static void GetCursorPos(s16 *x, s16 *y) { struct Sprite *cursorSprite = &gSprites[sNamingScreen->cursorSpriteId]; *x = cursorSprite->sX; *y = cursorSprite->sY; } static void MoveCursorToOKButton(void) { SetCursorPos(GetCurrentPageColumnCount(), 2); } static void SetCursorInvisibility(bool8 invisible) { gSprites[sNamingScreen->cursorSpriteId].data[4] &= 0xFF00; gSprites[sNamingScreen->cursorSpriteId].data[4] |= invisible; // sInvisible StartSpriteAnim(&gSprites[sNamingScreen->cursorSpriteId], 0); } static void SetCursorFlashing(bool8 flashing) { gSprites[sNamingScreen->cursorSpriteId].data[4] &= 0xFF; gSprites[sNamingScreen->cursorSpriteId].data[4] |= flashing << 8; // sFlashing } static void SquishCursor(void) { StartSpriteAnim(&gSprites[sNamingScreen->cursorSpriteId], 1); } static bool8 IsCursorAnimFinished(void) { return gSprites[sNamingScreen->cursorSpriteId].animEnded; } static const u8 sButtonKeyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK}; static u8 GetKeyRoleAtCursorPos(void) { s16 cursorX; s16 cursorY; GetCursorPos(&cursorX, &cursorY); if (cursorX < GetCurrentPageColumnCount()) return KEY_ROLE_CHAR; else return sButtonKeyRoles[cursorY]; } // If the cursor's x is equal to the column count, cursor is in the button column static u8 GetCurrentPageColumnCount(void) { return sPageColumnCounts[CurrentPageToKeyboardId()]; } #undef sX #undef sY #undef sPrevX #undef sPrevY #undef sInvisible #undef sFlashing #undef sColor #undef sColorIncr #undef sColorDelay #define sState data[0] #define sPage data[1] #define sTextSpriteId data[6] #define sButtonSpriteId data[7] static void CreatePageSwapButtonSprites(void) { u8 frameSpriteId; u8 textSpriteId; u8 buttonSpriteId; frameSpriteId = CreateSprite(&sSpriteTemplate_PageSwapFrame, 204, 88, 0); sNamingScreen->swapBtnFrameSpriteId = frameSpriteId; SetSubspriteTables(&gSprites[frameSpriteId], sSubspriteTable_PageSwapFrame); gSprites[frameSpriteId].invisible = TRUE; textSpriteId = CreateSprite(&sSpriteTemplate_PageSwapText, 204, 84, 1); gSprites[frameSpriteId].data[6] = textSpriteId; SetSubspriteTables(&gSprites[textSpriteId], sSubspriteTable_PageSwapText); gSprites[textSpriteId].invisible = TRUE; buttonSpriteId = CreateSprite(&sSpriteTemplate_PageSwapButton, 204, 83, 2); gSprites[buttonSpriteId].oam.priority = 1; gSprites[frameSpriteId].data[7] = buttonSpriteId; gSprites[buttonSpriteId].invisible = TRUE; } static void StartPageSwapButtonAnim(void) { struct Sprite *sprite = &gSprites[sNamingScreen->swapBtnFrameSpriteId]; sprite->sState = 2; // go to PageSwapSprite_SlideOff sprite->sPage = sNamingScreen->currentPage; } static bool8 (*const sPageSwapSpriteFuncs[])(struct Sprite *sprite) = { PageSwapSprite_Init, PageSwapSprite_Idle, PageSwapSprite_SlideOff, PageSwapSprite_SlideOn }; static void SpriteCB_PageSwap(struct Sprite *sprite) { while (sPageSwapSpriteFuncs[sprite->sState](sprite)) ; } static bool8 PageSwapSprite_Init(struct Sprite *sprite) { struct Sprite *text = &gSprites[sprite->sTextSpriteId]; struct Sprite *button = &gSprites[sprite->sButtonSpriteId]; SetPageSwapButtonGfx(PageToNextGfxId(sNamingScreen->currentPage), text, button); sprite->sState++; return FALSE; } static bool8 PageSwapSprite_Idle(struct Sprite *sprite) { return FALSE; } static bool8 PageSwapSprite_SlideOff(struct Sprite *sprite) { struct Sprite *text = &gSprites[sprite->sTextSpriteId]; struct Sprite *button = &gSprites[sprite->sButtonSpriteId]; if (++text->y2 > 7) { sprite->sState++; text->y2 = -4; text->invisible = TRUE; SetPageSwapButtonGfx(PageToNextGfxId(((u8)sprite->sPage + 1) % KBPAGE_COUNT), text, button); } return FALSE; } static bool8 PageSwapSprite_SlideOn(struct Sprite *sprite) { struct Sprite *text = &gSprites[sprite->sTextSpriteId]; text->invisible = FALSE; if (++text->y2 >= 0) { text->y2 = 0; sprite->sState = 1; // go to PageSwapSprite_Idle } return FALSE; } static const u16 sPageSwapPalTags[] = { [PAGE_SWAP_UPPER] = PALTAG_PAGE_SWAP_UPPER, [PAGE_SWAP_OTHERS] = PALTAG_PAGE_SWAP_OTHERS, [PAGE_SWAP_LOWER] = PALTAG_PAGE_SWAP_LOWER }; static const u16 sPageSwapGfxTags[] = { [PAGE_SWAP_UPPER] = GFXTAG_PAGE_SWAP_UPPER, [PAGE_SWAP_OTHERS] = GFXTAG_PAGE_SWAP_OTHERS, [PAGE_SWAP_LOWER] = GFXTAG_PAGE_SWAP_LOWER }; static void SetPageSwapButtonGfx(u8 page, struct Sprite *text, struct Sprite *button) { button->oam.paletteNum = IndexOfSpritePaletteTag(sPageSwapPalTags[page]); text->sheetTileStart = GetSpriteTileStartByTag(sPageSwapGfxTags[page]); text->subspriteTableNum = page; } #undef sState #undef sPage #undef sTextSpriteId #undef sButtonSpriteId static void CreateBackOkSprites(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_BackButton, 204, 116, 0); SetSubspriteTables(&gSprites[spriteId], sSubspriteTable_Button); gSprites[spriteId].invisible = TRUE; spriteId = CreateSprite(&sSpriteTemplate_OkButton, 204, 140, 0); SetSubspriteTables(&gSprites[spriteId], sSubspriteTable_Button); gSprites[spriteId].invisible = TRUE; } static void CreateTextEntrySprites(void) { u8 spriteId; s16 xPos; u32 i; xPos = sNamingScreen->inputCharBaseXPos - 5; spriteId = CreateSprite(&sSpriteTemplate_InputArrow, xPos, 56, 0); gSprites[spriteId].oam.priority = 3; gSprites[spriteId].invisible = TRUE; xPos = sNamingScreen->inputCharBaseXPos; for (i = 0; i < sNamingScreen->template->maxChars; i++, xPos += 8) { spriteId = CreateSprite(&sSpriteTemplate_Underscore, xPos + 3, 60, 0); gSprites[spriteId].oam.priority = 3; gSprites[spriteId].data[0] = i; gSprites[spriteId].invisible = TRUE; } } //-------------------------------------------------- // Icon creation (the thing you're naming or giving input to) //-------------------------------------------------- static void (*const sIconFunctions[])(void) = { NamingScreen_NoIcon, NamingScreen_CreatePlayerIcon, NamingScreen_CreatePCIcon, NamingScreen_CreateMonIcon, NamingScreen_CreateRivalIcon }; static void CreateInputTargetIcon(void) { sIconFunctions[sNamingScreen->template->iconFunction](); } static void NamingScreen_NoIcon(void) { } static void NamingScreen_CreatePlayerIcon(void) { u8 rivalGfxId; u8 spriteId; rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, sNamingScreen->monSpecies); spriteId = CreateObjectGraphicsSprite(rivalGfxId, SpriteCallbackDummy, 56, 37, 0); gSprites[spriteId].oam.priority = 3; StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_SOUTH); } static void NamingScreen_CreatePCIcon(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_PCIcon, 56, 41, 0); SetSubspriteTables(&gSprites[spriteId], sSubspriteTable_PCIcon); gSprites[spriteId].oam.priority = 3; } static void NamingScreen_CreateMonIcon(void) { u8 spriteId; LoadMonIconPalettes(); spriteId = CreateMonIcon(sNamingScreen->monSpecies, SpriteCallbackDummy, 56, 40, 0, sNamingScreen->monPersonality, 1); gSprites[spriteId].oam.priority = 3; } static const union AnimCmd sAnim_Rival[] = { ANIMCMD_FRAME( 0, 10), ANIMCMD_FRAME(24, 10), ANIMCMD_FRAME( 0, 10), ANIMCMD_FRAME(32, 10), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_Rival[] = { sAnim_Rival }; static void NamingScreen_CreateRivalIcon(void) { const struct SpriteSheet sheet = { sRival_Gfx, 0x900, GFXTAG_RIVAL }; const struct SpritePalette palette = { gNamingScreenRival_Pal, PALTAG_RIVAL }; struct SpriteTemplate template; const struct SubspriteTable * tables_p; u8 spriteId; CopyObjectGraphicsInfoToSpriteTemplate(OBJ_EVENT_GFX_RED_NORMAL, SpriteCallbackDummy, &template, &tables_p); template.tileTag = sheet.tag; template.paletteTag = palette.tag; template.anims = sAnims_Rival; LoadSpriteSheet(&sheet); LoadSpritePalette(&palette); spriteId = CreateSprite(&template, 56, 37, 0); gSprites[spriteId].oam.priority = 3; } static bool8 (*const sKeyboardKeyHandlers[])(u8) = { [KEY_ROLE_CHAR] = KeyboardKeyHandler_Character, [KEY_ROLE_PAGE] = KeyboardKeyHandler_Page, [KEY_ROLE_BACKSPACE] = KeyboardKeyHandler_Backspace, [KEY_ROLE_OK] = KeyboardKeyHandler_OK, }; static bool8 HandleKeyboardEvent(void) { u8 input = GetInputEvent(); u8 keyRole = GetKeyRoleAtCursorPos(); if (input == INPUT_SELECT) { return SwapKeyboardPage(); } else if (input == INPUT_B_BUTTON) { DeleteTextCharacter(); return FALSE; } else if (input == INPUT_START) { MoveCursorToOKButton(); return FALSE; } else { return sKeyboardKeyHandlers[keyRole](input); } } static bool8 KeyboardKeyHandler_Character(u8 input) { TryStartButtonFlash(BUTTON_COUNT, FALSE, FALSE); if (input == INPUT_A_BUTTON) { bool8 textFull = AddTextCharacter(); if (sNamingScreen->currentPage == KBPAGE_LETTERS_UPPER && GetTextEntryPosition() == 1) MainState_StartPageSwap(); SquishCursor(); if (textFull) { SetInputState(INPUT_STATE_DISABLED); sNamingScreen->state = STATE_MOVE_TO_OK_BUTTON; } } return FALSE; } static bool8 KeyboardKeyHandler_Page(u8 input) { TryStartButtonFlash(BUTTON_PAGE, TRUE, FALSE); if (input == INPUT_A_BUTTON) return SwapKeyboardPage(); else return FALSE; } static bool8 KeyboardKeyHandler_Backspace(u8 input) { TryStartButtonFlash(BUTTON_BACK, TRUE, FALSE); if (input == INPUT_A_BUTTON) DeleteTextCharacter(); return FALSE; } static bool8 KeyboardKeyHandler_OK(u8 input) { TryStartButtonFlash(BUTTON_OK, TRUE, FALSE); if (input == INPUT_A_BUTTON) { PlaySE(SE_SELECT); sNamingScreen->state = STATE_PRESSED_OK; return TRUE; } else return FALSE; } static bool8 SwapKeyboardPage(void) { sNamingScreen->state = STATE_START_PAGE_SWAP; return TRUE; } //-------------------------------------------------- // Input handling //-------------------------------------------------- #define tState data[0] #define tKeyboardEvent data[1] #define tButtonId data[2] static void (*const sInputFuncs[])(struct Task *) = { [INPUT_STATE_DISABLED] = Input_Disabled, [INPUT_STATE_ENABLED] = Input_Enabled, }; static void CreateInputHandlerTask(void) { CreateTask(Task_HandleInput, 1); } static u8 GetInputEvent(void) { u8 taskId = FindTaskIdByFunc(Task_HandleInput); return gTasks[taskId].tKeyboardEvent; } static void SetInputState(u8 state) { u8 taskId = FindTaskIdByFunc(Task_HandleInput); gTasks[taskId].tState = state; } static void Task_HandleInput(u8 taskId) { sInputFuncs[gTasks[taskId].tState](&gTasks[taskId]); } static void Input_Disabled(struct Task *task) { task->tKeyboardEvent = INPUT_NONE; } static void Input_Enabled(struct Task *task) { task->tKeyboardEvent = INPUT_NONE; if (JOY_NEW(A_BUTTON)) task->tKeyboardEvent = INPUT_A_BUTTON; else if (JOY_NEW(B_BUTTON)) task->tKeyboardEvent = INPUT_B_BUTTON; else if (JOY_NEW(SELECT_BUTTON)) task->tKeyboardEvent = INPUT_SELECT; else if (JOY_NEW(START_BUTTON)) task->tKeyboardEvent = INPUT_START; else HandleDpadMovement(task); } static void HandleDpadMovement(struct Task *task) { const s16 sDpadDeltaX[] = { [INPUT_NONE] = 0, [INPUT_DPAD_UP] = 0, [INPUT_DPAD_DOWN] = 0, [INPUT_DPAD_LEFT] = -1, [INPUT_DPAD_RIGHT] = 1 }; const s16 sDpadDeltaY[] = { [INPUT_NONE] = 0, [INPUT_DPAD_UP] = -1, [INPUT_DPAD_DOWN] = 1, [INPUT_DPAD_LEFT] = 0, [INPUT_DPAD_RIGHT] = 0 }; const s16 sKeyRowToButtonRow[KBROW_COUNT] = {0, 1, 1, 2}; const s16 sButtonRowToKeyRow[BUTTON_COUNT] = {0, 0, 3}; s16 cursorX; s16 cursorY; u16 input; s16 prevCursorX; GetCursorPos(&cursorX, &cursorY); input = INPUT_NONE; if (JOY_REPT(DPAD_UP)) input = INPUT_DPAD_UP; if (JOY_REPT(DPAD_DOWN)) input = INPUT_DPAD_DOWN; if (JOY_REPT(DPAD_LEFT)) input = INPUT_DPAD_LEFT; if (JOY_REPT(DPAD_RIGHT)) input = INPUT_DPAD_RIGHT; // Get new cursor position prevCursorX = cursorX; cursorX += sDpadDeltaX[input]; cursorY += sDpadDeltaY[input]; //Wrap cursor position in the X direction if (cursorX < 0) cursorX = GetCurrentPageColumnCount(); if (cursorX > GetCurrentPageColumnCount()) cursorX = 0; // Handle moving on/off the button column if (sDpadDeltaX[input] != 0) { if (cursorX == GetCurrentPageColumnCount()) { // Moved onto button column // Save cursor pos in tButtonId for moving back onto keys task->tButtonId = cursorY; cursorY = sKeyRowToButtonRow[cursorY]; } else if (prevCursorX == GetCurrentPageColumnCount()) { // Moved off button column // If you're on the middle button, go to the row that // the cursor was on previously (saved in tButtonId above) if (cursorY == BUTTON_COUNT / 2) cursorY = task->tButtonId; else cursorY = sButtonRowToKeyRow[cursorY]; } } // Wrap cursor position in the y direction if (cursorX == GetCurrentPageColumnCount()) { // There are only 3 keys in the button column // so wrap Y accordingly if (cursorY < 0) cursorY = BUTTON_COUNT - 1; if (cursorY >= BUTTON_COUNT) cursorY = 0; if (cursorY == 0) task->tButtonId = BUTTON_BACK; else if (cursorY == BUTTON_COUNT - 1) task->tButtonId = BUTTON_OK; } else { if (cursorY < 0) cursorY = KBROW_COUNT - 1; if (cursorY >= KBROW_COUNT) cursorY = 0; } SetCursorPos(cursorX, cursorY); } #undef tState #undef tKeyboardEvent #undef tButtonId static void DrawNormalTextEntryBox(void) { FillWindowPixelBuffer(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], PIXEL_FILL(1)); AddTextPrinterParameterized(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], FONT_NORMAL_COPY_1, sNamingScreen->template->title, 1, 1, 0, NULL); PutWindowTilemap(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX]); } static void DrawMonTextEntryBox(void) { u8 buffer[32]; StringCopy(buffer, gSpeciesNames[sNamingScreen->monSpecies]); StringAppendN(buffer, sNamingScreen->template->title, 15); FillWindowPixelBuffer(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], PIXEL_FILL(1)); AddTextPrinterParameterized(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], FONT_NORMAL_COPY_1, buffer, 1, 1, 0, NULL); PutWindowTilemap(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX]); } static void (*const sDrawTextEntryBoxFuncs[])(void) = { [NAMING_SCREEN_PLAYER] = DrawNormalTextEntryBox, [NAMING_SCREEN_BOX] = DrawNormalTextEntryBox, [NAMING_SCREEN_CAUGHT_MON] = DrawMonTextEntryBox, [NAMING_SCREEN_NICKNAME] = DrawMonTextEntryBox, [NAMING_SCREEN_RIVAL] = DrawNormalTextEntryBox }; static void DrawTextEntryBox(void) { sDrawTextEntryBoxFuncs[sNamingScreen->templateNum](); } static void (*const sDrawGenderIconFuncs[])(void) = { [FALSE] = DummyGenderIcon, [TRUE] = DrawGenderIcon, }; static void TryDrawGenderIcon(void) { sDrawGenderIconFuncs[sNamingScreen->template->addGenderIcon](); } static void DummyGenderIcon(void) { } static const u8 sGenderColors[2][3] = { [MALE] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_BLUE, TEXT_COLOR_BLUE}, [FEMALE] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED} }; static void DrawGenderIcon(void) { u8 genderSymbol[2]; bool8 gender = MALE; StringCopy(genderSymbol, gText_MaleSymbol); if (sNamingScreen->monGender != MON_GENDERLESS) { if (sNamingScreen->monGender == MON_FEMALE) { StringCopy(genderSymbol, gText_FemaleSymbol); gender = FEMALE; } AddTextPrinterParameterized3(sNamingScreen->windows[2], FONT_NORMAL, 0x68, 1, sGenderColors[gender], TEXT_SKIP_DRAW, genderSymbol); } } static u8 GetCharAtKeyboardPos(s16 x, s16 y) { return sKeyboardChars[CurrentPageToKeyboardId()][y][x]; } static u8 GetTextEntryPosition(void) { u32 i; for (i = 0; i < sNamingScreen->template->maxChars; i++) { if (sNamingScreen->textBuffer[i] == EOS) return i; } return sNamingScreen->template->maxChars - 1; } static u8 GetPreviousTextCaretPosition(void) { s32 i; for (i = sNamingScreen->template->maxChars - 1; i > 0; i--) { if (sNamingScreen->textBuffer[i] != EOS) return i; } return 0; } static void DeleteTextCharacter(void) { u8 index; u8 keyRole; index = GetPreviousTextCaretPosition(); // Temporarily make this a space for redrawing purposes sNamingScreen->textBuffer[index] = CHAR_SPACE; DrawTextEntry(); CopyBgTilemapBufferToVram(3); sNamingScreen->textBuffer[index] = EOS; keyRole = GetKeyRoleAtCursorPos(); // The below flashes the Back key once on delete // It incorrectly leaves the Back key 1 shade lighter than its default if (keyRole == KEY_ROLE_CHAR || keyRole == KEY_ROLE_BACKSPACE) TryStartButtonFlash(BUTTON_BACK, FALSE, TRUE); PlaySE(SE_BALL); } // Returns TRUE if the text entry is now full static bool8 AddTextCharacter(void) { s16 x; s16 y; GetCursorPos(&x, &y); BufferCharacter(GetCharAtKeyboardPos(x, y)); DrawTextEntry(); CopyBgTilemapBufferToVram(3); PlaySE(SE_SELECT); if (GetPreviousTextCaretPosition() != sNamingScreen->template->maxChars - 1) return FALSE; else return TRUE; } static void BufferCharacter(u8 ch) { u8 index = GetTextEntryPosition(); sNamingScreen->textBuffer[index] = ch; } static void SaveInputText(void) { // Copy from the first non-whitespace character u32 i; for (i = 0; i < sNamingScreen->template->maxChars; i++) { if (sNamingScreen->textBuffer[i] != CHAR_SPACE && sNamingScreen->textBuffer[i] != EOS) { StringCopyN(sNamingScreen->destBuffer, sNamingScreen->textBuffer, sNamingScreen->template->maxChars + 1); break; } } } static void LoadGfx(void) { LZ77UnCompWram(gNamingScreenMenu_Gfx, sNamingScreen->tileBuffer); LoadBgTiles(1, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0); LoadBgTiles(2, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0); LoadBgTiles(3, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0); LoadSpriteSheets(sSpriteSheets); LoadSpritePalettes(sSpritePalettes); } static void CreateHelperTasks(void) { CreateInputHandlerTask(); CreateButtonFlashTask(); } static void LoadPalettes(void) { LoadPalette(gNamingScreenMenu_Pal, BG_PLTT_ID(0), sizeof(gNamingScreenMenu_Pal)); LoadPalette(gNamingScreenKeyboard_Pal, BG_PLTT_ID(10), PLTT_SIZE_4BPP); LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(11), PLTT_SIZE_4BPP); } static void DecompressToBgTilemapBuffer(u8 bg, const u32 *src) { CopyToBgTilemapBuffer(bg, src, 0, 0); } static void DrawTextEntry(void) { u32 i; u8 temp[2]; u16 extraWidth; u8 maxChars = sNamingScreen->template->maxChars; u16 xpos = sNamingScreen->inputCharBaseXPos - 0x40; FillWindowPixelBuffer(sNamingScreen->windows[WIN_TEXT_ENTRY], PIXEL_FILL(1)); for (i = 0; i < maxChars; i++) { temp[0] = sNamingScreen->textBuffer[i]; temp[1] = gExpandedPlaceholder_Empty[0]; extraWidth = (IsWideLetter(temp[0]) == TRUE) ? 2 : 0; AddTextPrinterParameterized(sNamingScreen->windows[WIN_TEXT_ENTRY], FONT_NORMAL, temp, i * 8 + xpos + extraWidth, 1, TEXT_SKIP_DRAW, NULL); } TryDrawGenderIcon(); CopyWindowToVram(sNamingScreen->windows[WIN_TEXT_ENTRY], COPYWIN_GFX); PutWindowTilemap(sNamingScreen->windows[WIN_TEXT_ENTRY]); } struct TextColor // Needed because of alignment { u8 colors[3][4]; }; static const struct TextColor sTextColorStruct = { { {TEXT_DYNAMIC_COLOR_4, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, {TEXT_DYNAMIC_COLOR_5, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY} } }; static const u8 sFillValues[KBPAGE_COUNT] = { [KEYBOARD_LETTERS_LOWER] = PIXEL_FILL(14), [KEYBOARD_LETTERS_UPPER] = PIXEL_FILL(13), [KEYBOARD_SYMBOLS] = PIXEL_FILL(15) }; static const u8 *const sKeyboardTextColors[KBPAGE_COUNT] = { [KEYBOARD_LETTERS_LOWER] = sTextColorStruct.colors[1], [KEYBOARD_LETTERS_UPPER] = sTextColorStruct.colors[0], [KEYBOARD_SYMBOLS] = sTextColorStruct.colors[2] }; static void PrintKeyboardKeys(u8 window, u8 page) { u32 i; FillWindowPixelBuffer(window, sFillValues[page]); for (i = 0; i < KBROW_COUNT; i++) AddTextPrinterParameterized3(window, FONT_NORMAL_COPY_1, 0, i * 16 + 1, sKeyboardTextColors[page], 0, sNamingScreenKeyboardText[page][i]); PutWindowTilemap(window); } static const u32 *const sNextKeyboardPageTilemaps[] = { [KBPAGE_SYMBOLS] = gNamingScreenKeyboardUpper_Tilemap, [KBPAGE_LETTERS_UPPER] = gNamingScreenKeyboardLower_Tilemap, [KBPAGE_LETTERS_LOWER] = gNamingScreenKeyboardSymbols_Tilemap }; static void DrawKeyboardPageOnDeck(void) { u8 bgId; u8 bgId_copy; u8 windowId; u8 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3; u8 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3; if (bg1Priority > bg2Priority) { bgId = 1; bgId_copy = 1; windowId = sNamingScreen->windows[WIN_KB_PAGE_1]; } else { bgId = 2; bgId_copy = 2; windowId = sNamingScreen->windows[WIN_KB_PAGE_2]; } DecompressToBgTilemapBuffer(bgId, sNextKeyboardPageTilemaps[sNamingScreen->currentPage]); PrintKeyboardKeys(windowId, CurrentPageToNextKeyboardId()); CopyBgTilemapBufferToVram(bgId_copy); } static void PrintControls(void) { const u8 color[3] = { TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY }; int strwidth = GetStringWidth(FONT_SMALL, gText_MoveOkBack, 0); FillWindowPixelBuffer(sNamingScreen->windows[WIN_BANNER], PIXEL_FILL(15)); AddTextPrinterParameterized3(sNamingScreen->windows[WIN_BANNER], FONT_SMALL, DISPLAY_WIDTH - 4 - strwidth, 0, color, 0, gText_MoveOkBack); PutWindowTilemap(sNamingScreen->windows[WIN_BANNER]); CopyWindowToVram(sNamingScreen->windows[WIN_BANNER], COPYWIN_FULL); } static void CB2_NamingScreen(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void ResetVHBlank(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); } static void SetVBlank(void) { SetVBlankCallback(VBlankCB_NamingScreen); } static void VBlankCB_NamingScreen(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); SetGpuReg(REG_OFFSET_BG1VOFS, sNamingScreen->bg1vOffset); SetGpuReg(REG_OFFSET_BG2VOFS, sNamingScreen->bg2vOffset); SetGpuReg(REG_OFFSET_BG1CNT, GetGpuReg(REG_OFFSET_BG1CNT) & 0xFFFC); // clear priority bits SetGpuRegBits(REG_OFFSET_BG1CNT, sNamingScreen->bg1Priority); SetGpuReg(REG_OFFSET_BG2CNT, GetGpuReg(REG_OFFSET_BG2CNT) & 0xFFFC); // clear priority bits SetGpuRegBits(REG_OFFSET_BG2CNT, sNamingScreen->bg2Priority); } static void NamingScreen_ShowBgs(void) { ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); } // Always false (presumably for non-latin languages) static bool8 IsWideLetter(u8 character) { u32 i; for (i = 0; gText_AlphabetUpperLower[i] != EOS; i++) { if (character == gText_AlphabetUpperLower[i]) return TRUE; } return FALSE; } //-------------------------------------------------- // Unused debug functions //-------------------------------------------------- static void Debug_NamingScreenPlayer(void) { DoNamingScreen(NAMING_SCREEN_PLAYER, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu); } static void Debug_NamingScreenBox(void) { DoNamingScreen(NAMING_SCREEN_BOX, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu); } static void Debug_NamingScreenCaughtMon(void) { DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu); } static void Debug_NamingScreenNickname(void) { DoNamingScreen(NAMING_SCREEN_NICKNAME, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu); } static void Debug_NamingScreenRival(void) { DoNamingScreen(NAMING_SCREEN_RIVAL, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu); } //-------------------------------------------------- // Forward-declared variables //-------------------------------------------------- static const struct NamingScreenTemplate sPlayerNamingScreenTemplate = { .copyExistingString = FALSE, .maxChars = PLAYER_NAME_LENGTH, .iconFunction = 1, .addGenderIcon = 0, .initialPage = KBPAGE_LETTERS_UPPER, .title = gText_YourName, }; static const struct NamingScreenTemplate sPcBoxNamingScreenTemplate = { .copyExistingString = FALSE, .maxChars = BOX_NAME_LENGTH, .iconFunction = 2, .addGenderIcon = 0, .initialPage = KBPAGE_LETTERS_UPPER, .title = gText_BoxName, }; static const struct NamingScreenTemplate sMonNamingScreenTemplate = { .copyExistingString = FALSE, .maxChars = POKEMON_NAME_LENGTH, .iconFunction = 3, .addGenderIcon = 1, .initialPage = KBPAGE_LETTERS_UPPER, .title = gText_PkmnsNickname, }; static const struct NamingScreenTemplate sRivalNamingScreenTemplate = { .copyExistingString = FALSE, .maxChars = PLAYER_NAME_LENGTH, .iconFunction = 4, .addGenderIcon = 0, .initialPage = KBPAGE_LETTERS_UPPER, .title = gText_RivalsName, }; static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = { [NAMING_SCREEN_PLAYER] = &sPlayerNamingScreenTemplate, [NAMING_SCREEN_BOX] = &sPcBoxNamingScreenTemplate, [NAMING_SCREEN_CAUGHT_MON] = &sMonNamingScreenTemplate, [NAMING_SCREEN_NICKNAME] = &sMonNamingScreenTemplate, [NAMING_SCREEN_RIVAL] = &sRivalNamingScreenTemplate, }; static const struct OamData sOam_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 0, .paletteNum = 0, }; static const struct OamData sOam_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 0, .paletteNum = 0, }; static const struct OamData sOam_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 0, .paletteNum = 0, }; static const struct Subsprite sSubsprites_PageSwapFrame[] = { { .x = -20, .y = -16, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = 12, .y = -16, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 4, .priority = 1 }, { .x = -20, .y = -8, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 5, .priority = 1 }, { .x = 12, .y = -8, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 9, .priority = 1 }, { .x = -20, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 10, .priority = 1 }, { .x = 12, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 14, .priority = 1 }, { .x = -20, .y = 8, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 15, .priority = 1 }, { .x = 12, .y = 8, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 19, .priority = 1 } }; static const struct Subsprite sSubsprites_PageSwapText[] = { { .x = -12, .y = -4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 0, .priority = 1 }, { .x = 4, .y = -4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 2, .priority = 1 } }; static const struct Subsprite sSubsprites_Button[] = { { .x = -20, .y = -12, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 0, .priority = 1 }, { .x = 12, .y = -12, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 4, .priority = 1 }, { .x = -20, .y = -4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 5, .priority = 1 }, { .x = 12, .y = -4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 9, .priority = 1 }, { .x = -20, .y = 4, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), .tileOffset = 10, .priority = 1 }, { .x = 12, .y = 4, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .tileOffset = 14, .priority = 1 } }; static const struct Subsprite sSubsprites_PCIcon[] = { { .x = -8, .y = -12, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 0, .priority = 3 }, { .x = -8, .y = -4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 2, .priority = 3 }, { .x = -8, .y = 4, .shape = SPRITE_SHAPE(16x8), .size = SPRITE_SIZE(16x8), .tileOffset = 4, .priority = 3 } }; static const struct SubspriteTable sSubspriteTable_PageSwapFrame[] = { {ARRAY_COUNT(sSubsprites_PageSwapFrame), sSubsprites_PageSwapFrame} }; static const struct SubspriteTable sSubspriteTable_PageSwapText[] = { {ARRAY_COUNT(sSubsprites_PageSwapText), sSubsprites_PageSwapText}, {ARRAY_COUNT(sSubsprites_PageSwapText), sSubsprites_PageSwapText}, {ARRAY_COUNT(sSubsprites_PageSwapText), sSubsprites_PageSwapText} }; static const struct SubspriteTable sSubspriteTable_Button[] = { {ARRAY_COUNT(sSubsprites_Button), sSubsprites_Button} }; static const struct SubspriteTable sSubspriteTable_PCIcon[] = { {ARRAY_COUNT(sSubsprites_PCIcon), sSubsprites_PCIcon} }; static const struct SpriteFrameImage sImageTable_PCIcon[] = { {sPCIconOff_Gfx, sizeof(sPCIconOff_Gfx)}, {sPCIconOn_Gfx, sizeof(sPCIconOn_Gfx)}, }; static const union AnimCmd sAnim_Loop[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_CursorSquish[] = { ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(8, 8), ANIMCMD_END }; static const union AnimCmd sAnim_PCIcon[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(1, 2), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_Loop[] = { sAnim_Loop }; static const union AnimCmd *const sAnims_Cursor[] = { sAnim_Loop, sAnim_CursorSquish }; static const union AnimCmd *const sAnims_PCIcon[] = { sAnim_PCIcon }; static const struct SpriteTemplate sSpriteTemplate_PageSwapFrame = { .tileTag = GFXTAG_PAGE_SWAP_FRAME, .paletteTag = PALTAG_PAGE_SWAP, .oam = &sOam_8x8, .anims = sAnims_Loop, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PageSwap }; static const struct SpriteTemplate sSpriteTemplate_PageSwapButton = { .tileTag = GFXTAG_PAGE_SWAP_BUTTON, .paletteTag = PALTAG_PAGE_SWAP_UPPER, .oam = &sOam_32x16, .anims = sAnims_Loop, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_PageSwapText = { .tileTag = GFXTAG_PAGE_SWAP_UPPER, .paletteTag = PALTAG_PAGE_SWAP, .oam = &sOam_8x8, .anims = sAnims_Loop, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_BackButton = { .tileTag = GFXTAG_BACK_BUTTON, .paletteTag = PALTAG_BACK_BUTTON, .oam = &sOam_8x8, .anims = sAnims_Loop, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_OkButton = { .tileTag = GFXTAG_OK_BUTTON, .paletteTag = PALTAG_OK_BUTTON, .oam = &sOam_8x8, .anims = sAnims_Loop, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_Cursor = { .tileTag = GFXTAG_CURSOR, .paletteTag = PALTAG_CURSOR, .oam = &sOam_16x16, .anims = sAnims_Cursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Cursor }; static const struct SpriteTemplate sSpriteTemplate_InputArrow = { .tileTag = GFXTAG_INPUT_ARROW, .paletteTag = PALTAG_PAGE_SWAP_OTHERS, .oam = &sOam_8x8, .anims = sAnims_Loop, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_InputArrow }; static const struct SpriteTemplate sSpriteTemplate_Underscore = { .tileTag = GFXTAG_UNDERSCORE, .paletteTag = PALTAG_PAGE_SWAP_OTHERS, .oam = &sOam_8x8, .anims = sAnims_Loop, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Underscore }; static const struct SpriteTemplate sSpriteTemplate_PCIcon = { .tileTag = TAG_NONE, .paletteTag = PALTAG_MENU, .oam = &sOam_8x8, .anims = sAnims_PCIcon, .images = sImageTable_PCIcon, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const u8 *const sNamingScreenKeyboardText[KBPAGE_COUNT][KBROW_COUNT] = { [KEYBOARD_LETTERS_LOWER] = { gText_NamingScreenKeyboard_abcdef, gText_NamingScreenKeyboard_ghijkl, gText_NamingScreenKeyboard_mnopqrs, gText_NamingScreenKeyboard_tuvwxyz }, [KEYBOARD_LETTERS_UPPER] = { gText_NamingScreenKeyboard_ABCDEF, gText_NamingScreenKeyboard_GHIJKL, gText_NamingScreenKeyboard_MNOPQRS, gText_NamingScreenKeyboard_TUVWXYZ }, [KEYBOARD_SYMBOLS] = { gText_NamingScreenKeyboard_01234, gText_NamingScreenKeyboard_56789, gText_NamingScreenKeyboard_Symbols1, gText_NamingScreenKeyboard_Symbols2 }, }; static const struct SpriteSheet sSpriteSheets[] = { {gNamingScreenBackButton_Gfx, 0x1E0, GFXTAG_BACK_BUTTON}, {gNamingScreenOKButton_Gfx, 0x1E0, GFXTAG_OK_BUTTON}, {gNamingScreenPageSwapFrame_Gfx, 0x280, GFXTAG_PAGE_SWAP_FRAME}, {gNamingScreenPageSwapButton_Gfx, 0x100, GFXTAG_PAGE_SWAP_BUTTON}, {gNamingScreenPageSwapUpper_Gfx, 0x060, GFXTAG_PAGE_SWAP_UPPER}, {gNamingScreenPageSwapLower_Gfx, 0x060, GFXTAG_PAGE_SWAP_LOWER}, {gNamingScreenPageSwapOthers_Gfx, 0x060, GFXTAG_PAGE_SWAP_OTHERS}, {gNamingScreenCursor_Gfx, 0x080, GFXTAG_CURSOR}, {gNamingScreenCursorSquished_Gfx, 0x080, GFXTAG_CURSOR_SQUISHED}, {gNamingScreenCursorFilled_Gfx, 0x080, GFXTAG_CURSOR_FILLED}, {gNamingScreenInputArrow_Gfx, 0x020, GFXTAG_INPUT_ARROW}, {gNamingScreenUnderscore_Gfx, 0x020, GFXTAG_UNDERSCORE}, {} // terminator }; static const struct SpritePalette sSpritePalettes[] = { {gNamingScreenMenu_Pal[0], PALTAG_MENU}, {gNamingScreenMenu_Pal[1], PALTAG_PAGE_SWAP_UPPER}, {gNamingScreenMenu_Pal[2], PALTAG_PAGE_SWAP_LOWER}, {gNamingScreenMenu_Pal[3], PALTAG_PAGE_SWAP_OTHERS}, {gNamingScreenMenu_Pal[4], PALTAG_PAGE_SWAP}, {gNamingScreenMenu_Pal[5], PALTAG_CURSOR}, {gNamingScreenMenu_Pal[4], PALTAG_BACK_BUTTON}, {gNamingScreenMenu_Pal[4], PALTAG_OK_BUTTON}, {} // terminator }; ================================================ FILE: src/new_game.c ================================================ #include "global.h" #include "gflib.h" #include "random.h" #include "overworld.h" #include "constants/maps.h" #include "load_save.h" #include "item_menu.h" #include "tm_case.h" #include "berry_pouch.h" #include "quest_log.h" #include "wild_encounter.h" #include "event_data.h" #include "mail_data.h" #include "play_time.h" #include "money.h" #include "battle_records.h" #include "pokemon_size_record.h" #include "pokemon_storage_system.h" #include "roamer.h" #include "item.h" #include "player_pc.h" #include "berry.h" #include "easy_chat.h" #include "union_room_chat.h" #include "mystery_gift.h" #include "renewable_hidden_items.h" #include "trainer_tower.h" #include "script.h" #include "berry_powder.h" #include "pokemon_jump.h" #include "event_scripts.h" // this file's functions static void ResetMiniGamesResults(void); // EWRAM vars EWRAM_DATA bool8 gDifferentSaveFile = FALSE; void SetTrainerId(u32 trainerId, u8 *dst) { dst[0] = trainerId; dst[1] = trainerId >> 8; dst[2] = trainerId >> 16; dst[3] = trainerId >> 24; } void CopyTrainerId(u8 *dst, u8 *src) { s32 i; for (i = 0; i < 4; i++) dst[i] = src[i]; } static void InitPlayerTrainerId(void) { u32 trainerId = (Random() << 0x10) | GetGeneratedTrainerIdLower(); SetTrainerId(trainerId, gSaveBlock2Ptr->playerTrainerId); } static void SetDefaultOptions(void) { gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_FAST; gSaveBlock2Ptr->optionsWindowFrameType = 0; gSaveBlock2Ptr->optionsSound = OPTIONS_SOUND_STEREO; gSaveBlock2Ptr->optionsBattleStyle = OPTIONS_BATTLE_STYLE_PREDICT; gSaveBlock2Ptr->optionsButtonMode = OPTIONS_BUTTON_MODE_HELP; gSaveBlock2Ptr->optionsBattleTransitions = FALSE; gSaveBlock2Ptr->optionsBattleIntroAnim = 0; gSaveBlock2Ptr->optionsBattleSceneOff = FALSE; gSaveBlock2Ptr->optionsHpBarAnimSpeed = 0; gSaveBlock2Ptr->optionsExpBarAnimSpeed = 0; } static void ClearPokedexFlags(void) { memset(&gSaveBlock2Ptr->pokedex.owned, 0, sizeof(gSaveBlock2Ptr->pokedex.owned)); memset(&gSaveBlock2Ptr->pokedex.seen, 0, sizeof(gSaveBlock2Ptr->pokedex.seen)); } static void ClearBattleTower(void) { CpuFill32(0, &gSaveBlock2Ptr->battleTower, sizeof(gSaveBlock2Ptr->battleTower)); } static void WarpToPlayersRoom(void) { SetWarpDestination(MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F), MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F), -1, 6, 6); WarpIntoMap(); } void Sav2_ClearSetDefault(void) { ClearSav2(); SetDefaultOptions(); } void ResetMenuAndMonGlobals(void) { gDifferentSaveFile = FALSE; ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); ResetBagCursorPositions(); ResetTMCaseCursorPos(); BerryPouch_CursorResetToTop(); ResetQuestLog(); SeedWildEncounterRng(Random()); ResetSpecialVars(); } void NewGameInitData(void) { u8 rivalName[PLAYER_NAME_LENGTH + 1]; StringCopy(rivalName, gSaveBlock1Ptr->rivalName); gDifferentSaveFile = TRUE; gSaveBlock2Ptr->encryptionKey = 0; ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); ClearBattleTower(); ClearSav1(); ClearMailData(); gSaveBlock2Ptr->specialSaveWarpFlags = 0; gSaveBlock2Ptr->gcnLinkFlags = 0; gSaveBlock2Ptr->unkFlag1 = TRUE; gSaveBlock2Ptr->unkFlag2 = FALSE; InitPlayerTrainerId(); PlayTimeCounter_Reset(); ClearPokedexFlags(); InitEventData(); ResetFameChecker(); SetMoney(&gSaveBlock1Ptr->money, 3000); ResetGameStats(); ClearPlayerLinkBattleRecords(); InitHeracrossSizeRecord(); InitMagikarpSizeRecord(); EnableNationalPokedex_RSE(); gPlayerPartyCount = 0; ZeroPlayerPartyMons(); ResetPokemonStorageSystem(); ClearRoamerData(); gSaveBlock1Ptr->registeredItem = 0; ClearBag(); DeserializeTmHmItemSlots(); NewGameInitPCItems(); ClearEnigmaBerries(); InitEasyChatPhrases(); ResetTrainerFanClub(); UnionRoomChat_InitializeRegisteredTexts(); ResetMiniGamesResults(); ClearMysteryGift(); SetAllRenewableItemFlags(); WarpToPlayersRoom(); RunScriptImmediately(EventScript_ResetAllMapFlags); StringCopy(gSaveBlock1Ptr->rivalName, rivalName); ResetTrainerTowerResults(); gSaveBlock1Ptr->keyFlags.expMod = 2; // normal exp } static void ResetMiniGamesResults(void) { CpuFill16(0, &gSaveBlock2Ptr->berryCrush, sizeof(struct BerryCrush)); SetBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, 0); ResetPokemonJumpRecords(); CpuFill16(0, &gSaveBlock2Ptr->berryPick, sizeof(struct BerryPickingResults)); } ================================================ FILE: src/new_menu_helpers.c ================================================ #include "global.h" #include "gflib.h" #include "help_message.h" #include "menu.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "quest_log.h" #include "field_specials.h" #include "text_window.h" #include "script.h" #define DLG_WINDOW_PALETTE_NUM 15 #define DLG_WINDOW_BASE_TILE_NUM 0x200 #define STD_WINDOW_PALETTE_NUM 14 #define STD_WINDOW_BASE_TILE_NUM 0x214 static EWRAM_DATA bool8 sScheduledBgCopiesToVram[4] = {FALSE}; static EWRAM_DATA u16 sTempTileDataBufferCursor = {0}; static EWRAM_DATA void *sTempTileDataBuffers[0x20] = {NULL}; static EWRAM_DATA u8 sStartMenuWindowId = {0}; static const u16 sUnusedWindow_Gfx[] = INCBIN_U16("graphics/text_window/unused.4bpp"); const u16 gMenuMessageWindow_Gfx[] = INCBIN_U16("graphics/text_window/menu_message.4bpp"); const u16 gStandardMenuPalette[] = INCBIN_U16("graphics/interface/std_menu.gbapal"); static const u8 sTextSpeedFrameDelays[] = { [OPTIONS_TEXT_SPEED_SLOW] = 8, [OPTIONS_TEXT_SPEED_MID] = 4, [OPTIONS_TEXT_SPEED_FAST] = 1, [OPTIONS_TEXT_SPEED_INSTANT] = 1 }; static const struct WindowTemplate sStandardTextBox_WindowTemplates[] = { { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = DLG_WINDOW_PALETTE_NUM, .baseBlock = 0x198, }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sYesNo_WindowTemplate = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 9, .width = 6, .height = 4, .paletteNum = DLG_WINDOW_PALETTE_NUM, .baseBlock = 0x125, }; static const struct FontInfo gFontInfos[] = { [FONT_SMALL] = { .fontFunction = FontFunc_Small, .maxLetterWidth = 8, .maxLetterHeight = 13, .letterSpacing = 0, .lineSpacing = 0, .fgColor = 2, .bgColor = 1, .shadowColor = 3, }, [FONT_NORMAL_COPY_1] = { .fontFunction = FontFunc_NormalCopy1, .maxLetterWidth = 8, .maxLetterHeight = 14, .letterSpacing = 0, .lineSpacing = 0, .fgColor = 2, .bgColor = 1, .shadowColor = 3, }, [FONT_NORMAL] = { .fontFunction = FontFunc_Normal, .maxLetterWidth = 10, .maxLetterHeight = 14, .letterSpacing = 1, .lineSpacing = 0, .fgColor = 2, .bgColor = 1, .shadowColor = 3, }, [FONT_NORMAL_COPY_2] = { .fontFunction = FontFunc_NormalCopy2, .maxLetterWidth = 10, .maxLetterHeight = 14, .letterSpacing = 1, .lineSpacing = 0, .fgColor = 2, .bgColor = 1, .shadowColor = 3, }, [FONT_MALE] = { .fontFunction = FontFunc_Male, .maxLetterWidth = 10, .maxLetterHeight = 14, .letterSpacing = 0, .lineSpacing = 0, .fgColor = 2, .bgColor = 1, .shadowColor = 3, }, [FONT_FEMALE] = { .fontFunction = FontFunc_Female, .maxLetterWidth = 10, .maxLetterHeight = 14, .letterSpacing = 0, .lineSpacing = 0, .fgColor = 2, .bgColor = 1, .shadowColor = 3, }, [FONT_BRAILLE] = { .fontFunction = FontFunc_Braille, .maxLetterWidth = 8, .maxLetterHeight = 16, .letterSpacing = 0, .lineSpacing = 2, .fgColor = 2, .bgColor = 1, .shadowColor = 3, }, [FONT_BOLD] = { .fontFunction = NULL, .maxLetterWidth = 8, .maxLetterHeight = 8, .letterSpacing = 0, .lineSpacing = 0, .fgColor = 1, .bgColor = 2, .shadowColor = 15, } }; static const u8 gMenuCursorDimensions[][2] = { [FONT_SMALL] = { 8, 13 }, [FONT_NORMAL_COPY_1] = { 8, 14 }, [FONT_NORMAL] = { 8, 14 }, [FONT_NORMAL_COPY_2] = { 8, 14 }, [FONT_MALE] = { 8, 14 }, [FONT_FEMALE] = { 8, 14 }, [FONT_BRAILLE] = { 8, 16 }, [FONT_BOLD] = {} }; static u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode); static void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); static void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); static void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); static void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId); void ClearScheduledBgCopiesToVram(void) { memset(sScheduledBgCopiesToVram, 0, sizeof(sScheduledBgCopiesToVram)); } void ScheduleBgCopyTilemapToVram(u8 bgId) { sScheduledBgCopiesToVram[bgId] = TRUE; } void DoScheduledBgTilemapCopiesToVram(void) { if (sScheduledBgCopiesToVram[0] == TRUE) { CopyBgTilemapBufferToVram(0); sScheduledBgCopiesToVram[0] = FALSE; } if (sScheduledBgCopiesToVram[1] == TRUE) { CopyBgTilemapBufferToVram(1); sScheduledBgCopiesToVram[1] = FALSE; } if (sScheduledBgCopiesToVram[2] == TRUE) { CopyBgTilemapBufferToVram(2); sScheduledBgCopiesToVram[2] = FALSE; } if (sScheduledBgCopiesToVram[3] == TRUE) { CopyBgTilemapBufferToVram(3); sScheduledBgCopiesToVram[3] = FALSE; } } void ResetTempTileDataBuffers(void) { int i; for (i = 0; i < (s32)NELEMS(sTempTileDataBuffers); i++) { sTempTileDataBuffers[i] = NULL; } sTempTileDataBufferCursor = 0; } bool8 FreeTempTileDataBuffersIfPossible(void) { int i; if (!IsDma3ManagerBusyWithBgCopy()) { if (sTempTileDataBufferCursor) { for (i = 0; i < sTempTileDataBufferCursor; i++) { FREE_AND_SET_NULL(sTempTileDataBuffers[i]); } sTempTileDataBufferCursor = 0; } return FALSE; } else { return TRUE; } } void *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) { u32 sizeOut; if (sTempTileDataBufferCursor < NELEMS(sTempTileDataBuffers)) { void *ptr = MallocAndDecompress(src, &sizeOut); if (!size) size = sizeOut; if (ptr) { CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode); sTempTileDataBuffers[sTempTileDataBufferCursor++] = ptr; } return ptr; } return NULL; } void *DecompressAndCopyTileDataToVram2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) { u32 sizeOut; if (sTempTileDataBufferCursor < NELEMS(sTempTileDataBuffers)) { void *ptr = MallocAndDecompress(src, &sizeOut); if (sizeOut > size) sizeOut = size; if (ptr) { CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode); sTempTileDataBuffers[sTempTileDataBufferCursor++] = ptr; } return ptr; } return NULL; } void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) { u32 sizeOut; void *ptr = MallocAndDecompress(src, &sizeOut); if (!size) size = sizeOut; if (ptr) { u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0); gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode); SetWordTaskArg(taskId, 1, (u32)ptr); } } void DecompressAndLoadBgGfxUsingHeap2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) { u32 sizeOut; void *ptr = MallocAndDecompress(src, &sizeOut); if (sizeOut > size) sizeOut = size; if (ptr) { u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0); gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode); SetWordTaskArg(taskId, 1, (u32)ptr); } } static void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId) { if (!WaitDma3Request(gTasks[taskId].data[0])) { Free((void *)GetWordTaskArg(taskId, 1)); DestroyTask(taskId); } } void *MallocAndDecompress(const void *src, u32 *size) { void *ptr; u8 *sizeAsBytes = (u8 *)size; const u8 *srcAsBytes = src; sizeAsBytes[0] = srcAsBytes[1]; sizeAsBytes[1] = srcAsBytes[2]; sizeAsBytes[2] = srcAsBytes[3]; sizeAsBytes[3] = 0; ptr = Alloc(*size); if (ptr) LZ77UnCompWram(src, ptr); return ptr; } static u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode) { switch (mode) { case 1: break; case 0: default: return LoadBgTiles(bgId, src, size, offset); } return LoadBgTilemap(bgId, src, size, offset); } void SetBgTilemapPalette(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette) { u8 i, j; u16 *ptr = GetBgTilemapBuffer(bgId); for (i = top; i < top + height; i++) { for (j = left; j < left + width; j++) { ptr[(i * 32) + j] = (ptr[(i * 32) + j] & 0xFFF) | (palette << 12); } } } void CopyToBufferFromBgTilemap(u8 bgId, u16 *dest, u8 left, u8 top, u8 width, u8 height) { u8 i,j; const u16 *src = GetBgTilemapBuffer(bgId); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[(i * width) + j] = src[(i + top) * 32 + j + left]; } } } void ResetBgPositions(void) { ChangeBgX(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(0, 0, 0); ChangeBgY(1, 0, 0); ChangeBgY(2, 0, 0); ChangeBgY(3, 0, 0); } void InitStandardTextBoxWindows(void) { InitWindows(sStandardTextBox_WindowTemplates); sStartMenuWindowId = 0xFF; MapNamePopupWindowIdSetDummy(); } void FreeAllOverworldWindowBuffers(void) { FreeAllWindowBuffers(); } void InitTextBoxGfxAndPrinters(void) { ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); DeactivateAllTextPrinters(); LoadStdWindowFrameGfx(); } u16 RunTextPrinters_CheckPrinter0Active(void) { RunTextPrinters(); return IsTextPrinterActive(0); } u16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 fgColor, u8 bgColor, u8 shadowColor) { struct TextPrinterTemplate printer; printer.currentChar = str; printer.windowId = windowId; printer.fontId = fontId; printer.x = 0; printer.y = 1; printer.currentX = 0; printer.currentY = 1; printer.letterSpacing = 1; printer.lineSpacing = 1; printer.unk = 0; printer.fgColor = fgColor; printer.bgColor = bgColor; printer.shadowColor = shadowColor; gTextFlags.useAlternateDownArrow = 0; return AddTextPrinter(&printer, speed, callback); } void AddTextPrinterDiffStyle(bool8 allowSkippingDelayWithButtonPress) { u8 color; void *nptr = NULL; gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress; color = ContextNpcGetTextColor(); if (color == NPC_TEXT_COLOR_MALE) AddTextPrinterParameterized2(0, FONT_MALE, gStringVar4, GetTextSpeedSetting(), nptr, TEXT_COLOR_BLUE, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); else if (color == NPC_TEXT_COLOR_FEMALE) AddTextPrinterParameterized2(0, FONT_FEMALE, gStringVar4, GetTextSpeedSetting(), nptr, TEXT_COLOR_RED, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); else // NPC_TEXT_COLOR_MON / NPC_TEXT_COLOR_NEUTRAL AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), nptr, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress) { gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress; AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed) { gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress; AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } void LoadStdWindowFrameGfx(void) { if (gQuestLogState == QL_STATE_PLAYBACK) { gTextFlags.autoScroll = 1; LoadQuestLogWindowTiles(0, DLG_WINDOW_BASE_TILE_NUM); } else { Menu_LoadStdPal(); LoadMenuMessageWindowGfx(0, DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM)); } LoadUserWindowGfx(0, STD_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM)); } void DrawDialogueFrame(u8 windowId, bool8 copyToVram) { CallWindowFunction(windowId, WindowFunc_DrawDialogueFrame); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } void DrawStdWindowFrame(u8 windowId, bool8 copyToVram) { CallWindowFunction(windowId, WindowFunc_DrawStandardFrame); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram) { CallWindowFunction(windowId, WindowFunc_ClearDialogWindowAndFrame); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); ClearWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); if (gQuestLogState == QL_STATE_PLAYBACK) CommitQuestLogWindow1(); } void ClearStdWindowAndFrame(u8 windowId, bool8 copyToVram) { CallWindowFunction(windowId, WindowFunc_ClearStdWindowAndFrame); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); ClearWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); } static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { int i; FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 1, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 1, tilemapLeft, tilemapTop - 1, width, 1, STD_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 2, tilemapLeft + width, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM); for (i = tilemapTop; i < tilemapTop + height; i++) { FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 3, tilemapLeft - 1, i, 1, 1, STD_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 5, tilemapLeft + width, i, 1, 1, STD_WINDOW_PALETTE_NUM); } FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 7, tilemapLeft, tilemapTop + height, width, 1, STD_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM); } static void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { if (!IsMsgSignpost() || gQuestLogState == QL_STATE_PLAYBACK) { FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); } else { FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); } } static void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, STD_WINDOW_PALETTE_NUM); } static void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, STD_WINDOW_PALETTE_NUM); } void EraseFieldMessageBox(bool8 copyToVram) { FillBgTilemapBufferRect(0, 0, 0, 0, 0x20, 0x20, 17); if (copyToVram == TRUE) CopyBgTilemapBufferToVram(0); } void SetStdWindowBorderStyle(u8 windowId, bool8 copyToVram) { DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM); } void LoadMessageBoxAndFrameGfx(u8 windowId, bool8 copyToVram) { if (gQuestLogState == QL_STATE_PLAYBACK) { gTextFlags.autoScroll = 1; LoadQuestLogWindowTiles(0, DLG_WINDOW_BASE_TILE_NUM); } else { LoadMenuMessageWindowGfx(windowId, DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM)); } DrawDialogFrameWithCustomTileAndPalette(windowId, copyToVram, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM); } void Menu_LoadStdPal(void) { LoadPalette(gStandardMenuPalette, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM), PLTT_SIZEOF(10)); } void Menu_LoadStdPalAt(u16 offset) { LoadPalette(gStandardMenuPalette, offset, PLTT_SIZEOF(10)); } // Unused static const u16 *GetStdMenuPalette(void) { return gStandardMenuPalette; } static u16 GetStdPalColor(u8 colorNum) { if (colorNum > 15) colorNum = 0; return gStandardMenuPalette[colorNum]; } void DisplayItemMessageOnField(u8 taskId, u8 fontId, const u8 *string, TaskFunc callback) { LoadStdWindowFrameGfx(); DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, fontId, GetTextSpeedSetting(), string, callback); CopyWindowToVram(0, COPYWIN_FULL); } void DisplayYesNoMenuDefaultYes(void) { CreateYesNoMenu(&sYesNo_WindowTemplate, FONT_NORMAL, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0); } void DisplayYesNoMenuDefaultNo(void) { CreateYesNoMenu(&sYesNo_WindowTemplate, FONT_NORMAL, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 1); } u8 GetTextSpeedSetting(void) { u32 speed; if (gSaveBlock2Ptr->optionsTextSpeed > OPTIONS_TEXT_SPEED_INSTANT) gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID; return sTextSpeedFrameDelays[gSaveBlock2Ptr->optionsTextSpeed]; } u8 CreateStartMenuWindow(u8 height) { if (sStartMenuWindowId == 0xFF) { struct WindowTemplate template = SetWindowTemplateFields(0, 0x16, 1, 7, height * 2 - 1, DLG_WINDOW_PALETTE_NUM, 0x13D); sStartMenuWindowId = AddWindow(&template); PutWindowTilemap(sStartMenuWindowId); } return sStartMenuWindowId; } u8 GetStartMenuWindowId(void) { return sStartMenuWindowId; } void RemoveStartMenuWindow(void) { if (sStartMenuWindowId != 0xFF) { RemoveWindow(sStartMenuWindowId); sStartMenuWindowId = 0xFF; } } static u16 GetDlgWindowBaseTileNum(void) { return DLG_WINDOW_BASE_TILE_NUM; } u16 GetStdWindowBaseTileNum(void) { return STD_WINDOW_BASE_TILE_NUM; } void DrawHelpMessageWindowWithText(const u8 * text) { LoadHelpMessageWindowGfx(CreateHelpMessageWindow(), DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM)); PrintTextOnHelpMessageWindow(text, 2); } void DestroyHelpMessageWindow_(void) { DestroyHelpMessageWindow(2); } void LoadSignpostWindowFrameGfx(void) { Menu_LoadStdPal(); LoadSignpostWindowGfx(0, DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM)); LoadUserWindowGfx(0, STD_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM)); } void SetDefaultFontsPointer(void) { SetFontsPointer(&gFontInfos[0]); } u8 GetFontAttribute(u8 fontId, u8 attributeId) { int result = 0; switch (attributeId) { case FONTATTR_MAX_LETTER_WIDTH: result = gFontInfos[fontId].maxLetterWidth; break; case FONTATTR_MAX_LETTER_HEIGHT: result = gFontInfos[fontId].maxLetterHeight; break; case FONTATTR_LETTER_SPACING: result = gFontInfos[fontId].letterSpacing; break; case FONTATTR_LINE_SPACING: result = gFontInfos[fontId].lineSpacing; break; case FONTATTR_UNKNOWN: result = gFontInfos[fontId].unk; break; case FONTATTR_COLOR_FOREGROUND: result = gFontInfos[fontId].fgColor; break; case FONTATTR_COLOR_BACKGROUND: result = gFontInfos[fontId].bgColor; break; case FONTATTR_COLOR_SHADOW: result = gFontInfos[fontId].shadowColor; break; } return result; } u8 GetMenuCursorDimensionByFont(u8 fontId, u8 whichDimension) { return gMenuCursorDimensions[fontId][whichDimension]; } ================================================ FILE: src/oak_speech.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "task.h" #include "blend_palette.h" #include "text_window.h" #include "menu.h" #include "help_system.h" #include "new_menu_helpers.h" #include "event_scripts.h" #include "scanline_effect.h" #include "pokeball.h" #include "naming_screen.h" #include "math_util.h" #include "overworld.h" #include "random.h" #include "data.h" #include "constants/songs.h" #define INTRO_SPECIES SPECIES_NIDORAN_F enum { WIN_INTRO_TEXTBOX, WIN_INTRO_BOYGIRL, WIN_INTRO_YESNO, WIN_INTRO_NAMES, NUM_INTRO_WINDOWS, }; struct OakSpeechResources { void *oakSpeechBackgroundTiles; void *trainerPicTilemap; void *pikachuIntroTilemap; void *unused1; u16 hasPlayerBeenNamed; u16 currentPage; u16 windowIds[NUM_INTRO_WINDOWS]; u8 textColor[3]; u8 textSpeed; u8 unused2[0x1800]; u8 bg2TilemapBuffer[0x400]; u8 bg1TilemapBuffer[0x800]; }; static EWRAM_DATA struct OakSpeechResources *sOakSpeechResources = NULL; static void Task_NewGameScene(u8); static void ControlsGuide_LoadPage1(void); static void Task_ControlsGuide_HandleInput(u8); static void Task_ControlsGuide_ChangePage(u8); static void Task_ControlsGuide_Clear(u8); static void Task_PikachuIntro_LoadPage1(u8); static void Task_PikachuIntro_HandleInput(u8); static void Task_PikachuIntro_Clear(u8); static void Task_OakSpeech_Init(u8); static void Task_OakSpeech_WelcomeToTheWorld(u8); static void Task_OakSpeech_ThisWorld(u8); static void Task_OakSpeech_ReleaseNidoranFFromPokeBall(u8); static void Task_OakSpeech_IsInhabitedFarAndWide(u8); static void Task_OakSpeech_IStudyPokemon(u8); static void Task_OakSpeech_ReturnNidoranFToPokeBall(u8); static void Task_OakSpeech_TellMeALittleAboutYourself(u8); static void Task_OakSpeech_FadeOutOak(u8); static void Task_OakSpeech_AskPlayerGender(u8); static void Task_OakSpeech_ShowGenderOptions(u8); static void Task_OakSpeech_HandleGenderInput(u8); static void Task_OakSpeech_ClearGenderWindows(u8); static void Task_OakSpeech_LoadPlayerPic(u8); static void Task_OakSpeech_YourNameWhatIsIt(u8); static void Task_OakSpeech_FadeOutForPlayerNamingScreen(u8); static void Task_OakSpeech_HandleRivalNameInput(u8); static void Task_OakSpeech_DoNamingScreen(u8); static void Task_OakSpeech_ConfirmName(u8); static void Task_OakSpeech_HandleConfirmNameInput(u8); static void Task_OakSpeech_FadeOutPlayerPic(u8); static void Task_OakSpeech_FadeOutRivalPic(u8); static void Task_OakSpeech_FadeInRivalPic(u8); static void Task_OakSpeech_AskRivalsName(u8); static void Task_OakSpeech_ReshowPlayersPic(u8); static void Task_OakSpeech_LetsGo(u8); static void Task_OakSpeech_FadeOutBGM(u8); static void Task_OakSpeech_SetUpExitAnimation(u8); static void Task_OakSpeech_SetUpShrinkPlayerPic(u8); static void Task_OakSpeech_ShrinkPlayerPic(u8); static void Task_OakSpeech_SetUpDestroyPlatformSprites(u8); static void Task_OakSpeech_DestroyPlatformSprites(u8); static void Task_OakSpeech_SetUpFadePlayerPicWhite(u8); static void Task_OakSpeech_FadePlayerPicWhite(u8); static void Task_OakSpeech_FadePlayerPicToBlack(u8); static void Task_OakSpeech_WaitForFade(u8); static void Task_OakSpeech_FreeResources(u8); static void CB2_ReturnFromNamingScreen(void); static void CreateNidoranFSprite(u8); static void CreatePikachuOrPlatformSprites(u8, u8); static void DestroyPikachuOrPlatformSprites(u8, u8); static void LoadTrainerPic(u16, u16); static void ClearTrainerPic(void); static void CreateFadeInTask(u8, u8); static void CreateFadeOutTask(u8, u8); static void PrintNameChoiceOptions(u8, u8); static void GetDefaultName(u8, u8); extern const u8 gText_Controls[]; extern const u8 gText_ABUTTONNext[]; extern const u8 gText_ABUTTONNext_BBUTTONBack[]; extern const u8 gText_Boy[]; extern const u8 gText_Girl[]; extern const struct OamData gOamData_AffineOff_ObjBlend_32x32; extern const struct OamData gOamData_AffineOff_ObjNormal_32x32; extern const struct OamData gOamData_AffineOff_ObjNormal_32x16; extern const struct OamData gOamData_AffineOff_ObjNormal_16x8; static const u16 sOakSpeech_Background_Pals[] = INCBIN_U16("graphics/oak_speech/bg_tiles.gbapal"); // Shared by the Controls Guide, Pikachu Intro and Oak Speech scenes static const u32 sControlsGuide_PikachuIntro_Background_Tiles[] = INCBIN_U32("graphics/oak_speech/bg_tiles.4bpp.lz"); static const u32 sPikachuIntro_Background_Tilemap[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/tilemap.bin.lz"); static const u32 sOakSpeech_Background_Tiles[] = INCBIN_U32("graphics/oak_speech/oak_speech_bg.4bpp.lz"); static const u32 sOakSpeech_Background_Tilemap[] = INCBIN_U32("graphics/oak_speech/oak_speech_bg.bin.lz"); static const u16 sControlsGuide_Tilemap_Page2[] = INCBIN_U16("graphics/oak_speech/controls_guide_page_2.bin"); static const u16 sControlsGuide_Tilemap_Page3[] = INCBIN_U16("graphics/oak_speech/controls_guide_page_3.bin"); static const u16 sOakSpeech_Leaf_Pal[] = INCBIN_U16("graphics/oak_speech/leaf/pal.gbapal"); static const u32 sOakSpeech_Leaf_Tiles[] = INCBIN_U32("graphics/oak_speech/leaf/pic.8bpp.lz"); static const u16 sOakSpeech_Red_Pal[] = INCBIN_U16("graphics/oak_speech/red/pal.gbapal"); static const u32 sOakSpeech_Red_Tiles[] = INCBIN_U32("graphics/oak_speech/red/pic.8bpp.lz"); static const u16 sOakSpeech_Oak_Pal[] = INCBIN_U16("graphics/oak_speech/oak/pal.gbapal"); static const u32 sOakSpeech_Oak_Tiles[] = INCBIN_U32("graphics/oak_speech/oak/pic.8bpp.lz"); static const u16 sOakSpeech_Rival_Pal[] = INCBIN_U16("graphics/oak_speech/rival/pal.gbapal"); static const u32 sOakSpeech_Rival_Tiles[] = INCBIN_U32("graphics/oak_speech/rival/pic.8bpp.lz"); static const u16 sOakSpeech_Platform_Pal[] = INCBIN_U16("graphics/oak_speech/platform.gbapal"); static const u16 sPikachuIntro_Pikachu_Pal[] = INCBIN_U16("graphics/oak_speech/pikachu_intro/pikachu.gbapal"); static const u32 sOakSpeech_Platform_Gfx[] = INCBIN_U32("graphics/oak_speech/platform.4bpp.lz"); static const u32 sPikachuIntro_PikachuBody_Gfx[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/body.4bpp.lz"); static const u32 sPikachuIntro_PikachuEars_Gfx[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/ears.4bpp.lz"); static const u32 sPikachuIntro_PikachuEyes_Gfx[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/eyes.4bpp.lz"); static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 1, .paletteMode = 1, .priority = 1, .baseTile = 0 } }; enum { CONTROLS_GUIDE_PAGE_1_WINDOW, NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS, }; static const struct WindowTemplate sControlsGuide_WindowTemplate_Page1[NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS + 1] = { [CONTROLS_GUIDE_PAGE_1_WINDOW] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 7, .width = 30, .height = 4, .paletteNum = 15, .baseBlock = 1 }, DUMMY_WIN_TEMPLATE }; enum { CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP, CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE, CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM, NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS, }; static const struct WindowTemplate sControlsGuide_WindowTemplate_Page2[NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS + 1] = { [CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP] = { .bg = 0, .tilemapLeft = 6, .tilemapTop = 3, .width = 24, .height = 6, .paletteNum = 15, .baseBlock = 1 }, [CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE] = { .bg = 0, .tilemapLeft = 6, .tilemapTop = 10, .width = 24, .height = 4, .paletteNum = 15, .baseBlock = 146 }, [CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM] = { .bg = 0, .tilemapLeft = 6, .tilemapTop = 15, .width = 24, .height = 4, .paletteNum = 15, .baseBlock = 243 }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sControlsGuide_WindowTemplate_Page3[NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS + 1] = { [CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP] = { .bg = 0, .tilemapLeft = 6, .tilemapTop = 3, .width = 24, .height = 4, .paletteNum = 15, .baseBlock = 1 }, [CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE] = { .bg = 0, .tilemapLeft = 6, .tilemapTop = 8, .width = 24, .height = 4, .paletteNum = 15, .baseBlock = 98 }, [CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM] = { .bg = 0, .tilemapLeft = 6, .tilemapTop = 13, .width = 24, .height = 6, .paletteNum = 15, .baseBlock = 195 }, DUMMY_WIN_TEMPLATE }; enum { CONTROLS_GUIDE_PAGE_1, CONTROLS_GUIDE_PAGE_2, CONTROLS_GUIDE_PAGE_3, NUM_CONTROLS_GUIDE_PAGES, }; static const struct WindowTemplate *const sControlsGuide_WindowTemplates[NUM_CONTROLS_GUIDE_PAGES] = { [CONTROLS_GUIDE_PAGE_1] = sControlsGuide_WindowTemplate_Page1, [CONTROLS_GUIDE_PAGE_2] = sControlsGuide_WindowTemplate_Page2, [CONTROLS_GUIDE_PAGE_3] = sControlsGuide_WindowTemplate_Page3 }; static const struct WindowTemplate sIntro_WindowTemplates[NUM_INTRO_WINDOWS + 1] = { [WIN_INTRO_TEXTBOX] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 4, .width = 28, .height = 15, .paletteNum = 15, .baseBlock = 1 }, [WIN_INTRO_BOYGIRL] = { .bg = 0, .tilemapLeft = 18, .tilemapTop = 9, .width = 9, .height = 4, .paletteNum = 15, .baseBlock = 372 }, [WIN_INTRO_YESNO] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 2, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 384 }, [WIN_INTRO_NAMES] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 2, .width = 12, .height = 10, .paletteNum = 15, .baseBlock = 1 }, DUMMY_WIN_TEMPLATE }; static const u8 sTextColor_White[] = { 0, 1, 2, 0 }; static const u8 sTextColor_DarkGray[] = { 0, 2, 3, 0 }; enum { PIKACHU_INTRO_PAGE_1, PIKACHU_INTRO_PAGE_2, PIKACHU_INTRO_PAGE_3, NUM_PIKACHU_INTRO_PAGES, }; static const u8 *const sPikachuIntro_Strings[NUM_PIKACHU_INTRO_PAGES] = { [PIKACHU_INTRO_PAGE_1] = gPikachuIntro_Text_Page1, [PIKACHU_INTRO_PAGE_2] = gPikachuIntro_Text_Page2, [PIKACHU_INTRO_PAGE_3] = gPikachuIntro_Text_Page3 }; #define GFX_TAG_PLATFORM 0x1000 #define GFX_TAG_PIKACHU 0x1001 #define GFX_TAG_PIKACHU_EARS 0x1002 #define GFX_TAG_PIKACHU_EYES 0x1003 #define PAL_TAG_PLATFORM 0x1000 #define PAL_TAG_PIKACHU 0x1001 enum { SPRITE_TYPE_PIKACHU, SPRITE_TYPE_PLATFORM, }; enum { PIKACHU_BODY_PLATFORM_LEFT, PIKACHU_EARS_PLATFORM_MIDDLE, PIKACHU_EYES_PLATFORM_RIGHT, NUM_PIKACHU_PLATFORM_SPRITES, }; static const struct CompressedSpriteSheet sPikachuIntro_Pikachu_SpriteSheets[] = { [PIKACHU_BODY_PLATFORM_LEFT] = { .data = sPikachuIntro_PikachuBody_Gfx, .size = 0x400, .tag = GFX_TAG_PIKACHU }, [PIKACHU_EARS_PLATFORM_MIDDLE] = { .data = sPikachuIntro_PikachuEars_Gfx, .size = 0x200, .tag = GFX_TAG_PIKACHU_EARS }, [PIKACHU_EYES_PLATFORM_RIGHT] = { .data = sPikachuIntro_PikachuEyes_Gfx, .size = 0x80, .tag = GFX_TAG_PIKACHU_EYES }, }; static const struct CompressedSpriteSheet sOakSpeech_Platform_SpriteSheet = { .data = sOakSpeech_Platform_Gfx, .size = 0x600, .tag = GFX_TAG_PLATFORM }; static const struct SpritePalette sPikachuIntro_Pikachu_SpritePalette = { .data = sPikachuIntro_Pikachu_Pal, .tag = PAL_TAG_PIKACHU }; static const struct SpritePalette sOakSpeech_Platform_SpritePalette = { .data = sOakSpeech_Platform_Pal, .tag = PAL_TAG_PLATFORM }; static const union AnimCmd sOakSpeech_PlatformLeft_Anim[] = { ANIMCMD_FRAME( 0, 0), ANIMCMD_END }; static const union AnimCmd sOakSpeech_PlatformMiddle_Anim[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END }; static const union AnimCmd sOakSpeech_PlatformRight_Anim[] = { ANIMCMD_FRAME(32, 0), ANIMCMD_END }; static const union AnimCmd *const sOakSpeech_PlatformLeft_Anims[] = { sOakSpeech_PlatformLeft_Anim }; static const union AnimCmd *const sOakSpeech_PlatformMiddle_Anims[] = { sOakSpeech_PlatformMiddle_Anim }; static const union AnimCmd *const sOakSpeech_PlatformRight_Anims[] = { sOakSpeech_PlatformRight_Anim }; static const struct SpriteTemplate sOakSpeech_Platform_SpriteTemplates[] = { [PIKACHU_BODY_PLATFORM_LEFT] = { .tileTag = GFX_TAG_PLATFORM, .paletteTag = PAL_TAG_PLATFORM, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = sOakSpeech_PlatformLeft_Anims, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }, [PIKACHU_EARS_PLATFORM_MIDDLE] = { .tileTag = GFX_TAG_PLATFORM, .paletteTag = PAL_TAG_PLATFORM, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = sOakSpeech_PlatformMiddle_Anims, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }, [PIKACHU_EYES_PLATFORM_RIGHT] = { .tileTag = GFX_TAG_PLATFORM, .paletteTag = PAL_TAG_PLATFORM, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = sOakSpeech_PlatformRight_Anims, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }, }; static const union AnimCmd sPikachuIntro_PikachuBody_Anim[] = { ANIMCMD_FRAME( 0, 30), ANIMCMD_FRAME(16, 30), ANIMCMD_JUMP(0) }; static const union AnimCmd sPikachuIntro_PikachuEars_Anim[] = { ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(8, 12), ANIMCMD_FRAME(0, 12), ANIMCMD_FRAME(8, 12), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(8, 12), ANIMCMD_FRAME(0, 12), ANIMCMD_FRAME(8, 12), ANIMCMD_JUMP(0) }; static const union AnimCmd sPikachuIntro_PikachuEyes_Anim[] = { ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(2, 8), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sPikachuIntro_PikachuBody_Anims[] = { sPikachuIntro_PikachuBody_Anim }; static const union AnimCmd *const sPikachuIntro_PikachuEars_Anims[] = { sPikachuIntro_PikachuEars_Anim }; static const union AnimCmd *const sPikachuIntro_PikachuEyes_Anims[] = { sPikachuIntro_PikachuEyes_Anim }; static const struct SpriteTemplate sPikachuIntro_Pikachu_SpriteTemplates[NUM_PIKACHU_PLATFORM_SPRITES] = { [PIKACHU_BODY_PLATFORM_LEFT] = { .tileTag = GFX_TAG_PIKACHU, .paletteTag = PAL_TAG_PIKACHU, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sPikachuIntro_PikachuBody_Anims, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }, [PIKACHU_EARS_PLATFORM_MIDDLE] = { .tileTag = GFX_TAG_PIKACHU_EARS, .paletteTag = PAL_TAG_PIKACHU, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = sPikachuIntro_PikachuEars_Anims, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }, [PIKACHU_EYES_PLATFORM_RIGHT] = { .tileTag = GFX_TAG_PIKACHU_EYES, .paletteTag = PAL_TAG_PIKACHU, .oam = &gOamData_AffineOff_ObjNormal_16x8, .anims = sPikachuIntro_PikachuEyes_Anims, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy } }; #define CONTROLS_GUIDE_STRINGS_PER_PAGE 3 static const u8 *const sControlsGuide_Pages2And3_Strings[CONTROLS_GUIDE_STRINGS_PER_PAGE * 2] = { // Page 2 gControlsGuide_Text_DPad, gControlsGuide_Text_AButton, gControlsGuide_Text_BButton, // Page 3 gControlsGuide_Text_StartButton, gControlsGuide_Text_SelectButton, gControlsGuide_Text_LRButtons }; static const u8 *const sMaleNameChoices_FR[] = { gNameChoice_Red, gNameChoice_Fire, gNameChoice_Ash, gNameChoice_Kene, gNameChoice_Geki, gNameChoice_Jak, gNameChoice_Janne, gNameChoice_Jonn, gNameChoice_Kamon, gNameChoice_Karl, gNameChoice_Taylor, gNameChoice_Oscar, gNameChoice_Hiro, gNameChoice_Max, gNameChoice_Jon, gNameChoice_Ralph, gNameChoice_Kay, gNameChoice_Tosh, gNameChoice_Roak }; static const u8 *const sMaleNameChoices_LG[] = { gNameChoice_Green, gNameChoice_Leaf, gNameChoice_Gary, gNameChoice_Kaz, gNameChoice_Toru, gNameChoice_Jak, gNameChoice_Janne, gNameChoice_Jonn, gNameChoice_Kamon, gNameChoice_Karl, gNameChoice_Taylor, gNameChoice_Oscar, gNameChoice_Hiro, gNameChoice_Max, gNameChoice_Jon, gNameChoice_Ralph, gNameChoice_Kay, gNameChoice_Tosh, gNameChoice_Roak }; static const u8 *const sFemaleNameChoices_FR[] = { gNameChoice_Red, gNameChoice_Fire, gNameChoice_Omi, gNameChoice_Jodi, gNameChoice_Amanda, gNameChoice_Hillary, gNameChoice_Makey, gNameChoice_Michi, gNameChoice_Paula, gNameChoice_June, gNameChoice_Cassie, gNameChoice_Rey, gNameChoice_Seda, gNameChoice_Kiko, gNameChoice_Mina, gNameChoice_Norie, gNameChoice_Sai, gNameChoice_Momo, gNameChoice_Suzi }; static const u8 *const sFemaleNameChoices_LG[] = { gNameChoice_Green, gNameChoice_Leaf, gNameChoice_Omi, gNameChoice_Jodi, gNameChoice_Amanda, gNameChoice_Hillary, gNameChoice_Makey, gNameChoice_Michi, gNameChoice_Paula, gNameChoice_June, gNameChoice_Cassie, gNameChoice_Rey, gNameChoice_Seda, gNameChoice_Kiko, gNameChoice_Mina, gNameChoice_Norie, gNameChoice_Sai, gNameChoice_Momo, gNameChoice_Suzi }; static const u8 *const sRivalNameChoices_FR[] = { gNameChoice_Green, gNameChoice_Gary, gNameChoice_Kaz, gNameChoice_Toru }; static const u8 *const sRivalNameChoices_LG[] = { gNameChoice_Red, gNameChoice_Ash, gNameChoice_Kene, gNameChoice_Geki }; enum { MALE_PLAYER_PIC, FEMALE_PLAYER_PIC, RIVAL_PIC, OAK_PIC }; static void VBlankCB_NewGameScene(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB2_NewGameScene(void) { RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } void StartNewGameScene(void) { gPlttBufferUnfaded[0] = RGB_BLACK; gPlttBufferFaded[0] = RGB_BLACK; CreateTask(Task_NewGameScene, 0); SetMainCallback2(CB2_NewGameScene); } #define tSpriteTimer data[0] #define tTrainerPicPosX data[1] #define tTrainerPicFadeState data[2] #define tTimer data[3] #define tNidoranFSpriteId data[4] #define tTextCursorSpriteId data[5] #define tPokeBallSpriteId data[6] #define tPikachuPlatformSpriteId(i) data[7 + i] // Pikachu and the platform are built of three sprites, // data[8] // so these are used to hold their sprite IDs // data[9] // #define tMenuWindowId data[13] #define tTextboxWindowId data[14] #define tDelta data[15] static void Task_NewGameScene(u8 taskId) { switch (gMain.state) { case 0: SetVBlankCallback(NULL); SetHBlankCallback(NULL); DmaFill16(3, 0, VRAM, VRAM_SIZE); DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT + sizeof(u16), PLTT_SIZE - 2); ResetPaletteFade(); ScanlineEffect_Stop(); ResetSpriteData(); FreeAllSpritePalettes(); ResetTempTileDataBuffers(); SetHelpContext(HELPCONTEXT_NEW_GAME); break; case 1: sOakSpeechResources = AllocZeroed(sizeof(*sOakSpeechResources)); CreateMonSpritesGfxManager(1, 1); break; case 2: SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN1H, 0); SetGpuReg(REG_OFFSET_WIN1V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); break; case 3: ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, sOakSpeechResources->bg1TilemapBuffer); SetBgTilemapBuffer(2, sOakSpeechResources->bg2TilemapBuffer); ChangeBgX(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); ChangeBgX(2, 0, BG_COORD_SET); ChangeBgY(2, 0, BG_COORD_SET); gSpriteCoordOffsetX = 0; gSpriteCoordOffsetY = 0; break; case 4: gPaletteFade.bufferTransferDisabled = TRUE; InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); Menu_LoadStdPalAt(BG_PLTT_ID(13)); LoadPalette(sOakSpeech_Background_Pals, BG_PLTT_ID(0), sizeof(sOakSpeech_Background_Pals)); LoadPalette(GetTextWindowPalette(2) + 15, BG_PLTT_ID(0), PLTT_SIZEOF(1)); break; case 5: sOakSpeechResources->textSpeed = GetTextSpeedSetting(); gTextFlags.canABSpeedUpPrint = TRUE; DecompressAndCopyTileDataToVram(1, sControlsGuide_PikachuIntro_Background_Tiles, 0, 0, 0); break; case 6: if (FreeTempTileDataBuffersIfPossible()) return; ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(1); break; case 7: CreateTopBarWindowLoadPalette(0, 30, 0, 13, 0x1C4); FillBgTilemapBufferRect_Palette0(1, 0xD00F, 0, 0, 30, 2); FillBgTilemapBufferRect_Palette0(1, 0xD002, 0, 2, 30, 1); FillBgTilemapBufferRect_Palette0(1, 0xD00E, 0, 19, 30, 1); ControlsGuide_LoadPage1(); gPaletteFade.bufferTransferDisabled = FALSE; gTasks[taskId].tTextCursorSpriteId = CreateTextCursorSprite(0, 230, 149, 0, 0); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); break; case 10: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); ShowBg(1); SetVBlankCallback(VBlankCB_NewGameScene); PlayBGM(MUS_NEW_GAME_INSTRUCT); gTasks[taskId].func = Task_ControlsGuide_HandleInput; gMain.state = 0; return; } gMain.state++; } static void ControlsGuide_LoadPage1(void) { TopBarWindowPrintTwoStrings(gText_Controls, gText_ABUTTONNext, FALSE, 0, TRUE); sOakSpeechResources->windowIds[0] = AddWindow(sControlsGuide_WindowTemplates[sOakSpeechResources->currentPage]); PutWindowTilemap(sOakSpeechResources->windowIds[0]); FillWindowPixelBuffer(sOakSpeechResources->windowIds[0], PIXEL_FILL(0)); AddTextPrinterParameterized4(sOakSpeechResources->windowIds[0], FONT_NORMAL, 2, 0, 1, 1, sTextColor_White, 0, gControlsGuide_Text_Intro); CopyWindowToVram(sOakSpeechResources->windowIds[0], COPYWIN_FULL); FillBgTilemapBufferRect_Palette0(1, 0x3000, 1, 3, 5, 16); CopyBgTilemapBufferToVram(1); } static void Task_ControlsGuide_LoadPage(u8 taskId) { u8 currWindow = 0; u8 page2Or3 = sOakSpeechResources->currentPage - 1; // 0 if page 2, 1 if page 3 if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_1) { ControlsGuide_LoadPage1(); } else { TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, TRUE); for (currWindow = CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP; currWindow < NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; currWindow++) { sOakSpeechResources->windowIds[currWindow] = AddWindow(&sControlsGuide_WindowTemplates[sOakSpeechResources->currentPage][currWindow]); PutWindowTilemap(sOakSpeechResources->windowIds[currWindow]); FillWindowPixelBuffer(sOakSpeechResources->windowIds[currWindow], PIXEL_FILL(0)); AddTextPrinterParameterized4(sOakSpeechResources->windowIds[currWindow], FONT_NORMAL, 6, 0, 1, 1, sTextColor_White, 0, sControlsGuide_Pages2And3_Strings[currWindow + page2Or3 * CONTROLS_GUIDE_STRINGS_PER_PAGE]); CopyWindowToVram(sOakSpeechResources->windowIds[currWindow], COPYWIN_FULL); } if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_2) CopyToBgTilemapBufferRect(1, sControlsGuide_Tilemap_Page2, 1, 3, 5, 16); else // CONTROLS_GUIDE_PAGE_3 CopyToBgTilemapBufferRect(1, sControlsGuide_Tilemap_Page3, 1, 3, 5, 16); CopyBgTilemapBufferToVram(1); } BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 16, 0, GetTextWindowPalette(2)[15]); gTasks[taskId].func = Task_ControlsGuide_HandleInput; } static void Task_ControlsGuide_HandleInput(u8 taskId) { if (!gPaletteFade.active) { if(JOY_NEW((A_BUTTON | B_BUTTON))) { if (JOY_NEW(A_BUTTON)) { gTasks[taskId].tDelta = 1; if (sOakSpeechResources->currentPage < CONTROLS_GUIDE_PAGE_3) BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); } else // B_BUTTON { if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_1) return; gTasks[taskId].tDelta = -1; BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); } PlaySE(SE_SELECT); gTasks[taskId].func = Task_ControlsGuide_ChangePage; } } } static void Task_ControlsGuide_ChangePage(u8 taskId) { u8 numWindows = 0; u32 i; if (!gPaletteFade.active) { switch (sOakSpeechResources->currentPage) { case CONTROLS_GUIDE_PAGE_1: numWindows = NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS; break; case CONTROLS_GUIDE_PAGE_2: case CONTROLS_GUIDE_PAGE_3: numWindows = NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; break; } sOakSpeechResources->currentPage += gTasks[taskId].tDelta; if (sOakSpeechResources->currentPage < NUM_CONTROLS_GUIDE_PAGES) { for (i = 0; i < numWindows; i++) { FillWindowPixelBuffer(sOakSpeechResources->windowIds[i], PIXEL_FILL(0)); ClearWindowTilemap(sOakSpeechResources->windowIds[i]); CopyWindowToVram(sOakSpeechResources->windowIds[i], COPYWIN_FULL); RemoveWindow(sOakSpeechResources->windowIds[i]); sOakSpeechResources->windowIds[i] = 0; } gTasks[taskId].func = Task_ControlsGuide_LoadPage; } else { BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, 0); gTasks[taskId].func = Task_ControlsGuide_Clear; } } } #undef tDelta static void Task_ControlsGuide_Clear(u8 taskId) { u8 i = 0; if (!gPaletteFade.active) { for (i = 0; i < NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; i++) { FillWindowPixelBuffer(sOakSpeechResources->windowIds[i], PIXEL_FILL(0)); ClearWindowTilemap(sOakSpeechResources->windowIds[i]); CopyWindowToVram(sOakSpeechResources->windowIds[i], COPYWIN_FULL); RemoveWindow(sOakSpeechResources->windowIds[i]); sOakSpeechResources->windowIds[i] = 0; } FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 30, 18); CopyBgTilemapBufferToVram(1); DestroyTextCursorSprite(gTasks[taskId].tTextCursorSpriteId); sOakSpeechResources->windowIds[0] = RGB_BLACK; LoadPalette(sOakSpeechResources->windowIds, BG_PLTT_ID(0), PLTT_SIZEOF(1)); gTasks[taskId].tTimer = 32; gTasks[taskId].func = Task_PikachuIntro_LoadPage1; } } enum { PIKACHU_INTRO_SET_GPU_REGS, PIKACHU_INTRO_HANDLE_INPUT, PIKACHU_INTRO_PRINT_PAGE_TEXT, PIKACHU_INTRO_FADE_IN_PAGE, PIKACHU_INTRO_EXIT, }; #define tBlendTarget data[15] static void Task_PikachuIntro_LoadPage1(u8 taskId) { s16 *data = gTasks[taskId].data; u32 size = 0; if (tTimer != 0) { tTimer--; } else { PlayBGM(MUS_NEW_GAME_INTRO); ClearTopBarWindow(); TopBarWindowPrintString(gText_ABUTTONNext, 0, 1); sOakSpeechResources->pikachuIntroTilemap = MallocAndDecompress(sPikachuIntro_Background_Tilemap, &size); CopyToBgTilemapBufferRect(1, sOakSpeechResources->pikachuIntroTilemap, 0, 2, 30, 19); CopyBgTilemapBufferToVram(1); Free(sOakSpeechResources->pikachuIntroTilemap); sOakSpeechResources->pikachuIntroTilemap = NULL; tTextboxWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_TEXTBOX]); PutWindowTilemap(tTextboxWindowId); FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0)); CopyWindowToVram(tTextboxWindowId, COPYWIN_FULL); sOakSpeechResources->currentPage = PIKACHU_INTRO_PAGE_1; gMain.state = PIKACHU_INTRO_SET_GPU_REGS; tBlendTarget = 16; AddTextPrinterParameterized4(tTextboxWindowId, FONT_NORMAL, 3, 5, 1, 0, sTextColor_DarkGray, 0, sPikachuIntro_Strings[PIKACHU_INTRO_PAGE_1]); tTextCursorSpriteId = CreateTextCursorSprite(0, 226, 145, 0, 0); gSprites[tTextCursorSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; gSprites[tTextCursorSpriteId].oam.priority = 0; CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PIKACHU); BeginNormalPaletteFade(PALETTES_ALL, 2, 16, 0, 0); gTasks[taskId].func = Task_PikachuIntro_HandleInput; } } static void Task_PikachuIntro_HandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; switch (gMain.state) { case PIKACHU_INTRO_SET_GPU_REGS: if (!gPaletteFade.active) { SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(16, DISPLAY_HEIGHT)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); gMain.state = PIKACHU_INTRO_HANDLE_INPUT; } break; case PIKACHU_INTRO_HANDLE_INPUT: if (JOY_NEW((A_BUTTON | B_BUTTON))) { if (JOY_NEW(A_BUTTON)) { sOakSpeechResources->currentPage++; } else // B_BUTTON { if (sOakSpeechResources->currentPage != PIKACHU_INTRO_PAGE_1) sOakSpeechResources->currentPage--; else break; } PlaySE(SE_SELECT); if (sOakSpeechResources->currentPage == NUM_PIKACHU_INTRO_PAGES) { gMain.state = PIKACHU_INTRO_EXIT; } else { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1); SetGpuReg(REG_OFFSET_BLDALPHA, (16 - tBlendTarget) | tBlendTarget); gMain.state++; } } break; case PIKACHU_INTRO_PRINT_PAGE_TEXT: tBlendTarget -= 2; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(tBlendTarget, 16 - tBlendTarget)); if (tBlendTarget <= 0) { FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0)); AddTextPrinterParameterized4(tTextboxWindowId, FONT_NORMAL, 3, 5, 1, 0, sTextColor_DarkGray, 0, sPikachuIntro_Strings[sOakSpeechResources->currentPage]); if (sOakSpeechResources->currentPage == PIKACHU_INTRO_PAGE_1) { ClearTopBarWindow(); TopBarWindowPrintString(gText_ABUTTONNext, 0, 1); } else { ClearTopBarWindow(); TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, 1); } gMain.state++; } break; case PIKACHU_INTRO_FADE_IN_PAGE: tBlendTarget += 2; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(tBlendTarget, 16 - tBlendTarget)); if (tBlendTarget >= 16) { tBlendTarget = 16; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); gMain.state = PIKACHU_INTRO_HANDLE_INPUT; } break; case PIKACHU_INTRO_EXIT: DestroyTextCursorSprite(gTasks[taskId].tTextCursorSpriteId); PlayBGM(MUS_NEW_GAME_EXIT); tBlendTarget = 24; gMain.state++; break; default: if (tBlendTarget != 0) { tBlendTarget--; } else { gMain.state = 0; sOakSpeechResources->currentPage = 0; SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_PikachuIntro_Clear; } break; } } #undef tBlendTarget static void Task_PikachuIntro_Clear(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { DestroyTopBarWindow(); FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0)); ClearWindowTilemap(tTextboxWindowId); CopyWindowToVram(tTextboxWindowId, COPYWIN_FULL); RemoveWindow(tTextboxWindowId); tTextboxWindowId = 0; FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PIKACHU); tTimer = 80; gTasks[taskId].func = Task_OakSpeech_Init; } } static void Task_OakSpeech_Init(u8 taskId) { s16 *data = gTasks[taskId].data; u32 size = 0; if (tTimer != 0) { tTimer--; } else { sOakSpeechResources->oakSpeechBackgroundTiles = MallocAndDecompress(sOakSpeech_Background_Tiles, &size); LoadBgTiles(1, sOakSpeechResources->oakSpeechBackgroundTiles, size, 0); CopyToBgTilemapBuffer(1, sOakSpeech_Background_Tilemap, 0, 0); CopyBgTilemapBufferToVram(1); CreateNidoranFSprite(taskId); LoadTrainerPic(OAK_PIC, 0); CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); PlayBGM(MUS_ROUTE24); BeginNormalPaletteFade(PALETTES_ALL, 5, 16, 0, RGB_BLACK); tTimer = 80; ShowBg(2); gTasks[taskId].func = Task_OakSpeech_WelcomeToTheWorld; } } #define OakSpeechPrintMessage(str, speed) ({ \ DrawDialogueFrame(WIN_INTRO_TEXTBOX, FALSE); \ if (str != gStringVar4) \ { \ StringExpandPlaceholders(gStringVar4, str); \ AddTextPrinterParameterized2(WIN_INTRO_TEXTBOX, FONT_MALE, gStringVar4, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \ } \ else \ { \ AddTextPrinterParameterized2(WIN_INTRO_TEXTBOX, FONT_MALE, str, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \ } \ CopyWindowToVram(WIN_INTRO_TEXTBOX, COPYWIN_FULL); \ }) static void Task_OakSpeech_WelcomeToTheWorld(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { if (tTimer != 0) { tTimer--; } else { OakSpeechPrintMessage(gOakSpeech_Text_WelcomeToTheWorld, sOakSpeechResources->textSpeed); gTasks[taskId].func = Task_OakSpeech_ThisWorld; } } } static void Task_OakSpeech_ThisWorld(u8 taskId) { if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { OakSpeechPrintMessage(gOakSpeech_Text_ThisWorld, sOakSpeechResources->textSpeed); gTasks[taskId].tTimer = 30; gTasks[taskId].func = Task_OakSpeech_ReleaseNidoranFFromPokeBall; } } static void Task_OakSpeech_ReleaseNidoranFFromPokeBall(u8 taskId) { s16 *data = gTasks[taskId].data; u8 spriteId; if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { if (tTimer != 0) tTimer--; spriteId = gTasks[taskId].tNidoranFSpriteId; gSprites[spriteId].invisible = FALSE; gSprites[spriteId].tSpriteTimer = 0; CreatePokeballSpriteToReleaseMon(spriteId, gSprites[spriteId].oam.paletteNum, 100, 66, 0, 0, 32, 0xFFFF1FFF); gTasks[taskId].func = Task_OakSpeech_IsInhabitedFarAndWide; gTasks[taskId].tTimer = 0; } } static void Task_OakSpeech_IsInhabitedFarAndWide(u8 taskId) { if (IsCryFinished()) { if (gTasks[taskId].tTimer >= 96) gTasks[taskId].func = Task_OakSpeech_IStudyPokemon; } if (gTasks[taskId].tTimer < 0x4000) { gTasks[taskId].tTimer++; if (gTasks[taskId].tTimer == 32) { OakSpeechPrintMessage(gOakSpeech_Text_IsInhabitedFarAndWide, sOakSpeechResources->textSpeed); PlayCry_Normal(INTRO_SPECIES, 0); } } } static void Task_OakSpeech_IStudyPokemon(u8 taskId) { if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { OakSpeechPrintMessage(gOakSpeech_Text_IStudyPokemon, sOakSpeechResources->textSpeed); gTasks[taskId].func = Task_OakSpeech_ReturnNidoranFToPokeBall; } } static void Task_OakSpeech_ReturnNidoranFToPokeBall(u8 taskId) { u8 spriteId; if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE); spriteId = gTasks[taskId].tNidoranFSpriteId; gTasks[taskId].tPokeBallSpriteId = CreateTradePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 100, 66, 0, 0, 32, 0xFFFF1F3F); gTasks[taskId].tTimer = 48; gTasks[taskId].tSpriteTimer = 64; gTasks[taskId].func = Task_OakSpeech_TellMeALittleAboutYourself; } } static void Task_OakSpeech_TellMeALittleAboutYourself(u8 taskId) { s16 *data = gTasks[taskId].data; if (tSpriteTimer != 0) { if (tSpriteTimer < 24) gSprites[tNidoranFSpriteId].y--; tSpriteTimer--; } else { if (tTimer == 48) { DestroySprite(&gSprites[tNidoranFSpriteId]); DestroySprite(&gSprites[tPokeBallSpriteId]); } if (tTimer != 0) { tTimer--; } else { OakSpeechPrintMessage(gOakSpeech_Text_TellMeALittleAboutYourself, sOakSpeechResources->textSpeed); gTasks[taskId].func = Task_OakSpeech_FadeOutOak; } } } static void Task_OakSpeech_FadeOutOak(u8 taskId) { s16 *data = gTasks[taskId].data; if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, 1); CreateFadeInTask(taskId, 2); tTimer = 48; gTasks[taskId].func = Task_OakSpeech_AskPlayerGender; } } static void Task_OakSpeech_AskPlayerGender(u8 taskId) { s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { if (tTimer != 0) { tTimer--; } else { tTrainerPicPosX = -60; ClearTrainerPic(); OakSpeechPrintMessage(gOakSpeech_Text_AskPlayerGender, sOakSpeechResources->textSpeed); gTasks[taskId].func = Task_OakSpeech_ShowGenderOptions; } } } static void Task_OakSpeech_ShowGenderOptions(u8 taskId) { if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { gTasks[taskId].tMenuWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_BOYGIRL]); PutWindowTilemap(gTasks[taskId].tMenuWindowId); DrawStdFrameWithCustomTileAndPalette(gTasks[taskId].tMenuWindowId, TRUE, GetStdWindowBaseTileNum(), 14); FillWindowPixelBuffer(gTasks[taskId].tMenuWindowId, PIXEL_FILL(1)); sOakSpeechResources->textColor[0] = 1; sOakSpeechResources->textColor[1] = 2; sOakSpeechResources->textColor[2] = 3; AddTextPrinterParameterized3(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 8, 1, sOakSpeechResources->textColor, 0, gText_Boy); sOakSpeechResources->textColor[0] = 1; sOakSpeechResources->textColor[1] = 2; sOakSpeechResources->textColor[2] = 3; AddTextPrinterParameterized3(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 8, 17, sOakSpeechResources->textColor, 0, gText_Girl); Menu_InitCursor(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 0, 1, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 2, 0); CopyWindowToVram(gTasks[taskId].tMenuWindowId, COPYWIN_FULL); gTasks[taskId].func = Task_OakSpeech_HandleGenderInput; } } static void Task_OakSpeech_HandleGenderInput(u8 taskId) { s8 input = Menu_ProcessInputNoWrapAround(); switch (input) { case 0: // BOY gSaveBlock2Ptr->playerGender = MALE; break; case 1: // GIRL gSaveBlock2Ptr->playerGender = FEMALE; break; case MENU_B_PRESSED: case MENU_NOTHING_CHOSEN: return; } gTasks[taskId].func = Task_OakSpeech_ClearGenderWindows; } static void Task_OakSpeech_ClearGenderWindows(u8 taskId) { s16 *data = gTasks[taskId].data; ClearStdWindowAndFrameToTransparent(tMenuWindowId, TRUE); RemoveWindow(tMenuWindowId); tMenuWindowId = WIN_INTRO_TEXTBOX; ClearDialogWindowAndFrame(tMenuWindowId, TRUE); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); gTasks[taskId].func = Task_OakSpeech_LoadPlayerPic; } static void Task_OakSpeech_LoadPlayerPic(u8 taskId) { if (gSaveBlock2Ptr->playerGender == MALE) LoadTrainerPic(MALE_PLAYER_PIC, 0); else LoadTrainerPic(FEMALE_PLAYER_PIC, 0); CreateFadeOutTask(taskId, 2); gTasks[taskId].tTimer = 32; gTasks[taskId].func = Task_OakSpeech_YourNameWhatIsIt; } static void Task_OakSpeech_YourNameWhatIsIt(u8 taskId) { s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { if (tTimer != 0) { tTimer--; } else { tTrainerPicPosX = 0; OakSpeechPrintMessage(gOakSpeech_Text_YourNameWhatIsIt, sOakSpeechResources->textSpeed); gTasks[taskId].func = Task_OakSpeech_FadeOutForPlayerNamingScreen; } } } static void Task_OakSpeech_FadeOutForPlayerNamingScreen(u8 taskId) { if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sOakSpeechResources->hasPlayerBeenNamed = FALSE; gTasks[taskId].func = Task_OakSpeech_DoNamingScreen; } } static void Task_OakSpeech_MoveRivalDisplayNameOptions(u8 taskId) { s16 *data = gTasks[taskId].data; if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { if (tTrainerPicPosX > -60) { tTrainerPicPosX -= 2; gSpriteCoordOffsetX += 2; ChangeBgX(2, 0x200, BG_COORD_SUB); } else { tTrainerPicPosX = -60; PrintNameChoiceOptions(taskId, sOakSpeechResources->hasPlayerBeenNamed); gTasks[taskId].func = Task_OakSpeech_HandleRivalNameInput; } } } static void Task_OakSpeech_RepeatNameQuestion(u8 taskId) { PrintNameChoiceOptions(taskId, sOakSpeechResources->hasPlayerBeenNamed); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) OakSpeechPrintMessage(gOakSpeech_Text_YourNameWhatIsIt, 0); else OakSpeechPrintMessage(gOakSpeech_Text_YourRivalsNameWhatWasIt, 0); gTasks[taskId].func = Task_OakSpeech_HandleRivalNameInput; } #define tNameNotConfirmed data[15] static void Task_OakSpeech_HandleRivalNameInput(u8 taskId) { s16 *data = gTasks[taskId].data; s8 input = Menu_ProcessInput(); switch (input) { case 0: // NEW NAME PlaySE(SE_SELECT); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_OakSpeech_DoNamingScreen; break; case 1: // Default name options case 2: // case 3: // case 4: // PlaySE(SE_SELECT); ClearStdWindowAndFrameToTransparent(tMenuWindowId, TRUE); RemoveWindow(tMenuWindowId); GetDefaultName(sOakSpeechResources->hasPlayerBeenNamed, input - 1); tNameNotConfirmed = TRUE; gTasks[taskId].func = Task_OakSpeech_ConfirmName; break; case MENU_B_PRESSED: break; } } static void Task_OakSpeech_DoNamingScreen(u8 taskId) { if (!gPaletteFade.active) { GetDefaultName(sOakSpeechResources->hasPlayerBeenNamed, 0); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) { DoNamingScreen(NAMING_SCREEN_PLAYER, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnFromNamingScreen); } else { ClearStdWindowAndFrameToTransparent(gTasks[taskId].tMenuWindowId, TRUE); RemoveWindow(gTasks[taskId].tMenuWindowId); DoNamingScreen(NAMING_SCREEN_RIVAL, gSaveBlock1Ptr->rivalName, 0, 0, 0, CB2_ReturnFromNamingScreen); } DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); FreeAllWindowBuffers(); } } static void Task_OakSpeech_ConfirmName(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { if (tNameNotConfirmed == TRUE) { if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_SoYourNameIsPlayer); else StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_ConfirmRivalName); OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); tNameNotConfirmed = FALSE; tTimer = 25; } else if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { if (tTimer != 0) { tTimer--; } else { CreateYesNoMenu(&sIntro_WindowTemplates[WIN_INTRO_YESNO], FONT_NORMAL, 0, 2, GetStdWindowBaseTileNum(), 14, 0); gTasks[taskId].func = Task_OakSpeech_HandleConfirmNameInput; } } } } static void Task_OakSpeech_HandleConfirmNameInput(u8 taskId) { s8 input = Menu_ProcessInputNoWrapClearOnChoose(); switch (input) { case 0: // YES PlaySE(SE_SELECT); gTasks[taskId].tTimer = 40; if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) { ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE); CreateFadeInTask(taskId, 2); gTasks[taskId].func = Task_OakSpeech_FadeOutPlayerPic; } else { StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_RememberRivalsName); OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); gTasks[taskId].func = Task_OakSpeech_FadeOutRivalPic; } break; case 1: // NO case MENU_B_PRESSED: PlaySE(SE_SELECT); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) gTasks[taskId].func = Task_OakSpeech_FadeOutForPlayerNamingScreen; else gTasks[taskId].func = Task_OakSpeech_RepeatNameQuestion; break; } } static void Task_OakSpeech_FadeOutPlayerPic(u8 taskId) { s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { ClearTrainerPic(); if (tTimer != 0) tTimer--; else gTasks[taskId].func = Task_OakSpeech_FadeInRivalPic; } } static void Task_OakSpeech_FadeOutRivalPic(u8 taskId) { if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE); CreateFadeInTask(taskId, 2); gTasks[taskId].func = Task_OakSpeech_ReshowPlayersPic; } } static void Task_OakSpeech_FadeInRivalPic(u8 taskId) { ChangeBgX(2, 0, BG_COORD_SET); gTasks[taskId].tTrainerPicPosX = 0; gSpriteCoordOffsetX = 0; LoadTrainerPic(RIVAL_PIC, 0); CreateFadeOutTask(taskId, 2); gTasks[taskId].func = Task_OakSpeech_AskRivalsName; } static void Task_OakSpeech_AskRivalsName(u8 taskId) { s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { OakSpeechPrintMessage(gOakSpeech_Text_WhatWasHisName, sOakSpeechResources->textSpeed); sOakSpeechResources->hasPlayerBeenNamed = TRUE; gTasks[taskId].func = Task_OakSpeech_MoveRivalDisplayNameOptions; } } static void Task_OakSpeech_ReshowPlayersPic(u8 taskId) { s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { ClearTrainerPic(); if (tTimer != 0) { tTimer--; } else { if (gSaveBlock2Ptr->playerGender == MALE) LoadTrainerPic(MALE_PLAYER_PIC, 0); else LoadTrainerPic(FEMALE_PLAYER_PIC, 0); gTasks[taskId].tTrainerPicPosX = 0; gSpriteCoordOffsetX = 0; ChangeBgX(2, 0, BG_COORD_SET); CreateFadeOutTask(taskId, 2); gTasks[taskId].func = Task_OakSpeech_LetsGo; } } } static void Task_OakSpeech_LetsGo(u8 taskId) { if (gTasks[taskId].tTrainerPicFadeState != 0) { StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_LetsGo); OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); gTasks[taskId].tTimer = 30; gTasks[taskId].func = Task_OakSpeech_FadeOutBGM; } } static void Task_OakSpeech_FadeOutBGM(u8 taskId) { if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { if (gTasks[taskId].tTimer != 0) { gTasks[taskId].tTimer--; } else { FadeOutBGM(4); gTasks[taskId].func = Task_OakSpeech_SetUpExitAnimation; } } } // The sOakSpeechResources struct's currentPage field is reused below as a timer for shrinking the player pic #define shrinkTimer currentPage static void Task_OakSpeech_SetUpExitAnimation(u8 taskId) { sOakSpeechResources->shrinkTimer = 0; Task_OakSpeech_SetUpDestroyPlatformSprites(taskId); Task_OakSpeech_SetUpFadePlayerPicWhite(taskId); Task_OakSpeech_SetUpShrinkPlayerPic(taskId); } #define tPlayerPicFadeOutTimer data[0] #define tScaleDelta data[2] #define tPlayerIsShrunk data[15] static void Task_OakSpeech_SetUpShrinkPlayerPic(u8 taskId) { s16 *data = gTasks[taskId].data; SetBgAttribute(2, BG_ATTR_WRAPAROUND, 1); tPlayerPicFadeOutTimer = 0; data[1] = 0; // assigned, but never read tScaleDelta = 256; tPlayerIsShrunk = FALSE; gTasks[taskId].func = Task_OakSpeech_ShrinkPlayerPic; } static void Task_OakSpeech_ShrinkPlayerPic(u8 taskId) { s16 *data = gTasks[taskId].data; s16 x, y; u16 oldScaleDelta; sOakSpeechResources->shrinkTimer++; if (sOakSpeechResources->shrinkTimer % 20 == 0) { if (sOakSpeechResources->shrinkTimer == 40) PlaySE(SE_WARP_IN); oldScaleDelta = tScaleDelta; tScaleDelta -= 32; x = Q_8_8_inv(oldScaleDelta - 8); y = Q_8_8_inv(tScaleDelta - 16); SetBgAffine(2, 0x7800, 0x5400, 120, 84, x, y, 0); if (tScaleDelta <= 96) { tPlayerIsShrunk = TRUE; tPlayerPicFadeOutTimer = 36; gTasks[taskId].func = Task_OakSpeech_FadePlayerPicToBlack; } } } #define tBGFadeStarted data[1] static void Task_OakSpeech_SetUpDestroyPlatformSprites(u8 taskId) { u8 taskId2 = CreateTask(Task_OakSpeech_DestroyPlatformSprites, 1); s16 *data = gTasks[taskId2].data; data[0] = 0; // assigned, but never read tBGFadeStarted = 0; data[2] = 0; // assigned, but never read data[15] = 0; // assigned, but never read BeginNormalPaletteFade(PALETTES_OBJECTS | 0x0FCF, 4, 0, 16, RGB_BLACK); } static void Task_OakSpeech_DestroyPlatformSprites(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { if (tBGFadeStarted != 0) { DestroyTask(taskId); // As this function's taskId is in fact taskId2 above, in // Task_OakSpeech_SetUpDestroyPlatformSprites, the platform sprite // IDs have not been assigned to this task's data[7], data[8] and // data[9]. // As a result, the function below will only delete the sprite with // ID 0. // This can be verified by looking at the sprite viewer in an // emulator at the end of the Oak speech. DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); } else { tBGFadeStarted++; BeginNormalPaletteFade(0x0000 | 0xF000, 0, 0, 16, RGB_BLACK); } } } #undef tBGFadeStarted #define tPlayerPicFadeWhiteTimer data[0] #define tUnderflowingTimer data[1] #define tSecondaryTimer data[2] #define tBlendCoefficient data[14] static void Task_OakSpeech_SetUpFadePlayerPicWhite(u8 taskId) { u8 taskId2 = CreateTask(Task_OakSpeech_FadePlayerPicWhite, 2); s16 *data = gTasks[taskId2].data; tPlayerPicFadeWhiteTimer = 8; tUnderflowingTimer = 0; tSecondaryTimer = 8; tBlendCoefficient = 0; data[15] = 0; // assigned, but never read } static void Task_OakSpeech_FadePlayerPicWhite(u8 taskId) { s16 *data = gTasks[taskId].data; u32 i; if (tPlayerPicFadeWhiteTimer != 0) { tPlayerPicFadeWhiteTimer--; } else { if (tUnderflowingTimer <= 0 && tSecondaryTimer != 0) tSecondaryTimer--; BlendPalette(BG_PLTT_ID(4), 0x20, tBlendCoefficient, RGB_WHITE); tBlendCoefficient++; tUnderflowingTimer--; tPlayerPicFadeWhiteTimer = tSecondaryTimer; if (tBlendCoefficient > 14) { for (i = 0; i < 32; i++) { gPlttBufferFaded[i + BG_PLTT_ID(4)] = RGB_WHITE; gPlttBufferUnfaded[i + BG_PLTT_ID(4)] = RGB_WHITE; } DestroyTask(taskId); } } } static void Task_OakSpeech_FadePlayerPicToBlack(u8 taskId) { if (gTasks[taskId].tPlayerPicFadeOutTimer != 0) { gTasks[taskId].tPlayerPicFadeOutTimer--; } else { BeginNormalPaletteFade(0x0000 | 0x0030, 2, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_OakSpeech_WaitForFade; } } static void Task_OakSpeech_WaitForFade(u8 taskId) { if (!gPaletteFade.active) gTasks[taskId].func = Task_OakSpeech_FreeResources; } static void Task_OakSpeech_FreeResources(u8 taskId) { FreeAllWindowBuffers(); DestroyMonSpritesGfxManager(); Free(sOakSpeechResources); sOakSpeechResources = NULL; gTextFlags.canABSpeedUpPrint = FALSE; SetMainCallback2(CB2_NewGame); DestroyTask(taskId); } static void CB2_ReturnFromNamingScreen(void) { u8 taskId; switch (gMain.state) { case 0: SetVBlankCallback(NULL); DmaFill16(3, 0, VRAM, VRAM_SIZE); DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, RGB_BLACK, PLTT + sizeof(u16), PLTT_SIZE - sizeof(u16)); ResetPaletteFade(); ScanlineEffect_Stop(); ResetSpriteData(); FreeAllSpritePalettes(); ResetTempTileDataBuffers(); break; case 1: ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, sOakSpeechResources->bg1TilemapBuffer); SetBgTilemapBuffer(2, sOakSpeechResources->bg2TilemapBuffer); ChangeBgX(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); ChangeBgX(2, 0, BG_COORD_SET); ChangeBgY(2, 0, BG_COORD_SET); break; case 2: SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); break; case 3: FreeAllWindowBuffers(); InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); // Below is reading 48 colors beyond the background palette (into the tiles that follow it). // This color range is used by the player and rival pic, which will overwrite them with the correct colors. #ifdef BUGFIX LoadPalette(sOakSpeech_Background_Pals, BG_PLTT_ID(0), sizeof(sOakSpeech_Background_Pals)); #else LoadPalette(sOakSpeech_Background_Pals, BG_PLTT_ID(0), sizeof(sOakSpeech_Background_Pals) + PLTT_SIZEOF(48)); #endif break; case 4: DecompressAndCopyTileDataToVram(1, sOakSpeech_Background_Tiles, 0, 0, 0); break; case 5: if (FreeTempTileDataBuffersIfPossible()) return; FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); CopyToBgTilemapBuffer(1, sOakSpeech_Background_Tilemap, 0, 0); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); break; case 6: taskId = CreateTask(Task_OakSpeech_ConfirmName, 0); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) { if (gSaveBlock2Ptr->playerGender == MALE) LoadTrainerPic(MALE_PLAYER_PIC, 0); else LoadTrainerPic(FEMALE_PLAYER_PIC, 0); } else { LoadTrainerPic(RIVAL_PIC, 0); } gTasks[taskId].tTrainerPicPosX = -60; gSpriteCoordOffsetX += 60; ChangeBgX(2, 0xFFFFC400, BG_COORD_SET); CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); gTasks[taskId].tNameNotConfirmed = TRUE; break; case 7: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); ShowBg(1); ShowBg(2); EnableInterrupts(INTR_FLAG_VBLANK); SetVBlankCallback(VBlankCB_NewGameScene); gTextFlags.canABSpeedUpPrint = TRUE; SetMainCallback2(CB2_NewGameScene); return; } gMain.state++; } static void CreateNidoranFSprite(u8 taskId) { u8 spriteId; DecompressPicFromTable(&gMonFrontPicTable[INTRO_SPECIES], MonSpritesGfxManager_GetSpritePtr(0), INTRO_SPECIES); LoadCompressedSpritePaletteUsingHeap(&gMonPaletteTable[INTRO_SPECIES]); SetMultiuseSpriteTemplateToPokemon(INTRO_SPECIES, 0); spriteId = CreateSprite(&gMultiuseSpriteTemplate, 96, 96, 1); gSprites[spriteId].callback = SpriteCallbackDummy; gSprites[spriteId].oam.priority = 1; gSprites[spriteId].invisible = TRUE; gTasks[taskId].tNidoranFSpriteId = spriteId; } #define sBodySpriteId data[0] static void SpriteCB_Pikachu(struct Sprite *sprite) { sprite->y2 = gSprites[sprite->sBodySpriteId].animCmdIndex; } static void CreatePikachuOrPlatformSprites(u8 taskId, u8 spriteType) { u8 spriteId; u8 i = 0; switch (spriteType) { case SPRITE_TYPE_PIKACHU: LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_BODY_PLATFORM_LEFT]); LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_EARS_PLATFORM_MIDDLE]); LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_EYES_PLATFORM_RIGHT]); LoadSpritePalette(&sPikachuIntro_Pikachu_SpritePalette); spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_BODY_PLATFORM_LEFT], 16, 17, 2); gSprites[spriteId].oam.priority = 0; gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT) = spriteId; spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_EARS_PLATFORM_MIDDLE], 16, 9, 3); gSprites[spriteId].oam.priority = 0; gSprites[spriteId].sBodySpriteId = gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT); gSprites[spriteId].callback = SpriteCB_Pikachu; gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_EARS_PLATFORM_MIDDLE) = spriteId; spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_EYES_PLATFORM_RIGHT], 24, 13, 1); gSprites[spriteId].oam.priority = 0; gSprites[spriteId].sBodySpriteId = gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT); gSprites[spriteId].callback = SpriteCB_Pikachu; gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_EYES_PLATFORM_RIGHT) = spriteId; break; case SPRITE_TYPE_PLATFORM: LoadCompressedSpriteSheet(&sOakSpeech_Platform_SpriteSheet); LoadSpritePalette(&sOakSpeech_Platform_SpritePalette); for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) { spriteId = CreateSprite(&sOakSpeech_Platform_SpriteTemplates[i], i * 32 + 88, 112, 1); gSprites[spriteId].oam.priority = 2; gSprites[spriteId].animPaused = TRUE; gSprites[spriteId].coordOffsetEnabled = TRUE; gTasks[taskId].tPikachuPlatformSpriteId(i) = spriteId; } break; } } static void DestroyPikachuOrPlatformSprites(u8 taskId, u8 spriteType) { u32 i; for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) DestroySprite(&gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)]); switch (spriteType) { case SPRITE_TYPE_PIKACHU: FreeSpriteTilesByTag(GFX_TAG_PIKACHU_EYES); FreeSpriteTilesByTag(GFX_TAG_PIKACHU_EARS); FreeSpriteTilesByTag(GFX_TAG_PIKACHU); FreeSpritePaletteByTag(PAL_TAG_PIKACHU); break; case SPRITE_TYPE_PLATFORM: FreeSpriteTilesByTag(GFX_TAG_PLATFORM); FreeSpritePaletteByTag(PAL_TAG_PLATFORM); break; } } static void LoadTrainerPic(u16 whichPic, u16 tileOffset) { u32 i; switch (whichPic) { case MALE_PLAYER_PIC: LoadPalette(sOakSpeech_Red_Pal, BG_PLTT_ID(4), sizeof(sOakSpeech_Red_Pal)); LZ77UnCompVram(sOakSpeech_Red_Tiles, (void *)VRAM + 0x600 + tileOffset); break; case FEMALE_PLAYER_PIC: LoadPalette(sOakSpeech_Leaf_Pal, BG_PLTT_ID(4), sizeof(sOakSpeech_Leaf_Pal)); LZ77UnCompVram(sOakSpeech_Leaf_Tiles, (void *)VRAM + 0x600 + tileOffset); break; case RIVAL_PIC: LoadPalette(sOakSpeech_Rival_Pal, BG_PLTT_ID(6), sizeof(sOakSpeech_Rival_Pal)); LZ77UnCompVram(sOakSpeech_Rival_Tiles, (void *)VRAM + 0x600 + tileOffset); break; case OAK_PIC: LoadPalette(sOakSpeech_Oak_Pal, BG_PLTT_ID(6), sizeof(sOakSpeech_Oak_Pal)); LZ77UnCompVram(sOakSpeech_Oak_Tiles, (void *)VRAM + 0x600 + tileOffset); break; default: return; } sOakSpeechResources->trainerPicTilemap = AllocZeroed(0x60); for (i = 0; i < 0x60; i++) ((u8 *)sOakSpeechResources->trainerPicTilemap)[i] = i; FillBgTilemapBufferRect(2, 0, 0, 0, 32, 32, 16); CopyRectToBgTilemapBufferRect(2, sOakSpeechResources->trainerPicTilemap, 0, 0, 8, 12, 11, 2, 8, 12, 16, (tileOffset / 64) + 24, 0); CopyBgTilemapBufferToVram(2); Free(sOakSpeechResources->trainerPicTilemap); sOakSpeechResources->trainerPicTilemap = 0; } static void ClearTrainerPic(void) { FillBgTilemapBufferRect(2, 0, 11, 1, 8, 12, 16); CopyBgTilemapBufferToVram(2); } #define tParentTaskId data[0] #define tBlendTarget1 data[1] #define tBlendTarget2 data[2] #define tUnusedState data[3] #define tFadeTimer data[4] static void Task_SlowFadeIn(u8 taskId) { u8 i = 0; if (gTasks[taskId].tBlendTarget1 == 0) { gTasks[gTasks[taskId].tParentTaskId].tTrainerPicFadeState = 1; DestroyTask(taskId); for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible = TRUE; } else { if (gTasks[taskId].tFadeTimer != 0) { gTasks[taskId].tFadeTimer--; } else { gTasks[taskId].tFadeTimer = gTasks[taskId].tTimer; gTasks[taskId].tBlendTarget1--; gTasks[taskId].tBlendTarget2++; if (gTasks[taskId].tBlendTarget1 == 8) { for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible ^= TRUE; } SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tBlendTarget2 * 256) + gTasks[taskId].tBlendTarget1); } } } static void CreateFadeInTask(u8 taskId, u8 delay) { u8 taskId2; u8 i = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); SetGpuReg(REG_OFFSET_BLDY, 0); gTasks[taskId].tTrainerPicFadeState = 0; taskId2 = CreateTask(Task_SlowFadeIn, 0); gTasks[taskId2].tParentTaskId = taskId; gTasks[taskId2].tBlendTarget1 = 16; gTasks[taskId2].tBlendTarget2 = 0; gTasks[taskId2].tUnusedState = delay; // assigned, but never read gTasks[taskId2].tFadeTimer = delay; for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) gTasks[taskId2].tPikachuPlatformSpriteId(i) = gTasks[taskId].tPikachuPlatformSpriteId(i); } static void Task_SlowFadeOut(u8 taskId) { u8 i = 0; if (gTasks[taskId].tBlendTarget1 == 16) { if (!gPaletteFade.active) { gTasks[gTasks[taskId].tParentTaskId].tTrainerPicFadeState = 1; DestroyTask(taskId); } } else { if (gTasks[taskId].tFadeTimer != 0) { gTasks[taskId].tFadeTimer--; } else { gTasks[taskId].tFadeTimer = gTasks[taskId].tTimer; gTasks[taskId].tBlendTarget1 += 2; gTasks[taskId].tBlendTarget2 -= 2; if (gTasks[taskId].tBlendTarget1 == 8) { for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible ^= TRUE; } SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tBlendTarget2 * 256) + gTasks[taskId].tBlendTarget1); } } } static void CreateFadeOutTask(u8 taskId, u8 delay) { u8 taskId2; u8 i = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetGpuReg(REG_OFFSET_BLDY, 0); gTasks[taskId].tTrainerPicFadeState = 0; taskId2 = CreateTask(Task_SlowFadeOut, 0); gTasks[taskId2].tParentTaskId = taskId; gTasks[taskId2].tBlendTarget1 = 0; gTasks[taskId2].tBlendTarget2 = 16; gTasks[taskId2].tUnusedState = delay; // assigned, but never read gTasks[taskId2].tFadeTimer = delay; for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) gTasks[taskId2].tPikachuPlatformSpriteId(i) = gTasks[taskId].tPikachuPlatformSpriteId(i); } static void PrintNameChoiceOptions(u8 taskId, u8 hasPlayerBeenNamed) { s16 *data = gTasks[taskId].data; const u8 *const *textPtrs; u32 i; tMenuWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_NAMES]); PutWindowTilemap(tMenuWindowId); DrawStdFrameWithCustomTileAndPalette(tMenuWindowId, 1, GetStdWindowBaseTileNum(), 14); FillWindowPixelBuffer(gTasks[taskId].tMenuWindowId, PIXEL_FILL(1)); AddTextPrinterParameterized(tMenuWindowId, FONT_NORMAL, gOtherText_NewName, 8, 1, 0, NULL); if (hasPlayerBeenNamed == FALSE) { if(gSaveBlock1Ptr->keyFlags.version == 0) textPtrs = gSaveBlock2Ptr->playerGender == MALE ? sMaleNameChoices_FR : sFemaleNameChoices_FR; else textPtrs = gSaveBlock2Ptr->playerGender == MALE ? sMaleNameChoices_LG : sFemaleNameChoices_LG; } else { if(gSaveBlock1Ptr->keyFlags.version == 0) textPtrs = sRivalNameChoices_FR; else textPtrs = sRivalNameChoices_LG; } for (i = 0; i < ARRAY_COUNT(sRivalNameChoices_FR); i++) AddTextPrinterParameterized(tMenuWindowId, FONT_NORMAL, textPtrs[i], 8, 16 * (i + 1) + 1, 0, NULL); Menu_InitCursor(tMenuWindowId, FONT_NORMAL, 0, 1, 16, 5, 0); CopyWindowToVram(tMenuWindowId, COPYWIN_FULL); } static void GetDefaultName(u8 hasPlayerBeenNamed, u8 rivalNameChoice) { const u8 *src; u8 *dest; u32 i; if (hasPlayerBeenNamed == FALSE) { if (gSaveBlock2Ptr->playerGender == MALE) { if(gSaveBlock1Ptr->keyFlags.version == 0) src = sMaleNameChoices_FR[Random() % ARRAY_COUNT(sMaleNameChoices_FR)]; else src = sMaleNameChoices_LG[Random() % ARRAY_COUNT(sMaleNameChoices_LG)]; } else { if(gSaveBlock1Ptr->keyFlags.version == 0) src = sFemaleNameChoices_FR[Random() % ARRAY_COUNT(sFemaleNameChoices_FR)]; else src = sFemaleNameChoices_LG[Random() % ARRAY_COUNT(sFemaleNameChoices_LG)]; } dest = gSaveBlock2Ptr->playerName; } else { if(gSaveBlock1Ptr->keyFlags.version == 0) src = sRivalNameChoices_FR[rivalNameChoice]; else src = sRivalNameChoices_LG[rivalNameChoice]; dest = gSaveBlock1Ptr->rivalName; } for (i = 0; i < PLAYER_NAME_LENGTH && src[i] != EOS; i++) dest[i] = src[i]; for (; i < PLAYER_NAME_LENGTH + 1; i++) dest[i] = EOS; } #undef tSpriteTimer #undef tTrainerPicPosX #undef tTrainerPicFadeState #undef tTimer #undef tNidoranFSpriteId #undef tTextCursorSpriteId #undef tPokeBallSpriteId #undef tMenuWindowId #undef tTextboxWindowId #undef tDelta #undef tPlayerPicFadeOutTimer #undef tScaleDelta #undef tPlayerIsShrunk #undef shrinkTimer #undef tPlayerPicFadeWhiteTimer #undef tUnderflowingTimer #undef tSecondaryTimer #undef tBlendCoefficient #undef tNameNotConfirmed #undef sBodySpriteId #undef tParentTaskId #undef tBlendTarget1 #undef tBlendTarget2 #undef tUnusedState #undef tFadeTimer ================================================ FILE: src/option_menu.c ================================================ #include "global.h" #include "gflib.h" #include "scanline_effect.h" #include "text_window_graphics.h" #include "menu.h" #include "task.h" #include "overworld.h" #include "help_system.h" #include "text_window.h" #include "strings.h" #include "event_data.h" #include "field_fadetransition.h" #include "gba/m4a_internal.h" // can't include the one in menu_helpers.h since Task_OptionMenu needs bool32 for matching bool32 IsActiveOverworldLinkBusy(void); // Menu items enum { MENUITEM_TEXTSPEED = 0, MENUITEM_BATTLESCENE, MENUITEM_BATTLESTYLE, MENUITEM_SOUND, MENUITEM_BUTTONMODE, MENUITEM_FRAMETYPE, MENUITEM_CANCEL, MENUITEM_COUNT }; enum { MENUITEM_BATTLETRANSITIONS = 0, MENUITEM_BATTLEINTROANIM, MENUITEM_MOVEANIMATIONS, MENUITEM_HPBARANIMSPEED, MENUITEM_EXPBARANIMSPEED, MENUITEM_BACK, MENUITEM_COUNT2 }; // Window Ids enum { WIN_TEXT_OPTION, WIN_OPTIONS }; // RAM symbols struct OptionMenu { /*0x00*/ u16 option[MENUITEM_COUNT]; /*0x0E*/ u8 cursorPos; u16 subOption[MENUITEM_COUNT2]; /*0x10*/ u8 loadState; /*0x11*/ u8 state; /*0x12*/ u8 loadPaletteState; bool8 inSubMenu; }; static EWRAM_DATA struct OptionMenu *sOptionMenuPtr = NULL; //Function Declarataions static void CB2_InitOptionMenu(void); static void VBlankCB_OptionMenu(void); static void OptionMenu_InitCallbacks(void); static void OptionMenu_SetVBlankCallback(void); static void CB2_OptionMenu(void); static void SetOptionMenuTask(void); static void InitOptionMenuBg(void); static void OptionMenu_PickSwitchCancel(void); static void OptionMenu_ResetSpriteData(void); static bool8 LoadOptionMenuPalette(void); static void Task_OptionMenu(u8 taskId); static u8 OptionMenu_ProcessInput(void); static void BufferOptionMenuString(u8 selection); static void CloseAndSaveOptionMenu(u8 taskId); static void PrintOptionMenuHeader(void); static void DrawOptionMenuBg(void); static void LoadOptionMenuItemNames(void); static void UpdateSettingSelectionDisplay(u16 selection); // Data Definitions static const struct WindowTemplate sOptionMenuWinTemplates[] = { { .bg = 1, .tilemapLeft = 2, .tilemapTop = 3, .width = 26, .height = 2, .paletteNum = 1, .baseBlock = 2 }, { .bg = 0, .tilemapLeft = 2, .tilemapTop = 7, .width = 26, .height = 12, .paletteNum = 1, .baseBlock = 0x36 }, { .bg = 2, .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 2, .paletteNum = 15, .baseBlock = 0x16e }, DUMMY_WIN_TEMPLATE }; static const struct BgTemplate sOptionMenuBgTemplates[] = { { .bg = 1, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0 }, { .bg = 0, .charBaseIndex = 1, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = 2, .charBaseIndex = 1, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0 }, }; static const u16 sOptionMenuPalette[] = INCBIN_U16("graphics/misc/option_menu.gbapal"); static const u16 sOptionMenuItemCounts[MENUITEM_COUNT] = {4, 1, 3, 2, 3, 11, 0}; static const u16 sOptionSubMenuItemCounts[MENUITEM_COUNT2] = {2, 2, 2, 4, 2, 0}; static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] = { [MENUITEM_TEXTSPEED] = gText_TextSpeed, [MENUITEM_BATTLESCENE] = gText_BattleScene, [MENUITEM_BATTLESTYLE] = gText_BattleStyle, [MENUITEM_SOUND] = gText_Sound, [MENUITEM_BUTTONMODE] = gText_ButtonMode, [MENUITEM_FRAMETYPE] = gText_Frame, [MENUITEM_CANCEL] = gText_OptionMenuSaveAndExit, }; static const u8 *const sOptionSubmenuItemsNames[MENUITEM_COUNT2] = { [MENUITEM_BATTLETRANSITIONS] = gText_BattleTransitions, [MENUITEM_BATTLEINTROANIM] = gText_BattleIntroAnimation, [MENUITEM_MOVEANIMATIONS] = gText_MoveAnims, [MENUITEM_HPBARANIMSPEED] = gText_HpBarAnimSpeed, [MENUITEM_EXPBARANIMSPEED] = gText_ExpBarAnimSpeed, [MENUITEM_BACK] = gText_Back, }; static const u8 *const sTextSpeedOptions[] = { gText_TextSpeedSlow, gText_TextSpeedMid, gText_TextSpeedFast, gText_TextSpeedInstant }; static const u8 *const sBattleSceneOptions[] = { gText_BattleScenePressA }; static const u8 *const sBattleStyleOptions[] = { gText_BattleStylePredict, gText_BattleStyleShift, gText_BattleStyleSet }; static const u8 *const sSoundOptions[] = { gText_SoundMono, gText_SoundStereo }; static const u8 *const sButtonTypeOptions[] = { gText_ButtonTypeHelp, gText_ButtonTypeLR, gText_ButtonTypeLEqualsA }; static const u8 *const sBattleTransitionOptions[] = { gText_BattleSceneOn, gText_BattleSceneOff }; static const u8 *const sBattleIntroAnimOptions[] = { gText_BattleSceneOn, gText_BattleSceneOff }; static const u8 *const sMoveAnimOptions[] = { gText_BattleSceneOn, gText_BattleSceneOff }; static const u8 *const sHpBarAnimSpeedOptions[] = { gText_IVCalcStandard, gText_TextSpeedFast, gText_TextSpeedFaster, gText_TextSpeedInstant }; static const u8 *const sExpBarAnimSpeedOptions[] = { gText_IVCalcStandard, gText_TextSpeedInstant }; static const u8 sOptionMenuPickSwitchCancelTextColor[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}; static const u8 sOptionMenuTextColor[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED}; // Functions static void CB2_InitOptionMenu(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCB_OptionMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void CB2_OptionsMenuFromStartMenu(void) { u32 i; if (gMain.savedCallback == NULL) gMain.savedCallback = CB2_ReturnToFieldWithOpenMenu; sOptionMenuPtr = AllocZeroed(sizeof(struct OptionMenu)); sOptionMenuPtr->loadState = 0; sOptionMenuPtr->loadPaletteState = 0; sOptionMenuPtr->state = 0; sOptionMenuPtr->cursorPos = 0; sOptionMenuPtr->inSubMenu = 0; sOptionMenuPtr->option[MENUITEM_TEXTSPEED] = gSaveBlock2Ptr->optionsTextSpeed; sOptionMenuPtr->option[MENUITEM_BATTLESCENE] = 0; sOptionMenuPtr->option[MENUITEM_BATTLESTYLE] = gSaveBlock2Ptr->optionsBattleStyle; sOptionMenuPtr->option[MENUITEM_SOUND] = gSaveBlock2Ptr->optionsSound; sOptionMenuPtr->option[MENUITEM_BUTTONMODE] = gSaveBlock2Ptr->optionsButtonMode; sOptionMenuPtr->option[MENUITEM_FRAMETYPE] = gSaveBlock2Ptr->optionsWindowFrameType; sOptionMenuPtr->subOption[MENUITEM_BATTLETRANSITIONS] = gSaveBlock2Ptr->optionsBattleTransitions; sOptionMenuPtr->subOption[MENUITEM_BATTLEINTROANIM] = gSaveBlock2Ptr->optionsBattleIntroAnim; sOptionMenuPtr->subOption[MENUITEM_MOVEANIMATIONS] = gSaveBlock2Ptr->optionsBattleSceneOff; sOptionMenuPtr->subOption[MENUITEM_HPBARANIMSPEED] = gSaveBlock2Ptr->optionsHpBarAnimSpeed; sOptionMenuPtr->subOption[MENUITEM_EXPBARANIMSPEED] = gSaveBlock2Ptr->optionsExpBarAnimSpeed; for (i = 0; i < MENUITEM_COUNT - 1; i++) { if (sOptionMenuPtr->option[i] > (sOptionMenuItemCounts[i]) - 1) sOptionMenuPtr->option[i] = 0; } for (i = 0; i < MENUITEM_COUNT2 - 1; i++) { if (sOptionMenuPtr->subOption[i] > (sOptionSubMenuItemCounts[i]) - 1) sOptionMenuPtr->subOption[i] = 0; } FlagSet(FLAG_SYS_IN_OPTIONS_MENU); SetHelpContext(HELPCONTEXT_OPTIONS); SetMainCallback2(CB2_OptionMenu); } static void OptionMenu_InitCallbacks(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); } static void OptionMenu_SetVBlankCallback(void) { SetVBlankCallback(VBlankCB_OptionMenu); } static void CB2_OptionMenu(void) { u8 i, state; state = sOptionMenuPtr->state; switch (state) { case 0: OptionMenu_InitCallbacks(); break; case 1: InitOptionMenuBg(); break; case 2: OptionMenu_ResetSpriteData(); break; case 3: if (LoadOptionMenuPalette() != TRUE) return; break; case 4: PrintOptionMenuHeader(); break; case 5: DrawOptionMenuBg(); break; case 6: LoadOptionMenuItemNames(); break; case 7: if(!sOptionMenuPtr->inSubMenu) { for (i = 0; i < MENUITEM_COUNT; i++) BufferOptionMenuString(i); } else { for (i = 0; i < MENUITEM_COUNT2; i++) BufferOptionMenuString(i); } break; case 8: UpdateSettingSelectionDisplay(sOptionMenuPtr->cursorPos); break; case 9: OptionMenu_PickSwitchCancel(); break; default: SetOptionMenuTask(); break; } sOptionMenuPtr->state++; } static void SetOptionMenuTask(void) { CreateTask(Task_OptionMenu, 0); SetMainCallback2(CB2_InitOptionMenu); } static void InitOptionMenuBg(void) { void *dest = (void *)VRAM; DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sOptionMenuBgTemplates, NELEMS(sOptionMenuBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); InitWindows(sOptionMenuWinTemplates); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, BLDCNT_TGT1_BG1); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); ShowBg(0); ShowBg(1); ShowBg(2); }; static void OptionMenu_PickSwitchCancel(void) { s32 x; FillWindowPixelBuffer(2, PIXEL_FILL(15)); if(!sOptionMenuPtr->inSubMenu) { if(sOptionMenuPtr->cursorPos == MENUITEM_BATTLESCENE) { x = 0xE4 - GetStringWidth(FONT_SMALL, gText_PickSwitchCancelA, 0); AddTextPrinterParameterized3(2, FONT_SMALL, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancelA); } else if(sOptionMenuPtr->cursorPos == MENUITEM_CANCEL) { x = 0xE4 - GetStringWidth(FONT_SMALL, gText_PickSwitchExit, 0); AddTextPrinterParameterized3(2, FONT_SMALL, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchExit); } else { x = 0xE4 - GetStringWidth(FONT_SMALL, gText_PickSwitchCancel, 0); AddTextPrinterParameterized3(2, FONT_SMALL, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancel); } } else { x = 0xE4 - GetStringWidth(FONT_SMALL, gText_PickSwitchBack, 0); AddTextPrinterParameterized3(2, FONT_SMALL, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchBack); } PutWindowTilemap(2); CopyWindowToVram(2, COPYWIN_FULL); } static void OptionMenu_ResetSpriteData(void) { ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); ResetTasks(); ScanlineEffect_Stop(); } static bool8 LoadOptionMenuPalette(void) { switch (sOptionMenuPtr->loadPaletteState) { case 0: LoadBgTiles(1, GetUserWindowGraphics(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); break; case 1: LoadPalette(GetUserWindowGraphics(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP); break; case 2: LoadPalette(sOptionMenuPalette, BG_PLTT_ID(1), sizeof(sOptionMenuPalette)); LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(15), PLTT_SIZE_4BPP); break; case 3: LoadStdWindowGfxOnBg(1, 0x1B3, BG_PLTT_ID(3)); break; default: return TRUE; } sOptionMenuPtr->loadPaletteState++; return FALSE; } static void Task_OptionMenu(u8 taskId) { switch (sOptionMenuPtr->loadState) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); OptionMenu_SetVBlankCallback(); sOptionMenuPtr->loadState++; break; case 1: if (gPaletteFade.active) return; sOptionMenuPtr->loadState++; break; case 2: if (((bool32)IsActiveOverworldLinkBusy()) == TRUE) break; switch (OptionMenu_ProcessInput()) { case 0: break; case 1: sOptionMenuPtr->loadState++; break; case 2: LoadBgTiles(1, GetUserWindowGraphics(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); LoadPalette(GetUserWindowGraphics(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP); BufferOptionMenuString(sOptionMenuPtr->cursorPos); break; case 3: UpdateSettingSelectionDisplay(sOptionMenuPtr->cursorPos); break; case 4: BufferOptionMenuString(sOptionMenuPtr->cursorPos); break; case 6: if(!sOptionMenuPtr->inSubMenu) { sOptionMenuPtr->inSubMenu = TRUE; PrintOptionMenuHeader(); sOptionMenuPtr->state = 6; sOptionMenuPtr->loadState = 1; sOptionMenuPtr->cursorPos = 0; SetHelpContext(HELPCONTEXT_OPTIONS_SUBMENU); DestroyTask(taskId); SetMainCallback2(CB2_OptionMenu); break; } else { sOptionMenuPtr->inSubMenu = FALSE; PrintOptionMenuHeader(); sOptionMenuPtr->state = 6; sOptionMenuPtr->loadState = 1; sOptionMenuPtr->cursorPos = 1; SetHelpContext(HELPCONTEXT_OPTIONS); DestroyTask(taskId); SetMainCallback2(CB2_OptionMenu); break; } } break; case 3: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); sOptionMenuPtr->loadState++; break; case 4: if (gPaletteFade.active) return; sOptionMenuPtr->loadState++; break; case 5: CloseAndSaveOptionMenu(taskId); break; } } static u8 OptionMenu_ProcessInput(void) { u16 current; u16 *curr; if (JOY_REPT(DPAD_RIGHT)) { if(!sOptionMenuPtr->inSubMenu) { current = sOptionMenuPtr->option[(sOptionMenuPtr->cursorPos)]; if (current == (sOptionMenuItemCounts[sOptionMenuPtr->cursorPos] - 1)) sOptionMenuPtr->option[sOptionMenuPtr->cursorPos] = 0; else sOptionMenuPtr->option[sOptionMenuPtr->cursorPos] = current + 1; if (sOptionMenuPtr->cursorPos == MENUITEM_FRAMETYPE) return 2; else return 4; } else { current = sOptionMenuPtr->subOption[(sOptionMenuPtr->cursorPos)]; if (current == (sOptionSubMenuItemCounts[sOptionMenuPtr->cursorPos] - 1)) sOptionMenuPtr->subOption[sOptionMenuPtr->cursorPos] = 0; else sOptionMenuPtr->subOption[sOptionMenuPtr->cursorPos] = current + 1; return 4; } } else if (JOY_REPT(DPAD_LEFT)) { if(!sOptionMenuPtr->inSubMenu) { curr = &sOptionMenuPtr->option[sOptionMenuPtr->cursorPos]; if (*curr == 0) *curr = sOptionMenuItemCounts[sOptionMenuPtr->cursorPos] - 1; else --*curr; if (sOptionMenuPtr->cursorPos == MENUITEM_FRAMETYPE) return 2; else return 4; } else { curr = &sOptionMenuPtr->subOption[sOptionMenuPtr->cursorPos]; if (*curr == 0) *curr = sOptionSubMenuItemCounts[sOptionMenuPtr->cursorPos] - 1; else --*curr; return 4; } } else if (JOY_REPT(DPAD_UP)) { if(!sOptionMenuPtr->inSubMenu) { if (sOptionMenuPtr->cursorPos == MENUITEM_TEXTSPEED) sOptionMenuPtr->cursorPos = MENUITEM_CANCEL; else sOptionMenuPtr->cursorPos = sOptionMenuPtr->cursorPos - 1; } else { if (sOptionMenuPtr->cursorPos == MENUITEM_BATTLETRANSITIONS) sOptionMenuPtr->cursorPos = MENUITEM_BACK; else sOptionMenuPtr->cursorPos = sOptionMenuPtr->cursorPos - 1; } OptionMenu_PickSwitchCancel(); return 3; } else if (JOY_REPT(DPAD_DOWN)) { if(!sOptionMenuPtr->inSubMenu) { if (sOptionMenuPtr->cursorPos == MENUITEM_CANCEL) sOptionMenuPtr->cursorPos = MENUITEM_TEXTSPEED; else sOptionMenuPtr->cursorPos = sOptionMenuPtr->cursorPos + 1; } else { if (sOptionMenuPtr->cursorPos == MENUITEM_BACK) sOptionMenuPtr->cursorPos = MENUITEM_BATTLETRANSITIONS; else sOptionMenuPtr->cursorPos = sOptionMenuPtr->cursorPos + 1; } OptionMenu_PickSwitchCancel(); return 3; } else if (JOY_NEW(A_BUTTON)) { if(!sOptionMenuPtr->inSubMenu) { if(sOptionMenuPtr->cursorPos == MENUITEM_BATTLESCENE) return 6; if(sOptionMenuPtr->cursorPos == MENUITEM_CANCEL) return 1; } else return 6; } else if (JOY_NEW(B_BUTTON)) { if(sOptionMenuPtr->inSubMenu) return 6; else return 1; } else { return 0; } } static void BufferOptionMenuString(u8 selection) { u8 str[20]; u8 buf[12]; u8 dst[3]; u8 x, y; memcpy(dst, sOptionMenuTextColor, 3); x = 0x82; y = ((GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) - 1) * selection) + 2; FillWindowPixelRect(1, 1, x, y, 0x46, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT)); if(!sOptionMenuPtr->inSubMenu) { switch (selection) { case MENUITEM_TEXTSPEED: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sTextSpeedOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_BATTLESCENE: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sBattleSceneOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_BATTLESTYLE: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sBattleStyleOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_SOUND: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sSoundOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_BUTTONMODE: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sButtonTypeOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_FRAMETYPE: StringCopy(str, gText_FrameType); ConvertIntToDecimalStringN(buf, sOptionMenuPtr->option[selection] + 1, 1, 2); StringAppendN(str, buf, 3); AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, str); break; default: break; } } else { switch (selection) { case MENUITEM_BATTLETRANSITIONS: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sBattleTransitionOptions[sOptionMenuPtr->subOption[selection]]); break; case MENUITEM_BATTLEINTROANIM: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sBattleIntroAnimOptions[sOptionMenuPtr->subOption[selection]]); break; case MENUITEM_MOVEANIMATIONS: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sMoveAnimOptions[sOptionMenuPtr->subOption[selection]]); break; case MENUITEM_HPBARANIMSPEED: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sHpBarAnimSpeedOptions[sOptionMenuPtr->subOption[selection]]); break; case MENUITEM_EXPBARANIMSPEED: AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sExpBarAnimSpeedOptions[sOptionMenuPtr->subOption[selection]]); break; default: break; } } PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_FULL); } static void CloseAndSaveOptionMenu(u8 taskId) { gFieldCallback = FieldCB_DefaultWarpExit; SetMainCallback2(gMain.savedCallback); FreeAllWindowBuffers(); gSaveBlock2Ptr->optionsTextSpeed = sOptionMenuPtr->option[MENUITEM_TEXTSPEED]; gSaveBlock2Ptr->optionsBattleStyle = sOptionMenuPtr->option[MENUITEM_BATTLESTYLE]; gSaveBlock2Ptr->optionsSound = sOptionMenuPtr->option[MENUITEM_SOUND]; gSaveBlock2Ptr->optionsButtonMode = sOptionMenuPtr->option[MENUITEM_BUTTONMODE]; gSaveBlock2Ptr->optionsWindowFrameType = sOptionMenuPtr->option[MENUITEM_FRAMETYPE]; gSaveBlock2Ptr->optionsBattleTransitions = sOptionMenuPtr->subOption[MENUITEM_BATTLETRANSITIONS]; gSaveBlock2Ptr->optionsBattleIntroAnim = sOptionMenuPtr->subOption[MENUITEM_BATTLEINTROANIM]; gSaveBlock2Ptr->optionsBattleSceneOff = sOptionMenuPtr->subOption[MENUITEM_MOVEANIMATIONS]; gSaveBlock2Ptr->optionsHpBarAnimSpeed = sOptionMenuPtr->subOption[MENUITEM_HPBARANIMSPEED]; gSaveBlock2Ptr->optionsExpBarAnimSpeed = sOptionMenuPtr->subOption[MENUITEM_EXPBARANIMSPEED]; SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); FREE_AND_SET_NULL(sOptionMenuPtr); FlagClear(FLAG_SYS_IN_OPTIONS_MENU); DestroyTask(taskId); } static void PrintOptionMenuHeader(void) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); if(!sOptionMenuPtr->inSubMenu) AddTextPrinterParameterized(WIN_TEXT_OPTION, FONT_NORMAL, gText_MenuOption, 8, 1, TEXT_SKIP_DRAW, NULL); else AddTextPrinterParameterized(WIN_TEXT_OPTION, FONT_NORMAL, gText_BattleScene, 8, 1, TEXT_SKIP_DRAW, NULL); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); } static void DrawOptionMenuBg(void) { u8 h; h = 2; FillBgTilemapBufferRect(1, 0x1B3, 1, 2, 1, 1, 3); FillBgTilemapBufferRect(1, 0x1B4, 2, 2, 0x1B, 1, 3); FillBgTilemapBufferRect(1, 0x1B5, 0x1C, 2, 1, 1, 3); FillBgTilemapBufferRect(1, 0x1B6, 1, 3, 1, h, 3); FillBgTilemapBufferRect(1, 0x1B8, 0x1C, 3, 1, h, 3); FillBgTilemapBufferRect(1, 0x1B9, 1, 5, 1, 1, 3); FillBgTilemapBufferRect(1, 0x1BA, 2, 5, 0x1B, 1, 3); FillBgTilemapBufferRect(1, 0x1BB, 0x1C, 5, 1, 1, 3); FillBgTilemapBufferRect(1, 0x1AA, 1, 6, 1, 1, h); FillBgTilemapBufferRect(1, 0x1AB, 2, 6, 0x1A, 1, h); FillBgTilemapBufferRect(1, 0x1AC, 0x1C, 6, 1, 1, h); FillBgTilemapBufferRect(1, 0x1AD, 1, 7, 1, 0x10, h); FillBgTilemapBufferRect(1, 0x1AF, 0x1C, 7, 1, 0x10, h); FillBgTilemapBufferRect(1, 0x1B0, 1, 0x13, 1, 1, h); FillBgTilemapBufferRect(1, 0x1B1, 2, 0x13, 0x1A, 1, h); FillBgTilemapBufferRect(1, 0x1B2, 0x1C, 0x13, 1, 1, h); CopyBgTilemapBufferToVram(1); } static void LoadOptionMenuItemNames(void) { u32 i; FillWindowPixelBuffer(1, PIXEL_FILL(1)); if(!sOptionMenuPtr->inSubMenu) { for (i = 0; i < MENUITEM_COUNT; i++) { AddTextPrinterParameterized(WIN_OPTIONS, FONT_NORMAL, sOptionMenuItemsNames[i], 8, (u8)((i * (GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SKIP_DRAW, NULL); } } else { for (i = 0; i < MENUITEM_COUNT2; i++) { AddTextPrinterParameterized(WIN_OPTIONS, FONT_NORMAL, sOptionMenuItemsNames[i + MENUITEM_COUNT], 8, (u8)((i * (GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SKIP_DRAW, NULL); } } } static void UpdateSettingSelectionDisplay(u16 selection) { u16 maxLetterHeight, y; maxLetterHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT); y = selection * (maxLetterHeight - 1) + 0x3A; SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(y, y + maxLetterHeight)); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0x10, 0xE0)); } ================================================ FILE: src/orre_met_location_handler.c ================================================ #include "global.h" #include "pokemon.h" #include "strings.h" #include "string_util.h" #include "constants/species.h" #include "orre_met_location_strings.h" u8* DetermineOrreMetLocation(struct Pokemon *); u8* GetOrreMetLocationString(struct Pokemon *); u8* ResolveOrreMetLocationCollision(struct Pokemon *); u8 *WriteOrreMapName(u8 *dst0, u8 *string, u16 fill) { u8 *dst; dst = StringCopy(dst0, string); return dst; } u8* DetermineOrreMetLocation(struct Pokemon *mon) { u8 *stringToUse; u8 locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); if(locationMet == 76 || locationMet == 109 || locationMet == 110 || locationMet == 111 || locationMet == 67 || locationMet == 69 || locationMet == 0 || locationMet == 254) { stringToUse = ResolveOrreMetLocationCollision(mon); } else { stringToUse = GetOrreMetLocationString(mon); } return (u8 *)stringToUse; } u8* GetOrreMetLocationString(struct Pokemon *mon) { u8 locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); const u8 *locationString; switch (locationMet) { //valid Colosseum locations case 39: //only valid Agate Village location locationString = gAgate_Village; break; case 125: //only valid Deep Colosseum location locationString = gDeep_Colosseum; break; case 68: //only valid Laboratory location locationString = gLaboratory; break; case 5: //only valid Mayor's House location locationString = gMayors_House; break; case 30: //only valid Miror's Hideout location, Remoraid and Mantine 2nd chance here or Pyrite Cave? locationString = gMirors_Hideout; break; case 1: //only valid Outskirt Stand location locationString = gOutskirt_Stand; break; case 3: //only normally valid Phenac City location case 128: //eReader Pokemon are from here in Phenac City locationString = gPhenac_City; break; case 25: case 28: //only valid Pyrite Building locations locationString = gPyrite_Bldg; break; case 29: case 31: case 32: //only valid Pyrite Cave locations locationString = gPyrite_Cave; break; case 15: //only valid Pyrite Town location locationString = gPyrite_Town; break; case 115: case 117: //valid Realgam Tower locations; see below comment locationString = gRealgam_Tower; break; case 104: case 106: //Do these three display as Realgam Tower instead in game? case 113: //only valid RealgamTwr Dome locations locationString = gRealgamTwr_Dome; break; case 132: case 133: case 134: //only valid Snagem Hideout locations locationString = gSnagem_Hideout; break; case 47: case 55: //only valid The Under locations locationString = gThe_Under; break; case 58: //only valid The Under Subway location locationString = gThe_Under_Subway; break; case 118: //only valid Tower Colosseum location locationString = gTower_Colosseum; break; //valid XD locations case 92: //only valid Cave Poke Spot location locationString = gCave; break; case 64: case 65: case 66: case 70: case 71: //only valid Cipher Key Lair locations locationString = gCipher_Key_Lair; break; case 8: case 9: case 10: case 11: //only valid Cipher Lab locations locationString = gCipher_Lab; break; case 73: case 74: case 75: case 77: case 80: case 81: case 84: case 85: case 87: case 88: //only valid Citadark Isle locations locationString = gCitadark_Isle; break; case 153: case 162: //only valid Gateon Port locations locationString = gGateon_Port; break; case 16: //only valid Mt. Battle location; gift Johto Starters locationString = gMt_Battle; break; case 91: //only valid Oasis Poke Spot location locationString = gOasis; break; case 164: //only valid Outskirt Stand location locationString = gOutskirt_Stand; break; case 94: case 96: case 97: case 100: case 107: //only valid Phenac City locations locationString = gPhenac_City; break; case 143: //only valid Pokemon HQ Lab location locationString = gPokemon_HQ_Lab; break; case 116: case 119: //only valid Pyrite Town locations locationString = gPyrite_Town; break; case 59: //only valid Realgam Tower location locationString = gRealgam_Tower; break; case 90: //only valid Rock Poke Spot location locationString = gRock; break; default: //if any other location index is present, use generic distant land text. locationString = gOtherText_MetDistantLand; break; } return (u8 *)locationString; } u8* ResolveOrreMetLocationCollision(struct Pokemon *mon) { u16 species; u8 locationMet; u8 language; const u8 *locationString; u8 obedient = GetMonData(mon, MON_DATA_MODERN_FATEFUL_ENCOUNTER); //all XD Pokemon have this bit set locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); species = GetMonData(mon, MON_DATA_SPECIES); language = GetMonData(mon, MON_DATA_LANGUAGE); switch (locationMet) { case 67: case 69: //Colosseum: Laboratory; XD: Cipher Key Lair //if(species == SPECIES_PRIMEAPE || species == SPECIES_HYPNO || species == SPECIES_TANGELA || species == SPECIES_BUTTERFREE || species == SPECIES_MAGNETON) if(obedient) locationString = gCipher_Key_Lair; else locationString = gLaboratory; break; case 76: //Colosseum: Mt. Battle; XD: Citadark Isle //if(species == SPECIES_ENTEI) if(!obedient) locationString = gMt_Battle; else locationString = gCitadark_Isle; break; case 109: case 110: case 111: //Colosseum: RealgamTwr Dome; XD: Pyrite Town //if(species == SPECIES_SUNFLORA || species == SPECIES_DELIBIRD || species == SPECIES_SUICUNE || species == SPECIES_HERACROSS) if(!obedient) locationString = gRealgamTwr_Dome; else locationString = gPyrite_Town; break; case 0: //XD Starter Eevee if((species >= SPECIES_EEVEE && species <= SPECIES_FLAREON) || species == SPECIES_ESPEON || species == SPECIES_UMBREON) { if(language == LANGUAGE_JAPANESE) locationString = gXD_Eevee_Met_Location_JP; else locationString = gXD_Eevee_Met_Location; } break; case 254: //Colosseum Starter Espeon and Umbreon and Duking's Plusle if(species == SPECIES_ESPEON || species == SPECIES_UMBREON) { if(language == LANGUAGE_JAPANESE) locationString = gColosseum_Starter_Met_Location_JP; else locationString = gColosseum_Starter_Met_Location; } else { if(language == LANGUAGE_JAPANESE) locationString = gDukings_Plusle_JP; else locationString = gDukings_Plusle; } break; default: //error handler; default to generic distant land text locationString = gOtherText_MetDistantLand; break; } return (u8 *)locationString; } ================================================ FILE: src/orre_met_location_strings.c ================================================ #include "global.h" #include "strings.h" #include "orre_met_location_strings.h" const u8 gAgate_Village[] = _("AGATE VILLAGE$"); const u8 gDeep_Colosseum[] = _("DEEP COLOSSEUM$"); const u8 gLaboratory[] = _("LABORATORY$"); const u8 gMayors_House[] = _("MAYOR'S HOUSE$"); const u8 gMirors_Hideout[] = _("MIROR'S HIDEOUT$"); const u8 gOutskirt_Stand[] = _("OUTSKIRT STAND$"); const u8 gPhenac_City[] = _("PHENAC CITY$"); const u8 gPyrite_Bldg[] = _("PYRITE BLDG$"); const u8 gPyrite_Cave[] = _("PYRITE CAVE$"); const u8 gPyrite_Town[] = _("PYRITE TOWN$"); const u8 gRealgam_Tower[] = _("REALGAM TOWER$"); const u8 gRealgamTwr_Dome[] = _("REALGAMTWR DOME$"); const u8 gSnagem_Hideout[] = _("SNAGEM HIDEOUT$"); const u8 gThe_Under[] = _("THE UNDER$"); const u8 gThe_Under_Subway[] = _("THE UNDER SUBWAY$"); const u8 gTower_Colosseum[] = _("TOWER COLOSSEUM$"); const u8 gCave[] = _("CAVE$"); const u8 gCipher_Key_Lair[] = _("CIPHER KEY LAIR$"); const u8 gCipher_Lab[] = _("CIPHER LAB$"); const u8 gCitadark_Isle[] = _("CITADARK ISLE$"); const u8 gGateon_Port[] = _("GATEON PORT$"); const u8 gMt_Battle[] = _("MT. BATTLE$"); const u8 gOasis[] = _("OASIS$"); const u8 gPokemon_HQ_Lab[] = _("POKéMON HQ LAB$"); const u8 gRock[] = _("ROCK$"); const u8 gXD_Eevee_Met_Location[] = _("obtained from {DYNAMIC 0x03}'s dad.\n\n\n$"); const u8 gColosseum_Starter_Met_Location[] = _("was {DYNAMIC 0x03}'s old friend.\n\n\n$"); const u8 gDukings_Plusle[] = _("received from {DYNAMIC 0x03}\n$"); const u8 gXD_Eevee_Met_Location_JP[] = _("obtained from {JPN}{DYNAMIC 0x03}{ENG}'s\ndad.\n\n\n$"); const u8 gColosseum_Starter_Met_Location_JP[] = _("was {JPN}{DYNAMIC 0x03}{ENG}'s old friend.\n\n\n$"); const u8 gDukings_Plusle_JP[] = _("received from {JPN}{DYNAMIC 0x03}{ENG}\n$"); const u8 gOtherText_MetDistantLand[] = _("a distant land.$"); // Pokemon Box Egg string const u8 gText_PeculiarEggPokemonBox[] = _("A wondrously peculiar POKéMON EGG\nobtained from BRIGETTE at a nice place."); const u8 gText_Azusa[] = _("AZUSA"); ================================================ FILE: src/overworld.c ================================================ #include "global.h" #include "gflib.h" #include "bg_regs.h" #include "cable_club.h" #include "credits.h" #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" #include "field_camera.h" #include "field_control_avatar.h" #include "field_effect.h" #include "field_fadetransition.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" #include "field_specials.h" #include "field_tasks.h" #include "field_weather.h" #include "fieldmap.h" #include "fldeff.h" #include "heal_location.h" #include "help_system.h" #include "item.h" #include "link.h" #include "link_rfu.h" #include "load_save.h" #include "m4a.h" #include "map_name_popup.h" #include "map_preview_screen.h" #include "metatile_behavior.h" #include "money.h" #include "new_game.h" #include "new_menu_helpers.h" #include "overworld.h" #include "play_time.h" #include "pokedex.h" #include "pokemon_storage_system.h" #include "quest_log.h" #include "quest_log_objects.h" #include "random.h" #include "renewable_hidden_items.h" #include "roamer.h" #include "safari_zone.h" #include "save_location.h" #include "scanline_effect.h" #include "script.h" #include "script_pokemon_util.h" #include "start_menu.h" #include "tileset_anims.h" #include "trainer_pokemon_sprites.h" #include "vs_seeker.h" #include "wild_encounter.h" #include "constants/abilities.h" #include "constants/cable_club.h" #include "constants/event_objects.h" #include "constants/maps.h" #include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/items.h" #include "constants/sound.h" #define PLAYER_LINK_STATE_IDLE 0x80 #define PLAYER_LINK_STATE_BUSY 0x81 #define PLAYER_LINK_STATE_READY 0x82 #define PLAYER_LINK_STATE_EXITING_ROOM 0x83 #define FACING_NONE 0 #define FACING_UP 1 #define FACING_DOWN 2 #define FACING_LEFT 3 #define FACING_RIGHT 4 #define FACING_FORCED_UP 7 #define FACING_FORCED_DOWN 8 #define FACING_FORCED_LEFT 9 #define FACING_FORCED_RIGHT 10 typedef u16 (*KeyInterCB)(u32 key); struct InitialPlayerAvatarState { u8 transitionFlags; u8 direction; bool8 hasDirectionSet; }; struct CableClubPlayer { u8 playerId; bool8 isLocalPlayer; u8 movementMode; u8 facing; struct MapPosition pos; u16 metatileBehavior; }; EWRAM_DATA struct WarpData gLastUsedWarp = {}; static EWRAM_DATA struct WarpData sWarpDestination = {}; static EWRAM_DATA struct WarpData sFixedDiveWarp = {}; static EWRAM_DATA struct WarpData sFixedHoleWarp = {}; static EWRAM_DATA struct InitialPlayerAvatarState sInitialPlayerAvatarState = {}; EWRAM_DATA bool8 gDisableMapMusicChangeOnMapLoad = MUSIC_DISABLE_OFF; static EWRAM_DATA u16 sAmbientCrySpecies = SPECIES_NONE; static EWRAM_DATA bool8 sIsAmbientCryWaterMon = FALSE; ALIGNED(4) EWRAM_DATA bool8 gExitStairsMovementDisabled = FALSE; static EWRAM_DATA const struct CreditsOverworldCmd *sCreditsOverworld_Script = NULL; static EWRAM_DATA s16 sCreditsOverworld_CmdLength = 0; static EWRAM_DATA s16 sCreditsOverworld_CmdIndex = 0; EWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {}; u16 *gBGTilemapBuffers1; u16 *gBGTilemapBuffers2; u16 *gBGTilemapBuffers3; void (*gFieldCallback)(void); bool8 (*gFieldCallback2)(void); u16 gHeldKeyCodeToSend; u8 gLocalLinkPlayerId; u8 gFieldLinkPlayerCount; static u8 sPlayerLinkStates[MAX_LINK_PLAYERS]; static KeyInterCB sPlayerKeyInterceptCallback; static bool8 sReceivingFromLink; static u8 sRfuKeepAliveTimer; static u8 CountBadgesForOverworldWhiteOutLossCalculation(void); static void Overworld_ResetStateAfterWhitingOut(void); static void Overworld_SetWhiteoutRespawnPoint(void); static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, u8 mapType); static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, u8 mapType); static u16 GetCenterScreenMetatileBehavior(void); static void SetDefaultFlashLevel(void); static void Overworld_TryMapConnectionMusicTransition(void); static void ChooseAmbientCrySpecies(void); static void CB2_Overworld(void); static void CB2_LoadMap2(void); static void CB2_LoadMapOnReturnToFieldCableClub(void); static void CB2_ReturnToFieldLocal(void); static void CB2_ReturnToFieldLink(void); static void FieldClearVBlankHBlankCallbacks(void); static void SetFieldVBlankCallback(void); static void VBlankCB_Field(void); static bool32 LoadMapInStepsLink(u8 *state); static bool32 ReturnToFieldLocal(u8 *state); static bool32 ReturnToFieldLink(u8 *state); static void MoveSaveBlocks_ResetHeap_(void); static void ResetScreenForMapLoad(void); static void InitViewGraphics(void); static void InitOverworldGraphicsRegisters(void); static void ResumeMap(bool32 inLink); static void InitObjectEventsLink(void); static void InitObjectEventsLocal(void); static void ReloadObjectsAndRunReturnToFieldMapScript(void); static void SetCameraToTrackPlayer(void); static void SetCameraToTrackGuestPlayer(void); static void SetCameraToTrackGuestPlayer_2(void); static void OffsetCameraFocusByLinkPlayerId(void); static void SpawnLinkPlayers(void); static void CreateLinkPlayerSprites(void); static void CB2_LoadMapForQLPlayback(void); static void DoLoadMap_QLPlayback(u8 *state); static bool32 LoadMap_QLPlayback(u8 *state); static bool32 SetUpScrollSceneForCredits(u8 *state, u8 unused); static bool8 MapLdr_Credits(void); static void CameraCB_CreditsPan(struct CameraObject * camera); static void Task_OvwldCredits_FadeOut(u8 taskId); static void Task_OvwldCredits_WaitFade(u8 taskId); static void CB1_UpdateLinkState(void); static void ResetAllMultiplayerState(void); static void ClearAllPlayerKeys(void); static void SetKeyInterceptCallback(KeyInterCB callback); static void ResetAllLinkStates(void); static void UpdateAllLinkPlayers(u16 *linkKeys, s32 selfId); static void UpdateHeldKeyCode(u16 interceptedKeys); static u32 GetLinkSendQueueLength(void); static u16 GetDirectionForDpadKey(u16 key); static void SetPlayerFacingDirection(u8 linkPlayerId, u8 setFacing); static void ResetPlayerHeldKeys(u16 *linkKeys); static u16 KeyInterCB_SelfIdle(u32 linkPlayerId); static u16 KeyInterCB_DeferToEventScript(u32 linkPlayerId); static u16 KeyInterCB_DeferToRecvQueue(u32 linkPlayerId); static u16 KeyInterCB_DeferToSendQueue(u32 linkPlayerId); static void LoadCableClubPlayer(s32 i, s32 selfId, struct CableClubPlayer *player); static bool32 PlayerIsAtSouthExit(struct CableClubPlayer *player); static const u8 *TryGetTileEventScript(struct CableClubPlayer *player); static const u8 *TryInteractWithPlayer(struct CableClubPlayer *player); static bool32 IsCableClubPlayerUnfrozen(struct CableClubPlayer *player); static bool32 CanCableClubPlayerPressStart(struct CableClubPlayer *player); static u16 GetDirectionForEventScript(const u8 *script); static void InitLinkPlayerQueueScript(void); static void CreateConfirmLeaveTradeRoomPrompt(void); static void InitLinkRoomStartMenuScript(void); static void InitMenuBasedScript(const u8 *script); static void RunInteractLocalPlayerScript(const u8 *script); static void RunTerminateLinkScript(void); static void SpawnLinkPlayerObjectEvent(u8 i, s16 x, s16 y, u8 gender); static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y); static u8 GetSpriteForLinkedPlayer(u8 linkPlayerId); static void GetLinkPlayerCoords(u8 linkPlayerId, u16 *x, u16 *y); static u8 GetLinkPlayerFacingDirection(u8 linkPlayerId); static u8 GetLinkPlayerElevation(u8 linkPlayerId); static u8 GetLinkPlayerIdAt(s16 x, s16 y); static void CreateLinkPlayerSprite(u8 i, u8 version); static u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); static u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); static u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); static u8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); static u8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); static u8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); static void MovementStatusHandler_EnterFreeMode(struct LinkPlayerObjectEvent *, struct ObjectEvent *); static void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerObjectEvent *, struct ObjectEvent *); static u8 FlipVerticalAndClearForced(u8 newFacing, u8 oldFacing); static u8 LinkPlayerDetectCollision(u8 selfObjEventId, u8 a2, s16 x, s16 y); static void SpriteCB_LinkPlayer(struct Sprite *sprite); extern const struct MapLayout * gMapLayouts[]; extern const struct MapHeader *const *gMapGroups[]; // Routines related to game state on warping in static const u8 sWhiteOutMoneyLossMultipliers[] = { 2, 4, 6, 9, 12, 16, 20, 25, 30 }; static const u16 sWhiteOutMoneyLossBadgeFlagIDs[] = { FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET, FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET }; bool8 CheckNationalDexEligibilityOnSaveLoad(void) { u16 mapGroup = gSaveBlock1Ptr->location.mapGroup; s8 mapNum = gSaveBlock1Ptr->location.mapNum; if((mapGroup == MAP_GROUP(VIRIDIAN_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(VIRIDIAN_CITY_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(PEWTER_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(PEWTER_CITY_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(CERULEAN_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(CERULEAN_CITY_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(LAVENDER_TOWN_POKEMON_CENTER_1F) && mapNum == MAP_NUM(LAVENDER_TOWN_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(VERMILION_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(VERMILION_CITY_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(CELADON_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(CELADON_CITY_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(FUCHSIA_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(FUCHSIA_CITY_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(CINNABAR_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(CINNABAR_ISLAND_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(INDIGO_PLATEAU_POKEMON_CENTER_1F) && mapNum == MAP_NUM(INDIGO_PLATEAU_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(SAFFRON_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(SAFFRON_CITY_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(ROUTE4_POKEMON_CENTER_1F) && mapNum == MAP_NUM(ROUTE4_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(ROUTE10_POKEMON_CENTER_1F) && mapNum == MAP_NUM(ROUTE10_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(ONE_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(ONE_ISLAND_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(TWO_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(TWO_ISLAND_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(THREE_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(THREE_ISLAND_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(FOUR_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(FOUR_ISLAND_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(FIVE_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(FIVE_ISLAND_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(SEVEN_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(SEVEN_ISLAND_POKEMON_CENTER_1F)) || (mapGroup == MAP_GROUP(SIX_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(SIX_ISLAND_POKEMON_CENTER_1F))) { if(!IsNationalPokedexEnabled() && HasNationalMon()) { VarSet(VAR_TEMP_0, 0); return TRUE; } } return FALSE; } bool8 DoCoordsMatchPMCExitMat(void) { s16 x; s16 y; switch(gMapHeader.regionMapSectionId) { case MAPSEC_INDIGO_PLATEAU: x = 11; y = 16; break; case MAPSEC_ONE_ISLAND: x = 9; y = 9; break; default: x = 7; y = 8; break; } if(gSaveBlock1Ptr->pos.x == x && gSaveBlock1Ptr->pos.y == y) { return TRUE; } return FALSE; } static void DoWhiteOut(void) { RunScriptImmediately(EventScript_ResetEliteFourEnd); RemoveMoney(&gSaveBlock1Ptr->money, ComputeWhiteOutMoneyLoss()); HealPlayerParty(); Overworld_ResetStateAfterWhitingOut(); Overworld_SetWhiteoutRespawnPoint(); WarpIntoMap(); } u32 ComputeWhiteOutMoneyLoss(void) { u8 nbadges = CountBadgesForOverworldWhiteOutLossCalculation(); u8 toplevel = GetPlayerPartyHighestLevel(); u32 losings = toplevel * 4 * sWhiteOutMoneyLossMultipliers[nbadges]; u32 money = GetMoney(&gSaveBlock1Ptr->money); if (losings > money) losings = money; return losings; } void OverworldWhiteOutGetMoneyLoss(void) { u32 losings = ComputeWhiteOutMoneyLoss(); ConvertIntToDecimalStringN(gStringVar1, losings, STR_CONV_MODE_LEFT_ALIGN, CountDigits(losings)); } static u8 CountBadgesForOverworldWhiteOutLossCalculation(void) { int i; u8 nbadges = 0; for (i = 0; i < NELEMS(sWhiteOutMoneyLossBadgeFlagIDs); i++) { if (FlagGet(sWhiteOutMoneyLossBadgeFlagIDs[i])) nbadges++; } return nbadges; } void Overworld_ResetStateAfterFly(void) { ResetInitialPlayerAvatarState(); FlagClear(FLAG_SYS_ON_CYCLING_ROAD); VarSet(VAR_MAP_SCENE_ROUTE16, 0); FlagClear(FLAG_SYS_CRUISE_MODE); FlagClear(FLAG_SYS_SAFARI_MODE); VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_FLASH_ACTIVE); FlagClear(FLAG_SYS_QL_DEPARTED); VarSet(VAR_QL_ENTRANCE, 0); } void Overworld_ResetStateAfterTeleport(void) { ResetInitialPlayerAvatarState(); FlagClear(FLAG_SYS_ON_CYCLING_ROAD); VarSet(VAR_MAP_SCENE_ROUTE16, 0); FlagClear(FLAG_SYS_CRUISE_MODE); FlagClear(FLAG_SYS_SAFARI_MODE); VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_FLASH_ACTIVE); FlagClear(FLAG_SYS_QL_DEPARTED); VarSet(VAR_QL_ENTRANCE, 0); } void Overworld_ResetStateAfterDigEscRope(void) { ResetInitialPlayerAvatarState(); FlagClear(FLAG_SYS_ON_CYCLING_ROAD); VarSet(VAR_MAP_SCENE_ROUTE16, 0); FlagClear(FLAG_SYS_CRUISE_MODE); FlagClear(FLAG_SYS_SAFARI_MODE); VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_FLASH_ACTIVE); FlagClear(FLAG_SYS_QL_DEPARTED); VarSet(VAR_QL_ENTRANCE, 0); } static void Overworld_ResetStateAfterWhitingOut(void) { ResetInitialPlayerAvatarState(); FlagClear(FLAG_SYS_ON_CYCLING_ROAD); VarSet(VAR_MAP_SCENE_ROUTE16, 0); FlagClear(FLAG_SYS_CRUISE_MODE); FlagClear(FLAG_SYS_SAFARI_MODE); VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_FLASH_ACTIVE); FlagClear(FLAG_SYS_QL_DEPARTED); VarSet(VAR_QL_ENTRANCE, 0); } static void Overworld_ResetStateOnContinue(void) { FlagClear(FLAG_SYS_SAFARI_MODE); VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); ChooseAmbientCrySpecies(); UpdateLocationHistoryForRoamer(); RoamerMoveToOtherLocationSet(); } // Routines related to game stats void ResetGameStats(void) { int i; for (i = 0; i < NUM_GAME_STATS; i++) { gSaveBlock1Ptr->gameStats[i] = 0; } } void IncrementGameStat(u8 statId) { u32 statVal; if (statId >= NUM_USED_GAME_STATS) return; statVal = GetGameStat(statId); if (statVal < 0xFFFFFF) statVal++; else statVal = 0xFFFFFF; SetGameStat(statId, statVal); } u32 GetGameStat(u8 statId) { if (statId >= NUM_USED_GAME_STATS) return 0; else return gSaveBlock1Ptr->gameStats[statId] ^ gSaveBlock2Ptr->encryptionKey; } void SetGameStat(u8 statId, u32 statVal) { if (statId >= NUM_USED_GAME_STATS) return; gSaveBlock1Ptr->gameStats[statId] = statVal ^ gSaveBlock2Ptr->encryptionKey; } void ApplyNewEncryptionKeyToGameStats(u32 newKey) { u32 i; for (i = 0; i < NUM_GAME_STATS; i++) { ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->gameStats[i], newKey); } } // Routines related to object events static void LoadObjEventTemplatesFromHeader(void) { u8 i, j; for (i = 0, j = 0; i < gMapHeader.events->objectEventCount; i++) { if (gMapHeader.events->objectEvents[i].kind == OBJ_KIND_CLONE) { // load target object from the connecting map u8 localId = gMapHeader.events->objectEvents[i].objUnion.clone.targetLocalId; u8 mapNum = gMapHeader.events->objectEvents[i].objUnion.clone.targetMapNum; u8 mapGroup = gMapHeader.events->objectEvents[i].objUnion.clone.targetMapGroup; const struct MapHeader * connectionMap = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); gSaveBlock1Ptr->objectEventTemplates[j] = connectionMap->events->objectEvents[localId - 1]; gSaveBlock1Ptr->objectEventTemplates[j].localId = gMapHeader.events->objectEvents[i].localId; gSaveBlock1Ptr->objectEventTemplates[j].x = gMapHeader.events->objectEvents[i].x; gSaveBlock1Ptr->objectEventTemplates[j].y = gMapHeader.events->objectEvents[i].y; gSaveBlock1Ptr->objectEventTemplates[j].objUnion.clone.targetLocalId = localId; gSaveBlock1Ptr->objectEventTemplates[j].objUnion.clone.targetMapNum = mapNum; gSaveBlock1Ptr->objectEventTemplates[j].objUnion.clone.targetMapGroup = mapGroup; gSaveBlock1Ptr->objectEventTemplates[j].kind = OBJ_KIND_CLONE; j++; } else { gSaveBlock1Ptr->objectEventTemplates[j] = gMapHeader.events->objectEvents[i]; j++; } } } static void LoadSaveblockObjEventScripts(void) { int i; const struct ObjectEventTemplate * src = gMapHeader.events->objectEvents; struct ObjectEventTemplate * savObjTemplates = gSaveBlock1Ptr->objectEventTemplates; for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) { savObjTemplates[i].script = src[i].script; } } void SetObjEventTemplateCoords(u8 localId, s16 x, s16 y) { int i; struct ObjectEventTemplate * savObjTemplates = gSaveBlock1Ptr->objectEventTemplates; for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) { if (savObjTemplates[i].localId == localId) { savObjTemplates[i].x = x; savObjTemplates[i].y = y; break; } } } void SetObjEventTemplateMovementType(u8 localId, u8 movementType) { s32 i; struct ObjectEventTemplate *savObjTemplates = gSaveBlock1Ptr->objectEventTemplates; for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) { struct ObjectEventTemplate *objectEventTemplate = &savObjTemplates[i]; if (objectEventTemplate->localId == localId) { objectEventTemplate->objUnion.normal.movementType = movementType; return; } } } void ResetObjEventTemplateMovementType(u8 localId) { s32 i; struct ObjectEventTemplate *savObjTemplates = gSaveBlock1Ptr->objectEventTemplates; for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) { struct ObjectEventTemplate *objectEventTemplate = &savObjTemplates[i]; const struct ObjectEventTemplate * headerObjectEventTemplate = &gMapHeader.events->objectEvents[i]; if (objectEventTemplate->localId == localId) { objectEventTemplate->objUnion.normal.movementType = headerObjectEventTemplate->objUnion.normal.movementType; SetObjectMovementType(localId, headerObjectEventTemplate->objUnion.normal.movementType); return; } } } // Routines related to the map layout static void InitMapView(void) { move_tilemap_camera_to_upper_left_corner(); CopyMapTilesetsToVram(gMapHeader.mapLayout); LoadMapTilesetPalettes(gMapHeader.mapLayout); DrawWholeMapView(); InitTilesetAnimations(); } static const struct MapLayout *GetMapLayout(void) { u16 mapLayoutId = gSaveBlock1Ptr->mapLayoutId; if (mapLayoutId) return gMapLayouts[mapLayoutId - 1]; return NULL; } // Routines related to warps static const struct WarpData sDummyWarpData = { .mapGroup = MAP_GROUP(UNDEFINED), .mapNum = MAP_NUM(UNDEFINED), .warpId = 0xFF, .x = -1, .y = -1 }; static void ApplyCurrentWarp(void) { gLastUsedWarp = gSaveBlock1Ptr->location; gSaveBlock1Ptr->location = sWarpDestination; sFixedDiveWarp = sDummyWarpData; sFixedHoleWarp = sDummyWarpData; } static void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { warp->mapGroup = mapGroup; warp->mapNum = mapNum; warp->warpId = warpId; warp->x = x; warp->y = y; } static bool32 IsDummyWarp(struct WarpData *warp) { if (warp->mapGroup != (s8)MAP_GROUP(UNDEFINED)) return FALSE; else if (warp->mapNum != (s8)MAP_NUM(UNDEFINED)) return FALSE; else if (warp->warpId != -1) return FALSE; else if (warp->x != -1) return FALSE; else if (warp->y != -1) return FALSE; else return TRUE; } struct MapHeader const *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 mapNum) { return gMapGroups[mapGroup][mapNum]; } struct MapHeader const *const GetDestinationWarpMapHeader(void) { return Overworld_GetMapHeaderByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); } static void LoadCurrentMapData(void) { gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); gSaveBlock1Ptr->mapLayoutId = gMapHeader.mapLayoutId; gMapHeader.mapLayout = GetMapLayout(); } static void LoadSaveblockMapHeader(void) { gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); gMapHeader.mapLayout = GetMapLayout(); } static void SetPlayerCoordsFromWarp(void) { if (gSaveBlock1Ptr->location.warpId >= 0 && gSaveBlock1Ptr->location.warpId < gMapHeader.events->warpCount) { gSaveBlock1Ptr->pos.x = gMapHeader.events->warps[gSaveBlock1Ptr->location.warpId].x; gSaveBlock1Ptr->pos.y = gMapHeader.events->warps[gSaveBlock1Ptr->location.warpId].y; } else if (gSaveBlock1Ptr->location.x >= 0 && gSaveBlock1Ptr->location.y >= 0) { gSaveBlock1Ptr->pos.x = gSaveBlock1Ptr->location.x; gSaveBlock1Ptr->pos.y = gSaveBlock1Ptr->location.y; } else { gSaveBlock1Ptr->pos.x = gMapHeader.mapLayout->width / 2; gSaveBlock1Ptr->pos.y = gMapHeader.mapLayout->height / 2; } } void WarpIntoMap(void) { ApplyCurrentWarp(); LoadCurrentMapData(); SetPlayerCoordsFromWarp(); } void SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { SetWarpData(&sWarpDestination, mapGroup, mapNum, warpId, x, y); } void SetWarpDestinationToMapWarp(s8 mapGroup, s8 mapNum, s8 warpId) { SetWarpDestination(mapGroup, mapNum, warpId, -1, -1); } void SetDynamicWarp(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId) { SetWarpData(&gSaveBlock1Ptr->dynamicWarp, mapGroup, mapNum, warpId, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y); } void SetDynamicWarpWithCoords(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { SetWarpData(&gSaveBlock1Ptr->dynamicWarp, mapGroup, mapNum, warpId, x, y); } void SetWarpDestinationToDynamicWarp(u8 unusedWarpId) { sWarpDestination = gSaveBlock1Ptr->dynamicWarp; } void SetWarpDestinationToHealLocation(u8 healLocationId) { const struct HealLocation *warp = GetHealLocation(healLocationId); if (warp) SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y); } void SetWarpDestinationToLastHealLocation(void) { sWarpDestination = gSaveBlock1Ptr->lastHealLocation; } static void Overworld_SetWhiteoutRespawnPoint(void) { SetWhiteoutRespawnWarpAndHealerNpc(&sWarpDestination); } void SetLastHealLocationWarp(u32 healLocationId) { const struct HealLocation *healLocation = GetHealLocation(healLocationId); if (healLocation) SetWarpData(&gSaveBlock1Ptr->lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y); } void UpdateEscapeWarp(s16 x, s16 y) { u8 currMapType = GetCurrentMapType(); u8 destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); u8 delta; if (IsMapTypeOutdoors(currMapType) && IsMapTypeOutdoors(destMapType) != TRUE && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VIRIDIAN_FOREST) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(VIRIDIAN_FOREST))) { delta = GetPlayerFacingDirection() != DIR_SOUTH; SetEscapeWarp(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x - 7, y - 7 + delta); } } void SetEscapeWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { SetWarpData(&gSaveBlock1Ptr->escapeWarp, mapGroup, mapNum, warpId, x, y); } void SetWarpDestinationToEscapeWarp(void) { sWarpDestination = gSaveBlock1Ptr->escapeWarp; } void SetFixedDiveWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { SetWarpData(&sFixedDiveWarp, mapGroup, mapNum, warpId, x, y); } static void SetWarpDestinationToDiveWarp(void) { sWarpDestination = sFixedDiveWarp; } void SetFixedHoleWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { SetWarpData(&sFixedHoleWarp, mapGroup, mapNum, warpId, x, y); } void SetWarpDestinationToFixedHoleWarp(s16 x, s16 y) { if (IsDummyWarp(&sFixedHoleWarp) == TRUE) sWarpDestination = gLastUsedWarp; else SetWarpDestination(sFixedHoleWarp.mapGroup, sFixedHoleWarp.mapNum, -1, x, y); } static void SetWarpDestinationToContinueGameWarp(void) { sWarpDestination = gSaveBlock1Ptr->continueGameWarp; } static void SetContinueGameWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { SetWarpData(&gSaveBlock1Ptr->continueGameWarp, mapGroup, mapNum, warpId, x, y); } void SetContinueGameWarpToHealLocation(u8 healLocationId) { const struct HealLocation *warp = GetHealLocation(healLocationId); if (warp) SetWarpData(&gSaveBlock1Ptr->continueGameWarp, warp->group, warp->map, -1, warp->x, warp->y); } void SetContinueGameWarpToDynamicWarp(int unused) { gSaveBlock1Ptr->continueGameWarp = gSaveBlock1Ptr->dynamicWarp; } static const struct MapConnection * GetMapConnection(u8 dir) { s32 i; s32 count = gMapHeader.connections->count; const struct MapConnection *connection = gMapHeader.connections->connections; if (connection == NULL) return NULL; for(i = 0; i < count; i++, connection++) if (connection->direction == dir) return connection; return NULL; } static bool8 SetDiveWarp(u8 dir, u16 x, u16 y) { const struct MapConnection *connection = GetMapConnection(dir); if (connection != NULL) { SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y); } else { RunOnDiveWarpMapScript(); if (IsDummyWarp(&sFixedDiveWarp)) return FALSE; SetWarpDestinationToDiveWarp(); } return TRUE; } bool8 SetDiveWarpEmerge(u16 x, u16 y) { return SetDiveWarp(CONNECTION_EMERGE, x, y); } bool8 SetDiveWarpDive(u16 x, u16 y) { return SetDiveWarp(CONNECTION_DIVE, x, y); } // Map loaders void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) { int paletteIndex; SetWarpDestination(mapGroup, mapNum, -1, -1, -1); Overworld_TryMapConnectionMusicTransition(); ApplyCurrentWarp(); LoadCurrentMapData(); LoadObjEventTemplatesFromHeader(); TrySetMapSaveWarpStatus(); ClearTempFieldEventData(); ResetCyclingRoadChallengeData(); RestartWildEncounterImmunitySteps(); MapResetTrainerRematches(mapGroup, mapNum); SetSavedWeatherFromCurrMapHeader(); ChooseAmbientCrySpecies(); SetDefaultFlashLevel(); Overworld_ClearSavedMusic(); RunOnTransitionMapScript(); TryRegenerateRenewableHiddenItems(); InitMap(); CopySecondaryTilesetToVramUsingHeap(gMapHeader.mapLayout); LoadSecondaryTilesetPalette(gMapHeader.mapLayout); for (paletteIndex = 7; paletteIndex < 13; paletteIndex++) ApplyWeatherGammaShiftToPal(paletteIndex); InitSecondaryTilesetAnimation(); UpdateLocationHistoryForRoamer(); RoamerMove(); QL_ResetDefeatedWildMonRecord(); DoCurrentWeather(); ResetFieldTasksArgs(); RunOnResumeMapScript(); if (GetLastUsedWarpMapSectionId() != gMapHeader.regionMapSectionId) ShowMapNamePopup(TRUE); } static void LoadMapFromWarp(bool32 unused) { bool8 isOutdoors; LoadCurrentMapData(); LoadObjEventTemplatesFromHeader(); isOutdoors = IsMapTypeOutdoors(gMapHeader.mapType); TrySetMapSaveWarpStatus(); ClearTempFieldEventData(); ResetCyclingRoadChallengeData(); RestartWildEncounterImmunitySteps(); MapResetTrainerRematches(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); SetSavedWeatherFromCurrMapHeader(); ChooseAmbientCrySpecies(); if (isOutdoors) FlagClear(FLAG_SYS_FLASH_ACTIVE); SetDefaultFlashLevel(); Overworld_ClearSavedMusic(); RunOnTransitionMapScript(); TryRegenerateRenewableHiddenItems(); UpdateLocationHistoryForRoamer(); RoamerMoveToOtherLocationSet(); QL_ResetDefeatedWildMonRecord(); InitMap(); } static void QL_LoadMapNormal(void) { bool8 isOutdoors; LoadCurrentMapData(); LoadObjEventTemplatesFromHeader(); isOutdoors = IsMapTypeOutdoors(gMapHeader.mapType); TrySetMapSaveWarpStatus(); SetSavedWeatherFromCurrMapHeader(); ChooseAmbientCrySpecies(); SetDefaultFlashLevel(); QL_ResetDefeatedWildMonRecord(); QL_RestoreMapLayoutId(); LoadSaveblockMapHeader(); InitMap(); } // Routines related to the initial player avatar state void ResetInitialPlayerAvatarState(void) { sInitialPlayerAvatarState.direction = DIR_SOUTH; sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ON_FOOT; sInitialPlayerAvatarState.hasDirectionSet = FALSE; } void SetInitialPlayerAvatarStateWithDirection(u8 dirn) { sInitialPlayerAvatarState.direction = dirn; sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ON_FOOT; sInitialPlayerAvatarState.hasDirectionSet = TRUE; } void StoreInitialPlayerAvatarState(void) { sInitialPlayerAvatarState.direction = GetPlayerFacingDirection(); if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_MACH_BIKE; else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ACRO_BIKE; else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_SURFING; else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER)) sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_UNDERWATER; else sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ON_FOOT; sInitialPlayerAvatarState.hasDirectionSet = FALSE; } struct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void) { struct InitialPlayerAvatarState playerStruct; u8 mapType = GetCurrentMapType(); u16 metatileBehavior = GetCenterScreenMetatileBehavior(); u8 transitionFlags = GetAdjustedInitialTransitionFlags(&sInitialPlayerAvatarState, metatileBehavior, mapType); playerStruct.transitionFlags = transitionFlags; playerStruct.direction = GetAdjustedInitialDirection(&sInitialPlayerAvatarState, transitionFlags, metatileBehavior, mapType); playerStruct.hasDirectionSet = FALSE; sInitialPlayerAvatarState = playerStruct; return &sInitialPlayerAvatarState; } static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, u8 mapType) { if (mapType != MAP_TYPE_INDOOR && FlagGet(FLAG_SYS_CRUISE_MODE)) return PLAYER_AVATAR_FLAG_ON_FOOT; else if (mapType == MAP_TYPE_UNDERWATER) return PLAYER_AVATAR_FLAG_UNDERWATER; else if (MetatileBehavior_IsSurfableInSeafoamIslands(metatileBehavior) == TRUE) return PLAYER_AVATAR_FLAG_ON_FOOT; else if (MetatileBehavior_IsSurfable(metatileBehavior) == TRUE) return PLAYER_AVATAR_FLAG_SURFING; else if (Overworld_IsBikingAllowed() != TRUE) return PLAYER_AVATAR_FLAG_ON_FOOT; else if (playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_MACH_BIKE) return PLAYER_AVATAR_FLAG_MACH_BIKE; else if (playerStruct->transitionFlags != PLAYER_AVATAR_FLAG_ACRO_BIKE) return PLAYER_AVATAR_FLAG_ON_FOOT; else return PLAYER_AVATAR_FLAG_ACRO_BIKE; } bool8 MetatileBehavior_IsSurfableInSeafoamIslands(u16 metatileBehavior) { if (MetatileBehavior_IsSurfable(metatileBehavior) != TRUE) return FALSE; if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEAFOAM_ISLANDS_B3F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEAFOAM_ISLANDS_B3F)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEAFOAM_ISLANDS_B4F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEAFOAM_ISLANDS_B4F))) return TRUE; return FALSE; } static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, u8 mapType) { if (FlagGet(FLAG_SYS_CRUISE_MODE) && mapType == MAP_TYPE_OCEAN_ROUTE) return DIR_EAST; else if (MetatileBehavior_IsDeepSouthWarp(metatileBehavior) == TRUE) return DIR_NORTH; else if (MetatileBehavior_IsNonAnimDoor(metatileBehavior) == TRUE || MetatileBehavior_IsWarpDoor_2(metatileBehavior) == TRUE) return DIR_SOUTH; else if (MetatileBehavior_IsSouthArrowWarp(metatileBehavior) == TRUE) return DIR_NORTH; else if (MetatileBehavior_IsNorthArrowWarp(metatileBehavior) == TRUE) return DIR_SOUTH; else if (MetatileBehavior_IsWestArrowWarp(metatileBehavior) == TRUE) return DIR_EAST; else if (MetatileBehavior_IsEastArrowWarp(metatileBehavior) == TRUE) return DIR_WEST; else if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior) == TRUE || MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior) == TRUE) return DIR_WEST; else if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior) == TRUE || MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior) == TRUE) return DIR_EAST; else if ((playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER && transitionFlags == PLAYER_AVATAR_FLAG_SURFING) || (playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_SURFING && transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER )) return playerStruct->direction; else if (MetatileBehavior_IsLadder(metatileBehavior) == TRUE) return playerStruct->direction; else if (playerStruct->hasDirectionSet) return playerStruct->direction; else return DIR_SOUTH; } static u16 GetCenterScreenMetatileBehavior(void) { return MapGridGetMetatileBehaviorAt(gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7); } // Routines related to flash level and map perms bool32 Overworld_IsBikingAllowed(void) { if (!gMapHeader.bikingAllowed) return FALSE; else return TRUE; } static void SetDefaultFlashLevel(void) { if (!gMapHeader.cave) gSaveBlock1Ptr->flashLevel = 0; else if (FlagGet(FLAG_SYS_FLASH_ACTIVE)) gSaveBlock1Ptr->flashLevel = 0; else gSaveBlock1Ptr->flashLevel = gMaxFlashLevel; } void SetFlashLevel(s32 flashLevel) { if (flashLevel < 0 || flashLevel > gMaxFlashLevel) flashLevel = 0; gSaveBlock1Ptr->flashLevel = flashLevel; } u8 Overworld_GetFlashLevel(void) { return gSaveBlock1Ptr->flashLevel; } void SetCurrentMapLayout(u16 mapLayoutId) { gSaveBlock1Ptr->mapLayoutId = mapLayoutId; gMapHeader.mapLayout = GetMapLayout(); } void Overworld_SetWarpDestinationFromWarp(struct WarpData * warp) { sWarpDestination = *warp; } // Routines related to map music static u16 GetLocationMusic(struct WarpData * warp) { if(FlagGet(FLAG_SYS_ON_CYCLING_ROAD)) return MUS_CYCLING; return Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum)->music; } static u16 GetCurrLocationDefaultMusic(void) { u16 music; music = GetLocationMusic(&gSaveBlock1Ptr->location); if(music == MUS_SILPH && FlagGet(FLAG_HIDE_SILPH_ROCKETS)) { music = MUS_GSC_PEWTER; } return music; } static u16 GetWarpDestinationMusic(void) { u16 music = GetLocationMusic(&sWarpDestination); if(music == MUS_SILPH && FlagGet(FLAG_HIDE_SILPH_ROCKETS)) { music = MUS_GSC_PEWTER; } return music; } void Overworld_ResetMapMusic(void) { ResetMapMusic(); } void Overworld_PlaySpecialMapMusic(void) { u16 music; s16 x, y; if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_STOP) { StopMapMusic(); return; } if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_KEEP) return; if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM)) { PlayerGetDestCoords(&x, &y); if (y - 7 < 11 && gMPlayInfo_BGM.songHeader == &mus_victory_gym_leader) { FadeInBGM(4); return; } } music = GetCurrLocationDefaultMusic(); if (gSaveBlock1Ptr->savedMusic) music = gSaveBlock1Ptr->savedMusic; else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && Overworld_MusicCanOverrideMapMusic(MUS_SURF)) music = MUS_SURF; if (music != GetCurrentMapMusic()) PlayNewMapMusic(music); } void Overworld_SetSavedMusic(u16 songNum) { gSaveBlock1Ptr->savedMusic = songNum; } void Overworld_ClearSavedMusic(void) { gSaveBlock1Ptr->savedMusic = 0; } static void Overworld_TryMapConnectionMusicTransition(void) { u16 newMusic; u16 currentMusic; if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_STOP) { StopMapMusic(); return; } if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_KEEP) return; if (FlagGet(FLAG_DONT_TRANSITION_MUSIC) != TRUE) { newMusic = GetWarpDestinationMusic(); currentMusic = GetCurrentMapMusic(); if (currentMusic == MUS_SURF) return; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && Overworld_MusicCanOverrideMapMusic(MUS_SURF)) newMusic = MUS_SURF; if (newMusic != currentMusic) { if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) FadeOutAndFadeInNewMapMusic(newMusic, 4, 4); else FadeOutAndPlayNewMapMusic(newMusic, 8); } } } void Overworld_ChangeMusicToDefault(void) { u16 currentMusic = GetCurrentMapMusic(); if (currentMusic != GetCurrLocationDefaultMusic()) FadeOutAndPlayNewMapMusic(GetCurrLocationDefaultMusic(), 8); } void Overworld_ChangeMusicTo(u16 newMusic) { u16 currentMusic = GetCurrentMapMusic(); if (currentMusic != newMusic) FadeOutAndPlayNewMapMusic(newMusic, 8); } // rendered unused as a QoL feature. Warps are almost instant without the artificial music delay. static u8 GetMapMusicFadeoutSpeed(void) { const struct MapHeader *mapHeader = GetDestinationWarpMapHeader(); if (IsMapTypeIndoors(mapHeader->mapType) == TRUE) return 2; else return 4; } void TryFadeOutOldMapMusic(void) { u16 warpMusic = GetWarpDestinationMusic(); if (FlagGet(FLAG_DONT_TRANSITION_MUSIC) != TRUE && warpMusic != GetCurrentMapMusic()) { FadeOutMapMusic(1); } } bool8 BGMusicStopped(void) { return IsNotWaitingForBGMStop(); } void Overworld_FadeOutMapMusic(void) { FadeOutMapMusic(4); } static void PlayAmbientCry(void) { s16 x, y; s8 pan; s8 volume; PlayerGetDestCoords(&x, &y); if (sIsAmbientCryWaterMon == TRUE && !MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y))) return; pan = (Random() % 88) + 212; volume = (Random() % 30) + 50; if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_STOP) { StopMapMusic(); return; } if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_KEEP) return; PlayCry_NormalNoDucking(sAmbientCrySpecies, pan, volume, CRY_PRIORITY_AMBIENT); } void UpdateAmbientCry(s16 *state, u16 *delayCounter) { u8 i, monsCount, divBy; switch (*state) { case 0: if (sAmbientCrySpecies == SPECIES_NONE) *state = 4; else *state = 1; break; case 1: *delayCounter = (Random() % 2400) + 1200; *state = 3; break; case 2: divBy = 1; monsCount = CalculatePlayerPartyCount(); for (i = 0; i < monsCount; i++) { if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && GetMonAbility(&gPlayerParty[0]) == ABILITY_SWARM) { divBy = 2; break; } } *delayCounter = ((Random() % 1200) + 1200) / divBy; *state = 3; break; case 3: (*delayCounter)--; if (*delayCounter == 0) { PlayAmbientCry(); *state = 2; } break; case 4: break; } } static void ChooseAmbientCrySpecies(void) { sAmbientCrySpecies = GetLocalWildMon(&sIsAmbientCryWaterMon); } bool32 Overworld_MusicCanOverrideMapMusic(u16 music) { if (music == MUS_CYCLING || music == MUS_SURF) { if (gMapHeader.regionMapSectionId == MAPSEC_KANTO_VICTORY_ROAD || gMapHeader.regionMapSectionId == MAPSEC_ROUTE_23 || gMapHeader.regionMapSectionId == MAPSEC_INDIGO_PLATEAU) return FALSE; } return TRUE; } u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum) { return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->mapType; } static u8 GetMapTypeByWarpData(struct WarpData *warp) { return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum); } u8 GetCurrentMapType(void) { return GetMapTypeByWarpData(&gSaveBlock1Ptr->location); } u8 GetLastUsedWarpMapType(void) { return GetMapTypeByWarpData(&gLastUsedWarp); } u8 GetLastUsedWarpMapSectionId(void) { return Overworld_GetMapHeaderByGroupAndId(gLastUsedWarp.mapGroup, gLastUsedWarp.mapNum)->regionMapSectionId; } bool8 IsMapTypeOutdoors(u8 mapType) { if (mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_UNDERWATER || mapType == MAP_TYPE_CITY || mapType == MAP_TYPE_OCEAN_ROUTE) return TRUE; else return FALSE; } bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType) { if(GetCurrentRegionMapSectionId() == MAPSEC_FARAWAY_ISLAND || GetCurrentRegionMapSectionId() == MAPSEC_SOUTHERN_ISLAND) return FALSE; if(GetCurrentRegionMapSectionId() == MAPSEC_BATTLE_FRONTIER) return FALSE; if (mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_OCEAN_ROUTE || mapType == MAP_TYPE_CITY) return TRUE; else return FALSE; } bool8 IsMapTypeIndoors(u8 mapType) { if (mapType == MAP_TYPE_INDOOR || mapType == MAP_TYPE_SECRET_BASE) return TRUE; else return FALSE; } static u8 GetSavedWarpRegionMapSectionId(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->dynamicWarp.mapGroup, gSaveBlock1Ptr->dynamicWarp.mapNum)->regionMapSectionId; } u8 GetCurrentRegionMapSectionId(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId; } u8 GetCurrentMapBattleScene(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->battleType; } static const int sUnusedData[] = { 1200, 3600, 1200, 2400, 50, 80, -44, 44 }; const struct Coords32 gDirectionToVectors[] = { [DIR_NONE] = { 0, 0}, [DIR_SOUTH] = { 0, 1}, [DIR_NORTH] = { 0, -1}, [DIR_WEST] = {-1, 0}, [DIR_EAST] = { 1, 0}, [DIR_SOUTHWEST] = {-1, 1}, [DIR_SOUTHEAST] = { 1, 1}, [DIR_NORTHWEST] = {-1, -1}, [DIR_NORTHEAST] = { 1, -1}, }; static const struct BgTemplate sOverworldBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 } }; static void InitOverworldBgs(void) { MoveSaveBlocks_ResetHeap_(); ResetScreenForMapLoad(); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sOverworldBgTemplates, NELEMS(sOverworldBgTemplates)); SetBgAttribute(1, BG_ATTR_MOSAIC, TRUE); SetBgAttribute(2, BG_ATTR_MOSAIC, TRUE); SetBgAttribute(3, BG_ATTR_MOSAIC, TRUE); gBGTilemapBuffers2 = AllocZeroed(BG_SCREEN_SIZE); gBGTilemapBuffers1 = AllocZeroed(BG_SCREEN_SIZE); gBGTilemapBuffers3 = AllocZeroed(BG_SCREEN_SIZE); SetBgTilemapBuffer(1, gBGTilemapBuffers2); SetBgTilemapBuffer(2, gBGTilemapBuffers1); SetBgTilemapBuffer(3, gBGTilemapBuffers3); InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); InitFieldMessageBox(); } static void InitOverworldBgs_NoResetHeap(void) { ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sOverworldBgTemplates, NELEMS(sOverworldBgTemplates)); SetBgAttribute(1, BG_ATTR_MOSAIC, TRUE); SetBgAttribute(2, BG_ATTR_MOSAIC, TRUE); SetBgAttribute(3, BG_ATTR_MOSAIC, TRUE); gBGTilemapBuffers2 = AllocZeroed(BG_SCREEN_SIZE); gBGTilemapBuffers1 = AllocZeroed(BG_SCREEN_SIZE); gBGTilemapBuffers3 = AllocZeroed(BG_SCREEN_SIZE); SetBgTilemapBuffer(1, gBGTilemapBuffers2); SetBgTilemapBuffer(2, gBGTilemapBuffers1); SetBgTilemapBuffer(3, gBGTilemapBuffers3); InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); InitFieldMessageBox(); } void CleanupOverworldWindowsAndTilemaps(void) { FreeAllOverworldWindowBuffers(); Free(gBGTilemapBuffers3); Free(gBGTilemapBuffers1); Free(gBGTilemapBuffers2); } static void ResetSafariZoneFlag_(void) { ResetSafariZoneFlag(); } bool32 IsUpdateLinkStateCBActive(void) { if (gMain.callback1 == CB1_UpdateLinkState) return TRUE; else return FALSE; } static void DoCB1_Overworld(u16 newKeys, u16 heldKeys) { struct FieldInput fieldInput; QL_TryRunActions(); UpdatePlayerAvatarTransitionState(); FieldClearPlayerInput(&fieldInput); FieldGetPlayerInput(&fieldInput, newKeys, heldKeys); FieldInput_HandleCancelSignpost(&fieldInput); if (!ArePlayerFieldControlsLocked()) { if (ProcessPlayerFieldInput(&fieldInput) == TRUE) { if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING) QL_RecordFieldInput(&gFieldInputRecord); LockPlayerFieldControls(); DismissMapNamePopup(); } else { player_step(fieldInput.dpadDirection, newKeys, heldKeys); } } RunQuestLogCB(); } static void DoCB1_Overworld_QuestLogPlayback(void) { struct FieldInput fieldInput; QL_TryRunActions(); UpdatePlayerAvatarTransitionState(); QL_HandleInput(); FieldClearPlayerInput(&fieldInput); fieldInput = gQuestLogFieldInput; FieldInput_HandleCancelSignpost(&fieldInput); if (!ArePlayerFieldControlsLocked()) { if (ProcessPlayerFieldInput(&fieldInput) == TRUE) { LockPlayerFieldControls(); DismissMapNamePopup(); } else { RunQuestLogCB(); } } else if (QuestLogScenePlaybackIsEnding() == TRUE) { RunQuestLogCB(); } FieldClearPlayerInput(&gQuestLogFieldInput); } void CB1_Overworld(void) { if (gMain.callback2 == CB2_Overworld) { if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING || gQuestLogState == QL_STATE_PLAYBACK) DoCB1_Overworld_QuestLogPlayback(); else DoCB1_Overworld(gMain.newKeys, gMain.heldKeys); } } static void OverworldBasic(void) { ScriptContext_RunScript(); RunTasks(); AnimateSprites(); CameraUpdate(); SetQuestLogEvent_Arrived(); UpdateCameraPanning(); BuildOamBuffer(); UpdatePaletteFade(); UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); } // This CB2 is used when starting void CB2_OverworldBasic(void) { OverworldBasic(); } static void CB2_Overworld(void) { bool32 fading = !!gPaletteFade.active; if (fading) SetVBlankCallback(NULL); OverworldBasic(); if (fading) SetFieldVBlankCallback(); } void SetMainCallback1(MainCallback cb) { gMain.callback1 = cb; } static bool8 RunFieldCallback(void) { if (gFieldCallback2) { if (!gFieldCallback2()) return FALSE; else { gFieldCallback2 = NULL; gFieldCallback = NULL; } } else { if (gFieldCallback) gFieldCallback(); else FieldCB_DefaultWarpExit(); gFieldCallback = NULL; } return TRUE; } void CB2_NewGame(void) { u8 versionBackup = gSaveBlock1Ptr->keyFlags.version; FieldClearVBlankHBlankCallbacks(); StopMapMusic(); ResetSafariZoneFlag_(); NewGameInitData(); AddBagItem(ITEM_BERRY_POUCH, 1); AddBagItem(ITEM_TM_CASE, 1); gSaveBlock1Ptr->keyFlags.version = versionBackup; ResetInitialPlayerAvatarState(); PlayTimeCounter_Start(); ScriptContext_Init(); UnlockPlayerFieldControls(); gFieldCallback = FieldCB_WarpExitFadeFromBlack; gFieldCallback2 = NULL; DoMapLoadLoop(&gMain.state); SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); SetMainCallback2(CB2_Overworld); } void CB2_WhiteOut(void) { u8 val; if (++gMain.state >= 120) { FieldClearVBlankHBlankCallbacks(); StopMapMusic(); ResetSafariZoneFlag_(); DoWhiteOut(); SetInitialPlayerAvatarStateWithDirection(DIR_NORTH); ScriptContext_Init(); UnlockPlayerFieldControls(); gFieldCallback = FieldCB_RushInjuredPokemonToCenter; val = 0; if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || gSaveBlock1Ptr->keyFlags.noPMC == 1) { if(GetFirstAliveBoxMon() == 420) //no usable Pokemon { gGlobalFieldTintMode = 1; //should grayscale palettes? } } DoMapLoadLoop(&val); QuestLog_CutRecording(); SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); SetMainCallback2(CB2_Overworld); } } void CB2_LoadMap(void) { FieldClearVBlankHBlankCallbacks(); ScriptContext_Init(); UnlockPlayerFieldControls(); SetMainCallback1(NULL); SetMainCallback2(CB2_DoChangeMap); gMain.savedCallback = CB2_LoadMap2; } static void CB2_LoadMap2(void) { DoMapLoadLoop(&gMain.state); if (QuestLog_ShouldEndSceneOnMapChange() == TRUE) { QuestLog_AdvancePlayhead_(); } else { SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); SetMainCallback2(CB2_Overworld); } } void CB2_ReturnToFieldCableClub(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback = FieldCB_ReturnToFieldWirelessLink; SetMainCallback2(CB2_LoadMapOnReturnToFieldCableClub); } static void CB2_LoadMapOnReturnToFieldCableClub(void) { if (LoadMapInStepsLink(&gMain.state)) { SetFieldVBlankCallback(); SetMainCallback1(CB1_UpdateLinkState); ResetAllMultiplayerState(); SetMainCallback2(CB2_Overworld); } } void CB2_ReturnToField(void) { if (IsUpdateLinkStateCBActive() == TRUE) { SetMainCallback2(CB2_ReturnToFieldLink); } else { FieldClearVBlankHBlankCallbacks(); SetMainCallback2(CB2_ReturnToFieldLocal); } } static void CB2_ReturnToFieldLocal(void) { if (ReturnToFieldLocal(&gMain.state)) { SetFieldVBlankCallback(); SetMainCallback2(CB2_Overworld); } } static void CB2_ReturnToFieldLink(void) { if (!Overworld_LinkRecvQueueLengthMoreThan2() && ReturnToFieldLink(&gMain.state)) SetMainCallback2(CB2_Overworld); } void CB2_ReturnToFieldFromMultiplayer(void) { FieldClearVBlankHBlankCallbacks(); StopMapMusic(); SetMainCallback1(CB1_UpdateLinkState); ResetAllMultiplayerState(); if (gWirelessCommType != 0) gFieldCallback = FieldCB_ReturnToFieldWirelessLink; else gFieldCallback = FieldCB_ReturnToFieldCableLink; ScriptContext_Init(); UnlockPlayerFieldControls(); CB2_ReturnToField(); } void CB2_ReturnToFieldWithOpenMenu(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback2 = FieldCB_ReturnToFieldOpenStartMenu; CB2_ReturnToField(); } void CB2_ReturnToFieldContinueScript(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback = FieldCB_ContinueScript; CB2_ReturnToField(); } void CB2_ReturnToFieldContinueScriptPlayMapMusic(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback = FieldCB_ContinueScriptHandleMusic; CB2_ReturnToField(); } void CB2_ReturnToFieldFromDiploma(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback = FieldCB_WarpExitFadeFromBlack; CB2_ReturnToField(); } static void FieldCB_ShowMapNameOnContinue(void) { if (gMapHeader.showMapName == TRUE) ShowMapNamePopup(FALSE); FieldCB_WarpExitFadeFromBlack(); } void CB2_ContinueSavedGame(void) { FieldClearVBlankHBlankCallbacks(); StopMapMusic(); ResetSafariZoneFlag_(); LoadSaveblockMapHeader(); LoadSaveblockObjEventScripts(); UnfreezeObjectEvents(); Overworld_ResetStateOnContinue(); InitMapFromSavedGame(); PlayTimeCounter_Start(); ScriptContext_Init(); UnlockPlayerFieldControls(); gFieldCallback2 = NULL; gExitStairsMovementDisabled = TRUE; if (UseContinueGameWarp() == TRUE) { ClearContinueGameWarpStatus(); SetWarpDestinationToContinueGameWarp(); WarpIntoMap(); SetMainCallback2(CB2_LoadMap); } else { gFieldCallback = FieldCB_ShowMapNameOnContinue; SetMainCallback1(CB1_Overworld); CB2_ReturnToField(); } } static void FieldClearVBlankHBlankCallbacks(void) { if (UsedPokemonCenterWarp() == TRUE) CloseLink(); if (gWirelessCommType != 0) { EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); DisableInterrupts(INTR_FLAG_HBLANK); } else { DisableInterrupts(INTR_FLAG_HBLANK); EnableInterrupts(INTR_FLAG_VBLANK); } SetVBlankCallback(NULL); SetHBlankCallback(NULL); } static void SetFieldVBlankCallback(void) { SetVBlankCallback(VBlankCB_Field); } static void VBlankCB_Field(void) { LoadOam(); ProcessSpriteCopyRequests(); ScanlineEffect_InitHBlankDmaTransfer(); FieldUpdateBgTilemapScroll(); TransferPlttBuffer(); TransferTilesetAnimsBuffer(); } static void InitCurrentFlashLevelScanlineEffect(void) { u8 flashLevel = Overworld_GetFlashLevel(); if (flashLevel != 0) { WriteFlashScanlineEffectBuffer(flashLevel); ScanlineEffect_SetParams((struct ScanlineEffectParams){ .dmaDest = ®_WIN0H, .dmaControl = (2 >> 1) | ((DMA_16BIT | DMA_DEST_RELOAD | DMA_SRC_INC | DMA_REPEAT | DMA_START_HBLANK | DMA_ENABLE) << 16), .initState = 1, .unused9 = 0 }); } } static bool32 LoadMapInStepsLink(u8 *state) { switch (*state) { case 0: InitOverworldBgs(); ScriptContext_Init(); UnlockPlayerFieldControls(); (*state)++; break; case 1: LoadMapFromWarp(TRUE); (*state)++; break; case 2: ResumeMap(TRUE); (*state)++; break; case 3: OffsetCameraFocusByLinkPlayerId(); InitObjectEventsLink(); SpawnLinkPlayers(); SetCameraToTrackGuestPlayer(); SetHelpContextForMap(); (*state)++; break; case 4: InitCurrentFlashLevelScanlineEffect(); InitOverworldGraphicsRegisters(); (*state)++; break; case 5: move_tilemap_camera_to_upper_left_corner(); (*state)++; break; case 6: CopyPrimaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 7: CopySecondaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 8: if (FreeTempTileDataBuffersIfPossible() != TRUE) { LoadMapTilesetPalettes(gMapHeader.mapLayout); (*state)++; } break; case 9: DrawWholeMapView(); (*state)++; break; case 10: InitTilesetAnimations(); (*state)++; break; case 11: if (gWirelessCommType != 0) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } (*state)++; break; case 12: if (RunFieldCallback()) (*state)++; break; case 13: return TRUE; } return FALSE; } static bool32 LoadMapInStepsLocal(u8 *state, bool32 inLink) { switch (*state) { case 0: InitOverworldBgs(); FieldClearVBlankHBlankCallbacks(); LoadMapFromWarp(inLink); (*state)++; break; case 1: QuestLog_InitPalettesBackup(); (*state)++; break; case 2: ResumeMap(inLink); (*state)++; break; case 3: if (QuestLog_ShouldEndSceneOnMapChange() == TRUE) return TRUE; (*state)++; break; case 4: InitObjectEventsLocal(); SetCameraToTrackPlayer(); if (gQuestLogState != QL_STATE_PLAYBACK) { QuestLog_CheckDepartingIndoorsMap(); QuestLog_TryRecordDepartedLocation(); } SetHelpContextForMap(); (*state)++; break; case 5: InitCurrentFlashLevelScanlineEffect(); InitOverworldGraphicsRegisters(); (*state)++; break; case 6: move_tilemap_camera_to_upper_left_corner(); (*state)++; break; case 7: CopyPrimaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 8: CopySecondaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 9: if (FreeTempTileDataBuffersIfPossible() != TRUE) { LoadMapTilesetPalettes(gMapHeader.mapLayout); (*state)++; } break; case 10: DrawWholeMapView(); (*state)++; break; case 11: InitTilesetAnimations(); (*state)++; break; case 12: if (GetLastUsedWarpMapSectionId() != gMapHeader.regionMapSectionId && MapHasPreviewScreen_HandleQLState2(gMapHeader.regionMapSectionId, MPS_TYPE_FOREST) == TRUE) { MapPreview_LoadGfx(gMapHeader.regionMapSectionId); MapPreview_StartForestTransition(gMapHeader.regionMapSectionId); } else if (gMapHeader.showMapName == TRUE) { ShowMapNamePopup(FALSE); } (*state)++; break; case 13: if (RunFieldCallback()) (*state)++; break; case 14: return TRUE; } return FALSE; } static bool32 ReturnToFieldLocal(u8 *state) { switch (*state) { case 0: InitOverworldBgs(); QuestLog_InitPalettesBackup(); ResumeMap(FALSE); ReloadObjectsAndRunReturnToFieldMapScript(); SetCameraToTrackPlayer(); (*state)++; break; case 1: (*state)++; break; case 2: InitViewGraphics(); SetHelpContextForMap(); (*state)++; break; case 3: if (RunFieldCallback()) (*state)++; break; case 4: return TRUE; } return FALSE; } static bool32 ReturnToFieldLink(u8 *state) { switch (*state) { case 0: InitOverworldBgs(); FieldClearVBlankHBlankCallbacks(); (*state)++; break; case 1: QuestLog_InitPalettesBackup(); ResumeMap(TRUE); (*state)++; break; case 2: CreateLinkPlayerSprites(); ReloadObjectsAndRunReturnToFieldMapScript(); SetCameraToTrackGuestPlayer_2(); SetHelpContextForMap(); (*state)++; break; case 3: InitCurrentFlashLevelScanlineEffect(); InitOverworldGraphicsRegisters(); (*state)++; break; case 4: move_tilemap_camera_to_upper_left_corner(); (*state)++; break; case 5: CopyPrimaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 6: CopySecondaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 7: if (FreeTempTileDataBuffersIfPossible() != TRUE) { LoadMapTilesetPalettes(gMapHeader.mapLayout); (*state)++; } break; case 8: DrawWholeMapView(); (*state)++; break; case 9: InitTilesetAnimations(); (*state)++; break; case 10: (*state)++; break; case 11: if (gWirelessCommType != 0) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } (*state)++; break; case 12: if (RunFieldCallback()) (*state)++; break; case 13: SetFieldVBlankCallback(); (*state)++; return TRUE; } return FALSE; } void DoMapLoadLoop(u8 *state) { while (!LoadMapInStepsLocal(state, FALSE)) ; } static void MoveSaveBlocks_ResetHeap_(void) { MoveSaveBlocks_ResetHeap(); } static void ResetScreenForMapLoad(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); ScanlineEffect_Stop(); DmaClear16(3, PLTT + 2, PLTT_SIZE - 2); DmaFillLarge16(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); ResetOamRange(0, 128); LoadOam(); } static void InitViewGraphics(void) { InitCurrentFlashLevelScanlineEffect(); InitOverworldGraphicsRegisters(); InitMapView(); } static void InitOverworldGraphicsRegisters(void) { ClearScheduledBgCopiesToVram(); ResetTempTileDataBuffers(); SetGpuReg(REG_OFFSET_MOSAIC, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WINOBJ_BG0); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 255)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255)); SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(255, 255)); SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(255, 255)); SetGpuReg(REG_OFFSET_BLDCNT, gOverworldBackgroundLayerFlags[1] | gOverworldBackgroundLayerFlags[2] | gOverworldBackgroundLayerFlags[3] | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(13, 7)); ScheduleBgCopyTilemapToVram(1); ScheduleBgCopyTilemapToVram(2); ScheduleBgCopyTilemapToVram(3); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | 0x20 | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); } static void ResumeMap(bool32 inLink) { ResetTasks(); ResetSpriteData(); ResetPaletteFade(); ScanlineEffect_Clear(); ResetAllPicSprites(); ResetCameraUpdateInfo(); InstallCameraPanAheadCallback(); if (!inLink) InitObjectEventPalettes(0); else InitObjectEventPalettes(1); FieldEffectActiveListClear(); StartWeather(); ResumePausedWeather(); if (!inLink) SetUpFieldTasks(); RunOnResumeMapScript(); } static void InitObjectEventsLink(void) { gTotalCameraPixelOffsetX = 0; gTotalCameraPixelOffsetY = 0; ResetObjectEvents(); TrySpawnObjectEvents(0, 0); TryRunOnWarpIntoMapScript(); } static void InitObjectEventsLocal(void) { s16 x, y; struct InitialPlayerAvatarState *player; gTotalCameraPixelOffsetX = 0; gTotalCameraPixelOffsetY = 0; ResetObjectEvents(); GetCameraFocusCoords(&x, &y); player = GetInitialPlayerAvatarState(); InitPlayerAvatar(x, y, player->direction, gSaveBlock2Ptr->playerGender); SetPlayerAvatarTransitionFlags(player->transitionFlags); ResetInitialPlayerAvatarState(); TrySpawnObjectEvents(0, 0); TryRunOnWarpIntoMapScript(); } static void ReloadObjectsAndRunReturnToFieldMapScript(void) { SpawnObjectEventsOnReturnToField(0, 0); RunOnReturnToFieldMapScript(); } static void SetCameraToTrackPlayer(void) { gObjectEvents[gPlayerAvatar.objectEventId].trackedByCamera = TRUE; InitCameraUpdateCallback(gPlayerAvatar.spriteId); } static void SetCameraToTrackGuestPlayer(void) { InitCameraUpdateCallback(GetSpriteForLinkedPlayer(gLocalLinkPlayerId)); } // Duplicate function. static void SetCameraToTrackGuestPlayer_2(void) { InitCameraUpdateCallback(GetSpriteForLinkedPlayer(gLocalLinkPlayerId)); } static void OffsetCameraFocusByLinkPlayerId(void) { u16 x, y; GetCameraFocusCoords(&x, &y); // This is a hack of some kind; it's undone in SpawnLinkPlayers, which is called // soon after this function. SetCameraFocusCoords(x + gLocalLinkPlayerId, y); } static void SpawnLinkPlayers(void) { u32 i; u16 x, y; GetCameraFocusCoords(&x, &y); x -= gLocalLinkPlayerId; for (i = 0; i < gFieldLinkPlayerCount; i++) { SpawnLinkPlayerObjectEvent(i, i + x, y, gLinkPlayers[i].gender); CreateLinkPlayerSprite(i, gLinkPlayers[i].version); } ClearAllPlayerKeys(); } static void CreateLinkPlayerSprites(void) { u32 i; for (i = 0; i < gFieldLinkPlayerCount; i++) CreateLinkPlayerSprite(i, gLinkPlayers[i].version); } // Quest Log void CB2_SetUpOverworldForQLPlaybackWithWarpExit(void) { FieldClearVBlankHBlankCallbacks(); gGlobalFieldTintMode = QL_TINT_GRAYSCALE; ScriptContext_Init(); UnlockPlayerFieldControls(); SetMainCallback1(NULL); SetMainCallback2(CB2_DoChangeMap); gMain.savedCallback = CB2_LoadMapForQLPlayback; } void CB2_SetUpOverworldForQLPlayback(void) { FieldClearVBlankHBlankCallbacks(); gGlobalFieldTintMode = QL_TINT_GRAYSCALE; LoadSaveblockMapHeader(); ScriptContext_Init(); UnlockPlayerFieldControls(); SetMainCallback1(NULL); SetMainCallback2(CB2_LoadMapForQLPlayback); } static void CB2_LoadMapForQLPlayback(void) { DoLoadMap_QLPlayback(&gMain.state); SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); SetMainCallback2(CB2_Overworld); } static void DoLoadMap_QLPlayback(u8 *state) { while (!LoadMap_QLPlayback(state)) ; } static bool32 LoadMap_QLPlayback(u8 *state) { switch (*state) { case 0: InitOverworldBgs(); FieldClearVBlankHBlankCallbacks(); QuestLog_InitPalettesBackup(); QL_CopySaveState(); QL_ResetPartyAndPC(); if (GetQuestLogStartType() == QL_START_WARP) { gExitStairsMovementDisabled = FALSE; LoadMapFromWarp(FALSE); } else { gExitStairsMovementDisabled = TRUE; QL_LoadMapNormal(); } (*state)++; break; case 1: QL_InitSceneObjectsAndActions(); (*state)++; break; case 2: ResumeMap(FALSE); (*state)++; break; case 3: ReloadObjectsAndRunReturnToFieldMapScript(); SetCameraToTrackPlayer(); (*state)++; break; case 4: InitCurrentFlashLevelScanlineEffect(); InitOverworldGraphicsRegisters(); (*state)++; break; case 5: move_tilemap_camera_to_upper_left_corner(); (*state)++; break; case 6: CopyPrimaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 7: CopySecondaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 8: if (FreeTempTileDataBuffersIfPossible() != TRUE) { LoadMapTilesetPalettes(gMapHeader.mapLayout); (*state)++; } break; case 9: DrawWholeMapView(); (*state)++; break; case 10: InitTilesetAnimations(); QL_TryStopSurfing(); (*state)++; break; default: if (RunFieldCallback()) return TRUE; break; } return FALSE; } void CB2_EnterFieldFromQuestLog(void) { FieldClearVBlankHBlankCallbacks(); StopMapMusic(); gGlobalFieldTintMode = QL_TINT_BACKUP_GRAYSCALE; ResetSafariZoneFlag_(); LoadSaveblockMapHeader(); LoadSaveblockObjEventScripts(); UnfreezeObjectEvents(); Overworld_ResetStateOnContinue(); InitMapFromSavedGame(); PlayTimeCounter_Start(); CheckNationalDexEligibilityOnSaveLoad(); ScriptContext_Init(); gExitStairsMovementDisabled = TRUE; if (UseContinueGameWarp() == TRUE) { ClearContinueGameWarpStatus(); SetWarpDestinationToContinueGameWarp(); WarpIntoMap(); SetMainCallback2(CB2_LoadMap); } else { SetMainCallback1(CB1_Overworld); CB2_ReturnToField(); } } // Credits void Overworld_CreditsMainCB(void) { bool8 fading = !!gPaletteFade.active; if (fading) SetVBlankCallback(NULL); RunTasks(); AnimateSprites(); CameraUpdateNoObjectRefresh(); UpdateCameraPanning(); BuildOamBuffer(); UpdatePaletteFade(); UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); if (fading) SetFieldVBlankCallback(); } static bool8 FieldCB2_Credits_WaitFade(void) { if (gPaletteFade.active) return TRUE; else return FALSE; } bool32 Overworld_DoScrollSceneForCredits(u8 *state_p, const struct CreditsOverworldCmd * script, u8 tintMode) { sCreditsOverworld_Script = script; gGlobalFieldTintMode = tintMode; return SetUpScrollSceneForCredits(state_p, 0); } static bool32 SetUpScrollSceneForCredits(u8 *state, u8 unused) { struct WarpData warp; switch (*state) { case 0: sCreditsOverworld_CmdIndex = 0; sCreditsOverworld_CmdLength = 0; (*state)++; return FALSE; case 1: warp.mapGroup = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_2; warp.mapNum = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_4; warp.warpId = -1; sCreditsOverworld_CmdIndex++; warp.x = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_0; warp.y = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_2; sWarpDestination = warp; sCreditsOverworld_CmdLength = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_4; WarpIntoMap(); gPaletteFade.bufferTransferDisabled = TRUE; ScriptContext_Init(); UnlockPlayerFieldControls(); SetMainCallback1(NULL); gFieldCallback2 = FieldCB2_Credits_WaitFade; gMain.state = 0; (*state)++; return FALSE; case 2: if (MapLdr_Credits()) { (*state)++; return FALSE; } break; case 3: gFieldCamera.callback = CameraCB_CreditsPan; SetFieldVBlankCallback(); *state = 0; return TRUE; } return FALSE; } static bool8 MapLdr_Credits(void) { u8 *state = &gMain.state; switch (*state) { case 0: InitOverworldBgs_NoResetHeap(); LoadMapFromWarp(FALSE); (*state)++; break; case 1: ScanlineEffect_Clear(); ResetAllPicSprites(); ResetCameraUpdateInfo(); InstallCameraPanAheadCallback(); FieldEffectActiveListClear(); StartWeather(); ResumePausedWeather(); SetUpFieldTasks(); RunOnResumeMapScript(); (*state)++; break; case 2: InitCurrentFlashLevelScanlineEffect(); InitOverworldGraphicsRegisters(); (*state)++; break; case 3: move_tilemap_camera_to_upper_left_corner(); (*state)++; break; case 4: CopyPrimaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 5: CopySecondaryTilesetToVram(gMapHeader.mapLayout); (*state)++; break; case 6: if (FreeTempTileDataBuffersIfPossible() != TRUE) { LoadMapTilesetPalettes(gMapHeader.mapLayout); (*state)++; } break; case 7: DrawWholeMapView(); (*state)++; break; case 8: InitTilesetAnimations(); gPaletteFade.bufferTransferDisabled = FALSE; FadeSelectedPals(FADE_FROM_BLACK, 0, 0x3FFFFFFF); (*state)++; break; default: return TRUE; } return FALSE; } static void CameraCB_CreditsPan(struct CameraObject * camera) { if (sCreditsOverworld_CmdLength == 0) { sCreditsOverworld_CmdIndex++; switch (sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_0) { case CREDITSOVWLDCMD_FC: case CREDITSOVWLDCMD_LOADMAP: return; case CREDITSOVWLDCMD_FF: camera->movementSpeedX = 0; camera->movementSpeedY = 0; camera->callback = NULL; CreateTask(Task_OvwldCredits_FadeOut, 0); return; case CREDITSOVWLDCMD_FB: camera->movementSpeedX = 0; camera->movementSpeedY = 0; camera->callback = NULL; break; case CREDITSOVWLDCMD_END: camera->movementSpeedX = 0; camera->movementSpeedY = 0; camera->callback = NULL; return; default: sCreditsOverworld_CmdLength = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_4; camera->movementSpeedX = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_0; camera->movementSpeedY = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_2; break; } } if (sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_0 == 0xFF) { camera->movementSpeedX = 0; camera->movementSpeedY = 0; } else sCreditsOverworld_CmdLength--; } static void Task_OvwldCredits_FadeOut(u8 taskId) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_OvwldCredits_WaitFade; } static void Task_OvwldCredits_WaitFade(u8 taskId) { if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_LoadMap); DestroyTask(taskId); } } // Link related static u8 (*const sLinkPlayerMovementModes[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8) = { [MOVEMENT_MODE_FREE] = MovementEventModeCB_Normal, [MOVEMENT_MODE_FROZEN] = MovementEventModeCB_Ignored, [MOVEMENT_MODE_SCRIPTED] = MovementEventModeCB_Normal_2, }; // These handlers return TRUE if the movement was scripted and successful, and FALSE otherwise. static bool8 (*const sLinkPlayerFacingHandlers[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8) = { [DIR_NONE] = FacingHandler_DoNothing, [DIR_SOUTH] = FacingHandler_DpadMovement, [DIR_NORTH] = FacingHandler_DpadMovement, [DIR_WEST] = FacingHandler_DpadMovement, [DIR_EAST] = FacingHandler_DpadMovement, }; static bool8 (*const sUnusedLinkPlayerFacingHandlers[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8) = { FacingHandler_DoNothing, FacingHandler_DoNothing, FacingHandler_ForcedFacingChange, FacingHandler_ForcedFacingChange, FacingHandler_ForcedFacingChange, FacingHandler_ForcedFacingChange, }; // These handlers are run after an attempted movement. static void (*const sMovementStatusHandler[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *) = { [FALSE] = MovementStatusHandler_EnterFreeMode, [TRUE] = MovementStatusHandler_TryAdvanceScript, }; static void CB1_UpdateLinkState(void) { if (gWirelessCommType == 0 || !IsRfuRecvQueueEmpty() || !IsSendingKeysToLink()) { u8 selfId = gLocalLinkPlayerId; UpdateAllLinkPlayers(gLinkPartnersHeldKeys, selfId); // Note: Because guestId is between 0 and 4, while the smallest key code is // LINK_KEY_CODE_EMPTY, this is functionally equivalent to `sPlayerKeyInterceptCallback(0)`. // It is expecting the callback to be KeyInterCB_SelfIdle, and that will // completely ignore any input parameters. // // UpdateHeldKeyCode performs a sanity check on its input; if // sPlayerKeyInterceptCallback echoes back the argument, which is selfId, then // it'll use LINK_KEY_CODE_EMPTY instead. // // Note 2: There are some key intercept callbacks that treat the key as a player // ID. It's so hacky. UpdateHeldKeyCode(sPlayerKeyInterceptCallback(selfId)); ClearAllPlayerKeys(); } } static void ResetAllMultiplayerState(void) { ResetAllLinkStates(); SetKeyInterceptCallback(KeyInterCB_SelfIdle); } static void ClearAllPlayerKeys(void) { ResetPlayerHeldKeys(gLinkPartnersHeldKeys); } static void SetKeyInterceptCallback(KeyInterCB func) { sRfuKeepAliveTimer = 0; sPlayerKeyInterceptCallback = func; } // Once every ~60 frames, if the link state hasn't changed (timer reset by calls // to SetKeyInterceptCallback), it does a bunch of sanity checks on the connection. // I'm not sure if sRfuKeepAliveTimer is reset in the process, though; rfu stuff is // still undocumented. static void CheckRfuKeepAliveTimer(void) { if (gWirelessCommType != 0 && ++sRfuKeepAliveTimer > 60) LinkRfu_FatalError(); } static void ResetAllLinkStates(void) { s32 i; for (i = 0; i < 4; i++) sPlayerLinkStates[i] = PLAYER_LINK_STATE_IDLE; } // Returns true if all connected players are in linkState. static bool32 AreAllPlayersInLinkState(u16 linkState) { s32 i; s32 count = gFieldLinkPlayerCount; for (i = 0; i < count; i++) if (sPlayerLinkStates[i] != linkState) return FALSE; return TRUE; } static bool32 IsAnyPlayerInLinkState(u16 linkState) { s32 i; s32 count = gFieldLinkPlayerCount; for (i = 0; i < count; i++) if (sPlayerLinkStates[i] == linkState) return TRUE; return FALSE; } static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct CableClubPlayer *player, u16 *forceFacing) { const u8 *script; if (sPlayerLinkStates[playerId] == PLAYER_LINK_STATE_IDLE) { script = TryGetTileEventScript(player); if (script) { *forceFacing = GetDirectionForEventScript(script); sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (player->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); RunInteractLocalPlayerScript(script); } return; } if (IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE) { sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (player->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); RunTerminateLinkScript(); } return; } switch (key) { case LINK_KEY_CODE_START_BUTTON: if (CanCableClubPlayerPressStart(player)) { sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (player->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); InitLinkRoomStartMenuScript(); } } break; case LINK_KEY_CODE_DPAD_DOWN: if (PlayerIsAtSouthExit(player) == TRUE) { sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (player->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); CreateConfirmLeaveTradeRoomPrompt(); } } break; case LINK_KEY_CODE_A_BUTTON: script = TryInteractWithPlayer(player); if (script) { sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (player->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); InitMenuBasedScript(script); } } break; case LINK_KEY_CODE_HANDLE_RECV_QUEUE: if (IsCableClubPlayerUnfrozen(player)) { sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (player->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToRecvQueue); InitLinkPlayerQueueScript(); } } break; case LINK_KEY_CODE_HANDLE_SEND_QUEUE: if (IsCableClubPlayerUnfrozen(player)) { sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (player->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToSendQueue); InitLinkPlayerQueueScript(); } } break; } } switch (key) { case LINK_KEY_CODE_EXIT_ROOM: sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_EXITING_ROOM; break; case LINK_KEY_CODE_READY: sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_READY; break; case LINK_KEY_CODE_IDLE: sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_IDLE; if (player->isLocalPlayer) SetKeyInterceptCallback(KeyInterCB_SelfIdle); break; case LINK_KEY_CODE_EXIT_SEAT: if (sPlayerLinkStates[playerId] == PLAYER_LINK_STATE_READY) sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; break; } } static void UpdateAllLinkPlayers(u16 *keys, s32 selfId) { struct CableClubPlayer player; s32 i; for (i = 0; i < MAX_LINK_PLAYERS; i++) { u8 key = keys[i]; u16 setFacing = FACING_NONE; LoadCableClubPlayer(i, selfId, &player); HandleLinkPlayerKeyInput(i, key, &player, &setFacing); if (sPlayerLinkStates[i] == PLAYER_LINK_STATE_IDLE) setFacing = GetDirectionForDpadKey(key); SetPlayerFacingDirection(i, setFacing); } } static void UpdateHeldKeyCode(u16 key) { if (key >= LINK_KEY_CODE_EMPTY && key <= LINK_KEY_CODE_EXIT_SEAT) gHeldKeyCodeToSend = key; else gHeldKeyCodeToSend = LINK_KEY_CODE_EMPTY; if (gWirelessCommType != 0 && GetLinkSendQueueLength() > 1 && IsUpdateLinkStateCBActive() == TRUE && IsSendingKeysToLink() == TRUE) { switch (key) { case LINK_KEY_CODE_EMPTY: case LINK_KEY_CODE_DPAD_DOWN: case LINK_KEY_CODE_DPAD_UP: case LINK_KEY_CODE_DPAD_LEFT: case LINK_KEY_CODE_DPAD_RIGHT: case LINK_KEY_CODE_START_BUTTON: case LINK_KEY_CODE_A_BUTTON: gHeldKeyCodeToSend = LINK_KEY_CODE_NULL; break; } } } static u16 KeyInterCB_ReadButtons(u32 key) { if (JOY_HELD(DPAD_UP)) return LINK_KEY_CODE_DPAD_UP; else if (JOY_HELD(DPAD_DOWN)) return LINK_KEY_CODE_DPAD_DOWN; else if (JOY_HELD(DPAD_LEFT)) return LINK_KEY_CODE_DPAD_LEFT; else if (JOY_HELD(DPAD_RIGHT)) return LINK_KEY_CODE_DPAD_RIGHT; else if (JOY_NEW(START_BUTTON)) return LINK_KEY_CODE_START_BUTTON; else if (JOY_NEW(A_BUTTON)) return LINK_KEY_CODE_A_BUTTON; else return LINK_KEY_CODE_EMPTY; } static u16 GetDirectionForDpadKey(u16 a1) { switch (a1) { case LINK_KEY_CODE_DPAD_RIGHT: return FACING_RIGHT; case LINK_KEY_CODE_DPAD_LEFT: return FACING_LEFT; case LINK_KEY_CODE_DPAD_UP: return FACING_UP; case LINK_KEY_CODE_DPAD_DOWN: return FACING_DOWN; default: return FACING_NONE; } } // Overwrites the keys with 0x11 static void ResetPlayerHeldKeys(u16 *keys) { s32 i; for (i = 0; i < 4; i++) keys[i] = LINK_KEY_CODE_EMPTY; } static u16 KeyInterCB_SelfIdle(u32 key) { if (ArePlayerFieldControlsLocked() == TRUE) return LINK_KEY_CODE_EMPTY; if (GetLinkRecvQueueLength() > 4) return LINK_KEY_CODE_HANDLE_RECV_QUEUE; if (GetLinkSendQueueLength() <= 4) return KeyInterCB_ReadButtons(key); return LINK_KEY_CODE_HANDLE_SEND_QUEUE; } static u16 KeyInterCB_Idle(u32 key) { CheckRfuKeepAliveTimer(); return LINK_KEY_CODE_EMPTY; } // Ignore the player's inputs as long as there is an event script // in ScriptContext2. static u16 KeyInterCB_DeferToEventScript(u32 key) { u16 retVal; if (ArePlayerFieldControlsLocked() == TRUE) { retVal = LINK_KEY_CODE_EMPTY; } else { retVal = LINK_KEY_CODE_IDLE; SetKeyInterceptCallback(KeyInterCB_Idle); } return retVal; } // Ignore the player's inputs as long as there are events being recived. static u16 KeyInterCB_DeferToRecvQueue(u32 key) { u16 retVal; if (GetLinkRecvQueueLength() > 2) { retVal = LINK_KEY_CODE_EMPTY; } else { retVal = LINK_KEY_CODE_IDLE; UnlockPlayerFieldControls(); SetKeyInterceptCallback(KeyInterCB_Idle); } return retVal; } // Ignore the player's inputs as long as there are events being sent. static u16 KeyInterCB_DeferToSendQueue(u32 key) { u16 retVal; if (GetLinkSendQueueLength() > 2) { retVal = LINK_KEY_CODE_EMPTY; } else { retVal = LINK_KEY_CODE_IDLE; UnlockPlayerFieldControls(); SetKeyInterceptCallback(KeyInterCB_Idle); } return retVal; } static u16 KeyInterCB_DoNothingAndKeepAlive(u32 key) { CheckRfuKeepAliveTimer(); return LINK_KEY_CODE_EMPTY; } static u16 KeyInterCB_Ready(u32 keyOrPlayerId) { if (sPlayerLinkStates[keyOrPlayerId] == PLAYER_LINK_STATE_READY) { if (JOY_NEW(B_BUTTON)) { SetKeyInterceptCallback(KeyInterCB_DoNothingAndKeepAlive); return LINK_KEY_CODE_EXIT_SEAT; } else { return LINK_KEY_CODE_EMPTY; } } else { CheckRfuKeepAliveTimer(); return LINK_KEY_CODE_EMPTY; } } static u16 KeyInterCB_SetReady(u32 a1) { SetKeyInterceptCallback(KeyInterCB_Ready); return LINK_KEY_CODE_READY; } static u16 KeyInterCB_SendNothing(u32 key) { return LINK_KEY_CODE_EMPTY; } static u16 KeyInterCB_WaitForPlayersToExit(u32 keyOrPlayerId) { // keyOrPlayerId could be any keycode. This callback does no sanity checking // on the size of the key. It's assuming that it is being called from // CB1_UpdateLinkState. if (sPlayerLinkStates[keyOrPlayerId] != PLAYER_LINK_STATE_EXITING_ROOM) CheckRfuKeepAliveTimer(); if (AreAllPlayersInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE) { ScriptContext_SetupScript(CableClub_EventScript_DoLinkRoomExit); SetKeyInterceptCallback(KeyInterCB_SendNothing); } return LINK_KEY_CODE_EMPTY; } static u16 KeyInterCB_SendExitRoomKey(u32 key) { SetKeyInterceptCallback(KeyInterCB_WaitForPlayersToExit); return LINK_KEY_CODE_EXIT_ROOM; } // Duplicate function. static u16 KeyInterCB_SendNothing_2(u32 key) { return LINK_KEY_CODE_EMPTY; } u32 GetCableClubPartnersReady(void) { if (IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE) return CABLE_SEAT_FAILED; if (sPlayerKeyInterceptCallback == KeyInterCB_Ready && sPlayerLinkStates[gLocalLinkPlayerId] != PLAYER_LINK_STATE_READY) return CABLE_SEAT_WAITING; if (sPlayerKeyInterceptCallback == KeyInterCB_DoNothingAndKeepAlive && sPlayerLinkStates[gLocalLinkPlayerId] == PLAYER_LINK_STATE_BUSY) return CABLE_SEAT_FAILED; if (AreAllPlayersInLinkState(PLAYER_LINK_STATE_READY) != FALSE) return CABLE_SEAT_SUCCESS; return CABLE_SEAT_WAITING; } static bool32 IsAnyPlayerExitingCableClub(void) { return IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM); } u16 SetInCableClubSeat(void) { SetKeyInterceptCallback(KeyInterCB_SetReady); return 0; } u16 SetLinkWaitingForScript(void) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); return 0; } // The exit room key will be sent at the next opportunity. // The return value is meaningless. u16 QueueExitLinkRoomKey(void) { SetKeyInterceptCallback(KeyInterCB_SendExitRoomKey); return 0; } u16 SetStartedCableClubActivity(void) { SetKeyInterceptCallback(KeyInterCB_SendNothing_2); return 0; } static void LoadCableClubPlayer(s32 linkPlayerId, s32 myPlayerId, struct CableClubPlayer *player) { s16 x, y; player->playerId = linkPlayerId; player->isLocalPlayer = (linkPlayerId == myPlayerId) ? TRUE : FALSE; player->movementMode = gLinkPlayerObjectEvents[linkPlayerId].movementMode; player->facing = GetLinkPlayerFacingDirection(linkPlayerId); GetLinkPlayerCoords(linkPlayerId, &x, &y); player->pos.x = x; player->pos.y = y; player->pos.elevation = GetLinkPlayerElevation(linkPlayerId); player->metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); } static bool32 IsCableClubPlayerUnfrozen(struct CableClubPlayer *player) { u8 mode = player->movementMode; if (mode == MOVEMENT_MODE_SCRIPTED || mode == MOVEMENT_MODE_FREE) return TRUE; else return FALSE; } // Duplicate function. static bool32 CanCableClubPlayerPressStart(struct CableClubPlayer *player) { u8 mode = player->movementMode; if (mode == MOVEMENT_MODE_SCRIPTED || mode == MOVEMENT_MODE_FREE) return TRUE; else return FALSE; } static const u8 *TryGetTileEventScript(struct CableClubPlayer *player) { if (player->movementMode != MOVEMENT_MODE_SCRIPTED) return FACING_NONE; return GetCoordEventScriptAtMapPosition(&player->pos); } static bool32 PlayerIsAtSouthExit(struct CableClubPlayer *player) { if (player->movementMode != MOVEMENT_MODE_SCRIPTED && player->movementMode != MOVEMENT_MODE_FREE) return FALSE; else if (!MetatileBehavior_IsSouthArrowWarp(player->metatileBehavior)) return FALSE; else if (player->facing != DIR_SOUTH) return FALSE; else return TRUE; } static const u8 *TryInteractWithPlayer(struct CableClubPlayer *player) { struct MapPosition otherPlayerPos; u8 linkPlayerId; if (player->movementMode != MOVEMENT_MODE_FREE && player->movementMode != MOVEMENT_MODE_SCRIPTED) return FACING_NONE; otherPlayerPos = player->pos; otherPlayerPos.x += gDirectionToVectors[player->facing].x; otherPlayerPos.y += gDirectionToVectors[player->facing].y; otherPlayerPos.elevation = 0; linkPlayerId = GetLinkPlayerIdAt(otherPlayerPos.x, otherPlayerPos.y); if (linkPlayerId != 4) { if (!player->isLocalPlayer) return CableClub_EventScript_TooBusyToNotice; else if (sPlayerLinkStates[linkPlayerId] != PLAYER_LINK_STATE_IDLE) return CableClub_EventScript_TooBusyToNotice; else if (!GetSeeingLinkPlayerCardMsg(linkPlayerId)) return CableClub_EventScript_ReadTrainerCard; else return CableClub_EventScript_ReadTrainerCardColored; } return GetInteractedLinkPlayerScript(&otherPlayerPos, player->metatileBehavior, player->facing); } // This returns which direction to force the player to look when one of // these event scripts runs. static u16 GetDirectionForEventScript(const u8 *script) { if (script == BattleColosseum_4P_EventScript_PlayerSpot0) return FACING_FORCED_RIGHT; else if (script == BattleColosseum_4P_EventScript_PlayerSpot1) return FACING_FORCED_LEFT; else if (script == BattleColosseum_4P_EventScript_PlayerSpot2) return FACING_FORCED_RIGHT; else if (script == BattleColosseum_4P_EventScript_PlayerSpot3) return FACING_FORCED_LEFT; else if (script == RecordCorner_EventScript_Spot0) return FACING_FORCED_RIGHT; else if (script == RecordCorner_EventScript_Spot1) return FACING_FORCED_LEFT; else if (script == RecordCorner_EventScript_Spot2) return FACING_FORCED_RIGHT; else if (script == RecordCorner_EventScript_Spot3) return FACING_FORCED_LEFT; else if (script == BattleColosseum_2P_EventScript_PlayerSpot0) return FACING_FORCED_RIGHT; else if (script == BattleColosseum_2P_EventScript_PlayerSpot1) return FACING_FORCED_LEFT; else if (script == TradeCenter_EventScript_Chair0) return FACING_FORCED_RIGHT; else if (script == TradeCenter_EventScript_Chair1) return FACING_FORCED_LEFT; else return FACING_NONE; } static void InitLinkPlayerQueueScript(void) { LockPlayerFieldControls(); } static void InitLinkRoomStartMenuScript(void) { PlaySE(SE_WIN_OPEN); ShowStartMenu(); LockPlayerFieldControls(); } static void RunInteractLocalPlayerScript(const u8 *script) { PlaySE(SE_SELECT); ScriptContext_SetupScript(script); LockPlayerFieldControls(); } static void CreateConfirmLeaveTradeRoomPrompt(void) { PlaySE(SE_WIN_OPEN); ScriptContext_SetupScript(TradeCenter_ConfirmLeaveRoom); LockPlayerFieldControls(); } static void InitMenuBasedScript(const u8 *script) { PlaySE(SE_SELECT); ScriptContext_SetupScript(script); LockPlayerFieldControls(); } static void RunTerminateLinkScript(void) { ScriptContext_SetupScript(TradeCenter_TerminateLink); LockPlayerFieldControls(); } bool32 Overworld_LinkRecvQueueLengthMoreThan2(void) { if (!IsUpdateLinkStateCBActive()) return FALSE; if (GetLinkRecvQueueLength() >= 3) sReceivingFromLink = TRUE; else sReceivingFromLink = FALSE; return sReceivingFromLink; } bool32 Overworld_RecvKeysFromLinkIsRunning(void) { u8 temp; if (GetLinkRecvQueueLength() < 2) return FALSE; else if (IsUpdateLinkStateCBActive() != TRUE) return FALSE; else if (IsSendingKeysToLink() != TRUE) return FALSE; else if (sPlayerKeyInterceptCallback == KeyInterCB_DeferToRecvQueue) return TRUE; else if (sPlayerKeyInterceptCallback != KeyInterCB_DeferToEventScript) return FALSE; temp = sReceivingFromLink; sReceivingFromLink = FALSE; if (temp == TRUE) return TRUE; else if (gPaletteFade.active && gPaletteFade.softwareFadeFinishing) return TRUE; else return FALSE; } bool32 Overworld_SendKeysToLinkIsRunning(void) { if (GetLinkSendQueueLength() < 2) return FALSE; else if (IsUpdateLinkStateCBActive() != TRUE) return FALSE; else if (IsSendingKeysToLink() != TRUE) return FALSE; else if (sPlayerKeyInterceptCallback == KeyInterCB_DeferToSendQueue) return TRUE; else return FALSE; } bool32 IsSendingKeysOverCable(void) { if (gWirelessCommType != 0) return FALSE; else if (!IsSendingKeysToLink()) return FALSE; else return TRUE; } static u32 GetLinkSendQueueLength(void) { if (gWirelessCommType != 0) return gRfu.sendQueue.count; else return gLink.sendQueue.count; } static void ZeroLinkPlayerObjectEvent(struct LinkPlayerObjectEvent *linkPlayerObjEvent) { memset(linkPlayerObjEvent, 0, sizeof(struct LinkPlayerObjectEvent)); } void ClearLinkPlayerObjectEvents(void) { memset(gLinkPlayerObjectEvents, 0, sizeof(gLinkPlayerObjectEvents)); } static void ZeroObjectEvent(struct ObjectEvent *objEvent) { memset(objEvent, 0, sizeof(struct ObjectEvent)); } // Note: Emerald reuses the direction and range variables during Link mode // as special gender and direction values. The types and placement // conflict with the usual Event Object struct, thus the definitions. #define linkGender(obj) obj->singleMovementActive // not even one can reference *byte* aligned bitfield members... #define linkDirection(obj) ((u8 *)obj)[offsetof(typeof(*obj), fieldEffectSpriteId) - 1] // -> rangeX static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 gender) { u8 objEventId = GetFirstInactiveObjectEventId(); struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId]; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; ZeroLinkPlayerObjectEvent(linkPlayerObjEvent); ZeroObjectEvent(objEvent); linkPlayerObjEvent->active = TRUE; linkPlayerObjEvent->linkPlayerId = linkPlayerId; linkPlayerObjEvent->objEventId = objEventId; linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE; objEvent->active = TRUE; linkGender(objEvent) = gender; linkDirection(objEvent) = DIR_NORTH; objEvent->spriteId = MAX_SPRITES; InitLinkPlayerObjectEventPos(objEvent, x, y); } static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y) { objEvent->currentCoords.x = x; objEvent->currentCoords.y = y; objEvent->previousCoords.x = x; objEvent->previousCoords.y = y; SetSpritePosToMapCoords(x, y, &objEvent->initialCoords.x, &objEvent->initialCoords.y); objEvent->initialCoords.x += 8; ObjectEventUpdateElevation(objEvent); } static void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 dir) { if (gLinkPlayerObjectEvents[linkPlayerId].active) { u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; linkDirection(objEvent) = dir; } } static void DestroyLinkPlayerObject(u8 linkPlayerId) { struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId]; u8 objEventId = linkPlayerObjEvent->objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; if (objEvent->spriteId != MAX_SPRITES) DestroySprite(&gSprites[objEvent->spriteId]); linkPlayerObjEvent->active = FALSE; objEvent->active = FALSE; } // Returns the spriteId corresponding to this player. static u8 GetSpriteForLinkedPlayer(u8 linkPlayerId) { u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; return objEvent->spriteId; } static void GetLinkPlayerCoords(u8 linkPlayerId, u16 *x, u16 *y) { u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; *x = objEvent->currentCoords.x; *y = objEvent->currentCoords.y; } static u8 GetLinkPlayerFacingDirection(u8 linkPlayerId) { u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; return linkDirection(objEvent); } static u8 GetLinkPlayerElevation(u8 linkPlayerId) { u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; return objEvent->currentElevation; } static s32 GetLinkPlayerObjectStepTimer(u8 linkPlayerId) { u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; return 16 - (s8)objEvent->directionSequenceIndex; } static u8 GetLinkPlayerIdAt(s16 x, s16 y) { u32 i; for (i = 0; i < MAX_LINK_PLAYERS; i++) { if (gLinkPlayerObjectEvents[i].active && (gLinkPlayerObjectEvents[i].movementMode == 0 || gLinkPlayerObjectEvents[i].movementMode == 2)) { struct ObjectEvent *objEvent = &gObjectEvents[gLinkPlayerObjectEvents[i].objEventId]; if (objEvent->currentCoords.x == x && objEvent->currentCoords.y == y) return i; } } return 4; } static void SetPlayerFacingDirection(u8 linkPlayerId, u8 facing) { struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId]; u8 objEventId = linkPlayerObjEvent->objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; if (linkPlayerObjEvent->active) { if (facing > FACING_FORCED_RIGHT) { objEvent->triggerGroundEffectsOnMove = TRUE; } else { // This is a hack to split this code onto two separate lines, without declaring a local variable. // C++ style inline variables would be nice here. #define TEMP sLinkPlayerMovementModes[linkPlayerObjEvent->movementMode](linkPlayerObjEvent, objEvent, facing) sMovementStatusHandler[TEMP](linkPlayerObjEvent, objEvent); // Clean up the hack. #undef TEMP } } } static u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { return sLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir); } static u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { return FACING_UP; } // Duplicate Function static u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { return sLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir); } static bool8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { return FALSE; } static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { s16 x, y; linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent)); ObjectEventMoveDestCoords(objEvent, linkDirection(objEvent), &x, &y); if (LinkPlayerDetectCollision(linkPlayerObjEvent->objEventId, linkDirection(objEvent), x, y)) { return FALSE; } else { objEvent->directionSequenceIndex = 16; ShiftObjectEventCoords(objEvent, x, y); ObjectEventUpdateElevation(objEvent); return TRUE; } } static bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent)); return FALSE; } // This is called every time a free movement happens. Most of the time it's a No-Op. static void MovementStatusHandler_EnterFreeMode(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent) { linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE; } static void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent) { objEvent->directionSequenceIndex--; linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FROZEN; MoveCoords(linkDirection(objEvent), &objEvent->initialCoords.x, &objEvent->initialCoords.y); if (!objEvent->directionSequenceIndex) { ShiftStillObjectEventCoords(objEvent); linkPlayerObjEvent->movementMode = MOVEMENT_MODE_SCRIPTED; } } // Flip Up/Down facing codes. If newFacing doesn't specify a direction, default // to oldFacing. Note that this clears also the "FORCED" part of the facing code, // even for Left/Right codes. static u8 FlipVerticalAndClearForced(u8 newFacing, u8 oldFacing) { switch (newFacing) { case FACING_UP: case FACING_FORCED_UP: return DIR_NORTH; case FACING_DOWN: case FACING_FORCED_DOWN: return DIR_SOUTH; case FACING_LEFT: case FACING_FORCED_LEFT: return DIR_WEST; case FACING_RIGHT: case FACING_FORCED_RIGHT: return DIR_EAST; } return oldFacing; } static bool8 LinkPlayerDetectCollision(u8 selfObjEventId, u8 a2, s16 x, s16 y) { u32 i; for (i = 0; i < 16; i++) { if (i != selfObjEventId) { if ((gObjectEvents[i].currentCoords.x == x && gObjectEvents[i].currentCoords.y == y) || (gObjectEvents[i].previousCoords.x == x && gObjectEvents[i].previousCoords.y == y)) { return TRUE; } } } return MapGridGetCollisionAt(x, y); } static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion) { struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId]; u8 objEventId = linkPlayerObjEvent->objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; struct Sprite *sprite; if (linkPlayerObjEvent->active) { if (gameVersion == VERSION_FIRE_RED || gameVersion == VERSION_LEAF_GREEN) { objEvent->spriteId = CreateObjectGraphicsSprite( GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0); } else if (gameVersion == VERSION_EMERALD) { objEvent->spriteId = CreateObjectGraphicsSprite(GetEMAvatarGraphicsIdByGender(linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0); } else { objEvent->spriteId = CreateObjectGraphicsSprite(GetRSAvatarGraphicsIdByGender(linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0); } sprite = &gSprites[objEvent->spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->data[0] = linkPlayerId; objEvent->triggerGroundEffectsOnMove = FALSE; } } static void SpriteCB_LinkPlayer(struct Sprite *sprite) { struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[sprite->data[0]]; struct ObjectEvent *objEvent = &gObjectEvents[linkPlayerObjEvent->objEventId]; sprite->x = objEvent->initialCoords.x; sprite->y = objEvent->initialCoords.y; SetObjectSubpriorityByElevation(objEvent->previousElevation, sprite, 1); sprite->oam.priority = ElevationToPriority(objEvent->previousElevation); if (!linkPlayerObjEvent->movementMode != MOVEMENT_MODE_FREE) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(linkDirection(objEvent))); else StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(linkDirection(objEvent))); UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (objEvent->triggerGroundEffectsOnMove) { sprite->invisible = ((sprite->data[7] & 4) >> 2); sprite->data[7]++; } } ================================================ FILE: src/palette.c ================================================ #include "global.h" #include "gflib.h" #include "util.h" #include "decompress.h" #include "task.h" enum { NORMAL_FADE, FAST_FADE, HARDWARE_FADE, }; // These are structs for some unused palette system. // The full functionality of this system is unknown. #define NUM_PALETTE_STRUCTS 16 struct PaletteStructTemplate { u16 id; u16 *src; bool16 pst_field_8_0:1; u16 unused:9; u16 size:5; u8 time1; u8 srcCount:5; u8 state:3; u8 time2; }; struct PaletteStruct { const struct PaletteStructTemplate *template; bool32 active:1; bool32 flag:1; u32 baseDestOffset:9; u16 destOffset:10; u16 srcIndex:7; u8 countdown1; u8 countdown2; }; static void PaletteStruct_Copy(struct PaletteStruct *, u32 *); static void PaletteStruct_Blend(struct PaletteStruct *, u32 *); static void PaletteStruct_TryEnd(struct PaletteStruct *); static void PaletteStruct_Reset(u8 paletteNum); static u8 PaletteStruct_GetPalNum(u16); static u8 UpdateNormalPaletteFade(void); static void BeginFastPaletteFadeInternal(u8); static u8 UpdateFastPaletteFade(void); static u8 UpdateHardwarePaletteFade(void); static void UpdateBlendRegisters(void); static bool8 IsSoftwarePaletteFadeFinishing(void); static void Task_BlendPalettesGradually(u8 taskId); ALIGNED(4) EWRAM_DATA u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE] = {0}; ALIGNED(4) EWRAM_DATA u16 gPlttBufferFaded[PLTT_BUFFER_SIZE] = {0}; static EWRAM_DATA struct PaletteStruct sPaletteStructs[NUM_PALETTE_STRUCTS] = {0}; EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0}; static EWRAM_DATA u32 sPlttBufferTransferPending = 0; EWRAM_DATA u8 gPaletteDecompressionBuffer[PLTT_SIZE] = {0}; static const struct PaletteStructTemplate sDummyPaletteStructTemplate = { .id = 0xFFFF, .state = 1 }; static const u8 sRoundedDownGrayscaleMap[] = { 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 21, 21, 21, 21, 21, 27, 27, 27, 27, 27, 31, 31 }; void LoadCompressedPalette(const u32 *src, u16 offset, u16 size) { LZDecompressWram(src, gPaletteDecompressionBuffer); CpuCopy16(gPaletteDecompressionBuffer, &gPlttBufferUnfaded[offset], size); CpuCopy16(gPaletteDecompressionBuffer, &gPlttBufferFaded[offset], size); } void LoadPalette(const void *src, u16 offset, u16 size) { CpuCopy16(src, &gPlttBufferUnfaded[offset], size); CpuCopy16(src, &gPlttBufferFaded[offset], size); } void FillPalette(u16 value, u16 offset, u16 size) { CpuFill16(value, &gPlttBufferUnfaded[offset], size); CpuFill16(value, &gPlttBufferFaded[offset], size); } void TransferPlttBuffer(void) { if (!gPaletteFade.bufferTransferDisabled) { void *src = gPlttBufferFaded; void *dest = (void *)PLTT; DmaCopy16(3, src, dest, PLTT_SIZE); sPlttBufferTransferPending = FALSE; if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) UpdateBlendRegisters(); } } u8 UpdatePaletteFade(void) { u8 result; u8 dummy = 0; if (sPlttBufferTransferPending) return PALETTE_FADE_STATUS_LOADING; if (gPaletteFade.mode == NORMAL_FADE) result = UpdateNormalPaletteFade(); else if (gPaletteFade.mode == FAST_FADE) result = UpdateFastPaletteFade(); else result = UpdateHardwarePaletteFade(); sPlttBufferTransferPending = gPaletteFade.multipurpose1 | dummy; return result; } void ResetPaletteFade(void) { u32 i; for (i = 0; i < NUM_PALETTE_STRUCTS; ++i) PaletteStruct_Reset(i); ResetPaletteFadeControl(); } void ReadPlttIntoBuffers(void) { u32 i; u16 *pltt = (u16 *)PLTT; for (i = 0; i < PLTT_BUFFER_SIZE; ++i) { gPlttBufferUnfaded[i] = pltt[i]; gPlttBufferFaded[i] = pltt[i]; } } bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor) { u8 temp; u16 color = blendColor; if (gPaletteFade.active) { return FALSE; } else { gPaletteFade.deltaY = 2; if (delay < 0) { gPaletteFade.deltaY += (delay * -1); delay = 0; } gPaletteFade_selectedPalettes = selectedPalettes; gPaletteFade.delayCounter = delay; gPaletteFade_delay = delay; gPaletteFade.y = startY; gPaletteFade.targetY = targetY; gPaletteFade.blendColor = color; gPaletteFade.active = TRUE; gPaletteFade.mode = NORMAL_FADE; if (startY < targetY) gPaletteFade.yDec = FALSE; else gPaletteFade.yDec = TRUE; UpdatePaletteFade(); temp = gPaletteFade.bufferTransferDisabled; gPaletteFade.bufferTransferDisabled = FALSE; CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE); sPlttBufferTransferPending = FALSE; if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) UpdateBlendRegisters(); gPaletteFade.bufferTransferDisabled = temp; return TRUE; } } // Unused static bool8 BeginPlttFade(u32 selectedPalettes, u8 delay, u8 startY, u8 targetY, u16 blendColor) { ReadPlttIntoBuffers(); return BeginNormalPaletteFade(selectedPalettes, delay, startY, targetY, blendColor); } // Unused static void PaletteStruct_Run(u8 a1, u32 *unkFlags) { u32 i; for (i = 0; i < NUM_PALETTE_STRUCTS; ++i) { struct PaletteStruct *palstruct = &sPaletteStructs[i]; if (palstruct->active) { if (palstruct->template->pst_field_8_0 == a1) { u8 srcIndex = palstruct->srcIndex; u8 srcCount = palstruct->template->srcCount; if (srcIndex == srcCount) { PaletteStruct_TryEnd(palstruct); if (!palstruct->active) continue; } if (palstruct->countdown1 == 0) PaletteStruct_Copy(palstruct, unkFlags); else palstruct->countdown1--; PaletteStruct_Blend(palstruct, unkFlags); } } } } static void PaletteStruct_Copy(struct PaletteStruct *palStruct, u32 *unkFlags) { s32 srcIndex; s32 srcCount; u8 i = 0; u16 srcOffset = palStruct->srcIndex * palStruct->template->size; if (!palStruct->template->pst_field_8_0) { while (i < palStruct->template->size) { gPlttBufferUnfaded[palStruct->destOffset] = palStruct->template->src[srcOffset]; gPlttBufferFaded[palStruct->destOffset] = palStruct->template->src[srcOffset]; i++; palStruct->destOffset++; srcOffset++; } } else { while (i < palStruct->template->size) { gPlttBufferFaded[palStruct->destOffset] = palStruct->template->src[srcOffset]; i++; palStruct->destOffset++; srcOffset++; } } palStruct->destOffset = palStruct->baseDestOffset; palStruct->countdown1 = palStruct->template->time1; palStruct->srcIndex++; srcIndex = palStruct->srcIndex; srcCount = palStruct->template->srcCount; if (srcIndex >= srcCount) { if (palStruct->countdown2) palStruct->countdown2--; palStruct->srcIndex = 0; } *unkFlags |= 1 << (palStruct->baseDestOffset >> 4); } static void PaletteStruct_Blend(struct PaletteStruct *palStruct, u32 *unkFlags) { if (gPaletteFade.active && ((1 << (palStruct->baseDestOffset >> 4)) & gPaletteFade_selectedPalettes)) { if (!palStruct->template->pst_field_8_0) { if (gPaletteFade.delayCounter != gPaletteFade_delay) BlendPalette(palStruct->baseDestOffset, palStruct->template->size, gPaletteFade.y, gPaletteFade.blendColor); } else { if (!gPaletteFade.delayCounter) { if (palStruct->countdown1 != palStruct->template->time1) { u32 srcOffset = palStruct->srcIndex * palStruct->template->size; u32 i; for (i = 0; i < palStruct->template->size; i++) gPlttBufferFaded[palStruct->baseDestOffset + i] = palStruct->template->src[srcOffset + i]; } } } } } static void PaletteStruct_TryEnd(struct PaletteStruct *palStruct) { if (!palStruct->countdown2) { s32 state = palStruct->template->state; if (state == 0) { palStruct->srcIndex = 0; palStruct->countdown1 = palStruct->template->time1; palStruct->countdown2 = palStruct->template->time2; palStruct->destOffset = palStruct->baseDestOffset; } else { if (state < 0) return; if (state > 2) return; PaletteStruct_ResetById(palStruct->template->id); } } else { palStruct->countdown2--; } } void PaletteStruct_ResetById(u16 id) { u8 paletteNum = PaletteStruct_GetPalNum(id); if (paletteNum != NUM_PALETTE_STRUCTS) PaletteStruct_Reset(paletteNum); } static void PaletteStruct_Reset(u8 paletteNum) { sPaletteStructs[paletteNum].template = &sDummyPaletteStructTemplate; sPaletteStructs[paletteNum].active = FALSE; sPaletteStructs[paletteNum].baseDestOffset = 0; sPaletteStructs[paletteNum].destOffset = 0; sPaletteStructs[paletteNum].srcIndex = 0; sPaletteStructs[paletteNum].flag = FALSE; sPaletteStructs[paletteNum].countdown1 = 0; sPaletteStructs[paletteNum].countdown2 = 0; } void ResetPaletteFadeControl(void) { gPaletteFade.multipurpose1 = 0; gPaletteFade.multipurpose2 = 0; gPaletteFade.delayCounter = 0; gPaletteFade.y = 0; gPaletteFade.targetY = 0; gPaletteFade.blendColor = 0; gPaletteFade.active = FALSE; gPaletteFade.multipurpose2 = 0; // assign same value twice gPaletteFade.yDec = FALSE; gPaletteFade.bufferTransferDisabled = FALSE; gPaletteFade.shouldResetBlendRegisters = FALSE; gPaletteFade.hardwareFadeFinishing = FALSE; gPaletteFade.softwareFadeFinishing = FALSE; gPaletteFade.softwareFadeFinishingCounter = 0; gPaletteFade.objPaletteToggle = 0; gPaletteFade.deltaY = 2; } static void PaletteStruct_SetUnusedFlag(u16 id) { u8 paletteNum = PaletteStruct_GetPalNum(id); if (paletteNum != NUM_PALETTE_STRUCTS) sPaletteStructs[paletteNum].flag = TRUE; } static void PaletteStruct_ClearUnusedFlag(u16 id) { u8 paletteNum = PaletteStruct_GetPalNum(id); if (paletteNum != NUM_PALETTE_STRUCTS) sPaletteStructs[paletteNum].flag = FALSE; } static u8 PaletteStruct_GetPalNum(u16 id) { u32 i; for (i = 0; i < NUM_PALETTE_STRUCTS; i++) if (sPaletteStructs[i].template->id == id) return i; return NUM_PALETTE_STRUCTS; } static u8 UpdateNormalPaletteFade(void) { u16 paletteOffset; u16 selectedPalettes; if (!gPaletteFade.active) return PALETTE_FADE_STATUS_DONE; if (IsSoftwarePaletteFadeFinishing()) { return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; } else { if (!gPaletteFade.objPaletteToggle) { if (gPaletteFade.delayCounter < gPaletteFade_delay) { gPaletteFade.delayCounter++; return 2; } gPaletteFade.delayCounter = 0; } paletteOffset = 0; if (!gPaletteFade.objPaletteToggle) { selectedPalettes = gPaletteFade_selectedPalettes; } else { selectedPalettes = gPaletteFade_selectedPalettes >> 16; paletteOffset = OBJ_PLTT_OFFSET; } while (selectedPalettes) { if (selectedPalettes & 1) BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); selectedPalettes >>= 1; paletteOffset += 16; } gPaletteFade.objPaletteToggle ^= 1; if (!gPaletteFade.objPaletteToggle) { if (gPaletteFade.y == gPaletteFade.targetY) { gPaletteFade_selectedPalettes = 0; gPaletteFade.softwareFadeFinishing = TRUE; } else { s8 val; if (!gPaletteFade.yDec) { val = gPaletteFade.y; val += gPaletteFade.deltaY; if (val > gPaletteFade.targetY) val = gPaletteFade.targetY; gPaletteFade.y = val; } else { val = gPaletteFade.y; val -= gPaletteFade.deltaY; if (val < gPaletteFade.targetY) val = gPaletteFade.targetY; gPaletteFade.y = val; } } } // gPaletteFade.active cannot change since the last time it was checked. So this // is equivalent to `return PALETTE_FADE_STATUS_ACTIVE;` return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; } } void InvertPlttBuffer(u32 selectedPalettes) { u16 paletteOffset = 0; while (selectedPalettes) { if (selectedPalettes & 1) { u32 i; for (i = 0; i < 16; ++i) gPlttBufferFaded[paletteOffset + i] = ~gPlttBufferFaded[paletteOffset + i]; } selectedPalettes >>= 1; paletteOffset += 16; } } void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b) { u16 paletteOffset = 0; while (selectedPalettes) { if (selectedPalettes & 1) { u32 i; for (i = 0; i < 16; ++i) { struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[paletteOffset + i]; data->r += r; data->g += g; data->b += b; } } selectedPalettes >>= 1; paletteOffset += 16; } } void UnfadePlttBuffer(u32 selectedPalettes) { u16 paletteOffset = 0; while (selectedPalettes) { if (selectedPalettes & 1) { u32 i; for (i = 0; i < 16; ++i) gPlttBufferFaded[paletteOffset + i] = gPlttBufferUnfaded[paletteOffset + i]; } selectedPalettes >>= 1; paletteOffset += 16; } } void BeginFastPaletteFade(u8 submode) { gPaletteFade.deltaY = 2; BeginFastPaletteFadeInternal(submode); } static void BeginFastPaletteFadeInternal(u8 submode) { gPaletteFade.y = 31; gPaletteFade_submode = submode & 0x3F; gPaletteFade.active = TRUE; gPaletteFade.mode = FAST_FADE; if (submode == FAST_FADE_IN_FROM_BLACK) CpuFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); if (submode == FAST_FADE_IN_FROM_WHITE) CpuFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); UpdatePaletteFade(); } static u8 UpdateFastPaletteFade(void) { u32 i; u16 paletteOffsetStart, paletteOffsetEnd; s8 r0, g0, b0, r, g, b; if (!gPaletteFade.active) return PALETTE_FADE_STATUS_DONE; if (IsSoftwarePaletteFadeFinishing()) return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; if (gPaletteFade.objPaletteToggle) { paletteOffsetStart = OBJ_PLTT_OFFSET; paletteOffsetEnd = PLTT_BUFFER_SIZE; } else { paletteOffsetStart = 0; paletteOffsetEnd = OBJ_PLTT_OFFSET; } switch (gPaletteFade_submode) { case FAST_FADE_IN_FROM_WHITE: for (i = paletteOffsetStart; i < paletteOffsetEnd; ++i) { struct PlttData *unfaded; struct PlttData *faded; unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; r0 = unfaded->r; g0 = unfaded->g; b0 = unfaded->b; faded = (struct PlttData *)&gPlttBufferFaded[i]; r = faded->r - 2; g = faded->g - 2; b = faded->b - 2; if (r < r0) r = r0; if (g < g0) g = g0; if (b < b0) b = b0; gPlttBufferFaded[i] = r | (g << 5) | (b << 10); } break; case FAST_FADE_OUT_TO_WHITE: for (i = paletteOffsetStart; i < paletteOffsetEnd; ++i) { struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; r = data->r + 2; g = data->g + 2; b = data->b + 2; if (r > 31) r = 31; if (g > 31) g = 31; if (b > 31) b = 31; gPlttBufferFaded[i] = r | (g << 5) | (b << 10); } break; case FAST_FADE_IN_FROM_BLACK: for (i = paletteOffsetStart; i < paletteOffsetEnd; ++i) { struct PlttData *unfaded; struct PlttData *faded; unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; r0 = unfaded->r; g0 = unfaded->g; b0 = unfaded->b; faded = (struct PlttData *)&gPlttBufferFaded[i]; r = faded->r + 2; g = faded->g + 2; b = faded->b + 2; if (r > r0) r = r0; if (g > g0) g = g0; if (b > b0) b = b0; gPlttBufferFaded[i] = r | (g << 5) | (b << 10); } break; case FAST_FADE_OUT_TO_BLACK: for (i = paletteOffsetStart; i < paletteOffsetEnd; ++i) { struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; r = data->r - 2; g = data->g - 2; b = data->b - 2; if (r < 0) r = 0; if (g < 0) g = 0; if (b < 0) b = 0; gPlttBufferFaded[i] = r | (g << 5) | (b << 10); } } gPaletteFade.objPaletteToggle ^= 1; if (gPaletteFade.objPaletteToggle) // gPaletteFade.active cannot change since the last time it was checked. So this // is equivalent to `return PALETTE_FADE_STATUS_ACTIVE;` return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; if (gPaletteFade.y - gPaletteFade.deltaY < 0) gPaletteFade.y = 0; else gPaletteFade.y -= gPaletteFade.deltaY; if (gPaletteFade.y == 0) { switch (gPaletteFade_submode) { case FAST_FADE_IN_FROM_WHITE: case FAST_FADE_IN_FROM_BLACK: CpuCopy32(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); break; case FAST_FADE_OUT_TO_WHITE: CpuFill32(0xFFFFFFFF, gPlttBufferFaded, PLTT_SIZE); break; case FAST_FADE_OUT_TO_BLACK: CpuFill32(0x00000000, gPlttBufferFaded, PLTT_SIZE); break; } gPaletteFade.mode = NORMAL_FADE; gPaletteFade.softwareFadeFinishing = TRUE; } // gPaletteFade.active cannot change since the last time it was checked. So this // is equivalent to `return PALETTE_FADE_STATUS_ACTIVE;` return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; } void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters) { gPaletteFade_blendCnt = blendCnt; gPaletteFade.delayCounter = delay; gPaletteFade_delay = delay; gPaletteFade.y = y; gPaletteFade.targetY = targetY; gPaletteFade.active = TRUE; gPaletteFade.mode = HARDWARE_FADE; gPaletteFade.shouldResetBlendRegisters = shouldResetBlendRegisters & 1; gPaletteFade.hardwareFadeFinishing = FALSE; if (y < targetY) gPaletteFade.yDec = FALSE; else gPaletteFade.yDec = TRUE; } static u8 UpdateHardwarePaletteFade(void) { if (!gPaletteFade.active) return PALETTE_FADE_STATUS_DONE; if (gPaletteFade.delayCounter < gPaletteFade_delay) { gPaletteFade.delayCounter++; return PALETTE_FADE_STATUS_DELAY; } gPaletteFade.delayCounter = 0; if (!gPaletteFade.yDec) { gPaletteFade.y++; if (gPaletteFade.y > gPaletteFade.targetY) { gPaletteFade.hardwareFadeFinishing++; gPaletteFade.y--; } } else { if (gPaletteFade.y-- - 1 < gPaletteFade.targetY) { gPaletteFade.hardwareFadeFinishing++; gPaletteFade.y++; } } if (gPaletteFade.hardwareFadeFinishing) { if (gPaletteFade.shouldResetBlendRegisters) { gPaletteFade_blendCnt = 0; gPaletteFade.y = 0; } gPaletteFade.shouldResetBlendRegisters = FALSE; } // gPaletteFade.active cannot change since the last time it was checked. So this // is equivalent to `return PALETTE_FADE_STATUS_ACTIVE;` return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; } static void UpdateBlendRegisters(void) { SetGpuReg(REG_OFFSET_BLDCNT, (u16)gPaletteFade_blendCnt); SetGpuReg(REG_OFFSET_BLDY, gPaletteFade.y); if (gPaletteFade.hardwareFadeFinishing) { gPaletteFade.hardwareFadeFinishing = FALSE; gPaletteFade.mode = 0; gPaletteFade_blendCnt = 0; gPaletteFade.y = 0; gPaletteFade.active = FALSE; } } static bool8 IsSoftwarePaletteFadeFinishing(void) { if (gPaletteFade.softwareFadeFinishing) { if (gPaletteFade.softwareFadeFinishingCounter == 4) { gPaletteFade.active = FALSE; gPaletteFade.softwareFadeFinishing = FALSE; gPaletteFade.softwareFadeFinishingCounter = 0; } else { gPaletteFade.softwareFadeFinishingCounter++; } return TRUE; } else { return FALSE; } } void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) { u16 paletteOffset; for (paletteOffset = 0; selectedPalettes; paletteOffset += 16) { if (selectedPalettes & 1) BlendPalette(paletteOffset, 16, coeff, color); selectedPalettes >>= 1; } } void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) { // This copy is done via DMA in both RUBY and EMERALD CpuFastCopy(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); BlendPalettes(selectedPalettes, coeff, color); } void TintPalette_GrayScale(u16 *palette, u16 count) { s32 r, g, b, i; u32 gray; for (i = 0; i < count; ++i) { r = GET_R(*palette); g = GET_G(*palette); b = GET_B(*palette); gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; *palette++ = RGB2(gray, gray, gray); } } void TintPalette_GrayScale2(u16 *palette, u16 count) { s32 r, g, b, i; u32 gray; for (i = 0; i < count; ++i) { r = GET_R(*palette); g = GET_G(*palette); b = GET_B(*palette); gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; if (gray > 31) gray = 31; gray = sRoundedDownGrayscaleMap[gray]; *palette++ = RGB2(gray, gray, gray); } } void TintPalette_SepiaTone(u16 *palette, u16 count) { s32 r, g, b, i; u32 gray; for (i = 0; i < count; ++i) { r = GET_R(*palette); g = GET_G(*palette); b = GET_B(*palette); gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; r = (u16)((Q_8_8(1.2) * gray)) >> 8; g = (u16)((Q_8_8(1.0) * gray)) >> 8; b = (u16)((Q_8_8(0.94) * gray)) >> 8; if (r > 31) r = 31; *palette++ = RGB2(r, g, b); } } void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone) { s32 r, g, b, i; u32 gray; for (i = 0; i < count; ++i) { r = GET_R(*palette); g = GET_G(*palette); b = GET_B(*palette); gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; r = (u16)((rTone * gray)) >> 8; g = (u16)((gTone * gray)) >> 8; b = (u16)((bTone * gray)) >> 8; if (r > 31) r = 31; if (g > 31) g = 31; if (b > 31) b = 31; *palette++ = RGB2(r, g, b); } } void CopyPaletteInvertedTint(const u16 *src, u16 *dst, u16 count, u8 tone) { s32 r, g, b, i; u32 gray; if (!tone) { for (i = 0; i < count; i++) *dst++ = *src++; } else { for (i = 0; i < count; src++, dst++, i++) { r = GET_R(*src); g = GET_G(*src); b = GET_B(*src); gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; r += (tone * (gray - r) >> 4); g += (tone * (gray - g) >> 4); b += (tone * (gray - b) >> 4); *dst = RGB2(r, g, b); } } } #define tCoeff data[0] #define tCoeffTarget data[1] #define tCoeffDelta data[2] #define tDelay data[3] #define tDelayTimer data[4] #define IDX_PALETTES 5 // data[5] and data[6], set/get via Set/GetWordTaskArg #define tColor data[7] #define tId data[8] // Blend the selected palettes in a series of steps toward or away from the color. void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id) { u8 taskId; taskId = CreateTask(Task_BlendPalettesGradually, priority); gTasks[taskId].tCoeff = coeff; gTasks[taskId].tCoeffTarget = coeffTarget; if (delay >= 0) { gTasks[taskId].tDelay = delay; gTasks[taskId].tCoeffDelta = 1; } else { gTasks[taskId].tDelay = 0; gTasks[taskId].tCoeffDelta = -delay + 1; } if (coeffTarget < coeff) gTasks[taskId].tCoeffDelta *= -1; SetWordTaskArg(taskId, IDX_PALETTES, selectedPalettes); gTasks[taskId].tColor = color; gTasks[taskId].tId = id; gTasks[taskId].func(taskId); } bool32 IsBlendPalettesGraduallyTaskActive(u8 id) { s32 i; for (i = 0; i < NUM_TASKS; ++i) if (gTasks[i].isActive == TRUE && gTasks[i].func == Task_BlendPalettesGradually && gTasks[i].tId == id) return TRUE; return FALSE; } void DestroyBlendPalettesGraduallyTask(void) { u8 taskId; while (TRUE) { taskId = FindTaskIdByFunc(Task_BlendPalettesGradually); if (taskId == TASK_NONE) break; DestroyTask(taskId); } } static void Task_BlendPalettesGradually(u8 taskId) { u32 palettes; s16 *data; s16 target; data = gTasks[taskId].data; palettes = GetWordTaskArg(taskId, IDX_PALETTES); if (++tDelayTimer > tDelay) { tDelayTimer = 0; BlendPalettes(palettes, tCoeff, tColor); target = tCoeffTarget; if (tCoeff == target) { DestroyTask(taskId); } else { tCoeff += tCoeffDelta; if (tCoeffDelta >= 0) { if (tCoeff < target) return; } else if (tCoeff > target) { return; } tCoeff = target; } } } ================================================ FILE: src/palette_util.c ================================================ #include "global.h" #include "gflib.h" #include "palette_util.h" #include "util.h" // "RouletteFlash" is more accurately a general flashing/fading util. // This file handles fading the palettes for the color/icon selections on the Roulette wheel // but it also handles the "pulse blend" effect of Mirage Tower. // Neither exist in FRLG, so everything in this file goes unused. void RouletteFlash_Reset(struct RouletteFlashUtil *flash) { flash->enabled = 0; flash->flags = 0; memset(&flash->palettes, 0, sizeof(flash->palettes)); } u8 RouletteFlash_Add(struct RouletteFlashUtil *flash, u8 id, const struct RouletteFlashSettings *settings) { if (id >= ARRAY_COUNT(flash->palettes) || flash->palettes[id].available) return 0xFF; flash->palettes[id].settings.color = settings->color; flash->palettes[id].settings.paletteOffset = settings->paletteOffset; flash->palettes[id].settings.numColors = settings->numColors; flash->palettes[id].settings.delay = settings->delay; flash->palettes[id].settings.unk6 = settings->unk6; flash->palettes[id].settings.numFadeCycles = settings->numFadeCycles; flash->palettes[id].settings.unk7_5 = settings->unk7_5; flash->palettes[id].settings.colorDeltaDir = settings->colorDeltaDir; flash->palettes[id].state = 0; flash->palettes[id].available = TRUE; flash->palettes[id].fadeCycleCounter = 0; flash->palettes[id].delayCounter = 0; if (flash->palettes[id].settings.colorDeltaDir < 0) flash->palettes[id].colorDelta = -1; else flash->palettes[id].colorDelta = 1; return id; } static u8 RouletteFlash_Remove(struct RouletteFlashUtil *flash, u8 id) { if (id >= ARRAY_COUNT(flash->palettes)) return 0xFF; if (!flash->palettes[id].available) return 0xFF; memset(&flash->palettes[id], 0, sizeof(flash->palettes[id])); return id; } static u8 RouletteFlash_FadePalette(struct RouletteFlashPalette *pal) { u32 i; u8 returnval; for (i = 0; i < pal->settings.numColors; i++) { struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[pal->settings.paletteOffset + i]; struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[pal->settings.paletteOffset + i]; switch (pal->state) { case 1: // Fade color if (faded->r + pal->colorDelta >= 0 && faded->r + pal->colorDelta < 32) faded->r += pal->colorDelta; if (faded->g + pal->colorDelta >= 0 && faded->g + pal->colorDelta < 32) faded->g += pal->colorDelta; if (faded->b + pal->colorDelta >= 0 && faded->b + pal->colorDelta < 32) faded->b += pal->colorDelta; break; case 2: // Fade back to original color if (pal->colorDelta < 0) { if (faded->r + pal->colorDelta >= unfaded->r) faded->r += pal->colorDelta; if (faded->g + pal->colorDelta >= unfaded->g) faded->g += pal->colorDelta; if (faded->b + pal->colorDelta >= unfaded->b) faded->b += pal->colorDelta; } else { if (faded->r + pal->colorDelta <= unfaded->r) faded->r += pal->colorDelta; if (faded->g + pal->colorDelta <= unfaded->g) faded->g += pal->colorDelta; if (faded->b + pal->colorDelta <= unfaded->b) faded->b += pal->colorDelta; } break; } } if ((u32)pal->fadeCycleCounter++ != pal->settings.numFadeCycles) { returnval = 0; } else { pal->fadeCycleCounter = 0; pal->colorDelta *= -1; if (pal->state == 1) pal->state++; else pal->state--; returnval = 1; } return returnval; } static u8 RouletteFlash_FlashPalette(struct RouletteFlashPalette *pal) { u8 i = 0; switch (pal->state) { case 1: // Flash to color for (i = 0; i < pal->settings.numColors; i++) gPlttBufferFaded[pal->settings.paletteOffset + i] = pal->settings.color; pal->state++; break; case 2: // Restore to original color for (i = 0; i < pal->settings.numColors; i++) gPlttBufferFaded[pal->settings.paletteOffset + i] = gPlttBufferUnfaded[pal->settings.paletteOffset + i]; pal->state--; break; } return 1; } void RouletteFlash_Run(struct RouletteFlashUtil *flash) { u8 i = 0; if (flash->enabled) { for (i = 0; i < ARRAY_COUNT(flash->palettes); i++) { if ((flash->flags >> i) & 1) { if (--flash->palettes[i].delayCounter == (u8)-1) { if (flash->palettes[i].settings.color & FLASHUTIL_USE_EXISTING_COLOR) RouletteFlash_FadePalette(&flash->palettes[i]); else RouletteFlash_FlashPalette(&flash->palettes[i]); flash->palettes[i].delayCounter = flash->palettes[i].settings.delay; } } } } } void RouletteFlash_Enable(struct RouletteFlashUtil *flash, u16 flags) { u8 i = 0; flash->enabled++; for (i = 0; i < ARRAY_COUNT(flash->palettes); i++) { if ((flags >> i) & 1) { if (flash->palettes[i].available) { flash->flags |= 1 << i; flash->palettes[i].state = 1; } } } } void RouletteFlash_Stop(struct RouletteFlashUtil *flash, u16 flags) { u32 i; for (i = 0; i < ARRAY_COUNT(flash->palettes); i++) { if ((flash->flags >> i) & 1) { if (flash->palettes[i].available) { if ((flags >> i) & 1) { u32 offset = flash->palettes[i].settings.paletteOffset; u16 *faded = &gPlttBufferFaded[offset]; u16 *unfaded = &gPlttBufferUnfaded[offset]; memcpy(faded, unfaded, flash->palettes[i].settings.numColors * 2); flash->palettes[i].state = 0; flash->palettes[i].fadeCycleCounter = 0; flash->palettes[i].delayCounter = 0; if (flash->palettes[i].settings.colorDeltaDir < 0) flash->palettes[i].colorDelta = -1; else flash->palettes[i].colorDelta = 1; } } } } if (flags == 0xFFFF) { // Stopped all flash->enabled = 0; flash->flags = 0; } else { flash->flags &= ~flags; } } void InitPulseBlend(struct PulseBlend *pulseBlend) { u8 i = 0; pulseBlend->usedPulseBlendPalettes = 0; memset(&pulseBlend->pulseBlendPalettes, 0, sizeof(pulseBlend->pulseBlendPalettes)); for (; i < 16; i++) pulseBlend->pulseBlendPalettes[i].paletteSelector = i; } int InitPulseBlendPaletteSettings(struct PulseBlend *pulseBlend, const struct PulseBlendSettings *settings) { u8 i = 0; struct PulseBlendPalette *pulseBlendPalette = NULL; if (!pulseBlend->pulseBlendPalettes[0].inUse) { pulseBlendPalette = &pulseBlend->pulseBlendPalettes[0]; } else { while (++i < 16) { if (!pulseBlend->pulseBlendPalettes[i].inUse) { pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i]; break; } } } if (pulseBlendPalette == NULL) return 0xFF; pulseBlendPalette->blendCoeff = 0; pulseBlendPalette->fadeDirection = 0; pulseBlendPalette->available = 1; pulseBlendPalette->inUse = 1; pulseBlendPalette->delayCounter = 0; pulseBlendPalette->fadeCycleCounter = 0; memcpy(&pulseBlendPalette->pulseBlendSettings, settings, sizeof(*settings)); return i; } static void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *pulseBlendPalette) { u32 i; if (!pulseBlendPalette->available && pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload) { for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++) gPlttBufferFaded[i] = gPlttBufferUnfaded[i]; } memset(&pulseBlendPalette->pulseBlendSettings, 0, sizeof(pulseBlendPalette->pulseBlendSettings)); pulseBlendPalette->blendCoeff = 0; pulseBlendPalette->fadeDirection = 0; pulseBlendPalette->unk1_5 = 0; pulseBlendPalette->available = 1; pulseBlendPalette->inUse = 0; pulseBlendPalette->fadeCycleCounter = 0; pulseBlendPalette->delayCounter = 0; } void UnloadUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) { u16 i = 0; if (!multiSelection) { ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF]); } else { for (i = 0; i < 16; i++) { if ((pulseBlendPaletteSelector & 1) && pulseBlend->pulseBlendPalettes[i].inUse) ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[i]); pulseBlendPaletteSelector >>= 1; } } } void MarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) { u8 i = 0; if (!multiSelection) { i = pulseBlendPaletteSelector & 0xF; pulseBlend->pulseBlendPalettes[i].available = 0; pulseBlend->usedPulseBlendPalettes |= 1 << i; } else { for (i = 0; i < 16; i++) { if (!(pulseBlendPaletteSelector & 1) || !pulseBlend->pulseBlendPalettes[i].inUse || !pulseBlend->pulseBlendPalettes[i].available) { pulseBlendPaletteSelector <<= 1; } else { pulseBlend->pulseBlendPalettes[i].available = 0; pulseBlend->usedPulseBlendPalettes |= 1 << i; } } } } void UnmarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) { u32 i; struct PulseBlendPalette *pulseBlendPalette; u8 j = 0; if (!multiSelection) { pulseBlendPalette = &pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF]; if (!pulseBlendPalette->available && pulseBlendPalette->inUse) { if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload) { for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++) gPlttBufferFaded[i] = gPlttBufferUnfaded[i]; } pulseBlendPalette->available = 1; pulseBlend->usedPulseBlendPalettes &= ~(1 << j); } } else { for (j = 0; j < 16; j++) { pulseBlendPalette = &pulseBlend->pulseBlendPalettes[j]; if (!(pulseBlendPaletteSelector & 1) || pulseBlendPalette->available || !pulseBlendPalette->inUse) { pulseBlendPaletteSelector <<= 1; } else { if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload) { for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++) gPlttBufferFaded[i] = gPlttBufferUnfaded[i]; } pulseBlendPalette->available = 1; pulseBlend->usedPulseBlendPalettes &= ~(1 << j); } } } } void UpdatePulseBlend(struct PulseBlend *pulseBlend) { struct PulseBlendPalette *pulseBlendPalette; u8 i = 0; if (pulseBlend->usedPulseBlendPalettes) { for (i = 0; i < 16; i++) { pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i]; if ((!pulseBlendPalette->available && pulseBlendPalette->inUse) && (!gPaletteFade.active || !pulseBlendPalette->pulseBlendSettings.unk7_7)) { if (--pulseBlendPalette->delayCounter == 0xFF) { pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay; BlendPalette(pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->pulseBlendSettings.numColors, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor); switch (pulseBlendPalette->pulseBlendSettings.fadeType) { case 0: // Fade all the way to the max blend amount, then wrap around // BUG: This comparison will never be true for maxBlendCoeff values that are >= 8. This is because // maxBlendCoeff is a signed 4-bit field, but blendCoeff is an unsigned 4-bit field. This code is never // reached, anyway, so the bug is not observable in vanilla gameplay. if (pulseBlendPalette->blendCoeff++ == pulseBlendPalette->pulseBlendSettings.maxBlendCoeff) { pulseBlendPalette->fadeCycleCounter++; pulseBlendPalette->blendCoeff = 0; } break; case 1: // Fade in and out if (pulseBlendPalette->fadeDirection) { if (--pulseBlendPalette->blendCoeff == 0) { pulseBlendPalette->fadeCycleCounter++; pulseBlendPalette->fadeDirection ^= 1; } } else { u8 max = (pulseBlendPalette->pulseBlendSettings.maxBlendCoeff - 1) & 0xF; if (pulseBlendPalette->blendCoeff++ == max) { pulseBlendPalette->fadeCycleCounter++; pulseBlendPalette->fadeDirection ^= 1; } } break; case 2: // Flip back and forth if (pulseBlendPalette->fadeDirection) pulseBlendPalette->blendCoeff = 0; else pulseBlendPalette->blendCoeff = pulseBlendPalette->pulseBlendSettings.maxBlendCoeff & 0xF; pulseBlendPalette->fadeDirection ^= 1; pulseBlendPalette->fadeCycleCounter++; break; } if (pulseBlendPalette->pulseBlendSettings.numFadeCycles != 0xFF && pulseBlendPalette->fadeCycleCounter == pulseBlendPalette->pulseBlendSettings.numFadeCycles) UnmarkUsedPulseBlendPalettes(pulseBlend, pulseBlendPalette->paletteSelector, FALSE); } } } } } // Below used for the Roulette grid void FillTilemapRect(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height) { u16 *_dest; u32 i; u32 j; i = 0; dest = &dest[top * 32 + left]; for (; i < height; i++) { _dest = dest + i * 32; for (j = 0; j < width; j++) { *_dest++ = src; } } } void SetTilemapRect(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height) { u16 *_dest; u16 *_src = src; u32 i; u32 j; i = 0; dest = &dest[top * 32 + left]; for (; i < height; i++) { _dest = dest + i * 32; for (j = 0; j < width; j++) { *_dest++ = *_src++; } } } ================================================ FILE: src/party_menu.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_gfx_sfx_util.h" #include "battle_interface.h" #include "battle_tower.h" #include "berry_pouch.h" #include "data.h" #include "decompress.h" #include "easy_chat.h" #include "event_data.h" #include "evolution_scene.h" #include "field_effect.h" #include "field_player_avatar.h" #include "field_fadetransition.h" #include "field_weather.h" #include "fieldmap.h" #include "fldeff.h" #include "graphics.h" #include "help_message.h" #include "help_system.h" #include "item.h" #include "item_menu.h" #include "item_use.h" #include "link.h" #include "link_rfu.h" #include "load_save.h" #include "mail.h" #include "mail_data.h" #include "main.h" #include "menu.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "metatile_behavior.h" #include "overworld.h" #include "party_menu.h" #include "player_pc.h" #include "pokedex.h" #include "pokemon.h" #include "pokemon_icon.h" #include "pokemon_jump.h" #include "pokemon_special_anim.h" #include "pokemon_summary_screen.h" #include "quest_log.h" #include "region_map.h" #include "reshow_battle_screen.h" #include "scanline_effect.h" #include "script.h" #include "start_menu.h" #include "string_util.h" #include "strings.h" #include "task.h" #include "teachy_tv.h" #include "text_window.h" #include "tm_case.h" #include "trade.h" #include "union_room.h" #include "constants/battle.h" #include "constants/easy_chat.h" #include "constants/field_effects.h" #include "constants/item_effects.h" #include "constants/items.h" #include "constants/maps.h" #include "constants/moves.h" #include "constants/pokemon.h" #include "constants/quest_log.h" #include "constants/songs.h" #include "constants/sound.h" #define PARTY_PAL_SELECTED (1 << 0) #define PARTY_PAL_FAINTED (1 << 1) #define PARTY_PAL_TO_SWITCH (1 << 2) #define PARTY_PAL_MULTI_ALT (1 << 3) #define PARTY_PAL_SWITCHING (1 << 4) #define PARTY_PAL_TO_SOFTBOIL (1 << 5) #define PARTY_PAL_NO_MON (1 << 6) #define PARTY_PAL_UNUSED (1 << 7) #define MENU_DIR_DOWN 1 #define MENU_DIR_UP -1 #define MENU_DIR_RIGHT 2 #define MENU_DIR_LEFT -2 #define SLOT_CONFIRM (PARTY_SIZE) #define SLOT_CANCEL (PARTY_SIZE + 1) enum { CAN_LEARN_MOVE, CANNOT_LEARN_MOVE, ALREADY_KNOWS_MOVE, CANNOT_LEARN_MOVE_IS_EGG }; enum { LEARN_VIA_TMHM, LEARN_VIA_LEVEL_UP, LEARN_VIA_TUTOR, }; enum { DRAW_TEXT_ONLY, DRAW_MENU_BOX_AND_TEXT, DRAW_MENU_BOX_ONLY, }; struct PartyMenuBoxInfoRects { void (*blitFunc)(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP); u8 dimensions[24]; u8 descTextLeft; u8 descTextTop; u8 descTextWidth; u8 descTextHeight; }; struct PartyMenuInternal { TaskFunc task; MainCallback exitCallback; u32 chooseMultiple:1; u32 lastSelectedSlot:3; // Used to return to same slot when going left/right bewtween columns u32 spriteIdConfirmPokeball:7; u32 spriteIdCancelPokeball:7; u32 messageId:14; u8 windowId[3]; u8 actions[8]; u8 numActions; u16 palBuffer[BG_PLTT_SIZE / sizeof(u16)]; s16 data[16]; }; struct PartyMenuBox { const struct PartyMenuBoxInfoRects *infoRects; const u8 *spriteCoords; u8 windowId; u8 monSpriteId; u8 itemSpriteId; u8 pokeballSpriteId; u8 statusSpriteId; }; static void BlitBitmapToPartyWindow_LeftColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP); static void BlitBitmapToPartyWindow_RightColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP); static void CursorCB_Summary(u8 taskId); static void CursorCB_Switch(u8 taskId); static void CursorCB_Cancel1(u8 taskId); static void CursorCB_Item(u8 taskId); static void CursorCB_Give(u8 taskId); static void CursorCB_TakeItem(u8 taskId); static void CursorCB_Mail(u8 taskId); static void CursorCB_Read(u8 taskId); static void CursorCB_TakeMail(u8 taskId); static void CursorCB_Cancel2(u8 taskId); static void CursorCB_SendMon(u8 taskId); static void CursorCB_Enter(u8 taskId); static void CursorCB_NoEntry(u8 taskId); static void CursorCB_Store(u8 taskId); static void CursorCB_Register(u8 taskId); static void CursorCB_Trade1(u8 taskId); static void CursorCB_Trade2(u8 taskId); static void CursorCB_FieldMove(u8 taskId); static bool8 SetUpFieldMove_Fly(void); static bool8 SetUpFieldMove_Waterfall(void); static bool8 SetUpFieldMove_Surf(void); static void CB2_InitPartyMenu(void); static void ResetPartyMenu(void); static bool8 ShowPartyMenu(void); static void SetPartyMonsAllowedInMinigame(void); static void ExitPartyMenu(void); static bool8 CreatePartyMonSpritesLoop(void); static bool8 AllocPartyMenuBg(void); static bool8 AllocPartyMenuBgGfx(void); static void InitPartyMenuWindows(u8 layout); static void InitPartyMenuBoxes(u8 layout); static void LoadPartyMenuPokeballGfx(void); static void LoadPartyMenuAilmentGfx(void); static bool8 RenderPartyMenuBoxes(void); static void CreateCancelConfirmPokeballSprites(void); static void CreateCancelConfirmWindows(bool8 chooseMultiple); static void Task_ExitPartyMenu(u8 taskId); static void FreePartyPointers(void); static void PartyPaletteBufferCopy(u8 offset); static void DisplayPartyPokemonDataForMultiBattle(u8 slot); static void DisplayPartyPokemonDataForChooseMultiple(u8 slot); static bool8 DisplayPartyPokemonDataForMoveTutorOrEvolutionItem(u8 slot); static void DisplayPartyPokemonData(u8 slot); static void DisplayPartyPokemonDataForWirelessMinigame(u8 slot); static void LoadPartyBoxPalette(struct PartyMenuBox *menuBox, u8 palFlags); static void DrawEmptySlot(u8 windowId); static void DisplayPartyPokemonNickname(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText); static void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText); static void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText); static void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText); static void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText); static void DisplayPartyPokemonHPBarCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox); static void DisplayPartyPokemonDescriptionText(u8 stringId, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText); static bool8 GetBattleEntryEligibility(struct Pokemon *mon); static bool8 IsMonAllowedInMinigame(u8 slot); static void DisplayPartyPokemonDataToTeachMove(u8 slot, u16 item, u8 tutor); static u8 CanMonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor); static void DisplayPartyPokemonBarDetail(u8 windowId, const u8 *str, u8 color, const u8 *dimensions); static void DisplayPartyPokemonLevel(u8 level, struct PartyMenuBox *menuBox); static void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, struct PartyMenuBox *menuBox); static void DisplayPartyPokemonHP(u16 hp, struct PartyMenuBox *menuBox); static void DisplayPartyPokemonMaxHP(u16 maxhp, struct PartyMenuBox *menuBox); static void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct PartyMenuBox *menuBox); static void CreatePartyMonIconSpriteParameterized(u16 species, u32 pid, struct PartyMenuBox *menuBox, u8 priority, bool32 handleDeoxys); static void CreatePartyMonHeldItemSpriteParameterized(u16 species, u16 item, struct PartyMenuBox *menuBox); static void CreatePartyMonPokeballSpriteParameterized(u16 species, struct PartyMenuBox *menuBox); static void CreatePartyMonStatusSpriteParameterized(u16 species, u8 status, struct PartyMenuBox *menuBox); static void CreatePartyMonIconSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox, u32 slot); static void CreatePartyMonHeldItemSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox); static void CreatePartyMonPokeballSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox); static void CreatePartyMonStatusSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox); static void CreateCancelConfirmPokeballSprites(void); static void DrawCancelConfirmButtons(void); static u8 CreatePokeballButtonSprite(u8 x, u8 y); static u8 CreateSmallPokeballButtonSprite(u8 x, u8 y); static u8 GetPartyBoxPaletteFlags(u8 slot, u8 animNum); static void AnimateSelectedPartyIcon(u8 spriteId, u8 animNum); static void PartyMenuStartSpriteAnim(u8 spriteId, u8 animNum); static void Task_ClosePartyMenuAndSetCB2(u8 taskId); static void UpdatePartyToFieldOrder(void); static s8 *GetCurrentPartySlotPtr(void); static u16 PartyMenuButtonHandler(s8 *slotPtr); static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr); static void HandleChooseMonCancel(u8 taskId, s8 *slotPtr); static void MoveCursorToConfirm(void); static bool8 IsSelectedMonNotEgg(u8 *slotPtr); static void TryTutorSelectedMon(u8 taskId); static void TryGiveMailToSelectedMon(u8 taskId); static void SwitchSelectedMons(u8 taskId); static void TryEnterMonForMinigame(u8 taskId, u8 slot); static void Task_TryCreateSelectionWindow(u8 taskId); static void TryGiveItemOrMailToSelectedMon(u8 taskId); static void PartyMenuRemoveWindow(u8 *windowId); static void CB2_SetUpExitToBattleScreen(void); static void Task_ClosePartyMenuAfterText(u8 taskId); static void FinishTwoMonAction(u8 taskId); static void CancelParticipationPrompt(u8 taskId); static void DisplayCancelChooseMonYesNo(u8 taskId); static void Task_CancelChooseMonYesNo(u8 taskId); static void Task_HandleCancelChooseMonYesNoInput(u8 taskId); static void PartyMenuDisplayYesNoMenu(void); static void Task_ReturnToChooseMonAfterText(u8 taskId); static void UpdateCurrentPartySelection(s8 *slotPtr, s8 movementDir); static void UpdatePartySelectionSingleLayout(s8 *slotPtr, s8 movementDir); static void UpdatePartySelectionDoubleLayout(s8 *slotPtr, s8 movementDir); static s8 GetNewSlotDoubleLayout(s8 slotId, s8 movementDir); static void Task_PrintAndWaitForText(u8 taskId); static void PartyMenuPrintText(const u8 *text); static void SetSwappedHeldItemQuestLogEvent(struct Pokemon *mon, u16 item, u16 item2); static bool16 IsMonAllowedInPokemonJump(struct Pokemon *mon); static bool16 IsMonAllowedInDodrioBerryPicking(struct Pokemon *mon); static void Task_CancelParticipationYesNo(u8 taskId); static void Task_HandleCancelParticipationYesNoInput(u8 taskId); static void Task_TryCreateSelectionWindow(u8 taskId); static u16 GetTutorMove(u8 tutor); static bool8 CanLearnTutorMove(u16 species, u8 tutor); static void CreateSelectionWindow(void); static bool8 ShouldUseChooseMonText(void); static void UpdatePartyMonHPBar(u8 spriteId, struct Pokemon *mon); static void SpriteCB_UpdatePartyMonIcon(struct Sprite *sprite); static void SpriteCB_BouncePartyMonIcon(struct Sprite *sprite); static void SpriteCB_HeldItem(struct Sprite *sprite); static void UpdatePartyMonHeldItemSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox); static void ShowOrHideHeldItemSprite(u16 item, struct PartyMenuBox *menuBox); static void CreateHeldItemSpriteForTrade(u8 spriteId, bool8 isMail); static void SetPartyMonAilmentGfx(struct Pokemon *mon, struct PartyMenuBox *menuBox); static void UpdatePartyMonAilmentGfx(u8 status, struct PartyMenuBox *menuBox); static void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId); static u8 GetPartyMenuActionsTypeInBattle(struct Pokemon *mon); static u8 GetPartySlotEntryStatus(s8 slot); static void Task_HandleSelectionMenuInput(u8 taskId); static void CB2_ShowPokemonSummaryScreen(void); static void CB2_ReturnToPartyMenuFromSummaryScreen(void); static void UpdatePartyToBattleOrder(void); static void SlidePartyMenuBoxOneStep(u8 taskId); static void Task_SlideSelectedSlotsOffscreen(u8 taskId); static void SwitchPartyMon(void); static void Task_SlideSelectedSlotsOnscreen(u8 taskId); static void CB2_WriteMailToGiveMon(void); static void Task_SwitchHoldItemsPrompt(u8 taskId); static void Task_GiveHoldItem(u8 taskId); static void Task_UpdateHeldItemSprite(u8 taskId); static void Task_HandleSwitchItemsYesNoInput(u8 taskId); static void Task_SwitchItemsYesNo(u8 taskId); static void Task_WriteMailToGiveMonAfterText(u8 taskId); static void CB2_ReturnToPartyMenuFromWritingMail(void); static void Task_DisplayGaveMailFromPartyMessage(u8 taskId); static void CB2_ReadHeldMail(void); static void CB2_ReturnToPartyMenuFromReadingMail(void); static void Task_SendMailToPCYesNo(u8 taskId); static void Task_HandleSendMailToPCYesNoInput(u8 taskId); static void Task_LoseMailMessageYesNo(u8 taskId); static void Task_HandleLoseMailMessageYesNoInput(u8 taskId); static bool8 TrySwitchInPokemon(void); static void DisplayCantUseFlashMessage(void); static void DisplayCantUseSurfMessage(void); static void Task_CancelAfterAorBPress(u8 taskId); static void DisplayFieldMoveExitAreaMessage(u8 taskId); static void Task_FieldMoveExitAreaYesNo(u8 taskId); static void Task_HandleFieldMoveExitAreaYesNoInput(u8 taskId); static void Task_FieldMoveWaitForFade(u8 taskId); static u16 GetFieldMoveMonSpecies(void); static u8 GetPartyLayoutFromBattleType(void); static void Task_SetSacredAshCB(u8 taskId); static void CB2_ReturnToBagMenu(void); static u8 GetPartyIdFromBattleSlot(u8 slot); static void Task_DisplayHPRestoredMessage(u8 taskId); static void SetSelectedMoveForPPItem(u8 taskId); static void ReturnToUseOnWhichMon(u8 taskId); static void TryUsePPItemInBattle(u8 taskId); static void ItemUseCB_LearnedMove(u8 taskId, TaskFunc func); static void Task_LearnedMove(u8 taskId); static void Task_ReplaceMoveYesNo(u8 taskId); static void Task_DoLearnedMoveFanfareAfterText(u8 taskId); static void Task_TryLearningNextMove(u8 taskId); static void Task_LearnNextMoveOrClosePartyMenu(u8 taskId); static void Task_HandleReplaceMoveYesNoInput(u8 taskId); static void StopLearningMovePrompt(u8 taskId); static void Task_ShowSummaryScreenToForgetMove(u8 taskId); static void CB2_ShowSummaryScreenToForgetMove(void); static void CB2_ReturnToPartyMenuWhileLearningMove(void); static void Task_ReturnToPartyMenuWhileLearningMove(u8 taskId); static void DisplayPartyMenuForgotMoveMessage(u8 taskId); static void Task_PartyMenuReplaceMove(u8 taskId); static void Task_StopLearningMoveYesNo(u8 taskId); static void Task_HandleStopLearningMoveYesNoInput(u8 taskId); static void Task_TryLearningNextMoveAfterText(u8 taskId); static void ItemUseCB_RareCandyStep(u8 taskId, TaskFunc func); static void Task_DisplayLevelUpStatsPg1(u8 taskId); static void Task_DisplayLevelUpStatsPg2(u8 taskId); static void UpdateMonDisplayInfoAfterRareCandy(u8 slot, struct Pokemon *mon); static void DisplayLevelUpStatsPg1(u8 taskId); static void DisplayLevelUpStatsPg2(u8 taskId); static void Task_TryLearnNewMoves(u8 taskId); static void PartyMenuTryEvolution(u8 taskId); static void DisplayMonNeedsToReplaceMove(u8 taskId); static void DisplayMonLearnedMove(u8 taskId, u16 move); static void Task_SacredAshDisplayHPRestored(u8 taskId); static void Task_SacredAshLoop(u8 taskId); static void UseSacredAsh(u8 taskId); static void CB2_ReturnToBerryPouchMenu(void); static void CB2_ReturnToTMCaseMenu(void); static void GiveItemOrMailToSelectedMon(u8 taskId); static void RemoveItemToGiveFromBag(u16 item); static void DisplayItemMustBeRemovedFirstMessage(u8 taskId); static void CB2_WriteMailToGiveMonFromBag(void); static void GiveItemToSelectedMon(u8 taskId); static void Task_UpdateHeldItemSpriteAndClosePartyMenu(u8 taskId); static void Task_SwitchItemsFromBagYesNo(u8 taskId); static void CB2_ReturnToPartyOrBagMenuFromWritingMail(void); static bool8 ReturnGiveItemToBagOrPC(u16 item); static void Task_DisplayGaveMailFromBagMessage(u8 taskId); static void Task_HandleSwitchItemsFromBagYesNoInput(u8 taskId); static void Task_ValidateChosenMonsForBattle(u8 taskId); static bool8 HasPartySlotAlreadyBeenSelected(u8 slot); static void Task_ContinueChoosingMonsForBattle(u8 taskId); static void BufferBattlePartyOrder(u8 *partyBattleOrder, u8 flankId); static void BufferBattlePartyOrderBySide(u8 *partyBattleOrder, u8 flankId, u8 battlerId); static void Task_InitMultiPartnerPartySlideIn(u8 taskId); static void Task_WaitAfterMultiPartnerPartySlideIn(u8 taskId); static void SlideMultiPartyMenuBoxSpritesOneStep(u8 taskId); static void Task_MultiPartnerPartySlideIn(u8 taskId); static bool8 CB2_FadeFromPartyMenu(void); static void Task_PartyMenuWaitForFade(u8 taskId); static void Task_FirstBattleEnterParty_DarkenScreen(u8 taskId); static void Task_FirstBattleEnterParty_WaitDarken(u8 taskId); static void Task_FirstBattleEnterParty_CreatePrinter(u8 taskId); static void Task_FirstBattleEnterParty_RunPrinterMsg1(u8 taskId); static void Task_FirstBattleEnterParty_LightenFirstMonIcon(u8 taskId); static void Task_FirstBattleEnterParty_WaitLightenFirstMonIcon(u8 taskId); static void Task_FirstBattleEnterParty_StartPrintMsg2(u8 taskId); static void Task_FirstBattleEnterParty_RunPrinterMsg2(u8 taskId); static void Task_FirstBattleEnterParty_FadeNormal(u8 taskId); static void Task_FirstBattleEnterParty_WaitFadeNormal(u8 taskId); static void Task_PartyMenu_PokedudeStep(u8 taskId); static void Task_PartyMenuFromBag_PokedudeStep(u8 taskId); static bool8 PartyMenuPokedudeIsCancelled(u8 taskId); static void PartyMenuHandlePokedudeCancel(void); static void PartyMenu_Oak_PrintText(u8 windowId, const u8 *str); static u8 FirstBattleEnterParty_CreateWindowAndMsg1Printer(void); static void FirstBattleEnterParty_DestroyVoiceoverWindow(u8 windowId); static void SetSwitchedPartyOrderQuestLogEvent(void); static void SetUsedFieldMoveQuestLogEvent(struct Pokemon *mon, u8 fieldMove); static void CB2_DoUseItemAnim(void); static void CB2_UseItem(void); static void TryUsePPItemOutsideBattle(u8 taskId); static void ItemUseCB_RestorePP(u8 taskId, TaskFunc func); static void ItemUseCB_ReplaceMoveWithTMHM(u8 taskId, TaskFunc func); static void Task_ReplaceMoveWithTMHM(u8 taskId); static void CB2_UseEvolutionStone(void); static bool8 MonCanEvolve(void); static u16 ItemEffectToMonEv(struct Pokemon *mon, u8 effectType); static void ItemEffectToStatString(u8 effectType, u8 *dest); static bool8 SetUpFieldMove_Dive(void); static EWRAM_DATA struct PartyMenuInternal *sPartyMenuInternal = NULL; EWRAM_DATA struct PartyMenu gPartyMenu = {0}; static EWRAM_DATA struct PartyMenuBox *sPartyMenuBoxes = NULL; static EWRAM_DATA u8 *sPartyBgGfxTilemap = NULL; static EWRAM_DATA u8 *sPartyBgTilemapBuffer = NULL; EWRAM_DATA bool8 gPartyMenuUseExitCallback = FALSE; EWRAM_DATA u8 gSelectedMonPartyId = 0; EWRAM_DATA MainCallback gPostMenuFieldCallback = NULL; static EWRAM_DATA u16 *sSlot1TilemapBuffer = NULL; // for switching party slots static EWRAM_DATA u16 *sSlot2TilemapBuffer = NULL; static EWRAM_DATA struct Pokemon *sSacredAshQuestLogMonBackup = NULL; EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0}; static EWRAM_DATA u16 sPartyMenuItemId = ITEM_NONE; ALIGNED(4) EWRAM_DATA u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2] = {0}; // bits 0-3 are the current pos of Slot 1, 4-7 are Slot 2, and so on void (*gItemUseCB)(u8, TaskFunc); #include "data/pokemon/tutor_learnsets.h" #include "data/party_menu.h" void InitPartyMenu(u8 menuType, u8 layout, u8 partyAction, bool8 keepCursorPos, u8 messageId, TaskFunc task, MainCallback callback) { u32 i; ResetPartyMenu(); sPartyMenuInternal = Alloc(sizeof(struct PartyMenuInternal)); if (sPartyMenuInternal == NULL) SetMainCallback2(callback); else { gPartyMenu.menuType = menuType; gPartyMenu.exitCallback = callback; gPartyMenu.action = partyAction; sPartyMenuInternal->messageId = messageId; sPartyMenuInternal->task = task; sPartyMenuInternal->exitCallback = NULL; sPartyMenuInternal->lastSelectedSlot = 0; if (menuType == PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS) sPartyMenuInternal->chooseMultiple = TRUE; else sPartyMenuInternal->chooseMultiple = FALSE; if (layout != KEEP_PARTY_LAYOUT) gPartyMenu.layout = layout; for (i = 0; i < ARRAY_COUNT(sPartyMenuInternal->data); ++i) sPartyMenuInternal->data[i] = 0; for (i = 0; i < ARRAY_COUNT(sPartyMenuInternal->windowId); ++i) sPartyMenuInternal->windowId[i] = WINDOW_NONE; if (!keepCursorPos) gPartyMenu.slotId = 0; else if (gPartyMenu.slotId > PARTY_SIZE - 1 || GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES) == SPECIES_NONE) gPartyMenu.slotId = 0; gTextFlags.autoScroll = FALSE; CalculatePlayerPartyCount(); SetMainCallback2(CB2_InitPartyMenu); } } static void CB2_UpdatePartyMenu(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); DoScheduledBgTilemapCopiesToVram(); UpdatePaletteFade(); } static void VBlankCB_PartyMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB2_InitPartyMenu(void) { while (TRUE) { if (MenuHelpers_ShouldWaitForLinkRecv() == TRUE || ShowPartyMenu() == TRUE || MenuHelpers_IsLinkActive() == TRUE) break; } } static bool8 ShowPartyMenu(void) { switch (gMain.state) { case 0: SetVBlankHBlankCallbacksToNull(); ResetVramOamAndBgCntRegs(); ClearScheduledBgCopiesToVram(); ++gMain.state; break; case 1: ScanlineEffect_Stop(); ++gMain.state; break; case 2: ResetPaletteFade(); gPaletteFade.bufferTransferDisabled = TRUE; ++gMain.state; break; case 3: ResetSpriteData(); ++gMain.state; break; case 4: FreeAllSpritePalettes(); ++gMain.state; break; case 5: if (!MenuHelpers_IsLinkActive()) ResetTasks(); ++gMain.state; break; case 6: SetPartyMonsAllowedInMinigame(); ++gMain.state; break; case 7: if (!AllocPartyMenuBg()) { ExitPartyMenu(); return TRUE; } else { sPartyMenuInternal->data[0] = 0; ++gMain.state; } break; case 8: if (AllocPartyMenuBgGfx()) ++gMain.state; break; case 9: InitPartyMenuWindows(gPartyMenu.layout); ++gMain.state; break; case 10: InitPartyMenuBoxes(gPartyMenu.layout); sPartyMenuInternal->data[0] = 0; ++gMain.state; break; case 11: LoadHeldItemIcons(); ++gMain.state; break; case 12: LoadPartyMenuPokeballGfx(); ++gMain.state; break; case 13: LoadPartyMenuAilmentGfx(); ++gMain.state; break; case 14: LoadMonIconPalettes(); ++gMain.state; break; case 15: if (CreatePartyMonSpritesLoop()) { sPartyMenuInternal->data[0] = 0; ++gMain.state; } break; case 16: if (RenderPartyMenuBoxes()) { sPartyMenuInternal->data[0] = 0; ++gMain.state; } break; case 17: CreateCancelConfirmPokeballSprites(); ++gMain.state; break; case 18: CreateCancelConfirmWindows(sPartyMenuInternal->chooseMultiple); ++gMain.state; break; case 19: SetHelpContext(HELPCONTEXT_PARTY_MENU); ++gMain.state; break; case 20: CreateTask(sPartyMenuInternal->task, 0); DisplayPartyMenuStdMessage(sPartyMenuInternal->messageId); ++gMain.state; break; case 21: BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); ++gMain.state; break; case 22: BeginNormalPaletteFade(PALETTES_ALL, -2, 16, 0, RGB_BLACK); gPaletteFade.bufferTransferDisabled = FALSE; ++gMain.state; break; default: SetVBlankCallback(VBlankCB_PartyMenu); SetMainCallback2(CB2_UpdatePartyMenu); return TRUE; } return FALSE; } static void ExitPartyMenu(void) { BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); CreateTask(Task_ExitPartyMenu, 0); SetVBlankCallback(VBlankCB_PartyMenu); SetMainCallback2(CB2_UpdatePartyMenu); } static void Task_ExitPartyMenu(u8 taskId) { if (!gPaletteFade.active) { SetMainCallback2(gPartyMenu.exitCallback); FreePartyPointers(); DestroyTask(taskId); } } static void ResetPartyMenu(void) { sPartyMenuInternal = NULL; sPartyBgTilemapBuffer = NULL; sPartyMenuBoxes = NULL; sPartyBgGfxTilemap = NULL; } static bool8 AllocPartyMenuBg(void) { ResetAllBgsCoordinatesAndBgCntRegs(); sPartyBgTilemapBuffer = Alloc(0x800); if (sPartyBgTilemapBuffer == NULL) return FALSE; memset(sPartyBgTilemapBuffer, 0, 0x800); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sPartyMenuBgTemplates, ARRAY_COUNT(sPartyMenuBgTemplates)); SetBgTilemapBuffer(1, sPartyBgTilemapBuffer); ScheduleBgCopyTilemapToVram(1); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); SetGpuReg(REG_OFFSET_BLDCNT, 0); ShowBg(0); ShowBg(1); ShowBg(2); return TRUE; } static bool8 AllocPartyMenuBgGfx(void) { u32 sizeout; switch (sPartyMenuInternal->data[0]) { case 0: sPartyBgGfxTilemap = MallocAndDecompress(gPartyMenuBg_Gfx, &sizeout); LoadBgTiles(1, sPartyBgGfxTilemap, sizeout, 0); ++sPartyMenuInternal->data[0]; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { LZDecompressWram(gPartyMenuBg_Tilemap, sPartyBgTilemapBuffer); ++sPartyMenuInternal->data[0]; } break; case 2: LoadCompressedPalette(gPartyMenuBg_Pal, BG_PLTT_ID(0), 11 * PLTT_SIZE_4BPP); CpuCopy16(gPlttBufferUnfaded, sPartyMenuInternal->palBuffer, 11 * PLTT_SIZE_4BPP); ++sPartyMenuInternal->data[0]; break; case 3: PartyPaletteBufferCopy(4); ++sPartyMenuInternal->data[0]; break; case 4: PartyPaletteBufferCopy(5); ++sPartyMenuInternal->data[0]; break; case 5: PartyPaletteBufferCopy(6); ++sPartyMenuInternal->data[0]; break; case 6: PartyPaletteBufferCopy(7); ++sPartyMenuInternal->data[0]; break; case 7: PartyPaletteBufferCopy(8); ++sPartyMenuInternal->data[0]; break; default: return TRUE; } return FALSE; } static void PartyPaletteBufferCopy(u8 offset) { offset = PLTT_ID(offset); CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(3)], &gPlttBufferUnfaded[offset], PLTT_SIZE_4BPP); CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(3)], &gPlttBufferFaded[offset], PLTT_SIZE_4BPP); } static void FreePartyPointers(void) { if (sPartyMenuInternal) Free(sPartyMenuInternal); if (sPartyBgTilemapBuffer) Free(sPartyBgTilemapBuffer); if (sPartyBgGfxTilemap) Free(sPartyBgGfxTilemap); if (sPartyMenuBoxes) Free(sPartyMenuBoxes); FreeAllWindowBuffers(); } static void InitPartyMenuBoxes(u8 layout) { u32 i; sPartyMenuBoxes = Alloc(sizeof(struct PartyMenuBox[PARTY_SIZE])); for (i = 0; i < PARTY_SIZE; ++i) { sPartyMenuBoxes[i].infoRects = &sPartyBoxInfoRects[PARTY_BOX_RIGHT_COLUMN]; sPartyMenuBoxes[i].spriteCoords = sPartyMenuSpriteCoords[layout][i]; sPartyMenuBoxes[i].windowId = i; } // The first party mon goes in the left column sPartyMenuBoxes[0].infoRects = &sPartyBoxInfoRects[PARTY_BOX_LEFT_COLUMN]; if (layout == PARTY_LAYOUT_MULTI_SHOWCASE) sPartyMenuBoxes[3].infoRects = &sPartyBoxInfoRects[PARTY_BOX_LEFT_COLUMN]; else if (layout != PARTY_LAYOUT_SINGLE) sPartyMenuBoxes[1].infoRects = &sPartyBoxInfoRects[PARTY_BOX_LEFT_COLUMN]; } static void RenderPartyMenuBox(u8 slot) { if (gPartyMenu.menuType == PARTY_MENU_TYPE_MULTI_SHOWCASE && slot >= MULTI_PARTY_SIZE) { DisplayPartyPokemonDataForMultiBattle(slot); LoadPartyBoxPalette(&sPartyMenuBoxes[slot], PARTY_PAL_MULTI_ALT); CopyWindowToVram(sPartyMenuBoxes[slot].windowId, COPYWIN_GFX); PutWindowTilemap(sPartyMenuBoxes[slot].windowId); ScheduleBgCopyTilemapToVram(2); } else { if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) == SPECIES_NONE) { DrawEmptySlot(sPartyMenuBoxes[slot].windowId); CopyWindowToVram(sPartyMenuBoxes[slot].windowId, COPYWIN_GFX); } else { if (gPartyMenu.menuType == PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS) DisplayPartyPokemonDataForChooseMultiple(slot); else if (gPartyMenu.menuType == PARTY_MENU_TYPE_MINIGAME) DisplayPartyPokemonDataForWirelessMinigame(slot); else if (!DisplayPartyPokemonDataForMoveTutorOrEvolutionItem(slot)) DisplayPartyPokemonData(slot); if (gPartyMenu.menuType == PARTY_MENU_TYPE_MULTI_SHOWCASE) AnimatePartySlot(slot, 0); else if (gPartyMenu.slotId == slot) AnimatePartySlot(slot, 1); else AnimatePartySlot(slot, 0); } PutWindowTilemap(sPartyMenuBoxes[slot].windowId); ScheduleBgCopyTilemapToVram(0); } } static void DisplayPartyPokemonData(u8 slot) { if (GetMonData(&gPlayerParty[slot], MON_DATA_IS_EGG)) { sPartyMenuBoxes[slot].infoRects->blitFunc(sPartyMenuBoxes[slot].windowId, 0, 0, 0, 0, TRUE); DisplayPartyPokemonNickname(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); } else { sPartyMenuBoxes[slot].infoRects->blitFunc(sPartyMenuBoxes[slot].windowId, 0, 0, 0, 0, FALSE); DisplayPartyPokemonNickname(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); DisplayPartyPokemonLevelCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); DisplayPartyPokemonGenderNidoranCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); DisplayPartyPokemonHPCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); DisplayPartyPokemonMaxHPCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); DisplayPartyPokemonHPBarCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot]); } } static void DisplayPartyPokemonDescriptionData(u8 slot, u8 stringId) { struct Pokemon *mon = &gPlayerParty[slot]; sPartyMenuBoxes[slot].infoRects->blitFunc(sPartyMenuBoxes[slot].windowId, 0, 0, 0, 0, TRUE); DisplayPartyPokemonNickname(mon, &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); if (!GetMonData(mon, MON_DATA_IS_EGG)) { DisplayPartyPokemonLevelCheck(mon, &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); DisplayPartyPokemonGenderNidoranCheck(mon, &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); } DisplayPartyPokemonDescriptionText(stringId, &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY); } static void DisplayPartyPokemonDataForChooseMultiple(u8 slot) { u32 i; struct Pokemon *mon = &gPlayerParty[slot]; u8 *order = gSelectedOrderFromParty; u8 maxBattlers; if (!GetBattleEntryEligibility(mon)) DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NOT_ABLE); else { if (gPartyMenu.chooseMonsBattleType == CHOOSE_MONS_FOR_UNION_ROOM_BATTLE) maxBattlers = 2; else maxBattlers = 3; for (i = 0; i < maxBattlers; ++i) { if (order[i] != 0 && (order[i] - 1) == slot) { DisplayPartyPokemonDescriptionData(slot, i + PARTYBOX_DESC_FIRST); return; } } DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_ABLE_3); } } static void DisplayPartyPokemonDataForWirelessMinigame(u8 slot) { if (IsMonAllowedInMinigame(slot) == TRUE) DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_ABLE); else DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NOT_ABLE); } // Returns TRUE if teaching move or cant evolve with item (i.e. description data is shown), FALSE otherwise static bool8 DisplayPartyPokemonDataForMoveTutorOrEvolutionItem(u8 slot) { struct Pokemon *currentPokemon = &gPlayerParty[slot]; u16 item = gSpecialVar_ItemId; if (gPartyMenu.action == PARTY_ACTION_MOVE_TUTOR) { gSpecialVar_Result = FALSE; if (gSpecialVar_0x8005 >= TUTOR_MOVE_COUNT) return FALSE; DisplayPartyPokemonDataToTeachMove(slot, 0, gSpecialVar_0x8005); } else { if (gPartyMenu.action != PARTY_ACTION_USE_ITEM) return FALSE; switch (CheckIfItemIsTMHMOrEvolutionStone(item)) { default: return FALSE; case 1: // TM/HM DisplayPartyPokemonDataToTeachMove(slot, item, 0); break; case 2: // Evolution stone if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, EVO_MODE_ITEM_CHECK, item) != SPECIES_NONE) return FALSE; DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NO_USE); break; } } return TRUE; } static void DisplayPartyPokemonDataToTeachMove(u8 slot, u16 item, u8 tutor) { switch (CanMonLearnTMTutor(&gPlayerParty[slot], item, tutor)) { case CANNOT_LEARN_MOVE: case CANNOT_LEARN_MOVE_IS_EGG: DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NOT_ABLE_2); break; case ALREADY_KNOWS_MOVE: DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_LEARNED); break; default: DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_ABLE_2); break; } } static void DisplayPartyPokemonDataForMultiBattle(u8 slot) { struct PartyMenuBox *menuBox = &sPartyMenuBoxes[slot]; u8 actualSlot = slot - (3); if (gMultiPartnerParty[actualSlot].species == SPECIES_NONE) DrawEmptySlot(menuBox->windowId); else { menuBox->infoRects->blitFunc(menuBox->windowId, 0, 0, 0, 0, FALSE); StringCopy(gStringVar1, gMultiPartnerParty[actualSlot].nickname); StringGet_Nickname(gStringVar1); if (StringLength(gStringVar1) <= 5) ConvertInternationalString(gStringVar1, 1); DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, menuBox->infoRects->dimensions); DisplayPartyPokemonLevel(gMultiPartnerParty[actualSlot].level, menuBox); DisplayPartyPokemonGender(gMultiPartnerParty[actualSlot].gender, gMultiPartnerParty[actualSlot].species, gMultiPartnerParty[actualSlot].nickname, menuBox); DisplayPartyPokemonHP(gMultiPartnerParty[actualSlot].hp, menuBox); DisplayPartyPokemonMaxHP(gMultiPartnerParty[actualSlot].maxhp, menuBox); DisplayPartyPokemonHPBar(gMultiPartnerParty[actualSlot].hp, gMultiPartnerParty[actualSlot].maxhp, menuBox); } } static bool8 RenderPartyMenuBoxes(void) { RenderPartyMenuBox(sPartyMenuInternal->data[0]); if (++sPartyMenuInternal->data[0] == PARTY_SIZE) return TRUE; else return FALSE; } static u8 *GetPartyMenuBgTile(u16 tileId) { return &sPartyBgGfxTilemap[tileId << 5]; } static void CreatePartyMonSprites(u8 slot) { u8 actualSlot; if (gPartyMenu.menuType == PARTY_MENU_TYPE_MULTI_SHOWCASE && slot >= MULTI_PARTY_SIZE) { u8 status; actualSlot = slot - MULTI_PARTY_SIZE; if (gMultiPartnerParty[actualSlot].species != SPECIES_NONE) { CreatePartyMonIconSpriteParameterized(gMultiPartnerParty[actualSlot].species, gMultiPartnerParty[actualSlot].personality, &sPartyMenuBoxes[slot], 0, FALSE); CreatePartyMonHeldItemSpriteParameterized(gMultiPartnerParty[actualSlot].species, gMultiPartnerParty[actualSlot].heldItem, &sPartyMenuBoxes[slot]); CreatePartyMonPokeballSpriteParameterized(gMultiPartnerParty[actualSlot].species, &sPartyMenuBoxes[slot]); if (gMultiPartnerParty[actualSlot].hp == 0) status = AILMENT_FNT; else status = GetAilmentFromStatus(gMultiPartnerParty[actualSlot].status); CreatePartyMonStatusSpriteParameterized(gMultiPartnerParty[actualSlot].species, status, &sPartyMenuBoxes[slot]); } } else if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) != SPECIES_NONE) { CreatePartyMonIconSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot], slot); CreatePartyMonHeldItemSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot]); CreatePartyMonPokeballSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot]); CreatePartyMonStatusSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot]); } } static bool8 CreatePartyMonSpritesLoop(void) { CreatePartyMonSprites(sPartyMenuInternal->data[0]); if (++sPartyMenuInternal->data[0] == PARTY_SIZE) return TRUE; else return FALSE; } static void CreateCancelConfirmPokeballSprites(void) { if (gPartyMenu.menuType == PARTY_MENU_TYPE_MULTI_SHOWCASE) { // The showcase has no Cancel/Confirm buttons FillBgTilemapBufferRect(1, 14, 23, 17, 7, 2, 1); } else { if (sPartyMenuInternal->chooseMultiple) { sPartyMenuInternal->spriteIdConfirmPokeball = CreateSmallPokeballButtonSprite(0xBF, 0x88); DrawCancelConfirmButtons(); sPartyMenuInternal->spriteIdCancelPokeball = CreateSmallPokeballButtonSprite(0xBF, 0x98); } else sPartyMenuInternal->spriteIdCancelPokeball = CreatePokeballButtonSprite(198, 148); AnimatePartySlot(gPartyMenu.slotId, 1); } } void AnimatePartySlot(u8 slot, u8 animNum) { u8 spriteId; switch (slot) { default: if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) != SPECIES_NONE) { LoadPartyBoxPalette(&sPartyMenuBoxes[slot], GetPartyBoxPaletteFlags(slot, animNum)); AnimateSelectedPartyIcon(sPartyMenuBoxes[slot].monSpriteId, animNum); PartyMenuStartSpriteAnim(sPartyMenuBoxes[slot].pokeballSpriteId, animNum); } return; case SLOT_CONFIRM: if (animNum == 0) SetBgTilemapPalette(1, 23, 16, 7, 2, 1); else SetBgTilemapPalette(1, 23, 16, 7, 2, 2); spriteId = sPartyMenuInternal->spriteIdConfirmPokeball; break; case SLOT_CANCEL: // The position of the Cancel button changes if Confirm is present if (!sPartyMenuInternal->chooseMultiple) { if (animNum == 0) SetBgTilemapPalette(1, 23, 17, 7, 2, 1); else SetBgTilemapPalette(1, 23, 17, 7, 2, 2); } else { if (animNum == 0) SetBgTilemapPalette(1, 23, 18, 7, 2, 1); else SetBgTilemapPalette(1, 23, 18, 7, 2, 2); } spriteId = sPartyMenuInternal->spriteIdCancelPokeball; break; } PartyMenuStartSpriteAnim(spriteId, animNum); ScheduleBgCopyTilemapToVram(1); } static u8 GetPartyBoxPaletteFlags(u8 slot, u8 animNum) { u8 palFlags = 0; if (animNum == 1) palFlags |= PARTY_PAL_SELECTED; if (GetMonData(&gPlayerParty[slot], MON_DATA_HP) == 0) palFlags |= PARTY_PAL_FAINTED; if (gPartyMenu.layout == PARTY_LAYOUT_MULTI && (slot == 1 || slot == 4 || slot == 5)) palFlags |= PARTY_PAL_MULTI_ALT; if (gPartyMenu.action == PARTY_ACTION_SWITCHING) palFlags |= PARTY_PAL_SWITCHING; if (gPartyMenu.action == PARTY_ACTION_SWITCH) { if (slot == gPartyMenu.slotId || slot == gPartyMenu.slotId2) palFlags |= PARTY_PAL_TO_SWITCH; } if (gPartyMenu.action == PARTY_ACTION_SOFTBOILED && slot == gPartyMenu.slotId ) palFlags |= PARTY_PAL_TO_SOFTBOIL; return palFlags; } static void DrawCancelConfirmButtons(void) { CopyToBgTilemapBufferRect_ChangePalette(1, sConfirmButton_Tilemap, 23, 16, 7, 2, 17); CopyToBgTilemapBufferRect_ChangePalette(1, sCancelButton_Tilemap, 23, 18, 7, 2, 17); ScheduleBgCopyTilemapToVram(1); } bool8 IsMultiBattle(void) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattleTypeFlags & BATTLE_TYPE_LINK) return TRUE; else return FALSE; } static void SwapPartyPokemon(struct Pokemon *mon1, struct Pokemon *mon2) { struct Pokemon *buffer = Alloc(sizeof(struct Pokemon)); *buffer = *mon1; *mon1 = *mon2; *mon2 = *buffer; Free(buffer); } static void Task_ClosePartyMenu(u8 taskId) { BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ClosePartyMenuAndSetCB2; } static void Task_ClosePartyMenuAndSetCB2(u8 taskId) { if (!gPaletteFade.active) { if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE) UpdatePartyToFieldOrder(); if (sPartyMenuInternal->exitCallback != NULL) SetMainCallback2(sPartyMenuInternal->exitCallback); else SetMainCallback2(gPartyMenu.exitCallback); FreePartyPointers(); DestroyTask(taskId); } } u8 GetCursorSelectionMonId(void) { return gPartyMenu.slotId; } u8 GetPartyMenuType(void) { return gPartyMenu.menuType; } void Task_HandleChooseMonInput(u8 taskId) { if (!gPaletteFade.active && MenuHelpers_ShouldWaitForLinkRecv() != TRUE) { s8 *slotPtr = GetCurrentPartySlotPtr(); switch (PartyMenuButtonHandler(slotPtr)) { case A_BUTTON: HandleChooseMonSelection(taskId, slotPtr); break; case B_BUTTON: // also handles pressing A_BUTTON on Cancel HandleChooseMonCancel(taskId, slotPtr); break; case START_BUTTON: if (sPartyMenuInternal->chooseMultiple) { PlaySE(SE_SELECT); MoveCursorToConfirm(); } break; case 9: DestroyTask(taskId); break; } } } static s8 *GetCurrentPartySlotPtr(void) { if (gPartyMenu.action == PARTY_ACTION_SWITCH || gPartyMenu.action == PARTY_ACTION_SOFTBOILED) return &gPartyMenu.slotId2; else return &gPartyMenu.slotId; } static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) { if (*slotPtr == SLOT_CONFIRM) gPartyMenu.task(taskId); // task here is always Task_ValidateChosenMonsForBattle else { switch (gPartyMenu.action) { case PARTY_ACTION_SOFTBOILED: if (IsSelectedMonNotEgg((u8 *)slotPtr)) Task_TryUseSoftboiledOnPartyMon(taskId); break; case PARTY_ACTION_USE_ITEM: if (IsSelectedMonNotEgg((u8 *)slotPtr)) { if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE) sPartyMenuInternal->exitCallback = CB2_SetUpExitToBattleScreen; gItemUseCB(taskId, Task_ClosePartyMenuAfterText); } break; case PARTY_ACTION_MOVE_TUTOR: if (IsSelectedMonNotEgg((u8 *)slotPtr)) { PlaySE(SE_SELECT); TryTutorSelectedMon(taskId); } break; case PARTY_ACTION_GIVE_MAILBOX_MAIL: if (IsSelectedMonNotEgg((u8 *)slotPtr)) { PlaySE(SE_SELECT); TryGiveMailToSelectedMon(taskId); } break; case PARTY_ACTION_GIVE_ITEM: case PARTY_ACTION_GIVE_PC_ITEM: if (IsSelectedMonNotEgg((u8 *)slotPtr)) { PlaySE(SE_SELECT); TryGiveItemOrMailToSelectedMon(taskId); } break; case PARTY_ACTION_SWITCH: PlaySE(SE_SELECT); SwitchSelectedMons(taskId); break; case PARTY_ACTION_CHOOSE_AND_CLOSE: PlaySE(SE_SELECT); gSpecialVar_0x8004 = *slotPtr; if (gPartyMenu.menuType == PARTY_MENU_TYPE_MOVE_RELEARNER) { u16 moves[20] = {MOVE_NONE}; gSpecialVar_0x8005 = GetMoveRelearnerMoves(&gPlayerParty[*slotPtr], moves); } Task_ClosePartyMenu(taskId); break; case PARTY_ACTION_MINIGAME: if (IsSelectedMonNotEgg((u8 *)slotPtr)) TryEnterMonForMinigame(taskId, (u8)*slotPtr); break; default: case PARTY_ACTION_ABILITY_PREVENTS: case PARTY_ACTION_SWITCHING: PlaySE(SE_SELECT); Task_TryCreateSelectionWindow(taskId); break; } } } static bool8 IsSelectedMonNotEgg(u8 *slotPtr) { if (GetMonData(&gPlayerParty[*slotPtr], MON_DATA_IS_EGG) == TRUE) { PlaySE(SE_FAILURE); return FALSE; } return TRUE; } static void HandleChooseMonCancel(u8 taskId, s8 *slotPtr) { switch (gPartyMenu.action) { case PARTY_ACTION_SEND_OUT: PlaySE(SE_FAILURE); break; case PARTY_ACTION_SWITCH: case PARTY_ACTION_SOFTBOILED: PlaySE(SE_SELECT); FinishTwoMonAction(taskId); break; case PARTY_ACTION_MINIGAME: PlaySE(SE_SELECT); CancelParticipationPrompt(taskId); break; default: PlaySE(SE_SELECT); if (gPartyMenu.menuType == PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS) DisplayCancelChooseMonYesNo(taskId); else { if (!MenuHelpers_IsLinkActive()) gSpecialVar_0x8004 = SLOT_CANCEL; gPartyMenuUseExitCallback = FALSE; *slotPtr = SLOT_CANCEL; Task_ClosePartyMenu(taskId); } break; } } static void DisplayCancelChooseMonYesNo(u8 taskId) { PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); StringExpandPlaceholders(gStringVar4, gText_CancelBattle); DisplayPartyMenuMessage(gStringVar4, TRUE); gTasks[taskId].func = Task_CancelChooseMonYesNo; } static void Task_CancelChooseMonYesNo(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PartyMenuDisplayYesNoMenu(); gTasks[taskId].func = Task_HandleCancelChooseMonYesNoInput; } } static void Task_HandleCancelChooseMonYesNoInput(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: gPartyMenuUseExitCallback = FALSE; gPartyMenu.slotId = SLOT_CANCEL; ClearSelectedPartyOrder(); Task_ClosePartyMenu(taskId); break; case MENU_B_PRESSED: PlaySE(SE_SELECT); // fallthrough case 1: Task_ReturnToChooseMonAfterText(taskId); break; } } static u16 PartyMenuButtonHandler(s8 *slotPtr) { s8 movementDir; u8 taskId; switch (gMain.newAndRepeatedKeys) { case DPAD_UP: movementDir = MENU_DIR_UP; break; case DPAD_DOWN: movementDir = MENU_DIR_DOWN; break; case DPAD_LEFT: movementDir = MENU_DIR_LEFT; break; case DPAD_RIGHT: movementDir = MENU_DIR_RIGHT; break; default: switch (GetLRKeysPressedAndHeld()) { case MENU_L_PRESSED: movementDir = MENU_DIR_UP; break; case MENU_R_PRESSED: movementDir = MENU_DIR_DOWN; break; default: movementDir = 0; break; } break; } if (JOY_NEW(START_BUTTON)) return START_BUTTON; if (JOY_NEW(SELECT_BUTTON) && CalculatePlayerPartyCount() > 1) { if(gPartyMenu.menuType != PARTY_MENU_TYPE_FIELD) return START_BUTTON; if(*slotPtr == PARTY_SIZE + 1) return START_BUTTON; // do nothing if select is pressed on Cancel if(gPartyMenu.action != PARTY_ACTION_SWITCH) { taskId = CreateTask(CursorCB_Switch, 1); return 9; } return 1; //select acts as A button when in switch mode } if (movementDir) { UpdateCurrentPartySelection(slotPtr, movementDir); return 0; } if (JOY_NEW(A_BUTTON) && *slotPtr == SLOT_CANCEL) return B_BUTTON; return JOY_NEW(A_BUTTON | B_BUTTON); } static void UpdateCurrentPartySelection(s8 *slotPtr, s8 movementDir) { s8 newSlotId = *slotPtr; u8 layout = gPartyMenu.layout; if (layout == PARTY_LAYOUT_SINGLE) UpdatePartySelectionSingleLayout(slotPtr, movementDir); else UpdatePartySelectionDoubleLayout(slotPtr, movementDir); if (*slotPtr != newSlotId) { PlaySE(SE_SELECT); AnimatePartySlot(newSlotId, 0); AnimatePartySlot(*slotPtr, 1); } } static void UpdatePartySelectionSingleLayout(s8 *slotPtr, s8 movementDir) { switch (movementDir) { case MENU_DIR_UP: if (*slotPtr == 0) *slotPtr = SLOT_CANCEL; else if (*slotPtr == SLOT_CONFIRM) *slotPtr = gPlayerPartyCount - 1; else if (*slotPtr == SLOT_CANCEL) { if (sPartyMenuInternal->chooseMultiple) *slotPtr = SLOT_CONFIRM; else *slotPtr = gPlayerPartyCount - 1; } else --*slotPtr; break; case MENU_DIR_DOWN: if (*slotPtr == SLOT_CANCEL) *slotPtr = 0; else if (*slotPtr == gPlayerPartyCount - 1) { if (sPartyMenuInternal->chooseMultiple) *slotPtr = SLOT_CONFIRM; else *slotPtr = SLOT_CANCEL; } else ++*slotPtr; break; case MENU_DIR_RIGHT: if (gPlayerPartyCount != 1 && *slotPtr == 0) { if (sPartyMenuInternal->lastSelectedSlot == 0) *slotPtr = 1; else *slotPtr = sPartyMenuInternal->lastSelectedSlot; } break; case MENU_DIR_LEFT: if (*slotPtr != 0 && *slotPtr != SLOT_CONFIRM && *slotPtr != SLOT_CANCEL) { sPartyMenuInternal->lastSelectedSlot = *slotPtr; *slotPtr = 0; } break; } } static void UpdatePartySelectionDoubleLayout(s8 *slotPtr, s8 movementDir) { // newSlot is used temporarily as a movement direction during its later assignment s8 newSlot = movementDir; switch (movementDir) { case MENU_DIR_UP: if (*slotPtr == 0) { *slotPtr = SLOT_CANCEL; break; } else if (*slotPtr == SLOT_CONFIRM) { *slotPtr = gPlayerPartyCount - 1; break; } else if (*slotPtr == SLOT_CANCEL) { if (sPartyMenuInternal->chooseMultiple) { *slotPtr = SLOT_CONFIRM; break; } --*slotPtr; } newSlot = GetNewSlotDoubleLayout(*slotPtr, newSlot); if (newSlot != -1) *slotPtr = newSlot; break; case MENU_DIR_DOWN: if (*slotPtr == SLOT_CONFIRM) *slotPtr = SLOT_CANCEL; else if (*slotPtr == SLOT_CANCEL) *slotPtr = 0; else { newSlot = GetNewSlotDoubleLayout(*slotPtr, MENU_DIR_DOWN); if (newSlot == -1) { if (sPartyMenuInternal->chooseMultiple) *slotPtr = SLOT_CONFIRM; else *slotPtr = SLOT_CANCEL; } else *slotPtr = newSlot; } break; case MENU_DIR_RIGHT: if (*slotPtr == 0) { if (sPartyMenuInternal->lastSelectedSlot == 3) { if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES) != SPECIES_NONE) *slotPtr = 3; } else if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES) != SPECIES_NONE) *slotPtr = 2; } else if (*slotPtr == 1) { if (sPartyMenuInternal->lastSelectedSlot == 5) { if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES) != SPECIES_NONE) *slotPtr = 5; } else if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES) != SPECIES_NONE) *slotPtr = 4; } break; case MENU_DIR_LEFT: if (*slotPtr == 2 || *slotPtr == 3) { sPartyMenuInternal->lastSelectedSlot = *slotPtr; *slotPtr = 0; } else if (*slotPtr == 4 || *slotPtr == 5) { sPartyMenuInternal->lastSelectedSlot = *slotPtr; *slotPtr = 1; } break; } } static s8 GetNewSlotDoubleLayout(s8 slotId, s8 movementDir) { while (TRUE) { slotId += movementDir; if ((u8)slotId >= SLOT_CONFIRM) return -1; if (GetMonData(&gPlayerParty[slotId], MON_DATA_SPECIES) != SPECIES_NONE) return slotId; } } u8 *GetMonNickname(struct Pokemon *mon, u8 *dest) { GetMonData(mon, MON_DATA_NICKNAME, dest); return StringGet_Nickname(dest); } #define tKeepOpen data[0] u8 DisplayPartyMenuMessage(const u8 *str, bool8 keepOpen) { u8 taskId; PartyMenuPrintText(str); taskId = CreateTask(Task_PrintAndWaitForText, 1); gTasks[taskId].tKeepOpen = keepOpen; return taskId; } static void Task_PrintAndWaitForText(u8 taskId) { if (RunTextPrinters_CheckActive(6) != TRUE) { if (gTasks[taskId].tKeepOpen == FALSE) { ClearStdWindowAndFrameToTransparent(6, FALSE); ClearWindowTilemap(6); } DestroyTask(taskId); } } #undef tKeepOpen bool8 IsPartyMenuTextPrinterActive(void) { return FuncIsActiveTask(Task_PrintAndWaitForText); } static void Task_WaitForLinkAndReturnToChooseMon(u8 taskId) { if (MenuHelpers_ShouldWaitForLinkRecv() != TRUE) { DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } } static void Task_ReturnToChooseMonAfterText(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { ClearStdWindowAndFrameToTransparent(6, FALSE); ClearWindowTilemap(6); if (MenuHelpers_IsLinkActive() == TRUE) { gTasks[taskId].func = Task_WaitForLinkAndReturnToChooseMon; } else { DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } } } static void DisplayGaveHeldItemMessage(struct Pokemon *mon, u16 item, bool8 keepOpen, bool8 fromBagMenu) { if (!fromBagMenu) // Used Give option from party menu ItemUse_SetQuestLogEvent(QL_EVENT_GAVE_HELD_ITEM, mon, item, 0xFFFF); else if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM) ItemUse_SetQuestLogEvent(QL_EVENT_GAVE_HELD_ITEM_PC, mon, item, 0xFFFF); else ItemUse_SetQuestLogEvent(QL_EVENT_GAVE_HELD_ITEM_BAG, mon, item, 0xFFFF); GetMonNickname(mon, gStringVar1); CopyItemName(item, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_PkmnWasGivenItem); DisplayPartyMenuMessage(gStringVar4, keepOpen); ScheduleBgCopyTilemapToVram(2); } static void DisplayTookHeldItemMessage(struct Pokemon *mon, u16 item, bool8 keepOpen) { ItemUse_SetQuestLogEvent(QL_EVENT_TOOK_HELD_ITEM, mon, item, 0xFFFF); GetMonNickname(mon, gStringVar1); CopyItemName(item, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_ReceivedItemFromPkmn); DisplayPartyMenuMessage(gStringVar4, keepOpen); ScheduleBgCopyTilemapToVram(2); } static void DisplayAlreadyHoldingItemSwitchMessage(struct Pokemon *mon, u16 item, bool8 keepOpen) { GetMonNickname(mon, gStringVar1); CopyItemName(item, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_PkmnAlreadyHoldingItemSwitch); DisplayPartyMenuMessage(gStringVar4, keepOpen); ScheduleBgCopyTilemapToVram(2); } static void DisplaySwitchedHeldItemMessage(u16 item, u16 item2, bool8 keepOpen) { SetSwappedHeldItemQuestLogEvent(&gPlayerParty[gPartyMenu.slotId], item2, item); CopyItemName(item, gStringVar1); CopyItemName(item2, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_SwitchedPkmnItem); DisplayPartyMenuMessage(gStringVar4, keepOpen); ScheduleBgCopyTilemapToVram(2); } static void GiveItemToMon(struct Pokemon *mon, u16 item) { u8 itemBytes[2]; if (ItemIsMail(item) == TRUE) { if (GiveMailToMon(mon, item) == 0xFF) return; } itemBytes[0] = item; itemBytes[1] = item >> 8; SetMonData(mon, MON_DATA_HELD_ITEM, itemBytes); } static u8 TryTakeMonItem(struct Pokemon *mon) { u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); if (item == ITEM_NONE) return 0; if (AddBagItem(item, 1) == FALSE) return 1; item = ITEM_NONE; SetMonData(mon, MON_DATA_HELD_ITEM, &item); return 2; } static void BufferBagFullCantTakeItemMessage(u16 itemId) { const u8 *string; switch (ItemId_GetPocket(itemId)) { default: string = gText_MenuBag; break; case POCKET_TM_CASE: string = ItemId_GetName(ITEM_TM_CASE); break; case POCKET_BERRY_POUCH: string = ItemId_GetName(ITEM_BERRY_POUCH); break; } StringCopy(gStringVar1, string); StringExpandPlaceholders(gStringVar4, gText_BagFullCouldNotRemoveItem); } #define tHP data[0] #define tMaxHP data[1] #define tHPIncrement data[2] #define tHPToAdd data[3] #define tPartyId data[4] #define tStartHP data[5] static void Task_PartyMenuModifyHP(u8 taskId) { s16 *data = gTasks[taskId].data; tHP += tHPIncrement; --tHPToAdd; SetMonData(&gPlayerParty[tPartyId], MON_DATA_HP, &tHP); DisplayPartyPokemonHPCheck(&gPlayerParty[tPartyId], &sPartyMenuBoxes[tPartyId], DRAW_MENU_BOX_AND_TEXT); DisplayPartyPokemonHPBarCheck(&gPlayerParty[tPartyId], &sPartyMenuBoxes[tPartyId]); if (tHPToAdd == 0 || tHP == 0 || tHP == tMaxHP) { // If HP was recovered, buffer the amount recovered if (tHP > tStartHP) ConvertIntToDecimalStringN(gStringVar2, tHP - tStartHP, STR_CONV_MODE_LEFT_ALIGN, 3); SwitchTaskToFollowupFunc(taskId); } } void PartyMenuModifyHP(u8 taskId, u8 slot, s8 hpIncrement, s16 hpDifference, TaskFunc task) { struct Pokemon *mon = &gPlayerParty[slot]; s16 *data = gTasks[taskId].data; tHP = GetMonData(mon, MON_DATA_HP); tMaxHP = GetMonData(mon, MON_DATA_MAX_HP); tHPIncrement = hpIncrement; tHPToAdd = hpDifference; tPartyId = slot; tStartHP = tHP; SetTaskFuncWithFollowupFunc(taskId, Task_PartyMenuModifyHP, task); } // The usage of hp in this function is mostly nonsense // Because caseId is always passed 0, none of the other cases ever occur static void ResetHPTaskData(u8 taskId, u8 caseId, u32 hp) { s16 *data = gTasks[taskId].data; switch (caseId) // always zero { case 0: tHP = hp; tStartHP = hp; break; case 1: tMaxHP = hp; break; case 2: tHPIncrement = hp; break; case 3: tHPToAdd = hp; break; case 4: tPartyId = hp; break; case 5: SetTaskFuncWithFollowupFunc(taskId, Task_PartyMenuModifyHP, (TaskFunc)hp); // >casting hp as a taskfunc break; } } #undef tHP #undef tMaxHP #undef tHPIncrement #undef tHPToAdd #undef tPartyId #undef tStartHP u8 GetAilmentFromStatus(u32 status) { if (status & STATUS1_PSN_ANY) return AILMENT_PSN; if (status & STATUS1_PARALYSIS) return AILMENT_PRZ; if (status & STATUS1_SLEEP) return AILMENT_SLP; if (status & STATUS1_FREEZE) return AILMENT_FRZ; if (status & STATUS1_BURN) return AILMENT_BRN; return AILMENT_NONE; } u8 GetMonAilment(struct Pokemon *mon) { u8 ailment; if (GetMonData(mon, MON_DATA_HP) == 0) return AILMENT_FNT; ailment = GetAilmentFromStatus(GetMonData(mon, MON_DATA_STATUS)); if (ailment != AILMENT_NONE) return ailment; if (CheckPartyPokerus(mon, 0)) return AILMENT_PKRS; return AILMENT_NONE; } #define minigameBitflag data[0] static void SetPartyMonsAllowedInMinigame(void) { if (gPartyMenu.menuType == PARTY_MENU_TYPE_MINIGAME) { u32 i; s16 *data = gPartyMenu.data; minigameBitflag = 0; if (gSpecialVar_0x8005 == 0) { for (i = 0; i < gPlayerPartyCount; ++i) minigameBitflag += IsMonAllowedInPokemonJump(&gPlayerParty[i]) << i; } else { for (i = 0; i < gPlayerPartyCount; ++i) minigameBitflag += IsMonAllowedInDodrioBerryPicking(&gPlayerParty[i]) << i; } } } static bool16 IsMonAllowedInPokemonJump(struct Pokemon *mon) { if (GetMonData(mon, MON_DATA_IS_EGG) != TRUE && IsSpeciesAllowedInPokemonJump(GetMonData(mon, MON_DATA_SPECIES))) return TRUE; return FALSE; } static bool16 IsMonAllowedInDodrioBerryPicking(struct Pokemon *mon) { if (GetMonData(mon, MON_DATA_IS_EGG) != TRUE && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_DODRIO) return TRUE; return FALSE; } static bool8 IsMonAllowedInMinigame(u8 slot) { if (!((gPartyMenu.minigameBitflag >> slot) & 1)) return FALSE; return TRUE; } #undef minigameBitflag static void TryEnterMonForMinigame(u8 taskId, u8 slot) { if (IsMonAllowedInMinigame(slot) == TRUE) { PlaySE(SE_SELECT); gSpecialVar_0x8004 = slot; Task_ClosePartyMenu(taskId); } else { PlaySE(SE_FAILURE); DisplayPartyMenuMessage(gText_PkmnCantParticipate, FALSE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } } static void CancelParticipationPrompt(u8 taskId) { DisplayPartyMenuMessage(gText_CancelParticipation, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_CancelParticipationYesNo; } static void Task_CancelParticipationYesNo(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PartyMenuDisplayYesNoMenu(); gTasks[taskId].func = Task_HandleCancelParticipationYesNoInput; } } static void Task_HandleCancelParticipationYesNoInput(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: gSpecialVar_0x8004 = SLOT_CANCEL; Task_ClosePartyMenu(taskId); break; case MENU_B_PRESSED: PlaySE(SE_SELECT); // fallthrough case 1: gTasks[taskId].func = Task_ReturnToChooseMonAfterText; break; } } static u8 CanMonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor) { u16 move; if (GetMonData(mon, MON_DATA_IS_EGG)) return CANNOT_LEARN_MOVE_IS_EGG; if (item >= ITEM_TM01_FOCUS_PUNCH) { if (!CanMonLearnTMHM(mon, item - ITEM_TM01_FOCUS_PUNCH)) return CANNOT_LEARN_MOVE; else move = ItemIdToBattleMoveId(item); } else if (CanLearnTutorMove(GetMonData(mon, MON_DATA_SPECIES), tutor) == FALSE) return CANNOT_LEARN_MOVE; else move = GetTutorMove(tutor); if (MonKnowsMove(mon, move) == TRUE) return ALREADY_KNOWS_MOVE; else return CAN_LEARN_MOVE; } static u16 GetTutorMove(u8 tutor) { switch (tutor) { case TUTOR_MOVE_FRENZY_PLANT: return MOVE_FRENZY_PLANT; case TUTOR_MOVE_BLAST_BURN: return MOVE_BLAST_BURN; case TUTOR_MOVE_HYDRO_CANNON: return MOVE_HYDRO_CANNON; default: return sTutorMoves[tutor]; } } static bool8 CanLearnTutorMove(u16 species, u8 tutor) { switch (tutor) { case TUTOR_MOVE_FRENZY_PLANT: if (species == SPECIES_VENUSAUR) return TRUE; else return FALSE; case TUTOR_MOVE_BLAST_BURN: if (species == SPECIES_CHARIZARD) return TRUE; else return FALSE; case TUTOR_MOVE_HYDRO_CANNON: if (species == SPECIES_BLASTOISE) return TRUE; else return FALSE; default: if (sTutorLearnsets[species] & ((u64) 1 << tutor)) return TRUE; else return FALSE; } } // Tutorial battle messages static void Task_FirstBattleEnterParty_WaitFadeIn(u8 taskId) { if (!gPaletteFade.active) gTasks[taskId].func = Task_FirstBattleEnterParty_DarkenScreen; } static void Task_FirstBattleEnterParty_DarkenScreen(u8 taskId) { BeginNormalPaletteFade(0xFFFF1FFF, 4, 0, 6, RGB_BLACK); gTasks[taskId].func = Task_FirstBattleEnterParty_WaitDarken; } static void Task_FirstBattleEnterParty_WaitDarken(u8 taskId) { if (!gPaletteFade.active) gTasks[taskId].func = Task_FirstBattleEnterParty_CreatePrinter; } static void Task_FirstBattleEnterParty_CreatePrinter(u8 taskId) { gTasks[taskId].data[0] = FirstBattleEnterParty_CreateWindowAndMsg1Printer(); gTasks[taskId].func = Task_FirstBattleEnterParty_RunPrinterMsg1; } static void Task_FirstBattleEnterParty_RunPrinterMsg1(u8 taskId) { s16 *data = gTasks[taskId].data; if (RunTextPrinters_CheckActive((u8)data[0]) != TRUE) gTasks[taskId].func = Task_FirstBattleEnterParty_LightenFirstMonIcon; } static void Task_FirstBattleEnterParty_LightenFirstMonIcon(u8 taskId) { BeginNormalPaletteFade(0xFFFF0008, 4, 6, 0, RGB_BLACK); gTasks[taskId].func = Task_FirstBattleEnterParty_WaitLightenFirstMonIcon; } static void Task_FirstBattleEnterParty_WaitLightenFirstMonIcon(u8 taskId) { if (!gPaletteFade.active) gTasks[taskId].func = Task_FirstBattleEnterParty_StartPrintMsg2; } static void Task_FirstBattleEnterParty_StartPrintMsg2(u8 taskId) { s16 *data = gTasks[taskId].data; PartyMenu_Oak_PrintText(data[0], gText_OakThisIsListOfPokemon); gTasks[taskId].func = Task_FirstBattleEnterParty_RunPrinterMsg2; } static void Task_FirstBattleEnterParty_RunPrinterMsg2(u8 taskId) { s16 *data = gTasks[taskId].data; if (RunTextPrinters_CheckActive((u8)data[0]) != TRUE) { FirstBattleEnterParty_DestroyVoiceoverWindow((u8)data[0]); gTasks[taskId].func = Task_FirstBattleEnterParty_FadeNormal; } } static void Task_FirstBattleEnterParty_FadeNormal(u8 taskId) { BeginNormalPaletteFade(0x0000FFF7, 4, 6, 0, RGB_BLACK); gTasks[taskId].func = Task_FirstBattleEnterParty_WaitFadeNormal; } static void Task_FirstBattleEnterParty_WaitFadeNormal(u8 taskId) { if (!gPaletteFade.active) { LoadUserWindowGfx(0, 0x4F, BG_PLTT_ID(13)); LoadStdWindowGfx(0, 0x58, BG_PLTT_ID(15)); if (gPartyMenu.action == PARTY_ACTION_USE_ITEM) DisplayPartyMenuStdMessage(PARTY_MSG_USE_ON_WHICH_MON); else DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } } // Pokedude switches Pokemon static void Task_PartyMenu_Pokedude(u8 taskId) { s16 *data = gTasks[taskId].data; data[0] = 0; gTasks[taskId].func = Task_PartyMenu_PokedudeStep; } static void Task_PartyMenu_PokedudeStep(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active && PartyMenuPokedudeIsCancelled(taskId) != TRUE) { switch (data[0]) { case 80: UpdateCurrentPartySelection(&gPartyMenu.slotId, MENU_DIR_RIGHT); break; case 160: PlaySE(SE_SELECT); CreateSelectionWindow(); break; case 240: PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[2]); sCursorOptions[sPartyMenuInternal->actions[0]].func(taskId); break; } ++data[0]; } } static bool8 PartyMenuPokedudeIsCancelled(u8 taskId) { if (JOY_NEW(B_BUTTON)) { sPartyMenuInternal->exitCallback = PartyMenuHandlePokedudeCancel; Task_ClosePartyMenu(taskId); return TRUE; } return FALSE; } static void PartyMenuHandlePokedudeCancel(void) { FreeRestoreBattleData(); LoadPlayerParty(); SetTeachyTvControllerModeToResume(); SetMainCallback2(CB2_ReturnToTeachyTV); } // Pokedude uses item on his own Pokemon static void Task_PartyMenuFromBag_Pokedude(u8 taskId) { s16 *data = gTasks[taskId].data; data[0] = 0; gTasks[taskId].func = Task_PartyMenuFromBag_PokedudeStep; } static void Task_PartyMenuFromBag_PokedudeStep(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active && PartyMenuPokedudeIsCancelled(taskId) != TRUE) { if (data[0] != 80) { ++data[0]; } else { sPartyMenuInternal->exitCallback = CB2_SetUpExitToBattleScreen; gItemUseCB(taskId, Task_ClosePartyMenuAfterText); } } } static void InitPartyMenuWindows(u8 layout) { u32 i; switch (layout) { case PARTY_LAYOUT_SINGLE: InitWindows(sSinglePartyMenuWindowTemplate); break; case PARTY_LAYOUT_DOUBLE: InitWindows(sDoublePartyMenuWindowTemplate); break; case PARTY_LAYOUT_MULTI: InitWindows(sMultiPartyMenuWindowTemplate); break; default: // PARTY_LAYOUT_MULTI_SHOWCASE InitWindows(sShowcaseMultiPartyMenuWindowTemplate); break; } DeactivateAllTextPrinters(); for (i = 0; i < PARTY_SIZE; ++i) FillWindowPixelBuffer(i, PIXEL_FILL(0)); LoadUserWindowGfx(0, 0x4F, BG_PLTT_ID(13)); LoadStdWindowGfx(0, 0x58, BG_PLTT_ID(15)); LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(12), PLTT_SIZE_4BPP); LoadPalette(GetTextWindowPalette(0), BG_PLTT_ID(14), PLTT_SIZE_4BPP); } static void CreateCancelConfirmWindows(bool8 chooseMultiple) { u8 confirmWindowId; u8 cancelWindowId; u8 offset; if (gPartyMenu.menuType != PARTY_MENU_TYPE_MULTI_SHOWCASE) { if (chooseMultiple == TRUE) { confirmWindowId = AddWindow(&sConfirmButtonWindowTemplate); FillWindowPixelBuffer(confirmWindowId, PIXEL_FILL(0)); AddTextPrinterParameterized4(confirmWindowId, FONT_SMALL, (48 - GetStringWidth(FONT_SMALL, gText_PartyMenu_OK, 0)) / 2u, 1, 0, 0, sFontColorTable[0], -1, gText_PartyMenu_OK); PutWindowTilemap(confirmWindowId); CopyWindowToVram(confirmWindowId, COPYWIN_GFX); cancelWindowId = AddWindow(&sMultiCancelButtonWindowTemplate); offset = 0; } else { cancelWindowId = AddWindow(&sCancelButtonWindowTemplate); offset = 3; } FillWindowPixelBuffer(cancelWindowId, PIXEL_FILL(0)); // Branches are functionally identical. Second branch is never reached, Spin Trade wasnt fully implemented if (gPartyMenu.menuType != PARTY_MENU_TYPE_SPIN_TRADE) { offset += (48 - GetStringWidth(FONT_SMALL, gFameCheckerText_Cancel, 0)) / 2; AddTextPrinterParameterized3(cancelWindowId, FONT_SMALL, offset, 1, sFontColorTable[0], -1, gFameCheckerText_Cancel); } else { offset += (48 - GetStringWidth(FONT_SMALL, gOtherText_Exit, 0)) / 2; AddTextPrinterParameterized3(cancelWindowId, FONT_SMALL, offset, 1, sFontColorTable[0], -1, gOtherText_Exit); } PutWindowTilemap(cancelWindowId); CopyWindowToVram(cancelWindowId, COPYWIN_GFX); ScheduleBgCopyTilemapToVram(0); } } static u16 *GetPartyMenuPalBufferPtr(u8 paletteId) { return &sPartyMenuInternal->palBuffer[paletteId]; } static void BlitBitmapToPartyWindow(u8 windowId, const u8 *tileNums, u8 menuBoxWidth, u8 x, u8 y, u8 width, u8 height) { u8 *pixels = AllocZeroed(height * width * 32); u8 i, j; if (pixels != NULL) { for (i = 0; i < height; ++i) for (j = 0; j < width; ++j) CpuCopy16(GetPartyMenuBgTile(tileNums[x + j + ((y + i) * menuBoxWidth)]), &pixels[(i * width + j) * 32], 32); BlitBitmapToWindow(windowId, pixels, x * 8, y * 8, width * 8, height * 8); Free(pixels); } } static void BlitBitmapToPartyWindow_LeftColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP) { if (width == 0 && height == 0) { width = 10; height = 7; } if (!hideHP) BlitBitmapToPartyWindow(windowId, sSlotTilemap_Main, 10, x, y, width, height); else BlitBitmapToPartyWindow(windowId, sSlotTilemap_MainNoHP, 10, x, y, width, height); } static void BlitBitmapToPartyWindow_RightColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP) { if (width == 0 && height == 0) { width = 18; height = 3; } if (!hideHP) BlitBitmapToPartyWindow(windowId, sSlotTilemap_Wide, 18, x, y, width, height); else BlitBitmapToPartyWindow(windowId, sSlotTilemap_WideNoHP, 18, x, y, width, height); } static void DrawEmptySlot(u8 windowId) { BlitBitmapToPartyWindow(windowId, sSlotTilemap_WideEmpty, 18, 0, 0, 18, 3); } #define LOAD_PARTY_BOX_PAL(paletteIds, paletteOffsets) \ { \ LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[0]), paletteOffsets[0] + palOffset, PLTT_SIZEOF(1)); \ LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[1]), paletteOffsets[1] + palOffset, PLTT_SIZEOF(1)); \ LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[2]), paletteOffsets[2] + palOffset, PLTT_SIZEOF(1)); \ } static void LoadPartyBoxPalette(struct PartyMenuBox *menuBox, u8 palFlags) { u8 palOffset = BG_PLTT_ID(GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM)); if (palFlags & PARTY_PAL_TO_SOFTBOIL) { if (palFlags & PARTY_PAL_SELECTED) { LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2); } else { LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds2, sPartyBoxPalOffsets2); } } else if (palFlags & PARTY_PAL_SWITCHING) { LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds2, sPartyBoxPalOffsets2); } else if (palFlags & PARTY_PAL_TO_SWITCH) { if (palFlags & PARTY_PAL_SELECTED) { LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2); } else { LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds2, sPartyBoxPalOffsets2); } } else if (palFlags & PARTY_PAL_FAINTED) { if (palFlags & PARTY_PAL_SELECTED) { LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionFaintedPalIds, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2); } else { LOAD_PARTY_BOX_PAL(sPartyBoxFaintedPalIds1, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxFaintedPalIds2, sPartyBoxPalOffsets2); } } else if (palFlags & PARTY_PAL_MULTI_ALT) { if (palFlags & PARTY_PAL_SELECTED) { LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionMultiPalIds, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2); } else { LOAD_PARTY_BOX_PAL(sPartyBoxMultiPalIds1, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxMultiPalIds2, sPartyBoxPalOffsets2); } } else if (palFlags & PARTY_PAL_SELECTED) { LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds1, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2); } else { LOAD_PARTY_BOX_PAL(sPartyBoxEmptySlotPalIds1, sPartyBoxPalOffsets1); LOAD_PARTY_BOX_PAL(sPartyBoxEmptySlotPalIds2, sPartyBoxPalOffsets2); } } static void DisplayPartyPokemonBarDetail(u8 windowId, const u8 *str, u8 color, const u8 *dimensions) { AddTextPrinterParameterized3(windowId, FONT_SMALL, dimensions[0], dimensions[1], sFontColorTable[color], 0, str); } static void DisplayPartyPokemonNickname(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText) { u8 nickname[POKEMON_NAME_LENGTH + 1]; if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { if (drawMenuBoxOrText == DRAW_MENU_BOX_AND_TEXT) menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->dimensions[0] / 8, menuBox->infoRects->dimensions[1] / 8, menuBox->infoRects->dimensions[2] / 8, menuBox->infoRects->dimensions[3] / 8, FALSE); GetMonNickname(mon, nickname); DisplayPartyPokemonBarDetail(menuBox->windowId, nickname, 0, menuBox->infoRects->dimensions); } } static void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { u8 ailment = GetMonAilment(mon); if (ailment == AILMENT_NONE || ailment == AILMENT_PKRS) { if (drawMenuBoxOrText != DRAW_TEXT_ONLY) menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->dimensions[4] / 8, (menuBox->infoRects->dimensions[5] / 8) + 1, menuBox->infoRects->dimensions[6] / 8, menuBox->infoRects->dimensions[7] / 8, FALSE); if (drawMenuBoxOrText != DRAW_MENU_BOX_ONLY) DisplayPartyPokemonLevel(GetMonData(mon, MON_DATA_LEVEL), menuBox); } } } static void DisplayPartyPokemonLevel(u8 level, struct PartyMenuBox *menuBox) { ConvertIntToDecimalStringN(gStringVar2, level, STR_CONV_MODE_LEFT_ALIGN, 3); StringCopy(gStringVar1, gText_Lv); StringAppend(gStringVar1, gStringVar2); DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, &menuBox->infoRects->dimensions[4]); } static void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText) { u8 nickname[POKEMON_NAME_LENGTH + 1]; if (drawMenuBoxOrText == DRAW_MENU_BOX_AND_TEXT) menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->dimensions[8] / 8, (menuBox->infoRects->dimensions[9] / 8) + 1, menuBox->infoRects->dimensions[10] / 8, menuBox->infoRects->dimensions[11] / 8, FALSE); GetMonNickname(mon, nickname); DisplayPartyPokemonGender(GetMonGender(mon), GetMonData(mon, MON_DATA_SPECIES), nickname, menuBox); } static void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, struct PartyMenuBox *menuBox) { u8 palOffset = BG_PLTT_ID(GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM)); if (species == SPECIES_NONE) return; if ((species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) && StringCompare(nickname, gSpeciesNames[species]) == 0) return; switch (gender) { case MON_MALE: LoadPalette(GetPartyMenuPalBufferPtr(sGenderMalePalIds[0]), sGenderPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); LoadPalette(GetPartyMenuPalBufferPtr(sGenderMalePalIds[1]), sGenderPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); DisplayPartyPokemonBarDetail(menuBox->windowId, gText_MaleSymbol, 2, &menuBox->infoRects->dimensions[8]); break; case MON_FEMALE: LoadPalette(GetPartyMenuPalBufferPtr(sGenderFemalePalIds[0]), sGenderPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); LoadPalette(GetPartyMenuPalBufferPtr(sGenderFemalePalIds[1]), sGenderPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); DisplayPartyPokemonBarDetail(menuBox->windowId, gText_FemaleSymbol, 2, &menuBox->infoRects->dimensions[8]); break; } } static void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { if (drawMenuBoxOrText != DRAW_TEXT_ONLY) menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->dimensions[12] / 8, (menuBox->infoRects->dimensions[13] / 8) + 1, menuBox->infoRects->dimensions[14] / 8, menuBox->infoRects->dimensions[15] / 8, FALSE); if (drawMenuBoxOrText != DRAW_MENU_BOX_ONLY) DisplayPartyPokemonHP(GetMonData(mon, MON_DATA_HP), menuBox); } } static void DisplayPartyPokemonHP(u16 hp, struct PartyMenuBox *menuBox) { u8 *strOut = ConvertIntToDecimalStringN(gStringVar1, hp, STR_CONV_MODE_RIGHT_ALIGN, 3); strOut[0] = CHAR_SLASH; strOut[1] = EOS; DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, &menuBox->infoRects->dimensions[12]); } static void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { if (drawMenuBoxOrText != DRAW_TEXT_ONLY) menuBox->infoRects->blitFunc(menuBox->windowId, (menuBox->infoRects->dimensions[16] / 8) + 1, (menuBox->infoRects->dimensions[17] / 8) + 1, menuBox->infoRects->dimensions[18] / 8, menuBox->infoRects->dimensions[19] / 8, FALSE); if (drawMenuBoxOrText != DRAW_MENU_BOX_ONLY) DisplayPartyPokemonMaxHP(GetMonData(mon, MON_DATA_MAX_HP), menuBox); } } static void DisplayPartyPokemonMaxHP(u16 maxhp, struct PartyMenuBox *menuBox) { ConvertIntToDecimalStringN(gStringVar2, maxhp, STR_CONV_MODE_RIGHT_ALIGN, 3); StringCopy(gStringVar1, gText_Slash); StringAppend(gStringVar1, gStringVar2); DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, &menuBox->infoRects->dimensions[16]); } static void DisplayPartyPokemonHPBarCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) DisplayPartyPokemonHPBar(GetMonData(mon, MON_DATA_HP), GetMonData(mon, MON_DATA_MAX_HP), menuBox); } static void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct PartyMenuBox *menuBox) { u8 palOffset = BG_PLTT_ID(GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM)); u8 hpFraction; switch (GetHPBarLevel(hp, maxhp)) { case HP_BAR_GREEN: case HP_BAR_FULL: LoadPalette(GetPartyMenuPalBufferPtr(sHPBarGreenPalIds[0]), sHPBarPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); LoadPalette(GetPartyMenuPalBufferPtr(sHPBarGreenPalIds[1]), sHPBarPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); break; case HP_BAR_YELLOW: LoadPalette(GetPartyMenuPalBufferPtr(sHPBarYellowPalIds[0]), sHPBarPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); LoadPalette(GetPartyMenuPalBufferPtr(sHPBarYellowPalIds[1]), sHPBarPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); break; default: LoadPalette(GetPartyMenuPalBufferPtr(sHPBarRedPalIds[0]), sHPBarPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); LoadPalette(GetPartyMenuPalBufferPtr(sHPBarRedPalIds[1]), sHPBarPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); break; } hpFraction = GetScaledHPFraction(hp, maxhp, menuBox->infoRects->dimensions[22]); FillWindowPixelRect(menuBox->windowId, sHPBarPalOffsets[1], menuBox->infoRects->dimensions[20], menuBox->infoRects->dimensions[21], hpFraction, 1); FillWindowPixelRect(menuBox->windowId, sHPBarPalOffsets[0], menuBox->infoRects->dimensions[20], menuBox->infoRects->dimensions[21] + 1, hpFraction, 2); if (hpFraction != menuBox->infoRects->dimensions[22]) { // This appears to be an alternating fill FillWindowPixelRect(menuBox->windowId, 0x0D, menuBox->infoRects->dimensions[20] + hpFraction, menuBox->infoRects->dimensions[21], menuBox->infoRects->dimensions[22] - hpFraction, 1); FillWindowPixelRect(menuBox->windowId, 0x02, menuBox->infoRects->dimensions[20] + hpFraction, menuBox->infoRects->dimensions[21] + 1, menuBox->infoRects->dimensions[22] - hpFraction, 2); } CopyWindowToVram(menuBox->windowId, COPYWIN_GFX); } static void DisplayPartyPokemonDescriptionText(u8 stringId, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText) { if (drawMenuBoxOrText != DRAW_TEXT_ONLY) menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->descTextLeft / 8, menuBox->infoRects->descTextTop / 8, menuBox->infoRects->descTextWidth / 8, menuBox->infoRects->descTextHeight / 8, TRUE); if (drawMenuBoxOrText != DRAW_MENU_BOX_ONLY) AddTextPrinterParameterized3(menuBox->windowId, FONT_NORMAL_COPY_1, menuBox->infoRects->descTextLeft, menuBox->infoRects->descTextTop, sFontColorTable[0], 0, sDescriptionStringTable[stringId]); } static void PartyMenuRemoveWindow(u8 *windowId) { if (*windowId != WINDOW_NONE) { ClearStdWindowAndFrameToTransparent(*windowId, FALSE); RemoveWindow(*windowId); *windowId = WINDOW_NONE; ScheduleBgCopyTilemapToVram(2); } } void DisplayPartyMenuStdMessage(u32 stringId) { u8 *windowPtr = &sPartyMenuInternal->windowId[1]; if (*windowPtr != WINDOW_NONE) PartyMenuRemoveWindow(windowPtr); if (stringId != PARTY_MSG_NONE) { switch (stringId) { case PARTY_MSG_DO_WHAT_WITH_MON: *windowPtr = AddWindow(&sDoWhatWithMonMsgWindowTemplate); break; case PARTY_MSG_DO_WHAT_WITH_ITEM: *windowPtr = AddWindow(&sDoWhatWithItemMsgWindowTemplate); break; case PARTY_MSG_DO_WHAT_WITH_MAIL: *windowPtr = AddWindow(&sDoWhatWithMailMsgWindowTemplate); break; case PARTY_MSG_RESTORE_WHICH_MOVE: case PARTY_MSG_BOOST_PP_WHICH_MOVE: *windowPtr = AddWindow(&sWhichMoveMsgWindowTemplate); break; default: *windowPtr = AddWindow(&sDefaultPartyMsgWindowTemplate); break; } if (stringId == PARTY_MSG_CHOOSE_MON) { if (sPartyMenuInternal->chooseMultiple) stringId = PARTY_MSG_CHOOSE_MON_AND_CONFIRM; else if (!ShouldUseChooseMonText()) stringId = PARTY_MSG_CHOOSE_MON_OR_CANCEL; } DrawStdFrameWithCustomTileAndPalette(*windowPtr, FALSE, 0x58, 15); StringExpandPlaceholders(gStringVar4, sActionStringTable[stringId]); AddTextPrinterParameterized(*windowPtr, FONT_NORMAL, gStringVar4, 0, 2, 0, 0); ScheduleBgCopyTilemapToVram(2); } } static bool8 ShouldUseChooseMonText(void) { struct Pokemon *party = gPlayerParty; u32 i; u8 numAliveMons = 0; if (gPartyMenu.action == PARTY_ACTION_SEND_OUT) return TRUE; for (i = 0; i < PARTY_SIZE; ++i) { if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && (GetMonData(&party[i], MON_DATA_HP) != 0 || GetMonData(&party[i], MON_DATA_IS_EGG))) ++numAliveMons; if (numAliveMons > 1) return TRUE; } return FALSE; } static u8 DisplaySelectionWindow(u8 windowType) { struct WindowTemplate window; u8 cursorDimension; u8 fontAttribute; u32 i; switch (windowType) { case SELECTWINDOW_ACTIONS: window = SetWindowTemplateFields(2, 19, 19 - (sPartyMenuInternal->numActions * 2), 10, sPartyMenuInternal->numActions * 2, 14, 0x2BF); break; case SELECTWINDOW_ITEM: window = sItemGiveTakeWindowTemplate; break; case SELECTWINDOW_MAIL: window = sMailReadTakeWindowTemplate; break; default: // SELECTWINDOW_MOVES window = sMoveSelectWindowTemplate; break; } sPartyMenuInternal->windowId[0] = AddWindow(&window); DrawStdFrameWithCustomTileAndPalette(sPartyMenuInternal->windowId[0], FALSE, 0x4F, 13); if (windowType == SELECTWINDOW_MOVES) return sPartyMenuInternal->windowId[0]; cursorDimension = GetMenuCursorDimensionByFont(FONT_NORMAL, 0); fontAttribute = GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING); for (i = 0; i < sPartyMenuInternal->numActions; ++i) { u8 fontColorsId = (sPartyMenuInternal->actions[i] >= CURSOR_OPTION_FIELD_MOVES) ? 4 : 3; AddTextPrinterParameterized4(sPartyMenuInternal->windowId[0], FONT_NORMAL, cursorDimension, (i * 16) + 2, fontAttribute, 0, sFontColorTable[fontColorsId], 0, sCursorOptions[sPartyMenuInternal->actions[i]].text); } Menu_InitCursorInternal(sPartyMenuInternal->windowId[0], FONT_NORMAL, 0, 2, 16, sPartyMenuInternal->numActions, 0, 1); ScheduleBgCopyTilemapToVram(2); return sPartyMenuInternal->windowId[0]; } static void PartyMenuPrintText(const u8 *text) { DrawStdFrameWithCustomTileAndPalette(6, FALSE, 0x4F, 13); gTextFlags.canABSpeedUpPrint = TRUE; AddTextPrinterParameterized2(6, FONT_NORMAL, text, GetTextSpeedSetting(), 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } static void PartyMenuDisplayYesNoMenu(void) { CreateYesNoMenu(&sPartyMenuYesNoWindowTemplate, FONT_NORMAL, 0, 2, 0x4F, 13, 0); } static u8 CreateLevelUpStatsWindow(void) { sPartyMenuInternal->windowId[0] = AddWindow(&sLevelUpStatsWindowTemplate); DrawStdFrameWithCustomTileAndPalette(sPartyMenuInternal->windowId[0], FALSE, 0x4F, 13); return sPartyMenuInternal->windowId[0]; } static void RemoveLevelUpStatsWindow(void) { ClearWindowTilemap(sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); } static void PartyMenu_Oak_PrintText(u8 windowId, const u8 *str) { StringExpandPlaceholders(gStringVar4, str); gTextFlags.canABSpeedUpPrint = TRUE; AddTextPrinterParameterized2(windowId, FONT_MALE, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } static bool8 FirstBattleEnterParty_CreateWindowAndMsg1Printer(void) { u8 windowId = AddWindow(&sWindowTemplate_FirstBattleOakVoiceover); LoadMenuMessageWindowGfx(windowId, 0x4F, BG_PLTT_ID(14)); DrawDialogFrameWithCustomTileAndPalette(windowId, 1, 0x4F, 0xE); PartyMenu_Oak_PrintText(windowId, gText_OakImportantToGetToKnowPokemonThroughly); return windowId; } static void FirstBattleEnterParty_DestroyVoiceoverWindow(u8 windowId) { ClearWindowTilemap(windowId); ClearDialogWindowAndFrameToTransparent(windowId, FALSE); RemoveWindow(windowId); ScheduleBgCopyTilemapToVram(2); } static void ToggleFieldMoveDescriptionWindow(u8 action) { u8 letterSpacing; struct PartyMenuInternal *ptr = sPartyMenuInternal; if (action < CURSOR_OPTION_FIELD_MOVES) { if (ptr->windowId[2] != WINDOW_NONE) { ClearWindowTilemap(ptr->windowId[2]); RemoveWindow(ptr->windowId[2]); ptr->windowId[2] = WINDOW_NONE; ScheduleBgCopyTilemapToVram(2); } } else { if (ptr->windowId[2] == WINDOW_NONE) ptr->windowId[2] = AddWindow(&sFieldMoveDescriptionWindowTemplate); DrawHelpMessageWindowTilesById(ptr->windowId[2]); letterSpacing = GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING); AddTextPrinterParameterized4(ptr->windowId[2], FONT_NORMAL, 3, 6, letterSpacing, 0, sFontColorTable[5], 0, sFieldMoveDescriptionTable[action - CURSOR_OPTION_FIELD_MOVES]); PutWindowTilemap(ptr->windowId[2]); ScheduleBgCopyTilemapToVram(2); } } static void CreatePartyMonIconSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox, u32 slot) { bool32 handleDeoxys = TRUE; u16 species2; u32 personality; // If in a multi battle, show partners Deoxys icon as Normal forme if (IsMultiBattle() == TRUE && gMain.inBattle) handleDeoxys = (sMultiBattlePartnersPartyMask[slot] ^ handleDeoxys) ? TRUE : FALSE; species2 = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); if(species2 == SPECIES_DEOXYS && handleDeoxys) { personality = GetMonData(mon, MON_DATA_FORME); } CreatePartyMonIconSpriteParameterized(species2, personality, menuBox, 1, handleDeoxys); UpdatePartyMonHPBar(menuBox->monSpriteId, mon); } static void CreatePartyMonIconSpriteParameterized(u16 species, u32 pid, struct PartyMenuBox *menuBox, u8 priority, bool32 handleDeoxys) { if (species != SPECIES_NONE) { menuBox->monSpriteId = CreateMonIcon(species, SpriteCB_MonIcon, menuBox->spriteCoords[0], menuBox->spriteCoords[1], 4, pid, handleDeoxys); gSprites[menuBox->monSpriteId].oam.priority = priority; } } static void UpdateHPBar(u8 spriteId, u16 hp, u16 maxhp) { switch (GetHPBarLevel(hp, maxhp)) { case HP_BAR_FULL: SetPartyHPBarSprite(&gSprites[spriteId], 0); break; case HP_BAR_GREEN: SetPartyHPBarSprite(&gSprites[spriteId], 1); break; case HP_BAR_YELLOW: SetPartyHPBarSprite(&gSprites[spriteId], 2); break; case HP_BAR_RED: SetPartyHPBarSprite(&gSprites[spriteId], 3); break; default: SetPartyHPBarSprite(&gSprites[spriteId], 4); break; } } static void UpdatePartyMonHPBar(u8 spriteId, struct Pokemon *mon) { UpdateHPBar(spriteId, GetMonData(mon, MON_DATA_HP), GetMonData(mon, MON_DATA_MAX_HP)); } static void AnimateSelectedPartyIcon(u8 spriteId, u8 animNum) { gSprites[spriteId].data[0] = 0; if (animNum == 0) { if (gSprites[spriteId].x == 16) { gSprites[spriteId].x2 = 0; gSprites[spriteId].y2 = -4; } else { gSprites[spriteId].x2 = -4; gSprites[spriteId].y2 = 0; } gSprites[spriteId].callback = SpriteCB_UpdatePartyMonIcon; } else { gSprites[spriteId].x2 = 0; gSprites[spriteId].y2 = 0; gSprites[spriteId].callback = SpriteCB_BouncePartyMonIcon; } } static void SpriteCB_BouncePartyMonIcon(struct Sprite *sprite) { u8 animCmd = UpdateMonIconFrame(sprite); if (animCmd != 0) { if (animCmd & 1) // % 2 also matches sprite->y2 = -3; else sprite->y2 = 1; } } static void SpriteCB_UpdatePartyMonIcon(struct Sprite *sprite) { UpdateMonIconFrame(sprite); } static void CreatePartyMonHeldItemSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { menuBox->itemSpriteId = CreateSprite(&sSpriteTemplate_HeldItem, menuBox->spriteCoords[2], menuBox->spriteCoords[3], 0); UpdatePartyMonHeldItemSprite(mon, menuBox); } } static void CreatePartyMonHeldItemSpriteParameterized(u16 species, u16 item, struct PartyMenuBox *menuBox) { if (species != SPECIES_NONE) { menuBox->itemSpriteId = CreateSprite(&sSpriteTemplate_HeldItem, menuBox->spriteCoords[2], menuBox->spriteCoords[3], 0); gSprites[menuBox->itemSpriteId].oam.priority = 0; ShowOrHideHeldItemSprite(item, menuBox); } } static void UpdatePartyMonHeldItemSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox) { ShowOrHideHeldItemSprite(GetMonData(mon, MON_DATA_HELD_ITEM), menuBox); } static void ShowOrHideHeldItemSprite(u16 item, struct PartyMenuBox *menuBox) { if (item == ITEM_NONE) { gSprites[menuBox->itemSpriteId].invisible = TRUE; } else { if (ItemIsMail(item)) StartSpriteAnim(&gSprites[menuBox->itemSpriteId], 1); else StartSpriteAnim(&gSprites[menuBox->itemSpriteId], 0); gSprites[menuBox->itemSpriteId].invisible = FALSE; } } void LoadHeldItemIcons(void) { LoadSpriteSheet(&sSpriteSheet_HeldItem); LoadSpritePalette(&sSpritePalette_HeldItem); } void DrawHeldItemIconsForTrade(u8 *partyCounts, u8 *partySpriteIds, u8 whichParty) { u32 i; u16 item; switch (whichParty) { case TRADE_PLAYER: for (i = 0; i < partyCounts[TRADE_PLAYER]; ++i) { item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); if (item != ITEM_NONE) CreateHeldItemSpriteForTrade(partySpriteIds[i], ItemIsMail(item)); } break; case TRADE_PARTNER: for (i = 0; i < partyCounts[TRADE_PARTNER]; ++i) { item = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); if (item != ITEM_NONE) CreateHeldItemSpriteForTrade(partySpriteIds[i + PARTY_SIZE], ItemIsMail(item)); } break; } } static void CreateHeldItemSpriteForTrade(u8 spriteId, bool8 isMail) { u8 subpriority = gSprites[spriteId].subpriority; u8 newSpriteId = CreateSprite(&sSpriteTemplate_HeldItem, 250, 170, subpriority - 1); gSprites[newSpriteId].x2 = 4; gSprites[newSpriteId].y2 = 10; gSprites[newSpriteId].callback = SpriteCB_HeldItem; gSprites[newSpriteId].data[7] = spriteId; StartSpriteAnim(&gSprites[newSpriteId], isMail); gSprites[newSpriteId].callback(&gSprites[newSpriteId]); } static void SpriteCB_HeldItem(struct Sprite *sprite) { u8 otherSpriteId = sprite->data[7]; if (gSprites[otherSpriteId].invisible) { sprite->invisible = TRUE; } else { sprite->invisible = FALSE; sprite->x = gSprites[otherSpriteId].x + gSprites[otherSpriteId].x2; sprite->y = gSprites[otherSpriteId].y + gSprites[otherSpriteId].y2; } } static void CreatePartyMonPokeballSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) menuBox->pokeballSpriteId = CreateSprite(&sSpriteTemplate_MenuPokeball, menuBox->spriteCoords[6], menuBox->spriteCoords[7], 8); } static void CreatePartyMonPokeballSpriteParameterized(u16 species, struct PartyMenuBox *menuBox) { if (species != SPECIES_NONE) { menuBox->pokeballSpriteId = CreateSprite(&sSpriteTemplate_MenuPokeball, menuBox->spriteCoords[6], menuBox->spriteCoords[7], 8); gSprites[menuBox->pokeballSpriteId].oam.priority = 0; } } // For Cancel when Confirm isnt present static u8 CreatePokeballButtonSprite(u8 x, u8 y) { u8 spriteId = CreateSprite(&sSpriteTemplate_MenuPokeball, x, y, 8); gSprites[spriteId].oam.priority = 2; return spriteId; } // For Confirm and Cancel when both are present static u8 CreateSmallPokeballButtonSprite(u8 x, u8 y) { return CreateSprite(&sSpriteTemplate_MenuPokeballSmall, x, y, 8); } static void PartyMenuStartSpriteAnim(u8 spriteId, u8 animNum) { StartSpriteAnim(&gSprites[spriteId], animNum); } // Unused. Might explain the large blank section in gPartyMenuPokeballSmall_Gfx // At the very least this is how the unused anim cmds for sSpriteAnimTable_MenuPokeballSmall were meant to be accessed void SpriteCB_BounceConfirmCancelButton(u8 spriteId, u8 spriteId2, u8 animNum) { if (animNum == 0) { StartSpriteAnim(&gSprites[spriteId], 2); StartSpriteAnim(&gSprites[spriteId2], 4); gSprites[spriteId].y2 = 0; gSprites[spriteId2].y2 = 0; } else { StartSpriteAnim(&gSprites[spriteId], 3); StartSpriteAnim(&gSprites[spriteId2], 5); gSprites[spriteId].y2 = -4; gSprites[spriteId2].y2 = 4; } } static void LoadPartyMenuPokeballGfx(void) { LoadCompressedSpriteSheet(&sSpriteSheet_MenuPokeball); LoadCompressedSpriteSheet(&sSpriteSheet_MenuPokeballSmall); LoadCompressedSpritePalette(&sSpritePalette_MenuPokeball); } static void CreatePartyMonStatusSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { menuBox->statusSpriteId = CreateSprite(&sSpriteTemplate_StatusIcons, menuBox->spriteCoords[4], menuBox->spriteCoords[5], 0); SetPartyMonAilmentGfx(mon, menuBox); } } static void CreatePartyMonStatusSpriteParameterized(u16 species, u8 status, struct PartyMenuBox *menuBox) { if (species != SPECIES_NONE) { menuBox->statusSpriteId = CreateSprite(&sSpriteTemplate_StatusIcons, menuBox->spriteCoords[4], menuBox->spriteCoords[5], 0); UpdatePartyMonAilmentGfx(status, menuBox); gSprites[menuBox->statusSpriteId].oam.priority = 0; } } static void SetPartyMonAilmentGfx(struct Pokemon *mon, struct PartyMenuBox *menuBox) { UpdatePartyMonAilmentGfx(GetMonAilment(mon), menuBox); } static void UpdatePartyMonAilmentGfx(u8 status, struct PartyMenuBox *menuBox) { switch (status) { case AILMENT_NONE: case AILMENT_PKRS: gSprites[menuBox->statusSpriteId].invisible = TRUE; break; default: StartSpriteAnim(&gSprites[menuBox->statusSpriteId], status - 1); gSprites[menuBox->statusSpriteId].invisible = FALSE; break; } } static void LoadPartyMenuAilmentGfx(void) { LoadCompressedSpriteSheet(&sSpriteSheet_StatusIcons); LoadCompressedSpritePalette(&sSpritePalette_StatusIcons); } static void SetPartyMonSelectionActions(struct Pokemon *mons, u8 slotId, u8 action) { u32 i; if (action == ACTIONS_NONE) { SetPartyMonFieldSelectionActions(mons, slotId); } else { sPartyMenuInternal->numActions = sPartyMenuActionCounts[action]; for (i = 0; i < sPartyMenuInternal->numActions; ++i) sPartyMenuInternal->actions[i] = sPartyMenuActions[action][i]; } } static void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId) { u8 i, j; sPartyMenuInternal->numActions = 0; AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_SUMMARY); // Add field moves to action list for (i = 0; i < MAX_MON_MOVES; ++i) { for (j = 0; sFieldMoves[j] != FIELD_MOVE_END; ++j) { if (GetMonData(&mons[slotId], i + MON_DATA_MOVE1) == sFieldMoves[j]) { AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, j + CURSOR_OPTION_FIELD_MOVES); break; } } } if (GetMonData(&mons[1], MON_DATA_SPECIES) != SPECIES_NONE) AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_SWITCH); if (ItemIsMail(GetMonData(&mons[slotId], MON_DATA_HELD_ITEM))) AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_MAIL); else AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_ITEM); AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_CANCEL1); } static u8 GetPartyMenuActionsType(struct Pokemon *mon) { u32 actionType; switch (gPartyMenu.menuType) { case PARTY_MENU_TYPE_FIELD: if (GetMonData(mon, MON_DATA_IS_EGG)) actionType = ACTIONS_SWITCH; else actionType = ACTIONS_NONE; // actions populated by SetPartyMonFieldSelectionActions break; case PARTY_MENU_TYPE_IN_BATTLE: actionType = GetPartyMenuActionsTypeInBattle(mon); break; case PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS: switch (GetPartySlotEntryStatus(gPartyMenu.slotId)) { default: // Not eligible actionType = ACTIONS_SUMMARY_ONLY; break; case 0: // Eligible actionType = ACTIONS_ENTER; break; case 1: // Already selected actionType = ACTIONS_NO_ENTRY; break; } break; case PARTY_MENU_TYPE_DAYCARE: actionType = (GetMonData(mon, MON_DATA_IS_EGG)) ? ACTIONS_SUMMARY_ONLY : ACTIONS_STORE; break; case PARTY_MENU_TYPE_UNION_ROOM_REGISTER: actionType = ACTIONS_REGISTER; break; case PARTY_MENU_TYPE_UNION_ROOM_TRADE: actionType = ACTIONS_TRADE; break; case PARTY_MENU_TYPE_SPIN_TRADE: actionType = ACTIONS_SPIN_TRADE; break; // The following have no selection actions (i.e. they exit immediately upon selection) // PARTY_MENU_TYPE_CONTEST // PARTY_MENU_TYPE_CHOOSE_SINGLE_MON // PARTY_MENU_TYPE_MULTI_SHOWCASE // PARTY_MENU_TYPE_MOVE_RELEARNER // PARTY_MENU_TYPE_MINIGAME default: actionType = ACTIONS_NONE; break; } return actionType; } static void CreateSelectionWindow(void) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; GetMonNickname(mon, gStringVar1); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); SetPartyMonSelectionActions(gPlayerParty, gPartyMenu.slotId, GetPartyMenuActionsType(mon)); DisplaySelectionWindow(SELECTWINDOW_ACTIONS); DisplayPartyMenuStdMessage(PARTY_MSG_DO_WHAT_WITH_MON); } static void Task_TryCreateSelectionWindow(u8 taskId) { CreateSelectionWindow(); gTasks[taskId].data[0] = (u8)MENU_B_PRESSED; gTasks[taskId].func = Task_HandleSelectionMenuInput; } static void Task_HandleSelectionMenuInput(u8 taskId) { if (!gPaletteFade.active && MenuHelpers_ShouldWaitForLinkRecv() != TRUE) { s8 input; s16 *data = gTasks[taskId].data; if (sPartyMenuInternal->numActions <= 3) input = Menu_ProcessInputNoWrapAround_other(); else input = Menu_ProcessInput_other(); if (data[0] != Menu_GetCursorPos()) ToggleFieldMoveDescriptionWindow(sPartyMenuInternal->actions[Menu_GetCursorPos()]); data[0] = Menu_GetCursorPos(); switch (input) { case MENU_NOTHING_CHOSEN: break; case MENU_B_PRESSED: PlaySE(SE_SELECT); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[2]); sCursorOptions[sPartyMenuInternal->actions[sPartyMenuInternal->numActions - 1]].func(taskId); break; default: PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[2]); sCursorOptions[sPartyMenuInternal->actions[input]].func(taskId); break; } } } static void CursorCB_Summary(u8 taskId) { PlaySE(SE_SELECT); sPartyMenuInternal->exitCallback = CB2_ShowPokemonSummaryScreen; Task_ClosePartyMenu(taskId); } static void CB2_ShowPokemonSummaryScreen(void) { if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE) UpdatePartyToBattleOrder(); ShowPokemonSummaryScreen(gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuFromSummaryScreen, PSS_MODE_NORMAL); } static void CB2_ReturnToPartyMenuFromSummaryScreen(void) { gPaletteFade.bufferTransferDisabled = TRUE; gPartyMenu.slotId = GetLastViewedMonIndex(); InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_DO_WHAT_WITH_MON, Task_TryCreateSelectionWindow, gPartyMenu.exitCallback); } static void CursorCB_Switch(u8 taskId) { PlaySE(SE_SELECT); gPartyMenu.action = PARTY_ACTION_SWITCH; PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); DisplayPartyMenuStdMessage(PARTY_MSG_MOVE_TO_WHERE); AnimatePartySlot(gPartyMenu.slotId, 1); gPartyMenu.slotId2 = gPartyMenu.slotId; gTasks[taskId].func = Task_HandleChooseMonInput; } #define tSlot1Left data[0] #define tSlot1Top data[1] #define tSlot1Width data[2] #define tSlot1Height data[3] #define tSlot2Left data[4] #define tSlot2Top data[5] #define tSlot2Width data[6] #define tSlot2Height data[7] #define tSlot1Offset data[8] #define tSlot2Offset data[9] #define tSlot1SlideDir data[10] #define tSlot2SlideDir data[11] static void SwitchSelectedMons(u8 taskId) { s16 *data = gTasks[taskId].data; u8 windowIds[2]; if (gPartyMenu.slotId2 == gPartyMenu.slotId) { FinishTwoMonAction(taskId); } else { // Initialize switching party mons slide animation SetSwitchedPartyOrderQuestLogEvent(); windowIds[0] = sPartyMenuBoxes[gPartyMenu.slotId].windowId; tSlot1Left = GetWindowAttribute(windowIds[0], WINDOW_TILEMAP_LEFT); tSlot1Top = GetWindowAttribute(windowIds[0], WINDOW_TILEMAP_TOP); tSlot1Width = GetWindowAttribute(windowIds[0], WINDOW_WIDTH); tSlot1Height = GetWindowAttribute(windowIds[0], WINDOW_HEIGHT); tSlot1Offset = 0; if (tSlot1Width == 10) tSlot1SlideDir = -1; else tSlot1SlideDir = 1; windowIds[1] = sPartyMenuBoxes[gPartyMenu.slotId2].windowId; tSlot2Left = GetWindowAttribute(windowIds[1], WINDOW_TILEMAP_LEFT); tSlot2Top = GetWindowAttribute(windowIds[1], WINDOW_TILEMAP_TOP); tSlot2Width = GetWindowAttribute(windowIds[1], WINDOW_WIDTH); tSlot2Height = GetWindowAttribute(windowIds[1], WINDOW_HEIGHT); tSlot2Offset = 0; if (tSlot2Width == 10) tSlot2SlideDir = -1; else tSlot2SlideDir = 1; sSlot1TilemapBuffer = Alloc(tSlot1Width * (tSlot1Height << 1)); sSlot2TilemapBuffer = Alloc(tSlot2Width * (tSlot2Height << 1)); CopyToBufferFromBgTilemap(0, sSlot1TilemapBuffer, tSlot1Left, tSlot1Top, tSlot1Width, tSlot1Height); CopyToBufferFromBgTilemap(0, sSlot2TilemapBuffer, tSlot2Left, tSlot2Top, tSlot2Width, tSlot2Height); ClearWindowTilemap(windowIds[0]); ClearWindowTilemap(windowIds[1]); gPartyMenu.action = PARTY_ACTION_SWITCHING; AnimatePartySlot(gPartyMenu.slotId, 1); AnimatePartySlot(gPartyMenu.slotId2, 1); SlidePartyMenuBoxOneStep(taskId); gTasks[taskId].func = Task_SlideSelectedSlotsOffscreen; } } // returns FALSE if the slot has slid fully offscreen / back onscreen static bool8 TryMovePartySlot(s16 x, s16 width, u8 *leftMove, u8 *newX, u8 *newWidth) { if ((x + width) < 0) return FALSE; if (x > 31) return FALSE; if (x < 0) { *leftMove = x * -1; *newX = 0; *newWidth = width + x; } else { *leftMove = 0; *newX = x; if ((x + width) > 31) *newWidth = 32 - x; else *newWidth = width; } return TRUE; } static void MoveAndBufferPartySlot(const void *rectSrc, s16 x, s16 y, s16 width, s16 height, s16 dir) { // The use of the dimension parameters here is a mess u8 leftMove, newX, newWidth; // leftMove is used as a srcX, newX is used as both x and srcHeight, newWidth is used as both width and destY if (TryMovePartySlot(x, width, &leftMove, &newX, &newWidth)) { FillBgTilemapBufferRect_Palette0(0, 0, newX, y, newWidth, height); if (TryMovePartySlot(x + dir, width, &leftMove, &newX, &newWidth)) CopyRectToBgTilemapBufferRect(0, rectSrc, leftMove, 0, width, height, newX, y, newWidth, height, 17, 0, 0); } } static void MovePartyMenuBoxSprites(struct PartyMenuBox *menuBox, s16 offset) { gSprites[menuBox->pokeballSpriteId].x2 += offset * 8; gSprites[menuBox->itemSpriteId].x2 += offset * 8; gSprites[menuBox->monSpriteId].x2 += offset * 8; gSprites[menuBox->statusSpriteId].x2 += offset * 8; } static void SlidePartyMenuBoxSpritesOneStep(u8 taskId) { s16 *data = gTasks[taskId].data; if (tSlot1SlideDir != 0) MovePartyMenuBoxSprites(&sPartyMenuBoxes[gPartyMenu.slotId], tSlot1SlideDir); if (tSlot2SlideDir != 0) MovePartyMenuBoxSprites(&sPartyMenuBoxes[gPartyMenu.slotId2], tSlot2SlideDir); } static void SlidePartyMenuBoxOneStep(u8 taskId) { s16 *data = gTasks[taskId].data; if (tSlot1SlideDir != 0) MoveAndBufferPartySlot(sSlot1TilemapBuffer, tSlot1Left + tSlot1Offset, tSlot1Top, tSlot1Width, tSlot1Height, tSlot1SlideDir); if (tSlot2SlideDir != 0) MoveAndBufferPartySlot(sSlot2TilemapBuffer, tSlot2Left + tSlot2Offset, tSlot2Top, tSlot2Width, tSlot2Height, tSlot2SlideDir); ScheduleBgCopyTilemapToVram(0); } static void Task_SlideSelectedSlotsOffscreen(u8 taskId) { s16 *data = gTasks[taskId].data; u16 slidingSlotPositions[2]; SlidePartyMenuBoxOneStep(taskId); SlidePartyMenuBoxSpritesOneStep(taskId); tSlot1Offset += tSlot1SlideDir; tSlot2Offset += tSlot2SlideDir; slidingSlotPositions[0] = tSlot1Left + tSlot1Offset; slidingSlotPositions[1] = tSlot2Left + tSlot2Offset; // Both slots have slid offscreen if (slidingSlotPositions[0] > 33 && slidingSlotPositions[1] > 33) { tSlot1SlideDir *= -1; tSlot2SlideDir *= -1; SwitchPartyMon(); DisplayPartyPokemonData(gPartyMenu.slotId); DisplayPartyPokemonData(gPartyMenu.slotId2); PutWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId].windowId); PutWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId2].windowId); CopyToBufferFromBgTilemap(0, sSlot1TilemapBuffer, tSlot1Left, tSlot1Top, tSlot1Width, tSlot1Height); CopyToBufferFromBgTilemap(0, sSlot2TilemapBuffer, tSlot2Left, tSlot2Top, tSlot2Width, tSlot2Height); ClearWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId].windowId); ClearWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId2].windowId); gTasks[taskId].func = Task_SlideSelectedSlotsOnscreen; } } static void Task_SlideSelectedSlotsOnscreen(u8 taskId) { s16 *data = gTasks[taskId].data; SlidePartyMenuBoxOneStep(taskId); SlidePartyMenuBoxSpritesOneStep(taskId); // Both slots have slide back onscreen if (tSlot1SlideDir == 0 && tSlot2SlideDir == 0) { PutWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId].windowId); PutWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId2].windowId); ScheduleBgCopyTilemapToVram(0); Free(sSlot1TilemapBuffer); Free(sSlot2TilemapBuffer); FinishTwoMonAction(taskId); } // Continue sliding else { tSlot1Offset += tSlot1SlideDir; tSlot2Offset += tSlot2SlideDir; if (tSlot1Offset == 0) tSlot1SlideDir = 0; if (tSlot2Offset == 0) tSlot2SlideDir = 0; } } static void SwitchMenuBoxSprites(u8 *spriteIdPtr1, u8 *spriteIdPtr2) { u8 spriteIdBuffer = *spriteIdPtr1; u16 xBuffer1, yBuffer1, xBuffer2, yBuffer2; *spriteIdPtr1 = *spriteIdPtr2; *spriteIdPtr2 = spriteIdBuffer; xBuffer1 = gSprites[*spriteIdPtr1].x; yBuffer1 = gSprites[*spriteIdPtr1].y; xBuffer2 = gSprites[*spriteIdPtr1].x2; yBuffer2 = gSprites[*spriteIdPtr1].y2; gSprites[*spriteIdPtr1].x = gSprites[*spriteIdPtr2].x; gSprites[*spriteIdPtr1].y = gSprites[*spriteIdPtr2].y; gSprites[*spriteIdPtr1].x2 = gSprites[*spriteIdPtr2].x2; gSprites[*spriteIdPtr1].y2 = gSprites[*spriteIdPtr2].y2; gSprites[*spriteIdPtr2].x = xBuffer1; gSprites[*spriteIdPtr2].y = yBuffer1; gSprites[*spriteIdPtr2].x2 = xBuffer2; gSprites[*spriteIdPtr2].y2 = yBuffer2; } static void SwitchPartyMon(void) { struct PartyMenuBox *menuBoxes[2]; struct Pokemon *mon1, *mon2; struct Pokemon *monBuffer; menuBoxes[0] = &sPartyMenuBoxes[gPartyMenu.slotId]; menuBoxes[1] = &sPartyMenuBoxes[gPartyMenu.slotId2]; mon1 = &gPlayerParty[gPartyMenu.slotId]; mon2 = &gPlayerParty[gPartyMenu.slotId2]; monBuffer = Alloc(sizeof(struct Pokemon)); *monBuffer = *mon1; *mon1 = *mon2; *mon2 = *monBuffer; Free(monBuffer); SwitchMenuBoxSprites(&menuBoxes[0]->pokeballSpriteId, &menuBoxes[1]->pokeballSpriteId); SwitchMenuBoxSprites(&menuBoxes[0]->itemSpriteId, &menuBoxes[1]->itemSpriteId); SwitchMenuBoxSprites(&menuBoxes[0]->monSpriteId, &menuBoxes[1]->monSpriteId); SwitchMenuBoxSprites(&menuBoxes[0]->statusSpriteId, &menuBoxes[1]->statusSpriteId); } static void SetSwitchedPartyOrderQuestLogEvent(void) { struct QuestLogEvent_SwitchedPartyOrder * data = Alloc(sizeof(*data)); data->species1 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES_OR_EGG); data->species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId2], MON_DATA_SPECIES_OR_EGG); SetQuestLogEvent(QL_EVENT_SWITCHED_PARTY_ORDER, (const u16 *)data); Free(data); } // Finish switching mons or using Softboiled static void FinishTwoMonAction(u8 taskId) { PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); gPartyMenu.action = PARTY_ACTION_CHOOSE_MON; AnimatePartySlot(gPartyMenu.slotId, 0); gPartyMenu.slotId = gPartyMenu.slotId2; AnimatePartySlot(gPartyMenu.slotId2, 1); DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } #undef tSlot1Left #undef tSlot1Top #undef tSlot1Width #undef tSlot1Height #undef tSlot2Left #undef tSlot2Top #undef tSlot2Width #undef tSlot2Height #undef tSlot1Offset #undef tSlot2Offset #undef tSlot1SlideDir #undef tSlot2SlideDir static void CursorCB_Cancel1(u8 taskId) { PlaySE(SE_SELECT); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); if (gPartyMenu.menuType == PARTY_MENU_TYPE_DAYCARE) DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON_2); else DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } static void CursorCB_Item(u8 taskId) { PlaySE(SE_SELECT); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); SetPartyMonSelectionActions(gPlayerParty, gPartyMenu.slotId, ACTIONS_ITEM); DisplaySelectionWindow(SELECTWINDOW_ITEM); DisplayPartyMenuStdMessage(PARTY_MSG_DO_WHAT_WITH_ITEM); gTasks[taskId].data[0] = (u8)MENU_B_PRESSED; gTasks[taskId].func = Task_HandleSelectionMenuInput; } static void CursorCB_Give(u8 taskId) { PlaySE(SE_SELECT); sPartyMenuInternal->exitCallback = CB2_SelectBagItemToGive; Task_ClosePartyMenu(taskId); } void CB2_SelectBagItemToGive(void) { GoToBagMenu(ITEMMENULOCATION_PARTY, OPEN_BAG_LAST, CB2_GiveHoldItem); } void CB2_GiveHoldItem(void) { if (gSpecialVar_ItemId == ITEM_NONE) { InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_NONE, Task_TryCreateSelectionWindow, gPartyMenu.exitCallback); } else { sPartyMenuItemId = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_HELD_ITEM); // Already holding item if (sPartyMenuItemId != ITEM_NONE) { InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_NONE, Task_SwitchHoldItemsPrompt, gPartyMenu.exitCallback); } // Give mail else if (ItemIsMail(gSpecialVar_ItemId)) { RemoveBagItem(gSpecialVar_ItemId, 1); GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId); CB2_WriteMailToGiveMon(); } // Give item else { InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_NONE, Task_GiveHoldItem, gPartyMenu.exitCallback); } } } static void Task_GiveHoldItem(u8 taskId) { u16 item; if (!gPaletteFade.active) { item = gSpecialVar_ItemId; DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], item, FALSE, FALSE); GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], item); RemoveBagItem(item, 1); gTasks[taskId].func = Task_UpdateHeldItemSprite; } } static void Task_SwitchHoldItemsPrompt(u8 taskId) { if (!gPaletteFade.active) { DisplayAlreadyHoldingItemSwitchMessage(&gPlayerParty[gPartyMenu.slotId], sPartyMenuItemId, TRUE); gTasks[taskId].func = Task_SwitchItemsYesNo; } } static void Task_SwitchItemsYesNo(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PartyMenuDisplayYesNoMenu(); gTasks[taskId].func = Task_HandleSwitchItemsYesNoInput; } } static void Task_HandleSwitchItemsYesNoInput(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // Yes, switch items RemoveBagItem(gSpecialVar_ItemId, 1); // No room to return held item to bag if (AddBagItem(sPartyMenuItemId, 1) == FALSE) { AddBagItem(gSpecialVar_ItemId, 1); BufferBagFullCantTakeItemMessage(sPartyMenuItemId); DisplayPartyMenuMessage(gStringVar4, FALSE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } // Giving mail else if (ItemIsMail(gSpecialVar_ItemId)) { GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId); gTasks[taskId].func = Task_WriteMailToGiveMonAfterText; } // Giving item else { GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId); DisplaySwitchedHeldItemMessage(gSpecialVar_ItemId, sPartyMenuItemId, TRUE); gTasks[taskId].func = Task_UpdateHeldItemSprite; } break; case MENU_B_PRESSED: PlaySE(SE_SELECT); // fallthrough case 1: // No gTasks[taskId].func = Task_ReturnToChooseMonAfterText; break; } } static void Task_WriteMailToGiveMonAfterText(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { sPartyMenuInternal->exitCallback = CB2_WriteMailToGiveMon; Task_ClosePartyMenu(taskId); } } static void CB2_WriteMailToGiveMon(void) { u8 mail = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MAIL); DoEasyChatScreen(EASY_CHAT_TYPE_MAIL, gSaveBlock1Ptr->mail[mail].words, CB2_ReturnToPartyMenuFromWritingMail); } static void CB2_ReturnToPartyMenuFromWritingMail(void) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); // Canceled writing mail if (gSpecialVar_Result == FALSE) { TakeMailFromMon(mon); SetMonData(mon, MON_DATA_HELD_ITEM, &sPartyMenuItemId); RemoveBagItem(sPartyMenuItemId, 1); AddBagItem(item, 1); InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_CHOOSE_MON, Task_TryCreateSelectionWindow, gPartyMenu.exitCallback); } // Wrote mail else { InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_CHOOSE_MON, Task_DisplayGaveMailFromPartyMessage, gPartyMenu.exitCallback); } } // Nearly redundant with Task_DisplayGaveMailFromBagMessgae static void Task_DisplayGaveMailFromPartyMessage(u8 taskId) { if (!gPaletteFade.active) { if (sPartyMenuItemId == ITEM_NONE) DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId, FALSE, FALSE); else DisplaySwitchedHeldItemMessage(gSpecialVar_ItemId, sPartyMenuItemId, FALSE); gTasks[taskId].func = Task_UpdateHeldItemSprite; } } static void Task_UpdateHeldItemSprite(u8 taskId) { s8 slotId = gPartyMenu.slotId; if (IsPartyMenuTextPrinterActive() != TRUE) { UpdatePartyMonHeldItemSprite(&gPlayerParty[slotId], &sPartyMenuBoxes[slotId]); Task_ReturnToChooseMonAfterText(taskId); } } static void CursorCB_TakeItem(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); PlaySE(SE_SELECT); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); switch (TryTakeMonItem(mon)) { case 0: // Not holding item GetMonNickname(mon, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnNotHolding); DisplayPartyMenuMessage(gStringVar4, TRUE); break; case 1: // No room to take item BufferBagFullCantTakeItemMessage(item); DisplayPartyMenuMessage(gStringVar4, TRUE); break; default: // Took item DisplayTookHeldItemMessage(mon, item, TRUE); break; } ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_UpdateHeldItemSprite; } static void CursorCB_Mail(u8 taskId) { PlaySE(SE_SELECT); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); SetPartyMonSelectionActions(gPlayerParty, gPartyMenu.slotId, ACTIONS_MAIL); DisplaySelectionWindow(SELECTWINDOW_MAIL); DisplayPartyMenuStdMessage(PARTY_MSG_DO_WHAT_WITH_MAIL); gTasks[taskId].data[0] = (u8)MENU_B_PRESSED; gTasks[taskId].func = Task_HandleSelectionMenuInput; } static void CursorCB_Read(u8 taskId) { PlaySE(SE_SELECT); sPartyMenuInternal->exitCallback = CB2_ReadHeldMail; Task_ClosePartyMenu(taskId); } static void CB2_ReadHeldMail(void) { ReadMail(&gSaveBlock1Ptr->mail[GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MAIL)], CB2_ReturnToPartyMenuFromReadingMail, 1); } static void CB2_ReturnToPartyMenuFromReadingMail(void) { gPaletteFade.bufferTransferDisabled = TRUE; InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_DO_WHAT_WITH_MON, Task_TryCreateSelectionWindow, gPartyMenu.exitCallback); } static void CursorCB_TakeMail(u8 taskId) { PlaySE(SE_SELECT); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); DisplayPartyMenuMessage(gText_SendMailToPC, TRUE); gTasks[taskId].func = Task_SendMailToPCYesNo; } static void Task_SendMailToPCYesNo(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PartyMenuDisplayYesNoMenu(); gTasks[taskId].func = Task_HandleSendMailToPCYesNoInput; } } static void Task_HandleSendMailToPCYesNoInput(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // Yes, send to PC if (TakeMailFromMon2(&gPlayerParty[gPartyMenu.slotId]) != 0xFF) { DisplayPartyMenuMessage(gText_MailSentToPC, FALSE); gTasks[taskId].func = Task_UpdateHeldItemSprite; } else { DisplayPartyMenuMessage(gText_PCMailboxFull, FALSE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } break; case MENU_B_PRESSED: PlaySE(SE_SELECT); // fallthrough case 1: DisplayPartyMenuMessage(gText_MailMessageWillBeLost, TRUE); gTasks[taskId].func = Task_LoseMailMessageYesNo; break; } } static void Task_LoseMailMessageYesNo(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PartyMenuDisplayYesNoMenu(); gTasks[taskId].func = Task_HandleLoseMailMessageYesNoInput; } } static void Task_HandleLoseMailMessageYesNoInput(u8 taskId) { u16 item; switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // Yes, lose mail message item = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_HELD_ITEM); if (AddBagItem(item, 1) == TRUE) { TakeMailFromMon(&gPlayerParty[gPartyMenu.slotId]); DisplayPartyMenuMessage(gText_MailTakenFromPkmn, FALSE); gTasks[taskId].func = Task_UpdateHeldItemSprite; } else { BufferBagFullCantTakeItemMessage(item); DisplayPartyMenuMessage(gStringVar4, FALSE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } break; case MENU_B_PRESSED: PlaySE(SE_SELECT); // fallthrough case 1: gTasks[taskId].func = Task_ReturnToChooseMonAfterText; break; } } static void CursorCB_Cancel2(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; PlaySE(SE_SELECT); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); SetPartyMonSelectionActions(gPlayerParty, gPartyMenu.slotId, GetPartyMenuActionsType(mon)); DisplaySelectionWindow(SELECTWINDOW_ACTIONS); DisplayPartyMenuStdMessage(PARTY_MSG_DO_WHAT_WITH_MON); gTasks[taskId].data[0] = (u8)MENU_B_PRESSED; gTasks[taskId].func = Task_HandleSelectionMenuInput; } static void CursorCB_SendMon(u8 taskId) { PlaySE(SE_SELECT); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); if (TrySwitchInPokemon() == TRUE) { Task_ClosePartyMenu(taskId); } else { // gStringVar4 below is the error message buffered by TrySwitchInPokemon PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); DisplayPartyMenuMessage(gStringVar4, TRUE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } } static void CursorCB_Enter(u8 taskId) { u8 maxBattlers; u32 i; const u8 *str; if (gPartyMenu.chooseMonsBattleType == CHOOSE_MONS_FOR_UNION_ROOM_BATTLE) { maxBattlers = 2; str = gText_NoMoreThanTwoMayEnter; } else { maxBattlers = 3; str = gText_NoMoreThanThreeMayEnter; } PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); for (i = 0; i < maxBattlers; ++i) { if (gSelectedOrderFromParty[i] == 0) { PlaySE(SE_SELECT); gSelectedOrderFromParty[i] = gPartyMenu.slotId + 1; DisplayPartyPokemonDescriptionText(i + PARTYBOX_DESC_FIRST, &sPartyMenuBoxes[gPartyMenu.slotId], 1); if (i == (maxBattlers - 1)) MoveCursorToConfirm(); DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; return; } } PlaySE(SE_FAILURE); DisplayPartyMenuMessage(str, TRUE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } static void MoveCursorToConfirm(void) { AnimatePartySlot(gPartyMenu.slotId, 0); gPartyMenu.slotId = SLOT_CONFIRM; AnimatePartySlot(gPartyMenu.slotId, 1); } static void CursorCB_NoEntry(u8 taskId) { u32 i; PlaySE(SE_SELECT); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); for (i = 0; i < 3; ++i) { if (gSelectedOrderFromParty[i] == gPartyMenu.slotId + 1) { gSelectedOrderFromParty[i] = 0; switch (i) { case 0: gSelectedOrderFromParty[0] = gSelectedOrderFromParty[1]; gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; gSelectedOrderFromParty[2] = 0; break; case 1: gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; gSelectedOrderFromParty[2] = 0; break; } break; } } DisplayPartyPokemonDescriptionText(PARTYBOX_DESC_ABLE_3, &sPartyMenuBoxes[gPartyMenu.slotId], DRAW_MENU_BOX_AND_TEXT); if (gSelectedOrderFromParty[0] != 0) DisplayPartyPokemonDescriptionText(PARTYBOX_DESC_FIRST, &sPartyMenuBoxes[gSelectedOrderFromParty[0] - 1], DRAW_MENU_BOX_AND_TEXT); if (gSelectedOrderFromParty[1] != 0) DisplayPartyPokemonDescriptionText(PARTYBOX_DESC_SECOND, &sPartyMenuBoxes[gSelectedOrderFromParty[1] - 1], DRAW_MENU_BOX_AND_TEXT); DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } static void CursorCB_Store(u8 taskId) { PlaySE(SE_SELECT); gSpecialVar_0x8004 = gPartyMenu.slotId; Task_ClosePartyMenu(taskId); } // Register mon for the Trading Board in Union Room static void CursorCB_Register(u8 taskId) { u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES_OR_EGG); u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); u8 isModernFatefulEncounter = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MODERN_FATEFUL_ENCOUNTER); switch (CanRegisterMonForTradingBoard(*(struct RfuGameCompatibilityData *)GetHostRfuGameData(), species2, species, isModernFatefulEncounter)) { case CANT_REGISTER_MON: StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow); break; case CANT_REGISTER_EGG: StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow); break; default: PlaySE(SE_SELECT); Task_ClosePartyMenu(taskId); return; } PlaySE(SE_FAILURE); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); StringAppend(gStringVar4, gText_PauseUntilPress); DisplayPartyMenuMessage(gStringVar4, TRUE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } static void CursorCB_Trade1(u8 taskId) { u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES_OR_EGG); u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); u8 isModernFatefulEncounter = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MODERN_FATEFUL_ENCOUNTER); u32 stringId = GetUnionRoomTradeMessageId(*(struct RfuGameCompatibilityData *)GetHostRfuGameData(), gRfuPartnerCompatibilityData, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, isModernFatefulEncounter); if (stringId != UR_TRADE_MSG_NONE) { StringExpandPlaceholders(gStringVar4, sUnionRoomTradeMessages[stringId - 1]); PlaySE(SE_FAILURE); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); StringAppend(gStringVar4, gText_PauseUntilPress); DisplayPartyMenuMessage(gStringVar4, TRUE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } else { PlaySE(SE_SELECT); Task_ClosePartyMenu(taskId); } } // Spin Trade (based on the translation of the Japanese trade prompt) // Not implemented, and normally unreachable because PARTY_MENU_TYPE_SPIN_TRADE is never used static void CursorCB_Trade2(u8 taskId) { } static void CursorCB_FieldMove(u8 taskId) { u8 fieldMove = sPartyMenuInternal->actions[Menu_GetCursorPos()] - CURSOR_OPTION_FIELD_MOVES; const struct MapHeader *mapHeader; PlaySE(SE_SELECT); if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc == NULL) return; PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE) { if (fieldMove == FIELD_MOVE_MILK_DRINK || fieldMove == FIELD_MOVE_SOFT_BOILED) DisplayPartyMenuStdMessage(PARTY_MSG_CANT_USE_HERE); else DisplayPartyMenuStdMessage(sFieldMoveCursorCallbacks[fieldMove].msgId); gTasks[taskId].func = Task_CancelAfterAorBPress; } else { if(fieldMove == FIELD_MOVE_DIVE && !FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) { DisplayPartyMenuMessage(gText_CantUseUntilNewHM, TRUE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } // All field moves before WATERFALL are HMs. else if ((fieldMove <= FIELD_MOVE_WATERFALL && fieldMove != FIELD_MOVE_DIVE) && FlagGet(FLAG_BADGE01_GET + fieldMove) != TRUE) { DisplayPartyMenuMessage(gText_CantUseUntilNewBadge, TRUE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } else if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc() == TRUE) { switch (fieldMove) { case FIELD_MOVE_MILK_DRINK: case FIELD_MOVE_SOFT_BOILED: ChooseMonForSoftboiled(taskId); break; case FIELD_MOVE_TELEPORT: mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum); GetMapNameGeneric(gStringVar1, mapHeader->regionMapSectionId); StringExpandPlaceholders(gStringVar4, gText_ReturnToHealingSpot); DisplayFieldMoveExitAreaMessage(taskId); sPartyMenuInternal->data[0] = fieldMove; break; case FIELD_MOVE_DIG: mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum); GetMapNameGeneric(gStringVar1, mapHeader->regionMapSectionId); StringExpandPlaceholders(gStringVar4, gText_EscapeFromHereAndReturnTo); DisplayFieldMoveExitAreaMessage(taskId); sPartyMenuInternal->data[0] = fieldMove; break; case FIELD_MOVE_FLY: gPartyMenu.exitCallback = CB2_OpenFlyMap; Task_ClosePartyMenu(taskId); break; default: gPartyMenu.exitCallback = CB2_ReturnToField; SetUsedFieldMoveQuestLogEvent(&gPlayerParty[GetCursorSelectionMonId()], fieldMove); Task_ClosePartyMenu(taskId); break; } } // Cant use Field Move else { switch (fieldMove) { case FIELD_MOVE_SURF: DisplayCantUseSurfMessage(); break; case FIELD_MOVE_FLASH: DisplayCantUseFlashMessage(); break; default: DisplayPartyMenuStdMessage(sFieldMoveCursorCallbacks[fieldMove].msgId); break; } gTasks[taskId].func = Task_CancelAfterAorBPress; } } } static void DisplayFieldMoveExitAreaMessage(u8 taskId) { DisplayPartyMenuMessage(gStringVar4, TRUE); gTasks[taskId].func = Task_FieldMoveExitAreaYesNo; } static void Task_FieldMoveExitAreaYesNo(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PartyMenuDisplayYesNoMenu(); gTasks[taskId].func = Task_HandleFieldMoveExitAreaYesNoInput; } } static void Task_HandleFieldMoveExitAreaYesNoInput(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // Yes gPartyMenu.exitCallback = CB2_ReturnToField; SetUsedFieldMoveQuestLogEvent(&gPlayerParty[GetCursorSelectionMonId()], sPartyMenuInternal->data[0]); Task_ClosePartyMenu(taskId); break; case MENU_B_PRESSED: PlaySE(SE_SELECT); // fallthrough case 1: // No gFieldCallback2 = NULL; gPostMenuFieldCallback = NULL; Task_ReturnToChooseMonAfterText(taskId); break; } } bool8 FieldCallback_PrepareFadeInFromMenu(void) { FadeInFromBlack(); CreateTask(Task_FieldMoveWaitForFade, 8); return TRUE; } static void Task_FieldMoveWaitForFade(u8 taskId) { if (IsWeatherNotFadingIn() == TRUE) { gFieldEffectArguments[0] = GetFieldMoveMonSpecies(); gPostMenuFieldCallback(); DestroyTask(taskId); } } static u16 GetFieldMoveMonSpecies(void) { return GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); } static void Task_CancelAfterAorBPress(u8 taskId) { if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) CursorCB_Cancel1(taskId); } static void DisplayCantUseFlashMessage(void) { if (FlagGet(FLAG_SYS_FLASH_ACTIVE) == TRUE) DisplayPartyMenuStdMessage(PARTY_MSG_ALREADY_IN_USE); else DisplayPartyMenuStdMessage(PARTY_MSG_CANT_USE_HERE); } static void FieldCallback_Surf(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); FieldEffectStart(FLDEFF_USE_SURF); } static bool8 SetUpFieldMove_Surf(void) { s16 x, y; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); if (MetatileBehavior_IsFastWater(MapGridGetMetatileBehaviorAt(x, y)) != TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_Surf; return TRUE; } return FALSE; } static void DisplayCantUseSurfMessage(void) { s16 x, y; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) { DisplayPartyMenuStdMessage(PARTY_MSG_ALREADY_SURFING); } else { GetXYCoordsOneStepInFrontOfPlayer(&x, &y); if (MetatileBehavior_IsFastWater(MapGridGetMetatileBehaviorAt(x, y)) == TRUE) DisplayPartyMenuStdMessage(PARTY_MSG_CURRENT_TOO_FAST); else if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE17)) && ((gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE17)) || (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE18)))) DisplayPartyMenuStdMessage(PARTY_MSG_ENJOY_CYCLING); else DisplayPartyMenuStdMessage(PARTY_MSG_CANT_SURF_HERE); } } static bool8 SetUpFieldMove_Fly(void) { if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) return TRUE; else return FALSE; } void CB2_ReturnToPartyMenuFromFlyMap(void) { InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, TRUE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_ReturnToFieldWithOpenMenu); } static void FieldCallback_Waterfall(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); FieldEffectStart(FLDEFF_USE_WATERFALL); } static bool8 SetUpFieldMove_Waterfall(void) { s16 x, y; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE && IsPlayerSurfingNorth() == TRUE) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_Waterfall; return TRUE; } return FALSE; } static void SetSwappedHeldItemQuestLogEvent(struct Pokemon *mon, u16 item, u16 item2) { struct QuestLogEvent_SwappedHeldItem *data = Alloc(sizeof(*data)); data->species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); data->takenItemId = item; data->givenItemId = item2; if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM) SetQuestLogEvent(QL_EVENT_SWAPPED_HELD_ITEM_PC, (void *)data); else SetQuestLogEvent(QL_EVENT_SWAPPED_HELD_ITEM, (void *)data); Free(data); } static void SetUsedFieldMoveQuestLogEvent(struct Pokemon *mon, u8 fieldMove) { struct QuestLogEvent_FieldMove *data = Alloc(sizeof(*data)); data->species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); data->fieldMove = fieldMove; switch (data->fieldMove) { case FIELD_MOVE_TELEPORT: data->mapSec = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum)->regionMapSectionId; break; case FIELD_MOVE_DIG: data->mapSec = gMapHeader.regionMapSectionId; break; default: data->mapSec = 0xFF; } SetQuestLogEvent(QL_EVENT_USED_FIELD_MOVE, (const u16 *)data); Free(data); } void SetUsedFlyQuestLogEvent(const u8 *healLocCtrlData) { const struct MapHeader *mapHeader; struct QuestLogEvent_FieldMove *data; struct { s8 group; s8 num; u32 unused; } *map = Alloc(sizeof(*map)); map->group = healLocCtrlData[0]; map->num = healLocCtrlData[1]; mapHeader = Overworld_GetMapHeaderByGroupAndId(map->group, map->num); Free(map); data = Alloc(sizeof(*data)); data->species = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_SPECIES_OR_EGG); data->fieldMove = FIELD_MOVE_FLY; data->mapSec = mapHeader->regionMapSectionId; SetQuestLogEvent(QL_EVENT_USED_FIELD_MOVE, (const u16 *)data); Free(data); } void CB2_ShowPartyMenuForItemUse(void) { MainCallback callback = CB2_ReturnToBagMenu; u8 partyLayout; u8 menuType; u32 i; u8 msgId; TaskFunc task; if (gMain.inBattle) { menuType = PARTY_MENU_TYPE_IN_BATTLE; partyLayout = GetPartyLayoutFromBattleType(); } else { menuType = PARTY_MENU_TYPE_FIELD; partyLayout = PARTY_LAYOUT_SINGLE; } if (GetItemEffectType(gSpecialVar_ItemId) == ITEM_EFFECT_SACRED_ASH) { gPartyMenu.slotId = 0; for (i = 0; i < PARTY_SIZE; ++i) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) { gPartyMenu.slotId = i; break; } } if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH) callback = CB2_ReturnToBerryPouchMenu; task = Task_SetSacredAshCB; msgId = PARTY_MSG_NONE; } else { switch (GetPocketByItemId(gSpecialVar_ItemId)) { default: msgId = PARTY_MSG_USE_ON_WHICH_MON; break; case POCKET_TM_CASE: msgId = PARTY_MSG_TEACH_WHICH_MON; callback = CB2_ReturnToTMCaseMenu; break; case POCKET_BERRY_POUCH: msgId = PARTY_MSG_USE_ON_WHICH_MON; callback = CB2_ReturnToBerryPouchMenu; break; } task = Task_HandleChooseMonInput; } InitPartyMenu(menuType, partyLayout, PARTY_ACTION_USE_ITEM, TRUE, msgId, task, callback); } static void CB2_ReturnToBagMenu(void) { GoToBagMenu(ITEMMENULOCATION_LAST, OPEN_BAG_LAST, NULL); } static void CB2_ReturnToTMCaseMenu(void) { InitTMCase(TMCASE_REOPENING, NULL, TMCASE_KEEP_PREV); } static void CB2_ReturnToBerryPouchMenu(void) { InitBerryPouch(BERRYPOUCH_NA, NULL, 0xFF); } static void Task_DoUseItemAnim(u8 taskId) { sPartyMenuInternal->exitCallback = CB2_DoUseItemAnim; Task_ClosePartyMenu(taskId); } static void CB2_DoUseItemAnim(void) { if (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId) == 2) // Evolution stone { if (MonCanEvolve() == TRUE) StartUseItemAnim_Normal(gPartyMenu.slotId, gSpecialVar_ItemId, CB2_UseEvolutionStone); else StartUseItemAnim_CantEvolve(gPartyMenu.slotId, gSpecialVar_ItemId, gPartyMenu.exitCallback); } else StartUseItemAnim_Normal(gPartyMenu.slotId, gSpecialVar_ItemId, CB2_UseItem); } static void CB2_UseItem(void) { if (ItemId_GetPocket(gSpecialVar_ItemId) == POCKET_TM_CASE && PSA_IsCancelDisabled() == TRUE) { GiveMoveToMon(&gPlayerParty[gPartyMenu.slotId], ItemIdToBattleMoveId(gSpecialVar_ItemId)); AdjustFriendship(&gPlayerParty[gPartyMenu.slotId], FRIENDSHIP_EVENT_LEARN_TMHM); SetMainCallback2(gPartyMenu.exitCallback); } else InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, PARTY_ACTION_CHOOSE_MON, gPartyMenu.slotId, PARTY_MSG_NONE, Task_SetSacredAshCB, gPartyMenu.exitCallback); } static void CB2_UseTMHMAfterForgettingMove(void) { if (PSA_IsCancelDisabled() == TRUE) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u8 moveIdx = GetMoveSlotToReplace(); u16 move = GetMonData(mon, moveIdx + MON_DATA_MOVE1); u8 oldpp = GetMonData(mon, moveIdx + MON_DATA_PP1); RemoveMonPPBonus(mon, moveIdx); SetMonMoveSlot(mon, ItemIdToBattleMoveId(gSpecialVar_ItemId), moveIdx); if(oldpp < gBattleMoves[ItemIdToBattleMoveId(gSpecialVar_ItemId)].pp) { //if TM used, don't restore PP SetMonData(mon, MON_DATA_PP1 + moveIdx, &oldpp); } AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, move); SetMainCallback2(gPartyMenu.exitCallback); } else InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, gPartyMenu.slotId, PARTY_MSG_NONE, Task_SetSacredAshCB, gPartyMenu.exitCallback); } static void Task_SetSacredAshCB(u8 taskId) { if (!gPaletteFade.active) { if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE) sPartyMenuInternal->exitCallback = CB2_SetUpExitToBattleScreen; gItemUseCB(taskId, Task_ClosePartyMenuAfterText); // ItemUseCB_SacredAsh in this case } } static bool8 IsHPRecoveryItem(u16 item) { const u8 *effect; if (item == ITEM_ENIGMA_BERRY) effect = gSaveBlock1Ptr->enigmaBerry.itemEffect; else effect = gItemEffectTable[item - ITEM_POTION]; if (effect[4] & ITEM4_HEAL_HP) return TRUE; else return FALSE; } static void GetMedicineItemEffectMessage(u16 item) { switch (GetItemEffectType(item)) { case ITEM_EFFECT_CURE_POISON: StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfPoison); break; case ITEM_EFFECT_CURE_SLEEP: StringExpandPlaceholders(gStringVar4, gText_PkmnWokeUp2); break; case ITEM_EFFECT_CURE_BURN: StringExpandPlaceholders(gStringVar4, gText_PkmnBurnHealed); break; case ITEM_EFFECT_CURE_FREEZE: StringExpandPlaceholders(gStringVar4, gText_PkmnThawedOut); break; case ITEM_EFFECT_CURE_PARALYSIS: StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfParalysis); break; case ITEM_EFFECT_CURE_CONFUSION: StringExpandPlaceholders(gStringVar4, gText_PkmnSnappedOutOfConfusion); break; case ITEM_EFFECT_CURE_INFATUATION: StringExpandPlaceholders(gStringVar4, gText_PkmnGotOverInfatuation); break; case ITEM_EFFECT_CURE_ALL_STATUS: StringExpandPlaceholders(gStringVar4, gText_PkmnBecameHealthy); break; case ITEM_EFFECT_HP_EV: StringCopy(gStringVar2, gText_ItemEffect_HP); StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); break; case ITEM_EFFECT_ATK_EV: StringCopy(gStringVar2, gText_ItemEffect_Attack); StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); break; case ITEM_EFFECT_DEF_EV: StringCopy(gStringVar2, gText_ItemEffect_Defense); StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); break; case ITEM_EFFECT_SPEED_EV: StringCopy(gStringVar2, gText_ItemEffect_Speed); StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); break; case ITEM_EFFECT_SPATK_EV: StringCopy(gStringVar2, gText_ItemEffect_SpAtk); StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); break; case ITEM_EFFECT_SPDEF_EV: StringCopy(gStringVar2, gText_ItemEffect_SpDef); StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); break; case ITEM_EFFECT_PP_UP: case ITEM_EFFECT_PP_MAX: StringExpandPlaceholders(gStringVar4, gText_MovesPPIncreased); break; case ITEM_EFFECT_HEAL_PP: StringExpandPlaceholders(gStringVar4, gText_PPWasRestored); break; default: StringExpandPlaceholders(gStringVar4, gText_WontHaveEffect); break; } } static bool8 NotUsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item) { if (GetItemEffectType(item) == ITEM_EFFECT_HP_EV && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_SHEDINJA) return FALSE; return TRUE; } static bool8 IsItemFlute(u16 item) { if (item == ITEM_BLUE_FLUTE || item == ITEM_RED_FLUTE || item == ITEM_YELLOW_FLUTE) return TRUE; return FALSE; } static bool8 ExecuteTableBasedItemEffect_(u8 partyMonIndex, u16 item, u8 monMoveIndex) { if (gMain.inBattle) return ExecuteTableBasedItemEffect(&gPlayerParty[partyMonIndex], item, GetPartyIdFromBattleSlot(partyMonIndex), monMoveIndex); else return ExecuteTableBasedItemEffect(&gPlayerParty[partyMonIndex], item, partyMonIndex, monMoveIndex); } void ItemUseCB_Medicine(u8 taskId, TaskFunc func) { u16 hp; struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 item = gSpecialVar_ItemId; bool8 canHeal; if (!NotUsingHPEVItemOnShedinja(mon, item)) { canHeal = TRUE; } else { if (IsHPRecoveryItem(item) == TRUE) { hp = GetMonData(mon, MON_DATA_HP); if (hp == GetMonData(mon, MON_DATA_MAX_HP)) canHeal = FALSE; } canHeal = PokemonItemUseNoEffect(mon, item, gPartyMenu.slotId, 0); } PlaySE(SE_SELECT); if (canHeal) { gPartyMenuUseExitCallback = FALSE; DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = func; } else { ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, item, 0xFFFF); Task_DoUseItemAnim(taskId); gItemUseCB = ItemUseCB_MedicineStep; } } void ItemUseCB_MedicineStep(u8 taskId, TaskFunc func) { u16 hp = 0; struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 item = gSpecialVar_ItemId; bool8 canHeal; bool8 cannotHeal; if (NotUsingHPEVItemOnShedinja(mon, item) == FALSE) cannotHeal = TRUE; else { canHeal = IsHPRecoveryItem(item); if (canHeal == TRUE) { hp = GetMonData(mon, MON_DATA_HP); if (hp == GetMonData(mon, MON_DATA_MAX_HP)) canHeal = FALSE; } cannotHeal = ExecuteTableBasedItemEffect_(gPartyMenu.slotId, item, 0); } if (cannotHeal != FALSE) { gPartyMenuUseExitCallback = FALSE; PlaySE(SE_SELECT); DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = func; } else { gPartyMenuUseExitCallback = TRUE; if (!IsItemFlute(item)) { PlaySE(SE_USE_ITEM); if (gPartyMenu.action != PARTY_ACTION_REUSABLE_ITEM) RemoveBagItem(item, 1); } else PlaySE(SE_GLASS_FLUTE); SetPartyMonAilmentGfx(mon, &sPartyMenuBoxes[gPartyMenu.slotId]); if (gSprites[sPartyMenuBoxes[gPartyMenu.slotId].statusSpriteId].invisible) DisplayPartyPokemonLevelCheck(mon, &sPartyMenuBoxes[gPartyMenu.slotId], 1); if (canHeal == TRUE) { if (hp == 0) AnimatePartySlot(gPartyMenu.slotId, 1); PartyMenuModifyHP(taskId, gPartyMenu.slotId, 1, GetMonData(mon, MON_DATA_HP) - hp, Task_DisplayHPRestoredMessage); ResetHPTaskData(taskId, 0, hp); } else { GetMonNickname(mon, gStringVar1); GetMedicineItemEffectMessage(item); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = func; } } } static void Task_DisplayHPRestoredMessage(u8 taskId) { GetMonNickname(&gPlayerParty[gPartyMenu.slotId], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2); DisplayPartyMenuMessage(gStringVar4, FALSE); ScheduleBgCopyTilemapToVram(2); HandleBattleLowHpMusicChange(); gTasks[taskId].func = Task_ClosePartyMenuAfterText; } static void Task_ClosePartyMenuAfterText(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { if (gPartyMenuUseExitCallback == FALSE) sPartyMenuInternal->exitCallback = NULL; Task_ClosePartyMenu(taskId); } } static void ShowMoveSelectWindow(u8 slot) { u32 i; u8 moveCount = 0; u8 fontId = FONT_NORMAL; u8 windowId = DisplaySelectionWindow(SELECTWINDOW_MOVES); u16 move; for (i = 0; i < MAX_MON_MOVES; ++i) { move = GetMonData(&gPlayerParty[slot], MON_DATA_MOVE1 + i); AddTextPrinterParameterized(windowId, fontId, gMoveNames[move], GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH) + GetFontAttribute(fontId, FONTATTR_LETTER_SPACING), (i * 16) + 2, TEXT_SKIP_DRAW, NULL); if (move != MOVE_NONE) ++moveCount; } Menu_InitCursor(windowId, fontId, 0, 2, 16, moveCount, FALSE); ScheduleBgCopyTilemapToVram(2); } static void Task_HandleRestoreWhichMoveInput(u8 taskId) { s8 input = Menu_ProcessInput(); if (input != MENU_NOTHING_CHOSEN) { if (input == MENU_B_PRESSED) { PlaySE(SE_SELECT); ReturnToUseOnWhichMon(taskId); } else SetSelectedMoveForPPItem(taskId); } } #define ppMoveSlot data[0] void ItemUseCB_TryRestorePP(u8 taskId, TaskFunc func) { const u8 *effect; u16 item = gSpecialVar_ItemId; if (item == ITEM_ENIGMA_BERRY) effect = gSaveBlock1Ptr->enigmaBerry.itemEffect; else effect = gItemEffectTable[item - ITEM_POTION]; if (!(effect[4] & ITEM4_HEAL_PP_ONE)) { gPartyMenu.ppMoveSlot = 0; if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE) TryUsePPItemInBattle(taskId); else TryUsePPItemOutsideBattle(taskId); } else { PlaySE(SE_SELECT); DisplayPartyMenuStdMessage(PARTY_MSG_RESTORE_WHICH_MOVE); ShowMoveSelectWindow(gPartyMenu.slotId); gTasks[taskId].func = Task_HandleRestoreWhichMoveInput; } } static void SetSelectedMoveForPPItem(u8 taskId) { PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); gPartyMenu.ppMoveSlot = Menu_GetCursorPos(); if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE) TryUsePPItemInBattle(taskId); else TryUsePPItemOutsideBattle(taskId); } static void ReturnToUseOnWhichMon(u8 taskId) { gTasks[taskId].func = Task_HandleChooseMonInput; sPartyMenuInternal->exitCallback = NULL; PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); DisplayPartyMenuStdMessage(PARTY_MSG_USE_ON_WHICH_MON); } static void TryUsePPItemOutsideBattle(u8 taskId) { bool8 noEffect = PokemonItemUseNoEffect(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId, gPartyMenu.slotId, gPartyMenu.ppMoveSlot); PlaySE(SE_SELECT); if (noEffect) { gPartyMenuUseExitCallback = FALSE; DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_ClosePartyMenuAfterText; } else { Task_DoUseItemAnim(taskId); gItemUseCB = ItemUseCB_RestorePP; } } static void ItemUseCB_RestorePP(u8 taskId, TaskFunc func) { u16 move; struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, (u8)gPartyMenu.ppMoveSlot); gPartyMenuUseExitCallback = TRUE; ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, 0xFFFF); PlaySE(SE_USE_ITEM); RemoveBagItem(gSpecialVar_ItemId, 1); move = GetMonData(mon, gPartyMenu.ppMoveSlot + MON_DATA_MOVE1); StringCopy(gStringVar1, gMoveNames[move]); GetMedicineItemEffectMessage(gSpecialVar_ItemId); DisplayPartyMenuMessage(gStringVar4, 1); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_ClosePartyMenuAfterText; } static void TryUsePPItemInBattle(u8 taskId) { u16 move = MOVE_NONE; s16 *moveSlot = &gPartyMenu.ppMoveSlot; u16 item = gSpecialVar_ItemId; struct PartyMenu *ptr = &gPartyMenu; struct Pokemon *mon; if (ExecuteTableBasedItemEffect_(ptr->slotId, item, *moveSlot)) { gPartyMenuUseExitCallback = FALSE; PlaySE(SE_SELECT); DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_ClosePartyMenuAfterText; } else { gPartyMenuUseExitCallback = TRUE; mon = &gPlayerParty[ptr->slotId]; ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, item, 0xFFFF); PlaySE(SE_USE_ITEM); RemoveBagItem(item, 1); move = GetMonData(mon, MON_DATA_MOVE1 + *moveSlot); StringCopy(gStringVar1, gMoveNames[move]); GetMedicineItemEffectMessage(item); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_ClosePartyMenuAfterText; } } #undef ppMoveSlot void ItemUseCB_PPUp(u8 taskId, TaskFunc func) { PlaySE(SE_SELECT); DisplayPartyMenuStdMessage(PARTY_MSG_BOOST_PP_WHICH_MOVE); ShowMoveSelectWindow(gPartyMenu.slotId); gTasks[taskId].func = Task_HandleRestoreWhichMoveInput; } u16 ItemIdToBattleMoveId(u16 item) { u16 tmNumber = item - ITEM_TM01_FOCUS_PUNCH; return sTMHMMoves[tmNumber]; } bool8 IsMoveHm(u16 move) { u32 i; for (i = 0; i < NUM_HIDDEN_MACHINES; ++i) if (sTMHMMoves[i + NUM_TECHNICAL_MACHINES] == move) return TRUE; return FALSE; } bool8 MonKnowsMove(struct Pokemon *mon, u16 move) { u32 i; for (i = 0; i < MAX_MON_MOVES; ++i) { if (GetMonData(mon, MON_DATA_MOVE1 + i) == move) return TRUE; } return FALSE; } static void DisplayLearnMoveMessage(const u8 *str) { StringExpandPlaceholders(gStringVar4, str); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); } static void DisplayLearnMoveMessageAndClose(u8 taskId, const u8 *str) { DisplayLearnMoveMessage(str); gTasks[taskId].func = Task_ClosePartyMenuAfterText; } #define learnMoveId data[0] #define learnMoveMethod data[1] void ItemUseCB_TMHM(u8 taskId, TaskFunc func) { struct Pokemon *mon; s16 *data; u16 item; PlaySE(SE_SELECT); mon = &gPlayerParty[gPartyMenu.slotId]; data = gPartyMenu.data; item = gSpecialVar_ItemId; GetMonNickname(mon, gStringVar1); learnMoveId = ItemIdToBattleMoveId(item); StringCopy(gStringVar2, gMoveNames[learnMoveId]); learnMoveMethod = LEARN_VIA_TMHM; switch (CanMonLearnTMTutor(mon, item, 0)) { case CANNOT_LEARN_MOVE: DisplayLearnMoveMessageAndClose(taskId, gText_PkmnCantLearnMove); return; case ALREADY_KNOWS_MOVE: DisplayLearnMoveMessageAndClose(taskId, gText_PkmnAlreadyKnows); return; } if (GiveMoveToMon(mon, learnMoveId) != MON_HAS_MAX_MOVES) { ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, item, 0xFFFF); Task_DoUseItemAnim(taskId); gItemUseCB = ItemUseCB_LearnedMove; } else { DisplayLearnMoveMessage(gText_PkmnNeedsToReplaceMove); gTasks[taskId].func = Task_ReplaceMoveYesNo; } } static void ItemUseCB_LearnedMove(u8 taskId, TaskFunc func) { Task_LearnedMove(taskId); } static void Task_LearnedMove(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; s16 *data = gPartyMenu.data; u16 item = gSpecialVar_ItemId; if (learnMoveMethod == LEARN_VIA_TMHM) { AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM); } GetMonNickname(mon, gStringVar1); StringCopy(gStringVar2, gMoveNames[learnMoveId]); StringExpandPlaceholders(gStringVar4, gText_PkmnLearnedMove3); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_DoLearnedMoveFanfareAfterText; } static void Task_DoLearnedMoveFanfareAfterText(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PlayFanfare(MUS_LEVEL_UP); gTasks[taskId].func = Task_LearnNextMoveOrClosePartyMenu; } } static void Task_LearnNextMoveOrClosePartyMenu(u8 taskId) { if (IsFanfareTaskInactive() && ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))) { if (gPartyMenu.learnMoveMethod == LEARN_VIA_LEVEL_UP) Task_TryLearningNextMove(taskId); else { if (gPartyMenu.learnMoveMethod == LEARN_VIA_TUTOR) gSpecialVar_Result = TRUE; Task_ClosePartyMenu(taskId); } } } static void Task_ReplaceMoveYesNo(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PartyMenuDisplayYesNoMenu(); gTasks[taskId].func = Task_HandleReplaceMoveYesNoInput; } } static void Task_HandleReplaceMoveYesNoInput(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // Yes DisplayPartyMenuMessage(gText_WhichMoveToForget, TRUE); gTasks[taskId].func = Task_ShowSummaryScreenToForgetMove; break; case MENU_B_PRESSED: PlaySE(SE_SELECT); // fallthrough case 1: // No StopLearningMovePrompt(taskId); break; } } static void Task_ShowSummaryScreenToForgetMove(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { sPartyMenuInternal->exitCallback = CB2_ShowSummaryScreenToForgetMove; Task_ClosePartyMenu(taskId); } } static void CB2_ShowSummaryScreenToForgetMove(void) { ShowSelectMovePokemonSummaryScreen(gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuWhileLearningMove, gPartyMenu.learnMoveId); } static void CB2_ReturnToPartyMenuWhileLearningMove(void) { u8 moveIdx = GetMoveSlotToReplace(); u16 move; s32 learnMethod = gPartyMenu.learnMoveMethod; if (learnMethod == LEARN_VIA_TMHM && moveIdx != MAX_MON_MOVES) { move = GetMonData(&gPlayerParty[gPartyMenu.slotId], moveIdx + MON_DATA_MOVE1); StartUseItemAnim_ForgetMoveAndLearnTMorHM(gPartyMenu.slotId, gSpecialVar_ItemId, move, CB2_UseTMHMAfterForgettingMove); gItemUseCB = ItemUseCB_ReplaceMoveWithTMHM; gPartyMenu.action = PARTY_ACTION_CHOOSE_MON; } else InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, TRUE, PARTY_MSG_NONE, Task_ReturnToPartyMenuWhileLearningMove, gPartyMenu.exitCallback); } static void Task_ReturnToPartyMenuWhileLearningMove(u8 taskId) { if (!gPaletteFade.active) { if (GetMoveSlotToReplace() != MAX_MON_MOVES) DisplayPartyMenuForgotMoveMessage(taskId); else StopLearningMovePrompt(taskId); } } static void ItemUseCB_ReplaceMoveWithTMHM(u8 taskId, TaskFunc func) { Task_ReplaceMoveWithTMHM(taskId); } static void Task_ReplaceMoveWithTMHM(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u8 moveIdx = GetMoveSlotToReplace(); u16 move = GetMonData(mon, moveIdx + MON_DATA_MOVE1); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, move); GetMonNickname(mon, gStringVar1); StringCopy(gStringVar2, gMoveNames[move]); RemoveMonPPBonus(mon, moveIdx); SetMonMoveSlot(mon, gPartyMenu.learnMoveId, moveIdx); Task_LearnedMove(taskId); } static void DisplayPartyMenuForgotMoveMessage(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 move = GetMonData(mon, MON_DATA_MOVE1 + GetMoveSlotToReplace()); GetMonNickname(mon, gStringVar1); StringCopy(gStringVar2, gMoveNames[move]); DisplayLearnMoveMessage(gText_12PoofForgotMove); gTasks[taskId].func = Task_PartyMenuReplaceMove; } static void Task_PartyMenuReplaceMove(u8 taskId) { struct Pokemon *mon; u16 move; if (IsPartyMenuTextPrinterActive() != TRUE) { mon = &gPlayerParty[gPartyMenu.slotId]; RemoveMonPPBonus(mon, GetMoveSlotToReplace()); move = gPartyMenu.learnMoveId; SetMonMoveSlot(mon, move, GetMoveSlotToReplace()); Task_LearnedMove(taskId); } } static void StopLearningMovePrompt(u8 taskId) { StringCopy(gStringVar2, gMoveNames[gPartyMenu.learnMoveId]); StringExpandPlaceholders(gStringVar4, gText_StopLearningMove2); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_StopLearningMoveYesNo; } static void Task_StopLearningMoveYesNo(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PartyMenuDisplayYesNoMenu(); gTasks[taskId].func = Task_HandleStopLearningMoveYesNoInput; } } static void Task_HandleStopLearningMoveYesNoInput(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // Yes GetMonNickname(mon, gStringVar1); StringCopy(gStringVar2, gMoveNames[gPartyMenu.learnMoveId]); StringExpandPlaceholders(gStringVar4, gText_MoveNotLearned); DisplayPartyMenuMessage(gStringVar4, TRUE); if (gPartyMenu.learnMoveMethod == LEARN_VIA_LEVEL_UP) { gTasks[taskId].func = Task_TryLearningNextMoveAfterText; } else { if (gPartyMenu.learnMoveMethod == LEARN_VIA_TUTOR) gSpecialVar_Result = FALSE; gTasks[taskId].func = Task_ClosePartyMenuAfterText; } break; case MENU_B_PRESSED: PlaySE(SE_SELECT); // fallthrough case 1: // No GetMonNickname(mon, gStringVar1); StringCopy(gStringVar2, gMoveNames[gPartyMenu.learnMoveId]); DisplayLearnMoveMessage(gText_PkmnNeedsToReplaceMove); gTasks[taskId].func = Task_ReplaceMoveYesNo; break; } } static void Task_TryLearningNextMoveAfterText(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) Task_TryLearningNextMove(taskId); } void ItemUseCB_RareCandy(u8 taskId, TaskFunc func) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 item = gSpecialVar_ItemId; bool8 noEffect; if (GetMonData(mon, MON_DATA_LEVEL) != MAX_LEVEL) noEffect = PokemonItemUseNoEffect(mon, item, gPartyMenu.slotId, 0); else noEffect = TRUE; PlaySE(SE_SELECT); if (noEffect) { gPartyMenuUseExitCallback = FALSE; DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = func; } else { Task_DoUseItemAnim(taskId); gItemUseCB = ItemUseCB_RareCandyStep; } } static void ItemUseCB_RareCandyStep(u8 taskId, TaskFunc func) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; struct PartyMenuInternal *ptr = sPartyMenuInternal; s16 *arrayPtr = ptr->data; u8 level; GetMonLevelUpWindowStats(mon, arrayPtr); ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, 0); GetMonLevelUpWindowStats(mon, &ptr->data[NUM_STATS]); gPartyMenuUseExitCallback = TRUE; ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, 0xFFFF); PlayFanfareByFanfareNum(FANFARE_LEVEL_UP); UpdateMonDisplayInfoAfterRareCandy(gPartyMenu.slotId, mon); RemoveBagItem(gSpecialVar_ItemId, 1); GetMonNickname(mon, gStringVar1); level = GetMonData(mon, MON_DATA_LEVEL); ConvertIntToDecimalStringN(gStringVar2, level, STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_PkmnElevatedToLvVar2); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_DisplayLevelUpStatsPg1; } static void UpdateMonDisplayInfoAfterRareCandy(u8 slot, struct Pokemon *mon) { SetPartyMonAilmentGfx(mon, &sPartyMenuBoxes[slot]); if (gSprites[sPartyMenuBoxes[slot].statusSpriteId].invisible) DisplayPartyPokemonLevelCheck(mon, &sPartyMenuBoxes[slot], DRAW_MENU_BOX_AND_TEXT); DisplayPartyPokemonHPCheck(mon, &sPartyMenuBoxes[slot], DRAW_MENU_BOX_AND_TEXT); DisplayPartyPokemonMaxHPCheck(mon, &sPartyMenuBoxes[slot], DRAW_MENU_BOX_AND_TEXT); DisplayPartyPokemonHPBarCheck(mon, &sPartyMenuBoxes[slot]); UpdatePartyMonHPBar(sPartyMenuBoxes[slot].monSpriteId, mon); AnimatePartySlot(slot, 1); ScheduleBgCopyTilemapToVram(0); } static void Task_DisplayLevelUpStatsPg1(u8 taskId) { if (WaitFanfare(FALSE) && IsPartyMenuTextPrinterActive() != TRUE && (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))) { PlaySE(SE_SELECT); DisplayLevelUpStatsPg1(taskId); gTasks[taskId].func = Task_DisplayLevelUpStatsPg2; } } static void Task_DisplayLevelUpStatsPg2(u8 taskId) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); DisplayLevelUpStatsPg2(taskId); gTasks[taskId].func = Task_TryLearnNewMoves; } } static void DisplayLevelUpStatsPg1(u8 taskId) { s16 *arrayPtr = sPartyMenuInternal->data; arrayPtr[12] = CreateLevelUpStatsWindow(); DrawLevelUpWindowPg1(arrayPtr[12], arrayPtr, &arrayPtr[6], TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(arrayPtr[12], COPYWIN_GFX); ScheduleBgCopyTilemapToVram(2); } static void DisplayLevelUpStatsPg2(u8 taskId) { s16 *arrayPtr = sPartyMenuInternal->data; DrawLevelUpWindowPg2(arrayPtr[12], &arrayPtr[6], TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(arrayPtr[12], COPYWIN_GFX); ScheduleBgCopyTilemapToVram(2); } static void Task_TryLearnNewMoves(u8 taskId) { u16 learnMove; if (WaitFanfare(FALSE) && (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))) { RemoveLevelUpStatsWindow(); learnMove = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], TRUE); gPartyMenu.learnMoveMethod = LEARN_VIA_LEVEL_UP; switch (learnMove) { case MOVE_NONE: // No moves to learn PartyMenuTryEvolution(taskId); break; case MON_HAS_MAX_MOVES: DisplayMonNeedsToReplaceMove(taskId); break; case MON_ALREADY_KNOWS_MOVE: gTasks[taskId].func = Task_TryLearningNextMove; break; default: DisplayMonLearnedMove(taskId, learnMove); break; } } } static void Task_TryLearningNextMove(u8 taskId) { u16 result = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], FALSE); switch (result) { case MOVE_NONE: // No moves to learn PartyMenuTryEvolution(taskId); break; case MON_HAS_MAX_MOVES: DisplayMonNeedsToReplaceMove(taskId); break; case MON_ALREADY_KNOWS_MOVE: return; default: DisplayMonLearnedMove(taskId, result); break; } } static void PartyMenuTryEvolution(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_NORMAL, ITEM_NONE); if (targetSpecies != SPECIES_NONE) { FreePartyPointers(); gCB2_AfterEvolution = gPartyMenu.exitCallback; BeginEvolutionScene(mon, targetSpecies, TRUE, gPartyMenu.slotId); DestroyTask(taskId); } else gTasks[taskId].func = Task_ClosePartyMenuAfterText; } static void DisplayMonNeedsToReplaceMove(u8 taskId) { GetMonNickname(&gPlayerParty[gPartyMenu.slotId], gStringVar1); StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); StringExpandPlaceholders(gStringVar4, gText_PkmnNeedsToReplaceMove); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); gPartyMenu.learnMoveId = gMoveToLearn; gTasks[taskId].func = Task_ReplaceMoveYesNo; } static void DisplayMonLearnedMove(u8 taskId, u16 move) { GetMonNickname(&gPlayerParty[gPartyMenu.slotId], gStringVar1); StringCopy(gStringVar2, gMoveNames[move]); StringExpandPlaceholders(gStringVar4, gText_PkmnLearnedMove3); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); gPartyMenu.learnMoveId = move; gTasks[taskId].func = Task_DoLearnedMoveFanfareAfterText; } #define tUsedOnSlot data[0] #define tHadEffect data[1] #define tLastSlotUsed data[2] void ItemUseCB_SacredAsh(u8 taskId, TaskFunc func) { if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { //Sacred Ash always fails in Nuzlocke mode gPartyMenuUseExitCallback = FALSE; DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_ClosePartyMenuAfterText; gPartyMenu.slotId = 0; return; } sPartyMenuInternal->tUsedOnSlot = FALSE; sPartyMenuInternal->tHadEffect = FALSE; sPartyMenuInternal->tLastSlotUsed = gPartyMenu.slotId; UseSacredAsh(taskId); } static void UseSacredAsh(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 hp; if (GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NONE) { gTasks[taskId].func = Task_SacredAshLoop; return; } hp = GetMonData(mon, MON_DATA_HP); if (ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, 0)) { gTasks[taskId].func = Task_SacredAshLoop; return; } PlaySE(SE_USE_ITEM); if (sPartyMenuInternal->tHadEffect == 0) sSacredAshQuestLogMonBackup = mon; SetPartyMonAilmentGfx(mon, &sPartyMenuBoxes[gPartyMenu.slotId]); if (gSprites[sPartyMenuBoxes[gPartyMenu.slotId].statusSpriteId].invisible) DisplayPartyPokemonLevelCheck(mon, &sPartyMenuBoxes[gPartyMenu.slotId], DRAW_MENU_BOX_AND_TEXT); AnimatePartySlot(sPartyMenuInternal->tLastSlotUsed, 0); AnimatePartySlot(gPartyMenu.slotId, 1); PartyMenuModifyHP(taskId, gPartyMenu.slotId, 1, GetMonData(mon, MON_DATA_HP) - hp, Task_SacredAshDisplayHPRestored); ResetHPTaskData(taskId, 0, hp); sPartyMenuInternal->tUsedOnSlot = TRUE; sPartyMenuInternal->tHadEffect = TRUE; } static void Task_SacredAshLoop(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { if (sPartyMenuInternal->tUsedOnSlot == TRUE) { sPartyMenuInternal->tUsedOnSlot = FALSE; sPartyMenuInternal->tLastSlotUsed = gPartyMenu.slotId; } if (++(gPartyMenu.slotId) == PARTY_SIZE) { if (sPartyMenuInternal->tHadEffect == FALSE) { gPartyMenuUseExitCallback = FALSE; DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); } else { gPartyMenuUseExitCallback = TRUE; if (gPartyMenu.menuType != PARTY_MENU_TYPE_IN_BATTLE) ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, sSacredAshQuestLogMonBackup, gSpecialVar_ItemId, 0xFFFF); RemoveBagItem(gSpecialVar_ItemId, 1); } gTasks[taskId].func = Task_ClosePartyMenuAfterText; gPartyMenu.slotId = 0; } else { UseSacredAsh(taskId); } } } static void Task_SacredAshDisplayHPRestored(u8 taskId) { GetMonNickname(&gPlayerParty[gPartyMenu.slotId], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2); DisplayPartyMenuMessage(gStringVar4, FALSE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_SacredAshLoop; } #undef tUsedOnSlot #undef tHadEffect #undef tLastSlotUsed void ItemUseCB_EvolutionStone(u8 taskId, TaskFunc func) { bool8 noEffect; PlaySE(SE_SELECT); noEffect = PokemonItemUseNoEffect(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId, gPartyMenu.slotId, 0); if (noEffect) { gPartyMenuUseExitCallback = FALSE; DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = func; } else Task_DoUseItemAnim(taskId); } static void CB2_UseEvolutionStone(void) { u16 species; gCB2_AfterEvolution = gPartyMenu.exitCallback; ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, 0); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, &gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId, 0xFFFF); if(gSpecialVar_ItemId != ITEM_LINK_BRACELET) RemoveBagItem(gSpecialVar_ItemId, 1); species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); if(species == SPECIES_SLOWPOKE || species == SPECIES_POLIWHIRL || species == SPECIES_ONIX || species == SPECIES_SEADRA || species == SPECIES_SCYTHER || species == SPECIES_PORYGON || species == SPECIES_CLAMPERL) { //just evolved by Link Bracelet, remove held item of trade+item mons u16 heldItem = 0; SetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_HELD_ITEM, &heldItem); } } static bool8 MonCanEvolve(void) { /* if (!IsNationalPokedexEnabled() && GetEvolutionTargetSpecies(&gPlayerParty[gPartyMenu.slotId], EVO_MODE_ITEM_USE, gSpecialVar_ItemId) > KANTO_DEX_COUNT) return FALSE; else*/ return TRUE; } u8 GetItemEffectType(u16 item) { const u8 *itemEffect; u32 statusCure; if (!IS_POKEMON_ITEM(item)) return ITEM_EFFECT_NONE; // Read the item's effect properties. if (item == ITEM_ENIGMA_BERRY) itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect; else itemEffect = gItemEffectTable[item - ITEM_POTION]; if ((itemEffect[0] & (ITEM0_DIRE_HIT | ITEM0_X_ATTACK)) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & ITEM3_GUARD_SPEC)) return ITEM_EFFECT_X_ITEM; else if (itemEffect[0] & ITEM0_SACRED_ASH) return ITEM_EFFECT_SACRED_ASH; else if (itemEffect[3] & ITEM3_LEVEL_UP) return ITEM_EFFECT_RAISE_LEVEL; statusCure = itemEffect[3] & ITEM3_STATUS_ALL; if (statusCure || (itemEffect[0] >> 7)) { if (statusCure == ITEM3_SLEEP) return ITEM_EFFECT_CURE_SLEEP; else if (statusCure == ITEM3_POISON) return ITEM_EFFECT_CURE_POISON; else if (statusCure == ITEM3_BURN) return ITEM_EFFECT_CURE_BURN; else if (statusCure == ITEM3_FREEZE) return ITEM_EFFECT_CURE_FREEZE; else if (statusCure == ITEM3_PARALYSIS) return ITEM_EFFECT_CURE_PARALYSIS; else if (statusCure == ITEM3_CONFUSION) return ITEM_EFFECT_CURE_CONFUSION; else if (itemEffect[0] >> 7 && !statusCure) return ITEM_EFFECT_CURE_INFATUATION; else return ITEM_EFFECT_CURE_ALL_STATUS; } if (itemEffect[4] & (ITEM4_REVIVE | ITEM4_HEAL_HP)) return ITEM_EFFECT_HEAL_HP; else if (itemEffect[4] & ITEM4_EV_ATK) return ITEM_EFFECT_ATK_EV; else if (itemEffect[4] & ITEM4_EV_HP) return ITEM_EFFECT_HP_EV; else if (itemEffect[5] & ITEM5_EV_SPATK) return ITEM_EFFECT_SPATK_EV; else if (itemEffect[5] & ITEM5_EV_SPDEF) return ITEM_EFFECT_SPDEF_EV; else if (itemEffect[5] & ITEM5_EV_SPEED) return ITEM_EFFECT_SPEED_EV; else if (itemEffect[5] & ITEM5_EV_DEF) return ITEM_EFFECT_DEF_EV; else if (itemEffect[4] & ITEM4_EVO_STONE) return ITEM_EFFECT_EVO_STONE; else if (itemEffect[4] & ITEM4_PP_UP) return ITEM_EFFECT_PP_UP; else if (itemEffect[5] & ITEM5_PP_MAX) return ITEM_EFFECT_PP_MAX; else if (itemEffect[4] & (ITEM4_HEAL_PP_ALL | ITEM4_HEAL_PP_ONE)) return ITEM_EFFECT_HEAL_PP; else return ITEM_EFFECT_NONE; } static void TryTutorSelectedMon(u8 taskId) { struct Pokemon *mon; s16 *data; if (!gPaletteFade.active) { mon = &gPlayerParty[gPartyMenu.slotId]; data = gPartyMenu.data; GetMonNickname(mon, gStringVar1); gPartyMenu.learnMoveId = GetTutorMove(gSpecialVar_0x8005); StringCopy(gStringVar2, gMoveNames[gPartyMenu.learnMoveId]); learnMoveMethod = LEARN_VIA_TUTOR; switch (CanMonLearnTMTutor(mon, 0, gSpecialVar_0x8005)) { case CANNOT_LEARN_MOVE: DisplayLearnMoveMessageAndClose(taskId, gText_PkmnCantLearnMove); return; case ALREADY_KNOWS_MOVE: DisplayLearnMoveMessageAndClose(taskId, gText_PkmnAlreadyKnows); return; default: if (GiveMoveToMon(mon, gPartyMenu.learnMoveId) != MON_HAS_MAX_MOVES) { Task_LearnedMove(taskId); return; } break; } DisplayLearnMoveMessage(gText_PkmnNeedsToReplaceMove); gTasks[taskId].func = Task_ReplaceMoveYesNo; } } #undef learnMoveId #undef learnMoveMethod void CB2_PartyMenuFromStartMenu(void) { InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_ReturnToFieldWithOpenMenu); } // Giving an item by selecting Give from the bag menu // As opposted to by selecting Give in the party menu, which is handled by CursorCB_Give void CB2_ChooseMonToGiveItem(void) { MainCallback callback; switch (GetPocketByItemId(gSpecialVar_ItemId)) { default: callback = CB2_ReturnToBagMenu; break; case POCKET_TM_CASE: callback = CB2_ReturnToTMCaseMenu; break; case POCKET_BERRY_POUCH: callback = CB2_ReturnToBerryPouchMenu; break; } InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_GIVE_ITEM, FALSE, PARTY_MSG_GIVE_TO_WHICH_MON, Task_HandleChooseMonInput, callback); gPartyMenu.bagItem = gSpecialVar_ItemId; } static void TryGiveItemOrMailToSelectedMon(u8 taskId) { sPartyMenuItemId = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_HELD_ITEM); if (sPartyMenuItemId == ITEM_NONE) { GiveItemOrMailToSelectedMon(taskId); } else if (ItemIsMail(sPartyMenuItemId)) { DisplayItemMustBeRemovedFirstMessage(taskId); } else { DisplayAlreadyHoldingItemSwitchMessage(&gPlayerParty[gPartyMenu.slotId], sPartyMenuItemId, TRUE); gTasks[taskId].func = Task_SwitchItemsFromBagYesNo; } } static void GiveItemOrMailToSelectedMon(u8 taskId) { if (ItemIsMail(gPartyMenu.bagItem)) { RemoveItemToGiveFromBag(gPartyMenu.bagItem); sPartyMenuInternal->exitCallback = CB2_WriteMailToGiveMonFromBag; Task_ClosePartyMenu(taskId); } else { GiveItemToSelectedMon(taskId); } } static void GiveItemToSelectedMon(u8 taskId) { u16 item; if (!gPaletteFade.active) { item = gPartyMenu.bagItem; DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], item, FALSE, TRUE); GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], item); RemoveItemToGiveFromBag(item); gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } } static void Task_UpdateHeldItemSpriteAndClosePartyMenu(u8 taskId) { s8 slot = gPartyMenu.slotId; if (IsPartyMenuTextPrinterActive() != TRUE) { UpdatePartyMonHeldItemSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot]); Task_ClosePartyMenu(taskId); } } static void CB2_WriteMailToGiveMonFromBag(void) { u8 mail; GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], gPartyMenu.bagItem); mail = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MAIL); DoEasyChatScreen(EASY_CHAT_TYPE_MAIL, gSaveBlock1Ptr->mail[mail].words, CB2_ReturnToPartyOrBagMenuFromWritingMail); } static void CB2_ReturnToPartyOrBagMenuFromWritingMail(void) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); // Canceled writing mail if (gSpecialVar_Result == FALSE) { TakeMailFromMon(mon); SetMonData(mon, MON_DATA_HELD_ITEM, &sPartyMenuItemId); RemoveBagItem(sPartyMenuItemId, 1); ReturnGiveItemToBagOrPC(item); SetMainCallback2(gPartyMenu.exitCallback); } // Wrote mail else { InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_NONE, Task_DisplayGaveMailFromBagMessage, gPartyMenu.exitCallback); } } static void Task_DisplayGaveMailFromBagMessage(u8 taskId) { if (!gPaletteFade.active) { if (sPartyMenuItemId != ITEM_NONE) DisplaySwitchedHeldItemMessage(gPartyMenu.bagItem, sPartyMenuItemId, FALSE); else DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], gPartyMenu.bagItem, FALSE, TRUE); gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } } static void Task_SwitchItemsFromBagYesNo(u8 taskId) { if (IsPartyMenuTextPrinterActive() != TRUE) { PartyMenuDisplayYesNoMenu(); gTasks[taskId].func = Task_HandleSwitchItemsFromBagYesNoInput; } } static void Task_HandleSwitchItemsFromBagYesNoInput(u8 taskId) { u16 item; switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // Yes, switch items item = gPartyMenu.bagItem; RemoveItemToGiveFromBag(item); if (AddBagItem(sPartyMenuItemId, 1) == FALSE) { ReturnGiveItemToBagOrPC(item); BufferBagFullCantTakeItemMessage(sPartyMenuItemId); DisplayPartyMenuMessage(gStringVar4, FALSE); gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } else if (ItemIsMail(item)) { sPartyMenuInternal->exitCallback = CB2_WriteMailToGiveMonFromBag; Task_ClosePartyMenu(taskId); } else { GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], item); DisplaySwitchedHeldItemMessage(item, sPartyMenuItemId, TRUE); gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } break; case MENU_B_PRESSED: PlaySE(SE_SELECT); // fallthrough case 1: // No, dont switch items gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; break; } } static void DisplayItemMustBeRemovedFirstMessage(u8 taskId) { DisplayPartyMenuMessage(gText_RemoveMailBeforeItem, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } static void RemoveItemToGiveFromBag(u16 item) { if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM) // Unused, never occurs RemovePCItem(item, 1); else RemoveBagItem(item, 1); } // Returns FALSE if there was no space to return the item // but there always should be, and the return is ignored in all uses static bool8 ReturnGiveItemToBagOrPC(u16 item) { if (gPartyMenu.action == PARTY_ACTION_GIVE_ITEM) return AddBagItem(item, 1); else return AddPCItem(item, 1); } void ChooseMonToGiveMailFromMailbox(void) { InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_GIVE_MAILBOX_MAIL, FALSE, PARTY_MSG_GIVE_TO_WHICH_MON, Task_HandleChooseMonInput, Mailbox_ReturnToMailListAfterDeposit); } static void TryGiveMailToSelectedMon(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; struct Mail *mail; gPartyMenuUseExitCallback = FALSE; mail = &gSaveBlock1Ptr->mail[gPlayerPcMenuManager.cursorPos + 6 + gPlayerPcMenuManager.itemsAbove]; if (GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE) { DisplayPartyMenuMessage(gText_PkmnHoldingItemCantHoldMail, TRUE); } else { GiveMailToMon2(mon, mail); ClearMailStruct(mail); DisplayPartyMenuMessage(gText_MailTransferredFromMailbox, TRUE); } ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } void InitChooseMonsForBattle(u8 chooseMonsBattleType) { ClearSelectedPartyOrder(); InitPartyMenu(PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, gMain.savedCallback); gPartyMenu.chooseMonsBattleType = chooseMonsBattleType; gPartyMenu.task = Task_ValidateChosenMonsForBattle; } void ClearSelectedPartyOrder(void) { memset(gSelectedOrderFromParty, 0, sizeof(gSelectedOrderFromParty)); } static u8 GetPartySlotEntryStatus(s8 slot) { if (GetBattleEntryEligibility(&gPlayerParty[slot]) == FALSE) return 2; // Not eligible else if (HasPartySlotAlreadyBeenSelected(slot + 1) == TRUE) return 1; // Already selected else return 0; // Eligible, not selected } static bool8 GetBattleEntryEligibility(struct Pokemon *mon) { u16 species; u16 i = 0; if (GetMonData(mon, MON_DATA_IS_EGG)) return FALSE; switch (gPartyMenu.chooseMonsBattleType) { default: if (GetMonData(mon, MON_DATA_LEVEL) > 30) return FALSE; break; case CHOOSE_MONS_FOR_CABLE_CLUB_BATTLE: if (GetMonData(mon, MON_DATA_HP) == 0) return FALSE; break; case CHOOSE_MONS_FOR_BATTLE_TOWER: if (gSaveBlock2Ptr->battleTower.battleTowerLevelType == 0 // level 50 && GetMonData(mon, MON_DATA_LEVEL) > 50) return FALSE; species = GetMonData(mon, MON_DATA_SPECIES); for (; gBattleTowerBannedSpecies[i] != 0xFFFF; ++i) if (gBattleTowerBannedSpecies[i] == species) return FALSE; break; } return TRUE; } static u8 CheckBattleEntriesAndGetMessage(void) { u8 i, j; struct Pokemon *party = gPlayerParty; u8 *order = gSelectedOrderFromParty; switch (gPartyMenu.chooseMonsBattleType) { case CHOOSE_MONS_FOR_BATTLE_TOWER: if (order[2] == 0) return PARTY_MSG_THREE_MONS_ARE_NEEDED; for (i = 0; i < 2; ++i) { sPartyMenuInternal->data[15] = GetMonData(&party[order[i] - 1], MON_DATA_SPECIES); sPartyMenuInternal->data[14] = GetMonData(&party[order[i] - 1], MON_DATA_HELD_ITEM); for (j = i + 1; j < 3; ++j) { if (sPartyMenuInternal->data[15] == GetMonData(&party[order[j] - 1], MON_DATA_SPECIES)) return PARTY_MSG_MONS_CANT_BE_SAME; if (sPartyMenuInternal->data[14] != ITEM_NONE && sPartyMenuInternal->data[14] == GetMonData(&party[order[j] - 1], MON_DATA_HELD_ITEM)) return PARTY_MSG_NO_SAME_HOLD_ITEMS; } } break; case CHOOSE_MONS_FOR_UNION_ROOM_BATTLE: if (order[1] == 0) return PARTY_MSG_TWO_MONS_ARE_NEEDED; break; } return 0xFF; } static bool8 HasPartySlotAlreadyBeenSelected(u8 slot) { u32 i; for (i = 0; i < NELEMS(gSelectedOrderFromParty); ++i) if (gSelectedOrderFromParty[i] == slot) return TRUE; return FALSE; } static void Task_ValidateChosenMonsForBattle(u8 taskId) { u8 msgId = CheckBattleEntriesAndGetMessage(); if (msgId != 0xFF) { PlaySE(SE_FAILURE); DisplayPartyMenuStdMessage(msgId); gTasks[taskId].func = Task_ContinueChoosingMonsForBattle; } else { if (gSelectedOrderFromParty[0] != 0) { PlaySE(SE_SELECT); Task_ClosePartyMenu(taskId); } else { PlaySE(SE_FAILURE); DisplayPartyMenuStdMessage(PARTY_MSG_NO_MON_FOR_BATTLE); gTasks[taskId].func = Task_ContinueChoosingMonsForBattle; } } } static void Task_ContinueChoosingMonsForBattle(u8 taskId) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } } void ChooseMonForTradingBoard(u8 menuType, MainCallback callback) { InitPartyMenu(menuType, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, callback); } void ChooseMonForMoveTutor(void) { if (gSpecialVar_0x8005 < TUTOR_MOVE_COUNT) { InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_MOVE_TUTOR, FALSE, PARTY_MSG_TEACH_WHICH_MON, Task_HandleChooseMonInput, CB2_ReturnToFieldContinueScriptPlayMapMusic); } else { InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_MOVE_TUTOR, FALSE, PARTY_MSG_NONE, TryTutorSelectedMon, CB2_ReturnToFieldContinueScriptPlayMapMusic); gPartyMenu.slotId = gSpecialVar_0x8007; } } void ChooseMonForWirelessMinigame(void) { InitPartyMenu(PARTY_MENU_TYPE_MINIGAME, PARTY_LAYOUT_SINGLE, PARTY_ACTION_MINIGAME, FALSE, PARTY_MSG_CHOOSE_MON_OR_CANCEL, Task_HandleChooseMonInput, CB2_ReturnToFieldContinueScriptPlayMapMusic); } static u8 GetPartyLayoutFromBattleType(void) { if (IsDoubleBattle() == FALSE) return PARTY_LAYOUT_SINGLE; if (IsMultiBattle() == TRUE) return PARTY_LAYOUT_MULTI; return PARTY_LAYOUT_DOUBLE; } void OpenPartyMenuInTutorialBattle(u8 partyAction) { if (!BtlCtrl_OakOldMan_TestState2Flag(FIRST_BATTLE_MSG_FLAG_PARTY_MENU) && (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)) { InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, PARTY_MSG_NONE, Task_FirstBattleEnterParty_WaitFadeIn, SetCB2ToReshowScreenAfterMenu); BtlCtrl_OakOldMan_SetState2Flag(FIRST_BATTLE_MSG_FLAG_PARTY_MENU); } else { InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, SetCB2ToReshowScreenAfterMenu); } ReshowBattleScreenDummy(); UpdatePartyToBattleOrder(); } void Pokedude_OpenPartyMenuInBattle(void) { InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON, Task_PartyMenu_Pokedude, SetCB2ToReshowScreenAfterMenu); ReshowBattleScreenDummy(); UpdatePartyToBattleOrder(); } void Pokedude_ChooseMonForInBattleItem(void) { InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), PARTY_ACTION_REUSABLE_ITEM, FALSE, PARTY_MSG_USE_ON_WHICH_MON, Task_PartyMenuFromBag_Pokedude, CB2_BagMenuFromBattle); ReshowBattleScreenDummy(); UpdatePartyToBattleOrder(); } void EnterPartyFromItemMenuInBattle(void) { if (!BtlCtrl_OakOldMan_TestState2Flag(FIRST_BATTLE_MSG_FLAG_PARTY_MENU) && (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)) { InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), PARTY_ACTION_USE_ITEM, FALSE, PARTY_MSG_NONE, Task_FirstBattleEnterParty_WaitFadeIn, CB2_BagMenuFromBattle); BtlCtrl_OakOldMan_SetState2Flag(FIRST_BATTLE_MSG_FLAG_PARTY_MENU); } else { MainCallback callback; if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH) callback = CB2_ReturnToBerryPouchMenu; else callback = CB2_BagMenuFromBattle; InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), PARTY_ACTION_USE_ITEM, FALSE, PARTY_MSG_USE_ON_WHICH_MON, Task_HandleChooseMonInput, callback); } ReshowBattleScreenDummy(); UpdatePartyToBattleOrder(); } static u8 GetPartyMenuActionsTypeInBattle(struct Pokemon *mon) { if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(mon, MON_DATA_IS_EGG)) return ACTIONS_SUMMARY_ONLY; else if (gPartyMenu.action == PARTY_ACTION_SEND_OUT) return ACTIONS_SEND_OUT; else return ACTIONS_SHIFT; } static bool8 TrySwitchInPokemon(void) { u8 slot = GetCursorSelectionMonId(); u8 newSlot; u32 i; // In a multi battle, slots 1, 4, and 5 are the partner's pokemon if (IsMultiBattle() == TRUE && (slot == 1 || slot == 4 || slot == 5)) { StringCopy(gStringVar1, GetTrainerPartnerName()); StringExpandPlaceholders(gStringVar4, gText_CantSwitchWithAlly); return FALSE; } if (GetMonData(&gPlayerParty[slot], MON_DATA_HP) == 0) { GetMonNickname(&gPlayerParty[slot], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnHasNoEnergy); return FALSE; } for (i = 0; i < gBattlersCount; ++i) { if (GetBattlerSide(i) == B_SIDE_PLAYER && GetPartyIdFromBattleSlot(slot) == gBattlerPartyIndexes[i]) { GetMonNickname(&gPlayerParty[slot], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnAlreadyInBattle); return FALSE; } } if (GetMonData(&gPlayerParty[slot], MON_DATA_IS_EGG)) { StringExpandPlaceholders(gStringVar4, gText_EggCantBattle); return FALSE; } if (GetPartyIdFromBattleSlot(slot) == gBattleStruct->playerPartyIdx) { GetMonNickname(&gPlayerParty[slot], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnAlreadySelected); return FALSE; } if (gPartyMenu.action == PARTY_ACTION_ABILITY_PREVENTS) { SetMonPreventsSwitchingString(); return FALSE; } if (gPartyMenu.action == PARTY_ACTION_CANT_SWITCH) { u8 currBattler = gBattlerInMenuId; GetMonNickname(&gPlayerParty[GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[currBattler])], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnCantSwitchOut); return FALSE; } gSelectedMonPartyId = GetPartyIdFromBattleSlot(slot); gPartyMenuUseExitCallback = TRUE; newSlot = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[gBattlerInMenuId]); SwitchPartyMonSlots(newSlot, slot); SwapPartyPokemon(&gPlayerParty[newSlot], &gPlayerParty[slot]); return TRUE; } void BufferBattlePartyCurrentOrder(void) { BufferBattlePartyOrder(gBattlePartyCurrentOrder, GetPlayerFlankId()); } static void BufferBattlePartyOrder(u8 *partyBattleOrder, u8 flankId) { u8 partyIds[PARTY_SIZE]; s32 i, j; if (IsMultiBattle() == TRUE) { // Party ids are packed in 4 bits at a time // i.e. the party id order below would be 0, 3, 5, 4, 2, 1, and the two parties would be 0,5,4 and 3,2,1 if (flankId != 0) { partyBattleOrder[0] = 0 | (3 << 4); partyBattleOrder[1] = 5 | (4 << 4); partyBattleOrder[2] = 2 | (1 << 4); } else { partyBattleOrder[0] = 3 | (0 << 4); partyBattleOrder[1] = 2 | (1 << 4); partyBattleOrder[2] = 5 | (4 << 4); } return; } else if (IsDoubleBattle() == FALSE) { j = 1; partyIds[0] = gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]; for (i = 0; i < PARTY_SIZE; ++i) { if (i != partyIds[0]) { partyIds[j] = i; ++j; } } } else { j = 2; partyIds[0] = gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]; partyIds[1] = gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]; for (i = 0; i < PARTY_SIZE; ++i) { if (i != partyIds[0] && i != partyIds[1]) { partyIds[j] = i; ++j; } } } for (i = 0; i < (s32)NELEMS(gBattlePartyCurrentOrder); ++i) partyBattleOrder[i] = (partyIds[0 + (i * 2)] << 4) | partyIds[1 + (i * 2)]; } void BufferBattlePartyCurrentOrderBySide(u8 battlerId, u8 flankId) { BufferBattlePartyOrderBySide(gBattleStruct->battlerPartyOrders[battlerId], flankId, battlerId); } // when GetBattlerSide(battlerId) == B_SIDE_PLAYER, this function is identical the one above static void BufferBattlePartyOrderBySide(u8 *partyBattleOrder, u8 flankId, u8 battlerId) { u8 partyIndexes[PARTY_SIZE]; s32 i, j; u8 leftBattler; u8 rightBattler; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { leftBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); rightBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } else { leftBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); rightBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } if (IsMultiBattle() == TRUE) { if (flankId != 0) { partyBattleOrder[0] = 0 | (3 << 4); partyBattleOrder[1] = 5 | (4 << 4); partyBattleOrder[2] = 2 | (1 << 4); } else { partyBattleOrder[0] = 3 | (0 << 4); partyBattleOrder[1] = 2 | (1 << 4); partyBattleOrder[2] = 5 | (4 << 4); } return; } else if (IsDoubleBattle() == FALSE) { j = 1; partyIndexes[0] = gBattlerPartyIndexes[leftBattler]; for (i = 0; i < PARTY_SIZE; ++i) { if (i != partyIndexes[0]) { partyIndexes[j] = i; ++j; } } } else { j = 2; partyIndexes[0] = gBattlerPartyIndexes[leftBattler]; partyIndexes[1] = gBattlerPartyIndexes[rightBattler]; for (i = 0; i < PARTY_SIZE; ++i) { if (i != partyIndexes[0] && i != partyIndexes[1]) { partyIndexes[j] = i; ++j; } } } for (i = 0; i < 3; ++i) partyBattleOrder[i] = (partyIndexes[0 + (i * 2)] << 4) | partyIndexes[1 + (i * 2)]; } void SwitchPartyOrderLinkMulti(u8 battlerId, u8 slot, u8 slot2) { u8 partyIds[PARTY_SIZE]; u8 tempSlot = 0; s32 i, j; u8 *partyBattleOrder; u8 partyIdBuffer; if (IsMultiBattle()) { partyBattleOrder = gBattleStruct->battlerPartyOrders[battlerId]; for (i = j = 0; i < 3; ++j, ++i) { partyIds[j] = partyBattleOrder[i] >> 4; ++j; partyIds[j] = partyBattleOrder[i] & 0xF; } partyIdBuffer = partyIds[slot2]; for (i = 0; i < PARTY_SIZE; ++i) { if (partyIds[i] == slot) { tempSlot = partyIds[i]; partyIds[i] = partyIdBuffer; break; } } if (i != PARTY_SIZE) { partyIds[slot2] = tempSlot; partyBattleOrder[0] = (partyIds[0] << 4) | partyIds[1]; partyBattleOrder[1] = (partyIds[2] << 4) | partyIds[3]; partyBattleOrder[2] = (partyIds[4] << 4) | partyIds[5]; } } } static u8 GetPartyIdFromBattleSlot(u8 slot) { u8 modResult = slot & 1; u8 retVal; slot /= 2; if (modResult != 0) retVal = gBattlePartyCurrentOrder[slot] & 0xF; else retVal = gBattlePartyCurrentOrder[slot] >> 4; return retVal; } static void SetPartyIdAtBattleSlot(u8 slot, u8 setVal) { bool32 modResult = slot & 1; slot /= 2; if (modResult != 0) gBattlePartyCurrentOrder[slot] = (gBattlePartyCurrentOrder[slot] & 0xF0) | setVal; else gBattlePartyCurrentOrder[slot] = (gBattlePartyCurrentOrder[slot] & 0xF) | (setVal << 4); } void SwitchPartyMonSlots(u8 slot, u8 slot2) { u8 partyId = GetPartyIdFromBattleSlot(slot); SetPartyIdAtBattleSlot(slot, GetPartyIdFromBattleSlot(slot2)); SetPartyIdAtBattleSlot(slot2, partyId); } u8 GetPartyIdFromBattlePartyId(u8 battlePartyId) { u8 i, j; for (j = i = 0; i < (s32)NELEMS(gBattlePartyCurrentOrder); ++j, ++i) { if ((gBattlePartyCurrentOrder[i] >> 4) != battlePartyId) { ++j; if ((gBattlePartyCurrentOrder[i] & 0xF) == battlePartyId) return j; } else { return j; } } return 0; } static void UpdatePartyToBattleOrder(void) { struct Pokemon *partyBuffer = Alloc(sizeof(gPlayerParty)); u32 i; memcpy(partyBuffer, gPlayerParty, sizeof(gPlayerParty)); for (i = 0; i < PARTY_SIZE; ++i) memcpy(&gPlayerParty[GetPartyIdFromBattlePartyId(i)], &partyBuffer[i], sizeof(struct Pokemon)); Free(partyBuffer); } static void UpdatePartyToFieldOrder(void) { struct Pokemon *partyBuffer = Alloc(sizeof(gPlayerParty)); u32 i; memcpy(partyBuffer, gPlayerParty, sizeof(gPlayerParty)); for (i = 0; i < PARTY_SIZE; ++i) memcpy(&gPlayerParty[GetPartyIdFromBattleSlot(i)], &partyBuffer[i], sizeof(struct Pokemon)); Free(partyBuffer); } // not used static void SwitchAliveMonIntoLeadSlot(void) { u32 i; struct Pokemon *mon; u8 partyId; for (i = 1; i < PARTY_SIZE; ++i) { mon = &gPlayerParty[GetPartyIdFromBattleSlot(i)]; if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE && GetMonData(mon, MON_DATA_HP) != 0) { partyId = GetPartyIdFromBattleSlot(0); SwitchPartyMonSlots(0, i); SwapPartyPokemon(&gPlayerParty[partyId], mon); break; } } } static void CB2_SetUpExitToBattleScreen(void) { CB2_SetUpReshowBattleScreenAfterMenu(); SetMainCallback2(SetCB2ToReshowScreenAfterMenu); } void ShowPartyMenuToShowcaseMultiBattleParty(void) { InitPartyMenu(PARTY_MENU_TYPE_MULTI_SHOWCASE, PARTY_LAYOUT_MULTI_SHOWCASE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_NONE, Task_InitMultiPartnerPartySlideIn, gMain.savedCallback); } #define tXPos data[0] static void Task_InitMultiPartnerPartySlideIn(u8 taskId) { // The first slide step also sets the sprites offscreen gTasks[taskId].tXPos = 256; SlideMultiPartyMenuBoxSpritesOneStep(taskId); ChangeBgX(2, 0x10000, 0); gTasks[taskId].func = Task_MultiPartnerPartySlideIn; } static void Task_MultiPartnerPartySlideIn(u8 taskId) { s16 *data = gTasks[taskId].data; u32 i; if (!gPaletteFade.active) { tXPos -= 8; SlideMultiPartyMenuBoxSpritesOneStep(taskId); if (tXPos == 0) { for (i = 3; i < PARTY_SIZE; ++i) { if (gMultiPartnerParty[i - MULTI_PARTY_SIZE].species != SPECIES_NONE) AnimateSelectedPartyIcon(sPartyMenuBoxes[i].monSpriteId, 0); } PlaySE(SE_M_HARDEN); // The Harden SE plays once the partners party mons have slid on screen gTasks[taskId].func = Task_WaitAfterMultiPartnerPartySlideIn; } } } static void Task_WaitAfterMultiPartnerPartySlideIn(u8 taskId) { s16 *data = gTasks[taskId].data; // data[0] used as a timer afterwards rather than the x pos if (++data[0] == 256) Task_ClosePartyMenu(taskId); } static void MoveMultiPartyMenuBoxSprite(u8 spriteId, s16 x) { if (x >= 0) gSprites[spriteId].x2 = x; } static void SlideMultiPartyMenuBoxSpritesOneStep(u8 taskId) { s16 *data = gTasks[taskId].data; u32 i; for (i = 3; i < PARTY_SIZE; ++i) { if (gMultiPartnerParty[i - MULTI_PARTY_SIZE].species != SPECIES_NONE) { MoveMultiPartyMenuBoxSprite(sPartyMenuBoxes[i].monSpriteId, tXPos - 8); MoveMultiPartyMenuBoxSprite(sPartyMenuBoxes[i].itemSpriteId, tXPos - 8); MoveMultiPartyMenuBoxSprite(sPartyMenuBoxes[i].pokeballSpriteId, tXPos - 8); MoveMultiPartyMenuBoxSprite(sPartyMenuBoxes[i].statusSpriteId, tXPos - 8); } } ChangeBgX(2, 0x800, 1); } #undef tXpos void ChooseMonForDaycare(void) { gFieldCallback2 = CB2_FadeFromPartyMenu; InitPartyMenu(PARTY_MENU_TYPE_DAYCARE, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON_2, Task_HandleChooseMonInput, CB2_ReturnToField); } void ChoosePartyMonByMenuType(u8 menuType) { gFieldCallback2 = CB2_FadeFromPartyMenu; InitPartyMenu(menuType, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_AND_CLOSE, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_ReturnToField); } static bool8 CB2_FadeFromPartyMenu(void) { FadeInFromBlack(); CreateTask(Task_PartyMenuWaitForFade, 10); return TRUE; } static void Task_PartyMenuWaitForFade(u8 taskId) { if (IsWeatherNotFadingIn()) { DestroyTask(taskId); UnlockPlayerFieldControls(); ScriptContext_Enable(); } } void ItemUseCB_ReduceEV(u8 taskId, TaskFunc task) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 item = gSpecialVar_ItemId; u8 effectType = GetItemEffectType(item); u16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); u16 ev = ItemEffectToMonEv(mon, effectType); u16 hp = GetMonData(mon, MON_DATA_HP); bool8 cannotUseEffect = ExecuteTableBasedItemEffect_(gPartyMenu.slotId, item, 0); u16 newFriendship = GetMonData(mon, MON_DATA_FRIENDSHIP); u16 newEv = ItemEffectToMonEv(mon, effectType); if (cannotUseEffect || (friendship == newFriendship && ev == newEv)) { gPartyMenuUseExitCallback = FALSE; PlaySE(SE_SELECT); DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = task; } else //can use effect, restore old ev, friendship, hp { SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); switch (effectType) { case ITEM_EFFECT_HP_EV: SetMonData(mon, MON_DATA_HP_EV, &ev); //SetMonData(mon, MON_DATA_HP, &hp); break; case ITEM_EFFECT_ATK_EV: SetMonData(mon, MON_DATA_ATK_EV, &ev); break; case ITEM_EFFECT_DEF_EV: SetMonData(mon, MON_DATA_DEF_EV, &ev); break; case ITEM_EFFECT_SPEED_EV: SetMonData(mon, MON_DATA_SPEED_EV, &ev); break; case ITEM_EFFECT_SPATK_EV: SetMonData(mon, MON_DATA_SPATK_EV, &ev); break; case ITEM_EFFECT_SPDEF_EV: SetMonData(mon, MON_DATA_SPDEF_EV, &ev); break; } ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, item, 0xFFFF); Task_DoUseItemAnim(taskId); gItemUseCB = ItemUseCB_ReduceEV2; } } void ItemUseCB_ReduceEV2(u8 taskId, TaskFunc task) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 item = gSpecialVar_ItemId; u8 effectType = GetItemEffectType(item); u16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); u16 ev = ItemEffectToMonEv(mon, effectType); bool8 cannotUseEffect = ExecuteTableBasedItemEffect_(gPartyMenu.slotId, item, 0); u16 newFriendship = GetMonData(mon, MON_DATA_FRIENDSHIP); u16 newEv = ItemEffectToMonEv(mon, effectType); if (cannotUseEffect || (friendship == newFriendship && ev == newEv)) { gPartyMenuUseExitCallback = FALSE; PlaySE(SE_SELECT); DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = task; } else { gPartyMenuUseExitCallback = TRUE; PlaySE(SE_USE_ITEM); RemoveBagItem(item, 1); GetMonNickname(mon, gStringVar1); ItemEffectToStatString(effectType, gStringVar2); if (friendship != newFriendship) { if (ev != newEv) StringExpandPlaceholders(gStringVar4, gText_PkmnFriendlyBaseVar2Fell); else StringExpandPlaceholders(gStringVar4, gText_PkmnFriendlyBaseVar2CantFall); } else { StringExpandPlaceholders(gStringVar4, gText_PkmnAdoresBaseVar2Fell); } DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = task; } } static u16 ItemEffectToMonEv(struct Pokemon *mon, u8 effectType) { switch (effectType) { case ITEM_EFFECT_HP_EV: if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_SHEDINJA) return GetMonData(mon, MON_DATA_HP_EV); break; case ITEM_EFFECT_ATK_EV: return GetMonData(mon, MON_DATA_ATK_EV); case ITEM_EFFECT_DEF_EV: return GetMonData(mon, MON_DATA_DEF_EV); case ITEM_EFFECT_SPEED_EV: return GetMonData(mon, MON_DATA_SPEED_EV); case ITEM_EFFECT_SPATK_EV: return GetMonData(mon, MON_DATA_SPATK_EV); case ITEM_EFFECT_SPDEF_EV: return GetMonData(mon, MON_DATA_SPDEF_EV); } return 0; } static void ItemEffectToStatString(u8 effectType, u8 *dest) { switch (effectType) { case ITEM_EFFECT_HP_EV: StringCopy(dest, gText_ItemEffect_HP); break; case ITEM_EFFECT_ATK_EV: StringCopy(dest, gText_ItemEffect_Attack); break; case ITEM_EFFECT_DEF_EV: StringCopy(dest, gText_ItemEffect_Defense); break; case ITEM_EFFECT_SPEED_EV: StringCopy(dest, gText_ItemEffect_Speed); break; case ITEM_EFFECT_SPATK_EV: StringCopy(dest, gText_ItemEffect_SpAtk); break; case ITEM_EFFECT_SPDEF_EV: StringCopy(dest, gText_ItemEffect_SpDef); break; } } // dive static void FieldCallback_Dive(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); FieldEffectStart(FLDEFF_USE_DIVE); } static bool8 SetUpFieldMove_Dive(void) { gFieldEffectArguments[1] = TrySetDiveWarp(); if (gFieldEffectArguments[1] != 0) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_Dive; return TRUE; } return FALSE; } ================================================ FILE: src/party_menu_specials.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "script.h" #include "overworld.h" #include "party_menu.h" #include "field_fadetransition.h" #include "pokemon_summary_screen.h" #include "event_data.h" #include "constants/moves.h" static void Task_ChoosePartyMon(u8 taskId); void ChoosePartyMon(void) { u8 taskId; LockPlayerFieldControls(); taskId = CreateTask(Task_ChoosePartyMon, 10); gTasks[taskId].data[0] = PARTY_MENU_TYPE_CHOOSE_SINGLE_MON; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); } void SelectMoveTutorMon(void) { u8 taskId; LockPlayerFieldControls(); taskId = CreateTask(Task_ChoosePartyMon, 10); gTasks[taskId].data[0] = PARTY_MENU_TYPE_MOVE_RELEARNER; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); } static void Task_ChoosePartyMon(u8 taskId) { if (!gPaletteFade.active) { gPaletteFade.bufferTransferDisabled = TRUE; ChoosePartyMonByMenuType((u8)gTasks[taskId].data[0]); DestroyTask(taskId); } } void SelectMoveDeleterMove(void) { ShowSelectMovePokemonSummaryScreen(gPlayerParty, gSpecialVar_0x8004, gPlayerPartyCount - 1, CB2_ReturnToField, 0); SetPokemonSummaryScreenMode(PSS_MODE_FORGET_MOVE); gFieldCallback = FieldCB_ContinueScriptHandleMusic; } void GetNumMovesSelectedMonHas(void) { u32 i; gSpecialVar_Result = 0; for (i = 0; i < MAX_MON_MOVES; ++i) if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_MOVE1 + i) != MOVE_NONE) ++gSpecialVar_Result; } void BufferMoveDeleterNicknameAndMove(void) { struct Pokemon *mon = &gPlayerParty[gSpecialVar_0x8004]; u16 move = GetMonData(mon, MON_DATA_MOVE1 + gSpecialVar_0x8005); GetMonNickname(mon, gStringVar1); StringCopy(gStringVar2, gMoveNames[move]); } static void ShiftMoveSlot(struct Pokemon *mon, u8 slotTo, u8 slotFrom) { u16 move1 = GetMonData(mon, MON_DATA_MOVE1 + slotTo); u16 move0 = GetMonData(mon, MON_DATA_MOVE1 + slotFrom); u8 pp1 = GetMonData(mon, MON_DATA_PP1 + slotTo); u8 pp0 = GetMonData(mon, MON_DATA_PP1 + slotFrom); u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); u8 ppBonusMask1 = gPPUpGetMask[slotTo]; u8 ppBonusMove1 = (ppBonuses & ppBonusMask1) >> (slotTo * 2); u8 ppBonusMask2 = gPPUpGetMask[slotFrom]; u8 ppBonusMove2 = (ppBonuses & ppBonusMask2) >> (slotFrom * 2); ppBonuses &= ~ppBonusMask1; ppBonuses &= ~ppBonusMask2; ppBonuses |= (ppBonusMove1 << (slotFrom * 2)) + (ppBonusMove2 << (slotTo * 2)); SetMonData(mon, MON_DATA_MOVE1 + slotTo, &move0); SetMonData(mon, MON_DATA_MOVE1 + slotFrom, &move1); SetMonData(mon, MON_DATA_PP1 + slotTo, &pp0); SetMonData(mon, MON_DATA_PP1 + slotFrom, &pp1); SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); } void MoveDeleterForgetMove(void) { u32 i; SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], MOVE_NONE, gSpecialVar_0x8005); RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005); for (i = gSpecialVar_0x8005; i < MAX_MON_MOVES - 1; ++i) ShiftMoveSlot(&gPlayerParty[gSpecialVar_0x8004], i, i + 1); } void IsSelectedMonEgg(void) { if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_IS_EGG)) gSpecialVar_Result = TRUE; else gSpecialVar_Result = FALSE; } ================================================ FILE: src/pc_screen_effect.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" /* * Animates the screen as though it was a CRT monitor turning on or off. */ #define tState data[0] #define tXSpeed data[1] #define tYSpeed data[2] #define tWin0Left data[3] #define tWin0Right data[4] #define tWin0Top data[5] #define tWin0Bottom data[6] #define tBldCntBak data[7] #define tBldYBak data[8] static void BeginPCScreenEffect(TaskFunc func, u16 a2, u16 a3, u8 priority); static void Task_PCScreenEffect_TurnOn(u8 taskId); static void Task_PCScreenEffect_TurnOff(u8 taskId); void BeginPCScreenEffect_TurnOn(u16 xspeed, u16 yspeed, u8 priority) { BeginPCScreenEffect(Task_PCScreenEffect_TurnOn, xspeed, yspeed, priority); } void BeginPCScreenEffect_TurnOff(u16 xspeed, u16 yspeed, u8 priority) { BeginPCScreenEffect(Task_PCScreenEffect_TurnOff, xspeed, yspeed, priority); } bool8 IsPCScreenEffectRunning_TurnOn(void) { return FuncIsActiveTask(Task_PCScreenEffect_TurnOn); } bool8 IsPCScreenEffectRunning_TurnOff(void) { return FuncIsActiveTask(Task_PCScreenEffect_TurnOff); } static void BeginPCScreenEffect(TaskFunc func, u16 speed, u16 unused, u8 priority) { u8 taskId = CreateTask(func, priority); gTasks[taskId].tState = 0; gTasks[taskId].tXSpeed = speed == 0 ? 16 : speed; gTasks[taskId].tYSpeed = speed == 0 ? 20 : speed; // Bug? should be the unused param, not speed gTasks[taskId].func(taskId); } static void Task_PCScreenEffect_TurnOn(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: task->tWin0Left = 120; task->tWin0Right = 120; task->tWin0Top = 80; task->tWin0Bottom = 81; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWin0Left, task->tWin0Right)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWin0Top, task->tWin0Bottom)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, 0); break; case 1: task->tBldCntBak = GetGpuReg(REG_OFFSET_BLDCNT); task->tBldYBak = GetGpuReg(REG_OFFSET_BLDY); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 16); break; case 2: task->tWin0Left -= task->tXSpeed; task->tWin0Right += task->tXSpeed; if (task->tWin0Left <= 0 || task->tWin0Right >= DISPLAY_WIDTH) { task->tWin0Left = 0; task->tWin0Right = DISPLAY_WIDTH; SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntBak); BlendPalettes(PALETTES_ALL, 0, RGB_BLACK); gPlttBufferFaded[BG_PLTT_ID(0)] = 0; } SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWin0Left, task->tWin0Right)); if (task->tWin0Left) return; break; case 3: task->tWin0Top -= task->tYSpeed; task->tWin0Bottom += task->tYSpeed; if (task->tWin0Top <= 0 || task->tWin0Bottom >= DISPLAY_HEIGHT) { task->tWin0Top = 0; task->tWin0Bottom = DISPLAY_HEIGHT; ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); } SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWin0Top, task->tWin0Bottom)); if (task->tWin0Top) return; break; default: SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntBak); DestroyTask(taskId); return; } ++task->tState; } static void Task_PCScreenEffect_TurnOff(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: gPlttBufferFaded[BG_PLTT_ID(0)] = 0; break; case 1: task->tWin0Left = 0; task->tWin0Right = DISPLAY_WIDTH; task->tWin0Top = 0; task->tWin0Bottom = DISPLAY_HEIGHT; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWin0Left, task->tWin0Right)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWin0Top, task->tWin0Bottom)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, 0); break; case 2: task->tWin0Top += task->tYSpeed; task->tWin0Bottom -= task->tYSpeed; if (task->tWin0Top >= 80 || task->tWin0Bottom <= 81) { task->tWin0Top = 80; task->tWin0Bottom = 81; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 16); } SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWin0Top, task->tWin0Bottom)); if (task->tWin0Top != 80) return; break; case 3: task->tWin0Left += task->tXSpeed; task->tWin0Right -= task->tXSpeed; if (task->tWin0Left >= 120 || task->tWin0Right <= 120) { task->tWin0Left = 120; task->tWin0Right = 120; BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK); gPlttBufferFaded[BG_PLTT_ID(0)] = 0; } SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWin0Left, task->tWin0Right)); if (task->tWin0Left != 120) return; break; default: ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); DestroyTask(taskId); return; } ++task->tState; } #undef tBldYBak #undef tBldCntBak #undef tWin0Bottom #undef tWin0Top #undef tWin0Right #undef tWin0Left #undef tYSpeed #undef tXSpeed #undef tState ================================================ FILE: src/play_time.c ================================================ #include "play_time.h" static u8 sPlayTimeCounterState; enum { STOPPED, RUNNING, MAXED_OUT, }; void PlayTimeCounter_Reset(void) { sPlayTimeCounterState = STOPPED; gSaveBlock2Ptr->playTimeHours = 0; gSaveBlock2Ptr->playTimeMinutes = 0; gSaveBlock2Ptr->playTimeSeconds = 0; gSaveBlock2Ptr->playTimeVBlanks = 0; } void PlayTimeCounter_Start(void) { sPlayTimeCounterState = RUNNING; if (gSaveBlock2Ptr->playTimeHours > 999) PlayTimeCounter_SetToMax(); } void PlayTimeCounter_Stop(void) { sPlayTimeCounterState = STOPPED; } void PlayTimeCounter_Update(void) { if (sPlayTimeCounterState == RUNNING) { gSaveBlock2Ptr->playTimeVBlanks++; if (gSaveBlock2Ptr->playTimeVBlanks > 59) { gSaveBlock2Ptr->playTimeVBlanks = 0; gSaveBlock2Ptr->playTimeSeconds++; if (gSaveBlock2Ptr->playTimeSeconds > 59) { gSaveBlock2Ptr->playTimeSeconds = 0; gSaveBlock2Ptr->playTimeMinutes++; if (gSaveBlock2Ptr->playTimeMinutes > 59) { gSaveBlock2Ptr->playTimeMinutes = 0; gSaveBlock2Ptr->playTimeHours++; if (gSaveBlock2Ptr->playTimeHours > 999) PlayTimeCounter_SetToMax(); } } } } } void PlayTimeCounter_SetToMax(void) { sPlayTimeCounterState = MAXED_OUT; gSaveBlock2Ptr->playTimeHours = 999; gSaveBlock2Ptr->playTimeMinutes = 59; gSaveBlock2Ptr->playTimeSeconds = 59; gSaveBlock2Ptr->playTimeVBlanks = 59; } ================================================ FILE: src/player_pc.c ================================================ #include "global.h" #include "gflib.h" #include "item.h" #include "task.h" #include "menu_indicators.h" #include "new_menu_helpers.h" #include "strings.h" #include "menu.h" #include "mail.h" #include "mail_data.h" #include "help_system.h" #include "overworld.h" #include "script.h" #include "mailbox_pc.h" #include "player_pc.h" #include "field_weather.h" #include "event_scripts.h" #include "field_fadetransition.h" #include "item_menu.h" #include "item_pc.h" #include "party_menu.h" #include "constants/items.h" #include "constants/songs.h" #include "constants/field_weather.h" #define PC_ITEM_ID 0 #define PC_QUANTITY 1 #define NEW_GAME_PC_ITEMS(i, type) (((u16 *)gNewGamePCItems + type)[i * 2]) #define tCount data[2] #define tPageItems data[4] #define tItemPcParam data[6] #define tWindowId data[10] #define tListMenuTaskId data[11] static EWRAM_DATA const u8 *sItemOrder = NULL; static EWRAM_DATA u8 sTopMenuItemCount = 0; EWRAM_DATA struct PlayerPCItemPageStruct gPlayerPcMenuManager = {}; #define SELECTED_MAIL (gSaveBlock1Ptr->mail[PC_MAIL_NUM(gPlayerPcMenuManager.cursorPos) + gPlayerPcMenuManager.itemsAbove]) static void Task_DrawPlayerPcTopMenu(u8 taskId); static void Task_TopMenuHandleInput(u8 taskId); static void Task_PlayerPcItemStorage(u8 taskId); static void Task_PlayerPcMailbox(u8 taskId); static void Task_PlayerPcTurnOff(u8 taskId); static void Task_CreateItemStorageSubmenu(u8 taskId, u8 cursorPos); static void PrintStringOnWindow0WithDialogueFrame(const u8 *str); static void Task_TopMenu_ItemStorageSubmenu_HandleInput(u8 taskId); static void Task_PlayerPcDepositItem(u8 taskId); static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId); static void CB2_ReturnFromDepositMenu(void); static void Task_PlayerPcWithdrawItem(u8 taskId); static void CB2_ReturnFromWithdrawMenu(void); static void Task_WithdrawItemBeginFade(u8 taskId); static void Task_PlayerPcCancel(u8 taskId); static void Task_SetPageItemVars(u8 taskId); static u8 CountPCMail(void); static void PCMailCompaction(void); static void Task_DrawMailboxPcMenu(u8 taskId); static void Task_MailboxPcHandleInput(u8 taskId); static void Task_PrintWhatToDoWithSelectedMail(u8 taskId); static void Task_DestroyMailboxPcViewAndCancel(u8 taskId); static void Task_DrawMailSubmenu(u8 taskId); static void Task_MailSubmenuHandleInput(u8 taskId); static void Task_PlayerPcReadMail(u8 taskId); static void Task_WaitFadeAndReadSelectedMail(u8 taskId); static void CB2_SetCbToReturnToMailbox(void); static void Task_PlayerPcMoveMailToBag(u8 taskId); static void Task_DrawYesNoMenuToConfirmMoveToBag(u8 taskId); static void Task_MoveToBagYesNoMenuHandleInput(u8 taskId); static void Task_TryPutMailInBag_DestroyMsgIfSuccessful(u8 taskId); static void Task_DeclinedMoveMailToBag(u8 taskId); static void Task_PlayerPcGiveMailToMon(u8 taskId); static void Task_WaitFadeAndGoToPartyMenu(u8 taskId); static void Task_Error_NoPokemon(u8 taskId); static void Task_PlayerPcExitMailSubmenu(u8 taskId); static const u8 *const sItemStorageActionDescriptionPtrs[] = { gText_TakeOutItemsFromThePC, gText_StoreItemsInThePC, gText_GoBackToThePreviousMenu }; static const struct MenuAction sMenuActions_TopMenu[] = { {gText_ItemStorage, Task_PlayerPcItemStorage}, {gText_Mailbox, Task_PlayerPcMailbox}, {gText_TurnOff, Task_PlayerPcTurnOff} }; static const u8 sItemOrder_BedroomPC[] = { 0, 1, 2 }; static const u8 sItemOrder_PlayerPC[] = { 0, 1, 2 }; static const struct MenuAction sMenuActions_ItemPc[] = { {gText_WithdrawItem2, Task_PlayerPcWithdrawItem}, {gText_DepositItem2, Task_PlayerPcDepositItem}, {gFameCheckerText_Cancel, Task_PlayerPcCancel} }; static const struct ItemSlot gNewGamePCItems[] = { { ITEM_POTION, 1 }, { ITEM_NONE, 0 } }; static const struct MenuAction sMenuActions_MailSubmenu[] = { {gOtherText_Read, Task_PlayerPcReadMail}, {gOtherText_MoveToBag, Task_PlayerPcMoveMailToBag}, {gOtherText_Give2, Task_PlayerPcGiveMailToMon}, {gOtherText_Exit, Task_PlayerPcExitMailSubmenu} }; static const struct WindowTemplate sWindowTemplate_TopMenu_3Items = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 13, .height = 6, .paletteNum = 15, .baseBlock = 0x008 }; static const struct WindowTemplate sWindowTemplate_TopMenu_4Items = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 13, .height = 8, .paletteNum = 15, .baseBlock = 0x008 }; static const struct WindowTemplate sWindowTemplate_ItemStorageSubmenu = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 14, .height = 6, .paletteNum = 15, .baseBlock = 0x008 }; void NewGameInitPCItems(void) { u32 i; for (i = 0, ClearPCItemSlots(); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) && AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++) ; } void BedroomPC(void) { u8 taskId; gPlayerPcMenuManager.notInRoom = FALSE; BackupHelpContext(); sItemOrder = sItemOrder_BedroomPC; sTopMenuItemCount = 3; taskId = CreateTask(TaskDummy, 0); DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu); } void PlayerPC(void) { u8 taskId; gPlayerPcMenuManager.notInRoom = TRUE; BackupHelpContext(); sItemOrder = sItemOrder_PlayerPC; sTopMenuItemCount = 3; taskId = CreateTask(TaskDummy, 0); DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu); } static void Task_DrawPlayerPcTopMenu(u8 taskId) { s16 *data = gTasks[taskId].data; if (sTopMenuItemCount == 3) tWindowId = AddWindow(&sWindowTemplate_TopMenu_3Items); else tWindowId = AddWindow(&sWindowTemplate_TopMenu_4Items); SetStdWindowBorderStyle(tWindowId, 0); AddItemMenuActionTextPrinters(tWindowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING), 16, sTopMenuItemCount, sMenuActions_TopMenu, sItemOrder); Menu_InitCursor(tWindowId, FONT_NORMAL, 0, 2, 16, sTopMenuItemCount, 0); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Task_TopMenuHandleInput; } static void Task_TopMenuHandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; s8 input = Menu_ProcessInputNoWrapAround(); switch (input) { case -2: break; case -1: PlaySE(SE_SELECT); ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); ClearWindowTilemap(tWindowId); RemoveWindow(tWindowId); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Task_PlayerPcTurnOff; break; default: ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); ClearWindowTilemap(tWindowId); RemoveWindow(tWindowId); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = sMenuActions_TopMenu[sItemOrder[input]].func.void_u8; break; } } static void Task_ReturnToTopMenu(u8 taskId) { RestoreHelpContext(); DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu); } static void Task_PlayerPcItemStorage(u8 taskId) { Task_CreateItemStorageSubmenu(taskId, FALSE); gTasks[taskId].func = Task_TopMenu_ItemStorageSubmenu_HandleInput; } static void Task_PlayerPcMailbox(u8 taskId) { gPlayerPcMenuManager.count = CountPCMail(); if (gPlayerPcMenuManager.count == 0) { DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_TheresNoMailHere, Task_ReturnToTopMenu); } else { gPlayerPcMenuManager.itemsAbove = 0; gPlayerPcMenuManager.cursorPos = 0; PCMailCompaction(); Task_SetPageItemVars(taskId); if (gPlayerPcMenuManager.notInRoom == FALSE) SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX); else SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX); if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE) { ClearDialogWindowAndFrame(0, FALSE); Task_DrawMailboxPcMenu(taskId); gTasks[taskId].func = Task_MailboxPcHandleInput; } else { DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_TheresNoMailHere, Task_ReturnToTopMenu); } } } static void Task_PlayerPcTurnOff(u8 taskId) { if (gPlayerPcMenuManager.notInRoom == FALSE) ScriptContext_SetupScript(EventScript_PalletTown_PlayersHouse_2F_ShutDownPC); else ScriptContext_Enable(); DestroyTask(taskId); } static void Task_CreateItemStorageSubmenu(u8 taskId, u8 cursorPos) { s16 *data = gTasks[taskId].data; if (gPlayerPcMenuManager.notInRoom == FALSE) SetHelpContext(HELPCONTEXT_BEDROOM_PC_ITEMS); else SetHelpContext(HELPCONTEXT_PLAYERS_PC_ITEMS); tWindowId = AddWindow(&sWindowTemplate_ItemStorageSubmenu); SetStdWindowBorderStyle(tWindowId, FALSE); PrintTextArray(tWindowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, 16, 3, sMenuActions_ItemPc); Menu_InitCursor(tWindowId, FONT_NORMAL, 0, 2, 16, 3, cursorPos); ScheduleBgCopyTilemapToVram(0); PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[cursorPos]); } static void PrintStringOnWindow0WithDialogueFrame(const u8 *str) { DrawDialogueFrame(0, FALSE); AddTextPrinterParameterized(0, FONT_NORMAL, str, 0, 1, 0, NULL); } static void Task_TopMenu_ItemStorageSubmenu_HandleInput(u8 taskId) { if (JOY_REPT(DPAD_UP)) { if (Menu_GetCursorPos() != 0) { PlaySE(SE_SELECT); Menu_MoveCursor(-1); PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[Menu_GetCursorPos()]); } } else if (JOY_REPT(DPAD_DOWN)) { if (Menu_GetCursorPos() != 2) { PlaySE(SE_SELECT); Menu_MoveCursor(+1); PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[Menu_GetCursorPos()]); } } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); sMenuActions_ItemPc[Menu_GetCursorPos()].func.void_u8(taskId); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); sMenuActions_ItemPc[2].func.void_u8(taskId); } } static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId) { if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); GoToBagMenu(ITEMMENULOCATION_ITEMPC, OPEN_BAG_ITEMS, CB2_ReturnToField); gFieldCallback = CB2_ReturnFromDepositMenu; DestroyTask(taskId); } } static void Task_PlayerPcDepositItem(u8 taskId) { gTasks[taskId].func = Task_DepositItem_WaitFadeAndGoToBag; FadeScreen(FADE_TO_BLACK, 0); } static void Task_ReturnToItemStorageSubmenu(u8 taskId) { if (IsWeatherNotFadingIn() == TRUE) gTasks[taskId].func = Task_TopMenu_ItemStorageSubmenu_HandleInput; } static void CB2_ReturnFromDepositMenu(void) { u8 taskId; LoadStdWindowFrameGfx(); DrawDialogueFrame(0, TRUE); taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0); Task_CreateItemStorageSubmenu(taskId, 1); FadeInFromBlack(); } static void Task_PlayerPcWithdrawItem(u8 taskId) { s16 *data = gTasks[taskId].data; tCount = CountItemsInPC(); if (tCount != 0) { tItemPcParam = 0; gTasks[taskId].func = Task_WithdrawItemBeginFade; gFieldCallback = CB2_ReturnFromWithdrawMenu; } else { ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); ClearWindowTilemap(tWindowId); RemoveWindow(tWindowId); DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_ThereAreNoItems, Task_PlayerPcItemStorage); } } static void CB2_ReturnFromWithdrawMenu(void) { u8 taskId; LoadStdWindowFrameGfx(); DrawDialogueFrame(0, TRUE); taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0); Task_CreateItemStorageSubmenu(taskId, 0); FadeInFromBlack(); } static void Task_WithdrawItem_WaitFadeAndGoToItemStorage(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); ItemPc_Init(tItemPcParam, CB2_ReturnToField); DestroyTask(taskId); } } static void Task_WithdrawItemBeginFade(u8 taskId) { gTasks[taskId].func = Task_WithdrawItem_WaitFadeAndGoToItemStorage; ItemPc_SetInitializedFlag(FALSE); FadeScreen(FADE_TO_BLACK, 0); } static void Task_PlayerPcCancel(u8 taskId) { s16 *data = gTasks[taskId].data; ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); ClearWindowTilemap(tWindowId); CopyWindowToVram(tWindowId, COPYWIN_MAP); RemoveWindow(tWindowId); Task_ReturnToTopMenu(taskId); } static void Task_SetPageItemVars(u8 taskId) { s16 *data = gTasks[taskId].data; if (tCount >= 8) tPageItems = 8; else tPageItems = tCount + 1; if (gPlayerPcMenuManager.count >= 8) gPlayerPcMenuManager.pageItems = 8; else gPlayerPcMenuManager.pageItems = gPlayerPcMenuManager.count + 1; } static u8 CountPCMail(void) { u8 count = 0; u32 i; for (i = PC_MAIL_NUM(0); i < MAIL_COUNT; i++) { if (gSaveBlock1Ptr->mail[i].itemId != ITEM_NONE) count++; } return count; } static void PCMailCompaction(void) { u32 i; u32 j; for (i = PC_MAIL_NUM(0); i < MAIL_COUNT - 1; i++) { for (j = i + 1; j < MAIL_COUNT; j++) { if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE) { struct Mail mail = gSaveBlock1Ptr->mail[i]; gSaveBlock1Ptr->mail[i] = gSaveBlock1Ptr->mail[j]; gSaveBlock1Ptr->mail[j] = mail; } } } } static void Task_DrawMailboxPcMenu(u8 taskId) { u8 windowId = MailboxPC_GetAddWindow(0); s32 width = GetStringWidth(FONT_NORMAL, gText_Mailbox, 0); MailboxPC_GetAddWindow(1); AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_Mailbox, (80 - width) / 2, 2, 0, NULL); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].tListMenuTaskId = MailboxPC_InitListMenu(&gPlayerPcMenuManager); MailboxPC_AddScrollIndicatorArrows(&gPlayerPcMenuManager); } static void Task_MailboxPcHandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; s32 input; if (!gPaletteFade.active) { input = ListMenu_ProcessInput(tListMenuTaskId); ListMenuGetScrollAndRow(tListMenuTaskId, &gPlayerPcMenuManager.cursorPos, &gPlayerPcMenuManager.itemsAbove); switch (input) { case -1: break; case -2: PlaySE(SE_SELECT); RemoveScrollIndicatorArrowPair(gPlayerPcMenuManager.scrollIndicatorId); Task_DestroyMailboxPcViewAndCancel(taskId); break; default: PlaySE(SE_SELECT); MailboxPC_RemoveWindow(0); MailboxPC_RemoveWindow(1); DestroyListMenuTask(tListMenuTaskId, &gPlayerPcMenuManager.cursorPos, &gPlayerPcMenuManager.itemsAbove); ScheduleBgCopyTilemapToVram(0); RemoveScrollIndicatorArrowPair(gPlayerPcMenuManager.scrollIndicatorId); gTasks[taskId].func = Task_PrintWhatToDoWithSelectedMail; break; } } } static void Task_PrintWhatToDoWithSelectedMail(u8 taskId) { s32 length; s32 i; u8 *ptr; StringCopy(gStringVar1, SELECTED_MAIL.playerName); length = StringLength(gStringVar1); if (length > 5) { for (ptr = gStringVar1 + length - 1; ptr >= gStringVar1; ptr--) { if (*ptr) break; *ptr = EOS; } } else { ConvertInternationalString(gStringVar1, LANGUAGE_JAPANESE); } StringExpandPlaceholders(gStringVar4, gText_WhatWouldYouLikeToDoWithPlayersMail); DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_DrawMailSubmenu); } static void Task_DestroyMailboxPcViewAndCancel(u8 taskId) { s16 *data = gTasks[taskId].data; MailboxPC_RemoveWindow(0); MailboxPC_RemoveWindow(1); DestroyListMenuTask(tListMenuTaskId, NULL, NULL); ScheduleBgCopyTilemapToVram(0); MailboxPC_DestroyListMenuBuffer(); Task_ReturnToTopMenu(taskId); } static void Task_DrawMailSubmenu(u8 taskId) { u8 windowId = MailboxPC_GetAddWindow(2); PrintTextArray(windowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, 16, 4, sMenuActions_MailSubmenu); Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, 4, 0); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Task_MailSubmenuHandleInput; } static void Task_MailSubmenuHandleInput(u8 taskId) { s8 input = Menu_ProcessInput_other(); switch (input) { case -1: PlaySE(SE_SELECT); Task_PlayerPcExitMailSubmenu(taskId); break; case -2: break; default: PlaySE(SE_SELECT); sMenuActions_MailSubmenu[input].func.void_u8(taskId); break; } } static void Task_PlayerPcReadMail(u8 taskId) { FadeScreen(FADE_TO_BLACK, 0); gTasks[taskId].func = Task_WaitFadeAndReadSelectedMail; } static void Task_WaitFadeAndReadSelectedMail(u8 taskId) { if (!gPaletteFade.active) { MailboxPC_DestroyListMenuBuffer(); CleanupOverworldWindowsAndTilemaps(); ReadMail(&SELECTED_MAIL, CB2_SetCbToReturnToMailbox, 1); DestroyTask(taskId); } } static void Task_WaitFadeAndReturnToMailboxPcInputHandler(u8 taskId) { if (IsWeatherNotFadingIn() == TRUE) gTasks[taskId].func = Task_MailboxPcHandleInput; } static void CB2_ReturnToMailbox(void) { u8 taskId; if (gPlayerPcMenuManager.notInRoom == FALSE) SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX); else SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX); LoadStdWindowFrameGfx(); taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0); if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE) Task_DrawMailboxPcMenu(taskId); else DestroyTask(taskId); FadeInFromBlack(); } static void CB2_SetCbToReturnToMailbox(void) { gFieldCallback = CB2_ReturnToMailbox; SetMainCallback2(CB2_ReturnToField); } static void Task_PlayerPcMoveMailToBag(u8 taskId) { DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_MessageWillBeLost, Task_DrawYesNoMenuToConfirmMoveToBag); } static void Task_DrawYesNoMenuToConfirmMoveToBag(u8 taskId) { DisplayYesNoMenuDefaultYes(); gTasks[taskId].func = Task_MoveToBagYesNoMenuHandleInput; } static void Task_MoveToBagYesNoMenuHandleInput(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case -2: break; case 0: Task_TryPutMailInBag_DestroyMsgIfSuccessful(taskId); break; case -1: PlaySE(SE_SELECT); // fallthrough case 1: Task_DeclinedMoveMailToBag(taskId); break; } } static void Task_TryPutMailInBag_DestroyMsgIfSuccessful(u8 taskId) { struct Mail * mail = &SELECTED_MAIL; if (!AddBagItem(mail->itemId, 1)) { DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_BagIsFull, Task_PlayerPcExitMailSubmenu); } else { DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_MailReturnedToBagMessageErased, Task_PlayerPcExitMailSubmenu); ClearMailStruct(mail); PCMailCompaction(); gPlayerPcMenuManager.count--; if (gPlayerPcMenuManager.count < gPlayerPcMenuManager.pageItems + gPlayerPcMenuManager.cursorPos) { if (gPlayerPcMenuManager.cursorPos != 0) gPlayerPcMenuManager.cursorPos--; } Task_SetPageItemVars(taskId); } } static void Task_DeclinedMoveMailToBag(u8 taskId) { Task_PlayerPcExitMailSubmenu(taskId); } static void Task_PlayerPcGiveMailToMon(u8 taskId) { if (CalculatePlayerPartyCount() == 0) { Task_Error_NoPokemon(taskId); } else { FadeScreen(FADE_TO_BLACK, 0); gTasks[taskId].func = Task_WaitFadeAndGoToPartyMenu; } } static void Task_WaitFadeAndGoToPartyMenu(u8 taskId) { if (!gPaletteFade.active) { MailboxPC_DestroyListMenuBuffer(); CleanupOverworldWindowsAndTilemaps(); ChooseMonToGiveMailFromMailbox(); DestroyTask(taskId); } } static void CB2_ReturnToMailboxPc_UpdateScrollVariables(void) { u8 taskId; u8 count; if (gPlayerPcMenuManager.notInRoom == FALSE) SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX); else SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX); taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0); count = gPlayerPcMenuManager.count; gPlayerPcMenuManager.count = CountPCMail(); PCMailCompaction(); if (count != gPlayerPcMenuManager.count) { if (gPlayerPcMenuManager.count < gPlayerPcMenuManager.pageItems + gPlayerPcMenuManager.cursorPos) { if (gPlayerPcMenuManager.cursorPos != 0) gPlayerPcMenuManager.cursorPos--; } } Task_SetPageItemVars(taskId); LoadStdWindowFrameGfx(); if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE) Task_DrawMailboxPcMenu(taskId); else DestroyTask(taskId); FadeInFromBlack(); } void Mailbox_ReturnToMailListAfterDeposit(void) { gFieldCallback = CB2_ReturnToMailboxPc_UpdateScrollVariables; SetMainCallback2(CB2_ReturnToField); } static void Task_Error_NoPokemon(u8 taskId) { DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_ThereIsNoPokemon, Task_PlayerPcExitMailSubmenu); } static void Task_RedrawPlayerPcMailboxAndSetUpInputHandler(u8 taskId) { ClearDialogWindowAndFrame(0, FALSE); Task_DrawMailboxPcMenu(taskId); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Task_MailboxPcHandleInput; } static void Task_PlayerPcExitMailSubmenu(u8 taskId) { MailboxPC_RemoveWindow(2); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Task_RedrawPlayerPcMailboxAndSetUpInputHandler; } #undef tListMenuTaskId #undef tWindowId #undef tItemPcParam #undef tPageItems #undef tCount ================================================ FILE: src/pokeball.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "decompress.h" #include "graphics.h" #include "m4a.h" #include "pokeball.h" #include "task.h" #include "trig.h" #include "util.h" #include "link.h" #include "battle_gfx_sfx_util.h" #include "constants/songs.h" #include "constants/sound.h" static void Task_DoPokeballSendOutAnim(u8 taskId); static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite); static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite); static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite); static void SpriteCB_BallThrow(struct Sprite *sprite); static void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite); static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite); static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite); static void SpriteCB_BallThrow_Close(struct Sprite *sprite); static void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite); static void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite); static void SpriteCB_BallThrow_Shake(struct Sprite *sprite); static void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite); static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite); static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite); static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite); static void HandleBallAnimEnd(struct Sprite *sprite); static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite); static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite); static void SpriteCB_TradePokeball(struct Sprite *sprite); static void SpriteCB_TradePokeballSendOff(struct Sprite *sprite); static void SpriteCB_TradePokeballEnd(struct Sprite *sprite); static void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite); static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite); static void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite); static u16 GetBattlerPokeballItemId(u8 battlerId); // rom const data #define GFX_TAG_POKE_BALL 55000 #define GFX_TAG_GREAT_BALL 55001 #define GFX_TAG_SAFARI_BALL 55002 #define GFX_TAG_ULTRA_BALL 55003 #define GFX_TAG_MASTER_BALL 55004 #define GFX_TAG_NET_BALL 55005 #define GFX_TAG_DIVE_BALL 55006 #define GFX_TAG_NEST_BALL 55007 #define GFX_TAG_REPEAT_BALL 55008 #define GFX_TAG_TIMER_BALL 55009 #define GFX_TAG_LUXURY_BALL 55010 #define GFX_TAG_PREMIER_BALL 55011 const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] = { [BALL_POKE] = {gBallGfx_Poke, 384, GFX_TAG_POKE_BALL}, [BALL_GREAT] = {gBallGfx_Great, 384, GFX_TAG_GREAT_BALL}, [BALL_SAFARI] = {gBallGfx_Safari, 384, GFX_TAG_SAFARI_BALL}, [BALL_ULTRA] = {gBallGfx_Ultra, 384, GFX_TAG_ULTRA_BALL}, [BALL_MASTER] = {gBallGfx_Master, 384, GFX_TAG_MASTER_BALL}, [BALL_NET] = {gBallGfx_Net, 384, GFX_TAG_NET_BALL}, [BALL_DIVE] = {gBallGfx_Dive, 384, GFX_TAG_DIVE_BALL}, [BALL_NEST] = {gBallGfx_Nest, 384, GFX_TAG_NEST_BALL}, [BALL_REPEAT] = {gBallGfx_Repeat, 384, GFX_TAG_REPEAT_BALL}, [BALL_TIMER] = {gBallGfx_Timer, 384, GFX_TAG_TIMER_BALL}, [BALL_LUXURY] = {gBallGfx_Luxury, 384, GFX_TAG_LUXURY_BALL}, [BALL_PREMIER] = {gBallGfx_Premier, 384, GFX_TAG_PREMIER_BALL}, }; const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] = { [BALL_POKE] = {gBallPal_Poke, GFX_TAG_POKE_BALL}, [BALL_GREAT] = {gBallPal_Great, GFX_TAG_GREAT_BALL}, [BALL_SAFARI] = {gBallPal_Safari, GFX_TAG_SAFARI_BALL}, [BALL_ULTRA] = {gBallPal_Ultra, GFX_TAG_ULTRA_BALL}, [BALL_MASTER] = {gBallPal_Master, GFX_TAG_MASTER_BALL}, [BALL_NET] = {gBallPal_Net, GFX_TAG_NET_BALL}, [BALL_DIVE] = {gBallPal_Dive, GFX_TAG_DIVE_BALL}, [BALL_NEST] = {gBallPal_Nest, GFX_TAG_NEST_BALL}, [BALL_REPEAT] = {gBallPal_Repeat, GFX_TAG_REPEAT_BALL}, [BALL_TIMER] = {gBallPal_Timer, GFX_TAG_TIMER_BALL}, [BALL_LUXURY] = {gBallPal_Luxury, GFX_TAG_LUXURY_BALL}, [BALL_PREMIER] = {gBallPal_Premier, GFX_TAG_PREMIER_BALL}, }; static const struct OamData sBallOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0, }; static const union AnimCmd sBallAnimSeq3[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd sBallAnimSeq5[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sBallAnimSeq4[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_JUMP(0), }; static const union AnimCmd sBallAnimSeq6[] = { ANIMCMD_FRAME(12, 1), ANIMCMD_JUMP(0), }; static const union AnimCmd sBallAnimSeq0[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; static const union AnimCmd sBallAnimSeq1[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_END, }; static const union AnimCmd sBallAnimSeq2[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; static const union AnimCmd *const sBallAnimSequences[] = { sBallAnimSeq0, sBallAnimSeq1, sBallAnimSeq2, sBallAnimSeq3, sBallAnimSeq4, sBallAnimSeq5, sBallAnimSeq6, }; static const union AffineAnimCmd sAffineAnim_BallRotate_0[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sAffineAnim_BallRotate_Right[] = { AFFINEANIMCMD_FRAME(0, 0, -3, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sAffineAnim_BallRotate_Left[] = { AFFINEANIMCMD_FRAME(0, 0, 3, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd sAffineAnim_BallRotate_3[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sAffineAnim_BallRotate_4[] = { AFFINEANIMCMD_FRAME(0, 0, 25, 1), AFFINEANIMCMD_JUMP(0), }; static const union AffineAnimCmd *const sAffineAnim_BallRotate[] = { [BALL_AFFINE_ANIM_0] = sAffineAnim_BallRotate_0, [BALL_ROTATE_RIGHT] = sAffineAnim_BallRotate_Right, [BALL_ROTATE_LEFT] = sAffineAnim_BallRotate_Left, [BALL_AFFINE_ANIM_3] = sAffineAnim_BallRotate_3, [BALL_AFFINE_ANIM_4] = sAffineAnim_BallRotate_4, }; const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = { [BALL_POKE] = { .tileTag = GFX_TAG_POKE_BALL, .paletteTag = GFX_TAG_POKE_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_GREAT] = { .tileTag = GFX_TAG_GREAT_BALL, .paletteTag = GFX_TAG_GREAT_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_SAFARI] = { .tileTag = GFX_TAG_SAFARI_BALL, .paletteTag = GFX_TAG_SAFARI_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_ULTRA] = { .tileTag = GFX_TAG_ULTRA_BALL, .paletteTag = GFX_TAG_ULTRA_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_MASTER] = { .tileTag = GFX_TAG_MASTER_BALL, .paletteTag = GFX_TAG_MASTER_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_NET] = { .tileTag = GFX_TAG_NET_BALL, .paletteTag = GFX_TAG_NET_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_DIVE] = { .tileTag = GFX_TAG_DIVE_BALL, .paletteTag = GFX_TAG_DIVE_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_NEST] = { .tileTag = GFX_TAG_NEST_BALL, .paletteTag = GFX_TAG_NEST_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_REPEAT] = { .tileTag = GFX_TAG_REPEAT_BALL, .paletteTag = GFX_TAG_REPEAT_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_TIMER] = { .tileTag = GFX_TAG_TIMER_BALL, .paletteTag = GFX_TAG_TIMER_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_LUXURY] = { .tileTag = GFX_TAG_LUXURY_BALL, .paletteTag = GFX_TAG_LUXURY_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, [BALL_PREMIER] = { .tileTag = GFX_TAG_PREMIER_BALL, .paletteTag = GFX_TAG_PREMIER_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, }; #define tFrames data[0] #define tPan data[1] #define tThrowId data[2] #define tBattler data[3] #define tOpponentBattler data[4] u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow) { u8 taskId; gDoingBattleAnim = TRUE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive = TRUE; taskId = CreateTask(Task_DoPokeballSendOutAnim, 5); gTasks[taskId].tPan = pan; gTasks[taskId].tThrowId = kindOfThrow; gTasks[taskId].tBattler = gActiveBattler; return 0; } #define sBattler data[6] static void Task_DoPokeballSendOutAnim(u8 taskId) { u16 throwCaseId; u8 battlerId; u16 itemId, ballId; u8 ballSpriteId; bool8 notSendOut = FALSE; s16 x, y; u32 gender; if (gTasks[taskId].tFrames == 0) { gTasks[taskId].tFrames++; return; } throwCaseId = gTasks[taskId].tThrowId; battlerId = gTasks[taskId].tBattler; if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) itemId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); else itemId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); ballId = ItemIdToBallId(itemId); LoadBallGfx(ballId); if (gBattleTypeFlags & BATTLE_TYPE_LINK) gender = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].gender; else gender = gSaveBlock2Ptr->playerGender; ballSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29); gSprites[ballSpriteId].data[0] = 0x80; gSprites[ballSpriteId].data[1] = 0; gSprites[ballSpriteId].data[7] = throwCaseId; switch (throwCaseId) { case POKEBALL_PLAYER_SENDOUT: if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) { x = 32; y = 64; } else { gender = !!gender; // something unknown got optimized out x = 48; y = 70; } gBattlerTarget = battlerId; gSprites[ballSpriteId].x = x; gSprites[ballSpriteId].y = y; gSprites[ballSpriteId].callback = SpriteCB_PlayerMonSendOut_1; break; case POKEBALL_OPPONENT_SENDOUT: gSprites[ballSpriteId].x = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X); gSprites[ballSpriteId].y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 24; gBattlerTarget = battlerId; gSprites[ballSpriteId].data[0] = 0; gSprites[ballSpriteId].callback = SpriteCB_OpponentMonSendOut; break; default: gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); notSendOut = TRUE; break; } gSprites[ballSpriteId].sBattler = gBattlerTarget; if (!notSendOut) { DestroyTask(taskId); return; } // this will perform an unused ball throw animation gSprites[ballSpriteId].data[0] = 34; gSprites[ballSpriteId].data[2] = GetBattlerSpriteCoord(gBattlerTarget, BATTLER_COORD_X); gSprites[ballSpriteId].data[4] = GetBattlerSpriteCoord(gBattlerTarget, BATTLER_COORD_Y) - 16; gSprites[ballSpriteId].data[5] = -40; InitAnimArcTranslation(&gSprites[ballSpriteId]); gSprites[ballSpriteId].oam.affineParam = taskId; gTasks[taskId].tOpponentBattler = gBattlerTarget; gTasks[taskId].func = TaskDummy; PlaySE(SE_BALL_THROW); } // This sequence of functions is very similar to those that get run when // a Pokéball gets thrown at a wild Pokémon, starting at SpriteCB_Ball_Arc. // These do not seem to get run. static void SpriteCB_BallThrow(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { u16 ballId; u8 taskId = sprite->oam.affineParam; u8 opponentBattler = gTasks[taskId].tOpponentBattler; u8 noOfShakes = gTasks[taskId].tThrowId; StartSpriteAnim(sprite, 1); sprite->affineAnimPaused = TRUE; sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->x2 = 0; sprite->y2 = 0; sprite->data[5] = 0; ballId = ItemIdToBallId(GetBattlerPokeballItemId(opponentBattler)); AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId); sprite->data[0] = LaunchBallFadeMonTask(FALSE, opponentBattler, 14, ballId); sprite->sBattler = opponentBattler; sprite->data[7] = noOfShakes; DestroyTask(taskId); sprite->callback = SpriteCB_BallThrow_ReachMon; } } #undef tFrames #undef tPan #undef tThrowId #undef tBattler #undef tOpponentBattler static void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite) { sprite->callback = SpriteCB_BallThrow_StartShrinkMon; } static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite) { if (++sprite->data[5] == 10) { sprite->data[5] = 0; sprite->callback = SpriteCB_BallThrow_ShrinkMon; StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_RETURN); AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]); gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0; } } static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite) { sprite->data[5]++; if (sprite->data[5] == 11) PlaySE(SE_BALL_TRADE); if (gSprites[gBattlerSpriteIds[sprite->sBattler]].affineAnimEnded) { StartSpriteAnim(sprite, 2); gSprites[gBattlerSpriteIds[sprite->sBattler]].invisible = TRUE; sprite->data[5] = 0; sprite->callback = SpriteCB_BallThrow_Close; } else { gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] += 0x60; gSprites[gBattlerSpriteIds[sprite->sBattler]].y2 = -gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] >> 8; } } static void SpriteCB_BallThrow_Close(struct Sprite *sprite) { if (sprite->animEnded) { sprite->data[5]++; if (sprite->data[5] == 1) { sprite->data[3] = 0; sprite->data[4] = 32; sprite->data[5] = 0; sprite->y += Cos(0, 32); sprite->y2 = -Cos(0, sprite->data[4]); sprite->callback = SpriteCB_BallThrow_FallToGround; } } } static void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite) { bool8 r5 = FALSE; switch (sprite->data[3] & 0xFF) { case 0: sprite->y2 = -Cos(sprite->data[5], sprite->data[4]); sprite->data[5] += 4 + (sprite->data[3] >> 8); if (sprite->data[5] >= 64) { sprite->data[4] -= 10; sprite->data[3] += 0x101; if (sprite->data[3] >> 8 == 4) r5 = TRUE; switch (sprite->data[3] >> 8) { case 1: PlaySE(SE_BALL_BOUNCE_1); break; case 2: PlaySE(SE_BALL_BOUNCE_2); break; case 3: PlaySE(SE_BALL_BOUNCE_3); break; default: PlaySE(SE_BALL_BOUNCE_4); break; } } break; case 1: sprite->y2 = -Cos(sprite->data[5], sprite->data[4]); sprite->data[5] -= 4 + (sprite->data[3] >> 8); if (sprite->data[5] <= 0) { sprite->data[5] = 0; sprite->data[3] &= 0xFF00; } break; } if (r5) { sprite->data[3] = 0; sprite->y += Cos(64, 32); sprite->y2 = 0; if (sprite->data[7] == 0) { sprite->callback = SpriteCB_ReleaseMonFromBall; } else { sprite->callback = SpriteCB_BallThrow_StartShakes; sprite->data[4] = 1; sprite->data[5] = 0; } } } static void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite) { sprite->data[3]++; if (sprite->data[3] == 31) { sprite->data[3] = 0; sprite->affineAnimPaused = TRUE; StartSpriteAffineAnim(sprite, 1); sprite->callback = SpriteCB_BallThrow_Shake; PlaySE(SE_BALL); } } static void SpriteCB_BallThrow_Shake(struct Sprite *sprite) { switch (sprite->data[3] & 0xFF) { case 0: case 2: sprite->x2 += sprite->data[4]; sprite->data[5] += sprite->data[4]; sprite->affineAnimPaused = FALSE; if (sprite->data[5] > 3 || sprite->data[5] < -3) { sprite->data[3]++; sprite->data[5] = 0; } break; case 1: sprite->data[5]++; if (sprite->data[5] == 1) { sprite->data[5] = 0; sprite->data[4] = -sprite->data[4]; sprite->data[3]++; sprite->affineAnimPaused = FALSE; if (sprite->data[4] < 0) ChangeSpriteAffineAnim(sprite, 2); else ChangeSpriteAffineAnim(sprite, 1); } else { sprite->affineAnimPaused = TRUE; } break; case 3: sprite->data[3] += 0x100; if (sprite->data[3] >> 8 == sprite->data[7]) { sprite->callback = SpriteCB_ReleaseMonFromBall; } else { if (sprite->data[7] == 4 && sprite->data[3] >> 8 == 3) { sprite->callback = SpriteCB_BallThrow_StartCaptureMon; sprite->affineAnimPaused = TRUE; } else { sprite->data[3]++; sprite->affineAnimPaused = TRUE; } } break; case 4: default: sprite->data[5]++; if (sprite->data[5] == 31) { sprite->data[5] = 0; sprite->data[3] &= 0xFF00; StartSpriteAffineAnim(sprite, 3); if (sprite->data[4] < 0) StartSpriteAffineAnim(sprite, 2); else StartSpriteAffineAnim(sprite, 1); PlaySE(SE_BALL); } break; } } #define tCryTaskSpecies data[0] #define tCryTaskPan data[1] #define tCryTaskWantedCry data[2] #define tCryTaskMonPtr1 data[3] #define tCryTaskMonPtr2 data[4] #define tCryTaskFrames data[10] #define tCryTaskState data[15] static void Task_PlayCryWhenReleasedFromBall(u8 taskId) { u8 wantedCry = gTasks[taskId].tCryTaskWantedCry; s8 pan = gTasks[taskId].tCryTaskPan; u16 species = gTasks[taskId].tCryTaskSpecies; struct Pokemon *mon = (void *)(u32)((gTasks[taskId].tCryTaskMonPtr1 << 16) | (u16)(gTasks[taskId].tCryTaskMonPtr2)); switch (gTasks[taskId].tCryTaskState) { case 0: default: if (gTasks[taskId].data[8] < 3) gTasks[taskId].data[8]++; else gTasks[taskId].tCryTaskState = wantedCry + 1; break; case 1: // Play single cry if (ShouldPlayNormalMonCry(mon) == TRUE) PlayCry_ByMode(species, pan, CRY_MODE_NORMAL); else PlayCry_ByMode(species, pan, CRY_MODE_WEAK); DestroyTask(taskId); break; case 2: StopCryAndClearCrySongs(); gTasks[taskId].tCryTaskFrames = 3; gTasks[taskId].tCryTaskState = 20; break; case 20: if (gTasks[taskId].tCryTaskFrames == 0) { // Play first doubles cry if (ShouldPlayNormalMonCry(mon) == TRUE) PlayCry_ReleaseDouble(species, pan, CRY_MODE_DOUBLES); else PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK_DOUBLES); DestroyTask(taskId); } else { gTasks[taskId].tCryTaskFrames--; } break; case 3: gTasks[taskId].tCryTaskFrames = 6; gTasks[taskId].tCryTaskState = 30; break; case 30: if (gTasks[taskId].tCryTaskFrames != 0) { gTasks[taskId].tCryTaskFrames--; break; } gTasks[taskId].tCryTaskState++; // fall through case 31: if (!IsCryPlayingOrClearCrySongs()) { StopCryAndClearCrySongs(); gTasks[taskId].tCryTaskFrames = 3; gTasks[taskId].tCryTaskState++; } break; case 32: if (gTasks[taskId].tCryTaskFrames != 0) { gTasks[taskId].tCryTaskFrames--; break; } // Play second doubles cry if (ShouldPlayNormalMonCry(mon) == TRUE) PlayCry_ReleaseDouble(species, pan, CRY_MODE_NORMAL); else PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK); DestroyTask(taskId); break; } } static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) { u8 battlerId = sprite->sBattler; u32 ballId; StartSpriteAnim(sprite, 1); ballId = ItemIdToBallId(GetBattlerPokeballItemId(battlerId)); AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId); sprite->data[0] = LaunchBallFadeMonTask(TRUE, sprite->sBattler, 14, ballId); sprite->callback = HandleBallAnimEnd; if (gMain.inBattle) { struct Pokemon *mon; u16 species; s8 pan; u16 wantedCryCase; u8 taskId; if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; pan = 25; } else { mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; pan = -25; } species = GetMonData(mon, MON_DATA_SPECIES); if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (IsBGMPlaying()) m4aMPlayStop(&gMPlayInfo_BGM); } else { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 128); } } if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->introAnimActive) wantedCryCase = 0; else if (battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) wantedCryCase = 1; else wantedCryCase = 2; taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3); gTasks[taskId].tCryTaskSpecies = species; gTasks[taskId].tCryTaskPan = pan; gTasks[taskId].tCryTaskWantedCry = wantedCryCase; gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 16; gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon); gTasks[taskId].tCryTaskState = 0; } StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_EMERGE); AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]); gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000; } #undef tCryTaskSpecies #undef tCryTaskPan #undef tCryTaskWantedCry #undef tCryTaskMonPtr1 #undef tCryTaskMonPtr2 #undef tCryTaskFrames #undef tCryTaskState static void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite) { sprite->animPaused = TRUE; sprite->callback = SpriteCB_BallThrow_CaptureMon; sprite->data[3] = 0; sprite->data[4] = 0; sprite->data[5] = 0; } static void HandleBallAnimEnd(struct Sprite *sprite) { bool8 affineAnimEnded = FALSE; u8 battlerId = sprite->sBattler; gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; if (sprite->animEnded) sprite->invisible = TRUE; if (gSprites[gBattlerSpriteIds[battlerId]].affineAnimEnded) { StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], BATTLER_AFFINE_NORMAL); affineAnimEnded = TRUE; } else { gSprites[gBattlerSpriteIds[battlerId]].data[1] -= 288; gSprites[gBattlerSpriteIds[battlerId]].y2 = gSprites[gBattlerSpriteIds[battlerId]].data[1] >> 8; } if (sprite->animEnded && affineAnimEnded) { s32 i, doneBattlers; gSprites[gBattlerSpriteIds[battlerId]].y2 = 0; gDoingBattleAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[battlerId].ballAnimActive = FALSE; FreeSpriteOamMatrix(sprite); DestroySprite(sprite); for (doneBattlers = 0, i = 0; i < MAX_BATTLERS_COUNT; i++) { if (gBattleSpritesDataPtr->healthBoxesData[i].ballAnimActive == FALSE) doneBattlers++; } if (doneBattlers == MAX_BATTLERS_COUNT) { for (i = 0; i < POKEBALL_COUNT; i++) FreeBallGfx(i); } } } static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite) { u8 battlerId = sprite->sBattler; sprite->data[4]++; if (sprite->data[4] == 40) { return; } else if (sprite->data[4] == 95) { gDoingBattleAnim = FALSE; m4aMPlayAllStop(); PlaySE(MUS_CAUGHT_INTRO); } else if (sprite->data[4] == 315) { FreeOamMatrix(gSprites[gBattlerSpriteIds[sprite->sBattler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]); DestroySpriteAndFreeResources(sprite); if (gMain.inBattle) gBattleSpritesDataPtr->healthBoxesData[battlerId].ballAnimActive = FALSE; } } static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite) { sprite->data[0] = 25; sprite->data[2] = GetBattlerSpriteCoord(sprite->sBattler, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(sprite->sBattler, BATTLER_COORD_Y_PIC_OFFSET) + 24; sprite->data[5] = -30; sprite->oam.affineParam = sprite->sBattler; InitAnimArcTranslation(sprite); sprite->callback = SpriteCB_PlayerMonSendOut_2; } #define HIBYTE(x) (((x) >> 8) & 0xFF) static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite) { u32 r6; u32 r7; if (HIBYTE(sprite->data[7]) >= 35 && HIBYTE(sprite->data[7]) < 80) { s16 r4; if ((sprite->oam.affineParam & 0xFF00) == 0) { r6 = sprite->data[1] & 1; r7 = sprite->data[2] & 1; sprite->data[1] = ((sprite->data[1] / 3) & ~1) | r6; sprite->data[2] = ((sprite->data[2] / 3) & ~1) | r7; StartSpriteAffineAnim(sprite, 4); } r4 = sprite->data[0]; AnimTranslateLinear(sprite); sprite->data[7] += sprite->sBattler / 3; sprite->y2 += Sin(HIBYTE(sprite->data[7]), sprite->data[5]); sprite->oam.affineParam += 0x100; if ((sprite->oam.affineParam >> 8) % 3 != 0) sprite->data[0] = r4; else sprite->data[0] = r4 - 1; if (HIBYTE(sprite->data[7]) >= 80) { r6 = sprite->data[1] & 1; r7 = sprite->data[2] & 1; sprite->data[1] = ((sprite->data[1] * 3) & ~1) | r6; sprite->data[2] = ((sprite->data[2] * 3) & ~1) | r7; } } else { if (TranslateAnimHorizontalArc(sprite)) { sprite->x += sprite->x2; sprite->y += sprite->y2; sprite->y2 = 0; sprite->x2 = 0; sprite->sBattler = sprite->oam.affineParam & 0xFF; sprite->data[0] = 0; if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive && sprite->sBattler == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)) sprite->callback = SpriteCB_ReleaseMon2FromBall; else sprite->callback = SpriteCB_ReleaseMonFromBall; StartSpriteAffineAnim(sprite, 0); } } } static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite) { if (sprite->data[0]++ > 24) { sprite->data[0] = 0; sprite->callback = SpriteCB_ReleaseMonFromBall; } } static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite) { sprite->data[0]++; if (sprite->data[0] > 15) { sprite->data[0] = 0; if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive && sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)) sprite->callback = SpriteCB_ReleaseMon2FromBall; else sprite->callback = SpriteCB_ReleaseMonFromBall; } } #undef sBattler static u8 AnimateBallOpenParticlesForPokeball(u8 x, u8 y, u8 kindOfStars, u8 subpriority) { return AnimateBallOpenParticles(x, y, kindOfStars, subpriority, BALL_POKE); } static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 spritePalNum, u32 selectedPalettes) { return LaunchBallFadeMonTask(unFadeLater, spritePalNum, selectedPalettes, BALL_POKE); } // Sprite data for the pokeball #define sMonSpriteId data[0] #define sDelay data[1] #define sMonPalNum data[2] #define sFadePalsLo data[3] #define sFadePalsHi data[4] #define sFinalMonX data[5] #define sFinalMonY data[6] #define sTrigIdx data[7] // Pokeball in Oak intro, and when receiving via trade void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes) { u8 spriteId; LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]); LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]); spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subpriortiy); gSprites[spriteId].sMonSpriteId = monSpriteId; gSprites[spriteId].sFinalMonX = gSprites[monSpriteId].x; gSprites[spriteId].sFinalMonY = gSprites[monSpriteId].y; gSprites[monSpriteId].x = x; gSprites[monSpriteId].y = y; gSprites[spriteId].sDelay = delay; gSprites[spriteId].sMonPalNum = monPalNum; gSprites[spriteId].sFadePalsLo = fadePalettes; gSprites[spriteId].sFadePalsHi = fadePalettes >> 16; gSprites[spriteId].oam.priority = oamPriority; gSprites[spriteId].callback = SpriteCB_PokeballReleaseMon; gSprites[monSpriteId].invisible = TRUE; } static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite) { if (sprite->sDelay == 0) { u8 subpriority; u8 spriteId = sprite->sMonSpriteId; u8 monPalNum = sprite->sMonPalNum; u32 selectedPalettes = (u16)sprite->sFadePalsLo | ((u16)sprite->sFadePalsHi << 16); if (sprite->subpriority != 0) subpriority = sprite->subpriority - 1; else subpriority = 0; StartSpriteAnim(sprite, 1); AnimateBallOpenParticlesForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, subpriority); // sDelay re-used to store task id but never read sprite->sDelay = LaunchBallFadeMonTaskForPokeball(TRUE, monPalNum, selectedPalettes); sprite->callback = SpriteCB_ReleasedMonFlyOut; gSprites[spriteId].invisible = FALSE; StartSpriteAffineAnim(&gSprites[spriteId], BATTLER_AFFINE_EMERGE); AnimateSprite(&gSprites[spriteId]); gSprites[spriteId].data[1] = 0x1000; sprite->sTrigIdx = 0; } else { sprite->sDelay--; } } static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite) { bool8 emergeAnimFinished = FALSE; bool8 atFinalPosition = FALSE; u8 monSpriteId = sprite->sMonSpriteId; u16 x, y; if (sprite->animEnded) sprite->invisible = TRUE; if (gSprites[monSpriteId].affineAnimEnded) { StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_NORMAL); emergeAnimFinished = TRUE; } x = (sprite->sFinalMonX - sprite->x) * sprite->sTrigIdx / 128 + sprite->x; y = (sprite->sFinalMonY - sprite->y) * sprite->sTrigIdx / 128 + sprite->y; gSprites[monSpriteId].x = x; gSprites[monSpriteId].y = y; if (sprite->sTrigIdx < 128) { s16 sine = -(gSineTable[(u8)sprite->sTrigIdx] / 8); sprite->sTrigIdx += 4; gSprites[monSpriteId].x2 = sine; gSprites[monSpriteId].y2 = sine; } else { gSprites[monSpriteId].x = sprite->sFinalMonX; gSprites[monSpriteId].y = sprite->sFinalMonY; gSprites[monSpriteId].x2 = 0; gSprites[monSpriteId].y2 = 0; atFinalPosition = TRUE; } if (sprite->animEnded && emergeAnimFinished && atFinalPosition) { DestroySpriteAndFreeResources(sprite); } } #undef sFinalMonX #undef sFinalMonY #undef sTrigIdx #define sTimer data[5] u8 CreateTradePokeballSprite(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 delay, u32 fadePalettes) { u8 spriteId; LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]); LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]); spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subPriority); gSprites[spriteId].sMonSpriteId = monSpriteId; gSprites[spriteId].sDelay = delay; gSprites[spriteId].sMonPalNum = monPalNum; gSprites[spriteId].sFadePalsLo = fadePalettes; gSprites[spriteId].sFadePalsHi = fadePalettes >> 16; gSprites[spriteId].oam.priority = oamPriority; gSprites[spriteId].callback = SpriteCB_TradePokeball; return spriteId; } static void SpriteCB_TradePokeball(struct Sprite *sprite) { if (sprite->sDelay == 0) { u8 subpriority; u8 monSpriteId = sprite->sMonSpriteId; u8 monPalNum = sprite->sMonPalNum; u32 selectedPalettes = (u16)sprite->sFadePalsLo | ((u16)sprite->sFadePalsHi << 16); if (sprite->subpriority != 0) subpriority = sprite->subpriority - 1; else subpriority = 0; StartSpriteAnim(sprite, 1); AnimateBallOpenParticlesForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, subpriority); // sDelay re-used to store task id but never read sprite->sDelay = LaunchBallFadeMonTaskForPokeball(TRUE, monPalNum, selectedPalettes); sprite->callback = SpriteCB_TradePokeballSendOff; #ifdef BUGFIX // FIX: If this is used on a sprite that has previously had an affine animation, it will not // play the shrink anim properly due to being paused. gSprites[monSpriteId].affineAnimPaused = FALSE; #endif // BUGFIX StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_RETURN); AnimateSprite(&gSprites[monSpriteId]); gSprites[monSpriteId].data[1] = 0; } else { sprite->sDelay--; } } static void SpriteCB_TradePokeballSendOff(struct Sprite *sprite) { u8 monSpriteId; sprite->sTimer++; if (sprite->sTimer == 11) PlaySE(SE_BALL_TRADE); monSpriteId = sprite->sMonSpriteId; if (gSprites[monSpriteId].affineAnimEnded) { StartSpriteAnim(sprite, 2); gSprites[monSpriteId].invisible = TRUE; sprite->sTimer = 0; sprite->callback = SpriteCB_TradePokeballEnd; } else { gSprites[monSpriteId].data[1] += 96; gSprites[monSpriteId].y2 = -gSprites[monSpriteId].data[1] >> 8; } } static void SpriteCB_TradePokeballEnd(struct Sprite *sprite) { if (sprite->animEnded) sprite->callback = SpriteCallbackDummy; } #undef sMonSpriteId #undef sDelay #undef sMonPalNum #undef sFadePalsLo #undef sFadePalsHi #undef sTimer // Unreferenced in RSE, but used here, possibly by mistake. void DestroySpriteAndFreeResources_Ball(struct Sprite *sprite) { DestroySpriteAndFreeResources(sprite); } #define sSpeedX data[0] #define sSpeedY data[1] #define sDelayTimer data[1] void StartHealthboxSlideIn(u8 battlerId) { struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[battlerId]]; healthboxSprite->sSpeedX = 5; healthboxSprite->sSpeedY = 0; healthboxSprite->x2 = 0x73; healthboxSprite->y2 = 0; healthboxSprite->callback = SpriteCB_HealthboxSlideIn; if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { healthboxSprite->sSpeedX = -healthboxSprite->sSpeedX; healthboxSprite->sSpeedY = -healthboxSprite->sSpeedY; healthboxSprite->x2 = -healthboxSprite->x2; healthboxSprite->y2 = -healthboxSprite->y2; } gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]); if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT) healthboxSprite->callback = SpriteCB_HealthboxSlideInDelayed; } static void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite) { sprite->sDelayTimer++; if (sprite->sDelayTimer == 20) { sprite->sDelayTimer = 0; sprite->callback = SpriteCB_HealthboxSlideIn; } } static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite) { sprite->x2 -= sprite->sSpeedX; sprite->y2 -= sprite->sSpeedY; if (sprite->x2 == 0 && sprite->y2 == 0) sprite->callback = SpriteCallbackDummy; } #undef sSpeedX #undef sSpeedY #undef sDelayTimer void DoHitAnimHealthboxEffect(u8 battlerId) { u8 spriteId; spriteId = CreateInvisibleSpriteWithCallback(SpriteCB_HitAnimHealthoxEffect); gSprites[spriteId].data[0] = 1; gSprites[spriteId].data[1] = gHealthboxSpriteIds[battlerId]; gSprites[spriteId].callback = SpriteCB_HitAnimHealthoxEffect; } static void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite) { u8 r1 = sprite->data[1]; gSprites[r1].y2 = sprite->data[0]; sprite->data[0] = -sprite->data[0]; sprite->data[2]++; if (sprite->data[2] == 21) { gSprites[r1].x2 = 0; gSprites[r1].y2 = 0; DestroySprite(sprite); } } void LoadBallGfx(u8 ballId) { u16 var; if (GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag) == TAG_NONE) { LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[ballId]); LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[ballId]); } switch (ballId) { case BALL_DIVE: case BALL_LUXURY: case BALL_PREMIER: break; default: var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag); LZDecompressVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32)); break; } } void FreeBallGfx(u8 ballId) { FreeSpriteTilesByTag(gBallSpriteSheets[ballId].tag); FreeSpritePaletteByTag(gBallSpritePalettes[ballId].tag); } static u16 GetBattlerPokeballItemId(u8 battlerId) { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); else return GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); } ================================================ FILE: src/pokedex.c ================================================ #include "global.h" #include "pokedex.h" #include "pokedex_screen.h" // Unused const u8 *GetPokedexCategoryName(u16 dexNum) { return gPokedexEntries[dexNum].categoryName; } u16 GetPokedexHeightWeight(u16 dexNum, u8 data) { switch (data) { case 0: // height return gPokedexEntries[dexNum].height; case 1: // weight return gPokedexEntries[dexNum].weight; default: return 1; } } s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID) { return DexScreen_GetSetPokedexFlag(nationalDexNo, caseID, 0); } u16 GetNationalPokedexCount(u8 caseID) { u16 count = 0; u32 i; for (i = 0; i < NATIONAL_DEX_COUNT; i++) { switch (caseID) { case FLAG_GET_SEEN: if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) count++; break; case FLAG_GET_CAUGHT: if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) count++; break; } } return count; } /* u16 GetHoennPokedexCount(u8 caseID) { u16 count = 0; u16 i; for (i = 0; i < HOENN_DEX_COUNT; i++) { switch (caseID) { case FLAG_GET_SEEN: if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_SEEN)) count++; break; case FLAG_GET_CAUGHT: if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) count++; break; } } return count; } */ u16 GetKantoPokedexCount(u8 caseID) { u16 count = 0; u32 i; for (i = 0; i < KANTO_DEX_COUNT; i++) { switch (caseID) { case FLAG_GET_SEEN: if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) count++; break; case FLAG_GET_CAUGHT: if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) count++; break; } } return count; } u16 GetExtendedPokedexCount(u8 caseID) { u16 count = 0; u32 i; for (i = 0; i < EXTENDED_DEX_COUNT; i++) { switch (caseID) { case FLAG_GET_SEEN: if (GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), FLAG_GET_SEEN)) count++; break; case FLAG_GET_CAUGHT: if (GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), FLAG_GET_CAUGHT)) count++; break; } } return count; } bool16 HasAllHoennMons(void) { u32 i; // -2 excludes Jirachi and Deoxys for (i = 0; i < HOENN_DEX_COUNT - 2; i++) { if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) return FALSE; } return TRUE; } bool16 HasAllExtendedMons(void) { u32 i; for (i = 0; i < EXTENDED_DEX_COUNT - 2; i++) { if (!GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), FLAG_GET_CAUGHT)) return FALSE; } return TRUE; } bool16 HasAllKantoMons(void) { u32 i; // -1 excludes Mew for (i = 0; i < KANTO_DEX_COUNT - 1; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) return FALSE; } return TRUE; } bool16 HasAllMons(void) { u32 i; // -1 excludes Mew for (i = 0; i < KANTO_DEX_COUNT - 1; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) return FALSE; } // -3 excludes Lugia, Ho-Oh, and Celebi for (i = KANTO_DEX_COUNT; i < JOHTO_DEX_COUNT - 3; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) return FALSE; } // -2 excludes Jirachi and Deoxys for (i = JOHTO_DEX_COUNT; i < NATIONAL_DEX_COUNT - 2; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) return FALSE; } return TRUE; } bool16 HasNationalMon(void) { // checks if the player has a mon not in the Extended Dex u32 i; for (i = EXTENDED_DEX_COUNT + 1; i < NATIONAL_DEX_COUNT; i++) { if (GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), FLAG_GET_CAUGHT)) return TRUE; } return FALSE; } bool16 HasAllKantoMonsNew(void) { // separate from the old one because of link Trainer cards // this one includes Mew. u32 i; for (i = 0; i < KANTO_DEX_COUNT; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) return FALSE; } return TRUE; } bool16 HasAllMonsNew(void) { // separate from the old one because of link Trainer cards // this one includes obtainable mythicals. u32 i; for (i = 0; i < NATIONAL_DEX_HO_OH; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) return FALSE; } for (i = NATIONAL_DEX_CELEBI; i < NATIONAL_DEX_RAYQUAZA; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) return FALSE; } if (!GetSetPokedexFlag(NATIONAL_DEX_DEOXYS, FLAG_GET_CAUGHT)) return FALSE; return TRUE; } ================================================ FILE: src/pokedex_area_markers.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "task.h" #include "wild_pokemon_area.h" #include "pokedex_area_markers.h" #include "pokedex.h" /* Controls the red ellipse markers that appear on the pokedex maps to show where a species is found. All of the markers together are a single sprite, with each individual marker being represented by a subsprite of the necessary size and shape. The data about each area marker is in sAreaMarkers, each specified by a DEX_AREA constant. A MAPSEC is associated with a DEX_AREA constant by a series of arrays in wild_pokemon_area.c */ struct PAM_TaskData { struct SubspriteTable subsprites; void *buffer; u8 unused; u8 spriteId; u16 tilesTag; u16 paletteTag; // Never read }; enum { MARKER_CIRCULAR, MARKER_SMALL_H, MARKER_SMALL_V, MARKER_MED_H, MARKER_MED_V, MARKER_LARGE_H, MARKER_LARGE_V, }; static const u16 sMarkerPal[] = INCBIN_U16("graphics/pokedex/area_markers/marker.gbapal"); static const u32 sMarkerTiles[] = INCBIN_U32("graphics/pokedex/area_markers/marker.4bpp.lz"); static const struct Subsprite sSubsprite_Circular = { .size = SPRITE_SIZE(8x8), .shape = SPRITE_SHAPE(8x8), .priority = 1, .tileOffset = 0 }; static const struct Subsprite sSubsprite_SmallHorizontal = { .size = SPRITE_SIZE(16x8), .shape = SPRITE_SHAPE(16x8), .priority = 1, .tileOffset = 1 }; static const struct Subsprite sSubsprite_SmallVertical = { .size = SPRITE_SIZE(8x16), .shape = SPRITE_SHAPE(8x16), .priority = 1, .tileOffset = 3 }; static const struct Subsprite sSubsprite_MediumHorizontal = { .size = SPRITE_SIZE(32x16), .shape = SPRITE_SHAPE(32x16), .priority = 1, .tileOffset = 5 }; static const struct Subsprite sSubsprite_MediumVertical = { .size = SPRITE_SIZE(16x32), .shape = SPRITE_SHAPE(16x32), .priority = 1, .tileOffset = 13 }; static const struct Subsprite sSubsprite_LargeHorizontal = { .size = SPRITE_SIZE(32x16), .shape = SPRITE_SHAPE(32x16), .priority = 1, .tileOffset = 21 }; static const struct Subsprite sSubsprite_LargeVertical = { .size = SPRITE_SIZE(16x32), .shape = SPRITE_SHAPE(16x32), .priority = 1, .tileOffset = 29 }; static const struct Subsprite *const sSubsprites[] = { [MARKER_CIRCULAR] = &sSubsprite_Circular, [MARKER_SMALL_H] = &sSubsprite_SmallHorizontal, [MARKER_SMALL_V] = &sSubsprite_SmallVertical, [MARKER_MED_H] = &sSubsprite_MediumHorizontal, [MARKER_MED_V] = &sSubsprite_MediumVertical, [MARKER_LARGE_H] = &sSubsprite_LargeHorizontal, [MARKER_LARGE_V] = &sSubsprite_LargeVertical }; static const s8 sAreaMarkers[][4] = { // Marker, x, y [DEX_AREA_NONE] = {}, [DEX_AREA_PALLET_TOWN] = { MARKER_CIRCULAR, 54, 44 }, [DEX_AREA_VIRIDIAN_CITY] = { MARKER_CIRCULAR, 54, 28 }, [DEX_AREA_PEWTER_CITY] = { MARKER_CIRCULAR, 54, 12 }, [DEX_AREA_CERULEAN_CITY] = { MARKER_CIRCULAR, 92, 12 }, [DEX_AREA_LAVENDER_TOWN] = { MARKER_CIRCULAR, 110, 24 }, [DEX_AREA_VERMILION_CITY] = { MARKER_CIRCULAR, 92, 36 }, [DEX_AREA_CELADON_CITY] = { MARKER_CIRCULAR, 76, 24 }, [DEX_AREA_FUCHSIA_CITY] = { MARKER_CIRCULAR, 78, 52 }, [DEX_AREA_CINNABAR_ISLAND] = { MARKER_CIRCULAR, 54, 62 }, [DEX_AREA_INDIGO_PLATEAU] = { MARKER_CIRCULAR, 42, 2 }, [DEX_AREA_SAFFRON_CITY] = { MARKER_CIRCULAR, 92, 24 }, [DEX_AREA_ROUTE_1] = { MARKER_SMALL_V, 54, 32 }, [DEX_AREA_ROUTE_2] = { MARKER_SMALL_V, 54, 16 }, [DEX_AREA_ROUTE_3] = { MARKER_SMALL_H, 61, 12 }, [DEX_AREA_ROUTE_4] = { MARKER_SMALL_H, 77, 12 }, [DEX_AREA_ROUTE_5] = { MARKER_CIRCULAR, 92, 18 }, [DEX_AREA_ROUTE_6] = { MARKER_CIRCULAR, 92, 30 }, [DEX_AREA_ROUTE_7] = { MARKER_CIRCULAR, 84, 24 }, [DEX_AREA_ROUTE_8] = { MARKER_SMALL_H, 98, 24 }, [DEX_AREA_ROUTE_9] = { MARKER_SMALL_H, 98, 12 }, [DEX_AREA_ROUTE_10] = { MARKER_SMALL_V, 110, 12 }, [DEX_AREA_ROUTE_11] = { MARKER_SMALL_H, 98, 36 }, [DEX_AREA_ROUTE_12] = { MARKER_MED_V, 106, 25 }, [DEX_AREA_ROUTE_13] = { MARKER_SMALL_H, 100, 46 }, [DEX_AREA_ROUTE_14] = { MARKER_SMALL_V, 94, 45 }, [DEX_AREA_ROUTE_15] = { MARKER_SMALL_H, 85, 52 }, [DEX_AREA_ROUTE_16] = { MARKER_CIRCULAR, 68, 24 }, [DEX_AREA_ROUTE_17] = { MARKER_MED_V, 62, 26 }, [DEX_AREA_ROUTE_18] = { MARKER_SMALL_H, 64, 52 }, [DEX_AREA_ROUTE_19] = { MARKER_CIRCULAR, 78, 60 }, [DEX_AREA_ROUTE_20] = { MARKER_MED_H, 55, 58 }, [DEX_AREA_ROUTE_21] = { MARKER_SMALL_V, 54, 50 }, [DEX_AREA_ROUTE_22] = { MARKER_SMALL_H, 40, 28 }, [DEX_AREA_ROUTE_23] = { MARKER_MED_V, 38, 4 }, [DEX_AREA_ROUTE_24] = { MARKER_CIRCULAR, 92, 4 }, [DEX_AREA_ROUTE_25] = { MARKER_MED_H, 90, -2 }, [DEX_AREA_VIRIDIAN_FOREST] = { MARKER_CIRCULAR, 51, 20 }, [DEX_AREA_DIGLETTS_CAVE] = { MARKER_SMALL_H, 61, 18 }, [DEX_AREA_MT_MOON] = { MARKER_CIRCULAR, 72, 8 }, [DEX_AREA_CERULEAN_CAVE] = { MARKER_CIRCULAR, 87, 8 }, [DEX_AREA_ROCK_TUNNEL] = { MARKER_CIRCULAR, 112, 14 }, [DEX_AREA_POWER_PLANT] = { MARKER_CIRCULAR, 113, 20 }, [DEX_AREA_POKEMON_TOWER] = { MARKER_CIRCULAR, 113, 25 }, [DEX_AREA_SAFARI_ZONE] = { MARKER_SMALL_H, 78, 44 }, [DEX_AREA_SEAFOAM_ISLANDS] = { MARKER_CIRCULAR, 65, 60 }, [DEX_AREA_POKEMON_MANSION] = { MARKER_CIRCULAR, 52, 62 }, [DEX_AREA_VICTORY_ROAD] = { MARKER_CIRCULAR, 45, 7 }, [DEX_AREA_ONE_ISLAND] = { MARKER_CIRCULAR, 10, 10 }, [DEX_AREA_TWO_ISLAND] = { MARKER_CIRCULAR, 12, 35 }, [DEX_AREA_THREE_ISLAND] = { MARKER_CIRCULAR, 14, 52 }, [DEX_AREA_FOUR_ISLAND] = { MARKER_CIRCULAR, 12, 84 }, [DEX_AREA_FIVE_ISLAND] = { MARKER_CIRCULAR, 45, 81 }, [DEX_AREA_SIX_ISLAND] = { MARKER_CIRCULAR, 76, 84 }, [DEX_AREA_SEVEN_ISLAND] = { MARKER_CIRCULAR, 104, 82 }, [DEX_AREA_KINDLE_ROAD] = { MARKER_SMALL_V, 14, 2 }, [DEX_AREA_TREASURE_BEACH] = { MARKER_CIRCULAR, 10, 15 }, [DEX_AREA_CAPE_BRINK] = { MARKER_CIRCULAR, 12, 29 }, [DEX_AREA_BOND_BRIDGE] = { MARKER_SMALL_H, 2, 52 }, [DEX_AREA_THREE_ISLE_PATH] = { MARKER_SMALL_H, 12, 56 }, [DEX_AREA_RESORT_GORGEOUS] = { MARKER_SMALL_H, 44, 74 }, [DEX_AREA_WATER_LABYRINTH] = { MARKER_SMALL_H, 36, 78 }, [DEX_AREA_FIVE_ISLE_MEADOW] = { MARKER_SMALL_V, 48, 80 }, [DEX_AREA_MEMORIAL_PILLAR] = { MARKER_SMALL_V, 52, 86 }, [DEX_AREA_OUTCAST_ISLAND] = { MARKER_CIRCULAR, 72, 74 }, [DEX_AREA_GREEN_PATH] = { MARKER_SMALL_H, 72, 78 }, [DEX_AREA_WATER_PATH] = { MARKER_SMALL_V, 81, 80 }, [DEX_AREA_RUIN_VALLEY] = { MARKER_CIRCULAR, 76, 92 }, [DEX_AREA_TRAINER_TOWER] = { MARKER_CIRCULAR, 104, 75 }, [DEX_AREA_CANYON_ENTRANCE] = { MARKER_CIRCULAR, 104, 86 }, [DEX_AREA_SEVAULT_CANYON] = { MARKER_SMALL_V, 108, 83 }, [DEX_AREA_TANOBY_RUINS] = { MARKER_MED_H, 96, 90 }, [DEX_AREA_MT_EMBER] = { MARKER_CIRCULAR, 14, 1 }, [DEX_AREA_BERRY_FOREST] = { MARKER_CIRCULAR, 5, 52 }, [DEX_AREA_ICEFALL_CAVE] = { MARKER_CIRCULAR, 13, 80 }, [DEX_AREA_LOST_CAVE] = { MARKER_CIRCULAR, 54, 74 }, [DEX_AREA_ALTERING_CAVE] = { MARKER_CIRCULAR, 69, 73 }, [DEX_AREA_PATTERN_BUSH] = { MARKER_CIRCULAR, 76, 77 }, [DEX_AREA_DOTTED_HOLE] = { MARKER_CIRCULAR, 73, 95 }, [DEX_AREA_TANOBY_CHAMBER] = { MARKER_MED_H, 96, 90 }, }; static void Task_ShowAreaMarkers(u8 taskId) { struct PAM_TaskData * data = (void *)gTasks[taskId].data; gSprites[data->spriteId].invisible = FALSE; } u8 CreatePokedexAreaMarkers(u16 species, u16 tilesTag, u8 palIdx, u8 y) { struct SpriteTemplate spriteTemplate; struct CompressedSpriteSheet spriteSheet; u8 taskId; struct PAM_TaskData * data; struct Subsprite * subsprites; // Load gfx spriteSheet.data = sMarkerTiles; spriteSheet.size = 0x4A0; spriteSheet.tag = tilesTag; LoadCompressedSpriteSheet(&spriteSheet); LoadPalette(sMarkerPal, OBJ_PLTT_ID(palIdx), sizeof(sMarkerPal)); // Get marker subsprites taskId = CreateTask(Task_ShowAreaMarkers, 0); data = (void *)gTasks[taskId].data; data->unused = 0; data->tilesTag = tilesTag; data->paletteTag = TAG_NONE; subsprites = Alloc(120 * sizeof(struct Subsprite)); data->buffer = subsprites; data->subsprites.subsprites = subsprites; data->subsprites.subspriteCount = GetSpeciesPokedexAreaMarkers(species, subsprites); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BD); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8)); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_CLR); // Set marker subsprites on full sprite spriteTemplate = gDummySpriteTemplate; spriteTemplate.tileTag = tilesTag; data->spriteId = CreateSprite(&spriteTemplate, 104, y + 32, 0); SetSubspriteTables(&gSprites[data->spriteId], &data->subsprites); gSprites[data->spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[data->spriteId].oam.paletteNum = palIdx; gSprites[data->spriteId].subspriteTableNum = 0; gSprites[data->spriteId].invisible = TRUE; // Show markers HideBg(1); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); FillBgTilemapBufferRect_Palette0(1, 0x00F, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); ShowBg(1); return taskId; } void DestroyPokedexAreaMarkers(u8 taskId) { struct PAM_TaskData * data = (void *)gTasks[taskId].data; FreeSpriteTilesByTag(data->tilesTag); DestroySprite(&gSprites[data->spriteId]); Free(data->buffer); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); HideBg(1); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 2); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); ShowBg(1); DestroyTask(taskId); } void GetAreaMarkerSubsprite(s32 i, s32 dexArea, struct Subsprite * subsprites) { subsprites[i] = *sSubsprites[sAreaMarkers[dexArea][0]]; subsprites[i].x = sAreaMarkers[dexArea][1]; subsprites[i].y = sAreaMarkers[dexArea][2]; } u8 GetNumPokedexAreaMarkers(u8 taskId) { struct PAM_TaskData * data = (void *)gTasks[taskId].data; return data->subsprites.subspriteCount; } ================================================ FILE: src/pokedex_screen.c ================================================ #include "global.h" #include "gflib.h" #include "graphics.h" #include "m4a.h" #include "scanline_effect.h" #include "task.h" #include "new_menu_helpers.h" #include "event_data.h" #include "help_system.h" #include "menu_indicators.h" #include "overworld.h" #include "strings.h" #include "menu.h" #include "pokedex_screen.h" #include "data.h" #include "pokedex.h" #include "trainer_pokemon_sprites.h" #include "decompress.h" #include "constants/songs.h" #include "constants/sound.h" #include "pokedex_area_markers.h" #include "field_specials.h" #define TAG_AREA_MARKERS 2001 enum TextMode { TEXT_LEFT, TEXT_CENTER, TEXT_RIGHT }; struct PokedexScreenData { u8 taskId; u8 state; u8 data[2]; u8 areaMarkersTaskId; u32 unlockedCategories; u32 modeSelectInput; u16 modeSelectItemsAbove; u16 modeSelectCursorPos; u8 modeSelectWindowId; u8 selectionIconWindowId; u8 dexCountsWindowId; u8 modeSelectListMenuId; u16 pageSpecies[4]; u8 categoryMonWindowIds[4]; u8 categoryMonInfoWindowIds[4]; u8 category; u8 firstPageInCategory; u8 lastPageInCategory; u8 pageNum; u8 numMonsOnPage; u8 categoryCursorPosInPage; u8 categoryPageSelectionCursorTimer; u8 parentOfCategoryMenu; u32 characteristicMenuInput; u16 kantoOrderMenuItemsAbove; u16 kantoOrderMenuCursorPos; u16 characteristicOrderMenuItemsAbove; u16 characteristicOrderMenuCursorPos; u16 nationalOrderMenuItemsAbove; u16 nationalOrderMenuCursorPos; u8 numericalOrderWindowId; u8 orderedListMenuTaskId; u8 dexOrderId; struct ListMenuItem * listItems; u16 orderedDexCount; u8 windowIds[0x10]; u16 dexSpecies; u16 * bgBufsMem; u8 scrollArrowsTaskId; u8 categoryPageCursorTaskId; u16 modeSelectCursorPosBak; u8 unlockedSeviiAreas; u16 numSeenKanto; u16 numOwnedKanto; u16 numSeenNational; u16 numOwnedNational; }; struct PokedexScreenWindowGfx { const u32 * tiles; const u16 * pal; }; struct PokedexCategoryPage { const u16 * species; u8 count; }; EWRAM_DATA static struct PokedexScreenData * sPokedexScreenData = NULL; static void Task_PokedexScreen(u8 taskId); static void DexScreen_InitGfxForTopMenu(void); static void Task_DexScreen_NumericalOrder(u8 taskId); static void DexScreen_InitGfxForNumericalOrderList(void); static void Task_DexScreen_CharacteristicOrder(u8 taskId); static void DexScreen_CreateCharacteristicListMenu(void); static u16 DexScreen_CountMonsInOrderedList(u8 orderIdx); static void DexScreen_InitListMenuForOrderedList(const struct ListMenuTemplate * template, u8 order); static u8 DexScreen_CreateDexOrderScrollArrows(void); static void DexScreen_DestroyDexOrderListMenu(u8 order); static void Task_DexScreen_CategorySubmenu(u8 taskId); static u8 DexScreen_CreateCategoryMenuScrollArrows(void); static int DexScreen_InputHandler_GetShoulderInput(void); static void Task_DexScreen_ShowMonPage(u8 taskId); static bool32 DexScreen_TryScrollMonsVertical(u8 direction); static void DexScreen_RemoveWindow(u8 *windowId_p); static void DexScreen_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx); static void DexScreen_PrintNum3RightAlign(u8 windowId, u8 fontId, u16 num, u8 x, u8 y, u8 colorIdx); static void DexScreen_PrintMonDexNo(u8 windowId, u8 fontId, u16 species, u8 x, u8 y); static u16 DexScreen_GetDexCount(u8 caseId, u8 whichDex); static void DexScreen_PrintControlInfo(const u8 *src); static void DexScreen_DestroyCategoryPageMonIconAndInfoWindows(void); static bool8 DexScreen_CreateCategoryListGfx(bool8 justRegistered); static void DexScreen_CreateCategoryPageSelectionCursor(u8 cursorPos); static void DexScreen_UpdateCategoryPageCursorObject(u8 taskId, u8 cursorPos, u8 numMonsInPage); static bool8 DexScreen_FlipCategoryPageInDirection(u8 direction); void DexScreen_DexPageZoomEffectFrame(u8 bg, u8 scale); static u8 DexScreen_DrawMonDexPage(bool8 justRegistered); u8 RemoveDexPageWindows(void); u8 DexScreen_DrawMonAreaPage(void); static bool8 DexScreen_IsPageUnlocked(u8 category, u8 pageNum); static bool8 DexScreen_IsCategoryUnlocked(u8 category); static u8 DexScreen_GetPageLimitsForCategory(u8 category); static bool8 DexScreen_LookUpCategoryBySpecies(u16 species); u8 DexScreen_DestroyAreaScreenResources(void); void DexScreen_CreateCategoryPageSpeciesList(u8 category, u8 pageNum); static u8 DexScreen_PageNumberToRenderablePages(u16 page); void DexScreen_InputHandler_StartToCry(void); void DexScreen_PrintStringWithAlignment(const u8 *str, s32 mode); static void MoveCursorFunc_DexModeSelect(s32 itemIndex, bool8 onInit, struct ListMenu *list); static void ItemPrintFunc_DexModeSelect(u8 windowId, u32 itemId, u8 y); static void ItemPrintFunc_OrderedListMenu(u8 windowId, u32 itemId, u8 y); static void Task_DexScreen_RegisterNonKantoMonBeforeNationalDex(u8 taskId); static void Task_DexScreen_RegisterMonToPokedex(u8 taskId); #include "data/pokemon_graphics/footprint_table.h" const u32 sCategoryMonInfoBgTiles[] = INCBIN_U32("graphics/pokedex/mini_page.4bpp.lz"); const u32 sKantoDexTiles[] = INCBIN_U32("graphics/pokedex/kanto_dex_bgtiles.4bpp.lz"); const u32 sNatDexTiles[] = INCBIN_U32("graphics/pokedex/national_dex_bgtiles.4bpp.lz"); const u16 sKantoDexPalette[0x100] = INCBIN_U16("graphics/pokedex/kanto_dex_bgpals.gbapal"); const u16 sDexScreen_CategoryCursorPals[] = { RGB(24, 22, 17), RGB(26, 24, 20), RGB(26, 20, 15), RGB(27, 23, 19), RGB(28, 18, 15), RGB(28, 22, 19), RGB(30, 16, 13), RGB(29, 21, 18), RGB(28, 18, 15), RGB(28, 22, 19), RGB(26, 20, 15), RGB(27, 23, 19) }; const u16 sNationalDexPalette[0x100] = INCBIN_U16("graphics/pokedex/national_dex_bgpals.gbapal"); const u32 sTopMenuIconTiles_Cave[] = INCBIN_U32("graphics/pokedex/cat_icon_cave.4bpp.lz"); const u32 sTopMenuIconTiles_Urban[] = INCBIN_U32("graphics/pokedex/cat_icon_urban.4bpp.lz"); const u32 sTopMenuSelectionIconTiles_Cancel[] = INCBIN_U32("graphics/pokedex/cat_icon_cancel.4bpp.lz"); const u32 sTopMenuIconTiles_Forest[] = INCBIN_U32("graphics/pokedex/cat_icon_forest.4bpp.lz"); const u32 sTopMenuIconTiles_Grassland[] = INCBIN_U32("graphics/pokedex/cat_icon_grassland.4bpp.lz"); const u32 sTopMenuIconTiles_QuestionMark[] = INCBIN_U32("graphics/pokedex/cat_icon_qmark.4bpp.lz"); const u32 sTopMenuIconTiles_Mountain[] = INCBIN_U32("graphics/pokedex/cat_icon_mountain.4bpp.lz"); const u32 sTopMenuIconTiles_Rare[] = INCBIN_U32("graphics/pokedex/cat_icon_rare.4bpp.lz"); const u32 sTopMenuIconTiles_Sea[] = INCBIN_U32("graphics/pokedex/cat_icon_sea.4bpp.lz"); const u32 sTopMenuIconTiles_Numerical[] = INCBIN_U32("graphics/pokedex/cat_icon_numerical.4bpp.lz"); const u32 sTopMenuIconTiles_RoughTerrain[] = INCBIN_U32("graphics/pokedex/cat_icon_rough_terrain.4bpp.lz"); const u32 sTopMenuIconTiles_WatersEdge[] = INCBIN_U32("graphics/pokedex/cat_icon_waters_edge.4bpp.lz"); const u32 sTopMenuIconTiles_Type[] = INCBIN_U32("graphics/pokedex/cat_icon_type.4bpp.lz"); const u32 sTopMenuIconTiles_Lightest[] = INCBIN_U32("graphics/pokedex/cat_icon_lightest.4bpp.lz"); const u32 sTopMenuIconTiles_Smallest[] = INCBIN_U32("graphics/pokedex/cat_icon_smallest.4bpp.lz"); const u16 sTopMenuIconPals_Cave[] = INCBIN_U16("graphics/pokedex/cat_icon_cave.gbapal"); const u16 sTopMenuIconPals_Urban[] = INCBIN_U16("graphics/pokedex/cat_icon_urban.gbapal"); const u16 sTopMenuSelectionIconPals_Cancel[] = INCBIN_U16("graphics/pokedex/cat_icon_cancel.gbapal"); const u16 sTopMenuIconPals_Forest[] = INCBIN_U16("graphics/pokedex/cat_icon_forest.gbapal"); const u16 sTopMenuIconPals_Grassland[] = INCBIN_U16("graphics/pokedex/cat_icon_grassland.gbapal"); const u16 sTopMenuIconPals_QuestionMark[] = INCBIN_U16("graphics/pokedex/cat_icon_qmark.gbapal"); const u16 sTopMenuIconPals_Mountain[] = INCBIN_U16("graphics/pokedex/cat_icon_mountain.gbapal"); const u16 sTopMenuIconPals_Rare[] = INCBIN_U16("graphics/pokedex/cat_icon_rare.gbapal"); const u16 sTopMenuIconPals_Sea[] = INCBIN_U16("graphics/pokedex/cat_icon_sea.gbapal"); const u16 sTopMenuIconPals_Numerical[] = INCBIN_U16("graphics/pokedex/cat_icon_numerical.gbapal"); const u16 sTopMenuIconPals_RoughTerrain[] = INCBIN_U16("graphics/pokedex/cat_icon_rough_terrain.gbapal"); const u16 sTopMenuIconPals_WatersEdge[] = INCBIN_U16("graphics/pokedex/cat_icon_waters_edge.gbapal"); const u16 sTopMenuIconPals_Type[] = INCBIN_U16("graphics/pokedex/cat_icon_type.gbapal"); const u16 sTopMenuIconPals_Lightest[] = INCBIN_U16("graphics/pokedex/cat_icon_lightest.gbapal"); const u16 sTopMenuIconPals_Smallest[] = INCBIN_U16("graphics/pokedex/cat_icon_smallest.gbapal"); const u8 sDexScreen_CaughtIcon[] = INCBIN_U8("graphics/pokedex/caught_marker.4bpp"); const u32 sTilemap_AreaMap_Kanto[] = INCBIN_U32("graphics/pokedex/map_kanto.4bpp.lz"); const u32 sTilemap_AreaMap_OneIsland[] = INCBIN_U32("graphics/pokedex/map_one_island.4bpp.lz"); const u32 sTilemap_AreaMap_TwoIsland[] = INCBIN_U32("graphics/pokedex/map_two_island.4bpp.lz"); const u32 sTilemap_AreaMap_ThreeIsland[] = INCBIN_U32("graphics/pokedex/map_three_island.4bpp.lz"); const u32 sTilemap_AreaMap_FourIsland[] = INCBIN_U32("graphics/pokedex/map_four_island.4bpp.lz"); const u32 sTilemap_AreaMap_FiveIsland[] = INCBIN_U32("graphics/pokedex/map_five_island.4bpp.lz"); const u32 sTilemap_AreaMap_SixIsland[] = INCBIN_U32("graphics/pokedex/map_six_island.4bpp.lz"); const u32 sTilemap_AreaMap_SevenIsland[] = INCBIN_U32("graphics/pokedex/map_seven_island.4bpp.lz"); const u16 sBlitTiles_WideEllipse[] = INCBIN_U16("graphics/pokedex/blit_wide_ellipse.4bpp"); #include "data/pokemon/pokedex_orders.h" static const u8 gExpandedPlaceholder_PokedexDescription[] = _(""); #include "data/pokemon/pokedex_text_fr.h" #include "data/pokemon/pokedex_text_lg.h" #include "data/pokemon/pokedex_entries.h" static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 5, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x0000 }, { .bg = 1, .charBaseIndex = 2, .mapBaseIndex = 4, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x0000 }, { .bg = 2, .charBaseIndex = 2, .mapBaseIndex = 6, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x0000 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 7, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x0000 }, }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 2, .paletteNum = 15, .baseBlock = 0x03c4 }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 18, .width = 30, .height = 2, .paletteNum = 15, .baseBlock = 0x0388 }, { .bg = 255, .tilemapLeft = 0, .tilemapTop = 0, .width = 0, .height = 0, .paletteNum = 0, .baseBlock = 0x0000 }, }; static const struct PokedexScreenData sDexScreenDataInitialState = { .modeSelectItemsAbove = 1, .modeSelectWindowId = -1, .selectionIconWindowId = -1, .dexCountsWindowId = -1, .pageSpecies = {-1, -1, -1, -1}, .categoryMonWindowIds = {-1, -1, -1, -1}, .categoryMonInfoWindowIds = {-1, -1, -1, -1}, .numericalOrderWindowId = -1, .windowIds = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, .scrollArrowsTaskId = -1, .categoryPageCursorTaskId = -1, }; static const struct WindowTemplate sWindowTemplate_ModeSelect = { .bg = 1, .tilemapLeft = 1, .tilemapTop = 2, .width = 20, .height = 16, .paletteNum = 0, .baseBlock = 0x0008 }; static const struct WindowTemplate sWindowTemplate_SelectionIcon = { .bg = 1, .tilemapLeft = 21, .tilemapTop = 11, .width = 8, .height = 6, .paletteNum = 1, .baseBlock = 0x0148 }; static const struct WindowTemplate sWindowTemplate_DexCounts = { .bg = 1, .tilemapLeft = 21, .tilemapTop = 2, .width = 9, .height = 9, .paletteNum = 0, .baseBlock = 0x0178 }; static const struct ListMenuItem sListMenuItems_KantoDexModeSelect[] = { {gText_PokemonList, LIST_HEADER}, {gText_NumericalMode, DEX_MODE(NUMERICAL_KANTO)}, {gText_PokemonHabitats, LIST_HEADER}, {gText_DexCategory_GrasslandPkmn, DEX_CATEGORY_GRASSLAND}, {gText_DexCategory_ForestPkmn, DEX_CATEGORY_FOREST}, {gText_DexCategory_WatersEdgePkmn, DEX_CATEGORY_WATERS_EDGE}, {gText_DexCategory_SeaPkmn, DEX_CATEGORY_SEA}, {gText_DexCategory_CavePkmn, DEX_CATEGORY_CAVE}, {gText_DexCategory_MountainPkmn, DEX_CATEGORY_MOUNTAIN}, {gText_DexCategory_RoughTerrainPkmn, DEX_CATEGORY_ROUGH_TERRAIN}, {gText_DexCategory_UrbanPkmn, DEX_CATEGORY_URBAN}, {gText_DexCategory_RarePkmn, DEX_CATEGORY_RARE}, {gText_Search, LIST_HEADER}, {gText_AToZMode, DEX_MODE(ATOZ)}, {gText_TypeMode, DEX_MODE(TYPE)}, {gText_LightestMode, DEX_MODE(LIGHTEST)}, {gText_SmallestMode, DEX_MODE(SMALLEST)}, {gText_PokedexOther, LIST_HEADER}, {gText_ClosePokedex, LIST_CANCEL}, }; static const struct ListMenuTemplate sListMenuTemplate_KantoDexModeSelect = { .items = sListMenuItems_KantoDexModeSelect, .moveCursorFunc = MoveCursorFunc_DexModeSelect, .itemPrintFunc = ItemPrintFunc_DexModeSelect, .totalItems = NELEMS(sListMenuItems_KantoDexModeSelect), .maxShowed = 9, .windowId = 0, .header_X = 0, .item_X = 12, .cursor_X = 4, .upText_Y = 2, .cursorPal = 1, .fillValue = 0, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = FONT_NORMAL, .cursorKind = 0, }; static const struct ListMenuItem sListMenuItems_NatDexModeSelect[] = { {gText_PokemonList, LIST_HEADER}, {gText_NumericalModeKanto, DEX_MODE(NUMERICAL_KANTO)}, {gText_NumericalModeNational, DEX_MODE(NUMERICAL_NATIONAL)}, {gText_PokemonHabitats, LIST_HEADER}, {gText_DexCategory_GrasslandPkmn, DEX_CATEGORY_GRASSLAND}, {gText_DexCategory_ForestPkmn, DEX_CATEGORY_FOREST}, {gText_DexCategory_WatersEdgePkmn, DEX_CATEGORY_WATERS_EDGE}, {gText_DexCategory_SeaPkmn, DEX_CATEGORY_SEA}, {gText_DexCategory_CavePkmn, DEX_CATEGORY_CAVE}, {gText_DexCategory_MountainPkmn, DEX_CATEGORY_MOUNTAIN}, {gText_DexCategory_RoughTerrainPkmn, DEX_CATEGORY_ROUGH_TERRAIN}, {gText_DexCategory_UrbanPkmn, DEX_CATEGORY_URBAN}, {gText_DexCategory_RarePkmn, DEX_CATEGORY_RARE}, {gText_Search, LIST_HEADER}, {gText_AToZMode, DEX_MODE(ATOZ)}, {gText_TypeMode, DEX_MODE(TYPE)}, {gText_LightestMode, DEX_MODE(LIGHTEST)}, {gText_SmallestMode, DEX_MODE(SMALLEST)}, {gText_PokedexOther, LIST_HEADER}, {gText_ClosePokedex, LIST_CANCEL}, }; static const struct ListMenuTemplate sListMenuTemplate_NatDexModeSelect = { .items = sListMenuItems_NatDexModeSelect, .moveCursorFunc = MoveCursorFunc_DexModeSelect, .itemPrintFunc = ItemPrintFunc_DexModeSelect, .totalItems = NELEMS(sListMenuItems_NatDexModeSelect), .maxShowed = 9, .windowId = 0, .header_X = 0, .item_X = 12, .cursor_X = 4, .upText_Y = 2, .cursorPal = 1, .fillValue = 0, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = FONT_NORMAL, .cursorKind = 0, }; static const struct ListMenuItem sListMenuItems_KantoExtended[] = { {gText_PokemonList, -3}, {gText_NumericalModeKanto, 9}, {gText_NumericalModeExtended, 14}, {gText_PokemonHabitats, -3}, {gText_DexCategory_GrasslandPkmn, 0}, {gText_DexCategory_ForestPkmn, 1}, {gText_DexCategory_WatersEdgePkmn, 2}, {gText_DexCategory_SeaPkmn, 3}, {gText_DexCategory_CavePkmn, 4}, {gText_DexCategory_MountainPkmn, 5}, {gText_DexCategory_RoughTerrainPkmn, 6}, {gText_DexCategory_UrbanPkmn, 7}, {gText_DexCategory_RarePkmn, 8}, {gText_Search, -3}, {gText_AToZMode, 10}, {gText_TypeMode, 11}, {gText_LightestMode, 12}, {gText_SmallestMode, 13}, {gText_PokedexOther, -3}, {gText_ClosePokedex, -2}, }; static const struct ListMenuTemplate sListMenuTemplate_KantoExtended = { .items = sListMenuItems_KantoExtended, .moveCursorFunc = MoveCursorFunc_DexModeSelect, .itemPrintFunc = ItemPrintFunc_DexModeSelect, .totalItems = NELEMS(sListMenuItems_KantoExtended), .maxShowed = 9, .windowId = 0, .header_X = 0, .item_X = 12, .cursor_X = 4, .upText_Y = 2, .cursorPal = 1, .fillValue = 0, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = 2, .cursorKind = 0, }; static const struct ListMenuItem sListMenuItems_ExtendedNational[] = { {gText_PokemonList, -3}, {gText_NumericalModeExtended, 9}, {gText_NumericalModeNational, 14}, {gText_PokemonHabitats, -3}, {gText_DexCategory_GrasslandPkmn, 0}, {gText_DexCategory_ForestPkmn, 1}, {gText_DexCategory_WatersEdgePkmn, 2}, {gText_DexCategory_SeaPkmn, 3}, {gText_DexCategory_CavePkmn, 4}, {gText_DexCategory_MountainPkmn, 5}, {gText_DexCategory_RoughTerrainPkmn, 6}, {gText_DexCategory_UrbanPkmn, 7}, {gText_DexCategory_RarePkmn, 8}, {gText_Search, -3}, {gText_AToZMode, 10}, {gText_TypeMode, 11}, {gText_LightestMode, 12}, {gText_SmallestMode, 13}, {gText_PokedexOther, -3}, {gText_ClosePokedex, -2}, }; static const struct ListMenuTemplate sListMenuTemplate_ExtendedNational = { .items = sListMenuItems_ExtendedNational, .moveCursorFunc = MoveCursorFunc_DexModeSelect, .itemPrintFunc = ItemPrintFunc_DexModeSelect, .totalItems = NELEMS(sListMenuItems_ExtendedNational), .maxShowed = 9, .windowId = 0, .header_X = 0, .item_X = 12, .cursor_X = 4, .upText_Y = 2, .cursorPal = 1, .fillValue = 0, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = 0, .fontId = 2, .cursorKind = 0, }; static const struct ScrollArrowsTemplate sScrollArrowsTemplate_KantoDex = { .firstArrowType = 2, .firstX = 200, .firstY = 19, .secondArrowType = 3, .secondX = 200, .secondY = 141, .fullyUpThreshold = 0, .fullyDownThreshold = 10, .tileTag = 2000, .palTag = 0xFFFF, .palNum = 1 }; static const struct ScrollArrowsTemplate sScrollArrowsTemplate_NatDex = { .firstArrowType = 2, .firstX = 200, .firstY = 19, .secondArrowType = 3, .secondX = 200, .secondY = 141, .fullyUpThreshold = 0, .fullyDownThreshold = 11, .tileTag = 2000, .palTag = 0xFFFF, .palNum = 1 }; static const struct PokedexScreenWindowGfx sTopMenuSelectionIconGfxPtrs[] = { [DEX_CATEGORY_GRASSLAND] = { .tiles = sTopMenuIconTiles_Grassland, .pal = sTopMenuIconPals_Grassland }, [DEX_CATEGORY_FOREST] = { .tiles = sTopMenuIconTiles_Forest, .pal = sTopMenuIconPals_Forest }, [DEX_CATEGORY_WATERS_EDGE] = { .tiles = sTopMenuIconTiles_WatersEdge, .pal = sTopMenuIconPals_WatersEdge }, [DEX_CATEGORY_SEA] = { .tiles = sTopMenuIconTiles_Sea, .pal = sTopMenuIconPals_Sea }, [DEX_CATEGORY_CAVE] = { .tiles = sTopMenuIconTiles_Cave, .pal = sTopMenuIconPals_Cave }, [DEX_CATEGORY_MOUNTAIN] = { .tiles = sTopMenuIconTiles_Mountain, .pal = sTopMenuIconPals_Mountain }, [DEX_CATEGORY_ROUGH_TERRAIN] = { .tiles = sTopMenuIconTiles_RoughTerrain, .pal = sTopMenuIconPals_RoughTerrain }, [DEX_CATEGORY_URBAN] = { .tiles = sTopMenuIconTiles_Urban, .pal = sTopMenuIconPals_Urban }, [DEX_CATEGORY_RARE] = { .tiles = sTopMenuIconTiles_Rare, .pal = sTopMenuIconPals_Rare }, [DEX_MODE(NUMERICAL_KANTO)] = { .tiles = sTopMenuIconTiles_Numerical, .pal = sTopMenuIconPals_Numerical }, [DEX_MODE(ATOZ)] = { .tiles = gDexScreen_TopMenuIconTiles_AtoZ, .pal = gDexScreen_TopMenuIconPals_AtoZ }, [DEX_MODE(TYPE)] = { .tiles = sTopMenuIconTiles_Type, .pal = sTopMenuIconPals_Type }, [DEX_MODE(LIGHTEST)] = { .tiles = sTopMenuIconTiles_Lightest, .pal = sTopMenuIconPals_Lightest }, [DEX_MODE(SMALLEST)] = { .tiles = sTopMenuIconTiles_Smallest, .pal = sTopMenuIconPals_Smallest }, [DEX_MODE(NUMERICAL_NATIONAL)] = { .tiles = sTopMenuIconTiles_Numerical, .pal = sTopMenuIconPals_Numerical }, }; static const struct WindowTemplate sWindowTemplate_OrderedListMenu = { .bg = 1, .tilemapLeft = 2, .tilemapTop = 2, .width = 23, .height = 16, .paletteNum = 0, .baseBlock = 0x0008 }; static const struct ListMenuTemplate sListMenuTemplate_OrderedListMenu = { .items = sListMenuItems_KantoDexModeSelect, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = ItemPrintFunc_OrderedListMenu, .totalItems = 0, .maxShowed = 9, .windowId = 0, .header_X = 0, .item_X = 56, .cursor_X = 4, .upText_Y = 2, .cursorPal = 1, .fillValue = 0, .cursorShadowPal = 3, .lettersSpacing = 1, .itemVerticalPadding = 0, .scrollMultiple = 1, .fontId = FONT_NORMAL, .cursorKind = 0, }; static const struct ListMenuWindowRect sListMenuRects_OrderedList[] = { { .x = 0, .y = 0, .width = 5, .height = 16, .palNum = 0 }, { .x = 5, .y = 0, .width = 2, .height = 16, .palNum = 1 }, { .x = 7, .y = 0, .width = 8, .height = 16, .palNum = 0 }, { .x = 15, .y = 0, .width = 8, .height = 16, .palNum = 2, }, { .x = 0xFF, .y = 0xFF, .width = 0xFF, .height = 0xFF, .palNum = 0xFF } }; static const struct ScrollArrowsTemplate sDexOrderScrollArrowsTemplate = { .firstArrowType = 2, .firstX = 200, .firstY = 19, .secondArrowType = 3, .secondX = 200, .secondY = 141, .fullyUpThreshold = 0, .fullyDownThreshold = 0, .tileTag = 2000, .palTag = 0xFFFF, .palNum = 1, }; static const struct WindowTemplate sWindowTemplate_CategoryMonIcon = { .bg = 2, .tilemapLeft = 0, .tilemapTop = 0, .width = 8, .height = 8, .paletteNum = 0, .baseBlock = 0x0000 }; static const struct WindowTemplate sWindowTemplate_CategoryMonInfo = { .bg = 1, .tilemapLeft = 0, .tilemapTop = 0, .width = 8, .height = 5, .paletteNum = 0, .baseBlock = 0x0000 }; const struct WindowTemplate sWindowTemplate_DexEntry_MonPic = { .bg = 1, .tilemapLeft = 19, .tilemapTop = 3, .width = 8, .height = 8, .paletteNum = 9, .baseBlock = 0x01a8 }; const struct WindowTemplate sWindowTemplate_DexEntry_SpeciesStats = { .bg = 1, .tilemapLeft = 2, .tilemapTop = 3, .width = 13, .height = 8, .paletteNum = 0, .baseBlock = 0x01e8 }; const struct WindowTemplate sWindowTemplate_DexEntry_FlavorText = { .bg = 1, .tilemapLeft = 0, .tilemapTop = 11, .width = 30, .height = 7, .paletteNum = 0, .baseBlock = 0x0250 }; const struct WindowTemplate sWindowTemplate_AreaMap_MonIcon = { .bg = 2, .tilemapLeft = 1, .tilemapTop = 2, .width = 4, .height = 4, .paletteNum = 10, .baseBlock = 0x01a8 }; const struct WindowTemplate sWindowTemplate_AreaMap_SpeciesName = { .bg = 2, .tilemapLeft = 5, .tilemapTop = 2, .width = 8, .height = 3, .paletteNum = 0, .baseBlock = 0x01b8 }; const struct WindowTemplate sWindowTemplate_AreaMap_Size = { .bg = 2, .tilemapLeft = 2, .tilemapTop = 7, .width = 10, .height = 2, .paletteNum = 0, .baseBlock = 0x01d0 }; const struct WindowTemplate sWindowTemplate_AreaMap_Area = { .bg = 2, .tilemapLeft = 18, .tilemapTop = 2, .width = 10, .height = 2, .paletteNum = 0, .baseBlock = 0x01e4 }; const struct WindowTemplate sWindowTemplate_AreaMap_MonTypes = { .bg = 2, .tilemapLeft = 5, .tilemapTop = 5, .width = 8, .height = 2, .paletteNum = 11, .baseBlock = 0x01f8 }; const struct WindowTemplate sWindowTemplate_AreaMap_Kanto = { .bg = 2, .tilemapLeft = 17, .tilemapTop = 4, .width = 12, .height = 9, .paletteNum = 0, .baseBlock = 0x0208 }; static const struct WindowTemplate sWindowTemplate_AreaMap_OneIsland = { .bg = 2, .tilemapLeft = 13, .tilemapTop = 4, .width = 4, .height = 3, .paletteNum = 0, .baseBlock = 0x0274 }; static const struct WindowTemplate sWindowTemplate_AreaMap_TwoIsland = { .bg = 2, .tilemapLeft = 13, .tilemapTop = 7, .width = 4, .height = 3, .paletteNum = 0, .baseBlock = 0x0280 }; static const struct WindowTemplate sWindowTemplate_AreaMap_ThreeIsland = { .bg = 2, .tilemapLeft = 13, .tilemapTop = 10, .width = 4, .height = 3, .paletteNum = 0, .baseBlock = 0x028c }; static const struct WindowTemplate sWindowTemplate_AreaMap_FourIsland = { .bg = 2, .tilemapLeft = 13, .tilemapTop = 13, .width = 4, .height = 4, .paletteNum = 0, .baseBlock = 0x0298 }; static const struct WindowTemplate sWindowTemplate_AreaMap_FiveIsland = { .bg = 2, .tilemapLeft = 17, .tilemapTop = 13, .width = 4, .height = 4, .paletteNum = 0, .baseBlock = 0x02a8 }; static const struct WindowTemplate sWindowTemplate_AreaMap_SixIsland = { .bg = 2, .tilemapLeft = 21, .tilemapTop = 13, .width = 4, .height = 4, .paletteNum = 0, .baseBlock = 0x02b8 }; static const struct WindowTemplate sWindowTemplate_AreaMap_SevenIsland = { .bg = 2, .tilemapLeft = 25, .tilemapTop = 13, .width = 4, .height = 4, .paletteNum = 0, .baseBlock = 0x02c8 }; struct { const struct WindowTemplate * window; const u32 * tiles; } const sAreaMapStructs_SeviiIslands[] = { {&sWindowTemplate_AreaMap_OneIsland, sTilemap_AreaMap_OneIsland}, {&sWindowTemplate_AreaMap_TwoIsland, sTilemap_AreaMap_TwoIsland}, {&sWindowTemplate_AreaMap_ThreeIsland, sTilemap_AreaMap_ThreeIsland}, {&sWindowTemplate_AreaMap_FourIsland, sTilemap_AreaMap_FourIsland}, {&sWindowTemplate_AreaMap_FiveIsland, sTilemap_AreaMap_FiveIsland}, {&sWindowTemplate_AreaMap_SixIsland, sTilemap_AreaMap_SixIsland}, {&sWindowTemplate_AreaMap_SevenIsland, sTilemap_AreaMap_SevenIsland}, }; static const u16 sCategoryPageIconWindowBg[] = INCBIN_U16("graphics/pokedex/page_icon_tilemap.bin"); // Circular window x/y; Rectangular window x/y static const u8 sPageIconCoords_1Mon[1][4] = { {11, 3, 11, 11}, }; static const u8 sPageIconCoords_2Mons[2][4] = { { 3, 3, 11, 3}, {18, 9, 10, 11}, }; static const u8 sPageIconCoords_3Mons[3][4] = { { 1, 2, 9, 2}, {11, 9, 3, 11}, {21, 3, 21, 11} }; static const u8 sPageIconCoords_4Mons[4][4] = { { 0, 2, 6, 3}, { 7, 10, 0, 12}, {15, 10, 22, 11}, {22, 2, 15, 4} }; const u8 (*const sCategoryPageIconCoords[])[4] = { sPageIconCoords_1Mon, sPageIconCoords_2Mons, sPageIconCoords_3Mons, sPageIconCoords_4Mons, }; static const u8 *const sDexCategoryNamePtrs[] = { gText_DexCategory_GrasslandPkmn, gText_DexCategory_ForestPkmn, gText_DexCategory_WatersEdgePkmn, gText_DexCategory_SeaPkmn, gText_DexCategory_CavePkmn, gText_DexCategory_MountainPkmn, gText_DexCategory_RoughTerrainPkmn, gText_DexCategory_UrbanPkmn, gText_DexCategory_RarePkmn, }; const u16 sPalette_Silhouette[] = INCBIN_U16("graphics/pokedex/silhouette_sprite_pal.gbapal"); static const u8 sDexScreenPageTurnColumns[][30] = { {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, { 5, 11, 17, 23, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, { 2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, { 2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, { 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, { 1, 2, 3, 4, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 30, 30, 30, 30, 30, 30}, { 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 30, 30, 30}, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 30, 30}, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, }; static const struct ScrollArrowsTemplate sScrollArrowsTemplate_CategoryMenu = { .firstArrowType = 0, .firstX = 16, .firstY = 80, .secondArrowType = 1, .secondX = 224, .secondY = 80, .fullyUpThreshold = 0, .fullyDownThreshold = 0, .tileTag = 2000, .palTag = 0xFFFF, .palNum = 1, }; const struct CursorStruct sCursorStruct_CategoryPage = { .left = 0, .top = 160, .rowWidth = 64, .rowHeight = 40, .tileTag = 2002, .palTag = 0xFFFF, .palNum = 4, }; #include "data/pokemon/pokedex_categories.h" void VBlankCB(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void CB2_PokedexScreen(void) { if (!gPaletteFade.active || IsDma3ManagerBusyWithBgCopy()) { RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); } else { UpdatePaletteFade(); } } void DexScreen_LoadResources(void) { bool8 natDex; u8 taskId; natDex = IsNationalPokedexEnabled(); m4aSoundVSyncOff(); SetVBlankCallback(NULL); ResetPaletteFade(); ResetSpriteData(); ResetTasks(); ScanlineEffect_Stop(); ResetBgsAndClearDma3BusyFlags(TRUE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetBgTilemapBuffer(3, (u16 *)Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(2, (u16 *)Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(1, (u16 *)Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(0, (u16 *)Alloc(BG_SCREEN_SIZE)); if (natDex) DecompressAndLoadBgGfxUsingHeap(3, (void *)sNatDexTiles, BG_SCREEN_SIZE, 0, 0); else DecompressAndLoadBgGfxUsingHeap(3, (void *)sKantoDexTiles, BG_SCREEN_SIZE, 0, 0); InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); m4aSoundVSyncOn(); SetVBlankCallback(VBlankCB); EnableInterrupts(INTR_FLAG_VBLANK); taskId = CreateTask(Task_PokedexScreen, 0); sPokedexScreenData = Alloc(sizeof(struct PokedexScreenData)); *sPokedexScreenData = sDexScreenDataInitialState; sPokedexScreenData->taskId = taskId; sPokedexScreenData->listItems = Alloc(NATIONAL_DEX_COUNT * sizeof(struct ListMenuItem)); sPokedexScreenData->numSeenNational = DexScreen_GetDexCount(FLAG_GET_SEEN, 1); sPokedexScreenData->numOwnedNational = DexScreen_GetDexCount(FLAG_GET_CAUGHT, 1); sPokedexScreenData->numSeenKanto = DexScreen_GetDexCount(FLAG_GET_SEEN, 0); sPokedexScreenData->numOwnedKanto = DexScreen_GetDexCount(FLAG_GET_CAUGHT, 0); SetBGMVolume_SuppressHelpSystemReduction(0x80); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); gPaletteFade.bufferTransferDisabled = TRUE; if (natDex) LoadPalette(sNationalDexPalette, BG_PLTT_ID(0), sizeof(sNationalDexPalette)); else LoadPalette(sKantoDexPalette, BG_PLTT_ID(0), sizeof(sKantoDexPalette)); FillBgTilemapBufferRect(3, 0x001, 0, 0, 32, 32, 0); FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 17); FillBgTilemapBufferRect(1, 0x000, 0, 0, 32, 32, 17); FillBgTilemapBufferRect(0, 0x003, 0, 0, 32, 2, 15); FillBgTilemapBufferRect(0, 0x000, 0, 2, 32, 16, 17); FillBgTilemapBufferRect(0, 0x003, 0, 18, 32, 2, 15); } void CB2_OpenPokedexFromStartMenu(void) { DexScreen_LoadResources(); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetMainCallback2(CB2_PokedexScreen); SetHelpContext(HELPCONTEXT_POKEDEX); } #define FREE_IF_NOT_NULL(ptr0) ({ void *ptr = (ptr0); if (ptr) Free(ptr); }) bool8 DoClosePokedex(void) { switch (gMain.state) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gMain.state++; return FALSE; case 1: if (!gPaletteFade.active) gMain.state = 2; else UpdatePaletteFade(); return FALSE; case 2: FREE_IF_NOT_NULL(sPokedexScreenData->listItems); FREE_IF_NOT_NULL(sPokedexScreenData); FreeAllWindowBuffers(); FREE_IF_NOT_NULL(GetBgTilemapBuffer(0)); FREE_IF_NOT_NULL(GetBgTilemapBuffer(1)); FREE_IF_NOT_NULL(GetBgTilemapBuffer(2)); FREE_IF_NOT_NULL(GetBgTilemapBuffer(3)); BGMVolumeMax_EnableHelpSystemReduction(); break; } return TRUE; } void CB2_ClosePokedex(void) { if (DoClosePokedex()) { SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); SetMainCallback2(CB2_ReturnToFieldWithOpenMenu); } } static void Task_PokedexScreen(u8 taskId) { int i; switch (sPokedexScreenData->state) { case 0: sPokedexScreenData->unlockedCategories = 0; for (i = 0; i < 9; i++) sPokedexScreenData->unlockedCategories |= (DexScreen_IsCategoryUnlocked(i) << i); sPokedexScreenData->state = 2; break; case 1: RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId); SetMainCallback2(CB2_ClosePokedex); DestroyTask(taskId); break; case 2: DexScreen_InitGfxForTopMenu(); sPokedexScreenData->state = 3; break; case 3: CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 4; break; case 4: ShowBg(3); ShowBg(2); ShowBg(1); ShowBg(0); if (gPaletteFade.bufferTransferDisabled) { gPaletteFade.bufferTransferDisabled = FALSE; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0, RGB_WHITEALPHA); } else BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA); sPokedexScreenData->state = 5; break; case 5: ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL); if (IsNationalPokedexEnabled()) sPokedexScreenData->scrollArrowsTaskId = AddScrollIndicatorArrowPair(&sScrollArrowsTemplate_NatDex, &sPokedexScreenData->modeSelectCursorPosBak); else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !(IsNationalPokedexEnabled())) sPokedexScreenData->scrollArrowsTaskId = AddScrollIndicatorArrowPair(&sScrollArrowsTemplate_NatDex, &sPokedexScreenData->modeSelectCursorPosBak); else sPokedexScreenData->scrollArrowsTaskId = AddScrollIndicatorArrowPair(&sScrollArrowsTemplate_KantoDex, &sPokedexScreenData->modeSelectCursorPosBak); sPokedexScreenData->state = 6; break; case 6: sPokedexScreenData->modeSelectInput = ListMenu_ProcessInput(sPokedexScreenData->modeSelectListMenuId); ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL); if (JOY_NEW(A_BUTTON)) { switch (sPokedexScreenData->modeSelectInput) { case LIST_CANCEL: sPokedexScreenData->state = 1; break; case DEX_CATEGORY_GRASSLAND: case DEX_CATEGORY_FOREST: case DEX_CATEGORY_WATERS_EDGE: case DEX_CATEGORY_SEA: case DEX_CATEGORY_CAVE: case DEX_CATEGORY_MOUNTAIN: case DEX_CATEGORY_ROUGH_TERRAIN: case DEX_CATEGORY_URBAN: case DEX_CATEGORY_RARE: if (DexScreen_IsCategoryUnlocked(sPokedexScreenData->modeSelectInput)) { RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); sPokedexScreenData->category = sPokedexScreenData->modeSelectInput; BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 7; } break; case DEX_MODE(NUMERICAL_KANTO): case DEX_MODE(NUMERICAL_NATIONAL): RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); sPokedexScreenData->dexOrderId = sPokedexScreenData->modeSelectInput - DEX_CATEGORY_COUNT; BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 9; break; case DEX_MODE(ATOZ): case DEX_MODE(TYPE): case DEX_MODE(LIGHTEST): case DEX_MODE(SMALLEST): RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); sPokedexScreenData->dexOrderId = sPokedexScreenData->modeSelectInput - DEX_CATEGORY_COUNT; sPokedexScreenData->characteristicOrderMenuItemsAbove = sPokedexScreenData->characteristicOrderMenuCursorPos = 0; BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 8; break; } break; } if (JOY_NEW(B_BUTTON)) { sPokedexScreenData->state = 1; } if ((JOY_NEW(SELECT_BUTTON))) { RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); BeginNormalPaletteFade(0xFFFF7FFF, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->dexSpecies = gSaveBlock1Ptr->lastViewedPokedexEntry; //species for entry //Below commented out code adjusts the cursor position that the last Pokedex entry backs out to. //It works IF the Pokemon is in the Kanto Dex and is not in the last position possible. //I could not get it to work. Instead, the cursor defaults to position 0 of the Kanto Dex. /*sPokedexScreenData->kantoOrderMenuCursorPos = sPokedexScreenData->dexSpecies - 1; //cursor position; Kanto? gUnknown_203ACF0->field_48 = sub_8103518(sPokedexScreenData->dexOrderId); //setting up max shown? idk sub_8104664(0); //fixing cursor position at endpoints? Kanto? sPokedexScreenData->kantoOrderMenuItemsAbove -= 1; //is items above cursor position, automatically adjusted by above call; Kanto? */ sPokedexScreenData->kantoOrderMenuCursorPos = 0; //cursor pos reset Kanto/Extended sPokedexScreenData->kantoOrderMenuItemsAbove = 0; //items above reset Kanto/Extended sPokedexScreenData->nationalOrderMenuCursorPos = 0; //cursor pos reset Extended/National sPokedexScreenData->nationalOrderMenuItemsAbove = 0; //items above reset Extended/National sPokedexScreenData->state = 10; } /* //debugging to test new dex mode and combos if ((JOY_NEW(START_BUTTON))) { PlaySE(SE_SELECT); if(FlagGet(FLAG_SYS_NATIONAL_DEX)) FlagClear(FLAG_SYS_NATIONAL_DEX); else FlagSet(FLAG_SYS_NATIONAL_DEX); } if ((JOY_NEW(R_BUTTON))) { PlaySE(SE_SELECT); if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX)) { FlagClear(FLAG_SYS_RECEIVED_EXTENDED_DEX); FlagClear(FLAG_SYS_EXTENDED_DEX_TOGGLE); } else { FlagSet(FLAG_SYS_RECEIVED_EXTENDED_DEX); FlagSet(FLAG_SYS_EXTENDED_DEX_TOGGLE); } }*/ break; case 7: DestroyListMenuTask(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPos, &sPokedexScreenData->modeSelectItemsAbove); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); CopyBgTilemapBufferToVram(1); DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId); sPokedexScreenData->pageNum = 0; sPokedexScreenData->categoryCursorPosInPage = 0; sPokedexScreenData->parentOfCategoryMenu = 0; gTasks[taskId].func = Task_DexScreen_CategorySubmenu; sPokedexScreenData->state = 0; break; case 8: DestroyListMenuTask(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPos, &sPokedexScreenData->modeSelectItemsAbove); HideBg(1); DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId); gTasks[taskId].func = Task_DexScreen_CharacteristicOrder; sPokedexScreenData->state = 0; break; case 9: DestroyListMenuTask(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPos, &sPokedexScreenData->modeSelectItemsAbove); HideBg(1); DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId); gTasks[taskId].func = Task_DexScreen_NumericalOrder; sPokedexScreenData->state = 0; break; case 10: DestroyListMenuTask(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPos, &sPokedexScreenData->modeSelectItemsAbove); HideBg(1); DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId); DexScreen_InitGfxForNumericalOrderList(); gTasks[taskId].func = Task_DexScreen_NumericalOrder; sPokedexScreenData->state = 7; break; } } static void DexScreen_InitGfxForTopMenu(void) { struct ListMenuTemplate listMenuTemplate; FillBgTilemapBufferRect(3, 0x00E, 0, 0, 30, 20, 0); FillBgTilemapBufferRect(2, 0x000, 0, 0, 30, 20, 17); FillBgTilemapBufferRect(1, 0x000, 0, 0, 30, 20, 17); sPokedexScreenData->modeSelectWindowId = AddWindow(&sWindowTemplate_ModeSelect); sPokedexScreenData->selectionIconWindowId = AddWindow(&sWindowTemplate_SelectionIcon); sPokedexScreenData->dexCountsWindowId = AddWindow(&sWindowTemplate_DexCounts); if (IsNationalPokedexEnabled()) { if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE)) listMenuTemplate = sListMenuTemplate_ExtendedNational; else listMenuTemplate = sListMenuTemplate_NatDexModeSelect; listMenuTemplate.windowId = sPokedexScreenData->modeSelectWindowId; sPokedexScreenData->modeSelectListMenuId = ListMenuInit(&listMenuTemplate, sPokedexScreenData->modeSelectCursorPos, sPokedexScreenData->modeSelectItemsAbove); FillWindowPixelBuffer(sPokedexScreenData->dexCountsWindowId, PIXEL_FILL(0)); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Seen, 0, 2, 0); if(!FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE)) { sPokedexScreenData->numSeenKanto = DexScreen_GetDexCount(0, 0); sPokedexScreenData->numOwnedKanto = DexScreen_GetDexCount(1, 0); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Kanto, 8, 13, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenKanto, 52, 13, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_National, 8, 24, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenNational, 52, 24, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Owned, 0, 37, 0); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Kanto, 8, 48, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedKanto, 52, 48, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_National, 8, 59, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedNational, 52, 59, 2); } else { sPokedexScreenData->numSeenKanto = DexScreen_GetDexCount(0, 2); sPokedexScreenData->numOwnedKanto = DexScreen_GetDexCount(1, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Extended, 8, 13, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenKanto, 52, 13, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_National, 8, 24, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenNational, 52, 24, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Owned, 0, 37, 0); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Extended, 8, 48, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedKanto, 52, 48, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_National, 8, 59, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedNational, 52, 59, 2); } } else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX)) { listMenuTemplate = sListMenuTemplate_KantoExtended; listMenuTemplate.windowId = sPokedexScreenData->modeSelectWindowId; sPokedexScreenData->modeSelectListMenuId = ListMenuInit(&listMenuTemplate, sPokedexScreenData->modeSelectCursorPos, sPokedexScreenData->modeSelectItemsAbove); FillWindowPixelBuffer(sPokedexScreenData->dexCountsWindowId, PIXEL_FILL(0)); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Seen, 0, 2, 0); sPokedexScreenData->numSeenKanto = DexScreen_GetDexCount(0, 0); sPokedexScreenData->numOwnedKanto = DexScreen_GetDexCount(1, 0); sPokedexScreenData->numSeenNational = DexScreen_GetDexCount(0, 2); sPokedexScreenData->numOwnedNational = DexScreen_GetDexCount(1, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Kanto, 8, 13, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenKanto, 52, 13, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Extended, 8, 24, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenNational, 52, 24, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Owned, 0, 37, 0); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Kanto, 8, 48, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedKanto, 52, 48, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Extended, 8, 59, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedNational, 52, 59, 2); } else { listMenuTemplate = sListMenuTemplate_KantoDexModeSelect; listMenuTemplate.windowId = sPokedexScreenData->modeSelectWindowId; sPokedexScreenData->modeSelectListMenuId = ListMenuInit(&listMenuTemplate, sPokedexScreenData->modeSelectCursorPos, sPokedexScreenData->modeSelectItemsAbove); FillWindowPixelBuffer(sPokedexScreenData->dexCountsWindowId, PIXEL_FILL(0)); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_NORMAL_COPY_1, gText_Seen, 0, 9, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 1, sPokedexScreenData->numSeenKanto, 32, 21, 2); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_NORMAL_COPY_1, gText_Owned, 0, 37, 0); DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 1, sPokedexScreenData->numOwnedKanto, 32, 49, 2); } FillWindowPixelBuffer(0, PIXEL_FILL(15)); DexScreen_PrintStringWithAlignment(gText_PokedexTableOfContents, TEXT_CENTER); FillWindowPixelBuffer(1, PIXEL_FILL(15)); DexScreen_PrintControlInfo(gText_PickOK); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_GFX); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_GFX); PutWindowTilemap(sPokedexScreenData->dexCountsWindowId); CopyWindowToVram(sPokedexScreenData->dexCountsWindowId, COPYWIN_GFX); } static void MoveCursorFunc_DexModeSelect(s32 itemIndex, bool8 onInit, struct ListMenu *list) { if (!onInit) PlaySE(SE_SELECT); if (itemIndex == LIST_CANCEL) { CopyToWindowPixelBuffer(sPokedexScreenData->selectionIconWindowId, sTopMenuSelectionIconTiles_Cancel, 0x000, 0x000); LoadPalette(sTopMenuSelectionIconPals_Cancel, BG_PLTT_ID(1), PLTT_SIZE_4BPP); } else { CopyToWindowPixelBuffer(sPokedexScreenData->selectionIconWindowId, sTopMenuSelectionIconGfxPtrs[itemIndex].tiles, 0x000, 0x000); LoadPalette(sTopMenuSelectionIconGfxPtrs[itemIndex].pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); } PutWindowTilemap(sPokedexScreenData->selectionIconWindowId); CopyWindowToVram(sPokedexScreenData->selectionIconWindowId, COPYWIN_GFX); } static void ItemPrintFunc_DexModeSelect(u8 windowId, u32 itemId, u8 y) { if (itemId >= DEX_CATEGORY_COUNT || sPokedexScreenData->unlockedCategories & (1 << itemId)) ListMenuOverrideSetColors(TEXT_COLOR_WHITE, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY); else ListMenuOverrideSetColors(TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_2); } static void Task_DexScreen_NumericalOrder(u8 taskId) { if(sPokedexScreenData->dexOrderId == DEX_ORDER_NUMERICAL_NATIONAL && !IsNationalPokedexEnabled()) { //FlagSet(FLAG_SYS_EXTENDED_DEX_TOGGLE); } switch (sPokedexScreenData->state) { case 0: ListMenuLoadStdPalAt(BG_PLTT_ID(1), 0); ListMenuLoadStdPalAt(BG_PLTT_ID(2), 1); sPokedexScreenData->orderedDexCount = DexScreen_CountMonsInOrderedList(sPokedexScreenData->dexOrderId); sPokedexScreenData->state = 2; break; case 1: DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId); HideBg(1); DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId); gTasks[taskId].func = Task_PokedexScreen; sPokedexScreenData->state = 0; break; case 2: DexScreen_InitGfxForNumericalOrderList(); sPokedexScreenData->state = 3; break; case 3: CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(1); sPokedexScreenData->state = 4; break; case 4: ShowBg(1); BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA); sPokedexScreenData->state = 5; break; case 5: ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL); sPokedexScreenData->scrollArrowsTaskId = DexScreen_CreateDexOrderScrollArrows(); sPokedexScreenData->state = 6; break; case 6: sPokedexScreenData->characteristicMenuInput = ListMenu_ProcessInput(sPokedexScreenData->orderedListMenuTaskId); ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL); if (JOY_NEW(A_BUTTON)) { if ((sPokedexScreenData->characteristicMenuInput >> 16) & 1) { sPokedexScreenData->dexSpecies = sPokedexScreenData->characteristicMenuInput; RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 7; } } else if (JOY_NEW(B_BUTTON)) { RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); if(!IsNationalPokedexEnabled() && FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE)) FlagClear(FLAG_SYS_EXTENDED_DEX_TOGGLE); sPokedexScreenData->state = 1; } else if (JOY_NEW(START_BUTTON) && FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && sPokedexScreenData->dexOrderId == 0 && IsNationalPokedexEnabled()) { PlaySE(SE_SELECT); RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE)) FlagClear(FLAG_SYS_EXTENDED_DEX_TOGGLE); else FlagSet(FLAG_SYS_EXTENDED_DEX_TOGGLE); sPokedexScreenData->dexOrderId = 0; DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId); //BeginNormalPaletteFade(0xFFFF7FFF, 0, 0, 16, RGB_WHITEALPHA); // can't get a smooth white transition like the other Pokedex transitions // The BeginNormalPaletteFade function seems to just not work correctly here. FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20); CopyBgTilemapBufferToVram(1); DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId); sPokedexScreenData->kantoOrderMenuCursorPos = 0; //cursor pos reset sPokedexScreenData->kantoOrderMenuItemsAbove = 0; //items above reset DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId); DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId); gTasks[taskId].func = Task_DexScreen_NumericalOrder; sPokedexScreenData->state = 0; break; } break; case 7: DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20); CopyBgTilemapBufferToVram(1); DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId); gTasks[taskId].func = Task_DexScreen_ShowMonPage; sPokedexScreenData->state = 0; break; } } static void DexScreen_InitGfxForNumericalOrderList(void) { struct ListMenuTemplate template; FillBgTilemapBufferRect(3, 0x00E, 0, 0, 30, 20, 0); FillBgTilemapBufferRect(1, 0x000, 0, 0, 32, 32, 17); sPokedexScreenData->numericalOrderWindowId = AddWindow(&sWindowTemplate_OrderedListMenu); template = sListMenuTemplate_OrderedListMenu; template.items = sPokedexScreenData->listItems; template.windowId = sPokedexScreenData->numericalOrderWindowId; template.totalItems = sPokedexScreenData->orderedDexCount; DexScreen_InitListMenuForOrderedList(&template, sPokedexScreenData->dexOrderId); FillWindowPixelBuffer(0, PIXEL_FILL(15)); DexScreen_PrintStringWithAlignment(gText_PokemonListNoColor, TEXT_CENTER); FillWindowPixelBuffer(1, PIXEL_FILL(15)); if(sPokedexScreenData->dexOrderId == DEX_ORDER_NUMERICAL_KANTO && IsNationalPokedexEnabled()) //viewing Kanto Dex { if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE)) DexScreen_AddTextPrinterParameterized(1, 0, gText_SwapToKanto, 8, 2, 4); //print switch to Kanto if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE)) DexScreen_AddTextPrinterParameterized(1, 0, gText_SwapToExtended, 8, 2, 4); //print switch to Extended } DexScreen_PrintControlInfo(gText_PickOKExit); CopyWindowToVram(0, COPYWIN_GFX); CopyWindowToVram(1, COPYWIN_GFX); } static void Task_DexScreen_CharacteristicOrder(u8 taskId) { switch (sPokedexScreenData->state) { case 0: ListMenuLoadStdPalAt(BG_PLTT_ID(1), 0); ListMenuLoadStdPalAt(BG_PLTT_ID(2), 1); sPokedexScreenData->orderedDexCount = DexScreen_CountMonsInOrderedList(sPokedexScreenData->dexOrderId); sPokedexScreenData->state = 2; break; case 1: DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId); HideBg(1); DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId); gTasks[taskId].func = Task_PokedexScreen; sPokedexScreenData->state = 0; break; case 2: DexScreen_CreateCharacteristicListMenu(); sPokedexScreenData->state = 3; break; case 3: CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(1); sPokedexScreenData->state = 4; break; case 4: ShowBg(1); BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA); sPokedexScreenData->state = 5; break; case 5: ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL); sPokedexScreenData->scrollArrowsTaskId = DexScreen_CreateDexOrderScrollArrows(); sPokedexScreenData->state = 6; break; case 6: sPokedexScreenData->characteristicMenuInput = ListMenu_ProcessInput(sPokedexScreenData->orderedListMenuTaskId); ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL); if (JOY_NEW(A_BUTTON)) { if (((sPokedexScreenData->characteristicMenuInput >> 16) & 1) && !DexScreen_LookUpCategoryBySpecies(sPokedexScreenData->characteristicMenuInput)) { RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 7; } } else if (JOY_NEW(B_BUTTON)) { RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 1; } break; case 7: DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20); CopyBgTilemapBufferToVram(1); DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId); sPokedexScreenData->parentOfCategoryMenu = 1; gTasks[taskId].func = Task_DexScreen_CategorySubmenu; sPokedexScreenData->state = 0; break; } } static void DexScreen_CreateCharacteristicListMenu(void) //search mode printer { struct ListMenuTemplate template; FillBgTilemapBufferRect(3, 0x00E, 0, 0, 30, 20, 0); FillBgTilemapBufferRect(1, 0x000, 0, 0, 32, 32, 17); sPokedexScreenData->numericalOrderWindowId = AddWindow(&sWindowTemplate_OrderedListMenu); template = sListMenuTemplate_OrderedListMenu; template.items = sPokedexScreenData->listItems; template.windowId = sPokedexScreenData->numericalOrderWindowId; template.totalItems = sPokedexScreenData->orderedDexCount; DexScreen_InitListMenuForOrderedList(&template, sPokedexScreenData->dexOrderId); FillWindowPixelBuffer(0, PIXEL_FILL(15)); DexScreen_PrintStringWithAlignment(gText_SearchNoColor, TEXT_CENTER); FillWindowPixelBuffer(1, PIXEL_FILL(15)); DexScreen_PrintControlInfo(gText_PickOKExit); CopyWindowToVram(0, COPYWIN_GFX); CopyWindowToVram(1, COPYWIN_GFX); } static int DexScreen_CanShowMonInDex(u16 species) { if (IsNationalPokedexEnabled() == TRUE) return TRUE; if (FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && SpeciesToExtendedPokedexNum(species) <= EXTENDED_DEX_COUNT) return TRUE; if (SpeciesToNationalPokedexNum(species) <= KANTO_DEX_COUNT) return TRUE; return FALSE; } static u16 DexScreen_CountMonsInOrderedList(u8 orderIdx) { s32 max_n; u16 ndex_num; u16 highest_dex_num; u16 ret = NATIONAL_DEX_NONE; s32 i; bool8 caught; bool8 seen; if(IsNationalPokedexEnabled()) max_n = NATIONAL_DEX_COUNT; else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) max_n = EXTENDED_DEX_COUNT; else //Kanto only max_n = KANTO_DEX_COUNT; switch (orderIdx) { default: case DEX_ORDER_NUMERICAL_KANTO: //regular kanto dex list populator if(!IsNationalPokedexEnabled() || !FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE)) { for (i = 0; i < KANTO_DEX_COUNT; i++) { ndex_num = i + 1; seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, 0); caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, 0); if (seen) { sPokedexScreenData->listItems[i].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)]; ret = ndex_num; } else { sPokedexScreenData->listItems[i].label = gText_5Dashes; } sPokedexScreenData->listItems[i].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num); } break; } if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE) && IsNationalPokedexEnabled()) { for (i = 0; i < EXTENDED_DEX_COUNT; i++) { ndex_num = i + 1; seen = DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(ndex_num), FLAG_GET_SEEN, 0); caught = DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(ndex_num), FLAG_GET_CAUGHT, 0); if (seen) { sPokedexScreenData->listItems[i].label = gSpeciesNames[ExtendedPokedexNumToSpecies(ndex_num)]; ret = ndex_num; } else { sPokedexScreenData->listItems[i].label = gText_5Dashes; } sPokedexScreenData->listItems[i].index = (caught << 17) + (seen << 16) + ExtendedPokedexNumToSpecies(ndex_num); } break; } case DEX_ORDER_ATOZ: for (i = 0; i < NUM_SPECIES - 1; i++) { highest_dex_num = gPokedexOrder_Alphabetical[i]; if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) { ndex_num = NationalToExtendedOrder(gPokedexOrder_Alphabetical[i]); highest_dex_num = ndex_num; if(DexScreen_CanShowMonInDex(ndex_num) == FALSE) //not in highest dex mode continue; } ndex_num = gPokedexOrder_Alphabetical[i]; if (highest_dex_num <= max_n) { seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, FALSE); caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, FALSE); if (seen) { sPokedexScreenData->listItems[ret].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)]; sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num); ret++; } } } break; case DEX_ORDER_TYPE: for (i = 0; i < NUM_SPECIES - 1; i++) { if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) ndex_num = SpeciesToExtendedPokedexNum(gPokedexOrder_TypeExtended[i]); else ndex_num = SpeciesToNationalPokedexNum(gPokedexOrder_Type[i]); if(DexScreen_CanShowMonInDex(ndex_num) == FALSE) //not in highest dex mode continue; if (ndex_num <= max_n) { seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, FALSE); caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, FALSE); if (caught) { if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) { sPokedexScreenData->listItems[ret].label = gSpeciesNames[ExtendedPokedexNumToSpecies(ndex_num)]; sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + ExtendedPokedexNumToSpecies(ndex_num); } else { sPokedexScreenData->listItems[ret].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)]; sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num); } ret++; } } } break; case DEX_ORDER_LIGHTEST: for (i = 0; i < NATIONAL_DEX_COUNT; i++) { highest_dex_num = gPokedexOrder_Weight[i]; if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) { ndex_num = NationalToExtendedOrder(gPokedexOrder_Weight[i]); highest_dex_num = ndex_num; if(DexScreen_CanShowMonInDex(ndex_num) == FALSE) //not in highest dex mode continue; } ndex_num = gPokedexOrder_Weight[i]; if (highest_dex_num <= max_n) { seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, FALSE); caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, FALSE); if (caught) { sPokedexScreenData->listItems[ret].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)]; sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num); ret++; } } } break; case DEX_ORDER_SMALLEST: for (i = 0; i < NATIONAL_DEX_COUNT; i++) { highest_dex_num = gPokedexOrder_Height[i]; if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) { ndex_num = NationalToExtendedOrder(gPokedexOrder_Height[i]); highest_dex_num = ndex_num; if(DexScreen_CanShowMonInDex(ndex_num) == FALSE) //not in highest dex mode continue; } ndex_num = gPokedexOrder_Height[i]; if (highest_dex_num <= max_n) { seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, FALSE); caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, FALSE); if (caught) { sPokedexScreenData->listItems[ret].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)]; sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num); ret++; } } } break; case DEX_ORDER_NUMERICAL_NATIONAL: //national dex list populator if(IsNationalPokedexEnabled()) { for (i = 0; i < NATIONAL_DEX_COUNT; i++) { ndex_num = i + 1; seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, 0); caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, 0); if (seen) { sPokedexScreenData->listItems[i].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)]; ret = ndex_num; } else { sPokedexScreenData->listItems[i].label = gText_5Dashes; } sPokedexScreenData->listItems[i].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num); } break; } else { for (i = 0; i < EXTENDED_DEX_COUNT; i++) { ndex_num = i + 1; seen = DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(ndex_num), FLAG_GET_SEEN, 0); caught = DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(ndex_num), FLAG_GET_CAUGHT, 0); if (seen) { sPokedexScreenData->listItems[i].label = gSpeciesNames[ExtendedPokedexNumToSpecies(ndex_num)]; ret = ndex_num; } else { sPokedexScreenData->listItems[i].label = gText_5Dashes; } sPokedexScreenData->listItems[i].index = (caught << 17) + (seen << 16) + ExtendedPokedexNumToSpecies(ndex_num); } break; } } return ret; } static void DexScreen_InitListMenuForOrderedList(const struct ListMenuTemplate * template, u8 order) { switch (order) { default: case DEX_ORDER_NUMERICAL_KANTO: sPokedexScreenData->orderedListMenuTaskId = ListMenuInitInRect(template, sListMenuRects_OrderedList, sPokedexScreenData->kantoOrderMenuCursorPos, sPokedexScreenData->kantoOrderMenuItemsAbove); break; case DEX_ORDER_ATOZ: case DEX_ORDER_TYPE: case DEX_ORDER_LIGHTEST: case DEX_ORDER_SMALLEST: sPokedexScreenData->orderedListMenuTaskId = ListMenuInitInRect(template, sListMenuRects_OrderedList, sPokedexScreenData->characteristicOrderMenuCursorPos, sPokedexScreenData->characteristicOrderMenuItemsAbove); break; case DEX_ORDER_NUMERICAL_NATIONAL: sPokedexScreenData->orderedListMenuTaskId = ListMenuInitInRect(template, sListMenuRects_OrderedList, sPokedexScreenData->nationalOrderMenuCursorPos, sPokedexScreenData->nationalOrderMenuItemsAbove); break; } } static void DexScreen_DestroyDexOrderListMenu(u8 order) { switch (order) { default: case DEX_ORDER_NUMERICAL_KANTO: DestroyListMenuTask(sPokedexScreenData->orderedListMenuTaskId, &sPokedexScreenData->kantoOrderMenuCursorPos, &sPokedexScreenData->kantoOrderMenuItemsAbove); break; case DEX_ORDER_ATOZ: case DEX_ORDER_TYPE: case DEX_ORDER_LIGHTEST: case DEX_ORDER_SMALLEST: DestroyListMenuTask(sPokedexScreenData->orderedListMenuTaskId, &sPokedexScreenData->characteristicOrderMenuCursorPos, &sPokedexScreenData->characteristicOrderMenuItemsAbove); break; case DEX_ORDER_NUMERICAL_NATIONAL: DestroyListMenuTask(sPokedexScreenData->orderedListMenuTaskId, &sPokedexScreenData->nationalOrderMenuCursorPos, &sPokedexScreenData->nationalOrderMenuItemsAbove); break; } } static u8 DexScreen_CreateDexOrderScrollArrows(void) { struct ScrollArrowsTemplate template = sDexOrderScrollArrowsTemplate; if (sPokedexScreenData->orderedDexCount > sListMenuTemplate_OrderedListMenu.maxShowed) template.fullyDownThreshold = sPokedexScreenData->orderedDexCount - sListMenuTemplate_OrderedListMenu.maxShowed; else template.fullyDownThreshold = 0; return AddScrollIndicatorArrowPair(&template, &sPokedexScreenData->modeSelectCursorPosBak); } struct PokedexListItem { u16 species; bool8 seen:1; bool8 caught:1; }; static void ItemPrintFunc_OrderedListMenu(u8 windowId, u32 itemId, u8 y) { u16 species = itemId; bool8 seen = (itemId >> 16) & 1; // not used but required to match bool8 caught = (itemId >> 17) & 1; u8 type1; DexScreen_PrintMonDexNo(sPokedexScreenData->numericalOrderWindowId, FONT_SMALL, species, 12, y); //controls Pokedex num on scrolling lists if (caught) { BlitMenuInfoIcon(sPokedexScreenData->numericalOrderWindowId, MENU_INFO_ICON_CAUGHT, 0x28, y); type1 = gSpeciesInfo[species].types[0]; BlitMenuInfoIcon(sPokedexScreenData->numericalOrderWindowId, type1 + 1, 0x78, y); if (type1 != gSpeciesInfo[species].types[1]) BlitMenuInfoIcon(sPokedexScreenData->numericalOrderWindowId, gSpeciesInfo[species].types[1] + 1, 0x98, y); } } static void Task_DexScreen_CategorySubmenu(u8 taskId) // habitat pages { int pageFlipCmd; u8 *ptr; switch (sPokedexScreenData->state) { case 0: HideBg(3); HideBg(2); HideBg(1); DexScreen_GetPageLimitsForCategory(sPokedexScreenData->category); if (sPokedexScreenData->pageNum < sPokedexScreenData->firstPageInCategory) sPokedexScreenData->pageNum = sPokedexScreenData->firstPageInCategory; sPokedexScreenData->state = 2; break; case 1: DexScreen_DestroyCategoryPageMonIconAndInfoWindows(); HideBg(2); HideBg(1); switch (sPokedexScreenData->parentOfCategoryMenu) { case 0: default: gTasks[taskId].func = Task_PokedexScreen; break; case 1: gTasks[taskId].func = Task_DexScreen_CharacteristicOrder; break; } sPokedexScreenData->state = 0; break; case 2: DexScreen_CreateCategoryListGfx(FALSE); CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); DexScreen_CreateCategoryPageSelectionCursor(0xFF); sPokedexScreenData->state = 3; break; case 3: BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA); ShowBg(3); ShowBg(2); ShowBg(1); sPokedexScreenData->state = 4; break; case 4: sPokedexScreenData->scrollArrowsTaskId = DexScreen_CreateCategoryMenuScrollArrows(); sPokedexScreenData->categoryPageCursorTaskId = ListMenuAddCursorObjectInternal(&sCursorStruct_CategoryPage, 0); sPokedexScreenData->state = 5; break; case 5: DexScreen_CreateCategoryPageSelectionCursor(sPokedexScreenData->categoryCursorPosInPage); DexScreen_UpdateCategoryPageCursorObject(sPokedexScreenData->categoryPageCursorTaskId, sPokedexScreenData->categoryCursorPosInPage, sPokedexScreenData->numMonsOnPage); sPokedexScreenData->modeSelectCursorPosBak = sPokedexScreenData->pageNum; pageFlipCmd = 0; if (JOY_NEW(A_BUTTON) && DexScreen_GetSetPokedexFlag(sPokedexScreenData->pageSpecies[sPokedexScreenData->categoryCursorPosInPage], FLAG_GET_SEEN, TRUE)) { RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); ListMenuRemoveCursorObject(sPokedexScreenData->categoryPageCursorTaskId, 0); if(sPokedexScreenData->dexOrderId == DEX_ORDER_NUMERICAL_KANTO) sPokedexScreenData->dexOrderId = DEX_ORDER_NUMERICAL_NATIONAL; //making always use correct numbering? sPokedexScreenData->state = 12; break; } if (!JOY_HELD(R_BUTTON) && JOY_REPT(DPAD_LEFT)) { if (sPokedexScreenData->categoryCursorPosInPage != 0) { sPokedexScreenData->categoryCursorPosInPage--; PlaySE(SE_SELECT); break; } else pageFlipCmd = 1; } if (!JOY_HELD(R_BUTTON) && JOY_REPT(DPAD_RIGHT)) { if (sPokedexScreenData->categoryCursorPosInPage < sPokedexScreenData->numMonsOnPage - 1) { sPokedexScreenData->categoryCursorPosInPage++; PlaySE(SE_SELECT); break; } else pageFlipCmd = 2; } if (pageFlipCmd == 0) pageFlipCmd = DexScreen_InputHandler_GetShoulderInput(); switch (pageFlipCmd) { case 0: // No action break; case 1: // Left while (sPokedexScreenData->pageNum > sPokedexScreenData->firstPageInCategory) { sPokedexScreenData->pageNum--; if (DexScreen_IsPageUnlocked(sPokedexScreenData->category, sPokedexScreenData->pageNum)) { sPokedexScreenData->state = 8; break; } } if (sPokedexScreenData->state != 8) sPokedexScreenData->state = 6; break; case 2: // Right while (sPokedexScreenData->pageNum < sPokedexScreenData->lastPageInCategory - 1) { sPokedexScreenData->pageNum++; if (DexScreen_IsPageUnlocked(sPokedexScreenData->category, sPokedexScreenData->pageNum)) { sPokedexScreenData->state = 10; break; } } if (sPokedexScreenData->state != 10) sPokedexScreenData->state = 6; break; } if (JOY_NEW(B_BUTTON)) { sPokedexScreenData->state = 6; } break; case 6: case 7: RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId); ListMenuRemoveCursorObject(sPokedexScreenData->categoryPageCursorTaskId, 0); BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 1; break; case 8: case 10: DexScreen_DestroyCategoryPageMonIconAndInfoWindows(); DexScreen_CreateCategoryPageSelectionCursor(0xFF); ListMenuUpdateCursorObject(sPokedexScreenData->categoryPageCursorTaskId, 0, 0xA0, 0); sPokedexScreenData->categoryPageSelectionCursorTimer = 0; sPokedexScreenData->data[0] = 0; sPokedexScreenData->state++; break; case 9: if (DexScreen_FlipCategoryPageInDirection(0)) { sPokedexScreenData->categoryCursorPosInPage = sPokedexScreenData->numMonsOnPage - 1; sPokedexScreenData->state = 5; } break; case 11: if (DexScreen_FlipCategoryPageInDirection(1)) { sPokedexScreenData->categoryCursorPosInPage = 0; sPokedexScreenData->state = 5; } break; case 12: sPokedexScreenData->dexSpecies = sPokedexScreenData->pageSpecies[sPokedexScreenData->categoryCursorPosInPage]; PlaySE(SE_SELECT); sPokedexScreenData->state = 14; break; case 13: RemoveDexPageWindows(); sPokedexScreenData->state = 4; break; case 14: DexScreen_DrawMonDexPage(FALSE); sPokedexScreenData->state = 15; break; case 15: sPokedexScreenData->data[0] = 0; sPokedexScreenData->data[1] = 0; sPokedexScreenData->state++; // fallthrough case 16: if (sPokedexScreenData->data[1] < 6) { if (sPokedexScreenData->data[0]) { DexScreen_DexPageZoomEffectFrame(0, sPokedexScreenData->data[1]); CopyBgTilemapBufferToVram(0); sPokedexScreenData->data[0] = 4; sPokedexScreenData->data[1]++; } else { sPokedexScreenData->data[0]--; } } else { FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16); CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); PlayCry_NormalNoDucking(sPokedexScreenData->dexSpecies, 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL); gSaveBlock1Ptr->lastViewedPokedexEntry = sPokedexScreenData->dexSpecies; sPokedexScreenData->data[0] = 0; sPokedexScreenData->state = 17; } break; case 17: if (JOY_NEW(A_BUTTON)) { RemoveDexPageWindows(); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16); CopyBgTilemapBufferToVram(1); sPokedexScreenData->state = 21; } else if (JOY_NEW(B_BUTTON)) { sPokedexScreenData->state = 18; } else { DexScreen_InputHandler_StartToCry(); } break; case 18: DexScreen_CreateCategoryListGfx(FALSE); DexScreen_DexPageZoomEffectFrame(0, 6); CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 19; break; case 19: sPokedexScreenData->data[0] = 0; sPokedexScreenData->data[1] = 6; sPokedexScreenData->state++; // fallthrough case 20: if (sPokedexScreenData->data[1]) { if (sPokedexScreenData->data[0]) { sPokedexScreenData->data[1]--; FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16); DexScreen_DexPageZoomEffectFrame(0, sPokedexScreenData->data[1]); CopyBgTilemapBufferToVram(0); sPokedexScreenData->data[0] = 1; } else sPokedexScreenData->data[0]--; } else { FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 13; } break; case 21: DexScreen_DrawMonAreaPage(); sPokedexScreenData->state = 22; break; case 22: CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 23; break; case 23: if (JOY_NEW(A_BUTTON)) { FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 2, 30, 16); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16); FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 26; } else if (JOY_NEW(B_BUTTON)) { FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 2, 30, 16); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16); FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 24; } else { DexScreen_InputHandler_StartToCry(); } break; case 24: DexScreen_DestroyAreaScreenResources(); sPokedexScreenData->state = 25; break; case 25: DexScreen_DrawMonDexPage(FALSE); CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 17; break; case 26: DexScreen_DestroyAreaScreenResources(); sPokedexScreenData->state = 18; break; } } static u8 DexScreen_CreateCategoryMenuScrollArrows(void) { struct ScrollArrowsTemplate template = sScrollArrowsTemplate_CategoryMenu; template.fullyUpThreshold = sPokedexScreenData->firstPageInCategory; template.fullyDownThreshold = sPokedexScreenData->lastPageInCategory - 1; sPokedexScreenData->modeSelectCursorPosBak = sPokedexScreenData->pageNum; return AddScrollIndicatorArrowPair(&template, &sPokedexScreenData->modeSelectCursorPosBak); } /* * Returns 1 to flip pages left, 2 to flip pages right, 0 for no action */ static int DexScreen_InputHandler_GetShoulderInput(void) { switch (gSaveBlock2Ptr->optionsButtonMode) { case OPTIONS_BUTTON_MODE_L_EQUALS_A: // Using the JOY_HELD and JOY_NEW macros here does not match! if ((gMain.heldKeys & R_BUTTON) && (gMain.newKeys & DPAD_LEFT)) return 1; else if ((gMain.heldKeys & R_BUTTON) && (gMain.newKeys & DPAD_RIGHT)) return 2; else return 0; case OPTIONS_BUTTON_MODE_LR: if (gMain.newKeys & L_BUTTON) return 1; else if (gMain.newKeys & R_BUTTON) return 2; else return 0; case OPTIONS_BUTTON_MODE_HELP: default: return 0; } } static void Task_DexScreen_ShowMonPage(u8 taskId) { switch (sPokedexScreenData->state) { case 0: HideBg(3); HideBg(2); HideBg(1); sPokedexScreenData->state = 2; break; case 1: HideBg(2); HideBg(1); gTasks[taskId].func = Task_DexScreen_NumericalOrder; sPokedexScreenData->state = 0; break; case 2: sPokedexScreenData->numMonsOnPage = 1; DexScreen_DrawMonDexPage(FALSE); sPokedexScreenData->state = 3; break; case 3: CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); PlayCry_NormalNoDucking(sPokedexScreenData->dexSpecies, 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL); gSaveBlock1Ptr->lastViewedPokedexEntry = sPokedexScreenData->dexSpecies; sPokedexScreenData->state = 4; break; case 4: BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA); ShowBg(3); ShowBg(2); ShowBg(1); sPokedexScreenData->state = 5; break; case 5: if (JOY_NEW(A_BUTTON)) { RemoveDexPageWindows(); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16); CopyBgTilemapBufferToVram(1); sPokedexScreenData->state = 7; } else if (JOY_NEW(B_BUTTON)) { RemoveDexPageWindows(); BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 1; } else if (JOY_NEW(DPAD_UP) && DexScreen_TryScrollMonsVertical(1)) { RemoveDexPageWindows(); BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 6; } else if (JOY_NEW(DPAD_DOWN) && DexScreen_TryScrollMonsVertical(0)) { RemoveDexPageWindows(); BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 6; } else { DexScreen_InputHandler_StartToCry(); } break; case 6: HideBg(2); HideBg(1); sPokedexScreenData->dexSpecies = sPokedexScreenData->characteristicMenuInput; sPokedexScreenData->state = 2; break; case 7: DexScreen_DrawMonAreaPage(); sPokedexScreenData->state = 8; break; case 8: CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 9; break; case 9: if (JOY_NEW(A_BUTTON)) { BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA); sPokedexScreenData->state = 12; } else if (JOY_NEW(B_BUTTON)) { FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 2, 30, 16); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16); FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 10; } else { DexScreen_InputHandler_StartToCry(); } break; case 10: DexScreen_DestroyAreaScreenResources(); sPokedexScreenData->state = 11; break; case 11: DexScreen_DrawMonDexPage(FALSE); CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 5; break; case 12: DexScreen_DestroyAreaScreenResources(); FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16); CopyBgTilemapBufferToVram(0); sPokedexScreenData->state = 1; break; } } static bool32 DexScreen_TryScrollMonsVertical(u8 direction) { int selectedIndex; u16 *itemsAbove_p, *cursorPos_p; switch (sPokedexScreenData->dexOrderId) { default: case DEX_ORDER_NUMERICAL_KANTO: cursorPos_p = &sPokedexScreenData->kantoOrderMenuCursorPos; itemsAbove_p = &sPokedexScreenData->kantoOrderMenuItemsAbove; break; case DEX_ORDER_ATOZ: case DEX_ORDER_TYPE: case DEX_ORDER_LIGHTEST: case DEX_ORDER_SMALLEST: cursorPos_p = &sPokedexScreenData->characteristicOrderMenuCursorPos; itemsAbove_p = &sPokedexScreenData->characteristicOrderMenuItemsAbove; break; case DEX_ORDER_NUMERICAL_NATIONAL: cursorPos_p = &sPokedexScreenData->nationalOrderMenuCursorPos; itemsAbove_p = &sPokedexScreenData->nationalOrderMenuItemsAbove; break; } selectedIndex = *cursorPos_p + *itemsAbove_p; if (direction) // Seek up { if (selectedIndex == 0) return FALSE; selectedIndex--; while (selectedIndex >= 0) //Should be while (--selectedIndex >= 0) without the selectedIndex-- in the body or before the while at all, but this is needed to match. { if ((sPokedexScreenData->listItems[selectedIndex].index >> 16) & 1) { break; } selectedIndex--; } if (selectedIndex < 0) { return FALSE; } } else // Seek down { if (selectedIndex == sPokedexScreenData->orderedDexCount - 1) { return FALSE; } selectedIndex++; while (selectedIndex < sPokedexScreenData->orderedDexCount) //Should be while (++selectedIndex < sPokedexScreenData->orderedDexCount) without the selectedIndex++ in the body or before the while at all, but this is needed to match. { if ((sPokedexScreenData->listItems[selectedIndex].index >> 16) & 1) break; selectedIndex++; } if (selectedIndex >= sPokedexScreenData->orderedDexCount) { return FALSE; } } sPokedexScreenData->characteristicMenuInput = sPokedexScreenData->listItems[selectedIndex].index; if (sPokedexScreenData->orderedDexCount > 9) { if (selectedIndex < 4) { *cursorPos_p = 0; *itemsAbove_p = selectedIndex; } else if (selectedIndex >= (sPokedexScreenData->orderedDexCount - 4)) { *cursorPos_p = (sPokedexScreenData->orderedDexCount - 9); *itemsAbove_p = selectedIndex + 9 - (sPokedexScreenData->orderedDexCount); } else { *cursorPos_p = selectedIndex - 4; *itemsAbove_p = 4; } } else { *cursorPos_p = 0; *itemsAbove_p = selectedIndex; } return TRUE; } static void DexScreen_RemoveWindow(u8 *windowId_p) { if (*windowId_p != 0xFF) { RemoveWindow(*windowId_p); *windowId_p = 0xFF; } } static void DexScreen_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx) { u8 textColor[3]; switch (colorIdx) { case 0: textColor[0] = 0; textColor[1] = 1; textColor[2] = 3; break; case 1: textColor[0] = 0; textColor[1] = 5; textColor[2] = 1; break; case 2: textColor[0] = 0; textColor[1] = 15; textColor[2] = 14; break; case 3: textColor[0] = 0; textColor[1] = 11; textColor[2] = 1; break; case 4: textColor[0] = 0; textColor[1] = 1; textColor[2] = 2; break; } AddTextPrinterParameterized4(windowId, fontId, x, y, fontId == FONT_SMALL ? 0 : 1, 0, textColor, -1, str); } static void DexScreen_PrintNum3LeadingZeroes(u8 windowId, u8 fontId, u16 num, u8 x, u8 y, u8 colorIdx) { u8 buff[4]; buff[0] = (num / 100) + CHAR_0; buff[1] = ((num %= 100) / 10) + CHAR_0; buff[2] = (num % 10) + CHAR_0; buff[3] = EOS; DexScreen_AddTextPrinterParameterized(windowId, fontId, buff, x, y, colorIdx); } static void DexScreen_PrintNum3RightAlign(u8 windowId, u8 fontId, u16 num, u8 x, u8 y, u8 colorIdx) { u8 buff[4]; int i; buff[0] = (num / 100) + CHAR_0; buff[1] = ((num %= 100) / 10) + CHAR_0; buff[2] = (num % 10) + CHAR_0; buff[3] = EOS; for (i = 0; i < 3; i++) { if (buff[i] != CHAR_0) break; buff[i] = CHAR_SPACE; } DexScreen_AddTextPrinterParameterized(windowId, fontId, buff, x, y, colorIdx); } static u32 DexScreen_GetDefaultPersonality(int species) { switch (species) { case SPECIES_SPINDA: return gSaveBlock2Ptr->pokedex.spindaPersonality; case SPECIES_UNOWN: return gSaveBlock2Ptr->pokedex.unownPersonality; default: return 0; } } static void DexScreen_LoadMonPicInWindow(u8 windowId, u16 species, u16 paletteOffset) { LoadMonPicInWindow(species, SHINY_ODDS, DexScreen_GetDefaultPersonality(species), TRUE, paletteOffset >> 4, windowId); } static void DexScreen_PrintMonDexNo(u8 windowId, u8 fontId, u16 species, u8 x, u8 y) { u8 state; u8 numToPrint; if(IsNationalPokedexEnabled()) state = 3; else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) state = 2; else //Kanto only state = 1; switch(state) //setting up which numbers to print { case 1: //only Kanto, always national ordering numToPrint = 0; break; case 2: //extended but not national, conditional if(sPokedexScreenData->dexOrderId == 0) numToPrint = 0; else if(sPokedexScreenData->dexOrderId == 5) numToPrint = 1; else numToPrint = 1; break; case 3: //national if(sPokedexScreenData->dexOrderId == 0) { if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE)) numToPrint = 1; else numToPrint = 0; } else numToPrint = 0; break; } if(!numToPrint) { // use national numbering u16 dexNum = SpeciesToNationalPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } else { // use extended numbering u16 dexNum = SpeciesToExtendedPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } /* if(sPokedexScreenData->dexOrderId == 0) { if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE) && IsNationalPokedexEnabled()) { // use extended numbering u16 dexNum = SpeciesToExtendedPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } else { // use national numbering u16 dexNum = SpeciesToNationalPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } } if(sPokedexScreenData->dexOrderId == 5) { if(!IsNationalPokedexEnabled()) { // use extended numbering, on natdex page but no natdex u16 dexNum = SpeciesToExtendedPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } else { //with natdex, always use national numbering on natdex page u16 dexNum = SpeciesToNationalPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } } if(sPokedexScreenData->dexOrderId != 0 && sPokedexScreenData->dexOrderId != 5) { //for ABC, Weight, Height, etc. modes if(IsNationalPokedexEnabled() || (!IsNationalPokedexEnabled() && !FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX))) { //just Kanto Dex, or have National dex u16 dexNum = SpeciesToNationalPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) { //just Extended but not national u16 dexNum = SpeciesToExtendedPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } }*/ } static void HabitatNameTagNumPrinter(u8 windowId, u8 fontId, u16 species, u8 x, u8 y) { bool8 numToPrint = 0; if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) numToPrint = 1; if(!numToPrint) { // use national numbering u16 dexNum = SpeciesToNationalPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } else { // use extended numbering u16 dexNum = SpeciesToExtendedPokedexNum(species); DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0); DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0); return; } } s8 DexScreen_GetSetPokedexFlag(u16 nationalDexNo, u8 caseId, bool8 indexIsSpecies) { u8 index; u8 bit; u8 mask; s8 retVal; if (indexIsSpecies) nationalDexNo = SpeciesToNationalPokedexNum(nationalDexNo); nationalDexNo--; index = nationalDexNo / 8; bit = nationalDexNo % 8; mask = 1 << bit; retVal = 0; switch (caseId) { case FLAG_GET_SEEN: if (gSaveBlock2Ptr->pokedex.seen[index] & mask) { retVal = 1; } break; case FLAG_GET_CAUGHT: if (gSaveBlock2Ptr->pokedex.owned[index] & mask) { if ((gSaveBlock2Ptr->pokedex.owned[index] & mask) == (gSaveBlock2Ptr->pokedex.seen[index] & mask)) retVal = 1; } break; case FLAG_SET_SEEN: gSaveBlock2Ptr->pokedex.seen[index] |= mask; break; case FLAG_SET_CAUGHT: gSaveBlock2Ptr->pokedex.owned[index] |= mask; break; } return retVal; } static u16 DexScreen_GetDexCount(u8 caseId, u8 whichDex) { u16 count = 0; u32 i; switch (whichDex) { case 0: // Kanto for (i = 0; i < KANTO_DEX_COUNT; i++) { if (DexScreen_GetSetPokedexFlag(i + 1, caseId, FALSE)) count++; } break; case 1: // National for (i = 0; i < NATIONAL_DEX_COUNT; i++) { if (DexScreen_GetSetPokedexFlag(i + 1, caseId, FALSE)) count++; } break; case 2: // Extended for (i = 0; i < EXTENDED_DEX_COUNT; i++) { if (DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), caseId, FALSE)) count++; } break; } return count; } static void DexScreen_PrintControlInfo(const u8 *src) { DexScreen_AddTextPrinterParameterized(1, FONT_SMALL, src, 236 - GetStringWidth(FONT_SMALL, src, 0), 2, 4); } bool8 DexScreen_DrawMonPicInCategoryPage(u16 species, u8 slot, u8 numSlots) { struct WindowTemplate template; numSlots--; CopyToBgTilemapBufferRect_ChangePalette(3, sCategoryPageIconWindowBg, sCategoryPageIconCoords[numSlots][slot][0], sCategoryPageIconCoords[numSlots][slot][1], 8, 8, slot + 5); if (sPokedexScreenData->categoryMonWindowIds[slot] == 0xFF) { template = sWindowTemplate_CategoryMonIcon; template.tilemapLeft = sCategoryPageIconCoords[numSlots][slot][0]; template.tilemapTop = sCategoryPageIconCoords[numSlots][slot][1]; template.paletteNum = slot + 1; template.baseBlock = slot * 64 + 8; sPokedexScreenData->categoryMonWindowIds[slot] = AddWindow(&template); FillWindowPixelBuffer(sPokedexScreenData->categoryMonWindowIds[slot], PIXEL_FILL(0)); DexScreen_LoadMonPicInWindow(sPokedexScreenData->categoryMonWindowIds[slot], species, slot * 16 + 16); PutWindowTilemap(sPokedexScreenData->categoryMonWindowIds[slot]); CopyWindowToVram(sPokedexScreenData->categoryMonWindowIds[slot], COPYWIN_GFX); } else PutWindowTilemap(sPokedexScreenData->categoryMonWindowIds[slot]); if (sPokedexScreenData->categoryMonInfoWindowIds[slot] == 0xFF) { if (species != SPECIES_NONE) { template = sWindowTemplate_CategoryMonInfo; template.tilemapLeft = sCategoryPageIconCoords[numSlots][slot][2]; template.tilemapTop = sCategoryPageIconCoords[numSlots][slot][3]; template.baseBlock = slot * 40 + 0x108; sPokedexScreenData->categoryMonInfoWindowIds[slot] = AddWindow(&template); CopyToWindowPixelBuffer(sPokedexScreenData->categoryMonInfoWindowIds[slot], sCategoryMonInfoBgTiles, 0, 0); DexScreen_PrintMonDexNo(sPokedexScreenData->categoryMonInfoWindowIds[slot], FONT_SMALL, species, 12, 0); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->categoryMonInfoWindowIds[slot], FONT_NORMAL, gSpeciesNames[species], 2, 13, 0); if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, TRUE)) BlitBitmapRectToWindow(sPokedexScreenData->categoryMonInfoWindowIds[slot], sDexScreen_CaughtIcon, 0, 0, 8, 8, 2, 3, 8, 8); PutWindowTilemap(sPokedexScreenData->categoryMonInfoWindowIds[slot]); CopyWindowToVram(sPokedexScreenData->categoryMonInfoWindowIds[slot], COPYWIN_GFX); } } else PutWindowTilemap(sPokedexScreenData->categoryMonInfoWindowIds[slot]); return TRUE; } static void DexScreen_DestroyCategoryPageMonIconAndInfoWindows(void) { int i; for (i = 0; i < 4; i++) { DexScreen_RemoveWindow(&sPokedexScreenData->categoryMonWindowIds[i]); DexScreen_RemoveWindow(&sPokedexScreenData->categoryMonInfoWindowIds[i]); } } static void DexScreen_PrintCategoryPageNumbers(u8 windowId, u16 currentPage, u16 totalPages, u16 x, u16 y) { u8 buffer[30]; u8 *ptr = StringCopy(buffer, gText_Page); ptr = ConvertIntToDecimalStringN(ptr, currentPage, STR_CONV_MODE_RIGHT_ALIGN, 2); *ptr++ = CHAR_SLASH; ptr = ConvertIntToDecimalStringN(ptr, totalPages, STR_CONV_MODE_RIGHT_ALIGN, 2); DexScreen_PrintStringWithAlignment(buffer, TEXT_RIGHT); } static bool8 DexScreen_CreateCategoryListGfx(bool8 justRegistered) { FillBgTilemapBufferRect_Palette0(3, 2, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 20); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); DexScreen_CreateCategoryPageSpeciesList(sPokedexScreenData->category, sPokedexScreenData->pageNum); FillWindowPixelBuffer(0, PIXEL_FILL(15)); if (justRegistered) { DexScreen_PrintStringWithAlignment(sDexCategoryNamePtrs[sPokedexScreenData->category], TEXT_CENTER); } else { DexScreen_PrintStringWithAlignment(sDexCategoryNamePtrs[sPokedexScreenData->category], TEXT_LEFT); DexScreen_PrintCategoryPageNumbers(0, DexScreen_PageNumberToRenderablePages(sPokedexScreenData->pageNum), DexScreen_PageNumberToRenderablePages(sPokedexScreenData->lastPageInCategory - 1), 160, 2); } CopyWindowToVram(0, COPYWIN_GFX); FillWindowPixelBuffer(1, PIXEL_FILL(15)); if (!justRegistered) DexScreen_PrintControlInfo(gText_PickFlipPageCheckCancel); CopyWindowToVram(1, COPYWIN_GFX); if (sPokedexScreenData->pageSpecies[0] != 0xFFFF) DexScreen_DrawMonPicInCategoryPage(sPokedexScreenData->pageSpecies[0], 0, sPokedexScreenData->numMonsOnPage); if (sPokedexScreenData->pageSpecies[1] != 0xFFFF) DexScreen_DrawMonPicInCategoryPage(sPokedexScreenData->pageSpecies[1], 1, sPokedexScreenData->numMonsOnPage); if (sPokedexScreenData->pageSpecies[2] != 0xFFFF) DexScreen_DrawMonPicInCategoryPage(sPokedexScreenData->pageSpecies[2], 2, sPokedexScreenData->numMonsOnPage); if (sPokedexScreenData->pageSpecies[3] != 0xFFFF) DexScreen_DrawMonPicInCategoryPage(sPokedexScreenData->pageSpecies[3], 3, sPokedexScreenData->numMonsOnPage); return FALSE; } static void DexScreen_CreateCategoryPageSelectionCursor(u8 cursorPos) { int i; u32 palIdx; if (cursorPos == 0xFF) { for (i = 0; i < 4; i++) { LoadPalette(&sDexScreen_CategoryCursorPals[0], PLTT_ID(i) + PLTT_ID(5) + 2 + BG_PLTT_OFFSET, PLTT_SIZEOF(1)); LoadPalette(&sDexScreen_CategoryCursorPals[1], PLTT_ID(i) + PLTT_ID(5) + 8 + BG_PLTT_OFFSET, PLTT_SIZEOF(1)); } LoadPalette(&sDexScreen_CategoryCursorPals[0], 0x141, PLTT_SIZEOF(1)); sPokedexScreenData->categoryPageSelectionCursorTimer = 0; } else { sPokedexScreenData->categoryPageSelectionCursorTimer++; if (sPokedexScreenData->categoryPageSelectionCursorTimer == 16) sPokedexScreenData->categoryPageSelectionCursorTimer = 0; palIdx = sPokedexScreenData->categoryPageSelectionCursorTimer >> 2; for (i = 0; i < 4; i++) { if (i == cursorPos) { LoadPalette(&sDexScreen_CategoryCursorPals[2 * palIdx + 2], PLTT_ID(i) + PLTT_ID(5) + 2 + BG_PLTT_OFFSET, PLTT_SIZEOF(1)); LoadPalette(&sDexScreen_CategoryCursorPals[2 * palIdx + 3], PLTT_ID(i) + PLTT_ID(5) + 8 + BG_PLTT_OFFSET, PLTT_SIZEOF(1)); } else { LoadPalette(&sDexScreen_CategoryCursorPals[0], PLTT_ID(i) + PLTT_ID(5) + 2 + BG_PLTT_OFFSET, PLTT_SIZEOF(1)); LoadPalette(&sDexScreen_CategoryCursorPals[1], PLTT_ID(i) + PLTT_ID(5) + 8 + BG_PLTT_OFFSET, PLTT_SIZEOF(1)); } } LoadPalette(&sDexScreen_CategoryCursorPals[2 * palIdx + 2], OBJ_PLTT_ID(4) + 1, PLTT_SIZEOF(1)); } } static void DexScreen_UpdateCategoryPageCursorObject(u8 taskId, u8 cursorPos, u8 numMonsInPage) { numMonsInPage--; ListMenuUpdateCursorObject(taskId, sCategoryPageIconCoords[numMonsInPage][cursorPos][2] * 8, sCategoryPageIconCoords[numMonsInPage][cursorPos][3] * 8, 0); } bool8 DexPage_TileBuffer_CopyCol(const u16 *srcBuf, u8 srcCol, u16 *dstBuf, u8 dstCol) { int i; const u16 *src = &srcBuf[srcCol]; u16 *dst = &dstBuf[dstCol]; for (i = 0; i < 20; i++) { *dst = *src; dst += 32; src += 32; } return FALSE; } bool8 DexPage_TileBuffer_FillCol(u16 tileNo, u16 *tileBuf, u8 x) { int i; u16 *dst = &tileBuf[x]; for (i = 0; i < 20; i++) { *dst = tileNo; dst += 32; } return FALSE; } bool8 DexScreen_TurnCategoryPage_BgEffect(u8 page) { int dstCol; int srcCol; u16 *bg1buff = GetBgTilemapBuffer(1); u16 *bg2buff = GetBgTilemapBuffer(2); u16 *bg3buff = GetBgTilemapBuffer(3); u16 *bg1mem = sPokedexScreenData->bgBufsMem + 0x800; u16 *bg2mem = sPokedexScreenData->bgBufsMem + 0x400; u16 *bg3mem = sPokedexScreenData->bgBufsMem + 0x000; for (dstCol = 0; dstCol < 30; dstCol++) { srcCol = sDexScreenPageTurnColumns[page][dstCol]; if (srcCol == 30) { DexPage_TileBuffer_FillCol(0x000, bg1buff, dstCol); DexPage_TileBuffer_FillCol(0x000, bg2buff, dstCol); DexPage_TileBuffer_FillCol(0x00C, bg3buff, dstCol); } else { DexPage_TileBuffer_CopyCol(bg1mem, srcCol, bg1buff, dstCol); DexPage_TileBuffer_CopyCol(bg2mem, srcCol, bg2buff, dstCol); DexPage_TileBuffer_CopyCol(bg3mem, srcCol, bg3buff, dstCol); } } CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); return FALSE; } /* * Direction = 0: Left; 1: Right */ static bool8 DexScreen_FlipCategoryPageInDirection(u8 direction) { u16 color; if (IsNationalPokedexEnabled()) color = sNationalDexPalette[7]; else color = sKantoDexPalette[7]; switch (sPokedexScreenData->data[0]) { case 0: sPokedexScreenData->bgBufsMem = Alloc(3 * BG_SCREEN_SIZE); if (direction) sPokedexScreenData->data[0] = 6; else sPokedexScreenData->data[0] = 2; break; case 1: Free(sPokedexScreenData->bgBufsMem); return TRUE; // Go left case 2: BeginNormalPaletteFade(0x00007FFF, 0, 0, 16, color); sPokedexScreenData->data[0]++; break; case 3: FillBgTilemapBufferRect_Palette0(3, 0x00C, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 32, 20); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); sPokedexScreenData->data[0]++; break; case 4: BeginNormalPaletteFade(0x00007FFF, 0, 0, 0, color); DexScreen_CreateCategoryListGfx(FALSE); CpuFastCopy(GetBgTilemapBuffer(3), &sPokedexScreenData->bgBufsMem[0 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE); CpuFastCopy(GetBgTilemapBuffer(2), &sPokedexScreenData->bgBufsMem[1 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE); CpuFastCopy(GetBgTilemapBuffer(1), &sPokedexScreenData->bgBufsMem[2 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE); FillBgTilemapBufferRect_Palette0(3, 0x00C, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 32, 20); FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20); sPokedexScreenData->data[1] = 0; sPokedexScreenData->data[0]++; PlaySE(SE_BALL_TRAY_ENTER); break; case 5: if (sPokedexScreenData->data[1] < 10) { DexScreen_TurnCategoryPage_BgEffect(sPokedexScreenData->data[1]); sPokedexScreenData->data[1]++; } else { sPokedexScreenData->data[0] = 1; } break; // Go right case 6: CpuFastCopy(GetBgTilemapBuffer(3), &sPokedexScreenData->bgBufsMem[0 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE); CpuFastCopy(GetBgTilemapBuffer(2), &sPokedexScreenData->bgBufsMem[1 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE); CpuFastCopy(GetBgTilemapBuffer(1), &sPokedexScreenData->bgBufsMem[2 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE); sPokedexScreenData->data[1] = 9; sPokedexScreenData->data[0]++; PlaySE(SE_BALL_TRAY_ENTER); break; case 7: if (sPokedexScreenData->data[1] != 0) { DexScreen_TurnCategoryPage_BgEffect(sPokedexScreenData->data[1]); sPokedexScreenData->data[1]--; } else { #ifdef BUGFIX DexScreen_TurnCategoryPage_BgEffect(0); #else DexScreen_TurnCategoryPage_BgEffect(sPokedexScreenData->data[0]); #endif BeginNormalPaletteFade(0x00007FFF, 0, 16, 16, color); sPokedexScreenData->data[0]++; } break; case 8: gPaletteFade.bufferTransferDisabled = TRUE; DexScreen_CreateCategoryListGfx(FALSE); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); sPokedexScreenData->data[0]++; break; case 9: gPaletteFade.bufferTransferDisabled = FALSE; BeginNormalPaletteFade(0x00007FFF, 0, 16, 0, color); sPokedexScreenData->data[0] = 1; break; } return FALSE; } // Scale from 0 to 6 void DexScreen_DexPageZoomEffectFrame(u8 bg, u8 scale) { u8 tileLeft, tileTop, width, height; s16 left, top, divY; if (!sPokedexScreenData->numMonsOnPage) { tileLeft = sCategoryPageIconCoords[0][0][2]; tileTop = sCategoryPageIconCoords[0][0][3]; } else { tileLeft = sCategoryPageIconCoords[sPokedexScreenData->numMonsOnPage - 1][sPokedexScreenData->categoryCursorPosInPage][2]; tileTop = sCategoryPageIconCoords[sPokedexScreenData->numMonsOnPage - 1][sPokedexScreenData->categoryCursorPosInPage][3]; } width = 6 + (scale * 4); height = 3 + (scale * 2); if (width >= 28) // Make sure it's not wider than the screen width = 28; if (height >= 14) // Make sure it's not taller than the screen height = 14; left = tileLeft - ((scale * 4) / 2); top = tileTop - ((scale * 2) / 2); if ((left + width + 2) >= 30) // Don't wrap right... left -= ((left + width + 2) - 30); else if (left < 0) // ... left ... left = 0; if ((top + height + 2) >= 18) // ... down ... top -= ((top + height + 2) - 18); else if (top < 2) // or up. top = 2; divY = (top + 1) + ((height / 2) + 1); // The horizontal divider // Top edge FillBgTilemapBufferRect_Palette0(bg, 4, left, top, 1, 1); FillBgTilemapBufferRect_Palette0(bg, 5, left + 1, top, width, 1); FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(4), left + 1 + width, top, 1, 1); // Bottom edge FillBgTilemapBufferRect_Palette0(bg, 10, left, top + 1 + height, 1, 1); FillBgTilemapBufferRect_Palette0(bg, 11, left + 1, top + 1 + height, width, 1); FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(10), left + 1 + width, top + 1 + height, 1, 1); // Left edge FillBgTilemapBufferRect_Palette0(bg, 6, left, top + 1, 1, divY - top - 1); FillBgTilemapBufferRect_Palette0(bg, 7, left, divY, 1, 1); FillBgTilemapBufferRect_Palette0(bg, 9, left, divY + 1, 1, top + height - divY); // Right edge FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(6), left + 1 + width, top + 1, 1, divY - top - 1); FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(7), left + 1 + width, divY, 1, 1); FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(9), left + 1 + width, divY + 1, 1, top + height - divY); // Interior FillBgTilemapBufferRect_Palette0(bg, 1, left + 1, top + 1, width, divY - top - 1); FillBgTilemapBufferRect_Palette0(bg, 8, left + 1, divY, width, 1); FillBgTilemapBufferRect_Palette0(bg, 2, left + 1, divY + 1, width, top + height - divY); } void DexScreen_PrintMonCategory(u8 windowId, u16 species, u8 x, u8 y) { u8 * categoryName; u8 index, categoryStr[12]; species = SpeciesToNationalPokedexNum(species); categoryName = (u8 *)gPokedexEntries[species].categoryName; index = 0; if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, FALSE)) { while ((categoryName[index] != EOS) && (index < 11)) { categoryStr[index] = categoryName[index]; index++; } } else { while (index < 11) { categoryStr[index] = CHAR_QUESTION_MARK; index++; } } categoryStr[index] = EOS; DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, categoryStr, x, y, 0); x += GetStringWidth(FONT_SMALL, categoryStr, 0); DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, gText_PokedexPokemon, x, y, 0); } void DexScreen_PrintMonHeight(u8 windowId, u16 species, u8 x, u8 y) { u16 height; u32 inches, feet; const u8 *labelText; u8 buffer[32]; u8 i; species = SpeciesToNationalPokedexNum(species); height = gPokedexEntries[species].height; labelText = gText_HT; i = 0; buffer[i++] = EXT_CTRL_CODE_BEGIN; buffer[i++] = EXT_CTRL_CODE_MIN_LETTER_SPACING; buffer[i++] = 5; buffer[i++] = CHAR_SPACE; if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, FALSE)) { inches = 10000 * height / 254; // actually tenths of inches here if (inches % 10 >= 5) inches += 10; feet = inches / 120; inches = (inches - (feet * 120)) / 10; if (feet / 10 == 0) { buffer[i++] = 0; buffer[i++] = feet + CHAR_0; } else { buffer[i++] = feet / 10 + CHAR_0; buffer[i++] = feet % 10 + CHAR_0; } buffer[i++] = CHAR_SGL_QUOTE_RIGHT; buffer[i++] = inches / 10 + CHAR_0; buffer[i++] = inches % 10 + CHAR_0; buffer[i++] = CHAR_DBL_QUOTE_RIGHT; buffer[i++] = EOS; } else { buffer[i++] = CHAR_QUESTION_MARK; buffer[i++] = CHAR_QUESTION_MARK; buffer[i++] = CHAR_SGL_QUOTE_RIGHT; buffer[i++] = CHAR_QUESTION_MARK; buffer[i++] = CHAR_QUESTION_MARK; buffer[i++] = CHAR_DBL_QUOTE_RIGHT; } buffer[i++] = EOS; DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, labelText, x, y, 0); x += 30; DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, buffer, x, y, 0); } void DexScreen_PrintMonWeight(u8 windowId, u16 species, u8 x, u8 y) { u16 weight; u32 lbs; bool8 output; const u8 * labelText; const u8 * lbsText; u8 buffer[32]; u8 i; u32 j; species = SpeciesToNationalPokedexNum(species); weight = gPokedexEntries[species].weight; labelText = gText_WT; lbsText = gText_Lbs; i = 0; buffer[i++] = EXT_CTRL_CODE_BEGIN; buffer[i++] = EXT_CTRL_CODE_MIN_LETTER_SPACING; buffer[i++] = 5; if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, FALSE)) { lbs = (weight * 100000) / 4536; // Convert to hundredths of lb // Round up to the nearest 0.1 lb if (lbs % 10 >= 5) lbs += 10; output = FALSE; if ((buffer[i] = (lbs / 100000) + CHAR_0) == CHAR_0 && !output) { buffer[i++] = CHAR_SPACE; } else { output = TRUE; i++; } lbs %= 100000; if ((buffer[i] = (lbs / 10000) + CHAR_0) == CHAR_0 && !output) { buffer[i++] = CHAR_SPACE; } else { output = TRUE; i++; } lbs %= 10000; if ((buffer[i] = (lbs / 1000) + CHAR_0) == CHAR_0 && !output) { buffer[i++] = CHAR_SPACE; } else { output = TRUE; i++; } lbs %= 1000; buffer[i++] = (lbs / 100) + CHAR_0; lbs %= 100; buffer[i++] = CHAR_PERIOD; buffer[i++] = (lbs / 10) + CHAR_0; } else { buffer[i++] = CHAR_QUESTION_MARK; buffer[i++] = CHAR_QUESTION_MARK; buffer[i++] = CHAR_QUESTION_MARK; buffer[i++] = CHAR_QUESTION_MARK; buffer[i++] = CHAR_PERIOD; buffer[i++] = CHAR_QUESTION_MARK; } buffer[i++] = CHAR_SPACE; buffer[i++] = EXT_CTRL_CODE_BEGIN; buffer[i++] = EXT_CTRL_CODE_MIN_LETTER_SPACING; buffer[i++] = 0; for (j = 0; j < 33 - i && lbsText[j] != EOS; j++) buffer[i + j] = lbsText[j]; buffer[i + j] = EOS; DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, labelText, x, y, 0); x += 30; DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, buffer, x, y, 0); } void DexScreen_PrintMonFlavorText(u8 windowId, u16 species, u8 x, u8 y) { struct TextPrinterTemplate printerTemplate; u16 length; s32 xCenter; species = SpeciesToNationalPokedexNum(species); if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, FALSE)) { if(gSaveBlock1Ptr->keyFlags.version == 0) //FR printerTemplate.currentChar = gPokedexEntries[species].description_FR; else printerTemplate.currentChar = gPokedexEntries[species].description_LG; printerTemplate.windowId = windowId; printerTemplate.fontId = FONT_NORMAL; printerTemplate.letterSpacing = 1; printerTemplate.lineSpacing = 0; printerTemplate.unk = 0; printerTemplate.fgColor = 1; printerTemplate.bgColor = 0; printerTemplate.shadowColor = 2; if(gSaveBlock1Ptr->keyFlags.version == 0) //FR length = GetStringWidth(FONT_NORMAL, gPokedexEntries[species].description_FR, 0); else length = GetStringWidth(FONT_NORMAL, gPokedexEntries[species].description_LG, 0); xCenter = x + (240 - length) / 2; if (xCenter > 0) x = xCenter; else x = 0; printerTemplate.x = x; printerTemplate.y = y; printerTemplate.currentX = x; printerTemplate.currentY = y; AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL); } } void DexScreen_DrawMonFootprint(u8 windowId, u16 species, u8 x, u8 y) { u16 i, j, unused, tileIdx; u8 footprintPixel, footprintTile; u8 * buffer; u8 * footprint; if (!(DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, TRUE))) return; footprint = (u8 *)(gMonFootprintTable[species]); buffer = gDecompressionBuffer; unused = 0; tileIdx = 0; // Expand 1bpp to 4bpp for (i = 0; i < 32; i++) { footprintPixel = footprint[i]; for (j = 0; j < 8 / 2; j++) { footprintTile = 0; if (footprintPixel & (1 << (j * 2))) footprintTile |= 0x01; if (footprintPixel & (2 << (j * 2))) footprintTile |= 0x10; buffer[tileIdx] = footprintTile; tileIdx++; } } BlitBitmapRectToWindow(windowId, buffer, 0, 0, 16, 16, x, y, 16, 16); } static u8 DexScreen_DrawMonDexPage(bool8 justRegistered) { DexScreen_DexPageZoomEffectFrame(3, 6); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 30, 16); sPokedexScreenData->windowIds[0] = AddWindow(&sWindowTemplate_DexEntry_MonPic); sPokedexScreenData->windowIds[1] = AddWindow(&sWindowTemplate_DexEntry_SpeciesStats); sPokedexScreenData->windowIds[2] = AddWindow(&sWindowTemplate_DexEntry_FlavorText); // Mon pic FillWindowPixelBuffer(sPokedexScreenData->windowIds[0], PIXEL_FILL(0)); DexScreen_LoadMonPicInWindow(sPokedexScreenData->windowIds[0], sPokedexScreenData->dexSpecies, 144); PutWindowTilemap(sPokedexScreenData->windowIds[0]); CopyWindowToVram(sPokedexScreenData->windowIds[0], COPYWIN_GFX); // Species stats FillWindowPixelBuffer(sPokedexScreenData->windowIds[1], PIXEL_FILL(0)); DexScreen_PrintMonDexNo(sPokedexScreenData->windowIds[1], FONT_SMALL, sPokedexScreenData->dexSpecies, 0, 8); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[1], FONT_NORMAL, gSpeciesNames[sPokedexScreenData->dexSpecies], 28, 8, 0); DexScreen_PrintMonCategory(sPokedexScreenData->windowIds[1], sPokedexScreenData->dexSpecies, 0, 24); DexScreen_PrintMonHeight(sPokedexScreenData->windowIds[1], sPokedexScreenData->dexSpecies, 0, 36); DexScreen_PrintMonWeight(sPokedexScreenData->windowIds[1], sPokedexScreenData->dexSpecies, 0, 48); DexScreen_DrawMonFootprint(sPokedexScreenData->windowIds[1], sPokedexScreenData->dexSpecies, 88, 40); PutWindowTilemap(sPokedexScreenData->windowIds[1]); CopyWindowToVram(sPokedexScreenData->windowIds[1], COPYWIN_GFX); // Dex entry FillWindowPixelBuffer(sPokedexScreenData->windowIds[2], PIXEL_FILL(0)); DexScreen_PrintMonFlavorText(sPokedexScreenData->windowIds[2], sPokedexScreenData->dexSpecies, 0, 8); PutWindowTilemap(sPokedexScreenData->windowIds[2]); CopyWindowToVram(sPokedexScreenData->windowIds[2], COPYWIN_GFX); // Control info FillWindowPixelBuffer(1, PIXEL_FILL(15)); if (justRegistered == FALSE) { DexScreen_AddTextPrinterParameterized(1, FONT_SMALL, gText_Cry, 8, 2, 4); DexScreen_PrintControlInfo(gText_NextDataCancel); } else // Just registered DexScreen_PrintControlInfo(gText_Next); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_GFX); return 1; } u8 RemoveDexPageWindows(void) { DexScreen_RemoveWindow(&sPokedexScreenData->windowIds[0]); DexScreen_RemoveWindow(&sPokedexScreenData->windowIds[1]); DexScreen_RemoveWindow(&sPokedexScreenData->windowIds[2]); return 0; } u8 DexScreen_DrawMonAreaPage(void) { int i; u8 width, height; bool8 monIsCaught; s16 left, top; u16 speciesId, species; u16 kantoMapVoff; species = sPokedexScreenData->dexSpecies; speciesId = SpeciesToNationalPokedexNum(species); monIsCaught = DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, TRUE); width = 28; height = 14; left = 0; top = 2; FillBgTilemapBufferRect_Palette0(3, 4, left, top, 1, 1); FillBgTilemapBufferRect_Palette0(3, BG_TILE_H_FLIP(4), left + 1 + width, top, 1, 1); FillBgTilemapBufferRect_Palette0(3, BG_TILE_V_FLIP(4), left, top + 1 + height, 1, 1); FillBgTilemapBufferRect_Palette0(3, BG_TILE_H_V_FLIP(4), left + 1 + width, top + 1 + height, 1, 1); FillBgTilemapBufferRect_Palette0(3, 5, left + 1, top, width, 1); FillBgTilemapBufferRect_Palette0(3, BG_TILE_V_FLIP(5), left + 1, top + 1 + height, width, 1); FillBgTilemapBufferRect_Palette0(3, 6, left, top + 1, 1, height); FillBgTilemapBufferRect_Palette0(3, BG_TILE_H_FLIP(6), left + 1 + width, top + 1, 1, height); FillBgTilemapBufferRect_Palette0(3, 1, left + 1, top + 1, width, height); FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 30, 16); width = 10; height = 6; left = 1; top = 9; FillBgTilemapBufferRect_Palette0(0, 29, left, top, 1, 1); FillBgTilemapBufferRect_Palette0(0, BG_TILE_H_FLIP(29), left + 1 + width, top, 1, 1); FillBgTilemapBufferRect_Palette0(0, BG_TILE_V_FLIP(29), left, top + 1 + height, 1, 1); FillBgTilemapBufferRect_Palette0(0, BG_TILE_H_V_FLIP(29), left + 1 + width, top + 1 + height, 1, 1); FillBgTilemapBufferRect_Palette0(0, 30, left + 1, top, width, 1); FillBgTilemapBufferRect_Palette0(0, BG_TILE_V_FLIP(30), left + 1, top + 1 + height, width, 1); FillBgTilemapBufferRect_Palette0(0, 31, left, top + 1, 1, height); FillBgTilemapBufferRect_Palette0(0, BG_TILE_H_FLIP(31), left + 1 + width, top + 1, 1, height); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); sPokedexScreenData->unlockedSeviiAreas = GetUnlockedSeviiAreas(); kantoMapVoff = 4; // If any of the postgame islands are unlocked, Kanto map needs to be flush with the // top of the screen. for (i = 3; i < 7; i++) if ((sPokedexScreenData->unlockedSeviiAreas >> i) & 1) kantoMapVoff = 0; sPokedexScreenData->windowIds[0] = AddWindow(&sWindowTemplate_AreaMap_Kanto); CopyToWindowPixelBuffer(sPokedexScreenData->windowIds[0], (void *)sTilemap_AreaMap_Kanto, 0, 0); SetWindowAttribute(sPokedexScreenData->windowIds[0], WINDOW_TILEMAP_TOP, GetWindowAttribute(sPokedexScreenData->windowIds[0], WINDOW_TILEMAP_TOP) + kantoMapVoff); PutWindowTilemap(sPokedexScreenData->windowIds[0]); for (i = 0; i < 7; i++) if ((sPokedexScreenData->unlockedSeviiAreas >> i) & 1) { sPokedexScreenData->windowIds[i + 1] = AddWindow(sAreaMapStructs_SeviiIslands[i].window); CopyToWindowPixelBuffer(sPokedexScreenData->windowIds[i + 1], sAreaMapStructs_SeviiIslands[i].tiles, 0, 0); SetWindowAttribute(sPokedexScreenData->windowIds[i + 1], WINDOW_TILEMAP_TOP, GetWindowAttribute(sPokedexScreenData->windowIds[i + 1], WINDOW_TILEMAP_TOP) + kantoMapVoff); PutWindowTilemap(sPokedexScreenData->windowIds[i + 1]); CopyWindowToVram(sPokedexScreenData->windowIds[i + 1], COPYWIN_GFX); } sPokedexScreenData->windowIds[8] = AddWindow(&sWindowTemplate_AreaMap_SpeciesName); sPokedexScreenData->windowIds[9] = AddWindow(&sWindowTemplate_AreaMap_Size); sPokedexScreenData->windowIds[10] = AddWindow(&sWindowTemplate_AreaMap_Area); sPokedexScreenData->windowIds[11] = AddWindow(&sWindowTemplate_AreaMap_MonIcon); sPokedexScreenData->windowIds[12] = AddWindow(&sWindowTemplate_AreaMap_MonTypes); // Draw the mon icon FillWindowPixelBuffer(sPokedexScreenData->windowIds[11], PIXEL_FILL(0)); ListMenu_LoadMonIconPalette(BG_PLTT_ID(10), species); ListMenu_DrawMonIconGraphics(sPokedexScreenData->windowIds[11], species, DexScreen_GetDefaultPersonality(species), 0, 0); PutWindowTilemap(sPokedexScreenData->windowIds[11]); CopyWindowToVram(sPokedexScreenData->windowIds[11], COPYWIN_GFX); // Print "Size" FillWindowPixelBuffer(sPokedexScreenData->windowIds[9], PIXEL_FILL(0)); { s32 strWidth = GetStringWidth(FONT_SMALL, gText_Size, 0); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[9], FONT_SMALL, gText_Size, (sWindowTemplate_AreaMap_Size.width * 8 - strWidth) / 2, 4, 0); } PutWindowTilemap(sPokedexScreenData->windowIds[9]); CopyWindowToVram(sPokedexScreenData->windowIds[9], COPYWIN_GFX); // Print "Area" FillWindowPixelBuffer(sPokedexScreenData->windowIds[10], PIXEL_FILL(0)); { s32 strWidth = GetStringWidth(FONT_SMALL, gText_Area, 0); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[10], FONT_SMALL, gText_Area, (sWindowTemplate_AreaMap_Area.width * 8 - strWidth) / 2, 4, 0); } SetWindowAttribute(sPokedexScreenData->windowIds[10], WINDOW_TILEMAP_TOP, GetWindowAttribute(sPokedexScreenData->windowIds[10], WINDOW_TILEMAP_TOP) + kantoMapVoff); PutWindowTilemap(sPokedexScreenData->windowIds[10]); CopyWindowToVram(sPokedexScreenData->windowIds[10], COPYWIN_GFX); // Print species name FillWindowPixelBuffer(sPokedexScreenData->windowIds[8], PIXEL_FILL(0)); DexScreen_PrintMonDexNo(sPokedexScreenData->windowIds[8], FONT_SMALL, species, 0, 0); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[8], FONT_NORMAL, gSpeciesNames[species], 3, 12, 0); PutWindowTilemap(sPokedexScreenData->windowIds[8]); CopyWindowToVram(sPokedexScreenData->windowIds[8], COPYWIN_GFX); // Type icons FillWindowPixelBuffer(sPokedexScreenData->windowIds[12], PIXEL_FILL(0)); ListMenuLoadStdPalAt(BG_PLTT_ID(11), 1); if (monIsCaught) { BlitMenuInfoIcon(sPokedexScreenData->windowIds[12], 1 + gSpeciesInfo[species].types[0], 0, 1); if (gSpeciesInfo[species].types[0] != gSpeciesInfo[species].types[1]) BlitMenuInfoIcon(sPokedexScreenData->windowIds[12], 1 + gSpeciesInfo[species].types[1], 32, 1); } PutWindowTilemap(sPokedexScreenData->windowIds[12]); CopyWindowToVram(sPokedexScreenData->windowIds[12], COPYWIN_GFX); // Show size comparison ResetAllPicSprites(); LoadPalette(sPalette_Silhouette, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP); if (monIsCaught) { sPokedexScreenData->windowIds[14] = CreateMonPicSprite_HandleDeoxys(species, SHINY_ODDS, DexScreen_GetDefaultPersonality(species), TRUE, 40, 104, 0, 0xFFFF); gSprites[sPokedexScreenData->windowIds[14]].oam.paletteNum = 2; gSprites[sPokedexScreenData->windowIds[14]].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[sPokedexScreenData->windowIds[14]].oam.matrixNum = 2; gSprites[sPokedexScreenData->windowIds[14]].oam.priority = 1; gSprites[sPokedexScreenData->windowIds[14]].y2 = gPokedexEntries[speciesId].pokemonOffset; SetOamMatrix(2, gPokedexEntries[speciesId].pokemonScale, 0, 0, gPokedexEntries[speciesId].pokemonScale); sPokedexScreenData->windowIds[15] = CreateTrainerPicSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender, TRUE), 1, 80, 104, 0, 0xFFFF); gSprites[sPokedexScreenData->windowIds[15]].oam.paletteNum = 2; gSprites[sPokedexScreenData->windowIds[15]].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[sPokedexScreenData->windowIds[15]].oam.matrixNum = 1; gSprites[sPokedexScreenData->windowIds[15]].oam.priority = 1; gSprites[sPokedexScreenData->windowIds[15]].y2 = gPokedexEntries[speciesId].trainerOffset; SetOamMatrix(1, gPokedexEntries[speciesId].trainerScale, 0, 0, gPokedexEntries[speciesId].trainerScale); } else { sPokedexScreenData->windowIds[14] = 0xff; sPokedexScreenData->windowIds[15] = 0xff; } // Create the area markers sPokedexScreenData->areaMarkersTaskId = CreatePokedexAreaMarkers(species, TAG_AREA_MARKERS, 3, kantoMapVoff * 8); if (GetNumPokedexAreaMarkers(sPokedexScreenData->areaMarkersTaskId) == 0) { // No markers, display "Area Unknown" BlitBitmapRectToWindow(sPokedexScreenData->windowIds[0], (void *)sBlitTiles_WideEllipse, 0, 0, 88, 16, 4, 28, 88, 16); { s32 strWidth = GetStringWidth(FONT_SMALL, gText_AreaUnknown, 0); DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[0], FONT_SMALL, gText_AreaUnknown, (96 - strWidth) / 2, 29, 0); } } CopyWindowToVram(sPokedexScreenData->windowIds[0], COPYWIN_GFX); // Draw the control info FillWindowPixelBuffer(1, PIXEL_FILL(15)); DexScreen_AddTextPrinterParameterized(1, FONT_SMALL, gText_Cry, 8, 2, 4); DexScreen_PrintControlInfo(gText_CancelPreviousData); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_GFX); return 1; } u8 DexScreen_DestroyAreaScreenResources(void) { int i; DestroyPokedexAreaMarkers(sPokedexScreenData->areaMarkersTaskId); for (i = 0; i < 13; i++) DexScreen_RemoveWindow(&sPokedexScreenData->windowIds[i]); if (sPokedexScreenData->windowIds[15] != 0xff) FreeAndDestroyTrainerPicSprite(sPokedexScreenData->windowIds[15]); if (sPokedexScreenData->windowIds[14] != 0xff) FreeAndDestroyMonPicSprite(sPokedexScreenData->windowIds[14]); return 0; } static u8 DexScreen_IsPageUnlocked(u8 categoryNum, u8 pageNum) { int i, count; u16 species; count = gDexCategories[categoryNum].page[pageNum].count; for (i = 0; i < 4; i++) { if (i < count) { species = gDexCategories[categoryNum].page[pageNum].species[i]; if (DexScreen_CanShowMonInDex(species) == TRUE && DexScreen_GetSetPokedexFlag(species, FLAG_GET_SEEN, TRUE)) return TRUE; } } return FALSE; } static bool8 DexScreen_IsCategoryUnlocked(u8 categoryNum) { int i; u8 count; count = gDexCategories[categoryNum].count; for (i = 0; i < count; i++) if (DexScreen_IsPageUnlocked(categoryNum, i)) return 1; return 0; } void DexScreen_CreateCategoryPageSpeciesList(u8 categoryNum, u8 pageNum) { int i, count; u16 species; count = gDexCategories[categoryNum].page[pageNum].count; sPokedexScreenData->numMonsOnPage = 0; for (i = 0; i < 4; i++) sPokedexScreenData->pageSpecies[i] = 0xffff; for (i = 0; i < count; i++) { species = gDexCategories[categoryNum].page[pageNum].species[i]; if (DexScreen_CanShowMonInDex(species) == TRUE && DexScreen_GetSetPokedexFlag(species, FLAG_GET_SEEN, TRUE)) { sPokedexScreenData->pageSpecies[sPokedexScreenData->numMonsOnPage] = gDexCategories[categoryNum].page[pageNum].species[i]; sPokedexScreenData->numMonsOnPage++; } } } static u8 DexScreen_GetPageLimitsForCategory(u8 category) { int i; u8 count, firstPage, lastPage; count = gDexCategories[category].count; firstPage = 0xff; lastPage = 0xff; for (i = 0; i < count; i++) if (DexScreen_IsPageUnlocked(category, i)) { if (firstPage == 0xff) firstPage = i; lastPage = i; } if (lastPage != 0xff) { sPokedexScreenData->firstPageInCategory = firstPage; sPokedexScreenData->lastPageInCategory = lastPage + 1; return FALSE; } else { sPokedexScreenData->firstPageInCategory = 0; sPokedexScreenData->lastPageInCategory = 0; return TRUE; } } static u8 DexScreen_LookUpCategoryBySpecies(u16 species) { int i, j, k, categoryCount, categoryPageCount, posInPage; u16 dexSpecies; for (i = 0; i < NELEMS(gDexCategories); i++) { categoryCount = gDexCategories[i].count; for (j = 0; j < categoryCount; j++) { categoryPageCount = gDexCategories[i].page[j].count; for (k = 0, posInPage = 0; k < categoryPageCount; k++) { dexSpecies = gDexCategories[i].page[j].species[k]; if (species == dexSpecies) { sPokedexScreenData->category = i; sPokedexScreenData->pageNum = j; sPokedexScreenData->categoryCursorPosInPage = posInPage; return FALSE; } if (DexScreen_CanShowMonInDex(dexSpecies) == TRUE && DexScreen_GetSetPokedexFlag(dexSpecies, FLAG_GET_SEEN, TRUE)) posInPage++; } } } return TRUE; } static u8 DexScreen_PageNumberToRenderablePages(u16 page) { int i, count; for (i = 0, count = 0; i < page; i++) if (DexScreen_IsPageUnlocked(sPokedexScreenData->category, i)) count++; return count + 1; } void DexScreen_InputHandler_StartToCry(void) { if (JOY_NEW(START_BUTTON)) PlayCry_NormalNoDucking(sPokedexScreenData->dexSpecies, 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL); } u8 DexScreen_RegisterMonToPokedex(u16 species) { DexScreen_GetSetPokedexFlag(species, FLAG_SET_SEEN, TRUE); DexScreen_GetSetPokedexFlag(species, FLAG_SET_CAUGHT, TRUE); if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) if(SpeciesToExtendedPokedexNum(species) > EXTENDED_DEX_COUNT) return CreateTask(Task_DexScreen_RegisterNonKantoMonBeforeNationalDex, 0); if (!FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled() && SpeciesToNationalPokedexNum(species) > KANTO_DEX_COUNT) return CreateTask(Task_DexScreen_RegisterNonKantoMonBeforeNationalDex, 0); DexScreen_LoadResources(); gTasks[sPokedexScreenData->taskId].func = Task_DexScreen_RegisterMonToPokedex; DexScreen_LookUpCategoryBySpecies(species); return sPokedexScreenData->taskId; } static void Task_DexScreen_RegisterNonKantoMonBeforeNationalDex(u8 taskId) { DestroyTask(taskId); } static void Task_DexScreen_RegisterMonToPokedex(u8 taskId) { switch (sPokedexScreenData->state) { case 0: DexScreen_GetPageLimitsForCategory(sPokedexScreenData->category); if (sPokedexScreenData->pageNum < sPokedexScreenData->firstPageInCategory) sPokedexScreenData->pageNum = sPokedexScreenData->firstPageInCategory; sPokedexScreenData->state = 3; break; case 1: RemoveDexPageWindows(); DexScreen_DestroyCategoryPageMonIconAndInfoWindows(); gMain.state = 0; sPokedexScreenData->state = 2; break; case 2: if (DoClosePokedex()) DestroyTask(taskId); break; case 3: DexScreen_CreateCategoryListGfx(TRUE); PutWindowTilemap(0); PutWindowTilemap(1); CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); DexScreen_CreateCategoryPageSelectionCursor(0xff); sPokedexScreenData->state = 4; break; case 4: gPaletteFade.bufferTransferDisabled = 0; BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0xffff); ShowBg(3); ShowBg(2); ShowBg(1); ShowBg(0); sPokedexScreenData->state = 5; break; case 5: gTasks[taskId].data[0] = 30; sPokedexScreenData->categoryPageCursorTaskId = ListMenuAddCursorObjectInternal(&sCursorStruct_CategoryPage, 0); sPokedexScreenData->state = 6; break; case 6: DexScreen_CreateCategoryPageSelectionCursor(sPokedexScreenData->categoryCursorPosInPage); DexScreen_UpdateCategoryPageCursorObject(sPokedexScreenData->categoryPageCursorTaskId, sPokedexScreenData->categoryCursorPosInPage, sPokedexScreenData->numMonsOnPage); if (gTasks[taskId].data[0]) gTasks[taskId].data[0]--; else { ListMenuRemoveCursorObject(sPokedexScreenData->categoryPageCursorTaskId, 0); sPokedexScreenData->state = 7; } break; case 7: sPokedexScreenData->dexSpecies = sPokedexScreenData->pageSpecies[sPokedexScreenData->categoryCursorPosInPage]; sPokedexScreenData->state = 8; break; case 8: if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) sPokedexScreenData->dexOrderId = DEX_ORDER_NUMERICAL_NATIONAL; DexScreen_DrawMonDexPage(TRUE); //goes to first data page from freshly caught sPokedexScreenData->state = 9; break; case 9: sPokedexScreenData->data[0] = 0; sPokedexScreenData->data[1] = 0; sPokedexScreenData->state++; case 10: if (sPokedexScreenData->data[1] < 6) { if (sPokedexScreenData->data[0]) { DexScreen_DexPageZoomEffectFrame(0, sPokedexScreenData->data[1]); CopyBgTilemapBufferToVram(0); sPokedexScreenData->data[0] = 4; sPokedexScreenData->data[1]++; } else sPokedexScreenData->data[0]--; } else { FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 30, 16); CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); PlayCry_NormalNoDucking(sPokedexScreenData->dexSpecies, 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL); sPokedexScreenData->data[0] = 0; sPokedexScreenData->state = 11; } break; case 11: if (JOY_NEW(A_BUTTON | B_BUTTON)) sPokedexScreenData->state = 2; break; } } void DexScreen_PrintStringWithAlignment(const u8 * str, s32 mode) { u32 x; switch (mode) { case TEXT_LEFT: x = 8; break; case TEXT_CENTER: x = (u32)(240 - GetStringWidth(FONT_NORMAL, str, 0)) / 2; break; case TEXT_RIGHT: default: x = 232 - GetStringWidth(FONT_NORMAL, str, 0); break; } DexScreen_AddTextPrinterParameterized(0, FONT_NORMAL, str, x, 2, 4); } ================================================ FILE: src/pokemon.c ================================================ #define IS_POKEMON_C #include "global.h" #include "gflib.h" #include "random.h" #include "text.h" #include "data.h" #include "battle.h" #include "battle_anim.h" #include "item.h" #include "event_data.h" #include "util.h" #include "pokemon_storage_system.h" #include "battle_gfx_sfx_util.h" #include "battle_controllers.h" #include "evolution_scene.h" #include "battle_message.h" #include "battle_util.h" #include "link.h" #include "m4a.h" #include "pokedex.h" #include "strings.h" #include "overworld.h" #include "party_menu.h" #include "field_specials.h" #include "berry.h" #include "constants/items.h" #include "constants/item_effects.h" #include "constants/hoenn_cries.h" #include "constants/pokemon.h" #include "constants/abilities.h" #include "constants/flags.h" #include "constants/map_types.h" #include "constants/moves.h" #include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/item_effects.h" #include "constants/trainers.h" #include "constants/hold_effects.h" #include "constants/battle_move_effects.h" #include "constants/union_room.h" //#include "printf.h" //#include "mgba.h" //#include "string_util.h" // Extracts the upper 16 bits of a 32-bit number #define HIHALF(n) (((n) & 0xFFFF0000) >> 16) // Extracts the lower 16 bits of a 32-bit number #define LOHALF(n) ((n) & 0xFFFF) #define SPECIES_TO_HOENN(name) [SPECIES_##name - 1] = HOENN_DEX_##name #define SPECIES_TO_NATIONAL(name) [SPECIES_##name - 1] = NATIONAL_DEX_##name #define HOENN_TO_NATIONAL(name) [HOENN_DEX_##name - 1] = NATIONAL_DEX_##name #define SPECIES_TO_EXTENDED(name) [SPECIES_##name - 1] = EXTENDED_DEX_##name #define EXTENDED_TO_NATIONAL(name) [EXTENDED_DEX_##name - 1] = NATIONAL_DEX_##name struct MonSpritesGfxManager { u8 numSprites:4; u8 battlePosition:4; u8 numFrames; u8 active; u8 mode; u32 dataSize; u8 *spriteBuffer; u8 **spritePointers; struct SpriteTemplate *templates; struct SpriteFrameImage *frameImages; }; static EWRAM_DATA u8 sLearningMoveTableID = 0; EWRAM_DATA u8 gPlayerPartyCount = 0; EWRAM_DATA u8 gEnemyPartyCount = 0; EWRAM_DATA struct Pokemon gEnemyParty[PARTY_SIZE] = {}; EWRAM_DATA struct Pokemon gPlayerParty[PARTY_SIZE] = {}; EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0}; static EWRAM_DATA struct MonSpritesGfxManager *sMonSpritesGfxManager = NULL; static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType); static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId); static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality); static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex); u8 GetNatureFromPersonality(u32 personality); static bool8 PartyMonHasStatus(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId); static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId); static bool8 IsPokemonStorageFull(void); static void EncryptBoxMon(struct BoxPokemon *boxMon); static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon); static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); static u8 GetLevelFromMonExp(struct Pokemon *mon); static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); static u8 PopulateSpeciesEvoLineForRelearner(u16 species, bool8 isHatched, u16 evoLine[]); static bool32 ShouldSkipFriendshipChange(void); #include "data/battle_moves.h" // Used in an unreferenced function in RS. // Unreferenced here and in Emerald. struct CombinedMove { u16 move1; u16 move2; u16 newMove; }; static const struct CombinedMove sCombinedMoves[2] = { {MOVE_EMBER, MOVE_GUST, MOVE_HEAT_WAVE}, {0xFFFF, 0xFFFF, 0xFFFF} }; // NOTE: The order of the elements in the 3 arrays below is irrelevant. // To reorder the pokedex, see the values in include/constants/pokedex.h. // Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex) static const u16 sSpeciesToHoennPokedexNum[NUM_SPECIES - 1] = { SPECIES_TO_HOENN(BULBASAUR), SPECIES_TO_HOENN(IVYSAUR), SPECIES_TO_HOENN(VENUSAUR), SPECIES_TO_HOENN(CHARMANDER), SPECIES_TO_HOENN(CHARMELEON), SPECIES_TO_HOENN(CHARIZARD), SPECIES_TO_HOENN(SQUIRTLE), SPECIES_TO_HOENN(WARTORTLE), SPECIES_TO_HOENN(BLASTOISE), SPECIES_TO_HOENN(CATERPIE), SPECIES_TO_HOENN(METAPOD), SPECIES_TO_HOENN(BUTTERFREE), SPECIES_TO_HOENN(WEEDLE), SPECIES_TO_HOENN(KAKUNA), SPECIES_TO_HOENN(BEEDRILL), SPECIES_TO_HOENN(PIDGEY), SPECIES_TO_HOENN(PIDGEOTTO), SPECIES_TO_HOENN(PIDGEOT), SPECIES_TO_HOENN(RATTATA), SPECIES_TO_HOENN(RATICATE), SPECIES_TO_HOENN(SPEAROW), SPECIES_TO_HOENN(FEAROW), SPECIES_TO_HOENN(EKANS), SPECIES_TO_HOENN(ARBOK), SPECIES_TO_HOENN(PIKACHU), SPECIES_TO_HOENN(RAICHU), SPECIES_TO_HOENN(SANDSHREW), SPECIES_TO_HOENN(SANDSLASH), SPECIES_TO_HOENN(NIDORAN_F), SPECIES_TO_HOENN(NIDORINA), SPECIES_TO_HOENN(NIDOQUEEN), SPECIES_TO_HOENN(NIDORAN_M), SPECIES_TO_HOENN(NIDORINO), SPECIES_TO_HOENN(NIDOKING), SPECIES_TO_HOENN(CLEFAIRY), SPECIES_TO_HOENN(CLEFABLE), SPECIES_TO_HOENN(VULPIX), SPECIES_TO_HOENN(NINETALES), SPECIES_TO_HOENN(JIGGLYPUFF), SPECIES_TO_HOENN(WIGGLYTUFF), SPECIES_TO_HOENN(ZUBAT), SPECIES_TO_HOENN(GOLBAT), SPECIES_TO_HOENN(ODDISH), SPECIES_TO_HOENN(GLOOM), SPECIES_TO_HOENN(VILEPLUME), SPECIES_TO_HOENN(PARAS), SPECIES_TO_HOENN(PARASECT), SPECIES_TO_HOENN(VENONAT), SPECIES_TO_HOENN(VENOMOTH), SPECIES_TO_HOENN(DIGLETT), SPECIES_TO_HOENN(DUGTRIO), SPECIES_TO_HOENN(MEOWTH), SPECIES_TO_HOENN(PERSIAN), SPECIES_TO_HOENN(PSYDUCK), SPECIES_TO_HOENN(GOLDUCK), SPECIES_TO_HOENN(MANKEY), SPECIES_TO_HOENN(PRIMEAPE), SPECIES_TO_HOENN(GROWLITHE), SPECIES_TO_HOENN(ARCANINE), SPECIES_TO_HOENN(POLIWAG), SPECIES_TO_HOENN(POLIWHIRL), SPECIES_TO_HOENN(POLIWRATH), SPECIES_TO_HOENN(ABRA), SPECIES_TO_HOENN(KADABRA), SPECIES_TO_HOENN(ALAKAZAM), SPECIES_TO_HOENN(MACHOP), SPECIES_TO_HOENN(MACHOKE), SPECIES_TO_HOENN(MACHAMP), SPECIES_TO_HOENN(BELLSPROUT), SPECIES_TO_HOENN(WEEPINBELL), SPECIES_TO_HOENN(VICTREEBEL), SPECIES_TO_HOENN(TENTACOOL), SPECIES_TO_HOENN(TENTACRUEL), SPECIES_TO_HOENN(GEODUDE), SPECIES_TO_HOENN(GRAVELER), SPECIES_TO_HOENN(GOLEM), SPECIES_TO_HOENN(PONYTA), SPECIES_TO_HOENN(RAPIDASH), SPECIES_TO_HOENN(SLOWPOKE), SPECIES_TO_HOENN(SLOWBRO), SPECIES_TO_HOENN(MAGNEMITE), SPECIES_TO_HOENN(MAGNETON), SPECIES_TO_HOENN(FARFETCHD), SPECIES_TO_HOENN(DODUO), SPECIES_TO_HOENN(DODRIO), SPECIES_TO_HOENN(SEEL), SPECIES_TO_HOENN(DEWGONG), SPECIES_TO_HOENN(GRIMER), SPECIES_TO_HOENN(MUK), SPECIES_TO_HOENN(SHELLDER), SPECIES_TO_HOENN(CLOYSTER), SPECIES_TO_HOENN(GASTLY), SPECIES_TO_HOENN(HAUNTER), SPECIES_TO_HOENN(GENGAR), SPECIES_TO_HOENN(ONIX), SPECIES_TO_HOENN(DROWZEE), SPECIES_TO_HOENN(HYPNO), SPECIES_TO_HOENN(KRABBY), SPECIES_TO_HOENN(KINGLER), SPECIES_TO_HOENN(VOLTORB), SPECIES_TO_HOENN(ELECTRODE), SPECIES_TO_HOENN(EXEGGCUTE), SPECIES_TO_HOENN(EXEGGUTOR), SPECIES_TO_HOENN(CUBONE), SPECIES_TO_HOENN(MAROWAK), SPECIES_TO_HOENN(HITMONLEE), SPECIES_TO_HOENN(HITMONCHAN), SPECIES_TO_HOENN(LICKITUNG), SPECIES_TO_HOENN(KOFFING), SPECIES_TO_HOENN(WEEZING), SPECIES_TO_HOENN(RHYHORN), SPECIES_TO_HOENN(RHYDON), SPECIES_TO_HOENN(CHANSEY), SPECIES_TO_HOENN(TANGELA), SPECIES_TO_HOENN(KANGASKHAN), SPECIES_TO_HOENN(HORSEA), SPECIES_TO_HOENN(SEADRA), SPECIES_TO_HOENN(GOLDEEN), SPECIES_TO_HOENN(SEAKING), SPECIES_TO_HOENN(STARYU), SPECIES_TO_HOENN(STARMIE), SPECIES_TO_HOENN(MR_MIME), SPECIES_TO_HOENN(SCYTHER), SPECIES_TO_HOENN(JYNX), SPECIES_TO_HOENN(ELECTABUZZ), SPECIES_TO_HOENN(MAGMAR), SPECIES_TO_HOENN(PINSIR), SPECIES_TO_HOENN(TAUROS), SPECIES_TO_HOENN(MAGIKARP), SPECIES_TO_HOENN(GYARADOS), SPECIES_TO_HOENN(LAPRAS), SPECIES_TO_HOENN(DITTO), SPECIES_TO_HOENN(EEVEE), SPECIES_TO_HOENN(VAPOREON), SPECIES_TO_HOENN(JOLTEON), SPECIES_TO_HOENN(FLAREON), SPECIES_TO_HOENN(PORYGON), SPECIES_TO_HOENN(OMANYTE), SPECIES_TO_HOENN(OMASTAR), SPECIES_TO_HOENN(KABUTO), SPECIES_TO_HOENN(KABUTOPS), SPECIES_TO_HOENN(AERODACTYL), SPECIES_TO_HOENN(SNORLAX), SPECIES_TO_HOENN(ARTICUNO), SPECIES_TO_HOENN(ZAPDOS), SPECIES_TO_HOENN(MOLTRES), SPECIES_TO_HOENN(DRATINI), SPECIES_TO_HOENN(DRAGONAIR), SPECIES_TO_HOENN(DRAGONITE), SPECIES_TO_HOENN(MEWTWO), SPECIES_TO_HOENN(MEW), SPECIES_TO_HOENN(CHIKORITA), SPECIES_TO_HOENN(BAYLEEF), SPECIES_TO_HOENN(MEGANIUM), SPECIES_TO_HOENN(CYNDAQUIL), SPECIES_TO_HOENN(QUILAVA), SPECIES_TO_HOENN(TYPHLOSION), SPECIES_TO_HOENN(TOTODILE), SPECIES_TO_HOENN(CROCONAW), SPECIES_TO_HOENN(FERALIGATR), SPECIES_TO_HOENN(SENTRET), SPECIES_TO_HOENN(FURRET), SPECIES_TO_HOENN(HOOTHOOT), SPECIES_TO_HOENN(NOCTOWL), SPECIES_TO_HOENN(LEDYBA), SPECIES_TO_HOENN(LEDIAN), SPECIES_TO_HOENN(SPINARAK), SPECIES_TO_HOENN(ARIADOS), SPECIES_TO_HOENN(CROBAT), SPECIES_TO_HOENN(CHINCHOU), SPECIES_TO_HOENN(LANTURN), SPECIES_TO_HOENN(PICHU), SPECIES_TO_HOENN(CLEFFA), SPECIES_TO_HOENN(IGGLYBUFF), SPECIES_TO_HOENN(TOGEPI), SPECIES_TO_HOENN(TOGETIC), SPECIES_TO_HOENN(NATU), SPECIES_TO_HOENN(XATU), SPECIES_TO_HOENN(MAREEP), SPECIES_TO_HOENN(FLAAFFY), SPECIES_TO_HOENN(AMPHAROS), SPECIES_TO_HOENN(BELLOSSOM), SPECIES_TO_HOENN(MARILL), SPECIES_TO_HOENN(AZUMARILL), SPECIES_TO_HOENN(SUDOWOODO), SPECIES_TO_HOENN(POLITOED), SPECIES_TO_HOENN(HOPPIP), SPECIES_TO_HOENN(SKIPLOOM), SPECIES_TO_HOENN(JUMPLUFF), SPECIES_TO_HOENN(AIPOM), SPECIES_TO_HOENN(SUNKERN), SPECIES_TO_HOENN(SUNFLORA), SPECIES_TO_HOENN(YANMA), SPECIES_TO_HOENN(WOOPER), SPECIES_TO_HOENN(QUAGSIRE), SPECIES_TO_HOENN(ESPEON), SPECIES_TO_HOENN(UMBREON), SPECIES_TO_HOENN(MURKROW), SPECIES_TO_HOENN(SLOWKING), SPECIES_TO_HOENN(MISDREAVUS), SPECIES_TO_HOENN(UNOWN), SPECIES_TO_HOENN(WOBBUFFET), SPECIES_TO_HOENN(GIRAFARIG), SPECIES_TO_HOENN(PINECO), SPECIES_TO_HOENN(FORRETRESS), SPECIES_TO_HOENN(DUNSPARCE), SPECIES_TO_HOENN(GLIGAR), SPECIES_TO_HOENN(STEELIX), SPECIES_TO_HOENN(SNUBBULL), SPECIES_TO_HOENN(GRANBULL), SPECIES_TO_HOENN(QWILFISH), SPECIES_TO_HOENN(SCIZOR), SPECIES_TO_HOENN(SHUCKLE), SPECIES_TO_HOENN(HERACROSS), SPECIES_TO_HOENN(SNEASEL), SPECIES_TO_HOENN(TEDDIURSA), SPECIES_TO_HOENN(URSARING), SPECIES_TO_HOENN(SLUGMA), SPECIES_TO_HOENN(MAGCARGO), SPECIES_TO_HOENN(SWINUB), SPECIES_TO_HOENN(PILOSWINE), SPECIES_TO_HOENN(CORSOLA), SPECIES_TO_HOENN(REMORAID), SPECIES_TO_HOENN(OCTILLERY), SPECIES_TO_HOENN(DELIBIRD), SPECIES_TO_HOENN(MANTINE), SPECIES_TO_HOENN(SKARMORY), SPECIES_TO_HOENN(HOUNDOUR), SPECIES_TO_HOENN(HOUNDOOM), SPECIES_TO_HOENN(KINGDRA), SPECIES_TO_HOENN(PHANPY), SPECIES_TO_HOENN(DONPHAN), SPECIES_TO_HOENN(PORYGON2), SPECIES_TO_HOENN(STANTLER), SPECIES_TO_HOENN(SMEARGLE), SPECIES_TO_HOENN(TYROGUE), SPECIES_TO_HOENN(HITMONTOP), SPECIES_TO_HOENN(SMOOCHUM), SPECIES_TO_HOENN(ELEKID), SPECIES_TO_HOENN(MAGBY), SPECIES_TO_HOENN(MILTANK), SPECIES_TO_HOENN(BLISSEY), SPECIES_TO_HOENN(RAIKOU), SPECIES_TO_HOENN(ENTEI), SPECIES_TO_HOENN(SUICUNE), SPECIES_TO_HOENN(LARVITAR), SPECIES_TO_HOENN(PUPITAR), SPECIES_TO_HOENN(TYRANITAR), SPECIES_TO_HOENN(LUGIA), SPECIES_TO_HOENN(HO_OH), SPECIES_TO_HOENN(CELEBI), SPECIES_TO_HOENN(OLD_UNOWN_B), SPECIES_TO_HOENN(OLD_UNOWN_C), SPECIES_TO_HOENN(OLD_UNOWN_D), SPECIES_TO_HOENN(OLD_UNOWN_E), SPECIES_TO_HOENN(OLD_UNOWN_F), SPECIES_TO_HOENN(OLD_UNOWN_G), SPECIES_TO_HOENN(OLD_UNOWN_H), SPECIES_TO_HOENN(OLD_UNOWN_I), SPECIES_TO_HOENN(OLD_UNOWN_J), SPECIES_TO_HOENN(OLD_UNOWN_K), SPECIES_TO_HOENN(OLD_UNOWN_L), SPECIES_TO_HOENN(OLD_UNOWN_M), SPECIES_TO_HOENN(OLD_UNOWN_N), SPECIES_TO_HOENN(OLD_UNOWN_O), SPECIES_TO_HOENN(OLD_UNOWN_P), SPECIES_TO_HOENN(OLD_UNOWN_Q), SPECIES_TO_HOENN(OLD_UNOWN_R), SPECIES_TO_HOENN(OLD_UNOWN_S), SPECIES_TO_HOENN(OLD_UNOWN_T), SPECIES_TO_HOENN(OLD_UNOWN_U), SPECIES_TO_HOENN(OLD_UNOWN_V), SPECIES_TO_HOENN(OLD_UNOWN_W), SPECIES_TO_HOENN(OLD_UNOWN_X), SPECIES_TO_HOENN(OLD_UNOWN_Y), SPECIES_TO_HOENN(OLD_UNOWN_Z), SPECIES_TO_HOENN(TREECKO), SPECIES_TO_HOENN(GROVYLE), SPECIES_TO_HOENN(SCEPTILE), SPECIES_TO_HOENN(TORCHIC), SPECIES_TO_HOENN(COMBUSKEN), SPECIES_TO_HOENN(BLAZIKEN), SPECIES_TO_HOENN(MUDKIP), SPECIES_TO_HOENN(MARSHTOMP), SPECIES_TO_HOENN(SWAMPERT), SPECIES_TO_HOENN(POOCHYENA), SPECIES_TO_HOENN(MIGHTYENA), SPECIES_TO_HOENN(ZIGZAGOON), SPECIES_TO_HOENN(LINOONE), SPECIES_TO_HOENN(WURMPLE), SPECIES_TO_HOENN(SILCOON), SPECIES_TO_HOENN(BEAUTIFLY), SPECIES_TO_HOENN(CASCOON), SPECIES_TO_HOENN(DUSTOX), SPECIES_TO_HOENN(LOTAD), SPECIES_TO_HOENN(LOMBRE), SPECIES_TO_HOENN(LUDICOLO), SPECIES_TO_HOENN(SEEDOT), SPECIES_TO_HOENN(NUZLEAF), SPECIES_TO_HOENN(SHIFTRY), SPECIES_TO_HOENN(NINCADA), SPECIES_TO_HOENN(NINJASK), SPECIES_TO_HOENN(SHEDINJA), SPECIES_TO_HOENN(TAILLOW), SPECIES_TO_HOENN(SWELLOW), SPECIES_TO_HOENN(SHROOMISH), SPECIES_TO_HOENN(BRELOOM), SPECIES_TO_HOENN(SPINDA), SPECIES_TO_HOENN(WINGULL), SPECIES_TO_HOENN(PELIPPER), SPECIES_TO_HOENN(SURSKIT), SPECIES_TO_HOENN(MASQUERAIN), SPECIES_TO_HOENN(WAILMER), SPECIES_TO_HOENN(WAILORD), SPECIES_TO_HOENN(SKITTY), SPECIES_TO_HOENN(DELCATTY), SPECIES_TO_HOENN(KECLEON), SPECIES_TO_HOENN(BALTOY), SPECIES_TO_HOENN(CLAYDOL), SPECIES_TO_HOENN(NOSEPASS), SPECIES_TO_HOENN(TORKOAL), SPECIES_TO_HOENN(SABLEYE), SPECIES_TO_HOENN(BARBOACH), SPECIES_TO_HOENN(WHISCASH), SPECIES_TO_HOENN(LUVDISC), SPECIES_TO_HOENN(CORPHISH), SPECIES_TO_HOENN(CRAWDAUNT), SPECIES_TO_HOENN(FEEBAS), SPECIES_TO_HOENN(MILOTIC), SPECIES_TO_HOENN(CARVANHA), SPECIES_TO_HOENN(SHARPEDO), SPECIES_TO_HOENN(TRAPINCH), SPECIES_TO_HOENN(VIBRAVA), SPECIES_TO_HOENN(FLYGON), SPECIES_TO_HOENN(MAKUHITA), SPECIES_TO_HOENN(HARIYAMA), SPECIES_TO_HOENN(ELECTRIKE), SPECIES_TO_HOENN(MANECTRIC), SPECIES_TO_HOENN(NUMEL), SPECIES_TO_HOENN(CAMERUPT), SPECIES_TO_HOENN(SPHEAL), SPECIES_TO_HOENN(SEALEO), SPECIES_TO_HOENN(WALREIN), SPECIES_TO_HOENN(CACNEA), SPECIES_TO_HOENN(CACTURNE), SPECIES_TO_HOENN(SNORUNT), SPECIES_TO_HOENN(GLALIE), SPECIES_TO_HOENN(LUNATONE), SPECIES_TO_HOENN(SOLROCK), SPECIES_TO_HOENN(AZURILL), SPECIES_TO_HOENN(SPOINK), SPECIES_TO_HOENN(GRUMPIG), SPECIES_TO_HOENN(PLUSLE), SPECIES_TO_HOENN(MINUN), SPECIES_TO_HOENN(MAWILE), SPECIES_TO_HOENN(MEDITITE), SPECIES_TO_HOENN(MEDICHAM), SPECIES_TO_HOENN(SWABLU), SPECIES_TO_HOENN(ALTARIA), SPECIES_TO_HOENN(WYNAUT), SPECIES_TO_HOENN(DUSKULL), SPECIES_TO_HOENN(DUSCLOPS), SPECIES_TO_HOENN(ROSELIA), SPECIES_TO_HOENN(SLAKOTH), SPECIES_TO_HOENN(VIGOROTH), SPECIES_TO_HOENN(SLAKING), SPECIES_TO_HOENN(GULPIN), SPECIES_TO_HOENN(SWALOT), SPECIES_TO_HOENN(TROPIUS), SPECIES_TO_HOENN(WHISMUR), SPECIES_TO_HOENN(LOUDRED), SPECIES_TO_HOENN(EXPLOUD), SPECIES_TO_HOENN(CLAMPERL), SPECIES_TO_HOENN(HUNTAIL), SPECIES_TO_HOENN(GOREBYSS), SPECIES_TO_HOENN(ABSOL), SPECIES_TO_HOENN(SHUPPET), SPECIES_TO_HOENN(BANETTE), SPECIES_TO_HOENN(SEVIPER), SPECIES_TO_HOENN(ZANGOOSE), SPECIES_TO_HOENN(RELICANTH), SPECIES_TO_HOENN(ARON), SPECIES_TO_HOENN(LAIRON), SPECIES_TO_HOENN(AGGRON), SPECIES_TO_HOENN(CASTFORM), SPECIES_TO_HOENN(VOLBEAT), SPECIES_TO_HOENN(ILLUMISE), SPECIES_TO_HOENN(LILEEP), SPECIES_TO_HOENN(CRADILY), SPECIES_TO_HOENN(ANORITH), SPECIES_TO_HOENN(ARMALDO), SPECIES_TO_HOENN(RALTS), SPECIES_TO_HOENN(KIRLIA), SPECIES_TO_HOENN(GARDEVOIR), SPECIES_TO_HOENN(BAGON), SPECIES_TO_HOENN(SHELGON), SPECIES_TO_HOENN(SALAMENCE), SPECIES_TO_HOENN(BELDUM), SPECIES_TO_HOENN(METANG), SPECIES_TO_HOENN(METAGROSS), SPECIES_TO_HOENN(REGIROCK), SPECIES_TO_HOENN(REGICE), SPECIES_TO_HOENN(REGISTEEL), SPECIES_TO_HOENN(KYOGRE), SPECIES_TO_HOENN(GROUDON), SPECIES_TO_HOENN(RAYQUAZA), SPECIES_TO_HOENN(LATIAS), SPECIES_TO_HOENN(LATIOS), SPECIES_TO_HOENN(JIRACHI), SPECIES_TO_HOENN(DEOXYS), SPECIES_TO_HOENN(CHIMECHO), }; // Assigns all species to the National Dex Index (Summary No. for National Dex) static const u16 sSpeciesToNationalPokedexNum[NUM_SPECIES - 1] = { SPECIES_TO_NATIONAL(BULBASAUR), SPECIES_TO_NATIONAL(IVYSAUR), SPECIES_TO_NATIONAL(VENUSAUR), SPECIES_TO_NATIONAL(CHARMANDER), SPECIES_TO_NATIONAL(CHARMELEON), SPECIES_TO_NATIONAL(CHARIZARD), SPECIES_TO_NATIONAL(SQUIRTLE), SPECIES_TO_NATIONAL(WARTORTLE), SPECIES_TO_NATIONAL(BLASTOISE), SPECIES_TO_NATIONAL(CATERPIE), SPECIES_TO_NATIONAL(METAPOD), SPECIES_TO_NATIONAL(BUTTERFREE), SPECIES_TO_NATIONAL(WEEDLE), SPECIES_TO_NATIONAL(KAKUNA), SPECIES_TO_NATIONAL(BEEDRILL), SPECIES_TO_NATIONAL(PIDGEY), SPECIES_TO_NATIONAL(PIDGEOTTO), SPECIES_TO_NATIONAL(PIDGEOT), SPECIES_TO_NATIONAL(RATTATA), SPECIES_TO_NATIONAL(RATICATE), SPECIES_TO_NATIONAL(SPEAROW), SPECIES_TO_NATIONAL(FEAROW), SPECIES_TO_NATIONAL(EKANS), SPECIES_TO_NATIONAL(ARBOK), SPECIES_TO_NATIONAL(PIKACHU), SPECIES_TO_NATIONAL(RAICHU), SPECIES_TO_NATIONAL(SANDSHREW), SPECIES_TO_NATIONAL(SANDSLASH), SPECIES_TO_NATIONAL(NIDORAN_F), SPECIES_TO_NATIONAL(NIDORINA), SPECIES_TO_NATIONAL(NIDOQUEEN), SPECIES_TO_NATIONAL(NIDORAN_M), SPECIES_TO_NATIONAL(NIDORINO), SPECIES_TO_NATIONAL(NIDOKING), SPECIES_TO_NATIONAL(CLEFAIRY), SPECIES_TO_NATIONAL(CLEFABLE), SPECIES_TO_NATIONAL(VULPIX), SPECIES_TO_NATIONAL(NINETALES), SPECIES_TO_NATIONAL(JIGGLYPUFF), SPECIES_TO_NATIONAL(WIGGLYTUFF), SPECIES_TO_NATIONAL(ZUBAT), SPECIES_TO_NATIONAL(GOLBAT), SPECIES_TO_NATIONAL(ODDISH), SPECIES_TO_NATIONAL(GLOOM), SPECIES_TO_NATIONAL(VILEPLUME), SPECIES_TO_NATIONAL(PARAS), SPECIES_TO_NATIONAL(PARASECT), SPECIES_TO_NATIONAL(VENONAT), SPECIES_TO_NATIONAL(VENOMOTH), SPECIES_TO_NATIONAL(DIGLETT), SPECIES_TO_NATIONAL(DUGTRIO), SPECIES_TO_NATIONAL(MEOWTH), SPECIES_TO_NATIONAL(PERSIAN), SPECIES_TO_NATIONAL(PSYDUCK), SPECIES_TO_NATIONAL(GOLDUCK), SPECIES_TO_NATIONAL(MANKEY), SPECIES_TO_NATIONAL(PRIMEAPE), SPECIES_TO_NATIONAL(GROWLITHE), SPECIES_TO_NATIONAL(ARCANINE), SPECIES_TO_NATIONAL(POLIWAG), SPECIES_TO_NATIONAL(POLIWHIRL), SPECIES_TO_NATIONAL(POLIWRATH), SPECIES_TO_NATIONAL(ABRA), SPECIES_TO_NATIONAL(KADABRA), SPECIES_TO_NATIONAL(ALAKAZAM), SPECIES_TO_NATIONAL(MACHOP), SPECIES_TO_NATIONAL(MACHOKE), SPECIES_TO_NATIONAL(MACHAMP), SPECIES_TO_NATIONAL(BELLSPROUT), SPECIES_TO_NATIONAL(WEEPINBELL), SPECIES_TO_NATIONAL(VICTREEBEL), SPECIES_TO_NATIONAL(TENTACOOL), SPECIES_TO_NATIONAL(TENTACRUEL), SPECIES_TO_NATIONAL(GEODUDE), SPECIES_TO_NATIONAL(GRAVELER), SPECIES_TO_NATIONAL(GOLEM), SPECIES_TO_NATIONAL(PONYTA), SPECIES_TO_NATIONAL(RAPIDASH), SPECIES_TO_NATIONAL(SLOWPOKE), SPECIES_TO_NATIONAL(SLOWBRO), SPECIES_TO_NATIONAL(MAGNEMITE), SPECIES_TO_NATIONAL(MAGNETON), SPECIES_TO_NATIONAL(FARFETCHD), SPECIES_TO_NATIONAL(DODUO), SPECIES_TO_NATIONAL(DODRIO), SPECIES_TO_NATIONAL(SEEL), SPECIES_TO_NATIONAL(DEWGONG), SPECIES_TO_NATIONAL(GRIMER), SPECIES_TO_NATIONAL(MUK), SPECIES_TO_NATIONAL(SHELLDER), SPECIES_TO_NATIONAL(CLOYSTER), SPECIES_TO_NATIONAL(GASTLY), SPECIES_TO_NATIONAL(HAUNTER), SPECIES_TO_NATIONAL(GENGAR), SPECIES_TO_NATIONAL(ONIX), SPECIES_TO_NATIONAL(DROWZEE), SPECIES_TO_NATIONAL(HYPNO), SPECIES_TO_NATIONAL(KRABBY), SPECIES_TO_NATIONAL(KINGLER), SPECIES_TO_NATIONAL(VOLTORB), SPECIES_TO_NATIONAL(ELECTRODE), SPECIES_TO_NATIONAL(EXEGGCUTE), SPECIES_TO_NATIONAL(EXEGGUTOR), SPECIES_TO_NATIONAL(CUBONE), SPECIES_TO_NATIONAL(MAROWAK), SPECIES_TO_NATIONAL(HITMONLEE), SPECIES_TO_NATIONAL(HITMONCHAN), SPECIES_TO_NATIONAL(LICKITUNG), SPECIES_TO_NATIONAL(KOFFING), SPECIES_TO_NATIONAL(WEEZING), SPECIES_TO_NATIONAL(RHYHORN), SPECIES_TO_NATIONAL(RHYDON), SPECIES_TO_NATIONAL(CHANSEY), SPECIES_TO_NATIONAL(TANGELA), SPECIES_TO_NATIONAL(KANGASKHAN), SPECIES_TO_NATIONAL(HORSEA), SPECIES_TO_NATIONAL(SEADRA), SPECIES_TO_NATIONAL(GOLDEEN), SPECIES_TO_NATIONAL(SEAKING), SPECIES_TO_NATIONAL(STARYU), SPECIES_TO_NATIONAL(STARMIE), SPECIES_TO_NATIONAL(MR_MIME), SPECIES_TO_NATIONAL(SCYTHER), SPECIES_TO_NATIONAL(JYNX), SPECIES_TO_NATIONAL(ELECTABUZZ), SPECIES_TO_NATIONAL(MAGMAR), SPECIES_TO_NATIONAL(PINSIR), SPECIES_TO_NATIONAL(TAUROS), SPECIES_TO_NATIONAL(MAGIKARP), SPECIES_TO_NATIONAL(GYARADOS), SPECIES_TO_NATIONAL(LAPRAS), SPECIES_TO_NATIONAL(DITTO), SPECIES_TO_NATIONAL(EEVEE), SPECIES_TO_NATIONAL(VAPOREON), SPECIES_TO_NATIONAL(JOLTEON), SPECIES_TO_NATIONAL(FLAREON), SPECIES_TO_NATIONAL(PORYGON), SPECIES_TO_NATIONAL(OMANYTE), SPECIES_TO_NATIONAL(OMASTAR), SPECIES_TO_NATIONAL(KABUTO), SPECIES_TO_NATIONAL(KABUTOPS), SPECIES_TO_NATIONAL(AERODACTYL), SPECIES_TO_NATIONAL(SNORLAX), SPECIES_TO_NATIONAL(ARTICUNO), SPECIES_TO_NATIONAL(ZAPDOS), SPECIES_TO_NATIONAL(MOLTRES), SPECIES_TO_NATIONAL(DRATINI), SPECIES_TO_NATIONAL(DRAGONAIR), SPECIES_TO_NATIONAL(DRAGONITE), SPECIES_TO_NATIONAL(MEWTWO), SPECIES_TO_NATIONAL(MEW), SPECIES_TO_NATIONAL(CHIKORITA), SPECIES_TO_NATIONAL(BAYLEEF), SPECIES_TO_NATIONAL(MEGANIUM), SPECIES_TO_NATIONAL(CYNDAQUIL), SPECIES_TO_NATIONAL(QUILAVA), SPECIES_TO_NATIONAL(TYPHLOSION), SPECIES_TO_NATIONAL(TOTODILE), SPECIES_TO_NATIONAL(CROCONAW), SPECIES_TO_NATIONAL(FERALIGATR), SPECIES_TO_NATIONAL(SENTRET), SPECIES_TO_NATIONAL(FURRET), SPECIES_TO_NATIONAL(HOOTHOOT), SPECIES_TO_NATIONAL(NOCTOWL), SPECIES_TO_NATIONAL(LEDYBA), SPECIES_TO_NATIONAL(LEDIAN), SPECIES_TO_NATIONAL(SPINARAK), SPECIES_TO_NATIONAL(ARIADOS), SPECIES_TO_NATIONAL(CROBAT), SPECIES_TO_NATIONAL(CHINCHOU), SPECIES_TO_NATIONAL(LANTURN), SPECIES_TO_NATIONAL(PICHU), SPECIES_TO_NATIONAL(CLEFFA), SPECIES_TO_NATIONAL(IGGLYBUFF), SPECIES_TO_NATIONAL(TOGEPI), SPECIES_TO_NATIONAL(TOGETIC), SPECIES_TO_NATIONAL(NATU), SPECIES_TO_NATIONAL(XATU), SPECIES_TO_NATIONAL(MAREEP), SPECIES_TO_NATIONAL(FLAAFFY), SPECIES_TO_NATIONAL(AMPHAROS), SPECIES_TO_NATIONAL(BELLOSSOM), SPECIES_TO_NATIONAL(MARILL), SPECIES_TO_NATIONAL(AZUMARILL), SPECIES_TO_NATIONAL(SUDOWOODO), SPECIES_TO_NATIONAL(POLITOED), SPECIES_TO_NATIONAL(HOPPIP), SPECIES_TO_NATIONAL(SKIPLOOM), SPECIES_TO_NATIONAL(JUMPLUFF), SPECIES_TO_NATIONAL(AIPOM), SPECIES_TO_NATIONAL(SUNKERN), SPECIES_TO_NATIONAL(SUNFLORA), SPECIES_TO_NATIONAL(YANMA), SPECIES_TO_NATIONAL(WOOPER), SPECIES_TO_NATIONAL(QUAGSIRE), SPECIES_TO_NATIONAL(ESPEON), SPECIES_TO_NATIONAL(UMBREON), SPECIES_TO_NATIONAL(MURKROW), SPECIES_TO_NATIONAL(SLOWKING), SPECIES_TO_NATIONAL(MISDREAVUS), SPECIES_TO_NATIONAL(UNOWN), SPECIES_TO_NATIONAL(WOBBUFFET), SPECIES_TO_NATIONAL(GIRAFARIG), SPECIES_TO_NATIONAL(PINECO), SPECIES_TO_NATIONAL(FORRETRESS), SPECIES_TO_NATIONAL(DUNSPARCE), SPECIES_TO_NATIONAL(GLIGAR), SPECIES_TO_NATIONAL(STEELIX), SPECIES_TO_NATIONAL(SNUBBULL), SPECIES_TO_NATIONAL(GRANBULL), SPECIES_TO_NATIONAL(QWILFISH), SPECIES_TO_NATIONAL(SCIZOR), SPECIES_TO_NATIONAL(SHUCKLE), SPECIES_TO_NATIONAL(HERACROSS), SPECIES_TO_NATIONAL(SNEASEL), SPECIES_TO_NATIONAL(TEDDIURSA), SPECIES_TO_NATIONAL(URSARING), SPECIES_TO_NATIONAL(SLUGMA), SPECIES_TO_NATIONAL(MAGCARGO), SPECIES_TO_NATIONAL(SWINUB), SPECIES_TO_NATIONAL(PILOSWINE), SPECIES_TO_NATIONAL(CORSOLA), SPECIES_TO_NATIONAL(REMORAID), SPECIES_TO_NATIONAL(OCTILLERY), SPECIES_TO_NATIONAL(DELIBIRD), SPECIES_TO_NATIONAL(MANTINE), SPECIES_TO_NATIONAL(SKARMORY), SPECIES_TO_NATIONAL(HOUNDOUR), SPECIES_TO_NATIONAL(HOUNDOOM), SPECIES_TO_NATIONAL(KINGDRA), SPECIES_TO_NATIONAL(PHANPY), SPECIES_TO_NATIONAL(DONPHAN), SPECIES_TO_NATIONAL(PORYGON2), SPECIES_TO_NATIONAL(STANTLER), SPECIES_TO_NATIONAL(SMEARGLE), SPECIES_TO_NATIONAL(TYROGUE), SPECIES_TO_NATIONAL(HITMONTOP), SPECIES_TO_NATIONAL(SMOOCHUM), SPECIES_TO_NATIONAL(ELEKID), SPECIES_TO_NATIONAL(MAGBY), SPECIES_TO_NATIONAL(MILTANK), SPECIES_TO_NATIONAL(BLISSEY), SPECIES_TO_NATIONAL(RAIKOU), SPECIES_TO_NATIONAL(ENTEI), SPECIES_TO_NATIONAL(SUICUNE), SPECIES_TO_NATIONAL(LARVITAR), SPECIES_TO_NATIONAL(PUPITAR), SPECIES_TO_NATIONAL(TYRANITAR), SPECIES_TO_NATIONAL(LUGIA), SPECIES_TO_NATIONAL(HO_OH), SPECIES_TO_NATIONAL(CELEBI), SPECIES_TO_NATIONAL(OLD_UNOWN_B), SPECIES_TO_NATIONAL(OLD_UNOWN_C), SPECIES_TO_NATIONAL(OLD_UNOWN_D), SPECIES_TO_NATIONAL(OLD_UNOWN_E), SPECIES_TO_NATIONAL(OLD_UNOWN_F), SPECIES_TO_NATIONAL(OLD_UNOWN_G), SPECIES_TO_NATIONAL(OLD_UNOWN_H), SPECIES_TO_NATIONAL(OLD_UNOWN_I), SPECIES_TO_NATIONAL(OLD_UNOWN_J), SPECIES_TO_NATIONAL(OLD_UNOWN_K), SPECIES_TO_NATIONAL(OLD_UNOWN_L), SPECIES_TO_NATIONAL(OLD_UNOWN_M), SPECIES_TO_NATIONAL(OLD_UNOWN_N), SPECIES_TO_NATIONAL(OLD_UNOWN_O), SPECIES_TO_NATIONAL(OLD_UNOWN_P), SPECIES_TO_NATIONAL(OLD_UNOWN_Q), SPECIES_TO_NATIONAL(OLD_UNOWN_R), SPECIES_TO_NATIONAL(OLD_UNOWN_S), SPECIES_TO_NATIONAL(OLD_UNOWN_T), SPECIES_TO_NATIONAL(OLD_UNOWN_U), SPECIES_TO_NATIONAL(OLD_UNOWN_V), SPECIES_TO_NATIONAL(OLD_UNOWN_W), SPECIES_TO_NATIONAL(OLD_UNOWN_X), SPECIES_TO_NATIONAL(OLD_UNOWN_Y), SPECIES_TO_NATIONAL(OLD_UNOWN_Z), SPECIES_TO_NATIONAL(TREECKO), SPECIES_TO_NATIONAL(GROVYLE), SPECIES_TO_NATIONAL(SCEPTILE), SPECIES_TO_NATIONAL(TORCHIC), SPECIES_TO_NATIONAL(COMBUSKEN), SPECIES_TO_NATIONAL(BLAZIKEN), SPECIES_TO_NATIONAL(MUDKIP), SPECIES_TO_NATIONAL(MARSHTOMP), SPECIES_TO_NATIONAL(SWAMPERT), SPECIES_TO_NATIONAL(POOCHYENA), SPECIES_TO_NATIONAL(MIGHTYENA), SPECIES_TO_NATIONAL(ZIGZAGOON), SPECIES_TO_NATIONAL(LINOONE), SPECIES_TO_NATIONAL(WURMPLE), SPECIES_TO_NATIONAL(SILCOON), SPECIES_TO_NATIONAL(BEAUTIFLY), SPECIES_TO_NATIONAL(CASCOON), SPECIES_TO_NATIONAL(DUSTOX), SPECIES_TO_NATIONAL(LOTAD), SPECIES_TO_NATIONAL(LOMBRE), SPECIES_TO_NATIONAL(LUDICOLO), SPECIES_TO_NATIONAL(SEEDOT), SPECIES_TO_NATIONAL(NUZLEAF), SPECIES_TO_NATIONAL(SHIFTRY), SPECIES_TO_NATIONAL(NINCADA), SPECIES_TO_NATIONAL(NINJASK), SPECIES_TO_NATIONAL(SHEDINJA), SPECIES_TO_NATIONAL(TAILLOW), SPECIES_TO_NATIONAL(SWELLOW), SPECIES_TO_NATIONAL(SHROOMISH), SPECIES_TO_NATIONAL(BRELOOM), SPECIES_TO_NATIONAL(SPINDA), SPECIES_TO_NATIONAL(WINGULL), SPECIES_TO_NATIONAL(PELIPPER), SPECIES_TO_NATIONAL(SURSKIT), SPECIES_TO_NATIONAL(MASQUERAIN), SPECIES_TO_NATIONAL(WAILMER), SPECIES_TO_NATIONAL(WAILORD), SPECIES_TO_NATIONAL(SKITTY), SPECIES_TO_NATIONAL(DELCATTY), SPECIES_TO_NATIONAL(KECLEON), SPECIES_TO_NATIONAL(BALTOY), SPECIES_TO_NATIONAL(CLAYDOL), SPECIES_TO_NATIONAL(NOSEPASS), SPECIES_TO_NATIONAL(TORKOAL), SPECIES_TO_NATIONAL(SABLEYE), SPECIES_TO_NATIONAL(BARBOACH), SPECIES_TO_NATIONAL(WHISCASH), SPECIES_TO_NATIONAL(LUVDISC), SPECIES_TO_NATIONAL(CORPHISH), SPECIES_TO_NATIONAL(CRAWDAUNT), SPECIES_TO_NATIONAL(FEEBAS), SPECIES_TO_NATIONAL(MILOTIC), SPECIES_TO_NATIONAL(CARVANHA), SPECIES_TO_NATIONAL(SHARPEDO), SPECIES_TO_NATIONAL(TRAPINCH), SPECIES_TO_NATIONAL(VIBRAVA), SPECIES_TO_NATIONAL(FLYGON), SPECIES_TO_NATIONAL(MAKUHITA), SPECIES_TO_NATIONAL(HARIYAMA), SPECIES_TO_NATIONAL(ELECTRIKE), SPECIES_TO_NATIONAL(MANECTRIC), SPECIES_TO_NATIONAL(NUMEL), SPECIES_TO_NATIONAL(CAMERUPT), SPECIES_TO_NATIONAL(SPHEAL), SPECIES_TO_NATIONAL(SEALEO), SPECIES_TO_NATIONAL(WALREIN), SPECIES_TO_NATIONAL(CACNEA), SPECIES_TO_NATIONAL(CACTURNE), SPECIES_TO_NATIONAL(SNORUNT), SPECIES_TO_NATIONAL(GLALIE), SPECIES_TO_NATIONAL(LUNATONE), SPECIES_TO_NATIONAL(SOLROCK), SPECIES_TO_NATIONAL(AZURILL), SPECIES_TO_NATIONAL(SPOINK), SPECIES_TO_NATIONAL(GRUMPIG), SPECIES_TO_NATIONAL(PLUSLE), SPECIES_TO_NATIONAL(MINUN), SPECIES_TO_NATIONAL(MAWILE), SPECIES_TO_NATIONAL(MEDITITE), SPECIES_TO_NATIONAL(MEDICHAM), SPECIES_TO_NATIONAL(SWABLU), SPECIES_TO_NATIONAL(ALTARIA), SPECIES_TO_NATIONAL(WYNAUT), SPECIES_TO_NATIONAL(DUSKULL), SPECIES_TO_NATIONAL(DUSCLOPS), SPECIES_TO_NATIONAL(ROSELIA), SPECIES_TO_NATIONAL(SLAKOTH), SPECIES_TO_NATIONAL(VIGOROTH), SPECIES_TO_NATIONAL(SLAKING), SPECIES_TO_NATIONAL(GULPIN), SPECIES_TO_NATIONAL(SWALOT), SPECIES_TO_NATIONAL(TROPIUS), SPECIES_TO_NATIONAL(WHISMUR), SPECIES_TO_NATIONAL(LOUDRED), SPECIES_TO_NATIONAL(EXPLOUD), SPECIES_TO_NATIONAL(CLAMPERL), SPECIES_TO_NATIONAL(HUNTAIL), SPECIES_TO_NATIONAL(GOREBYSS), SPECIES_TO_NATIONAL(ABSOL), SPECIES_TO_NATIONAL(SHUPPET), SPECIES_TO_NATIONAL(BANETTE), SPECIES_TO_NATIONAL(SEVIPER), SPECIES_TO_NATIONAL(ZANGOOSE), SPECIES_TO_NATIONAL(RELICANTH), SPECIES_TO_NATIONAL(ARON), SPECIES_TO_NATIONAL(LAIRON), SPECIES_TO_NATIONAL(AGGRON), SPECIES_TO_NATIONAL(CASTFORM), SPECIES_TO_NATIONAL(VOLBEAT), SPECIES_TO_NATIONAL(ILLUMISE), SPECIES_TO_NATIONAL(LILEEP), SPECIES_TO_NATIONAL(CRADILY), SPECIES_TO_NATIONAL(ANORITH), SPECIES_TO_NATIONAL(ARMALDO), SPECIES_TO_NATIONAL(RALTS), SPECIES_TO_NATIONAL(KIRLIA), SPECIES_TO_NATIONAL(GARDEVOIR), SPECIES_TO_NATIONAL(BAGON), SPECIES_TO_NATIONAL(SHELGON), SPECIES_TO_NATIONAL(SALAMENCE), SPECIES_TO_NATIONAL(BELDUM), SPECIES_TO_NATIONAL(METANG), SPECIES_TO_NATIONAL(METAGROSS), SPECIES_TO_NATIONAL(REGIROCK), SPECIES_TO_NATIONAL(REGICE), SPECIES_TO_NATIONAL(REGISTEEL), SPECIES_TO_NATIONAL(KYOGRE), SPECIES_TO_NATIONAL(GROUDON), SPECIES_TO_NATIONAL(RAYQUAZA), SPECIES_TO_NATIONAL(LATIAS), SPECIES_TO_NATIONAL(LATIOS), SPECIES_TO_NATIONAL(JIRACHI), SPECIES_TO_NATIONAL(DEOXYS), SPECIES_TO_NATIONAL(CHIMECHO), }; static const u16 sSpeciesToExtendedPokedexNum[] = // Assigns all species to the Extended Dex Index (Summary No. for Extended Dex) { SPECIES_TO_EXTENDED(BULBASAUR), SPECIES_TO_EXTENDED(IVYSAUR), SPECIES_TO_EXTENDED(VENUSAUR), SPECIES_TO_EXTENDED(CHARMANDER), SPECIES_TO_EXTENDED(CHARMELEON), SPECIES_TO_EXTENDED(CHARIZARD), SPECIES_TO_EXTENDED(SQUIRTLE), SPECIES_TO_EXTENDED(WARTORTLE), SPECIES_TO_EXTENDED(BLASTOISE), SPECIES_TO_EXTENDED(CATERPIE), SPECIES_TO_EXTENDED(METAPOD), SPECIES_TO_EXTENDED(BUTTERFREE), SPECIES_TO_EXTENDED(WEEDLE), SPECIES_TO_EXTENDED(KAKUNA), SPECIES_TO_EXTENDED(BEEDRILL), SPECIES_TO_EXTENDED(PIDGEY), SPECIES_TO_EXTENDED(PIDGEOTTO), SPECIES_TO_EXTENDED(PIDGEOT), SPECIES_TO_EXTENDED(RATTATA), SPECIES_TO_EXTENDED(RATICATE), SPECIES_TO_EXTENDED(SPEAROW), SPECIES_TO_EXTENDED(FEAROW), SPECIES_TO_EXTENDED(EKANS), SPECIES_TO_EXTENDED(ARBOK), SPECIES_TO_EXTENDED(PIKACHU), SPECIES_TO_EXTENDED(RAICHU), SPECIES_TO_EXTENDED(SANDSHREW), SPECIES_TO_EXTENDED(SANDSLASH), SPECIES_TO_EXTENDED(NIDORAN_F), SPECIES_TO_EXTENDED(NIDORINA), SPECIES_TO_EXTENDED(NIDOQUEEN), SPECIES_TO_EXTENDED(NIDORAN_M), SPECIES_TO_EXTENDED(NIDORINO), SPECIES_TO_EXTENDED(NIDOKING), SPECIES_TO_EXTENDED(CLEFAIRY), SPECIES_TO_EXTENDED(CLEFABLE), SPECIES_TO_EXTENDED(VULPIX), SPECIES_TO_EXTENDED(NINETALES), SPECIES_TO_EXTENDED(JIGGLYPUFF), SPECIES_TO_EXTENDED(WIGGLYTUFF), SPECIES_TO_EXTENDED(ZUBAT), SPECIES_TO_EXTENDED(GOLBAT), SPECIES_TO_EXTENDED(ODDISH), SPECIES_TO_EXTENDED(GLOOM), SPECIES_TO_EXTENDED(VILEPLUME), SPECIES_TO_EXTENDED(PARAS), SPECIES_TO_EXTENDED(PARASECT), SPECIES_TO_EXTENDED(VENONAT), SPECIES_TO_EXTENDED(VENOMOTH), SPECIES_TO_EXTENDED(DIGLETT), SPECIES_TO_EXTENDED(DUGTRIO), SPECIES_TO_EXTENDED(MEOWTH), SPECIES_TO_EXTENDED(PERSIAN), SPECIES_TO_EXTENDED(PSYDUCK), SPECIES_TO_EXTENDED(GOLDUCK), SPECIES_TO_EXTENDED(MANKEY), SPECIES_TO_EXTENDED(PRIMEAPE), SPECIES_TO_EXTENDED(GROWLITHE), SPECIES_TO_EXTENDED(ARCANINE), SPECIES_TO_EXTENDED(POLIWAG), SPECIES_TO_EXTENDED(POLIWHIRL), SPECIES_TO_EXTENDED(POLIWRATH), SPECIES_TO_EXTENDED(ABRA), SPECIES_TO_EXTENDED(KADABRA), SPECIES_TO_EXTENDED(ALAKAZAM), SPECIES_TO_EXTENDED(MACHOP), SPECIES_TO_EXTENDED(MACHOKE), SPECIES_TO_EXTENDED(MACHAMP), SPECIES_TO_EXTENDED(BELLSPROUT), SPECIES_TO_EXTENDED(WEEPINBELL), SPECIES_TO_EXTENDED(VICTREEBEL), SPECIES_TO_EXTENDED(TENTACOOL), SPECIES_TO_EXTENDED(TENTACRUEL), SPECIES_TO_EXTENDED(GEODUDE), SPECIES_TO_EXTENDED(GRAVELER), SPECIES_TO_EXTENDED(GOLEM), SPECIES_TO_EXTENDED(PONYTA), SPECIES_TO_EXTENDED(RAPIDASH), SPECIES_TO_EXTENDED(SLOWPOKE), SPECIES_TO_EXTENDED(SLOWBRO), SPECIES_TO_EXTENDED(MAGNEMITE), SPECIES_TO_EXTENDED(MAGNETON), SPECIES_TO_EXTENDED(FARFETCHD), SPECIES_TO_EXTENDED(DODUO), SPECIES_TO_EXTENDED(DODRIO), SPECIES_TO_EXTENDED(SEEL), SPECIES_TO_EXTENDED(DEWGONG), SPECIES_TO_EXTENDED(GRIMER), SPECIES_TO_EXTENDED(MUK), SPECIES_TO_EXTENDED(SHELLDER), SPECIES_TO_EXTENDED(CLOYSTER), SPECIES_TO_EXTENDED(GASTLY), SPECIES_TO_EXTENDED(HAUNTER), SPECIES_TO_EXTENDED(GENGAR), SPECIES_TO_EXTENDED(ONIX), SPECIES_TO_EXTENDED(DROWZEE), SPECIES_TO_EXTENDED(HYPNO), SPECIES_TO_EXTENDED(KRABBY), SPECIES_TO_EXTENDED(KINGLER), SPECIES_TO_EXTENDED(VOLTORB), SPECIES_TO_EXTENDED(ELECTRODE), SPECIES_TO_EXTENDED(EXEGGCUTE), SPECIES_TO_EXTENDED(EXEGGUTOR), SPECIES_TO_EXTENDED(CUBONE), SPECIES_TO_EXTENDED(MAROWAK), SPECIES_TO_EXTENDED(HITMONLEE), SPECIES_TO_EXTENDED(HITMONCHAN), SPECIES_TO_EXTENDED(LICKITUNG), SPECIES_TO_EXTENDED(KOFFING), SPECIES_TO_EXTENDED(WEEZING), SPECIES_TO_EXTENDED(RHYHORN), SPECIES_TO_EXTENDED(RHYDON), SPECIES_TO_EXTENDED(CHANSEY), SPECIES_TO_EXTENDED(TANGELA), SPECIES_TO_EXTENDED(KANGASKHAN), SPECIES_TO_EXTENDED(HORSEA), SPECIES_TO_EXTENDED(SEADRA), SPECIES_TO_EXTENDED(GOLDEEN), SPECIES_TO_EXTENDED(SEAKING), SPECIES_TO_EXTENDED(STARYU), SPECIES_TO_EXTENDED(STARMIE), SPECIES_TO_EXTENDED(MR_MIME), SPECIES_TO_EXTENDED(SCYTHER), SPECIES_TO_EXTENDED(JYNX), SPECIES_TO_EXTENDED(ELECTABUZZ), SPECIES_TO_EXTENDED(MAGMAR), SPECIES_TO_EXTENDED(PINSIR), SPECIES_TO_EXTENDED(TAUROS), SPECIES_TO_EXTENDED(MAGIKARP), SPECIES_TO_EXTENDED(GYARADOS), SPECIES_TO_EXTENDED(LAPRAS), SPECIES_TO_EXTENDED(DITTO), SPECIES_TO_EXTENDED(EEVEE), SPECIES_TO_EXTENDED(VAPOREON), SPECIES_TO_EXTENDED(JOLTEON), SPECIES_TO_EXTENDED(FLAREON), SPECIES_TO_EXTENDED(PORYGON), SPECIES_TO_EXTENDED(OMANYTE), SPECIES_TO_EXTENDED(OMASTAR), SPECIES_TO_EXTENDED(KABUTO), SPECIES_TO_EXTENDED(KABUTOPS), SPECIES_TO_EXTENDED(AERODACTYL), SPECIES_TO_EXTENDED(SNORLAX), SPECIES_TO_EXTENDED(ARTICUNO), SPECIES_TO_EXTENDED(ZAPDOS), SPECIES_TO_EXTENDED(MOLTRES), SPECIES_TO_EXTENDED(DRATINI), SPECIES_TO_EXTENDED(DRAGONAIR), SPECIES_TO_EXTENDED(DRAGONITE), SPECIES_TO_EXTENDED(MEWTWO), SPECIES_TO_EXTENDED(MEW), SPECIES_TO_EXTENDED(CHIKORITA), SPECIES_TO_EXTENDED(BAYLEEF), SPECIES_TO_EXTENDED(MEGANIUM), SPECIES_TO_EXTENDED(CYNDAQUIL), SPECIES_TO_EXTENDED(QUILAVA), SPECIES_TO_EXTENDED(TYPHLOSION), SPECIES_TO_EXTENDED(TOTODILE), SPECIES_TO_EXTENDED(CROCONAW), SPECIES_TO_EXTENDED(FERALIGATR), SPECIES_TO_EXTENDED(SENTRET), SPECIES_TO_EXTENDED(FURRET), SPECIES_TO_EXTENDED(HOOTHOOT), SPECIES_TO_EXTENDED(NOCTOWL), SPECIES_TO_EXTENDED(LEDYBA), SPECIES_TO_EXTENDED(LEDIAN), SPECIES_TO_EXTENDED(SPINARAK), SPECIES_TO_EXTENDED(ARIADOS), SPECIES_TO_EXTENDED(CROBAT), SPECIES_TO_EXTENDED(CHINCHOU), SPECIES_TO_EXTENDED(LANTURN), SPECIES_TO_EXTENDED(PICHU), SPECIES_TO_EXTENDED(CLEFFA), SPECIES_TO_EXTENDED(IGGLYBUFF), SPECIES_TO_EXTENDED(TOGEPI), SPECIES_TO_EXTENDED(TOGETIC), SPECIES_TO_EXTENDED(NATU), SPECIES_TO_EXTENDED(XATU), SPECIES_TO_EXTENDED(MAREEP), SPECIES_TO_EXTENDED(FLAAFFY), SPECIES_TO_EXTENDED(AMPHAROS), SPECIES_TO_EXTENDED(BELLOSSOM), SPECIES_TO_EXTENDED(MARILL), SPECIES_TO_EXTENDED(AZUMARILL), SPECIES_TO_EXTENDED(SUDOWOODO), SPECIES_TO_EXTENDED(POLITOED), SPECIES_TO_EXTENDED(HOPPIP), SPECIES_TO_EXTENDED(SKIPLOOM), SPECIES_TO_EXTENDED(JUMPLUFF), SPECIES_TO_EXTENDED(AIPOM), SPECIES_TO_EXTENDED(SUNKERN), SPECIES_TO_EXTENDED(SUNFLORA), SPECIES_TO_EXTENDED(YANMA), SPECIES_TO_EXTENDED(WOOPER), SPECIES_TO_EXTENDED(QUAGSIRE), SPECIES_TO_EXTENDED(ESPEON), SPECIES_TO_EXTENDED(UMBREON), SPECIES_TO_EXTENDED(MURKROW), SPECIES_TO_EXTENDED(SLOWKING), SPECIES_TO_EXTENDED(MISDREAVUS), SPECIES_TO_EXTENDED(UNOWN), SPECIES_TO_EXTENDED(WOBBUFFET), SPECIES_TO_EXTENDED(GIRAFARIG), SPECIES_TO_EXTENDED(PINECO), SPECIES_TO_EXTENDED(FORRETRESS), SPECIES_TO_EXTENDED(DUNSPARCE), SPECIES_TO_EXTENDED(GLIGAR), SPECIES_TO_EXTENDED(STEELIX), SPECIES_TO_EXTENDED(SNUBBULL), SPECIES_TO_EXTENDED(GRANBULL), SPECIES_TO_EXTENDED(QWILFISH), SPECIES_TO_EXTENDED(SCIZOR), SPECIES_TO_EXTENDED(SHUCKLE), SPECIES_TO_EXTENDED(HERACROSS), SPECIES_TO_EXTENDED(SNEASEL), SPECIES_TO_EXTENDED(TEDDIURSA), SPECIES_TO_EXTENDED(URSARING), SPECIES_TO_EXTENDED(SLUGMA), SPECIES_TO_EXTENDED(MAGCARGO), SPECIES_TO_EXTENDED(SWINUB), SPECIES_TO_EXTENDED(PILOSWINE), SPECIES_TO_EXTENDED(CORSOLA), SPECIES_TO_EXTENDED(REMORAID), SPECIES_TO_EXTENDED(OCTILLERY), SPECIES_TO_EXTENDED(DELIBIRD), SPECIES_TO_EXTENDED(MANTINE), SPECIES_TO_EXTENDED(SKARMORY), SPECIES_TO_EXTENDED(HOUNDOUR), SPECIES_TO_EXTENDED(HOUNDOOM), SPECIES_TO_EXTENDED(KINGDRA), SPECIES_TO_EXTENDED(PHANPY), SPECIES_TO_EXTENDED(DONPHAN), SPECIES_TO_EXTENDED(PORYGON2), SPECIES_TO_EXTENDED(STANTLER), SPECIES_TO_EXTENDED(SMEARGLE), SPECIES_TO_EXTENDED(TYROGUE), SPECIES_TO_EXTENDED(HITMONTOP), SPECIES_TO_EXTENDED(SMOOCHUM), SPECIES_TO_EXTENDED(ELEKID), SPECIES_TO_EXTENDED(MAGBY), SPECIES_TO_EXTENDED(MILTANK), SPECIES_TO_EXTENDED(BLISSEY), SPECIES_TO_EXTENDED(RAIKOU), SPECIES_TO_EXTENDED(ENTEI), SPECIES_TO_EXTENDED(SUICUNE), SPECIES_TO_EXTENDED(LARVITAR), SPECIES_TO_EXTENDED(PUPITAR), SPECIES_TO_EXTENDED(TYRANITAR), SPECIES_TO_EXTENDED(LUGIA), SPECIES_TO_EXTENDED(HO_OH), SPECIES_TO_EXTENDED(CELEBI), SPECIES_TO_EXTENDED(OLD_UNOWN_B), SPECIES_TO_EXTENDED(OLD_UNOWN_C), SPECIES_TO_EXTENDED(OLD_UNOWN_D), SPECIES_TO_EXTENDED(OLD_UNOWN_E), SPECIES_TO_EXTENDED(OLD_UNOWN_F), SPECIES_TO_EXTENDED(OLD_UNOWN_G), SPECIES_TO_EXTENDED(OLD_UNOWN_H), SPECIES_TO_EXTENDED(OLD_UNOWN_I), SPECIES_TO_EXTENDED(OLD_UNOWN_J), SPECIES_TO_EXTENDED(OLD_UNOWN_K), SPECIES_TO_EXTENDED(OLD_UNOWN_L), SPECIES_TO_EXTENDED(OLD_UNOWN_M), SPECIES_TO_EXTENDED(OLD_UNOWN_N), SPECIES_TO_EXTENDED(OLD_UNOWN_O), SPECIES_TO_EXTENDED(OLD_UNOWN_P), SPECIES_TO_EXTENDED(OLD_UNOWN_Q), SPECIES_TO_EXTENDED(OLD_UNOWN_R), SPECIES_TO_EXTENDED(OLD_UNOWN_S), SPECIES_TO_EXTENDED(OLD_UNOWN_T), SPECIES_TO_EXTENDED(OLD_UNOWN_U), SPECIES_TO_EXTENDED(OLD_UNOWN_V), SPECIES_TO_EXTENDED(OLD_UNOWN_W), SPECIES_TO_EXTENDED(OLD_UNOWN_X), SPECIES_TO_EXTENDED(OLD_UNOWN_Y), SPECIES_TO_EXTENDED(OLD_UNOWN_Z), SPECIES_TO_EXTENDED(TREECKO), SPECIES_TO_EXTENDED(GROVYLE), SPECIES_TO_EXTENDED(SCEPTILE), SPECIES_TO_EXTENDED(TORCHIC), SPECIES_TO_EXTENDED(COMBUSKEN), SPECIES_TO_EXTENDED(BLAZIKEN), SPECIES_TO_EXTENDED(MUDKIP), SPECIES_TO_EXTENDED(MARSHTOMP), SPECIES_TO_EXTENDED(SWAMPERT), SPECIES_TO_EXTENDED(POOCHYENA), SPECIES_TO_EXTENDED(MIGHTYENA), SPECIES_TO_EXTENDED(ZIGZAGOON), SPECIES_TO_EXTENDED(LINOONE), SPECIES_TO_EXTENDED(WURMPLE), SPECIES_TO_EXTENDED(SILCOON), SPECIES_TO_EXTENDED(BEAUTIFLY), SPECIES_TO_EXTENDED(CASCOON), SPECIES_TO_EXTENDED(DUSTOX), SPECIES_TO_EXTENDED(LOTAD), SPECIES_TO_EXTENDED(LOMBRE), SPECIES_TO_EXTENDED(LUDICOLO), SPECIES_TO_EXTENDED(SEEDOT), SPECIES_TO_EXTENDED(NUZLEAF), SPECIES_TO_EXTENDED(SHIFTRY), SPECIES_TO_EXTENDED(NINCADA), SPECIES_TO_EXTENDED(NINJASK), SPECIES_TO_EXTENDED(SHEDINJA), SPECIES_TO_EXTENDED(TAILLOW), SPECIES_TO_EXTENDED(SWELLOW), SPECIES_TO_EXTENDED(SHROOMISH), SPECIES_TO_EXTENDED(BRELOOM), SPECIES_TO_EXTENDED(SPINDA), SPECIES_TO_EXTENDED(WINGULL), SPECIES_TO_EXTENDED(PELIPPER), SPECIES_TO_EXTENDED(SURSKIT), SPECIES_TO_EXTENDED(MASQUERAIN), SPECIES_TO_EXTENDED(WAILMER), SPECIES_TO_EXTENDED(WAILORD), SPECIES_TO_EXTENDED(SKITTY), SPECIES_TO_EXTENDED(DELCATTY), SPECIES_TO_EXTENDED(KECLEON), SPECIES_TO_EXTENDED(BALTOY), SPECIES_TO_EXTENDED(CLAYDOL), SPECIES_TO_EXTENDED(NOSEPASS), SPECIES_TO_EXTENDED(TORKOAL), SPECIES_TO_EXTENDED(SABLEYE), SPECIES_TO_EXTENDED(BARBOACH), SPECIES_TO_EXTENDED(WHISCASH), SPECIES_TO_EXTENDED(LUVDISC), SPECIES_TO_EXTENDED(CORPHISH), SPECIES_TO_EXTENDED(CRAWDAUNT), SPECIES_TO_EXTENDED(FEEBAS), SPECIES_TO_EXTENDED(MILOTIC), SPECIES_TO_EXTENDED(CARVANHA), SPECIES_TO_EXTENDED(SHARPEDO), SPECIES_TO_EXTENDED(TRAPINCH), SPECIES_TO_EXTENDED(VIBRAVA), SPECIES_TO_EXTENDED(FLYGON), SPECIES_TO_EXTENDED(MAKUHITA), SPECIES_TO_EXTENDED(HARIYAMA), SPECIES_TO_EXTENDED(ELECTRIKE), SPECIES_TO_EXTENDED(MANECTRIC), SPECIES_TO_EXTENDED(NUMEL), SPECIES_TO_EXTENDED(CAMERUPT), SPECIES_TO_EXTENDED(SPHEAL), SPECIES_TO_EXTENDED(SEALEO), SPECIES_TO_EXTENDED(WALREIN), SPECIES_TO_EXTENDED(CACNEA), SPECIES_TO_EXTENDED(CACTURNE), SPECIES_TO_EXTENDED(SNORUNT), SPECIES_TO_EXTENDED(GLALIE), SPECIES_TO_EXTENDED(LUNATONE), SPECIES_TO_EXTENDED(SOLROCK), SPECIES_TO_EXTENDED(AZURILL), SPECIES_TO_EXTENDED(SPOINK), SPECIES_TO_EXTENDED(GRUMPIG), SPECIES_TO_EXTENDED(PLUSLE), SPECIES_TO_EXTENDED(MINUN), SPECIES_TO_EXTENDED(MAWILE), SPECIES_TO_EXTENDED(MEDITITE), SPECIES_TO_EXTENDED(MEDICHAM), SPECIES_TO_EXTENDED(SWABLU), SPECIES_TO_EXTENDED(ALTARIA), SPECIES_TO_EXTENDED(WYNAUT), SPECIES_TO_EXTENDED(DUSKULL), SPECIES_TO_EXTENDED(DUSCLOPS), SPECIES_TO_EXTENDED(ROSELIA), SPECIES_TO_EXTENDED(SLAKOTH), SPECIES_TO_EXTENDED(VIGOROTH), SPECIES_TO_EXTENDED(SLAKING), SPECIES_TO_EXTENDED(GULPIN), SPECIES_TO_EXTENDED(SWALOT), SPECIES_TO_EXTENDED(TROPIUS), SPECIES_TO_EXTENDED(WHISMUR), SPECIES_TO_EXTENDED(LOUDRED), SPECIES_TO_EXTENDED(EXPLOUD), SPECIES_TO_EXTENDED(CLAMPERL), SPECIES_TO_EXTENDED(HUNTAIL), SPECIES_TO_EXTENDED(GOREBYSS), SPECIES_TO_EXTENDED(ABSOL), SPECIES_TO_EXTENDED(SHUPPET), SPECIES_TO_EXTENDED(BANETTE), SPECIES_TO_EXTENDED(SEVIPER), SPECIES_TO_EXTENDED(ZANGOOSE), SPECIES_TO_EXTENDED(RELICANTH), SPECIES_TO_EXTENDED(ARON), SPECIES_TO_EXTENDED(LAIRON), SPECIES_TO_EXTENDED(AGGRON), SPECIES_TO_EXTENDED(CASTFORM), SPECIES_TO_EXTENDED(VOLBEAT), SPECIES_TO_EXTENDED(ILLUMISE), SPECIES_TO_EXTENDED(LILEEP), SPECIES_TO_EXTENDED(CRADILY), SPECIES_TO_EXTENDED(ANORITH), SPECIES_TO_EXTENDED(ARMALDO), SPECIES_TO_EXTENDED(RALTS), SPECIES_TO_EXTENDED(KIRLIA), SPECIES_TO_EXTENDED(GARDEVOIR), SPECIES_TO_EXTENDED(BAGON), SPECIES_TO_EXTENDED(SHELGON), SPECIES_TO_EXTENDED(SALAMENCE), SPECIES_TO_EXTENDED(BELDUM), SPECIES_TO_EXTENDED(METANG), SPECIES_TO_EXTENDED(METAGROSS), SPECIES_TO_EXTENDED(REGIROCK), SPECIES_TO_EXTENDED(REGICE), SPECIES_TO_EXTENDED(REGISTEEL), SPECIES_TO_EXTENDED(KYOGRE), SPECIES_TO_EXTENDED(GROUDON), SPECIES_TO_EXTENDED(RAYQUAZA), SPECIES_TO_EXTENDED(LATIAS), SPECIES_TO_EXTENDED(LATIOS), SPECIES_TO_EXTENDED(JIRACHI), SPECIES_TO_EXTENDED(DEOXYS), SPECIES_TO_EXTENDED(CHIMECHO), }; // Assigns all Hoenn Dex Indexes to a National Dex Index static const u16 sHoennToNationalOrder[NUM_SPECIES - 1] = { HOENN_TO_NATIONAL(TREECKO), HOENN_TO_NATIONAL(GROVYLE), HOENN_TO_NATIONAL(SCEPTILE), HOENN_TO_NATIONAL(TORCHIC), HOENN_TO_NATIONAL(COMBUSKEN), HOENN_TO_NATIONAL(BLAZIKEN), HOENN_TO_NATIONAL(MUDKIP), HOENN_TO_NATIONAL(MARSHTOMP), HOENN_TO_NATIONAL(SWAMPERT), HOENN_TO_NATIONAL(POOCHYENA), HOENN_TO_NATIONAL(MIGHTYENA), HOENN_TO_NATIONAL(ZIGZAGOON), HOENN_TO_NATIONAL(LINOONE), HOENN_TO_NATIONAL(WURMPLE), HOENN_TO_NATIONAL(SILCOON), HOENN_TO_NATIONAL(BEAUTIFLY), HOENN_TO_NATIONAL(CASCOON), HOENN_TO_NATIONAL(DUSTOX), HOENN_TO_NATIONAL(LOTAD), HOENN_TO_NATIONAL(LOMBRE), HOENN_TO_NATIONAL(LUDICOLO), HOENN_TO_NATIONAL(SEEDOT), HOENN_TO_NATIONAL(NUZLEAF), HOENN_TO_NATIONAL(SHIFTRY), HOENN_TO_NATIONAL(TAILLOW), HOENN_TO_NATIONAL(SWELLOW), HOENN_TO_NATIONAL(WINGULL), HOENN_TO_NATIONAL(PELIPPER), HOENN_TO_NATIONAL(RALTS), HOENN_TO_NATIONAL(KIRLIA), HOENN_TO_NATIONAL(GARDEVOIR), HOENN_TO_NATIONAL(SURSKIT), HOENN_TO_NATIONAL(MASQUERAIN), HOENN_TO_NATIONAL(SHROOMISH), HOENN_TO_NATIONAL(BRELOOM), HOENN_TO_NATIONAL(SLAKOTH), HOENN_TO_NATIONAL(VIGOROTH), HOENN_TO_NATIONAL(SLAKING), HOENN_TO_NATIONAL(ABRA), HOENN_TO_NATIONAL(KADABRA), HOENN_TO_NATIONAL(ALAKAZAM), HOENN_TO_NATIONAL(NINCADA), HOENN_TO_NATIONAL(NINJASK), HOENN_TO_NATIONAL(SHEDINJA), HOENN_TO_NATIONAL(WHISMUR), HOENN_TO_NATIONAL(LOUDRED), HOENN_TO_NATIONAL(EXPLOUD), HOENN_TO_NATIONAL(MAKUHITA), HOENN_TO_NATIONAL(HARIYAMA), HOENN_TO_NATIONAL(GOLDEEN), HOENN_TO_NATIONAL(SEAKING), HOENN_TO_NATIONAL(MAGIKARP), HOENN_TO_NATIONAL(GYARADOS), HOENN_TO_NATIONAL(AZURILL), HOENN_TO_NATIONAL(MARILL), HOENN_TO_NATIONAL(AZUMARILL), HOENN_TO_NATIONAL(GEODUDE), HOENN_TO_NATIONAL(GRAVELER), HOENN_TO_NATIONAL(GOLEM), HOENN_TO_NATIONAL(NOSEPASS), HOENN_TO_NATIONAL(SKITTY), HOENN_TO_NATIONAL(DELCATTY), HOENN_TO_NATIONAL(ZUBAT), HOENN_TO_NATIONAL(GOLBAT), HOENN_TO_NATIONAL(CROBAT), HOENN_TO_NATIONAL(TENTACOOL), HOENN_TO_NATIONAL(TENTACRUEL), HOENN_TO_NATIONAL(SABLEYE), HOENN_TO_NATIONAL(MAWILE), HOENN_TO_NATIONAL(ARON), HOENN_TO_NATIONAL(LAIRON), HOENN_TO_NATIONAL(AGGRON), HOENN_TO_NATIONAL(MACHOP), HOENN_TO_NATIONAL(MACHOKE), HOENN_TO_NATIONAL(MACHAMP), HOENN_TO_NATIONAL(MEDITITE), HOENN_TO_NATIONAL(MEDICHAM), HOENN_TO_NATIONAL(ELECTRIKE), HOENN_TO_NATIONAL(MANECTRIC), HOENN_TO_NATIONAL(PLUSLE), HOENN_TO_NATIONAL(MINUN), HOENN_TO_NATIONAL(MAGNEMITE), HOENN_TO_NATIONAL(MAGNETON), HOENN_TO_NATIONAL(VOLTORB), HOENN_TO_NATIONAL(ELECTRODE), HOENN_TO_NATIONAL(VOLBEAT), HOENN_TO_NATIONAL(ILLUMISE), HOENN_TO_NATIONAL(ODDISH), HOENN_TO_NATIONAL(GLOOM), HOENN_TO_NATIONAL(VILEPLUME), HOENN_TO_NATIONAL(BELLOSSOM), HOENN_TO_NATIONAL(DODUO), HOENN_TO_NATIONAL(DODRIO), HOENN_TO_NATIONAL(ROSELIA), HOENN_TO_NATIONAL(GULPIN), HOENN_TO_NATIONAL(SWALOT), HOENN_TO_NATIONAL(CARVANHA), HOENN_TO_NATIONAL(SHARPEDO), HOENN_TO_NATIONAL(WAILMER), HOENN_TO_NATIONAL(WAILORD), HOENN_TO_NATIONAL(NUMEL), HOENN_TO_NATIONAL(CAMERUPT), HOENN_TO_NATIONAL(SLUGMA), HOENN_TO_NATIONAL(MAGCARGO), HOENN_TO_NATIONAL(TORKOAL), HOENN_TO_NATIONAL(GRIMER), HOENN_TO_NATIONAL(MUK), HOENN_TO_NATIONAL(KOFFING), HOENN_TO_NATIONAL(WEEZING), HOENN_TO_NATIONAL(SPOINK), HOENN_TO_NATIONAL(GRUMPIG), HOENN_TO_NATIONAL(SANDSHREW), HOENN_TO_NATIONAL(SANDSLASH), HOENN_TO_NATIONAL(SPINDA), HOENN_TO_NATIONAL(SKARMORY), HOENN_TO_NATIONAL(TRAPINCH), HOENN_TO_NATIONAL(VIBRAVA), HOENN_TO_NATIONAL(FLYGON), HOENN_TO_NATIONAL(CACNEA), HOENN_TO_NATIONAL(CACTURNE), HOENN_TO_NATIONAL(SWABLU), HOENN_TO_NATIONAL(ALTARIA), HOENN_TO_NATIONAL(ZANGOOSE), HOENN_TO_NATIONAL(SEVIPER), HOENN_TO_NATIONAL(LUNATONE), HOENN_TO_NATIONAL(SOLROCK), HOENN_TO_NATIONAL(BARBOACH), HOENN_TO_NATIONAL(WHISCASH), HOENN_TO_NATIONAL(CORPHISH), HOENN_TO_NATIONAL(CRAWDAUNT), HOENN_TO_NATIONAL(BALTOY), HOENN_TO_NATIONAL(CLAYDOL), HOENN_TO_NATIONAL(LILEEP), HOENN_TO_NATIONAL(CRADILY), HOENN_TO_NATIONAL(ANORITH), HOENN_TO_NATIONAL(ARMALDO), HOENN_TO_NATIONAL(IGGLYBUFF), HOENN_TO_NATIONAL(JIGGLYPUFF), HOENN_TO_NATIONAL(WIGGLYTUFF), HOENN_TO_NATIONAL(FEEBAS), HOENN_TO_NATIONAL(MILOTIC), HOENN_TO_NATIONAL(CASTFORM), HOENN_TO_NATIONAL(STARYU), HOENN_TO_NATIONAL(STARMIE), HOENN_TO_NATIONAL(KECLEON), HOENN_TO_NATIONAL(SHUPPET), HOENN_TO_NATIONAL(BANETTE), HOENN_TO_NATIONAL(DUSKULL), HOENN_TO_NATIONAL(DUSCLOPS), HOENN_TO_NATIONAL(TROPIUS), HOENN_TO_NATIONAL(CHIMECHO), HOENN_TO_NATIONAL(ABSOL), HOENN_TO_NATIONAL(VULPIX), HOENN_TO_NATIONAL(NINETALES), HOENN_TO_NATIONAL(PICHU), HOENN_TO_NATIONAL(PIKACHU), HOENN_TO_NATIONAL(RAICHU), HOENN_TO_NATIONAL(PSYDUCK), HOENN_TO_NATIONAL(GOLDUCK), HOENN_TO_NATIONAL(WYNAUT), HOENN_TO_NATIONAL(WOBBUFFET), HOENN_TO_NATIONAL(NATU), HOENN_TO_NATIONAL(XATU), HOENN_TO_NATIONAL(GIRAFARIG), HOENN_TO_NATIONAL(PHANPY), HOENN_TO_NATIONAL(DONPHAN), HOENN_TO_NATIONAL(PINSIR), HOENN_TO_NATIONAL(HERACROSS), HOENN_TO_NATIONAL(RHYHORN), HOENN_TO_NATIONAL(RHYDON), HOENN_TO_NATIONAL(SNORUNT), HOENN_TO_NATIONAL(GLALIE), HOENN_TO_NATIONAL(SPHEAL), HOENN_TO_NATIONAL(SEALEO), HOENN_TO_NATIONAL(WALREIN), HOENN_TO_NATIONAL(CLAMPERL), HOENN_TO_NATIONAL(HUNTAIL), HOENN_TO_NATIONAL(GOREBYSS), HOENN_TO_NATIONAL(RELICANTH), HOENN_TO_NATIONAL(CORSOLA), HOENN_TO_NATIONAL(CHINCHOU), HOENN_TO_NATIONAL(LANTURN), HOENN_TO_NATIONAL(LUVDISC), HOENN_TO_NATIONAL(HORSEA), HOENN_TO_NATIONAL(SEADRA), HOENN_TO_NATIONAL(KINGDRA), HOENN_TO_NATIONAL(BAGON), HOENN_TO_NATIONAL(SHELGON), HOENN_TO_NATIONAL(SALAMENCE), HOENN_TO_NATIONAL(BELDUM), HOENN_TO_NATIONAL(METANG), HOENN_TO_NATIONAL(METAGROSS), HOENN_TO_NATIONAL(REGIROCK), HOENN_TO_NATIONAL(REGICE), HOENN_TO_NATIONAL(REGISTEEL), HOENN_TO_NATIONAL(LATIAS), HOENN_TO_NATIONAL(LATIOS), HOENN_TO_NATIONAL(KYOGRE), HOENN_TO_NATIONAL(GROUDON), HOENN_TO_NATIONAL(RAYQUAZA), HOENN_TO_NATIONAL(JIRACHI), HOENN_TO_NATIONAL(DEOXYS), HOENN_TO_NATIONAL(BULBASAUR), // Pokémon from here onwards are UNSEEN in the HoennDex. HOENN_TO_NATIONAL(IVYSAUR), HOENN_TO_NATIONAL(VENUSAUR), HOENN_TO_NATIONAL(CHARMANDER), HOENN_TO_NATIONAL(CHARMELEON), HOENN_TO_NATIONAL(CHARIZARD), HOENN_TO_NATIONAL(SQUIRTLE), HOENN_TO_NATIONAL(WARTORTLE), HOENN_TO_NATIONAL(BLASTOISE), HOENN_TO_NATIONAL(CATERPIE), HOENN_TO_NATIONAL(METAPOD), HOENN_TO_NATIONAL(BUTTERFREE), HOENN_TO_NATIONAL(WEEDLE), HOENN_TO_NATIONAL(KAKUNA), HOENN_TO_NATIONAL(BEEDRILL), HOENN_TO_NATIONAL(PIDGEY), HOENN_TO_NATIONAL(PIDGEOTTO), HOENN_TO_NATIONAL(PIDGEOT), HOENN_TO_NATIONAL(RATTATA), HOENN_TO_NATIONAL(RATICATE), HOENN_TO_NATIONAL(SPEAROW), HOENN_TO_NATIONAL(FEAROW), HOENN_TO_NATIONAL(EKANS), HOENN_TO_NATIONAL(ARBOK), HOENN_TO_NATIONAL(NIDORAN_F), HOENN_TO_NATIONAL(NIDORINA), HOENN_TO_NATIONAL(NIDOQUEEN), HOENN_TO_NATIONAL(NIDORAN_M), HOENN_TO_NATIONAL(NIDORINO), HOENN_TO_NATIONAL(NIDOKING), HOENN_TO_NATIONAL(CLEFAIRY), HOENN_TO_NATIONAL(CLEFABLE), HOENN_TO_NATIONAL(PARAS), HOENN_TO_NATIONAL(PARASECT), HOENN_TO_NATIONAL(VENONAT), HOENN_TO_NATIONAL(VENOMOTH), HOENN_TO_NATIONAL(DIGLETT), HOENN_TO_NATIONAL(DUGTRIO), HOENN_TO_NATIONAL(MEOWTH), HOENN_TO_NATIONAL(PERSIAN), HOENN_TO_NATIONAL(MANKEY), HOENN_TO_NATIONAL(PRIMEAPE), HOENN_TO_NATIONAL(GROWLITHE), HOENN_TO_NATIONAL(ARCANINE), HOENN_TO_NATIONAL(POLIWAG), HOENN_TO_NATIONAL(POLIWHIRL), HOENN_TO_NATIONAL(POLIWRATH), HOENN_TO_NATIONAL(BELLSPROUT), HOENN_TO_NATIONAL(WEEPINBELL), HOENN_TO_NATIONAL(VICTREEBEL), HOENN_TO_NATIONAL(PONYTA), HOENN_TO_NATIONAL(RAPIDASH), HOENN_TO_NATIONAL(SLOWPOKE), HOENN_TO_NATIONAL(SLOWBRO), HOENN_TO_NATIONAL(FARFETCHD), HOENN_TO_NATIONAL(SEEL), HOENN_TO_NATIONAL(DEWGONG), HOENN_TO_NATIONAL(SHELLDER), HOENN_TO_NATIONAL(CLOYSTER), HOENN_TO_NATIONAL(GASTLY), HOENN_TO_NATIONAL(HAUNTER), HOENN_TO_NATIONAL(GENGAR), HOENN_TO_NATIONAL(ONIX), HOENN_TO_NATIONAL(DROWZEE), HOENN_TO_NATIONAL(HYPNO), HOENN_TO_NATIONAL(KRABBY), HOENN_TO_NATIONAL(KINGLER), HOENN_TO_NATIONAL(EXEGGCUTE), HOENN_TO_NATIONAL(EXEGGUTOR), HOENN_TO_NATIONAL(CUBONE), HOENN_TO_NATIONAL(MAROWAK), HOENN_TO_NATIONAL(HITMONLEE), HOENN_TO_NATIONAL(HITMONCHAN), HOENN_TO_NATIONAL(LICKITUNG), HOENN_TO_NATIONAL(CHANSEY), HOENN_TO_NATIONAL(TANGELA), HOENN_TO_NATIONAL(KANGASKHAN), HOENN_TO_NATIONAL(MR_MIME), HOENN_TO_NATIONAL(SCYTHER), HOENN_TO_NATIONAL(JYNX), HOENN_TO_NATIONAL(ELECTABUZZ), HOENN_TO_NATIONAL(MAGMAR), HOENN_TO_NATIONAL(TAUROS), HOENN_TO_NATIONAL(LAPRAS), HOENN_TO_NATIONAL(DITTO), HOENN_TO_NATIONAL(EEVEE), HOENN_TO_NATIONAL(VAPOREON), HOENN_TO_NATIONAL(JOLTEON), HOENN_TO_NATIONAL(FLAREON), HOENN_TO_NATIONAL(PORYGON), HOENN_TO_NATIONAL(OMANYTE), HOENN_TO_NATIONAL(OMASTAR), HOENN_TO_NATIONAL(KABUTO), HOENN_TO_NATIONAL(KABUTOPS), HOENN_TO_NATIONAL(AERODACTYL), HOENN_TO_NATIONAL(SNORLAX), HOENN_TO_NATIONAL(ARTICUNO), HOENN_TO_NATIONAL(ZAPDOS), HOENN_TO_NATIONAL(MOLTRES), HOENN_TO_NATIONAL(DRATINI), HOENN_TO_NATIONAL(DRAGONAIR), HOENN_TO_NATIONAL(DRAGONITE), HOENN_TO_NATIONAL(MEWTWO), HOENN_TO_NATIONAL(MEW), HOENN_TO_NATIONAL(CHIKORITA), HOENN_TO_NATIONAL(BAYLEEF), HOENN_TO_NATIONAL(MEGANIUM), HOENN_TO_NATIONAL(CYNDAQUIL), HOENN_TO_NATIONAL(QUILAVA), HOENN_TO_NATIONAL(TYPHLOSION), HOENN_TO_NATIONAL(TOTODILE), HOENN_TO_NATIONAL(CROCONAW), HOENN_TO_NATIONAL(FERALIGATR), HOENN_TO_NATIONAL(SENTRET), HOENN_TO_NATIONAL(FURRET), HOENN_TO_NATIONAL(HOOTHOOT), HOENN_TO_NATIONAL(NOCTOWL), HOENN_TO_NATIONAL(LEDYBA), HOENN_TO_NATIONAL(LEDIAN), HOENN_TO_NATIONAL(SPINARAK), HOENN_TO_NATIONAL(ARIADOS), HOENN_TO_NATIONAL(CLEFFA), HOENN_TO_NATIONAL(TOGEPI), HOENN_TO_NATIONAL(TOGETIC), HOENN_TO_NATIONAL(MAREEP), HOENN_TO_NATIONAL(FLAAFFY), HOENN_TO_NATIONAL(AMPHAROS), HOENN_TO_NATIONAL(SUDOWOODO), HOENN_TO_NATIONAL(POLITOED), HOENN_TO_NATIONAL(HOPPIP), HOENN_TO_NATIONAL(SKIPLOOM), HOENN_TO_NATIONAL(JUMPLUFF), HOENN_TO_NATIONAL(AIPOM), HOENN_TO_NATIONAL(SUNKERN), HOENN_TO_NATIONAL(SUNFLORA), HOENN_TO_NATIONAL(YANMA), HOENN_TO_NATIONAL(WOOPER), HOENN_TO_NATIONAL(QUAGSIRE), HOENN_TO_NATIONAL(ESPEON), HOENN_TO_NATIONAL(UMBREON), HOENN_TO_NATIONAL(MURKROW), HOENN_TO_NATIONAL(SLOWKING), HOENN_TO_NATIONAL(MISDREAVUS), HOENN_TO_NATIONAL(UNOWN), HOENN_TO_NATIONAL(PINECO), HOENN_TO_NATIONAL(FORRETRESS), HOENN_TO_NATIONAL(DUNSPARCE), HOENN_TO_NATIONAL(GLIGAR), HOENN_TO_NATIONAL(STEELIX), HOENN_TO_NATIONAL(SNUBBULL), HOENN_TO_NATIONAL(GRANBULL), HOENN_TO_NATIONAL(QWILFISH), HOENN_TO_NATIONAL(SCIZOR), HOENN_TO_NATIONAL(SHUCKLE), HOENN_TO_NATIONAL(SNEASEL), HOENN_TO_NATIONAL(TEDDIURSA), HOENN_TO_NATIONAL(URSARING), HOENN_TO_NATIONAL(SWINUB), HOENN_TO_NATIONAL(PILOSWINE), HOENN_TO_NATIONAL(REMORAID), HOENN_TO_NATIONAL(OCTILLERY), HOENN_TO_NATIONAL(DELIBIRD), HOENN_TO_NATIONAL(MANTINE), HOENN_TO_NATIONAL(HOUNDOUR), HOENN_TO_NATIONAL(HOUNDOOM), HOENN_TO_NATIONAL(PORYGON2), HOENN_TO_NATIONAL(STANTLER), HOENN_TO_NATIONAL(SMEARGLE), HOENN_TO_NATIONAL(TYROGUE), HOENN_TO_NATIONAL(HITMONTOP), HOENN_TO_NATIONAL(SMOOCHUM), HOENN_TO_NATIONAL(ELEKID), HOENN_TO_NATIONAL(MAGBY), HOENN_TO_NATIONAL(MILTANK), HOENN_TO_NATIONAL(BLISSEY), HOENN_TO_NATIONAL(RAIKOU), HOENN_TO_NATIONAL(ENTEI), HOENN_TO_NATIONAL(SUICUNE), HOENN_TO_NATIONAL(LARVITAR), HOENN_TO_NATIONAL(PUPITAR), HOENN_TO_NATIONAL(TYRANITAR), HOENN_TO_NATIONAL(LUGIA), HOENN_TO_NATIONAL(HO_OH), HOENN_TO_NATIONAL(CELEBI), HOENN_TO_NATIONAL(OLD_UNOWN_B), HOENN_TO_NATIONAL(OLD_UNOWN_C), HOENN_TO_NATIONAL(OLD_UNOWN_D), HOENN_TO_NATIONAL(OLD_UNOWN_E), HOENN_TO_NATIONAL(OLD_UNOWN_F), HOENN_TO_NATIONAL(OLD_UNOWN_G), HOENN_TO_NATIONAL(OLD_UNOWN_H), HOENN_TO_NATIONAL(OLD_UNOWN_I), HOENN_TO_NATIONAL(OLD_UNOWN_J), HOENN_TO_NATIONAL(OLD_UNOWN_K), HOENN_TO_NATIONAL(OLD_UNOWN_L), HOENN_TO_NATIONAL(OLD_UNOWN_M), HOENN_TO_NATIONAL(OLD_UNOWN_N), HOENN_TO_NATIONAL(OLD_UNOWN_O), HOENN_TO_NATIONAL(OLD_UNOWN_P), HOENN_TO_NATIONAL(OLD_UNOWN_Q), HOENN_TO_NATIONAL(OLD_UNOWN_R), HOENN_TO_NATIONAL(OLD_UNOWN_S), HOENN_TO_NATIONAL(OLD_UNOWN_T), HOENN_TO_NATIONAL(OLD_UNOWN_U), HOENN_TO_NATIONAL(OLD_UNOWN_V), HOENN_TO_NATIONAL(OLD_UNOWN_W), HOENN_TO_NATIONAL(OLD_UNOWN_X), HOENN_TO_NATIONAL(OLD_UNOWN_Y), HOENN_TO_NATIONAL(OLD_UNOWN_Z), }; static const u16 sExtendedToNationalOrder[] = // Assigns Extended Dex Pokémon (Using National Dex Index) { EXTENDED_TO_NATIONAL(TREECKO), EXTENDED_TO_NATIONAL(GROVYLE), EXTENDED_TO_NATIONAL(SCEPTILE), EXTENDED_TO_NATIONAL(TORCHIC), EXTENDED_TO_NATIONAL(COMBUSKEN), EXTENDED_TO_NATIONAL(BLAZIKEN), EXTENDED_TO_NATIONAL(MUDKIP), EXTENDED_TO_NATIONAL(MARSHTOMP), EXTENDED_TO_NATIONAL(SWAMPERT), EXTENDED_TO_NATIONAL(POOCHYENA), EXTENDED_TO_NATIONAL(MIGHTYENA), EXTENDED_TO_NATIONAL(ZIGZAGOON), EXTENDED_TO_NATIONAL(LINOONE), EXTENDED_TO_NATIONAL(WURMPLE), EXTENDED_TO_NATIONAL(SILCOON), EXTENDED_TO_NATIONAL(BEAUTIFLY), EXTENDED_TO_NATIONAL(CASCOON), EXTENDED_TO_NATIONAL(DUSTOX), EXTENDED_TO_NATIONAL(LOTAD), EXTENDED_TO_NATIONAL(LOMBRE), EXTENDED_TO_NATIONAL(LUDICOLO), EXTENDED_TO_NATIONAL(SEEDOT), EXTENDED_TO_NATIONAL(NUZLEAF), EXTENDED_TO_NATIONAL(SHIFTRY), EXTENDED_TO_NATIONAL(TAILLOW), EXTENDED_TO_NATIONAL(SWELLOW), EXTENDED_TO_NATIONAL(WINGULL), EXTENDED_TO_NATIONAL(PELIPPER), EXTENDED_TO_NATIONAL(RALTS), EXTENDED_TO_NATIONAL(KIRLIA), EXTENDED_TO_NATIONAL(GARDEVOIR), EXTENDED_TO_NATIONAL(SURSKIT), EXTENDED_TO_NATIONAL(MASQUERAIN), EXTENDED_TO_NATIONAL(SHROOMISH), EXTENDED_TO_NATIONAL(BRELOOM), EXTENDED_TO_NATIONAL(SLAKOTH), EXTENDED_TO_NATIONAL(VIGOROTH), EXTENDED_TO_NATIONAL(SLAKING), EXTENDED_TO_NATIONAL(ABRA), EXTENDED_TO_NATIONAL(KADABRA), EXTENDED_TO_NATIONAL(ALAKAZAM), EXTENDED_TO_NATIONAL(NINCADA), EXTENDED_TO_NATIONAL(NINJASK), EXTENDED_TO_NATIONAL(SHEDINJA), EXTENDED_TO_NATIONAL(WHISMUR), EXTENDED_TO_NATIONAL(LOUDRED), EXTENDED_TO_NATIONAL(EXPLOUD), EXTENDED_TO_NATIONAL(MAKUHITA), EXTENDED_TO_NATIONAL(HARIYAMA), EXTENDED_TO_NATIONAL(GOLDEEN), EXTENDED_TO_NATIONAL(SEAKING), EXTENDED_TO_NATIONAL(MAGIKARP), EXTENDED_TO_NATIONAL(GYARADOS), EXTENDED_TO_NATIONAL(AZURILL), EXTENDED_TO_NATIONAL(MARILL), EXTENDED_TO_NATIONAL(AZUMARILL), EXTENDED_TO_NATIONAL(GEODUDE), EXTENDED_TO_NATIONAL(GRAVELER), EXTENDED_TO_NATIONAL(GOLEM), EXTENDED_TO_NATIONAL(NOSEPASS), EXTENDED_TO_NATIONAL(SKITTY), EXTENDED_TO_NATIONAL(DELCATTY), EXTENDED_TO_NATIONAL(ZUBAT), EXTENDED_TO_NATIONAL(GOLBAT), EXTENDED_TO_NATIONAL(CROBAT), EXTENDED_TO_NATIONAL(TENTACOOL), EXTENDED_TO_NATIONAL(TENTACRUEL), EXTENDED_TO_NATIONAL(SABLEYE), EXTENDED_TO_NATIONAL(MAWILE), EXTENDED_TO_NATIONAL(ARON), EXTENDED_TO_NATIONAL(LAIRON), EXTENDED_TO_NATIONAL(AGGRON), EXTENDED_TO_NATIONAL(MACHOP), EXTENDED_TO_NATIONAL(MACHOKE), EXTENDED_TO_NATIONAL(MACHAMP), EXTENDED_TO_NATIONAL(MEDITITE), EXTENDED_TO_NATIONAL(MEDICHAM), EXTENDED_TO_NATIONAL(ELECTRIKE), EXTENDED_TO_NATIONAL(MANECTRIC), EXTENDED_TO_NATIONAL(PLUSLE), EXTENDED_TO_NATIONAL(MINUN), EXTENDED_TO_NATIONAL(MAGNEMITE), EXTENDED_TO_NATIONAL(MAGNETON), EXTENDED_TO_NATIONAL(VOLTORB), EXTENDED_TO_NATIONAL(ELECTRODE), EXTENDED_TO_NATIONAL(VOLBEAT), EXTENDED_TO_NATIONAL(ILLUMISE), EXTENDED_TO_NATIONAL(ODDISH), EXTENDED_TO_NATIONAL(GLOOM), EXTENDED_TO_NATIONAL(VILEPLUME), EXTENDED_TO_NATIONAL(BELLOSSOM), EXTENDED_TO_NATIONAL(DODUO), EXTENDED_TO_NATIONAL(DODRIO), EXTENDED_TO_NATIONAL(ROSELIA), EXTENDED_TO_NATIONAL(GULPIN), EXTENDED_TO_NATIONAL(SWALOT), EXTENDED_TO_NATIONAL(CARVANHA), EXTENDED_TO_NATIONAL(SHARPEDO), EXTENDED_TO_NATIONAL(WAILMER), EXTENDED_TO_NATIONAL(WAILORD), EXTENDED_TO_NATIONAL(NUMEL), EXTENDED_TO_NATIONAL(CAMERUPT), EXTENDED_TO_NATIONAL(SLUGMA), EXTENDED_TO_NATIONAL(MAGCARGO), EXTENDED_TO_NATIONAL(TORKOAL), EXTENDED_TO_NATIONAL(GRIMER), EXTENDED_TO_NATIONAL(MUK), EXTENDED_TO_NATIONAL(KOFFING), EXTENDED_TO_NATIONAL(WEEZING), EXTENDED_TO_NATIONAL(SPOINK), EXTENDED_TO_NATIONAL(GRUMPIG), EXTENDED_TO_NATIONAL(SANDSHREW), EXTENDED_TO_NATIONAL(SANDSLASH), EXTENDED_TO_NATIONAL(SPINDA), EXTENDED_TO_NATIONAL(SKARMORY), EXTENDED_TO_NATIONAL(TRAPINCH), EXTENDED_TO_NATIONAL(VIBRAVA), EXTENDED_TO_NATIONAL(FLYGON), EXTENDED_TO_NATIONAL(CACNEA), EXTENDED_TO_NATIONAL(CACTURNE), EXTENDED_TO_NATIONAL(SWABLU), EXTENDED_TO_NATIONAL(ALTARIA), EXTENDED_TO_NATIONAL(ZANGOOSE), EXTENDED_TO_NATIONAL(SEVIPER), EXTENDED_TO_NATIONAL(LUNATONE), EXTENDED_TO_NATIONAL(SOLROCK), EXTENDED_TO_NATIONAL(BARBOACH), EXTENDED_TO_NATIONAL(WHISCASH), EXTENDED_TO_NATIONAL(CORPHISH), EXTENDED_TO_NATIONAL(CRAWDAUNT), EXTENDED_TO_NATIONAL(BALTOY), EXTENDED_TO_NATIONAL(CLAYDOL), EXTENDED_TO_NATIONAL(LILEEP), EXTENDED_TO_NATIONAL(CRADILY), EXTENDED_TO_NATIONAL(ANORITH), EXTENDED_TO_NATIONAL(ARMALDO), EXTENDED_TO_NATIONAL(IGGLYBUFF), EXTENDED_TO_NATIONAL(JIGGLYPUFF), EXTENDED_TO_NATIONAL(WIGGLYTUFF), EXTENDED_TO_NATIONAL(FEEBAS), EXTENDED_TO_NATIONAL(MILOTIC), EXTENDED_TO_NATIONAL(CASTFORM), EXTENDED_TO_NATIONAL(STARYU), EXTENDED_TO_NATIONAL(STARMIE), EXTENDED_TO_NATIONAL(KECLEON), EXTENDED_TO_NATIONAL(SHUPPET), EXTENDED_TO_NATIONAL(BANETTE), EXTENDED_TO_NATIONAL(DUSKULL), EXTENDED_TO_NATIONAL(DUSCLOPS), EXTENDED_TO_NATIONAL(TROPIUS), EXTENDED_TO_NATIONAL(CHIMECHO), EXTENDED_TO_NATIONAL(ABSOL), EXTENDED_TO_NATIONAL(VULPIX), EXTENDED_TO_NATIONAL(NINETALES), EXTENDED_TO_NATIONAL(PICHU), EXTENDED_TO_NATIONAL(PIKACHU), EXTENDED_TO_NATIONAL(RAICHU), EXTENDED_TO_NATIONAL(PSYDUCK), EXTENDED_TO_NATIONAL(GOLDUCK), EXTENDED_TO_NATIONAL(WYNAUT), EXTENDED_TO_NATIONAL(WOBBUFFET), EXTENDED_TO_NATIONAL(NATU), EXTENDED_TO_NATIONAL(XATU), EXTENDED_TO_NATIONAL(GIRAFARIG), EXTENDED_TO_NATIONAL(PHANPY), EXTENDED_TO_NATIONAL(DONPHAN), EXTENDED_TO_NATIONAL(PINSIR), EXTENDED_TO_NATIONAL(HERACROSS), EXTENDED_TO_NATIONAL(RHYHORN), EXTENDED_TO_NATIONAL(RHYDON), EXTENDED_TO_NATIONAL(SNORUNT), EXTENDED_TO_NATIONAL(GLALIE), EXTENDED_TO_NATIONAL(SPHEAL), EXTENDED_TO_NATIONAL(SEALEO), EXTENDED_TO_NATIONAL(WALREIN), EXTENDED_TO_NATIONAL(CLAMPERL), EXTENDED_TO_NATIONAL(HUNTAIL), EXTENDED_TO_NATIONAL(GOREBYSS), EXTENDED_TO_NATIONAL(RELICANTH), EXTENDED_TO_NATIONAL(CORSOLA), EXTENDED_TO_NATIONAL(CHINCHOU), EXTENDED_TO_NATIONAL(LANTURN), EXTENDED_TO_NATIONAL(LUVDISC), EXTENDED_TO_NATIONAL(HORSEA), EXTENDED_TO_NATIONAL(SEADRA), EXTENDED_TO_NATIONAL(KINGDRA), EXTENDED_TO_NATIONAL(BAGON), EXTENDED_TO_NATIONAL(SHELGON), EXTENDED_TO_NATIONAL(SALAMENCE), EXTENDED_TO_NATIONAL(BELDUM), EXTENDED_TO_NATIONAL(METANG), EXTENDED_TO_NATIONAL(METAGROSS), EXTENDED_TO_NATIONAL(REGIROCK), EXTENDED_TO_NATIONAL(REGICE), EXTENDED_TO_NATIONAL(REGISTEEL), EXTENDED_TO_NATIONAL(LATIAS), EXTENDED_TO_NATIONAL(LATIOS), EXTENDED_TO_NATIONAL(KYOGRE), EXTENDED_TO_NATIONAL(GROUDON), EXTENDED_TO_NATIONAL(RAYQUAZA), EXTENDED_TO_NATIONAL(JIRACHI), EXTENDED_TO_NATIONAL(DEOXYS), EXTENDED_TO_NATIONAL(BULBASAUR), // Pokémon from here onwards are UNSEEN in the HoennDex. EXTENDED_TO_NATIONAL(IVYSAUR), EXTENDED_TO_NATIONAL(VENUSAUR), EXTENDED_TO_NATIONAL(CHARMANDER), EXTENDED_TO_NATIONAL(CHARMELEON), EXTENDED_TO_NATIONAL(CHARIZARD), EXTENDED_TO_NATIONAL(SQUIRTLE), EXTENDED_TO_NATIONAL(WARTORTLE), EXTENDED_TO_NATIONAL(BLASTOISE), EXTENDED_TO_NATIONAL(CATERPIE), EXTENDED_TO_NATIONAL(METAPOD), EXTENDED_TO_NATIONAL(BUTTERFREE), EXTENDED_TO_NATIONAL(WEEDLE), EXTENDED_TO_NATIONAL(KAKUNA), EXTENDED_TO_NATIONAL(BEEDRILL), EXTENDED_TO_NATIONAL(PIDGEY), EXTENDED_TO_NATIONAL(PIDGEOTTO), EXTENDED_TO_NATIONAL(PIDGEOT), EXTENDED_TO_NATIONAL(RATTATA), EXTENDED_TO_NATIONAL(RATICATE), EXTENDED_TO_NATIONAL(SPEAROW), EXTENDED_TO_NATIONAL(FEAROW), EXTENDED_TO_NATIONAL(EKANS), EXTENDED_TO_NATIONAL(ARBOK), EXTENDED_TO_NATIONAL(NIDORAN_F), EXTENDED_TO_NATIONAL(NIDORINA), EXTENDED_TO_NATIONAL(NIDOQUEEN), EXTENDED_TO_NATIONAL(NIDORAN_M), EXTENDED_TO_NATIONAL(NIDORINO), EXTENDED_TO_NATIONAL(NIDOKING), EXTENDED_TO_NATIONAL(CLEFAIRY), EXTENDED_TO_NATIONAL(CLEFABLE), EXTENDED_TO_NATIONAL(PARAS), EXTENDED_TO_NATIONAL(PARASECT), EXTENDED_TO_NATIONAL(VENONAT), EXTENDED_TO_NATIONAL(VENOMOTH), EXTENDED_TO_NATIONAL(DIGLETT), EXTENDED_TO_NATIONAL(DUGTRIO), EXTENDED_TO_NATIONAL(MEOWTH), EXTENDED_TO_NATIONAL(PERSIAN), EXTENDED_TO_NATIONAL(MANKEY), EXTENDED_TO_NATIONAL(PRIMEAPE), EXTENDED_TO_NATIONAL(GROWLITHE), EXTENDED_TO_NATIONAL(ARCANINE), EXTENDED_TO_NATIONAL(POLIWAG), EXTENDED_TO_NATIONAL(POLIWHIRL), EXTENDED_TO_NATIONAL(POLIWRATH), EXTENDED_TO_NATIONAL(BELLSPROUT), EXTENDED_TO_NATIONAL(WEEPINBELL), EXTENDED_TO_NATIONAL(VICTREEBEL), EXTENDED_TO_NATIONAL(PONYTA), EXTENDED_TO_NATIONAL(RAPIDASH), EXTENDED_TO_NATIONAL(SLOWPOKE), EXTENDED_TO_NATIONAL(SLOWBRO), EXTENDED_TO_NATIONAL(FARFETCHD), EXTENDED_TO_NATIONAL(SEEL), EXTENDED_TO_NATIONAL(DEWGONG), EXTENDED_TO_NATIONAL(SHELLDER), EXTENDED_TO_NATIONAL(CLOYSTER), EXTENDED_TO_NATIONAL(GASTLY), EXTENDED_TO_NATIONAL(HAUNTER), EXTENDED_TO_NATIONAL(GENGAR), EXTENDED_TO_NATIONAL(ONIX), EXTENDED_TO_NATIONAL(DROWZEE), EXTENDED_TO_NATIONAL(HYPNO), EXTENDED_TO_NATIONAL(KRABBY), EXTENDED_TO_NATIONAL(KINGLER), EXTENDED_TO_NATIONAL(EXEGGCUTE), EXTENDED_TO_NATIONAL(EXEGGUTOR), EXTENDED_TO_NATIONAL(CUBONE), EXTENDED_TO_NATIONAL(MAROWAK), EXTENDED_TO_NATIONAL(HITMONLEE), EXTENDED_TO_NATIONAL(HITMONCHAN), EXTENDED_TO_NATIONAL(LICKITUNG), EXTENDED_TO_NATIONAL(CHANSEY), EXTENDED_TO_NATIONAL(TANGELA), EXTENDED_TO_NATIONAL(KANGASKHAN), EXTENDED_TO_NATIONAL(MR_MIME), EXTENDED_TO_NATIONAL(SCYTHER), EXTENDED_TO_NATIONAL(JYNX), EXTENDED_TO_NATIONAL(ELECTABUZZ), EXTENDED_TO_NATIONAL(MAGMAR), EXTENDED_TO_NATIONAL(TAUROS), EXTENDED_TO_NATIONAL(LAPRAS), EXTENDED_TO_NATIONAL(DITTO), EXTENDED_TO_NATIONAL(EEVEE), EXTENDED_TO_NATIONAL(VAPOREON), EXTENDED_TO_NATIONAL(JOLTEON), EXTENDED_TO_NATIONAL(FLAREON), EXTENDED_TO_NATIONAL(PORYGON), EXTENDED_TO_NATIONAL(OMANYTE), EXTENDED_TO_NATIONAL(OMASTAR), EXTENDED_TO_NATIONAL(KABUTO), EXTENDED_TO_NATIONAL(KABUTOPS), EXTENDED_TO_NATIONAL(AERODACTYL), EXTENDED_TO_NATIONAL(SNORLAX), EXTENDED_TO_NATIONAL(ARTICUNO), EXTENDED_TO_NATIONAL(ZAPDOS), EXTENDED_TO_NATIONAL(MOLTRES), EXTENDED_TO_NATIONAL(DRATINI), EXTENDED_TO_NATIONAL(DRAGONAIR), EXTENDED_TO_NATIONAL(DRAGONITE), EXTENDED_TO_NATIONAL(MEWTWO), EXTENDED_TO_NATIONAL(MEW), EXTENDED_TO_NATIONAL(CHIKORITA), EXTENDED_TO_NATIONAL(BAYLEEF), EXTENDED_TO_NATIONAL(MEGANIUM), EXTENDED_TO_NATIONAL(CYNDAQUIL), EXTENDED_TO_NATIONAL(QUILAVA), EXTENDED_TO_NATIONAL(TYPHLOSION), EXTENDED_TO_NATIONAL(TOTODILE), EXTENDED_TO_NATIONAL(CROCONAW), EXTENDED_TO_NATIONAL(FERALIGATR), EXTENDED_TO_NATIONAL(SENTRET), EXTENDED_TO_NATIONAL(FURRET), EXTENDED_TO_NATIONAL(HOOTHOOT), EXTENDED_TO_NATIONAL(NOCTOWL), EXTENDED_TO_NATIONAL(LEDYBA), EXTENDED_TO_NATIONAL(LEDIAN), EXTENDED_TO_NATIONAL(SPINARAK), EXTENDED_TO_NATIONAL(ARIADOS), EXTENDED_TO_NATIONAL(CLEFFA), EXTENDED_TO_NATIONAL(TOGEPI), EXTENDED_TO_NATIONAL(TOGETIC), EXTENDED_TO_NATIONAL(MAREEP), EXTENDED_TO_NATIONAL(FLAAFFY), EXTENDED_TO_NATIONAL(AMPHAROS), EXTENDED_TO_NATIONAL(SUDOWOODO), EXTENDED_TO_NATIONAL(POLITOED), EXTENDED_TO_NATIONAL(HOPPIP), EXTENDED_TO_NATIONAL(SKIPLOOM), EXTENDED_TO_NATIONAL(JUMPLUFF), EXTENDED_TO_NATIONAL(AIPOM), EXTENDED_TO_NATIONAL(SUNKERN), EXTENDED_TO_NATIONAL(SUNFLORA), EXTENDED_TO_NATIONAL(YANMA), EXTENDED_TO_NATIONAL(WOOPER), EXTENDED_TO_NATIONAL(QUAGSIRE), EXTENDED_TO_NATIONAL(ESPEON), EXTENDED_TO_NATIONAL(UMBREON), EXTENDED_TO_NATIONAL(MURKROW), EXTENDED_TO_NATIONAL(SLOWKING), EXTENDED_TO_NATIONAL(MISDREAVUS), EXTENDED_TO_NATIONAL(UNOWN), EXTENDED_TO_NATIONAL(PINECO), EXTENDED_TO_NATIONAL(FORRETRESS), EXTENDED_TO_NATIONAL(DUNSPARCE), EXTENDED_TO_NATIONAL(GLIGAR), EXTENDED_TO_NATIONAL(STEELIX), EXTENDED_TO_NATIONAL(SNUBBULL), EXTENDED_TO_NATIONAL(GRANBULL), EXTENDED_TO_NATIONAL(QWILFISH), EXTENDED_TO_NATIONAL(SCIZOR), EXTENDED_TO_NATIONAL(SHUCKLE), EXTENDED_TO_NATIONAL(SNEASEL), EXTENDED_TO_NATIONAL(TEDDIURSA), EXTENDED_TO_NATIONAL(URSARING), EXTENDED_TO_NATIONAL(SWINUB), EXTENDED_TO_NATIONAL(PILOSWINE), EXTENDED_TO_NATIONAL(REMORAID), EXTENDED_TO_NATIONAL(OCTILLERY), EXTENDED_TO_NATIONAL(DELIBIRD), EXTENDED_TO_NATIONAL(MANTINE), EXTENDED_TO_NATIONAL(HOUNDOUR), EXTENDED_TO_NATIONAL(HOUNDOOM), EXTENDED_TO_NATIONAL(PORYGON2), EXTENDED_TO_NATIONAL(STANTLER), EXTENDED_TO_NATIONAL(SMEARGLE), EXTENDED_TO_NATIONAL(TYROGUE), EXTENDED_TO_NATIONAL(HITMONTOP), EXTENDED_TO_NATIONAL(SMOOCHUM), EXTENDED_TO_NATIONAL(ELEKID), EXTENDED_TO_NATIONAL(MAGBY), EXTENDED_TO_NATIONAL(MILTANK), EXTENDED_TO_NATIONAL(BLISSEY), EXTENDED_TO_NATIONAL(RAIKOU), EXTENDED_TO_NATIONAL(ENTEI), EXTENDED_TO_NATIONAL(SUICUNE), EXTENDED_TO_NATIONAL(LARVITAR), EXTENDED_TO_NATIONAL(PUPITAR), EXTENDED_TO_NATIONAL(TYRANITAR), EXTENDED_TO_NATIONAL(LUGIA), EXTENDED_TO_NATIONAL(HO_OH), EXTENDED_TO_NATIONAL(CELEBI), EXTENDED_TO_NATIONAL(OLD_UNOWN_B), EXTENDED_TO_NATIONAL(OLD_UNOWN_C), EXTENDED_TO_NATIONAL(OLD_UNOWN_D), EXTENDED_TO_NATIONAL(OLD_UNOWN_E), EXTENDED_TO_NATIONAL(OLD_UNOWN_F), EXTENDED_TO_NATIONAL(OLD_UNOWN_G), EXTENDED_TO_NATIONAL(OLD_UNOWN_H), EXTENDED_TO_NATIONAL(OLD_UNOWN_I), EXTENDED_TO_NATIONAL(OLD_UNOWN_J), EXTENDED_TO_NATIONAL(OLD_UNOWN_K), EXTENDED_TO_NATIONAL(OLD_UNOWN_L), EXTENDED_TO_NATIONAL(OLD_UNOWN_M), EXTENDED_TO_NATIONAL(OLD_UNOWN_N), EXTENDED_TO_NATIONAL(OLD_UNOWN_O), EXTENDED_TO_NATIONAL(OLD_UNOWN_P), EXTENDED_TO_NATIONAL(OLD_UNOWN_Q), EXTENDED_TO_NATIONAL(OLD_UNOWN_R), EXTENDED_TO_NATIONAL(OLD_UNOWN_S), EXTENDED_TO_NATIONAL(OLD_UNOWN_T), EXTENDED_TO_NATIONAL(OLD_UNOWN_U), EXTENDED_TO_NATIONAL(OLD_UNOWN_V), EXTENDED_TO_NATIONAL(OLD_UNOWN_W), EXTENDED_TO_NATIONAL(OLD_UNOWN_X), EXTENDED_TO_NATIONAL(OLD_UNOWN_Y), EXTENDED_TO_NATIONAL(OLD_UNOWN_Z), }; static const struct SpindaSpot sSpindaSpotGraphics[] = { {.x = 16, .y = 7, .image = INCBIN_U16("graphics/spinda_spots/spot_0.bin")}, {.x = 40, .y = 8, .image = INCBIN_U16("graphics/spinda_spots/spot_1.bin")}, {.x = 22, .y = 25, .image = INCBIN_U16("graphics/spinda_spots/spot_2.bin")}, {.x = 34, .y = 26, .image = INCBIN_U16("graphics/spinda_spots/spot_3.bin")} }; #include "data/pokemon/item_effects.h" const u16 gEvolutionLines[NUM_SPECIES][EVOS_PER_LINE] = { [SPECIES_BULBASAUR ... SPECIES_VENUSAUR] = {SPECIES_BULBASAUR, SPECIES_IVYSAUR, SPECIES_VENUSAUR}, [SPECIES_CHARMANDER ... SPECIES_CHARIZARD] = {SPECIES_CHARMANDER, SPECIES_CHARMELEON, SPECIES_CHARIZARD}, [SPECIES_SQUIRTLE ... SPECIES_BLASTOISE] = {SPECIES_SQUIRTLE, SPECIES_WARTORTLE, SPECIES_BLASTOISE}, [SPECIES_CATERPIE ... SPECIES_BUTTERFREE] = {SPECIES_CATERPIE, SPECIES_METAPOD, SPECIES_BUTTERFREE}, [SPECIES_WEEDLE ... SPECIES_BEEDRILL] = {SPECIES_WEEDLE, SPECIES_KAKUNA, SPECIES_BEEDRILL}, [SPECIES_PIDGEY ... SPECIES_PIDGEOT] = {SPECIES_PIDGEY, SPECIES_PIDGEOTTO, SPECIES_PIDGEOT}, [SPECIES_RATTATA ... SPECIES_RATICATE] = {SPECIES_RATTATA, SPECIES_RATICATE}, [SPECIES_SPEAROW ... SPECIES_FEAROW] = {SPECIES_SPEAROW, SPECIES_FEAROW}, [SPECIES_EKANS ... SPECIES_ARBOK] = {SPECIES_EKANS, SPECIES_ARBOK}, [SPECIES_PIKACHU ... SPECIES_RAICHU] = {SPECIES_PICHU, SPECIES_PIKACHU, SPECIES_RAICHU}, [SPECIES_PICHU] = {SPECIES_PICHU, SPECIES_PIKACHU, SPECIES_RAICHU}, [SPECIES_SANDSHREW ... SPECIES_SANDSLASH] = {SPECIES_SANDSHREW, SPECIES_SANDSLASH}, [SPECIES_NIDORAN_F ... SPECIES_NIDOQUEEN] = {SPECIES_NIDORAN_F, SPECIES_NIDORINA, SPECIES_NIDOQUEEN}, [SPECIES_NIDORAN_M ... SPECIES_NIDOKING] = {SPECIES_NIDORAN_M, SPECIES_NIDORINO, SPECIES_NIDOKING}, [SPECIES_CLEFAIRY ... SPECIES_CLEFABLE] = {SPECIES_CLEFFA, SPECIES_CLEFAIRY, SPECIES_CLEFABLE}, [SPECIES_CLEFFA] = {SPECIES_CLEFFA, SPECIES_CLEFAIRY, SPECIES_CLEFABLE}, [SPECIES_VULPIX ... SPECIES_NINETALES] = {SPECIES_VULPIX, SPECIES_NINETALES}, [SPECIES_JIGGLYPUFF ... SPECIES_WIGGLYTUFF] = {SPECIES_IGGLYBUFF, SPECIES_JIGGLYPUFF, SPECIES_WIGGLYTUFF}, [SPECIES_IGGLYBUFF] = {SPECIES_IGGLYBUFF, SPECIES_JIGGLYPUFF, SPECIES_WIGGLYTUFF}, [SPECIES_ZUBAT ... SPECIES_GOLBAT] = {SPECIES_ZUBAT, SPECIES_GOLBAT, SPECIES_CROBAT}, [SPECIES_CROBAT] = {SPECIES_ZUBAT, SPECIES_GOLBAT, SPECIES_CROBAT}, [SPECIES_ODDISH ... SPECIES_VILEPLUME] = {SPECIES_ODDISH, SPECIES_GLOOM, SPECIES_VILEPLUME, SPECIES_BELLOSSOM}, [SPECIES_BELLOSSOM] = {SPECIES_ODDISH, SPECIES_GLOOM, SPECIES_VILEPLUME, SPECIES_BELLOSSOM}, [SPECIES_PARAS ... SPECIES_PARASECT] = {SPECIES_PARAS, SPECIES_PARASECT}, [SPECIES_VENONAT ... SPECIES_VENOMOTH] = {SPECIES_VENONAT, SPECIES_VENOMOTH}, [SPECIES_DIGLETT ... SPECIES_DUGTRIO] = {SPECIES_DIGLETT, SPECIES_DUGTRIO}, [SPECIES_MEOWTH ... SPECIES_PERSIAN] = {SPECIES_MEOWTH, SPECIES_PERSIAN}, [SPECIES_PSYDUCK ... SPECIES_GOLDUCK] = {SPECIES_PSYDUCK, SPECIES_GOLDUCK}, [SPECIES_MANKEY ... SPECIES_PRIMEAPE] = {SPECIES_MANKEY, SPECIES_PRIMEAPE}, [SPECIES_GROWLITHE ... SPECIES_ARCANINE] = {SPECIES_GROWLITHE, SPECIES_ARCANINE}, [SPECIES_POLIWAG ... SPECIES_POLIWRATH] = {SPECIES_POLIWAG, SPECIES_POLIWHIRL, SPECIES_POLIWRATH, SPECIES_POLITOED}, [SPECIES_POLITOED] = {SPECIES_POLIWAG, SPECIES_POLIWHIRL, SPECIES_POLIWRATH, SPECIES_POLITOED}, [SPECIES_ABRA ... SPECIES_ALAKAZAM] = {SPECIES_ABRA, SPECIES_KADABRA, SPECIES_ALAKAZAM}, [SPECIES_MACHOP ... SPECIES_MACHAMP] = {SPECIES_MACHOP, SPECIES_MACHOKE, SPECIES_MACHAMP}, [SPECIES_BELLSPROUT ... SPECIES_VICTREEBEL] = {SPECIES_BELLSPROUT, SPECIES_WEEPINBELL, SPECIES_VICTREEBEL}, [SPECIES_TENTACOOL ... SPECIES_TENTACRUEL] = {SPECIES_TENTACOOL, SPECIES_TENTACRUEL}, [SPECIES_GEODUDE ... SPECIES_GOLEM] = {SPECIES_GEODUDE, SPECIES_GRAVELER, SPECIES_GOLEM}, [SPECIES_PONYTA ... SPECIES_RAPIDASH] = {SPECIES_PONYTA, SPECIES_RAPIDASH}, [SPECIES_SLOWPOKE ... SPECIES_SLOWBRO] = {SPECIES_SLOWPOKE, SPECIES_SLOWBRO, SPECIES_SLOWKING}, [SPECIES_SLOWKING] = {SPECIES_SLOWPOKE, SPECIES_SLOWBRO, SPECIES_SLOWKING}, [SPECIES_MAGNEMITE ... SPECIES_MAGNETON] = {SPECIES_MAGNEMITE, SPECIES_MAGNETON}, [SPECIES_FARFETCHD] = {SPECIES_FARFETCHD}, [SPECIES_DODUO ... SPECIES_DODRIO] = {SPECIES_DODUO, SPECIES_DODRIO}, [SPECIES_SEEL ... SPECIES_DEWGONG] = {SPECIES_SEEL, SPECIES_DEWGONG}, [SPECIES_GRIMER ... SPECIES_MUK] = {SPECIES_GRIMER, SPECIES_MUK}, [SPECIES_SHELLDER ... SPECIES_CLOYSTER] = {SPECIES_SHELLDER, SPECIES_CLOYSTER}, [SPECIES_GASTLY ... SPECIES_GENGAR] = {SPECIES_GASTLY, SPECIES_HAUNTER, SPECIES_GENGAR}, [SPECIES_ONIX] = {SPECIES_ONIX, SPECIES_STEELIX}, [SPECIES_STEELIX] = {SPECIES_ONIX, SPECIES_STEELIX}, [SPECIES_DROWZEE ... SPECIES_HYPNO] = {SPECIES_DROWZEE, SPECIES_HYPNO}, [SPECIES_KRABBY ... SPECIES_KINGLER] = {SPECIES_KRABBY, SPECIES_KINGLER}, [SPECIES_VOLTORB ... SPECIES_ELECTRODE] = {SPECIES_VOLTORB, SPECIES_ELECTRODE}, [SPECIES_EXEGGCUTE ... SPECIES_EXEGGUTOR] = {SPECIES_EXEGGCUTE, SPECIES_EXEGGUTOR}, [SPECIES_CUBONE ... SPECIES_MAROWAK] = {SPECIES_CUBONE, SPECIES_MAROWAK}, [SPECIES_LICKITUNG] = {SPECIES_LICKITUNG}, [SPECIES_KOFFING ... SPECIES_WEEZING] = {SPECIES_KOFFING, SPECIES_WEEZING}, [SPECIES_RHYHORN ... SPECIES_RHYDON] = {SPECIES_RHYHORN, SPECIES_RHYDON}, [SPECIES_CHANSEY] = {SPECIES_CHANSEY, SPECIES_BLISSEY}, [SPECIES_BLISSEY] = {SPECIES_CHANSEY, SPECIES_BLISSEY}, [SPECIES_TANGELA] = {SPECIES_TANGELA}, [SPECIES_KANGASKHAN] = {SPECIES_KANGASKHAN}, [SPECIES_HORSEA ... SPECIES_SEADRA] = {SPECIES_HORSEA, SPECIES_SEADRA, SPECIES_KINGDRA}, [SPECIES_KINGDRA] = {SPECIES_HORSEA, SPECIES_SEADRA, SPECIES_KINGDRA}, [SPECIES_GOLDEEN ... SPECIES_SEAKING] = {SPECIES_GOLDEEN, SPECIES_SEAKING}, [SPECIES_STARYU ... SPECIES_STARMIE] = {SPECIES_STARYU, SPECIES_STARMIE}, [SPECIES_MR_MIME] = {SPECIES_MR_MIME}, [SPECIES_SCYTHER] = {SPECIES_SCYTHER, SPECIES_SCIZOR}, [SPECIES_SCIZOR] = {SPECIES_SCYTHER, SPECIES_SCIZOR}, [SPECIES_PINSIR] = {SPECIES_PINSIR}, [SPECIES_TAUROS] = {SPECIES_TAUROS}, [SPECIES_MAGIKARP ... SPECIES_GYARADOS] = {SPECIES_MAGIKARP, SPECIES_GYARADOS}, [SPECIES_LAPRAS] = {SPECIES_LAPRAS}, [SPECIES_DITTO] = {SPECIES_DITTO}, [SPECIES_EEVEE ... SPECIES_FLAREON] = {SPECIES_EEVEE, SPECIES_JOLTEON, SPECIES_VAPOREON, SPECIES_FLAREON, SPECIES_ESPEON, SPECIES_UMBREON}, [SPECIES_ESPEON ... SPECIES_UMBREON] = {SPECIES_EEVEE, SPECIES_JOLTEON, SPECIES_VAPOREON, SPECIES_FLAREON, SPECIES_ESPEON, SPECIES_UMBREON}, [SPECIES_PORYGON] = {SPECIES_PORYGON, SPECIES_PORYGON2}, [SPECIES_PORYGON2] = {SPECIES_PORYGON, SPECIES_PORYGON2}, [SPECIES_OMANYTE ... SPECIES_OMASTAR] = {SPECIES_OMANYTE, SPECIES_OMASTAR}, [SPECIES_KABUTO ... SPECIES_KABUTOPS] = {SPECIES_KABUTO, SPECIES_KABUTOPS}, [SPECIES_AERODACTYL] = {SPECIES_AERODACTYL}, [SPECIES_SNORLAX] = {SPECIES_SNORLAX}, [SPECIES_ARTICUNO] = {SPECIES_ARTICUNO}, [SPECIES_ZAPDOS] = {SPECIES_ZAPDOS}, [SPECIES_MOLTRES] = {SPECIES_MOLTRES}, [SPECIES_DRATINI ... SPECIES_DRAGONITE] = {SPECIES_DRATINI, SPECIES_DRAGONAIR, SPECIES_DRAGONITE}, [SPECIES_MEWTWO] = {SPECIES_MEWTWO}, [SPECIES_MEW] = {SPECIES_MEW}, [SPECIES_CHIKORITA ... SPECIES_MEGANIUM] = {SPECIES_CHIKORITA, SPECIES_BAYLEEF, SPECIES_MEGANIUM}, [SPECIES_CYNDAQUIL ... SPECIES_TYPHLOSION] = {SPECIES_CYNDAQUIL, SPECIES_QUILAVA, SPECIES_TYPHLOSION}, [SPECIES_TOTODILE ... SPECIES_FERALIGATR] = {SPECIES_TOTODILE, SPECIES_CROCONAW, SPECIES_FERALIGATR}, [SPECIES_SENTRET ... SPECIES_FURRET] = {SPECIES_SENTRET, SPECIES_FURRET}, [SPECIES_HOOTHOOT ... SPECIES_NOCTOWL] = {SPECIES_HOOTHOOT, SPECIES_NOCTOWL}, [SPECIES_LEDYBA ... SPECIES_LEDIAN] = {SPECIES_LEDYBA, SPECIES_LEDIAN}, [SPECIES_SPINARAK ... SPECIES_ARIADOS] = {SPECIES_SPINARAK, SPECIES_ARIADOS}, [SPECIES_CHINCHOU ... SPECIES_LANTURN] = {SPECIES_CHINCHOU, SPECIES_LANTURN}, [SPECIES_TOGEPI ... SPECIES_TOGETIC] = {SPECIES_TOGEPI, SPECIES_TOGETIC}, [SPECIES_NATU ... SPECIES_XATU] = {SPECIES_NATU, SPECIES_XATU}, [SPECIES_MAREEP ... SPECIES_AMPHAROS] = {SPECIES_MAREEP, SPECIES_FLAAFFY, SPECIES_AMPHAROS}, [SPECIES_MARILL ... SPECIES_AZUMARILL] = {SPECIES_AZURILL, SPECIES_MARILL, SPECIES_AZUMARILL}, [SPECIES_AZURILL] = {SPECIES_AZURILL, SPECIES_MARILL, SPECIES_AZUMARILL}, [SPECIES_SUDOWOODO] = {SPECIES_SUDOWOODO}, [SPECIES_HOPPIP ... SPECIES_JUMPLUFF] = {SPECIES_HOPPIP, SPECIES_SKIPLOOM, SPECIES_JUMPLUFF}, [SPECIES_AIPOM] = {SPECIES_AIPOM}, [SPECIES_SUNKERN ... SPECIES_SUNFLORA] = {SPECIES_SUNKERN, SPECIES_SUNFLORA}, [SPECIES_YANMA] = {SPECIES_YANMA}, [SPECIES_WOOPER ... SPECIES_QUAGSIRE] = {SPECIES_WOOPER, SPECIES_QUAGSIRE}, [SPECIES_MURKROW] = {SPECIES_MURKROW}, [SPECIES_MISDREAVUS] = {SPECIES_MISDREAVUS}, [SPECIES_UNOWN] = {SPECIES_UNOWN}, [SPECIES_GIRAFARIG] = {SPECIES_GIRAFARIG}, [SPECIES_PINECO ... SPECIES_FORRETRESS] = {SPECIES_PINECO, SPECIES_FORRETRESS}, [SPECIES_DUNSPARCE] = {SPECIES_DUNSPARCE}, [SPECIES_GLIGAR] = {SPECIES_GLIGAR}, [SPECIES_SNUBBULL ... SPECIES_GRANBULL] = {SPECIES_SNUBBULL, SPECIES_GRANBULL}, [SPECIES_QWILFISH] = {SPECIES_QWILFISH}, [SPECIES_SHUCKLE] = {SPECIES_SHUCKLE}, [SPECIES_HERACROSS] = {SPECIES_HERACROSS}, [SPECIES_SNEASEL] = {SPECIES_SNEASEL}, [SPECIES_TEDDIURSA ... SPECIES_URSARING] = {SPECIES_TEDDIURSA, SPECIES_URSARING}, [SPECIES_SLUGMA ... SPECIES_MAGCARGO] = {SPECIES_SLUGMA, SPECIES_MAGCARGO}, [SPECIES_SWINUB ... SPECIES_PILOSWINE] = {SPECIES_SWINUB, SPECIES_PILOSWINE}, [SPECIES_CORSOLA] = {SPECIES_CORSOLA}, [SPECIES_REMORAID ... SPECIES_OCTILLERY] = {SPECIES_REMORAID, SPECIES_OCTILLERY}, [SPECIES_DELIBIRD] = {SPECIES_DELIBIRD}, [SPECIES_MANTINE] = {SPECIES_MANTINE}, [SPECIES_SKARMORY] = {SPECIES_SKARMORY}, [SPECIES_HOUNDOUR ... SPECIES_HOUNDOOM] = {SPECIES_HOUNDOUR, SPECIES_HOUNDOOM}, [SPECIES_PHANPY ... SPECIES_DONPHAN] = {SPECIES_PHANPY, SPECIES_DONPHAN}, [SPECIES_STANTLER] = {SPECIES_STANTLER}, [SPECIES_SMEARGLE] = {SPECIES_SMEARGLE}, [SPECIES_TYROGUE ... SPECIES_HITMONTOP] = {SPECIES_TYROGUE, SPECIES_HITMONCHAN, SPECIES_HITMONLEE, SPECIES_HITMONTOP}, [SPECIES_HITMONLEE ... SPECIES_HITMONCHAN] = {SPECIES_TYROGUE, SPECIES_HITMONCHAN, SPECIES_HITMONLEE, SPECIES_HITMONTOP}, [SPECIES_SMOOCHUM] = {SPECIES_SMOOCHUM, SPECIES_JYNX}, [SPECIES_JYNX] = {SPECIES_SMOOCHUM, SPECIES_JYNX}, [SPECIES_ELEKID] = {SPECIES_ELEKID, SPECIES_ELECTABUZZ}, [SPECIES_ELECTABUZZ] = {SPECIES_ELEKID, SPECIES_ELECTABUZZ}, [SPECIES_MAGBY] = {SPECIES_MAGBY, SPECIES_MAGMAR}, [SPECIES_MAGMAR] = {SPECIES_MAGBY, SPECIES_MAGMAR}, [SPECIES_MILTANK] = {SPECIES_MILTANK}, [SPECIES_RAIKOU] = {SPECIES_RAIKOU}, [SPECIES_ENTEI] = {SPECIES_ENTEI}, [SPECIES_SUICUNE] = {SPECIES_SUICUNE}, [SPECIES_LARVITAR ... SPECIES_TYRANITAR] = {SPECIES_LARVITAR, SPECIES_PUPITAR, SPECIES_TYRANITAR}, [SPECIES_LUGIA] = {SPECIES_LUGIA}, [SPECIES_HO_OH] = {SPECIES_HO_OH}, [SPECIES_CELEBI] = {SPECIES_CELEBI}, [SPECIES_TREECKO ... SPECIES_SCEPTILE] = {SPECIES_TREECKO, SPECIES_GROVYLE, SPECIES_SCEPTILE}, [SPECIES_TORCHIC ... SPECIES_BLAZIKEN] = {SPECIES_TORCHIC, SPECIES_COMBUSKEN, SPECIES_BLAZIKEN}, [SPECIES_MUDKIP ... SPECIES_SWAMPERT] = {SPECIES_MUDKIP, SPECIES_MARSHTOMP, SPECIES_SWAMPERT}, [SPECIES_POOCHYENA ... SPECIES_MIGHTYENA] = {SPECIES_POOCHYENA, SPECIES_MIGHTYENA}, [SPECIES_ZIGZAGOON ... SPECIES_LINOONE] = {SPECIES_ZIGZAGOON, SPECIES_LINOONE}, [SPECIES_WURMPLE ... SPECIES_DUSTOX] = {SPECIES_WURMPLE, SPECIES_SILCOON, SPECIES_BEAUTIFLY, SPECIES_CASCOON, SPECIES_DUSTOX}, [SPECIES_LOTAD ... SPECIES_LUDICOLO] = {SPECIES_LOTAD, SPECIES_LOMBRE, SPECIES_LUDICOLO}, [SPECIES_SEEDOT ... SPECIES_SHIFTRY] = {SPECIES_SEEDOT, SPECIES_NUZLEAF, SPECIES_SHIFTRY}, [SPECIES_NINCADA ... SPECIES_SHEDINJA] = {SPECIES_NINCADA, SPECIES_NINJASK, SPECIES_SHEDINJA}, [SPECIES_TAILLOW ... SPECIES_SWELLOW] = {SPECIES_TAILLOW, SPECIES_SWELLOW}, [SPECIES_SHROOMISH ... SPECIES_BRELOOM] = {SPECIES_SHROOMISH, SPECIES_BRELOOM}, [SPECIES_SPINDA] = {SPECIES_SPINDA}, [SPECIES_WINGULL ... SPECIES_PELIPPER] = {SPECIES_WINGULL, SPECIES_PELIPPER}, [SPECIES_SURSKIT ... SPECIES_MASQUERAIN] = {SPECIES_SURSKIT, SPECIES_MASQUERAIN}, [SPECIES_WAILMER ... SPECIES_WAILORD] = {SPECIES_WAILMER, SPECIES_WAILORD}, [SPECIES_SKITTY ... SPECIES_DELCATTY] = {SPECIES_SKITTY, SPECIES_DELCATTY}, [SPECIES_KECLEON] = {SPECIES_KECLEON}, [SPECIES_BALTOY ... SPECIES_CLAYDOL] = {SPECIES_BALTOY, SPECIES_CLAYDOL}, [SPECIES_NOSEPASS] = {SPECIES_NOSEPASS}, [SPECIES_TORKOAL] = {SPECIES_TORKOAL}, [SPECIES_SABLEYE] = {SPECIES_SABLEYE}, [SPECIES_BARBOACH ... SPECIES_WHISCASH] = {SPECIES_BARBOACH, SPECIES_WHISCASH}, [SPECIES_LUVDISC] = {SPECIES_LUVDISC}, [SPECIES_CORPHISH ... SPECIES_CRAWDAUNT] = {SPECIES_CORPHISH, SPECIES_CRAWDAUNT}, [SPECIES_FEEBAS ... SPECIES_MILOTIC] = {SPECIES_FEEBAS, SPECIES_MILOTIC}, [SPECIES_CARVANHA ... SPECIES_SHARPEDO] = {SPECIES_CARVANHA, SPECIES_SHARPEDO}, [SPECIES_TRAPINCH ... SPECIES_FLYGON] = {SPECIES_TRAPINCH, SPECIES_VIBRAVA, SPECIES_FLYGON}, [SPECIES_MAKUHITA ... SPECIES_HARIYAMA] = {SPECIES_MAKUHITA, SPECIES_HARIYAMA}, [SPECIES_ELECTRIKE ... SPECIES_MANECTRIC] = {SPECIES_ELECTRIKE, SPECIES_MANECTRIC}, [SPECIES_NUMEL ... SPECIES_CAMERUPT] = {SPECIES_NUMEL, SPECIES_CAMERUPT}, [SPECIES_SPHEAL ... SPECIES_WALREIN] = {SPECIES_SPHEAL, SPECIES_SEALEO, SPECIES_WALREIN}, [SPECIES_CACNEA ... SPECIES_CACTURNE] = {SPECIES_CACNEA, SPECIES_CACTURNE}, [SPECIES_SNORUNT ... SPECIES_GLALIE] = {SPECIES_SNORUNT, SPECIES_GLALIE}, [SPECIES_LUNATONE] = {SPECIES_LUNATONE}, [SPECIES_SOLROCK] = {SPECIES_SOLROCK}, [SPECIES_SPOINK ... SPECIES_GRUMPIG] = {SPECIES_SPOINK, SPECIES_GRUMPIG}, [SPECIES_PLUSLE] = {SPECIES_PLUSLE}, [SPECIES_MINUN] = {SPECIES_MINUN}, [SPECIES_MAWILE] = {SPECIES_MAWILE}, [SPECIES_MEDITITE ... SPECIES_MEDICHAM] = {SPECIES_MEDITITE, SPECIES_MEDICHAM}, [SPECIES_SWABLU ... SPECIES_ALTARIA] = {SPECIES_SWABLU, SPECIES_ALTARIA}, [SPECIES_WYNAUT] = {SPECIES_WYNAUT, SPECIES_WOBBUFFET}, [SPECIES_WOBBUFFET] = {SPECIES_WYNAUT, SPECIES_WOBBUFFET}, [SPECIES_DUSKULL ... SPECIES_DUSCLOPS] = {SPECIES_DUSKULL, SPECIES_DUSCLOPS}, [SPECIES_ROSELIA] = {SPECIES_ROSELIA}, [SPECIES_SLAKOTH ... SPECIES_SLAKING] = {SPECIES_SLAKOTH, SPECIES_VIGOROTH, SPECIES_SLAKING}, [SPECIES_GULPIN ... SPECIES_SWALOT] = {SPECIES_GULPIN, SPECIES_SWALOT}, [SPECIES_TROPIUS] = {SPECIES_TROPIUS}, [SPECIES_WHISMUR ... SPECIES_EXPLOUD] = {SPECIES_WHISMUR, SPECIES_LOUDRED, SPECIES_EXPLOUD}, [SPECIES_CLAMPERL ... SPECIES_GOREBYSS] = {SPECIES_CLAMPERL, SPECIES_HUNTAIL, SPECIES_GOREBYSS}, [SPECIES_ABSOL] = {SPECIES_ABSOL}, [SPECIES_SHUPPET ... SPECIES_BANETTE] = {SPECIES_SHUPPET, SPECIES_BANETTE}, [SPECIES_SEVIPER] = {SPECIES_SEVIPER}, [SPECIES_ZANGOOSE] = {SPECIES_ZANGOOSE}, [SPECIES_RELICANTH] = {SPECIES_RELICANTH}, [SPECIES_ARON ... SPECIES_AGGRON] = {SPECIES_ARON, SPECIES_LAIRON, SPECIES_AGGRON}, [SPECIES_CASTFORM] = {SPECIES_CASTFORM}, [SPECIES_VOLBEAT] = {SPECIES_VOLBEAT}, [SPECIES_ILLUMISE] = {SPECIES_ILLUMISE}, [SPECIES_LILEEP ... SPECIES_CRADILY] = {SPECIES_LILEEP, SPECIES_CRADILY}, [SPECIES_ANORITH ... SPECIES_ARMALDO] = {SPECIES_ANORITH, SPECIES_ARMALDO}, [SPECIES_RALTS ... SPECIES_GARDEVOIR] = {SPECIES_RALTS, SPECIES_KIRLIA, SPECIES_GARDEVOIR}, [SPECIES_BAGON ... SPECIES_SALAMENCE] = {SPECIES_BAGON, SPECIES_SHELGON, SPECIES_SALAMENCE}, [SPECIES_BELDUM ... SPECIES_METAGROSS] = {SPECIES_BELDUM, SPECIES_METANG, SPECIES_METAGROSS}, [SPECIES_REGIROCK] = {SPECIES_REGIROCK}, [SPECIES_REGICE] = {SPECIES_REGICE}, [SPECIES_REGISTEEL] = {SPECIES_REGISTEEL}, [SPECIES_KYOGRE] = {SPECIES_KYOGRE}, [SPECIES_GROUDON] = {SPECIES_GROUDON}, [SPECIES_RAYQUAZA] = {SPECIES_RAYQUAZA}, [SPECIES_LATIAS] = {SPECIES_LATIAS}, [SPECIES_LATIOS] = {SPECIES_LATIOS}, [SPECIES_JIRACHI] = {SPECIES_JIRACHI}, [SPECIES_DEOXYS] = {SPECIES_DEOXYS}, [SPECIES_CHIMECHO] = {SPECIES_CHIMECHO}, }; static const s8 sNatureStatTable[NUM_NATURES][NUM_NATURE_STATS] = { // Attack Defense Speed Sp.Atk Sp.Def [NATURE_HARDY] = { 0, 0, 0, 0, 0 }, [NATURE_LONELY] = { +1, -1, 0, 0, 0 }, [NATURE_BRAVE] = { +1, 0, -1, 0, 0 }, [NATURE_ADAMANT] = { +1, 0, 0, -1, 0 }, [NATURE_NAUGHTY] = { +1, 0, 0, 0, -1 }, [NATURE_BOLD] = { -1, +1, 0, 0, 0 }, [NATURE_DOCILE] = { 0, 0, 0, 0, 0 }, [NATURE_RELAXED] = { 0, +1, -1, 0, 0 }, [NATURE_IMPISH] = { 0, +1, 0, -1, 0 }, [NATURE_LAX] = { 0, +1, 0, 0, -1 }, [NATURE_TIMID] = { -1, 0, +1, 0, 0 }, [NATURE_HASTY] = { 0, -1, +1, 0, 0 }, [NATURE_SERIOUS] = { 0, 0, 0, 0, 0 }, [NATURE_JOLLY] = { 0, 0, +1, -1, 0 }, [NATURE_NAIVE] = { 0, 0, +1, 0, -1 }, [NATURE_MODEST] = { -1, 0, 0, +1, 0 }, [NATURE_MILD] = { 0, -1, 0, +1, 0 }, [NATURE_QUIET] = { 0, 0, -1, +1, 0 }, [NATURE_BASHFUL] = { 0, 0, 0, 0, 0 }, [NATURE_RASH] = { 0, 0, 0, +1, -1 }, [NATURE_CALM] = { -1, 0, 0, 0, +1 }, [NATURE_GENTLE] = { 0, -1, 0, 0, +1 }, [NATURE_SASSY] = { 0, 0, -1, 0, +1 }, [NATURE_CAREFUL] = { 0, 0, 0, -1, +1 }, [NATURE_QUIRKY] = { 0, 0, 0, 0, 0 }, }; #include "data/pokemon/tmhm_learnsets.h" #include "data/pokemon/trainer_class_lookups.h" #include "data/pokemon/cry_ids.h" #include "data/pokemon/experience_tables.h" #include "data/pokemon/species_info.h" #include "data/pokemon/level_up_learnsets.h" #include "data/pokemon/evolution.h" #include "data/pokemon/level_up_learnset_pointers.h" static const s8 sPokeblockFlavorCompatibilityTable[NUM_NATURES * FLAVOR_COUNT] = { // Cool, Beauty, Cute, Smart, Tough 0, 0, 0, 0, 0, // Hardy 1, 0, 0, 0, -1, // Lonely 1, 0, -1, 0, 0, // Brave 1, -1, 0, 0, 0, // Adamant 1, 0, 0, -1, 0, // Naughty -1, 0, 0, 0, 1, // Bold 0, 0, 0, 0, 0, // Docile 0, 0, -1, 0, 1, // Relaxed 0, -1, 0, 0, 1, // Impish 0, 0, 0, -1, 1, // Lax -1, 0, 1, 0, 0, // Timid 0, 0, 1, 0, -1, // Hasty 0, 0, 0, 0, 0, // Serious 0, -1, 1, 0, 0, // Jolly 0, 0, 1, -1, 0, // Naive -1, 1, 0, 0, 0, // Modest 0, 1, 0, 0, -1, // Mild 0, 1, -1, 0, 0, // Quiet 0, 0, 0, 0, 0, // Bashful 0, 1, 0, -1, 0, // Rash -1, 0, 0, 1, 0, // Calm 0, 0, 0, 1, -1, // Gentle 0, 0, -1, 1, 0, // Sassy 0, -1, 0, 1, 0, // Careful 0, 0, 0, 0, 0 // Quirky }; #define PP_UP_SHIFTS(val) val, (val) << 2, (val) << 4, (val) << 6 #define PP_UP_SHIFTS_INV(val) (u8)~(val), (u8)~((val) << 2), (u8)~((val) << 4), (u8)~((val) << 6) // PP Up bonuses are stored for a Pokémon as a single byte. // There are 2 bits (a value 0-3) for each move slot that // represent how many PP Ups have been applied. // The following arrays take a move slot id and return: // gPPUpGetMask - A mask to get the number of PP Ups applied to that move slot // gPPUpClearMask - A mask to clear the number of PP Ups applied to that move slot // gPPUpAddValues - A value to add to the PP Bonuses byte to apply 1 PP Up to that move slot const u8 gPPUpGetMask[MAX_MON_MOVES] = {PP_UP_SHIFTS(3)}; const u8 gPPUpClearMask[MAX_MON_MOVES] = {PP_UP_SHIFTS_INV(3)}; const u8 gPPUpAddValues[MAX_MON_MOVES] = {PP_UP_SHIFTS(1)}; const u8 gStatStageRatios[MAX_STAT_STAGE + 1][2] = { {10, 40}, // -6, MIN_STAT_STAGE {10, 35}, // -5 {10, 30}, // -4 {10, 25}, // -3 {10, 20}, // -2 {10, 15}, // -1 {10, 10}, // 0, DEFAULT_STAT_STAGE {15, 10}, // +1 {20, 10}, // +2 {25, 10}, // +3 {30, 10}, // +4 {35, 10}, // +5 {40, 10}, // +6, MAX_STAT_STAGE }; static const u8 sText_GameFreak[] = _("ゲーフリ"); static const u8 sHoldEffectToType[][2] = { {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL}, }; const struct SpriteTemplate gSpriteTemplates_Battlers[MAX_BATTLERS_COUNT] = { [B_POSITION_PLAYER_LEFT] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gBattlerPicTable_PlayerLeft, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, [B_POSITION_OPPONENT_LEFT] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerOpponent, .anims = NULL, .images = gBattlerPicTable_OpponentLeft, .affineAnims = gAffineAnims_BattleSpriteOpponentSide, .callback = SpriteCB_EnemyMon, }, [B_POSITION_PLAYER_RIGHT] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gBattlerPicTable_PlayerRight, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, [B_POSITION_OPPONENT_RIGHT] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerOpponent, .anims = NULL, .images = gBattlerPicTable_OpponentRight, .affineAnims = gAffineAnims_BattleSpriteOpponentSide, .callback = SpriteCB_EnemyMon, }, }; static const struct SpriteTemplate sTrainerBackSpriteTemplates[] = { [TRAINER_BACK_PIC_RED] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gTrainerBackPicTable_Red, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, [TRAINER_BACK_PIC_LEAF] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gTrainerBackPicTable_Leaf, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gTrainerBackPicTable_RSBrendan, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gTrainerBackPicTable_RSMay, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, [TRAINER_BACK_PIC_POKEDUDE] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gTrainerBackPicTable_Pokedude, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, [TRAINER_BACK_PIC_OLD_MAN] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gTrainerBackPicTable_OldMan, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, [TRAINER_BACK_PIC_EMERALD_BRENDAN] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gTrainerBackPicTable_EmBrendan, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, [TRAINER_BACK_PIC_EMERALD_MAY] = { .tileTag = TAG_NONE, .paletteTag = 0, .oam = &gOamData_BattlerPlayer, .anims = NULL, .images = gTrainerBackPicTable_EmMay, .affineAnims = gAffineAnims_BattleSpritePlayerSide, .callback = SpriteCB_AllyMon, }, }; // Classes dummied out #define NUM_SECRET_BASE_CLASSES 5 static const u8 sSecretBaseFacilityClasses[GENDER_COUNT][NUM_SECRET_BASE_CLASSES] = { [MALE] = { FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_YOUNGSTER }, [FEMALE] = { FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_YOUNGSTER }, }; static const u8 sGetMonDataEVConstants[] = { MON_DATA_HP_EV, MON_DATA_ATK_EV, MON_DATA_DEF_EV, MON_DATA_SPEED_EV, MON_DATA_SPDEF_EV, MON_DATA_SPATK_EV }; // For stat-raising items static const u8 sStatsToRaise[] = { STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC }; // 3 modifiers each for how much to change friendship for different ranges // 0-99, 100-199, 200+ static const s8 sFriendshipEventDeltas[][3] = { [FRIENDSHIP_EVENT_GROW_LEVEL] = { 5, 3, 2 }, [FRIENDSHIP_EVENT_VITAMIN] = { 5, 3, 2 }, [FRIENDSHIP_EVENT_BATTLE_ITEM] = { 1, 1, 0 }, [FRIENDSHIP_EVENT_LEAGUE_BATTLE] = { 3, 2, 1 }, [FRIENDSHIP_EVENT_LEARN_TMHM] = { 1, 1, 0 }, [FRIENDSHIP_EVENT_WALKING] = { 1, 1, 1 }, [FRIENDSHIP_EVENT_MASSAGE] = { 3, 3, 3 }, [FRIENDSHIP_EVENT_FAINT_SMALL] = {-1, -1, -1 }, [FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE] = {-5, -5, -10 }, [FRIENDSHIP_EVENT_FAINT_LARGE] = {-5, -5, -10 }, }; #define HM_MOVES_END 0xFFFF static const u16 sHMMoves[] = { MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END }; static const u16 sDeoxysBaseStats[][6] = { { //Normal Forme [STAT_HP] = 50, [STAT_ATK] = 150, [STAT_DEF] = 50, [STAT_SPEED] = 150, [STAT_SPATK] = 150, [STAT_SPDEF] = 50 }, { //Attack Forme [STAT_HP] = 50, [STAT_ATK] = 180, [STAT_DEF] = 20, [STAT_SPEED] = 150, [STAT_SPATK] = 180, [STAT_SPDEF] = 20 }, { //Defense Forme [STAT_HP] = 50, [STAT_ATK] = 70, [STAT_DEF] = 160, [STAT_SPEED] = 90, [STAT_SPATK] = 70, [STAT_SPDEF] = 160 }, { //Speed Forme [STAT_HP] = 50, [STAT_ATK] = 95, [STAT_DEF] = 90, [STAT_SPEED] = 180, [STAT_SPATK] = 95, [STAT_SPDEF] = 90 } }; static const u16 sDeoxysLevelUpLearnsets[][15] = { { //Normal Forme LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_WRAP), LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(10, MOVE_TELEPORT), LEVEL_UP_MOVE(15, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(20, MOVE_PURSUIT), LEVEL_UP_MOVE(25, MOVE_PSYCHIC), LEVEL_UP_MOVE(30, MOVE_SNATCH), LEVEL_UP_MOVE(35, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(40, MOVE_RECOVER), LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST), LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM), LEVEL_UP_END }, { //Attack Forme LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_WRAP), LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(10, MOVE_TELEPORT), LEVEL_UP_MOVE(15, MOVE_TAUNT), LEVEL_UP_MOVE(20, MOVE_PURSUIT), LEVEL_UP_MOVE(25, MOVE_PSYCHIC), LEVEL_UP_MOVE(30, MOVE_SUPERPOWER), LEVEL_UP_MOVE(35, MOVE_COSMIC_POWER), LEVEL_UP_MOVE(40, MOVE_ZAP_CANNON), LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST), LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM), LEVEL_UP_END }, { //Defense Forme LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_WRAP), LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(10, MOVE_TELEPORT), LEVEL_UP_MOVE(15, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(20, MOVE_SPIKES), LEVEL_UP_MOVE(25, MOVE_PSYCHIC), LEVEL_UP_MOVE(30, MOVE_SNATCH), LEVEL_UP_MOVE(35, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(35, MOVE_AMNESIA), LEVEL_UP_MOVE(40, MOVE_RECOVER), LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST), LEVEL_UP_MOVE(50, MOVE_COUNTER), LEVEL_UP_MOVE(50, MOVE_MIRROR_COAT), LEVEL_UP_END }, { //Speed Forme LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_WRAP), LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE(10, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE(15, MOVE_KNOCK_OFF), LEVEL_UP_MOVE(20, MOVE_PURSUIT), LEVEL_UP_MOVE(25, MOVE_PSYCHIC), LEVEL_UP_MOVE(30, MOVE_SWIFT), LEVEL_UP_MOVE(35, MOVE_AGILITY), LEVEL_UP_MOVE(40, MOVE_RECOVER), LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST), LEVEL_UP_MOVE(50, MOVE_EXTREME_SPEED), LEVEL_UP_END } }; // The classes used by other players in the Union Room. // These should correspond with the overworld graphics in sUnionRoomObjGfxIds const u16 gUnionRoomFacilityClasses[NUM_UNION_ROOM_CLASSES * GENDER_COUNT] = { // Male FACILITY_CLASS_COOLTRAINER_M, FACILITY_CLASS_BLACK_BELT, FACILITY_CLASS_CAMPER, FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_PSYCHIC_M, FACILITY_CLASS_BUG_CATCHER, FACILITY_CLASS_TAMER, FACILITY_CLASS_JUGGLER, // Female FACILITY_CLASS_COOLTRAINER_F, FACILITY_CLASS_CHANNELER, FACILITY_CLASS_PICNICKER, FACILITY_CLASS_LASS, FACILITY_CLASS_PSYCHIC_F, FACILITY_CLASS_CRUSH_GIRL, FACILITY_CLASS_PKMN_BREEDER, FACILITY_CLASS_BEAUTY, }; static const struct OamData sOamData_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 0, .paletteNum = 0, }; static const struct SpriteTemplate sSpriteTemplate_64x64 = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &sOamData_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; void ZeroBoxMonData(struct BoxPokemon *boxMon) { u8 *raw = (u8 *)boxMon; u32 i; for (i = 0; i < sizeof(struct BoxPokemon); i++) raw[i] = 0; } void ZeroMonData(struct Pokemon *mon) { u32 arg; ZeroBoxMonData(&mon->box); arg = 0; SetMonData(mon, MON_DATA_STATUS, &arg); SetMonData(mon, MON_DATA_LEVEL, &arg); SetMonData(mon, MON_DATA_HP, &arg); SetMonData(mon, MON_DATA_MAX_HP, &arg); SetMonData(mon, MON_DATA_ATK, &arg); SetMonData(mon, MON_DATA_DEF, &arg); SetMonData(mon, MON_DATA_SPEED, &arg); SetMonData(mon, MON_DATA_SPATK, &arg); SetMonData(mon, MON_DATA_SPDEF, &arg); arg = MAIL_NONE; SetMonData(mon, MON_DATA_MAIL, &arg); } void ZeroPlayerPartyMons(void) { s32 i; for (i = 0; i < PARTY_SIZE; i++) ZeroMonData(&gPlayerParty[i]); } void ZeroEnemyPartyMons(void) { s32 i; for (i = 0; i < PARTY_SIZE; i++) ZeroMonData(&gEnemyParty[i]); } void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) { u32 arg; ZeroMonData(mon); CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); SetMonData(mon, MON_DATA_LEVEL, &level); arg = MAIL_NONE; SetMonData(mon, MON_DATA_MAIL, &arg); CalculateMonStats(mon, FALSE); } void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) { u8 speciesName[POKEMON_NAME_LENGTH + 1]; u32 personality; u32 value; u16 checksum; u8 version; ZeroBoxMonData(boxMon); if (hasFixedPersonality) personality = fixedPersonality; else personality = Random32(); SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality); //Determine original trainer ID if (otIdType == OT_ID_RANDOM_NO_SHINY) //Pokemon cannot be shiny { u32 shinyValue; do { value = Random32(); shinyValue = GET_SHINY_VALUE(value, personality); } while (shinyValue < SHINY_ODDS); } else if (otIdType == OT_ID_PRESET) //Pokemon has a preset OT ID { value = fixedOtId; } else //Player is the OT { value = gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24); } SetBoxMonData(boxMon, MON_DATA_OT_ID, &value); checksum = CalculateBoxMonChecksum(boxMon); SetBoxMonData(boxMon, MON_DATA_CHECKSUM, &checksum); EncryptBoxMon(boxMon); bufferspeciesname(speciesName, species); SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName); SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage); SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName); SetBoxMonData(boxMon, MON_DATA_SPECIES, &species); SetBoxMonData(boxMon, MON_DATA_EXP, &gExperienceTables[gSpeciesInfo[species].growthRate][level]); SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].friendship); value = GetCurrentRegionMapSectionId(); SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, &value); SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level); if(gSaveBlock1Ptr->keyFlags.version == 0) { version = VERSION_FIRE_RED; } else { version = VERSION_LEAF_GREEN; } SetBoxMonData(boxMon, MON_DATA_MET_GAME, &version); value = ITEM_POKE_BALL; SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value); SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender); if (fixedIV < USE_RANDOM_IVS) { SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV); } else { u32 iv; value = Random(); iv = value & MAX_IV_MASK; SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv); iv = (value & (MAX_IV_MASK << 5)) >> 5; SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv); iv = (value & (MAX_IV_MASK << 10)) >> 10; SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv); value = Random(); iv = value & MAX_IV_MASK; SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv); iv = (value & (MAX_IV_MASK << 5)) >> 5; SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv); iv = (value & (MAX_IV_MASK << 10)) >> 10; SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); } if (gSpeciesInfo[species].abilities[1]) { value = personality & 1; SetBoxMonData(boxMon, MON_DATA_ABILITY_NUM, &value); } GiveBoxMonInitialMoveset(boxMon); } void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature) { u32 personality; do { personality = Random32(); } while (nature != GetNatureFromPersonality(personality)); CreateMon(mon, species, level, fixedIV, TRUE, personality, OT_ID_PLAYER_ID, 0); } void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter) { u32 personality; if ((u8)(unownLetter - 1) < NUM_UNOWN_FORMS) { u16 actualLetter; do { personality = Random32(); actualLetter = GET_UNOWN_LETTER(personality); } while (nature != GetNatureFromPersonality(personality) || gender != GetGenderFromSpeciesAndPersonality(species, personality) || actualLetter != unownLetter - 1); } else { do { personality = Random32(); } while (nature != GetNatureFromPersonality(personality) || gender != GetGenderFromSpeciesAndPersonality(species, personality)); } CreateMon(mon, species, level, fixedIV, TRUE, personality, OT_ID_PLAYER_ID, 0); } void CreateMonWithGenderNatureAbility(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 abilityNum) { u32 personality; if(gSpeciesInfo[species].genderRatio == MON_GENDERLESS || gSpeciesInfo[species].genderRatio == MON_FEMALE || gSpeciesInfo[species].genderRatio == MON_MALE) //don't get stuck on forcing gender if set gender { do { personality = Random32(); } while (nature != GetNatureFromPersonality(personality) || abilityNum != personality % 2); } else { do { personality = Random32(); } while (nature != GetNatureFromPersonality(personality) || gender != GetGenderFromSpeciesAndPersonality(species, personality) || abilityNum != personality % 2); } if(fixedIV == 31 || fixedIV == 255) { fixedIV = 31; CreateMon(mon, species, level, fixedIV, 1, personality, OT_ID_RANDOM_NO_SHINY, 0); } else if(fixedIV == 1) //hidden power Ghost IVs { u8 ivs[NUM_STATS] = {31, 31, 30, 31, 31, 30}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 2) //hidden power Ground IVs { u8 ivs[NUM_STATS] = {31, 31, 31, 31, 30, 30}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 3) //hidden power Flying IVs { u8 ivs[NUM_STATS] = {31, 31, 31, 30, 30, 30}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 4) //hidden power Fighting IVs { u8 ivs[NUM_STATS] = {31, 31, 30, 30, 30, 30}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 5) //hidden power Bug IVs { u8 ivs[NUM_STATS] = {31, 31, 31, 30, 31, 30}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 6) //hidden power Rock IVs { u8 ivs[NUM_STATS] = {31, 31, 30, 30, 31, 30}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 7) //hidden power Grass IVs { u8 ivs[NUM_STATS] = {31, 30, 31, 31, 30, 31}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 8) //hidden power Ice IVs { u8 ivs[NUM_STATS] = {31, 31, 31, 30, 31, 31}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 9) //hidden power Fire IVs { u8 ivs[NUM_STATS] = {31, 31, 30, 30, 30, 31}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 10) //hidden power Electric IVs { u8 ivs[NUM_STATS] = {31, 31, 31, 31, 30, 31}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if(fixedIV == 11) //hidden power Water IVs { u8 ivs[NUM_STATS] = {31, 31, 31, 30, 30, 31}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if (fixedIV == 12) // Challenge Erika's Victreebel { u8 ivs[NUM_STATS] = {30, 0, 30, 30, 9, 30}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else if (fixedIV == 13) // Challenge Erika's other mons { u8 ivs[NUM_STATS] = {30, 30, 30, 30, 30, 30}; CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality); } else { CreateMon(mon, species, level, fixedIV, 1, personality, OT_ID_RANDOM_NO_SHINY, 0); } } void CreateEnemyMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 personality) { u32 i; CreateMon(mon, species, level, 0, 1, personality, OT_ID_RANDOM_NO_SHINY, 0); SetMonData(mon, MON_DATA_HP_IV, &ivs[0]); SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]); SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]); SetMonData(mon, MON_DATA_SPEED_IV, &ivs[3]); SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]); SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]); CalculateMonStats(mon, FALSE); } // Used to create the Old Man's Weedle? void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level) { u32 personality; u32 otId; do { otId = Random32(); personality = Random32(); } while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE); CreateMon(mon, species, level, USE_RANDOM_IVS, TRUE, personality, OT_ID_PRESET, otId); } void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality) { //used for roamer CreateMon(mon, species, level, 0, TRUE, personality, OT_ID_PLAYER_ID, 0); SetMonData(mon, MON_DATA_IVS, &ivs); CalculateMonStats(mon, FALSE); } static void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId) { CreateMon(mon, species, level, 0, FALSE, 0, OT_ID_PRESET, otId); SetMonData(mon, MON_DATA_HP_IV, &ivs[STAT_HP]); SetMonData(mon, MON_DATA_ATK_IV, &ivs[STAT_ATK]); SetMonData(mon, MON_DATA_DEF_IV, &ivs[STAT_DEF]); SetMonData(mon, MON_DATA_SPEED_IV, &ivs[STAT_SPEED]); SetMonData(mon, MON_DATA_SPATK_IV, &ivs[STAT_SPATK]); SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[STAT_SPDEF]); CalculateMonStats(mon, FALSE); } void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread) { s32 i; s32 statCount = 0; u16 evAmount; u8 evsBits; CreateMon(mon, species, level, fixedIV, FALSE, 0, OT_ID_PLAYER_ID, 0); evsBits = evSpread; for (i = 0; i < NUM_STATS; i++) { if (evsBits & 1) statCount++; evsBits >>= 1; } evAmount = MAX_TOTAL_EVS / statCount; evsBits = 1; for (i = 0; i < NUM_STATS; i++) { if (evSpread & evsBits) SetMonData(mon, MON_DATA_HP_EV + i, &evAmount); evsBits <<= 1; } CalculateMonStats(mon, FALSE); } void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) { s32 i; u8 value; CreateMon(mon, src->species, src->level, 0, TRUE, src->personality, OT_ID_PRESET, src->otId); for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(mon, src->moves[i], i); SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses); SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem); // Why is this commented out in FR/LG? /* StringCopy(nickname, src->nickname); if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN) language = LANGUAGE_JAPANESE; else language = GAME_LANGUAGE; SetMonData(mon, MON_DATA_LANGUAGE, &language); Text_StripExtCtrlCodes(nickname); */ SetMonData(mon, MON_DATA_NICKNAME, &src->nickname); SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship); SetMonData(mon, MON_DATA_HP_EV, &src->hpEV); SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV); SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV); SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV); SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV); SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV); value = src->abilityNum; SetMonData(mon, MON_DATA_ABILITY_NUM, &value); value = src->hpIV; SetMonData(mon, MON_DATA_HP_IV, &value); value = src->attackIV; SetMonData(mon, MON_DATA_ATK_IV, &value); value = src->defenseIV; SetMonData(mon, MON_DATA_DEF_IV, &value); value = src->speedIV; SetMonData(mon, MON_DATA_SPEED_IV, &value); value = src->spAttackIV; SetMonData(mon, MON_DATA_SPATK_IV, &value); value = src->spDefenseIV; SetMonData(mon, MON_DATA_SPDEF_IV, &value); CalculateMonStats(mon, TRUE); } static void CreateEventMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) { bool32 isModernFatefulEncounter = TRUE; u8 version = VERSION_EMERALD; CreateMon(mon, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); SetMonData(mon, MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter); if(species == SPECIES_MEW || species == SPECIES_LATIAS || species == SPECIES_LATIOS) SetMonData(mon, MON_DATA_MET_GAME, &version); } void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest) { s32 i; u16 heldItem; dest->species = GetMonData(mon, MON_DATA_SPECIES, NULL); heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (heldItem == ITEM_ENIGMA_BERRY) heldItem = 0; dest->heldItem = heldItem; for (i = 0; i < MAX_MON_MOVES; i++) dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL); dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); dest->otId = GetMonData(mon, MON_DATA_OT_ID, NULL); dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); dest->speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); dest->speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); dest->abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); dest->personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); GetMonData(mon, MON_DATA_NICKNAME, dest->nickname); } static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) { u16 checksum = 0; union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0); union PokemonSubstruct *substruct1 = GetSubstruct(boxMon, boxMon->personality, 1); union PokemonSubstruct *substruct2 = GetSubstruct(boxMon, boxMon->personality, 2); union PokemonSubstruct *substruct3 = GetSubstruct(boxMon, boxMon->personality, 3); s32 i; for (i = 0; i < (s32)ARRAY_COUNT(substruct0->raw); i++) checksum += substruct0->raw[i]; for (i = 0; i < (s32)ARRAY_COUNT(substruct1->raw); i++) checksum += substruct1->raw[i]; for (i = 0; i < (s32)ARRAY_COUNT(substruct2->raw); i++) checksum += substruct2->raw[i]; for (i = 0; i < (s32)ARRAY_COUNT(substruct3->raw); i++) checksum += substruct3->raw[i]; return checksum; } #define CALC_STAT(base, iv, ev, statIndex, field) \ { \ u8 baseStat = gSpeciesInfo[species].base; \ s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ u8 nature = GetNature(mon); \ n = ModifyStatByNature(nature, n, statIndex); \ SetMonData(mon, field, &n); \ } void CalculateMonStats(struct Pokemon *mon, bool8 calcOverride) { u8 ivCalcMode = gSaveBlock1Ptr->keyFlags.ivCalcMode; u8 evCalcMode = gSaveBlock1Ptr->keyFlags.evCalcMode; s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); s32 level = GetLevelFromMonExp(mon); s32 newMaxHP; if(!FlagGet(FLAG_SYS_IS_LINKING)) { if(ivCalcMode == IV_CALC_PERFECT && calcOverride != TRUE) { hpIV = 31; attackIV = 31; defenseIV = 31; speedIV = 31; spAttackIV = 31; spDefenseIV = 31; } if(ivCalcMode == IV_CALC_ZERO && calcOverride != TRUE) { hpIV = 0; attackIV = 0; defenseIV = 0; speedIV = 0; spAttackIV = 0; spDefenseIV = 0; } if(evCalcMode == EV_CALC_ZERO && calcOverride != TRUE) { hpEV = 0; attackEV = 0; defenseEV = 0; speedEV = 0; spAttackEV = 0; spDefenseEV = 0; } } SetMonData(mon, MON_DATA_LEVEL, &level); if (species == SPECIES_SHEDINJA) { newMaxHP = 1; } else { s32 n = 2 * gSpeciesInfo[species].baseHP + hpIV; newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; } gBattleScripting.levelUpHP = newMaxHP - oldMaxHP; if (gBattleScripting.levelUpHP == 0) gBattleScripting.levelUpHP = 1; SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); CALC_STAT(baseAttack, attackIV, attackEV, STAT_ATK, MON_DATA_ATK) CALC_STAT(baseDefense, defenseIV, defenseEV, STAT_DEF, MON_DATA_DEF) CALC_STAT(baseSpeed, speedIV, speedEV, STAT_SPEED, MON_DATA_SPEED) CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, STAT_SPATK, MON_DATA_SPATK) CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, STAT_SPDEF, MON_DATA_SPDEF) if (species == SPECIES_SHEDINJA) { if (currentHP != 0 || oldMaxHP == 0) currentHP = 1; else return; } else { if (currentHP == 0 && oldMaxHP == 0) currentHP = newMaxHP; else if (currentHP != 0) { currentHP += newMaxHP - oldMaxHP; if (currentHP <= 0) currentHP = 1; if(currentHP > newMaxHP) currentHP = newMaxHP; } else return; } SetMonData(mon, MON_DATA_HP, ¤tHP); } void BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest) { u32 value = 0; u32 statusField; dest->box = *src; if(gSaveBlock1Ptr->keyFlags.noPMC == 1) { value = GetBoxMonData(src, MON_DATA_BOX_STATUS, 0); if(value < 8) //Sleep { statusField = value; //preserves sleep turns? } else { switch(value) { case 8: //PSN statusField = STATUS1_POISON; break; case 9: //BRN statusField = STATUS1_BURN; break; case 10: //FRZ statusField = STATUS1_FREEZE; break; case 11: //PRZ statusField = STATUS1_PARALYSIS; break; default: //FNT, none, or invalid statusField = 0; break; } } SetMonData(dest, MON_DATA_STATUS, &statusField); } else { SetMonData(dest, MON_DATA_STATUS, &value); //to 0 } SetMonData(dest, MON_DATA_HP, &value); SetMonData(dest, MON_DATA_MAX_HP, &value); value = MAIL_NONE; SetMonData(dest, MON_DATA_MAIL, &value); CalculateMonStats(dest, FALSE); } static u8 GetLevelFromMonExp(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); s32 level = 1; while (level <= MAX_LEVEL && gExperienceTables[gSpeciesInfo[species].growthRate][level] <= exp) level++; return level - 1; } u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon) { u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL); s32 level = 1; while (level <= MAX_LEVEL && gExperienceTables[gSpeciesInfo[species].growthRate][level] <= exp) level++; return level - 1; } u16 GiveMoveToMon(struct Pokemon *mon, u16 move) { return GiveMoveToBoxMon(&mon->box, move); } static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL); if (!existingMove) { SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &move); SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gBattleMoves[move].pp); return move; } if (existingMove == move) return MON_ALREADY_KNOWS_MOVE; } return MON_HAS_MAX_MOVES; } u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (!mon->moves[i]) { mon->moves[i] = move; mon->pp[i] = gBattleMoves[move].pp; return move; } } return MON_HAS_MAX_MOVES; } void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot) { SetMonData(mon, MON_DATA_MOVE1 + slot, &move); SetMonData(mon, MON_DATA_PP1 + slot, &gBattleMoves[move].pp); } void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot) { mon->moves[slot] = move; mon->pp[slot] = gBattleMoves[move].pp; } static void GiveMonInitialMoveset(struct Pokemon *mon) { GiveBoxMonInitialMoveset(&mon->box); } static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) { u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); s32 level = GetLevelFromBoxMonExp(boxMon); s32 i; u8 deoxysForme; if(species == SPECIES_DEOXYS) { deoxysForme = GetBoxMonData(boxMon, MON_DATA_FORME, NULL); for (i = 0; sDeoxysLevelUpLearnsets[deoxysForme][i] != LEVEL_UP_END; i++) { u16 moveLevel; u16 move; moveLevel = (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_LV); if (moveLevel > (level << 9)) break; move = (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID); if (GiveMoveToBoxMon(boxMon, move) == MON_HAS_MAX_MOVES) DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move); } } else { for (i = 0; gLevelUpLearnsets[species][i] != LEVEL_UP_END; i++) { u16 moveLevel; u16 move; moveLevel = (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_LV); if (moveLevel > (level << 9)) break; move = (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); if (GiveMoveToBoxMon(boxMon, move) == MON_HAS_MAX_MOVES) DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move); } } } u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) { u32 retVal = MOVE_NONE; u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); u8 deoxysForme; if(species == SPECIES_DEOXYS) { deoxysForme = GetMonData(mon, MON_DATA_FORME, NULL); if (firstMove) { sLearningMoveTableID = 0; while ((sDeoxysLevelUpLearnsets[deoxysForme][sLearningMoveTableID] & 0xFE00) != (level << 9)) { sLearningMoveTableID++; if (sDeoxysLevelUpLearnsets[deoxysForme][sLearningMoveTableID] == LEVEL_UP_END) return 0; } } if ((sDeoxysLevelUpLearnsets[deoxysForme][sLearningMoveTableID] & 0xFE00) == (level << 9)) { gMoveToLearn = (sDeoxysLevelUpLearnsets[deoxysForme][sLearningMoveTableID] & 0x1FF); sLearningMoveTableID++; retVal = GiveMoveToMon(mon, gMoveToLearn); } } else { // since you can learn more than one move per level // the game needs to know whether you decided to // learn it or keep the old set to avoid asking // you to learn the same move over and over again if (firstMove) { sLearningMoveTableID = 0; while ((gLevelUpLearnsets[species][sLearningMoveTableID] & LEVEL_UP_MOVE_LV) != (level << 9)) { sLearningMoveTableID++; if (gLevelUpLearnsets[species][sLearningMoveTableID] == LEVEL_UP_END) return MOVE_NONE; } } if ((gLevelUpLearnsets[species][sLearningMoveTableID] & LEVEL_UP_MOVE_LV) == (level << 9)) { gMoveToLearn = (gLevelUpLearnsets[species][sLearningMoveTableID] & LEVEL_UP_MOVE_ID); sLearningMoveTableID++; retVal = GiveMoveToMon(mon, gMoveToLearn); } return retVal; } } void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) { s32 i; u16 moves[MAX_MON_MOVES]; u8 pp[MAX_MON_MOVES]; u8 ppBonuses; for (i = 0; i < MAX_MON_MOVES - 1; i++) { moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i, NULL); pp[i] = GetMonData(mon, MON_DATA_PP2 + i, NULL); } ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); ppBonuses >>= 2; moves[MAX_MON_MOVES - 1] = move; pp[MAX_MON_MOVES - 1] = gBattleMoves[move].pp; for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(mon, MON_DATA_MOVE1 + i, &moves[i]); SetMonData(mon, MON_DATA_PP1 + i, &pp[i]); } SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); } static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) { s32 i; u16 moves[MAX_MON_MOVES]; u8 pp[MAX_MON_MOVES]; u8 ppBonuses; for (i = 0; i < MAX_MON_MOVES - 1; i++) { moves[i] = GetBoxMonData(boxMon, MON_DATA_MOVE2 + i, NULL); pp[i] = GetBoxMonData(boxMon, MON_DATA_PP2 + i, NULL); } ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, NULL); ppBonuses >>= 2; moves[MAX_MON_MOVES - 1] = move; pp[MAX_MON_MOVES - 1] = gBattleMoves[move].pp; for (i = 0; i < MAX_MON_MOVES; i++) { SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]); SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]); } SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &ppBonuses); } #define APPLY_STAT_MOD(var, mon, stat, statIndex) \ { \ (var) = (stat) * (gStatStageRatios)[(mon)->statStages[(statIndex)]][0]; \ (var) /= (gStatStageRatios)[(mon)->statStages[(statIndex)]][1]; \ } // Own function in pokeemerald #define ShouldGetStatBadgeBoost(flag, battler)\ (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) && FlagGet(flag) && gSaveBlock1Ptr->keyFlags.difficulty != DIFFICULTY_CHALLENGE && GetBattlerSide(battler) == B_SIDE_PLAYER) s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef) { u32 i; s32 damage = 0; s32 damageHelper; u8 type; u16 attack, defense; u16 spAttack, spDefense; u8 defenderHoldEffect; u8 defenderHoldEffectParam; u8 attackerHoldEffect; u8 attackerHoldEffectParam; if (!powerOverride) { if(gBattleMoves[move].effect != EFFECT_HIDDEN_POWER) gBattleMovePower = gBattleMoves[move].power; else { s32 powerBits = ((attacker->hpIV & 2) >> 1) | ((attacker->attackIV & 2) << 0) | ((attacker->defenseIV & 2) << 1) | ((attacker->speedIV & 2) << 2) | ((attacker->spAttackIV & 2) << 3) | ((attacker->spDefenseIV & 2) << 4); gBattleMovePower = (40 * powerBits) / 63 + 30; } } else gBattleMovePower = powerOverride; if (!typeOverride) type = gBattleMoves[move].type; else type = typeOverride & DYNAMIC_TYPE_MASK; attack = attacker->attack; defense = defender->defense; spAttack = attacker->spAttack; spDefense = defender->spDefense; // Get attacker hold item info if (attacker->item == ITEM_ENIGMA_BERRY) { attackerHoldEffect = gEnigmaBerries[battlerIdAtk].holdEffect; attackerHoldEffectParam = gEnigmaBerries[battlerIdAtk].holdEffectParam; } else { attackerHoldEffect = ItemId_GetHoldEffect(attacker->item); attackerHoldEffectParam = ItemId_GetHoldEffectParam(attacker->item); } // Get defender hold item info if (defender->item == ITEM_ENIGMA_BERRY) { defenderHoldEffect = gEnigmaBerries[battlerIdDef].holdEffect; defenderHoldEffectParam = gEnigmaBerries[battlerIdDef].holdEffectParam; } else { defenderHoldEffect = ItemId_GetHoldEffect(defender->item); defenderHoldEffectParam = ItemId_GetHoldEffectParam(defender->item); } if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER) attack *= 2; if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, battlerIdAtk)) attack = (110 * attack) / 100; if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, battlerIdDef)) defense = (110 * defense) / 100; if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdAtk)) spAttack = (110 * spAttack) / 100; if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdDef)) spDefense = (110 * spDefense) / 100; // Apply type-bonus hold item for (i = 0; i < ARRAY_COUNT(sHoldEffectToType); i++) { if (attackerHoldEffect == sHoldEffectToType[i][0] && type == sHoldEffectToType[i][1]) { if (IS_TYPE_PHYSICAL(type)) attack = (attack * (attackerHoldEffectParam + 100)) / 100; else spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100; break; } } // Apply boosts from hold items if (attackerHoldEffect == HOLD_EFFECT_CHOICE_BAND) attack = (150 * attack) / 100; if (attackerHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER)) && (attacker->species == SPECIES_LATIAS || attacker->species == SPECIES_LATIOS)) spAttack = (150 * spAttack) / 100; if (defenderHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER)) && (defender->species == SPECIES_LATIAS || defender->species == SPECIES_LATIOS)) spDefense = (150 * spDefense) / 100; if (attackerHoldEffect == HOLD_EFFECT_DEEP_SEA_TOOTH && attacker->species == SPECIES_CLAMPERL) spAttack *= 2; if (defenderHoldEffect == HOLD_EFFECT_DEEP_SEA_SCALE && defender->species == SPECIES_CLAMPERL) spDefense *= 2; if (attackerHoldEffect == HOLD_EFFECT_LIGHT_BALL && attacker->species == SPECIES_PIKACHU) spAttack *= 2; if (defenderHoldEffect == HOLD_EFFECT_METAL_POWDER && defender->species == SPECIES_DITTO) defense *= 2; if (attackerHoldEffect == HOLD_EFFECT_THICK_CLUB && (attacker->species == SPECIES_CUBONE || attacker->species == SPECIES_MAROWAK)) attack *= 2; if (defender->ability == ABILITY_THICK_FAT && (type == TYPE_FIRE || type == TYPE_ICE)) spAttack /= 2; if (attacker->ability == ABILITY_HUSTLE) attack = (150 * attack) / 100; if (attacker->ability == ABILITY_PLUS && ABILITY_ON_FIELD2(ABILITY_MINUS)) spAttack = (150 * spAttack) / 100; if (attacker->ability == ABILITY_MINUS && ABILITY_ON_FIELD2(ABILITY_PLUS)) spAttack = (150 * spAttack) / 100; if (attacker->ability == ABILITY_GUTS && attacker->status1) attack = (150 * attack) / 100; if (defender->ability == ABILITY_MARVEL_SCALE && defender->status1) defense = (150 * defense) / 100; if (type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_MUD_SPORT, 0)) gBattleMovePower /= 2; if (type == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_WATER_SPORT, 0)) gBattleMovePower /= 2; if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3)) gBattleMovePower = (150 * gBattleMovePower) / 100; if (type == TYPE_FIRE && attacker->ability == ABILITY_BLAZE && attacker->hp <= (attacker->maxHP / 3)) gBattleMovePower = (150 * gBattleMovePower) / 100; if (type == TYPE_WATER && attacker->ability == ABILITY_TORRENT && attacker->hp <= (attacker->maxHP / 3)) gBattleMovePower = (150 * gBattleMovePower) / 100; if (type == TYPE_BUG && attacker->ability == ABILITY_SWARM && attacker->hp <= (attacker->maxHP / 3)) gBattleMovePower = (150 * gBattleMovePower) / 100; // Self-destruct / Explosion cut defense in half if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION) defense /= 2; if (IS_TYPE_PHYSICAL(type)) { if (gCritMultiplier == 2) { // Critical hit, if attacker has lost attack stat stages then ignore stat drop if (attacker->statStages[STAT_ATK] > DEFAULT_STAT_STAGE) APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK) else damage = attack; } else APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK) damage = damage * gBattleMovePower; damage *= (2 * attacker->level / 5 + 2); if (gCritMultiplier == 2) { // Critical hit, if defender has gained defense stat stages then ignore stat increase if (defender->statStages[STAT_DEF] < DEFAULT_STAT_STAGE) APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF) else damageHelper = defense; } else APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF) damage = damage / damageHelper; damage /= 50; // Burn cuts attack in half if ((attacker->status1 & STATUS1_BURN) && attacker->ability != ABILITY_GUTS) damage /= 2; // Apply Reflect if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1) { if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2) damage = 2 * (damage / 3); else damage /= 2; } // Moves hitting both targets do half damage in double battles if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == MOVE_TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2) damage /= 2; // Moves always do at least 1 damage. if (damage == 0) damage = 1; } if (type == TYPE_MYSTERY) damage = 0; // is ??? type. does 0 damage. if (IS_TYPE_SPECIAL(type)) { if (gCritMultiplier == 2) { // Critical hit, if attacker has lost sp. attack stat stages then ignore stat drop if (attacker->statStages[STAT_SPATK] > DEFAULT_STAT_STAGE) APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK) else damage = spAttack; } else APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK) damage = damage * gBattleMovePower; damage *= (2 * attacker->level / 5 + 2); if (gCritMultiplier == 2) { // Critical hit, if defender has gained sp. defense stat stages then ignore stat increase if (defender->statStages[STAT_SPDEF] < DEFAULT_STAT_STAGE) APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF) else damageHelper = spDefense; } else APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF) damage = (damage / damageHelper); damage /= 50; // Apply Lightscreen if ((sideStatus & SIDE_STATUS_LIGHTSCREEN) && gCritMultiplier == 1) { if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2) damage = 2 * (damage / 3); else damage /= 2; } // Moves hitting both targets do half damage in double battles if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == MOVE_TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2) damage /= 2; // Are effects of weather negated with cloud nine or air lock if (WEATHER_HAS_EFFECT2) { // Rain weakens Fire, boosts Water if (gBattleWeather & B_WEATHER_RAIN_TEMPORARY) { switch (type) { case TYPE_FIRE: damage /= 2; break; case TYPE_WATER: damage = (15 * damage) / 10; break; } } // Any weather except sun weakens solar beam if ((gBattleWeather & (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_HAIL_TEMPORARY)) && gCurrentMove == MOVE_SOLAR_BEAM) damage /= 2; // Sun boosts Fire, weakens Water if (gBattleWeather & B_WEATHER_SUN) { switch (type) { case TYPE_FIRE: damage = (15 * damage) / 10; break; case TYPE_WATER: damage /= 2; break; } } } // Flash fire triggered if ((gBattleResources->flags->flags[battlerIdAtk] & RESOURCE_FLAG_FLASH_FIRE) && type == TYPE_FIRE) damage = (15 * damage) / 10; } return damage + 2; } u8 CountAliveMonsInBattle(u8 caseId) { s32 i; u8 retVal = 0; switch (caseId) { case BATTLE_ALIVE_EXCEPT_ACTIVE: for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (i != gActiveBattler && !(gAbsentBattlerFlags & gBitTable[i])) retVal++; } break; case BATTLE_ALIVE_ATK_SIDE: for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (GetBattlerSide(i) == GetBattlerSide(gBattlerAttacker) && !(gAbsentBattlerFlags & gBitTable[i])) retVal++; } break; case BATTLE_ALIVE_DEF_SIDE: for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (GetBattlerSide(i) == GetBattlerSide(gBattlerTarget) && !(gAbsentBattlerFlags & gBitTable[i])) retVal++; } break; } return retVal; } u8 GetDefaultMoveTarget(u8 battlerId) { u8 opposing = BATTLE_OPPOSITE(GetBattlerPosition(battlerId) & BIT_SIDE); if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) return GetBattlerAtPosition(opposing); if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) > 1) { u8 position; if ((Random() & 1) == 0) position = BATTLE_PARTNER(opposing); else position = opposing; return GetBattlerAtPosition(position); } else { if ((gAbsentBattlerFlags & gBitTable[opposing])) return GetBattlerAtPosition(BATTLE_PARTNER(opposing)); else return GetBattlerAtPosition(opposing); } } u8 GetMonGender(struct Pokemon *mon) { return GetBoxMonGender(&mon->box); } u8 GetBoxMonGender(struct BoxPokemon *boxMon) { u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL); switch (gSpeciesInfo[species].genderRatio) { case MON_MALE: case MON_FEMALE: case MON_GENDERLESS: return gSpeciesInfo[species].genderRatio; } if (gSpeciesInfo[species].genderRatio > (personality & 0xFF)) return MON_FEMALE; else return MON_MALE; } u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality) { switch (gSpeciesInfo[species].genderRatio) { case MON_MALE: case MON_FEMALE: case MON_GENDERLESS: return gSpeciesInfo[species].genderRatio; } if (gSpeciesInfo[species].genderRatio > (personality & 0xFF)) return MON_FEMALE; else return MON_MALE; } void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition) { if (gMonSpritesGfxPtr != NULL) { if (battlerPosition >= MAX_BATTLERS_COUNT) battlerPosition = 0; gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; } else { if (sMonSpritesGfxManager) { if (battlerPosition >= (s8)sMonSpritesGfxManager->battlePosition) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler? battlerPosition = 0; gMultiuseSpriteTemplate = sMonSpritesGfxManager->templates[battlerPosition]; } else { if (battlerPosition >= MAX_BATTLERS_COUNT) battlerPosition = 0; gMultiuseSpriteTemplate = gSpriteTemplates_Battlers[battlerPosition]; } } gMultiuseSpriteTemplate.paletteTag = speciesTag; gMultiuseSpriteTemplate.anims = gAnims_MonPic; } void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition) { gMultiuseSpriteTemplate.paletteTag = trainerSpriteId; if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT) { gMultiuseSpriteTemplate = sTrainerBackSpriteTemplates[trainerSpriteId]; gMultiuseSpriteTemplate.anims = gTrainerBackAnimsPtrTable[trainerSpriteId]; } else { if (gMonSpritesGfxPtr != NULL) gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; else gMultiuseSpriteTemplate = gSpriteTemplates_Battlers[battlerPosition]; gMultiuseSpriteTemplate.anims = gTrainerFrontAnimsPtrTable[trainerSpriteId]; } } static void EncryptBoxMon(struct BoxPokemon *boxMon) { u32 i; for (i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) { boxMon->secure.raw[i] ^= boxMon->personality; boxMon->secure.raw[i] ^= boxMon->otId; } } static void DecryptBoxMon(struct BoxPokemon *boxMon) { u32 i; for (i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) { boxMon->secure.raw[i] ^= boxMon->otId; boxMon->secure.raw[i] ^= boxMon->personality; } } #define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \ case n: \ { \ union PokemonSubstruct *substructs0 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs1 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs2 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs3 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs4 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs5 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs6 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs7 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs8 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs9 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs10 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs11 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs12 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs13 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs14 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs15 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs16 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs17 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs18 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs19 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs20 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs21 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs22 = boxMon->secure.substructs; \ union PokemonSubstruct *substructs23 = boxMon->secure.substructs; \ \ switch (substructType) \ { \ case 0: \ substruct = &substructs ## n [v1]; \ break; \ case 1: \ substruct = &substructs ## n [v2]; \ break; \ case 2: \ substruct = &substructs ## n [v3]; \ break; \ case 3: \ substruct = &substructs ## n [v4]; \ break; \ } \ break; \ } \ static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) { union PokemonSubstruct *substruct = NULL; switch (personality % 24) { SUBSTRUCT_CASE( 0,0,1,2,3) SUBSTRUCT_CASE( 1,0,1,3,2) SUBSTRUCT_CASE( 2,0,2,1,3) SUBSTRUCT_CASE( 3,0,3,1,2) SUBSTRUCT_CASE( 4,0,2,3,1) SUBSTRUCT_CASE( 5,0,3,2,1) SUBSTRUCT_CASE( 6,1,0,2,3) SUBSTRUCT_CASE( 7,1,0,3,2) SUBSTRUCT_CASE( 8,2,0,1,3) SUBSTRUCT_CASE( 9,3,0,1,2) SUBSTRUCT_CASE(10,2,0,3,1) SUBSTRUCT_CASE(11,3,0,2,1) SUBSTRUCT_CASE(12,1,2,0,3) SUBSTRUCT_CASE(13,1,3,0,2) SUBSTRUCT_CASE(14,2,1,0,3) SUBSTRUCT_CASE(15,3,1,0,2) SUBSTRUCT_CASE(16,2,3,0,1) SUBSTRUCT_CASE(17,3,2,0,1) SUBSTRUCT_CASE(18,1,2,3,0) SUBSTRUCT_CASE(19,1,3,2,0) SUBSTRUCT_CASE(20,2,1,3,0) SUBSTRUCT_CASE(21,3,1,2,0) SUBSTRUCT_CASE(22,2,3,1,0) SUBSTRUCT_CASE(23,3,2,1,0) } return substruct; } u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) { u32 ret; switch (field) { case MON_DATA_STATUS: ret = mon->status; break; case MON_DATA_LEVEL: ret = mon->level; break; case MON_DATA_HP: ret = mon->hp; break; case MON_DATA_MAX_HP: ret = mon->maxHP; break; case MON_DATA_ATK: ret = GetDeoxysStat(mon, STAT_ATK); if (!ret) ret = mon->attack; break; case MON_DATA_DEF: ret = GetDeoxysStat(mon, STAT_DEF); if (!ret) ret = mon->defense; break; case MON_DATA_SPEED: ret = GetDeoxysStat(mon, STAT_SPEED); if (!ret) ret = mon->speed; break; case MON_DATA_SPATK: ret = GetDeoxysStat(mon, STAT_SPATK); if (!ret) ret = mon->spAttack; break; case MON_DATA_SPDEF: ret = GetDeoxysStat(mon, STAT_SPDEF); if (!ret) ret = mon->spDefense; break; case MON_DATA_ATK2: ret = mon->attack; break; case MON_DATA_DEF2: ret = mon->defense; break; case MON_DATA_SPEED2: ret = mon->speed; break; case MON_DATA_SPATK2: ret = mon->spAttack; break; case MON_DATA_SPDEF2: ret = mon->spDefense; break; case MON_DATA_MAIL: ret = mon->mail; break; default: ret = GetBoxMonData(&mon->box, field, data); break; } return ret; } u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) { s32 i; u32 retVal = 0; struct PokemonSubstruct0 *substruct0 = NULL; struct PokemonSubstruct1 *substruct1 = NULL; struct PokemonSubstruct2 *substruct2 = NULL; struct PokemonSubstruct3 *substruct3 = NULL; if (field > MON_DATA_ENCRYPT_SEPARATOR) { substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); DecryptBoxMon(boxMon); if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) { boxMon->isBadEgg = TRUE; boxMon->isEgg = TRUE; substruct3->isEgg = TRUE; } } switch (field) { case MON_DATA_PERSONALITY: retVal = boxMon->personality; break; case MON_DATA_OT_ID: retVal = boxMon->otId; break; case MON_DATA_NICKNAME: { if (boxMon->isBadEgg) { for (retVal = 0; retVal < POKEMON_NAME_LENGTH && gText_BadEgg[retVal] != EOS; data[retVal] = gText_BadEgg[retVal], retVal++) {} data[retVal] = EOS; } else if (boxMon->isEgg) { StringCopy(data, gText_EggNickname); retVal = StringLength(data); } else if (boxMon->language == LANGUAGE_JAPANESE) { data[0] = EXT_CTRL_CODE_BEGIN; data[1] = EXT_CTRL_CODE_JPN; // FRLG changed i < 7 to i < 6 for (retVal = 2, i = 0; i < 6 && boxMon->nickname[i] != EOS; data[retVal] = boxMon->nickname[i], retVal++, i++) {} data[retVal++] = EXT_CTRL_CODE_BEGIN; data[retVal++] = EXT_CTRL_CODE_ENG; data[retVal] = EOS; } else { for (retVal = 0; retVal < POKEMON_NAME_LENGTH; data[retVal] = boxMon->nickname[retVal], retVal++){} data[retVal] = EOS; } break; } case MON_DATA_LANGUAGE: retVal = boxMon->language; break; case MON_DATA_SANITY_IS_BAD_EGG: retVal = boxMon->isBadEgg; break; case MON_DATA_SANITY_HAS_SPECIES: retVal = boxMon->hasSpecies; break; case MON_DATA_SANITY_IS_EGG: retVal = boxMon->isEgg; break; case MON_DATA_OT_NAME: { retVal = 0; while (retVal < PLAYER_NAME_LENGTH) { data[retVal] = boxMon->otName[retVal]; retVal++; } data[retVal] = EOS; break; } case MON_DATA_MARKINGS: retVal = boxMon->markings; break; case MON_DATA_CHECKSUM: retVal = boxMon->checksum; break; case MON_DATA_ENCRYPT_SEPARATOR: retVal = boxMon->unknown; break; case MON_DATA_SPECIES: retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; break; case MON_DATA_HELD_ITEM: retVal = substruct0->heldItem; break; case MON_DATA_EXP: retVal = substruct0->experience; break; case MON_DATA_PP_BONUSES: retVal = substruct0->ppBonuses; break; case MON_DATA_FRIENDSHIP: retVal = substruct0->friendship; break; case MON_DATA_MOVE1: case MON_DATA_MOVE2: case MON_DATA_MOVE3: case MON_DATA_MOVE4: retVal = substruct1->moves[field - MON_DATA_MOVE1]; break; case MON_DATA_PP1: case MON_DATA_PP2: case MON_DATA_PP3: case MON_DATA_PP4: retVal = substruct1->pp[field - MON_DATA_PP1]; break; case MON_DATA_HP_EV: retVal = substruct2->hpEV; break; case MON_DATA_ATK_EV: retVal = substruct2->attackEV; break; case MON_DATA_DEF_EV: retVal = substruct2->defenseEV; break; case MON_DATA_SPEED_EV: retVal = substruct2->speedEV; break; case MON_DATA_SPATK_EV: retVal = substruct2->spAttackEV; break; case MON_DATA_SPDEF_EV: retVal = substruct2->spDefenseEV; break; case MON_DATA_COOL: retVal = substruct2->cool; break; case MON_DATA_BEAUTY: retVal = substruct2->beauty; break; case MON_DATA_CUTE: retVal = substruct2->cute; break; case MON_DATA_SMART: retVal = substruct2->smart; break; case MON_DATA_TOUGH: retVal = substruct2->tough; break; case MON_DATA_SHEEN: retVal = substruct2->sheen; break; case MON_DATA_POKERUS: retVal = substruct3->pokerus; break; case MON_DATA_MET_LOCATION: retVal = substruct3->metLocation; break; case MON_DATA_MET_LEVEL: retVal = substruct3->metLevel; break; case MON_DATA_MET_GAME: retVal = substruct3->metGame; break; case MON_DATA_POKEBALL: retVal = substruct3->pokeball; break; case MON_DATA_OT_GENDER: retVal = substruct3->otGender; break; case MON_DATA_HP_IV: retVal = substruct3->hpIV; break; case MON_DATA_ATK_IV: retVal = substruct3->attackIV; break; case MON_DATA_DEF_IV: retVal = substruct3->defenseIV; break; case MON_DATA_SPEED_IV: retVal = substruct3->speedIV; break; case MON_DATA_SPATK_IV: retVal = substruct3->spAttackIV; break; case MON_DATA_SPDEF_IV: retVal = substruct3->spDefenseIV; break; case MON_DATA_IS_EGG: retVal = substruct3->isEgg; break; case MON_DATA_ABILITY_NUM: retVal = substruct3->abilityNum; break; case MON_DATA_COOL_RIBBON: retVal = substruct3->coolRibbon; break; case MON_DATA_BEAUTY_RIBBON: retVal = substruct3->beautyRibbon; break; case MON_DATA_CUTE_RIBBON: retVal = substruct3->cuteRibbon; break; case MON_DATA_SMART_RIBBON: retVal = substruct3->smartRibbon; break; case MON_DATA_TOUGH_RIBBON: retVal = substruct3->toughRibbon; break; case MON_DATA_CHAMPION_RIBBON: retVal = substruct3->championRibbon; break; case MON_DATA_WINNING_RIBBON: retVal = substruct3->winningRibbon; break; case MON_DATA_VICTORY_RIBBON: retVal = substruct3->victoryRibbon; break; case MON_DATA_ARTIST_RIBBON: retVal = substruct3->artistRibbon; break; case MON_DATA_EFFORT_RIBBON: retVal = substruct3->effortRibbon; break; case MON_DATA_MARINE_RIBBON: retVal = substruct3->marineRibbon; break; case MON_DATA_LAND_RIBBON: retVal = substruct3->landRibbon; break; case MON_DATA_SKY_RIBBON: retVal = substruct3->skyRibbon; break; case MON_DATA_COUNTRY_RIBBON: retVal = substruct3->countryRibbon; break; case MON_DATA_NATIONAL_RIBBON: retVal = substruct3->nationalRibbon; break; case MON_DATA_EARTH_RIBBON: retVal = substruct3->earthRibbon; break; case MON_DATA_WORLD_RIBBON: retVal = substruct3->worldRibbon; break; case MON_DATA_UNUSED_RIBBONS: retVal = substruct3->unusedRibbons; break; case MON_DATA_MODERN_FATEFUL_ENCOUNTER: retVal = substruct3->modernFatefulEncounter; break; case MON_DATA_SPECIES_OR_EGG: retVal = substruct0->species; if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) retVal = SPECIES_EGG; break; case MON_DATA_IVS: retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) | (substruct3->speedIV << 15) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25); break; case MON_DATA_KNOWN_MOVES: if (substruct0->species && !substruct3->isEgg) { u16 *moves = (u16 *)data; s32 i = 0; while (moves[i] != MOVES_COUNT) { u16 move = moves[i]; if (substruct1->moves[0] == move || substruct1->moves[1] == move || substruct1->moves[2] == move || substruct1->moves[3] == move) retVal |= gBitTable[i]; i++; } } break; case MON_DATA_RIBBON_COUNT: retVal = 0; if (substruct0->species && !substruct3->isEgg) { retVal += substruct3->coolRibbon; retVal += substruct3->beautyRibbon; retVal += substruct3->cuteRibbon; retVal += substruct3->smartRibbon; retVal += substruct3->toughRibbon; retVal += substruct3->championRibbon; retVal += substruct3->winningRibbon; retVal += substruct3->victoryRibbon; retVal += substruct3->artistRibbon; retVal += substruct3->effortRibbon; retVal += substruct3->marineRibbon; retVal += substruct3->landRibbon; retVal += substruct3->skyRibbon; retVal += substruct3->countryRibbon; retVal += substruct3->nationalRibbon; retVal += substruct3->earthRibbon; retVal += substruct3->worldRibbon; } break; case MON_DATA_RIBBONS: retVal = 0; if (substruct0->species && !substruct3->isEgg) { retVal = substruct3->championRibbon | (substruct3->coolRibbon << 1) | (substruct3->beautyRibbon << 4) | (substruct3->cuteRibbon << 7) | (substruct3->smartRibbon << 10) | (substruct3->toughRibbon << 13) | (substruct3->winningRibbon << 16) | (substruct3->victoryRibbon << 17) | (substruct3->artistRibbon << 18) | (substruct3->effortRibbon << 19) | (substruct3->marineRibbon << 20) | (substruct3->landRibbon << 21) | (substruct3->skyRibbon << 22) | (substruct3->countryRibbon << 23) | (substruct3->nationalRibbon << 24) | (substruct3->earthRibbon << 25) | (substruct3->worldRibbon << 26); } break; case MON_DATA_FORME: retVal = substruct0->forme; break; case MON_DATA_BOX_HP: retVal = substruct0->boxHP; break; case MON_DATA_BOX_STATUS: retVal = substruct0->boxStatus; break; default: break; } if (field > MON_DATA_ENCRYPT_SEPARATOR) EncryptBoxMon(boxMon); return retVal; } #define SET8(lhs) (lhs) = *data #define SET16(lhs) (lhs) = data[0] + (data[1] << 8) #define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg) { const u8 *data = dataArg; switch (field) { case MON_DATA_STATUS: SET32(mon->status); break; case MON_DATA_LEVEL: SET8(mon->level); break; case MON_DATA_HP: SET16(mon->hp); break; case MON_DATA_MAX_HP: SET16(mon->maxHP); break; case MON_DATA_ATK: case MON_DATA_ATK2: SET16(mon->attack); break; case MON_DATA_DEF: case MON_DATA_DEF2: SET16(mon->defense); break; case MON_DATA_SPEED: case MON_DATA_SPEED2: SET16(mon->speed); break; case MON_DATA_SPATK: case MON_DATA_SPATK2: SET16(mon->spAttack); break; case MON_DATA_SPDEF: case MON_DATA_SPDEF2: SET16(mon->spDefense); break; case MON_DATA_MAIL: SET8(mon->mail); break; case MON_DATA_SPECIES_OR_EGG: break; // why did FRLG go out of its way to specify all of these for default? case MON_DATA_IVS: case MON_DATA_CHAMPION_RIBBON: case MON_DATA_WINNING_RIBBON: case MON_DATA_VICTORY_RIBBON: case MON_DATA_ARTIST_RIBBON: case MON_DATA_EFFORT_RIBBON: case MON_DATA_MARINE_RIBBON: case MON_DATA_LAND_RIBBON: case MON_DATA_SKY_RIBBON: case MON_DATA_COUNTRY_RIBBON: case MON_DATA_NATIONAL_RIBBON: case MON_DATA_EARTH_RIBBON: case MON_DATA_WORLD_RIBBON: case MON_DATA_UNUSED_RIBBONS: case MON_DATA_MODERN_FATEFUL_ENCOUNTER: case MON_DATA_KNOWN_MOVES: case MON_DATA_RIBBON_COUNT: case MON_DATA_RIBBONS: default: SetBoxMonData(&mon->box, field, data); break; } } void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) { const u8 *data = dataArg; struct PokemonSubstruct0 *substruct0 = NULL; struct PokemonSubstruct1 *substruct1 = NULL; struct PokemonSubstruct2 *substruct2 = NULL; struct PokemonSubstruct3 *substruct3 = NULL; if (field > MON_DATA_ENCRYPT_SEPARATOR) { substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); DecryptBoxMon(boxMon); if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) { boxMon->isBadEgg = TRUE; boxMon->isEgg = TRUE; substruct3->isEgg = TRUE; EncryptBoxMon(boxMon); return; } } switch (field) { case MON_DATA_PERSONALITY: SET32(boxMon->personality); break; case MON_DATA_OT_ID: SET32(boxMon->otId); break; case MON_DATA_NICKNAME: { s32 i; for (i = 0; i < POKEMON_NAME_LENGTH; i++) boxMon->nickname[i] = data[i]; break; } case MON_DATA_LANGUAGE: SET8(boxMon->language); break; case MON_DATA_SANITY_IS_BAD_EGG: SET8(boxMon->isBadEgg); break; case MON_DATA_SANITY_HAS_SPECIES: SET8(boxMon->hasSpecies); break; case MON_DATA_SANITY_IS_EGG: SET8(boxMon->isEgg); break; case MON_DATA_OT_NAME: { s32 i; for (i = 0; i < PLAYER_NAME_LENGTH; i++) boxMon->otName[i] = data[i]; break; } case MON_DATA_MARKINGS: SET8(boxMon->markings); break; case MON_DATA_CHECKSUM: SET16(boxMon->checksum); break; case MON_DATA_ENCRYPT_SEPARATOR: SET16(boxMon->unknown); break; case MON_DATA_SPECIES: { SET16(substruct0->species); if (substruct0->species) boxMon->hasSpecies = TRUE; else boxMon->hasSpecies = FALSE; break; } case MON_DATA_HELD_ITEM: SET16(substruct0->heldItem); break; case MON_DATA_EXP: SET32(substruct0->experience); break; case MON_DATA_PP_BONUSES: SET8(substruct0->ppBonuses); break; case MON_DATA_FRIENDSHIP: SET8(substruct0->friendship); break; case MON_DATA_MOVE1: case MON_DATA_MOVE2: case MON_DATA_MOVE3: case MON_DATA_MOVE4: SET16(substruct1->moves[field - MON_DATA_MOVE1]); break; case MON_DATA_PP1: case MON_DATA_PP2: case MON_DATA_PP3: case MON_DATA_PP4: SET8(substruct1->pp[field - MON_DATA_PP1]); break; case MON_DATA_HP_EV: SET8(substruct2->hpEV); break; case MON_DATA_ATK_EV: SET8(substruct2->attackEV); break; case MON_DATA_DEF_EV: SET8(substruct2->defenseEV); break; case MON_DATA_SPEED_EV: SET8(substruct2->speedEV); break; case MON_DATA_SPATK_EV: SET8(substruct2->spAttackEV); break; case MON_DATA_SPDEF_EV: SET8(substruct2->spDefenseEV); break; case MON_DATA_COOL: SET8(substruct2->cool); break; case MON_DATA_BEAUTY: SET8(substruct2->beauty); break; case MON_DATA_CUTE: SET8(substruct2->cute); break; case MON_DATA_SMART: SET8(substruct2->smart); break; case MON_DATA_TOUGH: SET8(substruct2->tough); break; case MON_DATA_SHEEN: SET8(substruct2->sheen); break; case MON_DATA_POKERUS: SET8(substruct3->pokerus); break; case MON_DATA_MET_LOCATION: SET8(substruct3->metLocation); break; case MON_DATA_MET_LEVEL: { u8 metLevel = *data; substruct3->metLevel = metLevel; break; } case MON_DATA_MET_GAME: SET8(substruct3->metGame); break; case MON_DATA_POKEBALL: { u8 pokeball = *data; substruct3->pokeball = pokeball; break; } case MON_DATA_OT_GENDER: SET8(substruct3->otGender); break; case MON_DATA_HP_IV: SET8(substruct3->hpIV); break; case MON_DATA_ATK_IV: SET8(substruct3->attackIV); break; case MON_DATA_DEF_IV: SET8(substruct3->defenseIV); break; case MON_DATA_SPEED_IV: SET8(substruct3->speedIV); break; case MON_DATA_SPATK_IV: SET8(substruct3->spAttackIV); break; case MON_DATA_SPDEF_IV: SET8(substruct3->spDefenseIV); break; case MON_DATA_IS_EGG: SET8(substruct3->isEgg); if (substruct3->isEgg) boxMon->isEgg = TRUE; else boxMon->isEgg = FALSE; break; case MON_DATA_ABILITY_NUM: SET8(substruct3->abilityNum); break; case MON_DATA_COOL_RIBBON: SET8(substruct3->coolRibbon); break; case MON_DATA_BEAUTY_RIBBON: SET8(substruct3->beautyRibbon); break; case MON_DATA_CUTE_RIBBON: SET8(substruct3->cuteRibbon); break; case MON_DATA_SMART_RIBBON: SET8(substruct3->smartRibbon); break; case MON_DATA_TOUGH_RIBBON: SET8(substruct3->toughRibbon); break; case MON_DATA_CHAMPION_RIBBON: SET8(substruct3->championRibbon); break; case MON_DATA_WINNING_RIBBON: SET8(substruct3->winningRibbon); break; case MON_DATA_VICTORY_RIBBON: SET8(substruct3->victoryRibbon); break; case MON_DATA_ARTIST_RIBBON: SET8(substruct3->artistRibbon); break; case MON_DATA_EFFORT_RIBBON: SET8(substruct3->effortRibbon); break; case MON_DATA_MARINE_RIBBON: SET8(substruct3->marineRibbon); break; case MON_DATA_LAND_RIBBON: SET8(substruct3->landRibbon); break; case MON_DATA_SKY_RIBBON: SET8(substruct3->skyRibbon); break; case MON_DATA_COUNTRY_RIBBON: SET8(substruct3->countryRibbon); break; case MON_DATA_NATIONAL_RIBBON: SET8(substruct3->nationalRibbon); break; case MON_DATA_EARTH_RIBBON: SET8(substruct3->earthRibbon); break; case MON_DATA_WORLD_RIBBON: SET8(substruct3->worldRibbon); break; case MON_DATA_UNUSED_RIBBONS: SET8(substruct3->unusedRibbons); break; case MON_DATA_MODERN_FATEFUL_ENCOUNTER: SET8(substruct3->modernFatefulEncounter); break; case MON_DATA_IVS: { u32 ivs = *data; // Bug: Only the HP IV and the lower 3 bits of the Attack IV are read. The rest become 0. substruct3->hpIV = ivs & MAX_IV_MASK; substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; substruct3->defenseIV = (ivs >> 10) & MAX_IV_MASK; substruct3->speedIV = (ivs >> 15) & MAX_IV_MASK; substruct3->spAttackIV = (ivs >> 20) & MAX_IV_MASK; substruct3->spDefenseIV = (ivs >> 25) & MAX_IV_MASK; break; } case MON_DATA_FORME: { u8 forme = *data; substruct0->forme = forme; break; } case MON_DATA_BOX_HP: { //u16 hp = *data; SET16(substruct0->boxHP); break; } case MON_DATA_BOX_STATUS: { u8 status = *data; substruct0->boxStatus = status; } default: break; } if (field > MON_DATA_ENCRYPT_SEPARATOR) { boxMon->checksum = CalculateBoxMonChecksum(boxMon); EncryptBoxMon(boxMon); } } void CopyMon(void *dest, void *src, size_t size) { memcpy(dest, src, size); } u8 GiveMonToPlayer(struct Pokemon *mon) { s32 i; SetMonData(mon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName); SetMonData(mon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender); SetMonData(mon, MON_DATA_OT_ID, gSaveBlock2Ptr->playerTrainerId); for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) break; } if (i >= PARTY_SIZE) return SendMonToPC(mon); CopyMon(&gPlayerParty[i], mon, sizeof(*mon)); CalculateMonStats(&gPlayerParty[i], FALSE); gPlayerPartyCount = i + 1; return MON_GIVEN_TO_PARTY; } u8 SendMonToPC(struct Pokemon* mon) { s32 boxNo, boxPos; SetPCBoxToSendMon(VarGet(VAR_PC_BOX_TO_SEND_MON)); boxNo = StorageGetCurrentBox(); do { for (boxPos = 0; boxPos < IN_BOX_COUNT; boxPos++) { struct BoxPokemon* checkingMon = GetBoxedMonPtr(boxNo, boxPos); if (GetBoxMonData(checkingMon, MON_DATA_SPECIES, NULL) == SPECIES_NONE) { if(gSaveBlock1Ptr->keyFlags.noPMC != 1) MonRestorePP(mon); StoreHPAndStatusInBoxMon(mon); CopyMon(checkingMon, &mon->box, sizeof(mon->box)); gSpecialVar_MonBoxId = boxNo; gSpecialVar_MonBoxPos = boxPos; if (GetPCBoxToSendMon() != boxNo) FlagClear(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE); VarSet(VAR_PC_BOX_TO_SEND_MON, boxNo); return MON_GIVEN_TO_PC; } } boxNo++; if (boxNo == TOTAL_BOXES_COUNT) boxNo = 0; } while (boxNo != StorageGetCurrentBox()); return MON_CANT_GIVE; } u8 CalculatePlayerPartyCount(void) { gPlayerPartyCount = 0; while (gPlayerPartyCount < PARTY_SIZE && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) { gPlayerPartyCount++; } return gPlayerPartyCount; } u8 CalculateEnemyPartyCount(void) { gEnemyPartyCount = 0; while (gEnemyPartyCount < PARTY_SIZE && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) { gEnemyPartyCount++; } return gEnemyPartyCount; } u8 GetMonsStateToDoubles(void) { s32 aliveCount = 0; s32 i; CalculatePlayerPartyCount(); if (gPlayerPartyCount == 1) return gPlayerPartyCount; // PLAYER_HAS_ONE_MON for (i = 0; i < gPlayerPartyCount; i++) { // FRLG changed the order of these checks, but there's no point to doing that // because of the requirement of all 3 of these checks. if (GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG) aliveCount++; } return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON; } u8 GetAbilityBySpecies(u16 species, bool8 abilityNum) { if (abilityNum) gLastUsedAbility = gSpeciesInfo[species].abilities[1]; else gLastUsedAbility = gSpeciesInfo[species].abilities[0]; return gLastUsedAbility; } u8 GetMonAbility(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u8 abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); return GetAbilityBySpecies(species, abilityNum); } static void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) { s32 i, j; ZeroEnemyPartyMons(); *gBattleResources->secretBase = *secretBaseRecord; for (i = 0; i < PARTY_SIZE; i++) { if (gBattleResources->secretBase->party.species[i]) { CreateMon(&gEnemyParty[i], gBattleResources->secretBase->party.species[i], gBattleResources->secretBase->party.levels[i], 15, TRUE, gBattleResources->secretBase->party.personality[i], OT_ID_RANDOM_NO_SHINY, 0); SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]); for (j = 0; j < NUM_STATS; j++) SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->party.EVs[i]); for (j = 0; j < MAX_MON_MOVES; j++) { SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * MAX_MON_MOVES + j]); SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * MAX_MON_MOVES + j]].pp); } } } gBattleTypeFlags = BATTLE_TYPE_TRAINER; gTrainerBattleOpponent_A = TRAINER_SECRET_BASE; } u8 GetSecretBaseTrainerPicIndex(void) { u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5]; return gFacilityClassToPicIndex[facilityClass]; } u8 GetSecretBaseTrainerNameIndex(void) { u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5]; return gFacilityClassToTrainerClass[facilityClass]; } bool8 IsPlayerPartyAndPokemonStorageFull(void) { s32 i; for (i = 0; i < PARTY_SIZE; i++) if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) return FALSE; return IsPokemonStorageFull(); } static bool8 IsPokemonStorageFull(void) { s32 i, j; for (i = 0; i < TOTAL_BOXES_COUNT; i++) for (j = 0; j < IN_BOX_COUNT; j++) if (GetBoxMonDataAt(i, j, MON_DATA_SPECIES) == SPECIES_NONE) return FALSE; return TRUE; } void bufferspeciesname(u8 *name, u16 species) { s32 i; // Hmm? FRLG has < while Ruby/Emerald has <= for (i = 0; i < POKEMON_NAME_LENGTH; i++) { if (species > NUM_SPECIES) name[i] = gSpeciesNames[0][i]; else name[i] = gSpeciesNames[species][i]; if (name[i] == EOS) break; } name[i] = EOS; } u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) { u8 basePP = gBattleMoves[move].pp; return basePP + ((basePP * 20 * ((gPPUpGetMask[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100); } void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex) { u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); ppBonuses &= gPPUpClearMask[moveIndex]; SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); } void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex) { mon->ppBonuses &= gPPUpClearMask[moveIndex]; } static void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) { u16 *hpSwitchout; s32 i; u8 nickname[POKEMON_NAME_LENGTH * 2]; // Why is the nickname array here longer in FR/LG? gBattleMons[battlerId].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); gBattleMons[battlerId].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL); for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMons[battlerId].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL); gBattleMons[battlerId].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL); } gBattleMons[battlerId].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL); gBattleMons[battlerId].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL); gBattleMons[battlerId].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL); gBattleMons[battlerId].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); gBattleMons[battlerId].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); gBattleMons[battlerId].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); gBattleMons[battlerId].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL); gBattleMons[battlerId].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); gBattleMons[battlerId].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); gBattleMons[battlerId].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); gBattleMons[battlerId].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL); gBattleMons[battlerId].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL); gBattleMons[battlerId].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL); gBattleMons[battlerId].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); gBattleMons[battlerId].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); gBattleMons[battlerId].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); gBattleMons[battlerId].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL); gBattleMons[battlerId].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); gBattleMons[battlerId].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); gBattleMons[battlerId].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); gBattleMons[battlerId].abilityNum = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ABILITY_NUM, NULL); gBattleMons[battlerId].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL); gBattleMons[battlerId].type1 = gSpeciesInfo[gBattleMons[battlerId].species].types[0]; gBattleMons[battlerId].type2 = gSpeciesInfo[gBattleMons[battlerId].species].types[1]; gBattleMons[battlerId].ability = GetAbilityBySpecies(gBattleMons[battlerId].species, gBattleMons[battlerId].abilityNum); GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gBattleMons[battlerId].nickname, nickname); GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battlerId].otName); hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)]; *hpSwitchout = gBattleMons[battlerId].hp; for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; gBattleMons[battlerId].status2 = 0; UpdateSentPokesToOpponentValue(battlerId); ClearTemporarySpeciesSpriteData(battlerId, FALSE); } bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex) { return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, 0); } #define UPDATE_FRIENDSHIP_FROM_ITEM() \ { \ if ((retVal == 0 || friendshipOnly) && !ShouldSkipFriendshipChange() && friendshipChange == 0) \ { \ friendshipChange = itemEffect[idx]; \ friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); \ if (friendshipChange > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) \ friendship += 150 * friendshipChange / 100; \ else \ friendship += friendshipChange; \ if (friendshipChange > 0) \ { \ if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) \ friendship++; \ if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) \ friendship++; \ } \ if (friendship < 0) \ friendship = 0; \ if (friendship > MAX_FRIENDSHIP) \ friendship = MAX_FRIENDSHIP; \ SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); \ retVal = FALSE; \ } \ } bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI) { u32 data; s32 dataSigned; s32 friendship; s32 cmdIndex; bool8 retVal = TRUE; const u8 *itemEffect; u8 idx = ITEM_EFFECT_ARG_START; u32 i; s8 friendshipChange = 0; u8 holdEffect; u8 battleMonId = MAX_BATTLERS_COUNT; u16 heldItem; u8 val; u32 evDelta; u32 friendshipOnly = FALSE; // Get item hold effect heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (heldItem == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) holdEffect = gEnigmaBerries[gBattlerInMenuId].holdEffect; else holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; } else { holdEffect = ItemId_GetHoldEffect(heldItem); } // Get battler id (if relevant) gPotentialItemEffectBattler = gBattlerInMenuId; if (gMain.inBattle) { gActiveBattler = gBattlerInMenuId; cmdIndex = (GetBattlerSide(gActiveBattler) != B_SIDE_PLAYER); while (cmdIndex < gBattlersCount) { if (gBattlerPartyIndexes[cmdIndex] == partyIndex) { battleMonId = cmdIndex; break; } cmdIndex += 2; } } else { gActiveBattler = 0; battleMonId = MAX_BATTLERS_COUNT; } // Skip using the item if it won't do anything if (!IS_POKEMON_ITEM(item)) return TRUE; if (gItemEffectTable[item - ITEM_POTION] == NULL && item != ITEM_ENIGMA_BERRY) return TRUE; // Get item effect if (item == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) itemEffect = gEnigmaBerries[gActiveBattler].itemEffect; else itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect; } else { itemEffect = gItemEffectTable[item - ITEM_POTION]; } // Do item effect for (cmdIndex = 0; cmdIndex < ITEM_EFFECT_ARG_START; cmdIndex++) { switch (cmdIndex) { // Handle ITEM0 effects (infatuation, Dire Hit, X Attack). ITEM0_SACRED_ASH is handled in party_menu.c case 0: // Cure infatuation if ((itemEffect[cmdIndex] & ITEM0_INFATUATION) && gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT && (gBattleMons[battleMonId].status2 & STATUS2_INFATUATION)) { gBattleMons[battleMonId].status2 &= ~STATUS2_INFATUATION; retVal = FALSE; } // Dire Hit if ((itemEffect[cmdIndex] & ITEM0_DIRE_HIT) && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY)) { gBattleMons[gActiveBattler].status2 |= STATUS2_FOCUS_ENERGY; retVal = FALSE; } // X Attack if ((itemEffect[cmdIndex] & ITEM0_X_ATTACK) && gBattleMons[gActiveBattler].statStages[STAT_ATK] < MAX_STAT_STAGE) { gBattleMons[gActiveBattler].statStages[STAT_ATK] += itemEffect[cmdIndex] & ITEM0_X_ATTACK; if (gBattleMons[gActiveBattler].statStages[STAT_ATK] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_ATK] = MAX_STAT_STAGE; retVal = FALSE; } break; // Handle ITEM1 effects (in-battle stat boosting effects) case 1: // X Defend if ((itemEffect[cmdIndex] & ITEM1_X_DEFEND) && gBattleMons[gActiveBattler].statStages[STAT_DEF] < MAX_STAT_STAGE) { gBattleMons[gActiveBattler].statStages[STAT_DEF] += (itemEffect[cmdIndex] & ITEM1_X_DEFEND) >> 4; if (gBattleMons[gActiveBattler].statStages[STAT_DEF] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_DEF] = MAX_STAT_STAGE; retVal = FALSE; } // X Speed if ((itemEffect[cmdIndex] & ITEM1_X_SPEED) && gBattleMons[gActiveBattler].statStages[STAT_SPEED] < MAX_STAT_STAGE) { gBattleMons[gActiveBattler].statStages[STAT_SPEED] += itemEffect[cmdIndex] & ITEM1_X_SPEED; if (gBattleMons[gActiveBattler].statStages[STAT_SPEED] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_SPEED] = MAX_STAT_STAGE; retVal = FALSE; } break; // Handle ITEM2 effects (more stat boosting effects) case 2: // X Accuracy if ((itemEffect[cmdIndex] & ITEM2_X_ACCURACY) && gBattleMons[gActiveBattler].statStages[STAT_ACC] < MAX_STAT_STAGE) { gBattleMons[gActiveBattler].statStages[STAT_ACC] += (itemEffect[cmdIndex] & ITEM2_X_ACCURACY) >> 4; if (gBattleMons[gActiveBattler].statStages[STAT_ACC] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_ACC] = MAX_STAT_STAGE; retVal = FALSE; } // X Sp Attack if ((itemEffect[cmdIndex] & ITEM2_X_SPATK) && gBattleMons[gActiveBattler].statStages[STAT_SPATK] < MAX_STAT_STAGE) { gBattleMons[gActiveBattler].statStages[STAT_SPATK] += itemEffect[cmdIndex] & ITEM2_X_SPATK; if (gBattleMons[gActiveBattler].statStages[STAT_SPATK] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_SPATK] = MAX_STAT_STAGE; retVal = FALSE; } break; // Handle ITEM3 effects (Guard Spec, Rare Candy, cure status) case 3: // Guard Spec if ((itemEffect[cmdIndex] & ITEM3_GUARD_SPEC) && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0) { gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer = 5; retVal = FALSE; } // Rare Candy if ((itemEffect[cmdIndex] & ITEM3_LEVEL_UP) && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) { data = gExperienceTables[gSpeciesInfo[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; SetMonData(mon, MON_DATA_EXP, &data); CalculateMonStats(mon, FALSE); retVal = FALSE; } // Cure status if ((itemEffect[cmdIndex] & ITEM3_SLEEP) && HealStatusConditions(mon, partyIndex, STATUS1_SLEEP, battleMonId) == 0) { if (battleMonId != MAX_BATTLERS_COUNT) gBattleMons[battleMonId].status2 &= ~STATUS2_NIGHTMARE; retVal = FALSE; } if ((itemEffect[cmdIndex] & ITEM3_POISON) && HealStatusConditions(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battleMonId) == 0) retVal = FALSE; if ((itemEffect[cmdIndex] & ITEM3_BURN) && HealStatusConditions(mon, partyIndex, STATUS1_BURN, battleMonId) == 0) retVal = FALSE; if ((itemEffect[cmdIndex] & ITEM3_FREEZE) && HealStatusConditions(mon, partyIndex, STATUS1_FREEZE, battleMonId) == 0) retVal = FALSE; if ((itemEffect[cmdIndex] & ITEM3_PARALYSIS) && HealStatusConditions(mon, partyIndex, STATUS1_PARALYSIS, battleMonId) == 0) retVal = FALSE; if ((itemEffect[cmdIndex] & ITEM3_CONFUSION) // heal confusion && gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT && (gBattleMons[battleMonId].status2 & STATUS2_CONFUSION)) { gBattleMons[battleMonId].status2 &= ~STATUS2_CONFUSION; retVal = FALSE; } break; // Handle ITEM4 effects (Change HP/Atk EVs, HP heal, PP heal, PP up, Revive, and evolution stones) case 4: val = itemEffect[cmdIndex]; // PP Up if (val & ITEM4_PP_UP) { val &= ~ITEM4_PP_UP; data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); i = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); if (data < 3 && i > 4) { data = GetMonData(mon, MON_DATA_PP_BONUSES, NULL) + gPPUpAddValues[moveIndex]; SetMonData(mon, MON_DATA_PP_BONUSES, &data); data = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - i; data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + data; SetMonData(mon, MON_DATA_PP1 + moveIndex, &data); retVal = FALSE; } } i = 0; // Loop through and try each of the remaining ITEM4 effects while (val != 0) { if (val & 1) { u16 evCount; s32 r5; switch (i) { case 0: // ITEM4_EV_HP case 1: // ITEM4_EV_ATK evCount = GetMonEVCount(mon); dataSigned = GetMonData(mon, sGetMonDataEVConstants[i], NULL); if(itemEffect[idx] != 201) // if not EV-reducing berry { if (evCount >= MAX_TOTAL_EVS) return TRUE; if (dataSigned < EV_ITEM_RAISE_LIMIT) { if (dataSigned + itemEffect[idx] > EV_ITEM_RAISE_LIMIT) evDelta = EV_ITEM_RAISE_LIMIT - (dataSigned + itemEffect[idx]) + itemEffect[idx]; else evDelta = itemEffect[idx]; if (evCount + evDelta > MAX_TOTAL_EVS) evDelta += MAX_TOTAL_EVS - (evCount + evDelta); dataSigned += evDelta; } } else { if (dataSigned == 0) { // No EVs to lose, but make sure friendship updates anyway friendshipOnly = TRUE; idx++; break; //do something with vars and break, EV is 0 already } dataSigned -= 10; if(dataSigned < 0) { dataSigned = 0; } } // Update EVs and stats SetMonData(mon, sGetMonDataEVConstants[i], &dataSigned); CalculateMonStats(mon, TRUE); idx++; retVal = FALSE; break; case 2: // ITEM4_HEAL_HP // If Revive, update number of times revive has been used if (val & (ITEM4_REVIVE >> 2)) { if (gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || GetMonData(mon, MON_DATA_HP, NULL) != 0) { idx++; break; } if (gMain.inBattle) { if (battleMonId != MAX_BATTLERS_COUNT) { gAbsentBattlerFlags &= ~gBitTable[battleMonId]; CopyPlayerPartyMonToBattleData(battleMonId, GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battleMonId])); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.numRevivesUsed < 255) gBattleResults.numRevivesUsed++; } else { gAbsentBattlerFlags &= ~gBitTable[gActiveBattler ^ 2]; if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.numRevivesUsed < 255) gBattleResults.numRevivesUsed++; } } } else { if (GetMonData(mon, MON_DATA_HP, NULL) == 0) { idx++; break; } } // Get amount of HP to restore data = itemEffect[idx++]; switch (data) { case ITEM6_HEAL_HP_FULL: data = GetMonData(mon, MON_DATA_MAX_HP, NULL) - GetMonData(mon, MON_DATA_HP, NULL); break; case ITEM6_HEAL_HP_HALF: data = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 2; if (data == 0) data = 1; break; case ITEM6_HEAL_HP_LVL_UP: data = gBattleScripting.levelUpHP; break; } // Only restore HP if not at max health if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL)) { if (!usedByAI) { // Restore HP data = GetMonData(mon, MON_DATA_HP, NULL) + data; if (data > GetMonData(mon, MON_DATA_MAX_HP, NULL)) data = GetMonData(mon, MON_DATA_MAX_HP, NULL); SetMonData(mon, MON_DATA_HP, &data); // Update battler (if applicable) if (gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT) { gBattleMons[battleMonId].hp = data; if (!(val & (ITEM4_REVIVE >> 2)) && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { if (gBattleResults.numHealingItemsUsed < 255) gBattleResults.numHealingItemsUsed++; r5 = gActiveBattler; gActiveBattler = battleMonId; BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gActiveBattler = r5; } } } else { gBattleMoveDamage = -data; } retVal = FALSE; } val &= ~(ITEM4_REVIVE >> 2); break; case 3: // ITEM4_HEAL_PP if (!(val & (ITEM4_HEAL_PP_ONE >> 3))) { // Heal PP for all moves for (r5 = 0; r5 < MAX_MON_MOVES; r5++) { u16 move_id; data = GetMonData(mon, MON_DATA_PP1 + r5, NULL); move_id = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL); if (data != CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5)) { data += itemEffect[idx]; move_id = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL); if (data > CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5)) { move_id = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL); data = CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5); } SetMonData(mon, MON_DATA_PP1 + r5, &data); // Heal battler PP too (if applicable) if (gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT && MOVE_IS_PERMANENT(battleMonId, r5)) gBattleMons[battleMonId].pp[r5] = data; retVal = FALSE; } } idx++; } else { // Heal PP for one move u16 move_id; data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL); move_id = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); if (data != CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { data += itemEffect[idx++]; move_id = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); if (data > CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { move_id = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); data = CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); } SetMonData(mon, MON_DATA_PP1 + moveIndex, &data); // Heal battler PP too (if applicable) if (gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT && MOVE_IS_PERMANENT(battleMonId, moveIndex)) gBattleMons[battleMonId].pp[moveIndex] = data; retVal = FALSE; } } break; // cases 4-6 are ITEM4_HEAL_PP_ONE, ITEM4_PP_UP, and ITEM4_REVIVE, which // are already handled above by other cases or before the loop case 7: // ITEM4_EVO_STONE { u16 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_ITEM_USE, item); if (targetSpecies != SPECIES_NONE) { BeginEvolutionScene(mon, targetSpecies, FALSE, partyIndex); return FALSE; } } break; } } i++; val >>= 1; } break; // Handle ITEM5 effects (Change Def/SpDef/SpAtk/Speed EVs, PP Max, and friendship changes) case 5: val = itemEffect[cmdIndex]; i = 0; // Loop through and try each of the ITEM5 effects while (val != 0) { if (val & 1) { u16 evCount; switch (i) { case 0: // ITEM5_EV_DEF case 1: // ITEM5_EV_SPEED case 2: // ITEM5_EV_SPDEF case 3: // ITEM5_EV_SPATK evCount = GetMonEVCount(mon); dataSigned = GetMonData(mon, sGetMonDataEVConstants[i + 2], NULL); if(itemEffect[idx] != 201) // Not EV-reducing berry { // Has EV increase limit already been reached? if (evCount >= MAX_TOTAL_EVS) return TRUE; if (dataSigned >= EV_ITEM_RAISE_LIMIT) break; // Limit the increase if (dataSigned + itemEffect[idx] > EV_ITEM_RAISE_LIMIT) evDelta = EV_ITEM_RAISE_LIMIT - (dataSigned + itemEffect[idx]) + itemEffect[idx]; else evDelta = itemEffect[idx]; if (evCount + evDelta > MAX_TOTAL_EVS) evDelta += MAX_TOTAL_EVS - (evCount + evDelta); dataSigned += evDelta; } else { if (dataSigned == 0) { // No EVs to lose, but make sure friendship updates anyway friendshipOnly = TRUE; idx++; break; //do something with vars and break, EV is 0 already } dataSigned -= 10; if(dataSigned < 0) { dataSigned = 0; } } // Update EVs and stats SetMonData(mon, sGetMonDataEVConstants[i + 2], &dataSigned); CalculateMonStats(mon, TRUE); retVal = FALSE; idx++; break; case 4: // ITEM5_PP_MAX data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); // Check if 3 PP Ups have been applied already if (data < 3) { evDelta = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); data = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); data &= gPPUpClearMask[moveIndex]; data += gPPUpAddValues[moveIndex] * 3; // Apply 3 PP Ups (max) SetMonData(mon, MON_DATA_PP_BONUSES, &data); data = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - evDelta; data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + data; SetMonData(mon, MON_DATA_PP1 + moveIndex, &data); retVal = FALSE; } break; case 5: // ITEM5_FRIENDSHIP_LOW // Changes to friendship are given differently depending on // how much friendship the Pokémon already has. // In general, Pokémon with lower friendship receive more, // and Pokémon with higher friendship receive less. if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100) UPDATE_FRIENDSHIP_FROM_ITEM(); idx++; break; case 6: // ITEM5_FRIENDSHIP_MID if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200) UPDATE_FRIENDSHIP_FROM_ITEM(); idx++; break; case 7: // ITEM5_FRIENDSHIP_HIGH if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200) UPDATE_FRIENDSHIP_FROM_ITEM(); idx++; break; } } i++; val >>= 1; } break; } } return retVal; } static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) { u32 status = GetMonData(mon, MON_DATA_STATUS, NULL); if (status & healMask) { status &= ~healMask; SetMonData(mon, MON_DATA_STATUS, &status); if (gMain.inBattle && battleId != MAX_BATTLERS_COUNT) gBattleMons[battleId].status1 &= ~healMask; return FALSE; } else { return TRUE; } } bool8 PokemonItemUseNoEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex) { u32 data; s32 tmp; s32 cmdIndex; bool8 retVal = TRUE; const u8 *itemEffect; u8 idx = ITEM_EFFECT_ARG_START; u32 i; s32 sp18 = 0; u8 holdEffect; u8 battlerId = MAX_BATTLERS_COUNT; u16 heldItem; u8 curEffect; u32 curMoveId; // Get item hold effect heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (heldItem == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) holdEffect = gEnigmaBerries[gBattlerInMenuId].holdEffect; else holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; } else { holdEffect = ItemId_GetHoldEffect(heldItem); } // Get battler id (if relevant) gPotentialItemEffectBattler = gBattlerInMenuId; if (gMain.inBattle) { gActiveBattler = gBattlerInMenuId; for (cmdIndex = GetBattlerSide(gActiveBattler) != B_SIDE_PLAYER; cmdIndex < gBattlersCount; cmdIndex += 2) { if (gBattlerPartyIndexes[cmdIndex] == partyIndex) { battlerId = cmdIndex; break; } } } else { gActiveBattler = 0; battlerId = MAX_BATTLERS_COUNT; } // Skip using the item if it won't do anything if (!IS_POKEMON_ITEM(item)) return TRUE; if (gItemEffectTable[item - ITEM_POTION] == NULL && item != ITEM_ENIGMA_BERRY) return TRUE; // Get item effect if (item == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) itemEffect = gEnigmaBerries[gActiveBattler].itemEffect; else itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect; } else { itemEffect = gItemEffectTable[item - ITEM_POTION]; } for (cmdIndex = 0; cmdIndex < ITEM_EFFECT_ARG_START; cmdIndex++) { switch (cmdIndex) { // status healing effects case 0: // Cure infatuation if (itemEffect[cmdIndex] & ITEM0_INFATUATION && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && gBattleMons[battlerId].status2 & STATUS2_INFATUATION) retVal = FALSE; // Dire Hit if (itemEffect[cmdIndex] & ITEM0_DIRE_HIT && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY)) retVal = FALSE; // X Attack if ((itemEffect[cmdIndex] & ITEM0_X_ATTACK) && gBattleMons[gActiveBattler].statStages[STAT_ATK] < MAX_STAT_STAGE) retVal = FALSE; break; // Handle ITEM1 effects (in-battle stat boosting effects) case 1: // X Defend if ((itemEffect[cmdIndex] & ITEM1_X_DEFEND) && gBattleMons[gActiveBattler].statStages[STAT_DEF] < MAX_STAT_STAGE) retVal = FALSE; // X Speed if ((itemEffect[cmdIndex] & ITEM1_X_SPEED) && gBattleMons[gActiveBattler].statStages[STAT_SPEED] < MAX_STAT_STAGE) retVal = FALSE; break; // Handle ITEM2 effects (more stat boosting effects) case 2: // X Accuracy if ((itemEffect[cmdIndex] & ITEM2_X_ACCURACY) && gBattleMons[gActiveBattler].statStages[STAT_ACC] < MAX_STAT_STAGE) retVal = FALSE; // X Sp Attack if ((itemEffect[cmdIndex] & ITEM2_X_SPATK) && gBattleMons[gActiveBattler].statStages[STAT_SPATK] < MAX_STAT_STAGE) retVal = FALSE; break; // Handle ITEM3 effects (Guard Spec, Rare Candy, cure status case 3: // Guard Spec if ((itemEffect[cmdIndex] & ITEM3_GUARD_SPEC) && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0) retVal = FALSE; // Rare Candy if ((itemEffect[cmdIndex] & ITEM3_LEVEL_UP) && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) retVal = FALSE; // Cure status if ((itemEffect[cmdIndex] & ITEM3_SLEEP) && PartyMonHasStatus(mon, partyIndex, STATUS1_SLEEP, battlerId)) retVal = FALSE; if ((itemEffect[cmdIndex] & ITEM3_POISON) && PartyMonHasStatus(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battlerId)) retVal = FALSE; if ((itemEffect[cmdIndex] & ITEM3_BURN) && PartyMonHasStatus(mon, partyIndex, STATUS1_BURN, battlerId)) retVal = FALSE; if ((itemEffect[cmdIndex] & ITEM3_FREEZE) && PartyMonHasStatus(mon, partyIndex, STATUS1_FREEZE, battlerId)) retVal = FALSE; if ((itemEffect[cmdIndex] & ITEM3_PARALYSIS) && PartyMonHasStatus(mon, partyIndex, STATUS1_PARALYSIS, battlerId)) retVal = FALSE; if (itemEffect[cmdIndex] & ITEM3_CONFUSION // heal confusion && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)) retVal = FALSE; break; // Handle ITEM4 effects (Change HP/Atk EVs, HP heal, PP heal, PP up, Revive, and evolution stones) case 4: curEffect = itemEffect[cmdIndex]; // PP Up if (curEffect & ITEM4_PP_UP) { curEffect &= ~ITEM4_PP_UP; data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); i = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); if (data < 3 && i > 4) retVal = FALSE; } i = 0; // Loop through and try each of the remaining ITEM4 effects while (curEffect) { if (curEffect & 1) { switch (i) { case 0: // ITEM4_EV_HP case 1: // ITEM4_EV_ATK // Has EV increase limit already been reached? if (GetMonEVCount(mon) >= MAX_TOTAL_EVS) return TRUE; data = GetMonData(mon, sGetMonDataEVConstants[i], NULL); if (data < EV_ITEM_RAISE_LIMIT) { idx++; retVal = FALSE; } break; case 2: // ITEM4_HEAL_HP if (curEffect & (ITEM4_REVIVE >> 2)) { if (gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || GetMonData(mon, MON_DATA_HP, NULL) != 0) { idx++; break; } } else { if (GetMonData(mon, MON_DATA_HP, NULL) == 0) { idx++; break; } } if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL)) retVal = FALSE; idx++; curEffect &= ~(ITEM4_REVIVE >> 2); break; case 3: if (!(curEffect & (ITEM4_HEAL_PP_ONE >> 3))) { for (tmp = 0; tmp < MAX_MON_MOVES; tmp++) { data = GetMonData(mon, MON_DATA_PP1 + tmp, NULL); if (data != CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + tmp, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), tmp)) retVal = FALSE; } idx++; } else { data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL); curMoveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); if (data != CalculatePPWithBonus(curMoveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { idx++; retVal = FALSE; } } break; // cases 4-6 are ITEM4_HEAL_PP_ONE, ITEM4_PP_UP, and ITEM4_REVIVE, which // are already handled above by other cases or before the loop case 7: // ITEM4_EVO_STONE if (GetEvolutionTargetSpecies(mon, EVO_MODE_ITEM_USE, item) != SPECIES_NONE) return FALSE; break; } } i++; curEffect >>= 1; } break; // Handle ITEM5 effects (Change Def/SpDef/SpAtk/Speed EVs, PP Max, and friendship changes) case 5: curEffect = itemEffect[cmdIndex]; i = 0; // Loop through and try each of the ITEM5 effects while (curEffect) { if (curEffect & 1) { switch (i) { case 0: // ITEM5_EV_DEF case 1: // ITEM5_EV_SPEED case 2: // ITEM5_EV_SPDEF case 3: // ITEM5_EV_SPATK if (GetMonEVCount(mon) >= MAX_TOTAL_EVS) return TRUE; data = GetMonData(mon, sGetMonDataEVConstants[i + 2], NULL); if (data < EV_ITEM_RAISE_LIMIT) { retVal = FALSE; idx++; } break; case 4: // ITEM5_PP_MAX data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); tmp = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); // Check if 3 PP Ups have been applied already, and that the move has a total PP of at least 5 (excludes Sketch) if (data < 3 && tmp >= 5) retVal = FALSE; break; case 5: // ITEM5_FRIENDSHIP_LOW if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == FALSE && sp18 == 0) sp18 = itemEffect[idx]; idx++; break; case 6: // ITEM5_FRIENDSHIP_MID if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200 && retVal == FALSE && sp18 == 0) sp18 = itemEffect[idx]; idx++; break; case 7: // ITEM5_FRIENDSHIP_HIGH if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == FALSE && sp18 == 0) sp18 = itemEffect[idx]; idx++; break; } } i++; curEffect >>= 1; } break; } } return retVal; } static bool8 PartyMonHasStatus(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) { if ((GetMonData(mon, MON_DATA_STATUS, NULL) & healMask) != 0) return TRUE; else return FALSE; } u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) { const u8 *temp; const u8 *itemEffect; u8 offset; int i; u32 j; u8 val; offset = ITEM_EFFECT_ARG_START; temp = gItemEffectTable[itemId - ITEM_POTION]; if (!temp && itemId != ITEM_ENIGMA_BERRY) return 0; if (itemId == ITEM_ENIGMA_BERRY) { temp = gEnigmaBerries[gActiveBattler].itemEffect; } itemEffect = temp; for (i = 0; i < ITEM_EFFECT_ARG_START; i++) { switch (i) { case 0: case 1: case 2: case 3: if (i == effectByte) return 0; break; case 4: val = itemEffect[4]; if (val & ITEM4_PP_UP) val &= ~ITEM4_PP_UP; j = 0; while (val) { if (val & 1) { switch (j) { case 2: // ITEM4_HEAL_HP if (val & (ITEM4_REVIVE >> 2)) val &= ~(ITEM4_REVIVE >> 2); // fallthrough case 0: // ITEM4_EV_HP if (i == effectByte && (val & effectBit)) return offset; offset++; break; case 1: // ITEM4_EV_ATK if (i == effectByte && (val & effectBit)) return offset; offset++; break; case 3: // ITEM4_HEAL_PP if (i == effectByte && (val & effectBit)) return offset; offset++; break; case 7: // ITEM4_EVO_STONE if (i == effectByte) return 0; break; } } j++; val >>= 1; if (i == effectByte) effectBit >>= 1; } break; case 5: val = itemEffect[5]; j = 0; while (val) { if (val & 1) { switch (j) { case 0: // ITEM5_EV_DEF case 1: // ITEM5_EV_SPEED case 2: // ITEM5_EV_SPDEF case 3: // ITEM5_EV_SPATK case 4: // ITEM5_PP_MAX case 5: // ITEM5_FRIENDSHIP_LOW case 6: // ITEM5_FRIENDSHIP_MID if (i == effectByte && (val & effectBit)) return offset; offset++; break; case 7: // ITEM5_FRIENDSHIP_HIGH if (i == effectByte) return 0; break; } } j++; val >>= 1; if (i == effectByte) effectBit >>= 1; } break; } } return offset; } static void BufferStatRoseMessage(int statIdx) { gBattlerTarget = gBattlerInMenuId; StringCopy(gBattleTextBuff1, gStatNamesTable[sStatsToRaise[statIdx]]); StringCopy(gBattleTextBuff2, gBattleText_Rose); BattleStringExpandPlaceholdersToDisplayedString(gText_DefendersStatRose); } const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId) { int i; const u8 *itemEffect; if (itemId == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) { itemEffect = gEnigmaBerries[gBattlerInMenuId].itemEffect; } else { itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect; } } else { itemEffect = gItemEffectTable[itemId - ITEM_POTION]; } gPotentialItemEffectBattler = gBattlerInMenuId; for (i = 0; i < 3; i++) { if (itemEffect[i] & (ITEM0_X_ATTACK | ITEM1_X_SPEED | ITEM2_X_SPATK)) BufferStatRoseMessage(i * 2); if (itemEffect[i] & (ITEM0_DIRE_HIT | ITEM1_X_DEFEND | ITEM2_X_ACCURACY)) { if (i != 0) // Dire Hit is the only ITEM0 above { BufferStatRoseMessage(i * 2 + 1); } else { gBattlerAttacker = gBattlerInMenuId; BattleStringExpandPlaceholdersToDisplayedString(gBattleText_GetPumped); } } } if (itemEffect[3] & ITEM3_GUARD_SPEC) { gBattlerAttacker = gBattlerInMenuId; BattleStringExpandPlaceholdersToDisplayedString(gBattleText_MistShroud); } return gDisplayedStringBattle; } u8 GetNature(struct Pokemon *mon) { return GetMonData(mon, MON_DATA_PERSONALITY, NULL) % NUM_NATURES; } u8 GetNatureFromPersonality(u32 personality) { return personality % NUM_NATURES; } u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) { int i; u16 targetSpecies = 0; u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); u8 level; u16 friendship; u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, NULL); u16 upperPersonality = personality >> 16; u8 holdEffect; if (heldItem == ITEM_ENIGMA_BERRY) holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; else holdEffect = ItemId_GetHoldEffect(heldItem); // Prevent evolution with Everstone, unless we're just viewing the party menu with an evolution item if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != EVO_MODE_ITEM_CHECK) return 0; switch (type) { case EVO_MODE_NORMAL: level = GetMonData(mon, MON_DATA_LEVEL, NULL); friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); for (i = 0; i < EVOS_PER_MON; i++) { switch (gEvolutionTable[species][i].method) { case EVO_FRIENDSHIP: if (friendship >= 220) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_DAY: //changed to evolve by friendship outdoors (Towns and routes) if (gMapHeader.mapType < MAP_TYPE_UNDERGROUND && friendship >= 220) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_NIGHT: //changed to evolve by friendship indoors (Caves and Indoors) if (gMapHeader.mapType >= MAP_TYPE_UNDERGROUND && friendship >= 220) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL: if (gEvolutionTable[species][i].param <= level) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_GT_DEF: if (gEvolutionTable[species][i].param <= level) if (GetMonData(mon, MON_DATA_ATK, NULL) > GetMonData(mon, MON_DATA_DEF, NULL)) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_EQ_DEF: if (gEvolutionTable[species][i].param <= level) if (GetMonData(mon, MON_DATA_ATK, NULL) == GetMonData(mon, MON_DATA_DEF, NULL)) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_LT_DEF: if (gEvolutionTable[species][i].param <= level) if (GetMonData(mon, MON_DATA_ATK, NULL) < GetMonData(mon, MON_DATA_DEF, NULL)) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_SILCOON: if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_CASCOON: if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_NINJASK: if (gEvolutionTable[species][i].param <= level) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_BEAUTY: if (gEvolutionTable[species][i].param <= beauty) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; } } break; case EVO_MODE_TRADE: for (i = 0; i < EVOS_PER_MON; i++) { switch (gEvolutionTable[species][i].method) { case EVO_TRADE: targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_TRADE_ITEM: if (gEvolutionTable[species][i].param == heldItem) { targetSpecies = gEvolutionTable[species][i].targetSpecies; heldItem = ITEM_NONE; SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem); targetSpecies = gEvolutionTable[species][i].targetSpecies; } break; } } break; case EVO_MODE_ITEM_USE: case EVO_MODE_ITEM_CHECK: for (i = 0; i < EVOS_PER_MON; i++) { if (gEvolutionTable[species][i].method == EVO_ITEM && gEvolutionTable[species][i].param == evolutionItem) { targetSpecies = gEvolutionTable[species][i].targetSpecies; break; } if (gEvolutionTable[species][i].method == EVO_STONE_HELD && gEvolutionTable[species][i].param == evolutionItem && gEvolutionTable[species][i].param2 == heldItem) { targetSpecies = gEvolutionTable[species][i].targetSpecies; break; } } break; } return targetSpecies; } static u16 HoennPokedexNumToSpecies(u16 hoennNum) { u16 species; if (!hoennNum) return 0; species = 0; while (species < NUM_SPECIES - 1 && sSpeciesToHoennPokedexNum[species] != hoennNum) species++; if (species == NUM_SPECIES - 1) return 0; return species + 1; } u16 NationalPokedexNumToSpecies(u16 nationalNum) { u16 species; if (!nationalNum) return 0; species = 0; while (species < NUM_SPECIES - 1 && sSpeciesToNationalPokedexNum[species] != nationalNum) species++; if (species == NUM_SPECIES - 1) return 0; return species + 1; } u16 ExtendedPokedexNumToSpecies(u16 nationalNum) { u16 species; if (!nationalNum) return 0; species = 0; while (species < NUM_SPECIES - 1 && sSpeciesToExtendedPokedexNum[species] != nationalNum) species++; if (species == NUM_SPECIES - 1) return 0; return species + 1; } static u16 NationalToHoennOrder(u16 nationalNum) { u16 hoennNum; if (!nationalNum) return 0; hoennNum = 0; while (hoennNum < NUM_SPECIES - 1 && sHoennToNationalOrder[hoennNum] != nationalNum) hoennNum++; if (hoennNum == NUM_SPECIES - 1) return 0; return hoennNum + 1; } u16 NationalToExtendedOrder(u16 nationalNum) { u16 extendedNum; if (!nationalNum) return 0; extendedNum = 0; while (extendedNum < NUM_SPECIES - 1 && sExtendedToNationalOrder[extendedNum] != nationalNum) extendedNum++; if (extendedNum == NUM_SPECIES - 1) return 0; return extendedNum + 1; } u16 SpeciesToNationalPokedexNum(u16 species) { if (!species) return 0; return sSpeciesToNationalPokedexNum[species - 1]; } static u16 SpeciesToHoennPokedexNum(u16 species) { if (!species) return 0; return sSpeciesToHoennPokedexNum[species - 1]; } u16 SpeciesToExtendedPokedexNum(u16 species) { if (!species) return 0; return sSpeciesToExtendedPokedexNum[species - 1]; } u16 HoennToNationalOrder(u16 hoennNum) { if (!hoennNum) return 0; return sHoennToNationalOrder[hoennNum - 1]; } u16 ExtendedToNationalOrder(u16 extendedNum) { if (!extendedNum) return 0; return sExtendedToNationalOrder[extendedNum - 1]; } u16 SpeciesToCryId(u16 species) { if (species < SPECIES_OLD_UNOWN_B - 1) return species; if (species <= SPECIES_OLD_UNOWN_Z - 1) return SPECIES_UNOWN - 1; return sHoennSpeciesIdToCryId[species - ((SPECIES_OLD_UNOWN_Z + 1) - 1)]; } // Spots can be drawn on Spinda's color indexes 1, 2, or 3 #define FIRST_SPOT_COLOR 1 #define LAST_SPOT_COLOR 3 // To draw a spot pixel, add 4 to the color index #define SPOT_COLOR_ADJUSTMENT 4 /* The macro below handles drawing the randomly-placed spots on Spinda's front sprite. Spinda has 4 spots, each with an entry in sSpindaSpotGraphics. Each entry contains a base x and y coordinate for the spot and a 16x16 binary image. Each bit in the image determines whether that pixel should be considered part of the spot. The position of each spot is randomized using the Spinda's personality. The entire 32 bit personality value is used, 4 bits for each coordinate of the 4 spots. If the personality value is 0x87654321, then 0x1 will be used for the 1st spot's x coord, 0x2 will be used for the 1st spot's y coord, 0x3 will be used for the 2nd spot's x coord, and so on. Each coordinate is calculated as (baseCoord + (given 4 bits of personality) - 8). In effect this means each spot can start at any position -8 to +7 off of its base coordinates (256 possibilities). The macro then loops over the 16x16 spot image. For each bit in the spot's binary image, if the bit is set then it's part of the spot; try to draw it. A pixel is drawn on Spinda if the pixel on Spinda satisfies the following formula: ((u8)(colorIndex - 1) <= 2). The -1 excludes transparent pixels, as these are index 0. Therefore only colors 1, 2, or 3 on Spinda will allow a spot to be drawn. These color indexes are Spinda's light brown body colors. To create the spot it adds 4 to the color index, so Spinda's spots will be colors 5, 6, and 7. The above is done two different ways in the macro: one with << 4, and one without. This is because Spinda's sprite is a 4 bits per pixel image, but the pointer to Spinda's pixels (destPixels) is an 8 bit pointer, so it addresses two pixels. Shifting by 4 accesses the 2nd of these pixels, so this is done every other time. */ #define DRAW_SPINDA_SPOTS(personality, dest) \ { \ s32 i; \ for (i = 0; i < (s32)ARRAY_COUNT(sSpindaSpotGraphics); i++) \ { \ s32 row; \ u8 x = sSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); \ u8 y = sSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); \ \ for (row = 0; row < SPINDA_SPOT_HEIGHT; row++) \ { \ s32 column; \ s32 spotPixelRow = sSpindaSpotGraphics[i].image[row]; \ \ for (column = x; column < x + SPINDA_SPOT_WIDTH; column++) \ { \ /* Get target pixels on Spinda's sprite */ \ u8 *destPixels = dest + ((column / 8) * TILE_SIZE_4BPP) + \ ((column % 8) / 2) + \ ((y / 8) * TILE_SIZE_4BPP * 8) + \ ((y % 8) * 4); \ \ /* Is this pixel in the 16x16 spot image part of the spot? */ \ if (spotPixelRow & 1) \ { \ /* destPixels addressess two pixels, alternate which */ \ /* of the two pixels is being considered for drawing */ \ if (column & 1) \ { \ /* Draw spot pixel if this is Spinda's body color */ \ if ((u8)((*destPixels & 0xF0) - (FIRST_SPOT_COLOR << 4))\ <= ((LAST_SPOT_COLOR - FIRST_SPOT_COLOR) << 4))\ *destPixels += (SPOT_COLOR_ADJUSTMENT << 4); \ } \ else \ { \ /* Draw spot pixel if this is Spinda's body color */ \ if ((u8)((*destPixels & 0xF) - FIRST_SPOT_COLOR) \ <= (LAST_SPOT_COLOR - FIRST_SPOT_COLOR)) \ *destPixels += SPOT_COLOR_ADJUSTMENT; \ } \ } \ \ spotPixelRow >>= 1; \ } \ \ y++; \ } \ \ personality >>= 8; \ } \ } // Same as DrawSpindaSpots but attempts to discern for itself whether or // not it's the front pic. static void DrawSpindaSpotsUnused(u16 species, u32 personality, u8 *dest) { if (species == SPECIES_SPINDA && dest != gMonSpritesGfxPtr->sprites[B_POSITION_PLAYER_LEFT] && dest != gMonSpritesGfxPtr->sprites[B_POSITION_PLAYER_RIGHT]) DRAW_SPINDA_SPOTS(personality, dest); } void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, bool8 isFrontPic) { if (species == SPECIES_SPINDA && isFrontPic) DRAW_SPINDA_SPOTS(personality, dest); } void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) { u8 language; GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); language = GetMonData(mon, MON_DATA_LANGUAGE, &language); if (language == GAME_LANGUAGE && !StringCompare(gSpeciesNames[oldSpecies], gStringVar1)) SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); } // The below two functions determine which side of a multi battle the trainer battles on // 0 is the left (top in party menu), 1 is right (bottom in party menu) u8 GetPlayerFlankId(void) { u8 flankId = 0; switch (gLinkPlayers[GetMultiplayerId()].id) { case 0: case 3: flankId = 0; break; case 1: case 2: flankId = 1; break; } return flankId; } u16 GetLinkTrainerFlankId(u8 linkPlayerId) { u16 flankId = 0; switch (gLinkPlayers[linkPlayerId].id) { case 0: case 3: flankId = 0; break; case 1: case 2: flankId = 1; break; } return flankId; } s32 GetBattlerMultiplayerId(u16 id) { s32 multiplayerId; for (multiplayerId = 0; multiplayerId < MAX_LINK_PLAYERS; multiplayerId++) if (gLinkPlayers[multiplayerId].id == id) break; return multiplayerId; } u8 GetTrainerEncounterMusicId(u16 trainerId) { struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; return ((sTrainers[trainerId].encounterMusic_gender & 0x7F)); } static u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) { // Because this is a u16 it will be unable to store the // result of the multiplication for any stat > 595 for a // positive nature and > 728 for a negative nature. // Neither occur in the base game, but this can happen if // any Nature-affected base stat is increased to a value // above 248. The closest by default is Shuckle at 230. #ifdef BUGFIX u32 retVal; #else u16 retVal; #endif // Don't modify HP, Accuracy, or Evasion by nature if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS) return stat; switch (sNatureStatTable[nature][statIndex - 1]) { case 1: retVal = stat * 110; retVal /= 100; break; case -1: retVal = stat * 90; retVal /= 100; break; default: retVal = stat; break; } return retVal; } void AdjustFriendship(struct Pokemon *mon, u8 event) { u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL); u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); u8 holdEffect; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (heldItem == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) holdEffect = gEnigmaBerries[0].holdEffect; else holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; } else { holdEffect = ItemId_GetHoldEffect(heldItem); } if (species && species != SPECIES_EGG) { s8 delta; // Friendship level refers to the column in sFriendshipEventDeltas. // 0-99: Level 0 (maximum increase, typically) // 100-199: Level 1 // 200-255: Level 2 u8 friendshipLevel = 0; s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); if (friendship >= 100) friendshipLevel++; if (friendship >= 200) friendshipLevel++; if (event == FRIENDSHIP_EVENT_WALKING) { // 50% chance every 128 steps if (Random() & 1) return; } if (event == FRIENDSHIP_EVENT_LEAGUE_BATTLE) { // Only if it's a trainer battle with league progression significance if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) return; if (!(sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER || sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR || sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)) return; } delta = sFriendshipEventDeltas[event][friendshipLevel]; if (delta > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) // 50% increase, rounding down delta = (150 * delta) / 100; friendship += delta; if (delta > 0) { if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) friendship++; if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) friendship++; } if (friendship < 0) friendship = 0; if (friendship > MAX_FRIENDSHIP) friendship = MAX_FRIENDSHIP; SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); } } void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) { u8 evs[NUM_STATS]; u16 evIncrease = 0; u16 totalEVs = 0; u16 heldItem; u8 holdEffect; int i; for (i = 0; i < NUM_STATS; i++) { evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, NULL); totalEVs += evs[i]; } for (i = 0; i < NUM_STATS; i++) { u8 hasHadPokerus; int multiplier; if (totalEVs >= MAX_TOTAL_EVS) break; hasHadPokerus = CheckPartyHasHadPokerus(mon, 0); if (hasHadPokerus) multiplier = 2; else multiplier = 1; switch (i) { case STAT_HP: evIncrease = gSpeciesInfo[defeatedSpecies].evYield_HP * multiplier; break; case STAT_ATK: evIncrease = gSpeciesInfo[defeatedSpecies].evYield_Attack * multiplier; break; case STAT_DEF: evIncrease = gSpeciesInfo[defeatedSpecies].evYield_Defense * multiplier; break; case STAT_SPEED: evIncrease = gSpeciesInfo[defeatedSpecies].evYield_Speed * multiplier; break; case STAT_SPATK: evIncrease = gSpeciesInfo[defeatedSpecies].evYield_SpAttack * multiplier; break; case STAT_SPDEF: evIncrease = gSpeciesInfo[defeatedSpecies].evYield_SpDefense * multiplier; break; } heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (heldItem == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) holdEffect = gEnigmaBerries[0].holdEffect; else holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; } else { holdEffect = ItemId_GetHoldEffect(heldItem); } if (holdEffect == HOLD_EFFECT_MACHO_BRACE) evIncrease *= 2; if (totalEVs + (s16)evIncrease > MAX_TOTAL_EVS) evIncrease = ((s16)evIncrease + MAX_TOTAL_EVS) - (totalEVs + evIncrease); if (evs[i] + (s16)evIncrease > MAX_PER_STAT_EVS) { int val1 = (s16)evIncrease + MAX_PER_STAT_EVS; int val2 = evs[i] + evIncrease; evIncrease = val1 - val2; } evs[i] += evIncrease; totalEVs += evIncrease; SetMonData(mon, MON_DATA_HP_EV + i, &evs[i]); } } u16 GetMonEVCount(struct Pokemon *mon) { int i; u16 count = 0; for (i = 0; i < NUM_STATS; i++) count += GetMonData(mon, MON_DATA_HP_EV + i, NULL); return count; } // This function was stubbed from RS, but it is stubbed badly. // This variable is likely the u8 passed to SetMonData in RSE. // The pointer reference causes agbcc to reserve it on the stack before even checking // whether it's used. void RandomlyGivePartyPokerus(struct Pokemon *party) { u8 foo; &foo; } u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) { u8 retVal; int partyIndex = 0; unsigned curBit = 1; retVal = 0; if (selection) { do { if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, NULL) & 0xF)) retVal |= curBit; partyIndex++; curBit <<= 1; selection >>= 1; } while (selection); } else if (GetMonData(&party[0], MON_DATA_POKERUS, NULL) & 0xF) { retVal = 1; } return retVal; } u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) { u8 retVal; int partyIndex = 0; unsigned curBit = 1; retVal = 0; if (selection) { do { if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, NULL)) retVal |= curBit; partyIndex++; curBit <<= 1; selection >>= 1; } while (selection); } else if (GetMonData(&party[0], MON_DATA_POKERUS, NULL)) { retVal = 1; } return retVal; } // These two functions are stubbed from RS, but they're stubbed badly. // See note on RandomlyGivePartyPokerus above. static void UpdatePartyPokerusTime(void) { u8 foo; &foo; } void PartySpreadPokerus(struct Pokemon *party) { u8 foo; &foo; } static void SetMonExpWithMaxLevelCheck(struct Pokemon *mon, int species, u8 unused, u32 data) { if (data > gExperienceTables[gSpeciesInfo[species].growthRate][MAX_LEVEL]) { data = gExperienceTables[gSpeciesInfo[species].growthRate][MAX_LEVEL]; SetMonData(mon, MON_DATA_EXP, &data); } } bool8 TryIncrementMonLevel(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); u8 newLevel = level + 1; u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); if (level < MAX_LEVEL) { if (exp > gExperienceTables[gSpeciesInfo[species].growthRate][newLevel]) { SetMonData(mon, MON_DATA_LEVEL, &newLevel); SetMonExpWithMaxLevelCheck(mon, species, newLevel, exp); return TRUE; } else return FALSE; } else { SetMonExpWithMaxLevelCheck(mon, species, level, exp); return FALSE; } } u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm) { u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL); const u8 *learnableMoves; if (species == SPECIES_EGG) { return 0; } learnableMoves = gTMHMLearnsets[species]; while (*learnableMoves != 0xFF) { if (*learnableMoves == tm) return TRUE; learnableMoves++; } return FALSE; } u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) { u16 learnedMoves[MAX_MON_MOVES]; u8 numMoves = 0; u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); bool8 isHatched = FALSE; int ii, jj, i, j, k; u8 deoxysForme; s8 numInLine; u16 maxEvo; u8 tempMoveNum; u16 evoLine[EVOS_PER_LINE] = {SPECIES_NONE, SPECIES_NONE, SPECIES_NONE, SPECIES_NONE, SPECIES_NONE, SPECIES_NONE}; if(GetMonData(mon, MON_DATA_MET_LEVEL, 0) == 0) { isHatched = TRUE; } else if((species == SPECIES_WYNAUT || species == SPECIES_WOBBUFFET) && GetMonData(mon, MON_DATA_MET_LOCATION, 0) == MAPSEC_ROUTE_130) { //Wynaut/Wobbuffet caught on Mirage Island can relearn baby moves; only catchable baby in Gen 3 isHatched = TRUE; } else if((species == SPECIES_ELEKID || species == SPECIES_ELECTABUZZ) && GetMonData(mon, MON_DATA_MET_LEVEL, 0) == 20 && GetMonData(mon, MON_DATA_MET_GAME, 0) == VERSION_GAMECUBE) { //Hordel's Elekid can relearn baby moves; only other unbred baby in Gen 3 isHatched = TRUE; } for (i = 0; i < MAX_MON_MOVES; i++) learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); if(species == SPECIES_DEOXYS) { deoxysForme = GetMonData(mon, MON_DATA_FORME, 0); for (i = 0; i < 20; i++) { u16 moveLevel; if (sDeoxysLevelUpLearnsets[deoxysForme][i] == LEVEL_UP_END) break; moveLevel = sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_LV; if (moveLevel <= (level << 9)) { for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID); j++) ; if (j == MAX_MON_MOVES) { for (k = 0; k < numMoves && moves[k] != (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID); k++) ; if (k == numMoves) moves[numMoves++] = sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID; } } } } else { bool8 addMove = TRUE; numInLine = PopulateSpeciesEvoLineForRelearner(species, isHatched, evoLine); for(ii = 0; ii < numInLine; ii++) { species = evoLine[ii]; //mgba_printf(MGBA_LOG_DEBUG, "Top of ii loop species: %d %s", species, ConvertToAscii(gSpeciesNames[species])); for (i = 0; i < 20; i++) { u16 moveLevel; if (gLevelUpLearnsets[species][i] == LEVEL_UP_END) break; moveLevel = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_LV; if (moveLevel <= (level << 9)) { //mgba_printf(MGBA_LOG_DEBUG, "Considering adding: %d %s", species, ConvertToAscii(gMoveNames[gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID])); for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); j++) ; //skips adding already-known moves to list if (j == MAX_MON_MOVES) //if skipped all already-known moves { for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); k++) ; //skips moves that have already been added to the list? if (k == numMoves) //adds moves to back of list { if(addMove) { moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID; addMove = TRUE; } } } } } } numInLine -= 1; if(numInLine == 0) return numMoves; maxEvo = numInLine; tempMoveNum = numMoves; for(ii = 0; ii < tempMoveNum; ii++) { numInLine = maxEvo - 1; //mgba_printf(MGBA_LOG_DEBUG, "Considering removing: %s", ConvertToAscii(gMoveNames[moves[ii]])); for(i = 0; i < 20 && gLevelUpLearnsets[evoLine[maxEvo]][i] != LEVEL_UP_END; i++) { //mgba_printf(MGBA_LOG_DEBUG, "Max evo is %d: %s", evoLine[maxEvo], ConvertToAscii(gSpeciesNames[evoLine[maxEvo]])); //mgba_printf(MGBA_LOG_DEBUG, "Checking move %s in maxEvo's learnset.", ConvertToAscii(gMoveNames[gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_ID])); if(moves[ii] == (gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_ID)) { //found move in max evo list //mgba_printf(MGBA_LOG_DEBUG, "Found move %s in maxEvo's learnset.", ConvertToAscii(gMoveNames[moves[ii]])); //mgba_printf(MGBA_LOG_DEBUG, "numInLine == %d", numInLine); while(numInLine > -1) //check all pre-evos for move { //mgba_printf(MGBA_LOG_DEBUG, "numInLine == %d", numInLine); for(j = 0; j < 20 && gLevelUpLearnsets[evoLine[numInLine]][j] != LEVEL_UP_END; j++) { if(moves[ii] == (gLevelUpLearnsets[evoLine[numInLine]][j] & LEVEL_UP_MOVE_ID)) { //found move in preevo list //mgba_printf(MGBA_LOG_DEBUG, "Found move %s in preEvo's learnset.", ConvertToAscii(gMoveNames[moves[ii]])); //mgba_printf(MGBA_LOG_DEBUG, "About to check maxEvo's learnset for %s 's level.", ConvertToAscii(gMoveNames[(gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_ID)])); if((gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_LV) > (level << 9)) { //max evo too low to know this move, remove it //mgba_printf(MGBA_LOG_DEBUG, "Move level found is %d.", (gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_LV) >> 9); //mgba_printf(MGBA_LOG_DEBUG, "Actual mon level is %d.", level); //mgba_printf(MGBA_LOG_DEBUG, "Removing move %s in moves array.", ConvertToAscii(gMoveNames[moves[ii]])); moves[ii] = MOVE_NONE; numMoves--; } } } numInLine--; } } } } //mgba_printf(MGBA_LOG_DEBUG, "Before removing gaps."); //for(i = 0; i < 20; i++) //mgba_printf(MGBA_LOG_DEBUG, "List Move %d is %s.", i, ConvertToAscii(gMoveNames[moves[i]])); for(i = 0; i < 20; i++) //compact moves to remove gaps { //mgba_printf(MGBA_LOG_DEBUG, "i is %d.", i); if(moves[i] != MOVE_NONE) { //mgba_printf(MGBA_LOG_DEBUG, "moves[i] is not MOVE_NONE, continuing."); continue; } for(j = i; j < 20; j++) { //mgba_printf(MGBA_LOG_DEBUG, "j is %d.", j); if(moves[j] == MOVE_NONE) { //mgba_printf(MGBA_LOG_DEBUG, "moves[j] is MOVE_NONE, continuing."); continue; } //mgba_printf(MGBA_LOG_DEBUG, "moves[j] is %s", ConvertToAscii(gMoveNames[moves[j]])); moves[i] = moves[j]; //mgba_printf(MGBA_LOG_DEBUG, "moves[i] now is %s", ConvertToAscii(gMoveNames[moves[j]])); moves[j] = MOVE_NONE; //mgba_printf(MGBA_LOG_DEBUG, "moves[j] now is MOVE_NONE"); break; } } //mgba_printf(MGBA_LOG_DEBUG, "After removing gaps."); //for(i = 0; i < 20; i++) //mgba_printf(MGBA_LOG_DEBUG, "List Move %d is %s.", i, ConvertToAscii(gMoveNames[moves[i]])); } return numMoves; } static u8 PopulateSpeciesEvoLineForRelearner(u16 species, bool8 isHatched, u16 evoLine[]) { s32 i; s32 j; u8 numInLine = 0; u16 speciesToRemove1 = SPECIES_NONE; u16 speciesToRemove2 = SPECIES_NONE; if((species >= SPECIES_VAPOREON && species <= SPECIES_FLAREON) || (species == SPECIES_ESPEON || species == SPECIES_UMBREON)) { //Eevee special handling evoLine[0] = SPECIES_EEVEE; evoLine[1] = species; numInLine = 2; return numInLine; } for (i = EVOS_PER_LINE - 1; i > -1; i--) //starting at highest evo { if(gEvolutionLines[species][i] <= species) //start at move relearner's species and work down (babies not included) evoLine[i] = gEvolutionLines[species][i]; if(isHatched && gEvolutionLines[species][i] > species && i == 0) //add baby if move relearner mon was hatched && has baby form evoLine[i] = gEvolutionLines[species][i]; } switch(species) //remove species if branched evo and not in current branch { case SPECIES_BELLOSSOM: speciesToRemove1 = SPECIES_VILEPLUME; break; case SPECIES_POLITOED: speciesToRemove1 = SPECIES_POLIWRATH; break; case SPECIES_SLOWKING: speciesToRemove1 = SPECIES_SLOWBRO; break; case SPECIES_HITMONTOP: speciesToRemove1 = SPECIES_HITMONCHAN; speciesToRemove2 = SPECIES_HITMONLEE; break; case SPECIES_HITMONCHAN: speciesToRemove1 = SPECIES_HITMONLEE; break; case SPECIES_CASCOON: case SPECIES_DUSTOX: speciesToRemove1 = SPECIES_SILCOON; speciesToRemove2 = SPECIES_BEAUTIFLY; break; case SPECIES_SHEDINJA: speciesToRemove1 = SPECIES_NINJASK; break; case SPECIES_GOREBYSS: speciesToRemove1 = SPECIES_HUNTAIL; break; } for(i = 0; i < EVOS_PER_LINE; i++) //actual removal { if(speciesToRemove1 != SPECIES_NONE) { if(evoLine[i] == speciesToRemove1) evoLine[i] = SPECIES_NONE; } if(speciesToRemove2 != SPECIES_NONE) { if(evoLine[i] == speciesToRemove2) evoLine[i] = SPECIES_NONE; } } //mgba_printf(MGBA_LOG_DEBUG, "Before compaction:", numInLine); //for(i = 0; i < EVOS_PER_LINE; i++) //mgba_printf(MGBA_LOG_DEBUG, "%d %s", evoLine[i], ConvertToAscii(gSpeciesNames[evoLine[i]])); for(i = 0; i < EVOS_PER_LINE; i++) //compact species to front { if(evoLine[i] != SPECIES_NONE) { continue; } for(j = i; j < EVOS_PER_LINE; j++) { if(evoLine[j] == SPECIES_NONE) continue; evoLine[i] = evoLine[j]; evoLine[j] = SPECIES_NONE; break; } } for(i = 0; i < EVOS_PER_LINE; i++) { if(evoLine[i] != SPECIES_NONE) numInLine++; } //mgba_printf(MGBA_LOG_DEBUG, "numInLine == %d; Result of compaction:", numInLine); //for(i = 0; i < EVOS_PER_LINE; i++) //mgba_printf(MGBA_LOG_DEBUG, "%d %s", evoLine[i], ConvertToAscii(gSpeciesNames[evoLine[i]])); return numInLine; } u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) { u8 numMoves = 0; int i; for (i = 0; i < MAX_LEVEL_UP_MOVES && gLevelUpLearnsets[species][i] != LEVEL_UP_END; i++) moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID; return numMoves; } u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) { u16 learnedMoves[MAX_MON_MOVES]; u16 moves[MAX_LEVEL_UP_MOVES]; u8 numMoves = 0; u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL); u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); int i, j, k; u8 deoxysForme; if (species == SPECIES_EGG) return 0; for (i = 0; i < MAX_MON_MOVES; i++) learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); if(species == SPECIES_DEOXYS) { deoxysForme = GetMonData(mon, MON_DATA_FORME, 0); for (i = 0; i < MAX_LEVEL_UP_MOVES; i++) { u16 moveLevel; if (sDeoxysLevelUpLearnsets[deoxysForme][i] == LEVEL_UP_END) break; moveLevel = sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_LV; if (moveLevel <= (level << 9)) { for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID); j++) ; if (j == MAX_MON_MOVES) { for (k = 0; k < numMoves && moves[k] != (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID); k++) ; if (k == numMoves) moves[numMoves++] = sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID; } } } } else { for (i = 0; i < MAX_LEVEL_UP_MOVES; i++) { u16 moveLevel; if (gLevelUpLearnsets[species][i] == LEVEL_UP_END) break; moveLevel = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_LV; if (moveLevel <= (level << 9)) { for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); j++) ; if (j == MAX_MON_MOVES) { for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); k++) ; if (k == numMoves) moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID; } } } } return numMoves; } u16 SpeciesToPokedexNum(u16 species) { species = SpeciesToNationalPokedexNum(species); if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled()) { species = SpeciesToExtendedPokedexNum(species); if(species > EXTENDED_DEX_COUNT) return 0xFFFF; return species; } if (!IsNationalPokedexEnabled() && species > KANTO_SPECIES_END) return 0xFFFF; return species; } void ClearBattleMonForms(void) { int i; for (i = 0; i < MAX_BATTLERS_COUNT; i++) gBattleMonForms[i] = 0; } static u16 GetBattleBGM(void) { struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) return MUS_VS_KYOGRE_GROUDON; if (gBattleTypeFlags & BATTLE_TYPE_REGI) return MUS_VS_REGI; if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) return MUS_C_VS_LEGEND_BEAST; if (gBattleTypeFlags & BATTLE_TYPE_LINK) return MUS_RS_VS_TRAINER; if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) return MUS_RS_VS_TRAINER; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { switch (sTrainers[gTrainerBattleOpponent_A].trainerClass) { case TRAINER_CLASS_PKMN_PROF: case TRAINER_CLASS_CHAMPION: return MUS_VS_CHAMPION; case TRAINER_CLASS_LEADER: case TRAINER_CLASS_ELITE_FOUR: return MUS_VS_GYM_LEADER; case TRAINER_CLASS_BOSS: case TRAINER_CLASS_TEAM_ROCKET: case TRAINER_CLASS_COOLTRAINER: case TRAINER_CLASS_GENTLEMAN: case TRAINER_CLASS_RIVAL_LATE: default: return MUS_VS_TRAINER; } } if ((gMapHeader.regionMapSectionId == MAPSEC_ARTISAN_CAVE || gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER) && !(gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)) { return MUS_RS_VS_WILD; } return MUS_VS_WILD; } void PlayBattleBGM(void) { ResetMapMusic(); m4aMPlayAllStop(); PlayBGM(GetBattleBGM()); } void PlayMapChosenOrBattleBGM(u16 songId) { ResetMapMusic(); m4aMPlayAllStop(); if (songId) PlayNewMapMusic(songId); else PlayNewMapMusic(GetBattleBGM()); } const u32 *GetMonFrontSpritePal(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL); u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); return GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality); } const u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality) { u32 shinyValue; shinyValue = GET_SHINY_VALUE(otId, personality); if (species >= 65530 && species <= 65533) //Deoxys { if(shinyValue < SHINY_ODDS) return gMonShinyPaletteTable[SPECIES_DEOXYS].data; else return gMonPaletteTable[SPECIES_DEOXYS].data; } if (species > SPECIES_EGG) return gMonPaletteTable[0].data; if (shinyValue < SHINY_ODDS) return gMonShinyPaletteTable[species].data; else return gMonPaletteTable[species].data; } const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL); u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); } const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality) { u32 shinyValue; shinyValue = GET_SHINY_VALUE(otId, personality); if (species >= 65530 && species <= 65533) //Deoxys { if(shinyValue < SHINY_ODDS) return &gMonShinyPaletteTable[SPECIES_DEOXYS]; else return &gMonPaletteTable[SPECIES_DEOXYS]; } if (shinyValue < SHINY_ODDS) return &gMonShinyPaletteTable[species]; else return &gMonPaletteTable[species]; } bool32 IsHMMove2(u16 move) { int i = 0; while (sHMMoves[i] != HM_MOVES_END) { if (sHMMoves[i++] == move) return TRUE; } return FALSE; } bool8 IsMonSpriteNotFlipped(u16 species) { return gSpeciesInfo[species].noFlip; } static s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor) { u8 nature = GetNature(mon); return sPokeblockFlavorCompatibilityTable[nature * FLAVOR_COUNT + flavor]; } s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor) { u8 nature = GetNatureFromPersonality(personality); return sPokeblockFlavorCompatibilityTable[nature * FLAVOR_COUNT + flavor]; } bool8 IsTradedMon(struct Pokemon *mon) { u8 otName[PLAYER_NAME_LENGTH + 1]; u32 otId; GetMonData(mon, MON_DATA_OT_NAME, otName); otId = GetMonData(mon, MON_DATA_OT_ID, NULL); return IsOtherTrainer(otId, otName); } bool8 IsOtherTrainer(u32 otId, u8 *otName) { if (otId == (gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24))) { int i; for (i = 0; otName[i] != EOS; i++) if (otName[i] != gSaveBlock2Ptr->playerName[i]) return TRUE; return FALSE; } return TRUE; } void MonRestorePP(struct Pokemon *mon) { BoxMonRestorePP(&mon->box); } void BoxMonRestorePP(struct BoxPokemon *boxMon) { int i; for (i = 0; i < MAX_MON_MOVES; i++) { if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0)) { u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0); u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0); u8 pp = CalculatePPWithBonus(move, bonus, i); SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp); } } } void SetMonPreventsSwitchingString(void) { gLastUsedAbility = gBattleStruct -> abilityPreventingSwitchout; gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff1[1] = B_BUFF_MON_NICK_WITH_PREFIX; gBattleTextBuff1[2] = gBattleStruct->battlerPreventingSwitchout; gBattleTextBuff1[4] = B_BUFF_EOS; if (GetBattlerSide(gBattleStruct->battlerPreventingSwitchout) == B_SIDE_PLAYER) gBattleTextBuff1[3] = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[gBattleStruct->battlerPreventingSwitchout]); else gBattleTextBuff1[3] = gBattlerPartyIndexes[gBattleStruct->battlerPreventingSwitchout]; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff2, gBattlerInMenuId, GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[gBattlerInMenuId])) BattleStringExpandPlaceholders(gText_PkmnsXPreventsSwitching, gStringVar4); } void SetWildMonHeldItem(void) { if (!(gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER))) { u16 rnd = Random() % 100; u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); u16 var1 = 45; u16 var2 = 95; bool8 isHighLeveledPikachu = FALSE; if(species == SPECIES_PIKACHU && GetCurrentRegionMapSectionId() != MAPSEC_VIRIDIAN_FOREST) isHighLeveledPikachu = TRUE; if (!GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG, 0) && GetMonAbility(&gPlayerParty[0]) == ABILITY_COMPOUND_EYES) { var1 = 20; var2 = 80; } if (gSpeciesInfo[species].itemCommon == gSpeciesInfo[species].itemRare && !isHighLeveledPikachu) { // Both held items are the same, 100% chance to hold item SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gSpeciesInfo[species].itemCommon); return; } if (rnd < var1) return; if (rnd < var2) { if(isHighLeveledPikachu) { //Pikachu holds its RS items if not in Viridian Forest u16 item = ITEM_ORAN_BERRY; SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &item); } else SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gSpeciesInfo[species].itemCommon); } else { if(isHighLeveledPikachu) { //Pikachu holds its RS items if not in Viridian Forest u16 item = ITEM_LIGHT_BALL; SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &item); } else { SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gSpeciesInfo[species].itemRare); // Only underwater Gyarados can hold the DeepSeaTooth if(gSpeciesInfo[species].itemRare == ITEM_DEEP_SEA_TOOTH) { if(gMapHeader.mapType != MAP_TYPE_UNDERWATER) { u16 item = ITEM_NONE; SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &item); } } } } } } bool8 IsMonShiny(struct Pokemon *mon) { u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); return IsShinyOtIdPersonality(otId, personality); } static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) { bool8 retVal = FALSE; u32 shinyValue = GET_SHINY_VALUE(otId, personality); if (shinyValue < SHINY_ODDS) retVal = TRUE; return retVal; } u8 *GetTrainerPartnerName(void) { u8 id = GetMultiplayerId(); return gLinkPlayers[GetBattlerMultiplayerId(gLinkPlayers[id].id ^ 2)].name; } u8 GetPlayerPartyHighestLevel(void) { s32 slot; u8 level, monLevel; level = 1; for (slot = 0; slot < PARTY_SIZE; ++slot) { if (GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_HAS_SPECIES, NULL) == 1 && !GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_IS_EGG, NULL)) { monLevel = GetMonData(&gPlayerParty[slot], MON_DATA_LEVEL, NULL); if (monLevel > level) level = monLevel; } } return level; } u16 FacilityClassToPicIndex(u16 facilityClass) { return gFacilityClassToPicIndex[facilityClass]; } // If FALSE, should load this game's Deoxys form. If TRUE, should load normal Deoxys form bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) { switch (caseId) { case 0: default: return FALSE; case DEOXYS_CHECK_BATTLE_SPRITE: if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) return FALSE; if (!gMain.inBattle) return FALSE; if (gLinkPlayers[GetMultiplayerId()].id == battlerId) return FALSE; break; case 2: break; case DEOXYS_CHECK_TRADE_MAIN: if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) return FALSE; if (!gMain.inBattle) return FALSE; if (battlerId == 1 || battlerId == 4 || battlerId == 5) return TRUE; return FALSE; case 4: break; case DEOXYS_CHECK_BATTLE_ANIM: if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (!gMain.inBattle) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (gLinkPlayers[GetMultiplayerId()].id == battlerId) return FALSE; } else { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) return FALSE; } } else { if (!gMain.inBattle) return FALSE; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) return FALSE; } break; } return TRUE; } static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId) { s32 ivVal, evVal; u16 statValue = 0; u8 nature; u8 forme; u8 ivCalcMode = gSaveBlock1Ptr->keyFlags.ivCalcMode; u8 evCalcMode = gSaveBlock1Ptr->keyFlags.evCalcMode; if (gBattleTypeFlags & BATTLE_TYPE_LINK_IN_BATTLE || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) { return 0; } else { forme = GetMonData(mon, MON_DATA_FORME, NULL); ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL); evVal = GetMonData(mon, MON_DATA_HP_EV + statId, NULL); if(!FlagGet(FLAG_SYS_IS_LINKING) || !(gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)) { // Deoxys can't enter Battle Tower anyway, but checked just in case. if(ivCalcMode == IV_CALC_PERFECT) ivVal = 31; if(ivCalcMode == IV_CALC_ZERO) ivVal = 0; if(evCalcMode == EV_CALC_ZERO) evVal = 0; } statValue = ((sDeoxysBaseStats[forme][statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5; nature = GetNature(mon); statValue = ModifyStatByNature(nature, statValue, (u8)statId); } return statValue; } void SetDeoxysStats(void) { s32 i, value; for (i = 0; i < PARTY_SIZE; i++) { struct Pokemon *mon = &gPlayerParty[i]; if (GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) continue; value = GetMonData(mon, MON_DATA_ATK, NULL); SetMonData(mon, MON_DATA_ATK, &value); value = GetMonData(mon, MON_DATA_DEF, NULL); SetMonData(mon, MON_DATA_DEF, &value); value = GetMonData(mon, MON_DATA_SPEED, NULL); SetMonData(mon, MON_DATA_SPEED, &value); value = GetMonData(mon, MON_DATA_SPATK, NULL); SetMonData(mon, MON_DATA_SPATK, &value); value = GetMonData(mon, MON_DATA_SPDEF, NULL); SetMonData(mon, MON_DATA_SPDEF, &value); } } u16 GetUnionRoomTrainerPic(void) { u8 linkId = GetMultiplayerId() ^ 1; u32 arrId = gLinkPlayers[linkId].trainerId % NUM_UNION_ROOM_CLASSES; arrId |= gLinkPlayers[linkId].gender * NUM_UNION_ROOM_CLASSES; return FacilityClassToPicIndex(gUnionRoomFacilityClasses[arrId]); } u16 GetUnionRoomTrainerClass(void) { u8 linkId = GetMultiplayerId() ^ 1; u32 arrId = gLinkPlayers[linkId].trainerId % NUM_UNION_ROOM_CLASSES; arrId |= gLinkPlayers[linkId].gender * NUM_UNION_ROOM_CLASSES; return gFacilityClassToTrainerClass[gUnionRoomFacilityClasses[arrId]]; } void CreateEnemyEventMon(void) { s32 species = gSpecialVar_0x8004; s32 level = gSpecialVar_0x8005; s32 itemId = gSpecialVar_0x8006; ZeroEnemyPartyMons(); CreateEventMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); if (itemId) { u8 heldItem[2]; heldItem[0] = itemId; heldItem[1] = itemId >> 8; SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); } } void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality) { u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT; if (!GetSetPokedexFlag(nationalNum, getFlagCaseId)) { GetSetPokedexFlag(nationalNum, caseId); if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_UNOWN) gSaveBlock2Ptr->pokedex.unownPersonality = personality; if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_SPINDA) gSaveBlock2Ptr->pokedex.spindaPersonality = personality; } } bool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 battlerId) { u8 nickname[POKEMON_NAME_LENGTH + 1]; if (gBattleTypeFlags & BATTLE_TYPE_GHOST && GetBattlerSide(battlerId) != B_SIDE_PLAYER) { GetMonData(mon, MON_DATA_NICKNAME, nickname); StringGet_Nickname(nickname); if (!StringCompare(nickname, gText_Ghost)) return TRUE; } return FALSE; } #define ALLOC_FAIL_BUFFER (1 << 0) #define ALLOC_FAIL_STRUCT (1 << 1) #define GFX_MANAGER_ACTIVE 0xA3 // Arbitrary value static void InitMonSpritesGfx_Mode1(struct MonSpritesGfxManager *structPtr, u8 battlePosition) { u16 i = 0, j = 0; if (battlePosition >= MAX_BATTLERS_COUNT) { for (i = 0; i < (s8)structPtr->numSprites; ++i) { structPtr->templates[i] = gSpriteTemplates_Battlers[i]; for (j = 0; j < structPtr->numFrames; ++j) structPtr->frameImages[i * structPtr->numFrames + j].data = &structPtr->spritePointers[i][j * MON_PIC_SIZE]; structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->numFrames]; } } else { const struct SpriteTemplate *template = &gSpriteTemplates_Battlers[battlePosition]; structPtr->templates[0] = *template; for (j = 0; j < structPtr->numFrames; ++j) structPtr->frameImages[j].data = &structPtr->spritePointers[0][j * MON_PIC_SIZE]; structPtr->templates[0].images = structPtr->frameImages; } } // not used static void InitMonSpritesGfx_Mode0(struct MonSpritesGfxManager *structPtr) { u16 i, j; for (i = 0; i < (s8)structPtr->numSprites; ++i) { structPtr->templates[i] = sSpriteTemplate_64x64; for (j = 0; j < structPtr->numFrames; ++j) structPtr->frameImages[i * structPtr->numSprites + j].data = &structPtr->spritePointers[i][j * MON_PIC_SIZE]; structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->numSprites]; // should be numFrames logically structPtr->templates[i].anims = gAnims_MonPic; structPtr->templates[i].paletteTag = i; } } struct MonSpritesGfxManager *CreateMonSpritesGfxManager(u8 battlePosition, u8 mode) { s32 size; u8 i, failureFlags = 0; if (sMonSpritesGfxManager != NULL) { if (sMonSpritesGfxManager->active == GFX_MANAGER_ACTIVE) return NULL; memset(sMonSpritesGfxManager, 0, sizeof(*sMonSpritesGfxManager)); sMonSpritesGfxManager = NULL; } sMonSpritesGfxManager = AllocZeroed(sizeof(*sMonSpritesGfxManager)); if (sMonSpritesGfxManager == NULL) return NULL; switch (mode) { case 1: if (battlePosition == MAX_BATTLERS_COUNT) { sMonSpritesGfxManager->numSprites = MAX_BATTLERS_COUNT; sMonSpritesGfxManager->battlePosition = MAX_BATTLERS_COUNT; } else { if (battlePosition > MAX_BATTLERS_COUNT) battlePosition = 0; sMonSpritesGfxManager->numSprites = 1; sMonSpritesGfxManager->battlePosition = 1; } sMonSpritesGfxManager->numFrames = MAX_MON_PIC_FRAMES; sMonSpritesGfxManager->mode = 1; break; case 0: default: if (!battlePosition) battlePosition = 1; if (battlePosition > 8) battlePosition = 8; sMonSpritesGfxManager->numSprites = (battlePosition << 16) >> 16; sMonSpritesGfxManager->battlePosition = battlePosition; sMonSpritesGfxManager->numFrames = 4; sMonSpritesGfxManager->mode = 0; break; } // Set up sprite / sprite pointer buffers size = sMonSpritesGfxManager->numFrames * MON_PIC_SIZE; sMonSpritesGfxManager->dataSize = size; sMonSpritesGfxManager->spriteBuffer = AllocZeroed(sMonSpritesGfxManager->numSprites * size); sMonSpritesGfxManager->spritePointers = AllocZeroed(sMonSpritesGfxManager->numSprites * 32); // ? Only * 4 is necessary, perhaps they were thinking bits. if (sMonSpritesGfxManager->spriteBuffer == NULL || sMonSpritesGfxManager->spritePointers == NULL) { failureFlags |= ALLOC_FAIL_BUFFER; } else { do { for (i = 0; i < (s8)sMonSpritesGfxManager->numSprites; ++i) sMonSpritesGfxManager->spritePointers[i] = &sMonSpritesGfxManager->spriteBuffer[sMonSpritesGfxManager->dataSize * i]; } while (0); } // Set up sprite structs sMonSpritesGfxManager->templates = AllocZeroed(sizeof(struct SpriteTemplate) * sMonSpritesGfxManager->numSprites); sMonSpritesGfxManager->frameImages = AllocZeroed(sMonSpritesGfxManager->numSprites * sizeof(struct SpriteFrameImage) * sMonSpritesGfxManager->numFrames); if (sMonSpritesGfxManager->templates == NULL || sMonSpritesGfxManager->frameImages == NULL) { failureFlags |= ALLOC_FAIL_STRUCT; } else { for (i = 0; i < sMonSpritesGfxManager->numFrames * sMonSpritesGfxManager->numSprites; i++) sMonSpritesGfxManager->frameImages[i].size = MON_PIC_SIZE; switch (sMonSpritesGfxManager->mode) { case 1: InitMonSpritesGfx_Mode1(sMonSpritesGfxManager, battlePosition); break; case 0: default: InitMonSpritesGfx_Mode0(sMonSpritesGfxManager); break; } } // If either of the allocations failed free their respective members if (failureFlags & ALLOC_FAIL_STRUCT) { TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->frameImages); TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->templates); } if (failureFlags & ALLOC_FAIL_BUFFER) { TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->spritePointers); TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->spriteBuffer); } if (failureFlags) { // Clear, something failed to allocate memset(sMonSpritesGfxManager, 0, sizeof(*sMonSpritesGfxManager)); FREE_AND_SET_NULL(sMonSpritesGfxManager); } else { sMonSpritesGfxManager->active = GFX_MANAGER_ACTIVE; } return sMonSpritesGfxManager; } void DestroyMonSpritesGfxManager(void) { if (sMonSpritesGfxManager != NULL) { if (sMonSpritesGfxManager->active != GFX_MANAGER_ACTIVE) { memset(sMonSpritesGfxManager, 0, sizeof(*sMonSpritesGfxManager)); sMonSpritesGfxManager = NULL; } else { TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->frameImages); TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->templates); TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->spritePointers); TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->spriteBuffer); memset(sMonSpritesGfxManager, 0, sizeof(*sMonSpritesGfxManager)); FREE_AND_SET_NULL(sMonSpritesGfxManager); } } } u8 *MonSpritesGfxManager_GetSpritePtr(u8 spriteNum) { if (sMonSpritesGfxManager->active != GFX_MANAGER_ACTIVE) { return NULL; } else { if (spriteNum >= (s8)sMonSpritesGfxManager->numSprites) spriteNum = 0; return sMonSpritesGfxManager->spritePointers[spriteNum]; } } void SetFirstDeoxysForm(void) { #define SPECIES_DEOXYS 410 u32 i; u8 forme; for(i = 0; i < 6; i++) { if(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_DEOXYS) { forme = GetMonData(&gPlayerParty[i], MON_DATA_FORME, NULL); if(forme == 3) { forme = 0; } else { forme += 1; } SetMonData(&gPlayerParty[i], MON_DATA_FORME, &forme); break; } } } static bool32 ShouldSkipFriendshipChange(void) { if (gMain.inBattle && gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER)) return TRUE; /*if (!gMain.inBattle && (InBattlePike() || InBattlePyramid())) return TRUE;*/ return FALSE; } ================================================ FILE: src/pokemon_icon.c ================================================ #include "global.h" #include "gflib.h" #include "mail_data.h" #include "pokemon_icon.h" #include "graphics.h" #define POKE_ICON_BASE_PAL_TAG 56000 struct MonIconSpriteTemplate { const struct OamData * oam; const u8 *image; const union AnimCmd *const * anims; const union AffineAnimCmd *const * affineAnims; SpriteCallback callback; u16 paletteTag; }; static u8 CreateMonIconSprite(const struct MonIconSpriteTemplate * template, s16 x, s16 y, u8 subpriority); static void DestroyMonIconInternal(struct Sprite *sprite); const u16 gMonIconPalettes[][16] = { INCBIN_U16("graphics/pokemon/icon_palettes/icon_palette_0.gbapal"), INCBIN_U16("graphics/pokemon/icon_palettes/icon_palette_1.gbapal"), INCBIN_U16("graphics/pokemon/icon_palettes/icon_palette_2.gbapal") }; const u8 *const gMonIconTable[] = { [SPECIES_NONE] = gMonIcon_QuestionMark, [SPECIES_BULBASAUR] = gMonIcon_Bulbasaur, [SPECIES_IVYSAUR] = gMonIcon_Ivysaur, [SPECIES_VENUSAUR] = gMonIcon_Venusaur, [SPECIES_CHARMANDER] = gMonIcon_Charmander, [SPECIES_CHARMELEON] = gMonIcon_Charmeleon, [SPECIES_CHARIZARD] = gMonIcon_Charizard, [SPECIES_SQUIRTLE] = gMonIcon_Squirtle, [SPECIES_WARTORTLE] = gMonIcon_Wartortle, [SPECIES_BLASTOISE] = gMonIcon_Blastoise, [SPECIES_CATERPIE] = gMonIcon_Caterpie, [SPECIES_METAPOD] = gMonIcon_Metapod, [SPECIES_BUTTERFREE] = gMonIcon_Butterfree, [SPECIES_WEEDLE] = gMonIcon_Weedle, [SPECIES_KAKUNA] = gMonIcon_Kakuna, [SPECIES_BEEDRILL] = gMonIcon_Beedrill, [SPECIES_PIDGEY] = gMonIcon_Pidgey, [SPECIES_PIDGEOTTO] = gMonIcon_Pidgeotto, [SPECIES_PIDGEOT] = gMonIcon_Pidgeot, [SPECIES_RATTATA] = gMonIcon_Rattata, [SPECIES_RATICATE] = gMonIcon_Raticate, [SPECIES_SPEAROW] = gMonIcon_Spearow, [SPECIES_FEAROW] = gMonIcon_Fearow, [SPECIES_EKANS] = gMonIcon_Ekans, [SPECIES_ARBOK] = gMonIcon_Arbok, [SPECIES_PIKACHU] = gMonIcon_Pikachu, [SPECIES_RAICHU] = gMonIcon_Raichu, [SPECIES_SANDSHREW] = gMonIcon_Sandshrew, [SPECIES_SANDSLASH] = gMonIcon_Sandslash, [SPECIES_NIDORAN_F] = gMonIcon_NidoranF, [SPECIES_NIDORINA] = gMonIcon_Nidorina, [SPECIES_NIDOQUEEN] = gMonIcon_Nidoqueen, [SPECIES_NIDORAN_M] = gMonIcon_NidoranM, [SPECIES_NIDORINO] = gMonIcon_Nidorino, [SPECIES_NIDOKING] = gMonIcon_Nidoking, [SPECIES_CLEFAIRY] = gMonIcon_Clefairy, [SPECIES_CLEFABLE] = gMonIcon_Clefable, [SPECIES_VULPIX] = gMonIcon_Vulpix, [SPECIES_NINETALES] = gMonIcon_Ninetales, [SPECIES_JIGGLYPUFF] = gMonIcon_Jigglypuff, [SPECIES_WIGGLYTUFF] = gMonIcon_Wigglytuff, [SPECIES_ZUBAT] = gMonIcon_Zubat, [SPECIES_GOLBAT] = gMonIcon_Golbat, [SPECIES_ODDISH] = gMonIcon_Oddish, [SPECIES_GLOOM] = gMonIcon_Gloom, [SPECIES_VILEPLUME] = gMonIcon_Vileplume, [SPECIES_PARAS] = gMonIcon_Paras, [SPECIES_PARASECT] = gMonIcon_Parasect, [SPECIES_VENONAT] = gMonIcon_Venonat, [SPECIES_VENOMOTH] = gMonIcon_Venomoth, [SPECIES_DIGLETT] = gMonIcon_Diglett, [SPECIES_DUGTRIO] = gMonIcon_Dugtrio, [SPECIES_MEOWTH] = gMonIcon_Meowth, [SPECIES_PERSIAN] = gMonIcon_Persian, [SPECIES_PSYDUCK] = gMonIcon_Psyduck, [SPECIES_GOLDUCK] = gMonIcon_Golduck, [SPECIES_MANKEY] = gMonIcon_Mankey, [SPECIES_PRIMEAPE] = gMonIcon_Primeape, [SPECIES_GROWLITHE] = gMonIcon_Growlithe, [SPECIES_ARCANINE] = gMonIcon_Arcanine, [SPECIES_POLIWAG] = gMonIcon_Poliwag, [SPECIES_POLIWHIRL] = gMonIcon_Poliwhirl, [SPECIES_POLIWRATH] = gMonIcon_Poliwrath, [SPECIES_ABRA] = gMonIcon_Abra, [SPECIES_KADABRA] = gMonIcon_Kadabra, [SPECIES_ALAKAZAM] = gMonIcon_Alakazam, [SPECIES_MACHOP] = gMonIcon_Machop, [SPECIES_MACHOKE] = gMonIcon_Machoke, [SPECIES_MACHAMP] = gMonIcon_Machamp, [SPECIES_BELLSPROUT] = gMonIcon_Bellsprout, [SPECIES_WEEPINBELL] = gMonIcon_Weepinbell, [SPECIES_VICTREEBEL] = gMonIcon_Victreebel, [SPECIES_TENTACOOL] = gMonIcon_Tentacool, [SPECIES_TENTACRUEL] = gMonIcon_Tentacruel, [SPECIES_GEODUDE] = gMonIcon_Geodude, [SPECIES_GRAVELER] = gMonIcon_Graveler, [SPECIES_GOLEM] = gMonIcon_Golem, [SPECIES_PONYTA] = gMonIcon_Ponyta, [SPECIES_RAPIDASH] = gMonIcon_Rapidash, [SPECIES_SLOWPOKE] = gMonIcon_Slowpoke, [SPECIES_SLOWBRO] = gMonIcon_Slowbro, [SPECIES_MAGNEMITE] = gMonIcon_Magnemite, [SPECIES_MAGNETON] = gMonIcon_Magneton, [SPECIES_FARFETCHD] = gMonIcon_Farfetchd, [SPECIES_DODUO] = gMonIcon_Doduo, [SPECIES_DODRIO] = gMonIcon_Dodrio, [SPECIES_SEEL] = gMonIcon_Seel, [SPECIES_DEWGONG] = gMonIcon_Dewgong, [SPECIES_GRIMER] = gMonIcon_Grimer, [SPECIES_MUK] = gMonIcon_Muk, [SPECIES_SHELLDER] = gMonIcon_Shellder, [SPECIES_CLOYSTER] = gMonIcon_Cloyster, [SPECIES_GASTLY] = gMonIcon_Gastly, [SPECIES_HAUNTER] = gMonIcon_Haunter, [SPECIES_GENGAR] = gMonIcon_Gengar, [SPECIES_ONIX] = gMonIcon_Onix, [SPECIES_DROWZEE] = gMonIcon_Drowzee, [SPECIES_HYPNO] = gMonIcon_Hypno, [SPECIES_KRABBY] = gMonIcon_Krabby, [SPECIES_KINGLER] = gMonIcon_Kingler, [SPECIES_VOLTORB] = gMonIcon_Voltorb, [SPECIES_ELECTRODE] = gMonIcon_Electrode, [SPECIES_EXEGGCUTE] = gMonIcon_Exeggcute, [SPECIES_EXEGGUTOR] = gMonIcon_Exeggutor, [SPECIES_CUBONE] = gMonIcon_Cubone, [SPECIES_MAROWAK] = gMonIcon_Marowak, [SPECIES_HITMONLEE] = gMonIcon_Hitmonlee, [SPECIES_HITMONCHAN] = gMonIcon_Hitmonchan, [SPECIES_LICKITUNG] = gMonIcon_Lickitung, [SPECIES_KOFFING] = gMonIcon_Koffing, [SPECIES_WEEZING] = gMonIcon_Weezing, [SPECIES_RHYHORN] = gMonIcon_Rhyhorn, [SPECIES_RHYDON] = gMonIcon_Rhydon, [SPECIES_CHANSEY] = gMonIcon_Chansey, [SPECIES_TANGELA] = gMonIcon_Tangela, [SPECIES_KANGASKHAN] = gMonIcon_Kangaskhan, [SPECIES_HORSEA] = gMonIcon_Horsea, [SPECIES_SEADRA] = gMonIcon_Seadra, [SPECIES_GOLDEEN] = gMonIcon_Goldeen, [SPECIES_SEAKING] = gMonIcon_Seaking, [SPECIES_STARYU] = gMonIcon_Staryu, [SPECIES_STARMIE] = gMonIcon_Starmie, [SPECIES_MR_MIME] = gMonIcon_Mrmime, [SPECIES_SCYTHER] = gMonIcon_Scyther, [SPECIES_JYNX] = gMonIcon_Jynx, [SPECIES_ELECTABUZZ] = gMonIcon_Electabuzz, [SPECIES_MAGMAR] = gMonIcon_Magmar, [SPECIES_PINSIR] = gMonIcon_Pinsir, [SPECIES_TAUROS] = gMonIcon_Tauros, [SPECIES_MAGIKARP] = gMonIcon_Magikarp, [SPECIES_GYARADOS] = gMonIcon_Gyarados, [SPECIES_LAPRAS] = gMonIcon_Lapras, [SPECIES_DITTO] = gMonIcon_Ditto, [SPECIES_EEVEE] = gMonIcon_Eevee, [SPECIES_VAPOREON] = gMonIcon_Vaporeon, [SPECIES_JOLTEON] = gMonIcon_Jolteon, [SPECIES_FLAREON] = gMonIcon_Flareon, [SPECIES_PORYGON] = gMonIcon_Porygon, [SPECIES_OMANYTE] = gMonIcon_Omanyte, [SPECIES_OMASTAR] = gMonIcon_Omastar, [SPECIES_KABUTO] = gMonIcon_Kabuto, [SPECIES_KABUTOPS] = gMonIcon_Kabutops, [SPECIES_AERODACTYL] = gMonIcon_Aerodactyl, [SPECIES_SNORLAX] = gMonIcon_Snorlax, [SPECIES_ARTICUNO] = gMonIcon_Articuno, [SPECIES_ZAPDOS] = gMonIcon_Zapdos, [SPECIES_MOLTRES] = gMonIcon_Moltres, [SPECIES_DRATINI] = gMonIcon_Dratini, [SPECIES_DRAGONAIR] = gMonIcon_Dragonair, [SPECIES_DRAGONITE] = gMonIcon_Dragonite, [SPECIES_MEWTWO] = gMonIcon_Mewtwo, [SPECIES_MEW] = gMonIcon_Mew, [SPECIES_CHIKORITA] = gMonIcon_Chikorita, [SPECIES_BAYLEEF] = gMonIcon_Bayleef, [SPECIES_MEGANIUM] = gMonIcon_Meganium, [SPECIES_CYNDAQUIL] = gMonIcon_Cyndaquil, [SPECIES_QUILAVA] = gMonIcon_Quilava, [SPECIES_TYPHLOSION] = gMonIcon_Typhlosion, [SPECIES_TOTODILE] = gMonIcon_Totodile, [SPECIES_CROCONAW] = gMonIcon_Croconaw, [SPECIES_FERALIGATR] = gMonIcon_Feraligatr, [SPECIES_SENTRET] = gMonIcon_Sentret, [SPECIES_FURRET] = gMonIcon_Furret, [SPECIES_HOOTHOOT] = gMonIcon_Hoothoot, [SPECIES_NOCTOWL] = gMonIcon_Noctowl, [SPECIES_LEDYBA] = gMonIcon_Ledyba, [SPECIES_LEDIAN] = gMonIcon_Ledian, [SPECIES_SPINARAK] = gMonIcon_Spinarak, [SPECIES_ARIADOS] = gMonIcon_Ariados, [SPECIES_CROBAT] = gMonIcon_Crobat, [SPECIES_CHINCHOU] = gMonIcon_Chinchou, [SPECIES_LANTURN] = gMonIcon_Lanturn, [SPECIES_PICHU] = gMonIcon_Pichu, [SPECIES_CLEFFA] = gMonIcon_Cleffa, [SPECIES_IGGLYBUFF] = gMonIcon_Igglybuff, [SPECIES_TOGEPI] = gMonIcon_Togepi, [SPECIES_TOGETIC] = gMonIcon_Togetic, [SPECIES_NATU] = gMonIcon_Natu, [SPECIES_XATU] = gMonIcon_Xatu, [SPECIES_MAREEP] = gMonIcon_Mareep, [SPECIES_FLAAFFY] = gMonIcon_Flaaffy, [SPECIES_AMPHAROS] = gMonIcon_Ampharos, [SPECIES_BELLOSSOM] = gMonIcon_Bellossom, [SPECIES_MARILL] = gMonIcon_Marill, [SPECIES_AZUMARILL] = gMonIcon_Azumarill, [SPECIES_SUDOWOODO] = gMonIcon_Sudowoodo, [SPECIES_POLITOED] = gMonIcon_Politoed, [SPECIES_HOPPIP] = gMonIcon_Hoppip, [SPECIES_SKIPLOOM] = gMonIcon_Skiploom, [SPECIES_JUMPLUFF] = gMonIcon_Jumpluff, [SPECIES_AIPOM] = gMonIcon_Aipom, [SPECIES_SUNKERN] = gMonIcon_Sunkern, [SPECIES_SUNFLORA] = gMonIcon_Sunflora, [SPECIES_YANMA] = gMonIcon_Yanma, [SPECIES_WOOPER] = gMonIcon_Wooper, [SPECIES_QUAGSIRE] = gMonIcon_Quagsire, [SPECIES_ESPEON] = gMonIcon_Espeon, [SPECIES_UMBREON] = gMonIcon_Umbreon, [SPECIES_MURKROW] = gMonIcon_Murkrow, [SPECIES_SLOWKING] = gMonIcon_Slowking, [SPECIES_MISDREAVUS] = gMonIcon_Misdreavus, [SPECIES_UNOWN] = gMonIcon_UnownA, [SPECIES_WOBBUFFET] = gMonIcon_Wobbuffet, [SPECIES_GIRAFARIG] = gMonIcon_Girafarig, [SPECIES_PINECO] = gMonIcon_Pineco, [SPECIES_FORRETRESS] = gMonIcon_Forretress, [SPECIES_DUNSPARCE] = gMonIcon_Dunsparce, [SPECIES_GLIGAR] = gMonIcon_Gligar, [SPECIES_STEELIX] = gMonIcon_Steelix, [SPECIES_SNUBBULL] = gMonIcon_Snubbull, [SPECIES_GRANBULL] = gMonIcon_Granbull, [SPECIES_QWILFISH] = gMonIcon_Qwilfish, [SPECIES_SCIZOR] = gMonIcon_Scizor, [SPECIES_SHUCKLE] = gMonIcon_Shuckle, [SPECIES_HERACROSS] = gMonIcon_Heracross, [SPECIES_SNEASEL] = gMonIcon_Sneasel, [SPECIES_TEDDIURSA] = gMonIcon_Teddiursa, [SPECIES_URSARING] = gMonIcon_Ursaring, [SPECIES_SLUGMA] = gMonIcon_Slugma, [SPECIES_MAGCARGO] = gMonIcon_Magcargo, [SPECIES_SWINUB] = gMonIcon_Swinub, [SPECIES_PILOSWINE] = gMonIcon_Piloswine, [SPECIES_CORSOLA] = gMonIcon_Corsola, [SPECIES_REMORAID] = gMonIcon_Remoraid, [SPECIES_OCTILLERY] = gMonIcon_Octillery, [SPECIES_DELIBIRD] = gMonIcon_Delibird, [SPECIES_MANTINE] = gMonIcon_Mantine, [SPECIES_SKARMORY] = gMonIcon_Skarmory, [SPECIES_HOUNDOUR] = gMonIcon_Houndour, [SPECIES_HOUNDOOM] = gMonIcon_Houndoom, [SPECIES_KINGDRA] = gMonIcon_Kingdra, [SPECIES_PHANPY] = gMonIcon_Phanpy, [SPECIES_DONPHAN] = gMonIcon_Donphan, [SPECIES_PORYGON2] = gMonIcon_Porygon2, [SPECIES_STANTLER] = gMonIcon_Stantler, [SPECIES_SMEARGLE] = gMonIcon_Smeargle, [SPECIES_TYROGUE] = gMonIcon_Tyrogue, [SPECIES_HITMONTOP] = gMonIcon_Hitmontop, [SPECIES_SMOOCHUM] = gMonIcon_Smoochum, [SPECIES_ELEKID] = gMonIcon_Elekid, [SPECIES_MAGBY] = gMonIcon_Magby, [SPECIES_MILTANK] = gMonIcon_Miltank, [SPECIES_BLISSEY] = gMonIcon_Blissey, [SPECIES_RAIKOU] = gMonIcon_Raikou, [SPECIES_ENTEI] = gMonIcon_Entei, [SPECIES_SUICUNE] = gMonIcon_Suicune, [SPECIES_LARVITAR] = gMonIcon_Larvitar, [SPECIES_PUPITAR] = gMonIcon_Pupitar, [SPECIES_TYRANITAR] = gMonIcon_Tyranitar, [SPECIES_LUGIA] = gMonIcon_Lugia, [SPECIES_HO_OH] = gMonIcon_HoOh, [SPECIES_CELEBI] = gMonIcon_Celebi, [SPECIES_OLD_UNOWN_B] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_C] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_D] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_E] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_F] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_G] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_H] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_I] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_J] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_K] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_L] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_M] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_N] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_O] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_P] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_Q] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_R] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_S] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_T] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_U] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_V] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_W] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_X] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_Y] = gMonIcon_QuestionMark, [SPECIES_OLD_UNOWN_Z] = gMonIcon_QuestionMark, [SPECIES_TREECKO] = gMonIcon_Treecko, [SPECIES_GROVYLE] = gMonIcon_Grovyle, [SPECIES_SCEPTILE] = gMonIcon_Sceptile, [SPECIES_TORCHIC] = gMonIcon_Torchic, [SPECIES_COMBUSKEN] = gMonIcon_Combusken, [SPECIES_BLAZIKEN] = gMonIcon_Blaziken, [SPECIES_MUDKIP] = gMonIcon_Mudkip, [SPECIES_MARSHTOMP] = gMonIcon_Marshtomp, [SPECIES_SWAMPERT] = gMonIcon_Swampert, [SPECIES_POOCHYENA] = gMonIcon_Poochyena, [SPECIES_MIGHTYENA] = gMonIcon_Mightyena, [SPECIES_ZIGZAGOON] = gMonIcon_Zigzagoon, [SPECIES_LINOONE] = gMonIcon_Linoone, [SPECIES_WURMPLE] = gMonIcon_Wurmple, [SPECIES_SILCOON] = gMonIcon_Silcoon, [SPECIES_BEAUTIFLY] = gMonIcon_Beautifly, [SPECIES_CASCOON] = gMonIcon_Cascoon, [SPECIES_DUSTOX] = gMonIcon_Dustox, [SPECIES_LOTAD] = gMonIcon_Lotad, [SPECIES_LOMBRE] = gMonIcon_Lombre, [SPECIES_LUDICOLO] = gMonIcon_Ludicolo, [SPECIES_SEEDOT] = gMonIcon_Seedot, [SPECIES_NUZLEAF] = gMonIcon_Nuzleaf, [SPECIES_SHIFTRY] = gMonIcon_Shiftry, [SPECIES_NINCADA] = gMonIcon_Nincada, [SPECIES_NINJASK] = gMonIcon_Ninjask, [SPECIES_SHEDINJA] = gMonIcon_Shedinja, [SPECIES_TAILLOW] = gMonIcon_Taillow, [SPECIES_SWELLOW] = gMonIcon_Swellow, [SPECIES_SHROOMISH] = gMonIcon_Shroomish, [SPECIES_BRELOOM] = gMonIcon_Breloom, [SPECIES_SPINDA] = gMonIcon_Spinda, [SPECIES_WINGULL] = gMonIcon_Wingull, [SPECIES_PELIPPER] = gMonIcon_Pelipper, [SPECIES_SURSKIT] = gMonIcon_Surskit, [SPECIES_MASQUERAIN] = gMonIcon_Masquerain, [SPECIES_WAILMER] = gMonIcon_Wailmer, [SPECIES_WAILORD] = gMonIcon_Wailord, [SPECIES_SKITTY] = gMonIcon_Skitty, [SPECIES_DELCATTY] = gMonIcon_Delcatty, [SPECIES_KECLEON] = gMonIcon_Kecleon, [SPECIES_BALTOY] = gMonIcon_Baltoy, [SPECIES_CLAYDOL] = gMonIcon_Claydol, [SPECIES_NOSEPASS] = gMonIcon_Nosepass, [SPECIES_TORKOAL] = gMonIcon_Torkoal, [SPECIES_SABLEYE] = gMonIcon_Sableye, [SPECIES_BARBOACH] = gMonIcon_Barboach, [SPECIES_WHISCASH] = gMonIcon_Whiscash, [SPECIES_LUVDISC] = gMonIcon_Luvdisc, [SPECIES_CORPHISH] = gMonIcon_Corphish, [SPECIES_CRAWDAUNT] = gMonIcon_Crawdaunt, [SPECIES_FEEBAS] = gMonIcon_Feebas, [SPECIES_MILOTIC] = gMonIcon_Milotic, [SPECIES_CARVANHA] = gMonIcon_Carvanha, [SPECIES_SHARPEDO] = gMonIcon_Sharpedo, [SPECIES_TRAPINCH] = gMonIcon_Trapinch, [SPECIES_VIBRAVA] = gMonIcon_Vibrava, [SPECIES_FLYGON] = gMonIcon_Flygon, [SPECIES_MAKUHITA] = gMonIcon_Makuhita, [SPECIES_HARIYAMA] = gMonIcon_Hariyama, [SPECIES_ELECTRIKE] = gMonIcon_Electrike, [SPECIES_MANECTRIC] = gMonIcon_Manectric, [SPECIES_NUMEL] = gMonIcon_Numel, [SPECIES_CAMERUPT] = gMonIcon_Camerupt, [SPECIES_SPHEAL] = gMonIcon_Spheal, [SPECIES_SEALEO] = gMonIcon_Sealeo, [SPECIES_WALREIN] = gMonIcon_Walrein, [SPECIES_CACNEA] = gMonIcon_Cacnea, [SPECIES_CACTURNE] = gMonIcon_Cacturne, [SPECIES_SNORUNT] = gMonIcon_Snorunt, [SPECIES_GLALIE] = gMonIcon_Glalie, [SPECIES_LUNATONE] = gMonIcon_Lunatone, [SPECIES_SOLROCK] = gMonIcon_Solrock, [SPECIES_AZURILL] = gMonIcon_Azurill, [SPECIES_SPOINK] = gMonIcon_Spoink, [SPECIES_GRUMPIG] = gMonIcon_Grumpig, [SPECIES_PLUSLE] = gMonIcon_Plusle, [SPECIES_MINUN] = gMonIcon_Minun, [SPECIES_MAWILE] = gMonIcon_Mawile, [SPECIES_MEDITITE] = gMonIcon_Meditite, [SPECIES_MEDICHAM] = gMonIcon_Medicham, [SPECIES_SWABLU] = gMonIcon_Swablu, [SPECIES_ALTARIA] = gMonIcon_Altaria, [SPECIES_WYNAUT] = gMonIcon_Wynaut, [SPECIES_DUSKULL] = gMonIcon_Duskull, [SPECIES_DUSCLOPS] = gMonIcon_Dusclops, [SPECIES_ROSELIA] = gMonIcon_Roselia, [SPECIES_SLAKOTH] = gMonIcon_Slakoth, [SPECIES_VIGOROTH] = gMonIcon_Vigoroth, [SPECIES_SLAKING] = gMonIcon_Slaking, [SPECIES_GULPIN] = gMonIcon_Gulpin, [SPECIES_SWALOT] = gMonIcon_Swalot, [SPECIES_TROPIUS] = gMonIcon_Tropius, [SPECIES_WHISMUR] = gMonIcon_Whismur, [SPECIES_LOUDRED] = gMonIcon_Loudred, [SPECIES_EXPLOUD] = gMonIcon_Exploud, [SPECIES_CLAMPERL] = gMonIcon_Clamperl, [SPECIES_HUNTAIL] = gMonIcon_Huntail, [SPECIES_GOREBYSS] = gMonIcon_Gorebyss, [SPECIES_ABSOL] = gMonIcon_Absol, [SPECIES_SHUPPET] = gMonIcon_Shuppet, [SPECIES_BANETTE] = gMonIcon_Banette, [SPECIES_SEVIPER] = gMonIcon_Seviper, [SPECIES_ZANGOOSE] = gMonIcon_Zangoose, [SPECIES_RELICANTH] = gMonIcon_Relicanth, [SPECIES_ARON] = gMonIcon_Aron, [SPECIES_LAIRON] = gMonIcon_Lairon, [SPECIES_AGGRON] = gMonIcon_Aggron, [SPECIES_CASTFORM] = gMonIcon_Castform, [SPECIES_VOLBEAT] = gMonIcon_Volbeat, [SPECIES_ILLUMISE] = gMonIcon_Illumise, [SPECIES_LILEEP] = gMonIcon_Lileep, [SPECIES_CRADILY] = gMonIcon_Cradily, [SPECIES_ANORITH] = gMonIcon_Anorith, [SPECIES_ARMALDO] = gMonIcon_Armaldo, [SPECIES_RALTS] = gMonIcon_Ralts, [SPECIES_KIRLIA] = gMonIcon_Kirlia, [SPECIES_GARDEVOIR] = gMonIcon_Gardevoir, [SPECIES_BAGON] = gMonIcon_Bagon, [SPECIES_SHELGON] = gMonIcon_Shelgon, [SPECIES_SALAMENCE] = gMonIcon_Salamence, [SPECIES_BELDUM] = gMonIcon_Beldum, [SPECIES_METANG] = gMonIcon_Metang, [SPECIES_METAGROSS] = gMonIcon_Metagross, [SPECIES_REGIROCK] = gMonIcon_Regirock, [SPECIES_REGICE] = gMonIcon_Regice, [SPECIES_REGISTEEL] = gMonIcon_Registeel, [SPECIES_KYOGRE] = gMonIcon_Kyogre, [SPECIES_GROUDON] = gMonIcon_Groudon, [SPECIES_RAYQUAZA] = gMonIcon_Rayquaza, [SPECIES_LATIAS] = gMonIcon_Latias, [SPECIES_LATIOS] = gMonIcon_Latios, [SPECIES_JIRACHI] = gMonIcon_Jirachi, [SPECIES_DEOXYS] = gMonIcon_Deoxys, [SPECIES_CHIMECHO] = gMonIcon_Chimecho, [SPECIES_EGG] = gMonIcon_Egg, [SPECIES_UNOWN_B] = gMonIcon_UnownB, [SPECIES_UNOWN_C] = gMonIcon_UnownC, [SPECIES_UNOWN_D] = gMonIcon_UnownD, [SPECIES_UNOWN_E] = gMonIcon_UnownE, [SPECIES_UNOWN_F] = gMonIcon_UnownF, [SPECIES_UNOWN_G] = gMonIcon_UnownG, [SPECIES_UNOWN_H] = gMonIcon_UnownH, [SPECIES_UNOWN_I] = gMonIcon_UnownI, [SPECIES_UNOWN_J] = gMonIcon_UnownJ, [SPECIES_UNOWN_K] = gMonIcon_UnownK, [SPECIES_UNOWN_L] = gMonIcon_UnownL, [SPECIES_UNOWN_M] = gMonIcon_UnownM, [SPECIES_UNOWN_N] = gMonIcon_UnownN, [SPECIES_UNOWN_O] = gMonIcon_UnownO, [SPECIES_UNOWN_P] = gMonIcon_UnownP, [SPECIES_UNOWN_Q] = gMonIcon_UnownQ, [SPECIES_UNOWN_R] = gMonIcon_UnownR, [SPECIES_UNOWN_S] = gMonIcon_UnownS, [SPECIES_UNOWN_T] = gMonIcon_UnownT, [SPECIES_UNOWN_U] = gMonIcon_UnownU, [SPECIES_UNOWN_V] = gMonIcon_UnownV, [SPECIES_UNOWN_W] = gMonIcon_UnownW, [SPECIES_UNOWN_X] = gMonIcon_UnownX, [SPECIES_UNOWN_Y] = gMonIcon_UnownY, [SPECIES_UNOWN_Z] = gMonIcon_UnownZ, [SPECIES_UNOWN_EMARK] = gMonIcon_UnownExclamationMark, [SPECIES_UNOWN_QMARK] = gMonIcon_UnownQuestionMark }; const u8 gMonIconPaletteIndices[] = { [SPECIES_NONE] = 0, [SPECIES_BULBASAUR] = 1, [SPECIES_IVYSAUR] = 1, [SPECIES_VENUSAUR] = 1, [SPECIES_CHARMANDER] = 0, [SPECIES_CHARMELEON] = 0, [SPECIES_CHARIZARD] = 0, [SPECIES_SQUIRTLE] = 0, [SPECIES_WARTORTLE] = 2, [SPECIES_BLASTOISE] = 2, [SPECIES_CATERPIE] = 1, [SPECIES_METAPOD] = 1, [SPECIES_BUTTERFREE] = 0, [SPECIES_WEEDLE] = 1, [SPECIES_KAKUNA] = 2, [SPECIES_BEEDRILL] = 2, [SPECIES_PIDGEY] = 0, [SPECIES_PIDGEOTTO] = 0, [SPECIES_PIDGEOT] = 0, [SPECIES_RATTATA] = 2, [SPECIES_RATICATE] = 1, [SPECIES_SPEAROW] = 0, [SPECIES_FEAROW] = 0, [SPECIES_EKANS] = 2, [SPECIES_ARBOK] = 2, [SPECIES_PIKACHU] = 2, [SPECIES_RAICHU] = 0, [SPECIES_SANDSHREW] = 2, [SPECIES_SANDSLASH] = 2, [SPECIES_NIDORAN_F] = 2, [SPECIES_NIDORINA] = 2, [SPECIES_NIDOQUEEN] = 2, [SPECIES_NIDORAN_M] = 2, [SPECIES_NIDORINO] = 2, [SPECIES_NIDOKING] = 2, [SPECIES_CLEFAIRY] = 0, [SPECIES_CLEFABLE] = 0, [SPECIES_VULPIX] = 2, [SPECIES_NINETALES] = 1, [SPECIES_JIGGLYPUFF] = 0, [SPECIES_WIGGLYTUFF] = 0, [SPECIES_ZUBAT] = 2, [SPECIES_GOLBAT] = 2, [SPECIES_ODDISH] = 1, [SPECIES_GLOOM] = 0, [SPECIES_VILEPLUME] = 0, [SPECIES_PARAS] = 0, [SPECIES_PARASECT] = 0, [SPECIES_VENONAT] = 0, [SPECIES_VENOMOTH] = 2, [SPECIES_DIGLETT] = 2, [SPECIES_DUGTRIO] = 2, [SPECIES_MEOWTH] = 1, [SPECIES_PERSIAN] = 1, [SPECIES_PSYDUCK] = 1, [SPECIES_GOLDUCK] = 2, [SPECIES_MANKEY] = 1, [SPECIES_PRIMEAPE] = 2, [SPECIES_GROWLITHE] = 0, [SPECIES_ARCANINE] = 0, [SPECIES_POLIWAG] = 0, [SPECIES_POLIWHIRL] = 0, [SPECIES_POLIWRATH] = 0, [SPECIES_ABRA] = 2, [SPECIES_KADABRA] = 2, [SPECIES_ALAKAZAM] = 2, [SPECIES_MACHOP] = 0, [SPECIES_MACHOKE] = 2, [SPECIES_MACHAMP] = 0, [SPECIES_BELLSPROUT] = 1, [SPECIES_WEEPINBELL] = 1, [SPECIES_VICTREEBEL] = 1, [SPECIES_TENTACOOL] = 2, [SPECIES_TENTACRUEL] = 2, [SPECIES_GEODUDE] = 1, [SPECIES_GRAVELER] = 1, [SPECIES_GOLEM] = 1, [SPECIES_PONYTA] = 0, [SPECIES_RAPIDASH] = 0, [SPECIES_SLOWPOKE] = 0, [SPECIES_SLOWBRO] = 0, [SPECIES_MAGNEMITE] = 0, [SPECIES_MAGNETON] = 0, [SPECIES_FARFETCHD] = 1, [SPECIES_DODUO] = 2, [SPECIES_DODRIO] = 2, [SPECIES_SEEL] = 2, [SPECIES_DEWGONG] = 2, [SPECIES_GRIMER] = 2, [SPECIES_MUK] = 2, [SPECIES_SHELLDER] = 2, [SPECIES_CLOYSTER] = 2, [SPECIES_GASTLY] = 2, [SPECIES_HAUNTER] = 2, [SPECIES_GENGAR] = 2, [SPECIES_ONIX] = 2, [SPECIES_DROWZEE] = 2, [SPECIES_HYPNO] = 1, [SPECIES_KRABBY] = 2, [SPECIES_KINGLER] = 2, [SPECIES_VOLTORB] = 0, [SPECIES_ELECTRODE] = 0, [SPECIES_EXEGGCUTE] = 0, [SPECIES_EXEGGUTOR] = 1, [SPECIES_CUBONE] = 1, [SPECIES_MAROWAK] = 1, [SPECIES_HITMONLEE] = 2, [SPECIES_HITMONCHAN] = 2, [SPECIES_LICKITUNG] = 1, [SPECIES_KOFFING] = 2, [SPECIES_WEEZING] = 2, [SPECIES_RHYHORN] = 1, [SPECIES_RHYDON] = 1, [SPECIES_CHANSEY] = 0, [SPECIES_TANGELA] = 0, [SPECIES_KANGASKHAN] = 1, [SPECIES_HORSEA] = 0, [SPECIES_SEADRA] = 0, [SPECIES_GOLDEEN] = 0, [SPECIES_SEAKING] = 0, [SPECIES_STARYU] = 2, [SPECIES_STARMIE] = 2, [SPECIES_MR_MIME] = 0, [SPECIES_SCYTHER] = 1, [SPECIES_JYNX] = 2, [SPECIES_ELECTABUZZ] = 1, [SPECIES_MAGMAR] = 0, [SPECIES_PINSIR] = 2, [SPECIES_TAUROS] = 2, [SPECIES_MAGIKARP] = 0, [SPECIES_GYARADOS] = 0, [SPECIES_LAPRAS] = 2, [SPECIES_DITTO] = 2, [SPECIES_EEVEE] = 2, [SPECIES_VAPOREON] = 0, [SPECIES_JOLTEON] = 0, [SPECIES_FLAREON] = 0, [SPECIES_PORYGON] = 0, [SPECIES_OMANYTE] = 0, [SPECIES_OMASTAR] = 0, [SPECIES_KABUTO] = 2, [SPECIES_KABUTOPS] = 2, [SPECIES_AERODACTYL] = 0, [SPECIES_SNORLAX] = 1, [SPECIES_ARTICUNO] = 0, [SPECIES_ZAPDOS] = 0, [SPECIES_MOLTRES] = 0, [SPECIES_DRATINI] = 0, [SPECIES_DRAGONAIR] = 0, [SPECIES_DRAGONITE] = 2, [SPECIES_MEWTWO] = 2, [SPECIES_MEW] = 0, [SPECIES_CHIKORITA] = 1, [SPECIES_BAYLEEF] = 1, [SPECIES_MEGANIUM] = 1, [SPECIES_CYNDAQUIL] = 1, [SPECIES_QUILAVA] = 1, [SPECIES_TYPHLOSION] = 1, [SPECIES_TOTODILE] = 2, [SPECIES_CROCONAW] = 2, [SPECIES_FERALIGATR] = 2, [SPECIES_SENTRET] = 2, [SPECIES_FURRET] = 2, [SPECIES_HOOTHOOT] = 2, [SPECIES_NOCTOWL] = 2, [SPECIES_LEDYBA] = 0, [SPECIES_LEDIAN] = 0, [SPECIES_SPINARAK] = 1, [SPECIES_ARIADOS] = 0, [SPECIES_CROBAT] = 2, [SPECIES_CHINCHOU] = 2, [SPECIES_LANTURN] = 0, [SPECIES_PICHU] = 0, [SPECIES_CLEFFA] = 0, [SPECIES_IGGLYBUFF] = 1, [SPECIES_TOGEPI] = 2, [SPECIES_TOGETIC] = 2, [SPECIES_NATU] = 0, [SPECIES_XATU] = 0, [SPECIES_MAREEP] = 2, [SPECIES_FLAAFFY] = 0, [SPECIES_AMPHAROS] = 0, [SPECIES_BELLOSSOM] = 1, [SPECIES_MARILL] = 2, [SPECIES_AZUMARILL] = 2, [SPECIES_SUDOWOODO] = 1, [SPECIES_POLITOED] = 1, [SPECIES_HOPPIP] = 1, [SPECIES_SKIPLOOM] = 1, [SPECIES_JUMPLUFF] = 2, [SPECIES_AIPOM] = 2, [SPECIES_SUNKERN] = 1, [SPECIES_SUNFLORA] = 1, [SPECIES_YANMA] = 1, [SPECIES_WOOPER] = 0, [SPECIES_QUAGSIRE] = 0, [SPECIES_ESPEON] = 2, [SPECIES_UMBREON] = 2, [SPECIES_MURKROW] = 2, [SPECIES_SLOWKING] = 0, [SPECIES_MISDREAVUS] = 0, [SPECIES_UNOWN] = 0, [SPECIES_WOBBUFFET] = 0, [SPECIES_GIRAFARIG] = 1, [SPECIES_PINECO] = 0, [SPECIES_FORRETRESS] = 2, [SPECIES_DUNSPARCE] = 2, [SPECIES_GLIGAR] = 2, [SPECIES_STEELIX] = 0, [SPECIES_SNUBBULL] = 0, [SPECIES_GRANBULL] = 2, [SPECIES_QWILFISH] = 0, [SPECIES_SCIZOR] = 0, [SPECIES_SHUCKLE] = 1, [SPECIES_HERACROSS] = 2, [SPECIES_SNEASEL] = 0, [SPECIES_TEDDIURSA] = 0, [SPECIES_URSARING] = 2, [SPECIES_SLUGMA] = 0, [SPECIES_MAGCARGO] = 0, [SPECIES_SWINUB] = 2, [SPECIES_PILOSWINE] = 2, [SPECIES_CORSOLA] = 0, [SPECIES_REMORAID] = 0, [SPECIES_OCTILLERY] = 0, [SPECIES_DELIBIRD] = 0, [SPECIES_MANTINE] = 2, [SPECIES_SKARMORY] = 0, [SPECIES_HOUNDOUR] = 0, [SPECIES_HOUNDOOM] = 0, [SPECIES_KINGDRA] = 0, [SPECIES_PHANPY] = 0, [SPECIES_DONPHAN] = 0, [SPECIES_PORYGON2] = 0, [SPECIES_STANTLER] = 2, [SPECIES_SMEARGLE] = 1, [SPECIES_TYROGUE] = 2, [SPECIES_HITMONTOP] = 2, [SPECIES_SMOOCHUM] = 1, [SPECIES_ELEKID] = 1, [SPECIES_MAGBY] = 1, [SPECIES_MILTANK] = 1, [SPECIES_BLISSEY] = 1, [SPECIES_RAIKOU] = 0, [SPECIES_ENTEI] = 2, [SPECIES_SUICUNE] = 0, [SPECIES_LARVITAR] = 1, [SPECIES_PUPITAR] = 0, [SPECIES_TYRANITAR] = 1, [SPECIES_LUGIA] = 0, [SPECIES_HO_OH] = 1, [SPECIES_CELEBI] = 1, [SPECIES_OLD_UNOWN_B] = 0, [SPECIES_OLD_UNOWN_C] = 0, [SPECIES_OLD_UNOWN_D] = 0, [SPECIES_OLD_UNOWN_E] = 0, [SPECIES_OLD_UNOWN_F] = 0, [SPECIES_OLD_UNOWN_G] = 0, [SPECIES_OLD_UNOWN_H] = 0, [SPECIES_OLD_UNOWN_I] = 0, [SPECIES_OLD_UNOWN_J] = 0, [SPECIES_OLD_UNOWN_K] = 0, [SPECIES_OLD_UNOWN_L] = 0, [SPECIES_OLD_UNOWN_M] = 0, [SPECIES_OLD_UNOWN_N] = 0, [SPECIES_OLD_UNOWN_O] = 0, [SPECIES_OLD_UNOWN_P] = 0, [SPECIES_OLD_UNOWN_Q] = 0, [SPECIES_OLD_UNOWN_R] = 0, [SPECIES_OLD_UNOWN_S] = 0, [SPECIES_OLD_UNOWN_T] = 0, [SPECIES_OLD_UNOWN_U] = 0, [SPECIES_OLD_UNOWN_V] = 0, [SPECIES_OLD_UNOWN_W] = 0, [SPECIES_OLD_UNOWN_X] = 0, [SPECIES_OLD_UNOWN_Y] = 0, [SPECIES_OLD_UNOWN_Z] = 0, [SPECIES_TREECKO] = 1, [SPECIES_GROVYLE] = 0, [SPECIES_SCEPTILE] = 1, [SPECIES_TORCHIC] = 0, [SPECIES_COMBUSKEN] = 0, [SPECIES_BLAZIKEN] = 0, [SPECIES_MUDKIP] = 0, [SPECIES_MARSHTOMP] = 0, [SPECIES_SWAMPERT] = 0, [SPECIES_POOCHYENA] = 2, [SPECIES_MIGHTYENA] = 2, [SPECIES_ZIGZAGOON] = 2, [SPECIES_LINOONE] = 2, [SPECIES_WURMPLE] = 0, [SPECIES_SILCOON] = 2, [SPECIES_BEAUTIFLY] = 0, [SPECIES_CASCOON] = 2, [SPECIES_DUSTOX] = 1, [SPECIES_LOTAD] = 1, [SPECIES_LOMBRE] = 1, [SPECIES_LUDICOLO] = 1, [SPECIES_SEEDOT] = 1, [SPECIES_NUZLEAF] = 1, [SPECIES_SHIFTRY] = 0, [SPECIES_NINCADA] = 1, [SPECIES_NINJASK] = 1, [SPECIES_SHEDINJA] = 1, [SPECIES_TAILLOW] = 2, [SPECIES_SWELLOW] = 2, [SPECIES_SHROOMISH] = 1, [SPECIES_BRELOOM] = 1, [SPECIES_SPINDA] = 1, [SPECIES_WINGULL] = 0, [SPECIES_PELIPPER] = 0, [SPECIES_SURSKIT] = 2, [SPECIES_MASQUERAIN] = 0, [SPECIES_WAILMER] = 2, [SPECIES_WAILORD] = 0, [SPECIES_SKITTY] = 0, [SPECIES_DELCATTY] = 2, [SPECIES_KECLEON] = 1, [SPECIES_BALTOY] = 1, [SPECIES_CLAYDOL] = 0, [SPECIES_NOSEPASS] = 0, [SPECIES_TORKOAL] = 1, [SPECIES_SABLEYE] = 2, [SPECIES_BARBOACH] = 0, [SPECIES_WHISCASH] = 0, [SPECIES_LUVDISC] = 0, [SPECIES_CORPHISH] = 0, [SPECIES_CRAWDAUNT] = 0, [SPECIES_FEEBAS] = 2, [SPECIES_MILOTIC] = 0, [SPECIES_CARVANHA] = 0, [SPECIES_SHARPEDO] = 0, [SPECIES_TRAPINCH] = 1, [SPECIES_VIBRAVA] = 1, [SPECIES_FLYGON] = 1, [SPECIES_MAKUHITA] = 2, [SPECIES_HARIYAMA] = 1, [SPECIES_ELECTRIKE] = 1, [SPECIES_MANECTRIC] = 0, [SPECIES_NUMEL] = 1, [SPECIES_CAMERUPT] = 0, [SPECIES_SPHEAL] = 2, [SPECIES_SEALEO] = 2, [SPECIES_WALREIN] = 0, [SPECIES_CACNEA] = 1, [SPECIES_CACTURNE] = 1, [SPECIES_SNORUNT] = 2, [SPECIES_GLALIE] = 0, [SPECIES_LUNATONE] = 1, [SPECIES_SOLROCK] = 0, [SPECIES_AZURILL] = 2, [SPECIES_SPOINK] = 0, [SPECIES_GRUMPIG] = 2, [SPECIES_PLUSLE] = 0, [SPECIES_MINUN] = 0, [SPECIES_MAWILE] = 2, [SPECIES_MEDITITE] = 0, [SPECIES_MEDICHAM] = 0, [SPECIES_SWABLU] = 0, [SPECIES_ALTARIA] = 0, [SPECIES_WYNAUT] = 0, [SPECIES_DUSKULL] = 0, [SPECIES_DUSCLOPS] = 0, [SPECIES_ROSELIA] = 0, [SPECIES_SLAKOTH] = 2, [SPECIES_VIGOROTH] = 2, [SPECIES_SLAKING] = 1, [SPECIES_GULPIN] = 1, [SPECIES_SWALOT] = 2, [SPECIES_TROPIUS] = 1, [SPECIES_WHISMUR] = 0, [SPECIES_LOUDRED] = 2, [SPECIES_EXPLOUD] = 2, [SPECIES_CLAMPERL] = 0, [SPECIES_HUNTAIL] = 0, [SPECIES_GOREBYSS] = 0, [SPECIES_ABSOL] = 0, [SPECIES_SHUPPET] = 0, [SPECIES_BANETTE] = 0, [SPECIES_SEVIPER] = 2, [SPECIES_ZANGOOSE] = 0, [SPECIES_RELICANTH] = 1, [SPECIES_ARON] = 2, [SPECIES_LAIRON] = 2, [SPECIES_AGGRON] = 2, [SPECIES_CASTFORM] = 0, [SPECIES_VOLBEAT] = 0, [SPECIES_ILLUMISE] = 2, [SPECIES_LILEEP] = 2, [SPECIES_CRADILY] = 0, [SPECIES_ANORITH] = 0, [SPECIES_ARMALDO] = 0, [SPECIES_RALTS] = 1, [SPECIES_KIRLIA] = 1, [SPECIES_GARDEVOIR] = 1, [SPECIES_BAGON] = 2, [SPECIES_SHELGON] = 2, [SPECIES_SALAMENCE] = 0, [SPECIES_BELDUM] = 0, [SPECIES_METANG] = 0, [SPECIES_METAGROSS] = 0, [SPECIES_REGIROCK] = 2, [SPECIES_REGICE] = 2, [SPECIES_REGISTEEL] = 2, [SPECIES_KYOGRE] = 2, [SPECIES_GROUDON] = 0, [SPECIES_RAYQUAZA] = 1, [SPECIES_LATIAS] = 0, [SPECIES_LATIOS] = 2, [SPECIES_JIRACHI] = 0, [SPECIES_DEOXYS] = 0, [SPECIES_CHIMECHO] = 0, [SPECIES_EGG] = 1, [SPECIES_UNOWN_B] = 0, [SPECIES_UNOWN_C] = 0, [SPECIES_UNOWN_D] = 0, [SPECIES_UNOWN_E] = 0, [SPECIES_UNOWN_F] = 0, [SPECIES_UNOWN_G] = 0, [SPECIES_UNOWN_H] = 0, [SPECIES_UNOWN_I] = 0, [SPECIES_UNOWN_J] = 0, [SPECIES_UNOWN_K] = 0, [SPECIES_UNOWN_L] = 0, [SPECIES_UNOWN_M] = 0, [SPECIES_UNOWN_N] = 0, [SPECIES_UNOWN_O] = 0, [SPECIES_UNOWN_P] = 0, [SPECIES_UNOWN_Q] = 0, [SPECIES_UNOWN_R] = 0, [SPECIES_UNOWN_S] = 0, [SPECIES_UNOWN_T] = 0, [SPECIES_UNOWN_U] = 0, [SPECIES_UNOWN_V] = 0, [SPECIES_UNOWN_W] = 0, [SPECIES_UNOWN_X] = 0, [SPECIES_UNOWN_Y] = 0, [SPECIES_UNOWN_Z] = 0, [SPECIES_UNOWN_EMARK] = 0, [SPECIES_UNOWN_QMARK] = 0 }; const struct SpritePalette gMonIconPaletteTable[] = { { gMonIconPalettes[0], POKE_ICON_BASE_PAL_TAG + 0 }, { gMonIconPalettes[1], POKE_ICON_BASE_PAL_TAG + 1 }, { gMonIconPalettes[2], POKE_ICON_BASE_PAL_TAG + 2 }, // The following three point outside the gMonIconPalettes array // and are therefore invalid. Fortunately, they are never used. { gMonIconPalettes[3], POKE_ICON_BASE_PAL_TAG + 3 }, { gMonIconPalettes[4], POKE_ICON_BASE_PAL_TAG + 4 }, { gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 } }; static const struct OamData sMonIconOamData = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .matrixNum = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AnimCmd sMonIconAnim_Fast[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(1, 6), ANIMCMD_JUMP(0) }; static const union AnimCmd sMonIconAnim_MediumFast[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), ANIMCMD_JUMP(0) }; static const union AnimCmd sMonIconAnim_MediumSlow[] = { ANIMCMD_FRAME(0, 14), ANIMCMD_FRAME(1, 14), ANIMCMD_JUMP(0) }; static const union AnimCmd sMonIconAnim_Slow[] = { ANIMCMD_FRAME(0, 22), ANIMCMD_FRAME(1, 22), ANIMCMD_JUMP(0) }; static const union AnimCmd sMonIconAnim_Still[] = { ANIMCMD_FRAME(0, 29), ANIMCMD_FRAME(0, 29), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sMonIconAnims[] = { sMonIconAnim_Fast, sMonIconAnim_MediumFast, sMonIconAnim_MediumSlow, sMonIconAnim_Slow, sMonIconAnim_Still }; static const union AffineAnimCmd sMonIconAffineAnim_0[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 10), AFFINEANIMCMD_END }; static const union AffineAnimCmd sMonIconAffineAnim_1[] = { AFFINEANIMCMD_FRAME(-2, -2, 0, 122), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sMonIconAffineAnims[] = { sMonIconAffineAnim_0, sMonIconAffineAnim_1 }; static const u16 sSpriteImageSizes[][4] = { [ST_OAM_SQUARE] = { [ST_OAM_SIZE_0] = 0x020, [ST_OAM_SIZE_1] = 0x080, [ST_OAM_SIZE_2] = 0x200, [ST_OAM_SIZE_3] = 0x800, }, [ST_OAM_H_RECTANGLE] = { [ST_OAM_SIZE_0] = 0x040, [ST_OAM_SIZE_1] = 0x080, [ST_OAM_SIZE_2] = 0x100, [ST_OAM_SIZE_3] = 0x400, }, [ST_OAM_V_RECTANGLE] = { [ST_OAM_SIZE_0] = 0x040, [ST_OAM_SIZE_1] = 0x080, [ST_OAM_SIZE_2] = 0x100, [ST_OAM_SIZE_3] = 0x400, }, }; u8 CreateMonIcon(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, u32 personality, bool32 extra) { u8 spriteId; struct MonIconSpriteTemplate iconTemplate = { .oam = &sMonIconOamData, .image = GetMonIconPtr(species, personality, extra), .anims = sMonIconAnims, .affineAnims = sMonIconAffineAnims, .callback = callback, .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], }; if (species > NUM_SPECIES) iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); UpdateMonIconFrame(&gSprites[spriteId]); return spriteId; } u8 CreateMonIcon_HandleDeoxys(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, bool32 extra) { u8 spriteId; struct MonIconSpriteTemplate iconTemplate = { .oam = &sMonIconOamData, .image = NULL, .anims = sMonIconAnims, .affineAnims = sMonIconAffineAnims, .callback = callback, .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], }; iconTemplate.image = GetMonIconTiles(species, extra); spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); UpdateMonIconFrame(&gSprites[spriteId]); return spriteId; } u16 GetIconSpecies(u16 species, u32 personality) { u16 result; if (species == SPECIES_UNOWN) { u16 letter = GetUnownLetterByPersonality(personality); if (letter == 0) letter = SPECIES_UNOWN; else letter += (SPECIES_UNOWN_B - 1); result = letter; } else if(species == SPECIES_DEOXYS) { switch(personality) //pid was hijacked to hold Deoxys forms { //setting result to arbitrarily high numbers //picked highest ones to not interfere with //Pokemon expansion. case 1: //Attack Forme result = 65531; break; case 2: result = 65532; break; case 3: result = 65533; break; default: //Normal Forme result = 65530; } } else if(species >= 65530 && species <= 65533) { result = species; } else { if (species > NUM_SPECIES) result = SPECIES_NONE; else result = species; } return result; } u16 GetUnownLetterByPersonality(u32 personality) { if (!personality) return 0; else return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; } u16 MailSpeciesToIconSpecies(u16 species) { u16 value; if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN) { if (value == 0) value += SPECIES_UNOWN; else value += (SPECIES_UNOWN_B - 1); return value; } else { if (species > (SPECIES_UNOWN_B - 1)) species = SPECIES_NONE; return GetIconSpecies(species, 0); } } const u8 *GetMonIconTiles(u16 species, bool32 extra) { const u8 *iconSprite = gMonIconTable[species]; if(species >= 65530 && species <= 65533) { iconSprite = (const u8*)gMonIconTable[SPECIES_DEOXYS]; } if (extra == TRUE && (species >= 65530 && species <= 65533)) { //iconSprite = (const u8*)(0x400 + (u32)iconSprite); // use the specific Deoxys form icon (Speed in this case) switch(species) { //Normal Forme is already loaded and overwritten here case 65531: //Attack Forme iconSprite = (const u8*)(0x400 + (u32)iconSprite); break; case 65532: //Defense Forme iconSprite = (const u8*)((0x400 * 2) + (u32)iconSprite); break; case 65533: //Speed Forme iconSprite = (const u8*)((0x400 * 3) + (u32)iconSprite); break; } } return iconSprite; } const u8 *GetMonIconPtr(u16 species, u32 personality, bool32 extra) { return GetMonIconTiles(GetIconSpecies(species, personality), extra); } void DestroyMonIcon(struct Sprite *sprite) { DestroyMonIconInternal(sprite); } void LoadMonIconPalettes(void) { u32 i; for (i = 0; i < ARRAY_COUNT(gMonIconPaletteTable); i++) LoadSpritePalette(&gMonIconPaletteTable[i]); } void SafeLoadMonIconPalette(u16 species) { u8 palIndex; if (species > NUM_SPECIES) species = SPECIES_NONE; palIndex = gMonIconPaletteIndices[species]; if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) LoadSpritePalette(&gMonIconPaletteTable[palIndex]); } void LoadMonIconPalette(u16 species) { u8 palIndex; palIndex = gMonIconPaletteIndices[species]; if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) LoadSpritePalette(&gMonIconPaletteTable[palIndex]); } void FreeMonIconPalettes(void) { u32 i; for (i = 0; i < ARRAY_COUNT(gMonIconPaletteTable); i++) FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag); } void SafeFreeMonIconPalette(u16 species) { u8 palIndex; if (species > NUM_SPECIES) species = SPECIES_NONE; palIndex = gMonIconPaletteIndices[species]; FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); } void FreeMonIconPalette(u16 species) { u8 palIndex; palIndex = gMonIconPaletteIndices[species]; FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); } void SpriteCB_MonIcon(struct Sprite *sprite) { UpdateMonIconFrame(sprite); } void LoadMonIconPalettesAt(u16 offset) { int i; if (offset <= BG_PLTT_ID(16 - ARRAY_COUNT(gMonIconPaletteTable))) { for (i = 0; i < (int)ARRAY_COUNT(gMonIconPaletteTable); i++) { LoadPalette(gMonIconPaletteTable[i].data, offset, PLTT_SIZE_4BPP); offset += 16; } } } const u16 *GetValidMonIconPalettePtr(u16 species) { if (species > NUM_SPECIES) species = SPECIES_NONE; return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data; } u8 GetValidMonIconPalIndex(u16 species) { if (species > NUM_SPECIES) species = SPECIES_NONE; return gMonIconPaletteIndices[species]; } u8 GetMonIconPaletteIndexFromSpecies(u16 species) { return gMonIconPaletteIndices[species]; } u8 UpdateMonIconFrame(struct Sprite *sprite) { u8 result = 0; if (sprite->animDelayCounter == 0) { s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; switch (frame) { case -1: break; case -2: sprite->animCmdIndex = 0; break; default: RequestSpriteCopy( // pointer arithmetic is needed to get the correct pointer to perform the sprite copy on. // because sprite->images is a struct def, it has to be casted to (u8 *) before any // arithmetic can be performed. (u8 *)sprite->images + (sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame), (u8 *)(OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP), sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]); sprite->animDelayCounter = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration & 0xFF; sprite->animCmdIndex++; result = sprite->animCmdIndex; break; } } else { sprite->animDelayCounter--; } return result; } static u8 CreateMonIconSprite(const struct MonIconSpriteTemplate * iconTemplate, s16 x, s16 y, u8 subpriority) { u8 spriteId; struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] }; struct SpriteTemplate spriteTemplate = { .tileTag = TAG_NONE, .paletteTag = iconTemplate->paletteTag, .oam = iconTemplate->oam, .anims = iconTemplate->anims, .images = &image, .affineAnims = iconTemplate->affineAnims, .callback = iconTemplate->callback, }; spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); gSprites[spriteId].animPaused = TRUE; gSprites[spriteId].animBeginning = FALSE; gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image; return spriteId; } static void DestroyMonIconInternal(struct Sprite *sprite) { struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] }; sprite->images = ℑ DestroySprite(sprite); } void SetPartyHPBarSprite(struct Sprite *sprite, u8 animNum) { sprite->animNum = animNum; sprite->animDelayCounter = 0; sprite->animCmdIndex = 0; } ================================================ FILE: src/pokemon_jump.c ================================================ #include "global.h" #include "gflib.h" #include "battle_anim.h" #include "decompress.h" #include "digit_obj_util.h" #include "dynamic_placeholder_text_util.h" #include "event_data.h" #include "item.h" #include "link.h" #include "link_rfu.h" #include "menu.h" #include "minigame_countdown.h" #include "new_menu_helpers.h" #include "pokemon_jump.h" #include "random.h" #include "save.h" #include "script.h" #include "strings.h" #include "task.h" #include "text_window.h" #include "trig.h" #include "constants/items.h" #include "constants/songs.h" #define MAX_JUMP_SCORE 99990 #define MAX_JUMPS 9999 #define JUMP_PEAK (-30) enum { BG_INTERFACE, BG_BONUSES, BG_VENUSAUR, BG_SCENERY, }; // IDs for persistent windows enum { WIN_POINTS, WIN_TIMES, NUM_WINDOWS }; enum { PACKET_MON_INFO = 1, PACKET_UNUSED, PACKET_LEADER_STATE, PACKET_MEMBER_STATE, }; enum { JUMP_TYPE_NORMAL, JUMP_TYPE_FAST, JUMP_TYPE_SLOW, }; enum { FUNC_GAME_INTRO, FUNC_WAIT_ROUND, FUNC_GAME_ROUND, FUNC_GAME_OVER, FUNC_ASK_PLAY_AGAIN, FUNC_RESET_GAME, FUNC_EXIT, FUNC_GIVE_PRIZE, FUNC_SAVE, FUNC_NONE }; enum { GFXFUNC_LOAD, GFXFUNC_SHOW_NAMES, GFXFUNC_SHOW_NAMES_HIGHLIGHT, GFXFUNC_ERASE_NAMES, GFXFUNC_MSG_PLAY_AGAIN, GFXFUNC_MSG_SAVING, GFXFUNC_ERASE_MSG, GFXFUNC_MSG_PLAYER_DROPPED, GFXFUNC_MSG_COMM_STANDBY, GFXFUNC_COUNTDOWN, }; enum { VINE_HIGHEST, VINE_DOWNSWING_HIGHER, VINE_DOWNSWING_HIGH, VINE_DOWNSWING_LOW, VINE_DOWNSWING_LOWER, VINE_LOWEST, VINE_UPSWING_LOWER, VINE_UPSWING_LOW, VINE_UPSWING_HIGH, VINE_UPSWING_HIGHER, NUM_VINESTATES }; // Used to compare limits for vineStateTimer // The upper 8 bits of vineStateTimer are the vine state, // the lower 8 bits are a timer to the next state. // When the timer is incremented above 255, it increments // the vine state and the timer is reset. #define VINE_STATE_TIMER(vineState)(((vineState) << 8) | 0xFF) enum { MONSTATE_NORMAL, // Pokémon is either on the ground or in the middle of a jump MONSTATE_JUMP, // Pokémon has begun a jump MONSTATE_HIT, // Pokémon got hit by the vine }; enum { JUMPSTATE_NONE, JUMPSTATE_SUCCESS, // Cleared vine JUMPSTATE_FAILURE, // Hit vine }; #define PLAY_AGAIN_NO 1 #define PLAY_AGAIN_YES 2 #define TAG_MON1 0 #define TAG_MON2 1 // MON2-5 used implicitly by adding multiplayer id to tag #define TAG_MON3 2 #define TAG_MON4 3 #define TAG_MON5 4 #define GFXTAG_VINE1 5 #define GFXTAG_VINE2 6 #define GFXTAG_VINE3 7 #define GFXTAG_VINE4 8 #define GFXTAG_COUNTDOWN 9 #define GFXTAG_STAR 10 #define PALTAG_1 5 #define PALTAG_2 6 #define PALTAG_COUNTDOWN 7 #define TAG_DIGITS 800 #define VINE_SPRITES_PER_SIDE 4 // Vine rope is divided into 8 sprites, 4 per side copied and flipped horizontally // Used by SetLinkTimeInterval to get a bit mask for capping // a timer that controls how frequently link data is sent. #define LINK_INTERVAL_NONE 0 #define LINK_INTERVAL_SHORT 3 // 3 frame interval #define LINK_INTERVAL_MEDIUM 4 // 7 frame interval #define LINK_INTERVAL_LONG 5 // 15 frame interval #define LINK_TIMER_STOPPED 0x1111 struct PokemonJump_MonInfo { u16 species; u32 otId; u32 personality; }; struct PokemonJump_Player { int jumpOffset; int jumpOffsetIdx; u32 unused; u16 monJumpType; u16 jumpTimeStart; u16 monState; u16 prevMonState; int jumpState; bool32 funcFinished; u8 name[11]; }; struct PokemonJumpGfx { bool32 funcFinished; u16 mainState; u8 taskId; u8 unused1[3]; u8 resetVineState; u8 resetVineTimer; u8 vineState; u8 msgWindowState; u8 vinePalNumDownswing; u8 vinePalNumUpswing; u16 unused2; u16 msgWindowId; u16 fanfare; u32 bonusTimer; u16 nameWindowIds[MAX_RFU_PLAYERS]; u8 itemName[64]; u8 itemQuantityStr[64]; u8 prizeMsg[256]; u16 tilemapBuffer[0x4000]; // Bug: way larger than it should be struct Sprite *monSprites[MAX_RFU_PLAYERS]; struct Sprite *starSprites[MAX_RFU_PLAYERS]; struct Sprite *vineSprites[VINE_SPRITES_PER_SIDE * 2]; u8 unused3[12]; u8 monSpriteSubpriorities[MAX_RFU_PLAYERS]; }; struct PokemonJump_CommData { u8 funcId; u8 receivedBonusFlags; u16 data; // Multi-use u16 jumpsInRow; u32 jumpScore; }; struct PokemonJump { MainCallback exitCallback; u8 taskId; u8 numPlayers; u8 multiplayerId; u8 startDelayTimer; u16 mainState; u16 helperState; u16 excellentsInRow; u16 excellentsInRowRecord; bool32 gameOver; u32 vineState; u32 prevVineState; int vineSpeed; u32 vineSpeedAccel; u32 rngSeed; u32 nextVineSpeed; int linkTimer; u32 linkTimerLimit; u16 vineStateTimer; bool16 ignoreJumpInput; u16 unused1; u16 unused2; // Set to 0, never read u16 timer; u16 prizeItemId; u16 prizeItemQuantity; u16 playAgainComm; u8 unused3; // Set to 0, never read u8 playAgainState; bool8 allowVineUpdates; bool8 isLeader; bool8 funcActive; bool8 allPlayersReady; u16 vineTimer; u8 nextFuncId; bool8 showBonus; u16 vineSpeedDelay; u8 vineBaseSpeedIdx; u8 vineSpeedStage; int numPlayersAtPeak; bool32 initScoreUpdate; bool32 updateScore; bool32 unused4; // Set to TRUE, never read bool32 giveBonus; bool32 skipJumpUpdate; bool32 atMaxSpeedStage; struct PokemonJump_CommData comm; bool8 atJumpPeak[MAX_RFU_PLAYERS]; bool8 atJumpPeak2[MAX_RFU_PLAYERS]; bool8 atJumpPeak3[MAX_RFU_PLAYERS]; u8 memberFuncIds[MAX_RFU_PLAYERS]; u16 playAgainStates[MAX_RFU_PLAYERS]; u16 jumpTimeStarts[MAX_RFU_PLAYERS]; struct PokemonJumpGfx jumpGfx; struct PokemonJump_MonInfo monInfo[MAX_RFU_PLAYERS]; struct PokemonJump_Player players[MAX_RFU_PLAYERS]; struct PokemonJump_Player *player; }; static void Task_StaticCountdown(u8 taskId); static void Task_StaticCountdown_Init(u8 taskId); static void Task_StaticCountdown_Free(u8 taskId); static void Task_StaticCountdown_Start(u8 taskId); static void Task_StaticCountdown_Run(u8 taskId); static void InitGame(struct PokemonJump *); static void ResetForNewGame(struct PokemonJump *); static void InitPlayerAndJumpTypes(void); static void ResetPlayersForNewGame(void); static s16 GetPokemonJumpSpeciesIdx(u16 species); static void InitJumpMonInfo(struct PokemonJump_MonInfo *monInfo, struct Pokemon *mon); static void CB2_PokemonJump(void); static void Task_StartPokemonJump(u8 taskId); static void Task_PokemonJump_Leader(u8 taskId); static void SendLinkData_Leader(void); static void Task_PokemonJump_Member(u8 taskId); static void SendLinkData_Member(void); static bool32 GameIntro_Leader(void); static bool32 WaitRound_Leader(void); static bool32 GameRound_Leader(void); static bool32 GameOver_Leader(void); static bool32 GameOver_Member(void); static bool32 AskPlayAgain_Leader(void); static bool32 AskPlayAgain_Member(void); static bool32 ResetGame_Leader(void); static bool32 ResetGame_Member(void); static bool32 ExitGame(void); static bool32 GivePrize_Leader(void); static bool32 GivePrize_Member(void); static bool32 SavePokeJump(void); static bool32 DoGameIntro(void); static bool32 HandleSwingRound(void); static bool32 DoVineHitEffect(void); static bool32 GameIntro_Member(void); static bool32 WaitRound_Member(void); static bool32 GameRound_Member(void); static bool32 TryGivePrize(void); static bool32 DoPlayAgainPrompt(void); static bool32 ClosePokeJumpLink(void); static bool32 CloseMessageAndResetScore(void); static void Task_CommunicateMonInfo(u8 taskId); static void SetTaskWithPokeJumpStruct(TaskFunc func, u8 taskPriority); static void InitVineState(void); static void ResetVineState(void); static void UpdateVineState(void); static int GetVineSpeed(void); static void UpdateVineSpeed(void); static int PokeJumpRandom(void); static void ResetVineAfterHit(void); static void ResetPlayersJumpStates(void); static void ResetPlayersMonState(void); static bool32 IsPlayersMonState(u16); static void SetMonStateJump(void); static void UpdateGame(void); static void TryUpdateVineSwing(void); static void DisallowVineUpdates(void); static void AllowVineUpdates(void); static void HandleMonState(void); static void UpdateJump(int); static void TryUpdateScore(void); static bool32 UpdateVineHitStates(void); static bool32 AllPlayersJumpedOrHit(void); static bool32 DidAllPlayersClearVine(void); static bool32 ShouldPlayAgain(void); static void AddJumpScore(int); static int GetPlayersAtJumpPeak(void); static bool32 AreLinkQueuesEmpty(void); static int GetNumPlayersForBonus(u8 *); static void ClearUnreadField(void); static int GetScoreBonus(int); static void TryUpdateExcellentsRecord(u16); static bool32 HasEnoughScoreForPrize(void); static u16 GetPrizeData(void); static void UnpackPrizeData(u16, u16 *, u16 *); static u16 GetPrizeItemId(void); static u16 GetPrizeQuantity(void); static u16 GetQuantityLimitedByBag(u16 item, u16 quantity); static void SetUpPokeJumpGfxFunc(void (*func)(void)); static void Task_RunPokeJumpGfxFunc(u8 taskId); static void LoadPokeJumpGfx(void); static void PrintPlayerNamesNoHighlight(void); static void PrintPlayerNamesWithHighlight(void); static void ErasePlayerNames(void); static void Msg_WantToPlayAgain(void); static void Msg_SavingDontTurnOff(void); static void EraseMessage(void); static void Msg_SomeoneDroppedOut(void); static void Msg_CommunicationStandby(void); static void DoPokeJumpCountdown(void); static u32 AddMessageWindow(u32 left, u32 top, u32 width, u32 height); static void CreatePokeJumpYesNoMenu(u16 left, u16 top, u8 cursorPos); static void PrintScoreSuffixes(void); static void CreateJumpMonSprites(void); static void InitDigitPrinters(void); static void AddPlayerNameWindows(void); static void PrintPokeJumpPlayerNames(bool32); static void DrawPlayerNameWindows(void); static void ShowBonus(u8); static void Task_UpdateBonus(u8 taskId); static void InitPokeJumpGfx(struct PokemonJumpGfx *); static void SpriteCB_Star(struct Sprite *sprite); static void SpriteCB_MonHitShake(struct Sprite *sprite); static void SpriteCB_MonHitFlash(struct Sprite *sprite); static void SpriteCB_MonIntroBounce(struct Sprite *sprite); static void Task_ShowPokemonJumpRecords(u8 taskId); static void TruncateToFirstWordOnly(u8 *str); static void PrintRecordsText(u16 windowId); static void UpdateVineSwing(int id); static void StartPokeJumpGfx(struct PokemonJumpGfx *); static void FreeWindowsAndDigitObj(void); static void SetUpPokeJumpGfxFuncById(int); static bool32 IsPokeJumpGfxFuncFinished(void); static void SetUpResetVineGfx(void); static bool32 ResetVineGfx(void); static void PrintPrizeMessage(u16, u16); static void PrintPrizeFilledBagMessage(u16); static void PrintNoRoomForPrizeMessage(u16); static bool32 DoPrizeMessageAndFanfare(void); static void ClearMessageWindow(void); static void SetMonSpriteY(u32 , s16); static void StartMonHitShake(u8); static bool32 RemoveMessageWindow(void); static void PrintScore(int); static s8 HandlePlayAgainInput(void); static int DoSameJumpTimeBonus(u8); static void PrintJumpsInRow(u16); static void StartMonHitFlash(u8); static int IsMonHitShakeActive(int); static void StopMonHitFlash(void); static void ResetMonSpriteSubpriorities(void); static void StartMonIntroBounce(int); static int IsMonIntroBounceActive(void); static void SendPacket_MonInfo(struct PokemonJump_MonInfo *); static bool32 RecvPacket_MonInfo(int multiplayerId, struct PokemonJump_MonInfo *); static void SendPacket_LeaderState(struct PokemonJump_Player *, struct PokemonJump_CommData *); static bool32 RecvPacket_LeaderState(struct PokemonJump_Player *, struct PokemonJump_CommData *); static void SendPacket_MemberState(struct PokemonJump_Player *, u8, u16); static bool32 RecvPacket_MemberStateToLeader(struct PokemonJump_Player *, int, u8 *, u16 *); static bool32 RecvPacket_MemberStateToMember(struct PokemonJump_Player *, int); static bool32 TryUpdateRecords(u32, u16, u16); static void IncrementGamesWithMaxPlayers(void); static void LoadSpriteSheetsAndPalettes(struct PokemonJumpGfx *); static void CreateVineSprites(struct PokemonJumpGfx *); static void StartPokeJumpCountdown(struct PokemonJumpGfx *); static bool32 IsPokeJumpCountdownRunning(void); static void UpdateVineAnim(struct PokemonJumpGfx *, int); static void DoStarAnim(struct PokemonJumpGfx *, int); static void CreateJumpMonSprite(struct PokemonJumpGfx *, struct PokemonJump_MonInfo *,s16, s16, u8); static void CreateStarSprite(struct PokemonJumpGfx *,s16, s16, u8); static void Gfx_StartMonHitShake(struct PokemonJumpGfx *, int); static void Gfx_StartMonHitFlash(struct PokemonJumpGfx *, int); static bool32 Gfx_IsMonHitShakeActive(struct PokemonJumpGfx *, int); static void Gfx_StopMonHitFlash(struct PokemonJumpGfx *); static void Gfx_ResetMonSpriteSubpriorities(struct PokemonJumpGfx *); static void Gfx_StartMonIntroBounce(struct PokemonJumpGfx *, int); static bool32 Gfx_IsMonIntroBounceActive(struct PokemonJumpGfx *); EWRAM_DATA static struct PokemonJump *sPokemonJump = NULL; EWRAM_DATA static struct PokemonJumpGfx *sPokemonJumpGfx = NULL; // Unused static version of the wireless minigame countdown #define TAG_STATIC_COUNTDOWN 0x2000 enum { STATE_IDLE = 1, STATE_START, STATE_RUN, STATE_END, }; enum { FUNC_INIT, FUNC_FREE, FUNC_START, FUNC_RUN, }; enum { ANIM_THREE, ANIM_TWO, ANIM_ONE, ANIM_START_LEFT, ANIM_START_MID, ANIM_START_RIGHT, }; static const u16 s321Start_Static_Pal[] = INCBIN_U16("graphics/link/321start.gbapal"); static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/link/321start.4bpp.lz"); static const struct CompressedSpriteSheet sSpriteSheet_321Start_Static[] = { {s321Start_Static_Gfx, 0xC00, TAG_STATIC_COUNTDOWN}, {} }; static const struct SpritePalette sSpritePalette_321Start_Static[] = { {s321Start_Static_Pal, TAG_STATIC_COUNTDOWN}, {} }; static const union AnimCmd sAnim_StaticCountdown_Three[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sAnim_StaticCountdown_Two[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END }; static const union AnimCmd sAnim_StaticCountdown_One[] = { ANIMCMD_FRAME(32, 0), ANIMCMD_END }; static const union AnimCmd sAnim_StaticCountdown_StartLeft[] = { ANIMCMD_FRAME(64, 0), ANIMCMD_END }; static const union AnimCmd sAnim_StaticCountdown_StartMid[] = { ANIMCMD_FRAME(48, 0), ANIMCMD_END }; static const union AnimCmd sAnim_StaticCountdown_StartRight[] = { ANIMCMD_FRAME(80, 0), ANIMCMD_END }; static const union AnimCmd *const sAnims_StaticCountdown[] = { [ANIM_THREE] = sAnim_StaticCountdown_Three, [ANIM_TWO] = sAnim_StaticCountdown_Two, [ANIM_ONE] = sAnim_StaticCountdown_One, [ANIM_START_LEFT] = sAnim_StaticCountdown_StartLeft, [ANIM_START_MID] = sAnim_StaticCountdown_StartMid, [ANIM_START_RIGHT] = sAnim_StaticCountdown_StartRight }; static const struct SpriteTemplate sSpriteTemplate_StaticCountdown[] = { { .tileTag = TAG_STATIC_COUNTDOWN, .paletteTag = TAG_STATIC_COUNTDOWN, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_StaticCountdown, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }, }; static const TaskFunc sStaticCountdownFuncs[][4] = { { [FUNC_INIT] = Task_StaticCountdown_Init, [FUNC_FREE] = Task_StaticCountdown_Free, [FUNC_START] = Task_StaticCountdown_Start, [FUNC_RUN] = Task_StaticCountdown_Run }, }; #define tState data[0] #define tFuncSetId data[1] // These 4 data elements are indexes into #define tSpriteTemplateId data[2] // arrays that only have 1 element with #define tSpriteSheetId data[3] // data. As such their only legal value #define tSpritePalId data[4] // is 0. Unclear why they were used. #define tInterval data[5] #define tPriority data[6] #define tSubpriority data[7] #define tNumSprites data[8] #define tX data[9] #define tY data[10] #define tPrevTime data[10] // Re-used #define tTimer data[11] #define tLinkTimer data[12] // 13-15 hold sprite ids // tSpriteIds(0) is used for the number sprites, and the leftmost part of 'Start' // tSpriteIds(1) is used for the middle part of 'Start' // tSpriteIds(2) is used for for the rightmost part of 'Start' #define tSpriteIds(i) data[13 + i] #define sInterval data[1] // Never read #define sAnimNum data[2] #define sTaskId data[3] #define sId data[4] // Never read #define sNumberSpriteId data[5] // Never read // Unused static u8 CreateStaticCountdownTask(u8 funcSetId, u8 taskPriority) { u8 taskId = CreateTask(Task_StaticCountdown, taskPriority); struct Task *task = &gTasks[taskId]; task->tState = STATE_IDLE; task->tFuncSetId = funcSetId; sStaticCountdownFuncs[funcSetId][FUNC_INIT](taskId); return taskId; } // Unused static bool32 StartStaticCountdown(void) { u8 taskId = FindTaskIdByFunc(Task_StaticCountdown); if (taskId == TASK_NONE) return FALSE; gTasks[taskId].tState = STATE_START; return TRUE; } // Unused static bool32 IsStaticCountdownRunning(void) { return FuncIsActiveTask(Task_StaticCountdown); } static void Task_StaticCountdown(u8 taskId) { s16 *data = gTasks[taskId].data; switch (tState) { // STATE_IDLE does nothing; wait until started case STATE_START: sStaticCountdownFuncs[tFuncSetId][FUNC_START](taskId); tState = STATE_RUN; break; case STATE_RUN: sStaticCountdownFuncs[tFuncSetId][FUNC_RUN](taskId); break; case STATE_END: sStaticCountdownFuncs[tFuncSetId][FUNC_FREE](taskId); DestroyTask(taskId); break; } } static void StaticCountdown_CreateSprites(u8 taskId, s16 *data) { u8 i; struct Sprite *sprite; LoadCompressedSpriteSheet(&sSpriteSheet_321Start_Static[tSpriteSheetId]); LoadSpritePalette(&sSpritePalette_321Start_Static[tSpritePalId]); for (i = 0; i < tNumSprites; i++) tSpriteIds(i) = CreateSprite(&sSpriteTemplate_StaticCountdown[tSpriteTemplateId], tX, tY, tSubpriority); for (i = 0; i < tNumSprites; i++) { sprite = &gSprites[tSpriteIds(i)]; sprite->oam.priority = tPriority; sprite->invisible = TRUE; sprite->sInterval = tInterval; sprite->sTaskId = taskId; sprite->sId = i; sprite->sNumberSpriteId = tSpriteIds(0); } } static void Task_StaticCountdown_Init(u8 taskId) { s16 *data = gTasks[taskId].data; tSpriteTemplateId = 0; tSpriteSheetId = 0; tSpritePalId = 0; tInterval = 60; tPriority = 0; tSubpriority = 0; tNumSprites = 3; tX = 120; tY = 88; StaticCountdown_CreateSprites(taskId, data); StartSpriteAnim(&gSprites[tSpriteIds(1)], ANIM_START_MID); gSprites[tSpriteIds(1)].x2 = -32; StartSpriteAnim(&gSprites[tSpriteIds(2)], ANIM_START_RIGHT); gSprites[tSpriteIds(2)].x2 = 32; } static void Task_StaticCountdown_Free(u8 taskId) { u8 i = 0; s16 *data = gTasks[taskId].data; for (i = 0; i < tNumSprites; i++) DestroySprite(&gSprites[tSpriteIds(i)]); FreeSpriteTilesByTag(sSpriteSheet_321Start_Static[tSpriteSheetId].tag); FreeSpritePaletteByTag(sSpritePalette_321Start_Static[tSpritePalId].tag); } static void SpriteCB_StaticCountdown(struct Sprite *sprite) { s16 *data = gTasks[sprite->sTaskId].data; if (tTimer % tInterval != 0) return; if (tTimer == tPrevTime) return; tPrevTime = tTimer; switch (sprite->sAnimNum) { case ANIM_THREE: sprite->invisible = FALSE; case ANIM_TWO: case ANIM_ONE: // Set sprite to a number PlaySE(SE_BALL_BOUNCE_1); StartSpriteAnim(sprite, sprite->sAnimNum); break; case ANIM_START_LEFT: // Set sprite to 'Start' PlaySE(SE_PIN); StartSpriteAnim(sprite, sprite->sAnimNum); gSprites[tSpriteIds(1)].invisible = FALSE; gSprites[tSpriteIds(2)].invisible = FALSE; break; case ANIM_START_LEFT + 1: // End // Hide countdown sprite->invisible = TRUE; gSprites[tSpriteIds(1)].invisible = TRUE; gSprites[tSpriteIds(2)].invisible = TRUE; tState = STATE_END; return; } sprite->sAnimNum++; } static void Task_StaticCountdown_Start(u8 taskId) { s16 *data = gTasks[taskId].data; PlaySE(SE_BALL_BOUNCE_1); gSprites[tSpriteIds(0)].callback = SpriteCB_StaticCountdown; gSprites[tSpriteIds(0)].invisible = FALSE; gTasks[taskId].tState = STATE_RUN; } // Increment timer for progressing the countdown. // If the player is the link leader, increment a // separate timer and send it to group members for // them to read and use. static void Task_StaticCountdown_Run(u8 taskId) { u16 packet[RFU_PACKET_SIZE]; s16 *data = gTasks[taskId].data; if (gReceivedRemoteLinkPlayers) { // Read link timer if (gRecvCmds[0][1] == LINKCMD_COUNTDOWN) tTimer = gRecvCmds[0][2]; if (GetMultiplayerId() == 0) { // Player is link leader. // Send timer to group members tLinkTimer++; memset(packet, 0, sizeof(packet)); packet[0] = LINKCMD_COUNTDOWN; packet[1] = tLinkTimer; Rfu_SendPacket(packet); } } else { // Local, just increment own timer tTimer++; } } #undef tState #undef tFuncSetId #undef tSpriteTemplateId #undef tSpriteSheetId #undef tSpritePalId #undef tInterval #undef tPriority #undef tSubpriority #undef tNumSprites #undef tX #undef tY #undef tPrevTime #undef tTimer #undef tLinkTimer #undef tSpriteIds #undef sInterval #undef sAnimNum #undef sTaskId #undef sId #undef sNumberSpriteId /* According to the clerk, the Pokémon allowed in Pokémon Jump are all <= 28 inches, and do not only swim, burrow, or fly. */ static const struct PokemonJumpMons { u16 species; u16 jumpType; } sPokeJumpMons[] = { { .species = SPECIES_BULBASAUR, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_CHARMANDER, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_SQUIRTLE, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_CATERPIE, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_METAPOD, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_WEEDLE, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_KAKUNA, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_RATTATA, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_RATICATE, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_PIKACHU, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_SANDSHREW, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_NIDORAN_F, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_NIDORAN_M, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_CLEFAIRY, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_VULPIX, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_JIGGLYPUFF, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_ODDISH, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_PARAS, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_MEOWTH, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_PSYDUCK, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_MANKEY, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_GROWLITHE, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_POLIWAG, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_BELLSPROUT, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_SHELLDER, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_KRABBY, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_EXEGGCUTE, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_CUBONE, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_DITTO, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_EEVEE, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_OMANYTE, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_KABUTO, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_CHIKORITA, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_CYNDAQUIL, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_TOTODILE, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_SPINARAK, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_PICHU, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_CLEFFA, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_IGGLYBUFF, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_TOGEPI, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_MAREEP, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_BELLOSSOM, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_MARILL, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_SUNKERN, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_WOOPER, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_PINECO, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_SNUBBULL, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_SHUCKLE, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_TEDDIURSA, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_SLUGMA, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_SWINUB, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_HOUNDOUR, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_PHANPY, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_PORYGON2, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_TYROGUE, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_SMOOCHUM, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_ELEKID, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_MAGBY, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_LARVITAR, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_TREECKO, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_TORCHIC, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_MUDKIP, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_MARSHTOMP, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_POOCHYENA, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_ZIGZAGOON, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_LINOONE, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_WURMPLE, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_SILCOON, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_CASCOON, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_LOTAD, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_SEEDOT, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_RALTS, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_KIRLIA, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_SURSKIT, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_SHROOMISH, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_NINCADA, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_WHISMUR, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_AZURILL, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_SKITTY, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_SABLEYE, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_MAWILE, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_ARON, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_MEDITITE, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_ELECTRIKE, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_PLUSLE, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_MINUN, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_VOLBEAT, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_ILLUMISE, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_ROSELIA, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_GULPIN, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_NUMEL, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_TORKOAL, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_SPOINK, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_TRAPINCH, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_CACNEA, .jumpType = JUMP_TYPE_SLOW }, { .species = SPECIES_ANORITH, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_WYNAUT, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_SNORUNT, .jumpType = JUMP_TYPE_NORMAL }, { .species = SPECIES_CLAMPERL, .jumpType = JUMP_TYPE_FAST }, { .species = SPECIES_BAGON, .jumpType = JUMP_TYPE_FAST }, }; void StartPokemonJump(u16 partyId, MainCallback exitCallback) { u8 taskId; if (gReceivedRemoteLinkPlayers) { sPokemonJump = Alloc(sizeof(*sPokemonJump)); if (sPokemonJump) { ResetTasks(); taskId = CreateTask(Task_StartPokemonJump, 1); sPokemonJump->mainState = 0; sPokemonJump->exitCallback = exitCallback; sPokemonJump->taskId = taskId; sPokemonJump->multiplayerId = GetMultiplayerId(); InitJumpMonInfo(&sPokemonJump->monInfo[sPokemonJump->multiplayerId], &gPlayerParty[partyId]); InitGame(sPokemonJump); SetWordTaskArg(taskId, 2, (uintptr_t)sPokemonJump); SetMainCallback2(CB2_PokemonJump); return; } } // Exit - Players not connected, or alloc failed SetMainCallback2(exitCallback); } static void FreePokemonJump(void) { FreeWindowsAndDigitObj(); Free(sPokemonJump); } static void InitGame(struct PokemonJump *jump) { jump->numPlayers = GetLinkPlayerCount(); jump->comm.funcId = FUNC_RESET_GAME; jump->comm.data = 0; InitPlayerAndJumpTypes(); ResetForNewGame(jump); if (jump->numPlayers == MAX_RFU_PLAYERS) IncrementGamesWithMaxPlayers(); } static void ResetForNewGame(struct PokemonJump *jump) { int i; jump->vineState = VINE_UPSWING_LOWER; jump->prevVineState = VINE_UPSWING_LOWER; jump->vineTimer = 0; jump->vineSpeed = 0; jump->updateScore = FALSE; jump->isLeader = GetMultiplayerId() == 0; jump->mainState = 0; jump->helperState = 0; jump->excellentsInRow = 0; jump->excellentsInRowRecord = 0; jump->initScoreUpdate = FALSE; jump->unused2 = 0; jump->unused3 = 0; jump->numPlayersAtPeak = 0; jump->allowVineUpdates = FALSE; jump->allPlayersReady = FALSE; jump->funcActive = TRUE; jump->comm.jumpScore = 0; jump->comm.receivedBonusFlags = 0; jump->comm.jumpsInRow = 0; jump->unused4 = TRUE; jump->showBonus = FALSE; jump->skipJumpUpdate = FALSE; jump->giveBonus = FALSE; jump->linkTimer = 0; jump->linkTimerLimit = 0; ResetPlayersForNewGame(); ResetPlayersJumpStates(); for (i = 0; i < MAX_RFU_PLAYERS; i++) { jump->atJumpPeak[i] = FALSE; jump->jumpTimeStarts[i] = 0; } } static void InitPlayerAndJumpTypes(void) { int i, index; for (i = 0; i < MAX_RFU_PLAYERS; i++) { index = GetPokemonJumpSpeciesIdx(sPokemonJump->monInfo[i].species); sPokemonJump->players[i].monJumpType = sPokeJumpMons[index].jumpType; } sPokemonJump->player = &sPokemonJump->players[sPokemonJump->multiplayerId]; } static void ResetPlayersForNewGame(void) { int i; for (i = 0; i < MAX_RFU_PLAYERS; i++) { sPokemonJump->players[i].jumpTimeStart = 0; sPokemonJump->players[i].monState = MONSTATE_NORMAL; sPokemonJump->players[i].prevMonState = MONSTATE_NORMAL; sPokemonJump->players[i].jumpOffset = 0; sPokemonJump->players[i].jumpOffsetIdx = INT_MAX; sPokemonJump->players[i].jumpState = JUMPSTATE_NONE; sPokemonJump->memberFuncIds[i] = FUNC_NONE; } } static s16 GetPokemonJumpSpeciesIdx(u16 species) { u32 i; for (i = 0; i < ARRAY_COUNT(sPokeJumpMons); i++) { if (sPokeJumpMons[i].species == species) return i; } return -1; // species isnt allowed } static void InitJumpMonInfo(struct PokemonJump_MonInfo *monInfo, struct Pokemon *mon) { monInfo->species = GetMonData(mon, MON_DATA_SPECIES); monInfo->otId = GetMonData(mon, MON_DATA_OT_ID); monInfo->personality = GetMonData(mon, MON_DATA_PERSONALITY); } static void VBlankCB_PokemonJump(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); } static void CB2_PokemonJump(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void SetPokeJumpTask(TaskFunc func) { sPokemonJump->taskId = CreateTask(func, 1); sPokemonJump->mainState = 0; } static void Task_StartPokemonJump(u8 taskId) { switch (sPokemonJump->mainState) { case 0: SetVBlankCallback(NULL); ResetSpriteData(); FreeAllSpritePalettes(); SetTaskWithPokeJumpStruct(Task_CommunicateMonInfo, 5); FadeOutMapMusic(4); sPokemonJump->mainState++; break; case 1: if (!FuncIsActiveTask(Task_CommunicateMonInfo)) { StartPokeJumpGfx(&sPokemonJump->jumpGfx); LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); sPokemonJump->mainState++; } break; case 2: if (!IsPokeJumpGfxFuncFinished() && IsNotWaitingForBGMStop() == TRUE) { FadeOutAndPlayNewMapMusic(MUS_POKE_JUMP, 8); sPokemonJump->mainState++; } break; case 3: if (IsLinkTaskFinished()) { BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_PokemonJump); sPokemonJump->mainState++; } break; case 4: UpdatePaletteFade(); if (!gPaletteFade.active) { sPokemonJump->startDelayTimer = 0; sPokemonJump->mainState++; } break; case 5: sPokemonJump->startDelayTimer++; if (sPokemonJump->startDelayTimer >= 20) { if (sPokemonJump->isLeader) SetPokeJumpTask(Task_PokemonJump_Leader); else SetPokeJumpTask(Task_PokemonJump_Member); InitVineState(); DestroyTask(taskId); } break; } } static void SetLinkTimeInterval(int intervalId) { if (intervalId == LINK_INTERVAL_NONE) { // Link data is sent when timer reaches 0. // Set timer to 1 and set limit to special // 'stopped' value so timer won't change sPokemonJump->linkTimerLimit = LINK_TIMER_STOPPED; sPokemonJump->linkTimer = 1; } else { sPokemonJump->linkTimerLimit = (1 << (intervalId - 1)) - 1; sPokemonJump->linkTimer = 0; } } static void SetFunc_Leader(u8 funcId) { int i; sPokemonJump->comm.funcId = funcId; sPokemonJump->mainState = 0; sPokemonJump->helperState = 0; sPokemonJump->funcActive = TRUE; sPokemonJump->allPlayersReady = FALSE; for (i = 1; i < sPokemonJump->numPlayers; i++) sPokemonJump->players[i].funcFinished = FALSE; } static void RecvLinkData_Leader(void) { int i; int numReady; u16 monState; u8 funcId; u16 playAgainState; for (i = 1, numReady = 0; i < sPokemonJump->numPlayers; i++) { monState = sPokemonJump->players[i].monState; if (RecvPacket_MemberStateToLeader(&sPokemonJump->players[i], i, &funcId, &playAgainState)) { sPokemonJump->playAgainStates[i] = playAgainState; sPokemonJump->memberFuncIds[i] = funcId; sPokemonJump->players[i].prevMonState = monState; } if (sPokemonJump->players[i].funcFinished && sPokemonJump->memberFuncIds[i] == sPokemonJump->comm.funcId) numReady++; } if (numReady == sPokemonJump->numPlayers - 1) sPokemonJump->allPlayersReady = TRUE; } static bool32 (* const sPokeJumpLeaderFuncs[])(void) = { [FUNC_GAME_INTRO] = GameIntro_Leader, [FUNC_WAIT_ROUND] = WaitRound_Leader, [FUNC_GAME_ROUND] = GameRound_Leader, [FUNC_GAME_OVER] = GameOver_Leader, [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain_Leader, [FUNC_RESET_GAME] = ResetGame_Leader, [FUNC_EXIT] = ExitGame, [FUNC_GIVE_PRIZE] = GivePrize_Leader, [FUNC_SAVE] = SavePokeJump, }; static void Task_PokemonJump_Leader(u8 taskId) { RecvLinkData_Leader(); TryUpdateScore(); if (!sPokemonJump->funcActive && sPokemonJump->allPlayersReady) { SetFunc_Leader(sPokemonJump->nextFuncId); SetLinkTimeInterval(LINK_INTERVAL_SHORT); } if (sPokemonJump->funcActive == TRUE) { if (!sPokeJumpLeaderFuncs[sPokemonJump->comm.funcId]()) { sPokemonJump->funcActive = FALSE; sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished = TRUE; } } UpdateGame(); SendLinkData_Leader(); } static void SendLinkData_Leader(void) { if (!sPokemonJump->linkTimer) SendPacket_LeaderState(sPokemonJump->players, &sPokemonJump->comm); if (sPokemonJump->linkTimerLimit != LINK_TIMER_STOPPED) { sPokemonJump->linkTimer++; sPokemonJump->linkTimer &= sPokemonJump->linkTimerLimit; } } static void SetFunc_Member(u8 funcId) { sPokemonJump->comm.funcId = funcId; sPokemonJump->mainState = 0; sPokemonJump->helperState = 0; sPokemonJump->funcActive = TRUE; sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished = FALSE; } static void RecvLinkData_Member(void) { int i; u16 monState; struct PokemonJump_CommData leaderData; monState = sPokemonJump->players[0].monState; if (RecvPacket_LeaderState(sPokemonJump->players, &leaderData)) { if (sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished == TRUE && leaderData.funcId != sPokemonJump->comm.funcId) { SetFunc_Member(leaderData.funcId); } if (sPokemonJump->comm.jumpScore != leaderData.jumpScore) { sPokemonJump->comm.jumpScore = leaderData.jumpScore; sPokemonJump->updateScore = TRUE; sPokemonJump->comm.receivedBonusFlags = leaderData.receivedBonusFlags; if (sPokemonJump->comm.receivedBonusFlags) sPokemonJump->showBonus = TRUE; else sPokemonJump->showBonus = FALSE; } sPokemonJump->comm.data = leaderData.data; sPokemonJump->comm.jumpsInRow = leaderData.jumpsInRow; sPokemonJump->players[0].prevMonState = monState; } for (i = 1; i < sPokemonJump->numPlayers; i++) { if (i != sPokemonJump->multiplayerId) { monState = sPokemonJump->players[i].monState; if (RecvPacket_MemberStateToMember(&sPokemonJump->players[i], i)) sPokemonJump->players[i].prevMonState = monState; } } } static bool32 (* const sPokeJumpMemberFuncs[])(void) = { [FUNC_GAME_INTRO] = GameIntro_Member, [FUNC_WAIT_ROUND] = WaitRound_Member, [FUNC_GAME_ROUND] = GameRound_Member, [FUNC_GAME_OVER] = GameOver_Member, [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain_Member, [FUNC_RESET_GAME] = ResetGame_Member, [FUNC_EXIT] = ExitGame, [FUNC_GIVE_PRIZE] = GivePrize_Member, [FUNC_SAVE] = SavePokeJump, }; static void Task_PokemonJump_Member(u8 taskId) { RecvLinkData_Member(); if (sPokemonJump->funcActive) { if (!sPokeJumpMemberFuncs[sPokemonJump->comm.funcId]()) { sPokemonJump->funcActive = FALSE; sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished = TRUE; SetLinkTimeInterval(LINK_INTERVAL_SHORT); } } UpdateGame(); SendLinkData_Member(); } static void SendLinkData_Member(void) { if (!sPokemonJump->linkTimer) SendPacket_MemberState(&sPokemonJump->players[sPokemonJump->multiplayerId], sPokemonJump->comm.funcId, sPokemonJump->playAgainComm); if (sPokemonJump->linkTimerLimit != LINK_TIMER_STOPPED) { sPokemonJump->linkTimer++; sPokemonJump->linkTimer &= sPokemonJump->linkTimerLimit; } } static bool32 GameIntro_Leader(void) { switch (sPokemonJump->mainState) { case 0: SetLinkTimeInterval(LINK_INTERVAL_SHORT); sPokemonJump->mainState++; // fall through case 1: if (!DoGameIntro()) { sPokemonJump->comm.data = sPokemonJump->vineTimer; sPokemonJump->nextFuncId = FUNC_WAIT_ROUND; return FALSE; } break; } return TRUE; } static bool32 GameIntro_Member(void) { switch (sPokemonJump->mainState) { case 0: SetLinkTimeInterval(LINK_INTERVAL_NONE); sPokemonJump->rngSeed = sPokemonJump->comm.data; sPokemonJump->mainState++; // fall through case 1: return DoGameIntro(); } return TRUE; } static bool32 WaitRound_Leader(void) { switch (sPokemonJump->mainState) { case 0: ResetPlayersJumpStates(); SetLinkTimeInterval(LINK_INTERVAL_LONG); sPokemonJump->mainState++; break; case 1: if (sPokemonJump->allPlayersReady) { sPokemonJump->nextFuncId = FUNC_GAME_ROUND; return FALSE; } break; } return TRUE; } static bool32 WaitRound_Member(void) { switch (sPokemonJump->mainState) { case 0: ResetPlayersJumpStates(); SetLinkTimeInterval(LINK_INTERVAL_NONE); sPokemonJump->vineTimer = sPokemonJump->comm.data; sPokemonJump->mainState++; // fall through case 1: if (AreLinkQueuesEmpty()) return FALSE; break; } return TRUE; } static bool32 GameRound_Leader(void) { if (!HandleSwingRound()) { sPokemonJump->comm.data = sPokemonJump->vineTimer; sPokemonJump->nextFuncId = FUNC_WAIT_ROUND; } else if (UpdateVineHitStates()) { return TRUE; } else { // Someone hit the vine ResetVineAfterHit(); sPokemonJump->nextFuncId = FUNC_GAME_OVER; } return FALSE; } static bool32 GameRound_Member(void) { if (!HandleSwingRound()) ; else if (UpdateVineHitStates()) return TRUE; else // Someone hit the vine ResetVineAfterHit(); return FALSE; } static bool32 GameOver_Leader(void) { switch (sPokemonJump->mainState) { case 0: UpdateVineHitStates(); if (AllPlayersJumpedOrHit()) sPokemonJump->mainState++; break; case 1: if (!DoVineHitEffect()) { if (HasEnoughScoreForPrize()) { sPokemonJump->comm.data = GetPrizeData(); sPokemonJump->nextFuncId = FUNC_GIVE_PRIZE; } else if (sPokemonJump->comm.jumpsInRow >= 200) { sPokemonJump->comm.data = sPokemonJump->excellentsInRowRecord; sPokemonJump->nextFuncId = FUNC_SAVE; } else { sPokemonJump->comm.data = sPokemonJump->excellentsInRowRecord; sPokemonJump->nextFuncId = FUNC_ASK_PLAY_AGAIN; } sPokemonJump->mainState++; return FALSE; } break; case 2: return FALSE; } return TRUE; } static bool32 GameOver_Member(void) { switch (sPokemonJump->mainState) { case 0: if (!UpdateVineHitStates()) ResetVineAfterHit(); if (AllPlayersJumpedOrHit()) sPokemonJump->mainState++; break; case 1: if (!DoVineHitEffect()) { sPokemonJump->mainState++; return FALSE; } break; case 2: return FALSE; } return TRUE; } static bool32 AskPlayAgain_Leader(void) { switch (sPokemonJump->mainState) { case 0: SetLinkTimeInterval(LINK_INTERVAL_MEDIUM); sPokemonJump->mainState++; // fall through case 1: if (!DoPlayAgainPrompt()) { TryUpdateRecords(sPokemonJump->comm.jumpScore, sPokemonJump->comm.jumpsInRow, sPokemonJump->comm.data); sPokemonJump->mainState++; } break; case 2: if (sPokemonJump->allPlayersReady) { if (ShouldPlayAgain()) sPokemonJump->nextFuncId = FUNC_RESET_GAME; else sPokemonJump->nextFuncId = FUNC_EXIT; sPokemonJump->mainState++; return FALSE; } break; case 3: return FALSE; } return TRUE; } static bool32 AskPlayAgain_Member(void) { switch (sPokemonJump->mainState) { case 0: SetLinkTimeInterval(LINK_INTERVAL_NONE); sPokemonJump->mainState++; // fall through case 1: if (!DoPlayAgainPrompt()) { TryUpdateRecords(sPokemonJump->comm.jumpScore, sPokemonJump->comm.jumpsInRow, sPokemonJump->comm.data); sPokemonJump->playAgainComm = sPokemonJump->playAgainState; return FALSE; } break; } return TRUE; } static bool32 ResetGame_Leader(void) { switch (sPokemonJump->mainState) { case 0: if (!CloseMessageAndResetScore()) sPokemonJump->mainState++; break; case 1: if (sPokemonJump->allPlayersReady) { ResetForNewGame(sPokemonJump); sPokemonJump->rngSeed = Random(); sPokemonJump->comm.data = sPokemonJump->rngSeed; sPokemonJump->nextFuncId = FUNC_GAME_INTRO; return FALSE; } break; } return TRUE; } static bool32 ResetGame_Member(void) { switch (sPokemonJump->mainState) { case 0: if (!CloseMessageAndResetScore()) { ResetForNewGame(sPokemonJump); sPokemonJump->mainState++; return FALSE; } break; case 1: return FALSE; } return TRUE; } static bool32 ExitGame(void) { switch (sPokemonJump->mainState) { case 0: sPokemonJump->mainState = 1; break; case 1: SetLinkTimeInterval(LINK_INTERVAL_NONE); sPokemonJump->mainState++; break; case 2: if (!ClosePokeJumpLink()) { SetMainCallback2(sPokemonJump->exitCallback); FreePokemonJump(); } break; } return TRUE; } static bool32 GivePrize_Leader(void) { switch (sPokemonJump->mainState) { case 0: SetLinkTimeInterval(LINK_INTERVAL_MEDIUM); sPokemonJump->mainState++; break; case 1: if (!TryGivePrize()) { sPokemonJump->comm.data = sPokemonJump->excellentsInRowRecord; sPokemonJump->nextFuncId = FUNC_SAVE; return FALSE; } break; } return TRUE; } static bool32 GivePrize_Member(void) { SetLinkTimeInterval(LINK_INTERVAL_NONE); if (!TryGivePrize()) return FALSE; else return TRUE; } static bool32 SavePokeJump(void) { switch (sPokemonJump->mainState) { case 0: TryUpdateRecords(sPokemonJump->comm.jumpScore, sPokemonJump->comm.jumpsInRow, sPokemonJump->comm.data); SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_SAVING); sPokemonJump->mainState++; break; case 1: if (!IsPokeJumpGfxFuncFinished()) { SetLinkTimeInterval(LINK_INTERVAL_NONE); sPokemonJump->mainState++; } break; case 2: if (AreLinkQueuesEmpty()) { CreateTask(Task_LinkFullSave, 6); sPokemonJump->mainState++; } break; case 3: if (!FuncIsActiveTask(Task_LinkFullSave)) { ClearMessageWindow(); sPokemonJump->mainState++; } break; case 4: if (!RemoveMessageWindow()) { sPokemonJump->nextFuncId = FUNC_ASK_PLAY_AGAIN; return FALSE; } break; } return TRUE; } static bool32 DoGameIntro(void) { switch (sPokemonJump->helperState) { case 0: SetUpPokeJumpGfxFuncById(GFXFUNC_SHOW_NAMES_HIGHLIGHT); ResetMonSpriteSubpriorities(); sPokemonJump->helperState++; break; case 1: if (!IsPokeJumpGfxFuncFinished()) { StartMonIntroBounce(sPokemonJump->multiplayerId); sPokemonJump->timer = 0; sPokemonJump->helperState++; } break; case 2: if (++sPokemonJump->timer > 120) { SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_NAMES); sPokemonJump->helperState++; } break; case 3: if (IsPokeJumpGfxFuncFinished() != TRUE && IsMonIntroBounceActive() != TRUE) sPokemonJump->helperState++; break; case 4: SetUpPokeJumpGfxFuncById(GFXFUNC_COUNTDOWN); sPokemonJump->helperState++; break; case 5: if (!IsPokeJumpGfxFuncFinished()) { DisallowVineUpdates(); SetUpResetVineGfx(); sPokemonJump->helperState++; } break; case 6: if (!ResetVineGfx()) { AllowVineUpdates(); ResetVineState(); sPokemonJump->helperState++; return FALSE; } break; case 7: return FALSE; } return TRUE; } // Update the vine and wait for player to input a jump // Returns false when vine reaches the 'hit' point, after // which input is ignored static bool32 HandleSwingRound(void) { UpdateVineState(); if (sPokemonJump->ignoreJumpInput) { sPokemonJump->ignoreJumpInput = FALSE; return FALSE; } switch (sPokemonJump->helperState) { case 0: if (IsPlayersMonState(MONSTATE_NORMAL)) sPokemonJump->helperState++; else break; // fall through case 1: if (JOY_NEW(A_BUTTON)) { SetMonStateJump(); SetLinkTimeInterval(LINK_INTERVAL_SHORT); sPokemonJump->helperState++; } break; case 2: if (IsPlayersMonState(MONSTATE_JUMP) == TRUE) sPokemonJump->helperState++; break; case 3: if (IsPlayersMonState(MONSTATE_NORMAL) == TRUE) sPokemonJump->helperState = 0; break; } return TRUE; } static bool32 DoVineHitEffect(void) { int i; switch (sPokemonJump->helperState) { case 0: for (i = 0; i < sPokemonJump->numPlayers; i++) { if (IsMonHitShakeActive(i) == TRUE) return TRUE; } sPokemonJump->helperState++; break; case 1: for (i = 0; i < sPokemonJump->numPlayers; i++) { if (sPokemonJump->players[i].monState == MONSTATE_HIT) StartMonHitFlash(i); } SetUpPokeJumpGfxFuncById(GFXFUNC_SHOW_NAMES); sPokemonJump->timer = 0; sPokemonJump->helperState++; break; case 2: if (++sPokemonJump->timer > 100) { SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_NAMES); sPokemonJump->timer = 0; sPokemonJump->helperState++; } break; case 3: if (!IsPokeJumpGfxFuncFinished()) { StopMonHitFlash(); sPokemonJump->comm.receivedBonusFlags = 0; ResetPlayersMonState(); sPokemonJump->helperState++; return FALSE; } break; case 4: return FALSE; } return TRUE; } static bool32 TryGivePrize(void) { switch (sPokemonJump->helperState) { case 0: UnpackPrizeData(sPokemonJump->comm.data, &sPokemonJump->prizeItemId, &sPokemonJump->prizeItemQuantity); PrintPrizeMessage(sPokemonJump->prizeItemId, sPokemonJump->prizeItemQuantity); sPokemonJump->helperState++; break; case 1: case 4: if (!DoPrizeMessageAndFanfare()) { sPokemonJump->timer = 0; sPokemonJump->helperState++; } break; case 2: case 5: // Wait to continue after message sPokemonJump->timer++; if (JOY_NEW(A_BUTTON | B_BUTTON) || sPokemonJump->timer > 180) { ClearMessageWindow(); sPokemonJump->helperState++; } break; case 3: if (!RemoveMessageWindow()) { sPokemonJump->prizeItemQuantity = GetQuantityLimitedByBag(sPokemonJump->prizeItemId, sPokemonJump->prizeItemQuantity); if (sPokemonJump->prizeItemQuantity && AddBagItem(sPokemonJump->prizeItemId, sPokemonJump->prizeItemQuantity)) { if (!CheckBagHasSpace(sPokemonJump->prizeItemId, 1)) { // An item was given successfully, but no room for any more. // It's possible the full prize quantity had to be limited PrintPrizeFilledBagMessage(sPokemonJump->prizeItemId); sPokemonJump->helperState = 4; // Do message } else { sPokemonJump->helperState = 6; // Exit break; } } else { PrintNoRoomForPrizeMessage(sPokemonJump->prizeItemId); sPokemonJump->helperState = 4; // Do message } } break; case 6: if (!RemoveMessageWindow()) return FALSE; break; } return TRUE; } static bool32 DoPlayAgainPrompt(void) { s8 input; switch (sPokemonJump->helperState) { case 0: SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_PLAY_AGAIN); sPokemonJump->helperState++; break; case 1: if (!IsPokeJumpGfxFuncFinished()) sPokemonJump->helperState++; break; case 2: input = HandlePlayAgainInput(); switch (input) { case MENU_B_PRESSED: case 1: // No sPokemonJump->playAgainState = PLAY_AGAIN_NO; SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_MSG); sPokemonJump->helperState++; break; case 0: // Yes sPokemonJump->playAgainState = PLAY_AGAIN_YES; SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_MSG); sPokemonJump->helperState++; break; } break; case 3: if (!IsPokeJumpGfxFuncFinished()) sPokemonJump->helperState++; break; case 4: SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_COMM_STANDBY); sPokemonJump->helperState++; break; case 5: if (!IsPokeJumpGfxFuncFinished()) { sPokemonJump->helperState++; return FALSE; } break; case 6: return FALSE; } return TRUE; } static bool32 ClosePokeJumpLink(void) { switch (sPokemonJump->helperState) { case 0: ClearMessageWindow(); sPokemonJump->helperState++; break; case 1: if (!RemoveMessageWindow()) { SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_PLAYER_DROPPED); sPokemonJump->helperState++; } break; case 2: if (!IsPokeJumpGfxFuncFinished()) { sPokemonJump->timer = 0; sPokemonJump->helperState++; } break; case 3: if (++sPokemonJump->timer > 120) { BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); sPokemonJump->helperState++; } break; case 4: if (!gPaletteFade.active) { SetCloseLinkCallback(); sPokemonJump->helperState++; } break; case 5: if (!gReceivedRemoteLinkPlayers) return FALSE; break; } return TRUE; } static bool32 CloseMessageAndResetScore(void) { switch (sPokemonJump->helperState) { case 0: ClearMessageWindow(); PrintScore(0); sPokemonJump->helperState++; break; case 1: if (!RemoveMessageWindow()) { sPokemonJump->helperState++; return FALSE; } break; case 2: return FALSE; } return TRUE; } #define tState data[0] #define tNumReceived data[1] #define tReceivedPacket(playerId) data[(playerId) + 2] #define DATAIDX_GAME_STRUCT 14 static void Task_CommunicateMonInfo(u8 taskId) { int i; s16 *data = gTasks[taskId].data; struct PokemonJump *jump = (struct PokemonJump *)GetWordTaskArg(taskId, DATAIDX_GAME_STRUCT); switch (tState) { case 0: for (i = 0; i < MAX_RFU_PLAYERS; i++) tReceivedPacket(i) = FALSE; tState++; // fall through case 1: SendPacket_MonInfo(&jump->monInfo[jump->multiplayerId]); for (i = 0; i < MAX_RFU_PLAYERS; i++) { if (!tReceivedPacket(i) && RecvPacket_MonInfo(i, &jump->monInfo[i])) { StringCopy(jump->players[i].name, gLinkPlayers[i].name); tReceivedPacket(i) = TRUE; tNumReceived++; if (tNumReceived == jump->numPlayers) { InitPlayerAndJumpTypes(); DestroyTask(taskId); break; } } } break; } } static void SetTaskWithPokeJumpStruct(TaskFunc func, u8 taskPriority) { u8 taskId = CreateTask(func, taskPriority); SetWordTaskArg(taskId, DATAIDX_GAME_STRUCT, (uintptr_t)sPokemonJump); } #undef tState #undef tNumReceived #undef tReceivedPacket #undef DATAIDX_GAME_STRUCT static void InitVineState(void) { sPokemonJump->vineTimer = 0; sPokemonJump->vineState = VINE_UPSWING_LOWER; sPokemonJump->vineStateTimer = 0; sPokemonJump->vineSpeed = 0; sPokemonJump->ignoreJumpInput = FALSE; sPokemonJump->gameOver = FALSE; } static void ResetVineState(void) { sPokemonJump->vineTimer = 0; sPokemonJump->vineStateTimer = VINE_STATE_TIMER(VINE_UPSWING_LOWER); sPokemonJump->vineState = VINE_UPSWING_LOW; sPokemonJump->ignoreJumpInput = FALSE; sPokemonJump->gameOver = FALSE; sPokemonJump->vineSpeedStage = 0; sPokemonJump->vineBaseSpeedIdx = 0; sPokemonJump->vineSpeedAccel = 0; sPokemonJump->vineSpeedDelay = 0; sPokemonJump->atMaxSpeedStage = FALSE; UpdateVineSpeed(); } static void UpdateVineState(void) { if (sPokemonJump->allowVineUpdates) { sPokemonJump->vineTimer++; sPokemonJump->vineStateTimer += GetVineSpeed(); if (sPokemonJump->vineStateTimer >= VINE_STATE_TIMER(NUM_VINESTATES - 1)) sPokemonJump->vineStateTimer -= VINE_STATE_TIMER(NUM_VINESTATES - 1); sPokemonJump->prevVineState = sPokemonJump->vineState; sPokemonJump->vineState = sPokemonJump->vineStateTimer >> 8; // If beginning upswing if (sPokemonJump->vineState > VINE_UPSWING_LOWER && sPokemonJump->prevVineState < VINE_UPSWING_LOW) { sPokemonJump->ignoreJumpInput++; UpdateVineSpeed(); } } } static int GetVineSpeed(void) { int speed; if (sPokemonJump->gameOver) return 0; speed = sPokemonJump->vineSpeed; if (sPokemonJump->vineStateTimer <= VINE_STATE_TIMER(VINE_LOWEST)) { // If at or below lowest, then vine is in downswing // Increase speed in downswing sPokemonJump->vineSpeedAccel += 80; speed += sPokemonJump->vineSpeedAccel / 256; } return speed; } static const u16 sVineBaseSpeeds[] = {26, 31, 36, 41, 46, 51, 56, 61}; static const u16 sVineSpeedDelays[] = {0, 1, 1, 2}; static void UpdateVineSpeed(void) { int baseSpeed; sPokemonJump->vineSpeedAccel = 0; if (sPokemonJump->vineSpeedDelay) { sPokemonJump->vineSpeedDelay--; if (sPokemonJump->atMaxSpeedStage) { if (PokeJumpRandom() % 4) { sPokemonJump->vineSpeed = sPokemonJump->nextVineSpeed; } else { if (sPokemonJump->nextVineSpeed > 54) sPokemonJump->vineSpeed = 30; else sPokemonJump->vineSpeed = 82; } } } else { if (!(sPokemonJump->vineBaseSpeedIdx & ARRAY_COUNT(sVineBaseSpeeds))) { sPokemonJump->nextVineSpeed = sVineBaseSpeeds[sPokemonJump->vineBaseSpeedIdx] + (sPokemonJump->vineSpeedStage * 7); sPokemonJump->vineSpeedDelay = sVineSpeedDelays[PokeJumpRandom() % ARRAY_COUNT(sVineSpeedDelays)] + 2; sPokemonJump->vineBaseSpeedIdx++; } else { if (sPokemonJump->vineBaseSpeedIdx == ARRAY_COUNT(sVineBaseSpeeds)) { if (sPokemonJump->vineSpeedStage < 3) sPokemonJump->vineSpeedStage++; else sPokemonJump->atMaxSpeedStage = TRUE; } baseSpeed = sVineBaseSpeeds[15 - sPokemonJump->vineBaseSpeedIdx]; sPokemonJump->nextVineSpeed = baseSpeed + (sPokemonJump->vineSpeedStage * 7); if (++sPokemonJump->vineBaseSpeedIdx > 15) { if (PokeJumpRandom() % 4 == 0) sPokemonJump->nextVineSpeed -= 5; sPokemonJump->vineBaseSpeedIdx = 0; } } sPokemonJump->vineSpeed = sPokemonJump->nextVineSpeed; } } static int PokeJumpRandom(void) { sPokemonJump->rngSeed = ISO_RANDOMIZE1(sPokemonJump->rngSeed); return sPokemonJump->rngSeed >> 16; } static void ResetVineAfterHit(void) { sPokemonJump->gameOver = TRUE; sPokemonJump->vineState = VINE_UPSWING_LOWER; sPokemonJump->vineStateTimer = VINE_STATE_TIMER(VINE_LOWEST); AllowVineUpdates(); } static int IsGameOver(void) { return sPokemonJump->gameOver; } static void ResetPlayersJumpStates(void) { int i; for (i = 0; i < MAX_RFU_PLAYERS; i++) sPokemonJump->players[i].jumpState = JUMPSTATE_NONE; } static void ResetPlayersMonState(void) { sPokemonJump->player->monState = MONSTATE_NORMAL; sPokemonJump->player->prevMonState = MONSTATE_NORMAL; } static bool32 IsPlayersMonState(u16 monState) { if (sPokemonJump->players[sPokemonJump->multiplayerId].monState == monState) return TRUE; else return FALSE; } static void SetMonStateJump(void) { sPokemonJump->player->jumpTimeStart = sPokemonJump->vineTimer; sPokemonJump->player->prevMonState = sPokemonJump->player->monState; sPokemonJump->player->monState = MONSTATE_JUMP; } static void SetMonStateHit(void) { sPokemonJump->player->prevMonState = sPokemonJump->player->monState; sPokemonJump->player->monState = MONSTATE_HIT; sPokemonJump->player->jumpTimeStart = sPokemonJump->vineTimer; sPokemonJump->player->jumpState = JUMPSTATE_FAILURE; } static void SetMonStateNormal(void) { sPokemonJump->player->prevMonState = sPokemonJump->player->monState; sPokemonJump->player->monState = MONSTATE_NORMAL; } static const u16 sSoundEffects[MAX_RFU_PLAYERS - 1] = {SE_RS_SHOP, SE_SHINY, SE_M_MORNING_SUN, SE_POKE_JUMP_SUCCESS}; static void UpdateGame(void) { if (sPokemonJump->updateScore) { PrintScore(sPokemonJump->comm.jumpScore); sPokemonJump->updateScore = FALSE; if (sPokemonJump->showBonus) { int numPlayers = DoSameJumpTimeBonus(sPokemonJump->comm.receivedBonusFlags); PlaySE(sSoundEffects[numPlayers - 2]); sPokemonJump->showBonus = FALSE; } } PrintJumpsInRow(sPokemonJump->comm.jumpsInRow); HandleMonState(); TryUpdateVineSwing(); } static void TryUpdateVineSwing(void) { if (sPokemonJump->allowVineUpdates) UpdateVineSwing(sPokemonJump->vineState); } static void DisallowVineUpdates(void) { sPokemonJump->allowVineUpdates = FALSE; } static void AllowVineUpdates(void) { sPokemonJump->allowVineUpdates = TRUE; } #define F_SE_JUMP (1 << 0) #define F_SE_FAIL (1 << 1) static void HandleMonState(void) { int i; int soundFlags = 0; int numPlayers = sPokemonJump->numPlayers; for (i = 0; i < numPlayers; i++) { switch (sPokemonJump->players[i].monState) { case MONSTATE_NORMAL: SetMonSpriteY(i, 0); break; case MONSTATE_JUMP: if (sPokemonJump->players[i].prevMonState != MONSTATE_JUMP || sPokemonJump->players[i].jumpTimeStart != sPokemonJump->jumpTimeStarts[i]) { // This is a new jump, play SE and init fields for jump handling if (i == sPokemonJump->multiplayerId) sPokemonJump->players[i].prevMonState = MONSTATE_JUMP; soundFlags |= F_SE_JUMP; sPokemonJump->players[i].jumpOffsetIdx = INT_MAX; sPokemonJump->jumpTimeStarts[i] = sPokemonJump->players[i].jumpTimeStart; } UpdateJump(i); break; case MONSTATE_HIT: if (sPokemonJump->players[i].prevMonState != MONSTATE_HIT) { if (i == sPokemonJump->multiplayerId) sPokemonJump->players[i].prevMonState = MONSTATE_HIT; soundFlags |= F_SE_FAIL; StartMonHitShake(i); } break; } } if (soundFlags & F_SE_FAIL) PlaySE(SE_POKE_JUMP_FAILURE); else if (soundFlags & F_SE_JUMP) PlaySE(SE_LEDGE); } static const s8 sJumpOffsets[][48] = { [JUMP_TYPE_NORMAL] = { -3, -6, -8, -10, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, JUMP_PEAK, JUMP_PEAK, JUMP_PEAK, -28, -27, -26, -25, -23, -22, -20, -18, -17, -15, -13, -11, -8, -6, -4, -1}, [JUMP_TYPE_FAST] = { -3, -6, -9, -11, -14, -16, -18, -20, -22, -24, -26, -28, -29, JUMP_PEAK, JUMP_PEAK, -28, -26, -24, -22, -20, -18, -16, -14, -11, -9, -6, -4, -1}, [JUMP_TYPE_SLOW] = { -3, -6, -9, -11, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, JUMP_PEAK, JUMP_PEAK, JUMP_PEAK, JUMP_PEAK, -29, -29, -28, -28, -27, -27, -26, -25, -24, -22, -20, -18, -16, -14, -12, -11, -9, -6, -4, -1}, }; static void UpdateJump(int multiplayerId) { int jumpOffsetIdx; int jumpOffset; struct PokemonJump_Player *player; if (sPokemonJump->skipJumpUpdate) // Always false return; player = &sPokemonJump->players[multiplayerId]; if (player->jumpOffsetIdx != INT_MAX) { player->jumpOffsetIdx++; jumpOffsetIdx = player->jumpOffsetIdx; } else { jumpOffsetIdx = sPokemonJump->vineTimer - player->jumpTimeStart; if (jumpOffsetIdx >= 65000) { jumpOffsetIdx -= 65000; jumpOffsetIdx += sPokemonJump->vineTimer; } player->jumpOffsetIdx = jumpOffsetIdx; } if (jumpOffsetIdx < 4) return; jumpOffsetIdx -= 4; if (jumpOffsetIdx < (int)ARRAY_COUNT(sJumpOffsets[0])) jumpOffset = sJumpOffsets[player->monJumpType][jumpOffsetIdx]; else jumpOffset = 0; SetMonSpriteY(multiplayerId, jumpOffset); if (jumpOffset == 0 && multiplayerId == sPokemonJump->multiplayerId) SetMonStateNormal(); player->jumpOffset = jumpOffset; } static void TryUpdateScore(void) { if (sPokemonJump->vineState == VINE_UPSWING_HIGH && sPokemonJump->prevVineState == VINE_UPSWING_LOW) { // Vine has passed through the point where it // would hit the players, allow score to update if (!sPokemonJump->initScoreUpdate) { ClearUnreadField(); sPokemonJump->numPlayersAtPeak = 0; sPokemonJump->initScoreUpdate = TRUE; sPokemonJump->comm.receivedBonusFlags = 0; } else { if (sPokemonJump->numPlayersAtPeak == MAX_RFU_PLAYERS) { // An 'excellent' is the max 5 players all jumping synchronously sPokemonJump->excellentsInRow++; TryUpdateExcellentsRecord(sPokemonJump->excellentsInRow); } else { sPokemonJump->excellentsInRow = 0; } if (sPokemonJump->numPlayersAtPeak > 1) { sPokemonJump->giveBonus = TRUE; // Unclear why atJumpPeak needed to be copied over twice memcpy(sPokemonJump->atJumpPeak3, sPokemonJump->atJumpPeak2, sizeof(u8) * MAX_RFU_PLAYERS); } ClearUnreadField(); sPokemonJump->numPlayersAtPeak = 0; sPokemonJump->initScoreUpdate = TRUE; sPokemonJump->comm.receivedBonusFlags = 0; if (sPokemonJump->comm.jumpsInRow < MAX_JUMPS) sPokemonJump->comm.jumpsInRow++; AddJumpScore(10); SetLinkTimeInterval(LINK_INTERVAL_SHORT); } } if (sPokemonJump->giveBonus && (DidAllPlayersClearVine() == TRUE || sPokemonJump->vineState == VINE_HIGHEST)) { int numPlayers = GetNumPlayersForBonus(sPokemonJump->atJumpPeak3); AddJumpScore(GetScoreBonus(numPlayers)); SetLinkTimeInterval(LINK_INTERVAL_SHORT); sPokemonJump->giveBonus = FALSE; } if (sPokemonJump->initScoreUpdate) { int numAtPeak = GetPlayersAtJumpPeak(); if (numAtPeak > sPokemonJump->numPlayersAtPeak) { sPokemonJump->numPlayersAtPeak = numAtPeak; memcpy(sPokemonJump->atJumpPeak2, sPokemonJump->atJumpPeak, sizeof(u8) * MAX_RFU_PLAYERS); } } } // Returns FALSE if any player was hit by vine static bool32 UpdateVineHitStates(void) { int i; if (sPokemonJump->vineState == VINE_UPSWING_LOWER && sPokemonJump->player->jumpOffset == 0) { // Vine is in position to hit the player and jump offset is 0. // Unless the player had just jumped and has been forced to the ground // by someone else getting hit, the player has been hit if (sPokemonJump->player->prevMonState == MONSTATE_JUMP && IsGameOver() == TRUE) { sPokemonJump->player->jumpState = JUMPSTATE_SUCCESS; } else { // Hit vine SetMonStateHit(); SetLinkTimeInterval(LINK_INTERVAL_SHORT); } } if (sPokemonJump->vineState == VINE_UPSWING_LOW && sPokemonJump->prevVineState == VINE_UPSWING_LOWER && sPokemonJump->player->monState != MONSTATE_HIT) { sPokemonJump->player->jumpState = JUMPSTATE_SUCCESS; SetLinkTimeInterval(LINK_INTERVAL_SHORT); } for (i = 0; i < sPokemonJump->numPlayers; i++) { if (sPokemonJump->players[i].monState == MONSTATE_HIT) return FALSE; } return TRUE; } // Has everyone either jumped or been hit by the vine static bool32 AllPlayersJumpedOrHit(void) { int i; int numPlayers = sPokemonJump->numPlayers; int numJumpedOrHit = 0; for (i = 0; i < numPlayers; i++) { if (sPokemonJump->players[i].jumpState != JUMPSTATE_NONE) numJumpedOrHit++; } return numJumpedOrHit == numPlayers; } static bool32 DidAllPlayersClearVine(void) { int i; for (i = 0; i < sPokemonJump->numPlayers; i++) { if (sPokemonJump->players[i].jumpState != JUMPSTATE_SUCCESS) return FALSE; } return TRUE; } static bool32 ShouldPlayAgain(void) { int i; if (sPokemonJump->playAgainState == PLAY_AGAIN_NO) return FALSE; for (i = 1; i < sPokemonJump->numPlayers; i++) { if (sPokemonJump->playAgainStates[i] == PLAY_AGAIN_NO) return FALSE; } return TRUE; } static void AddJumpScore(int score) { sPokemonJump->comm.jumpScore += score; sPokemonJump->updateScore = TRUE; if (sPokemonJump->comm.jumpScore >= MAX_JUMP_SCORE) sPokemonJump->comm.jumpScore = MAX_JUMP_SCORE; } static int GetPlayersAtJumpPeak(void) { int i; int numAtPeak = 0; int numPlayers = sPokemonJump->numPlayers; for (i = 0; i < numPlayers; i++) { if (sPokemonJump->players[i].jumpOffset == JUMP_PEAK) { sPokemonJump->atJumpPeak[i] = TRUE; numAtPeak++; } else { sPokemonJump->atJumpPeak[i] = FALSE; } } return numAtPeak; } static bool32 AreLinkQueuesEmpty(void) { return !gRfu.recvQueue.count && !gRfu.sendQueue.count; } static int GetNumPlayersForBonus(u8 *arg0) { int i = 0; int flags = 0; int count = 0; for (; i < MAX_RFU_PLAYERS; i++) { if (arg0[i]) { flags |= 1 << i; count++; } } sPokemonJump->comm.receivedBonusFlags = flags; if (flags) sPokemonJump->showBonus = TRUE; return count; } static void ClearUnreadField(void) { sPokemonJump->unused3 = 0; } // Bonuses given depend on the number of // players that jumped at the same time static const int sScoreBonuses[MAX_RFU_PLAYERS + 1] = {0, 0, 50, 100, 200, 500}; static int GetScoreBonus(int numPlayers) { return sScoreBonuses[numPlayers]; } static void TryUpdateExcellentsRecord(u16 excellentsInRow) { if (excellentsInRow > sPokemonJump->excellentsInRowRecord) sPokemonJump->excellentsInRowRecord = excellentsInRow; } static const u16 sPrizeItems[] = { ITEM_LEPPA_BERRY, ITEM_LUM_BERRY, ITEM_SITRUS_BERRY, ITEM_FIGY_BERRY, ITEM_WIKI_BERRY, ITEM_MAGO_BERRY, ITEM_AGUAV_BERRY, ITEM_IAPAPA_BERRY }; struct { u32 score; u32 quantity; } static const sPrizeQuantityData[] = { { .score = 5000, .quantity = 1}, { .score = 8000, .quantity = 2}, { .score = 12000, .quantity = 3}, { .score = 16000, .quantity = 4}, { .score = 20000, .quantity = 5}, }; static bool32 HasEnoughScoreForPrize(void) { if (sPokemonJump->comm.jumpScore >= sPrizeQuantityData[0].score) return TRUE; else return FALSE; } static u16 GetPrizeData(void) { u16 itemId = GetPrizeItemId(); u16 quantity = GetPrizeQuantity(); return (quantity << 12) | (itemId & 0xFFF); } static void UnpackPrizeData(u16 data, u16 *itemId, u16 *quantity) { *quantity = data >> 12; *itemId = data & 0xFFF; } static u16 GetPrizeItemId(void) { u16 index = Random() % ARRAY_COUNT(sPrizeItems); return sPrizeItems[index]; } static u16 GetPrizeQuantity(void) { u32 quantity, i; quantity = 0; for (i = 0; i < ARRAY_COUNT(sPrizeQuantityData); i++) { if (sPokemonJump->comm.jumpScore >= sPrizeQuantityData[i].score) quantity = sPrizeQuantityData[i].quantity; else break; } return quantity; } static u16 GetQuantityLimitedByBag(u16 item, u16 quantity) { while (quantity && !CheckBagHasSpace(item, quantity)) quantity--; return quantity; } static u16 GetNumPokeJumpPlayers(void) { return GetLinkPlayerCount(); } static u16 GetPokeJumpMultiplayerId(void) { return sPokemonJump->multiplayerId; } static struct PokemonJump_MonInfo *GetMonInfoByMultiplayerId(u8 multiplayerId) { return &sPokemonJump->monInfo[multiplayerId]; } static u8 *GetPokeJumpPlayerName(u8 multiplayerId) { return sPokemonJump->players[multiplayerId].name; } bool32 IsSpeciesAllowedInPokemonJump(u16 species) { return GetPokemonJumpSpeciesIdx(species) > -1; } void IsPokemonJumpSpeciesInParty(void) { int i; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)) { u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); if (IsSpeciesAllowedInPokemonJump(species)) { gSpecialVar_Result = TRUE; return; } } } gSpecialVar_Result = FALSE; } struct MonInfoPacket { u8 id; u16 species; u32 personality; u32 otId; }; static void SendPacket_MonInfo(struct PokemonJump_MonInfo *monInfo) { struct MonInfoPacket packet; packet.id = PACKET_MON_INFO; packet.species = monInfo->species; packet.otId = monInfo->otId; packet.personality = monInfo->personality; Rfu_SendPacket(&packet); } static bool32 RecvPacket_MonInfo(int multiplayerId, struct PokemonJump_MonInfo *monInfo) { struct MonInfoPacket packet; if ((gRecvCmds[multiplayerId][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); if (packet.id == PACKET_MON_INFO) { monInfo->species = packet.species; monInfo->otId = packet.otId; monInfo->personality = packet.personality; return TRUE; } return FALSE; } struct UnusedPacket { u8 id; u32 data; u32 filler; }; // Data packet that's never sent // No function to read it either static void SendPacket_Unused(u32 data) { struct UnusedPacket packet; packet.id = PACKET_UNUSED; packet.data = data; Rfu_SendPacket(&packet); } struct LeaderStatePacket { u8 id; u8 funcId; u8 monState; u8 receivedBonusFlags:5; // 1 bit for each player (MAX_RFU_PLAYERS) u8 jumpState:3; u16 jumpTimeStart; u16 vineTimer; u32 jumpsInRow:15; u32 jumpScore:17; }; static void SendPacket_LeaderState(struct PokemonJump_Player *player, struct PokemonJump_CommData *comm) { struct LeaderStatePacket packet; packet.id = PACKET_LEADER_STATE; packet.jumpScore = comm->jumpScore; packet.receivedBonusFlags = comm->receivedBonusFlags; packet.funcId = comm->funcId; packet.vineTimer = comm->data; packet.jumpsInRow = comm->jumpsInRow; packet.monState = player->monState; packet.jumpState = player->jumpState; packet.jumpTimeStart = player->jumpTimeStart; Rfu_SendPacket(&packet); } // Used by group members to read the state of the group leader static bool32 RecvPacket_LeaderState(struct PokemonJump_Player *player, struct PokemonJump_CommData *comm) { struct LeaderStatePacket packet; if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[0][1], sizeof(packet)); if (packet.id != PACKET_LEADER_STATE) return FALSE; comm->jumpScore = packet.jumpScore; comm->receivedBonusFlags = packet.receivedBonusFlags; comm->funcId = packet.funcId; comm->data = packet.vineTimer; comm->jumpsInRow = packet.jumpsInRow; player->monState = packet.monState; player->jumpState = packet.jumpState; player->jumpTimeStart = packet.jumpTimeStart; return TRUE; } struct MemberStatePacket { u8 id; u8 monState; u8 jumpState; bool8 funcFinished; u16 jumpTimeStart; u8 funcId; u16 playAgainState; }; static void SendPacket_MemberState(struct PokemonJump_Player *player, u8 funcId, u16 playAgainState) { struct MemberStatePacket packet; packet.id = PACKET_MEMBER_STATE; packet.monState = player->monState; packet.jumpState = player->jumpState; packet.funcFinished = player->funcFinished; packet.jumpTimeStart = player->jumpTimeStart; packet.funcId = funcId; packet.playAgainState = playAgainState; Rfu_SendPacket(&packet); } // Used by the group leader to read the state of group members static bool32 RecvPacket_MemberStateToLeader(struct PokemonJump_Player *player, int multiplayerId, u8 *funcId, u16 *playAgainState) { struct MemberStatePacket packet; if ((gRecvCmds[multiplayerId][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); if (packet.id != PACKET_MEMBER_STATE) return FALSE; player->monState = packet.monState; player->jumpState = packet.jumpState; player->funcFinished = packet.funcFinished; player->jumpTimeStart = packet.jumpTimeStart; *funcId = packet.funcId; *playAgainState = packet.playAgainState; return TRUE; } // Used by group members to read the state of other group members static bool32 RecvPacket_MemberStateToMember(struct PokemonJump_Player *player, int multiplayerId) { struct MemberStatePacket packet; if ((gRecvCmds[multiplayerId][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); if (packet.id != PACKET_MEMBER_STATE) return FALSE; player->monState = packet.monState; player->jumpState = packet.jumpState; player->funcFinished = packet.funcFinished; player->jumpTimeStart = packet.jumpTimeStart; return TRUE; } static void StartPokeJumpGfx(struct PokemonJumpGfx *jumpGfx) { u8 taskId; sPokemonJumpGfx = jumpGfx; InitPokeJumpGfx(sPokemonJumpGfx); taskId = CreateTask(Task_RunPokeJumpGfxFunc, 3); sPokemonJumpGfx->taskId = taskId; SetWordTaskArg(sPokemonJumpGfx->taskId, 2, (uintptr_t)sPokemonJumpGfx); SetUpPokeJumpGfxFunc(LoadPokeJumpGfx); } static void FreeWindowsAndDigitObj(void) { FreeAllWindowBuffers(); DigitObjUtil_Free(); } static void InitPokeJumpGfx(struct PokemonJumpGfx *jumpGfx) { jumpGfx->mainState = 0; jumpGfx->funcFinished = FALSE; jumpGfx->msgWindowId = WINDOW_NONE; } static const u16 sInterface_Pal[] = INCBIN_U16("graphics/pokemon_jump/interface.gbapal"); static const u16 sBg_Pal[] = INCBIN_U16("graphics/pokemon_jump/bg.gbapal"); static const u32 sBg_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bg.4bpp.lz"); static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bg.bin.lz"); static const u16 sVenusaur_Pal[] = INCBIN_U16("graphics/pokemon_jump/venusaur.gbapal"); static const u32 sVenusaur_Gfx[] = INCBIN_U32("graphics/pokemon_jump/venusaur.4bpp.lz"); static const u32 sVenusaur_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/venusaur.bin.lz"); static const u16 sBonuses_Pal[] = INCBIN_U16("graphics/pokemon_jump/bonuses.gbapal"); static const u32 sBonuses_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bonuses.4bpp.lz"); static const u32 sBonuses_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bonuses.bin.lz"); static const struct BgTemplate sBgTemplates[] = { { .bg = BG_INTERFACE, .charBaseIndex = 0, .mapBaseIndex = 27, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0 }, { .bg = BG_VENUSAUR, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 2, .paletteMode = 0, .priority = 2, .baseTile = 0 }, { .bg = BG_BONUSES, .charBaseIndex = 2, .mapBaseIndex = 12, .screenSize = 3, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = BG_SCENERY, .charBaseIndex = 3, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0 }, }; static const struct WindowTemplate sWindowTemplates[] = { [WIN_POINTS] = { .bg = BG_INTERFACE, .tilemapLeft = 19, .tilemapTop = 0, .width = 6, .height = 2, .paletteNum = 2, .baseBlock = 0x13, }, [WIN_TIMES] = { .bg = BG_INTERFACE, .tilemapLeft = 8, .tilemapTop = 0, .width = 6, .height = 2, .paletteNum = 2, .baseBlock = 0x1F, }, DUMMY_WIN_TEMPLATE, }; struct { int id; void (*func)(void); } static const sPokeJumpGfxFuncs[] = { {GFXFUNC_LOAD, LoadPokeJumpGfx}, // Element not used, LoadPokeJumpGfx is passed directly to SetUpPokeJumpGfxFunc {GFXFUNC_SHOW_NAMES, PrintPlayerNamesNoHighlight}, {GFXFUNC_SHOW_NAMES_HIGHLIGHT, PrintPlayerNamesWithHighlight}, {GFXFUNC_ERASE_NAMES, ErasePlayerNames}, {GFXFUNC_MSG_PLAY_AGAIN, Msg_WantToPlayAgain}, {GFXFUNC_MSG_SAVING, Msg_SavingDontTurnOff}, {GFXFUNC_ERASE_MSG, EraseMessage}, {GFXFUNC_MSG_PLAYER_DROPPED, Msg_SomeoneDroppedOut}, {GFXFUNC_COUNTDOWN, DoPokeJumpCountdown}, {GFXFUNC_MSG_COMM_STANDBY, Msg_CommunicationStandby}, }; static void SetUpPokeJumpGfxFuncById(int id) { int i; for (i = 0; i < ARRAY_COUNT(sPokeJumpGfxFuncs); i++) { if (sPokeJumpGfxFuncs[i].id == id) SetUpPokeJumpGfxFunc(sPokeJumpGfxFuncs[i].func); } } static bool32 IsPokeJumpGfxFuncFinished(void) { return (sPokemonJumpGfx->funcFinished != TRUE); } static void SetUpPokeJumpGfxFunc(void (*func)(void)) { SetWordTaskArg(sPokemonJumpGfx->taskId, 0, (uintptr_t)func); sPokemonJumpGfx->mainState = 0; sPokemonJumpGfx->funcFinished = FALSE; } static void Task_RunPokeJumpGfxFunc(u8 taskId) { if (!sPokemonJumpGfx->funcFinished) { // Read the function set in the data by SetUpPokeJumpGfxFunc void (*func)(void) = (void *)(GetWordTaskArg(taskId, 0)); func(); } } static void LoadPokeJumpGfx(void) { switch (sPokemonJumpGfx->mainState) { case 0: ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); InitWindows(sWindowTemplates); ResetBgPositions(); ResetTempTileDataBuffers(); LoadSpriteSheetsAndPalettes(sPokemonJumpGfx); InitDigitPrinters(); LoadPalette(sBg_Pal, BG_PLTT_ID(0), sizeof(sBg_Pal)); DecompressAndCopyTileDataToVram(BG_SCENERY, sBg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENERY, sBg_Tilemap, 0, 0, 1); LoadPalette(sVenusaur_Pal, BG_PLTT_ID(3), sizeof(sVenusaur_Pal)); DecompressAndCopyTileDataToVram(BG_VENUSAUR, sVenusaur_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_VENUSAUR, sVenusaur_Tilemap, 0, 0, 1); LoadPalette(sBonuses_Pal, BG_PLTT_ID(1), sizeof(sBonuses_Pal)); DecompressAndCopyTileDataToVram(BG_BONUSES, sBonuses_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_BONUSES, sBonuses_Tilemap, 0, 0, 1); LoadPalette(sInterface_Pal, BG_PLTT_ID(2), sizeof(sInterface_Pal)); SetBgTilemapBuffer(BG_INTERFACE, sPokemonJumpGfx->tilemapBuffer); FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 0x20, 0x20); PrintScoreSuffixes(); PrintScore(0); LoadStdWindowGfxOnBg(0, 1, BG_PLTT_ID(14)); LoadUserWindowGfx2(0, 0x00A, BG_PLTT_ID(13)); CopyBgTilemapBufferToVram(BG_INTERFACE); CopyBgTilemapBufferToVram(BG_VENUSAUR); CopyBgTilemapBufferToVram(BG_BONUSES); sPokemonJumpGfx->mainState++; break; case 1: if (!FreeTempTileDataBuffersIfPossible()) { CreateJumpMonSprites(); CreateVineSprites(sPokemonJumpGfx); UpdateVineAnim(sPokemonJumpGfx, VINE_UPSWING_LOWER); ShowBg(BG_SCENERY); ShowBg(BG_INTERFACE); ShowBg(BG_VENUSAUR); HideBg(BG_BONUSES); sPokemonJumpGfx->mainState++; } break; case 2: sPokemonJumpGfx->funcFinished = TRUE; break; } } static void PrintPlayerNamesNoHighlight(void) { switch (sPokemonJumpGfx->mainState) { case 0: AddPlayerNameWindows(); sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { PrintPokeJumpPlayerNames(FALSE); sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { DrawPlayerNameWindows(); sPokemonJumpGfx->mainState++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) sPokemonJumpGfx->funcFinished = TRUE; break; } } static void PrintPlayerNamesWithHighlight(void) { switch (sPokemonJumpGfx->mainState) { case 0: AddPlayerNameWindows(); sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { PrintPokeJumpPlayerNames(TRUE); sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { DrawPlayerNameWindows(); sPokemonJumpGfx->mainState++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) sPokemonJumpGfx->funcFinished = TRUE; break; } } static void ErasePlayerNames(void) { int i, numPlayers; numPlayers = GetNumPokeJumpPlayers(); switch (sPokemonJumpGfx->mainState) { case 0: for (i = 0; i < numPlayers; i++) ClearWindowTilemap(sPokemonJumpGfx->nameWindowIds[i]); CopyBgTilemapBufferToVram(BG_INTERFACE); sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { for (i = 0; i < numPlayers; i++) RemoveWindow(sPokemonJumpGfx->nameWindowIds[i]); sPokemonJumpGfx->funcFinished = TRUE; } break; } } static void Msg_WantToPlayAgain(void) { switch (sPokemonJumpGfx->mainState) { case 0: sPokemonJumpGfx->msgWindowId = AddMessageWindow(1, 8, 20, 2); AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, gText_WantToPlayAgain2, 0, 2, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX); sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { PutWindowTilemap(sPokemonJumpGfx->msgWindowId); DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); CreatePokeJumpYesNoMenu(23, 7, 0); CopyBgTilemapBufferToVram(BG_INTERFACE); sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) sPokemonJumpGfx->funcFinished = TRUE; break; } } static void Msg_SavingDontTurnOff(void) { switch (sPokemonJumpGfx->mainState) { case 0: sPokemonJumpGfx->msgWindowId = AddMessageWindow(2, 7, 26, 4); AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, gText_SavingDontTurnOffPower, 0, 2, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX); sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { PutWindowTilemap(sPokemonJumpGfx->msgWindowId); DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); CopyBgTilemapBufferToVram(BG_INTERFACE); sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) sPokemonJumpGfx->funcFinished = TRUE; break; } } static void EraseMessage(void) { switch (sPokemonJumpGfx->mainState) { case 0: ClearMessageWindow(); DestroyYesNoMenu(); CopyBgTilemapBufferToVram(BG_INTERFACE); sPokemonJumpGfx->mainState++; break; case 1: if (!RemoveMessageWindow() && !IsDma3ManagerBusyWithBgCopy()) sPokemonJumpGfx->funcFinished = TRUE; break; } } static void Msg_SomeoneDroppedOut(void) { switch (sPokemonJumpGfx->mainState) { case 0: sPokemonJumpGfx->msgWindowId = AddMessageWindow(2, 8, 22, 4); AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, gText_SomeoneDroppedOut2, 0, 2, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX); sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { PutWindowTilemap(sPokemonJumpGfx->msgWindowId); DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); CopyBgTilemapBufferToVram(BG_INTERFACE); sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) sPokemonJumpGfx->funcFinished = TRUE; break; } } static void Msg_CommunicationStandby(void) { switch (sPokemonJumpGfx->mainState) { case 0: sPokemonJumpGfx->msgWindowId = AddMessageWindow(7, 10, 16, 2); AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, gText_CommunicationStandby4, 0, 2, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX); sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { PutWindowTilemap(sPokemonJumpGfx->msgWindowId); DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); CopyBgTilemapBufferToVram(BG_INTERFACE); sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) sPokemonJumpGfx->funcFinished = TRUE; break; } } static void DoPokeJumpCountdown(void) { switch (sPokemonJumpGfx->mainState) { case 0: StartPokeJumpCountdown(sPokemonJumpGfx); sPokemonJumpGfx->mainState++; break; case 1: if (!IsPokeJumpCountdownRunning()) sPokemonJumpGfx->funcFinished = TRUE; break; } } static void SetUpResetVineGfx(void) { sPokemonJumpGfx->resetVineState = 0; sPokemonJumpGfx->resetVineTimer = 0; sPokemonJumpGfx->vineState = VINE_UPSWING_LOWER; UpdateVineSwing(sPokemonJumpGfx->vineState); } static bool32 ResetVineGfx(void) { switch (sPokemonJumpGfx->resetVineState) { case 0: sPokemonJumpGfx->resetVineTimer++; if (sPokemonJumpGfx->resetVineTimer > 10) { sPokemonJumpGfx->resetVineTimer = 0; sPokemonJumpGfx->vineState++; if (sPokemonJumpGfx->vineState >= NUM_VINESTATES) { sPokemonJumpGfx->vineState = VINE_HIGHEST; sPokemonJumpGfx->resetVineState++; } } UpdateVineSwing(sPokemonJumpGfx->vineState); if (sPokemonJumpGfx->vineState != VINE_UPSWING_LOW) break; case 1: return FALSE; } return TRUE; } static const u8 sPluralTxt[] = _("IES"); static void PrintPrizeMessage(u16 itemId, u16 quantity) { CopyItemName(itemId, sPokemonJumpGfx->itemName); ConvertIntToDecimalStringN(sPokemonJumpGfx->itemQuantityStr, quantity, STR_CONV_MODE_LEFT_ALIGN, 1); if (itemId >= FIRST_BERRY_INDEX && itemId < LAST_BERRY_INDEX) { if (quantity > 1) { int endi = StringLength(sPokemonJumpGfx->itemName); if (endi != 0) { endi--; endi[sPokemonJumpGfx->itemName] = EOS; StringAppend(sPokemonJumpGfx->itemName, sPluralTxt); } } } DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPokemonJumpGfx->itemName); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sPokemonJumpGfx->itemQuantityStr); DynamicPlaceholderTextUtil_ExpandPlaceholders(sPokemonJumpGfx->prizeMsg, gText_AwesomeWonF701F700); sPokemonJumpGfx->msgWindowId = AddMessageWindow(4, 8, 22, 4); AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, sPokemonJumpGfx->prizeMsg, 0, 2, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX); sPokemonJumpGfx->fanfare = MUS_LEVEL_UP; sPokemonJumpGfx->msgWindowState = 0; } static void PrintPrizeFilledBagMessage(u16 itemId) { CopyItemName(itemId, sPokemonJumpGfx->itemName); DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPokemonJumpGfx->itemName); DynamicPlaceholderTextUtil_ExpandPlaceholders(sPokemonJumpGfx->prizeMsg, gText_FilledStorageSpace2); sPokemonJumpGfx->msgWindowId = AddMessageWindow(4, 8, 22, 4); AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, sPokemonJumpGfx->prizeMsg, 0, 2, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX); sPokemonJumpGfx->fanfare = MUS_DUMMY; sPokemonJumpGfx->msgWindowState = 0; } static void PrintNoRoomForPrizeMessage(u16 itemId) { CopyItemName(itemId, sPokemonJumpGfx->itemName); DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPokemonJumpGfx->itemName); DynamicPlaceholderTextUtil_ExpandPlaceholders(sPokemonJumpGfx->prizeMsg, gText_CantHoldMore); sPokemonJumpGfx->msgWindowId = AddMessageWindow(4, 9, 22, 2); AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, sPokemonJumpGfx->prizeMsg, 0, 2, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX); sPokemonJumpGfx->fanfare = MUS_DUMMY; sPokemonJumpGfx->msgWindowState = 0; } static bool32 DoPrizeMessageAndFanfare(void) { switch (sPokemonJumpGfx->msgWindowState) { case 0: if (!IsDma3ManagerBusyWithBgCopy()) { PutWindowTilemap(sPokemonJumpGfx->msgWindowId); DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); CopyBgTilemapBufferToVram(BG_INTERFACE); sPokemonJumpGfx->msgWindowState++; } break; case 1: if (IsDma3ManagerBusyWithBgCopy()) break; if (sPokemonJumpGfx->fanfare == MUS_DUMMY) { sPokemonJumpGfx->msgWindowState += 2; return FALSE; } PlayFanfare(sPokemonJumpGfx->fanfare); sPokemonJumpGfx->msgWindowState++; case 2: if (!IsFanfareTaskInactive()) break; sPokemonJumpGfx->msgWindowState++; case 3: return FALSE; } return TRUE; } static void ClearMessageWindow(void) { if (sPokemonJumpGfx->msgWindowId != WINDOW_NONE) { rbox_fill_rectangle(sPokemonJumpGfx->msgWindowId); CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_MAP); sPokemonJumpGfx->msgWindowState = 0; } } static bool32 RemoveMessageWindow(void) { if (sPokemonJumpGfx->msgWindowId == WINDOW_NONE) return FALSE; switch (sPokemonJumpGfx->msgWindowState) { case 0: if (!IsDma3ManagerBusyWithBgCopy()) { RemoveWindow(sPokemonJumpGfx->msgWindowId); sPokemonJumpGfx->msgWindowId = WINDOW_NONE; sPokemonJumpGfx->msgWindowState++; } else break; case 1: return FALSE; } return TRUE; } static s8 HandlePlayAgainInput(void) { return Menu_ProcessInputNoWrapClearOnChoose(); } static u32 AddMessageWindow(u32 left, u32 top, u32 width, u32 height) { u32 windowId; struct WindowTemplate window; window.bg = BG_INTERFACE; window.tilemapLeft = left; window.tilemapTop = top; window.width = width; window.height = height; window.paletteNum = 15; window.baseBlock = 0x43; windowId = AddWindow(&window); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); return windowId; } static void CreatePokeJumpYesNoMenu(u16 left, u16 top, u8 cursorPos) { struct WindowTemplate window; u8 a = cursorPos; window.bg = BG_INTERFACE; window.tilemapLeft = left; window.tilemapTop = top; window.width = 6; window.height = 4; window.paletteNum = 2; window.baseBlock = 0x2B; CreateYesNoMenu(&window, FONT_NORMAL, 0, 2, 0x00a, 13, a); } // "Points" for jump score and "times" for number of jumps in a row static void PrintScoreSuffixes(void) { u8 color[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; PutWindowTilemap(WIN_POINTS); PutWindowTilemap(WIN_TIMES); FillWindowPixelBuffer(WIN_POINTS, PIXEL_FILL(0)); FillWindowPixelBuffer(WIN_TIMES, PIXEL_FILL(0)); AddTextPrinterParameterized3(WIN_POINTS, FONT_SMALL, 0, 2, color, 0, gText_SpacePoints2); AddTextPrinterParameterized3(WIN_TIMES, FONT_SMALL, 0, 2, color, 0, gText_SpaceTimes3); } // The venusaurs in the background are actually an empty 256x512 bg with 3 pairs of venusaurs on it. // The below array is used to get values for where to set the bg Y to show the corresponding // venusaur pair in their state of swinging the vine rope // NEUTRAL/DOWN/UP refers to which direction the Venusaur is facing as it swings the vine enum { VENUSAUR_NEUTRAL, VENUSAUR_DOWN, VENUSAUR_UP, }; static const u8 sVenusaurStates[] = { [VINE_HIGHEST] = VENUSAUR_UP, [VINE_DOWNSWING_HIGHER] = VENUSAUR_UP, [VINE_DOWNSWING_HIGH] = VENUSAUR_NEUTRAL, [VINE_DOWNSWING_LOW] = VENUSAUR_NEUTRAL, [VINE_DOWNSWING_LOWER] = VENUSAUR_DOWN, [VINE_LOWEST] = VENUSAUR_DOWN, [VINE_UPSWING_LOWER] = VENUSAUR_DOWN, [VINE_UPSWING_LOW] = VENUSAUR_NEUTRAL, [VINE_UPSWING_HIGH] = VENUSAUR_NEUTRAL, [VINE_UPSWING_HIGHER] = VENUSAUR_UP, }; static const struct CompressedSpriteSheet sSpriteSheet_Digits = {gMinigameDigits_Gfx, 0, TAG_DIGITS}; static const struct SpritePalette sSpritePalette_Digits = {gMinigameDigits_Pal, TAG_DIGITS}; static const u16 sPlayerNameWindowCoords_2Players[] = { 6, 8, 16, 8 }; static const u16 sPlayerNameWindowCoords_3Players[] = { 6, 8, 11, 6, 16, 8 }; static const u16 sPlayerNameWindowCoords_4Players[] = { 2, 6, 6, 8, 16, 8, 20, 6 }; static const u16 sPlayerNameWindowCoords_5Players[] = { 2, 6, 6, 8, 11, 6, 16, 8, 20, 6 }; static const u16 *const sPlayerNameWindowCoords[MAX_RFU_PLAYERS - 1] = { sPlayerNameWindowCoords_2Players, sPlayerNameWindowCoords_3Players, sPlayerNameWindowCoords_4Players, sPlayerNameWindowCoords_5Players, }; static const s16 sMonXCoords_2Players[] = {88, 152}; static const s16 sMonXCoords_3Players[] = {88, 120, 152}; static const s16 sMonXCoords_4Players[] = {56, 88, 152, 184}; static const s16 sMonXCoords_5Players[] = {56, 88, 120, 152, 184}; static const s16 *const sMonXCoords[MAX_RFU_PLAYERS - 1] = { sMonXCoords_2Players, sMonXCoords_3Players, sMonXCoords_4Players, sMonXCoords_5Players, }; static void CreateJumpMonSprites(void) { int i, y, playersCount = GetNumPokeJumpPlayers(); const s16 *xCoords = sMonXCoords[playersCount - 2]; for (i = 0; i < playersCount; i++) { struct PokemonJump_MonInfo *info = GetMonInfoByMultiplayerId(i); y = gMonFrontPicCoords[info->species].y_offset; CreateJumpMonSprite(sPokemonJumpGfx, info, *xCoords, y + 112, i); CreateStarSprite(sPokemonJumpGfx, *xCoords, 112, i); xCoords++; } } static void SetMonSpriteY(u32 id, s16 y) { sPokemonJumpGfx->monSprites[id]->y2 = y; } static void UpdateVineSwing(int vineState) { UpdateVineAnim(sPokemonJumpGfx, vineState); ChangeBgY(BG_VENUSAUR, (sVenusaurStates[vineState] * 5) << 13, BG_COORD_SET); } static int DoSameJumpTimeBonus(u8 flags) { int i, numPlayers; for (i = 0, numPlayers = 0; i < MAX_RFU_PLAYERS; i++) { if (flags & 1) { // Player was part of a synchronous jump // Give a bonus to them DoStarAnim(sPokemonJumpGfx, i); numPlayers++; } flags >>= 1; } ShowBonus(numPlayers - 2); return numPlayers; } static void InitDigitPrinters(void) { struct DigitObjUtilTemplate template = { .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .strConvMode = 0, .priority = 1, .oamCount = 5, .xDelta = 8, .x = 108, .y = 6, .spriteSheet = {.compressed = &sSpriteSheet_Digits}, .spritePal = &sSpritePalette_Digits, }; DigitObjUtil_Init(NUM_WINDOWS); DigitObjUtil_CreatePrinter(WIN_POINTS, 0, &template); template.oamCount = 4; template.x = 30; template.y = 6; DigitObjUtil_CreatePrinter(WIN_TIMES, 0, &template); } static void PrintScore(int num) { DigitObjUtil_PrintNumOn(WIN_POINTS, num); } static void PrintJumpsInRow(u16 num) { DigitObjUtil_PrintNumOn(WIN_TIMES, num); } static void StartMonHitShake(u8 multiplayerId) { Gfx_StartMonHitShake(sPokemonJumpGfx, multiplayerId); } static void StartMonHitFlash(u8 multiplayerId) { Gfx_StartMonHitFlash(sPokemonJumpGfx, multiplayerId); } static int IsMonHitShakeActive(int multiplayerId) { return Gfx_IsMonHitShakeActive(sPokemonJumpGfx, multiplayerId); } static void StopMonHitFlash(void) { Gfx_StopMonHitFlash(sPokemonJumpGfx); } static void ResetMonSpriteSubpriorities(void) { Gfx_ResetMonSpriteSubpriorities(sPokemonJumpGfx); } static void StartMonIntroBounce(int multiplayerId) { Gfx_StartMonIntroBounce(sPokemonJumpGfx, multiplayerId); } static int IsMonIntroBounceActive(void) { return Gfx_IsMonIntroBounceActive(sPokemonJumpGfx); } static void AddPlayerNameWindows(void) { struct WindowTemplate window; int i, playersCount = GetNumPokeJumpPlayers(); const u16 *winCoords = sPlayerNameWindowCoords[playersCount - 2]; window.bg = BG_INTERFACE; window.width = 8; window.height = 2; window.paletteNum = 2; window.baseBlock = 0x2B; for (i = 0; i < playersCount; i++) { window.tilemapLeft = winCoords[0]; window.tilemapTop = winCoords[1]; sPokemonJumpGfx->nameWindowIds[i] = AddWindow(&window); ClearWindowTilemap(sPokemonJumpGfx->nameWindowIds[i]); window.baseBlock += 0x10; winCoords += 2; } CopyBgTilemapBufferToVram(BG_INTERFACE); } static void PrintPokeJumpPlayerName(int multiplayerId, u8 bgColor, u8 fgColor, u8 shadow) { u32 x; u8 colors[3] = {bgColor, fgColor, shadow}; FillWindowPixelBuffer(sPokemonJumpGfx->nameWindowIds[multiplayerId], PIXEL_FILL(0)); x = 64 - GetStringWidth(FONT_SMALL, GetPokeJumpPlayerName(multiplayerId), -1); x /= 2; AddTextPrinterParameterized3(sPokemonJumpGfx->nameWindowIds[multiplayerId], FONT_SMALL, x, 2, colors, TEXT_SKIP_DRAW, GetPokeJumpPlayerName(multiplayerId)); CopyWindowToVram(sPokemonJumpGfx->nameWindowIds[multiplayerId], COPYWIN_GFX); } static void PrintPokeJumpPlayerNames(bool32 highlightSelf) { int i, multiplayerId, playersCount = GetNumPokeJumpPlayers(); if (!highlightSelf) { for (i = 0; i < playersCount; i++) PrintPokeJumpPlayerName(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); } else { // Highlight own name multiplayerId = GetPokeJumpMultiplayerId(); for (i = 0; i < playersCount; i++) { if (multiplayerId != i) PrintPokeJumpPlayerName(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); else PrintPokeJumpPlayerName(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED); } } } static void DrawPlayerNameWindows(void) { int i, playersCount = GetNumPokeJumpPlayers(); for (i = 0; i < playersCount; i++) PutWindowTilemap(sPokemonJumpGfx->nameWindowIds[i]); CopyBgTilemapBufferToVram(BG_INTERFACE); } static void ShowBonus(u8 bonusId) { sPokemonJumpGfx->bonusTimer = 0; ChangeBgX(BG_BONUSES, (bonusId / 2) * 256 * 256, BG_COORD_SET); ChangeBgY(BG_BONUSES, (((bonusId % 2) * 256) - 40) * 256, BG_COORD_SET); ShowBg(BG_BONUSES); CreateTask(Task_UpdateBonus, 4); } static bool32 UpdateBonus(void) { if (sPokemonJumpGfx->bonusTimer >= 32) { return FALSE; } else { ChangeBgY(BG_BONUSES, 128, BG_COORD_ADD); if (++sPokemonJumpGfx->bonusTimer >= 32) HideBg(BG_BONUSES); return TRUE; } } static void Task_UpdateBonus(u8 taskId) { if (!UpdateBonus()) DestroyTask(taskId); } static const u16 sPokeJumpPal1[] = INCBIN_U16("graphics/pokemon_jump/pal1.gbapal"); static const u16 sPokeJumpPal2[] = INCBIN_U16("graphics/pokemon_jump/pal2.gbapal"); static const u32 sVine1_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine1.4bpp.lz"); static const u32 sVine2_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine2.4bpp.lz"); static const u32 sVine3_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine3.4bpp.lz"); static const u32 sVine4_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine4.4bpp.lz"); static const u32 sStar_Gfx[] = INCBIN_U32("graphics/pokemon_jump/star.4bpp.lz"); static const struct CompressedSpriteSheet sCompressedSpriteSheets[] = { {sVine1_Gfx, 0x600, GFXTAG_VINE1}, {sVine2_Gfx, 0xC00, GFXTAG_VINE2}, {sVine3_Gfx, 0x600, GFXTAG_VINE3}, {sVine4_Gfx, 0x600, GFXTAG_VINE4}, {sStar_Gfx, 0x200, GFXTAG_STAR}, }; static const struct SpritePalette sSpritePalettes[] = { {sPokeJumpPal1, PALTAG_1}, {sPokeJumpPal2, PALTAG_2}, }; static const struct OamData sOamData_JumpMon; static const struct SpriteTemplate sSpriteTemplate_Vine1; static const struct SpriteTemplate sSpriteTemplate_Vine2; static const struct SpriteTemplate sSpriteTemplate_Vine3; static const struct SpriteTemplate sSpriteTemplate_Vine4; static const struct SpriteTemplate sSpriteTemplate_JumpMon = { .tileTag = TAG_MON1, .paletteTag = TAG_MON1, .oam = &sOamData_JumpMon, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const s16 sVineYCoords[VINE_SPRITES_PER_SIDE][NUM_VINESTATES] = { {96, 96, 96, 114, 120, 120, 120, 114, 96, 96}, {70, 80, 96, 114, 120, 128, 120, 114, 96, 80}, {50, 72, 96, 114, 128, 136, 128, 114, 96, 72}, {42, 72, 96, 114, 128, 136, 128, 114, 96, 72}, }; static const s16 sVineXCoords[VINE_SPRITES_PER_SIDE * 2] = {16, 40, 72, 104, 136, 168, 200, 224}; static const struct SpriteTemplate *const sSpriteTemplates_Vine[VINE_SPRITES_PER_SIDE] = { &sSpriteTemplate_Vine1, &sSpriteTemplate_Vine2, &sSpriteTemplate_Vine3, &sSpriteTemplate_Vine4, }; static const struct OamData sOamData_JumpMon = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0 }; static const struct OamData sOamData_Vine16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x32), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0 }; static const struct OamData sOamData_Vine32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0 }; static const struct OamData sOamData_Vine32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 2, .paletteNum = 0, .affineParam = 0 }; static const union AnimCmd sAnims_Vine_Highest[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; static const union AnimCmd sAnims_Vine_Higher[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END }; static const union AnimCmd sAnims_Vine_High[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; static const union AnimCmd sAnims_Vine_Low[] = { ANIMCMD_FRAME(24, 1), ANIMCMD_END }; static const union AnimCmd sAnims_Vine_Lower[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; static const union AnimCmd sAnims_Vine_Lowest[] = { ANIMCMD_FRAME(40, 1), ANIMCMD_END }; static const union AnimCmd sAnims_VineTall_Highest[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; static const union AnimCmd sAnims_VineTall_Higher[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; static const union AnimCmd sAnims_VineTall_High[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; static const union AnimCmd sAnims_VineTall_Low[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END }; static const union AnimCmd sAnims_VineTall_Lower[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END }; static const union AnimCmd sAnims_VineTall_Lowest[] = { ANIMCMD_FRAME(80, 1), ANIMCMD_END }; static const union AnimCmd *const sAnims_Vine[] = { sAnims_Vine_Highest, sAnims_Vine_Higher, sAnims_Vine_High, sAnims_Vine_Low, sAnims_Vine_Lower, sAnims_Vine_Lowest }; // Vine 2 needs its own set of anims because the graphic is twice as large static const union AnimCmd *const sAnims_VineTall[] = { sAnims_VineTall_Highest, sAnims_VineTall_Higher, sAnims_VineTall_High, sAnims_VineTall_Low, sAnims_VineTall_Lower, sAnims_VineTall_Lowest }; static const struct SpriteTemplate sSpriteTemplate_Vine1 = { .tileTag = GFXTAG_VINE1, .paletteTag = PALTAG_1, .oam = &sOamData_Vine16x32, .anims = sAnims_Vine, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct SpriteTemplate sSpriteTemplate_Vine2 = { .tileTag = GFXTAG_VINE2, .paletteTag = PALTAG_1, .oam = &sOamData_Vine32x32, .anims = sAnims_VineTall, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct SpriteTemplate sSpriteTemplate_Vine3 = { .tileTag = GFXTAG_VINE3, .paletteTag = PALTAG_1, .oam = &sOamData_Vine32x16, .anims = sAnims_Vine, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct SpriteTemplate sSpriteTemplate_Vine4 = { .tileTag = GFXTAG_VINE4, .paletteTag = PALTAG_1, .oam = &sOamData_Vine32x16, .anims = sAnims_Vine, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct OamData sOamData_Star = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0 }; static const union AnimCmd sAnim_Star_Still[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sAnim_Star_Spinning[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(12, 4), ANIMCMD_LOOP(1), ANIMCMD_FRAME(0, 4), ANIMCMD_END }; static const union AnimCmd *const sAnims_Star[] = { sAnim_Star_Still, sAnim_Star_Spinning }; static const struct SpriteTemplate sSpriteTemplate_Star = { .tileTag = GFXTAG_STAR, .paletteTag = PALTAG_1, .oam = &sOamData_Star, .anims = sAnims_Star, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static void LoadSpriteSheetsAndPalettes(struct PokemonJumpGfx *jumpGfx) { int i; for (i = 0; i < ARRAY_COUNT(sCompressedSpriteSheets); i++) LoadCompressedSpriteSheet(&sCompressedSpriteSheets[i]); for (i = 0; i < ARRAY_COUNT(sSpritePalettes); i++) LoadSpritePalette(&sSpritePalettes[i]); jumpGfx->vinePalNumDownswing = IndexOfSpritePaletteTag(PALTAG_1); jumpGfx->vinePalNumUpswing = IndexOfSpritePaletteTag(PALTAG_2); } static void ResetPokeJumpSpriteData(struct Sprite *sprite) { int i; for (i = 0; i < (int)ARRAY_COUNT(sprite->data); i++) sprite->data[i] = 0; } static void CreateJumpMonSprite(struct PokemonJumpGfx *jumpGfx, struct PokemonJump_MonInfo *monInfo, s16 x, s16 y, u8 multiplayerId) { struct SpriteTemplate spriteTemplate; struct SpriteSheet spriteSheet; struct CompressedSpritePalette spritePalette; u8 *buffer; u8 *unusedBuffer; u8 subpriority; u8 spriteId; spriteTemplate = sSpriteTemplate_JumpMon; buffer = Alloc(0x2000); unusedBuffer = Alloc(MON_PIC_SIZE); if (multiplayerId == GetPokeJumpMultiplayerId()) subpriority = 3; else subpriority = multiplayerId + 4; if (buffer && unusedBuffer) { HandleLoadSpecialPokePic( &gMonFrontPicTable[monInfo->species], buffer, monInfo->species, monInfo->personality); spriteSheet.data = buffer; spriteSheet.tag = multiplayerId; spriteSheet.size = MON_PIC_SIZE; LoadSpriteSheet(&spriteSheet); spritePalette.data = GetMonSpritePalFromSpeciesAndPersonality(monInfo->species, monInfo->otId, monInfo->personality); spritePalette.tag = multiplayerId; LoadCompressedSpritePalette(&spritePalette); Free(buffer); Free(unusedBuffer); spriteTemplate.tileTag += multiplayerId; spriteTemplate.paletteTag += multiplayerId; spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); if (spriteId != MAX_SPRITES) { jumpGfx->monSprites[multiplayerId] = &gSprites[spriteId]; jumpGfx->monSpriteSubpriorities[multiplayerId] = subpriority; return; } } jumpGfx->monSprites[multiplayerId] = NULL; } #define sState data[0] #define sTimer data[1] #define sOffset data[7] // Never read static void DoStarAnim(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { ResetPokeJumpSpriteData(jumpGfx->starSprites[multiplayerId]); jumpGfx->starSprites[multiplayerId]->sOffset = jumpGfx->monSprites[multiplayerId] - gSprites; jumpGfx->starSprites[multiplayerId]->invisible = FALSE; jumpGfx->starSprites[multiplayerId]->y = 96; jumpGfx->starSprites[multiplayerId]->callback = SpriteCB_Star; StartSpriteAnim(jumpGfx->starSprites[multiplayerId], 1); } static void SpriteCB_Star(struct Sprite *sprite) { switch (sprite->sState) { case 0: if (sprite->animEnded) { sprite->invisible = TRUE; sprite->callback = SpriteCallbackDummy; } break; case 1: sprite->y--; sprite->sTimer++; if (sprite->y <= 72) { sprite->y = 72; sprite->sState++; } break; case 2: if (++sprite->sTimer >= 48) { sprite->invisible = TRUE; sprite->callback = SpriteCallbackDummy; } break; } } #undef sState #undef sTimer #undef sOffset static void Gfx_StartMonHitShake(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { jumpGfx->monSprites[multiplayerId]->callback = SpriteCB_MonHitShake; jumpGfx->monSprites[multiplayerId]->y2 = 0; ResetPokeJumpSpriteData(jumpGfx->monSprites[multiplayerId]); } static bool32 Gfx_IsMonHitShakeActive(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { return jumpGfx->monSprites[multiplayerId]->callback == SpriteCB_MonHitShake; } #define sTimer data[1] #define sNumShakes data[2] static void SpriteCB_MonHitShake(struct Sprite *sprite) { if (++sprite->sTimer > 1) { if (++sprite->sNumShakes & 1) sprite->y2 = 2; else sprite->y2 = -2; sprite->sTimer = 0; } if (sprite->sNumShakes > 12) { sprite->y2 = 0; sprite->callback = SpriteCallbackDummy; } } #undef sTimer #undef sNumShakes static void Gfx_StartMonHitFlash(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { ResetPokeJumpSpriteData(jumpGfx->monSprites[multiplayerId]); jumpGfx->monSprites[multiplayerId]->callback = SpriteCB_MonHitFlash; } static void Gfx_StopMonHitFlash(struct PokemonJumpGfx *jumpGfx) { int i; u16 numPlayers = GetNumPokeJumpPlayers(); for (i = 0; i < numPlayers; i++) { if (jumpGfx->monSprites[i]->callback == SpriteCB_MonHitFlash) { jumpGfx->monSprites[i]->invisible = FALSE; jumpGfx->monSprites[i]->callback = SpriteCallbackDummy; jumpGfx->monSprites[i]->subpriority = 10; } } } #define sTimer data[0] static void SpriteCB_MonHitFlash(struct Sprite *sprite) { if (++sprite->sTimer > 3) { sprite->sTimer = 0; sprite->invisible ^= 1; } } #undef sTimer static void Gfx_ResetMonSpriteSubpriorities(struct PokemonJumpGfx *jumpGfx) { int i; u16 numPlayers = GetNumPokeJumpPlayers(); for (i = 0; i < numPlayers; i++) jumpGfx->monSprites[i]->subpriority = jumpGfx->monSpriteSubpriorities[i]; } static void Gfx_StartMonIntroBounce(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { ResetPokeJumpSpriteData(jumpGfx->monSprites[multiplayerId]); jumpGfx->monSprites[multiplayerId]->callback = SpriteCB_MonIntroBounce; } static bool32 Gfx_IsMonIntroBounceActive(struct PokemonJumpGfx *jumpGfx) { int i; u16 numPlayers = GetNumPokeJumpPlayers(); for (i = 0; i < numPlayers; i++) { if (jumpGfx->monSprites[i]->callback == SpriteCB_MonIntroBounce) return TRUE; } return FALSE; } #define sState data[0] #define sHopPos data[1] #define sNumHops data[2] static void SpriteCB_MonIntroBounce(struct Sprite *sprite) { switch (sprite->sState) { case 0: PlaySE(SE_BIKE_HOP); sprite->sHopPos = 0; sprite->sState++; // fall through case 1: sprite->sHopPos += 4; if (sprite->sHopPos > 127) sprite->sHopPos = 0; sprite->y2 = -(gSineTable[sprite->sHopPos] >> 3); if (sprite->sHopPos == 0) { if (++sprite->sNumHops < 2) sprite->sState = 0; else sprite->callback = SpriteCallbackDummy; } break; } } #undef sState #undef sHopPos #undef sNumHops static void CreateStarSprite(struct PokemonJumpGfx *jumpGfx, s16 x, s16 y, u8 multiplayerId) { u8 spriteId = CreateSprite(&sSpriteTemplate_Star, x, y, 1); if (spriteId != MAX_SPRITES) { gSprites[spriteId].invisible = TRUE; jumpGfx->starSprites[multiplayerId] = &gSprites[spriteId]; } } static void CreateVineSprites(struct PokemonJumpGfx *jumpGfx) { int i; int count; u8 spriteId; count = 0; for (i = 0; i < VINE_SPRITES_PER_SIDE; i++) { spriteId = CreateSprite(sSpriteTemplates_Vine[i], sVineXCoords[count], sVineYCoords[i][0], 2); jumpGfx->vineSprites[count] = &gSprites[spriteId]; count++; } for (i = VINE_SPRITES_PER_SIDE - 1; i >= 0; i--) { spriteId = CreateSprite(sSpriteTemplates_Vine[i], sVineXCoords[count], sVineYCoords[i][0], 2); jumpGfx->vineSprites[count] = &gSprites[spriteId]; jumpGfx->vineSprites[count]->hFlip = TRUE; count++; } } static void UpdateVineAnim(struct PokemonJumpGfx *jumpGfx, int vineState) { int i, count, palNum; int priority; if (vineState > VINE_LOWEST) { // animNums for vine on upswing are same as // on downswing but in reverse vineState = NUM_VINESTATES - vineState; priority = 3; // Set vine behind Pokémon palNum = jumpGfx->vinePalNumUpswing; } else { priority = 2; // Set vine in front of Pokémon palNum = jumpGfx->vinePalNumDownswing; } count = 0; for (i = 0; i < VINE_SPRITES_PER_SIDE; i++) { jumpGfx->vineSprites[count]->y = sVineYCoords[i][vineState]; jumpGfx->vineSprites[count]->oam.priority = priority; jumpGfx->vineSprites[count]->oam.paletteNum = palNum; StartSpriteAnim(jumpGfx->vineSprites[count], vineState); count++; } for (i = VINE_SPRITES_PER_SIDE - 1; i >= 0; i--) { jumpGfx->vineSprites[count]->y = sVineYCoords[i][vineState]; jumpGfx->vineSprites[count]->oam.priority = priority; jumpGfx->vineSprites[count]->oam.paletteNum = palNum; StartSpriteAnim(jumpGfx->vineSprites[count], vineState); count++; } } static void StartPokeJumpCountdown(struct PokemonJumpGfx *jumpGfx) { StartMinigameCountdown(GFXTAG_COUNTDOWN, PALTAG_COUNTDOWN, 120, 80, 0); Gfx_ResetMonSpriteSubpriorities(jumpGfx); } static bool32 IsPokeJumpCountdownRunning(void) { return IsMinigameCountdownRunning(); } static struct PokemonJumpRecords *GetPokeJumpRecords(void) { return &gSaveBlock2Ptr->pokeJump; } void ResetPokemonJumpRecords(void) { struct PokemonJumpRecords *records = GetPokeJumpRecords(); records->jumpsInRow = 0; records->bestJumpScore = 0; records->excellentsInRow = 0; records->gamesWithMaxPlayers = 0; records->unused2 = 0; records->unused1 = 0; } static bool32 TryUpdateRecords(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow) { struct PokemonJumpRecords *records = GetPokeJumpRecords(); bool32 newRecord = FALSE; if (records->bestJumpScore < jumpScore && jumpScore <= MAX_JUMP_SCORE) records->bestJumpScore = jumpScore, newRecord = TRUE; if (records->jumpsInRow < jumpsInRow && jumpsInRow <= MAX_JUMPS) records->jumpsInRow = jumpsInRow, newRecord = TRUE; if (records->excellentsInRow < excellentsInRow && excellentsInRow <= MAX_JUMPS) records->excellentsInRow = excellentsInRow, newRecord = TRUE; return newRecord; } static void IncrementGamesWithMaxPlayers(void) { struct PokemonJumpRecords *records = GetPokeJumpRecords(); if (records->gamesWithMaxPlayers < 9999) records->gamesWithMaxPlayers++; } void ShowPokemonJumpRecords(void) { u8 taskId = CreateTask(Task_ShowPokemonJumpRecords, 0); Task_ShowPokemonJumpRecords(taskId); } static const struct WindowTemplate sWindowTemplate_Records = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 28, .height = 9, .paletteNum = 15, .baseBlock = 0x1, }; static const u8 *const sRecordsTexts[] = {gText_JumpsInARow, gText_BestScore2, gText_ExcellentsInARow}; #define tState data[0] #define tWindowId data[1] static void Task_ShowPokemonJumpRecords(u8 taskId) { s16 *data = gTasks[taskId].data; switch (tState) { case 0: tWindowId = AddWindow(&sWindowTemplate_Records); PrintRecordsText(tWindowId); CopyWindowToVram(tWindowId, COPYWIN_FULL); tState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) tState++; break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON)) { rbox_fill_rectangle(tWindowId); CopyWindowToVram(tWindowId, COPYWIN_MAP); tState++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { RemoveWindow(tWindowId); DestroyTask(taskId); ScriptContext_Enable(); } break; } } #undef tState #undef tWindowId static void PrintRecordsText(u16 windowId) { int i, x; int recordNums[3]; struct PokemonJumpRecords *records = GetPokeJumpRecords(); u8 strbuf[8]; recordNums[0] = records->jumpsInRow; recordNums[1] = records->bestJumpScore; recordNums[2] = records->excellentsInRow; LoadStdWindowGfx(windowId, 0x21D, BG_PLTT_ID(13)); DrawTextBorderOuter(windowId, 0x21D, 13); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); AddTextPrinterParameterized5(windowId, FONT_NORMAL, gText_PkmnJumpRecords, 0, 0, TEXT_SKIP_DRAW, NULL, 1, 0); for (i = 0; i < ARRAY_COUNT(sRecordsTexts); i++) { AddTextPrinterParameterized5(windowId, FONT_NORMAL, sRecordsTexts[i], 0, 20 + (i * 14), TEXT_SKIP_DRAW, NULL, 1, 0); ConvertIntToDecimalStringN(strbuf, recordNums[i], STR_CONV_MODE_LEFT_ALIGN, 5); TruncateToFirstWordOnly(strbuf); x = 0xDE - GetStringWidth(FONT_NORMAL, strbuf, 0); AddTextPrinterParameterized5(windowId, FONT_NORMAL, strbuf, x, 20 + (i * 14), TEXT_SKIP_DRAW, NULL, 0, 0); } PutWindowTilemap(windowId); } static void TruncateToFirstWordOnly(u8 *str) { for (;*str != EOS; str++) { if (*str == CHAR_SPACE) { *str = EOS; break; } } } ================================================ FILE: src/pokemon_size_record.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "event_data.h" #include "pokedex.h" #include "text.h" #include "strings.h" #define DEFAULT_MAX_SIZE 0 // was 0x8100 in Ruby/Sapphire, 0x8000 in Emerald struct UnknownStruct { u16 unk0; u8 unk2; u16 unk4; }; static const struct UnknownStruct sBigMonSizeTable[] = { { 290, 1, 0 }, { 300, 1, 10 }, { 400, 2, 110 }, { 500, 4, 310 }, { 600, 20, 710 }, { 700, 50, 2710 }, { 800, 100, 7710 }, { 900, 150, 17710 }, { 1000, 150, 32710 }, { 1100, 100, 47710 }, { 1200, 50, 57710 }, { 1300, 20, 62710 }, { 1400, 5, 64710 }, { 1500, 2, 65210 }, { 1600, 1, 65410 }, { 1700, 1, 65510 }, }; static const u8 sGiftRibbonsMonDataIds[] = { MON_DATA_MARINE_RIBBON, MON_DATA_LAND_RIBBON, MON_DATA_SKY_RIBBON, MON_DATA_COUNTRY_RIBBON, MON_DATA_NATIONAL_RIBBON, MON_DATA_EARTH_RIBBON, MON_DATA_WORLD_RIBBON }; #define CM_PER_INCH 2.54 static u32 GetMonSizeHash(struct Pokemon * pkmn) { u16 personality = GetMonData(pkmn, MON_DATA_PERSONALITY); u16 hpIV = GetMonData(pkmn, MON_DATA_HP_IV) & 0xF; u16 attackIV = GetMonData(pkmn, MON_DATA_ATK_IV) & 0xF; u16 defenseIV = GetMonData(pkmn, MON_DATA_DEF_IV) & 0xF; u16 speedIV = GetMonData(pkmn, MON_DATA_SPEED_IV) & 0xF; u16 spAtkIV = GetMonData(pkmn, MON_DATA_SPATK_IV) & 0xF; u16 spDefIV = GetMonData(pkmn, MON_DATA_SPDEF_IV) & 0xF; u32 hibyte = ((attackIV ^ defenseIV) * hpIV) ^ (personality & 0xFF); u32 lobyte = ((spAtkIV ^ spDefIV) * speedIV) ^ (personality >> 8); return (hibyte << 8) + lobyte; } static u8 TranslateBigMonSizeTableIndex(u16 a) { u32 i; for (i = 1; i < 15; i++) { if (a < sBigMonSizeTable[i].unk4) return i - 1; } return i; } static u32 GetMonSize(u16 species, u16 b) { u64 unk2; u64 unk4; u64 unk0; u32 height; u32 var; height = GetPokedexHeightWeight(SpeciesToNationalPokedexNum(species), 0); var = TranslateBigMonSizeTableIndex(b); unk0 = sBigMonSizeTable[var].unk0; unk2 = sBigMonSizeTable[var].unk2; unk4 = sBigMonSizeTable[var].unk4; unk0 += (b - unk4) / unk2; return height * unk0 / 10; } static void FormatMonSizeRecord(u8 *string, u32 size) { #ifdef UNITS_IMPERIAL //Convert size from centimeters to inches //In the Hoenn games, this conversion was performed using floating point values size = size * 100 / 254; #endif string = ConvertIntToDecimalStringN(string, size / 10, STR_CONV_MODE_LEFT_ALIGN, 8); string = StringAppend(string, gText_DecimalPoint); ConvertIntToDecimalStringN(string, size % 10, STR_CONV_MODE_LEFT_ALIGN, 1); } static u8 CompareMonSize(u16 species, u16 *sizeRecord) { if (gSpecialVar_Result >= PARTY_SIZE) { return 0; } else { struct Pokemon * pkmn = &gPlayerParty[gSpecialVar_Result]; if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species) { return 1; } else { u32 oldSize; u32 newSize; u16 sizeParams; *(&sizeParams) = GetMonSizeHash(pkmn); newSize = GetMonSize(species, sizeParams); oldSize = GetMonSize(species, *sizeRecord); FormatMonSizeRecord(gStringVar3, oldSize); FormatMonSizeRecord(gStringVar2, newSize); if (newSize == oldSize) { return 4; } else if (newSize < oldSize) { return 2; } else { *sizeRecord = sizeParams; return 3; } } } } // Stores species name in gStringVar1, trainer's name in gStringVar2, and size in gStringVar3 static void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord) { u32 size = GetMonSize(species, *sizeRecord); FormatMonSizeRecord(gStringVar3, size); StringCopy(gStringVar1, gSpeciesNames[species]); } void InitHeracrossSizeRecord(void) { VarSet(VAR_HERACROSS_SIZE_RECORD, DEFAULT_MAX_SIZE); } void GetHeracrossSizeRecordInfo(void) { u16 *sizeRecord = GetVarPointer(VAR_HERACROSS_SIZE_RECORD); GetMonSizeRecordInfo(SPECIES_HERACROSS, sizeRecord); } void CompareHeracrossSize(void) { u16 *sizeRecord = GetVarPointer(VAR_HERACROSS_SIZE_RECORD); gSpecialVar_Result = CompareMonSize(SPECIES_HERACROSS, sizeRecord); } void InitMagikarpSizeRecord(void) { VarSet(VAR_MAGIKARP_SIZE_RECORD, DEFAULT_MAX_SIZE); } void GetMagikarpSizeRecordInfo(void) { u16 *sizeRecord = GetVarPointer(VAR_MAGIKARP_SIZE_RECORD); GetMonSizeRecordInfo(SPECIES_MAGIKARP, sizeRecord); } void CompareMagikarpSize(void) { u16 *sizeRecord = GetVarPointer(VAR_MAGIKARP_SIZE_RECORD); gSpecialVar_Result = CompareMonSize(SPECIES_MAGIKARP, sizeRecord); } void GiveGiftRibbonToParty(u8 index, u8 ribbonId) { s32 i; bool32 gotRibbon = FALSE; u8 data = 1; u8 array[8]; memcpy(array, sGiftRibbonsMonDataIds, sizeof(sGiftRibbonsMonDataIds)); if (index < 11 && ribbonId < 65) { gSaveBlock1Ptr->giftRibbons[index] = ribbonId; for (i = 0; i < PARTY_SIZE; i++) { struct Pokemon * mon = &gPlayerParty[i]; if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(mon, MON_DATA_SANITY_IS_EGG)) { SetMonData(mon, array[index], &data); gotRibbon = TRUE; } } if (gotRibbon) FlagSet(FLAG_SYS_RIBBON_GET); } } ================================================ FILE: src/pokemon_special_anim.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "party_menu.h" #include "pokemon_special_anim_internal.h" #include "item_use.h" #include "task.h" #include "constants/songs.h" #include "constants/items.h" // Functions related to the special anims Pokemon // make when using an item on them in the field. static EWRAM_DATA bool32 sCancelDisabled = FALSE; static EWRAM_DATA u8 sPSATaskId = 0; static EWRAM_DATA struct PokemonSpecialAnim * sPSAWork = NULL; static struct PokemonSpecialAnim * AllocPSA(u8 slotId, u16 itemId, MainCallback callback); static void SetUpUseItemAnim_Normal(struct PokemonSpecialAnim * ptr); static void SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(struct PokemonSpecialAnim * ptr); static void SetUpUseItemAnim_CantEvolve(struct PokemonSpecialAnim * ptr); static void Task_UseItem_Normal(u8 taskId); static void Task_ForgetMove(u8 taskId); static void Task_EvoStone_CantEvolve(u8 taskId); static void Task_UseTM_NoForget(u8 taskId); static void Task_MachineSet(u8 taskId); static void Task_CleanUp(u8 taskId); static u8 GetClosenessFromFriendship(u16 friendship); static u16 GetAnimTypeByItemId(u16 itemId); void StartUseItemAnim_Normal(u8 slotId, u16 itemId, MainCallback callback) { struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback); if (ptr == NULL) SetMainCallback2(callback); else SetUpUseItemAnim_Normal(ptr); } void StartUseItemAnim_ForgetMoveAndLearnTMorHM(u8 slotId, u16 itemId, u16 moveId, MainCallback callback) { struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback); if (ptr == NULL) SetMainCallback2(callback); else { StringCopy(ptr->nameOfMoveForgotten, gMoveNames[moveId]); SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(ptr); } } void StartUseItemAnim_CantEvolve(u8 slotId, u16 itemId, MainCallback callback) { struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback); if (ptr == NULL) SetMainCallback2(callback); else SetUpUseItemAnim_CantEvolve(ptr); } static struct PokemonSpecialAnim * AllocPSA(u8 slotId, u16 itemId, MainCallback callback) { struct PokemonSpecialAnim * ptr; struct Pokemon * pokemon; u16 moveId; if (!gMain.inBattle) ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); ptr = Alloc(sizeof(struct PokemonSpecialAnim)); if (ptr == NULL) { SetMainCallback2(callback); return NULL; } pokemon = &gPlayerParty[slotId]; ptr->state = 0; ptr->savedCallback = callback; ptr->species = GetMonData(pokemon, MON_DATA_SPECIES); ptr->closeness = GetClosenessFromFriendship(GetMonData(pokemon, MON_DATA_FRIENDSHIP)); ptr->personality = GetMonData(pokemon, MON_DATA_PERSONALITY); ptr->slotId = slotId; ptr->itemId = itemId; ptr->animType = GetAnimTypeByItemId(itemId); ptr->pokemon = *pokemon; ptr->field_00a4 = 0; GetMonData(pokemon, MON_DATA_NICKNAME, ptr->nickname); if (ptr->animType == 4) { moveId = ItemIdToBattleMoveId(itemId); StringCopy(ptr->nameOfMoveToTeach, gMoveNames[moveId]); } return ptr; } static void VBlankCB_PSA(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); } static void CB2_PSA(void) { RunTextPrinters(); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void SetUseItemAnimCallback(u8 taskId, TaskFunc func) { struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0); ptr->state = 0; gTasks[taskId].func = func; } static void SetUpUseItemAnim_Normal(struct PokemonSpecialAnim * ptr) { u8 taskId; switch (ptr->animType) { case 0: case 1: case 3: taskId = CreateTask(Task_UseItem_Normal, 0); break; case 4: taskId = CreateTask(Task_UseTM_NoForget, 0); break; default: SetMainCallback2(ptr->savedCallback); Free(ptr); return; } ptr->cancelDisabled = FALSE; SetWordTaskArg(taskId, 0, (uintptr_t)ptr); SetMainCallback2(CB2_PSA); sPSATaskId = taskId; } static void SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(struct PokemonSpecialAnim * ptr) { u8 taskId = CreateTask(Task_ForgetMove, 0); SetWordTaskArg(taskId, 0, (uintptr_t)ptr); SetMainCallback2(CB2_PSA); sPSATaskId = taskId; ptr->cancelDisabled = FALSE; } static void SetUpUseItemAnim_CantEvolve(struct PokemonSpecialAnim * ptr) { u8 taskId = CreateTask(Task_EvoStone_CantEvolve, 0); SetWordTaskArg(taskId, 0, (uintptr_t)ptr); SetMainCallback2(CB2_PSA); sPSATaskId = taskId; } static void Task_UseItem_Normal(u8 taskId) { struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0); if (!ptr->cancelDisabled && JOY_HELD(A_BUTTON | B_BUTTON)) { PSA_UseItem_CleanUpForCancel(); SetUseItemAnimCallback(taskId, Task_CleanUp); return; } switch (ptr->state) { case 0: SetVBlankCallback(NULL); InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType); PSA_CreateMonSpriteAtCloseness(0); ptr->state++; break; case 1: if (!PokemonSpecialAnimSceneInitIsNotFinished()) { BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); ptr->state++; SetVBlankCallback(VBlankCB_PSA); } break; case 2: if (!gPaletteFade.active) { ptr->state++; } break; case 3: PSA_SetUpZoomAnim(ptr->closeness); ptr->state++; break; case 4: if (!PSA_IsZoomTaskActive()) { ptr->delayTimer = 0; ptr->state++; } break; case 5: if (!PSA_LevelUpVerticalSpritesTaskIsRunning()) { ptr->state++; } break; case 6: PSA_SetUpItemUseOnMonAnim(ptr->itemId, ptr->closeness, TRUE); ptr->state++; break; case 7: if (!PSA_IsItemUseOnMonAnimActive()) { ptr->cancelDisabled = TRUE; if (ptr->closeness == 3) { PlayCry_Normal(ptr->species, 0); } PSA_ShowMessageWindow(); ptr->state++; } break; case 8: PSA_PrintMessage(PSA_TEXT_ITEM_USED); ptr->state++; break; case 9: if (!PSA_IsMessagePrintTaskActive()) { ptr->state++; } break; case 10: PSA_SetUpZoomAnim(0); ptr->state++; break; case 11: if (!PSA_IsZoomTaskActive()) { ptr->cancelDisabled = TRUE; ptr->state++; } break; case 12: if (JOY_NEW(A_BUTTON | B_BUTTON)) { if (CheckIfItemIsTMHMOrEvolutionStone(ptr->itemId) != 2) // evo stone { BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); ptr->state++; } else { ptr->state += 2; } } break; case 13: if (!gPaletteFade.active) { ptr->state++; } break; case 14: SetMainCallback2(ptr->savedCallback); PSA_FreeWindowBuffers(); Free(ptr); DestroyTask(taskId); break; } } static void Task_ForgetMove(u8 taskId) { struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0); u8 r4; switch (ptr->state) { case 0: SetVBlankCallback(NULL); InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType); PSA_CreateMonSpriteAtCloseness(3); ptr->state++; break; case 1: if (!PokemonSpecialAnimSceneInitIsNotFinished()) { BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); ptr->state++; SetVBlankCallback(VBlankCB_PSA); } break; case 2: if (!gPaletteFade.active) { ptr->delayTimer = 0; ptr->state++; } break; case 3: ptr->delayTimer++; if (ptr->delayTimer > 30) { PSA_ShowMessageWindow(); ptr->state++; } break; case 4: PSA_PrintMessage(PSA_TEXT_FORGET_1); ptr->state++; break; case 5: if (!PSA_IsMessagePrintTaskActive()) { ptr->delayTimer = 0; ptr->state++; } break; case 6: ptr->delayTimer++; if (ptr->delayTimer > 30) { PSA_PrintMessage(PSA_TEXT_FORGET_2_AND); ptr->state++; } break; case 7: if (!PSA_IsMessagePrintTaskActive()) { ptr->delayTimer = 0; ptr->state++; } break; case 8: ptr->delayTimer++; if (ptr->delayTimer > 30) { PlaySE(SE_M_SPIT_UP); PSA_PrintMessage(PSA_TEXT_FORGET_POOF); PSA_DarkenMonSprite(); ptr->state++; } break; case 9: r4 = PSA_RunPoofAnim(); if (!(r4 | PSA_IsMessagePrintTaskActive())) { PSA_AfterPoof_ClearMessageWindow(); ptr->state++; } break; case 10: PSA_PrintMessage(PSA_TEXT_FORGET_FORGOT); ptr->state++; break; case 11: if (!PSA_IsMessagePrintTaskActive()) { PSA_PrintMessage(PSA_TEXT_FORGET_AND); ptr->state++; } break; case 12: if (!PSA_IsMessagePrintTaskActive()) { PSA_HideMessageWindow(); ptr->state++; } break; case 13: SetUseItemAnimCallback(taskId, Task_MachineSet); break; } } static void Task_EvoStone_CantEvolve(u8 taskId) { struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0); if (!ptr->cancelDisabled && JOY_HELD(B_BUTTON)) { SetUseItemAnimCallback(taskId, Task_CleanUp); return; } switch (ptr->state) { case 0: SetVBlankCallback(NULL); InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType); PSA_CreateMonSpriteAtCloseness(0); ptr->state++; break; case 1: if (!PokemonSpecialAnimSceneInitIsNotFinished()) { BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); ptr->state++; SetVBlankCallback(VBlankCB_PSA); } break; case 2: if (!gPaletteFade.active) { ptr->state++; } break; case 3: PSA_SetUpZoomAnim(ptr->closeness); ptr->state++; break; case 4: PSA_SetUpItemUseOnMonAnim(ptr->itemId, ptr->closeness, FALSE); ptr->state++; break; case 5: if (!PSA_IsItemUseOnMonAnimActive()) { PSA_ShowMessageWindow(); ptr->state++; } break; case 6: PSA_PrintMessage(PSA_TEXT_HUH); ptr->state++; break; case 7: if (!PSA_IsMessagePrintTaskActive()) { ptr->cancelDisabled = TRUE; ptr->state++; } break; case 8: if (JOY_NEW(A_BUTTON | B_BUTTON)) { BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); ptr->state++; } break; case 9: if (!gPaletteFade.active) { SetMainCallback2(ptr->savedCallback); PSA_FreeWindowBuffers(); Free(ptr); DestroyTask(taskId); } break; } } static void Task_UseTM_NoForget(u8 taskId) { struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0); if (JOY_NEW(B_BUTTON)) { SetUseItemAnimCallback(taskId, Task_CleanUp); return; } switch (ptr->state) { case 0: SetVBlankCallback(NULL); InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType); PSA_CreateMonSpriteAtCloseness(3); ptr->state++; break; case 1: if (!PokemonSpecialAnimSceneInitIsNotFinished()) { BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); ptr->state++; SetVBlankCallback(VBlankCB_PSA); } break; case 2: if (!gPaletteFade.active) { ptr->delayTimer = 0; ptr->state++; } break; case 3: ptr->delayTimer++; if (ptr->delayTimer > 20) { SetUseItemAnimCallback(taskId, Task_MachineSet); } break; } } static void Task_MachineSet(u8 taskId) { struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0); if (!ptr->cancelDisabled && JOY_NEW(B_BUTTON)) { PSA_UseTM_CleanUpForCancel(); SetUseItemAnimCallback(taskId, Task_CleanUp); return; } switch (ptr->state) { case 0: CreateItemIconSpriteAtMaxCloseness(ptr->itemId); ptr->delayTimer = 0; ptr->state++; break; case 1: PSA_ShowMessageWindow(); PSA_PrintMessage(PSA_TEXT_MACHINE_SET); ptr->state++; break; case 2: if (!PSA_IsMessagePrintTaskActive()) { PSA_HideMessageWindow(); ptr->state++; } break; case 3: PSA_UseTM_SetUpMachineSetWobble(); ptr->state++; break; case 4: if (!PSA_UseTM_RunMachineSetWobble()) { ptr->state++; } break; case 5: PSA_UseTM_SetUpZoomOutAnim(); ptr->state++; break; case 6: if (!PSA_UseTM_RunZoomOutAnim()) { ptr->delayTimer = 0; ptr->state++; } break; case 7: ptr->delayTimer++; if (ptr->delayTimer > 30) { PSA_ShowMessageWindow(); PSA_PrintMessage(PSA_TEXT_LEARNED_MOVE); ptr->state++; } break; case 8: if (!PSA_IsMessagePrintTaskActive()) { PlayFanfare(MUS_LEVEL_UP); ptr->cancelDisabled = TRUE; ptr->state++; } break; case 9: if (IsFanfareTaskInactive()) { SetUseItemAnimCallback(taskId, Task_CleanUp); } break; } } static void Task_CleanUp(u8 taskId) { struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0); switch (ptr->state) { case 0: SetVBlankCallback(VBlankCB_PSA); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); ptr->state++; break; case 1: if (!gPaletteFade.active && (ptr->field_00a4 != 1 || IsCryFinished())) { sCancelDisabled = ptr->cancelDisabled; SetMainCallback2(ptr->savedCallback); DestroyTask(taskId); PSA_FreeWindowBuffers(); Free(ptr); } break; } } static const struct { u16 itemId; u16 animType; } sItemAnimMap[2] = { {ITEM_RARE_CANDY, 0}, {ITEM_POTION, 1} }; static u16 GetAnimTypeByItemId(u16 itemId) { int i; for (i = 0; i < ARRAY_COUNT(sItemAnimMap); i++) { if (sItemAnimMap[i].itemId == itemId) return sItemAnimMap[i].animType; } if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08) { return 4; } return 0; } static u8 GetClosenessFromFriendship(u16 friendship) { if (friendship <= 100) return 0; else if (friendship <= 150) return 1; else if (friendship <= 200) return 2; else return 3; } struct PokemonSpecialAnim * GetPSAStruct(void) { return (void *)GetWordTaskArg(sPSATaskId, 0); } struct Pokemon * PSA_GetPokemon(void) { sPSAWork = GetPSAStruct(); return &sPSAWork->pokemon; } struct PokemonSpecialAnimScene * PSA_GetSceneWork(void) { return &GetPSAStruct()->sceneResources; } u16 PSA_GetItemId(void) { return GetPSAStruct()->itemId; } u8 *PSA_GetNameOfMoveForgotten(void) { return GetPSAStruct()->nameOfMoveForgotten; } u8 *PSA_GetNameOfMoveToTeach(void) { return GetPSAStruct()->nameOfMoveToTeach; } u8 *PSA_CopyMonNickname(u8 *dest) { return StringCopy(dest, GetPSAStruct()->nickname); } u8 *PSA_GetMonNickname(void) { return GetPSAStruct()->nickname; } u8 PSA_GetAnimType(void) { return GetPSAStruct()->animType; } u16 PSA_GetMonSpecies(void) { return GetPSAStruct()->species; } u32 PSA_GetMonPersonality(void) { return GetPSAStruct()->personality; } void GetMonLevelUpWindowStats(struct Pokemon * pokemon, u16 *data) { data[0] = GetMonData(pokemon, MON_DATA_MAX_HP); data[1] = GetMonData(pokemon, MON_DATA_ATK); data[2] = GetMonData(pokemon, MON_DATA_DEF); data[3] = GetMonData(pokemon, MON_DATA_SPEED); data[4] = GetMonData(pokemon, MON_DATA_SPATK); data[5] = GetMonData(pokemon, MON_DATA_SPDEF); } bool32 PSA_IsCancelDisabled(void) { return sCancelDisabled; } ================================================ FILE: src/pokemon_special_anim_scene.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "decompress.h" #include "dynamic_placeholder_text_util.h" #include "item.h" #include "item_menu_icons.h" #include "menu.h" #include "new_menu_helpers.h" #include "pokemon_special_anim_internal.h" #include "random.h" #include "strings.h" #include "text_window.h" #include "trig.h" #include "constants/songs.h" static void LoadBgGfxByAnimType(u16 animType); static void Task_ZoomAnim(u8 taskId); static void SetSpriteWithCloseness(struct Sprite *sprite, u8 closeness); static bool8 IsZoomSpriteCBActive(struct Sprite *sprite); static void MonSpriteZoom_UpdateYPos(struct Sprite *sprite, u8 closeness); static void ItemSpriteZoom_UpdateYPos(struct Sprite *sprite, u8 closeness); static void StartMonWiggleAnim(struct PokemonSpecialAnimScene * scene, u8 frameLen, u8 niter, u8 amplitude); static void StopMonWiggleAnim(struct PokemonSpecialAnimScene * scene); static void SpriteCallback_MonSpriteWiggle(struct Sprite *sprite); static void LoadMonSpriteGraphics(u16 *tilees, u16 *palette); static struct Sprite *PSA_CreateItemIconObject(u16 itemId); static u16 GetBlendColorByItemId(u16 itemId); static void Task_ItemUseOnMonAnim(u8 taskId); static void CreateSprites_UseItem_OutwardSpiralDots(u8 taskId, s16 *data, struct Sprite *sprite); static void SpriteCB_OutwardSpiralDots(struct Sprite *sprite); static void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, struct Sprite *sprite, u8 closeness); static void MachineSetWobbleInit(void); static void MachineSetWobble_SetCB(struct Sprite *sprite); static bool8 MachineSetWobbleCBIsRunning(void); static void SpriteCB_MachineSetWobble(struct Sprite *sprite); static void StartZoomOutAnimForUseTM(u8 closeness); static void CreateStarSprites(struct PokemonSpecialAnimScene * scene); static bool8 AnyStarSpritesActive(void); static void SpriteCB_Star(struct Sprite *sprite); static void PSAScene_SeedRandomInTask(struct PokemonSpecialAnimScene * scene); static void StopMakingOutwardSpiralDots(void); static void Task_UseItem_OutwardSpiralDots(u8 taskId); static u16 PSAScene_RandomFromTask(u8 taskId); static void SpriteCallback_UseItem_OutwardSpiralDots(struct Sprite *sprite); static void LoadOutwardSpiralDotsGfx(void); static bool32 IsOutwardSpiralDotsTaskRunning(void); static void Task_LevelUpVerticalSprites(u8 taskId); static void CreateLevelUpVerticalSprite(u8 taskId, s16 *data); static void SpriteCB_LevelUpVertical(struct Sprite *sprite); static const u16 sBg_Pal[] = INCBIN_U16("graphics/pokemon_special_anim/bg.gbapal"); static const u16 sBg_TmHm_Pal[] = INCBIN_U16("graphics/pokemon_special_anim/bg_tm_hm.gbapal"); static const u32 sBg_Gfx[] = INCBIN_U32("graphics/pokemon_special_anim/bg.4bpp.lz"); static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/pokemon_special_anim/bg.bin.lz"); static const u16 sLevelUp_Pal[] = INCBIN_U16("graphics/pokemon_special_anim/level_up.gbapal"); static const u32 sLevelUp_Gfx[] = INCBIN_U32("graphics/pokemon_special_anim/level_up.4bpp.lz"); static const u16 sStar_Pal[] = INCBIN_U16("graphics/pokemon_special_anim/star.gbapal"); static const u32 sStar_Gfx[] = INCBIN_U32("graphics/pokemon_special_anim/star.4bpp.lz"); static const u16 sOutwardSpiralDots_Pal[] = INCBIN_U16("graphics/pokemon_special_anim/outward_spiral_dots.gbapal"); static const u32 sOutwardSpiralDots_Gfx[] = INCBIN_U32("graphics/pokemon_special_anim/outward_spiral_dots.4bpp.lz"); static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x001 }, { .bg = 3, .charBaseIndex = 3, .mapBaseIndex = 28, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 } }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 1, .tilemapTop = 15, .width = 28, .height = 4, .paletteNum = 15, .baseBlock = 0x00a }, DUMMY_WIN_TEMPLATE }; static const u8 *const s1_2_and_Poof_textPtrs[] = { gText_Counting_1, gText_Counting_2And, gText_Poof, }; static const u16 sUnusedArray[] = { 0, 16, 68 }; static const u16 sAffineScales[] = { 0x100, 0x155, 0x1AA, 0x200 }; static const s8 sStarCoordOffsets[][2] = { {-8, -8}, { 6, -13}, { 8, -8} }; static const struct CompressedSpriteSheet sSpriteSheet_Star = { sStar_Gfx, 0x80, 2 }; static const struct SpritePalette sSpritePalette_Star = { sStar_Pal, 2 }; static const struct CompressedSpriteSheet sSpriteSheet_UseItem_OutwardSpiralDots = { sOutwardSpiralDots_Gfx, 0x60, 5 }; static const struct SpritePalette sSpritePalette_UseItem_OutwardSpiralDots = { sOutwardSpiralDots_Pal, 5 }; static const struct OamData sOamData_MonSprite = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AffineAnimCmd sAffineAnim_Zoom_0[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Zoom_1[] = { AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Zoom_2[] = { AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Zoom_3[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnimTable_Zoom[] = { sAffineAnim_Zoom_0, sAffineAnim_Zoom_1, sAffineAnim_Zoom_2, sAffineAnim_Zoom_3 }; static const struct SpriteTemplate sSpriteTemplate_MonSprite = { .tileTag = 0, .paletteTag = 0, .oam = &sOamData_MonSprite, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnimTable_Zoom, .callback = SpriteCallbackDummy }; static const union AffineAnimCmd sAffineAnim_ItemZoom_0[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-28, -28, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ItemZoom_1[] = { AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0), AFFINEANIMCMD_FRAME(-37, -37, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ItemZoom_2[] = { AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0), AFFINEANIMCMD_FRAME(-47, -47, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ItemZoom_3[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_FRAME(-56, -56, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnimTable_ItemZoom[] = { sAffineAnim_ItemZoom_0, sAffineAnim_ItemZoom_1, sAffineAnim_ItemZoom_2, sAffineAnim_ItemZoom_3 }; static const struct OamData sOamData_LevelUpVertical = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x16), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const union AnimCmd sAnim_LevelUpVertical[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_END }; static const union AnimCmd *const sAnimTable_LevelUpVertical[] = { sAnim_LevelUpVertical }; static const struct SpriteTemplate sSpriteTemplate_LevelUpVertical = { .tileTag = 0, .paletteTag = 0, .oam = &sOamData_LevelUpVertical, .anims = sAnimTable_LevelUpVertical, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_LevelUpVertical }; static const struct OamData sOamData_Star = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; static const struct SpriteTemplate sSpriteTemplate_Star = { .tileTag = 2, .paletteTag = 2, .oam = &sOamData_Star, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Star }; static const struct OamData sOamData_UseItem_OutwardSpiralDots = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0x000, .priority = 0, .paletteNum = 0 }; static const union AnimCmd sAnim_UseItem_OutwardSpiralDots_0[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 4), ANIMCMD_END }; static const union AnimCmd sAnim_UseItem_OutwardSpiralDots_1[] = { ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END }; static const union AnimCmd *const sAnimTable_UseItem_OutwardSpiralDots[] = { sAnim_UseItem_OutwardSpiralDots_0, sAnim_UseItem_OutwardSpiralDots_1 }; static const struct SpriteTemplate sSpriteTemplate_UseItem_OutwardSpiralDots = { .tileTag = 5, .paletteTag = 5, .oam = &sOamData_UseItem_OutwardSpiralDots, .anims = sAnimTable_UseItem_OutwardSpiralDots, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallback_UseItem_OutwardSpiralDots }; void InitPokemonSpecialAnimScene(struct PokemonSpecialAnimScene * buffer, u16 animType) { FreeAllWindowBuffers(); ResetTempTileDataBuffers(); SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); InitWindows(sWindowTemplates); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); SetBgTilemapBuffer(0, buffer->field_0914); SetBgTilemapBuffer(3, buffer->field_1914); RequestDma3Fill(0, (void *)BG_VRAM, 0x20, DMA3_32BIT); FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 32, 32); LoadBgGfxByAnimType(animType); FillWindowPixelBuffer(0, PIXEL_FILL(0)); LoadUserWindowGfx(0, 0x000, BG_PLTT_ID(14)); CopyWindowToVram(0, COPYWIN_FULL); ShowBg(0); ShowBg(3); HideBg(1); HideBg(2); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); } bool8 PokemonSpecialAnimSceneInitIsNotFinished(void) { if (!FreeTempTileDataBuffersIfPossible()) return IsDma3ManagerBusyWithBgCopy(); else return TRUE; } void PSA_FreeWindowBuffers(void) { FreeAllWindowBuffers(); } void PSA_ShowMessageWindow(void) { PutWindowTilemap(0); FillWindowPixelBuffer(0, PIXEL_FILL(1)); DrawTextBorderOuter(0, 0x001, 14); CopyWindowToVram(0, COPYWIN_FULL); } void PSA_HideMessageWindow(void) { ClearWindowTilemap(0); ClearStdWindowAndFrameToTransparent(0, FALSE); CopyWindowToVram(0, COPYWIN_MAP); } void PSA_PrintMessage(u8 messageId) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); u16 itemId = PSA_GetItemId(); u16 strWidth = 0; u8 textSpeed = GetTextSpeedSetting(); struct Pokemon * pokemon = PSA_GetPokemon(); u16 level; u8 *str; switch (messageId) { case 0: // Item was used on Mon str = StringCopy(scene->textBuf, ItemId_GetName(itemId)); str = StringCopy(str, gText_WasUsedOn); GetMonData(pokemon, MON_DATA_NICKNAME, str); StringAppend(scene->textBuf, gText_Period); break; case 1: // Mon's level was elevated to level level = GetMonData(pokemon, MON_DATA_LEVEL); GetMonData(pokemon, MON_DATA_NICKNAME, scene->textBuf); str = StringAppend(scene->textBuf, gText_LevelRoseTo); if (level < MAX_LEVEL) level++; str = ConvertIntToDecimalStringN(str, level, STR_CONV_MODE_LEFT_ALIGN, level < MAX_LEVEL ? 2 : 3); StringAppend(str, gText_Period2); break; case 9: // Mon learned move DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, PSA_GetMonNickname()); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, PSA_GetNameOfMoveToTeach()); DynamicPlaceholderTextUtil_ExpandPlaceholders(scene->textBuf, gText_MonLearnedTMHM); break; case 4: strWidth += GetStringWidth(FONT_NORMAL, gText_Counting_2And, -1); // fallthrough case 3: strWidth += GetStringWidth(FONT_NORMAL, gText_Counting_1, -1); // fallthrough case 2: // 1 StringCopy(scene->textBuf, s1_2_and_Poof_textPtrs[messageId - 2]); textSpeed = 1; break; case 5: DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, PSA_GetMonNickname()); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, PSA_GetNameOfMoveForgotten()); DynamicPlaceholderTextUtil_ExpandPlaceholders(scene->textBuf, gText_MonForgotMove); break; case 6: StringCopy(scene->textBuf, gText_And); break; case 7: StringCopy(scene->textBuf, gText_MachineSet); break; case 8: StringCopy(scene->textBuf, gText_Huh); break; default: return; } AddTextPrinterParameterized5(0, FONT_NORMAL, scene->textBuf, strWidth, 0, textSpeed, NULL, 0, 4); } void PSA_AfterPoof_ClearMessageWindow(void) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); CopyWindowToVram(0, COPYWIN_GFX); } bool8 PSA_IsMessagePrintTaskActive(void) { return IsTextPrinterActive(0); } void PSA_DarkenMonSprite(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); scene->state = 0; BlendPalettes((0x10000 << IndexOfSpritePaletteTag(0)) | 4, 16, RGB_BLACK); CreateStarSprites(scene); } bool8 PSA_RunPoofAnim(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); switch (scene->state) { case 0: if (!AnyStarSpritesActive()) { BeginNormalPaletteFade((0x10000 << IndexOfSpritePaletteTag(0)) | 4, -1, 16, 0, RGB_BLACK); scene->state++; } break; case 1: if (!gPaletteFade.active) return FALSE; break; } return TRUE; } void PSA_UseTM_SetUpZoomOutAnim(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); scene->state = 0; } void PSA_UseTM_CleanUpForCancel(void) { StopMakingOutwardSpiralDots(); ResetPaletteFadeControl(); } bool8 PSA_UseTM_RunZoomOutAnim(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); switch (scene->state) { case 0: StartZoomOutAnimForUseTM(0); scene->state++; break; case 1: if (!PSA_IsZoomTaskActive()) { scene->field_0004 = 0; scene->state++; } break; case 2: scene->field_0004++; if (scene->field_0004 > 20) scene->state++; break; case 3: StartMonWiggleAnim(scene, 1, 0, 1); scene->field_0004 = 0; scene->state++; break; case 4: scene->field_0004++; if (scene->field_0004 > 0) { scene->field_0004 = 0; PlaySE(SE_M_MEGA_KICK); BeginNormalPaletteFade(0x00000001, 2, 0, 12, RGB(8, 13, 31)); PSAScene_SeedRandomInTask(scene); scene->state++; } break; case 5: scene->field_0004++; if (scene->field_0004 > 70) { StopMonWiggleAnim(scene); BeginNormalPaletteFade(0x00000001, 6, 12, 0, RGB(8, 13, 31)); scene->field_0004 = 0; scene->state++; } break; case 6: scene->field_0004++; if (!IsOutwardSpiralDotsTaskRunning() && scene->field_0004 > 40) { scene->field_0004 = 0; scene->state++; } break; case 7: scene->field_0004++; if (scene->field_0004 > 20) { scene->state++; } break; case 8: PlaySE(SE_EXP_MAX); DestroySprite(scene->itemIconSprite); scene->state++; break; default: return FALSE; } return TRUE; } void PSA_UseTM_SetUpMachineSetWobble(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); scene->state = 0; } bool8 PSA_UseTM_RunMachineSetWobble(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); switch (scene->state) { case 0: MachineSetWobbleInit(); PlaySE(SE_SWITCH); scene->state++; break; case 1: return MachineSetWobbleCBIsRunning(); } return TRUE; } // There may once have been plans to put the battle level up // anim in with using Rare Candy, but they were scrapped // at a later stage of development // Unused void PSA_CreateLevelUpVerticalSpritesTask(void) { CreateLevelUpVerticalSpritesTask(120, 56, 4, 4, 2, 0); } bool8 PSA_LevelUpVerticalSpritesTaskIsRunning(void) { return LevelUpVerticalSpritesTaskIsRunning(); } // Unused void PSA_DrawLevelUpWindowPg1(u16 *statsBefore, u16 *statsAfter) { DrawTextBorderOuter(1, 0x001, 14); DrawLevelUpWindowPg1(1, statsBefore, statsAfter, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_FULL); } // Unused void PSA_DrawLevelUpWindowPg2(u16 *currStats) { DrawLevelUpWindowPg2(1, currStats, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(1, COPYWIN_GFX); } // Unused bool8 PSA_IsCopyingLevelUpWindowToVram(void) { return IsDma3ManagerBusyWithBgCopy(); } static void LoadBgGfxByAnimType(u16 animType) { CopyToBgTilemapBuffer(3, sBg_Tilemap, 0, 0x000); DecompressAndCopyTileDataToVram(3, sBg_Gfx, 0, 0x000, 0); if (animType != 4) LoadPalette(sBg_Pal, BG_PLTT_ID(0), sizeof(sBg_Pal)); else LoadPalette(sBg_TmHm_Pal, BG_PLTT_ID(0), sizeof(sBg_TmHm_Pal)); } void PSA_CreateMonSpriteAtCloseness(u8 closeness) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); struct Pokemon * pokemon = PSA_GetPokemon(); u16 species = GetMonData(pokemon, MON_DATA_SPECIES); u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY); u8 r1 = Menu2_GetMonSpriteAnchorCoord(species, personality, 2); void *r6; void *r9; void *r4; u8 spriteId; if(species == SPECIES_DEOXYS) { switch(GetMonData(pokemon, MON_DATA_FORME)) { case 1: //Attack Forme species = 65531; break; case 2: //Defense Forme species = 65532; break; case 3: //Speed Forme species = 65533; break; default: //Normal Forme species = 65530; break; } } if (r1 != 0xFF) { scene->monSpriteY1 = 0x48; scene->monSpriteY2 = r1 + 0x30; } else { scene->monSpriteY1 = 0x48; scene->monSpriteY2 = 0x60; } r6 = Alloc(0x2000); r9 = Alloc(0x2000); r4 = Alloc(0x100); if (r6 != NULL && r9 != NULL && r4 != NULL) { HandleLoadSpecialPokePic(&gMonFrontPicTable[species], r6, species, personality); LZ77UnCompWram(GetMonFrontSpritePal(pokemon), r4); LoadMonSpriteGraphics(r6, r4); spriteId = CreateSprite(&sSpriteTemplate_MonSprite, 120, scene->monSpriteY1, 4); if (spriteId != MAX_SPRITES) { scene->monSprite = &gSprites[spriteId]; MonSpriteZoom_UpdateYPos(scene->monSprite, closeness); } else scene->monSprite = NULL; scene->lastCloseness = closeness; } if (r6 != NULL) Free(r6); if (r9 != NULL) Free(r9); if (r4 != NULL) Free(r4); } #define tState data[0] #define tCurrCloseness data[1] #define tFinalCloseness data[2] #define tDeltaCloseness data[3] #define tTimer data[4] #define tDelay data[5] #define tOff_MonSprite 6 #define tHasItemSprite data[8] #define tOff_ItemSprite 9 void PSA_SetUpZoomAnim(u8 closeness) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); u8 taskId; if (closeness != scene->lastCloseness) { taskId = CreateTask(Task_ZoomAnim, 4); SetWordTaskArg(taskId, tOff_MonSprite, (uintptr_t)scene->monSprite); gTasks[taskId].tCurrCloseness = scene->lastCloseness; gTasks[taskId].tFinalCloseness = closeness; gTasks[taskId].tDelay = 6; if (closeness > scene->lastCloseness) gTasks[taskId].tDeltaCloseness = 1; else gTasks[taskId].tDeltaCloseness = -1; } } bool8 PSA_IsZoomTaskActive(void) { return FuncIsActiveTask(Task_ZoomAnim); } static void Task_ZoomAnim(u8 taskId) { s16 *data = gTasks[taskId].data; struct Sprite *sprite = (void *)GetWordTaskArg(taskId, tOff_MonSprite); switch (tState) { case 0: SetSpriteWithCloseness(sprite, tCurrCloseness); if (tHasItemSprite) SetSpriteWithCloseness((void *)GetWordTaskArg(taskId, tOff_ItemSprite), tCurrCloseness); tCurrCloseness += tDeltaCloseness; tState++; break; case 1: if (!IsZoomSpriteCBActive(sprite)) { PlaySE(SE_BALL_TRAY_EXIT); MonSpriteZoom_UpdateYPos(sprite, tCurrCloseness); if (tHasItemSprite) ItemSpriteZoom_UpdateYPos((void *)GetWordTaskArg(taskId, tOff_ItemSprite), tCurrCloseness); if (tCurrCloseness == tFinalCloseness) { PSA_GetSceneWork()->lastCloseness = tFinalCloseness; DestroyTask(taskId); } else { tTimer = 0; tState = 2; } } break; case 2: tTimer++; if (tTimer > tDelay) tState = 0; break; } } static void SetSpriteWithCloseness(struct Sprite *sprite, u8 closeness) { sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = closeness; } static bool8 IsZoomSpriteCBActive(struct Sprite *sprite) { return sprite->callback != SpriteCallbackDummy; } static s16 GetSpriteOffsetByScale(s16 pos, u8 closeness) { return (pos * sAffineScales[closeness]) >> 8; } // FIXME: better math static u16 GetYPosByScale(u16 pos) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); s32 v = ((((((scene->monSpriteY2 - scene->monSpriteY1) << 16) >> 8) / 256 * (pos - 256)) << 8) >> 16); return v += scene->monSpriteY1; } static void MonSpriteZoom_UpdateYPos(struct Sprite *sprite, u8 closeness) { if (closeness > 3) closeness = 3; PSA_GetSceneWork(); // return value not used StartSpriteAffineAnim(sprite, closeness); sprite->y = GetYPosByScale(sAffineScales[closeness]); } static void ItemSpriteZoom_UpdateYPos(struct Sprite *sprite, u8 closeness) { MonSpriteZoom_UpdateYPos(sprite, closeness); sprite->x2 = GetSpriteOffsetByScale(sprite->data[6] - 32, closeness); sprite->y2 = GetSpriteOffsetByScale(sprite->data[7] - 32, closeness); } static void StartMonWiggleAnim(struct PokemonSpecialAnimScene * scene, u8 frameLen, u8 niter, u8 amplitude) { // frameLen: frame duration // niter = 0: iterate ad infinitum scene->monSprite->data[0] = frameLen; scene->monSprite->data[1] = niter; scene->monSprite->data[2] = amplitude; scene->monSprite->callback = SpriteCallback_MonSpriteWiggle; } static void StopMonWiggleAnim(struct PokemonSpecialAnimScene * scene) { scene->monSprite->x2 = 0; scene->monSprite->callback = SpriteCallbackDummy; } static void SpriteCallback_MonSpriteWiggle(struct Sprite *sprite) { sprite->data[7]++; if (sprite->data[7] > sprite->data[0]) { sprite->data[7] = 0; sprite->data[6]++; if (sprite->data[1] != 0 && sprite->data[6] >= sprite->data[1]) { sprite->x2 = 0; sprite->callback = SpriteCallbackDummy; } else if (sprite->data[6] & 1) sprite->x2 = sprite->data[2]; else sprite->x2 = -sprite->data[2]; } } static void LoadMonSpriteGraphics(u16 *tiles, u16 *palette) { struct SpriteSheet spriteSheet; struct SpritePalette spritePalette; spriteSheet.data = tiles; spriteSheet.size = 0x800; spriteSheet.tag = 0; spritePalette.data = palette; spritePalette.tag = 0; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); } #undef tOff_ItemSprite #undef tHasItemSprite #undef tOff_MonSprite #undef tDelay #undef tTimer #undef tDeltaCloseness #undef tFinalCloseness #undef tCurrCloseness #undef tState #define tState data[0] #define tTimer data[1] #define tCloseness data[2] #define tYpos data[3] #define tOff_ItemSprite 4 #define tData6 data[6] #define tData7 data[7] #define tActiveSprCt data[8] #define tBlendColor data[9] #define tTimerReset data[10] #define tSuppressDots data[11] void PSA_SetUpItemUseOnMonAnim(u16 itemId, u8 closeness, bool32 a2) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); u8 taskId; scene->itemIconSprite = PSA_CreateItemIconObject(itemId); if (scene->itemIconSprite != NULL) { InitItemIconSpriteState(scene, scene->itemIconSprite, closeness); StartSpriteAffineAnim(scene->itemIconSprite, closeness); scene->itemIconSprite->invisible = TRUE; taskId = CreateTask(Task_ItemUseOnMonAnim, 2); SetWordTaskArg(taskId, tOff_ItemSprite, (uintptr_t)scene->itemIconSprite); gTasks[taskId].tCloseness = closeness; gTasks[taskId].tYpos = GetYPosByScale(sAffineScales[closeness]); gTasks[taskId].tData6 = a2; gTasks[taskId].tBlendColor = GetBlendColorByItemId(itemId); } } static u16 GetBlendColorByItemId(u16 itemId) { return RGB_WHITE; } void CreateItemIconSpriteAtMaxCloseness(u16 itemId) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); scene->itemIconSprite = PSA_CreateItemIconObject(itemId); if (scene->itemIconSprite != NULL) { StartSpriteAffineAnim(scene->itemIconSprite, 3); InitItemIconSpriteState(scene, scene->itemIconSprite, 3); } } static struct Sprite *PSA_CreateItemIconObject(u16 itemId) { u8 spriteId; struct Sprite *sprite; spriteId = AddItemIconObject(1, 1, itemId); if (spriteId == MAX_SPRITES) return NULL; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; gSprites[spriteId].oam.priority = 1; gSprites[spriteId].subpriority = 1; gSprites[spriteId].affineAnims = sAffineAnimTable_Zoom; gSprites[spriteId].callback = SpriteCallbackDummy; InitSpriteAffineAnim(&gSprites[spriteId]); return &gSprites[spriteId]; } bool8 PSA_IsItemUseOnMonAnimActive(void) { return FuncIsActiveTask(Task_ItemUseOnMonAnim); } static void Task_ItemUseOnMonAnim(u8 taskId) { s16 *data = gTasks[taskId].data; struct Sprite *sprite = (void *)GetWordTaskArg(taskId, tOff_ItemSprite); switch (tState) { case 0: tTimer++; if (tTimer > 20) { tTimer = 0; PlaySE(SE_M_SWAGGER2); sprite->invisible = FALSE; if (!tSuppressDots) LoadOutwardSpiralDotsGfx(); tState = 1; } break; case 1: tTimer++; if (tTimer > 30) { tTimer = 0; sprite->affineAnims = sAffineAnimTable_ItemZoom; StartSpriteAffineAnim(sprite, tCloseness); BeginNormalPaletteFade(0x10000 << IndexOfSpritePaletteTag(1), -2, 0, 12, tBlendColor); tState = 2; PlaySE(SE_M_MILK_DRINK); } break; case 2: if (sprite->affineAnimEnded) { sprite->invisible = TRUE; tTimerReset = 20; tState = 3; } break; case 3: tTimer++; if (tTimer > tTimerReset) { tTimer = 0; if (!tSuppressDots) CreateSprites_UseItem_OutwardSpiralDots(taskId, data, sprite); if (tData7 == 0) PlaySE(SE_M_REVERSAL); tData7++; if (tData7 > 2) tState = 4; else tTimerReset = 8; } break; case 4: if (tActiveSprCt == 0) { if (tData6) DestroySprite(sprite); DestroyTask(taskId); } break; } } static void CreateSprites_UseItem_OutwardSpiralDots(u8 taskId, s16 *data, struct Sprite *sprite) { int x = sprite->x + sprite->x2 - 4; int y = sprite->y + sprite->y2 - 4; u8 spriteId; int i; BlendPalettes(0x10000 << IndexOfSpritePaletteTag(5), 16, tBlendColor); for (i = 0; i < 15; i++) { spriteId = CreateSprite(&sSpriteTemplate_UseItem_OutwardSpiralDots, x, y, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[1] = i << 4; gSprites[spriteId].data[7] = taskId; gSprites[spriteId].callback = SpriteCB_OutwardSpiralDots; StartSpriteAnim(&gSprites[spriteId], 1); tActiveSprCt++; } } } static void SpriteCB_OutwardSpiralDots(struct Sprite *sprite) { s16 *data = sprite->data; if (data[0] < 16) { data[0]++; data[1] += 7; data[1] &= 0xFF; data[2] += 4; sprite->x2 = (data[2] * gSineTable[data[1] + 0x40]) >> 8; sprite->y2 = (data[2] * gSineTable[data[1]]) >> 8; } else { gTasks[data[7]].tActiveSprCt--; DestroySprite(sprite); } } void PSA_UseItem_CleanUpForCancel(void) { u8 taskId = FindTaskIdByFunc(Task_ItemUseOnMonAnim); if (taskId != 0xFF) { gTasks[taskId].tSuppressDots = TRUE; } } static void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, struct Sprite *sprite, u8 closeness) { u16 species, x, y; u32 personality; if (closeness == 3) { sprite->x = 120; sprite->y = scene->monSpriteY2; } else { sprite->x = 120; sprite->y = scene->monSpriteY1; } sprite->x += 4; sprite->y += 4; species = PSA_GetMonSpecies(); personality = PSA_GetMonPersonality(); switch (PSA_GetAnimType()) { case 4: { x = Menu2_GetMonSpriteAnchorCoord(species, personality, 0); y = Menu2_GetMonSpriteAnchorCoord(species, personality, 1); if (x == 0xFF) x = 0; if (y == 0xFF) y = 0; sprite->data[6] = x; sprite->data[7] = y; break; } default: { x = Menu2_GetMonSpriteAnchorCoord(species, personality, 3); y = Menu2_GetMonSpriteAnchorCoord(species, personality, 4); if (x == 0xFF) x = 0; if (y == 0xFF) y = 0; sprite->data[6] = x; sprite->data[7] = y; break; } } ItemSpriteZoom_UpdateYPos(sprite, closeness); } #undef tSuppressDots #undef tTimerReset #undef tBlendColor #undef tActiveSprCt #undef tData7 #undef tData6 #undef tOff_ItemSprite #undef tYpos #undef tCloseness #undef tTimer #undef tState static void MachineSetWobbleInit(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); MachineSetWobble_SetCB(scene->monSprite); MachineSetWobble_SetCB(scene->itemIconSprite); } static void MachineSetWobble_SetCB(struct Sprite *sprite) { sprite->data[0] = 0; sprite->data[1] = 0; sprite->callback = SpriteCB_MachineSetWobble; } static bool8 MachineSetWobbleCBIsRunning(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); return scene->monSprite->callback != SpriteCallbackDummy; } static void SpriteCB_MachineSetWobble(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->x += 3; sprite->data[0]++; break; case 1: sprite->data[1]++; if (sprite->data[1] > 30) { sprite->x -= 3; sprite->callback = SpriteCallbackDummy; } break; } } // Redefined from above #define tState data[0] #define tCurrCloseness data[1] #define tFinalCloseness data[2] #define tDeltaCloseness data[3] #define tTimer data[4] #define tDelay data[5] #define tOff_MonSprite 6 #define tHasItemSprite data[8] #define tOff_ItemSprite 9 static void StartZoomOutAnimForUseTM(u8 closeness) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); u8 taskId; if (closeness != scene->lastCloseness) { taskId = CreateTask(Task_ZoomAnim, 1); SetWordTaskArg(taskId, tOff_MonSprite, (uintptr_t)scene->monSprite); SetWordTaskArg(taskId, tOff_ItemSprite, (uintptr_t)scene->itemIconSprite); gTasks[taskId].tCurrCloseness = scene->lastCloseness; gTasks[taskId].tFinalCloseness = closeness; gTasks[taskId].tHasItemSprite = 1; gTasks[taskId].tDelay = 6; if (closeness > scene->lastCloseness) gTasks[taskId].tDeltaCloseness = 1; else gTasks[taskId].tDeltaCloseness = -1; } } #undef tOff_ItemSprite #undef tHasItemSprite #undef tOff_MonSprite #undef tDelay #undef tTimer #undef tDeltaCloseness #undef tFinalCloseness #undef tCurrCloseness #undef tState static void CreateStarSprites(struct PokemonSpecialAnimScene * scene) { int i; u8 spriteId; u16 species; u32 personality; LoadCompressedSpriteSheet(&sSpriteSheet_Star); LoadSpritePalette(&sSpritePalette_Star); scene->field_0002 = 0; for (i = 0; i < 3; i++) { spriteId = CreateSprite(&sSpriteTemplate_Star, 120 + sStarCoordOffsets[i][0], scene->monSpriteY2 + sStarCoordOffsets[i][1], 2); if (spriteId != MAX_SPRITES) { species = PSA_GetMonSpecies(); personality = PSA_GetMonPersonality(); gSprites[spriteId].data[3] = sStarCoordOffsets[i][0] * 8; gSprites[spriteId].data[4] = sStarCoordOffsets[i][1] * 8; gSprites[spriteId].x += GetSpriteOffsetByScale(Menu2_GetMonSpriteAnchorCoordMinusx20(species, personality, 0), 3); gSprites[spriteId].y += GetSpriteOffsetByScale(Menu2_GetMonSpriteAnchorCoordMinusx20(species, personality, 1), 3); scene->field_0002++; } } } static u8 AnyStarSpritesActive(void) { return PSA_GetSceneWork()->field_0002; } static void SpriteCB_Star(struct Sprite *sprite) { sprite->data[0]++; if (sprite->data[0] < 10) { sprite->data[1] += sprite->data[3]; sprite->data[2] += sprite->data[4]; sprite->x2 = sprite->data[1] >> 4; sprite->y2 = sprite->data[2] >> 4; } else { PSA_GetSceneWork()->field_0002--; DestroySprite(sprite); } } // ======================================================== #define tState data[0] #define tTimer data[1] #define tActiveSprCt data[2] #define tOff_RngState 3 #define tAngle data[5] #define tMadeSprCt data[6] #define tsRadius data[0] #define tsSpeed data[1] #define tsXinit data[2] #define tsYinit data[3] #define tsXorig data[4] #define tsYorig data[5] #define tsTaskId data[6] static void PSAScene_SeedRandomInTask(struct PokemonSpecialAnimScene * scene) { u8 taskId; LoadOutwardSpiralDotsGfx(); taskId = CreateTask(Task_UseItem_OutwardSpiralDots, 1); SetWordTaskArg(taskId, tOff_RngState, 2022069025); gTasks[taskId].tAngle = 0xE0; } static void StopMakingOutwardSpiralDots(void) { u8 taskId = FindTaskIdByFunc(Task_UseItem_OutwardSpiralDots); if (taskId != 0xFF) gTasks[taskId].tState = 1; } static void Task_UseItem_OutwardSpiralDots(u8 taskId) { s16 *data = gTasks[taskId].data; switch (tState) { case 0: if (tTimer == 0) { u32 spriteId, x, y, x2, y2, ampl; struct Sprite *sprite = PSA_GetSceneWork()->itemIconSprite; x = sprite->x + sprite->x2; y = sprite->y + sprite->y2; ampl = (PSAScene_RandomFromTask(taskId) % 21) + 70; x2 = x + ((u32)(gSineTable[tAngle + 0x40] * ampl) >> 8); y2 = y + ((u32)(gSineTable[tAngle ] * ampl) >> 8); tAngle += 0x4C; tAngle &= 0xFF; spriteId = CreateSprite(&sSpriteTemplate_UseItem_OutwardSpiralDots, x2, y2, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].tsRadius = 0; gSprites[spriteId].tsSpeed = (PSAScene_RandomFromTask(taskId) & 1) + 6; gSprites[spriteId].tsXinit = x2; gSprites[spriteId].tsYinit = y2; gSprites[spriteId].tsXorig = x; gSprites[spriteId].tsYorig = y; gSprites[spriteId].tsTaskId = taskId; tActiveSprCt++; } tMadeSprCt++; if (tMadeSprCt > 47) tState++; } else tTimer--; break; case 1: if (tActiveSprCt == 0) DestroyTask(taskId); break; } } static u16 PSAScene_RandomFromTask(u8 taskId) { u32 state = GetWordTaskArg(taskId, tOff_RngState); state = ISO_RANDOMIZE1(state); SetWordTaskArg(taskId, tOff_RngState, state); return state >> 16; } static void SpriteCallback_UseItem_OutwardSpiralDots(struct Sprite *sprite) { int x; int y; sprite->tsRadius += sprite->tsSpeed; if (sprite->tsRadius > 255) { gTasks[sprite->tsTaskId].tActiveSprCt--; DestroySprite(sprite); } else { x = (sprite->tsXorig - sprite->tsXinit) * sprite->tsRadius; y = (sprite->tsYorig - sprite->tsYinit) * sprite->tsRadius; sprite->x = (x >> 8) + sprite->tsXinit; sprite->y = (y >> 8) + sprite->tsYinit; } } static void LoadOutwardSpiralDotsGfx(void) { LoadCompressedSpriteSheet(&sSpriteSheet_UseItem_OutwardSpiralDots); LoadSpritePalette(&sSpritePalette_UseItem_OutwardSpiralDots); } static bool32 IsOutwardSpiralDotsTaskRunning(void) { return FuncIsActiveTask(Task_UseItem_OutwardSpiralDots); } #undef tsTaskId #undef tsYorig #undef tsXorig #undef tsYinit #undef tsXinit #undef tsSpeed #undef tsRadius #undef tMadeSprCt #undef tAngle #undef tOff_RngState #undef tActiveSprCt #undef tTimer #undef tState // ======================================================== #define tState data[0] #define tActiveSprCt data[1] #define tMadeSprCt data[2] #define tTimer data[3] #define tXpos data[4] #define tYpos data[5] #define tTileTag data[6] #define tPaletteTag data[7] #define tPriority data[8] #define tSubpriority data[9] #define tsYsubpixel data[1] #define tsSpeed data[2] #define tsTaskId data[7] void CreateLevelUpVerticalSpritesTask(u16 x, u16 y, u16 tileTag, u16 paletteTag, u16 priority, u16 subpriority) { static struct CompressedSpriteSheet spriteSheet; static struct SpritePalette spritePalette; u8 taskId; spriteSheet.tag = tileTag; spriteSheet.data = sLevelUp_Gfx; spriteSheet.size = sLevelUp_Gfx[0] >> 8; spritePalette.data = sLevelUp_Pal; spritePalette.tag = paletteTag; LoadCompressedSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); taskId = CreateTask(Task_LevelUpVerticalSprites, 0); gTasks[taskId].tXpos = x - 32; gTasks[taskId].tYpos = y + 32; gTasks[taskId].tTileTag = tileTag; gTasks[taskId].tPaletteTag = paletteTag; gTasks[taskId].tPriority = priority; gTasks[taskId].tSubpriority = subpriority; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_NONE | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 6)); } bool8 LevelUpVerticalSpritesTaskIsRunning(void) { return FuncIsActiveTask(Task_LevelUpVerticalSprites); } static void Task_LevelUpVerticalSprites(u8 taskId) { s16 *data = gTasks[taskId].data; switch (tState) { case 0: if (tTimer == 0) { tTimer++; CreateLevelUpVerticalSprite(taskId, data); if (tMadeSprCt > 17) tState++; } else { tTimer++; if (tTimer == 2) tTimer = 0; } break; case 1: if (tActiveSprCt == 0) { FreeSpriteTilesByTag(tTileTag); FreeSpritePaletteByTag(tPaletteTag); DestroyTask(taskId); } break; } } static void CreateLevelUpVerticalSprite(u8 taskId, s16 *data) { u8 spriteId; struct SpriteTemplate template = sSpriteTemplate_LevelUpVertical; template.tileTag = tTileTag; template.paletteTag = tPaletteTag; tMadeSprCt++; spriteId = CreateSprite(&template, ((tMadeSprCt * 219) & 0x3F) + tXpos, tYpos, tSubpriority); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = tPriority; gSprites[spriteId].tsYsubpixel = 0; gSprites[spriteId].tsSpeed = (ISO_RANDOMIZE1(tMadeSprCt) & 0x3F) + 0x20; gSprites[spriteId].tsTaskId = taskId; tActiveSprCt++; } } static void SpriteCB_LevelUpVertical(struct Sprite *sprite) { sprite->tsYsubpixel -= sprite->tsSpeed; sprite->y2 = sprite->tsYsubpixel >> 4; if (sprite->y2 < -0x40) { gTasks[sprite->tsTaskId].tActiveSprCt--; DestroySprite(sprite); } } #undef tsTaskId #undef tsSpeed #undef tsYsubpixel #undef tSubpriority #undef tPriority #undef tPaletteTag #undef tTileTag #undef tYpos #undef tXpos #undef tTimer #undef tMadeSprCt #undef tActiveSprCt #undef tState // ======================================================== static const u8 *const sLevelUpWindowStatNames[] = { gText_LevelUp_MaxHP, gText_LevelUp_Attack, gText_LevelUp_Defense, gText_LevelUp_SpAtk, gText_LevelUp_SpDef, gText_LevelUp_Speed }; void DrawLevelUpWindowPg1(u16 windowId, u16 *beforeStats, u16 *afterStats, u8 bgColor, u8 fgColor, u8 shadowColor) { s16 diffStats[6]; u8 textbuf[12]; u8 textColor[3]; u32 i; u8 x; FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor)); diffStats[0] = afterStats[0] - beforeStats[0]; diffStats[1] = afterStats[1] - beforeStats[1]; diffStats[2] = afterStats[2] - beforeStats[2]; diffStats[3] = afterStats[4] - beforeStats[4]; diffStats[4] = afterStats[5] - beforeStats[5]; diffStats[5] = afterStats[3] - beforeStats[3]; textColor[0] = bgColor; textColor[1] = fgColor; textColor[2] = shadowColor; for (i = 0; i < 6; i++) { AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0, i * 15, textColor, TEXT_SKIP_DRAW, sLevelUpWindowStatNames[i]); StringCopy(textbuf, diffStats[i] >= 0 ? gText_LevelUp_Plus : gText_LevelUp_Minus); AddTextPrinterParameterized3(windowId, FONT_NORMAL, 56, i * 15, textColor, TEXT_SKIP_DRAW, textbuf); textbuf[0] = CHAR_SPACE; x = abs(diffStats[i]) < 10 ? 12 : 6; ConvertIntToDecimalStringN(textbuf + 1, abs(diffStats[i]), STR_CONV_MODE_LEFT_ALIGN, 2); AddTextPrinterParameterized3(windowId, FONT_NORMAL, x + 56, i * 15, textColor, TEXT_SKIP_DRAW, textbuf); } } void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgColor, u8 fgColor, u8 shadowColor) { s16 statsRearrange[6]; u8 textbuf[12]; u8 textColor[3]; u32 i; u8 ndigits; u16 x; FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor)); statsRearrange[0] = currStats[0]; statsRearrange[1] = currStats[1]; statsRearrange[2] = currStats[2]; statsRearrange[3] = currStats[4]; statsRearrange[4] = currStats[5]; statsRearrange[5] = currStats[3]; textColor[0] = bgColor; textColor[1] = fgColor; textColor[2] = shadowColor; for (i = 0; i < 6; i++) { if (statsRearrange[i] >= 100) ndigits = 3; else if (statsRearrange[i] >= 10) ndigits = 2; else ndigits = 1; ConvertIntToDecimalStringN(textbuf, statsRearrange[i], STR_CONV_MODE_LEFT_ALIGN, ndigits); x = 6 * (4 - ndigits); AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0, i * 15, textColor, TEXT_SKIP_DRAW, sLevelUpWindowStatNames[i]); AddTextPrinterParameterized3(windowId, FONT_NORMAL, 56 + x, i * 15, textColor, TEXT_SKIP_DRAW, textbuf); } } ================================================ FILE: src/pokemon_storage_system.c ================================================ #include "global.h" #include "gflib.h" #include "pokemon_storage_system_internal.h" void BackupPokemonStorage(struct PokemonStorage * dest) { *dest = *gPokemonStoragePtr; } void RestorePokemonStorage(struct PokemonStorage * src) { *gPokemonStoragePtr = *src; } // Functions here are general utility functions. u8 StorageGetCurrentBox(void) { return gPokemonStoragePtr->currentBox; } void SetCurrentBox(u8 boxId) { if (boxId < TOTAL_BOXES_COUNT) gPokemonStoragePtr->currentBox = boxId; } u32 GetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request); else return 0; } void SetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, const void *value) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, value); } u32 GetCurrentBoxMonData(u8 boxPosition, s32 request) { return GetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request); } void SetCurrentBoxMonData(u8 boxPosition, s32 request, const void *value) { SetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request, value); } void GetBoxMonNickAt(u8 boxId, u8 boxPosition, u8 *dst) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, dst); else *dst = EOS; } void SetBoxMonNickAt(u8 boxId, u8 boxPosition, const u8 *nick) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, nick); } u32 GetAndCopyBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, void *dst) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, dst); else return 0; } void SetBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon * src) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) gPokemonStoragePtr->boxes[boxId][boxPosition] = *src; } void CopyBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon * dst) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) *dst = gPokemonStoragePtr->boxes[boxId][boxPosition]; } void CreateBoxMonAt(u8 boxId, u8 boxPosition, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 personality, u8 otIDType, u32 otID) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) { CreateBoxMon(&gPokemonStoragePtr->boxes[boxId][boxPosition], species, level, fixedIV, hasFixedPersonality, personality, otIDType, otID); } } void ZeroBoxMonAt(u8 boxId, u8 boxPosition) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) ZeroBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition]); } void BoxMonAtToMon(u8 boxId, u8 boxPosition, struct Pokemon * dst) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) { BoxMonToMon(&gPokemonStoragePtr->boxes[boxId][boxPosition], dst); PopulateBoxHpAndStatusToPartyMon(dst); } } struct BoxPokemon * GetBoxedMonPtr(u8 boxId, u8 boxPosition) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) return &gPokemonStoragePtr->boxes[boxId][boxPosition]; else return NULL; } u8 *GetBoxNamePtr(u8 boxId) { if (boxId < TOTAL_BOXES_COUNT) return gPokemonStoragePtr->boxNames[boxId]; else return NULL; } u8 GetBoxWallpaper(u8 boxId) { if (boxId < TOTAL_BOXES_COUNT) return gPokemonStoragePtr->boxWallpapers[boxId]; else return 0; } void SetBoxWallpaper(u8 boxId, u8 wallpaperId) { if (boxId < TOTAL_BOXES_COUNT && wallpaperId < WALLPAPER_COUNT) gPokemonStoragePtr->boxWallpapers[boxId] = wallpaperId; } s16 SeekToNextMonInBox(struct BoxPokemon * boxMons, s8 curIndex, u8 maxIndex, u8 flags) { // flags: // bit 0: Allow eggs // bit 1: Search backwards s32 i; s16 adder; if (flags == 0 || flags == 1) adder = 1; else adder = -1; if (flags == 1 || flags == 3) { for (i = curIndex + adder; i >= 0 && i <= maxIndex; i += adder) { if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE) return i; } } else { for (i = curIndex + adder; i >= 0 && i <= maxIndex; i += adder) { if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetBoxMonData(&boxMons[i], MON_DATA_IS_EGG)) return i; } } return -1; } ================================================ FILE: src/pokemon_storage_system_data.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "item.h" #include "mail_data.h" #include "menu.h" #include "new_menu_helpers.h" #include "party_menu.h" #include "pokemon_storage_system_internal.h" #include "pokemon_summary_screen.h" #include "strings.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/party_menu.h" static EWRAM_DATA struct Pokemon sMonBeingCarried = {}; static EWRAM_DATA s8 sCursorArea = 0; static EWRAM_DATA s8 sCursorPosition = 0; static EWRAM_DATA bool8 sIsMonBeingMoved = FALSE; static EWRAM_DATA u8 sMovingMonOrigBoxId = 0; static EWRAM_DATA u8 sMovingMonOrigBoxPos = 0; static EWRAM_DATA bool8 sInMultiMoveMode = FALSE; static EWRAM_DATA u8 sSavedCursorPosition = 0; static void DoCursorNewPosUpdate(void); static bool8 MonPlaceChange_Grab(void); static bool8 MonPlaceChange_Place(void); static bool8 MonPlaceChange_Shift(void); static bool8 MonPlaceChange_DoMoveCursorDown(void); static bool8 MonPlaceChange_DoMoveCursorUp(void); static bool8 MonPlaceChange_MoveCursorDown(void); static bool8 MonPlaceChange_MoveCursorUp(void); static void MoveMon(void); static void PlaceMon(void); static void SetMovedMonData(u8 boxId, u8 cursorPos); static void SetPlacedMonData(u8 boxId, u8 cursorPos); static void PurgeMonOrBoxMon(u8 boxId, u8 cursorPos); static void SetShiftedMonData(u8 boxId, u8 cursorPos); static void TrySetDisplayMonData(void); static void SetDisplayMonData(void *pokemon, u8 mode); static void ReshowDisplayMon(void); static u8 HandleInput_InBox_Normal(void); static u8 HandleInput_InBox_GrabbingMultiple(void); static u8 HandleInput_InBox_MovingMultiple(void); static void AddBoxMenu(void); static bool8 SetSelectionMenuTexts(void); static bool8 SetMenuTextsForMon(void); static bool8 SetMenuTextsForItem(void); static void CreateCursorSprites(void); static void ToggleCursorMultiMoveMode(void); static const u16 sPokeStorageMisc1Pal[] = INCBIN_U16("graphics/pokemon_storage/misc1.gbapal"); static const u16 sHandCursorTiles[] = INCBIN_U16("graphics/pokemon_storage/cursor.4bpp"); static const u16 sHandCursorShadowTiles[] = INCBIN_U16("graphics/pokemon_storage/cursor_shadow.4bpp"); // Modes for selecting and moving Pokémon in the box. Multiple Pokémon can be // selected by pressing the Select button to change the cursor, then holding // down the A button while moving the cursor around. This is // MOVE_MODE_MULTIPLE_SELECTING. After releasing the A button, those Pokémon // will be picked up and can be moved around as a single unit. This is // MOVE_MODE_MULTIPLE_MOVING. enum { MOVE_MODE_NORMAL, MOVE_MODE_MULTIPLE_SELECTING, MOVE_MODE_MULTIPLE_MOVING, }; extern void CopyBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon * dst); void StoreHPAndStatusInBoxMon(struct Pokemon *mon) { u16 currentHP; u32 statusField; u8 actualStatus; u8 boxStatusCondition = 0; currentHP = GetMonData(mon, MON_DATA_HP); if(gSaveBlock1Ptr->keyFlags.noPMC == 1) { //save status and HP to boxmon if noPMC actualStatus = GetMonAilment(mon); statusField = GetMonData(mon, MON_DATA_STATUS); switch(actualStatus) { case AILMENT_SLP: boxStatusCondition = statusField & STATUS1_SLEEP; //0b0XXX where X is the sleep turns break; case AILMENT_PSN: boxStatusCondition = 8; //0b1000 break; case AILMENT_BRN: boxStatusCondition = 9; //0b1001 break; case AILMENT_FRZ: boxStatusCondition = 10; //0b1010 break; case AILMENT_PRZ: boxStatusCondition = 11; //0b1011 break; case AILMENT_FNT: boxStatusCondition = 0; //No status condition; fainted break; } currentHP = GetMonData(mon, MON_DATA_HP); if(currentHP > 714) { currentHP = 714; //Highest legal HP value } SetMonData(mon, MON_DATA_BOX_HP, ¤tHP); SetMonData(mon, MON_DATA_BOX_STATUS, &boxStatusCondition); } else if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { //keep fainted when deposited in Nuzlocke Mode if(currentHP == 0) { SetMonData(mon, MON_DATA_BOX_HP, ¤tHP); } else { if(currentHP > 714) { currentHP = 714; //Highest legal HP value } currentHP = GetMonData(mon, MON_DATA_MAX_HP); SetMonData(mon, MON_DATA_BOX_HP, ¤tHP); } boxStatusCondition = 0; SetMonData(mon, MON_DATA_BOX_STATUS, &boxStatusCondition); } else { //neither key active, store max HP and 0 status currentHP = GetMonData(mon, MON_DATA_MAX_HP); boxStatusCondition = 0; SetMonData(mon, MON_DATA_BOX_HP, ¤tHP); SetMonData(mon, MON_DATA_BOX_STATUS, &boxStatusCondition); } } void PopulateBoxHpAndStatusToPartyMon(struct Pokemon *mon) { u16 currentHP; u32 statusField; u8 boxStatus; currentHP = GetMonData(mon, MON_DATA_BOX_HP); boxStatus = GetMonData(mon, MON_DATA_BOX_STATUS); if(gSaveBlock1Ptr->keyFlags.noPMC == 1) { //PC no longer heals mons in noPMC currentHP = GetMonData(mon, MON_DATA_BOX_HP); SetMonData(mon, MON_DATA_HP, ¤tHP); statusField = 0; if(boxStatus < 8) //Sleep { statusField = boxStatus; //preserves sleep turns? } else { switch(boxStatus) { case 8: //PSN statusField = STATUS1_POISON; break; case 9: //BRN statusField = STATUS1_BURN; break; case 10: //FRZ statusField = STATUS1_FREEZE; break; case 11: //PRZ statusField = STATUS1_PARALYSIS; break; default: //FNT, none, or invalid statusField = 0; break; } } SetMonData(mon, MON_DATA_STATUS, &statusField); } else if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { //keep fainted when withdrawn in Nuzlocke Mode if(currentHP == 0) { SetMonData(mon, MON_DATA_HP, ¤tHP); } else { currentHP = GetMonData(mon, MON_DATA_MAX_HP); SetMonData(mon, MON_DATA_HP, ¤tHP); } statusField = 0; SetMonData(mon, MON_DATA_STATUS, &statusField); } else { //neither key active, populate max HP and 0 status currentHP = GetMonData(mon, MON_DATA_MAX_HP); statusField = 0; SetMonData(mon, MON_DATA_HP, ¤tHP); SetMonData(mon, MON_DATA_STATUS, &statusField); } } u16 GetFirstAliveBoxMon(void) { u32 i; u32 j; for (i = 0; i < TOTAL_BOXES_COUNT; i++) { for (j = 0; j < IN_BOX_COUNT; j++) { if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SPECIES) != SPECIES_NONE && !GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_IS_EGG)) { if(GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_BOX_HP) != 0) return (i * IN_BOX_COUNT) + j; } } } return IN_BOX_COUNT * TOTAL_BOXES_COUNT; // none found } void SwapFirstAliveBoxPokemon(void) { u16 position = GetFirstAliveBoxMon(); if (position != IN_BOX_COUNT * TOTAL_BOXES_COUNT) { struct BoxPokemon tempMon; u16 boxNum = position / IN_BOX_COUNT; u16 boxIndex = position - (boxNum * IN_BOX_COUNT); CopyBoxMonAt(boxNum, boxIndex, &tempMon); //backing up first alive box mon StoreHPAndStatusInBoxMon(&gPlayerParty[0]); //storing box info in party mon SetBoxMonAt(boxNum, boxIndex, &gPlayerParty[0].box); //copying first Pokemon to box ZeroMonData(&gPlayerParty[0]); //purging first party slot BoxMonToMon(&tempMon, &gPlayerParty[0]); //copying saved box mon to first spot in party PopulateBoxHpAndStatusToPartyMon(&gPlayerParty[0]); //getting box stuff to party stuff in saved box mon } } u16 GetDeoxysSpeciesFromForme(u32 forme) { switch(forme) { case 1: // Attack Forme return 65531; case 2: // Defense Forme return 65532; case 3: // Speed Forme return 65533; default: // Normal Forme return 65530; } } void InitCursor(void) { if (gStorage->boxOption != OPTION_DEPOSIT) sCursorArea = CURSOR_AREA_IN_BOX; else sCursorArea = CURSOR_AREA_IN_PARTY; sCursorPosition = 0; sIsMonBeingMoved = FALSE; sMovingMonOrigBoxId = 0; sMovingMonOrigBoxPos = 0; sInMultiMoveMode = FALSE; ClearSavedCursorPos(); CreateCursorSprites(); gStorage->cursorPrevPartyPos = 1; gStorage->inBoxMovingMode = MOVE_MODE_NORMAL; TrySetDisplayMonData(); } void InitCursorOnReopen(void) { CreateCursorSprites(); ReshowDisplayMon(); gStorage->cursorPrevPartyPos = 1; gStorage->inBoxMovingMode = MOVE_MODE_NORMAL; if (sIsMonBeingMoved) { gStorage->movingMon = sMonBeingCarried; CreateMovingMonIcon(); } } static void GetCursorCoordsByPos(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y) { switch (cursorArea) { case CURSOR_AREA_IN_BOX: *x = (cursorPosition % IN_BOX_COLUMNS) * 24 + 100; *y = (cursorPosition / IN_BOX_COLUMNS) * 24 + 32; break; case CURSOR_AREA_IN_PARTY: if (cursorPosition == 0) { *x = 104; *y = 52; } else if (cursorPosition == PARTY_SIZE) { *x = 152; *y = 132; } else { *x = 152; *y = (cursorPosition - 1) * 24 + 4; } break; case CURSOR_AREA_BOX_TITLE: *x = 162; *y = 12; break; case CURSOR_AREA_BUTTONS: *y = sIsMonBeingMoved ? 8 : 14; *x = cursorPosition * 88 + 120; break; case 4: *x = 160; *y = 96; break; } } static u16 GetSpeciesAtCursorPosition(void) { switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: return GetMonData(&gPlayerParty[sCursorPosition], MON_DATA_SPECIES); case CURSOR_AREA_IN_BOX: return GetCurrentBoxMonData(sCursorPosition, MON_DATA_SPECIES); default: return SPECIES_NONE; } } bool8 UpdateCursorPos(void) { s16 tmp; if (gStorage->cursorMoveSteps == 0) { if (gStorage->boxOption != OPTION_MOVE_ITEMS) return FALSE; else return IsItemIconAnimActive(); } else if (--gStorage->cursorMoveSteps != 0) { // Update position toward target gStorage->cursorNewX += gStorage->cursorSpeedX; gStorage->cursorNewY += gStorage->cursorSpeedY; gStorage->cursorSprite->x = gStorage->cursorNewX >> 8; gStorage->cursorSprite->y = gStorage->cursorNewY >> 8; // Limit cursor on right if (gStorage->cursorSprite->x > DISPLAY_WIDTH + 16) { tmp = gStorage->cursorSprite->x - (DISPLAY_WIDTH + 16); gStorage->cursorSprite->x = tmp + 64; } // Limit cursor on left if (gStorage->cursorSprite->x < 64) { tmp = 64 - gStorage->cursorSprite->x; gStorage->cursorSprite->x = DISPLAY_WIDTH + 16 - tmp; } // Limit cursor on bottom if (gStorage->cursorSprite->y > DISPLAY_HEIGHT + 16) { tmp = gStorage->cursorSprite->y - (DISPLAY_HEIGHT + 16); gStorage->cursorSprite->y = tmp - 16; } // Limit cursor on top if (gStorage->cursorSprite->y < -16) { tmp = -16 - gStorage->cursorSprite->y; gStorage->cursorSprite->y = DISPLAY_HEIGHT + 16 - tmp; } // Cursor flips vertically when moving on/off the top buttons if (gStorage->cursorFlipTimer && --gStorage->cursorFlipTimer == 0) gStorage->cursorSprite->vFlip = (gStorage->cursorSprite->vFlip == FALSE); } else { // Time is up for cursor movement, make sure it's exactly at target gStorage->cursorSprite->x = gStorage->cursorTargetX; gStorage->cursorSprite->y = gStorage->cursorTargetY; DoCursorNewPosUpdate(); } return TRUE; } static void InitNewCursorPos(u8 newCursorArea, u8 newCursorPosition) { u16 x, y; GetCursorCoordsByPos(newCursorArea, newCursorPosition, &x, &y); gStorage->newCursorArea = newCursorArea; gStorage->newCursorPosition = newCursorPosition; gStorage->cursorTargetX = x; gStorage->cursorTargetY = y; } static void InitCursorMove(void) { int yDistance, xDistance; if (gStorage->cursorVerticalWrap != 0 || gStorage->cursorHorizontalWrap != 0) gStorage->cursorMoveSteps = 12; else gStorage->cursorMoveSteps = 6; if (gStorage->cursorFlipTimer) gStorage->cursorFlipTimer = gStorage->cursorMoveSteps / 2; switch (gStorage->cursorVerticalWrap) { default: yDistance = gStorage->cursorTargetY - gStorage->cursorSprite->y; break; case -1: yDistance = gStorage->cursorTargetY - 192 - gStorage->cursorSprite->y; break; case 1: yDistance = gStorage->cursorTargetY + 192 - gStorage->cursorSprite->y; break; } switch (gStorage->cursorHorizontalWrap) { default: xDistance = gStorage->cursorTargetX - gStorage->cursorSprite->x; break; case -1: xDistance = gStorage->cursorTargetX - 192 - gStorage->cursorSprite->x; break; case 1: xDistance = gStorage->cursorTargetX + 192 - gStorage->cursorSprite->x; break; } yDistance <<= 8; xDistance <<= 8; gStorage->cursorSpeedX = xDistance / gStorage->cursorMoveSteps; gStorage->cursorSpeedY = yDistance / gStorage->cursorMoveSteps; gStorage->cursorNewX = gStorage->cursorSprite->x << 8; gStorage->cursorNewY = gStorage->cursorSprite->y << 8; } static void SetCursorPosition(u8 newCursorArea, u8 newCursorPosition) { InitNewCursorPos(newCursorArea, newCursorPosition); InitCursorMove(); if (gStorage->boxOption != OPTION_MOVE_ITEMS) { if (gStorage->inBoxMovingMode == MOVE_MODE_NORMAL && !sIsMonBeingMoved) StartSpriteAnim(gStorage->cursorSprite, 1); } else { if (!IsActiveItemMoving()) StartSpriteAnim(gStorage->cursorSprite, 1); } if (gStorage->boxOption == OPTION_MOVE_ITEMS) { if (sCursorArea == CURSOR_AREA_IN_BOX) TryHideItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition); else if (sCursorArea == CURSOR_AREA_IN_PARTY) TryHideItemIconAtPos(CURSOR_AREA_IN_PARTY, sCursorPosition); if (newCursorArea == CURSOR_AREA_IN_BOX) TryLoadItemIconAtPos(newCursorArea, newCursorPosition); else if (newCursorArea == CURSOR_AREA_IN_PARTY) TryLoadItemIconAtPos(newCursorArea, newCursorPosition); } if (newCursorArea == CURSOR_AREA_IN_PARTY && sCursorArea != CURSOR_AREA_IN_PARTY) { gStorage->cursorPrevPartyPos = 1; gStorage->cursorShadowSprite->invisible = TRUE; } switch (newCursorArea) { case CURSOR_AREA_IN_PARTY: case CURSOR_AREA_BOX_TITLE: case CURSOR_AREA_BUTTONS: gStorage->cursorSprite->oam.priority = 1; gStorage->cursorShadowSprite->invisible = TRUE; gStorage->cursorShadowSprite->oam.priority = 1; break; case CURSOR_AREA_IN_BOX: if (gStorage->inBoxMovingMode != MOVE_MODE_NORMAL) { gStorage->cursorSprite->oam.priority = 0; gStorage->cursorShadowSprite->invisible = TRUE; } else { gStorage->cursorSprite->oam.priority = 2; if (sCursorArea == CURSOR_AREA_IN_BOX && sIsMonBeingMoved) SetMovingMonPriority(2); } break; } } static void DoCursorNewPosUpdate(void) { sCursorArea = gStorage->newCursorArea; sCursorPosition = gStorage->newCursorPosition; if (gStorage->boxOption != OPTION_MOVE_ITEMS) { if (gStorage->inBoxMovingMode == MOVE_MODE_NORMAL && !sIsMonBeingMoved) StartSpriteAnim(gStorage->cursorSprite, 1); } else if (!IsActiveItemMoving()) StartSpriteAnim(gStorage->cursorSprite, 1); TrySetDisplayMonData(); switch (sCursorArea) { case CURSOR_AREA_BUTTONS: SetMovingMonPriority(1); break; case CURSOR_AREA_BOX_TITLE: AnimateBoxScrollArrows(TRUE); break; case CURSOR_AREA_IN_PARTY: gStorage->cursorShadowSprite->subpriority = 13; SetMovingMonPriority(1); break; case CURSOR_AREA_IN_BOX: if (gStorage->inBoxMovingMode == MOVE_MODE_NORMAL) { gStorage->cursorSprite->oam.priority = 1; gStorage->cursorShadowSprite->oam.priority = 2; gStorage->cursorShadowSprite->subpriority = 21; gStorage->cursorShadowSprite->invisible = FALSE; SetMovingMonPriority(2); } break; } } void SetCursorInParty(void) { u8 partyCount; if (!sIsMonBeingMoved) partyCount = 0; else { partyCount = CalculatePlayerPartyCount(); if (partyCount >= PARTY_SIZE) partyCount = PARTY_SIZE - 1; } if (gStorage->cursorSprite->vFlip) gStorage->cursorFlipTimer = 1; SetCursorPosition(CURSOR_AREA_IN_PARTY, partyCount); } void SetCursorBoxPosition(u8 cursorBoxPosition) { SetCursorPosition(CURSOR_AREA_IN_BOX, cursorBoxPosition); } void ClearSavedCursorPos(void) { sSavedCursorPosition = 0; } void SaveCursorPos(void) { sSavedCursorPosition = sCursorPosition; } u8 GetSavedCursorPos(void) { return sSavedCursorPosition; } void InitMonPlaceChange(u8 type) { static bool8 (*const placeChangeFuncs[])(void) = { [CHANGE_GRAB] = MonPlaceChange_Grab, [CHANGE_PLACE] = MonPlaceChange_Place, [CHANGE_SHIFT] = MonPlaceChange_Shift, }; gStorage->monPlaceChangeFunc = placeChangeFuncs[type]; gStorage->monPlaceChangeState = 0; } void InitMultiMonPlaceChange(bool8 moveCursorUp) { if (!moveCursorUp) gStorage->monPlaceChangeFunc = MonPlaceChange_DoMoveCursorDown; else gStorage->monPlaceChangeFunc = MonPlaceChange_DoMoveCursorUp; gStorage->monPlaceChangeState = 0; } bool8 DoMonPlaceChange(void) { return gStorage->monPlaceChangeFunc(); } static bool8 MonPlaceChange_Grab(void) { switch (gStorage->monPlaceChangeState) { case 0: if (sIsMonBeingMoved) return FALSE; StartSpriteAnim(gStorage->cursorSprite, 2); gStorage->monPlaceChangeState++; break; case 1: if (!MonPlaceChange_MoveCursorDown()) { StartSpriteAnim(gStorage->cursorSprite, 3); MoveMon(); gStorage->monPlaceChangeState++; } break; case 2: if (!MonPlaceChange_MoveCursorUp()) gStorage->monPlaceChangeState++; break; case 3: return FALSE; } return TRUE; } static bool8 MonPlaceChange_Place(void) { switch (gStorage->monPlaceChangeState) { case 0: if (!MonPlaceChange_MoveCursorDown()) { StartSpriteAnim(gStorage->cursorSprite, 2); PlaceMon(); gStorage->monPlaceChangeState++; } break; case 1: if (!MonPlaceChange_MoveCursorUp()) { StartSpriteAnim(gStorage->cursorSprite, 0); gStorage->monPlaceChangeState++; } break; case 2: return FALSE; } return TRUE; } static bool8 MonPlaceChange_Shift(void) { switch (gStorage->monPlaceChangeState) { case 0: switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: gStorage->shiftBoxId = TOTAL_BOXES_COUNT; break; case CURSOR_AREA_IN_BOX: gStorage->shiftBoxId = StorageGetCurrentBox(); break; default: return FALSE; } StartSpriteAnim(gStorage->cursorSprite, 2); SetShiftMonSpritePtr(gStorage->shiftBoxId, sCursorPosition); gStorage->monPlaceChangeState++; break; case 1: if (!ShiftMons()) { StartSpriteAnim(gStorage->cursorSprite, 3); SetShiftedMonData(gStorage->shiftBoxId, sCursorPosition); gStorage->monPlaceChangeState++; } break; case 2: return FALSE; } return TRUE; } static bool8 MonPlaceChange_DoMoveCursorDown(void) { return MonPlaceChange_MoveCursorDown(); } static bool8 MonPlaceChange_DoMoveCursorUp(void) { return MonPlaceChange_MoveCursorUp(); } static bool8 MonPlaceChange_MoveCursorDown(void) { switch (gStorage->cursorSprite->y2) { default: gStorage->cursorSprite->y2++; break; case 0: gStorage->cursorSprite->y2++; break; case 8: // Cursor has reached bottom return FALSE; } return TRUE; } static bool8 MonPlaceChange_MoveCursorUp(void) { switch (gStorage->cursorSprite->y2) { case 0: // Cursor has reached top return FALSE; default: gStorage->cursorSprite->y2--; break; } return TRUE; } static void MoveMon(void) { switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: SetMovedMonData(TOTAL_BOXES_COUNT, sCursorPosition); SetMovingMonSprite(MODE_PARTY, sCursorPosition); break; case CURSOR_AREA_IN_BOX: if (gStorage->inBoxMovingMode == MOVE_MODE_NORMAL) { SetMovedMonData(StorageGetCurrentBox(), sCursorPosition); SetMovingMonSprite(MODE_BOX, sCursorPosition); } break; default: return; } sIsMonBeingMoved = TRUE; } static void PlaceMon(void) { u8 boxId; switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: SetPlacedMonData(TOTAL_BOXES_COUNT, sCursorPosition); SetPlacedMonSprite(TOTAL_BOXES_COUNT, sCursorPosition); break; case CURSOR_AREA_IN_BOX: boxId = StorageGetCurrentBox(); SetPlacedMonData(boxId, sCursorPosition); SetPlacedMonSprite(boxId, sCursorPosition); break; default: return; } sIsMonBeingMoved = FALSE; } void DoTrySetDisplayMonData(void) { TrySetDisplayMonData(); } static void SetMovedMonData(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) { StoreHPAndStatusInBoxMon(&gPlayerParty[sCursorPosition]); gStorage->movingMon = gPlayerParty[sCursorPosition]; } else { BoxMonAtToMon(boxId, position, &gStorage->movingMon); PopulateBoxHpAndStatusToPartyMon(&gStorage->movingMon); } PurgeMonOrBoxMon(boxId, position); sMovingMonOrigBoxId = boxId; sMovingMonOrigBoxPos = position; } static void SetPlacedMonData(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) { PopulateBoxHpAndStatusToPartyMon(&gStorage->movingMon); // issue is here gPlayerParty[position] = gStorage->movingMon; } else { if(gSaveBlock1Ptr->keyFlags.noPMC != 1) BoxMonRestorePP(&gStorage->movingMon.box); StoreHPAndStatusInBoxMon(&gStorage->movingMon); SetBoxMonAt(boxId, position, &gStorage->movingMon.box); } } static void PurgeMonOrBoxMon(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) ZeroMonData(&gPlayerParty[position]); else ZeroBoxMonAt(boxId, position); } static void SetShiftedMonData(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) { StoreHPAndStatusInBoxMon(&gPlayerParty[position]); gStorage->tempMon = gPlayerParty[position]; } else { BoxMonAtToMon(boxId, position, &gStorage->tempMon); } SetPlacedMonData(boxId, position); gStorage->movingMon = gStorage->tempMon; SetDisplayMonData(&gStorage->movingMon, MODE_PARTY); sMovingMonOrigBoxId = boxId; sMovingMonOrigBoxPos = position; } bool8 TryStorePartyMonInBox(u8 boxId) { s16 boxPosition = GetFirstFreeBoxSpot(boxId); if (boxPosition == -1) return FALSE; if (sIsMonBeingMoved) { SetPlacedMonData(boxId, boxPosition); DestroyMovingMonIcon(); sIsMonBeingMoved = FALSE; } else { SetMovedMonData(TOTAL_BOXES_COUNT, sCursorPosition); SetPlacedMonData(boxId, boxPosition); DestroyPartyMonIcon(sCursorPosition); } if (boxId == StorageGetCurrentBox()) CreateBoxMonIconAtPos(boxPosition); StartSpriteAnim(gStorage->cursorSprite, 1); return TRUE; } void ResetSelectionAfterDeposit(void) { StartSpriteAnim(gStorage->cursorSprite, 0); TrySetDisplayMonData(); } void InitReleaseMon(void) { u8 mode; if (sIsMonBeingMoved) mode = MODE_MOVE; else if (sCursorArea == CURSOR_AREA_IN_PARTY) mode = MODE_PARTY; else mode = MODE_BOX; DoReleaseMonAnim(mode, sCursorPosition); StringCopy(gStorage->releaseMonName, gStorage->displayMonNickname); } bool8 TryHideReleaseMon(void) { if (!TryHideReleaseMonSprite()) { StartSpriteAnim(gStorage->cursorSprite, 0); return FALSE; } else return TRUE; } void ReleaseMon(void) { u8 boxId; DestroyReleaseMonIcon(); if (sIsMonBeingMoved) sIsMonBeingMoved = FALSE; else { if (sCursorArea == CURSOR_AREA_IN_PARTY) boxId = TOTAL_BOXES_COUNT; else boxId = StorageGetCurrentBox(); PurgeMonOrBoxMon(boxId, sCursorPosition); } TrySetDisplayMonData(); } void TrySetCursorFistAnim(void) { if (sIsMonBeingMoved) StartSpriteAnim(gStorage->cursorSprite, 3); } void InitCanReleaseMonVars(void) { u16 knownMoveFlags; if (sIsMonBeingMoved) { gStorage->tempMon = gStorage->movingMon; gStorage->releaseBoxId = -1; gStorage->releaseBoxPos = -1; } else { if (sCursorArea == CURSOR_AREA_IN_PARTY) { gStorage->tempMon = gPlayerParty[sCursorPosition]; gStorage->releaseBoxId = TOTAL_BOXES_COUNT; } else { BoxMonAtToMon(StorageGetCurrentBox(), sCursorPosition, &gStorage->tempMon); gStorage->releaseBoxId = StorageGetCurrentBox(); } gStorage->releaseBoxPos = sCursorPosition; } gStorage->isSurfMon = FALSE; gStorage->isDiveMon = FALSE; gStorage->restrictedMoveList[0] = MOVE_SURF; gStorage->restrictedMoveList[1] = MOVE_DIVE; gStorage->restrictedMoveList[2] = MOVES_COUNT; knownMoveFlags = GetMonData(&gStorage->tempMon, MON_DATA_KNOWN_MOVES, (u8 *)gStorage->restrictedMoveList); gStorage->isSurfMon = knownMoveFlags & 1; gStorage->isDiveMon = (knownMoveFlags >> 1) & 1; if (gStorage->isSurfMon || gStorage->isDiveMon) gStorage->releaseMonStatusResolved = FALSE; else { gStorage->releaseMonStatusResolved = TRUE; gStorage->releaseMonStatus = RELEASE_MON_ALLOWED; } gStorage->releaseCheckState = 0; } s8 RunCanReleaseMon(void) { u16 i; u16 knownMoveFlags; if (gStorage->releaseMonStatusResolved) return gStorage->releaseMonStatus; switch (gStorage->releaseCheckState) { case 0: for (i = 0; i < PARTY_SIZE; i++) { if (gStorage->releaseBoxId != TOTAL_BOXES_COUNT || gStorage->releaseBoxPos != i) { knownMoveFlags = GetMonData(&gPlayerParty[i], MON_DATA_KNOWN_MOVES, (u8 *)gStorage->restrictedMoveList); if (knownMoveFlags & 1) gStorage->isSurfMon = FALSE; if (knownMoveFlags & 2) gStorage->isDiveMon = FALSE; } } if (!(gStorage->isSurfMon || gStorage->isDiveMon)) { gStorage->releaseMonStatusResolved = TRUE; gStorage->releaseMonStatus = RELEASE_MON_ALLOWED; } else { gStorage->releaseCheckBoxId = 0; gStorage->releaseCheckBoxPos = 0; gStorage->releaseCheckState++; } break; case 1: // for some reason, check only 5 mons in box each time this function is called for (i = 0; i < 5; i++) { knownMoveFlags = GetAndCopyBoxMonDataAt(gStorage->releaseCheckBoxId, gStorage->releaseCheckBoxPos, MON_DATA_KNOWN_MOVES, (u8 *)gStorage->restrictedMoveList); if (knownMoveFlags != 0 && !(gStorage->releaseBoxId == gStorage->releaseCheckBoxId && gStorage->releaseBoxPos == gStorage->releaseCheckBoxPos)) { if (knownMoveFlags & 1) gStorage->isSurfMon = FALSE; if (knownMoveFlags & 2) gStorage->isDiveMon = FALSE; } if (++gStorage->releaseCheckBoxPos >= IN_BOX_COUNT) { gStorage->releaseCheckBoxPos = 0; if (++gStorage->releaseCheckBoxId >= TOTAL_BOXES_COUNT) { gStorage->releaseMonStatusResolved = TRUE; gStorage->releaseMonStatus = RELEASE_MON_NOT_ALLOWED; break; } } } if (!(gStorage->isSurfMon || gStorage->isDiveMon)) { gStorage->releaseMonStatusResolved = TRUE; gStorage->releaseMonStatus = RELEASE_MON_ALLOWED; } break; } return RELEASE_MON_UNDETERMINED; } void SaveMovingMon(void) { if (sIsMonBeingMoved) sMonBeingCarried = gStorage->movingMon; } void LoadSavedMovingMon(void) { if (sIsMonBeingMoved) { if (sMovingMonOrigBoxId == TOTAL_BOXES_COUNT) gStorage->movingMon = sMonBeingCarried; else gStorage->movingMon.box = sMonBeingCarried.box; } } void InitSummaryScreenData(void) { if (sIsMonBeingMoved) { SaveMovingMon(); gStorage->summaryMonPtr.mon = &sMonBeingCarried; gStorage->summaryCursorPos = 0; gStorage->summaryLastIndex = 0; gStorage->summaryScreenMode = PSS_MODE_NORMAL; } else if (sCursorArea == CURSOR_AREA_IN_PARTY) { gStorage->summaryMonPtr.mon = gPlayerParty; gStorage->summaryCursorPos = sCursorPosition; gStorage->summaryLastIndex = CountPartyMons() - 1; gStorage->summaryScreenMode = PSS_MODE_NORMAL; } else { gStorage->summaryMonPtr.box = GetBoxedMonPtr(StorageGetCurrentBox(), 0); gStorage->summaryCursorPos = sCursorPosition; gStorage->summaryLastIndex = IN_BOX_COUNT - 1; gStorage->summaryScreenMode = PSS_MODE_BOX; } } void SetSelectionAfterSummaryScreen(void) { if (sIsMonBeingMoved) LoadSavedMovingMon(); else sCursorPosition = GetLastViewedMonIndex(); } s16 CompactPartySlots(void) { s16 retVal = -1; u16 i, last; for (i = 0, last = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); if (species != SPECIES_NONE) { if (i != last) gPlayerParty[last] = gPlayerParty[i]; last++; } else if (retVal == -1) retVal = i; } for (; last < PARTY_SIZE; last++) ZeroMonData(gPlayerParty + last); return retVal; } void SetMonMarkings(u8 markings) { gStorage->displayMonMarkings = markings; if (sIsMonBeingMoved) SetMonData(&gStorage->movingMon, MON_DATA_MARKINGS, &markings); else { if (sCursorArea == CURSOR_AREA_IN_PARTY) SetMonData(gPlayerParty + sCursorPosition, MON_DATA_MARKINGS, &markings); if (sCursorArea == CURSOR_AREA_IN_BOX) SetCurrentBoxMonData(sCursorPosition, MON_DATA_MARKINGS, &markings); } } bool8 CanMovePartyMon(void) { if (sCursorArea == CURSOR_AREA_IN_PARTY && !sIsMonBeingMoved && CountPartyAliveNonEggMonsExcept(sCursorPosition) == 0) return TRUE; else return FALSE; } bool8 CanShiftMon(void) { if (sIsMonBeingMoved) { if (sCursorArea == CURSOR_AREA_IN_PARTY && CountPartyAliveNonEggMonsExcept(sCursorPosition) == 0) { if (gStorage->displayMonIsEgg || GetMonData(&gStorage->movingMon, MON_DATA_HP) == 0) return FALSE; } return TRUE; } return FALSE; } bool8 IsMonBeingMoved(void) { return sIsMonBeingMoved; } bool8 IsCursorOnBoxTitle(void) { return (sCursorArea == CURSOR_AREA_BOX_TITLE); } bool8 IsCursorOnCloseBox(void) { return (sCursorArea == CURSOR_AREA_BUTTONS && sCursorPosition == 1); } bool8 IsCursorInBox(void) { return (sCursorArea == CURSOR_AREA_IN_BOX); } static void TrySetDisplayMonData(void) { gStorage->setMosaic = (sIsMonBeingMoved == FALSE); if (!sIsMonBeingMoved) { switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: if (sCursorPosition < PARTY_SIZE) { SetDisplayMonData(&gPlayerParty[sCursorPosition], MODE_PARTY); break; } // fallthrough case CURSOR_AREA_BUTTONS: case CURSOR_AREA_BOX_TITLE: SetDisplayMonData(NULL, MODE_MOVE); break; case CURSOR_AREA_IN_BOX: SetDisplayMonData(GetBoxedMonPtr(StorageGetCurrentBox(), sCursorPosition), MODE_BOX); break; } } } static void ReshowDisplayMon(void) { if (sIsMonBeingMoved) SetDisplayMonData(&sMonBeingCarried, MODE_PARTY); else TrySetDisplayMonData(); } #define displayMonNicknameText displayMonTexts[0] #define displayMonSpeciesNameText displayMonTexts[1] #define displayMonGenderAndLevelText displayMonTexts[2] #define displayMonItemNameText displayMonTexts[3] static void SetDisplayMonData(void *pokemon, u8 mode) { u8 *txtPtr; u16 gender; bool8 sanityIsBagEgg; gStorage->displayMonItemId = ITEM_NONE; gender = MON_MALE; sanityIsBagEgg = FALSE; if (mode == MODE_PARTY) { struct Pokemon *mon = (struct Pokemon *)pokemon; gStorage->displayMonSpecies = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); if (gStorage->displayMonSpecies != SPECIES_NONE) { sanityIsBagEgg = GetMonData(mon, MON_DATA_SANITY_IS_BAD_EGG); if (sanityIsBagEgg) gStorage->displayMonIsEgg = TRUE; else gStorage->displayMonIsEgg = GetMonData(mon, MON_DATA_IS_EGG); GetMonData(mon, MON_DATA_NICKNAME, gStorage->displayMonNickname); StringGet_Nickname(gStorage->displayMonNickname); gStorage->displayMonLevel = GetMonData(mon, MON_DATA_LEVEL); gStorage->displayMonMarkings = GetMonData(mon, MON_DATA_MARKINGS); if(gStorage->displayMonSpecies == SPECIES_DEOXYS) gStorage->displayMonSpecies = GetDeoxysSpeciesFromForme(GetMonData(mon, MON_DATA_FORME)); gStorage->displayMonPersonality = GetMonData(mon, MON_DATA_PERSONALITY); gStorage->displayMonPalette = GetMonFrontSpritePal(mon); gender = GetMonGender(mon); gStorage->displayMonItemId = GetMonData(mon, MON_DATA_HELD_ITEM); } } else if (mode == MODE_BOX) { struct BoxPokemon *boxMon = (struct BoxPokemon *)pokemon; gStorage->displayMonSpecies = GetBoxMonData(pokemon, MON_DATA_SPECIES_OR_EGG); if (gStorage->displayMonSpecies != SPECIES_NONE) { u32 otId = GetBoxMonData(boxMon, MON_DATA_OT_ID); sanityIsBagEgg = GetBoxMonData(boxMon, MON_DATA_SANITY_IS_BAD_EGG); if (sanityIsBagEgg) gStorage->displayMonIsEgg = TRUE; else gStorage->displayMonIsEgg = GetBoxMonData(boxMon, MON_DATA_IS_EGG); GetBoxMonData(boxMon, MON_DATA_NICKNAME, gStorage->displayMonNickname); StringGet_Nickname(gStorage->displayMonNickname); gStorage->displayMonLevel = GetLevelFromBoxMonExp(boxMon); gStorage->displayMonMarkings = GetBoxMonData(boxMon, MON_DATA_MARKINGS); if(gStorage->displayMonSpecies == SPECIES_DEOXYS) gStorage->displayMonSpecies = GetDeoxysSpeciesFromForme(GetBoxMonData(boxMon, MON_DATA_FORME)); gStorage->displayMonPersonality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY); gStorage->displayMonPalette = GetMonSpritePalFromSpeciesAndPersonality(gStorage->displayMonSpecies, otId, gStorage->displayMonPersonality); gender = GetGenderFromSpeciesAndPersonality(gStorage->displayMonSpecies, gStorage->displayMonPersonality); gStorage->displayMonItemId = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM); } } else { gStorage->displayMonSpecies = SPECIES_NONE; gStorage->displayMonItemId = ITEM_NONE; } if (gStorage->displayMonSpecies == SPECIES_NONE) { StringFill(gStorage->displayMonNickname, CHAR_SPACE, 5); StringFill(gStorage->displayMonNicknameText, CHAR_SPACE, 8); StringFill(gStorage->displayMonSpeciesNameText, CHAR_SPACE, 8); StringFill(gStorage->displayMonGenderAndLevelText, CHAR_SPACE, 8); StringFill(gStorage->displayMonItemNameText, CHAR_SPACE, 8); } else if (gStorage->displayMonIsEgg) { if (sanityIsBagEgg) StringCopyPadded(gStorage->displayMonNicknameText, gStorage->displayMonNickname, CHAR_SPACE, 5); else StringCopyPadded(gStorage->displayMonNicknameText, gText_EggNickname, CHAR_SPACE, 8); StringFill(gStorage->displayMonSpeciesNameText, CHAR_SPACE, 8); StringFill(gStorage->displayMonGenderAndLevelText, CHAR_SPACE, 8); StringFill(gStorage->displayMonItemNameText, CHAR_SPACE, 8); } else { if (gStorage->displayMonSpecies == SPECIES_NIDORAN_F || gStorage->displayMonSpecies == SPECIES_NIDORAN_M) gender = MON_GENDERLESS; // Buffer nickname StringCopyPadded(gStorage->displayMonNicknameText, gStorage->displayMonNickname, CHAR_SPACE, 5); // Buffer species name txtPtr = gStorage->displayMonSpeciesNameText; *(txtPtr)++ = CHAR_SLASH; if(gStorage->displayMonSpecies >= 65530 && gStorage->displayMonSpecies <= 65533) StringCopyPadded(txtPtr, gSpeciesNames[SPECIES_DEOXYS], CHAR_SPACE, 5); else StringCopyPadded(txtPtr, gSpeciesNames[gStorage->displayMonSpecies], CHAR_SPACE, 5); // Buffer gender and level txtPtr = gStorage->displayMonGenderAndLevelText; *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; *(txtPtr)++ = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW; switch (gender) { case MON_MALE: *(txtPtr)++ = TEXT_COLOR_RED; *(txtPtr)++ = TEXT_COLOR_WHITE; *(txtPtr)++ = TEXT_COLOR_LIGHT_RED; *(txtPtr)++ = CHAR_MALE; break; case MON_FEMALE: *(txtPtr)++ = TEXT_COLOR_GREEN; *(txtPtr)++ = TEXT_COLOR_WHITE; *(txtPtr)++ = TEXT_COLOR_LIGHT_GREEN; *(txtPtr)++ = CHAR_FEMALE; break; default: *(txtPtr)++ = TEXT_COLOR_DARK_GRAY; *(txtPtr)++ = TEXT_COLOR_WHITE; *(txtPtr)++ = TEXT_COLOR_LIGHT_GRAY; *(txtPtr)++ = CHAR_SPACE; break; } *(txtPtr++) = EXT_CTRL_CODE_BEGIN; *(txtPtr++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW; *(txtPtr++) = TEXT_COLOR_DARK_GRAY; *(txtPtr++) = TEXT_COLOR_WHITE; *(txtPtr++) = TEXT_COLOR_LIGHT_GRAY; *(txtPtr++) = CHAR_SPACE; *(txtPtr++) = CHAR_EXTRA_SYMBOL; *(txtPtr++) = CHAR_LV_2; txtPtr = ConvertIntToDecimalStringN(txtPtr, gStorage->displayMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3); txtPtr[0] = CHAR_SPACE; txtPtr[1] = EOS; // Buffer item name if (gStorage->displayMonItemId != ITEM_NONE) StringCopyPadded(gStorage->displayMonItemNameText, ItemId_GetName(gStorage->displayMonItemId), CHAR_SPACE, 8); else StringFill(gStorage->displayMonItemNameText, CHAR_SPACE, 8); } } #undef displayMonNicknameText #undef displayMonSpeciesNameText #undef displayMonGenderAndLevelText #undef displayMonItemNameText static u8 HandleInput_InBox(void) { switch (gStorage->inBoxMovingMode) { case MOVE_MODE_NORMAL: default: return HandleInput_InBox_Normal(); case MOVE_MODE_MULTIPLE_SELECTING: return HandleInput_InBox_GrabbingMultiple(); case MOVE_MODE_MULTIPLE_MOVING: return HandleInput_InBox_MovingMultiple(); } } static u8 HandleInput_InBox_Normal(void) { u8 input; s8 cursorArea; s8 cursorPosition; do { cursorArea = sCursorArea; cursorPosition = sCursorPosition; gStorage->cursorVerticalWrap = 0; gStorage->cursorHorizontalWrap = 0; gStorage->cursorFlipTimer = 0; if (JOY_REPT(DPAD_UP)) { input = INPUT_MOVE_CURSOR; if (sCursorPosition >= IN_BOX_COLUMNS) cursorPosition -= IN_BOX_COLUMNS; else { cursorArea = CURSOR_AREA_BOX_TITLE; cursorPosition = 0; } break; } else if (JOY_REPT(DPAD_DOWN)) { input = INPUT_MOVE_CURSOR; cursorPosition += IN_BOX_COLUMNS; if (cursorPosition >= IN_BOX_COUNT) { cursorArea = CURSOR_AREA_BUTTONS; cursorPosition -= IN_BOX_COUNT; cursorPosition /= 3; gStorage->cursorVerticalWrap = 1; gStorage->cursorFlipTimer = 1; } break; } else if (JOY_REPT(DPAD_LEFT)) { input = INPUT_MOVE_CURSOR; if (sCursorPosition % IN_BOX_COLUMNS != 0) cursorPosition--; else { gStorage->cursorHorizontalWrap = -1; cursorPosition += (IN_BOX_COLUMNS - 1); } break; } else if (JOY_REPT(DPAD_RIGHT)) { input = INPUT_MOVE_CURSOR; if ((sCursorPosition + 1) % IN_BOX_COLUMNS != 0) cursorPosition++; else { gStorage->cursorHorizontalWrap = 1; cursorPosition -= (IN_BOX_COLUMNS - 1); } break; } else if (JOY_NEW(START_BUTTON)) { input = INPUT_MOVE_CURSOR; cursorArea = CURSOR_AREA_BOX_TITLE; cursorPosition = 0; break; } if ((JOY_NEW(A_BUTTON)) && SetSelectionMenuTexts()) { if (!sInMultiMoveMode) return INPUT_IN_MENU; if (gStorage->boxOption != OPTION_MOVE_MONS || sIsMonBeingMoved == TRUE) { switch (GetMenuItemTextId(0)) { case MENU_TEXT_STORE: return INPUT_DEPOSIT; case MENU_TEXT_WITHDRAW: return INPUT_WITHDRAW; case MENU_TEXT_MOVE: return INPUT_MOVE_MON; case MENU_TEXT_SHIFT: return INPUT_SHIFT_MON; case MENU_TEXT_PLACE: return INPUT_PLACE_MON; case MENU_TEXT_TAKE: return INPUT_TAKE_ITEM; case MENU_TEXT_GIVE: return INPUT_GIVE_ITEM; case MENU_TEXT_SWITCH: return INPUT_SWITCH_ITEMS; } } else { gStorage->inBoxMovingMode = MOVE_MODE_MULTIPLE_SELECTING; return INPUT_MULTIMOVE_START; } } if (JOY_NEW(B_BUTTON)) return INPUT_PRESSED_B; if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_HELD(L_BUTTON)) return INPUT_SCROLL_LEFT; if (JOY_HELD(R_BUTTON)) return INPUT_SCROLL_RIGHT; } if (JOY_NEW(SELECT_BUTTON)) { ToggleCursorMultiMoveMode(); return INPUT_NONE; } input = INPUT_NONE; } while (FALSE); if (input != INPUT_NONE) SetCursorPosition(cursorArea, cursorPosition); return input; } static u8 HandleInput_InBox_GrabbingMultiple(void) { if (JOY_HELD(A_BUTTON)) { if (JOY_REPT(DPAD_UP)) { if (sCursorPosition / IN_BOX_COLUMNS != 0) { SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - IN_BOX_COLUMNS); return INPUT_MULTIMOVE_CHANGE_SELECTION; } else return INPUT_MULTIMOVE_UNABLE; } else if (JOY_REPT(DPAD_DOWN)) { if (sCursorPosition + IN_BOX_COLUMNS < IN_BOX_COUNT) { SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + IN_BOX_COLUMNS); return INPUT_MULTIMOVE_CHANGE_SELECTION; } else return INPUT_MULTIMOVE_UNABLE; } else if (JOY_REPT(DPAD_LEFT)) { if (sCursorPosition % IN_BOX_COLUMNS != 0) { SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - 1); return INPUT_MULTIMOVE_CHANGE_SELECTION; } else return INPUT_MULTIMOVE_UNABLE; } else if (JOY_REPT(DPAD_RIGHT)) { if ((sCursorPosition + 1) % IN_BOX_COLUMNS != 0) { SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + 1); return INPUT_MULTIMOVE_CHANGE_SELECTION; } else return INPUT_MULTIMOVE_UNABLE; } else return INPUT_NONE; } else { if (MultiMove_GetOriginPosition() == sCursorPosition) { gStorage->inBoxMovingMode = MOVE_MODE_NORMAL; gStorage->cursorShadowSprite->invisible = FALSE; return INPUT_MULTIMOVE_SINGLE; } else { sIsMonBeingMoved = (gStorage->displayMonSpecies != SPECIES_NONE); gStorage->inBoxMovingMode = MOVE_MODE_MULTIPLE_MOVING; sMovingMonOrigBoxId = StorageGetCurrentBox(); return INPUT_MULTIMOVE_GRAB_SELECTION; } } } static u8 HandleInput_InBox_MovingMultiple(void) { if (JOY_REPT(DPAD_UP)) { if (MultiMove_TryMoveGroup(0)) { SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - IN_BOX_COLUMNS); return INPUT_MULTIMOVE_MOVE_MONS; } else return INPUT_MULTIMOVE_UNABLE; } else if (JOY_REPT(DPAD_DOWN)) { if (MultiMove_TryMoveGroup(1)) { SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + IN_BOX_COLUMNS); return INPUT_MULTIMOVE_MOVE_MONS; } else return INPUT_MULTIMOVE_UNABLE; } else if (JOY_REPT(DPAD_LEFT)) { if (MultiMove_TryMoveGroup(2)) { SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - 1); return INPUT_MULTIMOVE_MOVE_MONS; } else return INPUT_SCROLL_LEFT; } else if (JOY_REPT(DPAD_RIGHT)) { if (MultiMove_TryMoveGroup(3)) { SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + 1); return INPUT_MULTIMOVE_MOVE_MONS; } else return INPUT_SCROLL_RIGHT; } else if (JOY_NEW(A_BUTTON)) { if (MultiMove_CanPlaceSelection()) { sIsMonBeingMoved = FALSE; gStorage->inBoxMovingMode = MOVE_MODE_NORMAL; return INPUT_MULTIMOVE_PLACE_MONS; } else return INPUT_MULTIMOVE_UNABLE; } else if (JOY_NEW(B_BUTTON)) return INPUT_MULTIMOVE_UNABLE; else { if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_HELD(L_BUTTON)) return INPUT_SCROLL_LEFT; if (JOY_HELD(R_BUTTON)) return INPUT_SCROLL_RIGHT; } return INPUT_NONE; } } static u8 HandleInput_InParty(void) { u8 input; bool8 gotoBox; s8 cursorArea; s8 cursorPosition; do { cursorArea = sCursorArea; cursorPosition = sCursorPosition; gStorage->cursorHorizontalWrap = 0; gStorage->cursorVerticalWrap = 0; gStorage->cursorFlipTimer = 0; gotoBox = FALSE; input = INPUT_NONE; if (JOY_REPT(DPAD_UP)) { if (--cursorPosition < 0) cursorPosition = PARTY_SIZE; if (cursorPosition != sCursorPosition) input = INPUT_MOVE_CURSOR; break; } else if (JOY_REPT(DPAD_DOWN)) { if (++cursorPosition > PARTY_SIZE) cursorPosition = 0; if (cursorPosition != sCursorPosition) input = INPUT_MOVE_CURSOR; break; } else if (JOY_REPT(DPAD_LEFT) && sCursorPosition != 0) { input = INPUT_MOVE_CURSOR; gStorage->cursorPrevPartyPos = sCursorPosition; cursorPosition = 0; break; } else if (JOY_REPT(DPAD_RIGHT)) { if (sCursorPosition == 0) { input = INPUT_MOVE_CURSOR; cursorPosition = gStorage->cursorPrevPartyPos; } else { input = INPUT_HIDE_PARTY; cursorArea = CURSOR_AREA_IN_BOX; cursorPosition = 0; } break; } if (JOY_NEW(A_BUTTON)) { if (sCursorPosition == PARTY_SIZE) { if (gStorage->boxOption == OPTION_DEPOSIT) return INPUT_CLOSE_BOX; gotoBox = TRUE; } else if (SetSelectionMenuTexts()) { if (!sInMultiMoveMode) return INPUT_IN_MENU; switch (GetMenuItemTextId(0)) { case MENU_TEXT_STORE: return INPUT_DEPOSIT; case MENU_TEXT_WITHDRAW: return INPUT_WITHDRAW; case MENU_TEXT_MOVE: return INPUT_MOVE_MON; case MENU_TEXT_SHIFT: return INPUT_SHIFT_MON; case MENU_TEXT_PLACE: return INPUT_PLACE_MON; case MENU_TEXT_TAKE: return INPUT_TAKE_ITEM; case MENU_TEXT_GIVE: return INPUT_GIVE_ITEM; case MENU_TEXT_SWITCH: return INPUT_SWITCH_ITEMS; } } } if (JOY_NEW(B_BUTTON)) { if (gStorage->boxOption == OPTION_DEPOSIT) return INPUT_PRESSED_B; gotoBox = TRUE; } if (gotoBox) { input = INPUT_HIDE_PARTY; cursorArea = CURSOR_AREA_IN_BOX; cursorPosition = 0; } else if (JOY_NEW(SELECT_BUTTON)) { ToggleCursorMultiMoveMode(); return INPUT_NONE; } } while (FALSE); if (input != INPUT_NONE && input != INPUT_HIDE_PARTY) SetCursorPosition(cursorArea, cursorPosition); return input; } static u8 HandleInput_BoxTitle(void) { u8 input; s8 cursorArea; s8 cursorPosition; do { gStorage->cursorHorizontalWrap = 0; gStorage->cursorVerticalWrap = 0; gStorage->cursorFlipTimer = 0; if (JOY_REPT(DPAD_UP)) { input = INPUT_MOVE_CURSOR; cursorArea = CURSOR_AREA_BUTTONS; cursorPosition = 0; gStorage->cursorFlipTimer = 1; break; } else if (JOY_REPT(DPAD_DOWN)) { input = INPUT_MOVE_CURSOR; cursorArea = CURSOR_AREA_IN_BOX; cursorPosition = 2; break; } if (JOY_HELD(DPAD_LEFT)) return INPUT_SCROLL_LEFT; if (JOY_HELD(DPAD_RIGHT)) return INPUT_SCROLL_RIGHT; if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_HELD(L_BUTTON)) return INPUT_SCROLL_LEFT; if (JOY_HELD(R_BUTTON)) return INPUT_SCROLL_RIGHT; } if (JOY_NEW(A_BUTTON)) { AnimateBoxScrollArrows(FALSE); AddBoxMenu(); return INPUT_BOX_OPTIONS; } if (JOY_NEW(B_BUTTON)) return INPUT_PRESSED_B; if (JOY_NEW(SELECT_BUTTON)) { ToggleCursorMultiMoveMode(); return INPUT_NONE; } input = INPUT_NONE; } while (FALSE); if (input != INPUT_NONE) { if (cursorArea != CURSOR_AREA_BOX_TITLE) AnimateBoxScrollArrows(FALSE); SetCursorPosition(cursorArea, cursorPosition); } return input; } static u8 HandleInput_OnButtons(void) { u8 input; s8 cursorArea; s8 cursorPosition; s8 prevPos; do { cursorArea = sCursorArea; cursorPosition = sCursorPosition; gStorage->cursorHorizontalWrap = 0; gStorage->cursorVerticalWrap = 0; gStorage->cursorFlipTimer = 0; if (JOY_REPT(DPAD_UP)) { input = INPUT_MOVE_CURSOR; cursorArea = CURSOR_AREA_IN_BOX; gStorage->cursorVerticalWrap = -1; if (sCursorPosition == 0) cursorPosition = IN_BOX_COUNT - 1 - 5; else cursorPosition = IN_BOX_COUNT - 1; gStorage->cursorFlipTimer = 1; break; } else if (JOY_REPT(DPAD_DOWN | START_BUTTON)) { input = INPUT_MOVE_CURSOR; cursorArea = CURSOR_AREA_BOX_TITLE; cursorPosition = 0; gStorage->cursorFlipTimer = 1; break; } if (JOY_REPT(DPAD_LEFT)) { input = INPUT_MOVE_CURSOR; if (--cursorPosition < 0) cursorPosition = 1; break; } else if (JOY_REPT(DPAD_RIGHT)) { input = INPUT_MOVE_CURSOR; if (++cursorPosition > 1) cursorPosition = 0; break; } if (JOY_NEW(A_BUTTON)) return cursorPosition == 0 ? INPUT_SHOW_PARTY : INPUT_CLOSE_BOX; if (JOY_NEW(B_BUTTON)) return INPUT_PRESSED_B; if (JOY_NEW(SELECT_BUTTON)) { ToggleCursorMultiMoveMode(); return INPUT_NONE; } input = INPUT_NONE; } while (FALSE); if (input != INPUT_NONE) SetCursorPosition(cursorArea, cursorPosition); return input; } u8 HandleInput(void) { struct { u8 (*func)(void); s8 area; } static const inputFuncs[] = { {HandleInput_InBox, CURSOR_AREA_IN_BOX}, {HandleInput_InParty, CURSOR_AREA_IN_PARTY}, {HandleInput_BoxTitle, CURSOR_AREA_BOX_TITLE}, {HandleInput_OnButtons, CURSOR_AREA_BUTTONS}, {NULL, 0}, }; u16 i = 0; while (inputFuncs[i].func != NULL) { if (inputFuncs[i].area == sCursorArea) return inputFuncs[i].func(); i++; } return INPUT_NONE; } static void AddBoxMenu(void) { InitMenu(); SetMenuText(MENU_TEXT_JUMP); SetMenuText(MENU_TEXT_WALLPAPER); SetMenuText(MENU_TEXT_NAME); SetMenuText(MENU_TEXT_CANCEL); } static bool8 SetSelectionMenuTexts(void) { InitMenu(); if (gStorage->boxOption != OPTION_MOVE_ITEMS) return SetMenuTextsForMon(); else return SetMenuTextsForItem(); } static bool8 SetMenuTextsForMon(void) { u16 species = GetSpeciesAtCursorPosition(); switch (gStorage->boxOption) { case OPTION_DEPOSIT: if (species != SPECIES_NONE) SetMenuText(MENU_TEXT_STORE); else return FALSE; break; case OPTION_WITHDRAW: if (species != SPECIES_NONE) SetMenuText(MENU_TEXT_WITHDRAW); else return FALSE; break; case OPTION_MOVE_MONS: if (sIsMonBeingMoved) { if (species != SPECIES_NONE) SetMenuText(MENU_TEXT_SHIFT); else SetMenuText(MENU_TEXT_PLACE); } else { if (species != SPECIES_NONE) SetMenuText(MENU_TEXT_MOVE); else return FALSE; } break; case OPTION_MOVE_ITEMS: default: return FALSE; } SetMenuText(MENU_TEXT_SUMMARY); if (gStorage->boxOption == OPTION_MOVE_MONS) { if (!sCursorArea) SetMenuText(MENU_TEXT_WITHDRAW); else SetMenuText(MENU_TEXT_STORE); } SetMenuText(MENU_TEXT_MARK); SetMenuText(MENU_TEXT_RELEASE); SetMenuText(MENU_TEXT_CANCEL); return TRUE; } static bool8 SetMenuTextsForItem(void) { if (gStorage->displayMonSpecies == SPECIES_EGG) return FALSE; if (!IsActiveItemMoving()) { if (gStorage->displayMonItemId == ITEM_NONE) { if (gStorage->displayMonSpecies == SPECIES_NONE) return FALSE; SetMenuText(MENU_TEXT_GIVE2); } else { if (!ItemIsMail(gStorage->displayMonItemId)) { SetMenuText(MENU_TEXT_TAKE); SetMenuText(MENU_TEXT_BAG); } SetMenuText(MENU_TEXT_INFO); } } else { if (gStorage->displayMonItemId == ITEM_NONE) { if (gStorage->displayMonSpecies == SPECIES_NONE) return FALSE; SetMenuText(MENU_TEXT_GIVE); } else { if (ItemIsMail(gStorage->displayMonItemId) == TRUE) return FALSE; SetMenuText(MENU_TEXT_SWITCH); } } SetMenuText(MENU_TEXT_CANCEL); return TRUE; } static void SpriteCB_CursorShadow(struct Sprite *sprite) { sprite->x = gStorage->cursorSprite->x; sprite->y = gStorage->cursorSprite->y + 20; } static void CreateCursorSprites(void) { u16 x, y; u8 spriteId; u8 priority, subpriority; struct SpriteSheet spriteSheets[] = { {sHandCursorTiles, 0x800, GFXTAG_CURSOR}, {sHandCursorShadowTiles, 0x80, GFXTAG_CURSOR_SHADOW}, {} }; struct SpritePalette spritePalettes[] = { {sPokeStorageMisc1Pal, PALTAG_MISC_1}, {} }; static const struct OamData sOamData_Cursor = { .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .priority = 1, }; static const struct OamData sOamData_CursorShadow = { .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 1, }; static const union AnimCmd sAnim_Cursor_Bouncing[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_FRAME(16, 30), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Cursor_Still[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd sAnim_Cursor_Open[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END }; static const union AnimCmd sAnim_Cursor_Fist[] = { ANIMCMD_FRAME(48, 5), ANIMCMD_END }; static const union AnimCmd *const sAnims_Cursor[] = { [CURSOR_ANIM_BOUNCE] = sAnim_Cursor_Bouncing, [CURSOR_ANIM_STILL] = sAnim_Cursor_Still, [CURSOR_ANIM_OPEN] = sAnim_Cursor_Open, [CURSOR_ANIM_FIST] = sAnim_Cursor_Fist, }; static const struct SpriteTemplate sSpriteTemplate_Cursor = { .tileTag = GFXTAG_CURSOR, .paletteTag = PALTAG_MISC_2, .oam = &sOamData_Cursor, .anims = sAnims_Cursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const struct SpriteTemplate sSpriteTemplate_CursorShadow = { .tileTag = GFXTAG_CURSOR_SHADOW, .paletteTag = PALTAG_MISC_2, .oam = &sOamData_CursorShadow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_CursorShadow, }; LoadSpriteSheets(spriteSheets); LoadSpritePalettes(spritePalettes); gStorage->cursorPalNums[0] = IndexOfSpritePaletteTag(PALTAG_MISC_2); gStorage->cursorPalNums[1] = IndexOfSpritePaletteTag(PALTAG_MISC_1); GetCursorCoordsByPos(sCursorArea, sCursorPosition, &x, &y); spriteId = CreateSprite(&sSpriteTemplate_Cursor, x, y, 6); if (spriteId != MAX_SPRITES) { gStorage->cursorSprite = &gSprites[spriteId]; gStorage->cursorSprite->oam.paletteNum = gStorage->cursorPalNums[sInMultiMoveMode]; gStorage->cursorSprite->oam.priority = 1; if (sIsMonBeingMoved) StartSpriteAnim(gStorage->cursorSprite, 3); } else gStorage->cursorSprite = NULL; if (sCursorArea == CURSOR_AREA_IN_PARTY) { subpriority = 13; priority = 1; } else { subpriority = 21; priority = 2; } spriteId = CreateSprite(&sSpriteTemplate_CursorShadow, 0, 0, subpriority); if (spriteId != MAX_SPRITES) { gStorage->cursorShadowSprite = &gSprites[spriteId]; gStorage->cursorShadowSprite->oam.priority = priority; if (sCursorArea) gStorage->cursorShadowSprite->invisible = 1; } else gStorage->cursorShadowSprite = NULL; } static void ToggleCursorMultiMoveMode(void) { sInMultiMoveMode = !sInMultiMoveMode; gStorage->cursorSprite->oam.paletteNum = gStorage->cursorPalNums[sInMultiMoveMode]; } u8 GetBoxCursorPosition(void) { return sCursorPosition; } void GetCursorBoxColumnAndRow(u8 *column, u8 *row) { if (sCursorArea == CURSOR_AREA_IN_BOX) { *column = sCursorPosition % IN_BOX_COLUMNS; *row = sCursorPosition / IN_BOX_COLUMNS; } else { *column = 0; *row = 0; } } void StartCursorAnim(u8 animNum) { StartSpriteAnim(gStorage->cursorSprite, animNum); } u8 GetMovingMonOriginalBoxId(void) { return sMovingMonOrigBoxId; } void SetCursorPriorityTo1(void) { gStorage->cursorSprite->oam.priority = 1; } void TryHideItemAtCursor(void) { if (sCursorArea == CURSOR_AREA_IN_BOX) TryHideItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition); } void TryShowItemAtCursor(void) { if (sCursorArea == CURSOR_AREA_IN_BOX) TryLoadItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition); } static const u8 *const sMenuTexts[] = { [MENU_TEXT_CANCEL] = gPCText_Cancel, [MENU_TEXT_STORE] = gPCText_Store, [MENU_TEXT_WITHDRAW] = gPCText_Withdraw, [MENU_TEXT_MOVE] = gPCText_Move, [MENU_TEXT_SHIFT] = gPCText_Shift, [MENU_TEXT_PLACE] = gPCText_Place, [MENU_TEXT_SUMMARY] = gPCText_Summary, [MENU_TEXT_RELEASE] = gPCText_Release, [MENU_TEXT_MARK] = gPCText_Mark, [MENU_TEXT_JUMP] = gPCText_Jump, [MENU_TEXT_WALLPAPER] = gPCText_Wallpaper, [MENU_TEXT_NAME] = gPCText_Name, [MENU_TEXT_TAKE] = gPCText_Take, [MENU_TEXT_GIVE] = gPCText_Give, [MENU_TEXT_GIVE2] = gPCText_Give, [MENU_TEXT_SWITCH] = gPCText_Switch, [MENU_TEXT_BAG] = gPCText_Bag, [MENU_TEXT_INFO] = gPCText_Info, [MENU_TEXT_SCENERY_1] = gPCText_Scenery1, [MENU_TEXT_SCENERY_2] = gPCText_Scenery2, [MENU_TEXT_SCENERY_3] = gPCText_Scenery3, [MENU_TEXT_ETCETERA] = gPCText_Etcetera, [MENU_TEXT_FOREST] = gPCText_Forest, [MENU_TEXT_CITY] = gPCText_City, [MENU_TEXT_DESERT] = gPCText_Desert, [MENU_TEXT_SAVANNA] = gPCText_Savanna, [MENU_TEXT_CRAG] = gPCText_Crag, [MENU_TEXT_VOLCANO] = gPCText_Volcano, [MENU_TEXT_SNOW] = gPCText_Snow, [MENU_TEXT_CAVE] = gPCText_Cave, [MENU_TEXT_BEACH] = gPCText_Beach, [MENU_TEXT_SEAFLOOR] = gPCText_Seafloor, [MENU_TEXT_RIVER] = gPCText_River, [MENU_TEXT_SKY] = gPCText_Sky, [MENU_TEXT_POLKADOT] = gPCText_PolkaDot, [MENU_TEXT_POKECENTER] = gPCText_Pokecenter, [MENU_TEXT_MACHINE] = gPCText_Machine, [MENU_TEXT_SIMPLE] = gPCText_Simple, }; void InitMenu(void) { gStorage->menuItemsCount = 0; gStorage->menuWidth = 0; gStorage->menuWindow.bg = 0; gStorage->menuWindow.paletteNum = 15; gStorage->menuWindow.baseBlock = 92; } void SetMenuText(u8 textId) { if (gStorage->menuItemsCount < ARRAY_COUNT(gStorage->menuItems)) { u8 len; struct StorageMenu *menu = &gStorage->menuItems[gStorage->menuItemsCount]; menu->text = sMenuTexts[textId]; menu->textId = textId; len = StringLength(menu->text); if (len > gStorage->menuWidth) gStorage->menuWidth = len; gStorage->menuItemsCount++; } } s8 GetMenuItemTextId(u8 menuIndex) { if (menuIndex >= gStorage->menuItemsCount) return MENU_B_PRESSED; else return gStorage->menuItems[menuIndex].textId; } void AddMenu(void) { gStorage->menuWindow.width = gStorage->menuWidth + 2; gStorage->menuWindow.height = 2 * gStorage->menuItemsCount; gStorage->menuWindow.tilemapLeft = 29 - gStorage->menuWindow.width; gStorage->menuWindow.tilemapTop = 15 - gStorage->menuWindow.height; gStorage->menuWindowId = AddWindow(&gStorage->menuWindow); ClearWindowTilemap(gStorage->menuWindowId); DrawStdFrameWithCustomTileAndPalette(gStorage->menuWindowId, FALSE, 11, 14); PrintTextArray(gStorage->menuWindowId, FONT_NORMAL_COPY_1, 8, 2, 16, gStorage->menuItemsCount, (void *)gStorage->menuItems); Menu_InitCursor(gStorage->menuWindowId, FONT_NORMAL_COPY_1, 0, 2, 16, gStorage->menuItemsCount, 0); ScheduleBgCopyTilemapToVram(0); gStorage->menuUnusedField = 0; } bool8 IsMenuLoading(void) { // Possibly stubbed out debug code? return FALSE; } s16 HandleMenuInput(void) { s32 input = MENU_NOTHING_CHOSEN; do { if (JOY_NEW(A_BUTTON)) { input = Menu_GetCursorPos(); break; } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); input = MENU_B_PRESSED; } if (JOY_NEW(DPAD_UP)) { PlaySE(SE_SELECT); Menu_MoveCursor(-1); } else if (JOY_NEW(DPAD_DOWN)) { PlaySE(SE_SELECT); Menu_MoveCursor(1); } } while (FALSE); if (input != MENU_NOTHING_CHOSEN) RemoveMenu(); if (input >= 0) input = gStorage->menuItems[input].textId; return input; } void RemoveMenu(void) { ClearStdWindowAndFrameToTransparent(gStorage->menuWindowId, TRUE); RemoveWindow(gStorage->menuWindowId); } ================================================ FILE: src/pokemon_storage_system_graphics.c ================================================ #include "global.h" #include "gflib.h" #include "event_data.h" #include "graphics.h" #include "new_menu_helpers.h" #include "pokemon_icon.h" #include "pokemon_storage_system_internal.h" #include "strings.h" #include "task.h" #include "trig.h" static void SpriteCB_BoxMonIconScrollOut(struct Sprite *sprite); static void SetBoxSpeciesAndPersonalities(u8 boxId); static void MovePartySpriteToNextSlot(struct Sprite *sprite, u16 idx); static void SpriteCB_MovePartySpriteToNextSlot(struct Sprite *sprite); static void DestroyBoxMonIcon(struct Sprite *sprite); static void SpriteCB_HeldMon(struct Sprite *sprite); static void Task_InitBox(u8 taskId); static s8 DetermineBoxScrollDirection(u8 boxId); static void LoadWallpaperGfx(u8 wallpaperId, s8 direction); static bool32 WaitForWallpaperGfxLoad(void); static void DrawWallpaper(void *unused, const void *tilemap, s8 direction, u8 offset); static void TrimOldWallpaper(void *buffer); static void InitBoxTitle(u8 wallpaperId); static void CreateIncomingBoxTitle(u8 wallpaperId, s8 direction); static void SpriteCB_IncomingBoxTitle(struct Sprite *sprite); static void SpriteCB_OutgoingBoxTitle(struct Sprite *sprite); static s16 GetBoxTitleBaseX(const u8 *boxName); static void CycleBoxTitleSprites(void); static void CycleBoxTitleColor(void); static void CreateBoxScrollArrows(void); static void StartBoxScrollArrowsSlide(s8 direction); static void StopBoxScrollArrowsSlide(void); static void SpriteCB_BoxScrollArrow(struct Sprite *sprite); static const struct OamData sOamData_MonIcon; static const struct SpriteTemplate sSpriteTemplate_MonIcon = { .tileTag = GFXTAG_MON_ICON, .paletteTag = PALTAG_MON_ICON_0, .oam = &sOamData_MonIcon, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_MonIcon = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0x000, .priority = 0, .paletteNum = 0 }; static const union AffineAnimCmd sAffineAnim_ReleaseMon_Release[] = { AFFINEANIMCMD_FRAME(-2, -2, 0, 120), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ReleaseMon_ComeBack[] = { AFFINEANIMCMD_FRAME(16, 16, 0, 0), AFFINEANIMCMD_FRAME(16, 16, 0, 15), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnims_ReleaseMon[] = { [RELEASE_ANIM_RELEASE] = sAffineAnim_ReleaseMon_Release, [RELEASE_ANIM_COME_BACK] = sAffineAnim_ReleaseMon_ComeBack, }; static const u16 sWallpaperPalettes_Forest[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/tiles.gbapal"); static const u32 sWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tilemap.bin.lz"); static const u16 sWallpaperPalettes_City[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/city/tiles.gbapal"); static const u32 sWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Desert[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/tiles.gbapal"); static const u32 sWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Savanna[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/tiles.gbapal"); static const u32 sWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Crag[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/tiles.gbapal"); static const u32 sWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Volcano[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/tiles.gbapal"); static const u32 sWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tiles.4bpp.lz"); static const u8 sUnusedSpace1[4] = {}; static const u32 sWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Snow[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/tiles.gbapal"); static const u32 sWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Cave[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/tiles.gbapal"); static const u32 sWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Beach[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/tiles.gbapal"); static const u32 sWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Seafloor[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/tiles.gbapal"); static const u32 sWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tilemap.bin.lz"); static const u16 sWallpaperPalettes_River[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/river/tiles.gbapal"); static const u32 sWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Sky[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/tiles.gbapal"); static const u32 sWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Stars[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/stars/tiles.gbapal"); static const u8 sUnusedSpace2[32] = {}; static const u32 sWallpaperTiles_Stars[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/stars/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Stars[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/stars/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Pokecenter[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/tiles.gbapal"); static const u32 sWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Tiles[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/tiles/tiles.gbapal"); static const u32 sWallpaperTiles_Tiles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/tiles/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Tiles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/tiles/tilemap.bin.lz"); static const u16 sWallpaperPalettes_Simple[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/simple/tiles.gbapal"); static const u32 sWallpaperTiles_Simple[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/simple/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Simple[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/simple/tilemap.bin.lz"); // Unused static const u16 sWallpaperTilemap_Unused[] = INCBIN_U16("graphics/pokemon_storage/wallpapers/unused.bin"); // Shadow color, text color static const u16 sBoxTitleColors[][2] = { {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE}, {RGB( 7, 7, 7), RGB_WHITE} }; static const struct Wallpaper sWallpapers[] = { {sWallpaperTiles_Forest, sWallpaperTilemap_Forest, *sWallpaperPalettes_Forest }, {sWallpaperTiles_City, sWallpaperTilemap_City, *sWallpaperPalettes_City }, {sWallpaperTiles_Desert, sWallpaperTilemap_Desert, *sWallpaperPalettes_Desert }, {sWallpaperTiles_Savanna, sWallpaperTilemap_Savanna, *sWallpaperPalettes_Savanna }, {sWallpaperTiles_Crag, sWallpaperTilemap_Crag, *sWallpaperPalettes_Crag }, {sWallpaperTiles_Volcano, sWallpaperTilemap_Volcano, *sWallpaperPalettes_Volcano }, {sWallpaperTiles_Snow, sWallpaperTilemap_Snow, *sWallpaperPalettes_Snow }, {sWallpaperTiles_Cave, sWallpaperTilemap_Cave, *sWallpaperPalettes_Cave }, {sWallpaperTiles_Beach, sWallpaperTilemap_Beach, *sWallpaperPalettes_Beach }, {sWallpaperTiles_Seafloor, sWallpaperTilemap_Seafloor, *sWallpaperPalettes_Seafloor }, {sWallpaperTiles_River, sWallpaperTilemap_River, *sWallpaperPalettes_River }, {sWallpaperTiles_Sky, sWallpaperTilemap_Sky, *sWallpaperPalettes_Sky }, {sWallpaperTiles_Stars, sWallpaperTilemap_Stars, *sWallpaperPalettes_Stars }, {sWallpaperTiles_Pokecenter, sWallpaperTilemap_Pokecenter, *sWallpaperPalettes_Pokecenter}, {sWallpaperTiles_Tiles, sWallpaperTilemap_Tiles, *sWallpaperPalettes_Tiles }, {sWallpaperTiles_Simple, sWallpaperTilemap_Simple, *sWallpaperPalettes_Simple }, }; static const u16 sBoxScrollArrow_Gfx[] = INCBIN_U16("graphics/pokemon_storage/box_scroll_arrow.4bpp"); static const u16 sUnusedColor = RGB(26, 29, 8); static const struct SpriteSheet sSpriteSheet_BoxScrollArrow = { sBoxScrollArrow_Gfx, 0x0080, GFXTAG_BOX_SCROLL_ARROW }; static const struct OamData sOamData_BoxTitle = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 2, .paletteNum = 0 }; static const union AnimCmd sAnim_BoxTitle_Left[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd sAnim_BoxTitle_Right[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END }; static const union AnimCmd *const sAnims_BoxTitle[] = { sAnim_BoxTitle_Left, sAnim_BoxTitle_Right, }; static const struct SpriteTemplate sSpriteTemplate_BoxTitle = { .tileTag = GFXTAG_BOX_TITLE, .paletteTag = PALTAG_BOX_TITLE, .oam = &sOamData_BoxTitle, .anims = sAnims_BoxTitle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_BoxScrollArrow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x16), .tileNum = 0x000, .priority = 2, .paletteNum = 0 }; static const union AnimCmd sAnim_BoxScrollArrow_Left[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd sAnim_BoxScrollArrow_Right[] = { ANIMCMD_FRAME(2, 5), ANIMCMD_END }; static const union AnimCmd *const sAnims_BoxScrollArrow[] = { sAnim_BoxScrollArrow_Left, sAnim_BoxScrollArrow_Right, }; static const struct SpriteTemplate sSpriteTemplate_BoxScrollArrow = { .tileTag = GFXTAG_BOX_SCROLL_ARROW, .paletteTag = PALTAG_MISC_2, .oam = &sOamData_BoxScrollArrow, .anims = sAnims_BoxScrollArrow, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_BoxScrollArrow, }; void InitMonIconFields(void) { u16 i; LoadMonIconPalettes(); for (i = 0; i < MAX_MON_ICONS; i++) gStorage->numIconsPerSpecies[i] = 0; for (i = 0; i < MAX_MON_ICONS; i++) gStorage->iconSpeciesList[i] = SPECIES_NONE; for (i = 0; i < PARTY_SIZE; i++) gStorage->partySprites[i] = NULL; for (i = 0; i < IN_BOX_COUNT; i++) gStorage->boxMonsSprites[i] = NULL; gStorage->movingMonSprite = NULL; gStorage->unusedField1 = 0; } static u8 GetMonIconPriorityByCursorArea(void) { return (IsCursorInBox() ? 2 : 1); } void CreateMovingMonIcon(void) { u32 personality = GetMonData(&gStorage->movingMon, MON_DATA_PERSONALITY); u16 species = GetMonData(&gStorage->movingMon, MON_DATA_SPECIES_OR_EGG); u8 priority = GetMonIconPriorityByCursorArea(); gStorage->movingMonSprite = CreateMonIconSprite(species, personality, 0, 0, priority, 7); gStorage->movingMonSprite->callback = SpriteCB_HeldMon; } static void InitBoxMonSprites(u8 boxId) { u8 boxPosition; u16 i, j, count; u16 species; u32 personality; count = 0; boxPosition = 0; for (i = 0; i < IN_BOX_ROWS; i++) { for (j = 0; j < IN_BOX_COLUMNS; j++) { species = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES_OR_EGG); if (species != SPECIES_NONE) { personality = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY); if(species == SPECIES_DEOXYS) species = GetDeoxysSpeciesFromForme(GetBoxMonDataAt(boxId, boxPosition, MON_DATA_FORME)); gStorage->boxMonsSprites[count] = CreateMonIconSprite(species, personality, 8 * (3 * j) + 100, 8 * (3 * i) + 44, 2, 19 - j); } else gStorage->boxMonsSprites[count] = NULL; boxPosition++; count++; } } if (gStorage->boxOption == OPTION_MOVE_ITEMS) { for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++) { if (GetBoxMonDataAt(boxId, boxPosition, MON_DATA_HELD_ITEM) == 0) gStorage->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND; } } } void CreateBoxMonIconAtPos(u8 boxPosition) { u16 species = GetCurrentBoxMonData(boxPosition, MON_DATA_SPECIES_OR_EGG); if (species != SPECIES_NONE) { s16 x = 8 * (3 * (boxPosition % IN_BOX_COLUMNS)) + 100; s16 y = 8 * (3 * (boxPosition / IN_BOX_COLUMNS)) + 44; u32 personality = GetCurrentBoxMonData(boxPosition, MON_DATA_PERSONALITY); if(species == SPECIES_DEOXYS) species = GetDeoxysSpeciesFromForme(GetCurrentBoxMonData(boxPosition, MON_DATA_FORME)); gStorage->boxMonsSprites[boxPosition] = CreateMonIconSprite(species, personality, x, y, 2, 19 - (boxPosition % IN_BOX_COLUMNS)); if (gStorage->boxOption == OPTION_MOVE_ITEMS) gStorage->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND; } } #define sDistance data[1] #define sSpeed data[2] #define sDestX data[3] #define sDelay data[4] #define sPosX data[5] static void StartBoxMonIconsScrollOut(s16 speed) { u16 i; for (i = 0; i < IN_BOX_COUNT; i++) { if (gStorage->boxMonsSprites[i] != NULL) { gStorage->boxMonsSprites[i]->sSpeed = speed; gStorage->boxMonsSprites[i]->sDelay = 1; gStorage->boxMonsSprites[i]->callback = SpriteCB_BoxMonIconScrollOut; } } } static void SpriteCB_BoxMonIconScrollIn(struct Sprite *sprite) { if (sprite->sDistance != 0) { sprite->sDistance--; sprite->x += sprite->sSpeed; } else { gStorage->iconScrollNumIncoming--; sprite->x = sprite->sDestX; sprite->callback = SpriteCallbackDummy; } } static void SpriteCB_BoxMonIconScrollOut(struct Sprite *sprite) { if (sprite->sDelay != 0) sprite->sDelay--; else { sprite->x += sprite->sSpeed; sprite->sPosX = sprite->x + sprite->x2; // Check if mon icon has scrolled out of view of the box area if (sprite->sPosX <= 68 || sprite->sPosX >= 252) sprite->callback = SpriteCallbackDummy; } } static void DestroyAllIconsInColumn(u8 column) { u16 row; u8 boxPosition = column; for (row = 0; row < IN_BOX_ROWS; row++) { if (gStorage->boxMonsSprites[boxPosition] != NULL) { DestroyBoxMonIcon(gStorage->boxMonsSprites[boxPosition]); gStorage->boxMonsSprites[boxPosition] = NULL; } boxPosition += IN_BOX_COLUMNS; } } static u8 CreateBoxMonIconsInColumn(u8 column, u16 distance, s16 speed) { s32 i; u16 y = 44; s16 xDest = 8 * (3 * column) + 100; u16 x = xDest - ((distance + 1) * speed); u8 subpriority = 19 - column; u8 count = 0; u8 boxPosition = column; u16 species; if (gStorage->boxOption != OPTION_MOVE_ITEMS) { for (i = 0; i < IN_BOX_ROWS; i++) { if (gStorage->boxSpecies[boxPosition] != SPECIES_NONE) { species = gStorage->boxSpecies[boxPosition]; if(species == SPECIES_DEOXYS) species = GetDeoxysSpeciesFromForme(GetCurrentBoxMonData(boxPosition, MON_DATA_FORME)); gStorage->boxMonsSprites[boxPosition] = CreateMonIconSprite(species, gStorage->boxPersonalities[boxPosition], x, y, 2, subpriority); if (gStorage->boxMonsSprites[boxPosition] != NULL) { gStorage->boxMonsSprites[boxPosition]->sDistance = distance; gStorage->boxMonsSprites[boxPosition]->sSpeed = speed; gStorage->boxMonsSprites[boxPosition]->sDestX = xDest; gStorage->boxMonsSprites[boxPosition]->callback = SpriteCB_BoxMonIconScrollIn; count++; } } boxPosition += IN_BOX_COLUMNS; y += 24; } } else { for (i = 0; i < IN_BOX_ROWS; i++) { if (gStorage->boxSpecies[boxPosition] != SPECIES_NONE) { species = gStorage->boxSpecies[boxPosition]; if(species == SPECIES_DEOXYS) species = GetDeoxysSpeciesFromForme(GetCurrentBoxMonData(boxPosition, MON_DATA_FORME)); gStorage->boxMonsSprites[boxPosition] = CreateMonIconSprite(species, gStorage->boxPersonalities[boxPosition], x, y, 2, subpriority); if (gStorage->boxMonsSprites[boxPosition] != NULL) { gStorage->boxMonsSprites[boxPosition]->sDistance = distance; gStorage->boxMonsSprites[boxPosition]->sSpeed = speed; gStorage->boxMonsSprites[boxPosition]->sDestX = xDest; gStorage->boxMonsSprites[boxPosition]->callback = SpriteCB_BoxMonIconScrollIn; if (GetBoxMonDataAt(gStorage->incomingBoxId, boxPosition, MON_DATA_HELD_ITEM) == 0) gStorage->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND; count++; } } boxPosition += IN_BOX_COLUMNS; y += 24; } } return count; } #undef sDistance #undef sSpeed #undef sDestX #undef sDelay #undef sPosX static void InitBoxMonIconScroll(u8 boxId, s8 direction) { gStorage->iconScrollState = 0; gStorage->iconScrollToBoxId = boxId; gStorage->iconScrollDirection = direction; gStorage->iconScrollDistance = 32; gStorage->iconScrollSpeed = -(6 * direction); gStorage->iconScrollNumIncoming = 0; SetBoxSpeciesAndPersonalities(boxId); if (direction > 0) gStorage->iconScrollCurColumn = 0; else gStorage->iconScrollCurColumn = IN_BOX_COLUMNS - 1; gStorage->iconScrollPos = (24 * gStorage->iconScrollCurColumn) + 100; StartBoxMonIconsScrollOut(gStorage->iconScrollSpeed); } static bool8 UpdateBoxMonIconScroll(void) { if (gStorage->iconScrollDistance != 0) gStorage->iconScrollDistance--; switch (gStorage->iconScrollState) { case 0: gStorage->iconScrollPos += gStorage->iconScrollSpeed; if (gStorage->iconScrollPos <= 64 || gStorage->iconScrollPos >= 252) { // A column of icons has gone offscreen, destroy them DestroyAllIconsInColumn(gStorage->iconScrollCurColumn); gStorage->iconScrollPos += gStorage->iconScrollDirection * 24; gStorage->iconScrollState++; } break; case 1: // Create the new incoming column of icons gStorage->iconScrollPos += gStorage->iconScrollSpeed; gStorage->iconScrollNumIncoming += CreateBoxMonIconsInColumn(gStorage->iconScrollCurColumn, gStorage->iconScrollDistance, gStorage->iconScrollSpeed); if ((gStorage->iconScrollDirection > 0 && gStorage->iconScrollCurColumn == IN_BOX_COLUMNS - 1) || (gStorage->iconScrollDirection < 0 && gStorage->iconScrollCurColumn == 0)) { // Scroll has reached final column gStorage->iconScrollState++; } else { // Continue scrolling gStorage->iconScrollCurColumn += gStorage->iconScrollDirection; gStorage->iconScrollState = 0; } break; case 2: // Wait to make sure all icons have arrived if (gStorage->iconScrollNumIncoming == 0) { gStorage->iconScrollDistance++; return FALSE; } break; default: return FALSE; } return TRUE; } static void SetBoxSpeciesAndPersonalities(u8 boxId) { s32 i, j, boxPosition; boxPosition = 0; for (i = 0; i < IN_BOX_ROWS; i++) { for (j = 0; j < IN_BOX_COLUMNS; j++) { gStorage->boxSpecies[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES_OR_EGG); if (gStorage->boxSpecies[boxPosition] != SPECIES_NONE) { if(gStorage->boxSpecies[boxPosition] == SPECIES_DEOXYS) { gStorage->boxSpecies[boxPosition] = GetDeoxysSpeciesFromForme(GetBoxMonDataAt(boxId, boxPosition, MON_DATA_FORME)); } gStorage->boxPersonalities[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY); } boxPosition++; } } gStorage->incomingBoxId = boxId; } void DestroyBoxMonIconAtPosition(u8 boxPosition) { if (gStorage->boxMonsSprites[boxPosition] != NULL) { DestroyBoxMonIcon(gStorage->boxMonsSprites[boxPosition]); gStorage->boxMonsSprites[boxPosition] = NULL; } } void SetBoxMonIconObjMode(u8 boxPosition, u8 objMode) { if (gStorage->boxMonsSprites[boxPosition] != NULL) { gStorage->boxMonsSprites[boxPosition]->oam.objMode = objMode; } } void CreatePartyMonsSprites(bool8 visible) { u16 i, count; u16 species = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES_OR_EGG); u32 personality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY); if(species == SPECIES_DEOXYS) species = GetDeoxysSpeciesFromForme(GetMonData(&gPlayerParty[0], MON_DATA_FORME)); gStorage->partySprites[0] = CreateMonIconSprite(species, personality, 104, 64, 1, 12); count = 1; for (i = 1; i < PARTY_SIZE; i++) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); if(species == SPECIES_DEOXYS) species = GetDeoxysSpeciesFromForme(GetMonData(&gPlayerParty[i], MON_DATA_FORME)); if (species != SPECIES_NONE) { personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); gStorage->partySprites[i] = CreateMonIconSprite(species, personality, 152, 8 * (3 * (i - 1)) + 16, 1, 12); count++; } else gStorage->partySprites[i] = NULL; } if (!visible) { for (i = 0; i < count; i++) { gStorage->partySprites[i]->y -= 160; gStorage->partySprites[i]->invisible = TRUE; } } if (gStorage->boxOption == OPTION_MOVE_ITEMS) { for (i = 0; i < PARTY_SIZE; i++) { if (gStorage->partySprites[i] != NULL && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == 0) gStorage->partySprites[i]->oam.objMode = ST_OAM_OBJ_BLEND; } } } void CompactPartySprites(void) { u16 i, targetPartyId; gStorage->numPartySpritesToCompact = 0; for (i = 0, targetPartyId = 0; i < PARTY_SIZE; i++) { if (gStorage->partySprites[i] != NULL) { if (i != targetPartyId) { MovePartySpriteToNextSlot(gStorage->partySprites[i], targetPartyId); gStorage->partySprites[i] = NULL; gStorage->numPartySpritesToCompact++; } targetPartyId++; } } } u8 GetNumPartySpritesCompacting(void) { return gStorage->numPartySpritesToCompact; } #define sPartyId data[1] #define sMonX data[2] #define sMonY data[3] #define sSpeedX data[4] #define sSpeedY data[5] #define sMoveSteps data[6] static void MovePartySpriteToNextSlot(struct Sprite *sprite, u16 partyId) { s16 x, y; sprite->sPartyId = partyId; if (partyId == 0) x = 104, y = 64; else x = 152, y = 8 * (3 * (partyId - 1)) + 16; sprite->sMonX = (u16)(sprite->x) * 8; sprite->sMonY = (u16)(sprite->y) * 8; sprite->sSpeedX = ((x * 8) - sprite->sMonX) / 8; sprite->sSpeedY = ((y * 8) - sprite->sMonY) / 8; sprite->sMoveSteps = 8; sprite->callback = SpriteCB_MovePartySpriteToNextSlot; } static void SpriteCB_MovePartySpriteToNextSlot(struct Sprite *sprite) { if (sprite->sMoveSteps != 0) { s16 x = sprite->sMonX += sprite->sSpeedX; s16 y = sprite->sMonY += sprite->sSpeedY; sprite->x = x / 8u; sprite->y = y / 8u; sprite->sMoveSteps--; } else { if (sprite->sPartyId == 0) { sprite->x = 104; sprite->y = 64; } else { sprite->x = 152; sprite->y = 8 * (3 * (sprite->sPartyId - 1)) + 16; } sprite->callback = SpriteCallbackDummy; gStorage->partySprites[sprite->sPartyId] = sprite; gStorage->numPartySpritesToCompact--; } } #undef sPartyId #undef sMonX #undef sMonY #undef sSpeedX #undef sSpeedY #undef sMoveSteps void DestroyMovingMonIcon(void) { if (gStorage->movingMonSprite != NULL) { DestroyBoxMonIcon(gStorage->movingMonSprite); gStorage->movingMonSprite = NULL; } } void MovePartySprites(s16 yDelta) { u16 i, posY; for (i = 0; i < PARTY_SIZE; i++) { if (gStorage->partySprites[i] != NULL) { gStorage->partySprites[i]->y += yDelta; posY = gStorage->partySprites[i]->y + gStorage->partySprites[i]->y2 + gStorage->partySprites[i]->centerToCornerVecY; posY += 16; if (posY > 192) gStorage->partySprites[i]->invisible = TRUE; else gStorage->partySprites[i]->invisible = FALSE; } } } void DestroyPartyMonIcon(u8 partyId) { if (gStorage->partySprites[partyId] != NULL) { DestroyBoxMonIcon(gStorage->partySprites[partyId]); gStorage->partySprites[partyId] = NULL; } } void DestroyAllPartyMonIcons(void) { u16 i; for (i = 0; i < PARTY_SIZE; i++) { if (gStorage->partySprites[i] != NULL) { DestroyBoxMonIcon(gStorage->partySprites[i]); gStorage->partySprites[i] = NULL; } } } void SetPartyMonIconObjMode(u8 partyId, u8 objMode) { if (gStorage->partySprites[partyId] != NULL) gStorage->partySprites[partyId]->oam.objMode = objMode; } void SetMovingMonSprite(u8 mode, u8 id) { if (mode == MODE_PARTY) { gStorage->movingMonSprite = gStorage->partySprites[id]; gStorage->partySprites[id] = NULL; } else if (mode == MODE_BOX) { gStorage->movingMonSprite = gStorage->boxMonsSprites[id]; gStorage->boxMonsSprites[id] = NULL; } else return; gStorage->movingMonSprite->callback = SpriteCB_HeldMon; gStorage->movingMonSprite->oam.priority = GetMonIconPriorityByCursorArea(); gStorage->movingMonSprite->subpriority = 7; } void SetPlacedMonSprite(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) // party mon { gStorage->partySprites[position] = gStorage->movingMonSprite; gStorage->partySprites[position]->oam.priority = 1; gStorage->partySprites[position]->subpriority = 12; } else { gStorage->boxMonsSprites[position] = gStorage->movingMonSprite; gStorage->boxMonsSprites[position]->oam.priority = 2; gStorage->boxMonsSprites[position]->subpriority = 19 - (position % IN_BOX_COLUMNS); } gStorage->movingMonSprite->callback = SpriteCallbackDummy; gStorage->movingMonSprite = NULL; } void SetShiftMonSpritePtr(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) // party mon gStorage->shiftMonSpritePtr = &gStorage->partySprites[position]; else gStorage->shiftMonSpritePtr = &gStorage->boxMonsSprites[position]; gStorage->movingMonSprite->callback = SpriteCallbackDummy; gStorage->shiftTimer = 0; } bool8 ShiftMons(void) { if (gStorage->shiftTimer == 16) return FALSE; gStorage->shiftTimer++; if (gStorage->shiftTimer & 1) { (*gStorage->shiftMonSpritePtr)->y--; gStorage->movingMonSprite->y++; } (*gStorage->shiftMonSpritePtr)->x2 = gSineTable[gStorage->shiftTimer * 8] / 16; gStorage->movingMonSprite->x2 = -(gSineTable[gStorage->shiftTimer * 8] / 16); if (gStorage->shiftTimer == 8) { gStorage->movingMonSprite->oam.priority = (*gStorage->shiftMonSpritePtr)->oam.priority; gStorage->movingMonSprite->subpriority = (*gStorage->shiftMonSpritePtr)->subpriority; (*gStorage->shiftMonSpritePtr)->oam.priority = GetMonIconPriorityByCursorArea(); (*gStorage->shiftMonSpritePtr)->subpriority = 7; } if (gStorage->shiftTimer == 16) { struct Sprite *sprite = gStorage->movingMonSprite; gStorage->movingMonSprite = (*gStorage->shiftMonSpritePtr); *gStorage->shiftMonSpritePtr = sprite; gStorage->movingMonSprite->callback = SpriteCB_HeldMon; (*gStorage->shiftMonSpritePtr)->callback = SpriteCallbackDummy; } return TRUE; } void DoReleaseMonAnim(u8 mode, u8 position) { switch (mode) { case MODE_PARTY: gStorage->releaseMonSpritePtr = &gStorage->partySprites[position]; break; case MODE_BOX: gStorage->releaseMonSpritePtr = &gStorage->boxMonsSprites[position]; break; case MODE_MOVE: gStorage->releaseMonSpritePtr = &gStorage->movingMonSprite; break; default: return; } if (*gStorage->releaseMonSpritePtr != NULL) { InitSpriteAffineAnim(*gStorage->releaseMonSpritePtr); (*gStorage->releaseMonSpritePtr)->oam.affineMode = ST_OAM_AFFINE_NORMAL; (*gStorage->releaseMonSpritePtr)->affineAnims = sAffineAnims_ReleaseMon; StartSpriteAffineAnim(*gStorage->releaseMonSpritePtr, RELEASE_ANIM_RELEASE); } } bool8 TryHideReleaseMonSprite(void) { if (*gStorage->releaseMonSpritePtr == NULL || (*gStorage->releaseMonSpritePtr)->invisible) return FALSE; if ((*gStorage->releaseMonSpritePtr)->affineAnimEnded) (*gStorage->releaseMonSpritePtr)->invisible = TRUE; return TRUE; } void DestroyReleaseMonIcon(void) { if (*gStorage->releaseMonSpritePtr != NULL) { FreeOamMatrix((*gStorage->releaseMonSpritePtr)->oam.matrixNum); DestroyBoxMonIcon(*gStorage->releaseMonSpritePtr); *gStorage->releaseMonSpritePtr = NULL; } } void DoReleaseMonComeBackAnim(void) { if (*gStorage->releaseMonSpritePtr != NULL) { (*gStorage->releaseMonSpritePtr)->invisible = FALSE; StartSpriteAffineAnim(*gStorage->releaseMonSpritePtr, RELEASE_ANIM_COME_BACK); } } bool8 ResetReleaseMonSpritePtr(void) { if (gStorage->releaseMonSpritePtr == NULL) return FALSE; if ((*gStorage->releaseMonSpritePtr)->affineAnimEnded) gStorage->releaseMonSpritePtr = NULL; return TRUE; } void SetMovingMonPriority(u8 priority) { gStorage->movingMonSprite->oam.priority = priority; } static void SpriteCB_HeldMon(struct Sprite *sprite) { sprite->x = gStorage->cursorSprite->x; sprite->y = gStorage->cursorSprite->y + gStorage->cursorSprite->y2 + 4; } static u16 TryLoadMonIconTiles(u16 species) { u16 i, offset; // Find the currently-allocated slot for (i = 0; i < MAX_MON_ICONS; i++) { if (gStorage->iconSpeciesList[i] == species) break; } if (i == MAX_MON_ICONS) { // Find the first empty slot for (i = 0; i < MAX_MON_ICONS; i++) { if (gStorage->iconSpeciesList[i] == SPECIES_NONE) break; } if (i == MAX_MON_ICONS) return 0xFFFF; } gStorage->iconSpeciesList[i] = species; gStorage->numIconsPerSpecies[i]++; offset = 16 * i; CpuCopy32(GetMonIconTiles(species, TRUE), (void *)(OBJ_VRAM0) + offset * 32, 0x200); return offset; } static void RemoveSpeciesFromIconList(u16 species) { u16 i; for (i = 0; i < MAX_MON_ICONS; i++) { if (gStorage->iconSpeciesList[i] == species) { if (--gStorage->numIconsPerSpecies[i] == 0) gStorage->iconSpeciesList[i] = SPECIES_NONE; break; } } } struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority) { u16 tileNum; u8 spriteId; struct SpriteTemplate template = sSpriteTemplate_MonIcon; species = GetIconSpecies(species, personality); template.paletteTag = PALTAG_MON_ICON_0 + gMonIconPaletteIndices[species]; if(species >= 65530 && species <= 65533) { template.paletteTag = 0xDAC0 + gMonIconPaletteIndices[SPECIES_DEOXYS]; } tileNum = TryLoadMonIconTiles(species); if (tileNum == 0xFFFF) return NULL; spriteId = CreateSprite(&template, x, y, subpriority); if (spriteId == MAX_SPRITES) { RemoveSpeciesFromIconList(species); return NULL; } gSprites[spriteId].oam.tileNum = tileNum; gSprites[spriteId].oam.priority = oamPriority; gSprites[spriteId].data[0] = species; return &gSprites[spriteId]; } static void DestroyBoxMonIcon(struct Sprite *sprite) { RemoveSpeciesFromIconList(sprite->data[0]); DestroySprite(sprite); } #define tState data[0] #define tDmaIdx data[1] #define tBoxId data[2] void CreateInitBoxTask(u8 boxId) { u8 taskId = CreateTask(Task_InitBox, 2); gTasks[taskId].tBoxId = boxId; } bool8 IsInitBoxActive(void) { return FuncIsActiveTask(Task_InitBox); } static void Task_InitBox(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: gStorage->wallpaperOffset = 0; gStorage->bg2_X = 0; task->tDmaIdx = RequestDma3Fill(0, gStorage->wallpaperBgTilemapBuffer, sizeof(gStorage->wallpaperBgTilemapBuffer), DMA3_32BIT); break; case 1: if (WaitDma3Request(task->tDmaIdx) == -1) return; SetBgTilemapBuffer(2, gStorage->wallpaperBgTilemapBuffer); ShowBg(2); break; case 2: LoadWallpaperGfx(task->tBoxId, 0); break; case 3: if (!WaitForWallpaperGfxLoad()) return; InitBoxTitle(task->tBoxId); CreateBoxScrollArrows(); InitBoxMonSprites(task->tBoxId); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(27) | BGCNT_TXT512x256); break; case 4: DestroyTask(taskId); break; default: task->tState = 0; return; } task->tState++; } #undef tState #undef tDmaIdx #undef tBoxId void SetUpScrollToBox(u8 boxId) { s8 direction = DetermineBoxScrollDirection(boxId); gStorage->scrollSpeed = (direction > 0) ? 6 : -6; gStorage->scrollUnused1 = (direction > 0) ? 1 : 2; gStorage->scrollTimer = 32; gStorage->scrollToBoxIdUnused = boxId; gStorage->scrollUnused2 = (direction <= 0) ? 5 : 0; gStorage->scrollDirectionUnused = direction; gStorage->scrollUnused3 = (direction > 0) ? 264 : 56; gStorage->scrollUnused4 = (direction <= 0) ? 5 : 0; gStorage->scrollUnused5 = 0; gStorage->scrollUnused6 = 2; gStorage->scrollToBoxId = boxId; gStorage->scrollDirection = direction; gStorage->scrollState = 0; } bool8 ScrollToBox(void) { bool8 isStillScrolling; switch (gStorage->scrollState) { case 0: LoadWallpaperGfx(gStorage->scrollToBoxId, gStorage->scrollDirection); gStorage->scrollState++; case 1: if (!WaitForWallpaperGfxLoad()) return TRUE; InitBoxMonIconScroll(gStorage->scrollToBoxId, gStorage->scrollDirection); CreateIncomingBoxTitle(gStorage->scrollToBoxId, gStorage->scrollDirection); StartBoxScrollArrowsSlide(gStorage->scrollDirection); break; case 2: isStillScrolling = UpdateBoxMonIconScroll(); if (gStorage->scrollTimer != 0) { gStorage->bg2_X += gStorage->scrollSpeed; if (--gStorage->scrollTimer != 0) return TRUE; CycleBoxTitleSprites(); StopBoxScrollArrowsSlide(); } return isStillScrolling; } gStorage->scrollState++; return TRUE; } static s8 DetermineBoxScrollDirection(u8 boxId) { u8 i; u8 currentBox = StorageGetCurrentBox(); for (i = 0; currentBox != boxId; i++) { currentBox++; if (currentBox >= TOTAL_BOXES_COUNT) currentBox = 0; } return (i < TOTAL_BOXES_COUNT / 2) ? 1 : -1; } void SetWallpaperForCurrentBox(u8 wallpaperId) { SetBoxWallpaper(StorageGetCurrentBox(), wallpaperId); gStorage->wallpaperChangeState = 0; } bool8 DoWallpaperGfxChange(void) { switch (gStorage->wallpaperChangeState) { case 0: BeginNormalPaletteFade(gStorage->wallpaperPalBits, 1, 0, 16, RGB_WHITEALPHA); gStorage->wallpaperChangeState++; break; case 1: if (!UpdatePaletteFade()) { u8 curBox = StorageGetCurrentBox(); LoadWallpaperGfx(curBox, 0); gStorage->wallpaperChangeState++; } break; case 2: if (WaitForWallpaperGfxLoad() == TRUE) { CycleBoxTitleColor(); BeginNormalPaletteFade(gStorage->wallpaperPalBits, 1, 16, 0, RGB_WHITEALPHA); gStorage->wallpaperChangeState++; } break; case 3: if (!UpdatePaletteFade()) gStorage->wallpaperChangeState++; break; case 4: return FALSE; } return TRUE; } static void LoadWallpaperGfx(u8 boxId, s8 direction) { u8 wallpaperId; const struct Wallpaper *wallpaper; gStorage->wallpaperLoadState = 0; gStorage->wallpaperLoadBoxId = boxId; gStorage->wallpaperLoadDir = direction; if (gStorage->wallpaperLoadDir != 0) { gStorage->wallpaperOffset = !gStorage->wallpaperOffset; TrimOldWallpaper(gStorage->wallpaperBgTilemapBuffer); } wallpaperId = GetBoxWallpaper(gStorage->wallpaperLoadBoxId); wallpaper = &sWallpapers[wallpaperId]; LZ77UnCompWram(wallpaper->tileMap, gStorage->wallpaperTilemap); DrawWallpaper(gStorage->wallpaperBgTilemapBuffer, gStorage->wallpaperTilemap, gStorage->wallpaperLoadDir, gStorage->wallpaperOffset); if (gStorage->wallpaperLoadDir != 0) LoadPalette(wallpaper->palettes, BG_PLTT_ID(4) + BG_PLTT_ID(gStorage->wallpaperOffset * 2), 2 * PLTT_SIZE_4BPP); else CpuCopy16(wallpaper->palettes, &gPlttBufferUnfaded[BG_PLTT_ID(4) + BG_PLTT_ID(gStorage->wallpaperOffset * 2)], 2 * PLTT_SIZE_4BPP); DecompressAndLoadBgGfxUsingHeap(2, wallpaper->tiles, 0, 256 * gStorage->wallpaperOffset, 0); CopyBgTilemapBufferToVram(2); } static bool32 WaitForWallpaperGfxLoad(void) { if (IsDma3ManagerBusyWithBgCopy() == TRUE) return FALSE; return TRUE; } static void DrawWallpaper(void *unused, const void *tilemap, s8 direction, u8 offset) { s16 paletteNum = (offset * 2) + 3; s16 x = ((gStorage->bg2_X / 8 + 10) + (direction * 24)) & 0x3F; CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 20, 18, x, 2, 20, 18, 17, offset << 8, paletteNum); if (direction == 0) return; else if (direction > 0) x *= 1, x += 20; // x * 1 is needed to match else x -= 4; FillBgTilemapBufferRect(2, 0, x, 2, 4, 18, 17); } static void TrimOldWallpaper(void *tilemapBuffer) { u16 i; u16 *dest = tilemapBuffer; s16 right = ((gStorage->bg2_X / 8 + 10) + 20) & 0x3F; if (right < 32) dest += right + 0x260; else dest += right + 0x640; for (i = 0; i < 44; i++) { *dest++ = 0; right = (right + 1) & 0x3F; if (right == 0) dest -= 0x420; if (right == 32) dest += 0x3e0; } } static void InitBoxTitle(u8 boxId) { u8 tagIndex; s16 x; u16 i; struct SpriteSheet spriteSheet = {gStorage->boxTitleTiles, 0x200, GFXTAG_BOX_TITLE}; struct SpritePalette palettes[] = { {gStorage->boxTitlePal, PALTAG_BOX_TITLE}, {} }; u16 wallpaperId = GetBoxWallpaper(boxId); gStorage->boxTitlePal[14] = sBoxTitleColors[wallpaperId][0]; gStorage->boxTitlePal[15] = sBoxTitleColors[wallpaperId][1]; LoadSpritePalettes(palettes); gStorage->wallpaperPalBits = 0x3F0; tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE); gStorage->boxTitlePalOffset = OBJ_PLTT_ID(tagIndex) + 14; gStorage->wallpaperPalBits |= (1 << 16) << tagIndex; tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE); gStorage->boxTitleAltPalOffset = OBJ_PLTT_ID(tagIndex) + 14; gStorage->wallpaperPalBits |= (1 << 16) << tagIndex; StringCopyPadded(gStorage->boxTitleText, GetBoxNamePtr(boxId), 0, 8); DrawTextWindowAndBufferTiles(gStorage->boxTitleText, gStorage->boxTitleTiles, 0, 0, gStorage->boxTitleUnused, 2); LoadSpriteSheet(&spriteSheet); x = GetBoxTitleBaseX(GetBoxNamePtr(boxId)); for (i = 0; i < 2; i++) { u8 spriteId = CreateSprite(&sSpriteTemplate_BoxTitle, x + i * 32, 28, 24); gStorage->curBoxTitleSprites[i] = &gSprites[spriteId]; StartSpriteAnim(gStorage->curBoxTitleSprites[i], i); } gStorage->boxTitleCycleId = 0; } static void CreateIncomingBoxTitle(u8 boxId, s8 direction) { u16 palOffset; s16 x, adjustedX; u16 i; struct SpriteSheet spriteSheet = {gStorage->boxTitleTiles, 0x200, GFXTAG_BOX_TITLE}; struct SpriteTemplate template = sSpriteTemplate_BoxTitle; gStorage->boxTitleCycleId = !gStorage->boxTitleCycleId; if (gStorage->boxTitleCycleId == 0) { spriteSheet.tag = GFXTAG_BOX_TITLE; palOffset = gStorage->boxTitlePalOffset; } else { spriteSheet.tag = GFXTAG_BOX_TITLE_ALT; palOffset = gStorage->boxTitlePalOffset; template.tileTag = GFXTAG_BOX_TITLE_ALT; template.paletteTag = PALTAG_BOX_TITLE; } StringCopyPadded(gStorage->boxTitleText, GetBoxNamePtr(boxId), 0, BOX_NAME_LENGTH); DrawTextWindowAndBufferTiles(gStorage->boxTitleText, gStorage->boxTitleTiles, 0, 0, gStorage->boxTitleUnused, 2); LoadSpriteSheet(&spriteSheet); LoadPalette(sBoxTitleColors[GetBoxWallpaper(boxId)], palOffset, sizeof(sBoxTitleColors[0])); x = GetBoxTitleBaseX(GetBoxNamePtr(boxId)); adjustedX = x; adjustedX += direction * 192; // Title is split across two sprites for (i = 0; i < 2; i++) { u8 spriteId = CreateSprite(&template, i * 32 + adjustedX, 28, 24); gStorage->nextBoxTitleSprites[i] = &gSprites[spriteId]; gStorage->nextBoxTitleSprites[i]->data[0] = (-direction) * 6; gStorage->nextBoxTitleSprites[i]->data[1] = i * 32 + x; gStorage->nextBoxTitleSprites[i]->data[2] = 0; gStorage->nextBoxTitleSprites[i]->callback = SpriteCB_IncomingBoxTitle; StartSpriteAnim(gStorage->nextBoxTitleSprites[i], i); gStorage->curBoxTitleSprites[i]->data[0] = (-direction) * 6; gStorage->curBoxTitleSprites[i]->data[1] = 1; gStorage->curBoxTitleSprites[i]->callback = SpriteCB_OutgoingBoxTitle; } } static void CycleBoxTitleSprites(void) { if (gStorage->boxTitleCycleId == 0) FreeSpriteTilesByTag(GFXTAG_BOX_TITLE_ALT); else FreeSpriteTilesByTag(GFXTAG_BOX_TITLE); gStorage->curBoxTitleSprites[0] = gStorage->nextBoxTitleSprites[0]; gStorage->curBoxTitleSprites[1] = gStorage->nextBoxTitleSprites[1]; } static void SpriteCB_IncomingBoxTitle(struct Sprite *sprite) { if (sprite->data[2] != 0) sprite->data[2]--; else if ((sprite->x += sprite->data[0]) == sprite->data[1]) sprite->callback = SpriteCallbackDummy; } static void SpriteCB_OutgoingBoxTitle(struct Sprite *sprite) { if (sprite->data[1] != 0) sprite->data[1]--; else { sprite->x += sprite->data[0]; sprite->data[2] = sprite->x + sprite->x2; if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100) DestroySprite(sprite); } } static void CycleBoxTitleColor(void) { u8 boxId = StorageGetCurrentBox(); u8 wallpaperId = GetBoxWallpaper(boxId); if (gStorage->boxTitleCycleId == 0) CpuCopy16(sBoxTitleColors[wallpaperId], &gPlttBufferUnfaded[gStorage->boxTitlePalOffset], PLTT_SIZEOF(2)); else CpuCopy16(sBoxTitleColors[wallpaperId], &gPlttBufferUnfaded[gStorage->boxTitleAltPalOffset], PLTT_SIZEOF(2)); } static s16 GetBoxTitleBaseX(const u8 *string) { return DISPLAY_WIDTH - 64 - GetStringWidth(FONT_NORMAL_COPY_1, string, 0) / 2; } // Sprite data for box scroll arrows #define sState data[0] #define sTimer data[1] #define sSpeed data[3] static void CreateBoxScrollArrows(void) { u16 i; LoadSpriteSheet(&sSpriteSheet_BoxScrollArrow); for (i = 0; i < 2; i++) { u8 spriteId = CreateSprite(&sSpriteTemplate_BoxScrollArrow, 92 + i * 136, 28, 22); if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; StartSpriteAnim(sprite, i); sprite->sSpeed = (i == 0) ? -1 : 1; gStorage->arrowSprites[i] = sprite; } } if (IsCursorOnBoxTitle()) AnimateBoxScrollArrows(TRUE); } // Slide box scroll arrows horizontally for box change static void StartBoxScrollArrowsSlide(s8 direction) { u16 i; for (i = 0; i < 2; i++) { gStorage->arrowSprites[i]->x2 = 0; gStorage->arrowSprites[i]->sState = 2; } if (direction < 0) { gStorage->arrowSprites[0]->sTimer = 29; gStorage->arrowSprites[1]->sTimer = 5; gStorage->arrowSprites[0]->data[2] = 72; gStorage->arrowSprites[1]->data[2] = 72; } else { gStorage->arrowSprites[0]->sTimer = 5; gStorage->arrowSprites[1]->sTimer = 29; gStorage->arrowSprites[0]->data[2] = DISPLAY_WIDTH + 8; gStorage->arrowSprites[1]->data[2] = DISPLAY_WIDTH + 8; } gStorage->arrowSprites[0]->data[7] = 0; gStorage->arrowSprites[1]->data[7] = 1; } // New box's scroll arrows have entered, stop sliding and set their position static void StopBoxScrollArrowsSlide(void) { u16 i; for (i = 0; i < 2; i++) { gStorage->arrowSprites[i]->x = 136 * i + 92; gStorage->arrowSprites[i]->x2 = 0; gStorage->arrowSprites[i]->invisible = FALSE; } AnimateBoxScrollArrows(TRUE); } // Bounce scroll arrows while title is selected void AnimateBoxScrollArrows(bool8 animate) { u16 i; if (animate) { // Start arrows moving for (i = 0; i < 2; i++) { gStorage->arrowSprites[i]->sState = 1; gStorage->arrowSprites[i]->sTimer = 0; gStorage->arrowSprites[i]->data[2] = 0; gStorage->arrowSprites[i]->data[4] = 0; } } else { // Stop arrows moving for (i = 0; i < 2; i++) gStorage->arrowSprites[i]->sState = 0; } } static void SpriteCB_BoxScrollArrow(struct Sprite *sprite) { switch (sprite->sState) { case 0: sprite->x2 = 0; break; case 1: if (++sprite->sTimer > 3) { sprite->sTimer = 0; sprite->x2 += sprite->sSpeed; if (++sprite->data[2] > 5) { sprite->data[2] = 0; sprite->x2 = 0; } } break; case 2: sprite->sState = 3; break; case 3: sprite->x -= gStorage->scrollSpeed; if (sprite->x <= 72 || sprite->x >= DISPLAY_WIDTH + 8) sprite->invisible = TRUE; if (--sprite->sTimer == 0) { sprite->x = sprite->data[2]; sprite->invisible = FALSE; sprite->sState = 4; } break; case 4: sprite->x -= gStorage->scrollSpeed; break; } } #undef sState #undef sTimer #undef sSpeed // Arrows for Deposit/Jump Box selection struct Sprite *CreateChooseBoxArrows(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority) { u8 spriteId = CreateSprite(&sSpriteTemplate_BoxScrollArrow, x, y, subpriority); if (spriteId == MAX_SPRITES) return NULL; animId %= 2; StartSpriteAnim(&gSprites[spriteId], animId); gSprites[spriteId].oam.priority = priority; gSprites[spriteId].callback = SpriteCallbackDummy; return &gSprites[spriteId]; } ================================================ FILE: src/pokemon_storage_system_menu.c ================================================ #include "global.h" #include "gflib.h" #include "event_data.h" #include "field_fadetransition.h" #include "field_weather.h" #include "help_system.h" #include "menu.h" #include "new_menu_helpers.h" #include "overworld.h" #include "pokemon_storage_system_internal.h" #include "script.h" #include "strings.h" #include "task.h" #include "constants/songs.h" #include "constants/field_weather.h" #include "constants/help_system.h" static EWRAM_DATA u8 sPreviousBoxOption = 0; static EWRAM_DATA struct ChooseBoxMenu *sChooseBoxMenu = NULL; static void CreatePCMainMenu(u8 whichMenu, s16 *windowIdPtr); static void ChooseBoxMenu_CreateSprites(u8 curBox); static void ChooseBoxMenu_DestroySprites(void); static void ChooseBoxMenu_MoveRight(void); static void ChooseBoxMenu_MoveLeft(void); static void ChooseBoxMenu_PrintBoxNameAndCount(void); static void ChooseBoxMenu_PrintTextToSprite(const u8 *a0, u16 x, u16 y); static void SpriteCB_ChooseBoxArrow(struct Sprite *sprite); static const u16 sChooseBoxMenu_Pal[]; static const u8 sChooseBoxMenuCenter_Gfx[]; static const u8 sChooseBoxMenuCorners_Gfx[]; struct { const u8 *text; const u8 *desc; } static const sMainMenuTexts[OPTIONS_COUNT] = { [OPTION_WITHDRAW] = {gText_WithdrawPokemon, gText_WithdrawMonDescription}, [OPTION_DEPOSIT] = {gText_DepositPokemon, gText_DepositMonDescription}, [OPTION_MOVE_MONS] = {gText_MovePokemon, gText_MoveMonDescription}, [OPTION_MOVE_ITEMS] = {gText_MoveItems, gText_MoveItemsDescription}, [OPTION_EXIT] = {gText_SeeYa, gText_SeeYaDescription} }; void DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero2, u8 *unused, s32 bytesToBuffer) { s32 i, tileBytesToBuffer, remainingBytes; u16 windowId; u8 txtColor[3]; u8 *tileData1, *tileData2; struct WindowTemplate winTemplate = {0}; winTemplate.width = 24; winTemplate.height = 2; windowId = AddWindow(&winTemplate); FillWindowPixelBuffer(windowId, PIXEL_FILL(zero2)); tileData1 = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA); tileData2 = (winTemplate.width * TILE_SIZE_4BPP) + tileData1; if (!zero1) txtColor[0] = TEXT_COLOR_TRANSPARENT; else txtColor[0] = zero2; txtColor[1] = TEXT_DYNAMIC_COLOR_6; txtColor[2] = TEXT_DYNAMIC_COLOR_5; AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_1, 0, 2, 0, 0, txtColor, -1, string); tileBytesToBuffer = bytesToBuffer; if (tileBytesToBuffer > 6) tileBytesToBuffer = 6; remainingBytes = bytesToBuffer - 6; if (tileBytesToBuffer > 0) { for (i = tileBytesToBuffer; i != 0; i--) { CpuCopy16(tileData1, dst, 0x80); CpuCopy16(tileData2, dst + 0x80, 0x80); tileData1 += 0x80; tileData2 += 0x80; dst += 0x100; } } // Never used. bytesToBuffer is always passed <= 6, so remainingBytes is always <= 0 here if (remainingBytes > 0) CpuFill16((zero2 << 4) | zero2, dst, (u32)(remainingBytes) * 0x100); RemoveWindow(windowId); } static void PrintStringToBufferCopyNow(const u8 *string, void *dst, u16 offset, u8 bgColor, u8 fgColor, u8 shadowColor, u8 *unused) { u32 var; u8 windowId; u8 txtColor[3]; u8 *tileData1, *tileData2; struct WindowTemplate winTemplate = {0}; winTemplate.width = StringLength_Multibyte(string); winTemplate.height = 2; var = winTemplate.width * 32; windowId = AddWindow(&winTemplate); FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor)); tileData1 = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA); tileData2 = (winTemplate.width * 32) + tileData1; txtColor[0] = bgColor; txtColor[1] = fgColor; txtColor[2] = shadowColor; AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_1, 0, 2, 0, 0, txtColor, -1, string); CpuCopy16(tileData1, dst, var); CpuCopy16(tileData2, dst + offset, var); RemoveWindow(windowId); } static u8 CountMonsInBox(u8 boxId) { u16 i, count; for (i = 0, count = 0; i < IN_BOX_COUNT; i++) { if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) != SPECIES_NONE) count++; } return count; } s16 GetFirstFreeBoxSpot(u8 boxId) { u32 i; for (i = 0; i < IN_BOX_COUNT; i++) { if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) == SPECIES_NONE) return i; } return -1; // all spots are taken } u8 CountPartyNonEggMons(void) { u16 i, count; for (i = 0, count = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) count++; } return count; } u8 CountPartyAliveNonEggMonsExcept(u8 slotToIgnore) { u16 i, count; for (i = 0, count = 0; i < PARTY_SIZE; i++) { if (i != slotToIgnore && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) count++; } return count; } u16 CountPartyAliveNonEggMons_IgnoreVar0x8004Slot(void) { return CountPartyAliveNonEggMonsExcept(gSpecialVar_0x8004); } u8 CountPartyMons(void) { u16 i, count; for (i = 0, count = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE) count++; } return count; } static u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n) { u8 *str; for (str = StringCopy(dst, src); str < dst + n; str++) *str = CHAR_SPACE; *str = EOS; return str; } // Unused static void UnusedWriteRectCpu(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) { u32 i; dest_width *= 2; dest += dest_top * 0x20 + dest_left; src += src_top * src_width + src_left; for (i = 0; i < dest_height; i++) { CpuCopy16(src, dest, dest_width); dest += 0x20; src += src_width; } } // Unused static void UnusedWriteRectDma(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) { u32 i; dest += dest_top * 0x20 + dest_left; width *= 2; for (i = 0; i < height; dest += 0x20, i++) Dma3FillLarge16_(0, dest, width); } enum { STATE_LOAD, STATE_FADE_IN, STATE_HANDLE_INPUT, STATE_ERROR_MSG, STATE_ENTER_PC, }; #define tState data[0] #define tSelectedOption data[1] #define tInput data[2] #define tNextOption data[3] #define tWindowId data[15] static void Task_PCMainMenu(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case STATE_LOAD: SetHelpContext(HELPCONTEXT_BILLS_PC); CreatePCMainMenu(task->tSelectedOption, &task->tWindowId); LoadStdWindowFrameGfx(); DrawDialogueFrame(0, FALSE); FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, TEXT_SKIP_DRAW, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(0, COPYWIN_FULL); CopyWindowToVram(task->tWindowId, COPYWIN_FULL); task->tState++; break; case STATE_FADE_IN: if (IsWeatherNotFadingIn()) task->tState++; break; case STATE_HANDLE_INPUT: task->tInput = Menu_ProcessInput(); switch(task->tInput) { case MENU_NOTHING_CHOSEN: task->tNextOption = task->tSelectedOption; if (JOY_NEW(DPAD_UP) && --task->tNextOption < 0) task->tNextOption = OPTIONS_COUNT - 1; if (JOY_NEW(DPAD_DOWN) && ++task->tNextOption > OPTIONS_COUNT - 1) task->tNextOption = 0; if (task->tSelectedOption != task->tNextOption) { task->tSelectedOption = task->tNextOption; FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } break; case MENU_B_PRESSED: case OPTION_EXIT: ClearStdWindowAndFrame(0, TRUE); ClearStdWindowAndFrame(task->tWindowId, TRUE); UnlockPlayerFieldControls(); ScriptContext_Enable(); DestroyTask(taskId); break; default: if (task->tInput == OPTION_WITHDRAW && CountPartyMons() == PARTY_SIZE) { // Can't withdraw FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_PartyFull, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); task->tState = STATE_ERROR_MSG; } else if (task->tInput == OPTION_DEPOSIT && CountPartyMons() == 1) { // Can't deposit FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_JustOnePkmn, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); task->tState = STATE_ERROR_MSG; } else { // Enter PC FadeScreen(FADE_TO_BLACK, 0); task->tState = STATE_ENTER_PC; } break; } break; case STATE_ERROR_MSG: // Printed "can't do PC option message" // Wait for new input after message if (JOY_NEW(A_BUTTON | B_BUTTON)) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); task->tState = STATE_HANDLE_INPUT; } else if (JOY_NEW(DPAD_UP)) { if (--task->tSelectedOption < 0) task->tSelectedOption = 4; Menu_MoveCursor(-1); task->tSelectedOption = Menu_GetCursorPos(); FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); task->tState = STATE_HANDLE_INPUT; } else if (JOY_NEW(DPAD_DOWN)) { if (++task->tSelectedOption > 3) task->tSelectedOption = 0; Menu_MoveCursor(1); task->tSelectedOption = Menu_GetCursorPos(); FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); task->tState = STATE_HANDLE_INPUT; } break; case STATE_ENTER_PC: if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); EnterPokeStorage(task->tInput); DestroyTask(taskId); } break; } } void ShowPokemonStorageSystemPC(void) { u8 taskId = CreateTask(Task_PCMainMenu, 80); gTasks[taskId].tState = STATE_LOAD; gTasks[taskId].tSelectedOption = 0; LockPlayerFieldControls(); } static void FieldTask_ReturnToPcMenu(void) { u8 taskId; MainCallback vblankCb = gMain.vblankCallback; SetVBlankCallback(NULL); taskId = CreateTask(Task_PCMainMenu, 80); gTasks[taskId].tState = STATE_LOAD; gTasks[taskId].tSelectedOption = sPreviousBoxOption; Task_PCMainMenu(taskId); SetVBlankCallback(vblankCb); FadeInFromBlack(); } static const struct WindowTemplate sWindowTemplate_MainMenu = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 17, .height = 10, .paletteNum = 15, .baseBlock = 0x001 }; static void CreatePCMainMenu(u8 whichMenu, s16 *windowIdPtr) { s16 windowId = AddWindow(&sWindowTemplate_MainMenu); DrawStdWindowFrame(windowId, FALSE); PrintTextArray(windowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, 16, ARRAY_COUNT(sMainMenuTexts), (void *)sMainMenuTexts); Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, ARRAY_COUNT(sMainMenuTexts), whichMenu); *windowIdPtr = windowId; } void CB2_ExitPokeStorage(void) { sPreviousBoxOption = GetCurrentBoxOption(); gFieldCallback = FieldTask_ReturnToPcMenu; SetMainCallback2(CB2_ReturnToField); } void ResetPokemonStorageSystem(void) { u16 boxId, boxPosition; SetCurrentBox(0); for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) { for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++) ZeroBoxMonAt(boxId, boxPosition); } for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) { u8 *dest = StringCopy(GetBoxNamePtr(boxId), gText_Box); ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2); } for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) SetBoxWallpaper(boxId, boxId % (MAX_DEFAULT_WALLPAPER + 1)); } void LoadChooseBoxMenuGfx(struct ChooseBoxMenu *menu, u16 tileTag, u16 palTag, u8 subpriority, bool32 loadPal) { struct SpritePalette palette = { sChooseBoxMenu_Pal, palTag }; struct SpriteSheet sheets[] = { {sChooseBoxMenuCenter_Gfx, 0x800, tileTag}, {sChooseBoxMenuCorners_Gfx, 0x180, tileTag + 1}, {} }; if (loadPal) // Always false LoadSpritePalette(&palette); LoadSpriteSheets(sheets); sChooseBoxMenu = menu; menu->tileTag = tileTag; menu->paletteTag = palTag; menu->subpriority = subpriority; menu->loadedPalette = loadPal; } void FreeBoxSelectionPopupSpriteGfx(void) { if (sChooseBoxMenu->loadedPalette) FreeSpritePaletteByTag(sChooseBoxMenu->paletteTag); FreeSpriteTilesByTag(sChooseBoxMenu->tileTag); FreeSpriteTilesByTag(sChooseBoxMenu->tileTag + 1); } void CreateChooseBoxMenuSprites(u8 curBox) { ChooseBoxMenu_CreateSprites(curBox); } void DestroyChooseBoxMenuSprites(void) { ChooseBoxMenu_DestroySprites(); } u8 HandleBoxChooseSelectionInput(void) { if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); return BOXID_CANCELED; } if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); return sChooseBoxMenu->curBox; } if (JOY_NEW(DPAD_LEFT)) { PlaySE(SE_SELECT); ChooseBoxMenu_MoveLeft(); } else if (JOY_NEW(DPAD_RIGHT)) { PlaySE(SE_SELECT); ChooseBoxMenu_MoveRight(); } return BOXID_NONE_CHOSEN; } static const union AnimCmd sAnim_ChooseBoxMenu_TopLeft[] = { ANIMCMD_FRAME( 0, 5), ANIMCMD_END }; static const union AnimCmd sAnim_ChooseBoxMenu_BottomLeft[] = { ANIMCMD_FRAME( 4, 5), ANIMCMD_END }; static const union AnimCmd sAnim_ChooseBoxMenu_TopRight[] = { ANIMCMD_FRAME( 6, 5), ANIMCMD_END }; static const union AnimCmd sAnim_ChooseBoxMenu_BottomRight[] = { ANIMCMD_FRAME(10, 5), ANIMCMD_END }; static const union AnimCmd *const sAnims_ChooseBoxMenu[] = { sAnim_ChooseBoxMenu_TopLeft, sAnim_ChooseBoxMenu_BottomLeft, sAnim_ChooseBoxMenu_TopRight, sAnim_ChooseBoxMenu_BottomRight, }; static const union AffineAnimCmd sAffineAnim_ChooseBoxMenu[] = { AFFINEANIMCMD_FRAME(224, 224, 0, 0), AFFINEANIMCMD_END }; // Unused static const union AffineAnimCmd *const sAffineAnims_ChooseBoxMenu[] = { sAffineAnim_ChooseBoxMenu }; static void ChooseBoxMenu_CreateSprites(u8 curBox) { u32 i; u8 spriteId; struct SpriteTemplate template; struct OamData oamData = {}; oamData.size = SPRITE_SIZE(64x64); oamData.paletteNum = 1; template = (struct SpriteTemplate){ 0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; { const u8 sText_OutOf30[] = _("/30"); sChooseBoxMenu->curBox = curBox; template.tileTag = sChooseBoxMenu->tileTag; template.paletteTag = sChooseBoxMenu->paletteTag; spriteId = CreateSprite(&template, 160, 96, 0); sChooseBoxMenu->menuSprite = gSprites + spriteId; oamData.shape = SPRITE_SHAPE(8x32); oamData.size = SPRITE_SIZE(8x32); template.tileTag = sChooseBoxMenu->tileTag + 1; template.anims = sAnims_ChooseBoxMenu; for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->menuCornerSprites); i++) { // corner sprites are created in order of top left, bottom left, top right, bottom right u16 animNum; spriteId = CreateSprite(&template, 124, 80, sChooseBoxMenu->subpriority); // place at top left sChooseBoxMenu->menuCornerSprites[i] = &gSprites[spriteId]; animNum = 0; if (i & 2) { sChooseBoxMenu->menuCornerSprites[i]->x = 196; // move to bottom animNum = 2; } if (i & 1) { sChooseBoxMenu->menuCornerSprites[i]->y = 112; // move to right sChooseBoxMenu->menuCornerSprites[i]->oam.size = SPRITE_SIZE(8x16); animNum++; } StartSpriteAnim(sChooseBoxMenu->menuCornerSprites[i], animNum); } for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->arrowSprites); i++) { sChooseBoxMenu->arrowSprites[i] = CreateChooseBoxArrows(72 * i + 124, 88, i, 0, sChooseBoxMenu->subpriority); if (sChooseBoxMenu->arrowSprites[i]) { sChooseBoxMenu->arrowSprites[i]->data[0] = (i == 0 ? -1 : 1); sChooseBoxMenu->arrowSprites[i]->callback = SpriteCB_ChooseBoxArrow; } } ChooseBoxMenu_PrintBoxNameAndCount(); ChooseBoxMenu_PrintTextToSprite(sText_OutOf30, 5, 3); } } static void ChooseBoxMenu_DestroySprites(void) { u32 i; if (sChooseBoxMenu->menuSprite) { DestroySprite(sChooseBoxMenu->menuSprite); sChooseBoxMenu->menuSprite = NULL; } for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->menuCornerSprites); i++) { if (sChooseBoxMenu->menuCornerSprites[i]) { DestroySprite(sChooseBoxMenu->menuCornerSprites[i]); sChooseBoxMenu->menuCornerSprites[i] = NULL; } } for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->arrowSprites); i++) { if (sChooseBoxMenu->arrowSprites[i]) DestroySprite(sChooseBoxMenu->arrowSprites[i]); } } static void ChooseBoxMenu_MoveRight(void) { if (++sChooseBoxMenu->curBox >= TOTAL_BOXES_COUNT) sChooseBoxMenu->curBox = 0; ChooseBoxMenu_PrintBoxNameAndCount(); } static void ChooseBoxMenu_MoveLeft(void) { sChooseBoxMenu->curBox = (sChooseBoxMenu->curBox == 0 ? TOTAL_BOXES_COUNT - 1 : sChooseBoxMenu->curBox - 1); ChooseBoxMenu_PrintBoxNameAndCount(); } static void ChooseBoxMenu_PrintBoxNameAndCount(void) { u8 numMonInBox = CountMonsInBox(sChooseBoxMenu->curBox); u8 *boxName = StringCopy(sChooseBoxMenu->strbuf, GetBoxNamePtr(sChooseBoxMenu->curBox)); while (boxName < sChooseBoxMenu->strbuf + BOX_NAME_LENGTH) *boxName++ = CHAR_SPACE; *boxName = EOS; ChooseBoxMenu_PrintTextToSprite(sChooseBoxMenu->strbuf, 0, 1); ConvertIntToDecimalStringN(sChooseBoxMenu->strbuf, numMonInBox, STR_CONV_MODE_RIGHT_ALIGN, 2); ChooseBoxMenu_PrintTextToSprite(sChooseBoxMenu->strbuf, 3, 3); } static void ChooseBoxMenu_PrintTextToSprite(const u8 *str, u16 x, u16 y) { void *dst = (void *)(OBJ_VRAM0 + GetSpriteTileStartByTag(sChooseBoxMenu->tileTag) * 32 + 256 * y + 32 * x); PrintStringToBufferCopyNow(str, dst, 0x100, TEXT_COLOR_RED, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5, sChooseBoxMenu->buffer); } static void SpriteCB_ChooseBoxArrow(struct Sprite *sprite) { if (++sprite->data[1] > 3) { sprite->data[1] = 0; sprite->x2 += sprite->data[0]; if (++sprite->data[2] > 5) { sprite->data[2] = 0; sprite->x2 = 0; } } } // Unused, since LoadChooseBoxMenuGfx is always called with `loadPal` as false static const u16 sChooseBoxMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/unused_choose_box_menu.gbapal"); static const u8 sChooseBoxMenuCenter_Gfx[] = INCBIN_U8("graphics/pokemon_storage/choose_box_menu_center.4bpp"); static const u8 sChooseBoxMenuCorners_Gfx[] = INCBIN_U8("graphics/pokemon_storage/choose_box_menu_corners.4bpp"); ================================================ FILE: src/pokemon_storage_system_misc.c ================================================ #include // to declare abs #include "global.h" #include "gflib.h" #include "decompress.h" #include "item.h" #include "item_menu_icons.h" #include "menu.h" #include "new_menu_helpers.h" #include "pokemon_icon.h" #include "pokemon_storage_system_internal.h" #include "text_window.h" #include "trig.h" #include "constants/items.h" static EWRAM_DATA struct { u8 funcId; u8 state; u8 fromColumn; u8 fromRow; u8 toColumn; u8 toRow; u8 cursorColumn; u8 cursorRow; u8 minColumn; u8 minRow; u8 columnsTotal; u8 rowsTotal; u16 bgX; u16 bgY; u16 bgMoveSteps; struct BoxPokemon boxMons[IN_BOX_COUNT]; } *sMultiMove = NULL; static bool8 MultiMove_Function_Start(void); static bool8 MultiMove_Function_Single(void); static bool8 MultiMove_Function_ChangeSelection(void); static bool8 MultiMove_Function_GrabSelection(void); static bool8 MultiMove_Function_MoveMons(void); static bool8 MultiMove_Function_PlaceMons(void); static void MultiMove_UpdateSelectedIcons(void); static void MultiMove_SelectColumn(u8 column, u8 minRow, u8 maxRow); static void MultiMove_SelectRow(u8 row, u8 minColumn, u8 maxColumn); static void MultiMove_DeselectColumn(u8 arg0, u8 minRow, u8 maxRow); static void MultiMove_DeselectRow(u8 row, u8 minColumn, u8 maxColumn); static void MultiMove_SetIconToBg(u8 x, u8 y); static void MultiMove_ClearIconFromBg(u8 x, u8 y); static void MultiMove_InitBg(u16 bgX, u16 bgY, u16 duration); static u8 MultiMove_UpdateBg(void); static void MultiMove_GetMonsFromSelection(void); static void MultiMove_RemoveMonsFromBox(void); static void MultiMove_CreatePlacedMonIcons(void); static void MultiMove_SetPlacedMonData(void); static void MultiMove_ResetBg(void); static const struct WindowTemplate sWindowTemplate_MultiMove = { .bg = 0, .tilemapLeft = 10, .tilemapTop = 3, .width = 20, .height = 18, .paletteNum = 9, .baseBlock = 0x00a }; bool8 MultiMove_Init(void) { sMultiMove = Alloc(sizeof(*sMultiMove)); if (sMultiMove != NULL) { gStorage->multiMoveWindowId = AddWindow8Bit(&sWindowTemplate_MultiMove); if (gStorage->multiMoveWindowId != WINDOW_NONE) { FillWindowPixelBuffer(gStorage->multiMoveWindowId, PIXEL_FILL(0)); return TRUE; } } return FALSE; } void MultiMove_Free(void) { if (sMultiMove != NULL) Free(sMultiMove); } void MultiMove_SetFunction(u8 funcId) { sMultiMove->funcId = funcId; sMultiMove->state = 0; } bool8 MultiMove_RunFunction(void) { switch (sMultiMove->funcId) { case MULTIMOVE_START: return MultiMove_Function_Start(); case MULTIMOVE_SINGLE: return MultiMove_Function_Single(); case MULTIMOVE_CHANGE_SELECTION: return MultiMove_Function_ChangeSelection(); case MULTIMOVE_GRAB_SELECTION: return MultiMove_Function_GrabSelection(); case MULTIMOVE_MOVE_MONS: return MultiMove_Function_MoveMons(); case MULTIMOVE_PLACE_MONS: return MultiMove_Function_PlaceMons(); } return FALSE; } static bool8 MultiMove_Function_Start(void) { switch (sMultiMove->state) { case 0: HideBg(0); LoadMonIconPalettesAt(BG_PLTT_ID(8)); sMultiMove->state++; break; case 1: GetCursorBoxColumnAndRow(&sMultiMove->fromColumn, &sMultiMove->fromRow); sMultiMove->toColumn = sMultiMove->fromColumn; sMultiMove->toRow = sMultiMove->fromRow; ChangeBgX(0, -1024, BG_COORD_SET); ChangeBgY(0, -1024, BG_COORD_SET); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); FillWindowPixelBuffer8Bit(gStorage->multiMoveWindowId, PIXEL_FILL(0)); MultiMove_SetIconToBg(sMultiMove->fromColumn, sMultiMove->fromRow); SetBgAttribute(0, BG_ATTR_PALETTEMODE, 1); PutWindowTilemap(gStorage->multiMoveWindowId); CopyWindowToVram8Bit(gStorage->multiMoveWindowId, COPYWIN_FULL); BlendPalettes(0x3F00, 8, RGB_WHITE); StartCursorAnim(CURSOR_ANIM_OPEN); SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); sMultiMove->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { ShowBg(0); return FALSE; } break; } return TRUE; } static bool8 MultiMove_Function_Single(void) { switch (sMultiMove->state) { case 0: HideBg(0); sMultiMove->state++; break; case 1: MultiMove_ResetBg(); StartCursorAnim(CURSOR_ANIM_BOUNCE); sMultiMove->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { SetCursorPriorityTo1(); LoadPalette(GetTextWindowPalette(3), BG_PLTT_ID(13), PLTT_SIZE_4BPP); ShowBg(0); return FALSE; } break; } return TRUE; } static bool8 MultiMove_Function_ChangeSelection(void) { switch (sMultiMove->state) { case 0: if (!UpdateCursorPos()) { GetCursorBoxColumnAndRow(&sMultiMove->cursorColumn, &sMultiMove->cursorRow); MultiMove_UpdateSelectedIcons(); sMultiMove->toColumn = sMultiMove->cursorColumn; sMultiMove->toRow = sMultiMove->cursorRow; CopyWindowToVram8Bit(gStorage->multiMoveWindowId, COPYWIN_GFX); sMultiMove->state++; } break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool8 MultiMove_Function_GrabSelection(void) { u8 movingBg, movingMon; switch (sMultiMove->state) { case 0: MultiMove_GetMonsFromSelection(); MultiMove_RemoveMonsFromBox(); InitMultiMonPlaceChange(FALSE); sMultiMove->state++; break; case 1: if (!DoMonPlaceChange()) { StartCursorAnim(CURSOR_ANIM_FIST); MultiMove_InitBg(0, 256, 8); InitMultiMonPlaceChange(TRUE); sMultiMove->state++; } break; case 2: movingBg = MultiMove_UpdateBg(); movingMon = DoMonPlaceChange(); if (!movingBg && !movingMon) return FALSE; break; } return TRUE; } static bool8 MultiMove_Function_MoveMons(void) { u8 movingCursor = UpdateCursorPos(); u8 movingBg = MultiMove_UpdateBg(); if (!movingCursor && !movingBg) return FALSE; else return TRUE; } static bool8 MultiMove_Function_PlaceMons(void) { switch (sMultiMove->state) { case 0: MultiMove_SetPlacedMonData(); MultiMove_InitBg(0, -256, 8); InitMultiMonPlaceChange(FALSE); sMultiMove->state++; break; case 1: if (!DoMonPlaceChange() && !MultiMove_UpdateBg()) { MultiMove_CreatePlacedMonIcons(); StartCursorAnim(CURSOR_ANIM_OPEN); InitMultiMonPlaceChange(TRUE); HideBg(0); sMultiMove->state++; } break; case 2: if (!DoMonPlaceChange()) { StartCursorAnim(CURSOR_ANIM_BOUNCE); MultiMove_ResetBg(); sMultiMove->state++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { LoadPalette(GetTextWindowPalette(3), BG_PLTT_ID(13), PLTT_SIZE_4BPP); SetCursorPriorityTo1(); ShowBg(0); return FALSE; } break; } return TRUE; } bool8 MultiMove_TryMoveGroup(u8 dir) { switch (dir) { case 0: // up if (sMultiMove->minRow == 0) return FALSE; sMultiMove->minRow--; MultiMove_InitBg(0, 1024, 6); break; case 1: // down if (sMultiMove->minRow + sMultiMove->rowsTotal >= 5) return FALSE; sMultiMove->minRow++; MultiMove_InitBg(0, -1024, 6); break; case 2: // left if (sMultiMove->minColumn == 0) return FALSE; sMultiMove->minColumn--; MultiMove_InitBg(1024, 0, 6); break; case 3: // right if (sMultiMove->minColumn + sMultiMove->columnsTotal > 5) return FALSE; sMultiMove->minColumn++; MultiMove_InitBg(-1024, 0, 6); break; } return TRUE; } static void MultiMove_UpdateSelectedIcons(void) { s16 columnChange = (abs(sMultiMove->fromColumn - sMultiMove->cursorColumn)) - (abs(sMultiMove->fromColumn - sMultiMove->toColumn)); s16 rowChange = (abs(sMultiMove->fromRow - sMultiMove->cursorRow)) - (abs(sMultiMove->fromRow - sMultiMove->toRow)); if (columnChange > 0) MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow); if (columnChange < 0) { MultiMove_DeselectColumn(sMultiMove->toColumn, sMultiMove->fromRow, sMultiMove->toRow); MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow); } if (rowChange > 0) MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn); if (rowChange < 0) { MultiMove_DeselectRow(sMultiMove->toRow, sMultiMove->fromColumn, sMultiMove->toColumn); MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn); } } static void MultiMove_SelectColumn(u8 column, u8 minRow, u8 maxRow) { u8 tmp = minRow; if (minRow > maxRow) { minRow = maxRow; maxRow = tmp; } while (minRow <= maxRow) MultiMove_SetIconToBg(column, minRow++); } static void MultiMove_SelectRow(u8 row, u8 minColumn, u8 maxColumn) { u8 tmp = minColumn; if (minColumn > maxColumn) { minColumn = maxColumn; maxColumn = tmp; } while (minColumn <= maxColumn) MultiMove_SetIconToBg(minColumn++, row); } static void MultiMove_DeselectColumn(u8 column, u8 minRow, u8 maxRow) { u8 tmp = minRow; if (minRow > maxRow) { minRow = maxRow; maxRow = tmp; } while (minRow <= maxRow) MultiMove_ClearIconFromBg(column, minRow++); } static void MultiMove_DeselectRow(u8 row, u8 minColumn, u8 maxColumn) { u8 tmp = minColumn; if (minColumn > maxColumn) { minColumn = maxColumn; maxColumn = tmp; } while (minColumn <= maxColumn) MultiMove_ClearIconFromBg(minColumn++, row); } static void MultiMove_SetIconToBg(u8 x, u8 y) { u8 position = x + (IN_BOX_COLUMNS * y); u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES_OR_EGG); u32 personality = GetCurrentBoxMonData(position, MON_DATA_PERSONALITY); if(species == SPECIES_DEOXYS) species = GetDeoxysSpeciesFromForme(GetCurrentBoxMonData(position, MON_DATA_FORME)); if (species != SPECIES_NONE) { const u8 *iconGfx = GetMonIconPtr(species, personality, 1); u8 palNum = GetValidMonIconPalIndex(species) + 8; BlitBitmapRectToWindow4BitTo8Bit(gStorage->multiMoveWindowId, iconGfx, 0, 0, 32, 32, 24 * x, 24 * y, 32, 32, palNum); } } static void MultiMove_ClearIconFromBg(u8 x, u8 y) { u8 position = x + (IN_BOX_COLUMNS * y); u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES_OR_EGG); if (species != SPECIES_NONE) FillWindowPixelRect8Bit(gStorage->multiMoveWindowId, PIXEL_FILL(0), 24 * x, 24 * y, 32, 32); } static void MultiMove_InitBg(u16 bgX, u16 bgY, u16 duration) { sMultiMove->bgX = bgX; sMultiMove->bgY = bgY; sMultiMove->bgMoveSteps = duration; } static u8 MultiMove_UpdateBg(void) { if (sMultiMove->bgMoveSteps != 0) { ChangeBgX(0, sMultiMove->bgX, BG_COORD_ADD); ChangeBgY(0, sMultiMove->bgY, BG_COORD_ADD); sMultiMove->bgMoveSteps--; } return sMultiMove->bgMoveSteps; } static void MultiMove_GetMonsFromSelection(void) { s32 i, j; s32 columnCount, rowCount; u8 boxId; u8 monArrayId; sMultiMove->minColumn = min(sMultiMove->fromColumn, sMultiMove->toColumn); sMultiMove->minRow = min(sMultiMove->fromRow, sMultiMove->toRow); sMultiMove->columnsTotal = abs(sMultiMove->fromColumn - sMultiMove->toColumn) + 1; sMultiMove->rowsTotal = abs(sMultiMove->fromRow - sMultiMove->toRow) + 1; boxId = StorageGetCurrentBox(); monArrayId = 0; columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; for (i = sMultiMove->minRow; i < rowCount; i++) { u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; for (j = sMultiMove->minColumn; j < columnCount; j++) { struct BoxPokemon *boxMon = GetBoxedMonPtr(boxId, boxPosition); // UB: possible null dereference #ifdef UBFIX if (boxMon != NULL) sMultiMove->boxMons[monArrayId] = *boxMon; #else sMultiMove->boxMons[monArrayId] = *boxMon; #endif monArrayId++; boxPosition++; } } } static void MultiMove_RemoveMonsFromBox(void) { s32 i, j; s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; u8 boxId = StorageGetCurrentBox(); for (i = sMultiMove->minRow; i < rowCount; i++) { u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; for (j = sMultiMove->minColumn; j < columnCount; j++) { DestroyBoxMonIconAtPosition(boxPosition); ZeroBoxMonAt(boxId, boxPosition); boxPosition++; } } } static void MultiMove_CreatePlacedMonIcons(void) { s32 i, j; s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; u8 monArrayId = 0; for (i = sMultiMove->minRow; i < rowCount; i++) { u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; for (j = sMultiMove->minColumn; j < columnCount; j++) { if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) CreateBoxMonIconAtPos(boxPosition); monArrayId++; boxPosition++; } } } static void MultiMove_SetPlacedMonData(void) { s32 i, j; s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; u8 boxId = StorageGetCurrentBox(); u8 monArrayId = 0; for (i = sMultiMove->minRow; i < rowCount; i++) { u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; for (j = sMultiMove->minColumn; j < columnCount; j++) { if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) SetBoxMonAt(boxId, boxPosition, &sMultiMove->boxMons[monArrayId]); boxPosition++; monArrayId++; } } } static void MultiMove_ResetBg(void) { ChangeBgX(0, 0, BG_COORD_SET); ChangeBgY(0, 0, BG_COORD_SET); SetBgAttribute(0, BG_ATTR_PALETTEMODE, 0); ClearGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(0); } u8 MultiMove_GetOriginPosition(void) { return (IN_BOX_COLUMNS * sMultiMove->fromRow) + sMultiMove->fromColumn; } bool8 MultiMove_CanPlaceSelection(void) { s32 i, j; s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; u8 monArrayId = 0; for (i = sMultiMove->minRow; i < rowCount; i++) { u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; for (j = sMultiMove->minColumn; j < columnCount; j++) { if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES) && GetCurrentBoxMonData(boxPosition, MON_DATA_SANITY_HAS_SPECIES)) return FALSE; monArrayId++; boxPosition++; } } return TRUE; } // IDs for the item icon sprite callbacks enum { ITEM_CB_WAIT_ANIM, ITEM_CB_TO_HAND, ITEM_CB_TO_MON, ITEM_CB_SWAP_TO_HAND, ITEM_CB_SWAP_TO_MON, ITEM_CB_UNUSED_1, ITEM_CB_UNUSED_2, ITEM_CB_HIDE_PARTY, }; static u8 GetNewItemIconIdx(void); static bool32 IsItemIconAtPosition(u8 cursorArea, u8 cursorPos); static u8 GetItemIconIdxByPosition(u8 cursorArea, u8 cursorPos); static void SetItemIconPosition(u8 id, u8 cursorArea, u8 cursorPos); static void LoadItemIconGfx(u8 id, const u32 * tiles, const u32 * pal); static void SetItemIconAffineAnim(u8 id, u8 affineAnimNo); static void SetItemIconCallback(u8 id, u8 command, u8 cursorArea, u8 cursorPos); static void SetItemIconActive(u8 id, bool8 show); static const u32 *GetItemIconPic(u16 itemId); static const u32 *GetItemIconPalette(u16 itemId); static void DrawItemInfoWindow(u32 x); static void SpriteCB_ItemIcon_WaitAnim(struct Sprite *sprite); static void SpriteCB_ItemIcon_ToHand(struct Sprite *sprite); static void SpriteCB_ItemIcon_SetPosToCursor(struct Sprite *sprite); static void SpriteCB_ItemIcon_ToMon(struct Sprite *sprite); static void SpriteCB_ItemIcon_SwapToHand(struct Sprite *sprite); static void SpriteCB_ItemIcon_SwapToMon(struct Sprite *sprite); static void SpriteCB_ItemIcon_HideParty(struct Sprite *sprite); static const u32 sItemInfoFrame_Gfx[] = INCBIN_U32("graphics/pokemon_storage/item_info_frame.4bpp"); static const struct OamData sOamData_ItemIcon = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x32), .tileNum = 0x000, .priority = 1, .paletteNum = 0, .affineParam = 0 }; static const union AffineAnimCmd sAffineAnim_ItemIcon_Small[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ItemIcon_Appear[] = { AFFINEANIMCMD_FRAME(88, 88, 0, 0), AFFINEANIMCMD_FRAME(5, 5, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ItemIcon_Disappear[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_FRAME(-5, -5, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ItemIcon_PickUp[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_FRAME(10, 10, 0, 12), AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ItemIcon_PutDown[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(-10, -10, 0, 12), AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ItemIcon_PutAway[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(-5, -5, 0, 16), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_ItemIcon_Large[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnims_ItemIcon[] = { [ITEM_ANIM_NONE] = sAffineAnim_ItemIcon_Small, [ITEM_ANIM_APPEAR] = sAffineAnim_ItemIcon_Appear, [ITEM_ANIM_DISAPPEAR] = sAffineAnim_ItemIcon_Disappear, [ITEM_ANIM_PICK_UP] = sAffineAnim_ItemIcon_PickUp, [ITEM_ANIM_PUT_DOWN] = sAffineAnim_ItemIcon_PutDown, [ITEM_ANIM_PUT_AWAY] = sAffineAnim_ItemIcon_PutAway, [ITEM_ANIM_LARGE] = sAffineAnim_ItemIcon_Large, }; static const struct SpriteTemplate sSpriteTemplate_ItemIcon = { .tileTag = GFXTAG_ITEM_ICON_0, .paletteTag = PALTAG_ITEM_ICON_0, .oam = &sOamData_ItemIcon, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnims_ItemIcon, .callback = SpriteCallbackDummy, }; void CreateItemIconSprites(void) { s32 i; u8 spriteId; struct CompressedSpriteSheet spriteSheet; struct SpriteTemplate spriteTemplate; static u32 sItemIconGfxBuffer[0x61]; if (gStorage->boxOption == OPTION_MOVE_ITEMS) { spriteSheet.data = sItemIconGfxBuffer; spriteSheet.size = 0x200; spriteTemplate = sSpriteTemplate_ItemIcon; for (i = 0; i < MAX_ITEM_ICONS; i++) { spriteSheet.tag = GFXTAG_ITEM_ICON_0 + i; LoadCompressedSpriteSheet(&spriteSheet); gStorage->itemIcons[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * TILE_SIZE_4BPP + (void *)(OBJ_VRAM0); gStorage->itemIcons[i].palIndex = AllocSpritePalette(PALTAG_ITEM_ICON_0 + i); gStorage->itemIcons[i].palIndex = OBJ_PLTT_ID(gStorage->itemIcons[i].palIndex); spriteTemplate.tileTag = GFXTAG_ITEM_ICON_0 + i; spriteTemplate.paletteTag = PALTAG_ITEM_ICON_0 + i; spriteId = CreateSprite(&spriteTemplate, 0, 0, 11); gStorage->itemIcons[i].sprite = &gSprites[spriteId]; gStorage->itemIcons[i].sprite->invisible = TRUE; gStorage->itemIcons[i].active = FALSE; } } gStorage->movingItemId = ITEM_NONE; } void TryLoadItemIconAtPos(u8 cursorArea, u8 cursorPos) { u16 heldItem; if ((gStorage->boxOption != OPTION_MOVE_ITEMS) || IsItemIconAtPosition(cursorArea, cursorPos)) return; switch (cursorArea) { case CURSOR_AREA_IN_BOX: if (!GetCurrentBoxMonData(cursorPos, MON_DATA_SANITY_HAS_SPECIES)) return; heldItem = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM); break; case CURSOR_AREA_IN_PARTY: if (!GetMonData(&gPlayerParty[cursorPos], MON_DATA_SANITY_HAS_SPECIES)) return; heldItem = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM); break; default: return; } if (heldItem != ITEM_NONE) { const u32 *tiles = GetItemIconPic(heldItem); const u32 *pal = GetItemIconPalette(heldItem); u8 id = GetNewItemIconIdx(); SetItemIconPosition(id, cursorArea, cursorPos); LoadItemIconGfx(id, tiles, pal); SetItemIconAffineAnim(id, ITEM_ANIM_APPEAR); SetItemIconActive(id, TRUE); } } void TryHideItemIconAtPos(u8 cursorArea, u8 cursorPos) { u8 id; if (gStorage->boxOption != OPTION_MOVE_ITEMS) return; id = GetItemIconIdxByPosition(cursorArea, cursorPos); SetItemIconAffineAnim(id, ITEM_ANIM_DISAPPEAR); SetItemIconCallback(id, ITEM_CB_WAIT_ANIM, cursorArea, cursorPos); } void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos) { u8 id; u16 item; if (gStorage->boxOption != OPTION_MOVE_ITEMS) return; id = GetItemIconIdxByPosition(cursorArea, cursorPos); item = 0; SetItemIconAffineAnim(id, ITEM_ANIM_PICK_UP); SetItemIconCallback(id, ITEM_CB_TO_HAND, cursorArea, cursorPos); SetItemIconPosition(id, CURSOR_AREA_IN_HAND, 0); if (cursorArea == CURSOR_AREA_IN_BOX) { SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item); SetBoxMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND); } else { SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item); SetPartyMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND); } gStorage->movingItemId = gStorage->displayMonItemId; } void InitItemIconInCursor(u16 item) { const u32 *tiles = GetItemIconPic(item); const u32 *pal = GetItemIconPalette(item); u8 id = GetNewItemIconIdx(); LoadItemIconGfx(id, tiles, pal); SetItemIconAffineAnim(id, ITEM_ANIM_LARGE); SetItemIconCallback(id, ITEM_CB_TO_HAND, 0, 0); SetItemIconPosition(id, CURSOR_AREA_IN_HAND, 0); SetItemIconActive(id, TRUE); gStorage->movingItemId = item; } void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos) { u8 id; u16 item; if (gStorage->boxOption != OPTION_MOVE_ITEMS) return; id = GetItemIconIdxByPosition(cursorArea, cursorPos); SetItemIconAffineAnim(id, ITEM_ANIM_PICK_UP); SetItemIconCallback(id, ITEM_CB_SWAP_TO_HAND, CURSOR_AREA_IN_HAND, 0); if (cursorArea == CURSOR_AREA_IN_BOX) { item = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM); SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &gStorage->movingItemId); gStorage->movingItemId = item; } else { item = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM); SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &gStorage->movingItemId); gStorage->movingItemId = item; } id = GetItemIconIdxByPosition(2, 0); SetItemIconAffineAnim(id, ITEM_ANIM_PUT_DOWN); SetItemIconCallback(id, ITEM_CB_SWAP_TO_MON, cursorArea, cursorPos); } void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos) { u8 id; if (gStorage->boxOption != OPTION_MOVE_ITEMS) return; id = GetItemIconIdxByPosition(2, 0); SetItemIconAffineAnim(id, ITEM_ANIM_PUT_DOWN); SetItemIconCallback(id, ITEM_CB_TO_MON, cursorArea, cursorPos); if (cursorArea == CURSOR_AREA_IN_BOX) { SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &gStorage->movingItemId); SetBoxMonIconObjMode(cursorPos, ST_OAM_OBJ_NORMAL); } else { SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &gStorage->movingItemId); SetPartyMonIconObjMode(cursorPos, ST_OAM_OBJ_NORMAL); } } void Item_TakeMons(u8 cursorArea, u8 cursorPos) { u8 id; u16 item; if (gStorage->boxOption != OPTION_MOVE_ITEMS) return; item = ITEM_NONE; id = GetItemIconIdxByPosition(cursorArea, cursorPos); SetItemIconAffineAnim(id, ITEM_ANIM_DISAPPEAR); SetItemIconCallback(id, ITEM_CB_WAIT_ANIM, cursorArea, cursorPos); if (cursorArea == CURSOR_AREA_IN_BOX) { SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item); SetBoxMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND); } else { SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item); SetPartyMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND); } } void MoveItemFromCursorToBag(void) { if (gStorage->boxOption == OPTION_MOVE_ITEMS) { u8 id = GetItemIconIdxByPosition(CURSOR_AREA_IN_HAND, 0); SetItemIconAffineAnim(id, ITEM_ANIM_PUT_AWAY); SetItemIconCallback(id, ITEM_CB_WAIT_ANIM, 2, 0); } } // The party menu is being closed, if the cursor is on // a Pokémon that has a held item make sure it slides // up along with the closing menu. void MoveHeldItemWithPartyMenu(void) { s32 i; if (gStorage->boxOption != OPTION_MOVE_ITEMS) return; for (i = 0; i < MAX_ITEM_ICONS; i++) { if (gStorage->itemIcons[i].active && gStorage->itemIcons[i].cursorArea == CURSOR_AREA_IN_PARTY) SetItemIconCallback(i, ITEM_CB_HIDE_PARTY, 2, 0); } } bool8 IsItemIconAnimActive(void) { s32 i; for (i = 0; i < MAX_ITEM_ICONS; i++) { if (gStorage->itemIcons[i].active) { if (!gStorage->itemIcons[i].sprite->affineAnimEnded && gStorage->itemIcons[i].sprite->affineAnimBeginning) return TRUE; if (gStorage->itemIcons[i].sprite->callback != SpriteCallbackDummy && gStorage->itemIcons[i].sprite->callback != SpriteCB_ItemIcon_SetPosToCursor) return TRUE; } } return FALSE; } bool8 IsActiveItemMoving(void) { s32 i; if (gStorage->boxOption == OPTION_MOVE_ITEMS) { for (i = 0; i < MAX_ITEM_ICONS; i++) { if (gStorage->itemIcons[i].active && gStorage->itemIcons[i].cursorArea == CURSOR_AREA_BOX_TITLE) return TRUE; } } return FALSE; } const u8 *GetMovingItemName(void) { return ItemId_GetName(gStorage->movingItemId); } u16 GetMovingItem(void) { return gStorage->movingItemId; } static u8 GetNewItemIconIdx(void) { u8 i; for (i = 0; i < MAX_ITEM_ICONS; i++) { if (!gStorage->itemIcons[i].active) { gStorage->itemIcons[i].active = TRUE; return i; } } return MAX_ITEM_ICONS; } static bool32 IsItemIconAtPosition(u8 cursorArea, u8 cursorPos) { s32 i; for (i = 0; i < MAX_ITEM_ICONS; i++) { if (gStorage->itemIcons[i].active && gStorage->itemIcons[i].cursorArea == cursorArea && gStorage->itemIcons[i].cursorPos == cursorPos) return TRUE; } return FALSE; } static u8 GetItemIconIdxByPosition(u8 cursorArea, u8 cursorPos) { u8 i; for (i = 0; i < MAX_ITEM_ICONS; i++) { if (gStorage->itemIcons[i].active && gStorage->itemIcons[i].cursorArea == cursorArea && gStorage->itemIcons[i].cursorPos == cursorPos) return i; } return MAX_ITEM_ICONS; } static u8 GetItemIconIdxBySprite(struct Sprite *sprite) { u8 i; for (i = 0; i < MAX_ITEM_ICONS; i++) { if (gStorage->itemIcons[i].active && gStorage->itemIcons[i].sprite == sprite) return i; } return MAX_ITEM_ICONS; } static void SetItemIconPosition(u8 id, u8 cursorArea, u8 cursorPos) { u8 row, column; if (id >= MAX_ITEM_ICONS) return; switch (cursorArea) { case CURSOR_AREA_IN_BOX: row = cursorPos % IN_BOX_COLUMNS; column = cursorPos / IN_BOX_COLUMNS; gStorage->itemIcons[id].sprite->x = (24 * row) + 112; gStorage->itemIcons[id].sprite->y = (24 * column) + 56; gStorage->itemIcons[id].sprite->oam.priority = 2; break; case CURSOR_AREA_IN_PARTY: if (cursorPos == 0) { gStorage->itemIcons[id].sprite->x = 116; gStorage->itemIcons[id].sprite->y = 76; } else { gStorage->itemIcons[id].sprite->x = 164; gStorage->itemIcons[id].sprite->y = 24 * (cursorPos - 1) + 28; } gStorage->itemIcons[id].sprite->oam.priority = 1; break; } gStorage->itemIcons[id].cursorArea = cursorArea; gStorage->itemIcons[id].cursorPos = cursorPos; } static void LoadItemIconGfx(u8 id, const u32 *itemTiles, const u32 *itemPal) { s32 i; if (id >= MAX_ITEM_ICONS) return; CpuFastFill(0, gStorage->itemIconBuffer, 0x200); LZ77UnCompWram(itemTiles, gStorage->tileBuffer); for (i = 0; i < 3; i++) CpuFastCopy(gStorage->tileBuffer + (i * 0x60), gStorage->itemIconBuffer + (i * 0x80), 0x60); CpuFastCopy(gStorage->itemIconBuffer, gStorage->itemIcons[id].tiles, 0x200); LZ77UnCompWram(itemPal, gStorage->itemIconBuffer); LoadPalette(gStorage->itemIconBuffer, gStorage->itemIcons[id].palIndex, PLTT_SIZE_4BPP); } static void SetItemIconAffineAnim(u8 id, u8 animNum) { if (id >= MAX_ITEM_ICONS) return; StartSpriteAffineAnim(gStorage->itemIcons[id].sprite, animNum); } #define sItemIconId data[0] #define sState data[0] #define sCursorArea data[6] #define sCursorPos data[7] static void SetItemIconCallback(u8 id, u8 callbackId, u8 cursorArea, u8 cursorPos) { if (id >= MAX_ITEM_ICONS) return; switch (callbackId) { case ITEM_CB_WAIT_ANIM: gStorage->itemIcons[id].sprite->sItemIconId = id; gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_WaitAnim; break; case ITEM_CB_TO_HAND: gStorage->itemIcons[id].sprite->sState = 0; gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_ToHand; break; case ITEM_CB_TO_MON: gStorage->itemIcons[id].sprite->sState = 0; gStorage->itemIcons[id].sprite->sCursorArea = cursorArea; gStorage->itemIcons[id].sprite->sCursorPos = cursorPos; gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_ToMon; break; case ITEM_CB_SWAP_TO_HAND: gStorage->itemIcons[id].sprite->sState = 0; gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_SwapToHand; gStorage->itemIcons[id].sprite->sCursorArea = cursorArea; gStorage->itemIcons[id].sprite->sCursorPos = cursorPos; break; case ITEM_CB_SWAP_TO_MON: gStorage->itemIcons[id].sprite->sState = 0; gStorage->itemIcons[id].sprite->sCursorArea = cursorArea; gStorage->itemIcons[id].sprite->sCursorPos = cursorPos; gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_SwapToMon; break; case ITEM_CB_HIDE_PARTY: // If cursor is on a Pokémon with a held item and // the player closes the party menu, have the held // item follow the Pokémon as the menu slides out gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_HideParty; break; } } static void SetItemIconActive(u8 id, bool8 show) { if (id >= MAX_ITEM_ICONS) return; gStorage->itemIcons[id].active = show; gStorage->itemIcons[id].sprite->invisible = (show == FALSE); } static const u32 *GetItemIconPic(u16 itemId) { return GetItemIconGfxPtr(itemId, ITEMICON_TILES); } static const u32 *GetItemIconPalette(u16 itemId) { return GetItemIconGfxPtr(itemId, ITEMICON_PAL); } void PrintItemDescription(void) { const u8 *description; if (IsActiveItemMoving()) description = ItemId_GetDescription(gStorage->movingItemId); else description = ItemId_GetDescription(gStorage->displayMonItemId); FillWindowPixelBuffer(2, PIXEL_FILL(1)); AddTextPrinterParameterized5(2, FONT_NORMAL, description, 2, 0, 0, NULL, 0, 0); } void InitItemInfoWindow(void) { gStorage->itemInfoWindowOffset = 25; LoadBgTiles(0, sItemInfoFrame_Gfx, 0x80, 0x1A4); DrawItemInfoWindow(0); } bool8 UpdateItemInfoWindowSlideIn(void) { s32 i, pos; if (gStorage->itemInfoWindowOffset == 0) return FALSE; gStorage->itemInfoWindowOffset--; pos = 25 - gStorage->itemInfoWindowOffset; for (i = 0; i < pos; i++) WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + gStorage->itemInfoWindowOffset + i, i, 12, 1, 8, 15, 25); DrawItemInfoWindow(pos); return (gStorage->itemInfoWindowOffset != 0); } bool8 UpdateItemInfoWindowSlideOut(void) { s32 i, pos; if (gStorage->itemInfoWindowOffset == 25) return FALSE; if (gStorage->itemInfoWindowOffset == 0) FillBgTilemapBufferRect(0, 0, 25, 11, 1, 10, 17); gStorage->itemInfoWindowOffset++; pos = 25 - gStorage->itemInfoWindowOffset; for (i = 0; i < pos; i++) WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + gStorage->itemInfoWindowOffset + i, i, 12, 1, 8, 15, 25); DrawItemInfoWindow(pos); FillBgTilemapBufferRect(0, 0, pos, 11, 1, 10, 17); return (gStorage->itemInfoWindowOffset != 25); } static void DrawItemInfoWindow(u32 x) { if (x != 0) { FillBgTilemapBufferRect(0, 0x1A4, 0, 0xB, x, 1, 15); FillBgTilemapBufferRect(0, 0x9A4, 0, 0x14, x, 1, 15); } FillBgTilemapBufferRect(0, 0x1A5, x, 0xC, 1, 8, 15); FillBgTilemapBufferRect(0, 0x1A6, x, 0xB, 1, 1, 15); FillBgTilemapBufferRect(0, 0x1A7, x, 0x14, 1, 1, 15); ScheduleBgCopyTilemapToVram(0); } static void SpriteCB_ItemIcon_WaitAnim(struct Sprite *sprite) { if (sprite->affineAnimEnded) { SetItemIconActive(sprite->sItemIconId, FALSE); sprite->callback = SpriteCallbackDummy; } } static void SpriteCB_ItemIcon_ToHand(struct Sprite *sprite) { switch (sprite->sState) { case 0: sprite->data[1] = sprite->x << 4; sprite->data[2] = sprite->y << 4; sprite->data[3] = 10; sprite->data[4] = 21; sprite->data[5] = 0; sprite->sState++; case 1: sprite->data[1] -= sprite->data[3]; sprite->data[2] -= sprite->data[4]; sprite->x = sprite->data[1] >> 4; sprite->y = sprite->data[2] >> 4; if (++sprite->data[5] > 11) sprite->callback = SpriteCB_ItemIcon_SetPosToCursor; break; } } static void SpriteCB_ItemIcon_SetPosToCursor(struct Sprite *sprite) { sprite->x = gStorage->cursorSprite->x + 4; sprite->y = gStorage->cursorSprite->y + gStorage->cursorSprite->y2 + 8; sprite->oam.priority = gStorage->cursorSprite->oam.priority; } static void SpriteCB_ItemIcon_ToMon(struct Sprite *sprite) { switch (sprite->sState) { case 0: sprite->data[1] = sprite->x << 4; sprite->data[2] = sprite->y << 4; sprite->data[3] = 10; sprite->data[4] = 21; sprite->data[5] = 0; sprite->sState++; case 1: sprite->data[1] += sprite->data[3]; sprite->data[2] += sprite->data[4]; sprite->x = sprite->data[1] >> 4; sprite->y = sprite->data[2] >> 4; if (++sprite->data[5] > 11) { SetItemIconPosition(GetItemIconIdxBySprite(sprite), sprite->sCursorArea, sprite->sCursorPos); sprite->callback = SpriteCallbackDummy; } break; } } static void SpriteCB_ItemIcon_SwapToHand(struct Sprite *sprite) { switch (sprite->sState) { case 0: sprite->data[1] = sprite->x << 4; sprite->data[2] = sprite->y << 4; sprite->data[3] = 10; sprite->data[4] = 21; sprite->data[5] = 0; sprite->sState++; case 1: sprite->data[1] -= sprite->data[3]; sprite->data[2] -= sprite->data[4]; sprite->x = sprite->data[1] >> 4; sprite->y = sprite->data[2] >> 4; sprite->x2 = gSineTable[sprite->data[5] * 8] >> 4; if (++sprite->data[5] > 11) { SetItemIconPosition(GetItemIconIdxBySprite(sprite), sprite->sCursorArea, sprite->sCursorPos); sprite->x2 = 0; sprite->callback = SpriteCB_ItemIcon_SetPosToCursor; } break; } } static void SpriteCB_ItemIcon_SwapToMon(struct Sprite *sprite) { switch (sprite->sState) { case 0: sprite->data[1] = sprite->x << 4; sprite->data[2] = sprite->y << 4; sprite->data[3] = 10; sprite->data[4] = 21; sprite->data[5] = 0; sprite->sState++; case 1: sprite->data[1] += sprite->data[3]; sprite->data[2] += sprite->data[4]; sprite->x = sprite->data[1] >> 4; sprite->y = sprite->data[2] >> 4; sprite->x2 = -(gSineTable[sprite->data[5] * 8] >> 4); if (++sprite->data[5] > 11) { SetItemIconPosition(GetItemIconIdxBySprite(sprite), sprite->sCursorArea, sprite->sCursorPos); sprite->callback = SpriteCallbackDummy; sprite->x2 = 0; } break; } } static void SpriteCB_ItemIcon_HideParty(struct Sprite *sprite) { sprite->y -= 8; if (sprite->y + sprite->y2 < -16) { sprite->callback = SpriteCallbackDummy; SetItemIconActive(GetItemIconIdxBySprite(sprite), FALSE); } } #undef sState #undef sItemIconId #undef sCursorArea #undef sCursorPos // Some data transfer utility that goes functionally unused. // It gets initialized with UnkUtil_Init, and run every vblank in Pokémon // Storage with UnkUtil_Run, but neither of the Add functions are ever used, // so UnkUtil_Run performs no actions. static EWRAM_DATA struct UnkUtil *sUnkUtil = NULL; static void UnkUtil_CpuRun(struct UnkUtilData *unkStruct); static void UnkUtil_DmaRun(struct UnkUtilData *unkStruct); void UnkUtil_Init(struct UnkUtil *util, struct UnkUtilData *data, u32 max) { sUnkUtil = util; util->data = data; util->max = max; util->numActive = 0; } void UnkUtil_Run(void) { u16 i; if (sUnkUtil->numActive) { for (i = 0; i < sUnkUtil->numActive; i++) { struct UnkUtilData *data = &sUnkUtil->data[i]; data->func(data); } sUnkUtil->numActive = 0; } } // Unused static bool8 UnkUtil_CpuAdd(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height, u16 unkArg) { struct UnkUtilData *data; if (sUnkUtil->numActive >= sUnkUtil->max) return FALSE; data = &sUnkUtil->data[sUnkUtil->numActive++]; data->size = width * 2; data->dest = dest + 2 * (dTop * 32 + dLeft); data->src = src + 2 * (sTop * unkArg + sLeft); data->height = height; data->unk = unkArg; data->func = UnkUtil_CpuRun; return TRUE; } // Functionally unused static void UnkUtil_CpuRun(struct UnkUtilData *data) { u16 i; for (i = 0; i < data->height; i++) { CpuCopy16(data->src, data->dest, data->size); data->dest += 64; data->src += (data->unk * 2); } } // Unused static bool8 UnkUtil_DmaAdd(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height) { struct UnkUtilData *data; if (sUnkUtil->numActive >= sUnkUtil->max) return FALSE; data = &sUnkUtil->data[sUnkUtil->numActive++]; data->size = width * 2; data->dest = dest + ((dTop * 32) + dLeft) * 2; data->height = height; data->func = UnkUtil_DmaRun; return TRUE; } // Functionally unused static void UnkUtil_DmaRun(struct UnkUtilData *data) { u16 i; for (i = 0; i < data->height; i++) { Dma3FillLarge_(0, data->dest, data->size, 16); data->dest += 64; } } ================================================ FILE: src/pokemon_storage_system_tasks.c ================================================ #include "global.h" #include "gflib.h" #include "data.h" #include "decompress.h" #include "dynamic_placeholder_text_util.h" #include "event_data.h" #include "graphics.h" #include "help_system.h" #include "item.h" #include "item_menu.h" #include "mail_data.h" #include "menu.h" #include "naming_screen.h" #include "new_menu_helpers.h" #include "pc_screen_effect.h" #include "pokemon_icon.h" #include "pokemon_storage_system_internal.h" #include "pokemon_summary_screen.h" #include "quest_log.h" #include "strings.h" #include "task.h" #include "text_window.h" #include "tilemap_util.h" #include "trig.h" #include "constants/items.h" #include "constants/help_system.h" #include "constants/songs.h" EWRAM_DATA struct PokemonStorageSystemData *gStorage = NULL; static EWRAM_DATA bool8 sInPartyMenu = 0; static EWRAM_DATA u8 sCurrentBoxOption = 0; static EWRAM_DATA u8 sDepositBoxId = 0; static EWRAM_DATA u8 sWhichToReshow = 0; static EWRAM_DATA u8 sLastUsedBox = 0; static EWRAM_DATA u16 sMovingItemId = ITEM_NONE; static void Task_InitPokeStorage(u8 taskId); static void Task_ShowPokeStorage(u8 taskId); static void Task_ReshowPokeStorage(u8 taskId); static void Task_PokeStorageMain(u8 taskId); static void Task_ShowPartyPokemon(u8 taskId); static void Task_HidePartyPokemon(u8 taskId); static void Task_OnSelectedMon(u8 taskId); static void Task_MoveMon(u8 taskId); static void Task_PlaceMon(u8 taskId); static void Task_ShiftMon(u8 taskId); static void Task_WithdrawMon(u8 taskId); static void Task_DepositMenu(u8 taskId); static void Task_ReleaseMon(u8 taskId); static void Task_ShowMarkMenu(u8 taskId); static void Task_TakeItemForMoving(u8 taskId); static void Task_GiveMovingItemToMon(u8 taskId); static void Task_ItemToBag(u8 taskId); static void Task_SwitchSelectedItem(u8 taskId); static void Task_ShowItemInfo(u8 taskId); static void Task_HandleMovingMonFromParty(u8 taskId); static void Task_PrintCantStoreMail(u8 taskId); static void Task_HandleBoxOptions(u8 taskId); static void Task_HandleWallpapers(u8 taskId); static void Task_JumpBox(u8 taskId); static void Task_NameBox(u8 taskId); static void Task_ShowMonSummary(u8 taskId); static void Task_GiveItemFromBag(u8 taskId); static void Task_OnCloseBoxPressed(u8 taskId); static void Task_OnBPressed(u8 taskId); static void Task_ChangeScreen(u8 taskId); static void GiveChosenBagItem(void); static void FreePokeStorageData(void); static void SetScrollingBackground(void); static void ScrollBackground(void); static void LoadPokeStorageMenuGfx(void); static bool8 InitPokeStorageWindows(void); static void LoadsMiscSpritePalette(void); static void InitPalettesAndSprites(void); static void CreateMarkingComboSprite(void); static void CreateWaveformSprites(void); static void RefreshDisplayMonData(void); static void StartDisplayMonMosaic(void); static void SpriteCB_DisplayMonMosaic(struct Sprite *sprite); static bool8 IsDisplayMonMosaicActive(void); static void CreateDisplayMonSprite(void); static void LoadDisplayMonGfx(u16 species, u32 personality); static void PrintDisplayMonInfo(void); static void UpdateWaveformAnimation(void); static void InitSupplementalTilemaps(void); static void SetUpHidePartyMenu(void); static bool8 HidePartyMenu(void); static void UpdateCloseBoxButtonTilemap(bool8 normal); static void StartFlashingCloseBoxButton(void); static void StopFlashingCloseBoxButton(void); static void UpdateCloseBoxButtonFlash(void); static void SetPartySlotTilemaps(void); static void SetPartySlotTilemap(u8 pos, bool8 isPartyMon); static void UpdatePartySlotColors(void); static void SetUpDoShowPartyMenu(void); static bool8 DoShowPartyMenu(void); static void InitPokeStorageBg0(void); static void PrintStorageMessage(u8 textId); static void ShowYesNoWindow(s8 cursorPos); static void ClearBottomWindow(void); static void AddWallpaperSetsMenu(void); static void AddWallpapersMenu(u8 wallpaperSet); static void InitCursorItemIcon(void); static void SetPokeStorageQuestLogEvent(u8 species); static void UpdateBoxToSendMons(void); enum { TILEMAP_PKMN_DATA, // The "Pkmn Data" text at the top of the display TILEMAP_PARTY_MENU, TILEMAP_CLOSE_BUTTON, TILEMAP_COUNT }; enum { SCREEN_CHANGE_EXIT_BOX, SCREEN_CHANGE_SUMMARY_SCREEN, SCREEN_CHANGE_NAME_BOX, SCREEN_CHANGE_ITEM_FROM_BAG, }; enum { MSG_EXIT_BOX, MSG_WHAT_YOU_DO, MSG_PICK_A_THEME, MSG_PICK_A_WALLPAPER, MSG_IS_SELECTED, MSG_JUMP_TO_WHICH_BOX, MSG_DEPOSIT_IN_WHICH_BOX, MSG_WAS_DEPOSITED, MSG_BOX_IS_FULL, MSG_RELEASE_POKE, MSG_WAS_RELEASED, MSG_BYE_BYE, MSG_MARK_POKE, MSG_LAST_POKE, MSG_PARTY_FULL, MSG_HOLDING_POKE, MSG_WHICH_ONE_WILL_TAKE, MSG_CANT_RELEASE_EGG, MSG_CONTINUE_BOX, MSG_CAME_BACK, MSG_WORRIED, MSG_SURPRISE, MSG_PLEASE_REMOVE_MAIL, MSG_IS_SELECTED2, MSG_GIVE_TO_MON, MSG_PLACED_IN_BAG, MSG_BAG_FULL, MSG_PUT_IN_BAG, MSG_ITEM_IS_HELD, MSG_CHANGED_TO_ITEM, MSG_CANT_STORE_MAIL, }; enum { MSG_FMT_NONE, MSG_FMT_MON_NAME_1, MSG_FMT_MON_NAME_2, MSG_FMT_MON_NAME_3, MSG_FMT_RELEASE_MON_1, MSG_FMT_RELEASE_MON_2, MSG_FMT_RELEASE_MON_3, MSG_FMT_ITEM_NAME, }; static const u32 sScrollingBg_Gfx[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz"); static const u32 sScrollingBg_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz"); // Unused static const u16 sMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/menu.gbapal"); static const u32 sMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/menu.bin.lz"); static const u16 sPkmnData_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/pkmn_data.bin"); static const u16 sScrollingBg_Pal[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.gbapal"); static const u16 sScrollingBgMoveItems_Pal[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg_move_items.gbapal"); static const u16 sCloseBoxButton_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/close_box_button.bin"); static const u16 sPartySlotFilled_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/party_slot_filled.bin"); static const u16 sPartySlotEmpty_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/party_slot_empty.bin"); static const u16 sPokeStorageMisc2Pal[] = INCBIN_U16("graphics/pokemon_storage/misc2.gbapal"); static const u16 sWaveform_Gfx[] = INCBIN_U16("graphics/pokemon_storage/waveform.4bpp"); // Unused static const u16 sUnused_Pal[] = INCBIN_U16("graphics/pokemon_storage/unused.gbapal"); static const u16 sItemInfoFrame_Pal[] = INCBIN_U16("graphics/pokemon_storage/item_info_frame.gbapal"); static const struct WindowTemplate sWindowTemplates[] = { { .bg = 1, .tilemapLeft = 0, .tilemapTop = 11, .width = 9, .height = 7, .paletteNum = 3, .baseBlock = 0x0c0 }, { .bg = 0, .tilemapLeft = 11, .tilemapTop = 17, .width = 18, .height = 2, .paletteNum = 13, .baseBlock = 0x014 }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 12, .width = 25, .height = 8, .paletteNum = 15, .baseBlock = 0x014 }, DUMMY_WIN_TEMPLATE }; static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x100 }, { .bg = 2, .charBaseIndex = 2, .mapBaseIndex = 27, .screenSize = 1, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 } }; static const struct SpritePalette sMiscSpritePalette = { sPokeStorageMisc2Pal, PALTAG_MISC_2 }; static const struct SpriteSheet sWaveformSpriteSheet = { sWaveform_Gfx, 0x01C0, GFXTAG_WAVEFORM }; static const struct OamData sOamData_DisplayMon; static const struct SpriteTemplate sSpriteTemplate_DisplayMon = { .tileTag = GFXTAG_DISPLAY_MON, .paletteTag = PALTAG_DISPLAY_MON, .oam = &sOamData_DisplayMon, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct StorageMessage sMessages[] = { [MSG_EXIT_BOX] = {gText_ExitFromBox, MSG_FMT_NONE}, [MSG_WHAT_YOU_DO] = {gText_WhatDoYouWantToDo, MSG_FMT_NONE}, [MSG_PICK_A_THEME] = {gText_PleasePickATheme, MSG_FMT_NONE}, [MSG_PICK_A_WALLPAPER] = {gText_PickTheWallpaper, MSG_FMT_NONE}, [MSG_IS_SELECTED] = {gText_PkmnIsSelected, MSG_FMT_MON_NAME_1}, [MSG_JUMP_TO_WHICH_BOX] = {gText_JumpToWhichBox, MSG_FMT_NONE}, [MSG_DEPOSIT_IN_WHICH_BOX] = {gText_DepositInWhichBox, MSG_FMT_NONE}, [MSG_WAS_DEPOSITED] = {gText_PkmnWasDeposited, MSG_FMT_MON_NAME_1}, [MSG_BOX_IS_FULL] = {gText_BoxIsFull2, MSG_FMT_NONE}, [MSG_RELEASE_POKE] = {gText_ReleaseThisPokemon, MSG_FMT_NONE}, [MSG_WAS_RELEASED] = {gText_PkmnWasReleased, MSG_FMT_RELEASE_MON_1}, [MSG_BYE_BYE] = {gText_ByeByePkmn, MSG_FMT_RELEASE_MON_3}, [MSG_MARK_POKE] = {gText_MarkYourPkmn, MSG_FMT_NONE}, [MSG_LAST_POKE] = {gText_ThatsYourLastPkmn, MSG_FMT_NONE}, [MSG_PARTY_FULL] = {gText_YourPartysFull, MSG_FMT_NONE}, [MSG_HOLDING_POKE] = {gText_YoureHoldingAPkmn, MSG_FMT_NONE}, [MSG_WHICH_ONE_WILL_TAKE] = {gText_WhichOneWillYouTake, MSG_FMT_NONE}, [MSG_CANT_RELEASE_EGG] = {gText_YouCantReleaseAnEgg, MSG_FMT_NONE}, [MSG_CONTINUE_BOX] = {gText_ContinueBoxOperations, MSG_FMT_NONE}, [MSG_CAME_BACK] = {gText_PkmnCameBack, MSG_FMT_MON_NAME_1}, [MSG_WORRIED] = {gText_WasItWorriedAboutYou, MSG_FMT_NONE}, [MSG_SURPRISE] = {gText_FourEllipsesExclamation, MSG_FMT_NONE}, [MSG_PLEASE_REMOVE_MAIL] = {gText_PleaseRemoveTheMail, MSG_FMT_NONE}, [MSG_IS_SELECTED2] = {gText_PkmnIsSelected, MSG_FMT_ITEM_NAME}, [MSG_GIVE_TO_MON] = {gText_GiveToAPkmn, MSG_FMT_NONE}, [MSG_PLACED_IN_BAG] = {gText_PlacedItemInBag, MSG_FMT_ITEM_NAME}, [MSG_BAG_FULL] = {gText_BagIsFull2, MSG_FMT_NONE}, [MSG_PUT_IN_BAG] = {gText_PutItemInBag, MSG_FMT_NONE}, [MSG_ITEM_IS_HELD] = {gText_ItemIsNowHeld, MSG_FMT_ITEM_NAME}, [MSG_CHANGED_TO_ITEM] = {gText_ChangedToNewItem, MSG_FMT_ITEM_NAME}, [MSG_CANT_STORE_MAIL] = {gText_MailCantBeStored, MSG_FMT_NONE}, }; static const struct WindowTemplate sYesNoWindowTemplate = { .bg = 0, .tilemapLeft = 24, .tilemapTop = 11, .width = 5, .height = 4, .paletteNum = 15, .baseBlock = 0x05c }; static const struct OamData sOamData_DisplayMon = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x64), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 0, .paletteNum = 0 }; // Waveform static const struct OamData sOamData_Waveform = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x8), .tileNum = 0x000, .priority = 0, .paletteNum = 0 }; static const union AnimCmd sAnim_Waveform_LeftOff[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd sAnim_Waveform_LeftOn[] = { ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(6, 8), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_Waveform_RightOff[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END }; static const union AnimCmd sAnim_Waveform_RightOn[] = { ANIMCMD_FRAME(10, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(12, 8), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_Waveform[] = { sAnim_Waveform_LeftOff, sAnim_Waveform_LeftOn, sAnim_Waveform_RightOff, sAnim_Waveform_RightOn }; static const struct SpriteTemplate sSpriteTemplate_Waveform = { .tileTag = GFXTAG_WAVEFORM, .paletteTag = PALTAG_MISC_2, .oam = &sOamData_Waveform, .anims = sAnims_Waveform, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static void VBlankCB_PokeStorage(void) { LoadOam(); ProcessSpriteCopyRequests(); UnkUtil_Run(); TransferPlttBuffer(); SetGpuReg(REG_OFFSET_BG2HOFS, gStorage->bg2_X); } static void CB2_PokeStorage(void) { RunTasks(); DoScheduledBgTilemapCopiesToVram(); ScrollBackground(); UpdateCloseBoxButtonFlash(); AnimateSprites(); BuildOamBuffer(); } void EnterPokeStorage(u8 boxOption) { ResetTasks(); sCurrentBoxOption = boxOption; gStorage = Alloc(sizeof(struct PokemonStorageSystemData)); if (gStorage == NULL) SetMainCallback2(CB2_ExitPokeStorage); else { gStorage->boxOption = boxOption; gStorage->isReopening = FALSE; sMovingItemId = 0; gStorage->state = 0; gStorage->taskId = CreateTask(Task_InitPokeStorage, 3); SetHelpContext(HELPCONTEXT_BILLS_PC); sLastUsedBox = StorageGetCurrentBox(); SetMainCallback2(CB2_PokeStorage); } } void CB2_ReturnToPokeStorage(void) { ResetTasks(); gStorage = Alloc(sizeof(struct PokemonStorageSystemData)); if (gStorage == NULL) SetMainCallback2(CB2_ExitPokeStorage); else { gStorage->boxOption = sCurrentBoxOption; gStorage->isReopening = TRUE; gStorage->state = 0; gStorage->taskId = CreateTask(Task_InitPokeStorage, 3); SetHelpContext(HELPCONTEXT_BILLS_PC); SetMainCallback2(CB2_PokeStorage); } } static void ResetAllBgCoords(void) { SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); } static void ResetForPokeStorage(void) { ResetPaletteFade(); ResetSpriteData(); FreeSpriteTileRanges(); FreeAllSpritePalettes(); ClearDma3Requests(); gReservedSpriteTileCount = 0x280; UnkUtil_Init(&gStorage->unkUtil, gStorage->unkUtilData, ARRAY_COUNT(gStorage->unkUtilData)); gKeyRepeatStartDelay = 20; ClearScheduledBgCopiesToVram(); TilemapUtil_Init(TILEMAP_COUNT); TilemapUtil_SetTilemap(TILEMAP_PKMN_DATA, 1, sPkmnData_Tilemap, 8, 4); TilemapUtil_SetPos(TILEMAP_PKMN_DATA, 1, 0); gStorage->closeBoxFlashing = FALSE; } static void InitStartingPosData(void) { ClearSavedCursorPos(); sInPartyMenu = gStorage->boxOption == OPTION_DEPOSIT; sDepositBoxId = 0; } static void SetMonIconTransparency(void) { if (gStorage->boxOption == OPTION_MOVE_ITEMS) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(7, 11)); } SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP); } static void SetPokeStorageTask(TaskFunc newFunc) { gTasks[gStorage->taskId].func = newFunc; gStorage->state = 0; } static void Task_InitPokeStorage(u8 taskId) { switch (gStorage->state) { case 0: SetVBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetForPokeStorage(); if (gStorage->isReopening) { switch (sWhichToReshow) { case SCREEN_CHANGE_NAME_BOX - 1: LoadSavedMovingMon(); break; case SCREEN_CHANGE_SUMMARY_SCREEN - 1: SetSelectionAfterSummaryScreen(); break; case SCREEN_CHANGE_ITEM_FROM_BAG - 1: GiveChosenBagItem(); break; } } LoadPokeStorageMenuGfx(); LoadsMiscSpritePalette(); break; case 1: if (!InitPokeStorageWindows()) { SetPokeStorageTask(Task_ChangeScreen); return; } break; case 2: PutWindowTilemap(0); ClearWindowTilemap(1); CpuFill32(0, (void *)VRAM, 0x200); LoadUserWindowGfx(1, 0xB, BG_PLTT_ID(14)); break; case 3: ResetAllBgCoords(); if (!gStorage->isReopening) InitStartingPosData(); break; case 4: InitMonIconFields(); if (!gStorage->isReopening) InitCursor(); else InitCursorOnReopen(); break; case 5: if (!MultiMove_Init()) { SetPokeStorageTask(Task_ChangeScreen); return; } else { SetScrollingBackground(); InitPokeStorageBg0(); } break; case 6: InitPalettesAndSprites(); break; case 7: InitSupplementalTilemaps(); break; case 8: CreateInitBoxTask(StorageGetCurrentBox()); break; case 9: if (IsInitBoxActive()) return; if (gStorage->boxOption != OPTION_MOVE_ITEMS) { gStorage->markMenu.baseTileTag = GFXTAG_MARKING_MENU; gStorage->markMenu.basePaletteTag = PALTAG_MARKING_MENU; InitMonMarkingsMenu(&gStorage->markMenu); BufferMonMarkingsMenuTiles(); } else { CreateItemIconSprites(); InitCursorItemIcon(); } break; case 10: SetMonIconTransparency(); if (!gStorage->isReopening) { BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); SetPokeStorageTask(Task_ShowPokeStorage); } else { BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); SetPokeStorageTask(Task_ReshowPokeStorage); } SetVBlankCallback(VBlankCB_PokeStorage); return; default: return; } gStorage->state++; } static void Task_ShowPokeStorage(u8 taskId) { switch (gStorage->state) { case 0: PlaySE(SE_PC_LOGIN); BeginPCScreenEffect_TurnOn(20, 0, 1); gStorage->state++; break; case 1: if (!IsPCScreenEffectRunning_TurnOn()) SetPokeStorageTask(Task_PokeStorageMain); break; } } static void Task_ReshowPokeStorage(u8 taskId) { switch (gStorage->state) { case 0: BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, RGB_BLACK); gStorage->state++; break; case 1: if (!UpdatePaletteFade()) SetPokeStorageTask(Task_PokeStorageMain); break; } } static void Task_PokeStorageMain(u8 taskId) { switch (gStorage->state) { case 0: switch (HandleInput()) { case INPUT_MOVE_CURSOR: PlaySE(SE_SELECT); gStorage->state = 1; break; case INPUT_SHOW_PARTY: if (gStorage->boxOption != OPTION_MOVE_MONS && gStorage->boxOption != OPTION_MOVE_ITEMS) { PrintStorageMessage(MSG_WHICH_ONE_WILL_TAKE); gStorage->state = 3; } else { ClearSavedCursorPos(); SetPokeStorageTask(Task_ShowPartyPokemon); } break; case INPUT_HIDE_PARTY: if (gStorage->boxOption == OPTION_MOVE_MONS) { if (IsMonBeingMoved() && ItemIsMail(gStorage->displayMonItemId)) gStorage->state = 5; else SetPokeStorageTask(Task_HidePartyPokemon); } else if (gStorage->boxOption == OPTION_MOVE_ITEMS) SetPokeStorageTask(Task_HidePartyPokemon); break; case INPUT_CLOSE_BOX: SetPokeStorageTask(Task_OnCloseBoxPressed); break; case INPUT_PRESSED_B: SetPokeStorageTask(Task_OnBPressed); break; case INPUT_BOX_OPTIONS: PlaySE(SE_SELECT); SetPokeStorageTask(Task_HandleBoxOptions); break; case INPUT_IN_MENU: SetPokeStorageTask(Task_OnSelectedMon); break; case INPUT_SCROLL_RIGHT: PlaySE(SE_SELECT); gStorage->newCurrBoxId = StorageGetCurrentBox() + 1; if (gStorage->newCurrBoxId >= TOTAL_BOXES_COUNT) gStorage->newCurrBoxId = 0; if (gStorage->boxOption != OPTION_MOVE_ITEMS) { SetUpScrollToBox(gStorage->newCurrBoxId); gStorage->state = 2; } else { TryHideItemAtCursor(); gStorage->state = 10; } break; case INPUT_SCROLL_LEFT: PlaySE(SE_SELECT); gStorage->newCurrBoxId = StorageGetCurrentBox() - 1; if (gStorage->newCurrBoxId < 0) gStorage->newCurrBoxId = TOTAL_BOXES_COUNT - 1; if (gStorage->boxOption != OPTION_MOVE_ITEMS) { SetUpScrollToBox(gStorage->newCurrBoxId); gStorage->state = 2; } else { TryHideItemAtCursor(); gStorage->state = 10; } break; case INPUT_DEPOSIT: if (!CanMovePartyMon()) { if (ItemIsMail(gStorage->displayMonItemId)) gStorage->state = 5; else { PlaySE(SE_SELECT); SetPokeStorageTask(Task_DepositMenu); } } else gStorage->state = 4; break; case INPUT_MOVE_MON: if (CanMovePartyMon()) gStorage->state = 4; else { PlaySE(SE_SELECT); SetPokeStorageTask(Task_MoveMon); } break; case INPUT_SHIFT_MON: if (!CanShiftMon()) gStorage->state = 4; else { PlaySE(SE_SELECT); SetPokeStorageTask(Task_ShiftMon); } break; case INPUT_WITHDRAW: PlaySE(SE_SELECT); SetPokeStorageTask(Task_WithdrawMon); break; case INPUT_PLACE_MON: PlaySE(SE_SELECT); SetPokeStorageTask(Task_PlaceMon); break; case INPUT_TAKE_ITEM: PlaySE(SE_SELECT); SetPokeStorageTask(Task_TakeItemForMoving); break; case INPUT_GIVE_ITEM: PlaySE(SE_SELECT); SetPokeStorageTask(Task_GiveMovingItemToMon); break; case INPUT_SWITCH_ITEMS: PlaySE(SE_SELECT); SetPokeStorageTask(Task_SwitchSelectedItem); break; case INPUT_MULTIMOVE_START: PlaySE(SE_SELECT); MultiMove_SetFunction(MULTIMOVE_START); gStorage->state = 7; break; case INPUT_MULTIMOVE_SINGLE: MultiMove_SetFunction(MULTIMOVE_SINGLE); gStorage->state = 8; break; case INPUT_MULTIMOVE_CHANGE_SELECTION: PlaySE(SE_SELECT); MultiMove_SetFunction(MULTIMOVE_CHANGE_SELECTION); gStorage->state = 9; break; case INPUT_MULTIMOVE_GRAB_SELECTION: MultiMove_SetFunction(MULTIMOVE_GRAB_SELECTION); gStorage->state = 7; break; case INPUT_MULTIMOVE_MOVE_MONS: PlaySE(SE_SELECT); MultiMove_SetFunction(MULTIMOVE_MOVE_MONS); gStorage->state = 9; break; case INPUT_MULTIMOVE_PLACE_MONS: PlaySE(SE_SELECT); SetPokeStorageQuestLogEvent(3); MultiMove_SetFunction(MULTIMOVE_PLACE_MONS); gStorage->state = 7; break; case INPUT_MULTIMOVE_UNABLE: PlaySE(SE_FAILURE); break; } break; case 1: if (!UpdateCursorPos()) { if (IsCursorOnCloseBox()) StartFlashingCloseBoxButton(); else StopFlashingCloseBoxButton(); if (gStorage->setMosaic) StartDisplayMonMosaic(); gStorage->state = 0; } break; case 2: if (!ScrollToBox()) { SetCurrentBox(gStorage->newCurrBoxId); if (!sInPartyMenu && !IsMonBeingMoved()) { DoTrySetDisplayMonData(); StartDisplayMonMosaic(); } if (gStorage->boxOption == OPTION_MOVE_ITEMS) { TryShowItemAtCursor(); gStorage->state = 11; } else gStorage->state = 0; } break; case 3: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); gStorage->state = 0; } break; case 4: PlaySE(SE_FAILURE); PrintStorageMessage(MSG_LAST_POKE); gStorage->state = 6; break; case 5: PlaySE(SE_FAILURE); PrintStorageMessage(MSG_PLEASE_REMOVE_MAIL); gStorage->state = 6; break; case 6: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); } break; case 7: if (!MultiMove_RunFunction()) gStorage->state = 0; break; case 8: if (!MultiMove_RunFunction()) SetPokeStorageTask(Task_MoveMon); break; case 9: if (!MultiMove_RunFunction()) { if (gStorage->setMosaic) StartDisplayMonMosaic(); gStorage->state = 0; } break; case 10: if (!IsItemIconAnimActive()) { SetUpScrollToBox(gStorage->newCurrBoxId); gStorage->state = 2; } break; case 11: if (!IsItemIconAnimActive()) gStorage->state = 0; break; } } static void Task_ShowPartyPokemon(u8 taskId) { switch (gStorage->state) { case 0: SetUpDoShowPartyMenu(); gStorage->state++; break; case 1: if (!DoShowPartyMenu()) SetPokeStorageTask(Task_PokeStorageMain); break; } } static void Task_HidePartyPokemon(u8 taskId) { switch (gStorage->state) { case 0: PlaySE(SE_SELECT); SetUpHidePartyMenu(); gStorage->state++; break; case 1: if (!HidePartyMenu()) { SetCursorBoxPosition(GetSavedCursorPos()); gStorage->state++; } break; case 2: if (!UpdateCursorPos()) { if (gStorage->setMosaic) StartDisplayMonMosaic(); SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_OnSelectedMon(u8 taskId) { switch (gStorage->state) { case 0: if (!IsDisplayMonMosaicActive()) { PlaySE(SE_SELECT); if (gStorage->boxOption != OPTION_MOVE_ITEMS) PrintStorageMessage(MSG_IS_SELECTED); else if (IsActiveItemMoving() || gStorage->displayMonItemId != 0) PrintStorageMessage(MSG_IS_SELECTED2); else PrintStorageMessage(MSG_GIVE_TO_MON); AddMenu(); gStorage->state = 1; } break; case 1: if (!IsMenuLoading()) gStorage->state = 2; break; case 2: switch (HandleMenuInput()) { case MENU_B_PRESSED: case MENU_TEXT_CANCEL: ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); break; case MENU_TEXT_MOVE: if (CanMovePartyMon()) gStorage->state = 3; else { PlaySE(SE_SELECT); ClearBottomWindow(); SetPokeStorageTask(Task_MoveMon); } break; case MENU_TEXT_PLACE: PlaySE(SE_SELECT); ClearBottomWindow(); SetPokeStorageTask(Task_PlaceMon); break; case MENU_TEXT_SHIFT: if (!CanShiftMon()) gStorage->state = 3; else { PlaySE(SE_SELECT); ClearBottomWindow(); SetPokeStorageTask(Task_ShiftMon); } break; case MENU_TEXT_WITHDRAW: PlaySE(SE_SELECT); ClearBottomWindow(); SetPokeStorageTask(Task_WithdrawMon); break; case MENU_TEXT_STORE: if (CanMovePartyMon()) gStorage->state = 3; else if (ItemIsMail(gStorage->displayMonItemId)) gStorage->state = 4; else { PlaySE(SE_SELECT); ClearBottomWindow(); SetPokeStorageTask(Task_DepositMenu); } break; case MENU_TEXT_RELEASE: if (CanMovePartyMon()) gStorage->state = 3; else if (gStorage->displayMonIsEgg) gStorage->state = 5; else if (ItemIsMail(gStorage->displayMonItemId)) gStorage->state = 4; else { PlaySE(SE_SELECT); SetPokeStorageTask(Task_ReleaseMon); } break; case MENU_TEXT_SUMMARY: PlaySE(SE_SELECT); SetPokeStorageTask(Task_ShowMonSummary); break; case MENU_TEXT_MARK: PlaySE(SE_SELECT); SetPokeStorageTask(Task_ShowMarkMenu); break; case MENU_TEXT_TAKE: PlaySE(SE_SELECT); SetPokeStorageTask(Task_TakeItemForMoving); break; case MENU_TEXT_GIVE: PlaySE(SE_SELECT); SetPokeStorageTask(Task_GiveMovingItemToMon); break; case MENU_TEXT_BAG: SetPokeStorageTask(Task_ItemToBag); break; case MENU_TEXT_SWITCH: SetPokeStorageTask(Task_SwitchSelectedItem); break; case MENU_TEXT_GIVE2: SetPokeStorageTask(Task_GiveItemFromBag); break; case MENU_TEXT_INFO: SetPokeStorageTask(Task_ShowItemInfo); break; } break; case 3: PlaySE(SE_FAILURE); PrintStorageMessage(MSG_LAST_POKE); gStorage->state = 6; break; case 5: PlaySE(SE_FAILURE); PrintStorageMessage(MSG_CANT_RELEASE_EGG); gStorage->state = 6; break; case 4: PlaySE(SE_FAILURE); PrintStorageMessage(MSG_PLEASE_REMOVE_MAIL); gStorage->state = 6; break; case 6: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_MoveMon(u8 taskId) { switch (gStorage->state) { case 0: InitMonPlaceChange(CHANGE_GRAB); gStorage->state++; break; case 1: if (!DoMonPlaceChange()) { if (sInPartyMenu) SetPokeStorageTask(Task_HandleMovingMonFromParty); else SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_PlaceMon(u8 taskId) { switch (gStorage->state) { case 0: SetPokeStorageQuestLogEvent(1); InitMonPlaceChange(CHANGE_PLACE); gStorage->state++; break; case 1: if (!DoMonPlaceChange()) { if (sInPartyMenu) SetPokeStorageTask(Task_HandleMovingMonFromParty); else SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_ShiftMon(u8 taskId) { switch (gStorage->state) { case 0: SetPokeStorageQuestLogEvent(0); InitMonPlaceChange(CHANGE_SHIFT); gStorage->state++; break; case 1: if (!DoMonPlaceChange()) { StartDisplayMonMosaic(); SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_WithdrawMon(u8 taskId) { switch (gStorage->state) { case 0: if (CalculatePlayerPartyCount() == PARTY_SIZE) { PrintStorageMessage(MSG_PARTY_FULL); gStorage->state = 1; } else { SaveCursorPos(); InitMonPlaceChange(CHANGE_GRAB); gStorage->state = 2; } break; case 1: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); } break; case 2: if (!DoMonPlaceChange()) { SetMovingMonPriority(1); SetUpDoShowPartyMenu(); gStorage->state++; } break; case 3: if (!DoShowPartyMenu()) { SetPokeStorageQuestLogEvent(1); InitMonPlaceChange(CHANGE_PLACE); gStorage->state++; } break; case 4: if (!DoMonPlaceChange()) { UpdatePartySlotColors(); gStorage->state++; } break; case 5: SetPokeStorageTask(Task_HidePartyPokemon); break; } } static void Task_DepositMenu(u8 taskId) { u8 boxId; switch (gStorage->state) { case 0: PrintStorageMessage(MSG_DEPOSIT_IN_WHICH_BOX); LoadChooseBoxMenuGfx(&gStorage->chooseBoxMenu, GFXTAG_CHOOSE_BOX_MENU_CENTER, PALTAG_MISC_1, 3, FALSE); CreateChooseBoxMenuSprites(sDepositBoxId); gStorage->state++; break; case 1: boxId = HandleBoxChooseSelectionInput(); switch (boxId) { case BOXID_NONE_CHOSEN: break; case BOXID_CANCELED: ClearBottomWindow(); DestroyChooseBoxMenuSprites(); FreeBoxSelectionPopupSpriteGfx(); SetPokeStorageTask(Task_PokeStorageMain); break; default: if (TryStorePartyMonInBox(boxId)) { sDepositBoxId = boxId; SetPokeStorageQuestLogEvent(2); ClearBottomWindow(); DestroyChooseBoxMenuSprites(); FreeBoxSelectionPopupSpriteGfx(); gStorage->state = 2; } else { PrintStorageMessage(MSG_BOX_IS_FULL); gStorage->state = 4; } break; } break; case 2: CompactPartySlots(); CompactPartySprites(); gStorage->state++; break; case 3: if (GetNumPartySpritesCompacting() == 0) { ResetSelectionAfterDeposit(); StartDisplayMonMosaic(); UpdatePartySlotColors(); SetPokeStorageTask(Task_PokeStorageMain); } break; case 4: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { PrintStorageMessage(MSG_DEPOSIT_IN_WHICH_BOX); gStorage->state = 1; } break; } } static void Task_ReleaseMon(u8 taskId) { switch (gStorage->state) { case 0: PrintStorageMessage(MSG_RELEASE_POKE); ShowYesNoWindow(1); gStorage->state++; // fallthrough case 1: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case MENU_B_PRESSED: case 1: ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); break; case 0: ClearBottomWindow(); InitCanReleaseMonVars(); InitReleaseMon(); gStorage->state++; break; } break; case 2: RunCanReleaseMon(); if (!TryHideReleaseMon()) { while (TRUE) { // keep checking until status is no longer RELEASE_MON_UNDETERMINED s8 canReleaseStatus = RunCanReleaseMon(); if (canReleaseStatus == RELEASE_MON_ALLOWED) { gStorage->state++; break; } else if (canReleaseStatus == RELEASE_MON_NOT_ALLOWED) { gStorage->state = 8; // Can't release the mon. break; } } } break; case 3: ReleaseMon(); RefreshDisplayMonData(); PrintStorageMessage(MSG_WAS_RELEASED); gStorage->state++; break; case 4: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { PrintStorageMessage(MSG_BYE_BYE); gStorage->state++; } break; case 5: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); if (sInPartyMenu) { CompactPartySlots(); CompactPartySprites(); gStorage->state++; } else gStorage->state = 7; } break; case 6: if (GetNumPartySpritesCompacting() == 0) { DoTrySetDisplayMonData(); StartDisplayMonMosaic(); UpdatePartySlotColors(); gStorage->state++; } break; case 7: SetPokeStorageTask(Task_PokeStorageMain); break; case 8: // Start "can't release" sequence PrintStorageMessage(MSG_WAS_RELEASED); gStorage->state++; break; case 9: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { PrintStorageMessage(MSG_SURPRISE); gStorage->state++; } break; case 10: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); DoReleaseMonComeBackAnim(); gStorage->state++; } break; case 11: if (!ResetReleaseMonSpritePtr()) { TrySetCursorFistAnim(); PrintStorageMessage(MSG_CAME_BACK); gStorage->state++; } break; case 12: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { PrintStorageMessage(MSG_WORRIED); gStorage->state++; } break; case 13: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_ShowMarkMenu(u8 taskId) { switch (gStorage->state) { case 0: PrintStorageMessage(MSG_MARK_POKE); gStorage->markMenu.markings = gStorage->displayMonMarkings; OpenMonMarkingsMenu(gStorage->displayMonMarkings, 176, 16); gStorage->state++; break; case 1: if (!HandleMonMarkingsMenuInput()) { FreeMonMarkingsMenu(); ClearBottomWindow(); SetMonMarkings(gStorage->markMenu.markings); RefreshDisplayMonData(); SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_TakeItemForMoving(u8 taskId) { switch (gStorage->state) { case 0: if (!ItemIsMail(gStorage->displayMonItemId)) { ClearBottomWindow(); gStorage->state++; } else SetPokeStorageTask(Task_PrintCantStoreMail); break; case 1: StartCursorAnim(CURSOR_ANIM_OPEN); Item_FromMonToMoving(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); gStorage->state++; break; case 2: if (!IsItemIconAnimActive()) { StartCursorAnim(CURSOR_ANIM_FIST); ClearBottomWindow(); DoTrySetDisplayMonData(); PrintDisplayMonInfo(); gStorage->state++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) SetPokeStorageTask(Task_PokeStorageMain); break; } } static void Task_GiveMovingItemToMon(u8 taskId) { switch (gStorage->state) { case 0: ClearBottomWindow(); gStorage->state++; break; case 1: StartCursorAnim(CURSOR_ANIM_OPEN); Item_GiveMovingToMon(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); gStorage->state++; break; case 2: if (!IsItemIconAnimActive()) { StartCursorAnim(CURSOR_ANIM_BOUNCE); DoTrySetDisplayMonData(); PrintDisplayMonInfo(); PrintStorageMessage(MSG_ITEM_IS_HELD); gStorage->state++; } break; case 3: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); gStorage->state++; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) SetPokeStorageTask(Task_PokeStorageMain); break; } } static void Task_ItemToBag(u8 taskId) { switch (gStorage->state) { case 0: if (!AddBagItem(gStorage->displayMonItemId, 1)) { PlaySE(SE_FAILURE); PrintStorageMessage(MSG_BAG_FULL); gStorage->state = 3; } else { PlaySE(SE_SELECT); Item_TakeMons(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); gStorage->state = 1; } break; case 1: if (!IsItemIconAnimActive()) { PrintStorageMessage(MSG_PLACED_IN_BAG); gStorage->state = 2; } break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); DoTrySetDisplayMonData(); PrintDisplayMonInfo(); gStorage->state = 4; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) SetPokeStorageTask(Task_PokeStorageMain); break; case 3: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_SwitchSelectedItem(u8 taskId) { switch (gStorage->state) { case 0: if (!ItemIsMail(gStorage->displayMonItemId)) { ClearBottomWindow(); gStorage->state++; } else SetPokeStorageTask(Task_PrintCantStoreMail); break; case 1: StartCursorAnim(CURSOR_ANIM_OPEN); Item_SwitchMonsWithMoving(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); gStorage->state++; break; case 2: if (!IsItemIconAnimActive()) { StartCursorAnim(CURSOR_ANIM_FIST); DoTrySetDisplayMonData(); PrintDisplayMonInfo(); PrintStorageMessage(MSG_CHANGED_TO_ITEM); gStorage->state++; } break; case 3: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); gStorage->state++; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) SetPokeStorageTask(Task_PokeStorageMain); break; } } static void Task_ShowItemInfo(u8 taskId) { switch (gStorage->state) { case 0: ClearBottomWindow(); gStorage->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { PlaySE(SE_WIN_OPEN); PrintItemDescription(); InitItemInfoWindow(); gStorage->state++; } break; case 2: if (!UpdateItemInfoWindowSlideIn()) gStorage->state++; break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) gStorage->state++; break; case 4: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { PlaySE(SE_WIN_OPEN); gStorage->state++; } break; case 5: if (!UpdateItemInfoWindowSlideOut()) gStorage->state++; break; case 6: if (!IsDma3ManagerBusyWithBgCopy()) SetPokeStorageTask(Task_PokeStorageMain); break; } } static void Task_CloseBoxWhileHoldingItem(u8 taskId) { switch (gStorage->state) { case 0: PlaySE(SE_SELECT); PrintStorageMessage(MSG_PUT_IN_BAG); ShowYesNoWindow(0); gStorage->state = 1; break; case 1: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case MENU_B_PRESSED: case 1: ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); break; case 0: if (AddBagItem(gStorage->movingItemId, 1) == TRUE) { ClearBottomWindow(); gStorage->state = 3; } else { PrintStorageMessage(MSG_BAG_FULL); gStorage->state = 2; } break; } break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); gStorage->state = 5; } break; case 3: MoveItemFromCursorToBag(); gStorage->state = 4; break; case 4: if (!IsItemIconAnimActive()) { StartCursorAnim(CURSOR_ANIM_BOUNCE); SetPokeStorageTask(Task_PokeStorageMain); } break; case 5: if (!IsDma3ManagerBusyWithBgCopy()) SetPokeStorageTask(Task_PokeStorageMain); break; } } static void Task_HandleMovingMonFromParty(u8 taskId) { switch (gStorage->state) { case 0: CompactPartySlots(); CompactPartySprites(); gStorage->state++; break; case 1: if (GetNumPartySpritesCompacting() == 0) { UpdatePartySlotColors(); SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_PrintCantStoreMail(u8 taskId) { switch (gStorage->state) { case 0: PrintStorageMessage(MSG_CANT_STORE_MAIL); gStorage->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) gStorage->state++; break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); gStorage->state++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) SetPokeStorageTask(Task_PokeStorageMain); break; } } static void Task_HandleBoxOptions(u8 taskId) { switch (gStorage->state) { case 0: PrintStorageMessage(MSG_WHAT_YOU_DO); AddMenu(); gStorage->state++; break; case 1: if (IsMenuLoading()) return; gStorage->state++; case 2: switch (HandleMenuInput()) { case MENU_B_PRESSED: case MENU_TEXT_CANCEL: AnimateBoxScrollArrows(TRUE); ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); break; case MENU_TEXT_NAME: PlaySE(SE_SELECT); SetPokeStorageTask(Task_NameBox); break; case MENU_TEXT_WALLPAPER: PlaySE(SE_SELECT); ClearBottomWindow(); SetPokeStorageTask(Task_HandleWallpapers); break; case MENU_TEXT_JUMP: PlaySE(SE_SELECT); ClearBottomWindow(); SetPokeStorageTask(Task_JumpBox); break; } break; } } static void Task_HandleWallpapers(u8 taskId) { switch (gStorage->state) { case 0: AddWallpaperSetsMenu(); PrintStorageMessage(MSG_PICK_A_THEME); gStorage->state++; break; case 1: if (!IsMenuLoading()) gStorage->state++; break; case 2: gStorage->wallpaperSetId = HandleMenuInput(); switch (gStorage->wallpaperSetId) { case MENU_B_PRESSED: AnimateBoxScrollArrows(TRUE); ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); break; case MENU_TEXT_SCENERY_1: case MENU_TEXT_SCENERY_2: case MENU_TEXT_SCENERY_3: case MENU_TEXT_ETCETERA: PlaySE(SE_SELECT); RemoveMenu(); gStorage->wallpaperSetId -= MENU_TEXT_SCENERY_1; gStorage->state++; break; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { AddWallpapersMenu(gStorage->wallpaperSetId); PrintStorageMessage(MSG_PICK_A_WALLPAPER); gStorage->state++; } break; case 4: gStorage->wallpaperId = HandleMenuInput(); switch (gStorage->wallpaperId) { case MENU_NOTHING_CHOSEN: break; case MENU_B_PRESSED: ClearBottomWindow(); gStorage->state = 0; break; default: PlaySE(SE_SELECT); ClearBottomWindow(); gStorage->wallpaperId -= MENU_TEXT_FOREST; SetWallpaperForCurrentBox(gStorage->wallpaperId); gStorage->state++; break; } break; case 5: if (!DoWallpaperGfxChange()) { AnimateBoxScrollArrows(TRUE); SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_JumpBox(u8 taskId) { switch (gStorage->state) { case 0: PrintStorageMessage(MSG_JUMP_TO_WHICH_BOX); LoadChooseBoxMenuGfx(&gStorage->chooseBoxMenu, GFXTAG_CHOOSE_BOX_MENU_CENTER, PALTAG_MISC_1, 3, FALSE); CreateChooseBoxMenuSprites(StorageGetCurrentBox()); gStorage->state++; break; case 1: gStorage->newCurrBoxId = HandleBoxChooseSelectionInput(); switch (gStorage->newCurrBoxId) { case BOXID_NONE_CHOSEN: break; default: ClearBottomWindow(); DestroyChooseBoxMenuSprites(); FreeBoxSelectionPopupSpriteGfx(); if (gStorage->newCurrBoxId == BOXID_CANCELED || gStorage->newCurrBoxId == StorageGetCurrentBox()) { AnimateBoxScrollArrows(TRUE); SetPokeStorageTask(Task_PokeStorageMain); } else gStorage->state++; break; } break; case 2: SetUpScrollToBox(gStorage->newCurrBoxId); gStorage->state++; break; case 3: if (!ScrollToBox()) { SetCurrentBox(gStorage->newCurrBoxId); SetPokeStorageTask(Task_PokeStorageMain); } break; } } static void Task_NameBox(u8 taskId) { switch (gStorage->state) { case 0: SaveMovingMon(); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gStorage->state++; break; case 1: if (!UpdatePaletteFade()) { sWhichToReshow = SCREEN_CHANGE_NAME_BOX - 1; gStorage->screenChangeType = SCREEN_CHANGE_NAME_BOX; SetPokeStorageTask(Task_ChangeScreen); } break; } } static void Task_ShowMonSummary(u8 taskId) { switch (gStorage->state) { case 0: InitSummaryScreenData(); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gStorage->state++; break; case 1: if (!UpdatePaletteFade()) { sWhichToReshow = SCREEN_CHANGE_SUMMARY_SCREEN - 1; gStorage->screenChangeType = SCREEN_CHANGE_SUMMARY_SCREEN; SetPokeStorageTask(Task_ChangeScreen); } break; } } static void Task_GiveItemFromBag(u8 taskId) { switch (gStorage->state) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gStorage->state++; break; case 1: if (!UpdatePaletteFade()) { sWhichToReshow = SCREEN_CHANGE_ITEM_FROM_BAG - 1; gStorage->screenChangeType = SCREEN_CHANGE_ITEM_FROM_BAG; SetPokeStorageTask(Task_ChangeScreen); } break; } } static void Task_OnCloseBoxPressed(u8 taskId) { switch (gStorage->state) { case 0: if (IsMonBeingMoved()) { PlaySE(SE_FAILURE); PrintStorageMessage(MSG_HOLDING_POKE); gStorage->state = 1; } else if (IsActiveItemMoving()) SetPokeStorageTask(Task_CloseBoxWhileHoldingItem); else { PlaySE(SE_SELECT); PrintStorageMessage(MSG_EXIT_BOX); ShowYesNoWindow(0); gStorage->state = 2; } break; case 1: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); } break; case 2: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case MENU_B_PRESSED: case 1: ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); break; case 0: PlaySE(SE_PC_OFF); ClearBottomWindow(); gStorage->state++; break; } break; case 3: BeginPCScreenEffect_TurnOff(20, 0, 1); gStorage->state++; break; case 4: if (!IsPCScreenEffectRunning_TurnOff()) { UpdateBoxToSendMons(); gPlayerPartyCount = CalculatePlayerPartyCount(); gStorage->screenChangeType = SCREEN_CHANGE_EXIT_BOX; SetPokeStorageTask(Task_ChangeScreen); } break; } } static void Task_OnBPressed(u8 taskId) { switch (gStorage->state) { case 0: if (IsMonBeingMoved()) { PlaySE(SE_FAILURE); PrintStorageMessage(MSG_HOLDING_POKE); gStorage->state = 1; } else if (IsActiveItemMoving()) SetPokeStorageTask(Task_CloseBoxWhileHoldingItem); else { PlaySE(SE_SELECT); PrintStorageMessage(MSG_CONTINUE_BOX); ShowYesNoWindow(0); gStorage->state = 2; } break; case 1: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); } break; case 2: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: ClearBottomWindow(); SetPokeStorageTask(Task_PokeStorageMain); break; case 1: case MENU_B_PRESSED: PlaySE(SE_PC_OFF); ClearBottomWindow(); gStorage->state++; break; } break; case 3: BeginPCScreenEffect_TurnOff(20, 0, 0); gStorage->state++; break; case 4: if (!IsPCScreenEffectRunning_TurnOff()) { UpdateBoxToSendMons(); gPlayerPartyCount = CalculatePlayerPartyCount(); gStorage->screenChangeType = SCREEN_CHANGE_EXIT_BOX; SetPokeStorageTask(Task_ChangeScreen); } break; } } static void Task_ChangeScreen(u8 taskId) { struct Pokemon *party; u8 mode, cursorPos, lastIndex; u8 screenChangeType = gStorage->screenChangeType; if (gStorage->boxOption == OPTION_MOVE_ITEMS && IsActiveItemMoving() == TRUE) sMovingItemId = GetMovingItem(); else sMovingItemId = ITEM_NONE; switch (screenChangeType) { case SCREEN_CHANGE_EXIT_BOX: default: FreePokeStorageData(); SetMainCallback2(CB2_ExitPokeStorage); break; case SCREEN_CHANGE_SUMMARY_SCREEN: party = gStorage->summaryMonPtr.mon; cursorPos = gStorage->summaryCursorPos; lastIndex = gStorage->summaryLastIndex; mode = gStorage->summaryScreenMode; FreePokeStorageData(); ShowPokemonSummaryScreen(party, cursorPos, lastIndex, CB2_ReturnToPokeStorage, mode); break; case SCREEN_CHANGE_NAME_BOX: FreePokeStorageData(); DoNamingScreen(NAMING_SCREEN_BOX, GetBoxNamePtr(StorageGetCurrentBox()), 0, 0, 0, CB2_ReturnToPokeStorage); break; case SCREEN_CHANGE_ITEM_FROM_BAG: FreePokeStorageData(); GoToBagMenu(ITEMMENULOCATION_PCBOX, OPEN_BAG_ITEMS, CB2_ReturnToPokeStorage); break; } DestroyTask(taskId); } static void GiveChosenBagItem(void) { u16 item = gSpecialVar_ItemId; if (item != ITEM_NONE) { u8 id = GetBoxCursorPosition(); if (sInPartyMenu) SetMonData(&gPlayerParty[id], MON_DATA_HELD_ITEM, &item); else SetCurrentBoxMonData(id, MON_DATA_HELD_ITEM, &item); RemoveBagItem(item, 1); } } static void FreePokeStorageData(void) { TilemapUtil_Free(); MultiMove_Free(); FREE_AND_SET_NULL(gStorage); FreeAllWindowBuffers(); } static void SetScrollingBackground(void) { SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31)); DecompressAndLoadBgGfxUsingHeap(3, sScrollingBg_Gfx, 0, 0, 0); LZ77UnCompVram(sScrollingBg_Tilemap, (void *)BG_SCREEN_ADDR(31)); } static void ScrollBackground(void) { ChangeBgX(3, 128, 1); ChangeBgY(3, 128, 2); } static void LoadPokeStorageMenuGfx(void) { InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); DecompressAndLoadBgGfxUsingHeap(1, gPokeStorageMenu_Gfx, 0, 0, 0); LZ77UnCompWram(sMenu_Tilemap, gStorage->menuTilemapBuffer); SetBgTilemapBuffer(1, gStorage->menuTilemapBuffer); ShowBg(1); ScheduleBgCopyTilemapToVram(1); } static bool8 InitPokeStorageWindows(void) { if (!InitWindows(sWindowTemplates)) return FALSE; DeactivateAllTextPrinters(); return TRUE; } static void LoadsMiscSpritePalette(void) { LoadSpritePalette(&sMiscSpritePalette); } static void InitPalettesAndSprites(void) { LoadPalette(gPokeStorageInterface_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); LoadPalette(gPokeStorageInterface_NoDisplayMon_Pal, BG_PLTT_ID(2), PLTT_SIZE_4BPP); LoadPalette(sItemInfoFrame_Pal, BG_PLTT_ID(15), sizeof(sItemInfoFrame_Pal)); if (gStorage->boxOption != OPTION_MOVE_ITEMS) LoadPalette(sScrollingBg_Pal, BG_PLTT_ID(3), sizeof(sScrollingBg_Pal)); else LoadPalette(sScrollingBgMoveItems_Pal, BG_PLTT_ID(3), sizeof(sScrollingBgMoveItems_Pal)); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(30)); CreateDisplayMonSprite(); CreateMarkingComboSprite(); CreateWaveformSprites(); RefreshDisplayMonData(); } static void CreateMarkingComboSprite(void) { gStorage->markingComboSprite = CreateMonMarkingComboSprite(GFXTAG_MARKING_COMBO, PALTAG_MARKING_COMBO, NULL); gStorage->markingComboSprite->oam.priority = 1; gStorage->markingComboSprite->subpriority = 1; gStorage->markingComboSprite->x = 40; gStorage->markingComboSprite->y = 150; gStorage->markingComboTilesPtr = (void *)OBJ_VRAM0 + 32 * GetSpriteTileStartByTag(GFXTAG_MARKING_COMBO); } static void CreateWaveformSprites(void) { u16 i; struct SpriteSheet sheet = sWaveformSpriteSheet; LoadSpriteSheet(&sheet); for (i = 0; i < 2; i++) { u8 spriteId = CreateSprite(&sSpriteTemplate_Waveform, i * 63 + 8, 9, 2); gStorage->waveformSprites[i] = &gSprites[spriteId]; } } static void RefreshDisplayMonData(void) { LoadDisplayMonGfx(gStorage->displayMonSpecies, gStorage->displayMonPersonality); PrintDisplayMonInfo(); UpdateWaveformAnimation(); ScheduleBgCopyTilemapToVram(0); } static void StartDisplayMonMosaic(void) { RefreshDisplayMonData(); if (gStorage->displayMonSprite) { gStorage->displayMonSprite->oam.mosaic = TRUE; gStorage->displayMonSprite->data[0] = 10; gStorage->displayMonSprite->data[1] = 1; gStorage->displayMonSprite->callback = SpriteCB_DisplayMonMosaic; SetGpuReg(REG_OFFSET_MOSAIC, (gStorage->displayMonSprite->data[0] << 12) | (gStorage->displayMonSprite->data[0] << 8)); } } static u8 IsDisplayMonMosaicActive(void) { return gStorage->displayMonSprite->oam.mosaic; } static void SpriteCB_DisplayMonMosaic(struct Sprite *sprite) { sprite->data[0] -= sprite->data[1]; if (sprite->data[0] < 0) sprite->data[0] = 0; SetGpuReg(REG_OFFSET_MOSAIC, (sprite->data[0] << 12) | (sprite->data[0] << 8)); if (sprite->data[0] == 0) { sprite->oam.mosaic = FALSE; sprite->callback = SpriteCallbackDummy; } } static void CreateDisplayMonSprite(void) { u16 i; u16 tileStart; u8 palSlot; u8 spriteId; struct SpriteSheet sheet = {gStorage->tileBuffer, MON_PIC_SIZE, GFXTAG_DISPLAY_MON}; struct SpritePalette palette = {gStorage->displayMonPalBuffer, PALTAG_DISPLAY_MON}; struct SpriteTemplate template = sSpriteTemplate_DisplayMon; for (i = 0; i < MON_PIC_SIZE; i++) gStorage->tileBuffer[i] = 0; for (i = 0; i < 0x10; i++) gStorage->displayMonPalBuffer[i] = 0; gStorage->displayMonSprite = NULL; do { tileStart = LoadSpriteSheet(&sheet); if (tileStart == 0) break; palSlot = LoadSpritePalette(&palette); if (palSlot == 0xFF) break; spriteId = CreateSprite(&template, 40, 48, 0); if (spriteId == MAX_SPRITES) break; gStorage->displayMonSprite = &gSprites[spriteId]; gStorage->displayMonPalOffset = OBJ_PLTT_ID(palSlot); gStorage->displayMonTilePtr = (void *)OBJ_VRAM0 + tileStart * 32; } while (FALSE); if (gStorage->displayMonSprite == NULL) { FreeSpriteTilesByTag(GFXTAG_DISPLAY_MON); FreeSpritePaletteByTag(PALTAG_DISPLAY_MON); } } static void LoadDisplayMonGfx(u16 species, u32 personality) { if (gStorage->displayMonSprite == NULL) return; if (species != SPECIES_NONE) { HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gStorage->tileBuffer, species, personality); LZ77UnCompWram(gStorage->displayMonPalette, gStorage->displayMonPalBuffer); CpuCopy32(gStorage->tileBuffer, gStorage->displayMonTilePtr, 0x800); LoadPalette(gStorage->displayMonPalBuffer, gStorage->displayMonPalOffset, PLTT_SIZE_4BPP); gStorage->displayMonSprite->invisible = FALSE; } else gStorage->displayMonSprite->invisible = TRUE; } static void PrintDisplayMonInfo(void) { u16 i; u16 y; FillWindowPixelBuffer(0, PIXEL_FILL(1)); if (gStorage->boxOption != OPTION_MOVE_ITEMS) { for (i = 0, y = 0; i < 3; i++, y += 14) AddTextPrinterParameterized(0, FONT_NORMAL, gStorage->displayMonTexts[i], i == 2 ? 10 : 6, y, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(0, FONT_SMALL, gStorage->displayMonTexts[3], 6, y + 2, TEXT_SKIP_DRAW, NULL); } else { AddTextPrinterParameterized(0, FONT_SMALL, gStorage->displayMonTexts[3], 6, 0, TEXT_SKIP_DRAW, NULL); for (i = 0, y = 15; i < 3; i++, y += 14) AddTextPrinterParameterized(0, FONT_NORMAL, gStorage->displayMonTexts[i], i == 2 ? 10 : 6, y, TEXT_SKIP_DRAW, NULL); } CopyWindowToVram(0, COPYWIN_GFX); if (gStorage->displayMonSpecies != SPECIES_NONE) { UpdateMonMarkingTiles(gStorage->displayMonMarkings, gStorage->markingComboTilesPtr); gStorage->markingComboSprite->invisible = FALSE; } else gStorage->markingComboSprite->invisible = TRUE; } static void UpdateWaveformAnimation(void) { u16 i; if (gStorage->displayMonSpecies != SPECIES_NONE) { TilemapUtil_SetRect(TILEMAP_PKMN_DATA, 0, 0, 8, 2); for (i = 0; i < 2; i++) StartSpriteAnimIfDifferent(gStorage->waveformSprites[i], i * 2 + 1); } else { TilemapUtil_SetRect(TILEMAP_PKMN_DATA, 0, 2, 8, 2); for (i = 0; i < 2; i++) StartSpriteAnim(gStorage->waveformSprites[i], i * 2); } TilemapUtil_Update(TILEMAP_PKMN_DATA); ScheduleBgCopyTilemapToVram(1); } static void InitSupplementalTilemaps(void) { LZ77UnCompWram(gPokeStoragePartyMenu_Tilemap, gStorage->partyMenuTilemapBuffer); LoadPalette(gPokeStoragePartyMenu_Pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); TilemapUtil_SetTilemap(TILEMAP_PARTY_MENU, 1, gStorage->partyMenuTilemapBuffer, 12, 22); TilemapUtil_SetTilemap(TILEMAP_CLOSE_BUTTON, 1, sCloseBoxButton_Tilemap, 9, 4); TilemapUtil_SetPos(TILEMAP_PARTY_MENU, 10, 0); TilemapUtil_SetPos(TILEMAP_CLOSE_BUTTON, 21, 0); SetPartySlotTilemaps(); if (sInPartyMenu) { UpdateCloseBoxButtonTilemap(TRUE); CreatePartyMonsSprites(TRUE); TilemapUtil_Update(TILEMAP_CLOSE_BUTTON); TilemapUtil_Update(TILEMAP_PARTY_MENU); } else { TilemapUtil_SetRect(TILEMAP_PARTY_MENU, 0, 20, 12, 2); UpdateCloseBoxButtonTilemap(TRUE); TilemapUtil_Update(TILEMAP_PARTY_MENU); TilemapUtil_Update(TILEMAP_CLOSE_BUTTON); } ScheduleBgCopyTilemapToVram(1); gStorage->closeBoxFlashing = FALSE; } static void SetUpShowPartyMenu(void) { gStorage->partyMenuUnused1 = 20; gStorage->partyMenuY = 2; gStorage->partyMenuMoveTimer = 0; CreatePartyMonsSprites(FALSE); } static bool8 ShowPartyMenu(void) { if (gStorage->partyMenuMoveTimer == 20) return FALSE; gStorage->partyMenuUnused1--; gStorage->partyMenuY++; TilemapUtil_Move(TILEMAP_PARTY_MENU, 3, 1); TilemapUtil_Update(TILEMAP_PARTY_MENU); ScheduleBgCopyTilemapToVram(1); MovePartySprites(8); if (++gStorage->partyMenuMoveTimer == 20) { sInPartyMenu = TRUE; return FALSE; } else return TRUE; } static void SetUpHidePartyMenu(void) { gStorage->partyMenuUnused1 = 0; gStorage->partyMenuY = 22; gStorage->partyMenuMoveTimer = 0; if (gStorage->boxOption == OPTION_MOVE_ITEMS) MoveHeldItemWithPartyMenu(); } static bool8 HidePartyMenu(void) { if (gStorage->partyMenuMoveTimer != 20) { gStorage->partyMenuUnused1++; gStorage->partyMenuY--; TilemapUtil_Move(TILEMAP_PARTY_MENU, 3, -1); TilemapUtil_Update(TILEMAP_PARTY_MENU); FillBgTilemapBufferRect_Palette0(1, 0x100, 10, gStorage->partyMenuY, 12, 1); MovePartySprites(-8); if (++gStorage->partyMenuMoveTimer != 20) { ScheduleBgCopyTilemapToVram(1); return TRUE; } else { sInPartyMenu = FALSE; DestroyAllPartyMonIcons(); CompactPartySlots(); TilemapUtil_SetRect(TILEMAP_CLOSE_BUTTON, 0, 0, 9, 2); TilemapUtil_Update(TILEMAP_CLOSE_BUTTON); ScheduleBgCopyTilemapToVram(1); return FALSE; } } return FALSE; } static void UpdateCloseBoxButtonTilemap(bool8 normal) { if (normal) TilemapUtil_SetRect(TILEMAP_CLOSE_BUTTON, 0, 0, 9, 2); else TilemapUtil_SetRect(TILEMAP_CLOSE_BUTTON, 0, 2, 9, 2); TilemapUtil_Update(TILEMAP_CLOSE_BUTTON); ScheduleBgCopyTilemapToVram(1); } static void StartFlashingCloseBoxButton(void) { gStorage->closeBoxFlashing = TRUE; gStorage->closeBoxFlashTimer = 30; gStorage->closeBoxFlashState = TRUE; } static void StopFlashingCloseBoxButton(void) { if (gStorage->closeBoxFlashing) { gStorage->closeBoxFlashing = FALSE; UpdateCloseBoxButtonTilemap(TRUE); } } static void UpdateCloseBoxButtonFlash(void) { if (gStorage->closeBoxFlashing && ++gStorage->closeBoxFlashTimer > 30) { gStorage->closeBoxFlashTimer = 0; gStorage->closeBoxFlashState = (gStorage->closeBoxFlashState == FALSE); UpdateCloseBoxButtonTilemap(gStorage->closeBoxFlashState); } } static void SetPartySlotTilemaps(void) { u8 i; // Skips first party slot, it should always be drawn // as if it has a Pokémon in it for (i = 1; i < PARTY_SIZE; i++) { s32 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); SetPartySlotTilemap(i, (species != SPECIES_NONE)); } } static void SetPartySlotTilemap(u8 pos, bool8 isFilled) { u16 i, j, index; const u16 *tilemap; if (isFilled) tilemap = sPartySlotFilled_Tilemap; else tilemap = sPartySlotEmpty_Tilemap; index = 3 * (3 * (pos - 1) + 1); index *= 4; index += 7; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) gStorage->partyMenuTilemapBuffer[index + j] = tilemap[j]; tilemap += 4; index += 12; } } static void UpdatePartySlotColors(void) { SetPartySlotTilemaps(); TilemapUtil_SetRect(TILEMAP_PARTY_MENU, 0, 0, 12, 22); TilemapUtil_Update(TILEMAP_PARTY_MENU); ScheduleBgCopyTilemapToVram(1); } static void SetUpDoShowPartyMenu(void) { gStorage->showPartyMenuState = 0; PlaySE(SE_WIN_OPEN); SetUpShowPartyMenu(); } static bool8 DoShowPartyMenu(void) { switch (gStorage->showPartyMenuState) { case 0: if (!ShowPartyMenu()) { SetCursorInParty(); gStorage->showPartyMenuState++; } break; case 1: if (!UpdateCursorPos()) { if (gStorage->setMosaic) StartDisplayMonMosaic(); gStorage->showPartyMenuState++; } break; case 2: return FALSE; } return TRUE; } static void InitPokeStorageBg0(void) { SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(29)); LoadStdWindowGfx(1, 2, BG_PLTT_ID(13)); FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17); CopyBgTilemapBufferToVram(0); } static void PrintStorageMessage(u8 id) { u8 *txtPtr; DynamicPlaceholderTextUtil_Reset(); switch (sMessages[id].format) { case MSG_FMT_NONE: break; case MSG_FMT_MON_NAME_1: case MSG_FMT_MON_NAME_2: case MSG_FMT_MON_NAME_3: DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStorage->displayMonNickname); break; case MSG_FMT_RELEASE_MON_1: case MSG_FMT_RELEASE_MON_2: case MSG_FMT_RELEASE_MON_3: DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStorage->releaseMonName); break; case MSG_FMT_ITEM_NAME: if (IsActiveItemMoving()) txtPtr = StringCopy(gStorage->itemName, GetMovingItemName()); else txtPtr = StringCopy(gStorage->itemName, gStorage->displayMonTexts[3]); while (*(txtPtr - 1) == CHAR_SPACE) txtPtr--; *txtPtr = EOS; DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStorage->itemName); break; } DynamicPlaceholderTextUtil_ExpandPlaceholders(gStorage->actionText, sMessages[id].text); FillWindowPixelBuffer(1, PIXEL_FILL(1)); AddTextPrinterParameterized(1, FONT_NORMAL_COPY_1, gStorage->actionText, 0, 2, TEXT_SKIP_DRAW, NULL); DrawTextBorderOuter(1, 2, 13); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_GFX); ScheduleBgCopyTilemapToVram(0); } static void ShowYesNoWindow(s8 cursorPos) { CreateYesNoMenu(&sYesNoWindowTemplate, FONT_NORMAL_COPY_1, 0, 2, 11, 14, 1); Menu_MoveCursorNoWrapAround(cursorPos); } static void ClearBottomWindow(void) { ClearStdWindowAndFrameToTransparent(1, FALSE); ScheduleBgCopyTilemapToVram(0); } static void AddWallpaperSetsMenu(void) { InitMenu(); SetMenuText(MENU_TEXT_SCENERY_1); SetMenuText(MENU_TEXT_SCENERY_2); SetMenuText(MENU_TEXT_SCENERY_3); SetMenuText(MENU_TEXT_ETCETERA); AddMenu(); } static void AddWallpapersMenu(u8 wallpaperSet) { InitMenu(); switch (wallpaperSet) { case 0: // SCENERY_1 SetMenuText(MENU_TEXT_FOREST); SetMenuText(MENU_TEXT_CITY); SetMenuText(MENU_TEXT_DESERT); SetMenuText(MENU_TEXT_SAVANNA); break; case 1: // SCENERY_2 SetMenuText(MENU_TEXT_CRAG); SetMenuText(MENU_TEXT_VOLCANO); SetMenuText(MENU_TEXT_SNOW); SetMenuText(MENU_TEXT_CAVE); break; case 2: // SCENERY_3 SetMenuText(MENU_TEXT_BEACH); SetMenuText(MENU_TEXT_SEAFLOOR); SetMenuText(MENU_TEXT_RIVER); SetMenuText(MENU_TEXT_SKY); break; case 3: // ETCETERA SetMenuText(MENU_TEXT_POLKADOT); SetMenuText(MENU_TEXT_POKECENTER); SetMenuText(MENU_TEXT_MACHINE); SetMenuText(MENU_TEXT_SIMPLE); break; } AddMenu(); } u8 GetCurrentBoxOption(void) { return sCurrentBoxOption; } static void InitCursorItemIcon(void) { if (!IsCursorOnBoxTitle()) { if (sInPartyMenu) TryLoadItemIconAtPos(CURSOR_AREA_IN_PARTY, GetBoxCursorPosition()); else TryLoadItemIconAtPos(CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); } if (sMovingItemId != ITEM_NONE) { InitItemIconInCursor(sMovingItemId); StartCursorAnim(CURSOR_ANIM_FIST); } } static void SetPokeStorageQuestLogEvent(u8 action) { u16 event; struct QuestLogEvent_MovedBoxMon *questLogData; u8 box1 = GetMovingMonOriginalBoxId(); u16 species1 = gStorage->displayMonSpecies; u16 species2; u8 box2; if (sInPartyMenu) { box2 = TOTAL_BOXES_COUNT; species2 = GetMonData(&gPlayerParty[GetBoxCursorPosition()], MON_DATA_SPECIES_OR_EGG); } else { box2 = StorageGetCurrentBox(); species2 = GetCurrentBoxMonData(GetBoxCursorPosition(), MON_DATA_SPECIES_OR_EGG); } questLogData = &gStorage->questLogData; switch (action) { default: return; case 0: if (sInPartyMenu) { if (box1 == TOTAL_BOXES_COUNT) return; else event = QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON; } else { if (box1 == TOTAL_BOXES_COUNT) // Should upmerge but doesn't event = QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON; else event = box1 != box2 ? QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES : QL_EVENT_SWITCHED_MONS_WITHIN_BOX; } questLogData->species1 = species1; questLogData->species2 = species2; questLogData->box1 = box1; questLogData->box2 = box2; break; case 1: questLogData->species1 = species1; questLogData->species2 = SPECIES_NONE; questLogData->box1 = box1; questLogData->box2 = 0xFF; if (sInPartyMenu) { if (box1 == TOTAL_BOXES_COUNT) return; else event = QL_EVENT_WITHDREW_MON_PC; } else { if (box1 == TOTAL_BOXES_COUNT) { event = QL_EVENT_DEPOSITED_MON_PC; questLogData->box1 = box2; } else if (box1 != box2) { event = QL_EVENT_MOVED_MON_BETWEEN_BOXES; questLogData->box2 = box2; } else event = QL_EVENT_MOVED_MON_WITHIN_BOX; } break; case 2: event = QL_EVENT_DEPOSITED_MON_PC; questLogData->species1 = species1; questLogData->species2 = SPECIES_NONE; questLogData->box1 = sDepositBoxId; questLogData->box2 = 0xFF; break; case 3: event = QL_EVENT_SWITCHED_MULTIPLE_MONS; questLogData->species1 = SPECIES_NONE; questLogData->species2 = SPECIES_NONE; questLogData->box1 = box1; questLogData->box2 = box2; break; } SetQuestLogEvent(event, (const u16 *)questLogData); } static void UpdateBoxToSendMons(void) { if (sLastUsedBox != StorageGetCurrentBox()) { FlagClear(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE); VarSet(VAR_PC_BOX_TO_SEND_MON, StorageGetCurrentBox()); } } ================================================ FILE: src/pokemon_summary_screen.c ================================================ #include "global.h" #include "gflib.h" #include "pokemon.h" #include "pokemon_summary_screen.h" #include "help_system.h" #include "task.h" #include "menu_helpers.h" #include "link.h" #include "overworld.h" #include "constants/songs.h" #include "strings.h" #include "new_menu_helpers.h" #include "menu.h" #include "constants/items.h" #include "data.h" #include "item.h" #include "constants/party_menu.h" #include "trade.h" #include "battle_main.h" #include "scanline_effect.h" #include "constants/moves.h" #include "dynamic_placeholder_text_util.h" #include "constants/region_map_sections.h" #include "region_map.h" #include "field_specials.h" #include "party_menu.h" #include "constants/battle.h" #include "event_data.h" #include "trainer_pokemon_sprites.h" #include "battle_anim.h" #include "pokeball.h" #include "pokemon_icon.h" #include "battle_interface.h" #include "mon_markings.h" #include "pokemon_storage_system.h" #include "orre_met_location_strings.h" #include "constants/maps.h" #include "constants/region_map_sections.h" #include "constants/sound.h" #include "constants/weather.h" #include "field_weather.h" #include "battle_setup.h" // needs conflicting header to match (curIndex is s8 in the function, but has to be defined as u8 here) extern s16 SeekToNextMonInBox(struct BoxPokemon * boxMons, u8 curIndex, u8 maxIndex, u8 flags); extern u8* DetermineOrreMetLocation(struct Pokemon *); extern u8 *WriteOrreMapName(u8 *dst0, u8 *string, u16 fill); extern const u16 gNaturePowerMoves[]; static void BufferSelectedMonData(struct Pokemon * mon); static void CB2_SetUpPSS(void); static void PokeSum_TryPlayMonCry(void); static void PokeSum_RemoveWindows(u8 curPageIndex); static void Task_PokeSum_FlipPages(u8 taskId); static void Task_FlipPages_FromInfo(u8 taskId); static void Task_PokeSum_SwitchDisplayedPokemon(u8 taskId); static void PokeSum_SeekToNextMon(u8 taskId, s8 direction); static void Task_DestroyResourcesOnExit(u8 taskId); static void PokeSum_HideSpritesBeforePageFlip(void); static void PokeSum_ShowSpritesBeforePageFlip(void); static void PokeSum_UpdateWin1ActiveFlag(u8 curPageIndex); static void PokeSum_AddWindows(u8 curPageIndex); static void PokeSum_PrintPageHeaderText(u8 curPageIndex); static void PokeSum_InitBgCoordsBeforePageFlips(void); static u8 PokeSum_IsPageFlipFinished(u8); static void PokeSum_SetHelpContext(void); static void Task_HandleInput_SelectMove(u8 id); static void PokeSum_CopyNewBgTilemapBeforePageFlip_2(void); static void PokeSum_CopyNewBgTilemapBeforePageFlip(void); static void PokeSum_DrawPageProgressTiles(void); static void PokeSum_PrintRightPaneText(void); static void PokeSum_PrintBottomPaneText(void); static void PokeSum_PrintAbilityDataOrMoveTypes(void); static void PokeSum_PrintMonTypeIcons(void); static void PokeSum_PrintPageName(const u8 * str); static void PokeSum_PrintControlsString(const u8 * str); static void PrintMonLevelNickOnWindow2(const u8 * str); static void PokeSum_UpdateBgPriorityForPageFlip(u8 setBg0Priority, u8 keepBg1Bg2PriorityOrder); static void ShowOrHideHpBarObjs(u8 invisible); static void ShowOrHideExpBarObjs(u8 invisible); static void PokeSum_ShowOrHideMonPicSprite(u8 invisible); static void PokeSum_ShowOrHideMonMarkingsSprite(u8 invisible); static void ShowOrHideBallIconObj(u8 invisible); static void ShowOrHideStatusIcon(u8 invisible); static void HideShowPokerusIcon(u8 invisible); static void HideShowShinyStar(u8 invisible); static void ShoworHideMoveSelectionCursor(u8 invisible); static void PokeSum_ShowOrHideMonIconSprite(u8 invisible); static void PokeSum_Setup_ResetCallbacks(void); static void PokeSum_Setup_InitGpu(void); static void PokeSum_Setup_SpritesReset(void); static u8 PokeSum_HandleLoadBgGfx(void); static u8 PokeSum_HandleCreateSprites(void); static void PokeSum_CreateWindows(void); static u8 PokeSum_Setup_BufferStrings(void); static void CommitStaticWindowTilemaps(void); static void PokeSum_Setup_SetVBlankCallback(void); static void PokeSum_FinishSetup(void); static void BufferMonInfo(void); static void BufferMonSkills(void); static void BufferMonMoves(void); static u8 StatusToAilment(u32 status); static void BufferMonMoveI(u32); static u16 GetMonMoveBySlotId(struct Pokemon * mon, u8 moveSlot); static u16 GetMonPpByMoveSlot(struct Pokemon * mon, u8 moveSlot); static void CreateShinyStarObj(u16, u16); static void CreatePokerusIconObj(u16, u16); static void PokeSum_CreateMonMarkingsSprite(void); static void CreateMoveSelectionCursorObjs(u16, u16); static void CreateMonStatusIconObj(u16, u16); static void CreateHpBarObjs(u16, u16); static void CreateExpBarObjs(u16, u16); static void CreateBallIconObj(void); static void PokeSum_CreateMonIconSprite(void); static void PokeSum_CreateMonPicSprite(void); static void Task_InputHandler_SelectOrForgetMove(u8 taskId); static void CB2_RunPokemonSummaryScreen(void); static void PrintInfoPage(void); static void PrintSkillsPage(void); static void PrintMovesPage(void); static void PokeSum_PrintMoveName(u8 i); static void PokeSum_PrintTrainerMemo(void); static void PokeSum_PrintExpPoints_NextLv(void); static void PokeSum_PrintSelectedMoveStats(void); static void PokeSum_PrintTrainerMemo_Mon(void); static void PokeSum_PrintTrainerMemo_Egg(void); static bool32 MapSecIsInKantoOrSevii(u8 mapSec); static bool32 IsMultiBattlePartner(void); static bool32 PokeSum_IsMonBoldOrGentle(u8 nature); static void PokeSum_PrintTrainerMemo_Mon_NotHeldByOT(void); static bool32 CurrentMonIsFromGBA(void); static u8 PokeSum_BufferOtName_IsEqualToCurrentOwner(struct Pokemon * mon); static void PokeSum_PrintAbilityNameAndDesc(void); static void PokeSum_DrawMoveTypeIcons(void); static void PokeSum_DestroySprites(void); static void PokeSum_FlipPages_HandleBgHofs(void); static void SwapMonMoveSlots(void); static void SwapBoxMonMoveSlots(void); static void UpdateCurrentMonBufferFromPartyOrBox(struct Pokemon * mon); static void PokeSum_SetMonPicSpriteCallback(u16 spriteId); static void SpriteCB_MoveSelectionCursor(struct Sprite *sprite); static void UpdateMonStatusIconObj(void); static void UpdateHpBarObjs(void); static void UpdateExpBarObjs(void); static void ShowPokerusIconObjIfHasOrHadPokerus(void); static void ShowShinyStarObjIfMonShiny(void); static void PokeSum_DestroyMonMarkingsSprite(void); static void PokeSum_UpdateMonMarkingsAnim(void); static s8 SeekToNextMonInSingleParty(s8 direction); static s8 SeekToNextMonInMultiParty(s8 direction); static bool8 IsMonFromOrre(void); struct PokemonSummaryScreenData { u16 bg1TilemapBuffer[0x800]; u16 bg2TilemapBuffer[0x800]; u16 bg3TilemapBuffer[0x800]; u8 ALIGNED(4) windowIds[7]; u8 ALIGNED(4) unk3008; u8 ALIGNED(4) ballIconSpriteId; u8 ALIGNED(4) monPicSpriteId; u8 ALIGNED(4) monIconSpriteId; u8 ALIGNED(4) inputHandlerTaskId; u8 ALIGNED(4) inhibitPageFlipInput; u8 ALIGNED(4) numMonPicBounces; bool32 isEnemyParty; /* 0x3024 */ struct PokeSummary { u8 ALIGNED(4) speciesNameStrBuf[POKEMON_NAME_LENGTH]; u8 ALIGNED(4) nicknameStrBuf[POKEMON_NAME_LENGTH + 1]; u8 ALIGNED(4) otNameStrBuf[12]; u8 ALIGNED(4) otNameStrBufs[2][12]; u8 ALIGNED(4) dexNumStrBuf[5]; u8 ALIGNED(4) unk306C[7]; u8 ALIGNED(4) itemNameStrBuf[ITEM_NAME_LENGTH + 1]; u8 ALIGNED(4) genderSymbolStrBuf[3]; u8 ALIGNED(4) levelStrBuf[7]; u8 ALIGNED(4) curHpStrBuf[9]; u8 ALIGNED(4) statValueStrBufs[5][5]; u8 ALIGNED(4) moveCurPpStrBufs[5][11]; u8 ALIGNED(4) moveMaxPpStrBufs[5][11]; u8 ALIGNED(4) moveNameStrBufs[5][MOVE_NAME_LENGTH + 1]; u8 ALIGNED(4) movePowerStrBufs[5][5]; u8 ALIGNED(4) moveAccuracyStrBufs[5][5]; u8 ALIGNED(4) expPointsStrBuf[9]; u8 ALIGNED(4) expToNextLevelStrBuf[9]; u8 ALIGNED(4) abilityNameStrBuf[13]; u8 ALIGNED(4) abilityDescStrBuf[52]; } summary; u8 ALIGNED(4) isEgg; /* 0x3200 */ u8 ALIGNED(4) isBadEgg; /* 0x3204 */ u8 ALIGNED(4) mode; /* 0x3208 */ u8 ALIGNED(4) unk320C; /* 0x320C */ u8 ALIGNED(4) lastIndex; /* 0x3210 */ u8 ALIGNED(4) curPageIndex; /* 0x3214 */ u8 ALIGNED(4) unk3218; /* 0x3218 */ u8 ALIGNED(4) isBoxMon; /* 0x321C */ u8 ALIGNED(4) monTypes[2]; /* 0x3220 */ u8 ALIGNED(4) pageFlipDirection; /* 0x3224 */ u8 ALIGNED(4) unk3228; /* 0x3228 */ u8 ALIGNED(4) unk322C; /* 0x322C */ u8 ALIGNED(4) unk3230; /* 0x3230 */ u8 ALIGNED(4) lockMovesFlag; /* 0x3234 */ u8 ALIGNED(4) whichBgLayerToTranslate; /* 0x3238 */ u8 ALIGNED(4) skillsPageBgNum; /* 0x323C */ u8 ALIGNED(4) infoAndMovesPageBgNum; /* 0x3240 */ u8 ALIGNED(4) flippingPages; /* 0x3244 */ u8 ALIGNED(4) unk3248; /* 0x3248 */ s16 ALIGNED(4) flipPagesBgHofs; /* 0x324C */ u16 moveTypes[5]; /* 0x3250 */ u16 moveIds[5]; /* 0x325A */ u8 ALIGNED(4) numMoves; /* 0x3264 */ u8 ALIGNED(4) isSwappingMoves; /* 0x3268 */ u8 ALIGNED(4) curMonStatusAilment; /* 0x326C */ u8 ALIGNED(4) state3270; /* 0x3270 */ u8 ALIGNED(4) summarySetupStep; /* 0x3274 */ u8 ALIGNED(4) loadBgGfxStep; /* 0x3278 */ u8 ALIGNED(4) spriteCreationStep; /* 0x327C */ u8 ALIGNED(4) bufferStringsStep; /* 0x3280 */ u8 ALIGNED(4) state3284; /* 0x3284 */ u8 ALIGNED(4) selectMoveInputHandlerState; /* 0x3288 */ u8 ALIGNED(4) switchMonTaskState; /* 0x328C */ struct Pokemon currentMon; /* 0x3290 */ union { struct Pokemon * mons; struct BoxPokemon * boxMons; } monList; MainCallback savedCallback; struct Sprite *markingSprite; u8 ALIGNED(4) lastPageFlipDirection; /* 0x3300 */ u8 ALIGNED(4) unk3304; /* 0x3304 */ }; struct Struct203B144 { u16 unk00; u16 curHpStr; u16 atkStr; u16 defStr; u16 spAStr; u16 spDStr; u16 speStr; u16 expStr; u16 toNextLevel; u16 curPp[5]; u16 maxPp[5]; u16 unk26; }; struct ExpBarObjs { struct Sprite *sprites[11]; /* 0x00 */ u16 xpos[11]; /* 0x2c */ u16 tileTag; /* 0x42 */ u16 palTag; /* 0x44 */ }; struct HpBarObjs { struct Sprite *sprites[10]; /* 0x00 */ u16 xpos[10]; /* 0x28 */ u16 tileTag; /* 0x3c */ u16 palTag; /* 0x3e */ }; struct MonPicBounceState { u8 ALIGNED(4) animFrame; /* 0x00 */ u8 ALIGNED(4) initDelay; /* 0x04 */ u8 ALIGNED(4) vigor; /* 0x08 */ }; struct MoveSelectionCursor { struct Sprite *sprite; /* 0x00 */ u16 whichSprite; /* 0x04 */ u16 tileTag; /* 0x06 */ u16 palTag; /* 0x08 */ }; struct MonStatusIconObj { struct Sprite *sprite; /* 0x00 */ u16 tileTag; /* 0x04 */ u16 palTag; /* 0x06 */ }; struct PokerusIconObj { struct Sprite *sprite; /* 0x00 */ u16 tileTag; /* 0x04 */ u16 palTag; /* 0x06 */ }; struct ShinyStarObjData { struct Sprite *sprite; /* 0x00 */ u16 tileTag; /* 0x04 */ u16 palTag; /* 0x06 */ }; static EWRAM_DATA struct PokemonSummaryScreenData * sMonSummaryScreen = NULL; static EWRAM_DATA struct Struct203B144 * sMonSkillsPrinterXpos = NULL; static EWRAM_DATA struct MoveSelectionCursor * sMoveSelectionCursorObjs[4] = {}; static EWRAM_DATA struct MonStatusIconObj * sStatusIcon = NULL; static EWRAM_DATA struct HpBarObjs * sHpBarObjs = NULL; static EWRAM_DATA struct ExpBarObjs * sExpBarObjs = NULL; static EWRAM_DATA struct PokerusIconObj * sPokerusIconObj = NULL; static EWRAM_DATA struct ShinyStarObjData * sShinyStarObjData = NULL; static EWRAM_DATA u8 sLastViewedMonIndex = 0; static EWRAM_DATA u8 sMoveSelectionCursorPos = 0; static EWRAM_DATA u8 sMoveSwapCursorPos = 0; static EWRAM_DATA struct MonPicBounceState * sMonPicBounceState = NULL; extern const u32 gSummaryScreen_PageSkills_Tilemap[]; extern const u32 gSummaryScreen_PageMoves_Tilemap[]; extern const u32 gSummaryScreen_PageInfo_Tilemap[]; extern const u32 gSummaryScreen_PageMovesInfo_Tilemap[]; extern const u32 gSummaryScreen_PageEgg_Tilemap[]; extern const u16 gSummaryScreen_Bg_Pal[]; extern const u32 gSummaryScreen_Bg_Gfx[]; extern const u16 gSummaryScreen_HpExpBar_Pal[]; extern const u32 gSummaryScreen_StatusAilmentIcon_Gfx[]; extern const u16 gSummaryScreen_StatusAilmentIcon_Pal[]; extern const u32 gSummaryScreen_HpBar_Gfx[]; extern const u32 gSummaryScreen_ExpBar_Gfx[]; static const u32 sTextHeaderPalette[] = INCBIN_U32("graphics/summary_screen/text_header.gbapal"); static const u16 sMonMarkingSpritePalette[] = INCBIN_U16("graphics/summary_screen/marking.gbapal"); static const u32 sTextMovesPalette[] = INCBIN_U32("graphics/summary_screen/text_moves.gbapal"); static const u16 sMoveSelectionCursorPals[] = INCBIN_U16("graphics/summary_screen/move_selection_cursor.gbapal"); static const u32 sMoveSelectionCursorTiles_Left[] = INCBIN_U32("graphics/summary_screen/move_selection_cursor_left.4bpp.lz"); static const u32 sMoveSelectionCursorTiles_Right[] = INCBIN_U32("graphics/summary_screen/move_selection_cursor_right.4bpp.lz"); static const struct OamData sMoveSelectionCursorOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(64x32), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(64x32), .tileNum = 0, .priority = 0, .paletteNum = 0 }; static const union AnimCmd sMoveSelectionCursorOamAnim_Red[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sMoveSelectionCursorOamAnim_Blue[] = { ANIMCMD_FRAME(0x20, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd * const sMoveSelectionCursorOamAnimTable[] = { sMoveSelectionCursorOamAnim_Red, sMoveSelectionCursorOamAnim_Blue }; static const struct OamData sStatusAilmentIconOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(32x8), .tileNum = 0, .priority = 0, .paletteNum = 0 }; static const union AnimCmd sStatusAilmentIconAnim_PSN[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sStatusAilmentIconAnim_PRZ[] = { ANIMCMD_FRAME(4, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sStatusAilmentIconAnim_SLP[] = { ANIMCMD_FRAME(8, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sStatusAilmentIconAnim_FRZ[] = { ANIMCMD_FRAME(12, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sStatusAilmentIconAnim_BRN[] = { ANIMCMD_FRAME(16, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sStatusAilmentIconAnim_PKRS[] = { ANIMCMD_FRAME(20, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sStatusAilmentIconAnim_FNT[] = { ANIMCMD_FRAME(24, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sStatusAilmentIconAnim_Blank[] = { ANIMCMD_FRAME(28, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd * const sStatusAilmentIconAnimTable[] = { sStatusAilmentIconAnim_PSN, sStatusAilmentIconAnim_PRZ, sStatusAilmentIconAnim_SLP, sStatusAilmentIconAnim_FRZ, sStatusAilmentIconAnim_BRN, sStatusAilmentIconAnim_PKRS, sStatusAilmentIconAnim_FNT, sStatusAilmentIconAnim_Blank }; static const struct OamData sHpOrExpBarOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 0, .paletteNum = 0 }; static const union AnimCmd sHpOrExpAnim_0[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_1[] = { ANIMCMD_FRAME(1, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_2[] = { ANIMCMD_FRAME(2, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_3[] = { ANIMCMD_FRAME(3, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_4[] = { ANIMCMD_FRAME(4, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_5[] = { ANIMCMD_FRAME(5, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_6[] = { ANIMCMD_FRAME(6, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_7[] = { ANIMCMD_FRAME(7, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_8[] = { ANIMCMD_FRAME(8, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_9[] = { ANIMCMD_FRAME(9, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_10[] = { ANIMCMD_FRAME(10, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd sHpOrExpAnim_11[] = { ANIMCMD_FRAME(11, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd * const sHpOrExpBarAnimTable[] = { sHpOrExpAnim_0, sHpOrExpAnim_1, sHpOrExpAnim_2, sHpOrExpAnim_3, sHpOrExpAnim_4, sHpOrExpAnim_5, sHpOrExpAnim_6, sHpOrExpAnim_7, sHpOrExpAnim_8, sHpOrExpAnim_9, sHpOrExpAnim_10, sHpOrExpAnim_11 }; static const u16 sPokeSummary_HpBarPalYellow[] = INCBIN_U16("graphics/summary_screen/hp_bar_yellow.gbapal"); static const u16 sPokeSummary_HpBarPalRed[] = INCBIN_U16("graphics/summary_screen/hp_bar_red.gbapal"); static const struct OamData sPokerusIconObjOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 0, .paletteNum = 0 }; static const union AnimCmd sPokerusIconObjAnim0[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd * const sPokerusIconObjAnimTable[] = { sPokerusIconObjAnim0 }; static const u16 sPokerusIconObjPal[] = INCBIN_U16("graphics/summary_screen/pokerus_cured.gbapal"); static const u32 sPokerusIconObjTiles[] = INCBIN_U32("graphics/summary_screen/pokerus_cured.4bpp.lz"); static const struct OamData sStarObjOamData = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(8x8), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(8x8), .tileNum = 0, .priority = 0, .paletteNum = 0 }; static const union AnimCmd sStarObjAnim0[] = { ANIMCMD_FRAME(1, 20), ANIMCMD_JUMP(0), }; static const union AnimCmd * const sStarObjAnimTable[] = { sStarObjAnim0 }; static const u16 sStarObjPal[] = INCBIN_U16( "graphics/summary_screen/shiny_star.gbapal"); static const u32 sStarObjTiles[] = INCBIN_U32( "graphics/summary_screen/shiny_star.4bpp.lz"); static const u32 sBgTilemap_MovesInfoPage[] = INCBIN_U32( "graphics/summary_screen/moves_info_page.bin.lz"); static const u32 sBgTilemap_MovesPage[] = INCBIN_U32( "graphics/summary_screen/moves_page.bin.lz"); #include "data/text/nature_names.h" static const u8 *const sEggHatchTimeTexts[] = { gText_PokeSum_EggHatch_LongTime, gText_PokeSum_EggHatch_SomeTime, gText_PokeSum_EggHatch_Soon, gText_PokeSum_EggHatch_AlmostReady }; static const u8 *const sEggOriginTexts[] = { gText_PokeSum_EggOrigin_DayCare, gText_PokeSum_EggOrigin_Trade, gText_PokeSum_EggOrigin_TravelingMan, gText_PokeSum_EggOrigin_Trade, gText_PokeSum_EggOrigin_NicePlace, gText_PokeSum_EggOrigin_Spa, gText_PokeSum_EggOrigin_Trade }; static const u8 sPrintMoveTextColors[][3] = { {0, 7, 8}, {0, 1, 2}, {0, 3, 4}, {0, 5, 6} }; static const struct BgTemplate sBgTempaltes[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 14, .screenSize = 1, .paletteMode = 0, .priority = 0, .baseTile = 0x0000 }, { .bg = 2, .charBaseIndex = 2, .mapBaseIndex = 10, .screenSize = 1, .paletteMode = 0, .priority = 1, .baseTile = 0x0000 }, { .bg = 3, .charBaseIndex = 2, .mapBaseIndex = 9, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x0000 }, { .bg = 1, .charBaseIndex = 2, .mapBaseIndex = 12, .screenSize = 1, .paletteMode = 0, .priority = 2, .baseTile = 0x0000 } }; #define POKESUM_WIN_PAGE_NAME 0 #define POKESUM_WIN_CONTROLS 1 #define POKESUM_WIN_LVL_NICK 2 #define POKESUM_WIN_RIGHT_PANE 3 #define POKESUM_WIN_TRAINER_MEMO 4 #define POKESUM_WIN_INFO_3 3 #define POKESUM_WIN_INFO_4 4 #define POKESUM_WIN_INFO_5 5 #define POKESUM_WIN_INFO_6 6 #define POKESUM_WIN_SKILLS_3 3 #define POKESUM_WIN_SKILLS_4 4 #define POKESUM_WIN_SKILLS_5 5 #define POKESUM_WIN_SKILLS_6 6 #define POKESUM_WIN_MOVES_3 3 #define POKESUM_WIN_MOVES_4 4 #define POKESUM_WIN_MOVES_5 5 #define POKESUM_WIN_MOVES_6 6 static const struct WindowTemplate sWindowTemplates_Permanent_Bg1[] = { [POKESUM_WIN_PAGE_NAME] = { .bg = 1, .tilemapLeft = 0, .tilemapTop = 0, .width = 13, .height = 2, .paletteNum = 7, .baseBlock = 0x0258 }, [POKESUM_WIN_CONTROLS] = { .bg = 1, .tilemapLeft = 19, .tilemapTop = 0, .width = 11, .height = 2, .paletteNum = 7, .baseBlock = 0x0272 }, [POKESUM_WIN_LVL_NICK] = { .bg = 1, .tilemapLeft = 0, .tilemapTop = 2, .width = 15, .height = 2, .paletteNum = 7, .baseBlock = 0x0288 } }; static const struct WindowTemplate sWindowTemplates_Permanent_Bg2[] = { { .bg = 2, .tilemapLeft = 0, .tilemapTop = 0, .width = 13, .height = 2, .paletteNum = 7, .baseBlock = 0x0258 }, { .bg = 2, .tilemapLeft = 19, .tilemapTop = 0, .width = 11, .height = 2, .paletteNum = 7, .baseBlock = 0x0272 }, { .bg = 2, .tilemapLeft = 0, .tilemapTop = 2, .width = 15, .height = 2, .paletteNum = 7, .baseBlock = 0x0288 }, }; static const struct WindowTemplate sWindowTemplates_Info[] = { [POKESUM_WIN_INFO_3 - 3] = { .bg = 0, .tilemapLeft = 15, .tilemapTop = 2, .width = 15, .height = 12, .paletteNum = 6, .baseBlock = 0x0001 }, [POKESUM_WIN_INFO_4 - 3] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 14, .width = 28, .height = 6, .paletteNum = 6, .baseBlock = 0x00b5 }, [POKESUM_WIN_INFO_5 - 3] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 0, .height = 0, .paletteNum = 0, .baseBlock = 0x0000 }, [POKESUM_WIN_INFO_6 - 3] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 0, .height = 0, .paletteNum = 0, .baseBlock = 0x0000 }, }; static const struct WindowTemplate sWindowTemplates_Skills[] = { [POKESUM_WIN_SKILLS_3 - 3] = { .bg = 0, .tilemapLeft = 20, .tilemapTop = 2, .width = 10, .height = 14, .paletteNum = 6, .baseBlock = 0x0001 }, [POKESUM_WIN_SKILLS_4 - 3] = { .bg = 0, .tilemapLeft = 6, .tilemapTop = 12, .width = 14, .height = 4, .paletteNum = 6, .baseBlock = 0x008d }, [POKESUM_WIN_SKILLS_5 - 3] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 16, .width = 29, .height = 4, .paletteNum = 6, .baseBlock = 0x00c5 }, [POKESUM_WIN_SKILLS_6 - 3] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 0, .height = 0, .paletteNum = 0, .baseBlock = 0x0000 }, }; static const struct WindowTemplate sWindowTemplates_Moves[] = { [POKESUM_WIN_MOVES_3 - 3] = { .bg = 0, .tilemapLeft = 20, .tilemapTop = 2, .width = 10, .height = 18, .paletteNum = 8, .baseBlock = 0x0001 }, [POKESUM_WIN_MOVES_4 - 3] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 7, .width = 15, .height = 13, .paletteNum = 6, .baseBlock = 0x00b5 }, [POKESUM_WIN_MOVES_5 - 3] = { .bg = 0, .tilemapLeft = 15, .tilemapTop = 2, .width = 5, .height = 18, .paletteNum = 6, .baseBlock = 0x0178 }, [POKESUM_WIN_MOVES_6 - 3] = { .bg = 0, .tilemapLeft = 6, .tilemapTop = 4, .width = 9, .height = 2, .paletteNum = 6, .baseBlock = 0x01d2 }, }; static const struct WindowTemplate sWindowTemplates_Dummy[] = { { .bg = 255, .tilemapLeft = 0, .tilemapTop = 0, .width = 0, .height = 0, .paletteNum = 0, .baseBlock = 0x0000 }, }; static const u8 sLevelNickTextColors[][3] = { {0, 14, 10}, {0, 1, 2}, {0, 9, 8}, {0, 5, 4}, {0, 2, 3}, {0, 11, 10}, }; static const u8 ALIGNED(4) sMultiBattlePartyOrder[] = { 0, 2, 3, 1, 4, 5 }; static const s8 sMonPicBounceYDelta_Under60[] = { -1, 0, 1 }; static const s8 sMonPicBounceYDelta_60to80[] = { -2, -1, 0, 1, 2 }; static const s8 sMonPicBounceYDelta_80to99[] = { -3, -2, -1, 0, 1, 2, 3 }; static const s8 sMonPicBounceYDelta_Full[] = { -5, -3, -1, 0, 1, 3, 5 }; static const s8 sEggPicShakeXDelta_ItWillTakeSomeTime[] = { 1, 1, 0, -1, -1, 0, -1, -1, 0, 1, 1 }; static const s8 sEggPicShakeXDelta_OccasionallyMoves[] = { 2, 1, 0, -1, -2, 0, -2, -1, 0, 1, 2 }; static const s8 sEggPicShakeXDelta_AlmostReadyToHatch[] = { 2, 1, 1, 0, -1, -1, -2, 0, -2, -1, -1, 0, 1, 1, 2 }; static const u16 * const sHpBarPals[] = { gSummaryScreen_HpExpBar_Pal, sPokeSummary_HpBarPalYellow, sPokeSummary_HpBarPalRed, }; #define FREE_AND_SET_NULL_IF_SET(ptr) \ { \ if (ptr != NULL) \ { \ free(ptr); \ (ptr) = NULL; \ } \ } void ShowPokemonSummaryScreen(struct Pokemon * party, u8 cursorPos, u8 lastIdx, MainCallback savedCallback, u8 mode) { sMonSummaryScreen = AllocZeroed(sizeof(struct PokemonSummaryScreenData)); sMonSkillsPrinterXpos = AllocZeroed(sizeof(struct Struct203B144)); if (sMonSummaryScreen == NULL) { SetMainCallback2(savedCallback); return; } sLastViewedMonIndex = cursorPos; sMoveSelectionCursorPos = 0; sMoveSwapCursorPos = 0; sMonSummaryScreen->savedCallback = savedCallback; sMonSummaryScreen->monList.mons = party; if (party == gEnemyParty) sMonSummaryScreen->isEnemyParty = TRUE; else sMonSummaryScreen->isEnemyParty = FALSE; sMonSummaryScreen->lastIndex = lastIdx; sMonSummaryScreen->mode = mode; switch (sMonSummaryScreen->mode) { case PSS_MODE_NORMAL: default: SetHelpContext(HELPCONTEXT_POKEMON_INFO); sMonSummaryScreen->curPageIndex = PSS_PAGE_INFO; sMonSummaryScreen->isBoxMon = FALSE; sMonSummaryScreen->lockMovesFlag = FALSE; break; case PSS_MODE_BOX: SetHelpContext(HELPCONTEXT_POKEMON_INFO); sMonSummaryScreen->curPageIndex = PSS_PAGE_INFO; sMonSummaryScreen->isBoxMon = TRUE; sMonSummaryScreen->lockMovesFlag = FALSE; break; case PSS_MODE_SELECT_MOVE: case PSS_MODE_FORGET_MOVE: SetHelpContext(HELPCONTEXT_POKEMON_MOVES); sMonSummaryScreen->curPageIndex = PSS_PAGE_MOVES_INFO; sMonSummaryScreen->isBoxMon = FALSE; sMonSummaryScreen->lockMovesFlag = TRUE; break; } sMonSummaryScreen->state3270 = 0; sMonSummaryScreen->summarySetupStep = 0; sMonSummaryScreen->loadBgGfxStep = 0; sMonSummaryScreen->spriteCreationStep = 0; sMonSummaryScreen->whichBgLayerToTranslate = 0; sMonSummaryScreen->skillsPageBgNum = 2; sMonSummaryScreen->infoAndMovesPageBgNum = 1; sMonSummaryScreen->flippingPages = FALSE; sMonSummaryScreen->unk3228 = 0; sMonSummaryScreen->unk322C = 1; BufferSelectedMonData(&sMonSummaryScreen->currentMon); sMonSummaryScreen->isEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG); sMonSummaryScreen->isBadEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SANITY_IS_BAD_EGG); if (sMonSummaryScreen->isBadEgg == TRUE) sMonSummaryScreen->isEgg = TRUE; sMonSummaryScreen->lastPageFlipDirection = 0xff; SetMainCallback2(CB2_SetUpPSS); } void ShowSelectMovePokemonSummaryScreen(struct Pokemon * party, u8 cursorPos, u8 lastIdx, MainCallback savedCallback, u16 a4) { ShowPokemonSummaryScreen(party, cursorPos, lastIdx, savedCallback, PSS_MODE_SELECT_MOVE); sMonSummaryScreen->moveIds[4] = a4; } static u8 PageFlipInputIsDisabled(u8 direction) { if (sMonSummaryScreen->inhibitPageFlipInput == TRUE && sMonSummaryScreen->pageFlipDirection != direction) return TRUE; return FALSE; } bool32 IsPageFlipInput(u8 direction) { if (sMonSummaryScreen->isEgg) return FALSE; if (sMonSummaryScreen->lastPageFlipDirection != 0xff && sMonSummaryScreen->lastPageFlipDirection == direction) { sMonSummaryScreen->lastPageFlipDirection = 0xff; return TRUE; } if (PageFlipInputIsDisabled(direction)) return FALSE; switch (direction) { case 1: if (JOY_NEW(DPAD_RIGHT)) return TRUE; if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR && JOY_NEW(R_BUTTON)) return TRUE; break; case 0: if (JOY_NEW(DPAD_LEFT)) return TRUE; if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR && JOY_NEW(L_BUTTON)) return TRUE; break; } return FALSE; } static void Task_InputHandler_Info(u8 taskId) { switch (sMonSummaryScreen->state3270) { case PSS_STATE3270_FADEIN: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0); sMonSummaryScreen->state3270 = PSS_STATE3270_PLAYCRY; break; case PSS_STATE3270_PLAYCRY: if (!gPaletteFade.active) { PokeSum_TryPlayMonCry(); sMonSummaryScreen->state3270 = PSS_STATE3270_HANDLEINPUT; return; } sMonSummaryScreen->state3270 = PSS_STATE3270_PLAYCRY; break; case PSS_STATE3270_HANDLEINPUT: if (IsActiveOverworldLinkBusy() == TRUE) return; else if (IsLinkRecvQueueAtOverworldMax() == TRUE) return; else if (FuncIsActiveTask(Task_PokeSum_SwitchDisplayedPokemon)) return; if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) { if (IsPageFlipInput(1) == TRUE) { if (FuncIsActiveTask(Task_PokeSum_FlipPages)) { sMonSummaryScreen->lastPageFlipDirection = 1; return; } else if (sMonSummaryScreen->curPageIndex < PSS_PAGE_MOVES) { PlaySE(SE_SELECT); HideBg(0); sMonSummaryScreen->pageFlipDirection = 1; PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex); sMonSummaryScreen->curPageIndex++; sMonSummaryScreen->state3270 = PSS_STATE3270_FLIPPAGES; } return; } else if (IsPageFlipInput(0) == TRUE) { if (FuncIsActiveTask(Task_PokeSum_FlipPages)) { sMonSummaryScreen->lastPageFlipDirection = 0; return; } else if (sMonSummaryScreen->curPageIndex > PSS_PAGE_INFO) { PlaySE(SE_SELECT); HideBg(0); sMonSummaryScreen->pageFlipDirection = 0; PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex); sMonSummaryScreen->curPageIndex--; sMonSummaryScreen->state3270 = PSS_STATE3270_FLIPPAGES; } return; } } if ((!FuncIsActiveTask(Task_PokeSum_FlipPages)) || FuncIsActiveTask(Task_PokeSum_SwitchDisplayedPokemon)) { if (JOY_NEW(DPAD_UP)) { PokeSum_SeekToNextMon(taskId, -1); return; } else if (JOY_NEW(DPAD_DOWN)) { PokeSum_SeekToNextMon(taskId, 1); return; } else if (JOY_NEW(A_BUTTON)) { if (sMonSummaryScreen->curPageIndex == PSS_PAGE_INFO) { PlaySE(SE_SELECT); sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_FADEOUT; } else if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES) { PlaySE(SE_SELECT); sMonSummaryScreen->pageFlipDirection = 1; PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex); sMonSummaryScreen->curPageIndex++; sMonSummaryScreen->state3270 = PSS_STATE3270_FLIPPAGES; } return; } else if (JOY_NEW(B_BUTTON)) { sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_FADEOUT; } } break; case PSS_STATE3270_FLIPPAGES: if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) { CreateTask(Task_PokeSum_FlipPages, 0); sMonSummaryScreen->state3270 = PSS_STATE3270_HANDLEINPUT; } else { gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_FlipPages_FromInfo; sMonSummaryScreen->state3270 = PSS_STATE3270_HANDLEINPUT; } break; case PSS_STATE3270_ATEXIT_FADEOUT: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_WAITLINKDELAY; break; case PSS_STATE3270_ATEXIT_WAITLINKDELAY: if (Overworld_LinkRecvQueueLengthMoreThan2() == TRUE) return; else if (IsLinkRecvQueueAtOverworldMax() == TRUE) return; sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_WAITFADE; break; default: if (!gPaletteFade.active) Task_DestroyResourcesOnExit(taskId); break; } } static void Task_PokeSum_FlipPages(u8 taskId) { s16 * data = gTasks[taskId].data; switch (data[0]) { case 0: PokeSum_HideSpritesBeforePageFlip(); PokeSum_ShowSpritesBeforePageFlip(); sMonSummaryScreen->lockMovesFlag = TRUE; sMonSummaryScreen->inhibitPageFlipInput = TRUE; PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex); PokeSum_AddWindows(sMonSummaryScreen->curPageIndex); break; case 1: if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) { if (!(sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 0)) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); } } FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 2); FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 15, 2); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 2); FillBgTilemapBufferRect_Palette0(2, 0, 0, 2, 15, 2); break; case 2: PokeSum_CopyNewBgTilemapBeforePageFlip_2(); PokeSum_CopyNewBgTilemapBeforePageFlip(); PokeSum_DrawPageProgressTiles(); PokeSum_PrintPageHeaderText(sMonSummaryScreen->curPageIndex); break; case 3: CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2); break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) { CopyBgTilemapBufferToVram(3); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); } else return; break; case 5: PokeSum_InitBgCoordsBeforePageFlips(); sMonSummaryScreen->flippingPages = TRUE; break; case 6: if (!PokeSum_IsPageFlipFinished(sMonSummaryScreen->pageFlipDirection)) return; break; case 7: PokeSum_PrintRightPaneText(); if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) PokeSum_PrintBottomPaneText(); PokeSum_PrintAbilityDataOrMoveTypes(); PokeSum_PrintMonTypeIcons(); break; case 8: CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2); break; case 9: if (!IsDma3ManagerBusyWithBgCopy()) { CopyBgTilemapBufferToVram(0); ShowBg(0); } else return; break; default: PokeSum_SetHelpContext(); if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO) gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_HandleInput_SelectMove; DestroyTask(taskId); data[0] = 0; sMonSummaryScreen->lockMovesFlag = FALSE; sMonSummaryScreen->inhibitPageFlipInput = FALSE; return; } data[0]++; } static void Task_FlipPages_FromInfo(u8 taskId) { switch (sMonSummaryScreen->state3284) { case 0: sMonSummaryScreen->lockMovesFlag = TRUE; sMonSummaryScreen->inhibitPageFlipInput = TRUE; PokeSum_AddWindows(sMonSummaryScreen->curPageIndex); break; case 1: if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) { if (!(sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 0)) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); } } FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 2); FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 15, 2); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 2); FillBgTilemapBufferRect_Palette0(2, 0, 0, 2, 15, 2); break; case 2: PokeSum_HideSpritesBeforePageFlip(); PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex); PokeSum_CopyNewBgTilemapBeforePageFlip(); PokeSum_DrawPageProgressTiles(); PokeSum_CopyNewBgTilemapBeforePageFlip_2(); break; case 3: PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves); if (!(gMain.inBattle || gReceivedRemoteLinkPlayers)) PokeSum_PrintControlsString(gText_PokeSum_Controls_PickSwitch); else PokeSum_PrintControlsString(gText_PokeSum_Controls_Pick); break; case 4: CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2); break; case 5: if (!IsDma3ManagerBusyWithBgCopy()) { CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(3); } else return; break; case 6: PokeSum_PrintRightPaneText(); PokeSum_PrintAbilityDataOrMoveTypes(); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2); break; case 7: if (!IsDma3ManagerBusyWithBgCopy()) { CopyBgTilemapBufferToVram(0); PokeSum_InitBgCoordsBeforePageFlips(); sMonSummaryScreen->flippingPages = TRUE; } else return; break; case 8: if (!PokeSum_IsPageFlipFinished(sMonSummaryScreen->pageFlipDirection)) return; PokeSum_PrintBottomPaneText(); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2); break; case 9: PokeSum_PrintMonTypeIcons(); PrintMonLevelNickOnWindow2(gText_PokeSum_NoData); break; case 10: PokeSum_ShowSpritesBeforePageFlip(); CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2); break; case 11: if (!IsDma3ManagerBusyWithBgCopy()) { CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); } else return; break; default: PokeSum_SetHelpContext(); gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_HandleInput_SelectMove; sMonSummaryScreen->state3284 = 0; sMonSummaryScreen->lockMovesFlag = FALSE; sMonSummaryScreen->inhibitPageFlipInput = FALSE; return; } sMonSummaryScreen->state3284++; return; } static void Task_BackOutOfSelectMove(u8 taskId) { switch (sMonSummaryScreen->state3284) { case 0: sMonSummaryScreen->lockMovesFlag = TRUE; sMonSummaryScreen->inhibitPageFlipInput = TRUE; PokeSum_AddWindows(sMonSummaryScreen->curPageIndex); break; case 1: if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) { if (!(sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 0)) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); } } FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 2); FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 15, 2); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 2); FillBgTilemapBufferRect_Palette0(2, 0, 0, 2, 15, 2); break; case 2: PokeSum_CopyNewBgTilemapBeforePageFlip_2(); break; case 3: PokeSum_PrintRightPaneText(); PokeSum_PrintBottomPaneText(); PokeSum_PrintAbilityDataOrMoveTypes(); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2); CopyBgTilemapBufferToVram(0); break; case 4: PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves); PokeSum_PrintControlsString(gText_PokeSum_Controls_PageDetail); break; case 5: CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); break; case 6: PokeSum_InitBgCoordsBeforePageFlips(); sMonSummaryScreen->flippingPages = TRUE; PokeSum_HideSpritesBeforePageFlip(); PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex); PokeSum_PrintMonTypeIcons(); break; case 7: break; case 8: if (PokeSum_IsPageFlipFinished(sMonSummaryScreen->pageFlipDirection) == 0) return; PrintMonLevelNickOnWindow2(gText_PokeSum_NoData); break; case 9: CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); break; case 10: PokeSum_CopyNewBgTilemapBeforePageFlip(); PokeSum_DrawPageProgressTiles(); CopyBgTilemapBufferToVram(3); PokeSum_ShowSpritesBeforePageFlip(); break; default: PokeSum_SetHelpContext(); gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_InputHandler_Info; sMonSummaryScreen->state3284 = 0; sMonSummaryScreen->lockMovesFlag = FALSE; sMonSummaryScreen->inhibitPageFlipInput = FALSE; return; } sMonSummaryScreen->state3284++; return; } static void PokeSum_SetHpExpBarCoordsFullRight(void) { u32 i; for (i = 0; i < 11; i++) { sExpBarObjs->xpos[i] = (8 * i) + 396; sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i]; if (i >= 9) continue; sHpBarObjs->xpos[i] = (8 * i) + 412; sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i]; } } static void PokeSum_SetHpExpBarCoordsFullLeft(void) { u32 i; for (i = 0; i < 11; i++) { sExpBarObjs->xpos[i] = (8 * i) + 156; sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i]; if (i >= 9) continue; sHpBarObjs->xpos[i] = (8 * i) + 172; sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i]; } } static void PokeSum_InitBgCoordsBeforePageFlips(void) { s8 pageDelta = 1; if (sMonSummaryScreen->pageFlipDirection == 1) pageDelta = -1; if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO) { sMonSummaryScreen->flipPagesBgHofs = 240; return; } if ((sMonSummaryScreen->curPageIndex + pageDelta) == PSS_PAGE_MOVES_INFO) { PokeSum_UpdateBgPriorityForPageFlip(0, 0); sMonSummaryScreen->flipPagesBgHofs = 0; SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); return; } if (sMonSummaryScreen->pageFlipDirection == 1) { sMonSummaryScreen->flipPagesBgHofs = 0; SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); PokeSum_UpdateBgPriorityForPageFlip(1, 1); } else { u32 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3; u32 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3; sMonSummaryScreen->flipPagesBgHofs = 240; if (bg1Priority > bg2Priority) SetGpuReg(REG_OFFSET_BG1HOFS, 240); else SetGpuReg(REG_OFFSET_BG2HOFS, 240); SetGpuReg(REG_OFFSET_BG0HOFS, 240); PokeSum_UpdateBgPriorityForPageFlip(1, 0); } if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS) { if (sMonSummaryScreen->pageFlipDirection == 1) PokeSum_SetHpExpBarCoordsFullLeft(); else PokeSum_SetHpExpBarCoordsFullRight(); } else if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES) PokeSum_SetHpExpBarCoordsFullLeft(); } static void PokeSum_HideSpritesBeforePageFlip(void) { u8 newPage; if (sMonSummaryScreen->pageFlipDirection == 1) newPage = sMonSummaryScreen->curPageIndex - 1; else newPage = sMonSummaryScreen->curPageIndex + 1; switch (newPage) { case PSS_PAGE_INFO: break; case PSS_PAGE_SKILLS: ShowOrHideHpBarObjs(TRUE); ShowOrHideExpBarObjs(TRUE); break; case PSS_PAGE_MOVES: if (sMonSummaryScreen->pageFlipDirection == 1) { PokeSum_ShowOrHideMonPicSprite(TRUE); PokeSum_ShowOrHideMonMarkingsSprite(TRUE); ShowOrHideBallIconObj(TRUE); ShowOrHideStatusIcon(TRUE); HideShowPokerusIcon(TRUE); HideShowShinyStar(TRUE); } break; case PSS_PAGE_MOVES_INFO: ShoworHideMoveSelectionCursor(TRUE); PokeSum_ShowOrHideMonIconSprite(TRUE); ShowOrHideStatusIcon(TRUE); HideShowPokerusIcon(TRUE); HideShowShinyStar(TRUE); break; } } static void PokeSum_ShowSpritesBeforePageFlip(void) { u8 newPage; if (sMonSummaryScreen->pageFlipDirection == 1) newPage = sMonSummaryScreen->curPageIndex - 1; else newPage = sMonSummaryScreen->curPageIndex + 1; switch (newPage) { case PSS_PAGE_INFO: ShowOrHideHpBarObjs(FALSE); ShowOrHideExpBarObjs(FALSE); break; case PSS_PAGE_SKILLS: break; case PSS_PAGE_MOVES: if (sMonSummaryScreen->pageFlipDirection == 0) { ShowOrHideHpBarObjs(FALSE); ShowOrHideExpBarObjs(FALSE); } else { ShoworHideMoveSelectionCursor(FALSE); HideShowPokerusIcon(FALSE); PokeSum_ShowOrHideMonIconSprite(FALSE); HideShowShinyStar(FALSE); } break; case PSS_PAGE_MOVES_INFO: PokeSum_ShowOrHideMonPicSprite(FALSE); PokeSum_ShowOrHideMonMarkingsSprite(FALSE); ShowOrHideStatusIcon(FALSE); ShowOrHideBallIconObj(FALSE); HideShowPokerusIcon(FALSE); HideShowShinyStar(FALSE); break; } } static u8 PokeSum_IsPageFlipFinished(u8 a0) { s8 pageDelta = 1; if (sMonSummaryScreen->pageFlipDirection == 1) pageDelta = -1; if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO) if (sMonSummaryScreen->flipPagesBgHofs <= 0) { sMonSummaryScreen->flipPagesBgHofs = 0; sMonSummaryScreen->whichBgLayerToTranslate ^= 1; PokeSum_UpdateBgPriorityForPageFlip(0, 0); sMonSummaryScreen->flippingPages = FALSE; return TRUE; } if ((sMonSummaryScreen->curPageIndex + pageDelta) == PSS_PAGE_MOVES_INFO) if (sMonSummaryScreen->flipPagesBgHofs >= 240) { sMonSummaryScreen->flipPagesBgHofs = 240; sMonSummaryScreen->whichBgLayerToTranslate ^= 1; sMonSummaryScreen->flippingPages = FALSE; return TRUE; } if (sMonSummaryScreen->pageFlipDirection == 1) { if (sMonSummaryScreen->flipPagesBgHofs >= 240) { sMonSummaryScreen->flipPagesBgHofs = 240; sMonSummaryScreen->whichBgLayerToTranslate ^= 1; PokeSum_UpdateBgPriorityForPageFlip(0, 0); sMonSummaryScreen->flippingPages = FALSE; return TRUE; } } else if (sMonSummaryScreen->flipPagesBgHofs <= 0) { sMonSummaryScreen->whichBgLayerToTranslate ^= 1; sMonSummaryScreen->flipPagesBgHofs = 0; sMonSummaryScreen->flippingPages = FALSE; return TRUE; } return FALSE; } static void PokeSum_UpdateBgPriorityForPageFlip(u8 setBg0Priority, u8 keepBg1Bg2PriorityOrder) { u32 i; u32 bg0Priority; u32 bg1Priority; u32 bg2Priority; bg0Priority = GetGpuReg(REG_OFFSET_BG0CNT) & 3; bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3; bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3; if (sMonSummaryScreen->pageFlipDirection == 1) { if (setBg0Priority == 0) { bg0Priority = 0; if (keepBg1Bg2PriorityOrder == 0) { if (bg1Priority > bg2Priority) bg1Priority = 1, bg2Priority = 2; else bg1Priority = 2, bg2Priority = 1; } else { if (bg1Priority > bg2Priority) bg1Priority = 2, bg2Priority = 1; else bg1Priority = 1, bg2Priority = 2; } } if (setBg0Priority == 1) { bg0Priority = 1; if (keepBg1Bg2PriorityOrder == 0) { if (bg1Priority > bg2Priority) bg1Priority = 0, bg2Priority = 2; else bg1Priority = 2, bg2Priority = 0; } else { if (bg1Priority > bg2Priority) bg1Priority = 2, bg2Priority = 0; else bg1Priority = 0, bg2Priority = 2; } } } if (sMonSummaryScreen->pageFlipDirection == 0) { bg0Priority = 0; if (bg1Priority > bg2Priority) bg1Priority = 1, bg2Priority = 2; else bg1Priority = 2, bg2Priority = 1; } for (i = 0; i < 11; i++) { if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS && sMonSummaryScreen->pageFlipDirection == 1) sExpBarObjs->sprites[i]->oam.priority = bg0Priority; else sExpBarObjs->sprites[i]->oam.priority = bg1Priority; if (i >= 9) continue; if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS && sMonSummaryScreen->pageFlipDirection == 1) sHpBarObjs->sprites[i]->oam.priority = bg0Priority; else sHpBarObjs->sprites[i]->oam.priority = bg1Priority; } SetGpuReg(REG_OFFSET_BG0CNT, (GetGpuReg(REG_OFFSET_BG0CNT) & (u16)~3) | bg0Priority); SetGpuReg(REG_OFFSET_BG1CNT, (GetGpuReg(REG_OFFSET_BG1CNT) & (u16)~3) | bg1Priority); SetGpuReg(REG_OFFSET_BG2CNT, (GetGpuReg(REG_OFFSET_BG2CNT) & (u16)~3) | bg2Priority); } static void PokeSum_CopyNewBgTilemapBeforePageFlip_2(void) { u8 newPage; if (sMonSummaryScreen->pageFlipDirection == 1) newPage = sMonSummaryScreen->curPageIndex - 1; else newPage = sMonSummaryScreen->curPageIndex + 1; switch (newPage) { case PSS_PAGE_INFO: CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0); break; case PSS_PAGE_SKILLS: if (sMonSummaryScreen->pageFlipDirection == 1) CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageMoves_Tilemap, 0, 0); else CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageInfo_Tilemap, 0, 0); break; case PSS_PAGE_MOVES: if (sMonSummaryScreen->pageFlipDirection == 1) CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageMovesInfo_Tilemap, 0, 0); else CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0); break; case PSS_PAGE_MOVES_INFO: CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageMoves_Tilemap, 0, 0); break; } } static void PokeSum_CopyNewBgTilemapBeforePageFlip(void) { u8 newPage; if (sMonSummaryScreen->pageFlipDirection == 1) newPage = sMonSummaryScreen->curPageIndex - 1; else newPage = sMonSummaryScreen->curPageIndex + 1; switch (newPage) { case PSS_PAGE_INFO: CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0); break; case PSS_PAGE_SKILLS: break; case PSS_PAGE_MOVES: if (sMonSummaryScreen->pageFlipDirection == 1) CopyToBgTilemapBuffer(3, sBgTilemap_MovesPage, 0, 0); else CopyToBgTilemapBuffer(3, sBgTilemap_MovesInfoPage, 0, 0); break; case PSS_PAGE_MOVES_INFO: CopyToBgTilemapBuffer(3, sBgTilemap_MovesInfoPage, 0, 0); break; } } static void CB2_SetUpPSS(void) { switch (sMonSummaryScreen->summarySetupStep) { case 0: PokeSum_Setup_ResetCallbacks(); break; case 1: PokeSum_Setup_InitGpu(); break; case 2: PokeSum_Setup_SpritesReset(); break; case 3: if (!PokeSum_HandleLoadBgGfx()) return; break; case 4: if (!PokeSum_HandleCreateSprites()) return; break; case 5: PokeSum_CreateWindows(); break; case 6: if (!PokeSum_Setup_BufferStrings()) return; break; case 7: PokeSum_PrintRightPaneText(); break; case 8: PokeSum_PrintBottomPaneText(); break; case 9: PokeSum_PrintAbilityDataOrMoveTypes(); PokeSum_PrintMonTypeIcons(); break; case 10: if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE) CopyToBgTilemapBuffer(3, sBgTilemap_MovesPage, 0, 0); else CopyToBgTilemapBuffer(3, sBgTilemap_MovesInfoPage, 0, 0); PokeSum_DrawPageProgressTiles(); break; case 11: if (sMonSummaryScreen->isEgg) CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageEgg_Tilemap, 0, 0); else { if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE) { CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageMoves_Tilemap, 0, 0); CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageMovesInfo_Tilemap, 0, 0); } else { CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageInfo_Tilemap, 0, 0); CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0); } } break; case 12: BlendPalettes(0xffffffff, 16, 0); PokeSum_PrintPageHeaderText(sMonSummaryScreen->curPageIndex); CommitStaticWindowTilemaps(); break; case 13: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2); break; case 14: CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(3); break; case 15: if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE) { PokeSum_ShowOrHideMonIconSprite(FALSE); ShoworHideMoveSelectionCursor(FALSE); } else { PokeSum_ShowOrHideMonPicSprite(FALSE); PokeSum_ShowOrHideMonMarkingsSprite(FALSE); ShowOrHideBallIconObj(FALSE); ShowOrHideHpBarObjs(FALSE); ShowOrHideExpBarObjs(FALSE); } ShowOrHideStatusIcon(FALSE); HideShowPokerusIcon(FALSE); HideShowShinyStar(FALSE); break; default: PokeSum_Setup_SetVBlankCallback(); PokeSum_FinishSetup(); return; } sMonSummaryScreen->summarySetupStep++; } static u8 PokeSum_HandleLoadBgGfx(void) { switch (sMonSummaryScreen->loadBgGfxStep) { case 0: LoadPalette(gSummaryScreen_Bg_Pal, BG_PLTT_ID(0), 5 * PLTT_SIZE_4BPP); if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg) { LoadPalette(&gSummaryScreen_Bg_Pal[16 * 6], BG_PLTT_ID(0), PLTT_SIZE_4BPP); LoadPalette(&gSummaryScreen_Bg_Pal[16 * 5], BG_PLTT_ID(1), PLTT_SIZE_4BPP); } else { LoadPalette(&gSummaryScreen_Bg_Pal[16 * 0], BG_PLTT_ID(0), PLTT_SIZE_4BPP); LoadPalette(&gSummaryScreen_Bg_Pal[16 * 1], BG_PLTT_ID(1), PLTT_SIZE_4BPP); } break; case 1: ListMenuLoadStdPalAt(BG_PLTT_ID(6), 1); LoadPalette(sTextHeaderPalette, BG_PLTT_ID(7), PLTT_SIZE_4BPP); break; case 2: ResetTempTileDataBuffers(); break; case 3: DecompressAndCopyTileDataToVram(2, gSummaryScreen_Bg_Gfx, 0, 0, 0); break; case 4: if (FreeTempTileDataBuffersIfPossible() == TRUE) return FALSE; break; case 5: case 6: break; default: LoadPalette(sTextMovesPalette, BG_PLTT_ID(8), PLTT_SIZE_4BPP); return TRUE; } sMonSummaryScreen->loadBgGfxStep++; return FALSE; } static u8 PokeSum_Setup_BufferStrings(void) { switch (sMonSummaryScreen->bufferStringsStep) { case 0: BufferMonInfo(); if (sMonSummaryScreen->isEgg) { sMonSummaryScreen->bufferStringsStep = 0; return TRUE; } break; case 1: if (sMonSummaryScreen->isEgg == 0) BufferMonSkills(); break; case 2: if (sMonSummaryScreen->isEgg == 0) BufferMonMoves(); break; default: sMonSummaryScreen->bufferStringsStep = 0; return TRUE; } sMonSummaryScreen->bufferStringsStep++; return FALSE; } static void BufferMonInfo(void) { u8 tempStr[20]; u16 dexNum; u16 gender; u16 heldItem; u32 otId; dexNum = SpeciesToPokedexNum(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES)); if (dexNum == 0xffff) StringCopy(sMonSummaryScreen->summary.dexNumStrBuf, gText_PokeSum_DexNoUnknown); else ConvertIntToDecimalStringN(sMonSummaryScreen->summary.dexNumStrBuf, dexNum, STR_CONV_MODE_LEADING_ZEROS, 3); sMonSkillsPrinterXpos->unk00 = 0; if (!sMonSummaryScreen->isEgg) { dexNum = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES); bufferspeciesname(sMonSummaryScreen->summary.speciesNameStrBuf, dexNum); } else { GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_NICKNAME, sMonSummaryScreen->summary.speciesNameStrBuf); return; } sMonSummaryScreen->monTypes[0] = gSpeciesInfo[dexNum].types[0]; sMonSummaryScreen->monTypes[1] = gSpeciesInfo[dexNum].types[1]; GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_NICKNAME, tempStr); StringCopyN_Multibyte(sMonSummaryScreen->summary.nicknameStrBuf, tempStr, POKEMON_NAME_LENGTH); StringGet_Nickname(sMonSummaryScreen->summary.nicknameStrBuf); gender = GetMonGender(&sMonSummaryScreen->currentMon); dexNum = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG); if (gender == MON_FEMALE) StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gText_FemaleSymbol); else if (gender == MON_MALE) StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gText_MaleSymbol); else StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gString_Dummy); if (dexNum == SPECIES_NIDORAN_M || dexNum == SPECIES_NIDORAN_F) if (StringCompare(sMonSummaryScreen->summary.nicknameStrBuf, gSpeciesNames[dexNum]) == 0) StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gString_Dummy); GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_NAME, tempStr); StringCopyN_Multibyte(sMonSummaryScreen->summary.otNameStrBuf, tempStr, PLAYER_NAME_LENGTH); ConvertInternationalString(sMonSummaryScreen->summary.otNameStrBuf, GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LANGUAGE)); otId = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_ID) & 0xffff; ConvertIntToDecimalStringN(sMonSummaryScreen->summary.unk306C, otId, STR_CONV_MODE_LEADING_ZEROS, 5); ConvertIntToDecimalStringN(tempStr, GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LEVEL), STR_CONV_MODE_LEFT_ALIGN, 3); StringCopy(sMonSummaryScreen->summary.levelStrBuf, gText_Lv); StringAppendN(sMonSummaryScreen->summary.levelStrBuf, tempStr, 4); heldItem = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HELD_ITEM); if (heldItem == ITEM_NONE) StringCopy(sMonSummaryScreen->summary.itemNameStrBuf, gText_PokeSum_Item_None); else CopyItemName(heldItem, sMonSummaryScreen->summary.itemNameStrBuf); } #define GetNumberRightAlign63(x) (63 - StringLength((x)) * 6) #define GetNumberRightAlign27(x) (27 - StringLength((x)) * 6) static void BufferMonSkills(void) { u8 tempStr[20]; u8 level; u16 type; u16 species; u16 hp; u16 statValue; u32 exp; u32 expToNextLevel; u8 plusStat = 0; //0 = none; 1 = Atk; 2 = Def; 3 = Speed; 4 = SpA; 5 = SpD u8 minusStat = 0; u8 nature = GetNature(&sMonSummaryScreen->currentMon); switch(nature) { case NATURE_LONELY: case NATURE_BRAVE: case NATURE_ADAMANT: case NATURE_NAUGHTY: plusStat = 1; //Atk break; case NATURE_BOLD: case NATURE_RELAXED: case NATURE_IMPISH: case NATURE_LAX: plusStat = 2; //Def break; case NATURE_TIMID: case NATURE_HASTY: case NATURE_JOLLY: case NATURE_NAIVE: plusStat = 3; //Speed break; case NATURE_MODEST: case NATURE_MILD: case NATURE_QUIET: case NATURE_RASH: plusStat = 4; //SpA break; case NATURE_CALM: case NATURE_GENTLE: case NATURE_SASSY: case NATURE_CAREFUL: plusStat = 5; //SpD break; default: break; } switch(nature) { case NATURE_BOLD: case NATURE_TIMID: case NATURE_MODEST: case NATURE_CALM: minusStat = 1; //Atk break; case NATURE_LONELY: case NATURE_HASTY: case NATURE_MILD: case NATURE_GENTLE: minusStat = 2; //Def break; case NATURE_BRAVE: case NATURE_RELAXED: case NATURE_QUIET: case NATURE_SASSY: minusStat = 3; //Speed break; case NATURE_ADAMANT: case NATURE_IMPISH: case NATURE_JOLLY: case NATURE_CAREFUL: minusStat = 4; //SpA break; case NATURE_NAUGHTY: case NATURE_LAX: case NATURE_NAIVE: case NATURE_RASH: minusStat = 5; //SpD break; default: break; } hp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.curHpStrBuf, hp, STR_CONV_MODE_LEFT_ALIGN, 3); StringAppend(sMonSummaryScreen->summary.curHpStrBuf, gText_Slash); hp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP); ConvertIntToDecimalStringN(tempStr, hp, STR_CONV_MODE_LEFT_ALIGN, 3); StringAppend(sMonSummaryScreen->summary.curHpStrBuf, tempStr); sMonSkillsPrinterXpos->curHpStr = GetNumberRightAlign63(sMonSummaryScreen->summary.curHpStrBuf); if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary && sMonSummaryScreen->isEnemyParty == TRUE) { statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ATK2); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 1) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x79; if(minusStat == 1) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x7A; if(plusStat != 1 && minusStat != 1) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x78; sMonSkillsPrinterXpos->atkStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]); statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_DEF2); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 2) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x79; if(minusStat == 2) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x7A; if(plusStat != 2 && minusStat != 2) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x78; sMonSkillsPrinterXpos->defStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]); statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPATK2); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 4) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x79; if(minusStat == 4) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x7A; if(plusStat != 4 && minusStat != 4) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x78; sMonSkillsPrinterXpos->spAStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]); statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPDEF2); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 5) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x79; if(minusStat == 5) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x7A; if(plusStat != 5 && minusStat != 5) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x78; sMonSkillsPrinterXpos->spDStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]); statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPEED2); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 3) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x79; if(minusStat == 3) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x7A; if(plusStat != 3 && minusStat != 3) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x78; sMonSkillsPrinterXpos->speStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]); } else { statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ATK); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 1) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x79; if(minusStat == 1) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x7A; if(plusStat != 1 && minusStat != 1) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x78; sMonSkillsPrinterXpos->atkStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]); statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_DEF); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 2) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x79; if(minusStat == 2) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x7A; if(plusStat != 2 && minusStat != 2) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x78; sMonSkillsPrinterXpos->defStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]); statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPATK); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 4) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x79; if(minusStat == 4) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x7A; if(plusStat != 4 && minusStat != 4) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x78; sMonSkillsPrinterXpos->spAStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]); statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPDEF); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 5) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x79; if(minusStat == 5) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x7A; if(plusStat != 5 && minusStat != 5) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x78; sMonSkillsPrinterXpos->spDStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]); statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPEED); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4); if(plusStat == 3) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x79; if(minusStat == 3) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x7A; if(plusStat != 3 && minusStat != 3) sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x78; sMonSkillsPrinterXpos->speStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]); } exp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EXP); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.expPointsStrBuf, exp, STR_CONV_MODE_LEFT_ALIGN, 7); sMonSkillsPrinterXpos->expStr = GetNumberRightAlign63(sMonSummaryScreen->summary.expPointsStrBuf); level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LEVEL); expToNextLevel = 0; if (level < 100) { species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES); expToNextLevel = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - exp; } ConvertIntToDecimalStringN(sMonSummaryScreen->summary.expToNextLevelStrBuf, expToNextLevel, STR_CONV_MODE_LEFT_ALIGN, 7); sMonSkillsPrinterXpos->toNextLevel = GetNumberRightAlign63(sMonSummaryScreen->summary.expToNextLevelStrBuf); type = GetAbilityBySpecies(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES), GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ABILITY_NUM)); StringCopy(sMonSummaryScreen->summary.abilityNameStrBuf, gAbilityNames[type]); StringCopy(sMonSummaryScreen->summary.abilityDescStrBuf, gAbilityDescriptionPointers[type]); sMonSummaryScreen->curMonStatusAilment = StatusToAilment(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_STATUS)); if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE) if (CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0)) sMonSummaryScreen->curMonStatusAilment = AILMENT_PKRS; } static void BufferMonMoves(void) { u32 i; for (i = 0; i < 4; i++) BufferMonMoveI(i); if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) BufferMonMoveI(4); } #define GetRightAlignXpos_NDigits(a, b) ((6 * (a)) - StringLength((b)) * 6) static void BufferMonMoveI(u32 i) { u32 type; u32 terrainType; u32 monFriendship = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FRIENDSHIP); s32 power; u32 accuracy; if (i < 4) sMonSummaryScreen->moveIds[i] = GetMonMoveBySlotId(&sMonSummaryScreen->currentMon, i); if (sMonSummaryScreen->moveIds[i] == 0) { StringCopy(sMonSummaryScreen->summary.moveNameStrBufs[i], gText_PokeSum_OneHyphen); StringCopy(sMonSummaryScreen->summary.moveCurPpStrBufs[i], gText_PokeSum_TwoHyphens); StringCopy(sMonSummaryScreen->summary.movePowerStrBufs[i], gText_ThreeHyphens); StringCopy(sMonSummaryScreen->summary.moveAccuracyStrBufs[i], gText_ThreeHyphens); sMonSkillsPrinterXpos->curPp[i] = 0xff; sMonSkillsPrinterXpos->maxPp[i] = 0xff; return; } accuracy = gBattleMoves[sMonSummaryScreen->moveIds[i]].accuracy; switch(sMonSummaryScreen->moveIds[i]) { case MOVE_HIDDEN_POWER: { u8 powerBits = ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP_IV) & 2) >> 1) | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ATK_IV) & 2) << 0) | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_DEF_IV) & 2) << 1) | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPEED_IV) & 2) << 2) | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPATK_IV) & 2) << 3) | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPDEF_IV) & 2) << 4); power = (40 * powerBits) / 63 + 30; type = GetHiddenPowerType(&sMonSummaryScreen->currentMon); break; } case MOVE_RETURN: { type = TYPE_NORMAL; power = (10 * monFriendship / 25); if(power == 0) power = 1; break; } case MOVE_FRUSTRATION: { type = TYPE_NORMAL; power = (10 * (MAX_FRIENDSHIP - monFriendship) / 25); if(power == 0) power = 1; break; } case MOVE_WEATHER_BALL: { type = GetWeatherBallType(); if(type == TYPE_NORMAL) power = 50; else power = 100; break; } case MOVE_NATURE_POWER:\\ { if (gMain.inBattle) terrainType = gBattleTerrain; else terrainType = BattleSetup_GetTerrainId(); type = gBattleMoves[gNaturePowerMoves[terrainType]].type; power = gBattleMoves[gNaturePowerMoves[terrainType]].power; accuracy = gBattleMoves[gNaturePowerMoves[terrainType]].accuracy; break; } default: { type = gBattleMoves[sMonSummaryScreen->moveIds[i]].type; power = gBattleMoves[sMonSummaryScreen->moveIds[i]].power; break; } } sMonSummaryScreen->numMoves++; sMonSummaryScreen->moveTypes[i] = type; StringCopy(sMonSummaryScreen->summary.moveNameStrBufs[i], gMoveNames[sMonSummaryScreen->moveIds[i]]); if (i >= 4 && sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) { ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveCurPpStrBufs[i], gBattleMoves[sMonSummaryScreen->moveIds[i]].pp, STR_CONV_MODE_LEFT_ALIGN, 3); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveMaxPpStrBufs[i], gBattleMoves[sMonSummaryScreen->moveIds[i]].pp, STR_CONV_MODE_LEFT_ALIGN, 3); } else { ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveCurPpStrBufs[i], GetMonPpByMoveSlot(&sMonSummaryScreen->currentMon, i), STR_CONV_MODE_LEFT_ALIGN, 3); ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveMaxPpStrBufs[i], CalculatePPWithBonus(sMonSummaryScreen->moveIds[i], GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PP_BONUSES), i), STR_CONV_MODE_LEFT_ALIGN, 3); } sMonSkillsPrinterXpos->curPp[i] = GetRightAlignXpos_NDigits(2, sMonSummaryScreen->summary.moveCurPpStrBufs[i]); sMonSkillsPrinterXpos->maxPp[i] = GetRightAlignXpos_NDigits(2, sMonSummaryScreen->summary.moveMaxPpStrBufs[i]); if (power <= 1 && sMonSummaryScreen->moveIds[i] != MOVE_RETURN && sMonSummaryScreen->moveIds[i] != MOVE_FRUSTRATION) StringCopy(sMonSummaryScreen->summary.movePowerStrBufs[i], gText_ThreeHyphens); else ConvertIntToDecimalStringN(sMonSummaryScreen->summary.movePowerStrBufs[i], power, STR_CONV_MODE_RIGHT_ALIGN, 3); if (accuracy == 0) StringCopy(sMonSummaryScreen->summary.moveAccuracyStrBufs[i], gText_ThreeHyphens); else ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveAccuracyStrBufs[i], accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); } static u8 PokeSum_HandleCreateSprites(void) { switch (sMonSummaryScreen->spriteCreationStep) { case 0: CreateShinyStarObj(TAG_PSS_UNK_A0, TAG_PSS_UNK_A0); break; case 1: CreatePokerusIconObj(TAG_PSS_UNK_96, TAG_PSS_UNK_96); break; case 2: PokeSum_CreateMonMarkingsSprite(); break; case 3: CreateMoveSelectionCursorObjs(TAG_PSS_UNK_64, TAG_PSS_UNK_64); break; case 4: CreateMonStatusIconObj(TAG_PSS_UNK_6E, TAG_PSS_UNK_6E); break; case 5: CreateHpBarObjs(TAG_PSS_UNK_78, TAG_PSS_UNK_78); break; case 6: CreateExpBarObjs(TAG_PSS_UNK_82, TAG_PSS_UNK_82); break; case 7: CreateBallIconObj(); break; case 8: PokeSum_CreateMonIconSprite(); break; default: PokeSum_CreateMonPicSprite(); return TRUE; } sMonSummaryScreen->spriteCreationStep++; return FALSE; } static void PokeSum_Setup_SpritesReset(void) { ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); ScanlineEffect_Stop(); } static void PokeSum_Setup_InitGpu(void) { DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTempaltes, NELEMS(sBgTempaltes)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN1_ON); PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex); SetGpuReg(REG_OFFSET_WININ, (WININ_WIN0_OBJ | WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) << 8); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3); SetGpuReg(REG_OFFSET_WIN1V, 32 << 8 | 135); SetGpuReg(REG_OFFSET_WIN1H, 2 << 8 | 240); SetBgTilemapBuffer(1, sMonSummaryScreen->bg1TilemapBuffer); SetBgTilemapBuffer(2, sMonSummaryScreen->bg2TilemapBuffer); SetBgTilemapBuffer(3, sMonSummaryScreen->bg3TilemapBuffer); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); } static void PokeSum_FinishSetup(void) { if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE) sMonSummaryScreen->inputHandlerTaskId = CreateTask(Task_InputHandler_SelectOrForgetMove, 0); else sMonSummaryScreen->inputHandlerTaskId = CreateTask(Task_InputHandler_Info, 0); SetMainCallback2(CB2_RunPokemonSummaryScreen); } static void PokeSum_PrintPageName(const u8 * str) { FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 0); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], FONT_NORMAL, 4, 1, sLevelNickTextColors[1], 0, str); PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME]); } static void PokeSum_PrintControlsString(const u8 * str) { u8 v0; s32 width; u8 r1; FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 0); width = GetStringWidth(FONT_SMALL, str, 0); r1 = sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS]; AddTextPrinterParameterized3(r1, FONT_SMALL, 0x54 - width, 0, sLevelNickTextColors[1], 0, str); PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS]); } static void PrintMonLevelNickOnWindow2(const u8 * str) { FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 0); if (!sMonSummaryScreen->isEgg) { if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2, 4, 2, sLevelNickTextColors[1], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.levelStrBuf); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], FONT_NORMAL, 40, 2, sLevelNickTextColors[1], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.nicknameStrBuf); if (GetMonGender(&sMonSummaryScreen->currentMon) == MON_FEMALE) AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], FONT_NORMAL, 105, 2, sLevelNickTextColors[3], 0, sMonSummaryScreen->summary.genderSymbolStrBuf); else AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], FONT_NORMAL, 105, 2, sLevelNickTextColors[2], 0, sMonSummaryScreen->summary.genderSymbolStrBuf); } PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK]); } static void PokeSum_PrintRightPaneText(void) { FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 0); switch (sMonSummaryScreen->curPageIndex) { case PSS_PAGE_INFO: PrintInfoPage(); break; case PSS_PAGE_SKILLS: PrintSkillsPage(); break; case PSS_PAGE_MOVES: case PSS_PAGE_MOVES_INFO: PrintMovesPage(); break; } PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE]); } static void PrintInfoPage(void) { AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47, 19, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.speciesNameStrBuf); if (!sMonSummaryScreen->isEgg) { AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47 + sMonSkillsPrinterXpos->unk00, 5, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.dexNumStrBuf); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47, 49, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.otNameStrBuf); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47, 64, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.unk306C); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47, 79, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.itemNameStrBuf); } else { u8 eggCycles; u8 hatchMsgIndex; eggCycles = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FRIENDSHIP); if (eggCycles <= 5) hatchMsgIndex = 3; else if (eggCycles <= 10) hatchMsgIndex = 2; else if (eggCycles <= 40) hatchMsgIndex = 1; else hatchMsgIndex = 0; if (sMonSummaryScreen->isBadEgg) hatchMsgIndex = 0; AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 7, 45, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sEggHatchTimeTexts[hatchMsgIndex]); } } static void PrintSkillsPage(void) { AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 14 + sMonSkillsPrinterXpos->curHpStr, 4, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.curHpStrBuf); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->atkStr, 22, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->defStr, 35, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->spAStr, 48, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->spDStr, 61, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->speStr, 74, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 15 + sMonSkillsPrinterXpos->expStr, 87, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.expPointsStrBuf); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 15 + sMonSkillsPrinterXpos->toNextLevel, 100, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.expToNextLevelStrBuf); } #define GetMoveNamePrinterYpos(x) ((x) * 28 + 5) #define GetMovePpPrinterYpos(x) ((x) * 28 + 16) static void PrintMovesPage(void) { u32 i; for (i = 0; i < 4; i++) PokeSum_PrintMoveName(i); if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO) { if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) PokeSum_PrintMoveName(4); else AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 3, GetMoveNamePrinterYpos(4), sPrintMoveTextColors[0], TEXT_SKIP_DRAW, gFameCheckerText_Cancel); } } static void PokeSum_PrintMoveName(u8 i) { u8 colorIdx = 0; u8 curPP = GetMonPpByMoveSlot(&sMonSummaryScreen->currentMon, i); u16 move = sMonSummaryScreen->moveIds[i]; u8 ppBonuses = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PP_BONUSES); u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); if (i == 4) curPP = maxPP; AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 3, GetMoveNamePrinterYpos(i), sPrintMoveTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveNameStrBufs[i]); if (sMonSummaryScreen->moveIds[i] == 0 || (curPP == maxPP)) colorIdx = 0; else if (curPP == 0) colorIdx = 3; else if (maxPP == 3) { if (curPP == 2) colorIdx = 2; else if (curPP == 1) colorIdx = 1; } else if (maxPP == 2) { if (curPP == 1) colorIdx = 1; } else { if (curPP <= (maxPP / 4)) colorIdx = 2; else if (curPP <= (maxPP / 2)) colorIdx = 1; } AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 36, GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, gText_PokeSum_PP); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 46 + sMonSkillsPrinterXpos->curPp[i], GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveCurPpStrBufs[i]); if (sMonSummaryScreen->moveIds[i] != MOVE_NONE) { AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 58, GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, gText_Slash); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 64 + sMonSkillsPrinterXpos->maxPp[i], GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveMaxPpStrBufs[i]); } } static void PokeSum_PrintBottomPaneText(void) { FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 0); switch (sMonSummaryScreen->curPageIndex) { case PSS_PAGE_INFO: PokeSum_PrintTrainerMemo(); break; case PSS_PAGE_SKILLS: PokeSum_PrintExpPoints_NextLv(); break; case PSS_PAGE_MOVES_INFO: PokeSum_PrintSelectedMoveStats(); break; case PSS_PAGE_MOVES: break; } PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO]); } static void PokeSum_PrintTrainerMemo(void) { if (!sMonSummaryScreen->isEgg) PokeSum_PrintTrainerMemo_Mon(); else PokeSum_PrintTrainerMemo_Egg(); } static void PokeSum_PrintTrainerMemo_Mon_HeldByOT(void) { u8 nature; u8 level; u8 metLocation; u8 levelStr[5]; u8 mapNameStr[32]; u8 natureMetOrHatchedAtLevelStr[152]; DynamicPlaceholderTextUtil_Reset(); nature = GetNature(&sMonSummaryScreen->currentMon); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNatureNamePointers[nature]); level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL); if (level == 0) level = 5; ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_LEFT_ALIGN, 3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, levelStr); metLocation = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LOCATION); if (MapSecIsInKantoOrSevii(metLocation) == TRUE) { GetMapNameGeneric_(mapNameStr, metLocation); if(metLocation == MAPSEC_BATTLE_FRONTIER) //remove if Battle Frontier ever happens { StringCopy(mapNameStr, gText_BattleTower); } } else { if (sMonSummaryScreen->isEnemyParty == TRUE || IsMultiBattlePartner() == TRUE) StringCopy(mapNameStr, gText_Somewhere); else StringCopy(mapNameStr, gText_PokeSum_ATrade); } DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, mapNameStr); // These pairs of strings are bytewise identical to each other in English, // but Japanese uses different grammar for Bold and Gentle natures. if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL) == 0) // Hatched { if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE) { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterHatched_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterHatched); } else { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Hatched_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Hatched); } } else { if (metLocation == METLOC_FATEFUL_ENCOUNTER) { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet); } else { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Met_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Met); } } AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, natureMetOrHatchedAtLevelStr); } static void PokeSum_PrintTrainerMemo_Mon_NotHeldByOT(void) //if different OT { u8 nature; u8 level; u8 metLocation; u8 levelStr[5]; u8 mapNameStr[32]; u8 natureMetOrHatchedAtLevelStr[152]; u8 *orreMetLocationString; u8 playerOTNameStr[152]; u8 tempStr[20]; DynamicPlaceholderTextUtil_Reset(); nature = GetNature(&sMonSummaryScreen->currentMon); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNatureNamePointers[nature]); level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL); if (level == 0) level = 5; ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_LEFT_ALIGN, 3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, levelStr); metLocation = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LOCATION); if (!MapSecIsInKantoOrSevii(metLocation) || !CurrentMonIsFromGBA()) { if (IsMultiBattlePartner() == TRUE) { PokeSum_PrintTrainerMemo_Mon_HeldByOT(); return; } if (metLocation == METLOC_FATEFUL_ENCOUNTER) { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet); } else { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_MetInATrade_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_MetInATrade); } AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, natureMetOrHatchedAtLevelStr); return; } if (MapSecIsInKantoOrSevii(metLocation) == TRUE && !IsMonFromOrre()) { GetMapNameGeneric_(mapNameStr, metLocation); } else if (IsMonFromOrre()) { orreMetLocationString = DetermineOrreMetLocation(&sMonSummaryScreen->currentMon); WriteOrreMapName(mapNameStr, orreMetLocationString, 0); } else StringCopy(mapNameStr, gText_PokeSum_ATrade); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, mapNameStr); // These pairs of strings are bytewise identical to each other in English, // but Japanese uses different grammar for Bold and Gentle natures. if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL) == 0) // hatched from an EGG { if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE) { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyFatefulEncounterHatched_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyFatefulEncounterHatched); } else { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet); } } else { if (metLocation == METLOC_FATEFUL_ENCOUNTER) { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet); } else { if(IsMonFromOrre() && (metLocation == 254 || metLocation == 0)) { GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_NAME, tempStr); DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, tempStr); DynamicPlaceholderTextUtil_ExpandPlaceholders(playerOTNameStr, gSummaryMetLocationTextOrreEeveelutionsDuking); DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, playerOTNameStr); } else { if (PokeSum_IsMonBoldOrGentle(nature)) DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet_BoldGentleGrammar); else DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet); } } } AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, natureMetOrHatchedAtLevelStr); } static bool8 IsMonFromOrre(void) { u8 version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME); if(version == VERSION_GAMECUBE) return TRUE; return FALSE; } static void PokeSum_PrintTrainerMemo_Mon(void) { // Pokemon from Orre are always considered outsiders by the summary screen if (PokeSum_BufferOtName_IsEqualToCurrentOwner(&sMonSummaryScreen->currentMon) == TRUE && !IsMonFromOrre()) PokeSum_PrintTrainerMemo_Mon_HeldByOT(); else PokeSum_PrintTrainerMemo_Mon_NotHeldByOT(); } static bool32 IsEggFromBoxRS(void) { u16 species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES); u8 OtName[12]; GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_NAME, OtName); switch (species) { case SPECIES_SWABLU: case SPECIES_ZIGZAGOON: case SPECIES_SKITTY: case SPECIES_PICHU: { if(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_GENDER) == 1) if((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_ID) & 0xFFFF) == 0) if(!StringCompareWithoutExtCtrlCodes(gText_Azusa, OtName)) return TRUE; } } return FALSE; } static void PokeSum_PrintTrainerMemo_Egg(void) { u8 metLocation; u8 version; u8 chosenStrIndex = 0; metLocation = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LOCATION); if (sMonSummaryScreen->monList.mons != gEnemyParty) { if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE) chosenStrIndex = 4; else { version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME); if (version != VERSION_LEAF_GREEN && version != VERSION_FIRE_RED) chosenStrIndex = 1; else if (metLocation == METLOC_SPECIAL_EGG) chosenStrIndex = 2; if (chosenStrIndex == 0 || chosenStrIndex == 2) if (PokeSum_BufferOtName_IsEqualToCurrentOwner(&sMonSummaryScreen->currentMon) == FALSE) chosenStrIndex++; } } else { if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE) chosenStrIndex = 4; else { version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME); if (version != VERSION_LEAF_GREEN && version != VERSION_FIRE_RED) { if (metLocation == METLOC_SPECIAL_EGG) chosenStrIndex = 5; } else if (metLocation == METLOC_SPECIAL_EGG) chosenStrIndex = 2; if (PokeSum_BufferOtName_IsEqualToCurrentOwner(&sMonSummaryScreen->currentMon) == FALSE) chosenStrIndex++; } } if (sMonSummaryScreen->isBadEgg) chosenStrIndex = 0; if(IsEggFromBoxRS()) AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, gText_PeculiarEggPokemonBox); else AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sEggOriginTexts[chosenStrIndex]); } static void PokeSum_PrintExpPoints_NextLv(void) { AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 26, 7, sLevelNickTextColors[0], TEXT_SKIP_DRAW, gText_PokeSum_ExpPoints); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 26, 20, sLevelNickTextColors[0], TEXT_SKIP_DRAW, gText_PokeSum_NextLv); } static void PokeSum_PrintSelectedMoveStats(void) { if (sMoveSelectionCursorPos < 5) { if (sMonSummaryScreen->mode != PSS_MODE_SELECT_MOVE && sMoveSelectionCursorPos == 4) return; AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 57, 1, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.movePowerStrBufs[sMoveSelectionCursorPos]); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 57, 15, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveAccuracyStrBufs[sMoveSelectionCursorPos]); AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 7, 42, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, gMoveDescriptionPointers[sMonSummaryScreen->moveIds[sMoveSelectionCursorPos] - 1]); } } static void PokeSum_PrintAbilityDataOrMoveTypes(void) { switch (sMonSummaryScreen->curPageIndex) { case PSS_PAGE_INFO: break; case PSS_PAGE_SKILLS: PokeSum_PrintAbilityNameAndDesc(); break; case PSS_PAGE_MOVES: case PSS_PAGE_MOVES_INFO: PokeSum_DrawMoveTypeIcons(); break; } PutWindowTilemap(sMonSummaryScreen->windowIds[5]); } static void PokeSum_PrintAbilityNameAndDesc(void) { FillWindowPixelBuffer(sMonSummaryScreen->windowIds[5], 0); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[5], FONT_NORMAL, 66, 1, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.abilityNameStrBuf); AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[5], FONT_NORMAL, 2, 15, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.abilityDescStrBuf); } static void PokeSum_DrawMoveTypeIcons(void) { u32 i; FillWindowPixelBuffer(sMonSummaryScreen->windowIds[5], 0); for (i = 0; i < 4; i++) { if (sMonSummaryScreen->moveIds[i] == MOVE_NONE) continue; BlitMenuInfoIcon(sMonSummaryScreen->windowIds[5], sMonSummaryScreen->moveTypes[i] + 1, 3, GetMoveNamePrinterYpos(i)); } if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) BlitMenuInfoIcon(sMonSummaryScreen->windowIds[5], sMonSummaryScreen->moveTypes[4] + 1, 3, GetMoveNamePrinterYpos(4)); } static void PokeSum_PrintPageHeaderText(u8 curPageIndex) { switch (curPageIndex) { case PSS_PAGE_INFO: PokeSum_PrintPageName(gText_PokeSum_PageName_PokemonInfo); if (!sMonSummaryScreen->isEgg) PokeSum_PrintControlsString(gText_PokeSum_Controls_PageCancel); else PokeSum_PrintControlsString(gText_PokeSum_Controls_Cancel); PrintMonLevelNickOnWindow2(gText_PokeSum_NoData); break; case PSS_PAGE_SKILLS: PokeSum_PrintPageName(gText_PokeSum_PageName_PokemonSkills); PokeSum_PrintControlsString(gText_PokeSum_Controls_Page); PrintMonLevelNickOnWindow2(gText_PokeSum_NoData); break; case PSS_PAGE_MOVES: PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves); PokeSum_PrintControlsString(gText_PokeSum_Controls_PageDetail); PrintMonLevelNickOnWindow2(gText_PokeSum_NoData); break; case PSS_PAGE_MOVES_INFO: PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves); if (!gMain.inBattle) PokeSum_PrintControlsString(gText_PokeSum_Controls_PickSwitch); else PokeSum_PrintControlsString(gText_PokeSum_Controls_Pick); PrintMonLevelNickOnWindow2(gText_PokeSum_NoData); break; case PSS_PAGE_MOVE_DELETER: PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves); PokeSum_PrintControlsString(gText_PokeSum_Controls_PickDelete); PrintMonLevelNickOnWindow2(gText_PokeSum_NoData); break; default: break; } } static void CommitStaticWindowTilemaps(void) { PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME]); PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS]); PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK]); } static void Task_DestroyResourcesOnExit(u8 taskId) { PokeSum_DestroySprites(); FreeAllSpritePalettes(); if (IsCryPlayingOrClearCrySongs() == TRUE) StopCryAndClearCrySongs(); PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex); FreeAllWindowBuffers(); DestroyTask(taskId); SetMainCallback2(sMonSummaryScreen->savedCallback); sLastViewedMonIndex = GetLastViewedMonIndex(); FREE_AND_SET_NULL_IF_SET(sMonSummaryScreen); FREE_AND_SET_NULL_IF_SET(sMonSkillsPrinterXpos); } static void CB2_RunPokemonSummaryScreen(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void PokeSum_FlipPages_SlideHpExpBarsOut(void) { u32 i; for (i = 0; i < 11; i++) { if (sExpBarObjs->xpos[i] < 240) { sExpBarObjs->xpos[i] += 60; sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i] + 60; } if (i >= 9) continue; if (sHpBarObjs->xpos[i] < 240) { sHpBarObjs->xpos[i] += 60; sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i] + 60; } } } static void PokeSum_FlipPages_SlideHpExpBarsIn(void) { u32 i; for (i = 0; i < 11; i++) { if (sExpBarObjs->xpos[i] > 156 + (8 * i)) { sExpBarObjs->xpos[i] -= 60; if (sExpBarObjs->xpos[i] < 156 + (8 * i)) sExpBarObjs->xpos[i] = 156 + (8 * i); sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i]; } if (i >= 9) continue; if (sHpBarObjs->xpos[i] > 172 + (8 * i)) { sHpBarObjs->xpos[i] -= 60; if (sHpBarObjs->xpos[i] < 172 + (8 * i)) sHpBarObjs->xpos[i] = 172 + (8 * i); sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i]; } } } static void PokeSum_FlipPages_SlideLayerLeft(void) { if (sMonSummaryScreen->flipPagesBgHofs < 240) { sMonSummaryScreen->flipPagesBgHofs += 60; if (sMonSummaryScreen->flipPagesBgHofs > 240) sMonSummaryScreen->flipPagesBgHofs = 240; if (sMonSummaryScreen->whichBgLayerToTranslate == 0) SetGpuReg(REG_OFFSET_BG2HOFS, -sMonSummaryScreen->flipPagesBgHofs); else SetGpuReg(REG_OFFSET_BG1HOFS, -sMonSummaryScreen->flipPagesBgHofs); } } static void PokeSum_FlipPages_SlideLayeRight(void) { if (sMonSummaryScreen->flipPagesBgHofs >= 60) { sMonSummaryScreen->flipPagesBgHofs -= 60; if (sMonSummaryScreen->flipPagesBgHofs < 0) sMonSummaryScreen->flipPagesBgHofs = 0; if (sMonSummaryScreen->whichBgLayerToTranslate == 0) SetGpuReg(REG_OFFSET_BG1HOFS, -sMonSummaryScreen->flipPagesBgHofs); else SetGpuReg(REG_OFFSET_BG2HOFS, -sMonSummaryScreen->flipPagesBgHofs); if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) SetGpuReg(REG_OFFSET_BG0HOFS, -sMonSummaryScreen->flipPagesBgHofs); } } static void PokeSum_FlipPages_HandleBgHofs(void) { if (sMonSummaryScreen->pageFlipDirection == 1) // Right { if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) PokeSum_FlipPages_SlideLayerLeft(); else PokeSum_FlipPages_SlideLayeRight(); } else { if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES) PokeSum_FlipPages_SlideLayeRight(); else PokeSum_FlipPages_SlideLayerLeft(); } } static void PokeSum_FlipPages_HandleHpExpBarSprites(void) { if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS && sMonSummaryScreen->pageFlipDirection == 0) PokeSum_FlipPages_SlideHpExpBarsIn(); if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 1) PokeSum_FlipPages_SlideHpExpBarsOut(); } static void VBlankCB_PokemonSummaryScreen(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); if (sMonSummaryScreen->flippingPages == FALSE) return; PokeSum_FlipPages_HandleBgHofs(); PokeSum_FlipPages_HandleHpExpBarSprites(); } static void PokeSum_Setup_ResetCallbacks(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); } static void PokeSum_Setup_SetVBlankCallback(void) { SetVBlankCallback(VBlankCB_PokemonSummaryScreen); } static void PokeSum_CreateWindows(void) { u32 i; InitWindows(sWindowTemplates_Dummy); for (i = 0; i < 3; i++) sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg1[i]); for (i = 0; i < 4; i++) switch (sMonSummaryScreen->curPageIndex) { case PSS_PAGE_INFO: sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Info[i]); break; case PSS_PAGE_SKILLS: sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Skills[i]); break; case PSS_PAGE_MOVES: case PSS_PAGE_MOVES_INFO: sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Moves[i]); break; default: break; } } static void PokeSum_AddWindows(u8 curPageIndex) { u32 i; u32 bgPriority1 = GetGpuReg(REG_OFFSET_BG1CNT) & 3; u32 bgPriority2 = GetGpuReg(REG_OFFSET_BG2CNT) & 3; for (i = 0; i < 7; i++) sMonSummaryScreen->windowIds[i] = 0xff; if ((sMonSummaryScreen->pageFlipDirection == 1 && sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) || (sMonSummaryScreen->pageFlipDirection == 0 && sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES)) { if (bgPriority2 > bgPriority1) for (i = 0; i < 3; i++) sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg2[i]); else for (i = 0; i < 3; i++) sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg1[i]); } else { if (bgPriority2 > bgPriority1) for (i = 0; i < 3; i++) sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg1[i]); else for (i = 0; i < 3; i++) sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg2[i]); } for (i = 0; i < 4; i++) switch (curPageIndex) { case PSS_PAGE_INFO: sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Info[i]); break; case PSS_PAGE_SKILLS: default: sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Skills[i]); break; case PSS_PAGE_MOVES: case PSS_PAGE_MOVES_INFO: sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Moves[i]); break; } } static void PokeSum_RemoveWindows(u8 curPageIndex) { u32 i; for (i = 0; i < 7; i++) RemoveWindow(sMonSummaryScreen->windowIds[i]); } static void PokeSum_SetHelpContext(void) { switch (sMonSummaryScreen->curPageIndex) { case PSS_PAGE_INFO: SetHelpContext(HELPCONTEXT_POKEMON_INFO); break; case PSS_PAGE_SKILLS: SetHelpContext(HELPCONTEXT_POKEMON_SKILLS); break; case PSS_PAGE_MOVES: case PSS_PAGE_MOVES_INFO: SetHelpContext(HELPCONTEXT_POKEMON_MOVES); break; } } static u8 PokeSum_BufferOtName_IsEqualToCurrentOwner(struct Pokemon * mon) { u32 i; u8 multiplayerId; u32 trainerId = 0; if (sMonSummaryScreen->monList.mons == gEnemyParty) { multiplayerId = GetMultiplayerId() ^ 1; trainerId = gLinkPlayers[multiplayerId].trainerId & 0xffff; StringCopy(sMonSummaryScreen->summary.otNameStrBufs[0], gLinkPlayers[multiplayerId].name); } else { trainerId = GetPlayerTrainerId() & 0xffff; StringCopy(sMonSummaryScreen->summary.otNameStrBufs[0], gSaveBlock2Ptr->playerName); } if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xffff)) return FALSE; GetMonData(mon, MON_DATA_OT_NAME, sMonSummaryScreen->summary.otNameStrBufs[1]); if (!StringCompareWithoutExtCtrlCodes(sMonSummaryScreen->summary.otNameStrBufs[0], sMonSummaryScreen->summary.otNameStrBufs[1])) return TRUE; else return FALSE; return TRUE; } #define PAGE_PROGRESS_BASE_TILE_NUM (345) static void PokeSum_DrawPageProgressTiles(void) { switch (sMonSummaryScreen->curPageIndex) { case PSS_PAGE_INFO: if (!sMonSummaryScreen->isEgg) { FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 16 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 32 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 18 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 34 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 20 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 36 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 18 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 34 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 21 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 37 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0); } else { FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 48 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 64 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 2 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 4, 2, 0); } break; case PSS_PAGE_SKILLS: FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 16 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 32 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 18 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 34 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 21 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 37 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0); break; case PSS_PAGE_MOVES: FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 48 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 64 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0); break; case PSS_PAGE_MOVES_INFO: if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) { FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 4, 1, 0); FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 4, 1, 0); } else { FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0); } FillBgTilemapBufferRect(3, 50 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 66 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0); FillBgTilemapBufferRect(3, 48 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0); FillBgTilemapBufferRect(3, 64 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0); break; } } static void PokeSum_PrintMonTypeIcons(void) { switch (sMonSummaryScreen->curPageIndex) { case PSS_PAGE_INFO: if (!sMonSummaryScreen->isEgg) { BlitMenuInfoIcon(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], sMonSummaryScreen->monTypes[0] + 1, 47, 35); if (sMonSummaryScreen->monTypes[0] != sMonSummaryScreen->monTypes[1]) BlitMenuInfoIcon(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], sMonSummaryScreen->monTypes[1] + 1, 83, 35); } break; case PSS_PAGE_SKILLS: break; case PSS_PAGE_MOVES: break; case PSS_PAGE_MOVES_INFO: FillWindowPixelBuffer(sMonSummaryScreen->windowIds[6], 0); BlitMenuInfoIcon(sMonSummaryScreen->windowIds[6], sMonSummaryScreen->monTypes[0] + 1, 0, 3); if (sMonSummaryScreen->monTypes[0] != sMonSummaryScreen->monTypes[1]) BlitMenuInfoIcon(sMonSummaryScreen->windowIds[6], sMonSummaryScreen->monTypes[1] + 1, 36, 3); PutWindowTilemap(sMonSummaryScreen->windowIds[6]); break; } } u8 GetLastViewedMonIndex(void) { return sLastViewedMonIndex; } u8 GetMoveSlotToReplace(void) { return sMoveSwapCursorPos; } void SetPokemonSummaryScreenMode(u8 mode) { sMonSummaryScreen->mode = mode; } static bool32 IsMultiBattlePartner(void) { if (!IsUpdateLinkStateCBActive() && IsMultiBattle() == TRUE && gReceivedRemoteLinkPlayers == 1 && (sLastViewedMonIndex >= 4 || sLastViewedMonIndex == 1)) return TRUE; return FALSE; } static void BufferSelectedMonData(struct Pokemon * mon) { if (!sMonSummaryScreen->isBoxMon) { struct Pokemon * partyMons = sMonSummaryScreen->monList.mons; *mon = partyMons[GetLastViewedMonIndex()]; } else { struct BoxPokemon * boxMons = sMonSummaryScreen->monList.boxMons; BoxMonToMon(&boxMons[GetLastViewedMonIndex()], mon); PopulateBoxHpAndStatusToPartyMon(mon); } } static u16 GetMonMoveBySlotId(struct Pokemon * mon, u8 moveSlot) { u16 move; switch (moveSlot) { case 0: move = GetMonData(mon, MON_DATA_MOVE1); break; case 1: move = GetMonData(mon, MON_DATA_MOVE2); break; case 2: move = GetMonData(mon, MON_DATA_MOVE3); break; default: move = GetMonData(mon, MON_DATA_MOVE4); } return move; } static u16 GetMonPpByMoveSlot(struct Pokemon * mon, u8 moveSlot) { u16 pp; switch (moveSlot) { case 0: pp = GetMonData(mon, MON_DATA_PP1); break; case 1: pp = GetMonData(mon, MON_DATA_PP2); break; case 2: pp = GetMonData(mon, MON_DATA_PP3); break; default: pp = GetMonData(mon, MON_DATA_PP4); } return pp; } static u8 StatusToAilment(u32 status) { if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP) == 0) return AILMENT_FNT; if ((status & STATUS1_PSN_ANY) != 0) return AILMENT_PSN; if ((status & STATUS1_PARALYSIS) != 0) return AILMENT_PRZ; if ((status & STATUS1_SLEEP) != 0) return AILMENT_SLP; if ((status & STATUS1_FREEZE) != 0) return AILMENT_FRZ; if ((status & STATUS1_BURN) != 0) return AILMENT_BRN; if (CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0)) return AILMENT_PKRS; return AILMENT_NONE; } static void Task_HandleInput_SelectMove(u8 taskId) { u32 i; switch (sMonSummaryScreen->selectMoveInputHandlerState) { case 0: if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE) return; if (JOY_NEW(DPAD_UP)) { if (sMoveSelectionCursorPos > 0) { sMonSummaryScreen->selectMoveInputHandlerState = 2; PlaySE(SE_SELECT); for (i = sMoveSelectionCursorPos; i > 0; i--) if (sMonSummaryScreen->moveIds[i - 1] != 0) { PlaySE(SE_SELECT); sMoveSelectionCursorPos = i - 1; return; } } else { sMoveSelectionCursorPos = 4; sMonSummaryScreen->selectMoveInputHandlerState = 2; PlaySE(SE_SELECT); if (sMonSummaryScreen->isSwappingMoves == TRUE) for (i = sMoveSelectionCursorPos; i > 0; i--) if (sMonSummaryScreen->moveIds[i - 1] != 0) { PlaySE(SE_SELECT); sMoveSelectionCursorPos = i - 1; return; } } } else if (JOY_NEW(DPAD_DOWN)) { if (sMoveSelectionCursorPos < 4) { u8 v0 = 4; sMonSummaryScreen->selectMoveInputHandlerState = 2; if (sMonSummaryScreen->isSwappingMoves == TRUE) { if (sMoveSelectionCursorPos == 5 - 2) { sMoveSelectionCursorPos = 0; sMonSummaryScreen->selectMoveInputHandlerState = 2; PlaySE(SE_SELECT); return; } v0--; } for (i = sMoveSelectionCursorPos; i < v0; i++) if (sMonSummaryScreen->moveIds[i + 1] != 0) { PlaySE(SE_SELECT); sMoveSelectionCursorPos = i + 1; return; } if (!sMonSummaryScreen->isSwappingMoves) { PlaySE(SE_SELECT); sMoveSelectionCursorPos = i; } else { PlaySE(SE_SELECT); sMoveSelectionCursorPos = 0; } return; } else if (sMoveSelectionCursorPos == 4) { sMoveSelectionCursorPos = 0; sMonSummaryScreen->selectMoveInputHandlerState = 2; PlaySE(SE_SELECT); return; } } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); if (sMoveSelectionCursorPos == 4) { sMoveSelectionCursorPos = 0; sMoveSwapCursorPos = 0; sMonSummaryScreen->isSwappingMoves = FALSE; ShoworHideMoveSelectionCursor(TRUE); sMonSummaryScreen->pageFlipDirection = 0; PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex); sMonSummaryScreen->curPageIndex--; sMonSummaryScreen->selectMoveInputHandlerState = 1; return; } if (sMonSummaryScreen->isSwappingMoves != TRUE) { if (sMonSummaryScreen->isEnemyParty == FALSE && gMain.inBattle == 0 && gReceivedRemoteLinkPlayers == 0) { sMoveSwapCursorPos = sMoveSelectionCursorPos; sMonSummaryScreen->isSwappingMoves = TRUE; } return; } else { sMonSummaryScreen->isSwappingMoves = FALSE; if (sMoveSelectionCursorPos == sMoveSwapCursorPos) return; if (sMonSummaryScreen->isBoxMon == 0) SwapMonMoveSlots(); else SwapBoxMonMoveSlots(); UpdateCurrentMonBufferFromPartyOrBox(&sMonSummaryScreen->currentMon); BufferMonMoves(); sMonSummaryScreen->selectMoveInputHandlerState = 2; return; } } else if (JOY_NEW(B_BUTTON)) { if (sMonSummaryScreen->isSwappingMoves == TRUE) { sMoveSwapCursorPos = sMoveSelectionCursorPos; sMonSummaryScreen->isSwappingMoves = FALSE; return; } if (sMoveSelectionCursorPos == 4) { sMoveSelectionCursorPos = 0; sMoveSwapCursorPos = 0; } ShoworHideMoveSelectionCursor(TRUE); sMonSummaryScreen->pageFlipDirection = 0; PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex); sMonSummaryScreen->curPageIndex--; sMonSummaryScreen->selectMoveInputHandlerState = 1; } break; case 1: gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_BackOutOfSelectMove; sMonSummaryScreen->selectMoveInputHandlerState = 0; break; case 2: PokeSum_PrintRightPaneText(); PokeSum_PrintBottomPaneText(); PokeSum_PrintAbilityDataOrMoveTypes(); sMonSummaryScreen->selectMoveInputHandlerState = 3; break; case 3: if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE) return; CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); sMonSummaryScreen->selectMoveInputHandlerState = 0; break; default: break; } } static void SwapMonMoveSlots(void) { struct Pokemon * partyMons; struct Pokemon * mon; u16 move1, move2; u8 pp1, pp2; u8 allMovesPPBonuses; u8 move1ppBonus, move2ppBonus; partyMons = sMonSummaryScreen->monList.mons; mon = &partyMons[GetLastViewedMonIndex()]; move1 = GetMonData(mon, MON_DATA_MOVE1 + sMoveSelectionCursorPos); move2 = GetMonData(mon, MON_DATA_MOVE1 + sMoveSwapCursorPos); pp1 = GetMonData(mon, MON_DATA_PP1 + sMoveSelectionCursorPos); pp2 = GetMonData(mon, MON_DATA_PP1 + sMoveSwapCursorPos); allMovesPPBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); move1ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSelectionCursorPos]) >> (sMoveSelectionCursorPos * 2); move2ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSwapCursorPos]) >> (sMoveSwapCursorPos * 2); allMovesPPBonuses &= ~gPPUpGetMask[sMoveSelectionCursorPos]; allMovesPPBonuses &= ~gPPUpGetMask[sMoveSwapCursorPos]; allMovesPPBonuses |= (move1ppBonus << (sMoveSwapCursorPos * 2)) + (move2ppBonus << (sMoveSelectionCursorPos * 2)); SetMonData(mon, MON_DATA_MOVE1 + sMoveSelectionCursorPos, (u8 *)&move2); SetMonData(mon, MON_DATA_MOVE1 + sMoveSwapCursorPos, (u8 *)&move1); SetMonData(mon, MON_DATA_PP1 + sMoveSelectionCursorPos, &pp2); SetMonData(mon, MON_DATA_PP1 + sMoveSwapCursorPos, &pp1); SetMonData(mon, MON_DATA_PP_BONUSES, &allMovesPPBonuses); } static void SwapBoxMonMoveSlots(void) { struct BoxPokemon * boxMons; struct BoxPokemon * boxMon; u16 move1, move2; u8 pp1, pp2; u8 allMovesPPBonuses; u8 move1ppBonus, move2ppBonus; boxMons = sMonSummaryScreen->monList.boxMons; boxMon = &boxMons[GetLastViewedMonIndex()]; move1 = GetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSelectionCursorPos); move2 = GetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSwapCursorPos); pp1 = GetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSelectionCursorPos); pp2 = GetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSwapCursorPos); allMovesPPBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES); move1ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSelectionCursorPos]) >> (sMoveSelectionCursorPos * 2); move2ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSwapCursorPos]) >> (sMoveSwapCursorPos * 2); allMovesPPBonuses &= ~gPPUpGetMask[sMoveSelectionCursorPos]; allMovesPPBonuses &= ~gPPUpGetMask[sMoveSwapCursorPos]; allMovesPPBonuses |= (move1ppBonus << (sMoveSwapCursorPos * 2)) + (move2ppBonus << (sMoveSelectionCursorPos * 2)); SetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSelectionCursorPos, (u8 *)&move2); SetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSwapCursorPos, (u8 *)&move1); SetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSelectionCursorPos, &pp2); SetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSwapCursorPos, &pp1); SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &allMovesPPBonuses); } static void UpdateCurrentMonBufferFromPartyOrBox(struct Pokemon * mon) { if (!sMonSummaryScreen->isBoxMon) { struct Pokemon * partyMons; partyMons = sMonSummaryScreen->monList.mons; *mon = partyMons[GetLastViewedMonIndex()]; } else { struct BoxPokemon * boxMons; boxMons = sMonSummaryScreen->monList.boxMons; BoxMonToMon(&boxMons[GetLastViewedMonIndex()], mon); PopulateBoxHpAndStatusToPartyMon(mon); } } static u8 PokeSum_CanForgetSelectedMove(void) { u16 move; move = GetMonMoveBySlotId(&sMonSummaryScreen->currentMon, sMoveSelectionCursorPos); if(IsMoveHm(move) && (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TWO_ISLAND_HOUSE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TWO_ISLAND_HOUSE))) { //in Move Reminder's house if(VarGet(VAR_TEMP_0)) //currently in Move Reminder's script return TRUE; //able to overwrite HMs } if (IsMoveHm(move) == TRUE && sMonSummaryScreen->mode != PSS_MODE_FORGET_MOVE) return FALSE; return TRUE; } static void Task_InputHandler_SelectOrForgetMove(u8 taskId) { u32 i; switch (sMonSummaryScreen->selectMoveInputHandlerState) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0); sMonSummaryScreen->selectMoveInputHandlerState++; break; case 1: if (!gPaletteFade.active) { PokeSum_TryPlayMonCry(); sMonSummaryScreen->selectMoveInputHandlerState++; } break; case 2: if (JOY_NEW(DPAD_UP)) { if (sMoveSelectionCursorPos > 0) { sMonSummaryScreen->selectMoveInputHandlerState = 3; PlaySE(SE_SELECT); for (i = sMoveSelectionCursorPos; i > 0; i--) if (sMonSummaryScreen->moveIds[i - 1] != 0) { PlaySE(SE_SELECT); sMoveSelectionCursorPos = i - 1; return; } } else { sMoveSelectionCursorPos = 4; sMonSummaryScreen->selectMoveInputHandlerState = 3; PlaySE(SE_SELECT); return; } } else if (JOY_NEW(DPAD_DOWN)) { if (sMoveSelectionCursorPos < 4) { u8 v0 = 4; sMonSummaryScreen->selectMoveInputHandlerState = 3; if (sMonSummaryScreen->isSwappingMoves == TRUE) v0--; for (i = sMoveSelectionCursorPos; i < v0; i++) if (sMonSummaryScreen->moveIds[i + 1] != 0) { PlaySE(SE_SELECT); sMoveSelectionCursorPos = i + 1; return; } if (!sMonSummaryScreen->isSwappingMoves) { PlaySE(SE_SELECT); sMoveSelectionCursorPos = i; } return; } else if (sMoveSelectionCursorPos == 4) { sMoveSelectionCursorPos = 0; sMonSummaryScreen->selectMoveInputHandlerState = 3; PlaySE(SE_SELECT); return; } } else if (JOY_NEW(A_BUTTON)) { if (PokeSum_CanForgetSelectedMove() == TRUE || sMoveSelectionCursorPos == 4) { PlaySE(SE_SELECT); sMoveSwapCursorPos = sMoveSelectionCursorPos; gSpecialVar_0x8005 = sMoveSwapCursorPos; sMonSummaryScreen->selectMoveInputHandlerState = 6; } else { PlaySE(SE_FAILURE); sMonSummaryScreen->selectMoveInputHandlerState = 5; } } else if (JOY_NEW(B_BUTTON)) { sMoveSwapCursorPos = 4; gSpecialVar_0x8005 = (u16)sMoveSwapCursorPos; sMonSummaryScreen->selectMoveInputHandlerState = 6; } break; case 3: PokeSum_PrintRightPaneText(); PokeSum_PrintBottomPaneText(); PokeSum_PrintAbilityDataOrMoveTypes(); sMonSummaryScreen->selectMoveInputHandlerState = 4; break; case 4: if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE) return; CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); sMonSummaryScreen->selectMoveInputHandlerState = 2; break; case 5: FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 0); AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 7, 42, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, gText_PokeSum_HmMovesCantBeForgotten); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); sMonSummaryScreen->selectMoveInputHandlerState = 2; break; case 6: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); sMonSummaryScreen->selectMoveInputHandlerState++; break; default: if (!gPaletteFade.active) Task_DestroyResourcesOnExit(taskId); break; } } static void SpriteCB_PokeSum_MonPicSprite(struct Sprite *sprite) { if (sMonSummaryScreen->numMonPicBounces >= 2) return; if (sMonPicBounceState->initDelay++ >= 2) { u8 arrayLen; switch (sMonPicBounceState->vigor) { case 0: sprite->y += sMonPicBounceYDelta_Under60[sMonPicBounceState->animFrame++]; arrayLen = NELEMS(sMonPicBounceYDelta_Under60); break; case 1: sprite->y += sMonPicBounceYDelta_60to80[sMonPicBounceState->animFrame++]; arrayLen = NELEMS(sMonPicBounceYDelta_60to80); break; case 2: sprite->y += sMonPicBounceYDelta_80to99[sMonPicBounceState->animFrame++]; arrayLen = NELEMS(sMonPicBounceYDelta_80to99); break; case 3: default: sprite->y += sMonPicBounceYDelta_Full[sMonPicBounceState->animFrame++]; arrayLen = NELEMS(sMonPicBounceYDelta_Full); break; } if (sMonPicBounceState->animFrame >= arrayLen) { sMonPicBounceState->animFrame = 0; sMonSummaryScreen->numMonPicBounces++; } sMonPicBounceState->initDelay = 0; } } static void SpriteCB_PokeSum_EggPicShake(struct Sprite *sprite) { if (sMonSummaryScreen->numMonPicBounces >= 2) return; switch (sMonPicBounceState->vigor) { case 0: default: if (sMonPicBounceState->initDelay++ >= 120) { sprite->x += sEggPicShakeXDelta_ItWillTakeSomeTime[sMonPicBounceState->animFrame]; if (++sMonPicBounceState->animFrame >= NELEMS(sEggPicShakeXDelta_ItWillTakeSomeTime)) { sMonPicBounceState->animFrame = 0; sMonPicBounceState->initDelay = 0; sMonSummaryScreen->numMonPicBounces++; } } break; case 1: if (sMonPicBounceState->initDelay++ >= 90) { sprite->x += sEggPicShakeXDelta_OccasionallyMoves[sMonPicBounceState->animFrame]; if (++sMonPicBounceState->animFrame >= NELEMS(sEggPicShakeXDelta_OccasionallyMoves)) { sMonPicBounceState->animFrame = 0; sMonPicBounceState->initDelay = 0; sMonSummaryScreen->numMonPicBounces++; } } break; case 2: if (sMonPicBounceState->initDelay++ >= 60) { sprite->x += sEggPicShakeXDelta_AlmostReadyToHatch[sMonPicBounceState->animFrame]; if (++sMonPicBounceState->animFrame >= NELEMS(sEggPicShakeXDelta_AlmostReadyToHatch)) { sMonPicBounceState->animFrame = 0; sMonPicBounceState->initDelay = 0; sMonSummaryScreen->numMonPicBounces++; } } break; } } static void SpriteCB_MonPicDummy(struct Sprite *sprite) { } static void PokeSum_CreateMonPicSprite(void) { u16 spriteId; u16 species; u32 personality; u32 trainerId; sMonPicBounceState = AllocZeroed(sizeof(struct MonPicBounceState)); species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG); personality = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PERSONALITY); if(species == SPECIES_DEOXYS) { switch(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FORME)) { case 1: //Attack Forme species = 65531; break; case 2: species = 65532; break; case 3: species = 65533; break; default: species = 65530; break; } } trainerId = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_ID); if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary) { if (sMonSummaryScreen->isEnemyParty == TRUE) spriteId = CreateMonPicSprite(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff, TRUE); else spriteId = CreateMonPicSprite_HandleDeoxys(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff); } else { if (ShouldIgnoreDeoxysForm(DEOXYS_CHECK_TRADE_MAIN, sLastViewedMonIndex)) spriteId = CreateMonPicSprite(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff, TRUE); else spriteId = CreateMonPicSprite_HandleDeoxys(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff); } FreeSpriteOamMatrix(&gSprites[spriteId]); if (!IsMonSpriteNotFlipped(species)) gSprites[spriteId].hFlip = TRUE; else gSprites[spriteId].hFlip = FALSE; sMonSummaryScreen->monPicSpriteId = spriteId; PokeSum_ShowOrHideMonPicSprite(TRUE); PokeSum_SetMonPicSpriteCallback(spriteId); } static void PokeSum_SetMonPicSpriteCallback(u16 spriteId) { u16 curHp; u16 maxHp; sMonSummaryScreen->numMonPicBounces = 0; if (sMonSummaryScreen->isEgg == TRUE) { u8 friendship = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FRIENDSHIP); if (friendship <= 5) sMonPicBounceState->vigor = 2; else { if (friendship <= 10) sMonPicBounceState->vigor = 1; else if (friendship <= 40) sMonPicBounceState->vigor = 0; } gSprites[spriteId].callback = SpriteCB_PokeSum_EggPicShake; return; } if (sMonSummaryScreen->curMonStatusAilment != AILMENT_NONE && sMonSummaryScreen->curMonStatusAilment != AILMENT_PKRS) { if (sMonSummaryScreen->curMonStatusAilment == AILMENT_FNT) return; gSprites[spriteId].callback = SpriteCB_MonPicDummy; return; } curHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP); maxHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP); if (curHp == maxHp) sMonPicBounceState->vigor = 3; else if (maxHp * 0.8 <= curHp) sMonPicBounceState->vigor = 2; else if (maxHp * 0.6 <= curHp) sMonPicBounceState->vigor = 1; else sMonPicBounceState->vigor = 0; gSprites[spriteId].callback = SpriteCB_PokeSum_MonPicSprite; } static void PokeSum_ShowOrHideMonPicSprite(u8 invisible) { gSprites[sMonSummaryScreen->monPicSpriteId].invisible = invisible; } static void PokeSum_DestroyMonPicSprite(void) { FreeAndDestroyMonPicSprite(sMonSummaryScreen->monPicSpriteId); FREE_AND_SET_NULL(sMonPicBounceState); } static void CreateBallIconObj(void) { u16 ballItemId; u8 ballId; if (!sMonSummaryScreen->isEgg) ballItemId = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_POKEBALL); else ballItemId = 0; ballId = ItemIdToBallId(ballItemId); LoadBallGfx(ballId); sMonSummaryScreen->ballIconSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 106, 88, 0); gSprites[sMonSummaryScreen->ballIconSpriteId].callback = SpriteCallbackDummy; gSprites[sMonSummaryScreen->ballIconSpriteId].oam.priority = 0; ShowOrHideBallIconObj(TRUE); } static void ShowOrHideBallIconObj(u8 invisible) { gSprites[sMonSummaryScreen->ballIconSpriteId].invisible = invisible; } static void DestroyBallIconObj(void) { // Redundant, as DestroySpriteAndFreeResources could've been used. DestroySpriteAndFreeResources_Ball(&gSprites[sMonSummaryScreen->ballIconSpriteId]); } static void PokeSum_CreateMonIconSprite(void) { u16 species; u32 personality; species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG); personality = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PERSONALITY); if(species == SPECIES_DEOXYS) { switch(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FORME)) { case 1: //Attack Forme species = 65531; break; case 2: species = 65532; break; case 3: species = 65533; break; default: species = 65530; break; } } SafeLoadMonIconPalette(species); if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary) { if (sMonSummaryScreen->isEnemyParty == TRUE) sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 0); else sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 1); } else { if (ShouldIgnoreDeoxysForm(DEOXYS_CHECK_TRADE_MAIN, sLastViewedMonIndex)) sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 0); else sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 1); } if (!IsMonSpriteNotFlipped(species)) gSprites[sMonSummaryScreen->monIconSpriteId].hFlip = TRUE; else gSprites[sMonSummaryScreen->monIconSpriteId].hFlip = FALSE; PokeSum_ShowOrHideMonIconSprite(TRUE); } static void PokeSum_ShowOrHideMonIconSprite(bool8 invisible) { gSprites[sMonSummaryScreen->monIconSpriteId].invisible = invisible; } static void PokeSum_DestroyMonIconSprite(void) { u16 species; species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG); SafeFreeMonIconPalette(species); DestroyMonIcon(&gSprites[sMonSummaryScreen->monIconSpriteId]); } static void CreateMoveSelectionCursorObjs(u16 tileTag, u16 palTag) { u32 i; u8 spriteId; void *gfxBufferPtrs[2]; gfxBufferPtrs[0] = AllocZeroed(0x20 * 64); gfxBufferPtrs[1] = AllocZeroed(0x20 * 64); sMoveSelectionCursorObjs[0] = AllocZeroed(sizeof(struct MoveSelectionCursor)); sMoveSelectionCursorObjs[1] = AllocZeroed(sizeof(struct MoveSelectionCursor)); sMoveSelectionCursorObjs[2] = AllocZeroed(sizeof(struct MoveSelectionCursor)); sMoveSelectionCursorObjs[3] = AllocZeroed(sizeof(struct MoveSelectionCursor)); LZ77UnCompWram(sMoveSelectionCursorTiles_Left, gfxBufferPtrs[0]); LZ77UnCompWram(sMoveSelectionCursorTiles_Right, gfxBufferPtrs[1]); for (i = 0; i < 4; i++) { struct SpriteSheet sheet = { .data = gfxBufferPtrs[i % 2], .size = 0x20 * 64, .tag = tileTag + i }; struct SpritePalette palette = {.data = sMoveSelectionCursorPals, .tag = palTag}; struct SpriteTemplate template = { .tileTag = tileTag + i, .paletteTag = palTag, .oam = &sMoveSelectionCursorOamData, .anims = sMoveSelectionCursorOamAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_MoveSelectionCursor, }; LoadSpriteSheet(&sheet); LoadSpritePalette(&palette); spriteId = CreateSprite(&template, 64 * (i % 2) + 152, sMoveSelectionCursorPos * 28 + 34, i % 2); sMoveSelectionCursorObjs[i]->sprite = &gSprites[spriteId]; sMoveSelectionCursorObjs[i]->whichSprite = i; sMoveSelectionCursorObjs[i]->tileTag = tileTag + i; sMoveSelectionCursorObjs[i]->palTag = palTag; sMoveSelectionCursorObjs[i]->sprite->subpriority = i; if (i > 1) StartSpriteAnim(sMoveSelectionCursorObjs[i]->sprite, 1); } ShoworHideMoveSelectionCursor(TRUE); FREE_AND_SET_NULL_IF_SET(gfxBufferPtrs[0]); FREE_AND_SET_NULL_IF_SET(gfxBufferPtrs[1]); } static void ShoworHideMoveSelectionCursor(bool8 invisible) { u32 i; for (i = 0; i < 4; i++) sMoveSelectionCursorObjs[i]->sprite->invisible = invisible; } static void SpriteCB_MoveSelectionCursor(struct Sprite *sprite) { u32 i; for (i = 0; i < 4; i++) { if (sMonSummaryScreen->isSwappingMoves == TRUE && i > 1) continue; sMoveSelectionCursorObjs[i]->sprite->y = sMoveSelectionCursorPos * 28 + 34; } if (sMonSummaryScreen->isSwappingMoves != TRUE) { if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO) { sMoveSelectionCursorObjs[0]->sprite->invisible = FALSE; sMoveSelectionCursorObjs[1]->sprite->invisible = FALSE; } return; } for (i = 0; i < 2; i++) { sprite = sMoveSelectionCursorObjs[i]->sprite; sprite->data[0]++; if (sprite->invisible) { if (sprite->data[0] > 60) { sprite->invisible = FALSE; sprite->data[0] = 0; } } else if (sprite->data[0] > 60) { sprite->invisible = TRUE; sprite->data[0] = 0; } } } static void DestroyMoveSelectionCursorObjs(void) { u32 i; for (i = 0; i < 4; i++) { if (sMoveSelectionCursorObjs[i]->sprite != NULL) DestroySpriteAndFreeResources(sMoveSelectionCursorObjs[i]->sprite); FREE_AND_SET_NULL_IF_SET(sMoveSelectionCursorObjs[i]); } } static void CreateMonStatusIconObj(u16 tileTag, u16 palTag) { u16 spriteId; void *gfxBufferPtr; sStatusIcon = AllocZeroed(sizeof(struct MonStatusIconObj)); gfxBufferPtr = AllocZeroed(0x20 * 32); LZ77UnCompWram(gSummaryScreen_StatusAilmentIcon_Gfx, gfxBufferPtr); if (sStatusIcon != NULL) { struct SpriteSheet sheet = { .data = gfxBufferPtr, .size = 0x20 * 32, .tag = tileTag }; struct SpritePalette palette = {.data = gSummaryScreen_StatusAilmentIcon_Pal, .tag = palTag}; struct SpriteTemplate template = { .tileTag = tileTag, .paletteTag = palTag, .oam = &sStatusAilmentIconOamData, .anims = sStatusAilmentIconAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; LoadSpriteSheet(&sheet); LoadSpritePalette(&palette); spriteId = CreateSprite(&template, 0, 0, 0); sStatusIcon->sprite = &gSprites[spriteId]; sStatusIcon->tileTag = tileTag; sStatusIcon->palTag = palTag; } ShowOrHideStatusIcon(TRUE); UpdateMonStatusIconObj(); FREE_AND_SET_NULL_IF_SET(gfxBufferPtr); } static void DestroyMonStatusIconObj(void) { if (sStatusIcon->sprite != NULL) DestroySpriteAndFreeResources(sStatusIcon->sprite); FREE_AND_SET_NULL_IF_SET(sStatusIcon); } static void UpdateMonStatusIconObj(void) { sMonSummaryScreen->curMonStatusAilment = StatusToAilment(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_STATUS)); if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE) { ShowOrHideStatusIcon(TRUE); return; } StartSpriteAnim(sStatusIcon->sprite, sMonSummaryScreen->curMonStatusAilment - 1); ShowOrHideStatusIcon(FALSE); } static void ShowOrHideStatusIcon(u8 invisible) { if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE || sMonSummaryScreen->isEgg) sStatusIcon->sprite->invisible = TRUE; else sStatusIcon->sprite->invisible = invisible; if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO) { if (sStatusIcon->sprite->y != 45) { sStatusIcon->sprite->x = 16; sStatusIcon->sprite->y = 45; return; } } else if (sStatusIcon->sprite->y != 38) { sStatusIcon->sprite->x = 16; sStatusIcon->sprite->y = 38; return; } } static void CreateHpBarObjs(u16 tileTag, u16 palTag) { u32 i; u8 spriteId; void *gfxBufferPtr; u32 curHp; u32 maxHp; u8 hpBarPalTagOffset = 0; sHpBarObjs = AllocZeroed(sizeof(struct HpBarObjs)); gfxBufferPtr = AllocZeroed(0x20 * 12); LZ77UnCompWram(gSummaryScreen_HpBar_Gfx, gfxBufferPtr); curHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP); maxHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP); if (maxHp / 4 > curHp) hpBarPalTagOffset = 2; else if (maxHp / 2 > curHp) hpBarPalTagOffset = 1; if (gfxBufferPtr != NULL) { struct SpriteSheet sheet = { .data = gfxBufferPtr, .size = 0x20 * 12, .tag = tileTag }; struct SpritePalette palette1 = {.data = sHpBarPals[0], .tag = palTag}; struct SpritePalette palette2 = {.data = sHpBarPals[1], .tag = palTag + 1}; struct SpritePalette palette3 = {.data = sHpBarPals[2], .tag = palTag + 2}; LoadSpriteSheet(&sheet); LoadSpritePalette(&palette1); LoadSpritePalette(&palette2); LoadSpritePalette(&palette3); } for (i = 0; i < 9; i++) { struct SpriteTemplate template = { .tileTag = tileTag, .paletteTag = palTag + hpBarPalTagOffset, .oam = &sHpOrExpBarOamData, .anims = sHpOrExpBarAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; sHpBarObjs->xpos[i] = i * 8 + 172; spriteId = CreateSprite(&template, sHpBarObjs->xpos[i], 36, 0); sHpBarObjs->sprites[i] = &gSprites[spriteId]; sHpBarObjs->sprites[i]->invisible = FALSE; sHpBarObjs->sprites[i]->oam.priority = 2; sHpBarObjs->tileTag = tileTag; sHpBarObjs->palTag = palTag; StartSpriteAnim(sHpBarObjs->sprites[i], 8); } UpdateHpBarObjs(); ShowOrHideHpBarObjs(TRUE); FREE_AND_SET_NULL_IF_SET(gfxBufferPtr); } static void UpdateHpBarObjs(void) { u8 numWholeHpBarTiles = 0; u32 i; u8 animNum; u8 two = 2; u8 hpBarPalOffset = 0; u32 curHp; u32 maxHp; s64 pointsPerTile; s64 totalPoints; if (sMonSummaryScreen->isEgg) return; curHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP); maxHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP); if (maxHp / 5 >= curHp) hpBarPalOffset = 2; else if (maxHp / 2 >= curHp) hpBarPalOffset = 1; switch (GetHPBarLevel(curHp, maxHp)) { case 3: default: hpBarPalOffset = 0; break; case 2: hpBarPalOffset = 1; break; case 1: hpBarPalOffset = 2; break; } for (i = 0; i < 9; i++) sHpBarObjs->sprites[i]->oam.paletteNum = IndexOfSpritePaletteTag(TAG_PSS_UNK_78) + hpBarPalOffset; if (curHp == maxHp) for (i = two; i < 8; i++) StartSpriteAnim(sHpBarObjs->sprites[i], 8); else { pointsPerTile = (maxHp << 2) / 6; totalPoints = (curHp << 2); while (TRUE) { if (totalPoints <= pointsPerTile) break; totalPoints -= pointsPerTile; numWholeHpBarTiles++; } numWholeHpBarTiles += two; for (i = two; i < numWholeHpBarTiles; i++) StartSpriteAnim(sHpBarObjs->sprites[i], 8); animNum = (totalPoints * 6) / pointsPerTile; StartSpriteAnim(sHpBarObjs->sprites[numWholeHpBarTiles], animNum); for (i = numWholeHpBarTiles + 1; i < 8; i++) StartSpriteAnim(sHpBarObjs->sprites[i], 0); } StartSpriteAnim(sHpBarObjs->sprites[0], 9); StartSpriteAnim(sHpBarObjs->sprites[1], 10); StartSpriteAnim(sHpBarObjs->sprites[8], 11); } static void DestroyHpBarObjs(void) { u32 i; for (i = 0; i < 9; i++) if (sHpBarObjs->sprites[i] != NULL) DestroySpriteAndFreeResources(sHpBarObjs->sprites[i]); FREE_AND_SET_NULL_IF_SET(sHpBarObjs); } static void ShowOrHideHpBarObjs(u8 invisible) { u32 i; for (i = 0; i < 9; i++) sHpBarObjs->sprites[i]->invisible = invisible; } static void CreateExpBarObjs(u16 tileTag, u16 palTag) { u32 i; u8 spriteId; void *gfxBufferPtr; sExpBarObjs = AllocZeroed(sizeof(struct ExpBarObjs)); gfxBufferPtr = AllocZeroed(0x20 * 12); LZ77UnCompWram(gSummaryScreen_ExpBar_Gfx, gfxBufferPtr); if (gfxBufferPtr != NULL) { struct SpriteSheet sheet = { .data = gfxBufferPtr, .size = 0x20 * 12, .tag = tileTag }; struct SpritePalette palette = {.data = gSummaryScreen_HpExpBar_Pal, .tag = palTag}; LoadSpriteSheet(&sheet); LoadSpritePalette(&palette); } for (i = 0; i < 11; i++) { struct SpriteTemplate template = { .tileTag = tileTag, .paletteTag = palTag, .oam = &sHpOrExpBarOamData, .anims = sHpOrExpBarAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; sExpBarObjs->xpos[i] = i * 8 + 156; spriteId = CreateSprite(&template, sExpBarObjs->xpos[i], 132, 0); sExpBarObjs->sprites[i] = &gSprites[spriteId]; sExpBarObjs->sprites[i]->oam.priority = 2; sExpBarObjs->tileTag = tileTag; sExpBarObjs->palTag = palTag; } UpdateExpBarObjs(); ShowOrHideExpBarObjs(TRUE); FREE_AND_SET_NULL_IF_SET(gfxBufferPtr); } static void UpdateExpBarObjs(void) { u8 numWholeExpBarTiles = 0; u32 i; u8 level; u32 exp; u32 totalExpToNextLevel; u32 curExpToNextLevel; u16 species; s64 pointsPerTile; s64 totalPoints; u8 animNum; u8 two = 2; if (sMonSummaryScreen->isEgg) return; exp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EXP); level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LEVEL); species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES); if (level < 100) { totalExpToNextLevel = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - gExperienceTables[gSpeciesInfo[species].growthRate][level]; curExpToNextLevel = exp - gExperienceTables[gSpeciesInfo[species].growthRate][level]; pointsPerTile = ((totalExpToNextLevel << 2) / 8); totalPoints = (curExpToNextLevel << 2); while (TRUE) { if (totalPoints <= pointsPerTile) break; totalPoints -= pointsPerTile; numWholeExpBarTiles++; } numWholeExpBarTiles += two; for (i = two; i < numWholeExpBarTiles; i++) StartSpriteAnim(sExpBarObjs->sprites[i], 8); if (numWholeExpBarTiles >= 10) { if (totalExpToNextLevel == curExpToNextLevel) return; else StartSpriteAnim(sExpBarObjs->sprites[9], 7); } animNum = (totalPoints * 8) / pointsPerTile; StartSpriteAnim(sExpBarObjs->sprites[numWholeExpBarTiles], animNum); for (i = numWholeExpBarTiles + 1; i < 10; i++) StartSpriteAnim(sExpBarObjs->sprites[i], 0); } else for (i = two; i < 10; i++) StartSpriteAnim(sExpBarObjs->sprites[i], 0); StartSpriteAnim(sExpBarObjs->sprites[0], 9); StartSpriteAnim(sExpBarObjs->sprites[1], 10); StartSpriteAnim(sExpBarObjs->sprites[10], 11); } static void DestroyExpBarObjs(void) { u32 i; for (i = 0; i < 11; i++) if (sExpBarObjs->sprites[i] != NULL) DestroySpriteAndFreeResources(sExpBarObjs->sprites[i]); FREE_AND_SET_NULL_IF_SET(sExpBarObjs); } static void ShowOrHideExpBarObjs(u8 invisible) { u32 i; for (i = 0; i < 11; i++) sExpBarObjs->sprites[i]->invisible = invisible; } static void CreatePokerusIconObj(u16 tileTag, u16 palTag) { u16 spriteId; void *gfxBufferPtr; sPokerusIconObj = AllocZeroed(sizeof(struct PokerusIconObj)); gfxBufferPtr = AllocZeroed(0x20 * 1); LZ77UnCompWram(sPokerusIconObjTiles, gfxBufferPtr); if (sPokerusIconObj != NULL) { struct SpriteSheet sheet = { .data = gfxBufferPtr, .size = 0x20 * 1, .tag = tileTag }; struct SpritePalette palette = {.data = sPokerusIconObjPal, .tag = palTag}; struct SpriteTemplate template = { .tileTag = tileTag, .paletteTag = palTag, .oam = &sPokerusIconObjOamData, .anims = sPokerusIconObjAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; LoadSpriteSheet(&sheet); LoadSpritePalette(&palette); spriteId = CreateSprite(&template, 114, 92, 0); sPokerusIconObj->sprite = &gSprites[spriteId]; sPokerusIconObj->tileTag = tileTag; sPokerusIconObj->palTag = palTag; } HideShowPokerusIcon(TRUE); ShowPokerusIconObjIfHasOrHadPokerus(); FREE_AND_SET_NULL_IF_SET(gfxBufferPtr); } static void DestroyPokerusIconObj(void) { if (sPokerusIconObj->sprite != NULL) DestroySpriteAndFreeResources(sPokerusIconObj->sprite); FREE_AND_SET_NULL_IF_SET(sPokerusIconObj); } static void ShowPokerusIconObjIfHasOrHadPokerus(void) { if (!CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0) && CheckPartyHasHadPokerus(&sMonSummaryScreen->currentMon, 0)) HideShowPokerusIcon(FALSE); else HideShowPokerusIcon(TRUE); } static void HideShowPokerusIcon(bool8 invisible) { if (!CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0) && CheckPartyHasHadPokerus(&sMonSummaryScreen->currentMon, 0)) { sPokerusIconObj->sprite->invisible = invisible; return; } else sPokerusIconObj->sprite->invisible = TRUE; if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO) { sPokerusIconObj->sprite->invisible = TRUE; sPokerusIconObj->sprite->x = 16; sPokerusIconObj->sprite->y = 44; } else { sPokerusIconObj->sprite->x = 114; sPokerusIconObj->sprite->y = 92; } } static void CreateShinyStarObj(u16 tileTag, u16 palTag) { u16 spriteId; void *gfxBufferPtr; sShinyStarObjData = AllocZeroed(sizeof(struct ShinyStarObjData)); gfxBufferPtr = AllocZeroed(0x20 * 2); LZ77UnCompWram(sStarObjTiles, gfxBufferPtr); if (sShinyStarObjData != NULL) { struct SpriteSheet sheet = { .data = gfxBufferPtr, .size = 0x20 * 2, .tag = tileTag }; struct SpritePalette palette = {.data = sStarObjPal, .tag = palTag}; struct SpriteTemplate template = { .tileTag = tileTag, .paletteTag = palTag, .oam = &sStarObjOamData, .anims = sStarObjAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; LoadSpriteSheet(&sheet); LoadSpritePalette(&palette); spriteId = CreateSprite(&template, 106, 40, 0); sShinyStarObjData->sprite = &gSprites[spriteId]; sShinyStarObjData->tileTag = tileTag; sShinyStarObjData->palTag = palTag; } HideShowShinyStar(TRUE); ShowShinyStarObjIfMonShiny(); FREE_AND_SET_NULL_IF_SET(gfxBufferPtr); } static void DestroyShinyStarObj(void) { if (sShinyStarObjData->sprite != NULL) DestroySpriteAndFreeResources(sShinyStarObjData->sprite); FREE_AND_SET_NULL_IF_SET(sShinyStarObjData); } static void HideShowShinyStar(bool8 invisible) { if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg) sShinyStarObjData->sprite->invisible = invisible; else sShinyStarObjData->sprite->invisible = TRUE; if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO) { sShinyStarObjData->sprite->x = 8; sShinyStarObjData->sprite->y = 24; } else { sShinyStarObjData->sprite->x = 106; sShinyStarObjData->sprite->y = 40; } } static void ShowShinyStarObjIfMonShiny(void) { if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg) HideShowShinyStar(FALSE); else HideShowShinyStar(TRUE); } static void PokeSum_DestroySprites(void) { DestroyMoveSelectionCursorObjs(); DestroyHpBarObjs(); DestroyExpBarObjs(); PokeSum_DestroyMonPicSprite(); PokeSum_DestroyMonIconSprite(); DestroyBallIconObj(); PokeSum_DestroyMonMarkingsSprite(); DestroyMonStatusIconObj(); DestroyPokerusIconObj(); DestroyShinyStarObj(); ResetSpriteData(); } static void PokeSum_CreateSprites(void) { CreateBallIconObj(); ShowOrHideBallIconObj(FALSE); PokeSum_CreateMonIconSprite(); PokeSum_CreateMonPicSprite(); PokeSum_ShowOrHideMonPicSprite(FALSE); UpdateHpBarObjs(); UpdateExpBarObjs(); PokeSum_UpdateMonMarkingsAnim(); UpdateMonStatusIconObj(); ShowPokerusIconObjIfHasOrHadPokerus(); ShowShinyStarObjIfMonShiny(); } static void PokeSum_CreateMonMarkingsSprite(void) { u32 markings = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MARKINGS); DestroySpriteAndFreeResources(sMonSummaryScreen->markingSprite); sMonSummaryScreen->markingSprite = CreateMonMarkingAllCombosSprite(TAG_PSS_UNK_8C, TAG_PSS_UNK_8C, sMonMarkingSpritePalette); if (sMonSummaryScreen->markingSprite != NULL) { StartSpriteAnim(sMonSummaryScreen->markingSprite, markings); sMonSummaryScreen->markingSprite->x = 20; sMonSummaryScreen->markingSprite->y = 91; } PokeSum_ShowOrHideMonMarkingsSprite(TRUE); } static void PokeSum_DestroyMonMarkingsSprite(void) { DestroySpriteAndFreeResources(sMonSummaryScreen->markingSprite); } static void PokeSum_ShowOrHideMonMarkingsSprite(u8 invisible) { u32 markings = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MARKINGS); if (markings == 0) sMonSummaryScreen->markingSprite->invisible = TRUE; else sMonSummaryScreen->markingSprite->invisible = invisible; } static void PokeSum_UpdateMonMarkingsAnim(void) { u32 markings = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MARKINGS); StartSpriteAnim(sMonSummaryScreen->markingSprite, markings); PokeSum_ShowOrHideMonMarkingsSprite(FALSE); } static void PokeSum_SeekToNextMon(u8 taskId, s8 direction) { s8 scrollResult = -1; if (sMonSummaryScreen->isBoxMon == TRUE) { if (sMonSummaryScreen->curPageIndex != PSS_PAGE_INFO) { if (direction == 1) direction = 0; else direction = 2; } else { // Allow Eggs if (direction == 1) direction = 1; else direction = 3; } scrollResult = SeekToNextMonInBox(sMonSummaryScreen->monList.boxMons, GetLastViewedMonIndex(), sMonSummaryScreen->lastIndex, (u8)direction); } else { if (IsUpdateLinkStateCBActive() == FALSE && gReceivedRemoteLinkPlayers == 1 && IsMultiBattle() == TRUE) scrollResult = SeekToNextMonInMultiParty(direction); else scrollResult = SeekToNextMonInSingleParty(direction); } if (scrollResult == -1) return; sLastViewedMonIndex = scrollResult; CreateTask(Task_PokeSum_SwitchDisplayedPokemon, 0); sMonSummaryScreen->switchMonTaskState = 0; } static s8 SeekToNextMonInSingleParty(s8 delta) { struct Pokemon * mon = sMonSummaryScreen->monList.mons; u8 index = sLastViewedMonIndex; u8 numMons = sMonSummaryScreen->lastIndex + 1; delta += numMons; index = (index + delta) % numMons; // skip over any Eggs unless on the Info Page if (sMonSummaryScreen->curPageIndex != PSS_PAGE_INFO) while (GetMonData(&mon[index], MON_DATA_IS_EGG)) index = (index + delta) % numMons; // to avoid "scrolling" to the same Pokemon if (index == sLastViewedMonIndex) return -1; else return index; } static u8 PokeSum_CanSeekToMon(struct Pokemon * partyMons) { if (GetMonData(partyMons, MON_DATA_SPECIES) != SPECIES_NONE && (sMonSummaryScreen->curPageIndex != PSS_PAGE_INFO || !GetMonData(partyMons, MON_DATA_IS_EGG))) return TRUE; return FALSE; } static s8 SeekToMonInMultiParty_SeekForward(u8 startingIdx) { while (TRUE) { startingIdx++; if (startingIdx == 6) return -1; if (PokeSum_CanSeekToMon(&gPlayerParty[sMultiBattlePartyOrder[startingIdx]]) == TRUE) break; } return (s8)sMultiBattlePartyOrder[startingIdx]; } static s8 SeekToMonInMultiParty_SeekBack(u8 startingIdx) { while (1) { if (startingIdx == 0) return -1; startingIdx--; if (PokeSum_CanSeekToMon(&gPlayerParty[sMultiBattlePartyOrder[startingIdx]]) == TRUE) break; } return (s8)(sMultiBattlePartyOrder[startingIdx]); } static s8 SeekToNextMonInMultiParty(s8 direction) { u8 foundPartyIdx = 0; u32 i; for (i = 0; i < PARTY_SIZE; i++) if (sMultiBattlePartyOrder[i] == GetLastViewedMonIndex()) { foundPartyIdx = i; break; } if ((direction == -1 && foundPartyIdx == 0) || (direction == 1 && foundPartyIdx == 5)) return -1; if (direction == 1) return SeekToMonInMultiParty_SeekForward(foundPartyIdx); else return SeekToMonInMultiParty_SeekBack(foundPartyIdx); } static void Task_PokeSum_SwitchDisplayedPokemon(u8 taskId) { switch (sMonSummaryScreen->switchMonTaskState) { case 0: StopCryAndClearCrySongs(); sMoveSelectionCursorPos = 0; sMoveSwapCursorPos = 0; sMonSummaryScreen->switchMonTaskState++; break; case 1: PokeSum_DestroyMonPicSprite(); PokeSum_DestroyMonIconSprite(); DestroyBallIconObj(); sMonSummaryScreen->switchMonTaskState++; break; case 2: BufferSelectedMonData(&sMonSummaryScreen->currentMon); sMonSummaryScreen->isEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG); sMonSummaryScreen->isBadEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SANITY_IS_BAD_EGG); if (sMonSummaryScreen->isBadEgg == TRUE) sMonSummaryScreen->isEgg = TRUE; sMonSummaryScreen->switchMonTaskState++; break; case 3: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg) { LoadPalette(&gSummaryScreen_Bg_Pal[16 * 6], BG_PLTT_ID(0), PLTT_SIZE_4BPP); LoadPalette(&gSummaryScreen_Bg_Pal[16 * 5], BG_PLTT_ID(1), PLTT_SIZE_4BPP); } else { LoadPalette(&gSummaryScreen_Bg_Pal[16 * 0], BG_PLTT_ID(0), PLTT_SIZE_4BPP); LoadPalette(&gSummaryScreen_Bg_Pal[16 * 1], BG_PLTT_ID(1), PLTT_SIZE_4BPP); } sMonSummaryScreen->switchMonTaskState++; break; case 4: if (sMonSummaryScreen->curPageIndex == PSS_PAGE_INFO) { if (sMonSummaryScreen->isEgg) { CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageEgg_Tilemap, 0, 0); CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0); } else { CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageInfo_Tilemap, 0, 0); CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0); } } sMonSummaryScreen->switchMonTaskState++; break; case 5: BufferMonInfo(); sMonSummaryScreen->switchMonTaskState++; break; case 6: if (!sMonSummaryScreen->isEgg) BufferMonSkills(); sMonSummaryScreen->switchMonTaskState++; break; case 7: if (!sMonSummaryScreen->isEgg) BufferMonMoves(); sMonSummaryScreen->switchMonTaskState++; break; case 8: PokeSum_PrintRightPaneText(); PokeSum_PrintBottomPaneText(); PokeSum_PrintAbilityDataOrMoveTypes(); sMonSummaryScreen->switchMonTaskState++; break; case 9: PokeSum_PrintMonTypeIcons(); PokeSum_DrawPageProgressTiles(); PokeSum_PrintPageHeaderText(sMonSummaryScreen->curPageIndex); sMonSummaryScreen->switchMonTaskState++; break; case 10: CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2); CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); sMonSummaryScreen->switchMonTaskState++; break; case 11: if (!Overworld_LinkRecvQueueLengthMoreThan2() && !IsLinkRecvQueueAtOverworldMax()) { PokeSum_CreateSprites(); PokeSum_TryPlayMonCry(); sMonSummaryScreen->switchMonTaskState++; } break; default: sMonSummaryScreen->switchMonTaskState = 0; DestroyTask(taskId); break; } } static void PokeSum_UpdateWin1ActiveFlag(u8 curPageIndex) { ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); switch (curPageIndex) { case PSS_PAGE_INFO: case PSS_PAGE_SKILLS: case PSS_PAGE_MOVES: SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | DISPCNT_WIN1_ON); break; default: break; } } static void PokeSum_TryPlayMonCry(void) { if (!GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG)) { if (ShouldPlayNormalMonCry(&sMonSummaryScreen->currentMon) == TRUE) PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG), 0, CRY_MODE_NORMAL); else PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG), 0, CRY_MODE_WEAK); } } static bool32 PokeSum_IsMonBoldOrGentle(u8 nature) { if (nature == NATURE_BOLD || nature == NATURE_GENTLE) return TRUE; return FALSE; } static bool32 CurrentMonIsFromGBA(void) { u8 version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME); if (version == VERSION_LEAF_GREEN || version == VERSION_FIRE_RED || version == VERSION_RUBY || version == VERSION_SAPPHIRE || version == VERSION_EMERALD || version == VERSION_GAMECUBE) return TRUE; return FALSE; } static bool32 MapSecIsInKantoOrSevii(u8 mapSec) { if (mapSec < MAPSEC_NONE) return TRUE; if (IsMonFromOrre()) return TRUE; return FALSE; } // Unused static void ShowPokemonSummaryScreen_NullParty(void) { ShowPokemonSummaryScreen(NULL, 0, 0, CB2_ReturnToField, PSS_MODE_NORMAL); } u8 GetHiddenPowerType(struct Pokemon * mon) { u8 typeBits = ((GetMonData(mon, MON_DATA_HP_IV) & 1) << 0) | ((GetMonData(mon, MON_DATA_ATK_IV) & 1) << 1) | ((GetMonData(mon, MON_DATA_DEF_IV) & 1) << 2) | ((GetMonData(mon, MON_DATA_SPEED_IV) & 1) << 3) | ((GetMonData(mon, MON_DATA_SPATK_IV) & 1) << 4) | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5); u8 type = (15 * typeBits) / 63 + 1; if (type >= TYPE_MYSTERY) type++; type |= 0xC0; return(type & 0x3F); } u8 GetWeatherBallType(void) { if (gMain.inBattle) { if (gBattleWeather & B_WEATHER_RAIN) return TYPE_WATER; else if (gBattleWeather & B_WEATHER_SANDSTORM) return TYPE_ROCK; else if (gBattleWeather & B_WEATHER_SUN) return TYPE_FIRE; else if (gBattleWeather & B_WEATHER_HAIL) return TYPE_ICE; else return TYPE_NORMAL; } else { switch (gWeatherPtr->currWeather) { case WEATHER_RAIN: case WEATHER_RAIN_THUNDERSTORM: case WEATHER_DOWNPOUR: return TYPE_WATER; case WEATHER_SANDSTORM: return TYPE_ROCK; case WEATHER_DROUGHT: return TYPE_FIRE; //case WEATHER_SNOW: // return TYPE_ICE; default: return TYPE_NORMAL; } } } ================================================ FILE: src/post_battle_event_funcs.c ================================================ #include "global.h" #include "script_pokemon_util.h" #include "event_data.h" #include "credits.h" #include "overworld.h" #include "hall_of_fame.h" #include "load_save.h" #include "constants/heal_locations.h" bool8 EnterHallOfFame(void) { bool8 ribbonState; bool8 *r7; int i; bool8 gaveAtLeastOneRibbon; HealPlayerParty(); if (FlagGet(FLAG_SYS_GAME_CLEAR) == TRUE) { gHasHallOfFameRecords = TRUE; } else { gHasHallOfFameRecords = FALSE; FlagSet(FLAG_SYS_GAME_CLEAR); } if (GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME) == 0) { SetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME, (gSaveBlock2Ptr->playTimeHours << 16) | (gSaveBlock2Ptr->playTimeMinutes << 8) | gSaveBlock2Ptr->playTimeSeconds); } SetContinueGameWarpStatus(); SetContinueGameWarpToHealLocation(SPAWN_PALLET_TOWN); gaveAtLeastOneRibbon = FALSE; for (i = 0, r7 = &ribbonState; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG)) { if (!GetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON)) { *r7 = TRUE; SetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON, &ribbonState); gaveAtLeastOneRibbon = TRUE; } } } if (gaveAtLeastOneRibbon == TRUE) { IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); FlagSet(FLAG_SYS_RIBBON_GET); } SetMainCallback2(CB2_DoHallOfFameScreen); return FALSE; } bool8 SetCB2WhiteOut(void) { SetMainCallback2(CB2_WhiteOut); return FALSE; } ================================================ FILE: src/prof_pc.c ================================================ #include "global.h" #include "event_data.h" #include "pokedex.h" #include "field_message_box.h" extern const u8 PokedexRating_Text_LessThan10[]; extern const u8 PokedexRating_Text_LessThan20[]; extern const u8 PokedexRating_Text_LessThan30[]; extern const u8 PokedexRating_Text_LessThan40[]; extern const u8 PokedexRating_Text_LessThan50[]; extern const u8 PokedexRating_Text_LessThan60[]; extern const u8 PokedexRating_Text_LessThan70[]; extern const u8 PokedexRating_Text_LessThan80[]; extern const u8 PokedexRating_Text_LessThan90[]; extern const u8 PokedexRating_Text_LessThan100[]; extern const u8 PokedexRating_Text_LessThan110[]; extern const u8 PokedexRating_Text_LessThan120[]; extern const u8 PokedexRating_Text_LessThan130[]; extern const u8 PokedexRating_Text_LessThan140[]; extern const u8 PokedexRating_Text_LessThan150[]; extern const u8 PokedexRating_Text_Complete[]; u16 GetPokedexCount(void) { if (gSpecialVar_0x8004 == 0) { gSpecialVar_0x8005 = GetKantoPokedexCount(0); gSpecialVar_0x8006 = GetKantoPokedexCount(1); } else { gSpecialVar_0x8005 = GetNationalPokedexCount(0); gSpecialVar_0x8006 = GetNationalPokedexCount(1); } return IsNationalPokedexEnabled(); } static const u8 *GetProfOaksRatingMessageByCount(u16 count) { gSpecialVar_Result = FALSE; if (count < 10) return PokedexRating_Text_LessThan10; if (count < 20) return PokedexRating_Text_LessThan20; if (count < 30) return PokedexRating_Text_LessThan30; if (count < 40) return PokedexRating_Text_LessThan40; if (count < 50) return PokedexRating_Text_LessThan50; if (count < 60) return PokedexRating_Text_LessThan60; if (count < 70) return PokedexRating_Text_LessThan70; if (count < 80) return PokedexRating_Text_LessThan80; if (count < 90) return PokedexRating_Text_LessThan90; if (count < 100) return PokedexRating_Text_LessThan100; if (count < 110) return PokedexRating_Text_LessThan110; if (count < 120) return PokedexRating_Text_LessThan120; if (count < 130) return PokedexRating_Text_LessThan130; if (count < 140) return PokedexRating_Text_LessThan140; if (count < 150) return PokedexRating_Text_LessThan150; if (count == KANTO_DEX_COUNT - 1) { // Mew doesn't count for completing the pokedex if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_MEW), 1)) return PokedexRating_Text_LessThan150; gSpecialVar_Result = TRUE; return PokedexRating_Text_Complete; } if (count == KANTO_DEX_COUNT) { gSpecialVar_Result = TRUE; return PokedexRating_Text_Complete; } return PokedexRating_Text_LessThan10; } void GetProfOaksRatingMessage(void) { ShowFieldMessage(GetProfOaksRatingMessageByCount(gSpecialVar_0x8004)); } ================================================ FILE: src/quest_log.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "menu.h" #include "menu_helpers.h" #include "text_window.h" #include "event_data.h" #include "script.h" #include "overworld.h" #include "field_fadetransition.h" #include "field_weather.h" #include "event_object_movement.h" #include "event_object_lock.h" #include "field_player_avatar.h" #include "item.h" #include "region_map.h" #include "map_name_popup.h" #include "wild_encounter.h" #include "help_system.h" #include "pokemon_storage_system.h" #include "save.h" #include "quest_log_objects.h" #include "quest_log_player.h" #include "quest_log.h" #include "new_menu_helpers.h" #include "strings.h" #include "constants/event_objects.h" #include "constants/layouts.h" #include "constants/maps.h" #include "constants/quest_log.h" #include "constants/field_weather.h" #include "constants/event_object_movement.h" enum { WIN_TOP_BAR, // Contains the "Previously on..." text WIN_BOTTOM_BAR, // Empty, only briefly visible at the end or when the description window isn't covering it. WIN_DESCRIPTION, WIN_COUNT }; #define DESC_WIN_WIDTH (DISPLAY_WIDTH / 8) #define DESC_WIN_HEIGHT 6 #define DESC_WIN_SIZE (DESC_WIN_WIDTH * DESC_WIN_HEIGHT * TILE_SIZE_4BPP) // sQuestLogActionRecordBuffer should be large enough to fill a scene's script with the maximum number of actions #define SCRIPT_BUFFER_SIZE (sizeof(gSaveBlock1Ptr->questLog[0].script) / sizeof(struct QuestLogAction)) enum { END_MODE_NONE, END_MODE_FINISH, END_MODE_SCENE, }; struct PlaybackControl { u8 state:4; u8 playingEvent:2; u8 endMode:2; u8 cursor; u8 timer; u8 overlapTimer; }; struct FlagOrVarRecord { u16 idx:15; u16 isFlag:1; u16 value; }; u8 gQuestLogPlaybackState; u16 sMaxActionsInScene; struct FieldInput gQuestLogFieldInput; struct QuestLogAction * sCurSceneActions; static struct FlagOrVarRecord * sFlagOrVarRecords; static u16 sNumFlagsOrVars; static EWRAM_DATA u8 sCurrentSceneNum = 0; static EWRAM_DATA u8 sNumScenes = 0; EWRAM_DATA u8 gQuestLogState = 0; static EWRAM_DATA u16 sRecordSequenceStartIdx = 0; static EWRAM_DATA u8 sWindowIds[WIN_COUNT] = {0}; EWRAM_DATA u16 *gQuestLogDefeatedWildMonRecord = NULL; EWRAM_DATA u16 *gQuestLogRecordingPointer = NULL; static EWRAM_DATA u16 *sEventData[32] = {NULL}; static EWRAM_DATA void (* sQuestLogCB)(void) = NULL; static EWRAM_DATA u16 *sPalettesBackup = NULL; static EWRAM_DATA struct PlaybackControl sPlaybackControl = {0}; static EWRAM_DATA struct QuestLogAction sQuestLogActionRecordBuffer[SCRIPT_BUFFER_SIZE] = {0}; EWRAM_DATA u16 gQuestLogCurActionIdx = 0; static EWRAM_DATA u8 sMovementScripts[OBJECT_EVENT_TEMPLATES_COUNT][2] = {{0}}; static EWRAM_DATA u16 sNextActionDelay = 0; static EWRAM_DATA u16 sLastQuestLogCursor = 0; static EWRAM_DATA u16 sFlagOrVarPlayhead = 0; static void QLogCB_Recording(void); static void QLogCB_Playback(void); static void SetPlayerInitialCoordsAtScene(u8); static void SetNPCInitialCoordsAtScene(u8); static void RecordSceneEnd(void); static void BackUpTrainerRematches(void); static void BackUpMapLayout(void); static void SetGameStateAtScene(u8); static u8 TryRecordActionSequence(struct QuestLogAction *); static void Task_BeginQuestLogPlayback(u8); static void QL_LoadObjectsAndTemplates(u8); static void QLPlayback_InitOverworldState(void); static void SetPokemonCounts(void); static u16 QuestLog_GetPartyCount(void); static u16 QuestLog_GetBoxMonCount(void); static void RestoreTrainerRematches(void); static void ReadQuestLogScriptFromSav1(u8, struct QuestLogAction *); static void DoSceneEndTransition(s8 delay); static void DoSkipToEndTransition(s8 delay); static void QuestLog_AdvancePlayhead(void); static void QuestLog_StartFinalScene(void); static void Task_AvoidDisplay(u8); static void QuestLog_PlayCurrentEvent(void); static void HandleShowQuestLogMessage(void); static u8 GetQuestLogTextDisplayDuration(void); static void DrawSceneDescription(void); static void CopyDescriptionWindowTiles(u8); static void QuestLog_CloseTextWindow(void); static void QuestLog_WaitFadeAndCancelPlayback(void); static bool8 FieldCB2_FinalScene(void); static void Task_FinalScene_WaitFade(u8); static void Task_QuestLogScene_SavedGame(u8); static void Task_WaitAtEndOfQuestLog(u8); static void Task_EndQuestLog(u8); static bool8 RestoreScreenAfterPlayback(u8); static void QL_SlightlyDarkenSomePals(void); static void TogglePlaybackStateForOverworldLock(u8); static void ResetActions(u8, struct QuestLogAction *, u16); static bool8 RecordHeadAtEndOfEntryOrScriptContext2Enabled(void); static bool8 RecordHeadAtEndOfEntry(void); static bool8 InQuestLogDisabledLocation(void); static bool8 TrySetLinkQuestLogEvent(u16, const u16 *); static bool8 TrySetTrainerBattleQuestLogEvent(u16, const u16 *); static const struct WindowTemplate sWindowTemplates[WIN_COUNT] = { [WIN_TOP_BAR] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 2, .paletteNum = 15, .baseBlock = 0x0e9 }, [WIN_BOTTOM_BAR] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 18, .width = 30, .height = 2, .paletteNum = 15, .baseBlock = 0x0ad }, [WIN_DESCRIPTION] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 14, .width = DESC_WIN_WIDTH, .height = DESC_WIN_HEIGHT, .paletteNum = 15, .baseBlock = 0x14c } }; static const u8 sTextColors[3] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_3}; static const u16 sDescriptionWindow_Gfx[] = INCBIN_U16("graphics/quest_log/description_window.4bpp"); static const u8 sQuestLogTextLineYCoords[] = {17, 10, 3}; void QL_AddASLROffset(void *oldSaveBlockPtr) { // For some reason the caller passes the original pointer and the // amount the save moved is recalculated, instead of just passing // the offset to begin with. ptrdiff_t offset = (void *)gSaveBlock1Ptr - oldSaveBlockPtr; if (gQuestLogDefeatedWildMonRecord) gQuestLogDefeatedWildMonRecord = (void *)gQuestLogDefeatedWildMonRecord + offset; if (gQuestLogState == 0) return; if (gQuestLogRecordingPointer) gQuestLogRecordingPointer = (void *)gQuestLogRecordingPointer + offset; if (gQuestLogState == QL_STATE_PLAYBACK) { int i; for (i = 0; i < (int)ARRAY_COUNT(sEventData); i++) if (sEventData[i]) sEventData[i] = (void *)sEventData[i] + offset; } } void ResetQuestLog(void) { memset(gSaveBlock1Ptr->questLog, 0, sizeof(gSaveBlock1Ptr->questLog)); sCurrentSceneNum = 0; gQuestLogState = 0; sQuestLogCB = NULL; gQuestLogRecordingPointer = NULL; gQuestLogDefeatedWildMonRecord = NULL; QL_ResetEventStates(); ResetDeferredLinkEvent(); } static void ClearSavedScene(u8 sceneNum) { memset(&gSaveBlock1Ptr->questLog[sceneNum], 0, sizeof(gSaveBlock1Ptr->questLog[sceneNum])); gQuestLogDefeatedWildMonRecord = NULL; } void QL_ResetDefeatedWildMonRecord(void) { gQuestLogDefeatedWildMonRecord = NULL; } void RunQuestLogCB(void) { if (sQuestLogCB != NULL) sQuestLogCB(); } bool8 QL_IsRoomToSaveEvent(const void * cursor, size_t size) { const void *start = gSaveBlock1Ptr->questLog[sCurrentSceneNum].script; const void *end = gSaveBlock1Ptr->questLog[sCurrentSceneNum].end; end -= size; if (cursor < start || cursor > end) return FALSE; return TRUE; } // Identical to QL_IsRoomToSaveEvent bool8 QL_IsRoomToSaveAction(const void * cursor, size_t size) { const void *start = gSaveBlock1Ptr->questLog[sCurrentSceneNum].script; const void *end = gSaveBlock1Ptr->questLog[sCurrentSceneNum].end; end -= size; if (cursor < start || cursor > end) return FALSE; return TRUE; } static void SetQuestLogState(u8 state) { gQuestLogState = state; if (state == QL_STATE_RECORDING) sQuestLogCB = QLogCB_Recording; else sQuestLogCB = QLogCB_Playback; } static void QLogCB_Recording(void) { if (TryRecordActionSequence(sQuestLogActionRecordBuffer) != 1) { gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; RecordSceneEnd(); gQuestLogState = 0; sQuestLogCB = NULL; } } static void QLogCB_Playback(void) { if (sPlaybackControl.state == 2) sPlaybackControl.state = 0; if (sPlaybackControl.endMode == END_MODE_NONE) { if (gQuestLogPlaybackState != QL_PLAYBACK_STATE_STOPPED || sPlaybackControl.state == 1 || (sPlaybackControl.cursor < ARRAY_COUNT(sEventData) && sEventData[sPlaybackControl.cursor] != NULL)) QuestLog_PlayCurrentEvent(); else { sPlaybackControl.endMode = END_MODE_SCENE; LockPlayerFieldControls(); DoSceneEndTransition(0); } } } void GetQuestLogState(void) { gSpecialVar_Result = gQuestLogState; } u8 GetQuestLogStartType(void) { return gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType; } void QL_StartRecordingAction(u16 eventId) { if (eventId == QL_EVENT_DEPARTED && gMapHeader.mapLayoutId == LAYOUT_PALLET_TOWN && VarGet(VAR_MAP_SCENE_PALLET_TOWN_OAK) == 3) return; //Don't record departing from Oak's Lab if Master Trainer speech is pending. if (sCurrentSceneNum >= QUEST_LOG_SCENE_COUNT) sCurrentSceneNum = 0; ClearSavedScene(sCurrentSceneNum); QL_ResetRepeatEventTracker(); gQuestLogRecordingPointer = gSaveBlock1Ptr->questLog[sCurrentSceneNum].script; if (IS_LINK_QL_EVENT(eventId) || eventId == QL_EVENT_DEPARTED) gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType = QL_START_WARP; else gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType = QL_START_NORMAL; SetPokemonCounts(); SetPlayerInitialCoordsAtScene(sCurrentSceneNum); SetNPCInitialCoordsAtScene(sCurrentSceneNum); BackUpTrainerRematches(); BackUpMapLayout(); SetGameStateAtScene(sCurrentSceneNum); sRecordSequenceStartIdx = 0; ResetActions(QL_PLAYBACK_STATE_RECORDING, sQuestLogActionRecordBuffer, sizeof(sQuestLogActionRecordBuffer)); TryRecordActionSequence(sQuestLogActionRecordBuffer); SetQuestLogState(QL_STATE_RECORDING); } static void SetPlayerInitialCoordsAtScene(u8 sceneNum) { struct QuestLogScene * questLog = &gSaveBlock1Ptr->questLog[sceneNum]; questLog->mapGroup = gSaveBlock1Ptr->location.mapGroup; questLog->mapNum = gSaveBlock1Ptr->location.mapNum; questLog->warpId = gSaveBlock1Ptr->location.warpId; questLog->x = gSaveBlock1Ptr->pos.x; questLog->y = gSaveBlock1Ptr->pos.y; } static void SetNPCInitialCoordsAtScene(u8 sceneNum) { struct QuestLogScene * questLog = &gSaveBlock1Ptr->questLog[sceneNum]; u32 i; QL_RecordObjects(questLog); for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) { if (gSaveBlock1Ptr->objectEventTemplates[i].x < 0) { questLog->objectEventTemplates[i].x = -1 * gSaveBlock1Ptr->objectEventTemplates[i].x; questLog->objectEventTemplates[i].negx = TRUE; } else { questLog->objectEventTemplates[i].x = (u8)gSaveBlock1Ptr->objectEventTemplates[i].x; questLog->objectEventTemplates[i].negx = FALSE; } if (gSaveBlock1Ptr->objectEventTemplates[i].y < 0) { questLog->objectEventTemplates[i].y = (-gSaveBlock1Ptr->objectEventTemplates[i].y << 24) >> 24; questLog->objectEventTemplates[i].negy = TRUE; } else { questLog->objectEventTemplates[i].y = (u8)gSaveBlock1Ptr->objectEventTemplates[i].y; questLog->objectEventTemplates[i].negy = FALSE; } questLog->objectEventTemplates[i].elevation = gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.elevation; questLog->objectEventTemplates[i].movementType = gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.movementType; } } static void SetGameStateAtScene(u8 sceneNum) { struct QuestLogScene * questLog = &gSaveBlock1Ptr->questLog[sceneNum]; CpuCopy16(gSaveBlock1Ptr->flags, questLog->flags, sizeof(gSaveBlock1Ptr->flags)); CpuCopy16(gSaveBlock1Ptr->vars, questLog->vars, sizeof(gSaveBlock1Ptr->vars)); } static void BackUpTrainerRematches(void) { u16 i, j; u16 vars[4]; // Save the contents of gSaveBlock1Ptr->trainerRematches to the 4 saveblock // vars starting at VAR_QLBAK_TRAINER_REMATCHES. The rematch array is 100 bytes // long, but each byte is only ever 0 or 1 to indicate that a rematch is available. // They're compressed into single bits across 4 u16 save vars, which is only enough // to save 64 elements of gSaveBlock1Ptr->trainerRematches. 64 however is the maximum // that could ever be used, as its the maximum number of NPCs per map (OBJECT_EVENT_TEMPLATES_COUNT). for (i = 0; i < ARRAY_COUNT(vars); i++) { vars[i] = 0; // 16 bits per var for (j = 0; j < 16; j++) { if (gSaveBlock1Ptr->trainerRematches[16 * i + j]) vars[i] += (1 << j); } VarSet(VAR_QLBAK_TRAINER_REMATCHES + i, vars[i]); } } static void BackUpMapLayout(void) { VarSet(VAR_QLBAK_MAP_LAYOUT, gSaveBlock1Ptr->mapLayoutId); } static void RecordSceneEnd(void) { QL_RecordAction_SceneEnd(gQuestLogRecordingPointer); if (++sCurrentSceneNum >= QUEST_LOG_SCENE_COUNT) sCurrentSceneNum = 0; } static bool8 TryRecordActionSequence(struct QuestLogAction * actions) { u32 i; for (i = sRecordSequenceStartIdx; i < gQuestLogCurActionIdx; i++) { if (gQuestLogRecordingPointer == NULL) return FALSE; switch (actions[i].type) { case QL_ACTION_MOVEMENT: case QL_ACTION_GFX_CHANGE: gQuestLogRecordingPointer = QL_RecordAction_MovementOrGfxChange(gQuestLogRecordingPointer, &actions[i]); break; default: gQuestLogRecordingPointer = QL_RecordAction_Input(gQuestLogRecordingPointer, &actions[i]); break; } if (gQuestLogRecordingPointer == NULL) { gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; return FALSE; } } if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED) { gQuestLogRecordingPointer = QL_RecordAction_SceneEnd(gQuestLogRecordingPointer); return FALSE; } sRecordSequenceStartIdx = gQuestLogCurActionIdx; return TRUE; } void TryStartQuestLogPlayback(u8 taskId) { u32 i; QL_EnableRecordingSteps(); sNumScenes = 0; for (i = 0; i < QUEST_LOG_SCENE_COUNT; i++) { if (gSaveBlock1Ptr->questLog[i].startType != 0) sNumScenes++; } if (sNumScenes != 0) { gHelpSystemEnabled = FALSE; Task_BeginQuestLogPlayback(taskId); DestroyTask(taskId); } else { SetMainCallback2(CB2_ContinueSavedGame); DestroyTask(taskId); } } static void Task_BeginQuestLogPlayback(u8 taskId) { gSaveBlock1Ptr->location.mapGroup = MAP_GROUP(ROUTE1); gSaveBlock1Ptr->location.mapNum = MAP_NUM(ROUTE1); gSaveBlock1Ptr->location.warpId = WARP_ID_NONE; sCurrentSceneNum = 0; gDisableMapMusicChangeOnMapLoad = 1; DisableWildEncounters(TRUE); QLPlayback_InitOverworldState(); } void QL_InitSceneObjectsAndActions(void) { ReadQuestLogScriptFromSav1(sCurrentSceneNum, sQuestLogActionRecordBuffer); QL_ResetRepeatEventTracker(); ResetActions(QL_PLAYBACK_STATE_RUNNING, sQuestLogActionRecordBuffer, sizeof(sQuestLogActionRecordBuffer)); QL_LoadObjectsAndTemplates(sCurrentSceneNum); } static bool8 FieldCB2_QuestLogStartPlaybackWithWarpExit(void) { LoadPalette(GetTextWindowPalette(4), BG_PLTT_ID(15), PLTT_SIZE_4BPP); SetQuestLogState(QL_STATE_PLAYBACK); FieldCB_DefaultWarpExit(); sPlaybackControl = (struct PlaybackControl){}; sPlaybackControl.state = 2; return 1; } static bool8 FieldCB2_QuestLogStartPlaybackStandingInPlace(void) { LoadPalette(GetTextWindowPalette(4), BG_PLTT_ID(15), PLTT_SIZE_4BPP); SetQuestLogState(QL_STATE_PLAYBACK); FieldCB_WarpExitFadeFromBlack(); sPlaybackControl = (struct PlaybackControl){}; sPlaybackControl.state = 2; return 1; } void DrawPreviouslyOnQuestHeader(u8 sceneNum) { u32 i; for (i = 0; i < WIN_COUNT; i++) { sWindowIds[i] = AddWindow(&sWindowTemplates[i]); FillWindowPixelRect(sWindowIds[i], 15, 0, 0, sWindowTemplates[i].width * 8, sWindowTemplates[i].height * 8); } StringExpandPlaceholders(gStringVar4, gText_QuestLog_PreviouslyOnYourQuest); // Scene numbers count from 4 to 0, 0 being where the player saved if (sceneNum != 0) { ConvertIntToDecimalStringN(gStringVar1, sceneNum, STR_CONV_MODE_LEFT_ALIGN, 1); StringAppend(gStringVar4, gStringVar1); } AddTextPrinterParameterized4(sWindowIds[WIN_TOP_BAR], FONT_NORMAL, 2, 2, 1, 2, sTextColors, 0, gStringVar4); PutWindowTilemap(sWindowIds[WIN_TOP_BAR]); PutWindowTilemap(sWindowIds[WIN_BOTTOM_BAR]); CopyWindowToVram(sWindowIds[WIN_TOP_BAR], COPYWIN_GFX); CopyWindowToVram(sWindowIds[WIN_DESCRIPTION], COPYWIN_GFX); CopyWindowToVram(sWindowIds[WIN_BOTTOM_BAR], COPYWIN_FULL); } void CommitQuestLogWindow1(void) { PutWindowTilemap(sWindowIds[WIN_BOTTOM_BAR]); CopyWindowToVram(sWindowIds[WIN_BOTTOM_BAR], COPYWIN_MAP); } static void QL_LoadObjectsAndTemplates(u8 sceneNum) { struct QuestLogScene *questLog = &gSaveBlock1Ptr->questLog[sceneNum]; u32 i; for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) { if (questLog->objectEventTemplates[i].negx) gSaveBlock1Ptr->objectEventTemplates[i].x = -questLog->objectEventTemplates[i].x; else gSaveBlock1Ptr->objectEventTemplates[i].x = questLog->objectEventTemplates[i].x; if (questLog->objectEventTemplates[i].negy) gSaveBlock1Ptr->objectEventTemplates[i].y = -(u8)questLog->objectEventTemplates[i].y; else gSaveBlock1Ptr->objectEventTemplates[i].y = questLog->objectEventTemplates[i].y; gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.elevation = questLog->objectEventTemplates[i].elevation; gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.movementType = questLog->objectEventTemplates[i].movementType; } QL_LoadObjects(questLog, gSaveBlock1Ptr->objectEventTemplates); } static void QLPlayback_SetInitialPlayerPosition(u8 sceneNum, bool8 isWarp) { if (!isWarp) { gSaveBlock1Ptr->location.mapGroup = gSaveBlock1Ptr->questLog[sceneNum].mapGroup; gSaveBlock1Ptr->location.mapNum = gSaveBlock1Ptr->questLog[sceneNum].mapNum; gSaveBlock1Ptr->location.warpId = gSaveBlock1Ptr->questLog[sceneNum].warpId; gSaveBlock1Ptr->pos.x = gSaveBlock1Ptr->questLog[sceneNum].x; gSaveBlock1Ptr->pos.y = gSaveBlock1Ptr->questLog[sceneNum].y; } else { struct WarpData warp; warp.mapGroup = gSaveBlock1Ptr->questLog[sceneNum].mapGroup; warp.mapNum = gSaveBlock1Ptr->questLog[sceneNum].mapNum; warp.warpId = gSaveBlock1Ptr->questLog[sceneNum].warpId; warp.x = gSaveBlock1Ptr->questLog[sceneNum].x; warp.y = gSaveBlock1Ptr->questLog[sceneNum].y; Overworld_SetWarpDestinationFromWarp(&warp); } } static void QLPlayback_InitOverworldState(void) { gQuestLogState = QL_STATE_PLAYBACK; ResetSpecialVars(); ClearBag(); ClearPCItemSlots(); if (GetQuestLogStartType() == QL_START_NORMAL) { QLPlayback_SetInitialPlayerPosition(sCurrentSceneNum, FALSE); gFieldCallback2 = FieldCB2_QuestLogStartPlaybackStandingInPlace; SetMainCallback2(CB2_SetUpOverworldForQLPlayback); } else { QLPlayback_SetInitialPlayerPosition(sCurrentSceneNum, TRUE); WarpIntoMap(); gFieldCallback2 = FieldCB2_QuestLogStartPlaybackWithWarpExit; SetMainCallback2(CB2_SetUpOverworldForQLPlaybackWithWarpExit); } } void QL_CopySaveState(void) { struct QuestLogScene * questLog = &gSaveBlock1Ptr->questLog[sCurrentSceneNum]; CpuCopy16(questLog->flags, gSaveBlock1Ptr->flags, sizeof(gSaveBlock1Ptr->flags)); CpuCopy16(questLog->vars, gSaveBlock1Ptr->vars, sizeof(gSaveBlock1Ptr->vars)); RestoreTrainerRematches(); } // The number of bits allocated to store the number of pokemon in the PC #define NUM_PC_COUNT_BITS 12 void QL_ResetPartyAndPC(void) { struct { struct Pokemon mon; u16 partyCount; u16 boxMonCount; } *prev = AllocZeroed(sizeof(*prev)); u16 packedCounts, i, count, j; CreateMon(&prev->mon, SPECIES_RATTATA, 1, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); packedCounts = VarGet(VAR_QUEST_LOG_MON_COUNTS); prev->partyCount = packedCounts >> NUM_PC_COUNT_BITS; prev->boxMonCount = packedCounts % (1 << NUM_PC_COUNT_BITS); count = QuestLog_GetPartyCount(); if (count > prev->partyCount) { for (i = 0; i < count - prev->partyCount; i++) ZeroMonData(&gPlayerParty[PARTY_SIZE - 1 - i]); } else if (count < prev->partyCount) { // Clear 5 slots in the PC? for (i = 0; i < PARTY_SIZE - 1; i++) ZeroBoxMonAt(0, i); // Replace the additional slots with placeholder Pokémon. for (i = count; i < prev->partyCount; i++) CopyMon(&gPlayerParty[i], &prev->mon, sizeof(struct Pokemon)); } count = QuestLog_GetBoxMonCount(); if (count > prev->boxMonCount) { for (i = 0; i < TOTAL_BOXES_COUNT; i++) { for (j = 0; j < IN_BOX_COUNT; j++) { if (GetBoxMonDataAt(i, j, MON_DATA_SANITY_HAS_SPECIES)) { ZeroBoxMonAt(i, j); if (--count == prev->boxMonCount) break; } } if (count == prev->boxMonCount) break; } } else if (count < prev->boxMonCount) { for (i = 0; i < TOTAL_BOXES_COUNT; i++) { for (j = 0; j < IN_BOX_COUNT; j++) { struct BoxPokemon * boxMon = GetBoxedMonPtr(i, j); if (!GetBoxMonData(boxMon, MON_DATA_SANITY_HAS_SPECIES)) { // Replace the additional slots with placeholder Pokémon. CopyMon(boxMon, &prev->mon.box, sizeof(struct BoxPokemon)); if (++count == prev->boxMonCount) break; } } if (count == prev->boxMonCount) break; } } Free(prev); } static void SetPokemonCounts(void) { u16 partyCount = QuestLog_GetPartyCount(); u16 boxesCount = QuestLog_GetBoxMonCount(); VarSet(VAR_QUEST_LOG_MON_COUNTS, (partyCount << NUM_PC_COUNT_BITS) + boxesCount); } static u16 QuestLog_GetPartyCount(void) { u16 count = 0; u32 i; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)) count++; } return count; } static u16 QuestLog_GetBoxMonCount(void) { u16 count = 0; u16 i, j; for (i = 0; i < TOTAL_BOXES_COUNT; i++) { for (j = 0; j < IN_BOX_COUNT; j++) { if (GetBoxMonDataAt(i, j, MON_DATA_SANITY_HAS_SPECIES)) count++; } } return count; } // Inverse of BackUpTrainerRematches static void RestoreTrainerRematches(void) { u16 i, j; u16 vars[4]; for (i = 0; i < ARRAY_COUNT(vars); i++) { vars[i] = VarGet(VAR_QLBAK_TRAINER_REMATCHES + i); // 16 bits per var for (j = 0; j < 16; j++) { if (vars[i] & 1) gSaveBlock1Ptr->trainerRematches[16 * i + j] = 30; else gSaveBlock1Ptr->trainerRematches[16 * i + j] = 0; vars[i] >>= 1; } } } // Inverse of BackUpMapLayout void QL_RestoreMapLayoutId(void) { gSaveBlock1Ptr->mapLayoutId = VarGet(VAR_QLBAK_MAP_LAYOUT); if (gSaveBlock1Ptr->mapLayoutId == 0) { struct MapHeader header = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); gSaveBlock1Ptr->mapLayoutId = header.mapLayoutId; } } static void ReadQuestLogScriptFromSav1(u8 sceneNum, struct QuestLogAction * actions) { u32 i; u16 *script; u16 actionNum = 0; u16 eventNum = 0; memset(actions, 0, ARRAY_COUNT(sEventData) * sizeof(struct QuestLogAction)); for (i = 0; i < ARRAY_COUNT(sEventData); i++) sEventData[i] = NULL; script = gSaveBlock1Ptr->questLog[sceneNum].script; for (i = 0; i < ARRAY_COUNT(sEventData); i++) { switch (script[0] & QL_CMD_EVENT_MASK) { case QL_EVENT_INPUT: script = QL_LoadAction_Input(script, &actions[actionNum]); actionNum++; break; case QL_EVENT_GFX_CHANGE: case QL_EVENT_MOVEMENT: script = QL_LoadAction_MovementOrGfxChange(script, &actions[actionNum]); actionNum++; break; case QL_EVENT_SCENE_END: script = QL_LoadAction_SceneEnd(script, &actions[actionNum]); actionNum++; break; case QL_EVENT_WAIT: script = QL_LoadAction_Wait(script, &actions[actionNum]); actionNum++; break; default: // Normal event script = QL_SkipCommand(script, &sEventData[eventNum]); if (eventNum == 0) QL_UpdateLastDepartedLocation(sEventData[0]); eventNum++; break; } if (script == NULL) break; } } static void DoSceneEndTransition(s8 delay) { FadeScreen(FADE_TO_BLACK, delay); sQuestLogCB = QuestLog_AdvancePlayhead; } static void QuestLog_AdvancePlayhead(void) { if (gPaletteFade.active) return; LockPlayerFieldControls(); if (++sCurrentSceneNum < QUEST_LOG_SCENE_COUNT && gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType != 0) { sNumScenes--; QLPlayback_InitOverworldState(); } else { gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; QuestLog_StartFinalScene(); } } static void QuestLog_StartFinalScene(void) { u32 i; u8 KeyVersionBackup = gSaveBlock1Ptr->keyFlags.version; u8 KeyDifficultyBackup = gSaveBlock1Ptr->keyFlags.difficulty; u8 KeyNuzlockeBackup = gSaveBlock1Ptr->keyFlags.nuzlocke; u8 KeyIvCalcBackup = gSaveBlock1Ptr->keyFlags.ivCalcMode; u8 KeyEvCalcBackup = gSaveBlock1Ptr->keyFlags.evCalcMode; u8 ChangedCalcBackup = gSaveBlock1Ptr->keyFlags.changedCalcMode; u8 noPMCBackup = gSaveBlock1Ptr->keyFlags.noPMC; u8 expModBackup = gSaveBlock1Ptr->keyFlags.expMod; ResetSpecialVars(); Save_ResetSaveCounters(); LoadGameSave(SAVE_NORMAL); gSaveBlock1Ptr->keyFlags.version = KeyVersionBackup; gSaveBlock1Ptr->keyFlags.difficulty = KeyDifficultyBackup; gSaveBlock1Ptr->keyFlags.nuzlocke = KeyNuzlockeBackup; gSaveBlock1Ptr->keyFlags.ivCalcMode = KeyIvCalcBackup; gSaveBlock1Ptr->keyFlags.evCalcMode = KeyEvCalcBackup; gSaveBlock1Ptr->keyFlags.noPMC = noPMCBackup; gSaveBlock1Ptr->keyFlags.expMod = expModBackup; gSaveBlock1Ptr->keyFlags.changedCalcMode = 0; //recalculate party stats for IV and EV keys if they were changed if(ChangedCalcBackup == 1) { for (i = 0; i < gPlayerPartyCount; i++) { CalculateMonStats(&gPlayerParty[i], FALSE); } } SetMainCallback2(CB2_EnterFieldFromQuestLog); gFieldCallback2 = FieldCB2_FinalScene; FreeAllWindowBuffers(); gQuestLogState = QL_STATE_PLAYBACK_LAST; sQuestLogCB = NULL; } void QuestLog_AdvancePlayhead_(void) { QuestLog_AdvancePlayhead(); } #define tTimer data[0] #define tState data[1] #define DATA_IDX_CALLBACK 14 // data[14] and data[15] // This is used to avoid recording or displaying certain windows or images, like a shop menu. // During playback it returns TRUE (meaning the action should be avoided) and calls the // provided callback, which would be used to e.g. destroy any resources that were set up to do // whatever is being avoided. In all cases the provided callback will be QL_DestroyAbortedDisplay. // If we are not currently in playback return FALSE (meaning allow the action to occur) and // stop recording (if we are currently). bool8 QL_AvoidDisplay(void (*callback)(void)) { u8 taskId; switch (gQuestLogState) { case QL_STATE_RECORDING: QuestLog_CutRecording(); break; case QL_STATE_PLAYBACK: gQuestLogPlaybackState = QL_PLAYBACK_STATE_ACTION_END; taskId = CreateTask(Task_AvoidDisplay, 80); gTasks[taskId].tTimer = 0; gTasks[taskId].tState = 0; SetWordTaskArg(taskId, DATA_IDX_CALLBACK, (uintptr_t)callback); return TRUE; } return FALSE; } static void Task_AvoidDisplay(u8 taskId) { void (*routine)(void); s16 *data = gTasks[taskId].data; switch (tState) { case 0: // Instead of displaying anything, wait and then end the scene. if (++tTimer == 127) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); sPlaybackControl.endMode = END_MODE_SCENE; tState++; } break; case 1: if (!gPaletteFade.active) { gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; // Call the provided function (if any). In practice this is always QL_DestroyAbortedDisplay routine = (void (*)(void)) GetWordTaskArg(taskId, DATA_IDX_CALLBACK); if (routine != NULL) routine(); DestroyTask(taskId); sQuestLogCB = QuestLog_AdvancePlayhead; } break; } } #undef tTimer #undef tState static void QuestLog_PlayCurrentEvent(void) { if (sPlaybackControl.state == 1) { if (--sPlaybackControl.timer != 0) return; sPlaybackControl.state = 0; sPlaybackControl.playingEvent = TRUE; TogglePlaybackStateForOverworldLock(2); } if (sPlaybackControl.playingEvent == TRUE) { if (++sPlaybackControl.overlapTimer > 15) { QuestLog_CloseTextWindow(); sPlaybackControl.playingEvent = FALSE; sPlaybackControl.overlapTimer = 0; } } if (sPlaybackControl.cursor < ARRAY_COUNT(sEventData)) { if (QL_TryRepeatEvent(sEventData[sPlaybackControl.cursor]) == TRUE) HandleShowQuestLogMessage(); else if (QL_LoadEvent(sEventData[sPlaybackControl.cursor]) == TRUE) HandleShowQuestLogMessage(); } } static void HandleShowQuestLogMessage(void) { if (sPlaybackControl.state == 0) { sPlaybackControl.state = 1; sPlaybackControl.playingEvent = FALSE; sPlaybackControl.overlapTimer = 0; sPlaybackControl.timer = GetQuestLogTextDisplayDuration(); if (gQuestLogRepeatEventTracker.counter == 0) sPlaybackControl.cursor++; if (sPlaybackControl.cursor > ARRAY_COUNT(sEventData)) return; DrawSceneDescription(); } TogglePlaybackStateForOverworldLock(1); // lock } static u8 GetQuestLogTextDisplayDuration(void) { u32 i; u16 count = 0; for (i = 0; i < 0x400 && gStringVar4[i] != EOS; i++) { if (gStringVar4[i] != CHAR_NEWLINE) count++; } if (count < 20) return 0x5F; if (count < 36) return 0x7F; if (count < 46) return 0xBF; return 0xFF; } bool8 QL_IsTrainerSightDisabled(void) { if (gQuestLogState != QL_STATE_PLAYBACK) return FALSE; if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED || sPlaybackControl.state == 1 || sPlaybackControl.state == 2) return TRUE; return FALSE; } void QL_HandleInput(void) { // Ignore input if we're currently ending a scene/playback if (sPlaybackControl.endMode != END_MODE_NONE) return; if (JOY_NEW(A_BUTTON)) { // Pressed A, skip to next scene sPlaybackControl.endMode = END_MODE_SCENE; gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; DoSceneEndTransition(-3); } else if (JOY_NEW(B_BUTTON)) { // Pressed B, end playback sPlaybackControl.endMode = END_MODE_FINISH; gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; DoSkipToEndTransition(-3); } } bool8 QuestLogScenePlaybackIsEnding(void) { if (sPlaybackControl.endMode != END_MODE_NONE) return TRUE; return FALSE; } void QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(void) { if (gQuestLogState == QL_STATE_PLAYBACK) DrawPreviouslyOnQuestHeader(sNumScenes); } static void DrawSceneDescription(void) { u32 i; u8 numLines = 0; for (i = 0; i < 0x100 && gStringVar4[i] != EOS; i++) { if (gStringVar4[i] == CHAR_NEWLINE) numLines++; } PutWindowTilemap(sWindowIds[WIN_DESCRIPTION]); CopyDescriptionWindowTiles(sWindowIds[WIN_DESCRIPTION]); AddTextPrinterParameterized4(sWindowIds[WIN_DESCRIPTION], FONT_NORMAL, 2, sQuestLogTextLineYCoords[numLines], 1, 0, sTextColors, 0, gStringVar4); ScheduleBgCopyTilemapToVram(0); } static void CopyDescriptionWindowTiles(u8 windowId) { const u16 *src = sDescriptionWindow_Gfx; u16 *buffer = Alloc(DESC_WIN_SIZE); u8 i, j, y; if (buffer) { for (i = 0; i < DESC_WIN_HEIGHT; i++) { switch (i) { default: // Middle tile y = 1; break; case 0: // Top edge tile y = 0; break; case DESC_WIN_HEIGHT - 1: // Bottom edge tile y = 2; break; } for (j = 0; j < DESC_WIN_WIDTH; j++) CpuCopy32(src + 16 * y, buffer + 16 * (2 * (15 * i) + j), TILE_SIZE_4BPP); } CopyToWindowPixelBuffer(windowId, (const u8 *)buffer, DESC_WIN_SIZE, 0); Free(buffer); } } static void QuestLog_CloseTextWindow(void) { ClearWindowTilemap(sWindowIds[WIN_DESCRIPTION]); FillWindowPixelRect(sWindowIds[WIN_DESCRIPTION], 15, 0, 0, 0xf0, 0x30); CopyWindowToVram(sWindowIds[WIN_DESCRIPTION], COPYWIN_GFX); PutWindowTilemap(sWindowIds[WIN_BOTTOM_BAR]); CopyWindowToVram(sWindowIds[WIN_BOTTOM_BAR], COPYWIN_MAP); } static void DoSkipToEndTransition(s8 delay) { FadeScreen(FADE_TO_BLACK, delay); sQuestLogCB = QuestLog_WaitFadeAndCancelPlayback; } static void QuestLog_WaitFadeAndCancelPlayback(void) { if (!gPaletteFade.active) { LockPlayerFieldControls(); for (sCurrentSceneNum = sCurrentSceneNum; sCurrentSceneNum < QUEST_LOG_SCENE_COUNT; sCurrentSceneNum++) { if (gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType == 0) break; ReadQuestLogScriptFromSav1(sCurrentSceneNum, sQuestLogActionRecordBuffer); } gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; QuestLog_StartFinalScene(); } } void QuestLog_InitPalettesBackup(void) { if (gQuestLogState == QL_STATE_PLAYBACK_LAST) sPalettesBackup = AllocZeroed(PLTT_SIZE); } void QuestLog_BackUpPalette(u16 offset, u16 size) { CpuCopy16(&gPlttBufferUnfaded[offset], &sPalettesBackup[offset], PLTT_SIZEOF(size)); } static bool8 FieldCB2_FinalScene(void) { LoadPalette(GetTextWindowPalette(4), BG_PLTT_ID(15), PLTT_SIZE_4BPP); DrawPreviouslyOnQuestHeader(0); FieldCB_WarpExitFadeFromBlack(); CreateTask(Task_FinalScene_WaitFade, 0xFF); return TRUE; } static void Task_FinalScene_WaitFade(u8 taskId) { struct Task *task = &gTasks[taskId]; if (ArePlayerFieldControlsLocked() != TRUE) { FreezeObjectEvents(); HandleEnforcedLookDirectionOnPlayerStopMoving(); StopPlayerAvatar(); LockPlayerFieldControls(); task->func = Task_QuestLogScene_SavedGame; } } static void Task_QuestLogScene_SavedGame(u8 taskId) { struct Task *task = &gTasks[taskId]; if (!gPaletteFade.active) { if (sPlaybackControl.endMode != END_MODE_FINISH) { GetMapNameGeneric(gStringVar1, gMapHeader.regionMapSectionId); if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(RS_BATTLE_TOWER) && (gSaveBlock1Ptr->location.mapNum >= MAP_NUM(RS_BATTLE_TOWER) && gSaveBlock1Ptr->location.mapNum <= MAP_NUM(RS_BATTLE_TOWER_BATTLE_ROOM))) { StringCopy(gStringVar1, gText_BattleTower); } StringExpandPlaceholders(gStringVar4, gText_QuestLog_SavedGameAtLocation); DrawSceneDescription(); } task->data[0] = 0; task->data[1] = 0; task->func = Task_WaitAtEndOfQuestLog; FreezeObjectEvents(); LockPlayerFieldControls(); } } #define tTimer data[0] static void Task_WaitAtEndOfQuestLog(u8 taskId) { struct Task *task = &gTasks[taskId]; if (JOY_NEW(A_BUTTON | B_BUTTON) || task->tTimer >= 127 || sPlaybackControl.endMode == END_MODE_FINISH) { QuestLog_CloseTextWindow(); task->tTimer = 0; task->func = Task_EndQuestLog; gQuestLogState = 0; } else task->tTimer++; } #undef tTimer extern const u8 NationalDexAideEvent[]; #define tState data[0] #define tTimer data[1] static void Task_EndQuestLog(u8 taskId) { s16 *data = gTasks[taskId].data; u32 i; switch (tState) { case 0: gDisableMapMusicChangeOnMapLoad = 0; Overworld_PlaySpecialMapMusic(); QL_SlightlyDarkenSomePals(); FillWindowPixelRect(sWindowIds[WIN_TOP_BAR], 0xF, 0, 0, sWindowTemplates[WIN_TOP_BAR].width * 8, sWindowTemplates[WIN_TOP_BAR].height * 8); tState++; break; case 1: if (RestoreScreenAfterPlayback(taskId)) { for (i = 0; i < WIN_COUNT; i++) { ClearWindowTilemap(sWindowIds[i]); CopyWindowToVram(sWindowIds[i], COPYWIN_MAP); RemoveWindow(sWindowIds[i]); } tTimer = 0; tState++; } break; case 2: if (tTimer < 32) tTimer++; else tState++; break; default: if (sPlaybackControl.endMode == END_MODE_FINISH) ShowMapNamePopup(TRUE); CpuCopy16(sPalettesBackup, gPlttBufferUnfaded, PLTT_SIZE); Free(sPalettesBackup); sPlaybackControl = (struct PlaybackControl){}; ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); gTextFlags.autoScroll = FALSE; gGlobalFieldTintMode = QL_TINT_NONE; DisableWildEncounters(FALSE); gHelpSystemEnabled = TRUE; DestroyTask(taskId); if(CheckNationalDexEligibilityOnSaveLoad() && DoCoordsMatchPMCExitMat() && FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX)) { DismissMapNamePopup(); ScriptContext_SetupScript(NationalDexAideEvent); } break; } } #undef tState #undef tTimer #define tTimer data[1] // Scroll the top and bottom windows offscreen and restore the screen tint to the original color. static bool8 RestoreScreenAfterPlayback(u8 taskId) { s16 *data = gTasks[taskId].data; if (tTimer > 15) return TRUE; CopyPaletteInvertedTint(&gPlttBufferUnfaded[BG_PLTT_ID(0) + 1], &gPlttBufferFaded[BG_PLTT_ID(0) + 1], 0xDF, 15 - tTimer); CopyPaletteInvertedTint(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferFaded[OBJ_PLTT_ID(0)], 0x100, 15 - tTimer); FillWindowPixelRect(sWindowIds[WIN_TOP_BAR], 0x00, 0, sWindowTemplates[WIN_TOP_BAR].height * 8 - 1 - tTimer, sWindowTemplates[WIN_TOP_BAR].width * 8, 1); FillWindowPixelRect(sWindowIds[WIN_BOTTOM_BAR], 0x00, 0, data[1], sWindowTemplates[WIN_BOTTOM_BAR].width * 8, 1); CopyWindowToVram(sWindowIds[WIN_TOP_BAR], COPYWIN_GFX); CopyWindowToVram(sWindowIds[WIN_BOTTOM_BAR], COPYWIN_GFX); tTimer++; return FALSE; } static void QL_SlightlyDarkenSomePals(void) { u16 *buffer = Alloc(PLTT_SIZE); CpuCopy16(sPalettesBackup, buffer, PLTT_SIZE); SlightlyDarkenPalsInWeather(sPalettesBackup, sPalettesBackup, 13 * 16); SlightlyDarkenPalsInWeather(&sPalettesBackup[OBJ_PLTT_ID(1)], &sPalettesBackup[OBJ_PLTT_ID(1)], 1 * 16); SlightlyDarkenPalsInWeather(&sPalettesBackup[OBJ_PLTT_ID(6)], &sPalettesBackup[OBJ_PLTT_ID(6)], 4 * 16); SlightlyDarkenPalsInWeather(&sPalettesBackup[OBJ_PLTT_ID(11)], &sPalettesBackup[OBJ_PLTT_ID(11)], 5 * 16); CpuCopy16(sPalettesBackup, gPlttBufferUnfaded, PLTT_SIZE); CpuCopy16(buffer, sPalettesBackup, PLTT_SIZE); Free(buffer); } void QL_FinishRecordingScene(void) { if (gQuestLogState == QL_STATE_RECORDING) { TryRecordActionSequence(sQuestLogActionRecordBuffer); RecordSceneEnd(); gQuestLogState = 0; sQuestLogCB = NULL; gQuestLogDefeatedWildMonRecord = NULL; gQuestLogRecordingPointer = NULL; gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; } } void QuestLog_CutRecording(void) { if (gQuestLogPlaybackState != QL_PLAYBACK_STATE_STOPPED && gQuestLogState == QL_STATE_RECORDING) { TryRecordActionSequence(sQuestLogActionRecordBuffer); QL_RecordWait(1); RecordSceneEnd(); gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; gQuestLogState = 0; sQuestLogCB = NULL; } gQuestLogDefeatedWildMonRecord = NULL; gQuestLogRecordingPointer = NULL; } static void SortQuestLogInSav1(void) { struct QuestLogScene * buffer = AllocZeroed(sizeof(gSaveBlock1Ptr->questLog)); u32 i; u8 sceneNum = sCurrentSceneNum; u8 count = 0; for (i = 0; i < QUEST_LOG_SCENE_COUNT; i++) { if (sceneNum >= QUEST_LOG_SCENE_COUNT) sceneNum = 0; if (gSaveBlock1Ptr->questLog[sceneNum].startType != 0) { buffer[count] = gSaveBlock1Ptr->questLog[sceneNum]; count++; } sceneNum++; } sCurrentSceneNum = count % QUEST_LOG_SCENE_COUNT; CpuCopy16(buffer, gSaveBlock1Ptr->questLog, sizeof(gSaveBlock1Ptr->questLog)); Free(buffer); } void SaveQuestLogData(void) { if (MenuHelpers_IsLinkActive() != TRUE) { QuestLog_CutRecording(); SortQuestLogInSav1(); } } void QL_UpdateObject(struct Sprite *sprite) { struct ObjectEvent *objectEvent = &gObjectEvents[sprite->data[0]]; if (objectEvent->localId == OBJ_EVENT_ID_PLAYER) { if (sMovementScripts[0][0] != MOVEMENT_ACTION_NONE) { ObjectEventSetHeldMovement(objectEvent, sMovementScripts[0][0]); sMovementScripts[0][0] = MOVEMENT_ACTION_NONE; } if (sMovementScripts[0][1] != QL_PLAYER_GFX_NONE) { QuestLogUpdatePlayerSprite(sMovementScripts[0][1]); sMovementScripts[0][1] = QL_PLAYER_GFX_NONE; } QL_UpdateObjectEventCurrentMovement(objectEvent, sprite); } else { if (sMovementScripts[objectEvent->localId][0] != MOVEMENT_ACTION_NONE) { ObjectEventSetHeldMovement(objectEvent, sMovementScripts[objectEvent->localId][0]); sMovementScripts[objectEvent->localId][0] = MOVEMENT_ACTION_NONE; } QL_UpdateObjectEventCurrentMovement(objectEvent, sprite); } } void QuestLogRecordNPCStep(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId) { if (!RecordHeadAtEndOfEntryOrScriptContext2Enabled()) { sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT; sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = localId; sCurSceneActions[gQuestLogCurActionIdx].data.a.mapNum = mapNum; sCurSceneActions[gQuestLogCurActionIdx].data.a.mapGroup = mapGroup; sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = movementActionId; gQuestLogCurActionIdx++; sNextActionDelay = 0; } } void QuestLogRecordNPCStepWithDuration(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId, u8 duration) { if (!RecordHeadAtEndOfEntry()) { sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT; sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = localId; sCurSceneActions[gQuestLogCurActionIdx].data.a.mapNum = mapNum; sCurSceneActions[gQuestLogCurActionIdx].data.a.mapGroup = mapGroup; sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = movementActionId; gQuestLogCurActionIdx++; sNextActionDelay = duration; } } void QuestLogRecordPlayerStep(u8 movementActionId) { if (!RecordHeadAtEndOfEntryOrScriptContext2Enabled()) { if (movementActionId != sCurSceneActions[sLastQuestLogCursor].data.a.movementActionId || movementActionId > MOVEMENT_ACTION_FACE_RIGHT) { sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT; sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = 0; sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = movementActionId; sLastQuestLogCursor = gQuestLogCurActionIdx; gQuestLogCurActionIdx++; sNextActionDelay = 0; } } } void QuestLogRecordPlayerStepWithDuration(u8 movementActionId, u8 duration) { if (!RecordHeadAtEndOfEntry()) { sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT; sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = 0; sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = movementActionId; sLastQuestLogCursor = gQuestLogCurActionIdx; gQuestLogCurActionIdx++; sNextActionDelay = duration; } } void QuestLogRecordPlayerAvatarGfxTransition(u8 gfxState) { if (!RecordHeadAtEndOfEntry()) { sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_GFX_CHANGE; sCurSceneActions[gQuestLogCurActionIdx].data.b.localId = 0; sCurSceneActions[gQuestLogCurActionIdx].data.b.gfxState = gfxState; gQuestLogCurActionIdx++; sNextActionDelay = 0; } } void QuestLogRecordPlayerAvatarGfxTransitionWithDuration(u8 gfxState, u8 duration) { if (!RecordHeadAtEndOfEntry()) { sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_GFX_CHANGE; sCurSceneActions[gQuestLogCurActionIdx].data.b.localId = 0; sCurSceneActions[gQuestLogCurActionIdx].data.b.gfxState = gfxState; gQuestLogCurActionIdx++; sNextActionDelay = duration; } } void QL_RecordFieldInput(struct FieldInput * fieldInput) { if (gQuestLogCurActionIdx < sMaxActionsInScene) { // Retain only the following fields: // - pressedAButton // - checkStandardWildEncounter // - heldDirection // - heldDirection2 // - tookStep // - pressedBButton // - dpadDirection u32 data = *(u32 *)fieldInput & 0x00FF00F3; sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_INPUT; sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[0] = data; sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[1] = data >> 8; // always 0 sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[2] = data >> 16; sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[3] = data >> 24; // always 0 gQuestLogCurActionIdx++; if (ArePlayerFieldControlsLocked()) sNextActionDelay = 1; else sNextActionDelay = 0; } } static void TogglePlaybackStateForOverworldLock(u8 a0) { switch (a0) { case 1: if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RUNNING) gQuestLogPlaybackState = QL_PLAYBACK_STATE_ACTION_END; // Message visible, overworld locked break; case 2: if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_ACTION_END) gQuestLogPlaybackState = QL_PLAYBACK_STATE_RUNNING; // Overworld unlocked break; } } void QuestLog_OnEscalatorWarp(u8 direction) { u8 state = QL_GetPlaybackState(); switch (direction) { case QL_ESCALATOR_OUT: // warp out if (state == QL_PLAYBACK_STATE_RUNNING) gQuestLogPlaybackState = QL_PLAYBACK_STATE_ACTION_END; else if (state == QL_PLAYBACK_STATE_RECORDING) { sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_EMPTY; gQuestLogCurActionIdx++; sNextActionDelay = 0; gQuestLogPlaybackState = QL_PLAYBACK_STATE_RECORDING_NO_DELAY; } break; case QL_ESCALATOR_IN: // warp in if (state == QL_PLAYBACK_STATE_RUNNING) gQuestLogPlaybackState = QL_PLAYBACK_STATE_RUNNING; else if (state == QL_PLAYBACK_STATE_RECORDING) gQuestLogPlaybackState = QL_PLAYBACK_STATE_RECORDING; break; } } static void ResetActions(u8 kind, struct QuestLogAction *actions, u16 size) { int i; switch (kind) { default: gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; break; case QL_PLAYBACK_STATE_RUNNING: sCurSceneActions = actions; sMaxActionsInScene = size / sizeof(*sCurSceneActions); for (i = 0; i < (s32)ARRAY_COUNT(sMovementScripts); i++) { sMovementScripts[i][0] |= MOVEMENT_ACTION_NONE; sMovementScripts[i][1] |= QL_PLAYER_GFX_NONE; } gQuestLogCurActionIdx = 0; sLastQuestLogCursor = 0; gQuestLogFieldInput = (struct FieldInput){}; sNextActionDelay = sCurSceneActions[gQuestLogCurActionIdx].duration; sMovementScripts[0][0] = sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId; sMovementScripts[0][1] = QL_PLAYER_GFX_NONE; gQuestLogPlaybackState = QL_PLAYBACK_STATE_RUNNING; break; case QL_PLAYBACK_STATE_RECORDING: sCurSceneActions = actions; sMaxActionsInScene = size / sizeof(*sCurSceneActions); for (i = 0; i < sMaxActionsInScene; i++) { sCurSceneActions[i] = (struct QuestLogAction){ .duration = 0xFFFF, .type = QL_ACTION_SCENE_END }; } gQuestLogCurActionIdx = 0; sNextActionDelay = 0; sCurSceneActions[gQuestLogCurActionIdx].duration = 0; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT; sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = 0; switch (GetPlayerFacingDirection()) { case DIR_NONE: case DIR_SOUTH: sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = MOVEMENT_ACTION_FACE_DOWN; break; case DIR_EAST: sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = MOVEMENT_ACTION_FACE_RIGHT; break; case DIR_NORTH: sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = MOVEMENT_ACTION_FACE_UP; break; case DIR_WEST: sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = MOVEMENT_ACTION_FACE_LEFT; break; } sLastQuestLogCursor = 0; gQuestLogCurActionIdx++; sCurSceneActions[gQuestLogCurActionIdx].duration = 0; sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_INPUT; sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[0] = 0; sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[1] = 0; sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[2] = 0; sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[3] = 0; gQuestLogCurActionIdx++; gQuestLogPlaybackState = QL_PLAYBACK_STATE_RECORDING; break; } } void QL_TryRunActions(void) { switch (gQuestLogPlaybackState) { case QL_PLAYBACK_STATE_STOPPED: case QL_PLAYBACK_STATE_ACTION_END: case QL_PLAYBACK_STATE_RECORDING_NO_DELAY: break; case QL_PLAYBACK_STATE_RUNNING: if (!RecordHeadAtEndOfEntryOrScriptContext2Enabled()) { if (sNextActionDelay != 0) { sNextActionDelay--; } else { do { switch (sCurSceneActions[gQuestLogCurActionIdx].type) { case QL_ACTION_MOVEMENT: // NPC movement action sMovementScripts[sCurSceneActions[gQuestLogCurActionIdx].data.a.localId][0] = sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId; break; case QL_ACTION_GFX_CHANGE: // State transition sMovementScripts[sCurSceneActions[gQuestLogCurActionIdx].data.b.localId][1] = sCurSceneActions[gQuestLogCurActionIdx].data.b.gfxState; break; case QL_ACTION_INPUT: // Player input *(u32 *)&gQuestLogFieldInput = ((sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[3] << 24) | (sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[2] << 16) | (sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[1] << 8) | (sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[0] << 0)); break; case QL_ACTION_EMPTY: // End gQuestLogPlaybackState = QL_PLAYBACK_STATE_ACTION_END; break; case QL_ACTION_WAIT: // Nothing. The wait action uses sNextActionDelay to add a pause to playback. // When the counter is finished and this is reached there's nothing else that needs to be done. break; case QL_ACTION_SCENE_END: gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; break; } if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED) break; if (++gQuestLogCurActionIdx >= sMaxActionsInScene) { gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; break; } sNextActionDelay = sCurSceneActions[gQuestLogCurActionIdx].duration; } while (gQuestLogPlaybackState != QL_PLAYBACK_STATE_ACTION_END && (sNextActionDelay == 0 || sNextActionDelay == 0xFFFF)); } } else if (gQuestLogCurActionIdx >= sMaxActionsInScene) { gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; } break; case QL_PLAYBACK_STATE_RECORDING: if (ArePlayerFieldControlsLocked() != TRUE) { sNextActionDelay++; if (gQuestLogCurActionIdx >= sMaxActionsInScene) gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; } break; } } void QL_AfterRecordFishActionSuccessful(void) { sNextActionDelay++; } u8 QL_GetPlaybackState(void) { switch (gQuestLogPlaybackState) { case QL_PLAYBACK_STATE_STOPPED: default: return QL_PLAYBACK_STATE_STOPPED; case QL_PLAYBACK_STATE_RUNNING: case QL_PLAYBACK_STATE_ACTION_END: return QL_PLAYBACK_STATE_RUNNING; case QL_PLAYBACK_STATE_RECORDING: case QL_PLAYBACK_STATE_RECORDING_NO_DELAY: return QL_PLAYBACK_STATE_RECORDING; } } static bool8 RecordHeadAtEndOfEntryOrScriptContext2Enabled(void) { if (gQuestLogCurActionIdx >= sMaxActionsInScene || ArePlayerFieldControlsLocked() == TRUE) return TRUE; return FALSE; } static bool8 RecordHeadAtEndOfEntry(void) { if (gQuestLogCurActionIdx >= sMaxActionsInScene) return TRUE; return FALSE; } static const struct FlagOrVarRecord sDummyFlagOrVarRecord = { .idx = 0, .isFlag = FALSE, .value = 0x7FFF }; void *QuestLogGetFlagOrVarPtr(bool8 isFlag, u16 idx) { void *response; if (gQuestLogCurActionIdx == 0) return NULL; if (gQuestLogCurActionIdx >= sMaxActionsInScene) return NULL; if (sFlagOrVarPlayhead >= sNumFlagsOrVars) return NULL; if (sFlagOrVarRecords[sFlagOrVarPlayhead].idx == idx && sFlagOrVarRecords[sFlagOrVarPlayhead].isFlag == isFlag) { response = &sFlagOrVarRecords[sFlagOrVarPlayhead].value; sFlagOrVarPlayhead++; } else response = NULL; return response; } void QuestLogSetFlagOrVar(bool8 isFlag, u16 idx, u16 value) { if (gQuestLogCurActionIdx == 0) return; if (gQuestLogCurActionIdx >= sMaxActionsInScene) return; if (sFlagOrVarPlayhead >= sNumFlagsOrVars) return; sFlagOrVarRecords[sFlagOrVarPlayhead].idx = idx; sFlagOrVarRecords[sFlagOrVarPlayhead].isFlag = isFlag; sFlagOrVarRecords[sFlagOrVarPlayhead].value = value; sFlagOrVarPlayhead++; } // Unused static void QuestLogResetFlagsOrVars(u8 state, struct FlagOrVarRecord * records, u16 size) { s32 i; if (state == 0 || state > QL_STATE_PLAYBACK) { gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; } else { sFlagOrVarRecords = records; sNumFlagsOrVars = size / 4; sFlagOrVarPlayhead = 0; if (state == QL_STATE_PLAYBACK) { for (i = 0; i < sMaxActionsInScene; i++) sFlagOrVarRecords[i] = sDummyFlagOrVarRecord; } } } ================================================ FILE: src/quest_log_battle.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "event_data.h" #include "link.h" #include "overworld.h" #include "quest_log.h" #include "constants/trainers.h" static void GetLinkMultiBattlePlayerIndexes(s32 *, s32 *); void TrySetQuestLogBattleEvent(void) { struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT)) { // Why allocate both of these? Only one will ever be used at a time struct QuestLogEvent_TrainerBattle * trainerData = Alloc(sizeof(*trainerData)); struct QuestLogEvent_WildBattle * wildData = Alloc(sizeof(*wildData)); u16 eventId; u16 playerEndingHP; u16 playerMaxHP; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { switch (sTrainers[gTrainerBattleOpponent_A].trainerClass) { case TRAINER_CLASS_LEADER: eventId = QL_EVENT_DEFEATED_GYM_LEADER; break; case TRAINER_CLASS_CHAMPION: eventId = QL_EVENT_DEFEATED_CHAMPION; break; case TRAINER_CLASS_ELITE_FOUR: eventId = QL_EVENT_DEFEATED_E4_MEMBER; break; default: eventId = QL_EVENT_DEFEATED_TRAINER; break; } trainerData->trainerId = gTrainerBattleOpponent_A; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { trainerData->speciesOpponent = gBattleResults.lastOpponentSpecies; // Decide which of the pokemon on the player's side to mention as the victor if (GetBattlerSide(gBattleStruct->lastAttackerToFaintOpponent) == B_SIDE_PLAYER) trainerData->speciesPlayer = gBattleMons[gBattleStruct->lastAttackerToFaintOpponent].species; else if (gBattleMons[GetBattlerAtPosition(0)].hp != 0) trainerData->speciesPlayer = gBattleMons[GetBattlerAtPosition(0)].species; else trainerData->speciesPlayer = gBattleMons[GetBattlerAtPosition(2)].species; playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp + gBattleMons[GetBattlerAtPosition(2)].hp; playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP + gBattleMons[GetBattlerAtPosition(2)].maxHP; } else { trainerData->speciesOpponent = gBattleResults.lastOpponentSpecies; trainerData->speciesPlayer = gBattleMons[GetBattlerAtPosition(0)].species; playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp; playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP; } trainerData->mapSec = GetCurrentRegionMapSectionId(); // Calculate fractional HP loss (determines flavor text, e.g. "handily" vs "somehow" defeated trainer) trainerData->hpFractionId = 0; if (playerEndingHP < playerMaxHP / 3 * 2) trainerData->hpFractionId++; if (playerEndingHP < playerMaxHP / 3) trainerData->hpFractionId++; SetQuestLogEvent(eventId, (const u16 *)trainerData); } else { if (gBattleOutcome == B_OUTCOME_WON) { wildData->defeatedSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES); wildData->caughtSpecies = SPECIES_NONE; } else // gBattleOutcome == B_OUTCOME_CAUGHT { wildData->defeatedSpecies = SPECIES_NONE; wildData->caughtSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES); } wildData->mapSec = GetCurrentRegionMapSectionId(); SetQuestLogEvent(QL_EVENT_DEFEATED_WILD_MON, (const u16 *)wildData); } Free(trainerData); Free(wildData); } } void TrySetQuestLogLinkBattleEvent(void) { s32 partnerIdx; s32 opponentIdxs[2]; u16 eventId; s32 i; bool32 inUnionRoom; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { struct QuestLogEvent_LinkBattle * data = Alloc(sizeof(*data)); data->outcome = gBattleOutcome - 1; // 0 = won, 1 = lost, 2 = drew if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { eventId = QL_EVENT_LINK_BATTLED_MULTI; GetLinkMultiBattlePlayerIndexes(&partnerIdx, opponentIdxs); for (i = 0; i < PLAYER_NAME_LENGTH; i++) { data->playerNames[0][i] = gLinkPlayers[partnerIdx].name[i]; data->playerNames[1][i] = gLinkPlayers[opponentIdxs[0]].name[i]; data->playerNames[2][i] = gLinkPlayers[opponentIdxs[1]].name[i]; } } else { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) eventId = QL_EVENT_LINK_BATTLED_DOUBLE; else { inUnionRoom = InUnionRoom(); eventId = QL_EVENT_LINK_BATTLED_SINGLE; if (inUnionRoom == TRUE) eventId = QL_EVENT_LINK_BATTLED_UNION; } for (i = 0; i < PLAYER_NAME_LENGTH; i++) data->playerNames[0][i] = gLinkPlayers[gBattleStruct->multiplayerId ^ 1].name[i]; } SetQuestLogEvent(eventId, (const u16 *)data); Free(data); } } static void GetLinkMultiBattlePlayerIndexes(s32 * partnerIdx, s32 * opponentIdxs) { s32 i; s32 numOpponentsFound = 0; u8 partnerId = gLinkPlayers[gBattleStruct->multiplayerId].id ^ 2; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (partnerId == gLinkPlayers[i].id) *partnerIdx = i; else if (i != gBattleStruct->multiplayerId) opponentIdxs[numOpponentsFound++] = i; } } ================================================ FILE: src/quest_log_events.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "data.h" #include "dynamic_placeholder_text_util.h" #include "event_data.h" #include "event_scripts.h" #include "menu_helpers.h" #include "item.h" #include "link.h" #include "quest_log.h" #include "party_menu.h" #include "pokemon_storage_system.h" #include "region_map.h" #include "strings.h" #include "constants/maps.h" #include "constants/trainers.h" #include "constants/items.h" #include "constants/region_map_sections.h" enum { STEP_RECORDING_MODE_ENABLED, STEP_RECORDING_MODE_DISABLED, STEP_RECORDING_MODE_DISABLED_UNTIL_DEPART, }; struct DeferredLinkEvent { u16 id; u16 ALIGNED(4) data[14]; }; #define CMD_HEADER_SIZE 4 #define MAX_CMD_REPEAT 4 static EWRAM_DATA struct DeferredLinkEvent sDeferredEvent = {0}; EWRAM_DATA struct QuestLogRepeatEventTracker gQuestLogRepeatEventTracker = {0}; static EWRAM_DATA u8 sStepRecordingMode = 0; static EWRAM_DATA bool8 sNewlyEnteredMap = FALSE; static EWRAM_DATA u8 sLastDepartedLocation = 0; static EWRAM_DATA bool8 sPlayedTheSlots = FALSE; static bool8 InQuestLogDisabledLocation(void); static bool8 ShouldRegisterEvent_HandlePartyActions(u16, const u16 *); static bool8 ShouldRegisterEvent_HandleBeatStoryTrainer(u16, const u16 *); static u16 *ShouldRegisterEvent(u16, const u16 *); static bool8 TryDeferLinkEvent(u16, const u16 *); static bool8 TryDeferTrainerBattleEvent(u16, const u16 *); static bool8 IsEventWithSpecialEncounterSpecies(u16, const u16 *); static void UpdateRepeatEventCounter(u16); static u16 *QL_RecordAction_Wait(u16 *, u16); static u16 *RecordEvent_SwitchedPartyOrder(u16 *, const struct QuestLogEvent_SwitchedPartyOrder *); static u16 *RecordEvent_UsedItem(u16 *, const struct QuestLogEvent_Item *); static u16 *RecordEvent_GaveHeldItemFromPartyMenu(u16 *, const struct QuestLogEvent_Item *); static u16 *RecordEvent_GaveHeldItemFromBagMenu(u16 *, const struct QuestLogEvent_Item *); static u16 *RecordEvent_GaveHeldItemFromPC(u16 *, const struct QuestLogEvent_Item *); static u16 *RecordEvent_TookHeldItem(u16 *, const struct QuestLogEvent_Item *); static u16 *RecordEvent_SwappedHeldItemFromBag(u16 *, const struct QuestLogEvent_SwappedHeldItem *); static u16 *RecordEvent_SwappedHeldItemFromPC(u16 *, const struct QuestLogEvent_SwappedHeldItem *); static u16 *RecordEvent_UsedPkmnCenter(u16 *, const u16 *); static u16 *RecordEvent_LinkTraded(u16 *, const struct QuestLogEvent_Traded *); static u16 *RecordEvent_LinkBattledSingle(u16 *, const struct QuestLogEvent_LinkBattle *); static u16 *RecordEvent_LinkBattledDouble(u16 *, const struct QuestLogEvent_LinkBattle *); static u16 *RecordEvent_LinkBattledMulti(u16 *, const struct QuestLogEvent_LinkBattle *); static u16 *RecordEvent_UsedUnionRoom(u16 *, const u16 *); static u16 *RecordEvent_UsedUnionRoomChat(u16 *, const u16 *); static u16 *RecordEvent_LinkTradedUnionRoom(u16 *, const struct QuestLogEvent_Traded *); static u16 *RecordEvent_LinkBattledUnionRoom(u16 *, const struct QuestLogEvent_LinkBattle *); static u16 *RecordEvent_SwitchedMonsBetweenBoxes(u16 *, const struct QuestLogEvent_MovedBoxMon *); static u16 *RecordEvent_SwitchedMonsWithinBox(u16 *, const u16 *); static u16 *RecordEvent_SwitchedPartyMonForPCMon(u16 *, const u16 *); static u16 *RecordEvent_MovedMonBetweenBoxes(u16 *, const u16 *); static u16 *RecordEvent_MovedMonWithinBox(u16 *, const u16 *); static u16 *RecordEvent_WithdrewMonFromPC(u16 *, const u16 *); static u16 *RecordEvent_DepositedMonInPC(u16 *, const u16 *); static u16 *RecordEvent_SwitchedMultipleMons(u16 *, const u16 *); static u16 *RecordEvent_DepositedItemInPC(u16 *, const struct QuestLogEvent_Item *); static u16 *RecordEvent_WithdrewItemFromPC(u16 *, const struct QuestLogEvent_Item *); static u16 *RecordEvent_DefeatedGymLeader(u16 *, const struct QuestLogEvent_TrainerBattle *); static u16 *RecordEvent_DefeatedWildMon(u16 *, const struct QuestLogEvent_WildBattle *); static u16 *RecordEvent_DefeatedEliteFourMember(u16 *, const struct QuestLogEvent_TrainerBattle *); static u16 *RecordEvent_DefeatedChampion(u16 *, const struct QuestLogEvent_TrainerBattle *); static u16 *RecordEvent_DefeatedNormalTrainer(u16 *, const struct QuestLogEvent_TrainerBattle *); static u16 *RecordEvent_DepartedLocation(u16 *, const struct QuestLogEvent_Departed *); static u16 *RecordEvent_UsedFieldMove(u16 *, const struct QuestLogEvent_FieldMove *); static u16 *RecordEvent_BoughtItem(u16 *, const struct QuestLogEvent_Shop *); static u16 *RecordEvent_SoldItem(u16 *, const struct QuestLogEvent_Shop *); static u16 *RecordEvent_ObtainedStoryItem(u16 *, const struct QuestLogEvent_StoryItem *); static u16 *RecordEvent_ArrivedInLocation(u16 *, const u16 *); static const u16 *LoadEvent_SwitchedPartyOrder(const u16 *); static const u16 *LoadEvent_UsedItem(const u16 *); static const u16 *LoadEvent_GaveHeldItemFromPartyMenu(const u16 *); static const u16 *LoadEvent_GaveHeldItemFromBagMenu(const u16 *); static const u16 *LoadEvent_GaveHeldItemFromPC(const u16 *); static const u16 *LoadEvent_TookHeldItem(const u16 *); static const u16 *LoadEvent_SwappedHeldItem(const u16 *); static const u16 *LoadEvent_SwappedHeldItemFromPC(const u16 *); static const u16 *LoadEvent_UsedPkmnCenter(const u16 *); static const u16 *LoadEvent_LinkTraded(const u16 *); static const u16 *LoadEvent_LinkBattledSingle(const u16 *); static const u16 *LoadEvent_LinkBattledDouble(const u16 *); static const u16 *LoadEvent_LinkBattledMulti(const u16 *); static const u16 *LoadEvent_UsedUnionRoom(const u16 *); static const u16 *LoadEvent_UsedUnionRoomChat(const u16 *); static const u16 *LoadEvent_LinkTradedUnionRoom(const u16 *); static const u16 *LoadEvent_LinkBattledUnionRoom(const u16 *); static const u16 *LoadEvent_SwitchedMonsBetweenBoxes(const u16 *); static const u16 *LoadEvent_SwitchedMonsWithinBox(const u16 *); static const u16 *LoadEvent_SwitchedPartyMonForPCMon(const u16 *); static const u16 *LoadEvent_MovedMonBetweenBoxes(const u16 *); static const u16 *LoadEvent_MovedMonWithinBox(const u16 *); static const u16 *LoadEvent_WithdrewMonFromPC(const u16 *); static const u16 *LoadEvent_DepositedMonInPC(const u16 *); static const u16 *LoadEvent_SwitchedMultipleMons(const u16 *); static const u16 *LoadEvent_DepositedItemInPC(const u16 *); static const u16 *LoadEvent_WithdrewItemFromPC(const u16 *); static const u16 *LoadEvent_DefeatedGymLeader(const u16 *); static const u16 *LoadEvent_DefeatedWildMon(const u16 *); static const u16 *LoadEvent_DefeatedEliteFourMember(const u16 *); static const u16 *LoadEvent_DefeatedChampion(const u16 *); static const u16 *LoadEvent_DefeatedTrainer(const u16 *); static const u16 *LoadEvent_DepartedLocation(const u16 *); static const u16 *LoadEvent_UsedFieldMove(const u16 *); static const u16 *LoadEvent_BoughtItem(const u16 *); static const u16 *LoadEvent_SoldItem(const u16 *); static const u16 *LoadEvent_ObtainedStoryItem(const u16 *); static const u16 *LoadEvent_ArrivedInLocation(const u16 *); static bool8 IsSpeciesFromSpecialEncounter(u16); static bool8 ShouldRegisterEvent_HandleDeparted(u16, const u16 *); static bool8 ShouldRegisterEvent_DepartedGameCorner(u16, const u16 *); static void TranslateLinkPartnersName(u8 *); typedef u16 *(*RecordEventFunc)(u16 *, const u16 *); static const RecordEventFunc sRecordEventFuncs[] = { [QL_EVENT_INPUT] = NULL, [QL_EVENT_GFX_CHANGE] = NULL, [QL_EVENT_MOVEMENT] = NULL, [QL_EVENT_SWITCHED_PARTY_ORDER] = (RecordEventFunc) RecordEvent_SwitchedPartyOrder, [QL_EVENT_USED_ITEM] = (RecordEventFunc) RecordEvent_UsedItem, [QL_EVENT_GAVE_HELD_ITEM] = (RecordEventFunc) RecordEvent_GaveHeldItemFromPartyMenu, [QL_EVENT_GAVE_HELD_ITEM_BAG] = (RecordEventFunc) RecordEvent_GaveHeldItemFromBagMenu, [QL_EVENT_GAVE_HELD_ITEM_PC] = (RecordEventFunc) RecordEvent_GaveHeldItemFromPC, [QL_EVENT_TOOK_HELD_ITEM] = (RecordEventFunc) RecordEvent_TookHeldItem, [QL_EVENT_SWAPPED_HELD_ITEM] = (RecordEventFunc) RecordEvent_SwappedHeldItemFromBag, [QL_EVENT_SWAPPED_HELD_ITEM_PC] = (RecordEventFunc) RecordEvent_SwappedHeldItemFromPC, [QL_EVENT_USED_PKMN_CENTER] = (RecordEventFunc) RecordEvent_UsedPkmnCenter, [QL_EVENT_LINK_TRADED] = (RecordEventFunc) RecordEvent_LinkTraded, [QL_EVENT_LINK_BATTLED_SINGLE] = (RecordEventFunc) RecordEvent_LinkBattledSingle, [QL_EVENT_LINK_BATTLED_DOUBLE] = (RecordEventFunc) RecordEvent_LinkBattledDouble, [QL_EVENT_LINK_BATTLED_MULTI] = (RecordEventFunc) RecordEvent_LinkBattledMulti, [QL_EVENT_USED_UNION_ROOM] = (RecordEventFunc) RecordEvent_UsedUnionRoom, [QL_EVENT_USED_UNION_ROOM_CHAT] = (RecordEventFunc) RecordEvent_UsedUnionRoomChat, [QL_EVENT_LINK_TRADED_UNION] = (RecordEventFunc) RecordEvent_LinkTradedUnionRoom, [QL_EVENT_LINK_BATTLED_UNION] = (RecordEventFunc) RecordEvent_LinkBattledUnionRoom, [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES] = (RecordEventFunc) RecordEvent_SwitchedMonsBetweenBoxes, [QL_EVENT_SWITCHED_MONS_WITHIN_BOX] = (RecordEventFunc) RecordEvent_SwitchedMonsWithinBox, [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = (RecordEventFunc) RecordEvent_SwitchedPartyMonForPCMon, [QL_EVENT_MOVED_MON_BETWEEN_BOXES] = (RecordEventFunc) RecordEvent_MovedMonBetweenBoxes, [QL_EVENT_MOVED_MON_WITHIN_BOX] = (RecordEventFunc) RecordEvent_MovedMonWithinBox, [QL_EVENT_WITHDREW_MON_PC] = (RecordEventFunc) RecordEvent_WithdrewMonFromPC, [QL_EVENT_DEPOSITED_MON_PC] = (RecordEventFunc) RecordEvent_DepositedMonInPC, [QL_EVENT_SWITCHED_MULTIPLE_MONS] = (RecordEventFunc) RecordEvent_SwitchedMultipleMons, [QL_EVENT_DEPOSITED_ITEM_PC] = (RecordEventFunc) RecordEvent_DepositedItemInPC, [QL_EVENT_WITHDREW_ITEM_PC] = (RecordEventFunc) RecordEvent_WithdrewItemFromPC, [QL_EVENT_DEFEATED_GYM_LEADER] = (RecordEventFunc) RecordEvent_DefeatedGymLeader, [QL_EVENT_DEFEATED_WILD_MON] = (RecordEventFunc) RecordEvent_DefeatedWildMon, [QL_EVENT_DEFEATED_E4_MEMBER] = (RecordEventFunc) RecordEvent_DefeatedEliteFourMember, [QL_EVENT_DEFEATED_CHAMPION] = (RecordEventFunc) RecordEvent_DefeatedChampion, [QL_EVENT_DEFEATED_TRAINER] = (RecordEventFunc) RecordEvent_DefeatedNormalTrainer, [QL_EVENT_DEPARTED] = (RecordEventFunc) RecordEvent_DepartedLocation, [QL_EVENT_USED_FIELD_MOVE] = (RecordEventFunc) RecordEvent_UsedFieldMove, [QL_EVENT_BOUGHT_ITEM] = (RecordEventFunc) RecordEvent_BoughtItem, [QL_EVENT_SOLD_ITEM] = (RecordEventFunc) RecordEvent_SoldItem, [QL_EVENT_SCENE_END] = NULL, [QL_EVENT_OBTAINED_STORY_ITEM] = (RecordEventFunc) RecordEvent_ObtainedStoryItem, [QL_EVENT_WAIT] = NULL, [QL_EVENT_ARRIVED] = (RecordEventFunc) RecordEvent_ArrivedInLocation }; static const u16 *(*const sLoadEventFuncs[])(const u16 *) = { [QL_EVENT_INPUT] = NULL, [QL_EVENT_GFX_CHANGE] = NULL, [QL_EVENT_MOVEMENT] = NULL, [QL_EVENT_SWITCHED_PARTY_ORDER] = LoadEvent_SwitchedPartyOrder, [QL_EVENT_USED_ITEM] = LoadEvent_UsedItem, [QL_EVENT_GAVE_HELD_ITEM] = LoadEvent_GaveHeldItemFromPartyMenu, [QL_EVENT_GAVE_HELD_ITEM_BAG] = LoadEvent_GaveHeldItemFromBagMenu, [QL_EVENT_GAVE_HELD_ITEM_PC] = LoadEvent_GaveHeldItemFromPC, [QL_EVENT_TOOK_HELD_ITEM] = LoadEvent_TookHeldItem, [QL_EVENT_SWAPPED_HELD_ITEM] = LoadEvent_SwappedHeldItem, [QL_EVENT_SWAPPED_HELD_ITEM_PC] = LoadEvent_SwappedHeldItemFromPC, [QL_EVENT_USED_PKMN_CENTER] = LoadEvent_UsedPkmnCenter, [QL_EVENT_LINK_TRADED] = LoadEvent_LinkTraded, [QL_EVENT_LINK_BATTLED_SINGLE] = LoadEvent_LinkBattledSingle, [QL_EVENT_LINK_BATTLED_DOUBLE] = LoadEvent_LinkBattledDouble, [QL_EVENT_LINK_BATTLED_MULTI] = LoadEvent_LinkBattledMulti, [QL_EVENT_USED_UNION_ROOM] = LoadEvent_UsedUnionRoom, [QL_EVENT_USED_UNION_ROOM_CHAT] = LoadEvent_UsedUnionRoomChat, [QL_EVENT_LINK_TRADED_UNION] = LoadEvent_LinkTradedUnionRoom, [QL_EVENT_LINK_BATTLED_UNION] = LoadEvent_LinkBattledUnionRoom, [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES] = LoadEvent_SwitchedMonsBetweenBoxes, [QL_EVENT_SWITCHED_MONS_WITHIN_BOX] = LoadEvent_SwitchedMonsWithinBox, [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = LoadEvent_SwitchedPartyMonForPCMon, [QL_EVENT_MOVED_MON_BETWEEN_BOXES] = LoadEvent_MovedMonBetweenBoxes, [QL_EVENT_MOVED_MON_WITHIN_BOX] = LoadEvent_MovedMonWithinBox, [QL_EVENT_WITHDREW_MON_PC] = LoadEvent_WithdrewMonFromPC, [QL_EVENT_DEPOSITED_MON_PC] = LoadEvent_DepositedMonInPC, [QL_EVENT_SWITCHED_MULTIPLE_MONS] = LoadEvent_SwitchedMultipleMons, [QL_EVENT_DEPOSITED_ITEM_PC] = LoadEvent_DepositedItemInPC, [QL_EVENT_WITHDREW_ITEM_PC] = LoadEvent_WithdrewItemFromPC, [QL_EVENT_DEFEATED_GYM_LEADER] = LoadEvent_DefeatedGymLeader, [QL_EVENT_DEFEATED_WILD_MON] = LoadEvent_DefeatedWildMon, [QL_EVENT_DEFEATED_E4_MEMBER] = LoadEvent_DefeatedEliteFourMember, [QL_EVENT_DEFEATED_CHAMPION] = LoadEvent_DefeatedChampion, [QL_EVENT_DEFEATED_TRAINER] = LoadEvent_DefeatedTrainer, [QL_EVENT_DEPARTED] = LoadEvent_DepartedLocation, [QL_EVENT_USED_FIELD_MOVE] = LoadEvent_UsedFieldMove, [QL_EVENT_BOUGHT_ITEM] = LoadEvent_BoughtItem, [QL_EVENT_SOLD_ITEM] = LoadEvent_SoldItem, [QL_EVENT_SCENE_END] = NULL, [QL_EVENT_OBTAINED_STORY_ITEM] = LoadEvent_ObtainedStoryItem, [QL_EVENT_WAIT] = NULL, [QL_EVENT_ARRIVED] = LoadEvent_ArrivedInLocation }; static const u8 sQuestLogEventCmdSizes[] = { [QL_EVENT_INPUT] = 8, [QL_EVENT_GFX_CHANGE] = 8, [QL_EVENT_MOVEMENT] = 8, [QL_EVENT_SWITCHED_PARTY_ORDER] = CMD_HEADER_SIZE + 4, [QL_EVENT_USED_ITEM] = CMD_HEADER_SIZE + 6, [QL_EVENT_GAVE_HELD_ITEM] = CMD_HEADER_SIZE + 4, [QL_EVENT_GAVE_HELD_ITEM_BAG] = CMD_HEADER_SIZE + 4, [QL_EVENT_GAVE_HELD_ITEM_PC] = CMD_HEADER_SIZE + 4, [QL_EVENT_TOOK_HELD_ITEM] = CMD_HEADER_SIZE + 4, [QL_EVENT_SWAPPED_HELD_ITEM] = CMD_HEADER_SIZE + 6, [QL_EVENT_SWAPPED_HELD_ITEM_PC] = CMD_HEADER_SIZE + 6, [QL_EVENT_USED_PKMN_CENTER] = CMD_HEADER_SIZE + 0, [QL_EVENT_LINK_TRADED] = CMD_HEADER_SIZE + 12, [QL_EVENT_LINK_BATTLED_SINGLE] = CMD_HEADER_SIZE + 8, [QL_EVENT_LINK_BATTLED_DOUBLE] = CMD_HEADER_SIZE + 8, [QL_EVENT_LINK_BATTLED_MULTI] = CMD_HEADER_SIZE + 22, [QL_EVENT_USED_UNION_ROOM] = CMD_HEADER_SIZE + 0, [QL_EVENT_USED_UNION_ROOM_CHAT] = CMD_HEADER_SIZE + 0, [QL_EVENT_LINK_TRADED_UNION] = CMD_HEADER_SIZE + 12, [QL_EVENT_LINK_BATTLED_UNION] = CMD_HEADER_SIZE + 8, [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES] = CMD_HEADER_SIZE + 6, [QL_EVENT_SWITCHED_MONS_WITHIN_BOX] = CMD_HEADER_SIZE + 6, [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = CMD_HEADER_SIZE + 6, [QL_EVENT_MOVED_MON_BETWEEN_BOXES] = CMD_HEADER_SIZE + 4, [QL_EVENT_MOVED_MON_WITHIN_BOX] = CMD_HEADER_SIZE + 4, [QL_EVENT_WITHDREW_MON_PC] = CMD_HEADER_SIZE + 4, [QL_EVENT_DEPOSITED_MON_PC] = CMD_HEADER_SIZE + 4, [QL_EVENT_SWITCHED_MULTIPLE_MONS] = CMD_HEADER_SIZE + 2, [QL_EVENT_DEPOSITED_ITEM_PC] = CMD_HEADER_SIZE + 2, [QL_EVENT_WITHDREW_ITEM_PC] = CMD_HEADER_SIZE + 2, [QL_EVENT_DEFEATED_GYM_LEADER] = CMD_HEADER_SIZE + 8, [QL_EVENT_DEFEATED_WILD_MON] = CMD_HEADER_SIZE + 8, [QL_EVENT_DEFEATED_E4_MEMBER] = CMD_HEADER_SIZE + 8, [QL_EVENT_DEFEATED_CHAMPION] = CMD_HEADER_SIZE + 6, [QL_EVENT_DEFEATED_TRAINER] = CMD_HEADER_SIZE + 8, [QL_EVENT_DEPARTED] = CMD_HEADER_SIZE + 2, [QL_EVENT_USED_FIELD_MOVE] = CMD_HEADER_SIZE + 4, [QL_EVENT_BOUGHT_ITEM] = CMD_HEADER_SIZE + 10, [QL_EVENT_SOLD_ITEM] = CMD_HEADER_SIZE + 10, [QL_EVENT_SCENE_END] = 2, [QL_EVENT_OBTAINED_STORY_ITEM] = CMD_HEADER_SIZE + 4, [QL_EVENT_WAIT] = 4, [QL_EVENT_ARRIVED] = CMD_HEADER_SIZE + 2 }; static const u8 *const sDefeatedOpponentFlavorTexts[] = { gText_QuestLog_Handily, gText_QuestLog_Tenaciously, gText_QuestLog_Somehow }; static const u8 *const sDefeatedChampionFlavorTexts[] = { gText_QuestLog_Coolly, gText_QuestLog_Somehow, gText_QuestLog_Barely }; static const u8 *const sBattleOutcomeTexts[] = { [B_OUTCOME_WON - 1] = gText_QuestLog_Win, [B_OUTCOME_LOST - 1] = gText_QuestLog_Loss, [B_OUTCOME_DREW - 1] = gText_QuestLog_Draw, }; static const u8 *const sLocationNameTexts[] = { [QL_LOCATION_HOME] = gText_QuestLog_Home, [QL_LOCATION_OAKS_LAB] = gText_QuestLog_OakResearchLab, [QL_LOCATION_VIRIDIAN_GYM] = gText_QuestLog_Gym, [QL_LOCATION_LEAGUE_GATE_1] = gText_QuestLog_PokemonLeagueGate, [QL_LOCATION_LEAGUE_GATE_2] = gText_QuestLog_PokemonLeagueGate, [QL_LOCATION_VIRIDIAN_FOREST_1] = gText_QuestLog_ViridianForest, [QL_LOCATION_VIRIDIAN_FOREST_2] = gText_QuestLog_ViridianForest, [QL_LOCATION_PEWTER_MUSEUM] = gText_QuestLog_PewterMuseumOfScience, [QL_LOCATION_PEWTER_GYM] = gText_QuestLog_Gym, [QL_LOCATION_MT_MOON_1] = gText_QuestLog_MtMoon, [QL_LOCATION_MT_MOON_2] = gText_QuestLog_MtMoon, [QL_LOCATION_CERULEAN_GYM] = gText_QuestLog_Gym, [QL_LOCATION_BIKE_SHOP] = gText_QuestLog_BikeShop, [QL_LOCATION_BILLS_HOUSE] = gText_QuestLog_BillsHouse, [QL_LOCATION_DAY_CARE] = gText_QuestLog_DayCare, [QL_LOCATION_UNDERGROUND_PATH_1] = gText_QuestLog_UndergroundPath, [QL_LOCATION_UNDERGROUND_PATH_2] = gText_QuestLog_UndergroundPath, [QL_LOCATION_PKMN_FAN_CLUB] = gText_QuestLog_PokemonFanClub, [QL_LOCATION_VERMILION_GYM] = gText_QuestLog_Gym, [QL_LOCATION_SS_ANNE] = gText_QuestLog_SSAnne, [QL_LOCATION_DIGLETTS_CAVE_1] = gText_QuestLog_DiglettsCave, [QL_LOCATION_DIGLETTS_CAVE_2] = gText_QuestLog_DiglettsCave, [QL_LOCATION_ROCK_TUNNEL_1] = gText_QuestLog_RockTunnel, [QL_LOCATION_ROCK_TUNNEL_2] = gText_QuestLog_RockTunnel, [QL_LOCATION_POWER_PLANT] = gText_QuestLog_PowerPlant, [QL_LOCATION_PKMN_TOWER] = gText_QuestLog_PokemonTower, [QL_LOCATION_VOLUNTEER_HOUSE] = gText_QuestLog_VolunteerHouse, [QL_LOCATION_NAME_RATERS_HOUSE] = gText_QuestLog_NameRatersHouse, [QL_LOCATION_UNDERGROUND_PATH_3] = gText_QuestLog_UndergroundPath, [QL_LOCATION_UNDERGROUND_PATH_4] = gText_QuestLog_UndergroundPath, [QL_LOCATION_CELADON_DEPT_STORE] = gText_QuestLog_CeladonDeptStore, [QL_LOCATION_CELADON_MANSION] = gText_QuestLog_CeladonMansion, [QL_LOCATION_GAME_CORNER] = gText_QuestLog_RocketGameCorner, [QL_LOCATION_CELADON_GYM] = gText_QuestLog_Gym, [QL_LOCATION_CELADON_RESTAURANT] = gText_QuestLog_Restaurant, [QL_LOCATION_ROCKET_HIDEOUT] = gText_QuestLog_RocketHideout, [QL_LOCATION_SAFARI_ZONE] = gText_QuestLog_SafariZone, [QL_LOCATION_FUCHSIA_GYM] = gText_QuestLog_Gym, [QL_LOCATION_WARDENS_HOME] = gText_QuestLog_WardensHome, [QL_LOCATION_FIGHTING_DOJO] = gText_QuestLog_FightingDojo, [QL_LOCATION_SAFFRON_GYM] = gText_QuestLog_Gym, [QL_LOCATION_SILPH_CO] = gText_QuestLog_SilphCo, [QL_LOCATION_SEAFOAM_ISLANDS_1] = gText_QuestLog_SeafoamIslands, [QL_LOCATION_SEAFOAM_ISLANDS_2] = gText_QuestLog_SeafoamIslands, [QL_LOCATION_PKMN_MANSION] = gText_QuestLog_PokemonMansion, [QL_LOCATION_CINNABAR_GYM] = gText_QuestLog_Gym, [QL_LOCATION_CINNABAR_LAB] = gText_QuestLog_PokemonResearchLab, [QL_LOCATION_VICTORY_ROAD_1] = gText_QuestLog_VictoryRoad, [QL_LOCATION_VICTORY_ROAD_2] = gText_QuestLog_VictoryRoad, [QL_LOCATION_PKMN_LEAGUE] = gText_QuestLog_PokemonLeague, [QL_LOCATION_CERULEAN_CAVE] = gText_QuestLog_CeruleanCave }; static const u8 *const sDepartedLocationTexts[] = { [QL_DEPARTED_TOWN_BUILDING] = gText_QuestLog_DepartedPlaceInTownForNextDestination, [QL_DEPARTED_MUSEUM] = gText_QuestLog_LeftTownsLocationForNextDestination, [QL_DEPARTED_GAME_CORNER] = gText_QuestLog_PlayedGamesAtGameCorner, [QL_DEPARTED_HOME] = gText_QuestLog_RestedAtHome, [QL_DEPARTED_OAKS_LAB] = gText_QuestLog_LeftOaksLab, [QL_DEPARTED_GYM] = gText_QuestLog_GymWasFullOfToughTrainers, [QL_DEPARTED_SAFARI_ZONE] = gText_QuestLog_HadGreatTimeInSafariZone, [QL_DEPARTED_CAVE] = gText_QuestLog_ManagedToGetOutOfLocation, [QL_DEPARTED_MISC_BUILDING_1] = gText_QuestLog_DepartedTheLocationForNextDestination, [QL_DEPARTED_MISC_BUILDING_2] = gText_QuestLog_DepartedFromLocationToNextDestination }; static const u8 sLocationToDepartedTextId[] = { [QL_LOCATION_HOME] = QL_DEPARTED_HOME, [QL_LOCATION_OAKS_LAB] = QL_DEPARTED_OAKS_LAB, [QL_LOCATION_VIRIDIAN_GYM] = QL_DEPARTED_GYM, [QL_LOCATION_LEAGUE_GATE_1] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_LEAGUE_GATE_2] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_VIRIDIAN_FOREST_1] = QL_DEPARTED_CAVE, [QL_LOCATION_VIRIDIAN_FOREST_2] = QL_DEPARTED_CAVE, [QL_LOCATION_PEWTER_MUSEUM] = QL_DEPARTED_MUSEUM, [QL_LOCATION_PEWTER_GYM] = QL_DEPARTED_GYM, [QL_LOCATION_MT_MOON_1] = QL_DEPARTED_CAVE, [QL_LOCATION_MT_MOON_2] = QL_DEPARTED_CAVE, [QL_LOCATION_CERULEAN_GYM] = QL_DEPARTED_GYM, [QL_LOCATION_BIKE_SHOP] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_BILLS_HOUSE] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_DAY_CARE] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_UNDERGROUND_PATH_1] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_UNDERGROUND_PATH_2] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_PKMN_FAN_CLUB] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_VERMILION_GYM] = QL_DEPARTED_GYM, [QL_LOCATION_SS_ANNE] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_DIGLETTS_CAVE_1] = QL_DEPARTED_CAVE, [QL_LOCATION_DIGLETTS_CAVE_2] = QL_DEPARTED_CAVE, [QL_LOCATION_ROCK_TUNNEL_1] = QL_DEPARTED_CAVE, [QL_LOCATION_ROCK_TUNNEL_2] = QL_DEPARTED_CAVE, [QL_LOCATION_POWER_PLANT] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_PKMN_TOWER] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_VOLUNTEER_HOUSE] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_NAME_RATERS_HOUSE] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_UNDERGROUND_PATH_3] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_UNDERGROUND_PATH_4] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_CELADON_DEPT_STORE] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_CELADON_MANSION] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_GAME_CORNER] = QL_DEPARTED_GAME_CORNER, [QL_LOCATION_CELADON_GYM] = QL_DEPARTED_GYM, [QL_LOCATION_CELADON_RESTAURANT] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_ROCKET_HIDEOUT] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_SAFARI_ZONE] = QL_DEPARTED_SAFARI_ZONE, [QL_LOCATION_FUCHSIA_GYM] = QL_DEPARTED_GYM, [QL_LOCATION_WARDENS_HOME] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_FIGHTING_DOJO] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_SAFFRON_GYM] = QL_DEPARTED_GYM, [QL_LOCATION_SILPH_CO] = QL_DEPARTED_MISC_BUILDING_2, [QL_LOCATION_SEAFOAM_ISLANDS_1] = QL_DEPARTED_CAVE, [QL_LOCATION_SEAFOAM_ISLANDS_2] = QL_DEPARTED_CAVE, [QL_LOCATION_PKMN_MANSION] = QL_DEPARTED_MISC_BUILDING_2, [QL_LOCATION_CINNABAR_GYM] = QL_DEPARTED_GYM, [QL_LOCATION_CINNABAR_LAB] = QL_DEPARTED_TOWN_BUILDING, [QL_LOCATION_VICTORY_ROAD_1] = QL_DEPARTED_CAVE, [QL_LOCATION_VICTORY_ROAD_2] = QL_DEPARTED_CAVE, [QL_LOCATION_PKMN_LEAGUE] = QL_DEPARTED_MISC_BUILDING_1, [QL_LOCATION_CERULEAN_CAVE] = QL_DEPARTED_CAVE }; static const u8 sGymCityMapSecs[NUM_BADGES] = { MAPSEC_PEWTER_CITY, MAPSEC_CERULEAN_CITY, MAPSEC_VERMILION_CITY, MAPSEC_CELADON_CITY, MAPSEC_FUCHSIA_CITY, MAPSEC_SAFFRON_CITY, MAPSEC_CINNABAR_ISLAND, MAPSEC_VIRIDIAN_CITY, }; static const u8 *const sUsedFieldMoveTexts[] = { [FIELD_MOVE_FLASH] = gText_QuestLog_UsedFlash, [FIELD_MOVE_CUT] = gText_QuestLog_UsedCut, [FIELD_MOVE_FLY] = gText_QuestLog_UsedFly, [FIELD_MOVE_STRENGTH] = gText_QuestLog_UsedStrength, [FIELD_MOVE_SURF] = gText_QuestLog_UsedSurf, [FIELD_MOVE_ROCK_SMASH] = gText_QuestLog_UsedRockSmash, [FIELD_MOVE_WATERFALL] = gText_QuestLog_UsedWaterfall, [FIELD_MOVE_TELEPORT] = gText_QuestLog_UsedTeleportToLocation, [FIELD_MOVE_DIG] = gText_QuestLog_UsedDigInLocation, [FIELD_MOVE_MILK_DRINK] = gText_QuestLog_UsedMilkDrink, [FIELD_MOVE_SOFT_BOILED] = gText_QuestLog_UsedSoftboiled, [FIELD_MOVE_SWEET_SCENT] = gText_QuestLog_UsedSweetScent }; static const u16 sWorldMapFlags[] = { FLAG_WORLD_MAP_VIRIDIAN_CITY, FLAG_WORLD_MAP_PEWTER_CITY, FLAG_WORLD_MAP_CERULEAN_CITY, FLAG_WORLD_MAP_LAVENDER_TOWN, FLAG_WORLD_MAP_VERMILION_CITY, FLAG_WORLD_MAP_CELADON_CITY, FLAG_WORLD_MAP_FUCHSIA_CITY, FLAG_WORLD_MAP_CINNABAR_ISLAND, FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR, FLAG_WORLD_MAP_SAFFRON_CITY, FLAG_WORLD_MAP_ONE_ISLAND, FLAG_WORLD_MAP_TWO_ISLAND, FLAG_WORLD_MAP_THREE_ISLAND, FLAG_WORLD_MAP_FOUR_ISLAND, FLAG_WORLD_MAP_FIVE_ISLAND, FLAG_WORLD_MAP_SEVEN_ISLAND, FLAG_WORLD_MAP_SIX_ISLAND }; void SetQuestLogEvent(u16 eventId, const u16 * data) { u16 *r1; if (eventId == QL_EVENT_DEPARTED && sStepRecordingMode == STEP_RECORDING_MODE_DISABLED_UNTIL_DEPART) { QL_EnableRecordingSteps(); return; } QL_EnableRecordingSteps(); if (gQuestLogState == QL_STATE_PLAYBACK) return; if (!IS_VALID_QL_EVENT(eventId)) return; // Certain locations like Trainer Tower do not allow Quest Log events to be recorded if (InQuestLogDisabledLocation() == TRUE) return; if (TryDeferLinkEvent(eventId, data) == TRUE) return; // Link events handled above. If we're in an active link, don't record any other events. if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE) return; if (TryDeferTrainerBattleEvent(eventId, data) == TRUE) return; // Wild battles with static encounter species (Snorlax, Mewtwo, etc.) are not recorded. if (IsEventWithSpecialEncounterSpecies(eventId, data) == TRUE) return; // If player departed Game Corner without using the slots, don't record it if (ShouldRegisterEvent_DepartedGameCorner(eventId, data) == FALSE) return; if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED) { if (ShouldRegisterEvent_HandlePartyActions(eventId, data) == TRUE) return; if (eventId != QL_EVENT_DEFEATED_WILD_MON || gQuestLogDefeatedWildMonRecord == NULL) { if (ShouldRegisterEvent_HandleDeparted(eventId, data) == FALSE) return; QL_StartRecordingAction(eventId); } } else if (eventId == QL_EVENT_OBTAINED_STORY_ITEM) return; UpdateRepeatEventCounter(eventId); if (eventId == QL_EVENT_DEFEATED_WILD_MON) { if (gQuestLogDefeatedWildMonRecord == NULL) { gQuestLogDefeatedWildMonRecord = gQuestLogRecordingPointer; r1 = sRecordEventFuncs[eventId](gQuestLogDefeatedWildMonRecord, data); } else { sRecordEventFuncs[eventId](gQuestLogDefeatedWildMonRecord, data); return; } } else { gQuestLogDefeatedWildMonRecord = NULL; r1 = sRecordEventFuncs[eventId](gQuestLogRecordingPointer, data); } if (r1 == NULL) { QL_FinishRecordingScene(); r1 = ShouldRegisterEvent(eventId, data); if (!r1) return; } gQuestLogRecordingPointer = r1; if (sStepRecordingMode == STEP_RECORDING_MODE_ENABLED) return; QL_FinishRecordingScene(); } static bool8 InQuestLogDisabledLocation(void) { // In Trainer Tower if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_1F) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_1F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_2F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_3F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_4F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_5F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_6F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_7F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_8F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ROOF) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR))) return TRUE; // In pokemon trainer fan club if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB)) return TRUE; // In E-Reader house if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_HOUSE_ROOM1) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM1) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM2))) return TRUE; // In elevator if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROCKET_HIDEOUT_ELEVATOR)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SILPH_CO_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SILPH_CO_ELEVATOR)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR))) return TRUE; return FALSE; } bool8 QuestLog_ShouldEndSceneOnMapChange(void) { if (InQuestLogDisabledLocation() != TRUE) return FALSE; if (gQuestLogState == QL_STATE_PLAYBACK) return TRUE; if (gQuestLogState == QL_STATE_RECORDING) QuestLog_CutRecording(); return FALSE; } static bool8 ShouldRegisterEvent_HandlePartyActions(u16 eventId, const u16 * data) { if (eventId == QL_EVENT_USED_FIELD_MOVE || eventId == QL_EVENT_USED_PKMN_CENTER) return TRUE; if (!FlagGet(FLAG_SYS_GAME_CLEAR)) { if (eventId == QL_EVENT_SWITCHED_PARTY_ORDER || eventId == QL_EVENT_DEFEATED_WILD_MON || ShouldRegisterEvent_HandleBeatStoryTrainer(eventId, data) == TRUE) return TRUE; } if (!FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) { if (eventId == QL_EVENT_USED_ITEM || eventId == QL_EVENT_GAVE_HELD_ITEM || eventId == QL_EVENT_GAVE_HELD_ITEM_BAG || eventId == QL_EVENT_GAVE_HELD_ITEM_PC || eventId == QL_EVENT_TOOK_HELD_ITEM || eventId == QL_EVENT_SWAPPED_HELD_ITEM || eventId == QL_EVENT_SWAPPED_HELD_ITEM_PC || eventId == QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON || eventId == QL_EVENT_WITHDREW_MON_PC || eventId == QL_EVENT_DEPOSITED_MON_PC) return TRUE; } return FALSE; } static bool8 ShouldRegisterEvent_HandleBeatStoryTrainer(u16 eventId, const u16 * genericData) { struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; if (eventId == QL_EVENT_DEFEATED_TRAINER) { const struct QuestLogEvent_TrainerBattle * data = (struct QuestLogEvent_TrainerBattle *)genericData; u8 trainerClass = sTrainers[data->trainerId].trainerClass; if (trainerClass == TRAINER_CLASS_RIVAL_EARLY || trainerClass == TRAINER_CLASS_RIVAL_LATE || trainerClass == TRAINER_CLASS_CHAMPION || trainerClass == TRAINER_CLASS_BOSS) return FALSE; return TRUE; } return FALSE; } void QL_EnableRecordingSteps(void) { sStepRecordingMode = STEP_RECORDING_MODE_ENABLED; } static u16 *ShouldRegisterEvent(u16 eventId, const u16 * data) { if (ShouldRegisterEvent_HandlePartyActions(eventId, data) == TRUE) return NULL; if (ShouldRegisterEvent_HandleDeparted(eventId, data) == FALSE) return NULL; QL_StartRecordingAction(eventId); UpdateRepeatEventCounter(eventId); if (eventId == QL_EVENT_DEFEATED_WILD_MON) gQuestLogDefeatedWildMonRecord = gQuestLogRecordingPointer; else gQuestLogDefeatedWildMonRecord = NULL; return sRecordEventFuncs[eventId](gQuestLogRecordingPointer, data); } static bool8 TryDeferLinkEvent(u16 eventId, const u16 * data) { if (!IS_LINK_QL_EVENT(eventId)) return FALSE; ResetDeferredLinkEvent(); sDeferredEvent.id = eventId; // These two events have no data, so no need to copy if (eventId != QL_EVENT_USED_UNION_ROOM && eventId != QL_EVENT_USED_UNION_ROOM_CHAT) { if (eventId == QL_EVENT_LINK_TRADED || eventId == QL_EVENT_LINK_TRADED_UNION) memcpy(sDeferredEvent.data, data, sizeof(struct QuestLogEvent_Traded)); else memcpy(sDeferredEvent.data, data, sizeof(struct QuestLogEvent_LinkBattle)); } return TRUE; } void ResetDeferredLinkEvent(void) { sDeferredEvent = (struct DeferredLinkEvent){}; } void QuestLog_StartRecordingInputsAfterDeferredEvent(void) { if (sDeferredEvent.id != 0) { u16 *resp; sLastDepartedLocation = 0; QL_StartRecordingAction(sDeferredEvent.id); resp = sRecordEventFuncs[sDeferredEvent.id](gQuestLogRecordingPointer, sDeferredEvent.data); gQuestLogRecordingPointer = resp; ResetDeferredLinkEvent(); } } static bool8 TryDeferTrainerBattleEvent(u16 eventId, const u16 * data) { if (eventId != QL_EVENT_DEFEATED_TRAINER && eventId != QL_EVENT_DEFEATED_GYM_LEADER && eventId != QL_EVENT_DEFEATED_E4_MEMBER && eventId != QL_EVENT_DEFEATED_CHAMPION) return FALSE; ResetDeferredLinkEvent(); if (gQuestLogPlaybackState != QL_PLAYBACK_STATE_STOPPED || FlagGet(FLAG_SYS_GAME_CLEAR) || ShouldRegisterEvent_HandleBeatStoryTrainer(eventId, data) != TRUE) { sDeferredEvent.id = eventId; memcpy(sDeferredEvent.data, data, sizeof(struct QuestLogEvent_TrainerBattle)); } return TRUE; } void QuestLogEvents_HandleEndTrainerBattle(void) { if (sDeferredEvent.id != 0) { u16 *resp; if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED) { sLastDepartedLocation = 0; QL_StartRecordingAction(sDeferredEvent.id); } UpdateRepeatEventCounter(sDeferredEvent.id); resp = sRecordEventFuncs[sDeferredEvent.id](gQuestLogRecordingPointer, sDeferredEvent.data); gQuestLogRecordingPointer = resp; QL_RecordWait(1); ResetDeferredLinkEvent(); QL_FinishRecordingScene(); } } void QL_RecordWait(u16 duration) { gQuestLogRecordingPointer = QL_RecordAction_Wait(gQuestLogRecordingPointer, duration); gQuestLogCurActionIdx++; } static bool8 IsEventWithSpecialEncounterSpecies(u16 eventId, const u16 * genericData) { const struct QuestLogEvent_WildBattle * data; if (eventId != QL_EVENT_DEFEATED_WILD_MON) return FALSE; data = (struct QuestLogEvent_WildBattle *)genericData; if (IsSpeciesFromSpecialEncounter(data->defeatedSpecies) == TRUE) return TRUE; if (IsSpeciesFromSpecialEncounter(data->caughtSpecies) == TRUE) return TRUE; return FALSE; } u16 *QL_SkipCommand(u16 *curPtr, u16 **prevPtr_p) { u16 eventId = curPtr[0] & QL_CMD_EVENT_MASK; u16 count = curPtr[0] >> QL_CMD_COUNT_SHIFT; if (eventId == QL_EVENT_DEFEATED_CHAMPION) count = 0; if (!IS_VALID_QL_EVENT(eventId)) return NULL; *prevPtr_p = curPtr; return sQuestLogEventCmdSizes[eventId] + (sQuestLogEventCmdSizes[eventId] - CMD_HEADER_SIZE) * count + (void *)curPtr; } void QL_UpdateLastDepartedLocation(const u16 *a0) { const u8 *r2 = (const u8 *)(a0 + 2); if ((a0[0] & QL_CMD_EVENT_MASK) != QL_EVENT_DEPARTED) sLastDepartedLocation = 0; else sLastDepartedLocation = r2[1] + 1; } bool8 QL_LoadEvent(const u16 *eventData) { const u16 *r0 = eventData; if (eventData == NULL) return FALSE; if (r0[1] > gQuestLogCurActionIdx) return FALSE; sLoadEventFuncs[(r0[0] & QL_CMD_EVENT_MASK)](eventData); gQuestLogRepeatEventTracker.id = r0[0]; gQuestLogRepeatEventTracker.numRepeats = (r0[0] & QL_CMD_COUNT_MASK) >> QL_CMD_COUNT_SHIFT; if (gQuestLogRepeatEventTracker.numRepeats != 0) gQuestLogRepeatEventTracker.counter = 1; return TRUE; } bool8 QL_TryRepeatEvent(const u16 *eventData) { // This is the first for a new event, do nothing. Counter may be changed later by QL_LoadEvent. if (gQuestLogRepeatEventTracker.counter == 0) return FALSE; // Repeat event sLoadEventFuncs[gQuestLogRepeatEventTracker.id](eventData); if (++gQuestLogRepeatEventTracker.counter > gQuestLogRepeatEventTracker.numRepeats) QL_ResetRepeatEventTracker(); return TRUE; } void QL_ResetRepeatEventTracker(void) { gQuestLogRepeatEventTracker = (struct QuestLogRepeatEventTracker){}; } static void UpdateRepeatEventCounter(u16 eventId) { if (gQuestLogRepeatEventTracker.id != (u8)eventId || gQuestLogRepeatEventTracker.counter != gQuestLogCurActionIdx) { gQuestLogRepeatEventTracker.id = eventId; gQuestLogRepeatEventTracker.numRepeats = 0; gQuestLogRepeatEventTracker.counter = gQuestLogCurActionIdx; } // Allow 1 over the max. It will be recorded temporarily, ultimately replacing the oldest record. else if (gQuestLogRepeatEventTracker.numRepeats < MAX_CMD_REPEAT + 1) { gQuestLogRepeatEventTracker.numRepeats++; } } void QL_ResetEventStates(void) { sNewlyEnteredMap = FALSE; sLastDepartedLocation = 0; sPlayedTheSlots = FALSE; } u16 *QL_RecordAction_SceneEnd(u16 *a0) { if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_SCENE_END])) return NULL; a0[0] = QL_EVENT_SCENE_END; return a0 + 1; } u16 *QL_LoadAction_SceneEnd(u16 *a0, struct QuestLogAction * a1) { if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_SCENE_END])) return NULL; a1->type = QL_ACTION_SCENE_END; a1->duration = 0; a1->data.raw[0] = 0; a1->data.raw[1] = 0; a1->data.raw[2] = 0; a1->data.raw[3] = 0; return a0 + 1; } static u16 *QL_RecordAction_Wait(u16 *a0, u16 duration) { if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_WAIT])) return NULL; a0[0] = QL_EVENT_WAIT; a0[1] = duration; return a0 + 2; } u16 *QL_LoadAction_Wait(u16 *a0, struct QuestLogAction * a1) { if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_WAIT])) return NULL; a1->type = QL_ACTION_WAIT; a1->duration = a0[1]; a1->data.raw[0] = 0; a1->data.raw[1] = 0; a1->data.raw[2] = 0; a1->data.raw[3] = 0; return a0 + 2; } u16 *QL_RecordAction_Input(u16 *script, struct QuestLogAction * a1) { u8 *r6 = (u8 *)script + 4; if (!QL_IsRoomToSaveAction(script, sQuestLogEventCmdSizes[QL_EVENT_INPUT])) return NULL; script[0] = QL_EVENT_INPUT; script[1] = a1->duration; r6[0] = a1->data.raw[0]; r6[1] = a1->data.raw[1]; r6[2] = a1->data.raw[2]; r6[3] = a1->data.raw[3]; return (u16 *)(r6 + 4); } u16 *QL_LoadAction_Input(u16 *a0, struct QuestLogAction * a1) { u8 *r6 = (u8 *)a0 + 4; if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_INPUT])) return NULL; a1->type = QL_ACTION_INPUT; a1->duration = a0[1]; a1->data.raw[0] = r6[0]; a1->data.raw[1] = r6[1]; a1->data.raw[2] = r6[2]; a1->data.raw[3] = r6[3]; return (u16 *)(r6 + 4); } u16 *QL_RecordAction_MovementOrGfxChange(u16 *script, struct QuestLogAction * a1) { u16 *r4 = script; u8 *r6 = (u8 *)script + 4; if (!QL_IsRoomToSaveAction(r4, sQuestLogEventCmdSizes[QL_EVENT_MOVEMENT])) return NULL; if (a1->type == QL_ACTION_MOVEMENT) r4[0] = QL_EVENT_MOVEMENT; else r4[0] = QL_EVENT_GFX_CHANGE; r4[1] = a1->duration; r6[0] = a1->data.raw[0]; r6[1] = a1->data.raw[1]; r6[2] = a1->data.raw[2]; r6[3] = a1->data.raw[3]; return (u16 *)(r6 + 4); } u16 *QL_LoadAction_MovementOrGfxChange(u16 *a0, struct QuestLogAction * a1) { u16 *r5 = a0; u8 *r6 = (u8 *)a0 + 4; if (!QL_IsRoomToSaveAction(r5, sQuestLogEventCmdSizes[QL_EVENT_MOVEMENT])) return NULL; if (r5[0] == QL_EVENT_MOVEMENT) a1->type = QL_ACTION_MOVEMENT; else a1->type = QL_ACTION_GFX_CHANGE; a1->duration = r5[1]; a1->data.raw[0] = r6[0]; a1->data.raw[1] = r6[1]; a1->data.raw[2] = r6[2]; a1->data.raw[3] = r6[3]; return (u16 *)(r6 + 4); } static u16 *RecordEventHeader(u16 eventId, u16 *dest) { u8 cmdSize; u16 *record; u8 i; u8 count; if (gQuestLogRepeatEventTracker.numRepeats == 0) cmdSize = sQuestLogEventCmdSizes[eventId]; else cmdSize = sQuestLogEventCmdSizes[eventId] - CMD_HEADER_SIZE; // First will already have the header if (!QL_IsRoomToSaveEvent(dest, cmdSize)) return NULL; record = (void *)dest; if (gQuestLogRepeatEventTracker.numRepeats != 0) record = (void *)record - (gQuestLogRepeatEventTracker.numRepeats * cmdSize + CMD_HEADER_SIZE); if (gQuestLogRepeatEventTracker.numRepeats == MAX_CMD_REPEAT + 1) { // Shift back one, replacing oldest for (i = 0; i < MAX_CMD_REPEAT; i++) { memcpy( (void *)record + ((i + 0) * cmdSize + CMD_HEADER_SIZE), (void *)record + ((i + 1) * cmdSize + CMD_HEADER_SIZE), cmdSize ); } count = MAX_CMD_REPEAT; } else count = gQuestLogRepeatEventTracker.numRepeats; // Set header data (CMD_HEADER_SIZE) record[0] = eventId + (count << QL_CMD_COUNT_SHIFT); record[1] = gQuestLogCurActionIdx; // Move past header and event data record = (void *)record + (count * cmdSize + CMD_HEADER_SIZE); return record; } static const u16 *LoadEvent(u16 eventId, const u16 *eventData) { eventData = (const void *)eventData + (gQuestLogRepeatEventTracker.counter * (sQuestLogEventCmdSizes[eventId] - CMD_HEADER_SIZE) + CMD_HEADER_SIZE); return eventData; } static void QuestLog_GetSpeciesName(u16 species, u8 *dest, u8 stringVarId) { if (dest != NULL) { if (species != SPECIES_EGG) bufferspeciesname(dest, species); else StringCopy(dest, gText_EggNickname); } else { if (species != SPECIES_EGG) DynamicPlaceholderTextUtil_SetPlaceholderPtr(stringVarId, gSpeciesNames[species]); else DynamicPlaceholderTextUtil_SetPlaceholderPtr(stringVarId, gText_EggNickname); } } static u16 *RecordEvent_SwitchedPartyOrder(u16 *dest, const struct QuestLogEvent_SwitchedPartyOrder * data) { u16 *r2 = RecordEventHeader(QL_EVENT_SWITCHED_PARTY_ORDER, dest); if (r2 == NULL) return NULL; r2[0] = data->species1; r2[1] = data->species2; return r2 + 2; } static const u16 *LoadEvent_SwitchedPartyOrder(const u16 *eventData) { const u16 *r4 = LoadEvent(QL_EVENT_SWITCHED_PARTY_ORDER, eventData); QuestLog_GetSpeciesName(r4[0], gStringVar1, 0); QuestLog_GetSpeciesName(r4[1], gStringVar2, 0); StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchMon1WithMon2); return r4 + 2; } #define rItemId record[0] #define rSpecies record[1] #define rItemParam record[2] static u16 *RecordEvent_UsedItem(u16 *dest, const struct QuestLogEvent_Item * data) { u16 *record = RecordEventHeader(QL_EVENT_USED_ITEM, dest); if (record == NULL) return NULL; rItemId = data->itemId; rSpecies = data->species; rItemParam = data->itemParam; if (data->itemId == ITEM_ESCAPE_ROPE) sStepRecordingMode = STEP_RECORDING_MODE_DISABLED_UNTIL_DEPART; return record + 3; } static const u16 *LoadEvent_UsedItem(const u16 *eventData) { const u16 *record = LoadEvent(QL_EVENT_USED_ITEM, eventData); switch (ItemId_GetPocket(rItemId)) { case POCKET_ITEMS: case POCKET_POKE_BALLS: case POCKET_BERRY_POUCH: case POCKET_MEDICINE: case POCKET_HELD_ITEMS: StringCopy(gStringVar1, ItemId_GetName(rItemId)); if (rItemId == ITEM_ESCAPE_ROPE) { GetMapNameGeneric(gStringVar2, (u8)rItemParam); StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedEscapeRope); } else if (rSpecies != 0xFFFF) { QuestLog_GetSpeciesName(rSpecies, gStringVar2, 0); StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedItemOnMonAtThisLocation); } else { StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheItem); } break; case POCKET_KEY_ITEMS: StringCopy(gStringVar1, ItemId_GetName(rItemId)); StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheKeyItem); break; case POCKET_TM_CASE: QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0); StringCopy(gStringVar2, gMoveNames[ItemIdToBattleMoveId(rItemId)]); if (rItemParam != 0xFFFF) { StringCopy(gStringVar3, gMoveNames[rItemParam]); if (rItemId >= ITEM_HM01) StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithHM); else StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithTM); } else { if (rItemId >= ITEM_HM01) StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromHM); else StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromTM); } break; } return record + 3; } static u16 *RecordEvent_GiveTakeHeldItem(u16 eventId, u16 *dest, const struct QuestLogEvent_Item * data) { u16 *record = RecordEventHeader(eventId, dest); if (record == NULL) return NULL; rItemId = data->itemId; rSpecies = data->species; return record + 2; } static u16 *RecordEvent_GaveHeldItemFromPartyMenu(u16 *dest, const struct QuestLogEvent_Item * data) { return RecordEvent_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM, dest, data); } static const u16 *LoadEvent_GaveHeldItemFromPartyMenu(const u16 * eventData) { const u16 *record = LoadEvent(QL_EVENT_GAVE_HELD_ITEM, eventData); QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0); StringCopy(gStringVar2, ItemId_GetName(rItemId)); StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem); return record + 2; } static u16 *RecordEvent_GaveHeldItemFromBagMenu(u16 *dest, const struct QuestLogEvent_Item * data) { return RecordEvent_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM_BAG, dest, data); } static const u16 *LoadEvent_GaveHeldItemFromBagMenu(const u16 *eventData) { const u16 *record = LoadEvent(QL_EVENT_GAVE_HELD_ITEM_BAG, eventData); QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0); StringCopy(gStringVar2, ItemId_GetName(rItemId)); StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem2); return record + 2; } static u16 *RecordEvent_GaveHeldItemFromPC(u16 *dest, const struct QuestLogEvent_Item * data) { return RecordEvent_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM_PC, dest, data); } static const u16 *LoadEvent_GaveHeldItemFromPC(const u16 *eventData) { const u16 *record = LoadEvent(QL_EVENT_GAVE_HELD_ITEM_PC, eventData); QuestLog_GetSpeciesName(rSpecies, gStringVar2, 0); StringCopy(gStringVar1, ItemId_GetName(rItemId)); StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItemFromPC); return record + 2; } static u16 *RecordEvent_TookHeldItem(u16 *dest, const struct QuestLogEvent_Item * data) { return RecordEvent_GiveTakeHeldItem(QL_EVENT_TOOK_HELD_ITEM, dest, data); } static const u16 *LoadEvent_TookHeldItem(const u16 *eventData) { const u16 *record = LoadEvent(QL_EVENT_TOOK_HELD_ITEM, eventData); QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0); StringCopy(gStringVar2, ItemId_GetName(rItemId)); StringExpandPlaceholders(gStringVar4, gText_QuestLog_TookHeldItemFromMon); return record + 2; } #undef rItemId #undef rSpecies #undef rItemParam #define rTakenItemId record[0] #define rGivenItemId record[1] #define rSpecies record[2] static u16 *RecordEvent_SwappedHeldItem(u16 eventId, u16 *dest, const struct QuestLogEvent_SwappedHeldItem * data) { u16 *record = RecordEventHeader(eventId, dest); if (record == NULL) return NULL; rTakenItemId = data->takenItemId; rGivenItemId = data->givenItemId; rSpecies = data->species; return record + 3; } static u16 *RecordEvent_SwappedHeldItemFromBag(u16 *dest, const struct QuestLogEvent_SwappedHeldItem * data) { return RecordEvent_SwappedHeldItem(QL_EVENT_SWAPPED_HELD_ITEM, dest, data); } static const u16 *LoadEvent_SwappedHeldItem(const u16 *eventData) { const u16 *record = LoadEvent(QL_EVENT_SWAPPED_HELD_ITEM, eventData); QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0); StringCopy(gStringVar2, ItemId_GetName(rTakenItemId)); StringCopy(gStringVar3, ItemId_GetName(rGivenItemId)); StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemsOnMon); return record + 3; } static u16 *RecordEvent_SwappedHeldItemFromPC(u16 *dest, const struct QuestLogEvent_SwappedHeldItem * data) { return RecordEvent_SwappedHeldItem(QL_EVENT_SWAPPED_HELD_ITEM_PC, dest, data); } static const u16 *LoadEvent_SwappedHeldItemFromPC(const u16 *eventData) { const u16 *record = LoadEvent(QL_EVENT_SWAPPED_HELD_ITEM_PC, eventData); QuestLog_GetSpeciesName(rSpecies, gStringVar2, 0); StringCopy(gStringVar3, ItemId_GetName(rTakenItemId)); StringCopy(gStringVar1, ItemId_GetName(rGivenItemId)); StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemFromPC); return record + 3; } #undef rTakenItemId #undef rGivenItemId #undef rSpecies // data argument will be a null pointer, no information needed for this event static u16 *RecordEvent_UsedPkmnCenter(u16 *dest, const u16 * data) { u16 *record = dest; if (gQuestLogRepeatEventTracker.id == QL_EVENT_USED_PKMN_CENTER && gQuestLogRepeatEventTracker.numRepeats != 0) return record; if (!QL_IsRoomToSaveEvent(dest, sQuestLogEventCmdSizes[QL_EVENT_USED_PKMN_CENTER])) return NULL; record[0] = QL_EVENT_USED_PKMN_CENTER; record[1] = gQuestLogCurActionIdx; return record + 2; } static const u16 *LoadEvent_UsedPkmnCenter(const u16 *eventData) { StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonsWereFullyRestoredAtCenter); return eventData + 2; } static u16 *RecordEvent_LinkTraded(u16 *dest, const struct QuestLogEvent_Traded * data) { u16 *nameDest = dest + 4; dest[0] = QL_EVENT_LINK_TRADED; dest[1] = gQuestLogCurActionIdx; dest[2] = data->speciesSent; dest[3] = data->speciesReceived; memcpy(nameDest, data->partnerName, PLAYER_NAME_LENGTH); return nameDest + 4; } static const u16 *LoadEvent_LinkTraded(const u16 *eventData) { const u16 *name = eventData + 4; memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); memcpy(gStringVar1, name, PLAYER_NAME_LENGTH); TranslateLinkPartnersName(gStringVar1); QuestLog_GetSpeciesName(eventData[3], gStringVar2, 0); // Mon received QuestLog_GetSpeciesName(eventData[2], gStringVar3, 0); // Mon sent StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForPersonsMon2); return name + 4; } #define rOutcome record[0] #define rBattler1Name record[1] #define rBattler2Name record[1 + PLAYER_NAME_LENGTH] #define rBattler3Name record[1 + PLAYER_NAME_LENGTH * 2] static u16 *RecordEvent_LinkBattledSingle(u16 *dest, const struct QuestLogEvent_LinkBattle * data) { u8 * record; dest[0] = QL_EVENT_LINK_BATTLED_SINGLE; dest[1] = gQuestLogCurActionIdx; record = (u8 *)(dest + 2); rOutcome = data->outcome; memcpy(&rBattler1Name, data->playerNames[0], PLAYER_NAME_LENGTH); return (u16 *)(record + 1 + PLAYER_NAME_LENGTH); } static const u16 *LoadEvent_LinkBattledSingle(const u16 *eventData) { const u8 * record = (const u8 *)(eventData + 2); DynamicPlaceholderTextUtil_Reset(); memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); memcpy(gStringVar1, &rBattler1Name, PLAYER_NAME_LENGTH); TranslateLinkPartnersName(gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[rOutcome]); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SingleBattleWithPersonResultedInOutcome); return (const u16 *)(record + 1 + PLAYER_NAME_LENGTH); } static u16 *RecordEvent_LinkBattledDouble(u16 *dest, const struct QuestLogEvent_LinkBattle * data) { u8 * record; dest[0] = QL_EVENT_LINK_BATTLED_DOUBLE; dest[1] = gQuestLogCurActionIdx; record = (u8 *)(dest + 2); rOutcome = data->outcome; memcpy(&rBattler1Name, data->playerNames[0], PLAYER_NAME_LENGTH); return (u16 *)(record + 1 + PLAYER_NAME_LENGTH); } static const u16 *LoadEvent_LinkBattledDouble(const u16 *eventData) { const u8 * record = (const u8 *)(eventData + 2); DynamicPlaceholderTextUtil_Reset(); memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); memcpy(gStringVar1, &rBattler1Name, PLAYER_NAME_LENGTH); TranslateLinkPartnersName(gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[rOutcome]); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DoubleBattleWithPersonResultedInOutcome); return (const u16 *)(record + 1 + PLAYER_NAME_LENGTH); } static u16 *RecordEvent_LinkBattledMulti(u16 *dest, const struct QuestLogEvent_LinkBattle * data) { u8 * record; dest[0] = QL_EVENT_LINK_BATTLED_MULTI; dest[1] = gQuestLogCurActionIdx; record = (u8 *)(dest + 2); rOutcome = data->outcome; memcpy(&rBattler1Name, data->playerNames[0], PLAYER_NAME_LENGTH); memcpy(&rBattler2Name, data->playerNames[1], PLAYER_NAME_LENGTH); memcpy(&rBattler3Name, data->playerNames[2], PLAYER_NAME_LENGTH); return (u16 *)(record + 1 + PLAYER_NAME_LENGTH * 3); } static const u16 *LoadEvent_LinkBattledMulti(const u16 *eventData) { const u8 * record = (const u8 *)(eventData + 2); DynamicPlaceholderTextUtil_Reset(); memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); memset(gStringVar2, EOS, PLAYER_NAME_LENGTH + 1); memset(gStringVar3, EOS, PLAYER_NAME_LENGTH + 1); StringCopy_PlayerName(gStringVar1, &rBattler1Name); StringCopy_PlayerName(gStringVar2, &rBattler2Name); StringCopy_PlayerName(gStringVar3, &rBattler3Name); TranslateLinkPartnersName(gStringVar1); TranslateLinkPartnersName(gStringVar2); TranslateLinkPartnersName(gStringVar3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); // partner DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); // opponent 1 DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); // opponent 2 DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sBattleOutcomeTexts[rOutcome]); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MultiBattleWithPeopleResultedInOutcome); return (const u16 *)(record + 1 + PLAYER_NAME_LENGTH * 3); } // data argument will be a null pointer, no information needed for this event static u16 *RecordEvent_UsedUnionRoom(u16 *dest, const u16 * data) { dest[0] = QL_EVENT_USED_UNION_ROOM; dest[1] = gQuestLogCurActionIdx; return dest + 2; } static const u16 *LoadEvent_UsedUnionRoom(const u16 *eventData) { StringExpandPlaceholders(gStringVar4, gText_QuestLog_MingledInUnionRoom); return eventData + 2; } // data argument will be a null pointer, no information needed for this event static u16 *RecordEvent_UsedUnionRoomChat(u16 *dest, const u16 * data) { dest[0] = QL_EVENT_USED_UNION_ROOM_CHAT; dest[1] = gQuestLogCurActionIdx; return dest + 2; } static const u16 *LoadEvent_UsedUnionRoomChat(const u16 *eventData) { StringExpandPlaceholders(gStringVar4, gText_QuestLog_ChattedWithManyTrainers); return eventData + 2; } static u16 *RecordEvent_LinkTradedUnionRoom(u16 *dest, const struct QuestLogEvent_Traded * data) { u8 *name = (u8 *)(dest + 4); dest[0] = QL_EVENT_LINK_TRADED_UNION; dest[1] = gQuestLogCurActionIdx; dest[2] = data->speciesSent; dest[3] = data->speciesReceived; memcpy(name, &data->partnerName, PLAYER_NAME_LENGTH); return (u16 *)(name + 8); } static const u16 *LoadEvent_LinkTradedUnionRoom(const u16 *a0) { const u8 *r6 = (const u8 *)(a0 + 4); memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH); TranslateLinkPartnersName(gStringVar1); QuestLog_GetSpeciesName(a0[3], gStringVar2, 0); QuestLog_GetSpeciesName(a0[2], gStringVar3, 0); StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForTrainersMon2); return (const u16 *)(r6 + 8); } static u16 *RecordEvent_LinkBattledUnionRoom(u16 *dest, const struct QuestLogEvent_LinkBattle * data) { dest[0] = QL_EVENT_LINK_BATTLED_UNION; dest[1] = gQuestLogCurActionIdx; *(u8 *)&dest[2] = data->outcome; memcpy((u8 *)dest + 5, &data->playerNames[0], PLAYER_NAME_LENGTH); return dest + 6; } static const u16 *LoadEvent_LinkBattledUnionRoom(const u16 *eventData) { const u8 * record = (const u8 *)(eventData + 2); memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); memcpy(gStringVar1, &rBattler1Name, PLAYER_NAME_LENGTH); TranslateLinkPartnersName(gStringVar1); StringCopy(gStringVar2, sBattleOutcomeTexts[rOutcome]); StringExpandPlaceholders(gStringVar4, gText_QuestLog_BattledTrainerEndedInOutcome); return (const u16 *)(record + 1 + PLAYER_NAME_LENGTH); } #undef rOutcome #undef rBattler1Name #undef rBattler2Name #undef rBattler3Name #define rSpecies1 record[0] #define rSpecies2 record[1] #define rBox1 (*((u8*)&record[2] + 0)) // 1st byte of record[2] #define rBox2 (*((u8*)&record[2] + 1)) // 2nd byte of record[2] static u16 *RecordEvent_SwitchedMonsBetweenBoxes(u16 *dest, const struct QuestLogEvent_MovedBoxMon * data) { u16 * record = RecordEventHeader(QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES, dest); if (record == NULL) return NULL; rSpecies1 = data->species1; rSpecies2 = data->species2; rBox1 = data->box1; rBox2 = data->box2; return record + 3; } static const u16 *LoadEvent_SwitchedMonsBetweenBoxes(const u16 *eventData) { const u8 *boxIdxs; const u16 * r0 = LoadEvent(QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES, eventData); boxIdxs = (const u8 *)r0 + 4; DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_GetSpeciesName(r0[0], NULL, 1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1])); QuestLog_GetSpeciesName(r0[1], NULL, 3); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsBetweenBoxes); return r0 + 3; } static u16 *RecordEvent_SwitchedMonsWithinBox(u16 *dest, const u16 *eventData) { dest = RecordEventHeader(QL_EVENT_SWITCHED_MONS_WITHIN_BOX, dest); if (dest == NULL) return NULL; dest[0] = eventData[0]; dest[1] = eventData[1]; *((u8 *)dest + 4) = *((const u8 *)eventData + 4); return dest + 3; } static const u16 *LoadEvent_SwitchedMonsWithinBox(const u16 *eventData) { const u8 *boxIdxs; eventData = LoadEvent(QL_EVENT_SWITCHED_MONS_WITHIN_BOX, eventData); boxIdxs = (const u8 *)eventData + 4; DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_GetSpeciesName(eventData[0], NULL, 1); QuestLog_GetSpeciesName(eventData[1], NULL, 2); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsWithinBox); return eventData + 3; } static u16 *RecordEvent_SwitchedPartyMonForPCMon(u16 *dest, const u16 *eventData) { u16 *r2; u16 *ret; r2 = RecordEventHeader(QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON, dest); if (r2 == NULL) return NULL; ret = r2 + 2; if (*((const u8 *)eventData + 4) == TOTAL_BOXES_COUNT) { r2[0] = eventData[1]; r2[1] = eventData[0]; *((u8 *)r2 + 4) = *((const u8 *)eventData + 5); } else { r2[0] = eventData[0]; r2[1] = eventData[1]; *((u8 *)r2 + 4) = *((const u8 *)eventData + 4); } return ret + 1; } static const u16 *LoadEvent_SwitchedPartyMonForPCMon(const u16 *eventData) { const u8 *boxIdxs; eventData = LoadEvent(QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON, eventData); boxIdxs = (const u8 *)eventData + 4; DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_GetSpeciesName(eventData[0], NULL, 1); QuestLog_GetSpeciesName(eventData[1], NULL, 2); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedPartyMonForPCMon); return eventData + 3; } static u16 *RecordEvent_MovedMonBetweenBoxes(u16 *dest, const u16 *eventData) { u16 *r2; u16 *ret; r2 = RecordEventHeader(QL_EVENT_MOVED_MON_BETWEEN_BOXES, dest); if (r2 == NULL) return NULL; r2[0] = eventData[0]; ret = r2 + 1; *((u8 *)ret + 0) = *((const u8 *)eventData + 4); *((u8 *)ret + 1) = *((const u8 *)eventData + 5); return ret + 1; } static const u16 *LoadEvent_MovedMonBetweenBoxes(const u16 *eventData) { const u8 *boxIdxs; eventData = LoadEvent(QL_EVENT_MOVED_MON_BETWEEN_BOXES, eventData); boxIdxs = (const u8 *)eventData + 2; DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_GetSpeciesName(eventData[0], NULL, 1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1])); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonToNewBox); return (const u16 *)boxIdxs + 1; } static u16 *RecordEvent_MovedMonWithinBox(u16 *dest, const u16 *eventData) { u16 *r2; r2 = RecordEventHeader(QL_EVENT_MOVED_MON_WITHIN_BOX, dest); if (r2 == NULL) return NULL; r2[0] = eventData[0]; *((u8 *)r2 + 2) = *((const u8 *)eventData + 4); return r2 + 2; } static const u16 *LoadEvent_MovedMonWithinBox(const u16 *eventData) { const u8 *boxIdxs; eventData = LoadEvent(QL_EVENT_MOVED_MON_WITHIN_BOX, eventData); boxIdxs = (const u8 *)eventData + 2; DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_GetSpeciesName(eventData[0], NULL, 1); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonWithinBox); return (const u16 *)boxIdxs + 1; } static u16 *RecordEvent_WithdrewMonFromPC(u16 *dest, const u16 *eventData) { u16 *r2; r2 = RecordEventHeader(QL_EVENT_WITHDREW_MON_PC, dest); if (r2 == NULL) return NULL; r2[0] = eventData[0]; *((u8 *)r2 + 2) = *((const u8 *)eventData + 4); return r2 + 2; } static const u16 *LoadEvent_WithdrewMonFromPC(const u16 *eventData) { const u8 *boxIdxs; eventData = LoadEvent(QL_EVENT_WITHDREW_MON_PC, eventData); boxIdxs = (const u8 *)eventData + 2; DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_GetSpeciesName(eventData[0], NULL, 1); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewMonFromPC); return (const u16 *)boxIdxs + 1; } static u16 *RecordEvent_DepositedMonInPC(u16 *dest, const u16 *eventData) { u16 *r2; r2 = RecordEventHeader(QL_EVENT_DEPOSITED_MON_PC, dest); if (r2 == NULL) return NULL; r2[0] = eventData[0]; *((u8 *)r2 + 2) = *((const u8 *)eventData + 4); return r2 + 2; } static const u16 *LoadEvent_DepositedMonInPC(const u16 *eventData) { const u8 *boxIdxs; eventData = LoadEvent(QL_EVENT_DEPOSITED_MON_PC, eventData); boxIdxs = (const u8 *)eventData + 2; DynamicPlaceholderTextUtil_Reset(); QuestLog_GetSpeciesName(eventData[0], NULL, 0); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(boxIdxs[0])); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DepositedMonInPC); return (const u16 *)boxIdxs + 1; } static u16 *RecordEvent_SwitchedMultipleMons(u16 *dest, const u16 *eventData) { u16 *r2; r2 = RecordEventHeader(QL_EVENT_SWITCHED_MULTIPLE_MONS, dest); if (r2 == NULL) return NULL; *((u8 *)r2 + 0) = *((const u8 *)eventData + 4); *((u8 *)r2 + 1) = *((const u8 *)eventData + 5); return r2 + 1; } static const u16 *LoadEvent_SwitchedMultipleMons(const u16 *eventData) { const u16 *r4 = LoadEvent(QL_EVENT_SWITCHED_MULTIPLE_MONS, eventData); DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(*((const u8 *)r4 + 0))); if (*((const u8 *)r4 + 0) == *((const u8 *)r4 + 1)) DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gText_QuestLog_ADifferentSpot); else DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(*((const u8 *)r4 + 1))); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMultipleMons); return r4 + 1; } #undef rSpecies1 #undef rSpecies2 #undef rBox1 #undef rBox2 #define rItemId record[0] static u16 *RecordEvent_DepositedItemInPC(u16 *dest, const struct QuestLogEvent_Item * data) { u16 * record = RecordEventHeader(QL_EVENT_DEPOSITED_ITEM_PC, dest); if (record == NULL) return NULL; rItemId = data->itemId; return record + 1; } static const u16 *LoadEvent_DepositedItemInPC(const u16 *eventData) { const u16 *record = LoadEvent(QL_EVENT_DEPOSITED_ITEM_PC, eventData); CopyItemName(rItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_QuestLog_StoredItemInPC); return record + 1; } static u16 *RecordEvent_WithdrewItemFromPC(u16 *dest, const struct QuestLogEvent_Item * data) { u16 * record = RecordEventHeader(QL_EVENT_WITHDREW_ITEM_PC, dest); if (record == NULL) return NULL; rItemId = data->itemId; return record + 1; } static const u16 *LoadEvent_WithdrewItemFromPC(const u16 *eventData) { const u16 *record = LoadEvent(QL_EVENT_WITHDREW_ITEM_PC, eventData); CopyItemName(rItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewItemFromPC); return record + 1; } #undef rItemId #define rSpeciesOpponent record[0] #define rSpeciesPlayer record[1] #define rTrainerId record[2] #define rMapSec (*((u8*)&record[3] + 0)) // 1st byte of record[3] #define rHpFractionId (*((u8*)&record[3] + 1)) // 2nd byte of record[3] static u16 *RecordEvent_DefeatedTrainer(u16 eventId, u16 *dest, const struct QuestLogEvent_TrainerBattle * data) { u16 * record = RecordEventHeader(eventId, dest); if (record == NULL) return NULL; rSpeciesOpponent = data->speciesOpponent; rSpeciesPlayer = data->speciesPlayer; rTrainerId = data->trainerId; rMapSec = data->mapSec; rHpFractionId = data->hpFractionId; return record + 4; } static u16 *RecordEvent_DefeatedGymLeader(u16 *dest, const struct QuestLogEvent_TrainerBattle * data) { sStepRecordingMode = STEP_RECORDING_MODE_DISABLED; return RecordEvent_DefeatedTrainer(QL_EVENT_DEFEATED_GYM_LEADER, dest, data); } static const u16 *LoadEvent_DefeatedGymLeader(const u16 *eventData) { const u8 *r6; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; eventData = LoadEvent(QL_EVENT_DEFEATED_GYM_LEADER, eventData); r6 = (const u8 *)eventData + 6; DynamicPlaceholderTextUtil_Reset(); GetMapNameGeneric(gStringVar1, r6[0]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sTrainers[eventData[2]].trainerName); QuestLog_GetSpeciesName(eventData[0], 0, 2); QuestLog_GetSpeciesName(eventData[1], 0, 3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnGymLeadersMonWithMonAndWon); return eventData + 4; } static u16 *RecordEvent_DefeatedWildMon(u16 *dest, const struct QuestLogEvent_WildBattle * data) { u16 *body = dest; u8 *footer = (u8 *)dest + sizeof(struct QuestLogEvent_WildBattle); if (!QL_IsRoomToSaveEvent(body, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_WILD_MON])) return NULL; if (footer[0] == 0 && footer[1] == 0) { body[0] = QL_EVENT_DEFEATED_WILD_MON; body[1] = gQuestLogCurActionIdx; } if (data->defeatedSpecies != SPECIES_NONE) body[2] = data->defeatedSpecies; if (data->caughtSpecies != SPECIES_NONE) body[3] = data->caughtSpecies; if (data->defeatedSpecies != SPECIES_NONE && footer[0] != 0xFF) footer[0]++; if (data->caughtSpecies != SPECIES_NONE && footer[1] != 0xFF) footer[1]++; footer[2] = data->mapSec; return (u16 *)(footer + 4); } static const u16 *LoadEvent_DefeatedWildMon(const u16 *a0) { const u8 *data; if (!QL_IsRoomToSaveEvent(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_WILD_MON])) return NULL; data = (const u8 *)a0 + 8; DynamicPlaceholderTextUtil_Reset(); GetMapNameGeneric(gStringVar1, data[2]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); QuestLog_GetSpeciesName(a0[2], NULL, 1); ConvertIntToDecimalStringN(gStringVar2, data[0], STR_CONV_MODE_LEFT_ALIGN, 3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); QuestLog_GetSpeciesName(a0[3], NULL, 3); ConvertIntToDecimalStringN(gStringVar3, data[1], STR_CONV_MODE_LEFT_ALIGN, 3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gSaveBlock2Ptr->playerName); if (data[0] == 0) { if (data[1] == 1) DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMon); else DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMons); } else if (data[1] == 0) { if (data[0] == 1) DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMon); else DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMons); } else if (data[0] == 1) { if (data[1] == 1) DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMon); else DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMons); } else { if (data[1] == 1) DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMon); else DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMons); } return (const u16 *)(data + 4); } static bool8 IsSpeciesFromSpecialEncounter(u16 species) { switch (species) { case SPECIES_SNORLAX: case SPECIES_ARTICUNO: case SPECIES_ZAPDOS: case SPECIES_MOLTRES: case SPECIES_MEWTWO: case SPECIES_MEW: case SPECIES_LUGIA: case SPECIES_HO_OH: case SPECIES_LATIAS: case SPECIES_LATIOS: case SPECIES_DEOXYS: return TRUE; } return FALSE; } static u16 *RecordEvent_DefeatedEliteFourMember(u16 *dest, const struct QuestLogEvent_TrainerBattle * data) { sStepRecordingMode = STEP_RECORDING_MODE_DISABLED; return RecordEvent_DefeatedTrainer(QL_EVENT_DEFEATED_E4_MEMBER, dest, data); } static const u16 *LoadEvent_DefeatedEliteFourMember(const u16 *eventData) { const u8 *r5; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; eventData = LoadEvent(QL_EVENT_DEFEATED_E4_MEMBER, eventData); r5 = (const u8 *)eventData + 6; DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sTrainers[eventData[2]].trainerName); QuestLog_GetSpeciesName(eventData[0], NULL, 1); QuestLog_GetSpeciesName(eventData[1], NULL, 2); DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, sDefeatedOpponentFlavorTexts[r5[1]]); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnEliteFoursMonWithMonAndWon); return eventData + 4; } static u16 *RecordEvent_DefeatedChampion(u16 *dest, const struct QuestLogEvent_TrainerBattle * data) { if (!QL_IsRoomToSaveEvent(dest, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_CHAMPION])) return NULL; dest[0] = QL_EVENT_DEFEATED_CHAMPION | (2 << QL_CMD_COUNT_SHIFT); // Event will run two additional times, for each state in LoadEvent_DefeatedChampion dest[1] = gQuestLogCurActionIdx; dest[2] = data->speciesOpponent; dest[3] = data->speciesPlayer; *((u8 *)dest + 8) = data->hpFractionId; sStepRecordingMode = STEP_RECORDING_MODE_DISABLED; return dest + 5; } static const u16 *LoadEvent_DefeatedChampion(const u16 *a0) { const u8 *r5; if (!QL_IsRoomToSaveEvent(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_CHAMPION])) return NULL; r5 = (const u8 *)a0 + 8; DynamicPlaceholderTextUtil_Reset(); switch (gQuestLogRepeatEventTracker.counter) { case 0: DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gSaveBlock1Ptr->rivalName); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerBattledChampionRival); break; case 1: DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock1Ptr->rivalName); QuestLog_GetSpeciesName(a0[2], NULL, 1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gSaveBlock2Ptr->playerName); QuestLog_GetSpeciesName(a0[3], NULL, 3); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2); break; case 2: DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sDefeatedChampionFlavorTexts[r5[0]]); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WonTheMatchAsAResult); break; } return (const u16 *)(r5 + 2); } static u16 *RecordEvent_DefeatedNormalTrainer(u16 *dest, const struct QuestLogEvent_TrainerBattle * data) { sStepRecordingMode = STEP_RECORDING_MODE_DISABLED; return RecordEvent_DefeatedTrainer(QL_EVENT_DEFEATED_TRAINER, dest, data); } static const u16 *LoadEvent_DefeatedTrainer(const u16 *eventData) { const u16 *r5 = LoadEvent(QL_EVENT_DEFEATED_TRAINER, eventData); const u8 *r6 = (const u8 *)r5 + 6; struct Trainer* sTrainers; if(FlagGet(FLAG_MASTER_TRAINER_BATTLE)) sTrainers = (struct Trainer*)gMasterTrainers; else sTrainers = (struct Trainer*)gTrainers; DynamicPlaceholderTextUtil_Reset(); GetMapNameGeneric(gStringVar1, r6[0]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); if (sTrainers[r5[2]].trainerClass == TRAINER_CLASS_RIVAL_EARLY || sTrainers[r5[2]].trainerClass == TRAINER_CLASS_RIVAL_LATE || sTrainers[r5[2]].trainerClass == TRAINER_CLASS_CHAMPION) DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetExpandedPlaceholder(PLACEHOLDER_ID_RIVAL)); else DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sTrainers[r5[2]].trainerName); QuestLog_GetSpeciesName(r5[0], NULL, 2); QuestLog_GetSpeciesName(r5[1], NULL, 3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnTrainersMonWithMonAndWon); return (const u16 *)(r6 + 2); } #undef rSpeciesOpponent #undef rSpeciesPlayer #undef rTrainerId #undef rMapSec #undef rHpFractionId #define rMapSec record[0] #define rLocationId record[1] static u16 *RecordEvent_DepartedLocation(u16 *dest, const struct QuestLogEvent_Departed * data) { u8 *record = (u8 *)RecordEventHeader(QL_EVENT_DEPARTED, dest); if (record == NULL) return NULL; rMapSec = data->mapSec; rLocationId = data->locationId; if (rLocationId == QL_LOCATION_SAFARI_ZONE) sStepRecordingMode = STEP_RECORDING_MODE_DISABLED; return (u16 *)(record + 2); } static const u16 *LoadEvent_DepartedLocation(const u16 *eventData) { u8 i, locationId; const u8 *record = (const u8 *)LoadEvent(QL_EVENT_DEPARTED, eventData); locationId = rLocationId; GetMapNameGeneric(gStringVar1, rMapSec); StringCopy(gStringVar2, sLocationNameTexts[locationId]); if (sLocationToDepartedTextId[locationId] == QL_DEPARTED_GYM) { for (i = 0; i < NUM_BADGES; i++) { if (rMapSec != sGymCityMapSecs[i]) continue; if (FlagGet(FLAG_BADGE01_GET + i) == TRUE) StringExpandPlaceholders(gStringVar4, gText_QuestLog_DepartedGym); else StringExpandPlaceholders(gStringVar4, gText_QuestLog_GymWasFullOfToughTrainers); break; } if (i == NUM_BADGES) StringExpandPlaceholders(gStringVar4, sDepartedLocationTexts[sLocationToDepartedTextId[locationId]]); } else StringExpandPlaceholders(gStringVar4, sDepartedLocationTexts[sLocationToDepartedTextId[locationId]]); return (const u16 *)(record + 2); } #undef rMapSec #undef rLocationId void SetQLPlayedTheSlots(void) { sPlayedTheSlots = TRUE; } static bool8 ShouldRegisterEvent_HandleDeparted(u16 eventId, const u16 * genericData) { const struct QuestLogEvent_Departed * data; if (eventId != QL_EVENT_DEPARTED) { sLastDepartedLocation = 0; return TRUE; } data = (struct QuestLogEvent_Departed *)genericData; if (sLastDepartedLocation == data->locationId + 1) return FALSE; sLastDepartedLocation = data->locationId + 1; return TRUE; } static bool8 ShouldRegisterEvent_DepartedGameCorner(u16 eventId, const u16 * genericData) { const struct QuestLogEvent_Departed * data; if (eventId != QL_EVENT_DEPARTED) return TRUE; data = (struct QuestLogEvent_Departed *)genericData; if (data->locationId == QL_LOCATION_GAME_CORNER && !sPlayedTheSlots) return FALSE; sPlayedTheSlots = FALSE; return TRUE; } static u16 *RecordEvent_UsedFieldMove(u16 *dest, const struct QuestLogEvent_FieldMove * data) { u8 *record; dest = RecordEventHeader(QL_EVENT_USED_FIELD_MOVE, dest); if (dest == NULL) return NULL; dest[0] = data->species; record = (u8 *)dest + 2; record[0] = data->fieldMove; record[1] = data->mapSec; if (record[0] == FIELD_MOVE_TELEPORT || record[0] == FIELD_MOVE_DIG) sStepRecordingMode = STEP_RECORDING_MODE_DISABLED_UNTIL_DEPART; else sStepRecordingMode = STEP_RECORDING_MODE_DISABLED; return (u16 *)(record + 2); } static const u16 *LoadEvent_UsedFieldMove(const u16 *eventData) { const u16 *r4 = LoadEvent(QL_EVENT_USED_FIELD_MOVE, eventData); const u8 *r5 = (const u8 *)r4 + 2; QuestLog_GetSpeciesName(r4[0], gStringVar1, 0); if (r5[1] != 0xFF) GetMapNameGeneric(gStringVar2, r5[1]); // If used Teleport, get name of destination if (r5[0] == FIELD_MOVE_TELEPORT) { if (r5[1] == MAPSEC_PALLET_TOWN) StringCopy(gStringVar3, gText_QuestLog_Home); else StringCopy(gStringVar3, gText_PokemonCenter); } StringExpandPlaceholders(gStringVar4, sUsedFieldMoveTexts[r5[0]]); return (const u16 *)(r5 + 2); } static u16 *RecordEvent_BoughtItem(u16 *dest, const struct QuestLogEvent_Shop * data) { dest = RecordEventHeader(QL_EVENT_BOUGHT_ITEM, dest); if (dest == NULL) return NULL; dest[0] = data->lastItemId; dest[1] = data->itemQuantity; dest[2] = data->totalMoney >> 16; dest[3] = data->totalMoney; *((u8 *)dest + 8) = data->mapSec; *((u8 *)dest + 9) = TRUE; // data->hasMultipleTransactions ignored for some reason. It's assumed true if quantity >= 2 return dest + 5; } static const u16 *LoadEvent_BoughtItem(const u16 *eventData) { const u16 *r4 = LoadEvent(QL_EVENT_BOUGHT_ITEM, eventData); const u8 *r7 = (const u8 *)r4 + 8; u32 r6 = (r4[2] << 16) + r4[3]; DynamicPlaceholderTextUtil_Reset(); GetMapNameGeneric(gStringVar1, r7[0]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r4[0])); if (r4[1] < 2) DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItem); else { ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItemsIncludingItem); } return (const u16 *)(r7 + 2); } static u16 *RecordEvent_SoldItem(u16 *dest, const struct QuestLogEvent_Shop * data) { dest = RecordEventHeader(QL_EVENT_SOLD_ITEM, dest); if (dest == NULL) return NULL; dest[0] = data->lastItemId; dest[1] = data->itemQuantity; dest[2] = data->totalMoney >> 16; dest[3] = data->totalMoney; *((u8 *)dest + 8) = data->mapSec; *((u8 *)dest + 9) = data->hasMultipleTransactions; return dest + 5; } static const u16 *LoadEvent_SoldItem(const u16 *eventData) { const u16 *r5 = LoadEvent(QL_EVENT_SOLD_ITEM, eventData); const u8 *r7 = (const u8 *) r5 + 8; u32 r6 = (r5[2] << 16) + r5[3]; DynamicPlaceholderTextUtil_Reset(); GetMapNameGeneric(gStringVar1, r7[0]); if (r7[1] == 0) { DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, ItemId_GetName(r5[0])); if (r5[1] == 1) DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gText_QuestLog_JustOne); else { ConvertIntToDecimalStringN(gStringVar2, r5[1], STR_CONV_MODE_LEFT_ALIGN, 3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar2); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar3, gText_QuestLog_Num); DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); } DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldNumOfItem); } else { DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r5[0])); ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldItemsIncludingItem); } return (const u16 *)(r7 + 2); } static u16 *RecordEvent_ObtainedStoryItem(u16 *dest, const struct QuestLogEvent_StoryItem * data) { dest = RecordEventHeader(QL_EVENT_OBTAINED_STORY_ITEM, dest); if (dest == NULL) return NULL; dest[0] = data->itemId; *((u8 *)dest + 2) = data->mapSec; return dest + 2; } static const u16 *LoadEvent_ObtainedStoryItem(const u16 *eventData) { const u16 *r4 = LoadEvent(QL_EVENT_OBTAINED_STORY_ITEM, eventData); const u8 *r5 = (const u8 *)r4 + 2; GetMapNameGeneric(gStringVar1, r5[0]); StringCopy(gStringVar2, ItemId_GetName(r4[0])); StringExpandPlaceholders(gStringVar4, gText_QuestLog_ObtainedItemInLocation); return (const u16 *)(r5 + 2); } void QuestLog_RecordEnteredMap(u16 worldMapFlag) { s32 i; if (QL_IS_PLAYBACK_STATE) return; for (i = 0; i < (int)ARRAY_COUNT(sWorldMapFlags); i++) { if (worldMapFlag == sWorldMapFlags[i]) { if (!FlagGet(worldMapFlag)) { sNewlyEnteredMap = TRUE; break; } else { sNewlyEnteredMap += 0; sNewlyEnteredMap = FALSE; break; } } } } void SetQuestLogEvent_Arrived(void) { if (!QL_IS_PLAYBACK_STATE) { if (sNewlyEnteredMap) { u16 mapSec = gMapHeader.regionMapSectionId; SetQuestLogEvent(QL_EVENT_ARRIVED, &mapSec); sNewlyEnteredMap = FALSE; } } } static u16 *RecordEvent_ArrivedInLocation(u16 *dest, const u16 * data) { dest = RecordEventHeader(QL_EVENT_ARRIVED, dest); if (dest == NULL) return NULL; dest[0] = data[0]; return dest + 1; } static const u16 *LoadEvent_ArrivedInLocation(const u16 *eventData) { const u16 *r4 = LoadEvent(QL_EVENT_ARRIVED, eventData); GetMapNameGeneric(gStringVar1, (u8)r4[0]); StringExpandPlaceholders(gStringVar4, gText_QuestLog_ArrivedInLocation); return r4 + 1; } static void TranslateLinkPartnersName(u8 *dest) { s32 i; if (*dest++ == EXT_CTRL_CODE_BEGIN && *dest++ == EXT_CTRL_CODE_JPN) { for (i = 0; i < 5; i++) { if (*dest == EXT_CTRL_CODE_BEGIN) break; dest++; } *dest++ = EXT_CTRL_CODE_BEGIN; *dest++ = EXT_CTRL_CODE_ENG; *dest++ = EOS; } } ================================================ FILE: src/quest_log_objects.c ================================================ #include "global.h" #include "quest_log.h" #include "fieldmap.h" #include "field_player_avatar.h" #include "metatile_behavior.h" void QL_RecordObjects(struct QuestLogScene * questLog) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { questLog->objectEvents[i].active = gObjectEvents[i].active; questLog->objectEvents[i].triggerGroundEffectsOnStop = gObjectEvents[i].triggerGroundEffectsOnStop; questLog->objectEvents[i].disableCoveringGroundEffects = gObjectEvents[i].disableCoveringGroundEffects; questLog->objectEvents[i].landingJump = gObjectEvents[i].landingJump; questLog->objectEvents[i].frozen = gObjectEvents[i].frozen; questLog->objectEvents[i].facingDirectionLocked = gObjectEvents[i].facingDirectionLocked; questLog->objectEvents[i].disableAnim = gObjectEvents[i].disableAnim; questLog->objectEvents[i].enableAnim = gObjectEvents[i].enableAnim; questLog->objectEvents[i].inanimate = gObjectEvents[i].inanimate; questLog->objectEvents[i].invisible = gObjectEvents[i].invisible; questLog->objectEvents[i].offScreen = gObjectEvents[i].offScreen; questLog->objectEvents[i].trackedByCamera = gObjectEvents[i].trackedByCamera; questLog->objectEvents[i].isPlayer = gObjectEvents[i].isPlayer; questLog->objectEvents[i].spriteAnimPausedBackup = gObjectEvents[i].spriteAnimPausedBackup; questLog->objectEvents[i].spriteAffineAnimPausedBackup = gObjectEvents[i].spriteAffineAnimPausedBackup; questLog->objectEvents[i].disableJumpLandingGroundEffect = gObjectEvents[i].disableJumpLandingGroundEffect; questLog->objectEvents[i].fixedPriority = gObjectEvents[i].fixedPriority; questLog->objectEvents[i].facingDirection = gObjectEvents[i].facingDirection; questLog->objectEvents[i].currentElevation = gObjectEvents[i].currentElevation; questLog->objectEvents[i].previousElevation = gObjectEvents[i].previousElevation; questLog->objectEvents[i].graphicsId = gObjectEvents[i].graphicsId; questLog->objectEvents[i].movementType = gObjectEvents[i].movementType; questLog->objectEvents[i].trainerType = gObjectEvents[i].trainerType; questLog->objectEvents[i].localId = gObjectEvents[i].localId; questLog->objectEvents[i].mapNum = gObjectEvents[i].mapNum; questLog->objectEvents[i].mapGroup = gObjectEvents[i].mapGroup; questLog->objectEvents[i].x = gObjectEvents[i].currentCoords.x; questLog->objectEvents[i].y = gObjectEvents[i].currentCoords.y; questLog->objectEvents[i].trainerRange_berryTreeId = gObjectEvents[i].trainerRange_berryTreeId; questLog->objectEvents[i].previousMetatileBehavior = gObjectEvents[i].previousMetatileBehavior; questLog->objectEvents[i].directionSequenceIndex = gObjectEvents[i].directionSequenceIndex; questLog->objectEvents[i].animId = gObjectEvents[i].playerCopyableMovement; } } void QL_LoadObjects(const struct QuestLogScene * questLog, const struct ObjectEventTemplate * templates) { u32 i, j; const struct QuestLogObjectEvent * questLogObjectEvents = questLog->objectEvents; CpuFill16(0, gObjectEvents, sizeof(gObjectEvents)); for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { gObjectEvents[i].active = questLogObjectEvents[i].active; gObjectEvents[i].triggerGroundEffectsOnStop = questLogObjectEvents[i].triggerGroundEffectsOnStop; gObjectEvents[i].disableCoveringGroundEffects = questLogObjectEvents[i].disableCoveringGroundEffects; gObjectEvents[i].landingJump = questLogObjectEvents[i].landingJump; gObjectEvents[i].frozen = questLogObjectEvents[i].frozen; gObjectEvents[i].facingDirectionLocked = questLogObjectEvents[i].facingDirectionLocked; gObjectEvents[i].disableAnim = questLogObjectEvents[i].disableAnim; gObjectEvents[i].enableAnim = questLogObjectEvents[i].enableAnim; gObjectEvents[i].inanimate = questLogObjectEvents[i].inanimate; gObjectEvents[i].invisible = questLogObjectEvents[i].invisible; gObjectEvents[i].offScreen = questLogObjectEvents[i].offScreen; gObjectEvents[i].trackedByCamera = questLogObjectEvents[i].trackedByCamera; gObjectEvents[i].isPlayer = questLogObjectEvents[i].isPlayer; gObjectEvents[i].spriteAnimPausedBackup = questLogObjectEvents[i].spriteAnimPausedBackup; gObjectEvents[i].spriteAffineAnimPausedBackup = questLogObjectEvents[i].spriteAffineAnimPausedBackup; gObjectEvents[i].disableJumpLandingGroundEffect = questLogObjectEvents[i].disableJumpLandingGroundEffect; gObjectEvents[i].fixedPriority = questLogObjectEvents[i].fixedPriority; gObjectEvents[i].facingDirection = questLogObjectEvents[i].facingDirection; gObjectEvents[i].currentElevation = questLogObjectEvents[i].currentElevation; gObjectEvents[i].previousElevation = questLogObjectEvents[i].previousElevation; gObjectEvents[i].graphicsId = questLogObjectEvents[i].graphicsId; gObjectEvents[i].movementType = questLogObjectEvents[i].movementType; gObjectEvents[i].trainerType = questLogObjectEvents[i].trainerType; gObjectEvents[i].localId = questLogObjectEvents[i].localId; gObjectEvents[i].mapNum = questLogObjectEvents[i].mapNum; gObjectEvents[i].mapGroup = questLogObjectEvents[i].mapGroup; gObjectEvents[i].currentCoords.x = questLogObjectEvents[i].x; gObjectEvents[i].currentCoords.y = questLogObjectEvents[i].y; gObjectEvents[i].trainerRange_berryTreeId = questLogObjectEvents[i].trainerRange_berryTreeId; gObjectEvents[i].previousMetatileBehavior = questLogObjectEvents[i].previousMetatileBehavior; gObjectEvents[i].directionSequenceIndex = questLogObjectEvents[i].directionSequenceIndex; gObjectEvents[i].playerCopyableMovement = questLogObjectEvents[i].animId; for (j = 0; j < OBJECT_EVENT_TEMPLATES_COUNT; j++) { if (gObjectEvents[i].localId == templates[j].localId) { gObjectEvents[i].initialCoords.x = templates[j].x + MAP_OFFSET; gObjectEvents[i].initialCoords.y = templates[j].y + MAP_OFFSET; gObjectEvents[i].rangeX = templates[j].objUnion.normal.movementRangeX; gObjectEvents[i].rangeY = templates[j].objUnion.normal.movementRangeY; } } gObjectEvents[i].currentMetatileBehavior = MapGridGetMetatileBehaviorAt(gObjectEvents[i].currentCoords.x, gObjectEvents[i].currentCoords.y); if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x), (s16)(gObjectEvents[i].currentCoords.y))) { gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x; gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y; } else if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x - 1), (s16)(gObjectEvents[i].currentCoords.y))) { gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x - 1; gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y; } else if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x + 1), (s16)(gObjectEvents[i].currentCoords.y))) { gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x + 1; gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y; } else if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x), (s16)(gObjectEvents[i].currentCoords.y - 1))) { gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x; gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y - 1; } else if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x), (s16)(gObjectEvents[i].currentCoords.y + 1))) { gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x; gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y + 1; } } CpuCopy16(gObjectEvents, gSaveBlock1Ptr->objectEvents, sizeof(gObjectEvents)); } void QL_TryStopSurfing(void) { if (gQuestLogState == QL_STATE_PLAYBACK) { s16 x, y; PlayerGetDestCoords(&x, &y); if (!MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y)) && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) { struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); DestroySprite(&gSprites[objectEvent->fieldEffectSpriteId]); } } } ================================================ FILE: src/quest_log_player.c ================================================ #include "global.h" #include "bike.h" #include "script.h" #include "task.h" #include "field_player_avatar.h" #include "event_object_movement.h" #include "field_effect.h" #include "field_effect_helpers.h" #include "quest_log.h" #include "quest_log_player.h" static void QL_GfxTransition_Normal(void); static void QL_GfxTransition_Bike(void); static void QL_GfxTransition_Fish(void); static void Task_QLFishMovement(u8 taskId); static void QL_GfxTransition_StartSurf(void); static void QL_GfxTransition_VSSeeker(void); static void Task_QLVSSeekerMovement(u8 taskId); static void QL_GfxTransition_StopSurfSouth(void); static void QL_GfxTransition_StopSurfNorth(void); static void QL_GfxTransition_StopSurfWest(void); static void QL_GfxTransition_StopSurfEast(void); static void QL_SetObjectGraphicsId(struct ObjectEvent *object, u8 graphicsId); static void (*const sQLGfxTransitions[])(void) = { [QL_PLAYER_GFX_NORMAL] = QL_GfxTransition_Normal, [QL_PLAYER_GFX_BIKE] = QL_GfxTransition_Bike, [QL_PLAYER_GFX_FISH] = QL_GfxTransition_Fish, [QL_PLAYER_GFX_SURF] = QL_GfxTransition_StartSurf, [QL_PLAYER_GFX_STOP_SURF_S] = QL_GfxTransition_StopSurfSouth, [QL_PLAYER_GFX_STOP_SURF_N] = QL_GfxTransition_StopSurfNorth, [QL_PLAYER_GFX_STOP_SURF_W] = QL_GfxTransition_StopSurfWest, [QL_PLAYER_GFX_STOP_SURF_E] = QL_GfxTransition_StopSurfEast, [QL_PLAYER_GFX_VSSEEKER] = QL_GfxTransition_VSSeeker }; void QuestLogUpdatePlayerSprite(u8 state) { if (state < NELEMS(sQLGfxTransitions)) sQLGfxTransitions[state](); } bool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state) { if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING) { QuestLogRecordPlayerAvatarGfxTransition(state); return TRUE; } return FALSE; } void QuestLogCallUpdatePlayerSprite(u8 state) { return QuestLogUpdatePlayerSprite(state); } static void QL_GfxTransition_Normal(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL)); ObjectEventTurn(objectEvent, objectEvent->movementDirection); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT); } static void QL_GfxTransition_Bike(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_BIKE)); ObjectEventTurn(objectEvent, objectEvent->movementDirection); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_MACH_BIKE); BikeClearState(0, 0); } static void QL_GfxTransition_Fish(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[objectEvent->spriteId]; if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RUNNING || gQuestLogPlaybackState == QL_PLAYBACK_STATE_ACTION_END) { u8 taskId; LockPlayerFieldControls(); gPlayerAvatar.preventStep = TRUE; taskId = CreateTask(Task_QLFishMovement, 0xFF); gTasks[taskId].data[0] = 0; } else { QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FISH)); StartSpriteAnim(sprite, GetFishingDirectionAnimNum(objectEvent->facingDirection)); } } static void Task_QLFishMovement(u8 taskId) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[objectEvent->spriteId]; switch (gTasks[taskId].data[0]) { case 0: ObjectEventClearHeldMovementIfActive(objectEvent); objectEvent->enableAnim = TRUE; QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FISH)); StartSpriteAnim(sprite, GetFishingDirectionAnimNum(objectEvent->facingDirection)); gTasks[taskId].data[0]++; gTasks[taskId].data[1] = 0; break; case 1: AlignFishingAnimationFrames(sprite); if (gTasks[taskId].data[1] < 60) gTasks[taskId].data[1]++; else gTasks[taskId].data[0]++; break; case 2: StartSpriteAnim(sprite, GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); gTasks[taskId].data[0]++; break; case 3: AlignFishingAnimationFrames(sprite); if (sprite->animEnded) { if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)) QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL)); else QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); ObjectEventTurn(objectEvent, objectEvent->movementDirection); sprite->x2 = 0; sprite->y2 = 0; UnlockPlayerFieldControls(); DestroyTask(taskId); } break; } } static void QL_GfxTransition_StartSurf(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; u8 fieldEffectId; if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)) { QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); ObjectEventTurn(objectEvent, objectEvent->movementDirection); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING); gFieldEffectArguments[0] = objectEvent->currentCoords.x; gFieldEffectArguments[1] = objectEvent->currentCoords.y; gFieldEffectArguments[2] = gPlayerAvatar.objectEventId; fieldEffectId = FieldEffectStart(FLDEFF_SURF_BLOB); objectEvent->fieldEffectSpriteId = fieldEffectId; SetSurfBlob_BobState(fieldEffectId, BOB_PLAYER_AND_MON); } } static void QL_GfxTransition_VSSeeker(void) { FieldEffectStart(FLDEFF_USE_VS_SEEKER); CreateTask(Task_QLVSSeekerMovement, 0x00); } static void Task_QLVSSeekerMovement(u8 taskId) { if (!FieldEffectActiveListContains(FLDEFF_USE_VS_SEEKER)) { UnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); } } static void QL_SetObjectGraphicsId(struct ObjectEvent * object, u8 graphicsId) { ObjectEventSetGraphicsId(object, graphicsId); } static void QL_GfxTransition_StopSurfSouth(void) { CreateStopSurfingTask_NoMusicChange(DIR_SOUTH); } static void QL_GfxTransition_StopSurfNorth(void) { CreateStopSurfingTask_NoMusicChange(DIR_NORTH); } static void QL_GfxTransition_StopSurfWest(void) { CreateStopSurfingTask_NoMusicChange(DIR_WEST); } static void QL_GfxTransition_StopSurfEast(void) { CreateStopSurfingTask_NoMusicChange(DIR_EAST); } ================================================ FILE: src/random.c ================================================ #include "global.h" #include "random.h" // The number 1103515245 comes from the example implementation // of rand and srand in the ISO C standard. u32 gRngValue; u32 gRng2Value; u16 Random(void) { gRngValue = ISO_RANDOMIZE1(gRngValue); return gRngValue >> 16; } void SeedRng(u16 seed) { gRngValue = seed; } void SeedRng2(u16 seed) { gRng2Value = seed; } u16 Random2(void) { gRng2Value = 1103515245 * gRng2Value + 24691; return gRng2Value >> 16; } ================================================ FILE: src/region_map.c ================================================ #include "global.h" #include "gflib.h" #include "scanline_effect.h" #include "task.h" #include "m4a.h" #include "overworld.h" #include "event_data.h" #include "region_map.h" #include "party_menu.h" #include "field_effect.h" #include "new_menu_helpers.h" #include "menu.h" #include "strings.h" #include "map_preview_screen.h" #include "constants/songs.h" #include "constants/region_map_sections.h" #include "constants/heal_locations.h" #include "constants/maps.h" #define MAP_WIDTH 22 #define MAP_HEIGHT 15 #define CANCEL_BUTTON_X 21 #define CANCEL_BUTTON_Y 13 #define SWITCH_BUTTON_X 21 #define SWITCH_BUTTON_Y 11 enum { REGIONMAP_KANTO, REGIONMAP_SEVII123, REGIONMAP_SEVII45, REGIONMAP_SEVII67, REGIONMAP_HOENN, REGIONMAP_COUNT }; enum { MAPSECTYPE_NONE, MAPSECTYPE_ROUTE, MAPSECTYPE_VISITED, MAPSECTYPE_NOT_VISITED, MAPSECTYPE_UNKNOWN, // Checked but never used }; enum { LAYER_MAP, LAYER_DUNGEON, LAYER_COUNT }; enum { WIN_MAP_NAME, WIN_DUNGEON_NAME, WIN_MAP_PREVIEW, WIN_TOPBAR_LEFT, WIN_TOPBAR_RIGHT, }; #define CLEAR_NAME 2 enum { MAP_INPUT_NONE, MAP_INPUT_MOVE_START, MAP_INPUT_MOVE_CONT, MAP_INPUT_MOVE_END, MAP_INPUT_A_BUTTON, MAP_INPUT_SWITCH, MAP_INPUT_CANCEL }; enum { MAPPERM_HAS_SWITCH_BUTTON, MAPPERM_HAS_MAP_PREVIEW, MAPPERM_HAS_OPEN_ANIM, MAPPERM_HAS_FLY_DESTINATIONS, MAPPERM_COUNT }; enum { MAPEDGE_TOP_LEFT, MAPEDGE_MID_LEFT, MAPEDGE_BOT_LEFT, MAPEDGE_TOP_RIGHT, MAPEDGE_MID_RIGHT, MAPEDGE_BOT_RIGHT, }; #define FREE_IF_NOT_NULL(ptr) ({ \ if (ptr) { \ FREE_AND_SET_NULL(ptr); \ } \ }) struct RegionMap { u8 mapName[19]; u8 dungeonName[19]; u16 layouts[REGIONMAP_COUNT + 1][600]; // Inefficiency: these should be u8 or have half the elements each u16 bgTilemapBuffers[3][BG_SCREEN_SIZE]; u8 type; // REGIONMAP_TYPE_* bool8 permissions[MAPPERM_COUNT]; u8 selectedRegion; // REGIONMAP_KANTO, REGIONMAP_SEVII* u8 playersRegion; u8 ALIGNED(4) mainState; u8 ALIGNED(4) openState; u8 ALIGNED(4) loadGfxState; u16 dungeonWinLeft; // Used by a field that's never read u16 dungeonWinTop; // Never read u16 dungeonWinRight; // Never read u16 dungeonWinBottom; // Never read u8 filler[6]; TaskFunc mainTask; MainCallback savedCallback; }; // size = 0x47C0 struct GpuWindowParams { u16 left; u16 top; u16 right; u16 bottom; }; struct SwitchMapMenuCursorSubsprite { u8 tiles[0x400]; struct Sprite *sprite; u16 tileTag; u16 palTag; s16 x; }; struct SwitchMapMenu { u8 switchMapTiles[0x1000]; u16 switchMapTilemap[600]; struct SwitchMapMenuCursorSubsprite cursorSubsprite[2]; u8 mainState; u8 cursorLoadState; u8 currentSelection; u8 chosenRegion; u8 maxSelection; u8 alpha; u16 yOffset; TaskFunc exitTask; struct GpuWindowParams highlight; u16 blendY; }; // size = 0x1CE0 struct DungeonMapInfo { u16 id; const u8 *name; const u8 *desc; }; struct DungeonMapPreview { u16 tiles[7200]; u16 tilemap[640]; const struct MapPreviewScreen * mapPreviewInfo; TaskFunc savedTask; u8 mainState; u8 drawState; u8 loadState; u8 updateCounter; u8 timer; u16 palette[0x30]; u8 filler[0x60]; u16 red; u16 green; u16 blue; u16 blendY; u16 left; u16 top; u16 right; u16 bottom; u16 leftIncrement; u16 topIncrement; u16 rightIncrement; u16 bottomIncrement; }; // size = 0x3E28 struct MapEdge { u16 tiles[0x200]; struct Sprite *sprite; s16 x; s16 y; u16 tileTag; u16 palTag; }; struct MapOpenCloseAnim { struct MapEdge * mapEdges[6]; u16 tiles[0x400]; u16 tilemap[600]; TaskFunc exitTask; u8 openState; u8 loadGfxState; u8 moveState; u8 closeState; u8 blendY; }; // size = 0xCD4 struct MapCursor { s16 x; s16 y; u16 spriteX; u16 spriteY; s16 horizontalMove; s16 verticalMove; u16 moveCounter; u8 snapId; u8 (*inputHandler)(void); u16 selectedMapsec; u16 selectedMapsecType; u16 selectedDungeonType; struct Sprite *sprite; u16 tileTag; u16 palTag; u16 tiles[0x80]; }; // size = 0x124 struct PlayerIcon { s16 x; s16 y; struct Sprite *sprite; u16 tileTag; u16 palTag; u16 tiles[0x40]; }; // size = 0x8C struct MapIconSprite { u32 unused; u8 region; struct Sprite *sprite; u16 tileTag; u16 palTag; }; struct MapIcons { u8 dungeonIconTiles[0x40]; u8 flyIconTiles[0x100]; struct MapIconSprite dungeonIcons[25]; struct MapIconSprite flyIcons[25]; u8 region; // Never read u8 unused_1[2]; u8 state; u32 unused_2; TaskFunc exitTask; }; // size = 0x46C struct RegionMapGpuRegs { u16 bldcnt; u16 bldy; u16 bldalpha; u16 winin; u16 winout; u16 win0h; u16 win1h; u16 win0v; u16 win1v; }; struct FlyMap { u8 state; u8 unused; // Never read bool8 selectedDestination; }; static EWRAM_DATA struct RegionMap * sRegionMap = NULL; static EWRAM_DATA struct SwitchMapMenu * sSwitchMapMenu = NULL; static EWRAM_DATA struct DungeonMapPreview * sDungeonMapPreview = NULL; static EWRAM_DATA struct MapOpenCloseAnim * sMapOpenCloseAnim = NULL; static EWRAM_DATA struct MapCursor * sMapCursor = NULL; static EWRAM_DATA struct PlayerIcon * sPlayerIcon = NULL; static EWRAM_DATA struct MapIcons * sMapIcons = NULL; static EWRAM_DATA struct RegionMapGpuRegs * sRegionMapGpuRegs[3] = {}; static EWRAM_DATA struct FlyMap * sFlyMap = NULL; static void InitRegionMapType(void); static void CB2_OpenRegionMap(void); static bool8 LoadRegionMapGfx(void); static void CreateMainMapTask(void); static void Task_RegionMap(u8); static void SaveMainMapTask(u8); static void FreeRegionMap(u8); static void CB2_RegionMap(void); static void NullVBlankHBlankCallbacks(void); static void SetRegionMapVBlankCB(void); static void InitRegionMapBgs(void); static void SetBgTilemapBuffers(void); static void ResetOamForRegionMap(void); static void SetBg0andBg3Hidden(bool8); static void UpdateMapsecNameBox(void); static void DisplayCurrentMapName(void); static void DrawDungeonNameBox(void); static void DisplayCurrentDungeonName(void); static void BufferRegionMapBg(u8, u16 *); static bool8 GetRegionMapPermission(u8); static u8 GetSelectedRegionMap(void); static void InitSwitchMapMenu(u8, u8, TaskFunc); static void Task_SwitchMapMenu(u8); static void FreeSwitchMapMenu(u8); static bool8 BrightenScreenForSwitchMapMenu(void); static void LoadSwitchMapTilemap(u8, u16 *); static void SetGpuRegsToDimScreen(void); static bool8 DimScreenForSwitchMapMenu(void); static bool8 HandleSwitchMapInput(void); static bool8 CreateSwitchMapCursor(void); static void CreateSwitchMapCursorSubsprite(u8, u16, u16); static void CreateSwitchMapCursorSubsprite_(u8, u16, u16); static void FreeSwitchMapCursor(void); static void InitDungeonMapPreview(u8, u8, TaskFunc); static void Task_DungeonMapPreview(u8); static void Task_DrawDungeonMapPreviewFlavorText(u8); static void FreeDungeonMapPreview(u8); static void InitScreenForDungeonMapPreview(void); static void CopyMapPreviewTilemapToBgTilemapBuffer(u8, const u16 *); static bool8 UpdateDungeonMapPreview(bool8); static void InitMapOpenAnim(u8, TaskFunc); static void InitScreenForMapOpenAnim(void); static void Task_MapOpenAnim(u8); static void FreeMapOpenCloseAnim(void); static void FreeMapEdgeSprites(void); static bool8 MoveMapEdgesOutward(void); static void SetGpuWindowDimsToMapEdges(void); static void DoMapCloseAnim(u8); static void Task_MapCloseAnim(u8); static bool8 MoveMapEdgesInward(void); static void CreateMapCursor(u16, u16); static void CreateMapCursorSprite(void); static void SetMapCursorInvisibility(bool8); static void ResetCursorSnap(void); static void FreeMapCursor(void); static u8 HandleRegionMapInput(void); static u8 MoveMapCursor(void); static u8 GetRegionMapInput(void); static void SnapToIconOrButton(void); static u16 GetMapCursorX(void); static u16 GetMapCursorY(void); static u16 GetMapsecUnderCursor(void); static u16 GetDungeonMapsecUnderCursor(void); static u8 GetMapsecType(u8); static u8 GetDungeonMapsecType(u8); static u8 GetSelectedMapsecType(u8); static void GetPlayerPositionOnRegionMap_HandleOverrides(void); static u8 GetSelectedMapSection(u8, u8, s16, s16); static void CreatePlayerIcon(u16, u16); static void CreatePlayerIconSprite(void); static void SetPlayerIconInvisibility(bool8); static void FreePlayerIcon(void); static u16 GetPlayerIconX(void); static u16 GetPlayerIconY(void); static void InitMapIcons(u8, u8, TaskFunc); static void LoadMapIcons(u8); static void FinishMapIconLoad(u8); static void CreateFlyIcons(void); static void CreateDungeonIcons(void); static void SetFlyIconInvisibility(u8, u8, bool8); static void SetDungeonIconInvisibility(u8, u8, bool8); static void FreeMapIcons(void); static bool8 SaveRegionMapGpuRegs(u8); static bool8 SetRegionMapGpuRegs(u8); static void ResetGpuRegs(void); static void SetBldCnt(u8, u16, u16); static void SetBldY(u16); static void SetBldAlpha(u16, u16); static void SetWinIn(u16, u16); static void SetWinOut(u16); static void SetDispCnt(u8, bool8); static void SetGpuWindowDims(u8, const struct GpuWindowParams *); static void FreeAndResetGpuRegs(void); static void PrintTopBarTextLeft(const u8 *); static void PrintTopBarTextRight(const u8 *); static void ClearOrDrawTopBar(bool8); static void Task_FlyMap(u8); static void InitFlyMap(void); static void FreeFlyMap(u8); static void SetFlyWarpDestination(u16); #include "data/region_map/region_map_entry_strings.h" static const u16 sTopBar_Pal[] = INCBIN_U16("graphics/region_map/top_bar.gbapal"); // Palette for the top bar and dynamic text color static const u16 sMapCursor_Pal[] = INCBIN_U16("graphics/region_map/cursor.gbapal"); static const u16 sPlayerIcon_RedPal[] = INCBIN_U16("graphics/region_map/player_icon_red.gbapal"); static const u16 sPlayerIcon_LeafPal[] = INCBIN_U16("graphics/region_map/player_icon_leaf.gbapal"); static const u16 sMiscIcon_Pal[] = INCBIN_U16("graphics/region_map/misc_icon.gbapal"); // For dungeon and fly icons static const u16 sRegionMap_Pal[] = INCBIN_U16("graphics/region_map/region_map.gbapal"); static const u16 sUnusedPalette[] = { RGB(0, 0, 31), RGB(0, 12, 31), RGB_WHITE, RGB_WHITE }; static const u16 sSwitchMapCursor_Pal[] = INCBIN_U16("graphics/region_map/switch_map_cursor.gbapal"); static const u16 sMapEdge_Pal[] = INCBIN_U16("graphics/region_map/map_edge.gbapal"); static const u32 sSwitchMapCursorLeft_Gfx[] = INCBIN_U32("graphics/region_map/switch_map_cursor_left.4bpp.lz"); static const u32 sSwitchMapCursorRight_Gfx[] = INCBIN_U32("graphics/region_map/switch_map_cursor_right.4bpp.lz"); static const u32 sMapCursor_Gfx[] = INCBIN_U32("graphics/region_map/cursor.4bpp.lz"); static const u32 sPlayerIcon_Red[] = INCBIN_U32("graphics/region_map/player_icon_red.4bpp.lz"); static const u32 sPlayerIcon_Leaf[] = INCBIN_U32("graphics/region_map/player_icon_leaf.4bpp.lz"); static const u32 sRegionMap_Gfx[] = INCBIN_U32("graphics/region_map/region_map.4bpp.lz"); static const u32 sMapEdge_Gfx[] = INCBIN_U32("graphics/region_map/map_edge.4bpp.lz"); static const u32 sSwitchMapMenu_Gfx[] = INCBIN_U32("graphics/region_map/switch_map_menu.4bpp.lz"); static const u32 sKanto_Tilemap[] = INCBIN_U32("graphics/region_map/kanto.bin.lz"); static const u32 sSevii123_Tilemap[] = INCBIN_U32("graphics/region_map/sevii_123.bin.lz"); static const u32 sSevii45_Tilemap[] = INCBIN_U32("graphics/region_map/sevii_45.bin.lz"); static const u32 sSevii67_Tilemap[] = INCBIN_U32("graphics/region_map/sevii_67.bin.lz"); static const u32 sMapEdge_Tilemap[] = INCBIN_U32("graphics/region_map/map_edge.bin.lz"); static const u32 sSwitchMap_KantoSeviiAll_Tilemap[] = INCBIN_U32("graphics/region_map/switch_map_kanto_sevii_all.bin.lz"); static const u32 sSwitchMap_KantoSevii123_Tilemap[] = INCBIN_U32("graphics/region_map/switch_map_kanto_sevii_123.bin.lz"); static const u32 sSwitchMap_KantoSeviiAll2_Tilemap[] = INCBIN_U32("graphics/region_map/switch_map_kanto_sevii_all2.bin.lz"); static const u32 sMapEdge_TopLeft[] = INCBIN_U32("graphics/region_map/map_edge_top_left.4bpp.lz"); static const u32 sMapEdge_TopRight[] = INCBIN_U32("graphics/region_map/map_edge_top_right.4bpp.lz"); static const u32 sMapEdge_MidLeft[] = INCBIN_U32("graphics/region_map/map_edge_mid_left.4bpp.lz"); static const u32 sMapEdge_MidRight[] = INCBIN_U32("graphics/region_map/map_edge_mid_right.4bpp.lz"); static const u32 sMapEdge_BottomLeft[] = INCBIN_U32("graphics/region_map/map_edge_bottom_left.4bpp.lz"); static const u32 sMapEdge_BottomRight[] = INCBIN_U32("graphics/region_map/map_edge_bottom_right.4bpp.lz"); static const u32 sDungeonIcon[] = INCBIN_U32("graphics/region_map/dungeon_icon.4bpp.lz"); static const u32 sFlyIcon[] = INCBIN_U32("graphics/region_map/fly_icon.4bpp.lz"); static const u32 sBackground_Gfx[] = INCBIN_U32("graphics/region_map/background.4bpp.lz"); static const u32 sBackground_Tilemap[] = INCBIN_U32("graphics/region_map/background.bin.lz"); static const u32 sHoennRegionMap_Gfx[] = INCBIN_U32("graphics/region_map/region_map_hoenn.8bpp.lz"); static const u16 sHoennRegionMap_Pal[] = INCBIN_U16("graphics/region_map/region_map_hoenn.gbapal"); static const u32 sHoenn_Tilemap[] = INCBIN_U32("graphics/region_map/hoenn.bin.lz"); static const struct BgTemplate sHoennRegionMapBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 28, .screenSize = 2, .paletteMode = 1, .priority = 2, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 1, .mapBaseIndex = 15, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 2, .mapBaseIndex = 23, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 } }; static const struct BgTemplate sRegionMapBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 1, .mapBaseIndex = 15, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 2, .mapBaseIndex = 23, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 } }; static const struct WindowTemplate sRegionMapWindowTemplates[] = { [WIN_MAP_NAME] = { .bg = 3, .tilemapLeft = 3, .tilemapTop = 2, .width = 15, .height = 2, .paletteNum = 12, .baseBlock = 0x001 }, [WIN_DUNGEON_NAME] = { .bg = 3, .tilemapLeft = 3, .tilemapTop = 4, .width = 15, .height = 2, .paletteNum = 12, .baseBlock = 0x01f }, [WIN_MAP_PREVIEW] = { .bg = 3, .tilemapLeft = 3, .tilemapTop = 6, .width = 25, .height = 11, .paletteNum = 12, .baseBlock = 0x03d }, [WIN_TOPBAR_LEFT] = { .bg = 3, .tilemapLeft = 18, .tilemapTop = 0, .width = 5, .height = 2, .paletteNum = 12, .baseBlock = 0x150 }, [WIN_TOPBAR_RIGHT] = { .bg = 3, .tilemapLeft = 24, .tilemapTop = 0, .width = 5, .height = 2, .paletteNum = 12, .baseBlock = 0x15a }, DUMMY_WIN_TEMPLATE }; ALIGNED(4) const u8 sTextColor_White[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}; ALIGNED(4) const u8 sTextColor_Green[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GREEN, TEXT_COLOR_DARK_GRAY}; ALIGNED(4) const u8 sTextColor_Red[] = {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_DARK_GRAY}; static const u8 *const sTextColorTable[] = { [MAPSECTYPE_VISITED - 2] = sTextColor_Green, [MAPSECTYPE_NOT_VISITED - 2] = sTextColor_Red }; static const u8 sSeviiMapsecs[3][30] = { [REGIONMAP_SEVII123 - 1] = { MAPSEC_ONE_ISLAND, MAPSEC_TWO_ISLAND, MAPSEC_THREE_ISLAND, MAPSEC_KINDLE_ROAD, MAPSEC_TREASURE_BEACH, MAPSEC_CAPE_BRINK, MAPSEC_BOND_BRIDGE, MAPSEC_THREE_ISLE_PORT, MAPSEC_MT_EMBER, MAPSEC_BERRY_FOREST, MAPSEC_THREE_ISLE_PATH, MAPSEC_EMBER_SPA, MAPSEC_NONE }, [REGIONMAP_SEVII45 - 1] = { MAPSEC_FOUR_ISLAND, MAPSEC_FIVE_ISLAND, MAPSEC_SEVII_ISLE_6, MAPSEC_SEVII_ISLE_7, MAPSEC_SEVII_ISLE_8, MAPSEC_SEVII_ISLE_9, MAPSEC_RESORT_GORGEOUS, MAPSEC_WATER_LABYRINTH, MAPSEC_FIVE_ISLE_MEADOW, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NAVEL_ROCK, MAPSEC_ICEFALL_CAVE, MAPSEC_ROCKET_WAREHOUSE, MAPSEC_LOST_CAVE, MAPSEC_NONE }, [REGIONMAP_SEVII67 - 1] = { MAPSEC_SEVEN_ISLAND, MAPSEC_SIX_ISLAND, MAPSEC_OUTCAST_ISLAND, MAPSEC_GREEN_PATH, MAPSEC_WATER_PATH, MAPSEC_RUIN_VALLEY, MAPSEC_TRAINER_TOWER, MAPSEC_CANYON_ENTRANCE, MAPSEC_SEVAULT_CANYON, MAPSEC_TANOBY_RUINS, MAPSEC_SEVII_ISLE_22, MAPSEC_SEVII_ISLE_23, MAPSEC_SEVII_ISLE_24, MAPSEC_TRAINER_TOWER_2, MAPSEC_DOTTED_HOLE, MAPSEC_PATTERN_BUSH, MAPSEC_ALTERING_CAVE, MAPSEC_TANOBY_CHAMBERS, MAPSEC_TANOBY_KEY, MAPSEC_BIRTH_ISLAND, MAPSEC_MONEAN_CHAMBER, MAPSEC_LIPTOO_CHAMBER, MAPSEC_WEEPTH_CHAMBER, MAPSEC_DILFORD_CHAMBER, MAPSEC_SCUFIB_CHAMBER, MAPSEC_RIXY_CHAMBER, MAPSEC_VIAPOIS_CHAMBER, MAPSEC_NONE } }; ALIGNED(4) static const bool8 sRegionMapPermissions[REGIONMAP_TYPE_COUNT][MAPPERM_COUNT] = { [REGIONMAP_TYPE_NORMAL] = { [MAPPERM_HAS_SWITCH_BUTTON] = TRUE, [MAPPERM_HAS_MAP_PREVIEW] = TRUE, [MAPPERM_HAS_OPEN_ANIM] = TRUE, [MAPPERM_HAS_FLY_DESTINATIONS] = FALSE }, [REGIONMAP_TYPE_WALL] = { [MAPPERM_HAS_SWITCH_BUTTON] = FALSE, [MAPPERM_HAS_MAP_PREVIEW] = FALSE, [MAPPERM_HAS_OPEN_ANIM] = FALSE, [MAPPERM_HAS_FLY_DESTINATIONS] = FALSE }, [REGIONMAP_TYPE_FLY] = { [MAPPERM_HAS_SWITCH_BUTTON] = FALSE, [MAPPERM_HAS_MAP_PREVIEW] = FALSE, [MAPPERM_HAS_OPEN_ANIM] = FALSE, [MAPPERM_HAS_FLY_DESTINATIONS] = TRUE }, [REGIONMAP_TYPE_HOENN] = { [MAPPERM_HAS_SWITCH_BUTTON] = FALSE, [MAPPERM_HAS_MAP_PREVIEW] = FALSE, [MAPPERM_HAS_OPEN_ANIM] = FALSE, [MAPPERM_HAS_FLY_DESTINATIONS] = FALSE }, }; static const struct GpuWindowParams sMapsecNameWindowDims[3] = { [WIN_MAP_NAME] = {.left = 24, .top = 16, .right = 144, .bottom = 32}, [WIN_DUNGEON_NAME] = {.left = 24, .top = 32, .right = 144, .bottom = 48}, [CLEAR_NAME] = {.left = 0, .top = 0, .right = 0, .bottom = 0} }; static const struct OamData sOamData_SwitchMapCursor = { .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32) }; static const union AnimCmd sAnim_SwitchMapCursor[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_FRAME(16, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_SwitchMapCursor[] = { sAnim_SwitchMapCursor }; static const struct DungeonMapInfo sDungeonInfo[] = { { .id = MAPSEC_VIRIDIAN_FOREST, .name = sMapsecName_VIRIDIANFOREST, .desc = gText_RegionMap_AreaDesc_ViridianForest }, { .id = MAPSEC_MT_MOON, .name = sMapsecName_MTMOON, .desc = gText_RegionMap_AreaDesc_MtMoon }, { .id = MAPSEC_DIGLETTS_CAVE, .name = sMapsecName_DIGLETTSCAVE, .desc = gText_RegionMap_AreaDesc_DiglettsCave }, { .id = MAPSEC_KANTO_VICTORY_ROAD, .name = sMapsecName_VICTORYROAD, .desc = gText_RegionMap_AreaDesc_VictoryRoad }, { .id = MAPSEC_POKEMON_MANSION, .name = sMapsecName_POKMONMANSION, .desc = gText_RegionMap_AreaDesc_PokemonMansion }, { .id = MAPSEC_KANTO_SAFARI_ZONE, .name = sMapsecName_SAFARIZONE, .desc = gText_RegionMap_AreaDesc_SafariZone }, { .id = MAPSEC_ROCK_TUNNEL, .name = sMapsecName_ROCKTUNNEL, .desc = gText_RegionMap_AreaDesc_RockTunnel }, { .id = MAPSEC_SEAFOAM_ISLANDS, .name = sMapsecName_SEAFOAMISLANDS, .desc = gText_RegionMap_AreaDesc_SeafoamIslands }, { .id = MAPSEC_POKEMON_TOWER, .name = sMapsecName_POKMONTOWER, .desc = gText_RegionMap_AreaDesc_PokemonTower }, { .id = MAPSEC_CERULEAN_CAVE, .name = sMapsecName_CERULEANCAVE, .desc = gText_RegionMap_AreaDesc_CeruleanCave }, { .id = MAPSEC_POWER_PLANT, .name = sMapsecName_POWERPLANT, .desc = gText_RegionMap_AreaDesc_PowerPlant }, { .id = MAPSEC_MT_EMBER, .name = sMapsecName_MTEMBER, .desc = gText_RegionMap_AreaDesc_MtEmber }, { .id = MAPSEC_BERRY_FOREST, .name = sMapsecName_BERRYFOREST, .desc = gText_RegionMap_AreaDesc_BerryForest }, { .id = MAPSEC_ICEFALL_CAVE, .name = sMapsecName_ICEFALLCAVE, .desc = gText_RegionMap_AreaDesc_IcefallCave }, { .id = MAPSEC_LOST_CAVE, .name = sMapsecName_LOSTCAVE, .desc = gText_RegionMap_AreaDesc_LostCave }, { .id = MAPSEC_TANOBY_CHAMBERS, .name = sMapsecName_TANOBYCHAMBERS, .desc = gText_RegionMap_AreaDesc_TanobyRuins }, { .id = MAPSEC_ALTERING_CAVE, .name = sMapsecName_ALTERINGCAVE, .desc = gText_RegionMap_AreaDesc_AlteringCave }, { .id = MAPSEC_PATTERN_BUSH, .name = sMapsecName_PATTERNBUSH, .desc = gText_RegionMap_AreaDesc_PatternBush }, { .id = MAPSEC_DOTTED_HOLE, .name = sMapsecName_DOTTEDHOLE, .desc = gText_RegionMap_AreaDesc_DottedHole } }; static const struct OamData sOamData_MapEdge = { .shape = SPRITE_SHAPE(32x64), .size = SPRITE_SIZE(32x64) }; static const union AnimCmd sAnim_MapEdge[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_MapEdge[] = { sAnim_MapEdge }; static const struct GpuWindowParams sMapWindowDim = { .left = 24, .top = 16, .right = 216, .bottom = 160 }; static const struct OamData sOamData_MapCursor = { .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 2 }; static const union AnimCmd sAnim_MapCursor[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_FRAME(4, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_MapCursor[] = { sAnim_MapCursor }; static const struct OamData sOamData_PlayerIcon = { .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 2 }; static const union AnimCmd sAnim_PlayerIcon[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd *const sAnims_PlayerIcon[] = { sAnim_PlayerIcon }; static const struct OamData sOamData_FlyIcon = { .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 2 }; static const struct OamData sOamData_DungeonIcon = { .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), .priority = 2 }; static const union AnimCmd sAnim_FlyIcon[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_FRAME(4, 60), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_DungeonIconVisited[] = { ANIMCMD_FRAME(1, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnim_DungeonIconNotVisited[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnims_FlyIcon[] = { sAnim_FlyIcon }; static const union AnimCmd *const sAnims_DungeonIcon[] = { sAnim_DungeonIconVisited, sAnim_DungeonIconNotVisited }; static const u16 sWinFlags[] = { DISPCNT_WIN0_ON, DISPCNT_WIN1_ON }; static const u8 sWinRegs[][2] = { {REG_OFFSET_WIN0V, REG_OFFSET_WIN0H}, {REG_OFFSET_WIN1V, REG_OFFSET_WIN1H} }; static const u8 sTextColors[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}; #include "data/region_map/region_map_entries.h" #include "data/region_map/region_map_layout_kanto.h" #include "data/region_map/region_map_layout_sevii_123.h" #include "data/region_map/region_map_layout_sevii_45.h" #include "data/region_map/region_map_layout_sevii_67.h" static const u8 sMapFlyDestinations[][3] = { [MAPSEC_PALLET_TOWN ] = {MAP(PALLET_TOWN), SPAWN_PALLET_TOWN}, [MAPSEC_VIRIDIAN_CITY ] = {MAP(VIRIDIAN_CITY), SPAWN_VIRIDIAN_CITY}, [MAPSEC_PEWTER_CITY ] = {MAP(PEWTER_CITY), SPAWN_PEWTER_CITY}, [MAPSEC_CERULEAN_CITY ] = {MAP(CERULEAN_CITY), SPAWN_CERULEAN_CITY}, [MAPSEC_LAVENDER_TOWN ] = {MAP(LAVENDER_TOWN), SPAWN_LAVENDER_TOWN}, [MAPSEC_VERMILION_CITY ] = {MAP(VERMILION_CITY), SPAWN_VERMILION_CITY}, [MAPSEC_CELADON_CITY ] = {MAP(CELADON_CITY), SPAWN_CELADON_CITY}, [MAPSEC_FUCHSIA_CITY ] = {MAP(FUCHSIA_CITY), SPAWN_FUCHSIA_CITY}, [MAPSEC_CINNABAR_ISLAND ] = {MAP(CINNABAR_ISLAND), SPAWN_CINNABAR_ISLAND}, [MAPSEC_INDIGO_PLATEAU ] = {MAP(INDIGO_PLATEAU_EXTERIOR), SPAWN_INDIGO_PLATEAU}, [MAPSEC_SAFFRON_CITY ] = {MAP(SAFFRON_CITY), SPAWN_SAFFRON_CITY}, [MAPSEC_ROUTE_4_POKECENTER ] = {MAP(ROUTE4), SPAWN_ROUTE4}, [MAPSEC_ROUTE_10_POKECENTER ] = {MAP(ROUTE10), SPAWN_ROUTE10}, [MAPSEC_ROUTE_1 ] = {MAP(ROUTE1), 0}, [MAPSEC_ROUTE_2 ] = {MAP(ROUTE2), 0}, [MAPSEC_ROUTE_3 ] = {MAP(ROUTE3), 0}, [MAPSEC_ROUTE_4 ] = {MAP(ROUTE4), 0}, [MAPSEC_ROUTE_5 ] = {MAP(ROUTE5), 0}, [MAPSEC_ROUTE_6 ] = {MAP(ROUTE6), 0}, [MAPSEC_ROUTE_7 ] = {MAP(ROUTE7), 0}, [MAPSEC_ROUTE_8 ] = {MAP(ROUTE8), 0}, [MAPSEC_ROUTE_9 ] = {MAP(ROUTE9), 0}, [MAPSEC_ROUTE_10 ] = {MAP(ROUTE10), 0}, [MAPSEC_ROUTE_11 ] = {MAP(ROUTE11), 0}, [MAPSEC_ROUTE_12 ] = {MAP(ROUTE12), 0}, [MAPSEC_ROUTE_13 ] = {MAP(ROUTE13), 0}, [MAPSEC_ROUTE_14 ] = {MAP(ROUTE14), 0}, [MAPSEC_ROUTE_15 ] = {MAP(ROUTE15), 0}, [MAPSEC_ROUTE_16 ] = {MAP(ROUTE16), 0}, [MAPSEC_ROUTE_17 ] = {MAP(ROUTE17), 0}, [MAPSEC_ROUTE_18 ] = {MAP(ROUTE18), 0}, [MAPSEC_ROUTE_19 ] = {MAP(ROUTE19), 0}, [MAPSEC_ROUTE_20 ] = {MAP(ROUTE20), 0}, [MAPSEC_ROUTE_21 ] = {MAP(ROUTE21_NORTH), 0}, [MAPSEC_ROUTE_22 ] = {MAP(ROUTE22), 0}, [MAPSEC_ROUTE_23 ] = {MAP(ROUTE23), 0}, [MAPSEC_ROUTE_24 ] = {MAP(ROUTE24), 0}, [MAPSEC_ROUTE_25 ] = {MAP(ROUTE25), 0}, [MAPSEC_VIRIDIAN_FOREST ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_MT_MOON ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_S_S_ANNE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_UNDERGROUND_PATH ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_UNDERGROUND_PATH_2 ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_DIGLETTS_CAVE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_KANTO_VICTORY_ROAD ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_ROCKET_HIDEOUT ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_SILPH_CO ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_POKEMON_MANSION ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_KANTO_SAFARI_ZONE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_POKEMON_LEAGUE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_ROCK_TUNNEL ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_SEAFOAM_ISLANDS ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_POKEMON_TOWER ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_CERULEAN_CAVE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_POWER_PLANT ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_ONE_ISLAND ] = {MAP(ONE_ISLAND), SPAWN_ONE_ISLAND}, [MAPSEC_TWO_ISLAND ] = {MAP(TWO_ISLAND), SPAWN_TWO_ISLAND}, [MAPSEC_THREE_ISLAND ] = {MAP(THREE_ISLAND), SPAWN_THREE_ISLAND}, [MAPSEC_FOUR_ISLAND ] = {MAP(FOUR_ISLAND), SPAWN_FOUR_ISLAND}, [MAPSEC_FIVE_ISLAND ] = {MAP(FIVE_ISLAND), SPAWN_FIVE_ISLAND}, [MAPSEC_SEVEN_ISLAND ] = {MAP(SEVEN_ISLAND), SPAWN_SEVEN_ISLAND}, [MAPSEC_SIX_ISLAND ] = {MAP(SIX_ISLAND), SPAWN_SIX_ISLAND}, [MAPSEC_KINDLE_ROAD ] = {MAP(ONE_ISLAND_KINDLE_ROAD), 0}, [MAPSEC_TREASURE_BEACH ] = {MAP(ONE_ISLAND_TREASURE_BEACH), 0}, [MAPSEC_CAPE_BRINK ] = {MAP(TWO_ISLAND_CAPE_BRINK), 0}, [MAPSEC_BOND_BRIDGE ] = {MAP(THREE_ISLAND_BOND_BRIDGE), 0}, [MAPSEC_THREE_ISLE_PORT ] = {MAP(THREE_ISLAND_PORT), 0}, [MAPSEC_SEVII_ISLE_6 ] = {MAP(PROTOTYPE_SEVII_ISLE_6), 0}, [MAPSEC_SEVII_ISLE_7 ] = {MAP(PROTOTYPE_SEVII_ISLE_7), 0}, [MAPSEC_SEVII_ISLE_8 ] = {MAP(PROTOTYPE_SEVII_ISLE_8), 0}, [MAPSEC_SEVII_ISLE_9 ] = {MAP(PROTOTYPE_SEVII_ISLE_9), 0}, [MAPSEC_RESORT_GORGEOUS ] = {MAP(FIVE_ISLAND_RESORT_GORGEOUS), 0}, [MAPSEC_WATER_LABYRINTH ] = {MAP(FIVE_ISLAND_WATER_LABYRINTH), 0}, [MAPSEC_FIVE_ISLE_MEADOW ] = {MAP(FIVE_ISLAND_MEADOW), 0}, [MAPSEC_MEMORIAL_PILLAR ] = {MAP(FIVE_ISLAND_MEMORIAL_PILLAR), 0}, [MAPSEC_OUTCAST_ISLAND ] = {MAP(SIX_ISLAND_OUTCAST_ISLAND), 0}, [MAPSEC_GREEN_PATH ] = {MAP(SIX_ISLAND_GREEN_PATH), 0}, [MAPSEC_WATER_PATH ] = {MAP(SIX_ISLAND_WATER_PATH), 0}, [MAPSEC_RUIN_VALLEY ] = {MAP(SIX_ISLAND_RUIN_VALLEY), 0}, [MAPSEC_TRAINER_TOWER ] = {MAP(SEVEN_ISLAND_TRAINER_TOWER), 0}, [MAPSEC_CANYON_ENTRANCE ] = {MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), 0}, [MAPSEC_SEVAULT_CANYON ] = {MAP(SEVEN_ISLAND_SEVAULT_CANYON), 0}, [MAPSEC_TANOBY_RUINS ] = {MAP(SEVEN_ISLAND_TANOBY_RUINS), 0}, [MAPSEC_SEVII_ISLE_22 ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_SEVII_ISLE_23 ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_SEVII_ISLE_24 ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_NAVEL_ROCK ] = {MAP(NAVEL_ROCK_EXTERIOR), 0}, [MAPSEC_MT_EMBER ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_BERRY_FOREST ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_ICEFALL_CAVE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_ROCKET_WAREHOUSE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_TRAINER_TOWER_2 ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_DOTTED_HOLE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_LOST_CAVE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_PATTERN_BUSH ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_ALTERING_CAVE ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_TANOBY_CHAMBERS ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_THREE_ISLE_PATH ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_TANOBY_KEY ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_BIRTH_ISLAND ] = {MAP(BIRTH_ISLAND_EXTERIOR), 0}, [MAPSEC_MONEAN_CHAMBER ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_LIPTOO_CHAMBER ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_WEEPTH_CHAMBER ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_DILFORD_CHAMBER ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_SCUFIB_CHAMBER ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_RIXY_CHAMBER ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_VIAPOIS_CHAMBER ] = {MAP(PALLET_TOWN), 0}, [MAPSEC_EMBER_SPA ] = {MAP(PALLET_TOWN), 0}, }; static void RegionMap_DarkenPalette(u16 *pal, u16 size, u16 tint) { int i; int r, g, b; for (i = 0; i < size; i++) { r = (*pal) & 0x1F; g = ((*pal) >> 5) & 0x1F; b = ((*pal) >> 10) & 0x1F; r = (((r << 8) / 100) * tint) >> 8; g = (((g << 8) / 100) * tint) >> 8; b = (((b << 8) / 100) * tint) >> 8; *pal = RGB2(r, g, b); pal++; } } static void TintMapEdgesPalette(void) { u16 mapEdgesPal[16]; CpuCopy16(&sRegionMap_Pal[0x20], mapEdgesPal, sizeof(mapEdgesPal)); RegionMap_DarkenPalette(mapEdgesPal, NELEMS(mapEdgesPal), 95); LoadPalette(mapEdgesPal, BG_PLTT_ID(2), sizeof(mapEdgesPal)); LoadPalette(&sRegionMap_Pal[0x2F], BG_PLTT_ID(2) + 15, PLTT_SIZEOF(1)); } static void InitRegionMap(u8 type) { sRegionMap = AllocZeroed(sizeof(struct RegionMap)); if (sRegionMap == NULL) { SetMainCallback2(CB2_ReturnToField); } else { gExitStairsMovementDisabled = TRUE; sRegionMap->type = type; sRegionMap->mainState = 0; sRegionMap->openState = 0; sRegionMap->loadGfxState = 0; InitRegionMapType(); SetMainCallback2(CB2_OpenRegionMap); } } void InitRegionMapWithExitCB(u8 type, MainCallback cb) { sRegionMap = AllocZeroed(sizeof(struct RegionMap)); if (sRegionMap == NULL) { SetMainCallback2(CB2_ReturnToField); } else { gExitStairsMovementDisabled = TRUE; sRegionMap->type = type; sRegionMap->mainState = 0; sRegionMap->openState = 0; sRegionMap->loadGfxState = 0; sRegionMap->savedCallback = cb; InitRegionMapType(); SetMainCallback2(CB2_OpenRegionMap); } } static void InitRegionMapType(void) { u32 i; u32 j; u8 region; switch (sRegionMap->type) { default: case REGIONMAP_TYPE_NORMAL: case REGIONMAP_TYPE_WALL: sRegionMap->mainTask = Task_RegionMap; break; case REGIONMAP_TYPE_FLY: sRegionMap->mainTask = Task_FlyMap; break; } for (i = 0; i < MAPPERM_COUNT; i++) { sRegionMap->permissions[i] = sRegionMapPermissions[sRegionMap->type][i]; } if (!FlagGet(FLAG_SYS_SEVII_MAP_123)) sRegionMap->permissions[MAPPERM_HAS_SWITCH_BUTTON] = FALSE; region = REGIONMAP_KANTO; j = REGIONMAP_KANTO; if (gMapHeader.regionMapSectionId >= MAPSECS_SEVII_123 && gMapHeader.regionMapSectionId != MAPSEC_FARAWAY_ISLAND) { // Mapsec is in Sevii Islands, determine which map to use while (region == REGIONMAP_KANTO) { for (i = 0; sSeviiMapsecs[j][i] != MAPSEC_NONE; i++) { if (gMapHeader.regionMapSectionId == sSeviiMapsecs[j][i]) { region = j + 1; break; } } j++; } } if(gMapHeader.regionMapSectionId == MAPSEC_UNDERWATER_124) { region = REGIONMAP_SEVII123; } if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND) { region = REGIONMAP_HOENN; } if(gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER || gMapHeader.regionMapSectionId == MAPSEC_ARTISAN_CAVE || gMapHeader.regionMapSectionId == MAPSEC_SOUTHERN_ISLAND) { region = REGIONMAP_KANTO; } sRegionMap->selectedRegion = region; sRegionMap->playersRegion = region; } static void CB2_OpenRegionMap(void) { switch (sRegionMap->openState) { case 0: NullVBlankHBlankCallbacks(); break; case 1: InitRegionMapBgs(); break; case 2: ResetOamForRegionMap(); break; case 3: if (!LoadRegionMapGfx()) return; break; case 4: FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); break; case 5: BufferRegionMapBg(0, sRegionMap->layouts[sRegionMap->selectedRegion]); CopyBgTilemapBufferToVram(0); if (sRegionMap->type != REGIONMAP_TYPE_NORMAL) { BufferRegionMapBg(1, sRegionMap->layouts[REGIONMAP_COUNT]); CopyBgTilemapBufferToVram(1); } break; case 6: DisplayCurrentMapName(); PutWindowTilemap(WIN_MAP_NAME); break; case 7: DisplayCurrentDungeonName(); PutWindowTilemap(WIN_DUNGEON_NAME); break; case 8: if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE) SetBg0andBg3Hidden(TRUE); break; default: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); CreateMainMapTask(); SetRegionMapVBlankCB(); break; } sRegionMap->openState++; } static bool8 LoadRegionMapGfx(void) { switch (sRegionMap->loadGfxState) { case 0: LoadPalette(sTopBar_Pal, BG_PLTT_ID(12), sizeof(sTopBar_Pal)); break; case 1: if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND) LoadPalette(sHoennRegionMap_Pal, 0x70, 0x60); else LoadPalette(sRegionMap_Pal, 0, sizeof(sRegionMap_Pal)); TintMapEdgesPalette(); if (sRegionMap->type != REGIONMAP_TYPE_NORMAL) { LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(0), sizeof(sTopBar_Pal[15])); LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(1), sizeof(sTopBar_Pal[15])); LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(2), sizeof(sTopBar_Pal[15])); LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(3), sizeof(sTopBar_Pal[15])); LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(4), sizeof(sTopBar_Pal[15])); } break; case 2: ResetTempTileDataBuffers(); break; case 3: if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND) DecompressAndCopyTileDataToVram(0, sHoennRegionMap_Gfx, 0, 0, 0); else DecompressAndCopyTileDataToVram(0, sRegionMap_Gfx, 0, 0, 0); if (sRegionMap->type != REGIONMAP_TYPE_NORMAL) DecompressAndCopyTileDataToVram(1, sBackground_Gfx, 0, 0, 0); break; case 4: if (FreeTempTileDataBuffersIfPossible() == TRUE) return FALSE; break; case 5: if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND) LZ77UnCompWram(sHoenn_Tilemap, sRegionMap->layouts[REGIONMAP_HOENN]); else LZ77UnCompWram(sKanto_Tilemap, sRegionMap->layouts[REGIONMAP_KANTO]); break; case 6: LZ77UnCompWram(sSevii123_Tilemap, sRegionMap->layouts[REGIONMAP_SEVII123]); break; case 7: LZ77UnCompWram(sSevii45_Tilemap, sRegionMap->layouts[REGIONMAP_SEVII45]); break; case 8: LZ77UnCompWram(sSevii67_Tilemap, sRegionMap->layouts[REGIONMAP_SEVII67]); break; default: LZ77UnCompWram(sBackground_Tilemap, sRegionMap->layouts[REGIONMAP_COUNT]); return TRUE; } sRegionMap->loadGfxState++; return FALSE; } static void CreateMainMapTask(void) { CreateTask(sRegionMap->mainTask, 0); SetMainCallback2(CB2_RegionMap); } static bool32 SelectedMapsecSEEnabled(void) { if (GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, GetMapCursorY(), GetMapCursorX()) == MAPSEC_ROUTE_4_POKECENTER) return FALSE; else return TRUE; } static void PlaySEForSelectedMapsec(void) { if (SelectedMapsecSEEnabled()) { if ((GetSelectedMapsecType(LAYER_MAP) != MAPSECTYPE_ROUTE && GetSelectedMapsecType(LAYER_MAP) != MAPSECTYPE_NONE) || (GetSelectedMapsecType(LAYER_DUNGEON) != MAPSECTYPE_ROUTE && GetSelectedMapsecType(LAYER_DUNGEON) != MAPSECTYPE_NONE)) PlaySE(SE_DEX_SCROLL); if (GetMapCursorX() == SWITCH_BUTTON_X && GetMapCursorY() == SWITCH_BUTTON_Y && GetRegionMapPermission(MAPPERM_HAS_SWITCH_BUTTON) == TRUE) PlaySE(SE_M_SPIT_UP); else if (GetMapCursorX() == CANCEL_BUTTON_X && GetMapCursorY() == CANCEL_BUTTON_Y) PlaySE(SE_M_SPIT_UP); } } static void Task_RegionMap(u8 taskId) { switch (sRegionMap->mainState) { case 0: InitMapIcons(GetSelectedRegionMap(), taskId, sRegionMap->mainTask); CreateMapCursor(0, 0); CreatePlayerIcon(1, 1); sRegionMap->mainState++; break; case 1: if (sRegionMap->permissions[MAPPERM_HAS_OPEN_ANIM] == TRUE) { InitMapOpenAnim(taskId, sRegionMap->mainTask); } else { ShowBg(0); ShowBg(3); ShowBg(1); PrintTopBarTextLeft(gText_RegionMap_DPadMove); PrintTopBarTextRight(gText_RegionMap_Space); ClearOrDrawTopBar(FALSE); SetPlayerIconInvisibility(FALSE); SetMapCursorInvisibility(FALSE); SetFlyIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->flyIcons), FALSE); SetDungeonIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->dungeonIcons), FALSE); } sRegionMap->mainState++; break; case 2: if (!gPaletteFade.active && !IsDma3ManagerBusyWithBgCopy()) { DisplayCurrentMapName(); PutWindowTilemap(WIN_MAP_NAME); DisplayCurrentDungeonName(); PutWindowTilemap(WIN_DUNGEON_NAME); sRegionMap->mainState++; } break; case 3: switch (GetRegionMapInput()) { case MAP_INPUT_MOVE_START: ResetCursorSnap(); break; case MAP_INPUT_MOVE_CONT: break; case MAP_INPUT_MOVE_END: DisplayCurrentMapName(); DisplayCurrentDungeonName(); DrawDungeonNameBox(); PlaySEForSelectedMapsec(); if (GetDungeonMapsecUnderCursor() != MAPSEC_NONE) { if (GetRegionMapPermission(MAPPERM_HAS_MAP_PREVIEW) == TRUE) { if (GetSelectedMapsecType(LAYER_DUNGEON) == MAPSECTYPE_VISITED) { PrintTopBarTextRight(gText_RegionMap_AButtonGuide); } else { PrintTopBarTextRight(gText_RegionMap_Space); } } } else { if (GetMapCursorX() == SWITCH_BUTTON_X && GetMapCursorY() == SWITCH_BUTTON_Y && GetRegionMapPermission(MAPPERM_HAS_SWITCH_BUTTON) == TRUE) { PrintTopBarTextRight(gText_RegionMap_AButtonSwitch); } else if (GetMapCursorX() == CANCEL_BUTTON_X && GetMapCursorY() == CANCEL_BUTTON_Y) { PrintTopBarTextRight(gText_RegionMap_AButtonCancel); } else { PrintTopBarTextRight(gText_RegionMap_Space); } } break; case MAP_INPUT_A_BUTTON: if (GetSelectedMapsecType(LAYER_DUNGEON) == MAPSECTYPE_VISITED && sRegionMap->permissions[MAPPERM_HAS_MAP_PREVIEW] == TRUE) InitDungeonMapPreview(0, taskId, SaveMainMapTask); break; case MAP_INPUT_SWITCH: InitSwitchMapMenu(sRegionMap->selectedRegion, taskId, SaveMainMapTask); break; case MAP_INPUT_CANCEL: sRegionMap->mainState++; break; } break; case 4: if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE) { DoMapCloseAnim(taskId); // FIXME: goto required to match // sRegionMap->mainState++; goto INCREMENT_MAIN_STATE_AND_BREAK; } else { sRegionMap->mainState++; } break; case 5: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); INCREMENT_MAIN_STATE_AND_BREAK: sRegionMap->mainState++; break; default: if (!gPaletteFade.active) { FreeRegionMap(taskId); } break; } } // Unused static void SetMainMapTask(TaskFunc taskFunc) { sRegionMap->mainTask = taskFunc; } static TaskFunc GetMainMapTask(void) { return sRegionMap->mainTask; } static void SaveMainMapTask(u8 taskId) { gTasks[taskId].func = sRegionMap->mainTask; } static void FreeRegionMap(u8 taskId) { if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE) FreeMapOpenCloseAnim(); FreeMapIcons(); FreeMapCursor(); FreePlayerIcon(); FreeAndResetGpuRegs(); DestroyTask(taskId); FreeAllWindowBuffers(); if (sRegionMap->savedCallback == NULL) SetMainCallback2(gMain.savedCallback); else SetMainCallback2(sRegionMap->savedCallback); FREE_IF_NOT_NULL(sRegionMap); } static void FreeRegionMapForFlyMap(void) { FREE_IF_NOT_NULL(sRegionMap); } static void CB2_RegionMap(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCB_RegionMap(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void NullVBlankHBlankCallbacks(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); } static void SetRegionMapVBlankCB(void) { SetVBlankCallback(VBlankCB_RegionMap); } static void InitRegionMapBgs(void) { DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE); DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(FALSE); if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND) InitBgsFromTemplates(0, sHoennRegionMapBgTemplates, NELEMS(sHoennRegionMapBgTemplates)); else InitBgsFromTemplates(0, sRegionMapBgTemplates, NELEMS(sRegionMapBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); InitWindows(sRegionMapWindowTemplates); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); SetBgTilemapBuffers(); UpdateMapsecNameBox(); } static void SetBgTilemapBuffers(void) { SetBgTilemapBuffer(0, sRegionMap->bgTilemapBuffers[0]); SetBgTilemapBuffer(1, sRegionMap->bgTilemapBuffers[1]); SetBgTilemapBuffer(2, sRegionMap->bgTilemapBuffers[2]); } static void ResetOamForRegionMap(void) { ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); ResetTasks(); ScanlineEffect_Stop(); } static void SetBg0andBg3Hidden(bool8 hide) { switch (hide) { case FALSE: ShowBg(0); ShowBg(3); break; case TRUE: HideBg(0); HideBg(3); break; } } static void UpdateMapsecNameBox(void) { ResetGpuRegs(); SetBldCnt(0, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_OBJ, BLDCNT_EFFECT_DARKEN); SetBldY(BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2); SetWinIn( (WININ_WIN0_BG0 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR), (WININ_WIN1_BG0 | WININ_WIN1_BG3 | WININ_WIN1_OBJ | WININ_WIN1_CLR) >> 8); SetWinOut(WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); SetGpuWindowDims(0, &sMapsecNameWindowDims[WIN_MAP_NAME]); SetGpuWindowDims(1, &sMapsecNameWindowDims[WIN_DUNGEON_NAME]); SetDispCnt(0, FALSE); if (GetDungeonMapsecUnderCursor() != MAPSEC_NONE) SetDispCnt(1, FALSE); } static void DisplayCurrentMapName(void) { ClearWindowTilemap(WIN_MAP_NAME); FillWindowPixelBuffer(WIN_MAP_NAME, PIXEL_FILL(0)); if (GetMapsecUnderCursor() == MAPSEC_NONE) { SetGpuWindowDims(0, &sMapsecNameWindowDims[CLEAR_NAME]); } else { GetMapName(sRegionMap->mapName, GetMapsecUnderCursor(), 0); AddTextPrinterParameterized3(WIN_MAP_NAME, FONT_NORMAL, 2, 2, sTextColor_White, 0, sRegionMap->mapName); PutWindowTilemap(WIN_MAP_NAME); CopyWindowToVram(WIN_MAP_NAME, COPYWIN_GFX); SetGpuWindowDims(0, &sMapsecNameWindowDims[WIN_MAP_NAME]); } } static void DrawDungeonNameBox(void) { SetGpuWindowDims(1, &sMapsecNameWindowDims[WIN_DUNGEON_NAME]); } static void DisplayCurrentDungeonName(void) { u16 mapsecId; u16 descOffset; sRegionMap->dungeonWinTop = FALSE; sRegionMap->dungeonWinRight = 24; sRegionMap->dungeonWinBottom = 32; SetDispCnt(1, TRUE); ClearWindowTilemap(WIN_DUNGEON_NAME); mapsecId = GetDungeonMapsecUnderCursor(); if (mapsecId != MAPSEC_NONE) { descOffset = mapsecId; SetDispCnt(WIN_DUNGEON_NAME, FALSE); sRegionMap->dungeonWinTop = TRUE; sRegionMap->dungeonWinLeft = StringLength(sMapNames[descOffset]); sRegionMap->dungeonWinRight = sRegionMap->dungeonWinLeft * 10 + 50; sRegionMap->dungeonWinBottom = 48; FillWindowPixelBuffer(WIN_DUNGEON_NAME, PIXEL_FILL(0)); StringCopy(sRegionMap->dungeonName, sMapNames[descOffset]); AddTextPrinterParameterized3(WIN_DUNGEON_NAME, FONT_NORMAL, 12, 2, sTextColorTable[GetSelectedMapsecType(LAYER_DUNGEON) - 2], 0, sRegionMap->dungeonName); PutWindowTilemap(WIN_DUNGEON_NAME); CopyWindowToVram(WIN_DUNGEON_NAME, COPYWIN_FULL); } } static void ClearMapsecNameText(void) { FillWindowPixelBuffer(WIN_MAP_NAME, PIXEL_FILL(0)); CopyWindowToVram(WIN_MAP_NAME, COPYWIN_FULL); FillWindowPixelBuffer(WIN_DUNGEON_NAME, PIXEL_FILL(0)); CopyWindowToVram(WIN_DUNGEON_NAME, COPYWIN_FULL); } static void BufferRegionMapBg(u8 bg, u16 *map) { s32 i; s32 j; u8 whichMap; u16 *buffer = sRegionMap->bgTilemapBuffers[bg]; for (i = 0; i < 20; i++) { for (j = 0; j < 32; j++) { if (j < 30) buffer[32 * i + j] = map[30 * i + j]; else buffer[32 * i + j] = map[0]; } } if (sRegionMap->permissions[MAPPERM_HAS_SWITCH_BUTTON] == TRUE) { WriteSequenceToBgTilemapBuffer(0, 0x0F0, 0x18, 14, 3, 1, 0x3, 0x001); WriteSequenceToBgTilemapBuffer(0, 0x100, 0x18, 15, 3, 1, 0x3, 0x001); WriteSequenceToBgTilemapBuffer(0, 0x110, 0x18, 16, 3, 1, 0x3, 0x001); } if (sSwitchMapMenu != NULL) whichMap = sSwitchMapMenu->currentSelection; else whichMap = sRegionMap->selectedRegion; if (whichMap == REGIONMAP_SEVII45 && !FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR)) FillBgTilemapBufferRect_Palette0(0, 0x003, 13, 11, 3, 2); if (whichMap == REGIONMAP_SEVII67 && !FlagGet(FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR)) FillBgTilemapBufferRect_Palette0(0, 0x003, 21, 16, 3, 3); } static bool8 GetRegionMapPermission(u8 attr) { return sRegionMap->permissions[attr]; } static u8 GetSelectedRegionMap(void) { return sRegionMap->selectedRegion; } static u8 GetRegionMapPlayerIsOn(void) { return sRegionMap->playersRegion; } static void SetSelectedRegionMap(u8 region) { sRegionMap->selectedRegion = region; } // Unused static void SetRegionMapPlayerIsOn(u8 region) { sRegionMap->playersRegion = region; } static void InitSwitchMapMenu(u8 whichMap, u8 taskId, TaskFunc taskFunc) { sSwitchMapMenu = AllocZeroed(sizeof(struct SwitchMapMenu)); if (FlagGet(FLAG_SYS_SEVII_MAP_4567)) sSwitchMapMenu->maxSelection = 3; else if (FlagGet(FLAG_SYS_SEVII_MAP_123)) sSwitchMapMenu->maxSelection = 1; else sSwitchMapMenu->maxSelection = 0; sSwitchMapMenu->cursorSubsprite[0].x = 88; sSwitchMapMenu->cursorSubsprite[1].x = 152; switch (sSwitchMapMenu->maxSelection) { case 1: LZ77UnCompWram(sSwitchMap_KantoSevii123_Tilemap, sSwitchMapMenu->switchMapTilemap); sSwitchMapMenu->yOffset = 6; break; case 2: // never reached LZ77UnCompWram(sSwitchMap_KantoSeviiAll2_Tilemap, sSwitchMapMenu->switchMapTilemap); sSwitchMapMenu->yOffset = 4; break; case 3: default: sSwitchMapMenu->yOffset = 3; LZ77UnCompWram(sSwitchMap_KantoSeviiAll_Tilemap, sSwitchMapMenu->switchMapTilemap); break; } LZ77UnCompWram(sSwitchMapMenu_Gfx, sSwitchMapMenu->switchMapTiles); sSwitchMapMenu->mainState = 0; sSwitchMapMenu->currentSelection = whichMap; sSwitchMapMenu->exitTask = taskFunc; sSwitchMapMenu->chosenRegion = GetRegionMapPlayerIsOn(); SaveRegionMapGpuRegs(0); PrintTopBarTextRight(gText_RegionMap_AButtonOK); gTasks[taskId].func = Task_SwitchMapMenu; } static void ResetGpuRegsForSwitchMapMenu(void) { ResetGpuRegs(); SetBldCnt((BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ) >> 8, BLDCNT_TGT1_BG2, BLDCNT_EFFECT_BLEND); SetBldAlpha(16 - sSwitchMapMenu->alpha, sSwitchMapMenu->alpha); } static bool8 FadeSwitchMapMenuIn(void) { if (sSwitchMapMenu->alpha < 16) { SetBldAlpha(16 - sSwitchMapMenu->alpha, sSwitchMapMenu->alpha); sSwitchMapMenu->alpha += 2; return FALSE; } else { return TRUE; } } static bool8 FadeSwitchMapMenuOut(void) { if (sSwitchMapMenu->alpha >= 2) { sSwitchMapMenu->alpha -= 2; SetBldAlpha(16 - sSwitchMapMenu->alpha, sSwitchMapMenu->alpha); return FALSE; } else { return TRUE; } } static void Task_SwitchMapMenu(u8 taskId) { switch (sSwitchMapMenu->mainState) { case 0: NullVBlankHBlankCallbacks(); PrintTopBarTextLeft(gText_RegionMap_UpDownPick); sSwitchMapMenu->mainState++; break; case 1: LoadBgTiles(2, sSwitchMapMenu->switchMapTiles, sizeof(sSwitchMapMenu->switchMapTiles), 0); sSwitchMapMenu->mainState++; break; case 2: LoadSwitchMapTilemap(2, sSwitchMapMenu->switchMapTilemap); CopyBgTilemapBufferToVram(2); sSwitchMapMenu->mainState++; break; case 3: ClearMapsecNameText(); sSwitchMapMenu->mainState++; break; case 4: ResetGpuRegsForSwitchMapMenu(); ShowBg(2); sSwitchMapMenu->mainState++; break; case 5: SetRegionMapVBlankCB(); sSwitchMapMenu->mainState++; break; case 6: if (FadeSwitchMapMenuIn() == TRUE) { SetGpuRegsToDimScreen(); sSwitchMapMenu->mainState++; } break; case 7: if (DimScreenForSwitchMapMenu() == TRUE) { sSwitchMapMenu->mainState++; } break; case 8: if (CreateSwitchMapCursor() == TRUE) { sSwitchMapMenu->mainState++; } break; case 9: if (HandleSwitchMapInput() == TRUE) { SetSelectedRegionMap(sSwitchMapMenu->currentSelection); if (GetRegionMapPlayerIsOn() == sSwitchMapMenu->currentSelection) { SetPlayerIconInvisibility(FALSE); SetFlyIconInvisibility(sSwitchMapMenu->currentSelection, NELEMS(sMapIcons->flyIcons), FALSE); SetDungeonIconInvisibility(sSwitchMapMenu->currentSelection, NELEMS(sMapIcons->dungeonIcons), FALSE); } sSwitchMapMenu->mainState++; } break; case 10: if (BrightenScreenForSwitchMapMenu() == TRUE) { FreeSwitchMapCursor(); ResetGpuRegsForSwitchMapMenu(); sSwitchMapMenu->mainState++; } break; case 11: if (FadeSwitchMapMenuOut() == TRUE) { sSwitchMapMenu->mainState++; } break; case 12: SetMapCursorInvisibility(FALSE); sSwitchMapMenu->mainState++; break; default: FreeSwitchMapMenu(taskId); break; } } static void FreeSwitchMapMenu(u8 taskId) { gTasks[taskId].func = sSwitchMapMenu->exitTask; HideBg(2); PrintTopBarTextLeft(gText_RegionMap_DPadMove); PrintTopBarTextRight(gText_RegionMap_AButtonSwitch); UpdateMapsecNameBox(); DrawDungeonNameBox(); SetGpuWindowDims(0, &sMapsecNameWindowDims[CLEAR_NAME]); FREE_IF_NOT_NULL(sSwitchMapMenu); } static bool8 BrightenScreenForSwitchMapMenu(void) { if (sSwitchMapMenu->blendY != 0) { sSwitchMapMenu->blendY--; SetGpuReg(REG_OFFSET_BLDY, sSwitchMapMenu->blendY); return FALSE; } else { SetGpuReg(REG_OFFSET_BLDY, 0); return TRUE; } } static void LoadSwitchMapTilemap(u8 bg, u16 *map) { s32 i; s32 j; u16 *buffer = sRegionMap->bgTilemapBuffers[bg]; for (i = 0; i < 20; i++) { for (j = 0; j < 32; j++) { if (j < 30) buffer[32 * i + j] = map[30 * i + j]; else buffer[32 * i + j] = map[0]; } } } static void SetGpuRegsToDimScreen(void) { struct GpuWindowParams data; data.left = sSwitchMapMenu->highlight.left = 72; data.top = sSwitchMapMenu->highlight.top = 8 * (sSwitchMapMenu->yOffset + 4 * sSwitchMapMenu->currentSelection); data.right = sSwitchMapMenu->highlight.right = 168; data.bottom = sSwitchMapMenu->highlight.bottom = sSwitchMapMenu->highlight.top + 32; ResetGpuRegs(); SetBldCnt(0, (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_OBJ), BLDCNT_EFFECT_DARKEN); SetWinIn((WININ_WIN0_BG_ALL | WININ_WIN0_OBJ), (WININ_WIN1_BG0 | WININ_WIN1_BG2 | WININ_WIN1_OBJ) >> 8); SetWinOut(WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetDispCnt(1, FALSE); SetGpuWindowDims(1, &data); } static bool8 DimScreenForSwitchMapMenu(void) { if (sSwitchMapMenu->blendY < 6) { sSwitchMapMenu->blendY++; SetBldY(sSwitchMapMenu->blendY); return FALSE; } else { return TRUE; } } static bool8 HandleSwitchMapInput(void) { bool8 changedSelection = FALSE; struct GpuWindowParams data; data.left = sSwitchMapMenu->highlight.left = 72; data.top = sSwitchMapMenu->highlight.top = 8 * (sSwitchMapMenu->yOffset + 4 * sSwitchMapMenu->currentSelection); data.right = sSwitchMapMenu->highlight.right = 168; data.bottom = sSwitchMapMenu->highlight.bottom = sSwitchMapMenu->highlight.top + 32; if (JOY_NEW(DPAD_UP) && sSwitchMapMenu->currentSelection != 0) { PlaySE(SE_BAG_CURSOR); sSwitchMapMenu->currentSelection--; changedSelection = TRUE; } if (JOY_NEW(DPAD_DOWN) && sSwitchMapMenu->currentSelection < sSwitchMapMenu->maxSelection) { PlaySE(SE_BAG_CURSOR); sSwitchMapMenu->currentSelection++; changedSelection = TRUE; } if (JOY_NEW(A_BUTTON) && sSwitchMapMenu->blendY == 6) { PlaySE(SE_M_SWIFT); sSwitchMapMenu->chosenRegion = sSwitchMapMenu->currentSelection; return TRUE; } if (JOY_NEW(B_BUTTON)) { sSwitchMapMenu->currentSelection = sSwitchMapMenu->chosenRegion; BufferRegionMapBg(0, sRegionMap->layouts[sSwitchMapMenu->currentSelection]); CopyBgTilemapBufferToVram(0); SetFlyIconInvisibility(0xFF, NELEMS(sMapIcons->flyIcons), TRUE); SetDungeonIconInvisibility(0xFF, NELEMS(sMapIcons->dungeonIcons), TRUE); return TRUE; } if (changedSelection) { BufferRegionMapBg(0, sRegionMap->layouts[sSwitchMapMenu->currentSelection]); PrintTopBarTextRight(gText_RegionMap_AButtonOK); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); SetFlyIconInvisibility(0xFF, NELEMS(sMapIcons->flyIcons), TRUE); SetDungeonIconInvisibility(0xFF, NELEMS(sMapIcons->dungeonIcons), TRUE); SetFlyIconInvisibility(sSwitchMapMenu->currentSelection, NELEMS(sMapIcons->flyIcons), FALSE); SetDungeonIconInvisibility(sSwitchMapMenu->currentSelection, NELEMS(sMapIcons->dungeonIcons), FALSE); } if (sSwitchMapMenu->currentSelection != GetRegionMapPlayerIsOn()) SetPlayerIconInvisibility(TRUE); else SetPlayerIconInvisibility(FALSE); SetGpuWindowDims(1, &data); return FALSE; } static void SpriteCB_SwitchMapCursor(struct Sprite *sprite) { sprite->y = sSwitchMapMenu->highlight.top + 16; } static bool8 CreateSwitchMapCursor(void) { switch (sSwitchMapMenu->cursorLoadState) { case 0: LZ77UnCompWram(sSwitchMapCursorLeft_Gfx, sSwitchMapMenu->cursorSubsprite[0].tiles); break; case 1: LZ77UnCompWram(sSwitchMapCursorRight_Gfx, sSwitchMapMenu->cursorSubsprite[1].tiles); break; case 2: CreateSwitchMapCursorSubsprite(0, 2, 2); CreateSwitchMapCursorSubsprite(1, 3, 3); break; default: return TRUE; } sSwitchMapMenu->cursorLoadState++; return FALSE; } static void CreateSwitchMapCursorSubsprite(u8 whichSprite, u16 tileTag, u16 palTag) { CreateSwitchMapCursorSubsprite_(whichSprite, tileTag, palTag); } static void CreateSwitchMapCursorSubsprite_(u8 whichSprite, u16 tileTag, u16 palTag) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = sSwitchMapMenu->cursorSubsprite[whichSprite].tiles, .size = sizeof(sSwitchMapMenu->cursorSubsprite[whichSprite].tiles), .tag = tileTag }; struct SpritePalette spritePalette = { .data = sSwitchMapCursor_Pal, .tag = palTag }; struct SpriteTemplate template = { .tileTag = tileTag, .paletteTag = palTag, .oam = &sOamData_SwitchMapCursor, .anims = sAnims_SwitchMapCursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SwitchMapCursor }; sSwitchMapMenu->cursorSubsprite[whichSprite].tileTag = tileTag; sSwitchMapMenu->cursorSubsprite[whichSprite].palTag = palTag; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, sSwitchMapMenu->cursorSubsprite[whichSprite].x, 8 * (sSwitchMapMenu->yOffset + 4 * sSwitchMapMenu->currentSelection), 0); sSwitchMapMenu->cursorSubsprite[whichSprite].sprite = &gSprites[spriteId]; gSprites[spriteId].invisible = FALSE; } static void FreeSwitchMapCursor(void) { u32 i; for (i = 0; i < NELEMS(sSwitchMapMenu->cursorSubsprite); i++) { if (sSwitchMapMenu->cursorSubsprite[i].sprite != NULL) { DestroySprite(sSwitchMapMenu->cursorSubsprite[i].sprite); FreeSpriteTilesByTag(sSwitchMapMenu->cursorSubsprite[i].tileTag); FreeSpritePaletteByTag(sSwitchMapMenu->cursorSubsprite[i].palTag); } } } static const u8 *GetDungeonFlavorText(u16 mapsec) { u32 i; for (i = 0; i < NELEMS(sDungeonInfo); i++) { if (sDungeonInfo[i].id == mapsec) return sDungeonInfo[i].desc; } return gText_RegionMap_NoData; } static const u8 *GetDungeonName(u16 mapsec) { u32 i; for (i = 0; i < NELEMS(sDungeonInfo); i++) { if (sDungeonInfo[i].id == mapsec) return sDungeonInfo[i].name; } return gText_RegionMap_NoData; } static void InitDungeonMapPreview(u8 unused, u8 taskId, TaskFunc taskFunc) { u8 mapsec; sDungeonMapPreview = AllocZeroed(sizeof(struct DungeonMapPreview)); mapsec = GetDungeonMapsecUnderCursor(); if (mapsec == MAPSEC_TANOBY_CHAMBERS) mapsec = MAPSEC_MONEAN_CHAMBER; sDungeonMapPreview->mapPreviewInfo = GetDungeonMapPreviewScreenInfo(mapsec); if (sDungeonMapPreview->mapPreviewInfo == NULL) sDungeonMapPreview->mapPreviewInfo = GetDungeonMapPreviewScreenInfo(MAPSEC_ROCK_TUNNEL); sDungeonMapPreview->mainState = 0; sDungeonMapPreview->loadState = 0; sDungeonMapPreview->savedTask = taskFunc; sDungeonMapPreview->blendY = 0; SaveRegionMapGpuRegs(0); ResetGpuRegs(); ClearMapsecNameText(); gTasks[taskId].func = Task_DungeonMapPreview; } static bool8 LoadMapPreviewGfx(void) { switch (sDungeonMapPreview->loadState) { case 0: LZ77UnCompWram(sDungeonMapPreview->mapPreviewInfo->tilesptr, sDungeonMapPreview->tiles); break; case 1: LZ77UnCompWram(sDungeonMapPreview->mapPreviewInfo->tilemapptr, sDungeonMapPreview->tilemap); break; case 2: LoadBgTiles(2, sDungeonMapPreview->tiles, sizeof(sDungeonMapPreview->tiles), 0); break; case 3: LoadPalette(sDungeonMapPreview->mapPreviewInfo->palptr, BG_PLTT_ID(13), 3 * PLTT_SIZE_4BPP); break; default: return TRUE; } sDungeonMapPreview->loadState++; return FALSE; } static void Task_DungeonMapPreview(u8 taskId) { switch (sDungeonMapPreview->mainState) { case 0: NullVBlankHBlankCallbacks(); sDungeonMapPreview->mainState++; break; case 1: if (LoadMapPreviewGfx() == TRUE) sDungeonMapPreview->mainState++; break; case 2: InitScreenForDungeonMapPreview(); PrintTopBarTextRight(gText_RegionMap_AButtonCancel2); sDungeonMapPreview->mainState++; break; case 3: CopyMapPreviewTilemapToBgTilemapBuffer(2, sDungeonMapPreview->tilemap); CopyBgTilemapBufferToVram(2); sDungeonMapPreview->mainState++; break; case 4: ShowBg(2); sDungeonMapPreview->mainState++; break; case 5: SetRegionMapVBlankCB(); sDungeonMapPreview->mainState++; break; case 6: if (UpdateDungeonMapPreview(FALSE) == TRUE) sDungeonMapPreview->mainState++; break; case 7: gTasks[taskId].func = Task_DrawDungeonMapPreviewFlavorText; break; case 8: if (UpdateDungeonMapPreview(TRUE) == TRUE) { sDungeonMapPreview->mainState++; } break; case 9: FreeDungeonMapPreview(taskId); sDungeonMapPreview->mainState++; break; } } // Tints the dungeon preview image in the background and overlays the name and description of the dungeon static void Task_DrawDungeonMapPreviewFlavorText(u8 taskId) { switch (sDungeonMapPreview->drawState) { case 0: sDungeonMapPreview->red = 0x0133; sDungeonMapPreview->green = 0x0100; sDungeonMapPreview->blue = 0x00F0; sDungeonMapPreview->drawState++; break; case 1: // Delay if (sDungeonMapPreview->timer++ > 40) { sDungeonMapPreview->timer = 0; sDungeonMapPreview->drawState++; } break; case 2: FillWindowPixelBuffer(WIN_MAP_PREVIEW, PIXEL_FILL(0)); CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_FULL); PutWindowTilemap(WIN_MAP_PREVIEW); sDungeonMapPreview->drawState++; break; case 3: // Draw text if (sDungeonMapPreview->timer > 25) { AddTextPrinterParameterized3(WIN_MAP_PREVIEW, FONT_NORMAL, 4, 0, sTextColor_Green, -1, GetDungeonName(GetDungeonMapsecUnderCursor())); AddTextPrinterParameterized3(WIN_MAP_PREVIEW, FONT_NORMAL, 2, 14, sTextColor_White, -1, GetDungeonFlavorText(GetDungeonMapsecUnderCursor())); CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_FULL); sDungeonMapPreview->drawState++; } // Tint image else if (sDungeonMapPreview->timer > 20) { sDungeonMapPreview->red -= 6; sDungeonMapPreview->green -= 5; sDungeonMapPreview->blue -= 5; CpuCopy16(sDungeonMapPreview->mapPreviewInfo->palptr, sDungeonMapPreview->palette, 0x60); TintPalette_CustomTone(sDungeonMapPreview->palette, 48, sDungeonMapPreview->red, sDungeonMapPreview->green, sDungeonMapPreview->blue); LoadPalette(sDungeonMapPreview->palette, BG_PLTT_ID(13), sizeof(sDungeonMapPreview->palette)); } sDungeonMapPreview->timer++; break; case 4: if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { FillWindowPixelBuffer(WIN_MAP_PREVIEW, PIXEL_FILL(0)); CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_FULL); sDungeonMapPreview->mainState++; sDungeonMapPreview->drawState++; } break; default: gTasks[taskId].func = Task_DungeonMapPreview; break; } } static void FreeDungeonMapPreview(u8 taskId) { gTasks[taskId].func = sDungeonMapPreview->savedTask; HideBg(2); SetRegionMapGpuRegs(0); DisplayCurrentMapName(); DisplayCurrentDungeonName(); UpdateMapsecNameBox(); DrawDungeonNameBox(); PrintTopBarTextRight(gText_RegionMap_AButtonGuide); FREE_IF_NOT_NULL(sDungeonMapPreview); } static void CopyMapPreviewTilemapToBgTilemapBuffer(u8 bgId, const u16 * tilemap) { CopyToBgTilemapBufferRect(2, tilemap, 0, 0, 32, 20); } static void InitScreenForDungeonMapPreview(void) { u16 x; u16 y; ResetGpuRegs(); SetBldCnt(0, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_OBJ, BLDCNT_EFFECT_DARKEN); SetBldY(sDungeonMapPreview->blendY); SetWinIn(0, (WININ_WIN1_BG0 | WININ_WIN1_BG2 | WININ_WIN1_BG3) >> 8); SetWinOut(WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetDispCnt(1, FALSE); x = GetMapCursorX(); y = GetMapCursorY(); sDungeonMapPreview->left = 8 * x + 32; sDungeonMapPreview->top = 8 * y + 24; sDungeonMapPreview->right = sDungeonMapPreview->left + 8; sDungeonMapPreview->bottom = sDungeonMapPreview->top + 8; sDungeonMapPreview->leftIncrement = (16 - sDungeonMapPreview->left) / 8; sDungeonMapPreview->topIncrement = (32 - sDungeonMapPreview->top) / 8; sDungeonMapPreview->rightIncrement = (224 - sDungeonMapPreview->right) / 8; sDungeonMapPreview->bottomIncrement = (136 - sDungeonMapPreview->bottom) / 8; } static bool8 UpdateDungeonMapPreview(bool8 closing) { struct GpuWindowParams data; if (!closing) { if (sDungeonMapPreview->updateCounter < 8) { sDungeonMapPreview->left += sDungeonMapPreview->leftIncrement; sDungeonMapPreview->top += sDungeonMapPreview->topIncrement; sDungeonMapPreview->right += sDungeonMapPreview->rightIncrement; sDungeonMapPreview->bottom += sDungeonMapPreview->bottomIncrement; sDungeonMapPreview->updateCounter++; if (sDungeonMapPreview->blendY < 6) sDungeonMapPreview->blendY++; } else { return TRUE; } } else { if (sDungeonMapPreview->updateCounter == 0) { return TRUE; } else { sDungeonMapPreview->left -= sDungeonMapPreview->leftIncrement; sDungeonMapPreview->top -= sDungeonMapPreview->topIncrement; sDungeonMapPreview->right -= sDungeonMapPreview->rightIncrement; sDungeonMapPreview->bottom -= sDungeonMapPreview->bottomIncrement; sDungeonMapPreview->updateCounter--; if (sDungeonMapPreview->blendY > 0) sDungeonMapPreview->blendY--; } } data.left = sDungeonMapPreview->left; data.top = sDungeonMapPreview->top; data.right = sDungeonMapPreview->right; data.bottom = sDungeonMapPreview->bottom; SetGpuWindowDims(1, &data); SetBldY(sDungeonMapPreview->blendY); return FALSE; } static void SpriteCB_MapEdge(struct Sprite *sprite) { } static void CreateMapEdgeSprite(u8 mapEdgeNum, u8 tileTag, u8 palTag) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = sMapOpenCloseAnim->mapEdges[mapEdgeNum], .size = 0x400, .tag = tileTag }; struct SpritePalette spritePalette = { .data = sMapEdge_Pal, .tag = palTag }; struct SpriteTemplate template = { .tileTag = tileTag, .paletteTag = palTag, .oam = &sOamData_MapEdge, .anims = sAnims_MapEdge, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_MapEdge }; sMapOpenCloseAnim->mapEdges[mapEdgeNum]->tileTag = tileTag; sMapOpenCloseAnim->mapEdges[mapEdgeNum]->palTag = palTag; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, sMapOpenCloseAnim->mapEdges[mapEdgeNum]->x, sMapOpenCloseAnim->mapEdges[mapEdgeNum]->y, 0); sMapOpenCloseAnim->mapEdges[mapEdgeNum]->sprite = &gSprites[spriteId]; gSprites[spriteId].invisible = TRUE; } static void InitMapOpenAnim(u8 taskId, TaskFunc taskFunc) { u32 i; sMapOpenCloseAnim = AllocZeroed(sizeof(struct MapOpenCloseAnim)); for (i = 0; i < NELEMS(sMapOpenCloseAnim->mapEdges); i++) { sMapOpenCloseAnim->mapEdges[i] = AllocZeroed(sizeof(struct MapEdge)); sMapOpenCloseAnim->mapEdges[i]->x = 32 * (i / 3) + 104; sMapOpenCloseAnim->mapEdges[i]->y = 64 * (i % 3) + 40; } SaveRegionMapGpuRegs(0); ResetGpuRegs(); InitScreenForMapOpenAnim(); SetBg0andBg3Hidden(TRUE); sMapOpenCloseAnim->exitTask = taskFunc; gTasks[taskId].func = Task_MapOpenAnim; } static void SetMapEdgeInvisibility(u8 mapEdgeNum, bool8 invisible) { u32 i; if (mapEdgeNum == NELEMS(sMapOpenCloseAnim->mapEdges)) { for (i = 0; i < NELEMS(sMapOpenCloseAnim->mapEdges); i++) { sMapOpenCloseAnim->mapEdges[i]->sprite->invisible = invisible; } } else { sMapOpenCloseAnim->mapEdges[mapEdgeNum]->sprite->invisible = invisible; } } static bool8 LoadMapEdgeGfx(void) { switch (sMapOpenCloseAnim->loadGfxState) { case 0: LZ77UnCompWram(sMapEdge_TopLeft, sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->tiles); CreateMapEdgeSprite(MAPEDGE_TOP_LEFT, 4, 4); break; case 1: LZ77UnCompWram(sMapEdge_MidLeft, sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->tiles); CreateMapEdgeSprite(MAPEDGE_MID_LEFT, 5, 5); break; case 2: LZ77UnCompWram(sMapEdge_BottomLeft, sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->tiles); CreateMapEdgeSprite(MAPEDGE_BOT_LEFT, 6, 6); break; case 3: LZ77UnCompWram(sMapEdge_TopRight, sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->tiles); CreateMapEdgeSprite(MAPEDGE_TOP_RIGHT, 7, 7); break; case 4: LZ77UnCompWram(sMapEdge_MidRight, sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->tiles); CreateMapEdgeSprite(MAPEDGE_MID_RIGHT, 8, 8); break; case 5: LZ77UnCompWram(sMapEdge_BottomRight, sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->tiles); CreateMapEdgeSprite(MAPEDGE_BOT_RIGHT, 9, 9); break; case 6: LZ77UnCompWram(sMapEdge_Gfx, sMapOpenCloseAnim->tiles); break; case 7: LZ77UnCompWram(sMapEdge_Tilemap, sMapOpenCloseAnim->tilemap); break; case 8: LoadBgTiles(1, sMapOpenCloseAnim->tiles, BG_SCREEN_SIZE, 0); break; default: return TRUE; } sMapOpenCloseAnim->loadGfxState++; return FALSE; } static void InitScreenForMapOpenAnim(void) { struct GpuWindowParams data; data.left = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->x + 8; data.top = 16; data.right = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->x - 8; data.bottom = 160; SetBldCnt(0, BLDCNT_TGT1_BG1, BLDCNT_EFFECT_NONE); SetWinIn((WININ_WIN0_BG1 | WININ_WIN0_OBJ), 0); SetWinOut(WINOUT_WIN01_OBJ); SetGpuWindowDims(0, &data); SetDispCnt(0, FALSE); } static void SetGpuRegsToFadeMapToWhite(void) { struct GpuWindowParams data = sMapWindowDim; ResetGpuRegs(); SetBldCnt(BLDCNT_TGT2_BG1 >> 8, (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_BD), BLDCNT_EFFECT_LIGHTEN); SetBldY(sMapOpenCloseAnim->blendY); SetWinIn((WININ_WIN0_ALL & ~WININ_WIN0_BG3), 0); SetWinOut(WINOUT_WIN01_BG1 | WINOUT_WIN01_OBJ); SetGpuWindowDims(0, &data); SetDispCnt(0, FALSE); } static void FinishMapOpenAnim(u8 taskId) { gTasks[taskId].func = sMapOpenCloseAnim->exitTask; } static void FreeMapOpenCloseAnim(void) { u32 i; FreeMapEdgeSprites(); for (i = 0; i < NELEMS(sMapOpenCloseAnim->mapEdges); i++) { FREE_IF_NOT_NULL(sMapOpenCloseAnim->mapEdges[i]); } FREE_IF_NOT_NULL(sMapOpenCloseAnim); } static void FreeMapEdgeSprites(void) { u32 i; for (i = 0; i < NELEMS(sMapOpenCloseAnim->mapEdges); i++) { sMapOpenCloseAnim->mapEdges[i]->x = sMapOpenCloseAnim->mapEdges[i]->sprite->x; sMapOpenCloseAnim->mapEdges[i]->y = sMapOpenCloseAnim->mapEdges[i]->sprite->y; if (sMapOpenCloseAnim->mapEdges[i]->sprite != NULL) { DestroySprite(sMapOpenCloseAnim->mapEdges[i]->sprite); FreeSpriteTilesByTag(sMapOpenCloseAnim->mapEdges[i]->tileTag); FreeSpritePaletteByTag(sMapOpenCloseAnim->mapEdges[i]->palTag); } } } static void Task_MapOpenAnim(u8 taskId) { switch (sMapOpenCloseAnim->openState) { case 0: NullVBlankHBlankCallbacks(); sMapOpenCloseAnim->openState++; break; case 1: if (LoadMapEdgeGfx() == TRUE) sMapOpenCloseAnim->openState++; break; case 2: CopyToBgTilemapBufferRect(1, sMapOpenCloseAnim->tilemap, 0, 0, 30, 20); sMapOpenCloseAnim->openState++; break; case 3: CopyBgTilemapBufferToVram(1); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetRegionMapVBlankCB(); sMapOpenCloseAnim->openState++; break; case 4: ShowBg(0); ShowBg(3); ShowBg(1); SetMapEdgeInvisibility(NELEMS(sMapOpenCloseAnim->mapEdges), FALSE); SetGpuWindowDimsToMapEdges(); sMapOpenCloseAnim->openState++; break; case 5: if (!gPaletteFade.active) { sMapOpenCloseAnim->openState++; PlaySE(SE_CARD_OPEN); } break; case 6: if (MoveMapEdgesOutward() == TRUE) sMapOpenCloseAnim->openState++; break; case 7: SetPlayerIconInvisibility(FALSE); SetMapCursorInvisibility(FALSE); sMapOpenCloseAnim->openState++; break; case 8: sMapOpenCloseAnim->blendY = 15; SetGpuRegsToFadeMapToWhite(); SetBg0andBg3Hidden(FALSE); SetFlyIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->flyIcons), FALSE); SetDungeonIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->dungeonIcons), FALSE); sMapOpenCloseAnim->openState++; break; case 9: PrintTopBarTextLeft(gText_RegionMap_DPadMove); if (GetSelectedMapsecType(LAYER_DUNGEON) != MAPSECTYPE_VISITED) PrintTopBarTextRight(gText_RegionMap_Space); else PrintTopBarTextRight(gText_RegionMap_AButtonGuide); ClearOrDrawTopBar(FALSE); sMapOpenCloseAnim->openState++; break; case 10: LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(0), sizeof(sTopBar_Pal[15])); LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(1), sizeof(sTopBar_Pal[15])); LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(2), sizeof(sTopBar_Pal[15])); LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(3), sizeof(sTopBar_Pal[15])); LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(4), sizeof(sTopBar_Pal[15])); sMapOpenCloseAnim->openState++; break; case 11: FillBgTilemapBufferRect(1, 0x002, 0, 1, 1, 1, 2); FillBgTilemapBufferRect(1, 0x003, 1, 1, 1, 1, 2); FillBgTilemapBufferRect(1, 0x03E, 28, 1, 1, 1, 2); FillBgTilemapBufferRect(1, 0x03F, 29, 1, 1, 1, 2); FillBgTilemapBufferRect(1, 0x03D, 2, 1, 26, 1, 2); CopyBgTilemapBufferToVram(1); m4aSongNumStop(SE_CARD_OPEN); PlaySE(SE_ROTATING_GATE); sMapOpenCloseAnim->openState++; break; case 12: if (sMapOpenCloseAnim->blendY == 2) { SetMapEdgeInvisibility(NELEMS(sMapOpenCloseAnim->mapEdges), TRUE); sMapOpenCloseAnim->openState++; SetBldY(0); } else { sMapOpenCloseAnim->blendY--; SetBldY(sMapOpenCloseAnim->blendY); } break; case 13: SetRegionMapGpuRegs(0); DisplayCurrentDungeonName(); sMapOpenCloseAnim->openState++; break; default: FreeMapEdgeSprites(); FinishMapOpenAnim(taskId); break; } } static bool8 MoveMapEdgesOutward(void) { SetGpuWindowDimsToMapEdges(); if (sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x == 0) { return TRUE; } else if (sMapOpenCloseAnim->moveState > 17) { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 1; } else if (sMapOpenCloseAnim->moveState > 14) { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 2; } else if (sMapOpenCloseAnim->moveState > 10) { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 3; } else if (sMapOpenCloseAnim->moveState > 6) { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 5; } else { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 8; } sMapOpenCloseAnim->moveState++; return FALSE; } static void SetGpuWindowDimsToMapEdges(void) { struct GpuWindowParams data; data.left = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x; data.top = 16; data.right = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x; data.bottom = 160; SetGpuWindowDims(0, &data); } static void InitScreenForMapCloseAnim(void) { struct GpuWindowParams data; data.left = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->x + 16; data.top = 16; data.right = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->x - 16; data.bottom = 160; SetBldCnt(0, BLDCNT_TGT1_BG1, BLDCNT_EFFECT_NONE); SetWinIn((WININ_WIN0_BG1 | WININ_WIN0_OBJ), 0); SetWinOut(WINOUT_WIN01_OBJ); SetGpuWindowDims(0, &data); SetDispCnt(0, FALSE); } static void DoMapCloseAnim(u8 taskId) { gTasks[taskId].func = Task_MapCloseAnim; } static void CreateMapEdgeSprites(void) { CreateMapEdgeSprite(0, 4, 4); CreateMapEdgeSprite(1, 5, 5); CreateMapEdgeSprite(2, 6, 6); CreateMapEdgeSprite(3, 7, 7); CreateMapEdgeSprite(4, 8, 8); CreateMapEdgeSprite(5, 9, 9); } static void Task_MapCloseAnim(u8 taskId) { switch (sMapOpenCloseAnim->closeState) { case 0: ClearOrDrawTopBar(TRUE); CopyWindowToVram(WIN_TOPBAR_LEFT, COPYWIN_FULL); CopyWindowToVram(WIN_TOPBAR_RIGHT, COPYWIN_FULL); sMapOpenCloseAnim->closeState++; break; case 1: CreateMapEdgeSprites(); sMapOpenCloseAnim->closeState++; break; case 2: LoadPalette(sRegionMap_Pal, BG_PLTT_ID(0), sizeof(sRegionMap_Pal)); sMapOpenCloseAnim->closeState++; break; case 3: SetMapEdgeInvisibility(NELEMS(sMapOpenCloseAnim->mapEdges), FALSE); SetPlayerIconInvisibility(TRUE); SetMapCursorInvisibility(TRUE); SetDungeonIconInvisibility(0xFF, NELEMS(sMapIcons->dungeonIcons), TRUE); SetFlyIconInvisibility(0xFF, NELEMS(sMapIcons->flyIcons), TRUE); sMapOpenCloseAnim->moveState = 0; sMapOpenCloseAnim->blendY = 0; sMapOpenCloseAnim->closeState++; break; case 4: SetGpuRegsToFadeMapToWhite(); sMapOpenCloseAnim->closeState++; break; case 5: if (sMapOpenCloseAnim->blendY == 15) { SetBldY(sMapOpenCloseAnim->blendY); sMapOpenCloseAnim->closeState++; } else { sMapOpenCloseAnim->blendY++; SetBldY(sMapOpenCloseAnim->blendY); } break; case 6: InitScreenForMapCloseAnim(); SetGpuWindowDimsToMapEdges(); PlaySE(SE_CARD_FLIPPING); sMapOpenCloseAnim->closeState++; break; case 7: if (MoveMapEdgesInward() == TRUE) sMapOpenCloseAnim->closeState++; break; default: gTasks[taskId].func = sMapOpenCloseAnim->exitTask; break; } } static bool8 MoveMapEdgesInward(void) { SetGpuWindowDimsToMapEdges(); if (sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x == 104) { return TRUE; } else if (sMapOpenCloseAnim->moveState > 17) { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 1; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 1; } else if (sMapOpenCloseAnim->moveState > 14) { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 2; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 2; } else if (sMapOpenCloseAnim->moveState > 10) { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 3; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 3; } else if (sMapOpenCloseAnim->moveState > 6) { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 5; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 5; } else { sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 8; sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 8; } sMapOpenCloseAnim->moveState++; return FALSE; } static void SpriteCB_MapCursor(struct Sprite *sprite) { if (sMapCursor->moveCounter != 0) { sprite->x += sMapCursor->horizontalMove; sprite->y += sMapCursor->verticalMove; sMapCursor->moveCounter--; } else { sMapCursor->sprite->x = 8 * sMapCursor->x + 36; sMapCursor->sprite->y = 8 * sMapCursor->y + 36; } } static void CreateMapCursor(u16 tileTag, u16 palTag) { sMapCursor = AllocZeroed(sizeof(struct MapCursor)); LZ77UnCompWram(sMapCursor_Gfx, sMapCursor->tiles); sMapCursor->tileTag = tileTag; sMapCursor->palTag = palTag; GetPlayerPositionOnRegionMap_HandleOverrides(); sMapCursor->spriteX = 8 * sMapCursor->x + 36; sMapCursor->spriteY = 8 * sMapCursor->y + 36; sMapCursor->inputHandler = HandleRegionMapInput; sMapCursor->selectedMapsecType = GetMapsecType(sMapCursor->selectedMapsec); sMapCursor->selectedDungeonType = GetDungeonMapsecType(GetSelectedMapSection(GetSelectedRegionMap(), LAYER_DUNGEON, sMapCursor->y, sMapCursor->x)); CreateMapCursorSprite(); } static void CreateMapCursorSprite(void) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = sMapCursor->tiles, .size = sizeof(sMapCursor->tiles), .tag = sMapCursor->tileTag }; struct SpritePalette spritePalette = { .data = sMapCursor_Pal, .tag = sMapCursor->palTag }; struct SpriteTemplate template = { .tileTag = sMapCursor->tileTag, .paletteTag = sMapCursor->palTag, .oam = &sOamData_MapCursor, .anims = sAnims_MapCursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_MapCursor }; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, sMapCursor->spriteX, sMapCursor->spriteY, 0); sMapCursor->sprite = &gSprites[spriteId]; SetMapCursorInvisibility(TRUE); } static void SetMapCursorInvisibility(bool8 invisibile) { sMapCursor->sprite->invisible = invisibile; } static void ResetCursorSnap(void) { sMapCursor->snapId = 0; } static void FreeMapCursor(void) { if (sMapCursor->sprite != NULL) { DestroySprite(sMapCursor->sprite); FreeSpriteTilesByTag(sMapCursor->tileTag); FreeSpritePaletteByTag(sMapCursor->palTag); } FREE_IF_NOT_NULL(sMapCursor); } static u8 HandleRegionMapInput(void) { u8 input = MAP_INPUT_NONE; sMapCursor->horizontalMove = 0; sMapCursor->verticalMove = 0; if (JOY_HELD(DPAD_UP)) { if (sMapCursor->y > 0) { sMapCursor->verticalMove = -2; input = MAP_INPUT_MOVE_START; } } if (JOY_HELD(DPAD_DOWN)) { if (sMapCursor->y < MAP_HEIGHT - 1) { sMapCursor->verticalMove = 2; input = MAP_INPUT_MOVE_START; } } if (JOY_HELD(DPAD_RIGHT)) { if (sMapCursor->x < MAP_WIDTH - 1) { sMapCursor->horizontalMove = 2; input = MAP_INPUT_MOVE_START; } } if (JOY_HELD(DPAD_LEFT)) { if (sMapCursor->x > 0) { sMapCursor->horizontalMove = -2; input = MAP_INPUT_MOVE_START; } } if (JOY_NEW(A_BUTTON)) { input = MAP_INPUT_A_BUTTON; if (sMapCursor->x == CANCEL_BUTTON_X && sMapCursor->y == CANCEL_BUTTON_Y) { PlaySE(SE_M_HYPER_BEAM2); input = MAP_INPUT_CANCEL; } if (sMapCursor->x == SWITCH_BUTTON_X && sMapCursor->y == SWITCH_BUTTON_Y && GetRegionMapPermission(MAPPERM_HAS_SWITCH_BUTTON) == TRUE) { PlaySE(SE_M_HYPER_BEAM2); input = MAP_INPUT_SWITCH; } } else if (!JOY_NEW(B_BUTTON)) { if (JOY_REPT(START_BUTTON)) { SnapToIconOrButton(); sMapCursor->selectedMapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x); sMapCursor->selectedMapsecType = GetMapsecType(sMapCursor->selectedMapsec); sMapCursor->selectedDungeonType = GetDungeonMapsecType(GetSelectedMapSection(GetSelectedRegionMap(), LAYER_DUNGEON, sMapCursor->y, sMapCursor->x)); return MAP_INPUT_MOVE_END; } else if (JOY_NEW(SELECT_BUTTON) && sRegionMap->savedCallback == CB2_ReturnToField) { input = MAP_INPUT_CANCEL; } } else { input = MAP_INPUT_CANCEL; } if (input == MAP_INPUT_MOVE_START) { sMapCursor->moveCounter = 4; sMapCursor->inputHandler = MoveMapCursor; } return input; } static u8 MoveMapCursor(void) { if (sMapCursor->moveCounter != 0) return MAP_INPUT_MOVE_CONT; if (sMapCursor->horizontalMove > 0) sMapCursor->x++; if (sMapCursor->horizontalMove < 0) sMapCursor->x--; if (sMapCursor->verticalMove > 0) sMapCursor->y++; if (sMapCursor->verticalMove < 0) sMapCursor->y--; sMapCursor->selectedMapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x); sMapCursor->selectedMapsecType = GetMapsecType(sMapCursor->selectedMapsec); sMapCursor->selectedDungeonType = GetDungeonMapsecType(GetSelectedMapSection(GetSelectedRegionMap(), LAYER_DUNGEON, sMapCursor->y, sMapCursor->x)); sMapCursor->inputHandler = HandleRegionMapInput; return MAP_INPUT_MOVE_END; } static u8 GetRegionMapInput(void) { return sMapCursor->inputHandler(); } // Pressing Start on the map snaps the cursor to the Buttons / Player Icon // Pressing repeatedly cycles between them static void SnapToIconOrButton(void) { if (GetRegionMapPermission(MAPPERM_HAS_SWITCH_BUTTON) == TRUE) { sMapCursor->snapId++; sMapCursor->snapId %= 3; if (sMapCursor->snapId == 0 && GetSelectedRegionMap() != GetRegionMapPlayerIsOn()) { // Player icon not present on this map, skip it sMapCursor->snapId++; } switch (sMapCursor->snapId) { case 0: default: sMapCursor->x = GetPlayerIconX(); sMapCursor->y = GetPlayerIconY(); break; case 1: sMapCursor->x = SWITCH_BUTTON_X; sMapCursor->y = SWITCH_BUTTON_Y; break; case 2: sMapCursor->y = CANCEL_BUTTON_Y; sMapCursor->x = CANCEL_BUTTON_X; break; } } else { sMapCursor->snapId++; sMapCursor->snapId %= 2; switch (sMapCursor->snapId) { case 0: default: sMapCursor->x = GetPlayerIconX(); sMapCursor->y = GetPlayerIconY(); break; case 1: sMapCursor->y = CANCEL_BUTTON_Y; sMapCursor->x = CANCEL_BUTTON_X; break; } } sMapCursor->sprite->x = 8 * sMapCursor->x + 36; sMapCursor->sprite->y = 8 * sMapCursor->y + 36; sMapCursor->selectedMapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x); } static u16 GetMapCursorX(void) { return sMapCursor->x; } static u16 GetMapCursorY(void) { return sMapCursor->y; } static u16 GetMapsecUnderCursor(void) { u8 mapsec; if (sMapCursor->y < 0 || sMapCursor->y >= MAP_HEIGHT || sMapCursor->x < 0 || sMapCursor->x >= MAP_WIDTH) return MAPSEC_NONE; mapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x); if ((mapsec == MAPSEC_NAVEL_ROCK || mapsec == MAPSEC_BIRTH_ISLAND) && !FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR)) mapsec = MAPSEC_NONE; return mapsec; } static u16 GetDungeonMapsecUnderCursor(void) { u8 mapsec; if (sMapCursor->y < 0 || sMapCursor->y >= MAP_HEIGHT || sMapCursor->x < 0 || sMapCursor->x >= MAP_WIDTH) return MAPSEC_NONE; mapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_DUNGEON, sMapCursor->y, sMapCursor->x); if (mapsec == MAPSEC_CERULEAN_CAVE && !FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) mapsec = MAPSEC_NONE; return mapsec; } static u8 GetMapsecType(u8 mapsec) { switch (mapsec) { case MAPSEC_PALLET_TOWN: return FlagGet(FLAG_WORLD_MAP_PALLET_TOWN) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_VIRIDIAN_CITY: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_PEWTER_CITY: return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_CERULEAN_CITY: return FlagGet(FLAG_WORLD_MAP_CERULEAN_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_LAVENDER_TOWN: return FlagGet(FLAG_WORLD_MAP_LAVENDER_TOWN) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_VERMILION_CITY: return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_CELADON_CITY: return FlagGet(FLAG_WORLD_MAP_CELADON_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_FUCHSIA_CITY: return FlagGet(FLAG_WORLD_MAP_FUCHSIA_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_CINNABAR_ISLAND: return FlagGet(FLAG_WORLD_MAP_CINNABAR_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_INDIGO_PLATEAU: return FlagGet(FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_SAFFRON_CITY: return FlagGet(FLAG_WORLD_MAP_SAFFRON_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_ONE_ISLAND: return FlagGet(FLAG_WORLD_MAP_ONE_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_TWO_ISLAND: return FlagGet(FLAG_WORLD_MAP_TWO_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_THREE_ISLAND: return FlagGet(FLAG_WORLD_MAP_THREE_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_FOUR_ISLAND: return FlagGet(FLAG_WORLD_MAP_FOUR_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_FIVE_ISLAND: return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_SEVEN_ISLAND: return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_SIX_ISLAND: return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_ROUTE_4_POKECENTER: if (!GetRegionMapPermission(MAPPERM_HAS_FLY_DESTINATIONS)) return MAPSECTYPE_NONE; return FlagGet(FLAG_WORLD_MAP_ROUTE4_POKEMON_CENTER_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_ROUTE_10_POKECENTER: return FlagGet(FLAG_WORLD_MAP_ROUTE10_POKEMON_CENTER_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_NONE: return MAPSECTYPE_NONE; default: return MAPSECTYPE_ROUTE; } } static u8 GetDungeonMapsecType(u8 mapsec) { switch (mapsec) { case MAPSEC_NONE: return MAPSECTYPE_NONE; case MAPSEC_VIRIDIAN_FOREST: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_MT_MOON: return FlagGet(FLAG_WORLD_MAP_MT_MOON_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_S_S_ANNE: return FlagGet(FLAG_WORLD_MAP_SSANNE_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_UNDERGROUND_PATH: return FlagGet(FLAG_WORLD_MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_UNDERGROUND_PATH_2: return FlagGet(FLAG_WORLD_MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_DIGLETTS_CAVE: return FlagGet(FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_KANTO_VICTORY_ROAD: return FlagGet(FLAG_WORLD_MAP_VICTORY_ROAD_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_ROCKET_HIDEOUT: return FlagGet(FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_SILPH_CO: return FlagGet(FLAG_WORLD_MAP_SILPH_CO_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_POKEMON_MANSION: return FlagGet(FLAG_WORLD_MAP_POKEMON_MANSION_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_KANTO_SAFARI_ZONE: return FlagGet(FLAG_WORLD_MAP_SAFARI_ZONE_CENTER) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_POKEMON_LEAGUE: return FlagGet(FLAG_WORLD_MAP_POKEMON_LEAGUE_LORELEIS_ROOM) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_ROCK_TUNNEL: return FlagGet(FLAG_WORLD_MAP_ROCK_TUNNEL_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_SEAFOAM_ISLANDS: return FlagGet(FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_POKEMON_TOWER: return FlagGet(FLAG_WORLD_MAP_POKEMON_TOWER_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_CERULEAN_CAVE: return FlagGet(FLAG_WORLD_MAP_CERULEAN_CAVE_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_POWER_PLANT: return FlagGet(FLAG_WORLD_MAP_POWER_PLANT) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_NAVEL_ROCK: return FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_MT_EMBER: return FlagGet(FLAG_WORLD_MAP_MT_EMBER_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_BERRY_FOREST: return FlagGet(FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_ICEFALL_CAVE: return FlagGet(FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_ROCKET_WAREHOUSE: return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND_ROCKET_WAREHOUSE) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_TRAINER_TOWER_2: return FlagGet(FLAG_WORLD_MAP_TRAINER_TOWER_LOBBY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_DOTTED_HOLE: return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_LOST_CAVE: return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_PATTERN_BUSH: return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_ALTERING_CAVE: return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_TANOBY_CHAMBERS: return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_THREE_ISLE_PATH: return FlagGet(FLAG_WORLD_MAP_THREE_ISLAND_DUNSPARCE_TUNNEL) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_TANOBY_KEY: return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; case MAPSEC_BIRTH_ISLAND: return FlagGet(FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED; default: return MAPSECTYPE_ROUTE; } } static u8 GetSelectedMapsecType(u8 layer) { switch (layer) { default: return sMapCursor->selectedMapsecType; case LAYER_MAP: return sMapCursor->selectedMapsecType; case LAYER_DUNGEON: return sMapCursor->selectedDungeonType; } } static u16 GetPlayerCurrentMapSectionId(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId; } static void GetPlayerPositionOnRegionMap(void) { u16 width; u32 divisor; u16 height; u16 x; u16 y; const struct MapHeader * mapHeader; struct WarpData * warp; switch (GetMapTypeByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)) { default: case MAP_TYPE_TOWN: case MAP_TYPE_CITY: case MAP_TYPE_ROUTE: case MAP_TYPE_UNDERWATER: case MAP_TYPE_OCEAN_ROUTE: sMapCursor->selectedMapsec = gMapHeader.regionMapSectionId; width = gMapHeader.mapLayout->width; height = gMapHeader.mapLayout->height; x = gSaveBlock1Ptr->pos.x; y = gSaveBlock1Ptr->pos.y; break; case MAP_TYPE_UNDERGROUND: case MAP_TYPE_UNKNOWN: mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum); sMapCursor->selectedMapsec = mapHeader->regionMapSectionId; width = mapHeader->mapLayout->width; height = mapHeader->mapLayout->height; x = gSaveBlock1Ptr->escapeWarp.x; y = gSaveBlock1Ptr->escapeWarp.y; break; case MAP_TYPE_SECRET_BASE: mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->dynamicWarp.mapGroup, gSaveBlock1Ptr->dynamicWarp.mapNum); sMapCursor->selectedMapsec = mapHeader->regionMapSectionId; width = mapHeader->mapLayout->width; height = mapHeader->mapLayout->height; x = gSaveBlock1Ptr->dynamicWarp.x; y = gSaveBlock1Ptr->dynamicWarp.y; break; case MAP_TYPE_INDOOR: if ((sMapCursor->selectedMapsec = gMapHeader.regionMapSectionId) != MAPSEC_SPECIAL_AREA) { warp = &gSaveBlock1Ptr->escapeWarp; mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum); } else { warp = &gSaveBlock1Ptr->dynamicWarp; mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum); sMapCursor->selectedMapsec = mapHeader->regionMapSectionId; } width = mapHeader->mapLayout->width; height = mapHeader->mapLayout->height; x = warp->x; y = warp->y; break; } sMapCursor->selectedMapsec; divisor = width / sMapSectionDimensions[sMapCursor->selectedMapsec][0]; if (divisor == 0) divisor = 1; x /= divisor; if (x >= sMapSectionDimensions[sMapCursor->selectedMapsec][0]) x = sMapSectionDimensions[sMapCursor->selectedMapsec][0] - 1; divisor = height / sMapSectionDimensions[sMapCursor->selectedMapsec][1]; if (divisor == 0) divisor = 1; y /= divisor; if (y >= sMapSectionDimensions[sMapCursor->selectedMapsec][1]) y = sMapSectionDimensions[sMapCursor->selectedMapsec][1] - 1; sMapCursor->x = x + sMapSectionTopLeftCorners[sMapCursor->selectedMapsec][0]; sMapCursor->y = y + sMapSectionTopLeftCorners[sMapCursor->selectedMapsec][1]; } static void GetPlayerPositionOnRegionMap_HandleOverrides(void) { switch (GetPlayerCurrentMapSectionId()) { case MAPSEC_KANTO_SAFARI_ZONE: sMapCursor->x = 12; sMapCursor->y = 12; break; case MAPSEC_SILPH_CO: sMapCursor->x = 14; sMapCursor->y = 6; break; case MAPSEC_POKEMON_MANSION: sMapCursor->x = 4; sMapCursor->y = 14; break; case MAPSEC_POKEMON_TOWER: sMapCursor->x = 18; sMapCursor->y = 6; break; case MAPSEC_POWER_PLANT: sMapCursor->x = 18; sMapCursor->y = 4; break; case MAPSEC_S_S_ANNE: sMapCursor->x = 14; sMapCursor->y = 9; break; case MAPSEC_POKEMON_LEAGUE: sMapCursor->x = 2; sMapCursor->y = 3; break; case MAPSEC_ROCKET_HIDEOUT: sMapCursor->x = 11; sMapCursor->y = 6; break; case MAPSEC_UNDERGROUND_PATH: sMapCursor->x = 14; sMapCursor->y = 7; if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNDERGROUND_PATH_NORTH_ENTRANCE)) { sMapCursor->x = 14; // optimized out but required to match sMapCursor->y = 5; } break; case MAPSEC_UNDERGROUND_PATH_2: sMapCursor->x = 12; sMapCursor->y = 6; if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNDERGROUND_PATH_EAST_ENTRANCE)) { sMapCursor->x = 15; sMapCursor->y = 6; // optimized out but required to match } break; case MAPSEC_BIRTH_ISLAND: sMapCursor->x = 18; sMapCursor->y = 13; break; case MAPSEC_NAVEL_ROCK: sMapCursor->x = 10; sMapCursor->y = 8; break; case MAPSEC_TRAINER_TOWER_2: sMapCursor->x = 5; sMapCursor->y = 6; break; case MAPSEC_MT_EMBER: sMapCursor->x = 2; sMapCursor->y = 3; break; case MAPSEC_BERRY_FOREST: sMapCursor->x = 14; sMapCursor->y = 12; break; case MAPSEC_PATTERN_BUSH: sMapCursor->x = 17; sMapCursor->y = 3; break; case MAPSEC_ROCKET_WAREHOUSE: sMapCursor->x = 17; sMapCursor->y = 11; break; case MAPSEC_DILFORD_CHAMBER: case MAPSEC_LIPTOO_CHAMBER: case MAPSEC_MONEAN_CHAMBER: case MAPSEC_RIXY_CHAMBER: case MAPSEC_SCUFIB_CHAMBER: case MAPSEC_TANOBY_CHAMBERS: case MAPSEC_VIAPOIS_CHAMBER: case MAPSEC_WEEPTH_CHAMBER: sMapCursor->x = 9; sMapCursor->y = 12; break; case MAPSEC_DOTTED_HOLE: sMapCursor->x = 16; sMapCursor->y = 8; break; case MAPSEC_VIRIDIAN_FOREST: sMapCursor->x = 4; sMapCursor->y = 6; break; case MAPSEC_ROUTE_2: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) { sMapCursor->x = 4; sMapCursor->y = 7; } else if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(CERULEAN_CITY)) { sMapCursor->x = 4; sMapCursor->y = 5; } else { GetPlayerPositionOnRegionMap(); } break; case MAPSEC_ROUTE_21: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE21_NORTH)) { sMapCursor->x = 4; sMapCursor->y = 12; } else if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE21_SOUTH)) { sMapCursor->x = 4; sMapCursor->y = 13; } break; case MAPSEC_ROUTE_5: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(VIRIDIAN_CITY)) { sMapCursor->x = 14; sMapCursor->y = 5; } else { GetPlayerPositionOnRegionMap(); } break; case MAPSEC_ROUTE_6: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) { sMapCursor->x = 14; sMapCursor->y = 7; } else { GetPlayerPositionOnRegionMap(); } break; case MAPSEC_ROUTE_7: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) { sMapCursor->x = 13; sMapCursor->y = 6; } else { GetPlayerPositionOnRegionMap(); } break; case MAPSEC_ROUTE_8: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) { sMapCursor->x = 15; sMapCursor->y = 6; } else { GetPlayerPositionOnRegionMap(); } break; case MAPSEC_FARAWAY_ISLAND: case MAPSEC_ARTISAN_CAVE: case MAPSEC_BATTLE_FRONTIER: case MAPSEC_SOUTHERN_ISLAND: sMapCursor->x = 0; sMapCursor->y = 17; break; default: GetPlayerPositionOnRegionMap(); break; } sMapCursor->selectedMapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x); } static u8 GetSelectedMapSection(u8 whichMap, u8 layer, s16 y, s16 x) { switch (whichMap) { case REGIONMAP_KANTO: return sRegionMapSections_Kanto[layer][y][x]; case REGIONMAP_SEVII123: return sRegionMapSections_Sevii123[layer][y][x]; case REGIONMAP_SEVII45: return sRegionMapSections_Sevii45[layer][y][x]; case REGIONMAP_SEVII67: return sRegionMapSections_Sevii67[layer][y][x]; default: return MAPSEC_NONE; } } static void CreatePlayerIcon(u16 tileTag, u16 palTag) { sPlayerIcon = AllocZeroed(sizeof(struct PlayerIcon)); if (gSaveBlock2Ptr->playerGender == FEMALE) LZ77UnCompWram(sPlayerIcon_Leaf, sPlayerIcon->tiles); else LZ77UnCompWram(sPlayerIcon_Red, sPlayerIcon->tiles); sPlayerIcon->tileTag = tileTag; sPlayerIcon->palTag = palTag; sPlayerIcon->x = GetMapCursorX(); sPlayerIcon->y = GetMapCursorY(); if(gMapHeader.regionMapSectionId == MAPSEC_FARAWAY_ISLAND || gMapHeader.regionMapSectionId == MAPSEC_ARTISAN_CAVE || gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER || gMapHeader.regionMapSectionId == MAPSEC_SOUTHERN_ISLAND) { sMapCursor->x = 0; sMapCursor->y = 0; } CreatePlayerIconSprite(); } static void CreatePlayerIconSprite(void) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = sPlayerIcon->tiles, .size = sizeof(sPlayerIcon->tiles), .tag = sPlayerIcon->tileTag }; struct SpritePalette spritePalette = { .data = sPlayerIcon_RedPal, .tag = sPlayerIcon->palTag }; struct SpriteTemplate template = { .tileTag = sPlayerIcon->tileTag, .paletteTag = sPlayerIcon->palTag, .oam = &sOamData_PlayerIcon, .anims = sAnims_PlayerIcon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; if (gSaveBlock2Ptr->playerGender == FEMALE) spritePalette.data = sPlayerIcon_LeafPal; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, 8 * sPlayerIcon->x + 36, 8 * sPlayerIcon->y + 36, 2); sPlayerIcon->sprite = &gSprites[spriteId]; SetPlayerIconInvisibility(TRUE); } static void SetPlayerIconInvisibility(bool8 invisible) { sPlayerIcon->sprite->invisible = invisible; } static void FreePlayerIcon(void) { if (sPlayerIcon->sprite != NULL) { DestroySprite(sPlayerIcon->sprite); FreeSpriteTilesByTag(sPlayerIcon->tileTag); FreeSpritePaletteByTag(sPlayerIcon->palTag); } FREE_IF_NOT_NULL(sPlayerIcon); } static u16 GetPlayerIconX(void) { return sPlayerIcon->x; } static u16 GetPlayerIconY(void) { return sPlayerIcon->y; } static void InitMapIcons(u8 whichMap, u8 taskId, TaskFunc taskFunc) { sMapIcons = AllocZeroed(sizeof(struct MapIcons)); sMapIcons->exitTask = taskFunc; sMapIcons->region = whichMap; LZ77UnCompWram(sDungeonIcon, sMapIcons->dungeonIconTiles); LZ77UnCompWram(sFlyIcon, sMapIcons->flyIconTiles); gTasks[taskId].func = LoadMapIcons; } static void LoadMapIcons(u8 taskId) { switch (sMapIcons->state) { case 0: NullVBlankHBlankCallbacks(); sMapIcons->state++; break; case 1: CreateDungeonIcons(); sMapIcons->state++; break; case 2: CreateFlyIcons(); sMapIcons->state++; break; case 3: BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sMapIcons->state++; break; case 4: SetRegionMapVBlankCB(); sMapIcons->state++; break; default: SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | DISPCNT_OBJ_ON); FinishMapIconLoad(taskId); break; } } static void FinishMapIconLoad(u8 taskId) { gTasks[taskId].func = sMapIcons->exitTask; } static void CreateFlyIconSprite(u8 whichMap, u8 numIcons, u16 x, u16 y, u8 tileTag, u8 palTag) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = sMapIcons->flyIconTiles, .size = sizeof(sMapIcons->flyIconTiles), .tag = tileTag }; struct SpritePalette spritePalette = { .data = sMiscIcon_Pal, .tag = palTag }; struct SpriteTemplate template = { .tileTag = tileTag, .paletteTag = palTag, .oam = &sOamData_FlyIcon, .anims = sAnims_FlyIcon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, 8 * x + 36, 8 * y + 36, 1); sMapIcons->flyIcons[numIcons].sprite = &gSprites[spriteId]; gSprites[spriteId].invisible = TRUE; sMapIcons->flyIcons[numIcons].region = whichMap; } static void CreateDungeonIconSprite(u8 whichMap, u8 numIcons, u16 x, u16 y, u8 tileTag, u8 palTag) { u8 spriteId; u8 mapsec; s16 offset = 0; struct SpriteSheet spriteSheet = { .data = sMapIcons->dungeonIconTiles, .size = sizeof(sMapIcons->dungeonIconTiles), .tag = tileTag }; struct SpritePalette spritePalette = { .data = sMiscIcon_Pal, .tag = palTag }; struct SpriteTemplate template = { .tileTag = tileTag, .paletteTag = palTag, .oam = &sOamData_DungeonIcon, .anims = sAnims_DungeonIcon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); mapsec = GetSelectedMapSection(whichMap, LAYER_MAP, y, x); // If mapsec has a town, push dungeon icon to bottom right corner if ((GetMapsecType(mapsec) == MAPSECTYPE_VISITED || GetMapsecType(mapsec) == MAPSECTYPE_NOT_VISITED) && mapsec != MAPSEC_ROUTE_10_POKECENTER) offset = 2; spriteId = CreateSprite(&template, 8 * x + 36 + offset, 8 * y + 36 + offset, 3); sMapIcons->dungeonIcons[numIcons].sprite = &gSprites[spriteId]; gSprites[spriteId].invisible = TRUE; sMapIcons->dungeonIcons[numIcons].region = whichMap; } static void CreateFlyIcons(void) { u16 i, y, x; u8 numIcons = 0; if (GetRegionMapPermission(MAPPERM_HAS_FLY_DESTINATIONS)) { for (i = 0; i < REGIONMAP_COUNT; i++) { for (y = 0; y < MAP_HEIGHT; y++) { for (x = 0; x < MAP_WIDTH; x++) { if (GetMapsecType(GetSelectedMapSection(i, LAYER_MAP, y, x)) == MAPSECTYPE_VISITED) { CreateFlyIconSprite(i, numIcons, x, y, numIcons + 10, 10); numIcons++; } } } } } } static void CreateDungeonIcons(void) { u16 i, y, x; u8 numIcons = 0; u8 mapsec; for (i = 0; i < REGIONMAP_COUNT; i++) { for (y = 0; y < MAP_HEIGHT; y++) { for (x = 0; x < MAP_WIDTH; x++) { mapsec = GetSelectedMapSection(i, LAYER_DUNGEON, y, x); if (mapsec == MAPSEC_NONE) continue; if (mapsec == MAPSEC_CERULEAN_CAVE && !FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) continue; CreateDungeonIconSprite(i, numIcons, x, y, numIcons + 35, 10); if (GetDungeonMapsecType(mapsec) != 2) { StartSpriteAnim(sMapIcons->dungeonIcons[numIcons].sprite, 1); } numIcons++; } } } } static void SetFlyIconInvisibility(u8 whichMap, u8 iconNum, bool8 invisible) { u32 i; if (iconNum == NELEMS(sMapIcons->flyIcons)) { // Set for all fly icons for (i = 0; i < NELEMS(sMapIcons->flyIcons); i++) { if (sMapIcons->flyIcons[i].region == whichMap || whichMap == 0xFF) sMapIcons->flyIcons[i].sprite->invisible = invisible; } } else { if (sMapIcons->flyIcons[iconNum].region == whichMap) sMapIcons->flyIcons[iconNum].sprite->invisible = invisible; } } static void SetDungeonIconInvisibility(u8 whichMap, u8 iconNum, bool8 invisible) { u32 i; if (iconNum == NELEMS(sMapIcons->dungeonIcons)) { // Set for all dungeon icons for (i = 0; i < NELEMS(sMapIcons->dungeonIcons); i++) { if (sMapIcons->dungeonIcons[i].region == whichMap || whichMap == 0xFF) sMapIcons->dungeonIcons[i].sprite->invisible = invisible; } } else { if (sMapIcons->dungeonIcons[iconNum].region != whichMap) sMapIcons->dungeonIcons[iconNum].sprite->invisible = invisible; } } static void FreeMapIcons(void) { u32 i; for (i = 0; i < NELEMS(sMapIcons->flyIcons); i++) { if (sMapIcons->flyIcons[i].sprite != NULL) { DestroySprite(sMapIcons->flyIcons[i].sprite); FreeSpriteTilesByTag(sMapIcons->flyIcons[i].tileTag); FreeSpritePaletteByTag(sMapIcons->flyIcons[i].palTag); } } for (i = 0; i < NELEMS(sMapIcons->dungeonIcons); i++) { if (sMapIcons->dungeonIcons[i].sprite != NULL) { DestroySprite(sMapIcons->dungeonIcons[i].sprite); FreeSpriteTilesByTag(sMapIcons->dungeonIcons[i].tileTag); FreeSpritePaletteByTag(sMapIcons->dungeonIcons[i].palTag); } } FREE_IF_NOT_NULL(sMapIcons); } static bool8 SaveRegionMapGpuRegs(u8 idx) { if (sRegionMapGpuRegs[idx] != NULL) return FALSE; sRegionMapGpuRegs[idx] = AllocZeroed(sizeof(struct RegionMapGpuRegs)); sRegionMapGpuRegs[idx]->bldcnt = GetGpuReg(REG_OFFSET_BLDCNT); sRegionMapGpuRegs[idx]->bldy = GetGpuReg(REG_OFFSET_BLDY); sRegionMapGpuRegs[idx]->bldalpha = GetGpuReg(REG_OFFSET_BLDALPHA); sRegionMapGpuRegs[idx]->winin = GetGpuReg(REG_OFFSET_WININ); sRegionMapGpuRegs[idx]->winout = GetGpuReg(REG_OFFSET_WINOUT); sRegionMapGpuRegs[idx]->win0h = GetGpuReg(REG_OFFSET_WIN0H); sRegionMapGpuRegs[idx]->win1h = GetGpuReg(REG_OFFSET_WIN1H); sRegionMapGpuRegs[idx]->win0v = GetGpuReg(REG_OFFSET_WIN0V); sRegionMapGpuRegs[idx]->win1v = GetGpuReg(REG_OFFSET_WIN1V); return TRUE; } static bool8 SetRegionMapGpuRegs(u8 idx) { if (sRegionMapGpuRegs[idx] == NULL) return FALSE; SetGpuReg(REG_OFFSET_BLDCNT, sRegionMapGpuRegs[idx]->bldcnt); SetGpuReg(REG_OFFSET_BLDY, sRegionMapGpuRegs[idx]->bldy); SetGpuReg(REG_OFFSET_BLDALPHA, sRegionMapGpuRegs[idx]->bldalpha); SetGpuReg(REG_OFFSET_WININ, sRegionMapGpuRegs[idx]->winin); SetGpuReg(REG_OFFSET_WINOUT, sRegionMapGpuRegs[idx]->winout); SetGpuReg(REG_OFFSET_WIN0H, sRegionMapGpuRegs[idx]->win0h); SetGpuReg(REG_OFFSET_WIN1H, sRegionMapGpuRegs[idx]->win1h); SetGpuReg(REG_OFFSET_WIN0V, sRegionMapGpuRegs[idx]->win0v); SetGpuReg(REG_OFFSET_WIN1V, sRegionMapGpuRegs[idx]->win1v); FREE_IF_NOT_NULL(sRegionMapGpuRegs[idx]); return TRUE; } static void FreeRegionMapGpuRegs(void) { u32 i; for (i = 0; i < NELEMS(sRegionMapGpuRegs); i++) FREE_IF_NOT_NULL(sRegionMapGpuRegs[i]); } static void ResetGpuRegs(void) { struct GpuWindowParams data = {}; SetBldCnt(0, 0, BLDCNT_EFFECT_NONE); SetBldY(0); SetGpuWindowDims(0, &data); SetGpuWindowDims(1, &data); SetWinIn(0, 0); SetDispCnt(0, TRUE); SetDispCnt(1, TRUE); } static void SetBldCnt(u8 tgt2, u16 tgt1, u16 effect) { u16 regval = tgt2 << 8; regval |= tgt1; regval |= effect; SetGpuReg(REG_OFFSET_BLDCNT, regval); } static void SetBldY(u16 tgt) { SetGpuReg(REG_OFFSET_BLDY, tgt); } static void SetBldAlpha(u16 tgt2, u16 tgt1) { u16 regval = tgt2 << 8; regval |= tgt1; SetGpuReg(REG_OFFSET_BLDALPHA, regval); } static void SetWinIn(u16 b, u16 a) { u16 regval = a << 8; regval |= b; SetGpuReg(REG_OFFSET_WININ, regval); } static void SetWinOut(u16 regval) { SetGpuReg(REG_OFFSET_WINOUT, regval); } static void SetDispCnt(u8 idx, bool8 clear) { u16 data[sizeof(sWinFlags) / 2]; memcpy(data, sWinFlags, sizeof(sWinFlags)); switch (clear) { case FALSE: SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | data[idx]); break; case TRUE: ClearGpuRegBits(REG_OFFSET_DISPCNT, data[idx]); break; } } static void SetGpuWindowDims(u8 winIdx, const struct GpuWindowParams *data) { SetGpuReg(sWinRegs[winIdx][0], WIN_RANGE(data->top, data->bottom)); SetGpuReg(sWinRegs[winIdx][1], WIN_RANGE(data->left, data->right)); } static void FreeAndResetGpuRegs(void) { FreeRegionMapGpuRegs(); ResetGpuRegs(); } static bool32 IsCeladonDeptStoreMapsec(u16 mapsec) { if (sRegionMap != NULL) return FALSE; if (mapsec != MAPSEC_CELADON_CITY) return FALSE; if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F)) return FALSE; if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_2F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_3F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_4F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_5F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ROOF) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR)) return FALSE; return TRUE; } u8 *GetMapName(u8 *dst0, u16 mapsec, u16 fill) { u8 *dst; u32 i; u16 idx; if ((idx = mapsec) < MAPSEC_NONE ) { if (IsCeladonDeptStoreMapsec(mapsec) == TRUE) dst = StringCopy(dst0, sMapsecName_CELADONDEPT); else dst = StringCopy(dst0, sMapNames[idx]); } else { if (fill == 0) fill = 18; return StringFill(dst0, CHAR_SPACE, fill); } if (fill != 0) { for (i = dst - dst0; i < fill; i++) *dst++ = CHAR_SPACE; *dst = EOS; } return dst; } u8 *GetMapNameGeneric(u8 *dest, u16 mapsec) { return GetMapName(dest, mapsec, 0); } // Unclear why this function is used over GetMapNameGeneric u8 *GetMapNameGeneric_(u8 *dest, u16 mapsec) { return GetMapNameGeneric(dest, mapsec); } static void PrintTopBarTextLeft(const u8 *str) { if (sRegionMap->permissions[MAPPERM_HAS_OPEN_ANIM] == TRUE) FillWindowPixelBuffer(WIN_TOPBAR_LEFT, PIXEL_FILL(0)); else FillWindowPixelBuffer(WIN_TOPBAR_LEFT, PIXEL_FILL(15)); AddTextPrinterParameterized3(WIN_TOPBAR_LEFT, FONT_SMALL, 0, 0, sTextColors, 0, str); CopyWindowToVram(WIN_TOPBAR_LEFT, COPYWIN_GFX); } static void PrintTopBarTextRight(const u8 *str) { if (sRegionMap->permissions[MAPPERM_HAS_OPEN_ANIM] == TRUE) FillWindowPixelBuffer(WIN_TOPBAR_RIGHT, PIXEL_FILL(0)); else FillWindowPixelBuffer(WIN_TOPBAR_RIGHT, PIXEL_FILL(15)); AddTextPrinterParameterized3(WIN_TOPBAR_RIGHT, FONT_SMALL, 0, 0, sTextColors, 0, str); CopyWindowToVram(WIN_TOPBAR_RIGHT, COPYWIN_FULL); } static void ClearOrDrawTopBar(bool8 clear) { if (!clear) { PutWindowTilemap(WIN_TOPBAR_LEFT); PutWindowTilemap(WIN_TOPBAR_RIGHT); } else { ClearWindowTilemap(WIN_TOPBAR_LEFT); ClearWindowTilemap(WIN_TOPBAR_RIGHT); } } void CB2_OpenFlyMap(void) { InitFlyMap(); InitRegionMap(REGIONMAP_TYPE_FLY); } static void Task_FlyMap(u8 taskId) { switch (sFlyMap->state) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); InitMapIcons(GetSelectedRegionMap(), taskId, GetMainMapTask()); CreateMapCursor(0, 0); CreatePlayerIcon(1, 1); SetMapCursorInvisibility(FALSE); SetPlayerIconInvisibility(FALSE); sFlyMap->state++; break; case 1: if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE) { InitMapOpenAnim(taskId, GetMainMapTask()); } else { ShowBg(0); ShowBg(3); ShowBg(1); PrintTopBarTextLeft(gText_RegionMap_DPadMove); SetFlyIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->flyIcons), FALSE); SetDungeonIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->dungeonIcons), FALSE); } sFlyMap->state++; break; case 2: PrintTopBarTextRight(gText_RegionMap_AButtonOK); ClearOrDrawTopBar(FALSE); sFlyMap->state++; break; case 3: if (!gPaletteFade.active) { DisplayCurrentMapName(); PutWindowTilemap(WIN_MAP_NAME); DisplayCurrentDungeonName(); PutWindowTilemap(WIN_DUNGEON_NAME); sFlyMap->state++; } break; case 4: switch (GetRegionMapInput()) { case MAP_INPUT_MOVE_START: case MAP_INPUT_MOVE_CONT: break; case MAP_INPUT_CANCEL: sFlyMap->state = 6; break; case MAP_INPUT_MOVE_END: if (GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_VISITED) PlaySE(SE_DEX_PAGE); else PlaySEForSelectedMapsec(); ResetCursorSnap(); DisplayCurrentMapName(); DisplayCurrentDungeonName(); DrawDungeonNameBox(); if (GetMapCursorX() == CANCEL_BUTTON_X && GetMapCursorY() == CANCEL_BUTTON_Y) { PlaySE(SE_M_SPIT_UP); PrintTopBarTextRight(gText_RegionMap_AButtonCancel); } else if (GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_VISITED || GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_UNKNOWN) { PrintTopBarTextRight(gText_RegionMap_AButtonOK); } else { PrintTopBarTextRight(gText_RegionMap_Space); } break; case MAP_INPUT_A_BUTTON: if ((GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_VISITED || GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_UNKNOWN) && GetRegionMapPermission(MAPPERM_HAS_FLY_DESTINATIONS) == TRUE) { switch (GetMapTypeByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)) { case MAP_TYPE_UNDERGROUND: case MAP_TYPE_INDOOR: sFlyMap->selectedDestination = FALSE; sFlyMap->state++; break; default: PlaySE(SE_USE_ITEM); sFlyMap->selectedDestination = TRUE; sFlyMap->state++; break; } } break; case MAP_INPUT_SWITCH: InitSwitchMapMenu(GetSelectedRegionMap(), taskId, SaveMainMapTask); break; } break; case 5: if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE) DoMapCloseAnim(taskId); sFlyMap->state++; break; case 6: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sFlyMap->state++; break; default: if (!gPaletteFade.active) { if (sFlyMap->selectedDestination == TRUE) SetFlyWarpDestination(GetMapsecUnderCursor()); FreeFlyMap(taskId); } break; } } static void InitFlyMap(void) { sFlyMap = AllocZeroed(sizeof(struct FlyMap)); sFlyMap->state = 0; sFlyMap->unused = 0; } static void FreeFlyMap(u8 taskId) { if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE) FreeMapOpenCloseAnim(); FreeMapIcons(); FreeMapCursor(); FreePlayerIcon(); FreeAndResetGpuRegs(); FreeRegionMapForFlyMap(); DestroyTask(taskId); FreeAllWindowBuffers(); if (sFlyMap->selectedDestination == TRUE) SetMainCallback2(CB2_ReturnToField); else SetMainCallback2(CB2_ReturnToPartyMenuFromFlyMap); FREE_IF_NOT_NULL(sFlyMap); } static void SetFlyWarpDestination(u16 mapsec) { u16 idx = mapsec; if (sMapFlyDestinations[idx][2]) { SetWarpDestinationToHealLocation(sMapFlyDestinations[idx][2]); SetUsedFlyQuestLogEvent(sMapFlyDestinations[idx]); } else { SetWarpDestinationToMapWarp(sMapFlyDestinations[idx][0], sMapFlyDestinations[idx][1], -1); } ReturnToFieldFromFlyMapSelect(); } ================================================ FILE: src/renewable_hidden_items.c ================================================ #include "global.h" #include "event_data.h" #include "random.h" #include "constants/maps.h" #define MAX_HIDDEN_ITEMS_PER_GROUP 8 struct RenewableHiddenItemData { s8 mapGroup; s8 mapNum; u8 filler[2]; u8 rare[MAX_HIDDEN_ITEMS_PER_GROUP]; // 10% u8 uncommon[MAX_HIDDEN_ITEMS_PER_GROUP]; // 30% u8 common[MAX_HIDDEN_ITEMS_PER_GROUP]; // 60% }; static void SampleRenewableItemFlags(void); #define HIDDEN_ID(flag)(flag - FLAG_HIDDEN_ITEMS_START) #define NO_ITEM 0xFF static const struct RenewableHiddenItemData sRenewableHiddenItems[] = { { .mapGroup = MAP_GROUP(ROUTE20), .mapNum = MAP_NUM(ROUTE20), .rare = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_ROUTE20_STARDUST), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(ROUTE21_NORTH), .mapNum = MAP_NUM(ROUTE21_NORTH), .rare = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_ROUTE21_NORTH_PEARL), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL), .mapNum = MAP_NUM(UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ETHER), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_POTION), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ANTIDOTE), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_PARALYZE_HEAL), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_AWAKENING), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_BURN_HEAL), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ICE_HEAL), NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(UNDERGROUND_PATH_EAST_WEST_TUNNEL), .mapNum = MAP_NUM(UNDERGROUND_PATH_EAST_WEST_TUNNEL), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ETHER), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_POTION), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ANTIDOTE), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_PARALYZE_HEAL), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_AWAKENING), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_BURN_HEAL), HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ICE_HEAL), NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS), .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_4), HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE), HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_2), HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_3), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(MT_MOON_B1F), .mapNum = MAP_NUM(MT_MOON_B1F), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM), HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_2), HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_3), HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM), HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_2), HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_3), NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM), HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_2), HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_3), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(THREE_ISLAND_BERRY_FOREST), .mapNum = MAP_NUM(THREE_ISLAND_BERRY_FOREST), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY), // Changed from Bluk HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY), // Changed from Wepear HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_SITRUS_BERRY), // Changed from Oran HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_RAWST_BERRY), // Changed from Cheri (which was already in the table) HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY), // Changed from Aspear HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY), HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY), // Changed from Pinap HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_LUM_BERRY), }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY), // Changed from Bluk HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY), // Changed from Wepear HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ORAN_BERRY), HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHERI_BERRY), HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ASPEAR_BERRY), HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY), HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY), // Changed from Pinap HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY), // New }, .common = { HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_POMEG_BERRY), // Changed from Razz HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_QUALOT_BERRY), // Changed from Nanab HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHESTO_BERRY), HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PECHA_BERRY), HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY), // Changed from Rawst HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY), // New HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY), // New HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY), // New } }, { .mapGroup = MAP_GROUP(ONE_ISLAND_TREASURE_BEACH), .mapNum = MAP_NUM(ONE_ISLAND_TREASURE_BEACH), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL), HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2), HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STAR_PIECE), HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_BIG_PEARL), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST), HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST_2), HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL), HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL_2), HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL), HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2), NO_ITEM, NO_ITEM }, .common = { HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL), HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), .mapNum = MAP_NUM(THREE_ISLAND_BOND_BRIDGE), .rare = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_PEARL), HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_STARDUST), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(FOUR_ISLAND), .mapNum = MAP_NUM(FOUR_ISLAND), .rare = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_FOUR_ISLAND_PEARL), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { HIDDEN_ID(FLAG_HIDDEN_ITEM_FOUR_ISLAND_ULTRA_BALL), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_MEMORIAL_PILLAR), .mapNum = MAP_NUM(FIVE_ISLAND_MEMORIAL_PILLAR), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_BIG_PEARL), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), .mapNum = MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_NEST_BALL), HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STAR_PIECE), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST), HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST_2), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(SIX_ISLAND_OUTCAST_ISLAND), .mapNum = MAP_NUM(SIX_ISLAND_OUTCAST_ISLAND), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_STAR_PIECE), HIDDEN_ID(FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_NET_BALL), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(SIX_ISLAND_GREEN_PATH), .mapNum = MAP_NUM(SIX_ISLAND_GREEN_PATH), .rare = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { HIDDEN_ID(FLAG_HIDDEN_ITEM_SIX_ISLAND_GREEN_PATH_ULTRA_BALL), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, { .mapGroup = MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER), .mapNum = MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER), .rare = { HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_BIG_PEARL), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .uncommon = { HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_PEARL), NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }, .common = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM } }, }; void SetAllRenewableItemFlags(void) { u8 i, j; for (i = 0; i < ARRAY_COUNT(sRenewableHiddenItems); i++) { const u8 * rare = sRenewableHiddenItems[i].rare; const u8 * uncommon = sRenewableHiddenItems[i].uncommon; const u8 * common = sRenewableHiddenItems[i].common; for (j = 0; j < MAX_HIDDEN_ITEMS_PER_GROUP; j++) { if (rare[j] != NO_ITEM) FlagSet(FLAG_HIDDEN_ITEMS_START + rare[j]); if (uncommon[j] != NO_ITEM) FlagSet(FLAG_HIDDEN_ITEMS_START + uncommon[j]); if (common[j] != NO_ITEM) FlagSet(FLAG_HIDDEN_ITEMS_START + common[j]); } } } void IncrementRenewableHiddenItemStepCounter(void) { u16 var = VarGet(VAR_RENEWABLE_ITEM_STEP_COUNTER); if (var < 1500) { VarSet(VAR_RENEWABLE_ITEM_STEP_COUNTER, var + 1); } } void TryRegenerateRenewableHiddenItems(void) { u32 i; u8 found_map = 0xFF; for (i = 0; i < ARRAY_COUNT(sRenewableHiddenItems); i++) { if (sRenewableHiddenItems[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && sRenewableHiddenItems[i].mapNum == gSaveBlock1Ptr->location.mapNum) found_map = i; } if (found_map == 0xFF) return; if (VarGet(VAR_RENEWABLE_ITEM_STEP_COUNTER) >= 1500) { VarSet(VAR_RENEWABLE_ITEM_STEP_COUNTER, 0); SetAllRenewableItemFlags(); SampleRenewableItemFlags(); } } static void SampleRenewableItemFlags(void) { u8 i, j; const u8 * flags; u16 rval; for (i = 0; i < ARRAY_COUNT(sRenewableHiddenItems); i++) { rval = Random() % 100; if (rval >= 90) flags = sRenewableHiddenItems[i].rare; else if (rval >= 60) flags = sRenewableHiddenItems[i].uncommon; else flags = sRenewableHiddenItems[i].common; for (j = 0; j < MAX_HIDDEN_ITEMS_PER_GROUP; j++) { if (flags[j] != NO_ITEM) FlagClear(FLAG_HIDDEN_ITEMS_START + flags[j]); } } } ================================================ FILE: src/reset_save_heap.c ================================================ #include "global.h" #include "gflib.h" #include "m4a.h" #include "load_save.h" #include "save.h" #include "new_game.h" #include "overworld.h" void ReloadSave(void) { u16 imeBackup = REG_IME; REG_IME = 0; RegisterRamReset(RESET_EWRAM); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); REG_IME = imeBackup; gMain.inBattle = FALSE; SetSaveBlocksPointers(); ResetMenuAndMonGlobals(); Save_ResetSaveCounters(); LoadGameSave(SAVE_NORMAL); if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID) Sav2_ClearSetDefault(); SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); InitHeap(gHeap, HEAP_SIZE); SetMainCallback2(CB2_ContinueSavedGame); } ================================================ FILE: src/reshow_battle_screen.c ================================================ #include "global.h" #include "gflib.h" #include "link.h" #include "data.h" #include "scanline_effect.h" #include "help_system.h" #include "battle.h" #include "battle_interface.h" #include "battle_anim.h" #include "battle_controllers.h" static void CB2_ReshowBattleScreenAfterMenu(void); static void ReshowBattleScreen_TurnOnDisplay(void); static bool8 LoadBattlerSpriteGfx(u8 battlerId); static void CreateBattlerSprite(u8 battlerId); static void CreateHealthboxSprite(u8 battlerId); void ReshowBattleScreenDummy(void) { } void ReshowBattleScreenAfterMenu(void) { gPaletteFade.bufferTransferDisabled = 1; SetHBlankCallback(NULL); SetGpuReg(REG_OFFSET_MOSAIC, 0); gBattleScripting.reshowMainState = 0; gBattleScripting.reshowHelperState = 0; if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_DOUBLE); else SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_SINGLE); } else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { SetHelpContext(HELPCONTEXT_SAFARI_BATTLE); } else { SetHelpContext(HELPCONTEXT_WILD_BATTLE); } } SetMainCallback2(CB2_ReshowBattleScreenAfterMenu); } static void CB2_ReshowBattleScreenAfterMenu(void) { u8 opponentBattler; u16 species; switch (gBattleScripting.reshowMainState) { case 0: ResetSpriteData(); break; case 1: SetVBlankCallback(NULL); ScanlineEffect_Clear(); BattleInitBgsAndWindows(); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); ResetPaletteFade(); gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; gBattle_BG2_Y = 0; gBattle_BG3_X = 0; gBattle_BG3_Y = 0; break; case 2: CpuFastFill(0, (void *)VRAM, VRAM_SIZE); break; case 3: LoadBattleTextboxAndBackground(); break; case 4: FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; break; case 5: ClearSpritesHealthboxAnimData(); break; case 6: if (BattleLoadAllHealthBoxesGfx(gBattleScripting.reshowHelperState)) { gBattleScripting.reshowHelperState = 0; } else { ++gBattleScripting.reshowHelperState; --gBattleScripting.reshowMainState; } break; case 7: if (!LoadBattlerSpriteGfx(0)) --gBattleScripting.reshowMainState; break; case 8: if (!LoadBattlerSpriteGfx(1)) --gBattleScripting.reshowMainState; break; case 9: if (!LoadBattlerSpriteGfx(2)) --gBattleScripting.reshowMainState; break; case 10: if (!LoadBattlerSpriteGfx(3)) --gBattleScripting.reshowMainState; break; case 11: CreateBattlerSprite(0); break; case 12: CreateBattlerSprite(1); break; case 13: CreateBattlerSprite(2); break; case 14: CreateBattlerSprite(3); break; case 15: CreateHealthboxSprite(0); break; case 16: CreateHealthboxSprite(1); break; case 17: CreateHealthboxSprite(2); break; case 18: CreateHealthboxSprite(3); break; case 19: LoadAndCreateEnemyShadowSprites(); opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES); SetBattlerShadowSpriteCallback(opponentBattler, species); if (IsDoubleBattle()) { opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES); SetBattlerShadowSpriteCallback(opponentBattler, species); } ActionSelectionCreateCursorAt(gActionSelectionCursor[gBattlerInMenuId], 0); if (gWirelessCommType && gReceivedRemoteLinkPlayers) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } break; case 20: SetVBlankCallback(VBlankCB_Battle); ReshowBattleScreen_TurnOnDisplay(); BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1); gPaletteFade.bufferTransferDisabled = 0; SetMainCallback2(BattleMainCB2); BattleInterfaceSetWindowPals(); break; default: break; } ++gBattleScripting.reshowMainState; } static void ReshowBattleScreen_TurnOnDisplay(void) { EnableInterrupts(INTR_FLAG_VBLANK); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_WININ, 0x3F); SetGpuReg(REG_OFFSET_WINOUT, 0x3F); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN1H, 0); SetGpuReg(REG_OFFSET_WIN1V, 0); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_OBJWIN_ON); } static bool8 LoadBattlerSpriteGfx(u8 battler) { if (battler < gBattlersCount) { if (GetBattlerSide(battler) != B_SIDE_PLAYER) { if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) DecompressGhostFrontPic(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); else BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE); } else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler. DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, battler); else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler. DecompressTrainerBackPalette(TRAINER_BACK_PIC_OLD_MAN, battler); else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); else BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE); gBattleScripting.reshowHelperState = 0; } return TRUE; } static void CreateBattlerSprite(u8 battler) { if (battler < gBattlersCount) { u8 posY; if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) posY = GetGhostSpriteDefault_Y(battler); else if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) posY = GetSubstituteSpriteDefault_Y(battler); else posY = GetBattlerSpriteDefault_Y(battler); if (GetBattlerSide(battler) != B_SIDE_PLAYER) { if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0) return; SetMultiuseSpriteTemplateToPokemon(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), posY, GetBattlerSpriteSubpriority(battler)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); } else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) { SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(B_POSITION_PLAYER_LEFT)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50, (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80, GetBattlerSpriteSubpriority(0)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; } else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) { SetMultiuseSpriteTemplateToTrainerBack(5, GetBattlerPosition(0)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50, (8 - gTrainerBackPicCoords[5].size) * 4 + 80, GetBattlerSpriteSubpriority(0)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; } else if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0) { return; } else { SetMultiuseSpriteTemplateToPokemon(GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), posY, GetBattlerSpriteSubpriority(battler)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); } gSprites[gBattlerSpriteIds[battler]].invisible = gBattleSpritesDataPtr->battlerData[battler].invisible; } } static void CreateHealthboxSprite(u8 battler) { if (battler < gBattlersCount) { u8 healthboxSpriteId; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) healthboxSpriteId = CreateSafariPlayerHealthboxSprites(); else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) return; else healthboxSpriteId = CreateBattlerHealthboxSprites(battler); gHealthboxSpriteIds[battler] = healthboxSpriteId; InitBattlerHealthboxCoords(battler); SetHealthboxSpriteVisible(healthboxSpriteId); if (GetBattlerSide(battler) != B_SIDE_PLAYER) UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gEnemyParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL); else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_SAFARI_ALL_TEXT); else UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL); if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT) DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], TRUE); else DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], FALSE); if (GetBattlerSide(battler) != B_SIDE_PLAYER) { if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0) SetHealthboxSpriteInvisible(healthboxSpriteId); } else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0) { SetHealthboxSpriteInvisible(healthboxSpriteId); } } } ================================================ FILE: src/roamer.c ================================================ #include "global.h" #include "event_data.h" #include "random.h" #include "overworld.h" #include "field_specials.h" #include "constants/flags.h" #include "constants/species.h" #include "constants/maps.h" #include "constants/region_map_sections.h" // Despite having a variable to track it, the roamer is // hard-coded to only ever be in map group 3 #define ROAMER_MAP_GROUP 3 enum { MAP_GRP, // map group MAP_NUM, // map number }; #define ROAMER (&gSaveBlock1Ptr->roamer) EWRAM_DATA u8 sLocationHistory[3][2] = {}; EWRAM_DATA u8 sRoamerLocation[2] = {}; #define ___ MAP_NUM(UNDEFINED) // For empty spots in the location table // Note: There are two potential softlocks that can occur with this table if its maps are // changed in particular ways. They can be avoided by ensuring the following: // - There must be at least 2 location sets that start with a different map, // i.e. every location set cannot start with the same map. This is because of // the while loop in RoamerMoveToOtherLocationSet. // - Each location set must have at least 3 unique maps. This is because of // the while loop in RoamerMove. In this loop the first map in the set is // ignored, and an additional map is ignored if the roamer was there recently. // - Additionally, while not a softlock, it's worth noting that if for any // map in the location table there is not a location set that starts with // that map then the roamer will be significantly less likely to move away // from that map when it lands there. static const u8 sRoamerLocations[][7] = { {MAP_NUM(ROUTE1), MAP_NUM(ROUTE2), MAP_NUM(ROUTE21_NORTH), MAP_NUM(ROUTE22), ___, ___, ___}, {MAP_NUM(ROUTE2), MAP_NUM(ROUTE1), MAP_NUM(ROUTE3), MAP_NUM(ROUTE22), ___, ___, ___}, {MAP_NUM(ROUTE3), MAP_NUM(ROUTE2), MAP_NUM(ROUTE4), ___, ___, ___, ___}, {MAP_NUM(ROUTE4), MAP_NUM(ROUTE3), MAP_NUM(ROUTE5), MAP_NUM(ROUTE9), MAP_NUM(ROUTE24), ___, ___}, {MAP_NUM(ROUTE5), MAP_NUM(ROUTE4), MAP_NUM(ROUTE6), MAP_NUM(ROUTE7), MAP_NUM(ROUTE8), MAP_NUM(ROUTE9), MAP_NUM(ROUTE24)}, {MAP_NUM(ROUTE6), MAP_NUM(ROUTE5), MAP_NUM(ROUTE7), MAP_NUM(ROUTE8), MAP_NUM(ROUTE11), ___, ___}, {MAP_NUM(ROUTE7), MAP_NUM(ROUTE5), MAP_NUM(ROUTE6), MAP_NUM(ROUTE8), MAP_NUM(ROUTE16), ___, ___}, {MAP_NUM(ROUTE8), MAP_NUM(ROUTE5), MAP_NUM(ROUTE6), MAP_NUM(ROUTE7), MAP_NUM(ROUTE10), MAP_NUM(ROUTE12), ___}, {MAP_NUM(ROUTE9), MAP_NUM(ROUTE4), MAP_NUM(ROUTE5), MAP_NUM(ROUTE10), MAP_NUM(ROUTE24), ___, ___}, {MAP_NUM(ROUTE10), MAP_NUM(ROUTE8), MAP_NUM(ROUTE9), MAP_NUM(ROUTE12), ___, ___, ___}, {MAP_NUM(ROUTE11), MAP_NUM(ROUTE6), MAP_NUM(ROUTE12), ___, ___, ___, ___}, {MAP_NUM(ROUTE12), MAP_NUM(ROUTE10), MAP_NUM(ROUTE11), MAP_NUM(ROUTE13), ___, ___, ___}, {MAP_NUM(ROUTE13), MAP_NUM(ROUTE12), MAP_NUM(ROUTE14), ___, ___, ___, ___}, {MAP_NUM(ROUTE14), MAP_NUM(ROUTE13), MAP_NUM(ROUTE15), ___, ___, ___, ___}, {MAP_NUM(ROUTE15), MAP_NUM(ROUTE14), MAP_NUM(ROUTE18), MAP_NUM(ROUTE19), ___, ___, ___}, {MAP_NUM(ROUTE16), MAP_NUM(ROUTE7), MAP_NUM(ROUTE17), ___, ___, ___, ___}, {MAP_NUM(ROUTE17), MAP_NUM(ROUTE16), MAP_NUM(ROUTE18), ___, ___, ___, ___}, {MAP_NUM(ROUTE18), MAP_NUM(ROUTE15), MAP_NUM(ROUTE17), MAP_NUM(ROUTE19), ___, ___, ___}, {MAP_NUM(ROUTE19), MAP_NUM(ROUTE15), MAP_NUM(ROUTE18), MAP_NUM(ROUTE20), ___, ___, ___}, {MAP_NUM(ROUTE20), MAP_NUM(ROUTE19), MAP_NUM(ROUTE21_NORTH), ___, ___, ___, ___}, {MAP_NUM(ROUTE21_NORTH), MAP_NUM(ROUTE1), MAP_NUM(ROUTE20), ___, ___, ___, ___}, {MAP_NUM(ROUTE22), MAP_NUM(ROUTE1), MAP_NUM(ROUTE2), MAP_NUM(ROUTE23), ___, ___, ___}, {MAP_NUM(ROUTE23), MAP_NUM(ROUTE22), MAP_NUM(ROUTE2), ___, ___, ___, ___}, {MAP_NUM(ROUTE24), MAP_NUM(ROUTE4), MAP_NUM(ROUTE5), MAP_NUM(ROUTE9), ___, ___, ___}, {MAP_NUM(ROUTE25), MAP_NUM(ROUTE24), MAP_NUM(ROUTE9), ___, ___, ___, ___}, {___, ___, ___, ___, ___, ___, ___} }; #undef ___ #define NUM_LOCATION_SETS (ARRAY_COUNT(sRoamerLocations) - 1) #define NUM_LOCATIONS_PER_SET (ARRAY_COUNT(sRoamerLocations[0])) void ClearRoamerData(void) { u32 i; *ROAMER = (struct Roamer){}; sRoamerLocation[MAP_GRP] = 0; sRoamerLocation[MAP_NUM] = 0; for (i = 0; i < ARRAY_COUNT(sLocationHistory); i++) { sLocationHistory[i][MAP_GRP] = 0; sLocationHistory[i][MAP_NUM] = 0; } } u16 GetRoamerSpecies(void) { u16 species = SPECIES_NONE; u16 starter = GetStarterSpecies(); switch(starter) { case SPECIES_SQUIRTLE: if(!FlagGet(FLAG_CAUGHT_RAIKOU)) { species = SPECIES_RAIKOU; } else if(!FlagGet(FLAG_CAUGHT_ENTEI)) { species = SPECIES_ENTEI; } else { species = SPECIES_SUICUNE; } break; case SPECIES_BULBASAUR: if(!FlagGet(FLAG_CAUGHT_ENTEI)) { species = SPECIES_ENTEI; } else if(!FlagGet(FLAG_CAUGHT_SUICUNE)) { species = SPECIES_SUICUNE; } else { species = SPECIES_RAIKOU; } break; case SPECIES_CHARMANDER: if(!FlagGet(FLAG_CAUGHT_SUICUNE)) { species = SPECIES_SUICUNE; } else if(!FlagGet(FLAG_CAUGHT_RAIKOU)) { species = SPECIES_RAIKOU; } else { species = SPECIES_ENTEI; } break; } return species; } void CreateInitialRoamerMon(void) { struct Pokemon * mon = &gEnemyParty[0]; u16 species = GetRoamerSpecies(); CreateMon(mon, species, 50, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); ROAMER->species = species; ROAMER->level = 50; ROAMER->status = 0; ROAMER->active = TRUE; ROAMER->ivs = GetMonData(mon, MON_DATA_IVS); ROAMER->personality = GetMonData(mon, MON_DATA_PERSONALITY); ROAMER->hp = GetMonData(mon, MON_DATA_MAX_HP); ROAMER->cool = GetMonData(mon, MON_DATA_COOL); ROAMER->beauty = GetMonData(mon, MON_DATA_BEAUTY); ROAMER->cute = GetMonData(mon, MON_DATA_CUTE); ROAMER->smart = GetMonData(mon, MON_DATA_SMART); ROAMER->tough = GetMonData(mon, MON_DATA_TOUGH); sRoamerLocation[MAP_GRP] = ROAMER_MAP_GROUP; sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % NUM_LOCATION_SETS][0]; } void InitRoamer(void) { if (ROAMER->active) return; if(FlagGet(FLAG_CAUGHT_RAIKOU) && FlagGet(FLAG_CAUGHT_ENTEI) && FlagGet(FLAG_CAUGHT_SUICUNE)) return; ClearRoamerData(); CreateInitialRoamerMon(); } void UpdateLocationHistoryForRoamer(void) { sLocationHistory[2][MAP_GRP] = sLocationHistory[1][MAP_GRP]; sLocationHistory[2][MAP_NUM] = sLocationHistory[1][MAP_NUM]; sLocationHistory[1][MAP_GRP] = sLocationHistory[0][MAP_GRP]; sLocationHistory[1][MAP_NUM] = sLocationHistory[0][MAP_NUM]; sLocationHistory[0][MAP_GRP] = gSaveBlock1Ptr->location.mapGroup; sLocationHistory[0][MAP_NUM] = gSaveBlock1Ptr->location.mapNum; } void RoamerMoveToOtherLocationSet(void) { u8 mapNum = 0; if (!ROAMER->active) return; sRoamerLocation[MAP_GRP] = ROAMER_MAP_GROUP; // Choose a location set that starts with a map // different from the roamer's current map while (1) { mapNum = sRoamerLocations[Random() % NUM_LOCATION_SETS][0]; if (sRoamerLocation[MAP_NUM] != mapNum) { sRoamerLocation[MAP_NUM] = mapNum; return; } } } void RoamerMove(void) { u8 locSet = 0; if ((Random() % 16) == 0) { RoamerMoveToOtherLocationSet(); } else { if (!ROAMER->active) return; while (locSet < NUM_LOCATION_SETS) { // Find the location set that starts with the roamer's current map if (sRoamerLocation[MAP_NUM] == sRoamerLocations[locSet][0]) { u8 mapNum; while (1) { // Choose a new map (excluding the first) within this set // Also exclude a map if the roamer was there 2 moves ago mapNum = sRoamerLocations[locSet][(Random() % (NUM_LOCATIONS_PER_SET - 1)) + 1]; if (!(sLocationHistory[2][MAP_GRP] == ROAMER_MAP_GROUP && sLocationHistory[2][MAP_NUM] == mapNum) && mapNum != MAP_NUM(UNDEFINED)) break; } sRoamerLocation[MAP_NUM] = mapNum; return; } locSet++; } } } bool8 IsRoamerAt(u8 mapGroup, u8 mapNum) { if (ROAMER->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM]) return TRUE; else return FALSE; } void CreateRoamerMonInstance(void) { u32 status; struct Pokemon *mon = &gEnemyParty[0]; ZeroEnemyPartyMons(); CreateMonWithIVsPersonality(mon, ROAMER->species, ROAMER->level, ROAMER->ivs, ROAMER->personality); // The roamer's status field is u8, but SetMonData expects status to be u32, so will set the roamer's status // using the status field and the following 3 bytes (cool, beauty, and cute). #ifdef BUGFIX status = ROAMER->status; SetMonData(mon, MON_DATA_STATUS, &status); #else SetMonData(mon, MON_DATA_STATUS, &ROAMER->status); #endif SetMonData(mon, MON_DATA_HP, &ROAMER->hp); SetMonData(mon, MON_DATA_COOL, &ROAMER->cool); SetMonData(mon, MON_DATA_BEAUTY, &ROAMER->beauty); SetMonData(mon, MON_DATA_CUTE, &ROAMER->cute); SetMonData(mon, MON_DATA_SMART, &ROAMER->smart); SetMonData(mon, MON_DATA_TOUGH, &ROAMER->tough); } bool8 TryStartRoamerEncounter(void) { if (IsRoamerAt(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum) == TRUE && (Random() % 4) == 0) { CreateRoamerMonInstance(); return TRUE; } else { return FALSE; } } void UpdateRoamerHPStatus(struct Pokemon *mon) { ROAMER->hp = GetMonData(mon, MON_DATA_HP); ROAMER->status = GetMonData(mon, MON_DATA_STATUS); RoamerMoveToOtherLocationSet(); } void SetRoamerInactive(void) { ROAMER->active = FALSE; } void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) { *mapGroup = sRoamerLocation[MAP_GRP]; *mapNum = sRoamerLocation[MAP_NUM]; } u16 GetRoamerLocationMapSectionId(void) { if (!ROAMER->active) return MAPSEC_NONE; return Overworld_GetMapHeaderByGroupAndId(sRoamerLocation[MAP_GRP], sRoamerLocation[MAP_NUM])->regionMapSectionId; } ================================================ FILE: src/rom_header.s ================================================ @ Note: ROM header data is empty space here. @ It's populated by gbafix using data provided in the Makefile. .global Start Start: b start_vector .global RomHeaderNintendoLogo RomHeaderNintendoLogo: .space 156 RomHeaderGameTitle: .space 12 .global RomHeaderGameCode RomHeaderGameCode: .space 4 RomHeaderMakerCode: .space 2 RomHeaderMagic: .byte 0 RomHeaderMainUnitCode: .byte 0 RomHeaderDeviceType: .byte 0 RomHeaderReserved1: .space 7 .global RomHeaderSoftwareVersion RomHeaderSoftwareVersion: .byte 0 RomHeaderChecksum: .byte 0 RomHeaderReserved2: .space 2 .word 0 .global GPIOPortData GPIOPortData: .hword 0 .global GPIOPortDirection GPIOPortDirection: .hword 0 .global GPIOPortReadEnable GPIOPortReadEnable: .hword 0 .space 6 .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF ================================================ FILE: src/rom_header_gf.c ================================================ #include "global.h" #include "data.h" #include "pokemon_icon.h" #include "decoration.h" #include "battle_main.h" #include "item.h" #include "pokeball.h" #include "pokedex.h" struct GFRomHeader { u32 version; u32 language; u8 gameName[32]; const struct CompressedSpriteSheet * monFrontPics; const struct CompressedSpriteSheet * monBackPics; const struct CompressedSpritePalette * monNormalPalettes; const struct CompressedSpritePalette * monShinyPalettes; const u8 *const * monIcons; const u8 * monIconPaletteIds; const struct SpritePalette * monIconPalettes; const u8 (* monSpeciesNames)[]; const u8 (* moveNames)[]; const struct Decoration * decorations; u32 flagsOffset; u32 varsOffset; u32 pokedexOffset; u32 seen1Offset; u32 seen2Offset; u32 pokedexVar; u32 pokedexFlag; u32 mysteryGiftFlag; u32 pokedexCount; u8 playerNameLength; u8 unk2; u8 pokemonNameLength1; u8 pokemonNameLength2; u8 unk5; u8 unk6; u8 unk7; u8 unk8; u8 unk9; u8 unk10; u8 unk11; u8 unk12; u8 unk13; u8 unk14; u8 unk15; u8 unk16; u8 unk17; u32 saveBlock2Size; u32 saveBlock1Size; u32 partyCountOffset; u32 partyOffset; u32 warpFlagsOffset; u32 trainerIdOffset; u32 playerNameOffset; u32 playerGenderOffset; u32 unkFlagOffset; u32 unkFlagOffset2; u32 externalEventFlagsOffset; u32 externalEventDataOffset; u32 unk18; const struct SpeciesInfo * speciesInfo; const u8 (* abilityNames)[]; const u8 *const * abilityDescriptions; const struct Item * items; const struct BattleMove * moves; const struct CompressedSpriteSheet * ballGfx; const struct CompressedSpritePalette * ballPalettes; u32 gcnLinkFlagsOffset; u32 gameClearFlag; u32 ribbonFlag; u8 bagCountItems; u8 bagCountKeyItems; u8 bagCountPokeballs; u8 bagCountTMHMs; u8 bagCountBerries; u8 pcItemsCount; u32 pcItemsOffset; u32 giftRibbonsOffset; u32 enigmaBerryOffset; u32 enigmaBerrySize; const u8 * moveDescriptions; u32 unk20; }; // This seems to need to be in the text section for some reason. // To avoid a changed section attributes warning it's put in a special .text.consts section. __attribute__((section(".text.consts"))) static const struct GFRomHeader sGFRomHeader = { .version = GAME_VERSION, .language = GAME_LANGUAGE, #ifdef FIRERED .gameName = "pokemon red version", #else .gameName = "pokemon green version", #endif .monFrontPics = gMonFrontPicTable, .monBackPics = gMonBackPicTable, .monNormalPalettes = gMonPaletteTable, .monShinyPalettes = gMonShinyPaletteTable, .monIcons = gMonIconTable, .monIconPaletteIds = gMonIconPaletteIndices, .monIconPalettes = gMonIconPaletteTable, .monSpeciesNames = gSpeciesNames, .moveNames = gMoveNames, .decorations = gDecorations, .flagsOffset = offsetof(struct SaveBlock1, flags), .varsOffset = offsetof(struct SaveBlock1, vars), .pokedexOffset = offsetof(struct SaveBlock2, pokedex), .seen1Offset = offsetof(struct SaveBlock1, seen1), .seen2Offset = offsetof(struct SaveBlock1, seen2), .pokedexVar = VAR_0x403C - VARS_START, .pokedexFlag = FLAG_0x838, .mysteryGiftFlag = FLAG_SYS_MYSTERY_GIFT_ENABLED, .pokedexCount = NATIONAL_DEX_COUNT, .playerNameLength = PLAYER_NAME_LENGTH, .unk2 = 10, .pokemonNameLength1 = POKEMON_NAME_LENGTH, .pokemonNameLength2 = POKEMON_NAME_LENGTH, // Two of the below 12s are likely move/ability name length, given their presence in this header .unk5 = 12, .unk6 = 12, .unk7 = 6, .unk8 = 12, .unk9 = 6, .unk10 = 16, .unk11 = 18, .unk12 = 12, .unk13 = 15, .unk14 = 11, .unk15 = 1, .unk16 = 8, .unk17 = 12, .saveBlock2Size = sizeof(struct SaveBlock2), .saveBlock1Size = sizeof(struct SaveBlock1), .partyCountOffset = offsetof(struct SaveBlock1, playerPartyCount), .partyOffset = offsetof(struct SaveBlock1, playerParty), .warpFlagsOffset = offsetof(struct SaveBlock2, specialSaveWarpFlags), .trainerIdOffset = offsetof(struct SaveBlock2, playerTrainerId), .playerNameOffset = offsetof(struct SaveBlock2, playerName), .playerGenderOffset = offsetof(struct SaveBlock2, playerGender), .unkFlagOffset = offsetof(struct SaveBlock2, unkFlag2), .unkFlagOffset2 = offsetof(struct SaveBlock2, unkFlag2), .externalEventFlagsOffset = offsetof(struct SaveBlock1, externalEventFlags), .externalEventDataOffset = offsetof(struct SaveBlock1, externalEventData), .unk18 = 0x00000000, .speciesInfo = gSpeciesInfo, .abilityNames = gAbilityNames, .abilityDescriptions = gAbilityDescriptionPointers, .items = gItems, .moves = gBattleMoves, .ballGfx = gBallSpriteSheets, .ballPalettes = gBallSpritePalettes, .gcnLinkFlagsOffset = offsetof(struct SaveBlock2, gcnLinkFlags), .gameClearFlag = FLAG_SYS_GAME_CLEAR, .ribbonFlag = FLAG_SYS_RIBBON_GET, .bagCountItems = BAG_ITEMS_COUNT, .bagCountKeyItems = BAG_KEYITEMS_COUNT, .bagCountPokeballs = BAG_POKEBALLS_COUNT, .bagCountTMHMs = BAG_TMHM_COUNT, .bagCountBerries = BAG_BERRIES_COUNT, .pcItemsCount = PC_ITEMS_COUNT, .pcItemsOffset = offsetof(struct SaveBlock1, pcItems), .giftRibbonsOffset = offsetof(struct SaveBlock1, giftRibbons), .enigmaBerryOffset = offsetof(struct SaveBlock1, enigmaBerry), .enigmaBerrySize = sizeof(struct EnigmaBerry), .moveDescriptions = NULL, .unk20 = 0xFFFFFFFF, // 0x00000000 in Emerald }; ================================================ FILE: src/safari_zone.c ================================================ #include "global.h" #include "battle.h" #include "battle_setup.h" #include "event_scripts.h" #include "overworld.h" #include "pokedex.h" #include "script.h" #include "event_data.h" #include "field_screen_effect.h" #include "constants/map_types.h" EWRAM_DATA u8 gNumSafariBalls = 0; EWRAM_DATA u16 gSafariZoneStepCounter = 0; bool32 GetSafariZoneFlag(void) { return FlagGet(FLAG_SYS_SAFARI_MODE); } void SetSafariZoneFlag(void) { FlagSet(FLAG_SYS_SAFARI_MODE); } void ResetSafariZoneFlag(void) { FlagClear(FLAG_SYS_SAFARI_MODE); } void EnterSafariMode(void) { IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE); SetSafariZoneFlag(); gNumSafariBalls = 30; gSafariZoneStepCounter = 600; } void ExitSafariMode(void) { ResetSafariZoneFlag(); gNumSafariBalls = 0; gSafariZoneStepCounter = 0; } bool8 SafariZoneTakeStep(void) { if (GetSafariZoneFlag() == FALSE) return FALSE; if (gMapHeader.mapType == MAP_TYPE_INDOOR) return FALSE; gSafariZoneStepCounter--; if (gSafariZoneStepCounter == 0) { ScriptContext_SetupScript(SafariZone_EventScript_TimesUp); return TRUE; } return FALSE; } void SafariZoneRetirePrompt(void) { ScriptContext_SetupScript(SafariZone_EventScript_RetirePrompt); } void CB2_EndSafariBattle(void) { if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[0], MON_DATA_SPECIES))) { NuzlockeFlagSet(GetCurrentRegionMapSectionId()); } } if (gNumSafariBalls != 0) { SetMainCallback2(CB2_ReturnToField); } else if (gBattleOutcome == B_OUTCOME_NO_SAFARI_BALLS) { RunScriptImmediately(SafariZone_EventScript_OutOfBallsMidBattle); WarpIntoMap(); gFieldCallback = FieldCB_SafariZoneRanOutOfBalls; SetMainCallback2(CB2_LoadMap); } else if (gBattleOutcome == B_OUTCOME_CAUGHT) { ScriptContext_SetupScript(SafariZone_EventScript_OutOfBalls); ScriptContext_Stop(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } } void SafariZoneRefillSteps(void) { gSafariZoneStepCounter = 600; } void SafariZoneCheckSteps(void) { gSpecialVar_Result = gSafariZoneStepCounter; } ================================================ FILE: src/save.c ================================================ #include "global.h" #include "save.h" #include "decompress.h" #include "overworld.h" #include "load_save.h" #include "task.h" #include "link.h" #include "save_failed_screen.h" #include "fieldmap.h" #include "pokemon_storage_system.h" #include "gba/flash_internal.h" static u8 HandleWriteSector(u16 sectorId, const struct SaveSectorLocation *locations); static u8 TryWriteSector(u8 sectorNum, u8 *data); static u8 HandleReplaceSector(u16 sectorId, const struct SaveSectorLocation *locations); static u8 CopySaveSlotData(u16 sectorId, const struct SaveSectorLocation *locations); static u8 GetSaveValidStatus(const struct SaveSectorLocation *locations); static u8 ReadFlashSector(u8 sectorId, struct SaveSector *sector); static u16 CalculateChecksum(void *data, u16 size); /* * Sector Layout: * * Sectors 0 - 13: Save Slot 1 * Sectors 14 - 27: Save Slot 2 * Sectors 28 - 29: Hall of Fame * Sectors 30 - 31: Trainer Tower * * There are two save slots for saving the player's game data. We alternate between * them each time the game is saved, so that if the current save slot is corrupt, * we can load the previous one. We also rotate the sectors in each save slot * so that the same data is not always being written to the same sector. This * might be done to reduce wear on the flash memory, but I'm not sure, since all * 14 sectors get written anyway. * * See SECTOR_ID_* constants in save.h */ // (u8 *)structure was removed from the first statement of the macro in Emerald // and Fire Red/Leaf Green. This is because malloc is used to allocate addresses // so storing the raw addresses should not be done in the offsets information. #define SAVEBLOCK_CHUNK(structure, chunkNum) \ { \ chunkNum * SECTOR_DATA_SIZE, \ sizeof(structure) >= chunkNum * SECTOR_DATA_SIZE ? \ min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) : 0 \ } struct { u16 offset; u16 size; } static const sSaveSlotLayout[NUM_SECTORS_PER_SLOT] = { SAVEBLOCK_CHUNK(struct SaveBlock2, 0), // SECTOR_ID_SAVEBLOCK2 SAVEBLOCK_CHUNK(struct SaveBlock1, 0), // SECTOR_ID_SAVEBLOCK1_START SAVEBLOCK_CHUNK(struct SaveBlock1, 1), SAVEBLOCK_CHUNK(struct SaveBlock1, 2), SAVEBLOCK_CHUNK(struct SaveBlock1, 3), // SECTOR_ID_SAVEBLOCK1_END SAVEBLOCK_CHUNK(struct PokemonStorage, 0), // SECTOR_ID_PKMN_STORAGE_START SAVEBLOCK_CHUNK(struct PokemonStorage, 1), SAVEBLOCK_CHUNK(struct PokemonStorage, 2), SAVEBLOCK_CHUNK(struct PokemonStorage, 3), SAVEBLOCK_CHUNK(struct PokemonStorage, 4), SAVEBLOCK_CHUNK(struct PokemonStorage, 5), SAVEBLOCK_CHUNK(struct PokemonStorage, 6), SAVEBLOCK_CHUNK(struct PokemonStorage, 7), SAVEBLOCK_CHUNK(struct PokemonStorage, 8), // SECTOR_ID_PKMN_STORAGE_END }; // These will produce an error if a save struct is larger than the space // alloted for it in the flash. STATIC_ASSERT(sizeof(struct SaveBlock2) <= SECTOR_DATA_SIZE, SaveBlock2FreeSpace); STATIC_ASSERT(sizeof(struct SaveBlock1) <= SECTOR_DATA_SIZE * (SECTOR_ID_SAVEBLOCK1_END - SECTOR_ID_SAVEBLOCK1_START + 1), SaveBlock1FreeSpace); STATIC_ASSERT(sizeof(struct PokemonStorage) <= SECTOR_DATA_SIZE * (SECTOR_ID_PKMN_STORAGE_END - SECTOR_ID_PKMN_STORAGE_START + 1), PokemonStorageFreeSpace); // Sector num to begin writing save data. Sectors are rotated each time the game is saved. (possibly to avoid wear on flash memory?) u16 gLastWrittenSector; u32 gLastSaveCounter; u16 gLastKnownGoodSector; u32 gDamagedSaveSectors; u32 gSaveCounter; struct SaveSector *gSaveDataBufferPtr; // the pointer is in fast IWRAM but points to the slower EWRAM. u16 gIncrementalSectorId; u16 gSaveUnusedVar; u16 gSaveFileStatus; void (*gGameContinueCallback)(void); struct SaveSectorLocation gRamSaveSectorLocations[NUM_SECTORS_PER_SLOT]; u16 gSaveAttemptStatus; EWRAM_DATA struct SaveSector gSaveDataBuffer = {0}; EWRAM_DATA u32 gSaveUnusedVar2 = 0; void ClearSaveData(void) { u32 i; for (i = 0; i < SECTORS_COUNT; i++) EraseFlashSector(i); } void Save_ResetSaveCounters(void) { gSaveCounter = 0; gLastWrittenSector = 0; gDamagedSaveSectors = 0; } static bool32 SetDamagedSectorBits(u8 op, u8 sectorNum) { bool32 retVal = FALSE; switch (op) { case ENABLE: gDamagedSaveSectors |= (1 << sectorNum); break; case DISABLE: gDamagedSaveSectors &= ~(1 << sectorNum); break; case CHECK: // unused if (gDamagedSaveSectors & (1 << sectorNum)) retVal = TRUE; break; } return retVal; } static u8 WriteSaveSectorOrSlot(u16 sectorId, const struct SaveSectorLocation *locations) { u32 status; u32 i; gSaveDataBufferPtr = &gSaveDataBuffer; if (sectorId != FULL_SAVE_SLOT) // write single sector status = HandleWriteSector(sectorId, locations); else // write all sectors { gLastKnownGoodSector = gLastWrittenSector; // backup the current written sector before attempting to write. gLastSaveCounter = gSaveCounter; gLastWrittenSector++; gLastWrittenSector %= NUM_SECTORS_PER_SLOT; // array count save sector locations gSaveCounter++; status = SAVE_STATUS_OK; for (i = 0; i < NUM_SECTORS_PER_SLOT; i++) HandleWriteSector(i, locations); // Check for any bad sectors if (gDamagedSaveSectors != 0) // skip the damaged sector. { status = SAVE_STATUS_ERROR; gLastWrittenSector = gLastKnownGoodSector; gSaveCounter = gLastSaveCounter; } } return status; } static u8 HandleWriteSector(u16 sectorId, const struct SaveSectorLocation *locations) { u32 i; u16 sectorNum; u8 *data; u16 size; sectorNum = gLastWrittenSector + sectorId; sectorNum %= NUM_SECTORS_PER_SLOT; sectorNum += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS); data = locations[sectorId].data; size = locations[sectorId].size; // clear buffer for (i = 0; i < SECTOR_SIZE; i++) ((char *)gSaveDataBufferPtr)[i] = 0; // fill buffer with save data gSaveDataBufferPtr->id = sectorId; gSaveDataBufferPtr->signature = SECTOR_SIGNATURE; gSaveDataBufferPtr->counter = gSaveCounter; for (i = 0; i < size; i++) gSaveDataBufferPtr->data[i] = data[i]; gSaveDataBufferPtr->checksum = CalculateChecksum(data, size); return TryWriteSector(sectorNum, gSaveDataBufferPtr->data); } static u8 HandleWriteSectorNBytes(u8 sectorId, u8 *data, u16 size) { u32 i; struct SaveSector *sector = &gSaveDataBuffer; for (i = 0; i < SECTOR_SIZE; i++) ((char *)sector)[i] = 0; sector->signature = SECTOR_SIGNATURE; for (i = 0; i < size; i++) sector->data[i] = data[i]; sector->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used. return TryWriteSector(sectorId, sector->data); } static u8 TryWriteSector(u8 sectorNum, u8 *data) { if (ProgramFlashSectorAndVerify(sectorNum, data)) // is damaged? { SetDamagedSectorBits(ENABLE, sectorNum); // set damaged sector bits. return SAVE_STATUS_ERROR; } else { SetDamagedSectorBits(DISABLE, sectorNum); // unset damaged sector bits. it's safe now. return SAVE_STATUS_OK; } } static u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectorLocation *locations) { gSaveDataBufferPtr = &gSaveDataBuffer; gLastKnownGoodSector = gLastWrittenSector; gLastSaveCounter = gSaveCounter; gLastWrittenSector++; gLastWrittenSector %= NUM_SECTORS_PER_SLOT; gSaveCounter++; gIncrementalSectorId = 0; gDamagedSaveSectors = 0; return 0; } static u32 RestoreSaveBackupVars(const struct SaveSectorLocation *locations) { gSaveDataBufferPtr = &gSaveDataBuffer; gLastKnownGoodSector = gLastWrittenSector; gLastSaveCounter = gSaveCounter; gIncrementalSectorId = 0; gDamagedSaveSectors = 0; return 0; } static u8 HandleWriteIncrementalSector(u16 numSectors, const struct SaveSectorLocation *locations) { u8 status; if (gIncrementalSectorId < numSectors - 1) { status = SAVE_STATUS_OK; HandleWriteSector(gIncrementalSectorId, locations); gIncrementalSectorId++; if (gDamagedSaveSectors) { status = SAVE_STATUS_ERROR; gLastWrittenSector = gLastKnownGoodSector; gSaveCounter = gLastSaveCounter; } } else status = SAVE_STATUS_ERROR; return status; } static u8 HandleReplaceSectorAndVerify(u16 sectorId, const struct SaveSectorLocation *locations) { u8 status = SAVE_STATUS_OK; HandleReplaceSector(sectorId - 1, locations); if (gDamagedSaveSectors) { status = SAVE_STATUS_ERROR; gLastWrittenSector = gLastKnownGoodSector; gSaveCounter = gLastSaveCounter; } return status; } static u8 HandleReplaceSector(u16 sectorId, const struct SaveSectorLocation *locations) { u32 i; u16 sectorNum; u8 *data; u16 size; u8 status; sectorNum = gLastWrittenSector + sectorId; sectorNum %= NUM_SECTORS_PER_SLOT; sectorNum += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS); data = locations[sectorId].data; size = locations[sectorId].size; // clear buffer for (i = 0; i < SECTOR_SIZE; i++) ((char *)gSaveDataBufferPtr)[i] = 0; // fill buffer with save data gSaveDataBufferPtr->id = sectorId; gSaveDataBufferPtr->signature = SECTOR_SIGNATURE; gSaveDataBufferPtr->counter = gSaveCounter; for (i = 0; i < size; i++) gSaveDataBufferPtr->data[i] = data[i]; gSaveDataBufferPtr->checksum = CalculateChecksum(data, size); // erase old save data EraseFlashSector(sectorNum); status = SAVE_STATUS_OK; // write new save data, excluding the signature and counter fields for (i = 0; i < SECTOR_SIGNATURE_OFFSET; i++) { if (ProgramFlashByte(sectorNum, i, gSaveDataBufferPtr->data[i])) { status = SAVE_STATUS_ERROR; break; } } if (status == SAVE_STATUS_ERROR) { SetDamagedSectorBits(ENABLE, sectorNum); return SAVE_STATUS_ERROR; } else { status = SAVE_STATUS_OK; // write signature (skipping the first byte) and counter fields // the first signature byte skipped is instead written in WriteSectorSignatureByte for (i = 0; i < SECTOR_SIZE - (SECTOR_SIGNATURE_OFFSET + 1); i++) { if (ProgramFlashByte(sectorNum, SECTOR_SIGNATURE_OFFSET + 1 + i, ((u8 *)gSaveDataBufferPtr)[SECTOR_SIGNATURE_OFFSET + 1 + i])) { status = SAVE_STATUS_ERROR; break; } } if (status == SAVE_STATUS_ERROR) { SetDamagedSectorBits(ENABLE, sectorNum); return SAVE_STATUS_ERROR; } else { SetDamagedSectorBits(DISABLE, sectorNum); return SAVE_STATUS_OK; } } } static u8 CopySectorSignatureByte(u16 sectorId, const struct SaveSectorLocation *locations) { u16 sector; sector = gLastWrittenSector + sectorId - 1; sector %= NUM_SECTORS_PER_SLOT; sector += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS); if (ProgramFlashByte(sector, SECTOR_SIGNATURE_OFFSET, ((u8 *)gSaveDataBufferPtr)[SECTOR_SIGNATURE_OFFSET])) { // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. SetDamagedSectorBits(ENABLE, sector); gLastWrittenSector = gLastKnownGoodSector; gSaveCounter = gLastSaveCounter; return SAVE_STATUS_ERROR; } else { SetDamagedSectorBits(DISABLE, sector); return SAVE_STATUS_OK; } } static u8 WriteSectorSignatureByte(u16 sectorId, const struct SaveSectorLocation *locations) { u16 sector; sector = gLastWrittenSector + sectorId - 1; sector %= NUM_SECTORS_PER_SLOT; sector += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS); // write only the first byte of the signature, which was skipped in HandleReplaceSector if (ProgramFlashByte(sector, SECTOR_SIGNATURE_OFFSET, SECTOR_SIGNATURE & 0xFF)) { // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. SetDamagedSectorBits(ENABLE, sector); gLastWrittenSector = gLastKnownGoodSector; gSaveCounter = gLastSaveCounter; return SAVE_STATUS_ERROR; } else { SetDamagedSectorBits(DISABLE, sector); return SAVE_STATUS_OK; } } static u8 TryLoadSaveSlot(u16 sectorId, const struct SaveSectorLocation *locations) { u8 status; gSaveDataBufferPtr = &gSaveDataBuffer; if (sectorId != FULL_SAVE_SLOT) status = SAVE_STATUS_ERROR; else { status = GetSaveValidStatus(locations); CopySaveSlotData(FULL_SAVE_SLOT, locations); } return status; } // sectorId is unused. All sectors in the save slot are read and copied. static u8 CopySaveSlotData(u16 sectorId, const struct SaveSectorLocation *locations) { u32 i; u16 checksum; u16 sector = NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS); u16 id; for (i = 0; i < NUM_SECTORS_PER_SLOT; i++) { ReadFlashSector(i + sector, gSaveDataBufferPtr); id = gSaveDataBufferPtr->id; if (id == 0) gLastWrittenSector = i; checksum = CalculateChecksum(gSaveDataBufferPtr->data, locations[id].size); if (gSaveDataBufferPtr->signature == SECTOR_SIGNATURE && gSaveDataBufferPtr->checksum == checksum) { u32 j; for (j = 0; j < locations[id].size; j++) locations[id].data[j] = gSaveDataBufferPtr->data[j]; } } return SAVE_STATUS_OK; } static u8 GetSaveValidStatus(const struct SaveSectorLocation *locations) { u16 sector; bool8 signatureValid; u16 checksum; u32 slot1saveCounter = 0; u32 slot2saveCounter = 0; u8 slot1Status; u8 slot2Status; u32 validSectors; const u32 ALL_SECTORS = (1 << NUM_SECTORS_PER_SLOT) - 1; // bitmask of all saveblock sectors // check save slot 1. validSectors = 0; signatureValid = FALSE; for (sector = 0; sector < NUM_SECTORS_PER_SLOT; sector++) { ReadFlashSector(sector, gSaveDataBufferPtr); if (gSaveDataBufferPtr->signature == SECTOR_SIGNATURE) { signatureValid = TRUE; checksum = CalculateChecksum(gSaveDataBufferPtr->data, locations[gSaveDataBufferPtr->id].size); if (gSaveDataBufferPtr->checksum == checksum) { slot1saveCounter = gSaveDataBufferPtr->counter; validSectors |= 1 << gSaveDataBufferPtr->id; } } } if (signatureValid) { if (validSectors == ALL_SECTORS) slot1Status = SAVE_STATUS_OK; else slot1Status = SAVE_STATUS_ERROR; } else slot1Status = SAVE_STATUS_EMPTY; // check save slot 2. validSectors = 0; signatureValid = FALSE; for (sector = 0; sector < NUM_SECTORS_PER_SLOT; sector++) { ReadFlashSector(NUM_SECTORS_PER_SLOT + sector, gSaveDataBufferPtr); if (gSaveDataBufferPtr->signature == SECTOR_SIGNATURE) { signatureValid = TRUE; checksum = CalculateChecksum(gSaveDataBufferPtr->data, locations[gSaveDataBufferPtr->id].size); if (gSaveDataBufferPtr->checksum == checksum) { slot2saveCounter = gSaveDataBufferPtr->counter; validSectors |= 1 << gSaveDataBufferPtr->id; } } } if (signatureValid) { if (validSectors == ALL_SECTORS) slot2Status = SAVE_STATUS_OK; else slot2Status = SAVE_STATUS_ERROR; } else slot2Status = SAVE_STATUS_EMPTY; if (slot1Status == SAVE_STATUS_OK && slot2Status == SAVE_STATUS_OK) { // Choose counter of the most recent save file if ((slot1saveCounter == -1 && slot2saveCounter == 0) || (slot1saveCounter == 0 && slot2saveCounter == -1)) { if ((unsigned)(slot1saveCounter + 1) < (unsigned)(slot2saveCounter + 1)) gSaveCounter = slot2saveCounter; else gSaveCounter = slot1saveCounter; } else { if (slot1saveCounter < slot2saveCounter) gSaveCounter = slot2saveCounter; else gSaveCounter = slot1saveCounter; } return SAVE_STATUS_OK; } if (slot1Status == SAVE_STATUS_OK) { gSaveCounter = slot1saveCounter; if (slot2Status == SAVE_STATUS_ERROR) return SAVE_STATUS_ERROR; else return SAVE_STATUS_OK; } if (slot2Status == SAVE_STATUS_OK) { gSaveCounter = slot2saveCounter; if (slot1Status == SAVE_STATUS_ERROR) return SAVE_STATUS_ERROR; else return SAVE_STATUS_OK; } if (slot1Status == SAVE_STATUS_EMPTY && slot2Status == SAVE_STATUS_EMPTY) { gSaveCounter = 0; gLastWrittenSector = 0; return SAVE_STATUS_EMPTY; } gSaveCounter = 0; gLastWrittenSector = 0; return SAVE_STATUS_INVALID; } static u8 TryLoadSaveSector(u8 sectorId, u8 *data, u16 size) { u32 i; struct SaveSector *sector = &gSaveDataBuffer; ReadFlashSector(sectorId, sector); if (sector->signature == SECTOR_SIGNATURE) { u16 checksum = CalculateChecksum(sector->data, size); if (sector->id == checksum) { for (i = 0; i < size; i++) data[i] = sector->data[i]; return SAVE_STATUS_OK; } else return SAVE_STATUS_INVALID; } else return SAVE_STATUS_EMPTY; } static u8 ReadFlashSector(u8 sectorId, struct SaveSector *sector) { ReadFlash(sectorId, 0, sector->data, SECTOR_SIZE); return 1; } static u16 CalculateChecksum(void *data, u16 size) { u32 i; u32 checksum = 0; for (i = 0; i < (size / 4); i++) { // checksum += *(u32 *)data++; // For compatibility with modern gcc, these statements were separated. checksum += *(u32 *)data; data += 4; } return ((checksum >> 16) + checksum); } static void UpdateSaveAddresses(void) { int i = 0; gRamSaveSectorLocations[i].data = (void *)(gSaveBlock2Ptr) + sSaveSlotLayout[i].offset; gRamSaveSectorLocations[i].size = sSaveSlotLayout[i].size; for (i = SECTOR_ID_SAVEBLOCK1_START; i <= SECTOR_ID_SAVEBLOCK1_END; i++) { gRamSaveSectorLocations[i].data = (void *)(gSaveBlock1Ptr) + sSaveSlotLayout[i].offset; gRamSaveSectorLocations[i].size = sSaveSlotLayout[i].size; } for (/*i = SECTOR_ID_PKMN_STORAGE_START*/; i <= SECTOR_ID_PKMN_STORAGE_END; i++) // do not initialize here to ensure matching { gRamSaveSectorLocations[i].data = (void *)(gPokemonStoragePtr) + sSaveSlotLayout[i].offset; gRamSaveSectorLocations[i].size = sSaveSlotLayout[i].size; } } u8 HandleSavingData(u8 saveType) { u32 i; u32 *backupPtr = gMain.vblankCounter1; u8 *tempAddr; gMain.vblankCounter1 = NULL; UpdateSaveAddresses(); switch (saveType) { case SAVE_HALL_OF_FAME_ERASE_BEFORE: // Unused for (i = SECTOR_ID_HOF_1; i < SECTORS_COUNT; i++) EraseFlashSector(i); // fallthrough case SAVE_HALL_OF_FAME: if (GetGameStat(GAME_STAT_ENTERED_HOF) < 999) IncrementGameStat(GAME_STAT_ENTERED_HOF); tempAddr = gDecompressionBuffer; HandleWriteSectorNBytes(SECTOR_ID_HOF_1, tempAddr, SECTOR_DATA_SIZE); HandleWriteSectorNBytes(SECTOR_ID_HOF_2, tempAddr + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE); // fallthrough case SAVE_NORMAL: default: SaveSerializedGame(); WriteSaveSectorOrSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations); break; case SAVE_LINK: SaveSerializedGame(); // only SaveBlock2 and SaveBlock1 (ignores storage in PC) for(i = SECTOR_ID_SAVEBLOCK2; i <= SECTOR_ID_SAVEBLOCK1_END; i++) WriteSaveSectorOrSlot(i, gRamSaveSectorLocations); break; case SAVE_EREADER: // unused SaveSerializedGame(); // only SaveBlock2 WriteSaveSectorOrSlot(SECTOR_ID_SAVEBLOCK2, gRamSaveSectorLocations); break; case SAVE_OVERWRITE_DIFFERENT_FILE: for (i = SECTOR_ID_HOF_1; i < SECTORS_COUNT; i++) EraseFlashSector(i); SaveSerializedGame(); WriteSaveSectorOrSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations); break; } gMain.vblankCounter1 = backupPtr; return 0; } u8 TrySavingData(u8 saveType) { if (gFlashMemoryPresent != TRUE) { gSaveAttemptStatus = SAVE_STATUS_ERROR; return SAVE_STATUS_ERROR; } HandleSavingData(saveType); if (!gDamagedSaveSectors) { gSaveAttemptStatus = SAVE_STATUS_OK; return SAVE_STATUS_OK; } else { DoSaveFailedScreen(saveType); gSaveAttemptStatus = SAVE_STATUS_ERROR; return SAVE_STATUS_ERROR; } } bool8 LinkFullSave_Init(void) { if (gFlashMemoryPresent != TRUE) return TRUE; UpdateSaveAddresses(); SaveSerializedGame(); RestoreSaveBackupVarsAndIncrement(gRamSaveSectorLocations); return FALSE; } bool8 LinkFullSave_WriteSector(void) { u8 status = HandleWriteIncrementalSector(NUM_SECTORS_PER_SLOT, gRamSaveSectorLocations); if (gDamagedSaveSectors) DoSaveFailedScreen(SAVE_NORMAL); if (status == SAVE_STATUS_ERROR) return TRUE; else return FALSE; } bool8 LinkFullSave_ReplaceLastSector(void) { HandleReplaceSectorAndVerify(NUM_SECTORS_PER_SLOT, gRamSaveSectorLocations); if (gDamagedSaveSectors) DoSaveFailedScreen(SAVE_NORMAL); return FALSE; } bool8 LinkFullSave_SetLastSectorSignature(void) { CopySectorSignatureByte(NUM_SECTORS_PER_SLOT, gRamSaveSectorLocations); if (gDamagedSaveSectors) DoSaveFailedScreen(SAVE_NORMAL); return FALSE; } bool8 WriteSaveBlock2(void) { if (gFlashMemoryPresent != TRUE) return TRUE; UpdateSaveAddresses(); SaveSerializedGame(); RestoreSaveBackupVars(gRamSaveSectorLocations); // Because RestoreSaveBackupVars is called immediately prior, // gIncrementalSectorId will always be 0 (SECTOR_ID_SAVEBLOCK2) at this point, // so this function only saves the first sector (SECTOR_ID_SAVEBLOCK2) HandleReplaceSectorAndVerify(gIncrementalSectorId + 1, gRamSaveSectorLocations); return FALSE; } // Used in conjunction with WriteSaveBlock2 to write both for certain link saves. // This is called repeatedly in a task, writing one sector of SaveBlock1 each time it is called. // Returns TRUE when all sectors of SaveBlock1 have been written. bool8 WriteSaveBlock1Sector(void) { u8 finished = FALSE; u16 sectorId = ++gIncrementalSectorId; if (sectorId <= SECTOR_ID_SAVEBLOCK1_END) { HandleReplaceSectorAndVerify(gIncrementalSectorId + 1, gRamSaveSectorLocations); WriteSectorSignatureByte(sectorId, gRamSaveSectorLocations); } else { WriteSectorSignatureByte(sectorId, gRamSaveSectorLocations); finished = TRUE; } if (gDamagedSaveSectors) DoSaveFailedScreen(SAVE_LINK); return finished; } u8 LoadGameSave(u8 saveType) { u8 result; if (gFlashMemoryPresent != TRUE) { gSaveFileStatus = SAVE_STATUS_NO_FLASH; return SAVE_STATUS_ERROR; } UpdateSaveAddresses(); switch (saveType) { case SAVE_NORMAL: default: result = TryLoadSaveSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations); LoadSerializedGame(); gSaveFileStatus = result; gGameContinueCallback = NULL; break; case SAVE_HALL_OF_FAME: result = TryLoadSaveSector(SECTOR_ID_HOF_1, gDecompressionBuffer, SECTOR_DATA_SIZE); if (result == SAVE_STATUS_OK) result = TryLoadSaveSector(SECTOR_ID_HOF_2, gDecompressionBuffer + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE); break; } return result; } u32 TryReadSpecialSaveSector(u8 sectorId, u8 *dst) { s32 i; s32 size; u8 *savData; if (sectorId != SECTOR_ID_TRAINER_TOWER_1 && sectorId != SECTOR_ID_TRAINER_TOWER_2) return SAVE_STATUS_ERROR; ReadFlash(sectorId, 0, (u8 *)&gSaveDataBuffer, SECTOR_SIZE); if (*(u32 *)(&gSaveDataBuffer.data[0]) != SPECIAL_SECTOR_SENTINEL) return SAVE_STATUS_ERROR; // copies whole save sector except the counter field i = 0; size = SECTOR_COUNTER_OFFSET - 1; savData = &gSaveDataBuffer.data[4]; // to skip past SPECIAL_SECTOR_SENTINEL for (; i <= size; i++) dst[i] = savData[i]; return SAVE_STATUS_OK; } u32 TryWriteSpecialSaveSector(u8 sector, u8 *src) { s32 i; s32 size; u8 *savData; void *savDataBuffer; if (sector != SECTOR_ID_TRAINER_TOWER_1 && sector != SECTOR_ID_TRAINER_TOWER_2) return SAVE_STATUS_ERROR; savDataBuffer = &gSaveDataBuffer; *(u32 *)(savDataBuffer) = SPECIAL_SECTOR_SENTINEL; // copies whole save sector except the counter field i = 0; size = SECTOR_COUNTER_OFFSET - 1; savData = &gSaveDataBuffer.data[4]; // to skip past SPECIAL_SECTOR_SENTINEL for (; i <= size; i++) savData[i] = src[i]; if (ProgramFlashSectorAndVerify(sector, savDataBuffer) != 0) return SAVE_STATUS_ERROR; return SAVE_STATUS_OK; } void Task_LinkFullSave(u8 taskId) { switch (gTasks[taskId].data[0]) { case 0: gSoftResetDisabled = TRUE; gTasks[taskId].data[0] = 1; break; case 1: SetLinkStandbyCallback(); gTasks[taskId].data[0] = 2; break; case 2: if (IsLinkTaskFinished()) { SaveMapView(); gTasks[taskId].data[0] = 3; } break; case 3: SetContinueGameWarpStatusToDynamicWarp(); LinkFullSave_Init(); gTasks[taskId].data[0] = 4; break; case 4: if (++gTasks[taskId].data[1] == 5) { gTasks[taskId].data[1] = 0; gTasks[taskId].data[0] = 5; } break; case 5: if (LinkFullSave_WriteSector()) gTasks[taskId].data[0] = 6; else gTasks[taskId].data[0] = 4; break; case 6: LinkFullSave_ReplaceLastSector(); gTasks[taskId].data[0] = 7; break; case 7: ClearContinueGameWarpStatus2(); SetLinkStandbyCallback(); gTasks[taskId].data[0] = 8; break; case 8: if (IsLinkTaskFinished()) { LinkFullSave_SetLastSectorSignature(); gTasks[taskId].data[0] = 9; } break; case 9: SetLinkStandbyCallback(); gTasks[taskId].data[0] = 10; break; case 10: if (IsLinkTaskFinished()) gTasks[taskId].data[0]++; break; case 11: if (++gTasks[taskId].data[1] > 5) { gSoftResetDisabled = FALSE; DestroyTask(taskId); } break; } } ================================================ FILE: src/save_failed_screen.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "gba/flash_internal.h" #include "help_system.h" #include "m4a.h" #include "save.h" #include "strings.h" bool32 sIsInSaveFailedScreen; static EWRAM_DATA u16 sSaveType = SAVE_NORMAL; static EWRAM_DATA u16 sUnused = 0; static EWRAM_DATA u8 sSaveFailedScreenState = 0; static void BlankPalettes(void); static void UpdateMapBufferWithText(void); static void ClearMapBuffer(void); static void PrintTextOnSaveFailedScreen(const u8 *a0); static bool32 TryWipeDamagedSectors(void); static bool32 WipeDamagedSectors(u32 damagedSectors); static const u16 sSaveFailedScreenPals[] = INCBIN_U16("graphics/interface/save_failed_screen.gbapal"); void SetNotInSaveFailedScreen(void) { sIsInSaveFailedScreen = FALSE; } void DoSaveFailedScreen(u8 saveType) { sSaveType = saveType; sIsInSaveFailedScreen = TRUE; } bool32 RunSaveFailedScreen(void) { switch (sSaveFailedScreenState) { case 0: if (!sIsInSaveFailedScreen) return FALSE; m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 128); SaveCallbacks(); sSaveFailedScreenState = 1; break; case 1: SaveMapTiles(); SaveMapGPURegs(); SaveMapTextColors(); BlankPalettes(); SetGpuReg(REG_OFFSET_DISPCNT, 0); sSaveFailedScreenState = 2; break; case 2: RequestDma3Fill(0, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); RequestDma3Copy(sSaveFailedScreenPals, (void *)PLTT, 0x20, DMA3_16BIT); sSaveFailedScreenState = 3; break; case 3: ClearMapBuffer(); PrintTextOnSaveFailedScreen(gText_SaveFailedCheckingBackup); UpdateMapBufferWithText(); sSaveFailedScreenState = 4; break; case 4: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(31)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON); sSaveFailedScreenState = 5; break; case 5: if (TryWipeDamagedSectors() == TRUE) { gSaveAttemptStatus = SAVE_STATUS_OK; PrintTextOnSaveFailedScreen(gText_SaveCompletePressA); } else { gSaveAttemptStatus = SAVE_STATUS_ERROR; PrintTextOnSaveFailedScreen(gText_BackupMemoryDamaged); } sSaveFailedScreenState = 6; break; case 6: if (JOY_NEW(A_BUTTON)) sSaveFailedScreenState = 7; break; case 7: SetGpuReg(REG_OFFSET_DISPCNT, 0); RestoreMapTiles(); BlankPalettes(); sSaveFailedScreenState = 8; break; case 8: m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); RestoreMapTextColors(); RestoreGPURegs(); RestoreCallbacks(); sIsInSaveFailedScreen = FALSE; sSaveFailedScreenState = 0; break; } return TRUE; } static void BlankPalettes(void) { int i; for (i = 0; i < BG_PLTT_SIZE; i += sizeof(u16)) { *((u16 *)(BG_PLTT + i)) = RGB_BLACK; *((u16 *)(OBJ_PLTT + i)) = RGB_BLACK; } } static void RequestDmaCopyFromScreenBuffer(void) { RequestDma3Copy(gDecompressionBuffer + 0x3800, (void *)BG_SCREEN_ADDR(31), 0x500, DMA3_16BIT); } static void RequestDmaCopyFromCharBuffer(void) { RequestDma3Copy(gDecompressionBuffer + 0x020, (void *)BG_CHAR_ADDR(3) + 0x20, 0x2300, DMA3_16BIT); } static void FillBgMapBufferRect(u16 baseBlock, u8 left, u8 top, u8 width, u8 height, u16 blockOffset) { u16 i, j; for (i = top; i < top + height; i++) { for (j = left; j < left + width; j++) { *((u16 *)(gDecompressionBuffer + 0x3800 + 64 * i + 2 * j)) = baseBlock; baseBlock += blockOffset; } } RequestDmaCopyFromScreenBuffer(); } static void UpdateMapBufferWithText(void) { FillBgMapBufferRect(0x001, 1, 5, 28, 10, 0x001); } static void ClearMapBuffer(void) { FillBgMapBufferRect(0x000, 0, 0, 30, 20, 0x000); } static void PrintTextOnSaveFailedScreen(const u8 *str) { GenerateFontHalfRowLookupTable(TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); CpuFill16(PIXEL_FILL(1) | (PIXEL_FILL(1) << 8), gDecompressionBuffer + 0x20, 0x2300); HelpSystemRenderText(2, gDecompressionBuffer + 0x20, str, 2, 2, 28, 10); RequestDmaCopyFromCharBuffer(); } static bool32 TryWipeDamagedSectors(void) { int i = 0; for (i = 0; gDamagedSaveSectors != 0 && i < 3; i++) { if (WipeDamagedSectors(gDamagedSaveSectors)) return FALSE; HandleSavingData(sSaveType); } if (gDamagedSaveSectors != 0) return FALSE; return TRUE; } static bool16 VerifySectorWipe(u32 sector) { u16 sector0 = sector; u32 i; u32 *saveDataBuffer = (void *)&gSaveDataBuffer; ReadFlash(sector0, 0, saveDataBuffer, 0x1000); for (i = 0; i < 0x1000 / sizeof(u32); i++, saveDataBuffer++) { if (*saveDataBuffer != 0) return TRUE; } return FALSE; } static bool32 WipeSector(u32 sector) { bool32 result; u16 i, j; i = 0; while (i < 130) { for (j = 0; j < 0x1000; j++) { ProgramFlashByte(sector, j, 0); } result = VerifySectorWipe(sector); i++; if (!result) break; } return result; } static bool32 WipeDamagedSectors(u32 damagedSectors) { int i; for (i = 0; i < 32; i++) { if (damagedSectors & (1 << i)) { if (!WipeSector(i)) { damagedSectors &= ~(1 << i); } } } if (damagedSectors == 0) return FALSE; else return TRUE; } ================================================ FILE: src/save_location.c ================================================ #include "event_data.h" #include "global.h" #include "save_location.h" #include "constants/maps.h" #include "constants/vars.h" static bool32 IsCurMapInLocationList(const u16 *list) { s32 i; u16 locSum = (gSaveBlock1Ptr->location.mapGroup << 8) + (gSaveBlock1Ptr->location.mapNum); for (i = 0; list[i] != MAP_UNDEFINED; i++) { if (list[i] == locSum) return TRUE; } return FALSE; } static const u16 sSaveLocationPokeCenterList[] = { MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F, MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F, MAP_PEWTER_CITY_POKEMON_CENTER_1F, MAP_PEWTER_CITY_POKEMON_CENTER_2F, MAP_CERULEAN_CITY_POKEMON_CENTER_1F, MAP_CERULEAN_CITY_POKEMON_CENTER_2F, MAP_LAVENDER_TOWN_POKEMON_CENTER_1F, MAP_LAVENDER_TOWN_POKEMON_CENTER_2F, MAP_VERMILION_CITY_POKEMON_CENTER_1F, MAP_VERMILION_CITY_POKEMON_CENTER_2F, MAP_CELADON_CITY_POKEMON_CENTER_1F, MAP_CELADON_CITY_POKEMON_CENTER_2F, MAP_FUCHSIA_CITY_POKEMON_CENTER_1F, MAP_FUCHSIA_CITY_POKEMON_CENTER_2F, MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F, MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F, MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F, MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F, MAP_SAFFRON_CITY_POKEMON_CENTER_1F, MAP_SAFFRON_CITY_POKEMON_CENTER_2F, MAP_ROUTE4_POKEMON_CENTER_1F, MAP_ROUTE4_POKEMON_CENTER_2F, MAP_ROUTE10_POKEMON_CENTER_1F, MAP_ROUTE10_POKEMON_CENTER_2F, MAP_ONE_ISLAND_POKEMON_CENTER_1F, MAP_ONE_ISLAND_POKEMON_CENTER_2F, MAP_TWO_ISLAND_POKEMON_CENTER_1F, MAP_TWO_ISLAND_POKEMON_CENTER_2F, MAP_THREE_ISLAND_POKEMON_CENTER_1F, MAP_THREE_ISLAND_POKEMON_CENTER_2F, MAP_FOUR_ISLAND_POKEMON_CENTER_1F, MAP_FOUR_ISLAND_POKEMON_CENTER_2F, MAP_FIVE_ISLAND_POKEMON_CENTER_1F, MAP_FIVE_ISLAND_POKEMON_CENTER_2F, MAP_SEVEN_ISLAND_POKEMON_CENTER_1F, MAP_SEVEN_ISLAND_POKEMON_CENTER_2F, MAP_SIX_ISLAND_POKEMON_CENTER_1F, MAP_SIX_ISLAND_POKEMON_CENTER_2F, MAP_BATTLE_COLOSSEUM_2P, MAP_TRADE_CENTER, MAP_BATTLE_COLOSSEUM_4P, MAP_UNION_ROOM, MAP_UNDEFINED, }; bool32 IsCurMapPokeCenter(void) { return IsCurMapInLocationList(sSaveLocationPokeCenterList); } static const u16 sSaveLocationReloadLocList[] = { MAP_UNDEFINED }; static bool32 IsCurMapReloadLocation(void) { return IsCurMapInLocationList(sSaveLocationReloadLocList); } // Nulled out list. Unknown what this would have been. static const u16 sEmptyMapList[] = { MAP_UNDEFINED }; static bool32 IsCurMapInEmptyList(void) { return IsCurMapInLocationList(sEmptyMapList); } static void TrySetPokeCenterWarpStatus(void) { if (IsCurMapPokeCenter() == FALSE) gSaveBlock2Ptr->specialSaveWarpFlags &= ~(POKECENTER_SAVEWARP); else gSaveBlock2Ptr->specialSaveWarpFlags |= POKECENTER_SAVEWARP; } static void TrySetReloadWarpStatus(void) { if (!IsCurMapReloadLocation()) gSaveBlock2Ptr->specialSaveWarpFlags &= ~(LOBBY_SAVEWARP); else gSaveBlock2Ptr->specialSaveWarpFlags |= LOBBY_SAVEWARP; } // Unknown save warp flag. Never set because map list is empty. static void TrySetUnknownWarpStatus(void) { if (!IsCurMapInEmptyList()) gSaveBlock2Ptr->specialSaveWarpFlags &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3); else gSaveBlock2Ptr->specialSaveWarpFlags |= UNK_SPECIAL_SAVE_WARP_FLAG_3; } void TrySetMapSaveWarpStatus(void) { TrySetPokeCenterWarpStatus(); TrySetReloadWarpStatus(); TrySetUnknownWarpStatus(); } void SetUnlockedPokedexFlags(void) { // National Dex enable stuff minus the actual flag u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); gSaveBlock2Ptr->pokedex.nationalMagic = 0xB9; *nationalDexVar = 0x6258; gSaveBlock2Ptr->gcnLinkFlags |= (1 << 0); gSaveBlock2Ptr->gcnLinkFlags |= (1 << 4); gSaveBlock2Ptr->gcnLinkFlags |= (1 << 5); //Allows for trading with all SetPostgameFlags(); } void SetPostgameFlags(void) { gSaveBlock2Ptr->specialSaveWarpFlags |= CHAMPION_SAVEWARP; gSaveBlock2Ptr->gcnLinkFlags |= (1 << 1); gSaveBlock2Ptr->gcnLinkFlags |= (1 << 2); gSaveBlock2Ptr->gcnLinkFlags |= (1 << 3); gSaveBlock2Ptr->gcnLinkFlags |= (1 << 15); } ================================================ FILE: src/save_menu_util.c ================================================ #include "global.h" #include "gflib.h" #include "event_data.h" #include "pokedex.h" #include "region_map.h" #include "save_menu_util.h" #include "strings.h" #include "constants/flags.h" #include "constants/maps.h" #include "constants/map_groups.h" #include "constants/map_types.h" #include "constants/region_map_sections.h" void SaveStatToString(u8 gameStatId, u8 *dest0, u8 color) { int nBadges; int flagId; u8 *dest = dest0; *dest++ = EXT_CTRL_CODE_BEGIN; *dest++ = EXT_CTRL_CODE_COLOR; *dest++ = color; *dest++ = EXT_CTRL_CODE_BEGIN; *dest++ = EXT_CTRL_CODE_SHADOW; *dest++ = color + 1; switch (gameStatId) { case SAVE_STAT_NAME: dest = StringCopy(dest, gSaveBlock2Ptr->playerName); break; case SAVE_STAT_POKEDEX: if (IsNationalPokedexEnabled()) dest = ConvertIntToDecimalStringN(dest, GetNationalPokedexCount(1), STR_CONV_MODE_LEFT_ALIGN, 3); else dest = ConvertIntToDecimalStringN(dest, GetKantoPokedexCount(1), STR_CONV_MODE_LEFT_ALIGN, 3); break; case SAVE_STAT_TIME: dest = ConvertIntToDecimalStringN(dest, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3); *dest++ = CHAR_COLON; dest = ConvertIntToDecimalStringN(dest, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); break; case SAVE_STAT_TIME_HR_RT_ALIGN: dest = ConvertIntToDecimalStringN(dest, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_RIGHT_ALIGN, 3); *dest++ = CHAR_COLON; dest = ConvertIntToDecimalStringN(dest, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); break; case SAVE_STAT_LOCATION: GetMapNameGeneric(dest, gMapHeader.regionMapSectionId); if(gMapHeader.mapType == MAP_TYPE_UNDERWATER) { GetMapNameGeneric(dest, MAPSEC_UNDERWATER_124); } else if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(RS_BATTLE_TOWER) && (gSaveBlock1Ptr->location.mapNum >= MAP_NUM(RS_BATTLE_TOWER) && gSaveBlock1Ptr->location.mapNum <= MAP_NUM(RS_BATTLE_TOWER_BATTLE_ROOM))) //overwrite Battle Frontier name { dest = StringCopy(dest, gText_BattleTower); } break; case SAVE_STAT_BADGES: for (flagId = FLAG_BADGE01_GET, nBadges = 0; flagId < FLAG_BADGE01_GET + 8; flagId++) { if (FlagGet(flagId)) nBadges++; } *dest++ = nBadges + CHAR_0; *dest++ = 10; // 'こ' *dest++ = EOS; break; } } ================================================ FILE: src/scanline_effect.c ================================================ #include "global.h" #include "task.h" #include "trig.h" #include "scanline_effect.h" extern u16 gBattle_BG0_X; extern u16 gBattle_BG0_Y; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG3_X; extern u16 gBattle_BG3_Y; static void CopyValue16Bit(void); static void CopyValue32Bit(void); // EWRAM vars // Per-scanline register values. // This is double buffered so that it can be safely written to at any time // without overwriting the buffer that the DMA is currently reading EWRAM_DATA u16 gScanlineEffectRegBuffers[2][0x3C0] = {0}; EWRAM_DATA struct ScanlineEffect gScanlineEffect = {0}; EWRAM_DATA static bool8 sShouldStopWaveTask = FALSE; void ScanlineEffect_Stop(void) { gScanlineEffect.state = 0; DmaStop(0); if (gScanlineEffect.waveTaskId != 0xFF) { DestroyTask(gScanlineEffect.waveTaskId); gScanlineEffect.waveTaskId = 0xFF; } } void ScanlineEffect_Clear(void) { CpuFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers)); gScanlineEffect.dmaSrcBuffers[0] = NULL; gScanlineEffect.dmaSrcBuffers[1] = NULL; gScanlineEffect.dmaDest = NULL; gScanlineEffect.dmaControl = 0; gScanlineEffect.srcBuffer = 0; gScanlineEffect.state = 0; gScanlineEffect.unused16 = 0; gScanlineEffect.unused17 = 0; gScanlineEffect.waveTaskId = 0xFF; } void ScanlineEffect_SetParams(struct ScanlineEffectParams params) { if (params.dmaControl == SCANLINE_EFFECT_DMACNT_16BIT) // 16-bit { // Set the DMA src to the value for the second scanline because the // first DMA transfer occurs in HBlank *after* the first scanline is drawn gScanlineEffect.dmaSrcBuffers[0] = (u16 *)gScanlineEffectRegBuffers[0] + 1; gScanlineEffect.dmaSrcBuffers[1] = (u16 *)gScanlineEffectRegBuffers[1] + 1; gScanlineEffect.setFirstScanlineReg = CopyValue16Bit; } else // assume 32-bit { // Set the DMA src to the value for the second scanline because the // first DMA transfer occurs in HBlank *after* the first scanline is drawn gScanlineEffect.dmaSrcBuffers[0] = (u32 *)gScanlineEffectRegBuffers[0] + 1; gScanlineEffect.dmaSrcBuffers[1] = (u32 *)gScanlineEffectRegBuffers[1] + 1; gScanlineEffect.setFirstScanlineReg = CopyValue32Bit; } gScanlineEffect.dmaControl = params.dmaControl; gScanlineEffect.dmaDest = params.dmaDest; gScanlineEffect.state = params.initState; gScanlineEffect.unused16 = params.unused9; gScanlineEffect.unused17 = params.unused9; } void ScanlineEffect_InitHBlankDmaTransfer(void) { if (gScanlineEffect.state == 0) { return; } else if (gScanlineEffect.state == 3) { gScanlineEffect.state = 0; DmaStop(0); sShouldStopWaveTask = TRUE; } else { DmaStop(0); // Set DMA to copy to dest register on each HBlank for the next frame. // The HBlank DMA transfers do not occurr during VBlank, so the transfer // will begin on the HBlank after the first scanline DmaSet(0, gScanlineEffect.dmaSrcBuffers[gScanlineEffect.srcBuffer], gScanlineEffect.dmaDest, gScanlineEffect.dmaControl); // Manually set the reg for the first scanline gScanlineEffect.setFirstScanlineReg(); // Swap current buffer gScanlineEffect.srcBuffer ^= 1; } } // These two functions are used to copy the register for the first scanline, // depending whether it is a 16-bit register or a 32-bit register. static void CopyValue16Bit(void) { u16 *dest = (u16 *)gScanlineEffect.dmaDest; u16 *src = (u16 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer]; *dest = *src; } static void CopyValue32Bit(void) { u32 *dest = (u32 *)gScanlineEffect.dmaDest; u32 *src = (u32 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer]; *dest = *src; } #define tStartLine data[0] #define tEndLine data[1] #define tWaveLength data[2] #define tSrcBufferOffset data[3] #define tFramesUntilMove data[4] #define tDelayInterval data[5] #define tRegOffset data[6] #define tApplyBattleBgOffsets data[7] static void TaskFunc_UpdateWavePerFrame(u8 taskId) { int value = 0; int i; int offset; if (sShouldStopWaveTask) { DestroyTask(taskId); gScanlineEffect.waveTaskId = 0xFF; } else { if (gTasks[taskId].tApplyBattleBgOffsets) { switch (gTasks[taskId].tRegOffset) { case SCANLINE_EFFECT_REG_BG0HOFS: value = gBattle_BG0_X; break; case SCANLINE_EFFECT_REG_BG0VOFS: value = gBattle_BG0_Y; break; case SCANLINE_EFFECT_REG_BG1HOFS: value = gBattle_BG1_X; break; case SCANLINE_EFFECT_REG_BG1VOFS: value = gBattle_BG1_Y; break; case SCANLINE_EFFECT_REG_BG2HOFS: value = gBattle_BG2_X; break; case SCANLINE_EFFECT_REG_BG2VOFS: value = gBattle_BG2_Y; break; case SCANLINE_EFFECT_REG_BG3HOFS: value = gBattle_BG3_X; break; case SCANLINE_EFFECT_REG_BG3VOFS: value = gBattle_BG3_Y; break; } } if (gTasks[taskId].tFramesUntilMove != 0) { gTasks[taskId].tFramesUntilMove--; offset = gTasks[taskId].tSrcBufferOffset + 320; for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++) { gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value; offset++; } } else { gTasks[taskId].tFramesUntilMove = gTasks[taskId].tDelayInterval; offset = gTasks[taskId].tSrcBufferOffset + 320; for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++) { gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value; offset++; } // increment src buffer offset gTasks[taskId].tSrcBufferOffset++; if (gTasks[taskId].tSrcBufferOffset == gTasks[taskId].tWaveLength) gTasks[taskId].tSrcBufferOffset = 0; } } } static void GenerateWave(u16 *buffer, u8 frequency, u8 amplitude, u8 unused) { u16 i = 0; u8 theta = 0; while (i < 256) { buffer[i] = (gSineTable[theta] * amplitude) / 256; theta += frequency; i++; } } // Initializes a background "wave" effect that affects scanlines startLine (inclusive) to endLine (exclusive). // 'frequency' and 'amplitude' control the frequency and amplitude of the wave. // 'delayInterval' controls how fast the wave travels up the screen. The wave will shift upwards one scanline every 'delayInterval'+1 frames. // 'regOffset' is the offset of the video register to modify. u8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 applyBattleBgOffsets) { int i; int offset; struct ScanlineEffectParams params; u8 taskId; ScanlineEffect_Clear(); params.dmaDest = (void *)(REG_ADDR_BG0HOFS + regOffset); params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; params.initState = 1; params.unused9 = 0; ScanlineEffect_SetParams(params); taskId = CreateTask(TaskFunc_UpdateWavePerFrame, 0); gTasks[taskId].tStartLine = startLine; gTasks[taskId].tEndLine = endLine; gTasks[taskId].tWaveLength = 256 / frequency; gTasks[taskId].tSrcBufferOffset = 0; gTasks[taskId].tFramesUntilMove = delayInterval; gTasks[taskId].tDelayInterval = delayInterval; gTasks[taskId].tRegOffset = regOffset; gTasks[taskId].tApplyBattleBgOffsets = applyBattleBgOffsets; gScanlineEffect.waveTaskId = taskId; sShouldStopWaveTask = FALSE; GenerateWave(&gScanlineEffectRegBuffers[0][320], frequency, amplitude, endLine - startLine); offset = 320; for (i = startLine; i < endLine; i++) { gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[0][offset]; gScanlineEffectRegBuffers[1][i] = gScanlineEffectRegBuffers[0][offset]; offset++; } return taskId; } ================================================ FILE: src/scrcmd.c ================================================ #include "global.h" #include "gflib.h" #include "script.h" #include "mystery_event_script.h" #include "event_data.h" #include "event_object_movement.h" #include "random.h" #include "item.h" #include "overworld.h" #include "field_screen_effect.h" #include "quest_log.h" #include "map_preview_screen.h" #include "fieldmap.h" #include "field_weather.h" #include "field_tasks.h" #include "field_fadetransition.h" #include "field_player_avatar.h" #include "script_movement.h" #include "event_object_movement.h" #include "event_object_lock.h" #include "field_message_box.h" #include "new_menu_helpers.h" #include "script_menu.h" #include "data.h" #include "field_specials.h" #include "constants/items.h" #include "script_pokemon_util.h" #include "palette.h" #include "pokemon_storage_system.h" #include "party_menu.h" #include "money.h" #include "coins.h" #include "battle_setup.h" #include "shop.h" #include "slot_machine.h" #include "field_effect.h" #include "fieldmap.h" #include "field_door.h" #include "constants/event_objects.h" #include "constants/maps.h" #include "constants/sound.h" extern u16 (*const gSpecials[])(void); extern u16 (*const gSpecialsEnd[])(void); extern const u8 *const gStdScripts[]; extern const u8 *const gStdScriptsEnd[]; static bool8 ScriptContext_NextCommandEndsScript(struct ScriptContext * ctx); static u8 ScriptContext_GetQuestLogInput(struct ScriptContext * ctx); static EWRAM_DATA ptrdiff_t sAddressOffset = 0; // For relative addressing in vgoto etc., used by saved scripts (e.g. Mystery Event) static EWRAM_DATA u8 sQuestLogWaitButtonPressTimer = 0; static EWRAM_DATA u16 sPauseCounter = 0; static EWRAM_DATA u16 sMovingNpcId = 0; static EWRAM_DATA u16 sMovingNpcMapGroup = 0; static EWRAM_DATA u16 sMovingNpcMapNum = 0; static EWRAM_DATA u16 sFieldEffectScriptId = 0; struct ScriptContext * sQuestLogScriptContextPtr; u8 gSelectedObjectEvent; // This is defined in here so the optimizer can't see its value when compiling // script.c. void *const gNullScriptPtr = NULL; static const u8 sScriptConditionTable[6][3] = { // < = > 1, 0, 0, // < 0, 1, 0, // = 0, 0, 1, // > 1, 1, 0, // <= 0, 1, 1, // >= 1, 0, 1, // != }; bool8 ScrCmd_nop(struct ScriptContext * ctx) { return FALSE; } bool8 ScrCmd_nop1(struct ScriptContext * ctx) { return FALSE; } bool8 ScrCmd_end(struct ScriptContext * ctx) { StopScript(ctx); return FALSE; } bool8 ScrCmd_gotonative(struct ScriptContext * ctx) { bool8 (*func)(void) = (bool8 (*)(void))ScriptReadWord(ctx); SetupNativeScript(ctx, func); return TRUE; } bool8 ScrCmd_special(struct ScriptContext * ctx) { u16 (*const *specialPtr)(void) = &gSpecials[ScriptReadHalfword(ctx)]; if (specialPtr < gSpecialsEnd) (*specialPtr)(); else AGB_ASSERT_EX(0, ABSPATH("scrcmd.c"), 241); return FALSE; } bool8 ScrCmd_specialvar(struct ScriptContext * ctx) { u16 * varPtr = GetVarPointer(ScriptReadHalfword(ctx)); u16 (*const *specialPtr)(void) = &gSpecials[ScriptReadHalfword(ctx)]; if (specialPtr < gSpecialsEnd) *varPtr = (*specialPtr)(); else AGB_ASSERT_EX(0, ABSPATH("scrcmd.c"), 263); return FALSE; } bool8 ScrCmd_callnative(struct ScriptContext * ctx) { void (*func )(void) = ((void (*)(void))ScriptReadWord(ctx)); func(); return FALSE; } bool8 ScrCmd_waitstate(struct ScriptContext * ctx) { ScriptContext_Stop(); return TRUE; } bool8 ScrCmd_goto(struct ScriptContext * ctx) { const u8 * scrptr = (const u8 *)ScriptReadWord(ctx); ScriptJump(ctx, scrptr); return FALSE; } bool8 ScrCmd_return(struct ScriptContext * ctx) { ScriptReturn(ctx); return FALSE; } bool8 ScrCmd_call(struct ScriptContext * ctx) { const u8 * scrptr = (const u8 *)ScriptReadWord(ctx); ScriptCall(ctx, scrptr); return FALSE; } bool8 ScrCmd_goto_if(struct ScriptContext * ctx) { u8 condition = ScriptReadByte(ctx); const u8 * scrptr = (const u8 *)ScriptReadWord(ctx); if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptJump(ctx, scrptr); return FALSE; } bool8 ScrCmd_call_if(struct ScriptContext * ctx) { u8 condition = ScriptReadByte(ctx); const u8 * scrptr = (const u8 *)ScriptReadWord(ctx); if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptCall(ctx, scrptr); return FALSE; } bool8 ScrCmd_setvaddress(struct ScriptContext * ctx) { u32 addr1 = (u32)ctx->scriptPtr - 1; u32 addr2 = ScriptReadWord(ctx); sAddressOffset = addr2 - addr1; return FALSE; } bool8 ScrCmd_vgoto(struct ScriptContext * ctx) { const u8 * scrptr = (const u8 *)ScriptReadWord(ctx); ScriptJump(ctx, scrptr - sAddressOffset); return FALSE; } bool8 ScrCmd_vcall(struct ScriptContext * ctx) { const u8 * scrptr = (const u8 *)ScriptReadWord(ctx); ScriptCall(ctx, scrptr - sAddressOffset); return FALSE; } bool8 ScrCmd_vgoto_if(struct ScriptContext * ctx) { u8 condition = ScriptReadByte(ctx); const u8 * scrptr = (const u8 *)ScriptReadWord(ctx) - sAddressOffset; if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptJump(ctx, scrptr); return FALSE; } bool8 ScrCmd_vcall_if(struct ScriptContext * ctx) { u8 condition = ScriptReadByte(ctx); const u8 * scrptr = (const u8 *)ScriptReadWord(ctx) - sAddressOffset; if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptCall(ctx, scrptr); return FALSE; } bool8 ScrCmd_gotostd(struct ScriptContext * ctx) { u8 stdIdx = ScriptReadByte(ctx); const u8 *const * script = &gStdScripts[stdIdx]; if (script < gStdScriptsEnd) ScriptJump(ctx, *script); return FALSE; } bool8 ScrCmd_callstd(struct ScriptContext * ctx) { u8 stdIdx = ScriptReadByte(ctx); const u8 *const * script = &gStdScripts[stdIdx]; if (script < gStdScriptsEnd) ScriptCall(ctx, *script); return FALSE; } bool8 ScrCmd_gotostd_if(struct ScriptContext * ctx) { u8 condition = ScriptReadByte(ctx); u8 stdIdx = ScriptReadByte(ctx); if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) { const u8 *const * script = gStdScripts + stdIdx; if (script < gStdScriptsEnd) ScriptJump(ctx, *script); } return FALSE; } bool8 ScrCmd_callstd_if(struct ScriptContext * ctx) { u8 condition = ScriptReadByte(ctx); u8 stdIdx = ScriptReadByte(ctx); if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) { const u8 *const * script = gStdScripts + stdIdx; if (script < gStdScriptsEnd) ScriptCall(ctx, *script); } return FALSE; } bool8 ScrCmd_returnram(struct ScriptContext * ctx) { ScriptJump(ctx, gRamScriptRetAddr); return FALSE; } bool8 ScrCmd_endram(struct ScriptContext * ctx) { ClearRamScript(); StopScript(ctx); return TRUE; } bool8 ScrCmd_setmysteryeventstatus(struct ScriptContext * ctx) { SetMysteryEventScriptStatus(ScriptReadByte(ctx)); return FALSE; } bool8 ScrCmd_trywondercardscript(struct ScriptContext * ctx) { const u8 * script = GetSavedRamScriptIfValid(); if (script != NULL) { gRamScriptRetAddr = ctx->scriptPtr; ScriptJump(ctx, script); } return FALSE; } bool8 ScrCmd_loadword(struct ScriptContext * ctx) { u8 index = ScriptReadByte(ctx); ctx->data[index] = ScriptReadWord(ctx); return FALSE; } bool8 ScrCmd_loadbytefromptr(struct ScriptContext * ctx) { u8 index = ScriptReadByte(ctx); ctx->data[index] = *(const u8 *)ScriptReadWord(ctx); return FALSE; } bool8 ScrCmd_setptr(struct ScriptContext * ctx) { u8 value = ScriptReadByte(ctx); *(u8 *)ScriptReadWord(ctx) = value; return FALSE; } bool8 ScrCmd_loadbyte(struct ScriptContext * ctx) { u8 index = ScriptReadByte(ctx); ctx->data[index] = ScriptReadByte(ctx); return FALSE; } bool8 ScrCmd_setptrbyte(struct ScriptContext * ctx) { u8 index = ScriptReadByte(ctx); *(u8 *)ScriptReadWord(ctx) = ctx->data[index]; return FALSE; } bool8 ScrCmd_copylocal(struct ScriptContext * ctx) { u8 destIndex = ScriptReadByte(ctx); u8 srcIndex = ScriptReadByte(ctx); ctx->data[destIndex] = ctx->data[srcIndex]; return FALSE; } bool8 ScrCmd_copybyte(struct ScriptContext * ctx) { u8 * dest = (u8 *)ScriptReadWord(ctx); *dest = *(const u8 *)ScriptReadWord(ctx); return FALSE; } bool8 ScrCmd_setvar(struct ScriptContext * ctx) { u16 * varPtr = GetVarPointer(ScriptReadHalfword(ctx)); *varPtr = ScriptReadHalfword(ctx); return FALSE; } bool8 ScrCmd_copyvar(struct ScriptContext * ctx) { u16 * destPtr = GetVarPointer(ScriptReadHalfword(ctx)); u16 * srcPtr = GetVarPointer(ScriptReadHalfword(ctx)); *destPtr = *srcPtr; return FALSE; } bool8 ScrCmd_setorcopyvar(struct ScriptContext * ctx) { u16 * destPtr = GetVarPointer(ScriptReadHalfword(ctx)); *destPtr = VarGet(ScriptReadHalfword(ctx)); return FALSE; } static u8 Compare(u16 a, u16 b) { if (a < b) return 0; else if (a == b) return 1; else return 2; } bool8 ScrCmd_compare_local_to_local(struct ScriptContext * ctx) { const u8 value1 = ctx->data[ScriptReadByte(ctx)]; const u8 value2 = ctx->data[ScriptReadByte(ctx)]; ctx->comparisonResult = Compare(value1, value2); return FALSE; } bool8 ScrCmd_compare_local_to_value(struct ScriptContext * ctx) { const u8 value1 = ctx->data[ScriptReadByte(ctx)]; const u8 value2 = ScriptReadByte(ctx); ctx->comparisonResult = Compare(value1, value2); return FALSE; } bool8 ScrCmd_compare_local_to_ptr(struct ScriptContext * ctx) { const u8 value1 = ctx->data[ScriptReadByte(ctx)]; const u8 value2 = *(const u8 *)ScriptReadWord(ctx); ctx->comparisonResult = Compare(value1, value2); return FALSE; } bool8 ScrCmd_compare_ptr_to_local(struct ScriptContext * ctx) { const u8 value1 = *(const u8 *)ScriptReadWord(ctx); const u8 value2 = ctx->data[ScriptReadByte(ctx)]; ctx->comparisonResult = Compare(value1, value2); return FALSE; } bool8 ScrCmd_compare_ptr_to_value(struct ScriptContext * ctx) { const u8 value1 = *(const u8 *)ScriptReadWord(ctx); const u8 value2 = ScriptReadByte(ctx); ctx->comparisonResult = Compare(value1, value2); return FALSE; } bool8 ScrCmd_compare_ptr_to_ptr(struct ScriptContext * ctx) { const u8 value1 = *(const u8 *)ScriptReadWord(ctx); const u8 value2 = *(const u8 *)ScriptReadWord(ctx); ctx->comparisonResult = Compare(value1, value2); return FALSE; } bool8 ScrCmd_compare_var_to_value(struct ScriptContext * ctx) { const u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); const u16 value2 = ScriptReadHalfword(ctx); ctx->comparisonResult = Compare(value1, value2); return FALSE; } bool8 ScrCmd_compare_var_to_var(struct ScriptContext * ctx) { const u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); const u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); ctx->comparisonResult = Compare(*ptr1, *ptr2); return FALSE; } // Note: addvar doesn't support adding from a variable in vanilla. bool8 ScrCmd_addvar(struct ScriptContext * ctx) { u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); *ptr += ScriptReadHalfword(ctx); return FALSE; } bool8 ScrCmd_subvar(struct ScriptContext * ctx) { u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); *ptr -= VarGet(ScriptReadHalfword(ctx)); return FALSE; } bool8 ScrCmd_random(struct ScriptContext * ctx) { u16 max = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = Random() % max; return FALSE; } bool8 ScrCmd_additem(struct ScriptContext * ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = AddBagItem(itemId, (u8)quantity); TrySetObtainedItemQuestLogEvent(itemId); return FALSE; } bool8 ScrCmd_removeitem(struct ScriptContext * ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = RemoveBagItem(itemId, (u8)quantity); return FALSE; } bool8 ScrCmd_checkitemspace(struct ScriptContext * ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = CheckBagHasSpace(itemId, (u8)quantity); return FALSE; } bool8 ScrCmd_checkitem(struct ScriptContext * ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = CheckBagHasItem(itemId, (u8)quantity); return FALSE; } bool8 ScrCmd_checkitemtype(struct ScriptContext * ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = GetPocketByItemId(itemId); return FALSE; } bool8 ScrCmd_addpcitem(struct ScriptContext * ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = AddPCItem(itemId, quantity); return FALSE; } bool8 ScrCmd_checkpcitem(struct ScriptContext * ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = CheckPCHasItem(itemId, quantity); return FALSE; } bool8 ScrCmd_adddecoration(struct ScriptContext * ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); // gSpecialVar_Result = DecorationAdd(decorId); return FALSE; } bool8 ScrCmd_removedecoration(struct ScriptContext * ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); // gSpecialVar_Result = DecorationRemove(decorId); return FALSE; } bool8 ScrCmd_checkdecorspace(struct ScriptContext * ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); // gSpecialVar_Result = DecorationCheckSpace(decorId); return FALSE; } bool8 ScrCmd_checkdecor(struct ScriptContext * ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); // gSpecialVar_Result = CheckHasDecoration(decorId); return FALSE; } bool8 ScrCmd_setflag(struct ScriptContext * ctx) { FlagSet(ScriptReadHalfword(ctx)); return FALSE; } bool8 ScrCmd_clearflag(struct ScriptContext * ctx) { FlagClear(ScriptReadHalfword(ctx)); return FALSE; } bool8 ScrCmd_checkflag(struct ScriptContext * ctx) { ctx->comparisonResult = FlagGet(ScriptReadHalfword(ctx)); return FALSE; } bool8 ScrCmd_incrementgamestat(struct ScriptContext * ctx) { IncrementGameStat(ScriptReadByte(ctx)); return FALSE; } bool8 ScrCmd_comparestat(struct ScriptContext * ctx) { u8 statIdx = ScriptReadByte(ctx); u32 value = ScriptReadWord(ctx); u32 statValue = GetGameStat(statIdx); if (statValue < value) ctx ->comparisonResult = 0; else if (statValue == value) ctx->comparisonResult = 1; else ctx->comparisonResult = 2; return FALSE; } bool8 ScrCmd_setworldmapflag(struct ScriptContext * ctx) { u16 value = ScriptReadHalfword(ctx); QuestLog_RecordEnteredMap(value); MapPreview_SetFlag(value); return FALSE; } bool8 ScrCmd_animateflash(struct ScriptContext * ctx) { AnimateFlash(ScriptReadByte(ctx)); ScriptContext_Stop(); return TRUE; } bool8 ScrCmd_setflashlevel(struct ScriptContext * ctx) { SetFlashLevel(VarGet(ScriptReadHalfword(ctx))); return FALSE; } static bool8 IsPaletteNotActive(void) { if (!gPaletteFade.active) return TRUE; else return FALSE; } bool8 ScrCmd_fadescreen(struct ScriptContext * ctx) { FadeScreen(ScriptReadByte(ctx), 0); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } bool8 ScrCmd_fadescreenspeed(struct ScriptContext * ctx) { u8 mode = ScriptReadByte(ctx); u8 speed = ScriptReadByte(ctx); FadeScreen(mode, speed); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } static bool8 RunPauseTimer(void) { if (--sPauseCounter == 0) return TRUE; else return FALSE; } bool8 ScrCmd_delay(struct ScriptContext * ctx) { sPauseCounter = ScriptReadHalfword(ctx); SetupNativeScript(ctx, RunPauseTimer); return TRUE; } bool8 ScrCmd_initclock(struct ScriptContext * ctx) { // u8 hour = VarGet(ScriptReadHalfword(ctx)); // u8 minute = VarGet(ScriptReadHalfword(ctx)); // // RtcInitLocalTimeOffset(hour, minute); return FALSE; } bool8 ScrCmd_dotimebasedevents(struct ScriptContext * ctx) { // DoTimeBasedEvents(); return FALSE; } bool8 ScrCmd_gettime(struct ScriptContext * ctx) { // RtcCalcLocalTime(); // gSpecialVar_0x8000 = gLocalTime.hours; // gSpecialVar_0x8001 = gLocalTime.minutes; // gSpecialVar_0x8002 = gLocalTime.seconds; gSpecialVar_0x8000 = 0; gSpecialVar_0x8001 = 0; gSpecialVar_0x8002 = 0; return FALSE; } bool8 ScrCmd_setweather(struct ScriptContext * ctx) { u16 weather = VarGet(ScriptReadHalfword(ctx)); SetSavedWeather(weather); return FALSE; } bool8 ScrCmd_resetweather(struct ScriptContext * ctx) { SetSavedWeatherFromCurrMapHeader(); return FALSE; } bool8 ScrCmd_doweather(struct ScriptContext * ctx) { DoCurrentWeather(); return FALSE; } bool8 ScrCmd_setstepcallback(struct ScriptContext * ctx) { ActivatePerStepCallback(ScriptReadByte(ctx)); return FALSE; } bool8 ScrCmd_setmaplayoutindex(struct ScriptContext * ctx) { u16 value = VarGet(ScriptReadHalfword(ctx)); SetCurrentMapLayout(value); return FALSE; } bool8 ScrCmd_warp(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoWarp(); ResetInitialPlayerAvatarState(); return TRUE; } bool8 ScrCmd_warpsilent(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoDiveWarp(); ResetInitialPlayerAvatarState(); return TRUE; } bool8 ScrCmd_warpdoor(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoDoorWarp(); ResetInitialPlayerAvatarState(); return TRUE; } bool8 ScrCmd_warphole(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u16 x; u16 y; PlayerGetDestCoords(&x, &y); if (mapGroup == MAP_GROUP(UNDEFINED) && mapNum == MAP_NUM(UNDEFINED)) SetWarpDestinationToFixedHoleWarp(x - MAP_OFFSET, y - MAP_OFFSET); else SetWarpDestination(mapGroup, mapNum, WARP_ID_NONE, x - MAP_OFFSET, y - MAP_OFFSET); DoFallWarp(); ResetInitialPlayerAvatarState(); return TRUE; } bool8 ScrCmd_warpteleport(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoTeleportWarp(); ResetInitialPlayerAvatarState(); return TRUE; } bool8 ScrCmd_warpspinenter(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetWarpDestination(mapGroup, mapNum, warpId, x, y); SavePlayerFacingDirectionForTeleport(GetPlayerFacingDirection()); DoTeleport2Warp(); ResetInitialPlayerAvatarState(); return TRUE; } bool8 ScrCmd_setwarp(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetWarpDestination(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_setdynamicwarp(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetDynamicWarpWithCoords(0, mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_setdivewarp(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetFixedDiveWarp(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_setholewarp(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetFixedHoleWarp(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_setescapewarp(struct ScriptContext * ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 warpId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetEscapeWarp(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_getplayerxy(struct ScriptContext * ctx) { u16 *pX = GetVarPointer(ScriptReadHalfword(ctx)); u16 *pY = GetVarPointer(ScriptReadHalfword(ctx)); *pX = gSaveBlock1Ptr->pos.x; *pY = gSaveBlock1Ptr->pos.y; return FALSE; } bool8 ScrCmd_getpartysize(struct ScriptContext * ctx) { gSpecialVar_Result = CalculatePlayerPartyCount(); return FALSE; } bool8 ScrCmd_playse(struct ScriptContext * ctx) { PlaySE(ScriptReadHalfword(ctx)); return FALSE; } static bool8 WaitForSoundEffectFinish(void) { if (!IsSEPlaying()) return TRUE; else return FALSE; } bool8 ScrCmd_waitse(struct ScriptContext * ctx) { SetupNativeScript(ctx, WaitForSoundEffectFinish); return TRUE; } bool8 ScrCmd_playfanfare(struct ScriptContext * ctx) { PlayFanfare(ScriptReadHalfword(ctx)); return FALSE; } static bool8 WaitForFanfareFinish(void) { return IsFanfareTaskInactive(); } bool8 ScrCmd_waitfanfare(struct ScriptContext * ctx) { SetupNativeScript(ctx, WaitForFanfareFinish); return TRUE; } bool8 ScrCmd_playbgm(struct ScriptContext * ctx) { u16 songId = ScriptReadHalfword(ctx); bool8 save = ScriptReadByte(ctx); if (QL_IS_PLAYBACK_STATE) return FALSE; if (save == TRUE) Overworld_SetSavedMusic(songId); PlayNewMapMusic(songId); return FALSE; } bool8 ScrCmd_savebgm(struct ScriptContext * ctx) { Overworld_SetSavedMusic(ScriptReadHalfword(ctx)); return FALSE; } bool8 ScrCmd_fadedefaultbgm(struct ScriptContext * ctx) { if (QL_IS_PLAYBACK_STATE) return FALSE; Overworld_ChangeMusicToDefault(); return FALSE; } bool8 ScrCmd_fadenewbgm(struct ScriptContext * ctx) { u16 music = ScriptReadHalfword(ctx); if (QL_IS_PLAYBACK_STATE) return FALSE; Overworld_ChangeMusicTo(music); return FALSE; } bool8 ScrCmd_fadeoutbgm(struct ScriptContext * ctx) { u8 speed = ScriptReadByte(ctx); if (QL_IS_PLAYBACK_STATE) return FALSE; if (speed != 0) FadeOutBGMTemporarily(4 * speed); else FadeOutBGMTemporarily(4); SetupNativeScript(ctx, IsBGMPausedOrStopped); return TRUE; } bool8 ScrCmd_fadeinbgm(struct ScriptContext * ctx) { u8 speed = ScriptReadByte(ctx); if (QL_IS_PLAYBACK_STATE) return FALSE; if (speed != 0) FadeInBGM(4 * speed); else FadeInBGM(4); return FALSE; } bool8 ScrCmd_applymovement(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); const void *movementScript = (const void *)ScriptReadWord(ctx); ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); sMovingNpcId = localId; return FALSE; } bool8 ScrCmd_applymovementat(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); const void *movementScript = (const void *)ScriptReadWord(ctx); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); ScriptMovement_StartObjectMovementScript(localId, mapNum, mapGroup, movementScript); sMovingNpcId = localId; return FALSE; } static bool8 WaitForMovementFinish(void) { return ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapNum, sMovingNpcMapGroup); } bool8 ScrCmd_waitmovement(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); if (localId != 0) sMovingNpcId = localId; sMovingNpcMapGroup = gSaveBlock1Ptr->location.mapGroup; sMovingNpcMapNum = gSaveBlock1Ptr->location.mapNum; SetupNativeScript(ctx, WaitForMovementFinish); return TRUE; } bool8 ScrCmd_waitmovementat(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapBank; u8 mapId; if (localId != 0) sMovingNpcId = localId; mapBank = ScriptReadByte(ctx); mapId = ScriptReadByte(ctx); sMovingNpcMapGroup = mapBank; sMovingNpcMapNum = mapId; SetupNativeScript(ctx, WaitForMovementFinish); return TRUE; } bool8 ScrCmd_removeobject(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); RemoveObjectEventByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); return FALSE; } bool8 ScrCmd_removeobjectat(struct ScriptContext * ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); RemoveObjectEventByLocalIdAndMap(objectId, mapNum, mapGroup); return FALSE; } bool8 ScrCmd_addobject(struct ScriptContext * ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); TrySpawnObjectEvent(objectId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); return FALSE; } bool8 ScrCmd_addobjectat(struct ScriptContext * ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); TrySpawnObjectEvent(objectId, mapNum, mapGroup); return FALSE; } bool8 ScrCmd_setobjectxy(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); TryMoveObjectEventToMapCoords(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, x, y); return FALSE; } bool8 ScrCmd_setobjectxyperm(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); SetObjEventTemplateCoords(localId, x, y); return FALSE; } bool8 ScrCmd_copyobjectxytoperm(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); TryOverrideObjectEventTemplateCoords(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); return FALSE; } bool8 ScrCmd_showobjectat(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); SetObjectInvisibility(localId, mapNum, mapGroup, FALSE); return FALSE; } bool8 ScrCmd_hideobjectat(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); SetObjectInvisibility(localId, mapNum, mapGroup, TRUE); return FALSE; } bool8 ScrCmd_setobjectsubpriority(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); u8 priority = ScriptReadByte(ctx); SetObjectSubpriority(localId, mapNum, mapGroup, priority + 83); return FALSE; } bool8 ScrCmd_resetobjectsubpriority(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); ResetObjectSubpriority(localId, mapNum, mapGroup); return FALSE; } bool8 ScrCmd_faceplayer(struct ScriptContext * ctx) { if (gObjectEvents[gSelectedObjectEvent].active) { ObjectEventFaceOppositeDirection(&gObjectEvents[gSelectedObjectEvent], GetPlayerFacingDirection()); } return FALSE; } bool8 ScrCmd_turnobject(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 direction = ScriptReadByte(ctx); ObjectEventTurnByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, direction); return FALSE; } bool8 ScrCmd_setobjectmovementtype(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 movementType = ScriptReadByte(ctx); SetObjEventTemplateMovementType(localId, movementType); return FALSE; } bool8 ScrCmd_createvobject(struct ScriptContext * ctx) { u8 graphicsId = ScriptReadByte(ctx); u8 virtualObjId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u32 y = VarGet(ScriptReadHalfword(ctx)); u8 elevation = ScriptReadByte(ctx); u8 direction = ScriptReadByte(ctx); CreateVirtualObject(graphicsId, virtualObjId, x, y, elevation, direction); return FALSE; } bool8 ScrCmd_turnvobject(struct ScriptContext * ctx) { u8 virtualObjId = ScriptReadByte(ctx); u8 direction = ScriptReadByte(ctx); TurnVirtualObject(virtualObjId, direction); return FALSE; } // lockall freezes all object events except the player immediately. // The player is frozen after waiting for their current movement to finish. bool8 ScrCmd_lockall(struct ScriptContext * ctx) { if (IsUpdateLinkStateCBActive()) { return FALSE; } else { FreezeObjects_WaitForPlayer(); SetupNativeScript(ctx, IsFreezePlayerFinished); return TRUE; } } bool8 ScrCmd_lock(struct ScriptContext * ctx) { if (IsUpdateLinkStateCBActive()) { return FALSE; } else { if (gObjectEvents[gSelectedObjectEvent].active) { FreezeObjects_WaitForPlayerAndSelected(); SetupNativeScript(ctx, IsFreezeSelectedObjectAndPlayerFinished); } else { FreezeObjects_WaitForPlayer(); SetupNativeScript(ctx, IsFreezePlayerFinished); } return TRUE; } } bool8 ScrCmd_releaseall(struct ScriptContext * ctx) { u8 playerObjectId; HideFieldMessageBox(); playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); return FALSE; } bool8 ScrCmd_release(struct ScriptContext * ctx) { u8 playerObjectId; HideFieldMessageBox(); if (gObjectEvents[gSelectedObjectEvent].active) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]); playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); return FALSE; } bool8 ScrCmd_textcolor(struct ScriptContext * ctx) { gSpecialVar_PrevTextColor = gSpecialVar_TextColor; gSpecialVar_TextColor = ScriptReadByte(ctx); return FALSE; } bool8 ScrCmd_message(struct ScriptContext * ctx) { const u8 *msg = (const u8 *)ScriptReadWord(ctx); if (msg == NULL) msg = (const u8 *)ctx->data[0]; ShowFieldMessage(msg); return FALSE; } bool8 ScrCmd_loadhelp(struct ScriptContext * ctx) { const u8 *msg = (const u8 *)ScriptReadWord(ctx); if (msg == NULL) msg = (const u8 *)ctx->data[0]; DrawHelpMessageWindowWithText(msg); CopyWindowToVram(GetStartMenuWindowId(), COPYWIN_MAP); return FALSE; } bool8 ScrCmd_unloadhelp(struct ScriptContext * ctx) { DestroyHelpMessageWindow_(); return FALSE; } bool8 ScrCmd_messageautoscroll(struct ScriptContext * ctx) { const u8 *msg = (const u8 *)ScriptReadWord(ctx); if (msg == NULL) msg = (const u8 *)ctx->data[0]; ShowFieldAutoScrollMessage(msg); return FALSE; } bool8 ScrCmd_waitmessage(struct ScriptContext * ctx) { SetupNativeScript(ctx, IsFieldMessageBoxHidden); return TRUE; } bool8 ScrCmd_closemessage(struct ScriptContext * ctx) { HideFieldMessageBox(); return FALSE; } static bool8 WaitForAorBPress(void) { if (JOY_NEW(A_BUTTON)) return TRUE; if (JOY_NEW(B_BUTTON)) return TRUE; if (ScriptContext_NextCommandEndsScript(sQuestLogScriptContextPtr) == TRUE) { u8 qlogInput = ScriptContext_GetQuestLogInput(sQuestLogScriptContextPtr); RegisterQuestLogInput(qlogInput); if (qlogInput != QL_INPUT_OFF) { if (gQuestLogState != QL_STATE_PLAYBACK) { ClearMsgBoxCancelableState(); if (qlogInput != QL_INPUT_A && qlogInput != QL_INPUT_B) SetQuestLogInputIsDpadFlag(); else { ClearQuestLogInput(); ClearQuestLogInputIsDpadFlag(); } return TRUE; } } } if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING || gQuestLogState == QL_STATE_PLAYBACK) { if (sQuestLogWaitButtonPressTimer == 120) return TRUE; else sQuestLogWaitButtonPressTimer++; } return FALSE; } static bool8 ScriptContext_NextCommandEndsScript(struct ScriptContext * ctx) { const u8 * script = ctx->scriptPtr; u8 nextCmd = *script; if (nextCmd == 3) // return { script = ctx->stack[ctx->stackDepth - 1]; nextCmd = *script; } if (nextCmd < 0x6B || nextCmd > 0x6C) // releaseall or release return FALSE; else return TRUE; } static u8 ScriptContext_GetQuestLogInput(struct ScriptContext * ctx) { if (JOY_HELD(DPAD_UP) && gSpecialVar_Facing != DIR_NORTH) return QL_INPUT_UP; if (JOY_HELD(DPAD_DOWN) && gSpecialVar_Facing != DIR_SOUTH) return QL_INPUT_DOWN; if (JOY_HELD(DPAD_LEFT) && gSpecialVar_Facing != DIR_WEST) return QL_INPUT_LEFT; if (JOY_HELD(DPAD_RIGHT) && gSpecialVar_Facing != DIR_EAST) return QL_INPUT_RIGHT; if (JOY_NEW(L_BUTTON)) return QL_INPUT_L; if (JOY_HELD(R_BUTTON)) return QL_INPUT_R; if (JOY_HELD(START_BUTTON)) return QL_INPUT_START; if (JOY_HELD(SELECT_BUTTON)) return QL_INPUT_SELECT; if (JOY_NEW(A_BUTTON)) return QL_INPUT_A; if (JOY_NEW(B_BUTTON)) return QL_INPUT_B; return QL_INPUT_OFF; } bool8 ScrCmd_waitbuttonpress(struct ScriptContext * ctx) { sQuestLogScriptContextPtr = ctx; if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING || gQuestLogState == QL_STATE_PLAYBACK) sQuestLogWaitButtonPressTimer = 0; SetupNativeScript(ctx, WaitForAorBPress); return TRUE; } bool8 ScrCmd_yesnobox(struct ScriptContext * ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); if (ScriptMenu_YesNo(left, top) == TRUE) { ScriptContext_Stop(); return TRUE; } else { return FALSE; } } bool8 ScrCmd_multichoice(struct ScriptContext * ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); bool8 ignoreBPress = ScriptReadByte(ctx); if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { ScriptContext_Stop(); return TRUE; } else { return FALSE; } } bool8 ScrCmd_multichoicedefault(struct ScriptContext * ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 defaultChoice = ScriptReadByte(ctx); bool8 ignoreBPress = ScriptReadByte(ctx); if (ScriptMenu_MultichoiceWithDefault(left, top, multichoiceId, ignoreBPress, defaultChoice) == TRUE) { ScriptContext_Stop(); return TRUE; } else { return FALSE; } } bool8 ScrCmd_drawbox(struct ScriptContext * ctx) { /*u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); MenuDrawTextWindow(left, top, right, bottom);*/ return FALSE; } bool8 ScrCmd_multichoicegrid(struct ScriptContext * ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 numColumns = ScriptReadByte(ctx); bool8 ignoreBPress = ScriptReadByte(ctx); if (ScriptMenu_MultichoiceGrid(left, top, multichoiceId, ignoreBPress, numColumns) == TRUE) { ScriptContext_Stop(); return TRUE; } else { return FALSE; } } bool8 ScrCmd_erasebox(struct ScriptContext * ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); // Menu_EraseWindowRect(left, top, right, bottom); return FALSE; } bool8 ScrCmd_drawboxtext(struct ScriptContext * ctx) { // u8 left = ScriptReadByte(ctx); // u8 top = ScriptReadByte(ctx); // u8 multichoiceId = ScriptReadByte(ctx); // bool8 ignoreBPress = ScriptReadByte(ctx); /*if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { ScriptContext_Stop(); return TRUE; }*/ return FALSE; } bool8 ScrCmd_showmonpic(struct ScriptContext * ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); ScriptMenu_ShowPokemonPic(species, x, y); PlayCry_Script(species, CRY_MODE_NORMAL); return FALSE; } bool8 ScrCmd_hidemonpic(struct ScriptContext * ctx) { // The hide function returns a pointer to a function // that returns true once the pic is hidden bool8 (*func)(void) = ScriptMenu_HidePokemonPic(); if (func == NULL) return FALSE; SetupNativeScript(ctx, func); return TRUE; } bool8 ScrCmd_showcontestpainting(struct ScriptContext * ctx) { u8 contestWinnerId = ScriptReadByte(ctx); /* // Artist's painting is temporary and already has its data loaded if (contestWinnerId != CONTEST_WINNER_ARTIST) SetContestWinnerForPainting(contestWinnerId); ShowContestPainting(); ScriptContext_Stop() return TRUE; */ return FALSE; } bool8 ScrCmd_braillemessage(struct ScriptContext * ctx) { u8 *msg = (u8 *)ScriptReadWord(ctx); if (msg == NULL) msg = (u8 *)ctx->data[0]; LoadStdWindowFrameGfx(); DrawDialogueFrame(0, 1); AddTextPrinterParameterized(0, FONT_BRAILLE, msg, 0, 1, 0, NULL); return FALSE; } bool8 ScrCmd_getbraillestringwidth(struct ScriptContext * ctx) { u8 *msg = (u8 *)ScriptReadWord(ctx); if (msg == NULL) msg = (u8 *)ctx->data[0]; gSpecialVar_0x8004 = GetStringWidth(FONT_BRAILLE, msg, -1); return FALSE; } bool8 ScrCmd_vmessage(struct ScriptContext * ctx) { u32 msg = ScriptReadWord(ctx); ShowFieldMessage((u8 *)(msg - sAddressOffset)); return FALSE; } u8 *const sScriptStringVars[] = { gStringVar1, gStringVar2, gStringVar3, }; bool8 ScrCmd_bufferspeciesname(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 species = VarGet(ScriptReadHalfword(ctx)); StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]); return FALSE; } bool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u8 *dest = sScriptStringVars[stringVarIndex]; u8 partyIndex = GetLeadMonIndex(); u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); StringCopy(dest, gSpeciesNames[species]); return FALSE; } bool8 ScrCmd_bufferpartymonnick(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]); StringGet_Nickname(sScriptStringVars[stringVarIndex]); return FALSE; } bool8 ScrCmd_bufferitemname(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 itemId = VarGet(ScriptReadHalfword(ctx)); CopyItemName(itemId, sScriptStringVars[stringVarIndex]); return FALSE; } static const u8 sText_S[] = _("S"); static const u8 sText_IES[] = _("IES"); bool8 ScrCmd_bufferitemnameplural(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); CopyItemName(itemId, sScriptStringVars[stringVarIndex]); if (itemId == ITEM_POKE_BALL && quantity >= 2) StringAppend(sScriptStringVars[stringVarIndex], sText_S); else if (itemId >= FIRST_BERRY_INDEX && itemId < LAST_BERRY_INDEX && quantity >= 2) { u16 strlength = StringLength(sScriptStringVars[stringVarIndex]); if (strlength != 0) { u8 * endptr = sScriptStringVars[stringVarIndex] + strlength; endptr[-1] = EOS; StringAppend(sScriptStringVars[stringVarIndex], sText_IES); } } return FALSE; } bool8 ScrCmd_bufferdecorationname(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 decorId = VarGet(ScriptReadHalfword(ctx)); // StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name); return FALSE; } bool8 ScrCmd_buffermovename(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 moveId = VarGet(ScriptReadHalfword(ctx)); StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]); return FALSE; } bool8 ScrCmd_buffernumberstring(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 num = VarGet(ScriptReadHalfword(ctx)); u8 numDigits = CountDigits(num); ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], num, STR_CONV_MODE_LEFT_ALIGN, numDigits); return FALSE; } bool8 ScrCmd_bufferstdstring(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 index = VarGet(ScriptReadHalfword(ctx)); StringCopy(sScriptStringVars[stringVarIndex], gStdStringPtrs[index]); return FALSE; } bool8 ScrCmd_bufferstring(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); const u8 *text = (u8 *)ScriptReadWord(ctx); StringCopy(sScriptStringVars[stringVarIndex], text); return FALSE; } bool8 ScrCmd_vbuffermessage(struct ScriptContext * ctx) { const u8 *ptr = (u8 *)(ScriptReadWord(ctx) - sAddressOffset); StringExpandPlaceholders(gStringVar4, ptr); return FALSE; } bool8 ScrCmd_vbufferstring(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u32 addr = ScriptReadWord(ctx); const u8 *src = (u8 *)(addr - sAddressOffset); u8 *dest = sScriptStringVars[stringVarIndex]; StringCopy(dest, src); return FALSE; } bool8 ScrCmd_bufferboxname(struct ScriptContext * ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 boxId = VarGet(ScriptReadHalfword(ctx)); StringCopy(sScriptStringVars[stringVarIndex], GetBoxNamePtr(boxId)); return FALSE; } bool8 ScrCmd_givemon(struct ScriptContext * ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u8 level = ScriptReadByte(ctx); u16 item = VarGet(ScriptReadHalfword(ctx)); u32 unkParam1 = ScriptReadWord(ctx); u32 unkParam2 = ScriptReadWord(ctx); u8 unkParam3 = ScriptReadByte(ctx); gSpecialVar_Result = ScriptGiveMon(species, level, item, unkParam1, unkParam2, unkParam3); return FALSE; } bool8 ScrCmd_giveegg(struct ScriptContext * ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = ScriptGiveEgg(species); return FALSE; } bool8 ScrCmd_setmonmove(struct ScriptContext * ctx) { u8 partyIndex = ScriptReadByte(ctx); u8 slot = ScriptReadByte(ctx); u16 move = ScriptReadHalfword(ctx); ScriptSetMonMoveSlot(partyIndex, move, slot); return FALSE; } bool8 ScrCmd_checkpartymove(struct ScriptContext * ctx) { u32 i; u16 moveId = ScriptReadHalfword(ctx); gSpecialVar_Result = PARTY_SIZE; for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); if (!species) break; if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && MonKnowsMove(&gPlayerParty[i], moveId) == TRUE) { gSpecialVar_Result = i; gSpecialVar_0x8004 = species; break; } } return FALSE; } bool8 ScrCmd_addmoney(struct ScriptContext * ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); if (!ignore) AddMoney(&gSaveBlock1Ptr->money, amount); return FALSE; } bool8 ScrCmd_removemoney(struct ScriptContext * ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); if (!ignore) RemoveMoney(&gSaveBlock1Ptr->money, amount); return FALSE; } bool8 ScrCmd_checkmoney(struct ScriptContext * ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); if (!ignore) gSpecialVar_Result = IsEnoughMoney(&gSaveBlock1Ptr->money, amount); return FALSE; } bool8 ScrCmd_showmoneybox(struct ScriptContext * ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); u8 ignore = ScriptReadByte(ctx); if (!ignore && QL_AvoidDisplay(QL_DestroyAbortedDisplay) != TRUE) DrawMoneyBox(GetMoney(&gSaveBlock1Ptr->money), x, y); return FALSE; } bool8 ScrCmd_hidemoneybox(struct ScriptContext * ctx) { /*u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx);*/ HideMoneyBox(); return FALSE; } bool8 ScrCmd_updatemoneybox(struct ScriptContext * ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); u8 ignore = ScriptReadByte(ctx); if (!ignore) ChangeAmountInMoneyBox(GetMoney(&gSaveBlock1Ptr->money)); return FALSE; } bool8 ScrCmd_showcoinsbox(struct ScriptContext * ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) != TRUE) ShowCoinsWindow(GetCoins(), x, y); return FALSE; } bool8 ScrCmd_hidecoinsbox(struct ScriptContext * ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); HideCoinsWindow(); return FALSE; } bool8 ScrCmd_updatecoinsbox(struct ScriptContext * ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); PrintCoinsString(GetCoins()); return FALSE; } bool8 ScrCmd_trainerbattle(struct ScriptContext * ctx) { ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr); return FALSE; } bool8 ScrCmd_dotrainerbattle(struct ScriptContext * ctx) { StartTrainerBattle(); return TRUE; } bool8 ScrCmd_gotopostbattlescript(struct ScriptContext * ctx) { ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle(); return FALSE; } bool8 ScrCmd_gotobeatenscript(struct ScriptContext * ctx) { ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript(); return FALSE; } bool8 ScrCmd_checktrainerflag(struct ScriptContext * ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); ctx->comparisonResult = HasTrainerBeenFought(index); return FALSE; } bool8 ScrCmd_settrainerflag(struct ScriptContext * ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); SetTrainerFlag(index); return FALSE; } bool8 ScrCmd_cleartrainerflag(struct ScriptContext * ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); ClearTrainerFlag(index); return FALSE; } bool8 ScrCmd_setwildbattle(struct ScriptContext * ctx) { u16 species = ScriptReadHalfword(ctx); u8 level = ScriptReadByte(ctx); u16 item = ScriptReadHalfword(ctx); CreateScriptedWildMon(species, level, item); return FALSE; } bool8 ScrCmd_dowildbattle(struct ScriptContext * ctx) { StartScriptedWildBattle(); ScriptContext_Stop(); return TRUE; } bool8 ScrCmd_pokemart(struct ScriptContext * ctx) { const void *ptr = (void *)ScriptReadWord(ctx); CreatePokemartMenu(ptr); ScriptContext_Stop(); return TRUE; } bool8 ScrCmd_pokemartdecoration(struct ScriptContext * ctx) { const void *ptr = (void *)ScriptReadWord(ctx); CreateDecorationShop1Menu(ptr); ScriptContext_Stop(); return TRUE; } // Changes clerk dialogue slightly from above. See MART_TYPE_DECOR2 bool8 ScrCmd_pokemartdecoration2(struct ScriptContext * ctx) { const void *ptr = (void *)ScriptReadWord(ctx); CreateDecorationShop2Menu(ptr); ScriptContext_Stop(); return TRUE; } bool8 ScrCmd_playslotmachine(struct ScriptContext * ctx) { u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx)); PlaySlotMachine(slotMachineIndex, CB2_ReturnToFieldContinueScriptPlayMapMusic); ScriptContext_Stop(); return TRUE; } bool8 ScrCmd_setberrytree(struct ScriptContext * ctx) { // u8 treeId = ScriptReadByte(ctx); // u8 berry = ScriptReadByte(ctx); // u8 growthStage = ScriptReadByte(ctx); // // if (berry == 0) // PlantBerryTree(treeId, berry, growthStage, FALSE); // else // PlantBerryTree(treeId, berry, growthStage, FALSE); return FALSE; } bool8 ScrCmd_getpokenewsactive(struct ScriptContext * ctx) { // u16 value = VarGet(ScriptReadHalfword(ctx)); // // gSpecialVar_Result = GetPriceReduction(value); return FALSE; } bool8 ScrCmd_choosecontestmon(struct ScriptContext * ctx) { // ChooseContestMon(); ScriptContext_Stop(); return TRUE; } bool8 ScrCmd_startcontest(struct ScriptContext * ctx) { // StartContest(); // ScriptContext_Stop(); // return TRUE; return FALSE; } bool8 ScrCmd_showcontestresults(struct ScriptContext * ctx) { // ShowContestResults(); // ScriptContext_Stop(); // return TRUE; return FALSE; } bool8 ScrCmd_contestlinktransfer(struct ScriptContext * ctx) { // ContestLinkTransfer(gSpecialVar_ContestCategory); // ScriptContext_Stop(); // return TRUE; return FALSE; } bool8 ScrCmd_dofieldeffect(struct ScriptContext * ctx) { u16 effectId = VarGet(ScriptReadHalfword(ctx)); sFieldEffectScriptId = effectId; FieldEffectStart(sFieldEffectScriptId); return FALSE; } bool8 ScrCmd_setfieldeffectargument(struct ScriptContext * ctx) { u8 argNum = ScriptReadByte(ctx); gFieldEffectArguments[argNum] = (s16)VarGet(ScriptReadHalfword(ctx)); return FALSE; } static bool8 WaitForFieldEffectFinish(void) { if (!FieldEffectActiveListContains(sFieldEffectScriptId)) return TRUE; else return FALSE; } bool8 ScrCmd_waitfieldeffect(struct ScriptContext * ctx) { sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx)); SetupNativeScript(ctx, WaitForFieldEffectFinish); return TRUE; } bool8 ScrCmd_setrespawn(struct ScriptContext * ctx) { u16 healLocationId = VarGet(ScriptReadHalfword(ctx)); SetLastHealLocationWarp(healLocationId); return FALSE; } bool8 ScrCmd_checkplayergender(struct ScriptContext * ctx) { gSpecialVar_Result = gSaveBlock2Ptr->playerGender; return FALSE; } bool8 ScrCmd_playmoncry(struct ScriptContext * ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u16 mode = VarGet(ScriptReadHalfword(ctx)); PlayCry_Script(species, mode); return FALSE; } bool8 ScrCmd_waitmoncry(struct ScriptContext * ctx) { SetupNativeScript(ctx, IsCryFinished); return TRUE; } bool8 ScrCmd_setmetatile(struct ScriptContext * ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); u16 metatileId = VarGet(ScriptReadHalfword(ctx)); bool16 isImpassable = VarGet(ScriptReadHalfword(ctx)); x += MAP_OFFSET; y += MAP_OFFSET; if (!isImpassable) MapGridSetMetatileIdAt(x, y, metatileId); else MapGridSetMetatileIdAt(x, y, metatileId | MAPGRID_COLLISION_MASK); return FALSE; } bool8 ScrCmd_opendoor(struct ScriptContext * ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); x += MAP_OFFSET; y += MAP_OFFSET; PlaySE(GetDoorSoundEffect(x, y)); FieldAnimateDoorOpen(x, y); return FALSE; } bool8 ScrCmd_closedoor(struct ScriptContext * ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); x += MAP_OFFSET; y += MAP_OFFSET; FieldAnimateDoorClose(x, y); return FALSE; } static bool8 IsDoorAnimationStopped(void) { if (!FieldIsDoorAnimationRunning()) return TRUE; else return FALSE; } bool8 ScrCmd_waitdooranim(struct ScriptContext * ctx) { SetupNativeScript(ctx, IsDoorAnimationStopped); return TRUE; } bool8 ScrCmd_setdooropen(struct ScriptContext * ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); x += MAP_OFFSET; y += MAP_OFFSET; FieldSetDoorOpened(x, y); return FALSE; } bool8 ScrCmd_setdoorclosed(struct ScriptContext * ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); x += MAP_OFFSET; y += MAP_OFFSET; FieldSetDoorClosed(x, y); return FALSE; } bool8 ScrCmd_addelevmenuitem(struct ScriptContext * ctx) { // u8 v3 = ScriptReadByte(ctx); // u16 v5 = VarGet(ScriptReadHalfword(ctx)); // u16 v7 = VarGet(ScriptReadHalfword(ctx)); // u16 v9 = VarGet(ScriptReadHalfword(ctx)); //ScriptAddElevatorMenuItem(v3, v5, v7, v9); return FALSE; } bool8 ScrCmd_showelevmenu(struct ScriptContext * ctx) { /*ScriptShowElevatorMenu(); ScriptContext_Stop(); return TRUE;*/ return FALSE; } bool8 ScrCmd_checkcoins(struct ScriptContext * ctx) { u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); *ptr = GetCoins(); return FALSE; } bool8 ScrCmd_addcoins(struct ScriptContext * ctx) { u16 coins = VarGet(ScriptReadHalfword(ctx)); if (AddCoins(coins) == TRUE) gSpecialVar_Result = FALSE; else gSpecialVar_Result = TRUE; return FALSE; } bool8 ScrCmd_removecoins(struct ScriptContext * ctx) { u16 coins = VarGet(ScriptReadHalfword(ctx)); if (RemoveCoins(coins) == TRUE) gSpecialVar_Result = FALSE; else gSpecialVar_Result = TRUE; return FALSE; } bool8 ScrCmd_signmsg(struct ScriptContext * ctx) { MsgSetSignpost(); return FALSE; } bool8 ScrCmd_normalmsg(struct ScriptContext * ctx) { MsgSetNotSignpost(); return FALSE; } // This command will set a Pokémon's modernFatefulEncounter bit; there is no similar command to clear it. bool8 ScrCmd_setmonmodernfatefulencounter(struct ScriptContext * ctx) { bool8 isModernFatefulEncounter = TRUE; u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); SetMonData(&gPlayerParty[partyIndex], MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter); return FALSE; } bool8 ScrCmd_checkmonmodernfatefulencounter(struct ScriptContext * ctx) { u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); gSpecialVar_Result = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MODERN_FATEFUL_ENCOUNTER, NULL); return FALSE; } bool8 ScrCmd_setmonmetlocation(struct ScriptContext * ctx) { u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); u8 location = ScriptReadByte(ctx); if (partyIndex < PARTY_SIZE) SetMonData(&gPlayerParty[partyIndex], MON_DATA_MET_LOCATION, &location); return FALSE; } bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) { u8 mode = ScriptReadByte(ctx); switch (mode) { case FADE_TO_BLACK: case FADE_TO_WHITE: default: CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_SIZE); FadeScreen(mode, 0); break; case FADE_FROM_BLACK: case FADE_FROM_WHITE: CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); FadeScreen(mode, 0); break; } SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } bool8 ScrCmd_setobjectmovementtypeinstant(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 movementType = ScriptReadByte(ctx); SetObjectMovementType(localId, movementType); return FALSE; } bool8 ScrCmd_resetobjectmovementtype(struct ScriptContext * ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); ResetObjEventTemplateMovementType(localId); return FALSE; } ================================================ FILE: src/script.c ================================================ #include "global.h" #include "item.h" #include "field_effect_helpers.h" #include "field_specials.h" #include "event_object_movement.h" #include "item.h" #include "overworld.h" #include "pokedex.h" #include "random.h" #include "script.h" #include "sound.h" #include "strings.h" #include "string_util.h" #include "event_data.h" #include "party_menu.h" #include "pokemon_storage_system.h" #include "quest_log.h" #include "script_pokemon_util.h" #include "constants/items.h" #include "constants/map_scripts.h" #include "constants/moves.h" #include "constants/region_map_sections.h" #include "mystery_gift.h" #include "constants/maps.h" #include "constants/map_scripts.h" extern void ResetContextNpcTextColor(void); // field_specials extern u16 CalcCRC16WithTable(u8 *data, int length); // util #define RAM_SCRIPT_MAGIC 51 enum { SCRIPT_MODE_STOPPED, SCRIPT_MODE_BYTECODE, SCRIPT_MODE_NATIVE, }; enum { CONTEXT_RUNNING, CONTEXT_WAITING, CONTEXT_SHUTDOWN, }; EWRAM_DATA u8 gWalkAwayFromSignInhibitTimer = 0; EWRAM_DATA const u8 *gRamScriptRetAddr = NULL; static u8 sGlobalScriptContextStatus; static u32 sUnusedVariable1; static struct ScriptContext sGlobalScriptContext; static u32 sUnusedVariable2; static struct ScriptContext sImmediateScriptContext; static bool8 sLockFieldControls; static u8 sMsgBoxWalkawayDisabled; static u8 sMsgBoxIsCancelable; static u8 sQuestLogInput; static u8 sQuestLogInputIsDpad; static u8 sMsgIsSignpost; extern ScrCmdFunc gScriptCmdTable[]; extern ScrCmdFunc gScriptCmdTableEnd[]; extern void *gNullScriptPtr; void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd) { s32 i; ctx->mode = SCRIPT_MODE_STOPPED; ctx->scriptPtr = NULL; ctx->stackDepth = 0; ctx->nativePtr = NULL; ctx->cmdTable = cmdTable; ctx->cmdTableEnd = cmdTableEnd; for (i = 0; i < (int)ARRAY_COUNT(ctx->data); i++) ctx->data[i] = 0; for (i = 0; i < (int)ARRAY_COUNT(ctx->stack); i++) ctx->stack[i] = 0; } u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) { ctx->scriptPtr = ptr; ctx->mode = SCRIPT_MODE_BYTECODE; return 1; } void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void)) { ctx->mode = SCRIPT_MODE_NATIVE; ctx->nativePtr = ptr; } void StopScript(struct ScriptContext *ctx) { ctx->mode = SCRIPT_MODE_STOPPED; ctx->scriptPtr = NULL; } bool8 RunScriptCommand(struct ScriptContext *ctx) { // FRLG disabled this check, where-as it is present // in Ruby/Sapphire and Emerald. Why did the programmers // bother to remove a redundant check when it still // exists in Emerald? //if (ctx->mode == SCRIPT_MODE_STOPPED) // return FALSE; switch (ctx->mode) { case SCRIPT_MODE_STOPPED: return FALSE; case SCRIPT_MODE_NATIVE: // Try to call a function in C // Continue to bytecode if no function or it returns TRUE if (ctx->nativePtr) { if (ctx->nativePtr() == TRUE) ctx->mode = SCRIPT_MODE_BYTECODE; return TRUE; } ctx->mode = SCRIPT_MODE_BYTECODE; // fallthrough case SCRIPT_MODE_BYTECODE: while (1) { u8 cmdCode; ScrCmdFunc *cmdFunc; if (ctx->scriptPtr == NULL) { ctx->mode = SCRIPT_MODE_STOPPED; return FALSE; } if (ctx->scriptPtr == gNullScriptPtr) { while (1) asm("svc 2"); // HALT } cmdCode = *(ctx->scriptPtr); ctx->scriptPtr++; cmdFunc = &ctx->cmdTable[cmdCode]; if (cmdFunc >= ctx->cmdTableEnd) { ctx->mode = SCRIPT_MODE_STOPPED; return FALSE; } if ((*cmdFunc)(ctx) == TRUE) return TRUE; } } return TRUE; } static u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) { if (ctx->stackDepth + 1 >= (int)ARRAY_COUNT(ctx->stack)) { return 1; } else { ctx->stack[ctx->stackDepth] = ptr; ctx->stackDepth++; return 0; } } static const u8 *ScriptPop(struct ScriptContext *ctx) { if (ctx->stackDepth == 0) return NULL; ctx->stackDepth--; return ctx->stack[ctx->stackDepth]; } void ScriptJump(struct ScriptContext *ctx, const u8 *ptr) { ctx->scriptPtr = ptr; } void ScriptCall(struct ScriptContext *ctx, const u8 *ptr) { ScriptPush(ctx, ctx->scriptPtr); ctx->scriptPtr = ptr; } void ScriptReturn(struct ScriptContext *ctx) { ctx->scriptPtr = ScriptPop(ctx); } u16 ScriptReadHalfword(struct ScriptContext *ctx) { u16 value = *(ctx->scriptPtr++); value |= *(ctx->scriptPtr++) << 8; return value; } u32 ScriptReadWord(struct ScriptContext *ctx) { u32 value0 = *(ctx->scriptPtr++); u32 value1 = *(ctx->scriptPtr++); u32 value2 = *(ctx->scriptPtr++); u32 value3 = *(ctx->scriptPtr++); return (((((value3 << 8) + value2) << 8) + value1) << 8) + value0; } void LockPlayerFieldControls(void) { sLockFieldControls = TRUE; } void UnlockPlayerFieldControls(void) { sLockFieldControls = FALSE; } bool8 ArePlayerFieldControlsLocked(void) { return sLockFieldControls; } void SetQuestLogInputIsDpadFlag(void) { sQuestLogInputIsDpad = TRUE; } void ClearQuestLogInputIsDpadFlag(void) { sQuestLogInputIsDpad = FALSE; } bool8 IsQuestLogInputDpad(void) { if(sQuestLogInputIsDpad == TRUE) return TRUE; else return FALSE; } void RegisterQuestLogInput(u8 var) { sQuestLogInput = var; } void ClearQuestLogInput(void) { sQuestLogInput = 0; } u8 GetRegisteredQuestLogInput(void) { return sQuestLogInput; } void DisableMsgBoxWalkaway(void) { sMsgBoxWalkawayDisabled = TRUE; } void EnableMsgBoxWalkaway(void) { sMsgBoxWalkawayDisabled = FALSE; } bool8 IsMsgBoxWalkawayDisabled(void) { return sMsgBoxWalkawayDisabled; } void SetWalkingIntoSignVars(void) { gWalkAwayFromSignInhibitTimer = 6; sMsgBoxIsCancelable = TRUE; } void ClearMsgBoxCancelableState(void) { sMsgBoxIsCancelable = FALSE; } bool8 CanWalkAwayToCancelMsgBox(void) { if(sMsgBoxIsCancelable == TRUE) return TRUE; else return FALSE; } void MsgSetSignpost(void) { sMsgIsSignpost = TRUE; } void MsgSetNotSignpost(void) { sMsgIsSignpost = FALSE; } bool8 IsMsgSignpost(void) { if(sMsgIsSignpost == TRUE) return TRUE; else return FALSE; } void ResetFacingNpcOrSignpostVars(void) { ResetContextNpcTextColor(); MsgSetNotSignpost(); } // The ScriptContext_* functions work with the primary script context, // which yields control back to native code should the script make a wait call. // Checks if the global script context is able to be run right now. bool8 ScriptContext_IsEnabled(void) { if (sGlobalScriptContextStatus == CONTEXT_RUNNING) return TRUE; else return FALSE; } // Re-initializes the global script context to zero. void ScriptContext_Init(void) { InitScriptContext(&sGlobalScriptContext, gScriptCmdTable, gScriptCmdTableEnd); sGlobalScriptContextStatus = CONTEXT_SHUTDOWN; } // Runs the script until the script makes a wait* call, then returns true if // there's more script to run, or false if the script has hit the end. // This function also returns false if the context is finished // or waiting (after a call to _Stop) bool8 ScriptContext_RunScript(void) { if (sGlobalScriptContextStatus == CONTEXT_SHUTDOWN) return FALSE; if (sGlobalScriptContextStatus == CONTEXT_WAITING) return FALSE; LockPlayerFieldControls(); if (!RunScriptCommand(&sGlobalScriptContext)) { sGlobalScriptContextStatus = CONTEXT_SHUTDOWN; UnlockPlayerFieldControls(); return FALSE; } return TRUE; } // Sets up a new script in the global context and enables the context void ScriptContext_SetupScript(const u8 *ptr) { ClearMsgBoxCancelableState(); EnableMsgBoxWalkaway(); ClearQuestLogInputIsDpadFlag(); InitScriptContext(&sGlobalScriptContext, gScriptCmdTable, gScriptCmdTableEnd); SetupBytecodeScript(&sGlobalScriptContext, ptr); LockPlayerFieldControls(); sGlobalScriptContextStatus = CONTEXT_RUNNING; } // Puts the script into waiting mode; usually called from a wait* script command. void ScriptContext_Stop(void) { sGlobalScriptContextStatus = CONTEXT_WAITING; } // Puts the script into running mode. void ScriptContext_Enable(void) { sGlobalScriptContextStatus = CONTEXT_RUNNING; LockPlayerFieldControls(); } // Sets up and runs a script in its own context immediately. The script will be // finished when this function returns. Used mainly by all of the map header // scripts (except the frame table scripts). void RunScriptImmediately(const u8 *ptr) { InitScriptContext(&sImmediateScriptContext, &gScriptCmdTable, &gScriptCmdTableEnd); SetupBytecodeScript(&sImmediateScriptContext, ptr); while (RunScriptCommand(&sImmediateScriptContext) == TRUE); } static u8 *MapHeaderGetScriptTable(u8 tag) { const u8 *mapScripts = gMapHeader.mapScripts; if (mapScripts == NULL) return NULL; while (1) { if (*mapScripts == 0) return NULL; if (*mapScripts == tag) { mapScripts++; return T2_READ_PTR(mapScripts); } mapScripts += 5; } } static void MapHeaderRunScriptType(u8 tag) { u8 *ptr = MapHeaderGetScriptTable(tag); if (ptr != NULL) RunScriptImmediately(ptr); } static u8 *MapHeaderCheckScriptTable(u8 tag) { u8 *ptr = MapHeaderGetScriptTable(tag); if (ptr == NULL) return NULL; while (1) { u16 varIndex1; u16 varIndex2; // Read first var (or .2byte terminal value) varIndex1 = T1_READ_16(ptr); if (!varIndex1) return NULL; // Reached end of table ptr += 2; // Read second var varIndex2 = T1_READ_16(ptr); ptr += 2; // Run map script if vars are equal if (VarGet(varIndex1) == VarGet(varIndex2)) return T2_READ_PTR(ptr); ptr += 4; } } void RunOnLoadMapScript(void) { MapHeaderRunScriptType(MAP_SCRIPT_ON_LOAD); } void RunOnTransitionMapScript(void) { MapHeaderRunScriptType(MAP_SCRIPT_ON_TRANSITION); } void RunOnResumeMapScript(void) { FlagClear(FLAG_SYS_ON_RESUME); MapHeaderRunScriptType(MAP_SCRIPT_ON_RESUME); } void RunOnReturnToFieldMapScript(void) { MapHeaderRunScriptType(MAP_SCRIPT_ON_RETURN_TO_FIELD); } void RunOnDiveWarpMapScript(void) { MapHeaderRunScriptType(MAP_SCRIPT_ON_DIVE_WARP); } bool8 TryRunOnFrameMapScript(void) { u8 *ptr; if (gQuestLogState == QL_STATE_PLAYBACK_LAST) return FALSE; ptr = MapHeaderCheckScriptTable(MAP_SCRIPT_ON_FRAME_TABLE); if (!ptr) return FALSE; ScriptContext_SetupScript(ptr); return TRUE; } void TryRunOnWarpIntoMapScript(void) { u8 *ptr = MapHeaderCheckScriptTable(MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE); if (ptr) RunScriptImmediately(ptr); } u32 CalculateRamScriptChecksum(void) { return CalcCRC16WithTable((u8 *)(&gSaveBlock1Ptr->ramScript.data), sizeof(gSaveBlock1Ptr->ramScript.data)); } void ClearRamScript(void) { CpuFill32(0, &gSaveBlock1Ptr->ramScript, sizeof(struct RamScript)); } bool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; ClearRamScript(); if (scriptSize > sizeof(scriptData->script)) return FALSE; scriptData->magic = RAM_SCRIPT_MAGIC; scriptData->mapGroup = mapGroup; scriptData->mapNum = mapNum; scriptData->objectId = objectId; memcpy(scriptData->script, script, scriptSize); gSaveBlock1Ptr->ramScript.checksum = CalculateRamScriptChecksum(); return TRUE; } const u8 *GetRamScript(u8 objectId, const u8 *script) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; gRamScriptRetAddr = NULL; if (scriptData->magic != RAM_SCRIPT_MAGIC) return script; if (scriptData->mapGroup != gSaveBlock1Ptr->location.mapGroup) return script; if (scriptData->mapNum != gSaveBlock1Ptr->location.mapNum) return script; if (scriptData->objectId != objectId) return script; if (CalculateRamScriptChecksum() != gSaveBlock1Ptr->ramScript.checksum) { ClearRamScript(); return script; } else { gRamScriptRetAddr = script; return scriptData->script; } } bool32 ValidateRamScript(void) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; if (scriptData->magic != RAM_SCRIPT_MAGIC) return FALSE; if (scriptData->mapGroup != MAP_GROUP(UNDEFINED)) return FALSE; if (scriptData->mapNum != MAP_NUM(UNDEFINED)) return FALSE; if (scriptData->objectId != 0xFF) return FALSE; if (CalculateRamScriptChecksum() != gSaveBlock1Ptr->ramScript.checksum) return FALSE; return TRUE; } u8 *GetSavedRamScriptIfValid(void) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; if (!ValidateSavedWonderCard()) return NULL; if (scriptData->magic != RAM_SCRIPT_MAGIC) return NULL; if (scriptData->mapGroup != MAP_GROUP(UNDEFINED)) return NULL; if (scriptData->mapNum != MAP_NUM(UNDEFINED)) return NULL; if (scriptData->objectId != 0xFF) return NULL; if (CalculateRamScriptChecksum() != gSaveBlock1Ptr->ramScript.checksum) { ClearRamScript(); return NULL; } else { return scriptData->script; } } void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize) { if (scriptSize > sizeof(gSaveBlock1Ptr->ramScript.data.script)) scriptSize = sizeof(gSaveBlock1Ptr->ramScript.data.script); InitRamScript(script, scriptSize, MAP_GROUP(UNDEFINED), MAP_NUM(UNDEFINED), 0xFF); } void GetStartingLevelOfRoute5DaycareMon(void) { ConvertIntToDecimalStringN(gStringVar3, GetLevelFromBoxMonExp(&gSaveBlock1Ptr->route5DayCareMon.mon), STR_CONV_MODE_LEFT_ALIGN, 2); } void CheckCurrentMasterTitle(void) { gSpecialVar_Result = gSaveBlock1Ptr->masterTrainerTitle; } void SetCurrentMasterTitle(void) { gSaveBlock1Ptr->masterTrainerTitle = gSpecialVar_Result; } void CheckHasAnyMasterTitle(void) { u32 i; bool8 flag = TRUE; if(gSaveBlock1Ptr->masterTrainerTitle != 0) { gSpecialVar_Result = TRUE; return; } for(i = 1; i < 152; i++) //flags start at 1, which is SPECIES_BULBASAUR { flag = CheckMasterTrainerFlag(i); if(flag) { gSpecialVar_Result = TRUE; return; } } gSpecialVar_Result = FALSE; } void CheckAllMasterTrainerFlags(void) { u32 i; bool8 flag = TRUE; for(i = 1; i < 152; i++) //flags start at 1, which is SPECIES_BULBASAUR { flag = CheckMasterTrainerFlag(i); if(!flag) { gSpecialVar_Result = FALSE; return; } } gSpecialVar_Result = TRUE; } void ShouldChangeMasterTrainerMovementType(void) { gSpecialVar_Result = CheckMasterTrainerFlag(gSpecialVar_0x8009); } void ClearAllButFirstPokemon(void) { u32 i; for (i = 1; i < PARTY_SIZE; i++) ZeroMonData(&gPlayerParty[i]); } void CheckSlot1EVTotal(void) { u8 evs[NUM_STATS]; u16 totalEVs = 0; u32 i; for (i = 0; i < NUM_STATS; i++) { evs[i] = GetMonData(&gPlayerParty[0], MON_DATA_HP_EV + i, NULL); totalEVs += evs[i]; } if(totalEVs >= 100) gSpecialVar_Result = TRUE; else gSpecialVar_Result = FALSE; } void CheckMasterPokemonInSlot1(void) { if(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES_OR_EGG, NULL) == gSpecialVar_0x8009) gSpecialVar_Result = TRUE; else gSpecialVar_Result = FALSE; //loading a or an into STR_VAR_3 for certain Pokemon... switch(gSpecialVar_0x8009) { case SPECIES_IVYSAUR: case SPECIES_ODDISH: case SPECIES_ARCANINE: case SPECIES_EXEGGCUTE: case SPECIES_EXEGGUTOR: case SPECIES_EEVEE: StringCopy(gStringVar3, gText_An); break; default: StringCopy(gStringVar3, gText_A); break; } } void ShouldSpawnSoftlockClerk(void) { gSpecialVar_Result = CheckAssetsForSoftlock(); } void HideWarpArrowSprite(void) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; SetSpriteInvisible(playerObjEvent->warpArrowSpriteId); } void CoordsOfPMCExitWarpTo80068007(void) { switch(gMapHeader.regionMapSectionId) { case MAPSEC_INDIGO_PLATEAU: gSpecialVar_0x8006 = 11; gSpecialVar_0x8007 = 16; return; case MAPSEC_ONE_ISLAND: gSpecialVar_0x8006 = 9; gSpecialVar_0x8007 = 9; return; default: gSpecialVar_0x8006 = 7; gSpecialVar_0x8007 = 8; return; } } void HasNationalMonToVarResult(void) { gSpecialVar_Result = HasNationalMon(); } void TeachTrappedTentacoolSurf(void) { u32 i; u32 move = MOVE_SURF; u32 pp = 15; if(gSpecialVar_0x8007 == 0) //party { i = CalculatePlayerPartyCount() - 1; SetMonData(&gPlayerParty[i], MON_DATA_MOVE4, &move); SetMonData(&gPlayerParty[i], MON_DATA_PP1 + 3, &pp); return; } else //box { SetBoxMonDataAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, MON_DATA_MOVE4, &move); SetBoxMonDataAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, MON_DATA_PP1 + 3, &pp); return; } } void CheckPlayerTrappedOnCinnabar(void) { bool32 hasHM03 = CheckBagHasItem(ITEM_HM03, 1); u32 i, j; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) { break; } else { struct Pokemon* partyMon = &gPlayerParty[i]; if (!GetMonData(partyMon, MON_DATA_IS_EGG) && MonKnowsMove(partyMon, MOVE_SURF)) { gSpecialVar_Result = 0; return; } if (hasHM03 && CanMonLearnTMHM(partyMon, ITEM_HM03 - ITEM_TM01_FOCUS_PUNCH)) { gSpecialVar_Result = 0; return; } } } for (i = 0; i < TOTAL_BOXES_COUNT; i++) { for (j = 0; j < IN_BOX_COUNT; j++) { if (GetBoxMonDataAt(i, j, MON_DATA_SPECIES) == SPECIES_NONE) { continue; } else { struct Pokemon tempMon; BoxMonToMon(GetBoxedMonPtr(i, j), &tempMon); if (!GetMonData(&tempMon, MON_DATA_IS_EGG) && MonKnowsMove(&tempMon, MOVE_SURF)) { gSpecialVar_Result = 0; return; } if (hasHM03 && CanMonLearnTMHM(&tempMon, ITEM_HM03 - ITEM_TM01_FOCUS_PUNCH)) { gSpecialVar_Result = 0; return; } } } } if(hasHM03) gSpecialVar_Result = 1; else gSpecialVar_Result = 2; // need to teach Tentacool Surf } void CheckNuzlockeMode(void) { gSpecialVar_Result = gSaveBlock1Ptr->keyFlags.nuzlocke; } void CheckNoFreeHealsMode(void) { gSpecialVar_Result = gSaveBlock1Ptr->keyFlags.noPMC; } #define SET_SPEAROW_STATE 0 #define SET_TOLD_FAMECHECKER 1 #define SET_VISITOR_STATE 2 #define SET_LEVEL_GROWTH 3 #define CHECK_SPEAROW_STATE 4 #define CHECK_TOLD_FAMECHECKER 5 #define CHECK_VISITOR_STATE 6 #define CHECK_LEVEL_GROWTH 7 #define SET_BOXES_MOVED 8 #define CHECK_BOXES_MOVED 9 #define CHECK_ANY_VISITORS 10 #define CHECK_ALL_TOLD 11 #define CREATE_VISITOR_STRING 12 struct BattleHouse { u16 spearowState:1; //whether Spearow is gone. 0 for no, 1 for yes u16 toldBrock:1; u16 toldMisty:1; u16 toldLtSurge:1; u16 toldErika:1; u16 toldKoga:1; u16 toldSabrina:1; u16 toldBlaine:1; // ^^ filled out Fame Checker and told lady for person // 1 byte u16 boxesMoved:1; // controls setting the layout. Happens when Spearow returns for the first time. u16 visitorBrock:1; u16 visitorMisty:1; u16 visitorLtSurge:1; u16 visitorErika:1; u16 visitorKoga:1; u16 visitorSabrina:1; u16 visitorBlaine:1; // ^^ visitors currently in house // 1 byte, overflows into next scripting var u16 spawnFails:3; // after a Gym Leader fails to visit 6 times, this starts forcing visits u16 levelGrowth:5; // adds levels to rematch Pokemon up to level 80. Maxes at +12. // 1 byte u16 steps:8; // used to bring back Spearow and bring in visitors }; static bool8 AllPossibleGymLeadersPresent(void) { struct BattleHouse* BattleHouseVar; u16 *varPtr = GetVarPointer(VAR_BATTLE_HOUSE); (void*) BattleHouseVar = varPtr; if(BattleHouseVar->toldBrock && !BattleHouseVar->visitorBrock) { return FALSE; } if(BattleHouseVar->toldMisty && !BattleHouseVar->visitorMisty) { return FALSE; } if(BattleHouseVar->toldLtSurge && !BattleHouseVar->visitorLtSurge) { return FALSE; } if(BattleHouseVar->toldErika && !BattleHouseVar->visitorErika) { return FALSE; } if(BattleHouseVar->toldKoga && !BattleHouseVar->visitorKoga) { return FALSE; } if(BattleHouseVar->toldSabrina && !BattleHouseVar->visitorSabrina) { return FALSE; } if(BattleHouseVar->toldBlaine && !BattleHouseVar->visitorBlaine) { return FALSE; } return TRUE; } u8 ReturnBattleHouseLevel(void) { struct BattleHouse* BattleHouseVar; u16 *varPtr = GetVarPointer(VAR_BATTLE_HOUSE); u8 levelGrowth; (void*) BattleHouseVar = varPtr; levelGrowth = BattleHouseVar->levelGrowth; return levelGrowth; } void UpdateBattleHouseStepCounter(void) { struct BattleHouse* BattleHouseVar; u16 *varPtr = GetVarPointer(VAR_BATTLE_HOUSE); u8 chanceOfVisit = 46; (void*) BattleHouseVar = varPtr; if(VarGet(VAR_BATTLE_HOUSE) && gMapHeader.regionMapSectionId != MAPSEC_SEVEN_ISLAND) { if(BattleHouseVar->steps != 255) BattleHouseVar->steps++; else { BattleHouseVar->steps++; if(BattleHouseVar->spearowState && !BattleHouseVar->boxesMoved) { //Spearow left for the first time, bring it back, open basement, force first leader visit BattleHouseVar->spearowState = 0; BattleHouseVar->boxesMoved = 1; if(BattleHouseVar->toldBrock) BattleHouseVar->visitorBrock = 1; if(BattleHouseVar->toldMisty) BattleHouseVar->visitorMisty = 1; if(BattleHouseVar->toldLtSurge) BattleHouseVar->visitorLtSurge = 1; if(BattleHouseVar->toldErika) BattleHouseVar->visitorErika = 1; if(BattleHouseVar->toldKoga) BattleHouseVar->visitorKoga = 1; if(BattleHouseVar->toldSabrina) BattleHouseVar->visitorSabrina = 1; if(BattleHouseVar->toldBlaine) BattleHouseVar->visitorBlaine = 1; return; } if(BattleHouseVar->spearowState) { //Spearow left, check if it returns if(Random() % 2 == 0) //50% chance { BattleHouseVar->spearowState = 0; } return; //no new visitors while Spearow is out } if(!AllPossibleGymLeadersPresent() && (BattleHouseVar->spawnFails == 6 || Random() % 256 < chanceOfVisit)) { //Gym Leader visiting, ~18% chance; will start forcing visits after 6 misses u8 counter = 0; do{ u8 leader = Random() % 7; switch(leader) { case 0: if(BattleHouseVar->toldBrock && !BattleHouseVar->visitorBrock) { BattleHouseVar->visitorBrock = 1; BattleHouseVar->spawnFails = 0; return; } break; case 1: if(BattleHouseVar->toldMisty && !BattleHouseVar->visitorMisty) { BattleHouseVar->visitorMisty = 1; BattleHouseVar->spawnFails = 0; return; } break; case 2: if(BattleHouseVar->toldLtSurge && !BattleHouseVar->visitorLtSurge) { BattleHouseVar->visitorLtSurge = 1; BattleHouseVar->spawnFails = 0; return; } break; case 3: if(BattleHouseVar->toldErika && !BattleHouseVar->visitorErika) { BattleHouseVar->visitorErika = 1; BattleHouseVar->spawnFails = 0; return; } break; case 4: if(BattleHouseVar->toldKoga && !BattleHouseVar->visitorKoga) { BattleHouseVar->visitorKoga = 1; BattleHouseVar->spawnFails = 0; return; } break; case 5: if(BattleHouseVar->toldSabrina && !BattleHouseVar->visitorSabrina) { BattleHouseVar->visitorSabrina = 1; BattleHouseVar->spawnFails = 0; return; } break; case 6: if(BattleHouseVar->toldBlaine && !BattleHouseVar->visitorBlaine) { BattleHouseVar->visitorBlaine = 1; BattleHouseVar->spawnFails = 0; return; } break; } counter++; }while(counter < 3 || BattleHouseVar->spawnFails >= 6); //rerolls up to 3 times if doesn't hit; forces a spawn if failed 6 times if(counter == 3) //failed 3 rerolls, increment spawnFails if(BattleHouseVar->spawnFails != 7 && !AllPossibleGymLeadersPresent()) BattleHouseVar->spawnFails++; } else { if(BattleHouseVar->spawnFails != 7 && !AllPossibleGymLeadersPresent()) BattleHouseVar->spawnFails++; } } } } void UseBattleHouseVar(void) { u8 type = gSpecialVar_0x8003; u8 argument = gSpecialVar_0x8004; struct BattleHouse* BattleHouseVar; u16 *varPtr = GetVarPointer(VAR_BATTLE_HOUSE); u8 totalCount = 0; u8 runningCount = 0; (void*) BattleHouseVar = varPtr; switch(type) { case SET_SPEAROW_STATE: BattleHouseVar->spearowState ^= 1; //toggle state break; case SET_TOLD_FAMECHECKER: switch(argument) { case FAMECHECKER_BROCK: BattleHouseVar->toldBrock = 1; break; case FAMECHECKER_MISTY: BattleHouseVar->toldMisty = 1; break; case FAMECHECKER_LTSURGE: BattleHouseVar->toldLtSurge = 1; break; case FAMECHECKER_ERIKA: BattleHouseVar->toldErika = 1; break; case FAMECHECKER_KOGA: BattleHouseVar->toldKoga = 1; break; case FAMECHECKER_SABRINA: BattleHouseVar->toldSabrina = 1; break; case FAMECHECKER_BLAINE: BattleHouseVar->toldBlaine = 1; break; } break; case SET_VISITOR_STATE: switch(argument) { case FAMECHECKER_BROCK: BattleHouseVar->visitorBrock ^= 1; //toggle state break; case FAMECHECKER_MISTY: BattleHouseVar->visitorMisty ^= 1; break; case FAMECHECKER_LTSURGE: BattleHouseVar->visitorLtSurge ^= 1; break; case FAMECHECKER_ERIKA: BattleHouseVar->visitorErika ^= 1; break; case FAMECHECKER_KOGA: BattleHouseVar->visitorKoga ^= 1; break; case FAMECHECKER_SABRINA: BattleHouseVar->visitorSabrina ^= 1; break; case FAMECHECKER_BLAINE: BattleHouseVar->visitorBlaine ^= 1; break; } break; case SET_LEVEL_GROWTH: if(BattleHouseVar->levelGrowth < 12) BattleHouseVar->levelGrowth++; break; case CHECK_SPEAROW_STATE: gSpecialVar_Result = BattleHouseVar->spearowState; break; case CHECK_TOLD_FAMECHECKER: switch(argument) { case FAMECHECKER_BROCK: gSpecialVar_Result = BattleHouseVar->toldBrock; break; case FAMECHECKER_MISTY: gSpecialVar_Result = BattleHouseVar->toldMisty; break; case FAMECHECKER_LTSURGE: gSpecialVar_Result = BattleHouseVar->toldLtSurge; break; case FAMECHECKER_ERIKA: gSpecialVar_Result = BattleHouseVar->toldErika; break; case FAMECHECKER_KOGA: gSpecialVar_Result = BattleHouseVar->toldKoga; break; case FAMECHECKER_SABRINA: gSpecialVar_Result = BattleHouseVar->toldSabrina; break; case FAMECHECKER_BLAINE: gSpecialVar_Result = BattleHouseVar->toldBlaine; break; } break; case CHECK_VISITOR_STATE: switch(argument) { case FAMECHECKER_BROCK: gSpecialVar_Result = BattleHouseVar->visitorBrock; break; case FAMECHECKER_MISTY: gSpecialVar_Result = BattleHouseVar->visitorMisty; break; case FAMECHECKER_LTSURGE: gSpecialVar_Result = BattleHouseVar->visitorLtSurge; break; case FAMECHECKER_ERIKA: gSpecialVar_Result = BattleHouseVar->visitorErika; break; case FAMECHECKER_KOGA: gSpecialVar_Result = BattleHouseVar->visitorKoga; break; case FAMECHECKER_SABRINA: gSpecialVar_Result = BattleHouseVar->visitorSabrina; break; case FAMECHECKER_BLAINE: gSpecialVar_Result = BattleHouseVar->visitorBlaine; break; } break; case CHECK_LEVEL_GROWTH: if(BattleHouseVar->levelGrowth > 12) gSpecialVar_Result = 12; else gSpecialVar_Result = BattleHouseVar->levelGrowth; break; case SET_BOXES_MOVED: BattleHouseVar->boxesMoved = 1; break; case CHECK_BOXES_MOVED: gSpecialVar_Result = BattleHouseVar->boxesMoved; break; case CHECK_ANY_VISITORS: gSpecialVar_Result = 0; if(BattleHouseVar->visitorBrock) { gSpecialVar_Result++; StringCopy(gStringVar1, gText_Brock); } if(BattleHouseVar->visitorMisty) { gSpecialVar_Result++; StringCopy(gStringVar1, gText_Misty); } if(BattleHouseVar->visitorLtSurge) { gSpecialVar_Result++; StringCopy(gStringVar1, gText_LtSurge); } if(BattleHouseVar->visitorErika) { gSpecialVar_Result++; StringCopy(gStringVar1, gText_Erika); } if(BattleHouseVar->visitorKoga) { gSpecialVar_Result++; StringCopy(gStringVar1, gText_Koga); } if(BattleHouseVar->visitorSabrina) { gSpecialVar_Result++; StringCopy(gStringVar1, gText_Sabrina); } if(BattleHouseVar->visitorBlaine) { gSpecialVar_Result++; StringCopy(gStringVar1, gText_Blaine); } break; case CHECK_ALL_TOLD: gSpecialVar_Result = 0; if(BattleHouseVar->toldBrock) gSpecialVar_Result++; if(BattleHouseVar->toldMisty) gSpecialVar_Result++; if(BattleHouseVar->toldLtSurge) gSpecialVar_Result++; if(BattleHouseVar->toldErika) gSpecialVar_Result++; if(BattleHouseVar->toldKoga) gSpecialVar_Result++; if(BattleHouseVar->toldSabrina) gSpecialVar_Result++; if(BattleHouseVar->toldBlaine) gSpecialVar_Result++; break; case CREATE_VISITOR_STRING: //used for mailbox outside if(BattleHouseVar->visitorBrock) totalCount++; if(BattleHouseVar->visitorMisty) totalCount++; if(BattleHouseVar->visitorLtSurge) totalCount++; if(BattleHouseVar->visitorErika) totalCount++; if(BattleHouseVar->visitorKoga) totalCount++; if(BattleHouseVar->visitorSabrina) totalCount++; if(BattleHouseVar->visitorBlaine) totalCount++; StringCopy(gStringVar1, gExpandedPlaceholder_Empty); gSpecialVar_Result = 0; if(BattleHouseVar->visitorBrock) { gSpecialVar_Result++; runningCount++; StringAppend(gStringVar1, gText_Brock); if(totalCount != runningCount && totalCount != 2) { StringAppend(gStringVar1, gText_CommaSpace); if(runningCount == (totalCount - 1)) { StringAppend(gStringVar1, gText_AndSpace); } } if(totalCount == 2 && runningCount != 2) { StringAppend(gStringVar1, gText_RegionMap_Space); StringAppend(gStringVar1, gText_AndSpace); } } if(BattleHouseVar->visitorMisty) { gSpecialVar_Result++; runningCount++; StringAppend(gStringVar1, gText_Misty); if(totalCount != runningCount && totalCount != 2) { StringAppend(gStringVar1, gText_CommaSpace); if(runningCount == (totalCount - 1)) { StringAppend(gStringVar1, gText_AndSpace); } } if(totalCount == 2 && runningCount != 2) { StringAppend(gStringVar1, gText_RegionMap_Space); StringAppend(gStringVar1, gText_AndSpace); } } if(BattleHouseVar->visitorLtSurge) { gSpecialVar_Result++; runningCount++; StringAppend(gStringVar1, gText_LtSurge); if(totalCount != runningCount && totalCount != 2) { StringAppend(gStringVar1, gText_CommaSpace); if(runningCount == (totalCount - 1)) { StringAppend(gStringVar1, gText_AndSpace); } } if(totalCount == 2 && runningCount != 2) { StringAppend(gStringVar1, gText_RegionMap_Space); StringAppend(gStringVar1, gText_AndSpace); } } if(BattleHouseVar->visitorErika) { gSpecialVar_Result++; runningCount++; StringAppend(gStringVar1, gText_Erika); if(totalCount != runningCount && totalCount != 2) { StringAppend(gStringVar1, gText_CommaSpace); if(runningCount == (totalCount - 1)) { StringAppend(gStringVar1, gText_AndSpace); } } if(totalCount == 2 && runningCount != 2) { StringAppend(gStringVar1, gText_RegionMap_Space); StringAppend(gStringVar1, gText_AndSpace); } } if(BattleHouseVar->visitorKoga) { runningCount++; if(gSpecialVar_Result == 4 && totalCount != runningCount) { StringAppend(gStringVar1, gText_NewLine); gSpecialVar_Result = 0; } gSpecialVar_Result++; StringAppend(gStringVar1, gText_Koga); if(totalCount != runningCount && totalCount != 2) { StringAppend(gStringVar1, gText_CommaSpace); if(runningCount == (totalCount - 1)) { StringAppend(gStringVar1, gText_AndSpace); } } if(totalCount == 2 && runningCount != 2) { StringAppend(gStringVar1, gText_RegionMap_Space); StringAppend(gStringVar1, gText_AndSpace); } } if(BattleHouseVar->visitorSabrina) { runningCount++; if(gSpecialVar_Result == 4) { StringAppend(gStringVar1, gText_NewLine); gSpecialVar_Result = 0; } gSpecialVar_Result++; StringAppend(gStringVar1, gText_Sabrina); if(totalCount != runningCount && totalCount != 2) { StringAppend(gStringVar1, gText_CommaSpace); if(runningCount == (totalCount - 1)) { StringAppend(gStringVar1, gText_AndSpace); } } if(totalCount == 2 && runningCount != 2) { StringAppend(gStringVar1, gText_RegionMap_Space); StringAppend(gStringVar1, gText_AndSpace); } } if(BattleHouseVar->visitorBlaine) { runningCount++; if(gSpecialVar_Result == 4) { StringAppend(gStringVar1, gText_NewLine); gSpecialVar_Result = 0; } gSpecialVar_Result++; StringAppend(gStringVar1, gText_Blaine); } break; } } #undef SET_SPEAROW_STATE #undef SET_TOLD_FAMECHECKER #undef SET_VISITOR_STATE #undef SET_LEVEL_GROWTH #undef CHECK_SPEAROW_STATE #undef CHECK_TOLD_FAMECHECKER #undef CHECK_VISITOR_STATE #undef CHECK_LEVEL_GROWTH #undef SET_BOXES_MOVED #undef CHECK_BOXES_MOVED #undef CHECK_ANY_VISITORS #undef CHECK_ALL_TOLD #undef CREATE_VISITOR_STRING void HandleUseExpiredRepel(void) { VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(VarGet(VAR_LAST_REPEL_USED))); } void DetermineCeruleanCaveLayout(void) { u32 trainerId = GetPlayerTrainerId(); u8 result = trainerId % 3; gSpecialVar_Result = result; } void CheckTrainerCardStars(void) { u8 stars = 0; if(FlagGet(FLAG_SYS_GAME_CLEAR)) { stars++; } if(HasAllKantoMonsNew()) { stars++; } if(HasAllMonsNew()) { stars++; } if((gSaveBlock2Ptr->berryPick.berriesPicked >= 200 && gSaveBlock2Ptr->pokeJump.jumpsInRow >= 200) || gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak > 49) { stars++; } gSpecialVar_Result = stars; } #define HAS_TICKETS 16 #define NEEDS_SHOW_EON 17 #define NEEDS_SHOW_AURORA 18 #define NEEDS_SHOW_MYSTIC 19 #define NEEDS_SHOW_OLD_SEA_MAP 20 #define HAS_NO_TICKETS 21 void CheckEventTickets(void) { bool8 haveEonTicket = CheckBagHasItem(ITEM_EON_TICKET, 1); bool8 haveAuroraTicket = CheckBagHasItem(ITEM_AURORA_TICKET, 1); bool8 haveMysticTicket = CheckBagHasItem(ITEM_MYSTIC_TICKET, 1); bool8 haveOldSeaMap = CheckBagHasItem(ITEM_OLD_SEA_MAP, 1); bool8 shownEonTicket = FlagGet(FLAG_SHOWN_EON_TICKET); bool8 shownAuroraTicket = FlagGet(FLAG_SHOWN_AURORA_TICKET); bool8 shownMysticTicket = FlagGet(FLAG_SHOWN_MYSTIC_TICKET); bool8 shownOldSeaMap = FlagGet(FLAG_SHOWN_OLD_SEA_MAP); u8 multichoiceCase = 0; if(gSpecialVar_Result == 0) //checking for showing tickets for the first time { if(shownEonTicket && shownAuroraTicket && shownMysticTicket && shownOldSeaMap) { gSpecialVar_Result = HAS_TICKETS; return; } if(haveEonTicket && !shownEonTicket) { gSpecialVar_Result = NEEDS_SHOW_EON; return; } if(haveAuroraTicket && !shownAuroraTicket) { gSpecialVar_Result = NEEDS_SHOW_AURORA; return; } if(haveMysticTicket && !shownMysticTicket) { gSpecialVar_Result = NEEDS_SHOW_MYSTIC; return; } if(haveOldSeaMap && !shownOldSeaMap) { gSpecialVar_Result = NEEDS_SHOW_OLD_SEA_MAP; return; } if(shownEonTicket || shownAuroraTicket || shownMysticTicket || shownOldSeaMap) { gSpecialVar_Result = HAS_TICKETS; return; } gSpecialVar_Result = HAS_NO_TICKETS; return; } if(gSpecialVar_Result == 1) //checking which multichoice combo to display { if(haveEonTicket && shownEonTicket) { multichoiceCase |= 1 << 3; //setting Eon bit } if(haveAuroraTicket && shownAuroraTicket) { multichoiceCase |= 1 << 2; //setting Aurora bit } if(haveMysticTicket && shownMysticTicket) { multichoiceCase |= 1 << 1; //setting Mystic bit } if(haveOldSeaMap && shownOldSeaMap) { multichoiceCase |= 1 << 0; //setting Old Sea Map bit } gSpecialVar_Result = multichoiceCase; return; } return; } #undef HAS_TICKETS #undef NEEDS_SHOW_EON #undef NEEDS_SHOW_AURORA #undef NEEDS_SHOW_MYSTIC #undef NEEDS_SHOW_OLD_SEA_MAP #undef HAS_NO_TICKETS void RecalculatePartyStats(void) { u32 i; for (i = 0; i < gPlayerPartyCount; i++) { CalculateMonStats(&gPlayerParty[i], FALSE); } } void ResetTintFilter(void) { u8 val = 0; gGlobalFieldTintMode = 0; SetInitialPlayerAvatarStateWithDirection(DIR_NORTH); StopMapMusic(); DoMapLoadLoop(&val); } void SetLastViewedPokedexEntry(void) { gSaveBlock1Ptr->lastViewedPokedexEntry = GetStarterSpecies(); } void TurnOffNuzlockeMode(void) { if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { gSaveBlock1Ptr->keyFlags.nuzlocke = 0; } } void TurnOffNoPMC(void) { if(gSaveBlock1Ptr->keyFlags.noPMC == 1) { gSaveBlock1Ptr->keyFlags.noPMC = 0; } } void SetNoPMCTest(void) { u8 noPMC = gSaveBlock1Ptr->keyFlags.noPMC; switch(noPMC) { case 0: default: gSaveBlock1Ptr->keyFlags.noPMC = 1; return; case 1: gSaveBlock1Ptr->keyFlags.noPMC = 0; return; } } void IsVersionFireRedToVarResult(void) { if(gSaveBlock1Ptr->keyFlags.version == 0) gSpecialVar_Result = TRUE; else gSpecialVar_Result = FALSE; } void IsChallengeModeToVarResult(void) { u8 difficulty = gSaveBlock1Ptr->keyFlags.difficulty; if(difficulty == DIFFICULTY_CHALLENGE) { gSpecialVar_Result = TRUE; } else { gSpecialVar_Result = FALSE; } } void FillBagsTest(void) { u32 i; //pokeballs for(i = 1; i < 13; i++) { AddBagItem(i, 999); } //regular items starting with Potion for(i = 13; i < 52; i++) { AddBagItem(i, 999); } //regular items starting with HP UP, skipping ??????????s for(i = 63; i < 87; i++) { if(i == 72 || i == 82) //skipping random ??????????s { continue; } AddBagItem(i, 999); } //regular items starting with Sun Stone, skipping ??????????s for(i = 93; i < 99; i++) { AddBagItem(i, 999); } //regular items starting with TinyMushroom, skipping ??????????s for(i = 103; i < 112; i++) { if(i == 105) //skipping random ?????????? { continue; } AddBagItem(i, 999); } //regular items starting with Orange Mail for(i = 121; i < 133; i++) { AddBagItem(i, 999); } //hold items starting with Brightpowder for(i = 179; i < 226; i++) { AddBagItem(i, 999); } //Contest Scarves (skipping a bunch of ??????????s) for(i = 254; i < 259; i++) { AddBagItem(i, 999); } //RSE key items that get used in FRLG, starting with Coin Case for(i = 260; i < 266; i++) { AddBagItem(i, 1); } //FRLG key items starting with Oak's Parcel for(i = 349; i < 375; i++) { AddBagItem(i, 1); } //berries for(i = 133; i < 176; i++) { AddBagItem(i, 999); } //TMs and HMs for(i = 289; i < 347; i++) { AddBagItem(i, 999); } //Old Sea Map AddBagItem(376, 1); //Link Bracelet AddBagItem(112, 1); } ================================================ FILE: src/script_menu.c ================================================ #include "global.h" #include "gflib.h" #include "menu.h" #include "task.h" #include "script_menu.h" #include "quest_log.h" #include "new_menu_helpers.h" #include "event_data.h" #include "script.h" #include "strings.h" #include "field_effect.h" #include "event_scripts.h" #include "constants/songs.h" #include "constants/seagallop.h" #include "constants/menu.h" #define GFXTAG_FOSSIL 7000 #define MULTICHOICE(name) {.list = name, .count = ARRAY_COUNT(name)} struct MultichoiceListStruct { const struct MenuAction * list; u8 count; }; static EWRAM_DATA u8 sDelay = 0; static void DrawVerticalMultichoiceMenu(u8 left, u8 top, u8 mcId, u8 ignoreBpress, u8 initPos); static u8 GetMCWindowHeight(u8 count); static void CreateMCMenuInputHandlerTask(u8 ignoreBpress, u8 count, u8 windowId, u8 mcId); static void Task_MultichoiceMenu_HandleInput(u8 taskId); static void MultiChoicePrintHelpDescription(u8 mcId); static void Task_YesNoMenu_HandleInput(u8 taskId); static void Hask_MultichoiceGridMenu_HandleInput(u8 taskId); static void CreatePCMenuWindow(void); static bool8 PicboxWait(void); static void DestroyScriptMenuWindow(u8 windowId); static u8 CreateWindowFromRect(u8 left, u8 top, u8 width, u8 height); static const struct MenuAction sMultichoiceList_YesNo[] = { { gText_Yes }, { gText_No } }; static const struct MenuAction sMultichoiceList_TrainerCardIconTint[] = { { gText_Normal }, { gText_Black }, { gText_Pink }, { gText_Sepia } }; static const struct MenuAction sMultichoiceList_HOF_Quit[] = { { gText_HallOfFame }, { gText_Quit } }; static const struct MenuAction sMultichoiceList_Eggs_Quit[] = { { gText_Eggs }, { gText_Quit } }; static const struct MenuAction sMultichoiceList_Victories_Quit[] = { { gText_Victories }, { gText_Quit } }; static const struct MenuAction sMultichoiceList_HOF_Eggs_Quit[] = { { gText_HallOfFame }, { gText_Eggs }, { gText_Quit } }; static const struct MenuAction sMultichoiceList_HOF_Victories_Quit[] = { { gText_HallOfFame }, { gText_Victories }, { gText_Quit } }; static const struct MenuAction sMultichoiceList_Eggs_Victories_Quit[] = { { gText_Eggs }, { gText_Victories }, { gText_Quit } }; static const struct MenuAction sMultichoiceList_HOF_Eggs_Victories_Quit[] = { { gText_HallOfFame }, { gText_Eggs }, { gText_Victories }, { gText_Quit } }; static const struct MenuAction sMultichoiceList_TrainerSchoolWhiteboard[] = { { gText_Slp }, { gText_Psn }, { gText_Par }, { gText_Brn }, { gText_Frz }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_YesNoInfo[] = { { gText_Yes }, { gText_No }, { gText_Info } }; static const struct MenuAction sMultichoiceList_SingleDoubleMultiInfoExit[] = { { gText_SingleBattle }, { gText_DoubleBattle }, { gText_MultiBattle }, { gText_Info }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_YesNoInfo2[] = { { gText_Yes }, { gText_No }, { gText_Info } }; static const struct MenuAction sMultichoiceList_ChallengeInfoExit[] = { { gText_MakeAChallenge }, { gText_Info_2 }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_RooftopB1F[] = { { gText_Rooftop }, { gText_B1F }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Helix[] = { { gText_HelixFossil }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Dome[] = { { gText_DomeFossil }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Amber[] = { { gText_OldAmber }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_HelixAmber[] = { { gText_HelixFossil }, { gText_OldAmber }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_DomeAmber[] = { { gText_DomeFossil }, { gText_OldAmber }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_HelixDome[] = { { gText_HelixFossil }, { gText_DomeFossil }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_HelixDomeAmber[] = { { gText_HelixFossil }, { gText_DomeFossil }, { gText_OldAmber }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_CeladonVendingMachine[] = { { gText_FreshWater_200 }, { gText_SodaPop_300 }, { gText_Lemonade_350 }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_GameCornerTMPrizes[] = { { gText_Tm13_4000Coins }, { gText_Tm23_3500Coins }, { gText_Tm24_4000Coins }, { gText_Tm30_4500Coins }, { gText_Tm35_4000Coins }, { gText_NoThanks_2 } }; static const struct MenuAction sMultichoiceList_GameCornerBattleItemPrizes[] = { { gText_SmokeBall_800Coins }, { gText_MiracleSeed_1000Coins }, { gText_Charcoal_1000Coins }, { gText_MysticWater_1000Coins }, { gText_YellowFlute_1600Coins }, { gText_NoThanks_2 } }; static const struct MenuAction sMultichoiceList_GameCornerCoinPurchaseCounter[] = { { gText_50Coins_1000 }, { gText_500Coins_10000 }, { gText_1000Coins_20000 }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Excellent_NotSoBad[] = { { gText_Excellent }, { gText_NotSoBad } }; static const struct MenuAction sMultichoiceList_RightLeft[] = { { gText_Right }, { gText_Left } }; static const struct MenuAction sMultichoiceList_DeptStoreElevator[] = { { gText_5F_2 }, { gText_4F_2 }, { gText_3F_2 }, { gText_2F_2 }, { gText_1F_2 }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_ThirstyGirlFreshWater[] = { { gText_FreshWater }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_ThirstyGirlSodaPop[] = { { gText_SodaPop }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_ThirstyGirlFreshWaterSodaPop[] = { { gText_FreshWater }, { gText_SodaPop }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_ThirstyGirlLemonade[] = { { gText_Lemonade }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_ThirstyGirlFreshWaterLemonade[] = { { gText_FreshWater }, { gText_Lemonade }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_ThirstyGirlSodaPopLemonade[] = { { gText_SodaPop }, { gText_Lemonade }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_ThirstyGirlFreshWaterSodaPopLemonade[] = { { gText_FreshWater }, { gText_SodaPop }, { gText_Lemonade }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Unref_Shards_0[] = { { gText_GreenShard }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Unref_Shards_1[] = { { gText_RedShard }, { gText_GreenShard }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Unref_Shards_2[] = { { gText_YellowShard }, { gText_GreenShard }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Unref_Shards_3[] = { { gText_RedShard }, { gText_YellowShard }, { gText_GreenShard }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Unref_Shards_4[] = { { gText_BlueShard }, { gText_GreenShard }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Unref_Shards_5[] = { { gText_RedShard }, { gText_BlueShard }, { gText_GreenShard }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Unref_Shards_6[] = { { gText_YellowShard }, { gText_BlueShard }, { gText_GreenShard }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Unref_Shards_7[] = { { gText_RedShard }, { gText_YellowShard }, { gText_BlueShard }, { gText_GreenShard }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Eeveelutions[] = { { gText_Eevee }, { gText_Flareon }, { gText_Jolteon }, { gText_Vaporeon }, { gText_QuitLooking } }; static const struct MenuAction sMultichoiceList_BikeShop[] = { { gText_Bicycle_Price }, { gText_NoThanks } }; static const struct MenuAction sMultichoiceList_GameCornerPokemonPrizes_FR[] = { { gText_Abra_180Coins }, { gText_Clefairy_500Coins }, { gText_Dratini_2800Coins }, { gText_Scyther_5500Coins }, { gText_Porygon_9999Coins }, { gText_NoThanks_2 } }; static const struct MenuAction sMultichoiceList_GameCornerPokemonPrizes_LG[] = { { gText_Abra_120Coins }, { gText_Clefairy_750Coins }, { gText_Pinsir_2500Coins }, { gText_Dratini_4600Coins }, { gText_Porygon_6500Coins }, { gText_NoThanks_2 } }; static const struct MenuAction sMultichoiceList_TradeCenter_Colosseum[] = { { gText_TradeCenter }, { gText_Colosseum }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Link_Wireless[] = { { gText_GameLinkCable }, { gText_Wireless }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_RocketHideoutElevator[] = { { gText_B1F }, { gText_B2F }, { gText_B4F }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_LinkedDirectUnion[] = { { gText_LinkedGamePlay }, { gText_DirectCorner }, { gText_UnionRoom }, { gOtherText_Quit } }; static const struct MenuAction sMultichoiceList_Island23[] = { { gText_TwoIsland }, { gText_ThreeIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Island13[] = { { gText_OneIsland }, { gText_ThreeIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Island12[] = { { gText_OneIsland }, { gText_TwoIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_TradeColosseumCrush[] = { { gText_TradeCenter }, { gText_Colosseum_2 }, { gText_BerryCrush }, { gOtherText_Exit } }; extern const u8 gText_BlueFlute_Ash[]; extern const u8 gText_YellowFlute_Ash[]; extern const u8 gText_RedFlute_Ash[]; extern const u8 gText_WhiteFlute_Ash[]; extern const u8 gText_BlackFlute_Ash[]; static const struct MenuAction sMultichoiceList_GlassWorkshopVendor[] = { { gText_BlueFlute_Ash }, { gText_YellowFlute_Ash }, { gText_RedFlute_Ash }, { gText_WhiteFlute_Ash }, { gText_BlackFlute_Ash }, { gText_SmallExit } }; static const struct MenuAction sMultichoiceList_TradeColosseum_2[] = { { gText_TradeCenter }, { gText_Colosseum_2 }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_PokejumpDodrio[] = { { gText_PokemonJump }, { gText_DodrioBerryPicking }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Mushrooms[] = { { gText_2Tinymushrooms }, { gText_1BigMushroom } }; static const struct MenuAction sMultichoiceList_TradeColosseumBlankCrush[] = { { gText_TradeCenter }, { gText_Colosseum_2 }, { gText_RecordCorner }, { gText_BerryCrush }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_TradeColosseumBlank[] = { { gText_TradeCenter }, { gText_Colosseum_2 }, { gText_RecordCorner }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Faraway[] = { { gText_FarawayIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Navel[] = { { gText_NavelRock }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_NavelFaraway[] = { { gText_NavelRock }, { gText_FarawayIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Seagallop123[] = { { gText_OneIsland }, { gText_TwoIsland }, { gText_ThreeIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SeagallopV23[] = { { gText_Vermilion }, { gText_TwoIsland }, { gText_ThreeIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SeagallopV13[] = { { gText_Vermilion }, { gText_OneIsland }, { gText_ThreeIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SeagallopV12[] = { { gText_Vermilion }, { gText_OneIsland }, { gText_TwoIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SeagallopVermilion[] = { { gText_Vermilion }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_JoinOrLead[] = { { gText_JoinGroup }, { gText_BecomeLeader }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_TrainerTowerMode[] = { { gOtherText_Single }, { gOtherText_Double }, { gOtherText_Knockout }, { gOtherText_Mixed }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SeviiOther[] = { { gText_SeviiIslands }, { gText_Other }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SeviiBattleTower[] = { { gText_SeviiIslands }, { gText_BattleTower }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SeviiBattleTowerOther[] = { { gText_SeviiIslands }, { gText_BattleTower }, { gText_Other }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Birth[] = { { gText_BirthIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_BirthFaraway[] = { { gText_BirthIsland }, { gText_FarawayIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_BirthNavel[] = { { gText_BirthIsland }, { gText_NavelRock }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_BattleTowerLevels[] = { { gText_Lv50 }, { gText_Lv100 }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_BirthNavelFaraway[] = { { gText_BirthIsland }, { gText_NavelRock }, { gText_FarawayIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_Southern[] = { { gText_SouthernIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SouthernFaraway[] = { { gText_SouthernIsland }, { gText_FarawayIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SouthernNavel[] = { { gText_SouthernIsland }, { gText_NavelRock }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SouthernNavelFaraway[] = { { gText_SouthernIsland }, { gText_NavelRock }, { gText_FarawayIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SouthernBirth[] = { { gText_SouthernIsland }, { gText_BirthIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SouthernBirthFaraway[] = { { gText_SouthernIsland }, { gText_BirthIsland }, { gText_FarawayIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SouthernBirthNavel[] = { { gText_SouthernIsland }, { gText_BirthIsland }, { gText_NavelRock }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_SouthernBirthNavelFaraway[] = { { gText_SouthernIsland }, { gText_BirthIsland }, { gText_NavelRock }, { gText_FarawayIsland }, { gOtherText_Exit } }; static const struct MenuAction sMultichoiceList_MasterYoungster[] = { { gText_WhoAreThey }, { gText_HowDoIBattleThem }, { gText_AboutTitles }, { gText_Nothing } }; static const struct MenuAction sMultichoiceList_Exit[] = { { gOtherText_Exit } }; static const struct MultichoiceListStruct sMultichoiceLists[] = { [MULTICHOICE_YES_NO] = MULTICHOICE(sMultichoiceList_YesNo), [MULTICHOICE_EEVEELUTIONS] = MULTICHOICE(sMultichoiceList_Eeveelutions), [MULTICHOICE_TRAINER_CARD_ICON_TINT] = MULTICHOICE(sMultichoiceList_TrainerCardIconTint), [MULTICHOICE_HOF_QUIT] = MULTICHOICE(sMultichoiceList_HOF_Quit), [MULTICHOICE_EGGS_QUIT] = MULTICHOICE(sMultichoiceList_Eggs_Quit), [MULTICHOICE_VICTORIES_QUIT] = MULTICHOICE(sMultichoiceList_Victories_Quit), [MULTICHOICE_HOF_EGGS_QUIT] = MULTICHOICE(sMultichoiceList_HOF_Eggs_Quit), [MULTICHOICE_HOF_VICTORIES_QUIT] = MULTICHOICE(sMultichoiceList_HOF_Victories_Quit), [MULTICHOICE_EGGS_VICTORIES_QUIT] = MULTICHOICE(sMultichoiceList_Eggs_Victories_Quit), [MULTICHOICE_HOF_EGGS_VICTORIES_QUIT] = MULTICHOICE(sMultichoiceList_HOF_Eggs_Victories_Quit), [MULTICHOICE_EXIT] = MULTICHOICE(sMultichoiceList_Exit), [MULTICHOICE_EXIT_2] = MULTICHOICE(sMultichoiceList_Exit), [MULTICHOICE_EXIT_3] = MULTICHOICE(sMultichoiceList_Exit), [MULTICHOICE_BIKE_SHOP] = MULTICHOICE(sMultichoiceList_BikeShop), [MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_FR] = MULTICHOICE(sMultichoiceList_GameCornerPokemonPrizes_FR), [MULTICHOICE_TRAINER_SCHOOL_WHITEBOARD] = MULTICHOICE(sMultichoiceList_TrainerSchoolWhiteboard), [MULTICHOICE_YES_NO_INFO] = MULTICHOICE(sMultichoiceList_YesNoInfo), [MULTICHOICE_SINGLE_DOUBLE_MULTI_INFO_EXIT] = MULTICHOICE(sMultichoiceList_SingleDoubleMultiInfoExit), [MULTICHOICE_YES_NO_INFO_2] = MULTICHOICE(sMultichoiceList_YesNoInfo2), [MULTICHOICE_CHALLENGE_INFO_EXIT] = MULTICHOICE(sMultichoiceList_ChallengeInfoExit), [MULTICHOICE_ROOFTOP_B1F] = MULTICHOICE(sMultichoiceList_RooftopB1F), [MULTICHOICE_HELIX] = MULTICHOICE(sMultichoiceList_Helix), [MULTICHOICE_DOME] = MULTICHOICE(sMultichoiceList_Dome), [MULTICHOICE_AMBER] = MULTICHOICE(sMultichoiceList_Amber), [MULTICHOICE_HELIX_AMBER] = MULTICHOICE(sMultichoiceList_HelixAmber), [MULTICHOICE_DOME_AMBER] = MULTICHOICE(sMultichoiceList_DomeAmber), [MULTICHOICE_CELADON_VENDING_MACHINE] = MULTICHOICE(sMultichoiceList_CeladonVendingMachine), [MULTICHOICE_GAME_CORNER_COIN_PURCHASE_COUNTER] = MULTICHOICE(sMultichoiceList_GameCornerCoinPurchaseCounter), [MULTICHOICE_EXCELLENT_NOT_SO_BAD] = MULTICHOICE(sMultichoiceList_Excellent_NotSoBad), [MULTICHOICE_RIGHT_LEFT] = MULTICHOICE(sMultichoiceList_RightLeft), [MULTICHOICE_GAME_CORNER_TMPRIZES] = MULTICHOICE(sMultichoiceList_GameCornerTMPrizes), [MULTICHOICE_DEPT_STORE_ELEVATOR] = MULTICHOICE(sMultichoiceList_DeptStoreElevator), [MULTICHOICE_THIRSTY_GIRL_FRESH_WATER] = MULTICHOICE(sMultichoiceList_ThirstyGirlFreshWater), [MULTICHOICE_THIRSTY_GIRL_SODA_POP] = MULTICHOICE(sMultichoiceList_ThirstyGirlSodaPop), [MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP] = MULTICHOICE(sMultichoiceList_ThirstyGirlFreshWaterSodaPop), [MULTICHOICE_THIRSTY_GIRL_LEMONADE] = MULTICHOICE(sMultichoiceList_ThirstyGirlLemonade), [MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_LEMONADE] = MULTICHOICE(sMultichoiceList_ThirstyGirlFreshWaterLemonade), [MULTICHOICE_THIRSTY_GIRL_SODA_POP_LEMONADE] = MULTICHOICE(sMultichoiceList_ThirstyGirlSodaPopLemonade), [MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP_LEMONADE] = MULTICHOICE(sMultichoiceList_ThirstyGirlFreshWaterSodaPopLemonade), [MULTICHOICE_TRADE_CENTER_COLOSSEUM] = MULTICHOICE(sMultichoiceList_TradeCenter_Colosseum), [MULTICHOICE_LINK_WIRELESS] = MULTICHOICE(sMultichoiceList_Link_Wireless), [MULTICHOICE_GAME_CORNER_BATTLE_ITEM_PRIZES] = MULTICHOICE(sMultichoiceList_GameCornerBattleItemPrizes), [MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR] = MULTICHOICE(sMultichoiceList_RocketHideoutElevator), [MULTICHOICE_LINKED_DIRECT_UNION] = MULTICHOICE(sMultichoiceList_LinkedDirectUnion), [MULTICHOICE_ISLAND_23] = MULTICHOICE(sMultichoiceList_Island23), [MULTICHOICE_ISLAND_13] = MULTICHOICE(sMultichoiceList_Island13), [MULTICHOICE_ISLAND_12] = MULTICHOICE(sMultichoiceList_Island12), [MULTICHOICE_TRADE_COLOSSEUM_CRUSH] = MULTICHOICE(sMultichoiceList_TradeColosseumCrush), [MULTICHOICE_GLASS_WORKSHOP_VENDOR] = MULTICHOICE(sMultichoiceList_GlassWorkshopVendor), [MULTICHOICE_POKEJUMP_DODRIO] = MULTICHOICE(sMultichoiceList_PokejumpDodrio), [MULTICHOICE_TRADE_COLOSSEUM_2] = MULTICHOICE(sMultichoiceList_TradeColosseum_2), [MULTICHOICE_MUSHROOMS] = MULTICHOICE(sMultichoiceList_Mushrooms), [MULTICHOICE_TRADE_COLOSSEUM_BLANK_CRUSH] = MULTICHOICE(sMultichoiceList_TradeColosseumBlankCrush), [MULTICHOICE_TRADE_COLOSSEUM_BLANK] = MULTICHOICE(sMultichoiceList_TradeColosseumBlank), [MULTICHOICE_FARAWAY] = MULTICHOICE(sMultichoiceList_Faraway), [MULTICHOICE_NAVEL] = MULTICHOICE(sMultichoiceList_Navel), [MULTICHOICE_NAVEL_FARAWAY] = MULTICHOICE(sMultichoiceList_NavelFaraway), [MULTICHOICE_SEAGALLOP_123] = MULTICHOICE(sMultichoiceList_Seagallop123), [MULTICHOICE_SEAGALLOP_V23] = MULTICHOICE(sMultichoiceList_SeagallopV23), [MULTICHOICE_SEAGALLOP_V13] = MULTICHOICE(sMultichoiceList_SeagallopV13), [MULTICHOICE_SEAGALLOP_V12] = MULTICHOICE(sMultichoiceList_SeagallopV12), [MULTICHOICE_SEAGALLOP_VERMILION] = MULTICHOICE(sMultichoiceList_SeagallopVermilion), [MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_LG] = MULTICHOICE(sMultichoiceList_GameCornerPokemonPrizes_LG), [MULTICHOICE_JOIN_OR_LEAD] = MULTICHOICE(sMultichoiceList_JoinOrLead), [MULTICHOICE_TRAINER_TOWER_MODE] = MULTICHOICE(sMultichoiceList_TrainerTowerMode), [MULTICHOICE_BATTLE_TOWER_LEVELS] = MULTICHOICE(sMultichoiceList_BattleTowerLevels), [MULTICHOICE_HELIX_DOME] = MULTICHOICE(sMultichoiceList_HelixDome), [MULTICHOICE_HELIX_DOME_AMBER] = MULTICHOICE(sMultichoiceList_HelixDomeAmber), [MULTICHOICE_SEVII_OTHER] = MULTICHOICE(sMultichoiceList_SeviiOther), [MULTICHOICE_SEVII_BATTLE_TOWER] = MULTICHOICE(sMultichoiceList_SeviiBattleTower), [MULTICHOICE_SEVII_BATTLE_TOWER_OTHER] = MULTICHOICE(sMultichoiceList_SeviiBattleTowerOther), [MULTICHOICE_BIRTH] = MULTICHOICE(sMultichoiceList_Birth), [MULTICHOICE_BIRTH_FARAWAY] = MULTICHOICE(sMultichoiceList_BirthFaraway), [MULTICHOICE_BIRTH_NAVEL] = MULTICHOICE(sMultichoiceList_BirthNavel), [MULTICHOICE_BIRTH_NAVEL_FARAWAY] = MULTICHOICE(sMultichoiceList_BirthNavelFaraway), [MULTICHOICE_SOUTHERN] = MULTICHOICE(sMultichoiceList_Southern), [MULTICHOICE_SOUTHERN_FARAWAY] = MULTICHOICE(sMultichoiceList_SouthernFaraway), [MULTICHOICE_SOUTHERN_NAVEL] = MULTICHOICE(sMultichoiceList_SouthernNavel), [MULTICHOICE_SOUTHERN_NAVEL_FARAWAY] = MULTICHOICE(sMultichoiceList_SouthernNavelFaraway), [MULTICHOICE_SOUTHERN_BIRTH] = MULTICHOICE(sMultichoiceList_SouthernBirth), [MULTICHOICE_SOUTHERN_BIRTH_FARAWAY] = MULTICHOICE(sMultichoiceList_SouthernBirthFaraway), [MULTICHOICE_SOUTHERN_BIRTH_NAVEL] = MULTICHOICE(sMultichoiceList_SouthernBirthNavel), [MULTICHOICE_SOUTHERN_BIRTH_NAVEL_FARAWAY] = MULTICHOICE(sMultichoiceList_SouthernBirthNavelFaraway), [MULTICHOICE_MASTER_YOUNGSTER] = MULTICHOICE(sMultichoiceList_MasterYoungster), }; // From Cool to Berries goes unused const u8 *const gStdStringPtrs[] = { [STDSTRING_COOL] = gText_Cool, [STDSTRING_BEAUTY] = gText_Beauty, [STDSTRING_CUTE] = gText_Cute, [STDSTRING_SMART] = gText_Smart, [STDSTRING_TOUGH] = gText_Tough, [STDSTRING_COOL2] = gText_Cool_2, [STDSTRING_BEAUTY2] = gText_Beauty_2, [STDSTRING_CUTE2] = gText_Cute_2, [STDSTRING_SMART2] = gText_Smart_2, [STDSTRING_TOUGH2] = gText_Tough_2, [STDSTRING_ITEMS] = gText_Items, [STDSTRING_KEY_ITEMS] = gText_KeyItems, [STDSTRING_POKEBALLS] = gText_PokeBalls, [STDSTRING_TMHMS] = gText_TMsAndHMs, [STDSTRING_BERRIES] = gText_Berries, [STDSTRING_BOULDER_BADGE] = gText_Boulderbadge, [STDSTRING_CASCADE_BADGE] = gText_Cascadebadge, [STDSTRING_THUNDER_BADGE] = gText_Thunderbadge, [STDSTRING_RAINBOW_BADGE] = gText_Rainbowbadge, [STDSTRING_SOUL_BADGE] = gText_Soulbadge, [STDSTRING_MARSH_BADGE] = gText_Marshbadge, [STDSTRING_VOLCANO_BADGE] = gText_Volcanobadge, [STDSTRING_EARTH_BADGE] = gText_Earthbadge, [STDSTRING_COINS] = gText_Coins_2, [STDSTRING_ITEMS_POCKET] = gText_ItemsPocket, [STDSTRING_KEY_ITEMS_POCKET] = gText_KeyItemsPocket, [STDSTRING_POKEBALLS_POCKET] = gText_PokeBallsPocket, [STDSTRING_TM_CASE] = gText_TmCase, [STDSTRING_BERRY_POUCH] = gText_BerryPouch_2, [STDSTRING_MEDICINE_POCKET] = gText_MedicinePocket, [STDSTRING_HELD_ITEMS_POCKET] = gText_HeldItemsPocket }; static const u8 *const sDescriptionPtrs_CableClub_TradeBattleCancel[] = { CableClub_Text_TradeMonsUsingLinkCable, CableClub_Text_BattleUsingLinkCable, CableClub_Text_CancelSelectedItem }; static const u8 *const sDescriptionPtrs_WirelessCenter_TradeBattleCrushCancel[] = { CableClub_Text_YouMayTradeHere, CableClub_Text_YouMayBattleHere, CableClub_Text_CanMakeBerryPowder, CableClub_Text_CancelSelectedItem }; static const u8 *const sDescriptionPtrs_WirelessCenter_TradeBattleCancel[] = { CableClub_Text_YouMayTradeHere, CableClub_Text_YouMayBattleHere, CableClub_Text_CancelSelectedItem }; static const union AnimCmd sMuseumFossilAnim0[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_END }; static const union AnimCmd *const sMuseumFossilAnimCmdTable[] = { sMuseumFossilAnim0 }; static const struct OamData sMuseumFossilOamData = { .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64) }; static const struct SpriteTemplate sMuseumFossilSprTemplate = { .tileTag = GFXTAG_FOSSIL, .paletteTag = TAG_NONE, .oam = &sMuseumFossilOamData, .anims = sMuseumFossilAnimCmdTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const u16 sMuseumAerodactylSprTiles[] = INCBIN_U16("graphics/script_menu/aerodactyl_fossil.4bpp"); static const u16 sMuseumAerodactylSprPalette[] = INCBIN_U16("graphics/script_menu/aerodactyl_fossil.gbapal"); static const u16 sMuseumKabutopsSprTiles[] = INCBIN_U16("graphics/script_menu/kabutops_fossil.4bpp"); static const u16 sMuseumKabutopsSprPalette[] = INCBIN_U16("graphics/script_menu/kabutops_fossil.gbapal"); static const struct SpriteSheet sMuseumKabutopsSprSheets[] = { {sMuseumKabutopsSprTiles, sizeof(sMuseumKabutopsSprTiles), GFXTAG_FOSSIL}, {} }; static const struct SpriteSheet sMuseumAerodactylSprSheets[] = { {sMuseumAerodactylSprTiles, sizeof(sMuseumAerodactylSprTiles), GFXTAG_FOSSIL}, {} }; static const u8 *const sSeagallopDestStrings[] = { [SEAGALLOP_VERMILION_CITY] = gText_Vermilion, [SEAGALLOP_ONE_ISLAND] = gText_OneIsland, [SEAGALLOP_TWO_ISLAND] = gText_TwoIsland, [SEAGALLOP_THREE_ISLAND] = gText_ThreeIsland, [SEAGALLOP_FOUR_ISLAND] = gText_FourIsland, [SEAGALLOP_FIVE_ISLAND] = gText_FiveIsland, [SEAGALLOP_SIX_ISLAND] = gText_SixIsland, [SEAGALLOP_SEVEN_ISLAND] = gText_SevenIsland, }; static u16 GetStringTilesWide(const u8 *str) { return (GetStringWidth(FONT_NORMAL_COPY_1, str, 0) + 7) / 8; } static u8 GetMenuWidthFromList(const struct MenuAction * items, u8 count) { u32 i; u8 width = GetStringTilesWide(items[0].text); u8 tmp; for (i = 1; i < count; i++) { tmp = GetStringTilesWide(items[i].text); if (width < tmp) width = tmp; } return width; } bool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 mcId, u8 ignoreBpress) { if (FuncIsActiveTask(Task_MultichoiceMenu_HandleInput) == TRUE) return FALSE; gSpecialVar_Result = SCR_MENU_UNSET; DrawVerticalMultichoiceMenu(left, top, mcId, ignoreBpress, 0); return TRUE; } bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 mcId, u8 ignoreBpress, u8 cursorPos) { if (FuncIsActiveTask(Task_MultichoiceMenu_HandleInput) == TRUE) return FALSE; gSpecialVar_Result = SCR_MENU_UNSET; DrawVerticalMultichoiceMenu(left, top, mcId, ignoreBpress, cursorPos); return TRUE; } static void DrawVerticalMultichoiceMenu(u8 left, u8 top, u8 mcId, u8 ignoreBpress, u8 initPos) { s32 i; s32 strWidth; s32 tmp; u8 width; u8 height; u8 count; u8 windowId; const struct MenuAction * list; if ((ignoreBpress & 2) || QL_AvoidDisplay(QL_DestroyAbortedDisplay) != TRUE) { ignoreBpress &= 1; count = sMultichoiceLists[mcId].count; list = sMultichoiceLists[mcId].list; strWidth = 0; for (i = 0; i < count; i++) { tmp = GetStringWidth(FONT_NORMAL, list[i].text, 0); if (tmp > strWidth) strWidth = tmp; } width = (strWidth + 9) / 8 + 1; if (left + width > 28) left = 28 - width; height = GetMCWindowHeight(count); windowId = CreateWindowFromRect(left, top, width, height); SetStdWindowBorderStyle(windowId, FALSE); if (mcId == MULTICHOICE_GAME_CORNER_TMPRIZES || mcId == MULTICHOICE_BIKE_SHOP || mcId == MULTICHOICE_GAME_CORNER_BATTLE_ITEM_PRIZES) MultichoiceList_PrintItems(windowId, FONT_NORMAL, 8, 2, 14, count, list, 0, 2); else MultichoiceList_PrintItems(windowId, FONT_NORMAL, 8, 2, 14, count, list, 0, 2); Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 14, count, initPos); CreateMCMenuInputHandlerTask(ignoreBpress, count, windowId, mcId); ScheduleBgCopyTilemapToVram(0); } } static u8 GetMCWindowHeight(u8 count) { switch (count) { case 0: return 1; case 1: return 2; case 2: return 4; case 3: return 6; case 4: return 7; case 5: return 9; case 6: return 11; case 7: return 13; case 8: return 14; default: return 1; } } #define tTimer data[2] #define tIgnoreBPress data[4] #define tWrapAround data[5] #define tWindowId data[6] #define tMultichoiceId data[7] static void CreateMCMenuInputHandlerTask(u8 ignoreBpress, u8 count, u8 windowId, u8 mcId) { u8 taskId; if (mcId == MULTICHOICE_TRADE_CENTER_COLOSSEUM || mcId == MULTICHOICE_TRADE_COLOSSEUM_CRUSH || mcId == MULTICHOICE_TRADE_COLOSSEUM_2) sDelay = 12; else sDelay = 0; taskId = CreateTask(Task_MultichoiceMenu_HandleInput, 80); gTasks[taskId].tIgnoreBPress = ignoreBpress; if (count > 3) gTasks[taskId].tWrapAround = TRUE; else gTasks[taskId].tWrapAround = FALSE; gTasks[taskId].tWindowId = windowId; gTasks[taskId].tMultichoiceId = mcId; MultiChoicePrintHelpDescription(mcId); } static void Task_MultichoiceMenu_HandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; s8 input; if (!gPaletteFade.active) { if (sDelay != 0) sDelay--; else { if (tWrapAround == FALSE) input = Menu_ProcessInputNoWrapAround(); else input = Menu_ProcessInput(); if (JOY_NEW(DPAD_UP | DPAD_DOWN)) MultiChoicePrintHelpDescription(tMultichoiceId); switch (input) { case MENU_NOTHING_CHOSEN: return; case MENU_B_PRESSED: if (tIgnoreBPress) return; PlaySE(SE_SELECT); gSpecialVar_Result = SCR_MENU_CANCEL; break; default: gSpecialVar_Result = input; break; } DestroyScriptMenuWindow(tWindowId); DestroyTask(taskId); ScriptContext_Enable(); } } } static void MultiChoicePrintHelpDescription(u8 mcId) { switch (mcId) { case MULTICHOICE_TRADE_CENTER_COLOSSEUM: FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, sDescriptionPtrs_CableClub_TradeBattleCancel[Menu_GetCursorPos()], 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); break; case MULTICHOICE_TRADE_COLOSSEUM_CRUSH: FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, sDescriptionPtrs_WirelessCenter_TradeBattleCrushCancel[Menu_GetCursorPos()], 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); break; case MULTICHOICE_TRADE_COLOSSEUM_2: FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, sDescriptionPtrs_WirelessCenter_TradeBattleCancel[Menu_GetCursorPos()], 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); break; } } bool8 ScriptMenu_YesNo(u8 unused, u8 stuff) { if (FuncIsActiveTask(Task_YesNoMenu_HandleInput) == TRUE) return FALSE; gSpecialVar_Result = SCR_MENU_UNSET; if (QL_AvoidDisplay(QL_DestroyAbortedDisplay)) return TRUE; DisplayYesNoMenuDefaultYes(); CreateTask(Task_YesNoMenu_HandleInput, 80); return TRUE; } // Unused static bool8 IsScriptActive(void) { if (gSpecialVar_Result == SCR_MENU_UNSET) return FALSE; else return TRUE; } static void Task_YesNoMenu_HandleInput(u8 taskId) { s8 input; if (gTasks[taskId].tTimer < 5) { gTasks[taskId].tTimer++; } else { input = Menu_ProcessInputNoWrapClearOnChoose(); switch (input) { case MENU_NOTHING_CHOSEN: return; case MENU_B_PRESSED: case 1: // NO PlaySE(SE_SELECT); gSpecialVar_Result = FALSE; break; case 0: // YES gSpecialVar_Result = TRUE; break; } DestroyTask(taskId); ScriptContext_Enable(); } } bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBpress, u8 columnCount) { const struct MenuAction * list; u8 count; u8 width; u8 rowCount; u8 taskId; if (FuncIsActiveTask(Hask_MultichoiceGridMenu_HandleInput) == TRUE) return FALSE; gSpecialVar_Result = SCR_MENU_UNSET; if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE) return TRUE; list = sMultichoiceLists[multichoiceId].list; count = sMultichoiceLists[multichoiceId].count; width = GetMenuWidthFromList(list, count) + 1; rowCount = count / columnCount; taskId = CreateTask(Hask_MultichoiceGridMenu_HandleInput, 80); gTasks[taskId].tIgnoreBPress = ignoreBpress; gTasks[taskId].tWindowId = CreateWindowFromRect(left, top, width * columnCount, rowCount * 2); SetStdWindowBorderStyle(gTasks[taskId].tWindowId, FALSE); MultichoiceGrid_PrintItems(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, width * 8, 16, columnCount, rowCount, list); MultichoiceGrid_InitCursor(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, 0, 1, width * 8, columnCount, rowCount, 0); ScheduleBgCopyTilemapToVram(0); return TRUE; } static void Hask_MultichoiceGridMenu_HandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; s8 input = Menu_ProcessInputGridLayout(); switch (input) { case MENU_NOTHING_CHOSEN: return; case MENU_B_PRESSED: if (tIgnoreBPress) return; PlaySE(SE_SELECT); gSpecialVar_Result = SCR_MENU_CANCEL; break; default: gSpecialVar_Result = input; break; } DestroyScriptMenuWindow(tWindowId); DestroyTask(taskId); ScriptContext_Enable(); } #undef tIgnoreBPress #undef tWrapAround #undef tWindowId #undef tMultichoiceId #define tState data[0] #define tSpecies data[1] #define tSpriteId data[2] #define tWindowId data[5] bool8 CreatePCMenu(void) { if (FuncIsActiveTask(Task_MultichoiceMenu_HandleInput) == TRUE) return FALSE; gSpecialVar_Result = SCR_MENU_UNSET; CreatePCMenuWindow(); return TRUE; } static void CreatePCMenuWindow(void) { u8 cursorWidth = GetMenuCursorDimensionByFont(FONT_NORMAL, 0); u8 height = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT); u8 windowWidth; u8 numItems; u8 windowId; switch (GetStringTilesWide(gText_SPc)) { default: if (FlagGet(FLAG_SYS_POKEDEX_GET)) windowWidth = 14; else windowWidth = 13; break; case 9: case 10: windowWidth = 14; break; } if (FlagGet(FLAG_SYS_GAME_CLEAR)) { numItems = 5; windowId = CreateWindowFromRect(0, 0, windowWidth, 10); SetStdWindowBorderStyle(windowId, FALSE); AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_ProfOakSPc, cursorWidth, 34, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_HallOfFame_2, cursorWidth, 50, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_LogOff, cursorWidth, 66, TEXT_SKIP_DRAW, NULL); } else { if (FlagGet(FLAG_SYS_POKEDEX_GET)) numItems = 4; else numItems = 3; windowId = CreateWindowFromRect(0, 0, windowWidth, numItems * 2); SetStdWindowBorderStyle(windowId, FALSE); if (FlagGet(FLAG_SYS_POKEDEX_GET)) AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_ProfOakSPc, cursorWidth, 34, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_LogOff, cursorWidth, 2 + 16 * (numItems - 1), TEXT_SKIP_DRAW, NULL); } if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC)) AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_BillSPc, cursorWidth, 2 , TEXT_SKIP_DRAW, NULL); else AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_SomeoneSPc, cursorWidth, 2 , TEXT_SKIP_DRAW, NULL); StringExpandPlaceholders(gStringVar4, gText_SPc); Menu_PrintFormatIntlPlayerName(windowId, gStringVar4, cursorWidth, 18); Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, numItems, 0); CreateMCMenuInputHandlerTask(FALSE, numItems, windowId, MULTICHOICE_NONE); ScheduleBgCopyTilemapToVram(0); } void ScriptMenu_DisplayPCStartupPrompt(void) { LoadMessageBoxAndFrameGfx(0, TRUE); AddTextPrinterParameterized2(0, FONT_NORMAL, Text_AccessWhichPC, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); } static void Task_ScriptShowMonPic(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: task->tState++; break; case 1: break; case 2: FreeResourcesAndDestroySprite(&gSprites[task->tSpriteId], task->tSpriteId); task->tState++; break; case 3: DestroyScriptMenuWindow(task->tWindowId); DestroyTask(taskId); break; } } bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y) { u8 spriteId; u8 taskId; if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE) return TRUE; if (FindTaskIdByFunc(Task_ScriptShowMonPic) != TASK_NONE) return FALSE; spriteId = CreateMonSprite_PicBox(species, 8 * x + 40, 8 * y + 40, FALSE); taskId = CreateTask(Task_ScriptShowMonPic, 80); gTasks[taskId].tWindowId = CreateWindowFromRect(x, y, 8, 8); gTasks[taskId].tState = 0; gTasks[taskId].tSpecies = species; gTasks[taskId].tSpriteId = spriteId; gSprites[spriteId].callback = SpriteCallbackDummy; gSprites[spriteId].oam.priority = 0; SetStdWindowBorderStyle(gTasks[taskId].tWindowId, TRUE); ScheduleBgCopyTilemapToVram(0); return TRUE; } bool8 (*ScriptMenu_HidePokemonPic(void))(void) { u8 taskId = FindTaskIdByFunc(Task_ScriptShowMonPic); if (taskId == TASK_NONE) return NULL; gTasks[taskId].tState++; return PicboxWait; } static bool8 PicboxWait(void) { if (FindTaskIdByFunc(Task_ScriptShowMonPic) == TASK_NONE) return TRUE; else return FALSE; } void PicboxCancel(void) { u8 taskId = FindTaskIdByFunc(Task_ScriptShowMonPic); struct Task *task; if (taskId != TASK_NONE) { task = &gTasks[taskId]; switch (task->tState) { case 0: case 1: case 2: FreeResourcesAndDestroySprite(&gSprites[task->tSpriteId], task->tSpriteId); DestroyScriptMenuWindow(task->tWindowId); DestroyTask(taskId); break; case 3: DestroyScriptMenuWindow(task->tWindowId); DestroyTask(taskId); break; } } } void Task_WaitMuseumFossilPic(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->tState) { case 0: task->tState++; break; case 1: break; case 2: DestroySprite(&gSprites[task->tSpriteId]); FreeSpriteTilesByTag(GFXTAG_FOSSIL); task->tState++; break; case 3: DestroyScriptMenuWindow(task->tWindowId); DestroyTask(taskId); break; } } #define FOSSIL_PIC_PAL_NUM 13 bool8 OpenMuseumFossilPic(void) { u8 spriteId; u8 taskId; if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE) return TRUE; if (FindTaskIdByFunc(Task_WaitMuseumFossilPic) != TASK_NONE) return FALSE; if (gSpecialVar_0x8004 == SPECIES_KABUTOPS) { LoadSpriteSheets(sMuseumKabutopsSprSheets); LoadPalette(sMuseumKabutopsSprPalette, OBJ_PLTT_ID(FOSSIL_PIC_PAL_NUM), sizeof(sMuseumKabutopsSprPalette)); } else if (gSpecialVar_0x8004 == SPECIES_AERODACTYL) { LoadSpriteSheets(sMuseumAerodactylSprSheets); LoadPalette(sMuseumAerodactylSprPalette, OBJ_PLTT_ID(FOSSIL_PIC_PAL_NUM), sizeof(sMuseumAerodactylSprPalette)); } else { return FALSE; } spriteId = CreateSprite(&sMuseumFossilSprTemplate, gSpecialVar_0x8005 * 8 + 40, gSpecialVar_0x8006 * 8 + 40, 0); gSprites[spriteId].oam.paletteNum = FOSSIL_PIC_PAL_NUM; taskId = CreateTask(Task_WaitMuseumFossilPic, 80); gTasks[taskId].tWindowId = CreateWindowFromRect(gSpecialVar_0x8005, gSpecialVar_0x8006, 8, 8); gTasks[taskId].tState = 0; gTasks[taskId].tSpriteId = spriteId; SetStdWindowBorderStyle(gTasks[taskId].tWindowId, TRUE); ScheduleBgCopyTilemapToVram(0); return TRUE; } bool8 CloseMuseumFossilPic(void) { u8 taskId = FindTaskIdByFunc(Task_WaitMuseumFossilPic); if (taskId == TASK_NONE) return FALSE; gTasks[taskId].tState++; return TRUE; } static u8 CreateWindowFromRect(u8 left, u8 top, u8 width, u8 height) { struct WindowTemplate template = SetWindowTemplateFields(0, left + 1, top + 1, width, height, 15, 0x038); u8 windowId = AddWindow(&template); PutWindowTilemap(windowId); return windowId; } static void DestroyScriptMenuWindow(u8 windowId) { ClearWindowTilemap(windowId); ClearStdWindowAndFrameToTransparent(windowId, TRUE); RemoveWindow(windowId); } void QL_DestroyAbortedDisplay(void) { u8 taskId; s16 *data; ScriptContext_SetupScript(EventScript_ReleaseEnd); taskId = FindTaskIdByFunc(Task_ScriptShowMonPic); if (taskId != TASK_NONE) { data = gTasks[taskId].data; if (tState < 2) FreeResourcesAndDestroySprite(&gSprites[tSpriteId], tSpriteId); } taskId = FindTaskIdByFunc(Task_WaitMuseumFossilPic); if (taskId != TASK_NONE) { data = gTasks[taskId].data; if (tState < 2) { DestroySprite(&gSprites[tSpriteId]); FreeSpriteTilesByTag(GFXTAG_FOSSIL); } } } void DrawSeagallopDestinationMenu(void) { // 8004 = Starting location // 8005 = Page (0: Verm, One, Two, Three, Four, Other, Exit; 1: Four, Five, Six, Seven, Other, Exit) u8 destinationId; u8 top; u8 numItems; u8 cursorWidth; u8 fontHeight; u8 windowId; u32 i; gSpecialVar_Result = SCR_MENU_UNSET; if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE) return; if (gSpecialVar_0x8005 == 1) { if (gSpecialVar_0x8004 < SEAGALLOP_FIVE_ISLAND) destinationId = SEAGALLOP_FIVE_ISLAND; else destinationId = SEAGALLOP_FOUR_ISLAND; numItems = 5; top = 2; } else { destinationId = SEAGALLOP_VERMILION_CITY; numItems = 6; top = 0; } cursorWidth = GetMenuCursorDimensionByFont(FONT_NORMAL, 0); fontHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT); windowId = CreateWindowFromRect(17, top, 11, numItems * 2); SetStdWindowBorderStyle(windowId, FALSE); // -2 excludes "Other" and "Exit", appended after the loop for (i = 0; i < numItems - 2; i++) { if (destinationId != gSpecialVar_0x8004) AddTextPrinterParameterized(windowId, FONT_NORMAL, sSeagallopDestStrings[destinationId], cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL); else i--; destinationId++; // Wrap around if (destinationId == SEAGALLOP_SEVEN_ISLAND + 1) destinationId = SEAGALLOP_VERMILION_CITY; } AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_Other, cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL); i++; AddTextPrinterParameterized(windowId, FONT_NORMAL, gOtherText_Exit, cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL); Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, numItems, 0); CreateMCMenuInputHandlerTask(FALSE, numItems, windowId, MULTICHOICE_NONE); ScheduleBgCopyTilemapToVram(0); } u16 GetSelectedSeagallopDestination(void) { // 8004 = Starting location // 8005 = Page (0: Verm, One, Two, Three, Four, Other, Exit; 1: Four, Five, Six, Seven, Other, Exit) if (gSpecialVar_Result == SCR_MENU_CANCEL) return SCR_MENU_CANCEL; if (gSpecialVar_0x8005 == 1) { if (gSpecialVar_Result == 3) { return SEAGALLOP_MORE; } else if (gSpecialVar_Result == 4) { return SCR_MENU_CANCEL; } else if (gSpecialVar_Result == 0) { if (gSpecialVar_0x8004 > SEAGALLOP_FOUR_ISLAND) return SEAGALLOP_FOUR_ISLAND; else return SEAGALLOP_FIVE_ISLAND; } else if (gSpecialVar_Result == 1) { if (gSpecialVar_0x8004 > SEAGALLOP_FIVE_ISLAND) return SEAGALLOP_FIVE_ISLAND; else return SEAGALLOP_SIX_ISLAND; } else if (gSpecialVar_Result == 2) { if (gSpecialVar_0x8004 > SEAGALLOP_SIX_ISLAND) return SEAGALLOP_SIX_ISLAND; else return SEAGALLOP_SEVEN_ISLAND; } } else { if (gSpecialVar_Result == 4) return SEAGALLOP_MORE; else if (gSpecialVar_Result == 5) return SCR_MENU_CANCEL; else if (gSpecialVar_Result >= gSpecialVar_0x8004) return gSpecialVar_Result + 1; else return gSpecialVar_Result; } return SEAGALLOP_VERMILION_CITY; } ================================================ FILE: src/script_movement.c ================================================ #include "global.h" #include "task.h" #include "util.h" #include "event_object_movement.h" #include "constants/event_objects.h" #include "constants/event_object_movement.h" static EWRAM_DATA const u8 (*sMovementScripts[OBJECT_EVENTS_COUNT]) = {}; static void ScriptMovement_StartMoveObjects(u8 priority); static u8 GetMoveObjectsTaskId(void); static u8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript); static u8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId); static bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId); static void ScriptMovement_MoveObjects(u8 taskId); static void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript); static void ScriptMovement_UnfreezeActiveObjects(u8 taskId); static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript); bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript) { u8 objEventId; if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId)) return TRUE; if (!FuncIsActiveTask(ScriptMovement_MoveObjects)) ScriptMovement_StartMoveObjects(50); return ScriptMovement_TryAddNewMovement(GetMoveObjectsTaskId(), objEventId, movementScript); } bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapGroup) { u8 objEventId; u8 taskId; u8 moveScrId; if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId)) return TRUE; taskId = GetMoveObjectsTaskId(); moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId); if (moveScrId == OBJECT_EVENTS_COUNT) return TRUE; return IsMovementScriptFinished(taskId, moveScrId); } void ScriptMovement_UnfreezeObjectEvents(void) { u8 taskId = GetMoveObjectsTaskId(); if (taskId != TAIL_SENTINEL) { ScriptMovement_UnfreezeActiveObjects(taskId); DestroyTask(taskId); } } void ScriptMovement_StartMoveObjects(u8 priority) { u32 i; u8 taskId = CreateTask(ScriptMovement_MoveObjects, priority); for (i = 1; i < NUM_TASK_DATA; i++) { gTasks[taskId].data[i] = -1; } } u8 GetMoveObjectsTaskId(void) { return FindTaskIdByFunc(ScriptMovement_MoveObjects); } bool8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript) { u8 moveScrId; moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId); if (moveScrId != OBJECT_EVENTS_COUNT) { if (IsMovementScriptFinished(taskId, moveScrId) == FALSE) { return TRUE; } else { ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript); return FALSE; } } moveScrId = GetMovementScriptIdFromObjectEventId(taskId, OBJ_EVENT_ID_PLAYER); if (moveScrId == OBJECT_EVENTS_COUNT) { return TRUE; } else { ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript); return FALSE; } } u8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId) { u32 i; u8 *moveScriptId = (u8 *)&gTasks[taskId].data[1]; for (i = 0; i < OBJECT_EVENTS_COUNT; i++, moveScriptId++) { if (*moveScriptId == objEventId) return i; } return OBJECT_EVENTS_COUNT; } void LoadObjectEventIdPtrFromMovementScript(u8 taskId, u8 moveScrId, u8 **pObjEventId) { u32 i; *pObjEventId = (u8 *)&gTasks[taskId].data[1]; for (i = 0; i < moveScrId; i++, (*pObjEventId)++) ; } void SetObjectEventIdAtMovementScript(u8 taskId, u8 moveScrId, u8 objEventId) { u8 *ptr; LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr); *ptr = objEventId; } void LoadObjectEventIdFromMovementScript(u8 taskId, u8 moveScrId, u8 *objEventId) { u8 *ptr; LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr); *objEventId = *ptr; } static void ClearMovementScriptFinished(u8 taskId, u8 moveScrId) { u16 mask = ~gBitTable[moveScrId]; gTasks[taskId].data[0] &= mask; } static void SetMovementScriptFinished(u8 taskId, u8 moveScrId) { gTasks[taskId].data[0] |= gBitTable[moveScrId]; } static bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId) { u16 moveScriptFinished = (u16)gTasks[taskId].data[0] & gBitTable[moveScrId]; if (moveScriptFinished != 0) return TRUE; else return FALSE; } static void SetMovementScript(u8 moveScrId, const u8 *movementScript) { sMovementScripts[moveScrId] = movementScript; } static const u8 *GetMovementScript(u8 moveScrId) { return sMovementScripts[moveScrId]; } static void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript) { ClearMovementScriptFinished(taskId, moveScrId); SetMovementScript(moveScrId, movementScript); SetObjectEventIdAtMovementScript(taskId, moveScrId, objEventId); } static void ScriptMovement_UnfreezeActiveObjects(u8 taskId) { u8 *pObjEventId; u32 i; pObjEventId = (u8 *)&gTasks[taskId].data[1]; for (i = 0; i < OBJECT_EVENTS_COUNT; i++, pObjEventId++) { if (*pObjEventId != 0xFF) UnfreezeObjectEvent(&gObjectEvents[*pObjEventId]); } } static void ScriptMovement_MoveObjects(u8 taskId) { u32 i; u8 objEventId; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { LoadObjectEventIdFromMovementScript(taskId, i, &objEventId); if (objEventId != 0xFF) ScriptMovement_TakeStep(taskId, i, objEventId, GetMovementScript(i)); } } static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript) { u8 nextMoveActionId; if (IsMovementScriptFinished(taskId, moveScrId) == TRUE) return; if (ObjectEventIsHeldMovementActive(&gObjectEvents[objEventId]) && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objEventId])) return; nextMoveActionId = *movementScript; if (nextMoveActionId == MOVEMENT_ACTION_STEP_END) { SetMovementScriptFinished(taskId, moveScrId); FreezeObjectEvent(&gObjectEvents[objEventId]); } else { if (!ObjectEventSetHeldMovement(&gObjectEvents[objEventId], nextMoveActionId)) { movementScript++; SetMovementScript(moveScrId, movementScript); } } } ================================================ FILE: src/script_pokemon_util.c ================================================ #include "global.h" #include "gflib.h" #include "battle_setup.h" #include "berry.h" #include "daycare.h" #include "event_data.h" #include "load_save.h" #include "overworld.h" #include "party_menu.h" #include "pokedex.h" #include "script_pokemon_util.h" #include "constants/items.h" #include "constants/maps.h" #include "constants/species.h" #include "constants/pokemon.h" #include "constants/region_map_sections.h" static void CB2_ReturnFromChooseHalfParty(void); static void CB2_ReturnFromChooseBattleTowerParty(void); #define IN_OAKS_LAB \ (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB) \ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB)) \ void HealPlayerParty(void) { u8 i, j; u8 ppBonuses; u8 arg[4]; if(gSaveBlock1Ptr->keyFlags.noPMC == 0 && gSaveBlock1Ptr->keyFlags.nuzlocke == 0) { HealPlayerPartyOak(); return; } if(gSaveBlock1Ptr->keyFlags.noPMC == 1 && !FlagGet(FLAG_SYS_IS_LINKING)) { //do nothing if noPMC on and not linking return; } // restore HP. for(i = 0; i < gPlayerPartyCount; i++) { u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); arg[0] = maxHP; arg[1] = maxHP >> 8; if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0 && !FlagGet(FLAG_SYS_IS_LINKING)) //don't heal fainted Pokemon in Nuzlocke except when linking SetMonData(&gPlayerParty[i], MON_DATA_HP, arg); } ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES); if(GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0 && gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && !FlagGet(FLAG_SYS_IS_LINKING)) //don't heal fainted Pokemon in Nuzlocke except when linking { // restore PP. for(j = 0; j < MAX_MON_MOVES; j++) { arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j); SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg); } } // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. arg[0] = 0; arg[1] = 0; arg[2] = 0; arg[3] = 0; SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg); } } void HealPlayerPartyOak(void) { u8 i, j; u8 ppBonuses; u8 arg[4]; // restore HP. for(i = 0; i < gPlayerPartyCount; i++) { u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); arg[0] = maxHP; arg[1] = maxHP >> 8; SetMonData(&gPlayerParty[i], MON_DATA_HP, arg); ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES); // restore PP. for(j = 0; j < MAX_MON_MOVES; j++) { arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j); SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg); } // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. arg[0] = 0; arg[1] = 0; arg[2] = 0; arg[3] = 0; SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg); } } u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3) { u16 nationalDexNum; int sentToPc; u8 heldItem[2]; struct Pokemon *mon = AllocZeroed(sizeof(struct Pokemon)); u16 zeroHP = 0; u32 wasFirstCatch = 0; CreateMon(mon, species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0); heldItem[0] = item; heldItem[1] = item >> 8; SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && !IN_OAKS_LAB) //if this is Oak's Lab, don't set Nuzlocke flags { if(NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == TRUE) //already caught something here, faint mon { SetMonData(mon, MON_DATA_HP, &zeroHP); } if(!IsWildMonNuzlockeDupe(species)) { NuzlockeFlagSet(GetCurrentRegionMapSectionId()); wasFirstCatch = 1; } } CalculateMonStats(mon, FALSE); sentToPc = GiveMonToPlayer(mon); nationalDexNum = SpeciesToNationalPokedexNum(species); switch(sentToPc) { case MON_GIVEN_TO_PARTY: case MON_GIVEN_TO_PC: GetSetPokedexFlag(nationalDexNum, FLAG_SET_SEEN); GetSetPokedexFlag(nationalDexNum, FLAG_SET_CAUGHT); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(wasFirstCatch) { //if first catch in area, set dupe flag for this species. SetNuzlockeDupeFlags(SpeciesToNationalPokedexNum(species)); } } break; } Free(mon); return sentToPc; } u8 ScriptGiveEgg(u16 species) { struct Pokemon *mon = AllocZeroed(sizeof(struct Pokemon)); bool8 isEgg; bool8 sentToPc; CreateEgg(mon, species, TRUE); isEgg = TRUE; SetMonData(mon, MON_DATA_IS_EGG, &isEgg); sentToPc = GiveMonToPlayer(mon); Free(mon); return sentToPc; } void HasEnoughMonsForDoubleBattle(void) { switch (GetMonsStateToDoubles()) { case PLAYER_HAS_TWO_USABLE_MONS: gSpecialVar_Result = PLAYER_HAS_TWO_USABLE_MONS; break; case PLAYER_HAS_ONE_MON: gSpecialVar_Result = PLAYER_HAS_ONE_MON; break; case PLAYER_HAS_ONE_USABLE_MON: gSpecialVar_Result = PLAYER_HAS_ONE_USABLE_MON; break; } } static bool8 CheckPartyMonHasHeldItem(u16 item) { int i; for(i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); if (species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item) return TRUE; } return FALSE; } bool8 DoesPartyHaveEnigmaBerry(void) { bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY); if (hasItem == TRUE) GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1); return hasItem; } void CreateScriptedWildMon(u16 species, u8 level, u16 item) { u8 heldItem[2]; u8 version = VERSION_EMERALD; ZeroEnemyPartyMons(); CreateMon(&gEnemyParty[0], species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0); if (item) { heldItem[0] = item; heldItem[1] = item >> 8; SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); } if(species == SPECIES_SUDOWOODO && level == 40 && gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER) { SetMonData(&gEnemyParty[0], MON_DATA_MET_GAME, &version); } } void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot) { if (monIndex > PARTY_SIZE) monIndex = gPlayerPartyCount - 1; SetMonMoveSlot(&gPlayerParty[monIndex], move, slot); } // Note: When control returns to the event script, gSpecialVar_Result will be // TRUE if the party selection was successful. void ChooseHalfPartyForBattle(void) { gMain.savedCallback = CB2_ReturnFromChooseHalfParty; // VarSet(VAR_FRONTIER_FACILITY, FACILITY_MULTI_OR_EREADER); InitChooseMonsForBattle(CHOOSE_MONS_FOR_CABLE_CLUB_BATTLE); } static void CB2_ReturnFromChooseHalfParty(void) { switch (gSelectedOrderFromParty[0]) { case 0: gSpecialVar_Result = FALSE; break; default: gSpecialVar_Result = TRUE; break; } SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } void ChooseBattleTowerPlayerParty(void) { gMain.savedCallback = CB2_ReturnFromChooseBattleTowerParty; InitChooseMonsForBattle(CHOOSE_MONS_FOR_BATTLE_TOWER); } static void CB2_ReturnFromChooseBattleTowerParty(void) { switch (gSelectedOrderFromParty[0]) { case 0: LoadPlayerParty(); gSpecialVar_Result = FALSE; break; default: ReducePlayerPartyToThree(); gSpecialVar_Result = TRUE; break; } SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } void ReducePlayerPartyToThree(void) { struct Pokemon * party = AllocZeroed(3 * sizeof(struct Pokemon)); int i; // copy the selected pokemon according to the order. for (i = 0; i < 3; i++) if (gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal CpuFill32(0, gPlayerParty, sizeof gPlayerParty); // overwrite the first 3 with the order copied to. for (i = 0; i < 3; i++) gPlayerParty[i] = party[i]; CalculatePlayerPartyCount(); Free(party); } ================================================ FILE: src/seagallop.c ================================================ #include "global.h" #include "gflib.h" #include "scanline_effect.h" #include "trainer_pokemon_sprites.h" #include "text_window.h" #include "task.h" #include "help_system.h" #include "overworld.h" #include "event_data.h" #include "field_fadetransition.h" #include "field_weather.h" #include "constants/songs.h" #include "constants/maps.h" #include "constants/region_map_sections.h" #include "constants/seagallop.h" #define TILESTAG_FERRY 3000 #define TILESTAG_WAKE 4000 #define PALTAG_FERRY_WAKE 3000 static EWRAM_DATA void *sBg3TilemapBuffer = NULL; static void CB2_SetUpSeagallopScene(void); static void VBlankCB_SeaGallop(void); static void MainCB2_SeaGallop(void); static void Task_Seagallop_0(u8 taskId); static void Task_Seagallop_1(u8 taskId); static void Task_Seagallop_2(u8 taskId); static void Task_Seagallop_3(void); static void ResetGPU(void); static void ResetAllAssets(void); static void SetDispcnt(void); static void ResetBGPos(void); static void LoadFerrySpriteResources(void); static void FreeFerrySpriteResources(void); static void CreateFerrySprite(void); static void SpriteCB_Ferry(struct Sprite *sprite); static void CreateWakeSprite(s16 x); static void SpriteCB_Wake(struct Sprite *sprite); static bool8 GetDirectionOfTravel(void); static const u16 sWaterTiles[] = INCBIN_U16("graphics/seagallop/water.4bpp"); static const u16 sWaterPal[] = INCBIN_U16("graphics/seagallop/water.gbapal"); static const u16 sWaterTilemap_WB[] = INCBIN_U16("graphics/seagallop/wb_tilemap.bin"); static const u16 sWaterTilemap_EB[] = INCBIN_U16("graphics/seagallop/eb_tilemap.bin"); static const u16 sFerrySpriteTiles[] = INCBIN_U16("graphics/seagallop/ferry_sprite.4bpp"); static const u16 sFerryAndWakePal[] = INCBIN_U16("graphics/seagallop/ferry_and_wake.gbapal"); static const u16 sWakeSpriteTiles[] = INCBIN_U16("graphics/seagallop/wake.4bpp"); static const struct BgTemplate sBGTemplates[] = { { .bg = 3, .charBaseIndex = 3, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 } }; static const s8 sSeag[][4] = { // Map X Y [SEAGALLOP_VERMILION_CITY] = {MAP(VERMILION_CITY), 0x17, 0x20}, [SEAGALLOP_ONE_ISLAND] = {MAP(ONE_ISLAND_HARBOR), 0x08, 0x05}, [SEAGALLOP_TWO_ISLAND] = {MAP(TWO_ISLAND_HARBOR), 0x08, 0x05}, [SEAGALLOP_THREE_ISLAND] = {MAP(THREE_ISLAND_HARBOR), 0x08, 0x05}, [SEAGALLOP_FOUR_ISLAND] = {MAP(FOUR_ISLAND_HARBOR), 0x08, 0x05}, [SEAGALLOP_FIVE_ISLAND] = {MAP(FIVE_ISLAND_HARBOR), 0x08, 0x05}, [SEAGALLOP_SIX_ISLAND] = {MAP(SIX_ISLAND_HARBOR), 0x08, 0x05}, [SEAGALLOP_SEVEN_ISLAND] = {MAP(SEVEN_ISLAND_HARBOR), 0x08, 0x05}, [SEAGALLOP_CINNABAR_ISLAND] = {MAP(CINNABAR_ISLAND), 0x15, 0x07}, [SEAGALLOP_NAVEL_ROCK] = {MAP(NAVEL_ROCK_HARBOR), 0x08, 0x05}, [SEAGALLOP_BIRTH_ISLAND] = {MAP(BIRTH_ISLAND_HARBOR), 0x08, 0x05}, [SEAGALLOP_FARAWAY_ISLAND] = {MAP(FARAWAY_ISLAND_EXTERIOR), 13, 38}, [SEAGALLOP_BATTLE_TOWER] = {MAP(RS_BATTLE_TOWER), 19, 24}, [SEAGALLOP_SOUTHERN_ISLAND] = {MAP(SOUTHERN_ISLAND_EXTERIOR), 13, 22} }; // Bitpacked array. In the commented section, right-most bit is the // flag for traveling from (row port) to Vermilion City, and so on. // Flags follow these enums: enum TravelDirections { DIRN_WESTBOUND = 0, DIRN_EASTBOUND = 1 }; static const u16 sTravelDirectionMatrix[] = { [SEAGALLOP_VERMILION_CITY] = 0x6fe, // 11011111110 [SEAGALLOP_ONE_ISLAND] = 0x6fc, // 11011111100 [SEAGALLOP_TWO_ISLAND] = 0x6f8, // 11011111000 [SEAGALLOP_THREE_ISLAND] = 0x6f0, // 11011110000 [SEAGALLOP_FOUR_ISLAND] = 0x6e0, // 11011100000 [SEAGALLOP_FIVE_ISLAND] = 0x4c0, // 10011000000 [SEAGALLOP_SIX_ISLAND] = 0x400, // 10000000000 [SEAGALLOP_SEVEN_ISLAND] = 0x440, // 10001000000 [SEAGALLOP_CINNABAR_ISLAND] = 0x7ff, // 11111111111 [SEAGALLOP_NAVEL_ROCK] = 0x6e0, // 11011100000 [SEAGALLOP_BIRTH_ISLAND] = 0x000 // 00000000000 }; static const union AnimCmd sSpriteAnims_Ferry_WB[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_END }; static const union AnimCmd sSpriteAnims_Ferry_EB[] = { ANIMCMD_FRAME(0, 10, .hFlip = TRUE), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_Ferry[] = { sSpriteAnims_Ferry_WB, sSpriteAnims_Ferry_EB }; static const struct OamData sOamData_Ferry = { .size = 3 }; static const struct SpriteTemplate sFerrySpriteTemplate = { TILESTAG_FERRY, PALTAG_FERRY_WAKE, &sOamData_Ferry, sSpriteAnimTable_Ferry, NULL, gDummySpriteAffineAnimTable, SpriteCB_Ferry }; static const struct SpriteSheet sFerryAndWakeSpriteSheets[] = { {(const void *)sWakeSpriteTiles, sizeof(sWakeSpriteTiles), TILESTAG_WAKE}, {(const void *)sFerrySpriteTiles, sizeof(sFerrySpriteTiles), TILESTAG_FERRY}, {} }; static const struct SpritePalette sFerryAndWakeSpritePalettes[] = { {sFerryAndWakePal, PALTAG_FERRY_WAKE}, {} }; static const union AnimCmd sSpriteAnims_Wake_WB[] = { ANIMCMD_FRAME(0x00, 0x14), ANIMCMD_FRAME(0x10, 0x14), ANIMCMD_FRAME(0x20, 0x0f), ANIMCMD_END, }; static const union AnimCmd sSpriteAnims_Wake_EB[] = { ANIMCMD_FRAME(0x00, 0x14, .hFlip = TRUE), ANIMCMD_FRAME(0x10, 0x14, .hFlip = TRUE), ANIMCMD_FRAME(0x20, 0x0f, .hFlip = TRUE), ANIMCMD_END, }; static const union AnimCmd *const sSpriteAnimTable_Wake[] = { sSpriteAnims_Wake_WB, sSpriteAnims_Wake_EB }; static const struct OamData sOamData_Wake = { .size = 2 }; static const struct SpriteTemplate sWakeSpriteTemplate = { TILESTAG_WAKE, PALTAG_FERRY_WAKE, &sOamData_Wake, sSpriteAnimTable_Wake, NULL, gDummySpriteAffineAnimTable, SpriteCB_Wake }; void DoSeagallopFerryScene(void) { SetVBlankCallback(NULL); HelpSystem_Disable(); SetMainCallback2(CB2_SetUpSeagallopScene); } static void CB2_SetUpSeagallopScene(void) { void ** ptr; switch (gMain.state) { case 0: SetVBlankCallback(NULL); // redundant since the setup routine already did this ResetGPU(); gMain.state++; break; case 1: ResetAllAssets(); gMain.state++; break; case 2: ptr = &sBg3TilemapBuffer; *ptr = AllocZeroed(0x800); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBGTemplates, NELEMS(sBGTemplates)); SetBgTilemapBuffer(3, *ptr); ResetBGPos(); gMain.state++; break; case 3: LoadBgTiles(3, sWaterTiles, sizeof(sWaterTiles), 0); if (GetDirectionOfTravel() == DIRN_EASTBOUND) CopyToBgTilemapBufferRect(3, sWaterTilemap_EB, 0, 0, 32, 32); else CopyToBgTilemapBufferRect(3, sWaterTilemap_WB, 0, 0, 32, 32); LoadPalette(sWaterPal, BG_PLTT_ID(4), sizeof(sWaterPal)); LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(15), PLTT_SIZE_4BPP); gMain.state++; break; case 4: if (IsDma3ManagerBusyWithBgCopy() != DIRN_EASTBOUND) { ShowBg(0); ShowBg(3); CopyBgTilemapBufferToVram(3); gMain.state++; } break; case 5: LoadFerrySpriteResources(); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); gMain.state++; break; case 6: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; break; case 7: SetDispcnt(); SetVBlankCallback(VBlankCB_SeaGallop); PlaySE(SE_SHIP); CreateFerrySprite(); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WININ, 0x3F); SetGpuReg(REG_OFFSET_WINOUT, 0x00); SetGpuReg(REG_OFFSET_WIN0H, 0x00F0); SetGpuReg(REG_OFFSET_WIN0V, 0x1888); CreateTask(Task_Seagallop_0, 8); SetMainCallback2(MainCB2_SeaGallop); gMain.state = 0; break; } } static void VBlankCB_SeaGallop(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void MainCB2_SeaGallop(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void Task_Seagallop_0(u8 taskId) { gTasks[taskId].func = Task_Seagallop_1; } static void ScrollBG(void) { if (GetDirectionOfTravel() == DIRN_EASTBOUND) { ChangeBgX(3, 0x600, 1); } else { ChangeBgX(3, 0x600, 2); } } static void Task_Seagallop_1(u8 taskId) { struct Task *task = &gTasks[taskId]; ScrollBG(); if (++task->data[1] == 140) { Overworld_FadeOutMapMusic(); WarpFadeOutScreen(); task->func = Task_Seagallop_2; } } static void Task_Seagallop_2(u8 taskId) { ScrollBG(); if (BGMusicStopped() && !gPaletteFade.active) { Task_Seagallop_3(); HelpSystem_Enable(); DestroyTask(taskId); } } static void Task_Seagallop_3(void) { const s8 * warpInfo; if (gSpecialVar_0x8006 >= NELEMS(sSeag)) gSpecialVar_0x8006 = 0; warpInfo = sSeag[gSpecialVar_0x8006]; SetWarpDestination(warpInfo[0], warpInfo[1], -1, warpInfo[2], warpInfo[3]); PlayRainStoppingSoundEffect(); PlaySE(SE_EXIT); gFieldCallback = FieldCB_DefaultWarpExit; WarpIntoMap(); SetMainCallback2(CB2_LoadMap); ResetInitialPlayerAvatarState(); FreeFerrySpriteResources(); Free(sBg3TilemapBuffer); FreeAllWindowBuffers(); } static void ResetGPU(void) { void *dest = (void *) VRAM; DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG0CNT, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1CNT, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2CNT, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3CNT, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); } static void ResetAllAssets(void) { ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetAllPicSprites(); ResetPaletteFade(); FreeAllSpritePalettes(); } static void SetDispcnt(void) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON); } static void ResetBGPos(void) { ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); } static void LoadFerrySpriteResources(void) { LoadSpriteSheets(sFerryAndWakeSpriteSheets); LoadSpritePalettes(sFerryAndWakeSpritePalettes); } static void FreeFerrySpriteResources(void) { FreeSpriteTilesByTag(TILESTAG_FERRY); FreeSpriteTilesByTag(TILESTAG_WAKE); FreeSpritePaletteByTag(PALTAG_FERRY_WAKE); } static void CreateFerrySprite(void) { u8 spriteId = CreateSprite(&sFerrySpriteTemplate, 0, 92, 0); gSprites[spriteId].data[0] = 48; if (GetDirectionOfTravel() == DIRN_EASTBOUND) { StartSpriteAnim(&gSprites[spriteId], 1); } else { gSprites[spriteId].x = 240; gSprites[spriteId].data[0] *= -1; } } static void SpriteCB_Ferry(struct Sprite *sprite) { sprite->data[1] += sprite->data[0]; sprite->x2 = sprite->data[1] >> 4; if (sprite->data[2] % 5 == 0) { CreateWakeSprite(sprite->x + sprite->x2); } sprite->data[2]++; if ((u16)(300 + sprite->x2) > 600) { DestroySprite(sprite); } } static void CreateWakeSprite(s16 x) { u8 spriteId = CreateSprite(&sWakeSpriteTemplate, x, 92, 8); if (spriteId != MAX_SPRITES) { if (GetDirectionOfTravel() == DIRN_EASTBOUND) { StartSpriteAnim(&gSprites[spriteId], 1); } } } static void SpriteCB_Wake(struct Sprite *sprite) { if (sprite->animEnded) { DestroySprite(sprite); } } static bool8 GetDirectionOfTravel(void) { if (gSpecialVar_0x8004 >= NELEMS(sTravelDirectionMatrix)) { return DIRN_EASTBOUND; } return (sTravelDirectionMatrix[gSpecialVar_0x8004] >> gSpecialVar_0x8006) & 1; } // For "All aboard SEAGALLOP HI-SPEED ##" text u8 GetSeagallopNumber(void) { u16 originId, destId; originId = gSpecialVar_0x8004; destId = gSpecialVar_0x8006; if (originId == SEAGALLOP_CINNABAR_ISLAND || destId == SEAGALLOP_CINNABAR_ISLAND) return 1; if (gMapHeader.regionMapSectionId == MAPSEC_FARAWAY_ISLAND) return 14; if (gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER || gMapHeader.regionMapSectionId == MAPSEC_SOUTHERN_ISLAND) return 13; if (originId == SEAGALLOP_VERMILION_CITY || destId == SEAGALLOP_VERMILION_CITY) return 7; if (originId == SEAGALLOP_NAVEL_ROCK || destId == SEAGALLOP_NAVEL_ROCK) return 10; if (originId == SEAGALLOP_BIRTH_ISLAND || destId == SEAGALLOP_BIRTH_ISLAND) return 12; if ((originId == SEAGALLOP_ONE_ISLAND || originId == SEAGALLOP_TWO_ISLAND || originId == SEAGALLOP_THREE_ISLAND) && (destId == SEAGALLOP_ONE_ISLAND || destId == SEAGALLOP_TWO_ISLAND || destId == SEAGALLOP_THREE_ISLAND)) return 2; if ((originId == SEAGALLOP_FOUR_ISLAND || originId == SEAGALLOP_FIVE_ISLAND) && (destId == SEAGALLOP_FOUR_ISLAND || destId == SEAGALLOP_FIVE_ISLAND)) return 3; if ((originId == SEAGALLOP_SIX_ISLAND || originId == SEAGALLOP_SEVEN_ISLAND) && (destId == SEAGALLOP_SIX_ISLAND || destId == SEAGALLOP_SEVEN_ISLAND)) return 5; return 6; } bool8 IsPlayerLeftOfVermilionSailor(void) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VERMILION_CITY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(VERMILION_CITY) && gSaveBlock1Ptr->pos.x < 24) return TRUE; return FALSE; } ================================================ FILE: src/shop.c ================================================ #include "global.h" #include "gflib.h" #include "shop.h" #include "menu.h" #include "data.h" #include "graphics.h" #include "strings.h" #include "list_menu.h" #include "new_menu_helpers.h" #include "party_menu.h" #include "field_specials.h" #include "field_weather.h" #include "task.h" #include "item.h" #include "item_menu.h" #include "overworld.h" #include "field_fadetransition.h" #include "scanline_effect.h" #include "item_menu_icons.h" #include "decompress.h" #include "menu_indicators.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "event_object_movement.h" #include "money.h" #include "quest_log.h" #include "script.h" #include "strings.h" #include "constants/songs.h" #include "constants/items.h" #include "constants/game_stat.h" #include "constants/field_weather.h" #include "constants/region_map_sections.h" #define tItemCount data[1] #define tItemId data[5] #define tListTaskId data[7] // mart types enum { MART_TYPE_REGULAR = 0, MART_TYPE_TMHM, MART_TYPE_DECOR, MART_TYPE_DECOR2, }; // shop view window NPC info enum enum { OBJECT_EVENT_ID, X_COORD, Y_COORD, ANIM_NUM }; struct ShopData { /*0x00*/ void (*callback)(void); /*0x04*/ const u16 *itemList; /*0x08*/ u32 itemPrice; /*0x0C*/ u16 selectedRow; /*0x0E*/ u16 scrollOffset; /*0x10*/ u16 itemCount; /*0x12*/ u16 itemsShowed; /*0x14*/ u16 maxQuantity; /*0x16*/ u16 martType:4; // 0x1 if tm list u16 fontId:5; u16 itemSlot:2; u16 unk16_11:5; /*0x18*/ u16 unk18; }; static EWRAM_DATA s16 sViewportObjectEvents[OBJECT_EVENTS_COUNT][4] = {0}; static EWRAM_DATA struct ShopData sShopData = {0}; static EWRAM_DATA u8 sShopMenuWindowId = 0; EWRAM_DATA u16 (*gShopTilemapBuffer1)[0x400] = {0}; EWRAM_DATA u16 (*gShopTilemapBuffer2)[0x400] = {0}; EWRAM_DATA u16 (*gShopTilemapBuffer3)[0x400] = {0}; EWRAM_DATA u16 (*gShopTilemapBuffer4)[0x400] = {0}; EWRAM_DATA struct ListMenuItem *sShopMenuListMenu = {0}; static EWRAM_DATA u8 (*sShopMenuItemStrings)[13] = {0}; EWRAM_DATA struct QuestLogEvent_Shop sHistory[2] = {0}; //Function Declarations static u8 CreateShopMenu(u8 martType); static u8 GetMartTypeFromItemList(u32 a0); static void SetShopItemsForSale(const u16 *items); static void SetShopMenuCallback(MainCallback callback); static void Task_ShopMenu(u8 taskId); static void Task_HandleShopMenuBuy(u8 taskId); static void Task_HandleShopMenuSell(u8 taskId); static void CB2_GoToSellMenu(void); static void Task_HandleShopMenuQuit(u8 taskId); static void ClearShopMenuWindow(void); static void Task_GoToBuyOrSellMenu(u8 taskId); static void MapPostLoadHook_ReturnToShopMenu(void); static void Task_ReturnToShopMenu(u8 taskId); static void ShowShopMenuAfterExitingBuyOrSellMenu(u8 taskId); static void CB2_BuyMenu(void); static void VBlankCB_BuyMenu(void); static void CB2_InitBuyMenu(void); static bool8 InitShopData(void); static void BuyMenuInitBgs(void); static void BuyMenuDecompressBgGraphics(void); static void RecolorItemDescriptionBox(bool32 a0); static void BuyMenuDrawGraphics(void); static bool8 BuyMenuBuildListMenuTemplate(void); static void PokeMartWriteNameAndIdAt(struct ListMenuItem *list, u16 index, u8 *dst); static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, struct ListMenu *list); static void BuyMenuPrintPriceInList(u8 windowId, u32 itemId, u8 y); static void LoadTmHmNameInMart(s32 item); static void BuyMenuPrintCursor(u8 listTaskId, u8 a1); static void BuyMenuPrintCursorAtYPosition(u8 y, u8 a1); static void BuyMenuFreeMemory(void); static void SetShopExitCallback(void); static void BuyMenuAddScrollIndicatorArrows(void); static void BuyQuantityAddScrollIndicatorArrows(void); static void BuyMenuRemoveScrollIndicatorArrows(void); static void BuyMenuDrawMapView(void); static void BuyMenuDrawMapBg(void); static void BuyMenuDrawMapMetatile(s16 x, s16 y, const u16 *src, u8 metatileLayerType); static void BuyMenuDrawMapMetatileLayer(u16 *dest, s16 offset1, s16 offset2, const u16 *src); static void BuyMenuCollectObjectEventData(void); static void BuyMenuDrawObjectEvents(void); static void BuyMenuCopyTilemapData(void); static void BuyMenuPrintItemQuantityAndPrice(u8 taskId); static void Task_BuyMenu(u8 taskId); static void Task_BuyHowManyDialogueInit(u8 taskId); static void Task_BuyHowManyDialogueHandleInput(u8 taskId); static void CreateBuyMenuConfirmPurchaseWindow(u8 taskId); static void BuyMenuTryMakePurchase(u8 taskId); static void BuyMenuSubtractMoney(u8 taskId); static void Task_ReturnToItemListAfterItemPurchase(u8 taskId); static void BuyMenuReturnToItemList(u8 taskId); static void ExitBuyMenu(u8 taskId); static void Task_ExitBuyMenu(u8 taskId); static void DebugFunc_PrintPurchaseDetails(u8 taskId); static void DebugFunc_PrintShopMenuHistoryBeforeClearMaybe(void); static void RecordTransactionForQuestLog(void); static const struct MenuAction sShopMenuActions_BuySellQuit[] = { {gText_ShopBuy, {.void_u8 = Task_HandleShopMenuBuy}}, {gText_ShopSell, {.void_u8 = Task_HandleShopMenuSell}}, {gText_ShopQuit, {.void_u8 = Task_HandleShopMenuQuit}} }; static const struct YesNoFuncTable sShopMenuActions_BuyQuit[] = { BuyMenuTryMakePurchase, BuyMenuReturnToItemList }; static const struct WindowTemplate sShopMenuWindowTemplate = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 1, .width = 12, .height = 6, .paletteNum = 15, .baseBlock = 8 }; static const struct BgTemplate sShopBuyMenuBgTemplates[4] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0 } }; // Functions static u8 CreateShopMenu(u8 martType) { sShopData.martType = GetMartTypeFromItemList(martType); sShopData.selectedRow = 0; if (ContextNpcGetTextColor() == NPC_TEXT_COLOR_MALE) sShopData.fontId = FONT_MALE; else sShopData.fontId = FONT_FEMALE; sShopMenuWindowId = AddWindow(&sShopMenuWindowTemplate); SetStdWindowBorderStyle(sShopMenuWindowId, 0); PrintTextArray(sShopMenuWindowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, 16, 3, sShopMenuActions_BuySellQuit); Menu_InitCursor(sShopMenuWindowId, FONT_NORMAL, 0, 2, 16, 3, 0); PutWindowTilemap(sShopMenuWindowId); CopyWindowToVram(sShopMenuWindowId, COPYWIN_MAP); return CreateTask(Task_ShopMenu, 8); } static u8 GetMartTypeFromItemList(u32 martType) { u32 i; if (martType != MART_TYPE_REGULAR) return martType; for (i = 0; i < sShopData.itemCount && sShopData.itemList[i] != 0; i++) { if (ItemId_GetPocket(sShopData.itemList[i]) == POCKET_TM_CASE) return MART_TYPE_TMHM; } return MART_TYPE_REGULAR; } static void SetShopItemsForSale(const u16 *items) { sShopData.itemList = items; sShopData.itemCount = 0; if (sShopData.itemList[0] == 0) return; while (sShopData.itemList[sShopData.itemCount]) { ++sShopData.itemCount; } } static void SetShopMenuCallback(void (*callback)(void)) { sShopData.callback = callback; } static void Task_ShopMenu(u8 taskId) { s8 input = Menu_ProcessInputNoWrapAround(); switch (input) { case MENU_NOTHING_CHOSEN: break; case MENU_B_PRESSED: PlaySE(SE_SELECT); Task_HandleShopMenuQuit(taskId); break; default: sShopMenuActions_BuySellQuit[Menu_GetCursorPos()].func.void_u8(taskId); break; } } static void Task_HandleShopMenuBuy(u8 taskId) { SetWordTaskArg(taskId, 0xE, (u32)CB2_InitBuyMenu); FadeScreen(FADE_TO_BLACK, 0); gTasks[taskId].func = Task_GoToBuyOrSellMenu; } static void Task_HandleShopMenuSell(u8 taskId) { SetWordTaskArg(taskId, 0xE, (u32)CB2_GoToSellMenu); FadeScreen(FADE_TO_BLACK, 0); gTasks[taskId].func = Task_GoToBuyOrSellMenu; } static void CB2_GoToSellMenu(void) { GoToBagMenu(ITEMMENULOCATION_SHOP, OPEN_BAG_LAST, CB2_ReturnToField); gFieldCallback = MapPostLoadHook_ReturnToShopMenu; } static void Task_HandleShopMenuQuit(u8 taskId) { ClearShopMenuWindow(); RecordTransactionForQuestLog(); DestroyTask(taskId); if (sShopData.callback != NULL) sShopData.callback(); } static void ClearShopMenuWindow(void) { ClearStdWindowAndFrameToTransparent(sShopMenuWindowId, 2); RemoveWindow(sShopMenuWindowId); } static void Task_GoToBuyOrSellMenu(u8 taskId) { if (gPaletteFade.active) return; SetMainCallback2((void *)GetWordTaskArg(taskId, 0xE)); FreeAllWindowBuffers(); DestroyTask(taskId); } static void MapPostLoadHook_ReturnToShopMenu(void) { FadeInFromBlack(); CreateTask(Task_ReturnToShopMenu, 8); } static void Task_ReturnToShopMenu(u8 taskId) { if (IsWeatherNotFadingIn() != TRUE) return; if(gMapHeader.regionMapSectionId == MAPSEC_SILPH_CO) DisplayItemMessageOnField(taskId, GetMartFontId(), gText_DevonSpyShop, ShowShopMenuAfterExitingBuyOrSellMenu); else if(gMapHeader.regionMapSectionId == MAPSEC_TRAINER_TOWER_2) DisplayItemMessageOnField(taskId, GetMartFontId(), gText_AnythingElseICanHelpF, ShowShopMenuAfterExitingBuyOrSellMenu); else DisplayItemMessageOnField(taskId, GetMartFontId(), gText_AnythingElseICanHelp, ShowShopMenuAfterExitingBuyOrSellMenu); } static void ShowShopMenuAfterExitingBuyOrSellMenu(u8 taskId) { CreateShopMenu(sShopData.martType); DestroyTask(taskId); } static void CB2_BuyMenu(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); DoScheduledBgTilemapCopiesToVram(); } static void VBlankCB_BuyMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB2_InitBuyMenu(void) { u8 taskId; switch (gMain.state) { case 0: SetVBlankHBlankCallbacksToNull(); CpuFastFill(0, (void *)OAM, 0x400); ScanlineEffect_Stop(); ResetTempTileDataBuffers(); FreeAllSpritePalettes(); ResetPaletteFade(); ResetSpriteData(); ResetTasks(); ClearScheduledBgCopiesToVram(); ResetItemMenuIconState(); if (!(InitShopData()) || !(BuyMenuBuildListMenuTemplate())) return; BuyMenuInitBgs(); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20); BuyMenuInitWindows(sShopData.martType); BuyMenuDecompressBgGraphics(); gMain.state++; break; case 1: if (FreeTempTileDataBuffersIfPossible()) return; gMain.state++; break; default: sShopData.selectedRow = 0; sShopData.scrollOffset = 0; BuyMenuDrawGraphics(); BuyMenuAddScrollIndicatorArrows(); taskId = CreateTask(Task_BuyMenu, 8); gTasks[taskId].tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_BuyMenu); SetMainCallback2(CB2_BuyMenu); break; } } static bool8 InitShopData(void) { gShopTilemapBuffer1 = Alloc(sizeof(*gShopTilemapBuffer1)); if (gShopTilemapBuffer1 == NULL) { BuyMenuFreeMemory(); SetShopExitCallback(); return FALSE; } gShopTilemapBuffer2 = Alloc(sizeof(*gShopTilemapBuffer2)); if (gShopTilemapBuffer2 == NULL) { BuyMenuFreeMemory(); SetShopExitCallback(); return FALSE; } gShopTilemapBuffer3 = Alloc(sizeof(*gShopTilemapBuffer3)); if (gShopTilemapBuffer3 == NULL) { BuyMenuFreeMemory(); SetShopExitCallback(); return FALSE; } gShopTilemapBuffer4 = Alloc(sizeof(*gShopTilemapBuffer4)); if (gShopTilemapBuffer4 == NULL) { BuyMenuFreeMemory(); SetShopExitCallback(); return FALSE; } return TRUE; } static void BuyMenuInitBgs(void) { ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sShopBuyMenuBgTemplates, NELEMS(sShopBuyMenuBgTemplates)); SetBgTilemapBuffer(1, gShopTilemapBuffer2); SetBgTilemapBuffer(2, gShopTilemapBuffer4); SetBgTilemapBuffer(3, gShopTilemapBuffer3); SetGpuReg(REG_OFFSET_BG0HOFS, DISPCNT_MODE_0); SetGpuReg(REG_OFFSET_BG0VOFS, DISPCNT_MODE_0); SetGpuReg(REG_OFFSET_BG1HOFS, DISPCNT_MODE_0); SetGpuReg(REG_OFFSET_BG1VOFS, DISPCNT_MODE_0); SetGpuReg(REG_OFFSET_BG2HOFS, DISPCNT_MODE_0); SetGpuReg(REG_OFFSET_BG2VOFS, DISPCNT_MODE_0); SetGpuReg(REG_OFFSET_BG3HOFS, DISPCNT_MODE_0); SetGpuReg(REG_OFFSET_BG3VOFS, DISPCNT_MODE_0); SetGpuReg(REG_OFFSET_BLDCNT, DISPCNT_MODE_0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); } static void BuyMenuDecompressBgGraphics(void) { u16 *pal; DecompressAndCopyTileDataToVram(1, gBuyMenuFrame_Gfx, 0x480, 0x3DC, 0); if ((sShopData.martType) != MART_TYPE_TMHM) LZDecompressWram(gBuyMenuFrame_Tilemap, gShopTilemapBuffer1); else LZDecompressWram(gBuyMenuFrame_TmHmTilemap, gShopTilemapBuffer1); pal = Alloc(2 * PLTT_SIZE_4BPP); LZDecompressWram(gBuyMenuFrame_Pal, pal); LoadPalette(&pal[0 * 16], BG_PLTT_ID(11), PLTT_SIZE_4BPP); LoadPalette(&pal[1 * 16], BG_PLTT_ID(6), PLTT_SIZE_4BPP); Free(pal); } static void RecolorItemDescriptionBox(bool32 a0) { u8 paletteNum; if (a0 == FALSE) paletteNum = 0xB; else paletteNum = 0x6; if ((sShopData.martType) != MART_TYPE_TMHM) SetBgTilemapPalette(1, 0, 14, 30, 6, paletteNum); else SetBgTilemapPalette(1, 0, 12, 30, 8, paletteNum); ScheduleBgCopyTilemapToVram(1); } static void BuyMenuDrawGraphics(void) { BuyMenuDrawMapView(); BuyMenuCopyTilemapData(); BuyMenuDrawMoneyBox(); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); ScheduleBgCopyTilemapToVram(2); ScheduleBgCopyTilemapToVram(3); } bool8 BuyMenuBuildListMenuTemplate(void) { u16 i, v; sShopMenuListMenu = Alloc((sShopData.itemCount + 1) * sizeof(*sShopMenuListMenu)); if (sShopMenuListMenu == NULL || (sShopMenuItemStrings = Alloc((sShopData.itemCount + 1) * sizeof(*sShopMenuItemStrings))) == NULL) { BuyMenuFreeMemory(); SetShopExitCallback(); return FALSE; } for (i = 0; i < sShopData.itemCount; i++) { PokeMartWriteNameAndIdAt(&sShopMenuListMenu[i], sShopData.itemList[i], sShopMenuItemStrings[i]); } StringCopy(sShopMenuItemStrings[i], gFameCheckerText_Cancel); sShopMenuListMenu[i].label = sShopMenuItemStrings[i]; sShopMenuListMenu[i].index = -2; gMultiuseListMenuTemplate.items = sShopMenuListMenu; gMultiuseListMenuTemplate.totalItems = sShopData.itemCount + 1; gMultiuseListMenuTemplate.windowId = 4; gMultiuseListMenuTemplate.header_X = 0; gMultiuseListMenuTemplate.item_X = 9; gMultiuseListMenuTemplate.cursor_X = 1; gMultiuseListMenuTemplate.lettersSpacing = 0; gMultiuseListMenuTemplate.itemVerticalPadding = 2; gMultiuseListMenuTemplate.upText_Y = 2; gMultiuseListMenuTemplate.fontId = 2; gMultiuseListMenuTemplate.fillValue = 0; gMultiuseListMenuTemplate.cursorPal = GetFontAttribute(FONT_NORMAL, FONTATTR_COLOR_FOREGROUND); gMultiuseListMenuTemplate.cursorShadowPal = GetFontAttribute(FONT_NORMAL, FONTATTR_COLOR_SHADOW); gMultiuseListMenuTemplate.moveCursorFunc = BuyMenuPrintItemDescriptionAndShowItemIcon; gMultiuseListMenuTemplate.itemPrintFunc = BuyMenuPrintPriceInList; gMultiuseListMenuTemplate.scrollMultiple = 0; gMultiuseListMenuTemplate.cursorKind = 0; if (sShopData.martType == MART_TYPE_TMHM) v = 5; else v = 6; if ((sShopData.itemCount + 1) > v) gMultiuseListMenuTemplate.maxShowed = v; else gMultiuseListMenuTemplate.maxShowed = sShopData.itemCount + 1; sShopData.itemsShowed = gMultiuseListMenuTemplate.maxShowed; return TRUE; } static void PokeMartWriteNameAndIdAt(struct ListMenuItem *list, u16 index, u8 *dst) { CopyItemName(index, dst); list->label = dst; list->index = index; } static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, struct ListMenu *list) { const u8 *description; if (onInit != TRUE) PlaySE(SE_SELECT); if (item != INDEX_CANCEL) description = ItemId_GetDescription(item); else description = gText_QuitShopping; FillWindowPixelBuffer(5, PIXEL_FILL(0)); if (sShopData.martType != MART_TYPE_TMHM) { DestroyItemMenuIcon(sShopData.itemSlot ^ 1); if (item != INDEX_CANCEL) CreateItemMenuIcon(item, sShopData.itemSlot); else CreateItemMenuIcon(ITEMS_COUNT, sShopData.itemSlot); sShopData.itemSlot ^= 1; BuyMenuPrint(5, FONT_NORMAL, description, 0, 3, 2, 1, 0, 0); } else //TM Mart { FillWindowPixelBuffer(6, PIXEL_FILL(0)); LoadTmHmNameInMart(item); BuyMenuPrint(5, FONT_NORMAL, description, 2, 3, 1, 0, 0, 0); } } static void BuyMenuPrintPriceInList(u8 windowId, u32 item, u8 y) { s32 x; u8 *loc; if (item != INDEX_CANCEL) { ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(item), 0, 5); x = 5 - StringLength(gStringVar1); loc = gStringVar4; while (x-- != 0) *loc++ = 0; StringExpandPlaceholders(loc, gText_PokedollarVar1); BuyMenuPrint(windowId, FONT_SMALL, gStringVar4, 0x67, y, 0, 0, TEXT_SKIP_DRAW, 1); } } static void LoadTmHmNameInMart(s32 item) { if (item != INDEX_CANCEL) { ConvertIntToDecimalStringN(gStringVar1, item - ITEM_DEVON_SCOPE, 2, 2); StringCopy(gStringVar4, gText_NumberClear01); StringAppend(gStringVar4, gStringVar1); BuyMenuPrint(6, FONT_SMALL, gStringVar4, 0, 0, 0, 0, TEXT_SKIP_DRAW, 1); StringCopy(gStringVar4, gMoveNames[ItemIdToBattleMoveId(item)]); BuyMenuPrint(6, FONT_NORMAL, gStringVar4, 0, 0x10, 0, 0, 0, 1); } else { BuyMenuPrint(6, FONT_SMALL, gText_ThreeHyphens, 0, 0, 0, 0, TEXT_SKIP_DRAW, 1); BuyMenuPrint(6, FONT_NORMAL, gText_SevenHyphens, 0, 0x10, 0, 0, 0, 1); } } u8 GetMartFontId(void) { return sShopData.fontId; } static void BuyMenuPrintCursor(u8 listTaskId, u8 a1) { BuyMenuPrintCursorAtYPosition(ListMenuGetYCoordForPrintingArrowCursor(listTaskId), a1); } static void BuyMenuPrintCursorAtYPosition(u8 y, u8 a1) { if (a1 == 0xFF) { FillWindowPixelRect(4, 0, 1, y, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_WIDTH), GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT)); CopyWindowToVram(4, COPYWIN_GFX); } else { BuyMenuPrint(4, FONT_NORMAL, gText_SelectorArrow2, 1, y, 0, 0, 0, a1); } } static void BuyMenuFreeMemory(void) { if (gShopTilemapBuffer1 != NULL) Free(gShopTilemapBuffer1); if (gShopTilemapBuffer2 != NULL) Free(gShopTilemapBuffer2); if (gShopTilemapBuffer3 != NULL) Free(gShopTilemapBuffer3); if (gShopTilemapBuffer4 != NULL) Free(gShopTilemapBuffer4); if (sShopMenuListMenu != NULL) Free(sShopMenuListMenu); if (sShopMenuItemStrings != NULL) Free(sShopMenuItemStrings); FreeAllWindowBuffers(); } static void SetShopExitCallback(void) { gFieldCallback = MapPostLoadHook_ReturnToShopMenu; SetMainCallback2(CB2_ReturnToField); } static void BuyMenuAddScrollIndicatorArrows(void) { if (sShopData.martType != MART_TYPE_TMHM) { sShopData.unk16_11 = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 160, 8, 104, (sShopData.itemCount - sShopData.itemsShowed) + 1, 110, 110, &sShopData.scrollOffset); } else { sShopData.unk16_11 = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 160, 8, 88, (sShopData.itemCount - sShopData.itemsShowed) + 1, 110, 110, &sShopData.scrollOffset); } } static void BuyQuantityAddScrollIndicatorArrows(void) { sShopData.unk18 = 1; sShopData.unk16_11 = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0x98, 0x48, 0x68, 2, 0x6E, 0x6E, &sShopData.unk18); } static void BuyMenuRemoveScrollIndicatorArrows(void) { if ((sShopData.unk16_11) == 0x1F) return; RemoveScrollIndicatorArrowPair(sShopData.unk16_11); sShopData.unk16_11 = 0x1F; } static void BuyMenuDrawMapView(void) { BuyMenuCollectObjectEventData(); BuyMenuDrawObjectEvents(); BuyMenuDrawMapBg(); } static void BuyMenuDrawMapBg(void) { s16 i, j, x, y; const struct MapLayout *mapLayout; u16 metatile; u8 metatileLayerType; mapLayout = gMapHeader.mapLayout; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); x -= 2; y -= 3; for (j = 0; j < 10; j++) { for (i = 0; i < 5; i++) { metatile = MapGridGetMetatileIdAt(x + i, y + j); metatileLayerType = MapGridGetMetatileLayerTypeAt(x + i, y + j); if (metatile < NUM_METATILES_IN_PRIMARY) BuyMenuDrawMapMetatile(i, j, mapLayout->primaryTileset->metatiles + metatile * 8, metatileLayerType); else BuyMenuDrawMapMetatile(i, j, mapLayout->secondaryTileset->metatiles + ((metatile - NUM_METATILES_IN_PRIMARY) * 8), metatileLayerType); } } } static void BuyMenuDrawMapMetatile(s16 x, s16 y, const u16 *src, u8 metatileLayerType) { u16 offset1 = x * 2; u16 offset2 = y * 64 + 64; switch (metatileLayerType) { case METATILE_LAYER_TYPE_NORMAL: BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer4, offset1, offset2, src); BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer2, offset1, offset2, src + 4); break; case METATILE_LAYER_TYPE_COVERED: BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer3, offset1, offset2, src); BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer4, offset1, offset2, src + 4); break; case METATILE_LAYER_TYPE_SPLIT: BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer3, offset1, offset2, src); BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer2, offset1, offset2, src + 4); break; } } static void BuyMenuDrawMapMetatileLayer(u16 *dest, s16 offset1, s16 offset2, const u16 *src) { dest[offset1 + offset2] = src[0]; // top left dest[offset1 + offset2 + 1] = src[1]; // top right dest[offset1 + offset2 + 32] = src[2]; // bottom left dest[offset1 + offset2 + 33] = src[3]; // bottom right } static void BuyMenuCollectObjectEventData(void) { s16 facingX, facingY; u8 x, y, elevation; u8 num = 0; GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); elevation = PlayerGetElevation(); for (y = 0; y < OBJECT_EVENTS_COUNT; y++) sViewportObjectEvents[y][OBJECT_EVENT_ID] = OBJECT_EVENTS_COUNT; for (y = 0; y < 5; y++) { for (x = 0; x < 7; x++) { u8 eventObjId = GetObjectEventIdByPosition(facingX - 3 + x, facingY - 2 + y, elevation); if (eventObjId != OBJECT_EVENTS_COUNT) { sViewportObjectEvents[num][OBJECT_EVENT_ID] = eventObjId; sViewportObjectEvents[num][X_COORD] = x; sViewportObjectEvents[num][Y_COORD] = y; switch (gObjectEvents[eventObjId].facingDirection) { case DIR_SOUTH: sViewportObjectEvents[num][ANIM_NUM] = 0; break; case DIR_NORTH: sViewportObjectEvents[num][ANIM_NUM] = 1; break; case DIR_WEST: sViewportObjectEvents[num][ANIM_NUM] = 2; break; case DIR_EAST: default: sViewportObjectEvents[num][ANIM_NUM] = 3; break; } num++; } } } } static void BuyMenuDrawObjectEvents(void) { u8 i, spriteId; const struct ObjectEventGraphicsInfo *graphicsInfo; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (sViewportObjectEvents[i][OBJECT_EVENT_ID] == OBJECT_EVENTS_COUNT) continue; graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[sViewportObjectEvents[i][OBJECT_EVENT_ID]].graphicsId); spriteId = CreateObjectGraphicsSprite( gObjectEvents[sViewportObjectEvents[i][OBJECT_EVENT_ID]].graphicsId, SpriteCallbackDummy, (u16)sViewportObjectEvents[i][X_COORD] * 16 - 8, (u16)sViewportObjectEvents[i][Y_COORD] * 16 + 48 - graphicsInfo->height / 2, 2); StartSpriteAnim(&gSprites[spriteId], sViewportObjectEvents[i][ANIM_NUM]); } } static void BuyMenuCopyTilemapData(void) { s32 i; u16 *dst = *gShopTilemapBuffer2; u16 *src = *gShopTilemapBuffer1; for (i = 0; i < 0x400; i++) { if (src[i] == 0) continue; dst[i] = src[i] + 0xb3dc; } } static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) { s16 *data = gTasks[taskId].data; FillWindowPixelBuffer(3, PIXEL_FILL(1)); PrintMoneyAmount(3, 0x36, 0xA, sShopData.itemPrice, TEXT_SKIP_DRAW); ConvertIntToDecimalStringN(gStringVar1, tItemCount, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); BuyMenuPrint(3, FONT_SMALL, gStringVar4, 2, 0xA, 0, 0, 0, 1); } static void Task_BuyMenu(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { s32 itemId = ListMenu_ProcessInput(tListTaskId); ListMenuGetScrollAndRow(tListTaskId, &sShopData.scrollOffset, &sShopData.selectedRow); switch (itemId) { case LIST_NOTHING_CHOSEN: break; case LIST_CANCEL: PlaySE(SE_SELECT); ExitBuyMenu(taskId); break; default: PlaySE(SE_SELECT); tItemId = itemId; ClearWindowTilemap(5); BuyMenuRemoveScrollIndicatorArrows(); BuyMenuPrintCursor(tListTaskId, 2); RecolorItemDescriptionBox(1); sShopData.itemPrice = ItemId_GetPrice(itemId); if (!IsEnoughMoney(&gSaveBlock1Ptr->money, sShopData.itemPrice)) { BuyMenuDisplayMessage(taskId, gText_YouDontHaveMoney, BuyMenuReturnToItemList); } else if (ItemId_GetPocket(itemId) == POCKET_TM_CASE && CheckBagHasItem(itemId, 1)) { BuyMenuDisplayMessage(taskId, gText_YouAlreadyHaveThisTM, BuyMenuReturnToItemList); } else { CopyItemName(itemId, gStringVar1); if(itemId >= ITEM_TM01 && itemId <= ITEM_HM08) //if TM, skip to confirm without choosing quantity { sShopData.itemPrice = ItemId_GetPrice(itemId); tItemCount = 1; PlaySE(SE_SELECT); PutWindowTilemap(4); CopyItemName(tItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar2, 1, STR_CONV_MODE_LEFT_ALIGN, 2); ConvertIntToDecimalStringN(gStringVar3, sShopData.itemPrice, STR_CONV_MODE_LEFT_ALIGN, 8); BuyMenuDisplayMessage(taskId, gText_Var1AndYouWantedVar2, CreateBuyMenuConfirmPurchaseWindow); } else BuyMenuDisplayMessage(taskId, gText_Var1CertainlyHowMany, Task_BuyHowManyDialogueInit); } break; } } } static void Task_BuyHowManyDialogueInit(u8 taskId) { s16 *data = gTasks[taskId].data; u16 quantityInBag = BagGetQuantityByItemId(tItemId); u16 maxQuantity; BuyMenuQuantityBoxThinBorder(1, 0); ConvertIntToDecimalStringN(gStringVar1, quantityInBag, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_InBagVar1); BuyMenuPrint(1, FONT_NORMAL, gStringVar4, 0, 2, 0, 0, 0, 1); tItemCount = 1; BuyMenuQuantityBoxNormalBorder(3, 0); BuyMenuPrintItemQuantityAndPrice(taskId); ScheduleBgCopyTilemapToVram(0); maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / ItemId_GetPrice(tItemId); if (maxQuantity > 99) sShopData.maxQuantity = 99; else sShopData.maxQuantity = (u8)maxQuantity; if (maxQuantity != 1) BuyQuantityAddScrollIndicatorArrows(); gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput; } static void Task_BuyHowManyDialogueHandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; if (AdjustQuantityAccordingToDPadInput(&tItemCount, sShopData.maxQuantity) == TRUE) { sShopData.itemPrice = ItemId_GetPrice(tItemId) * tItemCount; BuyMenuPrintItemQuantityAndPrice(taskId); } else { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); BuyMenuRemoveScrollIndicatorArrows(); ClearStdWindowAndFrameToTransparent(3, FALSE); ClearStdWindowAndFrameToTransparent(1, FALSE); ClearWindowTilemap(3); ClearWindowTilemap(1); PutWindowTilemap(4); CopyItemName(tItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar2, tItemCount, STR_CONV_MODE_LEFT_ALIGN, 2); ConvertIntToDecimalStringN(gStringVar3, sShopData.itemPrice, STR_CONV_MODE_LEFT_ALIGN, 8); BuyMenuDisplayMessage(taskId, gText_Var1AndYouWantedVar2, CreateBuyMenuConfirmPurchaseWindow); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); BuyMenuRemoveScrollIndicatorArrows(); ClearStdWindowAndFrameToTransparent(3, FALSE); ClearStdWindowAndFrameToTransparent(1, FALSE); ClearWindowTilemap(3); ClearWindowTilemap(1); BuyMenuReturnToItemList(taskId); } } } static void CreateBuyMenuConfirmPurchaseWindow(u8 taskId) { BuyMenuConfirmPurchase(taskId, sShopMenuActions_BuyQuit); } static void BuyMenuTryMakePurchase(u8 taskId) { s16 *data = gTasks[taskId].data; PutWindowTilemap(4); if (AddBagItem(tItemId, tItemCount) == TRUE) { BuyMenuDisplayMessage(taskId, gText_HereYouGoThankYou, BuyMenuSubtractMoney); DebugFunc_PrintPurchaseDetails(taskId); RecordItemTransaction(tItemId, tItemCount, QL_EVENT_BOUGHT_ITEM - QL_EVENT_USED_POKEMART); } else { BuyMenuDisplayMessage(taskId, gText_NoMoreRoomForThis, BuyMenuReturnToItemList); } } static void BuyMenuSubtractMoney(u8 taskId) { IncrementGameStat(GAME_STAT_SHOPPED); RemoveMoney(&gSaveBlock1Ptr->money, sShopData.itemPrice); PlaySE(SE_SHOP); PrintMoneyAmountInMoneyBox(0, GetMoney(&gSaveBlock1Ptr->money), 0); gTasks[taskId].func = Task_ReturnToItemListAfterItemPurchase; } static void Task_ReturnToItemListAfterItemPurchase(u8 taskId) { s16 *data = gTasks[taskId].data; if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); if ((ItemId_GetPocket(tItemId) == POCKET_POKE_BALLS) && tItemCount > 9 && AddBagItem(ITEM_PREMIER_BALL, tItemCount / 10) == TRUE) { if (tItemCount > 19) { BuyMenuDisplayMessage(taskId, gText_ThrowInPremierBalls, BuyMenuReturnToItemList); } else { BuyMenuDisplayMessage(taskId, gText_ThrowInPremierBall, BuyMenuReturnToItemList); } } else { BuyMenuReturnToItemList(taskId); } } } static void BuyMenuReturnToItemList(u8 taskId) { s16 *data = gTasks[taskId].data; ClearDialogWindowAndFrameToTransparent(2, FALSE); BuyMenuPrintCursor(tListTaskId, 1); RecolorItemDescriptionBox(0); PutWindowTilemap(4); PutWindowTilemap(5); if (sShopData.martType == MART_TYPE_TMHM) PutWindowTilemap(6); ScheduleBgCopyTilemapToVram(0); BuyMenuAddScrollIndicatorArrows(); gTasks[taskId].func = Task_BuyMenu; } static void ExitBuyMenu(u8 taskId) { gFieldCallback = MapPostLoadHook_ReturnToShopMenu; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ExitBuyMenu; } static void Task_ExitBuyMenu(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { DestroyListMenuTask(tListTaskId, NULL, NULL); BuyMenuFreeMemory(); SetMainCallback2(CB2_ReturnToField); DestroyTask(taskId); } } static void DebugFunc_PrintPurchaseDetails(u8 taskId) { } static void DebugFunc_PrintShopMenuHistoryBeforeClearMaybe(void) { } // Records a transaction during a single shopping session. // This is for the Quest Log to save information about the player's purchases/sales when they finish. void RecordItemTransaction(u16 itemId, u16 quantity, u8 logEventId) { struct QuestLogEvent_Shop *history; // There should only be a single entry for buying/selling respectively, // so if one has already been created then get it first. if (sHistory[0].logEventId == logEventId) { history = &sHistory[0]; } else if (sHistory[1].logEventId == logEventId) { history = &sHistory[1]; } else { // First transaction of this type, save it in an empty slot if (sHistory[0].logEventId == 0) history = &sHistory[0]; else history = &sHistory[1]; history->logEventId = logEventId; } // Set flag if this isn't the first time we've bought/sold in this session if (history->lastItemId != ITEM_NONE) history->hasMultipleTransactions = TRUE; history->lastItemId = itemId; // Add to number of items bought/sold if (history->itemQuantity < 999) { history->itemQuantity += quantity; if (history->itemQuantity > 999) history->itemQuantity = 999; } // Add to amount of money spent buying or earned selling if (history->totalMoney < 999999) { // logEventId will either be 1 (bought) or 2 (sold) // so for buying it will add the full price and selling will add half price history->totalMoney += (ItemId_GetPrice(itemId) >> (logEventId - 1)) * quantity; if (history->totalMoney > 999999) history->totalMoney = 999999; } } // Will record QL_EVENT_BOUGHT_ITEM and/or QL_EVENT_SOLD_ITEM, or nothing. static void RecordTransactionForQuestLog(void) { u16 eventId = sHistory[0].logEventId; if (eventId != 0) SetQuestLogEvent(eventId + QL_EVENT_USED_POKEMART, (const u16 *)&sHistory[0]); eventId = sHistory[1].logEventId; if (eventId != 0) SetQuestLogEvent(eventId + QL_EVENT_USED_POKEMART, (const u16 *)&sHistory[1]); } void CreatePokemartMenu(const u16 *itemsForSale) { SetShopItemsForSale(itemsForSale); CreateShopMenu(MART_TYPE_REGULAR); SetShopMenuCallback(ScriptContext_Enable); DebugFunc_PrintShopMenuHistoryBeforeClearMaybe(); memset(&sHistory, 0, sizeof(sHistory)); sHistory[0].mapSec = gMapHeader.regionMapSectionId; sHistory[1].mapSec = gMapHeader.regionMapSectionId; } void CreateDecorationShop1Menu(const u16 *itemsForSale) { SetShopItemsForSale(itemsForSale); CreateShopMenu(MART_TYPE_DECOR); SetShopMenuCallback(ScriptContext_Enable); } void CreateDecorationShop2Menu(const u16 *itemsForSale) { SetShopItemsForSale(itemsForSale); CreateShopMenu(MART_TYPE_DECOR2); SetShopMenuCallback(ScriptContext_Enable); } ================================================ FILE: src/slot_machine.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "task.h" #include "coins.h" #include "quest_log.h" #include "overworld.h" #include "menu.h" #include "new_menu_helpers.h" #include "text_window.h" #include "random.h" #include "trig.h" #include "strings.h" #include "constants/songs.h" #define NUM_REELS 3 #define REEL_LENGTH 21 // Total number of icons per reel // Only 4 icons are actually visible per reel at a single // time, with 1 on deck. Only 3 visible when not spinning. #define REEL_LOAD_LENGTH 5 // 3 horizontal, 2 diagonal #define NUM_MATCH_LINES 5 #define NUM_BUTTON_TILES 4 #define NUM_DIGIT_SPRITES 4 enum { PALSLOT_LINE_NORMAL = 4, // Loaded as part of sBg_Pal PALSLOT_LINE_BET, PALSLOT_LINE_MATCH, }; enum { GFXTAG_REEL_ICONS, GFXTAG_CLEFAIRY, GFXTAG_DIGITS, }; enum { PALTAG_REEL_ICONS_0, PALTAG_REEL_ICONS_1, PALTAG_REEL_ICONS_2, PALTAG_REEL_ICONS_3, PALTAG_REEL_ICONS_4, PALTAG_CLEFAIRY, PALTAG_DIGITS, }; enum { ICON_7, ICON_ROCKET, ICON_PIKACHU, ICON_PSYDUCK, // Psyduck in FR, Slowpoke in LG ICON_CHERRIES, ICON_MAGNEMITE, // Magnemite in FR, Voltorb in LG ICON_SHELLDER, // Shellder in FR, Staryu in LG }; enum { PAYOUT_NONE, PAYOUT_CHERRIES2, PAYOUT_CHERRIES3, PAYOUT_MAGSHELL, PAYOUT_PIKAPSY, PAYOUT_ROCKET, PAYOUT_7, NUM_PAYOUT_TYPES }; enum { ROWATTR_COL1POS, ROWATTR_COL2POS, ROWATTR_COL3POS, ROWATTR_MINBET, }; enum { SLOTTASK_GFX_INIT, SLOTTASK_FADEOUT_EXIT, SLOTTASK_UPDATE_LINE_LIGHTS, SLOTTASK_CLEFAIRY_BOUNCE, SLOTTASK_ANIM_WIN, SLOTTASK_END_ANIM_WIN, SLOTTASK_ANIM_LOSE, SLOTTASK_ANIM_BETTING, SLOTTASK_SHOW_AMOUNTS, SLOTTASK_MSG_NO_COINS, SLOTTASK_ASK_QUIT, SLOTTASK_DESTROY_YESNO, SLOTTASK_PRESS_BUTTON, SLOTTASK_RELEASE_BUTTONS, SLOTTASK_SHOWHELP, SLOTTASK_HIDEHELP, }; struct SlotMachineState { MainCallback savedCallback; u16 machineIdx; u16 currentReel; u16 machineBias; u16 slotRewardClass; u16 biasCooldown; u16 bet; u8 taskId; u8 spinReelsTaskId; bool32 reelIsSpinning[NUM_REELS]; s16 reelPositions[NUM_REELS]; s16 reelSubpixel[NUM_REELS]; s16 destReelPos[NUM_REELS]; s16 reelStopOrder[NUM_REELS]; u32 reel2BiasInPlay; bool32 winFlags[NUM_MATCH_LINES]; u16 payout; }; struct SlotMachineGfxManager { u32 field_00[NUM_REELS]; // Never read struct Sprite *reelIconSprites[NUM_REELS][REEL_LOAD_LENGTH]; struct Sprite *creditDigitSprites[NUM_DIGIT_SPRITES]; struct Sprite *payoutDigitSprites[NUM_DIGIT_SPRITES]; struct Sprite *clefairySprites[2]; vu16 * reelIconAffineParamPtr; }; struct SlotMachineSetupTaskDataSub_0000 { u16 funcno; u8 state; bool8 active; }; struct SlotMachineSetupTaskData { struct SlotMachineSetupTaskDataSub_0000 tasks[8]; u8 reelButtonToPress; // align 2 s32 bg1X; bool32 yesNoMenuActive; u16 buttonPressedTiles[NUM_REELS][NUM_BUTTON_TILES]; u16 buttonReleasedTiles[NUM_REELS][NUM_BUTTON_TILES]; u8 unusedBuffer[BG_SCREEN_SIZE]; u8 bg0TilemapBuffer[BG_SCREEN_SIZE]; u8 bg1TilemapBuffer[BG_SCREEN_SIZE]; u8 bg2TilemapBuffer[BG_SCREEN_SIZE]; u8 bg3TilemapBuffer[BG_SCREEN_SIZE]; }; // size: 285C struct LineStateTileIdxList { const u16 * tiles; u32 count; }; static EWRAM_DATA struct SlotMachineState * sSlotMachineState = NULL; static EWRAM_DATA struct SlotMachineGfxManager * sSlotMachineGfxManager = NULL; static void InitSlotMachineState(struct SlotMachineState * ptr); static void CB2_InitSlotMachine(void); static void CleanSupSlotMachineState(void); static void CB2_RunSlotMachine(void); static void MainTask_SlotsGameLoop(u8 taskId); static void MainTask_NoCoinsGameOver(u8 taskId); static void MainTask_ShowHelp(u8 taskId); static void MainTask_ConfirmExitGame(u8 taskId); static void MainTask_DarnNoPayout(u8 taskId); static void MainTask_WinHandlePayout(u8 taskId); static void MainTask_ExitSlots(u8 taskId); static void SetMainTask(TaskFunc taskFunc); static void Task_SpinReels(u8 taskId); static void StartReels(void); static void StopCurrentReel(u16 whichReel, u16 whichReel2); static bool32 IsReelSpinning(u16); static void StopReel1(u16 whichReel); static void StopReel2(u16 whichReel); static void StopReel3(u16 whichReel); static bool32 TwoReelBiasCheck(s32 reel0id, s32 reel0pos, s32 reel1id, s32 reel1pos, s32 icon); static bool32 OneReelBiasCheck(s32, s32, s32); static bool32 TestReelIconAttribute(s32 attr, s32 icon); static void CalcSlotBias(void); static void ResetMachineBias(void); static u16 CalcPayout(void); static void InitGfxManager(struct SlotMachineGfxManager * manager); static void UpdateReelIconSprites(const s16 *, const s16 *); static bool32 CreateSlotMachine(void); static void DestroySlotMachine(void); static struct SlotMachineSetupTaskData * GetSlotMachineSetupTaskDataPtr(void); static void Task_SlotMachine(u8 taskId); static void SetSlotMachineSetupTask(u16 funcno, u8 taskId); static bool32 IsSlotMachineSetupTaskActive(u8 taskId); static bool8 SlotsTask_GraphicsInit(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_FadeOut(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_UpdateLineStates(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_ClefairyUpdateOnReelsStart(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_StartClefairyDanceAndWinningLineFlash(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_StopWinningLineFlashTask(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_ClefairyFainted(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_ClefairyNeutral(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_UpdateCoinsDisplay(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_MessageOutOfCoins(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_AskQuitPlaying(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_DestroyYesNoMenu(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_PressReelButton(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_ReleaseReelButtons(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_ShowHelp(u8 *state, struct SlotMachineSetupTaskData * ptr); static bool8 SlotsTask_HideHelp(u8 *state, struct SlotMachineSetupTaskData * ptr); static void Slot_PrintOnWindow0(const u8 * str); static void Slot_ClearWindow0(void); static void SetLineStatesByBet(u16 * bgTilemapBuffer); static void SetLineState(u16 * bgTilemapBuffer, u16 lineId, u16 paletteNo); static void Task_FlashWinningLine(u8 taskId); static void SignalStopWinningLineFlashTask(void); static void Slot_CreateYesNoMenu(u8 cursorPos); static void Slot_DestroyYesNoMenu(void); static void InitReelButtonTileMem(void); static void SetReelButtonPressed(u8 reel); static void ReleaseReelButtons(void); static void PressReelButton(u8 reel, u8 taskId); static const u8 sSecondReelBiasCheckIndices[][2] = { {0x00, 0x03}, {0x00, 0x06}, {0x03, 0x06}, {0x01, 0x04}, {0x01, 0x07}, {0x04, 0x07}, {0x02, 0x05}, {0x02, 0x08}, {0x05, 0x08}, {0x00, 0x04}, {0x00, 0x08}, {0x04, 0x08}, {0x02, 0x04}, {0x02, 0x06}, {0x04, 0x06} }; static const u8 sThirdReelBiasCheckIndices[NUM_MATCH_LINES][3] = { {0x00, 0x03, 0x06}, // top row {0x01, 0x04, 0x07}, // middle row {0x02, 0x05, 0x08}, // bottom row {0x00, 0x04, 0x08}, // tl-br {0x02, 0x04, 0x06} // bl-tr }; static const u8 sRowAttributes[NUM_MATCH_LINES][4] = { {0x00, 0x04, 0x08, 0x03}, // tl-br {0x00, 0x03, 0x06, 0x02}, // top row {0x01, 0x04, 0x07, 0x01}, // middle row {0x02, 0x05, 0x08, 0x02}, // bottom row {0x02, 0x04, 0x06, 0x03} // bl-tr }; static const u16 sReelBiasChances[][NUM_PAYOUT_TYPES] = { { [PAYOUT_NONE] = 0x1fa1, [PAYOUT_CHERRIES2] = 0x2eab, [PAYOUT_CHERRIES3] = 0x3630, [PAYOUT_MAGSHELL] = 0x39f3, [PAYOUT_PIKAPSY] = 0x3bd4, [PAYOUT_ROCKET] = 0x3bfc, [PAYOUT_7] = 0x0049, }, { [PAYOUT_NONE] = 0x1f97, [PAYOUT_CHERRIES2] = 0x2ea2, [PAYOUT_CHERRIES3] = 0x3627, [PAYOUT_MAGSHELL] = 0x39e9, [PAYOUT_PIKAPSY] = 0x3bca, [PAYOUT_ROCKET] = 0x3bf8, [PAYOUT_7] = 0x0049, }, { [PAYOUT_NONE] = 0x1f91, [PAYOUT_CHERRIES2] = 0x2e9b, [PAYOUT_CHERRIES3] = 0x3620, [PAYOUT_MAGSHELL] = 0x39e3, [PAYOUT_PIKAPSY] = 0x3bc4, [PAYOUT_ROCKET] = 0x3bf4, [PAYOUT_7] = 0x0049, }, { [PAYOUT_NONE] = 0x1f87, [PAYOUT_CHERRIES2] = 0x2e92, [PAYOUT_CHERRIES3] = 0x3617, [PAYOUT_MAGSHELL] = 0x39d9, [PAYOUT_PIKAPSY] = 0x3bba, [PAYOUT_ROCKET] = 0x3bef, [PAYOUT_7] = 0x0050, }, { [PAYOUT_NONE] = 0x1f7f, [PAYOUT_CHERRIES2] = 0x2e89, [PAYOUT_CHERRIES3] = 0x360e, [PAYOUT_MAGSHELL] = 0x39d1, [PAYOUT_PIKAPSY] = 0x3bb2, [PAYOUT_ROCKET] = 0x3bea, [PAYOUT_7] = 0x0050, }, { [PAYOUT_NONE] = 0x1fc9, [PAYOUT_CHERRIES2] = 0x2efc, [PAYOUT_CHERRIES3] = 0x3696, [PAYOUT_MAGSHELL] = 0x3a63, [PAYOUT_PIKAPSY] = 0x3c49, [PAYOUT_ROCKET] = 0x3c8b, [PAYOUT_7] = 0x0073, }, }; static const u8 sReelIconAnimByReelAndPos[NUM_REELS][REEL_LENGTH] = { { ICON_7, ICON_PSYDUCK, ICON_CHERRIES, ICON_ROCKET, ICON_PIKACHU, ICON_SHELLDER, ICON_PIKACHU, ICON_MAGNEMITE, ICON_7, ICON_SHELLDER, ICON_PSYDUCK, ICON_ROCKET, ICON_CHERRIES, ICON_PIKACHU, ICON_SHELLDER, ICON_7, ICON_MAGNEMITE, ICON_PIKACHU, ICON_ROCKET, ICON_SHELLDER, ICON_PIKACHU }, { ICON_7, ICON_MAGNEMITE, ICON_CHERRIES, ICON_PSYDUCK, ICON_ROCKET, ICON_MAGNEMITE, ICON_CHERRIES, ICON_PSYDUCK, ICON_PIKACHU, ICON_MAGNEMITE, ICON_CHERRIES, ICON_PSYDUCK, ICON_7, ICON_MAGNEMITE, ICON_CHERRIES, ICON_ROCKET, ICON_PSYDUCK, ICON_SHELLDER, ICON_MAGNEMITE, ICON_PSYDUCK, ICON_CHERRIES }, { ICON_7, ICON_PSYDUCK, ICON_SHELLDER, ICON_MAGNEMITE, ICON_PIKACHU, ICON_PSYDUCK, ICON_SHELLDER, ICON_MAGNEMITE, ICON_PIKACHU, ICON_PSYDUCK, ICON_MAGNEMITE, ICON_SHELLDER, ICON_PIKACHU, ICON_PSYDUCK, ICON_MAGNEMITE, ICON_SHELLDER, ICON_PIKACHU, ICON_PSYDUCK, ICON_MAGNEMITE, ICON_SHELLDER, ICON_ROCKET }, }; static const u16 sPayoutTable[] = { [PAYOUT_NONE] = 0, [PAYOUT_CHERRIES2] = 2, [PAYOUT_CHERRIES3] = 6, [PAYOUT_MAGSHELL] = 8, [PAYOUT_PIKAPSY] = 15, [PAYOUT_ROCKET] = 100, [PAYOUT_7] = 300 }; static const u16 sReelIcons_Pal_FR[][16] = INCBIN_U16("graphics/slot_machine/firered/reel_icons.gbapal"); static const u32 sReelIcons_Tiles_FR[] = INCBIN_U32("graphics/slot_machine/firered/reel_icons.4bpp.lz"); static const u16 sClefairy_Pal_FR[] = INCBIN_U16("graphics/slot_machine/firered/clefairy.gbapal"); static const u32 sClefairy_Tiles_FR[] = INCBIN_U32("graphics/slot_machine/firered/clefairy.4bpp.lz"); static const u16 sReelIcons_Pal_LG[][16] = INCBIN_U16("graphics/slot_machine/leafgreen/reel_icons.gbapal"); static const u32 sReelIcons_Tiles_LG[] = INCBIN_U32("graphics/slot_machine/leafgreen/reel_icons.4bpp.lz"); static const u16 sClefairy_Pal_LG[] = INCBIN_U16("graphics/slot_machine/leafgreen/clefairy.gbapal"); static const u32 sClefairy_Tiles_LG[] = INCBIN_U32("graphics/slot_machine/leafgreen/clefairy.4bpp.lz"); static const u16 sDigits_Pal[] = INCBIN_U16("graphics/slot_machine/digits.gbapal"); static const u32 sDigits_Tiles[] = INCBIN_U32("graphics/slot_machine/digits.4bpp.lz"); static const struct CompressedSpriteSheet sSpriteSheets_FR[] = { {.data = sReelIcons_Tiles_FR, .size = 0xe00, .tag = GFXTAG_REEL_ICONS}, {.data = sClefairy_Tiles_FR, .size = 0xc00, .tag = GFXTAG_CLEFAIRY}, {.data = sDigits_Tiles, .size = 0x280, .tag = GFXTAG_DIGITS}, }; static const struct CompressedSpriteSheet sSpriteSheets_LG[] = { {.data = sReelIcons_Tiles_LG, .size = 0xe00, .tag = GFXTAG_REEL_ICONS}, {.data = sClefairy_Tiles_LG, .size = 0xc00, .tag = GFXTAG_CLEFAIRY}, {.data = sDigits_Tiles, .size = 0x280, .tag = GFXTAG_DIGITS}, }; static const struct SpritePalette sSpritePalettes_FR[] = { {.data = sReelIcons_Pal_FR[0], .tag = PALTAG_REEL_ICONS_0}, {.data = sReelIcons_Pal_FR[1], .tag = PALTAG_REEL_ICONS_1}, {.data = sReelIcons_Pal_FR[2], .tag = PALTAG_REEL_ICONS_2}, {.data = sReelIcons_Pal_FR[3], .tag = PALTAG_REEL_ICONS_3}, {.data = sReelIcons_Pal_FR[4], .tag = PALTAG_REEL_ICONS_4}, {.data = sClefairy_Pal_FR, .tag = PALTAG_CLEFAIRY}, {.data = sDigits_Pal, .tag = PALTAG_DIGITS}, {} }; static const struct SpritePalette sSpritePalettes_LG[] = { {.data = sReelIcons_Pal_LG[0], .tag = PALTAG_REEL_ICONS_0}, {.data = sReelIcons_Pal_LG[1], .tag = PALTAG_REEL_ICONS_1}, {.data = sReelIcons_Pal_LG[2], .tag = PALTAG_REEL_ICONS_2}, {.data = sReelIcons_Pal_LG[3], .tag = PALTAG_REEL_ICONS_3}, {.data = sReelIcons_Pal_LG[4], .tag = PALTAG_REEL_ICONS_4}, {.data = sClefairy_Pal_LG, .tag = PALTAG_CLEFAIRY}, {.data = sDigits_Pal, .tag = PALTAG_DIGITS}, {} }; static const u16 sReelIconPaletteTags_FR[] = { [ICON_7] = PALTAG_REEL_ICONS_2, [ICON_ROCKET] = PALTAG_REEL_ICONS_2, [ICON_PIKACHU] = PALTAG_REEL_ICONS_0, [ICON_PSYDUCK] = PALTAG_REEL_ICONS_0, [ICON_CHERRIES] = PALTAG_REEL_ICONS_2, [ICON_MAGNEMITE] = PALTAG_REEL_ICONS_4, [ICON_SHELLDER] = PALTAG_REEL_ICONS_3, }; static const u16 sReelIconPaletteTags_LG[] = { [ICON_7] = PALTAG_REEL_ICONS_2, [ICON_ROCKET] = PALTAG_REEL_ICONS_2, [ICON_PIKACHU] = PALTAG_REEL_ICONS_0, [ICON_PSYDUCK] = PALTAG_REEL_ICONS_3, [ICON_CHERRIES] = PALTAG_REEL_ICONS_2, [ICON_MAGNEMITE] = PALTAG_REEL_ICONS_1, [ICON_SHELLDER] = PALTAG_REEL_ICONS_1, }; static const u16 sReelIconAffineParams[] = { 0x0120, 0x011f, 0x011e, 0x011d, 0x011c, 0x011b, 0x011a, 0x0119, 0x0118, 0x0117, 0x0116, 0x0115, 0x0114, 0x0113, 0x0112, 0x0111, 0x0110, 0x010f, 0x010e, 0x010d, 0x010c, 0x010b, 0x010a, 0x0109, 0x0108, 0x0107, 0x0106, 0x0105, 0x0104, 0x0103, 0x0102, 0x0101, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010b, 0x010c, 0x010d, 0x010e, 0x010f, 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011a, 0x011b, 0x011c, 0x011d, 0x011e, 0x011f, 0x0120 }; static const u8 sReelIconBldY[] = { 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0c, 0x0b, 0x0a, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x04, 0x04, 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f }; static const struct OamData sOamData_ReelIcons = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .x = 0, .matrixNum = 0, .size = ST_OAM_SIZE_2, .tileNum = 0, .priority = 3, .paletteNum = 0, .affineParam = 0 }; static const union AnimCmd sAnimCmd_ReelIcon_7[] = { ANIMCMD_FRAME(0x00, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Rocket[] = { ANIMCMD_FRAME(0x10, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Pikachu[] = { ANIMCMD_FRAME(0x20, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Psyduck[] = { ANIMCMD_FRAME(0x30, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Cherries[] = { ANIMCMD_FRAME(0x40, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Magnemite[] = { ANIMCMD_FRAME(0x50, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Shellder[] = { ANIMCMD_FRAME(0x60, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Pikachu_2[] = { ANIMCMD_FRAME(0x20, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Psyduck_2[] = { ANIMCMD_FRAME(0x30, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Cherries_2[] = { ANIMCMD_FRAME(0x40, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Magnemite_2[] = { ANIMCMD_FRAME(0x50, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_ReelIcon_Shellder_2[] = { ANIMCMD_FRAME(0x60, 4), ANIMCMD_END }; static const union AnimCmd *const sAnimTable_ReelIcons[] = { [ICON_7] = sAnimCmd_ReelIcon_7, [ICON_ROCKET] = sAnimCmd_ReelIcon_Rocket, [ICON_PIKACHU] = sAnimCmd_ReelIcon_Pikachu, [ICON_PSYDUCK] = sAnimCmd_ReelIcon_Psyduck, [ICON_CHERRIES] = sAnimCmd_ReelIcon_Cherries, [ICON_MAGNEMITE] = sAnimCmd_ReelIcon_Magnemite, [ICON_SHELLDER] = sAnimCmd_ReelIcon_Shellder, sAnimCmd_ReelIcon_Pikachu_2, sAnimCmd_ReelIcon_Psyduck_2, sAnimCmd_ReelIcon_Cherries_2, sAnimCmd_ReelIcon_Magnemite_2, sAnimCmd_ReelIcon_Shellder_2 }; static const union AffineAnimCmd sAffineAnimCmd_ReelIcons_Unused[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnimTable_ReelIcons_Unused[] = { sAffineAnimCmd_ReelIcons_Unused }; static const struct SpriteTemplate sSpriteTemplate_ReelIcons = { .tileTag = GFXTAG_REEL_ICONS, .paletteTag = PALTAG_REEL_ICONS_0, .oam = &sOamData_ReelIcons, .anims = sAnimTable_ReelIcons, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_Digits = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_V_RECTANGLE, .x = 0, .matrixNum = 0, .size = ST_OAM_SIZE_0, .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0 }; static const union AnimCmd sSpriteAnim_Digit0[] = { ANIMCMD_FRAME(0x00, 4), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Digit1[] = { ANIMCMD_FRAME(0x02, 4), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Digit2[] = { ANIMCMD_FRAME(0x04, 4), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Digit3[] = { ANIMCMD_FRAME(0x06, 4), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Digit4[] = { ANIMCMD_FRAME(0x08, 4), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Digit5[] = { ANIMCMD_FRAME(0x0a, 4), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Digit6[] = { ANIMCMD_FRAME(0x0c, 4), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Digit7[] = { ANIMCMD_FRAME(0x0e, 4), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Digit8[] = { ANIMCMD_FRAME(0x10, 4), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Digit9[] = { ANIMCMD_FRAME(0x12, 4), ANIMCMD_END }; static const union AnimCmd *const sAnimTable_Digits[] = { sSpriteAnim_Digit0, sSpriteAnim_Digit1, sSpriteAnim_Digit2, sSpriteAnim_Digit3, sSpriteAnim_Digit4, sSpriteAnim_Digit5, sSpriteAnim_Digit6, sSpriteAnim_Digit7, sSpriteAnim_Digit8, sSpriteAnim_Digit9 }; static const struct SpriteTemplate sSpriteTemplate_Digits = { .tileTag = GFXTAG_DIGITS, .paletteTag = PALTAG_DIGITS, .oam = &sOamData_Digits, .anims = sAnimTable_Digits, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_Clefairy = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .x = 0, .matrixNum = 0, .size = ST_OAM_SIZE_2, .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0 }; static const union AnimCmd sAnimCmd_Clefairy_Neutral[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_END }; static const union AnimCmd sAnimCmd_Clefairy_Spinning[] = { ANIMCMD_FRAME( 0, 24), ANIMCMD_FRAME(16, 24), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnimCmd_Clefairy_Payout[] = { ANIMCMD_FRAME(32, 28), ANIMCMD_FRAME(48, 28), ANIMCMD_JUMP(0) }; static const union AnimCmd sAnimCmd_Clefairy_Lose[] = { ANIMCMD_FRAME(64, 12), ANIMCMD_FRAME(80, 12), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sAnimTable_Clefairy[] = { sAnimCmd_Clefairy_Neutral, sAnimCmd_Clefairy_Spinning, sAnimCmd_Clefairy_Payout, sAnimCmd_Clefairy_Lose }; static const struct SpriteTemplate sSpriteTemplate_Clefairy = { .tileTag = GFXTAG_CLEFAIRY, .paletteTag = PALTAG_CLEFAIRY, .oam = &sOamData_Clefairy, .anims = sAnimTable_Clefairy, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; bool8 (*const sSlotMachineSetupTasks[])(u8 *, struct SlotMachineSetupTaskData *) = { [SLOTTASK_GFX_INIT] = SlotsTask_GraphicsInit, [SLOTTASK_FADEOUT_EXIT] = SlotsTask_FadeOut, [SLOTTASK_UPDATE_LINE_LIGHTS] = SlotsTask_UpdateLineStates, [SLOTTASK_CLEFAIRY_BOUNCE] = SlotsTask_ClefairyUpdateOnReelsStart, [SLOTTASK_ANIM_WIN] = SlotsTask_StartClefairyDanceAndWinningLineFlash, [SLOTTASK_END_ANIM_WIN] = SlotsTask_StopWinningLineFlashTask, [SLOTTASK_ANIM_LOSE] = SlotsTask_ClefairyFainted, [SLOTTASK_ANIM_BETTING] = SlotsTask_ClefairyNeutral, [SLOTTASK_SHOW_AMOUNTS] = SlotsTask_UpdateCoinsDisplay, [SLOTTASK_MSG_NO_COINS] = SlotsTask_MessageOutOfCoins, [SLOTTASK_ASK_QUIT] = SlotsTask_AskQuitPlaying, [SLOTTASK_DESTROY_YESNO] = SlotsTask_DestroyYesNoMenu, [SLOTTASK_PRESS_BUTTON] = SlotsTask_PressReelButton, [SLOTTASK_RELEASE_BUTTONS] = SlotsTask_ReleaseReelButtons, [SLOTTASK_SHOWHELP] = SlotsTask_ShowHelp, [SLOTTASK_HIDEHELP] = SlotsTask_HideHelp }; static const u16 sBg_Pal_FR[][16] = INCBIN_U16("graphics/slot_machine/firered/bg.gbapal"); static const u32 sBg_Tiles_FR[] = INCBIN_U32("graphics/slot_machine/firered/bg.4bpp.lz"); static const u32 sBg_Tilemap_FR[] = INCBIN_U32("graphics/slot_machine/firered/bg.bin.lz"); static const u16 sBgPal_MatchLines_FR[] = INCBIN_U16("graphics/slot_machine/firered/match_lines.gbapal"); static const u16 sBgPal_PayoutLight_FR[][16] = INCBIN_U16("graphics/slot_machine/firered/payout_lights.gbapal"); static const u32 sButtonPressed_Tiles_FR[] = INCBIN_U32("graphics/slot_machine/firered/button_pressed.4bpp.lz"); static const u16 sCombosWindow_Pal_FR[] = INCBIN_U16("graphics/slot_machine/firered/combos_window.gbapal"); static const u32 sCombosWindow_Tiles_FR[] = INCBIN_U32("graphics/slot_machine/firered/combos_window.4bpp.lz"); static const u32 sCombosWindow_Tilemap_FR[] = INCBIN_U32("graphics/slot_machine/firered/combos_window.bin.lz"); static const u16 sBg_Pal_LG[][16] = INCBIN_U16("graphics/slot_machine/leafgreen/bg.gbapal"); static const u32 sBg_Tiles_LG[] = INCBIN_U32("graphics/slot_machine/leafgreen/bg.4bpp.lz"); static const u32 sBg_Tilemap_LG[] = INCBIN_U32("graphics/slot_machine/leafgreen/bg.bin.lz"); static const u16 sBgPal_MatchLines_LG[] = INCBIN_U16("graphics/slot_machine/leafgreen/match_lines.gbapal"); static const u16 sBgPal_PayoutLight_LG[][16] = INCBIN_U16("graphics/slot_machine/leafgreen/payout_lights.gbapal"); static const u32 sButtonPressed_Tiles_LG[] = INCBIN_U32("graphics/slot_machine/leafgreen/button_pressed.4bpp.lz"); static const u16 sCombosWindow_Pal_LG[] = INCBIN_U16("graphics/slot_machine/leafgreen/combos_window.gbapal"); static const u32 sCombosWindow_Tiles_LG[] = INCBIN_U32("graphics/slot_machine/leafgreen/combos_window.4bpp.lz"); static const u32 sCombosWindow_Tilemap_LG[] = INCBIN_U32("graphics/slot_machine/leafgreen/combos_window.bin.lz"); static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 2, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 1, .mapBaseIndex = 28, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 } }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 5, .tilemapTop = 15, .width = 20, .height = 4, .paletteNum = 15, .baseBlock = 0x04f }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 2, .paletteNum = 14, .baseBlock = 0x013 }, DUMMY_WIN_TEMPLATE }; static const u16 sLineTiles_TLBR[] = { 0x00a4, 0x00a5, 0x00a6, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00e7, 0x012c, 0x014c, 0x0191, 0x01b1, 0x01f6, 0x0216, 0x0217, 0x0218, 0x0219, 0x0237, 0x0238, 0x0239 }; static const u16 sLineTiles_TopRow[] = { 0x00e4, 0x00e5, 0x00e6, 0x00f7, 0x00f8, 0x00f9, 0x0104, 0x0105, 0x0106, 0x0107, 0x010c, 0x0111, 0x0116, 0x0117, 0x0118, 0x0119, 0x0124, 0x0125, 0x0126, 0x0137, 0x0138, 0x0139 }; static const u16 sLineTiles_MiddleRow[] = { 0x0144, 0x0145, 0x0146, 0x0157, 0x0158, 0x0159, 0x0164, 0x0165, 0x0166, 0x0167, 0x016c, 0x0171, 0x0176, 0x0177, 0x0178, 0x0179, 0x0184, 0x0185, 0x0186, 0x0197, 0x0198, 0x0199 }; static const u16 sLineTiles_BottomRow[] = { 0x01a4, 0x01a5, 0x01a6, 0x01b7, 0x01b8, 0x01b9, 0x01c4, 0x01c5, 0x01c6, 0x01c7, 0x01cc, 0x01d1, 0x01d6, 0x01d7, 0x01d8, 0x01d9, 0x01e4, 0x01e5, 0x01e6, 0x01f7, 0x01f8, 0x01f9 }; static const u16 sLineTiles_BLTR[] = { 0x0204, 0x0205, 0x0206, 0x0224, 0x0225, 0x0226, 0x01e7, 0x0207, 0x018c, 0x01ac, 0x0131, 0x0151, 0x00d6, 0x00f6, 0x00b7, 0x00b8, 0x00b9, 0x00d7, 0x00d8, 0x00d9 }; static const struct LineStateTileIdxList sLineStateTileIdxs[NUM_MATCH_LINES] = { { sLineTiles_TLBR, ARRAY_COUNT(sLineTiles_TLBR) }, { sLineTiles_TopRow, ARRAY_COUNT(sLineTiles_TopRow) }, { sLineTiles_MiddleRow, ARRAY_COUNT(sLineTiles_MiddleRow) }, { sLineTiles_BottomRow, ARRAY_COUNT(sLineTiles_BottomRow) }, { sLineTiles_BLTR, ARRAY_COUNT(sLineTiles_BLTR) } }; static const u8 sWinningLineFlashPalIdxs[2] = {2, 4}; static const struct WindowTemplate sYesNoWindowTemplate = { .bg = 0, .tilemapLeft = 19, .tilemapTop = 9, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x9F }; static const u16 sReelButtonMapTileIdxs[NUM_REELS][NUM_BUTTON_TILES] = { {0x0229, 0x022a, 0x0249, 0x024a}, {0x022e, 0x022f, 0x024e, 0x024f}, {0x0233, 0x0234, 0x0253, 0x0254} }; void PlaySlotMachine(u16 machineIdx, MainCallback savedCallback) { ResetTasks(); sSlotMachineState = Alloc(sizeof(*sSlotMachineState)); if (sSlotMachineState == NULL) SetMainCallback2(savedCallback); else { if (machineIdx >= ARRAY_COUNT(sReelBiasChances)) machineIdx = 0; sSlotMachineState->machineIdx = machineIdx; sSlotMachineState->savedCallback = savedCallback; InitSlotMachineState(sSlotMachineState); SetMainCallback2(CB2_InitSlotMachine); } } static void InitSlotMachineState(struct SlotMachineState * ptr) { s32 i; ptr->currentReel = 0; ptr->bet = 0; ptr->payout = 0; // for whatever reason, the loop does not use the ptr param for (i = 0; i < NUM_REELS; i++) { sSlotMachineState->reelIsSpinning[i] = FALSE; sSlotMachineState->reelPositions[i] = 0; sSlotMachineState->reelSubpixel[i] = 0; sSlotMachineState->destReelPos[i] = REEL_LENGTH; } } static void CB2_InitSlotMachine(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); switch (gMain.state) { case 0: if (CreateSlotMachine()) { SetMainCallback2(sSlotMachineState->savedCallback); CleanSupSlotMachineState(); } else { SetSlotMachineSetupTask(SLOTTASK_GFX_INIT, 0); gMain.state++; } break; case 1: if (!IsSlotMachineSetupTaskActive(0)) { sSlotMachineState->taskId = CreateTask(MainTask_SlotsGameLoop, 0); sSlotMachineState->spinReelsTaskId = CreateTask(Task_SpinReels, 1); SetMainCallback2(CB2_RunSlotMachine); } break; } } static void CleanSupSlotMachineState(void) { DestroySlotMachine(); if (sSlotMachineState != NULL) { Free(sSlotMachineState); sSlotMachineState = NULL; } } static void CB2_RunSlotMachine(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void MainTask_SlotsGameLoop(u8 taskId) { s16 * data = gTasks[taskId].data; switch (data[0]) { case 0: // Betting Phase if (GetCoins() == 0) { SetMainTask(MainTask_NoCoinsGameOver); } else if (JOY_NEW(DPAD_DOWN)) { sSlotMachineState->bet++; RemoveCoins(1); PlaySE(SE_RS_SHOP); SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0); SetSlotMachineSetupTask(SLOTTASK_UPDATE_LINE_LIGHTS, 1); data[0] = 1; } else if (JOY_NEW(R_BUTTON)) { s32 toAdd = 3 - sSlotMachineState->bet; if (GetCoins() >= toAdd) { sSlotMachineState->bet = 3; RemoveCoins(toAdd); } else { sSlotMachineState->bet += GetCoins(); SetCoins(0); } PlaySE(SE_RS_SHOP); SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0); SetSlotMachineSetupTask(SLOTTASK_UPDATE_LINE_LIGHTS, 1); data[0] = 1; } else if (JOY_NEW(A_BUTTON) && sSlotMachineState->bet != 0) { data[0] = 2; } else if (JOY_NEW(B_BUTTON)) { SetMainTask(MainTask_ConfirmExitGame); } else if (JOY_NEW(DPAD_RIGHT)) { SetMainTask(MainTask_ShowHelp); } break; case 1: if (!IsSlotMachineSetupTaskActive(0) && !IsSlotMachineSetupTaskActive(1)) { if (sSlotMachineState->bet == 3 || GetCoins() == 0) data[0] = 2; else data[0] = 0; } break; case 2: SetQLPlayedTheSlots(); CalcSlotBias(); StartReels(); sSlotMachineState->currentReel = 0; SetSlotMachineSetupTask(SLOTTASK_CLEFAIRY_BOUNCE, 0); data[0] = 3; break; case 3: if (!IsSlotMachineSetupTaskActive(0)) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_CONTEST_PLACE); StopCurrentReel(sSlotMachineState->currentReel, sSlotMachineState->currentReel); PressReelButton(sSlotMachineState->currentReel, 0); data[0] = 4; } } break; case 4: if (IsReelSpinning(sSlotMachineState->currentReel) == 0 && !IsSlotMachineSetupTaskActive(0)) { sSlotMachineState->currentReel++; if (sSlotMachineState->currentReel >= NUM_REELS) { sSlotMachineState->slotRewardClass = CalcPayout(); sSlotMachineState->bet = 0; sSlotMachineState->currentReel = 0; if (sSlotMachineState->slotRewardClass == PAYOUT_NONE) SetMainTask(MainTask_DarnNoPayout); else { if (sSlotMachineState->slotRewardClass == PAYOUT_7) IncrementGameStat(GAME_STAT_SLOT_JACKPOTS); ResetMachineBias(); SetMainTask(MainTask_WinHandlePayout); } } else data[0] = 3; } break; } } static void MainTask_NoCoinsGameOver(u8 taskId) { s16 * data = gTasks[taskId].data; switch (data[0]) { case 0: SetSlotMachineSetupTask(SLOTTASK_MSG_NO_COINS, 0); data[0]++; break; case 1: if (!IsSlotMachineSetupTaskActive(0)) data[0]++; break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) SetMainTask(MainTask_ExitSlots); break; } } static void MainTask_ShowHelp(u8 taskId) { s16 * data = gTasks[taskId].data; switch (data[0]) { case 0: SetSlotMachineSetupTask(SLOTTASK_SHOWHELP, 0); data[0]++; break; case 1: if (!IsSlotMachineSetupTaskActive(0)) data[0]++; break; case 2: if (JOY_NEW(DPAD_LEFT)) { SetSlotMachineSetupTask(SLOTTASK_HIDEHELP, 0); data[0]++; } break; case 3: if (!IsSlotMachineSetupTaskActive(0)) SetMainTask(MainTask_SlotsGameLoop); break; } } static void MainTask_ConfirmExitGame(u8 taskId) { s16 * data = gTasks[taskId].data; switch (data[0]) { case 0: SetSlotMachineSetupTask(SLOTTASK_ASK_QUIT, 0); data[0]++; break; case 1: if (!IsSlotMachineSetupTaskActive(0)) data[0]++; break; case 2: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: AddCoins(sSlotMachineState->bet); SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0); data[0] = 3; break; case 1: case -1: SetSlotMachineSetupTask(SLOTTASK_DESTROY_YESNO, 0); data[0] = 4; break; } break; case 3: if (!IsSlotMachineSetupTaskActive(0)) SetMainTask(MainTask_ExitSlots); break; case 4: if (!IsSlotMachineSetupTaskActive(0)) SetMainTask(MainTask_SlotsGameLoop); break; } } static void MainTask_DarnNoPayout(u8 taskId) { s16 * data = gTasks[taskId].data; switch (data[0]) { case 0: SetSlotMachineSetupTask(SLOTTASK_ANIM_LOSE, 0); data[1] = 0; data[0]++; break; case 1: data[1]++; if (data[1] > 60) { SetSlotMachineSetupTask(SLOTTASK_ANIM_BETTING, 0); SetSlotMachineSetupTask(SLOTTASK_UPDATE_LINE_LIGHTS, 1); SetSlotMachineSetupTask(SLOTTASK_RELEASE_BUTTONS, 2); data[0]++; } break; case 2: if (!IsSlotMachineSetupTaskActive(0) && !IsSlotMachineSetupTaskActive(1) && !IsSlotMachineSetupTaskActive(2)) SetMainTask(MainTask_SlotsGameLoop); break; } } static void MainTask_WinHandlePayout(u8 taskId) { s16 * data = gTasks[taskId].data; switch (data[0]) { case 0: if (sSlotMachineState->slotRewardClass == PAYOUT_ROCKET || sSlotMachineState->slotRewardClass == PAYOUT_7) PlayFanfare(MUS_SLOTS_JACKPOT); else PlayFanfare(MUS_SLOTS_WIN); SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0); SetSlotMachineSetupTask(SLOTTASK_ANIM_WIN, 1); data[1] = 8; data[0]++; break; case 1: data[1]++; if (data[1] > 120) { data[1] = 8; if (JOY_HELD(A_BUTTON)) data[1] = 2; data[0]++; } break; case 2: if (!IsSlotMachineSetupTaskActive(0)) { if (IsFanfareTaskInactive() && JOY_NEW(START_BUTTON)) { AddCoins(sSlotMachineState->payout); sSlotMachineState->payout = 0; } else { data[1]--; if (data[1] == 0) { if (IsFanfareTaskInactive()) PlaySE(SE_PIN); if (sSlotMachineState->payout != 0) { AddCoins(1); sSlotMachineState->payout--; } data[1] = 8; if (JOY_HELD(A_BUTTON)) data[1] = 2; } } SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0); if (sSlotMachineState->payout == 0) data[0]++; } break; case 3: if (IsFanfareTaskInactive() && !IsSlotMachineSetupTaskActive(0)) { SetSlotMachineSetupTask(SLOTTASK_END_ANIM_WIN, 0); data[0]++; } break; case 4: if (!IsSlotMachineSetupTaskActive(0)) { SetSlotMachineSetupTask(SLOTTASK_UPDATE_LINE_LIGHTS, 0); SetSlotMachineSetupTask(SLOTTASK_RELEASE_BUTTONS, 1); data[0]++; } break; case 5: if (!IsSlotMachineSetupTaskActive(0) && !IsSlotMachineSetupTaskActive(1)) SetMainTask(MainTask_SlotsGameLoop); break; } } static void MainTask_ExitSlots(u8 taskId) { s16 * data = gTasks[taskId].data; switch (data[0]) { case 0: SetSlotMachineSetupTask(SLOTTASK_FADEOUT_EXIT, 0); data[0]++; break; case 1: if (!IsSlotMachineSetupTaskActive(0)) { SetMainCallback2(sSlotMachineState->savedCallback); CleanSupSlotMachineState(); } break; } } static void SetMainTask(TaskFunc taskFunc) { gTasks[sSlotMachineState->taskId].func = taskFunc; gTasks[sSlotMachineState->taskId].data[0] = 0; } static void Task_SpinReels(u8 taskId) { // taskId is never used s32 i; for (i = 0; i < NUM_REELS; i++) { if (sSlotMachineState->reelIsSpinning[i] || sSlotMachineState->reelSubpixel[i] != 0) { if (sSlotMachineState->reelSubpixel[i] != 0 || sSlotMachineState->reelPositions[i] != sSlotMachineState->destReelPos[i]) { sSlotMachineState->reelSubpixel[i]++; if (sSlotMachineState->reelSubpixel[i] > 2) { sSlotMachineState->reelSubpixel[i] = 0; sSlotMachineState->reelPositions[i]--; if (sSlotMachineState->reelPositions[i] < 0) sSlotMachineState->reelPositions[i] = REEL_LENGTH - 1; } if (sSlotMachineState->reelPositions[i] != sSlotMachineState->destReelPos[i]) continue; } sSlotMachineState->destReelPos[i] = REEL_LENGTH; sSlotMachineState->reelIsSpinning[i] = FALSE; } } UpdateReelIconSprites(sSlotMachineState->reelPositions, sSlotMachineState->reelSubpixel); } static void StartReels(void) { s32 i; for (i = 0; i < NUM_REELS; i++) sSlotMachineState->reelIsSpinning[i] = TRUE; } static void StopCurrentReel(u16 whichReel, u16 whichReel2) { switch (whichReel2) { case 0: StopReel1(whichReel); break; case 1: StopReel2(whichReel); break; case 2: StopReel3(whichReel); break; } } static bool32 IsReelSpinning(u16 whichReel) { return sSlotMachineState->reelIsSpinning[whichReel]; } static s16 GetNextReelPosition(u16 whichReel) { s16 position = sSlotMachineState->reelPositions[whichReel]; if (sSlotMachineState->reelSubpixel[whichReel] != 0) { position--; if (position < 0) position = REEL_LENGTH - 1; } return position; } static void StopReel1(u16 whichReel) { s32 i, j; s16 destPos; u8 posToSample[5]; s16 nextPos = GetNextReelPosition(whichReel); s32 numPosToSample = 0; if (sSlotMachineState->machineBias == 0 && whichReel == 0) { for (i = 0; i < 5; i++) { for (j = 0, destPos = nextPos - i + 1; j < 3; j++, destPos++) { if (destPos >= REEL_LENGTH) destPos = 0; if (TestReelIconAttribute(1, sReelIconAnimByReelAndPos[whichReel][destPos])) break; } if (j == 3) { posToSample[numPosToSample] = i; numPosToSample++; } } } else if (sSlotMachineState->machineBias != 1 || whichReel == 0) { for (i = 0, destPos = nextPos + 1; i < 3; i++, destPos++) { if (destPos >= REEL_LENGTH) destPos = 0; if (TestReelIconAttribute(sSlotMachineState->machineBias, sReelIconAnimByReelAndPos[whichReel][destPos])) { posToSample[0] = 0; numPosToSample = 1; break; } } for (i = 0, destPos = nextPos; i < 4; i++, destPos--) { if (destPos < 0) destPos = REEL_LENGTH - 1; if (TestReelIconAttribute(sSlotMachineState->machineBias, sReelIconAnimByReelAndPos[whichReel][destPos])) { posToSample[numPosToSample] = i + 1; numPosToSample++; } } } if (numPosToSample == 0) { destPos = Random() % 5; } else { destPos = posToSample[Random() % numPosToSample]; } destPos = nextPos - destPos; if (destPos < 0) destPos += REEL_LENGTH; sSlotMachineState->reelStopOrder[0] = whichReel; sSlotMachineState->destReelPos[whichReel] = destPos; } static void StopReel2(u16 whichReel) { s16 pos, firstStoppedReelPos, firstStoppedReelId, nextPos; s32 i; s32 numPossiblePositions; u8 possiblePositions[5]; firstStoppedReelId = sSlotMachineState->reelStopOrder[0]; firstStoppedReelPos = sSlotMachineState->reelPositions[firstStoppedReelId] + 1; if (firstStoppedReelPos >= REEL_LENGTH) firstStoppedReelPos = 0; nextPos = GetNextReelPosition(whichReel); pos = nextPos + 1; if (pos >= REEL_LENGTH) pos = 0; numPossiblePositions = 0; for (i = 0; i < 5; i++) { if (TwoReelBiasCheck(firstStoppedReelId, firstStoppedReelPos, whichReel, pos, sSlotMachineState->machineBias)) { possiblePositions[numPossiblePositions] = i; numPossiblePositions++; } pos--; if (pos < 0) pos = REEL_LENGTH - 1; } if (numPossiblePositions == 0) { sSlotMachineState->reel2BiasInPlay = 0; if (sSlotMachineState->machineBias == PAYOUT_ROCKET || sSlotMachineState->machineBias == PAYOUT_7) pos = 4; else pos = 0; } else { sSlotMachineState->reel2BiasInPlay = 1; pos = possiblePositions[0]; } pos = nextPos - pos; if (pos < 0) pos += REEL_LENGTH; sSlotMachineState->reelStopOrder[1] = whichReel; sSlotMachineState->destReelPos[whichReel] = pos; } static void StopReel3(u16 whichReel) { s32 i; s32 numPossiblePositions; s32 nextPos; s32 testPos; s32 pos; u8 possiblePositions[5]; nextPos = GetNextReelPosition(whichReel); testPos = nextPos; numPossiblePositions = 0; for (i = 0; i < 5; i++) { if (OneReelBiasCheck(whichReel, testPos, sSlotMachineState->machineBias)) { possiblePositions[numPossiblePositions] = i; numPossiblePositions++; } testPos--; if (testPos < 0) testPos = 20; } if (numPossiblePositions == 0) { if (sSlotMachineState->machineBias == PAYOUT_ROCKET || sSlotMachineState->machineBias == PAYOUT_7) pos = 4; else pos = 0; } else pos = possiblePositions[0]; pos = nextPos - pos; if (pos < 0) pos += REEL_LENGTH; sSlotMachineState->destReelPos[whichReel] = pos; } static bool32 TwoReelBiasCheck(s32 reel0id, s32 reel0pos, s32 reel1id, s32 reel1pos, s32 icon) { s32 i; u8 icons[9] = {}; for (i = 0; i < 9; i++) icons[i] = 7; for (i = 0; i < 3; i++) { icons[3 * reel0id + i] = sReelIconAnimByReelAndPos[reel0id][reel0pos]; icons[3 * reel1id + i] = sReelIconAnimByReelAndPos[reel1id][reel1pos]; reel0pos++; if (reel0pos >= REEL_LENGTH) reel0pos = 0; reel1pos++; if (reel1pos >= REEL_LENGTH) reel1pos = 0; } switch (icon) { case 0: for (i = 0; i < 3; i++) { if (TestReelIconAttribute(1, icons[i])) return FALSE; } for (i = 0; i < 15; i++) { if (icons[sSecondReelBiasCheckIndices[i][0]] == icons[sSecondReelBiasCheckIndices[i][1]]) return TRUE; } return FALSE; case 1: if (reel0id == 0 || reel1id == 0) { if (reel0id == 1 || reel1id == 1) { for (i = 0; i < 15; i += 3) { if (icons[sSecondReelBiasCheckIndices[i][0]] == icons[sSecondReelBiasCheckIndices[i][1]]) return FALSE; } } for (i = 0; i < 3; i++) { if (TestReelIconAttribute(icon, icons[i])) return TRUE; } return FALSE; } else return TRUE; case 2: if (reel0id == 2 || reel1id == 2) { for (i = 0; i < 9; i++) { if (TestReelIconAttribute(icon, icons[i])) return TRUE; } return FALSE; // wrong level } } for (i = 0; i < 15; i++) { if (icons[sSecondReelBiasCheckIndices[i][0]] == icons[sSecondReelBiasCheckIndices[i][1]] && TestReelIconAttribute(icon, icons[sSecondReelBiasCheckIndices[i][0]])) return TRUE; } return FALSE; } static bool32 OneReelBiasCheck(s32 reelId, s32 reelPos, s32 biasIcon) { u8 icons[9]; s32 secondStoppedPos, firstStoppedPos; s32 i; firstStoppedPos++; firstStoppedPos--; firstStoppedPos = sSlotMachineState->reelPositions[sSlotMachineState->reelStopOrder[0]] + 1; secondStoppedPos = sSlotMachineState->reelPositions[sSlotMachineState->reelStopOrder[1]] + 1; reelPos++; if (firstStoppedPos >= REEL_LENGTH) firstStoppedPos = 0; if (secondStoppedPos >= REEL_LENGTH) secondStoppedPos = 0; if (reelPos >= REEL_LENGTH) reelPos = 0; for (i = 0; i < 3; i++) { icons[sSlotMachineState->reelStopOrder[0] * 3 + i] = sReelIconAnimByReelAndPos[sSlotMachineState->reelStopOrder[0]][firstStoppedPos]; icons[sSlotMachineState->reelStopOrder[1] * 3 + i] = sReelIconAnimByReelAndPos[sSlotMachineState->reelStopOrder[1]][secondStoppedPos]; icons[reelId * 3 + i] = sReelIconAnimByReelAndPos[reelId][reelPos]; if (++firstStoppedPos >= REEL_LENGTH) firstStoppedPos = 0; if (++secondStoppedPos >= REEL_LENGTH) secondStoppedPos = 0; if (++reelPos >= REEL_LENGTH) reelPos = 0; } switch (biasIcon) { case PAYOUT_NONE: for (i = 0; i < 3; i++) { if (TestReelIconAttribute(1, icons[i])) return FALSE; } for (i = 0; i < NUM_MATCH_LINES; i++) { if (icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][1]] && icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][2]]) return FALSE; } return TRUE; case PAYOUT_CHERRIES2: for (i = 0; i < NUM_MATCH_LINES; i++) { if (icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][1]] && TestReelIconAttribute(biasIcon, icons[sThirdReelBiasCheckIndices[i][0]])) return FALSE; } for (i = 0; i < 3; i++) { if (TestReelIconAttribute(biasIcon, icons[i])) return TRUE; } return FALSE; case PAYOUT_CHERRIES3: for (i = 0; i < NUM_MATCH_LINES; i++) { if (icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][1]] && TestReelIconAttribute(biasIcon, icons[sThirdReelBiasCheckIndices[i][0]])) return TRUE; } return FALSE; } for (i = 0; i < NUM_MATCH_LINES; i++) { if (icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][1]] && icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][2]] && TestReelIconAttribute(biasIcon, icons[sThirdReelBiasCheckIndices[i][0]])) return TRUE; } return FALSE; } static bool32 TestReelIconAttribute(s32 attr, s32 icon) { switch (attr) { case PAYOUT_NONE: return icon ^ 4 ? TRUE : FALSE; case PAYOUT_CHERRIES2: case PAYOUT_CHERRIES3: return icon == ICON_CHERRIES ? TRUE : FALSE; case PAYOUT_MAGSHELL: return icon == ICON_MAGNEMITE || icon == ICON_SHELLDER ? TRUE : FALSE; case PAYOUT_PIKAPSY: return icon == ICON_PIKACHU || icon == ICON_PSYDUCK ? TRUE : FALSE; case PAYOUT_ROCKET: return icon == ICON_ROCKET ? TRUE : FALSE; case PAYOUT_7: return icon == ICON_7 ? TRUE : FALSE; default: return FALSE; } } static u8 ReelIconToPayoutRank(s32 iconId) { switch (iconId) { default: case ICON_CHERRIES: return PAYOUT_CHERRIES2; case ICON_MAGNEMITE: case ICON_SHELLDER: return PAYOUT_MAGSHELL; case ICON_PIKACHU: case ICON_PSYDUCK: return PAYOUT_PIKAPSY; case ICON_ROCKET: return PAYOUT_ROCKET; case ICON_7: return PAYOUT_7; } } static void CalcSlotBias(void) { u16 rval = Random() / 4; s32 i; const u16 * biasChances = sReelBiasChances[sSlotMachineState->machineIdx]; for (i = 0; i < NUM_PAYOUT_TYPES - 1; i++) { if (rval < biasChances[i]) break; } if (sSlotMachineState->machineBias < PAYOUT_ROCKET) { if (sSlotMachineState->biasCooldown == 0) { if ((Random() & 0x3FFF) < biasChances[PAYOUT_7]) sSlotMachineState->biasCooldown = (Random() & 1) ? 5 : 60; } if (sSlotMachineState->biasCooldown != 0) { if (i == 0 && (Random() & 0x3FFF) < (int)(0.7 * 0x3FFF)) // 70% sSlotMachineState->biasCooldown = (Random() & 1) ? 5 : 60; sSlotMachineState->biasCooldown--; } sSlotMachineState->machineBias = i; } } static void ResetMachineBias(void) { sSlotMachineState->machineBias = 0; } static u16 CalcPayout(void) { u8 visibleIcons[9] = {}; s32 i; s32 reel1pos, reel2pos, reel3pos; s32 bestMatch; for (i = 0; i < NUM_MATCH_LINES; i++) sSlotMachineState->winFlags[i] = FALSE; bestMatch = 0; reel1pos = sSlotMachineState->reelPositions[0]; reel2pos = sSlotMachineState->reelPositions[1]; reel3pos = sSlotMachineState->reelPositions[2]; for (i = 0; i < 3; i++) { reel1pos++; if (reel1pos >= REEL_LENGTH) reel1pos = 0; reel2pos++; if (reel2pos >= REEL_LENGTH) reel2pos = 0; reel3pos++; if (reel3pos >= REEL_LENGTH) reel3pos = 0; visibleIcons[0 * 3 + i] = sReelIconAnimByReelAndPos[0][reel1pos]; visibleIcons[1 * 3 + i] = sReelIconAnimByReelAndPos[1][reel2pos]; visibleIcons[2 * 3 + i] = sReelIconAnimByReelAndPos[2][reel3pos]; } sSlotMachineState->payout = 0; for (i = 0; i < NUM_MATCH_LINES; i++) { if (sSlotMachineState->bet >= sRowAttributes[i][ROWATTR_MINBET]) { int curMatch; if (TestReelIconAttribute(1, visibleIcons[sRowAttributes[i][ROWATTR_COL1POS]])) curMatch = TestReelIconAttribute(2, visibleIcons[sRowAttributes[i][ROWATTR_COL2POS]]) ? 2 : 1; else if (visibleIcons[sRowAttributes[i][ROWATTR_COL1POS]] == visibleIcons[sRowAttributes[i][ROWATTR_COL2POS]] && visibleIcons[sRowAttributes[i][ROWATTR_COL1POS]] == visibleIcons[sRowAttributes[i][ROWATTR_COL3POS]]) curMatch = ReelIconToPayoutRank(visibleIcons[sRowAttributes[i][ROWATTR_COL1POS]]); else curMatch = 0; if (curMatch != 0) { sSlotMachineState->winFlags[i] = TRUE; sSlotMachineState->payout += sPayoutTable[curMatch]; } if (curMatch > bestMatch) bestMatch = curMatch; } } return bestMatch; } static u16 GetPayout(void) { return sSlotMachineState->payout; } static u8 GetPlayerBet(void) { return sSlotMachineState->bet; } static bool32 GetWinFlagByLine(int lineId) { return sSlotMachineState->winFlags[lineId]; } static bool32 LoadSpriteGraphicsAndAllocateManager(void) { s32 i; if(gSaveBlock1Ptr->keyFlags.version == 0) { for (i = 0; i < ARRAY_COUNT(sSpriteSheets_FR); i++) LoadCompressedSpriteSheet(&sSpriteSheets_FR[i]); LoadSpritePalettes(sSpritePalettes_FR); } else { for (i = 0; i < ARRAY_COUNT(sSpriteSheets_LG); i++) LoadCompressedSpriteSheet(&sSpriteSheets_LG[i]); LoadSpritePalettes(sSpritePalettes_LG); } sSlotMachineGfxManager = Alloc(sizeof(*sSlotMachineGfxManager)); if (sSlotMachineGfxManager == NULL) return FALSE; InitGfxManager(sSlotMachineGfxManager); return TRUE; } static void DestroyGfxManager(void) { if (sSlotMachineGfxManager != NULL) { Free(sSlotMachineGfxManager); sSlotMachineGfxManager = NULL; } } static void InitGfxManager(struct SlotMachineGfxManager * manager) { s32 i, j; for (i = 0; i < NUM_REELS; i++) { manager->field_00[i] = 0; for (j = 0; j < REEL_LOAD_LENGTH; j++) manager->reelIconSprites[i][j] = NULL; } } static void CreateReelIconSprites(void) { struct Sprite *sprite; s32 i, j; s32 spriteId; s32 animId; for (i = 0; i < NUM_REELS; i++) { for (j = 0; j < REEL_LOAD_LENGTH; j++) { spriteId = CreateSprite(&sSpriteTemplate_ReelIcons, 80 + 40 * i, 44 + 24 * j, 2); animId = sReelIconAnimByReelAndPos[i][j]; sprite = &gSprites[spriteId]; StartSpriteAnim(sprite, animId); if(gSaveBlock1Ptr->keyFlags.version == 0) { sprite->oam.paletteNum = IndexOfSpritePaletteTag(sReelIconPaletteTags_FR[animId]); } else { sprite->oam.paletteNum = IndexOfSpritePaletteTag(sReelIconPaletteTags_LG[animId]); } sprite->data[0] = i; sprite->data[1] = j; sprite->data[2] = j; sprite->data[3] = 0; sprite->oam.matrixNum = 0; sSlotMachineGfxManager->reelIconSprites[i][j] = sprite; sSlotMachineGfxManager->reelIconAffineParamPtr = (vu16 *)(OAM + 0 * sizeof(struct OamData) + offsetof(struct OamData, affineParam)); } } } static void UpdateReelIconSprites(const s16 * reelPosPtr, const s16 * yposPtr) { s32 i, j; s32 reelPos, ypos; for (i = 0; i < NUM_REELS; i++) { reelPos = *reelPosPtr; ypos = *yposPtr * 8; for (j = 0; j < REEL_LOAD_LENGTH; j++) { sSlotMachineGfxManager->reelIconSprites[i][j]->y2 = ypos; { s32 animId = sReelIconAnimByReelAndPos[i][reelPos]; struct Sprite *sprite = sSlotMachineGfxManager->reelIconSprites[i][j]; StartSpriteAnim(sprite, animId); } { s32 animId = sReelIconAnimByReelAndPos[i][reelPos]; struct Sprite *sprite = sSlotMachineGfxManager->reelIconSprites[i][j]; StartSpriteAnim(sprite, animId); } if(gSaveBlock1Ptr->keyFlags.version == 0) { sSlotMachineGfxManager->reelIconSprites[i][j]->oam.paletteNum = IndexOfSpritePaletteTag(sReelIconPaletteTags_FR[sReelIconAnimByReelAndPos[i][reelPos]]); } else { sSlotMachineGfxManager->reelIconSprites[i][j]->oam.paletteNum = IndexOfSpritePaletteTag(sReelIconPaletteTags_LG[sReelIconAnimByReelAndPos[i][reelPos]]); } reelPos++; if (reelPos >= REEL_LENGTH) reelPos = 0; } reelPosPtr++; yposPtr++; } } static void HBlankCB_SlotMachine(void) { s32 vcount = REG_VCOUNT - 0x2B; if (vcount < 0x54u) { *sSlotMachineGfxManager->reelIconAffineParamPtr = sReelIconAffineParams[vcount]; REG_BLDY = sReelIconBldY[vcount]; } else { *sSlotMachineGfxManager->reelIconAffineParamPtr = 0x100; REG_BLDY = 0; } } static void CreateScoreDigitSprites(void) { s32 i; s32 spriteId; for (i = 0; i < NUM_DIGIT_SPRITES; i++) { spriteId = CreateSprite(&sSpriteTemplate_Digits, 85 + 7 * i, 30, 0); sSlotMachineGfxManager->creditDigitSprites[i] = &gSprites[spriteId]; spriteId = CreateSprite(&sSpriteTemplate_Digits, 133 + 7 * i, 30, 0); sSlotMachineGfxManager->payoutDigitSprites[i] = &gSprites[spriteId]; } } static void UpdateCoinsDisplay(void) { s32 coins = GetCoins(); s32 payout = GetPayout(); s32 i; s32 divisor = 1000; s32 quotient; for (i = 0; i < NUM_DIGIT_SPRITES; i++) { quotient = coins / divisor; StartSpriteAnim(sSlotMachineGfxManager->creditDigitSprites[i], quotient); coins -= quotient * divisor; quotient = payout / divisor; StartSpriteAnim(sSlotMachineGfxManager->payoutDigitSprites[i], quotient); payout -= quotient * divisor; divisor /= 10; } } static void CreateClefairySprites(void) { s32 spriteId = CreateSprite(&sSpriteTemplate_Clefairy, 16, 136, 1); sSlotMachineGfxManager->clefairySprites[0] = &gSprites[spriteId]; spriteId = CreateSprite(&sSpriteTemplate_Clefairy, DISPLAY_WIDTH - 16, 136, 1); sSlotMachineGfxManager->clefairySprites[1] = &gSprites[spriteId]; sSlotMachineGfxManager->clefairySprites[1]->hFlip = TRUE; } static void SetClefairySpriteAnim(u8 animId) { s32 i; for (i = 0; i < (int)ARRAY_COUNT(sSlotMachineGfxManager->clefairySprites); i++) StartSpriteAnim(sSlotMachineGfxManager->clefairySprites[i], animId); } static bool32 CreateSlotMachine(void) { s32 i; struct SlotMachineSetupTaskData * ptr = Alloc(sizeof(struct SlotMachineSetupTaskData)); if (ptr == NULL) return FALSE; for (i = 0; i < (int)ARRAY_COUNT(ptr->tasks); i++) ptr->tasks[i].active = 0; ptr->yesNoMenuActive = FALSE; SetWordTaskArg(CreateTask(Task_SlotMachine, 2), 0, (uintptr_t)ptr); return FALSE; } static void DestroySlotMachine(void) { if (FuncIsActiveTask(Task_SlotMachine)) { Free(GetSlotMachineSetupTaskDataPtr()); DestroyTask(FindTaskIdByFunc(Task_SlotMachine)); } DestroyGfxManager(); FreeAllWindowBuffers(); } static void Task_SlotMachine(u8 taskId) { struct SlotMachineSetupTaskData * ptr = (void *)GetWordTaskArg(taskId, 0); s32 i; for (i = 0; i < (int)ARRAY_COUNT(ptr->tasks); i++) { if (ptr->tasks[i].active) ptr->tasks[i].active = sSlotMachineSetupTasks[ptr->tasks[i].funcno](&ptr->tasks[i].state, ptr); } } static void VBlankCB_SlotMachine(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); } static struct SlotMachineSetupTaskData * GetSlotMachineSetupTaskDataPtr(void) { return (void *)GetWordTaskArg(FindTaskIdByFunc(Task_SlotMachine), 0); } static void SetSlotMachineSetupTask(u16 funcno, u8 taskId) { struct SlotMachineSetupTaskData * ptr = GetSlotMachineSetupTaskDataPtr(); ptr->tasks[taskId].funcno = funcno; ptr->tasks[taskId].state = 0; ptr->tasks[taskId].active = sSlotMachineSetupTasks[funcno](&ptr->tasks[taskId].state, ptr); } static bool32 IsSlotMachineSetupTaskActive(u8 taskId) { return GetSlotMachineSetupTaskDataPtr()->tasks[taskId].active; } static inline void SetBackdropColor(u16 color, u16 *pal) { *pal = color; SetBackdropFromPalette(pal); } static bool8 SlotsTask_GraphicsInit(u8 * state, struct SlotMachineSetupTaskData * ptr) { u16 pal[2]; u8 textColor[3]; u32 x; switch (*state) { case 0: BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); (*state)++; break; case 1: SetVBlankCallback(NULL); ResetSpriteData(); FreeAllSpritePalettes(); RequestDma3Fill(0, (void *)OAM, OAM_SIZE, DMA3_32BIT); RequestDma3Fill(0, (void *)VRAM, 0x20, DMA3_32BIT); RequestDma3Fill(0, (void *)(VRAM + 0xC000), 0x20, DMA3_32BIT); SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgPositions(); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); InitWindows(sWindowTemplates); SetBgTilemapBuffer(3, ptr->bg3TilemapBuffer); FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(3); ResetTempTileDataBuffers(); if(gSaveBlock1Ptr->keyFlags.version == 0) { DecompressAndCopyTileDataToVram(2, sBg_Tiles_FR, 0, 0x00, 0); DecompressAndCopyTileDataToVram(2, sButtonPressed_Tiles_FR, 0, 0xC0, 0); } else { DecompressAndCopyTileDataToVram(2, sBg_Tiles_LG, 0, 0x00, 0); DecompressAndCopyTileDataToVram(2, sButtonPressed_Tiles_LG, 0, 0xC0, 0); } SetBgTilemapBuffer(2, ptr->bg2TilemapBuffer); if(gSaveBlock1Ptr->keyFlags.version == 0) CopyToBgTilemapBuffer(2, sBg_Tilemap_FR, 0, 0x00); else CopyToBgTilemapBuffer(2, sBg_Tilemap_LG, 0, 0x00); CopyBgTilemapBufferToVram(2); if(gSaveBlock1Ptr->keyFlags.version == 0) { LoadPalette(sBg_Pal_FR, BG_PLTT_ID(0), sizeof(sBg_Pal_FR)); LoadPalette(sBgPal_MatchLines_FR, BG_PLTT_ID(PALSLOT_LINE_BET), sizeof(sBgPal_MatchLines_FR)); LoadPalette(sCombosWindow_Pal_FR, BG_PLTT_ID(7), sizeof(sCombosWindow_Pal_FR)); } else { LoadPalette(sBg_Pal_LG, BG_PLTT_ID(0), sizeof(sBg_Pal_LG)); LoadPalette(sBgPal_MatchLines_LG, BG_PLTT_ID(PALSLOT_LINE_BET), sizeof(sBgPal_MatchLines_LG)); LoadPalette(sCombosWindow_Pal_LG, BG_PLTT_ID(7), sizeof(sCombosWindow_Pal_LG)); } SetBackdropColor(RGB(30, 30, 31), pal); LoadUserWindowGfx2(0, 0x00A, BG_PLTT_ID(13)); LoadStdWindowGfxOnBg(0, 0x001, BG_PLTT_ID(15)); SetBgTilemapBuffer(0, ptr->bg0TilemapBuffer); FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 32, 30); if(gSaveBlock1Ptr->keyFlags.version == 0) { DecompressAndCopyTileDataToVram(1, sCombosWindow_Tiles_FR, 0, 0, 0); DecompressAndCopyTileDataToVram(1, sCombosWindow_Tilemap_FR, 0, 0, 1); } else { DecompressAndCopyTileDataToVram(1, sCombosWindow_Tiles_LG, 0, 0, 0); DecompressAndCopyTileDataToVram(1, sCombosWindow_Tilemap_LG, 0, 0, 1); } CopyBgTilemapBufferToVram(1); LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(14), PLTT_SIZE_4BPP); FillWindowPixelBuffer(1, 0xFF); PutWindowTilemap(1); x = DISPLAY_WIDTH - 4 - GetStringWidth(FONT_SMALL, gString_SlotMachineControls, 0); textColor[0] = TEXT_DYNAMIC_COLOR_6; textColor[1] = TEXT_COLOR_WHITE; textColor[2] = TEXT_COLOR_DARK_GRAY; AddTextPrinterParameterized3(1, FONT_SMALL, x, 0, textColor, 0, gString_SlotMachineControls); CopyBgTilemapBufferToVram(0); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | 0x20 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN); LoadSpriteGraphicsAndAllocateManager(); CreateReelIconSprites(); CreateScoreDigitSprites(); CreateClefairySprites(); UpdateCoinsDisplay(); BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK); SetVBlankCallback(VBlankCB_SlotMachine); SetHBlankCallback(HBlankCB_SlotMachine); (*state)++; break; case 2: if (!FreeTempTileDataBuffersIfPossible()) { ShowBg(0); ShowBg(3); ShowBg(2); HideBg(1); InitReelButtonTileMem(); BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK); (*state)++; } break; case 3: UpdatePaletteFade(); if (!gPaletteFade.active) return FALSE; break; } return TRUE; } static bool8 SlotsTask_FadeOut(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, 0); (*state)++; break; case 1: if (!gPaletteFade.active) return FALSE; break; } return TRUE; } static bool8 SlotsTask_UpdateLineStates(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: SetLineStatesByBet(GetBgTilemapBuffer(2)); CopyBgTilemapBufferToVram(2); (*state)++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) return FALSE; break; } return TRUE; } static bool8 SlotsTask_ClefairyUpdateOnReelsStart(u8 * state, struct SlotMachineSetupTaskData * ptr) { SetClefairySpriteAnim(1); return FALSE; } static bool8 SlotsTask_StartClefairyDanceAndWinningLineFlash(u8 * state, struct SlotMachineSetupTaskData * ptr) { SetClefairySpriteAnim(2); CreateTask(Task_FlashWinningLine, 3); return FALSE; } static bool8 SlotsTask_StopWinningLineFlashTask(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: SignalStopWinningLineFlashTask(); (*state)++; break; case 1: if (!FuncIsActiveTask(Task_FlashWinningLine)) { SetClefairySpriteAnim(0); return FALSE; } break; } return TRUE; } static bool8 SlotsTask_ClefairyFainted(u8 * state, struct SlotMachineSetupTaskData * ptr) { SetClefairySpriteAnim(3); return FALSE; } static bool8 SlotsTask_ClefairyNeutral(u8 * state, struct SlotMachineSetupTaskData * ptr) { SetClefairySpriteAnim(0); return FALSE; } static bool8 SlotsTask_UpdateCoinsDisplay(u8 * state, struct SlotMachineSetupTaskData * ptr) { UpdateCoinsDisplay(); return FALSE; } static bool8 SlotsTask_MessageOutOfCoins(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: Slot_PrintOnWindow0(gString_OutOfCoins); CopyWindowToVram(0, COPYWIN_FULL); (*state)++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) return FALSE; break; } return TRUE; } static bool8 SlotsTask_AskQuitPlaying(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: Slot_PrintOnWindow0(gString_QuitPlaying); Slot_CreateYesNoMenu(0); CopyWindowToVram(0, COPYWIN_FULL); (*state)++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) return FALSE; break; } return TRUE; } static bool8 SlotsTask_DestroyYesNoMenu(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: Slot_ClearWindow0(); Slot_DestroyYesNoMenu(); CopyWindowToVram(0, COPYWIN_FULL); (*state)++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) return FALSE; break; } return TRUE; } static bool8 SlotsTask_PressReelButton(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: SetReelButtonPressed(ptr->reelButtonToPress); CopyBgTilemapBufferToVram(2); (*state)++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) return FALSE; break; } return TRUE; } static bool8 SlotsTask_ReleaseReelButtons(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: ReleaseReelButtons(); CopyBgTilemapBufferToVram(2); (*state)++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) return FALSE; break; } return TRUE; } static bool8 SlotsTask_ShowHelp(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0)); SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0, 160)); ShowBg(1); PlaySE(SE_WIN_OPEN); ptr->bg1X = 0; (*state)++; break; case 1: ptr->bg1X += 16; if (ptr->bg1X >= 256) { ptr->bg1X = 256; (*state)++; } ChangeBgX(1, 256 * (256 - ptr->bg1X), 0); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, ptr->bg1X)); break; case 2: return FALSE; } return TRUE; } static bool8 SlotsTask_HideHelp(u8 * state, struct SlotMachineSetupTaskData * ptr) { switch (*state) { case 0: PlaySE(SE_WIN_OPEN); (*state)++; // fallthrough case 1: ptr->bg1X -= 16; if (ptr->bg1X <= 0) { ptr->bg1X = 0; (*state)++; } ChangeBgX(1, 256 * (256 - ptr->bg1X), 0); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, ptr->bg1X)); break; case 2: HideBg(1); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); (*state)++; break; case 3: return FALSE; } return TRUE; } static void Slot_PrintOnWindow0(const u8 * str) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); PutWindowTilemap(0); DrawTextBorderOuter(0, 0x001, 15); AddTextPrinterParameterized5(0, FONT_NORMAL, str, 1, 2, TEXT_SKIP_DRAW, NULL, 1, 2); } static void Slot_ClearWindow0(void) { rbox_fill_rectangle(0); } static void SetLineStatesByBet(u16 * bgTilemapBuffer) { switch (GetPlayerBet()) { case 0: SetLineState(bgTilemapBuffer, 0, PALSLOT_LINE_NORMAL); SetLineState(bgTilemapBuffer, 1, PALSLOT_LINE_NORMAL); SetLineState(bgTilemapBuffer, 2, PALSLOT_LINE_NORMAL); SetLineState(bgTilemapBuffer, 3, PALSLOT_LINE_NORMAL); SetLineState(bgTilemapBuffer, 4, PALSLOT_LINE_NORMAL); break; case 3: SetLineState(bgTilemapBuffer, 0, PALSLOT_LINE_BET); SetLineState(bgTilemapBuffer, 4, PALSLOT_LINE_BET); case 2: SetLineState(bgTilemapBuffer, 1, PALSLOT_LINE_BET); SetLineState(bgTilemapBuffer, 3, PALSLOT_LINE_BET); case 1: SetLineState(bgTilemapBuffer, 2, PALSLOT_LINE_BET); break; } } static void SetLineState(u16 * bgTilemapBuffer, u16 whichLine, u16 paletteNum) { s32 i; const u16 * tileIdxs = sLineStateTileIdxs[whichLine].tiles; u16 palMask = (paletteNum & 0xF) << 12; for (i = 0; i < sLineStateTileIdxs[whichLine].count; i++) { bgTilemapBuffer[*tileIdxs] &= 0x0FFF; bgTilemapBuffer[*tileIdxs] |= palMask; tileIdxs++; } } static void Task_FlashWinningLine(u8 taskId) { s16 * data = gTasks[taskId].data; s32 i; switch (data[0]) { case 0: if(gSaveBlock1Ptr->keyFlags.version == 0) LoadPalette(sBgPal_MatchLines_FR, BG_PLTT_ID(PALSLOT_LINE_MATCH), sizeof(sBgPal_MatchLines_FR)); else LoadPalette(sBgPal_MatchLines_LG, BG_PLTT_ID(PALSLOT_LINE_MATCH), sizeof(sBgPal_MatchLines_LG)); for (i = 0; i < NUM_MATCH_LINES; i++) { if (GetWinFlagByLine(i)) SetLineState(GetBgTilemapBuffer(2), i, PALSLOT_LINE_MATCH); } CopyBgTilemapBufferToVram(2); data[0]++; break; case 1: if (data[1] == 0) { u16 y = gSineTable[data[2]] >> 7; if(gSaveBlock1Ptr->keyFlags.version == 0) LoadPalette(&sBgPal_PayoutLight_FR[y], BG_PLTT_ID(1), sizeof(sBgPal_PayoutLight_FR[0])); else LoadPalette(&sBgPal_PayoutLight_LG[y], BG_PLTT_ID(1), sizeof(sBgPal_PayoutLight_LG[0])); data[2] += 32; data[2] &= 0x7F; data[1] = 8; } else data[1]--; if (data[3] == 0) { data[4] += 8; data[4] &= 0x7F; data[5] = gSineTable[data[4]] >> 5; BlendPalettes(1 << PALSLOT_LINE_MATCH, data[5], RGB_BLACK); } else { data[4]++; if (data[4] > 1) { data[4] = 0; data[5]++; data[5] &= 1; BlendPalettes(1 << PALSLOT_LINE_MATCH, data[5] * 8, RGB_BLACK); } } for (i = 0; i < ARRAY_COUNT(sWinningLineFlashPalIdxs); i++) gPlttBufferFaded[sWinningLineFlashPalIdxs[i] + BG_PLTT_ID(PALSLOT_LINE_MATCH)] = gPlttBufferUnfaded[sWinningLineFlashPalIdxs[i] + BG_PLTT_ID(PALSLOT_LINE_MATCH)]; break; case 2: // Restore match lines to normal color for (i = 0; i < NUM_MATCH_LINES; i++) { if (GetWinFlagByLine(i)) SetLineState(GetBgTilemapBuffer(2), i, PALSLOT_LINE_NORMAL); } // Restore payout lights to normal color if(gSaveBlock1Ptr->keyFlags.version == 0) LoadPalette(&sBg_Pal_FR[1], BG_PLTT_ID(1), sizeof(sBg_Pal_FR[1])); else LoadPalette(&sBg_Pal_LG[1], BG_PLTT_ID(1), sizeof(sBg_Pal_LG[1])); CopyBgTilemapBufferToVram(2); data[0]++; break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) DestroyTask(taskId); break; } } static void SignalStopWinningLineFlashTask(void) { gTasks[FindTaskIdByFunc(Task_FlashWinningLine)].data[0] = 2; } static void Slot_CreateYesNoMenu(u8 cursorPos) { CreateYesNoMenu(&sYesNoWindowTemplate, FONT_NORMAL, 0, 2, 10, 13, cursorPos); Menu_MoveCursorNoWrapAround(cursorPos); GetSlotMachineSetupTaskDataPtr()->yesNoMenuActive = TRUE; } static void Slot_DestroyYesNoMenu(void) { struct SlotMachineSetupTaskData * data = GetSlotMachineSetupTaskDataPtr(); if (data->yesNoMenuActive) { DestroyYesNoMenu(); data->yesNoMenuActive = FALSE; } } static void InitReelButtonTileMem(void) { s32 i, j; struct SlotMachineSetupTaskData * data = GetSlotMachineSetupTaskDataPtr(); u16 * buffer = GetBgTilemapBuffer(2); for (i = 0; i < NUM_REELS; i++) { for (j = 0; j < NUM_BUTTON_TILES; j++) { u16 idx = sReelButtonMapTileIdxs[i][j]; data->buttonReleasedTiles[i][j] = buffer[idx]; data->buttonPressedTiles[i][j] = j + 0xC0; } } } static void SetReelButtonPressed(u8 reel) { if (reel < NUM_REELS) { s32 i; struct SlotMachineSetupTaskData * data = GetSlotMachineSetupTaskDataPtr(); u16 * buffer = GetBgTilemapBuffer(2); for (i = 0; i < NUM_BUTTON_TILES; i++) { u16 idx = sReelButtonMapTileIdxs[reel][i]; buffer[idx] = data->buttonPressedTiles[reel][i]; } } } static void ReleaseReelButtons(void) { s32 i, j; struct SlotMachineSetupTaskData * data = GetSlotMachineSetupTaskDataPtr(); u16 * buffer = GetBgTilemapBuffer(2); for (i = 0; i < NUM_REELS; i++) { for (j = 0; j < NUM_BUTTON_TILES; j++) { u16 idx = sReelButtonMapTileIdxs[i][j]; buffer[idx] = data->buttonReleasedTiles[i][j]; } } } static void PressReelButton(u8 reel, u8 taskId) { GetSlotMachineSetupTaskDataPtr()->reelButtonToPress = reel; SetSlotMachineSetupTask(SLOTTASK_PRESS_BUTTON, taskId); } ================================================ FILE: src/sound.c ================================================ #include "global.h" #include "gba/m4a_internal.h" #include "gflib.h" #include "battle.h" #include "quest_log.h" #include "m4a.h" #include "constants/songs.h" #include "constants/sound.h" #include "task.h" struct Fanfare { u16 songNum; u16 duration; }; // TODO: what are these extern u8 gDisableMapMusicChangeOnMapLoad; extern u8 gDisableHelpSystemVolumeReduce; // ewram EWRAM_DATA struct MusicPlayerInfo* gMPlay_PokemonCry = NULL; EWRAM_DATA u8 gPokemonCryBGMDuckingCounter = 0; // iwram bss static u16 sCurrentMapMusic; static u16 sNextMapMusic; static u8 sMapMusicState; static u8 sMapMusicFadeInSpeed; static u16 sFanfareCounter; // iwram common bool8 gDisableMusic; extern u32 gBattleTypeFlags; extern struct MusicPlayerInfo gMPlayInfo_BGM; extern struct MusicPlayerInfo gMPlayInfo_SE1; extern struct MusicPlayerInfo gMPlayInfo_SE2; extern struct MusicPlayerInfo gMPlayInfo_SE3; extern struct ToneData gCryTable[]; extern struct ToneData gCryTable_Reverse[]; extern u16 SpeciesToCryId(u16); static void Task_Fanfare(u8 taskId); static void CreateFanfareTask(void); static void Task_DuckBGMForPokemonCry(u8 taskId); static void RestoreBGMVolumeAfterPokemonCry(void); static const struct Fanfare sFanfares[] = { [FANFARE_LEVEL_UP] = { MUS_LEVEL_UP, 80 }, [FANFARE_OBTAIN_ITEM] = { MUS_OBTAIN_ITEM, 160 }, [FANFARE_EVOLVED] = { MUS_EVOLVED, 220 }, [FANFARE_OBTAIN_TMHM] = { MUS_OBTAIN_TMHM, 220 }, [FANFARE_HEAL] = { MUS_RS_HEAL, 160 }, [FANFARE_OBTAIN_BADGE] = { MUS_OBTAIN_BADGE, 340 }, [FANFARE_MOVE_DELETED] = { MUS_MOVE_DELETED, 180 }, [FANFARE_OBTAIN_BERRY] = { MUS_OBTAIN_BERRY, 120 }, [FANFARE_SLOTS_JACKPOT] = { MUS_SLOTS_JACKPOT, 250 }, [FANFARE_SLOTS_WIN] = { MUS_SLOTS_WIN, 150 }, [FANFARE_TOO_BAD] = { MUS_TOO_BAD, 160 }, [FANFARE_POKE_FLUTE] = { MUS_POKE_FLUTE, 450 }, [FANFARE_KEY_ITEM] = { MUS_OBTAIN_KEY_ITEM, 170 }, [FANFARE_DEX_EVAL] = { MUS_DEX_RATING, 196 } }; void InitMapMusic(void) { gDisableMusic = FALSE; ResetMapMusic(); } void MapMusicMain(void) { switch (sMapMusicState) { case 0: break; case 1: sMapMusicState = 2; PlayBGM(sCurrentMapMusic); break; case 2: case 3: case 4: break; case 5: if (IsBGMStopped()) { sNextMapMusic = 0; sMapMusicState = 0; } break; case 6: if (IsBGMStopped() && IsFanfareTaskInactive()) { sCurrentMapMusic = sNextMapMusic; sNextMapMusic = 0; sMapMusicState = 2; PlayBGM(sCurrentMapMusic); } break; case 7: if (IsBGMStopped() && IsFanfareTaskInactive()) { FadeInNewBGM(sNextMapMusic, sMapMusicFadeInSpeed); sCurrentMapMusic = sNextMapMusic; sNextMapMusic = 0; sMapMusicState = 2; sMapMusicFadeInSpeed = 0; } break; } } void ResetMapMusic(void) { sCurrentMapMusic = 0; sNextMapMusic = 0; sMapMusicState = 0; sMapMusicFadeInSpeed = 0; } u16 GetCurrentMapMusic(void) { return sCurrentMapMusic; } void PlayNewMapMusic(u16 songNum) { sCurrentMapMusic = songNum; sNextMapMusic = 0; sMapMusicState = 1; } void StopMapMusic(void) { sCurrentMapMusic = 0; sNextMapMusic = 0; sMapMusicState = 1; } void FadeOutMapMusic(u8 speed) { if (IsNotWaitingForBGMStop()) FadeOutBGM(speed); sCurrentMapMusic = 0; sNextMapMusic = 0; sMapMusicState = 5; } void FadeOutAndPlayNewMapMusic(u16 songNum, u8 speed) { FadeOutMapMusic(speed); sCurrentMapMusic = 0; sNextMapMusic = songNum; sMapMusicState = 6; } void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed) { FadeOutMapMusic(fadeOutSpeed); sCurrentMapMusic = 0; sNextMapMusic = songNum; sMapMusicState = 7; sMapMusicFadeInSpeed = fadeInSpeed; } // Unused static void FadeInNewMapMusic(u16 songNum, u8 speed) { FadeInNewBGM(songNum, speed); sCurrentMapMusic = songNum; sNextMapMusic = 0; sMapMusicState = 2; sMapMusicFadeInSpeed = 0; } bool8 IsNotWaitingForBGMStop(void) { if (sMapMusicState == 6) return FALSE; if (sMapMusicState == 5) return FALSE; if (sMapMusicState == 7) return FALSE; return TRUE; } void PlayFanfareByFanfareNum(u8 fanfareNum) { u16 songNum; if(gQuestLogState == QL_STATE_PLAYBACK) { sFanfareCounter = 0xFF; } else { m4aMPlayStop(&gMPlayInfo_BGM); songNum = sFanfares[fanfareNum].songNum; sFanfareCounter = sFanfares[fanfareNum].duration; m4aSongNumStart(songNum); } } bool8 WaitFanfare(bool8 stop) { if (sFanfareCounter) { sFanfareCounter--; return FALSE; } else { if (!stop) m4aMPlayContinue(&gMPlayInfo_BGM); else m4aSongNumStart(MUS_DUMMY); return TRUE; } } // Unused void StopFanfareByFanfareNum(u8 fanfareNum) { m4aSongNumStop(sFanfares[fanfareNum].songNum); } void PlayFanfare(u16 songNum) { s32 i; for (i = 0; (u32)i < ARRAY_COUNT(sFanfares); i++) { if (sFanfares[i].songNum == songNum) { PlayFanfareByFanfareNum(i); CreateFanfareTask(); return; } } // songNum is not in sFanfares // Play first fanfare in table instead PlayFanfareByFanfareNum(0); CreateFanfareTask(); } bool8 IsFanfareTaskInactive(void) { if (FuncIsActiveTask(Task_Fanfare) == TRUE) return FALSE; return TRUE; } static void Task_Fanfare(u8 taskId) { if (sFanfareCounter) { sFanfareCounter--; } else { m4aMPlayContinue(&gMPlayInfo_BGM); DestroyTask(taskId); } } static void CreateFanfareTask(void) { if (FuncIsActiveTask(Task_Fanfare) != TRUE) CreateTask(Task_Fanfare, 80); } void FadeInNewBGM(u16 songNum, u8 speed) { if (gDisableMusic) songNum = 0; if (songNum == MUS_NONE) songNum = 0; m4aSongNumStart(songNum); m4aMPlayImmInit(&gMPlayInfo_BGM); m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0); m4aSongNumStop(songNum); m4aMPlayFadeIn(&gMPlayInfo_BGM, speed); } void FadeOutBGMTemporarily(u8 speed) { m4aMPlayFadeOutTemporarily(&gMPlayInfo_BGM, speed); } bool8 IsBGMPausedOrStopped(void) { if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE) return TRUE; if (!(gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_TRACK)) return TRUE; return FALSE; } void FadeInBGM(u8 speed) { m4aMPlayFadeIn(&gMPlayInfo_BGM, speed); } void FadeOutBGM(u8 speed) { m4aMPlayFadeOut(&gMPlayInfo_BGM, speed); } bool8 IsBGMStopped(void) { if (!(gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_TRACK)) return TRUE; return FALSE; } void PlayCry_Normal(u16 species, s8 pan) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 85); PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, CRY_MODE_NORMAL); gPokemonCryBGMDuckingCounter = 2; RestoreBGMVolumeAfterPokemonCry(); } void PlayCry_NormalNoDucking(u16 species, s8 pan, s8 volume, u8 priority) { PlayCryInternal(species, pan, volume, priority, CRY_MODE_NORMAL); } // Assuming it's not CRY_MODE_DOUBLES, this is equivalent to PlayCry_Normal except it allows other modes. void PlayCry_ByMode(u16 species, s8 pan, u8 mode) { if (mode == CRY_MODE_DOUBLES) { PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode); } else { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 85); PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode); gPokemonCryBGMDuckingCounter = 2; RestoreBGMVolumeAfterPokemonCry(); } } // Used when releasing multiple Pokémon at once in battle. void PlayCry_ReleaseDouble(u16 species, s8 pan, u8 mode) { if (mode == CRY_MODE_DOUBLES) { PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode); } else { if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 85); PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode); } } void PlayCry_Script(u16 species, u8 mode) { if (!QL_IS_PLAYBACK_STATE) // This check is exclusive to FR/LG { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 85); PlayCryInternal(species, 0, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode); } gPokemonCryBGMDuckingCounter = 2; RestoreBGMVolumeAfterPokemonCry(); } void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) { bool32 reverse; u32 release; u32 length; u32 pitch; u32 chorus; u32 index; u8 table; species--; // Set default values // May be overridden depending on mode. length = 140; reverse = FALSE; release = 0; pitch = 15360; chorus = 0; switch (mode) { case CRY_MODE_NORMAL: break; case CRY_MODE_DOUBLES: length = 20; release = 225; break; case CRY_MODE_ENCOUNTER: release = 225; pitch = 15600; chorus = 20; volume = 90; break; case CRY_MODE_HIGH_PITCH: length = 50; release = 200; pitch = 15800; chorus = 20; volume = 90; break; case CRY_MODE_ECHO_START: length = 25; reverse = TRUE; release = 100; pitch = 15600; chorus = 192; volume = 90; break; case CRY_MODE_FAINT: release = 200; pitch = 14440; break; case CRY_MODE_ECHO_END: release = 220; pitch = 15555; chorus = 192; volume = 90; // FR/LG changed this from 70 to 90 break; case CRY_MODE_ROAR_1: length = 10; release = 100; pitch = 14848; break; case CRY_MODE_ROAR_2: length = 60; release = 225; pitch = 15616; break; case CRY_MODE_GROWL_1: length = 15; reverse = TRUE; release = 125; pitch = 15200; break; case CRY_MODE_GROWL_2: length = 100; release = 225; pitch = 15200; break; case CRY_MODE_WEAK_DOUBLES: length = 20; release = 225; // fallthrough case CRY_MODE_WEAK: pitch = 15000; break; } SetPokemonCryVolume(volume); SetPokemonCryPanpot(pan); SetPokemonCryPitch(pitch); SetPokemonCryLength(length); SetPokemonCryProgress(0); SetPokemonCryRelease(release); SetPokemonCryChorus(chorus); SetPokemonCryPriority(priority); // This is a fancy way to get a cry of a pokemon. // It creates 4 sets of 128 mini cry tables. // If you wish to expand pokemon, you need to // append new cases to the switch. species = SpeciesToCryId(species); index = species % 128; table = species / 128; #define GET_CRY(speciesIndex, tableId, reversed) \ ((reversed) ? &gCryTable_Reverse[(128 * (tableId)) + (speciesIndex)] : &gCryTable[(128 * (tableId)) + (speciesIndex)]) switch (table) { case 0: gMPlay_PokemonCry = SetPokemonCryTone(GET_CRY(index, 0, reverse)); break; case 1: gMPlay_PokemonCry = SetPokemonCryTone(GET_CRY(index, 1, reverse)); break; case 2: gMPlay_PokemonCry = SetPokemonCryTone(GET_CRY(index, 2, reverse)); break; case 3: gMPlay_PokemonCry = SetPokemonCryTone(GET_CRY(index, 3, reverse)); break; } #undef GET_CRY } bool8 IsCryFinished(void) { if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) == TRUE) { return FALSE; } else { ClearPokemonCrySongs(); return TRUE; } } void StopCryAndClearCrySongs(void) { m4aMPlayStop(gMPlay_PokemonCry); ClearPokemonCrySongs(); } void StopCry(void) { m4aMPlayStop(gMPlay_PokemonCry); } bool8 IsCryPlayingOrClearCrySongs(void) { if (IsPokemonCryPlaying(gMPlay_PokemonCry)) { return TRUE; } else { ClearPokemonCrySongs(); return FALSE; } } bool8 IsCryPlaying(void) { if (IsPokemonCryPlaying(gMPlay_PokemonCry)) return TRUE; else return FALSE; } static void Task_DuckBGMForPokemonCry(u8 taskId) { if (gPokemonCryBGMDuckingCounter) { gPokemonCryBGMDuckingCounter--; return; } if (!IsPokemonCryPlaying(gMPlay_PokemonCry)) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); DestroyTask(taskId); } } static void RestoreBGMVolumeAfterPokemonCry(void) { if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) != TRUE) CreateTask(Task_DuckBGMForPokemonCry, 80); } void PlayBGM(u16 songNum) { if (gDisableMusic) songNum = 0; if (songNum == MUS_NONE) songNum = 0; m4aSongNumStart(songNum); } void PlaySE(u16 songNum) { if (gDisableMapMusicChangeOnMapLoad == 0 && gQuestLogState != QL_STATE_PLAYBACK) m4aSongNumStart(songNum); } void PlaySE12WithPanning(u16 songNum, s8 pan) { m4aSongNumStart(songNum); m4aMPlayImmInit(&gMPlayInfo_SE1); m4aMPlayImmInit(&gMPlayInfo_SE2); m4aMPlayPanpotControl(&gMPlayInfo_SE1, TRACKS_ALL, pan); m4aMPlayPanpotControl(&gMPlayInfo_SE2, TRACKS_ALL, pan); } void PlaySE1WithPanning(u16 songNum, s8 pan) { m4aSongNumStart(songNum); m4aMPlayImmInit(&gMPlayInfo_SE1); m4aMPlayPanpotControl(&gMPlayInfo_SE1, TRACKS_ALL, pan); } void PlaySE2WithPanning(u16 songNum, s8 pan) { m4aSongNumStart(songNum); m4aMPlayImmInit(&gMPlayInfo_SE2); m4aMPlayPanpotControl(&gMPlayInfo_SE2, TRACKS_ALL, pan); } void SE12PanpotControl(s8 pan) { m4aMPlayPanpotControl(&gMPlayInfo_SE1, TRACKS_ALL, pan); m4aMPlayPanpotControl(&gMPlayInfo_SE2, TRACKS_ALL, pan); } bool8 IsSEPlaying(void) { if ((gMPlayInfo_SE1.status & MUSICPLAYER_STATUS_PAUSE) && (gMPlayInfo_SE2.status & MUSICPLAYER_STATUS_PAUSE)) return FALSE; if (!(gMPlayInfo_SE1.status & MUSICPLAYER_STATUS_TRACK) && !(gMPlayInfo_SE2.status & MUSICPLAYER_STATUS_TRACK)) return FALSE; return TRUE; } bool8 IsBGMPlaying(void) { if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE) return FALSE; if (!(gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_TRACK)) return FALSE; return TRUE; } bool8 IsSpecialSEPlaying(void) { if (gMPlayInfo_SE3.status & MUSICPLAYER_STATUS_PAUSE) return FALSE; if (!(gMPlayInfo_SE3.status & MUSICPLAYER_STATUS_TRACK)) return FALSE; return TRUE; } void SetBGMVolume_SuppressHelpSystemReduction(u16 volume) { gDisableHelpSystemVolumeReduce = TRUE; m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, volume); } void BGMVolumeMax_EnableHelpSystemReduction(void) { gDisableHelpSystemVolumeReduce = FALSE; m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); } ================================================ FILE: src/special_field_anim.c ================================================ #include "global.h" #include "event_data.h" #include "task.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "field_camera.h" #include "constants/metatile_labels.h" static EWRAM_DATA u8 sEscalatorTaskId = 0; static void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks); static void Task_DrawEscalator(u8 taskId); static void Task_DrawTeleporterHousing(u8 taskId); static void Task_DrawTeleporterCable(u8 taskId); #define ESCALATOR_STAGES 3 #define LAST_ESCALATOR_STAGE (ESCALATOR_STAGES - 1) static const u16 sEscalatorMetatiles_BottomNextRail[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator_BottomNextRail_Transition2, METATILE_PokemonCenter_Escalator_BottomNextRail_Transition1, METATILE_PokemonCenter_Escalator_BottomNextRail_Normal }; static const u16 sEscalatorMetatiles_BottomRail[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator_BottomRail_Transition2, METATILE_PokemonCenter_Escalator_BottomRail_Transition1, METATILE_PokemonCenter_Escalator_BottomRail_Normal }; static const u16 sEscalatorMetatiles_BottomNext[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator_BottomNext_Transition2, METATILE_PokemonCenter_Escalator_BottomNext_Transition1, METATILE_PokemonCenter_Escalator_BottomNext_Normal }; static const u16 sEscalatorMetatiles_Bottom[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator_Bottom_Transition2, METATILE_PokemonCenter_Escalator_Bottom_Transition1, METATILE_PokemonCenter_Escalator_Bottom_Normal }; static const u16 sEscalatorMetatiles_TopNext[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator_TopNext_Normal, METATILE_PokemonCenter_Escalator_TopNext_Transition1, METATILE_PokemonCenter_Escalator_TopNext_Transition2 }; static const u16 sEscalatorMetatiles_Top[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator_Top_Normal, METATILE_PokemonCenter_Escalator_Top_Transition1, METATILE_PokemonCenter_Escalator_Top_Transition2 }; static const u16 sEscalatorMetatiles_TopNextRail[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator_TopNextRail_Normal, METATILE_PokemonCenter_Escalator_TopNextRail_Transition1, METATILE_PokemonCenter_Escalator_TopNextRail_Transition2 }; #define tState data[0] #define tTransitionStage data[1] #define tGoingUp data[2] #define tDrawingEscalator data[3] #define tPlayerX data[4] #define tPlayerY data[5] static void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks) { s16 x, y, transitionStage; s16 i, j; x = gTasks[taskId].tPlayerX - 1; y = gTasks[taskId].tPlayerY - 1; transitionStage = gTasks[taskId].tTransitionStage; // Check all the escalator sections and only progress the selected one to the next stage if (!gTasks[taskId].tGoingUp) { for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { s32 id = MapGridGetMetatileIdAt(x + j, y + i); if (metatileIds[transitionStage] == (s16)id) { if (transitionStage != LAST_ESCALATOR_STAGE) MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[transitionStage + 1]); else MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[0]); } } } } else { for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { s32 id = MapGridGetMetatileIdAt(x + j, y + i); if (metatileIds[LAST_ESCALATOR_STAGE - transitionStage] == (s16)id) { if (transitionStage != LAST_ESCALATOR_STAGE) MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[1 - transitionStage]); else MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[LAST_ESCALATOR_STAGE]); } } } } } static void Task_DrawEscalator(u8 taskId) { s16 *data = gTasks[taskId].data; u16 state; tDrawingEscalator = TRUE; // Set tile for each section of the escalator in sequence for current transition stage switch (tState) { case 0: SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNextRail, 0); break; case 1: SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomRail, 0); break; case 2: SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNext, MAPGRID_COLLISION_MASK); break; case 3: SetEscalatorMetatile(taskId, sEscalatorMetatiles_Bottom, 0); break; case 4: SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNext, MAPGRID_COLLISION_MASK); break; case 5: SetEscalatorMetatile(taskId, sEscalatorMetatiles_Top, 0); break; case 6: SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNextRail, 0); default: break; } tState = (tState + 1) & 7; state = tState & 7; // If all sections of the escalator have been set, draw map and progress to next stage if (state == 0) { DrawWholeMapView(); tTransitionStage = (tTransitionStage + 1) % ESCALATOR_STAGES; tDrawingEscalator = FALSE; } } static u8 CreateEscalatorTask(bool16 goingUp) { u8 taskId; s16 *data; taskId = CreateTask(Task_DrawEscalator, 0); data = gTasks[taskId].data; PlayerGetDestCoords(&tPlayerX, &tPlayerY); tState = 0; tTransitionStage = 0; tGoingUp = goingUp; Task_DrawEscalator(taskId); return taskId; } void StartEscalator(bool8 goingUp) { u8 taskId; taskId = CreateEscalatorTask(goingUp); sEscalatorTaskId = taskId; } void StopEscalator(void) { DestroyTask(sEscalatorTaskId); } bool8 IsEscalatorMoving(void) { if (gTasks[sEscalatorTaskId].tDrawingEscalator == FALSE) { if (gTasks[sEscalatorTaskId].tTransitionStage != LAST_ESCALATOR_STAGE) return TRUE; return FALSE; } else { return TRUE; } } #undef tState #undef tTransitionStage #undef tGoingUp #undef tDrawingEscalator #undef tPlayerX #undef tPlayerY #define tTimer data[0] #define tState data[1] #define tX data[2] #define tY data[3] void AnimateTeleporterHousing(void) { u8 taskId; s16 *data; taskId = CreateTask(Task_DrawTeleporterHousing, 0); gTasks[taskId].tTimer = 0; gTasks[taskId].tState = 0; data = gTasks[taskId].data; PlayerGetDestCoords(&tX, &tY); // Set the coords of whichever teleporter is being animated // 0 for the right teleporter, 1 for the left teleporter if (gSpecialVar_0x8004 == 0) { gTasks[taskId].tX += 6; gTasks[taskId].tY -= 5; } else { gTasks[taskId].tX -= 1; gTasks[taskId].tY -= 5; } } static void Task_DrawTeleporterHousing(u8 taskId) { s16 *data = gTasks[taskId].data; if (tTimer == 0) { // Alternate the teleporter light / brightness of the teleporter door if ((tState & 1) == 0) { MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Yellow | MAPGRID_COLLISION_MASK); MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_HalfGlowing | MAPGRID_COLLISION_MASK); } else { MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Red | MAPGRID_COLLISION_MASK); MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_FullGlowing | MAPGRID_COLLISION_MASK); } CurrentMapDrawMetatileAt(tX, tY); CurrentMapDrawMetatileAt(tX, tY + 2); } tTimer++; if (tTimer != 16) return; tTimer = 0; tState++; if (tState != 13) return; MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Green | MAPGRID_COLLISION_MASK); MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door | MAPGRID_COLLISION_MASK); CurrentMapDrawMetatileAt(tX, tY); CurrentMapDrawMetatileAt(tX, tY + 2); DestroyTask(taskId); } void AnimateTeleporterCable(void) { u8 taskId; s16 *data; taskId = CreateTask(Task_DrawTeleporterCable, 0); gTasks[taskId].tTimer = 0; gTasks[taskId].tState = 0; data = gTasks[taskId].data; PlayerGetDestCoords(&tX, &tY); gTasks[taskId].tX += 4; gTasks[taskId].tY -= 5; } static void Task_DrawTeleporterCable(u8 taskId) { s16 *data = gTasks[taskId].data; if (tTimer == 0) { if (tState != 0) { // Set default cable tiles to clear the ball MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Cable_Top | MAPGRID_COLLISION_MASK); MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_Cable_Bottom | MAPGRID_COLLISION_MASK); CurrentMapDrawMetatileAt(tX, tY); CurrentMapDrawMetatileAt(tX, tY + 1); // End after drawing 4 times (length of the cable) if (tState == 4) { DestroyTask(taskId); return; } tX--; } // Draw the cable ball MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_CableBall_Top | MAPGRID_COLLISION_MASK); MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_CableBall_Bottom | MAPGRID_COLLISION_MASK); CurrentMapDrawMetatileAt(tX, tY); CurrentMapDrawMetatileAt(tX, tY + 1); } tTimer++; if (tTimer == 4) { tTimer = 0; tState++; } } #undef tTimer #undef tState #undef tX #undef tY ================================================ FILE: src/sprite.c ================================================ #include "global.h" #include "gflib.h" #define MAX_SPRITE_COPY_REQUESTS 64 #define OAM_MATRIX_COUNT 32 #define sAnchorX data[6] #define sAnchorY data[7] #define SET_SPRITE_TILE_RANGE(index, start, count) \ { \ sSpriteTileRanges[index * 2] = start; \ (sSpriteTileRanges + 1)[index * 2] = count; \ } #define ALLOC_SPRITE_TILE(n) \ { \ sSpriteTileAllocBitmap[(n) >> 3] |= (1 << ((n) & 7)); \ } #define FREE_SPRITE_TILE(n) \ { \ sSpriteTileAllocBitmap[(n) >> 3] &= ~(1 << ((n) & 7)); \ } #define SPRITE_TILE_IS_ALLOCATED(n) ((sSpriteTileAllocBitmap[(n) >> 3] >> ((n) & 7)) & 1) struct SpriteCopyRequest { const u8 *src; u8 *dest; u16 size; }; struct OamDimensions { s8 width; s8 height; }; static void SortSprites(u32 *spritePriorities, s32 n); 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); 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); static void ContinueAnim(struct Sprite *sprite); static void AnimCmd_frame(struct Sprite *sprite); static void AnimCmd_end(struct Sprite *sprite); static void AnimCmd_jump(struct Sprite *sprite); static void AnimCmd_loop(struct Sprite *sprite); static void BeginAnimLoop(struct Sprite *sprite); static void ContinueAnimLoop(struct Sprite *sprite); static void JumpToTopOfAnimLoop(struct Sprite *sprite); static void BeginAffineAnim(struct Sprite *sprite); static void ContinueAffineAnim(struct Sprite *sprite); static void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite); static void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite); static void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); static void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); static void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); static void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite); static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite); static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite); static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix); static u8 GetSpriteMatrixNum(struct Sprite *sprite); static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip); static void AffineAnimStateRestartAnim(u8 matrixNum); static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum); static void AffineAnimStateReset(u8 matrixNum); static void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); static void DecrementAnimDelayCounter(struct Sprite *sprite); static bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum); static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); static s16 ConvertScaleParam(s16 scale); static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd); static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); static u8 IndexOfSpriteTileTag(u16 tag); static void AllocSpriteTileRange(u16 tag, u16 start, u16 count); static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset); static void UpdateSpriteMatrixAnchorPos(struct Sprite* sprite, s32 a1, s32 a2); typedef void (*AnimFunc)(struct Sprite *); typedef void (*AnimCmdFunc)(struct Sprite *); typedef void (*AffineAnimCmdFunc)(u8 matrixNum, struct Sprite *); #define DUMMY_OAM_DATA \ { \ 160, /* Y (off-screen) */ \ ST_OAM_AFFINE_OFF, \ ST_OAM_OBJ_NORMAL, \ FALSE, \ ST_OAM_4BPP, \ ST_OAM_SQUARE, \ 304, /* X */ \ 0, \ ST_OAM_SIZE_0, \ 0x000, \ 3, /* lowest priority */ \ 0x0, \ 0 \ } #define ANIM_END 0xFFFF #define AFFINE_ANIM_END 0x7FFF // forward declarations const union AnimCmd * const gDummySpriteAnimTable[]; const union AffineAnimCmd * const gDummySpriteAffineAnimTable[]; const struct SpriteTemplate gDummySpriteTemplate; static const u8 sCenterToCornerVecTable[3][4][2] = { { // square { -4, -4 }, { -8, -8 }, { -16, -16 }, { -32, -32 }, }, { // horizontal rectangle { -8, -4 }, { -16, -4 }, { -16, -8 }, { -32, -16 }, }, { // vertical rectangle { -4, -8 }, { -4, -16 }, { -8, -16 }, { -16, -32 }, }, }; static const struct Sprite sDummySprite = { .oam = DUMMY_OAM_DATA, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .template = &gDummySpriteTemplate, .callback = SpriteCallbackDummy, .x = DISPLAY_WIDTH + 64, .y = DISPLAY_HEIGHT, .subpriority = 0xFF }; const struct OamData gDummyOamData = DUMMY_OAM_DATA; static const union AnimCmd sDummyAnim = { ANIM_END }; const union AnimCmd * const gDummySpriteAnimTable[] = { &sDummyAnim }; static const union AffineAnimCmd sDummyAffineAnim = { AFFINE_ANIM_END }; const union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffineAnim }; const struct SpriteTemplate gDummySpriteTemplate = { .tileTag = 0, .paletteTag = TAG_NONE, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const AnimFunc sAnimFuncs[] = { ContinueAnim, BeginAnim, }; static const AnimFunc sAffineAnimFuncs[] = { ContinueAffineAnim, BeginAffineAnim, }; static const AnimCmdFunc sAnimCmdFuncs[] = { AnimCmd_loop, AnimCmd_jump, AnimCmd_end, AnimCmd_frame, }; static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] = { AffineAnimCmd_loop, AffineAnimCmd_jump, AffineAnimCmd_end, AffineAnimCmd_frame, }; static const s32 sOamDimensionsCopy[3][4][2] = { [ST_OAM_SQUARE] = { [ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8 [ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16 [ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32 [ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64 }, [ST_OAM_H_RECTANGLE] = { [ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8 [ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8 [ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16 [ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32 }, [ST_OAM_V_RECTANGLE] = { [ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16 [ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32 [ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32 [ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64 }, }; static const struct OamDimensions sOamDimensions[3][4] = { [ST_OAM_SQUARE] = { [ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8 [ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16 [ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32 [ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64 }, [ST_OAM_H_RECTANGLE] = { [ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8 [ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8 [ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16 [ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32 }, [ST_OAM_V_RECTANGLE] = { [ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16 [ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32 [ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32 [ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64 }, }; static u16 sSpriteTileRangeTags[MAX_SPRITES]; static u16 sSpriteTileRanges[MAX_SPRITES * 2]; static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT]; static u16 sSpritePaletteTags[16]; u32 gOamMatrixAllocBitmap; u8 gReservedSpritePaletteCount; EWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0}; EWRAM_DATA u8 sSpriteOrder[MAX_SPRITES] = {0}; EWRAM_DATA bool8 sShouldProcessSpriteCopyRequests = 0; EWRAM_DATA u8 sSpriteCopyRequestCount = 0; EWRAM_DATA struct SpriteCopyRequest sSpriteCopyRequests[MAX_SPRITES] = {0}; EWRAM_DATA u8 gOamLimit = 0; static EWRAM_DATA u8 gOamDummyIndex = 0; EWRAM_DATA u16 gReservedSpriteTileCount = 0; EWRAM_DATA u8 sSpriteTileAllocBitmap[128] = {0}; EWRAM_DATA s16 gSpriteCoordOffsetX = 0; EWRAM_DATA s16 gSpriteCoordOffsetY = 0; EWRAM_DATA struct OamMatrix gOamMatrices[OAM_MATRIX_COUNT] = {0}; EWRAM_DATA bool8 gAffineAnimsDisabled = 0; void ResetSpriteData(void) { ResetOamRange(0, 128); gOamDummyIndex = 0; ResetAllSprites(); ClearSpriteCopyRequests(); ResetAffineAnimData(); FreeSpriteTileRanges(); gOamLimit = 64; gReservedSpriteTileCount = 0; AllocSpriteTiles(0); gSpriteCoordOffsetX = 0; gSpriteCoordOffsetY = 0; } void AnimateSprites(void) { u32 i; for (i = 0; i < MAX_SPRITES; i++) { struct Sprite *sprite = &gSprites[i]; if (sprite->inUse) { sprite->callback(sprite); if (sprite->inUse) AnimateSprite(sprite); } } } void BuildOamBuffer(void) { bool32 oamLoadDisabled; u32 i, stride; u32 oamIndex; // All attributes which affect sorting packed into a single u32: // { priority:2, subpriority:8, y:9, :5, index:8 }. // Index has its own byte even though it only needs 6 bits so that // we can load it with a ldrb instead of having to mask out the // bottom 6 bits. u32 spritePriorities[MAX_SPRITES]; s32 toSort = 0; u32 skippedSprites[MAX_SPRITES]; u32 skippedSpritesN = 0; u32 matrices = 0; for (i = 0; i < MAX_SPRITES; i++) { // Reuse existing sSpriteOrder because we expect the order to be // relatively stable between frames. u32 index = sSpriteOrder[i]; struct Sprite *sprite = &gSprites[index]; s32 y; if (!sprite->inUse || sprite->invisible) { skippedSprites[skippedSpritesN++] = index; continue; } if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) matrices |= 1 << sprite->oam.matrixNum; if (sprite->coordOffsetEnabled) { sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX; sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY; } else { sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX; sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY; } y = sprite->oam.y; if (y >= DISPLAY_HEIGHT) { y -= 256; } else if (sprite->oam.affineMode == ST_OAM_AFFINE_DOUBLE && sprite->oam.size == ST_OAM_SIZE_3) { u32 shape = sprite->oam.shape; if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) { if (y > 128) y -= 256; } } // y in [-128...159], so (159 - y) in [0..287]. spritePriorities[toSort++] = (sprite->oam.priority << 30) | (sprite->subpriority << 22) | (((159 - y) & 0x1FF) << 13) | (index << 0); } SortSprites(spritePriorities, toSort); for (i = 0; i < toSort; i++) sSpriteOrder[i] = spritePriorities[i] & 0xFF; for (i = 0; i < skippedSpritesN; i++) sSpriteOrder[toSort + i] = skippedSprites[i]; oamLoadDisabled = gMain.oamLoadDisabled; gMain.oamLoadDisabled = TRUE; for (i = 0, oamIndex = 0; i < toSort; i++) { if (AddSpriteToOamBuffer(&gSprites[spritePriorities[i] & 0xFF], &oamIndex)) break; } for (i = oamIndex; i < gOamDummyIndex; i++) gMain.oamBuffer[i] = gDummyOamData; gOamDummyIndex = oamIndex; for (i = 0; matrices != 0; i++, matrices >>= 1) { if (matrices & 1) { u32 base = 4 * i; gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a; gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b; gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c; gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d; } } gMain.oamLoadDisabled = oamLoadDisabled; sShouldProcessSpriteCopyRequests = TRUE; } void CopyMatricesToOamBuffer(void) { u32 i; for (i = 0; i < OAM_MATRIX_COUNT; i++) { u32 base = 4 * i; gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a; gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b; gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c; gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d; } } static inline void InsertionSort(u32 *spritePriorities, s32 n) { s32 i = 1; while (i < n) { u32 x = spritePriorities[i]; s32 j = i - 1; while (j >= 0 && spritePriorities[j] > x) { spritePriorities[j + 1] = spritePriorities[j]; j--; } spritePriorities[j + 1] = x; i++; } } static void SortSprites(u32 *spritePriorities, s32 n) { InsertionSort(spritePriorities, n); } u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) { u32 i; for (i = 0; i < MAX_SPRITES; i++) if (!gSprites[i].inUse) return CreateSpriteAt(i, template, x, y, subpriority); return MAX_SPRITES; } u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) { s32 i; for (i = MAX_SPRITES - 1; i > -1; i--) if (!gSprites[i].inUse) return CreateSpriteAt(i, template, x, y, subpriority); return MAX_SPRITES; } u8 CreateInvisibleSprite(void (*callback)(struct Sprite *)) { u8 index = CreateSprite(&gDummySpriteTemplate, 0, 0, 31); if (index == MAX_SPRITES) { return MAX_SPRITES; } else { gSprites[index].invisible = TRUE; gSprites[index].callback = callback; return index; } } u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) { struct Sprite *sprite = &gSprites[index]; ResetSprite(sprite); sprite->inUse = TRUE; sprite->animBeginning = TRUE; sprite->affineAnimBeginning = TRUE; sprite->usingSheet = TRUE; sprite->subpriority = subpriority; sprite->oam = *template->oam; sprite->anims = template->anims; sprite->affineAnims = template->affineAnims; sprite->template = template; sprite->callback = template->callback; sprite->x = x; sprite->y = y; CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); if (template->tileTag == TAG_NONE) { s16 tileNum; sprite->images = template->images; tileNum = AllocSpriteTiles((u8)(sprite->images->size / TILE_SIZE_4BPP)); if (tileNum == -1) { ResetSprite(sprite); return MAX_SPRITES; } sprite->oam.tileNum = tileNum; sprite->usingSheet = FALSE; sprite->sheetTileStart = 0; } else { sprite->sheetTileStart = GetSpriteTileStartByTag(template->tileTag); SetSpriteSheetFrameTileNum(sprite); } if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) InitSpriteAffineAnim(sprite); if (template->paletteTag != TAG_NONE) sprite->oam.paletteNum = IndexOfSpritePaletteTag(template->paletteTag); return index; } u8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) { u32 i; for (i = 0; i < MAX_SPRITES; i++) { struct Sprite *sprite = &gSprites[i]; if (!gSprites[i].inUse) { u8 index = CreateSpriteAt(i, template, x, y, subpriority); if (index == MAX_SPRITES) return MAX_SPRITES; gSprites[i].callback(sprite); if (gSprites[i].inUse) AnimateSprite(sprite); return index; } } return MAX_SPRITES; } void DestroySprite(struct Sprite *sprite) { if (sprite->inUse) { if (!sprite->usingSheet) { u32 i; u16 tileEnd = (sprite->images->size / TILE_SIZE_4BPP) + sprite->oam.tileNum; for (i = sprite->oam.tileNum; i < tileEnd; i++) FREE_SPRITE_TILE(i); } ResetSprite(sprite); } } void ResetOamRange(u8 a, u8 b) { u32 i; for (i = a; i < b; i++) { struct OamData *oamBuffer = gMain.oamBuffer; oamBuffer[i] = *(struct OamData *)&gDummyOamData; } } void LoadOam(void) { if (!gMain.oamLoadDisabled) CpuCopy32(gMain.oamBuffer, (void *)OAM, sizeof(gMain.oamBuffer)); } void ClearSpriteCopyRequests(void) { u32 i; sShouldProcessSpriteCopyRequests = FALSE; sSpriteCopyRequestCount = 0; for (i = 0; i < MAX_SPRITE_COPY_REQUESTS; i++) { sSpriteCopyRequests[i].src = 0; sSpriteCopyRequests[i].dest = 0; sSpriteCopyRequests[i].size = 0; } } void ResetOamMatrices(void) { u32 i; for (i = 0; i < OAM_MATRIX_COUNT; i++) { // set to identity matrix gOamMatrices[i].a = 0x0100; gOamMatrices[i].b = 0x0000; gOamMatrices[i].c = 0x0000; gOamMatrices[i].d = 0x0100; } } void SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d) { gOamMatrices[matrixNum].a = a; gOamMatrices[matrixNum].b = b; gOamMatrices[matrixNum].c = c; gOamMatrices[matrixNum].d = d; } void ResetSprite(struct Sprite *sprite) { *sprite = sDummySprite; } void CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode) { u8 x = sCenterToCornerVecTable[shape][size][0]; u8 y = sCenterToCornerVecTable[shape][size][1]; if (affineMode & ST_OAM_AFFINE_DOUBLE_MASK) { x *= 2; y *= 2; } sprite->centerToCornerVecX = x; sprite->centerToCornerVecY = y; } s16 AllocSpriteTiles(u16 tileCount) { u32 i; s16 start; u16 numTilesFound; if (tileCount == 0) { // Free all unreserved tiles if the tile count is 0. for (i = gReservedSpriteTileCount; i < TOTAL_OBJ_TILE_COUNT; i++) FREE_SPRITE_TILE(i); return 0; } i = gReservedSpriteTileCount; for (;;) { while (SPRITE_TILE_IS_ALLOCATED(i)) { i++; if (i == TOTAL_OBJ_TILE_COUNT) return -1; } start = i; numTilesFound = 1; while (numTilesFound != tileCount) { i++; if (i == TOTAL_OBJ_TILE_COUNT) return -1; if (!SPRITE_TILE_IS_ALLOCATED(i)) numTilesFound++; else break; } if (numTilesFound == tileCount) break; } for (i = start; i < tileCount + start; i++) ALLOC_SPRITE_TILE(i); return start; } u8 SpriteTileAllocBitmapOp(u16 bit, u8 op) { u8 index = bit / 8; u8 shift = bit % 8; u8 val = bit % 8; u8 retVal = 0; if (op == 0) // clear { val = ~(1 << val); sSpriteTileAllocBitmap[index] &= val; } else if (op == 1) // set { val = (1 << val); sSpriteTileAllocBitmap[index] |= val; } else // check { retVal = 1 << shift; retVal &= sSpriteTileAllocBitmap[index]; } return retVal; } void FreeSpriteTilesIfNotUsingSheet(struct Sprite *sprite) { if (!sprite->usingSheet) { int i; int end = (sprite->images[0].size / TILE_SIZE_4BPP) + sprite->oam.tileNum; for (i = sprite->oam.tileNum; i < end; i++) FREE_SPRITE_TILE(i); } } void SpriteCallbackDummy(struct Sprite *sprite) { } void ProcessSpriteCopyRequests(void) { if (sShouldProcessSpriteCopyRequests) { u8 i = 0; while (sSpriteCopyRequestCount > 0) { CpuCopy16(sSpriteCopyRequests[i].src, sSpriteCopyRequests[i].dest, sSpriteCopyRequests[i].size); sSpriteCopyRequestCount--; i++; } sShouldProcessSpriteCopyRequests = FALSE; } } void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images) { if (sSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) { sSpriteCopyRequests[sSpriteCopyRequestCount].src = images[index].data; sSpriteCopyRequests[sSpriteCopyRequestCount].dest = (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum; sSpriteCopyRequests[sSpriteCopyRequestCount].size = images[index].size; sSpriteCopyRequestCount++; } } void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size) { if (sSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) { sSpriteCopyRequests[sSpriteCopyRequestCount].src = src; sSpriteCopyRequests[sSpriteCopyRequestCount].dest = dest; sSpriteCopyRequests[sSpriteCopyRequestCount].size = size; sSpriteCopyRequestCount++; } } void CopyFromSprites(u8 *dest) { u32 i; u8 *src = (u8 *)gSprites; for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) { *dest = *src; dest++; src++; } } void CopyToSprites(u8 *src) { u32 i; u8 *dest = (u8 *)gSprites; for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) { *dest = *src; src++; dest++; } } void ResetAllSprites(void) { u32 i; for (i = 0; i < MAX_SPRITES; i++) { ResetSprite(&gSprites[i]); sSpriteOrder[i] = i; } ResetSprite(&gSprites[i]); } void FreeSpriteTiles(struct Sprite *sprite) { if (sprite->template->tileTag != TAG_NONE) FreeSpriteTilesByTag(sprite->template->tileTag); } void FreeSpritePalette(struct Sprite *sprite) { FreeSpritePaletteByTag(sprite->template->paletteTag); } void FreeSpriteOamMatrix(struct Sprite *sprite) { if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) { FreeOamMatrix(sprite->oam.matrixNum); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; } } void DestroySpriteAndFreeResources(struct Sprite *sprite) { FreeSpriteTiles(sprite); FreeSpritePalette(sprite); FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } void AnimateSprite(struct Sprite *sprite) { sAnimFuncs[sprite->animBeginning](sprite); if (!gAffineAnimsDisabled) sAffineAnimFuncs[sprite->affineAnimBeginning](sprite); } void BeginAnim(struct Sprite *sprite) { s16 imageValue; u8 duration; u8 hFlip; u8 vFlip; sprite->animCmdIndex = 0; sprite->animEnded = FALSE; sprite->animLoopCounter = 0; imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; if (imageValue != -1) { sprite->animBeginning = FALSE; duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; if (duration) duration--; sprite->animDelayCounter = duration; if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) SetSpriteOamFlipBits(sprite, hFlip, vFlip); if (sprite->usingSheet) sprite->oam.tileNum = sprite->sheetTileStart + imageValue; else RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); } } void ContinueAnim(struct Sprite *sprite) { if (sprite->animDelayCounter) { u8 hFlip; u8 vFlip; DecrementAnimDelayCounter(sprite); hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) SetSpriteOamFlipBits(sprite, hFlip, vFlip); } else if (!sprite->animPaused) { s16 type; s16 funcIndex; sprite->animCmdIndex++; type = sprite->anims[sprite->animNum][sprite->animCmdIndex].type; funcIndex = 3; if (type < 0) funcIndex = type + 3; sAnimCmdFuncs[funcIndex](sprite); } } void AnimCmd_frame(struct Sprite *sprite) { s16 imageValue; u8 duration; u8 hFlip; u8 vFlip; imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; if (duration) duration--; sprite->animDelayCounter = duration; if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) SetSpriteOamFlipBits(sprite, hFlip, vFlip); if (sprite->usingSheet) sprite->oam.tileNum = sprite->sheetTileStart + imageValue; else RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); } void AnimCmd_end(struct Sprite *sprite) { sprite->animCmdIndex--; sprite->animEnded = TRUE; } void AnimCmd_jump(struct Sprite *sprite) { s16 imageValue; u8 duration; u8 hFlip; u8 vFlip; sprite->animCmdIndex = sprite->anims[sprite->animNum][sprite->animCmdIndex].jump.target; imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; if (duration) duration--; sprite->animDelayCounter = duration; if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) SetSpriteOamFlipBits(sprite, hFlip, vFlip); if (sprite->usingSheet) sprite->oam.tileNum = sprite->sheetTileStart + imageValue; else RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); } void AnimCmd_loop(struct Sprite *sprite) { if (sprite->animLoopCounter) ContinueAnimLoop(sprite); else BeginAnimLoop(sprite); } void BeginAnimLoop(struct Sprite *sprite) { sprite->animLoopCounter = sprite->anims[sprite->animNum][sprite->animCmdIndex].loop.count; JumpToTopOfAnimLoop(sprite); ContinueAnim(sprite); } void ContinueAnimLoop(struct Sprite *sprite) { sprite->animLoopCounter--; JumpToTopOfAnimLoop(sprite); ContinueAnim(sprite); } void JumpToTopOfAnimLoop(struct Sprite *sprite) { if (sprite->animLoopCounter) { sprite->animCmdIndex--; while (sprite->anims[sprite->animNum][sprite->animCmdIndex - 1].type != -3) { if (sprite->animCmdIndex == 0) break; sprite->animCmdIndex--; } sprite->animCmdIndex--; } } void BeginAffineAnim(struct Sprite *sprite) { if ((sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) && sprite->affineAnims[0][0].type != 32767) { struct AffineAnimFrameCmd frameCmd; u8 matrixNum = GetSpriteMatrixNum(sprite); AffineAnimStateRestartAnim(matrixNum); GetAffineAnimFrame(matrixNum, sprite, &frameCmd); sprite->affineAnimBeginning = FALSE; sprite->affineAnimEnded = FALSE; ApplyAffineAnimFrame(matrixNum, &frameCmd); sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; if (sprite->anchored) UpdateSpriteMatrixAnchorPos(sprite, sprite->sAnchorX, sprite->sAnchorY); } } void ContinueAffineAnim(struct Sprite *sprite) { if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) { u8 matrixNum = GetSpriteMatrixNum(sprite); if (sAffineAnimStates[matrixNum].delayCounter) AffineAnimDelay(matrixNum, sprite); else if (sprite->affineAnimPaused) return; else { s16 type; s16 funcIndex; sAffineAnimStates[matrixNum].animCmdIndex++; type = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].type; funcIndex = 3; if (type >= 32765) funcIndex = type - 32765; sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite); } if (sprite->anchored) UpdateSpriteMatrixAnchorPos(sprite, sprite->sAnchorX, sprite->sAnchorY); } } void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite) { if (!DecrementAffineAnimDelayCounter(sprite, matrixNum)) { struct AffineAnimFrameCmd frameCmd; GetAffineAnimFrame(matrixNum, sprite, &frameCmd); ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &frameCmd); } } void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite) { if (sAffineAnimStates[matrixNum].loopCounter) ContinueAffineAnimLoop(matrixNum, sprite); else BeginAffineAnimLoop(matrixNum, sprite); } void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) { sAffineAnimStates[matrixNum].loopCounter = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].loop.count; JumpToTopOfAffineAnimLoop(matrixNum, sprite); ContinueAffineAnim(sprite); } void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) { sAffineAnimStates[matrixNum].loopCounter--; JumpToTopOfAffineAnimLoop(matrixNum, sprite); ContinueAffineAnim(sprite); } void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) { if (sAffineAnimStates[matrixNum].loopCounter) { sAffineAnimStates[matrixNum].animCmdIndex--; while (sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex - 1].type != 32765) { if (sAffineAnimStates[matrixNum].animCmdIndex == 0) break; sAffineAnimStates[matrixNum].animCmdIndex--; } sAffineAnimStates[matrixNum].animCmdIndex--; } } void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite) { struct AffineAnimFrameCmd frameCmd; sAffineAnimStates[matrixNum].animCmdIndex = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].jump.target; GetAffineAnimFrame(matrixNum, sprite, &frameCmd); ApplyAffineAnimFrame(matrixNum, &frameCmd); sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; } void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite) { struct AffineAnimFrameCmd dummyFrameCmd = {0}; sprite->affineAnimEnded = TRUE; sAffineAnimStates[matrixNum].animCmdIndex--; ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); } void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite) { struct AffineAnimFrameCmd frameCmd; GetAffineAnimFrame(matrixNum, sprite, &frameCmd); ApplyAffineAnimFrame(matrixNum, &frameCmd); sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; } void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix) { gOamMatrices[destMatrixIndex].a = srcMatrix->a; gOamMatrices[destMatrixIndex].b = srcMatrix->b; gOamMatrices[destMatrixIndex].c = srcMatrix->c; gOamMatrices[destMatrixIndex].d = srcMatrix->d; } u8 GetSpriteMatrixNum(struct Sprite *sprite) { u8 matrixNum = 0; if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) matrixNum = sprite->oam.matrixNum; return matrixNum; } void SetSpriteMatrixAnchor(struct Sprite* sprite, s16 x, s16 y) { sprite->sAnchorX = x; sprite->sAnchorY = y; sprite->anchored = TRUE; } static s32 GetAnchorCoord(s32 baseDim, s32 xformed, s32 modifier) { s32 subResult, shiftResult; subResult = xformed - baseDim; if (subResult < 0) shiftResult = -(subResult) >> 9; else shiftResult = -(subResult >> 9); return modifier - ((u32)(modifier * xformed) / (u32)(baseDim) + shiftResult); } static void UpdateSpriteMatrixAnchorPos(struct Sprite *sprite, s32 x, s32 y) { s32 dim, baseDim, xFormed; u32 matrixNum = sprite->oam.matrixNum; if (x != NO_ANCHOR) { dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][0]; baseDim = dim << 8; xFormed = (dim << 16) / gOamMatrices[matrixNum].a; sprite->x2 = GetAnchorCoord(baseDim, xFormed, x); } if (y != NO_ANCHOR) { dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][1]; baseDim = dim << 8; xFormed = (dim << 16) / gOamMatrices[matrixNum].d; sprite->y2 = GetAnchorCoord(baseDim, xFormed, y); } } void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip) { sprite->oam.matrixNum &= 0x7; sprite->oam.matrixNum |= (((hFlip ^ sprite->hFlip) & 1) << 3); sprite->oam.matrixNum |= (((vFlip ^ sprite->vFlip) & 1) << 4); } void AffineAnimStateRestartAnim(u8 matrixNum) { sAffineAnimStates[matrixNum].animCmdIndex = 0; sAffineAnimStates[matrixNum].delayCounter = 0; sAffineAnimStates[matrixNum].loopCounter = 0; } void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum) { sAffineAnimStates[matrixNum].animNum = animNum; sAffineAnimStates[matrixNum].animCmdIndex = 0; sAffineAnimStates[matrixNum].delayCounter = 0; sAffineAnimStates[matrixNum].loopCounter = 0; sAffineAnimStates[matrixNum].xScale = 0x0100; sAffineAnimStates[matrixNum].yScale = 0x0100; sAffineAnimStates[matrixNum].rotation = 0; } void AffineAnimStateReset(u8 matrixNum) { sAffineAnimStates[matrixNum].animNum = 0; sAffineAnimStates[matrixNum].animCmdIndex = 0; sAffineAnimStates[matrixNum].delayCounter = 0; sAffineAnimStates[matrixNum].loopCounter = 0; sAffineAnimStates[matrixNum].xScale = 0x0100; sAffineAnimStates[matrixNum].yScale = 0x0100; sAffineAnimStates[matrixNum].rotation = 0; } void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) { sAffineAnimStates[matrixNum].xScale = frameCmd->xScale; sAffineAnimStates[matrixNum].yScale = frameCmd->yScale; sAffineAnimStates[matrixNum].rotation = frameCmd->rotation << 8; } void DecrementAnimDelayCounter(struct Sprite *sprite) { if (!sprite->animPaused) sprite->animDelayCounter--; } bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum) { if (!sprite->affineAnimPaused) --sAffineAnimStates[matrixNum].delayCounter; return sprite->affineAnimPaused; } void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) { struct ObjAffineSrcData srcData; struct OamMatrix matrix; sAffineAnimStates[matrixNum].xScale += frameCmd->xScale; sAffineAnimStates[matrixNum].yScale += frameCmd->yScale; sAffineAnimStates[matrixNum].rotation = (sAffineAnimStates[matrixNum].rotation + (frameCmd->rotation << 8)) & ~0xFF; srcData.xScale = ConvertScaleParam(sAffineAnimStates[matrixNum].xScale); srcData.yScale = ConvertScaleParam(sAffineAnimStates[matrixNum].yScale); srcData.rotation = sAffineAnimStates[matrixNum].rotation; ObjAffineSet(&srcData, &matrix, 1, 2); CopyOamMatrix(matrixNum, &matrix); } s16 ConvertScaleParam(s16 scale) { s32 val = 0x10000; return SAFE_DIV(val, scale); } void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd) { frameCmd->xScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.xScale; frameCmd->yScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.yScale; frameCmd->rotation = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.rotation; frameCmd->duration = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.duration; } void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) { struct AffineAnimFrameCmd dummyFrameCmd = {0}; if (frameCmd->duration) { frameCmd->duration--; ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, frameCmd); } else { ApplyAffineAnimFrameAbsolute(matrixNum, frameCmd); ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); } } void StartSpriteAnim(struct Sprite *sprite, u8 animNum) { sprite->animNum = animNum; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; } void StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum) { if (sprite->animNum != animNum) StartSpriteAnim(sprite, animNum); } void SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex) { u8 temp = sprite->animPaused; sprite->animCmdIndex = animCmdIndex - 1; sprite->animDelayCounter = 0; sprite->animBeginning = FALSE; sprite->animEnded = FALSE; sprite->animPaused = FALSE; ContinueAnim(sprite); if (sprite->animDelayCounter) sprite->animDelayCounter++; sprite->animPaused = temp; } void StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum) { u8 matrixNum = GetSpriteMatrixNum(sprite); AffineAnimStateStartAnim(matrixNum, animNum); sprite->affineAnimBeginning = TRUE; sprite->affineAnimEnded = FALSE; } void StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) { u8 matrixNum = GetSpriteMatrixNum(sprite); if (sAffineAnimStates[matrixNum].animNum != animNum) StartSpriteAffineAnim(sprite, animNum); } void ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum) { u8 matrixNum = GetSpriteMatrixNum(sprite); sAffineAnimStates[matrixNum].animNum = animNum; sprite->affineAnimBeginning = TRUE; sprite->affineAnimEnded = FALSE; } void ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) { u8 matrixNum = GetSpriteMatrixNum(sprite); if (sAffineAnimStates[matrixNum].animNum != animNum) ChangeSpriteAffineAnim(sprite, animNum); } void SetSpriteSheetFrameTileNum(struct Sprite *sprite) { if (sprite->usingSheet) { s16 tileOffset = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; if (tileOffset < 0) tileOffset = 0; sprite->oam.tileNum = sprite->sheetTileStart + tileOffset; } } void ResetAffineAnimData(void) { u32 i; gAffineAnimsDisabled = 0; gOamMatrixAllocBitmap = 0; ResetOamMatrices(); for (i = 0; i < OAM_MATRIX_COUNT; i++) AffineAnimStateReset(i); } u8 AllocOamMatrix(void) { u8 i = 0; u32 bit = 1; u32 bitmap = gOamMatrixAllocBitmap; while (i < OAM_MATRIX_COUNT) { if (!(bitmap & bit)) { gOamMatrixAllocBitmap |= bit; return i; } i++; bit <<= 1; } return 0xFF; } void FreeOamMatrix(u8 matrixNum) { u8 i = 0; u32 bit = 1; while (i < matrixNum) { i++; bit <<= 1; } gOamMatrixAllocBitmap &= ~bit; SetOamMatrix(matrixNum, 0x100, 0, 0, 0x100); } void InitSpriteAffineAnim(struct Sprite *sprite) { u8 matrixNum = AllocOamMatrix(); if (matrixNum != 0xFF) { CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); sprite->oam.matrixNum = matrixNum; sprite->affineAnimBeginning = TRUE; AffineAnimStateReset(matrixNum); } } void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation) { struct ObjAffineSrcData srcData; struct OamMatrix matrix; srcData.xScale = ConvertScaleParam(xScale); srcData.yScale = ConvertScaleParam(yScale); srcData.rotation = rotation; ObjAffineSet(&srcData, &matrix, 1, 2); CopyOamMatrix(matrixNum, &matrix); } u16 LoadSpriteSheet(const struct SpriteSheet *sheet) { s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); if (tileStart < 0) { return 0; } else { AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); CpuCopy16(sheet->data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); return (u16)tileStart; } } void LoadSpriteSheets(const struct SpriteSheet *sheets) { u32 i; for (i = 0; sheets[i].data != NULL; i++) LoadSpriteSheet(&sheets[i]); } void FreeSpriteTilesByTag(u16 tag) { u8 index = IndexOfSpriteTileTag(tag); if (index != 0xFF) { u32 i; u16 *rangeStarts; u16 *rangeCounts; u16 start; u16 count; rangeStarts = sSpriteTileRanges; start = rangeStarts[index * 2]; rangeCounts = sSpriteTileRanges + 1; count = rangeCounts[index * 2]; for (i = start; i < start + count; i++) FREE_SPRITE_TILE(i); sSpriteTileRangeTags[index] = TAG_NONE; } } void FreeSpriteTileRanges(void) { u32 i; for (i = 0; i < MAX_SPRITES; i++) { sSpriteTileRangeTags[i] = TAG_NONE; SET_SPRITE_TILE_RANGE(i, 0, 0); } } u16 GetSpriteTileStartByTag(u16 tag) { u8 index = IndexOfSpriteTileTag(tag); if (index == 0xFF) return TAG_NONE; return sSpriteTileRanges[index * 2]; } u8 IndexOfSpriteTileTag(u16 tag) { u32 i; for (i = 0; i < MAX_SPRITES; i++) if (sSpriteTileRangeTags[i] == tag) return i; return 0xFF; } u16 GetSpriteTileTagByTileStart(u16 start) { u32 i; for (i = 0; i < MAX_SPRITES; i++) { if (sSpriteTileRangeTags[i] != TAG_NONE && sSpriteTileRanges[i * 2] == start) return sSpriteTileRangeTags[i]; } return TAG_NONE; } void AllocSpriteTileRange(u16 tag, u16 start, u16 count) { u8 freeIndex = IndexOfSpriteTileTag(TAG_NONE); sSpriteTileRangeTags[freeIndex] = tag; SET_SPRITE_TILE_RANGE(freeIndex, start, count); } void FreeAllSpritePalettes(void) { u32 i; gReservedSpritePaletteCount = 0; for (i = 0; i < ARRAY_COUNT(sSpritePaletteTags); i++) sSpritePaletteTags[i] = TAG_NONE; } u8 LoadSpritePalette(const struct SpritePalette *palette) { u8 index = IndexOfSpritePaletteTag(palette->tag); if (index != 0xFF) return index; index = IndexOfSpritePaletteTag(TAG_NONE); if (index == 0xFF) { return 0xFF; } else { sSpritePaletteTags[index] = palette->tag; DoLoadSpritePalette(palette->data, PLTT_ID(index)); return index; } } void LoadSpritePalettes(const struct SpritePalette *palettes) { u32 i; for (i = 0; palettes[i].data != NULL; i++) if (LoadSpritePalette(&palettes[i]) == 0xFF) break; } static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) { LoadPalette(src, paletteOffset + OBJ_PLTT_OFFSET, PLTT_SIZE_4BPP); } u8 AllocSpritePalette(u16 tag) { u8 index = IndexOfSpritePaletteTag(TAG_NONE); if (index == 0xFF) { return 0xFF; } else { sSpritePaletteTags[index] = tag; return index; } } u8 IndexOfSpritePaletteTag(u16 tag) { u32 i; for (i = gReservedSpritePaletteCount; i < 16; i++) if (sSpritePaletteTags[i] == tag) return i; return 0xFF; } u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum) { return sSpritePaletteTags[paletteNum]; } void FreeSpritePaletteByTag(u16 tag) { u8 index = IndexOfSpritePaletteTag(tag); if (index != 0xFF) sSpritePaletteTags[index] = TAG_NONE; } void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables) { sprite->subspriteTables = subspriteTables; sprite->subspriteTableNum = 0; sprite->subspriteMode = SUBSPRITES_ON; } bool8 AddSpriteToOamBuffer(struct Sprite *sprite, u32 *oamIndex) { if (*oamIndex >= gOamLimit) return 1; if (!sprite->subspriteTables || sprite->subspriteMode == SUBSPRITES_OFF) { gMain.oamBuffer[*oamIndex] = sprite->oam; (*oamIndex)++; return 0; } else { return AddSubspritesToOamBuffer(sprite, &gMain.oamBuffer[*oamIndex], oamIndex); } } bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u32 *oamIndex) { const struct SubspriteTable *subspriteTable; struct OamData *oam; if (*oamIndex >= gOamLimit) return 1; subspriteTable = &sprite->subspriteTables[sprite->subspriteTableNum]; oam = &sprite->oam; if (!subspriteTable || !subspriteTable->subsprites) { *destOam = *oam; (*oamIndex)++; return 0; } else { u16 tileNum; u16 baseX; u16 baseY; u8 subspriteCount; u8 hFlip; u8 vFlip; u32 i; tileNum = oam->tileNum; subspriteCount = subspriteTable->subspriteCount; hFlip = ((s32)oam->matrixNum >> 3) & 1; vFlip = ((s32)oam->matrixNum >> 4) & 1; baseX = oam->x - sprite->centerToCornerVecX; baseY = oam->y - sprite->centerToCornerVecY; for (i = 0; i < subspriteCount; i++, (*oamIndex)++) { u16 x; u16 y; if (*oamIndex >= gOamLimit) return 1; x = subspriteTable->subsprites[i].x; y = subspriteTable->subsprites[i].y; if (hFlip) { s8 width = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].width; s16 right = x; right += width; x = right; x = ~x + 1; } if (vFlip) { s8 height = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].height; s16 bottom = y; bottom += height; y = bottom; y = ~y + 1; } destOam[i] = *oam; destOam[i].shape = subspriteTable->subsprites[i].shape; destOam[i].size = subspriteTable->subsprites[i].size; destOam[i].x = (s16)baseX + (s16)x; destOam[i].y = baseY + y; destOam[i].tileNum = tileNum + subspriteTable->subsprites[i].tileOffset; if (sprite->subspriteMode != SUBSPRITES_IGNORE_PRIORITY) destOam[i].priority = subspriteTable->subsprites[i].priority; } } return 0; } ================================================ FILE: src/ss_anne.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "event_object_movement.h" #include "script.h" #include "constants/songs.h" // Tasks governing the ship's departure after you've gotten HM01 CUT #define SPRITE_TAG_WAKE 4000 #define SPRITE_TAG_SMOKE 4001 static void Task_SSAnneInit(u8 taskId); static void Task_SSAnneRun(u8 taskId); static void Task_SSAnneFinish(u8 taskId); static void CreateWakeBehindBoat(void); static void WakeSpriteCallback(struct Sprite *sprite); static void CreateSmokeSprite(void); static void SmokeSpriteCallback(struct Sprite *sprite); static const u16 sWakeTiles[] = INCBIN_U16("graphics/ss_anne/wake.4bpp"); static const u16 sSmokeTiles[] = INCBIN_U16("graphics/ss_anne/smoke.4bpp"); static const struct SpriteSheet sSpriteSheets[] = { {(const void *)sWakeTiles, sizeof(sWakeTiles), SPRITE_TAG_WAKE}, {(const void *)sSmokeTiles, sizeof(sSmokeTiles), SPRITE_TAG_SMOKE}, {0} }; static const union AnimCmd sWakeAnim[] = { ANIMCMD_FRAME(0, 12), ANIMCMD_FRAME(8, 12), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sWakeAnimTable[] = { sWakeAnim }; static const struct OamData sWakeOamData = { .shape = ST_OAM_V_RECTANGLE, .size = 2 }; static const struct SpriteTemplate sWakeSpriteTemplate = { SPRITE_TAG_WAKE, 0xFFFF, &sWakeOamData, sWakeAnimTable, NULL, gDummySpriteAffineAnimTable, WakeSpriteCallback }; static const union AnimCmd sSmokeAnim[] = { ANIMCMD_FRAME( 0, 10), ANIMCMD_FRAME( 4, 20), ANIMCMD_FRAME( 8, 20), ANIMCMD_FRAME(12, 30), ANIMCMD_END }; static const union AnimCmd *const sSmokeAnimTable[] = { sSmokeAnim }; static const struct OamData sSmokeOamData = { .shape = ST_OAM_SQUARE, .size = 1 }; static const struct SpriteTemplate sSmokeSpriteTemplate = { SPRITE_TAG_SMOKE, 0xFFFF, &sSmokeOamData, sSmokeAnimTable, NULL, gDummySpriteAffineAnimTable, SmokeSpriteCallback }; void DoSSAnneDepartureCutscene(void) { u8 taskId; PlaySE(SE_SS_ANNE_HORN); taskId = CreateTask(Task_SSAnneInit, 8); gTasks[taskId].data[0] = 50; } static void Task_SSAnneInit(u8 taskId) { s16 * data = gTasks[taskId].data; if (--data[0] == 0) { LoadSpriteSheets(sSpriteSheets); CreateWakeBehindBoat(); gTasks[taskId].func = Task_SSAnneRun; } } static void Task_SSAnneRun(u8 taskId) { s16 * data = gTasks[taskId].data; u8 objectEventId; struct ObjectEvent * boatObject; s16 x; data[1]++; data[2]++; if (data[1] == 70) { data[1] = 0; CreateSmokeSprite(); } TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); boatObject = &gObjectEvents[objectEventId]; if (gSprites[boatObject->spriteId].x + gSprites[boatObject->spriteId].x2 < -120) { PlaySE(SE_SS_ANNE_HORN); gTasks[taskId].func = Task_SSAnneFinish; } else { x = data[2] / 5; gSprites[boatObject->spriteId].x2 = -x; } } static void Task_SSAnneFinish(u8 taskId) { s16 * data = gTasks[taskId].data; if (++data[3] == 40) { FreeSpriteTilesByTag(SPRITE_TAG_WAKE); FreeSpriteTilesByTag(SPRITE_TAG_SMOKE); DestroyTask(taskId); ScriptContext_Enable(); } } static void CreateWakeBehindBoat(void) { u8 objectEventId; struct ObjectEvent * boatObject; u16 x; u8 spriteId; TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); boatObject = &gObjectEvents[objectEventId]; x = gSprites[boatObject->spriteId].x + gSprites[boatObject->spriteId].x2 + 80; spriteId = CreateSprite(&sWakeSpriteTemplate, x, 109, 0xFF); gSprites[spriteId].oam.priority = 2; gSprites[spriteId].oam.paletteNum = 10; } static void WakeSpriteCallback(struct Sprite *sprite) { u8 objectEventId; struct ObjectEvent * boatObject; u16 x; TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); boatObject = &gObjectEvents[objectEventId]; x = gSprites[boatObject->spriteId].x + gSprites[boatObject->spriteId].x2 + 80; sprite->x = x; if (sprite->data[0] / 6 < 22) sprite->data[0]++; sprite->x2 = sprite->data[0] / 6; if (sprite->x + sprite->x2 < -18) DestroySprite(sprite); } static void CreateSmokeSprite(void) { u8 objectEventId; struct ObjectEvent * boatObject; u16 x; u8 spriteId; TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); boatObject = &gObjectEvents[objectEventId]; x = gSprites[boatObject->spriteId].x + gSprites[boatObject->spriteId].x2 + 49; if ((s16)x >= -32) { spriteId = CreateSprite(&sSmokeSpriteTemplate, x, 78, 8); if (spriteId != MAX_SPRITES) gSprites[spriteId].oam.paletteNum = 10; } } static void SmokeSpriteCallback(struct Sprite *sprite) { sprite->data[0]++; sprite->x2 = sprite->data[0] / 4; if (sprite->animEnded) DestroySprite(sprite); } ================================================ FILE: src/start_menu.c ================================================ #include "global.h" #include "gflib.h" #include "scanline_effect.h" #include "overworld.h" #include "link.h" #include "pokedex.h" #include "item_menu.h" #include "party_menu.h" #include "save.h" #include "link_rfu.h" #include "help_message.h" #include "event_data.h" #include "fieldmap.h" #include "safari_zone.h" #include "start_menu.h" #include "menu.h" #include "load_save.h" #include "strings.h" #include "menu_helpers.h" #include "text_window.h" #include "field_fadetransition.h" #include "field_player_avatar.h" #include "new_menu_helpers.h" #include "event_object_movement.h" #include "event_object_lock.h" #include "script.h" #include "quest_log.h" #include "new_game.h" #include "event_scripts.h" #include "field_weather.h" #include "field_specials.h" #include "pokedex_screen.h" #include "trainer_card.h" #include "option_menu.h" #include "save_menu_util.h" #include "help_system.h" #include "constants/songs.h" #include "constants/field_weather.h" enum StartMenuOption { STARTMENU_POKEDEX = 0, STARTMENU_POKEMON, STARTMENU_BAG, STARTMENU_PLAYER, STARTMENU_SAVE, STARTMENU_OPTION, STARTMENU_EXIT, STARTMENU_RETIRE, STARTMENU_PLAYER2, MAX_STARTMENU_ITEMS }; enum SaveCBReturn { SAVECB_RETURN_CONTINUE = 0, SAVECB_RETURN_OKAY, SAVECB_RETURN_CANCEL, SAVECB_RETURN_ERROR }; static EWRAM_DATA bool8 (*sStartMenuCallback)(void) = NULL; static EWRAM_DATA u8 sStartMenuCursorPos = 0; static EWRAM_DATA u8 sNumStartMenuItems = 0; static EWRAM_DATA u8 sStartMenuOrder[MAX_STARTMENU_ITEMS] = {}; static EWRAM_DATA s8 sDrawStartMenuState[2] = {}; static EWRAM_DATA u8 sSafariZoneStatsWindowId = 0; static ALIGNED(4) EWRAM_DATA u8 sSaveStatsWindowId = 0; static u8 (*sSaveDialogCB)(void); static u8 sSaveDialogDelay; static bool8 sSaveDialogIsPrinting; static void SetUpStartMenu_Link(void); static void SetUpStartMenu_UnionRoom(void); static void SetUpStartMenu_SafariZone(void); static void SetUpStartMenu_NormalField(void); static bool8 StartCB_HandleInput(void); static void StartMenu_FadeScreenIfLeavingOverworld(void); static bool8 StartMenuPokedexSanityCheck(void); static bool8 StartMenuPokedexCallback(void); static bool8 StartMenuPokemonCallback(void); static bool8 StartMenuBagCallback(void); static bool8 StartMenuPlayerCallback(void); static bool8 StartMenuSaveCallback(void); static bool8 StartMenuOptionCallback(void); static bool8 StartMenuExitCallback(void); static bool8 StartMenuSafariZoneRetireCallback(void); static bool8 StartMenuLinkPlayerCallback(void); static bool8 StartCB_Save1(void); static bool8 StartCB_Save2(void); static void StartMenu_PrepareForSave(void); static u8 RunSaveDialogCB(void); static void task50_save_game(u8 taskId); static u8 SaveDialogCB_PrintAskSaveText(void); static u8 SaveDialogCB_AskSavePrintYesNoMenu(void); static u8 SaveDialogCB_AskSaveHandleInput(void); static u8 SaveDialogCB_PrintAskOverwriteText(void); static u8 SaveDialogCB_AskOverwritePrintYesNoMenu(void); static u8 SaveDialogCB_AskReplacePreviousFilePrintYesNoMenu(void); static u8 SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput(void); static u8 SaveDialogCB_PrintSavingDontTurnOffPower(void); static u8 SaveDialogCB_DoSave(void); static u8 SaveDialogCB_PrintSaveResult(void); static u8 SaveDialogCB_WaitPrintSuccessAndPlaySE(void); static u8 SaveDialogCB_ReturnSuccess(void); static u8 SaveDialogCB_WaitPrintErrorAndPlaySE(void); static u8 SaveDialogCB_ReturnError(void); static void CB2_WhileSavingAfterLinkBattle(void); static void task50_after_link_battle_save(u8 taskId); static void PrintSaveStats(void); static void CloseSaveStatsWindow(void); static void CloseStartMenu(void); static const struct MenuAction sStartMenuActionTable[] = { { gText_MenuPokedex, {.u8_void = StartMenuPokedexCallback} }, { gText_MenuPokemon, {.u8_void = StartMenuPokemonCallback} }, { gText_MenuBag, {.u8_void = StartMenuBagCallback} }, { gText_MenuPlayer, {.u8_void = StartMenuPlayerCallback} }, { gText_MenuSave, {.u8_void = StartMenuSaveCallback} }, { gText_MenuOption, {.u8_void = StartMenuOptionCallback} }, { gText_MenuExit, {.u8_void = StartMenuExitCallback} }, { gText_MenuRetire, {.u8_void = StartMenuSafariZoneRetireCallback} }, { gText_MenuPlayer, {.u8_void = StartMenuLinkPlayerCallback} } }; static const struct WindowTemplate sSafariZoneStatsWindowTemplate = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 10, .height = 4, .paletteNum = 15, .baseBlock = 0x008 }; static const u8 *const sStartMenuDescPointers[] = { gStartMenuDesc_Pokedex, gStartMenuDesc_Pokemon, gStartMenuDesc_Bag, gStartMenuDesc_Player, gStartMenuDesc_Save, gStartMenuDesc_Option, gStartMenuDesc_Exit, gStartMenuDesc_Retire, gStartMenuDesc_Player }; static const struct BgTemplate sBGTemplates_AfterLinkSaveMessage[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 } }; static const struct WindowTemplate sWindowTemplates_AfterLinkSaveMessage[] = { { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 15, .baseBlock = 0x198 }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sSaveStatsWindowTemplate = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 14, .height = 9, .paletteNum = 13, .baseBlock = 0x008 }; static ALIGNED(2) const u8 sTextColor_StatName[] = { 1, 2, 3 }; static ALIGNED(2) const u8 sTextColor_StatValue[] = { 1, 4, 5 }; static ALIGNED(2) const u8 sTextColor_LocationHeader[] = { 1, 6, 7 }; // Unused static void SetHasPokedexAndPokemon(void) { FlagSet(FLAG_SYS_POKEDEX_GET); FlagSet(FLAG_SYS_POKEMON_GET); } static void SetUpStartMenu(void) { sNumStartMenuItems = 0; if (IsUpdateLinkStateCBActive() == TRUE) SetUpStartMenu_Link(); else if (InUnionRoom() == TRUE) SetUpStartMenu_UnionRoom(); else if (GetSafariZoneFlag() == TRUE) SetUpStartMenu_SafariZone(); else SetUpStartMenu_NormalField(); } static void AppendToStartMenuItems(u8 newEntry) { AppendToList(sStartMenuOrder, &sNumStartMenuItems, newEntry); } static void SetUpStartMenu_NormalField(void) { if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) AppendToStartMenuItems(STARTMENU_POKEDEX); if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE) AppendToStartMenuItems(STARTMENU_POKEMON); AppendToStartMenuItems(STARTMENU_BAG); AppendToStartMenuItems(STARTMENU_PLAYER); AppendToStartMenuItems(STARTMENU_SAVE); AppendToStartMenuItems(STARTMENU_OPTION); AppendToStartMenuItems(STARTMENU_EXIT); } static void SetUpStartMenu_SafariZone(void) { AppendToStartMenuItems(STARTMENU_RETIRE); AppendToStartMenuItems(STARTMENU_POKEDEX); AppendToStartMenuItems(STARTMENU_POKEMON); AppendToStartMenuItems(STARTMENU_BAG); AppendToStartMenuItems(STARTMENU_PLAYER); AppendToStartMenuItems(STARTMENU_OPTION); AppendToStartMenuItems(STARTMENU_EXIT); } static void SetUpStartMenu_Link(void) { AppendToStartMenuItems(STARTMENU_POKEMON); AppendToStartMenuItems(STARTMENU_BAG); AppendToStartMenuItems(STARTMENU_PLAYER2); AppendToStartMenuItems(STARTMENU_OPTION); AppendToStartMenuItems(STARTMENU_EXIT); } static void SetUpStartMenu_UnionRoom(void) { AppendToStartMenuItems(STARTMENU_POKEMON); AppendToStartMenuItems(STARTMENU_BAG); AppendToStartMenuItems(STARTMENU_PLAYER); AppendToStartMenuItems(STARTMENU_OPTION); AppendToStartMenuItems(STARTMENU_EXIT); } static void DrawSafariZoneStatsWindow(void) { sSafariZoneStatsWindowId = AddWindow(&sSafariZoneStatsWindowTemplate); PutWindowTilemap(sSafariZoneStatsWindowId); DrawStdWindowFrame(sSafariZoneStatsWindowId, FALSE); ConvertIntToDecimalStringN(gStringVar1, gSafariZoneStepCounter, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(gStringVar2, 600, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(gStringVar3, gNumSafariBalls, STR_CONV_MODE_RIGHT_ALIGN, 2); StringExpandPlaceholders(gStringVar4, gText_MenuSafariStats); AddTextPrinterParameterized(sSafariZoneStatsWindowId, FONT_NORMAL, gStringVar4, 4, 3, 0xFF, NULL); CopyWindowToVram(sSafariZoneStatsWindowId, COPYWIN_GFX); } static void DestroySafariZoneStatsWindow(void) { if (GetSafariZoneFlag()) { ClearStdWindowAndFrameToTransparent(sSafariZoneStatsWindowId, FALSE); CopyWindowToVram(sSafariZoneStatsWindowId, COPYWIN_GFX); RemoveWindow(sSafariZoneStatsWindowId); } } static s8 PrintStartMenuItems(s8 *cursor_p, u8 nitems) { s16 i = *cursor_p; do { if (sStartMenuOrder[i] == STARTMENU_PLAYER || sStartMenuOrder[i] == STARTMENU_PLAYER2) { Menu_PrintFormatIntlPlayerName(GetStartMenuWindowId(), sStartMenuActionTable[sStartMenuOrder[i]].text, 8, i * 15); } else { StringExpandPlaceholders(gStringVar4, sStartMenuActionTable[sStartMenuOrder[i]].text); AddTextPrinterParameterized(GetStartMenuWindowId(), FONT_NORMAL, gStringVar4, 8, i * 15, 0xFF, NULL); } i++; if (i >= sNumStartMenuItems) { *cursor_p = i; return TRUE; } } while (--nitems); *cursor_p = i; return FALSE; } static s8 DoDrawStartMenu(void) { switch (sDrawStartMenuState[0]) { case 0: sDrawStartMenuState[0]++; break; case 1: SetUpStartMenu(); sDrawStartMenuState[0]++; break; case 2: LoadStdWindowFrameGfx(); DrawStdWindowFrame(CreateStartMenuWindow(sNumStartMenuItems), FALSE); sDrawStartMenuState[0]++; break; case 3: if (GetSafariZoneFlag()) DrawSafariZoneStatsWindow(); sDrawStartMenuState[0]++; break; case 4: if (PrintStartMenuItems(&sDrawStartMenuState[1], 2) == TRUE) sDrawStartMenuState[0]++; break; case 5: sStartMenuCursorPos = Menu_InitCursor(GetStartMenuWindowId(), FONT_NORMAL, 0, 0, 15, sNumStartMenuItems, sStartMenuCursorPos); if (!MenuHelpers_IsLinkActive() && InUnionRoom() != TRUE && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_HELP) { DrawHelpMessageWindowWithText(sStartMenuDescPointers[sStartMenuOrder[sStartMenuCursorPos]]); } CopyWindowToVram(GetStartMenuWindowId(), COPYWIN_MAP); return TRUE; } return FALSE; } static void DrawStartMenuInOneGo(void) { sDrawStartMenuState[0] = 0; sDrawStartMenuState[1] = 0; while (!DoDrawStartMenu()) ; } static void task50_startmenu(u8 taskId) { if (DoDrawStartMenu() == TRUE) SwitchTaskToFollowupFunc(taskId); } static void OpenStartMenuWithFollowupFunc(TaskFunc func) { u8 taskId; sDrawStartMenuState[0] = 0; sDrawStartMenuState[1] = 0; taskId = CreateTask(task50_startmenu, 80); SetTaskFuncWithFollowupFunc(taskId, task50_startmenu, func); } static bool8 FieldCB2_DrawStartMenu(void) { if (!DoDrawStartMenu()) return FALSE; FadeTransition_FadeInOnReturnToStartMenu(); return TRUE; } void SetUpReturnToStartMenu(void) { sDrawStartMenuState[0] = 0; sDrawStartMenuState[1] = 0; gFieldCallback2 = FieldCB2_DrawStartMenu; } void Task_StartMenuHandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; switch (data[0]) { case 0: if (InUnionRoom() == TRUE) SetUsingUnionRoomStartMenu(); sStartMenuCallback = StartCB_HandleInput; data[0]++; break; case 1: if (sStartMenuCallback() == TRUE) DestroyTask(taskId); break; } } void ShowStartMenu(void) { if (!IsUpdateLinkStateCBActive()) { FreezeObjectEvents(); HandleEnforcedLookDirectionOnPlayerStopMoving(); StopPlayerAvatar(); } OpenStartMenuWithFollowupFunc(Task_StartMenuHandleInput); LockPlayerFieldControls(); } static bool8 StartCB_HandleInput(void) { if (JOY_NEW(DPAD_UP)) { PlaySE(SE_SELECT); sStartMenuCursorPos = Menu_MoveCursor(-1); if (!MenuHelpers_IsLinkActive() && InUnionRoom() != TRUE && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_HELP) { PrintTextOnHelpMessageWindow(sStartMenuDescPointers[sStartMenuOrder[sStartMenuCursorPos]], 2); } } if (JOY_NEW(DPAD_DOWN)) { PlaySE(SE_SELECT); sStartMenuCursorPos = Menu_MoveCursor(+1); if (!MenuHelpers_IsLinkActive() && InUnionRoom() != TRUE && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_HELP) { PrintTextOnHelpMessageWindow(sStartMenuDescPointers[sStartMenuOrder[sStartMenuCursorPos]], 2); } } if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); if (!StartMenuPokedexSanityCheck()) return FALSE; sStartMenuCallback = sStartMenuActionTable[sStartMenuOrder[sStartMenuCursorPos]].func.u8_void; StartMenu_FadeScreenIfLeavingOverworld(); return FALSE; } if (JOY_NEW(B_BUTTON | START_BUTTON)) { DestroySafariZoneStatsWindow(); DestroyHelpMessageWindow_(); CloseStartMenu(); return TRUE; } return FALSE; } static void StartMenu_FadeScreenIfLeavingOverworld(void) { if (sStartMenuCallback != StartMenuSaveCallback && sStartMenuCallback != StartMenuExitCallback && sStartMenuCallback != StartMenuSafariZoneRetireCallback) { StopPokemonLeagueLightingEffectTask(); FadeScreen(FADE_TO_BLACK, 0); } } static bool8 StartMenuPokedexSanityCheck(void) { if (sStartMenuActionTable[sStartMenuOrder[sStartMenuCursorPos]].func.u8_void == StartMenuPokedexCallback && GetNationalPokedexCount(0) == 0) return FALSE; return TRUE; } static bool8 StartMenuPokedexCallback(void) { if (!gPaletteFade.active) { IncrementGameStat(GAME_STAT_CHECKED_POKEDEX); PlayRainStoppingSoundEffect(); DestroySafariZoneStatsWindow(); CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_OpenPokedexFromStartMenu); return TRUE; } return FALSE; } static bool8 StartMenuPokemonCallback(void) { if (!gPaletteFade.active) { PlayRainStoppingSoundEffect(); DestroySafariZoneStatsWindow(); CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_PartyMenuFromStartMenu); return TRUE; } return FALSE; } static bool8 StartMenuBagCallback(void) { if (!gPaletteFade.active) { PlayRainStoppingSoundEffect(); DestroySafariZoneStatsWindow(); CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_BagMenuFromStartMenu); return TRUE; } return FALSE; } static bool8 StartMenuPlayerCallback(void) { if (!gPaletteFade.active) { PlayRainStoppingSoundEffect(); DestroySafariZoneStatsWindow(); CleanupOverworldWindowsAndTilemaps(); ShowPlayerTrainerCard(CB2_ReturnToFieldWithOpenMenu); return TRUE; } return FALSE; } static bool8 StartMenuSaveCallback(void) { sStartMenuCallback = StartCB_Save1; return FALSE; } static bool8 StartMenuOptionCallback(void) { if (!gPaletteFade.active) { PlayRainStoppingSoundEffect(); DestroySafariZoneStatsWindow(); CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_OptionsMenuFromStartMenu); gMain.savedCallback = CB2_ReturnToFieldWithOpenMenu; return TRUE; } return FALSE; } static bool8 StartMenuExitCallback(void) { DestroySafariZoneStatsWindow(); DestroyHelpMessageWindow_(); CloseStartMenu(); return TRUE; } static bool8 StartMenuSafariZoneRetireCallback(void) { DestroySafariZoneStatsWindow(); DestroyHelpMessageWindow_(); CloseStartMenu(); SafariZoneRetirePrompt(); return TRUE; } static bool8 StartMenuLinkPlayerCallback(void) { if (!gPaletteFade.active) { PlayRainStoppingSoundEffect(); CleanupOverworldWindowsAndTilemaps(); ShowTrainerCardInLink(gLocalLinkPlayerId, CB2_ReturnToFieldWithOpenMenu); return TRUE; } return FALSE; } static bool8 StartCB_Save1(void) { BackupHelpContext(); SetHelpContext(HELPCONTEXT_SAVE); StartMenu_PrepareForSave(); sStartMenuCallback = StartCB_Save2; return FALSE; } static bool8 StartCB_Save2(void) { switch (RunSaveDialogCB()) { case SAVECB_RETURN_CONTINUE: break; case SAVECB_RETURN_OKAY: ClearDialogWindowAndFrameToTransparent(0, TRUE); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); RestoreHelpContext(); return TRUE; case SAVECB_RETURN_CANCEL: ClearDialogWindowAndFrameToTransparent(0, FALSE); DrawStartMenuInOneGo(); RestoreHelpContext(); sStartMenuCallback = StartCB_HandleInput; break; case SAVECB_RETURN_ERROR: ClearDialogWindowAndFrameToTransparent(0, TRUE); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); RestoreHelpContext(); return TRUE; } return FALSE; } static void StartMenu_PrepareForSave(void) { SaveMapView(); sSaveDialogCB = SaveDialogCB_PrintAskSaveText; sSaveDialogIsPrinting = FALSE; } static u8 RunSaveDialogCB(void) { if (RunTextPrinters_CheckPrinter0Active() == TRUE) return 0; sSaveDialogIsPrinting = FALSE; return sSaveDialogCB(); } void Field_AskSaveTheGame(void) { BackupHelpContext(); SetHelpContext(HELPCONTEXT_SAVE); StartMenu_PrepareForSave(); CreateTask(task50_save_game, 80); } static void PrintSaveTextWithFollowupFunc(const u8 *str, bool8 (*saveDialogCB)(void)) { StringExpandPlaceholders(gStringVar4, str); LoadMessageBoxAndFrameGfx(0, TRUE); AddTextPrinterForMessage(TRUE); sSaveDialogIsPrinting = TRUE; sSaveDialogCB = saveDialogCB; } static void task50_save_game(u8 taskId) { switch (RunSaveDialogCB()) { case 0: return; case 2: case 3: gSpecialVar_Result = FALSE; break; case 1: gSpecialVar_Result = TRUE; break; } DestroyTask(taskId); ScriptContext_Enable(); RestoreHelpContext(); } static void CloseSaveMessageWindow(void) { ClearDialogWindowAndFrame(0, TRUE); } static void CloseSaveStatsWindow_(void) { CloseSaveStatsWindow(); } static void SetSaveDialogDelayTo60Frames(void) { sSaveDialogDelay = 60; } static bool8 SaveDialog_Wait60FramesOrAButtonHeld(void) { sSaveDialogDelay--; if (JOY_HELD(A_BUTTON)) { PlaySE(SE_SELECT); return TRUE; } else if (sSaveDialogDelay == 0) { return TRUE; } else { return FALSE; } } static bool8 SaveDialog_Wait60FramesThenCheckAButtonHeld(void) { if (sSaveDialogDelay == 0) { if (JOY_HELD(A_BUTTON)) { return TRUE; } else { return FALSE; } } else { sSaveDialogDelay--; return FALSE; } } static u8 SaveDialogCB_PrintAskSaveText(void) { ClearStdWindowAndFrame(GetStartMenuWindowId(), FALSE); RemoveStartMenuWindow(); DestroyHelpMessageWindow(0); PrintSaveStats(); PrintSaveTextWithFollowupFunc(gText_WouldYouLikeToSaveTheGame, SaveDialogCB_AskSavePrintYesNoMenu); return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_AskSavePrintYesNoMenu(void) { DisplayYesNoMenuDefaultYes(); sSaveDialogCB = SaveDialogCB_AskSaveHandleInput; return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_AskSaveHandleInput(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: if ((gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID) || !gDifferentSaveFile) sSaveDialogCB = SaveDialogCB_PrintAskOverwriteText; else sSaveDialogCB = SaveDialogCB_PrintSavingDontTurnOffPower; break; case 1: case -1: CloseSaveStatsWindow_(); CloseSaveMessageWindow(); return SAVECB_RETURN_CANCEL; } return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_PrintAskOverwriteText(void) { if (gDifferentSaveFile == TRUE) PrintSaveTextWithFollowupFunc(gText_DifferentGameFile, SaveDialogCB_AskReplacePreviousFilePrintYesNoMenu); else PrintSaveTextWithFollowupFunc(gText_AlreadySaveFile_WouldLikeToOverwrite, SaveDialogCB_AskOverwritePrintYesNoMenu); return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_AskOverwritePrintYesNoMenu(void) { DisplayYesNoMenuDefaultYes(); sSaveDialogCB = SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput; return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_AskReplacePreviousFilePrintYesNoMenu(void) { DisplayYesNoMenuDefaultNo(); sSaveDialogCB = SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput; return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: sSaveDialogCB = SaveDialogCB_PrintSavingDontTurnOffPower; break; case 1: case -1: CloseSaveStatsWindow_(); CloseSaveMessageWindow(); return SAVECB_RETURN_CANCEL; } return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_PrintSavingDontTurnOffPower(void) { SaveQuestLogData(); PrintSaveTextWithFollowupFunc(gText_SavingDontTurnOffThePower, SaveDialogCB_DoSave); return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_DoSave(void) { IncrementGameStat(GAME_STAT_SAVED_GAME); if (gDifferentSaveFile == TRUE) { TrySavingData(SAVE_OVERWRITE_DIFFERENT_FILE); gDifferentSaveFile = FALSE; } else { TrySavingData(SAVE_NORMAL); } sSaveDialogCB = SaveDialogCB_PrintSaveResult; return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_PrintSaveResult(void) { if (gSaveAttemptStatus == SAVE_STATUS_OK) PrintSaveTextWithFollowupFunc(gText_PlayerSavedTheGame, SaveDialogCB_WaitPrintSuccessAndPlaySE); else PrintSaveTextWithFollowupFunc(gText_SaveError_PleaseExchangeBackupMemory, SaveDialogCB_WaitPrintErrorAndPlaySE); SetSaveDialogDelayTo60Frames(); return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_WaitPrintSuccessAndPlaySE(void) { if (!RunTextPrinters_CheckPrinter0Active()) { PlaySE(SE_SAVE); sSaveDialogCB = SaveDialogCB_ReturnSuccess; } return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_ReturnSuccess(void) { if (!IsSEPlaying() && SaveDialog_Wait60FramesOrAButtonHeld()) { CloseSaveStatsWindow_(); return SAVECB_RETURN_OKAY; } return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_WaitPrintErrorAndPlaySE(void) { if (!RunTextPrinters_CheckPrinter0Active()) { PlaySE(SE_BOO); sSaveDialogCB = SaveDialogCB_ReturnError; } return SAVECB_RETURN_CONTINUE; } static u8 SaveDialogCB_ReturnError(void) { if (!SaveDialog_Wait60FramesThenCheckAButtonHeld()) return SAVECB_RETURN_CONTINUE; CloseSaveStatsWindow_(); return SAVECB_RETURN_ERROR; } static void VBlankCB_WhileSavingAfterLinkBattle(void) { TransferPlttBuffer(); } bool32 DoSetUpSaveAfterLinkBattle(u8 *state) { switch (*state) { case 0: SetGpuReg(REG_OFFSET_DISPCNT, 0); SetVBlankCallback(NULL); ScanlineEffect_Stop(); DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE); DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); break; case 1: ResetSpriteData(); ResetTasks(); ResetPaletteFade(); ScanlineEffect_Clear(); break; case 2: ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBGTemplates_AfterLinkSaveMessage, NELEMS(sBGTemplates_AfterLinkSaveMessage)); InitWindows(sWindowTemplates_AfterLinkSaveMessage); LoadStdWindowGfx(0, 0x008, BG_PLTT_ID(15)); break; case 3: ShowBg(0); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); SetVBlankCallback(VBlankCB_WhileSavingAfterLinkBattle); EnableInterrupts(INTR_FLAG_VBLANK); break; case 4: return TRUE; } (*state)++; return FALSE; } void CB2_SetUpSaveAfterLinkBattle(void) { if (DoSetUpSaveAfterLinkBattle(&gMain.state)) { CreateTask(task50_after_link_battle_save, 80); SetMainCallback2(CB2_WhileSavingAfterLinkBattle); } } static void CB2_WhileSavingAfterLinkBattle(void) { RunTasks(); UpdatePaletteFade(); } static void task50_after_link_battle_save(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { switch (data[0]) { case 0: FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, FONT_NORMAL, gText_SavingDontTurnOffThePower2, 0xFF, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); DrawTextBorderOuter(0, 0x008, 15); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); if (gWirelessCommType != 0 && InUnionRoom()) data[0] = 5; else data[0] = 1; break; case 1: SetContinueGameWarpStatusToDynamicWarp(); WriteSaveBlock2(); data[0] = 2; break; case 2: if (WriteSaveBlock1Sector()) { ClearContinueGameWarpStatus2(); data[0] = 3; } break; case 3: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); data[0] = 4; break; case 4: FreeAllWindowBuffers(); SetMainCallback2(gMain.savedCallback); DestroyTask(taskId); break; case 5: CreateTask(Task_LinkFullSave, 5); data[0] = 6; break; case 6: if (!FuncIsActiveTask(Task_LinkFullSave)) data[0] = 3; break; } } } static void PrintSaveStats(void) { u8 y; u8 x; sSaveStatsWindowId = AddWindow(&sSaveStatsWindowTemplate); LoadStdWindowGfx(sSaveStatsWindowId, 0x21D, BG_PLTT_ID(13)); DrawStdFrameWithCustomTileAndPalette(sSaveStatsWindowId, FALSE, 0x21D, 13); SaveStatToString(SAVE_STAT_LOCATION, gStringVar4, 8); x = (u32)(112 - GetStringWidth(FONT_NORMAL, gStringVar4, -1)) / 2; AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_NORMAL, x, 0, sTextColor_LocationHeader, -1, gStringVar4); x = (u32)(112 - GetStringWidth(FONT_NORMAL, gStringVar4, -1)) / 2; AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 2, 14, sTextColor_StatName, -1, gSaveStatName_Player); SaveStatToString(SAVE_STAT_NAME, gStringVar4, 2); Menu_PrintFormatIntlPlayerName(sSaveStatsWindowId, gStringVar4, 60, 14); AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 2, 28, sTextColor_StatName, -1, gSaveStatName_Badges); SaveStatToString(SAVE_STAT_BADGES, gStringVar4, 2); AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 60, 28, sTextColor_StatValue, -1, gStringVar4); y = 42; if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) { AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 2, 42, sTextColor_StatName, -1, gSaveStatName_Pokedex); SaveStatToString(SAVE_STAT_POKEDEX, gStringVar4, 2); AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 60, 42, sTextColor_StatValue, -1, gStringVar4); y = 56; } AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 2, y, sTextColor_StatName, -1, gSaveStatName_Time); SaveStatToString(SAVE_STAT_TIME, gStringVar4, 2); AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 60, y, sTextColor_StatValue, -1, gStringVar4); CopyWindowToVram(sSaveStatsWindowId, COPYWIN_GFX); } static void CloseSaveStatsWindow(void) { ClearStdWindowAndFrame(sSaveStatsWindowId, FALSE); RemoveWindow(sSaveStatsWindowId); } static void CloseStartMenu(void) { PlaySE(SE_SELECT); ClearStdWindowAndFrame(GetStartMenuWindowId(), TRUE); RemoveStartMenuWindow(); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); } void AppendToList(u8 *list, u8 *cursor, u8 newEntry) { list[*cursor] = newEntry; (*cursor)++; } ================================================ FILE: src/string_util.c ================================================ #include "global.h" #include "gflib.h" EWRAM_DATA u8 gStringVar1[32] = {}; EWRAM_DATA u8 gStringVar2[20] = {}; EWRAM_DATA u8 gStringVar3[20] = {}; EWRAM_DATA u8 gStringVar4[1000] = {}; EWRAM_DATA u8 gUnknownStringVar[16] = {0}; static const u8 sDigits[] = __("0123456789ABCDEF"); static const s32 sPowersOfTen[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, }; extern u8 gExpandedPlaceholder_Empty[]; extern u8 gExpandedPlaceholder_Kun[]; extern u8 gExpandedPlaceholder_Chan[]; extern u8 gExpandedPlaceholder_Sapphire[]; extern u8 gExpandedPlaceholder_Ruby[]; extern u8 gExpandedPlaceholder_Aqua[]; extern u8 gExpandedPlaceholder_Magma[]; extern u8 gExpandedPlaceholder_Archie[]; extern u8 gExpandedPlaceholder_Maxie[]; extern u8 gExpandedPlaceholder_Kyogre[]; extern u8 gExpandedPlaceholder_Groudon[]; extern u8 gExpandedPlaceholder_Red[]; extern u8 gExpandedPlaceholder_Green[]; u8 *StringCopy_Nickname(u8 *dest, const u8 *src) { u32 i; u32 limit = POKEMON_NAME_LENGTH; for (i = 0; i < limit; i++) { dest[i] = src[i]; if (dest[i] == EOS) return &dest[i]; } dest[i] = EOS; return &dest[i]; } u8 *StringGet_Nickname(u8 *str) { u32 i; u32 limit = POKEMON_NAME_LENGTH; for (i = 0; i < limit; i++) if (str[i] == EOS) return &str[i]; str[i] = EOS; return &str[i]; } u8 *StringCopy_PlayerName(u8 *dest, const u8 *src) { s32 i; s32 limit = PLAYER_NAME_LENGTH; for (i = 0; i < limit; i++) { dest[i] = src[i]; if (dest[i] == EOS) return &dest[i]; } dest[i] = EOS; return &dest[i]; } u8 *StringCopy(u8 *dest, const u8 *src) { while (*src != EOS) { *dest = *src; dest++; src++; } *dest = EOS; return dest; } u8 *StringAppend(u8 *dest, const u8 *src) { while (*dest != EOS) dest++; return StringCopy(dest, src); } u8 *StringCopyN(u8 *dest, const u8 *src, u8 n) { u32 i; for (i = 0; i < n; i++) dest[i] = src[i]; return &dest[n]; } u8 *StringAppendN(u8 *dest, const u8 *src, u8 n) { while (*dest != EOS) dest++; return StringCopyN(dest, src, n); } u16 StringLength(const u8 *str) { u16 length = 0; while (str[length] != EOS) length++; return length; } s32 StringCompare(const u8 *str1, const u8 *str2) { while (*str1 == *str2) { if (*str1 == EOS) return 0; str1++; str2++; } return *str1 - *str2; } s32 StringCompareN(const u8 *str1, const u8 *str2, u32 n) { while (*str1 == *str2) { if (*str1 == EOS) return 0; str1++; str2++; if (--n == 0) return 0; } return *str1 - *str2; } u8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) { enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; s32 powerOfTen; s32 largestPowerOfTen = sPowersOfTen[n - 1]; state = WAITING_FOR_NONZERO_DIGIT; if (mode == STR_CONV_MODE_RIGHT_ALIGN) state = WRITING_SPACES; if (mode == STR_CONV_MODE_LEADING_ZEROS) state = WRITING_DIGITS; for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) { u8 *out; u8 c; u16 digit = value / powerOfTen; s32 temp = value - (powerOfTen * digit); if (state == WRITING_DIGITS) { out = dest++; if (digit <= 9) c = sDigits[digit]; else c = CHAR_QUESTION_MARK; *out = c; } else if (digit != 0 || powerOfTen == 1) { state = WRITING_DIGITS; out = dest++; if (digit <= 9) c = sDigits[digit]; else c = CHAR_QUESTION_MARK; *out = c; } else if (state == WRITING_SPACES) { *dest++ = CHAR_SPACE; } value = temp; } *dest = EOS; return dest; } u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) { enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; u32 i; s32 powerOfSixteen; s32 largestPowerOfSixteen = 1; for (i = 1; i < n; i++) largestPowerOfSixteen *= 16; state = WAITING_FOR_NONZERO_DIGIT; if (mode == STR_CONV_MODE_RIGHT_ALIGN) state = WRITING_SPACES; if (mode == STR_CONV_MODE_LEADING_ZEROS) state = WRITING_DIGITS; for (powerOfSixteen = largestPowerOfSixteen; powerOfSixteen > 0; powerOfSixteen /= 16) { u8 *out; u8 c; u32 digit = value / powerOfSixteen; s32 temp = value % powerOfSixteen; if (state == WRITING_DIGITS) { out = dest++; if (digit <= 0xF) c = sDigits[digit]; else c = CHAR_QUESTION_MARK; *out = c; } else if (digit != 0 || powerOfSixteen == 1) { state = WRITING_DIGITS; out = dest++; if (digit <= 0xF) c = sDigits[digit]; else c = CHAR_QUESTION_MARK; *out = c; } else if (state == WRITING_SPACES) { *dest++ = CHAR_SPACE; } value = temp; } *dest = EOS; return dest; } u8 *StringExpandPlaceholders(u8 *dest, const u8 *src) { for (;;) { u8 c = *src++; u8 placeholderId; u8 *expandedString; switch (c) { case PLACEHOLDER_BEGIN: placeholderId = *src++; expandedString = GetExpandedPlaceholder(placeholderId); dest = StringExpandPlaceholders(dest, expandedString); break; case EXT_CTRL_CODE_BEGIN: *dest++ = c; c = *src++; *dest++ = c; switch (c) { case 0x07: case 0x09: case 0x0F: case 0x15: case 0x16: case 0x17: case 0x18: break; case 0x04: *dest++ = *src++; case 0x0B: *dest++ = *src++; default: *dest++ = *src++; } break; case EOS: *dest = EOS; return dest; case 0xFA: case 0xFB: case 0xFE: default: *dest++ = c; } } } u8 *StringBraille(u8 *dest, const u8 *src) { u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF }; u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF }; dest = StringCopy(dest, setBrailleFont); for (;;) { u8 c = *src++; switch (c) { case EOS: *dest = c; return dest; case 0xFE: dest = StringCopy(dest, gotoLine2); break; default: *dest++ = c; *dest++ = c + 0x40; break; } } } static u8 *ExpandPlaceholder_UnknownStringVar(void) { return gUnknownStringVar; } static u8 *ExpandPlaceholder_PlayerName(void) { return gSaveBlock2Ptr->playerName; } static u8 *ExpandPlaceholder_StringVar1(void) { return gStringVar1; } static u8 *ExpandPlaceholder_StringVar2(void) { return gStringVar2; } static u8 *ExpandPlaceholder_StringVar3(void) { return gStringVar3; } static u8 *ExpandPlaceholder_KunChan(void) { if (gSaveBlock2Ptr->playerGender == MALE) return gExpandedPlaceholder_Kun; else return gExpandedPlaceholder_Chan; } static u8 *ExpandPlaceholder_RivalName(void) { if (gSaveBlock1Ptr->rivalName[0] == EOS) { if (gSaveBlock2Ptr->playerGender == MALE) return gExpandedPlaceholder_Green; else return gExpandedPlaceholder_Red; } else { return gSaveBlock1Ptr->rivalName; } } static u8 *ExpandPlaceholder_Version(void) { return gExpandedPlaceholder_Ruby; } static u8 *ExpandPlaceholder_Magma(void) { return gExpandedPlaceholder_Magma; } static u8 *ExpandPlaceholder_Aqua(void) { return gExpandedPlaceholder_Aqua; } static u8 *ExpandPlaceholder_Maxie(void) { return gExpandedPlaceholder_Maxie; } static u8 *ExpandPlaceholder_Archie(void) { return gExpandedPlaceholder_Archie; } static u8 *ExpandPlaceholder_Groudon(void) { return gExpandedPlaceholder_Groudon; } static u8 *ExpandPlaceholder_Kyogre(void) { return gExpandedPlaceholder_Kyogre; } u8 *GetExpandedPlaceholder(u32 id) { typedef u8 *(*ExpandPlaceholderFunc)(void); static const ExpandPlaceholderFunc funcs[] = { [PLACEHOLDER_ID_UNKNOWN] = ExpandPlaceholder_UnknownStringVar, [PLACEHOLDER_ID_PLAYER] = ExpandPlaceholder_PlayerName, [PLACEHOLDER_ID_STRING_VAR_1] = ExpandPlaceholder_StringVar1, [PLACEHOLDER_ID_STRING_VAR_2] = ExpandPlaceholder_StringVar2, [PLACEHOLDER_ID_STRING_VAR_3] = ExpandPlaceholder_StringVar3, [PLACEHOLDER_ID_KUN] = ExpandPlaceholder_KunChan, [PLACEHOLDER_ID_RIVAL] = ExpandPlaceholder_RivalName, [PLACEHOLDER_ID_VERSION] = ExpandPlaceholder_Version, [PLACEHOLDER_ID_MAGMA] = ExpandPlaceholder_Magma, [PLACEHOLDER_ID_AQUA] = ExpandPlaceholder_Aqua, [PLACEHOLDER_ID_MAXIE] = ExpandPlaceholder_Maxie, [PLACEHOLDER_ID_ARCHIE] = ExpandPlaceholder_Archie, [PLACEHOLDER_ID_GROUDON] = ExpandPlaceholder_Groudon, [PLACEHOLDER_ID_KYOGRE] = ExpandPlaceholder_Kyogre, }; if (id >= NELEMS(funcs)) return gExpandedPlaceholder_Empty; else return funcs[id](); } u8 *StringFill(u8 *dest, u8 c, u16 n) { u32 i; for (i = 0; i < n; i++) *dest++ = c; *dest = EOS; return dest; } u8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n) { while (*src != EOS) { *dest++ = *src++; if (n) n--; } n--; while (n != (u16)-1) { *dest++ = c; n--; } *dest = EOS; return dest; } u8 *StringFillWithTerminator(u8 *dest, u16 n) { return StringFill(dest, EOS, n); } u8 *StringCopyN_Multibyte(u8 *dest, const u8 *src, u32 n) { u32 i; for (i = n - 1; i != -1u; i--) { if (*src == EOS) { break; } else { *dest++ = *src++; if (*(src - 1) == 0xF9) *dest++ = *src++; } } *dest = EOS; return dest; } u32 StringLength_Multibyte(const u8 *str) { u32 length = 0; while (*str != EOS) { if (*str == 0xF9) str++; str++; length++; } return length; } u8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color) { *dest = 0xFC; dest++; switch (colorType) { case 0: *dest = 1; dest++; break; case 1: *dest = 3; dest++; break; case 2: *dest = 2; dest++; break; } *dest = color; dest++; *dest = EOS; return dest; } u8 GetExtCtrlCodeLength(u8 code) { static const u8 lengths[] = { 1, 2, 2, 2, 4, 2, 2, 1, 2, 1, 1, 3, 2, 2, 2, 1, 3, 2, 2, 2, 2, 1, 1, 1, 1, }; u8 length = 0; if (code < NELEMS(lengths)) length = lengths[code]; return length; } static const u8 *SkipExtCtrlCode(const u8 *s) { while (*s == 0xFC) { s++; s += GetExtCtrlCodeLength(*s); } return s; } s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2) { s32 retVal = 0; while (1) { str1 = SkipExtCtrlCode(str1); str2 = SkipExtCtrlCode(str2); if (*str1 > *str2) break; if (*str1 < *str2) { retVal = -1; if (*str2 == 0xFF) retVal = 1; } if (*str1 == 0xFF) return retVal; str1++; str2++; } retVal = 1; if (*str1 == 0xFF) retVal = -1; return retVal; } void ConvertInternationalString(u8 *s, u8 language) { if (language == LANGUAGE_JAPANESE) { u32 i; StripExtCtrlCodes(s); i = StringLength(s); s[i++] = 0xFC; s[i++] = 22; s[i++] = 0xFF; i--; while (i != (u32)-1) { s[i + 2] = s[i]; i--; } s[0] = 0xFC; s[1] = 21; } } void StripExtCtrlCodes(u8 *str) { u16 srcIndex = 0; u16 destIndex = 0; while (str[srcIndex] != 0xFF) { if (str[srcIndex] == 0xFC) { srcIndex++; srcIndex += GetExtCtrlCodeLength(str[srcIndex]); } else { str[destIndex++] = str[srcIndex++]; } } str[destIndex] = 0xFF; } ================================================ FILE: src/strings.c ================================================ #include "global.h" #include "strings.h" const u8 gExpandedPlaceholder_Empty[] = _(""); const u8 gExpandedPlaceholder_Kun[] = _(""); const u8 gExpandedPlaceholder_Chan[] = _(""); const u8 gExpandedPlaceholder_Sapphire[] = _("SAPPHIRE"); const u8 gExpandedPlaceholder_Ruby[] = _("RUBY"); const u8 gExpandedPlaceholder_Aqua[] = _("AQUA"); const u8 gExpandedPlaceholder_Magma[] = _("MAGMA"); const u8 gExpandedPlaceholder_Archie[] = _("ARCHIE"); const u8 gExpandedPlaceholder_Maxie[] = _("MAXIE"); const u8 gExpandedPlaceholder_Kyogre[] = _("KYOGRE"); const u8 gExpandedPlaceholder_Groudon[] = _("GROUDON"); const u8 gExpandedPlaceholder_Red[] = _("RED"); const u8 gExpandedPlaceholder_Green[] = _("GREEN"); const u8 gText_EggNickname[] = _("EGG"); const u8 gText_MenuPokemon[] = _("POKéMON"); const u8 gText_NewGame[] = _("NEW GAME"); const u8 gText_Continue[] = _("CONTINUE"); const u8 gUnusedText_MysteryGift[] = _("MYSTERY GIFT"); const u8 gText_MysteryGift[] = _("MYSTERY GIFT"); const u8 gText_WirelessNotConnected[] = _("The Wireless Adapter is not\nconnected."); const u8 gText_MysteryGiftCantUse[] = _("MYSTERY GIFT can't be used while\nthe Wireless Adapter is attached."); const u8 gText_SaveFileCorrupted[] = _("The save file is corrupted.\pThe previous save file will be\nloaded."); const u8 gText_SaveFileHasBeenDeleted[] = _("The save file has been\ndeleted..."); const u8 gText_1MSubCircuitBoardNotInstalled[] = _("The 1M sub-circuit board is\nnot installed."); const u8 gText_MainMenuTime[] = _("TIME"); const u8 gText_Controls[] = _("CONTROLS"); ALIGNED(4) const u8 gText_ABUTTONNext[] = _("{A_BUTTON}NEXT"); ALIGNED(4) const u8 gText_ABUTTONNext_BBUTTONBack[] = _("{A_BUTTON}NEXT {B_BUTTON}BACK"); ALIGNED(4) const u8 gText_UPDOWNPick_ABUTTONNext_BBUTTONBack[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}NEXT {B_BUTTON}CANCEL"); ALIGNED(4) const u8 gText_UPDOWNPick_ABUTTONBBUTTONCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}{B_BUTTON}CANCEL"); ALIGNED(4) const u8 gText_ABUTTONExit[] = _("{A_BUTTON}EXIT"); const u8 gText_Boy[] = _("BOY"); const u8 gText_Girl[] = _("GIRL"); const u8 gText_PokedexTableOfContents[] = _("POKéDEX TABLE OF CONTENTS"); const u8 gText_PickOK[] = _("{SELECT_BUTTON}LAST VIEWED {DPAD_UPDOWN}PICK {A_BUTTON}OK"); const u8 gText_Seen[] = _("Seen:"); const u8 gText_Owned[] = _("Owned:"); const u8 gText_Kanto[] = _("KANTO"); const u8 gText_National[] = _("NATIONAL"); const u8 gText_PokemonHabitats[] = _("{COLOR DYNAMIC_COLOR6}{SHADOW DYNAMIC_COLOR5}POKéMON HABITATS"); const u8 gText_DexCategory_GrasslandPkmn[] = _("Grassland POKéMON"); const u8 gText_DexCategory_ForestPkmn[] = _("Forest POKéMON"); const u8 gText_DexCategory_WatersEdgePkmn[] = _("Water's-edge POKéMON"); const u8 gText_DexCategory_SeaPkmn[] = _("Sea POKéMON"); const u8 gText_DexCategory_CavePkmn[] = _("Cave POKéMON"); const u8 gText_DexCategory_MountainPkmn[] = _("Mountain POKéMON"); const u8 gText_DexCategory_RoughTerrainPkmn[] = _("Rough-terrain POKéMON"); const u8 gText_DexCategory_UrbanPkmn[] = _("Urban POKéMON"); const u8 gText_DexCategory_RarePkmn[] = _("Rare POKéMON"); const u8 gText_Search[] = _("{COLOR DYNAMIC_COLOR6}{SHADOW DYNAMIC_COLOR5}SEARCH"); const u8 gText_NumericalMode[] = _("NUMERICAL MODE"); const u8 gText_AToZMode[] = _("A TO Z MODE"); const u8 gText_PokedexOther[] = _("{COLOR DYNAMIC_COLOR6}{SHADOW DYNAMIC_COLOR5}OTHER"); const u8 gText_ClosePokedex[] = _("CLOSE POKéDEX"); const u8 gText_TypeMode[] = _("TYPE MODE"); const u8 gText_LightestMode[] = _("LIGHTEST MODE"); const u8 gText_SmallestMode[] = _("SMALLEST MODE"); const u8 gText_PokemonList[] = _("{COLOR DYNAMIC_COLOR6}{SHADOW DYNAMIC_COLOR5}POKéMON LIST"); const u8 gText_NumericalModeKanto[] = _("NUMERICAL MODE: KANTO"); const u8 gText_NumericalModeNational[] = _("NUMERICAL MODE: NATIONAL"); const u8 gText_PokemonListNoColor[] = _("POKéMON LIST"); const u8 gText_SearchNoColor[] = _("SEARCH"); const u8 gText_PickOKExit[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL"); const u8 gText_5Dashes[] = _("-----"); const u8 gText_PickFlipPageCheckCancel[] = _("{DPAD_LEFTRIGHT}PICK{PLUS}FLIP PAGE {A_BUTTON}CHECK {B_BUTTON}CANCEL"); const u8 gText_PokedexPokemon[] = _(" POKéMON"); const u8 gText_HT[] = _("HT"); const u8 gText_WT[] = _("WT"); const u8 gText_PokedexQuotationMark[] = _("”"); // Unused const u8 gText_Lbs[] = _("lbs."); const u8 gText_Cry[] = _("{START_BUTTON}CRY"); const u8 gText_NextDataCancel[] = _("{A_BUTTON}NEXT DATA {B_BUTTON}CANCEL"); const u8 gText_Next[] = _("{A_BUTTON}NEXT"); const u8 gText_CancelPreviousData[] = _("{A_BUTTON}CANCEL {B_BUTTON}PREVIOUS DATA"); const u8 gText_Area[] = _("AREA"); const u8 gText_Size[] = _("SIZE"); const u8 gText_AreaUnknown[] = _("AREA UNKNOWN"); const u8 gText_PokedexNo[] = _("{NO}"); const u8 gText_Page[] = _("PAGE"); ALIGNED(4) const u8 gText_WelcomeToHOF[] = _("Welcome to the HALL OF FAME!"); ALIGNED(4) const u8 gText_HOFCorrupted[] = _("The HALL OF FAME data is\ncorrupted."); const u8 gText_HOFNumber[] = _("HALL OF FAME No. {STR_VAR_1}"); const u8 gText_LeagueChamp[] = _("LEAGUE CHAMPION!\nCONGRATULATIONS!"); ALIGNED(4) const u8 gText_Number[] = _("No. "); ALIGNED(4) const u8 gText_Level[] = _("Lv. "); ALIGNED(4) const u8 gText_Name[] = _("NAME"); ALIGNED(4) const u8 gText_IDNumber[] = _("IDNo."); const u8 gText_SaveError_PleaseExchangeBackupMemory[] = _("Save error.\pPlease exchange the\nbackup memory."); const u8 gSaveStatName_Player[] = _("PLAYER"); const u8 gSaveStatName_Badges[] = _("BADGES"); const u8 gSaveStatName_Pokedex[] = _("POKéDEX"); const u8 gSaveStatName_Time[] = _("TIME"); const u8 gOtherText_Use[] = _("USE"); const u8 gOtherText_Toss[] = _("TOSS"); const u8 gOtherText_Register[] = _("REGISTER"); const u8 gOtherText_Give[] = _("GIVE"); const u8 gOtherText_Walk[] = _("WALK"); const u8 gFameCheckerText_Cancel[] = _("CANCEL"); const u8 gOtherText_Exit[] = _("EXIT"); const u8 gString_Dummy[] = _(""); const u8 gText_Item[] = _("ITEM"); const u8 gText_Mail[] = _("MAIL"); const u8 gText_Take[] = _("TAKE"); const u8 gText_Store[] = _("STORE"); const u8 gOtherText_Check[] = _("CHECK"); const u8 gText_PokeSum_Item_None[] = _("NONE"); const u8 gOtherText_Open[] = _("OPEN"); const u8 gOtherText_Deselect[] = _("DESELECT"); const u8 gText_PokeSum_DexNoUnknown[] = _("???"); const u8 gText_FiveMarks[] = _("?????"); const u8 gText_Slash[] = _("/"); const u8 gText_PokeSum_OneHyphen[] = _("-"); const u8 gText_PokeSum_TwoHyphens[] = _("--"); const u8 gText_ThreeHyphens[] = _("---"); const u8 gText_SevenHyphens[] = _("-------"); const u8 gText_MaleSymbol[] = _("♂"); const u8 gText_FemaleSymbol[] = _("♀"); const u8 gText_Lv[] = _("{LV_2}"); const u8 gText_NumberClear01[] = _("{NO}{CLEAR 0x01}"); const u8 gText_Plus[] = _("{PLUS}"); const u8 gText_Escape3[] = _("{ESCAPE 0x03}"); // Unused, RIGHT_ARROW in pokeemerald const u8 gText_IDNumber2[] = _("{ID}{NO}"); const u8 gText_PokeSum_PP[] = _("{PP}"); const u8 gText_SelectorArrow2[] = _("▶"); const u8 gText_YesNo[] = _("YES\nNO"); const u8 gText_GoBackToThePreviousMenu[] = _("Go back to the\nprevious menu."); const u8 gText_WhatWouldYouLikeToDo[] = _("What would you like to do?"); const u8 gText_MenuPokedex[] = _("POKéDEX"); const u8 gText_MenuBag[] = _("BAG"); const u8 gText_MenuPlayer[] = _("{PLAYER}"); const u8 gText_MenuSave[] = _("SAVE"); const u8 gText_MenuOption[] = _("OPTION"); const u8 gText_MenuExit[] = _("EXIT"); const u8 gText_MenuRetire[] = _("RETIRE"); const u8 gText_MenuSafariStats[] = _("{STR_VAR_1}/{STR_VAR_2}\nBALLS {STR_VAR_3}"); const u8 gText_TimesStrVar1[] = _("×{STR_VAR_1}"); const u8 gText_Berry[] = _(" BERRY"); const u8 gText_Coins[] = _("{STR_VAR_1} COINS"); const u8 gText_Items2[] = _("ITEMS"); const u8 gText_PokeBalls2[] = _("POKé BALLS"); const u8 gText_KeyItems2[] = _("KEY ITEMS"); const u8 gText_DepositItem[] = _("DEPOSIT ITEM"); const u8 gText_CloseBag[] = _("CLOSE BAG"); const u8 gText_Var1IsSelected[] = _("{STR_VAR_1} is\nselected."); const u8 gText_CantWriteMailHere[] = _("You can't write\nMAIL here."); const u8 gText_ThereIsNoPokemon[] = _("There is no\nPOKéMON."); const u8 gOtherText_WhereShouldTheStrVar1BePlaced[] = _("Where should the {STR_VAR_1}\nbe placed?"); const u8 gText_ItemCantBeHeld[] = _("The {STR_VAR_1} can't be held."); const u8 gText_TheStrVar1CantBeHeldHere[] = _("The {STR_VAR_1} can't be held\nhere."); const u8 gText_DepositHowManyStrVars1[] = _("Deposit how many\n{STR_VAR_1}(s)?"); const u8 gText_DepositedStrVar2StrVar1s[] = _("Deposited {STR_VAR_2}\n{STR_VAR_1}(s)."); const u8 gText_NoRoomToStoreItems[] = _("There's no room to\nstore items."); const u8 gText_TossOutHowManyStrVar1s[] = _("Toss out how many\n{STR_VAR_1}(s)?"); const u8 gText_ThrewAwayStrVar2StrVar1s[] = _("Threw away {STR_VAR_2}\n{STR_VAR_1}(s)."); const u8 gText_ThrowAwayStrVar2OfThisItemQM[] = _("Throw away {STR_VAR_2} of\nthis item?"); const u8 gText_OakForbidsUseOfItemHere[] = _("OAK: {PLAYER}!\nThis isn't the time to use that!{PAUSE_UNTIL_PRESS}"); const u8 gText_CantDismountBike[] = _("You can't dismount your BIKE here.{PAUSE_UNTIL_PRESS}"); const u8 gText_ItemfinderResponding[] = _("Huh?\nThe ITEMFINDER's responding!\pThere's an item buried around here!{PAUSE_UNTIL_PRESS}"); const u8 gText_ItemfinderShakingWildly[] = _("Oh!\nThe ITEMFINDER's shaking wildly!\pThere's an item buried underfoot!\p‥ ‥ ‥ ‥ ‥ ‥{PAUSE_UNTIL_PRESS}"); const u8 gText_NopeTheresNoResponse[] = _("‥ ‥ ‥ ‥Nope!\nThere's no response.{PAUSE_UNTIL_PRESS}"); const u8 gText_CoinCase[] = _("Your COINS:\n{STR_VAR_1}{PAUSE_UNTIL_PRESS}"); const u8 gText_PlayerUsedVar2[] = _("{PLAYER} used the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); const u8 gText_RepelEffectsLingered[] = _("But the effects of a REPEL\nlingered from earlier.{PAUSE_UNTIL_PRESS}"); const u8 gText_UsedVar2WildLured[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be lured.{PAUSE_UNTIL_PRESS}"); const u8 gText_UsedVar2WildRepelled[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be repelled.{PAUSE_UNTIL_PRESS}"); const u8 gText_BoxFull[] = _("The BOX is full.{PAUSE_UNTIL_PRESS}"); const u8 gText_PowderQty[] = _("POWDER QUANTITY: {STR_VAR_1}{PAUSE_UNTIL_PRESS}"); const u8 gOtherText_Powder[] = _("POWDER"); const u8 gText_PlayedPokeFluteCatchy[] = _("Played the POKé FLUTE.\pNow, that's a catchy tune!{PAUSE_UNTIL_PRESS}"); const u8 gText_PlayedPokeFlute[] = _("Played the POKé FLUTE."); const u8 gText_PokeFluteAwakenedMon[] = _("The POKé FLUTE awakened sleeping\nPOKéMON.{PAUSE_UNTIL_PRESS}"); const u8 gText_TMCase[] = _("TM CASE"); const u8 gText_Close[] = _("CLOSE"); const u8 gText_TMCaseWillBePutAway[] = _("The TM CASE will be\nput away."); const u8 gText_FontSmall[] = _("{FONT_SMALL}"); const u8 gText_FontNormal[] = _("{FONT_NORMAL}"); const u8 gText_EmptySpace[] = _(" "); const u8 gText_BerryPouch[] = _("BERRY POUCH"); const u8 gText_TheBerryPouchWillBePutAway[] = _("The BERRY POUCH will be\nput away."); const u8 gText_ShopBuy[] = _("BUY"); const u8 gText_ShopSell[] = _("SELL"); const u8 gText_ShopQuit[] = _("SEE YA!"); const u8 gText_InBagVar1[] = _("IN BAG:{FONT_SMALL} {STR_VAR_1}"); const u8 gText_QuitShopping[] = _("Quit shopping."); const u8 gText_Var1CertainlyHowMany[] = _("{STR_VAR_1}? Certainly.\nHow many would you like?"); const u8 gText_Var1AndYouWantedVar2[] = _("{STR_VAR_1}, and you want {STR_VAR_2}.\nThat will be ¥{STR_VAR_3}. Okay?"); const u8 gText_HereYouGoThankYou[] = _("Here you are!\nThank you!"); const u8 gText_YouDontHaveMoney[] = _("You don't have enough money.{PAUSE_UNTIL_PRESS}"); const u8 gText_NoMoreRoomForThis[] = _("You have no more room for this\nitem.{PAUSE_UNTIL_PRESS}"); const u8 gText_AnythingElseICanHelp[] = _("{COLOR BLUE}Is there anything else I can do?"); const u8 gText_OhNoICantBuyThat[] = _("{STR_VAR_1}? Oh, no.\nI can't buy that.{PAUSE_UNTIL_PRESS}"); const u8 gText_HowManyWouldYouLikeToSell[] = _("{STR_VAR_1}?\nHow many would you like to sell?"); const u8 gText_ICanPayThisMuch_WouldThatBeOkay[] = _("I can pay ¥{STR_VAR_3}.\nWould that be okay?"); const u8 gText_TurnedOverItemsWorthYen[] = _("Turned over the {STR_VAR_1}シSス\nworth ¥{STR_VAR_3}."); const u8 gText_PokedollarVar1[] = _("¥{STR_VAR_1}"); const u8 gText_Shift[] = _("SHIFT"); const u8 gText_SendOut[] = _("SEND OUT"); const u8 gText_Switch2[] = _("SWITCH"); const u8 gText_Summary5[] = _("SUMMARY"); const u8 gText_Enter[] = _("ENTER"); const u8 gText_NoEntry[] = _("NO ENTRY"); const u8 gText_Take2[] = _("TAKE"); const u8 gText_Read2[] = _("READ"); const u8 gText_Trade4[] = _("TRADE"); const u8 gText_ItemEffect_HP[] = _("HP"); const u8 gText_ItemEffect_SpAtk[] = _("SP. ATK"); const u8 gText_ItemEffect_SpDef[] = _("SP. DEF"); const u8 gText_PartyMenu_OK[] = _("OK"); const u8 gText_Empty[] = _(""); const u8 gText_PauseUntilPress[] = _("{PAUSE_UNTIL_PRESS}"); const u8 gText_WontHaveEffect[] = _("It won't have any effect.{PAUSE_UNTIL_PRESS}"); const u8 gText_CantBeUsedOnPkmn[] = _("This can't be used on\nthat POKéMON.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnCantSwitchOut[] = _("{STR_VAR_1} can't be switched\nout!{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnAlreadyInBattle[] = _("{STR_VAR_1} is already\nin battle!{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnAlreadySelected[] = _("{STR_VAR_1} has already been\nselected.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnHasNoEnergy[] = _("{STR_VAR_1} has no energy\nleft to battle!{PAUSE_UNTIL_PRESS}"); const u8 gText_CantSwitchWithAlly[] = _("You can't switch {STR_VAR_1}'s\nPOKéMON with one of yours!{PAUSE_UNTIL_PRESS}"); const u8 gText_EggCantBattle[] = _("An EGG can't battle!{PAUSE_UNTIL_PRESS}"); const u8 gText_CantUseUntilNewBadge[] = _("This can't be used until a new\nBADGE is obtained.{PAUSE_UNTIL_PRESS}"); const u8 gText_CantUseUntilNewHM[] = _("This can't be used until a new\nHM item is obtained.{PAUSE_UNTIL_PRESS}"); const u8 gText_NoMoreThanThreeMayEnter[] = _("No more than three POKéMON\nmay enter.{PAUSE_UNTIL_PRESS}"); const u8 gText_NoMoreThanTwoMayEnter[] = _("No more than two POKéMON\nmay enter.{PAUSE_UNTIL_PRESS}"); const u8 gText_SendMailToPC[] = _("Send the removed MAIL to\nyour PC?"); const u8 gText_MailSentToPC[] = _("The MAIL was sent to your PC.{PAUSE_UNTIL_PRESS}"); const u8 gText_PCMailboxFull[] = _("Your PC's MAILBOX is full.{PAUSE_UNTIL_PRESS}"); const u8 gText_MailMessageWillBeLost[] = _("If the MAIL is removed, the\nmessage will be lost. Okay?"); const u8 gText_RemoveMailBeforeItem[] = _("MAIL must be removed before\nholding an item.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnWasGivenItem[] = _("{STR_VAR_1} was given the\n{STR_VAR_2} to hold.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnAlreadyHoldingItemSwitch[] = _("{STR_VAR_1} is already holding\none {STR_VAR_2}.\pWould you like to switch the\ntwo items?"); const u8 gText_PkmnNotHolding[] = _("{STR_VAR_1} isn't holding\nanything.{PAUSE_UNTIL_PRESS}"); const u8 gText_ReceivedItemFromPkmn[] = _("Received the {STR_VAR_2}\nfrom {STR_VAR_1}.{PAUSE_UNTIL_PRESS}"); const u8 gText_MailTakenFromPkmn[] = _("MAIL was taken from the\nPOKéMON.{PAUSE_UNTIL_PRESS}"); const u8 gText_SwitchedPkmnItem[] = _("The {STR_VAR_2} was taken and\nreplaced with the {STR_VAR_1}.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnHoldingItemCantHoldMail[] = _("This POKéMON is holding an\nitem. It cannot hold MAIL.{PAUSE_UNTIL_PRESS}"); const u8 gText_MailTransferredFromMailbox[] = _("MAIL was transferred from\nthe MAILBOX.{PAUSE_UNTIL_PRESS}"); const u8 gText_BagFullCouldNotRemoveItem[] = _("The {STR_VAR_1} is full. The POKéMON's\nitem could not be removed.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnLearnedMove3[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!"); const u8 gText_PkmnCantLearnMove[] = _("{STR_VAR_1} and {STR_VAR_2}\nare not compatible.\p{STR_VAR_2} can't be\nlearned.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnNeedsToReplaceMove[] = _("{STR_VAR_1} wants to learn the\nmove {STR_VAR_2}.\pHowever, {STR_VAR_1} already\nknows four moves.\pShould a move be deleted and\nreplaced with {STR_VAR_2}?"); const u8 gText_StopLearningMove2[] = _("Stop trying to teach\n{STR_VAR_2}?"); const u8 gText_MoveNotLearned[] = _("{STR_VAR_1} did not learn the\nmove {STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); const u8 gText_WhichMoveToForget[] = _("Which move should be forgotten?{PAUSE_UNTIL_PRESS}"); const u8 gText_12PoofForgotMove[] = _("1, {PAUSE 0x0F}2, and{PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}{PLAY_SE SE_BALL_BOUNCE_1}Poof!\p{STR_VAR_1} forgot how to\nuse {STR_VAR_2}.\pAnd...{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnAlreadyKnows[] = _("{STR_VAR_1} already knows\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnHPRestoredByVar2[] = _("{STR_VAR_1}'s HP was restored\nby {STR_VAR_2} point(s).{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnCuredOfPoison[] = _("{STR_VAR_1} was cured of its\npoisoning.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnCuredOfParalysis[] = _("{STR_VAR_1} was cured of\nparalysis.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnWokeUp2[] = _("{STR_VAR_1} woke up.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnBurnHealed[] = _("{STR_VAR_1}'s burn was healed.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnThawedOut[] = _("{STR_VAR_1} was thawed out.{PAUSE_UNTIL_PRESS}"); const u8 gText_PPWasRestored[] = _("PP was restored.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnBecameHealthy[] = _("{STR_VAR_1} became healthy.{PAUSE_UNTIL_PRESS}"); const u8 gText_MovesPPIncreased[] = _("{STR_VAR_1}'s PP increased.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnElevatedToLvVar2[] = _("{STR_VAR_1} was elevated to\nLv. {STR_VAR_2}."); const u8 gText_PkmnBaseVar2StatIncreased[] = _("{STR_VAR_1}'s base {STR_VAR_2}\nstat was raised.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnSnappedOutOfConfusion[] = _("{STR_VAR_1} snapped out of its\nconfusion.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnGotOverInfatuation[] = _("{STR_VAR_1} got over its\ninfatuation.{PAUSE_UNTIL_PRESS}"); const u8 gText_OnlyPkmnForBattle[] = _("That's your only\nPOKéMON for battle."); ALIGNED(4) const u8 gText_PkmnCantBeTradedNow[] = _("That POKéMON can't be traded\nnow."); ALIGNED(4) const u8 gText_EggCantBeTradedNow[] = _("An EGG can't be traded now."); ALIGNED(4) const u8 gText_OtherTrainersPkmnCantBeTraded[] = _("The other TRAINER's POKéMON\ncan't be traded now."); ALIGNED(4) const u8 gText_OtherTrainerCantAcceptPkmn[] = _("The other TRAINER can't accept\nthat POKéMON now."); ALIGNED(4) const u8 gText_CantTradeWithTrainer[] = _("You can't trade with that\nTRAINER now."); ALIGNED(4) const u8 gText_NotPkmnOtherTrainerWants[] = _("That isn't the type of POKéMON\nthat the other TRAINER wants."); ALIGNED(4) const u8 gText_ThatIsntAnEgg[] = _("That isn't an EGG."); const u8 gText_ChoosePokemon[] = _("Choose a POKéMON."); const u8 gText_MoveToWhere[] = _("Move to where?"); const u8 gText_TeachWhichPokemon[] = _("Teach which POKéMON?"); const u8 gText_UseOnWhichPokemon[] = _("Use on which POKéMON?"); const u8 gText_GiveToWhichPokemon[] = _("Give to which POKéMON?"); const u8 gText_DoWhatWithPokemon[] = _("Do what with this {PKMN}?"); const u8 gText_NothingToCut[] = _("There's nothing to CUT."); const u8 gText_CantSurfHere[] = _("No SURFING here!"); const u8 gText_AlreadySurfing[] = _("You're already SURFING."); const u8 gText_CantUseHere[] = _("Can't use that here."); const u8 gText_RestoreWhichMove[] = _("Restore which move?"); const u8 gText_BoostPp[] = _("Boost PP of which?"); const u8 gText_DoWhatWithItem[] = _("Do what with an item?"); const u8 gText_NoPokemonForBattle[] = _("No battling this way!"); const u8 gText_ChoosePokemon2[] = _("Choose a POKéMON."); const u8 gText_NotEnoughHp[] = _("Not enough HP‥"); const u8 gText_ThreePkmnAreNeeded[] = _("Three {PKMN} are needed."); const u8 gText_PokemonCantBeSame[] = _("{PKMN} can't be the same."); const u8 gText_NoIdenticalHoldItems[] = _("No same hold items!"); const u8 gText_CurrentIsTooFast[] = _("The current is much too fast!"); const u8 gText_DoWhatWithMail[] = _("Do what with the MAIL?"); const u8 gText_ChoosePokemonCancel[] = _("Choose POKéMON or CANCEL."); const u8 gText_ChoosePokemonConfirm[] = _("Choose POKéMON and confirm."); const u8 gText_TwoPokemonAreNeeded[] = _("Two POKéMON are needed."); const u8 gText_EnjoyCycling[] = _("Let's enjoy cycling!"); const u8 gText_InUseAlready_PM[] = _("This is in use already."); const u8 gText_NoUse[] = _("No use."); const u8 gText_Able[] = _("ABLE"); const u8 gText_First_PM[] = _("FIRST"); const u8 gText_Second_PM[] = _("SECOND"); const u8 gText_Third_PM[] = _("THIRD"); const u8 gText_Able2[] = _("ABLE"); const u8 gText_NotAble[] = _("NOT ABLE"); const u8 gText_Able3[] = _("ABLE!"); const u8 gText_NotAble2[] = _("NOT ABLE!"); const u8 gText_Learned[] = _("LEARNED"); const u8 gText_OakImportantToGetToKnowPokemonThroughly[] = _("OAK: It's important to get to know\nyour POKéMON thoroughly.\p"); const u8 gText_OakThisIsListOfPokemon[] = _("This is a list of your POKéMON,\n{PLAYER}.\pOpen this to check the skills\nand moves of your POKéMON.\pYou also choose POKéMON here if\nyou want to use an item on one.{PAUSE_UNTIL_PRESS}"); const u8 gText_CutATreeOrGrass[] = _("Cut a tree or grass."); const u8 gText_FlyToAKnownTown[] = _("Fly to a known town."); const u8 gText_TravelOnWater[] = _("Travel on water."); const u8 gText_MoveHeavyBoulders[] = _("Move heavy boulders."); const u8 gText_LightUpDarkness[] = _("Light up darkness."); const u8 gText_ShatterACrackedRock[] = _("Shatter a cracked rock."); const u8 gText_ClimbAWaterfall[] = _("Climb a waterfall."); const u8 gText_EscapeFromHere[] = _("Escape from here."); const u8 gText_LureWildPokemon[] = _("Lure wild POKéMON."); const u8 gText_ShareHp[] = _("Share HP."); const u8 gText_ReturnToAHealingSpot[] = _("Return to a healing spot."); const u8 gText_DiveUnderwater[] = _("Dive underwater."); const u8 gText_EscapeFromHereAndReturnTo[] = _("Want to escape from here and return\nto {STR_VAR_1}?"); const u8 gText_ReturnToHealingSpot[] = _("Want to return to the healing spot\nused last in {STR_VAR_1}?"); const u8 gText_ItemEffect_Attack[] = _("ATTACK"); const u8 gText_ItemEffect_Defense[] = _("DEFENSE"); const u8 gText_ItemEffect_Speed[] = _("SPEED"); const u8 gText_PkmnCantParticipate[] = _("That POKéMON can't participate.{PAUSE_UNTIL_PRESS}"); const u8 gText_CancelParticipation[] = _("Cancel participation?"); const u8 gText_Empty12[] = _(""); const u8 gText_CancelBattle[] = _("Cancel the battle?"); const u8 gText_TurnOff[] = _("TURN OFF"); const u8 gText_ItemStorage[] = _("ITEM STORAGE"); const u8 gText_Mailbox[] = _("MAILBOX"); const u8 gText_DepositItem2[] = _("DEPOSIT ITEM"); const u8 gText_WithdrawItem2[] = _("WITHDRAW ITEM"); const u8 gText_StoreItemsInThePC[] = _("Store items in the PC."); const u8 gText_TakeOutItemsFromThePC[] = _("Take out items from the PC."); const u8 gText_ThereAreNoItems[] = _("There are no items.{PAUSE_UNTIL_PRESS}"); const u8 gText_NoMoreRoomInBag[] = _("There is no more\nroom in the BAG."); const u8 gText_WithdrawHowMany[] = _("Withdraw how many\n{STR_VAR_1}(s)?"); const u8 gText_WithdrewQuantItem[] = _("Withdrew {STR_VAR_2}\n{STR_VAR_1}(s)."); const u8 gOtherText_Read[] = _("READ"); const u8 gOtherText_MoveToBag[] = _("MOVE TO BAG"); const u8 gOtherText_Give2[] = _("GIVE"); const u8 gText_TheresNoMailHere[] = _("There's no MAIL here.{PAUSE_UNTIL_PRESS}"); const u8 gText_WhatWouldYouLikeToDoWithPlayersMail[] = _("What would you like to do with\n{STR_VAR_1}'s MAIL?"); const u8 gText_MessageWillBeLost[] = _("The message will be lost.\nIs that okay?"); const u8 gText_BagIsFull[] = _("The BAG is full.{PAUSE_UNTIL_PRESS}"); const u8 gText_MailReturnedToBagMessageErased[] = _("The MAIL was returned to the BAG\nwith its message erased.{PAUSE_UNTIL_PRESS}"); const u8 gText_WithdrawItem[] = _("WITHDRAW\nITEM"); const u8 gText_Withdraw[] = _("WITHDRAW"); const u8 gText_ReturnToPC[] = _("Return to the PC."); const u8 gText_LtSurge[] = _("LT. SURGE"); const u8 gText_Koga[] = _("KOGA"); const u8 gText_Info[] = _("INFO"); const u8 gText_Eggs[] = _("EGGS"); const u8 gText_HallOfFame[] = _("HALL OF FAME"); const u8 gText_Victories[] = _("VICTORIES"); const u8 gText_Quit[] = _("QUIT"); const u8 gText_Psn[] = _("PSN"); const u8 gText_Par[] = _("PAR"); const u8 gText_Slp[] = _("SLP"); const u8 gText_Brn[] = _("BRN"); const u8 gText_Frz[] = _("FRZ"); const u8 gText_Toxic[] = _("TOXIC"); const u8 gText_OK[] = _("OK"); const u8 gOtherText_Quit[] = _("QUIT"); const u8 gText_Yes[] = _("YES"); const u8 gText_No[] = _("NO"); const u8 gText_SingleBattle[] = _("SINGLE BATTLE"); const u8 gText_DoubleBattle[] = _("DOUBLE BATTLE"); const u8 gText_MultiBattle[] = _("MULTI BATTLE"); const u8 gText_MakeAChallenge[] = _("CHALLENGE"); const u8 gText_Lv50[] = _("LV. 50"); const u8 gText_Lv100[] = _("OPEN LEVEL"); const u8 gText_OpenLv[] = _("OPEN LV."); const u8 gText_Info_2[] = _("INFO"); const u8 gOtherText_BattleTowerResults[] = _("{PLAYER}'s BATTLE TOWER RESULTS"); const u8 gOtherText_Current[] = _("CURRENT"); const u8 gOtherText_Prev[] = _("PREV."); const u8 gOtherText_Record[] = _("RECORD"); const u8 gOtherText_WinStreak[] = _("WIN STREAK: {STR_VAR_1}"); const u8 gText_FreshWater_200[] = _("FRESH WATER{CLEAR_TO 0x57}{FONT_SMALL}¥200"); const u8 gText_SodaPop_300[] = _("SODA POP{CLEAR_TO 0x57}{FONT_SMALL}¥300"); const u8 gText_Lemonade_350[] = _("LEMONADE{CLEAR_TO 0x57}{FONT_SMALL}¥350"); const u8 gText_50Coins_1000[] = _("{FONT_SMALL} 50 COINS{CLEAR_TO 0x45}¥1,000"); const u8 gText_500Coins_10000[] = _("{FONT_SMALL} 500 COINS{CLEAR_TO 0x40}¥10,000"); const u8 gText_1000Coins_20000[] = _("{FONT_SMALL}1000 COINS{CLEAR_TO 0x40}¥20,000"); const u8 gText_Excellent[] = _("Excellent"); const u8 gText_NotSoBad[] = _("Not so bad"); const u8 gText_RedShard[] = _("RED SHARD"); const u8 gText_YellowShard[] = _("YELLOW SHARD"); const u8 gText_BlueShard[] = _("BLUE SHARD"); const u8 gText_GreenShard[] = _("GREEN SHARD"); const u8 gText_Right[] = _("Right"); const u8 gText_Left[] = _("Left"); const u8 gText_Tm13_4000Coins[] = _("TM13{CLEAR_TO 0x48}{FONT_SMALL}4,000 COINS"); const u8 gText_Tm23_3500Coins[] = _("TM23{CLEAR_TO 0x48}{FONT_SMALL}3,500 COINS"); const u8 gText_Tm24_4000Coins[] = _("TM24{CLEAR_TO 0x48}{FONT_SMALL}4,000 COINS"); const u8 gText_Tm30_4500Coins[] = _("TM30{CLEAR_TO 0x48}{FONT_SMALL}4,500 COINS"); const u8 gText_Tm35_4000Coins[] = _("TM35{CLEAR_TO 0x48}{FONT_SMALL}4,000 COINS"); const u8 gText_1F_2[] = _("1F"); const u8 gText_2F_2[] = _("2F"); const u8 gText_3F_2[] = _("3F"); const u8 gText_4F_2[] = _("4F"); const u8 gText_5F_2[] = _("5F"); const u8 gText_Cool[] = _("COOL"); const u8 gText_Beauty[] = _("BEAUTY"); const u8 gText_Cute[] = _("CUTE"); const u8 gText_Smart[] = _("SMART"); const u8 gText_Tough[] = _("TOUGH"); const u8 gText_Normal[] = _("NORMAL"); const u8 gText_Black[] = _("BLACK"); const u8 gText_Pink[] = _("PINK"); const u8 gText_Sepia[] = _("SEPIA"); const u8 gText_Cool_2[] = _("COOL"); const u8 gText_Beauty_2[] = _("BEAUTY"); const u8 gText_Cute_2[] = _("CUTE"); const u8 gText_Smart_2[] = _("SMART"); const u8 gText_Tough_2[] = _("TOUGH"); const u8 gText_Items[] = _("ITEMS"); const u8 gText_KeyItems[] = _("KEY ITEMS"); const u8 gText_PokeBalls[] = _("POKé BALLS"); const u8 gText_TMsAndHMs[] = _("TMs & HMs"); const u8 gText_Berries[] = _("BERRIES"); const u8 gText_Boulderbadge[] = _("BOULDERBADGE"); const u8 gText_Cascadebadge[] = _("CASCADEBADGE"); const u8 gText_Thunderbadge[] = _("THUNDERBADGE"); const u8 gText_Rainbowbadge[] = _("RAINBOWBADGE"); const u8 gText_Soulbadge[] = _("SOULBADGE"); const u8 gText_Marshbadge[] = _("MARSHBADGE"); const u8 gText_Volcanobadge[] = _("VOLCANOBADGE"); const u8 gText_Earthbadge[] = _("EARTHBADGE"); const u8 gText_SomeoneSPc[] = _("SOMEONE'S PC"); const u8 gText_BillSPc[] = _("BILL'S PC"); const u8 gText_SPc[] = _("{PLAYER}'s PC"); const u8 gText_HallOfFame_2[] = _("HALL OF FAME"); const u8 gText_LogOff[] = _("LOG OFF"); const u8 gText_ProfOakSPc[] = _("PROF. OAK's PC"); const u8 gText_Eevee[] = _("EEVEE"); const u8 gText_Flareon[] = _("FLAREON"); const u8 gText_Jolteon[] = _("JOLTEON"); const u8 gText_Vaporeon[] = _("VAPOREON"); const u8 gText_QuitLooking[] = _("Quit looking."); const u8 gText_FreshWater[] = _("FRESH WATER"); const u8 gText_SodaPop[] = _("SODA POP"); const u8 gText_Lemonade[] = _("LEMONADE"); const u8 gText_Coins_2[] = _("COINS"); const u8 gText_Bicycle_Price[] = _("BICYCLE{CLEAR_TO 0x49}{FONT_SMALL}¥1,000,000"); const u8 gText_NoThanks[] = _("NO THANKS"); const u8 gText_Abra_180Coins[] = _("ABRA{CLEAR_TO 0x55}{FONT_SMALL} 180 COINS"); const u8 gText_Clefairy_500Coins[] = _("CLEFAIRY{CLEAR_TO 0x55}{FONT_SMALL} 500 COINS"); const u8 gText_Dratini_2800Coins[] = _("DRATINI{CLEAR_TO 0x4B}{FONT_SMALL} 2,800 COINS"); const u8 gText_Scyther_5500Coins[] = _("SCYTHER{CLEAR_TO 0x4B}{FONT_SMALL} 5,500 COINS"); const u8 gText_Porygon_9999Coins[] = _("PORYGON{CLEAR_TO 0x4B}{FONT_SMALL} 9,999 COINS"); const u8 gText_Abra_120Coins[] = _("ABRA{CLEAR_TO 0x55}{FONT_SMALL} 120 COINS"); const u8 gText_Clefairy_750Coins[] = _("CLEFAIRY{CLEAR_TO 0x55}{FONT_SMALL} 750 COINS"); const u8 gText_Pinsir_2500Coins[] = _("PINSIR{CLEAR_TO 0x4B}{FONT_SMALL} 2,500 COINS"); const u8 gText_Dratini_4600Coins[] = _("DRATINI{CLEAR_TO 0x4B}{FONT_SMALL} 4,600 COINS"); const u8 gText_Porygon_6500Coins[] = _("PORYGON{CLEAR_TO 0x4B}{FONT_SMALL} 6,500 COINS"); const u8 gText_NoThanks_2[] = _("NO THANKS"); const u8 gText_HelixFossil[] = _("HELIX FOSSIL"); const u8 gText_DomeFossil[] = _("DOME FOSSIL"); const u8 gText_OldAmber[] = _("OLD AMBER"); const u8 gText_TradeCenter[] = _("TRADE CENTER"); const u8 gText_Colosseum[] = _("COLOSSEUM"); const u8 gText_GameLinkCable[] = _("Game Link cable"); const u8 gText_Wireless[] = _("Wireless"); const u8 gText_ItemsPocket[] = _("ITEMS POCKET"); const u8 gText_KeyItemsPocket[] = _("KEY ITEMS POCKET"); const u8 gText_PokeBallsPocket[] = _("POKé BALLS POCKET"); const u8 gText_TmCase[] = _("TM CASE"); const u8 gText_BerryPouch_2[] = _("BERRY POUCH"); const u8 gText_Other[] = _("OTHER"); const u8 gText_OneIsland[] = _("ONE ISLAND"); const u8 gText_TwoIsland[] = _("TWO ISLAND"); const u8 gText_ThreeIsland[] = _("THREE ISLAND"); const u8 gText_FourIsland[] = _("FOUR ISLAND"); const u8 gText_FiveIsland[] = _("FIVE ISLAND"); const u8 gText_SixIsland[] = _("SIX ISLAND"); const u8 gText_SevenIsland[] = _("SEVEN ISLAND"); const u8 gText_Vermilion[] = _("VERMILION"); const u8 gText_Colosseum_2[] = _("COLOSSEUM"); const u8 gText_BerryCrush[] = _("BERRY CRUSH"); const u8 gText_RecordCorner[] = _(""); // Dummied const u8 gText_PokemonJump[] = _("POKéMON JUMP"); const u8 gText_DodrioBerryPicking[] = _("DODRIO BERRY-PICKING"); const u8 gText_2Tinymushrooms[] = _("2 TINYMUSHROOMS"); const u8 gText_1BigMushroom[] = _("1 BIG MUSHROOM"); const u8 gText_SeviiIslands[] = _("SEVII ISLANDS"); const u8 gText_NavelRock[] = _("NAVEL ROCK"); const u8 gText_FarawayIsland[] = _("FARAWAY ISLAND"); const u8 gText_BirthIsland[] = _("BIRTH ISLAND"); const u8 gText_SouthernIsland[] = _("SOUTHERN ISLAND"); const u8 gText_MiracleSeed_1000Coins[] = _("MIRACLE SEED{CLEAR_TO 0x50}{FONT_SMALL}1,000 COINS"); const u8 gText_Charcoal_1000Coins[] = _("CHARCOAL{CLEAR_TO 0x50}{FONT_SMALL}1,000 COINS"); const u8 gText_MysticWater_1000Coins[] = _("MYSTIC WATER{CLEAR_TO 0x50}{FONT_SMALL}1,000 COINS"); const u8 gText_YellowFlute_1600Coins[] = _("YELLOW FLUTE{CLEAR_TO 0x50}{FONT_SMALL}1,600 COINS"); const u8 gText_SmokeBall_800Coins[] = _("SMOKE BALL{CLEAR_TO 0x5A}{FONT_SMALL}800 COINS"); const u8 gText_BecomeLeader[] = _("BECOME LEADER"); const u8 gText_JoinGroup[] = _("JOIN GROUP"); const u8 gOtherText_Single[] = _("SINGLE"); const u8 gOtherText_Double[] = _("DOUBLE"); const u8 gOtherText_Knockout[] = _("KNOCKOUT"); const u8 gOtherText_Mixed[] = _("MIXED"); const u8 gText_DecimalPoint[] = _("."); const u8 gText_BigGuy[] = _("Big guy"); const u8 gText_BigGirl[] = _("Big girl"); const u8 gText_Son[] = _("son"); const u8 gText_Daughter[] = _("daughter"); const u8 gText_BoulderBadge[] = _("BOULDERBADGE"); const u8 gText_CascadeBadge[] = _("CASCADEBADGE"); const u8 gText_ThunderBadge[] = _("THUNDERBADGE"); const u8 gText_RainbowBadge[] = _("RAINBOWBADGE"); const u8 gText_SoulBadge[] = _("SOULBADGE"); const u8 gText_MarshBadge[] = _("MARSHBADGE"); const u8 gText_VolcanoBadge[] = _("VOLCANOBADGE"); const u8 gText_EarthBadge[] = _("EARTHBADGE"); const u8 gText_1F[] = _("1F"); const u8 gText_2F[] = _("2F"); const u8 gText_3F[] = _("3F"); const u8 gText_4F[] = _("4F"); const u8 gText_5F[] = _("5F"); const u8 gText_6F[] = _("6F"); const u8 gText_7F[] = _("7F"); const u8 gText_8F[] = _("8F"); const u8 gText_9F[] = _("9F"); const u8 gText_10F[] = _("10F"); const u8 gText_11F[] = _("11F"); const u8 gText_B1F[] = _("B1F"); const u8 gText_B2F[] = _("B2F"); const u8 gText_B3F[] = _("B3F"); const u8 gText_B4F[] = _("B4F"); const u8 gText_Rooftop[] = _("ROOFTOP"); const u8 gText_NowOn[] = _("Now on:"); const u8 gText_LinkedGamePlay[] = _("LINKED GAME PLAY"); const u8 gText_DirectCorner[] = _("DIRECT CORNER"); const u8 gText_UnionRoom[] = _("UNION ROOM"); const u8 gText_Energypowder_50[] = _("ENERGYPOWDER{CLEAR_TO 0x74}{FONT_SMALL}50"); const u8 gText_EnergyRoot_80[] = _("ENERGY ROOT{CLEAR_TO 0x74}{FONT_SMALL}80"); const u8 gText_HealPowder_50[] = _("HEAL POWDER{CLEAR_TO 0x74}{FONT_SMALL}50"); const u8 gText_RevivalHerb_300[] = _("REVIVAL HERB{CLEAR_TO 0x6F}{FONT_SMALL}300"); const u8 gText_Protein_1000[] = _("PROTEIN{CLEAR_TO 0x65}{FONT_SMALL}1,000"); const u8 gText_Iron_1000[] = _("IRON{CLEAR_TO 0x65}{FONT_SMALL}1,000"); const u8 gText_Carbos_1000[] = _("CARBOS{CLEAR_TO 0x65}{FONT_SMALL}1,000"); const u8 gText_Calcium_1000[] = _("CALCIUM{CLEAR_TO 0x65}{FONT_SMALL}1,000"); const u8 gText_Zinc_1000[] = _("ZINC{CLEAR_TO 0x65}{FONT_SMALL}1,000"); const u8 gText_HpUp_1000[] = _("HP UP{CLEAR_TO 0x65}{FONT_SMALL}1,000"); const u8 gText_PpUp_3000[] = _("PP UP{CLEAR_TO 0x65}{FONT_SMALL}3,000"); const u8 gString_BattleRecords_PlayersBattleResults[] = _("{PLAYER}'s BATTLE RESULTS"); const u8 gString_BattleRecords_TotalRecord[] = _("TOTAL RECORD W:{STR_VAR_1} L:{STR_VAR_2} D:{STR_VAR_3}"); const u8 gString_BattleRecords_ColumnHeaders[] = _("WIN{CLEAR_TO 0x30}LOSE{CLEAR_TO 0x60}DRAW"); const u8 gString_BattleRecords_7Dashes[] = _("-------"); const u8 gString_BattleRecords_4Dashes[] = _("----"); const u8 gFameCheckerText_FameCheckerWillBeClosed[] = _("The FAME CHECKER will be closed."); const u8 gFameCheckerText_ClearTextbox[] = _("\n "); const u8 gText_ExitUnused[] = _("やめる"); const u8 gText_ExitFromBox[] = _("Exit from the BOX."); const u8 gText_WhatDoYouWantToDo[] = _("What do you want to do?"); const u8 gText_PleasePickATheme[] = _("Please pick a theme."); const u8 gText_PickTheWallpaper[] = _("Pick the wallpaper."); const u8 gText_PkmnIsSelected[] = _("{DYNAMIC 0x00} is selected."); const u8 gText_JumpToWhichBox[] = _("Jump to which BOX?"); const u8 gText_DepositInWhichBox[] = _("Deposit in which BOX?"); const u8 gText_PkmnWasDeposited[] = _("{DYNAMIC 0x00} was deposited."); const u8 gText_BoxIsFull2[] = _("The BOX is full."); const u8 gText_ReleaseThisPokemon[] = _("Release this POKéMON?"); const u8 gText_PkmnWasReleased[] = _("{DYNAMIC 0x00} was released."); const u8 gText_ByeByePkmn[] = _("Bye-bye, {DYNAMIC 0x00}!"); const u8 gText_MarkYourPkmn[] = _("Mark your POKéMON."); const u8 gText_ThatsYourLastPkmn[] = _("That's your last POKéMON!"); const u8 gText_YourPartysFull[] = _("Your party's full!"); const u8 gText_YoureHoldingAPkmn[] = _("You're holding a POKéMON!"); const u8 gText_WhichOneWillYouTake[] = _("Which one will you take?"); const u8 gText_YouCantReleaseAnEgg[] = _("You can't release an EGG."); const u8 gText_ContinueBoxOperations[] = _("Continue BOX operations?"); const u8 gText_PkmnCameBack[] = _("{DYNAMIC 0x00} came back!"); const u8 gText_WasItWorriedAboutYou[] = _("Was it worried about you?"); const u8 gText_FourEllipsesExclamation[] = _("‥ ‥ ‥ ‥ ‥!"); const u8 gText_PleaseRemoveTheMail[] = _("Please remove the MAIL."); const u8 gText_GiveToAPkmn[] = _("GIVE to a POKéMON?"); const u8 gText_PlacedItemInBag[] = _("Placed item in the BAG."); const u8 gText_BagIsFull2[] = _("The BAG is full."); const u8 gText_PutItemInBag[] = _("Put this item in the BAG?"); const u8 gText_ItemIsNowHeld[] = _("{DYNAMIC 0x00} is now held."); const u8 gText_ChangedToNewItem[] = _("Changed to {DYNAMIC 0x00}."); const u8 gText_MailCantBeStored[] = _("MAIL can't be stored!"); const u8 gPCText_Cancel[] = _("CANCEL"); const u8 gPCText_Store[] = _("STORE"); const u8 gPCText_Withdraw[] = _("WITHDRAW"); const u8 gPCText_Shift[] = _("SHIFT"); const u8 gPCText_Move[] = _("MOVE"); const u8 gPCText_Place[] = _("PLACE"); const u8 gPCText_Summary[] = _("SUMMARY"); const u8 gPCText_Release[] = _("RELEASE"); const u8 gPCText_Mark[] = _("MARK"); const u8 gPCText_Name[] = _("NAME"); const u8 gPCText_Jump[] = _("JUMP"); const u8 gPCText_Wallpaper[] = _("WALLPAPER"); const u8 gPCText_Take[] = _("TAKE"); const u8 gPCText_Give[] = _("GIVE"); const u8 gPCText_Switch[] = _("SWITCH"); const u8 gPCText_Bag[] = _("BAG"); const u8 gPCText_Info[] = _("INFO"); const u8 gPCText_Scenery1[] = _("SCENERY 1"); const u8 gPCText_Scenery2[] = _("SCENERY 2"); const u8 gPCText_Scenery3[] = _("SCENERY 3"); const u8 gPCText_Etcetera[] = _("ETCETERA"); const u8 gPCText_Forest[] = _("FOREST"); const u8 gPCText_City[] = _("CITY"); const u8 gPCText_Desert[] = _("DESERT"); const u8 gPCText_Savanna[] = _("SAVANNA"); const u8 gPCText_Crag[] = _("CRAG"); const u8 gPCText_Volcano[] = _("VOLCANO"); const u8 gPCText_Snow[] = _("SNOW"); const u8 gPCText_Cave[] = _("CAVE"); const u8 gPCText_Beach[] = _("BEACH"); const u8 gPCText_Seafloor[] = _("SEAFLOOR"); const u8 gPCText_River[] = _("RIVER"); const u8 gPCText_Sky[] = _("SKY"); const u8 gPCText_PolkaDot[] = _("STARS"); const u8 gPCText_Pokecenter[] = _("POKéCENTER"); const u8 gPCText_Machine[] = _("TILES"); const u8 gPCText_Simple[] = _("SIMPLE"); const u8 gText_WithdrawPokemon[] = _("WITHDRAW POKéMON"); const u8 gText_DepositPokemon[] = _("DEPOSIT POKéMON"); const u8 gText_MovePokemon[] = _("MOVE POKéMON"); const u8 gText_MoveItems[] = _("MOVE ITEMS"); const u8 gText_SeeYa[] = _("SEE YA!"); const u8 gText_WithdrawMonDescription[] = _("You can withdraw a POKéMON if you\nhave any in a BOX."); const u8 gText_DepositMonDescription[] = _("You can deposit your party\nPOKéMON in any BOX."); const u8 gText_MoveMonDescription[] = _("You can move POKéMON that are\nstored in any BOX."); const u8 gText_MoveItemsDescription[] = _("You can move items held by any\nPOKéMON in a BOX or your party."); const u8 gText_SeeYaDescription[] = _("See you later!"); const u8 gText_JustOnePkmn[] = _("Can't deposit the last POKéMON!"); const u8 gText_PartyFull[] = _("Can't take any more POKéMON."); const u8 gText_Box[] = _("BOX"); const u8 gText_CombineFourWordsOrPhrases[] = _("Combine four words or phrases"); const u8 gText_AndMakeYourProfile[] = _("and make your profile."); const u8 gText_MakeMessageSixPhrases[] = _("Make a message of six phrases."); const u8 gText_MaxTwoTwelveLetterPhrases[] = _("Max two 12-letter phrases/line."); const u8 gText_FindWordsThatDescribeYour[] = _("Find words that describe your"); const u8 gText_FeelingsRightNow[] = _("feelings right now."); const u8 gText_CombineNineWordsOrPhrases[] = _("Combine nine words or phrases"); const u8 gText_AndMakeAMessage[] = _("and make a message."); const u8 gText_ChangeJustOneWordOrPhrase[] = _("Change just one word or phrase"); const u8 gText_AndImproveTheBardsSong[] = _("and improve the BARD's song."); const u8 gText_AndFillOutTheQuestionnaire[] = _("and fill out the questionnaire."); const u8 gText_YourProfile[] = _("Your profile"); const u8 gText_YourFeelingAtTheBattlesStart[] = _("Your feeling at the battle's start"); const u8 gText_WhatYouSayIfYouWin[] = _("What you say if you win a battle"); const u8 gText_WhatYouSayIfYouLose[] = _("What you say if you lose a battle"); const u8 gText_TheAnswer[] = _("The answer"); const u8 gText_TheMailMessage[] = _("The MAIL message"); const u8 gText_TheNewSong[] = _("The new song"); const u8 gText_CombineTwoWordsOrPhrases[] = _("Combine two words or phrases"); const u8 gText_AndMakeATrendySaying[] = _("and make a trendy saying."); const u8 gText_TheTrendySaying[] = _("The trendy saying"); const u8 gText_IsAsShownOkay[] = _("is as shown. Okay?"); const u8 gText_AllTextBeingEditedWill[] = _("All the text being edited will"); const u8 gText_BeDeletedThatOkay[] = _("be deleted. Is that okay?"); const u8 gText_QuitEditing[] = _("Quit editing?"); const u8 gText_StopGivingPkmnMail[] = _("Stop giving the POKéMON MAIL?"); const u8 gText_Profile[] = _("PROFILE"); const u8 gText_AtTheBattlesStart[] = _("At the battle's start:"); const u8 gText_UponWinningABattle[] = _("Upon winning a battle:"); const u8 gText_UponLosingABattle[] = _("Upon losing a battle:"); const u8 gText_TheBardsSong[] = _("The BARD's Song"); const u8 gText_WhatsHipAndHappening[] = _("What's hip and happening?"); const u8 gText_Interview[] = _("Interview"); const u8 gText_Questionnaire[] = _("QUESTIONNAIRE"); const u8 gText_PokemonCenter[] = _("POKéMON CENTER"); const u8 gText_SaveFailedCheckingBackup[] = _("Save failed.\nChecking the backup memory‥\nPlease wait.\n“Time required:\nabout 1 minute”"); const u8 gText_BackupMemoryDamaged[] = _("The backup memory is damaged or\nthe game's battery has run dry.\nThe game can be played, but its\nprogress cannot be saved.\n“Please press the A Button.”"); const u8 gText_SaveCompletePressA[] = _("Save completed.\n“Please press the A Button.”"); const u8 gText_YourName[] = _("YOUR NAME?"); const u8 gText_BoxName[] = _("BOX NAME?"); const u8 gText_PkmnsNickname[] = _("'s nickname?"); const u8 gText_RivalsName[] = _("RIVAL's NAME?"); const u8 gText_MoveOkBack[] = _("{DPAD_ANY}MOVE {A_BUTTON}OK {B_BUTTON}BACK"); const u8 gText_AlphabetUpperLower[] = _(""); const u8 gText_RegionMap_Space[] = _(" "); const u8 gText_RegionMap_AButtonGuide[] = _("{A_BUTTON}GUIDE"); const u8 gText_RegionMap_AButtonCancel[] = _("{A_BUTTON}CANCEL"); const u8 gText_RegionMap_AButtonCancel2[] = _("{A_BUTTON}CANCEL"); const u8 gText_RegionMap_AButtonSwitch[] = _("{A_BUTTON}SWITCH"); const u8 gText_RegionMap_AButtonOK[] = _("{A_BUTTON}OK"); const u8 gText_RegionMap_DPadMove[] = _("{DPAD_ANY}MOVE"); const u8 gText_RegionMap_UpDownPick[] = _("{DPAD_UPDOWN}PICK"); const u8 gText_RegionMap_NoData[] = _("No data"); const u8 gText_RegionMap_AreaDesc_ViridianForest[] = _("A deep and sprawling forest that\nextends around VIRIDIAN CITY.\nA natural maze, many people\nbecome lost inside."); const u8 gText_RegionMap_AreaDesc_MtMoon[] = _("A mystical mountain that is known\nfor its frequent meteor falls.\nThe shards of stars that fall\nhere are known as MOON STONES."); const u8 gText_RegionMap_AreaDesc_DiglettsCave[] = _("A seemingly plain tunnel that was\ndug by wild DIGLETT.\nIt is famous for connecting\nROUTES 2 and 11."); const u8 gText_RegionMap_AreaDesc_VictoryRoad[] = _("A tunnel situated on ROUTE 23.\nIt earned its name because it\nmust be traveled by all TRAINERS\naiming for the top."); const u8 gText_RegionMap_AreaDesc_PokemonMansion[] = _("A decrepit, burned-down mansion\non CINNABAR ISLAND.\nIt got its name because a famous\nPOKéMON researcher lived there."); const u8 gText_RegionMap_AreaDesc_SafariZone[] = _("An amusement park outside FUCHSIA\nCITY where many rare POKéMON can\nbe observed in the wild.\nCatch them in a popular game!"); const u8 gText_RegionMap_AreaDesc_RockTunnel[] = _("A naturally formed underground\ntunnel. Because it has not been\ndeveloped, it is inky dark inside.\nA light is needed to get through."); const u8 gText_RegionMap_AreaDesc_SeafoamIslands[] = _("A pair of islands that is situated\non ROUTE 20.\nThe two islands are shaped the\nsame, as if they were twins."); const u8 gText_RegionMap_AreaDesc_PokemonTower[] = _("A tower that houses the graves of\ncountless POKéMON.\nMany people visit it daily to pay\ntheir respects to the fallen."); const u8 gText_RegionMap_AreaDesc_CeruleanCave[] = _("A mysterious cave that is filled\nwith terribly tough POKéMON.\nIt is so dangerous, the POKéMON\nLEAGUE is in charge of it."); const u8 gText_RegionMap_AreaDesc_PowerPlant[] = _("A power plant that was abandoned\nyears ago, though some of the\nmachines still work. It is infested\nwith electric POKéMON."); const u8 gText_RegionMap_AreaDesc_MtEmber[] = _("Supposedly an inactive volcano.\nHowever, there are persistent\nreports that the peak blazes\nwith fire at night."); const u8 gText_RegionMap_AreaDesc_BerryForest[] = _("A forest on a small islet off the\ncoast of THREE ISLAND. BERRIES\ngrow wildly in profusion, quickly\nreplenishing those that fall off."); const u8 gText_RegionMap_AreaDesc_IcefallCave[] = _("A cave which is covered by water\nand ice on FOUR ISLAND.\nIt seems like the end of the cave\nis connected to the ocean."); const u8 gText_RegionMap_AreaDesc_LostCave[] = _("A bewildering cave off the coast\nof RESORT GORGEOUS.\nSome curious thrill seekers have\nnever emerged from it."); const u8 gText_RegionMap_AreaDesc_TanobyRuins[] = _("An ancient ruin that is rumored to\nbe home to a peculiar POKéMON.\nHowever, so far, the POKéMON\nremains an unconfirmed rumor."); const u8 gText_RegionMap_AreaDesc_AlteringCave[] = _("This island has been known by this\nname since the distant past.\nNo one today knows where it got\nthis name, however."); const u8 gText_RegionMap_AreaDesc_PatternBush[] = _("A lush and bush-like area. \nIn it are patterns where no grass\ngrows. Some study it in the belief\nthat a secret is concealed."); const u8 gText_RegionMap_AreaDesc_DottedHole[] = _("A mysterious, just-discovered\nruin from an ancient time.\nIt got its name from the six dots\non its door."); const u8 gText_PokeSum_MetInATrade[] = _("{DYNAMIC 0x00} nature.\nMet in a trade."); const u8 gText_PokeSum_MetInATrade_BoldGentleGrammar[] = _("{DYNAMIC 0x00} nature.\nMet in a trade."); const u8 gText_PokeSum_FatefulEncounterMet[] = _("{DYNAMIC 0x00} nature.\nMet in a fateful encounter when\nat {LV_2} {DYNAMIC 0x01}."); const u8 gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar[] = _("{DYNAMIC 0x00} nature.\nMet in a fateful encounter when\nat {LV_2} {DYNAMIC 0x01}."); const u8 gText_PokeSum_Met[] = _("{DYNAMIC 0x00} nature.\nMet in {DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}."); const u8 gText_PokeSum_Met_BoldGentleGrammar[] = _("{DYNAMIC 0x00} nature.\nMet in {DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}."); const u8 gText_PokeSum_ApparentlyMet[] = _("{DYNAMIC 0x00} nature.\nApparently met in {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}."); const u8 gText_PokeSum_ApparentlyMet_BoldGentleGrammar[] = _("{DYNAMIC 0x00} nature.\nApparently met in {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}."); const u8 gText_PokeSum_Hatched[] = _("{DYNAMIC 0x00} nature.\nHatched: {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}."); const u8 gText_PokeSum_Hatched_BoldGentleGrammar[] = _("{DYNAMIC 0x00} nature.\nHatched: {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}."); const u8 gText_PokeSum_JP_ApparentlyHatched[] = _("{DYNAMIC 0x00}なせいかく {LV_2}{DYNAMIC 0x01}のとき\n{DYNAMIC 0x02}で かえった ようだ"); const u8 gText_PokeSum_JP_ApparentlyHatched_BoldGentleGrammar[] = _("{DYNAMIC 0x00}せいかく {LV_2}{DYNAMIC 0x01}のとき\n{DYNAMIC 0x02}で かえった ようだ"); const u8 gText_PokeSum_FatefulEncounterHatched[] = _("{DYNAMIC 0x00} nature. Met in a fateful\nencounter (hatched: {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01})."); const u8 gText_PokeSum_FatefulEncounterHatched_BoldGentleGrammar[] = _("{DYNAMIC 0x00} nature. Met in a fateful\nencounter (hatched: {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01})."); const u8 gText_PokeSum_ApparentlyFatefulEncounterHatched[] = _("{DYNAMIC 0x00} nature. Apparently met in\na fateful encounter (hatched:\n{DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01})."); const u8 gText_PokeSum_ApparentlyFatefulEncounterHatched_BoldGentleGrammar[] = _("{DYNAMIC 0x00} nature. Apparently met in\na fateful encounter (hatched:\n{DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01})."); const u8 gText_PokeSum_EggOrigin_DayCare[] = _("An odd POKéMON EGG found by the\nDAY-CARE couple."); const u8 gText_PokeSum_EggOrigin_TravelingMan[] = _("An odd POKéMON EGG obtained from\nthe traveling man."); const u8 gText_PokeSum_EggOrigin_NicePlace[] = _("A wondrously peculiar POKéMON EGG\nobtained at a nice place."); const u8 gText_PokeSum_EggOrigin_Spa[] = _("An odd POKéMON EGG obtained from\nan old woman at the SPA."); const u8 gText_PokeSum_EggOrigin_Trade[] = _("A peculiar POKéMON EGG obtained\nin a trade."); const u8 gText_PokeSum_EggHatch_LongTime[] = _("It looks like this\nEGG will take a\nlong time to hatch."); const u8 gText_PokeSum_EggHatch_SomeTime[] = _("What will hatch\nfrom this? It will\ntake some time."); const u8 gText_PokeSum_EggHatch_Soon[] = _("It occasionally\nmoves. It should\nhatch soon."); const u8 gText_PokeSum_EggHatch_AlmostReady[] = _("It's making sounds.\nIt's almost ready\nto hatch!"); const u8 gText_PokeSum_ATrade[] = _("a trade"); const u8 gText_Somewhere[] = _("Somewhere"); const u8 gText_PokeSum_PageName_PokemonInfo[] = _("POKéMON INFO"); const u8 gText_PokeSum_PageName_PokemonSkills[] = _("POKéMON SKILLS"); const u8 gText_PokeSum_PageName_KnownMoves[] = _("KNOWN MOVES"); const u8 gText_PokeSum_NoData[] = _("No data"); const u8 gText_PokeSum_ExpPoints[] = _("EXP. POINTS"); const u8 gText_PokeSum_NextLv[] = _("NEXT LV."); const u8 gText_PokeSum_Controls_PageCancel[] = _("{DPAD_RIGHT}PAGE {A_BUTTON}CANCEL"); const u8 gText_PokeSum_Controls_Cancel[] = _("{A_BUTTON}CANCEL"); const u8 gText_PokeSum_Controls_Page[] = _("{DPAD_LEFTRIGHT}PAGE"); const u8 gText_PokeSum_Controls_PageDetail[] = _("{DPAD_LEFT}PAGE {A_BUTTON}DETAIL"); const u8 gText_PokeSum_Controls_PickSwitch[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}SWITCH"); const u8 gText_PokeSum_Controls_Pick[] = _("{DPAD_UPDOWN}PICK"); const u8 gText_PokeSum_Controls_PickDelete[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}DELETE"); const u8 gText_PokeSum_HmMovesCantBeForgotten[] = _("HM moves can't be\nforgotten now."); const u8 gText_TrainerCardName[] = _("NAME: "); const u8 gText_TrainerCardIDNo[] = _("IDNo."); const u8 gText_TrainerCardMoney[] = _("MONEY"); const u8 gText_TrainerCardYen[] = _("¥"); const u8 gText_TrainerCardPokedex[] = _("POKéDEX"); const u8 gText_TrainerCardNull[] = _(""); const u8 gText_Colon2[] = _(":"); const u8 gText_TrainerCardTime[] = _("TIME"); const u8 gText_Var1sTrainerCard[] = _("'s TRAINER CARD"); const u8 gText_HallOfFameDebut[] = _("HALL OF FAME DEBUT "); const u8 gText_LinkBattles[] = _("LINK BATTLES"); const u8 gText_LinkCableBattles[] = _("LINK CABLE BATTLES"); const u8 gText_WinLossRatio[] = _("W:{CLEAR_TO 0x30}L:"); const u8 gText_PokemonTrades[] = _("POKéMON TRADES"); const u8 gText_UnionRoomTradesBattles[] = _("UNION TRADES & BATTLES"); const u8 gText_BerryCrushes[] = _("BERRY CRUSH"); const u8 gText_WaitingTrainerFinishReading[] = _("Waiting for the other TRAINER to\nfinish reading your TRAINER CARD."); const u8 gText_Option[] = _("OPTION"); const u8 gText_TextSpeed[] = _("TEXT SPEED"); const u8 gText_BattleScene[] = _("BATTLE SCENE"); const u8 gText_BattleStyle[] = _("BATTLE STYLE"); const u8 gText_Sound[] = _("SOUND"); const u8 gText_ButtonMode[] = _("BUTTON MODE"); const u8 gText_Frame[] = _("FRAME"); const u8 gText_OptionMenuCancel[] = _("CANCEL"); const u8 gText_OptionMenuSaveAndExit[]= _("SAVE AND EXIT"); const u8 gText_OptionMenuBattleAnimSpeed[] = _("BATTLE ANIM SPEED"); const u8 gText_BattleTransitions[] = _("BATTLE TRANSITIONS"); const u8 gText_BattleIntroAnimation[] = _("BATTLE INTRO ANIM"); const u8 gText_MoveAnims[] = _("MOVE ANIMATIONS"); const u8 gText_HpBarAnimSpeed[] = _("HP BAR ANIM SPEED"); const u8 gText_ExpBarAnimSpeed[] = _("EXP. BAR ANIM SPEED"); const u8 gText_Back[] = _("BACK"); const u8 gText_Advanced[] = _("ADVANCED KEYS"); const u8 gText_TextSpeedSlow[] = _("SLOW"); const u8 gText_TextSpeedMid[] = _("MID"); const u8 gText_TextSpeedFast[] = _("FAST"); const u8 gText_TextSpeedFaster[] = _("FASTER"); const u8 gText_BattleScenePressA[] = _("PRESS {FONT_A_BUTTON}"); const u8 gText_BattleSceneOn[] = _("ON"); const u8 gText_BattleSceneOff[] = _("OFF"); const u8 gText_BattleStylePredict[] = _("PREDICT"); const u8 gText_BattleStyleShift[] = _("SWITCH"); const u8 gText_BattleStyleSet[] = _("SET"); const u8 gText_SoundMono[] = _("MONO"); const u8 gText_SoundStereo[] = _("STEREO"); const u8 gText_ButtonTypeHelp[] = _("HELP"); const u8 gText_ButtonTypeLEqualsA[] = _("L=A"); const u8 gText_ButtonTypeLR[] = _("LR"); const u8 gText_FrameType[] = _("TYPE"); const u8 gText_PickSwitchCancelA[] = _("{A_BUTTON}GO {L_BUTTON}HELP{CLEAR 13}{DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH{CLEAR 13}{B_BUTTON}SAVE & EXIT"); const u8 gText_PickSwitchCancel[] = _("{L_BUTTON}HELP{CLEAR 13}{DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH{CLEAR 13}{B_BUTTON}SAVE & EXIT"); const u8 gText_PickSwitchExit[] = _("{L_BUTTON}HELP{CLEAR 13}{DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH {A_BUTTON}{B_BUTTON}SAVE & EXIT"); const u8 gText_PickSwitchBack[] = _("{L_BUTTON}HELP{CLEAR 13}{DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH{CLEAR 40}{A_BUTTON}{B_BUTTON}BACK"); const u8 gText_SavingDontTurnOffThePower2[] = _("SAVING…\nDON'T TURN OFF THE POWER."); const u8 gText_TextSpeedInstant[] = _("INSTANT"); // Start menu option descriptions const u8 gStartMenuDesc_Pokedex[] = _("A device that records POKéMON secrets\nupon meeting or catching them."); const u8 gStartMenuDesc_Pokemon[] = _("Check and organize POKéMON that are\ntraveling with you in your party."); const u8 gStartMenuDesc_Bag[] = _("Equipped with pockets for storing items\nyou bought, received, or found."); const u8 gStartMenuDesc_Player[] = _("Check your money and other game data."); const u8 gStartMenuDesc_Save[] = _("Save your game with a complete record\nof your progress to take a break."); const u8 gStartMenuDesc_Option[] = _("Adjust various game settings such as text\nspeed, game rules, etc."); const u8 gStartMenuDesc_Exit[] = _("Close this MENU window."); const u8 gStartMenuDesc_Retire[] = _("Retire from the SAFARI GAME and return to\nthe registration counter."); #include "data/text/quest_log.h" const u8 gText_WasUsedOn[] = _(" was used on\n"); const u8 gText_Period[] = _("."); const u8 gText_LevelRoseTo[] = _("'s level rose to\n"); const u8 gText_Period2[] = _("."); const u8 gText_LevelUp_MaxHP[] = _("{FONT_SMALL}MAX.{FONT_NORMAL} HP"); const u8 gText_LevelUp_Attack[] = _("ATTACK"); const u8 gText_LevelUp_Defense[] = _("DEFENSE"); const u8 gText_LevelUp_Speed[] = _("SPEED"); const u8 gText_LevelUp_SpAtk[] = _("SP. ATK"); const u8 gText_LevelUp_SpDef[] = _("SP. DEF"); const u8 gText_LevelUp_Plus[] = _("{FONT_SMALL}{PLUS}{FONT_NORMAL}"); const u8 gText_LevelUp_Minus[] = _("{FONT_SMALL}-{FONT_NORMAL}"); const u8 gText_Counting_1[] = _("1, "); const u8 gText_Counting_2And[] = _("2, and ‥ ‥ ‥ "); const u8 gText_Poof[] = _("Poof!\p"); const u8 gText_MonForgotMove[] = _("{DYNAMIC 0x00} forgot\n{DYNAMIC 0x01}.\p"); const u8 gText_And[] = _("And‥\p"); const u8 gText_MachineSet[] = _("Machine set!\p"); const u8 gText_Huh[] = _("Huh?"); const u8 gText_MonLearnedTMHM[] = _("{DYNAMIC 0x00} learned\n{DYNAMIC 0x01}!"); const u8 gText_Upper[] = _("UPPER"); const u8 gText_Lower[] = _("lower"); const u8 gText_Others[] = _("OTHERS"); const u8 gText_Symbols[] = _("SYMBOLS"); const u8 gText_Register2[] = _("REGISTER"); const u8 gText_Exit[] = _("EXIT"); const u8 gText_QuitChatting[] = _("Quit chatting?"); const u8 gText_RegisterTextWhere[] = _("Register text where?"); const u8 gText_RegisterTextHere[] = _("Register text here?"); const u8 gText_InputText[] = _("Input text."); const u8 gText_F700JoinedChat[] = _("{DYNAMIC 0x00} joined the chat!"); const u8 gText_F700LeftChat[] = _("{DYNAMIC 0x00} left the chat."); const u8 gText_ExitingTheChat[] = _("Exiting the chat‥"); const u8 gText_LeaderHasLeftEndingChat[] = _("The LEADER, {DYNAMIC 0x00}, has\nleft, ending the chat."); const u8 gText_RegisteredTextChanged_OKtoSave[] = _("The registered text has been changed.\nIs it okay to save the game?"); const u8 gText_RegisteredTextChanged_AlreadySavedFile[] = _("There is already a saved file.\nIs it okay to overwrite it?"); const u8 gText_RegisteredTextChanged_SavingDontTurnOff[] = _("SAVING‥\nDON'T TURN OFF THE POWER."); const u8 gText_RegisteredTextChanged_SavedTheGame[] = _("{DYNAMIC 0x00} saved the game."); const u8 gText_IfLeaderLeavesChatWillEnd[] = _("If the LEADER leaves, the chat\nwill end. Is that okay?"); const u8 gText_Hello[] = _("HELLO"); const u8 gText_Pokemon2[] = _("POKéMON"); const u8 gText_Trade[] = _("TRADE"); const u8 gText_Battle[] = _("BATTLE"); const u8 gText_Lets[] = _("LET'S"); const u8 gText_Ok[] = _("OK!"); const u8 gText_Sorry[] = _("SORRY"); const u8 gText_YaySmileEmoji[] = _("YAY{EMOJI_BIGSMILE}"); const u8 gText_ThankYou[] = _("THANK YOU"); const u8 gText_ByeBye[] = _("BYE-BYE!"); const u8 gText_PlayerScurriedToCenter[] = _("{PLAYER} scurried to a POKéMON CENTER,\nprotecting the exhausted and fainted\nPOKéMON from further harm‥\p"); const u8 gText_PlayerScurriedBackHome[] = _("{PLAYER} scurried back home, protecting\nthe exhausted and fainted POKéMON from\nfurther harm‥\p"); const u8 gText_Diploma_Player[] = _("PLAYER: {DYNAMIC 0x00}"); const u8 gText_Diploma_ThisDocument[] = _("This document is issued in\nrecognition of your magnificent\nachievement - the completion of\nthe {DYNAMIC 0x01} POKéDEX."); const u8 gText_Diploma_GameFreak[] = _("GAME FREAK"); const u8 gText_Diploma_National[] = _("NATIONAL"); const u8 gText_Diploma_Kanto[] = _("KANTO"); const u8 gText_ClearAllSaveData[] = _("Clear all save data areas?"); const u8 gText_ClearingData[] = _("Clearing data‥\nPlease wait."); const u8 gText_Player[] = _("PLAYER"); const u8 gText_Time[] = _("TIME"); const u8 gText_Colon[] = _(":"); const u8 gText_Pokedex[] = _("POKéDEX"); const u8 gTextJPDummy_Hiki[] = _(""); const u8 gText_Badges[] = _("BADGES"); const u8 gTextJPDummy_Ko[] = _(""); const u8 gText_Register[] = _("REGISTER"); const u8 gText_HatchedFromEgg[] = _("{STR_VAR_1} hatched from the EGG!"); const u8 gText_NickHatchPrompt[] = _("Would you like to nickname the newly\nhatched {STR_VAR_1}?"); const u8 gString_OutOfCoins[] = _("You've run out of COINS.\nGame over!"); const u8 gString_QuitPlaying[] = _("Quit playing?"); const u8 gString_SlotMachineControls[] = _("{DPAD_LEFTRIGHT}COMBOS {DPAD_DOWN}WAGER {A_BUTTON}STOP {B_BUTTON}EXIT"); #include "data/text/teachy_tv.h" const u8 gString_Bill[] = _("BILL"); const u8 gString_Someone[] = _("SOMEONE"); const u8 gString_Help[] = _("HELP"); const u8 gString_HelpSystem_ClearTo8[] = _("{CLEAR_TO 8}"); const u8 gText_SpacePoints2[] = _(" points"); const u8 gText_SpaceTimes3[] = _(" time(s)"); const u8 gText_PkmnJumpRecords[] = _("POKéMON JUMP RECORDS"); const u8 gText_JumpsInARow[] = _("Jumps in a row:"); const u8 gText_BestScore2[] = _("Best score:"); const u8 gText_ExcellentsInARow[] = _("EXCELLENTS in a row:"); const u8 gText_AwesomeWonF701F700[] = _("Awesome score! You've\nwon {DYNAMIC 01} {DYNAMIC 00}!"); const u8 gText_FilledStorageSpace2[] = _("There's no room left now."); const u8 gText_CantHoldMore[] = _("You can't hold any more!"); const u8 gText_WantToPlayAgain2[] = _("Want to play again?"); const u8 gText_SomeoneDroppedOut2[] = _("Somebody dropped out.\nThe link will be canceled."); const u8 gText_SavingDontTurnOffPower[] = _("SAVING…\nDON'T TURN OFF THE POWER."); const u8 gText_CommunicationStandby4[] = _("Communication standby…"); const u8 gText_SavingDontTurnOffPower2[] = _("SAVING...\nDON'T TURN OFF THE POWER."); // Unused const u8 gText_BerryPickingRecords[] = _("DODRIO BERRY-PICKING RECORDS"); const u8 gText_BerriesPicked[] = _("BERRIES picked:"); const u8 gText_BestScore[] = _("Best score:"); const u8 gText_BerriesInRowFivePlayers[] = _("BERRIES picked in a row with\nfive players:"); const u8 gText_BerryPickingResults[] = _("Announcing BERRY-PICKING results!"); const u8 gText_10P30P50P50P[] = _("10P 30P 50P {EMOJI_MINUS}50P"); const u8 gText_AnnouncingRankings[] = _("Announcing rankings!"); const u8 gText_AnnouncingPrizes[] = _("Announcing prizes!"); const u8 gText_1Colon[] = _("1:"); const u8 gText_2Colon[] = _("2:"); const u8 gText_3Colon[] = _("3:"); const u8 gText_4Colon[] = _("4:"); const u8 gText_5Colon[] = _("5:"); const u8 gText_FirstPlacePrize[] = _("The first-place winner gets\nthis {DYNAMIC 00}!"); const u8 gText_CantHoldAnyMore[] = _("You can't hold any more..."); const u8 gText_FilledStorageSpace[] = _("It filled its storage space."); const u8 gText_WantToPlayAgain[] = _("Want to play again?"); const u8 gText_SomeoneDroppedOut[] = _("Somebody dropped out.\nThe link will be canceled."); const u8 gText_SpacePoints[] = _(" points"); const u8 gText_CommunicationStandby3[] = _("Communication standby…"); ALIGNED(4) const u8 gText_BerryCrush_AreYouReady[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p"); ALIGNED(4) const u8 gText_BerryCrush_WaitForOthersToChooseBerry[] = _("Please wait while each member\nchooses a BERRY."); ALIGNED(4) const u8 gText_BerryCrush_GainedXUnitsOfPowder[] = _("{PAUSE_MUSIC}{PLAY_BGM MUS_LEVEL_UP}You ended up with {STR_VAR_1} units of\nsilky-smooth BERRY POWDER.{RESUME_MUSIC}\pYour total amount of BERRY POWDER\nis {STR_VAR_2}.\p"); ALIGNED(4) const u8 gText_BerryCrush_RecordingGameResults[] = _("Recording your game results in the\nsave file.\nPlease wait."); ALIGNED(4) const u8 gText_BerryCrush_WantToPlayAgain[] = _("Want to play BERRY CRUSH again?"); ALIGNED(4) const u8 gText_BerryCrush_NoBerries[] = _("You have no BERRIES.\nThe game will be canceled."); ALIGNED(4) const u8 gText_BerryCrush_MemberDroppedOut[] = _("A member dropped out.\nThe game will be canceled."); ALIGNED(4) const u8 gText_BerryCrush_TimeUp[] = _("Time's up.\pGood BERRY POWDER could not be\nmade…\p"); ALIGNED(4) const u8 gText_BerryCrush_CommunicationStandby[] = _("Communication standby…"); ALIGNED(4) const u8 gText_1_ClrBluShdwLtBlu_Dynamic0[] = _("1. {COLOR BLUE}{SHADOW LIGHT_BLUE}{DYNAMIC 0x00}"); const u8 gText_1_Dynamic0[] = _("1. {DYNAMIC 0x00}"); ALIGNED(4) const u8 gText_SpaceTimes2[] = _(" times"); ALIGNED(4) const u8 gText_XDotY[] = _("{STR_VAR_1}.{STR_VAR_2}"); ALIGNED(4) const u8 gText_StrVar1Berry[] = _("{STR_VAR_1} BERRY"); ALIGNED(4) const u8 gText_TimeColon[] = _("Time:"); ALIGNED(4) const u8 gText_PressingSpeed[] = _("Pressing Speed:"); const u8 gText_Silkiness[] = _("Silkiness:"); ALIGNED(4) const u8 gText_StrVar1[] = _("{STR_VAR_1}"); ALIGNED(4) const u8 gText_SpaceMin[] = _("min."); ALIGNED(4) const u8 gText_XDotY2[] = _("{STR_VAR_1}.{STR_VAR_2}"); ALIGNED(4) const u8 gText_SpaceSec[] = _("sec."); ALIGNED(4) const u8 gText_XDotY3[] = _("{STR_VAR_1}.{STR_VAR_2}"); ALIGNED(4) const u8 gText_TimesPerSec[] = _("Times/sec."); ALIGNED(4) const u8 gText_Var1Percent[] = _("{STR_VAR_1}%"); ALIGNED(4) const u8 gText_PressesRankings[] = _("No. of Presses Rankings"); ALIGNED(4) const u8 gText_CrushingResults[] = _("Crushing Results"); ALIGNED(4) const u8 gText_NeatnessRankings[] = _("Neatness Rankings"); ALIGNED(4) const u8 gText_CooperativeRankings[] = _("Cooperative Rankings"); ALIGNED(4) const u8 gText_PressingPowerRankings[] = _("Pressing-Power Rankings"); const u8 gText_BerryCrush2[] = _("BERRY CRUSH"); const u8 gText_PressingSpeedRankings[] = _("Pressing-Speed Rankings"); const u8 gText_Var1Players[] = _("{STR_VAR_1} PLAYERS"); ALIGNED(4) const u8 gText_Ghost[] = _("GHOST"); const u8 gText_PokemonOnHook[] = _("A POKéMON's on the hook!{PAUSE_UNTIL_PRESS}"); const u8 gText_NotEvenANibble[] = _("Not even a nibble‥{PAUSE_UNTIL_PRESS}"); const u8 gText_ItGotAway[] = _("It got away‥{PAUSE_UNTIL_PRESS}"); const u8 gText_Rooftop2[] = _("ROOFTOP"); ALIGNED(4) const u8 gString_PokemonFireRed_Staff[] = _("Pokémon FireRed Version\nStaff"); ALIGNED(4) const u8 gString_PokemonLeafGreen_Staff[] = _("Pokémon LeafGreen Version\nStaff"); ALIGNED(4) const u8 gCreditsString_Director[] = _("\n\nDirector\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Junichi_Masuda[] = _("\n\n\nJunichi Masuda\n\n\n"); ALIGNED(4) const u8 gCreditsString_Art_Director_Battle_Director[] = _("\nArt Director\n\nBattle Director\n\n\n"); ALIGNED(4) const u8 gCreditsString_Ken_Sugimori_Shigeki_Morimoto[] = _("\n\nKen Sugimori\n\nShigeki Morimoto\n\n"); ALIGNED(4) const u8 gCreditsString_Program_Leader_Planning_Leader_Graphic_Design_Leader[] = _("Program Leader\n\nPlanning Leader\n\nGraphic Design Leader\n\n"); ALIGNED(4) const u8 gCreditsString_Tetsuya_Watanabe_Koji_Nishino_Takao_Unno[] = _("\nTetsuya Watanabe\n\nKoji Nishino\n\nTakao Unno\n"); ALIGNED(4) const u8 gCreditsString_Programmers[] = _("Programmers\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Hiroyuki_Nakamura_Masao_Taya_Satoshi_Nohara_Miyuki_Iwasawa_Daisuke_Goto[] = _("\nHiroyuki Nakamura\nMasao Taya\nSatoshi Nohara\nMiyuki Iwasawa\nDaisuke Goto\n"); ALIGNED(4) const u8 gCreditsString_System_Programmers[] = _("System Programmers\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Tetsuya_Watanabe_Akito_Mori_Hisashi_Sogabe_Sousuke_Tamada[] = _("\nTetsuya Watanabe\nAkito Mori\nHisashi Sogabe\nSousuke Tamada\n\n"); ALIGNED(4) const u8 gCreditsString_Graphic_Designers[] = _("Graphic Designers\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Takao_Unno_Asuka_Iwashita_Kanako_Eo_Hiroki_Fuchino[] = _("\nTakao Unno\nAsuka Iwashita\nKanako Eo\nHiroki Fuchino\n\n"); ALIGNED(4) const u8 gCreditsString_Graphic_Designers_2[] = _("\nGraphic Designers\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Ken_Sugimori_Hironobu_Yoshida[] = _("\n\nKen Sugimori\nHironobu Yoshida\n\n\n"); ALIGNED(4) const u8 gCreditsString_Music_Composition[] = _("\nMusic Composition\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Go_Ichinose_Junichi_Masuda[] = _("\n\nGo Ichinose\nJunichi Masuda\n\n\n"); ALIGNED(4) const u8 gCreditsString_Sound_Effects[] = _("\n\nSound Effects\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Go_Ichinose[] = _("\n\n\nGo Ichinose\n\n\n"); ALIGNED(4) const u8 gCreditsString_Game_Designers[] = _("\nGame Designers\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Junichi_Masuda_Koji_Nishino_Tetsuji_Ohta[] = _("\n\nJunichi Masuda\nKoji Nishino\nTetsuji Ohta\n\n"); ALIGNED(4) const u8 gCreditsString_Game_Designers_2[] = _("\nGame Designers\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Hitomi_Sato_Shigeru_Ohmori_Tadashi_Takahashi[] = _("\n\nHitomi Sato\nShigeru Ohmori\nTadashi Takahashi\n\n"); ALIGNED(4) const u8 gCreditsString_Game_Scenario[] = _("\nGame Scenario\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Hitomi_Sato_Satoshi_Tajiri[] = _("\n\nHitomi Sato\nSatoshi Tajiri\n\n\n"); ALIGNED(4) const u8 gCreditsString_Script_Designer_Map_Designer[] = _("\nScript Designer\n\nMap Designer\n\n\n"); ALIGNED(4) const u8 gCreditsString_Satoshi_Nohara_Shigeru_Ohmori[] = _("\n\nSatoshi Nohara\n\nShigeru Ohmori\n\n"); ALIGNED(4) const u8 gCreditsString_Parametric_Designers[] = _("\nParametric Designers\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Koji_Nishino_Tetsuji_Ohta_Shigeki_Morimoto[] = _("\n\nKoji Nishino\nTetsuji Ohta\nShigeki Morimoto\n\n"); ALIGNED(4) const u8 gCreditsString_POKeDEX_Text[] = _("\n\nPOKéDEX Text\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Kenji_Matsushima[] = _("\n\n\nKenji Matsushima\n\n\n"); ALIGNED(4) const u8 gCreditsString_POKeMON_Designers[] = _("POKéMON Designers\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Ken_Sugimori_Motofumi_Fujiwara_Shigeki_Morimoto_Hironobu_Yoshida[] = _("\nKen Sugimori\nMotofumi Fujiwara\nShigeki Morimoto\nHironobu Yoshida\n\n"); ALIGNED(4) const u8 gCreditsString_POKeMON_Designers_2[] = _("POKéMON Designers\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Satoshi_Ohta_Asuka_Iwashita_Takao_Unno_Kanako_Eo_Aimi_Tomita[] = _("\nSatoshi Ohta\nAsuka Iwashita\nTakao Unno\nKanako Eo\nAimi Tomita\n"); ALIGNED(4) const u8 gCreditsString_POKeMON_Designers_3[] = _("POKéMON Designers\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Atsuko_Nishida_Muneo_Saito_Rena_Yoshikawa_Jun_Okutani[] = _("\nAtsuko Nishida\nMuneo Saito\nRena Yoshikawa\nJun Okutani\n\n"); ALIGNED(4) const u8 gCreditsString_Supporting_Programmers[] = _("Supporting Programmers\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Teruyuki_Yoshioka_Takao_Nakano_Satoshi_Mitsuhara_Daisuke_Hoshino[] = _("\nTeruyuki Yoshioka\nTakao Nakano\n\nSatoshi Mitsuhara\nDaisuke Hoshino\n"); ALIGNED(4) const u8 gCreditsString_NCL_Product_Testing[] = _("\n\nNCL Product Testing\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_NCL_Super_Mario_Club[] = _("\n\n\nNCL Super Mario Club\n\n\n"); ALIGNED(4) const u8 gCreditsString_Special_Thanks[] = _("Special Thanks\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Hiro_Nakamura_Hiroyuki_Uesugi_Teruki_Murakawa_Kazuya_Suyama[] = _("\nHiro Nakamura\nHiroyuki Uesugi\nTeruki Murakawa\n\nKazuya Suyama\n"); ALIGNED(4) const u8 gCreditsString_Special_Thanks_2[] = _("Special Thanks\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Kenji_Tominaga_Kenjiro_Ito_Tomotaka_Komura_Michiko_Takizawa[] = _("\nKenji Tominaga\n\nKenjiro Ito\nTomotaka Komura\nMichiko Takizawa\n"); ALIGNED(4) const u8 gCreditsString_Special_Thanks_3[] = _("Special Thanks\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Makiko_Takada_Mikiko_Ohashi_Shusaku_Egami_Takanao_Kondo_Rui_Kawaguchi[] = _("\nMakiko Takada\nMikiko Ohashi\nShusaku Egami\nTakanao Kondo\nRui Kawaguchi\n"); ALIGNED(4) const u8 gCreditsString_Braille_Code_Check[] = _("\n\nBraille Code Check\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Japan_Braille_Library[] = _("\n\n\nJapan Braille Library\n\n\n"); ALIGNED(4) const u8 gCreditsString_Information_Supervisors[] = _("Information Supervisors\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Hiroki_Enomoto_Kazuyuki_Terada_Yuri_Sakurai_Yumi_Funasaka_Naoko_Yanase[] = _("\nHiroki Enomoto\nKazuyuki Terada\nYuri Sakurai\nYumi Funasaka\nNaoko Yanase\n"); ALIGNED(4) const u8 gCreditsString_Coordinators[] = _("Coordinators\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Azusa_Tajima_Akira_Kinashi_Kazuki_Yoshihara_Retsuji_Nomoto[] = _("\nAzusa Tajima\nAkira Kinashi\nKazuki Yoshihara\n\nRetsuji Nomoto\n"); ALIGNED(4) const u8 gCreditsString_Task_Managers[] = _("\nTask Managers\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Hitoshi_Yamagami_Gakuji_Nomoto[] = _("\n\nHitoshi Yamagami\nGakuji Nomoto\n\n\n"); ALIGNED(4) const u8 gCreditsString_Producers[] = _("\nProducers\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Hiroyuki_Jinnai_Takehiro_Izushi_Hiroaki_Tsuru[] = _("\n\nHiroyuki Jinnai\nTakehiro Izushi\nHiroaki Tsuru\n\n"); ALIGNED(4) const u8 gCreditsString_Executive_Director[] = _("\n\nExecutive Director\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Satoshi_Tajiri[] = _("\n\n\nSatoshi Tajiri\n\n\n"); ALIGNED(4) const u8 gCreditsString_Executive_Producer[] = _("\n\nExecutive Producer\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Satoru_Iwata[] = _("\n\n\nSatoru Iwata\n\n\n"); ALIGNED(4) const u8 gCreditsString_Executive_Producer_2[] = _("\n\nExecutive Producer\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Tsunekaz_Ishihara[] = _("\n\n\nTsunekaz Ishihara\n\n\n"); ALIGNED(4) const u8 gCreditsString_English_Version_Coordinators[] = _("\nEnglish Version Coordinators\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Hiro_Nakamura_Seth_McMahill[] = _("\n\nHiro Nakamura\nSeth McMahill\n\n\n"); ALIGNED(4) const u8 gCreditsString_Translator_Text_Editor[] = _("\nTranslator\n\nText Editor\n\n\n"); ALIGNED(4) const u8 gCreditsString_Nob_Ogasawara_Teresa_Lillygren[] = _("\n\nNob Ogasawara\n\nTeresa Lillygren\n\n"); ALIGNED(4) const u8 gCreditsString_Programmers_2[] = _("Programmers\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Yuichiro_Ito_Akira_Kinashi[] = _("\nTeruki Murakawa\nSouichi Yamamoto\nYuichiro Ito\nAkira Kinashi\n\n"); ALIGNED(4) const u8 gCreditsString_Environment_Tool_Programmers[] = _("\nEnvironment & Tool Programmers\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Kimiko_Nakamichi[] = _("\n\nTeruki Murakawa\nSouichi Yamamoto\nKimiko Nakamichi\n\n"); ALIGNED(4) const u8 gCreditsString_NOA_Product_Testing[] = _("NOA Product Testing\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Thomas_Hertzog_Kathy_Huguenard_Mika_Kurosawa[] = _("\nThomas Hertzog\nKathy Huguenard\nMika Kurosawa\n\n\n"); ALIGNED(4) const u8 gCreditsString_Braille_Code_Check_2[] = _("Braille Code Check\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_National_Federation_of_the_Blind_Patricia_A_Maurer_Japan_Braille_Library_European_Blind_Union[] = _("\nNational Federation\n{CLEAR_TO 0x13}of the Blind\nPatricia A. Maurer\nJapan Braille Library\nEuropean Blind Union\n"); ALIGNED(4) const u8 gCreditsString_Braille_Code_Check_3[] = _("\nBraille Code Check\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_National_Information_Library_Service_Margaret_Campion[] = _("\n\nNational Information Library\n{CLEAR_TO 0x2D}Service\nMargaret Campion\n\n"); ALIGNED(4) const u8 gCreditsString_Special_Thanks_4[] = _("Special Thanks\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Takehiro_Izushi_Motoyasu_Tojima_Hitoshi_Yamagami_Hiroyuki_Uesugi[] = _("\nTakehiro Izushi\nMotoyasu Tojima\nHitoshi Yamagami\nHiroyuki Uesugi\n\n"); ALIGNED(4) const u8 gCreditsString_Special_Thanks_5[] = _("Special Thanks\n\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Nicola_Pratt_Barlow_Shellie_Dow_Anthony_Howitt_Naoko_Saeki_Kyoko_Onishi[] = _("\nNicola Pratt-Barlow\nShellie Dow\nAnthony Howitt\nNaoko Saeki\nKyoko Onishi\n"); ALIGNED(4) const u8 gCreditsString_Braille_Code_Check_4[] = _("\nBraille Code Check\n\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_The_Royal_New_Zealand_Foundation_of_the_Blind_Greg_Moran[] = _("\n\nThe Royal New Zealand\nFoundation of the Blind\nGreg Moran\n\n"); ALIGNED(4) const u8 gCreditsString_Graphic_Designer[] = _("\n\nGraphic Designer\n\n\n\n"); ALIGNED(4) const u8 gCreditsString_Akira_Kinashi[] = _("\n\n\nAkira Kinashi\n\n\n"); const u8 gJPText_MysteryGift[] = _(""); const u8 gJPText_DecideStop[] = _(""); const u8 gJPText_ReceiveMysteryGiftWithEReader[] = _(""); const u8 gJPText_SelectConnectFromEReaderMenu[] = _(""); const u8 gJPText_SelectConnectWithGBA[] = _(""); const u8 gJPText_LinkIsIncorrect[] = _(""); const u8 gJPText_CardReadingHasBeenHalted[] = _(""); const u8 gJPText_Connecting[] = _(""); const u8 gJPText_ConnectionErrorCheckLink[] = _(""); const u8 gJPText_ConnectionErrorTryAgain[] = _(""); const u8 gJPText_AllowEReaderToLoadCard[] = _(""); const u8 gJPText_ConnectionComplete[] = _(""); const u8 gJPText_NewTrainerHasComeToSevii[] = _(""); const u8 gJPText_PleaseWaitAMoment[] = _(""); const u8 gJPText_WriteErrorUnableToSaveData[] = _(""); const u8 gText_CommErrorCheckConnections[] = _("Communication error…\nPlease check all connections,\nthen turn the power OFF and ON."); const u8 gText_CommErrorEllipsis[] = _("Communication error…"); const u8 gText_MoveCloserToLinkPartner[] = _("Move closer to your link partner(s).\nAvoid obstacles between partners."); const u8 gText_ABtnRegistrationCounter[] = _("A Button: Registration Counter"); const u8 gText_ABtnTitleScreen[] = _("A Button: Title Screen"); const u8 gText_NumPlayerLink[] = _("{STR_VAR_1}P LINK"); const u8 gText_BronzeCard[] = _("BRONZE"); const u8 gText_CopperCard[] = _("COPPER"); const u8 gText_SilverCard[] = _("SILVER"); const u8 gText_GoldCard[] = _("GOLD"); const u8 gText_HelpSystemControls_A_Next[] = _("{A_BUTTON}NEXT"); const u8 gText_HelpSystemControls_PickOkEnd[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}END"); const u8 gText_HelpSystemControls_AorBtoCancel[] = _("{A_BUTTON}{B_BUTTON}CANCEL"); const u8 gText_HelpSystemControls_PickOkCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL"); const u8 gEasyChatGroupName_Pokemon[] = _("POKéMON"); const u8 gEasyChatGroupName_Trainer[] = _("TRAINER"); const u8 gEasyChatGroupName_Status[] = _("STATUS"); const u8 gEasyChatGroupName_Battle[] = _("BATTLE"); const u8 gEasyChatGroupName_Greetings[] = _("GREETINGS"); const u8 gEasyChatGroupName_People[] = _("PEOPLE"); const u8 gEasyChatGroupName_Voices[] = _("VOICES"); const u8 gEasyChatGroupName_Speech[] = _("SPEECH"); const u8 gEasyChatGroupName_Endings[] = _("ENDINGS"); const u8 gEasyChatGroupName_Feelings[] = _("FEELINGS"); const u8 gEasyChatGroupName_Conditions[] = _("CONDITIONS"); const u8 gEasyChatGroupName_Actions[] = _("ACTIONS"); const u8 gEasyChatGroupName_Lifestyle[] = _("LIFESTYLE"); const u8 gEasyChatGroupName_Hobbies[] = _("HOBBIES"); const u8 gEasyChatGroupName_Time[] = _("TIME"); const u8 gEasyChatGroupName_Misc[] = _("MISC."); const u8 gEasyChatGroupName_Adjectives[] = _("ADJECTIVES"); const u8 gEasyChatGroupName_Events[] = _("EVENTS"); const u8 gEasyChatGroupName_Move1[] = _("MOVE 1"); const u8 gEasyChatGroupName_Move2[] = _("MOVE 2"); const u8 gEasyChatGroupName_TrendySaying[] = _("TRENDY SAYING"); const u8 gEasyChatGroupName_Pokemon2[] = _("POKéMON2"); const u8 gText_ThreeQuestionMarks[] = _("???"); const u8 gText_UnusedEmpty[] = _(""); const u8 gText_UnusedLv[] = _("Lv"); const u8 gText_UnusedDashes[] = _("---"); const u8 gText_4Qmark[] = _("????"); const u8 gText_UnusedEmpty2[] = _(""); const u8 gText_IsThisTradeOkay[] = _("Is this trade okay?"); const u8 gTradeText_Cancel[] = _("CANCEL"); const u8 gTradeText_ChooseAPokemon[] = _("Choose a POKéMON."); const u8 gTradeText_Summary[] = _("SUMMARY"); const u8 gTradeText_Trade[] = _("TRADE"); const u8 gText_CancelTrade[] = _("Cancel trade?"); const u8 gTradeText_PressBButtonToExit[] = _("Press the B Button to exit."); const u8 gText_TradeAction_Summary[] = _("SUMMARY"); const u8 gText_TradeAction_Trade[] = _("TRADE"); const u8 gText_Trade_CommunicationStandby[] = _("{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}Communication standby…\nPlease wait."); const u8 gText_TradeHasBeenCanceled[] = _("{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}The trade has been canceled."); const u8 gText_Trade_OnlyPkmnForBattle[] = _("{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}That's your only POKéMON\nfor battle."); const u8 gText_WaitingForFriendToFinish[] = _("{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}Waiting for your friend\nto finish…"); const u8 gText_FriendWantsToTrade[] = _("Your friend wants\nto trade POKéMON."); const u8 gText_XWillBeSentToY[] = _("{STR_VAR_2} will be\nsent to {STR_VAR_1}."); const u8 gText_ByeByeVar1[] = _("Bye-bye, {STR_VAR_2}!"); const u8 gText_XSentOverY[] = _("{STR_VAR_1} sent over {STR_VAR_3}."); const u8 gText_TakeGoodCareOfX[] = _("Take good care of {STR_VAR_3}!"); const u8 gText_From[] = _("From "); const u8 gText_Empty1[] = _(""); const u8 gText_Empty2[] = _(""); const u8 gText_Empty3[] = _(""); const u8 gText_Empty4[] = _(""); const u8 gText_Empty5[] = _(""); const u8 gText_Empty6[] = _(""); const u8 gText_Empty7[] = _(""); const u8 gText_Empty8[] = _(""); const u8 gText_Empty9[] = _(""); const u8 gText_Empty10[] = _(""); const u8 gText_Empty11[] = _(""); const u8 gText_WirelessCommunicationStatus[] = _("Wireless Communication Status"); const u8 gText_PeopleTrading[] = _("People trading:"); const u8 gText_PeopleBattling[] = _("People battling:"); const u8 gText_PeopleInUnionRoom[] = _("People in the UNION ROOM:"); const u8 gText_PeopleCommunicating[] = _("People communicating:"); const u8 gText_Dynamic0Players[] = _("{DYNAMIC 0x00} players"); const u8 gText_Dynamic1Players[] = _("{DYNAMIC 0x01} player"); // Typo? This is "players" in Emerald const u8 gText_Dynamic2Players[] = _("{DYNAMIC 0x02} players"); const u8 gText_Dynamic3Players[] = _("{DYNAMIC 0x03} players"); const u8 gText_BButtonCancel[] = _("{B_BUTTON}CANCEL"); const u8 gText_CommunicationStandby5[] = _("Communication standby…"); const u8 gDaycareText_GetAlongVeryWell[] = _("The two seem to get along\nvery well."); const u8 gDaycareText_GetAlong[] = _("The two seem to get along."); const u8 gDaycareText_DontLikeOther[] = _("The two don't seem to like\neach other much."); const u8 gDaycareText_PlayOther[] = _("The two prefer to play with other\nPOKéMON than each other."); const u8 gText_TeachWhichMoveToMon[] = _("Teach which move to {STR_VAR_1}?"); const u8 gText_TeachMoveQues[] = _("Teach {STR_VAR_2}?"); const u8 gText_MonLearnedMove[] = _("{STR_VAR_1} learned\n{STR_VAR_2}."); const u8 gText_MonIsTryingToLearnMove[] = _("{STR_VAR_1} is trying to learn\n{STR_VAR_2}.\pBut {STR_VAR_1} can't learn more\nthan four moves.\pDelete an older move to make\nroom for {STR_VAR_2}?"); const u8 gText_StopLearningMove[] = _("Stop learning {STR_VAR_2}?"); const u8 gText_1_2_and_Poof[] = _("{PAUSE 0x20}1, {PAUSE 0x0F}2, and {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}{PLAY_SE SE_BALL_BOUNCE_1}Poof!\p"); const u8 gText_MonForgotOldMoveAndMonLearnedNewMove[] = _("{STR_VAR_1} forgot {STR_VAR_3}.\pAnd‥\p{STR_VAR_1}\nlearned {STR_VAR_2}."); const u8 gText_GiveUpTryingToTeachNewMove[] = _("Give up trying to teach a new\nmove to {STR_VAR_1}?"); const u8 gText_WhichMoveShouldBeForgotten[] = _("Which move should be forgotten?\p"); const u8 gText_TenDashes[] = _("----------"); const u8 gText_CommStandbyAwaitingOtherPlayer[] = _("Communication standby‥\nAwaiting another player to choose."); const u8 gText_BattleWasRefused[] = _("The battle was refused.{PAUSE 0x3C}"); const u8 gText_RefusedBattle[] = _("Refused the battle.{PAUSE 0x3C}"); const u8 gFameCheckerText_MainScreenUI[] = _("{START_BUTTON}PICK {DPAD_UPDOWN}SELECT {A_BUTTON}OK"); const u8 gFameCheckerText_PickScreenUI[] = _("{START_BUTTON}PICK {DPAD_UPDOWN}SELECT {B_BUTTON}CANCEL"); const u8 gFameCheckerText_FlavorTextUI[] = _("{DPAD_ANY}PICK {A_BUTTON}READ {B_BUTTON}CANCEL"); const u8 gFameCheckerOakName[] = _("OAK"); const u8 gFameCheckerDaisyName[] = _("DAISY"); const u8 gFameCheckerBillName[] = _("BILL"); const u8 gFameCheckerMrFujiName[] = _("FUJI"); const u8 gText_VarietyOfEventsImportedWireless[] = _("A variety of events will be imported\nover Wireless Communication."); const u8 gText_WonderCardsInPossession[] = _("Read the WONDER CARDS in your\npossession."); const u8 gText_ReadNewsThatArrived[] = _("Read the NEWS that arrived."); const u8 gText_ReturnToTitle[] = _("Return to the title screen."); const u8 gText_DontHaveCardNewOneInput[] = _("You don't have a WONDER CARD,\nso a new CARD will be input."); const u8 gText_DontHaveNewsNewOneInput[] = _("You don't have any WONDER NEWS,\nso new NEWS will be input."); const u8 gText_WhereShouldCardBeAccessed[] = _("Where should the WONDER CARD\nbe accessed?"); const u8 gText_WhereShouldNewsBeAccessed[] = _("Where should the WONDER NEWS\nbe accessed?"); const u8 gText_LinkStandyBButtonCancel[] = _("Link standby...\n... ... B Button: Cancel"); const u8 gText_Communicating[] = _("Communicating…"); const u8 gText_CommunicationCompleted[] = _("Communication completed."); const u8 gText_CommunicationError[] = _("Communication error."); const u8 gText_CommunicationCanceled[] = _("Communication has been canceled."); const u8 gText_ThrowAwayWonderCard[] = _("Throw away the WONDER CARD\nand input a new CARD?"); const u8 gText_HaventReceivedCardsGift[] = _("You haven't received the CARD's gift\nyet. Input a new CARD anyway?"); const u8 gText_WonderCardReceivedFrom[] = _("A WONDER CARD has been received\nfrom {STR_VAR_1}."); const u8 gText_WonderNewsReceivedFrom[] = _("A WONDER NEWS item has been\nreceived from {STR_VAR_1}."); const u8 gText_WonderCardReceived[] = _("A new WONDER CARD has been\nreceived."); const u8 gText_WonderNewsReceived[] = _("A new WONDER NEWS item has been\nreceived."); const u8 gText_NewStampReceived[] = _("A new STAMP has been received."); const u8 gText_NewTrainerReceived[] = _("A new TRAINER has arrived."); const u8 gText_AlreadyHadCard[] = _("You already had that\nWONDER CARD."); const u8 gText_AlreadyHadNews[] = _("You already had that\nWONDER NEWS item."); const u8 gText_AlreadyHadStamp[] = _("You already had that\nSTAMP."); const u8 gText_NoMoreRoomForStamps[] = _("There's no more room for adding\nSTAMPS."); const u8 gText_RecordUploadedViaWireless[] = _("Your record has been uploaded via\nWIRELESS COMMUNICATION."); const u8 gText_CantAcceptCardFromTrainer[] = _("You can't accept a WONDER CARD\nfrom this TRAINER."); const u8 gText_CantAcceptNewsFromTrainer[] = _("You can't accept WONDER NEWS\nfrom this TRAINER."); const u8 gText_NothingSentOver[] = _("Nothing was sent over…"); const u8 gText_WhatToDoWithCards[] = _("What would you like to do\nwith the WONDER CARDS?"); const u8 gText_WhatToDoWithNews[] = _("What would you like to do\nwith the WONDER NEWS?"); const u8 gText_SendingWonderCard[] = _("Sending your WONDER CARD…"); const u8 gText_SendingWonderNews[] = _("Sending your WONDER NEWS item…"); const u8 gText_WonderCardSentTo[] = _("Your WONDER CARD has been sent\nto {STR_VAR_1}."); const u8 gText_WonderNewsSentTo[] = _("Your WONDER NEWS item has been\nsent to {STR_VAR_1}."); const u8 gText_StampSentTo[] = _("A STAMP has been sent to {STR_VAR_1}."); const u8 gText_GiftSentTo[] = _("A GIFT has been sent to {STR_VAR_1}."); const u8 gText_OtherTrainerHasCard[] = _("The other TRAINER has the same\nWONDER CARD already."); const u8 gText_OtherTrainerHasNews[] = _("The other TRAINER has the same\nWONDER NEWS already."); const u8 gText_OtherTrainerHasStamp[] = _("The other TRAINER has the same\nSTAMP already."); const u8 gText_OtherTrainerCanceled[] = _("The other TRAINER canceled\ncommunication."); const u8 gText_CantSendGiftToTrainer[] = _("You can't send a MYSTERY GIFT to\nthis TRAINER."); const u8 gText_IfThrowAwayCardEventWontHappen[] = _("If you throw away the CARD,\nits event won't happen. Okay?"); const u8 gText_OkayToDiscardNews[] = _("Is it okay to discard this\nNEWS item?"); const u8 gText_HaventReceivedGiftOkayToDiscard[] = _("You haven't received the\nGIFT. Is it okay to discard?"); const u8 gText_DataWillBeSaved[] = _("Data will be saved.\nPlease wait."); const u8 gText_SaveCompletedPressA[] = _("Save completed.\nPlease press the A Button."); const u8 gText_WonderCardThrownAway[] = _("The WONDER CARD was thrown away."); const u8 gText_WonderNewsThrownAway[] = _("The WONDER NEWS was thrown away."); const u8 gText_MysteryGift2[] = _("MYSTERY GIFT"); const u8 gText_PickOKCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}EXIT"); const u8 gText_WonderCards[] = _("WONDER CARDS"); const u8 gText_WonderNews[] = _("WONDER NEWS"); const u8 gText_WirelessCommunication[] = _("WIRELESS COMMUNICATION"); const u8 gText_Friend2[] = _("FRIEND"); const u8 gText_Exit3[] = _("EXIT"); const u8 gText_Receive[] = _("RECEIVE"); const u8 gText_Send[] = _("SEND"); const u8 gText_Toss[] = _("TOSS"); const u8 gText_DelAllCancelOk[] = _("DEL. ALL{CLEAR_TO 0x57}CANCEL{CLEAR_TO 0xA4}OK"); const u8 gSummaryMetLocationTextOrreEeveelutionsDuking[] = _("{DYNAMIC 0x00} nature.\nApparently {DYNAMIC 0x02}at {LV_2} {DYNAMIC 0x01}."); const u8 gText_YouAlreadyHaveThisTM[] = _("You already have this TM.{PAUSE_UNTIL_PRESS}"); const u8 gText_ThrowInPremierBall[] = _("I'll throw in a PREMIER BALL, too.{PAUSE_UNTIL_PRESS}"); const u8 gText_ThrowInPremierBalls[] = _("I'll throw in some Premier Balls, too.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnFriendlyBaseVar2Fell[] = _("{STR_VAR_1} turned friendly.\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnAdoresBaseVar2Fell[] = _("{STR_VAR_1} adores you!\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnFriendlyBaseVar2CantFall[] = _("{STR_VAR_1} turned friendly.\nThe base {STR_VAR_2} can't fall!{PAUSE_UNTIL_PRESS}"); const u8 gText_HeldItems[] = _("HELD ITEMS"); const u8 gText_Medicine[] = _("MEDICINE"); const u8 gText_HeldItemsPocket[] = _("HELD ITEMS POCKET"); const u8 gText_MedicinePocket[] = _("MEDICINE POCKET"); const u8 gText_Version[] = _("VERSION"); const u8 gText_FireredVersion[] = _("FIRERED VERSION"); const u8 gText_LeafgreenVersion[] = _("LEAFGREEN VERSION"); const u8 gText_Difficulty[] = _("DIFFICULTY"); const u8 gText_EasyDifficulty[] = _("EASY MODE"); const u8 gText_NormalDifficulty[] = _("NORMAL MODE"); const u8 gText_ChallengeDifficulty[] = _("CHALLENGE MODE"); const u8 gText_Nuzlocke[] = _("NUZLOCKE"); const u8 gText_Nuzlocke_On[] = _("ON"); const u8 gText_Nuzlocke_Off[] = _("OFF"); const u8 gText_IVCalc[] = _("IV CALCULATION"); const u8 gText_IVCalcZero[] = _("ALL ZERO"); const u8 gText_IVCalcStandard[] = _("STANDARD"); const u8 gText_IVCalcPerfect[] = _("ALL PERFECT"); const u8 gText_EVCalc[] = _("EV CALCULATION"); const u8 gText_EVCalcZero[] = _("ALL ZERO"); const u8 gText_EVCalcStandard[] = _("STANDARD"); const u8 gText_NoPMC[] = _("NO FREE HEALS"); const u8 gText_ExpMod[] = _("EXP. MODIFIER"); const u8 gText_ExpModZero[] = _("0×"); const u8 gText_ExpModHalf[] = _("1/2×"); const u8 gText_ExpModNormal[] = _("1×"); const u8 gText_ExpModTwice[] = _("2×"); const u8 gText_KeySystemSettings[] = _("KEY SYSTEM SETTINGS"); const u8 gText_HelpPickSwitchCancel[] = _("{L_BUTTON}KEY INFO {DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH {A_BUTTON}{B_BUTTON}SAVE"); const u8 gChooseVersionNewGame[] = _("Start NEW GAME on which version?\nOther KEY SYSTEM SETTINGS can\lbe set later from the main menu."); const u8 gFRLG_Multichoice[] = _("FIRERED\nLEAFGREEN"); const u8 gText_BlueFlute_Ash[] = _("{FONT_SMALL}BLUE FLUTE{CLEAR_TO 0x40} 250"); const u8 gText_YellowFlute_Ash[] = _("{FONT_SMALL}YELLOW FLUTE{CLEAR_TO 0x40} 500"); const u8 gText_RedFlute_Ash[] = _("{FONT_SMALL}RED FLUTE{CLEAR_TO 0x40} 500"); const u8 gText_WhiteFlute_Ash[] = _("{FONT_SMALL}WHITE FLUTE{CLEAR_TO 0x40}1000"); const u8 gText_BlackFlute_Ash[] = _("{FONT_SMALL}BLACK FLUTE{CLEAR_TO 0x40}1000"); const u8 gText_AshQuantity[] = _("ASH QUANTITY: {STR_VAR_1}{PAUSE_UNTIL_PRESS}"); const u8 gText_SmallExit[] = _("{FONT_SMALL}EXIT"); const u8 gText_BattleTower[] = _("BATTLE TOWER"); const u8 gText_BattleFactory[] = _("BATTLE FACTORY"); const u8 gText_BattleArena[] = _("BATTLE ARENA"); const u8 gText_BattleDome[] = _("BATTLE DOME"); const u8 gText_BattlePike[] = _("BATTLE PIKE"); const u8 gText_BattlePalace[] = _("BATTLE PALACE"); const u8 gText_BattlePyramid[] = _("BATTLE PYRAMID"); const u8 gText_DevonSpyShop[] = _("{COLOR RED}Hurry up, I'm missing the good stuff."); const u8 gText_AnythingElseICanHelpF[] = _("{COLOR RED}Is there anything else I can do?"); const u8 gText_Brock[] = _("BROCK"); const u8 gText_Misty[] = _("MISTY"); const u8 gText_Erika[] = _("ERIKA"); const u8 gText_Sabrina[] = _("SABRINA"); const u8 gText_Blaine[] = _("BLAINE"); const u8 gText_CommaSpace[] = _(", "); const u8 gText_NewLine[] = _("\n"); const u8 gText_AndSpace[] = _("and "); const u8 gText_SwapToKanto[] = _("{START_BUTTON}KANTO MODE"); const u8 gText_SwapToExtended[] = _("{START_BUTTON}EXTENDED MODE"); const u8 gText_Extended[] = _("EXTENDED"); const u8 gText_NumericalModeExtended[] = _("NUMERICAL MODE: EXTENDED"); const u8 gText_An[] = _("an"); const u8 gText_A[] = _("a"); const u8 gText_WhoAreThey[] = _("Who are they?"); const u8 gText_HowDoIBattleThem[] = _("How do I battle them?"); const u8 gText_AboutTitles[] = _("About titles"); const u8 gText_Nothing[] = _("Exit"); ================================================ FILE: src/task.c ================================================ #include "global.h" #include "task.h" #define HEAD_SENTINEL 0xFE #define TAIL_SENTINEL 0xFF struct Task gTasks[NUM_TASKS]; static void InsertTask(u8 newTaskId); static u8 FindFirstActiveTask(); void ResetTasks(void) { u32 i; for (i = 0; i < NUM_TASKS; i++) { gTasks[i].isActive = FALSE; gTasks[i].func = TaskDummy; gTasks[i].prev = i; gTasks[i].next = i + 1; gTasks[i].priority = -1; memset(gTasks[i].data, 0, sizeof(gTasks[i].data)); } gTasks[0].prev = HEAD_SENTINEL; gTasks[NUM_TASKS - 1].next = TAIL_SENTINEL; } u8 CreateTask(TaskFunc func, u8 priority) { u32 i; for (i = 0; i < NUM_TASKS; i++) { if (!gTasks[i].isActive) { gTasks[i].func = func; gTasks[i].priority = priority; InsertTask(i); memset(gTasks[i].data, 0, sizeof(gTasks[i].data)); gTasks[i].isActive = TRUE; return i; } } return 0; } static void InsertTask(u8 newTaskId) { u8 taskId = FindFirstActiveTask(); if (taskId == NUM_TASKS) { // The new task is the only task. gTasks[newTaskId].prev = HEAD_SENTINEL; gTasks[newTaskId].next = TAIL_SENTINEL; return; } while (1) { if (gTasks[newTaskId].priority < gTasks[taskId].priority) { // We've found a task with a higher priority value, // so we insert the new task before it. gTasks[newTaskId].prev = gTasks[taskId].prev; gTasks[newTaskId].next = taskId; if (gTasks[taskId].prev != HEAD_SENTINEL) gTasks[gTasks[taskId].prev].next = newTaskId; gTasks[taskId].prev = newTaskId; return; } if (gTasks[taskId].next == TAIL_SENTINEL) { // We've reached the end. gTasks[newTaskId].prev = taskId; gTasks[newTaskId].next = gTasks[taskId].next; gTasks[taskId].next = newTaskId; return; } taskId = gTasks[taskId].next; } } void DestroyTask(u8 taskId) { if (gTasks[taskId].isActive) { gTasks[taskId].isActive = FALSE; if (gTasks[taskId].prev == HEAD_SENTINEL) { if (gTasks[taskId].next != TAIL_SENTINEL) gTasks[gTasks[taskId].next].prev = HEAD_SENTINEL; } else { if (gTasks[taskId].next == TAIL_SENTINEL) { gTasks[gTasks[taskId].prev].next = TAIL_SENTINEL; } else { gTasks[gTasks[taskId].prev].next = gTasks[taskId].next; gTasks[gTasks[taskId].next].prev = gTasks[taskId].prev; } } } } void RunTasks(void) { u8 taskId = FindFirstActiveTask(); if (taskId != NUM_TASKS) { do { gTasks[taskId].func(taskId); taskId = gTasks[taskId].next; } while (taskId != TAIL_SENTINEL); } } static u8 FindFirstActiveTask() { u8 taskId; for (taskId = 0; taskId < NUM_TASKS; taskId++) if (gTasks[taskId].isActive == TRUE && gTasks[taskId].prev == HEAD_SENTINEL) break; return taskId; } void TaskDummy(u8 taskId) { } void SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc) { u8 followupFuncIndex = NUM_TASK_DATA - 2; // Should be const. gTasks[taskId].data[followupFuncIndex] = (s16)((u32)followupFunc); gTasks[taskId].data[followupFuncIndex + 1] = (s16)((u32)followupFunc >> 16); // Store followupFunc as two half-words in the data array. gTasks[taskId].func = func; } void SwitchTaskToFollowupFunc(u8 taskId) { u8 followupFuncIndex = NUM_TASK_DATA - 2; // Should be const. gTasks[taskId].func = (TaskFunc)((u16)(gTasks[taskId].data[followupFuncIndex]) | (gTasks[taskId].data[followupFuncIndex + 1] << 16)); } bool8 FuncIsActiveTask(TaskFunc func) { u32 i; for (i = 0; i < NUM_TASKS; i++) if (gTasks[i].isActive == TRUE && gTasks[i].func == func) return TRUE; return FALSE; } u8 FindTaskIdByFunc(TaskFunc func) { s32 i; for (i = 0; i < NUM_TASKS; i++) if (gTasks[i].isActive == TRUE && gTasks[i].func == func) return (u8)i; return -1; } u8 GetTaskCount(void) { u32 i; u8 count = 0; for (i = 0; i < NUM_TASKS; i++) if (gTasks[i].isActive == TRUE) count++; return count; } void SetWordTaskArg(u8 taskId, u8 dataElem, unsigned long value) { if (dataElem <= 14) { gTasks[taskId].data[dataElem] = value; gTasks[taskId].data[dataElem + 1] = value >> 16; } } u32 GetWordTaskArg(u8 taskId, u8 dataElem) { if (dataElem <= 14) return (u16)gTasks[taskId].data[dataElem] | (gTasks[taskId].data[dataElem + 1] << 16); else return 0; } ================================================ FILE: src/teachy_tv.c ================================================ #include "task.h" #include "gflib.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "scanline_effect.h" #include "decompress.h" #include "list_menu.h" #include "item_menu.h" #include "item.h" #include "menu_indicators.h" #include "event_object_movement.h" #include "random.h" #include "constants/songs.h" #include "constants/items.h" #include "event_data.h" #include "load_save.h" #include "battle_transition.h" #include "battle_main.h" #include "battle.h" #include "battle_controllers.h" #include "global.fieldmap.h" #include "teachy_tv.h" #include "help_system.h" #include "overworld.h" #include "graphics.h" #include "fieldmap.h" #include "strings.h" #include "constants/field_effects.h" #include "constants/event_objects.h" struct TeachyTvCtrlBlk { MainCallback callback; u8 mode; u8 whichScript; u16 scrollOffset; u16 selectedRow; }; struct TeachyTvBuf { MainCallback savedCallback; u16 screenTilemap[BG_SCREEN_SIZE]; u16 buffer2[BG_SCREEN_SIZE]; u16 buffer3[BG_SCREEN_SIZE]; u16 titleTilemap[BG_SCREEN_SIZE]; u8 grassAnimCounterLo; u8 grassAnimCounterHi; u8 grassAnimDisabled; u8 scrollIndicatorArrowPairId; }; static EWRAM_DATA struct TeachyTvCtrlBlk sStaticResources = {0}; static EWRAM_DATA struct TeachyTvBuf * sResources = NULL; static void TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos(u8 taskId); static void TTVcmd_ClearBg2TeachyTvGraphic(u8 taskId); static void TTVcmd_NpcMoveAndSetupTextPrinter(u8 taskId); static void TTVcmd_IdleIfTextPrinterIsActive(u8 taskId); static void TTVcmd_TextPrinterSwitchStringByOptionChosen(u8 taskId); static void TTVcmd_TextPrinterSwitchStringByOptionChosen2(u8 taskId); static void TTVcmd_IdleIfTextPrinterIsActive2(u8 taskId); static void TTVcmd_EraseTextWindowIfKeyPressed(u8 taskId); static void TTVcmd_StartAnimNpcWalkIntoGrass(u8 taskId); static void TTVcmd_DudeMoveUp(u8 taskId); static void TTVcmd_DudeMoveRight(u8 taskId); static void TTVcmd_DudeTurnLeft(u8 taskId); static void TTVcmd_DudeMoveLeft(u8 taskId); static void TTVcmd_RenderAndRemoveBg1EndGraphic(u8 taskId); static void TTVcmd_TaskBattleOrFadeByOptionChosen(u8 taskId); static void TeachyTvCallback(void); static void TeachyTvMainCallback(void); static void TeachyTvVblankHandler(void); static void TeachyTvCreateAndRenderRbox(void); static void TeachyTvInitIo(void); static u8 TeachyTvSetupObjEventAndOam(void); static void TeachyTvSetupPostBattleWindowAndObj(u8); static u8 TeachyTvSetupWindow(void); static void TeachyTvSetupScrollIndicatorArrowPair(void); static void TeachyTvSetWindowRegs(void); static void TeachyTvSetupBg(void); static void TeachyTvLoadGraphic(void); static void TeachyTvPostBattleFadeControl(u8); static void TeachyTvOptionListController(u8); static void TeachyTvAudioByInput(s32, bool8, struct ListMenu *); static void TeachyTvQuitFadeControlAndTaskDel(u8 taskId); static void TeachyTvRenderMsgAndSwitchClusterFuncs(u8 taskId); static void TeachyTvClearBg1EndGraphicText(void); static void TTVcmd_End(u8 taskId); static void TeachyTvSetupBagItemsByOptionChosen(void); static void TeachyTvPrepBattle(u8 taskId); static void TeachyTvGrassAnimationMain(u8 taskId, s16 x, s16 y, u8 subpriority, bool8 mode); static void TeachyTvLoadBg3Map(u16 *); static u8 TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(s16 x, s16 y); static void TeachyTvGrassAnimationObjCallback(struct Sprite *sprite); static void TeachyTvRestorePlayerPartyCallback(void); static void TeachyTvPreBattleAnimAndSetBattleCallback(u8 taskId); static void TeachyTvLoadMapTilesetToBuffer(const struct Tileset *ts, u8 *dstBuffer, u16 size); static void TeachyTvPushBackNewMapPalIndexArrayEntry(const struct MapLayout *mStruct, u16 *buf1, u8 *palIndexArray, u16 mapEntry, u16 offset); static void TeachyTvComputeMapTilesFromTilesetAndMetaTiles(const u16 *metaTilesArray, u8 *blockBuf, u8 *tileset); static void TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(u8 *blockBuf, u8 *tileset, u8 metaTile); static u16 TeachyTvComputePalIndexArrayEntryByMetaTile(u8 *palIndexArrayBuf, u16 metaTile); static void TeachyTvLoadMapPalette(const struct MapLayout * mStruct, const u8 *palIndexArray); static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000, }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000, }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000, }, { .bg = 3, .charBaseIndex = 2, .mapBaseIndex = 28, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000, }, }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 1, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 3, .baseBlock = 0x0EA, }, { .bg = 0, .tilemapLeft = 4, .tilemapTop = 1, .width = 22, .height = 12, .paletteNum = 3, .baseBlock = 0x152, }, DUMMY_WIN_TEMPLATE, }; static const struct ListMenuItem sListMenuItems[] = { { .label = gTeachyTvString_TeachBattle, .index = TTVSCR_BATTLE }, { .label = gTeachyTvString_StatusProblems, .index = TTVSCR_STATUS }, { .label = gTeachyTvString_TypeMatchups, .index = TTVSCR_MATCHUPS }, { .label = gTeachyTvString_CatchPkmn, .index = TTVSCR_CATCHING }, { .label = gTeachyTvString_AboutTMs, .index = TTVSCR_TMS }, { .label = gTeachyTvString_RegisterItem, .index = TTVSCR_REGISTER }, { .label = gTeachyTvString_Cancel, .index = -2 }, }; static const struct ListMenuItem sListMenuItems_NoTMCase[] = { { .label = gTeachyTvString_TeachBattle, .index = TTVSCR_BATTLE }, { .label = gTeachyTvString_StatusProblems, .index = TTVSCR_STATUS }, { .label = gTeachyTvString_TypeMatchups, .index = TTVSCR_MATCHUPS }, { .label = gTeachyTvString_CatchPkmn, .index = TTVSCR_CATCHING }, { .label = gTeachyTvString_Cancel, .index = -2 }, }; static const struct ListMenuTemplate sListMenuTemplate = { .items = sListMenuItems, .moveCursorFunc = NULL, .itemPrintFunc = NULL, .totalItems = 7, .maxShowed = 6, .windowId = 0, .header_X = 0, .item_X = 8, .cursor_X = 0, .upText_Y = 6, .cursorPal = 0x1, .fillValue = 0x0, .cursorShadowPal = 0x2, .lettersSpacing = 0x0, .itemVerticalPadding = 0x0, .scrollMultiple = 0x1, .fontId = FONT_NORMAL, .cursorKind = 0x0, }; static const struct ScrollArrowsTemplate sScrollIndicatorArrowPair = { .firstArrowType = 0x2, .firstX = 0x78, .firstY = 0xC, .secondArrowType = 0x3, .secondX = 0x78, .secondY = 0x64, .fullyUpThreshold = 0, .fullyDownThreshold = 1, .tileTag = 0x800, .palTag = 0x800, .palNum = 0x0, }; static const u8 sWhereToReturnToFromBattle[] = { 12, 12, 12, 12, 9, 9 }; static void (* const sBattleScript[])(u8) = { TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos, TTVcmd_ClearBg2TeachyTvGraphic, TTVcmd_NpcMoveAndSetupTextPrinter, TTVcmd_IdleIfTextPrinterIsActive, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_TextPrinterSwitchStringByOptionChosen, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_StartAnimNpcWalkIntoGrass, TTVcmd_DudeMoveUp, TTVcmd_DudeMoveRight, TTVcmd_TaskBattleOrFadeByOptionChosen, TTVcmd_TextPrinterSwitchStringByOptionChosen2, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_DudeTurnLeft, TTVcmd_DudeMoveLeft, TTVcmd_RenderAndRemoveBg1EndGraphic, TTVcmd_End, }; static void (* const sStatusScript[])(u8) = { TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos, TTVcmd_ClearBg2TeachyTvGraphic, TTVcmd_NpcMoveAndSetupTextPrinter, TTVcmd_IdleIfTextPrinterIsActive, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_TextPrinterSwitchStringByOptionChosen, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_StartAnimNpcWalkIntoGrass, TTVcmd_DudeMoveUp, TTVcmd_DudeMoveRight, TTVcmd_TaskBattleOrFadeByOptionChosen, TTVcmd_TextPrinterSwitchStringByOptionChosen2, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_DudeTurnLeft, TTVcmd_DudeMoveLeft, TTVcmd_RenderAndRemoveBg1EndGraphic, TTVcmd_End, }; static void (* const sMatchupsScript[])(u8) = { TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos, TTVcmd_ClearBg2TeachyTvGraphic, TTVcmd_NpcMoveAndSetupTextPrinter, TTVcmd_IdleIfTextPrinterIsActive, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_TextPrinterSwitchStringByOptionChosen, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_StartAnimNpcWalkIntoGrass, TTVcmd_DudeMoveUp, TTVcmd_DudeMoveRight, TTVcmd_TaskBattleOrFadeByOptionChosen, TTVcmd_TextPrinterSwitchStringByOptionChosen2, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_DudeTurnLeft, TTVcmd_DudeMoveLeft, TTVcmd_RenderAndRemoveBg1EndGraphic, TTVcmd_End, }; static void (* const sCatchingScript[])(u8) = { TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos, TTVcmd_ClearBg2TeachyTvGraphic, TTVcmd_NpcMoveAndSetupTextPrinter, TTVcmd_IdleIfTextPrinterIsActive, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_TextPrinterSwitchStringByOptionChosen, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_StartAnimNpcWalkIntoGrass, TTVcmd_DudeMoveUp, TTVcmd_DudeMoveRight, TTVcmd_TaskBattleOrFadeByOptionChosen, TTVcmd_TextPrinterSwitchStringByOptionChosen2, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_DudeTurnLeft, TTVcmd_DudeMoveLeft, TTVcmd_RenderAndRemoveBg1EndGraphic, TTVcmd_End, }; static void (* const sTMsScript[])(u8) = { TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos, TTVcmd_ClearBg2TeachyTvGraphic, TTVcmd_NpcMoveAndSetupTextPrinter, TTVcmd_IdleIfTextPrinterIsActive, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_TextPrinterSwitchStringByOptionChosen, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_TaskBattleOrFadeByOptionChosen, TTVcmd_TextPrinterSwitchStringByOptionChosen2, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_DudeTurnLeft, TTVcmd_DudeMoveLeft, TTVcmd_RenderAndRemoveBg1EndGraphic, TTVcmd_End, }; static void (* const sRegisterKeyItemScript[])(u8) = { TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos, TTVcmd_ClearBg2TeachyTvGraphic, TTVcmd_NpcMoveAndSetupTextPrinter, TTVcmd_IdleIfTextPrinterIsActive, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_TextPrinterSwitchStringByOptionChosen, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_TaskBattleOrFadeByOptionChosen, TTVcmd_TextPrinterSwitchStringByOptionChosen2, TTVcmd_IdleIfTextPrinterIsActive2, TTVcmd_EraseTextWindowIfKeyPressed, TTVcmd_DudeTurnLeft, TTVcmd_DudeMoveLeft, TTVcmd_RenderAndRemoveBg1EndGraphic, TTVcmd_End, }; static void TeachyTvCallback(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); DoScheduledBgTilemapCopiesToVram(); UpdatePaletteFade(); } static void TeachyTvVblankHandler(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void InitTeachyTvController(u8 mode, MainCallback cb) { sStaticResources.mode = mode; sStaticResources.callback = cb; if (mode == 0) { sStaticResources.scrollOffset = 0; sStaticResources.selectedRow = 0; sStaticResources.whichScript = TTVSCR_BATTLE; } if (mode == 1) { sStaticResources.mode = 0; } SetMainCallback2(TeachyTvMainCallback); } void CB2_ReturnToTeachyTV(void) { if (sStaticResources.mode == 1) InitTeachyTvController(1, sStaticResources.callback); else InitTeachyTvController(2, sStaticResources.callback); } void SetTeachyTvControllerModeToResume(void) { sStaticResources.mode = 1; } static void TeachyTvMainCallback(void) { u8 taskId; struct Task *taskAddr; switch (gMain.state) { case 0: sResources = AllocZeroed(sizeof(struct TeachyTvBuf)); sResources->savedCallback = NULL; sResources->grassAnimDisabled = 0; sResources->scrollIndicatorArrowPairId = 0xFF; SetVBlankHBlankCallbacksToNull(); ClearScheduledBgCopiesToVram(); ScanlineEffect_Stop(); FreeAllSpritePalettes(); ResetPaletteFade(); ResetSpriteData(); ResetTasks(); TeachyTvSetupBg(); TeachyTvLoadGraphic(); ++gMain.state; break; case 1: if (FreeTempTileDataBuffersIfPossible() == TRUE) return; TeachyTvCreateAndRenderRbox(); TeachyTvInitIo(); if (sStaticResources.mode == 2) { taskId = CreateTask(TeachyTvPostBattleFadeControl, 0); gTasks[taskId].data[1] = TeachyTvSetupObjEventAndOam(); TeachyTvSetupPostBattleWindowAndObj(taskId); } else { taskId = CreateTask(TeachyTvOptionListController, 0); gTasks[taskId].data[0] = TeachyTvSetupWindow(); gTasks[taskId].data[1] = TeachyTvSetupObjEventAndOam(); TeachyTvSetupScrollIndicatorArrowPair(); PlayNewMapMusic(MUS_TEACHY_TV_MENU); TeachyTvSetWindowRegs(); } ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); ScheduleBgCopyTilemapToVram(2); ScheduleBgCopyTilemapToVram(3); SetHelpContextDontCheckBattle(HELPCONTEXT_BAG); BlendPalettes(PALETTES_ALL, 0x10, 0); BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, 0); SetVBlankCallback(TeachyTvVblankHandler); SetMainCallback2(TeachyTvCallback); break; } } static void TeachyTvSetupBg(void) { ResetAllBgsCoordinatesAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, 4); SetBgTilemapBuffer(1, sResources->screenTilemap); SetBgTilemapBuffer(2, sResources->buffer2); SetBgTilemapBuffer(3, sResources->buffer3); SetGpuReg(REG_OFFSET_DISPCNT, 0x3040); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); ChangeBgX(3, 0x1000, 2); ChangeBgY(3, 0x2800, 1); sResources->grassAnimCounterLo = 0; sResources->grassAnimCounterHi = 3; SetGpuReg(REG_OFFSET_BLDCNT, 0); } static void TeachyTvLoadGraphic(void) { u16 src = RGB_BLACK; ResetTempTileDataBuffers(); DecompressAndCopyTileDataToVram(1, gTeachyTv_Gfx, 0, 0, 0); LZDecompressWram(gTeachyTvScreen_Tilemap, sResources->screenTilemap); LZDecompressWram(gTeachyTvTitle_Tilemap, sResources->titleTilemap); LoadCompressedPalette(gTeachyTv_Pal, BG_PLTT_ID(0), 4 * PLTT_SIZE_4BPP); LoadPalette(&src, BG_PLTT_ID(0), sizeof(src)); LoadSpritePalette(&gSpritePalette_GeneralFieldEffect1); TeachyTvLoadBg3Map(sResources->buffer3); } static void TeachyTvCreateAndRenderRbox(void) { InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); FillWindowPixelBuffer(0, 0xCC); PutWindowTilemap(0); PutWindowTilemap(1); CopyWindowToVram(0, COPYWIN_GFX); } static u8 TeachyTvSetupWindow(void) { gMultiuseListMenuTemplate = sListMenuTemplate; gMultiuseListMenuTemplate.windowId = 1; gMultiuseListMenuTemplate.moveCursorFunc = TeachyTvAudioByInput; if (!CheckBagHasItem(ITEM_TM_CASE, 1)) { gMultiuseListMenuTemplate.items = sListMenuItems_NoTMCase; gMultiuseListMenuTemplate.totalItems = 5; gMultiuseListMenuTemplate.maxShowed = 5; gMultiuseListMenuTemplate.upText_Y = (gMultiuseListMenuTemplate.upText_Y + 8) & 0xF; } return ListMenuInit( &gMultiuseListMenuTemplate, sStaticResources.scrollOffset, sStaticResources.selectedRow ); } static void TeachyTvSetupScrollIndicatorArrowPair(void) { if (!CheckBagHasItem(ITEM_TM_CASE, 1)) { struct TeachyTvBuf * temp = sResources; temp->scrollIndicatorArrowPairId = 0xFF; } else { sResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPair(&sScrollIndicatorArrowPair, &(sStaticResources.scrollOffset)); } } static void TeachyTvRemoveScrollIndicatorArrowPair(void) { if (sResources->scrollIndicatorArrowPairId != 0xFF) { RemoveScrollIndicatorArrowPair(sResources->scrollIndicatorArrowPairId); sResources->scrollIndicatorArrowPairId = 0xFF; } } static void TeachyTvAudioByInput(s32 notUsed, bool8 play, struct ListMenu *notUsedAlt) { if (play != TRUE) PlaySE(SE_SELECT); } static void TeachyTvInitIo(void) { SetGpuReg(REG_OFFSET_WININ, 0x3F); SetGpuReg(REG_OFFSET_WINOUT, 0x1F); SetGpuReg(REG_OFFSET_BLDCNT, 0xCC); SetGpuReg(REG_OFFSET_BLDY, 0x5); } static u8 TeachyTvSetupObjEventAndOam(void) { u8 objId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_TEACHY_TV_HOST, SpriteCallbackDummy, 0, 0, 8); gSprites[objId].oam.priority = 2; gSprites[objId].invisible = 1; return objId; } static void TeachyTvSetSpriteCoordsAndSwitchFrame(u8 objId, u16 x, u16 y, u8 frame) { gSprites[objId].x2 = x; gSprites[objId].y2 = y; gSprites[objId].invisible = 0; StartSpriteAnim(&gSprites[objId], frame); } static void TeachyTvSetWindowRegs(void) { SetGpuReg(REG_OFFSET_WIN0V, 0xC64); SetGpuReg(REG_OFFSET_WIN0H, 0x1CD4); } static void TeachyTvClearWindowRegs(void) { SetGpuReg(REG_OFFSET_WIN0V, 0x0); SetGpuReg(REG_OFFSET_WIN0H, 0x0); } static void TeachyTvBg2AnimController(void) { u16 * tilemapBuffer = GetBgTilemapBuffer(2); u8 i, j; for (i = 1; i < 13; i++) { for (j = 2; j < 28; j++) { tilemapBuffer[32 * i + j] = ((Random() & 3) << 10) + 0x301F; } } ScheduleBgCopyTilemapToVram(2); } static void TeachyTvSetupPostBattleWindowAndObj(u8 taskId) { s16 *data = gTasks[taskId].data; struct Sprite *objAddr = &gSprites[data[1]]; ClearWindowTilemap(1); TeachyTvClearWindowRegs(); switch (sStaticResources.whichScript) { case TTVSCR_BATTLE: case TTVSCR_STATUS: case TTVSCR_MATCHUPS: case TTVSCR_CATCHING: TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 0x78, 0x38, 0); ChangeBgX(3, 0x3000, 1); ChangeBgY(3, 0x3000, 2); sResources->grassAnimCounterLo += 3; sResources->grassAnimCounterHi -= 3; break; case TTVSCR_TMS: case TTVSCR_REGISTER: TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 0x78, 0x38, 0); break; } data[4] = 0; data[5] = 0; TeachyTvGrassAnimationMain(taskId, objAddr->x2, objAddr->y2, 0, 1); } static void TeachyTvInitTextPrinter(const u8 *text) { gTextFlags.autoScroll = 0; AddTextPrinterParameterized2(0, FONT_MALE, text, GetTextSpeedSetting(), 0, 1, 0xC, 2); } static void TeachyTvFree(void) { Free(sResources); sResources = NULL; FreeAllWindowBuffers(); } static void TeachyTvQuitBeginFade(u8 taskId) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, 0); gTasks[taskId].func = TeachyTvQuitFadeControlAndTaskDel; } static void TeachyTvQuitFadeControlAndTaskDel(u8 taskId) { if (!(gPaletteFade.active)) { if (sResources->savedCallback != NULL) { SetMainCallback2(sResources->savedCallback); } else { Overworld_PlaySpecialMapMusic(); SetMainCallback2(sStaticResources.callback); } TeachyTvFree(); DestroyTask(taskId); } } static void TeachyTvOptionListController(u8 taskId) { s16 * data = gTasks[taskId].data; s32 input; TeachyTvBg2AnimController(); if (!gPaletteFade.active) { input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow); if ((JOY_NEW(SELECT_BUTTON) && sStaticResources.callback != CB2_BagMenuFromStartMenu)) { PlaySE(SE_SELECT); TeachyTvQuitBeginFade(taskId); } else { switch (input) { case -1: break; case -2: PlaySE(SE_SELECT); TeachyTvQuitBeginFade(taskId); break; default: PlaySE(SE_SELECT); sStaticResources.whichScript = input; DestroyListMenuTask(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow); TeachyTvClearWindowRegs(); ClearWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); TeachyTvRemoveScrollIndicatorArrowPair(); data[3] = 0; data[2] = 0; gTasks[taskId].func = TeachyTvRenderMsgAndSwitchClusterFuncs; break; } } } } static void TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos(u8 taskId) { s16 *data = gTasks[taskId].data; TeachyTvBg2AnimController(); if (++data[2] > 63) { CopyToBgTilemapBufferRect_ChangePalette(2, sResources->titleTilemap, 0, 0, 0x20, 0x20, 0x11); TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 8, 0x38, 7); ScheduleBgCopyTilemapToVram(2); data[2] = 0; ++data[3]; PlayNewMapMusic(MUS_FOLLOW_ME); } } static void TTVcmd_ClearBg2TeachyTvGraphic(u8 taskId) { s16 *data = gTasks[taskId].data; if (++data[2] == 134) { FillBgTilemapBufferRect_Palette0(2, 0, 2, 1, 0x1A, 0xC); ScheduleBgCopyTilemapToVram(2); data[2] = 0; ++data[3]; } } static void TTVcmd_NpcMoveAndSetupTextPrinter(u8 taskId) { s16 * data = gTasks[taskId].data; struct Sprite *spriteAddr = &gSprites[data[1]]; if (data[2] != 35) ++data[2]; else { if (spriteAddr->x2 == 0x78) { StartSpriteAnim(&gSprites[data[1]], 0); TeachyTvInitTextPrinter(gTeachyTvText_PokedudeSaysHello); data[2] = 0; ++data[3]; } else ++spriteAddr->x2; } } static void TTVcmd_IdleIfTextPrinterIsActive(u8 taskId) { s16 *data = gTasks[taskId].data; if (!RunTextPrinters_CheckActive(0)) ++data[3]; } static void TeachyTvRenderMsgAndSwitchClusterFuncs(u8 taskId) { s16 *data = gTasks[taskId].data; if (JOY_NEW(B_BUTTON)) { sResources->grassAnimDisabled = 1; TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 0, 0, 0); FillWindowPixelBuffer(0, 0xCC); CopyWindowToVram(0, COPYWIN_GFX); TeachyTvClearBg1EndGraphicText(); data[2] = 0; data[3] = 0; gTasks[taskId].func = TTVcmd_End; } else { static void (* const * const array[])(u8) = { sBattleScript, sStatusScript, sMatchupsScript, sCatchingScript, sTMsScript, sRegisterKeyItemScript, }; void (*const *cluster)(u8) = array[sStaticResources.whichScript]; cluster[data[3]](taskId); } } static void TTVcmd_TextPrinterSwitchStringByOptionChosen(u8 taskId) { s16 *data = gTasks[taskId].data; static const u8 *const texts[] = { gTeachyTvText_BattleScript1, gTeachyTvText_StatusScript1, gTeachyTvText_MatchupsScript1, gTeachyTvText_CatchingScript1, gTeachyTvText_TMsScript1, gTeachyTvText_RegisterScript1, }; TeachyTvInitTextPrinter(texts[sStaticResources.whichScript]); ++data[3]; } static void TTVcmd_TextPrinterSwitchStringByOptionChosen2(u8 taskId) { s16 *data = gTasks[taskId].data; static const u8 *const texts[] = { gTeachyTvText_BattleScript2, gTeachyTvText_StatusScript2, gTeachyTvText_MatchupsScript2, gTeachyTvText_CatchingScript2, gTeachyTvText_TMsScript2, gTeachyTvText_RegisterScript2, }; TeachyTvInitTextPrinter(texts[sStaticResources.whichScript]); ++data[3]; } static const u16 sBg1EndGraphic[] = { 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, }; static const struct Subsprite sSubspriteArray[] = { { .x = -0x8, .y = -0x8, .shape = 0x1, .size = 0x0, .tileOffset = 0x0, .priority = 0x3, }, { .x = -0x8, .y = 0x0, .shape = 0x1, .size = 0x0, .tileOffset = 0x2, .priority = 0x2, }, }; static const struct SubspriteTable sSubspriteTableArray[] = { { .subspriteCount = 0, .subsprites = NULL, }, { .subspriteCount = 2, .subsprites = sSubspriteArray, }, }; static const u8 sGrassAnimArray[] = { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, }; static void TTVcmd_IdleIfTextPrinterIsActive2(u8 taskId) { s16 *data = gTasks[taskId].data; if (!RunTextPrinters_CheckActive(0)) ++data[3]; } static void TTVcmd_EraseTextWindowIfKeyPressed(u8 taskId) { s16 *data = gTasks[taskId].data; if (JOY_NEW(A_BUTTON | B_BUTTON)) { FillWindowPixelBuffer(0, 0xCC); CopyWindowToVram(0, COPYWIN_GFX); ++data[3]; } } static void TTVcmd_StartAnimNpcWalkIntoGrass(u8 taskId) { s16 *data = gTasks[taskId].data; StartSpriteAnim(&gSprites[data[1]], 5); data[2] = 0; data[4] = 0; data[5] = 1; ++data[3]; } static void TTVcmd_DudeMoveUp(u8 taskId) { s16 *data = gTasks[taskId].data; struct Sprite *obj = &gSprites[data[1]]; ChangeBgY(3, 0x100, 2); if (!(++data[2] & 0xF)) { --sResources->grassAnimCounterHi; TeachyTvGrassAnimationMain(taskId, obj->x2, obj->y2, 0, 0); } if (data[2] == 48) { data[2] = 0; data[4] = -1; data[5] = 0; StartSpriteAnim(obj, 7); ++data[3]; } } static void TTVcmd_DudeMoveRight(u8 taskId) { s16 *data = gTasks[taskId].data; struct Sprite *obj = &gSprites[data[1]]; ChangeBgX(3, 0x100, 1); if (!(++data[2] & 0xF)) ++sResources->grassAnimCounterLo; if (!((data[2] + 8) & 0xF)) TeachyTvGrassAnimationMain(taskId, obj->x2 + 8, obj->y2, 0, 0); if (data[2] == 0x30) { data[2] = 0; data[4] = 0; data[5] = 0; StartSpriteAnim(obj, 3); ++data[3]; } } static void TTVcmd_DudeTurnLeft(u8 taskId) { s16 *data = gTasks[taskId].data; struct Sprite *objAddr = &gSprites[data[1]]; StartSpriteAnim(objAddr, 6); ++data[3]; data[4] = 0; data[5] = 0; TeachyTvGrassAnimationMain(taskId, objAddr->x2, objAddr->y2, 0, 0); } static void TTVcmd_DudeMoveLeft(u8 taskId) { s16 *data = gTasks[taskId].data; struct Sprite *objAddr = &gSprites[data[1]]; if (!(objAddr->x2 & 0xF)) TeachyTvGrassAnimationMain(taskId, objAddr->x2 - 8, objAddr->y2, 0, 0); if (objAddr->x2 == 8) ++data[3]; else --objAddr->x2; } static void TTVcmd_RenderAndRemoveBg1EndGraphic(u8 taskId) { s16 *data = gTasks[taskId].data; if (!data[2]) { CopyToBgTilemapBufferRect_ChangePalette(1, sBg1EndGraphic, 20, 10, 8, 2, 0x11); ScheduleBgCopyTilemapToVram(1); } if (++data[2] > 126) { TeachyTvClearBg1EndGraphicText(); data[2] = 0; ++data[3]; } } static void TeachyTvClearBg1EndGraphicText(void) { FillBgTilemapBufferRect_Palette0(1, 0, 20, 10, 8, 2); ScheduleBgCopyTilemapToVram(1); } static void TTVcmd_End(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[2] == 0) PlayNewMapMusic(MUS_TEACHY_TV_MENU); TeachyTvBg2AnimController(); if (++data[2] > 63) { data[2] = 0; data[3] = 0; data[0] = TeachyTvSetupWindow(); gTasks[taskId].func = TeachyTvOptionListController; PutWindowTilemap(0); TeachyTvSetupScrollIndicatorArrowPair(); TeachyTvSetWindowRegs(); ScheduleBgCopyTilemapToVram(0); ChangeBgX(3, 0x0, 0); ChangeBgY(3, 0x0, 0); ChangeBgX(3, 0x1000, 2); ChangeBgY(3, 0x2800, 1); sResources->grassAnimCounterLo = 0; sResources->grassAnimCounterHi = 3; sResources->grassAnimDisabled = 0; } } static void TTVcmd_TaskBattleOrFadeByOptionChosen(u8 taskId) { switch (sStaticResources.whichScript) { case TTVSCR_BATTLE: case TTVSCR_STATUS: case TTVSCR_MATCHUPS: case TTVSCR_CATCHING: TeachyTvPrepBattle(taskId); break; case TTVSCR_TMS: case TTVSCR_REGISTER: sResources->savedCallback = TeachyTvSetupBagItemsByOptionChosen; TeachyTvQuitBeginFade(taskId); break; } } static void TeachyTvSetupBagItemsByOptionChosen(void) { if (sStaticResources.whichScript == TTVSCR_TMS) InitPokedudeBag(ITEMMENULOCATION_TTVSCR_TMS); else InitPokedudeBag(ITEMMENULOCATION_TTVSCR_REGISTER); } static void TeachyTvPostBattleFadeControl(u8 taskId) { s16 *data = gTasks[taskId].data; if (!(gPaletteFade.active)) { data[3] = sWhereToReturnToFromBattle[sStaticResources.whichScript]; gTasks[taskId].func = TeachyTvRenderMsgAndSwitchClusterFuncs; } } static void TeachyTvGrassAnimationMain(u8 taskId, s16 x, s16 y, u8 subpriority, bool8 mode) { struct Sprite *obj; u8 spriteId; if (sResources->grassAnimDisabled != 1 && TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(x - 0x10, y)) { spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_TALL_GRASS], 0, 0, subpriority); obj = &gSprites[spriteId]; obj->x2 = x; obj->y2 = y + 8; obj->callback = TeachyTvGrassAnimationObjCallback; obj->data[0] = taskId; if (mode == 1) { SeekSpriteAnim(obj, 4); obj->oam.priority = 2; } else { SetSubspriteTables(obj, sSubspriteTableArray); obj->subspriteTableNum = 0; obj->subspriteMode = 1; } } } static void TeachyTvGrassAnimationObjCallback(struct Sprite *sprite) { s16 diff1, diff2; s16 *data = gTasks[sprite->data[0]].data; struct Sprite *objAddr = &gSprites[data[1]]; if (sResources->grassAnimDisabled == 1) DestroySprite(sprite); else { if (sprite->animCmdIndex == 0) sprite->subspriteTableNum = 1; else sprite->subspriteTableNum = 0; sprite->x2 += data[4]; sprite->y2 += data[5]; if (sprite->animEnded) { sprite->subpriority = 0; diff1 = sprite->x2 - objAddr->x2; diff2 = sprite->y2 - objAddr->y2; if (diff1 <= -16 || diff1 >= 16 || diff2 <= -16 || diff2 >= 24) DestroySprite(sprite); } } } static u8 TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(s16 x, s16 y) { const u8 * arr; struct TeachyTvBuf *ptr; int high, low; if ((x < 0) || (y < 0)) return 0; arr = sGrassAnimArray; high = ((y >> 4) + sResources->grassAnimCounterHi) << 4; low = ((x >> 4) + sResources->grassAnimCounterLo); return arr[high+low]; } static void TeachyTvPrepBattle(u8 taskId) { s16 *data = gTasks[taskId].data; TeachyTvFree(); gSpecialVar_0x8004 = sStaticResources.whichScript; gMain.savedCallback = TeachyTvRestorePlayerPartyCallback; SavePlayerParty(); InitPokedudePartyAndOpponent(); PlayMapChosenOrBattleBGM(MUS_DUMMY); if (sStaticResources.whichScript == TTVSCR_BATTLE) data[6] = B_TRANSITION_WHITE_BARS_FADE; else data[6] = B_TRANSITION_SLICE; data[7] = 0; gTasks[taskId].func = TeachyTvPreBattleAnimAndSetBattleCallback; } static void TeachyTvPreBattleAnimAndSetBattleCallback(u8 taskId) { s16 *data = gTasks[taskId].data; switch (data[7]) { case 0: BattleTransition_StartOnField(data[6]); ++data[7]; break; case 1: if (IsBattleTransitionDone()) { SetMainCallback2(CB2_InitBattle); DestroyTask(taskId); } break; } } static void TeachyTvRestorePlayerPartyCallback(void) { LoadPlayerParty(); if (gBattleOutcome == B_OUTCOME_DREW) SetTeachyTvControllerModeToResume(); else PlayNewMapMusic(MUS_FOLLOW_ME); CB2_ReturnToTeachyTV(); } static void TeachyTvLoadBg3Map(u16 *buffer) { u16 * bgTilesBuffer; u8 * mapTilesRowBuffer; u16 i, j, k; u16 currentBlockIdx; void *tilesetsBuffer; void *palIndicesBuffer; u16 numMapTilesRows = 0; const struct MapLayout *layout = &Route1_Layout; u16 * blockIndicesBuffer = AllocZeroed(0x800); tilesetsBuffer = AllocZeroed(NUM_TILES_TOTAL * TILE_SIZE_4BPP); palIndicesBuffer = Alloc(16); memset(palIndicesBuffer, 0xFF, 16); TeachyTvLoadMapTilesetToBuffer(layout->primaryTileset, tilesetsBuffer, NUM_TILES_IN_PRIMARY); TeachyTvLoadMapTilesetToBuffer(layout->secondaryTileset, tilesetsBuffer + NUM_TILES_IN_PRIMARY * TILE_SIZE_4BPP, NUM_TILES_TOTAL - NUM_TILES_IN_PRIMARY); for (i = 0; i < 9; i++) { for (j = 0; j < 16; j++) { currentBlockIdx = layout->map[8 + (i + 6) * layout->width + j] & 0x3FF; for (k = 0; k < (i << 4) + j; k++) { if (blockIndicesBuffer[k] == 0) break; if (blockIndicesBuffer[k] == currentBlockIdx) break; } if (blockIndicesBuffer[k] == 0) { blockIndicesBuffer[k] = currentBlockIdx; numMapTilesRows++; } TeachyTvPushBackNewMapPalIndexArrayEntry(layout, &buffer[64 * i + 2 * j], palIndicesBuffer, currentBlockIdx, k); } } bgTilesBuffer = Alloc(numMapTilesRows * 0x80); mapTilesRowBuffer = Alloc(0x80); for (i = 0; i < numMapTilesRows; i++) { memset(mapTilesRowBuffer, 0, 0x80); if (blockIndicesBuffer[i] < NUM_METATILES_IN_PRIMARY) TeachyTvComputeMapTilesFromTilesetAndMetaTiles((const void *)layout->primaryTileset->metatiles + blockIndicesBuffer[i] * 16, mapTilesRowBuffer, tilesetsBuffer); else TeachyTvComputeMapTilesFromTilesetAndMetaTiles((const void *)layout->secondaryTileset->metatiles + (blockIndicesBuffer[i] - NUM_METATILES_IN_PRIMARY) * 16, mapTilesRowBuffer, tilesetsBuffer); CpuFastCopy(mapTilesRowBuffer, bgTilesBuffer + i * 0x40, 0x80); } LoadBgTiles(3, bgTilesBuffer, numMapTilesRows * 0x80, 0); TeachyTvLoadMapPalette(layout, palIndicesBuffer); Free(mapTilesRowBuffer); Free(bgTilesBuffer); Free(palIndicesBuffer); Free(tilesetsBuffer); Free(blockIndicesBuffer); } static void TeachyTvLoadMapTilesetToBuffer(const struct Tileset *ts, u8 *dstBuffer, u16 size) { if (ts) { if (!ts->isCompressed) CpuFastCopy(ts->tiles, dstBuffer, 0x20 * size); else LZDecompressWram(ts->tiles, dstBuffer); } } static void TeachyTvPushBackNewMapPalIndexArrayEntry(const struct MapLayout *mStruct, u16 *buf1, u8 *palIndexArray, u16 mapEntry, u16 offset) { const u16 * metaTileEntryAddr; if (mapEntry < NUM_METATILES_IN_PRIMARY) metaTileEntryAddr = &mStruct->primaryTileset->metatiles[8 * mapEntry]; else metaTileEntryAddr = &mStruct->secondaryTileset->metatiles[8 * (mapEntry - NUM_METATILES_IN_PRIMARY)]; buf1[0] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[0]) << 12) + 4 * offset; buf1[1] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[1]) << 12) + 4 * offset + 1; buf1[32] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[2]) << 12) + 4 * offset + 2; buf1[33] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[3]) << 12) + 4 * offset + 3; } static void TeachyTvComputeMapTilesFromTilesetAndMetaTiles(const u16 *metaTilesArray, u8 *blockBuf, u8 *tileset) { TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (*metaTilesArray & 0x3FF)], (*metaTilesArray >> 10) & 3); TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (metaTilesArray[4] & 0x3FF)], (metaTilesArray[4] >> 10) & 3); TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x20, &tileset[0x20 * (metaTilesArray[1] & 0x3FF)], (metaTilesArray[1] >> 10) & 3); TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x20, &tileset[0x20 * (metaTilesArray[5] & 0x3FF)], (metaTilesArray[5] >> 10) & 3); TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x40, &tileset[0x20 * (metaTilesArray[2] & 0x3FF)], (metaTilesArray[2] >> 10) & 3); TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x40, &tileset[0x20 * (metaTilesArray[6] & 0x3FF)], (metaTilesArray[6] >> 10) & 3); blockBuf += 0x60; TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (metaTilesArray[3] & 0x3FF)], (metaTilesArray[3] >> 10) & 3); TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (metaTilesArray[7] & 0x3FF)], (metaTilesArray[7] >> 10) & 3); } static void TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(u8 *blockBuf, u8 *tileset, u8 metaTile) { u8 i, j; u8 * buffer = AllocZeroed(0x20); u8 * src = AllocZeroed(0x20); CpuFastCopy(tileset, buffer, 0x20); if (metaTile & 1) { for (i = 0; i < 8; ++i) { for (j = 0; j < 4; ++j) { u32 offset = j - 3; u8 value = buffer[(i << 2) - offset]; src[(i << 2) + j] = ((value & 0xF) << 4) + ((value & 0xF0) >> 4); } } CpuFastCopy(src, buffer, 0x20); } if (metaTile & 2) { for (i = 0; i < 8; ++i) memcpy(&src[4 * i], &buffer[4 * (7 - i)], 4); CpuFastCopy(src, buffer, 0x20); } for (i = 0; i < 32; ++i) { if (buffer[i] & 0xF0) blockBuf[i] = (blockBuf[i] & 0xF) + (buffer[i] & 0xF0); if (buffer[i] & 0xF) blockBuf[i] = (blockBuf[i] & 0xF0) + (buffer[i] & 0xF); } Free(src); Free(buffer); } static u16 TeachyTvComputePalIndexArrayEntryByMetaTile(u8 *palIndexArrayBuf, u16 metaTile) { u32 i; int firstEntry; int temp; u32 pal = metaTile >> 12; i = 0; firstEntry = *palIndexArrayBuf; if (firstEntry != pal) { if (firstEntry == 0xFF) { *palIndexArrayBuf = pal; } else { while (++i < 16) { temp = palIndexArrayBuf[i]; if (temp == pal) break; if (temp == 0xFF) { palIndexArrayBuf[i] = pal; break; } } } } return (0xF - i); } static void TeachyTvLoadMapPalette(const struct MapLayout * mStruct, const u8 * palIndexArray) { u32 i; const struct Tileset * ts; const u16 * dest; for (i = 0; i < 16; i++) { if (palIndexArray[i] == 0xFF) break; if (palIndexArray[i] >= NUM_PALS_IN_PRIMARY) dest = mStruct->secondaryTileset->palettes[palIndexArray[i]]; else dest = mStruct->primaryTileset->palettes[palIndexArray[i]]; LoadPalette(dest, BG_PLTT_ID(15 - i), PLTT_SIZE_4BPP); } } ================================================ FILE: src/text.c ================================================ #include "global.h" #include "gflib.h" #include "m4a.h" #include "quest_log.h" #include "graphics.h" #include "dynamic_placeholder_text_util.h" #include "constants/songs.h" #define TAG_CURSOR 0x8000 #define CURSOR_DELAY 8 extern const struct OamData gOamData_AffineOff_ObjNormal_16x16; static void DecompressGlyph_NormalCopy1(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_NormalCopy2(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_Male(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_Bold(u16 glyphId); static s32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese); static s32 GetGlyphWidth_NormalCopy1(u16 glyphId, bool32 isJapanese); static s32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese); static s32 GetGlyphWidth_NormalCopy2(u16 glyphId, bool32 isJapanese); static s32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese); static s32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese); static void SpriteCB_TextCursor(struct Sprite *sprite); TextFlags gTextFlags; static const u8 sDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow.4bpp"); static const u8 sDarkDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_RS.4bpp"); static const u8 sTinyArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_2.4bpp"); static const u8 sTinyDarkDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_RS_2.4bpp"); static const u8 sDoubleArrowTiles1[] = INCBIN_U8("graphics/fonts/down_arrow_3.4bpp"); static const u8 sDoubleArrowTiles2[] = INCBIN_U8("graphics/fonts/down_arrow_4.4bpp"); static const u8 sDownArrowYCoords[] = { 0, 16, 32, 16 }; static const u8 sWindowVerticalScrollSpeeds[] = { [OPTIONS_TEXT_SPEED_SLOW] = 1, [OPTIONS_TEXT_SPEED_MID] = 2, [OPTIONS_TEXT_SPEED_FAST] = 4, [OPTIONS_TEXT_SPEED_INSTANT] = 4, }; static const struct GlyphWidthFunc sGlyphWidthFuncs[] = { { FONT_SMALL, GetGlyphWidth_Small }, { FONT_NORMAL_COPY_1, GetGlyphWidth_NormalCopy1 }, { FONT_NORMAL, GetGlyphWidth_Normal }, { FONT_NORMAL_COPY_2, GetGlyphWidth_NormalCopy2 }, { FONT_MALE, GetGlyphWidth_Male }, { FONT_FEMALE, GetGlyphWidth_Female }, { FONT_BRAILLE, GetGlyphWidth_Braille } }; static const struct SpriteSheet sSpriteSheets_TextCursor[] = { {sDoubleArrowTiles1, sizeof(sDoubleArrowTiles1), TAG_CURSOR}, {sDoubleArrowTiles2, sizeof(sDoubleArrowTiles2), TAG_CURSOR}, {NULL} }; static const struct SpritePalette sSpritePalettes_TextCursor[] = { {gStandardMenuPalette, TAG_CURSOR}, {NULL} }; static const struct SpriteTemplate sSpriteTemplate_TextCursor = { .tileTag = TAG_CURSOR, .paletteTag = TAG_CURSOR, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_TextCursor, }; struct { u16 tileOffset; u8 width; u8 height; } static const sKeypadIcons[] = { [CHAR_A_BUTTON] = { 0x0, 8, 12 }, [CHAR_B_BUTTON] = { 0x1, 8, 12 }, [CHAR_L_BUTTON] = { 0x2, 16, 12 }, [CHAR_R_BUTTON] = { 0x4, 16, 12 }, [CHAR_START_BUTTON] = { 0x6, 24, 12 }, [CHAR_SELECT_BUTTON] = { 0x9, 24, 12 }, [CHAR_DPAD_UP] = { 0xC, 8, 12 }, [CHAR_DPAD_DOWN] = { 0xD, 8, 12 }, [CHAR_DPAD_LEFT] = { 0xE, 8, 12 }, [CHAR_DPAD_RIGHT] = { 0xF, 8, 12 }, [CHAR_DPAD_UPDOWN] = { 0x20, 8, 12 }, [CHAR_DPAD_LEFTRIGHT] = { 0x21, 8, 12 }, [CHAR_DPAD_NONE] = { 0x22, 8, 12 }, }; const u8 gKeypadIconTiles[] = INCBIN_U8("graphics/fonts/keypad_icons.4bpp"); static const u16 sFontSmallLatinGlyphs[] = INCBIN_U16("graphics/fonts/latin_small.latfont"); static const u8 sFontSmallLatinGlyphWidths[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 4, 4, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 8, 7, 8, 5, 5, 5, 5, 5, 8, 8, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 4, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5 }; static const u16 sFontSmallJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/japanese_small.fwjpnfont"); static const u16 sFontNormalCopy1LatinGlyphs[] = INCBIN_U16("graphics/fonts/latin_normal.latfont"); static const u8 sFontNormalCopy1LatinGlyphWidths[] = { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 9, 8, 8, 6, 6, 6, 6, 6, 10, 8, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 4, 6, 8, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 5, 6, 6, 6, 3, 3, 6, 6, 8, 5, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 4, 6, 5, 5, 6, 5, 6, 6, 6, 5, 5, 5, 6, 6, 6, 6, 6, 6, 8, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6 }; static const u16 sFontTallJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/japanese_tall.fwjpnfont"); static const u16 sFontNormalLatinGlyphs[] = INCBIN_U16("graphics/fonts/latin_normal.latfont"); static const u8 sFontNormalLatinGlyphWidths[] = { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 9, 8, 8, 6, 6, 6, 6, 6, 10, 8, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 4, 6, 8, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 10, 6, 6, 6, 6, 6, 6, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 5, 6, 6, 6, 3, 3, 6, 6, 8, 5, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 4, 6, 5, 5, 6, 5, 6, 6, 6, 5, 5, 5, 6, 6, 6, 6, 6, 6, 8, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6 }; static const u16 sFontNormalJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/japanese_normal.fwjpnfont"); static const u8 sFontNormalJapaneseGlyphWidths[] = { 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 9, 10, 10, 10, 8, 10, 10, 10, 10, 8, 8, 8, 10, 10, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 2, 4, 6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0 }; static const u16 sFontMaleLatinGlyphs[] = INCBIN_U16("graphics/fonts/latin_male.latfont"); static const u8 sFontMaleLatinGlyphWidths[] = { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 9, 8, 8, 6, 6, 6, 6, 6, 10, 8, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 4, 6, 8, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 5, 6, 6, 6, 3, 3, 6, 6, 8, 5, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 4, 6, 5, 5, 6, 5, 6, 6, 6, 5, 5, 5, 6, 6, 6, 6, 6, 6, 8, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6 }; static const u16 sFontMaleJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/japanese_male.fwjpnfont"); static const u8 sFontMaleJapaneseGlyphWidths[] = { 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 9, 10, 10, 10, 8, 10, 10, 10, 10, 8, 8, 8, 10, 10, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 2, 4, 6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0 }; static const u16 sFontFemaleLatinGlyphs[] = INCBIN_U16("graphics/fonts/latin_female.latfont"); static const u8 sFontFemaleLatinGlyphWidths[] = { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 9, 8, 8, 6, 6, 6, 6, 6, 10, 8, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 4, 6, 8, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 5, 6, 6, 6, 3, 3, 6, 6, 8, 5, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 4, 6, 5, 5, 6, 5, 6, 6, 6, 5, 5, 5, 6, 6, 6, 6, 6, 6, 8, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6 }; static const u16 sFontFemaleJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/japanese_female.fwjpnfont"); static const u8 sFontFemaleJapaneseGlyphWidths[] = { 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 9, 10, 10, 10, 8, 10, 10, 10, 10, 8, 8, 8, 10, 10, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 2, 4, 6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0 }; static const u16 sFontBoldJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/japanese_bold.fwjpnfont"); u16 FontFunc_Small(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; if (subStruct->hasGlyphIdBeenSet == 0) { textPrinter->subUnion.sub.glyphId = FONT_SMALL; subStruct->hasGlyphIdBeenSet = 1; } return RenderText(textPrinter); } u16 FontFunc_NormalCopy1(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; if (subStruct->hasGlyphIdBeenSet == 0) { textPrinter->subUnion.sub.glyphId = FONT_NORMAL_COPY_1; subStruct->hasGlyphIdBeenSet = 1; } return RenderText(textPrinter); } u16 FontFunc_Normal(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; if (subStruct->hasGlyphIdBeenSet == 0) { textPrinter->subUnion.sub.glyphId = FONT_NORMAL; subStruct->hasGlyphIdBeenSet = 1; } return RenderText(textPrinter); } u16 FontFunc_NormalCopy2(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; if (subStruct->hasGlyphIdBeenSet == 0) { textPrinter->subUnion.sub.glyphId = FONT_NORMAL_COPY_2; subStruct->hasGlyphIdBeenSet = 1; } return RenderText(textPrinter); } u16 FontFunc_Male(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; if (subStruct->hasGlyphIdBeenSet == 0) { textPrinter->subUnion.sub.glyphId = FONT_MALE; subStruct->hasGlyphIdBeenSet = 1; } return RenderText(textPrinter); } u16 FontFunc_Female(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; if (subStruct->hasGlyphIdBeenSet == 0) { textPrinter->subUnion.sub.glyphId = FONT_FEMALE; subStruct->hasGlyphIdBeenSet = 1; } return RenderText(textPrinter); } void TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; if (gTextFlags.autoScroll == 1) subStruct->autoScrollDelay = 0; else { subStruct->downArrowYPosIdx = 0; subStruct->downArrowDelay = 0; } } void TextPrinterDrawDownArrow(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; const u8 *arrowTiles; if (gTextFlags.autoScroll == 0) { if (subStruct->downArrowDelay != 0) { subStruct->downArrowDelay = ((*(u32 *)&textPrinter->subUnion.sub) << 19 >> 27) - 1; // convoluted way of getting field_1, necessary to match } else { FillWindowPixelRect( textPrinter->printerTemplate.windowId, textPrinter->printerTemplate.bgColor << 4 | textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, 10, 12); switch (gTextFlags.useAlternateDownArrow) { case 0: default: arrowTiles = sDownArrowTiles; break; case 1: arrowTiles = sDarkDownArrowTiles; break; } BlitBitmapRectToWindow( textPrinter->printerTemplate.windowId, arrowTiles, sDownArrowYCoords[subStruct->downArrowYPosIdx], 0, 0x80, 0x10, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, 10, 12); CopyWindowToVram(textPrinter->printerTemplate.windowId, 0x2); subStruct->downArrowDelay = CURSOR_DELAY; subStruct->downArrowYPosIdx = (*(u32 *)subStruct << 17 >> 30) + 1; } } } void TextPrinterClearDownArrow(struct TextPrinter *textPrinter) { FillWindowPixelRect( textPrinter->printerTemplate.windowId, textPrinter->printerTemplate.bgColor << 4 | textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, 10, 12); CopyWindowToVram(textPrinter->printerTemplate.windowId, 0x2); } bool8 TextPrinterWaitAutoMode(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; u8 delay = (gQuestLogState == QL_STATE_PLAYBACK) ? 50 : 120; if (subStruct->autoScrollDelay == delay) { return TRUE; } else { subStruct->autoScrollDelay++; return FALSE; } } bool16 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter) { bool8 result = FALSE; if (gTextFlags.autoScroll != 0) { result = TextPrinterWaitAutoMode(textPrinter); } else { TextPrinterDrawDownArrow(textPrinter); if (JOY_NEW(A_BUTTON | B_BUTTON)) { result = TRUE; PlaySE(SE_SELECT); } } return result; } bool16 TextPrinterWait(struct TextPrinter *textPrinter) { bool16 result = FALSE; if (gTextFlags.autoScroll != 0) { result = TextPrinterWaitAutoMode(textPrinter); } else { if (JOY_NEW(A_BUTTON | B_BUTTON)) { result = TRUE; PlaySE(SE_SELECT); } } return result; } void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *counter, u8 *yCoordIndex) { const u8 *arrowTiles; if (*counter != 0) { --*counter; } else { FillWindowPixelRect(windowId, (bgColor << 4) | bgColor, x, y, 10, 12); if (drawArrow == 0) { switch (gTextFlags.useAlternateDownArrow) { case 0: default: arrowTiles = sDownArrowTiles; break; case 1: arrowTiles = sDarkDownArrowTiles; break; } BlitBitmapRectToWindow( windowId, arrowTiles, sDownArrowYCoords[*yCoordIndex & 3], 0, 0x80, 0x10, x, y, 10, 12); CopyWindowToVram(windowId, 0x2); *counter = CURSOR_DELAY; ++*yCoordIndex; } } } u16 RenderText(struct TextPrinter *textPrinter) { struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub; u16 currChar; s32 width; s32 widthHelper; switch (textPrinter->state) { case RENDER_STATE_HANDLE_CHAR: if (JOY_HELD(A_BUTTON | B_BUTTON) && subStruct->hasPrintBeenSpedUp) textPrinter->delayCounter = 0; if (textPrinter->delayCounter && textPrinter->textSpeed) { textPrinter->delayCounter--; if (gTextFlags.canABSpeedUpPrint && JOY_NEW(A_BUTTON | B_BUTTON)) { subStruct->hasPrintBeenSpedUp = TRUE; textPrinter->delayCounter = 0; } return RENDER_UPDATE; } if (gTextFlags.autoScroll) textPrinter->delayCounter = 1; else textPrinter->delayCounter = textPrinter->textSpeed; currChar = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; switch (currChar) { case CHAR_NEWLINE: textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x; textPrinter->printerTemplate.currentY += gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing; return RENDER_REPEAT; case PLACEHOLDER_BEGIN: textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_BEGIN: currChar = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; switch (currChar) { case EXT_CTRL_CODE_COLOR: textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return RENDER_REPEAT; case EXT_CTRL_CODE_HIGHLIGHT: textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return RENDER_REPEAT; case EXT_CTRL_CODE_SHADOW: textPrinter->printerTemplate.shadowColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return RENDER_REPEAT; case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; textPrinter->printerTemplate.shadowColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return RENDER_REPEAT; case EXT_CTRL_CODE_PALETTE: textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_FONT: subStruct->glyphId = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_RESET_FONT: return RENDER_REPEAT; case EXT_CTRL_CODE_PAUSE: textPrinter->delayCounter = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; textPrinter->state = RENDER_STATE_PAUSE; return RENDER_REPEAT; case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS: textPrinter->state = RENDER_STATE_WAIT; if (gTextFlags.autoScroll) subStruct->autoScrollDelay = 0; return RENDER_UPDATE; case EXT_CTRL_CODE_WAIT_SE: textPrinter->state = RENDER_STATE_WAIT_SE; return RENDER_UPDATE; case EXT_CTRL_CODE_PLAY_BGM: currChar = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; currChar |= *textPrinter->printerTemplate.currentChar << 8; textPrinter->printerTemplate.currentChar++; if (!QL_IS_PLAYBACK_STATE) PlayBGM(currChar); return RENDER_REPEAT; case EXT_CTRL_CODE_PLAY_SE: currChar = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; currChar |= (*textPrinter->printerTemplate.currentChar << 8); textPrinter->printerTemplate.currentChar++; PlaySE(currChar); return RENDER_REPEAT; case EXT_CTRL_CODE_ESCAPE: textPrinter->printerTemplate.currentChar++; currChar = *textPrinter->printerTemplate.currentChar; break; case EXT_CTRL_CODE_SHIFT_RIGHT: textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x + *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_SHIFT_DOWN: textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y + *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_FILL_WINDOW: FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); return RENDER_REPEAT; case EXT_CTRL_CODE_PAUSE_MUSIC: m4aMPlayStop(&gMPlayInfo_BGM); return RENDER_REPEAT; case EXT_CTRL_CODE_RESUME_MUSIC: m4aMPlayContinue(&gMPlayInfo_BGM); return RENDER_REPEAT; case EXT_CTRL_CODE_CLEAR: width = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; if (width > 0) { ClearTextSpan(textPrinter, width); textPrinter->printerTemplate.currentX += width; return RENDER_PRINT; } return RENDER_REPEAT; case EXT_CTRL_CODE_SKIP: textPrinter->printerTemplate.currentX = *textPrinter->printerTemplate.currentChar + textPrinter->printerTemplate.x; textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_CLEAR_TO: { widthHelper = *textPrinter->printerTemplate.currentChar; widthHelper += textPrinter->printerTemplate.x; textPrinter->printerTemplate.currentChar++; width = widthHelper - textPrinter->printerTemplate.currentX; if (width > 0) { ClearTextSpan(textPrinter, width); textPrinter->printerTemplate.currentX += width; return RENDER_PRINT; } } return RENDER_REPEAT; case EXT_CTRL_CODE_MIN_LETTER_SPACING: textPrinter->minLetterSpacing = *textPrinter->printerTemplate.currentChar++; return RENDER_REPEAT; case EXT_CTRL_CODE_JPN: textPrinter->japanese = TRUE; return RENDER_REPEAT; case EXT_CTRL_CODE_ENG: textPrinter->japanese = FALSE; return RENDER_REPEAT; } break; case CHAR_PROMPT_CLEAR: textPrinter->state = RENDER_STATE_CLEAR; TextPrinterInitDownArrowCounters(textPrinter); return RENDER_UPDATE; case CHAR_PROMPT_SCROLL: textPrinter->state = RENDER_STATE_SCROLL_START; TextPrinterInitDownArrowCounters(textPrinter); return RENDER_UPDATE; case CHAR_EXTRA_SYMBOL: currChar = *textPrinter->printerTemplate.currentChar | 0x100; textPrinter->printerTemplate.currentChar++; break; case CHAR_KEYPAD_ICON: currChar = *textPrinter->printerTemplate.currentChar++; gGlyphInfo.width = DrawKeypadIcon(textPrinter->printerTemplate.windowId, currChar, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY); textPrinter->printerTemplate.currentX += gGlyphInfo.width + textPrinter->printerTemplate.letterSpacing; return RENDER_PRINT; case EOS: return RENDER_FINISH; } switch (subStruct->glyphId) { case FONT_SMALL: DecompressGlyph_Small(currChar, textPrinter->japanese); break; case FONT_NORMAL_COPY_1: DecompressGlyph_NormalCopy1(currChar, textPrinter->japanese); break; case FONT_NORMAL: DecompressGlyph_Normal(currChar, textPrinter->japanese); break; case FONT_NORMAL_COPY_2: DecompressGlyph_NormalCopy2(currChar, textPrinter->japanese); break; case FONT_MALE: DecompressGlyph_Male(currChar, textPrinter->japanese); break; case FONT_FEMALE: DecompressGlyph_Female(currChar, textPrinter->japanese); break; } CopyGlyphToWindow(textPrinter); if (textPrinter->minLetterSpacing) { textPrinter->printerTemplate.currentX += gGlyphInfo.width; width = textPrinter->minLetterSpacing - gGlyphInfo.width; if (width > 0) { ClearTextSpan(textPrinter, width); textPrinter->printerTemplate.currentX += width; } } else { if (textPrinter->japanese) textPrinter->printerTemplate.currentX += (gGlyphInfo.width + textPrinter->printerTemplate.letterSpacing); else textPrinter->printerTemplate.currentX += gGlyphInfo.width; } return RENDER_PRINT; case RENDER_STATE_WAIT: if (TextPrinterWait(textPrinter)) textPrinter->state = RENDER_STATE_HANDLE_CHAR; return RENDER_UPDATE; case RENDER_STATE_CLEAR: if (TextPrinterWaitWithDownArrow(textPrinter)) { FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x; textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y; textPrinter->state = RENDER_STATE_HANDLE_CHAR; } return RENDER_UPDATE; case RENDER_STATE_SCROLL_START: if (TextPrinterWaitWithDownArrow(textPrinter)) { TextPrinterClearDownArrow(textPrinter); textPrinter->scrollDistance = gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing; textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x; textPrinter->state = RENDER_STATE_SCROLL; } return RENDER_UPDATE; case RENDER_STATE_SCROLL: if (textPrinter->scrollDistance) { if (textPrinter->scrollDistance < sWindowVerticalScrollSpeeds[gSaveBlock2Ptr->optionsTextSpeed]) { ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); textPrinter->scrollDistance = 0; } else { ScrollWindow(textPrinter->printerTemplate.windowId, 0, sWindowVerticalScrollSpeeds[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor)); textPrinter->scrollDistance -= sWindowVerticalScrollSpeeds[gSaveBlock2Ptr->optionsTextSpeed]; } CopyWindowToVram(textPrinter->printerTemplate.windowId, COPYWIN_GFX); } else { textPrinter->state = RENDER_STATE_HANDLE_CHAR; } return RENDER_UPDATE; case RENDER_STATE_WAIT_SE: if (!IsSEPlaying()) textPrinter->state = RENDER_STATE_HANDLE_CHAR; return RENDER_UPDATE; case RENDER_STATE_PAUSE: if (textPrinter->delayCounter != 0) textPrinter->delayCounter--; else textPrinter->state = RENDER_STATE_HANDLE_CHAR; return RENDER_UPDATE; } return RENDER_FINISH; } // Unused static s32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing) { int i; u8 width; int temp; int temp2; u8 line; int strPos; u8 lineWidths[8]; const u8 *strLocal; for (i = 0; i < (int)ARRAY_COUNT(lineWidths); i++) lineWidths[i] = 0; width = 0; line = 0; strLocal = str; strPos = 0; do { temp = strLocal[strPos++]; switch (temp) { case CHAR_NEWLINE: case EOS: lineWidths[line] = width; width = 0; line++; break; case EXT_CTRL_CODE_BEGIN: temp2 = strLocal[strPos++]; switch (temp2) { case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: ++strPos; case EXT_CTRL_CODE_PLAY_BGM: case EXT_CTRL_CODE_PLAY_SE: ++strPos; case EXT_CTRL_CODE_COLOR: case EXT_CTRL_CODE_HIGHLIGHT: case EXT_CTRL_CODE_SHADOW: case EXT_CTRL_CODE_PALETTE: case EXT_CTRL_CODE_FONT: case EXT_CTRL_CODE_PAUSE: case EXT_CTRL_CODE_ESCAPE: case EXT_CTRL_CODE_SHIFT_RIGHT: case EXT_CTRL_CODE_SHIFT_DOWN: case EXT_CTRL_CODE_CLEAR: case EXT_CTRL_CODE_SKIP: case EXT_CTRL_CODE_CLEAR_TO: case EXT_CTRL_CODE_MIN_LETTER_SPACING: ++strPos; break; case EXT_CTRL_CODE_RESET_FONT: case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS: case EXT_CTRL_CODE_WAIT_SE: case EXT_CTRL_CODE_FILL_WINDOW: case EXT_CTRL_CODE_JPN: case EXT_CTRL_CODE_ENG: default: break; } break; case CHAR_DYNAMIC: case PLACEHOLDER_BEGIN: ++strPos; break; case CHAR_PROMPT_SCROLL: case CHAR_PROMPT_CLEAR: break; case CHAR_KEYPAD_ICON: case CHAR_EXTRA_SYMBOL: ++strPos; default: ++width; break; } } while (temp != EOS); for (width = 0, strPos = 0; strPos < (int)ARRAY_COUNT(lineWidths); ++strPos) { if (width < lineWidths[strPos]) width = lineWidths[strPos]; } return (u8)(GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH) + letterSpacing) * width; } s32 (*GetFontWidthFunc(u8 glyphId))(u16 _glyphId, bool32 _isJapanese) { u32 i; for (i = 0; i < ARRAY_COUNT(sGlyphWidthFuncs); ++i) { if (glyphId == sGlyphWidthFuncs[i].fontId) return *sGlyphWidthFuncs[i].func; } return NULL; } s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) { bool8 isJapanese; int minGlyphWidth; s32 (*func)(u16 glyphId, bool32 isJapanese); int localLetterSpacing; u32 lineWidth; const u8 *bufferPointer; int glyphWidth; u32 width; isJapanese = FALSE; minGlyphWidth = 0; func = GetFontWidthFunc(fontId); if (func == NULL) return 0; if (letterSpacing == -1) localLetterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING); else localLetterSpacing = letterSpacing; width = 0; lineWidth = 0; bufferPointer = NULL; while (*str != EOS) { switch (*str) { case CHAR_NEWLINE: if (lineWidth > width) width = lineWidth; lineWidth = 0; break; case PLACEHOLDER_BEGIN: switch (*++str) { case PLACEHOLDER_ID_STRING_VAR_1: bufferPointer = gStringVar1; break; case PLACEHOLDER_ID_STRING_VAR_2: bufferPointer = gStringVar2; break; case PLACEHOLDER_ID_STRING_VAR_3: bufferPointer = gStringVar3; break; default: return 0; } case CHAR_DYNAMIC: if (bufferPointer == NULL) bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str); while (*bufferPointer != EOS) { glyphWidth = func(*bufferPointer++, isJapanese); if (minGlyphWidth > 0) lineWidth += minGlyphWidth > glyphWidth ? minGlyphWidth : glyphWidth; else lineWidth += isJapanese ? glyphWidth + localLetterSpacing : glyphWidth; } bufferPointer = NULL; break; case CHAR_PROMPT_SCROLL: case CHAR_PROMPT_CLEAR: break; case EXT_CTRL_CODE_BEGIN: switch (*++str) { case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: ++str; case EXT_CTRL_CODE_PLAY_BGM: case EXT_CTRL_CODE_PLAY_SE: ++str; case EXT_CTRL_CODE_COLOR: case EXT_CTRL_CODE_HIGHLIGHT: case EXT_CTRL_CODE_SHADOW: case EXT_CTRL_CODE_PALETTE: case EXT_CTRL_CODE_PAUSE: case EXT_CTRL_CODE_ESCAPE: case EXT_CTRL_CODE_SHIFT_RIGHT: case EXT_CTRL_CODE_SHIFT_DOWN: ++str; case EXT_CTRL_CODE_RESET_FONT: case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS: case EXT_CTRL_CODE_WAIT_SE: case EXT_CTRL_CODE_FILL_WINDOW: break; case EXT_CTRL_CODE_FONT: func = GetFontWidthFunc(*++str); if (func == NULL) return 0; if (letterSpacing == -1) localLetterSpacing = GetFontAttribute(*str, FONTATTR_LETTER_SPACING); break; case EXT_CTRL_CODE_CLEAR: glyphWidth = *++str; lineWidth += glyphWidth; break; case EXT_CTRL_CODE_SKIP: lineWidth = *++str; break; case EXT_CTRL_CODE_CLEAR_TO: if (*++str > lineWidth) lineWidth = *str; break; case EXT_CTRL_CODE_MIN_LETTER_SPACING: minGlyphWidth = *++str; break; case EXT_CTRL_CODE_JPN: isJapanese = TRUE; break; case EXT_CTRL_CODE_ENG: isJapanese = FALSE; default: break; } break; case CHAR_KEYPAD_ICON: case CHAR_EXTRA_SYMBOL: if (*str == CHAR_EXTRA_SYMBOL) glyphWidth = func(*++str | 0x100, isJapanese); else glyphWidth = GetKeypadIconWidth(*++str); if (minGlyphWidth > 0) { if (glyphWidth < minGlyphWidth) glyphWidth = minGlyphWidth; } else if (isJapanese) { glyphWidth += localLetterSpacing; } lineWidth += glyphWidth; break; default: glyphWidth = func(*str, isJapanese); if (minGlyphWidth > 0) { if (glyphWidth < minGlyphWidth) glyphWidth = minGlyphWidth; lineWidth += glyphWidth; } else { if (fontId != FONT_BRAILLE && isJapanese) glyphWidth += localLetterSpacing; lineWidth += glyphWidth; } break; } ++str; } if (lineWidth > width) return lineWidth; return width; } u8 RenderTextHandleBold(u8 *pixels, u8 fontId, u8 *str, int a3, int a4, int a5, int a6, int a7) { u8 shadowColor; u8 *strLocal; int strPos; int temp; int temp2; u8 colorBackup[3]; u8 fgColor; u8 bgColor; SaveTextColors(&colorBackup[0], &colorBackup[1], &colorBackup[2]); fgColor = 1; bgColor = 0; shadowColor = 3; GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY); strLocal = str; strPos = 0; do { temp = strLocal[strPos++]; switch (temp) { case EXT_CTRL_CODE_BEGIN: temp2 = strLocal[strPos++]; switch (temp2) { case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: fgColor = strLocal[strPos++]; bgColor = strLocal[strPos++]; shadowColor = strLocal[strPos++]; GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); continue; case EXT_CTRL_CODE_COLOR: fgColor = strLocal[strPos++]; GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); continue; case EXT_CTRL_CODE_HIGHLIGHT: bgColor = strLocal[strPos++]; GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); continue; case EXT_CTRL_CODE_SHADOW: shadowColor = strLocal[strPos++]; GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); continue; case EXT_CTRL_CODE_FONT: fontId = strLocal[strPos++]; break; case EXT_CTRL_CODE_PLAY_BGM: case EXT_CTRL_CODE_PLAY_SE: ++strPos; case EXT_CTRL_CODE_PALETTE: case EXT_CTRL_CODE_PAUSE: case EXT_CTRL_CODE_ESCAPE: case EXT_CTRL_CODE_SHIFT_RIGHT: case EXT_CTRL_CODE_SHIFT_DOWN: case EXT_CTRL_CODE_CLEAR: case EXT_CTRL_CODE_SKIP: case EXT_CTRL_CODE_CLEAR_TO: case EXT_CTRL_CODE_MIN_LETTER_SPACING: ++strPos; break; case EXT_CTRL_CODE_RESET_FONT: case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS: case EXT_CTRL_CODE_WAIT_SE: case EXT_CTRL_CODE_FILL_WINDOW: case EXT_CTRL_CODE_JPN: case EXT_CTRL_CODE_ENG: default: continue; } break; case CHAR_DYNAMIC: case CHAR_KEYPAD_ICON: case CHAR_EXTRA_SYMBOL: case PLACEHOLDER_BEGIN: ++strPos; break; case CHAR_PROMPT_SCROLL: case CHAR_PROMPT_CLEAR: case CHAR_NEWLINE: case EOS: break; default: DecompressGlyph_Bold(temp); CpuCopy32(gGlyphInfo.pixels, pixels, 0x20); CpuCopy32(gGlyphInfo.pixels + 0x40, pixels + 0x20, 0x20); pixels += 0x40; break; } } while (temp != EOS); RestoreTextColors(&colorBackup[0], &colorBackup[1], &colorBackup[2]); return 1; } #define sDelay data[0] #define sState data[1] static void SpriteCB_TextCursor(struct Sprite *sprite) { if (sprite->sDelay) { sprite->sDelay--; } else { sprite->sDelay = CURSOR_DELAY; switch(sprite->sState) { case 0: sprite->y2 = 0; break; case 1: sprite->y2 = 1; break; case 2: sprite->y2 = 2; break; case 3: sprite->y2 = 1; sprite->sState = 0; return; } sprite->sState++; } } u8 CreateTextCursorSprite(u8 sheetId, u16 x, u16 y, u8 priority, u8 subpriority) { u8 spriteId; LoadSpriteSheet(&sSpriteSheets_TextCursor[sheetId & 1]); LoadSpritePalette(&sSpritePalettes_TextCursor[0]); spriteId = CreateSprite(&sSpriteTemplate_TextCursor, x + 3, y + 4, subpriority); gSprites[spriteId].oam.priority = (priority & 3); gSprites[spriteId].oam.matrixNum = 0; gSprites[spriteId].sDelay = CURSOR_DELAY; return spriteId; } void DestroyTextCursorSprite(u8 spriteId) { DestroySprite(&gSprites[spriteId]); FreeSpriteTilesByTag(TAG_CURSOR); FreeSpritePaletteByTag(TAG_CURSOR); } #undef sDelay #undef sState u8 DrawKeypadIcon(u8 windowId, u8 keypadIconId, u16 x, u16 y) { BlitBitmapRectToWindow( windowId, gKeypadIconTiles + (sKeypadIcons[keypadIconId].tileOffset * 0x20), 0, 0, 0x80, 0x80, x, y, sKeypadIcons[keypadIconId].width, sKeypadIcons[keypadIconId].height); return sKeypadIcons[keypadIconId].width; } u8 GetKeypadIconTileOffset(u8 keypadIconId) { return sKeypadIcons[keypadIconId].tileOffset; } u8 GetKeypadIconWidth(u8 keypadIconId) { return sKeypadIcons[keypadIconId].width; } u8 GetKeypadIconHeight(u8 keypadIconId) { return sKeypadIcons[keypadIconId].height; } void DecompressGlyph_Small(u16 glyphId, bool32 isJapanese) { const u16 *glyphs; if (isJapanese == TRUE) { glyphs = sFontSmallJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF)); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); gGlyphInfo.width = 8; gGlyphInfo.height = 12; } else { glyphs = sFontSmallLatinGlyphs + (0x10 * glyphId); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x40)); gGlyphInfo.width = sFontSmallLatinGlyphWidths[glyphId]; gGlyphInfo.height = 13; } } static s32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) return 8; else return sFontSmallLatinGlyphWidths[glyphId]; } static void DecompressGlyph_NormalCopy1(u16 glyphId, bool32 isJapanese) { const u16 *glyphs; if (isJapanese == TRUE) { // This font only differs from the Normal font in Japanese int eff; glyphs = sFontTallJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & (eff = 0xF))); // shh, no questions, only matching now DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); gGlyphInfo.width = 8; gGlyphInfo.height = 16; } else { glyphs = sFontNormalCopy1LatinGlyphs + (0x20 * glyphId); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); gGlyphInfo.width = sFontNormalCopy1LatinGlyphWidths[glyphId]; gGlyphInfo.height = 14; } } static s32 GetGlyphWidth_NormalCopy1(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) return 8; else return sFontNormalCopy1LatinGlyphWidths[glyphId]; } void DecompressGlyph_Normal(u16 glyphId, bool32 isJapanese) { const u16 *glyphs; int i; u8 lastColor; if (isJapanese == TRUE) { if (glyphId == 0) { lastColor = GetLastTextColor(2); for(i = 0; i < 0x80; i++) { gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // Game Freak, please. writing the same values over and over... gGlyphInfo.width = 10; gGlyphInfo.height = 12; } } else { glyphs = sFontNormalJapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7)); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); gGlyphInfo.width = sFontNormalJapaneseGlyphWidths[glyphId]; gGlyphInfo.height = 12; } } else { if (glyphId == 0) { lastColor = GetLastTextColor(2); for(i = 0; i < 0x80; i++) { gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // but why gGlyphInfo.width = sFontNormalLatinGlyphWidths[0]; gGlyphInfo.height = 14; } } else { glyphs = sFontNormalLatinGlyphs + (0x20 * glyphId); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); gGlyphInfo.width = sFontNormalLatinGlyphWidths[glyphId]; gGlyphInfo.height = 14; } } } static s32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) { if (glyphId == 0) return 10; return sFontNormalJapaneseGlyphWidths[glyphId]; } else { return sFontNormalLatinGlyphWidths[glyphId]; } } static void DecompressGlyph_NormalCopy2(u16 glyphId, bool32 isJapanese) { const u16 *glyphs; int i; u8 lastColor; if (isJapanese == TRUE) { if (glyphId == 0) { lastColor = GetLastTextColor(2); for(i = 0; i < 0x80; i++) { gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // Game Freak, please. writing the same values over and over... gGlyphInfo.width = 10; gGlyphInfo.height = 12; } } else { glyphs = sFontNormalJapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7)); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); gGlyphInfo.width = 10; gGlyphInfo.height = 12; } } else DecompressGlyph_Normal(glyphId, isJapanese); } static s32 GetGlyphWidth_NormalCopy2(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) return 10; else return sFontNormalLatinGlyphWidths[glyphId]; } static void DecompressGlyph_Male(u16 glyphId, bool32 isJapanese) { const u16 *glyphs; int i; u8 lastColor; if (isJapanese == TRUE) { if (glyphId == 0) { lastColor = GetLastTextColor(2); for(i = 0; i < 0x80; i++) { gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // Game Freak, please. writing the same values over and over... gGlyphInfo.width = 10; gGlyphInfo.height = 12; } } else { glyphs = sFontMaleJapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7)); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); gGlyphInfo.width = sFontMaleJapaneseGlyphWidths[glyphId]; gGlyphInfo.height = 12; } } else { if (glyphId == 0) { lastColor = GetLastTextColor(2); for(i = 0; i < 0x80; i++) { gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // but why gGlyphInfo.width = sFontMaleLatinGlyphWidths[0]; gGlyphInfo.height = 14; } } else { glyphs = sFontMaleLatinGlyphs + (0x20 * glyphId); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); gGlyphInfo.width = sFontMaleLatinGlyphWidths[glyphId]; gGlyphInfo.height = 14; } } } static s32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) { if (glyphId == 0) return 10; return sFontMaleJapaneseGlyphWidths[glyphId]; } else return sFontMaleLatinGlyphWidths[glyphId]; } void DecompressGlyph_Female(u16 glyphId, bool32 isJapanese) { const u16 *glyphs; int i; u8 lastColor; if (isJapanese == TRUE) { if (glyphId == 0) { lastColor = GetLastTextColor(2); for(i = 0; i < 0x80; i++) { gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // Game Freak, please. writing the same values over and over... gGlyphInfo.width = 10; gGlyphInfo.height = 12; } } else { glyphs = sFontFemaleJapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7)); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); gGlyphInfo.width = sFontFemaleJapaneseGlyphWidths[glyphId]; gGlyphInfo.height = 12; } } else { if (glyphId == 0) { lastColor = GetLastTextColor(2); for(i = 0; i < 0x80; i++) { gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // but why gGlyphInfo.width = sFontFemaleLatinGlyphWidths[0]; gGlyphInfo.height = 14; } } else { glyphs = sFontFemaleLatinGlyphs + (0x20 * glyphId); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); gGlyphInfo.width = sFontFemaleLatinGlyphWidths[glyphId]; gGlyphInfo.height = 14; } } } static s32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese) { if (isJapanese == TRUE) { if (glyphId == 0) return 10; return sFontFemaleJapaneseGlyphWidths[glyphId]; } else return sFontFemaleLatinGlyphWidths[glyphId]; } static void DecompressGlyph_Bold(u16 glyphId) { const u16 *glyphs = sFontBoldJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF)); DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); gGlyphInfo.width = 8; gGlyphInfo.height = 12; } int GetStringCenterAlignXOffset(int fontId, const u8 *str, int totalWidth) { return GetStringCenterAlignXOffsetWithLetterSpacing(fontId, str, totalWidth, 0); } int GetStringCenterAlignXOffsetWithLetterSpacing(int fontId, const u8 *str, int totalWidth, int letterSpacing) { return GetStringWidthDifference(fontId, str, totalWidth, letterSpacing) / 2; } int GetStringWidthDifference(int fontId, const u8 *str, int totalWidth, int letterSpacing) { int stringWidth = GetStringWidth(fontId, str, letterSpacing); if (totalWidth > stringWidth) return totalWidth - stringWidth; else return 0; } ================================================ FILE: src/text_printer.c ================================================ #include "global.h" #include "window.h" #include "text.h" static EWRAM_DATA struct TextPrinter sTempTextPrinter = {0}; static EWRAM_DATA struct TextPrinter sTextPrinters[NUM_TEXT_PRINTERS] = {0}; static u16 sFontHalfRowLookupTable[0x51]; static u16 sLastTextBgColor; static u16 sLastTextFgColor; static u16 sLastTextShadowColor; const struct FontInfo *gFonts; struct GlyphInfo gGlyphInfo; static const u8 sFontHalfRowOffsets[] = { 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00, 0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09, 0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12, 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00, 0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B, 0x24, 0x25, 0x26, 0x24, 0x27, 0x28, 0x29, 0x27, 0x2A, 0x2B, 0x2C, 0x2A, 0x24, 0x25, 0x26, 0x24, 0x2D, 0x2E, 0x2F, 0x2D, 0x30, 0x31, 0x32, 0x30, 0x33, 0x34, 0x35, 0x33, 0x2D, 0x2E, 0x2F, 0x2D, 0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B, 0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36, 0x3F, 0x40, 0x41, 0x3F, 0x42, 0x43, 0x44, 0x42, 0x45, 0x46, 0x47, 0x45, 0x3F, 0x40, 0x41, 0x3F, 0x48, 0x49, 0x4A, 0x48, 0x4B, 0x4C, 0x4D, 0x4B, 0x4E, 0x4F, 0x50, 0x4E, 0x48, 0x49, 0x4A, 0x48, 0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36, 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00, 0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09, 0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12, 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00 }; void SetFontsPointer(const struct FontInfo *fonts) { gFonts = fonts; } void DeactivateAllTextPrinters (void) { int printer; for (printer = 0; printer < NUM_TEXT_PRINTERS; ++printer) sTextPrinters[printer].active = 0; } u16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)) { struct TextPrinterTemplate printerTemplate; printerTemplate.currentChar = str; printerTemplate.windowId = windowId; printerTemplate.fontId = fontId; printerTemplate.x = x; printerTemplate.y = y; printerTemplate.currentX = x; printerTemplate.currentY = y; printerTemplate.letterSpacing = gFonts[fontId].letterSpacing; printerTemplate.lineSpacing = gFonts[fontId].lineSpacing; printerTemplate.unk = gFonts[fontId].unk; printerTemplate.fgColor = gFonts[fontId].fgColor; printerTemplate.bgColor = gFonts[fontId].bgColor; printerTemplate.shadowColor = gFonts[fontId].shadowColor; return AddTextPrinter(&printerTemplate, speed, callback); } bool16 AddTextPrinter(struct TextPrinterTemplate *textSubPrinter, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)) { int i; u32 j; if (!gFonts) return FALSE; sTempTextPrinter.active = TRUE; sTempTextPrinter.state = RENDER_STATE_HANDLE_CHAR; sTempTextPrinter.textSpeed = speed; sTempTextPrinter.delayCounter = 0; sTempTextPrinter.scrollDistance = 0; for (i = 0; i < (int)ARRAY_COUNT(sTempTextPrinter.subUnion.fields); ++i) sTempTextPrinter.subUnion.fields[i] = 0; sTempTextPrinter.printerTemplate = *textSubPrinter; sTempTextPrinter.callback = callback; sTempTextPrinter.minLetterSpacing = 0; sTempTextPrinter.japanese = 0; GenerateFontHalfRowLookupTable(textSubPrinter->fgColor, textSubPrinter->bgColor, textSubPrinter->shadowColor); if (speed != TEXT_SKIP_DRAW && speed != 0) { --sTempTextPrinter.textSpeed; sTextPrinters[textSubPrinter->windowId] = sTempTextPrinter; } else { sTempTextPrinter.textSpeed = 0; // Render all text (up to limit) at once for (j = 0; j < 0x400; ++j) { if (RenderFont(&sTempTextPrinter) == RENDER_FINISH) break; } // All the text is rendered to the window but don't draw it yet. if (speed != TEXT_SKIP_DRAW) CopyWindowToVram(sTempTextPrinter.printerTemplate.windowId, COPYWIN_GFX); sTextPrinters[textSubPrinter->windowId].active = FALSE; } return TRUE; } void RunTextPrinters(void) { int i; do { int numEmpty = 0; for (i = 0; i < NUM_TEXT_PRINTERS; ++i) { if (sTextPrinters[i].active) { u16 renderCmd = RenderFont(&sTextPrinters[i]); switch (renderCmd) { case RENDER_PRINT: CopyWindowToVram(sTextPrinters[i].printerTemplate.windowId, COPYWIN_GFX); if (sTextPrinters[i].callback != 0) sTextPrinters[i].callback(&sTextPrinters[i].printerTemplate, renderCmd); break; case RENDER_UPDATE: if (sTextPrinters[i].callback != NULL) sTextPrinters[i].callback(&sTextPrinters[i].printerTemplate, renderCmd); return; case RENDER_FINISH: sTextPrinters[i].active = FALSE; return; } } else { numEmpty++; } } if(numEmpty == 0x20) return; }while(gSaveBlock2Ptr->optionsTextSpeed == OPTIONS_TEXT_SPEED_INSTANT); } bool16 IsTextPrinterActive(u8 id) { return sTextPrinters[id].active; } u32 RenderFont(struct TextPrinter *textPrinter) { u32 ret; while (TRUE) { ret = gFonts[textPrinter->printerTemplate.fontId].fontFunction(textPrinter); if (ret != 2) return ret; } } void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor) { int lutIndex; int i, j, k, l; const u32 colors[] = {bgColor, fgColor, shadowColor}; sLastTextBgColor = bgColor; sLastTextFgColor = fgColor; sLastTextShadowColor = shadowColor; lutIndex = 0; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) for (k = 0; k < 3; k++) for (l = 0; l < 3; l++) sFontHalfRowLookupTable[lutIndex++] = (colors[l] << 12) | (colors[k] << 8) | (colors[j] << 4) | colors[i]; } void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor) { *bgColor = sLastTextBgColor; *fgColor = sLastTextFgColor; *shadowColor = sLastTextShadowColor; } void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor) { GenerateFontHalfRowLookupTable(*fgColor, *bgColor, *shadowColor); } void DecompressGlyphTile(const u16 *src, u16 *dest) { int i; for (i = 0; i < 16; i++) { int offsetIndex = (i << 31) ? (u8)*src++ : (*src >> 8); dest[i] = sFontHalfRowLookupTable[sFontHalfRowOffsets[offsetIndex]]; } } u8 GetLastTextColor(u8 colorType) { switch (colorType) { case 0: return sLastTextFgColor; case 2: return sLastTextBgColor; case 1: return sLastTextShadowColor; default: return 0; } } #define GLYPH_COPY(widthOffset, heightOffset, width, height, tilesDest, left, top, sizeX) \ { \ int xAdd, xpos, yAdd, ypos, toOrr, bits; \ u8 * src, * dst; \ u32 _8pixbuf; \ \ src = gGlyphInfo.pixels + (heightOffset / 8 * 0x40) + (widthOffset / 8 * 0x20); \ for (yAdd = 0, ypos = top + heightOffset; yAdd < height; yAdd++, ypos++) \ { \ _8pixbuf = *(u32 *)src; \ for (xAdd = 0, xpos = left + widthOffset; xAdd < width; xAdd++, xpos++) \ { \ dst = (u8 *)((tilesDest) + ((xpos >> 1) & 3) + ((xpos >> 3) << 5) + (((ypos >> 3) * (sizeX)) << 5) + ((u32)(ypos << 29) >> 27)); \ toOrr = (_8pixbuf >> (xAdd * 4)) & 0xF; \ if (toOrr != 0) \ { \ bits = (xpos & 1) * 4; \ *dst = (toOrr << bits) | (*dst & (0xF0 >> bits)); \ } \ } \ src += 4; \ } \ } void CopyGlyphToWindow(struct TextPrinter *textPrinter) { int glyphWidth, glyphHeight; u8 sizeType; if (gWindows[textPrinter->printerTemplate.windowId].window.width * 8 - textPrinter->printerTemplate.currentX < gGlyphInfo.width) glyphWidth = gWindows[textPrinter->printerTemplate.windowId].window.width * 8 - textPrinter->printerTemplate.currentX; else glyphWidth = gGlyphInfo.width; if (gWindows[textPrinter->printerTemplate.windowId].window.height * 8 - textPrinter->printerTemplate.currentY < gGlyphInfo.height) glyphHeight = gWindows[textPrinter->printerTemplate.windowId].window.height * 8 - textPrinter->printerTemplate.currentY; else glyphHeight = gGlyphInfo.height; sizeType = 0; if (glyphWidth > 8) sizeType |= 1; if (glyphHeight > 8) sizeType |= 2; switch (sizeType) { case 0: // ≤ 8x8 GLYPH_COPY(0, 0, glyphWidth, glyphHeight, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); return; case 1: // ≤ 16x8 GLYPH_COPY(0, 0, 8, glyphHeight, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); GLYPH_COPY(8, 0, glyphWidth - 8, glyphHeight, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); return; case 2: // ≤ 8x16 GLYPH_COPY(0, 0, glyphWidth, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); GLYPH_COPY(0, 8, glyphWidth, glyphHeight - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); return; case 3: // ≤ 16x16 GLYPH_COPY(0, 0, 8, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); GLYPH_COPY(8, 0, glyphWidth - 8, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); GLYPH_COPY(0, 8, 8, glyphHeight - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); GLYPH_COPY(8, 8, glyphWidth - 8, glyphHeight - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); return; } } // Unused static void CopyGlyphToWindow_Parameterized(void *tileData, u16 currentX, u16 currentY, u16 width, u16 height) { int glyphWidth, glyphHeight; u8 sizeType; u16 sizeX; if (width - currentX < gGlyphInfo.width) glyphWidth = width - currentX; else glyphWidth = gGlyphInfo.width; if (height - currentY < gGlyphInfo.height) glyphHeight = height - currentY; else glyphHeight = gGlyphInfo.height; sizeType = 0; sizeX = (width + (width & 7)) >> 3; if (glyphWidth > 8) sizeType |= 1; if (glyphHeight > 8) sizeType |= 2; switch (sizeType) { case 0: GLYPH_COPY(0, 0, glyphWidth, glyphHeight, tileData, currentX, currentY, sizeX); return; case 1: GLYPH_COPY(0, 0, 8, glyphHeight, tileData, currentX, currentY, sizeX); GLYPH_COPY(8, 0, glyphWidth - 8, glyphHeight, tileData, currentX, currentY, sizeX); return; case 2: GLYPH_COPY(0, 0, glyphWidth, 8, tileData, currentX, currentY, sizeX); GLYPH_COPY(0, 8, glyphWidth, glyphHeight - 8, tileData, currentX, currentY, sizeX); return; case 3: GLYPH_COPY(0, 0, 8, 8, tileData, currentX, currentY, sizeX); GLYPH_COPY(8, 0, glyphWidth - 8, 8, tileData, currentX, currentY, sizeX); GLYPH_COPY(0, 8, 8, glyphHeight - 8, tileData, currentX, currentY, sizeX); GLYPH_COPY(8, 8, glyphWidth - 8, glyphHeight - 8, tileData, currentX, currentY, sizeX); return; } } void ClearTextSpan(struct TextPrinter *textPrinter, u32 width) { } ================================================ FILE: src/text_window.c ================================================ #include "global.h" #include "gflib.h" #include "text_window.h" #include "text_window_graphics.h" #include "help_message.h" #include "new_menu_helpers.h" static void LoadUserWindowGfxByFrame(u8 windowId, u8 frameType, u16 destOffset, u8 palOffset); // Unused // Equivalent to LoadHelpMessageWindowGfx, but takes a bg id directly static void LoadHelpMessageWindowGfxOnBg(u8 bgId, u16 destOffset, u8 palOffset) { LoadBgTiles(bgId, gHelpMessageWindow_Gfx, 0x280, destOffset); LoadPalette(GetTextWindowPalette(2), palOffset, PLTT_SIZE_4BPP); } // Unused // Equivalent to LoadMenuMessageWindowGfx, but takes a bg id directly static void LoadMenuMessageWindowGfxOnBg(u8 bgId, u16 destOffset, u8 palOffset) { LoadBgTiles(bgId, gMenuMessageWindow_Gfx, 0x280, destOffset); LoadPalette(GetTextWindowPalette(0), palOffset, PLTT_SIZE_4BPP); } // Unused // Equivalent to LoadSignpostWindowGfx, but takes a bg id directly static void LoadSignpostWindowGfxOnBg(u8 bgId, u16 destOffset, u8 palOffset) { LoadBgTiles(bgId, gSignpostWindow_Gfx, 0x260, destOffset); LoadPalette(GetTextWindowPalette(1), palOffset, PLTT_SIZE_4BPP); } // Equivalent to LoadStdWindowGfx, but takes a bg id directly void LoadStdWindowGfxOnBg(u8 bgId, u16 destOffset, u8 palOffset) { LoadBgTiles(bgId, gStdTextWindow_Gfx, 0x120, destOffset); LoadPalette(GetTextWindowPalette(3), palOffset, PLTT_SIZE_4BPP); } // Unused // Equivalent to LoadQuestLogWindowTiles, but takes a bg id directly static void LoadQuestLogWindowTilesOnBg(u8 bgId, u16 destOffset) { LoadBgTiles(bgId, gQuestLogWindow_Gfx, 0x280, destOffset); } // Unused // Equivalent to LoadUserWindowGfxByFrame, but takes a bg id directly static void LoadUserWindowGfxByFrameOnBg(u8 bgId, u8 frameType, u16 destOffset, u8 palOffset) { LoadBgTiles(bgId, gUserFrames[frameType].tiles, 0x120, destOffset); LoadPalette(gUserFrames[frameType].palette, palOffset, PLTT_SIZE_4BPP); } // Identical to LoadUserWindowGfx void LoadUserWindowGfx2(u8 windowId, u16 destOffset, u8 palOffset) { LoadUserWindowGfxByFrame(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palOffset); } void LoadHelpMessageWindowGfx(u8 windowId, u16 destOffset, u8 palOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gHelpMessageWindow_Gfx, 0x280, destOffset); LoadPalette(GetTextWindowPalette(2), palOffset, PLTT_SIZE_4BPP); } void LoadMenuMessageWindowGfx(u8 windowId, u16 destOffset, u8 palOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gMenuMessageWindow_Gfx, 0x280, destOffset); LoadPalette(GetTextWindowPalette(0), palOffset, PLTT_SIZE_4BPP); } void LoadSignpostWindowGfx(u8 windowId, u16 destOffset, u8 palOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gSignpostWindow_Gfx, 0x260, destOffset); LoadPalette(GetTextWindowPalette(1), palOffset, PLTT_SIZE_4BPP); } void LoadStdWindowGfx(u8 windowId, u16 destOffset, u8 palOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdTextWindow_Gfx, 0x120, destOffset); LoadPalette(GetTextWindowPalette(3), palOffset, PLTT_SIZE_4BPP); } void LoadStdWindowTiles(u8 windowId, u16 destOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdTextWindow_Gfx, 0x120, destOffset); } void LoadQuestLogWindowTiles(u8 windowId, u16 destOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gQuestLogWindow_Gfx, 0x280, destOffset); } static void LoadUserWindowGfxByFrame(u8 windowId, u8 frameType, u16 destOffset, u8 palOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUserFrames[frameType].tiles, 0x120, destOffset); LoadPalette(gUserFrames[frameType].palette, palOffset, PLTT_SIZE_4BPP); } void LoadUserWindowGfx(u8 windowId, u16 destOffset, u8 palOffset) { LoadUserWindowGfxByFrame(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palOffset); } void DrawTextBorderOuter(u8 windowId, u16 tileNum, u8 palNum) { u8 bgLayer = GetWindowAttribute(windowId, WINDOW_BG); u16 tilemapLeft = GetWindowAttribute(windowId, WINDOW_TILEMAP_LEFT); u16 tilemapTop = GetWindowAttribute(windowId, WINDOW_TILEMAP_TOP); u16 width = GetWindowAttribute(windowId, WINDOW_WIDTH); u16 height = GetWindowAttribute(windowId, WINDOW_HEIGHT); FillBgTilemapBufferRect(bgLayer, tileNum + 0, tilemapLeft - 1, tilemapTop - 1, 1, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 1, tilemapLeft, tilemapTop - 1, width, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 2, tilemapLeft + width, tilemapTop - 1, 1, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 3, tilemapLeft - 1, tilemapTop, 1, height, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 5, tilemapLeft + width, tilemapTop, 1, height, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 6, tilemapLeft - 1, tilemapTop + height, 1, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 7, tilemapLeft, tilemapTop + height, width, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 8, tilemapLeft + width, tilemapTop + height, 1, 1, palNum); } void DrawTextBorderInner(u8 windowId, u16 tileNum, u8 palNum) { u8 bgLayer = GetWindowAttribute(windowId, WINDOW_BG); u16 tilemapLeft = GetWindowAttribute(windowId, WINDOW_TILEMAP_LEFT); u16 tilemapTop = GetWindowAttribute(windowId, WINDOW_TILEMAP_TOP); u16 width = GetWindowAttribute(windowId, WINDOW_WIDTH); u16 height = GetWindowAttribute(windowId, WINDOW_HEIGHT); FillBgTilemapBufferRect(bgLayer, tileNum + 0, tilemapLeft, tilemapTop, 1, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 1, tilemapLeft + 1, tilemapTop, width - 2, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 2, tilemapLeft + width - 1, tilemapTop, 1, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 3, tilemapLeft, tilemapTop + 1, 1, height - 2, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 5, tilemapLeft + width - 1, tilemapTop + 1, 1, height - 2, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 6, tilemapLeft, tilemapTop + height - 1, 1, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 7, tilemapLeft + 1, tilemapTop + height - 1, width - 2, 1, palNum); FillBgTilemapBufferRect(bgLayer, tileNum + 8, tilemapLeft + width - 1, tilemapTop + height - 1, 1, 1, palNum); } void rbox_fill_rectangle(u8 windowId) { u8 bgLayer = GetWindowAttribute(windowId, WINDOW_BG); u16 tilemapLeft = GetWindowAttribute(windowId, WINDOW_TILEMAP_LEFT); u16 tilemapTop = GetWindowAttribute(windowId, WINDOW_TILEMAP_TOP); u16 width = GetWindowAttribute(windowId, WINDOW_WIDTH); u16 height = GetWindowAttribute(windowId, WINDOW_HEIGHT); FillBgTilemapBufferRect(bgLayer, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, 17); } const u16 *GetTextWindowPalette(u8 id) { switch (id) { case 0: id = 0; break; case 1: id = 0x10; break; case 2: id = 0x20; break; case 3: id = 0x30; break; case 4: default: id = 0x40; break; } return (const u16 *)(gTextWindowPalettes) + id; } ================================================ FILE: src/text_window_graphics.c ================================================ #include "global.h" #include "text_window_graphics.h" const u16 gSignpostWindow_Gfx[] = INCBIN_U16("graphics/text_window/signpost.4bpp"); static const u16 sUserFrame_Type1_Gfx[] = INCBIN_U16("graphics/text_window/type1.4bpp"); static const u16 sUserFrame_Type2_Gfx[] = INCBIN_U16("graphics/text_window/type2.4bpp"); static const u16 sUserFrame_Empty1[16] = {0}; static const u16 sUserFrame_Type3_Gfx[] = INCBIN_U16("graphics/text_window/type3.4bpp"); static const u16 sUserFrame_Type4_Gfx[] = INCBIN_U16("graphics/text_window/type4.4bpp"); static const u16 sUserFrame_Type5_Gfx[] = INCBIN_U16("graphics/text_window/type5.4bpp"); static const u16 sUserFrame_Type6_Gfx[] = INCBIN_U16("graphics/text_window/type6.4bpp"); static const u16 sUserFrame_Type7_Gfx[] = INCBIN_U16("graphics/text_window/type7.4bpp"); static const u16 sUserFrame_Type8_Gfx[] = INCBIN_U16("graphics/text_window/type8.4bpp"); static const u16 sUserFrame_Empty2[16] = {0}; static const u16 sUserFrame_Type9_Gfx[] = INCBIN_U16("graphics/text_window/type9.4bpp"); static const u16 sUserFrame_Type10_Gfx[] = INCBIN_U16("graphics/text_window/type10.4bpp"); static const u16 sUserFrame_Type11_Gfx[] = INCBIN_U16("graphics/text_window/frame11.4bpp"); //RBY static const u16 sUserFrame_Empty3[16] = {0}; static const u16 sUserFrame_Type1_Pal[] = INCBIN_U16("graphics/text_window/type1.gbapal"); static const u16 sUserFrame_Type2_Pal[] = INCBIN_U16("graphics/text_window/type2.gbapal"); static const u16 sUserFrame_Type3_Pal[] = INCBIN_U16("graphics/text_window/type3.gbapal"); static const u16 sUserFrame_Type4_Pal[] = INCBIN_U16("graphics/text_window/type4.gbapal"); static const u16 sUserFrame_Type5_Pal[] = INCBIN_U16("graphics/text_window/type5.gbapal"); static const u16 sUserFrame_Type6_Pal[] = INCBIN_U16("graphics/text_window/type6.gbapal"); static const u16 sUserFrame_Type7_Pal[] = INCBIN_U16("graphics/text_window/type7.gbapal"); static const u16 sUserFrame_Type8_Pal[] = INCBIN_U16("graphics/text_window/type8.gbapal"); static const u16 sUserFrame_Type9_Pal[] = INCBIN_U16("graphics/text_window/type9.gbapal"); static const u16 sUserFrame_Type10_Pal[] = INCBIN_U16("graphics/text_window/type10.gbapal"); static const u16 sUserFrame_Type11_Pal[] = INCBIN_U16("graphics/text_window/frame11.gbapal"); //RBY const u16 gStdTextWindow_Gfx[] = INCBIN_U16("graphics/text_window/std.4bpp"); const u16 gQuestLogWindow_Gfx[] = INCBIN_U16("graphics/text_window/quest_log.4bpp"); const u16 gTextWindowPalettes[][16] = { INCBIN_U16("graphics/text_window/stdpal_0.gbapal"), INCBIN_U16("graphics/text_window/stdpal_1.gbapal"), INCBIN_U16("graphics/text_window/stdpal_2.gbapal"), INCBIN_U16("graphics/text_window/stdpal_3.gbapal"), INCBIN_U16("graphics/text_window/stdpal_4.gbapal") }; const struct TextWindowGraphics gUserFrames[] = { {sUserFrame_Type1_Gfx, sUserFrame_Type1_Pal}, {sUserFrame_Type2_Gfx, sUserFrame_Type2_Pal}, {sUserFrame_Type3_Gfx, sUserFrame_Type3_Pal}, {sUserFrame_Type4_Gfx, sUserFrame_Type4_Pal}, {sUserFrame_Type5_Gfx, sUserFrame_Type5_Pal}, {sUserFrame_Type6_Gfx, sUserFrame_Type6_Pal}, {sUserFrame_Type7_Gfx, sUserFrame_Type7_Pal}, {sUserFrame_Type8_Gfx, sUserFrame_Type8_Pal}, {sUserFrame_Type9_Gfx, sUserFrame_Type9_Pal}, {sUserFrame_Type10_Gfx, sUserFrame_Type10_Pal}, {sUserFrame_Type11_Gfx, sUserFrame_Type11_Pal}, }; const struct TextWindowGraphics *GetUserWindowGraphics(u8 idx) { if (idx >= ARRAY_COUNT(gUserFrames)) return &gUserFrames[0]; else return &gUserFrames[idx]; } ================================================ FILE: src/tilemap_util.c ================================================ #include "global.h" #include "bg.h" #include "tilemap_util.h" #include "malloc.h" // Handles 3 particular tilemaps ("PKMN Data" text, party menu, close box // button) used for Pokémon Storage System in a somewhat unusual way. // For example, while the cursor is on the Close Box button it flashes between // two states alternately. Both these states are their own part of the same // tilemap that's always present. The utility shifts the tilemap up and down // to show/hide the states, and limits the view with a rectangle that only // reveals one at a time. struct TilemapUtil_RectData { s16 x; s16 y; u16 width; u16 height; s16 destX; s16 destY; }; struct TilemapUtil { struct TilemapUtil_RectData prev; // Only read in unused function struct TilemapUtil_RectData cur; const void *savedTilemap; // Only written in unused function const void *tilemap; u16 altWidth; // Never read u16 altHeight; // Never read u16 width; u16 height; u16 rowSize; // Never read u8 tileSize; u8 bg; bool8 active; // Only read in unused function }; static EWRAM_DATA struct TilemapUtil *sTilemapUtil = NULL; static EWRAM_DATA u16 sNumTilemapUtilIds = 0; static void TilemapUtil_DrawPrev(u8 tilemapId); static void TilemapUtil_Draw(u8 tilemapId); static const struct { u16 width; u16 height; } sTilemapDimensions[2][4] = { { { 256, 256}, { 512, 256}, { 256, 512}, { 512, 512} }, { { 128, 128}, { 256, 256}, { 512, 512}, {1024, 1024} } }; void TilemapUtil_Init(u8 numTilemapIds) { u16 i; sTilemapUtil = Alloc(numTilemapIds * sizeof(struct TilemapUtil)); sNumTilemapUtilIds = sTilemapUtil == NULL ? 0 : numTilemapIds; for (i = 0; i < sNumTilemapUtilIds; i++) { sTilemapUtil[i].savedTilemap = NULL; sTilemapUtil[i].active = FALSE; } } void TilemapUtil_Free(void) { Free(sTilemapUtil); } // Unused void TilemapUtil_UpdateAll(void) { int i; for (i = 0; i < sNumTilemapUtilIds; i++) { if (sTilemapUtil[i].active == TRUE) TilemapUtil_Update(i); } } void TilemapUtil_SetTilemap(u8 tilemapId, u8 bg, const void *tilemap, u16 width, u16 height) { u16 screenSize; u16 bgType; if (tilemapId < sNumTilemapUtilIds) { sTilemapUtil[tilemapId].savedTilemap = NULL; sTilemapUtil[tilemapId].tilemap = tilemap; sTilemapUtil[tilemapId].bg = bg; sTilemapUtil[tilemapId].width = width; sTilemapUtil[tilemapId].height = height; screenSize = GetBgAttribute(bg, BG_ATTR_SCREENSIZE); bgType = GetBgAttribute(bg, BG_ATTR_BGTYPE); sTilemapUtil[tilemapId].altWidth = sTilemapDimensions[bgType][screenSize].width; sTilemapUtil[tilemapId].altHeight = sTilemapDimensions[bgType][screenSize].height; if (bgType != 0) sTilemapUtil[tilemapId].tileSize = 1; else sTilemapUtil[tilemapId].tileSize = 2; sTilemapUtil[tilemapId].rowSize = width * sTilemapUtil[tilemapId].tileSize; sTilemapUtil[tilemapId].cur.width = width; sTilemapUtil[tilemapId].cur.height = height; sTilemapUtil[tilemapId].cur.x = 0; sTilemapUtil[tilemapId].cur.y = 0; sTilemapUtil[tilemapId].cur.destX = 0; sTilemapUtil[tilemapId].cur.destY = 0; sTilemapUtil[tilemapId].prev = sTilemapUtil[tilemapId].cur; sTilemapUtil[tilemapId].active = TRUE; } } // Unused void TilemapUtil_SetSavedMap(u8 tilemapId, const void *tilemap) { if (tilemapId < sNumTilemapUtilIds) { sTilemapUtil[tilemapId].savedTilemap = tilemap; sTilemapUtil[tilemapId].active = TRUE; } } void TilemapUtil_SetPos(u8 tilemapId, u16 destX, u16 destY) { if (tilemapId < sNumTilemapUtilIds) { sTilemapUtil[tilemapId].cur.destX = destX; sTilemapUtil[tilemapId].cur.destY = destY; sTilemapUtil[tilemapId].active = TRUE; } } void TilemapUtil_SetRect(u8 tilemapId, u16 x, u16 y, u16 width, u16 height) { if (tilemapId < sNumTilemapUtilIds) { sTilemapUtil[tilemapId].cur.x = x; sTilemapUtil[tilemapId].cur.y = y; sTilemapUtil[tilemapId].cur.width = width; sTilemapUtil[tilemapId].cur.height = height; sTilemapUtil[tilemapId].active = TRUE; } } void TilemapUtil_Move(u8 tilemapId, u8 mode, s8 param) { if (tilemapId < sNumTilemapUtilIds) { switch (mode) { case 0: sTilemapUtil[tilemapId].cur.destX += param; sTilemapUtil[tilemapId].cur.width -= param; break; case 1: sTilemapUtil[tilemapId].cur.x += param; sTilemapUtil[tilemapId].cur.width += param; break; case 2: sTilemapUtil[tilemapId].cur.destY += param; sTilemapUtil[tilemapId].cur.height -= param; break; case 3: // this is the only mode ever used sTilemapUtil[tilemapId].cur.y -= param; sTilemapUtil[tilemapId].cur.height += param; break; case 4: sTilemapUtil[tilemapId].cur.destX += param; break; case 5: sTilemapUtil[tilemapId].cur.destY += param; break; } sTilemapUtil[tilemapId].active = TRUE; } } void TilemapUtil_Update(u8 tilemapId) { if (tilemapId < sNumTilemapUtilIds) { if (sTilemapUtil[tilemapId].savedTilemap != NULL) // Always false TilemapUtil_DrawPrev(tilemapId); TilemapUtil_Draw(tilemapId); sTilemapUtil[tilemapId].prev = sTilemapUtil[tilemapId].cur; } } // Never called, see TilemapUtil_Update static void TilemapUtil_DrawPrev(u8 tilemapId) { int i; int rowSize = sTilemapUtil[tilemapId].tileSize * sTilemapUtil[tilemapId].altWidth; const void *tiles = sTilemapUtil[tilemapId].savedTilemap + rowSize * sTilemapUtil[tilemapId].prev.destY + sTilemapUtil[tilemapId].prev.destX * sTilemapUtil[tilemapId].tileSize; for (i = 0; i < sTilemapUtil[tilemapId].prev.height; i++) { CopyToBgTilemapBufferRect(sTilemapUtil[tilemapId].bg, tiles, sTilemapUtil[tilemapId].prev.destX, sTilemapUtil[tilemapId].prev.destY + i, sTilemapUtil[tilemapId].prev.width, 1); tiles += rowSize; } } static void TilemapUtil_Draw(u8 tilemapId) { int i; int rowSize = sTilemapUtil[tilemapId].tileSize * sTilemapUtil[tilemapId].width; const void *tiles = sTilemapUtil[tilemapId].tilemap + rowSize * sTilemapUtil[tilemapId].cur.y + sTilemapUtil[tilemapId].cur.x * sTilemapUtil[tilemapId].tileSize; for (i = 0; i < sTilemapUtil[tilemapId].cur.height; i++) { CopyToBgTilemapBufferRect(sTilemapUtil[tilemapId].bg, tiles, sTilemapUtil[tilemapId].cur.destX, sTilemapUtil[tilemapId].cur.destY + i, sTilemapUtil[tilemapId].cur.width, 1); tiles += rowSize; } } ================================================ FILE: src/tileset_anims.c ================================================ #include "global.h" static EWRAM_DATA struct { const u16 *src; u16 *dest; u16 size; } sTilesetDMA3TransferBuffer[20] = {0}; static u8 sTilesetDMA3TransferBufferSize; static u16 sPrimaryTilesetAnimCounter; static u16 sPrimaryTilesetAnimCounterMax; static u16 sSecondaryTilesetAnimCounter; static u16 sSecondaryTilesetAnimCounterMax; static void (*sPrimaryTilesetAnimCallback)(u16); static void (*sSecondaryTilesetAnimCallback)(u16); static void _InitPrimaryTilesetAnimation(void); static void _InitSecondaryTilesetAnimation(void); // palette: general 00 static const u16 sTilesetAnims_General_Flower_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/flower/0.4bpp"); static const u16 sTilesetAnims_General_Flower_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/flower/1.4bpp"); static const u16 sTilesetAnims_General_Flower_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/flower/2.4bpp"); static const u16 sTilesetAnims_General_Flower_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/flower/3.4bpp"); static const u16 sTilesetAnims_General_Flower_Frame4[] = INCBIN_U16("data/tilesets/primary/general/anim/flower/4.4bpp"); static const u16 *const sTilesetAnims_General_Flower[] = { sTilesetAnims_General_Flower_Frame0, sTilesetAnims_General_Flower_Frame1, sTilesetAnims_General_Flower_Frame2, sTilesetAnims_General_Flower_Frame3, sTilesetAnims_General_Flower_Frame4 }; // palette: general 04 static const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/water_current_landwatersedge/0.4bpp"); static const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/water_current_landwatersedge/1.4bpp"); static const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/water_current_landwatersedge/2.4bpp"); static const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/water_current_landwatersedge/3.4bpp"); static const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame4[] = INCBIN_U16("data/tilesets/primary/general/anim/water_current_landwatersedge/4.4bpp"); static const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame5[] = INCBIN_U16("data/tilesets/primary/general/anim/water_current_landwatersedge/5.4bpp"); static const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame6[] = INCBIN_U16("data/tilesets/primary/general/anim/water_current_landwatersedge/6.4bpp"); static const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame7[] = INCBIN_U16("data/tilesets/primary/general/anim/water_current_landwatersedge/7.4bpp"); static const u16 *const sTilesetAnims_General_Water_Current_LandWatersEdge[] = { sTilesetAnims_General_Water_Current_LandWatersEdge_Frame0, sTilesetAnims_General_Water_Current_LandWatersEdge_Frame1, sTilesetAnims_General_Water_Current_LandWatersEdge_Frame2, sTilesetAnims_General_Water_Current_LandWatersEdge_Frame3, sTilesetAnims_General_Water_Current_LandWatersEdge_Frame4, sTilesetAnims_General_Water_Current_LandWatersEdge_Frame5, sTilesetAnims_General_Water_Current_LandWatersEdge_Frame6, sTilesetAnims_General_Water_Current_LandWatersEdge_Frame7 }; // palette: general 04 static const u16 sTilesetAnims_General_SandWatersEdge_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/sandwatersedge/0.4bpp"); static const u16 sTilesetAnims_General_SandWatersEdge_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/sandwatersedge/1.4bpp"); static const u16 sTilesetAnims_General_SandWatersEdge_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/sandwatersedge/2.4bpp"); static const u16 sTilesetAnims_General_SandWatersEdge_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/sandwatersedge/3.4bpp"); static const u16 sTilesetAnims_General_SandWatersEdge_Frame4[] = INCBIN_U16("data/tilesets/primary/general/anim/sandwatersedge/4.4bpp"); static const u16 sTilesetAnims_General_SandWatersEdge_Frame5[] = INCBIN_U16("data/tilesets/primary/general/anim/sandwatersedge/5.4bpp"); static const u16 sTilesetAnims_General_SandWatersEdge_Frame6[] = INCBIN_U16("data/tilesets/primary/general/anim/sandwatersedge/6.4bpp"); static const u16 sTilesetAnims_General_SandWatersEdge_Frame7[] = INCBIN_U16("data/tilesets/primary/general/anim/sandwatersedge/7.4bpp"); static const u16 *const sTilesetAnims_General_SandWatersEdge[] = { sTilesetAnims_General_SandWatersEdge_Frame0, sTilesetAnims_General_SandWatersEdge_Frame1, sTilesetAnims_General_SandWatersEdge_Frame2, sTilesetAnims_General_SandWatersEdge_Frame3, sTilesetAnims_General_SandWatersEdge_Frame4, sTilesetAnims_General_SandWatersEdge_Frame5, sTilesetAnims_General_SandWatersEdge_Frame6, sTilesetAnims_General_SandWatersEdge_Frame7 }; // palette: general 00 static const u16 sTilesetAnims_CeladonCity_Fountain_Frame0[] = INCBIN_U16("data/tilesets/secondary/celadon_city/anim/fountain/0.4bpp"); static const u16 sTilesetAnims_CeladonCity_Fountain_Frame1[] = INCBIN_U16("data/tilesets/secondary/celadon_city/anim/fountain/1.4bpp"); static const u16 sTilesetAnims_CeladonCity_Fountain_Frame2[] = INCBIN_U16("data/tilesets/secondary/celadon_city/anim/fountain/2.4bpp"); static const u16 sTilesetAnims_CeladonCity_Fountain_Frame3[] = INCBIN_U16("data/tilesets/secondary/celadon_city/anim/fountain/3.4bpp"); static const u16 sTilesetAnims_CeladonCity_Fountain_Frame4[] = INCBIN_U16("data/tilesets/secondary/celadon_city/anim/fountain/4.4bpp"); static const u16 sTilesetAnims_CeladonCity_Fountain_Empty[16] = {}; static const u16 *const sTilesetAnims_CeladonCity_Fountain[] = { sTilesetAnims_CeladonCity_Fountain_Frame0, sTilesetAnims_CeladonCity_Fountain_Frame1, sTilesetAnims_CeladonCity_Fountain_Frame2, sTilesetAnims_CeladonCity_Fountain_Frame3, sTilesetAnims_CeladonCity_Fountain_Frame4 }; static const u16 sTilesetAnims_SilphCo_Fountain_Frame0[] = INCBIN_U16("data/tilesets/secondary/silph_co/anim/fountain/0.4bpp"); static const u16 sTilesetAnims_SilphCo_Fountain_Frame1[] = INCBIN_U16("data/tilesets/secondary/silph_co/anim/fountain/1.4bpp"); static const u16 sTilesetAnims_SilphCo_Fountain_Frame2[] = INCBIN_U16("data/tilesets/secondary/silph_co/anim/fountain/2.4bpp"); static const u16 sTilesetAnims_SilphCo_Fountain_Frame3[] = INCBIN_U16("data/tilesets/secondary/silph_co/anim/fountain/3.4bpp"); static const u16 sTilesetAnims_SilphCo_Fountain_Empty[16] = {}; static const u16 *const sTilesetAnims_SilphCo_Fountain[] = { sTilesetAnims_SilphCo_Fountain_Frame0, sTilesetAnims_SilphCo_Fountain_Frame1, sTilesetAnims_SilphCo_Fountain_Frame2, sTilesetAnims_SilphCo_Fountain_Frame3 }; static const u16 sTilesetAnims_MtEmber_Steam_Frame0[] = INCBIN_U16("data/tilesets/secondary/mt_ember/anim/steam/0.4bpp"); static const u16 sTilesetAnims_MtEmber_Steam_Frame1[] = INCBIN_U16("data/tilesets/secondary/mt_ember/anim/steam/1.4bpp"); static const u16 sTilesetAnims_MtEmber_Steam_Frame2[] = INCBIN_U16("data/tilesets/secondary/mt_ember/anim/steam/2.4bpp"); static const u16 sTilesetAnims_MtEmber_Steam_Frame3[] = INCBIN_U16("data/tilesets/secondary/mt_ember/anim/steam/3.4bpp"); static const u16 *const sTilesetAnims_MtEmber_Steam[] = { sTilesetAnims_MtEmber_Steam_Frame0, sTilesetAnims_MtEmber_Steam_Frame1, sTilesetAnims_MtEmber_Steam_Frame2, sTilesetAnims_MtEmber_Steam_Frame3 }; static const u16 sTilesetAnims_VermilionGym_MotorizedDoor_Frame0[] = INCBIN_U16("data/tilesets/secondary/vermilion_gym/anim/motorizeddoor/0.4bpp"); static const u16 sTilesetAnims_VermilionGym_MotorizedDoor_Frame1[] = INCBIN_U16("data/tilesets/secondary/vermilion_gym/anim/motorizeddoor/1.4bpp"); static const u16 *const sTilesetAnims_VermilionGym_MotorizedDoor[] = { sTilesetAnims_VermilionGym_MotorizedDoor_Frame0, sTilesetAnims_VermilionGym_MotorizedDoor_Frame1 }; static const u16 sTilesetAnims_CeladonGym_Flowers_Frame0[] = INCBIN_U16("data/tilesets/secondary/celadon_gym/anim/flowers/0.4bpp"); static const u16 sTilesetAnims_CeladonGym_Flowers_Frame1[] = INCBIN_U16("data/tilesets/secondary/celadon_gym/anim/flowers/1.4bpp"); static const u16 sTilesetAnims_CeladonGym_Flowers_Frame2[] = INCBIN_U16("data/tilesets/secondary/celadon_gym/anim/flowers/2.4bpp"); static const u16 *const sTilesetAnims_CeladonGym_Flowers[] = { sTilesetAnims_CeladonGym_Flowers_Frame0, sTilesetAnims_CeladonGym_Flowers_Frame1, sTilesetAnims_CeladonGym_Flowers_Frame2, sTilesetAnims_CeladonGym_Flowers_Frame1 }; static const u16 gTilesetAnims_Underwater_Seaweed_Frame0[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/seaweed/0.4bpp"); static const u16 gTilesetAnims_Underwater_Seaweed_Frame1[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/seaweed/1.4bpp"); static const u16 gTilesetAnims_Underwater_Seaweed_Frame2[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/seaweed/2.4bpp"); static const u16 gTilesetAnims_Underwater_Seaweed_Frame3[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/seaweed/3.4bpp"); static const u16 *const gTilesetAnims_Underwater_Seaweed[] = { gTilesetAnims_Underwater_Seaweed_Frame0, gTilesetAnims_Underwater_Seaweed_Frame1, gTilesetAnims_Underwater_Seaweed_Frame2, gTilesetAnims_Underwater_Seaweed_Frame3 }; const u16 gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame0[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/anim/flag/0.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame1[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/anim/flag/1.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame2[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/anim/flag/2.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame3[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/anim/flag/3.4bpp"); const u16 *const gTilesetAnims_BattleFrontierOutsideWest_Flag[] = { gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame0, gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame1, gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame2, gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame3 }; const u16 gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame0[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/anim/flag/0.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame1[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/anim/flag/1.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame2[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/anim/flag/2.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame3[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/anim/flag/3.4bpp"); const u16 *const gTilesetAnims_BattleFrontierOutsideEast_Flag[] = { gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame0, gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame1, gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame2, gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame3 }; const u16 gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame0[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/anim/flower/0.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame1[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/anim/flower/1.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame2[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsidewest/anim/flower/2.4bpp"); const u16 *const gTilesetAnims_BattleFrontierOutsideWest_Flower[] = { gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame0, gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame1, gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame0, gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame2 }; const u16 gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame0[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/anim/flower/0.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame1[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/anim/flower/1.4bpp"); const u16 gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame2[] = INCBIN_U16("data/tilesets/secondary/battlefrontieroutsideeast/anim/flower/2.4bpp"); const u16 *const gTilesetAnims_BattleFrontierOutsideEast_Flower[] = { gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame0, gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame1, gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame0, gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame2 }; static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame0[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/0.4bpp"); static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame1[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/1.4bpp"); static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame2[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/2.4bpp"); static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame3[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/3.4bpp"); static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame4[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/4.4bpp"); static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame5[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/5.4bpp"); static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame6[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/6.4bpp"); static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame7[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/7.4bpp"); static const u16 *const gTilesetAnims_Mossdeep_Tree_Base[] = { gTilesetAnims_Mossdeep_Tree_Base_Frame0, gTilesetAnims_Mossdeep_Tree_Base_Frame1, gTilesetAnims_Mossdeep_Tree_Base_Frame2, gTilesetAnims_Mossdeep_Tree_Base_Frame3, gTilesetAnims_Mossdeep_Tree_Base_Frame4, gTilesetAnims_Mossdeep_Tree_Base_Frame5, gTilesetAnims_Mossdeep_Tree_Base_Frame6, gTilesetAnims_Mossdeep_Tree_Base_Frame7 }; static void ResetTilesetAnimBuffer(void) { sTilesetDMA3TransferBufferSize = 0; CpuFill32(0, sTilesetDMA3TransferBuffer, sizeof sTilesetDMA3TransferBuffer); } static void AppendTilesetAnimToBuffer(const u16 *src, u16 *dest, u16 size) { if (sTilesetDMA3TransferBufferSize < 20) { sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].src = src; sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].dest = dest; sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].size = size; sTilesetDMA3TransferBufferSize++; } } void TransferTilesetAnimsBuffer(void) { int i; for (i = 0; i < sTilesetDMA3TransferBufferSize; i++) DmaCopy16(3, sTilesetDMA3TransferBuffer[i].src, sTilesetDMA3TransferBuffer[i].dest, sTilesetDMA3TransferBuffer[i].size); sTilesetDMA3TransferBufferSize = 0; } void InitTilesetAnimations(void) { ResetTilesetAnimBuffer(); _InitPrimaryTilesetAnimation(); _InitSecondaryTilesetAnimation(); } void InitSecondaryTilesetAnimation(void) { _InitSecondaryTilesetAnimation(); } void UpdateTilesetAnimations(void) { ResetTilesetAnimBuffer(); if (++sPrimaryTilesetAnimCounter >= sPrimaryTilesetAnimCounterMax) sPrimaryTilesetAnimCounter = 0; if (++sSecondaryTilesetAnimCounter >= sSecondaryTilesetAnimCounterMax) sSecondaryTilesetAnimCounter = 0; if (sPrimaryTilesetAnimCallback) sPrimaryTilesetAnimCallback(sPrimaryTilesetAnimCounter); if (sSecondaryTilesetAnimCallback) sSecondaryTilesetAnimCallback(sSecondaryTilesetAnimCounter); } static void _InitPrimaryTilesetAnimation(void) { sPrimaryTilesetAnimCounter = 0; sPrimaryTilesetAnimCounterMax = 0; sPrimaryTilesetAnimCallback = NULL; if (gMapHeader.mapLayout->primaryTileset && gMapHeader.mapLayout->primaryTileset->callback) gMapHeader.mapLayout->primaryTileset->callback(); } static void _InitSecondaryTilesetAnimation(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 0; sSecondaryTilesetAnimCallback = NULL; if (gMapHeader.mapLayout->secondaryTileset && gMapHeader.mapLayout->secondaryTileset->callback) gMapHeader.mapLayout->secondaryTileset->callback(); } static void QueueAnimTiles_General_Flower(u16 timer) { AppendTilesetAnimToBuffer(sTilesetAnims_General_Flower[timer % ARRAY_COUNT(sTilesetAnims_General_Flower)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(508)), 4 * TILE_SIZE_4BPP); } static void QueueAnimTiles_General_Water_Current_LandWatersEdge(u16 timer) { AppendTilesetAnimToBuffer(sTilesetAnims_General_Water_Current_LandWatersEdge[timer % ARRAY_COUNT(sTilesetAnims_General_Water_Current_LandWatersEdge)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(416)), 48 * TILE_SIZE_4BPP); AppendTilesetAnimToBuffer(gTilesetAnims_Mossdeep_Tree_Base[timer % ARRAY_COUNT(gTilesetAnims_Mossdeep_Tree_Base)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(492)), 0x80); } static void QueueAnimTiles_General_SandWatersEdge(u16 timer) { AppendTilesetAnimToBuffer(sTilesetAnims_General_SandWatersEdge[timer % ARRAY_COUNT(sTilesetAnims_General_SandWatersEdge)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(464)), 18 * TILE_SIZE_4BPP); } static void TilesetAnim_General(u16 timer) { if (timer % 8 == 0) QueueAnimTiles_General_SandWatersEdge(timer / 8); if (timer % 16 == 1) QueueAnimTiles_General_Water_Current_LandWatersEdge(timer / 16); if (timer % 16 == 2) QueueAnimTiles_General_Flower(timer / 16); } void InitTilesetAnim_General(void) { sPrimaryTilesetAnimCounter = 0; sPrimaryTilesetAnimCounterMax = 640; sPrimaryTilesetAnimCallback = TilesetAnim_General; } static void QueueAnimTiles_CeladonCity_Fountain(u16 timer) { AppendTilesetAnimToBuffer(sTilesetAnims_CeladonCity_Fountain[timer % ARRAY_COUNT(sTilesetAnims_CeladonCity_Fountain)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(744)), 8 * TILE_SIZE_4BPP); } static void TilesetAnim_CeladonCity(u16 timer) { if (timer % 12 == 0) QueueAnimTiles_CeladonCity_Fountain(timer / 12); } void InitTilesetAnim_CeladonCity(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 120; sSecondaryTilesetAnimCallback = TilesetAnim_CeladonCity; } static void QueueAnimTiles_SilphCo_Fountain(u16 timer) { AppendTilesetAnimToBuffer(sTilesetAnims_SilphCo_Fountain[timer % ARRAY_COUNT(sTilesetAnims_SilphCo_Fountain)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(976)), 8 * TILE_SIZE_4BPP); } static void TilesetAnim_SilphCo(u16 timer) { if (timer % 10 == 0) QueueAnimTiles_SilphCo_Fountain(timer / 10); } void InitTilesetAnim_SilphCo(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 160; sSecondaryTilesetAnimCallback = TilesetAnim_SilphCo; } static void QueueAnimTiles_MtEmber_Steam(u16 timer) { AppendTilesetAnimToBuffer(sTilesetAnims_MtEmber_Steam[timer % ARRAY_COUNT(sTilesetAnims_MtEmber_Steam)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(896)), 8 * TILE_SIZE_4BPP); } static void TilesetAnim_MtEmber(u16 timer) { if (timer % 16 == 0) QueueAnimTiles_MtEmber_Steam(timer / 16); } void InitTilesetAnim_MtEmber(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 256; sSecondaryTilesetAnimCallback = TilesetAnim_MtEmber; } static void QueueAnimTiles_VermilionGym_MotorizedDoor(u16 timer) { u16 i = timer % ARRAY_COUNT(sTilesetAnims_VermilionGym_MotorizedDoor); AppendTilesetAnimToBuffer(sTilesetAnims_VermilionGym_MotorizedDoor[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(880)), 7 * TILE_SIZE_4BPP); } static void TilesetAnim_VermilionGym(u16 timer) { if (timer % 2 == 0) QueueAnimTiles_VermilionGym_MotorizedDoor(timer / 2); } void InitTilesetAnim_VermilionGym(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 240; sSecondaryTilesetAnimCallback = TilesetAnim_VermilionGym; } static void QueueAnimTiles_CeladonGym_Flowers(u16 timer) { u16 i = timer % ARRAY_COUNT(sTilesetAnims_CeladonGym_Flowers); AppendTilesetAnimToBuffer(sTilesetAnims_CeladonGym_Flowers[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(739)), 4 * TILE_SIZE_4BPP); } static void TilesetAnim_CeladonGym(u16 timer) { if (timer % 16 == 0) QueueAnimTiles_CeladonGym_Flowers(timer / 16); } void InitTilesetAnim_CeladonGym(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 256; sSecondaryTilesetAnimCallback = TilesetAnim_CeladonGym; } static void QueueAnimTiles_Underwater_Seaweed(u8 timer) { u8 i = timer % 4; AppendTilesetAnimToBuffer(gTilesetAnims_Underwater_Seaweed[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x2B5)), 0x80); } static void TilesetAnim_Underwater(u16 timer) { if (timer % 16 == 0) QueueAnimTiles_Underwater_Seaweed(timer >> 4); } void InitTilesetAnim_Underwater(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 128; sSecondaryTilesetAnimCallback = TilesetAnim_Underwater; } static void QueueAnimTiles_BattleFrontierOutsideWest_Flag(u16 timer) { u16 i = timer % 4; AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideWest_Flag[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x300)), 0xC0); } static void QueueAnimTiles_BattleFrontierOutsideEast_Flag(u16 timer) { u16 i = timer % 4; AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideEast_Flag[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x300)), 0xC0); } static void QueueAnimTiles_BattleFrontierOutsideWest_Flower(u16 timer) { u16 i = timer % 4; AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideWest_Flower[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x312)), 0x80); } static void QueueAnimTiles_BattleFrontierOutsideEast_Flower(u16 timer) { u16 i = timer % 4; AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideEast_Flower[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x312)), 0x80); } static void TilesetAnim_BattleFrontierOutsideWest(u16 timer) { if (timer % 16 == 0) QueueAnimTiles_BattleFrontierOutsideWest_Flower(timer >> 4); if (timer % 8 == 0) QueueAnimTiles_BattleFrontierOutsideWest_Flag(timer >> 3); } static void TilesetAnim_BattleFrontierOutsideEast(u16 timer) { if (timer % 16 == 0) QueueAnimTiles_BattleFrontierOutsideEast_Flower(timer >> 4); if (timer % 8 == 0) QueueAnimTiles_BattleFrontierOutsideEast_Flag(timer >> 3); } void InitTilesetAnim_BattleFrontierOutsideWest(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 256; sSecondaryTilesetAnimCallback = TilesetAnim_BattleFrontierOutsideWest; } void InitTilesetAnim_BattleFrontierOutsideEast(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 256; sSecondaryTilesetAnimCallback = TilesetAnim_BattleFrontierOutsideEast; } static void QueueAnimTiles_SeviiIslands67_Flower(u16 timer) { u16 i = timer % 4; AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideEast_Flower[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x377)), 0x80); } static void TilesetAnim_SeviiIslands67(u16 timer) { if (timer % 16 == 0) QueueAnimTiles_SeviiIslands67_Flower(timer >> 4); } void InitTilesetAnim_SeviiIslands67(void) { sSecondaryTilesetAnimCounter = 0; sSecondaryTilesetAnimCounterMax = 256; sSecondaryTilesetAnimCallback = TilesetAnim_SeviiIslands67; } static void QueueAnimTiles_SeviiIslands5_ShortGrassFlower(u16 timer) { AppendTilesetAnimToBuffer(sTilesetAnims_General_Flower[timer % NELEMS(sTilesetAnims_General_Flower)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x324)), 0x80); } static void TilesetAnim_SeviiIslands5(u16 timer) { if (timer % 16 == 2) QueueAnimTiles_SeviiIslands5_ShortGrassFlower(timer >> 4); } void InitTilesetAnim_SeviiIslands5(void) { sSecondaryTilesetAnimCounter = sPrimaryTilesetAnimCounter; sSecondaryTilesetAnimCounterMax = sPrimaryTilesetAnimCounterMax; sSecondaryTilesetAnimCallback = TilesetAnim_SeviiIslands5; } ================================================ FILE: src/tilesets.c ================================================ #include "global.h" #include "tilesets.h" #include "tileset_anims.h" #include "data/tilesets/graphics.h" #include "data/tilesets/metatiles.h" #include "data/tilesets/headers.h" ================================================ FILE: src/title_screen.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "new_menu_helpers.h" #include "m4a.h" #include "scanline_effect.h" #include "graphics.h" #include "help_system.h" #include "intro.h" #include "load_save.h" #include "new_game.h" #include "random.h" #include "save.h" #include "main_menu.h" #include "clear_save_data_screen.h" #include "berry_fix_program.h" #include "decompress.h" #include "constants/songs.h" enum TitleScreenScene { TITLESCREENSCENE_INIT = 0, TITLESCREENSCENE_FLASHSPRITE, TITLESCREENSCENE_FADEIN, TITLESCREENSCENE_RUN, TITLESCREENSCENE_RESTART, TITLESCREENSCENE_CRY }; static EWRAM_DATA u8 sTitleScreenTimerTaskId = 0; static void ResetGpuRegs(void); static void CB2_TitleScreenRun(void); static void VBlankCB(void); static void Task_TitleScreenTimer(u8 taskId); static void Task_TitleScreenMain(u8 taskId); static void SetTitleScreenScene(s16 *data, u8 sceneNum); static void SetTitleScreenScene_Init(s16 *data); static void SetTitleScreenScene_FlashSprite(s16 *data); static void SetTitleScreenScene_FadeIn(s16 *data); static void SetTitleScreenScene_Run(s16 *data); static void SetGpuRegsForTitleScreenRun(void); static void SetTitleScreenScene_Restart(s16 *data); static void SetTitleScreenScene_Cry(s16 *data); static void Task_TitleScreen_SlideWin0(u8 taskId); static void Task_TitleScreen_BlinkPressStart(u8 taskId); static void SignalEndTitleScreenPaletteSomethingTask(void); static void UpdateScanlineEffectRegBuffer(s16 y); static void ScheduleStopScanlineEffect(void); static void LoadMainTitleScreenPalsAndResetBgs(void); static void CB2_FadeOutTransitionToSaveClearScreen(void); static void CB2_FadeOutTransitionToBerryFix(void); static void LoadSpriteGfxAndPals(void); static void SpriteCallback_TitleScreenFlameOrLeaf(struct Sprite *sprite); static void Task_FlameOrLeafSpawner(u8 taskId); static void TitleScreen_srand(u8 taskId, u8 field, u16 seed); static u16 TitleScreen_rand(u8 taskId, u8 field); static u32 CreateBlankSprite(void); static void SetPalOnOrCreateBlankSprite(bool32 hasCreatedBlankSprite); static u8 CreateSlashSprite(void); static void DeactivateSlashSprite(u8 spriteId); static bool32 IsSlashSpriteDeactivated(u8 spriteId); static void SpriteCallback_Slash(struct Sprite *sprite); static void sub_LG_8079844(void); static void CreateStreakSprites(void); static const u8 sBorderBgTiles[] = INCBIN_U8("graphics/title_screen/border_bg.4bpp.lz"); static const u8 sBorderBgMap_FR[] = INCBIN_U8("graphics/title_screen/firered/border_bg.bin.lz"); static const u8 sBorderBgMap_LG[] = INCBIN_U8("graphics/title_screen/leafgreen/border_bg.bin.lz"); static const u32 sSlash_Gfx[] = INCBIN_U32("graphics/title_screen/slash.4bpp.lz"); static const u16 sFlames_Pal[] = INCBIN_U16("graphics/title_screen/firered/flames.gbapal"); static const u32 sFlames_Gfx[] = INCBIN_U32("graphics/title_screen/firered/flames.4bpp.lz"); static const u32 sBlankFlames_Gfx[] = INCBIN_U32("graphics/title_screen/firered/blank_flames.4bpp.lz"); static const u16 sLeaves_Pal[] = INCBIN_U16("graphics/title_screen/leafgreen/leaves.gbapal"); static const u32 sLeaves_Gfx[] = INCBIN_U32("graphics/title_screen/leafgreen/leaves.4bpp.lz"); static const u32 sStreak_Gfx[] = INCBIN_U32("graphics/title_screen/leafgreen/streak.4bpp.lz"); static const struct OamData sOamData_FlameOrLeaf = { .objMode = ST_OAM_OBJ_NORMAL, .shape = ST_OAM_SQUARE, .size = ST_OAM_SIZE_1, .tileNum = 0, .priority = 3, .paletteNum = 0 }; static const union AnimCmd sSpriteAnim_Flame[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(4, 6), ANIMCMD_FRAME(8, 6), ANIMCMD_FRAME(12, 6), ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(20, 6), ANIMCMD_FRAME(24, 6), ANIMCMD_FRAME(28, 6), ANIMCMD_FRAME(32, 6), ANIMCMD_FRAME(36, 6), ANIMCMD_END }; static const union AnimCmd sSpriteAnim_Flame_Unused[] = { ANIMCMD_FRAME(24, 6), ANIMCMD_FRAME(28, 6), ANIMCMD_FRAME(32, 6), ANIMCMD_FRAME(36, 6), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnim_FlameOrLeaf_FR[] = { sSpriteAnim_Flame, sSpriteAnim_Flame_Unused, }; static const union AnimCmd sSpriteAnim_Leaf[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(8, 8), ANIMCMD_FRAME(12, 8), ANIMCMD_FRAME(16, 8), ANIMCMD_FRAME(20, 8), ANIMCMD_FRAME(24, 8), ANIMCMD_FRAME(28, 8), ANIMCMD_FRAME(32, 8), ANIMCMD_FRAME(36, 8), ANIMCMD_FRAME(40, 8), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sSpriteAnim_FlameOrLeaf_LG[] = { sSpriteAnim_Leaf }; enum { TILE_TAG_FLAME_OR_LEAF, TILE_TAG_BLANK_OR_STREAK, TILE_TAG_BLANK, TILE_TAG_SLASH, }; enum { PAL_TAG_DEFAULT, PAL_TAG_UNUSED, PAL_TAG_SLASH, }; static const struct SpriteTemplate sSpriteTemplate_FlameOrLeaf_FR = { .tileTag = TILE_TAG_FLAME_OR_LEAF, .paletteTag = PAL_TAG_DEFAULT, .oam = &sOamData_FlameOrLeaf, .anims = sSpriteAnim_FlameOrLeaf_FR, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_FlameOrLeaf_LG = { .tileTag = TILE_TAG_FLAME_OR_LEAF, .paletteTag = PAL_TAG_DEFAULT, .oam = &sOamData_FlameOrLeaf, .anims = sSpriteAnim_FlameOrLeaf_LG, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_BlankFlame = { .tileTag = TILE_TAG_BLANK_OR_STREAK, .paletteTag = PAL_TAG_DEFAULT, .oam = &sOamData_FlameOrLeaf, .anims = sSpriteAnim_FlameOrLeaf_FR, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_Streak = { .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .priority = 3 }; static const struct SpriteTemplate sSpriteTemplate_Streak = { .tileTag = TILE_TAG_BLANK_OR_STREAK, .paletteTag = PAL_TAG_DEFAULT, .oam = &sOamData_Streak, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_BlankSprite = { .objMode = ST_OAM_OBJ_NORMAL, .shape = ST_OAM_V_RECTANGLE, .size = ST_OAM_SIZE_3, .tileNum = 0, .priority = 0, .paletteNum = 0 }; static const struct SpriteTemplate sSpriteTemplate_BlankSprite = { .tileTag = TILE_TAG_BLANK, .paletteTag = PAL_TAG_SLASH, .oam = &sOamData_BlankSprite, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_SlashSprite = { .objMode = ST_OAM_OBJ_WINDOW, .shape = ST_OAM_SQUARE, .size = ST_OAM_SIZE_3, .tileNum = 0, .priority = 0, .paletteNum = 0 }; static const struct SpriteTemplate sSlashSpriteTemplate = { .tileTag = TILE_TAG_SLASH, .paletteTag = PAL_TAG_SLASH, .oam = &sOamData_SlashSprite, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 1, // 8bpp .priority = 0, .baseTile = 0 }, { .bg = 1, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, // 4bpp .priority = 1, .baseTile = 0 }, { .bg = 2, .charBaseIndex = 2, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, // 4bpp .priority = 2, .baseTile = 0 }, { .bg = 3, .charBaseIndex = 3, .mapBaseIndex = 28, .screenSize = 0, .paletteMode = 0, // 4bpp .priority = 3, .baseTile = 0 } }; static void (*const sSceneFuncs[])(s16 *data) = { [TITLESCREENSCENE_INIT] = SetTitleScreenScene_Init, [TITLESCREENSCENE_FLASHSPRITE] = SetTitleScreenScene_FlashSprite, [TITLESCREENSCENE_FADEIN] = SetTitleScreenScene_FadeIn, [TITLESCREENSCENE_RUN] = SetTitleScreenScene_Run, [TITLESCREENSCENE_RESTART] = SetTitleScreenScene_Restart, [TITLESCREENSCENE_CRY] = SetTitleScreenScene_Cry }; static const struct CompressedSpriteSheet sSpriteSheets_FR[] = { {sFlames_Gfx, 0x500, TILE_TAG_FLAME_OR_LEAF}, {sBlankFlames_Gfx, 0x500, TILE_TAG_BLANK_OR_STREAK}, {gTitleScreen_BlankSprite_Tiles, 0x400, TILE_TAG_BLANK}, {sSlash_Gfx, 0x800, TILE_TAG_SLASH} }; static const struct SpritePalette sSpritePals_FR[] = { {sFlames_Pal, PAL_TAG_DEFAULT}, {gTitleScreen_Slash_Pal_FR, PAL_TAG_SLASH}, {} }; static const u8 sFlameXPositions[] = { 4, 16, 26, 32, 48, 200, 216, 224, 232, 60, 76, 92, 108, 128, 144, 0 }; static const struct CompressedSpriteSheet sSpriteSheets_LG[] = { {sLeaves_Gfx, 0x580, TILE_TAG_FLAME_OR_LEAF}, {sStreak_Gfx, 0x100, TILE_TAG_BLANK_OR_STREAK}, {gTitleScreen_BlankSprite_Tiles, 0x400, TILE_TAG_BLANK}, {sSlash_Gfx, 0x800, TILE_TAG_SLASH} }; static const struct SpritePalette sSpritePals_LG[] = { {sLeaves_Pal, PAL_TAG_DEFAULT}, {gTitleScreen_Slash_Pal_LG, PAL_TAG_SLASH}, {} }; static const u16 sStreakYPositions[] = { 40, 80, 110, 60, 90, 70, 100, 50 }; void CB2_InitTitleScreen(void) { switch (gMain.state) { default: gMain.state = 0; // fallthrough case 0: SetVBlankCallback(NULL); StartTimer1(); InitHeap(gHeap, HEAP_SIZE); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); ResetPaletteFade(); ResetGpuRegs(); DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); DmaFill32(3, 0, (void *)OAM, OAM_SIZE); DmaFill16(3, 0, (void *)PLTT, PLTT_SIZE); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); sTitleScreenTimerTaskId = TASK_NONE; break; case 1: if(gSaveBlock1Ptr->keyFlags.version == 0) { LoadPalette(gGraphics_TitleScreen_GameTitleLogoPals_FR, BG_PLTT_ID(0), 13 * PLTT_SIZE_4BPP); DecompressAndCopyTileDataToVram(0, gGraphics_TitleScreen_GameTitleLogoTiles_FR, 0, 0, 0); DecompressAndCopyTileDataToVram(0, gGraphics_TitleScreen_GameTitleLogoMap_FR, 0, 0, 1); LoadPalette(gGraphics_TitleScreen_BoxArtMonPals_FR, BG_PLTT_ID(13), PLTT_SIZE_4BPP); DecompressAndCopyTileDataToVram(1, gGraphics_TitleScreen_BoxArtMonTiles_FR, 0, 0, 0); DecompressAndCopyTileDataToVram(1, gGraphics_TitleScreen_BoxArtMonMap_FR, 0, 0, 1); LoadPalette(gGraphics_TitleScreen_BackgroundPals_FR, BG_PLTT_ID(15), PLTT_SIZE_4BPP); DecompressAndCopyTileDataToVram(2, gGraphics_TitleScreen_CopyrightPressStartTiles, 0, 0, 0); DecompressAndCopyTileDataToVram(2, gGraphics_TitleScreen_CopyrightPressStartMap, 0, 0, 1); LoadPalette(gGraphics_TitleScreen_BackgroundPals_FR, BG_PLTT_ID(14), PLTT_SIZE_4BPP); } else { LoadPalette(gGraphics_TitleScreen_GameTitleLogoPals_LG, BG_PLTT_ID(0), 13 * PLTT_SIZE_4BPP); DecompressAndCopyTileDataToVram(0, gGraphics_TitleScreen_GameTitleLogoTiles_LG, 0, 0, 0); DecompressAndCopyTileDataToVram(0, gGraphics_TitleScreen_GameTitleLogoMap_LG, 0, 0, 1); LoadPalette(gGraphics_TitleScreen_BoxArtMonPals_LG, BG_PLTT_ID(13), PLTT_SIZE_4BPP); DecompressAndCopyTileDataToVram(1, gGraphics_TitleScreen_BoxArtMonTiles_LG, 0, 0, 0); DecompressAndCopyTileDataToVram(1, gGraphics_TitleScreen_BoxArtMonMap_LG, 0, 0, 1); LoadPalette(gGraphics_TitleScreen_BackgroundPals_LG, BG_PLTT_ID(15), PLTT_SIZE_4BPP); DecompressAndCopyTileDataToVram(2, gGraphics_TitleScreen_CopyrightPressStartTiles, 0, 0, 0); DecompressAndCopyTileDataToVram(2, gGraphics_TitleScreen_CopyrightPressStartMap, 0, 0, 1); LoadPalette(gGraphics_TitleScreen_BackgroundPals_LG, BG_PLTT_ID(14), PLTT_SIZE_4BPP); } DecompressAndCopyTileDataToVram(3, sBorderBgTiles, 0, 0, 0); if(gSaveBlock1Ptr->keyFlags.version == 0) DecompressAndCopyTileDataToVram(3, sBorderBgMap_FR, 0, 0, 1); else DecompressAndCopyTileDataToVram(3, sBorderBgMap_LG, 0, 0, 1); LoadSpriteGfxAndPals(); break; case 2: if (!FreeTempTileDataBuffersIfPossible()) { BlendPalettes(PALETTES_BG, 16, RGB_BLACK); CreateTask(Task_TitleScreenMain, 4); sTitleScreenTimerTaskId = CreateTask(Task_TitleScreenTimer, 2); SetVBlankCallback(VBlankCB); SetMainCallback2(CB2_TitleScreenRun); m4aSongNumStart(MUS_TITLE); } return; } gMain.state++; } static void ResetGpuRegs(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); } static void CB2_TitleScreenRun(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCB(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); ScanlineEffect_InitHBlankDmaTransfer(); if (sTitleScreenTimerTaskId != TASK_NONE) gTasks[sTitleScreenTimerTaskId].data[0]++; } static void Task_TitleScreenTimer(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[0] >= 2700) { sTitleScreenTimerTaskId = TASK_NONE; DestroyTask(taskId); } } // task data for Task_TitleScreenMain and the scenes #define tSceneNum data[0] #define tState data[1] #define tHasCreatedBlankSprite data[5] #define tSlashSpriteId data[6] static void Task_TitleScreenMain(u8 taskId) { s16 *data = gTasks[taskId].data; if (JOY_NEW(A_BUTTON | B_BUTTON | START_BUTTON) && tSceneNum != TITLESCREENSCENE_RUN && tSceneNum != TITLESCREENSCENE_RESTART && tSceneNum != TITLESCREENSCENE_CRY) { ScheduleStopScanlineEffect(); LoadMainTitleScreenPalsAndResetBgs(); SetPalOnOrCreateBlankSprite(tHasCreatedBlankSprite); SetTitleScreenScene(data, TITLESCREENSCENE_RUN); } else sSceneFuncs[tSceneNum](data); } static void SetTitleScreenScene(s16 *data, u8 sceneNum) { tState = 0; tSceneNum = sceneNum; } static void SetTitleScreenScene_Init(s16 *data) { struct ScanlineEffectParams params; HideBg(0); ShowBg(1); ShowBg(2); ShowBg(3); params.dmaDest = (volatile void *)REG_ADDR_BLDY; params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; params.initState = 1; params.unused9 = 0; CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140); CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140); ScanlineEffect_SetParams(params); SetTitleScreenScene(data, TITLESCREENSCENE_FLASHSPRITE); } static void SetTitleScreenScene_FlashSprite(s16 *data) { switch (tState) { case 0: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 0); data[2] = 128; UpdateScanlineEffectRegBuffer(data[2]); tState++; break; case 1: data[2] -= 4; UpdateScanlineEffectRegBuffer(data[2]); if (data[2] < 0) { gScanlineEffect.state = 3; tState++; } break; case 2: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetTitleScreenScene(data, TITLESCREENSCENE_FADEIN); } } static void SetTitleScreenScene_FadeIn(s16 *data) { switch (tState) { case 0: data[2] = 0; tState++; break; case 1: data[2]++; if (data[2] > 10) { TintPalette_GrayScale2(&gPlttBufferUnfaded[BG_PLTT_ID(13)], 16); BeginNormalPaletteFade(1 << 13, 9, 16, 0, RGB_BLACK); tState++; } break; case 2: if (!gPaletteFade.active) { data[2] = 0; tState++; } break; case 3: data[2]++; if (data[2] > 36) { CreateTask(Task_TitleScreen_SlideWin0, 3); BlendPalettesGradually(1 << 13, -4, 1, 16, RGB(30, 30, 31), 0, 0); data[2] = 0; tState++; } break; case 4: if (!IsBlendPalettesGraduallyTaskActive(0)) { BlendPalettesGradually(1 << 13, -4, 15, 0, RGB(30, 30, 31), 0, 0); tState++; } break; case 5: data[2]++; if (data[2] > 20) { data[2] = 0; BlendPalettesGradually(1 << 13, -4, 1, 16, RGB(30, 30, 31), 0, 0); tState++; } break; case 6: if (!IsBlendPalettesGraduallyTaskActive(0)) { BlendPalettesGradually(1 << 13, -4, 15, 0, RGB(30, 30, 31), 0, 0); tState++; } break; case 7: data[2]++; if (data[2] > 20) { data[2] = 0; BlendPalettesGradually(1 << 13, -3, 0, 16, RGB(30, 30, 31), 0, 0); tState++; } break; case 8: if (!IsBlendPalettesGraduallyTaskActive(0)) { u32 palettes; tHasCreatedBlankSprite = TRUE; palettes = (PALETTES_BG & ~(1 << 13) & ~(1 << 14) & ~(1 << 15)) | (0x10000 << CreateBlankSprite()); BlendPalettes(palettes, 16, RGB(30, 30, 31)); BeginNormalPaletteFade(palettes, 1, 16, 0, RGB(30, 30, 31)); ShowBg(0); if(gSaveBlock1Ptr->keyFlags.version == 0) CpuCopy16(gGraphics_TitleScreen_BoxArtMonPals_FR, &gPlttBufferUnfaded[BG_PLTT_ID(13)], PLTT_SIZE_4BPP); else CpuCopy16(gGraphics_TitleScreen_BoxArtMonPals_LG, &gPlttBufferUnfaded[BG_PLTT_ID(13)], PLTT_SIZE_4BPP); BlendPalettesGradually(1 << 13, 1, 15, 0, RGB(30, 30, 31), 0, 0); tState++; } break; case 9: if (!IsBlendPalettesGraduallyTaskActive(0) && !gPaletteFade.active) { SetTitleScreenScene(data, TITLESCREENSCENE_RUN); } break; } } #define KEYSTROKE_DELSAVE (B_BUTTON | SELECT_BUTTON | DPAD_UP) #define KEYSTROKE_BERRY_FIX (B_BUTTON | SELECT_BUTTON) static void SetTitleScreenScene_Run(s16 *data) { switch (tState) { case 0: SetHelpContext(HELPCONTEXT_TITLE_SCREEN); CreateTask(Task_TitleScreen_BlinkPressStart, 0); CreateTask(Task_FlameOrLeafSpawner, 5); SetGpuRegsForTitleScreenRun(); tSlashSpriteId = CreateSlashSprite(); HelpSystem_Enable(); tState++; // fallthrough case 1: if (JOY_HELD(KEYSTROKE_DELSAVE) == KEYSTROKE_DELSAVE) { DeactivateSlashSprite(tSlashSpriteId); DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain)); SetMainCallback2(CB2_FadeOutTransitionToSaveClearScreen); } else if (JOY_HELD(KEYSTROKE_BERRY_FIX) == KEYSTROKE_BERRY_FIX) { DeactivateSlashSprite(tSlashSpriteId); DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain)); SetMainCallback2(CB2_FadeOutTransitionToBerryFix); } else if (JOY_NEW(A_BUTTON | START_BUTTON)) { SetTitleScreenScene(data, TITLESCREENSCENE_CRY); } else if (!FuncIsActiveTask(Task_TitleScreenTimer)) { SetTitleScreenScene(data, TITLESCREENSCENE_RESTART); } break; } } static void SetGpuRegsForTitleScreenRun(void) { SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WINOBJ_ALL); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 13); } static void SetTitleScreenScene_Restart(s16 *data) { switch (tState) { case 0: DeactivateSlashSprite(tSlashSpriteId); tState++; break; case 1: if (!gPaletteFade.active && !IsSlashSpriteDeactivated(tSlashSpriteId)) { FadeOutMapMusic(10); BeginNormalPaletteFade(PALETTES_ALL, 3, 0, 0x10, RGB_BLACK); SignalEndTitleScreenPaletteSomethingTask(); data[1]++; } break; case 2: if (IsNotWaitingForBGMStop() && !gPaletteFade.active) { DestroyTask(FindTaskIdByFunc(Task_TitleScreen_BlinkPressStart)); data[2] = 0; tState++; } break; case 3: data[2]++; if (data[2] >= 20) { DestroyTask(FindTaskIdByFunc(Task_TitleScreen_BlinkPressStart)); tState++; } break; case 4: HelpSystem_Disable(); DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain)); SetMainCallback2(CB2_InitCopyrightScreenAfterTitleScreen); break; } } static void SetTitleScreenScene_Cry(s16 *data) { switch (tState) { case 0: if (!gPaletteFade.active) { if(gSaveBlock1Ptr->keyFlags.version == 0) PlayCry_Normal(SPECIES_CHARIZARD, 0); else PlayCry_Normal(SPECIES_VENUSAUR, 0); DeactivateSlashSprite(tSlashSpriteId); data[2] = 0; tState++; } break; case 1: if (data[2] < 90) data[2]++; else if (!IsSlashSpriteDeactivated(tSlashSpriteId)) { BeginNormalPaletteFade((PALETTES_ALL & ~(1 << 0x1C) & ~(1 << 0x1D) & ~(1 << 0x1E) & ~(1 << 0x1F)), 0, 0, 16, RGB_WHITE); SignalEndTitleScreenPaletteSomethingTask(); FadeOutBGM(4); tState++; } break; case 2: if (!gPaletteFade.active) { u8 KeyVersionBackup = gSaveBlock1Ptr->keyFlags.version; u8 KeyDifficultyBackup = gSaveBlock1Ptr->keyFlags.difficulty; u8 KeyNuzlockeBackup = gSaveBlock1Ptr->keyFlags.nuzlocke; u8 KeyIvCalcBackup = gSaveBlock1Ptr->keyFlags.ivCalcMode; u8 KeyEvCalcBackup = gSaveBlock1Ptr->keyFlags.evCalcMode; u8 ChangedCalcBackup = gSaveBlock1Ptr->keyFlags.changedCalcMode; u8 noPMCBackup = gSaveBlock1Ptr->keyFlags.noPMC; u8 expModBackup = gSaveBlock1Ptr->keyFlags.expMod; SeedRngAndSetTrainerId(); SetSaveBlocksPointers(); ResetMenuAndMonGlobals(); Save_ResetSaveCounters(); LoadGameSave(SAVE_NORMAL); if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID) Sav2_ClearSetDefault(); gSaveBlock1Ptr->keyFlags.version = KeyVersionBackup; gSaveBlock1Ptr->keyFlags.difficulty = KeyDifficultyBackup; gSaveBlock1Ptr->keyFlags.nuzlocke = KeyNuzlockeBackup; gSaveBlock1Ptr->keyFlags.ivCalcMode = KeyIvCalcBackup; gSaveBlock1Ptr->keyFlags.evCalcMode = KeyEvCalcBackup; gSaveBlock1Ptr->keyFlags.changedCalcMode = ChangedCalcBackup; gSaveBlock1Ptr->keyFlags.noPMC = noPMCBackup; gSaveBlock1Ptr->keyFlags.expMod = expModBackup; SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); InitHeap(gHeap, HEAP_SIZE); SetMainCallback2(CB2_InitMainMenu); DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain)); } break; } } #undef tSceneNum #undef tState #undef tHasCreatedBlankSprite #undef tSlashSpriteId static void Task_TitleScreen_SlideWin0(u8 taskId) { s16 *data = gTasks[taskId].data; switch (data[0]) { case 0: SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, DISPLAY_HEIGHT)); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0)); BlendPalettes(1 << 0xE, 0, RGB_BLACK); data[0]++; break; case 1: data[1] += 24 << 4; data[2] = data[1] >> 4; if (data[2] >= DISPLAY_WIDTH) { data[2] = DISPLAY_WIDTH; data[0]++; } SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, data[2])); break; case 2: data[3]++; if (data[3] >= 10) { data[3] = 0; data[0]++; } break; case 3: SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(DISPLAY_WIDTH, DISPLAY_WIDTH)); ChangeBgX(2, -0xF000, 0); BlendPalettes(1 << 0xF, 0, RGB_BLACK); data[1] = 10 * 24 << 4; data[0]++; break; case 4: data[1] -= 24 << 4; data[2] = data[1] >> 4; if (data[2] <= 0) { data[2] = 0; data[0]++; } ChangeBgX(2, -data[2] << 8, 0); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(data[2], DISPLAY_WIDTH)); break; case 5: ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); DestroyTask(taskId); break; } } static void Task_TitleScreen_BlinkPressStart(u8 taskId) { s16 *data = gTasks[taskId].data; s32 i; if (data[15] && gPaletteFade.active) data[14] = 1; if (data[14] && !gPaletteFade.active) DestroyTask(taskId); else { if (!data[1]) data[2] = 60; else data[2] = 30; data[0]++; if (data[0] >= data[2]) { data[0] = 0; data[1] ^= 1; if (data[1]) { for (i = 0; i < 5; i++) { if(gSaveBlock1Ptr->keyFlags.version == 0) { gPlttBufferUnfaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_FR[6]; gPlttBufferFaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_FR[6]; } else { gPlttBufferUnfaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_LG[6]; gPlttBufferFaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_LG[6]; } } } else { for (i = 0; i < 5; i++) { if(gSaveBlock1Ptr->keyFlags.version == 0) { gPlttBufferUnfaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_FR[1 + i]; gPlttBufferFaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_FR[1 + i]; } else { gPlttBufferUnfaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_LG[1 + i]; gPlttBufferFaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_LG[1 + i]; } } } if (data[14]) { BlendPalettes(0x00008000, gPaletteFade.y, gPaletteFade.blendColor); } } } } static void SignalEndTitleScreenPaletteSomethingTask(void) { u8 taskId = FindTaskIdByFunc(Task_TitleScreen_BlinkPressStart); gTasks[taskId].data[15] = TRUE; } static void UpdateScanlineEffectRegBuffer(s16 y) { s32 i; if (y >= 0) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][y] = 16; for (i = 0; i < 16; i++) { if (y + i >= 0) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][y + i] = 15 - i; if (y - i >= 0) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][y - i] = 15 - i; } for (i = y + 16; i < 160; i++) { if (i >= 0) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = 0; } for (i = y - 16; i >= 0; i--) { if (i >= 0) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = 0; } } static void ScheduleStopScanlineEffect(void) { if (gScanlineEffect.state) gScanlineEffect.state = 3; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDY, 0); } static void LoadMainTitleScreenPalsAndResetBgs(void) { u8 taskId; taskId = FindTaskIdByFunc(Task_TitleScreen_SlideWin0); if (taskId != TASK_NONE) DestroyTask(taskId); DestroyBlendPalettesGraduallyTask(); ResetPaletteFadeControl(); if(gSaveBlock1Ptr->keyFlags.version == 0) { LoadPalette(gGraphics_TitleScreen_GameTitleLogoPals_FR, BG_PLTT_ID(0), 13 * PLTT_SIZE_4BPP); LoadPalette(gGraphics_TitleScreen_BoxArtMonPals_FR, BG_PLTT_ID(13), PLTT_SIZE_4BPP); LoadPalette(gGraphics_TitleScreen_BackgroundPals_FR, BG_PLTT_ID(15), PLTT_SIZE_4BPP); LoadPalette(gGraphics_TitleScreen_BackgroundPals_FR, BG_PLTT_ID(14), PLTT_SIZE_4BPP); } else { LoadPalette(gGraphics_TitleScreen_GameTitleLogoPals_LG, BG_PLTT_ID(0), 13 * PLTT_SIZE_4BPP); LoadPalette(gGraphics_TitleScreen_BoxArtMonPals_LG, BG_PLTT_ID(13), PLTT_SIZE_4BPP); LoadPalette(gGraphics_TitleScreen_BackgroundPals_LG, BG_PLTT_ID(15), PLTT_SIZE_4BPP); LoadPalette(gGraphics_TitleScreen_BackgroundPals_LG, BG_PLTT_ID(14), PLTT_SIZE_4BPP); } ResetBgPositions(); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON); ShowBg(1); ShowBg(2); ShowBg(0); ShowBg(3); } static void CB2_FadeOutTransitionToSaveClearScreen(void) { if (!UpdatePaletteFade()) SetMainCallback2(CB2_SaveClearScreen_Init); } static void CB2_FadeOutTransitionToBerryFix(void) { if (!UpdatePaletteFade()) { m4aMPlayAllStop(); SetMainCallback2(CB2_InitBerryFixProgram); } } static void LoadSpriteGfxAndPals(void) { s32 i; for (i = 0; i < NELEMS(sSpriteSheets_FR); i++) { if(gSaveBlock1Ptr->keyFlags.version == 0) LoadCompressedSpriteSheet(&sSpriteSheets_FR[i]); else LoadCompressedSpriteSheet(&sSpriteSheets_LG[i]); } if(gSaveBlock1Ptr->keyFlags.version == 0) LoadSpritePalettes(sSpritePals_FR); else LoadSpritePalettes(sSpritePals_LG); } #define sPosX data[0] #define sSpeedX data[1] #define sPosY data[2] #define sSpeedY data[3] static void SpriteCallback_TitleScreenFlameOrLeaf(struct Sprite *sprite) { s16 *data = sprite->data; sPosX -= sSpeedX; sprite->x = sPosX >> 4; if (sprite->x < -8) { DestroySprite(sprite); return; } sPosY += sSpeedY; sprite->y = sPosY >> 4; if (sprite->y < 16 || sprite->y > 200) { DestroySprite(sprite); return; } if(gSaveBlock1Ptr->keyFlags.version == 0) { if (sprite->animEnded) { DestroySprite(sprite); return; } if (data[7] != 0 && --data[7] == 0) { StartSpriteAnim(sprite, 0); sprite->invisible = FALSE; } } else { if (!data[5]) { // meaningless, since data[5] and data[6] are never used outside this block s32 r2; s32 r1; data[6]++; r2 = sSpeedX * data[6]; r1 = sSpeedY * data[6]; r2 = (r2 * r2) >> 4; r1 = (r1 * r1) >> 4; if (r2 + r1 >= 81 << 4) data[5] = TRUE; } } } static bool32 CreateFlameOrLeafSprite(s32 x, s32 y, s32 xspeed, s32 yspeed, bool32 createFlame) { u8 spriteId; if(gSaveBlock1Ptr->keyFlags.version == 0) { if (createFlame) spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf_FR, x, y, 0); else spriteId = CreateSprite(&sSpriteTemplate_BlankFlame, x, y, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].sPosX = x * 16; gSprites[spriteId].sSpeedX = xspeed; gSprites[spriteId].sPosY = y * 16; gSprites[spriteId].sSpeedY = yspeed; gSprites[spriteId].data[4] = 0; gSprites[spriteId].data[5] = (xspeed * yspeed) % 16; gSprites[spriteId].data[6] = createFlame; gSprites[spriteId].callback = SpriteCallback_TitleScreenFlameOrLeaf; return TRUE; } return FALSE; } else { //(s32 y0, s32 x1, s32 y1) original params, y0 = x, x1 = y, y1 = xspeed u8 spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf_LG, DISPLAY_WIDTH, x, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].sPosX = DISPLAY_WIDTH * 16; gSprites[spriteId].sSpeedX = y; gSprites[spriteId].sPosY = x * 16; gSprites[spriteId].sSpeedY = xspeed; gSprites[spriteId].callback = SpriteCallback_TitleScreenFlameOrLeaf; } } } #undef sPosX #undef sSpeedX #undef sPosY #undef sSpeedY #define tState data[0] #define tTimer data[1] #define tDelay data[2] #define tOff_Seed 3 // data[3] and data[4] #define tOffsetX data[5] static void Task_FlameOrLeafSpawner(u8 taskId) { if(gSaveBlock1Ptr->keyFlags.version == 0) { s16 *data = gTasks[taskId].data; s32 x, y, xspeed, yspeed; s32 i; switch (tState) { case 0: TitleScreen_srand(taskId, 3, 30840); tState++; break; case 1: tTimer++; if (tTimer >= tDelay) { tTimer = 0; TitleScreen_rand(taskId, 3); tDelay = 18; xspeed = (TitleScreen_rand(taskId, 3) % 4) - 2; yspeed = (TitleScreen_rand(taskId, 3) % 8) - 16; y = (TitleScreen_rand(taskId, 3) % 3) + 116; x = TitleScreen_rand(taskId, 3) % DISPLAY_WIDTH; CreateFlameOrLeafSprite( x, y, xspeed, yspeed, (TitleScreen_rand(taskId, 3) % 16) < 8 ? FALSE : TRUE ); for (i = 0; i < 15; i++) { CreateFlameOrLeafSprite( tOffsetX + sFlameXPositions[i], y, xspeed, yspeed, TRUE ); xspeed = (TitleScreen_rand(taskId, 3) % 4) - 2; yspeed = (TitleScreen_rand(taskId, 3) % 8) - 16; } tOffsetX++; if (tOffsetX > 3) tOffsetX = 0; } } } else { s16 *data = gTasks[taskId].data; s32 rval; s32 xspeed; s32 yspeed; s32 y; switch (tState) { case 0: CreateStreakSprites(); TitleScreen_srand(taskId, tOff_Seed, 30840); tState++; break; case 1: tTimer++; if (tTimer >= tDelay) { tTimer = 0; tDelay = (TitleScreen_rand(taskId, tOff_Seed) % 6) + 6; rval = TitleScreen_rand(taskId, tOff_Seed) % 30; xspeed = 16; if (rval >= 6) { xspeed = 48; if (rval < 12) xspeed = 24; } yspeed = (TitleScreen_rand(taskId, tOff_Seed) % 4) - 2; y = (TitleScreen_rand(taskId, tOff_Seed) % 88) + 32; CreateFlameOrLeafSprite(y, xspeed, yspeed, 0, FALSE); } break; } } } #undef sPosX #undef sSpeedX #undef sPosY #undef sSpeedY static void SpriteCallback_Streak(struct Sprite *sprite) { sprite->x -= 7; if (sprite->x < -16) { sprite->x = DISPLAY_WIDTH + 16; sprite->data[7]++; if (sprite->data[7] >= ARRAY_COUNT(sStreakYPositions)) sprite->data[7] = 0; sprite->y = sStreakYPositions[sprite->data[7]]; } } static void CreateStreakSprites(void) { int i; u8 spriteId; for (i = 0; i < 4; i++) { spriteId = CreateSprite(&sSpriteTemplate_Streak, DISPLAY_WIDTH + 16 + 40 * i, sStreakYPositions[i], 0xFF); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[7] = i; gSprites[spriteId].callback = SpriteCallback_Streak; } } } static void TitleScreen_srand(u8 taskId, u8 field, u16 seed) { SetWordTaskArg(taskId, field, seed); } static u16 TitleScreen_rand(u8 taskId, u8 field) { u32 rngval; rngval = GetWordTaskArg(taskId, field); rngval = ISO_RANDOMIZE1(rngval); SetWordTaskArg(taskId, field, rngval); return rngval >> 16; } static u32 CreateBlankSprite(void) { CreateSprite(&sSpriteTemplate_BlankSprite, 24, 144, 0); return IndexOfSpritePaletteTag(PAL_TAG_SLASH); } static void SetPalOnOrCreateBlankSprite(bool32 hasCreatedBlankSprite) { u32 palIdx; if (hasCreatedBlankSprite) { palIdx = IndexOfSpritePaletteTag(PAL_TAG_SLASH); if(gSaveBlock1Ptr->keyFlags.version == 0) LoadPalette(gTitleScreen_Slash_Pal_FR, OBJ_PLTT_ID(palIdx), PLTT_SIZE_4BPP); else LoadPalette(gTitleScreen_Slash_Pal_LG, OBJ_PLTT_ID(palIdx), PLTT_SIZE_4BPP); } else CreateBlankSprite(); } #define sState data[0] #define sTimer data[1] #define sDeactivate data[2] static u8 CreateSlashSprite(void) { u8 spriteId = CreateSprite(&sSlashSpriteTemplate, -32, 27, 1); if (spriteId != MAX_SPRITES) { gSprites[spriteId].callback = SpriteCallback_Slash; gSprites[spriteId].sTimer = 540; } return spriteId; } static void DeactivateSlashSprite(u8 spriteId) { if (spriteId != MAX_SPRITES) gSprites[spriteId].sDeactivate = TRUE; } static bool32 IsSlashSpriteDeactivated(u8 spriteId) { if (spriteId != MAX_SPRITES) return gSprites[spriteId].sState ^ 2 ? TRUE : FALSE; else return FALSE; } static void SpriteCallback_Slash(struct Sprite *sprite) { switch (sprite->sState) { case 0: if (sprite->sDeactivate) { sprite->invisible = TRUE; sprite->sState = 2; } sprite->sTimer--; if (sprite->sTimer == 0) { sprite->invisible = FALSE; sprite->sState = 1; } break; case 1: sprite->x += 9; if (sprite->x == 67) sprite->y -= 7; if (sprite->x == 148) sprite->y += 7; if (sprite->x > DISPLAY_WIDTH + 32) { sprite->invisible = TRUE; if (sprite->sDeactivate) sprite->sState = 2; else { sprite->x = -32; sprite->sTimer = 540; sprite->sState = 0; } } break; case 2: break; } } #undef sState #undef sTimer #undef sDeactivate ================================================ FILE: src/tm_case.c ================================================ #include "global.h" #include "tm_case.h" #include "gflib.h" #include "decompress.h" #include "graphics.h" #include "task.h" #include "text_window.h" #include "menu.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "list_menu.h" #include "item.h" #include "item_menu.h" #include "link.h" #include "money.h" #include "shop.h" #include "teachy_tv.h" #include "pokemon_storage_system.h" #include "party_menu.h" #include "data.h" #include "scanline_effect.h" #include "strings.h" #include "menu_indicators.h" #include "constants/items.h" #include "constants/songs.h" #include "constants/quest_log.h" #include "event_data.h" // Any item in the TM Case with nonzero importance is considered an HM #define IS_HM(itemId) (ItemId_GetImportance(itemId) != 0) #define TAG_SCROLL_ARROW 110 enum { WIN_LIST, WIN_DESCRIPTION, WIN_SELECTED_MSG, WIN_TITLE, WIN_MOVE_INFO_LABELS, WIN_MOVE_INFO, WIN_MESSAGE, WIN_SELL_QUANTITY, WIN_MONEY, }; // Window IDs for the context menu that opens when a TM/HM is selected enum { WIN_USE_GIVE_EXIT, WIN_GIVE_EXIT, }; extern void SetBagItemQuantity(u16 * ptr, u16 value); // IDs for the actions in the context menu enum { ACTION_USE, ACTION_GIVE, ACTION_EXIT }; enum { COLOR_LIGHT, COLOR_DARK, COLOR_CURSOR_SELECTED, COLOR_MOVE_INFO, COLOR_CURSOR_ERASE = 0xFF }; // Base position for TM/HM disc sprite #define DISC_BASE_X 41 #define DISC_BASE_Y 46 #define DISC_CASE_DISTANCE 20 // The total number of pixels a disc travels vertically in/out of the case #define DISC_Y_MOVE 10 // The number of pixels a disc travels vertically per movement step #define TAG_DISC 400 #define DISC_HIDDEN 0xFF // When no TM/HM is selected, hide the disc sprite enum { ANIM_TM, ANIM_HM, }; // The "static" resources are preserved even if the TM case is exited. This is // useful for when its left temporarily (e.g. going to the party menu to teach a TM) // but also to preserve the selected item when the TM case is fully closed. static EWRAM_DATA struct { void (* exitCallback)(void); u8 menuType; bool8 allowSelectClose; u8 unused; u16 selectedRow; u16 scrollOffset; } sTMCaseStaticResources = {}; // The "dynamic" resources will be reset any time the TM case is exited, even temporarily. static EWRAM_DATA struct { void (* nextScreenCallback)(void); u8 discSpriteId; u8 maxTMsShown; u8 numTMs; u8 contextMenuWindowId; u8 scrollArrowsTaskId; u16 currItem; const u8 * menuActionIndices; u8 numMenuActions; s16 seqId; u8 unused[8]; } * sTMCaseDynamicResources = NULL; // Save the player's bag state when the Pokedude's bag is being shown static EWRAM_DATA struct { struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT]; struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT]; u16 selectedRow; u16 scrollOffset; } * sPokedudeBagBackup = NULL; static EWRAM_DATA void *sTilemapBuffer = NULL; static EWRAM_DATA struct ListMenuItem * sListMenuItemsBuffer = NULL; static EWRAM_DATA u8 (* sListMenuStringsBuffer)[29] = NULL; static EWRAM_DATA u16 * sTMSpritePaletteBuffer = NULL; static void CB2_SetUpTMCaseUI_Blocking(void); static bool8 DoSetUpTMCaseUI(void); static void ResetBufferPointers_NoFree(void); static void LoadBGTemplates(void); static bool8 HandleLoadTMCaseGraphicsAndPalettes(void); static void CreateTMCaseListMenuBuffers(void); static void InitTMCaseListMenuItems(void); static void GetTMNumberAndMoveString(u8 * dest, u16 itemId); static void List_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); static void List_ItemPrintFunc(u8 windowId, u32 itemId, u8 y); static void PrintDescription(s32 itemIndex); static void PrintMoveInfo(u16 itemId); static void PrintListCursorAtRow(u8 y, u8 colorIdx); static void CreateListScrollArrows(void); static void TMCaseSetup_GetTMCount(void); static void TMCaseSetup_InitListMenuPositions(void); static void TMCaseSetup_UpdateVisualMenuOffset(void); static void Task_FadeOutAndCloseTMCase(u8 taskId); static void Task_HandleListInput(u8 taskId); static void Task_SelectedTMHM_Field(u8 taskId); static void Task_ContextMenu_HandleInput(u8 taskId); static void Action_Use(u8 taskId); static void Action_Give(u8 taskId); static void PrintError_ThereIsNoPokemon(u8 taskId); static void PrintError_ItemCantBeHeld(u8 taskId); static void Task_WaitButtonAfterErrorPrint(u8 taskId); static void CloseMessageAndReturnToList(u8 taskId); static void Action_Exit(u8 taskId); static void Task_SelectedTMHM_GiveParty(u8 taskId); static void Task_SelectedTMHM_GivePC(u8 taskId); static void Task_SelectedTMHM_Sell(u8 taskId); static void Task_AskConfirmSaleWithAmount(u8 taskId); static void Task_PlaceYesNoBox(u8 taskId); static void Task_SaleOfTMsCanceled(u8 taskId); static void Task_InitQuantitySelectUI(u8 taskId); static void SellTM_PrintQuantityAndSalePrice(s16 quantity, s32 value); static void Task_QuantitySelect_HandleInput(u8 taskId); static void Task_PrintSaleConfirmedText(u8 taskId); static void Task_DoSaleOfTMs(u8 taskId); static void Task_AfterSale_ReturnToList(u8 taskId); static void Task_Pokedude_Start(u8 taskId); static void Task_Pokedude_Run(u8 taskId); static void InitWindowTemplatesAndPals(void); static void TMCase_Print(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx); static void TMCase_SetWindowBorder1(u8 windowId); static void TMCase_SetWindowBorder2(u8 windowId); static void PrintMessageWithFollowupTask(u8 taskId, u8 fontId, const u8 * str, TaskFunc func); static void PrintTitle(void); static void DrawMoveInfoLabels(void); static void PlaceHMTileInWindow(u8 windowId, u8 x, u8 y); static void PrintPlayersMoney(void); static void HandleCreateYesNoMenu(u8 taskId, const struct YesNoFuncTable * ptrs); static u8 AddContextMenu(u8 * windowId, u8 windowIndex); static void RemoveContextMenu(u8 * windowId); static u8 CreateDiscSprite(u16 itemId); static void SetDiscSpriteAnim(struct Sprite *sprite, u8 tmIdx); static void TintDiscpriteByType(u8 type); static void SetDiscSpritePosition(struct Sprite *sprite, u8 tmIdx); static void SwapDisc(u8 spriteId, u16 itemId); static void SpriteCB_SwapDisc(struct Sprite *sprite); static void LoadDiscTypePalettes(void); static void ClearTMHMSlots(void); static const struct BgTemplate sBGTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 } }; // The list of functions to run when a TM/HM is selected. // What happens when one is selected depends on how the player arrived at the TM case static void (*const sSelectTMActionTasks[])(u8 taskId) = { [TMCASE_FIELD] = Task_SelectedTMHM_Field, [TMCASE_GIVE_PARTY] = Task_SelectedTMHM_GiveParty, [TMCASE_SELL] = Task_SelectedTMHM_Sell, [TMCASE_GIVE_PC] = Task_SelectedTMHM_GivePC }; static const struct MenuAction sMenuActions[] = { [ACTION_USE] = {gOtherText_Use, Action_Use }, [ACTION_EXIT] = {gOtherText_Exit, Action_Exit}, }; static const u8 sMenuActionIndices_Field[] = {ACTION_USE, ACTION_EXIT}; static const u8 sMenuActionIndices_UnionRoom[] = {ACTION_EXIT}; static const struct YesNoFuncTable sYesNoFuncTable = {Task_PrintSaleConfirmedText, Task_SaleOfTMsCanceled}; static const u8 sText_ClearTo18[] = _("{CLEAR_TO 18}"); static const u8 sText_SingleSpace[] = _(" "); static ALIGNED(4) const u16 sPal3Override[] = {RGB(8, 8, 8), RGB(30, 16, 6)}; static const u8 sTextColors[][3] = { [COLOR_LIGHT] = {0, 1, 2}, [COLOR_DARK] = {0, 2, 3}, [COLOR_CURSOR_SELECTED] = {0, 3, 6}, [COLOR_MOVE_INFO] = {0, 14, 10}, }; static const struct WindowTemplate sWindowTemplates[] = { [WIN_LIST] = { .bg = 0, .tilemapLeft = 10, .tilemapTop = 1, .width = 19, .height = 10, .paletteNum = 15, .baseBlock = 0x081 }, [WIN_DESCRIPTION] = { .bg = 0, .tilemapLeft = 12, .tilemapTop = 12, .width = 18, .height = 8, .paletteNum = 10, .baseBlock = 0x13f }, [WIN_SELECTED_MSG] = { .bg = 1, .tilemapLeft = 5, .tilemapTop = 15, .width = 15, .height = 4, .paletteNum = 13, .baseBlock = 0x1f9 }, [WIN_TITLE] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 1, .width = 10, .height = 2, .paletteNum = 15, .baseBlock = 0x235 }, [WIN_MOVE_INFO_LABELS] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 13, .width = 5, .height = 6, .paletteNum = 12, .baseBlock = 0x249 }, [WIN_MOVE_INFO] = { .bg = 0, .tilemapLeft = 7, .tilemapTop = 13, .width = 5, .height = 6, .paletteNum = 12, .baseBlock = 0x267 }, [WIN_MESSAGE] = { .bg = 1, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 11, .baseBlock = 0x285 }, [WIN_SELL_QUANTITY] = { .bg = 1, .tilemapLeft = 17, .tilemapTop = 9, .width = 12, .height = 4, .paletteNum = 15, .baseBlock = 0x2ed }, [WIN_MONEY] = { .bg = 1, .tilemapLeft = 1, .tilemapTop = 1, .width = 8, .height = 3, .paletteNum = 13, .baseBlock = 0x31d }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sYesNoWindowTemplate = { .bg = 1, .tilemapLeft = 21, .tilemapTop = 9, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x335 }; static const struct WindowTemplate sWindowTemplates_ContextMenu[] = { [WIN_USE_GIVE_EXIT] = { .bg = 1, .tilemapLeft = 22, .tilemapTop = 15, .width = 7, .height = 4, .paletteNum = 15, .baseBlock = 0x1cf }, [WIN_GIVE_EXIT] = { .bg = 1, .tilemapLeft = 22, .tilemapTop = 17, .width = 7, .height = 2, .paletteNum = 15, .baseBlock = 0x1cf }, }; static const struct OamData sTMSpriteOamData = { .size = 2, .priority = 2 }; static const union AnimCmd sAnim_TM[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; static const union AnimCmd sAnim_HM[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END }; static const union AnimCmd *const sAnims_Disc[] = { [ANIM_TM] = sAnim_TM, [ANIM_HM] = sAnim_HM }; static const struct CompressedSpriteSheet sSpriteSheet_Disc = { .data = gTMCaseDisc_Gfx, .size = 0x400, .tag = TAG_DISC }; static const struct SpriteTemplate sSpriteTemplate_Disc = { .tileTag = TAG_DISC, .paletteTag = TAG_DISC, .oam = &sTMSpriteOamData, .anims = sAnims_Disc, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const u16 sTMSpritePaletteOffsetByType[NUMBER_OF_MON_TYPES] = { [TYPE_NORMAL] = 0x000, [TYPE_FIRE] = 0x010, [TYPE_WATER] = 0x020, [TYPE_GRASS] = 0x030, [TYPE_ELECTRIC] = 0x040, [TYPE_ROCK] = 0x050, [TYPE_GROUND] = 0x060, [TYPE_ICE] = 0x070, [TYPE_FLYING] = 0x080, [TYPE_FIGHTING] = 0x090, [TYPE_GHOST] = 0x0a0, [TYPE_BUG] = 0x0b0, [TYPE_POISON] = 0x0c0, [TYPE_PSYCHIC] = 0x0d0, [TYPE_STEEL] = 0x0e0, [TYPE_DARK] = 0x0f0, [TYPE_DRAGON] = 0x100 }; void InitTMCase(u8 type, void (* exitCallback)(void), bool8 allowSelectClose) { ResetBufferPointers_NoFree(); sTMCaseDynamicResources = Alloc(sizeof(*sTMCaseDynamicResources)); sTMCaseDynamicResources->nextScreenCallback = NULL; sTMCaseDynamicResources->scrollArrowsTaskId = TASK_NONE; sTMCaseDynamicResources->contextMenuWindowId = WINDOW_NONE; if (type != TMCASE_REOPENING) sTMCaseStaticResources.menuType = type; if (exitCallback != NULL) sTMCaseStaticResources.exitCallback = exitCallback; if (allowSelectClose != TMCASE_KEEP_PREV) sTMCaseStaticResources.allowSelectClose = allowSelectClose; gTextFlags.autoScroll = FALSE; SetMainCallback2(CB2_SetUpTMCaseUI_Blocking); } static void CB2_Idle(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); DoScheduledBgTilemapCopiesToVram(); UpdatePaletteFade(); } static void VBlankCB_Idle(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB2_SetUpTMCaseUI_Blocking(void) { while (1) { if (IsActiveOverworldLinkBusy() == TRUE) break; if (DoSetUpTMCaseUI() == TRUE) break; if (MenuHelpers_IsLinkActive() == TRUE) break; } } #define tListTaskId data[0] #define tSelection data[1] #define tQuantityOwned data[2] #define tQuantitySelected data[8] #define tPokedudeState data[8] // Re-used #define tPokedudeTimer data[9] static bool8 DoSetUpTMCaseUI(void) { u8 taskId; switch (gMain.state) { case 0: SetVBlankHBlankCallbacksToNull(); ClearScheduledBgCopiesToVram(); gMain.state++; break; case 1: ScanlineEffect_Stop(); gMain.state++; break; case 2: FreeAllSpritePalettes(); gMain.state++; break; case 3: ResetPaletteFade(); gMain.state++; break; case 4: ResetSpriteData(); gMain.state++; break; case 5: ResetTasks(); gMain.state++; break; case 6: LoadBGTemplates(); sTMCaseDynamicResources->seqId = 0; gMain.state++; break; case 7: InitWindowTemplatesAndPals(); gMain.state++; break; case 8: if (HandleLoadTMCaseGraphicsAndPalettes()) gMain.state++; break; case 9: SortPocketAndPlaceHMsFirst(&gBagPockets[POCKET_TM_CASE - 1]); gMain.state++; break; case 10: TMCaseSetup_GetTMCount(); TMCaseSetup_InitListMenuPositions(); TMCaseSetup_UpdateVisualMenuOffset(); gMain.state++; break; case 11: DrawMoveInfoLabels(); gMain.state++; break; case 12: CreateTMCaseListMenuBuffers(); InitTMCaseListMenuItems(); gMain.state++; break; case 13: PrintTitle(); gMain.state++; break; case 14: if (sTMCaseStaticResources.menuType == TMCASE_POKEDUDE) taskId = CreateTask(Task_Pokedude_Start, 0); else taskId = CreateTask(Task_HandleListInput, 0); gTasks[taskId].tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sTMCaseStaticResources.scrollOffset, sTMCaseStaticResources.selectedRow); gMain.state++; break; case 15: CreateListScrollArrows(); gMain.state++; break; case 16: sTMCaseDynamicResources->discSpriteId = CreateDiscSprite(BagGetItemIdByPocketPosition(POCKET_TM_CASE, sTMCaseStaticResources.scrollOffset + sTMCaseStaticResources.selectedRow)); gMain.state++; break; case 17: BlendPalettes(PALETTES_ALL, 16, 0); gMain.state++; break; case 18: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; break; default: SetVBlankCallback(VBlankCB_Idle); SetMainCallback2(CB2_Idle); return TRUE; } return FALSE; } static void ResetBufferPointers_NoFree(void) { sTMCaseDynamicResources = NULL; sTilemapBuffer = NULL; sListMenuItemsBuffer = NULL; sListMenuStringsBuffer = NULL; sTMSpritePaletteBuffer = NULL; } static void LoadBGTemplates(void) { void ** ptr; ResetAllBgsCoordinatesAndBgCntRegs(); ptr = &sTilemapBuffer; *ptr = AllocZeroed(0x800); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBGTemplates, ARRAY_COUNT(sBGTemplates)); SetBgTilemapBuffer(2, *ptr); ScheduleBgCopyTilemapToVram(1); ScheduleBgCopyTilemapToVram(2); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); ShowBg(0); ShowBg(1); ShowBg(2); } static bool8 HandleLoadTMCaseGraphicsAndPalettes(void) { switch (sTMCaseDynamicResources->seqId) { case 0: ResetTempTileDataBuffers(); DecompressAndCopyTileDataToVram(1, gTMCase_Gfx, 0, 0, 0); sTMCaseDynamicResources->seqId++; break; case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { LZDecompressWram(gTMCaseMenu_Tilemap, sTilemapBuffer); sTMCaseDynamicResources->seqId++; } break; case 2: LZDecompressWram(gTMCase_Tilemap, GetBgTilemapBuffer(1)); sTMCaseDynamicResources->seqId++; break; case 3: if (gSaveBlock2Ptr->playerGender == MALE) LoadCompressedPalette(gTMCaseMenu_Male_Pal, BG_PLTT_ID(0), 4 * PLTT_SIZE_4BPP); else LoadCompressedPalette(gTMCaseMenu_Female_Pal, BG_PLTT_ID(0), 4 * PLTT_SIZE_4BPP); sTMCaseDynamicResources->seqId++; break; case 4: LoadCompressedSpriteSheet(&sSpriteSheet_Disc); sTMCaseDynamicResources->seqId++; break; default: LoadDiscTypePalettes(); sTMCaseDynamicResources->seqId = 0; return TRUE; } return FALSE; } static void CreateTMCaseListMenuBuffers(void) { struct BagPocket * pocket = &gBagPockets[POCKET_TM_CASE - 1]; sListMenuItemsBuffer = Alloc((pocket->capacity + 1) * sizeof(struct ListMenuItem)); sListMenuStringsBuffer = Alloc(sTMCaseDynamicResources->numTMs * 29); } static void InitTMCaseListMenuItems(void) { struct BagPocket * pocket = &gBagPockets[POCKET_TM_CASE - 1]; u32 i; for (i = 0; i < sTMCaseDynamicResources->numTMs; i++) { GetTMNumberAndMoveString(sListMenuStringsBuffer[i], pocket->itemSlots[i].itemId); sListMenuItemsBuffer[i].label = sListMenuStringsBuffer[i]; sListMenuItemsBuffer[i].index = i; } sListMenuItemsBuffer[i].label = gText_Close; sListMenuItemsBuffer[i].index = LIST_CANCEL; gMultiuseListMenuTemplate.items = sListMenuItemsBuffer; gMultiuseListMenuTemplate.totalItems = sTMCaseDynamicResources->numTMs + 1; // +1 for Cancel gMultiuseListMenuTemplate.windowId = WIN_LIST; gMultiuseListMenuTemplate.header_X = 0; gMultiuseListMenuTemplate.item_X = 8; gMultiuseListMenuTemplate.cursor_X = 0; gMultiuseListMenuTemplate.lettersSpacing = 0; gMultiuseListMenuTemplate.itemVerticalPadding = 2; gMultiuseListMenuTemplate.upText_Y = 2; gMultiuseListMenuTemplate.maxShowed = sTMCaseDynamicResources->maxTMsShown; gMultiuseListMenuTemplate.fontId = FONT_NORMAL; gMultiuseListMenuTemplate.cursorPal = 2; gMultiuseListMenuTemplate.fillValue = 0; gMultiuseListMenuTemplate.cursorShadowPal = 3; gMultiuseListMenuTemplate.moveCursorFunc = List_MoveCursorFunc; gMultiuseListMenuTemplate.itemPrintFunc = List_ItemPrintFunc; gMultiuseListMenuTemplate.cursorKind = 0; gMultiuseListMenuTemplate.scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD; } static void GetTMNumberAndMoveString(u8 * dest, u16 itemId) { StringCopy(gStringVar4, gText_FontSmall); if (itemId >= ITEM_HM01) { StringAppend(gStringVar4, sText_ClearTo18); StringAppend(gStringVar4, gText_NumberClear01); ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_HM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 1); StringAppend(gStringVar4, gStringVar1); } else { StringAppend(gStringVar4, gText_NumberClear01); ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_TM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 2); StringAppend(gStringVar4, gStringVar1); } StringAppend(gStringVar4, sText_SingleSpace); StringAppend(gStringVar4, gText_FontNormal); StringAppend(gStringVar4, gMoveNames[ItemIdToBattleMoveId(itemId)]); StringCopy(dest, gStringVar4); } static void List_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) { u16 itemId; if (itemIndex == LIST_CANCEL) itemId = ITEM_NONE; else itemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex); if (onInit != TRUE) { PlaySE(SE_SELECT); SwapDisc(sTMCaseDynamicResources->discSpriteId, itemId); } PrintDescription(itemIndex); PrintMoveInfo(itemId); } static void List_ItemPrintFunc(u8 windowId, u32 itemIndex, u8 y) { if (itemIndex != LIST_CANCEL) { if (BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex) >= ITEM_HM01) { PlaceHMTileInWindow(windowId, 8, y); } } } static void PrintDescription(s32 itemIndex) { const u8 * str; if (itemIndex != LIST_CANCEL) str = ItemId_GetDescription(BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex)); else str = gText_TMCaseWillBePutAway; FillWindowPixelBuffer(WIN_DESCRIPTION, 0); TMCase_Print(WIN_DESCRIPTION, FONT_NORMAL, str, 2, 3, 1, 0, 0, COLOR_LIGHT); } // Darkens (or subsequently lightens) the blue bg tiles around the description window when a TM/HM is selected. // shade=0: lighten, shade=1: darken static void SetDescriptionWindowShade(s32 shade) { SetBgTilemapPalette(2, 0, 12, 30, 8, 2 * shade + 1); ScheduleBgCopyTilemapToVram(2); } static void PrintListCursor(u8 listTaskId, u8 colorIdx) { PrintListCursorAtRow(ListMenuGetYCoordForPrintingArrowCursor(listTaskId), colorIdx); } static void PrintListCursorAtRow(u8 y, u8 colorIdx) { if (colorIdx == COLOR_CURSOR_ERASE) { // Never used. Would erase cursor (but also a portion of the list text) FillWindowPixelRect(WIN_LIST, 0, 0, y, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_WIDTH), GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT)); CopyWindowToVram(WIN_LIST, COPYWIN_GFX); } else { TMCase_Print(WIN_LIST, FONT_NORMAL, gText_SelectorArrow2, 0, y, 0, 0, 0, colorIdx); } } static void CreateListScrollArrows(void) { sTMCaseDynamicResources->scrollArrowsTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 160, 8, 88, sTMCaseDynamicResources->numTMs - sTMCaseDynamicResources->maxTMsShown + 1, TAG_SCROLL_ARROW, TAG_SCROLL_ARROW, &sTMCaseStaticResources.scrollOffset); } static void CreateQuantityScrollArrows(void) { sTMCaseDynamicResources->currItem = 1; sTMCaseDynamicResources->scrollArrowsTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 152, 72, 104, 2, TAG_SCROLL_ARROW, TAG_SCROLL_ARROW, &sTMCaseDynamicResources->currItem); } static void RemoveScrollArrows(void) { if (sTMCaseDynamicResources->scrollArrowsTaskId != TASK_NONE) { RemoveScrollIndicatorArrowPair(sTMCaseDynamicResources->scrollArrowsTaskId); sTMCaseDynamicResources->scrollArrowsTaskId = TASK_NONE; } } void ResetTMCaseCursorPos(void) { sTMCaseStaticResources.selectedRow = 0; sTMCaseStaticResources.scrollOffset = 0; } static void TMCaseSetup_GetTMCount(void) { struct BagPocket * pocket = &gBagPockets[POCKET_TM_CASE - 1]; u32 i; BagPocketCompaction(pocket->itemSlots, pocket->capacity); sTMCaseDynamicResources->numTMs = 0; for (i = 0; i < pocket->capacity; i++) { if (pocket->itemSlots[i].itemId == ITEM_NONE) break; sTMCaseDynamicResources->numTMs++; } sTMCaseDynamicResources->maxTMsShown = min(sTMCaseDynamicResources->numTMs + 1, 5); } static void TMCaseSetup_InitListMenuPositions(void) { if (sTMCaseStaticResources.scrollOffset != 0) { if (sTMCaseStaticResources.scrollOffset + sTMCaseDynamicResources->maxTMsShown > sTMCaseDynamicResources->numTMs + 1) sTMCaseStaticResources.scrollOffset = sTMCaseDynamicResources->numTMs + 1 - sTMCaseDynamicResources->maxTMsShown; } if (sTMCaseStaticResources.scrollOffset + sTMCaseStaticResources.selectedRow >= sTMCaseDynamicResources->numTMs + 1) { if (sTMCaseDynamicResources->numTMs + 1 < 2) sTMCaseStaticResources.selectedRow = 0; else sTMCaseStaticResources.selectedRow = sTMCaseDynamicResources->numTMs; } } static void TMCaseSetup_UpdateVisualMenuOffset(void) { u32 i; if (sTMCaseStaticResources.selectedRow > 3) { for (i = 0; i <= sTMCaseStaticResources.selectedRow - 3 && sTMCaseStaticResources.scrollOffset + sTMCaseDynamicResources->maxTMsShown != sTMCaseDynamicResources->numTMs + 1; i++) { do {} while (0); sTMCaseStaticResources.selectedRow--; sTMCaseStaticResources.scrollOffset++; } } } static void DestroyTMCaseBuffers(void) { if (sTMCaseDynamicResources != NULL) Free(sTMCaseDynamicResources); if (sTilemapBuffer != NULL) Free(sTilemapBuffer); if (sListMenuItemsBuffer != NULL) Free(sListMenuItemsBuffer); if (sListMenuStringsBuffer != NULL) Free(sListMenuStringsBuffer); if (sTMSpritePaletteBuffer != NULL) Free(sTMSpritePaletteBuffer); FreeAllWindowBuffers(); } static void Task_BeginFadeOutFromTMCase(u8 taskId) { BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_FadeOutAndCloseTMCase; } static void Task_FadeOutAndCloseTMCase(u8 taskId) { s16 * data = gTasks[taskId].data; if (!gPaletteFade.active) { DestroyListMenuTask(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); if (sTMCaseDynamicResources->nextScreenCallback != NULL) SetMainCallback2(sTMCaseDynamicResources->nextScreenCallback); else SetMainCallback2(sTMCaseStaticResources.exitCallback); RemoveScrollArrows(); DestroyTMCaseBuffers(); DestroyTask(taskId); } } static void Task_HandleListInput(u8 taskId) { s16 * data = gTasks[taskId].data; s32 input; if (!gPaletteFade.active) { if (IsActiveOverworldLinkBusy() != TRUE) { input = ListMenu_ProcessInput(tListTaskId); ListMenuGetScrollAndRow(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); if (JOY_NEW(SELECT_BUTTON) && sTMCaseStaticResources.allowSelectClose == TRUE) { PlaySE(SE_SELECT); gSpecialVar_ItemId = ITEM_NONE; Task_BeginFadeOutFromTMCase(taskId); } else { switch (input) { case LIST_NOTHING_CHOSEN: break; case LIST_CANCEL: PlaySE(SE_SELECT); gSpecialVar_ItemId = ITEM_NONE; Task_BeginFadeOutFromTMCase(taskId); break; default: PlaySE(SE_SELECT); SetDescriptionWindowShade(1); RemoveScrollArrows(); PrintListCursor(tListTaskId, COLOR_CURSOR_SELECTED); tSelection = input; tQuantityOwned = BagGetQuantityByPocketPosition(POCKET_TM_CASE, input); gSpecialVar_ItemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, input); gTasks[taskId].func = sSelectTMActionTasks[sTMCaseStaticResources.menuType]; break; } } } } } static void ReturnToList(u8 taskId) { SetDescriptionWindowShade(0); CreateListScrollArrows(); gTasks[taskId].func = Task_HandleListInput; } // When a TM/HM in the list is selected in the field, create a context // menu with a list of actions that can be taken. static void Task_SelectedTMHM_Field(u8 taskId) { u8 * strbuf; // Create context window TMCase_SetWindowBorder2(WIN_SELECTED_MSG); if (!MenuHelpers_IsLinkActive() && InUnionRoom() != TRUE) { // Regular TM/HM context menu AddContextMenu(&sTMCaseDynamicResources->contextMenuWindowId, WIN_USE_GIVE_EXIT); sTMCaseDynamicResources->menuActionIndices = sMenuActionIndices_Field; sTMCaseDynamicResources->numMenuActions = ARRAY_COUNT(sMenuActionIndices_Field); } else { // In Union Room, "Use" is removed from the context menu AddContextMenu(&sTMCaseDynamicResources->contextMenuWindowId, WIN_GIVE_EXIT); sTMCaseDynamicResources->menuActionIndices = sMenuActionIndices_UnionRoom; sTMCaseDynamicResources->numMenuActions = ARRAY_COUNT(sMenuActionIndices_UnionRoom); } // Print context window actions AddItemMenuActionTextPrinters(sTMCaseDynamicResources->contextMenuWindowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, 0, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sTMCaseDynamicResources->numMenuActions, sMenuActions, sTMCaseDynamicResources->menuActionIndices); Menu_InitCursor(sTMCaseDynamicResources->contextMenuWindowId, FONT_NORMAL, 0, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sTMCaseDynamicResources->numMenuActions, 0); // Print label text next to the context window strbuf = Alloc(256); GetTMNumberAndMoveString(strbuf, gSpecialVar_ItemId); StringAppend(strbuf, gText_Var1IsSelected + 2); // +2 skips over the stringvar TMCase_Print(WIN_SELECTED_MSG, FONT_NORMAL, strbuf, 0, 2, 1, 0, 0, COLOR_DARK); Free(strbuf); if (IS_HM(gSpecialVar_ItemId) && gSpecialVar_ItemId > ITEM_TM50) { PlaceHMTileInWindow(WIN_SELECTED_MSG, 0, 2); CopyWindowToVram(WIN_SELECTED_MSG, COPYWIN_GFX); } ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); gTasks[taskId].func = Task_ContextMenu_HandleInput; } static void Task_ContextMenu_HandleInput(u8 taskId) { s8 input; if (IsActiveOverworldLinkBusy() != TRUE) { input = Menu_ProcessInputNoWrapAround(); switch (input) { case MENU_B_PRESSED: // Run last action in list (Exit) PlaySE(SE_SELECT); sMenuActions[sTMCaseDynamicResources->menuActionIndices[sTMCaseDynamicResources->numMenuActions - 1]].func.void_u8(taskId); break; case MENU_NOTHING_CHOSEN: break; default: PlaySE(SE_SELECT); sMenuActions[sTMCaseDynamicResources->menuActionIndices[input]].func.void_u8(taskId); break; } } } static void Action_Use(u8 taskId) { RemoveContextMenu(&sTMCaseDynamicResources->contextMenuWindowId); ClearStdWindowAndFrameToTransparent(WIN_SELECTED_MSG, FALSE); ClearWindowTilemap(WIN_SELECTED_MSG); PutWindowTilemap(WIN_LIST); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); if (CalculatePlayerPartyCount() == 0) { PrintError_ThereIsNoPokemon(taskId); } else { // Chose a TM/HM to use, exit TM case for party menu gItemUseCB = ItemUseCB_TMHM; sTMCaseDynamicResources->nextScreenCallback = CB2_ShowPartyMenuForItemUse; Task_BeginFadeOutFromTMCase(taskId); } } static void Action_Give(u8 taskId) { s16 * data = gTasks[taskId].data; u16 itemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection); RemoveContextMenu(&sTMCaseDynamicResources->contextMenuWindowId); ClearStdWindowAndFrameToTransparent(WIN_SELECTED_MSG, FALSE); ClearWindowTilemap(WIN_SELECTED_MSG); PutWindowTilemap(WIN_DESCRIPTION); PutWindowTilemap(WIN_MOVE_INFO_LABELS); PutWindowTilemap(WIN_MOVE_INFO); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); if (!IS_HM(itemId)) { if (CalculatePlayerPartyCount() == 0) { PrintError_ThereIsNoPokemon(taskId); } else { sTMCaseDynamicResources->nextScreenCallback = CB2_ChooseMonToGiveItem; Task_BeginFadeOutFromTMCase(taskId); } } else { PrintError_ItemCantBeHeld(taskId); } } static void PrintError_ThereIsNoPokemon(u8 taskId) { PrintMessageWithFollowupTask(taskId, FONT_NORMAL, gText_ThereIsNoPokemon, Task_WaitButtonAfterErrorPrint); } static void PrintError_ItemCantBeHeld(u8 taskId) { CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_ItemCantBeHeld); PrintMessageWithFollowupTask(taskId, FONT_NORMAL, gStringVar4, Task_WaitButtonAfterErrorPrint); } static void Task_WaitButtonAfterErrorPrint(u8 taskId) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); CloseMessageAndReturnToList(taskId); } } static void CloseMessageAndReturnToList(u8 taskId) { s16 * data = gTasks[taskId].data; DestroyListMenuTask(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sTMCaseStaticResources.scrollOffset, sTMCaseStaticResources.selectedRow); PrintListCursor(tListTaskId, COLOR_DARK); ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE); ClearWindowTilemap(WIN_MESSAGE); PutWindowTilemap(WIN_DESCRIPTION); PutWindowTilemap(WIN_MOVE_INFO_LABELS); PutWindowTilemap(WIN_MOVE_INFO); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); ReturnToList(taskId); } static void Action_Exit(u8 taskId) { s16 * data = gTasks[taskId].data; RemoveContextMenu(&sTMCaseDynamicResources->contextMenuWindowId); ClearStdWindowAndFrameToTransparent(WIN_SELECTED_MSG, FALSE); ClearWindowTilemap(WIN_SELECTED_MSG); PutWindowTilemap(WIN_LIST); PrintListCursor(tListTaskId, COLOR_DARK); PutWindowTilemap(WIN_DESCRIPTION); PutWindowTilemap(WIN_MOVE_INFO_LABELS); PutWindowTilemap(WIN_MOVE_INFO); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); ReturnToList(taskId); } static void Task_SelectedTMHM_GiveParty(u8 taskId) { s16 * data = gTasks[taskId].data; if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) { sTMCaseDynamicResources->nextScreenCallback = CB2_GiveHoldItem; Task_BeginFadeOutFromTMCase(taskId); } else { // Can't hold "important" items (e.g. key items) PrintError_ItemCantBeHeld(taskId); } } static void Task_SelectedTMHM_GivePC(u8 taskId) { s16 * data = gTasks[taskId].data; if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) { sTMCaseDynamicResources->nextScreenCallback = CB2_ReturnToPokeStorage; Task_BeginFadeOutFromTMCase(taskId); } else { // Can't hold "important" items (e.g. key items) PrintError_ItemCantBeHeld(taskId); } } static void Task_SelectedTMHM_Sell(u8 taskId) { s16 * data = gTasks[taskId].data; if ((ItemId_GetPrice(gSpecialVar_ItemId) == 0) || ItemId_GetPocket(gSpecialVar_ItemId) == POCKET_TM_CASE) { // Can't sell TM/HMs with no price (by default this is just the HMs) CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat); PrintMessageWithFollowupTask(taskId, GetDialogBoxFontId(), gStringVar4, CloseMessageAndReturnToList); } else { tQuantitySelected = 1; if (tQuantityOwned == 1) { PrintPlayersMoney(); Task_AskConfirmSaleWithAmount(taskId); } else { if (tQuantityOwned > 99) tQuantityOwned = 99; CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell); PrintMessageWithFollowupTask(taskId, GetDialogBoxFontId(), gStringVar4, Task_InitQuantitySelectUI); } } } static void Task_AskConfirmSaleWithAmount(u8 taskId) { s16 * data = gTasks[taskId].data; ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)) / 2 * tQuantitySelected, STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay); PrintMessageWithFollowupTask(taskId, GetDialogBoxFontId(), gStringVar4, Task_PlaceYesNoBox); } static void Task_PlaceYesNoBox(u8 taskId) { HandleCreateYesNoMenu(taskId, &sYesNoFuncTable); } static void Task_SaleOfTMsCanceled(u8 taskId) { s16 * data = gTasks[taskId].data; ClearStdWindowAndFrameToTransparent(WIN_MONEY, FALSE); ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE); PutWindowTilemap(WIN_LIST); PutWindowTilemap(WIN_DESCRIPTION); PutWindowTilemap(WIN_TITLE); PutWindowTilemap(WIN_MOVE_INFO_LABELS); PutWindowTilemap(WIN_MOVE_INFO); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); PrintListCursor(tListTaskId, COLOR_DARK); ReturnToList(taskId); } static void Task_InitQuantitySelectUI(u8 taskId) { s16 * data = gTasks[taskId].data; TMCase_SetWindowBorder1(WIN_SELL_QUANTITY); ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); TMCase_Print(WIN_SELL_QUANTITY, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, COLOR_DARK); SellTM_PrintQuantityAndSalePrice(1, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)) / 2 * tQuantitySelected); PrintPlayersMoney(); CreateQuantityScrollArrows(); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); gTasks[taskId].func = Task_QuantitySelect_HandleInput; } static void SellTM_PrintQuantityAndSalePrice(s16 quantity, s32 amount) { FillWindowPixelBuffer(WIN_SELL_QUANTITY, 0x11); ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); TMCase_Print(WIN_SELL_QUANTITY, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, COLOR_DARK); PrintMoneyAmount(WIN_SELL_QUANTITY, 0x38, 0x0A, amount, 0); } static void Task_QuantitySelect_HandleInput(u8 taskId) { s16 * data = gTasks[taskId].data; if (AdjustQuantityAccordingToDPadInput(&tQuantitySelected, tQuantityOwned) == 1) { SellTM_PrintQuantityAndSalePrice(tQuantitySelected, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)) / 2 * tQuantitySelected); } else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); ClearStdWindowAndFrameToTransparent(WIN_SELL_QUANTITY, FALSE); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); RemoveScrollArrows(); Task_AskConfirmSaleWithAmount(taskId); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); ClearStdWindowAndFrameToTransparent(WIN_SELL_QUANTITY, FALSE); ClearStdWindowAndFrameToTransparent(WIN_MONEY, FALSE); ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE); PutWindowTilemap(WIN_TITLE); PutWindowTilemap(WIN_LIST); PutWindowTilemap(WIN_DESCRIPTION); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); RemoveScrollArrows(); PrintListCursor(tListTaskId, COLOR_DARK); ReturnToList(taskId); } } static void Task_PrintSaleConfirmedText(u8 taskId) { s16 * data = gTasks[taskId].data; PutWindowTilemap(WIN_LIST); ScheduleBgCopyTilemapToVram(0); CopyItemName(gSpecialVar_ItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)) / 2 * tQuantitySelected, STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen); PrintMessageWithFollowupTask(taskId, FONT_NORMAL, gStringVar4, Task_DoSaleOfTMs); } static void Task_DoSaleOfTMs(u8 taskId) { s16 * data = gTasks[taskId].data; PlaySE(SE_SHOP); RemoveBagItem(gSpecialVar_ItemId, tQuantitySelected); AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * tQuantitySelected); RecordItemTransaction(gSpecialVar_ItemId, tQuantitySelected, QL_EVENT_SOLD_ITEM - QL_EVENT_USED_POKEMART); DestroyListMenuTask(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); TMCaseSetup_GetTMCount(); TMCaseSetup_InitListMenuPositions(); InitTMCaseListMenuItems(); tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sTMCaseStaticResources.scrollOffset, sTMCaseStaticResources.selectedRow); PrintListCursor(tListTaskId, COLOR_CURSOR_SELECTED); PrintMoneyAmountInMoneyBox(WIN_MONEY, GetMoney(&gSaveBlock1Ptr->money), 0); gTasks[taskId].func = Task_AfterSale_ReturnToList; } static void Task_AfterSale_ReturnToList(u8 taskId) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); ClearStdWindowAndFrameToTransparent(WIN_MONEY, FALSE); ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE); PutWindowTilemap(WIN_DESCRIPTION); PutWindowTilemap(WIN_TITLE); PutWindowTilemap(WIN_MOVE_INFO_LABELS); PutWindowTilemap(WIN_MOVE_INFO); CloseMessageAndReturnToList(taskId); } } static void ClearTMHMSlots(void) { u32 i; for (i = 0; i < BAG_TMHM_COUNT; i++) { gTmHmItemSlots[i].itemId = 0; SetBagItemQuantity(&(gTmHmItemSlots[i].quantity), 0); } } void Pokedude_InitTMCase(void) { FlagSet(FLAG_DONT_ADD_TMS); sPokedudeBagBackup = AllocZeroed(sizeof(*sPokedudeBagBackup)); memcpy(sPokedudeBagBackup->bagPocket_TMHM, gTmHmItemSlots, sizeof(gTmHmItemSlots)); memcpy(sPokedudeBagBackup->bagPocket_KeyItems, gKeyItemSlots, sizeof(gKeyItemSlots)); sPokedudeBagBackup->selectedRow = sTMCaseStaticResources.selectedRow; sPokedudeBagBackup->scrollOffset = sTMCaseStaticResources.scrollOffset; ClearTMHMSlots(); ClearItemSlots(gKeyItemSlots, BAG_KEYITEMS_COUNT); ResetTMCaseCursorPos(); AddBagItem(ITEM_TM01, 1); AddBagItem(ITEM_TM03, 1); AddBagItem(ITEM_TM09, 1); AddBagItem(ITEM_TM35, 1); FlagClear(FLAG_DONT_ADD_TMS); InitTMCase(TMCASE_POKEDUDE, CB2_ReturnToTeachyTV, 0); } static void Task_Pokedude_Start(u8 taskId) { s16 * data = gTasks[taskId].data; if (!gPaletteFade.active) { tPokedudeState = 0; tPokedudeTimer = 0; gTasks[taskId].func = Task_Pokedude_Run; } } #define POKEDUDE_INPUT_DELAY 101 static void Task_Pokedude_Run(u8 taskId) { s16 * data = gTasks[taskId].data; if (JOY_NEW(B_BUTTON)) { if (tPokedudeState < 21) { tPokedudeState = 21; SetTeachyTvControllerModeToResume(); } } switch (tPokedudeState) { case 0: BeginNormalPaletteFade(0xFFFF8405, 4, 0, 6, 0); SetDescriptionWindowShade(1); tPokedudeState++; break; case 1: case 11: if (!gPaletteFade.active) { if (++tPokedudeTimer > POKEDUDE_INPUT_DELAY) { tPokedudeTimer = 0; tPokedudeState++; } } break; case 2: case 3: case 4: case 12: case 13: case 14: if (tPokedudeTimer == 0) { gMain.newKeys = 0; gMain.newAndRepeatedKeys = DPAD_DOWN; ListMenu_ProcessInput(tListTaskId); } if (++tPokedudeTimer > POKEDUDE_INPUT_DELAY) { tPokedudeTimer = 0; tPokedudeState++; } break; case 5: case 6: case 7: case 15: case 16: case 17: if (tPokedudeTimer == 0) { gMain.newKeys = 0; gMain.newAndRepeatedKeys = DPAD_UP; ListMenu_ProcessInput(tListTaskId); } if (++tPokedudeTimer > POKEDUDE_INPUT_DELAY) { tPokedudeTimer = 0; tPokedudeState++; } break; case 8: SetDescriptionWindowShade(1); PrintMessageWithFollowupTask(taskId, FONT_MALE, gPokedudeText_TMTypes, NULL); gTasks[taskId].func = Task_Pokedude_Run; tPokedudeState++; break; case 9: case 19: RunTextPrinters(); if (!IsTextPrinterActive(WIN_MESSAGE)) tPokedudeState++; break; case 10: if (JOY_NEW(A_BUTTON | B_BUTTON)) { SetDescriptionWindowShade(0); BeginNormalPaletteFade(0x00000400, 0, 6, 0, 0); ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE); ScheduleBgCopyTilemapToVram(1); tPokedudeState++; } break; case 18: SetDescriptionWindowShade(1); PrintMessageWithFollowupTask(taskId, FONT_MALE, gPokedudeText_ReadTMDescription, NULL); gTasks[taskId].func = Task_Pokedude_Run; // this function tPokedudeState++; break; case 20: if (JOY_NEW(A_BUTTON | B_BUTTON)) tPokedudeState++; break; case 21: if (!gPaletteFade.active) { // Restore the player's bag memcpy(gTmHmItemSlots, sPokedudeBagBackup->bagPocket_TMHM, sizeof(gTmHmItemSlots)); memcpy(gKeyItemSlots, sPokedudeBagBackup->bagPocket_KeyItems, sizeof(gKeyItemSlots)); DestroyListMenuTask(tListTaskId, NULL, NULL); sTMCaseStaticResources.selectedRow = sPokedudeBagBackup->selectedRow; sTMCaseStaticResources.scrollOffset = sPokedudeBagBackup->scrollOffset; Free(sPokedudeBagBackup); CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); CB2_SetUpReshowBattleScreenAfterMenu(); BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, 0); tPokedudeState++; } break; default: if (!gPaletteFade.active) { SetMainCallback2(sTMCaseStaticResources.exitCallback); RemoveScrollArrows(); DestroyTMCaseBuffers(); DestroyTask(taskId); } break; } } static void InitWindowTemplatesAndPals(void) { u32 i; InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); LoadUserWindowGfx(0, 0x5B, BG_PLTT_ID(14)); LoadMenuMessageWindowGfx(0, 0x64, BG_PLTT_ID(11)); LoadStdWindowGfx(0, 0x78, BG_PLTT_ID(13)); LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZE_4BPP); LoadPalette(gStandardMenuPalette, BG_PLTT_ID(10), PLTT_SIZE_4BPP); LoadPalette(sPal3Override, BG_PLTT_ID(15) + 6, sizeof(sPal3Override)); LoadPalette(sPal3Override, BG_PLTT_ID(13) + 6, sizeof(sPal3Override)); ListMenuLoadStdPalAt(BG_PLTT_ID(12), 1); for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++) FillWindowPixelBuffer(i, 0x00); PutWindowTilemap(WIN_LIST); PutWindowTilemap(WIN_DESCRIPTION); PutWindowTilemap(WIN_TITLE); PutWindowTilemap(WIN_MOVE_INFO_LABELS); PutWindowTilemap(WIN_MOVE_INFO); ScheduleBgCopyTilemapToVram(0); } static void TMCase_Print(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx) { AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str); } static void TMCase_SetWindowBorder1(u8 windowId) { DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x5B, 14); } static void TMCase_SetWindowBorder2(u8 windowId) { DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x78, 13); } static void PrintMessageWithFollowupTask(u8 taskId, u8 fontId, const u8 * str, TaskFunc func) { DisplayMessageAndContinueTask(taskId, WIN_MESSAGE, 0x64, 0x0B, fontId, GetTextSpeedSetting(), str, func); ScheduleBgCopyTilemapToVram(1); } static void PrintTitle(void) { u32 distance = 72 - GetStringWidth(FONT_NORMAL_COPY_1, gText_TMCase, 0); AddTextPrinterParameterized3(WIN_TITLE, FONT_NORMAL_COPY_1, distance / 2, 1, sTextColors[COLOR_LIGHT], 0, gText_TMCase); } static void DrawMoveInfoLabels(void) { BlitMenuInfoIcon(WIN_MOVE_INFO_LABELS, MENU_INFO_ICON_TYPE, 0, 0); BlitMenuInfoIcon(WIN_MOVE_INFO_LABELS, MENU_INFO_ICON_POWER, 0, 12); BlitMenuInfoIcon(WIN_MOVE_INFO_LABELS, MENU_INFO_ICON_ACCURACY, 0, 24); BlitMenuInfoIcon(WIN_MOVE_INFO_LABELS, MENU_INFO_ICON_PP, 0, 36); CopyWindowToVram(WIN_MOVE_INFO_LABELS, COPYWIN_GFX); } static void PrintMoveInfo(u16 itemId) { u32 i; u16 move; const u8 * str; FillWindowPixelRect(WIN_MOVE_INFO, 0, 0, 0, 40, 48); if (itemId == ITEM_NONE) { for (i = 0; i < 4; i++) TMCase_Print(WIN_MOVE_INFO, FONT_NORMAL_COPY_2, gText_ThreeHyphens, 7, 12 * i, 0, 0, TEXT_SKIP_DRAW, COLOR_MOVE_INFO); CopyWindowToVram(WIN_MOVE_INFO, COPYWIN_GFX); } else { // Draw type icon move = ItemIdToBattleMoveId(itemId); BlitMenuInfoIcon(WIN_MOVE_INFO, gBattleMoves[move].type + 1, 0, 0); // Print power if (gBattleMoves[move].power < 2) str = gText_ThreeHyphens; else { ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].power, STR_CONV_MODE_RIGHT_ALIGN, 3); str = gStringVar1; } TMCase_Print(WIN_MOVE_INFO, FONT_NORMAL_COPY_2, str, 7, 12, 0, 0, TEXT_SKIP_DRAW, COLOR_MOVE_INFO); // Print accuracy if (gBattleMoves[move].accuracy == 0) str = gText_ThreeHyphens; else { ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); str = gStringVar1; } TMCase_Print(WIN_MOVE_INFO, FONT_NORMAL_COPY_2, str, 7, 24, 0, 0, TEXT_SKIP_DRAW, COLOR_MOVE_INFO); // Print PP ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].pp, STR_CONV_MODE_RIGHT_ALIGN, 3); TMCase_Print(WIN_MOVE_INFO, FONT_NORMAL_COPY_2, gStringVar1, 7, 36, 0, 0, TEXT_SKIP_DRAW, COLOR_MOVE_INFO); CopyWindowToVram(WIN_MOVE_INFO, COPYWIN_GFX); } } static void PlaceHMTileInWindow(u8 windowId, u8 x, u8 y) { BlitBitmapToWindow(windowId, gTMCaseHM_Gfx, x, y, 16, 12); } static void PrintPlayersMoney(void) { PrintMoneyAmountInMoneyBoxWithBorder(WIN_MONEY, 120, 13, GetMoney(&gSaveBlock1Ptr->money)); } static void HandleCreateYesNoMenu(u8 taskId, const struct YesNoFuncTable *ptrs) { CreateYesNoMenuWithCallbacks(taskId, &sYesNoWindowTemplate, FONT_NORMAL, 0, 2, 91, 14, ptrs); } static u8 AddContextMenu(u8 * windowId, u8 windowIndex) { if (*windowId == WINDOW_NONE) { *windowId = AddWindow(&sWindowTemplates_ContextMenu[windowIndex]); TMCase_SetWindowBorder1(*windowId); ScheduleBgCopyTilemapToVram(0); } return *windowId; } static void RemoveContextMenu(u8 * windowId) { ClearStdWindowAndFrameToTransparent(*windowId, FALSE); ClearWindowTilemap(*windowId); RemoveWindow(*windowId); ScheduleBgCopyTilemapToVram(0); *windowId = WINDOW_NONE; } static u8 CreateDiscSprite(u16 itemId) { u8 spriteId = CreateSprite(&sSpriteTemplate_Disc, DISC_BASE_X, DISC_BASE_Y, 0); u8 tmIdx; if (itemId == ITEM_NONE) { SetDiscSpritePosition(&gSprites[spriteId], DISC_HIDDEN); return spriteId; } else { tmIdx = itemId - ITEM_TM01; SetDiscSpriteAnim(&gSprites[spriteId], tmIdx); TintDiscpriteByType(gBattleMoves[ItemIdToBattleMoveId(itemId)].type); SetDiscSpritePosition(&gSprites[spriteId], tmIdx); return spriteId; } } static void SetDiscSpriteAnim(struct Sprite *sprite, u8 tmIdx) { if (tmIdx >= NUM_TECHNICAL_MACHINES) StartSpriteAnim(sprite, ANIM_HM); else StartSpriteAnim(sprite, ANIM_TM); } static void TintDiscpriteByType(u8 type) { u8 palOffset = PLTT_ID(IndexOfSpritePaletteTag(TAG_DISC)); LoadPalette(sTMSpritePaletteBuffer + sTMSpritePaletteOffsetByType[type], OBJ_PLTT_OFFSET + palOffset, PLTT_SIZE_4BPP); if (sTMCaseStaticResources.menuType == TMCASE_POKEDUDE) BlendPalettes(1 << (16 + palOffset), 4, RGB_BLACK); } static void SetDiscSpritePosition(struct Sprite *sprite, u8 tmIdx) { s32 x, y; if (tmIdx == DISC_HIDDEN) { x = 27; y = 54; sprite->y2 = DISC_CASE_DISTANCE; } else { if (tmIdx >= NUM_TECHNICAL_MACHINES) tmIdx -= NUM_TECHNICAL_MACHINES; else tmIdx += NUM_HIDDEN_MACHINES; x = DISC_BASE_X - Q_24_8_TO_INT(Q_24_8(14 * tmIdx) / (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES)); y = DISC_BASE_Y + Q_24_8_TO_INT(Q_24_8(8 * tmIdx) / (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES)); } sprite->x = x; sprite->y = y; } #define sItemId data[0] #define sState data[1] static void SwapDisc(u8 spriteId, u16 itemId) { gSprites[spriteId].sItemId = itemId; gSprites[spriteId].sState = 0; gSprites[spriteId].callback = SpriteCB_SwapDisc; } static void SpriteCB_SwapDisc(struct Sprite *sprite) { switch (sprite->sState) { case 0: // Lower old disc back into case if (sprite->y2 >= DISC_CASE_DISTANCE) { // Old disc is hidden, set up new disc if (sprite->sItemId != ITEM_NONE) { sprite->sState++; TintDiscpriteByType(gBattleMoves[ItemIdToBattleMoveId(sprite->sItemId)].type); sprite->sItemId -= ITEM_TM01; SetDiscSpriteAnim(sprite, sprite->sItemId); SetDiscSpritePosition(sprite, sprite->sItemId); } else sprite->callback = SpriteCallbackDummy; } else { sprite->y2 += DISC_Y_MOVE; } break; case 1: // Raise new disc out of case if (sprite->y2 <= 0) sprite->callback = SpriteCallbackDummy; else sprite->y2 -= DISC_Y_MOVE; } } // - 1 excludes TYPE_MYSTERY #define NUM_DISC_COLORS ((NUMBER_OF_MON_TYPES - 1) * 16) static void LoadDiscTypePalettes(void) { struct SpritePalette spritePalette; sTMSpritePaletteBuffer = Alloc(NUM_DISC_COLORS * sizeof(u16)); LZDecompressWram(gTMCaseDiscTypes1_Pal, sTMSpritePaletteBuffer); // Decompress the first 16 LZDecompressWram(gTMCaseDiscTypes2_Pal, sTMSpritePaletteBuffer + 0x100); // Decompress the rest (Only 17 total, this is just Dragon type) spritePalette.data = sTMSpritePaletteBuffer + NUM_DISC_COLORS; spritePalette.tag = TAG_DISC; LoadSpritePalette(&spritePalette); } ================================================ FILE: src/trade.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "decompress.h" #include "text_window.h" #include "pokemon_icon.h" #include "graphics.h" #include "link.h" #include "link_rfu.h" #include "cable_club.h" #include "data.h" #include "strings.h" #include "menu.h" #include "overworld.h" #include "battle_anim.h" #include "party_menu.h" #include "daycare.h" #include "event_data.h" #include "battle_interface.h" #include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" #include "new_menu_helpers.h" #include "trade_scene.h" #include "constants/songs.h" #include "constants/moves.h" #include "constants/trade.h" // IDs for CallTradeMenuFunc enum { CB_MAIN_MENU, CB_SELECTED_MON, CB_SHOW_MON_SUMMARY, CB_CONFIRM_TRADE_PROMPT, CB_CANCEL_TRADE_PROMPT, CB_READY_WAIT, // Equivalent to CB_IDLE CB_SET_SELECTED_MONS, CB_PRINT_IS_THIS_OKAY, CB_HANDLE_TRADE_CANCELED, CB_FADE_TO_START_TRADE, CB_WAIT_TO_START_TRADE, CB_INIT_EXIT_CANCELED_TRADE, CB_EXIT_CANCELED_TRADE, CB_START_LINK_TRADE, CB_INIT_CONFIRM_TRADE_PROMPT, CB_UNUSED_CLOSE_MSG, CB_WAIT_TO_START_RFU_TRADE, CB_IDLE = 100, }; // Indexes for sActionTexts enum { TEXT_CANCEL, TEXT_CHOOSE_MON, TEXT_SUMMARY, TEXT_TRADE, TEXT_CANCEL_TRADE, TEXT_PRESS_B_TO_EXIT, }; // Indexes for sMessages enum { MSG_STANDBY, MSG_CANCELED, MSG_ONLY_MON1, MSG_ONLY_MON2, MSG_WAITING_FOR_FRIEND, MSG_FRIEND_WANTS_TO_TRADE, MSG_MON_CANT_BE_TRADED, MSG_EGG_CANT_BE_TRADED, MSG_FRIENDS_MON_CANT_BE_TRADED, }; // IDs for QueueAction enum { QUEUE_SEND_DATA, QUEUE_STANDBY, QUEUE_ONLY_MON1, QUEUE_ONLY_MON2, QUEUE_UNUSED1, // Presumably intended for MSG_WAITING_FOR_FRIEND QUEUE_UNUSED2, // Presumably intended for MSG_FRIEND_WANTS_TO_TRADE QUEUE_MON_CANT_BE_TRADED, QUEUE_EGG_CANT_BE_TRADED, QUEUE_FRIENDS_MON_CANT_BE_TRADED, }; #define QUEUE_DELAY_MSG 3 #define QUEUE_DELAY_DATA 5 #define GFXTAG_MENU_TEXT 200 // Used as a base tag in CB2_CreateTradeMenu and CB2_ReturnToTradeMenuFromSummary #define GFXTAG_CURSOR 300 #define GFXTAG_LINK_MON_GLOW 5550 #define GFXTAG_LINK_MON_SHADOW 5552 #define GFXTAG_CABLE_END 5554 #define GFXTAG_GBA_SCREEN 5556 #define GFXTAG_POKEBALL 5557 #define PALTAG_CURSOR 2345 #define PALTAG_MENU_TEXT 4925 #define PALTAG_LINK_MON 5551 #define PALTAG_GBA 5555 #define PALTAG_POKEBALL 5558 // The following tags are offsets from GFXTAG_MENU_TEXT // They're looped over in CB2_CreateTradeMenu and CB2_ReturnToTradeMenuFromSummary // and used as indexes into sMenuTextTileBuffers enum { GFXTAG_PLAYER_NAME_L, GFXTAG_PLAYER_NAME_M, GFXTAG_PLAYER_NAME_R, GFXTAG_PARTNER_NAME_L, GFXTAG_PARTNER_NAME_M, GFXTAG_PARTNER_NAME_R, GFXTAG_CANCEL_L, GFXTAG_CANCEL_R, GFXTAG_CHOOSE_PKMN_L, GFXTAG_CHOOSE_PKMN_M, GFXTAG_CHOOSE_PKMN_R, GFXTAG_CHOOSE_PKMN_EMPTY_1, // 6 sprites to cover the full bottom bar, but only first 3 are needed GFXTAG_CHOOSE_PKMN_EMPTY_2, GFXTAG_CHOOSE_PKMN_EMPTY_3, NUM_MENU_TEXT_SPRITES }; #define NUM_PLAYER_NAME_SPRITES (1 + GFXTAG_PLAYER_NAME_R - GFXTAG_PLAYER_NAME_L) #define NUM_PARTNER_NAME_SPRITES (1 + GFXTAG_PARTNER_NAME_R - GFXTAG_PARTNER_NAME_L) #define NUM_CHOOSE_PKMN_SPRITES (1 + GFXTAG_CHOOSE_PKMN_EMPTY_3 - GFXTAG_CHOOSE_PKMN_L) enum { CURSOR_ANIM_NORMAL, CURSOR_ANIM_ON_CANCEL, }; // Values for signaling to/from the link partner enum { STATUS_NONE, STATUS_READY, STATUS_CANCEL, }; // Checked to confirm DrawSelectedMonScreen has reached final state #define DRAW_SELECTED_FINISH 5 static EWRAM_DATA u8 *sMenuTextTileBuffer = NULL; static EWRAM_DATA u8 *sMenuTextTileBuffers[NUM_MENU_TEXT_SPRITES] = {}; EWRAM_DATA struct Mail gLinkPartnerMail[PARTY_SIZE] = {}; EWRAM_DATA u8 gSelectedTradeMonPositions[2] = {0}; static EWRAM_DATA struct { u8 bg2hofs; u8 bg3hofs; u8 filler_2[38]; u8 partySpriteIds[2][PARTY_SIZE]; u8 cursorSpriteId; u8 cursorPosition; u8 partyCounts[2]; bool8 optionsActive[PARTY_SIZE * 2 + 1]; bool8 isLiveMon[2][PARTY_SIZE]; bool8 isEgg[2][PARTY_SIZE]; u8 hpBarLevels[2][PARTY_SIZE]; u8 bufferPartyState; u8 filler_6A[5]; u8 callbackId; u8 unk_70; // Never read u16 bottomTextTileStart; u8 drawSelectedMonState[2]; u8 selectedMonIdx[2]; u8 playerSelectStatus; u8 partnerSelectStatus; u8 playerConfirmStatus; u8 partnerConfirmStatus; u8 filler_7C[2]; u8 partnerCursorPosition; u16 linkData[20]; u8 timer; u8 giftRibbons[GIFT_RIBBONS_COUNT]; u8 filler_B4[0x81C]; struct { bool8 active; u16 delay; u8 actionId; } queuedActions[4]; u16 tilemapBuffer[BG_SCREEN_SIZE / 2]; } * sTradeMenu = NULL; static void CB2_CreateTradeMenu(void); static void VBlankCB_TradeMenu(void); static void CB2_TradeMenu(void); static void LoadTradeBgGfx(u8 state); static void SetActiveMenuOptions(void); static u8 BufferTradeParties(void); static void CB1_UpdateLink(void); static void RunTradeMenuCallback(void); static void SetSelectedMon(u8 cursorPosition); static void DrawSelectedMonScreen(u8 side); static u8 GetMonNicknameWidth(u8 *str, u8 whichParty, u8 partyIdx); static void BufferMovesString(u8 *str, u8 whichParty, u8 partyIdx); static void PrintPartyNicknames(u8 side); static void PrintLevelAndGender(u8 whichParty, u8 monIdx, u8 x, u8 y, u8 winLeft, u8 winTop); static void PrintPartyLevelsAndGenders(u8 side); static void PrintTradePartnerPartyNicknames(void); static void RedrawPartyWindow(u8 whichParty); static void Task_DrawSelectionSummary(u8 taskId); static void Task_DrawSelectionTrade(u8 taskId); static void QueueAction(u16 delay, u8 actionId); static void DoQueuedActions(void); static void PrintTradeMessage(u8 strIdx); static bool8 LoadUISpriteGfx(void); static void DrawBottomRowText(const u8 *name, u8 *dest, u8 unused); static void ComputePartyTradeableFlags(u8 side); static void ComputePartyHPBarLevels(u8 side); static void SetTradePartyHPBarSprites(void); static void SaveTradeGiftRibbons(void); static u32 CanTradeSelectedMon(struct Pokemon * party, int partyCount, int cursorPos); static const size_t sSizesAndOffsets[] = { sizeof(struct SaveBlock2), sizeof(struct SaveBlock1), sizeof(struct MapLayout), 0x530, // unk 0x34, // unk sizeof(struct Mail), sizeof(struct Pokemon), 0x528 // unk }; static const u16 sTradeMovesBoxTilemap[] = INCBIN_U16("graphics/trade/moves_box_map.bin"); static const u16 sTradePartyBoxTilemap[] = INCBIN_U16("graphics/trade/party_box_map.bin"); static const u8 sTradeStripesBG2Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg2_map.bin"); static const u8 sTradeStripesBG3Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg3_map.bin"); static const struct OamData sOamData_MenuText = { .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .priority = 1 }; static const struct OamData sOamData_Cursor = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; static const union AnimCmd sAnim_Cursor_Normal[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd sAnim_Cursor_OnCancel[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END }; static const union AnimCmd *const sAnims_Cursor[] = { [CURSOR_ANIM_NORMAL] = sAnim_Cursor_Normal, [CURSOR_ANIM_ON_CANCEL] = sAnim_Cursor_OnCancel }; static const struct SpriteSheet sCursor_SpriteSheet = { .data = gTradeCursor_Gfx, .size = 0x800, .tag = GFXTAG_CURSOR }; static const struct SpritePalette sCursor_SpritePalette = { .data = gTradeCursor_Pal, .tag = PALTAG_CURSOR }; static const union AnimCmd sAnim_MenuText_0[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; static const union AnimCmd sAnim_MenuText_1[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END }; static const union AnimCmd sAnim_MenuText_2[] = { ANIMCMD_FRAME(16, 5), ANIMCMD_END }; static const union AnimCmd sAnim_MenuText_3[] = { ANIMCMD_FRAME(24, 5), ANIMCMD_END }; static const union AnimCmd sAnim_MenuText_4[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END }; static const union AnimCmd sAnim_MenuText_5[] = { ANIMCMD_FRAME(40, 5), ANIMCMD_END }; // These anims are not used static const union AnimCmd *const sAnims_MenuText[] = { sAnim_MenuText_0, sAnim_MenuText_1, sAnim_MenuText_2, sAnim_MenuText_3, sAnim_MenuText_4, sAnim_MenuText_5, }; static const struct SpriteTemplate sSpriteTemplate_Cursor = { .tileTag = GFXTAG_CURSOR, .paletteTag = PALTAG_CURSOR, .oam = &sOamData_Cursor, .anims = sAnims_Cursor, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_MenuText = { .tileTag = GFXTAG_MENU_TEXT, .paletteTag = PALTAG_MENU_TEXT, .oam = &sOamData_MenuText, .anims = sAnims_MenuText, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const u16 sMenuText_Pal[] = INCBIN_U16("graphics/trade/text.gbapal"); static const struct SpritePalette sSpritePalette_MenuText = { .data = sMenuText_Pal, .tag = PALTAG_MENU_TEXT }; #define DIR_UP 0 #define DIR_DOWN 1 #define DIR_LEFT 2 #define DIR_RIGHT 3 // This is used to determine the next mon to select when the D-Pad is // pressed in a given direction. // Note that the mons are laid out like this. // 0-5 are the player's party and 6-11 are the trading partner's party. // 12 is the cancel button. // 0 1 6 7 // 2 3 8 9 // 4 5 10 11 // 12 // 1st array is the current positions // 2nd array is directions of input // 3rd array is the next positions to go to (unoccupied spaces are skipped over) static const u8 sCursorMoveDestinations[(PARTY_SIZE * 2) + 1][4][PARTY_SIZE] = { // Player's party [0] = { [DIR_UP] = { 4, 2, 12, 12, 0, 0}, [DIR_DOWN] = { 2, 4, 12, 12, 0, 0}, [DIR_LEFT] = { 7, 6, 1, 0, 0, 0}, [DIR_RIGHT] = { 1, 6, 7, 0, 0, 0} }, [1] = { [DIR_UP] = { 5, 3, 12, 12, 0, 0}, [DIR_DOWN] = { 3, 5, 12, 12, 0, 0}, [DIR_LEFT] = { 0, 7, 6, 1, 0, 0}, [DIR_RIGHT] = { 6, 7, 0, 1, 0, 0} }, [2] = { [DIR_UP] = { 0, 0, 0, 0, 0, 0}, [DIR_DOWN] = { 4, 0, 0, 0, 0, 0}, [DIR_LEFT] = { 9, 8, 7, 6, 0, 0}, [DIR_RIGHT] = { 3, 1, 0, 0, 0, 0} }, [3] = { [DIR_UP] = { 1, 1, 1, 1, 0, 0}, [DIR_DOWN] = { 5, 1, 1, 1, 0, 0}, [DIR_LEFT] = { 2, 9, 8, 7, 0, 0}, [DIR_RIGHT] = { 8, 9, 6, 6, 0, 0} }, [4] = { [DIR_UP] = { 2, 2, 2, 2, 0, 0}, [DIR_DOWN] = { 0, 0, 0, 0, 0, 0}, [DIR_LEFT] = {11, 10, 9, 8, 7, 6}, [DIR_RIGHT] = { 5, 3, 1, 0, 0, 0} }, [5] = { [DIR_UP] = { 3, 3, 3, 3, 0, 0}, [DIR_DOWN] = { 1, 1, 1, 1, 0, 0}, [DIR_LEFT] = { 4, 4, 4, 4, 0, 0}, [DIR_RIGHT] = {10, 8, 6, 0, 0, 0} }, // Partner's party [6] = { [DIR_UP] = {10, 8, 12, 0, 0, 0}, [DIR_DOWN] = { 8, 10, 12, 0, 0, 0}, [DIR_LEFT] = { 1, 0, 0, 0, 0, 0}, [DIR_RIGHT] = { 7, 0, 1, 0, 0, 0} }, [7] = { [DIR_UP] = {12, 0, 0, 0, 0, 0}, [DIR_DOWN] = { 9, 12, 0, 0, 0, 0}, [DIR_LEFT] = { 6, 0, 0, 0, 0, 0}, [DIR_RIGHT] = { 0, 0, 0, 0, 0, 0} }, [8] = { [DIR_UP] = { 6, 0, 0, 0, 0, 0}, [DIR_DOWN] = {10, 6, 0, 0, 0, 0}, [DIR_LEFT] = { 3, 2, 1, 0, 0, 0}, [DIR_RIGHT] = { 9, 7, 0, 0, 0, 0} }, [9] = { [DIR_UP] = { 7, 0, 0, 0, 0, 0}, [DIR_DOWN] = {11, 12, 0, 0, 0, 0}, [DIR_LEFT] = { 8, 0, 0, 0, 0, 0}, [DIR_RIGHT] = { 2, 1, 0, 0, 0, 0} }, [10] = { [DIR_UP] = { 8, 0, 0, 0, 0, 0}, [DIR_DOWN] = { 6, 0, 0, 0, 0, 0}, [DIR_LEFT] = { 5, 4, 3, 2, 1, 0}, [DIR_RIGHT] = {11, 9, 7, 0, 0, 0} }, [11] = { [DIR_UP] = { 9, 0, 0, 0, 0, 0}, [DIR_DOWN] = {12, 0, 0, 0, 0, 0}, [DIR_LEFT] = {10, 0, 0, 0, 0, 0}, [DIR_RIGHT] = { 4, 2, 0, 0, 0, 0} }, // Cancel [12] = { [DIR_UP] = {11, 9, 7, 6, 0, 0}, [DIR_DOWN] = { 7, 6, 0, 0, 0, 0}, [DIR_LEFT] = {12, 0, 0, 0, 0, 0}, [DIR_RIGHT] = {12, 0, 0, 0, 0, 0} } }; #define COL0_X 1 #define COL1_X 8 #define COL2_X 16 #define COL3_X 23 #define ROW0_Y 5 #define ROW1_Y 10 #define ROW2_Y 15 #define ROW3_Y 18 static const u8 sTradeMonSpriteCoords[(PARTY_SIZE * 2) + 1][2] = { [TRADE_PLAYER] = {COL0_X, ROW0_Y}, {COL1_X, ROW0_Y}, {COL0_X, ROW1_Y}, {COL1_X, ROW1_Y}, {COL0_X, ROW2_Y}, {COL1_X, ROW2_Y}, [TRADE_PARTNER * PARTY_SIZE] = {COL2_X, ROW0_Y}, {COL3_X, ROW0_Y}, {COL2_X, ROW1_Y}, {COL3_X, ROW1_Y}, {COL2_X, ROW2_Y}, {COL3_X, ROW2_Y}, // Cancel {COL3_X, ROW3_Y}, }; static const u8 sTradeMonLevelCoords[PARTY_SIZE * 2][2] = { [TRADE_PLAYER] = { 5, 4}, {12, 4}, { 5, 9}, {12, 9}, { 5, 14}, {12, 14}, [TRADE_PARTNER * PARTY_SIZE] = {20, 4}, {27, 4}, {20, 9}, {27, 9}, {20, 14}, {27, 14}, }; static const u8 sTradeMonBoxCoords[PARTY_SIZE * 2][2] = { [TRADE_PLAYER] = { 1, 3}, { 8, 3}, { 1, 8}, { 8, 8}, { 1, 13}, { 8, 13}, [TRADE_PARTNER * PARTY_SIZE] = {16, 3}, {23, 3}, {16, 8}, {23, 8}, {16, 13}, {23, 13}, }; // x,y offset for player name, x/y offset for partner name static const u8 sPlayerNameCoords[][4] = { {60, 9, 180, 9}, // Unused. For JP characters? {48, 9, 168, 9}, }; static const u8 sUnusedCoords[][2] = { { 0, 14}, {15, 29}, { 3, 5}, { 3, 7}, {18, 5}, {18, 7}, { 8, 7}, {22, 12}, { 8, 7}, {22, 12}, { 6, 7}, {24, 12}, { 6, 7}, {24, 12}, { 8, 7}, {22, 12}, { 7, 7}, {23, 12} }; static const u8 sText_Dummy[] = _(""); static const u8 sText_ClrWhtHltTranspShdwDrkGry[] = _("{COLOR WHITE}{HIGHLIGHT TRANSPARENT}{SHADOW DARK_GRAY}"); const u8 gText_MaleSymbol4[] = _("♂"); const u8 gText_FemaleSymbol4[] = _("♀"); const u8 gText_GenderlessSymbol[] = _(""); static const u8 sText_Dummy2[] = _(""); static const u8 sText_Newline[] = _("\n"); static const u8 sText_Slash[] = _("/"); static const u8 *const sActionTexts[] = { [TEXT_CANCEL] = gTradeText_Cancel, [TEXT_CHOOSE_MON] = gTradeText_ChooseAPokemon, [TEXT_SUMMARY] = gTradeText_Summary, // Unused, sMenuAction_SummaryTrade is used instead [TEXT_TRADE] = gTradeText_Trade, // Unused, sMenuAction_SummaryTrade is used instead [TEXT_CANCEL_TRADE] = gText_CancelTrade, [TEXT_PRESS_B_TO_EXIT] = gTradeText_PressBButtonToExit // Unused }; static const struct MenuAction sMenuAction_SummaryTrade[] = { {gText_TradeAction_Summary, { .void_u8 = Task_DrawSelectionSummary }}, {gText_TradeAction_Trade, { .void_u8 = Task_DrawSelectionTrade }} }; static const u8 *const sMessages[] = { [MSG_STANDBY] = gText_Trade_CommunicationStandby, [MSG_CANCELED] = gText_TradeHasBeenCanceled, [MSG_ONLY_MON1] = gText_Trade_OnlyPkmnForBattle, [MSG_ONLY_MON2] = gText_OnlyPkmnForBattle, // Same as above but without color formatting [MSG_WAITING_FOR_FRIEND] = gText_WaitingForFriendToFinish, [MSG_FRIEND_WANTS_TO_TRADE] = gText_FriendWantsToTrade, [MSG_MON_CANT_BE_TRADED] = gText_PkmnCantBeTradedNow, [MSG_EGG_CANT_BE_TRADED] = gText_EggCantBeTradedNow, [MSG_FRIENDS_MON_CANT_BE_TRADED] = gText_OtherTrainersPkmnCantBeTraded }; static const u8 sTextColor_PartyMonNickname[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY }; static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 5, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 6, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 7, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 } }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 4, .tilemapTop = 7, .width = 22, .height = 4, .paletteNum = 15, .baseBlock = 0x01e }, { .bg = 0, .tilemapLeft = 17, .tilemapTop = 15, .width = 12, .height = 4, .paletteNum = 15, .baseBlock = 0x076 }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 5, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x0a6 }, { .bg = 0, .tilemapLeft = 7, .tilemapTop = 5, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x0b6 }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 10, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x0c6 }, { .bg = 0, .tilemapLeft = 7, .tilemapTop = 10, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x0d6 }, { .bg = 0, .tilemapLeft = 0, .tilemapTop = 15, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x0e6 }, { .bg = 0, .tilemapLeft = 7, .tilemapTop = 15, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x0f6 }, { .bg = 0, .tilemapLeft = 15, .tilemapTop = 5, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x106 }, { .bg = 0, .tilemapLeft = 22, .tilemapTop = 5, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x116 }, { .bg = 0, .tilemapLeft = 15, .tilemapTop = 10, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x126 }, { .bg = 0, .tilemapLeft = 22, .tilemapTop = 10, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x136 }, { .bg = 0, .tilemapLeft = 15, .tilemapTop = 15, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x146 }, { .bg = 0, .tilemapLeft = 22, .tilemapTop = 15, .width = 8, .height = 2, .paletteNum = 13, .baseBlock = 0x156 }, { .bg = 0, .tilemapLeft = 2, .tilemapTop = 5, .width = 14, .height = 2, .paletteNum = 13, .baseBlock = 0x166 }, { .bg = 0, .tilemapLeft = 3, .tilemapTop = 8, .width = 11, .height = 8, .paletteNum = 15, .baseBlock = 0x182 }, { .bg = 0, .tilemapLeft = 17, .tilemapTop = 5, .width = 14, .height = 2, .paletteNum = 15, .baseBlock = 0x1da }, { .bg = 0, .tilemapLeft = 18, .tilemapTop = 8, .width = 11, .height = 8, .paletteNum = 15, .baseBlock = 0x1f6 }, DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sWindowTemplate_YesNo = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 13, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x24e }; static const u8 sText_ShedinjaJP[] = _("ヌケニン"); // Position of level/gender when just the pokemon to trade are displayed static const u8 sSelectedMonLevelGenderCoords[][2] = { [TRADE_PLAYER] = { 4, 3}, [TRADE_PARTNER] = {19, 3} }; static void InitTradeMenu(void) { static u16 dummy; ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); ResetPaletteFade(); gPaletteFade.bufferTransferDisabled = TRUE; SetVBlankCallback(VBlankCB_TradeMenu); LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZEOF(10)); LoadPalette(gStandardMenuPalette, BG_PLTT_ID(13), PLTT_SIZEOF(10)); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, sTradeMenu->tilemapBuffer); if (InitWindows(sWindowTemplates)) { int i; DeactivateAllTextPrinters(); dummy = 590; // ? for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++) { ClearWindowTilemap(i); FillWindowPixelBuffer(i, PIXEL_FILL(0)); } FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 15); LoadStdWindowGfx(0, 0x014, BG_PLTT_ID(12)); LoadUserWindowGfx(2, 0x001, BG_PLTT_ID(14)); LoadMonIconPalettes(); sTradeMenu->bufferPartyState = 0; sTradeMenu->callbackId = CB_MAIN_MENU; sTradeMenu->unk_70 = 0; sTradeMenu->drawSelectedMonState[TRADE_PLAYER] = 0; sTradeMenu->drawSelectedMonState[TRADE_PARTNER] = 0; sTradeMenu->playerConfirmStatus = STATUS_NONE; sTradeMenu->partnerConfirmStatus = STATUS_NONE; sTradeMenu->timer = 0; } } void CB2_StartCreateTradeMenu(void) { SetMainCallback2(CB2_CreateTradeMenu); } static void CB2_CreateTradeMenu(void) { int i; struct SpriteTemplate temp; u8 id; s32 width; u32 xPos; u8 *name; switch (gMain.state) { case 0: sTradeMenu = AllocZeroed(sizeof(*sTradeMenu)); InitTradeMenu(); sMenuTextTileBuffer = AllocZeroed(NUM_MENU_TEXT_SPRITES * 256); for (i = 0; i < NUM_MENU_TEXT_SPRITES; i++) sMenuTextTileBuffers[i] = &sMenuTextTileBuffer[i * 256]; gMain.state++; break; case 1: gPaletteFade.bufferTransferDisabled = FALSE; for (i = 0; i < PARTY_SIZE; i++) CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); PrintTradeMessage(MSG_STANDBY); ShowBg(0); if (!gReceivedRemoteLinkPlayers) { gLinkType = LINKTYPE_TRADE_CONNECTING; sTradeMenu->timer = 0; if (gWirelessCommType) { SetWirelessCommType1(); OpenLink(); CreateTask_RfuIdle(); } else { OpenLink(); gMain.state++; } if (gWirelessCommType == 0) CreateTask(Task_WaitForLinkPlayerConnection, 1); } else { gMain.state = 4; } break; case 2: sTradeMenu->timer++; if (sTradeMenu->timer > 11) { sTradeMenu->timer = 0; gMain.state++; } break; case 3: if (GetLinkPlayerCount_2() >= GetSavedPlayerCount()) { if (IsLinkMaster()) { if (++sTradeMenu->timer > 30) { CheckShouldAdvanceLinkState(); gMain.state++; } } else { gMain.state++; } } break; case 4: if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) { DestroyTask_RfuIdle(); CalculatePlayerPartyCount(); gMain.state++; sTradeMenu->timer = 0; if (gWirelessCommType) { Rfu_SetLinkRecovery(TRUE); SetLinkStandbyCallback(); } } break; case 5: if (gWirelessCommType) { if (IsLinkRfuTaskFinished()) { gMain.state++; LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } } else { gMain.state++; } break; case 6: if (BufferTradeParties()) { SaveTradeGiftRibbons(); gMain.state++; } break; case 7: CalculateEnemyPartyCount(); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); sTradeMenu->partyCounts[TRADE_PLAYER] = gPlayerPartyCount; sTradeMenu->partyCounts[TRADE_PARTNER] = gEnemyPartyCount; for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++) { struct Pokemon * mon = &gPlayerParty[i]; sTradeMenu->partySpriteIds[TRADE_PLAYER][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES_OR_EGG), SpriteCB_MonIcon, (sTradeMonSpriteCoords[i][0] * 8) + 14, (sTradeMonSpriteCoords[i][1] * 8) - 12, 1, GetMonData(mon, MON_DATA_PERSONALITY), TRUE); } for (i = 0; i < sTradeMenu->partyCounts[TRADE_PARTNER]; i++) { struct Pokemon * mon = &gEnemyParty[i]; sTradeMenu->partySpriteIds[TRADE_PARTNER][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL), SpriteCB_MonIcon, (sTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8) + 14, (sTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8) - 12, 1, GetMonData(mon, MON_DATA_PERSONALITY), FALSE); } gMain.state++; break; case 8: LoadHeldItemIcons(); DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PLAYER); gMain.state++; break; case 9: DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PARTNER); gMain.state++; break; case 10: DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, gDecompressionBuffer, 3); id = GetMultiplayerId(); DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, gDecompressionBuffer, 3); DrawTextWindowAndBufferTiles(sActionTexts[TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, gDecompressionBuffer, 2); DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24); gMain.state++; sTradeMenu->timer = 0; break; case 11: if (LoadUISpriteGfx()) gMain.state++; break; case 12: // Create player's name text sprites name = gSaveBlock2Ptr->playerName; width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0); xPos = (56 - width) / 2; for (i = 0; i < NUM_PLAYER_NAME_SPRITES; i++) { temp = sSpriteTemplate_MenuText; temp.tileTag += i + GFXTAG_PLAYER_NAME_L; CreateSprite(&temp, xPos + sPlayerNameCoords[1][0] + (i * 32), sPlayerNameCoords[1][1], 1); } // Create partner's name text sprites id = GetMultiplayerId(); name = gLinkPlayers[id ^ 1].name; width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0); xPos = (56 - width) / 2; for (i = 0; i < NUM_PARTNER_NAME_SPRITES; i++) { temp = sSpriteTemplate_MenuText; temp.tileTag += i + GFXTAG_PARTNER_NAME_L; CreateSprite(&temp, xPos + sPlayerNameCoords[1][2] + (i * 32), sPlayerNameCoords[1][3], 1); } gMain.state++; break; case 13: // Create Cancel text sprites temp = sSpriteTemplate_MenuText; temp.tileTag += GFXTAG_CANCEL_L; CreateSprite(&temp, 215, 151, 1); temp = sSpriteTemplate_MenuText; temp.tileTag += GFXTAG_CANCEL_R; CreateSprite(&temp, 215 + 32, 151, 1); // Create Choose a Pokémon text sprites (only 3 are needed, other 3 are empty) for (i = 0; i < NUM_CHOOSE_PKMN_SPRITES; i++) { temp = sSpriteTemplate_MenuText; temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L; CreateSprite(&temp, (i * 32) + 24, 150, 1); } sTradeMenu->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, sTradeMonSpriteCoords[0][0] * 8 + 32, sTradeMonSpriteCoords[0][1] * 8, 2); sTradeMenu->cursorPosition = 0; gMain.state++; rbox_fill_rectangle(0); break; case 14: ComputePartyTradeableFlags(TRADE_PLAYER); PrintPartyNicknames(TRADE_PLAYER); sTradeMenu->bg2hofs = 0; sTradeMenu->bg3hofs = 0; SetActiveMenuOptions(); gMain.state++; PlayBGM(MUS_GAME_CORNER); break; case 15: ComputePartyTradeableFlags(TRADE_PARTNER); PrintPartyNicknames(TRADE_PARTNER); gMain.state++; // fallthrough case 16: LoadTradeBgGfx(0); gMain.state++; break; case 17: LoadTradeBgGfx(1); gMain.state++; break; case 18: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; break; case 19: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); LoadTradeBgGfx(2); gMain.state++; break; case 20: ComputePartyHPBarLevels(TRADE_PLAYER); gMain.state++; break; case 21: ComputePartyHPBarLevels(TRADE_PARTNER); SetTradePartyHPBarSprites(); gMain.state++; break; case 22: if (!gPaletteFade.active) { gMain.callback1 = CB1_UpdateLink; SetMainCallback2(CB2_TradeMenu); } break; } RunTextPrinters(); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } void CB2_ReturnToTradeMenuFromSummary(void) { int i; struct SpriteTemplate temp; u8 id; s32 width; u32 xPos; u8 *name; switch (gMain.state) { case 0: InitTradeMenu(); gMain.state++; break; case 1: gMain.state++; sTradeMenu->timer = 0; break; case 2: gMain.state++; break; case 3: gMain.state++; break; case 4: CalculatePlayerPartyCount(); gMain.state++; break; case 5: if (gWirelessCommType != 0) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } gMain.state++; break; case 6: gMain.state++; break; case 7: CalculateEnemyPartyCount(); sTradeMenu->partyCounts[TRADE_PLAYER] = gPlayerPartyCount; sTradeMenu->partyCounts[TRADE_PARTNER] = gEnemyPartyCount; ClearWindowTilemap(0); PrintPartyNicknames(TRADE_PLAYER); PrintPartyNicknames(TRADE_PARTNER); for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++) { sTradeMenu->partySpriteIds[TRADE_PLAYER][i] = CreateMonIcon( GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL), SpriteCB_MonIcon, sTradeMonSpriteCoords[i][0] * 8 + 14, sTradeMonSpriteCoords[i][1] * 8 - 12, 1, GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY), TRUE ); } for (i = 0; i < sTradeMenu->partyCounts[TRADE_PARTNER]; i++) { sTradeMenu->partySpriteIds[TRADE_PARTNER][i] = CreateMonIcon( GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG, NULL), SpriteCB_MonIcon, sTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8 + 14, sTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8 - 12, 1, GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY), FALSE ); } gMain.state++; break; case 8: LoadHeldItemIcons(); DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PLAYER); gMain.state++; break; case 9: DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PARTNER); gMain.state++; break; case 10: DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, gDecompressionBuffer, 3); id = GetMultiplayerId(); DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, gDecompressionBuffer, 3); DrawTextWindowAndBufferTiles(sActionTexts[TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, gDecompressionBuffer, 2); DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24); gMain.state++; sTradeMenu->timer = 0; break; case 11: if (LoadUISpriteGfx()) gMain.state++; break; case 12: // Create player's name text sprites name = gSaveBlock2Ptr->playerName; width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0); xPos = (56 - width) / 2; for (i = 0; i < NUM_PLAYER_NAME_SPRITES; i++) { temp = sSpriteTemplate_MenuText; temp.tileTag += i + GFXTAG_PLAYER_NAME_L; CreateSprite(&temp, xPos + sPlayerNameCoords[1][0] + (i * 32), sPlayerNameCoords[1][1], 1); } // Create partner's name text sprites id = GetMultiplayerId(); name = gLinkPlayers[id ^ 1].name; width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0); xPos = (56 - width) / 2; for (i = 0; i < NUM_PARTNER_NAME_SPRITES; i++) { temp = sSpriteTemplate_MenuText; temp.tileTag += i + GFXTAG_PARTNER_NAME_L; CreateSprite(&temp, xPos + sPlayerNameCoords[1][2] + (i * 32), sPlayerNameCoords[1][3], 1); } gMain.state++; break; case 13: // Create Cancel text sprites temp = sSpriteTemplate_MenuText; temp.tileTag += GFXTAG_CANCEL_L; CreateSprite(&temp, 215, 151, 1); temp = sSpriteTemplate_MenuText; temp.tileTag += GFXTAG_CANCEL_R; CreateSprite(&temp, 215 + 32, 151, 1); // Create Choose a Pokémon text sprites for (i = 0; i < NUM_CHOOSE_PKMN_SPRITES; i++) { temp = sSpriteTemplate_MenuText; temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L; CreateSprite(&temp, (i * 32) + 24, 150, 1); } if (sTradeMenu->cursorPosition < PARTY_SIZE) sTradeMenu->cursorPosition = GetLastViewedMonIndex(); else sTradeMenu->cursorPosition = GetLastViewedMonIndex() + PARTY_SIZE; sTradeMenu->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, sTradeMonSpriteCoords[sTradeMenu->cursorPosition][0] * 8 + 32, sTradeMonSpriteCoords[sTradeMenu->cursorPosition][1] * 8, 2); gMain.state = 16; break; case 16: LoadTradeBgGfx(0); gMain.state++; break; case 17: LoadTradeBgGfx(1); sTradeMenu->bg2hofs = 0; sTradeMenu->bg3hofs = 0; SetActiveMenuOptions(); gMain.state++; break; case 18: gPaletteFade.bufferTransferDisabled = FALSE; BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; break; case 19: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); LoadTradeBgGfx(2); gMain.state++; break; case 20: gMain.state++; break; case 21: SetTradePartyHPBarSprites(); gMain.state++; break; case 22: if (!gPaletteFade.active) SetMainCallback2(CB2_TradeMenu); break; } RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void VBlankCB_TradeMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void CB_FadeToStartTrade(void) { if (++sTradeMenu->timer >= 16) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenu->callbackId = CB_WAIT_TO_START_TRADE; } } static void CB_WaitToStartTrade(void) { if (!gPaletteFade.active) { gSelectedTradeMonPositions[TRADE_PLAYER] = sTradeMenu->cursorPosition; gSelectedTradeMonPositions[TRADE_PARTNER] = sTradeMenu->partnerCursorPosition; if (gWirelessCommType != 0) { sTradeMenu->callbackId = CB_WAIT_TO_START_RFU_TRADE; } else { SetCloseLinkCallbackAndType(32); sTradeMenu->callbackId = CB_START_LINK_TRADE; } } } static void CB_StartLinkTrade(void) { gMain.savedCallback = CB2_StartCreateTradeMenu; if (gWirelessCommType != 0) { // Wireless Link Trade if (IsLinkRfuTaskFinished()) { Free(sMenuTextTileBuffer); FreeAllWindowBuffers(); Free(sTradeMenu); gMain.callback1 = NULL; DestroyWirelessStatusIndicatorSprite(); SetMainCallback2(CB2_LinkTrade); } } else { // Cable Link Trade if (!gReceivedRemoteLinkPlayers) { Free(sMenuTextTileBuffer); FreeAllWindowBuffers(); Free(sTradeMenu); gMain.callback1 = NULL; SetMainCallback2(CB2_LinkTrade); } } } static void CB2_TradeMenu(void) { RunTradeMenuCallback(); DoQueuedActions(); // As long as drawSelectedMonState is 0, these do nothing DrawSelectedMonScreen(TRADE_PLAYER); DrawSelectedMonScreen(TRADE_PARTNER); SetGpuReg(REG_OFFSET_BG2HOFS, sTradeMenu->bg2hofs++); SetGpuReg(REG_OFFSET_BG3HOFS, sTradeMenu->bg3hofs--); RunTextPrinters_CheckPrinter0Active(); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void LoadTradeBgGfx(u8 state) { int i; switch (state) { case 0: LoadPalette(gTradeMenu_Pal, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP); LoadBgTiles(1, gTradeMenu_Gfx, 0x1280, 0); CopyToBgTilemapBufferRect_ChangePalette(1, gTradeMenu_Tilemap, 0, 0, 32, 20, 0); LoadBgTilemap(2, sTradeStripesBG2Tilemap, 0x800, 0); break; case 1: LoadBgTilemap(3, sTradeStripesBG3Tilemap, 0x800, 0); PrintPartyLevelsAndGenders(TRADE_PLAYER); PrintPartyLevelsAndGenders(TRADE_PARTNER); CopyBgTilemapBufferToVram(1); break; case 2: for (i = 0; i < 4; i++) { // BG0 and BG1 coords only SetGpuReg(REG_OFFSET_BG0HOFS + 2 * i, 0); } ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); break; } } // Determine (based on party counts) where the main menu cursor can go static void SetActiveMenuOptions(void) { int i; for (i = 0; i < PARTY_SIZE; i++) { if (i < sTradeMenu->partyCounts[TRADE_PLAYER]) { // Present player pokemon gSprites[sTradeMenu->partySpriteIds[TRADE_PLAYER][i]].invisible = FALSE; sTradeMenu->optionsActive[i] = TRUE; } else { // Absent player pokemon sTradeMenu->optionsActive[i] = FALSE; } if (i < sTradeMenu->partyCounts[TRADE_PARTNER]) { // Present partner pokemon gSprites[sTradeMenu->partySpriteIds[TRADE_PARTNER][i]].invisible = FALSE; sTradeMenu->optionsActive[i + PARTY_SIZE] = TRUE; } else { // Absent partner pokemon sTradeMenu->optionsActive[i + PARTY_SIZE] = FALSE; } } // Cancel is always active sTradeMenu->optionsActive[PARTY_SIZE * 2] = TRUE; } static void Trade_Memcpy(void *dest, const void *src, size_t size) { int i; u8 *_dest = dest; const u8 *_src = src; for (i = 0; i < size; i++) _dest[i] = _src[i]; } static bool8 BufferTradeParties(void) { u8 id = GetMultiplayerId(); int i; struct Pokemon * mon; switch (sTradeMenu->bufferPartyState) { case 0: // The parties are sent in pairs rather than all at once Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon)); sTradeMenu->bufferPartyState++; sTradeMenu->timer = 0; break; case 1: if (IsLinkTaskFinished()) { if (GetBlockReceivedStatus() == 0) { sTradeMenu->bufferPartyState++; } else { ResetBlockReceivedFlags(); sTradeMenu->bufferPartyState++; } } break; case 3: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_200); sTradeMenu->bufferPartyState++; break; case 4: if (GetBlockReceivedStatus() == 3) { Trade_Memcpy(&gEnemyParty[0], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon)); ResetBlockReceivedFlags(); sTradeMenu->bufferPartyState++; } break; case 5: Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[2], 2 * sizeof(struct Pokemon)); sTradeMenu->bufferPartyState++; break; case 7: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_200); sTradeMenu->bufferPartyState++; break; case 8: if (GetBlockReceivedStatus() == 3) { Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon)); ResetBlockReceivedFlags(); sTradeMenu->bufferPartyState++; } break; case 9: Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 2 * sizeof(struct Pokemon)); sTradeMenu->bufferPartyState++; break; case 11: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_200); sTradeMenu->bufferPartyState++; break; case 12: if (GetBlockReceivedStatus() == 3) { Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon)); ResetBlockReceivedFlags(); sTradeMenu->bufferPartyState++; } break; case 13: Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, PARTY_SIZE * sizeof(struct Mail) + 4); // why the extra 4 bytes? sTradeMenu->bufferPartyState++; break; case 15: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_220); sTradeMenu->bufferPartyState++; break; case 16: if (GetBlockReceivedStatus() == 3) { Trade_Memcpy(gLinkPartnerMail, gBlockRecvBuffer[id ^ 1], PARTY_SIZE * sizeof(struct Mail)); ResetBlockReceivedFlags(); sTradeMenu->bufferPartyState++; } break; case 17: Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, sizeof(sTradeMenu->giftRibbons)); sTradeMenu->bufferPartyState++; break; case 19: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_40); sTradeMenu->bufferPartyState++; break; case 20: if (GetBlockReceivedStatus() == 3) { Trade_Memcpy(sTradeMenu->giftRibbons, gBlockRecvBuffer[id ^ 1], sizeof(sTradeMenu->giftRibbons)); ResetBlockReceivedFlags(); sTradeMenu->bufferPartyState++; } break; case 21: for (i = 0, mon = gEnemyParty; i < PARTY_SIZE; mon++, i++) { u8 name[POKEMON_NAME_LENGTH + 1]; u16 species = GetMonData(mon, MON_DATA_SPECIES); if (species != SPECIES_NONE) { if (species == SPECIES_SHEDINJA && GetMonData(mon, MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE) { GetMonData(mon, MON_DATA_NICKNAME, name); if (!StringCompareWithoutExtCtrlCodes(name, sText_ShedinjaJP)) SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[SPECIES_SHEDINJA]); } } } return TRUE; // Delay until next state case 2: case 6: case 10: case 14: case 18: sTradeMenu->timer++; if (sTradeMenu->timer > 10) { sTradeMenu->timer = 0; sTradeMenu->bufferPartyState++; } break; } return FALSE; } static void PrintIsThisTradeOkay(void) { DrawBottomRowText(gText_IsThisTradeOkay, (u8 *)OBJ_VRAM0 + sTradeMenu->bottomTextTileStart * 32, 0x18); } static void Leader_ReadLinkBuffer(u8 mpId, u8 status) { if (status & 1) { switch (gBlockRecvBuffer[0][0]) { case LINKCMD_REQUEST_CANCEL: sTradeMenu->playerSelectStatus = STATUS_CANCEL; break; case LINKCMD_READY_TO_TRADE: sTradeMenu->playerSelectStatus = STATUS_READY; break; case LINKCMD_INIT_BLOCK: sTradeMenu->playerConfirmStatus = STATUS_READY; break; case LINKCMD_READY_CANCEL_TRADE: sTradeMenu->playerConfirmStatus = STATUS_CANCEL; break; } ResetBlockReceivedFlag(0); } if (status & 2) { switch (gBlockRecvBuffer[1][0]) { case LINKCMD_REQUEST_CANCEL: sTradeMenu->partnerSelectStatus = STATUS_CANCEL; break; case LINKCMD_READY_TO_TRADE: sTradeMenu->partnerCursorPosition = gBlockRecvBuffer[1][1] + PARTY_SIZE; sTradeMenu->partnerSelectStatus = STATUS_READY; break; case LINKCMD_INIT_BLOCK: sTradeMenu->partnerConfirmStatus = STATUS_READY; break; case LINKCMD_READY_CANCEL_TRADE: sTradeMenu->partnerConfirmStatus = STATUS_CANCEL; break; } ResetBlockReceivedFlag(1); } } static void Follower_ReadLinkBuffer(u8 mpId, u8 status) { if (status & 1) { switch (gBlockRecvBuffer[0][0]) { case LINKCMD_BOTH_CANCEL_TRADE: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); PrintTradeMessage(MSG_WAITING_FOR_FRIEND); sTradeMenu->callbackId = CB_INIT_EXIT_CANCELED_TRADE; break; case LINKCMD_PARTNER_CANCEL_TRADE: PrintTradeMessage(MSG_FRIEND_WANTS_TO_TRADE); sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; break; case LINKCMD_SET_MONS_TO_TRADE: sTradeMenu->partnerCursorPosition = gBlockRecvBuffer[0][1] + PARTY_SIZE; rbox_fill_rectangle(0); SetSelectedMon(sTradeMenu->cursorPosition); SetSelectedMon(sTradeMenu->partnerCursorPosition); sTradeMenu->callbackId = CB_PRINT_IS_THIS_OKAY; break; case LINKCMD_START_TRADE: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenu->callbackId = CB_WAIT_TO_START_TRADE; break; case LINKCMD_PLAYER_CANCEL_TRADE: PrintTradeMessage(MSG_CANCELED); sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; } ResetBlockReceivedFlag(0); } if (status & 2) ResetBlockReceivedFlag(1); } #define QueueLinkData(linkCmd, cursorPosition) \ { \ sTradeMenu->linkData[0] = (linkCmd); \ sTradeMenu->linkData[1] = (cursorPosition); \ QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA); \ } static void Leader_HandleCommunication(void) { if (sTradeMenu->playerSelectStatus != STATUS_NONE && sTradeMenu->partnerSelectStatus != STATUS_NONE) { if (sTradeMenu->playerSelectStatus == STATUS_READY && sTradeMenu->partnerSelectStatus == STATUS_READY) { // Both players have selected a pokemon to trade sTradeMenu->callbackId = CB_SET_SELECTED_MONS; QueueLinkData(LINKCMD_SET_MONS_TO_TRADE, sTradeMenu->cursorPosition); sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE; } else if (sTradeMenu->playerSelectStatus == STATUS_READY && sTradeMenu->partnerSelectStatus == STATUS_CANCEL) { // The player has selected a pokemon to trade, // but the partner has selected Cancel PrintTradeMessage(MSG_CANCELED); QueueLinkData(LINKCMD_PARTNER_CANCEL_TRADE, 0); sTradeMenu->playerConfirmStatus = sTradeMenu->partnerConfirmStatus = STATUS_NONE; sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE; sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; } else if (sTradeMenu->playerSelectStatus == STATUS_CANCEL && sTradeMenu->partnerSelectStatus == STATUS_READY) { // The partner has selected a pokemon to trade, // but the player has selected cancel PrintTradeMessage(MSG_FRIEND_WANTS_TO_TRADE); QueueLinkData(LINKCMD_PLAYER_CANCEL_TRADE, 0); sTradeMenu->playerConfirmStatus = sTradeMenu->partnerConfirmStatus = STATUS_NONE; sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE; sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; } else if (sTradeMenu->playerSelectStatus == STATUS_CANCEL && sTradeMenu->partnerSelectStatus == STATUS_CANCEL) { // Both players have selected Cancel QueueLinkData(LINKCMD_BOTH_CANCEL_TRADE, 0); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE; sTradeMenu->callbackId = CB_INIT_EXIT_CANCELED_TRADE; } } if (sTradeMenu->playerConfirmStatus != STATUS_NONE && sTradeMenu->partnerConfirmStatus != STATUS_NONE) { if (sTradeMenu->playerConfirmStatus == STATUS_READY && sTradeMenu->partnerConfirmStatus == STATUS_READY) { // Both players have confirmed the trade QueueLinkData(LINKCMD_START_TRADE, 0); sTradeMenu->playerConfirmStatus = STATUS_NONE; sTradeMenu->partnerConfirmStatus = STATUS_NONE; sTradeMenu->callbackId = CB_FADE_TO_START_TRADE; } if (sTradeMenu->playerConfirmStatus == STATUS_CANCEL || sTradeMenu->partnerConfirmStatus == STATUS_CANCEL) { // One of the players has decided not to confirm the trade, // or the trade was not allowed. PrintTradeMessage(MSG_CANCELED); QueueLinkData(LINKCMD_PLAYER_CANCEL_TRADE, 0); sTradeMenu->playerConfirmStatus = STATUS_NONE; sTradeMenu->partnerConfirmStatus = STATUS_NONE; sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; } } } static void CB1_UpdateLink(void) { u8 mpId = GetMultiplayerId(); u8 status; if ((status = GetBlockReceivedStatus())) { if (mpId == 0) Leader_ReadLinkBuffer(mpId, status); else Follower_ReadLinkBuffer(mpId, status); } if (mpId == 0) Leader_HandleCommunication(); } static u8 GetNewCursorPosition(u8 oldPosition, u8 direction) { int i; u8 newPosition = 0; for (i = 0; i < PARTY_SIZE; i++) { if (sTradeMenu->optionsActive[sCursorMoveDestinations[oldPosition][direction][i]] == TRUE) { newPosition = sCursorMoveDestinations[oldPosition][direction][i]; break; } } return newPosition; } static void TradeMenuMoveCursor(u8 *cursorPosition, u8 direction) { u8 newPosition = GetNewCursorPosition(*cursorPosition, direction); if (newPosition == PARTY_SIZE * 2) // CANCEL { StartSpriteAnim(&gSprites[sTradeMenu->cursorSpriteId], CURSOR_ANIM_ON_CANCEL); gSprites[sTradeMenu->cursorSpriteId].x = DISPLAY_WIDTH - 16; gSprites[sTradeMenu->cursorSpriteId].y = DISPLAY_HEIGHT; } else { StartSpriteAnim(&gSprites[sTradeMenu->cursorSpriteId], CURSOR_ANIM_NORMAL); gSprites[sTradeMenu->cursorSpriteId].x = sTradeMonSpriteCoords[newPosition][0] * 8 + 32; gSprites[sTradeMenu->cursorSpriteId].y = sTradeMonSpriteCoords[newPosition][1] * 8; } if (*cursorPosition != newPosition) PlaySE(SE_SELECT); *cursorPosition = newPosition; } static void SetReadyToTrade(void) { PrintTradeMessage(MSG_STANDBY); sTradeMenu->callbackId = CB_READY_WAIT; if (GetMultiplayerId() == 1) { // Communicate to the link leader that we're ready to trade sTradeMenu->linkData[0] = LINKCMD_READY_TO_TRADE; sTradeMenu->linkData[1] = sTradeMenu->cursorPosition; SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); } else { // We are the link leader, no communication necessary sTradeMenu->playerSelectStatus = STATUS_READY; } } static void CB_ProcessMenuInput(void) { int i; if (JOY_REPT(DPAD_UP)) TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_UP); else if (JOY_REPT(DPAD_DOWN)) TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_DOWN); else if (JOY_REPT(DPAD_LEFT)) TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_LEFT); else if (JOY_REPT(DPAD_RIGHT)) TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_RIGHT); if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); if (sTradeMenu->cursorPosition < PARTY_SIZE) { // Selected pokemon in player's party DrawTextBorderOuter(1, 1, 14); FillWindowPixelBuffer(1, PIXEL_FILL(1)); PrintMenuTable(1, FONT_NORMAL_COPY_2, 16, ARRAY_COUNT(sMenuAction_SummaryTrade), sMenuAction_SummaryTrade); Menu_InitCursor(1, FONT_NORMAL_COPY_2, 0, 0, 16, 2, 0); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_FULL); sTradeMenu->callbackId = CB_SELECTED_MON; } else if (sTradeMenu->cursorPosition < PARTY_SIZE * 2) { // Selected pokemon in partner's party BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenu->callbackId = CB_SHOW_MON_SUMMARY; } else if (sTradeMenu->cursorPosition == PARTY_SIZE * 2) { // Selected Cancel CreateYesNoMenu(&sWindowTemplate_YesNo, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0); sTradeMenu->callbackId = CB_CANCEL_TRADE_PROMPT; DrawBottomRowText(sActionTexts[TEXT_CANCEL_TRADE], (void *)OBJ_VRAM0 + sTradeMenu->bottomTextTileStart * 32, 24); } } // This option is unavailable in Emerald if (JOY_NEW(R_BUTTON)) { for (i = 0; i < 10; i++) sTradeMenu->linkData[i] = i; SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); } } static void RedrawChooseAPokemonWindow(void) { PrintTradePartnerPartyNicknames(); sTradeMenu->callbackId = CB_MAIN_MENU; gSprites[sTradeMenu->cursorSpriteId].invisible = FALSE; DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], (void *)OBJ_VRAM0 + sTradeMenu->bottomTextTileStart * 32, 24); } static void CB_ProcessSelectedMonInput(void) { switch (Menu_ProcessInputNoWrapAround()) { case MENU_B_PRESSED: PlaySE(SE_SELECT); RedrawChooseAPokemonWindow(); break; case MENU_NOTHING_CHOSEN: break; case 0: // Summary BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenu->callbackId = CB_SHOW_MON_SUMMARY; break; case 1: // Trade switch (CanTradeSelectedMon(gPlayerParty, gPlayerPartyCount, sTradeMenu->cursorPosition)) { case CAN_TRADE_MON: SetReadyToTrade(); gSprites[sTradeMenu->cursorSpriteId].invisible = TRUE; break; case CANT_TRADE_LAST_MON: QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2); sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; break; case CANT_TRADE_NATIONAL: case CANT_TRADE_INVALID_MON: QueueAction(QUEUE_DELAY_MSG, QUEUE_MON_CANT_BE_TRADED); sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; break; case CANT_TRADE_EGG_YET: case CANT_TRADE_PARTNER_EGG_YET: QueueAction(QUEUE_DELAY_MSG, QUEUE_EGG_CANT_BE_TRADED); sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; break; } break; } } static void CB_ChooseMonAfterButtonPress(void) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); RedrawChooseAPokemonWindow(); } } static void CB_ShowTradeMonSummaryScreen(void) { if (!gPaletteFade.active) { if (sTradeMenu->cursorPosition < PARTY_SIZE) ShowPokemonSummaryScreen(gPlayerParty, sTradeMenu->cursorPosition, sTradeMenu->partyCounts[0] - 1, CB2_ReturnToTradeMenuFromSummary, PSS_MODE_TRADE); else ShowPokemonSummaryScreen(gEnemyParty, sTradeMenu->cursorPosition - PARTY_SIZE, sTradeMenu->partyCounts[1] - 1, CB2_ReturnToTradeMenuFromSummary, PSS_MODE_TRADE); FreeAllWindowBuffers(); } } static u8 CheckValidityOfTradeMons(u8 *aliveMons, u8 playerPartyCount, u8 cursorPos) { s32 i; u16 partnerSpecies; u8 hasLiveMon = 0; // Make sure mon to be traded isn't player's last alive mon for (i = 0; i < playerPartyCount; i++) { if (cursorPos != i) hasLiveMon += aliveMons[i]; } // Partner cant trade illegitimate Deoxys or Mew partnerSpecies = GetMonData(&gEnemyParty[sTradeMenu->partnerCursorPosition % PARTY_SIZE], MON_DATA_SPECIES); if ((partnerSpecies == SPECIES_DEOXYS || partnerSpecies == SPECIES_MEW) && !GetMonData(&gEnemyParty[sTradeMenu->partnerCursorPosition % PARTY_SIZE], MON_DATA_MODERN_FATEFUL_ENCOUNTER)) return PARTNER_MON_INVALID; if (hasLiveMon != 0) hasLiveMon = BOTH_MONS_VALID; return hasLiveMon; // PLAYER_MON_INVALID or BOTH_MONS_VALID } static void CommunicateWhetherMonCanBeTraded(void) { int i; u8 aliveMons[PARTY_SIZE * 2]; for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++) aliveMons[i] = sTradeMenu->isLiveMon[TRADE_PLAYER][i]; switch (CheckValidityOfTradeMons(aliveMons, sTradeMenu->partyCounts[0], sTradeMenu->cursorPosition)) { case PLAYER_MON_INVALID: QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2); sTradeMenu->linkData[0] = LINKCMD_READY_CANCEL_TRADE; QueueAction(180, QUEUE_SEND_DATA); break; case BOTH_MONS_VALID: QueueAction(QUEUE_DELAY_MSG, QUEUE_STANDBY); sTradeMenu->linkData[0] = LINKCMD_INIT_BLOCK; if (IsLinkTaskFinished()) SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); break; case PARTNER_MON_INVALID: QueueAction(QUEUE_DELAY_MSG, QUEUE_FRIENDS_MON_CANT_BE_TRADED); sTradeMenu->linkData[0] = LINKCMD_READY_CANCEL_TRADE; QueueAction(180, QUEUE_SEND_DATA); break; default: // Both pokemon are valid to trade break; } } static void CB_ProcessConfirmTradeInput(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // YES, Confirm selection CommunicateWhetherMonCanBeTraded(); sTradeMenu->callbackId = CB_IDLE; PutWindowTilemap(17); break; case 1: // NO, Cancel Trade case MENU_B_PRESSED: QueueAction(QUEUE_DELAY_MSG, QUEUE_STANDBY); if (IsLinkTaskFinished()) { sTradeMenu->linkData[0] = LINKCMD_READY_CANCEL_TRADE; SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); } sTradeMenu->callbackId = CB_IDLE; PutWindowTilemap(17); break; } } // Only when choosing Yes to cancel, when No is chosen all are redrawn anyway static void RestoreNicknamesCoveredByYesNo(void) { int i; for (i = 0; i < sTradeMenu->partyCounts[1] - 4; i++) { PutWindowTilemap(i + PARTY_SIZE * 2); CopyWindowToVram(i + PARTY_SIZE * 2, COPYWIN_MAP); } } static void CB_ProcessCancelTradeInput(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 0: // YES, Cancel PrintTradeMessage(MSG_WAITING_FOR_FRIEND); QueueLinkData(LINKCMD_REQUEST_CANCEL, 0); gSprites[sTradeMenu->cursorSpriteId].invisible = TRUE; sTradeMenu->callbackId = CB_IDLE; RestoreNicknamesCoveredByYesNo(); break; case 1: // NO, Continue case MENU_B_PRESSED: PlaySE(SE_SELECT); RedrawChooseAPokemonWindow(); break; } } static void CB_SetSelectedMons(void) { if (GetMultiplayerId() == 0) { rbox_fill_rectangle(0); SetSelectedMon(sTradeMenu->cursorPosition); SetSelectedMon(sTradeMenu->partnerCursorPosition); } sTradeMenu->callbackId = CB_PRINT_IS_THIS_OKAY; } static void CB_PrintIsThisTradeOkay(void) { if (sTradeMenu->drawSelectedMonState[TRADE_PLAYER] == DRAW_SELECTED_FINISH && sTradeMenu->drawSelectedMonState[TRADE_PARTNER] == DRAW_SELECTED_FINISH) { PrintIsThisTradeOkay(); sTradeMenu->callbackId = CB_INIT_CONFIRM_TRADE_PROMPT; } } static void CB_InitConfirmTradePrompt(void) { sTradeMenu->timer++; if (sTradeMenu->timer > 120) { CreateYesNoMenu(&sWindowTemplate_YesNo, FONT_NORMAL_COPY_2, 0, 2, 1, 14, 0); sTradeMenu->timer = 0; sTradeMenu->callbackId = CB_CONFIRM_TRADE_PROMPT; } } static void CB_HandleTradeCanceled(void) { int i; if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); rbox_fill_rectangle(0); rbox_fill_rectangle(1); for (i = 0; i < 4; i++) { FillWindowPixelBuffer(i + 14, PIXEL_FILL(0)); rbox_fill_rectangle(i + 14); } RedrawPartyWindow(TRADE_PLAYER); RedrawPartyWindow(TRADE_PARTNER); sTradeMenu->callbackId = CB_MAIN_MENU; gSprites[sTradeMenu->cursorSpriteId].invisible = FALSE; } } static void CB_InitExitCanceledTrade(void) { if (!gPaletteFade.active) { if (gWirelessCommType) SetLinkStandbyCallback(); else SetCloseLinkCallbackAndType(12); sTradeMenu->callbackId = CB_EXIT_CANCELED_TRADE; } } static void CB_ExitCanceledTrade(void) { if (gWirelessCommType) { if (IsLinkTaskFinished()) { Free(sMenuTextTileBuffer); Free(sTradeMenu); FreeAllWindowBuffers(); DestroyWirelessStatusIndicatorSprite(); SetMainCallback2(CB2_ReturnToFieldFromMultiplayer); } } else { if (!gReceivedRemoteLinkPlayers) { Free(sMenuTextTileBuffer); Free(sTradeMenu); FreeAllWindowBuffers(); SetMainCallback2(CB2_ReturnToFieldFromMultiplayer); } } } static void CB_WaitToStartRfuTrade(void) { if (!Rfu_SetLinkRecovery(FALSE)) { SetLinkStandbyCallback(); sTradeMenu->callbackId = CB_START_LINK_TRADE; } } static void RunTradeMenuCallback(void) { switch (sTradeMenu->callbackId) { case CB_MAIN_MENU: CB_ProcessMenuInput(); break; case CB_SELECTED_MON: CB_ProcessSelectedMonInput(); break; case CB_SHOW_MON_SUMMARY: CB_ShowTradeMonSummaryScreen(); break; case CB_CONFIRM_TRADE_PROMPT: CB_ProcessConfirmTradeInput(); break; case CB_CANCEL_TRADE_PROMPT: CB_ProcessCancelTradeInput(); break; case CB_READY_WAIT: // nop break; case CB_SET_SELECTED_MONS: CB_SetSelectedMons(); break; case CB_PRINT_IS_THIS_OKAY: CB_PrintIsThisTradeOkay(); break; case CB_HANDLE_TRADE_CANCELED: CB_HandleTradeCanceled(); break; case CB_FADE_TO_START_TRADE: CB_FadeToStartTrade(); break; case CB_WAIT_TO_START_TRADE: CB_WaitToStartTrade(); break; case CB_INIT_EXIT_CANCELED_TRADE: CB_InitExitCanceledTrade(); break; case CB_EXIT_CANCELED_TRADE: CB_ExitCanceledTrade(); break; case CB_START_LINK_TRADE: CB_StartLinkTrade(); break; case CB_INIT_CONFIRM_TRADE_PROMPT: CB_InitConfirmTradePrompt(); break; case CB_UNUSED_CLOSE_MSG: CB_ChooseMonAfterButtonPress(); break; case CB_WAIT_TO_START_RFU_TRADE: CB_WaitToStartRfuTrade(); break; } // CB_IDLE is nop } static void SetSelectedMon(u8 cursorPosition) { // cursorPosition 0-5 are the player's mons, 6-11 are the partner's u8 whichParty = cursorPosition / PARTY_SIZE; if (sTradeMenu->drawSelectedMonState[whichParty] == 0) { // Start the animation to display just the selected // pokemon in the middle of the screen sTradeMenu->drawSelectedMonState[whichParty] = 1; sTradeMenu->selectedMonIdx[whichParty] = cursorPosition; } } static void DrawSelectedMonScreen(u8 whichParty) { s8 nameStringWidth; u8 nickname[20]; u8 movesString[56]; u8 i; u8 partyIdx; u8 selectedMonParty; u8 selectedMonIdx = sTradeMenu->selectedMonIdx[whichParty]; selectedMonParty = TRADE_PARTNER; if (sTradeMenu->selectedMonIdx[whichParty] < PARTY_SIZE) selectedMonParty = TRADE_PLAYER; partyIdx = selectedMonIdx % PARTY_SIZE; nameStringWidth = 0; switch (sTradeMenu->drawSelectedMonState[whichParty]) { default: // Idle while state is 0, and once it reaches the final state (DRAW_SELECTED_FINISH) break; case 1: // Erase the rest of the party for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) gSprites[sTradeMenu->partySpriteIds[selectedMonParty][i]].invisible = TRUE; for (i = 0; i < PARTY_SIZE; i++) ClearWindowTilemap(i + (whichParty * PARTY_SIZE + 2)); // Re-display the selected pokemon gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].invisible = FALSE; // Move the selected pokemon to the center gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[0] = 20; gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[2] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[4] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12; StoreSpriteCallbackInData6(&gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]], SpriteCB_MonIcon); sTradeMenu->drawSelectedMonState[whichParty]++; Trade_MoveSelectedMonToTarget(&gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]]); CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, whichParty * 15, 0, 15, 17, 0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); if (selectedMonParty == TRADE_PLAYER) PrintTradePartnerPartyNicknames(); break; case 2: // Wait for the selected pokemon's sprite to move to the correct position if (gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].callback == SpriteCB_MonIcon) sTradeMenu->drawSelectedMonState[whichParty] = 3; break; case 3: // Redisplay the bg box CopyToBgTilemapBufferRect_ChangePalette(1, sTradeMovesBoxTilemap, selectedMonParty * 15, 0, 15, 17, 0); CopyBgTilemapBufferToVram(1); // Finalize the selected pokemon's position gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].x = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].y = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12; gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].x2 = 0; gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].y2 = 0; // Print selected pokemon's name and moves nameStringWidth = GetMonNicknameWidth(nickname, selectedMonParty, partyIdx); AddTextPrinterParameterized3((whichParty * 2) + 14, FONT_SMALL, (80 - nameStringWidth) / 2, 4, sTextColor_PartyMonNickname, 0, nickname); BufferMovesString(movesString, selectedMonParty, partyIdx); AddTextPrinterParameterized4((whichParty * 2) + 15, FONT_NORMAL_COPY_1, 0, 0, 0, 0, sTextColor_PartyMonNickname, 0, movesString); PutWindowTilemap((whichParty * 2) + 14); CopyWindowToVram((whichParty * 2) + 14, COPYWIN_FULL); PutWindowTilemap((whichParty * 2) + 15); CopyWindowToVram((whichParty * 2) + 15, COPYWIN_FULL); sTradeMenu->drawSelectedMonState[whichParty]++; break; case 4: PrintLevelAndGender(whichParty, partyIdx, sSelectedMonLevelGenderCoords[whichParty][0] + 4, sSelectedMonLevelGenderCoords[whichParty][1] + 1, sSelectedMonLevelGenderCoords[whichParty][0], sSelectedMonLevelGenderCoords[whichParty][1]); sTradeMenu->drawSelectedMonState[whichParty]++; break; } } static u8 GetMonNicknameWidth(u8 *dest, u8 whichParty, u8 partyIdx) { u8 nickname[POKEMON_NAME_LENGTH]; if (whichParty == TRADE_PLAYER) GetMonData(&gPlayerParty[partyIdx], MON_DATA_NICKNAME, nickname); else GetMonData(&gEnemyParty[partyIdx], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(dest, nickname); return GetStringWidth(FONT_SMALL, dest, GetFontAttribute(FONT_SMALL, FONTATTR_LETTER_SPACING)); } static void BufferMovesString(u8 *movesString, u8 whichParty, u8 partyIdx) { u16 moves[MAX_MON_MOVES]; u32 i; if (!sTradeMenu->isEgg[whichParty][partyIdx]) { for (i = 0; i < MAX_MON_MOVES; i++) { if (whichParty == TRADE_PLAYER) moves[i] = GetMonData(&gPlayerParty[partyIdx], i + MON_DATA_MOVE1, NULL); else moves[i] = GetMonData(&gEnemyParty[partyIdx], i + MON_DATA_MOVE1, NULL); } StringCopy(movesString, sText_Dummy); for (i = 0; i < MAX_MON_MOVES; i++) { if (moves[i] != MOVE_NONE) StringAppend(movesString, gMoveNames[moves[i]]); StringAppend(movesString, sText_Newline); } } else { StringCopy(movesString, sText_Dummy); StringAppend(movesString, gText_4Qmark); } } static void PrintPartyMonNickname(u8 whichParty, u8 windowId, const u8 *str) { u8 xPos; s8 speed; windowId += (whichParty * PARTY_SIZE) + 2; speed = 0; xPos = (64u - GetStringWidth(FONT_SMALL, str, GetFontAttribute(FONT_SMALL, FONTATTR_LETTER_SPACING))) / 2; AddTextPrinterParameterized3(windowId, FONT_SMALL, xPos, 4, sTextColor_PartyMonNickname, speed, str); PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); } static void PrintPartyNicknames(u8 whichParty) { u8 buff[20]; u8 nickname[30]; struct Pokemon * party = (whichParty == TRADE_PLAYER) ? gPlayerParty : gEnemyParty; u8 i; for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { GetMonData(&party[i], MON_DATA_NICKNAME, buff); StringCopy_Nickname(nickname, buff); PrintPartyMonNickname(whichParty, i, nickname); } } static void PrintLevelAndGender(u8 whichParty, u8 monIdx, u8 x, u8 y, u8 winLeft, u8 winTop) { u8 level; u32 symbolTile; u8 gender; u8 nickname[POKEMON_NAME_LENGTH]; CopyToBgTilemapBufferRect_ChangePalette(1, gTradeMenuMonBox_Tilemap, winLeft, winTop, 6, 3, 0); CopyBgTilemapBufferToVram(1); if (whichParty == TRADE_PLAYER) level = GetMonData(&gPlayerParty[monIdx], MON_DATA_LEVEL, NULL); else level = GetMonData(&gEnemyParty[monIdx], MON_DATA_LEVEL, NULL); if (!sTradeMenu->isEgg[whichParty][monIdx]) { if (level / 10 != 0) sTradeMenu->tilemapBuffer[x + (y * 32)] = (level / 10) + 0x60; sTradeMenu->tilemapBuffer[x + (y * 32) + 1] = (level % 10) + 0x70; } else { sTradeMenu->tilemapBuffer[x + (y * 32) - 32] = sTradeMenu->tilemapBuffer[x + (y * 32) - 33]; sTradeMenu->tilemapBuffer[x + (y * 32) - 31] = sTradeMenu->tilemapBuffer[x + (y * 32) - 36] | 0x400; } if (sTradeMenu->isEgg[whichParty][monIdx]) { symbolTile = 0x480; } else { if (whichParty == TRADE_PLAYER) { gender = GetMonGender(&gPlayerParty[monIdx]); GetMonData(&gPlayerParty[monIdx], MON_DATA_NICKNAME, nickname); } else { gender = GetMonGender(&gEnemyParty[monIdx]); GetMonData(&gEnemyParty[monIdx], MON_DATA_NICKNAME, nickname); } switch (gender) { case MON_MALE: symbolTile = !NameHasGenderSymbol(nickname, MON_MALE) ? 0x84 : 0x83; break; case MON_FEMALE: symbolTile = !NameHasGenderSymbol(nickname, MON_FEMALE) ? 0x85 : 0x83; break; default: symbolTile = 0x83; break; } } sTradeMenu->tilemapBuffer[(y - 1) * 32 + x + 1] = symbolTile; } static void PrintPartyLevelsAndGenders(u8 whichParty) { s32 i; for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { s32 j = i + PARTY_SIZE * whichParty; PrintLevelAndGender( whichParty, i, sTradeMonLevelCoords[j][0], sTradeMonLevelCoords[j][1], sTradeMonBoxCoords[j][0], sTradeMonBoxCoords[j][1] ); } } static void ShowTradePartyMonIcons(u8 whichParty) { int i; for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { gSprites[sTradeMenu->partySpriteIds[whichParty][i]].invisible = FALSE; gSprites[sTradeMenu->partySpriteIds[whichParty][i]].x = sTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][0] * 8 + 14; gSprites[sTradeMenu->partySpriteIds[whichParty][i]].y = sTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][1] * 8 - 12; gSprites[sTradeMenu->partySpriteIds[whichParty][i]].x2 = 0; gSprites[sTradeMenu->partySpriteIds[whichParty][i]].y2 = 0; } } static void PrintTradePartnerPartyNicknames(void) { rbox_fill_rectangle(1); PrintPartyNicknames(1); } // Returning to the party selection screen from the "is this trade ok?" screen static void RedrawPartyWindow(u8 whichParty) { CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, 15 * whichParty, 0, 15, 17, 0); CopyBgTilemapBufferToVram(1); PrintPartyLevelsAndGenders(whichParty); PrintPartyNicknames(whichParty); ShowTradePartyMonIcons(whichParty); DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], (void *)OBJ_VRAM0 + 32 * sTradeMenu->bottomTextTileStart, 24); sTradeMenu->drawSelectedMonState[whichParty] = 0; } static void Task_DrawSelectionSummary(u8 taskId) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); } static void Task_DrawSelectionTrade(u8 taskId) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); } static void QueueAction(u16 delay, u8 actionId) { int i; for (i = 0; i < (int)ARRAY_COUNT(sTradeMenu->queuedActions); i++) { // Find first available spot if (!sTradeMenu->queuedActions[i].active) { sTradeMenu->queuedActions[i].delay = delay; sTradeMenu->queuedActions[i].actionId = actionId; sTradeMenu->queuedActions[i].active = TRUE; break; } } } static void DoQueuedActions(void) { int i; for (i = 0; i < (int)ARRAY_COUNT(sTradeMenu->queuedActions); i++) { if (sTradeMenu->queuedActions[i].active) { if (sTradeMenu->queuedActions[i].delay != 0) { sTradeMenu->queuedActions[i].delay--; } else { switch (sTradeMenu->queuedActions[i].actionId) { case QUEUE_SEND_DATA: SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); break; case QUEUE_STANDBY: PrintTradeMessage(MSG_STANDBY); break; case QUEUE_ONLY_MON1: PrintTradeMessage(MSG_ONLY_MON1); break; case QUEUE_ONLY_MON2: case QUEUE_UNUSED1: case QUEUE_UNUSED2: PrintTradeMessage(MSG_ONLY_MON2); break; case QUEUE_MON_CANT_BE_TRADED: PrintTradeMessage(MSG_MON_CANT_BE_TRADED); break; case QUEUE_EGG_CANT_BE_TRADED: PrintTradeMessage(MSG_EGG_CANT_BE_TRADED); break; case QUEUE_FRIENDS_MON_CANT_BE_TRADED: PrintTradeMessage(MSG_FRIENDS_MON_CANT_BE_TRADED); break; } sTradeMenu->queuedActions[i].active = FALSE; } } } } static void PrintTradeMessage(u8 messageId) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized(0, FONT_NORMAL_COPY_2, sMessages[messageId], 0, 2, TEXT_SKIP_DRAW, NULL); DrawTextBorderOuter(0, 0x014, 12); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); } static bool8 LoadUISpriteGfx(void) { struct SpriteSheet sheet; if (sTradeMenu->timer < NUM_MENU_TEXT_SPRITES) { sheet.data = sMenuTextTileBuffers[sTradeMenu->timer]; sheet.size = 0x100; sheet.tag = GFXTAG_MENU_TEXT + sTradeMenu->timer; } switch (sTradeMenu->timer) { case GFXTAG_PLAYER_NAME_L: case GFXTAG_PLAYER_NAME_M: case GFXTAG_PLAYER_NAME_R: case GFXTAG_PARTNER_NAME_L: case GFXTAG_PARTNER_NAME_M: case GFXTAG_PARTNER_NAME_R: case GFXTAG_CANCEL_L: case GFXTAG_CANCEL_R: LoadSpriteSheet(&sheet); sTradeMenu->timer++; break; case GFXTAG_CHOOSE_PKMN_L: sTradeMenu->bottomTextTileStart = LoadSpriteSheet(&sheet); sTradeMenu->timer++; break; case GFXTAG_CHOOSE_PKMN_M: case GFXTAG_CHOOSE_PKMN_R: case GFXTAG_CHOOSE_PKMN_EMPTY_1: case GFXTAG_CHOOSE_PKMN_EMPTY_2: case GFXTAG_CHOOSE_PKMN_EMPTY_3: LoadSpriteSheet(&sheet); sTradeMenu->timer++; break; case NUM_MENU_TEXT_SPRITES: LoadSpritePalette(&sSpritePalette_MenuText); sTradeMenu->timer++; break; case NUM_MENU_TEXT_SPRITES + 1: LoadSpritePalette(&sCursor_SpritePalette); sTradeMenu->timer++; break; case NUM_MENU_TEXT_SPRITES + 2: LoadSpriteSheet(&sCursor_SpriteSheet); sTradeMenu->timer++; break; case NUM_MENU_TEXT_SPRITES + 3: sTradeMenu->timer = 0; return TRUE; } return FALSE; } static void DrawBottomRowText(const u8 *name, u8 *dest, u8 unused) { DrawTextWindowAndBufferTiles(name, dest, 0, 0, gDecompressionBuffer, 6); } static void ComputePartyTradeableFlags(u8 whichParty) { int i; switch (whichParty) { case TRADE_PLAYER: for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) == TRUE) { sTradeMenu->isLiveMon[whichParty][i] = FALSE; sTradeMenu->isEgg[whichParty][i] = TRUE; } else if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) { sTradeMenu->isLiveMon[whichParty][i] = FALSE; sTradeMenu->isEgg[whichParty][i] = FALSE; } else { sTradeMenu->isLiveMon[whichParty][i] = TRUE; sTradeMenu->isEgg[whichParty][i] = FALSE; } } break; case TRADE_PARTNER: for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { if (GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG) == TRUE) { sTradeMenu->isLiveMon[whichParty][i] = FALSE; sTradeMenu->isEgg[whichParty][i] = TRUE; } else if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) { sTradeMenu->isLiveMon[whichParty][i] = FALSE; sTradeMenu->isEgg[whichParty][i] = FALSE; } else { sTradeMenu->isLiveMon[whichParty][i] = TRUE; sTradeMenu->isEgg[whichParty][i] = FALSE; } } break; } } static void ComputePartyHPBarLevels(u8 whichParty) { u16 i, curHp, maxHp; switch (whichParty) { case TRADE_PLAYER: for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++) { curHp = GetMonData(&gPlayerParty[i], MON_DATA_HP); maxHp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); sTradeMenu->hpBarLevels[TRADE_PLAYER][i] = GetHPBarLevel(curHp, maxHp); } break; case TRADE_PARTNER: for (i = 0; i < sTradeMenu->partyCounts[TRADE_PARTNER]; i++) { curHp = GetMonData(&gEnemyParty[i], MON_DATA_HP); maxHp = GetMonData(&gEnemyParty[i], MON_DATA_MAX_HP); sTradeMenu->hpBarLevels[TRADE_PARTNER][i] = GetHPBarLevel(curHp, maxHp); } break; } } static void SetTradePartyHPBarSprites(void) { int i, j; for (i = 0; i < 2; i++) { for (j = 0; j < sTradeMenu->partyCounts[i]; j++) SetPartyHPBarSprite(&gSprites[sTradeMenu->partySpriteIds[i][j]], 4 - sTradeMenu->hpBarLevels[i][j]); } } static void SaveTradeGiftRibbons(void) { int i; for (i = 0; i < (int)ARRAY_COUNT(sTradeMenu->giftRibbons); i++) { if (gSaveBlock1Ptr->giftRibbons[i] == 0 && sTradeMenu->giftRibbons[i] != 0) gSaveBlock1Ptr->giftRibbons[i] = sTradeMenu->giftRibbons[i]; } } static u32 CanTradeSelectedMon(struct Pokemon * playerParty, int partyCount, int monIdx) { int i, numMonsLeft; struct LinkPlayer * partner; int species[PARTY_SIZE]; int species2[PARTY_SIZE]; for (i = 0; i < partyCount; i++) { species2[i] = GetMonData(&playerParty[i], MON_DATA_SPECIES_OR_EGG); species[i] = GetMonData(&playerParty[i], MON_DATA_SPECIES); } // Prevents trading species higher than Gen 3's max if (species2[monIdx] > SPECIES_EGG) return CANT_TRADE_INVALID_MON; partner = &gLinkPlayers[GetMultiplayerId() ^ 1]; if ((partner->version & 0xFF) != VERSION_RUBY && (partner->version & 0xFF) != VERSION_SAPPHIRE) { // Does partner not have National Dex if (!(partner->progressFlagsCopy & 0xF)) { if (species2[monIdx] == SPECIES_EGG) return CANT_TRADE_PARTNER_EGG_YET; if (species2[monIdx] > KANTO_SPECIES_END) return CANT_TRADE_INVALID_MON; } } if (species[monIdx] == SPECIES_DEOXYS || species[monIdx] == SPECIES_MEW) { if (!GetMonData(&playerParty[monIdx], MON_DATA_MODERN_FATEFUL_ENCOUNTER)) return CANT_TRADE_INVALID_MON; } // Make Eggs not count for numMonsLeft for (i = 0; i < partyCount; i++) { if (species2[i] == SPECIES_EGG) species2[i] = SPECIES_NONE; } // Count alive mons in party, excluding selected trade mon for (numMonsLeft = 0, i = 0; i < partyCount; i++) { if (i != monIdx) numMonsLeft += species2[i]; } if (numMonsLeft != 0) return CAN_TRADE_MON; else return CANT_TRADE_LAST_MON; } s32 GetGameProgressForLinkTrade(void) { s32 versionId; // 0: FRLG, 1: RS, 2: Emerald (or anything else) u16 version; if (gReceivedRemoteLinkPlayers) { versionId = 0; version = (gLinkPlayers[GetMultiplayerId() ^ 1].version & 0xFF); if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN) versionId = 0; else if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) versionId = 1; else versionId = 2; // If trading with RSE, both players must have progessed the story enough if (versionId > 0) { // Has player finished the Sevii Islands if (gLinkPlayers[GetMultiplayerId()].progressFlagsCopy & 0xF0) { if (versionId == 2) { // Is RSE partner champion if (gLinkPlayers[GetMultiplayerId() ^ 1].progressFlagsCopy & 0xF0) return TRADE_BOTH_PLAYERS_READY; else return TRADE_PARTNER_NOT_READY; } } else { return TRADE_PLAYER_NOT_READY; } } } return TRADE_BOTH_PLAYERS_READY; } static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isModernFatefulEncounter) { if (species == SPECIES_DEOXYS || species == SPECIES_MEW) { if (!isModernFatefulEncounter) return TRUE; } return FALSE; } int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct RfuGameCompatibilityData partner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, bool8 isModernFatefulEncounter) { bool8 playerHasNationalDex = player.hasNationalDex; bool8 playerCanLinkNationally = player.canLinkNationally; bool8 partnerHasNationalDex = partner.hasNationalDex; bool8 partnerCanLinkNationally = partner.canLinkNationally; u8 partnerVersion = partner.version; bool8 isNotFRLG; if (partnerVersion == VERSION_FIRE_RED || partnerVersion == VERSION_LEAF_GREEN) isNotFRLG = FALSE; else isNotFRLG = TRUE; // If partner is not using FRLG, both players must have progressed the story // to a certain point (becoming champion in RSE, finishing the Sevii islands in FRLG) if (isNotFRLG) { if (!playerCanLinkNationally) return UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_1; else if (!partnerCanLinkNationally) return UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2; } // Cannot trade illegitimate Deoxys/Mew if (IsDeoxysOrMewUntradable(playerSpecies, isModernFatefulEncounter)) return UR_TRADE_MSG_MON_CANT_BE_TRADED_2; if (partnerSpecies == SPECIES_EGG) { // If partner is trading an Egg then the player must also be trading an Egg if (playerSpecies2 != partnerSpecies) return UR_TRADE_MSG_NOT_EGG; } else { // Player's Pokémon must be of the type the partner requested if (gSpeciesInfo[playerSpecies2].types[0] != requestedType && gSpeciesInfo[playerSpecies2].types[1] != requestedType) return UR_TRADE_MSG_NOT_MON_PARTNER_WANTS; } // If the player is trading an Egg then the partner must also be trading an Egg // Odd that this wasn't checked earlier, as by this point we know either the partner doesn't have an Egg or that both do. if (playerSpecies2 == SPECIES_EGG && playerSpecies2 != partnerSpecies) return UR_TRADE_MSG_MON_CANT_BE_TRADED_1; // If the player doesn't have the National Dex then Eggs and non-Kanto Pokémon can't be traded if (!playerHasNationalDex) { if (playerSpecies2 == SPECIES_EGG) return UR_TRADE_MSG_EGG_CANT_BE_TRADED; if (playerSpecies2 > KANTO_SPECIES_END) return UR_TRADE_MSG_MON_CANT_BE_TRADED_2; if (partnerSpecies > KANTO_SPECIES_END) return UR_TRADE_MSG_PARTNERS_MON_CANT_BE_TRADED; } // If the partner doesn't have the National Dex then the player's offer has to be a Kanto Pokémon if (!partnerHasNationalDex && playerSpecies2 > KANTO_SPECIES_END) return UR_TRADE_MSG_PARTNER_CANT_ACCEPT_MON; // Trade is allowed return UR_TRADE_MSG_NONE; } int CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData player, u16 species2, u16 species, bool8 isModernFatefulEncounter) { bool8 hasNationalDex = player.hasNationalDex; if (IsDeoxysOrMewUntradable(species, isModernFatefulEncounter)) return CANT_REGISTER_MON; if (hasNationalDex) return CAN_REGISTER_MON; // Eggs can only be traded if the player has the National Dex if (species2 == SPECIES_EGG) return CANT_REGISTER_EGG; if (species2 > KANTO_SPECIES_END && species2 != SPECIES_EGG) return CANT_REGISTER_MON; return CAN_REGISTER_MON; } ================================================ FILE: src/trade_scene.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "util.h" #include "decompress.h" #include "trade.h" #include "link.h" #include "link_rfu.h" #include "mystery_gift.h" #include "graphics.h" #include "strings.h" #include "menu.h" #include "data.h" #include "battle.h" #include "battle_setup.h" #include "script.h" #include "event_data.h" #include "mail.h" #include "mail_data.h" #include "pokeball.h" #include "evolution_scene.h" #include "overworld.h" #include "field_fadetransition.h" #include "quest_log.h" #include "help_system.h" #include "new_menu_helpers.h" #include "pokedex.h" #include "save.h" #include "load_save.h" #include "random.h" #include "trade_scene.h" #include "constants/items.h" #include "constants/easy_chat.h" #include "constants/songs.h" #include "constants/region_map_sections.h" #include "constants/moves.h" // Values for signaling to/from the link partner enum { STATUS_NONE, STATUS_READY, STATUS_CANCEL, }; enum { GFXTAG_LINK_MON_GLOW = 5550, PALTAG_LINK_MON, GFXTAG_LINK_MON_SHADOW, TAG_UNUSED, GFXTAG_CABLE_END, PALTAG_GBA, GFXTAG_GBA_SCREEN, GFXTAG_POKEBALL, PALTAG_POKEBALL, }; struct InGameTrade { /*0x00*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; /*0x0C*/ u16 species; /*0x0E*/ u8 ivs[NUM_STATS]; /*0x14*/ u8 abilityNum; /*0x18*/ u32 otId; /*0x1C*/ u8 conditions[CONTEST_CATEGORIES_COUNT]; /*0x24*/ u32 personality; /*0x28*/ u16 heldItem; /*0x2A*/ u8 mailNum; /*0x2B*/ u8 otName[11]; /*0x36*/ u8 otGender; /*0x37*/ u8 sheen; /*0x38*/ u16 requestedSpecies; }; struct { /*0x00*/ struct Pokemon tempMon; // Used as a temp variable when swapping Pokémon /*0x64*/ u32 timer; /*0x68*/ u32 monPersonalities[2]; /*0x70*/ u8 filler_70[2]; /*0x72*/ u8 playerFinishStatus; /*0x73*/ u8 partnerFinishStatus; /*0x74*/ u16 linkData[10]; /*0x88*/ u8 linkTimeoutCheck1; /*0x89*/ u8 linkTimeoutCheck2; /*0x8A*/ u16 linkTimeoutTimer; /*0x8C*/ u16 neverRead_8C; /*0x8E*/ u8 monSpriteIds[2]; /*0x90*/ u8 connectionSpriteId1; // Multi-purpose sprite ids used during the transfer sequence /*0x91*/ u8 connectionSpriteId2; /*0x92*/ u8 cableEndSpriteId; /*0x93*/ u8 scheduleLinkTransfer; /*0x94*/ u16 state; /*0x96*/ u8 filler_96[0xD2 - 0x96]; /*0xD2*/ u8 releasePokeballSpriteId; /*0xD3*/ u8 bouncingPokeballSpriteId; /*0xD4*/ u16 bg2texX; /*0xD6*/ u16 bg2texY; /*0xD8*/ u16 neverRead_D8; /*0xDA*/ u16 neverRead_DA; /*0xDC*/ u16 bg2srcX; /*0xDE*/ u16 bg2srcY; /*0xE0*/ s16 bg1vofs; /*0xE2*/ s16 bg1hofs; /*0xE4*/ s16 bg2vofs; /*0xE6*/ s16 bg2hofs; /*0xE8*/ u16 sXY; /*0xEA*/ u16 bg2Zoom; /*0xEC*/ u16 bg2alpha; /*0xEE*/ bool8 isLinkTrade; /*0xF0*/ u16 monSpecies[2]; /*0xF4*/ u16 cachedMapMusic; /*0xF6*/ u8 unk_F6; /*0xF8*/ struct QuestLogEvent_Traded questLogData; /*0x104*/ u8 textColor[3]; /*0x107*/ u8 filler_107[1]; /*0x108*/ bool8 isCableTrade; /*0x109*/ u8 win0left; /*0x10A*/ u8 win0top; /*0x10B*/ u8 win0right; /*0x10C*/ u8 win0bottom; } static EWRAM_DATA * sTradeAnim = NULL; static void SpriteCB_LinkMonGlow(struct Sprite *sprite); static void SpriteCB_LinkMonGlowWireless(struct Sprite *sprite); static void SpriteCB_LinkMonShadow(struct Sprite *sprite); static void SpriteCB_CableEndSending(struct Sprite *sprite); static void SpriteCB_CableEndReceiving(struct Sprite *sprite); static void SpriteCB_GbaScreen(struct Sprite *sprite); static void TradeAnimInit_LoadGfx(void); static void CB2_InGameTrade(void); static void SetTradeSequenceBgGpuRegs(u8 idx); static void LoadTradeGbaSpriteGfx(void); static void TradeBufferOTnameAndNicknames(void); static u8 DoTradeAnim(void); static u8 DoTradeAnim_Cable(void); static u8 DoTradeAnim_Wireless(void); static void SpriteCB_BouncingPokeball(struct Sprite *sprite); static void SpriteCB_BouncingPokeballDepart(struct Sprite *sprite); static void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *sprite); static void SpriteCB_BouncingPokeballArrive(struct Sprite *sprite); static void BufferInGameTradeMonName(void); static void GetInGameTradeMail(struct Mail * mail, const struct InGameTrade * inGameTrade); static void CB2_UpdateLinkTrade(void); static void CB2_WaitTradeComplete(void); static void CB2_SaveAndEndTrade(void); static void CB2_FreeTradeAnim(void); static void Task_InGameTrade(u8 taskId); static void CheckPartnersMonForRibbons(void); static void Task_AnimateWirelessSignal(u8 taskId); static void Task_OpenCenterWhiteColumn(u8 taskId); static void Task_CloseCenterWhiteColumn(u8 taskId); static const u16 sPokeball_Pal[] = INCBIN_U16("graphics/trade/pokeball.gbapal"); static const u8 sPokeball_Gfx[] = INCBIN_U8("graphics/trade/pokeball.4bpp"); static const u8 sPokeballSymbol_Gfx[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); // Unused static const u16 sCableCloseup_Map[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); static const u16 sPokeballSymbol_Map[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); static const u16 sUnusedPal1[] = INCBIN_U16("graphics/trade/unused1.gbapal"); static const u16 sGba_Pal[] = INCBIN_U16("graphics/trade/gba.gbapal"); static const u16 sShadowPalette[] = INCBIN_U16("graphics/trade/shadow.gbapal"); static const u16 sBlackPalette[] = INCBIN_U16("graphics/trade/black.gbapal"); static const u16 sLinkMon_Pal[] = INCBIN_U16("graphics/trade/link_mon.gbapal"); static const u8 sLinkMonGlow_Gfx[] = INCBIN_U8("graphics/trade/link_mon_glow.4bpp"); static const u8 sLinkMonShadow_Gfx[] = INCBIN_U8("graphics/trade/link_mon_shadow.4bpp"); static const u8 sCableEnd_Gfx[] = INCBIN_U8("graphics/trade/cable_end.4bpp"); static const u8 sGbaScreen_Gfx[] = INCBIN_U8("graphics/trade/gba_screen.4bpp"); const u16 gTradeOrHatchMonShadowTilemap[] = INCBIN_U16("graphics/trade/shadow_map.bin"); static const u8 sGbaAffine_Gfx[] = INCBIN_U8("graphics/trade/gba_affine.8bpp"); static const u8 sEmptyGfx[64] = {}; static const u8 sGbaAffineMapCable[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin"); static const u8 sGbaAffineMapWireless[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); static const u16 sGbaMapWireless[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); static const u16 sGbaMapCable[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); static const u32 sWirelessCloseup_Map[] = INCBIN_U32("graphics/trade/wireless_signal_closeup.bin.lz"); static const u16 sWirelessSignalAnimPals_Outbound[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal"); static const u16 sWirelessSignalAnimPals_Inbound[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal"); static const u16 sWirelessSignalAnimPals_Off[] = INCBIN_U16("graphics/trade/black.gbapal"); static const u32 sWirelessSignal4bpp[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz"); static const u32 sWirelessSignalTilemap[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz"); static const struct OamData sOamData_Pokeball = { .affineMode = ST_OAM_AFFINE_NORMAL, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16) }; static const union AnimCmd sAnim_Pokeball_SpinOnce[] = { ANIMCMD_FRAME( 0, 3), ANIMCMD_FRAME( 4, 3), ANIMCMD_FRAME( 8, 3), ANIMCMD_FRAME(12, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(20, 3), ANIMCMD_FRAME(24, 3), ANIMCMD_FRAME(28, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(36, 3), ANIMCMD_FRAME(40, 3), ANIMCMD_FRAME(44, 3), ANIMCMD_LOOP(1), ANIMCMD_FRAME( 0, 3), ANIMCMD_END }; static const union AnimCmd sAnim_Pokeball_SpinTwice[] = { ANIMCMD_FRAME( 0, 3), ANIMCMD_FRAME( 4, 3), ANIMCMD_FRAME( 8, 3), ANIMCMD_FRAME(12, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(20, 3), ANIMCMD_FRAME(24, 3), ANIMCMD_FRAME(28, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(36, 3), ANIMCMD_FRAME(40, 3), ANIMCMD_FRAME(44, 3), ANIMCMD_LOOP(2), ANIMCMD_FRAME( 0, 3), ANIMCMD_END }; static const union AnimCmd *const sAnims_Pokeball[] = { sAnim_Pokeball_SpinOnce, sAnim_Pokeball_SpinTwice }; static const union AffineAnimCmd sAffineAnim_Pokeball_Normal[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Pokeball_Squish[] = { AFFINEANIMCMD_FRAME(-8, 0, 0, 20), AFFINEANIMCMD_END }; static const union AffineAnimCmd sAffineAnim_Pokeball_Unsquish[] = { AFFINEANIMCMD_FRAME(96, 256, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 0, 5), AFFINEANIMCMD_FRAME(8, 0, 0, 20), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnims_Pokeball[] = { sAffineAnim_Pokeball_Normal, sAffineAnim_Pokeball_Squish, sAffineAnim_Pokeball_Unsquish }; static const struct SpriteSheet sPokeBallSpriteSheet = { .data = sPokeball_Gfx, .size = sizeof(sPokeball_Gfx), .tag = GFXTAG_POKEBALL }; static const struct SpritePalette sTradeBallSpritePal = { .data = sPokeball_Pal, .tag = PALTAG_POKEBALL }; static const struct SpriteTemplate sSpriteTemplate_Pokeball = { .tileTag = GFXTAG_POKEBALL, .paletteTag = PALTAG_POKEBALL, .oam = &sOamData_Pokeball, .anims = sAnims_Pokeball, .affineAnims = sAffineAnims_Pokeball, .callback = SpriteCB_BouncingPokeball }; static const struct OamData sOamData_LinkMonGlow = { .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .priority = 1 }; static const union AnimCmd sAnim_LinkMonGlow[] = { ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), // ? The graphic is a perfect circle, no need to flip ANIMCMD_END }; static const union AnimCmd *const sAnims_LinkMonGlow[] = { sAnim_LinkMonGlow }; static const union AffineAnimCmd sAffineAnim_LinkMonGlow[] = { AFFINEANIMCMD_FRAME(-10, -10, 0, 5), AFFINEANIMCMD_FRAME( 10, 10, 0, 5), AFFINEANIMCMD_JUMP(0) }; static const union AffineAnimCmd *const sAffineAnims_LinkMonGlow[] = { sAffineAnim_LinkMonGlow }; static const struct SpriteSheet sSpriteSheet_LinkMonGlow = { .data = sLinkMonGlow_Gfx, .size = sizeof(sLinkMonGlow_Gfx), .tag = GFXTAG_LINK_MON_GLOW }; static const struct SpritePalette sSpritePalette_LinkMon = { .data = sLinkMon_Pal, .tag = PALTAG_LINK_MON }; static const struct SpritePalette sSpritePalette_Gba = { .data = sGba_Pal, .tag = PALTAG_GBA }; static const struct SpriteTemplate sSpriteTemplate_LinkMonGlow = { .tileTag = GFXTAG_LINK_MON_GLOW, .paletteTag = PALTAG_LINK_MON, .oam = &sOamData_LinkMonGlow, .anims = sAnims_LinkMonGlow, .affineAnims = sAffineAnims_LinkMonGlow, .callback = SpriteCB_LinkMonGlow }; static const struct OamData sOamData_LinkMonShadow = { .shape = SPRITE_SHAPE(16x32), .size = SPRITE_SIZE(16x32), .priority = 1 }; static const union AnimCmd sAnim_LinkMonShadow_Big[] = { ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_END }; static const union AnimCmd sAnim_LinkMonShadow_Small[] = { ANIMCMD_FRAME(8, 5, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_END }; enum { ANIM_LINKMON_BIG, ANIM_LINKMON_SMALL, }; static const union AnimCmd *const sAnims_LinkMonShadow[] = { [ANIM_LINKMON_BIG] = sAnim_LinkMonShadow_Big, [ANIM_LINKMON_SMALL] = sAnim_LinkMonShadow_Small, }; static const struct SpriteSheet sSpriteSheet_LinkMonShadow = { .data = sLinkMonShadow_Gfx, .size = 0x300, .tag = GFXTAG_LINK_MON_SHADOW }; static const struct SpriteTemplate sSpriteTemplate_LinkMonShadow = { .tileTag = GFXTAG_LINK_MON_SHADOW, .paletteTag = PALTAG_LINK_MON, .oam = &sOamData_LinkMonShadow, .anims = sAnims_LinkMonShadow, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_LinkMonShadow }; static const struct OamData sOamData_CableEnd = { .shape = SPRITE_SHAPE(16x32), .size = SPRITE_SIZE(16x32), .priority = 1 }; static const union AnimCmd sAnim_CableEnd[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_END }; static const union AnimCmd *const sAnims_CableEnd[] = { sAnim_CableEnd }; static const struct SpriteSheet sSpriteSheet_CableEnd = { .data = sCableEnd_Gfx, .size = 0x100, .tag = GFXTAG_CABLE_END }; static const struct SpriteTemplate sSpriteTemplate_CableEnd = { .tileTag = GFXTAG_CABLE_END, .paletteTag = PALTAG_GBA, .oam = &sOamData_CableEnd, .anims = sAnims_CableEnd, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_CableEndSending }; static const struct OamData sOamData_GbaScreen = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; static const union AnimCmd sAnim_GbaScreen_Long[] = { ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(96, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_LOOP(8), ANIMCMD_END }; static const union AnimCmd sAnim_GbaScreen_Short[] = { ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(96, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_LOOP(2), ANIMCMD_END }; static const union AnimCmd *const sAnims_GbaScreen_Long[] = { sAnim_GbaScreen_Long }; static const union AnimCmd *const sAnims_GbaScreen_Short[] = { sAnim_GbaScreen_Short }; static const struct SpriteSheet sTradeGBAScreenSpriteSheet = { .data = sGbaScreen_Gfx, .size = sizeof(sGbaScreen_Gfx), .tag = GFXTAG_GBA_SCREEN }; static const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Long = { .tileTag = GFXTAG_GBA_SCREEN, .paletteTag = PALTAG_GBA, .oam = &sOamData_GbaScreen, .anims = sAnims_GbaScreen_Long, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_GbaScreen }; static const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Short = { .tileTag = GFXTAG_GBA_SCREEN, .paletteTag = PALTAG_GBA, .oam = &sOamData_GbaScreen, .anims = sAnims_GbaScreen_Short, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_GbaScreen }; static const u16 sLinkMonShadow_Pal[] = { RGB(18, 24, 31), RGB(18, 24, 31), RGB(18, 24, 31), RGB(31, 31, 31), RGB(31, 31, 31), RGB(31, 31, 31), RGB(18, 24, 31), RGB(18, 24, 31), RGB(18, 24, 31), RGB(31, 31, 31), RGB(31, 31, 31), RGB(31, 31, 31) }; static const union AffineAnimCmd sAffineAnim_CrossingMonPic[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_JUMP(0) }; static const union AffineAnimCmd *const sAffineAnims_CrossingMonPics[] = { sAffineAnim_CrossingMonPic }; #include "data/ingame_trades.h" static const struct WindowTemplate sTradeMessageWindowTemplates[] = { { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 0, .baseBlock = 0x040 }, DUMMY_WIN_TEMPLATE }; const struct WindowTemplate gTradeEvolutionSceneYesNoWindowTemplate = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 9, .width = 6, .height = 4, .paletteNum = 15, .baseBlock = 0x0bc }; static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 5, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = 2, .charBaseIndex = 1, .mapBaseIndex = 18, .screenSize = 1, .paletteMode = 0, .priority = 2, .baseTile = 0x000 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 6, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x000 } }; static const s8 sTradeBallVerticalVelocityTable[] = { 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, -4, -3, -3, -2, -2, -1, -1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 2, 2, 3, 3, 4, -4, -3, -2, -1, -1, -1, 0, 0, 0, 0, 1, 0, 1, 1, 2, 3 }; static const u8 sWirelessSignalAnimParams[][2] = { {0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 2}, {6, 2}, {7, 2}, {8, 2}, {9, 2}, {10, 3}, {11, 3}, {12, 3}, {13, 4}, {14, 5}, {15, 2}, {0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 2}, {6, 2}, {7, 2}, {8, 2}, {9, 2}, {10, 3}, {11, 3}, {12, 3}, {13, 4}, {14, 5}, {16, 1}, {16, -1} }; static void SpriteCB_LinkMonGlow(struct Sprite *sprite) { if (++sprite->data[0] == 10) { PlaySE(SE_BALL); sprite->data[0] = 0; } } static void SpriteCB_LinkMonGlowWireless(struct Sprite *sprite) { if (!sprite->invisible && ++sprite->data[0] == 10) { PlaySE(SE_M_SWAGGER2); sprite->data[0] = 0; } } // Palette flash for trade glow core static void SpriteCB_LinkMonShadow(struct Sprite *sprite) { if (sprite->data[1] == 0) { if (++sprite->data[0] == 12) sprite->data[0] = 0; LoadPalette(&sLinkMonShadow_Pal[sprite->data[0]], OBJ_PLTT_ID2(sprite->oam.paletteNum) + 4, PLTT_SIZEOF(1)); } } // Move cable down offscreen static void SpriteCB_CableEndSending(struct Sprite *sprite) { sprite->data[0]++; sprite->y2++; if (sprite->data[0] == 10) DestroySprite(sprite); } // Move cable up onscreen static void SpriteCB_CableEndReceiving(struct Sprite *sprite) { sprite->data[0]++; sprite->y2--; if (sprite->data[0] == 10) DestroySprite(sprite); } static void SpriteCB_GbaScreen(struct Sprite *sprite) { if (++sprite->data[0] == 15) { PlaySE(SE_M_MINIMIZE); sprite->data[0] = 0; } } static void SetTradeBGAffine(void) { struct BgAffineDstData affine; DoBgAffineSet(&affine, sTradeAnim->bg2texX * 0x100, sTradeAnim->bg2texY * 0x100, sTradeAnim->bg2srcX, sTradeAnim->bg2srcY, sTradeAnim->sXY, sTradeAnim->sXY, sTradeAnim->bg2alpha); SetGpuReg(REG_OFFSET_BG2PA, affine.pa); SetGpuReg(REG_OFFSET_BG2PB, affine.pb); SetGpuReg(REG_OFFSET_BG2PC, affine.pc); SetGpuReg(REG_OFFSET_BG2PD, affine.pd); SetGpuReg(REG_OFFSET_BG2X, affine.dx); SetGpuReg(REG_OFFSET_BG2Y, affine.dy); } static void SetTradeGpuRegs(void) { u16 dispcnt; SetGpuReg(REG_OFFSET_BG1VOFS, sTradeAnim->bg1vofs); SetGpuReg(REG_OFFSET_BG1HOFS, sTradeAnim->bg1hofs); dispcnt = GetGpuReg(REG_OFFSET_DISPCNT); if ((dispcnt & 7) == DISPCNT_MODE_0) { SetGpuReg(REG_OFFSET_BG2VOFS, sTradeAnim->bg2vofs); SetGpuReg(REG_OFFSET_BG2HOFS, sTradeAnim->bg2hofs); } else { SetTradeBGAffine(); } } static void VBlankCB_TradeAnim(void) { SetTradeGpuRegs(); LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } static void ClearLinkTimeoutTimer(void) { sTradeAnim->linkTimeoutTimer = 0; sTradeAnim->linkTimeoutCheck1 = 0; sTradeAnim->linkTimeoutCheck2 = 0; } static void CheckLinkTimeout(void) { if (sTradeAnim->linkTimeoutCheck1 == sTradeAnim->linkTimeoutCheck2) sTradeAnim->linkTimeoutTimer++; else sTradeAnim->linkTimeoutTimer = 0; if (sTradeAnim->linkTimeoutTimer > 300) { CloseLink(); SetMainCallback2(CB2_LinkError); sTradeAnim->linkTimeoutTimer = 0; sTradeAnim->linkTimeoutCheck2 = 0; sTradeAnim->linkTimeoutCheck1 = 0; } sTradeAnim->linkTimeoutCheck2 = sTradeAnim->linkTimeoutCheck1; } static u32 TradeGetMultiplayerId(void) { if (gReceivedRemoteLinkPlayers) return GetMultiplayerId(); return 0; } static void LoadTradeMonPic(u8 whichParty, u8 state) { int pos = 0; struct Pokemon * mon = NULL; u16 species; u32 personality; if (whichParty == TRADE_PLAYER) { mon = &gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]]; pos = B_POSITION_OPPONENT_LEFT; } if (whichParty == TRADE_PARTNER) { mon = &gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE]; pos = B_POSITION_OPPONENT_RIGHT; } switch (state) { case 0: // Load graphics species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); personality = GetMonData(mon, MON_DATA_PERSONALITY); if (whichParty == TRADE_PLAYER) HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality); else HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[whichParty * 2 + 1], species, personality); LoadCompressedSpritePalette(GetMonSpritePalStruct(mon)); sTradeAnim->monSpecies[whichParty] = species; sTradeAnim->monPersonalities[whichParty] = personality; break; case 1: // Create sprite SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos); sTradeAnim->monSpriteIds[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); gSprites[sTradeAnim->monSpriteIds[whichParty]].invisible = TRUE; gSprites[sTradeAnim->monSpriteIds[whichParty]].callback = SpriteCallbackDummy; break; } } void CB2_LinkTrade(void) { switch (gMain.state) { case 0: if (!gReceivedRemoteLinkPlayers) { gLinkType = LINKTYPE_TRADE_DISCONNECTED; CloseLink(); } sTradeAnim = AllocZeroed(sizeof(*sTradeAnim)); AllocateMonSpritesGfx(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); SetVBlankCallback(VBlankCB_TradeAnim); TradeAnimInit_LoadGfx(); ClearLinkTimeoutTimer(); gMain.state++; sTradeAnim->neverRead_8C = 0; sTradeAnim->state = 0; sTradeAnim->isLinkTrade = TRUE; sTradeAnim->bg2texX = 64; sTradeAnim->bg2texY = 64; sTradeAnim->neverRead_D8 = 0; sTradeAnim->neverRead_DA = 0; sTradeAnim->bg2srcX = DISPLAY_WIDTH / 2; sTradeAnim->bg2srcY = DISPLAY_HEIGHT / 2; sTradeAnim->sXY = 256; sTradeAnim->bg2alpha = 0; break; case 1: if (!gReceivedRemoteLinkPlayers) { sTradeAnim->isCableTrade = TRUE; OpenLink(); gMain.state++; sTradeAnim->timer = 0; } else { gMain.state = 4; } break; case 2: if (++sTradeAnim->timer > 60) { sTradeAnim->timer = 0; gMain.state++; } break; case 3: if (IsLinkMaster()) { if (GetLinkPlayerCount_2() >= GetSavedPlayerCount()) { if (++sTradeAnim->timer > 30) { CheckShouldAdvanceLinkState(); gMain.state++; } } else { CheckLinkTimeout(); } } else { gMain.state++; } break; case 4: CheckLinkTimeout(); if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) gMain.state++; break; case 5: sTradeAnim->playerFinishStatus = 0; sTradeAnim->partnerFinishStatus = 0; sTradeAnim->scheduleLinkTransfer = 0; LoadTradeMonPic(TRADE_PLAYER, 0); gMain.state++; break; case 6: LoadTradeMonPic(TRADE_PLAYER, 1); gMain.state++; break; case 7: LoadTradeMonPic(TRADE_PARTNER, 0); gMain.state++; break; case 8: LoadTradeMonPic(TRADE_PARTNER, 1); LinkTradeDrawWindow(); gMain.state++; break; case 9: LoadTradeGbaSpriteGfx(); LoadSpriteSheet(&sPokeBallSpriteSheet); LoadSpritePalette(&sTradeBallSpritePal); gMain.state++; break; case 10: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); ShowBg(0); sTradeAnim->questLogData.speciesSent = GetMonData(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], MON_DATA_SPECIES_OR_EGG); sTradeAnim->questLogData.speciesReceived = GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_SPECIES_OR_EGG); memcpy(sTradeAnim->questLogData.partnerName, gLinkPlayers[GetMultiplayerId() ^ 1].name, PLAYER_NAME_LENGTH); gMain.state++; break; case 11: InitTradeSequenceBgGpuRegs(); TradeBufferOTnameAndNicknames(); gMain.state++; break; case 12: if (!gPaletteFade.active) { if (gWirelessCommType != 0) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } SetMainCallback2(CB2_UpdateLinkTrade); } break; } RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } void InitTradeSequenceBgGpuRegs(void) { SetTradeSequenceBgGpuRegs(5); SetTradeSequenceBgGpuRegs(0); } void LinkTradeDrawWindow(void) { FillWindowPixelBuffer(0, PIXEL_FILL(15)); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); } static void TradeAnimInit_LoadGfx(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(3, Alloc(BG_SCREEN_SIZE)); DeactivateAllTextPrinters(); // Doing the graphics load... DecompressAndLoadBgGfxUsingHeap(0, gBattleInterface_Textbox_Gfx, 0, 0, 0); LZDecompressWram(gBattleInterface_Textbox_Tilemap, gDecompressionBuffer); CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0); LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); InitWindows(sTradeMessageWindowTemplates); // ... and doing the same load again DecompressAndLoadBgGfxUsingHeap(0, gBattleInterface_Textbox_Gfx, 0, 0, 0); LZDecompressWram(gBattleInterface_Textbox_Tilemap, gDecompressionBuffer); CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0); LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); } static void CB2_InitInGameTrade(void) { u8 otName[11]; switch (gMain.state) { case 0: gSelectedTradeMonPositions[TRADE_PLAYER] = gSpecialVar_0x8005; gSelectedTradeMonPositions[TRADE_PARTNER] = PARTY_SIZE; StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); StringCopy(gLinkPlayers[1].name, otName); sTradeAnim = AllocZeroed(sizeof(*sTradeAnim)); AllocateMonSpritesGfx(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); SetVBlankCallback(VBlankCB_TradeAnim); TradeAnimInit_LoadGfx(); sTradeAnim->isLinkTrade = FALSE; sTradeAnim->neverRead_8C = 0; sTradeAnim->state = 0; sTradeAnim->bg2texX = 64; sTradeAnim->bg2texY = 64; sTradeAnim->neverRead_D8 = 0; sTradeAnim->neverRead_DA = 0; sTradeAnim->bg2srcX = DISPLAY_WIDTH / 2; sTradeAnim->bg2srcY = DISPLAY_HEIGHT / 2; sTradeAnim->sXY = 256; sTradeAnim->bg2alpha = 0; sTradeAnim->timer = 0; gMain.state = 5; break; case 5: LoadTradeMonPic(TRADE_PLAYER, 0); gMain.state++; break; case 6: LoadTradeMonPic(TRADE_PLAYER, 1); gMain.state++; break; case 7: LoadTradeMonPic(TRADE_PARTNER, 0); ShowBg(0); gMain.state++; break; case 8: LoadTradeMonPic(TRADE_PARTNER, 1); FillWindowPixelBuffer(0, PIXEL_FILL(15)); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); gMain.state++; break; case 9: LoadTradeGbaSpriteGfx(); LoadSpriteSheet(&sPokeBallSpriteSheet); LoadSpritePalette(&sTradeBallSpritePal); gMain.state++; break; case 10: ShowBg(0); gMain.state++; break; case 11: SetTradeSequenceBgGpuRegs(5); SetTradeSequenceBgGpuRegs(0); TradeBufferOTnameAndNicknames(); gMain.state++; break; case 12: SetMainCallback2(CB2_InGameTrade); break; } RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void UpdatePokedexForReceivedMon(u8 partyIdx) { struct Pokemon * mon = &gPlayerParty[partyIdx]; if (!GetMonData(mon, MON_DATA_IS_EGG)) { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); species = SpeciesToNationalPokedexNum(species); GetSetPokedexFlag(species, FLAG_SET_SEEN); HandleSetPokedexFlag(species, FLAG_SET_CAUGHT, personality); } } static void TryEnableNationalDexFromLinkPartner(void) { u8 mpId = GetMultiplayerId(); // Originally in Ruby but commented out /*if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000) EnableNationalPokedex();*/ } static void TradeMons(u8 playerPartyIdx, u8 partnerPartyIdx) { u8 friendship; u16 maxHP; // Get whether the offered Pokemon have mail struct Pokemon * playerMon = &gPlayerParty[playerPartyIdx]; u16 playerMail = GetMonData(playerMon, MON_DATA_MAIL); struct Pokemon * partnerMon = &gEnemyParty[partnerPartyIdx]; u16 partnerMail = GetMonData(partnerMon, MON_DATA_MAIL); // The mail attached to the sent Pokemon no longer exists in your file. if (playerMail != MAIL_NONE) ClearMailStruct(&gSaveBlock1Ptr->mail[playerMail]); SWAP(*playerMon, *partnerMon, sTradeAnim->tempMon); // By default, a Pokemon received from a trade will have 70 Friendship. // Eggs use Friendship to track egg cycles, so don't set this on Eggs. friendship = 70; if (!GetMonData(playerMon, MON_DATA_IS_EGG)) SetMonData(playerMon, MON_DATA_FRIENDSHIP, &friendship); // Associate your partner's mail with the Pokemon they sent over. if (partnerMail != MAIL_NONE) GiveMailToMon2(playerMon, &gLinkPartnerMail[partnerMail]); UpdatePokedexForReceivedMon(playerPartyIdx); if (gReceivedRemoteLinkPlayers) TryEnableNationalDexFromLinkPartner(); //fixing Pomeg glitched Pokemon coming in from partner maxHP = GetMonData(playerMon, MON_DATA_MAX_HP); if(GetMonData(playerMon, MON_DATA_HP) > maxHP) { SetMonData(playerMon, MON_DATA_HP, &maxHP); } } static void HandleLinkDataSend(void) { switch (sTradeAnim->scheduleLinkTransfer) { case 1: if (IsLinkTaskFinished()) { SendBlock(BitmaskAllOtherLinkPlayers(), sTradeAnim->linkData, sizeof(sTradeAnim->linkData)); sTradeAnim->scheduleLinkTransfer++; } // fallthrough case 2: sTradeAnim->scheduleLinkTransfer = 0; break; } } static void CB2_InGameTrade(void) { DoTradeAnim(); RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void SetTradeSequenceBgGpuRegs(u8 state) { switch (state) { case 0: sTradeAnim->bg2vofs = 0; sTradeAnim->bg2hofs = 0xB4; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, BG_PLTT_ID(1), 3 * PLTT_SIZE_4BPP); DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000); DmaCopy16Defvars(3, gTradeOrHatchMonShadowTilemap, (void *)BG_SCREEN_ADDR(18), 0x1000); break; case 1: sTradeAnim->bg1hofs = 0; sTradeAnim->bg1vofs = 0x15C; SetGpuReg(REG_OFFSET_BG1VOFS, 0x15C); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT256x512); if (sTradeAnim->isCableTrade) { DmaCopy16Defvars(3, sGbaMapCable, (void *)BG_SCREEN_ADDR(5), 0x1000); } else { DmaCopy16Defvars(3, sGbaMapWireless, (void *)BG_SCREEN_ADDR(5), 0x1000); } DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(0), 0x1420, 0x1000); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); break; case 2: sTradeAnim->bg1vofs = 0; sTradeAnim->bg1hofs = 0; if (!sTradeAnim->isCableTrade) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); LZ77UnCompVram(sWirelessCloseup_Map, (void *)BG_SCREEN_ADDR(5)); BlendPalettes(0x000000008, 0x10, RGB_BLACK); } else { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); DmaCopy16Defvars(3, sCableCloseup_Map, (void *)BG_SCREEN_ADDR(5), 0x800); BlendPalettes(0x00000001, 0x10, RGB_BLACK); } break; case 3: LoadPalette(sWirelessSignalAnimPals_Off, BG_PLTT_ID(3), PLTT_SIZE_4BPP); LZ77UnCompVram(sWirelessSignal4bpp, BG_CHAR_ADDR(1)); LZ77UnCompVram(sWirelessSignalTilemap, BG_SCREEN_ADDR(18)); sTradeAnim->bg2vofs = 0x50; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); break; case 4: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_AFF128x128); sTradeAnim->bg2texX = 0x40; sTradeAnim->bg2texY = 0x5C; sTradeAnim->sXY = 0x20; sTradeAnim->bg2Zoom = 0x400; sTradeAnim->bg2alpha = 0; DmaCopyLarge16(3, sGbaAffine_Gfx, (void *)BG_CHAR_ADDR(1), 0x2840, 0x1000); if (sTradeAnim->isCableTrade) { DmaCopy16Defvars(3, sGbaAffineMapCable, (void *)BG_SCREEN_ADDR(18), 0x100); } else { DmaCopy16Defvars(3, sGbaAffineMapWireless, (void *)BG_SCREEN_ADDR(18), 0x100); } break; case 5: sTradeAnim->bg1vofs = 0; sTradeAnim->bg1hofs = 0; break; case 6: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_TXT256x256); sTradeAnim->bg2texX = 0x40; sTradeAnim->bg2texY = 0x5C; sTradeAnim->sXY = 0x100; sTradeAnim->bg2Zoom = 0x80; sTradeAnim->bg2srcX = 0x78; sTradeAnim->bg2srcY = 0x50; sTradeAnim->bg2alpha = 0; DmaCopyLarge16(3, sGbaAffine_Gfx, BG_CHAR_ADDR(1), 0x2840, 0x1000); if (sTradeAnim->isCableTrade) { DmaCopy16Defvars(3, sGbaAffineMapCable, (void *)BG_SCREEN_ADDR(18), 0x100); } else { DmaCopy16Defvars(3, sGbaAffineMapWireless, (void *)BG_SCREEN_ADDR(18), 0x100); } break; case 7: sTradeAnim->bg2vofs = 0; sTradeAnim->bg2hofs = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, BG_PLTT_ID(1), 3 * PLTT_SIZE_4BPP); DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000); DmaCopy16Defvars(3, gTradeOrHatchMonShadowTilemap, (void *)BG_SCREEN_ADDR(18), 0x1000); break; } } static void LoadTradeGbaSpriteGfx(void) { LoadSpriteSheet(&sSpriteSheet_LinkMonGlow); LoadSpriteSheet(&sSpriteSheet_LinkMonShadow); LoadSpriteSheet(&sSpriteSheet_CableEnd); LoadSpriteSheet(&sTradeGBAScreenSpriteSheet); LoadSpritePalette(&sSpritePalette_LinkMon); LoadSpritePalette(&sSpritePalette_Gba); } static void TradeBufferOTnameAndNicknames(void) { u8 nickname[20]; u8 mpId; const struct InGameTrade * inGameTrade; if (sTradeAnim->isLinkTrade) { mpId = GetMultiplayerId(); StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name); GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gStringVar3, nickname); GetMonData(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gStringVar2, nickname); } else { inGameTrade = &sInGameTrades[gSpecialVar_0x8004]; StringCopy(gStringVar1, inGameTrade->otName); StringCopy_Nickname(gStringVar3, inGameTrade->nickname); GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gStringVar2, nickname); } } // returns TRUE if it finished a link trade, FALSE if it finished an in-game trade or if sequence is still going static bool8 DoTradeAnim(void) { if (sTradeAnim->isCableTrade) return DoTradeAnim_Cable(); else return DoTradeAnim_Wireless(); } // Below are the states for the main switch in DoTradeAnim_Cable and DoTradeAnim_Wireless // When DoTradeAnim_Wireless has a unique version of a state used by DoTradeAnim_Cable, it adds the below modifier #define STATE_WIRELESS 100 enum { STATE_START, STATE_MON_SLIDE_IN, // 2-9 unused STATE_SEND_MSG = 10, STATE_BYE_BYE, STATE_POKEBALL_DEPART, STATE_POKEBALL_DEPART_WAIT, STATE_FADE_OUT_TO_GBA_SEND, // 15-19 unused STATE_WAIT_FADE_OUT_TO_GBA_SEND = 20, STATE_FADE_IN_TO_GBA_SEND, STATE_WAIT_FADE_IN_TO_GBA_SEND, STATE_GBA_ZOOM_OUT, STATE_GBA_FLASH_SEND, STATE_GBA_STOP_FLASH_SEND, STATE_PAN_AWAY_GBA, STATE_CREATE_LINK_MON_LEAVING, STATE_LINK_MON_TRAVEL_OUT, STATE_FADE_OUT_TO_CROSSING, STATE_WAIT_FADE_OUT_TO_CROSSING, STATE_FADE_IN_TO_CROSSING, STATE_WAIT_FADE_IN_TO_CROSSING, STATE_CROSSING_LINK_MONS_ENTER, STATE_CROSSING_BLEND_WHITE_1, STATE_CROSSING_BLEND_WHITE_2, STATE_CROSSING_BLEND_WHITE_3, STATE_CROSSING_CREATE_MON_PICS, STATE_CROSSING_MON_PICS_MOVE, STATE_CROSSING_LINK_MONS_EXIT, STATE_CREATE_LINK_MON_ARRIVING, STATE_FADE_OUT_TO_GBA_RECV, STATE_WAIT_FADE_OUT_TO_GBA_RECV, STATE_LINK_MON_TRAVEL_IN, STATE_PAN_TO_GBA, STATE_DESTROY_LINK_MON, STATE_LINK_MON_ARRIVED_DELAY, STATE_MOVE_GBA_TO_CENTER, STATE_GBA_FLASH_RECV, STATE_UNUSED, STATE_GBA_STOP_FLASH_RECV, STATE_GBA_ZOOM_IN, STATE_FADE_OUT_TO_NEW_MON, // 53-59 unused STATE_WAIT_FADE_OUT_TO_NEW_MON = 60, STATE_FADE_IN_TO_NEW_MON, STATE_WAIT_FADE_IN_TO_NEW_MON, STATE_POKEBALL_ARRIVE, STATE_FADE_POKEBALL_TO_NORMAL, STATE_POKEBALL_ARRIVE_WAIT, STATE_SHOW_NEW_MON, STATE_NEW_MON_MSG, STATE_TAKE_CARE_OF_MON, STATE_AFTER_NEW_MON_DELAY, STATE_CHECK_RIBBONS, STATE_END_LINK_TRADE, STATE_TRY_EVOLUTION, STATE_FADE_OUT_END, STATE_WAIT_FADE_OUT_END, // Special states STATE_GBA_FLASH_SEND_WIRELESS = STATE_GBA_FLASH_SEND + STATE_WIRELESS, STATE_GBA_STOP_FLASH_SEND_WIRELESS, STATE_WAIT_WIRELESS_SIGNAL_SEND, STATE_PAN_TO_GBA_WIRELESS = STATE_PAN_TO_GBA + STATE_WIRELESS, STATE_DESTROY_LINK_MON_WIRELESS, STATE_WAIT_WIRELESS_SIGNAL_RECV, STATE_DELAY_FOR_MON_ANIM = 167, STATE_LINK_MON_TRAVEL_OFFSCREEN = 200, STATE_WAIT_FOR_MON_CRY = 267, }; static bool8 DoTradeAnim_Cable(void) { u16 evoTarget; switch (sTradeAnim->state) { case STATE_START: gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 = -180; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PLAYER]].y_offset; sTradeAnim->state++; sTradeAnim->cachedMapMusic = GetCurrentMapMusic(); PlayNewMapMusic(MUS_EVOLUTION); break; case STATE_MON_SLIDE_IN: if (sTradeAnim->bg2hofs > 0) { // Sliding gSprites[sTradeAnim->monSpriteIds[0]].x2 += 3; sTradeAnim->bg2hofs -= 3; } else { // Pokémon has arrived onscreen gSprites[sTradeAnim->monSpriteIds[0]].x2 = 0; sTradeAnim->bg2hofs = 0; sTradeAnim->state = STATE_SEND_MSG; } break; case STATE_SEND_MSG: StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); DrawTextOnTradeWindow(0, gStringVar4, 0); if (sTradeAnim->monSpecies[TRADE_PLAYER] != SPECIES_EGG) PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PLAYER], 0); sTradeAnim->state = STATE_BYE_BYE; sTradeAnim->timer = 0; break; case STATE_BYE_BYE: if (++sTradeAnim->timer == 80) { sTradeAnim->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeAnim->monSpriteIds[TRADE_PLAYER], gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); sTradeAnim->state++; StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); DrawTextOnTradeWindow(0, gStringVar4, 0); } break; case STATE_POKEBALL_DEPART: if (gSprites[sTradeAnim->releasePokeballSpriteId].callback == SpriteCallbackDummy) { sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0); gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart; DestroySprite(&gSprites[sTradeAnim->releasePokeballSpriteId]); sTradeAnim->state++; } break; case STATE_POKEBALL_DEPART_WAIT: // The game waits here for the sprite to finish its animation sequence. break; case STATE_FADE_OUT_TO_GBA_SEND: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_GBA_SEND; break; case STATE_WAIT_FADE_OUT_TO_GBA_SEND: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(4); FillWindowPixelBuffer(0, PIXEL_FILL(15)); CopyWindowToVram(0, COPYWIN_FULL); sTradeAnim->state++; } break; case STATE_FADE_IN_TO_GBA_SEND: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeAnim->state++; break; case STATE_WAIT_FADE_IN_TO_GBA_SEND: if (!gPaletteFade.active) sTradeAnim->state = STATE_GBA_ZOOM_OUT; break; case STATE_GBA_ZOOM_OUT: if (sTradeAnim->bg2Zoom > 0x100) { sTradeAnim->bg2Zoom -= 0x34; } else { SetTradeSequenceBgGpuRegs(1); sTradeAnim->bg2Zoom = 0x80; sTradeAnim->state++; sTradeAnim->timer = 0; } sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom; break; case STATE_GBA_FLASH_SEND: if (++sTradeAnim->timer > 20) { SetTradeBGAffine(); sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0); sTradeAnim->state++; } break; case STATE_GBA_STOP_FLASH_SEND: if (gSprites[sTradeAnim->connectionSpriteId2].animEnded) { DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 4)); sTradeAnim->state++; } break; case STATE_PAN_AWAY_GBA: if (--sTradeAnim->bg1vofs == 316) sTradeAnim->state++; if (sTradeAnim->bg1vofs == 328) sTradeAnim->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0); break; case STATE_CREATE_LINK_MON_LEAVING: sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, 80, 3); sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, 80, 0); StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], ANIM_LINKMON_SMALL); sTradeAnim->state++; break; case STATE_LINK_MON_TRAVEL_OUT: if ((sTradeAnim->bg1vofs -= 2) == 166) sTradeAnim->state = STATE_LINK_MON_TRAVEL_OFFSCREEN; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); break; case STATE_LINK_MON_TRAVEL_OFFSCREEN: gSprites[sTradeAnim->connectionSpriteId1].y -= 2; gSprites[sTradeAnim->connectionSpriteId2].y -= 2; if (gSprites[sTradeAnim->connectionSpriteId1].y < -8) sTradeAnim->state = STATE_FADE_OUT_TO_CROSSING; break; case STATE_FADE_OUT_TO_CROSSING: BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_CROSSING; break; case STATE_WAIT_FADE_OUT_TO_CROSSING: if (!gPaletteFade.active) { DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(2); sTradeAnim->state++; } break; case STATE_FADE_IN_TO_CROSSING: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0); sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0); sTradeAnim->state++; break; case STATE_WAIT_FADE_IN_TO_CROSSING: if (!gPaletteFade.active) { PlaySE(SE_WARP_OUT); sTradeAnim->state++; } gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; break; case STATE_CROSSING_LINK_MONS_ENTER: gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -90) { gSprites[sTradeAnim->connectionSpriteId1].data[1] = 1; gSprites[sTradeAnim->connectionSpriteId2].data[1] = 1; sTradeAnim->state++; } break; case STATE_CROSSING_BLEND_WHITE_1: BlendPalettes(0x1, 16, RGB_WHITEALPHA); sTradeAnim->state++; break; case STATE_CROSSING_BLEND_WHITE_2: BlendPalettes(0x1, 0, RGB_WHITEALPHA); sTradeAnim->state++; break; case STATE_CROSSING_BLEND_WHITE_3: BlendPalettes(0x1, 16, RGB_WHITEALPHA); sTradeAnim->state++; break; case STATE_CROSSING_CREATE_MON_PICS: if (!IsMonSpriteNotFlipped(sTradeAnim->monSpecies[TRADE_PLAYER])) { gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; CalcCenterToCornerVec(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE); StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0); } else { StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0); } StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0); gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x = 60; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 180; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y = 192; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = -32; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = FALSE; sTradeAnim->state++; break; case STATE_CROSSING_MON_PICS_MOVE: gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 -= 3; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 += 3; if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -DISPLAY_HEIGHT && gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 >= -DISPLAY_HEIGHT - 3) { PlaySE(SE_WARP_IN); } if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -222) { gSprites[sTradeAnim->connectionSpriteId1].data[1] = 0; gSprites[sTradeAnim->connectionSpriteId2].data[1] = 0; sTradeAnim->state++; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = TRUE; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = TRUE; BlendPalettes(0x1, 0, RGB_WHITEALPHA); } break; case STATE_CROSSING_LINK_MONS_EXIT: gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -222) { BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); sTradeAnim->state++; DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); } break; case STATE_CREATE_LINK_MON_ARRIVING: if (!gPaletteFade.active) { sTradeAnim->state++; SetTradeSequenceBgGpuRegs(1); sTradeAnim->bg1vofs = 166; sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, -20, 3); sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, -20, 0); StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], ANIM_LINKMON_SMALL); } break; case STATE_FADE_OUT_TO_GBA_RECV: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeAnim->state++; break; case STATE_WAIT_FADE_OUT_TO_GBA_RECV: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) sTradeAnim->state++; break; case STATE_LINK_MON_TRAVEL_IN: gSprites[sTradeAnim->connectionSpriteId1].y2 += 3; gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; if (gSprites[sTradeAnim->connectionSpriteId1].y2 + gSprites[sTradeAnim->connectionSpriteId1].y == 64) sTradeAnim->state++; break; case STATE_PAN_TO_GBA: if ((sTradeAnim->bg1vofs += 2) > 316) { sTradeAnim->bg1vofs = 316; sTradeAnim->state++; } break; case STATE_DESTROY_LINK_MON: DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); sTradeAnim->state++; sTradeAnim->timer = 0; break; case STATE_LINK_MON_ARRIVED_DELAY: if (++sTradeAnim->timer == 10) sTradeAnim->state++; break; case STATE_MOVE_GBA_TO_CENTER: if (++sTradeAnim->bg1vofs > 348) { sTradeAnim->bg1vofs = 348; sTradeAnim->state++; } if (sTradeAnim->bg1vofs == 328 && sTradeAnim->isCableTrade) { sTradeAnim->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0); gSprites[sTradeAnim->cableEndSpriteId].callback = SpriteCB_CableEndReceiving; } break; case STATE_GBA_FLASH_RECV: sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0); sTradeAnim->state = STATE_GBA_STOP_FLASH_RECV; break; case STATE_GBA_STOP_FLASH_RECV: if (gSprites[sTradeAnim->connectionSpriteId2].animEnded) { DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(6); sTradeAnim->state++; PlaySE(SE_M_SAND_ATTACK); } break; case STATE_GBA_ZOOM_IN: if (sTradeAnim->bg2Zoom < 0x400) { sTradeAnim->bg2Zoom += 0x34; } else { sTradeAnim->bg2Zoom = 0x400; sTradeAnim->state++; } sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom; break; case STATE_FADE_OUT_TO_NEW_MON: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_NEW_MON; break; case STATE_WAIT_FADE_OUT_TO_NEW_MON: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(5); SetTradeSequenceBgGpuRegs(7); gPaletteFade.bufferTransferDisabled = TRUE; sTradeAnim->state++; } break; case STATE_FADE_IN_TO_NEW_MON: gPaletteFade.bufferTransferDisabled = FALSE; BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sTradeAnim->state++; break; case STATE_WAIT_FADE_IN_TO_NEW_MON: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) { sTradeAnim->state++; } break; case STATE_POKEBALL_ARRIVE: sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0); gSprites[sTradeAnim->bouncingPokeballSpriteId].data[3] = 74; gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive; StartSpriteAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 1); StartSpriteAffineAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 2); BlendPalettes(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 16, RGB_WHITEALPHA); sTradeAnim->state++; sTradeAnim->timer = 0; break; case STATE_FADE_POKEBALL_TO_NORMAL: BeginNormalPaletteFade(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); sTradeAnim->state++; break; case STATE_POKEBALL_ARRIVE_WAIT: if (gSprites[sTradeAnim->bouncingPokeballSpriteId].callback == SpriteCallbackDummy) { HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeAnim->monSpecies[TRADE_PARTNER]], gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT], sTradeAnim->monSpecies[TRADE_PARTNER], sTradeAnim->monPersonalities[TRADE_PARTNER]); sTradeAnim->state++; } break; case STATE_SHOW_NEW_MON: gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 120; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PARTNER]].y_offset + 60; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x2 = 0; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 = 0; StartSpriteAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0); CreatePokeballSpriteToReleaseMon(sTradeAnim->monSpriteIds[TRADE_PARTNER], gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); FreeSpriteOamMatrix(&gSprites[sTradeAnim->bouncingPokeballSpriteId]); DestroySprite(&gSprites[sTradeAnim->bouncingPokeballSpriteId]); sTradeAnim->state++; break; case STATE_NEW_MON_MSG: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); StringExpandPlaceholders(gStringVar4, gText_XSentOverY); DrawTextOnTradeWindow(0, gStringVar4, 0); sTradeAnim->state = STATE_DELAY_FOR_MON_ANIM; sTradeAnim->timer = 0; break; case STATE_DELAY_FOR_MON_ANIM: if (++sTradeAnim->timer > 60) { if (sTradeAnim->monSpecies[TRADE_PARTNER] != SPECIES_EGG) PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PARTNER], 0); sTradeAnim->state = STATE_WAIT_FOR_MON_CRY; sTradeAnim->timer = 0; } break; case STATE_WAIT_FOR_MON_CRY: if (IsCryFinished()) sTradeAnim->state = STATE_TAKE_CARE_OF_MON; break; case STATE_TAKE_CARE_OF_MON: if (++sTradeAnim->timer == 10) PlayFanfare(MUS_EVOLVED); if (sTradeAnim->timer == 250) { sTradeAnim->state++; StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); DrawTextOnTradeWindow(0, gStringVar4, 0); sTradeAnim->timer = 0; } break; case STATE_AFTER_NEW_MON_DELAY: if (++sTradeAnim->timer == 60) sTradeAnim->state++; break; case STATE_CHECK_RIBBONS: CheckPartnersMonForRibbons(); sTradeAnim->state++; break; case STATE_END_LINK_TRADE: if (sTradeAnim->isLinkTrade) return TRUE; else if (JOY_NEW(A_BUTTON)) sTradeAnim->state++; break; case STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution TradeMons(gSpecialVar_0x8005, 0); gCB2_AfterEvolution = CB2_InGameTrade; evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE); if (evoTarget != SPECIES_NONE) TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeAnim->monSpriteIds[1], gSelectedTradeMonPositions[TRADE_PLAYER]); sTradeAnim->state++; break; case STATE_FADE_OUT_END: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeAnim->state++; break; case STATE_WAIT_FADE_OUT_END: if (!gPaletteFade.active) { PlayNewMapMusic(sTradeAnim->cachedMapMusic); if (sTradeAnim) { FreeAllWindowBuffers(); Free(GetBgTilemapBuffer(3)); Free(GetBgTilemapBuffer(1)); Free(GetBgTilemapBuffer(0)); FreeMonSpritesGfx(); FREE_AND_SET_NULL(sTradeAnim); } SetMainCallback2(CB2_ReturnToField); BufferInGameTradeMonName(); HelpSystem_Enable(); } break; } return FALSE; } // Task data for Task_AnimateWirelessSignal #define tIdx data[0] #define tCounter data[1] #define tSignalComingBack data[2] static bool8 DoTradeAnim_Wireless(void) { u16 evoTarget; switch (sTradeAnim->state) { case STATE_START: gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 = -180; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PLAYER]].y_offset; sTradeAnim->state++; sTradeAnim->cachedMapMusic = GetCurrentMapMusic(); PlayNewMapMusic(MUS_EVOLUTION); break; case STATE_MON_SLIDE_IN: if (sTradeAnim->bg2hofs > 0) { gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 += 3; sTradeAnim->bg2hofs -= 3; } else { gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 = 0; sTradeAnim->bg2hofs = 0; sTradeAnim->state = STATE_SEND_MSG; } break; case STATE_SEND_MSG: StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); DrawTextOnTradeWindow(0, gStringVar4, 0); if (sTradeAnim->monSpecies[TRADE_PLAYER] != SPECIES_EGG) PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PLAYER], 0); sTradeAnim->state = STATE_BYE_BYE; sTradeAnim->timer = 0; break; case STATE_BYE_BYE: if (++sTradeAnim->timer == 80) { sTradeAnim->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeAnim->monSpriteIds[TRADE_PLAYER], gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); sTradeAnim->state++; StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); DrawTextOnTradeWindow(0, gStringVar4, 0); } break; case STATE_POKEBALL_DEPART: if (gSprites[sTradeAnim->releasePokeballSpriteId].callback == SpriteCallbackDummy) { sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0); gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart; DestroySprite(&gSprites[sTradeAnim->releasePokeballSpriteId]); sTradeAnim->state++; } break; case STATE_POKEBALL_DEPART_WAIT: // The game waits here for the sprite to finish its animation sequence. break; case STATE_FADE_OUT_TO_GBA_SEND: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_GBA_SEND; break; case STATE_WAIT_FADE_OUT_TO_GBA_SEND: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(4); FillWindowPixelBuffer(0, PIXEL_FILL(15)); CopyWindowToVram(0, COPYWIN_FULL); sTradeAnim->state++; } break; case STATE_FADE_IN_TO_GBA_SEND: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeAnim->state++; break; case STATE_WAIT_FADE_IN_TO_GBA_SEND: if (!gPaletteFade.active) sTradeAnim->state = STATE_GBA_ZOOM_OUT; break; case STATE_GBA_ZOOM_OUT: if (sTradeAnim->bg2Zoom > 0x100) { sTradeAnim->bg2Zoom -= 0x34; } else { SetTradeSequenceBgGpuRegs(1); sTradeAnim->bg2Zoom = 0x80; sTradeAnim->state = STATE_GBA_FLASH_SEND_WIRELESS; sTradeAnim->timer = 0; } sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom; break; case STATE_GBA_FLASH_SEND_WIRELESS: if (++sTradeAnim->timer > 20) { SetTradeSequenceBgGpuRegs(3); sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Short, 120, 80, 0); sTradeAnim->state++; } break; case STATE_GBA_STOP_FLASH_SEND_WIRELESS: if (gSprites[sTradeAnim->connectionSpriteId2].animEnded) { DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4)); // Start wireless signal effect CreateTask(Task_AnimateWirelessSignal, 5); sTradeAnim->state++; } break; case STATE_WAIT_WIRELESS_SIGNAL_SEND: if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) sTradeAnim->state = STATE_PAN_AWAY_GBA; break; case STATE_PAN_AWAY_GBA: if (--sTradeAnim->bg1vofs == 316) sTradeAnim->state++; break; case STATE_CREATE_LINK_MON_LEAVING: sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, 80, 3); gSprites[sTradeAnim->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless; sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, 80, 0); StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], ANIM_LINKMON_SMALL); sTradeAnim->state++; break; case STATE_LINK_MON_TRAVEL_OUT: if ((sTradeAnim->bg1vofs -= 3) == 166) sTradeAnim->state = STATE_LINK_MON_TRAVEL_OFFSCREEN; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); break; case STATE_LINK_MON_TRAVEL_OFFSCREEN: gSprites[sTradeAnim->connectionSpriteId1].y -= 2; gSprites[sTradeAnim->connectionSpriteId2].y -= 2; if (gSprites[sTradeAnim->connectionSpriteId1].y < -8) sTradeAnim->state = STATE_FADE_OUT_TO_CROSSING; break; case STATE_FADE_OUT_TO_CROSSING: BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_CROSSING; break; case STATE_WAIT_FADE_OUT_TO_CROSSING: if (!gPaletteFade.active) { DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(2); sTradeAnim->state++; } break; case STATE_FADE_IN_TO_CROSSING: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0); sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0); sTradeAnim->state++; break; case STATE_WAIT_FADE_IN_TO_CROSSING: if (!gPaletteFade.active) { PlaySE(SE_WARP_OUT); sTradeAnim->state++; } gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; break; case STATE_CROSSING_LINK_MONS_ENTER: gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -90) { gSprites[sTradeAnim->connectionSpriteId1].data[1] = 1; gSprites[sTradeAnim->connectionSpriteId2].data[1] = 1; sTradeAnim->state++; CreateTask(Task_OpenCenterWhiteColumn, 5); } break; case STATE_CROSSING_BLEND_WHITE_1: BlendPalettes(0x8, 16, RGB_WHITEALPHA); sTradeAnim->state++; break; case STATE_CROSSING_BLEND_WHITE_2: BlendPalettes(0x8, 16, RGB_WHITEALPHA); sTradeAnim->state++; break; case STATE_CROSSING_BLEND_WHITE_3: BlendPalettes(0x8, 16, RGB_WHITEALPHA); sTradeAnim->state++; break; case STATE_CROSSING_CREATE_MON_PICS: if (!IsMonSpriteNotFlipped(sTradeAnim->monSpecies[TRADE_PLAYER])) { gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; CalcCenterToCornerVec(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE); StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0); } else { StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0); } StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0); gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x = 40; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 200; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y = 192; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = -32; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = FALSE; sTradeAnim->state++; break; case STATE_CROSSING_MON_PICS_MOVE: gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 -= 3; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 += 3; if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -DISPLAY_HEIGHT && gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 >= -DISPLAY_HEIGHT - 3) { PlaySE(SE_WARP_IN); } if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -222) { gSprites[sTradeAnim->connectionSpriteId1].data[1] = 0; gSprites[sTradeAnim->connectionSpriteId2].data[1] = 0; sTradeAnim->state++; gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = TRUE; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = TRUE; CreateTask(Task_CloseCenterWhiteColumn, 5); } break; case STATE_CROSSING_LINK_MONS_EXIT: gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -222) { BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); sTradeAnim->state++; DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); } break; case STATE_CREATE_LINK_MON_ARRIVING: if (!gPaletteFade.active) { sTradeAnim->state++; SetTradeSequenceBgGpuRegs(1); sTradeAnim->bg1vofs = 166; SetTradeSequenceBgGpuRegs(3); sTradeAnim->bg2vofs = 412; sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, -20, 3); gSprites[sTradeAnim->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless; sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, -20, 0); StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], 1); } break; case STATE_FADE_OUT_TO_GBA_RECV: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeAnim->state++; break; case STATE_WAIT_FADE_OUT_TO_GBA_RECV: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) sTradeAnim->state++; break; case STATE_LINK_MON_TRAVEL_IN: gSprites[sTradeAnim->connectionSpriteId1].y2 += 4; gSprites[sTradeAnim->connectionSpriteId2].y2 += 4; if (gSprites[sTradeAnim->connectionSpriteId1].y2 + gSprites[sTradeAnim->connectionSpriteId1].y == 64) { sTradeAnim->state = STATE_PAN_TO_GBA_WIRELESS; sTradeAnim->timer = 0; } break; case STATE_PAN_TO_GBA_WIRELESS: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); sTradeAnim->bg1vofs += 3; sTradeAnim->bg2vofs += 3; if (++sTradeAnim->timer == 10) { u8 taskId = CreateTask(Task_AnimateWirelessSignal, 5); gTasks[taskId].tSignalComingBack = TRUE; } if (sTradeAnim->bg1vofs > 316) { sTradeAnim->bg1vofs = 316; sTradeAnim->state++; } break; case STATE_DESTROY_LINK_MON_WIRELESS: DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); sTradeAnim->state++; sTradeAnim->timer = 0; break; case STATE_WAIT_WIRELESS_SIGNAL_RECV: if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) { sTradeAnim->state = STATE_LINK_MON_ARRIVED_DELAY; sTradeAnim->timer = 0; } break; case STATE_LINK_MON_ARRIVED_DELAY: if (++sTradeAnim->timer == 10) sTradeAnim->state++; break; case STATE_MOVE_GBA_TO_CENTER: if (++sTradeAnim->bg1vofs > 348) { sTradeAnim->bg1vofs = 348; sTradeAnim->state++; } break; case STATE_GBA_FLASH_RECV: sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0); sTradeAnim->state = STATE_GBA_STOP_FLASH_RECV; break; case STATE_GBA_STOP_FLASH_RECV: if (gSprites[sTradeAnim->connectionSpriteId2].animEnded) { DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(6); sTradeAnim->state++; PlaySE(SE_M_SAND_ATTACK); } break; case STATE_GBA_ZOOM_IN: if (sTradeAnim->bg2Zoom < 0x400) { sTradeAnim->bg2Zoom += 0x34; } else { sTradeAnim->bg2Zoom = 0x400; sTradeAnim->state++; } sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom; break; case STATE_FADE_OUT_TO_NEW_MON: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeAnim->state = 60; break; case STATE_WAIT_FADE_OUT_TO_NEW_MON: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(5); SetTradeSequenceBgGpuRegs(7); gPaletteFade.bufferTransferDisabled = TRUE; sTradeAnim->state++; } break; case STATE_FADE_IN_TO_NEW_MON: gPaletteFade.bufferTransferDisabled = FALSE; BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sTradeAnim->state++; break; case STATE_WAIT_FADE_IN_TO_NEW_MON: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) sTradeAnim->state++; break; case STATE_POKEBALL_ARRIVE: sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0); gSprites[sTradeAnim->bouncingPokeballSpriteId].data[3] = 74; gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive; StartSpriteAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 1); StartSpriteAffineAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 2); BlendPalettes(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 16, RGB_WHITEALPHA); sTradeAnim->state++; sTradeAnim->timer = 0; break; case STATE_FADE_POKEBALL_TO_NORMAL: BeginNormalPaletteFade(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); sTradeAnim->state++; break; case STATE_POKEBALL_ARRIVE_WAIT: if (gSprites[sTradeAnim->bouncingPokeballSpriteId].callback == SpriteCallbackDummy) { HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeAnim->monSpecies[TRADE_PARTNER]], gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT], sTradeAnim->monSpecies[TRADE_PARTNER], sTradeAnim->monPersonalities[TRADE_PARTNER]); sTradeAnim->state++; } break; case STATE_SHOW_NEW_MON: gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 120; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PARTNER]].y_offset + 60; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x2 = 0; gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 = 0; StartSpriteAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0); CreatePokeballSpriteToReleaseMon(sTradeAnim->monSpriteIds[TRADE_PARTNER], gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); FreeSpriteOamMatrix(&gSprites[sTradeAnim->bouncingPokeballSpriteId]); DestroySprite(&gSprites[sTradeAnim->bouncingPokeballSpriteId]); sTradeAnim->state++; break; case STATE_NEW_MON_MSG: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); StringExpandPlaceholders(gStringVar4, gText_XSentOverY); DrawTextOnTradeWindow(0, gStringVar4, 0); sTradeAnim->state = STATE_DELAY_FOR_MON_ANIM; sTradeAnim->timer = 0; break; case STATE_DELAY_FOR_MON_ANIM: if (++sTradeAnim->timer > 60) { if (sTradeAnim->monSpecies[TRADE_PARTNER] != SPECIES_EGG) PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PARTNER], 0); sTradeAnim->state = STATE_WAIT_FOR_MON_CRY; sTradeAnim->timer = 0; } break; case STATE_WAIT_FOR_MON_CRY: if (IsCryFinished()) sTradeAnim->state = STATE_TAKE_CARE_OF_MON; break; case STATE_TAKE_CARE_OF_MON: if (++sTradeAnim->timer == 10) PlayFanfare(MUS_EVOLVED); if (sTradeAnim->timer == 250) { sTradeAnim->state++; StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); DrawTextOnTradeWindow(0, gStringVar4, 0); sTradeAnim->timer = 0; } break; case STATE_AFTER_NEW_MON_DELAY: if (++sTradeAnim->timer == 60) sTradeAnim->state++; break; case STATE_CHECK_RIBBONS: CheckPartnersMonForRibbons(); sTradeAnim->state++; break; case STATE_END_LINK_TRADE: if (sTradeAnim->isLinkTrade) return TRUE; else if (JOY_NEW(A_BUTTON)) sTradeAnim->state++; break; case STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution TradeMons(gSpecialVar_0x8005, 0); gCB2_AfterEvolution = CB2_InGameTrade; evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE); if (evoTarget != SPECIES_NONE) TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeAnim->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); sTradeAnim->state++; break; case STATE_FADE_OUT_END: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeAnim->state++; break; case STATE_WAIT_FADE_OUT_END: if (!gPaletteFade.active) { PlayNewMapMusic(sTradeAnim->cachedMapMusic); if (sTradeAnim) { FreeAllWindowBuffers(); Free(GetBgTilemapBuffer(3)); Free(GetBgTilemapBuffer(1)); Free(GetBgTilemapBuffer(0)); FreeMonSpritesGfx(); FREE_AND_SET_NULL(sTradeAnim); } SetMainCallback2(CB2_ReturnToField); BufferInGameTradeMonName(); HelpSystem_Enable(); } break; } return FALSE; } // Try to evolve a Pokémon received in a link trade // In-game trades resolve evolution during the trade sequence, in STATE_TRY_EVOLUTION static void CB2_TryLinkTradeEvolution(void) { u16 evoSpecies; switch (gMain.state) { case 0: gMain.state = 4; gSoftResetDisabled = TRUE; break; case 4: gCB2_AfterEvolution = CB2_SaveAndEndTrade; evoSpecies = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, 0); if (evoSpecies != SPECIES_NONE) TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoSpecies, sTradeAnim->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); else SetMainCallback2(CB2_SaveAndEndTrade); gSelectedTradeMonPositions[TRADE_PLAYER] = 0xFF; break; } if (!HasLinkErrorOccurred()) RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void HandleLinkDataReceive(void) { u8 recvStatus; TradeGetMultiplayerId(); // no effect call, ret val ignored recvStatus = GetBlockReceivedStatus(); if (recvStatus & (1 << 0)) { if (gBlockRecvBuffer[0][0] == LINKCMD_CONFIRM_FINISH_TRADE) SetMainCallback2(CB2_TryLinkTradeEvolution); if (gBlockRecvBuffer[0][0] == LINKCMD_READY_FINISH_TRADE) sTradeAnim->playerFinishStatus = STATUS_READY; ResetBlockReceivedFlag(0); } if (recvStatus & (1 << 1)) { if (gBlockRecvBuffer[1][0] == LINKCMD_READY_FINISH_TRADE) sTradeAnim->partnerFinishStatus = STATUS_READY; ResetBlockReceivedFlag(1); } } static void SpriteCB_BouncingPokeball(struct Sprite *sprite) { sprite->y += sprite->data[0] / 10; sprite->data[5] += sprite->data[1]; sprite->x = sprite->data[5] / 10; if (sprite->y > 76) { sprite->y = 76; sprite->data[0] = -(sprite->data[0] * sprite->data[2]) / 100; sprite->data[3]++; } if (sprite->x == 120) sprite->data[1] = 0; sprite->data[0] += sprite->data[4]; if (sprite->data[3] == 4) { sprite->data[7] = 1; sprite->callback = SpriteCallbackDummy; } } static void SpriteCB_BouncingPokeballDepart(struct Sprite *sprite) { sprite->y2 += sTradeBallVerticalVelocityTable[sprite->data[0]]; if (sprite->data[0] == 22) PlaySE(SE_BALL_BOUNCE_1); if (++sprite->data[0] == 44) { PlaySE(SE_M_MEGA_KICK); sprite->callback = SpriteCB_BouncingPokeballDepartEnd; sprite->data[0] = 0; BeginNormalPaletteFade(1 << (sprite->oam.paletteNum + 16), -1, 0, 16, RGB_WHITEALPHA); } } static void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *sprite) { if (sprite->data[1] == 20) StartSpriteAffineAnim(sprite, 1); if (++sprite->data[1] > 20) { sprite->y2 -= sTradeBallVerticalVelocityTable[sprite->data[0]]; if (++sprite->data[0] == 23) { DestroySprite(sprite); sTradeAnim->state = 14; } } } static void SpriteCB_BouncingPokeballArrive(struct Sprite *sprite) { if (sprite->data[2] == 0) { sprite->y += 4; if (sprite->y > sprite->data[3]) { sprite->data[2]++; sprite->data[0] = 22; PlaySE(SE_BALL_BOUNCE_1); } } else { if (sprite->data[0] == 66) PlaySE(SE_BALL_BOUNCE_2); if (sprite->data[0] == 92) PlaySE(SE_BALL_BOUNCE_3); if (sprite->data[0] == 107) PlaySE(SE_BALL_BOUNCE_4); sprite->y2 += sTradeBallVerticalVelocityTable[sprite->data[0]]; if (++sprite->data[0] == 108) sprite->callback = SpriteCallbackDummy; } } u16 GetInGameTradeSpeciesInfo(void) { // Populates gStringVar1 with the name of the requested species and // gStringVar2 with the name of the offered species. // Returns the requested species. const struct InGameTrade * inGameTrade = &sInGameTrades[gSpecialVar_0x8004]; if(gSpecialVar_0x8004 == INGAME_TRADE_LICKITUNG) { if(gSaveBlock1Ptr->keyFlags.version == 1) StringCopy(gStringVar1, gSpeciesNames[SPECIES_SLOWBRO]); else StringCopy(gStringVar1, gSpeciesNames[SPECIES_GOLDUCK]); } else StringCopy(gStringVar1, gSpeciesNames[inGameTrade->requestedSpecies]); StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); return inGameTrade->requestedSpecies; } static void BufferInGameTradeMonName(void) { // Populates gStringVar1 with the nickname of the sent Pokemon and // gStringVar2 with the name of the offered species. u8 nickname[30]; const struct InGameTrade * inGameTrade = &sInGameTrades[gSpecialVar_0x8004]; GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gStringVar1, nickname); StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); } static void CreateInGameTradePokemonInternal(u8 playerSlot, u8 inGameTradeIdx) { const struct InGameTrade * inGameTrade = &sInGameTrades[inGameTradeIdx]; u8 level = GetMonData(&gPlayerParty[playerSlot], MON_DATA_LEVEL); u16 hp = GetMonData(&gPlayerParty[playerSlot], MON_DATA_HP); struct Mail mail; u8 metLocation = METLOC_IN_GAME_TRADE; struct Pokemon * tradeMon = &gEnemyParty[0]; u8 mailNum; CreateMon(tradeMon, inGameTrade->species, level, USE_RANDOM_IVS, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); SetMonData(tradeMon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); SetMonData(tradeMon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); SetMonData(tradeMon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]); SetMonData(tradeMon, MON_DATA_SPEED_IV, &inGameTrade->ivs[3]); SetMonData(tradeMon, MON_DATA_SPATK_IV, &inGameTrade->ivs[4]); SetMonData(tradeMon, MON_DATA_SPDEF_IV, &inGameTrade->ivs[5]); SetMonData(tradeMon, MON_DATA_NICKNAME, inGameTrade->nickname); SetMonData(tradeMon, MON_DATA_OT_NAME, inGameTrade->otName); SetMonData(tradeMon, MON_DATA_OT_GENDER, &inGameTrade->otGender); SetMonData(tradeMon, MON_DATA_ABILITY_NUM, &inGameTrade->abilityNum); SetMonData(tradeMon, MON_DATA_BEAUTY, &inGameTrade->conditions[1]); SetMonData(tradeMon, MON_DATA_CUTE, &inGameTrade->conditions[2]); SetMonData(tradeMon, MON_DATA_COOL, &inGameTrade->conditions[0]); SetMonData(tradeMon, MON_DATA_SMART, &inGameTrade->conditions[3]); SetMonData(tradeMon, MON_DATA_TOUGH, &inGameTrade->conditions[4]); SetMonData(tradeMon, MON_DATA_SHEEN, &inGameTrade->sheen); SetMonData(tradeMon, MON_DATA_MET_LOCATION, &metLocation); if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1) { if(hp == 0) SetMonData(tradeMon, MON_DATA_HP, &hp); SetNuzlockeDupeFlags(inGameTrade->species); } mailNum = 0; if (inGameTrade->heldItem != ITEM_NONE) { if (ItemIsMail(inGameTrade->heldItem)) { GetInGameTradeMail(&mail, inGameTrade); gLinkPartnerMail[0] = mail; SetMonData(tradeMon, MON_DATA_MAIL, &mailNum); SetMonData(tradeMon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); } else { SetMonData(tradeMon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); } } CalculateMonStats(&gEnemyParty[0], FALSE); } static void GetInGameTradeMail(struct Mail * mail, const struct InGameTrade * inGameTrade) { int i; for (i = 0; i < MAIL_WORDS_COUNT; i++) mail->words[i] = sInGameTradeMailMessages[inGameTrade->mailNum][i]; StringCopy(mail->playerName, inGameTrade->otName); mail->trainerId[0] = inGameTrade->otId >> 24; mail->trainerId[1] = inGameTrade->otId >> 16; mail->trainerId[2] = inGameTrade->otId >> 8; mail->trainerId[3] = inGameTrade->otId; mail->species = inGameTrade->species; mail->itemId = inGameTrade->heldItem; } u16 GetTradeSpecies(void) { if (GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_IS_EGG)) return SPECIES_NONE; else return GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_SPECIES); } void CreateInGameTradePokemon(void) { CreateInGameTradePokemonInternal(gSpecialVar_0x8005, gSpecialVar_0x8004); } static void CB2_UpdateLinkTrade(void) { if (DoTradeAnim() == TRUE) { DestroySprite(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]]); FreeSpriteOamMatrix(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]]); TradeMons(gSelectedTradeMonPositions[TRADE_PLAYER], gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE); sTradeAnim->linkData[0] = LINKCMD_READY_FINISH_TRADE; sTradeAnim->scheduleLinkTransfer = 1; SetMainCallback2(CB2_WaitTradeComplete); } HandleLinkDataSend(); HandleLinkDataReceive(); RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void CB2_WaitTradeComplete(void) { u8 mpId = TradeGetMultiplayerId(); HandleLinkDataReceive(); if (mpId == 0 && sTradeAnim->playerFinishStatus == STATUS_READY && sTradeAnim->partnerFinishStatus == STATUS_READY) { sTradeAnim->linkData[0] = LINKCMD_CONFIRM_FINISH_TRADE; SendBlock(BitmaskAllOtherLinkPlayers(), sTradeAnim->linkData, sizeof(sTradeAnim->linkData)); sTradeAnim->playerFinishStatus = STATUS_CANCEL; sTradeAnim->partnerFinishStatus = STATUS_CANCEL; } RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void CB2_SaveAndEndTrade(void) { switch (gMain.state) { case 0: gMain.state++; StringExpandPlaceholders(gStringVar4, gText_CommunicationStandby5); DrawTextOnTradeWindow(0, gStringVar4, 0); break; case 1: SetLinkStandbyCallback(); gMain.state = 100; sTradeAnim->timer = 0; break; case 100: if (++sTradeAnim->timer > 180) { gMain.state = 101; sTradeAnim->timer = 0; } if (IsLinkTaskFinished()) gMain.state = 2; break; case 101: if (IsLinkTaskFinished()) gMain.state = 2; break; case 2: gMain.state = 50; StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffThePower2); DrawTextOnTradeWindow(0, gStringVar4, 0); break; case 50: if (InUnionRoom()) { SetQuestLogEvent(QL_EVENT_LINK_TRADED_UNION, (void *)&sTradeAnim->questLogData); } else { SetQuestLogEvent(QL_EVENT_LINK_TRADED, (void *)&sTradeAnim->questLogData); IncrementGameStat(GAME_STAT_POKEMON_TRADES); } if (gWirelessCommType) MysteryGift_TryIncrementStat(CARD_STAT_NUM_TRADES, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); SetContinueGameWarpStatusToDynamicWarp(); LinkFullSave_Init(); gMain.state++; sTradeAnim->timer = 0; break; case 51: if (++sTradeAnim->timer == 5) gMain.state++; break; case 52: if (LinkFullSave_WriteSector()) { ClearContinueGameWarpStatus2(); gMain.state = 4; } else { // Save isn't finished, delay again sTradeAnim->timer = 0; gMain.state = 51; } break; case 4: LinkFullSave_ReplaceLastSector(); gMain.state = 40; sTradeAnim->timer = 0; break; case 40: if (++sTradeAnim->timer > 50) { if (GetMultiplayerId() == 0) sTradeAnim->timer = Random() % 30; else sTradeAnim->timer = 0; gMain.state = 41; } break; case 41: if (sTradeAnim->timer == 0) { SetLinkStandbyCallback(); gMain.state = 42; } else { sTradeAnim->timer--; } break; case 42: if (IsLinkTaskFinished()) { LinkFullSave_SetLastSectorSignature(); gMain.state = 5; } break; case 5: if (++sTradeAnim->timer > 60) { gMain.state++; SetLinkStandbyCallback(); } break; case 6: if (IsLinkTaskFinished()) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gMain.state ++; } break; case 7: if (!gPaletteFade.active) { FadeOutBGM(3); gMain.state++; } break; case 8: if (IsBGMStopped() == TRUE) { if (gWirelessCommType && gMain.savedCallback == CB2_StartCreateTradeMenu) SetLinkStandbyCallback(); else SetCloseLinkCallback(); gMain.state++; } break; case 9: if (gWirelessCommType && gMain.savedCallback == CB2_StartCreateTradeMenu) { if (IsLinkRfuTaskFinished()) { gSoftResetDisabled = FALSE; SetMainCallback2(CB2_FreeTradeAnim); } } else if (!gReceivedRemoteLinkPlayers) { gSoftResetDisabled = FALSE; SetMainCallback2(CB2_FreeTradeAnim); } break; } if (!HasLinkErrorOccurred()) { RunTasks(); } AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void CB2_FreeTradeAnim(void) { if (!gPaletteFade.active) { FreeAllWindowBuffers(); Free(GetBgTilemapBuffer(3)); Free(GetBgTilemapBuffer(1)); Free(GetBgTilemapBuffer(0)); FreeMonSpritesGfx(); FREE_AND_SET_NULL(sTradeAnim); if (gWirelessCommType != 0) DestroyWirelessStatusIndicatorSprite(); SetMainCallback2(gMain.savedCallback); } RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } void DoInGameTradeScene(void) { LockPlayerFieldControls(); CreateTask(Task_InGameTrade, 10); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); HelpSystem_Disable(); } static void Task_InGameTrade(u8 taskId) { if (!gPaletteFade.active) { SetMainCallback2(CB2_InitInGameTrade); gFieldCallback = FieldCB_ContinueScriptHandleMusic; DestroyTask(taskId); } } static void CheckPartnersMonForRibbons(void) { u8 numRibbons = 0; u8 i; for (i = 0; i < (MON_DATA_UNUSED_RIBBONS - MON_DATA_CHAMPION_RIBBON); i++) numRibbons += GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_CHAMPION_RIBBON + i); if (numRibbons != 0) FlagSet(FLAG_SYS_RIBBON_GET); } void LoadTradeAnimGfx(void) { TradeAnimInit_LoadGfx(); } void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed) { FillWindowPixelBuffer(windowId, PIXEL_FILL(15)); sTradeAnim->textColor[0] = 15; sTradeAnim->textColor[1] = 1; sTradeAnim->textColor[2] = 6; AddTextPrinterParameterized4(windowId, FONT_NORMAL, 0, 2, 0, 2, sTradeAnim->textColor, speed, str); CopyWindowToVram(windowId, COPYWIN_FULL); } static void Task_AnimateWirelessSignal(u8 taskId) { s16 *data = gTasks[taskId].data; u16 paletteIdx = 16 * sWirelessSignalAnimParams[tIdx][0]; if (!tSignalComingBack) { if (paletteIdx == 0x100) LoadPalette(sWirelessSignalAnimPals_Off, BG_PLTT_ID(3), PLTT_SIZE_4BPP); else LoadPalette(&sWirelessSignalAnimPals_Outbound[paletteIdx], BG_PLTT_ID(3), PLTT_SIZE_4BPP); } else { if (paletteIdx == 0x100) LoadPalette(sWirelessSignalAnimPals_Off, BG_PLTT_ID(3), PLTT_SIZE_4BPP); else LoadPalette(&sWirelessSignalAnimPals_Inbound[paletteIdx], BG_PLTT_ID(3), PLTT_SIZE_4BPP); } if (sWirelessSignalAnimParams[tIdx][0] == 0 && tCounter == 0) PlaySE(SE_M_HEAL_BELL); if (tCounter == sWirelessSignalAnimParams[tIdx][1]) { tIdx++; tCounter = 0; if (sWirelessSignalAnimParams[tIdx][1] == 0xFF) DestroyTask(taskId); } else { tCounter++; } } #undef tIdx #undef tCounter #undef tSignalComingBack static void Task_OpenCenterWhiteColumn(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[0] == 0) { sTradeAnim->win0left = sTradeAnim->win0right = DISPLAY_WIDTH / 2; sTradeAnim->win0top = 0; sTradeAnim->win0bottom = DISPLAY_HEIGHT; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_OBJ); } SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeAnim->win0left, sTradeAnim->win0right)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeAnim->win0top, sTradeAnim->win0bottom)); data[0]++; sTradeAnim->win0left -= 5; sTradeAnim->win0right += 5; if (sTradeAnim->win0left < 80) DestroyTask(taskId); } static void Task_CloseCenterWhiteColumn(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[0] == 0) { sTradeAnim->win0left = 80; sTradeAnim->win0right = DISPLAY_WIDTH - 80; SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_OBJ); } SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeAnim->win0left, sTradeAnim->win0right)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeAnim->win0top, sTradeAnim->win0bottom)); if (sTradeAnim->win0left != DISPLAY_WIDTH / 2) { data[0]++; sTradeAnim->win0left += 5; sTradeAnim->win0right -= 5; if (sTradeAnim->win0left > DISPLAY_WIDTH / 2 - 5) BlendPalettes(0x8, 0, RGB_WHITEALPHA); } else { ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); DestroyTask(taskId); } } ================================================ FILE: src/trainer_card.c ================================================ #include "global.h" #include "gflib.h" #include "scanline_effect.h" #include "task.h" #include "link.h" #include "overworld.h" #include "menu.h" #include "event_data.h" #include "easy_chat.h" #include "money.h" #include "strings.h" #include "trainer_card.h" #include "pokedex.h" #include "pokemon_icon.h" #include "graphics.h" #include "help_system.h" #include "trainer_pokemon_sprites.h" #include "new_menu_helpers.h" #include "constants/songs.h" #include "constants/game_stat.h" #include "constants/trainers.h" // Trainer Card Strings enum { TRAINER_CARD_STRING_NAME = 0, TRAINER_CARD_STRING_HOF_TIME, TRAINER_CARD_STRING_LINK_RECORD, TRAINER_CARD_STRING_WIN_LOSS, TRAINER_CARD_STRING_LINK_WINS, TRAINER_CARD_STRING_LINK_LOSSES, TRAINER_CARD_STRING_TRADES, TRAINER_CARD_STRING_TRADE_COUNT, TRAINER_CARD_STRING_BERRY_CRUSH, TRAINER_CARD_STRING_BERRY_CRUSH_COUNT, TRAINER_CARD_STRING_UNION_ROOM, TRAINER_CARD_STRING_UNION_ROOM_NUM, TRAINER_CARD_STRING_COUNT, }; struct TrainerCardData { u8 mainState; u8 printState; u8 gfxLoadState; u8 bgPalLoadState; u8 flipDrawState; bool8 isLink; u8 timeColonBlinkTimer; bool8 timeColonInvisible; bool8 onBack; bool8 allowDMACopy; bool8 hasPokedex; bool8 hasHofResult; bool8 hasLinkResults; bool8 hasBattleTowerWins; bool8 var_E; bool8 var_F; bool8 hasTrades; bool8 hasBadge[NUM_BADGES]; u8 easyChatProfile[TRAINER_CARD_PROFILE_LENGTH][13]; u8 strings[TRAINER_CARD_STRING_COUNT][70]; u8 var_395; u16 monIconPals[16 * PARTY_SIZE]; s8 flipBlendY; u8 cardType; void (*callback2)(void); struct TrainerCard trainerCard; u16 frontTilemap[600]; u16 backTilemap[600]; u16 bgTilemap[600]; u8 badgeTiles[0x80 * NUM_BADGES]; u16 stickerTiles[0x100]; u16 cardTiles[0x1180]; u16 cardTilemapBuffer[0x1000]; u16 bgTilemapBuffer[0x1000]; u16 cardTop; bool8 timeColonNeedDraw; u8 language; }; /* size = 0x7BD0 */ // RAM EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0}; EWRAM_DATA static struct TrainerCardData *sTrainerCardDataPtr = NULL; // Function Declaration static void VBlankCB_TrainerCard(void); static void HBlankCB_TrainerCard(void); static void CB2_TrainerCard(void); static void CloseTrainerCard(u8 taskId); static void Task_TrainerCard(u8 taskId); static bool8 LoadCardGfx(void); static void CB2_InitTrainerCard(void); static u32 GetCappedGameStat(u8 statId, u32 maxValue); static u8 GetTrainerStarCount(struct TrainerCard *trainerCard); static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType); static void SetDataFromTrainerCard(void); static void HandleGpuRegs(void); static void UpdateCardFlipRegs(u16 cardTop); static void ResetGpuRegs(void); static void TrainerCardNull(void); static void DmaClearOam(void); static void DmaClearPltt(void); static void ResetBgRegs(void); static void InitBgsAndWindows(void); static void SetTrainerCardCB2(void); static void SetUpTrainerCardTask(void); static bool8 PrintAllOnCardFront(void); static bool8 PrintAllOnCardBack(void); static void BufferTextForCardBack(void); static void PrintNameOnCardFront(void); static void PrintIdOnCard(void); static void PrintMoneyOnCard(void); static u16 GetCaughtMonsCount(void); static void PrintPokedexOnCard(void); static void PrintTimeOnCard(void); static void PrintProfilePhraseOnCard(void); static void BufferNameForCardBack(void); static void PrintNameOnCardBack(void); static void BufferHofDebutTime(void); static void PrintHofDebutTimeOnCard(void); static void BufferLinkBattleResults(void); static void PrintLinkBattleResultsOnCard(void); static void BufferNumTrades(void); static void PrintTradesStringOnCard(void); static void BufferBerryCrushPoints(void); static void PrintBerryCrushStringOnCard(void); static void BufferUnionRoomStats(void); static void PrintUnionStringOnCard(void); static void PrintPokemonIconsOnCard(void); static void LoadMonIconGfx(void); static void PrintStickersOnCard(void); static void LoadStickerGfx(void); static void DrawTrainerCardWindow(u8 windowId); static bool8 SetTrainerCardBgsAndPals(void); static void DrawCardScreenBackground(const u16 *ptr); static void DrawCardFrontOrBack(const u16 *ptr); static void DrawStarsAndBadgesOnCard(void); static void DrawCardBackStats(void); static void BlinkTimeColon(void); static void FlipTrainerCard(void); static bool8 IsCardFlipTaskActive(void); static void Task_DoCardFlipTask(u8 taskId); static bool8 Task_BeginCardFlip(struct Task* task); static bool8 Task_AnimateCardFlipDown(struct Task* task); static bool8 Task_DrawFlippedCardSide(struct Task* task); static bool8 Task_SetCardFlipped(struct Task* task); static bool8 Task_AnimateCardFlipUp(struct Task* task); static bool8 Task_EndCardFlip(struct Task *task); static void InitTrainerCardData(void); static u8 GetCardType(void); static void CreateTrainerCardTrainerPic(void); static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/stickers.4bpp.lz"); static const u32 sHoennTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/rse/front.bin.lz"); static const u32 sKantoTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front.bin.lz"); static const u32 sHoennTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/rse/back.bin.lz"); static const u32 sKantoTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back.bin.lz"); static const u32 sHoennTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/rse/front_link.bin.lz"); static const u32 sKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link.bin.lz"); static const u32 sHoennTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/rse/bg.bin.lz"); static const u32 sKantoTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg.bin.lz"); static const u16 sUnused_Pal[] = INCBIN_U16("graphics/trainer_card/unused.gbapal"); static const u16 sHoennTrainerCardBronze_Pal[] = INCBIN_U16("graphics/trainer_card/rse/bronze.gbapal"); static const u16 sKantoTrainerCardGreen_Pal[] = INCBIN_U16("graphics/trainer_card/green.gbapal"); static const u16 sHoennTrainerCardCopper_Pal[] = INCBIN_U16("graphics/trainer_card/rse/copper.gbapal"); static const u16 sKantoTrainerCardBronze_Pal[] = INCBIN_U16("graphics/trainer_card/bronze.gbapal"); static const u16 sHoennTrainerCardSilver_Pal[] = INCBIN_U16("graphics/trainer_card/rse/silver.gbapal"); static const u16 sKantoTrainerCardSilver_Pal[] = INCBIN_U16("graphics/trainer_card/silver.gbapal"); static const u16 sHoennTrainerCardGold_Pal[] = INCBIN_U16("graphics/trainer_card/rse/gold.gbapal"); static const u16 sKantoTrainerCardGold_Pal[] = INCBIN_U16("graphics/trainer_card/gold.gbapal"); static const u16 sHoennTrainerCardFemaleBg_Pal[] = INCBIN_U16("graphics/trainer_card/rse/female_bg.gbapal"); static const u16 sKantoTrainerCardFemaleBg_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg.gbapal"); static const u16 sHoennTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/rse/badges.gbapal"); static const u16 sKantoTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); static const u16 sTrainerCardStar_Pal[] = INCBIN_U16("graphics/trainer_card/star.gbapal"); static const u16 sTrainerCardStickerPal1[] = INCBIN_U16("graphics/trainer_card/stickers1.gbapal"); static const u16 sTrainerCardStickerPal2[] = INCBIN_U16("graphics/trainer_card/stickers2.gbapal"); static const u16 sTrainerCardStickerPal3[] = INCBIN_U16("graphics/trainer_card/stickers3.gbapal"); static const u16 sTrainerCardStickerPal4[] = INCBIN_U16("graphics/trainer_card/stickers4.gbapal"); static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/rse/badges.4bpp.lz"); static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz"); static const struct BgTemplate sTrainerCardBgTemplates[4] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 27, .screenSize = 2, .paletteMode = 0, .priority = 2, .baseTile = 0 }, { .bg = 1, .charBaseIndex = 2, .mapBaseIndex = 29, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0 }, { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0 }, { .bg = 3, .charBaseIndex = 0, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 192 } }; static const struct WindowTemplate sTrainerCardWindowTemplates[4] = { { .bg = 1, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 15, .baseBlock = 0x241 }, { .bg = 1, .tilemapLeft = 1, .tilemapTop = 1, .width = 27, .height = 18, .paletteNum = 15, .baseBlock = 0x1 }, { .bg = 3, .tilemapLeft = 19, .tilemapTop = 5, .width = 9, .height = 10, .paletteNum = 8, .baseBlock = 0x150 }, DUMMY_WIN_TEMPLATE }; static const u16 *const sHoennTrainerCardPals[] = { gHoennTrainerCardGreen_Pal, // Default (0 stars) sHoennTrainerCardBronze_Pal, // 1 star sHoennTrainerCardCopper_Pal, // 2 stars sHoennTrainerCardSilver_Pal, // 3 stars sHoennTrainerCardGold_Pal, // 4 stars }; static const u16 *const sKantoTrainerCardPals[] = { gKantoTrainerCardBlue_Pal, // Default (0 stars) sKantoTrainerCardGreen_Pal, // 1 star sKantoTrainerCardBronze_Pal, // 2 stars sKantoTrainerCardSilver_Pal, // 3 stars sKantoTrainerCardGold_Pal, // 4 stars }; static const u8 sTrainerCardTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; static const u8 sTrainerCardStatColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}; static const u8 sTimeColonInvisibleTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT}; static const u8 sTrainerCardFontIds[] = {FONT_SMALL, FONT_NORMAL, FONT_SMALL}; static const u8 sTrainerPicOffsets[2][GENDER_COUNT][2] = { // Kanto { [MALE] = {13, 4}, [FEMALE] = {13, 4} }, // Hoenn { [MALE] = {1, 0}, [FEMALE] = {1, 0} } }; static const u8 sTrainerPicFacilityClasses[][2] = { [CARD_TYPE_FRLG] = { [MALE] = FACILITY_CLASS_RED, [FEMALE] = FACILITY_CLASS_LEAF }, [CARD_TYPE_RSE] = { [MALE] = FACILITY_CLASS_BRENDAN, [FEMALE] = FACILITY_CLASS_MAY }, [CARD_TYPE_EMERALD] = { [MALE] = FACILITY_CLASS_EM_BRENDAN, [FEMALE] = FACILITY_CLASS_EM_MAY } }; static const u8 sLinkTrainerPicFacilityClasses[GENDER_COUNT][NUM_LINK_TRAINER_CARD_CLASSES] = { [MALE] = { FACILITY_CLASS_COOLTRAINER_M, FACILITY_CLASS_BLACK_BELT, FACILITY_CLASS_CAMPER, FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_PSYCHIC_M, FACILITY_CLASS_BUG_CATCHER, FACILITY_CLASS_TAMER, FACILITY_CLASS_JUGGLER }, [FEMALE] = { FACILITY_CLASS_COOLTRAINER_F, FACILITY_CLASS_CHANNELER, FACILITY_CLASS_PICNICKER, FACILITY_CLASS_LASS, FACILITY_CLASS_RS_PSYCHIC_F, FACILITY_CLASS_BATTLE_GIRL, FACILITY_CLASS_RS_PKMN_BREEDER_F, FACILITY_CLASS_BEAUTY } }; static bool8 (*const sTrainerCardFlipTasks[])(struct Task *) = { Task_BeginCardFlip, Task_AnimateCardFlipDown, Task_DrawFlippedCardSide, Task_SetCardFlipped, Task_AnimateCardFlipUp, Task_EndCardFlip }; static const u8 sTrainerCardFrontNameXPositions[] = {0x14, 0x10}; static const u8 sTrainerCardFrontNameYPositions[] = {0x1D, 0x21}; static const u8 sTrainerCardIdXPositions[] = {0x8E, 0x80}; static const u8 sTrainerCardIdYPositions[] = {0xA, 0x9}; static const u8 *const sTimeColonTextColors[] = {sTrainerCardTextColors, sTimeColonInvisibleTextColors}; static const u8 sTrainerCardTimeHoursXPositions[] = {0x65, 0x55}; static const u8 sTrainerCardTimeHoursYPositions[] = {0x77, 0x67}; static const u8 sTrainerCardTimeMinutesXPositions[] = {0x7C, 0x6C}; static const u8 sTrainerCardTimeMinutesYPositions[] = {0x58, 0x59}; static const u8 sTrainerCardProfilePhraseXPositions[] = {0x73, 0x69}; static const u8 sTrainerCardProfilePhraseYPositions[] = {0x82, 0x78}; static const u8 sTrainerCardBackNameXPositions[] = {0x8A, 0xD8}; static const u8 sTrainerCardBackNameYPositions[] = {0xB, 0xA}; static const u8 sTrainerCardHofDebutXPositions[] = {0xA, 0x10, 0x0, 0x0}; static const u8 *const sLinkTrainerCardRecordStrings[] = {gText_LinkBattles, gText_LinkCableBattles}; static const u8 sPokemonIconPalSlots[] = {5, 6, 7, 8, 9, 10}; static const u8 sPokemonIconXOffsets[] = {0, 4, 8, 12, 16, 20}; static const u8 sStickerPalSlots[] = {11, 12, 13, 14}; static const u8 sStarYOffsets[] = {7, 6, 0, 0}; static const struct TrainerCard sLinkPlayerTrainerCardTemplate1 = { .rse = { .gender = MALE, .stars = 4, .hasPokedex = TRUE, .caughtAllHoenn = TRUE, .hasAllPaintings = TRUE, .hofDebutHours = 999, .hofDebutMinutes = 59, .hofDebutSeconds = 59, .caughtMonsCount = 200, .trainerId = 0x6072, .playTimeHours = 999, .playTimeMinutes = 59, .linkBattleWins = 5535, .linkBattleLosses = 5535, .battleTowerWins = 5535, .battleTowerStraightWins = 5535, .contestsWithFriends = 55555, .pokeblocksWithFriends = 44444, .pokemonTrades = 33333, .money = 999999, .easyChatProfile = {0, 0, 0, 0}, .playerName = _("あかみ どりお") }, .version = VERSION_FIRE_RED, .hasAllFrontierSymbols = FALSE, .berryCrushPoints = 5555, .unionRoomNum = 8500, .berriesPicked = 5456, .jumpsInRow = 6300, .shouldDrawStickers = TRUE, .hasAllMons = TRUE, .monIconTint = MON_ICON_TINT_PINK, .facilityClass = 0, .stickers = {1, 2, 3}, .monSpecies = {SPECIES_CHARIZARD, SPECIES_DIGLETT, SPECIES_NIDORINA, SPECIES_FEAROW, SPECIES_PARAS, SPECIES_SLOWBRO} }; static const struct TrainerCard sLinkPlayerTrainerCardTemplate2 = { .rse = { .gender = FEMALE, .stars = 2, .hasPokedex = TRUE, .caughtAllHoenn = TRUE, .hasAllPaintings = TRUE, .hofDebutHours = 999, .hofDebutMinutes = 59, .hofDebutSeconds = 59, .caughtMonsCount = 200, .trainerId = 0x6072, .playTimeHours = 999, .playTimeMinutes = 59, .linkBattleWins = 5535, .linkBattleLosses = 5535, .battleTowerWins = 65535, .battleTowerStraightWins = 65535, .contestsWithFriends = 55555, .pokeblocksWithFriends = 44444, .pokemonTrades = 33333, .money = 999999, .easyChatProfile = {0, 0, 0, 0}, .playerName = _("るびさふぁこ!") }, .version = 0, .hasAllFrontierSymbols = FALSE, .berryCrushPoints = 555, .unionRoomNum = 500, .berriesPicked = 456, .jumpsInRow = 300, .shouldDrawStickers = TRUE, .hasAllMons = TRUE, .monIconTint = MON_ICON_TINT_PINK, .facilityClass = 0, .stickers = {1, 2, 3}, .monSpecies = {SPECIES_CHARIZARD, SPECIES_DIGLETT, SPECIES_NIDORINA, SPECIES_FEAROW, SPECIES_PARAS, SPECIES_SLOWBRO} }; // Functions static void VBlankCB_TrainerCard(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); BlinkTimeColon(); if (sTrainerCardDataPtr->allowDMACopy) DmaCopy16(3, &gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 0x140); } static void HBlankCB_TrainerCard(void) { u16 backup; u16 bgVOffset; backup = REG_IME; REG_IME = 0; bgVOffset = gScanlineEffectRegBuffers[1][REG_VCOUNT & 0xFF]; REG_BG0VOFS = bgVOffset; REG_IME = backup; } static void CB2_TrainerCard(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void CloseTrainerCard(u8 taskId) { SetMainCallback2(sTrainerCardDataPtr->callback2); FreeAllWindowBuffers(); FREE_AND_SET_NULL(sTrainerCardDataPtr); DestroyTask(taskId); } // States for Task_TrainerCard. Skips the initial states, which are done once in order #define STATE_HANDLE_INPUT_FRONT 10 #define STATE_HANDLE_INPUT_BACK 11 #define STATE_WAIT_FLIP_TO_BACK 12 #define STATE_WAIT_FLIP_TO_FRONT 13 #define STATE_CLOSE_CARD 14 #define STATE_WAIT_LINK_PARTNER 15 #define STATE_CLOSE_CARD_LINK 16 static void Task_TrainerCard(u8 taskId) { switch (sTrainerCardDataPtr->mainState) { // Draw card initially case 0: if (!IsDma3ManagerBusyWithBgCopy()) { FillWindowPixelBuffer(1, PIXEL_FILL(0)); sTrainerCardDataPtr->mainState++; } break; case 1: if (PrintAllOnCardFront()) sTrainerCardDataPtr->mainState++; break; case 2: DrawTrainerCardWindow(1); sTrainerCardDataPtr->mainState++; break; case 3: FillWindowPixelBuffer(2, PIXEL_FILL(0)); CreateTrainerCardTrainerPic(); DrawTrainerCardWindow(2); sTrainerCardDataPtr->mainState++; break; case 4: DrawCardScreenBackground(sTrainerCardDataPtr->bgTilemap); sTrainerCardDataPtr->mainState++; break; case 5: DrawCardFrontOrBack(sTrainerCardDataPtr->frontTilemap); sTrainerCardDataPtr->mainState++; break; case 6: DrawStarsAndBadgesOnCard(); sTrainerCardDataPtr->mainState++; break; // Fade in case 7: if (gWirelessCommType == 1 && gReceivedRemoteLinkPlayers == TRUE) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(230, 150); } BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_TrainerCard); sTrainerCardDataPtr->mainState++; break; case 8: if (!UpdatePaletteFade() && !IsDma3ManagerBusyWithBgCopy()) { PlaySE(SE_CARD_OPEN); sTrainerCardDataPtr->mainState = STATE_HANDLE_INPUT_FRONT; } break; case 9: if (!IsSEPlaying()) sTrainerCardDataPtr->mainState++; break; case STATE_HANDLE_INPUT_FRONT: // Blink the : in play time if (!gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->timeColonNeedDraw) { PrintTimeOnCard(); DrawTrainerCardWindow(1); sTrainerCardDataPtr->timeColonNeedDraw = FALSE; } if (JOY_NEW(A_BUTTON)) { SetHelpContext(HELPCONTEXT_TRAINER_CARD_BACK); FlipTrainerCard(); PlaySE(SE_CARD_FLIP); sTrainerCardDataPtr->mainState = STATE_WAIT_FLIP_TO_BACK; } else if (JOY_NEW(B_BUTTON)) { if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE) { sTrainerCardDataPtr->mainState = STATE_WAIT_LINK_PARTNER; } else { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD; } } break; case STATE_WAIT_FLIP_TO_BACK: if (IsCardFlipTaskActive() && Overworld_LinkRecvQueueLengthMoreThan2() != TRUE) { PlaySE(SE_CARD_OPEN); sTrainerCardDataPtr->mainState = STATE_HANDLE_INPUT_BACK; } break; case STATE_HANDLE_INPUT_BACK: if (JOY_NEW(B_BUTTON)) { if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE) { sTrainerCardDataPtr->mainState = STATE_WAIT_LINK_PARTNER; } else if (gReceivedRemoteLinkPlayers) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD; } else { SetHelpContext(HELPCONTEXT_TRAINER_CARD_FRONT); FlipTrainerCard(); sTrainerCardDataPtr->mainState = STATE_WAIT_FLIP_TO_FRONT; PlaySE(SE_CARD_FLIP); } } else if (JOY_NEW(A_BUTTON)) { if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE) { sTrainerCardDataPtr->mainState = STATE_WAIT_LINK_PARTNER; } else { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD; } } break; case STATE_WAIT_LINK_PARTNER: SetCloseLinkCallback(); DrawDialogueFrame(0, 1); AddTextPrinterParameterized(0, FONT_NORMAL, gText_WaitingTrainerFinishReading, 0, 1, TEXT_SKIP_DRAW, 0); CopyWindowToVram(0, COPYWIN_FULL); sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD_LINK; break; case STATE_CLOSE_CARD_LINK: if (!gReceivedRemoteLinkPlayers) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD; } break; case STATE_CLOSE_CARD: if (!UpdatePaletteFade()) CloseTrainerCard(taskId); break; case STATE_WAIT_FLIP_TO_FRONT: if (IsCardFlipTaskActive() && Overworld_LinkRecvQueueLengthMoreThan2() != TRUE) { sTrainerCardDataPtr->mainState = STATE_HANDLE_INPUT_FRONT; PlaySE(SE_CARD_OPEN); } break; } } static bool8 LoadCardGfx(void) { switch (sTrainerCardDataPtr->gfxLoadState) { case 0: if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE) LZ77UnCompWram(sHoennTrainerCardBg_Tilemap, sTrainerCardDataPtr->bgTilemap); else LZ77UnCompWram(sKantoTrainerCardBg_Tilemap, sTrainerCardDataPtr->bgTilemap); break; case 1: if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE) LZ77UnCompWram(sHoennTrainerCardBack_Tilemap, sTrainerCardDataPtr->backTilemap); else LZ77UnCompWram(sKantoTrainerCardBack_Tilemap, sTrainerCardDataPtr->backTilemap); break; case 2: if (!sTrainerCardDataPtr->isLink) { if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE) LZ77UnCompWram(sHoennTrainerCardFront_Tilemap, sTrainerCardDataPtr->frontTilemap); else LZ77UnCompWram(sKantoTrainerCardFront_Tilemap, sTrainerCardDataPtr->frontTilemap); } else { if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE) LZ77UnCompWram(sHoennTrainerCardFrontLink_Tilemap, sTrainerCardDataPtr->frontTilemap); else LZ77UnCompWram(sKantoTrainerCardFrontLink_Tilemap, sTrainerCardDataPtr->frontTilemap); } break; case 3: if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE) LZ77UnCompWram(sHoennTrainerCardBadges_Gfx, sTrainerCardDataPtr->badgeTiles); else LZ77UnCompWram(sKantoTrainerCardBadges_Gfx, sTrainerCardDataPtr->badgeTiles); break; case 4: if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE) LZ77UnCompWram(gHoennTrainerCard_Gfx, &sTrainerCardDataPtr->cardTiles); else LZ77UnCompWram(gKantoTrainerCard_Gfx, &sTrainerCardDataPtr->cardTiles); break; case 5: if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG) LZ77UnCompWram(sTrainerCardStickers_Gfx, sTrainerCardDataPtr->stickerTiles); break; default: sTrainerCardDataPtr->gfxLoadState = 0; return TRUE; } sTrainerCardDataPtr->gfxLoadState++; return FALSE; } static void CB2_InitTrainerCard(void) { switch (gMain.state) { case 0: ResetGpuRegs(); SetUpTrainerCardTask(); gMain.state++; break; case 1: TrainerCardNull(); gMain.state++; break; case 2: DmaClearOam(); gMain.state++; break; case 3: DmaClearPltt(); gMain.state++; // fallthrough case 4: ResetBgRegs(); gMain.state++; break; case 5: InitBgsAndWindows(); gMain.state++; break; case 6: LoadStdWindowFrameGfx(); gMain.state++; break; case 7: LoadMonIconGfx(); gMain.state++; break; case 8: if (LoadCardGfx() == TRUE) gMain.state++; break; case 9: LoadStickerGfx(); gMain.state++; break; case 10: HandleGpuRegs(); gMain.state++; break; case 11: BufferTextForCardBack(); gMain.state++; break; case 12: if (SetTrainerCardBgsAndPals() == TRUE) gMain.state++; break; case 13: gMain.state++; break; default: SetTrainerCardCB2(); break; } } static u32 GetCappedGameStat(u8 statId, u32 maxValue) { u32 statValue = GetGameStat(statId); return min(maxValue, statValue); } static u8 GetTrainerStarCount(struct TrainerCard *trainerCard) { u8 stars = 0; if (trainerCard->rse.hofDebutHours != 0 || trainerCard->rse.hofDebutMinutes != 0 || trainerCard->rse.hofDebutSeconds != 0) stars++; if (trainerCard->rse.caughtAllHoenn) stars++; if (trainerCard->rse.battleTowerStraightWins > 49) stars++; if (trainerCard->rse.hasAllPaintings) stars++; return stars; } static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType) { u32 playTime; u32 i; trainerCard->rse.gender = gSaveBlock2Ptr->playerGender; trainerCard->rse.playTimeHours = gSaveBlock2Ptr->playTimeHours; trainerCard->rse.playTimeMinutes = gSaveBlock2Ptr->playTimeMinutes; playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME); if (!GetGameStat(GAME_STAT_ENTERED_HOF)) playTime = 0; trainerCard->rse.hofDebutHours = playTime >> 16; trainerCard->rse.hofDebutMinutes = (playTime >> 8) & 0xFF; trainerCard->rse.hofDebutSeconds = playTime & 0xFF; if ((playTime >> 16) > 999) { trainerCard->rse.hofDebutHours = 999; trainerCard->rse.hofDebutMinutes = 59; trainerCard->rse.hofDebutSeconds = 59; } trainerCard->rse.hasPokedex = FlagGet(FLAG_SYS_POKEDEX_GET); trainerCard->rse.caughtAllHoenn = HasAllHoennMons(); trainerCard->rse.caughtMonsCount = GetCaughtMonsCount(); trainerCard->rse.trainerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]; trainerCard->rse.linkBattleWins = GetCappedGameStat(GAME_STAT_LINK_BATTLE_WINS, 9999); trainerCard->rse.linkBattleLosses = GetCappedGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 9999); trainerCard->rse.pokemonTrades = GetCappedGameStat(GAME_STAT_POKEMON_TRADES, 0xFFFF); trainerCard->rse.battleTowerWins = gSaveBlock2Ptr->battleTower.totalBattleTowerWins; trainerCard->rse.battleTowerStraightWins = gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak; trainerCard->rse.contestsWithFriends = 0; trainerCard->rse.pokeblocksWithFriends = 0; trainerCard->rse.hasAllPaintings = FALSE; trainerCard->rse.money = GetMoney(&gSaveBlock1Ptr->money); for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++) trainerCard->rse.easyChatProfile[i] = gSaveBlock1Ptr->easyChatProfile[i]; StringCopy(trainerCard->rse.playerName, gSaveBlock2Ptr->playerName); if (cardType == CARD_TYPE_FRLG) { trainerCard->rse.stars = GetTrainerStarCount(trainerCard); } else if (cardType >= CARD_TYPE_RSE) { trainerCard->rse.stars = 0; if (trainerCard->rse.hofDebutHours != 0 || (trainerCard->rse.hofDebutMinutes != 0 || trainerCard->rse.hofDebutSeconds != 0)) trainerCard->rse.stars = cardType; if (HasAllKantoMons()) trainerCard->rse.stars++; if (HasAllMons()) trainerCard->rse.stars++; } } void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard) { u8 id = 0; trainerCard->version = GAME_VERSION; SetPlayerCardData(trainerCard, CARD_TYPE_RSE); if (GetCardType() != CARD_TYPE_FRLG) return; trainerCard->rse.stars = id; if (trainerCard->rse.hofDebutHours != 0 || trainerCard->rse.hofDebutMinutes != 0 || trainerCard->rse.hofDebutSeconds != 0) trainerCard->rse.stars = 1; trainerCard->rse.caughtAllHoenn = HasAllKantoMons(); trainerCard->hasAllMons = HasAllMons(); trainerCard->berriesPicked = gSaveBlock2Ptr->berryPick.berriesPicked; trainerCard->jumpsInRow = gSaveBlock2Ptr->pokeJump.jumpsInRow; trainerCard->berryCrushPoints = GetCappedGameStat(GAME_STAT_BERRY_CRUSH_POINTS, 0xFFFF); trainerCard->unionRoomNum = GetCappedGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES, 0xFFFF); trainerCard->shouldDrawStickers = TRUE; if (trainerCard->rse.caughtAllHoenn) trainerCard->rse.stars++; if (trainerCard->hasAllMons) trainerCard->rse.stars++; if ((trainerCard->berriesPicked >= 200 && trainerCard->jumpsInRow >= 200) || trainerCard->rse.battleTowerStraightWins > 49) trainerCard->rse.stars++; id = ((u16)trainerCard->rse.trainerId) % NUM_LINK_TRAINER_CARD_CLASSES; if (trainerCard->rse.gender == FEMALE) trainerCard->facilityClass = sLinkTrainerPicFacilityClasses[FEMALE][id]; else trainerCard->facilityClass = sLinkTrainerPicFacilityClasses[MALE][id]; trainerCard->stickers[0] = VarGet(VAR_HOF_BRAG_STATE); trainerCard->stickers[1] = VarGet(VAR_EGG_BRAG_STATE); trainerCard->stickers[2] = VarGet(VAR_LINK_WIN_BRAG_STATE); trainerCard->monIconTint = VarGet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX); trainerCard->monSpecies[0] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_1)); trainerCard->monSpecies[1] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_2)); trainerCard->monSpecies[2] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_3)); trainerCard->monSpecies[3] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_4)); trainerCard->monSpecies[4] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_5)); trainerCard->monSpecies[5] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_6)); } static void SetDataFromTrainerCard(void) { u32 badgeFlag; u32 i; sTrainerCardDataPtr->hasPokedex = FALSE; sTrainerCardDataPtr->hasHofResult = FALSE; sTrainerCardDataPtr->hasLinkResults = FALSE; sTrainerCardDataPtr->hasBattleTowerWins = FALSE; sTrainerCardDataPtr->var_E = FALSE; sTrainerCardDataPtr->var_F = FALSE; sTrainerCardDataPtr->hasTrades = FALSE; memset(sTrainerCardDataPtr->hasBadge, FALSE, sizeof(sTrainerCardDataPtr->hasBadge)); if (sTrainerCardDataPtr->trainerCard.rse.hasPokedex) sTrainerCardDataPtr->hasPokedex++; if (sTrainerCardDataPtr->trainerCard.rse.hofDebutHours != 0 || sTrainerCardDataPtr->trainerCard.rse.hofDebutMinutes != 0 || sTrainerCardDataPtr->trainerCard.rse.hofDebutSeconds != 0) sTrainerCardDataPtr->hasHofResult++; if (sTrainerCardDataPtr->trainerCard.rse.linkBattleWins != 0 || sTrainerCardDataPtr->trainerCard.rse.linkBattleLosses != 0) sTrainerCardDataPtr->hasLinkResults++; if (sTrainerCardDataPtr->trainerCard.rse.pokemonTrades != 0) sTrainerCardDataPtr->hasTrades++; for (i = 0, badgeFlag = FLAG_BADGE01_GET; badgeFlag <= FLAG_BADGE08_GET; badgeFlag++, i++) { if (FlagGet(badgeFlag)) sTrainerCardDataPtr->hasBadge[i]++; } } static void HandleGpuRegs(void) { ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); SetGpuReg(REG_OFFSET_WIN0V, WININ_WIN0_CLR | WIN_RANGE(0, 0x80)); SetGpuReg(REG_OFFSET_WIN0H, WININ_WIN0_CLR | WININ_WIN0_OBJ | WIN_RANGE(0, 0xC0)); if (gReceivedRemoteLinkPlayers) EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); else EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK); } // Part of animating card flip static void UpdateCardFlipRegs(u16 cardTop) { s8 blendY = (cardTop + 40) / 10; if (blendY <= 4) blendY = 0; sTrainerCardDataPtr->flipBlendY = blendY; SetGpuReg(REG_OFFSET_BLDY, sTrainerCardDataPtr->flipBlendY); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(sTrainerCardDataPtr->cardTop, 160 - sTrainerCardDataPtr->cardTop)); } static void ResetGpuRegs(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, 0); } static void TrainerCardNull(void) { } static void DmaClearOam(void) { DmaClear32(3, (void *)OAM, OAM_SIZE); } static void DmaClearPltt(void) { DmaClear16(3, (void *)PLTT, PLTT_SIZE); } static void ResetBgRegs(void) { SetGpuReg(REG_OFFSET_BG0CNT, 0); SetGpuReg(REG_OFFSET_BG1CNT, 0); SetGpuReg(REG_OFFSET_BG2CNT, 0); SetGpuReg(REG_OFFSET_BG3CNT, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); } static void InitBgsAndWindows(void) { ResetSpriteData(); ResetPaletteFade(); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sTrainerCardBgTemplates, NELEMS(sTrainerCardBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); InitWindows(sTrainerCardWindowTemplates); DeactivateAllTextPrinters(); } static void SetTrainerCardCB2(void) { SetMainCallback2(CB2_TrainerCard); SetHelpContext(HELPCONTEXT_TRAINER_CARD_FRONT); } static void SetUpTrainerCardTask(void) { ResetTasks(); ScanlineEffect_Stop(); CreateTask(Task_TrainerCard, 0); InitTrainerCardData(); SetDataFromTrainerCard(); } static bool8 PrintAllOnCardFront(void) { switch (sTrainerCardDataPtr->printState) { case 0: PrintNameOnCardFront(); break; case 1: PrintIdOnCard(); break; case 2: PrintMoneyOnCard(); break; case 3: PrintPokedexOnCard(); break; case 4: PrintTimeOnCard(); break; case 5: PrintProfilePhraseOnCard(); break; default: sTrainerCardDataPtr->printState = 0; return TRUE; } sTrainerCardDataPtr->printState++; return FALSE; } static bool8 PrintAllOnCardBack(void) { switch (sTrainerCardDataPtr->printState) { case 0: PrintNameOnCardBack(); break; case 1: PrintHofDebutTimeOnCard(); break; case 2: PrintLinkBattleResultsOnCard(); break; case 3: PrintTradesStringOnCard(); break; case 4: PrintBerryCrushStringOnCard(); break; case 5: PrintUnionStringOnCard(); break; case 6: PrintPokemonIconsOnCard(); break; case 7: PrintStickersOnCard(); break; default: sTrainerCardDataPtr->printState = 0; return TRUE; } sTrainerCardDataPtr->printState++; return FALSE; } static void BufferTextForCardBack(void) { BufferNameForCardBack(); BufferHofDebutTime(); BufferLinkBattleResults(); BufferNumTrades(); BufferBerryCrushPoints(); BufferUnionRoomStats(); } static void PrintNameOnCardFront(void) { u8 buffer[2][32]; u8 *txtPtr; txtPtr = StringCopy(buffer[0], gText_TrainerCardName); txtPtr = buffer[1]; StringCopy(txtPtr, sTrainerCardDataPtr->trainerCard.rse.playerName); ConvertInternationalString(txtPtr, sTrainerCardDataPtr->language); StringAppend(buffer[0], txtPtr); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardFrontNameXPositions[sTrainerCardDataPtr->cardType], sTrainerCardFrontNameYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer[0]); } static void PrintIdOnCard(void) { u8 buffer[32]; u8 *txtPtr; txtPtr = StringCopy(buffer, gText_TrainerCardIDNo); ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.rse.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardIdXPositions[sTrainerCardDataPtr->cardType], sTrainerCardIdYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer); } static void PrintMoneyOnCard(void) { u8 buffer[10]; u8 *txtPtr; u8 x; txtPtr = StringCopy(buffer, gText_TrainerCardYen); ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.rse.money, STR_CONV_MODE_LEFT_ALIGN, 6); if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE) { x = -122 - 6 * StringLength(buffer); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 56, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardMoney); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 56, sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer); } else { x = 118 - 6 * StringLength(buffer); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 57, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardMoney); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 57, sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer); } } static u16 GetCaughtMonsCount(void) { if (IsNationalPokedexEnabled()) return GetNationalPokedexCount(FLAG_GET_CAUGHT); else return GetKantoPokedexCount(FLAG_GET_CAUGHT); } static void PrintPokedexOnCard(void) { u8 buffer[10]; u8 x; if (FlagGet(FLAG_SYS_POKEDEX_GET)) { ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.caughtMonsCount, 0, 3); if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE) { x = -120 - 6 * StringLength(buffer); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 72, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardPokedex); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 72, sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 72, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardNull); } else { x = 120 - 6 * StringLength(buffer); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 73, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardPokedex); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 73, sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 73, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardNull); } } } static void PrintTimeOnCard(void) { u16 hours; u16 minutes; u8 buffer[6]; hours = gSaveBlock2Ptr->playTimeHours; minutes = gSaveBlock2Ptr->playTimeMinutes; if (sTrainerCardDataPtr->isLink) { hours = sTrainerCardDataPtr->trainerCard.rse.playTimeHours; minutes = sTrainerCardDataPtr->trainerCard.rse.playTimeMinutes; } if (hours > 999) hours = 999; if (minutes > 59) minutes = 59; FillWindowPixelRect(1, PIXEL_FILL(0), sTrainerCardTimeHoursXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], 50, 12); if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE) AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 88, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardTime); else AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 89, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardTime); ConvertIntToDecimalStringN(buffer, hours, STR_CONV_MODE_RIGHT_ALIGN, 3); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeHoursXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeHoursYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTimeColonTextColors[sTrainerCardDataPtr->timeColonInvisible], TEXT_SKIP_DRAW, gText_Colon2); ConvertIntToDecimalStringN(buffer, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeMinutesXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer); } static void PrintProfilePhraseOnCard(void) { if (sTrainerCardDataPtr->isLink) { AddTextPrinterParameterized3(1, FONT_NORMAL, 10, sTrainerCardProfilePhraseXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->easyChatProfile[0]); AddTextPrinterParameterized3(1, FONT_NORMAL, GetStringWidth(FONT_NORMAL, sTrainerCardDataPtr->easyChatProfile[0], 0) + 16, sTrainerCardProfilePhraseXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->easyChatProfile[1]); AddTextPrinterParameterized3(1, FONT_NORMAL, 10, sTrainerCardProfilePhraseYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->easyChatProfile[2]); AddTextPrinterParameterized3(1, FONT_NORMAL, GetStringWidth(FONT_NORMAL, sTrainerCardDataPtr->easyChatProfile[2], 0) + 16, sTrainerCardProfilePhraseYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->easyChatProfile[3]); } } static void BufferNameForCardBack(void) { StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], sTrainerCardDataPtr->trainerCard.rse.playerName); ConvertInternationalString(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], sTrainerCardDataPtr->language); if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE) { StringAppend(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], gText_Var1sTrainerCard); } } static void PrintNameOnCardBack(void) { u8 x; if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG) { AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardBackNameXPositions[sTrainerCardDataPtr->cardType], sTrainerCardBackNameYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME]); } else { x = sTrainerCardBackNameXPositions[sTrainerCardDataPtr->cardType] - GetStringWidth(sTrainerCardFontIds[1], sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], GetFontAttribute(sTrainerCardFontIds[1], FONTATTR_LETTER_SPACING)); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, sTrainerCardBackNameYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME]); } } static void BufferHofDebutTime(void) { u8 buffer[10]; u8 *txtPtr; if (sTrainerCardDataPtr->hasHofResult) { ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.hofDebutHours, STR_CONV_MODE_RIGHT_ALIGN, 3); txtPtr = StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], buffer); StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], gText_Colon2, 2); ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.hofDebutMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], buffer, 3); StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], gText_Colon2, 2); ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.hofDebutSeconds, STR_CONV_MODE_LEADING_ZEROS, 2); StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], buffer, 3); } } static void PrintHofDebutTimeOnCard(void) { if (sTrainerCardDataPtr->hasHofResult) { AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 35, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_HallOfFameDebut); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 164, 35, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME]); } } static void BufferLinkBattleResults(void) { u8 buffer[30]; if (sTrainerCardDataPtr->hasLinkResults) { StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_RECORD], sLinkTrainerCardRecordStrings[sTrainerCardDataPtr->cardType]); StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_WIN_LOSS], gText_WinLossRatio); ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.linkBattleWins, STR_CONV_MODE_RIGHT_ALIGN, 4); StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_WINS], buffer); ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.linkBattleLosses, STR_CONV_MODE_RIGHT_ALIGN, 4); StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_LOSSES], buffer); } } static void PrintLinkBattleResultsOnCard(void) { if (sTrainerCardDataPtr->hasLinkResults) { AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 51, sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_RECORD]); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 130, 51, sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_WIN_LOSS]); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 144, 51, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_WINS]); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 192, 51, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_LOSSES]); } } static void BufferNumTrades(void) { if (sTrainerCardDataPtr->hasTrades) { StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADES], gText_PokemonTrades); ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADE_COUNT], sTrainerCardDataPtr->trainerCard.rse.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); } } static void PrintTradesStringOnCard(void) { if (sTrainerCardDataPtr->hasTrades) { AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 67, sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADES]); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 67, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADE_COUNT]); } } static void BufferBerryCrushPoints(void) { if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE) { StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH], gText_BerryCrushes); ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH_COUNT], sTrainerCardDataPtr->trainerCard.berryCrushPoints, STR_CONV_MODE_RIGHT_ALIGN, 5); } } static void PrintBerryCrushStringOnCard(void) { if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE && sTrainerCardDataPtr->trainerCard.berryCrushPoints) { AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 99, sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH]); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 99, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH_COUNT]); } } static void BufferUnionRoomStats(void) { if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE) { StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM], gText_UnionRoomTradesBattles); ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM_NUM], sTrainerCardDataPtr->trainerCard.unionRoomNum, STR_CONV_MODE_RIGHT_ALIGN, 5); } } static void PrintUnionStringOnCard(void) { if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE && sTrainerCardDataPtr->trainerCard.unionRoomNum) { AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 83, sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM]); AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 83, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM_NUM]); } } static void PrintPokemonIconsOnCard(void) { u32 i; u8 paletteSlots[PARTY_SIZE]; u8 xOffsets[PARTY_SIZE]; memcpy(paletteSlots, sPokemonIconPalSlots, sizeof(sPokemonIconPalSlots)); memcpy(xOffsets, sPokemonIconXOffsets, sizeof(sPokemonIconXOffsets)); if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE) { for (i = 0; i < PARTY_SIZE; i++) { if (sTrainerCardDataPtr->trainerCard.monSpecies[i]) { u8 monSpecies = GetMonIconPaletteIndexFromSpecies(sTrainerCardDataPtr->trainerCard.monSpecies[i]); WriteSequenceToBgTilemapBuffer(3, 16 * i + 224, xOffsets[i] + 3, 15, 4, 4, paletteSlots[monSpecies], 1); } } } } static void LoadMonIconGfx(void) { u32 i; CpuCopy16(gMonIconPalettes, sTrainerCardDataPtr->monIconPals, 2 * NELEMS(sTrainerCardDataPtr->monIconPals)); switch (sTrainerCardDataPtr->trainerCard.monIconTint) { case MON_ICON_TINT_NORMAL: break; case MON_ICON_TINT_BLACK: TintPalette_CustomTone(sTrainerCardDataPtr->monIconPals, 96, 0, 0, 0); break; case MON_ICON_TINT_PINK: TintPalette_CustomTone(sTrainerCardDataPtr->monIconPals, 96, 500, 330, 310); break; case MON_ICON_TINT_SEPIA: TintPalette_SepiaTone(sTrainerCardDataPtr->monIconPals, 96); break; } LoadPalette(sTrainerCardDataPtr->monIconPals, BG_PLTT_ID(5), sizeof(sTrainerCardDataPtr->monIconPals)); for (i = 0; i < PARTY_SIZE; i++) { LoadBgTiles(3, GetMonIconTiles(sTrainerCardDataPtr->trainerCard.monSpecies[i], 0), 512, 16 * i + 32); } } static void PrintStickersOnCard(void) { u32 i; u8 palSlots[4]; memcpy(palSlots, sStickerPalSlots, sizeof(sStickerPalSlots)); if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.shouldDrawStickers == TRUE) { for (i = 0; i < TRAINER_CARD_STICKER_TYPES; i++) { u8 sticker = sTrainerCardDataPtr->trainerCard.stickers[i]; if (sTrainerCardDataPtr->trainerCard.stickers[i]) WriteSequenceToBgTilemapBuffer(3, i * 4 + 320, i * 3 + 2, 2, 2, 2, palSlots[sticker - 1], 1); } } } static void LoadStickerGfx(void) { LoadPalette(sTrainerCardStickerPal1, BG_PLTT_ID(11), sizeof(sTrainerCardStickerPal1)); LoadPalette(sTrainerCardStickerPal2, BG_PLTT_ID(12), sizeof(sTrainerCardStickerPal2)); LoadPalette(sTrainerCardStickerPal3, BG_PLTT_ID(13), sizeof(sTrainerCardStickerPal3)); LoadPalette(sTrainerCardStickerPal4, BG_PLTT_ID(14), sizeof(sTrainerCardStickerPal4)); LoadBgTiles(3, sTrainerCardDataPtr->stickerTiles, 1024, 128); } static void DrawTrainerCardWindow(u8 windowId) { PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); } static bool8 SetTrainerCardBgsAndPals(void) { switch (sTrainerCardDataPtr->bgPalLoadState) { case 0: LoadBgTiles(3, sTrainerCardDataPtr->badgeTiles, NELEMS(sTrainerCardDataPtr->badgeTiles), 0); break; case 1: LoadBgTiles(0, sTrainerCardDataPtr->cardTiles, 0x1800, 0); break; case 2: if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE) LoadPalette(sHoennTrainerCardPals[sTrainerCardDataPtr->trainerCard.rse.stars], BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP); else LoadPalette(sKantoTrainerCardPals[sTrainerCardDataPtr->trainerCard.rse.stars], BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP); break; case 3: if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE) LoadPalette(sHoennTrainerCardBadges_Pal, BG_PLTT_ID(3), sizeof(sHoennTrainerCardBadges_Pal)); else LoadPalette(sKantoTrainerCardBadges_Pal, BG_PLTT_ID(3), sizeof(sKantoTrainerCardBadges_Pal)); break; case 4: if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE && sTrainerCardDataPtr->trainerCard.rse.gender != MALE) LoadPalette(sHoennTrainerCardFemaleBg_Pal, BG_PLTT_ID(1), sizeof(sHoennTrainerCardFemaleBg_Pal)); else if (sTrainerCardDataPtr->trainerCard.rse.gender != MALE) LoadPalette(sKantoTrainerCardFemaleBg_Pal, BG_PLTT_ID(1), sizeof(sKantoTrainerCardFemaleBg_Pal)); break; case 5: LoadPalette(sTrainerCardStar_Pal, BG_PLTT_ID(4), sizeof(sTrainerCardStar_Pal)); break; case 6: SetBgTilemapBuffer(0, sTrainerCardDataPtr->cardTilemapBuffer); SetBgTilemapBuffer(2, sTrainerCardDataPtr->bgTilemapBuffer); break; default: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32); FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32); return TRUE; } sTrainerCardDataPtr->bgPalLoadState++; return FALSE; } static void DrawCardScreenBackground(const u16 *ptr) { s16 i, j; u16 *dst = sTrainerCardDataPtr->bgTilemapBuffer; for (i = 0; i < 20; i++) { for (j = 0; j < 32; j++) { if (j < 30) dst[32 * i + j] = ptr[30 * i + j]; else dst[32 * i + j] = ptr[0]; } } CopyBgTilemapBufferToVram(2); } static void DrawCardFrontOrBack(const u16 *ptr) { s16 i, j; u16 *dst = sTrainerCardDataPtr->cardTilemapBuffer; for (i = 0; i < 20; i++) { for (j = 0; j < 32; j++) { if (j < 30) dst[32 * i + j] = ptr[30 * i + j]; else dst[32 * i + j] = ptr[0]; } } CopyBgTilemapBufferToVram(0); } static void DrawStarsAndBadgesOnCard(void) { s16 i, x; u16 tileNum = 192; u8 palNum = 3; FillBgTilemapBufferRect(3, 143, 15, sStarYOffsets[sTrainerCardDataPtr->cardType], sTrainerCardDataPtr->trainerCard.rse.stars, 1, 4); if (!sTrainerCardDataPtr->isLink) { x = 4; for (i = 0; i < NUM_BADGES; i++, tileNum += 2, x += 3) { if (sTrainerCardDataPtr->hasBadge[i]) { FillBgTilemapBufferRect(3, tileNum, x, 16, 1, 1, palNum); FillBgTilemapBufferRect(3, tileNum + 1, x + 1, 16, 1, 1, palNum); FillBgTilemapBufferRect(3, tileNum + 16, x, 17, 1, 1, palNum); FillBgTilemapBufferRect(3, tileNum + 17, x + 1, 17, 1, 1, palNum); } } } CopyBgTilemapBufferToVram(3); } static void DrawCardBackStats(void) { if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE) { if (sTrainerCardDataPtr->hasTrades) { FillBgTilemapBufferRect(3, 141, 26, 9, 1, 1, 1); FillBgTilemapBufferRect(3, 157, 26, 10, 1, 1, 1); } if (sTrainerCardDataPtr->trainerCard.berryCrushPoints) { FillBgTilemapBufferRect(3, 141, 21, 13, 1, 1, 1); FillBgTilemapBufferRect(3, 157, 21, 14, 1, 1, 1); } if (sTrainerCardDataPtr->trainerCard.unionRoomNum) { FillBgTilemapBufferRect(3, 141, 27, 11, 1, 1, 1); FillBgTilemapBufferRect(3, 157, 27, 12, 1, 1, 1); } } else { if (sTrainerCardDataPtr->hasTrades) { FillBgTilemapBufferRect(3, 141, 26, 9, 1, 1, 0); FillBgTilemapBufferRect(3, 157, 26, 10, 1, 1, 0); } } CopyBgTilemapBufferToVram(3); } static void BlinkTimeColon(void) { if (++sTrainerCardDataPtr->timeColonBlinkTimer > 60) { sTrainerCardDataPtr->timeColonBlinkTimer = 0; sTrainerCardDataPtr->timeColonInvisible ^= 1; sTrainerCardDataPtr->timeColonNeedDraw = TRUE; } } u8 GetTrainerCardStars(u8 cardId) { return gTrainerCards[cardId].rse.stars; } #define tFlipState data[0] static void FlipTrainerCard(void) { u8 taskId = CreateTask(Task_DoCardFlipTask, 0); Task_DoCardFlipTask(taskId); SetHBlankCallback(HBlankCB_TrainerCard); } static bool8 IsCardFlipTaskActive(void) { if (FindTaskIdByFunc(Task_DoCardFlipTask) == 0xFF) return TRUE; else return FALSE; } static void Task_DoCardFlipTask(u8 taskId) { while(sTrainerCardFlipTasks[gTasks[taskId].tFlipState](&gTasks[taskId])) ; } static bool8 Task_BeginCardFlip(struct Task* task) { u32 i; HideBg(1); HideBg(3); ScanlineEffect_Stop(); ScanlineEffect_Clear(); for (i = 0; i < 160; i++) gScanlineEffectRegBuffers[1][i] = 0; task->tFlipState++; return FALSE; } static bool8 Task_AnimateCardFlipDown(struct Task* task) { u32 r4, r5, r10, r7, r6, var_24, r9, var; s32 i; sTrainerCardDataPtr->allowDMACopy = FALSE; if (task->data[1] >= 77) task->data[1] = 77; else task->data[1] += 7; sTrainerCardDataPtr->cardTop = task->data[1]; UpdateCardFlipRegs(task->data[1]); r7 = task->data[1]; r9 = 160 - r7; r4 = r9 - r7; r6 = -r7 << 16; r5 = 0xA00000 / r4; r5 += 0xFFFF0000; var_24 = r6; var_24 += r5 * r4; r10 = r5 / r4; r5 *= 2; for (i = 0; i < r7; i++) { gScanlineEffectRegBuffers[0][i] = -i; } for (; i < (s16)r9; i++) { var = r6 >> 16; r6 += r5; r5 -= r10; gScanlineEffectRegBuffers[0][i] = var; } var = var_24 >> 16; for (; i < 160; i++) { gScanlineEffectRegBuffers[0][i] = var; } sTrainerCardDataPtr->allowDMACopy = TRUE; if (task->data[1] >= 77) task->tFlipState++; return FALSE; } static bool8 Task_DrawFlippedCardSide(struct Task* task) { sTrainerCardDataPtr->allowDMACopy = FALSE; if (Overworld_LinkRecvQueueLengthMoreThan2() == TRUE) return FALSE; do { switch (sTrainerCardDataPtr->flipDrawState) { case 0: FillWindowPixelBuffer(1, PIXEL_FILL(0)); FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32); break; case 1: if (!sTrainerCardDataPtr->onBack) { if (!PrintAllOnCardBack()) return FALSE; } else { if (!PrintAllOnCardFront()) return FALSE; } break; case 2: if (!sTrainerCardDataPtr->onBack) DrawCardFrontOrBack(sTrainerCardDataPtr->backTilemap); else DrawTrainerCardWindow(1); break; case 3: if (!sTrainerCardDataPtr->onBack) DrawCardBackStats(); else FillWindowPixelBuffer(2, PIXEL_FILL(0)); break; case 4: if (sTrainerCardDataPtr->onBack) CreateTrainerCardTrainerPic(); break; default: task->tFlipState++; sTrainerCardDataPtr->allowDMACopy = TRUE; sTrainerCardDataPtr->flipDrawState = 0; return FALSE; } sTrainerCardDataPtr->flipDrawState++; } while (!gReceivedRemoteLinkPlayers); return FALSE; } static bool8 Task_SetCardFlipped(struct Task* task) { sTrainerCardDataPtr->allowDMACopy = FALSE; // If on back of card, draw front of card because its being flipped if (sTrainerCardDataPtr->onBack) { DrawTrainerCardWindow(2); DrawCardScreenBackground(sTrainerCardDataPtr->bgTilemap); DrawCardFrontOrBack(sTrainerCardDataPtr->frontTilemap); DrawStarsAndBadgesOnCard(); } DrawTrainerCardWindow(1); sTrainerCardDataPtr->onBack ^= 1; task->tFlipState++; sTrainerCardDataPtr->allowDMACopy = TRUE; PlaySE(SE_CARD_FLIPPING); return FALSE; } static bool8 Task_AnimateCardFlipUp(struct Task* task) { u32 r4, r5, r10, r7, r6, var_24, r9, var; s32 i; sTrainerCardDataPtr->allowDMACopy = FALSE; if (task->data[1] <= 5) task->data[1] = 0; else task->data[1] -= 5; sTrainerCardDataPtr->cardTop = task->data[1]; UpdateCardFlipRegs(task->data[1]); r7 = task->data[1]; r9 = 160 - r7; r4 = r9 - r7; r6 = -r7 << 16; r5 = 0xA00000 / r4; r5 += 0xFFFF0000; var_24 = r6; var_24 += r5 * r4; r10 = r5 / r4; r5 /= 2; for (i = 0; i < r7; i++) { gScanlineEffectRegBuffers[0][i] = -i; } for (; i < (s16)(r9); i++) { var = r6 >> 16; r6 += r5; r5 += r10; gScanlineEffectRegBuffers[0][i] = var; } var = var_24 >> 16; for (; i < 160; i++) { gScanlineEffectRegBuffers[0][i] = var; } sTrainerCardDataPtr->allowDMACopy = TRUE; if (task->data[1] <= 0) task->tFlipState++; return FALSE; } static bool8 Task_EndCardFlip(struct Task *task) { ShowBg(1); ShowBg(3); SetHBlankCallback(NULL); DestroyTask(FindTaskIdByFunc(Task_DoCardFlipTask)); return FALSE; } void ShowPlayerTrainerCard(void (*callback)(void)) { sTrainerCardDataPtr = AllocZeroed(sizeof(*sTrainerCardDataPtr)); sTrainerCardDataPtr->callback2 = callback; if (InUnionRoom() == TRUE) sTrainerCardDataPtr->isLink = TRUE; else sTrainerCardDataPtr->isLink = FALSE; sTrainerCardDataPtr->language = GAME_LANGUAGE; TrainerCard_GenerateCardForLinkPlayer(&sTrainerCardDataPtr->trainerCard); SetMainCallback2(CB2_InitTrainerCard); } void ShowTrainerCardInLink(u8 cardId, void (*callback)(void)) { sTrainerCardDataPtr = AllocZeroed(sizeof(*sTrainerCardDataPtr)); sTrainerCardDataPtr->callback2 = callback; sTrainerCardDataPtr->isLink = TRUE; sTrainerCardDataPtr->trainerCard = gTrainerCards[cardId]; sTrainerCardDataPtr->language = gLinkPlayers[cardId].language; SetMainCallback2(CB2_InitTrainerCard); } static void InitTrainerCardData(void) { u32 i; sTrainerCardDataPtr->mainState = 0; sTrainerCardDataPtr->timeColonBlinkTimer = gSaveBlock2Ptr->playTimeVBlanks; sTrainerCardDataPtr->timeColonInvisible = FALSE; sTrainerCardDataPtr->onBack = FALSE; sTrainerCardDataPtr->flipBlendY = 0; if (GetCardType() >= CARD_TYPE_RSE) sTrainerCardDataPtr->cardType = CARD_TYPE_RSE; else sTrainerCardDataPtr->cardType = CARD_TYPE_FRLG; for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++) CopyEasyChatWord(sTrainerCardDataPtr->easyChatProfile[i], sTrainerCardDataPtr->trainerCard.rse.easyChatProfile[i]); } static u8 GetCardType(void) { if (sTrainerCardDataPtr == NULL) { if (gGameVersion == VERSION_FIRE_RED || gGameVersion == VERSION_LEAF_GREEN) return CARD_TYPE_FRLG; else if (gGameVersion == VERSION_EMERALD) return CARD_TYPE_EMERALD; else return CARD_TYPE_RSE; } else { if (sTrainerCardDataPtr->trainerCard.version == VERSION_FIRE_RED || sTrainerCardDataPtr->trainerCard.version == VERSION_LEAF_GREEN) return CARD_TYPE_FRLG; else if (sTrainerCardDataPtr->trainerCard.version == VERSION_EMERALD) return CARD_TYPE_EMERALD; else return CARD_TYPE_RSE; } } static void CreateTrainerCardTrainerPic(void) { u8 facilityClass; if (sTrainerCardDataPtr->trainerCard.version == VERSION_EMERALD) facilityClass = sTrainerPicFacilityClasses[2][sTrainerCardDataPtr->trainerCard.rse.gender]; else facilityClass = sTrainerPicFacilityClasses[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender]; if (InUnionRoom() == TRUE && gReceivedRemoteLinkPlayers == 1) { facilityClass = sTrainerCardDataPtr->trainerCard.facilityClass; CreateTrainerCardTrainerPicSprite(FacilityClassToPicIndex(facilityClass), TRUE, sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][0], sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][1], 8, 2); } else { if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG) { CreateTrainerCardTrainerPicSprite(FacilityClassToPicIndex(facilityClass), TRUE, sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][0], sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][1], 8, 2); } else { CreateTrainerCardTrainerPicSprite(PlayerGenderToFrontTrainerPicId(sTrainerCardDataPtr->trainerCard.rse.gender, TRUE), TRUE, sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][0], sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][1], 8, 2); } } } // Unused static void Unref_InitTrainerCard(void (*callback)(void)) { ShowPlayerTrainerCard(callback); SetMainCallback2(CB2_InitTrainerCard); } // Unused static void Unref_InitTrainerCardLink(void (*callback)(void)) { memcpy(gTrainerCards, &sLinkPlayerTrainerCardTemplate1, sizeof(sLinkPlayerTrainerCardTemplate1)); ShowTrainerCardInLink(CARD_TYPE_FRLG, callback); SetMainCallback2(CB2_InitTrainerCard); } // Unused static void Unref_InitTrainerCardLink2(void (*callback)(void)) { memcpy(gTrainerCards, &sLinkPlayerTrainerCardTemplate2, sizeof(sLinkPlayerTrainerCardTemplate2)); ShowTrainerCardInLink(CARD_TYPE_FRLG, callback); SetMainCallback2(CB2_InitTrainerCard); } ================================================ FILE: src/trainer_fan_club.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "event_data.h" #include "event_scripts.h" #include "random.h" #include "constants/trainer_fan_club.h" struct TrainerFanClub { u8 timer:7; u8 gotInitialFans:1; u8 fanFlags; }; #define TRAINER_FAN_CLUB ((struct TrainerFanClub *)GetVarPointer(VAR_FANCLUB_FAN_COUNTER)) #define GET_TRAINER_FAN_CLUB_FLAG(flag) (fanClub->fanFlags >> (flag) & 1) #define SET_TRAINER_FAN_CLUB_FLAG(flag) (fanClub->fanFlags |= 1 << (flag)) #define FLIP_TRAINER_FAN_CLUB_FLAG(flag)(fanClub->fanFlags ^= 1 << (flag)) static void TryLoseFansFromPlayTimeAfterLinkBattle(struct TrainerFanClub *); static void UpdateTrainerFanClubGameClear(struct TrainerFanClub *); static u8 PlayerGainRandomTrainerFan(struct TrainerFanClub *); static u16 GetNumFansOfPlayerInTrainerFanClub(struct TrainerFanClub *); static void TryLoseFansFromPlayTime(struct TrainerFanClub *); static bool16 IsFanClubMemberFanOfPlayer(struct TrainerFanClub *); static void SetInitialFansOfPlayer(struct TrainerFanClub *); static void BufferFanClubTrainerName(struct LinkBattleRecords *, u8, u8); static void UpdateTrainerFansAfterLinkBattle(struct TrainerFanClub *); static bool8 DidPlayerGetFirstFans(struct TrainerFanClub * ); static void SetPlayerGotFirstFans(struct TrainerFanClub *); void ResetTrainerFanClub(void) { VarSet(VAR_FANCLUB_FAN_COUNTER, 0); VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, 0); } void Script_TryLoseFansFromPlayTimeAfterLinkBattle(void) { TryLoseFansFromPlayTimeAfterLinkBattle(TRAINER_FAN_CLUB); } static void TryLoseFansFromPlayTimeAfterLinkBattle(struct TrainerFanClub *fanClub) { if (DidPlayerGetFirstFans(fanClub)) { TryLoseFansFromPlayTime(fanClub); VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours); } } void Script_UpdateTrainerFanClubGameClear(void) { UpdateTrainerFanClubGameClear(TRAINER_FAN_CLUB); } static void UpdateTrainerFanClubGameClear(struct TrainerFanClub *fanClub) { if (!fanClub->gotInitialFans) { SetPlayerGotFirstFans(fanClub); SetInitialFansOfPlayer(fanClub); VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours); FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT); FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER); FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN); FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY); VarSet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 1); } } ALIGNED(4) const u8 sCounterIncrements[] = {2, 1, 2, 1}; static u8 TryGainNewFanFromCounter(struct TrainerFanClub *fanClub, u8 a1) { if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2) { if (fanClub->timer + sCounterIncrements[a1] >= 20) { if (GetNumFansOfPlayerInTrainerFanClub(fanClub) < 3) { PlayerGainRandomTrainerFan(fanClub); fanClub->timer = 0; } else fanClub->timer = 20; } else fanClub->timer += sCounterIncrements[a1]; } return fanClub->timer; } static u8 PlayerGainRandomTrainerFan(struct TrainerFanClub *fanClub) { static const u8 sFanClubMemberIds[] = { FANCLUB_MEMBER2, FANCLUB_MEMBER4, FANCLUB_MEMBER6, FANCLUB_MEMBER1, FANCLUB_MEMBER8, FANCLUB_MEMBER7, FANCLUB_MEMBER5, FANCLUB_MEMBER3 }; u32 i; u8 idx = 0; for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++) { if (!(GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]))) { idx = i; if (Random() % 2) { SET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]); return sFanClubMemberIds[i]; } } } SET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]); return sFanClubMemberIds[idx]; } static u8 PlayerLoseRandomTrainerFan(struct TrainerFanClub *fanClub) { static const u8 sFanClubMemberIds[] = { FANCLUB_MEMBER6, FANCLUB_MEMBER7, FANCLUB_MEMBER4, FANCLUB_MEMBER8, FANCLUB_MEMBER5, FANCLUB_MEMBER2, FANCLUB_MEMBER1, FANCLUB_MEMBER3 }; u32 i; u8 idx = 0; if (GetNumFansOfPlayerInTrainerFanClub(fanClub) == 1) return 0; for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++) { if (GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i])) { idx = i; if (Random() % 2) { FLIP_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]); return sFanClubMemberIds[i]; } } } if (GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx])) FLIP_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]); return sFanClubMemberIds[idx]; } u16 Script_GetNumFansOfPlayerInTrainerFanClub(void) { return GetNumFansOfPlayerInTrainerFanClub(TRAINER_FAN_CLUB); } static u16 GetNumFansOfPlayerInTrainerFanClub(struct TrainerFanClub *fanClub) { u8 count = 0; u32 i; for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++) { if (GET_TRAINER_FAN_CLUB_FLAG(i)) count++; } return count; } void Script_TryLoseFansFromPlayTime(void) { TryLoseFansFromPlayTime(TRAINER_FAN_CLUB); } static void TryLoseFansFromPlayTime(struct TrainerFanClub *fanClub) { u8 i = 0; u16 timer; if (gSaveBlock2Ptr->playTimeHours < 999) { while (1) { if (GetNumFansOfPlayerInTrainerFanClub(fanClub) < 5) { VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours); break; } if (i == NUM_TRAINER_FAN_CLUB_MEMBERS) break; timer = VarGet(VAR_FANCLUB_LOSE_FAN_TIMER); if (gSaveBlock2Ptr->playTimeHours - timer < 12) break; PlayerLoseRandomTrainerFan(fanClub); timer = VarGet(VAR_FANCLUB_LOSE_FAN_TIMER); VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, timer + 12); i++; } } } bool16 Script_IsFanClubMemberFanOfPlayer(void) { return IsFanClubMemberFanOfPlayer(TRAINER_FAN_CLUB); } static bool16 IsFanClubMemberFanOfPlayer(struct TrainerFanClub *fanClub) { return GET_TRAINER_FAN_CLUB_FLAG(gSpecialVar_0x8004); } static void SetInitialFansOfPlayer(struct TrainerFanClub *fanClub) { SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER1); SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER2); SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER3); } void Script_BufferFanClubTrainerName(void) { u8 whichLinkTrainer = 0; u8 whichNPCTrainer = 0; switch (gSpecialVar_0x8004) { case FANCLUB_MEMBER1: whichNPCTrainer = 0; whichLinkTrainer = 0; break; case FANCLUB_MEMBER2: case FANCLUB_MEMBER3: case FANCLUB_MEMBER4: case FANCLUB_MEMBER8: break; case FANCLUB_MEMBER5: whichNPCTrainer = 1; whichLinkTrainer = 0; break; case FANCLUB_MEMBER6: whichNPCTrainer = 0; whichLinkTrainer = 1; break; case FANCLUB_MEMBER7: whichNPCTrainer = 2; whichLinkTrainer = 1; break; } BufferFanClubTrainerName(&gSaveBlock2Ptr->linkBattleRecords, whichLinkTrainer, whichNPCTrainer); } static void BufferFanClubTrainerName(struct LinkBattleRecords *linkRecords, u8 whichLinkTrainer, u8 whichNPCTrainer) { u8 *str; const u8 *linkTrainerName = linkRecords->entries[whichLinkTrainer].name; if (linkTrainerName[0] == EOS) { switch (whichNPCTrainer) { case 0: StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName); break; case 1: StringCopy(gStringVar1, gText_LtSurge); break; case 2: StringCopy(gStringVar1, gText_Koga); break; default: StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName); break; } } else { str = gStringVar1; StringCopyN(str, linkTrainerName, PLAYER_NAME_LENGTH); str[PLAYER_NAME_LENGTH] = EOS; if ( str[0] == EXT_CTRL_CODE_BEGIN && str[1] == EXT_CTRL_CODE_JPN) { str += 2; while (*str != EOS) str++; *str++ = EXT_CTRL_CODE_BEGIN; *str++ = EXT_CTRL_CODE_ENG; *str++ = EOS; } } } void Special_UpdateTrainerFansAfterLinkBattle(void) { UpdateTrainerFansAfterLinkBattle(TRAINER_FAN_CLUB); } static void UpdateTrainerFansAfterLinkBattle(struct TrainerFanClub *fanClub) { if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2) { TryLoseFansFromPlayTimeAfterLinkBattle(fanClub); if (gBattleOutcome == B_OUTCOME_WON) PlayerGainRandomTrainerFan(fanClub); else PlayerLoseRandomTrainerFan(fanClub); } } static bool8 DidPlayerGetFirstFans(struct TrainerFanClub *fanClub) { return fanClub->gotInitialFans; } void Script_SetPlayerGotFirstFans(void) { SetPlayerGotFirstFans(TRAINER_FAN_CLUB); } static void SetPlayerGotFirstFans(struct TrainerFanClub *fanClub) { fanClub->gotInitialFans = TRUE; } u8 Script_TryGainNewFanFromCounter(void) { return TryGainNewFanFromCounter(TRAINER_FAN_CLUB, gSpecialVar_0x8004); } ================================================ FILE: src/trainer_pokemon_sprites.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "data.h" struct PicData { u8 *frames; struct SpriteFrameImage *images; u16 paletteTag; u8 spriteId; u8 active; }; #define PICS_COUNT 8 static EWRAM_DATA struct SpriteTemplate sCreatingSpriteTemplate = {}; static EWRAM_DATA struct PicData sSpritePics[PICS_COUNT] = {}; static const struct PicData sDummyPicData = {}; static const struct OamData sOamData_Normal = { .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64) }; void DummyPicSpriteCallback(struct Sprite *sprite) { } bool16 ResetAllPicSprites(void) { int i; for (i = 0; i < PICS_COUNT; i ++) sSpritePics[i] = sDummyPicData; return FALSE; } static bool16 DecompressPic(u16 species, u32 personality, bool8 isFrontPic, u8 *dest, bool8 isTrainer, bool8 ignoreDeoxys) { if (!isTrainer) { if (isFrontPic) { if (!ignoreDeoxys) LoadSpecialPokePic(&gMonFrontPicTable[species], dest, species, personality, isFrontPic); else LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], dest, species, personality, isFrontPic); } else { if (!ignoreDeoxys) LoadSpecialPokePic(&gMonBackPicTable[species], dest, species, personality, isFrontPic); else LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], dest, species, personality, isFrontPic); } } else { if (isFrontPic) DecompressPicFromTable(&gTrainerFrontPicTable[species], dest, species); else DecompressPicFromTable(&gTrainerBackPicTable[species], dest, species); } return FALSE; } static bool16 DecompressPic_HandleDeoxys(u16 species, u32 personality, bool8 isFrontPic, u8 *dest, bool8 isTrainer) { return DecompressPic(species, personality, isFrontPic, dest, isTrainer, FALSE); } void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 paletteSlot, u16 paletteTag, bool8 isTrainer) { if (!isTrainer) { if (paletteTag == TAG_NONE) { sCreatingSpriteTemplate.paletteTag = TAG_NONE; LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality), OBJ_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP); } else { sCreatingSpriteTemplate.paletteTag = paletteTag; LoadCompressedSpritePalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality)); } } else { if (paletteTag == TAG_NONE) { sCreatingSpriteTemplate.paletteTag = TAG_NONE; LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, OBJ_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP); } else { sCreatingSpriteTemplate.paletteTag = paletteTag; LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[species]); } } } void LoadPicPaletteBySlot(u16 species, u32 otId, u32 personality, u8 paletteSlot, bool8 isTrainer) { if (!isTrainer) LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality), BG_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP); else LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, BG_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP); } void AssignSpriteAnimsTable(bool8 isTrainer) { if (!isTrainer) sCreatingSpriteTemplate.anims = gAnims_MonPic; else sCreatingSpriteTemplate.anims = gTrainerFrontAnimsPtrTable[0]; } u16 CreatePicSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer, bool8 ignoreDeoxys) { u32 i; u8 *framePics; struct SpriteFrameImage *images; int j; u8 spriteId; for (i = 0; i < PICS_COUNT; i ++) { if (!sSpritePics[i].active) break; } if (i == PICS_COUNT) return 0xFFFF; framePics = Alloc(4 * 0x800); if (!framePics) return 0xFFFF; images = Alloc(4 * sizeof(struct SpriteFrameImage)); if (!images) { Free(framePics); return 0xFFFF; } if (DecompressPic(species, personality, isFrontPic, framePics, isTrainer, ignoreDeoxys)) { // debug trap? return 0xFFFF; } for (j = 0; j < 4; j ++) { images[j].data = framePics + 0x800 * j; images[j].size = 0x800; } sCreatingSpriteTemplate.tileTag = TAG_NONE; sCreatingSpriteTemplate.oam = &sOamData_Normal; AssignSpriteAnimsTable(isTrainer); sCreatingSpriteTemplate.images = images; sCreatingSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; sCreatingSpriteTemplate.callback = DummyPicSpriteCallback; LoadPicPaletteByTagOrSlot(species, otId, personality, paletteSlot, paletteTag, isTrainer); spriteId = CreateSprite(&sCreatingSpriteTemplate, x, y, 0); if (paletteTag == TAG_NONE) gSprites[spriteId].oam.paletteNum = paletteSlot; sSpritePics[i].frames = framePics; sSpritePics[i].images = images; sSpritePics[i].paletteTag = paletteTag; sSpritePics[i].spriteId = spriteId; sSpritePics[i].active = TRUE; return spriteId; } u16 CreatePicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer) { return CreatePicSprite(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, isTrainer, FALSE); } u16 FreeAndDestroyPicSpriteInternal(u16 spriteId) { u32 i; u8 *framePics; struct SpriteFrameImage *images; for (i = 0; i < PICS_COUNT; i ++) { if (sSpritePics[i].spriteId == spriteId) break; } if (i == PICS_COUNT) return 0xFFFF; framePics = sSpritePics[i].frames; images = sSpritePics[i].images; if (sSpritePics[i].paletteTag != TAG_NONE) FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum)); DestroySprite(&gSprites[spriteId]); Free(framePics); Free(images); sSpritePics[i] = sDummyPicData; return 0; } static u16 LoadPicSpriteInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId, bool8 isTrainer) { if (DecompressPic_HandleDeoxys(species, personality, isFrontPic, (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA), FALSE)) return 0xFFFF; LoadPicPaletteBySlot(species, otId, personality, paletteSlot, isTrainer); return 0; } u16 CreateTrainerCardSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId, bool8 isTrainer) { u8 *framePics; framePics = Alloc(4 * 0x800); if (framePics && !DecompressPic_HandleDeoxys(species, personality, isFrontPic, framePics, isTrainer)) { BlitBitmapRectToWindow(windowId, framePics, 0, 0, 0x40, 0x40, destX, destY, 0x40, 0x40); LoadPicPaletteBySlot(species, otId, personality, paletteSlot, isTrainer); Free(framePics); return 0; } return 0xFFFF; } u16 CreateMonPicSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 ignoreDeoxys) { return CreatePicSprite(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, FALSE, ignoreDeoxys); } u16 CreateMonPicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag) { return CreateMonPicSprite(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, FALSE); } u16 FreeAndDestroyMonPicSprite(u16 spriteId) { return FreeAndDestroyPicSpriteInternal(spriteId); } u16 LoadMonPicInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId) { return CreateTrainerCardSprite(species, otId, personality, isFrontPic, 0, 0, paletteSlot, windowId, FALSE); } u16 CreateTrainerCardMonIconSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId) { return CreateTrainerCardSprite(species, otId, personality, isFrontPic, destX, destY, paletteSlot, windowId, FALSE); } u16 CreateTrainerPicSprite(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag) { return CreatePicSprite_HandleDeoxys(species, 0, 0, isFrontPic, x, y, paletteSlot, paletteTag, TRUE); } u16 FreeAndDestroyTrainerPicSprite(u16 spriteId) { return FreeAndDestroyPicSpriteInternal(spriteId); } u16 LoadTrainerPicInWindow(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId) { return LoadPicSpriteInWindow(species, 0, 0, isFrontPic, paletteSlot, windowId, TRUE); } u16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId) { return CreateTrainerCardSprite(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE); } u16 PlayerGenderToFrontTrainerPicId(u8 gender, bool8 getClass) { if (getClass == TRUE) { if (gender != MALE) return gFacilityClassToPicIndex[FACILITY_CLASS_LEAF]; else return gFacilityClassToPicIndex[FACILITY_CLASS_RED]; } return gender; } ================================================ FILE: src/trainer_see.c ================================================ #include "global.h" #include "battle_setup.h" #include "event_object_movement.h" #include "field_effect.h" #include "field_player_avatar.h" #include "quest_log.h" #include "script.h" #include "task.h" #include "util.h" #include "constants/battle_setup.h" #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/trainer_types.h" typedef u8 (*TrainerApproachFunc)(struct ObjectEvent *, s16, s16, s16); typedef bool8 (*TrainerSeeFunc)(u8, struct Task *, struct ObjectEvent *); static bool8 CheckTrainer(u8 trainerObjId); static u8 GetTrainerApproachDistance(struct ObjectEvent * trainerObj); static u8 GetTrainerApproachDistanceSouth(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y); static u8 GetTrainerApproachDistanceNorth(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y); static u8 GetTrainerApproachDistanceWest(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y); static u8 GetTrainerApproachDistanceEast(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y); static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent * trainerObj, u8 approachDistance, u8 facingDirection); static void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance); static void Task_RunTrainerSeeFuncList(u8 taskId); static bool8 TrainerSeeFunc_Dummy(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_StartExclMark(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_WaitExclMark(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_TrainerApproach(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_PrepareToEngage(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_End(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_BeginRemoveDisguise(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_WaitRemoveDisguise(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_TrainerInAshFacesPlayer(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_BeginJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_WaitJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_EndJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj); static void Task_DestroyTrainerApproachTask(u8 taskId); static void SpriteCB_TrainerIcons(struct Sprite *sprite); static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum); static const u16 sGfx_Emoticons[] = INCBIN_U16("graphics/misc/emoticons.4bpp"); // u8 func(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y) // range is the maximum distance the trainer can see // x and y are the player's coordinates // Returns distance to walk if trainer has unobstructed view of player // Returns 0 if trainer can't see player static const TrainerApproachFunc sDirectionalApproachDistanceFuncs[] = { GetTrainerApproachDistanceSouth, GetTrainerApproachDistanceNorth, GetTrainerApproachDistanceWest, GetTrainerApproachDistanceEast }; // bool8 func(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) // Returns TRUE to run the next func immediately // Returns FALSE to delay the next func to the next frame static const TrainerSeeFunc sTrainerSeeFuncList[] = { TrainerSeeFunc_Dummy, TrainerSeeFunc_StartExclMark, TrainerSeeFunc_WaitExclMark, TrainerSeeFunc_TrainerApproach, TrainerSeeFunc_PrepareToEngage, TrainerSeeFunc_End, TrainerSeeFunc_BeginRemoveDisguise, TrainerSeeFunc_WaitRemoveDisguise, TrainerSeeFunc_TrainerInAshFacesPlayer, TrainerSeeFunc_BeginJumpOutOfAsh, TrainerSeeFunc_WaitJumpOutOfAsh, TrainerSeeFunc_EndJumpOutOfAsh, TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj, TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp, TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown }; static const TrainerSeeFunc sTrainerSeeFuncList2[] = { TrainerSeeFunc_TrainerInAshFacesPlayer, TrainerSeeFunc_BeginJumpOutOfAsh, TrainerSeeFunc_WaitJumpOutOfAsh, TrainerSeeFunc_EndJumpOutOfAsh }; bool8 CheckForTrainersWantingBattle(void) { u32 i; if (QL_IsTrainerSightDisabled() == TRUE) return FALSE; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active && (gObjectEvents[i].trainerType == TRAINER_TYPE_NORMAL || gObjectEvents[i].trainerType == TRAINER_TYPE_BURIED) && CheckTrainer(i)) return TRUE; } return FALSE; } static bool8 CheckTrainer(u8 trainerObjId) { const u8 *script = GetObjectEventScriptPointerByObjectEventId(trainerObjId); u8 approachDistance; if (GetTrainerFlagFromScriptPointer(script)) return FALSE; approachDistance = GetTrainerApproachDistance(&gObjectEvents[trainerObjId]); if (approachDistance != 0) { if (script[1] == TRAINER_BATTLE_DOUBLE && GetMonsStateToDoubles()) return FALSE; ConfigureAndSetUpOneTrainerBattle(trainerObjId, script); TrainerApproachPlayer(&gObjectEvents[trainerObjId], approachDistance - 1); return TRUE; } return FALSE; } static u8 GetTrainerApproachDistance(struct ObjectEvent *trainerObj) { s16 x, y; u32 i; u8 approachDistance; PlayerGetDestCoords(&x, &y); if (trainerObj->trainerType == TRAINER_TYPE_NORMAL) // can only see in one direction { approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->facingDirection - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->facingDirection); } else // TRAINER_TYPE_SEE_ALL_DIRECTIONS, TRAINER_TYPE_BURIED { for (i = 0; i < 4; i++) { approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east return approachDistance; } } return 0; } // Returns how far south the player is from trainer. 0 if out of trainer's sight. static u8 GetTrainerApproachDistanceSouth(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) { if (trainerObj->currentCoords.x == x && y > trainerObj->currentCoords.y && y <= trainerObj->currentCoords.y + range) { if (range > 3 && GetFirstInactiveObjectEventId() == OBJECT_EVENTS_COUNT) return 0; return (y - trainerObj->currentCoords.y); } else return 0; } // Returns how far north the player is from trainer. 0 if out of trainer's sight. static u8 GetTrainerApproachDistanceNorth(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) { if (trainerObj->currentCoords.x == x && y < trainerObj->currentCoords.y && y >= trainerObj->currentCoords.y - range) return (trainerObj->currentCoords.y - y); else return 0; } // Returns how far west the player is from trainer. 0 if out of trainer's sight. static u8 GetTrainerApproachDistanceWest(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) { if (trainerObj->currentCoords.y == y && x < trainerObj->currentCoords.x && x >= trainerObj->currentCoords.x - range) return (trainerObj->currentCoords.x - x); else return 0; } // Returns how far east the player is from trainer. 0 if out of trainer's sight. static u8 GetTrainerApproachDistanceEast(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) { if (trainerObj->currentCoords.y == y && x > trainerObj->currentCoords.x && x <= trainerObj->currentCoords.x + range) return (x - trainerObj->currentCoords.x); else return 0; } #define COLLISION_MASK (~1) static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 approachDistance, u8 direction) { s16 x, y; u8 unk19_temp; u8 unk19b_temp; u32 i; u8 collision; if (approachDistance == 0) return 0; x = trainerObj->currentCoords.x; y = trainerObj->currentCoords.y; for (i = 0; i <= approachDistance - 1; i++, MoveCoords(direction, &x, &y)) { collision = GetCollisionFlagsAtCoords(trainerObj, x, y, direction); if (collision != 0 && (collision & COLLISION_MASK)) return 0; } // preserve mapobj_unk_19 before clearing. unk19_temp = trainerObj->rangeX; unk19b_temp = trainerObj->rangeY; trainerObj->rangeX = 0; trainerObj->rangeY = 0; collision = GetCollisionAtCoords(trainerObj, x, y, direction); trainerObj->rangeX = unk19_temp; trainerObj->rangeY = unk19b_temp; if (collision == 4) return approachDistance; return 0; } #define tFuncId data[0] #define tTrainerObjHi data[1] #define tTrainerObjLo data[2] #define tTrainerRange data[3] #define tOutOfAshSpriteId data[4] #define tData5 data[5] #define TaskGetTrainerObj(dest, task) do { \ (dest) = (struct ObjectEvent *)(((task)->tTrainerObjHi << 16) | ((u16)(task)->tTrainerObjLo)); \ } while (0) static void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance) { u8 taskId = CreateTask(Task_RunTrainerSeeFuncList, 80); struct Task *task = &gTasks[taskId]; task->tTrainerObjHi = ((uintptr_t)trainerObj) >> 16; task->tTrainerObjLo = (uintptr_t)trainerObj; task->tTrainerRange = approachDistance; } static void StartTrainerApproachWithFollowupTask(TaskFunc taskFunc) { u8 taskId = FindTaskIdByFunc(Task_RunTrainerSeeFuncList); SetTaskFuncWithFollowupFunc(taskId, Task_RunTrainerSeeFuncList, taskFunc); gTasks[taskId].tFuncId = 1; Task_RunTrainerSeeFuncList(taskId); } static void Task_RunTrainerSeeFuncList(u8 taskId) { struct Task *task = &gTasks[taskId]; struct ObjectEvent * trainerObj; TaskGetTrainerObj(trainerObj, task); if (!trainerObj->active) { SwitchTaskToFollowupFunc(taskId); } else { while (sTrainerSeeFuncList[task->tFuncId](taskId, task, trainerObj)) ; } } // TrainerSeeFuncs static bool8 TrainerSeeFunc_Dummy(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { return FALSE; } static bool8 TrainerSeeFunc_StartExclMark(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { u8 action; // FRLG introduces trainers who can see the player from offscreen above. // Handle this case here. if (trainerObj->facingDirection == DIR_SOUTH && task->tTrainerRange > 2) { task->tFuncId = 12; } else { ObjectEventGetLocalIdAndMap(trainerObj, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); action = GetFaceDirectionMovementAction(trainerObj->facingDirection); ObjectEventSetHeldMovement(trainerObj, action); task->tFuncId++; } return TRUE; } static bool8 TrainerSeeFunc_WaitExclMark(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON)) { return FALSE; } else { task->tFuncId++; if (trainerObj->movementType == MOVEMENT_TYPE_TREE_DISGUISE || trainerObj->movementType == MOVEMENT_TYPE_MOUNTAIN_DISGUISE) task->tFuncId = 6; if (trainerObj->movementType == MOVEMENT_TYPE_BURIED) task->tFuncId = 8; return TRUE; } } static bool8 TrainerSeeFunc_TrainerApproach(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj)) { if (task->tTrainerRange) { ObjectEventSetHeldMovement(trainerObj, GetWalkNormalMovementAction(trainerObj->facingDirection)); task->tTrainerRange--; } else { ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_FACE_PLAYER); task->tFuncId++; } } return FALSE; } static bool8 TrainerSeeFunc_PrepareToEngage(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { struct ObjectEvent *playerObj; if (ObjectEventIsMovementOverridden(trainerObj) && !ObjectEventClearHeldMovementIfFinished(trainerObj)) return FALSE; SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); OverrideMovementTypeForObjectEvent(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); OverrideTemplateCoordsForObjectEvent(trainerObj); playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventIsMovementOverridden(playerObj) && !ObjectEventClearHeldMovementIfFinished(playerObj)) return FALSE; CancelPlayerForcedMovement(); // Uncomment to have player turn to face their opponent // ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetFaceDirectionMovementAction(GetOppositeDirection(trainerObj->facingDirection))); task->tFuncId++; return FALSE; } static bool8 TrainerSeeFunc_End(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj)) SwitchTaskToFollowupFunc(taskId); // This ends the trainer walk routine. return FALSE; } // Jumps here if disguised. Not used in FRLG. static bool8 TrainerSeeFunc_BeginRemoveDisguise(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj)) { ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_REVEAL_TRAINER); task->tFuncId++; } return FALSE; } static bool8 TrainerSeeFunc_WaitRemoveDisguise(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { if (ObjectEventClearHeldMovementIfFinished(trainerObj)) task->tFuncId = 3; return FALSE; } // Jump here if buried in ash. Not used in FRLG. static bool8 TrainerSeeFunc_TrainerInAshFacesPlayer(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj)) { ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_FACE_PLAYER); task->tFuncId++; } return FALSE; } static bool8 TrainerSeeFunc_BeginJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { if (ObjectEventCheckHeldMovementStatus(trainerObj)) { gFieldEffectArguments[0] = trainerObj->currentCoords.x; gFieldEffectArguments[1] = trainerObj->currentCoords.y; gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1; gFieldEffectArguments[3] = 2; task->tOutOfAshSpriteId = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); task->tFuncId++; } return FALSE; } static bool8 TrainerSeeFunc_WaitJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { struct Sprite *sprite; if (gSprites[task->tOutOfAshSpriteId].animCmdIndex == 2) { trainerObj->fixedPriority = FALSE; trainerObj->triggerGroundEffectsOnMove = TRUE; sprite = &gSprites[trainerObj->spriteId]; sprite->oam.priority = 2; ObjectEventClearHeldMovementIfFinished(trainerObj); ObjectEventSetHeldMovement(trainerObj, GetJumpInPlaceMovementAction(trainerObj->facingDirection)); task->tFuncId++; } return FALSE; } static bool8 TrainerSeeFunc_EndJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) task->tFuncId = 3; return FALSE; } // FRLG exclusive: Scroll the camera up to reveal an offscreen above trainer static bool8 TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { int specialObjectId; task->tData5 = 0; specialObjectId = SpawnSpecialObjectEventParameterized(OBJ_EVENT_GFX_YOUNGSTER, 7, OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7, 3); gObjectEvents[specialObjectId].invisible = TRUE; CameraObjectSetFollowedObjectId(gObjectEvents[specialObjectId].spriteId); task->tFuncId++; return FALSE; } static bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { u8 specialObjectId; TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &specialObjectId); if (ObjectEventIsMovementOverridden(&gObjectEvents[specialObjectId]) && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[specialObjectId])) return FALSE; if (task->tData5 != task->tTrainerRange - 1) { ObjectEventSetHeldMovement(&gObjectEvents[specialObjectId], GetWalkFastMovementAction(DIR_NORTH)); task->tData5++; } else { ObjectEventGetLocalIdAndMap(trainerObj, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); task->tData5 = 0; task->tFuncId++; } return FALSE; } static bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj) { u8 specialObjectId; TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &specialObjectId); if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON)) return FALSE; if (ObjectEventIsMovementOverridden(&gObjectEvents[specialObjectId]) && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[specialObjectId])) return FALSE; if (task->tData5 != task->tTrainerRange - 1) { ObjectEventSetHeldMovement(&gObjectEvents[specialObjectId], GetWalkFastMovementAction(DIR_SOUTH)); task->tData5++; } else { CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); RemoveObjectEventByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); task->tData5 = 0; task->tFuncId = 2; } return FALSE; } #undef tData5 #undef tOutOfAshSpriteId #undef tTrainerRange #undef tTrainerObjLo #undef tTrainerObjHi #undef tFuncId static void Task_RevealTrainer_RunTrainerSeeFuncList(u8 taskId) { struct Task *task = &gTasks[taskId]; struct ObjectEvent * trainerObj; // another objEvent loaded into by loadword? LoadWordFromTwoHalfwords((u16 *)&task->data[1], (uintptr_t *)&trainerObj); if (!task->data[7]) { ObjectEventClearHeldMovement(trainerObj); task->data[7]++; } sTrainerSeeFuncList2[task->data[0]](taskId, task, trainerObj); if (task->data[0] == 3 && !FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) { SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); OverrideMovementTypeForObjectEvent(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); DestroyTask(taskId); } else { trainerObj->heldMovementFinished = FALSE; } } void MovementAction_RevealTrainer_RunTrainerSeeFuncList(struct ObjectEvent *var) { StoreWordInTwoHalfwords((u16 *)&gTasks[CreateTask(Task_RevealTrainer_RunTrainerSeeFuncList, 0)].data[1], (u32)var); } void EndTrainerApproach(void) { StartTrainerApproachWithFollowupTask(Task_DestroyTrainerApproachTask); } static void Task_DestroyTrainerApproachTask(u8 taskId) { DestroyTask(taskId); ScriptContext_Enable(); } // Trainer See Excl Mark Field Effect #define sLocalId data[0] #define sMapNum data[1] #define sMapGroup data[2] #define sData3 data[3] #define sData4 data[4] #define sFldEffId data[7] static const struct OamData sOamData_Emoticons = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(16x16), .x = 0, .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0, }; static const struct SpriteFrameImage sSpriteImages_Emoticons[] = { {sGfx_Emoticons + 0x000, 0x80}, {sGfx_Emoticons + 0x040, 0x80}, {sGfx_Emoticons + 0x080, 0x80}, {sGfx_Emoticons + 0x180, 0x80}, {sGfx_Emoticons + 0x1C0, 0x80}, {sGfx_Emoticons + 0x200, 0x80}, {sGfx_Emoticons + 0x0C0, 0x80}, {sGfx_Emoticons + 0x100, 0x80}, {sGfx_Emoticons + 0x140, 0x80}, {sGfx_Emoticons + 0x240, 0x80}, {sGfx_Emoticons + 0x280, 0x80}, {sGfx_Emoticons + 0x2C0, 0x80}, {sGfx_Emoticons + 0x300, 0x80}, {sGfx_Emoticons + 0x340, 0x80}, {sGfx_Emoticons + 0x380, 0x80}, }; static const union AnimCmd sAnimCmd_ExclamationMark1[] = { ANIMCMD_FRAME( 0, 4), ANIMCMD_FRAME( 1, 4), ANIMCMD_FRAME( 2, 52), ANIMCMD_END }; static const union AnimCmd sAnimCmd_DoubleExclMark[] = { ANIMCMD_FRAME( 6, 4), ANIMCMD_FRAME( 7, 4), ANIMCMD_FRAME( 8, 52), ANIMCMD_END }; static const union AnimCmd sAnimCmd_X[] = { ANIMCMD_FRAME( 3, 4), ANIMCMD_FRAME( 4, 4), ANIMCMD_FRAME( 5, 52), ANIMCMD_END }; static const union AnimCmd sAnimCmd_SmileyFace[] = { ANIMCMD_FRAME( 9, 4), ANIMCMD_FRAME(10, 4), ANIMCMD_FRAME(11, 52), ANIMCMD_END }; static const union AnimCmd sAnimCmd_QuestionMark[] = { ANIMCMD_FRAME(12, 4), ANIMCMD_FRAME(13, 4), ANIMCMD_FRAME(14, 52), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_Emoticons[] = { sAnimCmd_ExclamationMark1, sAnimCmd_DoubleExclMark, sAnimCmd_X, sAnimCmd_SmileyFace, sAnimCmd_QuestionMark }; static const struct SpriteTemplate sSpriteTemplate_Emoticons = { .tileTag = 0xFFFF, .paletteTag = 0xFFFF, .oam = &sOamData_Emoticons, .anims = sSpriteAnimTable_Emoticons, .images = sSpriteImages_Emoticons, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_TrainerIcons }; u8 FldEff_ExclamationMarkIcon1(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x53); if (spriteId != MAX_SPRITES) SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 0); return 0; } u8 FldEff_DoubleExclMarkIcon(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52); if (spriteId != MAX_SPRITES) SetIconSpriteData(&gSprites[spriteId], FLDEFF_DOUBLE_EXCL_MARK_ICON, 1); return 0; } u8 FldEff_XIcon(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52); if (spriteId != MAX_SPRITES) SetIconSpriteData(&gSprites[spriteId], FLDEFF_X_ICON, 2); return 0; } u8 FldEff_SmileyFaceIcon(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52); if (spriteId != MAX_SPRITES) SetIconSpriteData(&gSprites[spriteId], FLDEFF_SMILEY_FACE_ICON, 3); return 0; } u8 FldEff_QuestionMarkIcon(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52); if (spriteId != MAX_SPRITES) SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 4); return 0; } static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum) { sprite->oam.priority = 1; sprite->coordOffsetEnabled = 1; sprite->sLocalId = gFieldEffectArguments[0]; sprite->sMapNum = gFieldEffectArguments[1]; sprite->sMapGroup = gFieldEffectArguments[2]; sprite->sData3 = -5; sprite->sFldEffId = fldEffId; StartSpriteAnim(sprite, spriteAnimNum); } static void SpriteCB_TrainerIcons(struct Sprite *sprite) { u8 objEventId; if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objEventId) || sprite->animEnded) { FieldEffectStop(sprite, sprite->sFldEffId); } else { struct Sprite *objEventSprite = &gSprites[gObjectEvents[objEventId].spriteId]; sprite->sData4 += sprite->sData3; sprite->x = objEventSprite->x; sprite->y = objEventSprite->y - 16; sprite->x2 = objEventSprite->x2; sprite->y2 = objEventSprite->y2 + sprite->sData4; if (sprite->sData4) sprite->sData3++; else sprite->sData3 = 0; } } #undef sLocalId #undef sMapNum #undef sMapGroup #undef sData3 #undef sData4 #undef sFldEffId ================================================ FILE: src/trainer_tower.c ================================================ #include "global.h" #include "gflib.h" #include "util.h" #include "event_data.h" #include "cereader_tool.h" #include "easy_chat.h" #include "battle_setup.h" #include "battle_transition.h" #include "battle.h" #include "battle_main.h" #include "overworld.h" #include "item.h" #include "menu.h" #include "new_menu_helpers.h" #include "constants/items.h" #include "constants/songs.h" #include "constants/layouts.h" #include "constants/trainers.h" #include "constants/event_objects.h" #include "constants/trainer_tower.h" #define CURR_FLOOR sTrainerTowerState->data.floors[sTrainerTowerState->floorIdx] #define TRAINER_TOWER gSaveBlock1Ptr->trainerTower[gSaveBlock1Ptr->towerChallengeId] struct TrainerTowerState { /* 0x0000 */ u8 floorIdx; /* 0x0004 */ struct EReaderTrainerTowerSet data; }; struct TrainerTowerOpponent { /* 0x00 */ u8 name[11]; /* 0x0C */ u16 speechWin[6]; /* 0x18 */ u16 speechLose[6]; /* 0x24 */ u16 speechWin2[6]; /* 0x30 */ u16 speechLose2[6]; /* 0x3C */ u8 battleType; /* 0x3D */ u8 facilityClass; /* 0x3E */ u8 textColor; }; struct SinglesTrainerInfo { u8 objGfx; u8 facilityClass; bool8 gender; }; struct DoublesTrainerInfo { u8 objGfx1; u8 objGfx2; u8 facilityClass; bool8 gender1; bool8 gender2; }; struct TrainerEncounterMusicPairs { u8 facilityClass; u8 musicId; }; static EWRAM_DATA struct TrainerTowerState * sTrainerTowerState = NULL; static EWRAM_DATA struct TrainerTowerOpponent * sTrainerTowerOpponent = NULL; static EWRAM_DATA u8 sUnused = 0; static void SetUpTrainerTowerDataStruct(void); static void FreeTrainerTowerDataStruct(void); static void InitTrainerTowerFloor(void); static void SetTrainerTowerNPCGraphics(void); static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest); static void BufferTowerOpponentSpeech(void); static void TrainerTowerGetOpponentTextColor(u8 battleType, u8 facilityClass); static void DoTrainerTowerBattle(void); static void TrainerTowerGetChallengeType(void); static void TrainerTowerAddFloorCleared(void); static void GetFloorAlreadyCleared(void); static void StartTrainerTowerChallenge(void); static void GetOwnerState(void); static void GiveChallengePrize(void); static void CheckFinalTime(void); static void TrainerTowerResumeTimer(void); static void TrainerTowerSetPlayerLost(void); static void GetTrainerTowerChallengeStatus(void); static void GetCurrentTime(void); static void ShowResultsBoard(void); static void CloseResultsBoard(void); static void TrainerTowerGetDoublesEligiblity(void); static void TrainerTowerGetNumFloors(void); static void ShouldWarpToCounter(void); static void PlayTrainerTowerEncounterMusic(void); static void HasSpokenToOwner(void); static void BuildEnemyParty(void); static s32 GetPartyMaxLevel(void); static void ValidateOrResetCurTrainerTowerRecord(void); static u32 GetTrainerTowerRecordTime(u32 *); static void SetTrainerTowerRecordTime(u32 *, u32); extern const u8 gText_TimeBoard[]; extern const u8 gText_XMinYZSec[]; extern const u8 *const gTrainerTowerChallengeTypeTexts[]; static const struct SinglesTrainerInfo sSingleBattleTrainerInfo[] = { {OBJ_EVENT_GFX_AROMA_LADY, FACILITY_CLASS_RS_AROMA_LADY, FEMALE}, {OBJ_EVENT_GFX_RUIN_MANIAC, FACILITY_CLASS_RS_RUIN_MANIAC, MALE}, {OBJ_EVENT_GFX_TUBER_F, FACILITY_CLASS_RS_TUBER_F, FEMALE}, {OBJ_EVENT_GFX_TUBER_M_LAND, FACILITY_CLASS_RS_TUBER_M, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_RS_COOLTRAINER_M, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_RS_COOLTRAINER_F, FEMALE}, {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_HEX_MANIAC, MALE}, {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_RS_LADY, FEMALE}, {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_RS_BEAUTY, FEMALE}, {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_RICH_BOY, MALE}, {OBJ_EVENT_GFX_POKE_MANIAC, FACILITY_CLASS_RS_POKEMANIAC, MALE}, {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_RS_SWIMMER_M, MALE}, {OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_RS_BLACK_BELT, MALE}, {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_GUITARIST, MALE}, {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_KINDLER, MALE}, {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_RS_CAMPER, MALE}, {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BUG_MANIAC, MALE}, {OBJ_EVENT_GFX_PSYCHIC_M, FACILITY_CLASS_RS_PSYCHIC_M, MALE}, {OBJ_EVENT_GFX_PSYCHIC_F, FACILITY_CLASS_RS_PSYCHIC_F, FEMALE}, {OBJ_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_RS_GENTLEMAN, MALE}, {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_SCHOOL_KID_M, MALE}, {OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SCHOOL_KID_F, FEMALE}, {OBJ_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_POKEFAN_M, MALE}, {OBJ_EVENT_GFX_WOMAN_3, FACILITY_CLASS_POKEFAN_F, FEMALE}, {OBJ_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_EXPERT_M, MALE}, {OBJ_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_EXPERT_F, FEMALE}, {OBJ_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_RS_YOUNGSTER, MALE}, {OBJ_EVENT_GFX_FISHER, FACILITY_CLASS_RS_FISHERMAN, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_DRAGON_TAMER, MALE}, {OBJ_EVENT_GFX_BIRD_KEEPER, FACILITY_CLASS_RS_BIRD_KEEPER, MALE}, {OBJ_EVENT_GFX_LITTLE_BOY, FACILITY_CLASS_NINJA_BOY, MALE}, {OBJ_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_BATTLE_GIRL, FEMALE}, {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_PARASOL_LADY, FEMALE}, {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_RS_SWIMMER_F, FEMALE}, {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_RS_PICNICKER, FEMALE}, {OBJ_EVENT_GFX_SAILOR, FACILITY_CLASS_RS_SAILOR, MALE}, {OBJ_EVENT_GFX_FAT_MAN, FACILITY_CLASS_COLLECTOR, MALE}, {OBJ_EVENT_GFX_MAN, FACILITY_CLASS_RS_PKMN_BREEDER_M, MALE}, {OBJ_EVENT_GFX_POKEMON_BREEDER, FACILITY_CLASS_RS_PKMN_BREEDER_F, FEMALE}, {OBJ_EVENT_GFX_POKEMON_RANGER_M, FACILITY_CLASS_RS_PKMN_RANGER_M, MALE}, {OBJ_EVENT_GFX_POKEMON_RANGER_F, FACILITY_CLASS_RS_PKMN_RANGER_F, FEMALE}, {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_RS_LASS, FEMALE}, {OBJ_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_RS_BUG_CATCHER, MALE}, {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_RS_HIKER, MALE}, {OBJ_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, MALE}, {OBJ_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER, MALE}, {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_LASS, FEMALE}, {OBJ_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR, MALE}, {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER, MALE}, {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER, FEMALE}, {OBJ_EVENT_GFX_POKE_MANIAC, FACILITY_CLASS_POKEMANIAC, MALE}, {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_SUPER_NERD, MALE}, {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER, MALE}, {OBJ_EVENT_GFX_BIKER, FACILITY_CLASS_BIKER, MALE}, {OBJ_EVENT_GFX_BURGLAR, FACILITY_CLASS_BURGLAR, MALE}, {OBJ_EVENT_GFX_ENGINEER, FACILITY_CLASS_ENGINEER, MALE}, {OBJ_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN, MALE}, {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_M, MALE}, {OBJ_EVENT_GFX_CUE_BALL, FACILITY_CLASS_CUE_BALL, MALE}, {OBJ_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_GAMER, MALE}, {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY, FEMALE}, {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_F, FEMALE}, {OBJ_EVENT_GFX_PSYCHIC_M, FACILITY_CLASS_PSYCHIC_M, MALE}, {OBJ_EVENT_GFX_ROCKER_2, FACILITY_CLASS_ROCKER, MALE}, {OBJ_EVENT_GFX_JUGGLER, FACILITY_CLASS_JUGGLER, MALE}, {OBJ_EVENT_GFX_TAMER, FACILITY_CLASS_TAMER, MALE}, {OBJ_EVENT_GFX_BIRD_KEEPER, FACILITY_CLASS_BIRD_KEEPER, MALE}, {OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT, MALE}, {OBJ_EVENT_GFX_SCIENTIST, FACILITY_CLASS_SCIENTIST, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER_M, MALE}, {OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_F, FEMALE}, {OBJ_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN, MALE}, {OBJ_EVENT_GFX_CHANNELER, FACILITY_CLASS_CHANNELER, FEMALE}, {OBJ_EVENT_GFX_PSYCHIC_F, FACILITY_CLASS_PSYCHIC_F, FEMALE}, {OBJ_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_CRUSH_GIRL, FEMALE}, {OBJ_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER, FEMALE}, {OBJ_EVENT_GFX_POKEMON_BREEDER, FACILITY_CLASS_PKMN_BREEDER, FEMALE}, {OBJ_EVENT_GFX_POKEMON_RANGER_M, FACILITY_CLASS_PKMN_RANGER_M, MALE}, {OBJ_EVENT_GFX_POKEMON_RANGER_F, FACILITY_CLASS_PKMN_RANGER_F, FEMALE}, {OBJ_EVENT_GFX_AROMA_LADY, FACILITY_CLASS_AROMA_LADY, FEMALE}, {OBJ_EVENT_GFX_RUIN_MANIAC, FACILITY_CLASS_RUIN_MANIAC, MALE}, {OBJ_EVENT_GFX_LADY, FACILITY_CLASS_LADY, FEMALE}, {OBJ_EVENT_GFX_PAINTER, FACILITY_CLASS_PAINTER, FEMALE} }; static const struct DoublesTrainerInfo sDoubleBattleTrainerInfo[] = { {OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SR_AND_JR, FEMALE, FEMALE}, {OBJ_EVENT_GFX_LITTLE_GIRL, OBJ_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_RS_TWINS, FEMALE, FEMALE}, {OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_MAN, FACILITY_CLASS_RS_YOUNG_COUPLE, FEMALE, MALE}, {OBJ_EVENT_GFX_OLD_MAN_1, OBJ_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_OLD_COUPLE, MALE, FEMALE}, {OBJ_EVENT_GFX_TUBER_M_LAND, OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_RS_SIS_AND_BRO, MALE, FEMALE}, {OBJ_EVENT_GFX_LITTLE_GIRL, OBJ_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_TWINS, FEMALE, FEMALE}, {OBJ_EVENT_GFX_COOLTRAINER_M, OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOL_COUPLE, MALE, FEMALE}, {OBJ_EVENT_GFX_YOUNG_COUPLE_F, OBJ_EVENT_GFX_YOUNG_COUPLE_M, FACILITY_CLASS_YOUNG_COUPLE, FEMALE, MALE}, {OBJ_EVENT_GFX_BATTLE_GIRL, OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_CRUSH_KIN, FEMALE, MALE}, {OBJ_EVENT_GFX_SWIMMER_F_LAND, OBJ_EVENT_GFX_TUBER_M_LAND, FACILITY_CLASS_SIS_AND_BRO, FEMALE, MALE} }; static const struct TrainerEncounterMusicPairs sTrainerEncounterMusicLUT[105] = { {FACILITY_CLASS_RS_AROMA_LADY, TRAINER_ENCOUNTER_MUSIC_AQUA}, {FACILITY_CLASS_BOARDER_F, TRAINER_ENCOUNTER_MUSIC_AQUA}, {FACILITY_CLASS_AQUA_GRUNT_F, TRAINER_ENCOUNTER_MUSIC_AQUA}, {FACILITY_CLASS_GAMER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_RS_RUIN_MANIAC, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_RS_YOUNGSTER, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_RS_YOUNG_COUPLE, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_RS_FISHERMAN, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_RUNNING_TRIATHLETE_F, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_RS_PKMN_RANGER_M, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_LEADER_BRAWLY, TRAINER_ENCOUNTER_MUSIC_TWINS}, {FACILITY_CLASS_RS_SIS_AND_BRO, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_MAGMA_LEADER_MAXIE, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_POKEFAN_F, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_RS_PKMN_RANGER_F, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_PSYCHIC_M, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_PICNICKER, TRAINER_ENCOUNTER_MUSIC_COOL}, {FACILITY_CLASS_ELITE_FOUR_GLACIA, TRAINER_ENCOUNTER_MUSIC_COOL}, {FACILITY_CLASS_RS_COOLTRAINER_F, TRAINER_ENCOUNTER_MUSIC_COOL}, {FACILITY_CLASS_GUITARIST, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_RS_BUG_CATCHER, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_RUNNING_TRIATHLETE_M, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_CAMPER, TRAINER_ENCOUNTER_MUSIC_TWINS}, {FACILITY_CLASS_CYCLING_TRIATHLETE_F, TRAINER_ENCOUNTER_MUSIC_TWINS}, {FACILITY_CLASS_RS_TUBER_F, TRAINER_ENCOUNTER_MUSIC_INTERVIEWER}, {FACILITY_CLASS_BEAUTY, TRAINER_ENCOUNTER_MUSIC_HIKER}, {FACILITY_CLASS_INTERVIEWER, TRAINER_ENCOUNTER_MUSIC_HIKER}, {FACILITY_CLASS_YOUNGSTER, TRAINER_ENCOUNTER_MUSIC_RICH}, {FACILITY_CLASS_RS_PSYCHIC_F, TRAINER_ENCOUNTER_MUSIC_RICH}, {FACILITY_CLASS_MAGMA_GRUNT_F, TRAINER_ENCOUNTER_MUSIC_SWIMMER}, {FACILITY_CLASS_RS_SWIMMER_M, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_PKMN_TRAINER_MAY_3, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_RS_POKEMANIAC, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_SUPER_NERD, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_ENGINEER, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_MAGMA_ADMIN_F, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_RS_BLACK_BELT, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_LEADER_FLANNERY, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_RS_SAILOR, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_SAILOR, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_BUG_MANIAC, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_PKMN_TRAINER_MAY, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_RS_CAMPER, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_KINDLER, TRAINER_ENCOUNTER_MUSIC_HIKER}, {FACILITY_CLASS_BATTLE_GIRL, TRAINER_ENCOUNTER_MUSIC_MAGMA}, {FACILITY_CLASS_COLLECTOR, TRAINER_ENCOUNTER_MUSIC_MAGMA}, {FACILITY_CLASS_NINJA_BOY, TRAINER_ENCOUNTER_MUSIC_MAGMA}, {FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_PARASOL_LADY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_AQUA_ADMIN_F, TRAINER_ENCOUNTER_MUSIC_HIKER}, {FACILITY_CLASS_PKMN_TRAINER_BRENDAN, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_RS_SWIMMER_F, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_EXPERT_F, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_RICH_BOY, TRAINER_ENCOUNTER_MUSIC_RICH}, {FACILITY_CLASS_HEX_MANIAC, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_RS_HIKER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_RS_BEAUTY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_SWIMMER_F, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_RS_LADY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_CHAMPION_STEVEN, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_PKMN_TRAINER_MAY_2, TRAINER_ENCOUNTER_MUSIC_GIRL}, {FACILITY_CLASS_CYCLING_TRIATHLETE_M, TRAINER_ENCOUNTER_MUSIC_GIRL}, {FACILITY_CLASS_SWIMMER_M, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_DRAGON_TAMER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_BIKER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_SWIMMING_TRIATHLETE_M, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_CUE_BALL, TRAINER_ENCOUNTER_MUSIC_COOL}, {FACILITY_CLASS_RS_BIRD_KEEPER, TRAINER_ENCOUNTER_MUSIC_COOL}, {FACILITY_CLASS_SWIMMING_TRIATHLETE_F, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_POKEMANIAC, TRAINER_ENCOUNTER_MUSIC_GIRL}, {FACILITY_CLASS_RS_TWINS, TRAINER_ENCOUNTER_MUSIC_GIRL}, {FACILITY_CLASS_LEADER_WATTSON, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_BUG_CATCHER, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_RS_PKMN_BREEDER_M, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_LEADER_WALLACE, TRAINER_ENCOUNTER_MUSIC_AQUA}, {FACILITY_CLASS_LEADER_NORMAN, TRAINER_ENCOUNTER_MUSIC_AQUA}, {FACILITY_CLASS_OLD_COUPLE, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_RS_PSYCHIC_M, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_LEADER_ROXANNE, TRAINER_ENCOUNTER_MUSIC_TWINS}, {FACILITY_CLASS_ELITE_FOUR_DRAKE, TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR}, {FACILITY_CLASS_RS_GENTLEMAN, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_RS_LASS, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, {FACILITY_CLASS_BURGLAR, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_PKMN_TRAINER_WALLY, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_SCHOOL_KID_M, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_LEADER_TATE_AND_LIZA, TRAINER_ENCOUNTER_MUSIC_INTENSE}, {FACILITY_CLASS_POKEFAN_M, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_MAGMA_ADMIN_M, TRAINER_ENCOUNTER_MUSIC_COOL}, {FACILITY_CLASS_EXPERT_M, TRAINER_ENCOUNTER_MUSIC_COOL}, {FACILITY_CLASS_MAGMA_GRUNT_M, TRAINER_ENCOUNTER_MUSIC_HIKER}, {FACILITY_CLASS_SR_AND_JR, TRAINER_ENCOUNTER_MUSIC_HIKER}, {FACILITY_CLASS_LASS, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_SCHOOL_KID_F, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_RS_COOLTRAINER_M, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_FISHERMAN, TRAINER_ENCOUNTER_MUSIC_GIRL}, {FACILITY_CLASS_RS_TUBER_M, TRAINER_ENCOUNTER_MUSIC_GIRL}, {FACILITY_CLASS_HIKER, TRAINER_ENCOUNTER_MUSIC_SWIMMER}, {FACILITY_CLASS_BOARDER_M, TRAINER_ENCOUNTER_MUSIC_SWIMMER}, {FACILITY_CLASS_RS_PKMN_BREEDER_F, TRAINER_ENCOUNTER_MUSIC_HIKER}, {FACILITY_CLASS_RS_PICNICKER, TRAINER_ENCOUNTER_MUSIC_HIKER}, {FACILITY_CLASS_LEADER_WINONA, TRAINER_ENCOUNTER_MUSIC_MALE}, {FACILITY_CLASS_ELITE_FOUR_SIDNEY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, {FACILITY_CLASS_AQUA_ADMIN_M, TRAINER_ENCOUNTER_MUSIC_HIKER}, {FACILITY_CLASS_ELITE_FOUR_PHOEBE, TRAINER_ENCOUNTER_MUSIC_MALE} }; static const struct WindowTemplate sTimeBoardWindowTemplate[] = { { .bg = 0, .tilemapLeft = 3, .tilemapTop = 1, .width = 27, .height = 18, .paletteNum = 15, .baseBlock = 0x001 }, DUMMY_WIN_TEMPLATE }; static const u32 sUnusedValue = 112; static const u8 sTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; static void (*const sTrainerTowerFunctions[])(void) = { [TRAINER_TOWER_FUNC_INIT_FLOOR] = InitTrainerTowerFloor, [TRAINER_TOWER_FUNC_GET_SPEECH] = BufferTowerOpponentSpeech, [TRAINER_TOWER_FUNC_DO_BATTLE] = DoTrainerTowerBattle, [TRAINER_TOWER_FUNC_GET_CHALLENGE_TYPE] = TrainerTowerGetChallengeType, [TRAINER_TOWER_FUNC_CLEARED_FLOOR] = TrainerTowerAddFloorCleared, [TRAINER_TOWER_FUNC_GET_FLOOR_CLEARED] = GetFloorAlreadyCleared, [TRAINER_TOWER_FUNC_START_CHALLENGE] = StartTrainerTowerChallenge, [TRAINER_TOWER_FUNC_GET_OWNER_STATE] = GetOwnerState, [TRAINER_TOWER_FUNC_GIVE_PRIZE] = GiveChallengePrize, [TRAINER_TOWER_FUNC_CHECK_FINAL_TIME] = CheckFinalTime, [TRAINER_TOWER_FUNC_RESUME_TIMER] = TrainerTowerResumeTimer, [TRAINER_TOWER_FUNC_SET_LOST] = TrainerTowerSetPlayerLost, [TRAINER_TOWER_FUNC_GET_CHALLENGE_STATUS] = GetTrainerTowerChallengeStatus, [TRAINER_TOWER_FUNC_GET_TIME] = GetCurrentTime, [TRAINER_TOWER_FUNC_SHOW_RESULTS] = ShowResultsBoard, [TRAINER_TOWER_FUNC_CLOSE_RESULTS] = CloseResultsBoard, [TRAINER_TOWER_FUNC_CHECK_DOUBLES] = TrainerTowerGetDoublesEligiblity, [TRAINER_TOWER_FUNC_GET_NUM_FLOORS] = TrainerTowerGetNumFloors, [TRAINER_TOWER_FUNC_SHOULD_WARP_TO_COUNTER] = ShouldWarpToCounter, [TRAINER_TOWER_FUNC_ENCOUNTER_MUSIC] = PlayTrainerTowerEncounterMusic, [TRAINER_TOWER_FUNC_GET_BEAT_CHALLENGE] = HasSpokenToOwner }; // - 1 excludes Mixed challenge, which just uses one of the 3 other types static const u16 sFloorLayouts[MAX_TRAINER_TOWER_FLOORS][NUM_TOWER_CHALLENGE_TYPES - 1] = { {LAYOUT_TRAINER_TOWER_1F, LAYOUT_TRAINER_TOWER_1F_DOUBLES, LAYOUT_TRAINER_TOWER_1F_KNOCKOUT}, {LAYOUT_TRAINER_TOWER_2F, LAYOUT_TRAINER_TOWER_2F_DOUBLES, LAYOUT_TRAINER_TOWER_2F_KNOCKOUT}, {LAYOUT_TRAINER_TOWER_3F, LAYOUT_TRAINER_TOWER_3F_DOUBLES, LAYOUT_TRAINER_TOWER_3F_KNOCKOUT}, {LAYOUT_TRAINER_TOWER_4F, LAYOUT_TRAINER_TOWER_4F_DOUBLES, LAYOUT_TRAINER_TOWER_4F_KNOCKOUT}, {LAYOUT_TRAINER_TOWER_5F, LAYOUT_TRAINER_TOWER_5F_DOUBLES, LAYOUT_TRAINER_TOWER_5F_KNOCKOUT}, {LAYOUT_TRAINER_TOWER_6F, LAYOUT_TRAINER_TOWER_6F_DOUBLES, LAYOUT_TRAINER_TOWER_6F_KNOCKOUT}, {LAYOUT_TRAINER_TOWER_7F, LAYOUT_TRAINER_TOWER_7F_DOUBLES, LAYOUT_TRAINER_TOWER_7F_KNOCKOUT}, {LAYOUT_TRAINER_TOWER_8F, LAYOUT_TRAINER_TOWER_8F_DOUBLES, LAYOUT_TRAINER_TOWER_8F_KNOCKOUT} }; static const u16 sPrizeList[] = { ITEM_HP_UP, ITEM_PROTEIN, ITEM_IRON, ITEM_CARBOS, ITEM_CALCIUM, ITEM_ZINC, ITEM_BRIGHT_POWDER, ITEM_WHITE_HERB, ITEM_MENTAL_HERB, ITEM_CHOICE_BAND, ITEM_KINGS_ROCK, ITEM_SCOPE_LENS, ITEM_METAL_COAT, ITEM_DRAGON_SCALE, ITEM_UP_GRADE }; static const u16 sTrainerTowerEncounterMusic[] = { [TRAINER_ENCOUNTER_MUSIC_MALE] = MUS_ENCOUNTER_BOY, [TRAINER_ENCOUNTER_MUSIC_FEMALE] = MUS_ENCOUNTER_GIRL, [TRAINER_ENCOUNTER_MUSIC_GIRL] = MUS_ENCOUNTER_GIRL, [TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS] = MUS_ENCOUNTER_ROCKET, [TRAINER_ENCOUNTER_MUSIC_INTENSE] = MUS_ENCOUNTER_BOY, [TRAINER_ENCOUNTER_MUSIC_COOL] = MUS_ENCOUNTER_BOY, [TRAINER_ENCOUNTER_MUSIC_AQUA] = MUS_ENCOUNTER_ROCKET, [TRAINER_ENCOUNTER_MUSIC_MAGMA] = MUS_ENCOUNTER_ROCKET, [TRAINER_ENCOUNTER_MUSIC_SWIMMER] = MUS_ENCOUNTER_BOY, [TRAINER_ENCOUNTER_MUSIC_TWINS] = MUS_ENCOUNTER_GIRL, [TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR] = MUS_ENCOUNTER_BOY, [TRAINER_ENCOUNTER_MUSIC_HIKER] = MUS_ENCOUNTER_BOY, [TRAINER_ENCOUNTER_MUSIC_INTERVIEWER] = MUS_ENCOUNTER_BOY, [TRAINER_ENCOUNTER_MUSIC_RICH] = MUS_ENCOUNTER_BOY }; // The trainer only uses two Pokemon from the encoded pool, based on the current floor static const u8 sSingleBattleChallengeMonIdxs[MAX_TRAINER_TOWER_FLOORS][2] = { {0, 2}, {1, 3}, {2, 4}, {3, 5}, {4, 1}, {5, 2}, {0, 3}, {1, 4} }; // Each trainer only uses one Pokemon from the encoded pool, based on the current floor static const u8 sDoubleBattleChallengeMonIdxs[MAX_TRAINER_TOWER_FLOORS][2] = { {0, 1}, {1, 3}, {2, 0}, {3, 4}, {4, 2}, {5, 2}, {0, 3}, {1, 5} }; // Each trainer only uses one Pokemon from the encoded pool, based on the current floor static const u8 sKnockoutChallengeMonIdxs[MAX_TRAINER_TOWER_FLOORS][3] = { {0, 2, 4}, {1, 3, 5}, {2, 3, 1}, {3, 4, 0}, {4, 1, 2}, {5, 0, 3}, {0, 5, 2}, {1, 4, 5} }; extern const struct EReaderTrainerTowerSetSubstruct gTrainerTowerLocalHeader; extern const struct TrainerTowerFloor *const gTrainerTowerFloors[][MAX_TRAINER_TOWER_FLOORS]; void CallTrainerTowerFunc(void) { SetUpTrainerTowerDataStruct(); sTrainerTowerFunctions[gSpecialVar_0x8004](); FreeTrainerTowerDataStruct(); } u8 GetTrainerTowerOpponentClass(void) { return gFacilityClassToTrainerClass[sTrainerTowerOpponent->facilityClass]; } void GetTrainerTowerOpponentName(u8 *dest) { StringCopyN(dest, sTrainerTowerOpponent->name, 11); } u8 GetTrainerTowerTrainerFrontSpriteId(void) { return gFacilityClassToPicIndex[sTrainerTowerOpponent->facilityClass]; } void InitTrainerTowerBattleStruct(void) { u16 trainerId; int i; SetUpTrainerTowerDataStruct(); sTrainerTowerOpponent = AllocZeroed(sizeof(*sTrainerTowerOpponent)); trainerId = VarGet(VAR_TEMP_1); StringCopyN(sTrainerTowerOpponent->name, CURR_FLOOR.trainers[trainerId].name, 11); for (i = 0; i < 6; i++) { sTrainerTowerOpponent->speechWin[i] = CURR_FLOOR.trainers[trainerId].speechWin[i]; sTrainerTowerOpponent->speechLose[i] = CURR_FLOOR.trainers[trainerId].speechLose[i]; if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE) { sTrainerTowerOpponent->speechWin2[i] = CURR_FLOOR.trainers[trainerId + 1].speechWin[i]; sTrainerTowerOpponent->speechLose2[i] = CURR_FLOOR.trainers[trainerId + 1].speechLose[i]; } } sTrainerTowerOpponent->battleType = CURR_FLOOR.challengeType; sTrainerTowerOpponent->facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass; sTrainerTowerOpponent->textColor = CURR_FLOOR.trainers[trainerId].textColor; SetVBlankCounter1Ptr(&TRAINER_TOWER.timer); FreeTrainerTowerDataStruct(); } void FreeTrainerTowerBattleStruct(void) { FREE_AND_SET_NULL(sTrainerTowerOpponent); } void GetTrainerTowerOpponentWinText(u8 *dest, u8 opponentIdx) { VarSet(VAR_TEMP_3, opponentIdx); TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass); if (opponentIdx == 0) TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechWin, dest); else TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechWin2, dest); } void GetTrainerTowerOpponentLoseText(u8 *dest, u8 opponentIdx) { VarSet(VAR_TEMP_3, opponentIdx); TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass); if (opponentIdx == 0) TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechLose, dest); else TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechLose2, dest); } static void SetUpTrainerTowerDataStruct(void) { u32 challengeType = gSaveBlock1Ptr->towerChallengeId; s32 i; const struct TrainerTowerFloor *const * floors_p; sTrainerTowerState = AllocZeroed(sizeof(*sTrainerTowerState)); sTrainerTowerState->floorIdx = gMapHeader.mapLayoutId - LAYOUT_TRAINER_TOWER_1F; if (ReadTrainerTowerAndValidate() == TRUE) CEReaderTool_LoadTrainerTower(&sTrainerTowerState->data); else { struct TrainerTowerState * ttstate_p = sTrainerTowerState; const struct EReaderTrainerTowerSetSubstruct * header_p = &gTrainerTowerLocalHeader; memcpy(&ttstate_p->data, header_p, sizeof(struct EReaderTrainerTowerSetSubstruct)); floors_p = gTrainerTowerFloors[challengeType]; for (i = 0; i < MAX_TRAINER_TOWER_FLOORS; i++) { *(sTrainerTowerState->data.floors + i) = *(floors_p[i]); // manual pointer arithmetic needed to match } sTrainerTowerState->data.checksum = CalcByteArraySum((void *)sTrainerTowerState->data.floors, sizeof(sTrainerTowerState->data.floors)); ValidateOrResetCurTrainerTowerRecord(); } } static void FreeTrainerTowerDataStruct(void) { FREE_AND_SET_NULL(sTrainerTowerState); } static void InitTrainerTowerFloor(void) { if (gMapHeader.mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY > sTrainerTowerState->data.numFloors) { gSpecialVar_Result = 3; // Skip past usable challenge types SetCurrentMapLayout(LAYOUT_TRAINER_TOWER_ROOF); } else { gSpecialVar_Result = CURR_FLOOR.challengeType; SetCurrentMapLayout(sFloorLayouts[sTrainerTowerState->floorIdx][gSpecialVar_Result]); SetTrainerTowerNPCGraphics(); } } static void SetTrainerTowerNPCGraphics(void) { s32 i, j; u8 trainerGfx1, trainerGfx2, facilityClass; switch (CURR_FLOOR.challengeType) { case CHALLENGE_TYPE_SINGLE: facilityClass = CURR_FLOOR.trainers[0].facilityClass; for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++) { if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass) break; } if (i != NELEMS(sSingleBattleTrainerInfo)) trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx; else trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER; VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1); break; case CHALLENGE_TYPE_DOUBLE: facilityClass = CURR_FLOOR.trainers[0].facilityClass; for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++) { if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass) break; } if (i != NELEMS(sDoubleBattleTrainerInfo)) { trainerGfx1 = sDoubleBattleTrainerInfo[i].objGfx1; trainerGfx2 = sDoubleBattleTrainerInfo[i].objGfx2; } else { trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER; trainerGfx2 = OBJ_EVENT_GFX_YOUNGSTER; } VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1); VarSet(VAR_OBJ_GFX_ID_3, trainerGfx2); break; case CHALLENGE_TYPE_KNOCKOUT: for (j = 0; j < MAX_TRAINERS_PER_FLOOR; j++) { facilityClass = CURR_FLOOR.trainers[j].facilityClass; for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++) { if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass) break; } if (i != NELEMS(sSingleBattleTrainerInfo)) trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx; else trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER; switch (j) { case 0: VarSet(VAR_OBJ_GFX_ID_2, trainerGfx1); break; case 1: VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1); break; case 2: VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1); break; } } } } static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest) { s32 i; ConvertEasyChatWordsToString(dest, ecWords, 3, 2); if ((unsigned)GetStringWidth(FONT_NORMAL, dest, -1) > 196) { // Has to be printed 2x3 ConvertEasyChatWordsToString(dest, ecWords, 2, 3); // Skip line 1 i = 0; while (dest[i++] != CHAR_NEWLINE) ; // Skip line 2 while (dest[i] != CHAR_NEWLINE) i++; // Replace \n with \l at the end of line 2 dest[i] = CHAR_PROMPT_SCROLL; } } static void BufferTowerOpponentSpeech(void) { u16 trainerId = gSpecialVar_0x8006; u8 facilityClass; u8 challengeType = CURR_FLOOR.challengeType; if (challengeType != CHALLENGE_TYPE_DOUBLE) facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass; else facilityClass = CURR_FLOOR.trainers[0].facilityClass; switch (gSpecialVar_0x8005) { case TRAINER_TOWER_TEXT_INTRO: TrainerTowerGetOpponentTextColor(challengeType, facilityClass); TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechBefore, gStringVar4); break; case TRAINER_TOWER_TEXT_PLAYER_LOST: TrainerTowerGetOpponentTextColor(challengeType, facilityClass); TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechWin, gStringVar4); break; case TRAINER_TOWER_TEXT_PLAYER_WON: TrainerTowerGetOpponentTextColor(challengeType, facilityClass); TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechLose, gStringVar4); break; case TRAINER_TOWER_TEXT_AFTER: TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechAfter, gStringVar4); break; } } static void TrainerTowerGetOpponentTextColor(u8 challengeType, u8 facilityClass) { u16 gender = MALE; int i; switch (challengeType) { case CHALLENGE_TYPE_SINGLE: case CHALLENGE_TYPE_KNOCKOUT: for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++) { if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass) break; } if (i != NELEMS(sSingleBattleTrainerInfo)) gender = sSingleBattleTrainerInfo[i].gender; break; case CHALLENGE_TYPE_DOUBLE: for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++) { if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass) break; } if (i != NELEMS(sDoubleBattleTrainerInfo)) { if (VarGet(VAR_TEMP_3)) gender = sDoubleBattleTrainerInfo[i].gender2; else gender = sDoubleBattleTrainerInfo[i].gender1; } break; } gSpecialVar_PrevTextColor = gSpecialVar_TextColor; gSpecialVar_TextColor = gender; } static void CB2_EndTrainerTowerBattle(void) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } static void Task_DoTrainerTowerBattle(u8 taskId) { if (IsBattleTransitionDone() == TRUE) { gMain.savedCallback = CB2_EndTrainerTowerBattle; CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_InitBattle); DestroyTask(taskId); } } static void DoTrainerTowerBattle(void) { gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_TRAINER_TOWER; if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE) gBattleTypeFlags |= BATTLE_TYPE_DOUBLE; gTrainerBattleOpponent_A = 0; BuildEnemyParty(); CreateTask(Task_DoTrainerTowerBattle, 1); PlayMapChosenOrBattleBGM(0); BattleTransition_StartOnField(BattleSetup_GetBattleTowerBattleTransition()); } static void TrainerTowerGetChallengeType(void) { if (!gSpecialVar_0x8005) gSpecialVar_Result = CURR_FLOOR.challengeType; } static void TrainerTowerAddFloorCleared(void) { TRAINER_TOWER.floorsCleared++; } // So the player can safely go back through defeated floors to use the Poke Center (or exit challenge) static void GetFloorAlreadyCleared(void) { u16 mapLayoutId = gMapHeader.mapLayoutId; if (mapLayoutId - LAYOUT_TRAINER_TOWER_1F == TRAINER_TOWER.floorsCleared && mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY <= CURR_FLOOR.floorIdx) gSpecialVar_Result = FALSE; else gSpecialVar_Result = TRUE; } static void StartTrainerTowerChallenge(void) { gSaveBlock1Ptr->towerChallengeId = gSpecialVar_0x8005; if (gSaveBlock1Ptr->towerChallengeId >= NUM_TOWER_CHALLENGE_TYPES) gSaveBlock1Ptr->towerChallengeId = 0; ValidateOrResetCurTrainerTowerRecord(); if (!ReadTrainerTowerAndValidate()) TRAINER_TOWER.validated = TRUE; else TRAINER_TOWER.validated = FALSE; TRAINER_TOWER.floorsCleared = 0; SetVBlankCounter1Ptr(&TRAINER_TOWER.timer); TRAINER_TOWER.timer = 0; TRAINER_TOWER.spokeToOwner = FALSE; TRAINER_TOWER.checkedFinalTime = FALSE; } static void GetOwnerState(void) { DisableVBlankCounter1(); gSpecialVar_Result = 0; if (TRAINER_TOWER.spokeToOwner) gSpecialVar_Result++; if (TRAINER_TOWER.receivedPrize && TRAINER_TOWER.checkedFinalTime) gSpecialVar_Result++; TRAINER_TOWER.spokeToOwner = TRUE; } static void GiveChallengePrize(void) { u16 itemId = sPrizeList[sTrainerTowerState->data.floors->prize]; if (TRAINER_TOWER.receivedPrize) { gSpecialVar_Result = 2; } else if (AddBagItem(itemId, 1) == TRUE) { CopyItemName(itemId, gStringVar2); TRAINER_TOWER.receivedPrize = TRUE; gSpecialVar_Result = 0; } else { gSpecialVar_Result = 1; } } static void CheckFinalTime(void) { if (TRAINER_TOWER.checkedFinalTime) { gSpecialVar_Result = 2; } else if (GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime) > TRAINER_TOWER.timer) { SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER.timer); gSpecialVar_Result = 0; } else { gSpecialVar_Result = 1; } TRAINER_TOWER.checkedFinalTime = TRUE; } static void TrainerTowerResumeTimer(void) { if (!TRAINER_TOWER.spokeToOwner) { if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME) TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME; else SetVBlankCounter1Ptr(&TRAINER_TOWER.timer); } } static void TrainerTowerSetPlayerLost(void) { TRAINER_TOWER.hasLost = TRUE; } static void GetTrainerTowerChallengeStatus(void) { if (TRAINER_TOWER.hasLost) { TRAINER_TOWER.hasLost = FALSE; gSpecialVar_Result = CHALLENGE_STATUS_LOST; } else if (TRAINER_TOWER.unkA_4) { TRAINER_TOWER.unkA_4 = FALSE; gSpecialVar_Result = CHALLENGE_STATUS_UNK; } else { gSpecialVar_Result = CHALLENGE_STATUS_NORMAL; } } #define PRINT_TOWER_TIME(src) ({ \ s32 minutes, seconds, centiseconds, frames; \ \ frames = (src); \ \ minutes = frames / (60 * 60); \ frames %= (60 * 60); \ seconds = frames / 60; \ frames %= 60; \ centiseconds = frames * 168 / 100; \ \ ConvertIntToDecimalStringN(gStringVar1, minutes, STR_CONV_MODE_RIGHT_ALIGN, 2); \ ConvertIntToDecimalStringN(gStringVar2, seconds, STR_CONV_MODE_RIGHT_ALIGN, 2); \ ConvertIntToDecimalStringN(gStringVar3, centiseconds, STR_CONV_MODE_LEADING_ZEROS, 2); \ }) static void GetCurrentTime(void) { if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME) { DisableVBlankCounter1(); TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME; } PRINT_TOWER_TIME(TRAINER_TOWER.timer); } static void ShowResultsBoard(void) { u8 windowId; s32 i; ValidateOrResetCurTrainerTowerRecord(); windowId = AddWindow(sTimeBoardWindowTemplate); LoadStdWindowFrameGfx(); DrawStdWindowFrame(windowId, FALSE); AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_TimeBoard, 74, 0, TEXT_SKIP_DRAW, NULL); for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) { PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime)); StringExpandPlaceholders(gStringVar4, gText_XMinYZSec); AddTextPrinterParameterized(windowId, FONT_NORMAL, gTrainerTowerChallengeTypeTexts[i - 1], 24, 36 + 20 * i, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, 96, 46 + 20 * i, TEXT_SKIP_DRAW, NULL); } PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); VarSet(VAR_TEMP_1, windowId); } static void CloseResultsBoard(void) { u8 windowId = VarGet(VAR_TEMP_1); ClearStdWindowAndFrameToTransparent(windowId, TRUE); RemoveWindow(windowId); } static void TrainerTowerGetDoublesEligiblity(void) { gSpecialVar_Result = GetMonsStateToDoubles(); } static void TrainerTowerGetNumFloors(void) { if (sTrainerTowerState->data.numFloors != sTrainerTowerState->data.floors[0].floorIdx) { ConvertIntToDecimalStringN(gStringVar1, sTrainerTowerState->data.numFloors, STR_CONV_MODE_LEFT_ALIGN, 1); gSpecialVar_Result = TRUE; } else { gSpecialVar_Result = FALSE; } } // Dummied? equivalent to gSpecialVar_Result = FALSE // If it were to return TRUE the player would be warped back to the lobby static void ShouldWarpToCounter(void) { if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_TOWER_LOBBY && VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 0) gSpecialVar_Result = FALSE; else gSpecialVar_Result = FALSE; } static void PlayTrainerTowerEncounterMusic(void) { s32 i; u16 idx = VarGet(VAR_TEMP_1); u8 facilityClass = CURR_FLOOR.trainers[idx].facilityClass; for (i = 0; i < NELEMS(sTrainerEncounterMusicLUT); i++) { if (sTrainerEncounterMusicLUT[i].facilityClass == gFacilityClassToTrainerClass[facilityClass]) break; } if (i != NELEMS(sTrainerEncounterMusicLUT)) { idx = sTrainerEncounterMusicLUT[i].musicId; } else { idx = 0; } PlayNewMapMusic(sTrainerTowerEncounterMusic[idx]); } static void HasSpokenToOwner(void) { gSpecialVar_Result = TRAINER_TOWER.spokeToOwner; } static void BuildEnemyParty(void) { u16 trainerIdx = VarGet(VAR_TEMP_1); s32 level = GetPartyMaxLevel(); u8 floorIdx = TRAINER_TOWER.floorsCleared; s32 i; u8 monIdx; ZeroEnemyPartyMons(); switch (CURR_FLOOR.challengeType) { case CHALLENGE_TYPE_SINGLE: default: for (i = 0; i < 2; i++) { monIdx = sSingleBattleChallengeMonIdxs[floorIdx][i]; CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level; CreateBattleTowerMon(&gEnemyParty[i], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]); } break; case CHALLENGE_TYPE_DOUBLE: monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][0]; CURR_FLOOR.trainers[0].mons[monIdx].level = level; CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[0].mons[monIdx]); monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][1]; CURR_FLOOR.trainers[1].mons[monIdx].level = level; CreateBattleTowerMon(&gEnemyParty[1], &CURR_FLOOR.trainers[1].mons[monIdx]); break; case CHALLENGE_TYPE_KNOCKOUT: monIdx = sKnockoutChallengeMonIdxs[floorIdx][trainerIdx]; CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level; CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]); break; } } static s32 GetPartyMaxLevel(void) { s32 topLevel = 0; s32 i; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG) { s32 currLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL, NULL); if (currLevel > topLevel) topLevel = currLevel; } } return topLevel; } static void ValidateOrResetCurTrainerTowerRecord(void) { if (TRAINER_TOWER.unk9 != sTrainerTowerState->data.id) { TRAINER_TOWER.unk9 = sTrainerTowerState->data.id; SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER_MAX_TIME); TRAINER_TOWER.receivedPrize = FALSE; } } void PrintTrainerTowerRecords(void) { s32 i; u8 windowId = 0; SetUpTrainerTowerDataStruct(); FillWindowPixelRect(0, PIXEL_FILL(0), 0, 0, 216, 144); ValidateOrResetCurTrainerTowerRecord(); AddTextPrinterParameterized3(0, FONT_NORMAL, 0x4a, 0, sTextColors, 0, gText_TimeBoard); for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) { PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime)); StringExpandPlaceholders(gStringVar4, gText_XMinYZSec); AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0x18, 0x24 + 0x14 * i, sTextColors, 0, gTrainerTowerChallengeTypeTexts[i]); AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0x60, 0x24 + 0x14 * i, sTextColors, 0, gStringVar4); } PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_FULL); FreeTrainerTowerDataStruct(); } static u32 GetTrainerTowerRecordTime(u32 *counter) { return *counter ^ gSaveBlock2Ptr->encryptionKey; } static void SetTrainerTowerRecordTime(u32 *counter, u32 value) { *counter = value ^ gSaveBlock2Ptr->encryptionKey; } void ResetTrainerTowerResults(void) { s32 i; for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) { SetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime, TRAINER_TOWER_MAX_TIME); } } ================================================ FILE: src/trainer_tower_sets.c ================================================ #include "global.h" #include "cereader_tool.h" #include "trainer_tower.h" #include "text.h" #include "constants/easy_chat.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/trainer_tower.h" #include "constants/trainers.h" // Dummy strings must be declared explicitly for the sake of modern gcc #define DUMMY_TOWER_MON(iv) {.hpIV = iv, .attackIV = iv, .defenseIV = iv, .speedIV = iv, .spAttackIV = iv, .spDefenseIV = iv, .nickname = _("$$$$$$$$$$")} #define DUMMY_TOWER_TEAM(iv) {.name = _(""), .textColor = 1, .speechBefore = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechWin = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechLose = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechAfter = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .mons = {DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv)}} static const struct TrainerTowerFloor sTrainerTowerFloor_Single_4 = { .id = 1, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_WHITE_HERB, .trainers = { { .name = _("COLE"), .facilityClass = FACILITY_CLASS_YOUNGSTER, .textColor = 1, .speechBefore = {EC_WORD_AHAHA, EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_GOING, EC_WORD_ANYWHERE, EC_WORD_EXCL}, .speechWin = {EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_WORD_BYE_BYE, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_HIYAH, EC_WORD_EXCL_EXCL, EC_WORD_DONE, EC_WORD_IN, EC_WORD_TOTALLY, EC_WORD_EXCL_EXCL}, .speechAfter = {EC_WORD_TCH, EC_WORD_TCH, EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, 0xFFFF, 0xFFFF}, .mons = { { .species = SPECIES_RATICATE, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_SHOCK_WAVE, MOVE_HYPER_FANG, MOVE_SCARY_FACE, MOVE_ENDEAVOR}, .hpEV = 110, .attackEV = 0, .defenseEV = 200, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x16, // FEMALE SASSY .nickname = _("RATICATE"), .friendship = 255 }, { .species = SPECIES_MAGMAR, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_FIRE_PUNCH, MOVE_SUNNY_DAY, MOVE_SMOG, MOVE_STRENGTH}, .hpEV = 100, .attackEV = 0, .defenseEV = 0, .speedEV = 210, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x56, // MALE HASTY .nickname = _("MAGMAR"), .friendship = 255 }, { .species = SPECIES_MAGCARGO, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_FLAMETHROWER, MOVE_AMNESIA, MOVE_BODY_SLAM, MOVE_HARDEN}, .hpEV = 110, .attackEV = 200, .defenseEV = 0, .speedEV = 0, .spAttackEV = 200, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x02, // FEMALE BRAVE .nickname = _("MAGCARGO"), .friendship = 255 }, { .species = SPECIES_PRIMEAPE, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_OVERHEAT, MOVE_SEISMIC_TOSS, MOVE_SWAGGER, MOVE_KARATE_CHOP}, .hpEV = 100, .attackEV = 0, .defenseEV = 0, .speedEV = 210, .spAttackEV = 200, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x87, // MALE TIMID .nickname = _("PRIMEAPE"), .friendship = 255 }, { .species = SPECIES_GOLBAT, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_GIGA_DRAIN, MOVE_CONFUSE_RAY, MOVE_SLUDGE_BOMB, MOVE_MEAN_LOOK}, .hpEV = 0, .attackEV = 200, .defenseEV = 0, .speedEV = 110, .spAttackEV = 200, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x81, // MALE NAUGHTY .nickname = _("GOLBAT"), .friendship = 255 }, { .species = SPECIES_SLOWBRO, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_SUNNY_DAY, MOVE_YAWN, MOVE_FLAMETHROWER, MOVE_CONFUSION}, .hpEV = 100, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 210, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x11, // FEMALE QUIET .nickname = _("SLOWBRO"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016aab }; static const struct TrainerTowerFloor sTrainerTowerFloor_Single_7 = { .id = 2, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_DRAGON_SCALE, .trainers = { { .name = _("JAC"), .facilityClass = FACILITY_CLASS_BURGLAR, .textColor = 1, .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_MOVE2(THIEF), EC_WORD_EXCL, EC_WORD_GIVE_ME, EC_WORD_SOMETHING}, .speechWin = {EC_WORD_YOU_VE, EC_WORD_GOT, EC_WORD_NOTHING, EC_WORD_THAT, EC_WORD_I, EC_WORD_WANT}, .speechLose = {EC_WORD_EEK, EC_WORD_EXCL_EXCL, EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_I, EC_WORD_SURRENDER}, .speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_STOP, EC_WORD_BEING, EC_WORD_A, EC_MOVE2(THIEF)}, .mons = { { .species = SPECIES_MEOWTH, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_SWAGGER, MOVE_SUBSTITUTE, MOVE_FAKE_OUT, MOVE_SLASH}, .hpEV = 200, .attackEV = 110, .defenseEV = 0, .speedEV = 200, .spAttackEV = 0, .spDefenseEV = 0, .otId = 138 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x8A, // MALE JOLLY .nickname = _("MEOWTH"), .friendship = 255 }, { .species = SPECIES_FLAREON, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_FLAMETHROWER, MOVE_BITE, MOVE_SAND_ATTACK, MOVE_FIRE_SPIN}, .hpEV = 110, .attackEV = 0, .defenseEV = 200, .speedEV = 0, .spAttackEV = 200, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("FLAREON"), .friendship = 255 }, { .species = SPECIES_PORYGON, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_TRI_ATTACK, MOVE_RECYCLE, MOVE_PSYBEAM, MOVE_CONVERSION_2}, .hpEV = 100, .attackEV = 0, .defenseEV = 210, .speedEV = 0, .spAttackEV = 200, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x07, // GENDERLESS RELAXED .nickname = _("PORYGON"), .friendship = 255 }, { .species = SPECIES_CHANSEY, .heldItem = ITEM_LUCKY_PUNCH, .moves = {MOVE_FLAMETHROWER, MOVE_LIGHT_SCREEN, MOVE_BODY_SLAM, MOVE_MINIMIZE}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x10, // FEMALE MILD .nickname = _("CHANSEY"), .friendship = 255 }, { .species = SPECIES_FARFETCHD, .heldItem = ITEM_STICK, .moves = {MOVE_KNOCK_OFF, MOVE_SWORDS_DANCE, MOVE_FLY, MOVE_SAND_ATTACK}, .hpEV = 100, .attackEV = 100, .defenseEV = 100, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 110, .otId = 133 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x85, // MALE IMPISH .nickname = _("FARFETCH'D"), .friendship = 255 }, { .species = SPECIES_MR_MIME, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_SUBSTITUTE, MOVE_SHOCK_WAVE, MOVE_LIGHT_SCREEN, MOVE_BRICK_BREAK}, .hpEV = 255, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 130 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x82, // MALE BOLD .nickname = _("MR. MIME"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016456 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Single_Unused = { .id = 3, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_IRON, .trainers = { { .name = _("MILY"), .facilityClass = FACILITY_CLASS_PSYCHIC_F, .textColor = 1, .speechBefore = {EC_WORD_LOOK, EC_WORD_AT, EC_WORD_MY, EC_WORD_POKEMON, EC_MOVE2(SUPERPOWER), EC_WORD_EXCL}, .speechWin = {EC_WORD_ISN_T, EC_WORD_IT, EC_WORD_INCREDIBLE, EC_WORD_QUES, EC_WORD_POKEMON, EC_WORD_POWER}, .speechLose = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_AN, EC_WORD_AWFUL, EC_MOVE(NIGHTMARE), EC_WORD_ELLIPSIS_EXCL}, .speechAfter = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_A, EC_WORD_DREAM, EC_WORD_NOTHING, EC_WORD_MORE}, .mons = { { .species = SPECIES_CHANSEY, .heldItem = ITEM_ORAN_BERRY, .moves = {MOVE_LIGHT_SCREEN, MOVE_EGG_BOMB, MOVE_MINIMIZE, MOVE_SECRET_POWER}, .hpEV = 255, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x08, // FEMALE IMPISH .nickname = _("CHANSEY"), .friendship = 255 }, { .species = SPECIES_CLEFABLE, .heldItem = ITEM_ORAN_BERRY, .moves = {MOVE_METRONOME, MOVE_REFLECT, MOVE_SING, MOVE_POUND}, .hpEV = 110, .attackEV = 0, .defenseEV = 200, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x16, // FEMALE SASSY .nickname = _("CLEFABLE"), .friendship = 255 }, { .species = SPECIES_TOGETIC, .heldItem = ITEM_ORAN_BERRY, .moves = {MOVE_METRONOME, MOVE_REFLECT, MOVE_SWEET_KISS, MOVE_PECK}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x16, // FEMALE SASSY .nickname = _("TOGETIC"), .friendship = 255 }, { .species = SPECIES_TOGETIC, .heldItem = ITEM_ORAN_BERRY, .moves = {MOVE_METRONOME, MOVE_HIDDEN_POWER, MOVE_ATTRACT, MOVE_LIGHT_SCREEN}, .hpEV = 255, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x20, // MALE RELAXED .nickname = _("TOGETIC"), .friendship = 255 }, { .species = SPECIES_CHANSEY, .heldItem = ITEM_ORAN_BERRY, .moves = {MOVE_FLAMETHROWER, MOVE_SOFT_BOILED, MOVE_LIGHT_SCREEN, MOVE_SECRET_POWER}, .hpEV = 255, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x05, // FEMALE BOLD .nickname = _("CHANSEY"), .friendship = 255 }, { .species = SPECIES_CLEFABLE, .heldItem = ITEM_ORAN_BERRY, .moves = {MOVE_REFLECT, MOVE_FLAMETHROWER, MOVE_SING, MOVE_BODY_SLAM}, .hpEV = 110, .attackEV = 0, .defenseEV = 200, .speedEV = 0, .spAttackEV = 200, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0xC0, // MALE QUIET .nickname = _("CLEFABLE"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x000164ec }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_5 = { .id = 4, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_CHOICE_BAND, .trainers = { { .name = _("JOS & ANNE"), .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 7, .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_LOSE, EC_WORD_TO, EC_WORD_YOU, EC_WORD_HERE}, .speechWin = {EC_WORD_VERY, EC_WORD_WELL, EC_WORD_DONE, EC_WORD_EXCL, EC_WORD_GOOD, EC_WORD_BATTLE}, .speechLose = {EC_WORD_UNBELIEVABLE, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechAfter = {EC_WORD_I_AM, EC_WORD_DISAPPOINTED, EC_WORD_BUT, EC_WORD_YOU, EC_WORD_WIN, EC_WORD_ELLIPSIS}, .mons = { { .species = SPECIES_RAPIDASH, .heldItem = ITEM_WHITE_HERB, .moves = {MOVE_BOUNCE, MOVE_OVERHEAT, MOVE_HYPNOSIS, MOVE_RETURN}, .hpEV = 100, .attackEV = 100, .defenseEV = 0, .speedEV = 110, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x10, // FEMALE MILD .nickname = _("RAPIDASH"), .friendship = 255 }, { .species = SPECIES_NINETALES, .heldItem = ITEM_CHARCOAL, .moves = {MOVE_CONFUSE_RAY, MOVE_WILL_O_WISP, MOVE_HEAT_WAVE, MOVE_DIG}, .hpEV = 110, .attackEV = 0, .defenseEV = 0, .speedEV = 200, .spAttackEV = 200, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x15, // FEMALE GENTLE .nickname = _("NINETALES"), .friendship = 255 }, { .species = SPECIES_MISDREAVUS, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_GRUDGE, MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_THUNDERBOLT}, .hpEV = 200, .attackEV = 0, .defenseEV = 0, .speedEV = 210, .spAttackEV = 100, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("MISDREAVUS"), .friendship = 255 }, { .species = SPECIES_ALAKAZAM, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_LIGHT_SCREEN, MOVE_RECOVER, MOVE_PSYCHIC, MOVE_THUNDER_PUNCH}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("ALAKAZAM"), .friendship = 255 }, { .species = SPECIES_BLISSEY, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_LIGHT_SCREEN, MOVE_ATTRACT, MOVE_RETURN, MOVE_PSYCHIC}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x16, // FEMALE SASSY .nickname = _("BLISSEY"), .friendship = 255 }, { .species = SPECIES_CROBAT, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_TOXIC, MOVE_FLY, MOVE_CONFUSE_RAY, MOVE_SHADOW_BALL}, .hpEV = 100, .attackEV = 0, .defenseEV = 100, .speedEV = 210, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x17, // FEMALE CAREFUL .nickname = _("CROBAT"), .friendship = 255 }, } }, { .name = _("JOS & ANNE"), .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 7, .speechBefore = {EC_WORD_HERE_GOES, EC_WORD_EXCL_EXCL, EC_WORD_GET, EC_WORD_READY, EC_WORD_TO, EC_WORD_LOSE}, .speechWin = {EC_WORD_PERFECT, EC_WORD_EXCL, EC_WORD_WE, EC_WORD_GET, EC_WORD_THE, EC_WORD_WIN}, .speechLose = {EC_WORD_LOST, EC_WORD_QUES_EXCL, EC_WORD_YOU, EC_WORD_MUST_BE, EC_WORD_JOKING, EC_WORD_EXCL}, .speechAfter = {EC_WORD_HOW, EC_WORD_COULD, EC_WORD_I, EC_WORD_LOSE, EC_WORD_THIS, EC_WORD_QUES}, .mons = { { .species = SPECIES_HOUNDOOM, .heldItem = ITEM_CHARCOAL, .moves = {MOVE_TAUNT, MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_CRUNCH}, .hpEV = 255, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x82, // MALE BOLD .nickname = _("HOUNDOOM"), .friendship = 255 }, { .species = SPECIES_AERODACTYL, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_ROAR, MOVE_FIRE_BLAST, MOVE_HYPER_BEAM, MOVE_AERIAL_ACE}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x33, // MALE LONELY .nickname = _("AERODACTYL"), .friendship = 255 }, { .species = SPECIES_ARCANINE, .heldItem = ITEM_CHARCOAL, .moves = {MOVE_HEAT_WAVE, MOVE_EXTREME_SPEED, MOVE_ROAR, MOVE_DIG}, .hpEV = 210, .attackEV = 0, .defenseEV = 0, .speedEV = 200, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x56, // MALE HASTY .nickname = _("ARCANINE"), .friendship = 255 }, { .species = SPECIES_WEEZING, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_EXPLOSION, MOVE_SMOKESCREEN, MOVE_SLUDGE_BOMB, MOVE_THUNDERBOLT}, .hpEV = 100, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 110, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x8E, // MALE QUIET .nickname = _("WEEZING"), .friendship = 255 }, { .species = SPECIES_CHARIZARD, .heldItem = ITEM_WHITE_HERB, .moves = {MOVE_OVERHEAT, MOVE_OUTRAGE, MOVE_DRAGON_RAGE, MOVE_SMOKESCREEN}, .hpEV = 100, .attackEV = 110, .defenseEV = 0, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x33, // MALE LONELY .nickname = _("CHARIZARD"), .friendship = 255 }, { .species = SPECIES_GENGAR, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_SHADOW_BALL, MOVE_THUNDERBOLT}, .hpEV = 55, .attackEV = 0, .defenseEV = 100, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x87, // MALE TIMID .nickname = _("GENGAR"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x00017908 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_6 = { .id = 5, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_CALCIUM, .trainers = { { .name = _("EMY & ALEK"), .facilityClass = FACILITY_CLASS_YOUNG_COUPLE, .textColor = 1, .speechBefore = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_LOST, EC_WORD_IN, EC_WORD_LOVEY_DOVEY, EC_WORD_HAPPINESS}, .speechWin = {EC_WORD_OH, EC_WORD_OH, EC_WORD_HE, EC_WORD_IS, EC_WORD_REALLY, EC_WORD_AWESOME}, .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_SERIOUS, EC_WORD_QUES}, .speechAfter = {EC_WORD_WHO, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_QUES, 0xFFFF, 0xFFFF}, .mons = { { .species = SPECIES_TAUROS, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_FLAMETHROWER, MOVE_REST, MOVE_SHOCK_WAVE, MOVE_DOUBLE_TEAM}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0A, // MALE TIMID .nickname = _("TAUROS"), .friendship = 255 }, { .species = SPECIES_KANGASKHAN, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_FLAMETHROWER, MOVE_DIZZY_PUNCH, MOVE_REST, MOVE_FAKE_OUT}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x02, // FEMALE BRAVE .nickname = _("KANGASKHAN"), .friendship = 255 }, { .species = SPECIES_FEAROW, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_DRILL_PECK, MOVE_TRI_ATTACK, MOVE_DOUBLE_EDGE, MOVE_REST}, .hpEV = 100, .attackEV = 210, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x94, // MALE CAREFUL .nickname = _("FEAROW"), .friendship = 255 }, { .species = SPECIES_TOGETIC, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_FLAMETHROWER, MOVE_LIGHT_SCREEN, MOVE_REST, MOVE_ANCIENT_POWER}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x24, // MALE HASTY .nickname = _("TOGETIC"), .friendship = 255 }, { .species = SPECIES_PIDGEOT, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_STEEL_WING, MOVE_FLY, MOVE_MIRROR_MOVE, MOVE_REST}, .hpEV = 100, .attackEV = 110, .defenseEV = 100, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0D, // FEMALE JOLLY .nickname = _("PIDGEOT"), .friendship = 255 }, { .species = SPECIES_URSARING, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_REST, MOVE_SNORE, MOVE_DIG, MOVE_SLASH}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x8A, // MALE JOLLY .nickname = _("URSARING"), .friendship = 255 }, } }, { .name = _("EMY & ALEK"), .facilityClass = FACILITY_CLASS_YOUNG_COUPLE, .textColor = 1, .speechBefore = {EC_WORD_I_AM, EC_WORD_GIDDY, EC_WORD_WITH, EC_WORD_LOVEY_DOVEY, EC_WORD_JOY, EC_WORD_EXCL_EXCL}, .speechWin = {EC_WORD_SIGH, EC_WORD_ELLIPSIS, EC_WORD_MY, EC_WORD_GIRL, EC_WORD_IS, EC_WORD_CUTE}, .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_SERIOUS}, .speechAfter = {EC_WORD_WAIT, EC_WORD_ELLIPSIS, EC_WORD_WHO, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_QUES}, .mons = { { .species = SPECIES_LICKITUNG, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_FLAMETHROWER, MOVE_EARTHQUAKE, MOVE_REST, MOVE_SLEEP_TALK}, .hpEV = 0, .attackEV = 100, .defenseEV = 255, .speedEV = 0, .spAttackEV = 55, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x16, // FEMALE SASSY .nickname = _("LICKITUNG"), .friendship = 255 }, { .species = SPECIES_NOCTOWL, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_REFLECT, MOVE_AERIAL_ACE}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0B, // FEMALE HASTY .nickname = _("NOCTOWL"), .friendship = 255 }, { .species = SPECIES_FURRET, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_FLAMETHROWER, MOVE_AMNESIA, MOVE_SHOCK_WAVE, MOVE_SLASH}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0E, // FEMALE NAIVE .nickname = _("FURRET"), .friendship = 255 }, { .species = SPECIES_RATICATE, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_SUPER_FANG, MOVE_QUICK_ATTACK, MOVE_SWAGGER, MOVE_ENDEAVOR}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x8A, // MALE JOLLY .nickname = _("RATICATE"), .friendship = 255 }, { .species = SPECIES_WIGGLYTUFF, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_SUNNY_DAY, MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_BODY_SLAM}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0B, // FEMALE HASTY .nickname = _("WIGGLYTUFF"), .friendship = 255 }, { .species = SPECIES_PORYGON2, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_THUNDERBOLT, MOVE_CONVERSION_2, MOVE_TRI_ATTACK, MOVE_RECOVER}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0A, // GENDERLESS TIMID .nickname = _("PORYGON2"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x00015d3b }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_2 = { .id = 6, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_HP_UP, .trainers = { { .name = _("JO & HALEY"), .facilityClass = FACILITY_CLASS_CRUSH_KIN, .textColor = 5, .speechBefore = {EC_WORD_WE_RE, EC_WORD_USING, EC_WORD_THAT, EC_WORD_STRATEGY, EC_WORD_OKAY, EC_WORD_QUES}, .speechWin = {EC_WORD_YAY, EC_WORD_WE, EC_WORD_WON, EC_WORD_EXCL, EC_WORD_SORRY, EC_WORD_EXCL}, .speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_THAT_WAS, EC_WORD_REALLY, EC_WORD_TERRIBLE, EC_WORD_EXCL}, .speechAfter = {EC_WORD_ALL, EC_WORD_I, EC_WORD_DO, EC_WORD_IS, EC_WORD_LOSE, EC_WORD_ELLIPSIS}, .mons = { { .species = SPECIES_SNEASEL, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_AERIAL_ACE}, .hpEV = 200, .attackEV = 0, .defenseEV = 50, .speedEV = 210, .spAttackEV = 0, .spDefenseEV = 50, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0D, // FEMALE JOLLY .nickname = _("SNEASEL"), .friendship = 255 }, { .species = SPECIES_ALAKAZAM, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_FIRE_PUNCH, MOVE_RECOVER, MOVE_PSYCHIC, MOVE_SUNNY_DAY}, .hpEV = 255, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x05, // FEMALE BOLD .nickname = _("ALAKAZAM"), .friendship = 255 }, { .species = SPECIES_HITMONTOP, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_MEGA_KICK, MOVE_ENDEAVOR, MOVE_DIG, MOVE_SUNNY_DAY}, .hpEV = 100, .attackEV = 210, .defenseEV = 0, .speedEV = 200, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x08, // MALE IMPISH .nickname = _("HITMONTOP"), .friendship = 255 }, { .species = SPECIES_GIRAFARIG, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_LIGHT_SCREEN, MOVE_SUNNY_DAY, MOVE_SHADOW_BALL, MOVE_PSYBEAM}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0A, // FEMALE TIMID .nickname = _("GIRAFARIG"), .friendship = 255 }, { .species = SPECIES_XATU, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_SUNNY_DAY, MOVE_DRILL_PECK, MOVE_CONFUSE_RAY, MOVE_PSYCHIC}, .hpEV = 110, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x14, // FEMALE CALM .nickname = _("XATU"), .friendship = 255 }, { .species = SPECIES_MR_MIME, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_REFLECT, MOVE_SUNNY_DAY, MOVE_PSYCHIC, MOVE_SHOCK_WAVE}, .hpEV = 110, .attackEV = 0, .defenseEV = 200, .speedEV = 200, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x05, // FEMALE BOLD .nickname = _("MR. MIME"), .friendship = 255 }, } }, { .name = _("JO & HALEY"), .facilityClass = FACILITY_CLASS_CRUSH_KIN, .textColor = 5, .speechBefore = {EC_WORD_YOU, EC_WORD_YOU, EC_WORD_YOU, EC_WORD_BETTER, EC_WORD_NOT, EC_WORD_WIN}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_JOKING, EC_WORD_QUES, EC_WORD_WE, EC_WORD_WON}, .speechLose = {EC_WORD_WIMPY, EC_WORD_ELLIPSIS, EC_WORD_WE, EC_WORD_WERE, EC_WORD_WEAK, EC_WORD_ELLIPSIS}, .speechAfter = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, EC_WORD_WE_RE, EC_WORD_TOTALLY, EC_WORD_USELESS, EC_WORD_ELLIPSIS}, .mons = { { .species = SPECIES_HYPNO, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_FIRE_PUNCH, MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_NIGHTMARE}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x87, // MALE TIMID .nickname = _("HYPNO"), .friendship = 255 }, { .species = SPECIES_HITMONCHAN, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_FIRE_PUNCH, MOVE_THUNDER_PUNCH, MOVE_ICE_PUNCH, MOVE_DETECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0F, // MALE MODEST .nickname = _("HITMONCHAN"), .friendship = 255 }, { .species = SPECIES_MACHAMP, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_FLAMETHROWER, MOVE_BRICK_BREAK, MOVE_SCARY_FACE, MOVE_DIG}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x43, // MALE QUIET .nickname = _("MACHAMP"), .friendship = 255 }, { .species = SPECIES_HOUNDOOM, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_ROAR, MOVE_FLAMETHROWER, MOVE_BITE, MOVE_PROTECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x87, // MALE TIMID .nickname = _("HOUNDOOM"), .friendship = 255 }, { .species = SPECIES_PRIMEAPE, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_OVERHEAT, MOVE_SWAGGER, MOVE_SEISMIC_TOSS, MOVE_DOUBLE_TEAM}, .hpEV = 100, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 110, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x8C, // MALE MODEST .nickname = _("PRIMEAPE"), .friendship = 255 }, { .species = SPECIES_HERACROSS, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_LEER}, .hpEV = 110, .attackEV = 0, .defenseEV = 200, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x85, // MALE IMPISH .nickname = _("HERACROSS"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x000160b1 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_1 = { .id = 7, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_KNOCKOUT, .prize = TTPRIZE_METAL_COAT, .trainers = { { .name = _("JORDY"), .facilityClass = FACILITY_CLASS_BIKER, .textColor = 3, .speechBefore = {EC_WORD_DON_T, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_GIGGLE, EC_WORD_YOU, EC_WORD_PUSHOVER}, .speechWin = {EC_WORD_WHAT, EC_WORD_A_LITTLE, EC_WORD_PUSHOVER, EC_WORD_YOU, EC_WORD_ARE, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU, EC_WORD_WERE, EC_WORD_READY, EC_WORD_TO, EC_WORD_ROCK, EC_WORD_EXCL}, .speechAfter = {EC_WORD_DARN, EC_WORD_EXCL, EC_WORD_I, EC_WORD_DON_T, EC_WORD_GET, EC_WORD_IT}, .mons = { { .species = SPECIES_MAGBY, .heldItem = ITEM_LAX_INCENSE, .moves = {MOVE_SMOKESCREEN, MOVE_CONFUSE_RAY, MOVE_FLAMETHROWER, MOVE_SCREECH}, .hpEV = 210, .attackEV = 30, .defenseEV = 30, .speedEV = 0, .spAttackEV = 210, .spDefenseEV = 30, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x43, // MALE QUIET .nickname = _("MAGBY"), .friendship = 0 }, { .species = SPECIES_CLEFFA, .heldItem = ITEM_LAX_INCENSE, .moves = {MOVE_ATTRACT, MOVE_CHARM, MOVE_SECRET_POWER, MOVE_FLASH}, .hpEV = 210, .attackEV = 210, .defenseEV = 30, .speedEV = 0, .spAttackEV = 30, .spDefenseEV = 30, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0xCA, // MALE BRAVE .nickname = _("CLEFFA"), .friendship = 255 }, { .species = SPECIES_IGGLYBUFF, .heldItem = ITEM_LAX_INCENSE, .moves = {MOVE_SING, MOVE_HIDDEN_POWER, MOVE_CHARM, MOVE_DOUBLE_TEAM}, .hpEV = 210, .attackEV = 0, .defenseEV = 45, .speedEV = 210, .spAttackEV = 0, .spDefenseEV = 45, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0xD2, // MALE TIMID .nickname = _("IGGLYBUFF"), .friendship = 255 }, { .species = SPECIES_SMOOCHUM, .heldItem = ITEM_LAX_INCENSE, .moves = {MOVE_FAKE_TEARS, MOVE_PSYCHIC, MOVE_MEAN_LOOK, MOVE_SING}, .hpEV = 210, .attackEV = 0, .defenseEV = 45, .speedEV = 0, .spAttackEV = 210, .spDefenseEV = 45, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x11, // FEMALE QUIET .nickname = _("SMOOCHUM"), .friendship = 255 }, { .species = SPECIES_TOGEPI, .heldItem = ITEM_LAX_INCENSE, .moves = {MOVE_SWEET_KISS, MOVE_YAWN, MOVE_ANCIENT_POWER, MOVE_DOUBLE_TEAM}, .hpEV = 210, .attackEV = 210, .defenseEV = 45, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 45, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x34, // MALE BRAVE .nickname = _("TOGEPI"), .friendship = 0 }, { .species = SPECIES_PICHU, .heldItem = ITEM_LAX_INCENSE, .moves = {MOVE_THUNDER_WAVE, MOVE_SHOCK_WAVE, MOVE_SWEET_KISS, MOVE_FLASH}, .hpEV = 210, .attackEV = 0, .defenseEV = 45, .speedEV = 0, .spAttackEV = 210, .spDefenseEV = 45, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x8E, // MALE QUIET .nickname = _("PICHU"), .friendship = 0 }, } }, { .name = _("ERNEST"), .facilityClass = FACILITY_CLASS_BIKER, .textColor = 1, .speechBefore = {EC_WORD_IT_S, EC_WORD_SLEEP, EC_WORD_TIME, EC_WORD_FOR, EC_WORD_CHILDREN, EC_WORD_EXCL}, .speechWin = {EC_WORD_NOT, EC_WORD_GUTSY, EC_WORD_ENOUGH, 0xFFFF, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_WHY, EC_WORD_DID, EC_WORD_YOU, EC_WORD_CRUSH, EC_WORD_ME, EC_WORD_QUES}, .speechAfter = {EC_WORD_I_AM, EC_WORD_BEAT, EC_WORD_I, EC_WORD_NEED, EC_WORD_A, EC_WORD_NAP}, .mons = { { .species = SPECIES_CLEFFA, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_SWEET_KISS, MOVE_FRUSTRATION, MOVE_SING, MOVE_ATTRACT}, .hpEV = 210, .attackEV = 210, .defenseEV = 45, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 45, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0xCA, // MALE BRAVE .nickname = _("CLEFFA"), .friendship = 0 }, { .species = SPECIES_MAGBY, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_FRUSTRATION, MOVE_CONFUSE_RAY, MOVE_FLAMETHROWER, MOVE_TOXIC}, .hpEV = 90, .attackEV = 210, .defenseEV = 0, .speedEV = 0, .spAttackEV = 210, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x4D, // MALE BRAVE .nickname = _("MAGBY"), .friendship = 0 }, { .species = SPECIES_TOGEPI, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_FRUSTRATION, MOVE_DOUBLE_TEAM, MOVE_TOXIC, MOVE_SWEET_KISS}, .hpEV = 210, .attackEV = 210, .defenseEV = 45, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 45, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x34, // MALE BRAVE .nickname = _("TOGEPI"), .friendship = 0 }, { .species = SPECIES_SMOOCHUM, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_MEAN_LOOK, MOVE_PERISH_SONG, MOVE_TOXIC, MOVE_FLASH}, .hpEV = 90, .attackEV = 0, .defenseEV = 210, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 210, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x16, // FEMALE SASSY .nickname = _("SMOOCHUM"), .friendship = 0 }, { .species = SPECIES_IGGLYBUFF, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_DOUBLE_TEAM, MOVE_SWEET_KISS, MOVE_SEISMIC_TOSS, MOVE_FLASH}, .hpEV = 210, .attackEV = 0, .defenseEV = 45, .speedEV = 210, .spAttackEV = 0, .spDefenseEV = 45, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("IGGLYBUFF"), .friendship = 0 }, { .species = SPECIES_PICHU, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_TAIL_WHIP, MOVE_FRUSTRATION, MOVE_ATTRACT, MOVE_THUNDER_WAVE}, .hpEV = 90, .attackEV = 210, .defenseEV = 0, .speedEV = 210, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("PICHU"), .friendship = 0 }, } }, { .name = _("GABRIEL"), .facilityClass = FACILITY_CLASS_CUE_BALL, .textColor = 1, .speechBefore = {EC_WORD_YAHOO, EC_WORD_EXCL, EC_WORD_HERE_I_COME, EC_WORD_TO, EC_WORD_SWARM, EC_WORD_YOU}, .speechWin = {EC_WORD_I_AM, EC_WORD_INVINCIBLE, EC_WORD_YOU, EC_WORD_GOT, EC_WORD_THAT, EC_WORD_QUES}, .speechLose = {EC_WORD_WHAT, EC_WORD_WAS, EC_WORD_THAT, EC_WORD_QUES, 0xFFFF, 0xFFFF}, .speechAfter = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_WIN, EC_WORD_NEXT, EC_WORD_TIME}, .mons = { { .species = SPECIES_PICHU, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_THUNDER_WAVE, MOVE_FRUSTRATION, MOVE_THUNDERBOLT, MOVE_ATTRACT}, .hpEV = 90, .attackEV = 210, .defenseEV = 0, .speedEV = 0, .spAttackEV = 210, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x81, // MALE NAUGHTY .nickname = _("PICHU"), .friendship = 0 }, { .species = SPECIES_TOGEPI, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_ATTRACT, MOVE_FRUSTRATION, MOVE_TOXIC, MOVE_SUBSTITUTE}, .hpEV = 210, .attackEV = 210, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 90, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x33, // MALE LONELY .nickname = _("TOGEPI"), .friendship = 0 }, { .species = SPECIES_CLEFFA, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_ENCORE, MOVE_TOXIC, MOVE_DOUBLE_TEAM, MOVE_FLASH}, .hpEV = 210, .attackEV = 0, .defenseEV = 150, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 150, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0xCF, // MALE RELAXED .nickname = _("CLEFFA"), .friendship = 0 }, { .species = SPECIES_IGGLYBUFF, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_ATTRACT, MOVE_SUBSTITUTE, MOVE_SING, MOVE_PERISH_SONG}, .hpEV = 210, .attackEV = 0, .defenseEV = 210, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 90, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0xCF, // MALE RELAXED .nickname = _("IGGLYBUFF"), .friendship = 0 }, { .species = SPECIES_SMOOCHUM, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_SWEET_KISS, MOVE_PERISH_SONG, MOVE_TOXIC, MOVE_ATTRACT}, .hpEV = 110, .attackEV = 0, .defenseEV = 200, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x16, // FEMALE SASSY .nickname = _("SMOOCHUM"), .friendship = 0 }, { .species = SPECIES_MAGBY, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_LEER, MOVE_FRUSTRATION, MOVE_SUBSTITUTE, MOVE_FLAMETHROWER}, .hpEV = 90, .attackEV = 210, .defenseEV = 0, .speedEV = 0, .spAttackEV = 210, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x4D, // MALE BRAVE .nickname = _("MAGBY"), .friendship = 0 }, } }, }, .checksum = 0x00017a4a }; static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_2 = { .id = 8, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_KNOCKOUT, .prize = TTPRIZE_UP_GRADE, .trainers = { { .name = _("MIKE"), .facilityClass = FACILITY_CLASS_HIKER, .textColor = 5, .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_FULL, EC_WORD_OF, EC_WORD_POWER}, .speechWin = {EC_WORD_WHAT_S_UP_QUES, EC_WORD_WHERE, EC_WORD_IS, EC_WORD_YOUR, EC_WORD_POWER, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_GOT, EC_WORD_ME, EC_WORD_WITH, EC_WORD_YOUR, EC_MOVE2(FAKE_OUT)}, .speechAfter = {EC_WORD_OH_YEAH, EC_WORD_EXCL, EC_WORD_THAT_S, EC_WORD_PRETTY, EC_WORD_EXCELLENT, EC_WORD_EXCL}, .mons = { { .species = SPECIES_PINSIR, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_GUILLOTINE, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_REVENGE}, .hpEV = 100, .attackEV = 210, .defenseEV = 0, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("PINSIR"), .friendship = 255 }, { .species = SPECIES_CHARIZARD, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_DRAGON_CLAW, MOVE_METAL_CLAW, MOVE_AERIAL_ACE, MOVE_OUTRAGE}, .hpEV = 200, .attackEV = 200, .defenseEV = 0, .speedEV = 110, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x35, // MALE ADAMANT .nickname = _("CHARIZARD"), .friendship = 255 }, { .species = SPECIES_RHYDON, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_MEGAHORN, MOVE_HORN_DRILL, MOVE_CRUSH_CLAW, MOVE_BRICK_BREAK}, .hpEV = 100, .attackEV = 210, .defenseEV = 200, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x09, // FEMALE LAX .nickname = _("RHYDON"), .friendship = 255 }, { .species = SPECIES_ARCANINE, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_EXTREME_SPEED, MOVE_IRON_TAIL, MOVE_AERIAL_ACE, MOVE_DIG}, .hpEV = 110, .attackEV = 200, .defenseEV = 0, .speedEV = 200, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x3F, // MALE JOLLY .nickname = _("ARCANINE"), .friendship = 255 }, { .species = SPECIES_GOLEM, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_DOUBLE_EDGE, MOVE_ROLLOUT, MOVE_BRICK_BREAK, MOVE_DIG}, .hpEV = 100, .attackEV = 210, .defenseEV = 200, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x02, // FEMALE BRAVE .nickname = _("GOLEM"), .friendship = 255 }, { .species = SPECIES_HOUNDOOM, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_CRUNCH, MOVE_REVERSAL, MOVE_DOUBLE_EDGE, MOVE_COUNTER}, .hpEV = 200, .attackEV = 110, .defenseEV = 200, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 1, .personality = 0x08, // FEMALE IMPISH .nickname = _("HOUNDOOM"), .friendship = 255 }, } }, { .name = _("REBECCA"), .facilityClass = FACILITY_CLASS_CRUSH_GIRL, .textColor = 5, .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_WORD_WIN, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF}, .speechWin = {EC_WORD_IT_S, EC_WORD_TOO, EC_WORD_BAD, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_OVERWHELMING}, .speechLose = {EC_WORD_ARRGH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechAfter = {EC_WORD_YOU, EC_WORD_ANGER, EC_WORD_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_TOUGH}, .mons = { { .species = SPECIES_SANDSLASH, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_CRUSH_CLAW, MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_AERIAL_ACE}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x0D, // FEMALE JOLLY .nickname = _("SANDSLASH"), .friendship = 255 }, { .species = SPECIES_DRAGONAIR, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_OUTRAGE, MOVE_IRON_TAIL, MOVE_DOUBLE_EDGE, MOVE_SLAM}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x03, // FEMALE ADAMANT .nickname = _("DRAGONAIR"), .friendship = 255 }, { .species = SPECIES_RAPIDASH, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_BOUNCE, MOVE_IRON_TAIL, MOVE_THRASH, MOVE_DOUBLE_EDGE}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 1, .personality = 0x94, // MALE CAREFUL .nickname = _("RAPIDASH"), .friendship = 255 }, { .species = SPECIES_FLAREON, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_IRON_TAIL, MOVE_FLAIL, MOVE_BITE, MOVE_DOUBLE_EDGE}, .hpEV = 255, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x21, // MALE IMPISH .nickname = _("FLAREON"), .friendship = 255 }, { .species = SPECIES_NIDOQUEEN, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_SUPERPOWER, MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_COUNTER}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x17, // FEMALE CAREFUL .nickname = _("NIDOQUEEN"), .friendship = 255 }, { .species = SPECIES_PERSIAN, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_RETURN, MOVE_AERIAL_ACE, MOVE_IRON_TAIL, MOVE_DIG}, .hpEV = 110, .attackEV = 200, .defenseEV = 0, .speedEV = 200, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("PERSIAN"), .friendship = 255 }, } }, { .name = _("NICOLAS"), .facilityClass = FACILITY_CLASS_BLACK_BELT, .textColor = 5, .speechBefore = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_WHERE, EC_WORD_YOU, EC_WORD_STOP, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_TO, EC_WORD_EVER, EC_WORD_BEAT, EC_WORD_ME}, .speechLose = {EC_WORD_WHY, EC_WORD_COULDN_T, EC_WORD_I, EC_WORD_BEAT, EC_WORD_YOU, EC_WORD_QUES}, .speechAfter = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_TRAIN, EC_WORD_SOME, EC_WORD_MORE}, .mons = { { .species = SPECIES_HITMONLEE, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_MEGA_KICK, MOVE_REVERSAL, MOVE_FOCUS_PUNCH, MOVE_BRICK_BREAK}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x08, // MALE IMPISH .nickname = _("HITMONLEE"), .friendship = 255 }, { .species = SPECIES_SCYTHER, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_SLASH, MOVE_REVERSAL, MOVE_STEEL_WING, MOVE_AERIAL_ACE}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x17, // FEMALE CAREFUL .nickname = _("SCYTHER"), .friendship = 255 }, { .species = SPECIES_MAGMAR, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_FIRE_PUNCH, MOVE_THUNDER_PUNCH, MOVE_BRICK_BREAK, MOVE_IRON_TAIL}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x53, // MALE IMPISH .nickname = _("MAGMAR"), .friendship = 255 }, { .species = SPECIES_MACHAMP, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_DYNAMIC_PUNCH, MOVE_DIG, MOVE_CROSS_CHOP, MOVE_REVENGE}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x3F, // MALE JOLLY .nickname = _("MACHAMP"), .friendship = 255 }, { .species = SPECIES_PRIMEAPE, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_THRASH, MOVE_CROSS_CHOP, MOVE_IRON_TAIL, MOVE_AERIAL_ACE}, .hpEV = 0, .attackEV = 0, .defenseEV = 200, .speedEV = 110, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x08, // FEMALE IMPISH .nickname = _("PRIMEAPE"), .friendship = 255 }, { .species = SPECIES_POLIWRATH, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_BODY_SLAM, MOVE_DIG, MOVE_MEGA_KICK, MOVE_COUNTER}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x0D, // FEMALE JOLLY .nickname = _("POLIWRATH"), .friendship = 255 }, } }, }, .checksum = 0x00016f05 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Single_5 = { .id = 9, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_HP_UP, .trainers = { { .name = _("JOEY"), .facilityClass = FACILITY_CLASS_CAMPER, .textColor = 1, .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_SCARY, EC_WORD_STRONG, EC_WORD_EXCL}, .speechWin = {EC_WORD_WERE, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_QUES}, .speechLose = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_WAY, EC_WORD_TOO_STRONG, EC_WORD_EXCL}, .speechAfter = {EC_WORD_THE, EC_WORD_WAY, EC_WORD_POKEMON, EC_WORD_MATCH_UP, EC_WORD_IS, EC_WORD_IMPORTANT}, .mons = { { .species = SPECIES_MURKROW, .heldItem = ITEM_BLACK_GLASSES, .moves = {MOVE_FAINT_ATTACK, MOVE_AERIAL_ACE, MOVE_SHADOW_BALL, MOVE_CONFUSE_RAY}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x89, // MALE SERIOUS .nickname = _("MURKROW"), .friendship = 255 }, { .species = SPECIES_TAUROS, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_EARTHQUAKE, MOVE_BODY_SLAM, MOVE_ROCK_TOMB, MOVE_PURSUIT}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0C, // MALE SERIOUS .nickname = _("TAUROS"), .friendship = 255 }, { .species = SPECIES_SLOWBRO, .heldItem = ITEM_MYSTIC_WATER, .moves = {MOVE_AMNESIA, MOVE_PSYCHIC, MOVE_SURF, MOVE_ICE_BEAM}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x89, // MALE SERIOUS .nickname = _("SLOWBRO"), .friendship = 255 }, { .species = SPECIES_ARBOK, .heldItem = ITEM_POISON_BARB, .moves = {MOVE_IRON_TAIL, MOVE_SLUDGE_BOMB, MOVE_ROCK_SLIDE, MOVE_TOXIC}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x89, // MALE SERIOUS .nickname = _("ARBOK"), .friendship = 255 }, { .species = SPECIES_NIDOKING, .heldItem = ITEM_SOFT_SAND, .moves = {MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_SLUDGE_BOMB, MOVE_ROCK_SLIDE}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0C, // MALE SERIOUS .nickname = _("NIDOKING"), .friendship = 255 }, { .species = SPECIES_RAPIDASH, .heldItem = ITEM_CHARCOAL, .moves = {MOVE_FLAMETHROWER, MOVE_BOUNCE, MOVE_QUICK_ATTACK, MOVE_DOUBLE_KICK}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x89, // MALE SERIOUS .nickname = _("RAPIDASH"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016417 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Single_8 = { .id = 10, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_METAL_COAT, .trainers = { { .name = _("LILY"), .facilityClass = FACILITY_CLASS_PKMN_BREEDER, .textColor = 1, .speechBefore = {EC_WORD_I, EC_WORD_WANT, EC_WORD_SOMETHING, EC_WORD_IN, EC_MOVE(RETURN), EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_BELIEVE, EC_WORD_IN, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_SOMETHING, EC_WORD_IN, EC_MOVE(RETURN), EC_WORD_ELLIPSIS}, .speechAfter = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_HAVE, EC_WORD_MY, EC_WORD_TRUST, EC_WORD_FOREVER}, .mons = { { .species = SPECIES_CLEFAIRY, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_CHARM, MOVE_METRONOME, MOVE_RETURN, MOVE_REST}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("CLEFAIRY"), .friendship = 255 }, { .species = SPECIES_TOGEPI, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_CHARM, MOVE_METRONOME, MOVE_RETURN, MOVE_REST}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("TOGEPI"), .friendship = 255 }, { .species = SPECIES_MEOWTH, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_CHARM, MOVE_ASSIST, MOVE_RETURN, MOVE_REST}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x89, // MALE SERIOUS .nickname = _("MEOWTH"), .friendship = 255 }, { .species = SPECIES_JIGGLYPUFF, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_CHARM, MOVE_ROLLOUT, MOVE_RETURN, MOVE_REST}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("JIGGLYPUFF"), .friendship = 255 }, { .species = SPECIES_SNORLAX, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_CHARM, MOVE_ROLLOUT, MOVE_RETURN, MOVE_REST}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x25, // MALE SERIOUS .nickname = _("SNORLAX"), .friendship = 255 }, { .species = SPECIES_SNUBBULL, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_CHARM, MOVE_LICK, MOVE_RETURN, MOVE_REST}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("SNUBBULL"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016cb7 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Single_2 = { .id = 11, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_UP_GRADE, .trainers = { { .name = _("BRANDON"), .facilityClass = FACILITY_CLASS_BUG_CATCHER, .textColor = 1, .speechBefore = {EC_WORD_POISON, EC_WORD_IS, EC_WORD_JUST, EC_WORD_SO, EC_WORD_AWFUL, EC_WORD_ISN_T_IT_QUES}, .speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_WORD_ISN_T, EC_WORD_POISON, EC_WORD_TERRIBLE, EC_WORD_QUES}, .speechLose = {EC_WORD_HUH_QUES, EC_WORD_OUR, EC_WORD_POISON, EC_WORD_DIDN_T, EC_WORD_WORK, EC_WORD_QUES}, .speechAfter = {EC_WORD_POISON, EC_WORD_IS, EC_WORD_A, EC_WORD_TERRIBLE, EC_MOVE(TORMENT), EC_WORD_ISN_T_IT_QUES}, .mons = { { .species = SPECIES_BUTTERFREE, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_SILVER_WIND, MOVE_SLEEP_POWDER, MOVE_PSYCHIC, MOVE_SUPERSONIC}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x8A, // MALE JOLLY .nickname = _("BUTTERFREE"), .friendship = 255 }, { .species = SPECIES_BEEDRILL, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_SLUDGE_BOMB, MOVE_TWINEEDLE, MOVE_DOUBLE_TEAM, MOVE_AERIAL_ACE}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x8A, // MALE JOLLY .nickname = _("BEEDRILL"), .friendship = 255 }, { .species = SPECIES_PARASECT, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_GIGA_DRAIN, MOVE_LIGHT_SCREEN, MOVE_STUN_SPORE, MOVE_SLASH}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x8A, // MALE JOLLY .nickname = _("PARASECT"), .friendship = 255 }, { .species = SPECIES_YANMA, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_HYPNOSIS, MOVE_SONIC_BOOM, MOVE_QUICK_ATTACK, MOVE_AERIAL_ACE}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 1, .personality = 0x8A, // MALE JOLLY .nickname = _("YANMA"), .friendship = 255 }, { .species = SPECIES_SHUCKLE, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_TOXIC, MOVE_ROCK_TOMB, MOVE_PROTECT, MOVE_REST}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x8A, // MALE JOLLY .nickname = _("SHUCKLE"), .friendship = 255 }, { .species = SPECIES_FORRETRESS, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_TOXIC, MOVE_GIGA_DRAIN, MOVE_PROTECT, MOVE_SANDSTORM}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x8A, // MALE JOLLY .nickname = _("FORRETRESS"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016e1f }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_3 = { .id = 12, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_IRON, .trainers = { { .name = _("RIC & RENE"), .facilityClass = FACILITY_CLASS_CRUSH_KIN, .textColor = 5, .speechBefore = {EC_WORD_MY, EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_IS, EC_WORD_REALLY, EC_WORD_AWESOME}, .speechWin = {EC_WORD_MY, EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_IS, EC_WORD_TOO, EC_WORD_AWESOME}, .speechLose = {EC_WORD_MY, EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_ISN_T, EC_WORD_AWESOME, EC_WORD_QUES}, .speechAfter = {EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_FIGHT, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, .mons = { { .species = SPECIES_HITMONLEE, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_ROCK_TOMB, MOVE_HI_JUMP_KICK, MOVE_BULK_UP, MOVE_PROTECT}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x02, // MALE BRAVE .nickname = _("HITMONLEE"), .friendship = 255 }, { .species = SPECIES_RHYDON, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_MEGAHORN, MOVE_ROCK_BLAST, MOVE_BRICK_BREAK, MOVE_PROTECT}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x7F, // MALE BRAVE .nickname = _("RHYDON"), .friendship = 255 }, { .species = SPECIES_GOLEM, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_BRICK_BREAK, MOVE_ROCK_BLAST, MOVE_DIG, MOVE_PROTECT}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x02, // FEMALE BRAVE .nickname = _("GOLEM"), .friendship = 255 }, { .species = SPECIES_MAGMAR, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_FIRE_PUNCH, MOVE_BRICK_BREAK, MOVE_CONFUSE_RAY, MOVE_PROTECT}, .hpEV = 0, .attackEV = 255, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x4F, // MALE NAUGHTY .nickname = _("MAGMAR"), .friendship = 255 }, { .species = SPECIES_HERACROSS, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_MEGAHORN, MOVE_BRICK_BREAK, MOVE_ROCK_TOMB, MOVE_PROTECT}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x7F, // MALE BRAVE .nickname = _("HERACROSS"), .friendship = 255 }, { .species = SPECIES_POLIWRATH, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_FOCUS_PUNCH, MOVE_SURF, MOVE_BULK_UP, MOVE_PROTECT}, .hpEV = 0, .attackEV = 255, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x97, // MALE LONELY .nickname = _("POLIWRATH"), .friendship = 255 }, } }, { .name = _("RIC & RENE"), .facilityClass = FACILITY_CLASS_CRUSH_KIN, .textColor = 5, .speechBefore = {EC_WORD_I_AM, EC_WORD_REALLY, EC_WORD_AWESOME, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, .speechWin = {EC_WORD_I_AM, EC_WORD_TOO, EC_WORD_AWESOME, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_HUH_QUES, 0xFFFF, EC_WORD_I_AM, EC_WORD_NOT_VERY, EC_WORD_AWESOME, EC_WORD_QUES}, .speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_DO, EC_WORD_MY, EC_WORD_BEST, EC_WORD_EXCL}, .mons = { { .species = SPECIES_MACHAMP, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_CROSS_CHOP, MOVE_SEISMIC_TOSS, MOVE_ROCK_TOMB, MOVE_PROTECT}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x4E, // MALE ADAMANT .nickname = _("MACHAMP"), .friendship = 255 }, { .species = SPECIES_PINSIR, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SUBMISSION, MOVE_PROTECT}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("PINSIR"), .friendship = 255 }, { .species = SPECIES_MAROWAK, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_BRICK_BREAK, MOVE_BONEMERANG, MOVE_AERIAL_ACE, MOVE_PROTECT}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x03, // FEMALE ADAMANT .nickname = _("MAROWAK"), .friendship = 255 }, { .species = SPECIES_HITMONCHAN, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_MACH_PUNCH, MOVE_THUNDER_PUNCH, MOVE_DOUBLE_TEAM, MOVE_PROTECT}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x03, // MALE ADAMANT .nickname = _("HITMONCHAN"), .friendship = 255 }, { .species = SPECIES_ELECTABUZZ, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_THUNDER_PUNCH, MOVE_BRICK_BREAK, MOVE_THUNDER_WAVE, MOVE_PROTECT}, .hpEV = 0, .attackEV = 255, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x4F, // MALE NAUGHTY .nickname = _("ELECTABUZZ"), .friendship = 255 }, { .species = SPECIES_POLIWRATH, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_FOCUS_PUNCH, MOVE_SURF, MOVE_BULK_UP, MOVE_PROTECT}, .hpEV = 0, .attackEV = 255, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x97, // MALE LONELY .nickname = _("POLIWRATH"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x000166b4 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_1 = { .id = 13, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_DRAGON_SCALE, .trainers = { { .name = _("JEN & KIRA"), .facilityClass = FACILITY_CLASS_TWINS, .textColor = 5, .speechBefore = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_TRY, EC_WORD_HARD, EC_WORD_EXCL}, .speechWin = {EC_WORD_EHEHE, EC_WORD_YAY, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_TRY, EC_WORD_TO, EC_WORD_GET, EC_WORD_BETTER}, .mons = { { .species = SPECIES_JOLTEON, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_QUICK_ATTACK, MOVE_THUNDERBOLT, MOVE_DOUBLE_KICK, MOVE_PIN_MISSILE}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x29, // MALE MILD .nickname = _("JOLTEON"), .friendship = 255 }, { .species = SPECIES_ESPEON, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_QUICK_ATTACK, MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_BITE}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x29, // MALE MILD .nickname = _("ESPEON"), .friendship = 255 }, { .species = SPECIES_FLAREON, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_QUICK_ATTACK, MOVE_FLAMETHROWER, MOVE_SHADOW_BALL, MOVE_IRON_TAIL}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x33, // MALE LONELY .nickname = _("FLAREON"), .friendship = 255 }, { .species = SPECIES_VAPOREON, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_QUICK_ATTACK, MOVE_WATERFALL, MOVE_ICE_BEAM, MOVE_BITE}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x10, // FEMALE MILD .nickname = _("VAPOREON"), .friendship = 255 }, { .species = SPECIES_EEVEE, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_QUICK_ATTACK, MOVE_DOUBLE_EDGE, MOVE_BITE, MOVE_IRON_TAIL}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x10, // FEMALE MILD .nickname = _("EEVEE"), .friendship = 255 }, { .species = SPECIES_UMBREON, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_QUICK_ATTACK, MOVE_FAINT_ATTACK, MOVE_SHADOW_BALL, MOVE_IRON_TAIL}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x10, // FEMALE MILD .nickname = _("UMBREON"), .friendship = 255 }, } }, { .name = _("JEN & KIRA"), .facilityClass = FACILITY_CLASS_TWINS, .textColor = 3, .speechBefore = {EC_WORD_LET_S, EC_WORD_TRY, EC_WORD_HARD, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechAfter = {EC_WORD_WE, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_WORK, EC_WORD_BETTER, 0xFFFF}, .mons = { { .species = SPECIES_JOLTEON, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_THUNDERBOLT}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 10 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("JOLTEON"), .friendship = 255 }, { .species = SPECIES_ESPEON, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_HELPING_HAND, MOVE_PSYCHIC}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 10 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("ESPEON"), .friendship = 255 }, { .species = SPECIES_FLAREON, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_FLAMETHROWER}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 13 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0D, // FEMALE JOLLY .nickname = _("FLAREON"), .friendship = 255 }, { .species = SPECIES_VAPOREON, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_SURF}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 35 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x23, // MALE TIMID .nickname = _("VAPOREON"), .friendship = 255 }, { .species = SPECIES_EEVEE, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_DOUBLE_EDGE}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 35 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x23, // MALE TIMID .nickname = _("EEVEE"), .friendship = 255 }, { .species = SPECIES_UMBREON, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_FAINT_ATTACK}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 35 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x23, // MALE TIMID .nickname = _("UMBREON"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x00017fc2 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_4 = { .id = 14, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_MENTAL_HERB, .trainers = { { .name = _("ISAC & MAG"), .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 1, .speechBefore = {EC_WORD_OUR, EC_MOVE(EARTHQUAKE), EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_SHAKY}, .speechWin = {EC_WORD_FEELING, EC_WORD_SHAKY, EC_WORD_HUH_QUES, 0xFFFF, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_I_AM, EC_WORD_ALL, EC_WORD_SHAKY, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF}, .speechAfter = {EC_WORD_MY, EC_WORD_GIRL, EC_WORD_ISN_T, EC_WORD_SHAKY, EC_WORD_SHE_IS, EC_WORD_LOVEY_DOVEY}, .mons = { { .species = SPECIES_NIDOKING, .heldItem = ITEM_SOFT_SAND, .moves = {MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_SHADOW_BALL, MOVE_FIRE_BLAST}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x03, // MALE ADAMANT .nickname = _("NIDOKING"), .friendship = 255 }, { .species = SPECIES_GLIGAR, .heldItem = ITEM_SOFT_SAND, .moves = {MOVE_EARTHQUAKE, MOVE_QUICK_ATTACK, MOVE_AERIAL_ACE, MOVE_IRON_TAIL}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("GLIGAR"), .friendship = 255 }, { .species = SPECIES_QUAGSIRE, .heldItem = ITEM_SOFT_SAND, .moves = {MOVE_EARTHQUAKE, MOVE_SLUDGE_BOMB, MOVE_BLIZZARD, MOVE_BRICK_BREAK}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("QUAGSIRE"), .friendship = 0 }, { .species = SPECIES_PILOSWINE, .heldItem = ITEM_SOFT_SAND, .moves = {MOVE_EARTHQUAKE, MOVE_BLIZZARD, MOVE_ANCIENT_POWER, MOVE_BODY_SLAM}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("PILOSWINE"), .friendship = 255 }, { .species = SPECIES_GOLEM, .heldItem = ITEM_SOFT_SAND, .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_BLAST, MOVE_BRICK_BREAK, MOVE_EXPLOSION}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x80, // MALE ADAMANT .nickname = _("GOLEM"), .friendship = 255 }, { .species = SPECIES_STEELIX, .heldItem = ITEM_SOFT_SAND, .moves = {MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_DRAGON_BREATH, MOVE_DOUBLE_EDGE}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("STEELIX"), .friendship = 255 }, } }, { .name = _("ISAC & MAG"), .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 1, .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_DOESN_T, EC_WORD_GET, EC_WORD_ALL, EC_WORD_SHAKY}, .speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_WORD_I, EC_WORD_DIDN_T, EC_WORD_LIE, EC_WORD_EXCL}, .speechLose = {EC_WORD_HUH_QUES, EC_WORD_YOU, EC_WORD_LEFT, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_SHAKY}, .speechAfter = {EC_WORD_I_AM, EC_WORD_LOVEY_DOVEY, EC_WORD_FOR, EC_WORD_HIM, EC_WORD_NOT, EC_WORD_SHAKY}, .mons = { { .species = SPECIES_SKARMORY, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_SANDSTORM, MOVE_STEEL_WING, MOVE_AIR_CUTTER, MOVE_SPIKES}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0B, // FEMALE HASTY .nickname = _("SKARMORY"), .friendship = 255 }, { .species = SPECIES_MANTINE, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_CONFUSE_RAY, MOVE_AERIAL_ACE}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0B, // FEMALE HASTY .nickname = _("MANTINE"), .friendship = 255 }, { .species = SPECIES_JUMPLUFF, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_TAIL_WHIP, MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_AERIAL_ACE}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0B, // FEMALE HASTY .nickname = _("JUMPLUFF"), .friendship = 255 }, { .species = SPECIES_GENGAR, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_THUNDERBOLT, MOVE_PSYCHIC}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0B, // FEMALE HASTY .nickname = _("GENGAR"), .friendship = 255 }, { .species = SPECIES_CROBAT, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_GIGA_DRAIN, MOVE_POISON_FANG, MOVE_FLY, MOVE_STEEL_WING}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0B, // FEMALE HASTY .nickname = _("CROBAT"), .friendship = 255 }, { .species = SPECIES_XATU, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_AERIAL_ACE, MOVE_LIGHT_SCREEN}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0B, // FEMALE HASTY .nickname = _("XATU"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016bb0 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_8 = { .id = 15, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_KNOCKOUT, .prize = TTPRIZE_BRIGHT_POWDER, .trainers = { { .name = _("CHELSEA"), .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, .textColor = 7, .speechBefore = {EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD, EC_WORD_IS, EC_WORD_IMPORTANT, EC_WORD_ISN_T_IT_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_TAKE, EC_WORD_THE, EC_WORD_LOSS, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_BE, EC_WORD_KIND, EC_WORD_TO, EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD}, .speechAfter = {EC_WORD_DON_T, EC_WORD_EVER, EC_WORD_POISON, EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD}, .mons = { { .species = SPECIES_VILEPLUME, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_INGRAIN, MOVE_GIGA_DRAIN, MOVE_SLUDGE_BOMB, MOVE_STUN_SPORE}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x11, // FEMALE QUIET .nickname = _("VILEPLUME"), .friendship = 255 }, { .species = SPECIES_STARMIE, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_PSYCHIC, MOVE_ICE_BEAM, MOVE_WATERFALL, MOVE_RECOVER}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x10, // GENDERLESS MILD .nickname = _("STARMIE"), .friendship = 255 }, { .species = SPECIES_URSARING, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_FAINT_ATTACK, MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_ROCK_TOMB}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x01, // FEMALE LONELY .nickname = _("URSARING"), .friendship = 255 }, { .species = SPECIES_NOCTOWL, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_FAINT_ATTACK, MOVE_AERIAL_ACE}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x01, // FEMALE LONELY .nickname = _("NOCTOWL"), .friendship = 255 }, { .species = SPECIES_NINETALES, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_GRUDGE, MOVE_OVERHEAT, MOVE_FAINT_ATTACK, MOVE_WILL_O_WISP}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x10, // FEMALE MILD .nickname = _("NINETALES"), .friendship = 255 }, { .species = SPECIES_LEDIAN, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_SILVER_WIND, MOVE_SWIFT, MOVE_AERIAL_ACE, MOVE_TOXIC}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x01, // FEMALE LONELY .nickname = _("LEDIAN"), .friendship = 255 }, } }, { .name = _("TRENTON"), .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, .textColor = 7, .speechBefore = {EC_WORD_I, EC_MOVE2(PROTECT), EC_WORD_THE, EC_WORD_GREAT, EC_WORD_GREEN, EC_WORD_WORLD}, .speechWin = {EC_WORD_TAKE_THAT, EC_WORD_EXCL, EC_WORD_THE, EC_WORD_LOSS, EC_WORD_IS, EC_WORD_YOURS}, .speechLose = {EC_MOVE2(PROTECT), EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD, 0xFFFF, 0xFFFF}, .speechAfter = {EC_MOVE2(PROTECT), EC_WORD_AND, EC_WORD_RESUSCITATE, EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD}, .mons = { { .species = SPECIES_GYARADOS, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_EARTHQUAKE, MOVE_WATERFALL, MOVE_BLIZZARD, MOVE_HYPER_BEAM}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x88, // MALE HASTY .nickname = _("GYARADOS"), .friendship = 255 }, { .species = SPECIES_VICTREEBEL, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_GIGA_DRAIN, MOVE_SLUDGE_BOMB, MOVE_REFLECT, MOVE_ATTRACT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x8E, // MALE QUIET .nickname = _("VICTREEBEL"), .friendship = 255 }, { .species = SPECIES_DONPHAN, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_IRON_TAIL, MOVE_DOUBLE_EDGE}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x97, // MALE LONELY .nickname = _("DONPHAN"), .friendship = 255 }, { .species = SPECIES_FEAROW, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_FAINT_ATTACK, MOVE_DRILL_PECK, MOVE_STEEL_WING, MOVE_DOUBLE_TEAM}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x97, // MALE LONELY .nickname = _("FEAROW"), .friendship = 255 }, { .species = SPECIES_ARCANINE, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_EXTREME_SPEED, MOVE_FIRE_BLAST, MOVE_CRUNCH, MOVE_AERIAL_ACE}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x4F, // MALE NAUGHTY .nickname = _("ARCANINE"), .friendship = 255 }, { .species = SPECIES_ARIADOS, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_PSYCHIC, MOVE_SLUDGE_BOMB, MOVE_SIGNAL_BEAM, MOVE_TOXIC}, .hpEV = 0, .attackEV = 255, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x97, // MALE LONELY .nickname = _("ARIADOS"), .friendship = 255 }, } }, { .name = _("ALBERT"), .facilityClass = FACILITY_CLASS_COOLTRAINER_M, .textColor = 7, .speechBefore = {EC_WORD_LET_S, EC_WORD_HAVE, EC_WORD_AN, EC_WORD_EXCITING, EC_WORD_TIME, EC_WORD_HERE}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_TO, EC_WORD_MAKE, EC_WORD_THINGS, EC_WORD_EXCITING}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_STRONG, EC_WORD_THAT_WAS, EC_WORD_WILD, EC_WORD_AND, EC_WORD_EXCITING}, .speechAfter = {EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_AFTER, EC_WORD_THAT, EC_WORD_EXCITING, EC_WORD_MATCH}, .mons = { { .species = SPECIES_KINGDRA, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_TWISTER, MOVE_OCTAZOOKA, MOVE_AURORA_BEAM, MOVE_RETURN}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x15, // FEMALE GENTLE .nickname = _("KINGDRA"), .friendship = 255 }, { .species = SPECIES_GOLEM, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_BRICK_BREAK, MOVE_DOUBLE_EDGE}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x7F, // MALE BRAVE .nickname = _("GOLEM"), .friendship = 255 }, { .species = SPECIES_DRAGONITE, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_THUNDER, MOVE_FIRE_BLAST, MOVE_BLIZZARD, MOVE_DRAGON_CLAW}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x01, // FEMALE LONELY .nickname = _("DRAGONITE"), .friendship = 255 }, { .species = SPECIES_TYRANITAR, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_EARTHQUAKE, MOVE_CRUNCH, MOVE_THUNDER, MOVE_FIRE_BLAST}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x97, // MALE LONELY .nickname = _("TYRANITAR"), .friendship = 255 }, { .species = SPECIES_AMPHAROS, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_REFLECT, MOVE_THUNDER, MOVE_BRICK_BREAK, MOVE_RETURN}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x13, // FEMALE RASH .nickname = _("AMPHAROS"), .friendship = 255 }, { .species = SPECIES_VENUSAUR, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_GIGA_DRAIN, MOVE_LEECH_SEED, MOVE_TOXIC, MOVE_BODY_SLAM}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x2A, // MALE QUIET .nickname = _("VENUSAUR"), .friendship = 255 }, } }, }, .checksum = 0x0001844c }; static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_3 = { .id = 16, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_KNOCKOUT, .prize = TTPRIZE_CALCIUM, .trainers = { { .name = _("CAMRYN"), .facilityClass = FACILITY_CLASS_PICNICKER, .textColor = 1, .speechBefore = {EC_WORD_LET_S, EC_WORD_BATTLE, EC_WORD_I, EC_WORD_WON_T, EC_WORD_LOSE, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_SAID, EC_WORD_THAT, EC_WORD_I, EC_WORD_WOULD, EC_WORD_WIN}, .speechLose = {EC_WORD_OH_QUES, EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, EC_WORD_DID, EC_WORD_I, EC_WORD_LOSE, EC_WORD_QUES}, .speechAfter = {EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .mons = { { .species = SPECIES_MURKROW, .heldItem = ITEM_BLACK_GLASSES, .moves = {MOVE_AERIAL_ACE, MOVE_SHADOW_BALL, MOVE_FAINT_ATTACK, MOVE_CONFUSE_RAY}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x89, // MALE SERIOUS .nickname = _("MURKROW"), .friendship = 255 }, { .species = SPECIES_RAPIDASH, .heldItem = ITEM_CHARCOAL, .moves = {MOVE_BOUNCE, MOVE_FLAMETHROWER, MOVE_QUICK_ATTACK, MOVE_DOUBLE_KICK}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("RAPIDASH"), .friendship = 255 }, { .species = SPECIES_MILTANK, .heldItem = ITEM_SILK_SCARF, .moves = {MOVE_MILK_DRINK, MOVE_BRICK_BREAK, MOVE_BODY_SLAM, MOVE_SHADOW_BALL}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("MILTANK"), .friendship = 255 }, { .species = SPECIES_GOLDUCK, .heldItem = ITEM_MYSTIC_WATER, .moves = {MOVE_HYDRO_PUMP, MOVE_ICE_BEAM, MOVE_CALM_MIND, MOVE_LIGHT_SCREEN}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x89, // MALE SERIOUS .nickname = _("GOLDUCK"), .friendship = 255 }, { .species = SPECIES_SANDSLASH, .heldItem = ITEM_SOFT_SAND, .moves = {MOVE_SANDSTORM, MOVE_AERIAL_ACE, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x89, // MALE SERIOUS .nickname = _("SANDSLASH"), .friendship = 255 }, { .species = SPECIES_NIDOQUEEN, .heldItem = ITEM_HARD_STONE, .moves = {MOVE_EARTHQUAKE, MOVE_SUPERPOWER, MOVE_SLUDGE_BOMB, MOVE_ROCK_SLIDE}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("NIDOQUEEN"), .friendship = 255 }, } }, { .name = _("NATALIA"), .facilityClass = FACILITY_CLASS_AROMA_LADY, .textColor = 1, .speechBefore = {EC_WORD_THIS, EC_MOVE(SWEET_SCENT), EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_IT, EC_WORD_QUES}, .speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_NICE, EC_WORD_QUES, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_THAT, EC_WORD_WASN_T, EC_WORD_GOOD, EC_WORD_QUES, 0xFFFF, 0xFFFF}, .speechAfter = {EC_WORD_I, EC_MOVE2(REFRESH), EC_WORD_THINGS, EC_WORD_WITH, EC_WORD_REFRESHING, EC_MOVE(AROMATHERAPY)}, .mons = { { .species = SPECIES_BELLOSSOM, .heldItem = ITEM_PERSIM_BERRY, .moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_PETAL_DANCE, MOVE_FLAIL}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("BELLOSSOM"), .friendship = 255 }, { .species = SPECIES_VICTREEBEL, .heldItem = ITEM_MIRACLE_SEED, .moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_GIGA_DRAIN, MOVE_SLUDGE_BOMB}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x89, // MALE SERIOUS .nickname = _("VICTREEBEL"), .friendship = 255 }, { .species = SPECIES_PARASECT, .heldItem = ITEM_MIRACLE_SEED, .moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_GIGA_DRAIN, MOVE_AERIAL_ACE}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x89, // MALE SERIOUS .nickname = _("PARASECT"), .friendship = 255 }, { .species = SPECIES_VILEPLUME, .heldItem = ITEM_PERSIM_BERRY, .moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_PETAL_DANCE, MOVE_SLUDGE_BOMB}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("VILEPLUME"), .friendship = 255 }, { .species = SPECIES_VENUSAUR, .heldItem = ITEM_PERSIM_BERRY, .moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_PETAL_DANCE, MOVE_SLUDGE_BOMB}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("VENUSAUR"), .friendship = 255 }, { .species = SPECIES_MEGANIUM, .heldItem = ITEM_MIRACLE_SEED, .moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_GIGA_DRAIN, MOVE_BODY_SLAM}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x25, // MALE SERIOUS .nickname = _("MEGANIUM"), .friendship = 255 }, } }, { .name = _("KATHLEEN"), .facilityClass = FACILITY_CLASS_COOLTRAINER_F, .textColor = 7, .speechBefore = {EC_WORD_TOO, EC_WORD_BAD, EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_FOR, EC_WORD_YOU}, .speechWin = {EC_WORD_SORRY, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_HARD, EC_WORD_TO, EC_WORD_BELIEVE, EC_WORD_ELLIPSIS}, .speechAfter = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_PURE_POWER, EC_WORD_THAT, EC_WORD_IS, EC_WORD_NATURAL}, .mons = { { .species = SPECIES_MAROWAK, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_EARTHQUAKE, MOVE_BRICK_BREAK, MOVE_BONEMERANG, MOVE_AERIAL_ACE}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x89, // MALE SERIOUS .nickname = _("MAROWAK"), .friendship = 255 }, { .species = SPECIES_LAPRAS, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_SURF, MOVE_BLIZZARD, MOVE_PSYCHIC, MOVE_THUNDER}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("LAPRAS"), .friendship = 255 }, { .species = SPECIES_ARCANINE, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_CRUNCH, MOVE_AERIAL_ACE}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x57, // MALE SERIOUS .nickname = _("ARCANINE"), .friendship = 255 }, { .species = SPECIES_RAICHU, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_QUICK_ATTACK, MOVE_DOUBLE_TEAM, MOVE_IRON_TAIL}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x89, // MALE SERIOUS .nickname = _("RAICHU"), .friendship = 255 }, { .species = SPECIES_TOGETIC, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_ANCIENT_POWER, MOVE_SWEET_KISS, MOVE_PSYCHIC, MOVE_MAGICAL_LEAF}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("TOGETIC"), .friendship = 255 }, { .species = SPECIES_SNORLAX, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_BODY_SLAM, MOVE_REST, MOVE_SNORE, MOVE_SHADOW_BALL}, .hpEV = 84, .attackEV = 84, .defenseEV = 84, .speedEV = 84, .spAttackEV = 84, .spDefenseEV = 84, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0C, // FEMALE SERIOUS .nickname = _("SNORLAX"), .friendship = 255 }, } }, }, .checksum = 0x0001738c }; static const struct TrainerTowerFloor sTrainerTowerFloor_Single_6 = { .id = 17, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_CARBOS, .trainers = { { .name = _("BRADEN"), .facilityClass = FACILITY_CLASS_SWIMMER_M, .textColor = 1, .speechBefore = {EC_WORD_I_AM, EC_WORD_PRETTY, EC_WORD_HAPPY, EC_WORD_WITH, EC_WORD_MY, EC_WORD_TOUGHNESS}, .speechWin = {EC_WORD_WROOOAAR_EXCL, 0xFFFF, EC_WORD_SERIOUSLY, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_SHOCKED, EC_WORD_ME, EC_WORD_OUT, EC_WORD_OF, EC_WORD_HAPPINESS}, .speechAfter = {EC_WORD_NICE, EC_WORD_WORK, EC_WORD_YOU, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_FABULOUS}, .mons = { { .species = SPECIES_VAPOREON, .heldItem = ITEM_CHERI_BERRY, .moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_SHADOW_BALL, MOVE_WISH}, .hpEV = 100, .attackEV = 0, .defenseEV = 110, .speedEV = 0, .spAttackEV = 200, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x11, // FEMALE QUIET .nickname = _("VAPOREON"), .friendship = 255 }, { .species = SPECIES_SLOWBRO, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_SURF, MOVE_CONFUSION, MOVE_AMNESIA, MOVE_DISABLE}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x91, // MALE CALM .nickname = _("SLOWBRO"), .friendship = 255 }, { .species = SPECIES_POLITOED, .heldItem = ITEM_CHESTO_BERRY, .moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_HYPNOSIS, MOVE_SWAGGER}, .hpEV = 100, .attackEV = 100, .defenseEV = 110, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x96, // MALE HARDY .nickname = _("POLITOED"), .friendship = 255 }, { .species = SPECIES_TENTACRUEL, .heldItem = ITEM_POISON_BARB, .moves = {MOVE_SURF, MOVE_SLUDGE_BOMB, MOVE_ICE_BEAM, MOVE_MIRROR_COAT}, .hpEV = 100, .attackEV = 0, .defenseEV = 110, .speedEV = 0, .spAttackEV = 200, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x00, // FEMALE HARDY .nickname = _("TENTACRUEL"), .friendship = 255 }, { .species = SPECIES_RATICATE, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_SUPER_FANG, MOVE_HYPER_FANG, MOVE_THUNDER_WAVE, MOVE_QUICK_ATTACK}, .hpEV = 110, .attackEV = 200, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x80, // MALE ADAMANT .nickname = _("RATICATE"), .friendship = 255 }, { .species = SPECIES_DUNSPARCE, .heldItem = ITEM_PERSIM_BERRY, .moves = {MOVE_WATER_PULSE, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_YAWN}, .hpEV = 255, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x7F, // MALE BRAVE .nickname = _("DUNSPARCE"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016530 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Mixed_1 = { .id = 18, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_KINGS_ROCK, .trainers = { { .name = _("ALLYSON"), .facilityClass = FACILITY_CLASS_COOLTRAINER_F, .textColor = 7, .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_ABOUT, EC_WORD_TO, EC_WORD_LOSE, EC_WORD_TODAY}, .speechWin = {EC_WORD_YES, EC_WORD_EXCL_EXCL, EC_WORD_I, EC_WORD_ADORE, EC_WORD_MYSELF, EC_WORD_TODAY}, .speechLose = {EC_WORD_I_WAS, EC_WORD_CONFUSED, EC_WORD_ABOUT, EC_WORD_THINGS, EC_WORD_I, EC_WORD_THINK}, .speechAfter = {EC_WORD_YOU_RE, EC_WORD_TOO, EC_WORD_STRONG, EC_WORD_TODAY, EC_WORD_THAT_S, EC_WORD_ALL}, .mons = { { .species = SPECIES_STARMIE, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_SURF, MOVE_PSYCHIC, MOVE_THUNDER_WAVE, MOVE_RECOVER}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x0F, // GENDERLESS MODEST .nickname = _("STARMIE"), .friendship = 255 }, { .species = SPECIES_BLASTOISE, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_HYDRO_PUMP, MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_MIRROR_COAT}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x32, // MALE HARDY .nickname = _("BLASTOISE"), .friendship = 255 }, { .species = SPECIES_KINGDRA, .heldItem = ITEM_CHESTO_BERRY, .moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_DRAGON_BREATH, MOVE_REST}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x8C, // MALE MODEST .nickname = _("KINGDRA"), .friendship = 255 }, { .species = SPECIES_QUAGSIRE, .heldItem = ITEM_CHESTO_BERRY, .moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_ICE_BEAM, MOVE_REST}, .hpEV = 0, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 155, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x16, // FEMALE SASSY .nickname = _("QUAGSIRE"), .friendship = 255 }, { .species = SPECIES_LAPRAS, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_PSYCHIC, MOVE_ATTRACT}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x0F, // FEMALE MODEST .nickname = _("LAPRAS"), .friendship = 255 }, { .species = SPECIES_DRAGONITE, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_LIGHT_SCREEN}, .hpEV = 0, .attackEV = 100, .defenseEV = 0, .speedEV = 0, .spAttackEV = 155, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x96, // MALE HARDY .nickname = _("DRAGONITE"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016e32 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Single_1 = { .id = 19, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_UP_GRADE, .trainers = { { .name = _("ALBERTO"), .facilityClass = FACILITY_CLASS_SAILOR, .textColor = 5, .speechBefore = {EC_WORD_LET_S, EC_WORD_GET, EC_WORD_WITH, EC_WORD_IT, EC_WORD_RIGHT, EC_WORD_AWAY}, .speechWin = {EC_WORD_YO, EC_WORD_EXCL_EXCL, EC_WORD_YOU, EC_WORD_GIVE_UP, EC_WORD_NOW, EC_WORD_EH_QUES}, .speechLose = {EC_WORD_IT_S, EC_WORD_ALL, EC_WORD_OVER, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_SURRENDER}, .speechAfter = {EC_WORD_OKAY, EC_WORD_I, EC_WORD_CONCEDE, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_LOST}, .mons = { { .species = SPECIES_FERALIGATR, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_CRUNCH, MOVE_DRAGON_CLAW}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x32, // MALE HARDY .nickname = _("FERALIGATR"), .friendship = 255 }, { .species = SPECIES_POLIWRATH, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_MEGA_KICK, MOVE_ROCK_TOMB}, .hpEV = 100, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 1, .personality = 0x96, // MALE HARDY .nickname = _("POLIWRATH"), .friendship = 255 }, { .species = SPECIES_KANGASKHAN, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_CRUSH_CLAW, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_AERIAL_ACE}, .hpEV = 0, .attackEV = 255, .defenseEV = 130, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 125, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x03, // FEMALE ADAMANT .nickname = _("KANGASKHAN"), .friendship = 255 }, { .species = SPECIES_MILTANK, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_ROCK_TOMB, MOVE_MILK_DRINK}, .hpEV = 155, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x03, // FEMALE ADAMANT .nickname = _("MILTANK"), .friendship = 255 }, { .species = SPECIES_GOLDUCK, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_CROSS_CHOP, MOVE_SURF, MOVE_ICE_BEAM, MOVE_DISABLE}, .hpEV = 0, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 210, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 1, .personality = 0x96, // MALE HARDY .nickname = _("GOLDUCK"), .friendship = 255 }, { .species = SPECIES_GRANBULL, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB}, .hpEV = 0, .attackEV = 255, .defenseEV = 130, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 125, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0xCA, // MALE BRAVE .nickname = _("GRANBULL"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016890 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Mixed_5 = { .id = 20, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_METAL_COAT, .trainers = { { .name = _("KAT & KIPP"), .facilityClass = FACILITY_CLASS_SIS_AND_BRO, .textColor = 4, .speechBefore = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_TRY, EC_WORD_MY, EC_WORD_BEST}, .speechWin = {EC_WORD_WAY, EC_WORD_TO, EC_WORD_GO, EC_WORD_MY, EC_WORD_AWESOME, EC_WORD_BROTHER}, .speechLose = {EC_WORD_SIGH, EC_WORD_ELLIPSIS, EC_WORD_THAT_S, EC_WORD_HOW, EC_WORD_IT, EC_WORD_GOES}, .speechAfter = {EC_WORD_OKAY, EC_WORD_MY, EC_WORD_AWESOME, EC_WORD_BROTHER, EC_WORD_FIGHT, EC_WORD_FIGHT}, .mons = { { .species = SPECIES_SNEASEL, .heldItem = ITEM_RAWST_BERRY, .moves = {MOVE_DIG, MOVE_TORMENT, MOVE_REFLECT, MOVE_TAUNT}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x0D, // FEMALE JOLLY .nickname = _("SNEASEL"), .friendship = 255 }, { .species = SPECIES_OMASTAR, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_DIVE, MOVE_LEER, MOVE_TICKLE, MOVE_SUPERSONIC}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x2D, // MALE CALM .nickname = _("OMASTAR"), .friendship = 255 }, { .species = SPECIES_DEWGONG, .heldItem = ITEM_PERSIM_BERRY, .moves = {MOVE_DIVE, MOVE_ENCORE, MOVE_GROWL, MOVE_SAFEGUARD}, .hpEV = 200, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 210, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x14, // FEMALE CALM .nickname = _("DEWGONG"), .friendship = 255 }, { .species = SPECIES_QUAGSIRE, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_DIVE, MOVE_YAWN, MOVE_AMNESIA, MOVE_SAFEGUARD}, .hpEV = 200, .attackEV = 0, .defenseEV = 110, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x91, // MALE CALM .nickname = _("QUAGSIRE"), .friendship = 255 }, { .species = SPECIES_CORSOLA, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_DIG, MOVE_MIRROR_COAT, MOVE_RECOVER, MOVE_CONFUSE_RAY}, .hpEV = 155, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x17, // FEMALE CAREFUL .nickname = _("CORSOLA"), .friendship = 255 }, { .species = SPECIES_SANDSLASH, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_DIG, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_SAND_ATTACK}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x94, // MALE CAREFUL .nickname = _("SANDSLASH"), .friendship = 255 }, } }, { .name = _("KAT & KIPP"), .facilityClass = FACILITY_CLASS_SIS_AND_BRO, .textColor = 4, .speechBefore = {EC_WORD_FUFUFU, EC_WORD_ELLIPSIS, EC_WORD_WE, EC_WORD_NEVER, EC_WORD_LOSE, EC_WORD_EXCL}, .speechWin = {EC_WORD_FUFUFU, EC_WORD_ELLIPSIS, EC_WORD_WE_RE, EC_WORD_TOO_STRONG, EC_WORD_TO, EC_WORD_LOSE}, .speechLose = {EC_WORD_WHAT, EC_WORD_HUH_QUES, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_JOKING, EC_WORD_QUES}, .speechAfter = {EC_WORD_WAAAH, EC_WORD_WAAAH, EC_WORD_OH, EC_WORD_BIG, EC_WORD_SISTER, EC_WORD_EXCL}, .mons = { { .species = SPECIES_FURRET, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_DIG, MOVE_AMNESIA, MOVE_DEFENSE_CURL, MOVE_FOLLOW_ME}, .hpEV = 255, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x80, // MALE ADAMANT .nickname = _("FURRET"), .friendship = 255 }, { .species = SPECIES_AZUMARILL, .heldItem = ITEM_WHITE_HERB, .moves = {MOVE_DIVE, MOVE_LIGHT_SCREEN, MOVE_TAIL_WHIP, MOVE_DEFENSE_CURL}, .hpEV = 155, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x14, // FEMALE CALM .nickname = _("AZUMARILL"), .friendship = 255 }, { .species = SPECIES_KINGLER, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_DIVE, MOVE_HARDEN, MOVE_LEER, MOVE_AMNESIA}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x91, // MALE CALM .nickname = _("KINGLER"), .friendship = 255 }, { .species = SPECIES_CLOYSTER, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_DIVE, MOVE_WITHDRAW, MOVE_PROTECT, MOVE_SUPERSONIC}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x14, // FEMALE CALM .nickname = _("CLOYSTER"), .friendship = 255 }, { .species = SPECIES_QUAGSIRE, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_DIG, MOVE_YAWN, MOVE_AMNESIA, MOVE_SAFEGUARD}, .hpEV = 200, .attackEV = 0, .defenseEV = 110, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x94, // MALE CAREFUL .nickname = _("QUAGSIRE"), .friendship = 255 }, { .species = SPECIES_KABUTOPS, .heldItem = ITEM_PECHA_BERRY, .moves = {MOVE_DIG, MOVE_SAND_ATTACK, MOVE_ENDURE, MOVE_CONFUSE_RAY}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x30, // MALE CAREFUL .nickname = _("KABUTOPS"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x00015d7c }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_8 = { .id = 21, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_MENTAL_HERB, .trainers = { { .name = _("GEB&MEGAN"), .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 7, .speechBefore = {EC_WORD_YOU_RE, EC_WORD_OUR, EC_WORD_OPPONENT, EC_WORD_QUES, EC_WORD_PUSHOVER, EC_WORD_HAHAHA}, .speechWin = {EC_WORD_HAHAHA, EC_WORD_SORRY, EC_WORD_MY, EC_WORD_FRIEND, EC_WORD_TOUGH, EC_WORD_LOSS}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_SERIOUS, EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_FRIEND, EC_WORD_QUES}, .speechAfter = {EC_WORD_WON_T, EC_WORD_YOU, EC_WORD_GET, EC_WORD_LOST, EC_WORD_PLEASE, EC_WORD_QUES}, .mons = { { .species = SPECIES_POLITOED, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_SURF, MOVE_HYPNOSIS, MOVE_PERISH_SONG, MOVE_SWAGGER}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x8C, // MALE MODEST .nickname = _("POLITOED"), .friendship = 255 }, { .species = SPECIES_GYARADOS, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_HYPER_BEAM, MOVE_DRAGON_DANCE, MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT}, .hpEV = 0, .attackEV = 255, .defenseEV = 155, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x96, // MALE HARDY .nickname = _("GYARADOS"), .friendship = 255 }, { .species = SPECIES_LAPRAS, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_SURF, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_ICE_BEAM}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0F, // FEMALE MODEST .nickname = _("LAPRAS"), .friendship = 255 }, { .species = SPECIES_NIDOQUEEN, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_SUPERPOWER, MOVE_ROCK_SLIDE}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x00, // FEMALE HARDY .nickname = _("NIDOQUEEN"), .friendship = 255 }, { .species = SPECIES_JYNX, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_WATER_PULSE, MOVE_REFLECT, MOVE_LIGHT_SCREEN, MOVE_PSYCHIC}, .hpEV = 255, .attackEV = 0, .defenseEV = 155, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x00, // FEMALE HARDY .nickname = _("JYNX"), .friendship = 255 }, { .species = SPECIES_GIRAFARIG, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_LIGHT_SCREEN, MOVE_CRUNCH, MOVE_PSYCHIC, MOVE_REFLECT}, .hpEV = 210, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x8C, // MALE MODEST .nickname = _("GIRAFARIG"), .friendship = 255 }, } }, { .name = _("GEB&MEGAN"), .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 7, .speechBefore = {EC_WORD_YOU_RE, EC_WORD_OUR, EC_WORD_FOE, EC_WORD_QUES, EC_WORD_GIGGLE, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SORRY, 0xFFFF}, .speechLose = {EC_WORD_MY, EC_WORD_WORD, EC_WORD_THIS, EC_WORD_IS, EC_WORD_JUST, EC_WORD_INCREDIBLE}, .speechAfter = {EC_WORD_WE, EC_WORD_NEED, EC_WORD_TO, EC_WORD_TRAIN, EC_WORD_SOME, EC_WORD_MORE}, .mons = { { .species = SPECIES_MAROWAK, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_AERIAL_ACE, MOVE_PROTECT}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x94, // MALE CAREFUL .nickname = _("MAROWAK"), .friendship = 255 }, { .species = SPECIES_URSARING, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_AERIAL_ACE}, .hpEV = 0, .attackEV = 255, .defenseEV = 155, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("URSARING"), .friendship = 255 }, { .species = SPECIES_SLOWKING, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_SURF, MOVE_PSYCHIC, MOVE_ICE_BEAM, MOVE_SHADOW_BALL}, .hpEV = 0, .attackEV = 110, .defenseEV = 0, .speedEV = 0, .spAttackEV = 200, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x11, // FEMALE QUIET .nickname = _("SLOWKING"), .friendship = 255 }, { .species = SPECIES_ALAKAZAM, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_PSYCHIC, MOVE_PROTECT, MOVE_LIGHT_SCREEN, MOVE_REFLECT}, .hpEV = 110, .attackEV = 0, .defenseEV = 200, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x41, // MALE MODEST .nickname = _("ALAKAZAM"), .friendship = 255 }, { .species = SPECIES_NIDOKING, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_SURF, MOVE_MEGAHORN, MOVE_THUNDERBOLT, MOVE_ICE_BEAM}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x00, // MALE HARDY .nickname = _("NIDOKING"), .friendship = 255 }, { .species = SPECIES_RHYDON, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_EARTHQUAKE, MOVE_PROTECT, MOVE_MEGAHORN, MOVE_ROCK_SLIDE}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x93, // MALE SASSY .nickname = _("RHYDON"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x000160f4 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_Unused1 = { .id = 22, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_ZINC, .trainers = { { .name = _("LISA&LEAH"), .facilityClass = FACILITY_CLASS_TWINS, .textColor = 1, .speechBefore = {EC_WORD_ABSOLUTELY, EC_WORD_WE_RE, EC_WORD_GOING, EC_WORD_TO, EC_WORD_WIN, EC_WORD_EXCL}, .speechWin = {EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF}, .speechAfter = {EC_WORD_EXCUSE_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_ALL, EC_WORD_TOO_STRONG, 0xFFFF}, .mons = { { .species = SPECIES_POLIWAG, .heldItem = ITEM_CHERI_BERRY, .moves = {MOVE_SURF, MOVE_PROTECT, MOVE_TOXIC, MOVE_DOUBLE_TEAM}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x87, // MALE TIMID .nickname = _("POLIWAG"), .friendship = 255 }, { .species = SPECIES_SQUIRTLE, .heldItem = ITEM_MYSTIC_WATER, .moves = {MOVE_WATER_PULSE, MOVE_PROTECT, MOVE_TOXIC, MOVE_MIRROR_COAT}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x2D, // MALE CALM .nickname = _("SQUIRTLE"), .friendship = 255 }, { .species = SPECIES_CHINCHOU, .heldItem = ITEM_MAGNET, .moves = {MOVE_SURF, MOVE_THUNDER_WAVE, MOVE_CONFUSE_RAY, MOVE_THUNDERBOLT}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("CHINCHOU"), .friendship = 255 }, { .species = SPECIES_NIDORAN_F, .heldItem = ITEM_POISON_BARB, .moves = {MOVE_WATER_PULSE, MOVE_SLUDGE_BOMB, MOVE_CRUNCH, MOVE_DIG}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x00, // FEMALE HARDY .nickname = _("NIDORAN♀"), .friendship = 255 }, { .species = SPECIES_CLEFAIRY, .heldItem = ITEM_WHITE_HERB, .moves = {MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_SING, MOVE_MINIMIZE}, .hpEV = 110, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("CLEFAIRY"), .friendship = 255 }, { .species = SPECIES_HORSEA, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_SURF, MOVE_SMOKESCREEN, MOVE_ATTRACT, MOVE_DRAGON_RAGE}, .hpEV = 110, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x2D, // MALE CALM .nickname = _("HORSEA"), .friendship = 255 }, } }, { .name = _("LISA&LEAH"), .facilityClass = FACILITY_CLASS_TWINS, .textColor = 1, .speechBefore = {EC_WORD_CAN, EC_WORD_WE, EC_WORD_WIN, EC_WORD_QUES, EC_WORD_IT_S, EC_WORD_EXCITING}, .speechWin = {EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_HAPPY}, .speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF}, .speechAfter = {EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_NOT, EC_MOVE2(BEAT_UP), EC_WORD_ON, EC_WORD_CHILDREN}, .mons = { { .species = SPECIES_WOOPER, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_YAWN, MOVE_FLASH}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x93, // MALE SASSY .nickname = _("WOOPER"), .friendship = 255 }, { .species = SPECIES_PSYDUCK, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_SURF, MOVE_CROSS_CHOP, MOVE_HYPNOSIS, MOVE_DISABLE}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 1, .personality = 0x96, // MALE HARDY .nickname = _("PSYDUCK"), .friendship = 255 }, { .species = SPECIES_SNUBBULL, .heldItem = ITEM_PECHA_BERRY, .moves = {MOVE_WATER_PULSE, MOVE_THUNDER_WAVE, MOVE_CRUNCH, MOVE_SHADOW_BALL}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x00, // FEMALE HARDY .nickname = _("SNUBBULL"), .friendship = 255 }, { .species = SPECIES_JIGGLYPUFF, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_WATER_PULSE, MOVE_THUNDER_WAVE, MOVE_SING, MOVE_DISABLE}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("JIGGLYPUFF"), .friendship = 255 }, { .species = SPECIES_NIDORAN_M, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_WATER_PULSE, MOVE_SLUDGE_BOMB, MOVE_HORN_DRILL, MOVE_DIG}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x00, // MALE HARDY .nickname = _("NIDORAN♂"), .friendship = 255 }, { .species = SPECIES_TOTODILE, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_SURF, MOVE_PROTECT, MOVE_TOXIC, MOVE_DOUBLE_TEAM}, .hpEV = 110, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x2D, // MALE CALM .nickname = _("TOTODILE"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(15), }, .checksum = 0x000197d4 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_7 = { .id = 23, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_KNOCKOUT, .prize = TTPRIZE_PROTEIN, .trainers = { { .name = _("PRISCILLA"), .facilityClass = FACILITY_CLASS_TUBER, .textColor = 1, .speechBefore = {EC_WORD_I_AM, EC_WORD_A_LITTLE, EC_WORD_POKEMON, EC_WORD_GIRL, EC_WORD_HERE_I_COME, EC_WORD_EXCL}, .speechWin = {EC_WORD_WAAAH, EC_WORD_EXCL, EC_WORD_DID, EC_WORD_I, EC_WORD_WIN, EC_WORD_QUES}, .speechLose = {EC_WORD_OH_DEAR, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_COULDN_T, EC_WORD_WIN, EC_WORD_ELLIPSIS}, .speechAfter = {EC_WORD_YOU_RE, EC_WORD_A, EC_WORD_NICE, EC_WORD_TRAINER, EC_WORD_THANK_YOU, EC_WORD_EXCL}, .mons = { { .species = SPECIES_GOLDEEN, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_WATER_PULSE, MOVE_MEGAHORN, MOVE_SUPERSONIC, MOVE_ICE_BEAM}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x96, // MALE HARDY .nickname = _("GOLDEEN"), .friendship = 0 }, { .species = SPECIES_SEAKING, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_SURF, MOVE_MEGAHORN, MOVE_HORN_DRILL, MOVE_PROTECT}, .hpEV = 100, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x00, // FEMALE HARDY .nickname = _("SEAKING"), .friendship = 0 }, { .species = SPECIES_LANTURN, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_SURF, MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_ICE_BEAM}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 210, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x8C, // MALE MODEST .nickname = _("LANTURN"), .friendship = 0 }, { .species = SPECIES_LANTURN, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_HYDRO_PUMP, MOVE_THUNDER, MOVE_ICE_BEAM, MOVE_RAIN_DANCE}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 210, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("LANTURN"), .friendship = 0 }, { .species = SPECIES_GOLDEEN, .heldItem = ITEM_APICOT_BERRY, .moves = {MOVE_WATER_PULSE, MOVE_DOUBLE_EDGE, MOVE_TOXIC, MOVE_PSYBEAM}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x00, // FEMALE HARDY .nickname = _("GOLDEEN"), .friendship = 0 }, { .species = SPECIES_SEAKING, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_SURF, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PSYBEAM}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x96, // MALE HARDY .nickname = _("SEAKING"), .friendship = 0 }, } }, { .name = _("CHARLOTTE"), .facilityClass = FACILITY_CLASS_LADY, .textColor = 1, .speechBefore = {EC_WORD_HELLO, EC_WORD_THERE, EC_WORD_I_AM, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_LADY}, .speechWin = {EC_WORD_OH, EC_WORD_MY, EC_WORD_MY, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_SORRY}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_BETTER, EC_WORD_THAN, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_LADY}, .speechAfter = {EC_WORD_HOHOHO, EC_WORD_THANK_YOU, EC_WORD_FOR, EC_WORD_AN, EC_WORD_AMUSING, EC_WORD_BATTLE}, .mons = { { .species = SPECIES_OCTILLERY, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_OCTAZOOKA, MOVE_ICE_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER}, .hpEV = 55, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("OCTILLERY"), .friendship = 255 }, { .species = SPECIES_QWILFISH, .heldItem = ITEM_PERSIM_BERRY, .moves = {MOVE_SURF, MOVE_TOXIC, MOVE_REVENGE, MOVE_DOUBLE_TEAM}, .hpEV = 200, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 210, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x14, // FEMALE CALM .nickname = _("QWILFISH"), .friendship = 255 }, { .species = SPECIES_REMORAID, .heldItem = ITEM_PECHA_BERRY, .moves = {MOVE_SURF, MOVE_PSYCHIC, MOVE_ICE_BEAM, MOVE_THUNDER_WAVE}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x96, // MALE HARDY .nickname = _("REMORAID"), .friendship = 255 }, { .species = SPECIES_REMORAID, .heldItem = ITEM_WHITE_HERB, .moves = {MOVE_WATER_PULSE, MOVE_BLIZZARD, MOVE_FIRE_BLAST, MOVE_PROTECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x00, // FEMALE HARDY .nickname = _("REMORAID"), .friendship = 255 }, { .species = SPECIES_OCTILLERY, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_OCTAZOOKA, MOVE_SLUDGE_BOMB, MOVE_THUNDER_WAVE, MOVE_HYPER_BEAM}, .hpEV = 155, .attackEV = 100, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x93, // MALE SASSY .nickname = _("OCTILLERY"), .friendship = 255 }, { .species = SPECIES_QWILFISH, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_HYDRO_PUMP, MOVE_SLUDGE_BOMB, MOVE_SHADOW_BALL, MOVE_DESTINY_BOND}, .hpEV = 100, .attackEV = 100, .defenseEV = 0, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 210, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x96, // MALE HARDY .nickname = _("QWILFISH"), .friendship = 255 }, } }, { .name = _("SHANIA"), .facilityClass = FACILITY_CLASS_SWIMMER_F, .textColor = 1, .speechBefore = {EC_WORD_A, EC_WORD_POKEMON, EC_WORD_HEROINE, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM}, .speechWin = {EC_WORD_AHAHA, EC_WORD_NO, EC_WORD_WAY, EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_SERIOUSLY}, .speechLose = {EC_WORD_WHY, EC_WORD_QUES_EXCL, EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_NOT, EC_WORD_LIE}, .speechAfter = {EC_WORD_NICE, EC_WORD_BATTLE, EC_WORD_THANKS, EC_WORD_FOR, EC_WORD_ENTERTAINING, EC_WORD_ME}, .mons = { { .species = SPECIES_MANTINE, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_AERIAL_ACE, MOVE_ROCK_SLIDE}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("MANTINE"), .friendship = 255 }, { .species = SPECIES_MAGIKARP, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_SPLASH, MOVE_TACKLE, MOVE_NONE, MOVE_NONE}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0D, // FEMALE JOLLY .nickname = _("MAGIKARP"), .friendship = 255 }, { .species = SPECIES_MANTINE, .heldItem = ITEM_MENTAL_HERB, .moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_CONFUSE_RAY, MOVE_ATTRACT}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("MANTINE"), .friendship = 255 }, { .species = SPECIES_GYARADOS, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_HYPER_BEAM, MOVE_THUNDER_WAVE, MOVE_EARTHQUAKE, MOVE_PROTECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x03, // FEMALE ADAMANT .nickname = _("GYARADOS"), .friendship = 255 }, { .species = SPECIES_MAGIKARP, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_FLAIL, MOVE_TACKLE, MOVE_NONE, MOVE_NONE}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x94, // MALE CAREFUL .nickname = _("MAGIKARP"), .friendship = 255 }, { .species = SPECIES_GYARADOS, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_DOUBLE_EDGE, MOVE_THUNDER_WAVE, MOVE_EARTHQUAKE, MOVE_DRAGON_DANCE}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("GYARADOS"), .friendship = 255 }, } }, }, .checksum = 0x0001521d }; static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_4 = { .id = 24, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_KNOCKOUT, .prize = TTPRIZE_DRAGON_SCALE, .trainers = { { .name = _("BRENNAN"), .facilityClass = FACILITY_CLASS_SAILOR, .textColor = 1, .speechBefore = {EC_WORD_TAKE, EC_WORD_THINGS, EC_WORD_EASY, EC_WORD_ELLIPSIS, EC_WORD_THAT_S, EC_WORD_IMPORTANT}, .speechWin = {EC_WORD_YOU, EC_WORD_LOSE, EC_WORD_IF, EC_WORD_YOU, EC_WORD_GIVE_UP, EC_WORD_EXCL}, .speechLose = {EC_WORD_OOPS, EC_WORD_YOU, EC_WORD_GOT, EC_WORD_AN, EC_WORD_EASY, EC_WORD_WIN}, .speechAfter = {EC_WORD_I, EC_WORD_DON_T, EC_MOVE(GRUDGE), EC_WORD_YOU, EC_WORD_BUT, EC_WORD_ELLIPSIS}, .mons = { { .species = SPECIES_LAPRAS, .heldItem = ITEM_CHESTO_BERRY, .moves = {MOVE_HYDRO_PUMP, MOVE_PSYCHIC, MOVE_ATTRACT, MOVE_REST}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 255, .otId = 15 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x0F, // FEMALE MODEST .nickname = _("LAPRAS"), .friendship = 255 }, { .species = SPECIES_KINGDRA, .heldItem = ITEM_CHESTO_BERRY, .moves = {MOVE_HYDRO_PUMP, MOVE_BLIZZARD, MOVE_DRAGON_BREATH, MOVE_REST}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x8C, // MALE MODEST .nickname = _("KINGDRA"), .friendship = 255 }, { .species = SPECIES_MACHAMP, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_HYPER_BEAM}, .hpEV = 0, .attackEV = 255, .defenseEV = 130, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 125, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x4E, // MALE ADAMANT .nickname = _("MACHAMP"), .friendship = 255 }, { .species = SPECIES_CHANSEY, .heldItem = ITEM_ORAN_BERRY, .moves = {MOVE_WATER_PULSE, MOVE_SOFT_BOILED, MOVE_MINIMIZE, MOVE_THUNDER_WAVE}, .hpEV = 255, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x05, // FEMALE BOLD .nickname = _("CHANSEY"), .friendship = 255 }, { .species = SPECIES_TAUROS, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_SWAGGER}, .hpEV = 110, .attackEV = 100, .defenseEV = 100, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x03, // MALE ADAMANT .nickname = _("TAUROS"), .friendship = 255 }, { .species = SPECIES_SNORLAX, .heldItem = ITEM_ORAN_BERRY, .moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_DOUBLE_TEAM, MOVE_REST}, .hpEV = 0, .attackEV = 255, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x21, // MALE IMPISH .nickname = _("SNORLAX"), .friendship = 255 }, } }, { .name = _("KADEN"), .facilityClass = FACILITY_CLASS_FISHERMAN, .textColor = 1, .speechBefore = {EC_WORD_MY, EC_WORD_FISHING, EC_WORD_FASHION, EC_WORD_APPEAL, EC_WORD_IS, EC_WORD_FANTASTIC}, .speechWin = {EC_WORD_MY, EC_WORD_FANTASTIC, EC_WORD_FASHION, EC_WORD_APPEAL, EC_WORD_WINS, EC_WORD_OUT}, .speechLose = {EC_WORD_UH_OH, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_SEE, EC_WORD_I, EC_WORD_LOST}, .speechAfter = {EC_WORD_FASHION, EC_WORD_APPEAL, EC_WORD_WON_T, EC_WORD_GET, EC_WORD_ME, EC_WORD_WINS}, .mons = { { .species = SPECIES_CHINCHOU, .heldItem = ITEM_MAGNET, .moves = {MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_CONFUSE_RAY, MOVE_PROTECT}, .hpEV = 100, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x00, // FEMALE HARDY .nickname = _("CHINCHOU"), .friendship = 255 }, { .species = SPECIES_DRATINI, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_WATER_PULSE, MOVE_THUNDER_WAVE, MOVE_DRAGON_BREATH, MOVE_PROTECT}, .hpEV = 110, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x00, // FEMALE HARDY .nickname = _("DRATINI"), .friendship = 255 }, { .species = SPECIES_SLOWPOKE, .heldItem = ITEM_PECHA_BERRY, .moves = {MOVE_WATER_PULSE, MOVE_YAWN, MOVE_DISABLE, MOVE_PROTECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x96, // MALE HARDY .nickname = _("SLOWPOKE"), .friendship = 255 }, { .species = SPECIES_MAGIKARP, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_SPLASH, MOVE_FLAIL, MOVE_TACKLE, MOVE_NONE}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 255, .otId = 23 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x17, // FEMALE CAREFUL .nickname = _("MAGIKARP"), .friendship = 255 }, { .species = SPECIES_SEAKING, .heldItem = ITEM_CHERI_BERRY, .moves = {MOVE_HORN_DRILL, MOVE_MEGAHORN, MOVE_SUPERSONIC, MOVE_AGILITY}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 23 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x17, // FEMALE CAREFUL .nickname = _("SEAKING"), .friendship = 255 }, { .species = SPECIES_TENTACRUEL, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_MIRROR_COAT, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_TOXIC}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x96, // MALE HARDY .nickname = _("TENTACRUEL"), .friendship = 255 }, } }, { .name = _("EMANUEL"), .facilityClass = FACILITY_CLASS_GENTLEMAN, .textColor = 1, .speechBefore = {EC_WORD_HMM, EC_WORD_QUES, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_SKILLED, EC_WORD_QUES}, .speechWin = {EC_WORD_I, EC_WORD_SEE, EC_WORD_I, EC_WORD_WASN_T, EC_WORD_RIGHT, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_YOU, EC_WORD_TRULY, EC_WORD_ARE, EC_WORD_A, EC_WORD_MASTER, EC_WORD_TRAINER}, .speechAfter = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_THAT, EC_WORD_I_WAS, EC_WORD_YOUR, EC_WORD_OPPONENT}, .mons = { { .species = SPECIES_VAPOREON, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_ATTRACT, MOVE_BITE}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x14, // FEMALE CALM .nickname = _("VAPOREON"), .friendship = 255 }, { .species = SPECIES_ESPEON, .heldItem = ITEM_CHESTO_BERRY, .moves = {MOVE_PSYCHIC, MOVE_BITE, MOVE_REFLECT, MOVE_REST}, .hpEV = 110, .attackEV = 0, .defenseEV = 200, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("ESPEON"), .friendship = 255 }, { .species = SPECIES_BLISSEY, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_WATER_PULSE, MOVE_MINIMIZE, MOVE_THUNDER_WAVE, MOVE_PROTECT}, .hpEV = 255, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x05, // FEMALE BOLD .nickname = _("BLISSEY"), .friendship = 255 }, { .species = SPECIES_STARMIE, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_PSYCHIC}, .hpEV = 255, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 155, .otId = 20 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x14, // GENDERLESS CALM .nickname = _("STARMIE"), .friendship = 255 }, { .species = SPECIES_PERSIAN, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_SLASH, MOVE_SWAGGER, MOVE_PSYCH_UP, MOVE_FAKE_OUT}, .hpEV = 0, .attackEV = 255, .defenseEV = 130, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 125, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0D, // FEMALE JOLLY .nickname = _("PERSIAN"), .friendship = 255 }, { .species = SPECIES_AZUMARILL, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_SURF, MOVE_ENCORE, MOVE_ATTRACT, MOVE_DIG}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x00, // FEMALE HARDY .nickname = _("AZUMARILL"), .friendship = 255 }, } }, }, .checksum = 0x0001554b }; static const struct TrainerTowerFloor sTrainerTowerFloor_Single_3 = { .id = 25, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_METAL_COAT, .trainers = { { .name = _("JARRETT"), .facilityClass = FACILITY_CLASS_JUGGLER, .textColor = 2, .speechBefore = {EC_WORD_LET_S, EC_WORD_HAVE, EC_WORD_AN, EC_MOVE2(EXPLOSION), EC_WORD_PARTY, EC_WORD_EXCL}, .speechWin = {EC_WORD_CONGRATS, EC_WORD_FOR, EC_WORD_YOUR, EC_WORD_LOSS, EC_WORD_PARTY, EC_WORD_KID}, .speechLose = {EC_WORD_NICE, EC_MOVE(SELF_DESTRUCT), EC_WORD_THERE, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_PERFECT}, .speechAfter = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_PARTY, EC_WORD_SOME, EC_WORD_MORE, EC_WORD_QUES}, .mons = { { .species = SPECIES_ELECTRODE, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_EXPLOSION, MOVE_LIGHT_SCREEN, MOVE_SCREECH, MOVE_THUNDERBOLT}, .hpEV = 10, .attackEV = 150, .defenseEV = 100, .speedEV = 150, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x0D, // GENDERLESS JOLLY .nickname = _("ELECTRODE"), .friendship = 255 }, { .species = SPECIES_VOLTORB, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_EXPLOSION, MOVE_FLASH, MOVE_DOUBLE_TEAM, MOVE_THUNDER}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x0D, // GENDERLESS JOLLY .nickname = _("VOLTORB"), .friendship = 255 }, { .species = SPECIES_WEEZING, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_EXPLOSION, MOVE_SLUDGE_BOMB, MOVE_DESTINY_BOND, MOVE_THUNDERBOLT}, .hpEV = 0, .attackEV = 200, .defenseEV = 155, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("WEEZING"), .friendship = 255 }, { .species = SPECIES_GOLEM, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_EXPLOSION, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB}, .hpEV = 0, .attackEV = 255, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 150, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x7F, // MALE BRAVE .nickname = _("GOLEM"), .friendship = 255 }, { .species = SPECIES_EXEGGCUTE, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_EXPLOSION, MOVE_STUN_SPORE, MOVE_HYPNOSIS, MOVE_GIGA_DRAIN}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("EXEGGCUTE"), .friendship = 255 }, { .species = SPECIES_FORRETRESS, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_EXPLOSION, MOVE_GIGA_DRAIN, MOVE_DIG, MOVE_PROTECT}, .hpEV = 0, .attackEV = 100, .defenseEV = 155, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x84, // MALE RELAXED .nickname = _("FORRETRESS"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x00015b6a }; static const struct TrainerTowerFloor sTrainerTowerFloor_Mixed_3 = { .id = 26, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_DRAGON_SCALE, .trainers = { { .name = _("OWEN"), .facilityClass = FACILITY_CLASS_SUPER_NERD, .textColor = 2, .speechBefore = {EC_WORD_HERE_IT_IS, EC_MOVE2(THUNDER_WAVE), EC_WORD_DON_T, EC_MOVE2(WRAP), EC_WORD_ME, EC_WORD_EXCL}, .speechWin = {EC_WORD_ACCEPT, EC_WORD_MY, EC_MOVE2(PRESENT), EC_WORD_OF, EC_MOVE2(THUNDER_WAVE), EC_WORD_EXCL}, .speechLose = {EC_MOVE2(WRAP), EC_MOVE(BIND), EC_WORD_ELECTRIC, EC_MOVE2(WHIRLWIND), EC_WORD_SPIRALING, EC_WORD_AROUND}, .speechAfter = {EC_MOVE2(WHIRLWIND), EC_WORD_SPIRALING, 0xFFFF, 0xFFFF, EC_WORD_SPIRALING, EC_MOVE2(WHIRLWIND)}, .mons = { { .species = SPECIES_MAGNETON, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_PROTECT, MOVE_ZAP_CANNON, MOVE_TOXIC, MOVE_SUPERSONIC}, .hpEV = 0, .attackEV = 0, .defenseEV = 125, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 130, .otId = 10 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x0A, // GENDERLESS TIMID .nickname = _("MAGNETON"), .friendship = 255 }, { .species = SPECIES_PIKACHU, .heldItem = ITEM_LIGHT_BALL, .moves = {MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_DOUBLE_TEAM}, .hpEV = 0, .attackEV = 0, .defenseEV = 150, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 105, .otId = 15 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("PIKACHU"), .friendship = 255 }, { .species = SPECIES_JOLTEON, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_DOUBLE_TEAM, MOVE_TOXIC}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x37, // MALE BOLD .nickname = _("JOLTEON"), .friendship = 255 }, { .species = SPECIES_BLISSEY, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_THUNDER_WAVE, MOVE_BLIZZARD, MOVE_WATER_PULSE, MOVE_REST}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x05, // FEMALE BOLD .nickname = _("BLISSEY"), .friendship = 255 }, { .species = SPECIES_PORYGON2, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_THUNDER_WAVE, MOVE_ZAP_CANNON, MOVE_PSYCHIC, MOVE_RECOVER}, .hpEV = 0, .attackEV = 0, .defenseEV = 125, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 130, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x05, // GENDERLESS BOLD .nickname = _("PORYGON2"), .friendship = 255 }, { .species = SPECIES_PORYGON, .heldItem = ITEM_LAX_INCENSE, .moves = {MOVE_THUNDER_WAVE, MOVE_ZAP_CANNON, MOVE_DOUBLE_TEAM, MOVE_PROTECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 5 | (0 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x05, // GENDERLESS BOLD .nickname = _("PORYGON"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x000160ec }; static const struct TrainerTowerFloor sTrainerTowerFloor_Mixed_2 = { .id = 27, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_SINGLE, .prize = TTPRIZE_PROTEIN, .trainers = { { .name = _("LORENZO"), .facilityClass = FACILITY_CLASS_PSYCHIC_M, .textColor = 1, .speechBefore = {EC_WORD_THIS, EC_WORD_POWER, EC_WORD_IS, EC_WORD_NOW, EC_WORD_COMPLETE, EC_WORD_EXCL}, .speechWin = {EC_WORD_NO, EC_WORD_KEEN_EYE, EC_WORD_CAN, EC_WORD_STOP, EC_WORD_MY, EC_WORD_POWER}, .speechLose = {EC_WORD_HERE_IT_IS, EC_WORD_EXCL, EC_MOVE(KINESIS), EC_WORD_EXCL, EC_WORD_ELLIPSIS, EC_WORD_WHAT}, .speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_THE, EC_MOVE(KINESIS), EC_WORD_HALL_OF_FAME}, .mons = { { .species = SPECIES_MR_MIME, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN, MOVE_REFLECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("MR. MIME"), .friendship = 255 }, { .species = SPECIES_HYPNO, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_THUNDER_PUNCH, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_PSYCHIC}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 0, .spAttackEV = 200, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x8C, // MALE MODEST .nickname = _("HYPNO"), .friendship = 255 }, { .species = SPECIES_ALAKAZAM, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDER_PUNCH, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_PSYCHIC}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 150, .spAttackEV = 155, .spDefenseEV = 50, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("ALAKAZAM"), .friendship = 255 }, { .species = SPECIES_GENGAR, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_THUNDERBOLT, MOVE_SHADOW_BALL, MOVE_HYPNOSIS, MOVE_TOXIC}, .hpEV = 0, .attackEV = 200, .defenseEV = 0, .speedEV = 100, .spAttackEV = 55, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x88, // MALE HASTY .nickname = _("GENGAR"), .friendship = 255 }, { .species = SPECIES_GIRAFARIG, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_CRUNCH, MOVE_BODY_SLAM, MOVE_REST}, .hpEV = 0, .attackEV = 100, .defenseEV = 100, .speedEV = 155, .spAttackEV = 0, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 1, .personality = 0x03, // FEMALE ADAMANT .nickname = _("GIRAFARIG"), .friendship = 255 }, { .species = SPECIES_STARMIE, .heldItem = ITEM_APICOT_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_SURF, MOVE_RECOVER, MOVE_ICE_BEAM}, .hpEV = 0, .attackEV = 0, .defenseEV = 55, .speedEV = 250, .spAttackEV = 150, .spDefenseEV = 55, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x0A, // GENDERLESS TIMID .nickname = _("STARMIE"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), DUMMY_TOWER_TEAM(0), }, .checksum = 0x0001624b }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_Unused2 = { .id = 28, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_SCOPE_LENS, .trainers = { { .name = _("NIA & CARL"), .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 4, .speechBefore = {EC_WORD_HERE_GOES, EC_WORD_MY, EC_WORD_DIGITAL, EC_WORD_ROMANTIC, EC_WORD_HERO, EC_WORD_STRATEGY}, .speechWin = {EC_WORD_THAT_S, EC_WORD_THE, EC_WORD_DIGITAL, EC_WORD_HYPER, EC_WORD_MODE, EC_WORD_POWER}, .speechLose = {EC_WORD_MY, EC_WORD_PERFECT, EC_WORD_STRATEGY, EC_WORD_WAS, EC_MOVE2(BEAT_UP), EC_WORD_QUES}, .speechAfter = {EC_WORD_MY, EC_WORD_INVINCIBLE, EC_WORD_STRATEGY, EC_WORD_WAS, EC_WORD_DESTROYED, EC_WORD_ELLIPSIS}, .mons = { { .species = SPECIES_MUK, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_SHADOW_BALL, MOVE_BODY_SLAM}, .hpEV = 0, .attackEV = 255, .defenseEV = 155, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x07, // FEMALE RELAXED .nickname = _("MUK"), .friendship = 255 }, { .species = SPECIES_GENGAR, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_CONFUSE_RAY, MOVE_PSYCHIC, MOVE_EXPLOSION}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 155, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x15, // FEMALE GENTLE .nickname = _("GENGAR"), .friendship = 255 }, { .species = SPECIES_ALAKAZAM, .heldItem = ITEM_GANLON_BERRY, .moves = {MOVE_THUNDER_PUNCH, MOVE_PSYCHIC, MOVE_RECOVER, MOVE_REFLECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("ALAKAZAM"), .friendship = 255 }, { .species = SPECIES_JOLTEON, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_THUNDERBOLT, MOVE_FLAIL, MOVE_THUNDER_WAVE, MOVE_DOUBLE_TEAM}, .hpEV = 0, .attackEV = 50, .defenseEV = 100, .speedEV = 160, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x05, // FEMALE BOLD .nickname = _("JOLTEON"), .friendship = 255 }, { .species = SPECIES_ELECTRODE, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_EXPLOSION, MOVE_MIRROR_COAT, MOVE_LIGHT_SCREEN}, .hpEV = 0, .attackEV = 55, .defenseEV = 0, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x14, // GENDERLESS CALM .nickname = _("ELECTRODE"), .friendship = 255 }, { .species = SPECIES_RAICHU, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_COUNTER, MOVE_REVERSAL, MOVE_LIGHT_SCREEN}, .hpEV = 0, .attackEV = 55, .defenseEV = 255, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x02, // FEMALE BRAVE .nickname = _("RAICHU"), .friendship = 255 }, } }, { .name = _("NIA & CARL"), .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 4, .speechBefore = {EC_WORD_MASTER, EC_WORD_COMPLETE, EC_WORD_FASHION, EC_WORD_SYSTEM, EC_WORD_START, EC_WORD_EXCL}, .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_WORD_THE, EC_WORD_POWER, EC_WORD_OF, EC_WORD_OUR, EC_WORD_SYSTEM}, .speechLose = {EC_WORD_OKAY, EC_WORD_EXCL, EC_MOVE(THUNDERBOLT), EC_WORD_RUN_AWAY, EC_WORD_SYSTEM, EC_WORD_START}, .speechAfter = {EC_WORD_GO, EC_WORD_ON, EC_WORD_PLEASE, EC_WORD_EXCL, EC_WORD_TCH, EC_WORD_ELLIPSIS}, .mons = { { .species = SPECIES_KANGASKHAN, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_SHADOW_BALL, MOVE_REVERSAL, MOVE_ENDURE, MOVE_FAKE_OUT}, .hpEV = 0, .attackEV = 255, .defenseEV = 105, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 150, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x03, // FEMALE ADAMANT .nickname = _("KANGASKHAN"), .friendship = 255 }, { .species = SPECIES_TAUROS, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_DOUBLE_EDGE, MOVE_ROCK_TOMB, MOVE_SURF, MOVE_REST}, .hpEV = 0, .attackEV = 255, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x03, // MALE ADAMANT .nickname = _("TAUROS"), .friendship = 255 }, { .species = SPECIES_MILTANK, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_BODY_SLAM, MOVE_SHADOW_BALL, MOVE_MILK_DRINK, MOVE_ROCK_TOMB}, .hpEV = 0, .attackEV = 155, .defenseEV = 50, .speedEV = 250, .spAttackEV = 0, .spDefenseEV = 55, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x03, // FEMALE ADAMANT .nickname = _("MILTANK"), .friendship = 255 }, { .species = SPECIES_RHYDON, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDERBOLT, MOVE_MEGAHORN, MOVE_HORN_DRILL, MOVE_ROCK_TOMB}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x80, // MALE ADAMANT .nickname = _("RHYDON"), .friendship = 255 }, { .species = SPECIES_DRAGONITE, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_BLIZZARD, MOVE_SURF, MOVE_OUTRAGE, MOVE_FLAMETHROWER}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 0, .personality = 0x91, // MALE CALM .nickname = _("DRAGONITE"), .friendship = 255 }, { .species = SPECIES_LAPRAS, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_THUNDERBOLT, MOVE_BLIZZARD, MOVE_SURF, MOVE_HORN_DRILL}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 31, .attackIV = 31, .defenseIV = 31, .speedIV = 31, .spAttackIV = 31, .spDefenseIV = 31, .abilityNum = 1, .personality = 0x91, // MALE CALM .nickname = _("LAPRAS"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x00016360 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_7 = { .id = 29, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_CARBOS, .trainers = { { .name = _("AXE & REN"), .facilityClass = FACILITY_CLASS_SIS_AND_BRO, .textColor = 2, .speechBefore = {EC_WORD_IT_S, EC_WORD_GOING, EC_WORD_TO, EC_WORD_GET, EC_WORD_AWFULLY, EC_WORD_COLD}, .speechWin = {EC_WORD_THAT_S, EC_WORD_THAT, EC_WORD_MAN, EC_WORD_I_AM, EC_WORD_COLD, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_CAN_T_WIN, EC_WORD_IN, EC_WORD_THIS, EC_MOVE(SHEER_COLD), EC_WORD_ELLIPSIS}, .speechAfter = {EC_WORD_THIS, EC_MOVE(SHEER_COLD), EC_WORD_HAS, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_SHAKY}, .mons = { { .species = SPECIES_LANTURN, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_THUNDER, MOVE_ICE_BEAM}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 255, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("LANTURN"), .friendship = 255 }, { .species = SPECIES_MANTINE, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_CONFUSE_RAY, MOVE_ICE_BEAM}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 155, .spAttackEV = 100, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x14, // FEMALE CALM .nickname = _("MANTINE"), .friendship = 255 }, { .species = SPECIES_DEWGONG, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_SHEER_COLD, MOVE_BLIZZARD}, .hpEV = 0, .attackEV = 100, .defenseEV = 100, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 55, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x11, // FEMALE QUIET .nickname = _("DEWGONG"), .friendship = 255 }, { .species = SPECIES_CLOYSTER, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_ICE_BEAM, MOVE_HYPER_BEAM}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x11, // FEMALE QUIET .nickname = _("CLOYSTER"), .friendship = 255 }, { .species = SPECIES_TENTACRUEL, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_GIGA_DRAIN, MOVE_SLUDGE_BOMB}, .hpEV = 0, .attackEV = 0, .defenseEV = 100, .speedEV = 100, .spAttackEV = 255, .spDefenseEV = 55, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("TENTACRUEL"), .friendship = 255 }, { .species = SPECIES_GYARADOS, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_DRAGON_DANCE, MOVE_RETURN}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x03, // FEMALE ADAMANT .nickname = _("GYARADOS"), .friendship = 255 }, } }, { .name = _("AXE & REN"), .facilityClass = FACILITY_CLASS_SIS_AND_BRO, .textColor = 2, .speechBefore = {EC_WORD_OUR, EC_WORD_SWIFT_SWIM, EC_WORD_LEFT, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_COLD}, .speechWin = {EC_WORD_I, EC_WORD_WON, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_HOT}, .speechLose = {EC_WORD_I_AM, EC_WORD_HUNGRY, EC_WORD_FOR, EC_WORD_ANY, EC_WORD_HOT, EC_WORD_EATS}, .speechAfter = {EC_WORD_SISTER, EC_WORD_I, EC_WORD_NEED, EC_WORD_SOMETHING, EC_WORD_HOT, EC_WORD_PLEASE}, .mons = { { .species = SPECIES_ELECTABUZZ, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_THUNDER, MOVE_PSYCHIC, MOVE_CROSS_CHOP, MOVE_LIGHT_SCREEN}, .hpEV = 0, .attackEV = 155, .defenseEV = 155, .speedEV = 100, .spAttackEV = 100, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x40, // MALE NAIVE .nickname = _("ELECTABUZZ"), .friendship = 255 }, { .species = SPECIES_MAGNETON, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_THUNDER, MOVE_SONIC_BOOM, MOVE_METAL_SOUND, MOVE_REFLECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x0A, // GENDERLESS TIMID .nickname = _("MAGNETON"), .friendship = 255 }, { .species = SPECIES_PORYGON, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_THUNDER, MOVE_PSYCHIC, MOVE_BLIZZARD, MOVE_PROTECT}, .hpEV = 255, .attackEV = 0, .defenseEV = 0, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x11, // GENDERLESS QUIET .nickname = _("PORYGON"), .friendship = 255 }, { .species = SPECIES_DRAGONAIR, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_THUNDER, MOVE_SURF, MOVE_BLIZZARD, MOVE_OUTRAGE}, .hpEV = 0, .attackEV = 0, .defenseEV = 50, .speedEV = 155, .spAttackEV = 255, .spDefenseEV = 50, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("DRAGONAIR"), .friendship = 255 }, { .species = SPECIES_PERSIAN, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_THUNDER, MOVE_FAKE_OUT, MOVE_WATER_PULSE, MOVE_RETURN}, .hpEV = 0, .attackEV = 155, .defenseEV = 0, .speedEV = 200, .spAttackEV = 155, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0B, // FEMALE HASTY .nickname = _("PERSIAN"), .friendship = 255 }, { .species = SPECIES_STARMIE, .heldItem = ITEM_GANLON_BERRY, .moves = {MOVE_THUNDER, MOVE_SURF, MOVE_RECOVER, MOVE_REFLECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 95, .speedEV = 255, .spAttackEV = 100, .spDefenseEV = 60, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x05, // GENDERLESS BOLD .nickname = _("STARMIE"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x00015272 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Double_Unused3 = { .id = 30, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_DOUBLE, .prize = TTPRIZE_ZINC, .trainers = { { .name = _("KATI & GEB"), .facilityClass = FACILITY_CLASS_YOUNG_COUPLE, .textColor = 2, .speechBefore = {EC_WORD_WELCOME, EC_WORD_TO, EC_WORD_OUR, EC_WORD_LOVEY_DOVEY, EC_MOVE2(THUNDER_WAVE), EC_MOVE(SANDSTORM)}, .speechWin = {EC_WORD_LALALA, EC_WORD_LALALA, EC_WORD_OUR, EC_WORD_LOVEY_DOVEY, EC_WORD_LALALA, EC_WORD_LIFE}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_LOSE, EC_WORD_MY, EC_MOVE2(FRUSTRATION)}, .speechAfter = {EC_WORD_YOU_RE, EC_WORD_JUST, EC_WORD_A_LITTLE, EC_WORD_KID, EC_WORD_AHAHA, EC_WORD_EXCL}, .mons = { { .species = SPECIES_FLAAFFY, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_THUNDERBOLT, MOVE_REFLECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x84, // MALE RELAXED .nickname = _("FLAAFFY"), .friendship = 255 }, { .species = SPECIES_QUAGSIRE, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_ATTRACT, MOVE_SURF, MOVE_AMNESIA, MOVE_BLIZZARD}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x93, // MALE SASSY .nickname = _("QUAGSIRE"), .friendship = 255 }, { .species = SPECIES_PIKACHU, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_ATTRACT, MOVE_REVERSAL, MOVE_THUNDERBOLT, MOVE_IRON_TAIL}, .hpEV = 0, .attackEV = 155, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x8A, // MALE JOLLY .nickname = _("PIKACHU"), .friendship = 255 }, { .species = SPECIES_ELECTABUZZ, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_ATTRACT, MOVE_COUNTER, MOVE_ICE_PUNCH, MOVE_BODY_SLAM}, .hpEV = 0, .attackEV = 0, .defenseEV = 150, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 105, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x46, // MALE CALM .nickname = _("ELECTABUZZ"), .friendship = 255 }, { .species = SPECIES_TOGETIC, .heldItem = ITEM_KINGS_ROCK, .moves = {MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_ANCIENT_POWER, MOVE_WATER_PULSE}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x2D, // MALE CALM .nickname = _("TOGETIC"), .friendship = 255 }, { .species = SPECIES_GOLDUCK, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_ATTRACT, MOVE_SURF, MOVE_DIG, MOVE_CROSS_CHOP}, .hpEV = 0, .attackEV = 155, .defenseEV = 50, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 50, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x80, // MALE ADAMANT .nickname = _("GOLDUCK"), .friendship = 255 }, } }, { .name = _("KATI & GEB"), .facilityClass = FACILITY_CLASS_YOUNG_COUPLE, .textColor = 2, .speechBefore = {EC_WORD_I_AM, EC_WORD_PLUS, EC_WORD_YOU_RE, EC_WORD_MINUS, EC_WORD_LOVEY_DOVEY, EC_WORD_MAGNET_PULL}, .speechWin = {EC_WORD_DON_T, EC_WORD_STOP, EC_WORD_OUR, EC_WORD_LOVEY_DOVEY, EC_WORD_LOCOMOTIVE, EC_WORD_EXCL}, .speechLose = {EC_WORD_HIS, EC_WORD_CRY, EC_WORD_HAS, EC_WORD_CUTE_CHARM, EC_WORD_TOO, EC_WORD_EXCL}, .speechAfter = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_TIME, EC_WORD_TO, EC_WORD_TALK, EC_WORD_QUES}, .mons = { { .species = SPECIES_PICHU, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_SWEET_KISS, MOVE_REVERSAL}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x03, // FEMALE ADAMANT .nickname = _("PICHU"), .friendship = 255 }, { .species = SPECIES_ELEKID, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_DOUBLE_TEAM, MOVE_FOCUS_PUNCH}, .hpEV = 0, .attackEV = 255, .defenseEV = 130, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 125, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x02, // FEMALE BRAVE .nickname = _("ELEKID"), .friendship = 255 }, { .species = SPECIES_TOGEPI, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_YAWN, MOVE_WATER_PULSE}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x0F, // FEMALE MODEST .nickname = _("TOGEPI"), .friendship = 255 }, { .species = SPECIES_PSYDUCK, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_DIG, MOVE_DIVE}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x16, // FEMALE SASSY .nickname = _("PSYDUCK"), .friendship = 255 }, { .species = SPECIES_MAREEP, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_LIGHT_SCREEN, MOVE_THUNDERBOLT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("MAREEP"), .friendship = 255 }, { .species = SPECIES_WOOPER, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_SURF, MOVE_YAWN}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 10, .attackIV = 10, .defenseIV = 10, .speedIV = 10, .spAttackIV = 10, .spDefenseIV = 10, .abilityNum = 1, .personality = 0x07, // FEMALE RELAXED .nickname = _("WOOPER"), .friendship = 255 }, } }, DUMMY_TOWER_TEAM(0), }, .checksum = 0x00015966 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_6 = { .id = 31, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_KNOCKOUT, .prize = TTPRIZE_WHITE_HERB, .trainers = { { .name = _("BEN"), .facilityClass = FACILITY_CLASS_ROCKER, .textColor = 1, .speechBefore = {EC_WORD_LALALA, EC_WORD_LET_S, EC_MOVE(SING), EC_WORD_ABOUT, EC_WORD_ELECTRIC, EC_WORD_POWER}, .speechWin = {EC_WORD_STATIC, EC_WORD_IS, EC_WORD_ELECTRIC, EC_WORD_YES, EC_WORD_IT, EC_WORD_IS}, .speechLose = {EC_WORD_ELECTRIC, EC_WORD_ABOUT, EC_WORD_MY, EC_WORD_DIGITAL, EC_WORD_TELEVISION, EC_WORD_I_AM}, .speechAfter = {EC_WORD_ELECTRIC, EC_WORD_EXCL, EC_WORD_IT_S, EC_WORD_A, EC_WORD_NATURAL, EC_WORD_POWER}, .mons = { { .species = SPECIES_ELECTRODE, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_MIRROR_COAT, MOVE_EXPLOSION, MOVE_THUNDER_WAVE}, .hpEV = 0, .attackEV = 0, .defenseEV = 55, .speedEV = 255, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x14, // GENDERLESS CALM .nickname = _("ELECTRODE"), .friendship = 255 }, { .species = SPECIES_ELECTABUZZ, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDERBOLT, MOVE_FIRE_PUNCH, MOVE_PSYCHIC, MOVE_ICE_PUNCH}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 155, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0F, // FEMALE MODEST .nickname = _("ELECTABUZZ"), .friendship = 255 }, { .species = SPECIES_LANTURN, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDERBOLT, MOVE_DOUBLE_EDGE, MOVE_ICE_BEAM, MOVE_HYDRO_PUMP}, .hpEV = 0, .attackEV = 0, .defenseEV = 125, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 130, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x8E, // MALE QUIET .nickname = _("LANTURN"), .friendship = 255 }, { .species = SPECIES_MAGNETON, .heldItem = ITEM_LIECHI_BERRY, .moves = {MOVE_ZAP_CANNON, MOVE_HYPER_BEAM, MOVE_LOCK_ON, MOVE_SUPERSONIC}, .hpEV = 0, .attackEV = 0, .defenseEV = 200, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 55, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x14, // GENDERLESS CALM .nickname = _("MAGNETON"), .friendship = 255 }, { .species = SPECIES_RAICHU, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_DOUBLE_EDGE, MOVE_MEGA_KICK, MOVE_REVERSAL, MOVE_BODY_SLAM}, .hpEV = 0, .attackEV = 255, .defenseEV = 80, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 75, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x8A, // MALE JOLLY .nickname = _("RAICHU"), .friendship = 255 }, { .species = SPECIES_AMPHAROS, .heldItem = ITEM_SHELL_BELL, .moves = {MOVE_THUNDERBOLT, MOVE_MEGA_KICK, MOVE_COUNTER, MOVE_BODY_SLAM}, .hpEV = 0, .attackEV = 200, .defenseEV = 150, .speedEV = 0, .spAttackEV = 10, .spDefenseEV = 150, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("AMPHAROS"), .friendship = 255 }, } }, { .name = _("CAMDEN"), .facilityClass = FACILITY_CLASS_ENGINEER, .textColor = 1, .speechBefore = {EC_WORD_LALALA, EC_WORD_LET_S, EC_MOVE(SING), EC_WORD_ABOUT, EC_WORD_ELECTRIC, EC_WORD_POWER}, .speechWin = {EC_WORD_A, EC_MOVE(THUNDERBOLT), EC_WORD_IS, EC_WORD_ELECTRIC, EC_WORD_TOO, EC_WORD_EXCL}, .speechLose = {EC_WORD_ELECTRIC, EC_WORD_EXCL, EC_WORD_IT_S, EC_WORD_ABOUT, EC_WORD_WIRELESS, EC_WORD_LINK}, .speechAfter = {EC_WORD_ELECTRIC, EC_WORD_EXCL, EC_WORD_IT_S, EC_WORD_A, EC_WORD_TREASURE, EC_WORD_EXCL}, .mons = { { .species = SPECIES_GRANBULL, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDERBOLT, MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB}, .hpEV = 0, .attackEV = 255, .defenseEV = 55, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x02, // FEMALE BRAVE .nickname = _("GRANBULL"), .friendship = 255 }, { .species = SPECIES_PERSIAN, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_THUNDERBOLT, MOVE_WATER_PULSE, MOVE_HYPNOSIS, MOVE_SLASH}, .hpEV = 0, .attackEV = 100, .defenseEV = 55, .speedEV = 255, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("PERSIAN"), .friendship = 255 }, { .species = SPECIES_LICKITUNG, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_PROTECT, MOVE_SURF, MOVE_EARTHQUAKE, MOVE_SHADOW_BALL}, .hpEV = 200, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 55, .spDefenseEV = 0, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x02, // FEMALE BRAVE .nickname = _("LICKITUNG"), .friendship = 255 }, { .species = SPECIES_RATICATE, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_HYPER_FANG, MOVE_SUPER_FANG, MOVE_REVERSAL}, .hpEV = 0, .attackEV = 255, .defenseEV = 100, .speedEV = 50, .spAttackEV = 0, .spDefenseEV = 105, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x94, // MALE CAREFUL .nickname = _("RATICATE"), .friendship = 255 }, { .species = SPECIES_PRIMEAPE, .heldItem = ITEM_SCOPE_LENS, .moves = {MOVE_THUNDERBOLT, MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB}, .hpEV = 0, .attackEV = 255, .defenseEV = 130, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 125, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x02, // FEMALE BRAVE .nickname = _("PRIMEAPE"), .friendship = 255 }, { .species = SPECIES_KANGASKHAN, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_SURF, MOVE_CRUSH_CLAW, MOVE_REST}, .hpEV = 0, .attackEV = 100, .defenseEV = 155, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x11, // FEMALE QUIET .nickname = _("KANGASKHAN"), .friendship = 255 }, } }, { .name = _("ZACKERY"), .facilityClass = FACILITY_CLASS_SCIENTIST, .textColor = 1, .speechBefore = {EC_WORD_LALALA, EC_WORD_LET_S, EC_MOVE(SING), EC_WORD_ABOUT, EC_WORD_ELECTRIC, EC_WORD_POWER}, .speechWin = {EC_MOVE2(THUNDER_SHOCK), EC_WORD_IS, EC_WORD_ELECTRIC, EC_WORD_YOU, EC_WORD_KNOW, EC_WORD_QUES}, .speechLose = {EC_WORD_ELECTRIC, EC_WORD_EXCL, EC_MOVE2(FLASH), EC_MOVE2(FLASH), EC_MOVE2(FLASH), EC_WORD_EXCL_EXCL}, .speechAfter = {EC_WORD_ALL, EC_WORD_TOGETHER, EC_WORD_NOW, EC_WORD_EXCL, EC_MOVE(SPARK), EC_MOVE(SPARK)}, .mons = { { .species = SPECIES_WEEZING, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_SHADOW_BALL}, .hpEV = 0, .attackEV = 255, .defenseEV = 0, .speedEV = 0, .spAttackEV = 155, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x02, // FEMALE BRAVE .nickname = _("WEEZING"), .friendship = 255 }, { .species = SPECIES_MUK, .heldItem = ITEM_LEFTOVERS, .moves = {MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN, MOVE_CURSE}, .hpEV = 0, .attackEV = 0, .defenseEV = 150, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 105, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 1, .personality = 0x84, // MALE RELAXED .nickname = _("MUK"), .friendship = 255 }, { .species = SPECIES_GENGAR, .heldItem = ITEM_PETAYA_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_WILL_O_WISP}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 250, .spAttackEV = 155, .spDefenseEV = 105, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("GENGAR"), .friendship = 255 }, { .species = SPECIES_MISDREAVUS, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_PSYCHIC, MOVE_GRUDGE, MOVE_CONFUSE_RAY, MOVE_DESTINY_BOND}, .hpEV = 0, .attackEV = 0, .defenseEV = 0, .speedEV = 150, .spAttackEV = 105, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x0A, // FEMALE TIMID .nickname = _("MISDREAVUS"), .friendship = 255 }, { .species = SPECIES_CROBAT, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_SLUDGE_BOMB, MOVE_CONFUSE_RAY, MOVE_GIGA_DRAIN, MOVE_TOXIC}, .hpEV = 0, .attackEV = 0, .defenseEV = 200, .speedEV = 110, .spAttackEV = 0, .spDefenseEV = 200, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x87, // MALE TIMID .nickname = _("CROBAT"), .friendship = 255 }, { .species = SPECIES_HAUNTER, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_DESTINY_BOND, MOVE_HYPNOSIS, MOVE_CONFUSE_RAY, MOVE_TOXIC}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 20, .attackIV = 20, .defenseIV = 20, .speedIV = 20, .spAttackIV = 20, .spDefenseIV = 20, .abilityNum = 0, .personality = 0x91, // MALE CALM .nickname = _("HAUNTER"), .friendship = 255 }, } }, }, .checksum = 0x00014f49 }; static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_5 = { .id = 32, .floorIdx = MAX_TRAINER_TOWER_FLOORS, .challengeType = CHALLENGE_TYPE_KNOCKOUT, .prize = TTPRIZE_UP_GRADE, .trainers = { { .name = _("MAURA"), .facilityClass = FACILITY_CLASS_BEAUTY, .textColor = 2, .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_GROUP, EC_WORD_LEADER, EC_WORD_EXCL, 0xFFFF}, .speechWin = {EC_WORD_WHAT, EC_WORD_AM, EC_WORD_I, EC_WORD_LEADER, EC_WORD_OF, EC_WORD_QUES}, .speechLose = {EC_WORD_I_AM, EC_WORD_NO, EC_WORD_LEADER, EC_WORD_IT_S, EC_WORD_A_LITTLE, EC_WORD_LIE}, .speechAfter = {EC_WORD_HEY, EC_WORD_EXCL, EC_WORD_THE, EC_WORD_GROUND, EC_WORD_IS, EC_WORD_SLIMY}, .mons = { { .species = SPECIES_PICHU, .heldItem = ITEM_FOCUS_BAND, .moves = {MOVE_THUNDER_SHOCK, MOVE_THUNDER_WAVE, MOVE_SWEET_KISS, MOVE_PROTECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x05, // FEMALE BOLD .nickname = _("PICHU"), .friendship = 255 }, { .species = SPECIES_MAREEP, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_THUNDER_SHOCK, MOVE_CHARGE, MOVE_PROTECT, MOVE_RETURN}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("MAREEP"), .friendship = 255 }, { .species = SPECIES_IGGLYBUFF, .heldItem = ITEM_QUICK_CLAW, .moves = {MOVE_SING, MOVE_SWEET_KISS, MOVE_PRESENT, MOVE_PROTECT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("IGGLYBUFF"), .friendship = 255 }, { .species = SPECIES_CLEFFA, .heldItem = ITEM_LAX_INCENSE, .moves = {MOVE_SING, MOVE_SWEET_KISS, MOVE_ENCORE, MOVE_METRONOME}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x16, // FEMALE SASSY .nickname = _("CLEFFA"), .friendship = 255 }, { .species = SPECIES_NIDORAN_F, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_CRUNCH, MOVE_DIG, MOVE_FLATTER, MOVE_ATTRACT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x16, // FEMALE SASSY .nickname = _("NIDORAN♀"), .friendship = 255 }, { .species = SPECIES_NIDORAN_M, .heldItem = ITEM_SITRUS_BERRY, .moves = {MOVE_HORN_DRILL, MOVE_SLUDGE_BOMB, MOVE_FLATTER, MOVE_ATTRACT}, .hpEV = 0, .attackEV = 0, .defenseEV = 255, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 255, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x07, // MALE RELAXED .nickname = _("NIDORAN♂"), .friendship = 255 }, } }, { .name = _("MIKAELA"), .facilityClass = FACILITY_CLASS_LASS, .textColor = 1, .speechBefore = {EC_WORD_I_AM, EC_WORD_REALLY, EC_WORD_THE, EC_WORD_NO_1, EC_WORD_TRAINER, EC_WORD_HERE}, .speechWin = {EC_WORD_NEVER, EC_WORD_SAID, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_AT}, .speechLose = {EC_WORD_NEXT, EC_WORD_TIME, EC_WORD_I, EC_WORD_WILL, EC_WORD_BE, EC_WORD_OVERWHELMING}, .speechAfter = {EC_WORD_YOU, EC_MOVE2(SPIT_UP), EC_WORD_ME, EC_WORD_AS_IF, EC_WORD_I_AM, EC_WORD_NOTHING}, .mons = { { .species = SPECIES_NIDORINO, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_SHOCK_WAVE, MOVE_HORN_DRILL, MOVE_ICE_BEAM, MOVE_IRON_TAIL}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x07, // MALE RELAXED .nickname = _("NIDORINO"), .friendship = 255 }, { .species = SPECIES_NIDORINA, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_SHOCK_WAVE, MOVE_CRUNCH, MOVE_BODY_SLAM, MOVE_COUNTER}, .hpEV = 0, .attackEV = 255, .defenseEV = 155, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x16, // FEMALE SASSY .nickname = _("NIDORINA"), .friendship = 255 }, { .species = SPECIES_PIKACHU, .heldItem = ITEM_LIGHT_BALL, .moves = {MOVE_SHOCK_WAVE, MOVE_THUNDER_WAVE, MOVE_COUNTER, MOVE_BODY_SLAM}, .hpEV = 0, .attackEV = 0, .defenseEV = 200, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 55, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x11, // FEMALE QUIET .nickname = _("PIKACHU"), .friendship = 255 }, { .species = SPECIES_FLAAFFY, .heldItem = ITEM_BRIGHT_POWDER, .moves = {MOVE_SHOCK_WAVE, MOVE_DOUBLE_TEAM, MOVE_SEISMIC_TOSS, MOVE_BODY_SLAM}, .hpEV = 0, .attackEV = 255, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 150, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("FLAAFFY"), .friendship = 255 }, { .species = SPECIES_JIGGLYPUFF, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_SHOCK_WAVE, MOVE_SHADOW_BALL, MOVE_FOCUS_PUNCH, MOVE_BODY_SLAM}, .hpEV = 0, .attackEV = 255, .defenseEV = 150, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 105, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x16, // FEMALE SASSY .nickname = _("JIGGLYPUFF"), .friendship = 255 }, { .species = SPECIES_CLEFAIRY, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_SHOCK_WAVE, MOVE_METEOR_MASH, MOVE_MOONLIGHT, MOVE_BODY_SLAM}, .hpEV = 0, .attackEV = 255, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 155, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("CLEFAIRY"), .friendship = 255 }, } }, { .name = _("FLINT"), .facilityClass = FACILITY_CLASS_ENGINEER, .textColor = 4, .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_MOVE2(MILK_DRINK), EC_WORD_WORLD, EC_WORD_LEADER, EC_WORD_EXCL}, .speechWin = {EC_WORD_I_VE, EC_WORD_WON, EC_WORD_THIS, EC_MOVE2(MILK_DRINK), EC_WORD_MATCH, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_DRINK, EC_WORD_ANY, EC_WORD_MORE, EC_WORD_DRINKS}, .speechAfter = {EC_WORD_WHOAH, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_DROOLING, EC_WORD_ALL, EC_WORD_OVER}, .mons = { { .species = SPECIES_WIGGLYTUFF, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDERBOLT, MOVE_PSYCHIC, MOVE_WATER_PULSE, MOVE_FLAMETHROWER}, .hpEV = 0, .attackEV = 0, .defenseEV = 155, .speedEV = 0, .spAttackEV = 255, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0xCF, // MALE RELAXED .nickname = _("WIGGLYTUFF"), .friendship = 255 }, { .species = SPECIES_CLEFABLE, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_SOFT_BOILED, MOVE_METEOR_MASH, MOVE_DOUBLE_EDGE}, .hpEV = 0, .attackEV = 255, .defenseEV = 100, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 150, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0xCF, // MALE RELAXED .nickname = _("CLEFABLE"), .friendship = 255 }, { .species = SPECIES_NIDOQUEEN, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDERBOLT, MOVE_CRUNCH, MOVE_SUPERPOWER, MOVE_SURF}, .hpEV = 0, .attackEV = 200, .defenseEV = 110, .speedEV = 0, .spAttackEV = 100, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x07, // FEMALE RELAXED .nickname = _("NIDOQUEEN"), .friendship = 255 }, { .species = SPECIES_NIDOKING, .heldItem = ITEM_CHOICE_BAND, .moves = {MOVE_THUNDERBOLT, MOVE_HYPER_BEAM, MOVE_MEGAHORN, MOVE_SHADOW_BALL}, .hpEV = 0, .attackEV = 255, .defenseEV = 150, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 100, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x02, // MALE BRAVE .nickname = _("NIDOKING"), .friendship = 255 }, { .species = SPECIES_RAICHU, .heldItem = ITEM_SALAC_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_REVERSAL, MOVE_IRON_TAIL, MOVE_DOUBLE_EDGE}, .hpEV = 0, .attackEV = 155, .defenseEV = 150, .speedEV = 100, .spAttackEV = 0, .spDefenseEV = 105, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("RAICHU"), .friendship = 255 }, { .species = SPECIES_AMPHAROS, .heldItem = ITEM_LUM_BERRY, .moves = {MOVE_THUNDERBOLT, MOVE_REST, MOVE_BODY_SLAM, MOVE_IRON_TAIL}, .hpEV = 0, .attackEV = 255, .defenseEV = 150, .speedEV = 0, .spAttackEV = 0, .spDefenseEV = 105, .otId = 0 | (4096 << 16), .hpIV = 15, .attackIV = 15, .defenseIV = 15, .speedIV = 15, .spAttackIV = 15, .spDefenseIV = 15, .abilityNum = 0, .personality = 0x80, // MALE ADAMANT .nickname = _("AMPHAROS"), .friendship = 255 }, } }, }, .checksum = 0x00016b80 }; const struct EReaderTrainerTowerSetSubstruct gTrainerTowerLocalHeader = { .numFloors = MAX_TRAINER_TOWER_FLOORS, .id = 1 }; const struct TrainerTowerFloor *const gTrainerTowerFloors[NUM_TOWER_CHALLENGE_TYPES][MAX_TRAINER_TOWER_FLOORS] = { [CHALLENGE_TYPE_SINGLE] = { &sTrainerTowerFloor_Single_1, &sTrainerTowerFloor_Single_2, &sTrainerTowerFloor_Single_3, &sTrainerTowerFloor_Single_4, &sTrainerTowerFloor_Single_5, &sTrainerTowerFloor_Single_6, &sTrainerTowerFloor_Single_7, &sTrainerTowerFloor_Single_8 }, [CHALLENGE_TYPE_DOUBLE] = { &sTrainerTowerFloor_Double_1, &sTrainerTowerFloor_Double_2, &sTrainerTowerFloor_Double_3, &sTrainerTowerFloor_Double_4, &sTrainerTowerFloor_Double_5, &sTrainerTowerFloor_Double_6, &sTrainerTowerFloor_Double_7, &sTrainerTowerFloor_Double_8 }, [CHALLENGE_TYPE_KNOCKOUT] = { &sTrainerTowerFloor_Knockout_1, &sTrainerTowerFloor_Knockout_2, &sTrainerTowerFloor_Knockout_3, &sTrainerTowerFloor_Knockout_4, &sTrainerTowerFloor_Knockout_5, &sTrainerTowerFloor_Knockout_6, &sTrainerTowerFloor_Knockout_7, &sTrainerTowerFloor_Knockout_8 }, [CHALLENGE_TYPE_MIXED] = { &sTrainerTowerFloor_Mixed_1, &sTrainerTowerFloor_Mixed_2, &sTrainerTowerFloor_Mixed_3, &sTrainerTowerFloor_Double_8, &sTrainerTowerFloor_Mixed_5, &sTrainerTowerFloor_Knockout_8, &sTrainerTowerFloor_Double_3, &sTrainerTowerFloor_Knockout_2 } }; ================================================ FILE: src/trig.c ================================================ #include "global.h" // Values of sin(x*(π/128)) as Q8.8 fixed-point numbers from x = 0 to x = 319 const s16 gSineTable[] = { Q_8_8(0), // sin(0*(π/128)) Q_8_8(0.0234375), // sin(1*(π/128)) Q_8_8(0.046875), // sin(2*(π/128)) Q_8_8(0.0703125), // sin(3*(π/128)) Q_8_8(0.09765625), // sin(4*(π/128)) Q_8_8(0.12109375), // sin(5*(π/128)) Q_8_8(0.14453125), // sin(6*(π/128)) Q_8_8(0.16796875), // sin(7*(π/128)) Q_8_8(0.19140625), // sin(8*(π/128)) Q_8_8(0.21875), // sin(9*(π/128)) Q_8_8(0.2421875), // sin(10*(π/128)) Q_8_8(0.265625), // sin(11*(π/128)) Q_8_8(0.2890625), // sin(12*(π/128)) Q_8_8(0.3125), // sin(13*(π/128)) Q_8_8(0.3359375), // sin(14*(π/128)) Q_8_8(0.359375), // sin(15*(π/128)) Q_8_8(0.37890625), // sin(16*(π/128)) Q_8_8(0.40234375), // sin(17*(π/128)) Q_8_8(0.42578125), // sin(18*(π/128)) Q_8_8(0.44921875), // sin(19*(π/128)) Q_8_8(0.46875), // sin(20*(π/128)) Q_8_8(0.4921875), // sin(21*(π/128)) Q_8_8(0.51171875), // sin(22*(π/128)) Q_8_8(0.53125), // sin(23*(π/128)) Q_8_8(0.5546875), // sin(24*(π/128)) Q_8_8(0.57421875), // sin(25*(π/128)) Q_8_8(0.59375), // sin(26*(π/128)) Q_8_8(0.61328125), // sin(27*(π/128)) Q_8_8(0.6328125), // sin(28*(π/128)) Q_8_8(0.65234375), // sin(29*(π/128)) Q_8_8(0.66796875), // sin(30*(π/128)) Q_8_8(0.6875), // sin(31*(π/128)) Q_8_8(0.70703125), // sin(32*(π/128)) Q_8_8(0.72265625), // sin(33*(π/128)) Q_8_8(0.73828125), // sin(34*(π/128)) Q_8_8(0.75390625), // sin(35*(π/128)) Q_8_8(0.76953125), // sin(36*(π/128)) Q_8_8(0.78515625), // sin(37*(π/128)) Q_8_8(0.80078125), // sin(38*(π/128)) Q_8_8(0.81640625), // sin(39*(π/128)) Q_8_8(0.828125), // sin(40*(π/128)) Q_8_8(0.84375), // sin(41*(π/128)) Q_8_8(0.85546875), // sin(42*(π/128)) Q_8_8(0.8671875), // sin(43*(π/128)) Q_8_8(0.87890625), // sin(44*(π/128)) Q_8_8(0.890625), // sin(45*(π/128)) Q_8_8(0.90234375), // sin(46*(π/128)) Q_8_8(0.9140625), // sin(47*(π/128)) Q_8_8(0.921875), // sin(48*(π/128)) Q_8_8(0.9296875), // sin(49*(π/128)) Q_8_8(0.94140625), // sin(50*(π/128)) Q_8_8(0.94921875), // sin(51*(π/128)) Q_8_8(0.953125), // sin(52*(π/128)) Q_8_8(0.9609375), // sin(53*(π/128)) Q_8_8(0.96875), // sin(54*(π/128)) Q_8_8(0.97265625), // sin(55*(π/128)) Q_8_8(0.98046875), // sin(56*(π/128)) Q_8_8(0.984375), // sin(57*(π/128)) Q_8_8(0.98828125), // sin(58*(π/128)) Q_8_8(0.9921875), // sin(59*(π/128)) Q_8_8(0.9921875), // sin(60*(π/128)) Q_8_8(0.99609375), // sin(61*(π/128)) Q_8_8(0.99609375), // sin(62*(π/128)) Q_8_8(0.99609375), // sin(63*(π/128)) Q_8_8(1), // sin(64*(π/128)) Q_8_8(0.99609375), // sin(65*(π/128)) Q_8_8(0.99609375), // sin(66*(π/128)) Q_8_8(0.99609375), // sin(67*(π/128)) Q_8_8(0.9921875), // sin(68*(π/128)) Q_8_8(0.9921875), // sin(69*(π/128)) Q_8_8(0.98828125), // sin(70*(π/128)) Q_8_8(0.984375), // sin(71*(π/128)) Q_8_8(0.98046875), // sin(72*(π/128)) Q_8_8(0.97265625), // sin(73*(π/128)) Q_8_8(0.96875), // sin(74*(π/128)) Q_8_8(0.9609375), // sin(75*(π/128)) Q_8_8(0.953125), // sin(76*(π/128)) Q_8_8(0.94921875), // sin(77*(π/128)) Q_8_8(0.94140625), // sin(78*(π/128)) Q_8_8(0.9296875), // sin(79*(π/128)) Q_8_8(0.921875), // sin(80*(π/128)) Q_8_8(0.9140625), // sin(81*(π/128)) Q_8_8(0.90234375), // sin(82*(π/128)) Q_8_8(0.890625), // sin(83*(π/128)) Q_8_8(0.87890625), // sin(84*(π/128)) Q_8_8(0.8671875), // sin(85*(π/128)) Q_8_8(0.85546875), // sin(86*(π/128)) Q_8_8(0.84375), // sin(87*(π/128)) Q_8_8(0.828125), // sin(88*(π/128)) Q_8_8(0.81640625), // sin(89*(π/128)) Q_8_8(0.80078125), // sin(90*(π/128)) Q_8_8(0.78515625), // sin(91*(π/128)) Q_8_8(0.76953125), // sin(92*(π/128)) Q_8_8(0.75390625), // sin(93*(π/128)) Q_8_8(0.73828125), // sin(94*(π/128)) Q_8_8(0.72265625), // sin(95*(π/128)) Q_8_8(0.70703125), // sin(96*(π/128)) Q_8_8(0.6875), // sin(97*(π/128)) Q_8_8(0.66796875), // sin(98*(π/128)) Q_8_8(0.65234375), // sin(99*(π/128)) Q_8_8(0.6328125), // sin(100*(π/128)) Q_8_8(0.61328125), // sin(101*(π/128)) Q_8_8(0.59375), // sin(102*(π/128)) Q_8_8(0.57421875), // sin(103*(π/128)) Q_8_8(0.5546875), // sin(104*(π/128)) Q_8_8(0.53125), // sin(105*(π/128)) Q_8_8(0.51171875), // sin(106*(π/128)) Q_8_8(0.4921875), // sin(107*(π/128)) Q_8_8(0.46875), // sin(108*(π/128)) Q_8_8(0.44921875), // sin(109*(π/128)) Q_8_8(0.42578125), // sin(110*(π/128)) Q_8_8(0.40234375), // sin(111*(π/128)) Q_8_8(0.37890625), // sin(112*(π/128)) Q_8_8(0.359375), // sin(113*(π/128)) Q_8_8(0.3359375), // sin(114*(π/128)) Q_8_8(0.3125), // sin(115*(π/128)) Q_8_8(0.2890625), // sin(116*(π/128)) Q_8_8(0.265625), // sin(117*(π/128)) Q_8_8(0.2421875), // sin(118*(π/128)) Q_8_8(0.21875), // sin(119*(π/128)) Q_8_8(0.19140625), // sin(120*(π/128)) Q_8_8(0.16796875), // sin(121*(π/128)) Q_8_8(0.14453125), // sin(122*(π/128)) Q_8_8(0.12109375), // sin(123*(π/128)) Q_8_8(0.09765625), // sin(124*(π/128)) Q_8_8(0.0703125), // sin(125*(π/128)) Q_8_8(0.046875), // sin(126*(π/128)) Q_8_8(0.0234375), // sin(127*(π/128)) Q_8_8(0), // sin(128*(π/128)) Q_8_8(-0.0234375), // sin(129*(π/128)) Q_8_8(-0.046875), // sin(130*(π/128)) Q_8_8(-0.0703125), // sin(131*(π/128)) Q_8_8(-0.09765625), // sin(132*(π/128)) Q_8_8(-0.12109375), // sin(133*(π/128)) Q_8_8(-0.14453125), // sin(134*(π/128)) Q_8_8(-0.16796875), // sin(135*(π/128)) Q_8_8(-0.19140625), // sin(136*(π/128)) Q_8_8(-0.21875), // sin(137*(π/128)) Q_8_8(-0.2421875), // sin(138*(π/128)) Q_8_8(-0.265625), // sin(139*(π/128)) Q_8_8(-0.2890625), // sin(140*(π/128)) Q_8_8(-0.3125), // sin(141*(π/128)) Q_8_8(-0.3359375), // sin(142*(π/128)) Q_8_8(-0.359375), // sin(143*(π/128)) Q_8_8(-0.37890625), // sin(144*(π/128)) Q_8_8(-0.40234375), // sin(145*(π/128)) Q_8_8(-0.42578125), // sin(146*(π/128)) Q_8_8(-0.44921875), // sin(147*(π/128)) Q_8_8(-0.46875), // sin(148*(π/128)) Q_8_8(-0.4921875), // sin(149*(π/128)) Q_8_8(-0.51171875), // sin(150*(π/128)) Q_8_8(-0.53125), // sin(151*(π/128)) Q_8_8(-0.5546875), // sin(152*(π/128)) Q_8_8(-0.57421875), // sin(153*(π/128)) Q_8_8(-0.59375), // sin(154*(π/128)) Q_8_8(-0.61328125), // sin(155*(π/128)) Q_8_8(-0.6328125), // sin(156*(π/128)) Q_8_8(-0.65234375), // sin(157*(π/128)) Q_8_8(-0.66796875), // sin(158*(π/128)) Q_8_8(-0.6875), // sin(159*(π/128)) Q_8_8(-0.70703125), // sin(160*(π/128)) Q_8_8(-0.72265625), // sin(161*(π/128)) Q_8_8(-0.73828125), // sin(162*(π/128)) Q_8_8(-0.75390625), // sin(163*(π/128)) Q_8_8(-0.76953125), // sin(164*(π/128)) Q_8_8(-0.78515625), // sin(165*(π/128)) Q_8_8(-0.80078125), // sin(166*(π/128)) Q_8_8(-0.81640625), // sin(167*(π/128)) Q_8_8(-0.828125), // sin(168*(π/128)) Q_8_8(-0.84375), // sin(169*(π/128)) Q_8_8(-0.85546875), // sin(170*(π/128)) Q_8_8(-0.8671875), // sin(171*(π/128)) Q_8_8(-0.87890625), // sin(172*(π/128)) Q_8_8(-0.890625), // sin(173*(π/128)) Q_8_8(-0.90234375), // sin(174*(π/128)) Q_8_8(-0.9140625), // sin(175*(π/128)) Q_8_8(-0.921875), // sin(176*(π/128)) Q_8_8(-0.9296875), // sin(177*(π/128)) Q_8_8(-0.94140625), // sin(178*(π/128)) Q_8_8(-0.94921875), // sin(179*(π/128)) Q_8_8(-0.953125), // sin(180*(π/128)) Q_8_8(-0.9609375), // sin(181*(π/128)) Q_8_8(-0.96875), // sin(182*(π/128)) Q_8_8(-0.97265625), // sin(183*(π/128)) Q_8_8(-0.98046875), // sin(184*(π/128)) Q_8_8(-0.984375), // sin(185*(π/128)) Q_8_8(-0.98828125), // sin(186*(π/128)) Q_8_8(-0.9921875), // sin(187*(π/128)) Q_8_8(-0.9921875), // sin(188*(π/128)) Q_8_8(-0.99609375), // sin(189*(π/128)) Q_8_8(-0.99609375), // sin(190*(π/128)) Q_8_8(-0.99609375), // sin(191*(π/128)) Q_8_8(-1), // sin(192*(π/128)) Q_8_8(-0.99609375), // sin(193*(π/128)) Q_8_8(-0.99609375), // sin(194*(π/128)) Q_8_8(-0.99609375), // sin(195*(π/128)) Q_8_8(-0.9921875), // sin(196*(π/128)) Q_8_8(-0.9921875), // sin(197*(π/128)) Q_8_8(-0.98828125), // sin(198*(π/128)) Q_8_8(-0.984375), // sin(199*(π/128)) Q_8_8(-0.98046875), // sin(200*(π/128)) Q_8_8(-0.97265625), // sin(201*(π/128)) Q_8_8(-0.96875), // sin(202*(π/128)) Q_8_8(-0.9609375), // sin(203*(π/128)) Q_8_8(-0.953125), // sin(204*(π/128)) Q_8_8(-0.94921875), // sin(205*(π/128)) Q_8_8(-0.94140625), // sin(206*(π/128)) Q_8_8(-0.9296875), // sin(207*(π/128)) Q_8_8(-0.921875), // sin(208*(π/128)) Q_8_8(-0.9140625), // sin(209*(π/128)) Q_8_8(-0.90234375), // sin(210*(π/128)) Q_8_8(-0.890625), // sin(211*(π/128)) Q_8_8(-0.87890625), // sin(212*(π/128)) Q_8_8(-0.8671875), // sin(213*(π/128)) Q_8_8(-0.85546875), // sin(214*(π/128)) Q_8_8(-0.84375), // sin(215*(π/128)) Q_8_8(-0.828125), // sin(216*(π/128)) Q_8_8(-0.81640625), // sin(217*(π/128)) Q_8_8(-0.80078125), // sin(218*(π/128)) Q_8_8(-0.78515625), // sin(219*(π/128)) Q_8_8(-0.76953125), // sin(220*(π/128)) Q_8_8(-0.75390625), // sin(221*(π/128)) Q_8_8(-0.73828125), // sin(222*(π/128)) Q_8_8(-0.72265625), // sin(223*(π/128)) Q_8_8(-0.70703125), // sin(224*(π/128)) Q_8_8(-0.6875), // sin(225*(π/128)) Q_8_8(-0.66796875), // sin(226*(π/128)) Q_8_8(-0.65234375), // sin(227*(π/128)) Q_8_8(-0.6328125), // sin(228*(π/128)) Q_8_8(-0.61328125), // sin(229*(π/128)) Q_8_8(-0.59375), // sin(230*(π/128)) Q_8_8(-0.57421875), // sin(231*(π/128)) Q_8_8(-0.5546875), // sin(232*(π/128)) Q_8_8(-0.53125), // sin(233*(π/128)) Q_8_8(-0.51171875), // sin(234*(π/128)) Q_8_8(-0.4921875), // sin(235*(π/128)) Q_8_8(-0.46875), // sin(236*(π/128)) Q_8_8(-0.44921875), // sin(237*(π/128)) Q_8_8(-0.42578125), // sin(238*(π/128)) Q_8_8(-0.40234375), // sin(239*(π/128)) Q_8_8(-0.37890625), // sin(240*(π/128)) Q_8_8(-0.359375), // sin(241*(π/128)) Q_8_8(-0.3359375), // sin(242*(π/128)) Q_8_8(-0.3125), // sin(243*(π/128)) Q_8_8(-0.2890625), // sin(244*(π/128)) Q_8_8(-0.265625), // sin(245*(π/128)) Q_8_8(-0.2421875), // sin(246*(π/128)) Q_8_8(-0.21875), // sin(247*(π/128)) Q_8_8(-0.19140625), // sin(248*(π/128)) Q_8_8(-0.16796875), // sin(249*(π/128)) Q_8_8(-0.14453125), // sin(250*(π/128)) Q_8_8(-0.12109375), // sin(251*(π/128)) Q_8_8(-0.09765625), // sin(252*(π/128)) Q_8_8(-0.0703125), // sin(253*(π/128)) Q_8_8(-0.046875), // sin(254*(π/128)) Q_8_8(-0.0234375), // sin(255*(π/128)) Q_8_8(0), // sin(256*(π/128)) Q_8_8(0.0234375), // sin(257*(π/128)) Q_8_8(0.046875), // sin(258*(π/128)) Q_8_8(0.0703125), // sin(259*(π/128)) Q_8_8(0.09765625), // sin(260*(π/128)) Q_8_8(0.12109375), // sin(261*(π/128)) Q_8_8(0.14453125), // sin(262*(π/128)) Q_8_8(0.16796875), // sin(263*(π/128)) Q_8_8(0.19140625), // sin(264*(π/128)) Q_8_8(0.21875), // sin(265*(π/128)) Q_8_8(0.2421875), // sin(266*(π/128)) Q_8_8(0.265625), // sin(267*(π/128)) Q_8_8(0.2890625), // sin(268*(π/128)) Q_8_8(0.3125), // sin(269*(π/128)) Q_8_8(0.3359375), // sin(270*(π/128)) Q_8_8(0.359375), // sin(271*(π/128)) Q_8_8(0.37890625), // sin(272*(π/128)) Q_8_8(0.40234375), // sin(273*(π/128)) Q_8_8(0.42578125), // sin(274*(π/128)) Q_8_8(0.44921875), // sin(275*(π/128)) Q_8_8(0.46875), // sin(276*(π/128)) Q_8_8(0.4921875), // sin(277*(π/128)) Q_8_8(0.51171875), // sin(278*(π/128)) Q_8_8(0.53125), // sin(279*(π/128)) Q_8_8(0.5546875), // sin(280*(π/128)) Q_8_8(0.57421875), // sin(281*(π/128)) Q_8_8(0.59375), // sin(282*(π/128)) Q_8_8(0.61328125), // sin(283*(π/128)) Q_8_8(0.6328125), // sin(284*(π/128)) Q_8_8(0.65234375), // sin(285*(π/128)) Q_8_8(0.66796875), // sin(286*(π/128)) Q_8_8(0.6875), // sin(287*(π/128)) Q_8_8(0.70703125), // sin(288*(π/128)) Q_8_8(0.72265625), // sin(289*(π/128)) Q_8_8(0.73828125), // sin(290*(π/128)) Q_8_8(0.75390625), // sin(291*(π/128)) Q_8_8(0.76953125), // sin(292*(π/128)) Q_8_8(0.78515625), // sin(293*(π/128)) Q_8_8(0.80078125), // sin(294*(π/128)) Q_8_8(0.81640625), // sin(295*(π/128)) Q_8_8(0.828125), // sin(296*(π/128)) Q_8_8(0.84375), // sin(297*(π/128)) Q_8_8(0.85546875), // sin(298*(π/128)) Q_8_8(0.8671875), // sin(299*(π/128)) Q_8_8(0.87890625), // sin(300*(π/128)) Q_8_8(0.890625), // sin(301*(π/128)) Q_8_8(0.90234375), // sin(302*(π/128)) Q_8_8(0.9140625), // sin(303*(π/128)) Q_8_8(0.921875), // sin(304*(π/128)) Q_8_8(0.9296875), // sin(305*(π/128)) Q_8_8(0.94140625), // sin(306*(π/128)) Q_8_8(0.94921875), // sin(307*(π/128)) Q_8_8(0.953125), // sin(308*(π/128)) Q_8_8(0.9609375), // sin(309*(π/128)) Q_8_8(0.96875), // sin(310*(π/128)) Q_8_8(0.97265625), // sin(311*(π/128)) Q_8_8(0.98046875), // sin(312*(π/128)) Q_8_8(0.984375), // sin(313*(π/128)) Q_8_8(0.98828125), // sin(314*(π/128)) Q_8_8(0.9921875), // sin(315*(π/128)) Q_8_8(0.9921875), // sin(316*(π/128)) Q_8_8(0.99609375), // sin(317*(π/128)) Q_8_8(0.99609375), // sin(318*(π/128)) Q_8_8(0.99609375), // sin(319*(π/128)) }; // values of sin(x) as Q4.12 fixed-point numbers from x = 0° to x = 179° const s16 gSineDegreeTable[] = { Q_4_12(0), // sin(0°) Q_4_12(0.017333984375), // sin(1°) Q_4_12(0.034912109375), // sin(2°) Q_4_12(0.05224609375), // sin(3°) Q_4_12(0.06982421875), // sin(4°) Q_4_12(0.087158203125), // sin(5°) Q_4_12(0.1044921875), // sin(6°) Q_4_12(0.121826171875), // sin(7°) Q_4_12(0.13916015625), // sin(8°) Q_4_12(0.156494140625), // sin(9°) Q_4_12(0.173583984375), // sin(10°) Q_4_12(0.19091796875), // sin(11°) Q_4_12(0.2080078125), // sin(12°) Q_4_12(0.224853515625), // sin(13°) Q_4_12(0.241943359375), // sin(14°) Q_4_12(0.2587890625), // sin(15°) Q_4_12(0.275634765625), // sin(16°) Q_4_12(0.29248046875), // sin(17°) Q_4_12(0.30908203125), // sin(18°) Q_4_12(0.32568359375), // sin(19°) Q_4_12(0.342041015625), // sin(20°) Q_4_12(0.3583984375), // sin(21°) Q_4_12(0.37451171875), // sin(22°) Q_4_12(0.390625), // sin(23°) Q_4_12(0.40673828125), // sin(24°) Q_4_12(0.422607421875), // sin(25°) Q_4_12(0.4384765625), // sin(26°) Q_4_12(0.4541015625), // sin(27°) Q_4_12(0.469482421875), // sin(28°) Q_4_12(0.48486328125), // sin(29°) Q_4_12(0.5), // sin(30°) Q_4_12(0.51513671875), // sin(31°) Q_4_12(0.530029296875), // sin(32°) Q_4_12(0.544677734375), // sin(33°) Q_4_12(0.55908203125), // sin(34°) Q_4_12(0.573486328125), // sin(35°) Q_4_12(0.587890625), // sin(36°) Q_4_12(0.601806640625), // sin(37°) Q_4_12(0.61572265625), // sin(38°) Q_4_12(0.62939453125), // sin(39°) Q_4_12(0.642822265625), // sin(40°) Q_4_12(0.656005859375), // sin(41°) Q_4_12(0.669189453125), // sin(42°) Q_4_12(0.681884765625), // sin(43°) Q_4_12(0.694580078125), // sin(44°) Q_4_12(0.70703125), // sin(45°) Q_4_12(0.71923828125), // sin(46°) Q_4_12(0.7314453125), // sin(47°) Q_4_12(0.7431640625), // sin(48°) Q_4_12(0.754638671875), // sin(49°) Q_4_12(0.76611328125), // sin(50°) Q_4_12(0.777099609375), // sin(51°) Q_4_12(0.7880859375), // sin(52°) Q_4_12(0.798583984375), // sin(53°) Q_4_12(0.80908203125), // sin(54°) Q_4_12(0.819091796875), // sin(55°) Q_4_12(0.8291015625), // sin(56°) Q_4_12(0.838623046875), // sin(57°) Q_4_12(0.84814453125), // sin(58°) Q_4_12(0.857177734375), // sin(59°) Q_4_12(0.865966796875), // sin(60°) Q_4_12(0.87451171875), // sin(61°) Q_4_12(0.883056640625), // sin(62°) Q_4_12(0.89111328125), // sin(63°) Q_4_12(0.898681640625), // sin(64°) Q_4_12(0.90625), // sin(65°) Q_4_12(0.91357421875), // sin(66°) Q_4_12(0.92041015625), // sin(67°) Q_4_12(0.92724609375), // sin(68°) Q_4_12(0.93359375), // sin(69°) Q_4_12(0.939697265625), // sin(70°) Q_4_12(0.945556640625), // sin(71°) Q_4_12(0.951171875), // sin(72°) Q_4_12(0.956298828125), // sin(73°) Q_4_12(0.961181640625), // sin(74°) Q_4_12(0.9658203125), // sin(75°) Q_4_12(0.97021484375), // sin(76°) Q_4_12(0.974365234375), // sin(77°) Q_4_12(0.97802734375), // sin(78°) Q_4_12(0.981689453125), // sin(79°) Q_4_12(0.98486328125), // sin(80°) Q_4_12(0.98779296875), // sin(81°) Q_4_12(0.990234375), // sin(82°) Q_4_12(0.992431640625), // sin(83°) Q_4_12(0.994384765625), // sin(84°) Q_4_12(0.99609375), // sin(85°) Q_4_12(0.99755859375), // sin(86°) Q_4_12(0.99853515625), // sin(87°) Q_4_12(0.999267578125), // sin(88°) Q_4_12(0.999755859375), // sin(89°) Q_4_12(1), // sin(90°) Q_4_12(0.999755859375), // sin(91°) Q_4_12(0.999267578125), // sin(92°) Q_4_12(0.99853515625), // sin(93°) Q_4_12(0.99755859375), // sin(94°) Q_4_12(0.99609375), // sin(95°) Q_4_12(0.994384765625), // sin(96°) Q_4_12(0.992431640625), // sin(97°) Q_4_12(0.990234375), // sin(98°) Q_4_12(0.98779296875), // sin(99°) Q_4_12(0.98486328125), // sin(100°) Q_4_12(0.981689453125), // sin(101°) Q_4_12(0.97802734375), // sin(102°) Q_4_12(0.974365234375), // sin(103°) Q_4_12(0.97021484375), // sin(104°) Q_4_12(0.9658203125), // sin(105°) Q_4_12(0.961181640625), // sin(106°) Q_4_12(0.956298828125), // sin(107°) Q_4_12(0.951171875), // sin(108°) Q_4_12(0.945556640625), // sin(109°) Q_4_12(0.939697265625), // sin(110°) Q_4_12(0.93359375), // sin(111°) Q_4_12(0.92724609375), // sin(112°) Q_4_12(0.92041015625), // sin(113°) Q_4_12(0.91357421875), // sin(114°) Q_4_12(0.90625), // sin(115°) Q_4_12(0.898681640625), // sin(116°) Q_4_12(0.89111328125), // sin(117°) Q_4_12(0.883056640625), // sin(118°) Q_4_12(0.87451171875), // sin(119°) Q_4_12(0.865966796875), // sin(120°) Q_4_12(0.857177734375), // sin(121°) Q_4_12(0.84814453125), // sin(122°) Q_4_12(0.838623046875), // sin(123°) Q_4_12(0.8291015625), // sin(124°) Q_4_12(0.819091796875), // sin(125°) Q_4_12(0.80908203125), // sin(126°) Q_4_12(0.798583984375), // sin(127°) Q_4_12(0.7880859375), // sin(128°) Q_4_12(0.777099609375), // sin(129°) Q_4_12(0.76611328125), // sin(130°) Q_4_12(0.754638671875), // sin(131°) Q_4_12(0.7431640625), // sin(132°) Q_4_12(0.7314453125), // sin(133°) Q_4_12(0.71923828125), // sin(134°) Q_4_12(0.70703125), // sin(135°) Q_4_12(0.694580078125), // sin(136°) Q_4_12(0.681884765625), // sin(137°) Q_4_12(0.669189453125), // sin(138°) Q_4_12(0.656005859375), // sin(139°) Q_4_12(0.642822265625), // sin(140°) Q_4_12(0.62939453125), // sin(141°) Q_4_12(0.61572265625), // sin(142°) Q_4_12(0.601806640625), // sin(143°) Q_4_12(0.587890625), // sin(144°) Q_4_12(0.573486328125), // sin(145°) Q_4_12(0.55908203125), // sin(146°) Q_4_12(0.544677734375), // sin(147°) Q_4_12(0.530029296875), // sin(148°) Q_4_12(0.51513671875), // sin(149°) Q_4_12(0.5), // sin(150°) Q_4_12(0.48486328125), // sin(151°) Q_4_12(0.469482421875), // sin(152°) Q_4_12(0.4541015625), // sin(153°) Q_4_12(0.4384765625), // sin(154°) Q_4_12(0.422607421875), // sin(155°) Q_4_12(0.40673828125), // sin(156°) Q_4_12(0.390625), // sin(157°) Q_4_12(0.37451171875), // sin(158°) Q_4_12(0.3583984375), // sin(159°) Q_4_12(0.342041015625), // sin(160°) Q_4_12(0.32568359375), // sin(161°) Q_4_12(0.30908203125), // sin(162°) Q_4_12(0.29248046875), // sin(163°) Q_4_12(0.275634765625), // sin(164°) Q_4_12(0.2587890625), // sin(165°) Q_4_12(0.241943359375), // sin(166°) Q_4_12(0.224853515625), // sin(167°) Q_4_12(0.2080078125), // sin(168°) Q_4_12(0.19091796875), // sin(169°) Q_4_12(0.173583984375), // sin(170°) Q_4_12(0.156494140625), // sin(171°) Q_4_12(0.13916015625), // sin(172°) Q_4_12(0.121826171875), // sin(173°) Q_4_12(0.1044921875), // sin(174°) Q_4_12(0.087158203125), // sin(175°) Q_4_12(0.06982421875), // sin(176°) Q_4_12(0.05224609375), // sin(177°) Q_4_12(0.034912109375), // sin(178°) Q_4_12(0.017333984375), // sin(179°) }; // amplitude * sin(index*(π/128)) s16 Sin(s16 index, s16 amplitude) { return (amplitude * gSineTable[index]) >> 8; } // amplitude * cos(index*(π/128)) s16 Cos(s16 index, s16 amplitude) { return (amplitude * gSineTable[index + 64]) >> 8; } // angle in degrees s16 Sin2(u16 angle) { s32 angleMod = angle % 180; s32 negate = ((angle / 180) & 1); s16 value = gSineDegreeTable[angleMod]; if (negate) return -value; else return value; } // angle in degrees s16 Cos2(u16 angle) { return Sin2(angle + 90); } ================================================ FILE: src/union_room.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "berry_crush.h" #include "cable_club.h" #include "data.h" #include "decompress.h" #include "dodrio_berry_picking.h" #include "dynamic_placeholder_text_util.h" #include "easy_chat.h" #include "event_data.h" #include "event_object_lock.h" #include "fieldmap.h" #include "field_control_avatar.h" #include "field_fadetransition.h" #include "field_player_avatar.h" #include "field_weather.h" #include "link.h" #include "link_rfu.h" #include "list_menu.h" #include "load_save.h" #include "menu.h" #include "mystery_gift.h" #include "mystery_gift_menu.h" #include "new_menu_helpers.h" #include "overworld.h" #include "party_menu.h" #include "pokemon_jump.h" #include "quest_log.h" #include "random.h" #include "save_location.h" #include "script.h" #include "script_pokemon_util.h" #include "start_menu.h" #include "strings.h" #include "task.h" #include "trade.h" #include "trade_scene.h" #include "trainer_card.h" #include "union_room.h" #include "union_room_battle.h" #include "union_room_chat.h" #include "union_room_player_avatar.h" #include "union_room_message.h" #include "constants/songs.h" #include "constants/maps.h" #include "constants/cable_club.h" #include "constants/field_weather.h" #include "constants/trainer_card.h" #include "constants/union_room.h" // States for Task_RunUnionRoom enum { UR_STATE_INIT, UR_STATE_INIT_OBJECTS, UR_STATE_INIT_LINK, UR_STATE_CHECK_SELECTING_MON, UR_STATE_MAIN, UR_STATE_DO_SOMETHING_PROMPT, UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT, UR_STATE_DO_SOMETHING_PROMPT_2, UR_STATE_PRINT_MSG, UR_STATE_HANDLE_ACTIVITY_REQUEST, UR_STATE_DECLINE_ACTIVITY_REQUEST, UR_STATE_PLAYER_CONTACTED_YOU, UR_STATE_RECV_CONTACT_DATA, UR_STATE_PRINT_START_ACTIVITY_MSG, UR_STATE_START_ACTIVITY_LINK, UR_STATE_START_ACTIVITY_WAIT_FOR_LINK, UR_STATE_START_ACTIVITY_FREE_UROOM, UR_STATE_START_ACTIVITY_FADE, UR_STATE_START_ACTIVITY, UR_STATE_RECV_JOIN_CHAT_REQUEST, UR_STATE_TRY_ACCEPT_CHAT_REQUEST_DELAY, UR_STATE_TRY_ACCEPT_CHAT_REQUEST, UR_STATE_ACCEPT_CHAT_REQUEST, UR_STATE_WAIT_FOR_START_MENU, UR_STATE_INTERACT_WITH_PLAYER, UR_STATE_TRY_COMMUNICATING, UR_STATE_PRINT_AND_EXIT, UR_STATE_SEND_ACTIVITY_REQUEST, UR_STATE_TRAINER_APPEARS_BUSY, UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST, UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, UR_STATE_SEND_TRADE_REQUST, UR_STATE_REQUEST_DECLINED, UR_STATE_PRINT_CONTACT_MSG, UR_STATE_HANDLE_CONTACT_DATA, UR_STATE_RECV_ACTIVITY_REQUEST, UR_STATE_CANCEL_REQUEST_PRINT_MSG, UR_STATE_CANCEL_REQUEST_RESTART_LINK, UR_STATE_COMMUNICATING_WAIT_FOR_DATA, UR_STATE_WAIT_FOR_CONTACT_DATA, UR_STATE_PRINT_CARD_INFO, UR_STATE_WAIT_FINISH_READING_CARD, UR_STATE_INTERACT_WITH_ATTENDANT, UR_STATE_REGISTER_PROMPT, UR_STATE_CANCEL_REGISTRATION_PROMPT, UR_STATE_CHECK_TRADING_BOARD, UR_STATE_TRADING_BOARD_LOAD, UR_STATE_REGISTER_PROMPT_HANDLE_INPUT, UR_STATE_TRADING_BOARD_HANDLE_INPUT, UR_STATE_TRADE_PROMPT, UR_STATE_TRADE_SELECT_MON, UR_STATE_TRADE_OFFER_MON, UR_STATE_REGISTER_REQUEST_TYPE, UR_STATE_REGISTER_SELECT_MON_FADE, UR_STATE_REGISTER_SELECT_MON, UR_STATE_REGISTER_COMPLETE, UR_STATE_CANCEL_REGISTRATION, }; // States for sUnionRoomTrade.state enum { URTRADE_STATE_NONE, URTRADE_STATE_REGISTERING, URTRADE_STATE_OFFERING, }; // States for Task_TryBecomeLinkLeader enum { LL_STATE_INIT, LL_STATE_INIT2 = 3, LL_STATE_GET_AWAITING_PLAYERS_TEXT, LL_STATE_PRINT_AWAITING_PLAYERS, LL_STATE_AWAIT_PLAYERS, LL_STATE_ACCEPT_NEW_MEMBER_PROMPT, LL_STATE_WAIT_DISCONNECT_CHILD = 9, LL_STATE_MEMBER_LEFT, LL_STATE_ACCEPT_NEW_MEMBER_PROMPT_HANDLE_INPUT, LL_STATE_UPDATE_AFTER_JOIN_REQUEST, LL_STATE_ACCEPTED_FINAL_MEMBER, LL_STATE_WAIT_AND_CONFIRM_MEMBERS, LL_STATE_MEMBERS_OK_PROMPT, LL_STATE_MEMBERS_OK_PROMPT_HANDLE_INPUT, LL_STATE_CONFIRMED_MEMBERS, LL_STATE_FINAL_MEMBER_CHECK, LL_STATE_CANCEL_PROMPT, LL_STATE_CANCEL_PROMPT_HANDLE_INPUT, LL_STATE_SHUTDOWN_AND_RETRY, LL_STATE_RETRY, LL_STATE_SHUTDOWN_AND_FAIL, LL_STATE_FAILED, LL_STATE_TRY_START_ACTIVITY = 26, LL_STATE_MEMBER_DISCONNECTED = 29, LL_STATE_CANCEL_WITH_MSG }; // States for Task_TryJoinLinkGroup enum { LG_STATE_INIT, LG_STATE_CHOOSE_LEADER_MSG, LG_STATE_INIT_WINDOWS, LG_STATE_CHOOSE_LEADER_HANDLE_INPUT, LG_STATE_ASK_JOIN_GROUP = 5, LG_STATE_MAIN, LG_STATE_ASK_LEAVE_GROUP, LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT, LG_STATE_WAIT_LEAVE_GROUP, LG_STATE_CANCEL_CHOOSE_LEADER, LG_STATE_CANCELED, LG_STATE_RFU_ERROR, LG_STATE_RFU_ERROR_SHUTDOWN, LG_STATE_DISCONNECTED, LG_STATE_RETRY_CONNECTION, LG_STATE_TRADE_NOT_READY = 18, LG_STATE_TRADE_NOT_READY_RETRY, LG_STATE_READY_START_ACTIVITY, LG_STATE_START_ACTIVITY, LG_STATE_SHUTDOWN = 23, }; // Color types for PrintUnionRoomText enum { UR_COLOR_DEFAULT, UR_COLOR_RED, UR_COLOR_GREEN, UR_COLOR_WHITE, UR_COLOR_CANCEL, UR_COLOR_TRADE_BOARD_SELF, UR_COLOR_TRADE_BOARD_OTHER, }; // Return values for HandlePlayerListUpdate enum { PLIST_NONE, PLIST_NEW_PLAYER, PLIST_RECENT_UPDATE, PLIST_UNUSED, PLIST_CONTACTED, }; static EWRAM_DATA u8 sUnionRoomPlayerName[12] = {}; static EWRAM_DATA u8 sPlayerCurrActivity = 0; static EWRAM_DATA u8 sPlayerActivityGroupSize = 0; static EWRAM_DATA union { struct WirelessLink_Leader *leader; struct WirelessLink_Group *group; struct WirelessLink_URoom *uRoom; } sWirelessLinkMain = {}; static EWRAM_DATA u32 sUnused = 0; EWRAM_DATA struct RfuGameCompatibilityData gRfuPartnerCompatibilityData = {}; EWRAM_DATA u16 gUnionRoomOfferedSpecies = SPECIES_NONE; EWRAM_DATA u8 gUnionRoomRequestedMonType = TYPE_NORMAL; static EWRAM_DATA struct UnionRoomTrade sUnionRoomTrade = {}; static struct WirelessLink_Leader * sLeader; static struct WirelessLink_Group * sGroup; static struct WirelessLink_URoom * sURoom; static void Task_TryBecomeLinkLeader(u8); static void Leader_DestroyResources(struct WirelessLink_Leader *); static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *, u32, u32); static void ItemPrintFunc_PossibleGroupMembers(u8, u32, u8); static u8 LeaderUpdateGroupMembership(struct RfuPlayerList *); static u8 LeaderPrunePlayerList(struct RfuPlayerList *); static void Task_TryJoinLinkGroup(u8); static u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group *, s32); static void AskToJoinRfuGroup(struct WirelessLink_Group *, s32); static void Task_ListenToWireless(u8); static void ListMenuItemPrintFunc_UnionRoomGroups(u8, u32, u8); static u8 GetNewLeaderCandidate(void); static void CreateTask_RunScriptAndFadeToActivity(void); static void CreateTask_StartActivity(void); static void Task_SendMysteryGift(u8); static void Task_CardOrNewsWithFriend(u8); static void Task_CardOrNewsOverWireless(u8); static void Task_RunUnionRoom(u8); static u16 ReadAsU16(const u8 *); static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *); static bool32 HandleContactFromOtherPlayer(struct WirelessLink_URoom *); static void Task_InitUnionRoom(u8); static u8 HandlePlayerListUpdate(void); static u8 CreateTask_SearchForChildOrParent(struct RfuIncomingPlayerList *, struct RfuIncomingPlayerList *, u32); static bool32 HasWonderCardOrNewsByLinkGroup(struct RfuGameData *, s16); static u8 CreateTask_ListenForCompatiblePartners(struct RfuIncomingPlayerList *, u32); static u8 CreateTask_ListenForWonderDistributor(struct RfuIncomingPlayerList *, u32); static bool32 UR_PrintFieldMessage(const u8 *); static bool32 UR_RunTextPrinters(void); static bool8 PrintOnTextbox(u8 *, const u8 *); static s8 UnionRoomHandleYesNo(u8 *, bool32); static s32 ListMenuHandler_AllItemsAvailable(u8 *, u8 *, u8 *, const struct WindowTemplate *, const struct ListMenuTemplate *); static s32 TradeBoardMenuHandler(u8 *, u8 *, u8 *, u8 *, const struct WindowTemplate *, const struct ListMenuTemplate *, struct RfuPlayerList *); static void UR_ClearBg0(void); static void JoinGroup_EnableScriptContexts(void); static void PrintUnionRoomText(u8, u8, const u8 *, u8, u8, u8); static void ClearRfuPlayerList(struct RfuPlayer *, u8); static void ClearIncomingPlayerList(struct RfuIncomingPlayer *, u8); static bool8 ArePlayersDifferent(struct RfuPlayerData *, const struct RfuPlayerData *); static bool32 ArePlayerDataDifferent(struct RfuPlayerData *, struct RfuPlayerData *); static u32 GetNewIncomingPlayerId(struct RfuPlayer *, struct RfuIncomingPlayer *); static u8 TryAddIncomingPlayerToList(struct RfuPlayer *, struct RfuIncomingPlayer *, u8); static void PrintGroupMemberOnWindow(u8, u8, u8, struct RfuPlayer *, u8, u8); static void PrintGroupCandidateOnWindow(u8, u8, u8, struct RfuPlayer *, u8, u8); static bool32 IsPlayerFacingTradingBoard(void); static u32 GetResponseIdx_InviteToURoomActivity(s32); static u32 ConvPartnerUnameAndGetWhetherMetAlready(struct RfuPlayer *); static s32 UnionRoomGetPlayerInteractionResponse(struct RfuPlayerList *, u8, u8, u32); static void ItemPrintFunc_Unused(u8, u32, u8); static void TradeBoardListMenuItemPrintFunc(u8, u32, u8); static s32 GetIndexOfNthTradeBoardOffer(struct RfuPlayer *, s32); static s32 GetUnionRoomPlayerGender(s32, struct RfuPlayerList *); static s32 IsRequestedTradeInPlayerParty(u32, u32); static void GetURoomActivityRejectMsg(u8 *, s32, u32); static void GetURoomActivityStartMsg(u8 *, u8); static s32 GetChatLeaderActionRequestMessage(u8 *, u32, u16 *, struct WirelessLink_URoom *); static bool32 PollPartnerYesNoResponse(struct WirelessLink_URoom *); static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void); static void ResetUnionRoomTrade(struct UnionRoomTrade *); static bool32 RegisterTradeMonAndGetIsEgg(u32, struct UnionRoomTrade *); static void RegisterTradeMon(u32, struct UnionRoomTrade *); static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *, u8); static void HandleCancelActivity(bool32); static void StartScriptInteraction(void); static u8 GetLinkPlayerInfoFlags(s32); static u8 GetActivePartnersInfo(struct WirelessLink_URoom *); static void ViewURoomPartnerTrainerCard(u8 *, struct WirelessLink_URoom *, bool8); #include "data/union_room.h" // These are functions in Emerald but inlined in FireRed #define CopyAndTranslatePlayerName(dest, player) ({ \ StringCopy_PlayerName(dest, (player).rfu.name); \ ConvertInternationalString(dest, (player).rfu.data.compatibility.language); \ }) #define CopyAndTranslatePlayerName2(dest, player) ({ \ StringCopy(dest, (player).rfu.name); \ ConvertInternationalString(dest, (player).rfu.data.compatibility.language); \ }) #define CopyTrainerCardData(dest, src, _version) ({ \ (dest) = *((struct TrainerCard * )(src)); \ (dest).version = _version; \ }) #define GetStringRightAlignXOffset(_fontId, _string, _maxWidth) ({ \ u16 strWidth = GetStringWidth(_fontId, _string, 0); \ _maxWidth - strWidth; \ }) static void PrintNumPlayersWaitingForMsg(u8 windowId, u8 capacityCode, u8 stringId) { FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); switch (capacityCode << 8) { case LINK_GROUP_CAPACITY(0, 2): PrintUnionRoomText(windowId, FONT_NORMAL, gTexts_UR_PlayersNeededOrMode[0][stringId - 1], 0, 2, UR_COLOR_DEFAULT); break; case LINK_GROUP_CAPACITY(0, 4): PrintUnionRoomText(windowId, FONT_NORMAL, gTexts_UR_PlayersNeededOrMode[1][stringId - 1], 0, 2, UR_COLOR_DEFAULT); break; case LINK_GROUP_CAPACITY(2, 5): PrintUnionRoomText(windowId, FONT_NORMAL, gTexts_UR_PlayersNeededOrMode[2][stringId - 1], 0, 2, UR_COLOR_DEFAULT); break; case LINK_GROUP_CAPACITY(3, 5): PrintUnionRoomText(windowId, FONT_NORMAL, gTexts_UR_PlayersNeededOrMode[3][stringId - 1], 0, 2, UR_COLOR_DEFAULT); break; } CopyWindowToVram(windowId, COPYWIN_GFX); } static void PrintPlayerNameAndIdOnWindow(u8 windowId) { u8 text[12]; u8 text2[12]; PrintUnionRoomText(windowId, FONT_NORMAL, gSaveBlock2Ptr->playerName, 0, 2, UR_COLOR_DEFAULT); StringCopy(text2, gText_UR_ID); ConvertIntToDecimalStringN(text, ReadAsU16(gSaveBlock2Ptr->playerTrainerId), STR_CONV_MODE_LEADING_ZEROS, 5); StringAppend(text2, text); PrintUnionRoomText(windowId, FONT_SMALL, text2, 0, 16, UR_COLOR_DEFAULT); } static void GetAwaitingCommunicationText(u8 *dst, u8 caseId) { switch (caseId) { case ACTIVITY_BATTLE_SINGLE: case ACTIVITY_BATTLE_DOUBLE: case ACTIVITY_BATTLE_MULTI: case ACTIVITY_TRADE: case ACTIVITY_POKEMON_JUMP: case ACTIVITY_BERRY_CRUSH: case ACTIVITY_BERRY_PICK: case ACTIVITY_WONDER_CARD: case ACTIVITY_WONDER_NEWS: // BUG: argument *dst isn't used, instead it always prints to gStringVar4 // not an issue in practice since Gamefreak never used any other arguments here besides gStringVar4 #ifndef BUGFIX StringExpandPlaceholders(gStringVar4, gText_UR_AwaitingCommunication); #else StringExpandPlaceholders(dst, gText_UR_AwaitingCommunication); #endif break; } } void TryBecomeLinkLeader(void) { u8 taskId; struct WirelessLink_Leader * data; taskId = CreateTask(Task_TryBecomeLinkLeader, 0); sWirelessLinkMain.leader = data = (void *)(gTasks[taskId].data); sLeader = data; data->state = LL_STATE_INIT; data->textState = 0; gSpecialVar_Result = LINKUP_ONGOING; } static void Task_TryBecomeLinkLeader(u8 taskId) { u32 id, val; struct WirelessLink_Leader * data = sWirelessLinkMain.leader; switch (data->state) { case LL_STATE_INIT: sPlayerCurrActivity = sLinkGroupToActivityAndCapacity[gSpecialVar_0x8004]; sPlayerActivityGroupSize = sLinkGroupToActivityAndCapacity[gSpecialVar_0x8004] >> 8; SetHostRfuGameData(sPlayerCurrActivity, 0, 0); SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_LinkLeader(GROUP_MAX(sPlayerActivityGroupSize)); data->state = LL_STATE_INIT2; break; case LL_STATE_INIT2: data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); data->playerList = AllocZeroed(MAX_RFU_PLAYERS * sizeof(struct RfuPlayer)); data->playerListBackup = AllocZeroed(MAX_RFU_PLAYERS * sizeof(struct RfuPlayer)); ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX); ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYERS); CopyHostRfuGameDataAndUsername(&data->playerList->players[0].rfu.data, data->playerList->players[0].rfu.name); data->playerList->players[0].timeoutCounter = 0; data->playerList->players[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN; data->playerList->players[0].useRedText = FALSE; data->playerList->players[0].newPlayerCountdown = 0; data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, 0xFF); data->bButtonCancelWindowId = AddWindow(&sWindowTemplate_BButtonCancel); data->listWindowId = AddWindow(&sWindowTemplate_List_PossibleGroupMembers); data->nPlayerModeWindowId = AddWindow(&sWindowTemplate_NumPlayerMode); FillWindowPixelBuffer(data->bButtonCancelWindowId, PIXEL_FILL(2)); PrintUnionRoomText(data->bButtonCancelWindowId, FONT_SMALL, gText_UR_BButtonCancel, 8, 2, UR_COLOR_CANCEL); PutWindowTilemap(data->bButtonCancelWindowId); CopyWindowToVram(data->bButtonCancelWindowId, COPYWIN_GFX); DrawStdWindowFrame(data->listWindowId, FALSE); gMultiuseListMenuTemplate = sListMenuTemplate_PossibleGroupMembers; gMultiuseListMenuTemplate.windowId = data->listWindowId; data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); DrawStdWindowFrame(data->nPlayerModeWindowId, FALSE); PutWindowTilemap(data->nPlayerModeWindowId); CopyWindowToVram(data->nPlayerModeWindowId, COPYWIN_GFX); CopyBgTilemapBufferToVram(0); data->playerCount = 1; data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT; break; case LL_STATE_GET_AWAITING_PLAYERS_TEXT: StringCopy(gStringVar1, sLinkGroupActivityNameTexts[sPlayerCurrActivity]); if (GROUP_MIN(sPlayerActivityGroupSize) != 0) { if (data->playerCount > GROUP_MIN(sPlayerActivityGroupSize) - 1 && GROUP_MAX(sPlayerActivityGroupSize) != 0) StringExpandPlaceholders(gStringVar4, gText_UR_AwaitingLinkPressStart); else StringExpandPlaceholders(gStringVar4, gText_UR_AwaitingCommunication); } else { GetAwaitingCommunicationText(gStringVar4, sPlayerCurrActivity); } PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount); data->state = LL_STATE_PRINT_AWAITING_PLAYERS; break; case LL_STATE_PRINT_AWAITING_PLAYERS: if (PrintOnTextbox(&data->textState, gStringVar4)) data->state = LL_STATE_AWAIT_PLAYERS; break; case LL_STATE_AWAIT_PLAYERS: Leader_SetStateIfMemberListChanged(data, LL_STATE_ACCEPT_NEW_MEMBER_PROMPT, LL_STATE_MEMBER_LEFT); if (JOY_NEW(B_BUTTON)) { if (data->playerCount == 1) data->state = LL_STATE_SHUTDOWN_AND_FAIL; else if (GROUP_MIN2(sPlayerActivityGroupSize) != 0) data->state = LL_STATE_CANCEL_WITH_MSG; else data->state = LL_STATE_CANCEL_PROMPT; } if (GROUP_MIN(sPlayerActivityGroupSize) != 0 && data->playerCount > GROUP_MIN(sPlayerActivityGroupSize) - 1 && GROUP_MAX(sPlayerActivityGroupSize) != 0 && IsRfuCommunicatingWithAllChildren() && JOY_NEW(START_BUTTON)) { data->state = LL_STATE_MEMBERS_OK_PROMPT; LinkRfu_StopManagerAndFinalizeSlots(); } if (data->state == LL_STATE_AWAIT_PLAYERS && RfuTryDisconnectLeavingChildren()) { // At least 1 group member has left or is trying to leave data->state = LL_STATE_WAIT_DISCONNECT_CHILD; } break; case LL_STATE_WAIT_DISCONNECT_CHILD: // Resume after ensuring all members trying to leave have left if (!RfuTryDisconnectLeavingChildren()) { data->state = LL_STATE_AWAIT_PLAYERS; data->playerCount = LeaderPrunePlayerList(data->playerList); } break; case LL_STATE_MEMBER_LEFT: id = (GROUP_MAX(sPlayerCurrActivity) == 2) ? 1 : 0; if (PrintOnTextbox(&data->textState, gTexts_UR_PlayerUnavailable[id])) { data->playerCount = LeaderPrunePlayerList(data->playerList); RedrawListMenu(data->listTaskId); data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT; } break; case LL_STATE_MEMBER_DISCONNECTED: id = (GROUP_MAX(sPlayerActivityGroupSize) == 2) ? 0 : 1; if (PrintOnTextbox(&data->textState, gTexts_UR_PlayerUnavailable[id])) data->state = LL_STATE_SHUTDOWN_AND_RETRY; break; case LL_STATE_ACCEPT_NEW_MEMBER_PROMPT: if (PrintOnTextbox(&data->textState, gStringVar4)) data->state = LL_STATE_ACCEPT_NEW_MEMBER_PROMPT_HANDLE_INPUT; break; case LL_STATE_ACCEPT_NEW_MEMBER_PROMPT_HANDLE_INPUT: switch (UnionRoomHandleYesNo(&data->textState, HasTrainerLeftPartnersList( ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name))) { case 0: // YES LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_OK; SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name); data->state = LL_STATE_UPDATE_AFTER_JOIN_REQUEST; break; case 1: // NO case MENU_B_PRESSED: data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_NO; SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name); data->state = LL_STATE_UPDATE_AFTER_JOIN_REQUEST; break; case -3: data->state = LL_STATE_WAIT_DISCONNECT_CHILD; break; } break; case LL_STATE_UPDATE_AFTER_JOIN_REQUEST: val = WaitSendRfuStatusToPartner(ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name); if (val == 1) // Send complete { if (data->joinRequestAnswer == RFU_STATUS_JOIN_GROUP_OK) { // Sent "OK" data->playerList->players[data->playerCount].newPlayerCountdown = 0; RedrawListMenu(data->listTaskId); data->playerCount++; if (data->playerCount == GROUP_MAX(sPlayerActivityGroupSize)) { if (GROUP_MIN2(sPlayerActivityGroupSize) != 0 || data->playerCount == RFU_CHILD_MAX) { data->state = LL_STATE_MEMBERS_OK_PROMPT; } else { CopyAndTranslatePlayerName(gStringVar1, data->playerList->players[data->playerCount - 1]); StringExpandPlaceholders(gStringVar4, gText_UR_AnOKWasSentToPlayer); data->state = LL_STATE_ACCEPTED_FINAL_MEMBER; } LinkRfu_StopManagerAndFinalizeSlots(); PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount); } else { data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT; } } else // Member disconnected { RequestDisconnectSlotByTrainerNameAndId(data->playerList->players[data->playerCount].rfu.name, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId)); data->playerList->players[data->playerCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE; LeaderPrunePlayerList(data->playerList); RedrawListMenu(data->listTaskId); data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT; } data->joinRequestAnswer = 0; } else if (val == 2) { // Disconnect RfuSetStatus(RFU_STATUS_OK, 0); data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT; } break; case LL_STATE_ACCEPTED_FINAL_MEMBER: if (PrintOnTextbox(&data->textState, gStringVar4)) data->state = LL_STATE_WAIT_AND_CONFIRM_MEMBERS; break; case LL_STATE_WAIT_AND_CONFIRM_MEMBERS: if (++data->delayTimerAfterOk > 120) data->state = LL_STATE_CONFIRMED_MEMBERS; break; case LL_STATE_MEMBERS_OK_PROMPT: if (PrintOnTextbox(&data->textState, gText_UR_AreTheseMembersOK)) data->state = LL_STATE_MEMBERS_OK_PROMPT_HANDLE_INPUT; break; case LL_STATE_MEMBERS_OK_PROMPT_HANDLE_INPUT: switch (UnionRoomHandleYesNo(&data->textState, FALSE)) { case 0: // YES data->state = LL_STATE_CONFIRMED_MEMBERS; break; case 1: // NO case MENU_B_PRESSED: if (GROUP_MIN2(sPlayerActivityGroupSize) != 0) data->state = LL_STATE_CANCEL_WITH_MSG; else data->state = LL_STATE_CANCEL_PROMPT; break; } break; case LL_STATE_CANCEL_PROMPT: if (PrintOnTextbox(&data->textState, gText_UR_CancelModeWithTheseMembers)) data->state = LL_STATE_CANCEL_PROMPT_HANDLE_INPUT; break; case LL_STATE_CANCEL_PROMPT_HANDLE_INPUT: switch (UnionRoomHandleYesNo(&data->textState, FALSE)) { case 0: // YES data->state = LL_STATE_SHUTDOWN_AND_FAIL; break; case 1: // NO case MENU_B_PRESSED: if (GROUP_MIN2(sPlayerActivityGroupSize) != 0) data->state = LL_STATE_MEMBERS_OK_PROMPT; else if (data->playerCount == GROUP_MAX(sPlayerActivityGroupSize)) data->state = LL_STATE_MEMBERS_OK_PROMPT; else data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT; break; } break; case LL_STATE_CONFIRMED_MEMBERS: if (!Leader_SetStateIfMemberListChanged(data, LL_STATE_ACCEPT_NEW_MEMBER_PROMPT, LL_STATE_SHUTDOWN_AND_FAIL)) data->state = LL_STATE_FINAL_MEMBER_CHECK; break; case LL_STATE_FINAL_MEMBER_CHECK: if (LmanAcceptSlotFlagIsNotZero()) { if (WaitRfuState(FALSE)) { data->state = LL_STATE_TRY_START_ACTIVITY; } } else { data->state = LL_STATE_MEMBER_DISCONNECTED; data->textState = 0; } break; case LL_STATE_CANCEL_WITH_MSG: if (PrintOnTextbox(&data->textState, gText_UR_ModeWithTheseMembersWillBeCanceled)) data->state = LL_STATE_SHUTDOWN_AND_FAIL; break; case LL_STATE_SHUTDOWN_AND_RETRY: case LL_STATE_SHUTDOWN_AND_FAIL: // An error occurred. Please start over from the beginning. DestroyWirelessStatusIndicatorSprite(); LinkRfu_Shutdown(); Leader_DestroyResources(data); data->state++; // LL_STATE_RETRY or LL_STATE_FAILED break; case LL_STATE_FAILED: ScriptContext_Enable(); DestroyTask(taskId); gSpecialVar_Result = LINKUP_FAILED; break; case LL_STATE_RETRY: ScriptContext_Enable(); DestroyTask(taskId); gSpecialVar_Result = LINKUP_RETRY_ROLE_ASSIGN; break; case LL_STATE_TRY_START_ACTIVITY: if (RfuHasErrored()) { data->state = LL_STATE_MEMBER_DISCONNECTED; } else { if (gReceivedRemoteLinkPlayers) { UpdateGameData_GroupLockedIn(TRUE); CreateTask_RunScriptAndFadeToActivity(); Leader_DestroyResources(data); DestroyTask(taskId); } } break; } } static void Leader_DestroyResources(struct WirelessLink_Leader * data) { ClearWindowTilemap(data->nPlayerModeWindowId); ClearStdWindowAndFrame(data->nPlayerModeWindowId, FALSE); DestroyListMenuTask(data->listTaskId, 0, 0); ClearWindowTilemap(data->bButtonCancelWindowId); ClearStdWindowAndFrame(data->listWindowId, FALSE); CopyBgTilemapBufferToVram(0); RemoveWindow(data->nPlayerModeWindowId); RemoveWindow(data->listWindowId); RemoveWindow(data->bButtonCancelWindowId); DestroyTask(data->listenTaskId); Free(data->playerListBackup); Free(data->playerList); Free(data->incomingPlayerList); } static void Leader_GetAcceptNewMemberPrompt(u8 *dst, u8 activity) { switch (activity) { case ACTIVITY_BATTLE_SINGLE: case ACTIVITY_BATTLE_DOUBLE: case ACTIVITY_TRADE: StringExpandPlaceholders(dst, gText_UR_PlayerContactedYouForXAccept); break; case ACTIVITY_WONDER_CARD: case ACTIVITY_WONDER_NEWS: StringExpandPlaceholders(dst, gText_UR_PlayerContactedYouShareX); break; case ACTIVITY_BATTLE_MULTI: case ACTIVITY_POKEMON_JUMP: case ACTIVITY_BERRY_CRUSH: case ACTIVITY_BERRY_PICK: StringExpandPlaceholders(dst, gText_UR_PlayerContactedYouAddToMembers); break; } } static void GetYouDeclinedTheOfferMessage(u8 *dst, u8 activity) { switch (activity) { case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM: case ACTIVITY_TRADE | IN_UNION_ROOM: StringExpandPlaceholders(dst, gText_UR_OfferDeclined1); break; case ACTIVITY_CHAT | IN_UNION_ROOM: case ACTIVITY_CARD | IN_UNION_ROOM: StringExpandPlaceholders(dst, gText_UR_OfferDeclined2); break; } } static void GetYouAskedToJoinGroupPleaseWaitMessage(u8 *dst, u8 activity) { switch (activity) { case ACTIVITY_BATTLE_SINGLE: case ACTIVITY_BATTLE_DOUBLE: case ACTIVITY_TRADE: case ACTIVITY_WONDER_CARD: case ACTIVITY_WONDER_NEWS: StringExpandPlaceholders(dst, gText_UR_AwaitingPlayersResponse); break; case ACTIVITY_BATTLE_MULTI: case ACTIVITY_POKEMON_JUMP: case ACTIVITY_BERRY_CRUSH: case ACTIVITY_BERRY_PICK: StringExpandPlaceholders(dst, gText_UR_PlayerHasBeenAskedToRegisterYouPleaseWait); break; } } static void GetGroupLeaderSentAnOKMessage(u8 *dst, u8 caseId) { switch (caseId) { case ACTIVITY_BATTLE_SINGLE: case ACTIVITY_BATTLE_DOUBLE: case ACTIVITY_TRADE: case ACTIVITY_WONDER_CARD: case ACTIVITY_WONDER_NEWS: StringExpandPlaceholders(dst, gText_UR_PlayerSentBackOK); break; case ACTIVITY_BATTLE_MULTI: case ACTIVITY_POKEMON_JUMP: case ACTIVITY_BERRY_CRUSH: case ACTIVITY_BERRY_PICK: StringExpandPlaceholders(dst, gText_UR_PlayerOKdRegistration); break; } } static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader * data, u32 joinedState, u32 droppedState) { switch (LeaderUpdateGroupMembership(data->playerList)) { case UNION_ROOM_SPAWN_IN: PlaySE(SE_PC_LOGIN); RedrawListMenu(data->listTaskId); CopyAndTranslatePlayerName(gStringVar2, data->playerList->players[data->playerCount]); Leader_GetAcceptNewMemberPrompt(gStringVar4, sPlayerCurrActivity); data->state = joinedState; break; case UNION_ROOM_SPAWN_OUT: RfuSetStatus(RFU_STATUS_OK, 0); RedrawListMenu(data->listTaskId); data->state = droppedState; return TRUE; } return FALSE; } static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, u32 id, u8 y) { struct WirelessLink_Leader * data = sWirelessLinkMain.leader; u8 colorIdx = UR_COLOR_DEFAULT; switch (data->playerList->players[id].groupScheduledAnim) { case UNION_ROOM_SPAWN_IN: if (data->playerList->players[id].newPlayerCountdown != 0) colorIdx = UR_COLOR_GREEN; break; case UNION_ROOM_SPAWN_OUT: colorIdx = UR_COLOR_RED; break; } PrintGroupCandidateOnWindow(windowId, 0, y, &data->playerList->players[id], colorIdx, id); } static u8 LeaderUpdateGroupMembership(struct RfuPlayerList * list) { struct WirelessLink_Leader * data = sWirelessLinkMain.leader; u8 ret = UNION_ROOM_SPAWN_NONE; u8 i; s32 id; for (i = 1; i < MAX_RFU_PLAYERS; i++) { u16 var = data->playerList->players[i].groupScheduledAnim; if (var == UNION_ROOM_SPAWN_IN) { id = GetNewIncomingPlayerId(&data->playerList->players[i], data->incomingPlayerList->players); if (id != 0xFF) { // New incoming player data->playerList->players[i].rfu = data->incomingPlayerList->players[id].rfu; data->playerList->players[i].timeoutCounter = 1; } else { // No new incoming player data->playerList->players[i].groupScheduledAnim = UNION_ROOM_SPAWN_OUT; ret = UNION_ROOM_SPAWN_OUT; } } } for (id = 0; id < RFU_CHILD_MAX; id++) TryAddIncomingPlayerToList(data->playerList->players, &data->incomingPlayerList->players[id], MAX_RFU_PLAYERS); if (ret != UNION_ROOM_SPAWN_OUT) { for (id = 0; id < MAX_RFU_PLAYERS; id++) { if (data->playerList->players[id].newPlayerCountdown != 0) ret = UNION_ROOM_SPAWN_IN; } } return ret; } static u8 LeaderPrunePlayerList(struct RfuPlayerList * list) { struct WirelessLink_Leader * data = sWirelessLinkMain.leader; u8 copiedCount; s32 i; u8 playerCount; for (i = 0; i < MAX_RFU_PLAYERS; i++) data->playerListBackup->players[i] = data->playerList->players[i]; copiedCount = 0; for (i = 0; i < MAX_RFU_PLAYERS; i++) { if (data->playerListBackup->players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN) { data->playerList->players[copiedCount] = data->playerListBackup->players[i]; copiedCount++; } } playerCount = copiedCount; for (; copiedCount < MAX_RFU_PLAYERS; copiedCount++) { data->playerList->players[copiedCount].rfu = sRfuPlayerData_Dummy; data->playerList->players[copiedCount].timeoutCounter = 0; data->playerList->players[copiedCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE; data->playerList->players[copiedCount].useRedText = FALSE; data->playerList->players[copiedCount].newPlayerCountdown = 0; } for (i = 0; i < MAX_RFU_PLAYERS; i++) { if (data->playerList->players[i].groupScheduledAnim != UNION_ROOM_SPAWN_IN) continue; if (data->playerList->players[i].newPlayerCountdown != 64) continue; playerCount = i; break; } return playerCount; } void TryJoinLinkGroup(void) { u8 taskId; struct WirelessLink_Group * data; taskId = CreateTask(Task_TryJoinLinkGroup, 0); sWirelessLinkMain.group = data = (void *)(gTasks[taskId].data); sGroup = data; data->state = LG_STATE_INIT; data->textState = 0; gSpecialVar_Result = LINKUP_ONGOING; } static void Task_TryJoinLinkGroup(u8 taskId) { s32 id; struct WirelessLink_Group * data = sWirelessLinkMain.group; switch (data->state) { case LG_STATE_INIT: SetHostRfuGameData(sLinkGroupToURoomActivity[gSpecialVar_0x8004], 0, 0); sPlayerCurrActivity = sLinkGroupToURoomActivity[gSpecialVar_0x8004]; SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_JoinGroup(); data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); data->playerList = AllocZeroed(MAX_RFU_PLAYER_LIST_SIZE * sizeof(struct RfuPlayer)); data->state = LG_STATE_CHOOSE_LEADER_MSG; break; case LG_STATE_CHOOSE_LEADER_MSG: if (PrintOnTextbox(&data->textState, gTexts_UR_ChooseTrainer[gSpecialVar_0x8004])) data->state = LG_STATE_INIT_WINDOWS; break; case LG_STATE_INIT_WINDOWS: ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX); ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYER_LIST_SIZE); data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, gSpecialVar_0x8004); data->bButtonCancelWindowId = AddWindow(&sWindowTemplate_BButtonCancel); data->listWindowId = AddWindow(&sWindowTemplate_GroupList); data->playerNameAndIdWindowId = AddWindow(&sWindowTemplate_PlayerNameAndId); FillWindowPixelBuffer(data->bButtonCancelWindowId, PIXEL_FILL(2)); PrintUnionRoomText(data->bButtonCancelWindowId, FONT_SMALL, gText_UR_ChooseJoinCancel, 8, 2, UR_COLOR_CANCEL); PutWindowTilemap(data->bButtonCancelWindowId); CopyWindowToVram(data->bButtonCancelWindowId, COPYWIN_GFX); DrawStdWindowFrame(data->listWindowId, FALSE); gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups; gMultiuseListMenuTemplate.windowId = data->listWindowId; data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); DrawStdWindowFrame(data->playerNameAndIdWindowId, FALSE); PutWindowTilemap(data->playerNameAndIdWindowId); PrintPlayerNameAndIdOnWindow(data->playerNameAndIdWindowId); CopyWindowToVram(data->playerNameAndIdWindowId, COPYWIN_GFX); CopyBgTilemapBufferToVram(0); data->leaderId = 0; data->state = LG_STATE_CHOOSE_LEADER_HANDLE_INPUT; break; case LG_STATE_CHOOSE_LEADER_HANDLE_INPUT: id = GetNewLeaderCandidate(); switch (id) { case 1: PlaySE(SE_PC_LOGIN); RedrawListMenu(data->listTaskId); break; case 0: id = ListMenu_ProcessInput(data->listTaskId); if (JOY_NEW(A_BUTTON) && id != LIST_NOTHING_CHOSEN) { // this unused variable along with the assignment is needed to match u32 activity = data->playerList->players[id].rfu.data.activity; if (data->playerList->players[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->playerList->players[id].rfu.data.startedActivity) { u32 readyStatus = IsTryingToTradeAcrossVersionTooSoon(data, id); if (readyStatus == UR_TRADE_READY) { // Trading is allowed, or not trading at all AskToJoinRfuGroup(data, id); data->state = LG_STATE_ASK_JOIN_GROUP; PlaySE(SE_POKENAV_ON); } else { // Postgame flags not both set StringCopy(gStringVar4, gTexts_UR_CantTransmitToTrainer[readyStatus - 1]); data->state = LG_STATE_TRADE_NOT_READY; PlaySE(SE_POKENAV_ON); } } else { PlaySE(SE_WALL_HIT); } } else if (JOY_NEW(B_BUTTON)) { data->state = LG_STATE_CANCEL_CHOOSE_LEADER; } break; default: RedrawListMenu(data->listTaskId); break; } break; case LG_STATE_ASK_JOIN_GROUP: GetYouAskedToJoinGroupPleaseWaitMessage(gStringVar4, sPlayerCurrActivity); if (PrintOnTextbox(&data->textState, gStringVar4)) { CopyAndTranslatePlayerName(gStringVar1, data->playerList->players[data->leaderId]); data->state = LG_STATE_MAIN; } break; case LG_STATE_MAIN: if (gReceivedRemoteLinkPlayers) { sPlayerCurrActivity = data->playerList->players[data->leaderId].rfu.data.activity; RfuSetStatus(RFU_STATUS_OK, 0); switch (sPlayerCurrActivity) { case ACTIVITY_BATTLE_SINGLE: case ACTIVITY_BATTLE_DOUBLE: case ACTIVITY_BATTLE_MULTI: case ACTIVITY_TRADE: case ACTIVITY_CHAT: case ACTIVITY_POKEMON_JUMP: case ACTIVITY_BERRY_CRUSH: case ACTIVITY_BERRY_PICK: case ACTIVITY_SPIN_TRADE: case ACTIVITY_ITEM_TRADE: case ACTIVITY_WONDER_CARD: case ACTIVITY_WONDER_NEWS: data->state = LG_STATE_READY_START_ACTIVITY; break; } } switch (RfuGetStatus()) { case RFU_STATUS_FATAL_ERROR: data->state = LG_STATE_RFU_ERROR; break; case RFU_STATUS_CONNECTION_ERROR: case RFU_STATUS_JOIN_GROUP_NO: case RFU_STATUS_LEAVE_GROUP: data->state = LG_STATE_DISCONNECTED; break; case RFU_STATUS_JOIN_GROUP_OK: GetGroupLeaderSentAnOKMessage(gStringVar4, sPlayerCurrActivity); if (PrintOnTextbox(&data->textState, gStringVar4)) { RfuSetStatus(RFU_STATUS_WAIT_ACK_JOIN_GROUP, 0); StringCopy(gStringVar1, sLinkGroupActivityNameTexts[sPlayerCurrActivity]); StringExpandPlaceholders(gStringVar4, gText_UR_AwaitingOtherMembers); } break; case RFU_STATUS_WAIT_ACK_JOIN_GROUP: if (data->delayBeforePrint > 240) { if (PrintOnTextbox(&data->textState, gStringVar4)) { RfuSetStatus(RFU_STATUS_ACK_JOIN_GROUP, 0); data->delayBeforePrint = 0; } } else { data->delayBeforePrint++; } break; } if (RfuGetStatus() == RFU_STATUS_OK && JOY_NEW(B_BUTTON)) data->state = LG_STATE_ASK_LEAVE_GROUP; break; case LG_STATE_ASK_LEAVE_GROUP: if (PrintOnTextbox(&data->textState, gText_UR_QuitBeingMember)) data->state = LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT; break; case LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT: switch (UnionRoomHandleYesNo(&data->textState, RfuGetStatus())) { case 0: // YES SendLeaveGroupNotice(); data->state = LG_STATE_WAIT_LEAVE_GROUP; RedrawListMenu(data->listTaskId); break; case 1: // NO case MENU_B_PRESSED: data->state = LG_STATE_ASK_JOIN_GROUP; RedrawListMenu(data->listTaskId); break; case -3: data->state = LG_STATE_MAIN; RedrawListMenu(data->listTaskId); break; } break; case LG_STATE_WAIT_LEAVE_GROUP: if (RfuGetStatus()) data->state = LG_STATE_MAIN; break; case LG_STATE_CANCEL_CHOOSE_LEADER: // next: LG_STATE_CANCELED case LG_STATE_RFU_ERROR: // next: LG_STATE_RFU_ERROR_SHUTDOWN case LG_STATE_DISCONNECTED: // next: LG_STATE_RETRY_CONNECTION case LG_STATE_TRADE_NOT_READY: // next: LG_STATE_TRADE_NOT_READY_RETRY case LG_STATE_READY_START_ACTIVITY: // next: LG_STATE_START_ACTIVITY ClearWindowTilemap(data->playerNameAndIdWindowId); ClearStdWindowAndFrame(data->playerNameAndIdWindowId, FALSE); DestroyListMenuTask(data->listTaskId, 0, 0); ClearWindowTilemap(data->bButtonCancelWindowId); ClearStdWindowAndFrame(data->listWindowId, FALSE); CopyBgTilemapBufferToVram(0); RemoveWindow(data->playerNameAndIdWindowId); RemoveWindow(data->listWindowId); RemoveWindow(data->bButtonCancelWindowId); DestroyTask(data->listenTaskId); Free(data->playerList); Free(data->incomingPlayerList); data->state++; break; case LG_STATE_RFU_ERROR_SHUTDOWN: DestroyWirelessStatusIndicatorSprite(); if (PrintOnTextbox(&data->textState, gTexts_UR_PlayerDisconnected[RfuGetStatus()])) { gSpecialVar_Result = LINKUP_CONNECTION_ERROR; data->state = LG_STATE_SHUTDOWN; } break; case LG_STATE_CANCELED: DestroyWirelessStatusIndicatorSprite(); gSpecialVar_Result = LINKUP_FAILED; data->state = LG_STATE_SHUTDOWN; break; case LG_STATE_RETRY_CONNECTION: // Failure from disconnection // Happens if player or required member(s) leave group // or if player is rejected from joining group DestroyWirelessStatusIndicatorSprite(); if (PrintOnTextbox(&data->textState, gTexts_UR_PlayerDisconnected[RfuGetStatus()])) { gSpecialVar_Result = LINKUP_RETRY_ROLE_ASSIGN; data->state = LG_STATE_SHUTDOWN; } break; case LG_STATE_TRADE_NOT_READY_RETRY: if (PrintOnTextbox(&data->textState, gStringVar4)) { gSpecialVar_Result = LINKUP_RETRY_ROLE_ASSIGN; data->state = LG_STATE_SHUTDOWN; } break; case LG_STATE_SHUTDOWN: DestroyTask(taskId); JoinGroup_EnableScriptContexts(); LinkRfu_Shutdown(); break; case LG_STATE_START_ACTIVITY: CreateTask_RunScriptAndFadeToActivity(); DestroyTask(taskId); break; } } static u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group * data, s32 id) { struct RfuPlayer * partner = &data->playerList->players[id]; if (sPlayerCurrActivity == ACTIVITY_TRADE && partner->rfu.data.compatibility.version != VERSION_FIRE_RED && partner->rfu.data.compatibility.version != VERSION_LEAF_GREEN) { /* //This commented out should allow trading with RSE from the start if (!(gSaveBlock2Ptr->specialSaveWarpFlags & CHAMPION_SAVEWARP)) return UR_TRADE_PLAYER_NOT_READY; else if (partner->rfu.data.compatibility.canLinkNationally) return UR_TRADE_READY;*/ return UR_TRADE_READY; } else { return UR_TRADE_READY; } return UR_TRADE_PARTNER_NOT_READY; } static void AskToJoinRfuGroup(struct WirelessLink_Group * data, s32 id) { data->leaderId = id; LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); RedrawListMenu(data->listTaskId); CopyAndTranslatePlayerName(gStringVar1, data->playerList->players[data->leaderId]); UpdateGameData_SetActivity(sLinkGroupToURoomActivity[gSpecialVar_0x8004], 0, TRUE); CreateTask_RfuReconnectWithParent(data->playerList->players[data->leaderId].rfu.name, ReadAsU16(data->playerList->players[data->leaderId].rfu.data.compatibility.playerTrainerId)); } u8 CreateTask_ListenToWireless(void) { u8 taskId; struct WirelessLink_Group * data; taskId = CreateTask(Task_ListenToWireless, 0); sWirelessLinkMain.group = data = (void *)(gTasks[taskId].data); data->state = 0; data->textState = 0; sGroup = data; return taskId; } static void Task_ListenToWireless(u8 taskId) { struct WirelessLink_Group * data = sWirelessLinkMain.group; switch (data->state) { case 0: SetHostRfuGameData(ACTIVITY_NONE, 0, FALSE); SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_JoinGroup(); RfuSetIgnoreError(TRUE); data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); data->playerList = AllocZeroed(MAX_RFU_PLAYER_LIST_SIZE * sizeof(struct RfuPlayer)); data->state = 2; break; case 2: ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX); ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYER_LIST_SIZE); data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, 0xFF); data->leaderId = 0; data->state = 3; break; case 3: if (GetNewLeaderCandidate() == 1) PlaySE(SE_PC_LOGIN); if (gTasks[taskId].data[15] == 0xFF) data->state = 10; break; case 10: DestroyTask(data->listenTaskId); Free(data->playerList); Free(data->incomingPlayerList); LinkRfu_Shutdown(); data->state++; break; case 11: LinkRfu_Shutdown(); DestroyTask(taskId); break; } } static bool32 IsPartnerActivityAcceptable(u32 activity, u32 group) { if (group == 0xFF) return TRUE; #ifdef UBFIX if (group < ARRAY_COUNT(sAcceptedActivityIds)) #else if (group <= ARRAY_COUNT(sAcceptedActivityIds)) // UB: <= may access data outside the array #endif { const u8 *bytes = sAcceptedActivityIds[group]; while ((*(bytes) != 0xFF)) { if ((*bytes) == activity) return TRUE; bytes++; } } return FALSE; } static u8 GetGroupListTextColor(struct WirelessLink_Group * data, u32 id) { if (data->playerList->players[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN) { if (data->playerList->players[id].rfu.data.startedActivity) return UR_COLOR_WHITE; else if (data->playerList->players[id].useRedText) return UR_COLOR_RED; else if (data->playerList->players[id].newPlayerCountdown != 0) return UR_COLOR_GREEN; } return UR_COLOR_DEFAULT; } static void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, u32 id, u8 y) { struct WirelessLink_Group * data = sWirelessLinkMain.group; u8 colorId = GetGroupListTextColor(data, id); PrintGroupMemberOnWindow(windowId, 8, y, &data->playerList->players[id], colorId, id); } static u8 GetNewLeaderCandidate(void) { struct WirelessLink_Group * data = sWirelessLinkMain.group; u8 ret = 0; u8 i; s32 id; for (i = 0; i < MAX_RFU_PLAYER_LIST_SIZE; i++) { if (data->playerList->players[i].groupScheduledAnim != UNION_ROOM_SPAWN_NONE) { id = GetNewIncomingPlayerId(&data->playerList->players[i], data->incomingPlayerList->players); if (id != 0xFF) { if (data->playerList->players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN) { if (ArePlayerDataDifferent(&data->playerList->players[i].rfu, &data->incomingPlayerList->players[id].rfu)) { data->playerList->players[i].rfu = data->incomingPlayerList->players[id].rfu; data->playerList->players[i].newPlayerCountdown = 64; ret = 1; } else { if (data->playerList->players[i].newPlayerCountdown != 0) { data->playerList->players[i].newPlayerCountdown--; if (data->playerList->players[i].newPlayerCountdown == 0) ret = 2; } } } else { data->playerList->players[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN; data->playerList->players[i].newPlayerCountdown = 64; ret = 1; } data->playerList->players[i].timeoutCounter = 0; } else { if (data->playerList->players[i].groupScheduledAnim != UNION_ROOM_SPAWN_OUT) { data->playerList->players[i].timeoutCounter++; if (data->playerList->players[i].timeoutCounter >= 300) { data->playerList->players[i].groupScheduledAnim = UNION_ROOM_SPAWN_OUT; ret = 2; } } } } } for (id = 0; id < RFU_CHILD_MAX; id++) { if (TryAddIncomingPlayerToList(data->playerList->players, &data->incomingPlayerList->players[id], MAX_RFU_PLAYER_LIST_SIZE) != 0xFF) ret = 1; } return ret; } static void Task_CreateTradeMenu(u8 taskId) { CB2_StartCreateTradeMenu(); DestroyTask(taskId); } u8 CreateTask_CreateTradeMenu(void) { return CreateTask(Task_CreateTradeMenu, 0); } static void Task_StartUnionRoomTrade(u8 taskId) { u32 monId = GetPartyPositionOfRegisteredMon(&sUnionRoomTrade, GetMultiplayerId()); switch (gTasks[taskId].data[0]) { case 0: gTasks[taskId].data[0]++; SendBlock(0, &gPlayerParty[monId], sizeof(struct Pokemon)); break; case 1: if (GetBlockReceivedStatus() == 3) { gEnemyParty[0] = *(struct Pokemon *)(gBlockRecvBuffer[GetMultiplayerId() ^ 1]); IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES); ResetBlockReceivedFlags(); gTasks[taskId].data[0]++; } break; case 2: memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, sizeof(struct Mail) * PARTY_SIZE + 4); if (SendBlock(0, gBlockSendBuffer, sizeof(struct Mail) * PARTY_SIZE + 4)) gTasks[taskId].data[0]++; break; case 3: if (GetBlockReceivedStatus() == 3) { memcpy(gLinkPartnerMail, gBlockRecvBuffer[GetMultiplayerId() ^ 1], sizeof(struct Mail) * PARTY_SIZE); ResetBlockReceivedFlags(); gSelectedTradeMonPositions[TRADE_PLAYER] = monId; gSelectedTradeMonPositions[TRADE_PARTNER] = PARTY_SIZE; gMain.savedCallback = CB2_ReturnToField; SetMainCallback2(CB2_LinkTrade); ResetUnionRoomTrade(&sUnionRoomTrade); DestroyTask(taskId); } break; } } static void Task_ExchangeCards(u8 taskId) { switch (gTasks[taskId].data[0]) { case 0: if (GetMultiplayerId() == 0) SendBlockRequest(BLOCK_REQ_SIZE_100); gTasks[taskId].data[0]++; break; case 1: if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { s32 i; u16 *recvBuff; for (i = 0; i < GetLinkPlayerCount(); i++) { recvBuff = gBlockRecvBuffer[i]; CopyTrainerCardData(gTrainerCards[i], (struct TrainerCard *)recvBuff, gLinkPlayers[i].version); } if (GetLinkPlayerCount() == 2) { recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1]; MysteryGift_TryEnableStatsByFlagId(recvBuff[sizeof(struct TrainerCard) / 2]); } else { MysteryGift_DisableStats(); } ResetBlockReceivedFlags(); DestroyTask(taskId); } break; } } static void CB2_ShowCard(void) { switch (gMain.state) { case 0: CreateTask(Task_ExchangeCards, 5); gMain.state++; break; case 1: if (!FuncIsActiveTask(Task_ExchangeCards)) ShowTrainerCardInLink(GetMultiplayerId() ^ 1, CB2_ReturnToField); break; } RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); } void StartUnionRoomBattle(u16 battleFlags) { HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); gLinkPlayers[0].linkType = LINKTYPE_BATTLE; gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId(); gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1; gMain.savedCallback = CB2_ReturnFromCableClubBattle; gBattleTypeFlags = battleFlags; PlayBattleBGM(); } static void WarpForWirelessMinigame(u16 linkService, u16 x, u16 y) { VarSet(VAR_CABLE_CLUB_STATE, linkService); SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE, x, y); SetDynamicWarpWithCoords(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE, x, y); WarpIntoMap(); } static void WarpForCableClubActivity(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService) { gSpecialVar_0x8004 = linkService; VarSet(VAR_CABLE_CLUB_STATE, linkService); gFieldLinkPlayerCount = GetLinkPlayerCount(); gLocalLinkPlayerId = GetMultiplayerId(); SetCableClubWarp(); SetWarpDestination(mapGroup, mapNum, WARP_ID_NONE, x, y); WarpIntoMap(); } static void CB2_TransitionToCableClub(void) { switch (gMain.state) { case 0: CreateTask(Task_ExchangeCards, 5); gMain.state++; break; case 1: if (!FuncIsActiveTask(Task_ExchangeCards)) SetMainCallback2(CB2_ReturnToFieldCableClub); break; } RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); } static void CreateTrainerCardInBuffer(void *dest, bool32 setWonderCard) { TrainerCard_GenerateCardForLinkPlayer((struct TrainerCard * )dest); if (setWonderCard) *((u16 *)(dest + sizeof(struct TrainerCard))) = GetWonderCardFlagId(); else *((u16 *)(dest + sizeof(struct TrainerCard))) = 0; } static void Task_StartActivity(u8 taskId) { MysteryGift_DisableStats(); switch (sPlayerCurrActivity) { case ACTIVITY_BATTLE_SINGLE: case ACTIVITY_BATTLE_DOUBLE: case ACTIVITY_BATTLE_MULTI: case ACTIVITY_TRADE: case ACTIVITY_POKEMON_JUMP: case ACTIVITY_BERRY_CRUSH: case ACTIVITY_BERRY_PICK: case ACTIVITY_SPIN_TRADE: case ACTIVITY_ITEM_TRADE: SaveLinkTrainerNames(); break; } switch (sPlayerCurrActivity) { case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM: case ACTIVITY_ACCEPT | IN_UNION_ROOM: CleanupOverworldWindowsAndTilemaps(); gMain.savedCallback = CB2_UnionRoomBattle; InitChooseMonsForBattle(CHOOSE_MONS_FOR_UNION_ROOM_BATTLE); break; case ACTIVITY_BATTLE_SINGLE: CleanupOverworldWindowsAndTilemaps(); CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_BATTLE_DOUBLE: CleanupOverworldWindowsAndTilemaps(); HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_BATTLE_MULTI: CleanupOverworldWindowsAndTilemaps(); HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_TRADE: CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); CleanupOverworldWindowsAndTilemaps(); WarpForCableClubActivity(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_TRADE | IN_UNION_ROOM: CreateTask(Task_StartUnionRoomTrade, 0); break; case ACTIVITY_CHAT: case ACTIVITY_CHAT | IN_UNION_ROOM: if (GetMultiplayerId() == 0) { LinkRfu_CreateConnectionAsParent(); } else { LinkRfu_StopManagerBeforeEnteringChat(); SetHostRfuGameData(ACTIVITY_CHAT | IN_UNION_ROOM, 0, TRUE); } EnterUnionRoomChat(); break; case ACTIVITY_CARD: case ACTIVITY_CARD | IN_UNION_ROOM: CreateTrainerCardInBuffer(gBlockSendBuffer, FALSE); SetMainCallback2(CB2_ShowCard); break; case ACTIVITY_POKEMON_JUMP: WarpForWirelessMinigame(USING_MINIGAME, 5, 1); StartPokemonJump(GetCursorSelectionMonId(), CB2_LoadMap); break; case ACTIVITY_BERRY_CRUSH: WarpForWirelessMinigame(USING_BERRY_CRUSH, 9, 1); StartBerryCrush(CB2_LoadMap); break; case ACTIVITY_BERRY_PICK: WarpForWirelessMinigame(USING_MINIGAME, 5, 1); StartDodrioBerryPicking(GetCursorSelectionMonId(), CB2_LoadMap); break; } DestroyTask(taskId); gSpecialVar_Result = LINKUP_SUCCESS; UnlockPlayerFieldControls(); } static void Task_RunScriptAndFadeToActivity(u8 taskId) { s16 *data = gTasks[taskId].data; u16 *sendBuff = (u16 *)(gBlockSendBuffer); switch (data[0]) { case 0: gSpecialVar_Result = LINKUP_SUCCESS; ScriptContext_Enable(); data[0]++; break; case 1: if (!ScriptContext_IsEnabled()) { FadeScreen(FADE_TO_BLACK, 0); data[0]++; } break; case 2: if (!gPaletteFade.active) { SetLinkStandbyCallback(); data[0]++; } break; case 3: if (IsLinkTaskFinished()) { DestroyTask(taskId); CreateTask_StartActivity(); } break; } } static void CreateTask_RunScriptAndFadeToActivity(void) { CreateTask(Task_RunScriptAndFadeToActivity, 0); } static void CreateTask_StartActivity(void) { u8 taskId = CreateTask(Task_StartActivity, 0); gTasks[taskId].data[0] = 0; } // Sending Wonder Card/News void CreateTask_SendMysteryGift(u32 activity) { u8 taskId; struct WirelessLink_Leader * data; taskId = CreateTask(Task_SendMysteryGift, 0); sWirelessLinkMain.leader = data = (void *)(gTasks[taskId].data); data->state = 0; data->textState = 0; data->activity = activity; gSpecialVar_Result = LINKUP_ONGOING; } static void Task_SendMysteryGift(u8 taskId) { struct WirelessLink_Leader * data = sWirelessLinkMain.leader; struct WindowTemplate winTemplate; s32 val; switch (data->state) { case 0: sPlayerCurrActivity = data->activity; sPlayerActivityGroupSize = 2; SetHostRfuGameData(data->activity, 0, FALSE); SetHostRfuWonderFlags(FALSE, FALSE); SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_LinkLeader(2); data->state = 1; break; case 1: data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); data->playerList = AllocZeroed(MAX_RFU_PLAYERS * sizeof(struct RfuPlayer)); data->playerListBackup = AllocZeroed(MAX_RFU_PLAYERS * sizeof(struct RfuPlayer)); ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX); ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYERS); CopyHostRfuGameDataAndUsername(&data->playerList->players[0].rfu.data, data->playerList->players[0].rfu.name); data->playerList->players[0].timeoutCounter = 0; data->playerList->players[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN; data->playerList->players[0].useRedText = FALSE; data->playerList->players[0].newPlayerCountdown = 0; data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, 0xFF); winTemplate = sWindowTemplate_List_PossibleGroupMembers; winTemplate.baseBlock = GetMysteryGiftBaseBlock(); data->listWindowId = AddWindow(&winTemplate); MG_DrawTextBorder(data->listWindowId); gMultiuseListMenuTemplate = sListMenuTemplate_PossibleGroupMembers; gMultiuseListMenuTemplate.windowId = data->listWindowId; data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); CopyBgTilemapBufferToVram(0); data->playerCount = 1; data->state = 2; break; case 2: StringCopy(gStringVar1, sLinkGroupActivityNameTexts[sPlayerCurrActivity]); GetAwaitingCommunicationText(gStringVar4, sPlayerCurrActivity); data->state = 3; break; case 3: AddTextPrinterToWindow1(gStringVar4); data->state = 4; break; case 4: Leader_SetStateIfMemberListChanged(data, 5, 6); if (JOY_NEW(B_BUTTON)) { data->state = 13; DestroyWirelessStatusIndicatorSprite(); } break; case 6: if (PrintMysteryGiftMenuMessage(&data->textState, gText_UR_LinkWithFriendDropped)) { data->playerCount = LeaderPrunePlayerList(data->playerList); RedrawListMenu(data->listTaskId); data->state = 2; } break; case 5: data->state = 7; break; case 7: switch (DoMysteryGiftYesNo(&data->textState, &data->yesNoWindowId, FALSE, gStringVar4)) { case 0: LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); data->playerList->players[data->playerCount].newPlayerCountdown = 0; RedrawListMenu(data->listTaskId); data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_OK; SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name); data->state = 8; break; case 1: case MENU_B_PRESSED: data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_NO; SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name); data->state = 8; break; } break; case 8: val = WaitSendRfuStatusToPartner(ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name); if (val == 1) // Send complete { if (data->joinRequestAnswer == RFU_STATUS_JOIN_GROUP_OK) { data->playerList->players[data->playerCount].newPlayerCountdown = 0; RedrawListMenu(data->listTaskId); data->playerCount++; CopyAndTranslatePlayerName(gStringVar1, data->playerList->players[data->playerCount - 1]); StringExpandPlaceholders(gStringVar4, gText_UR_AnOKWasSentToPlayer); data->state = 9; LinkRfu_StopManagerAndFinalizeSlots(); } else { RequestDisconnectSlotByTrainerNameAndId(data->playerList->players[data->playerCount].rfu.name, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId)); data->playerList->players[data->playerCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE; LeaderPrunePlayerList(data->playerList); RedrawListMenu(data->listTaskId); data->state = 2; } data->joinRequestAnswer = 0; } else if (val == 2) // Member disconnected { RfuSetStatus(RFU_STATUS_OK, 0); data->state = 2; } break; case 9: AddTextPrinterToWindow1(gStringVar4); data->state = 10; break; case 10: if (++data->delayTimerAfterOk > 120) data->state = 11; break; case 11: if (!Leader_SetStateIfMemberListChanged(data, 5, 6)) data->state = 12; break; case 12: if (LmanAcceptSlotFlagIsNotZero()) { WaitRfuState(FALSE); data->state = 15; } else { data->state = 6; } break; case 13: DestroyWirelessStatusIndicatorSprite(); LinkRfu_Shutdown(); DestroyListMenuTask(data->listTaskId, 0, 0); CopyBgTilemapBufferToVram(0); RemoveWindow(data->listWindowId); DestroyTask(data->listenTaskId); Free(data->playerListBackup); Free(data->playerList); Free(data->incomingPlayerList); data->state++; break; case 14: // Please start over from the beginning. if (PrintMysteryGiftMenuMessage(&data->textState, gText_UR_PleaseStartOver)) { DestroyTask(taskId); gSpecialVar_Result = LINKUP_FAILED; } break; case 15: if (RfuGetStatus() == RFU_STATUS_FATAL_ERROR || RfuGetStatus() == RFU_STATUS_CONNECTION_ERROR) { data->state = 13; } else if (gReceivedRemoteLinkPlayers) { UpdateGameData_GroupLockedIn(TRUE); data->state++; } break; case 16: DestroyListMenuTask(data->listTaskId, 0, 0); CopyBgTilemapBufferToVram(0); RemoveWindow(data->listWindowId); DestroyTask(data->listenTaskId); Free(data->playerListBackup); Free(data->playerList); Free(data->incomingPlayerList); SetLinkStandbyCallback(); data->state++; break; case 17: if (IsLinkTaskFinished()) DestroyTask(taskId); break; } } void CreateTask_LinkMysteryGiftWithFriend(u32 activity) { u8 taskId; struct WirelessLink_Group * data; taskId = CreateTask(Task_CardOrNewsWithFriend, 0); sWirelessLinkMain.group = data = (void *)(gTasks[taskId].data); sGroup = data; data->state = 0; data->textState = 0; data->isWonderNews = activity - ACTIVITY_WONDER_CARD; // 0: Card; 1: News gSpecialVar_Result = LINKUP_ONGOING; } static void Task_CardOrNewsWithFriend(u8 taskId) { s32 id; struct WindowTemplate listWinTemplate; struct WirelessLink_Group * data = sWirelessLinkMain.group; switch (data->state) { case 0: SetHostRfuGameData(data->isWonderNews + ACTIVITY_WONDER_CARD, 0, FALSE); SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_JoinGroup(); data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); data->playerList = AllocZeroed(MAX_RFU_PLAYER_LIST_SIZE * sizeof(struct RfuPlayer)); data->state = 1; break; case 1: AddTextPrinterToWindow1(gText_UR_ChooseTrainer); data->state = 2; break; case 2: ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX); ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYER_LIST_SIZE); data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, data->isWonderNews + LINK_GROUP_WONDER_CARD); listWinTemplate = sWindowTemplate_GroupList; listWinTemplate.baseBlock = GetMysteryGiftBaseBlock(); data->listWindowId = AddWindow(&listWinTemplate); data->playerNameAndIdWindowId = AddWindow(&sWindowTemplate_PlayerNameAndId); MG_DrawTextBorder(data->listWindowId); gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups; gMultiuseListMenuTemplate.windowId = data->listWindowId; data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); MG_DrawTextBorder(data->playerNameAndIdWindowId); FillWindowPixelBuffer(data->playerNameAndIdWindowId, PIXEL_FILL(1)); PutWindowTilemap(data->playerNameAndIdWindowId); PrintPlayerNameAndIdOnWindow(data->playerNameAndIdWindowId); CopyWindowToVram(data->playerNameAndIdWindowId, COPYWIN_GFX); CopyBgTilemapBufferToVram(0); data->leaderId = 0; data->state = 3; break; case 3: id = GetNewLeaderCandidate(); switch (id) { case 1: PlaySE(SE_PC_LOGIN); default: RedrawListMenu(data->listTaskId); break; case 0: id = ListMenu_ProcessInput(data->listTaskId); if (JOY_NEW(A_BUTTON) && id != LIST_NOTHING_CHOSEN) { // this unused variable along with the assignment is needed to match u32 activity = data->playerList->players[id].rfu.data.activity; if (data->playerList->players[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->playerList->players[id].rfu.data.startedActivity) { data->leaderId = id; LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); RedrawListMenu(data->listTaskId); CopyAndTranslatePlayerName2(gStringVar1, data->playerList->players[data->leaderId]); CreateTask_RfuReconnectWithParent(data->playerList->players[data->leaderId].rfu.name, ReadAsU16(data->playerList->players[data->leaderId].rfu.data.compatibility.playerTrainerId)); PlaySE(SE_POKENAV_ON); data->state = 4; } else { PlaySE(SE_WALL_HIT); } } else if (JOY_NEW(B_BUTTON)) { data->state = 6; } break; } break; case 4: AddTextPrinterToWindow1(gText_UR_AwaitingPlayersResponse); CopyAndTranslatePlayerName2(gStringVar1, data->playerList->players[data->leaderId]); data->state = 5; break; case 5: if (gReceivedRemoteLinkPlayers) { sPlayerCurrActivity = data->playerList->players[data->leaderId].rfu.data.activity; data->state = 10; } switch (RfuGetStatus()) { case RFU_STATUS_FATAL_ERROR: case RFU_STATUS_CONNECTION_ERROR: case RFU_STATUS_JOIN_GROUP_NO: data->state = 8; break; case RFU_STATUS_JOIN_GROUP_OK: AddTextPrinterToWindow1(gText_UR_PlayerSentBackOK); RfuSetStatus(RFU_STATUS_OK, 0); break; } break; case 6: case 8: case 10: DestroyListMenuTask(data->listTaskId, 0, 0); CopyBgTilemapBufferToVram(0); RemoveWindow(data->playerNameAndIdWindowId); RemoveWindow(data->listWindowId); DestroyTask(data->listenTaskId); Free(data->playerList); Free(data->incomingPlayerList); data->state++; break; case 9: if (PrintMysteryGiftMenuMessage(&data->textState, gTexts_UR_LinkDropped[RfuGetStatus()])) { DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); LinkRfu_Shutdown(); gSpecialVar_Result = LINKUP_FAILED; } break; case 7: DestroyWirelessStatusIndicatorSprite(); AddTextPrinterToWindow1(gText_UR_PleaseStartOver); DestroyTask(taskId); LinkRfu_Shutdown(); gSpecialVar_Result = LINKUP_FAILED; break; case 11: data->state++; SetLinkStandbyCallback(); break; case 12: if (IsLinkTaskFinished()) DestroyTask(taskId); break; } } void CreateTask_LinkMysteryGiftOverWireless(u32 activity) { u8 taskId; struct WirelessLink_Group * data; taskId = CreateTask(Task_CardOrNewsOverWireless, 0); sWirelessLinkMain.group = data = (void *)(gTasks[taskId].data); sGroup = data; data->state = 0; data->textState = 0; data->isWonderNews = activity - ACTIVITY_WONDER_CARD; // 0: Card; 1: News gSpecialVar_Result = LINKUP_ONGOING; } static void Task_CardOrNewsOverWireless(u8 taskId) { s32 id; struct WindowTemplate winTemplate; struct WirelessLink_Group * data = sWirelessLinkMain.group; switch (data->state) { case 0: SetHostRfuGameData(ACTIVITY_NONE, 0, FALSE); SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_JoinGroup(); data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); data->playerList = AllocZeroed(MAX_RFU_PLAYER_LIST_SIZE * sizeof(struct RfuPlayer)); data->state = 1; break; case 1: AddTextPrinterToWindow1(gText_UR_SearchingForWirelessSystemWait); data->state = 2; break; case 2: ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX); ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYER_LIST_SIZE); data->listenTaskId = CreateTask_ListenForWonderDistributor(data->incomingPlayerList, data->isWonderNews + LINK_GROUP_WONDER_CARD); if (data->showListMenu) { winTemplate = sWindowTemplate_GroupList; winTemplate.baseBlock = GetMysteryGiftBaseBlock(); data->listWindowId = AddWindow(&winTemplate); MG_DrawTextBorder(data->listWindowId); gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups; gMultiuseListMenuTemplate.windowId = data->listWindowId; data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); CopyBgTilemapBufferToVram(0); } data->leaderId = 0; data->state = 3; break; case 3: id = GetNewLeaderCandidate(); switch (id) { case 1: PlaySE(SE_PC_LOGIN); default: if (data->showListMenu) RedrawListMenu(data->listTaskId); break; case 0: if (data->showListMenu) id = ListMenu_ProcessInput(data->listTaskId); if (data->refreshTimer > 120) { if (data->playerList->players[0].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->playerList->players[0].rfu.data.startedActivity) { if (HasWonderCardOrNewsByLinkGroup(&data->playerList->players[0].rfu.data, data->isWonderNews + LINK_GROUP_WONDER_CARD)) { data->leaderId = 0; data->refreshTimer = 0; LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); CreateTask_RfuReconnectWithParent(data->playerList->players[0].rfu.name, ReadAsU16(data->playerList->players[0].rfu.data.compatibility.playerTrainerId)); PlaySE(SE_POKENAV_ON); data->state = 4; } else { PlaySE(SE_BOO); data->state = 10; } } } else if (JOY_NEW(B_BUTTON)) { data->state = 6; data->refreshTimer = 0; } data->refreshTimer++; break; } break; case 4: AddTextPrinterToWindow1(gText_UR_AwaitingResponseFromWirelessSystem); CopyAndTranslatePlayerName2(gStringVar1, data->playerList->players[data->leaderId]); data->state = 5; break; case 5: if (gReceivedRemoteLinkPlayers) { sPlayerCurrActivity = data->playerList->players[data->leaderId].rfu.data.activity; data->state = 12; } switch (RfuGetStatus()) { case RFU_STATUS_FATAL_ERROR: case RFU_STATUS_CONNECTION_ERROR: case RFU_STATUS_JOIN_GROUP_NO: data->state = 8; break; case RFU_STATUS_JOIN_GROUP_OK: AddTextPrinterToWindow1(gText_UR_WirelessLinkEstablished); RfuSetStatus(RFU_STATUS_OK, 0); break; } break; case 6: case 8: case 10: case 12: if (data->showListMenu) { DestroyListMenuTask(data->listTaskId, 0, 0); CopyBgTilemapBufferToVram(0); RemoveWindow(data->listWindowId); } DestroyTask(data->listenTaskId); Free(data->playerList); Free(data->incomingPlayerList); data->state++; break; case 9: if (PrintMysteryGiftMenuMessage(&data->textState, gText_UR_WirelessLinkDropped)) { DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); LinkRfu_Shutdown(); gSpecialVar_Result = LINKUP_FAILED; } break; case 7: if (PrintMysteryGiftMenuMessage(&data->textState, gText_UR_WirelessSearchCanceled)) { DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); LinkRfu_Shutdown(); gSpecialVar_Result = LINKUP_FAILED; } break; case 11: if (PrintMysteryGiftMenuMessage(&data->textState, gTexts_UR_NoWonderShared[data->isWonderNews])) { DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); LinkRfu_Shutdown(); gSpecialVar_Result = 5; } break; case 13: data->state++; SetLinkStandbyCallback(); break; case 14: if (IsLinkTaskFinished()) DestroyTask(taskId); break; } } void RunUnionRoom(void) { struct WirelessLink_URoom * uroom; ResetHostRfuGameData(); CreateTask(Task_RunUnionRoom, 10); // dumb line needed to match sWirelessLinkMain.uRoom = sWirelessLinkMain.uRoom; uroom = AllocZeroed(sizeof(*sWirelessLinkMain.uRoom)); sWirelessLinkMain.uRoom = uroom; sURoom = uroom; uroom->state = UR_STATE_INIT; uroom->textState = 0; uroom->unknown = 0; uroom->unreadPlayerId = 0; gSpecialVar_Result = 0; ListMenuLoadStdPalAt(BG_PLTT_ID(13), 1); } static u16 ReadAsU16(const u8 *ptr) { return (ptr[1] << 8) | (ptr[0]); } static void ScheduleFieldMessageWithFollowupState(u32 nextState, const u8 *src) { struct WirelessLink_URoom * uroom = sWirelessLinkMain.uRoom; uroom->state = UR_STATE_PRINT_MSG; uroom->stateAfterPrint = nextState; if (src != gStringVar4) StringExpandPlaceholders(gStringVar4, src); } static void ScheduleFieldMessageAndExit(const u8 *src) { struct WirelessLink_URoom * uroom = sWirelessLinkMain.uRoom; uroom->state = UR_STATE_PRINT_AND_EXIT; if (src != gStringVar4) StringExpandPlaceholders(gStringVar4, src); } static void CopyPlayerListToBuffer(struct WirelessLink_URoom * uroom) { memcpy(&gDecompressionBuffer[sizeof(gDecompressionBuffer) - (MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer))], uroom->playerList, MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer)); } static void CopyPlayerListFromBuffer(struct WirelessLink_URoom * uroom) { memcpy(uroom->playerList, &gDecompressionBuffer[sizeof(gDecompressionBuffer) - (MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer))], MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer)); } static void Task_RunUnionRoom(u8 taskId) { u32 id = 0; s32 input = 0; s32 playerGender = MALE; struct WirelessLink_URoom * uroom = sWirelessLinkMain.uRoom; s16 *taskData = gTasks[taskId].data; switch (uroom->state) { case UR_STATE_INIT: uroom->incomingChildList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); uroom->incomingParentList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); uroom->playerList = AllocZeroed(MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer)); uroom->spawnPlayer = AllocZeroed(sizeof(struct RfuPlayer)); ClearRfuPlayerList(uroom->playerList->players, MAX_UNION_ROOM_LEADERS); sPlayerCurrActivity = IN_UNION_ROOM; uroom->searchTaskId = CreateTask_SearchForChildOrParent(uroom->incomingParentList, uroom->incomingChildList, LINK_GROUP_UNION_ROOM_RESUME); InitUnionRoomPlayerObjects(uroom->objects); MakeGroupAssemblyAreasPassable(); uroom->state = UR_STATE_INIT_OBJECTS; break; case UR_STATE_INIT_OBJECTS: CreateUnionRoomPlayerSprites(uroom->spriteIds, taskData[0]); if (++taskData[0] == MAX_UNION_ROOM_LEADERS) uroom->state = UR_STATE_INIT_LINK; break; case UR_STATE_INIT_LINK: SetHostRfuGameData(IN_UNION_ROOM, 0, FALSE); SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_EnterUnionRoom(); ClearRfuPlayerList(&uroom->spawnPlayer->players[0], 1); ClearIncomingPlayerList(uroom->incomingChildList->players, RFU_CHILD_MAX); ClearIncomingPlayerList(uroom->incomingParentList->players, RFU_CHILD_MAX); gSpecialVar_Result = 0; uroom->state = UR_STATE_CHECK_SELECTING_MON; break; case UR_STATE_CHECK_SELECTING_MON: if ((GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_REGISTER || GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_TRADE) && sUnionRoomTrade.state != URTRADE_STATE_NONE) { id = GetCursorSelectionMonId(); switch (sUnionRoomTrade.state) { case URTRADE_STATE_REGISTERING: UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); if (id >= PARTY_SIZE) { ResetUnionRoomTrade(&sUnionRoomTrade); SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); ScheduleFieldMessageAndExit(gText_UR_RegistrationCanceled); } else if (!RegisterTradeMonAndGetIsEgg(GetCursorSelectionMonId(), &sUnionRoomTrade)) { ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_REQUEST_TYPE, gText_UR_ChooseRequestedMonType); } else { uroom->state = UR_STATE_REGISTER_COMPLETE; } break; case URTRADE_STATE_OFFERING: CopyPlayerListFromBuffer(uroom); taskData[1] = sUnionRoomTrade.offerPlayerId; if (id >= PARTY_SIZE) { ScheduleFieldMessageAndExit(gText_UR_TradeCanceled); } else { UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); sPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM; RegisterTradeMon(GetCursorSelectionMonId(), &sUnionRoomTrade); uroom->state = UR_STATE_TRADE_OFFER_MON; } break; } sUnionRoomTrade.state = URTRADE_STATE_NONE; } else { uroom->state = UR_STATE_MAIN; } break; case UR_STATE_MAIN: if (gSpecialVar_Result != 0) { if (gSpecialVar_Result == UR_INTERACT_ATTENDANT) { UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); PlaySE(SE_PC_LOGIN); StringCopy(gStringVar1, gSaveBlock2Ptr->playerName); uroom->state = UR_STATE_INTERACT_WITH_ATTENDANT; gSpecialVar_Result = 0; } else if (gSpecialVar_Result == UR_INTERACT_START_MENU) { UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); uroom->state = UR_STATE_WAIT_FOR_START_MENU; gSpecialVar_Result = 0; } else // UR_INTERACT_PLAYER_# (1-8) { taskData[0] = 0; taskData[1] = gSpecialVar_Result - 1; uroom->state = UR_STATE_INTERACT_WITH_PLAYER; gSpecialVar_Result = 0; } } else if (ArePlayerFieldControlsLocked() != TRUE) { if (JOY_NEW(A_BUTTON)) { if (TryInteractWithUnionRoomMember(uroom->playerList, &taskData[0], &taskData[1], uroom->spriteIds)) { PlaySE(SE_SELECT); StartScriptInteraction(); uroom->state = UR_STATE_INTERACT_WITH_PLAYER; break; } else if (IsPlayerFacingTradingBoard()) { UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); PlaySE(SE_PC_LOGIN); StartScriptInteraction(); StringCopy(gStringVar1, gSaveBlock2Ptr->playerName); uroom->state = UR_STATE_CHECK_TRADING_BOARD; break; } } switch (HandlePlayerListUpdate()) { case PLIST_NEW_PLAYER: PlaySE(SE_NOTE_C); case PLIST_RECENT_UPDATE: ScheduleUnionRoomPlayerRefresh(uroom); break; case PLIST_CONTACTED: uroom->state = UR_STATE_PLAYER_CONTACTED_YOU; StartScriptInteraction(); SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); UpdateGameData_SetActivity(ACTIVITY_NPCTALK | IN_UNION_ROOM, GetActivePartnersInfo(uroom), FALSE); break; } HandleUnionRoomPlayerRefresh(uroom); } break; case UR_STATE_WAIT_FOR_START_MENU: if (!FuncIsActiveTask(Task_StartMenuHandleInput)) { UpdateGameData_SetActivity(ACTIVITY_NONE | IN_UNION_ROOM, 0, FALSE); uroom->state = UR_STATE_MAIN; } break; case UR_STATE_INTERACT_WITH_PLAYER: UR_RunTextPrinters(); playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList); UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); switch (UnionRoomGetPlayerInteractionResponse(uroom->playerList, taskData[0], taskData[1], playerGender)) { case 0: // Player is or was just doing an activity uroom->state = UR_STATE_PRINT_AND_EXIT; break; case 1: // Link communicating TryConnectToUnionRoomParent(uroom->playerList->players[taskData[1]].rfu.name, &uroom->playerList->players[taskData[1]].rfu.data, sPlayerCurrActivity); uroom->unreadPlayerId = id; // Should be just 0, but won't match any other way. uroom->state = UR_STATE_TRY_COMMUNICATING; break; case 2: // Ask to join chat ScheduleFieldMessageWithFollowupState(UR_STATE_RECV_JOIN_CHAT_REQUEST, gStringVar4); break; } break; case UR_STATE_TRY_COMMUNICATING: UR_RunTextPrinters(); switch (RfuGetStatus()) { case RFU_STATUS_NEW_CHILD_DETECTED: HandleCancelActivity(TRUE); uroom->state = UR_STATE_MAIN; break; case RFU_STATUS_FATAL_ERROR: case RFU_STATUS_CONNECTION_ERROR: if (IsUnionRoomListenTaskActive() == TRUE) ScheduleFieldMessageAndExit(gText_UR_TrainerAppearsBusy); else ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, gText_UR_TrainerAppearsBusy); sPlayerCurrActivity = IN_UNION_ROOM; break; } if (gReceivedRemoteLinkPlayers) { CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); CreateTask(Task_ExchangeCards, 5); uroom->state = UR_STATE_COMMUNICATING_WAIT_FOR_DATA; } break; case UR_STATE_COMMUNICATING_WAIT_FOR_DATA: if (!FuncIsActiveTask(Task_ExchangeCards)) { if (sPlayerCurrActivity == (ACTIVITY_TRADE | IN_UNION_ROOM)) ScheduleFieldMessageWithFollowupState(UR_STATE_SEND_TRADE_REQUST, gText_UR_AwaitingPlayersResponseAboutTrade); else uroom->state = UR_STATE_DO_SOMETHING_PROMPT; } break; case UR_STATE_CANCEL_ACTIVITY_LINK_ERROR: if (!gReceivedRemoteLinkPlayers) { HandleCancelActivity(FALSE); UpdateUnionRoomMemberFacing(taskData[0], taskData[1], uroom->playerList); uroom->state = UR_STATE_INIT_LINK; } break; case UR_STATE_DO_SOMETHING_PROMPT: id = ConvPartnerUnameAndGetWhetherMetAlready(&uroom->playerList->players[taskData[1]]); playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList); ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT, gTexts_UR_HiDoSomething[id][playerGender]); break; case UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT: input = ListMenuHandler_AllItemsAvailable(&uroom->textState, &uroom->topListMenuWindowId, &uroom->topListMenuId, &sWindowTemplate_InviteToActivity, &sListMenuTemplate_InviteToActivity); if (input != LIST_NOTHING_CHOSEN) { if (!gReceivedRemoteLinkPlayers) { uroom->state = UR_STATE_TRAINER_APPEARS_BUSY; } else { uroom->partnerYesNoResponse = 0; playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList); if (input == LIST_CANCEL || input == IN_UNION_ROOM) { uroom->playerSendBuffer[0] = IN_UNION_ROOM; Rfu_SendPacket(uroom->playerSendBuffer); StringCopy(gStringVar4, gTexts_UR_IfYouWantToDoSomething[gLinkPlayers[0].gender]); uroom->state = UR_STATE_REQUEST_DECLINED; } else { sPlayerCurrActivity = input; sPlayerActivityGroupSize = (u32)(input) >> 8; // Extract capacity from sInviteToActivityMenuItems if (sPlayerCurrActivity == (ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM) && !HasAtLeastTwoMonsOfLevel30OrLower()) { ScheduleFieldMessageWithFollowupState(UR_STATE_DO_SOMETHING_PROMPT, gText_UR_NeedTwoMonsOfLevel30OrLower1); } else { uroom->playerSendBuffer[0] = sPlayerCurrActivity | IN_UNION_ROOM; Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_SEND_ACTIVITY_REQUEST; } } } } break; case UR_STATE_TRAINER_APPEARS_BUSY: StringCopy(gStringVar4, gText_UR_TrainerBattleBusy); uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; break; case UR_STATE_SEND_ACTIVITY_REQUEST: PollPartnerYesNoResponse(uroom); playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList); id = GetResponseIdx_InviteToURoomActivity(uroom->playerSendBuffer[0] & 0x3F); if (PrintOnTextbox(&uroom->textState, gTexts_UR_WaitOrShowCard[playerGender][id])) { taskData[3] = 0; uroom->state = UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST; } break; case UR_STATE_REQUEST_DECLINED: SetCloseLinkCallback(); uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; break; case UR_STATE_SEND_TRADE_REQUST: uroom->playerSendBuffer[0] = ACTIVITY_TRADE | IN_UNION_ROOM; uroom->playerSendBuffer[1] = sUnionRoomTrade.species; uroom->playerSendBuffer[2] = sUnionRoomTrade.level; Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST; break; case UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST: if (!gReceivedRemoteLinkPlayers) { StringCopy(gStringVar4, gText_UR_TrainerBattleBusy); uroom->state = UR_STATE_TRAINER_APPEARS_BUSY; } else { PollPartnerYesNoResponse(uroom); if (uroom->partnerYesNoResponse == (ACTIVITY_ACCEPT | IN_UNION_ROOM)) { if (sPlayerCurrActivity == ACTIVITY_CARD) { ViewURoomPartnerTrainerCard(gStringVar4, uroom, MODE_CHILD); uroom->state = UR_STATE_PRINT_CARD_INFO; } else { uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG; } } else if (uroom->partnerYesNoResponse == (ACTIVITY_DECLINE | IN_UNION_ROOM)) { uroom->state = UR_STATE_REQUEST_DECLINED; GetURoomActivityRejectMsg(gStringVar4, sPlayerCurrActivity | IN_UNION_ROOM, gLinkPlayers[0].gender); sPlayerCurrActivity = ACTIVITY_NONE; } } break; case UR_STATE_DO_SOMETHING_PROMPT_2: id = ConvPartnerUnameAndGetWhetherMetAlready(&uroom->playerList->players[taskData[1]]); playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList); ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT, gTexts_UR_HiDoSomething[id][playerGender]); break; case UR_STATE_PRINT_CARD_INFO: if (PrintOnTextbox(&uroom->textState, gStringVar4)) { uroom->state = UR_STATE_WAIT_FINISH_READING_CARD; SetLinkStandbyCallback(); uroom->partnerYesNoResponse = 0; uroom->recvActivityRequest[0] = 0; } break; case UR_STATE_WAIT_FINISH_READING_CARD: if (IsLinkTaskFinished()) { if (GetMultiplayerId() == 0) { StringCopy(gStringVar1, gLinkPlayers[GetMultiplayerId() ^ 1].name); id = PlayerHasMetTrainerBefore(gLinkPlayers[1].trainerId, gLinkPlayers[1].name); StringExpandPlaceholders(gStringVar4, gTexts_UR_AwaitingResponse[id]); uroom->state = UR_STATE_PRINT_CONTACT_MSG; } else { uroom->state = UR_STATE_DO_SOMETHING_PROMPT_2; } } break; case UR_STATE_RECV_JOIN_CHAT_REQUEST: switch (UnionRoomHandleYesNo(&uroom->textState, FALSE)) { case 0: // YES CopyBgTilemapBufferToVram(0); sPlayerCurrActivity = ACTIVITY_CHAT | IN_UNION_ROOM; UpdateGameData_SetActivity(ACTIVITY_CHAT | IN_UNION_ROOM, 0, TRUE); TryConnectToUnionRoomParent(uroom->playerList->players[taskData[1]].rfu.name, &uroom->playerList->players[taskData[1]].rfu.data, sPlayerCurrActivity); uroom->unreadPlayerId = taskData[1]; uroom->state = UR_STATE_TRY_ACCEPT_CHAT_REQUEST_DELAY; taskData[3] = 0; break; case 1: // NO case MENU_B_PRESSED: playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList); ScheduleFieldMessageAndExit(gTexts_UR_DeclineChat[playerGender]); break; } break; case UR_STATE_TRY_ACCEPT_CHAT_REQUEST_DELAY: if (++taskData[2] > 60) { uroom->state = UR_STATE_TRY_ACCEPT_CHAT_REQUEST; taskData[2] = 0; } break; case UR_STATE_TRY_ACCEPT_CHAT_REQUEST: switch (RfuGetStatus()) { case RFU_STATUS_NEW_CHILD_DETECTED: HandleCancelActivity(TRUE); uroom->state = UR_STATE_MAIN; break; case RFU_STATUS_FATAL_ERROR: case RFU_STATUS_CONNECTION_ERROR: playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList); UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); if (IsUnionRoomListenTaskActive() == TRUE) ScheduleFieldMessageAndExit(gTexts_UR_ChatDeclined[playerGender]); else ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, gTexts_UR_ChatDeclined[playerGender]); break; case RFU_STATUS_CHILD_SEND_COMPLETE: uroom->state = UR_STATE_ACCEPT_CHAT_REQUEST; break; } taskData[3]++; break; case UR_STATE_ACCEPT_CHAT_REQUEST: if (RfuHasErrored()) { playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList); UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); if (IsUnionRoomListenTaskActive() == TRUE) ScheduleFieldMessageAndExit(gTexts_UR_ChatDeclined[playerGender]); else ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, gTexts_UR_ChatDeclined[playerGender]); } if (gReceivedRemoteLinkPlayers) uroom->state = UR_STATE_START_ACTIVITY_FREE_UROOM; break; case UR_STATE_PLAYER_CONTACTED_YOU: PlaySE(SE_DING_DONG); StopUnionRoomLinkManager(); uroom->state = UR_STATE_RECV_CONTACT_DATA; uroom->recvActivityRequest[0] = 0; break; case UR_STATE_RECV_CONTACT_DATA: if (RfuHasErrored()) { HandleCancelActivity(FALSE); uroom->state = UR_STATE_INIT_LINK; } else if (gReceivedRemoteLinkPlayers) { CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); CreateTask(Task_ExchangeCards, 5); uroom->state = UR_STATE_WAIT_FOR_CONTACT_DATA; } break; case UR_STATE_WAIT_FOR_CONTACT_DATA: ReceiveUnionRoomActivityPacket(uroom); if (!FuncIsActiveTask(Task_ExchangeCards)) { uroom->state = UR_STATE_PRINT_CONTACT_MSG; StringCopy(gStringVar1, gLinkPlayers[1].name); id = PlayerHasMetTrainerBefore(gLinkPlayers[1].trainerId, gLinkPlayers[1].name); StringExpandPlaceholders(gStringVar4, gTexts_UR_PlayerContactedYou[id]); } break; case UR_STATE_PRINT_CONTACT_MSG: ReceiveUnionRoomActivityPacket(uroom); if (PrintOnTextbox(&uroom->textState, gStringVar4)) uroom->state = UR_STATE_HANDLE_CONTACT_DATA; break; case UR_STATE_HANDLE_CONTACT_DATA: ReceiveUnionRoomActivityPacket(uroom); if (HandleContactFromOtherPlayer(uroom) && JOY_NEW(B_BUTTON)) { Rfu_DisconnectPlayerById(1); StringCopy(gStringVar4, gText_UR_ChatEnded); uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; } break; case UR_STATE_RECV_ACTIVITY_REQUEST: ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_ACTIVITY_REQUEST, gStringVar4); break; case UR_STATE_HANDLE_ACTIVITY_REQUEST: switch (UnionRoomHandleYesNo(&uroom->textState, FALSE)) { case 0: // ACCEPT uroom->playerSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM; if (sPlayerCurrActivity == (ACTIVITY_CHAT | IN_UNION_ROOM)) UpdateGameData_SetActivity(sPlayerCurrActivity | IN_UNION_ROOM, GetLinkPlayerInfoFlags(1), FALSE); else UpdateGameData_SetActivity(sPlayerCurrActivity | IN_UNION_ROOM, GetLinkPlayerInfoFlags(1), TRUE); uroom->spawnPlayer->players[0].newPlayerCountdown = 0; taskData[3] = 0; if (sPlayerCurrActivity == (ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM)) { if (!HasAtLeastTwoMonsOfLevel30OrLower()) { uroom->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM; Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_DECLINE_ACTIVITY_REQUEST; StringCopy(gStringVar4, gText_UR_NeedTwoMonsOfLevel30OrLower2); } else { Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG; } } else if (sPlayerCurrActivity == (ACTIVITY_CARD | IN_UNION_ROOM)) { Rfu_SendPacket(uroom->playerSendBuffer); ViewURoomPartnerTrainerCard(gStringVar4, uroom, MODE_PARENT); uroom->state = UR_STATE_PRINT_CARD_INFO; } else { Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG; } break; case 1: // DECLINE case MENU_B_PRESSED: uroom->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM; Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_DECLINE_ACTIVITY_REQUEST; GetYouDeclinedTheOfferMessage(gStringVar4, sPlayerCurrActivity); break; } break; case UR_STATE_DECLINE_ACTIVITY_REQUEST: SetCloseLinkCallback(); uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; break; case UR_STATE_CANCEL_REQUEST_PRINT_MSG: if (!gReceivedRemoteLinkPlayers) { sPlayerCurrActivity = IN_UNION_ROOM; ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_REQUEST_RESTART_LINK, gStringVar4); memset(uroom->playerSendBuffer, 0, sizeof(uroom->playerSendBuffer)); uroom->recvActivityRequest[0] = 0; uroom->partnerYesNoResponse = 0; } break; case UR_STATE_CANCEL_REQUEST_RESTART_LINK: uroom->state = UR_STATE_INIT_LINK; HandleCancelActivity(FALSE); break; case UR_STATE_PRINT_START_ACTIVITY_MSG: GetURoomActivityStartMsg(gStringVar4, sPlayerCurrActivity | IN_UNION_ROOM); ScheduleFieldMessageWithFollowupState(UR_STATE_START_ACTIVITY_LINK, gStringVar4); break; case UR_STATE_START_ACTIVITY_LINK: SetLinkStandbyCallback(); uroom->state = UR_STATE_START_ACTIVITY_WAIT_FOR_LINK; break; case UR_STATE_START_ACTIVITY_WAIT_FOR_LINK: if (IsLinkTaskFinished()) uroom->state = UR_STATE_START_ACTIVITY_FREE_UROOM; break; case UR_STATE_START_ACTIVITY_FREE_UROOM: Free(uroom->spawnPlayer); Free(uroom->playerList); Free(uroom->incomingParentList); Free(uroom->incomingChildList); DestroyTask(uroom->searchTaskId); DestroyUnionRoomPlayerSprites(uroom->spriteIds); uroom->state = UR_STATE_START_ACTIVITY_FADE; break; case UR_STATE_START_ACTIVITY_FADE: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); uroom->state = UR_STATE_START_ACTIVITY; break; case UR_STATE_START_ACTIVITY: if (!UpdatePaletteFade()) { DestroyUnionRoomPlayerObjects(); DestroyTask(taskId); Free(sWirelessLinkMain.uRoom); CreateTask_StartActivity(); } break; case UR_STATE_INTERACT_WITH_ATTENDANT: if (GetHostRfuGameData()->tradeSpecies == SPECIES_NONE) { uroom->state = UR_STATE_REGISTER_PROMPT; } else { if (GetHostRfuGameData()->tradeSpecies == SPECIES_EGG) { StringCopy(gStringVar4, gText_UR_CancelRegistrationOfEgg); } else { StringCopy(gStringVar1, gSpeciesNames[GetHostRfuGameData()->tradeSpecies]); ConvertIntToDecimalStringN(gStringVar2, GetHostRfuGameData()->tradeLevel, STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_UR_CancelRegistrationOfMon); } ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_REGISTRATION_PROMPT, gStringVar4); } break; case UR_STATE_REGISTER_PROMPT: if (PrintOnTextbox(&uroom->textState, gText_UR_RegisterMonAtTradingBoard)) uroom->state = UR_STATE_REGISTER_PROMPT_HANDLE_INPUT; break; case UR_STATE_REGISTER_PROMPT_HANDLE_INPUT: input = ListMenuHandler_AllItemsAvailable(&uroom->textState, &uroom->tradeBoardMainWindowId, &uroom->tradeBoardHeaderWindowId, &sWindowTemplate_RegisterForTrade, &sListMenuTemplate_RegisterForTrade); if (input != LIST_NOTHING_CHOSEN) { if (input == LIST_CANCEL || input == 3) // Exit { uroom->state = UR_STATE_MAIN; HandleCancelActivity(TRUE); } else { switch (input) { case 1: // REGISTER ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_SELECT_MON_FADE, gText_UR_WhichMonWillYouOffer); break; case 2: // INFO ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_PROMPT_HANDLE_INPUT, gText_UR_TradingBoardInfo); break; } } DestroyHelpMessageWindow_(); } break; case UR_STATE_REGISTER_SELECT_MON_FADE: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); uroom->state = UR_STATE_REGISTER_SELECT_MON; break; case UR_STATE_REGISTER_SELECT_MON: if (!gPaletteFade.active) { sUnionRoomTrade.state = URTRADE_STATE_REGISTERING; gFieldCallback = FieldCB_ContinueScriptUnionRoom; ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_REGISTER, CB2_ReturnToField); } break; case UR_STATE_REGISTER_REQUEST_TYPE: input = ListMenuHandler_AllItemsAvailable(&uroom->textState, &uroom->tradeBoardMainWindowId, &uroom->tradeBoardHeaderWindowId, &sWindowTemplate_TypeNames, &sListMenuTemplate_TypeNames); if (input != LIST_NOTHING_CHOSEN) { switch (input) { case LIST_CANCEL: case NUMBER_OF_MON_TYPES: // Exit ResetUnionRoomTrade(&sUnionRoomTrade); SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); ScheduleFieldMessageAndExit(gText_UR_RegistrationCanceled); break; default: sUnionRoomTrade.type = input; uroom->state = UR_STATE_REGISTER_COMPLETE; break; } } break; case UR_STATE_REGISTER_COMPLETE: SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); ScheduleFieldMessageAndExit(gText_UR_RegistraionCompleted); break; case UR_STATE_CANCEL_REGISTRATION_PROMPT: switch (UnionRoomHandleYesNo(&uroom->textState, FALSE)) { case 0: // YES uroom->state = UR_STATE_CANCEL_REGISTRATION; break; case 1: // NO case MENU_B_PRESSED: HandleCancelActivity(TRUE); uroom->state = UR_STATE_MAIN; break; } break; case UR_STATE_CANCEL_REGISTRATION: if (PrintOnTextbox(&uroom->textState, gText_UR_RegistrationCanceled2)) { SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); ResetUnionRoomTrade(&sUnionRoomTrade); HandleCancelActivity(TRUE); uroom->state = UR_STATE_MAIN; } break; case UR_STATE_CHECK_TRADING_BOARD: if (PrintOnTextbox(&uroom->textState, gText_UR_XCheckedTradingBoard)) uroom->state = UR_STATE_TRADING_BOARD_LOAD; break; case UR_STATE_TRADING_BOARD_LOAD: UR_ClearBg0(); uroom->state = UR_STATE_TRADING_BOARD_HANDLE_INPUT; break; case UR_STATE_TRADING_BOARD_HANDLE_INPUT: input = TradeBoardMenuHandler(&uroom->textState, &uroom->tradeBoardMainWindowId, &uroom->tradeBoardListMenuId, &uroom->tradeBoardHeaderWindowId, &sWindowTemplate_TradingBoardMain, &sListMenuTemplate_TradeBoard, uroom->playerList); if (input != LIST_NOTHING_CHOSEN) { switch (input) { case LIST_CANCEL: case 8: // EXIT HandleCancelActivity(TRUE); DestroyHelpMessageWindow_(); uroom->state = UR_STATE_MAIN; break; default: switch (IsRequestedTradeInPlayerParty(uroom->playerList->players[input].rfu.data.tradeType, uroom->playerList->players[input].rfu.data.tradeSpecies)) { case UR_TRADE_MATCH: CopyAndTranslatePlayerName2(gStringVar1, uroom->playerList->players[input]); ScheduleFieldMessageWithFollowupState(UR_STATE_TRADE_PROMPT, gText_UR_AskTrainerToMakeTrade); taskData[1] = input; break; case UR_TRADE_NOTYPE: CopyAndTranslatePlayerName2(gStringVar1, uroom->playerList->players[input]); StringCopy(gStringVar2, gTypeNames[uroom->playerList->players[input].rfu.data.tradeType]); ScheduleFieldMessageWithFollowupState(UR_STATE_TRADING_BOARD_LOAD, gText_UR_DontHaveTypeTrainerWants); break; case UR_TRADE_NOEGG: CopyAndTranslatePlayerName2(gStringVar1, uroom->playerList->players[input]); StringCopy(gStringVar2, gTypeNames[uroom->playerList->players[input].rfu.data.tradeType]); ScheduleFieldMessageWithFollowupState(UR_STATE_TRADING_BOARD_LOAD, gText_UR_DontHaveEggTrainerWants); break; } break; } } break; case UR_STATE_TRADE_PROMPT: switch (UnionRoomHandleYesNo(&uroom->textState, FALSE)) { case 0: // YES uroom->state = UR_STATE_TRADE_SELECT_MON; break; case MENU_B_PRESSED: case 1: // NO HandleCancelActivity(TRUE); uroom->state = UR_STATE_MAIN; break; } break; case UR_STATE_TRADE_SELECT_MON: if (PrintOnTextbox(&uroom->textState, gText_UR_WhichMonWillYouOffer)) { sUnionRoomTrade.state = URTRADE_STATE_OFFERING; memcpy(&gRfuPartnerCompatibilityData, &uroom->playerList->players[taskData[1]].rfu.data.compatibility, sizeof(gRfuPartnerCompatibilityData)); gUnionRoomRequestedMonType = uroom->playerList->players[taskData[1]].rfu.data.tradeType; gUnionRoomOfferedSpecies = uroom->playerList->players[taskData[1]].rfu.data.tradeSpecies; gFieldCallback = FieldCB_ContinueScriptUnionRoom; ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_TRADE, CB2_ReturnToField); CopyPlayerListToBuffer(uroom); sUnionRoomTrade.offerPlayerId = taskData[1]; } break; case UR_STATE_TRADE_OFFER_MON: sPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM; TryConnectToUnionRoomParent(uroom->playerList->players[taskData[1]].rfu.name, &uroom->playerList->players[taskData[1]].rfu.data, ACTIVITY_TRADE | IN_UNION_ROOM); CopyAndTranslatePlayerName2(gStringVar1, uroom->playerList->players[taskData[1]]); UR_PrintFieldMessage(gTexts_UR_CommunicatingWait[2]); uroom->state = UR_STATE_TRY_COMMUNICATING; break; case UR_STATE_PRINT_AND_EXIT: if (PrintOnTextbox(&uroom->textState, gStringVar4)) { HandleCancelActivity(TRUE); UpdateUnionRoomMemberFacing(taskData[0], taskData[1], uroom->playerList); uroom->state = UR_STATE_MAIN; } break; case UR_STATE_PRINT_MSG: if (PrintOnTextbox(&uroom->textState, gStringVar4)) uroom->state = uroom->stateAfterPrint; break; } } void SetUsingUnionRoomStartMenu(void) { if (InUnionRoom() == TRUE) gSpecialVar_Result = UR_INTERACT_START_MENU; } static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom * uroom) { if (gRecvCmds[1][1] != 0 && (gRecvCmds[1][0] & RFUCMD_MASK) == RFUCMD_SEND_PACKET) { uroom->recvActivityRequest[0] = gRecvCmds[1][1]; if (gRecvCmds[1][1] == (ACTIVITY_TRADE | IN_UNION_ROOM)) { uroom->recvActivityRequest[1] = gRecvCmds[1][2]; uroom->recvActivityRequest[2] = gRecvCmds[1][3]; } } } static bool32 HandleContactFromOtherPlayer(struct WirelessLink_URoom * uroom) { if (uroom->recvActivityRequest[0] != 0) { s32 id = GetChatLeaderActionRequestMessage(gStringVar4, gLinkPlayers[1].gender, &uroom->recvActivityRequest[0], uroom); if (id == 0) // Error { return TRUE; } else if (id == 1) // Recieve activity request { uroom->state = UR_STATE_RECV_ACTIVITY_REQUEST; sPlayerCurrActivity = uroom->recvActivityRequest[0]; return FALSE; } else if (id == 2) // No activity { uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; SetCloseLinkCallback(); return FALSE; } } return TRUE; } void InitUnionRoom(void) { struct WirelessLink_URoom * data; sUnionRoomPlayerName[0] = EOS; if (QL_IS_PLAYBACK_STATE) return; CreateTask(Task_InitUnionRoom, 0); sWirelessLinkMain.uRoom = sWirelessLinkMain.uRoom; // Needed to match. sWirelessLinkMain.uRoom = data = AllocZeroed(sizeof(struct WirelessLink_URoom)); sURoom = sWirelessLinkMain.uRoom; data->state = 0; data->textState = 0; data->unknown = 0; data->unreadPlayerId = 0; sUnionRoomPlayerName[0] = EOS; } static void Task_InitUnionRoom(u8 taskId) { s32 i; u8 text[32]; struct WirelessLink_URoom * data = sWirelessLinkMain.uRoom; switch (data->state) { case 0: data->state = 1; break; case 1: SetHostRfuGameData(ACTIVITY_SEARCH, 0, FALSE); SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_EnterUnionRoom(); RfuSetIgnoreError(TRUE); data->state = 2; break; case 2: data->incomingChildList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); ClearIncomingPlayerList(data->incomingChildList->players, RFU_CHILD_MAX); data->incomingParentList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer)); ClearIncomingPlayerList(data->incomingParentList->players, RFU_CHILD_MAX); data->playerList = AllocZeroed(MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer)); ClearRfuPlayerList(data->playerList->players, MAX_UNION_ROOM_LEADERS); data->spawnPlayer = AllocZeroed(sizeof(struct RfuPlayer)); ClearRfuPlayerList(&data->spawnPlayer->players[0], 1); data->searchTaskId = CreateTask_SearchForChildOrParent(data->incomingParentList, data->incomingChildList, LINK_GROUP_UNION_ROOM_INIT); data->state = 3; break; case 3: switch (HandlePlayerListUpdate()) { case PLIST_NEW_PLAYER: case PLIST_RECENT_UPDATE: if (sUnionRoomPlayerName[0] == EOS) { for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) { if (data->playerList->players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN) { CopyAndTranslatePlayerName2(text, data->playerList->players[i]); if (PlayerHasMetTrainerBefore(ReadAsU16(data->playerList->players[i].rfu.data.compatibility.playerTrainerId), text)) { StringCopy(sUnionRoomPlayerName, text); break; } } } } break; case PLIST_UNUSED: break; } break; case 4: Free(data->spawnPlayer); Free(data->playerList); Free(data->incomingParentList); Free(data->incomingChildList); DestroyTask(data->searchTaskId); Free(sWirelessLinkMain.uRoom); LinkRfu_Shutdown(); DestroyTask(taskId); break; } } bool16 BufferUnionRoomPlayerName(void) { if (sUnionRoomPlayerName[0] != EOS) { StringCopy(gStringVar1, sUnionRoomPlayerName); sUnionRoomPlayerName[0] = EOS; return TRUE; } else { return FALSE; } } static u8 HandlePlayerListUpdate(void) { s32 i; u8 j; struct WirelessLink_URoom * data = sWirelessLinkMain.uRoom; s32 retVal = PLIST_NONE; // If someone new joined, register them in spawnPlayer for (i = 0; i < RFU_CHILD_MAX; i++) { if (ArePlayersDifferent(&data->incomingParentList->players[i].rfu, &sRfuPlayerData_Dummy) == TRUE) { data->spawnPlayer->players[0].rfu = data->incomingParentList->players[i].rfu; data->spawnPlayer->players[0].timeoutCounter = 0; data->spawnPlayer->players[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN; data->spawnPlayer->players[0].newPlayerCountdown = 1; return PLIST_CONTACTED; } } // Handle changes to existing player statuses for (j = 0; j < MAX_UNION_ROOM_LEADERS; j++) { if (data->playerList->players[j].groupScheduledAnim != UNION_ROOM_SPAWN_NONE) { i = GetNewIncomingPlayerId(&data->playerList->players[j], &data->incomingChildList->players[0]); if (i != 0xFF) { if (data->playerList->players[j].groupScheduledAnim == UNION_ROOM_SPAWN_IN) { // New join in queue if (ArePlayerDataDifferent(&data->playerList->players[j].rfu, &data->incomingChildList->players[i].rfu)) { // Just joined, copy their names data->playerList->players[j].rfu = data->incomingChildList->players[i].rfu; data->playerList->players[j].newPlayerCountdown = 64; retVal = PLIST_NEW_PLAYER; } else if (data->playerList->players[j].newPlayerCountdown != 0) { data->playerList->players[j].newPlayerCountdown--; if (data->playerList->players[j].newPlayerCountdown == 0) retVal = PLIST_RECENT_UPDATE; } } else { // New join, queue them data->playerList->players[j].groupScheduledAnim = UNION_ROOM_SPAWN_IN; data->playerList->players[j].newPlayerCountdown = 0; retVal = 2; } data->playerList->players[j].timeoutCounter = 0; } else if (data->playerList->players[j].groupScheduledAnim != UNION_ROOM_SPAWN_OUT) { // Person may have disconnected. Give them 10 seconds. data->playerList->players[j].timeoutCounter++; if (data->playerList->players[j].timeoutCounter >= 600) { data->playerList->players[j].groupScheduledAnim = UNION_ROOM_SPAWN_OUT; retVal = PLIST_RECENT_UPDATE; } } else if (data->playerList->players[j].groupScheduledAnim == UNION_ROOM_SPAWN_OUT) { // Person dropped. Wait 15 seconds, then remove them. data->playerList->players[j].timeoutCounter++; if (data->playerList->players[j].timeoutCounter >= 900) { ClearRfuPlayerList(&data->playerList->players[j], 1); } } } } // Update the players list for (i = 0; i < RFU_CHILD_MAX; i++) { if (TryAddIncomingPlayerToList(&data->playerList->players[0], &data->incomingChildList->players[i], MAX_UNION_ROOM_LEADERS) != 0xFF) retVal = PLIST_NEW_PLAYER; } return retVal; } static void Task_SearchForChildOrParent(u8 taskId) { s32 i, j; struct RfuPlayerData rfu; struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data; bool8 isParent; for (i = 0; i < RFU_CHILD_MAX; i++) { isParent = Rfu_GetCompatiblePlayerData(&rfu.data, rfu.name, i); if (!IsPartnerActivityAcceptable(rfu.data.activity, gTasks[taskId].data[4])) rfu = sRfuPlayerData_Dummy; if (rfu.data.compatibility.language == LANGUAGE_JAPANESE) rfu = sRfuPlayerData_Dummy; if (!isParent) { for (j = 0; j < i; j++) { if (!ArePlayersDifferent(&list[1]->players[j].rfu, &rfu)) rfu = sRfuPlayerData_Dummy; } list[1]->players[i].rfu = rfu; list[1]->players[i].active = ArePlayersDifferent(&list[1]->players[i].rfu, &sRfuPlayerData_Dummy); } else { list[0]->players[i].rfu = rfu; list[0]->players[i].active = ArePlayersDifferent(&list[0]->players[i].rfu, &sRfuPlayerData_Dummy); } } } static u8 CreateTask_SearchForChildOrParent(struct RfuIncomingPlayerList * parentList, struct RfuIncomingPlayerList * childList, u32 linkGroup) { u8 taskId = CreateTask(Task_SearchForChildOrParent, 0); struct RfuIncomingPlayerList ** data = (void *)gTasks[taskId].data; data[0] = parentList; data[1] = childList; gTasks[taskId].data[4] = linkGroup; return taskId; } static void Task_ListenForCompatiblePartners(u8 taskId) { s32 i, j; struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data; for (i = 0; i < RFU_CHILD_MAX; i++) { Rfu_GetCompatiblePlayerData(&list[0]->players[i].rfu.data, list[0]->players[i].rfu.name, i); if (!IsPartnerActivityAcceptable(list[0]->players[i].rfu.data.activity, gTasks[taskId].data[2])) list[0]->players[i].rfu = sRfuPlayerData_Dummy; for (j = 0; j < i; j++) { if (!ArePlayersDifferent(&list[0]->players[j].rfu, &list[0]->players[i].rfu)) list[0]->players[i].rfu = sRfuPlayerData_Dummy; } list[0]->players[i].active = ArePlayersDifferent(&list[0]->players[i].rfu, &sRfuPlayerData_Dummy); } } static bool32 HasWonderCardOrNewsByLinkGroup(struct RfuGameData * data, s16 linkGroup) { if (linkGroup == LINK_GROUP_WONDER_CARD) { if (!data->compatibility.hasCard) return FALSE; else return TRUE; } else if (linkGroup == LINK_GROUP_WONDER_NEWS) { if (!data->compatibility.hasNews) return FALSE; else return TRUE; } else { return FALSE; } } static void Task_ListenForWonderDistributor(u8 taskId) { s32 i; struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data; for (i = 0; i < RFU_CHILD_MAX; i++) { if (Rfu_GetWonderDistributorPlayerData(&list[0]->players[i].rfu.data, list[0]->players[i].rfu.name, i)) HasWonderCardOrNewsByLinkGroup(&list[0]->players[i].rfu.data, gTasks[taskId].data[2]); list[0]->players[i].active = ArePlayersDifferent(&list[0]->players[i].rfu, &sRfuPlayerData_Dummy); } } static u8 CreateTask_ListenForCompatiblePartners(struct RfuIncomingPlayerList * main4, u32 linkGroup) { u8 taskId = CreateTask(Task_ListenForCompatiblePartners, 0); struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data; list[0] = main4; gTasks[taskId].data[2] = linkGroup; return taskId; } static u8 CreateTask_ListenForWonderDistributor(struct RfuIncomingPlayerList * main4, u32 linkGroup) { u8 taskId = CreateTask(Task_ListenForWonderDistributor, 0); struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data; list[0] = main4; gTasks[taskId].data[2] = linkGroup; return taskId; } static bool32 UR_PrintFieldMessage(const u8 *src) { LoadStdWindowFrameGfx(); DrawDialogueFrame(0, 1); StringExpandPlaceholders(gStringVar4, src); AddTextPrinterWithCustomSpeedForMessage(FALSE, 1); return FALSE; } static bool32 UR_RunTextPrinters(void) { if (!RunTextPrinters_CheckPrinter0Active()) return TRUE; else return FALSE; } static bool8 PrintOnTextbox(u8 *textState, const u8 *str) { switch (*textState) { case 0: LoadStdWindowFrameGfx(); DrawDialogueFrame(0, 1); StringExpandPlaceholders(gStringVar4, str); AddTextPrinterForMessage(TRUE); (*textState)++; break; case 1: if (!RunTextPrinters_CheckPrinter0Active()) { *textState = 0; return TRUE; } break; } return FALSE; } static s8 UnionRoomHandleYesNo(u8 *state, bool32 noDraw) { s8 input; switch (*state) { case 0: if (noDraw) return -3; DisplayYesNoMenuDefaultYes(); (*state)++; break; case 1: if (noDraw) { DestroyYesNoMenu(); *state = 0; return -3; } input = Menu_ProcessInputNoWrapClearOnChoose(); if (input == MENU_B_PRESSED || input == 0 || input == 1) { *state = 0; return input; } break; } return MENU_NOTHING_CHOSEN; } static u8 CreateTradeBoardWindow(const struct WindowTemplate * template) { u8 windowId = AddWindow(template); DrawStdWindowFrame(windowId, FALSE); FillWindowPixelBuffer(windowId, PIXEL_FILL(15)); PrintUnionRoomText(windowId, FONT_SMALL, gText_UR_NameWantedOfferLv, 8, 1, UR_COLOR_TRADE_BOARD_OTHER); PutWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_GFX); return windowId; } static void DeleteTradeBoardWindow(u8 windowId) { ClearStdWindowAndFrame(windowId, TRUE); RemoveWindow(windowId); } static s32 ListMenuHandler_AllItemsAvailable(u8 *state, u8 *windowId, u8 *listMenuId, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate) { s32 input; switch (*state) { case 0: *windowId = AddWindow(winTemplate); DrawStdWindowFrame(*windowId, FALSE); gMultiuseListMenuTemplate = *menuTemplate; gMultiuseListMenuTemplate.windowId = *windowId; *listMenuId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); CopyWindowToVram(*windowId, TRUE); (*state)++; break; case 1: input = ListMenu_ProcessInput(*listMenuId); if (JOY_NEW(A_BUTTON)) { DestroyListMenuTask(*listMenuId, NULL, NULL); ClearStdWindowAndFrame(*windowId, TRUE); RemoveWindow(*windowId); *state = 0; return input; } else if (JOY_NEW(B_BUTTON)) { DestroyListMenuTask(*listMenuId, NULL, NULL); ClearStdWindowAndFrame(*windowId, TRUE); RemoveWindow(*windowId); *state = 0; return LIST_CANCEL; } break; } return LIST_NOTHING_CHOSEN; } static s32 TradeBoardMenuHandler(u8 *state, u8 *mainWindowId, u8 *listMenuId, u8 *headerWindowId, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct RfuPlayerList * list) { s32 input; s32 idx; switch (*state) { case 0: *headerWindowId = CreateTradeBoardWindow(&sWindowTemplate_TradingBoardHeader); *mainWindowId = AddWindow(winTemplate); DrawStdWindowFrame(*mainWindowId, FALSE); gMultiuseListMenuTemplate = *menuTemplate; gMultiuseListMenuTemplate.windowId = *mainWindowId; *listMenuId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1); CopyWindowToVram(*mainWindowId, TRUE); (*state)++; break; case 1: input = ListMenu_ProcessInput(*listMenuId); if (JOY_NEW(A_BUTTON | B_BUTTON)) { // Exit or B button if (input == 8 || JOY_NEW(B_BUTTON)) { DestroyListMenuTask(*listMenuId, NULL, NULL); ClearStdWindowAndFrame(*mainWindowId, TRUE); RemoveWindow(*mainWindowId); DeleteTradeBoardWindow(*headerWindowId); *state = 0; return LIST_CANCEL; } else { idx = GetIndexOfNthTradeBoardOffer(list->players, input); if (idx >= 0) { DestroyListMenuTask(*listMenuId, NULL, NULL); ClearStdWindowAndFrame(*mainWindowId, TRUE); RemoveWindow(*mainWindowId); DeleteTradeBoardWindow(*headerWindowId); *state = 0; return idx; } else { PlaySE(SE_WALL_HIT); } } } break; } return LIST_NOTHING_CHOSEN; } static void UR_ClearBg0(void) { FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0); CopyBgTilemapBufferToVram(0); } static void JoinGroup_EnableScriptContexts(void) { FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0); CopyBgTilemapBufferToVram(0); ScriptContext_Enable(); } static void PrintUnionRoomText(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx) { struct TextPrinterTemplate printerTemplate; printerTemplate.currentChar = str; printerTemplate.windowId = windowId; printerTemplate.fontId = fontId; printerTemplate.x = x; printerTemplate.y = y; printerTemplate.currentX = x; printerTemplate.currentY = y; printerTemplate.unk = 0; gTextFlags.useAlternateDownArrow = FALSE; switch (colorIdx) { case UR_COLOR_DEFAULT: printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.fgColor = TEXT_COLOR_DARK_GRAY; printerTemplate.bgColor = TEXT_COLOR_WHITE; printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GRAY; break; case UR_COLOR_RED: printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.fgColor = TEXT_COLOR_RED; printerTemplate.bgColor = TEXT_COLOR_WHITE; printerTemplate.shadowColor = TEXT_COLOR_LIGHT_RED; break; case UR_COLOR_GREEN: printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.fgColor = TEXT_COLOR_GREEN; printerTemplate.bgColor = TEXT_COLOR_WHITE; printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREEN; break; case UR_COLOR_WHITE: printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.fgColor = TEXT_COLOR_WHITE; printerTemplate.bgColor = TEXT_COLOR_WHITE; printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GRAY; break; case UR_COLOR_CANCEL: printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.fgColor = TEXT_COLOR_WHITE; printerTemplate.bgColor = TEXT_COLOR_DARK_GRAY; printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GRAY; break; case UR_COLOR_TRADE_BOARD_SELF: printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.fgColor = TEXT_COLOR_LIGHT_GREEN; printerTemplate.bgColor = TEXT_DYNAMIC_COLOR_6; printerTemplate.shadowColor = TEXT_COLOR_LIGHT_BLUE; break; case UR_COLOR_TRADE_BOARD_OTHER: printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.fgColor = TEXT_DYNAMIC_COLOR_5; printerTemplate.bgColor = TEXT_DYNAMIC_COLOR_6; printerTemplate.shadowColor = TEXT_COLOR_LIGHT_BLUE; break; } AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL); } static void ClearRfuPlayerList(struct RfuPlayer * x20arr, u8 count) { s32 i; for (i = 0; i < count; i++) { x20arr[i].rfu = sRfuPlayerData_Dummy; x20arr[i].timeoutCounter = 0xFF; x20arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_NONE; x20arr[i].useRedText = FALSE; x20arr[i].newPlayerCountdown = 0; } } static void ClearIncomingPlayerList(struct RfuIncomingPlayer * x1Carr, u8 count) { s32 i; for (i = 0; i < RFU_CHILD_MAX; i++) { x1Carr[i].rfu = sRfuPlayerData_Dummy; x1Carr[i].active = FALSE; } } // Checks player name and trainer id, returns TRUE if they are not the same static bool8 ArePlayersDifferent(struct RfuPlayerData * player1, const struct RfuPlayerData * player2) { s32 i; for (i = 0; i < 2; i++) { if (player1->data.compatibility.playerTrainerId[i] != player2->data.compatibility.playerTrainerId[i]) return TRUE; } for (i = 0; i < RFU_USER_NAME_LENGTH; i++) { if (player1->name[i] != player2->name[i]) return TRUE; } return FALSE; } static bool32 ArePlayerDataDifferent(struct RfuPlayerData * player1, struct RfuPlayerData * player2) { s32 i; if (player1->data.activity != player2->data.activity) return TRUE; if (player1->data.startedActivity != player2->data.startedActivity) return TRUE; for (i = 0; i < RFU_CHILD_MAX; i++) { if (player1->data.partnerInfo[i] != player2->data.partnerInfo[i]) return TRUE; } if (player1->data.tradeSpecies != player2->data.tradeSpecies) return TRUE; if (player1->data.tradeType != player2->data.tradeType) return TRUE; return FALSE; } static u32 GetNewIncomingPlayerId(struct RfuPlayer * player, struct RfuIncomingPlayer * incomingPlayer) { u8 result = 0xFF; s32 i; for (i = 0; i < RFU_CHILD_MAX; i++) { if (incomingPlayer[i].active && !ArePlayersDifferent(&player->rfu, &incomingPlayer[i].rfu)) { result = i; incomingPlayer[i].active = FALSE; } } return result; } static u8 TryAddIncomingPlayerToList(struct RfuPlayer * players, struct RfuIncomingPlayer * incomingPlayer, u8 count) { s32 i; if (incomingPlayer->active) { for (i = 0; i < count; i++) { if (players[i].groupScheduledAnim == UNION_ROOM_SPAWN_NONE) { players[i].rfu = incomingPlayer->rfu; players[i].timeoutCounter = 0; players[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN; players[i].newPlayerCountdown = 0x40; incomingPlayer->active = FALSE; return i; } } } return 0xFF; } static void PrintGroupMemberOnWindow(u8 windowId, u8 x, u8 y, struct RfuPlayer * player, u8 colorIdx, u8 id) { u8 activity; u8 trainerId[6]; u8 uname[30]; ConvertIntToDecimalStringN(gStringVar4, id + 1, STR_CONV_MODE_LEADING_ZEROS, 2); StringAppend(gStringVar4, gText_UR_Colon); PrintUnionRoomText(windowId, FONT_SMALL, gStringVar4, x, y, UR_COLOR_DEFAULT); x += 18; activity = player->rfu.data.activity; if (player->groupScheduledAnim == UNION_ROOM_SPAWN_IN && !(activity & IN_UNION_ROOM)) { CopyAndTranslatePlayerName2(uname, *player); PrintUnionRoomText(windowId, FONT_NORMAL, uname, x, y, colorIdx); ConvertIntToDecimalStringN(trainerId, player->rfu.data.compatibility.playerTrainerId[0] | (player->rfu.data.compatibility.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5); StringCopy(gStringVar4, gText_UR_ID); StringAppend(gStringVar4, trainerId); x += 77; PrintUnionRoomText(windowId, FONT_SMALL, gStringVar4, x, y, colorIdx); } } static void PrintGroupCandidateOnWindow(u8 windowId, u8 x, u8 y, struct RfuPlayer * player, u8 colorIdx, u8 id) { u8 id_str[6]; u8 uname[30]; if (player->groupScheduledAnim == UNION_ROOM_SPAWN_IN) { CopyAndTranslatePlayerName2(uname, *player); PrintUnionRoomText(windowId, FONT_NORMAL, uname, x, y, colorIdx); ConvertIntToDecimalStringN(id_str, player->rfu.data.compatibility.playerTrainerId[0] | (player->rfu.data.compatibility.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5); StringCopy(gStringVar4, gText_UR_ID); StringAppend(gStringVar4, id_str); x += 71; PrintUnionRoomText(windowId, FONT_SMALL, gStringVar4, x, y, colorIdx); } } static bool32 IsPlayerFacingTradingBoard(void) { s16 x, y; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); if (x != 2 + MAP_OFFSET) return FALSE; if (y != 1 + MAP_OFFSET) return FALSE; if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING) return TRUE; return FALSE; } static u32 GetResponseIdx_InviteToURoomActivity(s32 activity) { switch (activity) { case ACTIVITY_CHAT: return 1; case ACTIVITY_TRADE: return 2; case ACTIVITY_CARD: return 3; case ACTIVITY_BATTLE_MULTI: default: return 0; } } static u32 ConvPartnerUnameAndGetWhetherMetAlready(struct RfuPlayer * player) { u8 name[30]; CopyAndTranslatePlayerName2(name, *player); return PlayerHasMetTrainerBefore(ReadAsU16(player->rfu.data.compatibility.playerTrainerId), name); } static s32 UnionRoomGetPlayerInteractionResponse(struct RfuPlayerList * list, bool8 overrideGender, u8 playerIdx, u32 playerGender) { bool32 metBefore; struct RfuPlayer * player = &list->players[playerIdx]; if (!player->rfu.data.startedActivity && !overrideGender) { CopyAndTranslatePlayerName2(gStringVar1, *player); metBefore = PlayerHasMetTrainerBefore(ReadAsU16(player->rfu.data.compatibility.playerTrainerId), gStringVar1); if (player->rfu.data.activity == (ACTIVITY_CHAT | IN_UNION_ROOM)) { StringExpandPlaceholders(gStringVar4, gTexts_UR_JoinChat[metBefore][playerGender]); return 2; } else { UR_PrintFieldMessage(gTexts_UR_CommunicatingWait[metBefore]); return 1; } } else { CopyAndTranslatePlayerName2(gStringVar1, *player); if (overrideGender) playerGender = (player->rfu.data.compatibility.playerTrainerId[overrideGender + 1] >> 3) & 1; switch (player->rfu.data.activity & 0x3F) { case ACTIVITY_BATTLE_SINGLE: StringExpandPlaceholders(gStringVar4, gTexts_UR_BattleReaction[playerGender][Random() % 4]); break; case ACTIVITY_TRADE: StringExpandPlaceholders(gStringVar4, gTexts_UR_TradeReaction[playerGender][Random() % 2]); break; case ACTIVITY_CHAT: StringExpandPlaceholders(gStringVar4, gTexts_UR_ChatReaction[playerGender][Random() % 4]); break; case ACTIVITY_CARD: StringExpandPlaceholders(gStringVar4, gTexts_UR_TrainerCardReaction[playerGender][Random() % 2]); break; default: StringExpandPlaceholders(gStringVar4, gText_UR_TrainerAppearsBusy); break; } return 0; } } static void ItemPrintFunc_Unused(u8 windowId, u32 itemId, u8 y) { } static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct RfuGameData * data, const u8 * playerName, u8 colorIdx) { u8 levelStr[4]; u16 species = data->tradeSpecies; u8 type = data->tradeType; u8 level = data->tradeLevel; PrintUnionRoomText(windowId, FONT_NORMAL, playerName, 8, y, colorIdx); if (species == SPECIES_EGG) { PrintUnionRoomText(windowId, FONT_NORMAL, gText_UR_EggTrade, 68, y, colorIdx); } else { BlitMenuInfoIcon(windowId, type + 1, 68, y); PrintUnionRoomText(windowId, FONT_NORMAL, gSpeciesNames[species], 118, y, colorIdx); ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_LEFT_ALIGN, 3); PrintUnionRoomText(windowId, FONT_NORMAL, levelStr, GetStringRightAlignXOffset(2, levelStr, 218), y, colorIdx); } } static void TradeBoardListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y) { struct WirelessLink_Leader * leader = sWirelessLinkMain.leader; struct RfuGameData * gameData; s32 i, j; u8 playerName[RFU_USER_NAME_LENGTH]; if (itemId == LIST_HEADER && y == sListMenuTemplate_TradeBoard.upText_Y) { gameData = GetHostRfuGameData(); if (gameData->tradeSpecies != SPECIES_NONE) TradeBoardPrintItemInfo(windowId, y, gameData, gSaveBlock2Ptr->playerName, 5); } else { j = 0; for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++) { if (leader->playerList->players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN && leader->playerList->players[i].rfu.data.tradeSpecies != SPECIES_NONE) j++; if (j == itemId + 1) { CopyAndTranslatePlayerName2(playerName, leader->playerList->players[i]); TradeBoardPrintItemInfo(windowId, y, &leader->playerList->players[i].rfu.data, playerName, UR_COLOR_TRADE_BOARD_OTHER); break; } } } } static s32 GetIndexOfNthTradeBoardOffer(struct RfuPlayer * players, s32 n) { s32 i; s32 j = 0; for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++) { if (players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN && players[i].rfu.data.tradeSpecies != SPECIES_NONE) j++; if (j == n + 1) return i; } return -1; } static s32 GetUnionRoomPlayerGender(s32 playerIdx, struct RfuPlayerList * list) { return list->players[playerIdx].rfu.data.playerGender; } static s32 IsRequestedTradeInPlayerParty(u32 type, u32 species) { s32 i; if (species == SPECIES_EGG) { for (i = 0; i < gPlayerPartyCount; i++) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); if (species == SPECIES_EGG) return UR_TRADE_MATCH; } return UR_TRADE_NOEGG; } else { for (i = 0; i < gPlayerPartyCount; i++) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); if (gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type) return UR_TRADE_MATCH; } return UR_TRADE_NOTYPE; } } static void GetURoomActivityRejectMsg(u8 *dst, s32 activity, u32 playerGender) { switch (activity) { case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM: StringExpandPlaceholders(dst, gTexts_UR_BattleDeclined[playerGender]); break; case ACTIVITY_CHAT | IN_UNION_ROOM: StringExpandPlaceholders(dst, gTexts_UR_ChatDeclined[playerGender]); break; case ACTIVITY_TRADE | IN_UNION_ROOM: StringExpandPlaceholders(dst, gText_UR_TradeOfferRejected); break; case ACTIVITY_CARD | IN_UNION_ROOM: StringExpandPlaceholders(dst, gTexts_UR_ShowTrainerCardDeclined[playerGender]); break; } } static void GetURoomActivityStartMsg(u8 *dst, u8 activity) { u8 mpId = GetMultiplayerId(); u8 gender = gLinkPlayers[mpId ^ 1].gender; switch (activity) { case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM: StringCopy(dst, gTexts_UR_StartActivity[mpId][gender][0]); break; case ACTIVITY_TRADE | IN_UNION_ROOM: StringCopy(dst, gTexts_UR_StartActivity[mpId][gender][2]); break; case ACTIVITY_CHAT | IN_UNION_ROOM: StringCopy(dst, gTexts_UR_StartActivity[mpId][gender][1]); break; } } static s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *activityData, struct WirelessLink_URoom * uroom) { s32 result = 0; u16 species = SPECIES_NONE; s32 i; switch (activityData[0]) { case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM: StringExpandPlaceholders(dst, gText_UR_BattleChallenge); result = 1; break; case ACTIVITY_CHAT | IN_UNION_ROOM: StringExpandPlaceholders(dst, gText_UR_ChatInvitation); result = 1; break; case ACTIVITY_TRADE | IN_UNION_ROOM: ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[0], sUnionRoomTrade.playerLevel, STR_CONV_MODE_LEFT_ALIGN, 3); StringCopy(uroom->activityRequestStrbufs[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]); for (i = 0; i < RFU_CHILD_MAX; i++) { if (gRfuLinkStatus->partner[i].serialNo == RFU_SERIAL_GAME) { ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[2], activityData[2], STR_CONV_MODE_LEFT_ALIGN, 3); StringCopy(uroom->activityRequestStrbufs[3], gSpeciesNames[activityData[1]]); species = activityData[1]; break; } } if (species == SPECIES_EGG) { StringCopy(dst, gText_UR_OfferToTradeEgg); } else { for (i = 0; i < RFU_CHILD_MAX; i++) DynamicPlaceholderTextUtil_SetPlaceholderPtr(i, uroom->activityRequestStrbufs[i]); DynamicPlaceholderTextUtil_ExpandPlaceholders(dst, gText_UR_OfferToTradeMon); } result = 1; break; case ACTIVITY_CARD | IN_UNION_ROOM: StringExpandPlaceholders(dst, gText_UR_ShowTrainerCard); result = 1; break; case ACTIVITY_NONE | IN_UNION_ROOM: StringExpandPlaceholders(dst, gText_UR_ChatDropped); result = 2; break; } return result; } static bool32 PollPartnerYesNoResponse(struct WirelessLink_URoom * uroom) { if (gRecvCmds[0][1] != 0) { if (gRecvCmds[0][1] == (ACTIVITY_ACCEPT | IN_UNION_ROOM)) { uroom->partnerYesNoResponse = ACTIVITY_ACCEPT | IN_UNION_ROOM; return TRUE; } else if (gRecvCmds[0][1] == (ACTIVITY_DECLINE | IN_UNION_ROOM)) { uroom->partnerYesNoResponse = ACTIVITY_DECLINE | IN_UNION_ROOM; return TRUE; } } return FALSE; } bool32 InUnionRoom(void) { return gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNION_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNION_ROOM) ? TRUE : FALSE; } static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void) { s32 i; s32 count = 0; for (i = 0; i < gPlayerPartyCount; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) <= UNION_ROOM_MAX_LEVEL && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG) count++; } if (count > 1) return TRUE; else return FALSE; } static void ResetUnionRoomTrade(struct UnionRoomTrade * uroomTrade) { uroomTrade->state = URTRADE_STATE_NONE; uroomTrade->type = 0; uroomTrade->playerPersonality = 0; uroomTrade->playerSpecies = SPECIES_NONE; uroomTrade->playerLevel = 0; uroomTrade->species = SPECIES_NONE; uroomTrade->level = 0; uroomTrade->personality = 0; } void Script_ResetUnionRoomTrade(void) { ResetUnionRoomTrade(&sUnionRoomTrade); } static bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade * trade) { trade->playerSpecies = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES_OR_EGG); trade->playerLevel = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); trade->playerPersonality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); if (trade->playerSpecies == SPECIES_EGG) return TRUE; else return FALSE; } static void RegisterTradeMon(u32 monId, struct UnionRoomTrade * trade) { trade->species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES_OR_EGG); trade->level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); trade->personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); } static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade * trade, u8 multiplayerId) { u16 response = 0; u16 species; u32 personality; u32 cur_personality; u16 cur_species; s32 i; // player if (multiplayerId == 0) { species = trade->playerSpecies; personality = trade->playerPersonality; } // partner else { species = trade->species; personality = trade->personality; } for (i = 0; i < gPlayerPartyCount; i++) { cur_personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); if (cur_personality != personality) continue; cur_species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); if (cur_species != species) continue; response = i; break; } return response; } static void HandleCancelActivity(bool32 setData) { UR_ClearBg0(); UnlockPlayerFieldControls(); UnionRoom_UnlockPlayerAndChatPartner(); sPlayerCurrActivity = 0; if (setData) { SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); UpdateGameData_SetActivity(IN_UNION_ROOM, 0, FALSE); } } static void StartScriptInteraction(void) { LockPlayerFieldControls(); FreezeObjects_WaitForPlayer(); } static u8 GetLinkPlayerInfoFlags(s32 linkPlayer) { u8 retval = 0x80; retval |= gLinkPlayers[linkPlayer].gender << 3; retval |= gLinkPlayers[linkPlayer].trainerId & 7; return retval; } static u8 GetActivePartnersInfo(struct WirelessLink_URoom * uroom) { u8 retVal = PINFO_ACTIVE_FLAG; u8 i; for (i = 0; i < RFU_CHILD_MAX; i++) { if (uroom->incomingParentList->players[i].active) { retVal |= uroom->incomingParentList->players[i].rfu.data.playerGender << PINFO_GENDER_SHIFT; retVal |= uroom->incomingParentList->players[i].rfu.data.compatibility.playerTrainerId[0] & PINFO_TID_MASK; break; } } return retVal; } static void ViewURoomPartnerTrainerCard(u8 *unused, struct WirelessLink_URoom * uroom, bool8 isParent) { struct TrainerCard * trainerCard = &gTrainerCards[GetMultiplayerId() ^ 1]; s32 i; s32 n; DynamicPlaceholderTextUtil_Reset(); StringCopy(uroom->trainerCardStrBuffer[0], gTrainerClassNames[GetUnionRoomTrainerClass()]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, uroom->trainerCardStrBuffer[0]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->rse.playerName); StringCopy(uroom->trainerCardColorStrBuffer, gTexts_UR_CardColor[trainerCard->rse.stars]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, uroom->trainerCardColorStrBuffer); ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[2], trainerCard->rse.caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3); DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, uroom->trainerCardStrBuffer[2]); ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[3], trainerCard->rse.playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3); ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[4], trainerCard->rse.playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, uroom->trainerCardStrBuffer[3]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, uroom->trainerCardStrBuffer[4]); DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->trainerCardMsgStrBuffer, gText_UR_TrainerCardInfoPage1); StringCopy(gStringVar4, uroom->trainerCardMsgStrBuffer); n = trainerCard->rse.linkBattleWins; if (n > 9999) n = 9999; ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[0], n, STR_CONV_MODE_LEFT_ALIGN, 4); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, uroom->trainerCardStrBuffer[0]); n = trainerCard->rse.linkBattleLosses; if (n > 9999) n = 9999; ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[1], n, STR_CONV_MODE_LEFT_ALIGN, 4); DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, uroom->trainerCardStrBuffer[1]); ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[2], trainerCard->rse.pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5); DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, uroom->trainerCardStrBuffer[2]); for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++) { CopyEasyChatWord(uroom->trainerCardStrBuffer[i + 3], trainerCard->rse.easyChatProfile[i]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, uroom->trainerCardStrBuffer[i + 3]); } DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->trainerCardMsgStrBuffer, gText_UR_TrainerCardInfoPage2); StringAppend(gStringVar4, uroom->trainerCardMsgStrBuffer); if (isParent == TRUE) { DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->trainerCardMsgStrBuffer, gText_UR_FinishedCheckingPlayersTrainerCard); StringAppend(gStringVar4, uroom->trainerCardMsgStrBuffer); } else if (isParent == FALSE) { DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->trainerCardMsgStrBuffer, gTexts_UR_GladToMeetYou[trainerCard->rse.gender]); StringAppend(gStringVar4, uroom->trainerCardMsgStrBuffer); } } void CableClub_OnResumeFunc(void) { if(FlagGet(FLAG_SYS_ON_RESUME)) return; FlagSet(FLAG_SYS_ON_RESUME); if(!IsWirelessAdapterConnected()) { FlagSet(FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER); return; } InitUnionRoom(); } ================================================ FILE: src/union_room_battle.c ================================================ #include "global.h" #include "gflib.h" #include "battle.h" #include "link.h" #include "menu.h" #include "new_menu_helpers.h" #include "overworld.h" #include "party_menu.h" #include "strings.h" #include "text_window.h" #include "union_room.h" #include "constants/union_room.h" struct UnionRoomBattleWork { s16 textState; }; static EWRAM_DATA struct UnionRoomBattleWork * sWork = NULL; static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 3, .mapBaseIndex = 31 } }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, .width = 26, .height = 4, .paletteNum = 14, .baseBlock = 0x014 }, DUMMY_WIN_TEMPLATE }; static const u8 sTextColors[] = {1, 2, 3}; static void SetUpPartiesAndStartBattle(void) { s32 i; StartUnionRoomBattle(BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER); for (i = 0; i < 2; i++) { gEnemyParty[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; } for (i = 0; i < PARTY_SIZE; i++) { ZeroMonData(&gPlayerParty[i]); } for (i = 0; i < 2; i++) { gPlayerParty[i] = gEnemyParty[i]; } IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES); CalculatePlayerPartyCount(); gTrainerBattleOpponent_A = TRAINER_UNION_ROOM; SetMainCallback2(CB2_InitBattle); } static void UnionRoomBattle_CreateTextPrinter(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed) { s32 letterSpacing = 1; s32 lineSpacing = 1; FillWindowPixelBuffer(windowId, PIXEL_FILL(sTextColors[0])); AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_2, x, y, letterSpacing, lineSpacing, sTextColors, speed, str); } static bool32 UnionRoomBattle_PrintTextOnWindow0(s16 * state, const u8 * str, s32 speed) { switch (*state) { case 0: DrawTextBorderOuter(0, 0x001, 13); UnionRoomBattle_CreateTextPrinter(0, str, 0, 2, speed); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); (*state)++; break; case 1: if (!IsTextPrinterActive(0)) { *state = 0; return TRUE; } break; } return FALSE; } static void VBlankCB_UnionRoomBattle(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void CB2_UnionRoomBattle(void) { switch (gMain.state) { case 0: SetGpuReg(REG_OFFSET_DISPCNT, 0x0000); sWork = AllocZeroed(sizeof(struct UnionRoomBattleWork)); ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, 1); ResetTempTileDataBuffers(); if (!InitWindows(sWindowTemplates)) { return; } DeactivateAllTextPrinters(); ClearWindowTilemap(0); FillWindowPixelBuffer(0, PIXEL_FILL(0)); FillWindowPixelBuffer(0, PIXEL_FILL(1)); FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 15); LoadStdWindowGfx(0, 1, BG_PLTT_ID(13)); Menu_LoadStdPal(); SetVBlankCallback(VBlankCB_UnionRoomBattle); gMain.state++; break; case 1: if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_CommStandbyAwaitingOtherPlayer, 0)) { gMain.state++; } break; case 2: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); ShowBg(0); gMain.state++; break; case 3: if (!UpdatePaletteFade()) { memset(gBlockSendBuffer, 0, 0x20); if (gSelectedOrderFromParty[0] == -gSelectedOrderFromParty[1]) { gBlockSendBuffer[0] = ACTIVITY_DECLINE | 0x40; } else { gBlockSendBuffer[0] = ACTIVITY_ACCEPT | 0x40; } SendBlock(0, gBlockSendBuffer, 0x20); gMain.state++; } break; case 4: if (GetBlockReceivedStatus() == 3) { if (gBlockRecvBuffer[0][0] == (ACTIVITY_ACCEPT | 0x40) && gBlockRecvBuffer[1][0] == (ACTIVITY_ACCEPT | 0x40)) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gMain.state = 50; } else { SetCloseLinkCallback(); if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | 0x40)) { gMain.state = 6; } else { gMain.state = 8; } } ResetBlockReceivedFlags(); } break; case 50: if (!UpdatePaletteFade()) { SetLinkStandbyCallback(); gMain.state++; } break; case 51: if (IsLinkTaskFinished()) { SetMainCallback2(SetUpPartiesAndStartBattle); } break; case 6: if (!gReceivedRemoteLinkPlayers) { gMain.state++; } break; case 7: if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_RefusedBattle, 1)) { SetMainCallback2(CB2_ReturnToField); } break; case 8: if (!gReceivedRemoteLinkPlayers) { gMain.state++; } break; case 9: if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_BattleWasRefused, 1)) { SetMainCallback2(CB2_ReturnToField); } break; } RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } ================================================ FILE: src/union_room_chat.c ================================================ #include "global.h" #include "gflib.h" #include "dynamic_placeholder_text_util.h" #include "help_system.h" #include "link.h" #include "link_rfu.h" #include "load_save.h" #include "menu.h" #include "overworld.h" #include "quest_log.h" #include "save.h" #include "scanline_effect.h" #include "strings.h" #include "task.h" #include "union_room_chat.h" #include "union_room_chat_display.h" #include "keyboard_text.h" #include "constants/songs.h" #define MESSAGE_BUFFER_NCHAR 15 #define CHAT_MESSAGE_0 0 #define CHAT_MESSAGE_CHAT 1 #define CHAT_MESSAGE_JOIN 2 #define CHAT_MESSAGE_LEAVE 3 #define CHAT_MESSAGE_DROP 4 #define CHAT_MESSAGE_DISBAND 5 #define CHATENTRYROUTINE_JOIN 0 #define CHATNETRYROUTINE_HANDLE_INPUT 1 #define CHATENTRYROUTINE_SWITCH 2 #define CHATENTRYROUTINE_ASKQUITCHATTING 3 #define CHATENTRYROUTINE_SEND 4 #define CHATENTRYROUTINE_REGISTER 5 #define CHATENTRYROUTINE_EXITCHAT 6 #define CHATENTRYROUTINE_DROP 7 #define CHATENTRYROUTINE_DISBANDED 8 #define CHATENTRYROUTINE_SAVEANDEXIT 9 #define CHATEXIT_NONE 0 #define CHATEXIT_LEADER_LAST 1 #define CHATEXIT_DROPPED 2 #define CHATEXIT_DISBANDED 3 struct UnionRoomChat { u8 filler0[0x4]; u16 routineNo; u16 routineState; u8 filler8[0x2]; u16 exitDelayTimer; u8 fillerC[0x1]; u8 linkPlayerCount; u8 handleInputTask; u8 receiveMessagesTask; u8 currentPage; u8 currentCol; u8 currentRow; u8 multiplayerId; u8 lastBufferCursorPos; u8 bufferCursorPos; u8 receivedPlayerIndex; u8 exitType; bool8 changedRegisteredTexts; u8 afterSaveTimer; u8 messageEntryBuffer[2 * MESSAGE_BUFFER_NCHAR + 1]; u8 receivedMessage[0x40]; u8 hostName[0x40]; u8 registeredTexts[UNION_ROOM_KB_ROW_COUNT][21]; u8 filler18B[0x5]; u8 sendMessageBuffer[0x28]; }; static EWRAM_DATA struct UnionRoomChat * sWork = NULL; static void InitChatWork(struct UnionRoomChat * unionRoomChat); static void CB2_LoadInterface(void); static void VBlankCB_UnionRoomChatMain(void); static void CB2_UnionRoomChatMain(void); static void Task_HandlePlayerInput(u8 taskId); static void ChatEntryRoutine_Join(void); static void ChatEntryRoutine_HandleInput(void); static void ChatEntryRoutine_Switch(void); static void ChatEntryRoutine_AskQuitChatting(void); static void ChatEntryRoutine_ExitChat(void); static void ChatEntryRoutine_Drop(void); static void ChatEntryRoutine_Disbanded(void); static void ChatEntryRoutine_SendMessage(void); static void ChatEntryRoutine_Register(void); static void ChatEntryRoutine_SaveAndExit(void); static void GoToRoutine(u16 routineNo); static bool32 TypeChatMessage_HandleDPad(void); static void AppendCharacterToChatMessageBuffer(void); static void DeleteLastCharacterOfChatMessageBuffer(void); static void ToggleCaseOfLastCharacterInChatMessageBuffer(void); static bool32 ChatMsgHasAtLeastOneCharcter(void); static void RegisterTextAtRow(void); static void ResetMessageEntryBuffer(void); static void SaveRegisteredTextsToSB1(void); static u8 *GetEndOfUnk1A(void); static u8 *GetPtrToLastCharOfUnk1A(void); static void PrepareSendBuffer_Null(u8 *ptr); static void PrepareSendBuffer_Join(u8 *ptr); static void PrepareSendBuffer_Chat(u8 *ptr); static void PrepareSendBuffer_Leave(u8 *ptr); static void PrepareSendBuffer_Drop(u8 *ptr); static void PrepareSendBuffer_Disband(u8 *ptr); static void Task_ReceiveChatMessage(u8 taskId); static void (*const sChatEntryRoutines[])(void) = { [CHATENTRYROUTINE_JOIN] = ChatEntryRoutine_Join, [CHATNETRYROUTINE_HANDLE_INPUT] = ChatEntryRoutine_HandleInput, [CHATENTRYROUTINE_SWITCH] = ChatEntryRoutine_Switch, [CHATENTRYROUTINE_ASKQUITCHATTING] = ChatEntryRoutine_AskQuitChatting, [CHATENTRYROUTINE_SEND] = ChatEntryRoutine_SendMessage, [CHATENTRYROUTINE_REGISTER] = ChatEntryRoutine_Register, [CHATENTRYROUTINE_EXITCHAT] = ChatEntryRoutine_ExitChat, [CHATENTRYROUTINE_DROP] = ChatEntryRoutine_Drop, [CHATENTRYROUTINE_DISBANDED] = ChatEntryRoutine_Disbanded, [CHATENTRYROUTINE_SAVEANDEXIT] = ChatEntryRoutine_SaveAndExit }; static const u8 sKeyboardPageMaxRow[] = { [UNION_ROOM_KB_PAGE_UPPER] = 9, [UNION_ROOM_KB_PAGE_LOWER] = 9, [UNION_ROOM_KB_PAGE_EMOJI] = 9, 9 }; static const u8 sCaseToggleTable[256] = { [CHAR_A] = CHAR_a, [CHAR_B] = CHAR_b, [CHAR_C] = CHAR_c, [CHAR_D] = CHAR_d, [CHAR_E] = CHAR_e, [CHAR_F] = CHAR_f, [CHAR_G] = CHAR_g, [CHAR_H] = CHAR_h, [CHAR_I] = CHAR_i, [CHAR_J] = CHAR_j, [CHAR_K] = CHAR_k, [CHAR_L] = CHAR_l, [CHAR_M] = CHAR_m, [CHAR_N] = CHAR_n, [CHAR_O] = CHAR_o, [CHAR_P] = CHAR_p, [CHAR_Q] = CHAR_q, [CHAR_R] = CHAR_r, [CHAR_S] = CHAR_s, [CHAR_T] = CHAR_t, [CHAR_U] = CHAR_u, [CHAR_V] = CHAR_v, [CHAR_W] = CHAR_w, [CHAR_X] = CHAR_x, [CHAR_Y] = CHAR_y, [CHAR_Z] = CHAR_z, [CHAR_a] = CHAR_A, [CHAR_b] = CHAR_B, [CHAR_c] = CHAR_C, [CHAR_d] = CHAR_D, [CHAR_e] = CHAR_E, [CHAR_f] = CHAR_F, [CHAR_g] = CHAR_G, [CHAR_h] = CHAR_H, [CHAR_i] = CHAR_I, [CHAR_j] = CHAR_J, [CHAR_k] = CHAR_K, [CHAR_l] = CHAR_L, [CHAR_m] = CHAR_M, [CHAR_n] = CHAR_N, [CHAR_o] = CHAR_O, [CHAR_p] = CHAR_P, [CHAR_q] = CHAR_Q, [CHAR_r] = CHAR_R, [CHAR_s] = CHAR_S, [CHAR_t] = CHAR_T, [CHAR_u] = CHAR_U, [CHAR_v] = CHAR_V, [CHAR_w] = CHAR_W, [CHAR_x] = CHAR_X, [CHAR_y] = CHAR_Y, [CHAR_z] = CHAR_Z, [CHAR_A_GRAVE] = CHAR_a_GRAVE, [CHAR_A_ACUTE] = CHAR_a_ACUTE, [CHAR_A_CIRCUMFLEX] = CHAR_a_CIRCUMFLEX, [CHAR_A_DIAERESIS] = CHAR_a_DIAERESIS, [CHAR_C_CEDILLA] = CHAR_c_CEDILLA, [CHAR_E_GRAVE] = CHAR_e_GRAVE, [CHAR_E_ACUTE] = CHAR_e_ACUTE, [CHAR_E_CIRCUMFLEX] = CHAR_e_CIRCUMFLEX, [CHAR_E_DIAERESIS] = CHAR_e_DIAERESIS, [CHAR_I_GRAVE] = CHAR_i_GRAVE, [CHAR_I_ACUTE] = CHAR_i_ACUTE, [CHAR_I_CIRCUMFLEX] = CHAR_i_CIRCUMFLEX, [CHAR_I_DIAERESIS] = CHAR_i_DIAERESIS, [CHAR_O_GRAVE] = CHAR_o_GRAVE, [CHAR_O_ACUTE] = CHAR_o_ACUTE, [CHAR_O_CIRCUMFLEX] = CHAR_o_CIRCUMFLEX, [CHAR_O_DIAERESIS] = CHAR_o_DIAERESIS, [CHAR_OE] = CHAR_oe, [CHAR_U_GRAVE] = CHAR_u_GRAVE, [CHAR_U_ACUTE] = CHAR_u_ACUTE, [CHAR_U_CIRCUMFLEX] = CHAR_u_CIRCUMFLEX, [CHAR_U_DIAERESIS] = CHAR_u_DIAERESIS, [CHAR_N_TILDE] = CHAR_n_TILDE, [CHAR_ESZETT] = CHAR_ESZETT, [CHAR_a_GRAVE] = CHAR_A_GRAVE, [CHAR_a_ACUTE] = CHAR_A_ACUTE, [CHAR_a_CIRCUMFLEX] = CHAR_A_CIRCUMFLEX, [CHAR_a_DIAERESIS] = CHAR_A_DIAERESIS, [CHAR_c_CEDILLA] = CHAR_C_CEDILLA, [CHAR_e_GRAVE] = CHAR_E_GRAVE, [CHAR_e_ACUTE] = CHAR_E_ACUTE, [CHAR_e_CIRCUMFLEX] = CHAR_E_CIRCUMFLEX, [CHAR_e_DIAERESIS] = CHAR_E_DIAERESIS, [CHAR_i_GRAVE] = CHAR_I_GRAVE, [CHAR_i_ACUTE] = CHAR_I_ACUTE, [CHAR_i_CIRCUMFLEX] = CHAR_I_CIRCUMFLEX, [CHAR_i_DIAERESIS] = CHAR_I_DIAERESIS, [CHAR_o_GRAVE] = CHAR_O_GRAVE, [CHAR_o_ACUTE] = CHAR_O_ACUTE, [CHAR_o_CIRCUMFLEX] = CHAR_O_CIRCUMFLEX, [CHAR_o_DIAERESIS] = CHAR_O_DIAERESIS, [CHAR_oe] = CHAR_OE, [CHAR_u_GRAVE] = CHAR_U_GRAVE, [CHAR_u_ACUTE] = CHAR_U_ACUTE, [CHAR_u_CIRCUMFLEX] = CHAR_U_CIRCUMFLEX, [CHAR_u_DIAERESIS] = CHAR_U_DIAERESIS, [CHAR_n_TILDE] = CHAR_N_TILDE, [CHAR_0] = CHAR_0, [CHAR_1] = CHAR_1, [CHAR_2] = CHAR_2, [CHAR_3] = CHAR_3, [CHAR_4] = CHAR_4, [CHAR_5] = CHAR_5, [CHAR_6] = CHAR_6, [CHAR_7] = CHAR_7, [CHAR_8] = CHAR_8, [CHAR_9] = CHAR_9, [CHAR_PK] = CHAR_PK, [CHAR_MN] = CHAR_MN, [CHAR_PO] = CHAR_PO, [CHAR_KE] = CHAR_KE, [CHAR_SUPER_E] = CHAR_SUPER_E, [CHAR_SUPER_ER] = CHAR_SUPER_ER, [CHAR_SUPER_RE] = CHAR_SUPER_RE, [CHAR_PERIOD] = CHAR_PERIOD, [CHAR_COMMA] = CHAR_COMMA, [CHAR_COLON] = CHAR_COLON, [CHAR_SEMICOLON] = CHAR_SEMICOLON, [CHAR_EXCL_MARK] = CHAR_EXCL_MARK, [CHAR_QUESTION_MARK] = CHAR_QUESTION_MARK, [CHAR_HYPHEN] = CHAR_HYPHEN, [CHAR_SLASH] = CHAR_SLASH, [CHAR_ELLIPSIS] = CHAR_ELLIPSIS, [CHAR_LEFT_PAREN] = CHAR_LEFT_PAREN, [CHAR_RIGHT_PAREN] = CHAR_RIGHT_PAREN, [CHAR_AMPERSAND] = CHAR_AMPERSAND, [CHAR_DBL_QUOTE_LEFT] = CHAR_DBL_QUOTE_LEFT, [CHAR_DBL_QUOTE_RIGHT] = CHAR_DBL_QUOTE_RIGHT, [CHAR_SGL_QUOTE_LEFT] = CHAR_SGL_QUOTE_LEFT, [CHAR_SGL_QUOTE_RIGHT] = CHAR_SGL_QUOTE_RIGHT, [CHAR_MASCULINE_ORDINAL] = CHAR_MASCULINE_ORDINAL, [CHAR_FEMININE_ORDINAL] = CHAR_FEMININE_ORDINAL, [CHAR_BULLET] = CHAR_BULLET, [CHAR_EQUALS] = CHAR_EQUALS, [CHAR_MULT_SIGN] = CHAR_MULT_SIGN, [CHAR_PERCENT] = CHAR_PERCENT, [CHAR_LESS_THAN] = CHAR_LESS_THAN, [CHAR_GREATER_THAN] = CHAR_GREATER_THAN, [CHAR_MALE] = CHAR_MALE, [CHAR_FEMALE] = CHAR_FEMALE, [CHAR_CURRENCY] = CHAR_CURRENCY, [CHAR_BLACK_TRIANGLE] = CHAR_BLACK_TRIANGLE, }; const u8 *const gUnionRoomKeyboardText[UNION_ROOM_KB_PAGE_COUNT][UNION_ROOM_KB_ROW_COUNT] = { [UNION_ROOM_KB_PAGE_UPPER] = { gText_UnionRoomChatKeyboard_ABCDE, gText_UnionRoomChatKeyboard_FGHIJ, gText_UnionRoomChatKeyboard_KLMNO, gText_UnionRoomChatKeyboard_PQRST, gText_UnionRoomChatKeyboard_UVWXY, gText_UnionRoomChatKeyboard_Z, gText_UnionRoomChatKeyboard_01234Upper, gText_UnionRoomChatKeyboard_56789Upper, gText_UnionRoomChatKeyboard_PunctuationUpper, gText_UnionRoomChatKeyboard_SymbolsUpper }, [UNION_ROOM_KB_PAGE_LOWER] = { gText_UnionRoomChatKeyboard_abcde, gText_UnionRoomChatKeyboard_fghij, gText_UnionRoomChatKeyboard_klmno, gText_UnionRoomChatKeyboard_pqrst, gText_UnionRoomChatKeyboard_uvwxy, gText_UnionRoomChatKeyboard_z, gText_UnionRoomChatKeyboard_01234Lower, gText_UnionRoomChatKeyboard_56789Lower, gText_UnionRoomChatKeyboard_PunctuationLower, gText_UnionRoomChatKeyboard_SymbolsLower }, [UNION_ROOM_KB_PAGE_EMOJI] = { gText_UnionRoomChatKeyboard_Emoji1, gText_UnionRoomChatKeyboard_Emoji2, gText_UnionRoomChatKeyboard_Emoji3, gText_UnionRoomChatKeyboard_Emoji4, gText_UnionRoomChatKeyboard_Emoji5, gText_UnionRoomChatKeyboard_Emoji6, gText_UnionRoomChatKeyboard_Emoji7, gText_UnionRoomChatKeyboard_Emoji8, gText_UnionRoomChatKeyboard_Emoji9, gText_UnionRoomChatKeyboard_Emoji10 } }; void EnterUnionRoomChat(void) { sWork = Alloc(sizeof(struct UnionRoomChat)); InitChatWork(sWork); gKeyRepeatStartDelay = 20; HelpSystem_DisableToggleWithRButton(); SetVBlankCallback(NULL); SetMainCallback2(CB2_LoadInterface); } static void InitChatWork(struct UnionRoomChat * unionRoomChat) { int i; unionRoomChat->routineNo = CHATENTRYROUTINE_JOIN; unionRoomChat->routineState = 0; unionRoomChat->currentPage = UNION_ROOM_KB_PAGE_UPPER; unionRoomChat->currentCol = 0; unionRoomChat->currentRow = 0; unionRoomChat->lastBufferCursorPos = 0; unionRoomChat->bufferCursorPos = 0; unionRoomChat->receivedPlayerIndex = 0; unionRoomChat->messageEntryBuffer[0] = EOS; unionRoomChat->linkPlayerCount = GetLinkPlayerCount(); unionRoomChat->multiplayerId = GetMultiplayerId(); unionRoomChat->exitType = 0; unionRoomChat->changedRegisteredTexts = FALSE; PrepareSendBuffer_Null(unionRoomChat->sendMessageBuffer); for (i = 0; i < UNION_ROOM_KB_ROW_COUNT; i++) StringCopy(unionRoomChat->registeredTexts[i], gSaveBlock1Ptr->registeredTexts[i]); } static void FreeChatWork(void) { DestroyTask(sWork->handleInputTask); DestroyTask(sWork->receiveMessagesTask); Free(sWork); } static void CB2_LoadInterface(void) { switch (gMain.state) { case 0: ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); UnionRoomChat_TryAllocGraphicsWork(); gMain.state++; break; case 1: UnionRoomChat_RunDisplaySubtasks(); if (!UnionRoomChat_RunDisplaySubtask0()) { BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_UnionRoomChatMain); gMain.state++; } break; case 2: UpdatePaletteFade(); if (!gPaletteFade.active) { SetMainCallback2(CB2_UnionRoomChatMain); SetQuestLogEvent(QL_EVENT_USED_UNION_ROOM_CHAT, NULL); sWork->handleInputTask = CreateTask(Task_HandlePlayerInput, 8); sWork->receiveMessagesTask = CreateTask(Task_ReceiveChatMessage, 7); LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(232, 150); } break; } } static void VBlankCB_UnionRoomChatMain(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); ScanlineEffect_InitHBlankDmaTransfer(); } static void CB2_UnionRoomChatMain(void) { RunTasks(); UnionRoomChat_RunDisplaySubtasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void Task_HandlePlayerInput(u8 taskId) { switch (sWork->exitType) { case CHATEXIT_LEADER_LAST: GoToRoutine(CHATENTRYROUTINE_EXITCHAT); sWork->exitType = CHATEXIT_NONE; break; case CHATEXIT_DROPPED: GoToRoutine(CHATENTRYROUTINE_DROP); sWork->exitType = CHATEXIT_NONE; break; case CHATEXIT_DISBANDED: GoToRoutine(CHATENTRYROUTINE_DISBANDED); sWork->exitType = CHATEXIT_NONE; break; } sChatEntryRoutines[sWork->routineNo](); } static void ChatEntryRoutine_Join(void) { switch (sWork->routineState) { case 0: PrepareSendBuffer_Join(sWork->sendMessageBuffer); sWork->routineState++; // fall through case 1: if (IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive()) { if (SendBlock(0, sWork->sendMessageBuffer, sizeof(sWork->sendMessageBuffer))) sWork->routineState++; } break; case 2: if (IsLinkTaskFinished()) GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT); break; } } static void ChatEntryRoutine_HandleInput(void) { bool8 var0, var1; switch (sWork->routineState) { case 0: if (JOY_NEW(START_BUTTON)) { if (sWork->bufferCursorPos) GoToRoutine(CHATENTRYROUTINE_SEND); } else if (JOY_NEW(SELECT_BUTTON)) { GoToRoutine(CHATENTRYROUTINE_SWITCH); } else if (JOY_REPT(B_BUTTON)) { if (sWork->bufferCursorPos) { DeleteLastCharacterOfChatMessageBuffer(); UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTMSG, 0); sWork->routineState = 1; } else { GoToRoutine(CHATENTRYROUTINE_ASKQUITCHATTING); } } else if (JOY_NEW(A_BUTTON)) { AppendCharacterToChatMessageBuffer(); UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTMSG, 0); UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_CURSORBLINK, 1); sWork->routineState = 1; } else if (JOY_NEW(R_BUTTON)) { if (sWork->currentPage != UNION_ROOM_KB_PAGE_COUNT) { ToggleCaseOfLastCharacterInChatMessageBuffer(); UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTMSG, 0); sWork->routineState = 1; } else { GoToRoutine(CHATENTRYROUTINE_REGISTER); } } else if (TypeChatMessage_HandleDPad()) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_MOVEKBCURSOR, 0); sWork->routineState = 1; } break; case 1: var0 = RunDisplaySubtask(0); var1 = RunDisplaySubtask(1); if (!var0 && !var1) sWork->routineState = 0; break; } } static void ChatEntryRoutine_Switch(void) { s16 input; bool32 shouldSwitchPages; switch (sWork->routineState) { case 0: UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SHOWKBSWAPMENU, 0); sWork->routineState++; break; case 1: if (!RunDisplaySubtask(0)) sWork->routineState++; break; case 2: input = Menu_ProcessInput(); switch (input) { default: UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_HIDEKBSWAPMENU, 0); shouldSwitchPages = TRUE; if (sWork->currentPage == input || input > UNION_ROOM_KB_PAGE_COUNT) shouldSwitchPages = FALSE; break; case MENU_NOTHING_CHOSEN: if (JOY_NEW(SELECT_BUTTON)) { PlaySE(SE_SELECT); Menu_MoveCursor(1); } return; case MENU_B_PRESSED: UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_HIDEKBSWAPMENU, 0); sWork->routineState = 3; return; } if (!shouldSwitchPages) { sWork->routineState = 3; return; } sWork->currentCol = 0; sWork->currentRow = 0; UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SWITCHPAGES, 1); sWork->currentPage = input; sWork->routineState = 4; break; case 3: // Wait Return To Prev Page if (!RunDisplaySubtask(0)) GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT); break; case 4: // Wait Page Switch if (!RunDisplaySubtask(0) && !RunDisplaySubtask(1)) GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT); break; } } static void ChatEntryRoutine_AskQuitChatting(void) { s8 input; switch (sWork->routineState) { case 0: UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SHOWQUITCHATTINGDIALOG, 0); sWork->routineState = 1; break; case 1: if (!RunDisplaySubtask(0)) sWork->routineState = 2; break; case 2: input = UnionRoomChat_ProcessInput(); switch (input) { case -1: case 1: UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState = 3; break; case 0: if (sWork->multiplayerId == 0) { PrepareSendBuffer_Disband(sWork->sendMessageBuffer); UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState = 9; } else { PrepareSendBuffer_Leave(sWork->sendMessageBuffer); sWork->routineState = 4; } break; } break; case 3: if (!RunDisplaySubtask(0)) GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT); break; case 9: if (!RunDisplaySubtask(0)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SHOWCONFIRMLEADERLEAVEDIALOG, 0); sWork->routineState = 10; } break; case 10: if (!RunDisplaySubtask(0)) sWork->routineState = 8; break; case 8: input = UnionRoomChat_ProcessInput(); switch (input) { case -1: case 1: UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState = 3; break; case 0: Rfu_StopPartnerSearch(); PrepareSendBuffer_Disband(sWork->sendMessageBuffer); sWork->routineState = 4; break; } break; case 4: if (IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive() && SendBlock(0, sWork->sendMessageBuffer, sizeof(sWork->sendMessageBuffer))) { if (sWork->multiplayerId == 0) sWork->routineState = 6; else sWork->routineState = 5; } break; case 5: if (!gReceivedRemoteLinkPlayers) { GoToRoutine(CHATENTRYROUTINE_SAVEANDEXIT); } break; } } static void ChatEntryRoutine_ExitChat(void) { switch (sWork->routineState) { case 0: if (!FuncIsActiveTask(Task_ReceiveChatMessage)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState++; } break; case 1: if (!RunDisplaySubtask(0)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTEXITINGCHAT, 0); sWork->routineState++; } break; case 2: if (!RunDisplaySubtask(0)) { PrepareSendBuffer_Drop(sWork->sendMessageBuffer); sWork->routineState++; } break; case 3: if (IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive() && SendBlock(0, sWork->sendMessageBuffer, sizeof(sWork->sendMessageBuffer))) sWork->routineState++; break; case 4: if ((GetBlockReceivedStatus() & 1) && !Rfu_IsPlayerExchangeActive()) sWork->routineState++; break; case 5: if (IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive()) { SetCloseLinkCallback(); sWork->exitDelayTimer = 0; sWork->routineState++; } break; case 6: if (sWork->exitDelayTimer < 150) sWork->exitDelayTimer++; if (!gReceivedRemoteLinkPlayers) sWork->routineState++; break; case 7: if (sWork->exitDelayTimer >= 150) GoToRoutine(CHATENTRYROUTINE_SAVEANDEXIT); else sWork->exitDelayTimer++; break; } } static void ChatEntryRoutine_Drop(void) { switch (sWork->routineState) { case 0: if (!FuncIsActiveTask(Task_ReceiveChatMessage)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState++; } break; case 1: if (!RunDisplaySubtask(0) && IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive()) { SetCloseLinkCallback(); sWork->exitDelayTimer = 0; sWork->routineState++; } break; case 2: if (sWork->exitDelayTimer < 150) sWork->exitDelayTimer++; if (!gReceivedRemoteLinkPlayers) sWork->routineState++; break; case 3: if (sWork->exitDelayTimer >= 150) GoToRoutine(CHATENTRYROUTINE_SAVEANDEXIT); else sWork->exitDelayTimer++; break; } } static void ChatEntryRoutine_Disbanded(void) { switch (sWork->routineState) { case 0: if (!FuncIsActiveTask(Task_ReceiveChatMessage)) { if (sWork->multiplayerId) UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState++; } break; case 1: if (!RunDisplaySubtask(0)) { if (sWork->multiplayerId != 0) UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTLEADERLEFT, 0); sWork->routineState++; } break; case 2: if (RunDisplaySubtask(0) != TRUE && IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive()) { SetCloseLinkCallback(); sWork->exitDelayTimer = 0; sWork->routineState++; } break; case 3: if (sWork->exitDelayTimer < 150) sWork->exitDelayTimer++; if (!gReceivedRemoteLinkPlayers) sWork->routineState++; break; case 4: if (sWork->exitDelayTimer >= 150) GoToRoutine(CHATENTRYROUTINE_SAVEANDEXIT); else sWork->exitDelayTimer++; break; } } static void ChatEntryRoutine_SendMessage(void) { switch (sWork->routineState) { case 0: if (!gReceivedRemoteLinkPlayers) { GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT); break; } PrepareSendBuffer_Chat(sWork->sendMessageBuffer); sWork->routineState++; // fall through case 1: if (IsLinkTaskFinished() == TRUE && !Rfu_IsPlayerExchangeActive() && SendBlock(0, sWork->sendMessageBuffer, sizeof(sWork->sendMessageBuffer))) sWork->routineState++; break; case 2: ResetMessageEntryBuffer(); UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTMSG, 0); sWork->routineState++; break; case 3: if (!RunDisplaySubtask(0)) sWork->routineState++; break; case 4: if (IsLinkTaskFinished()) GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT); break; } } static void ChatEntryRoutine_Register(void) { switch (sWork->routineState) { case 0: if (ChatMsgHasAtLeastOneCharcter()) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTREGISTERWHERE, 0); sWork->routineState = 2; } else { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTINPUTTEXT, 0); sWork->routineState = 5; } break; case 1: if (JOY_NEW(A_BUTTON)) { RegisterTextAtRow(); UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_RETURNTOKB, 0); sWork->routineState = 3; } else if (JOY_NEW(B_BUTTON)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_CANCELREGISTER, 0); sWork->routineState = 4; } else if (TypeChatMessage_HandleDPad()) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_MOVEKBCURSOR, 0); sWork->routineState = 2; } break; case 2: if (!RunDisplaySubtask(0)) sWork->routineState = 1; break; case 3: if (!RunDisplaySubtask(0)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_CANCELREGISTER, 0); sWork->routineState = 4; } break; case 4: if (!RunDisplaySubtask(0)) GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT); break; case 5: if (!RunDisplaySubtask(0)) sWork->routineState = 6; break; case 6: if (JOY_NEW(A_BUTTON | B_BUTTON)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState = 4; } break; } } static void ChatEntryRoutine_SaveAndExit(void) { s8 input; switch (sWork->routineState) { case 0: if (!sWork->changedRegisteredTexts) { sWork->routineState = 12; } else { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState = 1; } break; case 1: if (!RunDisplaySubtask(0)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_ASKSAVE, 0); sWork->routineState = 2; } break; case 2: input = UnionRoomChat_ProcessInput(); switch (input) { case -1: case 1: sWork->routineState = 12; break; case 0: UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState = 3; break; } break; case 3: if (!RunDisplaySubtask(0)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_ASKOVERWRITESAVE, 0); sWork->routineState = 4; } break; case 4: if (!RunDisplaySubtask(0)) sWork->routineState = 5; break; case 5: input = UnionRoomChat_ProcessInput(); switch (input) { case -1: case 1: sWork->routineState = 12; break; case 0: UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0); sWork->routineState = 6; break; } break; case 6: if (!RunDisplaySubtask(0)) { UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTSAVING, 0); SaveRegisteredTextsToSB1(); sWork->routineState = 7; } break; case 7: if (!RunDisplaySubtask(0)) { SetContinueGameWarpStatusToDynamicWarp(); TrySavingData(SAVE_NORMAL); sWork->routineState = 8; } break; case 8: UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTSAVEDTHEGAME, 0); sWork->routineState = 9; break; case 9: if (!RunDisplaySubtask(0)) { PlaySE(SE_SAVE); ClearContinueGameWarpStatus2(); sWork->routineState = 10; } break; case 10: sWork->afterSaveTimer = 0; sWork->routineState = 11; break; case 11: sWork->afterSaveTimer++; if (sWork->afterSaveTimer > 120) sWork->routineState = 12; break; case 12: BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); sWork->routineState = 13; break; case 13: if (!gPaletteFade.active) { HelpSystem_EnableToggleWithRButton(); UnionRoomChat_FreeGraphicsWork(); FreeChatWork(); SetMainCallback2(CB2_ReturnToField); } break; } } static void GoToRoutine(u16 routineNo) { sWork->routineNo = routineNo; sWork->routineState = 0; } static bool32 TypeChatMessage_HandleDPad(void) { do { if (JOY_REPT(DPAD_UP)) { if (sWork->currentRow > 0) sWork->currentRow--; else sWork->currentRow = sKeyboardPageMaxRow[sWork->currentPage]; break; } if (JOY_REPT(DPAD_DOWN)) { if (sWork->currentRow < sKeyboardPageMaxRow[sWork->currentPage]) { sWork->currentRow++; } else { sWork->currentRow = 0; } break; } if (sWork->currentPage != UNION_ROOM_KB_PAGE_COUNT) { if (JOY_REPT(DPAD_LEFT)) { if (sWork->currentCol > 0) sWork->currentCol--; else sWork->currentCol = 4; break; } if (JOY_REPT(DPAD_RIGHT)) { if (sWork->currentCol < 4) sWork->currentCol++; else sWork->currentCol = 0; break; } } return FALSE; } while (0); return TRUE; } static void AppendCharacterToChatMessageBuffer(void) { int i; const u8 *charsStr; int strLength; u8 *str; u8 buffer[21]; if (sWork->currentPage != UNION_ROOM_KB_PAGE_COUNT) { charsStr = gUnionRoomKeyboardText[sWork->currentPage][sWork->currentRow]; for (i = 0; i < sWork->currentCol; i++) { if (*charsStr == CHAR_EXTRA_SYMBOL) charsStr++; charsStr++; } strLength = 1; } else { u8 *tempStr = StringCopy(buffer, sWork->registeredTexts[sWork->currentRow]); tempStr[0] = CHAR_SPACE; tempStr[1] = EOS; charsStr = buffer; strLength = StringLength_Multibyte(buffer); } sWork->lastBufferCursorPos = sWork->bufferCursorPos; if (!charsStr) return; str = GetEndOfUnk1A(); while (--strLength != -1 && sWork->bufferCursorPos < MESSAGE_BUFFER_NCHAR) { if (*charsStr == CHAR_EXTRA_SYMBOL) { *str = *charsStr; charsStr++; str++; } *str = *charsStr; charsStr++; str++; sWork->bufferCursorPos++; } *str = EOS; } static void DeleteLastCharacterOfChatMessageBuffer(void) { sWork->lastBufferCursorPos = sWork->bufferCursorPos; if (sWork->bufferCursorPos) { u8 *str = GetPtrToLastCharOfUnk1A(); *str = EOS; sWork->bufferCursorPos--; } } static void ToggleCaseOfLastCharacterInChatMessageBuffer(void) { u8 *str; u8 character; sWork->lastBufferCursorPos = sWork->bufferCursorPos - 1; str = GetPtrToLastCharOfUnk1A(); if (*str != CHAR_EXTRA_SYMBOL) { character = sCaseToggleTable[*str]; if (character) *str = character; } } static bool32 ChatMsgHasAtLeastOneCharcter(void) { if (sWork->bufferCursorPos) return TRUE; else return FALSE; } static void RegisterTextAtRow(void) { u8 *src = UnionRoomChat_GetEndOfMessageEntryBuffer(); StringCopy(sWork->registeredTexts[sWork->currentRow], src); sWork->changedRegisteredTexts = TRUE; } static void ResetMessageEntryBuffer(void) { sWork->messageEntryBuffer[0] = EOS; sWork->lastBufferCursorPos = MESSAGE_BUFFER_NCHAR; sWork->bufferCursorPos = 0; } static void SaveRegisteredTextsToSB1(void) { int i; for (i = 0; i < UNION_ROOM_KB_ROW_COUNT; i++) StringCopy(gSaveBlock1Ptr->registeredTexts[i], sWork->registeredTexts[i]); } u8 *UnionRoomChat_GetWorkRegisteredText(int arg0) { return sWork->registeredTexts[arg0]; } static u8 *GetEndOfUnk1A(void) { u8 *str = sWork->messageEntryBuffer; while (*str != EOS) str++; return str; } static u8 *GetPtrToLastCharOfUnk1A(void) { u8 *str = sWork->messageEntryBuffer; u8 *str2 = str; while (*str != EOS) { str2 = str; if (*str == CHAR_EXTRA_SYMBOL) str++; str++; } return str2; } static u16 GetNumCharsInMessageEntryBuffer(void) { u8 *str; u32 i, numChars, strLength; strLength = StringLength_Multibyte(sWork->messageEntryBuffer); str = sWork->messageEntryBuffer; numChars = 0; if (strLength > 10) { strLength -= 10; for (i = 0; i < strLength; i++) { if (*str == CHAR_EXTRA_SYMBOL) str++; str++; numChars++; } } return numChars; } static void PrepareSendBuffer_Null(u8 *arg0) { arg0[0] = CHAT_MESSAGE_0; } static void PrepareSendBuffer_Join(u8 *arg0) { arg0[0] = CHAT_MESSAGE_JOIN; StringCopy(&arg0[1], gSaveBlock2Ptr->playerName); arg0[1 + (PLAYER_NAME_LENGTH + 1)] = sWork->multiplayerId; } static void PrepareSendBuffer_Chat(u8 *arg0) { arg0[0] = CHAT_MESSAGE_CHAT; StringCopy(&arg0[1], gSaveBlock2Ptr->playerName); StringCopy(&arg0[1 + (PLAYER_NAME_LENGTH + 1)], sWork->messageEntryBuffer); } static void PrepareSendBuffer_Leave(u8 *arg0) { arg0[0] = CHAT_MESSAGE_LEAVE; StringCopy(&arg0[1], gSaveBlock2Ptr->playerName); arg0[1 + (PLAYER_NAME_LENGTH + 1)] = sWork->multiplayerId; RfuSetNormalDisconnectMode(); } static void PrepareSendBuffer_Drop(u8 *arg0) { arg0[0] = CHAT_MESSAGE_DROP; StringCopy(&arg0[1], gSaveBlock2Ptr->playerName); arg0[1 + (PLAYER_NAME_LENGTH + 1)] = sWork->multiplayerId; } static void PrepareSendBuffer_Disband(u8 *arg0) { arg0[0] = CHAT_MESSAGE_DISBAND; StringCopy(&arg0[1], gSaveBlock2Ptr->playerName); arg0[1 + (PLAYER_NAME_LENGTH + 1)] = sWork->multiplayerId; } static bool32 ProcessReceivedChatMessage(u8 *dest, u8 *recvMessage) { u8 *tempStr; u8 cmd = *recvMessage; u8 *name = recvMessage + 1; recvMessage = name; recvMessage += PLAYER_NAME_LENGTH + 1; switch (cmd) { case CHAT_MESSAGE_JOIN: if (sWork->multiplayerId != name[PLAYER_NAME_LENGTH + 1]) { DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, name); DynamicPlaceholderTextUtil_ExpandPlaceholders(dest, gText_F700JoinedChat); return TRUE; } break; case CHAT_MESSAGE_CHAT: tempStr = StringCopy(dest, name); *(tempStr++) = EXT_CTRL_CODE_BEGIN; *(tempStr++) = EXT_CTRL_CODE_CLEAR_TO; *(tempStr++) = 42; *(tempStr++) = CHAR_COLON; StringCopy(tempStr, recvMessage); return TRUE; case CHAT_MESSAGE_DISBAND: StringCopy(sWork->hostName, name); // fall through case CHAT_MESSAGE_LEAVE: if (sWork->multiplayerId != *recvMessage) { DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, name); DynamicPlaceholderTextUtil_ExpandPlaceholders(dest, gText_F700LeftChat); return TRUE; } break; } return FALSE; } u8 GetCurrentKeyboardPage(void) { return sWork->currentPage; } void UnionRoomChat_GetCursorColAndRow(u8 *colp, u8 *rowp) { *colp = sWork->currentCol; *rowp = sWork->currentRow; } u8 *UnionRoomChat_GetMessageEntryBuffer(void) { return sWork->messageEntryBuffer; } int UnionRoomChat_LenMessageEntryBuffer(void) { u8 *str = UnionRoomChat_GetMessageEntryBuffer(); return StringLength_Multibyte(str); } void UnionRoomChat_GetBufferSelectionRegion(u32 *startp, u32 *diffp) { int diff = sWork->bufferCursorPos - sWork->lastBufferCursorPos; if (diff < 0) { diff *= -1; *startp = sWork->bufferCursorPos; } else { *startp = sWork->lastBufferCursorPos; } *diffp = diff; } u8 *UnionRoomChat_GetEndOfMessageEntryBuffer(void) { int i; u16 numChars = GetNumCharsInMessageEntryBuffer(); u8 *str = sWork->messageEntryBuffer; for (i = 0; i < numChars; i++) { if (*str == CHAR_EXTRA_SYMBOL) str++; str++; } return str; } // Useless overhead u16 UnionRoomChat_GetNumCharsInMessageEntryBuffer(void) { u16 count; u32 i; u16 numChars = GetNumCharsInMessageEntryBuffer(); u8 *str = sWork->messageEntryBuffer; for (count = 0, i = 0; i < numChars; count++, i++) { if (*str == CHAR_EXTRA_SYMBOL) str++; str++; } return count; } u8 *UnionRoomChat_GetLastReceivedMessage(void) { return sWork->receivedMessage; } u16 UnionRoomChat_GetReceivedPlayerIndex(void) { return sWork->receivedPlayerIndex; } int UnionRoomChat_GetMessageEntryCursorPosition(void) { return sWork->bufferCursorPos; } // This probably does more in the Japanese titles. int UnionRoomChat_GetWhetherShouldShowCaseToggleIcon(void) { u8 *str = GetPtrToLastCharOfUnk1A(); u32 character = *str; if (character > 0xFF || sCaseToggleTable[character] == character || sCaseToggleTable[character] == 0) return 3; else return 0; } u8 *UnionRoomChat_GetNameOfPlayerWhoDisbandedChat(void) { return sWork->hostName; } void UnionRoomChat_InitializeRegisteredTexts(void) { StringCopy(gSaveBlock1Ptr->registeredTexts[0], gText_Hello); StringCopy(gSaveBlock1Ptr->registeredTexts[1], gText_Pokemon2); StringCopy(gSaveBlock1Ptr->registeredTexts[2], gText_Trade); StringCopy(gSaveBlock1Ptr->registeredTexts[3], gText_Battle); StringCopy(gSaveBlock1Ptr->registeredTexts[4], gText_Lets); StringCopy(gSaveBlock1Ptr->registeredTexts[5], gText_Ok); StringCopy(gSaveBlock1Ptr->registeredTexts[6], gText_Sorry); StringCopy(gSaveBlock1Ptr->registeredTexts[7], gText_YaySmileEmoji); StringCopy(gSaveBlock1Ptr->registeredTexts[8], gText_ThankYou); StringCopy(gSaveBlock1Ptr->registeredTexts[9], gText_ByeBye); } #define tState data[0] #define tI data[1] #define tCurrLinkPlayer data[2] #define tBlockReceivedStatus data[3] #define tLinkPlayerCount data[4] #define tNextState data[5] static void Task_ReceiveChatMessage(u8 taskId) { u8 *buffer; s16 *data = gTasks[taskId].data; switch (tState) { case 0: if (!gReceivedRemoteLinkPlayers) { DestroyTask(taskId); return; } tState = 1; // fall through case 1: tLinkPlayerCount = GetLinkPlayerCount(); if (sWork->linkPlayerCount != tLinkPlayerCount) { tState = 2; sWork->linkPlayerCount = tLinkPlayerCount; return; } tBlockReceivedStatus = GetBlockReceivedStatus(); if (!tBlockReceivedStatus && Rfu_IsPlayerExchangeActive()) return; tI = 0; tState = 3; // fall through case 3: // Idle listen for (; tI < 5 && ((tBlockReceivedStatus >> tI) & 1) == 0; tI++) ; if (tI == 5) { tState = 1; return; } tCurrLinkPlayer = tI; ResetBlockReceivedFlag(tCurrLinkPlayer); buffer = (u8 *)gBlockRecvBuffer[tI]; switch (buffer[0]) { default: case CHAT_MESSAGE_CHAT: tNextState = 3; break; case CHAT_MESSAGE_JOIN: tNextState = 3; break; case CHAT_MESSAGE_LEAVE: tNextState = 4; break; case CHAT_MESSAGE_DROP: tNextState = 5; break; case CHAT_MESSAGE_DISBAND: tNextState = 6; break; } if (ProcessReceivedChatMessage(sWork->receivedMessage, (u8 *)gBlockRecvBuffer[tI])) { sWork->receivedPlayerIndex = tI; UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SCROLLCHAT, 2); tState = 7; } else { tState = tNextState; } tI++; break; case 7: if (!RunDisplaySubtask(2)) tState = tNextState; break; case 4: // Someone is leaving if (sWork->multiplayerId == 0 && tCurrLinkPlayer != 0) { // You're the leader, and the person who left is not you if (GetLinkPlayerCount() == 2) { Rfu_StopPartnerSearch(); sWork->exitType = CHATEXIT_LEADER_LAST; DestroyTask(taskId); return; } Rfu_DisconnectPlayerById(tCurrLinkPlayer); } tState = 3; break; case 5: // Person left if (sWork->multiplayerId != 0) sWork->exitType = CHATEXIT_DROPPED; DestroyTask(taskId); break; case 6: // The leader disbanded the chat sWork->exitType = CHATEXIT_DISBANDED; DestroyTask(taskId); break; case 2: if (!Rfu_IsPlayerExchangeActive()) { if (sWork->multiplayerId == 0) SetUnionRoomChatPlayerData(sWork->linkPlayerCount); tState = 1; } break; } } #undef tNextState #undef tLinkPlayerCount #undef tBlockReceivedStatus #undef tCurrLinkPlayer #undef tI #undef tState ================================================ FILE: src/union_room_chat_display.c ================================================ #include "global.h" #include "gflib.h" #include "dynamic_placeholder_text_util.h" #include "graphics.h" #include "menu.h" #include "new_menu_helpers.h" #include "scanline_effect.h" #include "strings.h" #include "text_window.h" #include "union_room_chat.h" #include "union_room_chat_display.h" #include "union_room_chat_objects.h" #define STDMESSAGE_QUIT_CHATTING 0 #define STDMESSAGE_REGISTER_WHERE 1 #define STDMESSAGE_REGISTER_HERE 2 #define STDMESSAGE_INPUT_TEXT 3 #define STDMESSAGE_EXITING_CHAT 4 #define STDMESSAGE_LEADER_LEFT 5 #define STDMESSAGE_ASK_SAVE 6 #define STDMESSAGE_ASK_OVERWRITE 7 #define STDMESSAGE_SAVING_NO_OFF 8 #define STDMESSAGE_SAVED_THE_GAME 9 #define STDMESSAGE_WARN_LEADER_LEAVE 10 struct UnionRoomChat2Subtask { bool32 (*callback)(u8 *); u8 active; u8 state; }; struct UnionRoomChat2 { struct UnionRoomChat2Subtask subtasks[3]; u16 yesNoMenuWinId; u16 curLine; u16 scrollCount; u16 messageWindowId; s16 bg1hofs; u8 expandedPlaceholdersBuffer[0x106]; u8 bg0Buffer[BG_SCREEN_SIZE]; u8 bg1Buffer[BG_SCREEN_SIZE]; u8 bg3Buffer[BG_SCREEN_SIZE]; u8 bg2Buffer[BG_SCREEN_SIZE]; u8 unk2128[0x20]; u8 unk2148[0x20]; }; struct SubtaskInfo { u16 idx; bool32 (*callback)(u8 *); }; struct MessageWindowInfo { const u8 *text; bool8 boxType; u8 x; u8 y; u8 letterSpacing; u8 lineSpacing; bool8 expandPlaceholders; bool8 widerBox; }; static EWRAM_DATA struct UnionRoomChat2 * sWork = NULL; static void InitWork(struct UnionRoomChat2 * ptr); static void UnionRoomChat_ResetDisplaySubtasks(void); static bool32 DisplaySubtask_LoadGfx(u8 *state); static bool32 DisplaySubtask_PrintWin3(u8 *state); static bool32 DisplaySubtask_HideWin3(u8 *state); static bool32 DisplaySubtask_SwitchPages(u8 *state); static bool32 DisplaySubtask_MoveSelectorCursorObj(u8 *state); static bool32 DisplaySubtask_ShowQuitChattingDialog(u8 *state); static bool32 DisplaySubtask_HideQuitChattingDialog(u8 *state); static bool32 DisplaySubtask_UpdateMessageBuffer(u8 *state); static bool32 DisplaySubtask_PrintRegisterWhere(u8 *state); static bool32 DisplaySubtask_CancelRegister(u8 *state); static bool32 DisplaySubtask_ReturnToKeyboard(u8 *state); static bool32 DisplaySubtask_ScrollChat(u8 *state); static bool32 DisplaySubtask_AnimateSelectorCursorBlink(u8 *state); static bool32 DisplaySubtask_PrintInputText(u8 *state); static bool32 DisplaySubtask_PrintExitingChat(u8 *state); static bool32 DisplaySubtask_PrintLeaderLeft(u8 *state); static bool32 DisplaySubtask_AskSave(u8 *state); static bool32 DisplaySubtask_AskOverwriteSave(u8 *state); static bool32 DisplaySubtask_PrintSavingDontTurnOffPower(u8 *state); static bool32 DisplaySubtask_PrintSavedTheGame(u8 *state); static bool32 DisplaySubtask_ShowConfirmLeaderLeaveDialog(u8 *state); static bool32 DisplaySubtaskDummy(u8 *state); static void PlaceYesNoMenuAt(u8 a0, u8 a1, u8 a2); static void HideYesNoMenuWindow(void); static void DestroyYesNoMenuWindow(void); static void PlaceStdMessageWindow(int id, u16 bg0vofs); static void HideStdMessageWindow(void); static void DestroyStdMessageWindow(void); static void FillWin1Rect(u16 x, u16 width, u8 fillValue); static void PrintOnWin1Parameterized(u16 x, u8 *str, u8 bgColor, u8 fgColor, u8 shadowColor); static void PrintCurrentKeyboardPage(void); static bool32 AnimateMoveBg1Right(void); static bool32 AnimateMoveBg1Left(void); static void PrintKeyboardSwapTextsOnWin3(void); static void ClearWin3(void); static void PrintTextOnWin0Colorized(u16 row, u8 *str, u8 colorIdx); static void ResetGpuBgState(void); static void SetBgTilemapWorkBuffers(void); static void ClearBg0(void); static void LoadUnionRoomChatPanelGfx(void); static void LoadLinkMiscMenuGfx(void); static void LoadBg1Pal8(void); static void LoadWin0(void); static void LoadWin2(void); static void LoadWin1(void); static void LoadWin3(void); static void InitScanlineEffect(void); static void FillScanlineEffectWithValue1col(s16 a0); static void FillScanlineEffectWithValue2col(s16 a0); static const u16 sUnionRoomChat_TextEntry_Pal[] = INCBIN_U16("graphics/union_room_chat/text_entry.gbapal"); static const u16 gUnionRoomChat_Unused_Pal[] = INCBIN_U16("graphics/union_room_chat/unused.gbapal"); // Loaded, but nothing uses it static const u16 sUnionRoomChat_Messages_Pal[] = INCBIN_U16("graphics/union_room_chat/messages.gbapal"); static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 0, .mapBaseIndex = 7, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x0000 }, { .bg = 1, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x0000 }, { .bg = 2, .charBaseIndex = 2, .mapBaseIndex = 23, .screenSize = 0, .paletteMode = 0, .priority = 2, .baseTile = 0x0000 }, { .bg = 3, .charBaseIndex = 1, .mapBaseIndex = 15, .screenSize = 0, .paletteMode = 0, .priority = 3, .baseTile = 0x0001 } }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 3, .tilemapLeft = 8, .tilemapTop = 1, .width = 21, .height = 19, .paletteNum = 15, .baseBlock = 0x001 }, { .bg = 1, .tilemapLeft = 9, .tilemapTop = 18, .width = 15, .height = 2, .paletteNum = 12, .baseBlock = 0x07a }, { .bg = 1, .tilemapLeft = 0, .tilemapTop = 2, .width = 6, .height = 15, .paletteNum = 7, .baseBlock = 0x020 }, { .bg = 0, .tilemapLeft = 1, .tilemapTop = 2, .width = 7, .height = 9, .paletteNum = 14, .baseBlock = 0x013 }, DUMMY_WIN_TEMPLATE }; static const struct SubtaskInfo sSubtaskInfo[] = { {CHATDISPLAYROUTINE_LOADGFX, DisplaySubtask_LoadGfx}, {CHATDISPLAYROUTINE_SHOWKBSWAPMENU, DisplaySubtask_PrintWin3}, {CHATDISPLAYROUTINE_HIDEKBSWAPMENU, DisplaySubtask_HideWin3}, {CHATDISPLAYROUTINE_SWITCHPAGES, DisplaySubtask_SwitchPages}, {CHATDISPLAYROUTINE_MOVEKBCURSOR, DisplaySubtask_MoveSelectorCursorObj}, {CHATDISPLAYROUTINE_SHOWQUITCHATTINGDIALOG, DisplaySubtask_ShowQuitChattingDialog}, {CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, DisplaySubtask_HideQuitChattingDialog}, {CHATDISPLAYROUTINE_PRINTMSG, DisplaySubtask_UpdateMessageBuffer}, {CHATDISPLAYROUTINE_PRINTREGISTERWHERE, DisplaySubtask_PrintRegisterWhere}, {CHATDISPLAYROUTINE_CANCELREGISTER, DisplaySubtask_CancelRegister}, {CHATDISPLAYROUTINE_RETURNTOKB, DisplaySubtask_ReturnToKeyboard}, {CHATDISPLAYROUTINE_SCROLLCHAT, DisplaySubtask_ScrollChat}, {CHATDISPLAYROUTINE_CURSORBLINK, DisplaySubtask_AnimateSelectorCursorBlink}, {CHATDISPLAYROUTINE_PRINTINPUTTEXT, DisplaySubtask_PrintInputText}, {CHATDISPLAYROUTINE_PRINTEXITINGCHAT, DisplaySubtask_PrintExitingChat}, {CHATDISPLAYROUTINE_PRINTLEADERLEFT, DisplaySubtask_PrintLeaderLeft}, {CHATDISPLAYROUTINE_ASKSAVE, DisplaySubtask_AskSave}, {CHATDISPLAYROUTINE_ASKOVERWRITESAVE, DisplaySubtask_AskOverwriteSave}, {CHATDISPLAYROUTINE_PRINTSAVING, DisplaySubtask_PrintSavingDontTurnOffPower}, {CHATDISPLAYROUTINE_PRINTSAVEDTHEGAME, DisplaySubtask_PrintSavedTheGame}, {CHATDISPLAYROUTINE_SHOWCONFIRMLEADERLEAVEDIALOG, DisplaySubtask_ShowConfirmLeaderLeaveDialog} }; static const struct MessageWindowInfo sMessageWindowInfo[] = { [STDMESSAGE_QUIT_CHATTING] = { .text = gText_QuitChatting, .boxType = 1, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = FALSE, .widerBox = FALSE }, [STDMESSAGE_REGISTER_WHERE] = { .text = gText_RegisterTextWhere, .boxType = 1, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = FALSE, .widerBox = FALSE }, [STDMESSAGE_REGISTER_HERE] = { .text = gText_RegisterTextHere, .boxType = 1, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = FALSE, .widerBox = FALSE }, [STDMESSAGE_INPUT_TEXT] = { .text = gText_InputText, .boxType = 1, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = FALSE, .widerBox = FALSE }, [STDMESSAGE_EXITING_CHAT] = { .text = gText_ExitingTheChat, .boxType = 2, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = FALSE, .widerBox = FALSE }, [STDMESSAGE_LEADER_LEFT] = { .text = gText_LeaderHasLeftEndingChat, .boxType = 2, .x = 0, .y = 0, .letterSpacing = 0, .lineSpacing = 2, .expandPlaceholders = TRUE, .widerBox = FALSE }, [STDMESSAGE_ASK_SAVE] = { .text = gText_RegisteredTextChanged_OKtoSave, .boxType = 2, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = FALSE, .widerBox = TRUE }, [STDMESSAGE_ASK_OVERWRITE] = { .text = gText_RegisteredTextChanged_AlreadySavedFile, .boxType = 2, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = FALSE, .widerBox = TRUE }, [STDMESSAGE_SAVING_NO_OFF] = { .text = gText_RegisteredTextChanged_SavingDontTurnOff, .boxType = 2, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = FALSE, .widerBox = TRUE }, [STDMESSAGE_SAVED_THE_GAME] = { .text = gText_RegisteredTextChanged_SavedTheGame, .boxType = 2, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = TRUE, .widerBox = TRUE }, [STDMESSAGE_WARN_LEADER_LEAVE] = { .text = gText_IfLeaderLeavesChatWillEnd, .boxType = 2, .x = 0, .y = 0, .letterSpacing = 1, .lineSpacing = 2, .expandPlaceholders = FALSE, .widerBox = TRUE } }; static const u8 gText_Ellipsis[] = _("…"); static const struct MenuAction sKeyboardSwapTexts[] = { {gText_Upper}, {gText_Lower}, {gText_Symbols}, {gText_Register2}, {gText_Exit} }; bool8 UnionRoomChat_TryAllocGraphicsWork(void) { sWork = Alloc(sizeof(*sWork)); if (sWork && UnionRoomChat_TryAllocSpriteWork()) { ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); InitWindows(sWindowTemplates); ResetTempTileDataBuffers(); InitScanlineEffect(); InitWork(sWork); UnionRoomChat_ResetDisplaySubtasks(); UnionRoomChat_StartDisplaySubtask(0, 0); return TRUE; } else { return FALSE; } } bool32 UnionRoomChat_RunDisplaySubtask0(void) { return RunDisplaySubtask(0); } void UnionRoomChat_FreeGraphicsWork(void) { UnionRoomChat_FreeSpriteWork(); if (sWork != NULL) FREE_AND_SET_NULL(sWork); FreeAllWindowBuffers(); gScanlineEffect.state = 3; } static void InitWork(struct UnionRoomChat2 *arg0) { arg0->yesNoMenuWinId = 0xFF; arg0->messageWindowId = 0xFF; arg0->curLine = 0; } void UnionRoomChat_ResetDisplaySubtasks(void) { int i; if (sWork == NULL) return; for (i = 0; i < 3; i++) { sWork->subtasks[i].callback = DisplaySubtaskDummy; sWork->subtasks[i].active = FALSE; sWork->subtasks[i].state = 0; } } void UnionRoomChat_RunDisplaySubtasks(void) { int i; if (sWork == NULL) return; for (i = 0; i < 3; i++) { if (sWork->subtasks[i].active) sWork->subtasks[i].active = sWork->subtasks[i].callback(&sWork->subtasks[i].state); } } void UnionRoomChat_StartDisplaySubtask(u16 arg0, u8 arg1) { int i; sWork->subtasks[arg1].callback = DisplaySubtaskDummy; for (i = 0; i < NELEMS(sSubtaskInfo); i++) { if (sSubtaskInfo[i].idx == arg0) { sWork->subtasks[arg1].callback = sSubtaskInfo[i].callback; sWork->subtasks[arg1].active = TRUE; sWork->subtasks[arg1].state = 0; break; } } } bool8 RunDisplaySubtask(u8 arg0) { return sWork->subtasks[arg0].active; } static bool32 DisplaySubtask_LoadGfx(u8 *state) { if (FreeTempTileDataBuffersIfPossible() == TRUE) return TRUE; switch (*state) { case 0: ResetGpuBgState(); SetBgTilemapWorkBuffers(); break; case 1: ClearBg0(); break; case 2: LoadUnionRoomChatPanelGfx(); break; case 3: LoadLinkMiscMenuGfx(); break; case 4: LoadBg1Pal8(); break; case 5: LoadWin0(); LoadWin2(); LoadWin3(); LoadWin1(); break; case 6: if (!IsDma3ManagerBusyWithBgCopy()) { UnionRoomChat_CreateSelectorCursorObj(); UnionRoomChat_SpawnTextEntryPointerSprites(); CreatePageSwitchUISprites(); } break; default: return FALSE; } (*state)++; return TRUE; } static bool32 DisplaySubtask_PrintWin3(u8 *state) { switch (*state) { case 0: PrintKeyboardSwapTextsOnWin3(); CopyWindowToVram(3, COPYWIN_FULL); break; case 1: return IsDma3ManagerBusyWithBgCopy(); } (*state)++; return TRUE; } static bool32 DisplaySubtask_HideWin3(u8 *state) { switch (*state) { case 0: ClearWin3(); CopyWindowToVram(3, COPYWIN_FULL); break; case 1: return IsDma3ManagerBusyWithBgCopy(); } (*state)++; return TRUE; } static bool32 DisplaySubtask_SwitchPages(u8 *state) { switch (*state) { case 0: UnionRoomChat_ToggleSelectorCursorObjVisibility(TRUE); if (AnimateMoveBg1Right()) return TRUE; PrintCurrentKeyboardPage(); CopyWindowToVram(2, COPYWIN_GFX); break; case 1: if (IsDma3ManagerBusyWithBgCopy()) return TRUE; break; case 2: if (AnimateMoveBg1Left()) return TRUE; UnionRoomChat_MoveSelectorCursorObj(); UnionRoomChat_ToggleSelectorCursorObjVisibility(FALSE); UpdateVisibleUnionRoomChatIcon(); return FALSE; } (*state)++; return TRUE; } static bool32 DisplaySubtask_MoveSelectorCursorObj(u8 *state) { UnionRoomChat_MoveSelectorCursorObj(); return FALSE; } static bool32 DisplaySubtask_ShowQuitChattingDialog(u8 *state) { switch (*state) { case 0: PlaceStdMessageWindow(STDMESSAGE_QUIT_CHATTING, 0); PlaceYesNoMenuAt(23, 11, 1); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); break; case 1: return IsDma3ManagerBusyWithBgCopy(); } (*state)++; return TRUE; } static bool32 DisplaySubtask_HideQuitChattingDialog(u8 *state) { switch (*state) { case 0: HideStdMessageWindow(); HideYesNoMenuWindow(); CopyBgTilemapBufferToVram(0); break; case 1: if (IsDma3ManagerBusyWithBgCopy()) return TRUE; DestroyStdMessageWindow(); DestroyYesNoMenuWindow(); return FALSE; } (*state)++; return TRUE; } static bool32 DisplaySubtask_UpdateMessageBuffer(u8 *state) { u32 start, length; u8 *str; switch (*state) { case 0: UnionRoomChat_GetBufferSelectionRegion(&start, &length); FillWin1Rect(start, length, PIXEL_FILL(0)); str = UnionRoomChat_GetMessageEntryBuffer(); PrintOnWin1Parameterized(0, str, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY); CopyWindowToVram(1, COPYWIN_GFX); break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { UpdateVisibleUnionRoomChatIcon(); return FALSE; } return TRUE; } (*state)++; return TRUE; } static bool32 DisplaySubtask_PrintRegisterWhere(u8 *state) { u16 var0; u8 *str; u16 length; switch (*state) { case 0: var0 = UnionRoomChat_GetNumCharsInMessageEntryBuffer(); str = UnionRoomChat_GetEndOfMessageEntryBuffer(); length = StringLength_Multibyte(str); FillWin1Rect(var0, length, PIXEL_FILL(6)); PrintOnWin1Parameterized(var0, str, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED); CopyWindowToVram(1, COPYWIN_GFX); break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { PlaceStdMessageWindow(STDMESSAGE_REGISTER_WHERE, 16); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); } else { return TRUE; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) UnionRoomChat_UpdateObjPalCycle(1); else return TRUE; break; case 3: return FALSE; } (*state)++; return TRUE; } static bool32 DisplaySubtask_CancelRegister(u8 *state) { u16 x; u8 *str; u16 length; switch (*state) { case 0: x = UnionRoomChat_GetNumCharsInMessageEntryBuffer(); str = UnionRoomChat_GetEndOfMessageEntryBuffer(); length = StringLength_Multibyte(str); FillWin1Rect(x, length, PIXEL_FILL(0)); PrintOnWin1Parameterized(x, str, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY); CopyWindowToVram(1, COPYWIN_GFX); break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { HideStdMessageWindow(); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); } else { return TRUE; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { UnionRoomChat_UpdateObjPalCycle(0); DestroyStdMessageWindow(); } else { return TRUE; } break; case 3: return FALSE; } (*state)++; return TRUE; } static bool32 DisplaySubtask_ReturnToKeyboard(u8 *state) { switch (*state) { case 0: PrintCurrentKeyboardPage(); CopyWindowToVram(2, COPYWIN_GFX); (*state)++; break; case 1: if (IsDma3ManagerBusyWithBgCopy()) return TRUE; else return FALSE; } return TRUE; } static bool32 DisplaySubtask_ScrollChat(u8 *state) { u16 row; u8 *str; u8 colorIdx; switch (*state) { case 0: row = sWork->curLine; str = UnionRoomChat_GetLastReceivedMessage(); colorIdx = UnionRoomChat_GetReceivedPlayerIndex(); PrintTextOnWin0Colorized(row, str, colorIdx); CopyWindowToVram(0, COPYWIN_GFX); break; case 1: if (IsDma3ManagerBusyWithBgCopy()) return TRUE; if (sWork->curLine < 9) { sWork->curLine++; *state = 4; return FALSE; } else { sWork->scrollCount = 0; (*state)++; } // fall through case 2: ScrollWindow(0, 0, 5, PIXEL_FILL(1)); CopyWindowToVram(0, COPYWIN_GFX); sWork->scrollCount++; (*state)++; // fall through case 3: if (IsDma3ManagerBusyWithBgCopy()) return TRUE; if (sWork->scrollCount < 3) { (*state)--; return TRUE; } break; case 4: return FALSE; default: return TRUE; } (*state)++; return TRUE; } static bool32 DisplaySubtask_AnimateSelectorCursorBlink(u8 *state) { switch (*state) { case 0: UnionRoomChat_SetSelectorCursorClosedImage(); (*state)++; break; case 1: return UnionRoomChat_AnimateSelectorCursorReopen(); } return TRUE; } static bool32 DisplaySubtask_PrintInputText(u8 *state) { switch (*state) { case 0: PlaceStdMessageWindow(STDMESSAGE_INPUT_TEXT, 16); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool32 DisplaySubtask_PrintExitingChat(u8 *state) { switch (*state) { case 0: PlaceStdMessageWindow(STDMESSAGE_EXITING_CHAT, 0); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool32 DisplaySubtask_PrintLeaderLeft(u8 *state) { u8 *str; switch (*state) { case 0: DynamicPlaceholderTextUtil_Reset(); str = UnionRoomChat_GetNameOfPlayerWhoDisbandedChat(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, str); PlaceStdMessageWindow(STDMESSAGE_LEADER_LEFT, 0); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool32 DisplaySubtask_AskSave(u8 *state) { switch (*state) { case 0: PlaceStdMessageWindow(STDMESSAGE_ASK_SAVE, 0); PlaceYesNoMenuAt(23, 10, 1); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool32 DisplaySubtask_AskOverwriteSave(u8 *state) { switch (*state) { case 0: PlaceStdMessageWindow(STDMESSAGE_ASK_OVERWRITE, 0); PlaceYesNoMenuAt(23, 10, 1); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool32 DisplaySubtask_PrintSavingDontTurnOffPower(u8 *state) { switch (*state) { case 0: PlaceStdMessageWindow(STDMESSAGE_SAVING_NO_OFF, 0); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool32 DisplaySubtask_PrintSavedTheGame(u8 *state) { switch (*state) { case 0: DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); PlaceStdMessageWindow(STDMESSAGE_SAVED_THE_GAME, 0); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool32 DisplaySubtask_ShowConfirmLeaderLeaveDialog(u8 *state) { switch (*state) { case 0: PlaceStdMessageWindow(STDMESSAGE_WARN_LEADER_LEAVE, 0); PlaceYesNoMenuAt(23, 10, 1); CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL); (*state)++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); } return TRUE; } static bool32 DisplaySubtaskDummy(u8 *arg0) { return FALSE; } static void PlaceYesNoMenuAt(u8 left, u8 top, u8 initialCursorPos) { struct WindowTemplate template; template.bg = 0; template.tilemapLeft = left; template.tilemapTop = top; template.width = 6; template.height = 4; template.paletteNum = 14; template.baseBlock = 0x052; sWork->yesNoMenuWinId = AddWindow(&template); if (sWork->yesNoMenuWinId != 0xFF) { FillWindowPixelBuffer(sWork->yesNoMenuWinId, PIXEL_FILL(1)); PutWindowTilemap(sWork->yesNoMenuWinId); AddTextPrinterParameterized(sWork->yesNoMenuWinId, FONT_NORMAL, gText_Yes, 8, 2, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(sWork->yesNoMenuWinId, FONT_NORMAL, gText_No, 8, 16, TEXT_SKIP_DRAW, NULL); DrawTextBorderOuter(sWork->yesNoMenuWinId, 1, 13); Menu_InitCursor(sWork->yesNoMenuWinId, FONT_NORMAL, 0, 2, 14, 2, initialCursorPos); } } static void HideYesNoMenuWindow(void) { if (sWork->yesNoMenuWinId != 0xFF) { ClearStdWindowAndFrameToTransparent(sWork->yesNoMenuWinId, FALSE); ClearWindowTilemap(sWork->yesNoMenuWinId); } } static void DestroyYesNoMenuWindow(void) { if (sWork->yesNoMenuWinId != 0xFF) { RemoveWindow(sWork->yesNoMenuWinId); sWork->yesNoMenuWinId = 0xFF; } } s8 UnionRoomChat_ProcessInput(void) { return Menu_ProcessInput(); } static void PlaceStdMessageWindow(int id, u16 bg0vofs) { const u8 *str; int windowId; struct WindowTemplate template; template.bg = 0; template.tilemapLeft = 8; template.tilemapTop = 16; template.width = 21; template.height = 4; template.paletteNum = 14; template.baseBlock = 0x06A; if (sMessageWindowInfo[id].widerBox) { template.tilemapLeft -= 7; template.width += 7; } sWork->messageWindowId = AddWindow(&template); windowId = sWork->messageWindowId; if (sWork->messageWindowId == 0xFF) return; if (sMessageWindowInfo[id].expandPlaceholders) { DynamicPlaceholderTextUtil_ExpandPlaceholders(sWork->expandedPlaceholdersBuffer, sMessageWindowInfo[id].text); str = sWork->expandedPlaceholdersBuffer; } else { str = sMessageWindowInfo[id].text; } ChangeBgY(0, bg0vofs * 256, 0); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (sMessageWindowInfo[id].boxType == 1) { DrawTextBorderInner(windowId, 0xA, 2); AddTextPrinterParameterized5( windowId, FONT_NORMAL, str, sMessageWindowInfo[id].x + 8, sMessageWindowInfo[id].y + 8, TEXT_SKIP_DRAW, NULL, sMessageWindowInfo[id].letterSpacing, sMessageWindowInfo[id].lineSpacing); } else { DrawTextBorderOuter(windowId, 0xA, 2); AddTextPrinterParameterized5( windowId, FONT_NORMAL, str, sMessageWindowInfo[id].x, sMessageWindowInfo[id].y, TEXT_SKIP_DRAW, NULL, sMessageWindowInfo[id].letterSpacing, sMessageWindowInfo[id].lineSpacing); } sWork->messageWindowId = windowId; } static void HideStdMessageWindow(void) { if (sWork->messageWindowId != 0xFF) { ClearStdWindowAndFrameToTransparent(sWork->messageWindowId, FALSE); ClearWindowTilemap(sWork->messageWindowId); } ChangeBgY(0, 0, 0); } static void DestroyStdMessageWindow(void) { if (sWork->messageWindowId != 0xFF) { RemoveWindow(sWork->messageWindowId); sWork->messageWindowId = 0xFF; } } static void FillWin1Rect(u16 x, u16 width, u8 fillValue) { FillWindowPixelRect(1, fillValue, x * 8, 1, width * 8, 14); } static void PrintOnWin1Parameterized(u16 x, u8 *str, u8 bgColor, u8 fgColor, u8 shadowColor) { u8 color[3]; u8 strbuf[35]; if (bgColor != TEXT_COLOR_TRANSPARENT) FillWin1Rect(x, UnionRoomChat_GetMessageEntryCursorPosition() - x, bgColor); color[0] = bgColor; color[1] = fgColor; color[2] = shadowColor; strbuf[0] = EXT_CTRL_CODE_BEGIN; strbuf[1] = EXT_CTRL_CODE_MIN_LETTER_SPACING; strbuf[2] = 8; StringCopy(&strbuf[3], str); AddTextPrinterParameterized3(1, FONT_NORMAL, x * 8, 1, color, TEXT_SKIP_DRAW, strbuf); } static void PrintCurrentKeyboardPage(void) { u8 page; int i; u16 left; u16 top; u8 color[3]; u8 str[45]; u8 *str2; FillWindowPixelBuffer(2, PIXEL_FILL(15)); page = GetCurrentKeyboardPage(); color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_DYNAMIC_COLOR_5; color[2] = TEXT_DYNAMIC_COLOR_4; if (page != UNION_ROOM_KB_PAGE_COUNT) { str[0] = EXT_CTRL_CODE_BEGIN; str[1] = EXT_CTRL_CODE_MIN_LETTER_SPACING; str[2] = 8; if (page == UNION_ROOM_KB_PAGE_EMOJI) left = 6; else left = 8; for (i = 0, top = 0; i < UNION_ROOM_KB_ROW_COUNT; i++, top += 12) { if (!gUnionRoomKeyboardText[page][i]) return; StringCopy(&str[3], gUnionRoomKeyboardText[page][i]); AddTextPrinterParameterized3(2, FONT_SMALL, left, top, color, TEXT_SKIP_DRAW, str); } } else { left = 4; for (i = 0, top = 0; i < 10; i++, top += 12) { str2 = UnionRoomChat_GetWorkRegisteredText(i); if (GetStringWidth(FONT_SMALL, str2, 0) <= 40) { AddTextPrinterParameterized3(2, FONT_SMALL, left, top, color, TEXT_SKIP_DRAW, str2); } else { int length = StringLength_Multibyte(str2); do { length--; StringCopyN_Multibyte(str, str2, length); } while (GetStringWidth(FONT_SMALL, str, 0) > 35); AddTextPrinterParameterized3(2, FONT_SMALL, left, top, color, TEXT_SKIP_DRAW, str); AddTextPrinterParameterized3(2, FONT_SMALL, left + 35, top, color, TEXT_SKIP_DRAW, gText_Ellipsis); } } } } static bool32 AnimateMoveBg1Right(void) { if (sWork->bg1hofs < 56) { sWork->bg1hofs += 12; if (sWork->bg1hofs >= 56) sWork->bg1hofs = 56; if (sWork->bg1hofs < 56) { FillScanlineEffectWithValue1col(sWork->bg1hofs); return TRUE; } } FillScanlineEffectWithValue2col(sWork->bg1hofs); return FALSE; } static bool32 AnimateMoveBg1Left(void) { if (sWork->bg1hofs > 0) { sWork->bg1hofs -= 12; if (sWork->bg1hofs <= 0) sWork->bg1hofs = 0; if (sWork->bg1hofs > 0) { FillScanlineEffectWithValue1col(sWork->bg1hofs); return TRUE; } } FillScanlineEffectWithValue2col(sWork->bg1hofs); return FALSE; } static void PrintKeyboardSwapTextsOnWin3(void) { FillWindowPixelBuffer(3, PIXEL_FILL(1)); DrawTextBorderOuter(3, 1, 13); PrintMenuTable(3, FONT_NORMAL, 14, 5, sKeyboardSwapTexts); Menu_InitCursor(3, FONT_NORMAL, 0, 0, 14, 5, GetCurrentKeyboardPage()); PutWindowTilemap(3); } static void ClearWin3(void) { ClearStdWindowAndFrameToTransparent(3, FALSE); ClearWindowTilemap(3); } static void PrintTextOnWin0Colorized(u16 row, u8 *str, u8 colorIdx) // colorIdx: 0 = grey, 1 = red, 2 = green, 3 = blue { u8 color[3]; color[0] = TEXT_COLOR_WHITE; color[1] = colorIdx * 2 + 2; color[2] = colorIdx * 2 + 3; FillWindowPixelRect(0, PIXEL_FILL(1), 0, row * 15, 168, 15); AddTextPrinterParameterized3(0, FONT_NORMAL, 0, row * 15, color, TEXT_SKIP_DRAW, str); } static void ResetGpuBgState(void) { ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); SetGpuReg(REG_OFFSET_BLDCNT, 0); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(64, 240)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 144)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); } static void SetBgTilemapWorkBuffers(void) { SetBgTilemapBuffer(0, sWork->bg0Buffer); SetBgTilemapBuffer(1, sWork->bg1Buffer); SetBgTilemapBuffer(3, sWork->bg3Buffer); SetBgTilemapBuffer(2, sWork->bg2Buffer); } static void ClearBg0(void) { RequestDma3Fill(0, (void *)BG_CHAR_ADDR(0), 0x20, DMA3_32BIT); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(0); } static void LoadUnionRoomChatPanelGfx(void) { LoadPalette(gUnionRoomChat_Panel_Pal, BG_PLTT_ID(7), PLTT_SIZE_4BPP); LoadPalette(sUnionRoomChat_TextEntry_Pal, BG_PLTT_ID(12), PLTT_SIZE_4BPP); DecompressAndCopyTileDataToVram(1, gUnionRoomChat_Panel_Gfx, 0, 0, 0); CopyToBgTilemapBuffer(1, gUnionRoomChat_Panel_Tilemap, 0, 0); CopyBgTilemapBufferToVram(1); } static void LoadLinkMiscMenuGfx(void) { u8 *ptr; LoadPalette(gUnionRoomChat_Bg_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); ptr = DecompressAndCopyTileDataToVram(2, gUnionRoomChat_Bg_Gfx, 0, 0, 0); CopyToBgTilemapBuffer(2, gUnionRoomChat_Bg_Tilemap, 0, 0); CopyBgTilemapBufferToVram(2); } static void LoadBg1Pal8(void) { LoadPalette(gUnionRoomChat_Unused_Pal, BG_PLTT_ID(8), PLTT_SIZE_4BPP); RequestDma3Fill(0, (void *)BG_CHAR_ADDR(1) + 0x20, 0x20, DMA3_32BIT); } static void LoadWin0(void) { LoadPalette(sUnionRoomChat_Messages_Pal, BG_PLTT_ID(15), PLTT_SIZE_4BPP); PutWindowTilemap(0); FillWindowPixelBuffer(0, PIXEL_FILL(1)); CopyWindowToVram(0, COPYWIN_FULL); } static void LoadWin2(void) { PutWindowTilemap(2); PrintCurrentKeyboardPage(); CopyWindowToVram(2, COPYWIN_FULL); } static void LoadWin1(void) { FillWindowPixelBuffer(1, PIXEL_FILL(0)); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_FULL); } static void LoadWin3(void) { FillWindowPixelBuffer(3, PIXEL_FILL(1)); LoadUserWindowGfx(3, 1, BG_PLTT_ID(13)); LoadStdWindowGfx(3, 0xA, BG_PLTT_ID(2)); LoadPalette(gStandardMenuPalette, BG_PLTT_ID(14), PLTT_SIZE_4BPP); } static void InitScanlineEffect(void) { struct ScanlineEffectParams params; params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; params.dmaDest = ®_BG1HOFS; params.initState = 1; params.unused9 = 0; sWork->bg1hofs = 0; CpuFastFill(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers)); ScanlineEffect_SetParams(params); } static void FillScanlineEffectWithValue1col(s16 arg0) { CpuFill16(arg0, gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], 0x120); CpuFill16(0, gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer] + 0x90, 0x20); } static void FillScanlineEffectWithValue2col(s16 arg0) { CpuFill16(arg0, gScanlineEffectRegBuffers[0], 0x120); CpuFill16(0, gScanlineEffectRegBuffers[0] + 0x90, 0x20); CpuFill16(arg0, gScanlineEffectRegBuffers[0] + 0x3C0, 0x120); CpuFill16(0, gScanlineEffectRegBuffers[0] + 0x450, 0x20); } ================================================ FILE: src/union_room_chat_objects.c ================================================ #include "global.h" #include "gflib.h" #include "decompress.h" #include "graphics.h" #include "union_room_chat.h" enum { GFXTAG_SELECTOR_CURSOR, GFXTAG_CHAR_SELECT_CURSOR, GFXTAG_TEXT_ENTRY_CURSOR, GFXTAG_R_BUTTON, GFXTAG_ICONS, }; struct UnionRoomChat3 { struct Sprite *selectorCursorSprite; struct Sprite *characterSelectCursorSprite; struct Sprite *textEntryCursorSprite; struct Sprite *rButtonSprite; struct Sprite *chatIconsSprite; u16 cursorBlinkTimer; }; static EWRAM_DATA struct UnionRoomChat3 *sWork = NULL; static void SpriteCB_TextEntryCursor(struct Sprite *sprite); static void SpriteCB_CharacterSelectCursor(struct Sprite *sprite); static const u16 sUnionRoomChatInterfacePal[] = INCBIN_U16("graphics/union_room_chat/objects.gbapal"); static const u32 sSelectorCursor_Gfx[] = INCBIN_U32("graphics/union_room_chat/selector_cursor.4bpp.lz"); static const u32 sTextEntryCursor_Gfx[] = INCBIN_U32("graphics/union_room_chat/text_entry_cursor.4bpp.lz"); static const u32 sCharacterSelectCursor_Gfx[] = INCBIN_U32("graphics/union_room_chat/character_select_cursor.4bpp.lz"); static const u32 sRButton_Gfx[] = INCBIN_U32("graphics/union_room_chat/r_button.4bpp.lz"); static const struct CompressedSpriteSheet sSpriteSheets[] = { { .data = sSelectorCursor_Gfx, .size = 128 * TILE_SIZE_4BPP, .tag = GFXTAG_SELECTOR_CURSOR }, { .data = sCharacterSelectCursor_Gfx, .size = 2 * TILE_SIZE_4BPP, .tag = GFXTAG_CHAR_SELECT_CURSOR }, { .data = sTextEntryCursor_Gfx, .size = 2 * TILE_SIZE_4BPP, .tag = GFXTAG_TEXT_ENTRY_CURSOR }, { .data = sRButton_Gfx, .size = 4 * TILE_SIZE_4BPP, .tag = GFXTAG_R_BUTTON }, { .data = gUnionRoomChat_Icons_Gfx, .size = 32 * TILE_SIZE_4BPP, .tag = GFXTAG_ICONS }, }; static const struct SpritePalette sSpritePalette = { sUnionRoomChatInterfacePal, 0 }; static const struct OamData sOamData_64x32_1 = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; static const union AnimCmd sAnim_CursorSmallOpen[] = { ANIMCMD_FRAME(0x00, 30), ANIMCMD_END }; static const union AnimCmd sAnim_CursorSmallClosed[] = { ANIMCMD_FRAME(0x20, 30), ANIMCMD_END }; static const union AnimCmd sAnim_CursorLargeOpen[] = { ANIMCMD_FRAME(0x40, 30), ANIMCMD_END }; static const union AnimCmd sAnim_CursorLargeClosed[] = { ANIMCMD_FRAME(0x60, 30), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnims_SelectorCursor[] = { sAnim_CursorSmallOpen, sAnim_CursorSmallClosed, sAnim_CursorLargeOpen, sAnim_CursorLargeClosed }; static const struct SpriteTemplate sSpriteTemplate_SelectorCursor = { .tileTag = GFXTAG_SELECTOR_CURSOR, .paletteTag = 0, .oam = &sOamData_64x32_1, .anims = sSpriteAnims_SelectorCursor, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct OamData sOamData_8x16_2 = { .shape = SPRITE_SHAPE(8x16), .size = SPRITE_SIZE(8x16), .priority = 2 }; static const struct SpriteTemplate sSpriteTemplate_TextEntryCursor = { .tileTag = GFXTAG_TEXT_ENTRY_CURSOR, .paletteTag = 0, .oam = &sOamData_8x16_2, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_TextEntryCursor }; static const struct SpriteTemplate sSpriteTemplate_CharacterSelectCursor = { .tileTag = GFXTAG_CHAR_SELECT_CURSOR, .paletteTag = 0, .oam = &sOamData_8x16_2, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_CharacterSelectCursor }; static const struct OamData sOamData_16x16_2 = { .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 2 }; static const struct OamData sOamData_32x16_2 = { .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .priority = 2 }; static const union AnimCmd sAnim_UnionRoomChatIcons_ToggleCase[] = { ANIMCMD_FRAME(0x00, 2), ANIMCMD_END }; static const union AnimCmd sAnim_UnionRoomChatIcons_Dummy1[] = { ANIMCMD_FRAME(0x08, 2), ANIMCMD_END }; static const union AnimCmd sAnim_UnionRoomChatIcons_Dummy2[] = { ANIMCMD_FRAME(0x10, 2), ANIMCMD_END }; static const union AnimCmd sAnim_UnionRoomChatIcons_Register[] = { ANIMCMD_FRAME(0x18, 2), ANIMCMD_END }; static const union AnimCmd *const sSpriteAnimTable_UnionRoomChatIcons[] = { sAnim_UnionRoomChatIcons_ToggleCase, sAnim_UnionRoomChatIcons_Dummy1, sAnim_UnionRoomChatIcons_Dummy2, sAnim_UnionRoomChatIcons_Register }; static const struct SpriteTemplate sSpriteTemplate_RButton = { .tileTag = GFXTAG_R_BUTTON, .paletteTag = 0, .oam = &sOamData_16x16_2, .anims = gDummySpriteAnimTable, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; static const struct SpriteTemplate sSpriteTemplate_UnionRoomChatIcons = { .tileTag = GFXTAG_ICONS, .paletteTag = 0, .oam = &sOamData_32x16_2, .anims = sSpriteAnimTable_UnionRoomChatIcons, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; bool32 UnionRoomChat_TryAllocSpriteWork(void) { int i; for (i = 0; i < NELEMS(sSpriteSheets); i++) LoadCompressedSpriteSheet(&sSpriteSheets[i]); LoadSpritePalette(&sSpritePalette); sWork = Alloc(sizeof(struct UnionRoomChat3)); if (sWork == NULL) return FALSE; return TRUE; } void UnionRoomChat_FreeSpriteWork(void) { if (sWork != NULL) Free(sWork); } void UnionRoomChat_CreateSelectorCursorObj(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_SelectorCursor, 10, 24, 0); sWork->selectorCursorSprite = &gSprites[spriteId]; } void UnionRoomChat_ToggleSelectorCursorObjVisibility(bool32 invisible) { sWork->selectorCursorSprite->invisible = invisible; } void UnionRoomChat_MoveSelectorCursorObj(void) { u8 x, y; u8 page = GetCurrentKeyboardPage(); UnionRoomChat_GetCursorColAndRow(&x, &y); if (page != UNION_ROOM_KB_PAGE_COUNT) { StartSpriteAnim(sWork->selectorCursorSprite, 0); sWork->selectorCursorSprite->x = x * 8 + 10; sWork->selectorCursorSprite->y = y * 12 + 24; } else { StartSpriteAnim(sWork->selectorCursorSprite, 2); sWork->selectorCursorSprite->x = 24; sWork->selectorCursorSprite->y = y * 12 + 24; } } void UnionRoomChat_UpdateObjPalCycle(int arg0) { const u16 *palette = &sUnionRoomChatInterfacePal[arg0 * 2 + 1]; u8 index = IndexOfSpritePaletteTag(0); LoadPalette(palette, OBJ_PLTT_ID(index) + 1, PLTT_SIZEOF(2)); } void UnionRoomChat_SetSelectorCursorClosedImage(void) { if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT) StartSpriteAnim(sWork->selectorCursorSprite, 1); else StartSpriteAnim(sWork->selectorCursorSprite, 3); sWork->cursorBlinkTimer = 0; } bool32 UnionRoomChat_AnimateSelectorCursorReopen(void) { if (sWork->cursorBlinkTimer > 3) return FALSE; if (++sWork->cursorBlinkTimer > 3) { if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT) StartSpriteAnim(sWork->selectorCursorSprite, 0); else StartSpriteAnim(sWork->selectorCursorSprite, 2); return FALSE; } return TRUE; } void UnionRoomChat_SpawnTextEntryPointerSprites(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_TextEntryCursor, 76, 152, 2); sWork->textEntryCursorSprite = &gSprites[spriteId]; spriteId = CreateSprite(&sSpriteTemplate_CharacterSelectCursor, 64, 152, 1); sWork->characterSelectCursorSprite = &gSprites[spriteId]; } static void SpriteCB_TextEntryCursor(struct Sprite *sprite) { int var0 = UnionRoomChat_GetMessageEntryCursorPosition(); if (var0 == 15) { sprite->invisible = TRUE; } else { sprite->invisible = FALSE; sprite->x = var0 * 8 + 76; } } static void SpriteCB_CharacterSelectCursor(struct Sprite *sprite) { if (++sprite->data[0] > 4) { sprite->data[0] = 0; if (++sprite->x2 > 4) sprite->x2 = 0; } } void CreatePageSwitchUISprites(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_RButton, 8, 152, 3); sWork->rButtonSprite = &gSprites[spriteId]; spriteId = CreateSprite(&sSpriteTemplate_UnionRoomChatIcons, 32, 152, 4); sWork->chatIconsSprite = &gSprites[spriteId]; sWork->chatIconsSprite->invisible = TRUE; } void UpdateVisibleUnionRoomChatIcon(void) { if (GetCurrentKeyboardPage() == UNION_ROOM_KB_PAGE_COUNT) { if (UnionRoomChat_LenMessageEntryBuffer() != 0) { // REGISTER sWork->chatIconsSprite->invisible = FALSE; StartSpriteAnim(sWork->chatIconsSprite, 3); } else { sWork->chatIconsSprite->invisible = TRUE; } } else { int anim = UnionRoomChat_GetWhetherShouldShowCaseToggleIcon(); if (anim == 3) { sWork->chatIconsSprite->invisible = TRUE; } else { // A <--> a sWork->chatIconsSprite->invisible = FALSE; StartSpriteAnim(sWork->chatIconsSprite, anim); } } } ================================================ FILE: src/union_room_message.c ================================================ #include "global.h" #include "link_rfu.h" #include "mystery_gift_server.h" #include "mystery_gift_client.h" #include "constants/union_room.h" ALIGNED(4) const u8 gText_UR_EmptyString[] = _(""); ALIGNED(4) const u8 gText_UR_Colon[] = _(":"); ALIGNED(4) const u8 gText_UR_ID[] = _("{ID}"); ALIGNED(4) const u8 gText_UR_PleaseStartOver[] = _("Please start over from the beginning."); ALIGNED(4) const u8 gText_UR_WirelessSearchCanceled[] = _("The WIRELESS COMMUNICATION\nSYSTEM search has been canceled."); ALIGNED(4) static const u8 sText_AwaitingCommunucation2[] = _("ともだちからの れんらくを\nまっています"); ALIGNED(4) const u8 gText_UR_AwaitingCommunication[] = _("{STR_VAR_1}! Awaiting\ncommunication from another player."); ALIGNED(4) const u8 gText_UR_AwaitingLinkPressStart[] = _("{STR_VAR_1}! Awaiting link!\nPress START when everyone's ready."); ALIGNED(4) static const u8 sText_SingleBattle[] = _("シングルバトルを かいさいする"); ALIGNED(4) static const u8 sText_DoubleBattle[] = _("ダブルバトルを かいさいする"); ALIGNED(4) static const u8 sText_MultiBattle[] = _("マルチバトルを かいさいする"); ALIGNED(4) static const u8 sText_TradePokemon[] = _("ポケモンこうかんを かいさいする"); ALIGNED(4) static const u8 sText_Chat[] = _("チャットを かいさいする"); ALIGNED(4) static const u8 sText_DistWonderCard[] = _("ふしぎなカードをくばる"); ALIGNED(4) static const u8 sText_DistWonderNews[] = _("ふしぎなニュースをくばる"); ALIGNED(4) static const u8 sText_DistMysteryEvent[] = _("ふしぎなできごとを かいさいする"); ALIGNED(4) static const u8 sText_HoldPokemonJump[] = _("なわとびを かいさいする"); ALIGNED(4) static const u8 sText_HoldBerryCrush[] = _("きのみマッシャーを かいさいする"); ALIGNED(4) static const u8 sText_HoldBerryPicking[] = _("きのみどりを かいさいする"); ALIGNED(4) static const u8 sText_HoldSpinTrade[] = _("ぐるぐるこうかんを かいさいする"); ALIGNED(4) static const u8 sText_HoldSpinShop[] = _("ぐるぐるショップを かいさいする"); // Unused static const u8 *const sLinkGroupActionTexts[] = { sText_SingleBattle, sText_DoubleBattle, sText_MultiBattle, sText_TradePokemon, sText_Chat, sText_DistWonderCard, sText_DistWonderNews, sText_DistWonderCard, sText_HoldPokemonJump, sText_HoldBerryCrush, sText_HoldBerryPicking, sText_HoldBerryPicking, sText_HoldSpinTrade, sText_HoldSpinShop }; static const u8 sText_1PlayerNeeded[] = _("1 player\nneeded."); static const u8 sText_2PlayersNeeded[] = _("2 players\nneeded."); static const u8 sText_3PlayersNeeded[] = _("3 players\nneeded."); static const u8 sText_4PlayersNeeded[] = _("あと4にん\nひつよう"); static const u8 sText_2PlayerMode[] = _("2-PLAYER\nMODE"); static const u8 sText_3PlayerMode[] = _("3-PLAYER\nMODE"); static const u8 sText_4PlayerMode[] = _("4-PLAYER\nMODE"); static const u8 sText_5PlayerMode[] = _("5-PLAYER\nMODE"); const u8 *const gTexts_UR_PlayersNeededOrMode[][5] = { { // 2 players required sText_1PlayerNeeded, sText_2PlayerMode }, { // 4 players required sText_3PlayersNeeded, sText_2PlayersNeeded, sText_1PlayerNeeded, sText_4PlayerMode }, { // 2-5 players required sText_1PlayerNeeded, sText_2PlayerMode, sText_3PlayerMode, sText_4PlayerMode, sText_5PlayerMode }, { // 3-5 players required sText_2PlayersNeeded, sText_1PlayerNeeded, sText_3PlayerMode, sText_4PlayerMode, sText_5PlayerMode } }; ALIGNED(4) const u8 gText_UR_BButtonCancel[] = _("{B_BUTTON}CANCEL"); ALIGNED(4) static const u8 sText_SearchingForParticipants[] = _("ため\nさんかしゃ ぼしゅうちゅう です!"); ALIGNED(4) const u8 gText_UR_PlayerContactedYouForXAccept[] = _("{STR_VAR_2} contacted you for\n{STR_VAR_1}. Accept?"); ALIGNED(4) const u8 gText_UR_PlayerContactedYouShareX[] = _("{STR_VAR_2} contacted you.\nWill you share {STR_VAR_1}?"); ALIGNED(4) const u8 gText_UR_PlayerContactedYouAddToMembers[] = _("{STR_VAR_2} contacted you.\nAdd to the members?"); ALIGNED(4) const u8 gText_UR_AreTheseMembersOK[] = _("{STR_VAR_1}!\nAre these members OK?"); ALIGNED(4) const u8 gText_UR_CancelModeWithTheseMembers[] = _("Cancel {STR_VAR_1} MODE\nwith these members?"); ALIGNED(4) const u8 gText_UR_AnOKWasSentToPlayer[] = _("An “OK” was sent\nto {STR_VAR_1}."); ALIGNED(4) static const u8 sText_OtherTrainerUnavailableNow[] = _("The other TRAINER doesn't appear\nto be available now…\p"); ALIGNED(4) static const u8 sText_CantTransmitTrainerTooFar[] = _("You can't transmit with a TRAINER\nwho is too far away.\p"); ALIGNED(4) static const u8 sText_TrainersNotReadyYet[] = _("The other TRAINER(S) is/are not\nready yet.\p"); const u8 *const gTexts_UR_CantTransmitToTrainer[] = { sText_CantTransmitTrainerTooFar, sText_TrainersNotReadyYet }; ALIGNED(4) const u8 gText_UR_ModeWithTheseMembersWillBeCanceled[] = _("The {STR_VAR_1} MODE with\nthese members will be canceled.{PAUSE 90}"); ALIGNED(4) static const u8 sText_MemberNoLongerAvailable[] = _("There is a member who can no\nlonger remain available.\p"); const u8 *const gTexts_UR_PlayerUnavailable[] = { sText_OtherTrainerUnavailableNow, sText_MemberNoLongerAvailable }; ALIGNED(4) static const u8 sText_TrainerAppearsUnavailable[] = _("The other TRAINER appears\nunavailable…\p"); ALIGNED(4) const u8 gText_UR_PlayerSentBackOK[] = _("{STR_VAR_1} sent back an “OK”!"); ALIGNED(4) const u8 gText_UR_PlayerOKdRegistration[] = _("{STR_VAR_1} OK'd your registration as\na member."); ALIGNED(4) static const u8 sText_PlayerRepliedNo[] = _("{STR_VAR_1} replied, “No…”\p"); ALIGNED(4) const u8 gText_UR_AwaitingOtherMembers[] = _("{STR_VAR_1}!\nAwaiting other members!"); ALIGNED(4) const u8 gText_UR_QuitBeingMember[] = _("Quit being a member?"); ALIGNED(4) static const u8 sText_StoppedBeingMember[] = _("You stopped being a member.\p"); const u8 *const gTexts_UR_PlayerDisconnected[] = { [RFU_STATUS_OK] = NULL, [RFU_STATUS_FATAL_ERROR] = sText_MemberNoLongerAvailable, [RFU_STATUS_CONNECTION_ERROR] = sText_TrainerAppearsUnavailable, [RFU_STATUS_CHILD_SEND_COMPLETE] = NULL, [RFU_STATUS_NEW_CHILD_DETECTED] = NULL, [RFU_STATUS_JOIN_GROUP_OK] = NULL, [RFU_STATUS_JOIN_GROUP_NO] = sText_PlayerRepliedNo, [RFU_STATUS_WAIT_ACK_JOIN_GROUP] = NULL, [RFU_STATUS_LEAVE_GROUP_NOTICE] = NULL, [RFU_STATUS_LEAVE_GROUP] = sText_StoppedBeingMember }; ALIGNED(4) const u8 gText_UR_WirelessLinkEstablished[] = _("The WIRELESS COMMUNICATION\nSYSTEM link has been established."); ALIGNED(4) const u8 gText_UR_WirelessLinkDropped[] = _("The WIRELESS COMMUNICATION\nSYSTEM link has been dropped…"); ALIGNED(4) const u8 gText_UR_LinkWithFriendDropped[] = _("The link with your friend has been\ndropped…"); ALIGNED(4) static const u8 sText_PlayerRepliedNo2[] = _("{STR_VAR_1} replied, “No…”"); const u8 *const gTexts_UR_LinkDropped[] = { [RFU_STATUS_OK] = NULL, [RFU_STATUS_FATAL_ERROR] = gText_UR_LinkWithFriendDropped, [RFU_STATUS_CONNECTION_ERROR] = gText_UR_LinkWithFriendDropped, [RFU_STATUS_CHILD_SEND_COMPLETE] = NULL, [RFU_STATUS_NEW_CHILD_DETECTED] = NULL, [RFU_STATUS_JOIN_GROUP_OK] = NULL, [RFU_STATUS_JOIN_GROUP_NO] = sText_PlayerRepliedNo2, [RFU_STATUS_WAIT_ACK_JOIN_GROUP] = NULL, [RFU_STATUS_LEAVE_GROUP_NOTICE] = NULL, [RFU_STATUS_LEAVE_GROUP] = NULL }; ALIGNED(4) static const u8 sText_DoYouWantXMode[] = _("Do you want the {STR_VAR_2}\nMODE?"); ALIGNED(4) static const u8 sText_DoYouWantXMode2[] = _("Do you want the {STR_VAR_2}\nMODE?"); // Unused static const u8 *const sDoYouWantModeTexts[] = { sText_DoYouWantXMode, sText_DoYouWantXMode2 }; ALIGNED(4) const u8 gText_UR_AwaitingPlayersResponseAboutTrade[] = _("Awaiting {STR_VAR_1}'s response about\nthe trade…"); ALIGNED(4) static const u8 sText_Communicating[] = _("Communicating{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}."); ALIGNED(4) static const u8 sText_CommunicatingWithPlayer[] = _("Communicating with {STR_VAR_1}{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}."); ALIGNED(4) static const u8 sText_PleaseWaitAWhile[] = _("Please wait a while{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}."); const u8 *const gTexts_UR_CommunicatingWait[] = { sText_Communicating, sText_CommunicatingWithPlayer, sText_PleaseWaitAWhile }; ALIGNED(4) static const u8 sText_HiDoSomethingMale[] = _("Hiya! Is there something that you\nwanted to do?"); ALIGNED(4) static const u8 sText_HiDoSomethingFemale[] = _("Hello!\nWould you like to do something?"); ALIGNED(4) static const u8 sText_HiDoSomethingAgainMale[] = _("{STR_VAR_1}: Hiya, we meet again!\nWhat are you up for this time?"); ALIGNED(4) static const u8 sText_HiDoSomethingAgainFemale[] = _("{STR_VAR_1}: Oh! {PLAYER}, hello!\nWould you like to do something?"); const u8 *const gTexts_UR_HiDoSomething[][GENDER_COUNT] = { { sText_HiDoSomethingMale, sText_HiDoSomethingFemale }, { sText_HiDoSomethingAgainMale, sText_HiDoSomethingAgainFemale } }; ALIGNED(4) static const u8 sText_DoSomethingMale[] = _("Want to do something?"); ALIGNED(4) static const u8 sText_DoSomethingFemale[] = _("Would you like to do something?"); ALIGNED(4) static const u8 sText_DoSomethingAgainMale[] = _("{STR_VAR_1}: What would you like to\ndo now?"); ALIGNED(4) static const u8 sText_DoSomethingAgainFemale[] = _("{STR_VAR_1}‘また なにかする?"); // Unused static const u8 *const sDoSomethingTexts[][GENDER_COUNT] = { { sText_DoSomethingMale, sText_DoSomethingFemale }, { sText_DoSomethingAgainMale, sText_DoSomethingAgainMale // was probably supposed to be sText_DoSomethingAgainFemale } }; ALIGNED(4) static const u8 sText_SomebodyHasContactedYou[] = _("Somebody has contacted you.{PAUSE 60}"); ALIGNED(4) static const u8 sText_PlayerHasContactedYou[] = _("{STR_VAR_1} has contacted you.{PAUSE 60}"); const u8 *const gTexts_UR_PlayerContactedYou[] = { sText_SomebodyHasContactedYou, sText_PlayerHasContactedYou }; ALIGNED(4) static const u8 sText_AwaitingResponseFromTrainer[] = _("Awaiting a response from\nthe other TRAINER…"); ALIGNED(4) static const u8 sText_AwaitingResponseFromPlayer[] = _("Awaiting a response from\n{STR_VAR_1}…"); const u8 *const gTexts_UR_AwaitingResponse[] = { sText_AwaitingResponseFromTrainer, sText_AwaitingResponseFromPlayer }; ALIGNED(4) static const u8 sText_AwaitingResponseCancelBButton[] = _("あいての ていあんを まっています\nビーボタンで キャンセル"); ALIGNED(4) const u8 gText_UR_ShowTrainerCard[] = _("The other TRAINER showed\nyou their TRAINER CARD.\pWould you like to show your\nTRAINER CARD?"); ALIGNED(4) const u8 gText_UR_BattleChallenge[] = _("The other TRAINER challenges you\nto battle.\pWill you accept the battle\nchallenge?"); ALIGNED(4) const u8 gText_UR_ChatInvitation[] = _("The other TRAINER invites you\nto chat.\pWill you accept the chat\ninvitation?"); ALIGNED(4) const u8 gText_UR_OfferToTradeMon[] = _("There is an offer to trade your\nregistered Lv. {DYNAMIC 0} {DYNAMIC 1}\pin exchange for a\nLv. {DYNAMIC 2} {DYNAMIC 3}.\pWill you accept this trade\noffer?"); ALIGNED(4) const u8 gText_UR_OfferToTradeEgg[] = _("There is an offer to trade your\nregistered EGG.\lWill you accept this trade offer?"); ALIGNED(4) const u8 gText_UR_ChatDropped[] = _("The chat has been dropped.\p"); ALIGNED(4) const u8 gText_UR_OfferDeclined1[] = _("You declined the offer.\p"); ALIGNED(4) const u8 gText_UR_OfferDeclined2[] = _("You declined the offer.\p"); ALIGNED(4) const u8 gText_UR_ChatEnded[] = _("The chat was ended.\p"); // Unused static const u8 *const sInvitationTexts[] = { gText_UR_ShowTrainerCard, gText_UR_BattleChallenge, gText_UR_ChatInvitation, gText_UR_OfferToTradeMon }; ALIGNED(4) static const u8 sText_JoinChatMale[] = _("Oh, hey! We're in a chat right now.\nWant to join us?"); ALIGNED(4) static const u8 sText_PlayerJoinChatMale[] = _("{STR_VAR_1}: Hey, {PLAYER}!\nWe're having a chat right now.\lWant to join us?"); ALIGNED(4) static const u8 sText_JoinChatFemale[] = _("Oh, hi! We're having a chat now.\nWould you like to join us?"); ALIGNED(4) static const u8 sText_PlayerJoinChatFemale[] = _("{STR_VAR_1}: Oh, hi, {PLAYER}!\nWe're having a chat now.\lWould you like to join us?"); const u8 *const gTexts_UR_JoinChat[][GENDER_COUNT] = { { sText_JoinChatMale, sText_JoinChatFemale }, { sText_PlayerJoinChatMale, sText_PlayerJoinChatFemale } }; ALIGNED(4) const u8 gText_UR_TrainerAppearsBusy[] = _("……\nThe TRAINER appears to be busy…\p"); ALIGNED(4) static const u8 sText_WaitForBattleMale[] = _("A battle, huh?\nAll right, just give me some time."); ALIGNED(4) static const u8 sText_WaitForChatMale[] = _("You want to chat, huh?\nSure, just wait a little."); ALIGNED(4) static const u8 sText_ShowTrainerCardMale[] = _("Sure thing! As my “Greetings,”\nhere's my TRAINER CARD."); ALIGNED(4) static const u8 sText_WaitForBattleFemale[] = _("A battle? Of course, but I need\ntime to get ready."); ALIGNED(4) static const u8 sText_WaitForChatFemale[] = _("Did you want to chat?\nOkay, but please wait a moment."); ALIGNED(4) static const u8 sText_ShowTrainerCardFemale[] = _("As my introduction, I'll show you\nmy TRAINER CARD."); const u8 *const gTexts_UR_WaitOrShowCard[GENDER_COUNT][4] = { { sText_WaitForBattleMale, sText_WaitForChatMale, NULL, sText_ShowTrainerCardMale }, { sText_WaitForBattleFemale, sText_WaitForChatFemale, NULL, sText_ShowTrainerCardFemale } }; ALIGNED(4) static const u8 sText_WaitForChatMale2[] = _("チャットだね!\nわかった ちょっと まってて!"); ALIGNED(4) static const u8 sText_DoneWaitingBattleMale[] = _("Thanks for waiting!\nLet's get our battle started!{PAUSE 60}"); ALIGNED(4) static const u8 sText_DoneWaitingChatMale[] = _("All right!\nLet's chat!{PAUSE 60}"); ALIGNED(4) static const u8 sText_DoneWaitingBattleFemale[] = _("Sorry I made you wait!\nLet's get started!{PAUSE 60}"); ALIGNED(4) static const u8 sText_DoneWaitingChatFemale[] = _("Sorry I made you wait!\nLet's chat.{PAUSE 60}"); ALIGNED(4) static const u8 sText_TradeWillBeStarted[] = _("The trade will be started.{PAUSE 60}"); ALIGNED(4) static const u8 sText_BattleWillBeStarted[] = _("The battle will be started.{PAUSE 60}"); ALIGNED(4) static const u8 sText_EnteringChat[] = _("Entering the chat…{PAUSE 60}"); const u8 *const gTexts_UR_StartActivity[][GENDER_COUNT][3] = { { { sText_BattleWillBeStarted, sText_EnteringChat, sText_TradeWillBeStarted }, { sText_BattleWillBeStarted, sText_EnteringChat, sText_TradeWillBeStarted } }, { { sText_DoneWaitingBattleMale, sText_DoneWaitingChatMale, sText_TradeWillBeStarted }, { sText_DoneWaitingBattleFemale, sText_DoneWaitingChatFemale, sText_TradeWillBeStarted } } }; ALIGNED(4) static const u8 sText_BattleDeclinedMale[] = _("Sorry! My POKéMON don't seem to\nbe feeling too well right now.\lLet me battle you another time.\p"); ALIGNED(4) static const u8 sText_BattleDeclinedFemale[] = _("I'm terribly sorry, but my POKéMON\naren't feeling well…\pLet's battle another time.\p"); const u8 *const gTexts_UR_BattleDeclined[GENDER_COUNT] = { sText_BattleDeclinedMale, sText_BattleDeclinedFemale }; ALIGNED(4) static const u8 sText_ShowTrainerCardDeclinedMale[] = _("Huh? My TRAINER CARD…\nWhere'd it go now?\lSorry! I'll show you another time!\p"); ALIGNED(4) static const u8 sText_ShowTrainerCardDeclinedFemale[] = _("Oh? Now where did I put my\nTRAINER CARD?…\lSorry! I'll show you later!\p"); const u8 *const gTexts_UR_ShowTrainerCardDeclined[GENDER_COUNT] = { sText_ShowTrainerCardDeclinedMale, sText_ShowTrainerCardDeclinedFemale }; ALIGNED(4) static const u8 sText_IfYouWantToDoSomethingMale[] = _("If you want to do something with\nme, just give me a shout!\p"); ALIGNED(4) static const u8 sText_IfYouWantToDoSomethingFemale[] = _("If you want to do something with\nme, don't be shy.\p"); const u8 *const gTexts_UR_IfYouWantToDoSomething[GENDER_COUNT] = { sText_IfYouWantToDoSomethingMale, sText_IfYouWantToDoSomethingFemale }; ALIGNED(4) const u8 gText_UR_TrainerBattleBusy[] = _("Whoops! Sorry, but I have to do\nsomething else.\lAnother time, okay?\p"); ALIGNED(4) const u8 gText_UR_NeedTwoMonsOfLevel30OrLower1[] = _("If you want to battle, you need\ntwo POKéMON that are below\lLv. 30.\p"); ALIGNED(4) const u8 gText_UR_NeedTwoMonsOfLevel30OrLower2[] = _("For a battle, you need two\nPOKéMON that are below Lv. 30.\p"); ALIGNED(4) static const u8 sText_DeclineChatMale[] = _("Oh, all right.\nCome see me anytime, okay?\p"); ALIGNED(4) static const u8 stext_DeclineChatFemale[] = _("Oh…\nPlease come by anytime.\p"); // Response from partner when player declines chat const u8 *const gTexts_UR_DeclineChat[GENDER_COUNT] = { sText_DeclineChatMale, stext_DeclineChatFemale }; ALIGNED(4) static const u8 sText_ChatDeclinedMale[] = _("Oh, sorry!\nI just can't right this instant.\lLet's chat another time.\p"); ALIGNED(4) static const u8 sText_ChatDeclinedFemale[] = _("Oh, I'm sorry.\nI have too much to do right now.\lLet's chat some other time.\p"); // Response from partner when they decline chat const u8 *const gTexts_UR_ChatDeclined[GENDER_COUNT] = { sText_ChatDeclinedMale, sText_ChatDeclinedFemale }; ALIGNED(4) static const u8 sText_YoureToughMale[] = _("Whoa!\nI can tell you're pretty tough!\p"); ALIGNED(4) static const u8 sText_UsedGoodMoveMale[] = _("You used that move?\nThat's good strategy!\p"); ALIGNED(4) static const u8 sText_BattleSurpriseMale[] = _("Way to go!\nThat was an eye-opener!\p"); ALIGNED(4) static const u8 sText_SwitchedMonsMale[] = _("Oh! How could you use that\nPOKéMON in that situation?\p"); ALIGNED(4) static const u8 sText_YoureToughFemale[] = _("That POKéMON…\nIt's been raised really well!\p"); ALIGNED(4) static const u8 sText_UsedGoodMoveFemale[] = _("That's it!\nThis is the right move now!\p"); ALIGNED(4) static const u8 sText_BattleSurpriseFemale[] = _("That's awesome!\nYou can battle that way?\p"); ALIGNED(4) static const u8 sText_SwitchedMonsFemale[] = _("You have exquisite timing for\nswitching POKéMON!\p"); const u8 *const gTexts_UR_BattleReaction[GENDER_COUNT][4] = { { sText_YoureToughMale, sText_UsedGoodMoveMale, sText_BattleSurpriseMale, sText_SwitchedMonsMale }, { sText_YoureToughFemale, sText_UsedGoodMoveFemale, sText_BattleSurpriseFemale, sText_SwitchedMonsFemale } }; ALIGNED(4) static const u8 sText_LearnedSomethingMale[] = _("Oh, I see!\nThis is educational!\p"); ALIGNED(4) static const u8 sText_ThatsFunnyMale[] = _("Don't say anything funny anymore!\nI'm sore from laughing!\p"); ALIGNED(4) static const u8 sText_RandomChatMale1[] = _("Oh?\nSomething like that happened.\p"); ALIGNED(4) static const u8 sText_RandomChatMale2[] = _("Hmhm… What?\nSo is this what you're saying?\p"); ALIGNED(4) static const u8 sText_LearnedSomethingFemale[] = _("Is that right?\nI didn't know that.\p"); ALIGNED(4) static const u8 sText_ThatsFunnyFemale[] = _("Ahaha!\nWhat is that about?\p"); ALIGNED(4) static const u8 sText_RandomChatFemale1[] = _("Yes, that's exactly it!\nThat's what I meant.\p"); ALIGNED(4) static const u8 sText_RandomChatFemale2[] = _("In other words…\nYes! That's right!\p"); const u8 *const gTexts_UR_ChatReaction[GENDER_COUNT][4] = { { sText_LearnedSomethingMale, sText_ThatsFunnyMale, sText_RandomChatMale1, sText_RandomChatMale2 }, { sText_LearnedSomethingFemale, sText_ThatsFunnyFemale, sText_RandomChatFemale1, sText_RandomChatFemale2 } }; ALIGNED(4) static const u8 sText_ShowedTrainerCardMale1[] = _("I'm just showing my TRAINER CARD\nas my way of greeting.\p"); ALIGNED(4) static const u8 sText_ShowedTrainerCardMale2[] = _("I hope I get to know you better!\p"); ALIGNED(4) static const u8 sText_ShowedTrainerCardFemale1[] = _("We're showing each other our\nTRAINER CARDS to get acquainted.\p"); ALIGNED(4) static const u8 sText_ShowedTrainerCardFemale2[] = _("Glad to meet you.\nPlease don't be a stranger!\p"); const u8 *const gTexts_UR_TrainerCardReaction[GENDER_COUNT][2] = { { sText_ShowedTrainerCardMale1, sText_ShowedTrainerCardMale2 }, { sText_ShowedTrainerCardFemale1, sText_ShowedTrainerCardFemale2 } }; ALIGNED(4) static const u8 sText_MaleTraded1[] = _("Yeahah!\nI really wanted this POKéMON!\p"); ALIGNED(4) static const u8 sText_MaleTraded2[] = _("Finally, a trade got me that\nPOKéMON I'd wanted a long time.\p"); ALIGNED(4) static const u8 sText_FemaleTraded1[] = _("I'm trading POKéMON right now.\p"); ALIGNED(4) static const u8 sText_FemaleTraded2[] = _("I finally got that POKéMON I\nwanted in a trade!\p"); const u8 *const gTexts_UR_TradeReaction[GENDER_COUNT][4] = { { sText_MaleTraded1, sText_MaleTraded2 }, { sText_FemaleTraded1, sText_FemaleTraded2 } }; const u8 gText_UR_XCheckedTradingBoard[] = _("{STR_VAR_1} checked the\nTRADING BOARD.\p"); ALIGNED(4) const u8 gText_UR_RegisterMonAtTradingBoard[] = _("Welcome to the TRADING BOARD.\pYou may register your POKéMON\nand offer it up for a trade.\pWould you like to register one of\nyour POKéMON?"); ALIGNED(4) const u8 gText_UR_TradingBoardInfo[] = _("This TRADING BOARD is used for\n" "offering a POKéMON for a trade.\p" "All you need to do is register a\n" "POKéMON for a trade.\p" "Another TRAINER may offer a party\n" "POKéMON in return for the trade.\p" "We hope you will register POKéMON\n" "and trade them with many, many\l" "other TRAINERS.\p" "Would you like to register one of\n" "your POKéMON?"); ALIGNED(4) static const u8 sText_ThankYouForRegistering[] = _("こうかんけいじばん の とうろくが\nかんりょう しました\pごりよう ありがとう\nございました!\p"); ALIGNED(4) static const u8 sText_NobodyHasRegistered[] = _("けいじばんに だれも ポケモンを\nとうろく していません\p\n"); ALIGNED(4) const u8 gText_UR_ChooseRequestedMonType[] = _("Please choose the type of POKéMON\nthat you would like in the trade.\n"); ALIGNED(4) const u8 gText_UR_WhichMonWillYouOffer[] = _("Which of your party POKéMON will\nyou offer in trade?\p"); ALIGNED(4) const u8 gText_UR_RegistrationCanceled[] = _("Registration has been canceled.\p"); ALIGNED(4) const u8 gText_UR_RegistraionCompleted[] = _("Registration has been completed.\p"); ALIGNED(4) const u8 gText_UR_TradeCanceled[] = _("The trade has been canceled.\p"); ALIGNED(4) const u8 gText_UR_CancelRegistrationOfMon[] = _("Cancel the registration of your\nLv. {STR_VAR_2} {STR_VAR_1}?"); ALIGNED(4) const u8 gText_UR_CancelRegistrationOfEgg[] = _("Cancel the registration of your\nEGG?"); ALIGNED(4) const u8 gText_UR_RegistrationCanceled2[] = _("The registration has been canceled.\p"); ALIGNED(4) static const u8 sText_TradeTrainersWillBeListed[] = _("こうかんを きぼうしているひとを\nひょうじします"); ALIGNED(4) static const u8 sText_ChooseTrainerToTradeWith2[] = _("こうかん したい トレーナーを\nえらんで ください"); ALIGNED(4) const u8 gText_UR_AskTrainerToMakeTrade[] = _("Would you like to ask {STR_VAR_1} to\nmake a trade?"); ALIGNED(4) static const u8 sText_AwaitingResponseFromTrainer2[] = _("……\nあいての へんじを まっています"); ALIGNED(4) static const u8 sText_NotRegisteredAMonForTrade[] = _("あなたが こうかんにだす\nポケモンが とうろくされていません\p"); ALIGNED(4) const u8 gText_UR_DontHaveTypeTrainerWants[] = _("You don't have a {STR_VAR_2}-type\nPOKéMON that {STR_VAR_1} wants.\p"); ALIGNED(4) const u8 gText_UR_DontHaveEggTrainerWants[] = _("You don't have an EGG that\n{STR_VAR_1} wants.\p"); ALIGNED(4) static const u8 sText_PlayerCantTradeForYourMon[] = _("{STR_VAR_1} can't make a trade for\nyour POKéMON right now.\p"); ALIGNED(4) static const u8 sText_CantTradeForPartnersMon[] = _("You can't make a trade for\n{STR_VAR_1}'s POKéMON right now.\p"); // Unused static const u8 *const sCantTradeMonTexts[] = { sText_PlayerCantTradeForYourMon, sText_CantTradeForPartnersMon }; ALIGNED(4) const u8 gText_UR_TradeOfferRejected[] = _("Your trade offer was rejected.\p"); ALIGNED(4) const u8 gText_UR_EggTrade[] = _("EGG TRADE"); ALIGNED(4) const u8 gText_UR_ChooseJoinCancel[] = _("{DPAD_UPDOWN}CHOOSE {A_BUTTON}JOIN {B_BUTTON}CANCEL"); ALIGNED(4) const u8 gText_UR_ChooseTrainer[] = _("Please choose a TRAINER."); ALIGNED(4) static const u8 sText_ChooseTrainerSingleBattle[] = _("Please choose a TRAINER for\na SINGLE BATTLE."); ALIGNED(4) static const u8 sText_ChooseTrainerDoubleBattle[] = _("Please choose a TRAINER for\na DOUBLE BATTLE."); ALIGNED(4) static const u8 sText_ChooseLeaderMultiBattle[] = _("Please choose the LEADER\nfor a MULTI BATTLE."); ALIGNED(4) static const u8 sText_ChooseTrainerToTradeWith[] = _("Please choose the TRAINER to\ntrade with."); ALIGNED(4) static const u8 sText_ChooseTrainerToShareWonderCards[] = _("Please choose the TRAINER who is\nsharing WONDER CARDS."); ALIGNED(4) static const u8 sText_ChooseTrainerToShareWonderNews[] = _("Please choose the TRAINER who is\nsharing WONDER NEWS."); ALIGNED(4) static const u8 sText_ChooseLeaderPokemonJump[] = _("Jump with mini POKéMON!\nPlease choose the LEADER."); ALIGNED(4) static const u8 sText_ChooseLeaderBerryCrush[] = _("BERRY CRUSH!\nPlease choose the LEADER."); ALIGNED(4) static const u8 sText_ChooseLeaderBerryPicking[] = _("DODRIO BERRY-PICKING!\nPlease choose the LEADER."); const u8 *const gTexts_UR_ChooseTrainer[] = { [LINK_GROUP_SINGLE_BATTLE] = sText_ChooseTrainerSingleBattle, [LINK_GROUP_DOUBLE_BATTLE] = sText_ChooseTrainerDoubleBattle, [LINK_GROUP_MULTI_BATTLE] = sText_ChooseLeaderMultiBattle, [LINK_GROUP_TRADE] = sText_ChooseTrainerToTradeWith, [LINK_GROUP_POKEMON_JUMP] = sText_ChooseLeaderPokemonJump, [LINK_GROUP_BERRY_CRUSH] = sText_ChooseLeaderBerryCrush, [LINK_GROUP_BERRY_PICKING] = sText_ChooseLeaderBerryPicking, [LINK_GROUP_WONDER_CARD] = sText_ChooseTrainerToShareWonderCards, [LINK_GROUP_WONDER_NEWS] = sText_ChooseTrainerToShareWonderNews }; ALIGNED(4) const u8 gText_UR_SearchingForWirelessSystemWait[] = _("Searching for a WIRELESS\nCOMMUNICATION SYSTEM. Wait..."); ALIGNED(4) static const u8 sText_MustHaveTwoMonsForDoubleBattle[] = _("ダブルバトルでは 2ひき いじょうの\nポケモンが ひつようです\p"); ALIGNED(4) const u8 gText_UR_AwaitingPlayersResponse[] = _("Awaiting {STR_VAR_1}'s response…"); ALIGNED(4) const u8 gText_UR_PlayerHasBeenAskedToRegisterYouPleaseWait[] = _("{STR_VAR_1} has been asked to register\nyou as a member. Please wait."); ALIGNED(4) const u8 gText_UR_AwaitingResponseFromWirelessSystem[] = _("Awaiting a response from the\nWIRELESS COMMUNICATION SYSTEM."); ALIGNED(4) static const u8 sText_PleaseWaitForOtherTrainersToGather[] = _("ほかの さんかしゃが そろうまで\nしょうしょう おまちください"); ALIGNED(4) static const u8 sText_NoCardsSharedRightNow[] = _("No CARDS appear to be shared \nright now."); ALIGNED(4) static const u8 sText_NoNewsSharedRightNow[] = _("No NEWS appears to be shared\nright now."); const u8 *const gTexts_UR_NoWonderShared[] = { sText_NoCardsSharedRightNow, sText_NoNewsSharedRightNow }; ALIGNED(4) const u8 gText_UR_Battle[] = _("BATTLE"); ALIGNED(4) const u8 gText_UR_Chat2[] = _("CHAT"); ALIGNED(4) const u8 gText_UR_Greetings[] = _("GREETINGS"); ALIGNED(4) const u8 gText_UR_Exit[] = _("EXIT"); ALIGNED(4) const u8 gText_UR_Exit2[] = _("EXIT"); ALIGNED(4) const u8 gText_UR_Info[] = _("INFO"); ALIGNED(4) const u8 gText_UR_NameWantedOfferLv[] = _("NAME{CLEAR_TO 0x3C}WANTED{CLEAR_TO 0x6E}OFFER{CLEAR_TO 0xC6}LV."); ALIGNED(4) const u8 gText_UR_SingleBattle[] = _("SINGLE BATTLE"); ALIGNED(4) const u8 gText_UR_DoubleBattle[] = _("DOUBLE BATTLE"); ALIGNED(4) const u8 gText_UR_MultiBattle[] = _("MULTI BATTLE"); ALIGNED(4) const u8 gText_UR_PokemonTrades[] = _("POKéMON TRADES"); ALIGNED(4) const u8 gText_UR_Chat[] = _("CHAT"); ALIGNED(4) const u8 gText_UR_Cards[] = _("CARDS"); ALIGNED(4) const u8 gText_UR_WonderCards[] = _("WONDER CARDS"); ALIGNED(4) const u8 gText_UR_WonderNews[] = _("WONDER NEWS"); ALIGNED(4) const u8 gText_UR_PokemonJump[] = _("POKéMON JUMP"); ALIGNED(4) const u8 gText_UR_BerryCrush[] = _("BERRY CRUSH"); ALIGNED(4) const u8 gText_UR_BerryPicking[] = _("BERRY-PICKING"); ALIGNED(4) const u8 gText_UR_Search[] = _("SEARCH"); ALIGNED(4) const u8 gText_UR_SpinTrade[] = _("ぐるぐるこうかん"); ALIGNED(4) const u8 gText_UR_ItemTrade[] = _("アイテムトレード"); ALIGNED(4) static const u8 sText_ItsNormalCard[] = _("It's a NORMAL CARD."); ALIGNED(4) static const u8 sText_ItsBronzeCard[] = _("It's a BRONZE CARD!"); ALIGNED(4) static const u8 sText_ItsCopperCard[] = _("It's a COPPER CARD!"); ALIGNED(4) static const u8 sText_ItsSilverCard[] = _("It's a SILVER CARD!"); ALIGNED(4) static const u8 sText_ItsGoldCard[] = _("It's a GOLD CARD!"); const u8 *const gTexts_UR_CardColor[] = { sText_ItsNormalCard, sText_ItsBronzeCard, sText_ItsCopperCard, sText_ItsSilverCard, sText_ItsGoldCard }; ALIGNED(4) const u8 gText_UR_TrainerCardInfoPage1[] = _("This is {DYNAMIC 0} {DYNAMIC 1}'s\nTRAINER CARD…\l{DYNAMIC 2}\pPOKéDEX: {DYNAMIC 3}\nTIME: {DYNAMIC 4}:{DYNAMIC 5}\p"); ALIGNED(4) const u8 gText_UR_TrainerCardInfoPage2[] = _("BATTLES: {DYNAMIC 0} WINS {DYNAMIC 2} LOSSES\nTRADES: {DYNAMIC 3} TIMES\p“{DYNAMIC 4} {DYNAMIC 5}\n{DYNAMIC 6} {DYNAMIC 7}”\p"); ALIGNED(4) static const u8 sText_GladToMeetYouMale[] = _("{DYNAMIC 1}: Glad to have met you!{PAUSE 60}"); ALIGNED(4) static const u8 sText_GladToMeetYouFemale[] = _("{DYNAMIC 1}: Glad to meet you!{PAUSE 60}"); const u8 *const gTexts_UR_GladToMeetYou[GENDER_COUNT] = { sText_GladToMeetYouMale, sText_GladToMeetYouFemale }; ALIGNED(4) const u8 gText_UR_FinishedCheckingPlayersTrainerCard[] = _("Finished checking {DYNAMIC 1}'s\nTRAINER CARD.{PAUSE 60}"); ALIGNED(4) static const u8 sText_CanceledReadingCard[] = _("Canceled reading the Card."); static const struct MysteryGiftClientCmd sClientScript_DynamicError[] = { {CLI_RECV, MG_LINKID_DYNAMIC_MSG}, {CLI_COPY_MSG}, {CLI_SEND_READY_END}, {CLI_RETURN, CLI_MSG_BUFFER_FAILURE} }; const struct MysteryGiftServerCmd gServerScript_ClientCanceledCard[] = { {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_DynamicError)}, {SVR_SEND}, {SVR_LOAD_MSG, PTR_ARG(sText_CanceledReadingCard)}, {SVR_SEND}, {SVR_RECV, MG_LINKID_READY_END}, {SVR_RETURN, SVR_MSG_CLIENT_CANCELED} }; ================================================ FILE: src/union_room_player_avatar.c ================================================ #include "global.h" #include "event_data.h" #include "event_object_movement.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "union_room_player_avatar.h" #include "script.h" #include "task.h" #include "constants/event_object_movement.h" #include "constants/union_room.h" #include "constants/event_objects.h" #define UR_SPRITE_START_ID (MAX_SPRITES - MAX_UNION_ROOM_LEADERS) // Each parent player can lead a group of up to MAX_RFU_PLAYERS (including themselves). // Multiply the leader's id by MAX_RFU_PLAYERS and add the member's id (0 if the leader) to // get the sprite index of that player. #define UR_PLAYER_SPRITE_ID(leaderId, memberId)(MAX_RFU_PLAYERS * leaderId + memberId) // Original symbol name from ASSERT statements #define UnionObjWork sUnionObjWork static EWRAM_DATA struct UnionRoomObject * sUnionObjWork = NULL; static EWRAM_DATA u32 sUnionObjRefreshTimer = 0; static u8 CreateTask_AnimateUnionRoomPlayers(void); static u32 IsUnionRoomPlayerInvisible(u32 leaderId, u32 member); static void SetUnionRoomObjectFacingDirection(s32 member, s32 leaderId, u8 direction); // + 2 is just to match, those elements are empty and never read // Graphics ids should correspond with the classes in gUnionRoomFacilityClasses static const u8 sUnionRoomObjGfxIds[GENDER_COUNT][NUM_UNION_ROOM_CLASSES + 2] = { [MALE] = { OBJ_EVENT_GFX_COOLTRAINER_M, OBJ_EVENT_GFX_BLACKBELT, OBJ_EVENT_GFX_CAMPER, OBJ_EVENT_GFX_YOUNGSTER, OBJ_EVENT_GFX_BOY, OBJ_EVENT_GFX_BUG_CATCHER, OBJ_EVENT_GFX_MAN, OBJ_EVENT_GFX_ROCKER }, [FEMALE] = { OBJ_EVENT_GFX_COOLTRAINER_F, OBJ_EVENT_GFX_CHANNELER, OBJ_EVENT_GFX_PICNICKER, OBJ_EVENT_GFX_LASS, OBJ_EVENT_GFX_WOMAN_1, OBJ_EVENT_GFX_BATTLE_GIRL, OBJ_EVENT_GFX_WOMAN_2, OBJ_EVENT_GFX_BEAUTY } }; static const s16 sUnionRoomPlayerCoords[MAX_UNION_ROOM_LEADERS][2] = { { 4, 6}, {13, 8}, {10, 6}, { 1, 8}, {13, 4}, { 7, 4}, { 1, 4}, { 7, 8} }; // If there's a group of players interacting in the Union Room, the group // leader will be at one of the positions above and each member in the group // will be at one of the offsets from that position below. The leader will // be at the first offset (0,0), as they're at the center. static const s8 sUnionRoomGroupOffsets[][2] = { { 0, 0}, // Center { 1, 0}, // Left { 0, -1}, // Top {-1, 0}, // Right { 0, 1} // Bottom }; static const u8 sOppositeFacingDirection[] = { [DIR_NONE] = DIR_NONE, [DIR_SOUTH] = DIR_NORTH, [DIR_NORTH] = DIR_SOUTH, [DIR_WEST] = DIR_EAST, [DIR_EAST] = DIR_WEST }; // Compare to sUnionRoomGroupOffsets, the direction each group member // needs to be facing in order to face the group leader in the center. static const u8 sMemberFacingDirections[] = { DIR_SOUTH, // Leader, but never read DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_NORTH }; static const u8 sUnionRoomLocalIds[] = { LOCALID_UNION_ROOM_PLAYER_1, LOCALID_UNION_ROOM_PLAYER_2, LOCALID_UNION_ROOM_PLAYER_3, LOCALID_UNION_ROOM_PLAYER_4, LOCALID_UNION_ROOM_PLAYER_5, LOCALID_UNION_ROOM_PLAYER_6, LOCALID_UNION_ROOM_PLAYER_7, LOCALID_UNION_ROOM_PLAYER_8 }; // Unused static const u16 sHidePlayerFlags[] = { FLAG_HIDE_UNION_ROOM_PLAYER_1, FLAG_HIDE_UNION_ROOM_PLAYER_2, FLAG_HIDE_UNION_ROOM_PLAYER_3, FLAG_HIDE_UNION_ROOM_PLAYER_4, FLAG_HIDE_UNION_ROOM_PLAYER_5, FLAG_HIDE_UNION_ROOM_PLAYER_6, FLAG_HIDE_UNION_ROOM_PLAYER_7, FLAG_HIDE_UNION_ROOM_PLAYER_8 }; static bool32 IsPlayerStandingStill(void) { if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING) return TRUE; else return FALSE; } // Gender and trainer id are used to determine which sprite a player appears as static u8 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id) { return sUnionRoomObjGfxIds[gender][id % NUM_UNION_ROOM_CLASSES]; } static void GetUnionRoomPlayerCoords(u32 leaderId, u32 memberId, s32 * x, s32 * y) { *x = sUnionRoomPlayerCoords[leaderId][0] + sUnionRoomGroupOffsets[memberId][0] + 7; *y = sUnionRoomPlayerCoords[leaderId][1] + sUnionRoomGroupOffsets[memberId][1] + 7; } static bool32 IsUnionRoomPlayerAt(u32 leaderId, u32 memberId, s32 x, s32 y) { if ((sUnionRoomPlayerCoords[leaderId][0] + sUnionRoomGroupOffsets[memberId][0] + MAP_OFFSET == x) && (sUnionRoomPlayerCoords[leaderId][1] + sUnionRoomGroupOffsets[memberId][1] + MAP_OFFSET == y)) return TRUE; else return FALSE; } static bool32 IsUnionRoomPlayerHidden(u32 leaderId) { return FlagGet(FLAG_HIDE_UNION_ROOM_PLAYER_1 + leaderId); } static void HideUnionRoomPlayer(u32 leaderId) { FlagSet(FLAG_HIDE_UNION_ROOM_PLAYER_1 + leaderId); } static void ShowUnionRoomPlayer(u32 leaderId) { FlagClear(FLAG_HIDE_UNION_ROOM_PLAYER_1 + leaderId); } static void SetUnionRoomPlayerGfx(u32 leaderId, u32 gfxId) { VarSet(VAR_OBJ_GFX_ID_0 + leaderId, gfxId); } static void CreateUnionRoomPlayerObjectEvent(u32 leaderId) { TrySpawnObjectEvent(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } static void RemoveUnionRoomPlayerObjectEvent(u32 leaderId) { RemoveObjectEventByLocalIdAndMap(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } static bool32 SetUnionRoomPlayerEnterExitMovement(u32 leaderId, const u8 * movement) { u8 objectId; struct ObjectEvent * object; if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId)) return FALSE; object = &gObjectEvents[objectId]; if (ObjectEventIsMovementOverridden(object)) return FALSE; if (ObjectEventSetHeldMovement(object, *movement)) { AGB_ASSERT_EX(0, ABSPATH("rfu_union_tool.c"), 387); return FALSE; } return TRUE; } static bool32 TryReleaseUnionRoomPlayerObjectEvent(u32 leaderId) { u8 objectId; struct ObjectEvent * object; if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId)) return TRUE; object = &gObjectEvents[objectId]; if (!ObjectEventClearHeldMovementIfFinished(object)) return FALSE; if (!ArePlayerFieldControlsLocked()) UnfreezeObjectEvent(object); else FreezeObjectEvent(object); return TRUE; } u8 InitUnionRoomPlayerObjects(struct UnionRoomObject * players) { s32 i; sUnionObjRefreshTimer = 0; sUnionObjWork = players; AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 442) for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++) { players[i].state = 0; players[i].gfxId = 0; players[i].animState = 0; players[i].schedAnim = UNION_ROOM_SPAWN_NONE; } return CreateTask_AnimateUnionRoomPlayers(); } static const u8 sMovement_UnionPlayerExit[2] = { MOVEMENT_ACTION_FLY_UP, MOVEMENT_ACTION_STEP_END }; static bool32 AnimateUnionRoomPlayerDespawn(s8 * state, u32 leaderId, struct UnionRoomObject * object) { switch (*state) { case 0: if (SetUnionRoomPlayerEnterExitMovement(leaderId, sMovement_UnionPlayerExit) == TRUE) { HideUnionRoomPlayer(leaderId); (*state)++; } break; case 1: if (TryReleaseUnionRoomPlayerObjectEvent(leaderId)) { RemoveUnionRoomPlayerObjectEvent(leaderId); HideUnionRoomPlayer(leaderId); *state = 0; return TRUE; } break; } return FALSE; } static const u8 sMovement_UnionPlayerEnter[2] = { MOVEMENT_ACTION_FLY_DOWN, MOVEMENT_ACTION_STEP_END }; static bool32 AnimateUnionRoomPlayerSpawn(s8 * state, u32 leaderId, struct UnionRoomObject * object) { s16 x, y; switch (*state) { case 0: if (!IsPlayerStandingStill()) break; PlayerGetDestCoords(&x, &y); if (IsUnionRoomPlayerAt(leaderId, 0, x, y) == TRUE) break; player_get_pos_including_state_based_drift(&x, &y); if (IsUnionRoomPlayerAt(leaderId, 0, x, y) == TRUE) break; SetUnionRoomPlayerGfx(leaderId, object->gfxId); CreateUnionRoomPlayerObjectEvent(leaderId); ShowUnionRoomPlayer(leaderId); (*state)++; // fallthrough case 3: // incorrect? if (SetUnionRoomPlayerEnterExitMovement(leaderId, sMovement_UnionPlayerEnter) == 1) (*state)++; break; case 2: if (TryReleaseUnionRoomPlayerObjectEvent(leaderId)) { *state = 0; return TRUE; } break; } return FALSE; } static bool32 SpawnGroupLeader(u32 leaderId, u32 gender, u32 id) { struct UnionRoomObject * object = &sUnionObjWork[leaderId]; AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 561) object->schedAnim = UNION_ROOM_SPAWN_IN; object->gfxId = GetUnionRoomPlayerGraphicsId(gender, id); if (object->state == 0) return TRUE; else return FALSE; } static bool32 DespawnGroupLeader(u32 leaderId) { struct UnionRoomObject * object = &sUnionObjWork[leaderId]; AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 577) object->schedAnim = UNION_ROOM_SPAWN_OUT; if (object->state == 1) return TRUE; else return FALSE; } static void AnimateUnionRoomPlayer(u32 leaderId, struct UnionRoomObject * object) { switch (object->state) { case 0: if (object->schedAnim == UNION_ROOM_SPAWN_IN) { object->state = 2; object->animState = 0; } else { break; } // fallthrough case 2: if (!IsUnionRoomPlayerInvisible(leaderId, 0) && object->schedAnim == UNION_ROOM_SPAWN_OUT) { object->state = 0; object->animState = 0; RemoveUnionRoomPlayerObjectEvent(leaderId); HideUnionRoomPlayer(leaderId); } else if (AnimateUnionRoomPlayerSpawn(&object->animState, leaderId, object) == TRUE) { object->state = 1; } break; case 1: if (object->schedAnim != UNION_ROOM_SPAWN_OUT) break; object->state = 3; object->animState = 0; // fallthrough case 3: if (AnimateUnionRoomPlayerDespawn(&object->animState, leaderId, object) == TRUE) object->state = 0; break; } object->schedAnim = UNION_ROOM_SPAWN_NONE; } static void Task_AnimateUnionRoomPlayers(u8 taskId) { s32 i; AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 643) for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++) AnimateUnionRoomPlayer(i, &sUnionObjWork[i]); } static u8 CreateTask_AnimateUnionRoomPlayers(void) { if (FuncIsActiveTask(Task_AnimateUnionRoomPlayers) == TRUE) { AGB_ASSERT_EX(0, ABSPATH("rfu_union_tool.c"), 655) return NUM_TASKS; } else { return CreateTask(Task_AnimateUnionRoomPlayers, 5); } } static void DestroyTask_AnimateUnionRoomPlayers(void) { u8 taskId = FindTaskIdByFunc(Task_AnimateUnionRoomPlayers); if (taskId < NUM_TASKS) DestroyTask(taskId); } void DestroyUnionRoomPlayerObjects(void) { s32 i; for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++) { if (!IsUnionRoomPlayerHidden(i)) { RemoveUnionRoomPlayerObjectEvent(i); HideUnionRoomPlayer(i); } } sUnionObjWork = NULL; DestroyTask_AnimateUnionRoomPlayers(); } void CreateUnionRoomPlayerSprites(u8 * spriteIds, s32 leaderId) { s32 memberId; for (memberId = 0; memberId < MAX_RFU_PLAYERS; memberId++) { s32 id = UR_PLAYER_SPRITE_ID(leaderId, memberId); spriteIds[id] = CreateVirtualObject(OBJ_EVENT_GFX_MAN, id - UR_SPRITE_START_ID, sUnionRoomPlayerCoords[leaderId][0] + sUnionRoomGroupOffsets[memberId][0], sUnionRoomPlayerCoords[leaderId][1] + sUnionRoomGroupOffsets[memberId][1], 3, 1); SetVirtualObjectInvisibility(id - UR_SPRITE_START_ID, TRUE); } } void DestroyUnionRoomPlayerSprites(u8 *spriteIds) { s32 i; for (i = 0; i < NUM_UNION_ROOM_SPRITES; i++) DestroySprite(&gSprites[spriteIds[i]]); } // Clear the impassable metatiles around the group leaders that get set // to prevent the player from walking through the group member sprites. void MakeGroupAssemblyAreasPassable(void) { s32 leaderId, memberId, x, y; for (leaderId = 0; leaderId < MAX_UNION_ROOM_LEADERS; leaderId++) { for (memberId = 0; memberId < MAX_RFU_PLAYERS; memberId++) { GetUnionRoomPlayerCoords(leaderId, memberId, &x, &y); MapGridSetMetatileImpassabilityAt(x, y, FALSE); } } } static u8 GetNewFacingDirectionForUnionRoomPlayer(u32 memberId, u32 leaderId, struct RfuGameData * gameData) { if (memberId != 0) // If not leader return sMemberFacingDirections[memberId]; else if (gameData->activity == (ACTIVITY_CHAT | IN_UNION_ROOM)) return DIR_SOUTH; else return DIR_EAST; } static u32 IsUnionRoomPlayerInvisible(u32 leaderId, u32 memberId) { return IsVirtualObjectInvisible(UR_PLAYER_SPRITE_ID(leaderId, memberId) - UR_SPRITE_START_ID); } static void SpawnGroupMember(u32 leaderId, u32 memberId, u8 graphicsId, struct RfuGameData * gameData) { s32 x, y; s32 id = UR_PLAYER_SPRITE_ID(leaderId, memberId); if (IsUnionRoomPlayerInvisible(leaderId, memberId) == TRUE) { SetVirtualObjectInvisibility(id - UR_SPRITE_START_ID, FALSE); SetVirtualObjectSpriteAnim(id - UR_SPRITE_START_ID, UNION_ROOM_SPAWN_IN); } SetVirtualObjectGraphics(id - UR_SPRITE_START_ID, graphicsId); SetUnionRoomObjectFacingDirection(memberId, leaderId, GetNewFacingDirectionForUnionRoomPlayer(memberId, leaderId, gameData)); GetUnionRoomPlayerCoords(leaderId, memberId, &x, &y); MapGridSetMetatileImpassabilityAt(x, y, TRUE); } static void DespawnGroupMember(u32 leaderId, u32 memberId) { s32 x, y; SetVirtualObjectSpriteAnim(UR_PLAYER_SPRITE_ID(leaderId, memberId) - UR_SPRITE_START_ID, UNION_ROOM_SPAWN_OUT); GetUnionRoomPlayerCoords(leaderId, memberId, &x, &y); MapGridSetMetatileImpassabilityAt(x, y, FALSE); } static void AssembleGroup(u32 leaderId, struct RfuGameData * gameData) { s16 x, y, x2, y2; s32 i; PlayerGetDestCoords(&x, &y); player_get_pos_including_state_based_drift(&x2, &y2); if (IsVirtualObjectInvisible(UR_PLAYER_SPRITE_ID(leaderId, 0) - UR_SPRITE_START_ID) == TRUE) { if (IsUnionRoomPlayerAt(leaderId, 0, x, y) == TRUE || IsUnionRoomPlayerAt(leaderId, 0, x2, y2) == TRUE) return; SpawnGroupMember(leaderId, 0, GetUnionRoomPlayerGraphicsId(gameData->playerGender, gameData->compatibility.playerTrainerId[0]), gameData); } for (i = 1; i < MAX_RFU_PLAYERS; i++) { if (gameData->partnerInfo[i - 1] == 0) DespawnGroupMember(leaderId, i); else if (IsUnionRoomPlayerAt(leaderId, i, x, y) == FALSE && IsUnionRoomPlayerAt(leaderId, i, x2, y2) == FALSE) SpawnGroupMember(leaderId, i, GetUnionRoomPlayerGraphicsId((gameData->partnerInfo[i - 1] >> PINFO_GENDER_SHIFT) & 1, gameData->partnerInfo[i - 1] & PINFO_TID_MASK), gameData); } } static void SpawnGroupLeaderAndMembers(u32 leaderId, struct RfuGameData * gameData) { u32 i; switch (gameData->activity) { case ACTIVITY_NONE | IN_UNION_ROOM: case ACTIVITY_PLYRTALK | IN_UNION_ROOM: SpawnGroupLeader(leaderId, gameData->playerGender, gameData->compatibility.playerTrainerId[0]); for (i = 0; i < MAX_RFU_PLAYERS; i++) DespawnGroupMember(leaderId, i); break; case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM: case ACTIVITY_TRADE | IN_UNION_ROOM: case ACTIVITY_CHAT | IN_UNION_ROOM: case ACTIVITY_CARD | IN_UNION_ROOM: case ACTIVITY_ACCEPT | IN_UNION_ROOM: case ACTIVITY_DECLINE | IN_UNION_ROOM: case ACTIVITY_NPCTALK | IN_UNION_ROOM: DespawnGroupLeader(leaderId); AssembleGroup(leaderId, gameData); break; default: AGB_ASSERT_EX(0, ABSPATH("rfu_union_tool.c"), 979) } } static void DespawnGroupLeaderAndMembers(u32 leaderId, struct RfuGameData * gameData) { s32 i; DespawnGroupLeader(leaderId); for (i = 0; i < MAX_RFU_PLAYERS; i++) DespawnGroupMember(leaderId, i); } static void UpdateUnionRoomPlayerSprites(struct WirelessLink_URoom * uroom) { s32 i; struct RfuPlayer * leaders; sUnionObjRefreshTimer = 0; for (i = 0, leaders = uroom->playerList->players; i < MAX_UNION_ROOM_LEADERS; i++) { if (leaders[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN) SpawnGroupLeaderAndMembers(i, &leaders[i].rfu.data); else if (leaders[i].groupScheduledAnim == UNION_ROOM_SPAWN_OUT) DespawnGroupLeaderAndMembers(i, &leaders[i].rfu.data); } } void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom) { sUnionObjRefreshTimer = 300; } void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom) { if (++sUnionObjRefreshTimer > 300) UpdateUnionRoomPlayerSprites(uroom); } bool32 TryInteractWithUnionRoomMember(struct RfuPlayerList *list, s16 *memberIdPtr, s16 *leaderIdPtr, u8 *spriteIds) { s16 x, y; s32 leaderId, memberId; struct RfuPlayer * leaders; if (!IsPlayerStandingStill()) return FALSE; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); for (leaderId = 0, leaders = list->players; leaderId < MAX_UNION_ROOM_LEADERS; leaderId++) { for (memberId = 0; memberId < MAX_RFU_PLAYERS; memberId++) { s32 objId = UR_PLAYER_SPRITE_ID(leaderId, memberId); // Is the player in front of a group member position? if (x != sUnionRoomPlayerCoords[leaderId][0] + sUnionRoomGroupOffsets[memberId][0] + 7) continue; if (y != sUnionRoomPlayerCoords[leaderId][1] + sUnionRoomGroupOffsets[memberId][1] + 7) continue; // Has a group member spawned at this position? if (IsVirtualObjectInvisible(objId - UR_SPRITE_START_ID) != FALSE) continue; if (IsVirtualObjectAnimating(objId - UR_SPRITE_START_ID) != FALSE) continue; if (leaders[leaderId].groupScheduledAnim != UNION_ROOM_SPAWN_IN) continue; // Interaction attempt successful, face player SetUnionRoomObjectFacingDirection(memberId, leaderId, sOppositeFacingDirection[GetPlayerFacingDirection()]); *memberIdPtr = memberId; *leaderIdPtr = leaderId; return TRUE; } } return FALSE; } static void SetUnionRoomObjectFacingDirection(s32 memberId, s32 leaderId, u8 direction) { TurnVirtualObject(MAX_RFU_PLAYERS * leaderId - UR_SPRITE_START_ID + memberId, direction); } void UpdateUnionRoomMemberFacing(u32 memberId, u32 leaderId, struct RfuPlayerList *list) { return SetUnionRoomObjectFacingDirection(memberId, leaderId, GetNewFacingDirectionForUnionRoomPlayer(memberId, leaderId, &list->players[leaderId].rfu.data)); } ================================================ FILE: src/util.c ================================================ #include "global.h" const u32 gBitTable[] = { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, 1 << 8, 1 << 9, 1 << 10, 1 << 11, 1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16, 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 21, 1 << 22, 1 << 23, 1 << 24, 1 << 25, 1 << 26, 1 << 27, 1 << 28, 1 << 29, 1 << 30, 1 << 31, }; static const struct SpriteTemplate gInvisibleSpriteTemplate = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; static const u8 sSpriteDimensions[3][4][2] = { // square { {1, 1}, {2, 2}, {4, 4}, {8, 8}, }, // horizontal rectangle { {2, 1}, {4, 1}, {4, 2}, {8, 4}, }, // vertical rectangle { {1, 2}, {1, 4}, {2, 4}, {4, 8}, }, }; static const u16 gCrc16Table[] = { 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, 0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, 0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, 0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD, 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5, 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C, 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974, 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, 0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, 0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, 0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738, 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70, 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7, 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, 0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, 0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, 0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, 0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134, 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C, 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3, 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB, 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, 0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, 0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, 0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, 0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78, }; const u8 gMiscBlank_Gfx[] = INCBIN_U8("graphics/interface/blank.4bpp"); u8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *)) { u8 sprite = CreateSprite(&gInvisibleSpriteTemplate, 248, 168, 14); gSprites[sprite].invisible = TRUE; gSprites[sprite].callback = callback; return sprite; } void StoreWordInTwoHalfwords(u16 *h, unsigned w) { h[0] = (u16)(w); h[1] = (u16)(w >> 16); } void LoadWordFromTwoHalfwords(u16 *h, unsigned *w) { *w = h[0] | (s16)h[1] << 16; } void SetBgAffineStruct(struct BgAffineSrcData *src, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) { src->texX = texX; src->texY = texY; src->scrX = scrX; src->scrY = scrY; src->sx = sx; src->sy = sy; src->alpha = alpha; } void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) { struct BgAffineSrcData src; SetBgAffineStruct(&src, texX, texY, scrX, scrY, sx, sy, alpha); BgAffineSet(&src, dest, 1); } void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) { u8 x, y; s8 i, j; u8 xflip[32]; u8 h = sSpriteDimensions[shape][size][1]; u8 w = sSpriteDimensions[shape][size][0]; for (y = 0; y < h; y++) { int filler = 32 - w; for (x = 0; x < w; x++) { u16 tile = (*tilemap & 0x3ff) * 32; int attr = *tilemap & 0xc00; if (attr == 0) { DmaCopy32Defvars(3, tiles + tile, output, 32); } else if (attr == 0x800) // yflip { for (i = 0; i < 8; i++) { u8 requiredForMatching = 0; ++requiredForMatching; --requiredForMatching; DmaCopy32Defvars(3, tile + (7 - i) * 4 + tiles, output + i * 4, 4); } } else // xflip { for (i = 0; i < 8; i++) { for (j = 0; j < 4; j++) { u8 i2 = i * 4; xflip[i2 + (3 - j)] = (tiles[tile + i2 + j] & 0xf) << 4; xflip[i2 + (3 - j)] |= tiles[tile + i2 + j] >> 4; } } if (*tilemap & 0x800) // yflip { for (i = 0; i < 8; i++) { ++tile; --tile; DmaCopy32Defvars(3, (7 - i) * 4 + xflip, output + i * 4, 4); } } else { DmaCopy32Defvars(3, xflip, output, 32); } } tilemap++; output += 32; } tilemap += filler; } } int CountTrailingZeroBits(u32 value) { u32 i; for (i = 0; i < 32; i++) { if ((value & 1) == 0) value >>= 1; else return i; } return 0; } u16 CalcCRC16(const u8 *data, u32 length) { u16 i, j; u16 crc = 0x1121; for (i = 0; i < length; i++) { crc ^= data[i]; for (j = 0; j < 8; j++) { if (crc & 1) crc = (crc >> 1) ^ 0x8408; else crc >>= 1; } } return ~crc; } u16 CalcCRC16WithTable(const u8 *data, u32 length) { u32 i; u16 crc = 0x1121; u8 byte; for (i = 0; i < length; i++) { byte = crc >> 8; crc ^= data[i]; crc = byte ^ gCrc16Table[(u8)crc]; } return ~crc; } u32 CalcByteArraySum(const u8 * array, u32 size) { s32 i; u32 result = 0; for (i = 0; i < size; i++) { result += array[i]; } return result; } ================================================ FILE: src/vs_seeker.c ================================================ #include "global.h" #include "gflib.h" #include "constants/songs.h" #include "task.h" #include "event_object_movement.h" #include "new_menu_helpers.h" #include "item_use.h" #include "event_scripts.h" #include "event_data.h" #include "script.h" #include "event_object_lock.h" #include "field_specials.h" #include "item.h" #include "item_menu.h" #include "field_effect.h" #include "script_movement.h" #include "battle.h" #include "battle_setup.h" #include "random.h" #include "field_player_avatar.h" #include "vs_seeker.h" #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/maps.h" #include "constants/items.h" #include "constants/quest_log.h" #include "constants/trainer_types.h" // Each trainer can have up to 6 parties, including their original party. // Each rematch is unavailable until the player has progressed to a certain point in the story (see TryGetRematchTrainerIdGivenGameState). // A list of the trainer ids for each party is in sRematches. If a party doesn't update for a progression point it will have SKIP instead, // and that trainer id will be ignored. #define MAX_REMATCH_PARTIES 6 #define SKIP 0xFFFF enum { VSSEEKER_NOT_CHARGED, VSSEEKER_NO_ONE_IN_RANGE, VSSEEKER_CAN_USE, }; typedef enum { VSSEEKER_SINGLE_RESP_RAND, VSSEEKER_SINGLE_RESP_NO, VSSEEKER_SINGLE_RESP_YES } VsSeekerSingleRespCode; typedef enum { VSSEEKER_RESPONSE_NO_RESPONSE, VSSEEKER_RESPONSE_UNFOUGHT_TRAINERS, VSSEEKER_RESPONSE_FOUND_REMATCHES } VsSeekerResponseCode; struct RematchData { u16 trainerIdxs[MAX_REMATCH_PARTIES]; u16 mapGroup; // unused u16 mapNum; // unused }; struct VsSeekerTrainerInfo { const u8 *script; u16 trainerIdx; u8 localId; u8 objectEventId; s16 xCoord; s16 yCoord; u8 graphicsId; }; struct VsSeekerStruct { /*0x000*/ struct VsSeekerTrainerInfo trainerInfo[OBJECT_EVENTS_COUNT]; /*0x100*/ u8 filler_100[0x300]; /*0x400*/ u16 trainerIdxArray[OBJECT_EVENTS_COUNT]; /*0x420*/ u8 runningBehaviourEtcArray[OBJECT_EVENTS_COUNT]; /*0x430*/ u8 numRematchableTrainers; /*0x431*/ u8 trainerHasNotYetBeenFought:1; /*0x431*/ u8 trainerDoesNotWantRematch:1; /*0x431*/ u8 trainerWantsRematch:1; u8 responseCode:5; }; // static declarations static EWRAM_DATA struct VsSeekerStruct *sVsSeeker = NULL; static void VsSeekerResetInBagStepCounter(void); static void VsSeekerResetChargingStepCounter(void); static void Task_ResetObjectsRematchWantedState(u8 taskId); static void ResetMovementOfRematchableTrainers(void); static void Task_VsSeeker_1(u8 taskId); static void Task_VsSeeker_2(u8 taskId); static void GatherNearbyTrainerInfo(void); static void Task_VsSeeker_3(u8 taskId); static bool8 CanUseVsSeeker(void); static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData); static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx); static u8 ShouldTryRematchBattleInternal(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent); static u8 HasRematchTrainerAlreadyBeenFought(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent); static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId); static bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerIdx); static u8 GetRunningBehaviorFromGraphicsId(u8 graphicsId); static u16 GetTrainerFlagFromScript(const u8 * script); static int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx); static bool32 IsThisTrainerRematchable(u32 localId); static void ClearAllTrainerRematchStates(void); static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo); static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr); static u8 GetRematchableTrainerLocalId(void); static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script); static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx); static void StartAllRespondantIdleMovements(void); static bool8 ObjectEventIdIsSane(u8 objectEventId); static u8 GetRandomFaceDirectionMovementType(); static const struct RematchData sRematches[] = { { {TRAINER_YOUNGSTER_BEN, TRAINER_YOUNGSTER_BEN_2, SKIP, TRAINER_YOUNGSTER_BEN_3, TRAINER_YOUNGSTER_BEN_4}, MAP(ROUTE3) }, { {TRAINER_YOUNGSTER_CALVIN, TRAINER_YOUNGSTER_CALVIN}, MAP(ROUTE3) }, { {TRAINER_BUG_CATCHER_COLTON, TRAINER_BUG_CATCHER_COLTON_2, SKIP, TRAINER_BUG_CATCHER_COLTON_3, SKIP, TRAINER_BUG_CATCHER_COLTON_4}, MAP(ROUTE3) }, { {TRAINER_BUG_CATCHER_GREG, TRAINER_BUG_CATCHER_GREG}, MAP(ROUTE3) }, { {TRAINER_BUG_CATCHER_JAMES, TRAINER_BUG_CATCHER_JAMES}, MAP(ROUTE3) }, { {TRAINER_LASS_JANICE, TRAINER_LASS_JANICE_2, SKIP, TRAINER_LASS_JANICE_3}, MAP(ROUTE3) }, { {TRAINER_LASS_SALLY, TRAINER_LASS_SALLY}, MAP(ROUTE3) }, { {TRAINER_LASS_ROBIN, TRAINER_LASS_ROBIN}, MAP(ROUTE3) }, { {TRAINER_LASS_CRISSY, TRAINER_LASS_CRISSY}, MAP(ROUTE4) }, { {TRAINER_YOUNGSTER_TIMMY, TRAINER_YOUNGSTER_TIMMY_2, SKIP, TRAINER_YOUNGSTER_TIMMY_3, SKIP, TRAINER_YOUNGSTER_TIMMY_4}, MAP(ROUTE24) }, { {TRAINER_BUG_CATCHER_CALE, TRAINER_BUG_CATCHER_CALE}, MAP(ROUTE24) }, { {TRAINER_LASS_RELI, TRAINER_LASS_RELI_2, SKIP, TRAINER_LASS_RELI_3}, MAP(ROUTE24) }, { {TRAINER_LASS_ALI, TRAINER_LASS_ALI}, MAP(ROUTE24) }, { {TRAINER_CAMPER_SHANE, TRAINER_CAMPER_SHANE}, MAP(ROUTE24) }, { {TRAINER_CAMPER_ETHAN, TRAINER_CAMPER_ETHAN}, MAP(ROUTE24) }, { {TRAINER_YOUNGSTER_JOEY, TRAINER_YOUNGSTER_JOEY}, MAP(ROUTE25) }, { {TRAINER_YOUNGSTER_DAN, TRAINER_YOUNGSTER_DAN}, MAP(ROUTE25) }, { {TRAINER_YOUNGSTER_CHAD, TRAINER_YOUNGSTER_CHAD_2, SKIP, TRAINER_YOUNGSTER_CHAD_3, TRAINER_YOUNGSTER_CHAD_4}, MAP(ROUTE25) }, { {TRAINER_PICNICKER_KELSEY, TRAINER_PICNICKER_KELSEY_2, SKIP, TRAINER_PICNICKER_KELSEY_3, TRAINER_PICNICKER_KELSEY_4}, MAP(ROUTE25) }, { {TRAINER_LASS_HALEY, TRAINER_LASS_HALEY}, MAP(ROUTE25) }, { {TRAINER_HIKER_FRANKLIN, SKIP, TRAINER_HIKER_FRANKLIN_2}, MAP(ROUTE25) }, { {TRAINER_HIKER_NOB, TRAINER_HIKER_NOB}, MAP(ROUTE25) }, { {TRAINER_HIKER_WAYNE, TRAINER_HIKER_WAYNE}, MAP(ROUTE25) }, { {TRAINER_CAMPER_FLINT, TRAINER_CAMPER_FLINT}, MAP(ROUTE25) }, { {TRAINER_BUG_CATCHER_KEIGO, TRAINER_BUG_CATCHER_KEIGO}, MAP(ROUTE6) }, { {TRAINER_BUG_CATCHER_ELIJAH, TRAINER_BUG_CATCHER_ELIJAH}, MAP(ROUTE6) }, { {TRAINER_CAMPER_RICKY, TRAINER_CAMPER_RICKY_2, SKIP, TRAINER_CAMPER_RICKY_3, SKIP, TRAINER_CAMPER_RICKY_4}, MAP(ROUTE6) }, { {TRAINER_CAMPER_JEFF, TRAINER_CAMPER_JEFF_2, SKIP, TRAINER_CAMPER_JEFF_3, SKIP, TRAINER_CAMPER_JEFF_4}, MAP(ROUTE6) }, { {TRAINER_PICNICKER_NANCY, TRAINER_PICNICKER_NANCY}, MAP(ROUTE6) }, { {TRAINER_PICNICKER_ISABELLE, TRAINER_PICNICKER_ISABELLE_2, SKIP, TRAINER_PICNICKER_ISABELLE_3, TRAINER_PICNICKER_ISABELLE_4}, MAP(ROUTE6) }, { {TRAINER_YOUNGSTER_EDDIE, TRAINER_YOUNGSTER_EDDIE}, MAP(ROUTE11) }, { {TRAINER_YOUNGSTER_DILLON, TRAINER_YOUNGSTER_DILLON}, MAP(ROUTE11) }, { {TRAINER_YOUNGSTER_YASU, SKIP, TRAINER_YOUNGSTER_YASU_2, SKIP, TRAINER_YOUNGSTER_YASU_3}, MAP(ROUTE11) }, { {TRAINER_YOUNGSTER_DAVE, TRAINER_YOUNGSTER_DAVE}, MAP(ROUTE11) }, { {TRAINER_ENGINEER_BRAXTON, TRAINER_ENGINEER_BRAXTON}, MAP(ROUTE11) }, { {TRAINER_ENGINEER_BERNIE, SKIP, SKIP, TRAINER_ENGINEER_BERNIE_2}, MAP(ROUTE11) }, { {TRAINER_GAMER_HUGO, TRAINER_GAMER_HUGO}, MAP(ROUTE11) }, { {TRAINER_GAMER_JASPER, TRAINER_GAMER_JASPER}, MAP(ROUTE11) }, { {TRAINER_GAMER_DIRK, TRAINER_GAMER_DIRK}, MAP(ROUTE11) }, { {TRAINER_GAMER_DARIAN, SKIP, SKIP, TRAINER_GAMER_DARIAN_2}, MAP(ROUTE11) }, { {TRAINER_BUG_CATCHER_BRENT, TRAINER_BUG_CATCHER_BRENT}, MAP(ROUTE9) }, { {TRAINER_BUG_CATCHER_CONNER, TRAINER_BUG_CATCHER_CONNER}, MAP(ROUTE9) }, { {TRAINER_CAMPER_CHRIS, SKIP, TRAINER_CAMPER_CHRIS_2, TRAINER_CAMPER_CHRIS_3, SKIP, TRAINER_CAMPER_CHRIS_4}, MAP(ROUTE9) }, { {TRAINER_CAMPER_DREW, TRAINER_CAMPER_DREW}, MAP(ROUTE9) }, { {TRAINER_PICNICKER_ALICIA, SKIP, TRAINER_PICNICKER_ALICIA_2, TRAINER_PICNICKER_ALICIA_3, SKIP, TRAINER_PICNICKER_ALICIA_4}, MAP(ROUTE9) }, { {TRAINER_PICNICKER_CAITLIN, TRAINER_PICNICKER_CAITLIN}, MAP(ROUTE9) }, { {TRAINER_HIKER_ALAN, TRAINER_HIKER_ALAN}, MAP(ROUTE9) }, { {TRAINER_HIKER_BRICE, TRAINER_HIKER_BRICE}, MAP(ROUTE9) }, { {TRAINER_HIKER_JEREMY, SKIP, SKIP, TRAINER_HIKER_JEREMY_2}, MAP(ROUTE9) }, { {TRAINER_PICNICKER_HEIDI, TRAINER_PICNICKER_HEIDI}, MAP(ROUTE10) }, { {TRAINER_PICNICKER_CAROL, TRAINER_PICNICKER_CAROL}, MAP(ROUTE10) }, { {TRAINER_POKEMANIAC_MARK, SKIP, SKIP, TRAINER_POKEMANIAC_MARK_2, SKIP, TRAINER_POKEMANIAC_MARK_3}, MAP(ROUTE10) }, { {TRAINER_POKEMANIAC_HERMAN, SKIP, SKIP, TRAINER_POKEMANIAC_HERMAN_2, SKIP, TRAINER_POKEMANIAC_HERMAN_3}, MAP(ROUTE10) }, { {TRAINER_HIKER_CLARK, TRAINER_HIKER_CLARK}, MAP(ROUTE10) }, { {TRAINER_HIKER_TRENT, SKIP, SKIP, TRAINER_HIKER_TRENT_2}, MAP(ROUTE10) }, { {TRAINER_LASS_PAIGE, TRAINER_LASS_PAIGE}, MAP(ROUTE8) }, { {TRAINER_LASS_ANDREA, TRAINER_LASS_ANDREA}, MAP(ROUTE8) }, { {TRAINER_LASS_MEGAN, SKIP, TRAINER_LASS_MEGAN_2, SKIP, TRAINER_LASS_MEGAN_3}, MAP(ROUTE8) }, { {TRAINER_LASS_JULIA, TRAINER_LASS_JULIA}, MAP(ROUTE8) }, { {TRAINER_SUPER_NERD_AIDAN, TRAINER_SUPER_NERD_AIDAN}, MAP(ROUTE8) }, { {TRAINER_SUPER_NERD_GLENN, SKIP, SKIP, TRAINER_SUPER_NERD_GLENN_2}, MAP(ROUTE8) }, { {TRAINER_SUPER_NERD_LESLIE, TRAINER_SUPER_NERD_LESLIE}, MAP(ROUTE8) }, { {TRAINER_GAMER_STAN, TRAINER_GAMER_STAN}, MAP(ROUTE8) }, { {TRAINER_GAMER_RICH, SKIP, SKIP, TRAINER_GAMER_RICH_2}, MAP(ROUTE8) }, { {TRAINER_TWINS_ELI_ANNE, SKIP, SKIP, TRAINER_TWINS_ELI_ANNE_2}, MAP(ROUTE8) }, { {TRAINER_BIKER_RICARDO, TRAINER_BIKER_RICARDO}, MAP(ROUTE8) }, { {TRAINER_BIKER_JAREN, SKIP, SKIP, TRAINER_BIKER_JAREN_2}, MAP(ROUTE8) }, { {TRAINER_FISHERMAN_NED, TRAINER_FISHERMAN_NED}, MAP(ROUTE12) }, { {TRAINER_FISHERMAN_CHIP, TRAINER_FISHERMAN_CHIP}, MAP(ROUTE12) }, { {TRAINER_FISHERMAN_HANK, TRAINER_FISHERMAN_HANK}, MAP(ROUTE12) }, { {TRAINER_FISHERMAN_ELLIOT, SKIP, SKIP, TRAINER_FISHERMAN_ELLIOT_2}, MAP(ROUTE12) }, { {TRAINER_FISHERMAN_ANDREW, TRAINER_FISHERMAN_ANDREW}, MAP(ROUTE12) }, { {TRAINER_ROCKER_LUCA, SKIP, SKIP, TRAINER_ROCKER_LUCA_2}, MAP(ROUTE12) }, { {TRAINER_CAMPER_JUSTIN, TRAINER_CAMPER_JUSTIN}, MAP(ROUTE12) }, { {TRAINER_YOUNG_COUPLE_GIA_JES, SKIP, SKIP, TRAINER_YOUNG_COUPLE_GIA_JES_2, SKIP, TRAINER_YOUNG_COUPLE_GIA_JES_3}, MAP(ROUTE12) }, { {TRAINER_BIKER_JARED, TRAINER_BIKER_JARED}, MAP(ROUTE13) }, { {TRAINER_BEAUTY_LOLA, TRAINER_BEAUTY_LOLA}, MAP(ROUTE13) }, { {TRAINER_BEAUTY_SHEILA, SKIP, SKIP, SKIP, TRAINER_BEAUTY_SHEILA_2}, MAP(ROUTE13) }, { {TRAINER_BIRD_KEEPER_SEBASTIAN, TRAINER_BIRD_KEEPER_SEBASTIAN}, MAP(ROUTE13) }, { {TRAINER_BIRD_KEEPER_PERRY, TRAINER_BIRD_KEEPER_PERRY}, MAP(ROUTE13) }, { {TRAINER_BIRD_KEEPER_ROBERT, SKIP, SKIP, TRAINER_BIRD_KEEPER_ROBERT_2, TRAINER_BIRD_KEEPER_ROBERT_3}, MAP(ROUTE13) }, { {TRAINER_PICNICKER_ALMA, TRAINER_PICNICKER_ALMA}, MAP(ROUTE13) }, { {TRAINER_PICNICKER_SUSIE, SKIP, SKIP, TRAINER_PICNICKER_SUSIE_2, TRAINER_PICNICKER_SUSIE_3, TRAINER_PICNICKER_SUSIE_4}, MAP(ROUTE13) }, { {TRAINER_PICNICKER_VALERIE, TRAINER_PICNICKER_VALERIE}, MAP(ROUTE13) }, { {TRAINER_PICNICKER_GWEN, TRAINER_PICNICKER_GWEN}, MAP(ROUTE13) }, { {TRAINER_BIKER_MALIK, TRAINER_BIKER_MALIK}, MAP(ROUTE14) }, { {TRAINER_BIKER_LUKAS, SKIP, SKIP, SKIP, TRAINER_BIKER_LUKAS_2}, MAP(ROUTE14) }, { {TRAINER_BIKER_ISAAC, TRAINER_BIKER_ISAAC}, MAP(ROUTE14) }, { {TRAINER_BIKER_GERALD, TRAINER_BIKER_GERALD}, MAP(ROUTE14) }, { {TRAINER_BIRD_KEEPER_DONALD, TRAINER_BIRD_KEEPER_DONALD}, MAP(ROUTE14) }, { {TRAINER_BIRD_KEEPER_BENNY, SKIP, SKIP, TRAINER_BIRD_KEEPER_BENNY_2, TRAINER_BIRD_KEEPER_BENNY_3}, MAP(ROUTE14) }, { {TRAINER_BIRD_KEEPER_CARTER, TRAINER_BIRD_KEEPER_CARTER}, MAP(ROUTE14) }, { {TRAINER_BIRD_KEEPER_MITCH, TRAINER_BIRD_KEEPER_MITCH}, MAP(ROUTE14) }, { {TRAINER_BIRD_KEEPER_BECK, TRAINER_BIRD_KEEPER_BECK}, MAP(ROUTE14) }, { {TRAINER_BIRD_KEEPER_MARLON, SKIP, SKIP, TRAINER_BIRD_KEEPER_MARLON_2, TRAINER_BIRD_KEEPER_MARLON_3}, MAP(ROUTE14) }, { {TRAINER_TWINS_KIRI_JAN, TRAINER_TWINS_KIRI_JAN}, MAP(ROUTE14) }, { {TRAINER_BIKER_ERNEST, TRAINER_BIKER_ERNEST}, MAP(ROUTE15) }, { {TRAINER_BIKER_ALEX, TRAINER_BIKER_ALEX}, MAP(ROUTE15) }, { {TRAINER_BEAUTY_GRACE, SKIP, SKIP, SKIP, TRAINER_BEAUTY_GRACE_2}, MAP(ROUTE15) }, { {TRAINER_BEAUTY_OLIVIA, TRAINER_BEAUTY_OLIVIA}, MAP(ROUTE15) }, { {TRAINER_BIRD_KEEPER_EDWIN, TRAINER_BIRD_KEEPER_EDWIN}, MAP(ROUTE15) }, { {TRAINER_BIRD_KEEPER_CHESTER, SKIP, SKIP, TRAINER_BIRD_KEEPER_CHESTER_2, TRAINER_BIRD_KEEPER_CHESTER_3}, MAP(ROUTE15) }, { {TRAINER_PICNICKER_YAZMIN, TRAINER_PICNICKER_YAZMIN}, MAP(ROUTE15) }, { {TRAINER_PICNICKER_KINDRA, TRAINER_PICNICKER_KINDRA}, MAP(ROUTE15) }, { {TRAINER_PICNICKER_BECKY, SKIP, SKIP, TRAINER_PICNICKER_BECKY_2, TRAINER_PICNICKER_BECKY_3, TRAINER_PICNICKER_BECKY_4}, MAP(ROUTE15) }, { {TRAINER_PICNICKER_CELIA, TRAINER_PICNICKER_CELIA}, MAP(ROUTE15) }, { {TRAINER_CRUSH_KIN_RON_MYA, SKIP, SKIP, TRAINER_CRUSH_KIN_RON_MYA_2, TRAINER_CRUSH_KIN_RON_MYA_3, TRAINER_CRUSH_KIN_RON_MYA_4}, MAP(ROUTE15) }, { {TRAINER_BIKER_LAO, TRAINER_BIKER_LAO}, MAP(ROUTE16) }, { {TRAINER_BIKER_HIDEO, TRAINER_BIKER_HIDEO}, MAP(ROUTE16) }, { {TRAINER_BIKER_RUBEN, SKIP, SKIP, SKIP, TRAINER_BIKER_RUBEN_2}, MAP(ROUTE16) }, { {TRAINER_CUE_BALL_KOJI, TRAINER_CUE_BALL_KOJI}, MAP(ROUTE16) }, { {TRAINER_CUE_BALL_LUKE, TRAINER_CUE_BALL_LUKE}, MAP(ROUTE16) }, { {TRAINER_CUE_BALL_CAMRON, SKIP, SKIP, SKIP, TRAINER_CUE_BALL_CAMRON_2}, MAP(ROUTE16) }, { {TRAINER_YOUNG_COUPLE_LEA_JED, TRAINER_YOUNG_COUPLE_LEA_JED}, MAP(ROUTE16) }, { {TRAINER_BIKER_BILLY, TRAINER_BIKER_BILLY}, MAP(ROUTE17) }, { {TRAINER_BIKER_NIKOLAS, TRAINER_BIKER_NIKOLAS}, MAP(ROUTE17) }, { {TRAINER_BIKER_JAXON, SKIP, SKIP, SKIP, TRAINER_BIKER_JAXON_2}, MAP(ROUTE17) }, { {TRAINER_BIKER_WILLIAM, TRAINER_BIKER_WILLIAM}, MAP(ROUTE17) }, { {TRAINER_CUE_BALL_RAUL, TRAINER_CUE_BALL_RAUL}, MAP(ROUTE17) }, { {TRAINER_CUE_BALL_ISAIAH, SKIP, SKIP, SKIP, TRAINER_CUE_BALL_ISAIAH_2}, MAP(ROUTE17) }, { {TRAINER_CUE_BALL_ZEEK, TRAINER_CUE_BALL_ZEEK}, MAP(ROUTE17) }, { {TRAINER_CUE_BALL_JAMAL, TRAINER_CUE_BALL_JAMAL}, MAP(ROUTE17) }, { {TRAINER_CUE_BALL_COREY, SKIP, SKIP, SKIP, TRAINER_CUE_BALL_COREY_2}, MAP(ROUTE17) }, { {TRAINER_BIKER_VIRGIL, TRAINER_BIKER_VIRGIL}, MAP(ROUTE17) }, { {TRAINER_BIRD_KEEPER_WILTON, TRAINER_BIRD_KEEPER_WILTON}, MAP(ROUTE18) }, { {TRAINER_BIRD_KEEPER_RAMIRO, TRAINER_BIRD_KEEPER_RAMIRO}, MAP(ROUTE18) }, { {TRAINER_BIRD_KEEPER_JACOB, SKIP, SKIP, TRAINER_BIRD_KEEPER_JACOB_2, TRAINER_BIRD_KEEPER_JACOB_3}, MAP(ROUTE18) }, { {TRAINER_SWIMMER_MALE_RICHARD, TRAINER_SWIMMER_MALE_RICHARD}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_MALE_REECE, TRAINER_SWIMMER_MALE_REECE}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_MALE_MATTHEW, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_MATTHEW_2}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_MALE_DOUGLAS, TRAINER_SWIMMER_MALE_DOUGLAS}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_MALE_DAVID, TRAINER_SWIMMER_MALE_DAVID}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_MALE_TONY, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_TONY_2}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_MALE_AXLE, TRAINER_SWIMMER_MALE_AXLE}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_FEMALE_ANYA, TRAINER_SWIMMER_FEMALE_ANYA}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_FEMALE_ALICE, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_ALICE_2}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_FEMALE_CONNIE, TRAINER_SWIMMER_FEMALE_CONNIE}, MAP(ROUTE19) }, { {TRAINER_SIS_AND_BRO_LIA_LUC, TRAINER_SIS_AND_BRO_LIA_LUC}, MAP(ROUTE19) }, { {TRAINER_SWIMMER_MALE_BARRY, TRAINER_SWIMMER_MALE_BARRY}, MAP(ROUTE20) }, { {TRAINER_SWIMMER_MALE_DEAN, TRAINER_SWIMMER_MALE_DEAN}, MAP(ROUTE20) }, { {TRAINER_SWIMMER_MALE_DARRIN, SKIP, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_DARRIN_2}, MAP(ROUTE20) }, { {TRAINER_SWIMMER_FEMALE_TIFFANY, TRAINER_SWIMMER_FEMALE_TIFFANY}, MAP(ROUTE20) }, { {TRAINER_SWIMMER_FEMALE_NORA, TRAINER_SWIMMER_FEMALE_NORA}, MAP(ROUTE20) }, { {TRAINER_SWIMMER_FEMALE_MELISSA, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_MELISSA_2}, MAP(ROUTE20) }, { {TRAINER_SWIMMER_FEMALE_SHIRLEY, TRAINER_SWIMMER_FEMALE_SHIRLEY}, MAP(ROUTE20) }, { {TRAINER_BIRD_KEEPER_ROGER, TRAINER_BIRD_KEEPER_ROGER}, MAP(ROUTE20) }, { {TRAINER_PICNICKER_MISSY, SKIP, SKIP, SKIP, TRAINER_PICNICKER_MISSY_2, TRAINER_PICNICKER_MISSY_3}, MAP(ROUTE20) }, { {TRAINER_PICNICKER_IRENE, TRAINER_PICNICKER_IRENE}, MAP(ROUTE20) }, { {TRAINER_FISHERMAN_RONALD, TRAINER_FISHERMAN_RONALD}, MAP(ROUTE21_NORTH) }, { {TRAINER_FISHERMAN_CLAUDE, TRAINER_FISHERMAN_CLAUDE}, MAP(ROUTE21_NORTH) }, { {TRAINER_FISHERMAN_WADE, SKIP, SKIP, SKIP, TRAINER_FISHERMAN_WADE_2}, MAP(ROUTE21_NORTH) }, { {TRAINER_FISHERMAN_NOLAN, TRAINER_FISHERMAN_NOLAN}, MAP(ROUTE21_NORTH) }, { {TRAINER_SWIMMER_MALE_SPENCER, TRAINER_SWIMMER_MALE_SPENCER}, MAP(ROUTE21_NORTH) }, { {TRAINER_SWIMMER_MALE_JACK, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_JACK_2}, MAP(ROUTE21_NORTH) }, { {TRAINER_SWIMMER_MALE_JEROME, TRAINER_SWIMMER_MALE_JEROME}, MAP(ROUTE21_NORTH) }, { {TRAINER_SWIMMER_MALE_ROLAND, TRAINER_SWIMMER_MALE_ROLAND}, MAP(ROUTE21_NORTH) }, { {TRAINER_SIS_AND_BRO_LIL_IAN, SKIP, SKIP, SKIP, TRAINER_SIS_AND_BRO_LIL_IAN_2, TRAINER_SIS_AND_BRO_LIL_IAN_3}, MAP(ROUTE21_NORTH) }, { {TRAINER_SWIMMER_FEMALE_MARIA, TRAINER_SWIMMER_FEMALE_MARIA}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_SWIMMER_FEMALE_ABIGAIL, TRAINER_SWIMMER_FEMALE_ABIGAIL}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_SWIMMER_MALE_FINN, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_FINN_2}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_SWIMMER_MALE_GARRETT, TRAINER_SWIMMER_MALE_GARRETT}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_FISHERMAN_TOMMY, TRAINER_FISHERMAN_TOMMY}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_CRUSH_GIRL_SHARON, SKIP, SKIP, SKIP, TRAINER_CRUSH_GIRL_SHARON_2, TRAINER_CRUSH_GIRL_SHARON_3}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_CRUSH_GIRL_TANYA, SKIP, SKIP, SKIP, TRAINER_CRUSH_GIRL_TANYA_2, TRAINER_CRUSH_GIRL_TANYA_3}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_BLACK_BELT_SHEA, SKIP, SKIP, SKIP, TRAINER_BLACK_BELT_SHEA_2, TRAINER_BLACK_BELT_SHEA_3}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_BLACK_BELT_HUGH, SKIP, SKIP, SKIP, TRAINER_BLACK_BELT_HUGH_2, TRAINER_BLACK_BELT_HUGH_3}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_CAMPER_BRYCE, TRAINER_CAMPER_BRYCE}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_PICNICKER_CLAIRE, TRAINER_PICNICKER_CLAIRE}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_CRUSH_KIN_MIK_KIA, SKIP, SKIP, SKIP, TRAINER_CRUSH_KIN_MIK_KIA_2, TRAINER_CRUSH_KIN_MIK_KIA_3}, MAP(ONE_ISLAND_KINDLE_ROAD) }, { {TRAINER_SWIMMER_FEMALE_AMARA, TRAINER_SWIMMER_FEMALE_AMARA}, MAP(ONE_ISLAND_TREASURE_BEACH) }, { {TRAINER_AROMA_LADY_NIKKI, TRAINER_AROMA_LADY_NIKKI}, MAP(THREE_ISLAND_BOND_BRIDGE) }, { {TRAINER_AROMA_LADY_VIOLET, TRAINER_AROMA_LADY_VIOLET}, MAP(THREE_ISLAND_BOND_BRIDGE) }, { {TRAINER_TUBER_AMIRA, SKIP, SKIP, SKIP, TRAINER_TUBER_AMIRA_2}, MAP(THREE_ISLAND_BOND_BRIDGE) }, { {TRAINER_TUBER_ALEXIS, TRAINER_TUBER_ALEXIS}, MAP(THREE_ISLAND_BOND_BRIDGE) }, { {TRAINER_SWIMMER_FEMALE_TISHA, TRAINER_SWIMMER_FEMALE_TISHA}, MAP(THREE_ISLAND_BOND_BRIDGE) }, { {TRAINER_TWINS_JOY_MEG, SKIP, SKIP, SKIP, TRAINER_TWINS_JOY_MEG_2}, MAP(THREE_ISLAND_BOND_BRIDGE) }, { {TRAINER_PAINTER_DAISY, TRAINER_PAINTER_DAISY}, MAP(FIVE_ISLAND_RESORT_GORGEOUS) }, { {TRAINER_PAINTER_CELINA, TRAINER_PAINTER_CELINA}, MAP(FIVE_ISLAND_RESORT_GORGEOUS) }, { {TRAINER_PAINTER_RAYNA, SKIP, SKIP, SKIP, SKIP, TRAINER_PAINTER_RAYNA_2}, MAP(FIVE_ISLAND_RESORT_GORGEOUS) }, { {TRAINER_LADY_JACKI, TRAINER_LADY_JACKI}, MAP(FIVE_ISLAND_RESORT_GORGEOUS) }, { {TRAINER_LADY_GILLIAN, TRAINER_LADY_GILLIAN}, MAP(FIVE_ISLAND_RESORT_GORGEOUS) }, { {TRAINER_YOUNGSTER_DESTIN, SKIP, SKIP, SKIP, SKIP, TRAINER_YOUNGSTER_DESTIN_2}, MAP(FIVE_ISLAND_RESORT_GORGEOUS) }, { {TRAINER_SWIMMER_MALE_TOBY, TRAINER_SWIMMER_MALE_TOBY}, MAP(FIVE_ISLAND_RESORT_GORGEOUS) }, { {TRAINER_PKMN_BREEDER_ALIZE, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_BREEDER_ALIZE_2}, MAP(FIVE_ISLAND_WATER_LABYRINTH) }, { {TRAINER_BIRD_KEEPER_MILO, SKIP, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_MILO_2}, MAP(FIVE_ISLAND_MEMORIAL_PILLAR) }, { {TRAINER_BIRD_KEEPER_CHAZ, SKIP, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_CHAZ_2}, MAP(FIVE_ISLAND_MEMORIAL_PILLAR) }, { {TRAINER_BIRD_KEEPER_HAROLD, SKIP, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_HAROLD_2}, MAP(FIVE_ISLAND_MEMORIAL_PILLAR) }, { {TRAINER_FISHERMAN_TYLOR, TRAINER_FISHERMAN_TYLOR}, MAP(SIX_ISLAND_OUTCAST_ISLAND) }, { {TRAINER_SWIMMER_MALE_MYMO, TRAINER_SWIMMER_MALE_MYMO}, MAP(SIX_ISLAND_OUTCAST_ISLAND) }, { {TRAINER_SWIMMER_FEMALE_NICOLE, SKIP, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_NICOLE_2}, MAP(SIX_ISLAND_OUTCAST_ISLAND) }, { {TRAINER_SIS_AND_BRO_AVA_GEB, TRAINER_SIS_AND_BRO_AVA_GEB}, MAP(SIX_ISLAND_OUTCAST_ISLAND) }, { {TRAINER_PSYCHIC_JACLYN, SKIP, SKIP, SKIP, SKIP, TRAINER_PSYCHIC_JACLYN_2}, MAP(SIX_ISLAND_GREEN_PATH) }, { {TRAINER_AROMA_LADY_ROSE, TRAINER_AROMA_LADY_ROSE}, MAP(SIX_ISLAND_WATER_PATH) }, { {TRAINER_JUGGLER_EDWARD, TRAINER_JUGGLER_EDWARD}, MAP(SIX_ISLAND_WATER_PATH) }, { {TRAINER_SWIMMER_MALE_SAMIR, SKIP, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_SAMIR_2}, MAP(SIX_ISLAND_WATER_PATH) }, { {TRAINER_SWIMMER_FEMALE_DENISE, TRAINER_SWIMMER_FEMALE_DENISE}, MAP(SIX_ISLAND_WATER_PATH) }, { {TRAINER_TWINS_MIU_MIA, TRAINER_TWINS_MIU_MIA}, MAP(SIX_ISLAND_WATER_PATH) }, { {TRAINER_HIKER_EARL, SKIP, SKIP, SKIP, SKIP, TRAINER_HIKER_EARL_2}, MAP(SIX_ISLAND_WATER_PATH) }, { {TRAINER_RUIN_MANIAC_STANLY, TRAINER_RUIN_MANIAC_STANLY}, MAP(SIX_ISLAND_RUIN_VALLEY) }, { {TRAINER_RUIN_MANIAC_FOSTER, TRAINER_RUIN_MANIAC_FOSTER}, MAP(SIX_ISLAND_RUIN_VALLEY) }, { {TRAINER_RUIN_MANIAC_LARRY, SKIP, SKIP, SKIP, SKIP, TRAINER_RUIN_MANIAC_LARRY_2}, MAP(SIX_ISLAND_RUIN_VALLEY) }, { {TRAINER_HIKER_DARYL, TRAINER_HIKER_DARYL}, MAP(SIX_ISLAND_RUIN_VALLEY) }, { {TRAINER_POKEMANIAC_HECTOR, SKIP, SKIP, SKIP, SKIP, TRAINER_POKEMANIAC_HECTOR_2}, MAP(SIX_ISLAND_RUIN_VALLEY) }, { {TRAINER_PSYCHIC_DARIO, SKIP, SKIP, SKIP, SKIP, TRAINER_PSYCHIC_DARIO_2}, MAP(SEVEN_ISLAND_TRAINER_TOWER) }, { {TRAINER_PSYCHIC_RODETTE, SKIP, SKIP, SKIP, SKIP, TRAINER_PSYCHIC_RODETTE_2}, MAP(SEVEN_ISLAND_TRAINER_TOWER) }, { {TRAINER_AROMA_LADY_MIAH, TRAINER_AROMA_LADY_MIAH}, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, { {TRAINER_YOUNG_COUPLE_EVE_JON, TRAINER_YOUNG_COUPLE_EVE_JON}, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, { {TRAINER_JUGGLER_MASON, SKIP, SKIP, SKIP, SKIP, TRAINER_JUGGLER_MASON_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, { {TRAINER_PKMN_RANGER_NICOLAS, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_NICOLAS_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, { {TRAINER_PKMN_RANGER_MADELINE, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_MADELINE_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, { {TRAINER_CRUSH_GIRL_CYNDY, SKIP, SKIP, SKIP, SKIP, TRAINER_CRUSH_GIRL_CYNDY_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON) }, { {TRAINER_TAMER_EVAN, SKIP, SKIP, SKIP, SKIP, TRAINER_TAMER_EVAN_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON) }, { {TRAINER_PKMN_RANGER_JACKSON, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_JACKSON_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON) }, { {TRAINER_PKMN_RANGER_KATELYN, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_KATELYN_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON) }, { {TRAINER_COOLTRAINER_LEROY, SKIP, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_LEROY_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON) }, { {TRAINER_COOLTRAINER_MICHELLE, SKIP, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_MICHELLE_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON) }, { {TRAINER_COOL_COUPLE_LEX_NYA, SKIP, SKIP, SKIP, SKIP, TRAINER_COOL_COUPLE_LEX_NYA_2}, MAP(SEVEN_ISLAND_SEVAULT_CANYON) }, { {TRAINER_RUIN_MANIAC_BRANDON, TRAINER_RUIN_MANIAC_BRANDON}, MAP(SEVEN_ISLAND_TANOBY_RUINS) }, { {TRAINER_RUIN_MANIAC_BENJAMIN, TRAINER_RUIN_MANIAC_BENJAMIN}, MAP(SEVEN_ISLAND_TANOBY_RUINS) }, { {TRAINER_PAINTER_EDNA, TRAINER_PAINTER_EDNA}, MAP(SEVEN_ISLAND_TANOBY_RUINS) }, { {TRAINER_GENTLEMAN_CLIFFORD, TRAINER_GENTLEMAN_CLIFFORD}, MAP(SEVEN_ISLAND_TANOBY_RUINS) }, { {TRAINER_PKMN_RANGER_HELENA, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_HELENA_2}, MAP(TWO_ISLAND_CAPE_BRINK) }, { {TRAINER_COOLTRAINER_ATTICUS, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_ATTICUS_2}, MAP(TWO_ISLAND_CAPE_BRINK) }, { {TRAINER_FISHERMAN_DEFOREST, SKIP, SKIP, SKIP, TRAINER_FISHERMAN_DEFOREST_2}, MAP(TWO_ISLAND_CAPE_BRINK) }, { {TRAINER_BIRD_KEEPER_SPEDO, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_SPEDO_2}, MAP(TWO_ISLAND_CAPE_BRINK) }, { {TRAINER_COOLTRAINER_CASPARA, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_CASPARA_2}, MAP(TWO_ISLAND_CAPE_BRINK) }, { {TRAINER_SWIMMER_FEMALE_SEDEF, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_SEDEF_2}, MAP(TWO_ISLAND_CAPE_BRINK) }, }; static const u8 sMovementScript_Wait48[] = { MOVEMENT_ACTION_DELAY_16, MOVEMENT_ACTION_DELAY_16, MOVEMENT_ACTION_DELAY_16, MOVEMENT_ACTION_STEP_END }; static const u8 sMovementScript_TrainerUnfought[] = { MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK, MOVEMENT_ACTION_STEP_END }; static const u8 sMovementScript_TrainerNoRematch[] = { MOVEMENT_ACTION_EMOTE_X, MOVEMENT_ACTION_STEP_END }; static const u8 sMovementScript_TrainerRematch[] = { MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK, MOVEMENT_ACTION_STEP_END }; static const u8 sFaceDirectionMovementTypeByFacingDirection[] = { MOVEMENT_TYPE_FACE_DOWN, MOVEMENT_TYPE_FACE_DOWN, MOVEMENT_TYPE_FACE_UP, MOVEMENT_TYPE_FACE_LEFT, MOVEMENT_TYPE_FACE_RIGHT }; // text void VsSeekerFreezeObjectsAfterChargeComplete(void) { CreateTask(Task_ResetObjectsRematchWantedState, 80); } static void Task_ResetObjectsRematchWantedState(u8 taskId) { struct Task *task = &gTasks[taskId]; u32 i; if (task->data[0] == 0 && walkrun_is_standing_still() == TRUE) { HandleEnforcedLookDirectionOnPlayerStopMoving(); task->data[0] = 1; } if (task->data[1] == 0) { for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (ObjectEventIdIsSane(i) == TRUE) { if (gObjectEvents[i].singleMovementActive) return; FreezeObjectEvent(&gObjectEvents[i]); } } } task->data[1] = 1; if (task->data[0] != 0) { DestroyTask(taskId); StopPlayerAvatar(); ScriptContext_Enable(); } } void VsSeekerResetObjectMovementAfterChargeComplete(void) { struct ObjectEventTemplate * templates = gSaveBlock1Ptr->objectEventTemplates; u32 i; u8 movementType; u8 objEventId; struct ObjectEvent * objectEvent; for (i = 0; i < gMapHeader.events->objectEventCount; i++) { if ((templates[i].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL || templates[i].objUnion.normal.trainerType == TRAINER_TYPE_BURIED) && (templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_RAISE_HAND_AND_STOP || templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_RAISE_HAND_AND_JUMP || templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_RAISE_HAND_AND_SWIM)) { movementType = GetRandomFaceDirectionMovementType(); TryGetObjectEventIdByLocalIdAndMap(templates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId); objectEvent = &gObjectEvents[objEventId]; if (ObjectEventIdIsSane(objEventId) == TRUE) { SetTrainerMovementType(objectEvent, movementType); } templates[i].objUnion.normal.movementType = movementType; } } } bool8 UpdateVsSeekerStepCounter(void) { u8 x = 0; if (CheckBagHasItem(ITEM_VS_SEEKER, 1) == TRUE) { if ((gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) < 100) { gSaveBlock1Ptr->trainerRematchStepCounter++; if(GetAbilityBySpecies(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), GetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM)) == ABILITY_LIGHTNING_ROD) { if ((gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) < 100) gSaveBlock1Ptr->trainerRematchStepCounter++; } } } if (FlagGet(FLAG_SYS_VS_SEEKER_CHARGING) == TRUE) { if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) < 100) { x = (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) + 1); if(GetAbilityBySpecies(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), GetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM)) == ABILITY_LIGHTNING_ROD) { if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) < 100) x = (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) + 1); } gSaveBlock1Ptr->trainerRematchStepCounter = (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) | (x << 8); } if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) == 100) { FlagClear(FLAG_SYS_VS_SEEKER_CHARGING); VsSeekerResetChargingStepCounter(); ClearAllTrainerRematchStates(); return TRUE; } } return FALSE; } void MapResetTrainerRematches(u16 mapGroup, u16 mapNum) { FlagClear(FLAG_SYS_VS_SEEKER_CHARGING); VsSeekerResetChargingStepCounter(); ClearAllTrainerRematchStates(); ResetMovementOfRematchableTrainers(); } static void ResetMovementOfRematchableTrainers(void) { u32 i; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { struct ObjectEvent * objectEvent = &gObjectEvents[i]; if (objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_STOP || objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_JUMP || objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_SWIM) { u8 movementType = GetRandomFaceDirectionMovementType(); if (objectEvent->active && gSprites[objectEvent->spriteId].data[0] == i) { gSprites[objectEvent->spriteId].x2 = 0; gSprites[objectEvent->spriteId].y2 = 0; SetTrainerMovementType(objectEvent, movementType); } } } } static void VsSeekerResetInBagStepCounter(void) { gSaveBlock1Ptr->trainerRematchStepCounter &= 0xFF00; } static void VsSeekerSetStepCounterInBagFull(void) { gSaveBlock1Ptr->trainerRematchStepCounter &= 0xFF00; gSaveBlock1Ptr->trainerRematchStepCounter |= 100; } static void VsSeekerResetChargingStepCounter(void) { gSaveBlock1Ptr->trainerRematchStepCounter &= 0x00FF; } static void VsSeekerSetStepCounterFullyCharged(void) { gSaveBlock1Ptr->trainerRematchStepCounter &= 0x00FF; gSaveBlock1Ptr->trainerRematchStepCounter |= (100 << 8); } void Task_VsSeeker_0(u8 taskId) { u32 i; u8 respval; for (i = 0; i < 16; i++) gTasks[taskId].data[i] = 0; sVsSeeker = AllocZeroed(sizeof(struct VsSeekerStruct)); GatherNearbyTrainerInfo(); respval = CanUseVsSeeker(); if (respval == VSSEEKER_NOT_CHARGED) { Free(sVsSeeker); DisplayItemMessageOnField(taskId, FONT_NORMAL, VSSeeker_Text_BatteryNotChargedNeedXSteps, Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker); } else if (respval == VSSEEKER_NO_ONE_IN_RANGE) { Free(sVsSeeker); DisplayItemMessageOnField(taskId, FONT_NORMAL, VSSeeker_Text_NoTrainersWithinRange, Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker); } else if (respval == VSSEEKER_CAN_USE) { ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, 0, gSpecialVar_ItemId, 0xFFFF); FieldEffectStart(FLDEFF_USE_VS_SEEKER); gTasks[taskId].func = Task_VsSeeker_1; gTasks[taskId].data[0] = 15; } } static void Task_VsSeeker_1(u8 taskId) { if (--gTasks[taskId].data[0] == 0) { gTasks[taskId].func = Task_VsSeeker_2; gTasks[taskId].data[1] = 16; } } static void Task_VsSeeker_2(u8 taskId) { s16 * data = gTasks[taskId].data; if (data[2] != 2 && --data[1] == 0) { PlaySE(SE_CONTEST_MONS_TURN); data[1] = 11; data[2]++; } if (!FieldEffectActiveListContains(FLDEFF_USE_VS_SEEKER)) { data[1] = 0; data[2] = 0; VsSeekerResetInBagStepCounter(); sVsSeeker->responseCode = GetVsSeekerResponseInArea(sRematches); ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, sMovementScript_Wait48); gTasks[taskId].func = Task_VsSeeker_3; } } static void GatherNearbyTrainerInfo(void) { struct ObjectEventTemplate *templates = gSaveBlock1Ptr->objectEventTemplates; u8 objectEventId = 0; u8 vsSeekerObjectIdx = 0; s32 objectEventIdx; for (objectEventIdx = 0; objectEventIdx < gMapHeader.events->objectEventCount; objectEventIdx++) { if (templates[objectEventIdx].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL || templates[objectEventIdx].objUnion.normal.trainerType == TRAINER_TYPE_BURIED) { sVsSeeker->trainerInfo[vsSeekerObjectIdx].script = templates[objectEventIdx].script; sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerIdx = GetTrainerFlagFromScript(templates[objectEventIdx].script); sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = templates[objectEventIdx].localId; TryGetObjectEventIdByLocalIdAndMap(templates[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); sVsSeeker->trainerInfo[vsSeekerObjectIdx].objectEventId = objectEventId; sVsSeeker->trainerInfo[vsSeekerObjectIdx].xCoord = gObjectEvents[objectEventId].currentCoords.x - 7; sVsSeeker->trainerInfo[vsSeekerObjectIdx].yCoord = gObjectEvents[objectEventId].currentCoords.y - 7; sVsSeeker->trainerInfo[vsSeekerObjectIdx].graphicsId = templates[objectEventIdx].graphicsId; vsSeekerObjectIdx++; } } sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = 0xFF; } static void Task_VsSeeker_3(u8 taskId) { if (ScriptMovement_IsObjectMovementFinished(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup)) { if (sVsSeeker->responseCode == VSSEEKER_RESPONSE_NO_RESPONSE) { DisplayItemMessageOnField(taskId, FONT_NORMAL, VSSeeker_Text_TrainersNotReady, Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker); } else { if (sVsSeeker->responseCode == VSSEEKER_RESPONSE_FOUND_REMATCHES) StartAllRespondantIdleMovements(); ClearDialogWindowAndFrame(0, TRUE); ClearPlayerHeldMovementAndUnfreezeObjectEvents(); UnlockPlayerFieldControls(); DestroyTask(taskId); } Free(sVsSeeker); } } static u8 CanUseVsSeeker(void) { u8 vsSeekerChargeSteps = gSaveBlock1Ptr->trainerRematchStepCounter; if (vsSeekerChargeSteps == 100) { if (GetRematchableTrainerLocalId() == 0xFF) return VSSEEKER_NO_ONE_IN_RANGE; else return VSSEEKER_CAN_USE; } else { if(GetAbilityBySpecies(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), GetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM)) == ABILITY_LIGHTNING_ROD) { if(vsSeekerChargeSteps % 2 == 0) TV_PrintIntToStringVar(0, (100 - vsSeekerChargeSteps) / 2); else TV_PrintIntToStringVar(0, ((100 - vsSeekerChargeSteps) / 2) + 1); } else TV_PrintIntToStringVar(0, 100 - vsSeekerChargeSteps); return VSSEEKER_NOT_CHARGED; } } static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData) { u16 trainerIdx = 0; u16 rval = 0; u8 rematchTrainerIdx; u8 unusedIdx = 0; u8 response = 0; s32 vsSeekerIdx = 0; while (sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF) { if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx]) == TRUE) { trainerIdx = sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx; if (!HasTrainerBeenFought(trainerIdx)) { StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerUnfought); sVsSeeker->trainerHasNotYetBeenFought = 1; vsSeekerIdx++; continue; } rematchTrainerIdx = GetNextAvailableRematchTrainer(vsSeekerData, trainerIdx, &unusedIdx); if (rematchTrainerIdx == 0) { StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch); sVsSeeker->trainerDoesNotWantRematch = 1; } else { rval = Random() % 100; // Even if it's overwritten below, it progresses the RNG. response = GetCurVsSeekerResponse(vsSeekerIdx, trainerIdx); if (response == VSSEEKER_SINGLE_RESP_YES) rval = 100; // Definitely yes else if (response == VSSEEKER_SINGLE_RESP_NO) rval = 0; // Definitely no // Otherwise it's a 70% chance to want a rematch if (rval < 30) { StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch); sVsSeeker->trainerDoesNotWantRematch = 1; } else { gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = rematchTrainerIdx; ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]); StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch); sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = trainerIdx; sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetRunningBehaviorFromGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId); sVsSeeker->numRematchableTrainers++; sVsSeeker->trainerWantsRematch = 1; } } } vsSeekerIdx++; } if (sVsSeeker->trainerWantsRematch) { PlaySE(SE_PIN); FlagSet(FLAG_SYS_VS_SEEKER_CHARGING); VsSeekerResetChargingStepCounter(); return VSSEEKER_RESPONSE_FOUND_REMATCHES; } if (sVsSeeker->trainerHasNotYetBeenFought) return VSSEEKER_RESPONSE_UNFOUGHT_TRAINERS; return VSSEEKER_RESPONSE_NO_RESPONSE; } void ClearRematchStateByTrainerId(void) { u8 objEventId = 0; struct ObjectEventTemplate *objectEventTemplates = gSaveBlock1Ptr->objectEventTemplates; int vsSeekerDataIdx = LookupVsSeekerOpponentInArray(sRematches, gTrainerBattleOpponent_A); if (vsSeekerDataIdx != -1) { int i; for (i = 0; i < gMapHeader.events->objectEventCount; i++) { if ((objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL || objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_BURIED) && vsSeekerDataIdx == LookupVsSeekerOpponentInArray(sRematches, GetTrainerFlagFromScript(objectEventTemplates[i].script))) { struct ObjectEvent *objectEvent; TryGetObjectEventIdByLocalIdAndMap(objectEventTemplates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId); objectEvent = &gObjectEvents[objEventId]; GetRandomFaceDirectionMovementType(&objectEventTemplates[i]); // You are using this function incorrectly. Please consult the manual. OverrideMovementTypeForObjectEvent(objectEvent, sFaceDirectionMovementTypeByFacingDirection[objectEvent->facingDirection]); gSaveBlock1Ptr->trainerRematches[objectEventTemplates[i].localId] = 0; if (gSelectedObjectEvent == objEventId) objectEvent->movementType = sFaceDirectionMovementTypeByFacingDirection[objectEvent->facingDirection]; else objectEvent->movementType = MOVEMENT_TYPE_FACE_DOWN; } } } } static void TryGetRematchTrainerIdGivenGameState(const u16 * trainerIdxs, u8 * rematchIdx_p) { switch (*rematchIdx_p) { case 0: break; case 1: if (!FlagGet(FLAG_GOT_VS_SEEKER)) *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); break; case 2: if (!FlagGet(FLAG_WORLD_MAP_CELADON_CITY)) *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); break; case 3: if (!FlagGet(FLAG_WORLD_MAP_FUCHSIA_CITY)) *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); break; case 4: if (!FlagGet(FLAG_SYS_GAME_CLEAR)) *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); break; case 5: if (!FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); break; } } static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx) { while (--rematchIdx != 0) { const u16 *rematch_p = trainerIdxs + rematchIdx; if (*rematch_p != SKIP) return rematchIdx; } return 0; } bool8 ShouldTryRematchBattle(void) { if (ShouldTryRematchBattleInternal(sRematches, gTrainerBattleOpponent_A)) { return TRUE; } return HasRematchTrainerAlreadyBeenFought(sRematches, gTrainerBattleOpponent_A); } static bool8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent) { s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent); if (rematchIdx == -1) return FALSE; if (rematchIdx >= 0 && rematchIdx < NELEMS(sRematches)) { if (IsThisTrainerRematchable(gSpecialVar_LastTalked)) return TRUE; } return FALSE; } static bool8 HasRematchTrainerAlreadyBeenFought(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent) { s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent); if (rematchIdx == -1) return FALSE; if (!HasTrainerBeenFought(vsSeekerData[rematchIdx].trainerIdxs[0])) return FALSE; return TRUE; } void ClearRematchStateOfLastTalked(void) { gSaveBlock1Ptr->trainerRematches[gSpecialVar_LastTalked] = 0; SetBattledTrainerFlag(); } static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId) { int i, j; for (i = 0; i < NELEMS(sRematches); i++) { for (j = 0; j < MAX_REMATCH_PARTIES; j++) { u16 testTrainerId; if (array[i].trainerIdxs[j] == 0) break; testTrainerId = array[i].trainerIdxs[j]; if (testTrainerId == SKIP) continue; if (testTrainerId == trainerId) return i; } } return -1; } int GetRematchTrainerId(u16 trainerId) { u8 i; u8 j; j = GetNextAvailableRematchTrainer(sRematches, trainerId, &i); if (!j) return 0; TryGetRematchTrainerIdGivenGameState(sRematches[i].trainerIdxs, &j); return sRematches[i].trainerIdxs[j]; } u8 IsTrainerReadyForRematch(void) { return IsTrainerReadyForRematchInternal(sRematches, gTrainerBattleOpponent_A); } static bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerId) { int rematchTrainerIdx = LookupVsSeekerOpponentInArray(array, trainerId); if (rematchTrainerIdx == -1) return FALSE; if (rematchTrainerIdx >= NELEMS(sRematches)) return FALSE; if (!IsThisTrainerRematchable(gSpecialVar_LastTalked)) return FALSE; return TRUE; } static bool8 ObjectEventIdIsSane(u8 objectEventId) { struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; if (objectEvent->active && gMapHeader.events->objectEventCount >= objectEvent->localId && gSprites[objectEvent->spriteId].data[0] == objectEventId) return TRUE; return FALSE; } static u8 GetRandomFaceDirectionMovementType() { u16 r1 = Random() % 4; switch (r1) { case 0: return MOVEMENT_TYPE_FACE_UP; case 1: return MOVEMENT_TYPE_FACE_DOWN; case 2: return MOVEMENT_TYPE_FACE_LEFT; case 3: return MOVEMENT_TYPE_FACE_RIGHT; default: return MOVEMENT_TYPE_FACE_DOWN; } } static u8 GetRunningBehaviorFromGraphicsId(u8 graphicsId) { switch (graphicsId) { case OBJ_EVENT_GFX_LITTLE_GIRL: case OBJ_EVENT_GFX_YOUNGSTER: case OBJ_EVENT_GFX_BOY: case OBJ_EVENT_GFX_BUG_CATCHER: case OBJ_EVENT_GFX_LASS: case OBJ_EVENT_GFX_WOMAN_1: case OBJ_EVENT_GFX_BATTLE_GIRL: case OBJ_EVENT_GFX_MAN: case OBJ_EVENT_GFX_ROCKER: case OBJ_EVENT_GFX_WOMAN_2: case OBJ_EVENT_GFX_BEAUTY: case OBJ_EVENT_GFX_BALDING_MAN: case OBJ_EVENT_GFX_TUBER_F: case OBJ_EVENT_GFX_CAMPER: case OBJ_EVENT_GFX_PICNICKER: case OBJ_EVENT_GFX_COOLTRAINER_M: case OBJ_EVENT_GFX_COOLTRAINER_F: case OBJ_EVENT_GFX_SWIMMER_M_LAND: case OBJ_EVENT_GFX_SWIMMER_F_LAND: case OBJ_EVENT_GFX_BLACKBELT: case OBJ_EVENT_GFX_HIKER: case OBJ_EVENT_GFX_SAILOR: case OBJ_EVENT_GFX_PAINTER: case OBJ_EVENT_GFX_BIRD_KEEPER: case OBJ_EVENT_GFX_POKEMON_RANGER_M: case OBJ_EVENT_GFX_POKEMON_RANGER_F: case OBJ_EVENT_GFX_MASTER_BEAUTY: case OBJ_EVENT_GFX_RUIN_MANIAC: case OBJ_EVENT_GFX_PSYCHIC_M: case OBJ_EVENT_GFX_PSYCHIC_F: case OBJ_EVENT_GFX_AROMA_LADY: case OBJ_EVENT_GFX_TWIN: case OBJ_EVENT_GFX_YOUNG_COUPLE_M: case OBJ_EVENT_GFX_YOUNG_COUPLE_F: case OBJ_EVENT_GFX_ENGINEER: case OBJ_EVENT_GFX_JUGGLER: case OBJ_EVENT_GFX_TAMER: case OBJ_EVENT_GFX_POKEMON_BREEDER: case OBJ_EVENT_GFX_LADY: case OBJ_EVENT_GFX_ROCKER_2: return MOVEMENT_TYPE_RAISE_HAND_AND_JUMP; case OBJ_EVENT_GFX_TUBER_M_WATER: case OBJ_EVENT_GFX_SWIMMER_M_WATER: case OBJ_EVENT_GFX_SWIMMER_F_WATER: case OBJ_EVENT_GFX_SWIMMER_F_WATER_2: return MOVEMENT_TYPE_RAISE_HAND_AND_SWIM; default: return MOVEMENT_TYPE_RAISE_HAND_AND_STOP; } } static u16 GetTrainerFlagFromScript(const u8 *script) /* * The trainer flag is a little-endian short located +2 from * the script pointer, assuming the trainerbattle command is * first in the script. Because scripts are unaligned, and * because the ARM processor requires shorts to be 16-bit * aligned, this function needs to perform explicit bitwise * operations to get the correct flag. * * 5c XX YY ZZ ... * -- -- */ { u16 trainerFlag; script += 2; trainerFlag = script[0]; trainerFlag |= script[1] << 8; return trainerFlag; } static int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx) { int i; for (i = 0; i < NELEMS(sRematches); i++) { if (vsSeekerData[i].trainerIdxs[0] == trainerFlagIdx) return i; } return -1; } static bool32 IsThisTrainerRematchable(u32 localId) { if (!gSaveBlock1Ptr->trainerRematches[localId]) return FALSE; return TRUE; } static void ClearAllTrainerRematchStates(void) { u32 i; for (i = 0; i < NELEMS(gSaveBlock1Ptr->trainerRematches); i++) gSaveBlock1Ptr->trainerRematches[i] = 0; } static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo) { s16 x; s16 y; PlayerGetDestCoords(&x, &y); x -= 7; y -= 7; if ( x - 7 <= trainerInfo->xCoord && x + 7 >= trainerInfo->xCoord && y - 5 <= trainerInfo->yCoord && y + 5 >= trainerInfo->yCoord && ObjectEventIdIsSane(trainerInfo->objectEventId) == 1) return TRUE; return FALSE; } static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr) { int i, j; for (i = 0; i < NELEMS(sRematches); i++) { if (vsSeekerData[i].trainerIdxs[0] == trainerFlagNo) { *idxPtr = i; for (j = 1; j < MAX_REMATCH_PARTIES; j++) { if (vsSeekerData[i].trainerIdxs[j] == TRAINER_NONE) return j - 1; if (vsSeekerData[i].trainerIdxs[j] == SKIP) continue; if (HasTrainerBeenFought(vsSeekerData[i].trainerIdxs[j])) continue; return j; } return j - 1; } } *idxPtr = 0; return 0; } static u8 GetRematchableTrainerLocalId(void) { u8 idx; u32 i; for (i = 0; sVsSeeker->trainerInfo[i].localId != 0xFF; i++) { if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1) { if (HasTrainerBeenFought(sVsSeeker->trainerInfo[i].trainerIdx) != 1 || GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[i].trainerIdx, &idx)) return sVsSeeker->trainerInfo[i].localId; } } return 0xFF; } static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script) { UnfreezeObjectEvent(&gObjectEvents[trainerInfo->objectEventId]); ScriptMovement_StartObjectMovementScript(trainerInfo->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, script); } static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx) { s32 i; s32 j; for (i = 0; i < vsSeekerIdx; i++) { if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1 && sVsSeeker->trainerInfo[i].trainerIdx == trainerIdx) { for (j = 0; j < sVsSeeker->numRematchableTrainers; j++) { if (sVsSeeker->trainerIdxArray[j] == sVsSeeker->trainerInfo[i].trainerIdx) return VSSEEKER_SINGLE_RESP_YES; } return VSSEEKER_SINGLE_RESP_NO; } } return VSSEEKER_SINGLE_RESP_RAND; } static void StartAllRespondantIdleMovements(void) { u8 dummy = 0; s32 i; s32 j; for (i = 0; i < sVsSeeker->numRematchableTrainers; i++) { for (j = 0; sVsSeeker->trainerInfo[j].localId != 0xFF; j++) { if (sVsSeeker->trainerInfo[j].trainerIdx == sVsSeeker->trainerIdxArray[i]) { struct ObjectEvent *objectEvent = &gObjectEvents[sVsSeeker->trainerInfo[j].objectEventId]; if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId) == 1) SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); OverrideMovementTypeForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[j].localId] = GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[j].trainerIdx, &dummy); } } } } ================================================ FILE: src/wild_encounter.c ================================================ #include "global.h" #include "random.h" #include "wild_encounter.h" #include "event_data.h" #include "fieldmap.h" #include "random.h" #include "roamer.h" #include "field_player_avatar.h" #include "battle_setup.h" #include "overworld.h" #include "metatile_behavior.h" #include "event_scripts.h" #include "script.h" #include "link.h" #include "quest_log.h" #include "constants/maps.h" #include "constants/abilities.h" #include "constants/items.h" #include "constants/layouts.h" #include "constants/weather.h" #define MAX_ENCOUNTER_RATE 1600 #define HEADER_NONE 0xFFFF struct WildEncounterData { u32 rngState; u16 prevMetatileBehavior; u16 encounterRateBuff; u8 stepsSinceLastEncounter; u8 abilityEffect; u16 leadMonHeldItem; }; static EWRAM_DATA struct WildEncounterData sWildEncounterData = {}; static EWRAM_DATA bool8 sWildEncountersDisabled = FALSE; static bool8 UnlockedTanobyOrAreNotInTanoby(void); static u32 GenerateUnownPersonalityByLetter(u8 letter); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *rate); static u8 GetFluteEncounterRateModType(void); static void ApplyCleanseTagEncounterRateMod(u32 *rate); static bool8 IsLeadMonHoldingCleanseTag(void); static u16 WildEncounterRandom(void); static void AddToWildEncounterRateBuff(u8 encouterRate); static u8 PickWildMonNature(void); static bool8 IsAbilityAllowingEncounter(u8 level); static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex); static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u8 type, u8 numMon, u8 *monIndex); static u8 ViridianForestNuzlockeOverride(const struct WildPokemonInfo * info, u8 slot); #include "data/wild_encounters.h" static const u8 sUnownLetterSlots[][LAND_WILD_COUNT] = { // A A A A A A A A A A A ? { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27}, // C C C D D D H H H U U O { 2, 2, 2, 3, 3, 3, 7, 7, 7, 20, 20, 14}, // N N N N S S S S I I E E {13, 13, 13, 13, 18, 18, 18, 18, 8, 8, 4, 4}, // P P L L J J R R R Q Q Q {15, 15, 11, 11, 9, 9, 17, 17, 17, 16, 16, 16}, // Y Y T T G G G F F F K K {24, 24, 19, 19, 6, 6, 6, 5, 5, 5, 10, 10}, // V V V W W W X X M M B B {21, 21, 21, 22, 22, 22, 23, 23, 12, 12, 1, 1}, // Z Z Z Z Z Z Z Z Z Z Z ! {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26}, }; void DisableWildEncounters(bool8 state) { sWildEncountersDisabled = state; } static u8 ChooseWildMonIndex_Land(void) { u8 rand = Random() % ENCOUNTER_CHANCE_LAND_MONS_TOTAL; if (rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_0) return 0; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_1) return 1; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_2) return 2; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_3) return 3; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_4) return 4; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_5) return 5; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_6) return 6; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_7) return 7; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_8) return 8; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_9) return 9; else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_10) return 10; else return 11; } static u8 ChooseWildMonIndex_WaterRock(void) { u8 rand = Random() % ENCOUNTER_CHANCE_WATER_MONS_TOTAL; if (rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_0) return 0; else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_1) return 1; else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_2) return 2; else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_3) return 3; else return 4; } static u8 ChooseWildMonIndex_Fishing(u8 rod) { u8 wildMonIndex = 0; u8 rand = Random() % max(max(ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_TOTAL, ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_TOTAL), ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_TOTAL); switch (rod) { case OLD_ROD: if (rand < ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0) wildMonIndex = 0; else wildMonIndex = 1; break; case GOOD_ROD: if (rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2) wildMonIndex = 2; if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 && rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3) wildMonIndex = 3; if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 && rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4) wildMonIndex = 4; break; case SUPER_ROD: if (rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5) wildMonIndex = 5; if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6) wildMonIndex = 6; if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7) wildMonIndex = 7; if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8) wildMonIndex = 8; if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9) wildMonIndex = 9; break; } return wildMonIndex; } static u8 ChooseWildMonLevel(const struct WildPokemon * info) { u8 lo; u8 hi; u8 mod; u8 res; if (info->maxLevel >= info->minLevel) { lo = info->minLevel; hi = info->maxLevel; } else { lo = info->maxLevel; hi = info->minLevel; } mod = hi - lo + 1; res = Random() % mod; // check ability for max level mon if (!GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG)) { u8 ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE) { if (Random() % 2 == 0) return hi; if (res != 0) res--; } } return lo + res; } static u16 GetCurrentMapWildMonHeaderId(void) { u32 i; for (i = 0; ; i++) { const struct WildPokemonHeader * wildHeader = &gWildMonHeaders[i]; if (wildHeader->mapGroup == MAP_GROUP(UNDEFINED)) break; if (gWildMonHeaders[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && gWildMonHeaders[i].mapNum == gSaveBlock1Ptr->location.mapNum) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SIX_ISLAND_ALTERING_CAVE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_ALTERING_CAVE)) { u16 alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET); if (alteringCaveId >= NUM_ALTERING_CAVE_TABLES) alteringCaveId = 0; i += alteringCaveId; } if (!UnlockedTanobyOrAreNotInTanoby()) break; return i; } } return HEADER_NONE; } static bool8 UnlockedTanobyOrAreNotInTanoby(void) { if (FlagGet(FLAG_SYS_UNLOCKED_TANOBY_RUINS)) return TRUE; if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER)) return TRUE; if (!(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER) )) return TRUE; return FALSE; } static void GenerateWildMon(u16 species, u8 level, u8 slot) { bool32 checkCuteCharm; u32 personality; s8 chamber; ZeroEnemyPartyMons(); checkCuteCharm = TRUE; switch (gSpeciesInfo[species].genderRatio) { case MON_MALE: case MON_FEMALE: case MON_GENDERLESS: checkCuteCharm = FALSE; break; } if (species != SPECIES_UNOWN) { if (checkCuteCharm && !GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG) && GetMonAbility(&gPlayerParty[0]) == ABILITY_CUTE_CHARM && Random() % 3 != 0) { u16 leadingMonSpecies = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES); u32 leadingMonPersonality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY); u8 gender = GetGenderFromSpeciesAndPersonality(leadingMonSpecies, leadingMonPersonality); // misses mon is genderless check, although no genderless mon can have cute charm as ability if (gender == MON_FEMALE) gender = MON_MALE; else gender = MON_FEMALE; CreateMonWithGenderNatureLetter(&gEnemyParty[0], species, level, USE_RANDOM_IVS, gender, PickWildMonNature(), 0); return; } CreateMonWithNature(&gEnemyParty[0], species, level, USE_RANDOM_IVS, PickWildMonNature()); } else { chamber = gSaveBlock1Ptr->location.mapNum - MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER); personality = GenerateUnownPersonalityByLetter(sUnownLetterSlots[chamber][slot]); CreateMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, TRUE, personality, FALSE, 0); } } static u32 GenerateUnownPersonalityByLetter(u8 letter) { u32 personality; do { personality = (Random() << 16) | Random(); } while (GetUnownLetterByPersonalityLoByte(personality) != letter); return personality; } u8 GetUnownLetterByPersonalityLoByte(u32 personality) { return GET_UNOWN_LETTER(personality); } enum { WILD_AREA_LAND, WILD_AREA_WATER, WILD_AREA_ROCKS, WILD_AREA_FISHING, }; #define WILD_CHECK_REPEL 0x1 #define WILD_CHECK_KEEN_EYE 0x2 static bool8 TryGenerateWildMon(const struct WildPokemonInfo * info, u8 area, u8 flags) { u8 slot = 0; u8 level; switch (area) { case WILD_AREA_LAND: if (TryGetAbilityInfluencedWildMonIndex(info->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &slot)) break; if (TryGetAbilityInfluencedWildMonIndex(info->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &slot)) break; slot = ChooseWildMonIndex_Land(); break; case WILD_AREA_WATER: if (TryGetAbilityInfluencedWildMonIndex(info->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &slot)) break; slot = ChooseWildMonIndex_WaterRock(); break; case WILD_AREA_ROCKS: slot = ChooseWildMonIndex_WaterRock(); break; } if(gMapHeader.mapLayoutId == LAYOUT_VIRIDIAN_FOREST && gSaveBlock1Ptr->keyFlags.nuzlocke == 1) slot = ViridianForestNuzlockeOverride(info, slot); level = ChooseWildMonLevel(&info->wildPokemon[slot]); if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level)) { return FALSE; } if (flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level)) return FALSE; GenerateWildMon(info->wildPokemon[slot].species, level, slot); return TRUE; } static u16 GenerateFishingEncounter(const struct WildPokemonInfo * info, u8 rod) { u8 slot = ChooseWildMonIndex_Fishing(rod); u8 level = ChooseWildMonLevel(&info->wildPokemon[slot]); GenerateWildMon(info->wildPokemon[slot].species, level, slot); return info->wildPokemon[slot].species; } static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) { if (WildEncounterRandom() % MAX_ENCOUNTER_RATE < encounterRate) return TRUE; return FALSE; } static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) { encounterRate *= 16; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) encounterRate = encounterRate * 80 / 100; encounterRate += sWildEncounterData.encounterRateBuff * 16 / 200; ApplyFluteEncounterRateMod(&encounterRate); ApplyCleanseTagEncounterRateMod(&encounterRate); if (!ignoreAbility) { switch (sWildEncounterData.abilityEffect) { case 1: encounterRate /= 2; break; case 2: encounterRate *= 2; break; } } if (encounterRate > MAX_ENCOUNTER_RATE) encounterRate = MAX_ENCOUNTER_RATE; return DoWildEncounterRateDiceRoll(encounterRate); } static u8 GetAbilityEncounterRateModType(void) { sWildEncounterData.abilityEffect = 0; if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { u8 ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_STENCH) sWildEncounterData.abilityEffect = 1; else if (ability == ABILITY_ILLUMINATE) sWildEncounterData.abilityEffect = 2; else if (ability == ABILITY_WHITE_SMOKE) sWildEncounterData.abilityEffect = 1; else if (ability == ABILITY_ARENA_TRAP) sWildEncounterData.abilityEffect = 2; else if (ability == ABILITY_SAND_VEIL && gSaveBlock1Ptr->weather == WEATHER_SANDSTORM) sWildEncounterData.abilityEffect = 1; } return sWildEncounterData.abilityEffect; } static bool8 DoGlobalWildEncounterDiceRoll(void) { if ((Random() % 100) >= 60) return FALSE; return TRUE; } bool8 StandardWildEncounter(u32 currMetatileAttrs, u16 previousMetatileBehavior) { u16 headerId; struct Roamer * roamer; const struct WildPokemonInfo * currentLandTable; const struct WildPokemonInfo * currentWaterTable; headerId = GetCurrentMapWildMonHeaderId(); if(gSaveBlock1Ptr->keyFlags.version == 0) { currentLandTable = gWildMonHeaders[headerId].landMonsInfo_FR; currentWaterTable = gWildMonHeaders[headerId].waterMonsInfo_FR; } else { currentLandTable = gWildMonHeaders[headerId].landMonsInfo_LG; currentWaterTable = gWildMonHeaders[headerId].waterMonsInfo_LG; } if (sWildEncountersDisabled == TRUE) return FALSE; if (headerId != HEADER_NONE) { if (ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_LAND) { if (currentLandTable == NULL) return FALSE; else if (previousMetatileBehavior != ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR) && !DoGlobalWildEncounterDiceRoll()) return FALSE; if (DoWildEncounterRateTest(currentLandTable->encounterRate, FALSE) != TRUE) { AddToWildEncounterRateBuff(currentLandTable->encounterRate); return FALSE; } else if (TryStartRoamerEncounter() == TRUE) { roamer = &gSaveBlock1Ptr->roamer; if (!IsWildLevelAllowedByRepel(roamer->level)) { return FALSE; } StartRoamerBattle(); return TRUE; } else { // try a regular wild land encounter if (TryGenerateWildMon(currentLandTable, WILD_AREA_LAND, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE) { StartWildBattle(); return TRUE; } else { AddToWildEncounterRateBuff(currentLandTable->encounterRate); } } } else if (ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_WATER || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR)) == TRUE)) { if (currentWaterTable == NULL) return FALSE; else if (previousMetatileBehavior != ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR) && !DoGlobalWildEncounterDiceRoll()) return FALSE; else if (DoWildEncounterRateTest(currentWaterTable->encounterRate, FALSE) != TRUE) { AddToWildEncounterRateBuff(currentWaterTable->encounterRate); return FALSE; } if (TryStartRoamerEncounter() == TRUE) { roamer = &gSaveBlock1Ptr->roamer; if (!IsWildLevelAllowedByRepel(roamer->level)) { return FALSE; } StartRoamerBattle(); return TRUE; } else // try a regular surfing encounter { if (TryGenerateWildMon(currentWaterTable, WILD_AREA_WATER, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE) { StartWildBattle(); return TRUE; } else { AddToWildEncounterRateBuff(currentWaterTable->encounterRate); } } } } return FALSE; } void RockSmashWildEncounter(void) { u16 headerIdx = GetCurrentMapWildMonHeaderId(); const struct WildPokemonInfo * currentRockTable; if(gSaveBlock1Ptr->keyFlags.version == 0) { currentRockTable = gWildMonHeaders[headerIdx].rockSmashMonsInfo_FR; } else { currentRockTable = gWildMonHeaders[headerIdx].rockSmashMonsInfo_LG; } if (headerIdx == HEADER_NONE) gSpecialVar_Result = FALSE; else if (currentRockTable == NULL) gSpecialVar_Result = FALSE; else if (DoWildEncounterRateTest(currentRockTable->encounterRate, TRUE) != TRUE) gSpecialVar_Result = FALSE; else if (TryGenerateWildMon(currentRockTable, WILD_AREA_ROCKS, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE) { StartWildBattle(); gSpecialVar_Result = TRUE; } else gSpecialVar_Result = FALSE; } bool8 SweetScentWildEncounter(void) { s16 x, y; u16 headerId; const struct WildPokemonInfo * currentLandTable; const struct WildPokemonInfo * currentWaterTable; headerId = GetCurrentMapWildMonHeaderId(); if(gSaveBlock1Ptr->keyFlags.version == 0) { currentLandTable = gWildMonHeaders[headerId].landMonsInfo_FR; currentWaterTable = gWildMonHeaders[headerId].waterMonsInfo_FR; } else { currentLandTable = gWildMonHeaders[headerId].landMonsInfo_LG; currentWaterTable = gWildMonHeaders[headerId].waterMonsInfo_LG; } PlayerGetDestCoords(&x, &y); if (headerId != HEADER_NONE) { if (MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_LAND) { if (TryStartRoamerEncounter() == TRUE) { StartRoamerBattle(); return TRUE; } if (currentLandTable == NULL) return FALSE; TryGenerateWildMon(currentLandTable, WILD_AREA_LAND, 0); StartWildBattle(); return TRUE; } else if (MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_WATER) { if (TryStartRoamerEncounter() == TRUE) { StartRoamerBattle(); return TRUE; } if (currentWaterTable == NULL) return FALSE; TryGenerateWildMon(currentWaterTable, WILD_AREA_WATER, 0); StartWildBattle(); return TRUE; } } return FALSE; } bool8 DoesCurrentMapHaveFishingMons(void) { u16 headerIdx = GetCurrentMapWildMonHeaderId(); const struct WildPokemonInfo * currentFishTable; if(gSaveBlock1Ptr->keyFlags.version == 0) { currentFishTable = gWildMonHeaders[headerIdx].fishingMonsInfo_FR; } else { currentFishTable = gWildMonHeaders[headerIdx].fishingMonsInfo_LG; } if (headerIdx == HEADER_NONE) return FALSE; if (currentFishTable == NULL) return FALSE; return TRUE; } void FishingWildEncounter(u8 rod) { const struct WildPokemonInfo * currentFishTable; if(gSaveBlock1Ptr->keyFlags.version == 0) { currentFishTable = gWildMonHeaders[GetCurrentMapWildMonHeaderId()].fishingMonsInfo_FR; } else { currentFishTable = gWildMonHeaders[GetCurrentMapWildMonHeaderId()].fishingMonsInfo_LG; } GenerateFishingEncounter(currentFishTable, rod); IncrementGameStat(GAME_STAT_FISHING_CAPTURES); StartWildBattle(); } u16 GetLocalWildMon(bool8 *isWaterMon) { u16 headerId; const struct WildPokemonInfo * landMonsInfo; const struct WildPokemonInfo * waterMonsInfo; headerId = GetCurrentMapWildMonHeaderId(); if(gSaveBlock1Ptr->keyFlags.version == 0) { landMonsInfo = gWildMonHeaders[headerId].landMonsInfo_FR; waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo_FR; } else { landMonsInfo = gWildMonHeaders[headerId].landMonsInfo_LG; waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo_LG; } *isWaterMon = FALSE; if (headerId == HEADER_NONE) return SPECIES_NONE; // Neither if (landMonsInfo == NULL && waterMonsInfo == NULL) return SPECIES_NONE; // Land Pokemon else if (landMonsInfo != NULL && waterMonsInfo == NULL) return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; // Water Pokemon else if (landMonsInfo == NULL && waterMonsInfo != NULL) { *isWaterMon = TRUE; return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; } // Either land or water Pokemon if ((Random() % 100) < 80) { return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; } else { *isWaterMon = TRUE; return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; } } u16 GetLocalWaterMon(void) { u16 headerId = GetCurrentMapWildMonHeaderId(); if (headerId != HEADER_NONE) { const struct WildPokemonInfo * waterMonsInfo; if(gSaveBlock1Ptr->keyFlags.version == 0) { waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo_FR; } else { waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo_LG; } if (waterMonsInfo) return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; } return SPECIES_NONE; } bool8 UpdateRepelCounter(void) { u16 steps; if (InUnionRoom() == TRUE) return FALSE; if (gQuestLogState == QL_STATE_PLAYBACK) return FALSE; steps = VarGet(VAR_REPEL_STEP_COUNT); if (steps != 0) { steps--; VarSet(VAR_REPEL_STEP_COUNT, steps); if (steps == 0) { ScriptContext_SetupScript(EventScript_RepelWoreOff); return TRUE; } } return FALSE; } static bool8 IsWildLevelAllowedByRepel(u8 wildLevel) { u32 i; if (!VarGet(VAR_REPEL_STEP_COUNT)) return TRUE; if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == FALSE) //if Nuzlocke & first encounter not done Repel doesn't work. return TRUE; for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_HP) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) { u8 ourLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); if (wildLevel < ourLevel) return FALSE; else return TRUE; } } return FALSE; } static void ApplyFluteEncounterRateMod(u32 *encounterRate) { switch (GetFluteEncounterRateModType()) { case 1: *encounterRate += *encounterRate / 2; break; case 2: *encounterRate = *encounterRate / 2; break; } } static u8 GetFluteEncounterRateModType(void) { if (FlagGet(FLAG_SYS_WHITE_FLUTE_ACTIVE) == TRUE) return 1; else if (FlagGet(FLAG_SYS_BLACK_FLUTE_ACTIVE) == TRUE) return 2; else return 0; } static void ApplyCleanseTagEncounterRateMod(u32 *encounterRate) { if (IsLeadMonHoldingCleanseTag()) *encounterRate = *encounterRate * 2 / 3; } static bool8 IsLeadMonHoldingCleanseTag(void) { if (sWildEncounterData.leadMonHeldItem == ITEM_CLEANSE_TAG) return TRUE; else return FALSE; } void SeedWildEncounterRng(u16 seed) { sWildEncounterData.rngState = seed; ResetEncounterRateModifiers(); } static u16 WildEncounterRandom(void) { sWildEncounterData.rngState = ISO_RANDOMIZE2(sWildEncounterData.rngState); return sWildEncounterData.rngState >> 16; } static u8 GetMapBaseEncounterCooldown(u8 encounterType) { u16 headerIdx = GetCurrentMapWildMonHeaderId(); const struct WildPokemonInfo * currentLandTable; const struct WildPokemonInfo * currentWaterTable; if(gSaveBlock1Ptr->keyFlags.version == 0) { currentLandTable = gWildMonHeaders[headerIdx].landMonsInfo_FR; currentWaterTable = gWildMonHeaders[headerIdx].waterMonsInfo_FR; } else { currentLandTable = gWildMonHeaders[headerIdx].landMonsInfo_LG; currentWaterTable = gWildMonHeaders[headerIdx].waterMonsInfo_LG; } if (headerIdx == HEADER_NONE) return 0xFF; if (encounterType == TILE_ENCOUNTER_LAND) { if (currentLandTable == NULL) return 0xFF; if (currentLandTable->encounterRate >= 80) return 0; if (currentLandTable->encounterRate < 10) return 8; return 8 - (currentLandTable->encounterRate / 10); } if (encounterType == TILE_ENCOUNTER_WATER) { if (currentWaterTable == NULL) return 0xFF; if (currentWaterTable->encounterRate >= 80) return 0; if (currentWaterTable->encounterRate < 10) return 8; return 8 - (currentWaterTable->encounterRate / 10); } return 0xFF; } void ResetEncounterRateModifiers(void) { sWildEncounterData.encounterRateBuff = 0; sWildEncounterData.stepsSinceLastEncounter = 0; } static bool8 HandleWildEncounterCooldown(u32 currMetatileAttrs) { u8 encounterType = ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_ENCOUNTER_TYPE); u32 minSteps; u32 encRate; if (encounterType == TILE_ENCOUNTER_NONE) return FALSE; minSteps = GetMapBaseEncounterCooldown(encounterType); if (minSteps == 0xFF) return FALSE; minSteps *= 256; encRate = 5 * 256; switch (GetFluteEncounterRateModType()) { case 1: minSteps -= minSteps / 2; encRate += encRate / 2; break; case 2: minSteps *= 2; encRate /= 2; break; } sWildEncounterData.leadMonHeldItem = GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM); if (IsLeadMonHoldingCleanseTag() == TRUE) { minSteps += minSteps / 3; encRate -= encRate / 3; } switch (GetAbilityEncounterRateModType()) { case 1: minSteps *= 2; encRate /= 2; break; case 2: minSteps /= 2; encRate *= 2; break; } minSteps /= 256; encRate /= 256; if (sWildEncounterData.stepsSinceLastEncounter >= minSteps) return TRUE; sWildEncounterData.stepsSinceLastEncounter++; if ((Random() % 100) < encRate) return TRUE; return FALSE; } bool8 TryStandardWildEncounter(u32 currMetatileAttrs) { if (!HandleWildEncounterCooldown(currMetatileAttrs)) { sWildEncounterData.prevMetatileBehavior = ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR); return FALSE; } else if (StandardWildEncounter(currMetatileAttrs, sWildEncounterData.prevMetatileBehavior) == TRUE) { sWildEncounterData.encounterRateBuff = 0; sWildEncounterData.stepsSinceLastEncounter = 0; sWildEncounterData.prevMetatileBehavior = ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR); return TRUE; } else { sWildEncounterData.prevMetatileBehavior = ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR); return FALSE; } } static void AddToWildEncounterRateBuff(u8 encounterRate) { if (VarGet(VAR_REPEL_STEP_COUNT) == 0) sWildEncounterData.encounterRateBuff += encounterRate; else sWildEncounterData.encounterRateBuff = 0; } static u8 PickWildMonNature(void) { // check synchronize for a pokemon with the same ability if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG) && GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE && Random() % 2 == 0) { return GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY) % 25; } // random nature return Random() % 25; } static bool8 IsAbilityAllowingEncounter(u8 level) { u8 ability; if (GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG)) return TRUE; ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_KEEN_EYE || ability == ABILITY_INTIMIDATE) { u8 playerMonLevel = GetMonData(&gPlayerParty[0], MON_DATA_LEVEL); if (playerMonLevel > 5 && level <= playerMonLevel - 5 && !(Random() % 2)) return FALSE; } return TRUE; } static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex) { if (GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG)) return FALSE; else if (GetMonAbility(&gPlayerParty[0]) != ability) return FALSE; else if (Random() % 2 != 0) return FALSE; return TryGetRandomWildMonIndexByType(wildMon, type, LAND_WILD_COUNT, monIndex); } static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u8 type, u8 numMon, u8 *monIndex) { u8 validIndexes[numMon]; // variable length array, an interesting feature u8 i, validMonCount; for (i = 0; i < numMon; i++) validIndexes[i] = 0; for (validMonCount = 0, i = 0; i < numMon; i++) { if (gSpeciesInfo[wildMon[i].species].types[0] == type || gSpeciesInfo[wildMon[i].species].types[1] == type) validIndexes[validMonCount++] = i; } if (validMonCount == 0 || validMonCount == numMon) return FALSE; *monIndex = validIndexes[Random() % validMonCount]; return TRUE; } // Grinding for Brock can be miserable in Nuzlocke Mode, especially with Challenge Mode on. // This gives a 47% chance of a Caterpie/Weedle encounter to be bumped up to a Metapod/Kakuna one. // If that happens, there's a 50% chance the level will be bumped up to the max possible as well. // This will increase experience gains in Viridian Forest to make the grind less tedious. // Once the player gets the fossil from Mt. Moon, this function stops modifying the encounters, // it also does not interfere with the first encounter for this area. // When this is active, there is a ~42.4% chance to encounter a Caterpie/Weedle and // ~52.6% chance to encounter Metapod/Kakuna. Pikachu takes up the last 5%. static u8 ViridianForestNuzlockeOverride(const struct WildPokemonInfo * info, u8 slot) { u8 rand; if(FlagGet(FLAG_GOT_FOSSIL_FROM_MT_MOON)) return slot; if (NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == FALSE) { // not a dupe && first encounter; don't modify slot to preserve first encounter odds if(!IsWildMonNuzlockeDupe(info->wildPokemon[slot].species)) return slot; } switch(slot) { case 0: // Caterpie case 2: // ^ case 4: // ^ rand = Random() % 100; if(rand < 47) //switch to a Metapod { if(rand < 24) //highest level Metapod { if(gSaveBlock1Ptr->keyFlags.version == 0) //FR slot = 6; else slot = 10; } else //not highest level { if(gSaveBlock1Ptr->keyFlags.version == 0) //FR slot = 6; else { switch(slot) { case 1: slot = 7; break; case 3: slot = 10; break; case 5: slot = 8; break; } } } } break; case 1: // Weedle case 3: // ^ case 5: // ^ rand = Random() % 100; if(rand < 47) //switch to a Kakuna { if(rand < 24) //highest level Kakuna { if(gSaveBlock1Ptr->keyFlags.version == 1) //LG slot = 6; else slot = 10; } else //not highest level { if(gSaveBlock1Ptr->keyFlags.version == 1) //LG slot = 6; else { switch(slot) { case 1: slot = 7; break; case 3: slot = 10; break; case 5: slot = 8; break; } } } } break; } return slot; } ================================================ FILE: src/wild_pokemon_area.c ================================================ #include "global.h" #include "field_specials.h" #include "event_data.h" #include "wild_encounter.h" #include "roamer.h" #include "overworld.h" #include "pokedex.h" #include "pokedex_area_markers.h" #include "constants/region_map_sections.h" #include "constants/maps.h" struct RoamerPair { u16 roamer; u16 starter; }; static s32 GetRoamerIndex(u16 species); static s32 GetRoamerPokedexAreaMarkers(u16 species, struct Subsprite * subsprites); static bool32 IsSpeciesOnMap(const struct WildPokemonHeader * data, s32 species); static bool32 IsSpeciesInEncounterTable(const struct WildPokemonInfo * pokemon, s32 species, s32 count); static u16 GetMapSecIdFromWildMonHeader(const struct WildPokemonHeader * header); static bool32 FindDexAreaByMapSec(u16 mapSecId, const u16 (*lut)[2], s32 count, s32 * lutIdx_p, u16 * tableIdx_p); static const u16 sDexAreas_Kanto[][2] = { { MAPSEC_PALLET_TOWN, DEX_AREA_PALLET_TOWN }, { MAPSEC_VIRIDIAN_CITY, DEX_AREA_VIRIDIAN_CITY }, { MAPSEC_PEWTER_CITY, DEX_AREA_PEWTER_CITY }, { MAPSEC_CERULEAN_CITY, DEX_AREA_CERULEAN_CITY }, { MAPSEC_LAVENDER_TOWN, DEX_AREA_LAVENDER_TOWN }, { MAPSEC_VERMILION_CITY, DEX_AREA_VERMILION_CITY }, { MAPSEC_CELADON_CITY, DEX_AREA_CELADON_CITY }, { MAPSEC_FUCHSIA_CITY, DEX_AREA_FUCHSIA_CITY }, { MAPSEC_CINNABAR_ISLAND, DEX_AREA_CINNABAR_ISLAND }, { MAPSEC_INDIGO_PLATEAU, DEX_AREA_INDIGO_PLATEAU }, { MAPSEC_SAFFRON_CITY, DEX_AREA_SAFFRON_CITY }, { MAPSEC_ROUTE_4_POKECENTER, DEX_AREA_ROUTE_4 }, { MAPSEC_ROUTE_10_POKECENTER, DEX_AREA_ROUTE_10 }, { MAPSEC_ROUTE_1, DEX_AREA_ROUTE_1 }, { MAPSEC_ROUTE_2, DEX_AREA_ROUTE_2 }, { MAPSEC_ROUTE_3, DEX_AREA_ROUTE_3 }, { MAPSEC_ROUTE_4, DEX_AREA_ROUTE_4 }, { MAPSEC_ROUTE_5, DEX_AREA_ROUTE_5 }, { MAPSEC_ROUTE_6, DEX_AREA_ROUTE_6 }, { MAPSEC_ROUTE_7, DEX_AREA_ROUTE_7 }, { MAPSEC_ROUTE_8, DEX_AREA_ROUTE_8 }, { MAPSEC_ROUTE_9, DEX_AREA_ROUTE_9 }, { MAPSEC_ROUTE_10, DEX_AREA_ROUTE_10 }, { MAPSEC_ROUTE_11, DEX_AREA_ROUTE_11 }, { MAPSEC_ROUTE_12, DEX_AREA_ROUTE_12 }, { MAPSEC_ROUTE_13, DEX_AREA_ROUTE_13 }, { MAPSEC_ROUTE_14, DEX_AREA_ROUTE_14 }, { MAPSEC_ROUTE_15, DEX_AREA_ROUTE_15 }, { MAPSEC_ROUTE_16, DEX_AREA_ROUTE_16 }, { MAPSEC_ROUTE_17, DEX_AREA_ROUTE_17 }, { MAPSEC_ROUTE_18, DEX_AREA_ROUTE_18 }, { MAPSEC_ROUTE_19, DEX_AREA_ROUTE_19 }, { MAPSEC_ROUTE_20, DEX_AREA_ROUTE_20 }, { MAPSEC_ROUTE_21, DEX_AREA_ROUTE_21 }, { MAPSEC_ROUTE_22, DEX_AREA_ROUTE_22 }, { MAPSEC_ROUTE_23, DEX_AREA_ROUTE_23 }, { MAPSEC_ROUTE_24, DEX_AREA_ROUTE_24 }, { MAPSEC_ROUTE_25, DEX_AREA_ROUTE_25 }, { MAPSEC_VIRIDIAN_FOREST, DEX_AREA_VIRIDIAN_FOREST }, { MAPSEC_MT_MOON, DEX_AREA_MT_MOON }, { MAPSEC_S_S_ANNE, DEX_AREA_VERMILION_CITY }, { MAPSEC_UNDERGROUND_PATH, DEX_AREA_SAFFRON_CITY }, { MAPSEC_UNDERGROUND_PATH_2, DEX_AREA_SAFFRON_CITY }, { MAPSEC_DIGLETTS_CAVE, DEX_AREA_DIGLETTS_CAVE }, { MAPSEC_KANTO_VICTORY_ROAD, DEX_AREA_VICTORY_ROAD }, { MAPSEC_ROCKET_HIDEOUT, DEX_AREA_CELADON_CITY }, { MAPSEC_SILPH_CO, DEX_AREA_SAFFRON_CITY }, { MAPSEC_POKEMON_MANSION, DEX_AREA_POKEMON_MANSION }, { MAPSEC_KANTO_SAFARI_ZONE, DEX_AREA_SAFARI_ZONE }, { MAPSEC_POKEMON_LEAGUE, DEX_AREA_VICTORY_ROAD }, { MAPSEC_ROCK_TUNNEL, DEX_AREA_ROCK_TUNNEL }, { MAPSEC_SEAFOAM_ISLANDS, DEX_AREA_SEAFOAM_ISLANDS }, { MAPSEC_POKEMON_TOWER, DEX_AREA_POKEMON_TOWER }, { MAPSEC_CERULEAN_CAVE, DEX_AREA_CERULEAN_CAVE }, { MAPSEC_POWER_PLANT, DEX_AREA_POWER_PLANT } }; static const u16 sDexAreas_Sevii1[][2] = { { MAPSEC_KINDLE_ROAD, DEX_AREA_KINDLE_ROAD }, { MAPSEC_TREASURE_BEACH, DEX_AREA_TREASURE_BEACH }, { MAPSEC_ONE_ISLAND, DEX_AREA_ONE_ISLAND }, { MAPSEC_MT_EMBER, DEX_AREA_MT_EMBER } }; static const u16 sDexAreas_Sevii2[][2] = { { MAPSEC_CAPE_BRINK, DEX_AREA_CAPE_BRINK }, { MAPSEC_TWO_ISLAND, DEX_AREA_TWO_ISLAND } }; static const u16 sDexAreas_Sevii3[][2] = { { MAPSEC_BOND_BRIDGE, DEX_AREA_BOND_BRIDGE }, { MAPSEC_UNDERWATER_124, DEX_AREA_BOND_BRIDGE }, { MAPSEC_THREE_ISLE_PORT, DEX_AREA_THREE_ISLE_PATH }, { MAPSEC_THREE_ISLAND, DEX_AREA_THREE_ISLAND }, { MAPSEC_BERRY_FOREST, DEX_AREA_BERRY_FOREST }, { MAPSEC_THREE_ISLE_PATH, DEX_AREA_THREE_ISLE_PATH } }; static const u16 sDexAreas_Sevii4[][2] = { { MAPSEC_FOUR_ISLAND, DEX_AREA_FOUR_ISLAND }, { MAPSEC_ICEFALL_CAVE, DEX_AREA_ICEFALL_CAVE } }; static const u16 sDexAreas_Sevii5[][2] = { { MAPSEC_RESORT_GORGEOUS, DEX_AREA_RESORT_GORGEOUS }, { MAPSEC_WATER_LABYRINTH, DEX_AREA_WATER_LABYRINTH }, { MAPSEC_FIVE_ISLE_MEADOW, DEX_AREA_FIVE_ISLE_MEADOW }, { MAPSEC_MEMORIAL_PILLAR, DEX_AREA_MEMORIAL_PILLAR }, { MAPSEC_FIVE_ISLAND, DEX_AREA_FIVE_ISLAND }, { MAPSEC_ROCKET_WAREHOUSE, DEX_AREA_FIVE_ISLE_MEADOW }, { MAPSEC_LOST_CAVE, DEX_AREA_LOST_CAVE } }; static const u16 sDexAreas_Sevii6[][2] = { { MAPSEC_OUTCAST_ISLAND, DEX_AREA_OUTCAST_ISLAND }, { MAPSEC_GREEN_PATH, DEX_AREA_GREEN_PATH }, { MAPSEC_WATER_PATH, DEX_AREA_WATER_PATH }, { MAPSEC_RUIN_VALLEY, DEX_AREA_RUIN_VALLEY }, { MAPSEC_DOTTED_HOLE, DEX_AREA_DOTTED_HOLE }, { MAPSEC_PATTERN_BUSH, DEX_AREA_PATTERN_BUSH }, { MAPSEC_ALTERING_CAVE, DEX_AREA_ALTERING_CAVE } }; static const u16 sDexAreas_Sevii7[][2] = { { MAPSEC_TRAINER_TOWER, DEX_AREA_TRAINER_TOWER }, { MAPSEC_CANYON_ENTRANCE, DEX_AREA_CANYON_ENTRANCE }, { MAPSEC_SEVAULT_CANYON, DEX_AREA_SEVAULT_CANYON }, { MAPSEC_TANOBY_RUINS, DEX_AREA_TANOBY_RUINS }, { MAPSEC_MONEAN_CHAMBER, DEX_AREA_TANOBY_CHAMBER }, { MAPSEC_LIPTOO_CHAMBER, DEX_AREA_TANOBY_CHAMBER }, { MAPSEC_WEEPTH_CHAMBER, DEX_AREA_TANOBY_CHAMBER }, { MAPSEC_DILFORD_CHAMBER, DEX_AREA_TANOBY_CHAMBER }, { MAPSEC_SCUFIB_CHAMBER, DEX_AREA_TANOBY_CHAMBER }, { MAPSEC_RIXY_CHAMBER, DEX_AREA_TANOBY_CHAMBER }, { MAPSEC_VIAPOIS_CHAMBER, DEX_AREA_TANOBY_CHAMBER } }; static const struct { const u16 (*table)[2]; s32 count; } sSeviiDexAreas[] = { { sDexAreas_Sevii1, ARRAY_COUNT(sDexAreas_Sevii1) }, { sDexAreas_Sevii2, ARRAY_COUNT(sDexAreas_Sevii2) }, { sDexAreas_Sevii3, ARRAY_COUNT(sDexAreas_Sevii3) }, { sDexAreas_Sevii4, ARRAY_COUNT(sDexAreas_Sevii4) }, { sDexAreas_Sevii5, ARRAY_COUNT(sDexAreas_Sevii5) }, { sDexAreas_Sevii6, ARRAY_COUNT(sDexAreas_Sevii6) }, { sDexAreas_Sevii7, ARRAY_COUNT(sDexAreas_Sevii7) } }; static const struct RoamerPair sRoamerPairs[] = { { SPECIES_ENTEI, SPECIES_BULBASAUR }, { SPECIES_SUICUNE, SPECIES_CHARMANDER }, { SPECIES_RAIKOU, SPECIES_SQUIRTLE } }; // Scans for the given species and populates 'subsprites' with the area markers. // Returns the number of areas where the species was found. s32 GetSpeciesPokedexAreaMarkers(u16 species, struct Subsprite * subsprites) { s32 areaCount; s32 j; s32 mapSecId; u16 dexArea; s32 tableIndex; s32 seviiAreas; s32 alteringCaveCount; s32 alteringCaveNum; s32 i; if (GetRoamerIndex(species) >= 0) return GetRoamerPokedexAreaMarkers(species, subsprites); seviiAreas = GetUnlockedSeviiAreas(); alteringCaveCount = 0; alteringCaveNum = VarGet(VAR_ALTERING_CAVE_WILD_SET); if (alteringCaveNum >= NUM_ALTERING_CAVE_TABLES) alteringCaveNum = 0; for (i = 0, areaCount = 0; gWildMonHeaders[i].mapGroup != MAP_GROUP(UNDEFINED); i++) { if((i == 133 || i == 134) && !FlagGet(FLAG_SYS_GAME_CLEAR)) //Safari Zone NW and NE { continue; //skip Safari Zone expansion if not Champion } mapSecId = GetMapSecIdFromWildMonHeader(&gWildMonHeaders[i]); if (mapSecId == MAPSEC_ALTERING_CAVE) { alteringCaveCount++; if (alteringCaveNum != alteringCaveCount - 1) continue; } if (IsSpeciesOnMap(&gWildMonHeaders[i], species)) { // Search for all dex areas associated with this MAPSEC. // In the vanilla game each MAPSEC only has at most one DEX_AREA. tableIndex = 0; while (FindDexAreaByMapSec(mapSecId, sDexAreas_Kanto, ARRAY_COUNT(sDexAreas_Kanto), &tableIndex, &dexArea)) { if (dexArea != DEX_AREA_NONE) GetAreaMarkerSubsprite(areaCount++, dexArea, subsprites); } for (j = 0; j < ARRAY_COUNT(sSeviiDexAreas); j++) { if ((seviiAreas >> j) & 1) { // Search for all dex areas associated with this MAPSEC in this unlocked Sevii Island tableIndex = 0; while (FindDexAreaByMapSec(mapSecId, sSeviiDexAreas[j].table, sSeviiDexAreas[j].count, &tableIndex, &dexArea)) { if (dexArea != DEX_AREA_NONE) GetAreaMarkerSubsprite(areaCount++, dexArea, subsprites); } } } } } return areaCount; } static s32 GetRoamerIndex(u16 species) { s32 i; for (i = 0; i < ARRAY_COUNT(sRoamerPairs); i++) { if (sRoamerPairs[i].roamer == species) return i; } return -1; } static s32 GetRoamerPokedexAreaMarkers(u16 species, struct Subsprite * subsprites) { u16 mapSecId; s32 roamerIdx; u16 dexArea; s32 tableIndex; // Make sure that this is a roamer species, and that it corresponds to the player's starter. roamerIdx = GetRoamerIndex(species); if (roamerIdx < 0) return 0; if (sRoamerPairs[roamerIdx].roamer != GetRoamerSpecies()) return 0; mapSecId = GetRoamerLocationMapSectionId(); tableIndex = 0; if (FindDexAreaByMapSec(mapSecId, sDexAreas_Kanto, ARRAY_COUNT(sDexAreas_Kanto), &tableIndex, &dexArea)) { if (dexArea != DEX_AREA_NONE) { GetAreaMarkerSubsprite(0, dexArea, subsprites); return 1; } } return 0; } static bool32 IsSpeciesOnMap(const struct WildPokemonHeader * data, s32 species) { if(gSaveBlock1Ptr->keyFlags.version == 0) { if (IsSpeciesInEncounterTable(data->landMonsInfo_FR, species, LAND_WILD_COUNT)) return TRUE; if (IsSpeciesInEncounterTable(data->waterMonsInfo_FR, species, WATER_WILD_COUNT)) return TRUE; if (IsSpeciesInEncounterTable(data->fishingMonsInfo_FR, species, FISH_WILD_COUNT)) return TRUE; if (IsSpeciesInEncounterTable(data->rockSmashMonsInfo_FR, species, ROCK_WILD_COUNT)) return TRUE; } else { if (IsSpeciesInEncounterTable(data->landMonsInfo_LG, species, LAND_WILD_COUNT)) return TRUE; if (IsSpeciesInEncounterTable(data->waterMonsInfo_LG, species, WATER_WILD_COUNT)) return TRUE; if (IsSpeciesInEncounterTable(data->fishingMonsInfo_LG, species, FISH_WILD_COUNT)) return TRUE; if (IsSpeciesInEncounterTable(data->rockSmashMonsInfo_LG, species, ROCK_WILD_COUNT)) return TRUE; } return FALSE; } static bool32 IsSpeciesInEncounterTable(const struct WildPokemonInfo * info, s32 species, s32 count) { s32 i; if (info != NULL) { for (i = 0; i < count; i++) { if (info->wildPokemon[i].species == species) return TRUE; } } return FALSE; } static u16 GetMapSecIdFromWildMonHeader(const struct WildPokemonHeader * header) { return Overworld_GetMapHeaderByGroupAndId(header->mapGroup, header->mapNum)->regionMapSectionId; } // Search a MAPSEC -> DEX_AREA table for the given mapsec. // Assigns the DEX_AREA (if found) to 'dexArea', and the first unread table index to 'index'. // Returns TRUE if DEX_AREA was found, FALSE otherwise. static bool32 FindDexAreaByMapSec(u16 mapSecId, const u16 (*table)[2], s32 count, s32 * index, u16 * dexArea) { s32 i; for (i = *index; i < count; i++) { if (table[i][0] == mapSecId) { *dexArea = table[i][1]; *index = i + 1; return TRUE; } } return FALSE; } ================================================ FILE: src/window.c ================================================ #include "global.h" #include "gflib.h" u8 gWindowClearTile; void *gWindowBgTilemapBuffers[4]; EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0}; static u8 GetNumActiveWindowsOnBg(u8 bgId); static const struct WindowTemplate sDummyWindowTemplate = {0xFF, 0, 0, 0, 0, 0, 0}; static void nullsub_8(void) { } bool16 InitWindows(const struct WindowTemplate *templates) { int i; void *bgTilemapBuffer; int j; u8 bgLayer; u16 bgSize; u8 *allocatedTilemapBuffer; int allocatedBaseBlock; for (i = 0; i < 4; ++i) { bgTilemapBuffer = GetBgTilemapBuffer(i); if (bgTilemapBuffer != NULL) gWindowBgTilemapBuffers[i] = nullsub_8; else gWindowBgTilemapBuffers[i] = bgTilemapBuffer; } for (i = 0; i < WINDOWS_MAX; ++i) { gWindows[i].window = sDummyWindowTemplate; gWindows[i].tileData = NULL; } for (i = 0, allocatedBaseBlock = 0, bgLayer = templates[i].bg; bgLayer != 0xFF && i < WINDOWS_MAX; ++i, bgLayer = templates[i].bg) { if (gWindowTileAutoAllocEnabled == TRUE) { allocatedBaseBlock = BgTileAllocOp(bgLayer, 0, templates[i].width * templates[i].height, BG_TILE_FIND_FREE_SPACE); if (allocatedBaseBlock == -1) return FALSE; } if (gWindowBgTilemapBuffers[bgLayer] == NULL) { bgSize = GetBgAttribute(bgLayer, BG_ATTR_MAPSIZE); if (bgSize != 0xFFFF) { allocatedTilemapBuffer = Alloc(bgSize); if (allocatedTilemapBuffer == NULL) { FreeAllWindowBuffers(); return FALSE; } for (j = 0; j < bgSize; ++j) allocatedTilemapBuffer[j] = 0; gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer; SetBgTilemapBuffer(bgLayer, allocatedTilemapBuffer); } } allocatedTilemapBuffer = Alloc((u16)(0x20 * (templates[i].width * templates[i].height))); if (allocatedTilemapBuffer == NULL) { if ((GetNumActiveWindowsOnBg(bgLayer) == 0) && (gWindowBgTilemapBuffers[bgLayer] != nullsub_8)) { Free(gWindowBgTilemapBuffers[bgLayer]); gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer; } return FALSE; } gWindows[i].tileData = allocatedTilemapBuffer; gWindows[i].window = templates[i]; if (gWindowTileAutoAllocEnabled == TRUE) { gWindows[i].window.baseBlock = allocatedBaseBlock; BgTileAllocOp(bgLayer, allocatedBaseBlock, templates[i].width * templates[i].height, BG_TILE_ALLOC); } } gWindowClearTile = 0; return TRUE; } u16 AddWindow(const struct WindowTemplate *template) { u16 win; u8 bgLayer; int allocatedBaseBlock; u16 bgSize; u8 *allocatedTilemapBuffer; int i; for (win = 0; win < WINDOWS_MAX; ++win) { if ((bgLayer = gWindows[win].window.bg) == 0xFF) break; } if (win == WINDOWS_MAX) return 0xFF; bgLayer = template->bg; allocatedBaseBlock = 0; if (gWindowTileAutoAllocEnabled == TRUE) { allocatedBaseBlock = BgTileAllocOp(bgLayer, 0, template->width * template->height, BG_TILE_FIND_FREE_SPACE); if (allocatedBaseBlock == -1) return 0xFF; } if (gWindowBgTilemapBuffers[bgLayer] == NULL) { bgSize = GetBgAttribute(bgLayer, BG_ATTR_MAPSIZE); if (bgSize != 0xFFFF) { allocatedTilemapBuffer = Alloc(bgSize); if (allocatedTilemapBuffer == NULL) return 0xFF; for (i = 0; i < bgSize; ++i) allocatedTilemapBuffer[i] = 0; gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer; SetBgTilemapBuffer(bgLayer, allocatedTilemapBuffer); } } allocatedTilemapBuffer = Alloc((u16)(0x20 * (template->width * template->height))); if (allocatedTilemapBuffer == NULL) { if ((GetNumActiveWindowsOnBg(bgLayer) == 0) && (gWindowBgTilemapBuffers[bgLayer] != nullsub_8)) { Free(gWindowBgTilemapBuffers[bgLayer]); gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer; } return 0xFF; } gWindows[win].tileData = allocatedTilemapBuffer; gWindows[win].window = *template; if (gWindowTileAutoAllocEnabled == TRUE) { gWindows[win].window.baseBlock = allocatedBaseBlock; BgTileAllocOp(bgLayer, allocatedBaseBlock, gWindows[win].window.width * gWindows[win].window.height, BG_TILE_ALLOC); } return win; } void RemoveWindow(u8 windowId) { u8 bgLayer = gWindows[windowId].window.bg; if (gWindowTileAutoAllocEnabled == TRUE) { BgTileAllocOp(bgLayer, gWindows[windowId].window.baseBlock, gWindows[windowId].window.width * gWindows[windowId].window.height, BG_TILE_FREE); } gWindows[windowId].window = sDummyWindowTemplate; if (GetNumActiveWindowsOnBg(bgLayer) == 0) { if (gWindowBgTilemapBuffers[bgLayer] != nullsub_8) { Free(gWindowBgTilemapBuffers[bgLayer]); gWindowBgTilemapBuffers[bgLayer] = 0; } } if (gWindows[windowId].tileData != NULL) { Free(gWindows[windowId].tileData); gWindows[windowId].tileData = NULL; } } void FreeAllWindowBuffers(void) { int i; for (i = 0; i < 4; ++i) { if (gWindowBgTilemapBuffers[i] != NULL && gWindowBgTilemapBuffers[i] != nullsub_8) { Free(gWindowBgTilemapBuffers[i]); gWindowBgTilemapBuffers[i] = NULL; } } for (i = 0; i < WINDOWS_MAX; ++i) { if (gWindows[i].tileData != NULL) { Free(gWindows[i].tileData); gWindows[i].tileData = NULL; } } } void CopyWindowToVram(u8 windowId, u8 mode) { struct Window windowLocal = gWindows[windowId]; u16 windowSize = 32 * (windowLocal.window.width * windowLocal.window.height); switch (mode) { case COPYWIN_MAP: CopyBgTilemapBufferToVram(windowLocal.window.bg); break; case COPYWIN_GFX: LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); break; case COPYWIN_FULL: LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); CopyBgTilemapBufferToVram(windowLocal.window.bg); break; } } void PutWindowTilemap(u8 windowId) { struct Window windowLocal = gWindows[windowId]; WriteSequenceToBgTilemapBuffer( windowLocal.window.bg, GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE) + windowLocal.window.baseBlock, windowLocal.window.tilemapLeft, windowLocal.window.tilemapTop, windowLocal.window.width, windowLocal.window.height, windowLocal.window.paletteNum, 1); } void PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 palette) { struct Window windowLocal = gWindows[windowId]; u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE); int i; for (i = 0; i < height; ++i) { WriteSequenceToBgTilemapBuffer( windowLocal.window.bg, currentRow, windowLocal.window.tilemapLeft + x, windowLocal.window.tilemapTop + y + i, width, 1, palette, 1); currentRow += windowLocal.window.width; } } void ClearWindowTilemap(u8 windowId) { struct Window windowLocal = gWindows[windowId]; FillBgTilemapBufferRect( windowLocal.window.bg, gWindowClearTile, windowLocal.window.tilemapLeft, windowLocal.window.tilemapTop, windowLocal.window.width, windowLocal.window.height, windowLocal.window.paletteNum); } void PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height) { struct Window windowLocal = gWindows[windowId]; u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE); int i; for (i = 0; i < height; ++i) { WriteSequenceToBgTilemapBuffer( windowLocal.window.bg, currentRow, windowLocal.window.tilemapLeft + x, windowLocal.window.tilemapTop + y + i, width, 1, windowLocal.window.paletteNum, 1); currentRow += windowLocal.window.width; } } void BlitBitmapToWindow(u8 windowId, const u8 *pixels, u16 x, u16 y, u16 width, u16 height) { BlitBitmapRectToWindow(windowId, pixels, 0, 0, width, height, x, y, width, height); } void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight) { struct Bitmap sourceRect; struct Bitmap destRect; sourceRect.pixels = (u8 *)pixels; sourceRect.width = srcWidth; sourceRect.height = srcHeight; destRect.pixels = gWindows[windowId].tileData; destRect.width = 8 * gWindows[windowId].window.width; destRect.height = 8 * gWindows[windowId].window.height; BlitBitmapRect4Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, 0); } void BlitBitmapRectToWindowWithColorKey(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 colorKey) { struct Bitmap sourceRect; struct Bitmap destRect; sourceRect.pixels = (u8 *)pixels; sourceRect.width = srcWidth; sourceRect.height = srcHeight; destRect.pixels = gWindows[windowId].tileData; destRect.width = 8 * gWindows[windowId].window.width; destRect.height = 8 * gWindows[windowId].window.height; BlitBitmapRect4Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, colorKey); } void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height) { struct Bitmap pixelRect; pixelRect.pixels = gWindows[windowId].tileData; pixelRect.width = 8 * gWindows[windowId].window.width; pixelRect.height = 8 * gWindows[windowId].window.height; FillBitmapRect4Bit(&pixelRect, x, y, width, height, fillValue); } void CopyToWindowPixelBuffer(u8 windowId, const void *src, u16 size, u16 tileOffset) { if (size != 0) CpuCopy16(src, gWindows[windowId].tileData + (0x20 * tileOffset), size); else LZ77UnCompWram(src, gWindows[windowId].tileData + (0x20 * tileOffset)); } void FillWindowPixelBuffer(u8 windowId, u8 fillValue) { int fillSize = gWindows[windowId].window.width * gWindows[windowId].window.height; CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize); } #define MOVE_TILES_DOWN(a) \ { \ destOffset = i + (a); \ srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \ if (srcOffset < size) \ *(u32 *)(tileData + destOffset) = *(u32 *)(tileData + srcOffset); \ else \ *(u32 *)(tileData + destOffset) = fillValue32; \ distanceLoop++; \ } #define MOVE_TILES_UP(a) \ { \ destOffset = i + (a); \ srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \ if (srcOffset < size) \ *(u32 *)(tileData - destOffset) = *(u32 *)(tileData - srcOffset); \ else \ *(u32 *)(tileData - destOffset) = fillValue32; \ distanceLoop++; \ } void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue) { struct WindowTemplate window = gWindows[windowId].window; u8 *tileData = gWindows[windowId].tileData; u32 fillValue32 = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | fillValue; s32 size = window.height * window.width * 32; u32 width = window.width; s32 i; s32 srcOffset, destOffset; u32 distanceLoop; switch (direction) { case 0: for (i = 0; i < size; i += 32) { distanceLoop = distance; MOVE_TILES_DOWN(0) MOVE_TILES_DOWN(4) MOVE_TILES_DOWN(8) MOVE_TILES_DOWN(12) MOVE_TILES_DOWN(16) MOVE_TILES_DOWN(20) MOVE_TILES_DOWN(24) MOVE_TILES_DOWN(28) } break; case 1: tileData += size - 4; for (i = 0; i < size; i += 32) { distanceLoop = distance; MOVE_TILES_UP(0) MOVE_TILES_UP(4) MOVE_TILES_UP(8) MOVE_TILES_UP(12) MOVE_TILES_UP(16) MOVE_TILES_UP(20) MOVE_TILES_UP(24) MOVE_TILES_UP(28) } break; case 2: break; } } void CallWindowFunction(u8 windowId, WindowFunc func) { struct WindowTemplate window = gWindows[windowId].window; func(window.bg, window.tilemapLeft, window.tilemapTop, window.width, window.height, window.paletteNum); } bool8 SetWindowAttribute(u8 windowId, u8 attributeId, u32 value) { switch (attributeId) { case WINDOW_TILEMAP_LEFT: gWindows[windowId].window.tilemapLeft = value; return FALSE; case WINDOW_TILEMAP_TOP: gWindows[windowId].window.tilemapTop = value; return FALSE; case WINDOW_PALETTE_NUM: gWindows[windowId].window.paletteNum = value; return FALSE; case WINDOW_BASE_BLOCK: gWindows[windowId].window.baseBlock = value; return FALSE; case WINDOW_TILE_DATA: case WINDOW_BG: case WINDOW_WIDTH: case WINDOW_HEIGHT: default: return TRUE; } } u32 GetWindowAttribute(u8 windowId, u8 attributeId) { switch (attributeId) { case WINDOW_BG: return gWindows[windowId].window.bg; case WINDOW_TILEMAP_LEFT: return gWindows[windowId].window.tilemapLeft; case WINDOW_TILEMAP_TOP: return gWindows[windowId].window.tilemapTop; case WINDOW_WIDTH: return gWindows[windowId].window.width; case WINDOW_HEIGHT: return gWindows[windowId].window.height; case WINDOW_PALETTE_NUM: return gWindows[windowId].window.paletteNum; case WINDOW_BASE_BLOCK: return gWindows[windowId].window.baseBlock; case WINDOW_TILE_DATA: return (u32)(gWindows[windowId].tileData); default: return 0; } } static u8 GetNumActiveWindowsOnBg(u8 bgId) { u8 windowsNum = 0; s32 i; for (i = 0; i < WINDOWS_MAX; i++) { if (gWindows[i].window.bg == bgId) windowsNum++; } return windowsNum; } ================================================ FILE: src/window_8bpp.c ================================================ #include "global.h" #include "gflib.h" EWRAM_DATA static struct Window* sWindowPtr = NULL; EWRAM_DATA static u16 sWindowSize = 0; static u8 GetNumActiveWindowsOnBg8Bit(u8 bgId); static void nullsub_9(void) { } u16 AddWindow8Bit(const struct WindowTemplate *template) { u16 windowId; u8 *memAddress; u8 bgLayer; for (windowId = 0; windowId < WINDOWS_MAX; windowId++) { if (gWindows[windowId].window.bg == 0xFF) break; } if (windowId == WINDOWS_MAX) return 0xFF; bgLayer = template->bg; if (gWindowBgTilemapBuffers[bgLayer] == NULL) { u16 attribute = GetBgAttribute(bgLayer, BG_ATTR_MAPSIZE); if (attribute != 0xFFFF) { s32 i; memAddress = Alloc(attribute); if (memAddress == NULL) return 0xFF; for (i = 0; i < attribute; i++) // if we're going to zero out the memory anyway, why not call AllocZeroed? memAddress[i] = 0; gWindowBgTilemapBuffers[bgLayer] = memAddress; SetBgTilemapBuffer(bgLayer, memAddress); } } memAddress = Alloc((u16)(0x40 * (template->width * template->height))); if (memAddress == NULL) { if (GetNumActiveWindowsOnBg8Bit(bgLayer) == 0 && gWindowBgTilemapBuffers[bgLayer] != nullsub_9) { Free(gWindowBgTilemapBuffers[bgLayer]); gWindowBgTilemapBuffers[bgLayer] = NULL; } return 0xFF; } else { gWindows[windowId].tileData = memAddress; gWindows[windowId].window = *template; return windowId; } } void FillWindowPixelBuffer8Bit(u8 windowId, u8 fillValue) { s32 i; s32 size; size = (u16)(0x40 * (gWindows[windowId].window.width * gWindows[windowId].window.height)); for (i = 0; i < size; i++) gWindows[windowId].tileData[i] = fillValue; } void FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height) { struct Bitmap pixelRect; pixelRect.pixels = gWindows[windowId].tileData; pixelRect.width = 8 * gWindows[windowId].window.width; pixelRect.height = 8 * gWindows[windowId].window.height; FillBitmapRect8Bit(&pixelRect, x, y, width, height, fillValue); } void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum) { struct Bitmap sourceRect; struct Bitmap destRect; sourceRect.pixels = (u8 *)pixels; sourceRect.width = srcWidth; sourceRect.height = srcHeight; destRect.pixels = gWindows[windowId].tileData; destRect.width = 8 * gWindows[windowId].window.width; destRect.height = 8 * gWindows[windowId].window.height; BlitBitmapRect4BitTo8Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, 0, paletteNum); } void CopyWindowToVram8Bit(u8 windowId, u8 mode) { sWindowPtr = &gWindows[windowId]; sWindowSize = 0x40 * (sWindowPtr->window.width * sWindowPtr->window.height); switch (mode) { case COPYWIN_MAP: CopyBgTilemapBufferToVram(sWindowPtr->window.bg); break; case COPYWIN_GFX: LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); break; case COPYWIN_FULL: LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); CopyBgTilemapBufferToVram(sWindowPtr->window.bg); break; } } static u8 GetNumActiveWindowsOnBg8Bit(u8 bgId) { u8 windowsNum = 0; s32 i; for (i = 0; i < WINDOWS_MAX; i++) { if (gWindows[i].window.bg == bgId) windowsNum++; } return windowsNum; } ================================================ FILE: src/wireless_communication_status_screen.c ================================================ #include "global.h" #include "gflib.h" #include "task.h" #include "new_menu_helpers.h" #include "scanline_effect.h" #include "m4a.h" #include "dynamic_placeholder_text_util.h" #include "overworld.h" #include "strings.h" #include "menu.h" #include "librfu.h" #include "link_rfu.h" #include "union_room.h" #include "constants/songs.h" #include "constants/union_room.h" enum { COLOR_NONE, COLOR_NORMAL, COLOR_TOTAL, COLOR_TITLE, COLOR_UNUSED, }; enum { GROUPTYPE_NONE = -1, GROUPTYPE_TRADE, GROUPTYPE_BATTLE, GROUPTYPE_UNION, GROUPTYPE_TOTAL, NUM_GROUPTYPES }; static struct { u32 groupCounts[NUM_GROUPTYPES]; u32 prevGroupCounts[NUM_GROUPTYPES]; u32 activities[NUM_TASK_DATA]; u8 taskId; u8 rfuTaskId; u8 filler[10]; } * sStatusScreen; static void CB2_InitWirelessCommunicationScreen(void); static void Task_WirelessCommunicationScreen(u8 taskId); static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx); static bool32 UpdateCommunicationCounts(u32 * counts, u32 * lastCounts, u32 * activities, u8 taskId); static const u16 sPalettes[][16] = { INCBIN_U16("graphics/wireless_status_screen/default.gbapal"), {}, // All black. Never read INCBIN_U16("graphics/wireless_status_screen/anim_00.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_01.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_02.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_03.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_04.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_05.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_06.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_07.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_08.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_09.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_10.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_11.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_12.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_13.gbapal") }; static const u32 sBgTiles_Gfx[] = INCBIN_U32("graphics/wireless_status_screen/bg.4bpp.lz"); static const u16 sBgTiles_Tilemap[] = INCBIN_U16("graphics/wireless_status_screen/bg.bin"); static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, .mapBaseIndex = 31, .screenSize = 0, .paletteMode = 0, .priority = 0, .baseTile = 0x000 }, { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 8, .screenSize = 0, .paletteMode = 0, .priority = 1, .baseTile = 0x000 } }; static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 3, .tilemapTop = 0, .width = 24, .height = 3, .paletteNum = 15, .baseBlock = 0x001 }, { .bg = 0, .tilemapLeft = 3, .tilemapTop = 4, .width = 22, .height = 15, .paletteNum = 15, .baseBlock = 0x049 }, { .bg = 0, .tilemapLeft = 25, .tilemapTop = 4, .width = 2, .height = 15, .paletteNum = 15, .baseBlock = 0x193 }, DUMMY_WIN_TEMPLATE }; // Unused static const u8 *const sPlayersTextPtrs[] = { gText_Dynamic0Players, gText_Dynamic1Players, gText_Dynamic2Players, gText_Dynamic3Players }; static const u8 *const sHeaderTexts[NUM_GROUPTYPES + 1] = { [0] = gText_WirelessCommunicationStatus, [GROUPTYPE_TRADE + 1] = gText_PeopleTrading, [GROUPTYPE_BATTLE + 1] = gText_PeopleBattling, [GROUPTYPE_UNION + 1] = gText_PeopleInUnionRoom, [GROUPTYPE_TOTAL + 1] = gText_PeopleCommunicating }; // Activity, group type, number of players // 0 players means the number of players can change and should be counted dynamically // GROUPTYPE_TOTAL have no unique group and are simply counted in the total of "people communicating". // A handful use NUM_GROUPTYPES, which is invalid, and are changed to GROUPTYPE_TOTAL in Emerald. // UB: GROUPTYPE_NONE (-1) can potentially be used as an index into a u8[4] in CountPlayersInGroupAndGetActivity. static const u8 sActivityGroupInfo[][3] = { {ACTIVITY_BATTLE_SINGLE, GROUPTYPE_BATTLE, 2}, {ACTIVITY_BATTLE_DOUBLE, GROUPTYPE_BATTLE, 2}, {ACTIVITY_BATTLE_MULTI, GROUPTYPE_BATTLE, 4}, {ACTIVITY_TRADE, GROUPTYPE_TRADE, 2}, {ACTIVITY_WONDER_CARD, GROUPTYPE_TOTAL, 2}, {ACTIVITY_WONDER_NEWS, GROUPTYPE_TOTAL, 2}, {ACTIVITY_POKEMON_JUMP, NUM_GROUPTYPES, 0}, {ACTIVITY_BERRY_CRUSH, NUM_GROUPTYPES, 0}, {ACTIVITY_BERRY_PICK, NUM_GROUPTYPES, 0}, {ACTIVITY_SEARCH, GROUPTYPE_NONE, 0}, {ACTIVITY_SPIN_TRADE, GROUPTYPE_TRADE, 0}, {ACTIVITY_ITEM_TRADE, GROUPTYPE_NONE, 0}, {ACTIVITY_RECORD_CORNER, NUM_GROUPTYPES, 0}, {ACTIVITY_BERRY_BLENDER, GROUPTYPE_NONE, 0}, {ACTIVITY_NONE | IN_UNION_ROOM, GROUPTYPE_UNION, 1}, {ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM, GROUPTYPE_UNION, 2}, {ACTIVITY_TRADE | IN_UNION_ROOM, GROUPTYPE_UNION, 2}, {ACTIVITY_CHAT | IN_UNION_ROOM, GROUPTYPE_UNION, 0}, {ACTIVITY_CARD | IN_UNION_ROOM, GROUPTYPE_UNION, 2}, {ACTIVITY_PLYRTALK | IN_UNION_ROOM, GROUPTYPE_UNION, 1}, {ACTIVITY_NPCTALK | IN_UNION_ROOM, GROUPTYPE_UNION, 2}, {ACTIVITY_ACCEPT | IN_UNION_ROOM, GROUPTYPE_UNION, 1}, {ACTIVITY_DECLINE | IN_UNION_ROOM, GROUPTYPE_UNION, 1} }; static void CB2_RunWirelessCommunicationScreen(void) { if (!IsDma3ManagerBusyWithBgCopy()) { RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } } static void VBlankCB_WirelessCommunicationScreen(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void ShowWirelessCommunicationScreen(void) { SetMainCallback2(CB2_InitWirelessCommunicationScreen); } static void CB2_InitWirelessCommunicationScreen(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); sStatusScreen = AllocZeroed(sizeof(*sStatusScreen)); SetVBlankCallback(NULL); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); DecompressAndLoadBgGfxUsingHeap(1, sBgTiles_Gfx, 0, 0, 0); CopyToBgTilemapBuffer(1, sBgTiles_Tilemap, 0, 0); InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); ResetPaletteFade(); ResetSpriteData(); ResetTasks(); ScanlineEffect_Stop(); m4aSoundVSyncOn(); SetVBlankCallback(VBlankCB_WirelessCommunicationScreen); sStatusScreen->taskId = CreateTask(Task_WirelessCommunicationScreen, 0); sStatusScreen->rfuTaskId = CreateTask_ListenToWireless(); sStatusScreen->prevGroupCounts[3] = 1; ChangeBgX(0, 0, BG_COORD_SET); ChangeBgY(0, 0, BG_COORD_SET); ChangeBgX(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); LoadPalette(sPalettes, BG_PLTT_ID(0), PLTT_SIZE_4BPP); Menu_LoadStdPalAt(BG_PLTT_ID(15)); DynamicPlaceholderTextUtil_Reset(); FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 15); CopyBgTilemapBufferToVram(1); SetMainCallback2(CB2_RunWirelessCommunicationScreen); RunTasks(); RunTextPrinters(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } static void ExitWirelessCommunicationStatusScreen(void) { s32 i; FreeAllWindowBuffers(); for (i = 0; i < (int)ARRAY_COUNT(sBgTemplates); i++) Free(GetBgTilemapBuffer(i)); Free(sStatusScreen); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } // Cycle through palettes that relocate various shades of blue to create the wave effect at the bottom of the screen. static void CyclePalette(s16 * counter, s16 * palIdx) { s32 idx; if (++(*counter) > 5) { if (++(*palIdx) == (int)ARRAY_COUNT(sPalettes) - 2) *palIdx = 0; *counter = 0; } idx = *palIdx + 2; // +2 skips over default.pal and the empty black palette after it LoadPalette(sPalettes[idx], BG_PLTT_ID(0), PLTT_SIZEOF(8)); } static void PrintHeaderTexts(void) { s32 i; u32 width; FillWindowPixelBuffer(0, PIXEL_FILL(0)); FillWindowPixelBuffer(1, PIXEL_FILL(0)); FillWindowPixelBuffer(2, PIXEL_FILL(0)); // Print title width = 192 - GetStringWidth(FONT_NORMAL_COPY_2, sHeaderTexts[0], 0); WCSS_AddTextPrinterParameterized(0, FONT_NORMAL_COPY_2, sHeaderTexts[0], width / 2, 6, COLOR_TITLE); // Print label for each group (excluding total) for (i = 0; i < NUM_GROUPTYPES - 1; i++) WCSS_AddTextPrinterParameterized(1, FONT_NORMAL_COPY_2, sHeaderTexts[i + 1], 0, 30 * i + 10, COLOR_NORMAL); // Print label for total WCSS_AddTextPrinterParameterized(1, FONT_NORMAL_COPY_2, sHeaderTexts[i + 1], 0, 30 * i + 10, COLOR_TOTAL); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_GFX); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_GFX); } #define tState data[0] static void Task_WirelessCommunicationScreen(u8 taskId) { s32 i; switch (gTasks[taskId].tState) { case 0: PrintHeaderTexts(); gTasks[taskId].tState++; break; case 1: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); ShowBg(1); CopyBgTilemapBufferToVram(0); ShowBg(0); gTasks[taskId].tState++; break; case 2: if (!gPaletteFade.active) gTasks[taskId].tState++; break; case 3: if (UpdateCommunicationCounts(sStatusScreen->groupCounts, sStatusScreen->prevGroupCounts, sStatusScreen->activities, sStatusScreen->rfuTaskId)) { FillWindowPixelBuffer(2, PIXEL_FILL(0)); for (i = 0; i < NUM_GROUPTYPES; i++) { ConvertIntToDecimalStringN(gStringVar4, sStatusScreen->groupCounts[i], STR_CONV_MODE_RIGHT_ALIGN, 2); if (i != GROUPTYPE_TOTAL) WCSS_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_2, gStringVar4, 4, 30 * i + 10, COLOR_NORMAL); else WCSS_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_2, gStringVar4, 4, 100, COLOR_TOTAL); } PutWindowTilemap(2); CopyWindowToVram(2, COPYWIN_FULL); } if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); gTasks[sStatusScreen->rfuTaskId].data[15] = 0xFF; gTasks[taskId].tState++; } CyclePalette(&gTasks[taskId].data[7], &gTasks[taskId].data[8]); break; case 4: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].tState++; break; case 5: if (!gPaletteFade.active) { SetMainCallback2(ExitWirelessCommunicationStatusScreen); DestroyTask(taskId); } break; } } static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 mode) { u8 textColor[3]; switch (mode) { case COLOR_NONE: // Unused. Default to usual text colors textColor[0] = TEXT_COLOR_TRANSPARENT; textColor[1] = TEXT_COLOR_DARK_GRAY; textColor[2] = TEXT_COLOR_LIGHT_GRAY; break; case COLOR_NORMAL: textColor[0] = TEXT_COLOR_TRANSPARENT; textColor[1] = TEXT_COLOR_WHITE; textColor[2] = TEXT_COLOR_LIGHT_GRAY; break; case COLOR_TOTAL: textColor[0] = TEXT_COLOR_TRANSPARENT; textColor[1] = TEXT_COLOR_RED; textColor[2] = TEXT_COLOR_LIGHT_RED; break; case COLOR_TITLE: textColor[0] = TEXT_COLOR_TRANSPARENT; textColor[1] = TEXT_COLOR_LIGHT_GREEN; textColor[2] = TEXT_COLOR_GREEN; break; case COLOR_UNUSED: textColor[0] = TEXT_COLOR_TRANSPARENT; textColor[1] = TEXT_COLOR_WHITE; textColor[2] = TEXT_COLOR_DARK_GRAY; break; // default: UB } AddTextPrinterParameterized4(windowId, fontId, x, y, fontId == FONT_SMALL ? 0 : 1, 0, textColor, TEXT_SKIP_DRAW, str); } static u32 CountPlayersInGroupAndGetActivity(struct RfuPlayer * player, u32 * groupCounts) { u32 activity = player->rfu.data.activity; s32 i, j, k; #define group_activity(i) (sActivityGroupInfo[(i)][0]) #define group_type(i) (sActivityGroupInfo[(i)][1]) #define group_players(i) (sActivityGroupInfo[(i)][2]) for (i = 0; i < ARRAY_COUNT(sActivityGroupInfo); i++) { if (activity == group_activity(i) && player->groupScheduledAnim == UNION_ROOM_SPAWN_IN) { if (group_players(i) == 0) { k = 0; for (j = 0; j < RFU_CHILD_MAX; j++) if (player->rfu.data.partnerInfo[j] != 0) k++; k++; groupCounts[group_type(i)] += k; } else { groupCounts[group_type(i)] += group_players(i); } } } return activity; #undef group_activity #undef group_type #undef group_players } static bool32 HaveCountsChanged(const u32 * curCounts, const u32 * prevCounts) { s32 i; for (i = 0; i < NUM_GROUPTYPES; i++) { if (curCounts[i] != prevCounts[i]) return TRUE; } return FALSE; } static bool32 UpdateCommunicationCounts(u32 * groupCounts, u32 * prevGroupCounts, u32 * activities, u8 taskId) { bool32 activitiesUpdated = FALSE; u32 groupCountBuffer[NUM_GROUPTYPES] = {0, 0, 0, 0}; struct WirelessLink_Group * group = (void *)gTasks[taskId].data; s32 i; for (i = 0; i < NUM_TASK_DATA; i++) { u32 activity = CountPlayersInGroupAndGetActivity(&group->playerList->players[i], groupCountBuffer); if (activity != activities[i]) { activities[i] = activity; activitiesUpdated = TRUE; } } if (!HaveCountsChanged(groupCountBuffer, prevGroupCounts)) { if (activitiesUpdated == TRUE) return TRUE; else return FALSE; } memcpy(groupCounts, groupCountBuffer, sizeof(groupCountBuffer)); memcpy(prevGroupCounts, groupCountBuffer, sizeof(groupCountBuffer)); groupCounts[GROUPTYPE_TOTAL] = groupCounts[GROUPTYPE_TRADE] + groupCounts[GROUPTYPE_BATTLE] + groupCounts[GROUPTYPE_UNION] #ifdef BUGFIX + groupCounts[GROUPTYPE_TOTAL] // Missing count for activities not in above groups #endif ; return TRUE; } ================================================ FILE: src/wonder_news.c ================================================ #include "global.h" #include "mystery_gift.h" #include "random.h" #include "event_data.h" #include "wonder_news.h" #include "constants/items.h" // Every 4th reward for sending Wonder News to a link partner is a "big" reward. #define MAX_SENT_REWARD 4 // Only up to 5 rewards can be received in a short period. After this the player // must take 500 steps before any more rewards can be received. #define MAX_REWARD 5 static u32 GetRewardItem(struct WonderNewsMetadata *); static u32 GetRewardType(struct WonderNewsMetadata *); static void IncrementRewardCounter(struct WonderNewsMetadata *); static void IncrementSentRewardCounter(struct WonderNewsMetadata *); static void ResetSentRewardCounter(struct WonderNewsMetadata *); void WonderNews_SetReward(u32 newsType) { struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); data->newsType = newsType; switch (newsType) { case WONDER_NEWS_NONE: break; case WONDER_NEWS_RECV_FRIEND: case WONDER_NEWS_RECV_WIRELESS: // Random berry between ITEM_RAZZ_BERRY and ITEM_NOMEL_BERRY data->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_RAZZ_BERRY); break; case WONDER_NEWS_SENT: // Random berry between ITEM_CHERI_BERRY and ITEM_IAPAPA_BERRY data->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_CHERI_BERRY); break; } } void WonderNews_Reset(void) { struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); data->newsType = WONDER_NEWS_NONE; data->sentRewardCounter = 0; data->rewardCounter = 0; data->berry = 0; VarSet(VAR_WONDER_NEWS_STEP_COUNTER, 0); } void WonderNews_IncrementStepCounter(void) { u16 *stepCounter = GetVarPointer(VAR_WONDER_NEWS_STEP_COUNTER); struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); // If the player has reached the reward limit, start counting steps. // When they reach 500 steps reset the reward counter to allow them to // receive rewards again. if (data->rewardCounter >= MAX_REWARD && ++(*stepCounter) >= 500) { data->rewardCounter = 0; *stepCounter = 0; } } u16 WonderNews_GetRewardInfo(void) { u16 *result = &gSpecialVar_Result; struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); u16 rewardType; if (!IsMysteryGiftEnabled() || !ValidateSavedWonderNews()) return NEWS_REWARD_NONE; rewardType = GetRewardType(data); switch (rewardType) { case NEWS_REWARD_RECV_SMALL: case NEWS_REWARD_RECV_BIG: *result = GetRewardItem(data); break; case NEWS_REWARD_SENT_SMALL: *result = GetRewardItem(data); IncrementSentRewardCounter(data); break; case NEWS_REWARD_SENT_BIG: *result = GetRewardItem(data); ResetSentRewardCounter(data); break; case NEWS_REWARD_NONE: case NEWS_REWARD_WAITING: case NEWS_REWARD_AT_MAX: break; } return rewardType; } static u32 GetRewardItem(struct WonderNewsMetadata *data) { u32 itemId; data->newsType = WONDER_NEWS_NONE; itemId = data->berry + FIRST_BERRY_INDEX - 1; data->berry = 0; IncrementRewardCounter(data); return itemId; } static void ResetSentRewardCounter(struct WonderNewsMetadata *data) { data->sentRewardCounter = 0; } // Track number of times a reward was received (or attmepted to receive) for sending Wonder News to a link partner. static void IncrementSentRewardCounter(struct WonderNewsMetadata *data) { data->sentRewardCounter++; if (data->sentRewardCounter > MAX_SENT_REWARD) data->sentRewardCounter = MAX_SENT_REWARD; } static void IncrementRewardCounter(struct WonderNewsMetadata *data) { data->rewardCounter++; if (data->rewardCounter > MAX_REWARD) data->rewardCounter = MAX_REWARD; } static u32 GetRewardType(struct WonderNewsMetadata *data) { if (data->rewardCounter == MAX_REWARD) return NEWS_REWARD_AT_MAX; switch (data->newsType) { case WONDER_NEWS_NONE: return NEWS_REWARD_WAITING; case WONDER_NEWS_RECV_FRIEND: return NEWS_REWARD_RECV_SMALL; case WONDER_NEWS_RECV_WIRELESS: return NEWS_REWARD_RECV_BIG; case WONDER_NEWS_SENT: if (data->sentRewardCounter < MAX_SENT_REWARD - 1) return NEWS_REWARD_SENT_SMALL; return NEWS_REWARD_SENT_BIG; default: AGB_ASSERT_EX(0, ABSPATH("menews_jisan.c"), 383); return NEWS_REWARD_NONE; } } ================================================ FILE: sym_bss.txt ================================================ .include "src/gpu_regs.o" .include "src/dma3_manager.o" .include "src/bg.o" .include "src/malloc.o" .include "src/text_printer.o" .include "src/sprite.o" .include "src/link.o" .include "src/multiboot.o" .include "src/daycare.o" .include "src/trade.o" .include "src/play_time.o" .include "src/overworld.o" .include "src/field_camera.o" .include "src/script.o" .include "src/start_menu.o" .include "src/tileset_anims.o" .include "src/sound.o" .include "src/field_effect.o" .include "src/pokemon_storage_system_misc.o" .include "src/easy_chat.o" .include "src/link_rfu_2.o" .include "src/link_rfu_3.o" .include "src/quest_log.o" .include "src/union_room.o" .include "src/pokemon_special_anim_scene.o" .include "src/wireless_communication_status_screen.o" .include "src/dodrio_berry_picking.o" .include "src/ereader_helpers.o" .include "src/digit_obj_util.o" .include "src/m4a_1.o" .include "data/sound_data.o" .include "src/agb_flash.o" .include "*libgcc.a:dp-bit.o" .include "*libgcc.a:fp-bit.o" .include "*libc.a:syscalls.o" ================================================ FILE: sym_common.txt ================================================ .include "main.o" .include "bg.o" .include "text_printer.o" .align 4 .include "window.o" .include "text.o" .include "sprite.o" .include "link.o" .align 4 .include "battle_main.o" .include "random.o" .include "load_save.o" .include "overworld.o" .align 4 .include "fieldmap.o" .align 4 .include "field_camera.o" .include "scrcmd.o" .include "field_control_avatar.o" .include "event_data.o" .include "sound.o" .include "task.o" .include "cable_club.o" .include "image_processing_effects.o" .include "field_specials.o" .include "evolution_scene.o" .include "save.o" .include "battle_anim_special.o" .include "save_failed_screen.o" .align 4 .include "link_rfu_2.o" .align 4 .include "AgbRfu_LinkManager.o" .align 4 .include "list_menu.o" .include "quest_log.o" .include "party_menu.o" .include "help_system.o" .align 4 .include "fame_checker.o" .include "help_system_util.o" .align 4 .include "ereader_screen.o" .align 4 .include "battle_controller_pokedude.o" .align 4 .include "berry_fix_program.o" .include "m4a.o" .include "agb_flash.o" .include "librfu_stwi.o" .align 4 .include "librfu_rfu.o" .align 4 .include "librfu_sio32id.o" ================================================ FILE: sym_ewram.txt ================================================ .include "src/main.o" .include "src/malloc.o" .include "src/text_printer.o" .include "src/window.o" .include "src/window_8bpp.o" .include "src/sprite.o" .include "src/string_util.o" .include "src/link.o" .space 8 .include "src/battle_controllers.o" .include "src/battle_main.o" .include "src/pokemon.o" .include "src/daycare.o" .include "src/load_save.o" .include "src/trade.o" .include "src/trade_scene.o" .include "src/new_game.o" .include "src/overworld.o" .include "src/fieldmap.o" .include "src/field_camera.o" .include "src/field_player_avatar.o" .include "src/event_object_movement.o" .include "src/field_message_box.o" .include "src/script.o" .include "src/scrcmd.o" .include "src/event_data.o" .include "src/start_menu.o" .include "src/tileset_anims.o" .include "src/palette.o" .include "src/sound.o" .include "src/battle_anim.o" .include "src/battle_anim_mons.o" .include "src/title_screen.o" .include "src/field_weather.o" .include "src/battle_setup.o" .include "src/wild_encounter.o" .include "src/field_effect.o" .include "src/scanline_effect.o" .include "src/option_menu.o" .include "src/trainer_card.o" .include "src/pokemon_storage_system_menu.o" .include "src/pokemon_storage_system_tasks.o" .include "src/pokemon_storage_system_data.o" .include "src/pokemon_storage_system_misc.o" .include "src/script_movement.o" .include "src/fldeff_cut.o" .include "src/item_menu_icons.o" .include "src/item.o" .include "src/shop.o" .include "src/special_field_anim.o" .include "src/script_menu.o" .include "src/naming_screen.o" .include "src/money.o" .include "src/safari_zone.o" .include "src/item_use.o" .include "src/battle_anim_effects_1.o" .include "src/battle_anim_dragon.o" .include "src/battle_anim_utility_funcs.o" .include "src/battle_intro.o" .include "src/easy_chat.o" .include "src/mon_markings.o" .include "src/mail.o" .include "src/menu_helpers.o" .include "src/region_map.o" .include "src/battle_ai_script_commands.o" .include "src/fldeff_rocksmash.o" .include "src/field_specials.o" .include "src/battle_records.o" .include "src/evolution_scene.o" .include "src/coins.o" .include "src/battle_transition.o" .include "src/battle_message.o" .include "src/save.o" .include "src/mystery_event_script.o" .include "src/fldeff_sweetscent.o" .include "src/learn_move.o" .include "src/battle_tower.o" .include "src/player_pc.o" .include "src/intro.o" .include "src/hall_of_fame.o" .include "src/credits.o" .include "src/diploma.o" .include "src/save_failed_screen.o" .include "src/clear_save_data_screen.o" .include "src/new_menu_helpers.o" .include "src/tilemap_util.o" .include "src/map_preview_screen.o" .include "src/link_rfu_2.o" .include "src/link_rfu_3.o" .include "src/easy_chat_2.o" .include "src/easy_chat_3.o" .include "src/pokedex_screen.o" .include "src/list_menu.o" .include "src/item_menu.o" .include "src/bag.o" .include "src/trainer_pokemon_sprites.o" .include "src/vs_seeker.o" .include "src/item_pc.o" .include "src/mailbox_pc.o" .include "src/menu.o" .include "src/quest_log.o" .include "src/help_message.o" .include "src/quest_log_events.o" .include "src/union_room.o" .include "src/union_room_player_avatar.o" .include "src/union_room_battle.o" .include "src/pokemon_special_anim.o" .include "src/party_menu.o" .include "src/union_room_chat.o" .include "src/union_room_chat_display.o" .include "src/union_room_chat_objects.o" .include "src/help_system.o" .include "src/fame_checker.o" .include "src/oak_speech.o" .include "src/tm_case.o" .include "src/menu_indicators.o" .include "src/pokemon_summary_screen.o" .include "src/help_system_util.o" .include "src/dynamic_placeholder_text_util.o" .include "src/berry_pouch.o" .include "src/slot_machine.o" .include "src/roamer.o" .include "src/mystery_gift_menu.o" .include "src/mystery_gift.o" .include "src/mystery_gift_link.o" .include "src/mystery_gift_client.o" .include "src/mystery_gift_server.o" .include "src/mystery_gift_show_card.o" .include "src/mystery_gift_show_news.o" .include "src/seagallop.o" .include "src/pokemon_jump.o" .include "src/berry_crush.o" .include "src/dodrio_berry_picking.o" .include "src/teachy_tv.o" .include "src/digit_obj_util.o" .include "src/trainer_tower.o" .include "src/berry_powder.o" .align 2 .include "src/key_system_menu.o" .align 2 .include "src/cable_car.o" ================================================ FILE: tileset_rules.mk ================================================ TILESETGFXDIR := data/tilesets $(TILESETGFXDIR)/primary/building/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 640 -Wnum_tiles $(TILESETGFXDIR)/primary/general/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 640 -Wnum_tiles $(TILESETGFXDIR)/secondary/pallet_town/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 76 -Wnum_tiles $(TILESETGFXDIR)/secondary/lavender_town/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 256 -Wnum_tiles $(TILESETGFXDIR)/secondary/cinnabar_island/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 128 -Wnum_tiles $(TILESETGFXDIR)/secondary/pokemon_center/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 376 -Wnum_tiles $(TILESETGFXDIR)/secondary/cable_club/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 632 -Wnum_tiles $(TILESETGFXDIR)/secondary/fuchsia_gym/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 92 -Wnum_tiles $(TILESETGFXDIR)/secondary/pewter_gym/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 207 -Wnum_tiles $(TILESETGFXDIR)/secondary/saffron_gym/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 82 -Wnum_tiles $(TILESETGFXDIR)/secondary/viridian_forest/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 101 -Wnum_tiles $(TILESETGFXDIR)/secondary/seafoam_islands/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 318 -Wnum_tiles $(TILESETGFXDIR)/secondary/generic_building_2/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 152 -Wnum_tiles $(TILESETGFXDIR)/secondary/underground_path/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 50 -Wnum_tiles $(TILESETGFXDIR)/secondary/restaurant_hotel/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 76 -Wnum_tiles $(TILESETGFXDIR)/secondary/burgled_house/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 172 -Wnum_tiles $(TILESETGFXDIR)/secondary/sevii_islands_45/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 374 -Wnum_tiles $(TILESETGFXDIR)/secondary/pokemon_league/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 340 -Wnum_tiles $(TILESETGFXDIR)/secondary/viridian_city/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 112 -Wnum_tiles $(TILESETGFXDIR)/secondary/vermilion_city/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 140 -Wnum_tiles $(TILESETGFXDIR)/secondary/indigo_plateau/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 247 -Wnum_tiles $(TILESETGFXDIR)/secondary/cave/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 256 -Wnum_tiles $(TILESETGFXDIR)/secondary/bike_shop/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 60 -Wnum_tiles $(TILESETGFXDIR)/secondary/viridian_gym/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 90 -Wnum_tiles $(TILESETGFXDIR)/secondary/cerulean_gym/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 119 -Wnum_tiles $(TILESETGFXDIR)/secondary/cinnabar_gym/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 146 -Wnum_tiles $(TILESETGFXDIR)/secondary/unused_gatehouse_1/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 144 -Wnum_tiles $(TILESETGFXDIR)/secondary/unused_gatehouse_2/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 144 -Wnum_tiles $(TILESETGFXDIR)/secondary/power_plant/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 80 -Wnum_tiles $(TILESETGFXDIR)/secondary/pokemon_tower/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 128 -Wnum_tiles $(TILESETGFXDIR)/secondary/school/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 50 -Wnum_tiles $(TILESETGFXDIR)/secondary/dummy_3/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 2 -Wnum_tiles $(TILESETGFXDIR)/secondary/navel_rock/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 282 -Wnum_tiles $(TILESETGFXDIR)/secondary/sevii_islands_67/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 374 -Wnum_tiles $(TILESETGFXDIR)/secondary/hall_of_fame/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 208 -Wnum_tiles $(TILESETGFXDIR)/secondary/pewter_city/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 280 -Wnum_tiles $(TILESETGFXDIR)/secondary/celadon_city/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 244 -Wnum_tiles $(TILESETGFXDIR)/secondary/saffron_city/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 262 -Wnum_tiles $(TILESETGFXDIR)/secondary/dummy_1/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 2 -Wnum_tiles $(TILESETGFXDIR)/secondary/generic_building_1/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 63 -Wnum_tiles $(TILESETGFXDIR)/secondary/hoenn_building/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 383 -Wnum_tiles $(TILESETGFXDIR)/secondary/vermilion_gym/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 247 -Wnum_tiles $(TILESETGFXDIR)/secondary/ss_anne/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 245 -Wnum_tiles $(TILESETGFXDIR)/secondary/rock_tunnel/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 256 -Wnum_tiles $(TILESETGFXDIR)/secondary/cerulean_cave/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 246 -Wnum_tiles $(TILESETGFXDIR)/secondary/sea_cottage/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 68 -Wnum_tiles $(TILESETGFXDIR)/secondary/safari_zone_building/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 90 -Wnum_tiles $(TILESETGFXDIR)/secondary/fan_club_daycare/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 85 -Wnum_tiles $(TILESETGFXDIR)/secondary/dummy_4/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 2 -Wnum_tiles $(TILESETGFXDIR)/secondary/tanoby_ruins/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 74 -Wnum_tiles $(TILESETGFXDIR)/secondary/trainer_tower/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 343 -Wnum_tiles $(TILESETGFXDIR)/secondary/cerulean_city/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 158 -Wnum_tiles $(TILESETGFXDIR)/secondary/fuchsia_city/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 320 $(TILESETGFXDIR)/secondary/mart/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 36 -Wnum_tiles $(TILESETGFXDIR)/secondary/museum/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 137 -Wnum_tiles $(TILESETGFXDIR)/secondary/lab/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 102 -Wnum_tiles $(TILESETGFXDIR)/secondary/game_corner/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 171 -Wnum_tiles $(TILESETGFXDIR)/secondary/celadon_gym/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 103 -Wnum_tiles $(TILESETGFXDIR)/secondary/dummy_2/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 2 -Wnum_tiles $(TILESETGFXDIR)/secondary/digletts_cave/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 248 -Wnum_tiles $(TILESETGFXDIR)/secondary/department_store/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 201 -Wnum_tiles $(TILESETGFXDIR)/secondary/pokemon_mansion/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 350 -Wnum_tiles $(TILESETGFXDIR)/secondary/condominiums/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 384 -Wnum_tiles $(TILESETGFXDIR)/secondary/mt_ember/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 288 -Wnum_tiles $(TILESETGFXDIR)/secondary/sevii_islands_123/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 374 -Wnum_tiles $(TILESETGFXDIR)/secondary/island_harbor/tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 165 -Wnum_tiles